pax_global_header00006660000000000000000000000064132247070310014511gustar00rootroot0000000000000052 comment=1e93b85fb5a4d628b80a9812b38b842b5c8b4363 botan-2.4.0/000077500000000000000000000000001322470703100126175ustar00rootroot00000000000000botan-2.4.0/.gitignore000066400000000000000000000016551322470703100146160ustar00rootroot00000000000000/Makefile CMakeLists.txt* libbotan*.so.* *.a *.so *.dylib *.exp *.lib *.pdb *.ilk *.dll *.exe *.manifest build build.log botan botan-test core.* vgcore.* # Text file backups (e.g. gedit, joe) *~ \#*\# .\#* # Archive files *.tgz *.tar # Logs *.log # Patch files *.patch *.diff *.orig *.rej # Cache and temporary files *.pyc .DS_Store *.swp # ctags/etags files /TAGS /tags # Amalgamation code botan_all.h botan_all_internal.h botan_all.cpp botan_all_*.cpp # Coverage output coverage.info coverage.info.raw coverage/ lcov-out/ /fuzzer_corpus # Profiler outputs cachegrind.* callgrind.* src/contrib/perl-xs/Makefile src/contrib/perl-xs/Makefile.old src/contrib/perl-xs/Botan.bs src/contrib/perl-xs/Botan.c src/contrib/perl-xs/Botan.o src/contrib/perl-xs/MYMETA* src/contrib/perl-xs/*blib # Ignore stuff in the top level dir that shouldn't be checked in /*.c /*.cpp /*.h /*.py /*.key /*.pem /*.der /*.ber /*.gpg /*.pub /*.crt /*.txt botan-2.4.0/.travis.yml000077700000000000000000000000001322470703100216272src/scripts/ci/travis.ymlustar00rootroot00000000000000botan-2.4.0/configure.py000077500000000000000000003471331322470703100151700ustar00rootroot00000000000000#!/usr/bin/env python """ Configuration program for botan (C) 2009,2010,2011,2012,2013,2014,2015,2016,2017 Jack Lloyd (C) 2015,2016,2017 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) This script is regularly tested with CPython 2.7 and 3.5, and occasionally tested with CPython 2.6 and PyPy 4. Support for CPython 2.6 will be dropped eventually, but is kept up for as long as reasonably convenient. CPython 2.5 and earlier are not supported. On Jython target detection does not work (use --os and --cpu). """ import collections import copy import json import sys import os import os.path import platform import re import shlex import shutil import subprocess import traceback import logging import time import errno import optparse # pylint: disable=deprecated-module # An error caused by and to be fixed by the user, e.g. invalid command line argument class UserError(Exception): pass # An error caused by bugs in this script or when reading/parsing build data files # Those are not expected to be fixed by the user of this script class InternalError(Exception): pass def flatten(l): return sum(l, []) def normalize_source_path(source): """ cmake needs this, and nothing else minds """ return os.path.normpath(source).replace('\\', '/') def parse_version_file(version_path): version_file = open(version_path) key_and_val = re.compile(r"([a-z_]+) = ([a-zA-Z0-9:\-\']+)") results = {} for line in version_file.readlines(): if not line or line[0] == '#': continue match = key_and_val.match(line) if match: key = match.group(1) val = match.group(2) if val == 'None': val = None elif val.startswith("'") and val.endswith("'"): val = val[1:len(val)-1] else: val = int(val) results[key] = val return results class Version(object): """ Version information are all static members """ data = {} @staticmethod def get_data(): if not Version.data: root_dir = os.path.dirname(os.path.realpath(__file__)) Version.data = parse_version_file(os.path.join(root_dir, 'version.txt')) return Version.data @staticmethod def major(): return Version.get_data()["release_major"] @staticmethod def minor(): return Version.get_data()["release_minor"] @staticmethod def patch(): return Version.get_data()["release_patch"] @staticmethod def packed(): # Used on Darwin for dylib versioning return Version.major() * 1000 + Version.minor() @staticmethod def so_rev(): return Version.get_data()["release_so_abi_rev"] @staticmethod def release_type(): return Version.get_data()["release_type"] @staticmethod def datestamp(): return Version.get_data()["release_datestamp"] @staticmethod def as_string(): return '%d.%d.%d' % (Version.major(), Version.minor(), Version.patch()) @staticmethod def vc_rev(): # Lazy load to ensure _local_repo_vc_revision() does not run before logger is set up if Version.get_data()["release_vc_rev"] is None: Version.data["release_vc_rev"] = Version._local_repo_vc_revision() return Version.get_data()["release_vc_rev"] @staticmethod def _local_repo_vc_revision(): vc_command = ['git', 'rev-parse', 'HEAD'] cmdname = vc_command[0] try: vc = subprocess.Popen( vc_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) (stdout, stderr) = vc.communicate() if vc.returncode != 0: logging.debug('Error getting rev from %s - %d (%s)' % (cmdname, vc.returncode, stderr)) return 'unknown' rev = str(stdout).strip() logging.debug('%s reported revision %s' % (cmdname, rev)) return '%s:%s' % (cmdname, rev) except OSError as e: logging.debug('Error getting rev from %s - %s' % (cmdname, e.strerror)) return 'unknown' class SourcePaths(object): """ A collection of paths defined by the project structure and independent of user configurations. All paths are relative to the base_dir, which may be relative as well (e.g. ".") """ def __init__(self, base_dir): self.base_dir = base_dir self.doc_dir = os.path.join(self.base_dir, 'doc') self.src_dir = os.path.join(self.base_dir, 'src') # dirs in src/ self.build_data_dir = os.path.join(self.src_dir, 'build-data') self.configs_dir = os.path.join(self.src_dir, 'configs') self.lib_dir = os.path.join(self.src_dir, 'lib') self.python_dir = os.path.join(self.src_dir, 'python') self.scripts_dir = os.path.join(self.src_dir, 'scripts') # subdirs of src/ self.sphinx_config_dir = os.path.join(self.configs_dir, 'sphinx') class BuildPaths(object): # pylint: disable=too-many-instance-attributes """ Constructor """ def __init__(self, source_paths, options, modules): self.build_dir = os.path.join(options.with_build_dir, 'build') self.libobj_dir = os.path.join(self.build_dir, 'obj', 'lib') self.cliobj_dir = os.path.join(self.build_dir, 'obj', 'cli') self.testobj_dir = os.path.join(self.build_dir, 'obj', 'test') self.doc_output_dir = os.path.join(self.build_dir, 'docs') self.doc_output_dir_manual = os.path.join(self.doc_output_dir, 'manual') self.doc_output_dir_doxygen = os.path.join(self.doc_output_dir, 'doxygen') if options.with_doxygen else None self.include_dir = os.path.join(self.build_dir, 'include') self.botan_include_dir = os.path.join(self.include_dir, 'botan') self.internal_include_dir = os.path.join(self.botan_include_dir, 'internal') self.external_include_dir = os.path.join(self.include_dir, 'external') self.internal_headers = sorted(flatten([m.internal_headers() for m in modules])) self.external_headers = sorted(flatten([m.external_headers() for m in modules])) if options.amalgamation: self.lib_sources = ['botan_all.cpp'] else: self.lib_sources = [normalize_source_path(s) for s in sorted(flatten([mod.sources() for mod in modules]))] self.public_headers = sorted(flatten([m.public_headers() for m in modules])) def find_sources_in(basedir, srcdir): for (dirpath, _, filenames) in os.walk(os.path.join(basedir, srcdir)): for filename in filenames: if filename.endswith('.cpp') and not filename.startswith('.'): yield os.path.join(dirpath, filename) def find_headers_in(basedir, srcdir): for (dirpath, _, filenames) in os.walk(os.path.join(basedir, srcdir)): for filename in filenames: if filename.endswith('.h') and not filename.startswith('.'): yield os.path.join(dirpath, filename) self.cli_sources = [normalize_source_path(s) for s in find_sources_in(source_paths.src_dir, 'cli')] self.cli_headers = [normalize_source_path(s) for s in find_headers_in(source_paths.src_dir, 'cli')] self.test_sources = [normalize_source_path(s) for s in find_sources_in(source_paths.src_dir, 'tests')] if options.build_fuzzers: self.fuzzer_sources = list(find_sources_in(source_paths.src_dir, 'fuzzer')) self.fuzzer_output_dir = os.path.join(self.build_dir, 'fuzzer') self.fuzzobj_dir = os.path.join(self.build_dir, 'obj', 'fuzzer') else: self.fuzzer_sources = None self.fuzzer_output_dir = None self.fuzzobj_dir = None def build_dirs(self): out = [ self.libobj_dir, self.cliobj_dir, self.testobj_dir, self.botan_include_dir, self.internal_include_dir, self.external_include_dir, self.doc_output_dir_manual, ] if self.doc_output_dir_doxygen: out += [self.doc_output_dir_doxygen] if self.fuzzer_output_dir: out += [self.fuzzobj_dir] out += [self.fuzzer_output_dir] return out def format_include_paths(self, cc, external_include): dash_i = cc.add_include_dir_option output = dash_i + self.include_dir if self.external_headers: output += ' ' + dash_i + self.external_include_dir if external_include: output += ' ' + dash_i + external_include return output def src_info(self, typ): if typ == 'lib': return (self.lib_sources, self.libobj_dir) elif typ == 'cli': return (self.cli_sources, self.cliobj_dir) elif typ == 'test': return (self.test_sources, self.testobj_dir) elif typ == 'fuzzer': return (self.fuzzer_sources, self.fuzzobj_dir) else: raise InternalError("Unknown src info type '%s'" % (typ)) def process_command_line(args): # pylint: disable=too-many-locals """ Handle command line options Do not use logging in this method as command line options need to be available before logging is setup. """ parser = optparse.OptionParser( formatter=optparse.IndentedHelpFormatter(max_help_position=50), version=Version.as_string()) parser.add_option('--verbose', action='store_true', default=False, help='Show debug messages') parser.add_option('--quiet', action='store_true', default=False, help='Show only warnings and errors') target_group = optparse.OptionGroup(parser, 'Target options') target_group.add_option('--cpu', help='set the target CPU type/model') target_group.add_option('--os', help='set the target operating system') target_group.add_option('--cc', dest='compiler', help='set the desired build compiler') target_group.add_option('--cc-min-version', dest='cc_min_version', default=None, metavar='MAJOR.MINOR', help='Set the minimal version of the target compiler. ' \ 'Use --cc-min-version=0.0 to support all compiler versions. ' \ 'Default is auto detection.') target_group.add_option('--cc-bin', dest='compiler_binary', metavar='BINARY', help='set path to compiler binary') target_group.add_option('--cc-abi-flags', metavar='FLAG', default='', help='set compiler ABI flags') target_group.add_option('--cxxflags', metavar='FLAG', default=None, help='set compiler flags') target_group.add_option('--ldflags', metavar='FLAG', help='set linker flags', default=None) target_group.add_option('--ar-command', dest='ar_command', metavar='AR', default=None, help='set path to static archive creator') target_group.add_option('--with-endian', metavar='ORDER', default=None, help='override byte order guess') target_group.add_option('--with-os-features', action='append', metavar='FEAT', help='specify OS features to use') target_group.add_option('--without-os-features', action='append', metavar='FEAT', help='specify OS features to disable') for isa_extn_name in ['SSE2', 'SSSE3', 'SSE4.1', 'SSE4.2', 'AVX2', 'AES-NI', 'SHA', 'AltiVec', 'NEON']: isa_extn = isa_extn_name.lower() target_group.add_option('--disable-%s' % (isa_extn), help='disable %s intrinsics' % (isa_extn_name), action='append_const', const=isa_extn.replace('-', '').replace('.', ''), dest='disable_intrinsics') build_group = optparse.OptionGroup(parser, 'Build options') build_group.add_option('--with-debug-info', action='store_true', default=False, dest='with_debug_info', help='include debug symbols') build_group.add_option('--with-sanitizers', action='store_true', default=False, dest='with_sanitizers', help='enable ASan/UBSan checks') build_group.add_option('--with-stack-protector', dest='with_stack_protector', action='store_false', default=None, help=optparse.SUPPRESS_HELP) build_group.add_option('--without-stack-protector', dest='with_stack_protector', action='store_false', help='disable stack smashing protections') build_group.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage', help='add coverage info and disable opts') build_group.add_option('--with-coverage-info', action='store_true', default=False, dest='with_coverage_info', help='add coverage info') build_group.add_option('--enable-shared-library', dest='build_shared_lib', action='store_true', default=None, help=optparse.SUPPRESS_HELP) build_group.add_option('--disable-shared-library', dest='build_shared_lib', action='store_false', help='disable building shared library') build_group.add_option('--enable-static-library', dest='build_static_lib', action='store_true', default=None, help=optparse.SUPPRESS_HELP) build_group.add_option('--disable-static-library', dest='build_static_lib', action='store_false', help='disable building static library') build_group.add_option('--optimize-for-size', dest='optimize_for_size', action='store_true', default=False, help='optimize for code size') build_group.add_option('--no-optimizations', dest='no_optimizations', action='store_true', default=False, help='disable all optimizations (for debugging)') build_group.add_option('--debug-mode', action='store_true', default=False, dest='debug_mode', help='enable debug info, disable optimizations') build_group.add_option('--amalgamation', dest='amalgamation', default=False, action='store_true', help='use amalgamation to build') build_group.add_option('--single-amalgamation-file', default=False, action='store_true', help='build single file instead of splitting on ABI') build_group.add_option('--with-build-dir', metavar='DIR', default='', help='setup the build in DIR') build_group.add_option('--with-external-includedir', metavar='DIR', default='', help='use DIR for external includes') build_group.add_option('--with-external-libdir', metavar='DIR', default='', help='use DIR for external libs') build_group.add_option('--with-openmp', default=False, action='store_true', help='enable use of OpenMP') link_methods = ['symlink', 'hardlink', 'copy'] build_group.add_option('--link-method', default=None, metavar='METHOD', choices=link_methods, help='choose how links to include headers are created (%s)' % ', '.join(link_methods)) build_group.add_option('--with-local-config', dest='local_config', metavar='FILE', help='include the contents of FILE into build.h') build_group.add_option('--distribution-info', metavar='STRING', help='distribution specific version', default='unspecified') build_group.add_option('--maintainer-mode', dest='maintainer_mode', action='store_true', default=False, help="Enable extra warnings") build_group.add_option('--with-python-versions', dest='python_version', metavar='N.M', default='%d.%d' % (sys.version_info[0], sys.version_info[1]), help='where to install botan2.py (def %default)') build_group.add_option('--with-valgrind', help='use valgrind API', dest='with_valgrind', action='store_true', default=False) build_group.add_option('--with-cmake', action='store_true', default=False, help='Generate CMakeLists.txt which can be used to create many IDEs project files') build_group.add_option('--with-bakefile', action='store_true', default=False, help=optparse.SUPPRESS_HELP) build_group.add_option('--unsafe-fuzzer-mode', action='store_true', default=False, help='Disable essential checks for testing') build_group.add_option('--build-fuzzers', dest='build_fuzzers', metavar='TYPE', default=None, help='Build fuzzers (afl, libfuzzer, klee, test)') build_group.add_option('--with-fuzzer-lib', metavar='LIB', default=None, dest='fuzzer_lib', help='additionally link in LIB') docs_group = optparse.OptionGroup(parser, 'Documentation Options') docs_group.add_option('--with-documentation', action='store_true', help=optparse.SUPPRESS_HELP) docs_group.add_option('--without-documentation', action='store_false', default=True, dest='with_documentation', help='Skip building/installing documentation') docs_group.add_option('--with-sphinx', action='store_true', default=None, help='Use Sphinx') docs_group.add_option('--without-sphinx', action='store_false', dest='with_sphinx', help=optparse.SUPPRESS_HELP) docs_group.add_option('--with-pdf', action='store_true', default=False, help='Use Sphinx to generate PDF doc') docs_group.add_option('--without-pdf', action='store_false', dest='with_pdf', help=optparse.SUPPRESS_HELP) docs_group.add_option('--with-rst2man', action='store_true', default=None, help='Use rst2man to generate man page') docs_group.add_option('--without-rst2man', action='store_false', dest='with_rst2man', help=optparse.SUPPRESS_HELP) docs_group.add_option('--with-doxygen', action='store_true', default=False, help='Use Doxygen') docs_group.add_option('--without-doxygen', action='store_false', dest='with_doxygen', help=optparse.SUPPRESS_HELP) mods_group = optparse.OptionGroup(parser, 'Module selection') mods_group.add_option('--module-policy', dest='module_policy', help="module policy file (see src/build-data/policy)", metavar='POL', default=None) mods_group.add_option('--enable-modules', dest='enabled_modules', metavar='MODS', action='append', help='enable specific modules') mods_group.add_option('--disable-modules', dest='disabled_modules', metavar='MODS', action='append', help='disable specific modules') mods_group.add_option('--list-modules', dest='list_modules', action='store_true', help='list available modules and exit') mods_group.add_option('--no-autoload', action='store_true', default=False, help=optparse.SUPPRESS_HELP) mods_group.add_option('--minimized-build', action='store_true', dest='no_autoload', help='minimize build') # Should be derived from info.txt but this runs too early third_party = ['bearssl', 'boost', 'bzip2', 'lzma', 'openssl', 'sqlite3', 'zlib', 'tpm'] for mod in third_party: mods_group.add_option('--with-%s' % (mod), help=('use %s' % (mod)) if mod in third_party else optparse.SUPPRESS_HELP, action='append_const', const=mod, dest='enabled_modules') mods_group.add_option('--without-%s' % (mod), help=optparse.SUPPRESS_HELP, action='append_const', const=mod, dest='disabled_modules') mods_group.add_option('--with-everything', help=optparse.SUPPRESS_HELP, action='store_true', default=False) install_group = optparse.OptionGroup(parser, 'Installation options') install_group.add_option('--program-suffix', metavar='SUFFIX', help='append string to program names') install_group.add_option('--prefix', metavar='DIR', help='set the install prefix') install_group.add_option('--docdir', metavar='DIR', help='set the doc install dir') install_group.add_option('--bindir', metavar='DIR', help='set the binary install dir') install_group.add_option('--libdir', metavar='DIR', help='set the library install dir') install_group.add_option('--mandir', metavar='DIR', help='set the install dir for man pages') install_group.add_option('--includedir', metavar='DIR', help='set the include file install dir') misc_group = optparse.OptionGroup(parser, 'Miscellaneous options') misc_group.add_option('--house-curve', metavar='STRING', dest='house_curve', help='a custom in-house curve of the format: curve.pem,NAME,OID,CURVEID') parser.add_option_group(target_group) parser.add_option_group(build_group) parser.add_option_group(docs_group) parser.add_option_group(mods_group) parser.add_option_group(install_group) parser.add_option_group(misc_group) # These exist only for autoconf compatibility (requested by zw for mtn) compat_with_autoconf_options = [ 'datadir', 'datarootdir', 'dvidir', 'exec-prefix', 'htmldir', 'infodir', 'libexecdir', 'localedir', 'localstatedir', 'oldincludedir', 'pdfdir', 'psdir', 'sbindir', 'sharedstatedir', 'sysconfdir' ] for opt in compat_with_autoconf_options: parser.add_option('--' + opt, help=optparse.SUPPRESS_HELP) (options, args) = parser.parse_args(args) if args != []: raise UserError('Unhandled option(s): ' + ' '.join(args)) if options.with_endian not in [None, 'little', 'big']: raise UserError('Bad value to --with-endian "%s"' % (options.with_endian)) if options.debug_mode: options.no_optimizations = True options.with_debug_info = True if options.with_coverage: options.with_coverage_info = True options.no_optimizations = True def parse_multiple_enable(modules): if modules is None: return [] return sorted(set(flatten([s.split(',') for s in modules]))) options.enabled_modules = parse_multiple_enable(options.enabled_modules) options.disabled_modules = parse_multiple_enable(options.disabled_modules) options.with_os_features = parse_multiple_enable(options.with_os_features) options.without_os_features = parse_multiple_enable(options.without_os_features) options.disable_intrinsics = parse_multiple_enable(options.disable_intrinsics) # Take some values from environment, if not set on command line if options.ar_command is None: options.ar_command = os.getenv('AR') if options.compiler_binary is None: options.compiler_binary = os.getenv('CXX') if options.cxxflags is None: options.cxxflags = os.getenv('CXXFLAGS') if options.ldflags is None: options.ldflags = os.getenv('LDFLAGS') return options class LexResult(object): pass class LexerError(InternalError): def __init__(self, msg, lexfile, line): super(LexerError, self).__init__(msg) self.msg = msg self.lexfile = lexfile self.line = line def __str__(self): return '%s at %s:%d' % (self.msg, self.lexfile, self.line) def parse_lex_dict(as_list): if len(as_list) % 3 != 0: raise InternalError("Lex dictionary has invalid format (input not divisible by 3): %s" % as_list) result = {} for key, sep, value in [as_list[3*i:3*i+3] for i in range(0, len(as_list)//3)]: if sep != '->': raise InternalError("Lex dictionary has invalid format") result[key] = value return result def lex_me_harder(infofile, allowed_groups, allowed_maps, name_val_pairs): """ Generic lexer function for info.txt and src/build-data files """ out = LexResult() # Format as a nameable Python variable def py_var(group): return group.replace(':', '_') lexer = shlex.shlex(open(infofile), infofile, posix=True) lexer.wordchars += '|:.<>/,-!+*' # handle various funky chars in info.txt groups = allowed_groups + allowed_maps for group in groups: out.__dict__[py_var(group)] = [] for (key, val) in name_val_pairs.items(): out.__dict__[key] = val def lexed_tokens(): # Convert to an interator while True: token = lexer.get_token() if token != lexer.eof: yield token else: return for token in lexed_tokens(): match = re.match('<(.*)>', token) # Check for a grouping if match is not None: group = match.group(1) if group not in groups: raise LexerError('Unknown group "%s"' % (group), infofile, lexer.lineno) end_marker = '' token = lexer.get_token() while token != end_marker: out.__dict__[py_var(group)].append(token) token = lexer.get_token() if token is None: raise LexerError('Group "%s" not terminated' % (group), infofile, lexer.lineno) elif token in name_val_pairs.keys(): if isinstance(out.__dict__[token], list): out.__dict__[token].append(lexer.get_token()) else: out.__dict__[token] = lexer.get_token() else: # No match -> error raise LexerError('Bad token "%s"' % (token), infofile, lexer.lineno) for group in allowed_maps: out.__dict__[group] = parse_lex_dict(out.__dict__[group]) return out class InfoObject(object): def __init__(self, infofile): """ Constructor sets members `infofile`, `lives_in`, `parent_module` and `basename` """ self.infofile = infofile (dirname, basename) = os.path.split(infofile) self.lives_in = dirname if basename == 'info.txt': (obj_dir, self.basename) = os.path.split(dirname) if os.access(os.path.join(obj_dir, 'info.txt'), os.R_OK): self.parent_module = os.path.basename(obj_dir) else: self.parent_module = None else: self.basename = basename.replace('.txt', '') class ModuleInfo(InfoObject): """ Represents the information about a particular module """ def __init__(self, infofile): super(ModuleInfo, self).__init__(infofile) lex = lex_me_harder( infofile, ['header:internal', 'header:public', 'header:external', 'requires', 'os', 'arch', 'cc', 'libs', 'frameworks', 'comment', 'warning' ], ['defines'], { 'load_on': 'auto', 'need_isa': '' }) def check_header_duplicates(header_list_public, header_list_internal): pub_header = set(header_list_public) int_header = set(header_list_internal) if not pub_header.isdisjoint(int_header): logging.error("Module %s header contains same header in public and internal sections" % self.infofile) check_header_duplicates(lex.header_public, lex.header_internal) all_source_files = [] all_header_files = [] for fspath in os.listdir(self.lives_in): if fspath.endswith('.cpp'): all_source_files.append(fspath) elif fspath.endswith('.h'): all_header_files.append(fspath) self.source = all_source_files # If not entry for the headers, all are assumed public if lex.header_internal == [] and lex.header_public == []: self.header_public = list(all_header_files) self.header_internal = [] else: self.header_public = lex.header_public self.header_internal = lex.header_internal self.header_external = lex.header_external # Coerce to more useful types def convert_lib_list(l): if len(l) % 3 != 0: raise InternalError("Bad in module %s" % (self.basename)) result = {} for sep in l[1::3]: if sep != '->': raise InternalError("Bad in module %s" % (self.basename)) for (targetlist, vallist) in zip(l[::3], l[2::3]): vals = vallist.split(',') for target in targetlist.split(','): result[target] = result.setdefault(target, []) + vals return result # Convert remaining lex result to members self.arch = lex.arch self.cc = lex.cc self.comment = ' '.join(lex.comment) if lex.comment else None self._defines = lex.defines self._validate_defines_content(self._defines) self.frameworks = convert_lib_list(lex.frameworks) self.libs = convert_lib_list(lex.libs) self.load_on = lex.load_on self.need_isa = lex.need_isa.split(',') if lex.need_isa else [] self.os = lex.os self.requires = lex.requires self.warning = ' '.join(lex.warning) if lex.warning else None # Modify members self.source = [normalize_source_path(os.path.join(self.lives_in, s)) for s in self.source] self.header_internal = [os.path.join(self.lives_in, s) for s in self.header_internal] self.header_public = [os.path.join(self.lives_in, s) for s in self.header_public] self.header_external = [os.path.join(self.lives_in, s) for s in self.header_external] # Filesystem read access check for src in self.source + self.header_internal + self.header_public + self.header_external: if not os.access(src, os.R_OK): logging.error("Missing file %s in %s" % (src, infofile)) # Check for duplicates def intersect_check(type_a, list_a, type_b, list_b): intersection = set.intersection(set(list_a), set(list_b)) if intersection: logging.error('Headers %s marked both %s and %s' % (' '.join(intersection), type_a, type_b)) intersect_check('public', self.header_public, 'internal', self.header_internal) intersect_check('public', self.header_public, 'external', self.header_external) intersect_check('external', self.header_external, 'internal', self.header_internal) @staticmethod def _validate_defines_content(defines): for key, value in defines.items(): if not re.match('^[0-9A-Za-z_]{3,30}$', key): raise InternalError('Module defines key has invalid format: "%s"' % key) if not re.match('^[0-9]{8}$', value): raise InternalError('Module defines value has invalid format: "%s"' % value) def cross_check(self, arch_info, os_info, cc_info): for supp_os in self.os: if supp_os not in os_info: raise InternalError('Module %s mentions unknown OS %s' % (self.infofile, supp_os)) for supp_cc in self.cc: if supp_cc not in cc_info: colon_idx = supp_cc.find(':') # a versioned compiler dependency if colon_idx > 0 and supp_cc[0:colon_idx] in cc_info: pass else: raise InternalError('Module %s mentions unknown compiler %s' % (self.infofile, supp_cc)) for supp_arch in self.arch: if supp_arch not in arch_info: raise InternalError('Module %s mentions unknown arch %s' % (self.infofile, supp_arch)) def sources(self): return self.source def public_headers(self): return self.header_public def internal_headers(self): return self.header_internal def external_headers(self): return self.header_external def defines(self): return [(key + ' ' + value) for key, value in self._defines.items()] def compatible_cpu(self, archinfo, options): arch_name = archinfo.basename cpu_name = options.cpu for isa in self.need_isa: if isa in options.disable_intrinsics: return False # explicitly disabled if isa not in archinfo.isa_extensions: return False if self.arch != []: if arch_name not in self.arch and cpu_name not in self.arch: return False return True def compatible_os(self, os_name): return self.os == [] or os_name in self.os def compatible_compiler(self, ccinfo, cc_min_version, arch): # Check if this compiler supports the flags we need def supported_isa_flags(ccinfo, arch): for isa in self.need_isa: if ccinfo.isa_flags_for(isa, arch) is None: return False return True # Check if module gives explicit compiler dependencies def supported_compiler(ccinfo, cc_min_version): if self.cc == []: # no compiler restriction return True if ccinfo.basename in self.cc: # compiler is supported, independent of version return True # Maybe a versioned compiler dep for cc in self.cc: try: name, version = cc.split(":") if name == ccinfo.basename: min_cc_version = [int(v) for v in version.split('.')] cur_cc_version = [int(v) for v in cc_min_version.split('.')] # With lists of ints, this does what we want return cur_cc_version >= min_cc_version except ValueError: # No version part specified pass return False # compiler not listed return supported_isa_flags(ccinfo, arch) and supported_compiler(ccinfo, cc_min_version) def dependencies(self): # base is an implicit dep for all submodules deps = self.requires + ['base'] if self.parent_module != None: deps.append(self.parent_module) return deps def dependencies_exist(self, modules): """ Ensure that all dependencies of this module actually exist, warning about any that do not """ all_deps = [s.split('|') for s in self.dependencies()] for missing in [s for s in flatten(all_deps) if s not in modules]: logging.error("Module '%s', dep of '%s', does not exist" % ( missing, self.basename)) class ModulePolicyInfo(InfoObject): def __init__(self, infofile): super(ModulePolicyInfo, self).__init__(infofile) lex = lex_me_harder( infofile, ['required', 'if_available', 'prohibited'], [], {}) self.if_available = lex.if_available self.required = lex.required self.prohibited = lex.prohibited def cross_check(self, modules): def check(tp, lst): for mod in lst: if mod not in modules: logging.error("Module policy %s includes non-existent module %s in <%s>" % ( self.infofile, mod, tp)) check('required', self.required) check('if_available', self.if_available) check('prohibited', self.prohibited) class ArchInfo(InfoObject): def __init__(self, infofile): super(ArchInfo, self).__init__(infofile) lex = lex_me_harder( infofile, ['aliases', 'submodels', 'isa_extensions'], ['submodel_aliases'], { 'endian': None, 'family': None, 'wordsize': 32 }) self.aliases = lex.aliases self.endian = lex.endian self.family = lex.family self.isa_extensions = lex.isa_extensions self.submodels = lex.submodels self.submodel_aliases = lex.submodel_aliases self.wordsize = int(lex.wordsize) alphanumeric = re.compile('^[a-z0-9]+$') for isa in self.isa_extensions: if alphanumeric.match(isa) is None: logging.error('Invalid name for ISA extension "%s"', isa) def all_submodels(self): """ Return a list of all submodels for this arch, ordered longest to shortest """ return sorted([(k, k) for k in self.submodels] + [k for k in self.submodel_aliases.items()], key=lambda k: len(k[0]), reverse=True) def supported_isa_extensions(self, cc, options): isas = [] for isa in self.isa_extensions: if isa not in options.disable_intrinsics: if cc.isa_flags_for(isa, self.basename) is not None: isas.append(isa) return sorted(isas) MachOptFlags = collections.namedtuple('MachOptFlags', ['flags', 'submodel_prefix']) class CompilerInfo(InfoObject): # pylint: disable=too-many-instance-attributes def __init__(self, infofile): super(CompilerInfo, self).__init__(infofile) lex = lex_me_harder( infofile, ['mach_opt'], ['so_link_commands', 'binary_link_commands', 'mach_abi_linking', 'isa_flags'], { 'binary_name': None, 'linker_name': None, 'macro_name': None, 'output_to_object': '-o ', 'output_to_exe': '-o ', 'add_include_dir_option': '-I', 'add_lib_dir_option': '-L', 'add_lib_option': '-l', 'add_framework_option': '-framework ', 'preproc_flags': '-E', 'compile_flags': '-c', 'debug_info_flags': '-g', 'optimization_flags': '', 'size_optimization_flags': '', 'coverage_flags': '', 'sanitizer_flags': '', 'stack_protector_flags': '', 'shared_flags': '', 'lang_flags': '', 'warning_flags': '', 'maintainer_warning_flags': '', 'visibility_build_flags': '', 'visibility_attribute': '', 'ar_command': '', 'ar_options': '', 'ar_output_to': '', }) self.add_framework_option = lex.add_framework_option self.add_include_dir_option = lex.add_include_dir_option self.add_lib_dir_option = lex.add_lib_dir_option self.add_lib_option = lex.add_lib_option self.ar_command = lex.ar_command self.ar_options = lex.ar_options self.ar_output_to = lex.ar_output_to self.binary_link_commands = lex.binary_link_commands self.binary_name = lex.binary_name self.compile_flags = lex.compile_flags self.coverage_flags = lex.coverage_flags self.debug_info_flags = lex.debug_info_flags self.isa_flags = lex.isa_flags self.lang_flags = lex.lang_flags self.linker_name = lex.linker_name self.mach_abi_linking = lex.mach_abi_linking self.macro_name = lex.macro_name self.maintainer_warning_flags = lex.maintainer_warning_flags self.optimization_flags = lex.optimization_flags self.output_to_exe = lex.output_to_exe self.output_to_object = lex.output_to_object self.preproc_flags = lex.preproc_flags self.sanitizer_flags = lex.sanitizer_flags self.shared_flags = lex.shared_flags self.size_optimization_flags = lex.size_optimization_flags self.so_link_commands = lex.so_link_commands self.stack_protector_flags = lex.stack_protector_flags self.visibility_attribute = lex.visibility_attribute self.visibility_build_flags = lex.visibility_build_flags self.warning_flags = lex.warning_flags self.mach_opt_flags = {} for key, value in parse_lex_dict(lex.mach_opt).items(): parts = value.split("|") self.mach_opt_flags[key] = MachOptFlags(parts[0], parts[1] if len(parts) == 2 else '') def isa_flags_for(self, isa, arch): if isa in self.isa_flags: return self.isa_flags[isa] arch_isa = '%s:%s' % (arch, isa) if arch_isa in self.isa_flags: return self.isa_flags[arch_isa] return None def get_isa_specific_flags(self, isas, arch): flags = set() def simd32_impl(): for simd_isa in ['sse2', 'altivec', 'neon']: if simd_isa in arch.isa_extensions and self.isa_flags_for(simd_isa, arch.basename): return simd_isa return None for isa in isas: if isa == 'simd': isa = simd32_impl() if isa is None: continue flagset = self.isa_flags_for(isa, arch.basename) if flagset is None: raise UserError('Compiler %s does not support %s' % (self.basename, isa)) flags.add(flagset) return " ".join(sorted(flags)) def gen_shared_flags(self, options): """ Return the shared library build flags, if any """ def flag_builder(): if options.build_shared_lib: yield self.shared_flags yield self.visibility_build_flags return ' '.join(list(flag_builder())) def gen_visibility_attribute(self, options): if options.build_shared_lib: return self.visibility_attribute return '' def mach_abi_link_flags(self, options, with_debug_info=None): """ Return the machine specific ABI flags """ if with_debug_info is None: with_debug_info = options.with_debug_info def mach_abi_groups(): if with_debug_info and 'all-debug' in self.mach_abi_linking: yield 'all-debug' elif 'all' in self.mach_abi_linking: yield 'all' for all_except in [s for s in self.mach_abi_linking.keys() if s.startswith('all!')]: exceptions = all_except[4:].split(',') if options.os not in exceptions and options.arch not in exceptions: yield all_except yield options.os yield options.arch yield options.cpu abi_link = list() for what in mach_abi_groups(): flag = self.mach_abi_linking.get(what) if flag != None and flag != '' and flag not in abi_link: abi_link.append(flag) if options.with_stack_protector and self.stack_protector_flags != '': abi_link.append(self.stack_protector_flags) if options.with_coverage_info: if self.coverage_flags == '': raise UserError('No coverage handling for %s' % (self.basename)) abi_link.append(self.coverage_flags) if options.with_sanitizers: if self.sanitizer_flags == '': raise UserError('No sanitizer handling for %s' % (self.basename)) abi_link.append(self.sanitizer_flags) if options.with_openmp: if 'openmp' not in self.mach_abi_linking: raise UserError('No support for OpenMP for %s' % (self.basename)) abi_link.append(self.mach_abi_linking['openmp']) abi_flags = ' '.join(sorted(abi_link)) if options.cc_abi_flags != '': abi_flags += ' ' + options.cc_abi_flags return abi_flags def cc_warning_flags(self, options): def gen_flags(): yield self.warning_flags if options.maintainer_mode: yield self.maintainer_warning_flags return (' '.join(gen_flags())).strip() def cc_lang_flags(self): return self.lang_flags def cc_compile_flags(self, options, with_debug_info=None, enable_optimizations=None): def gen_flags(with_debug_info, enable_optimizations): if with_debug_info is None: with_debug_info = options.with_debug_info if enable_optimizations is None: enable_optimizations = not options.no_optimizations if with_debug_info: yield self.debug_info_flags if enable_optimizations: if options.optimize_for_size: if self.size_optimization_flags != '': yield self.size_optimization_flags else: logging.warning("No size optimization flags set for current compiler") yield self.optimization_flags else: yield self.optimization_flags def submodel_fixup(full_cpu, mach_opt_flags_tupel): submodel_replacement = full_cpu.replace(mach_opt_flags_tupel.submodel_prefix, '') return mach_opt_flags_tupel.flags.replace('SUBMODEL', submodel_replacement) if options.cpu != options.arch: if options.cpu in self.mach_opt_flags: yield submodel_fixup(options.cpu, self.mach_opt_flags[options.cpu]) elif options.arch in self.mach_opt_flags: yield submodel_fixup(options.cpu, self.mach_opt_flags[options.arch]) all_arch = 'all_%s' % (options.arch) if all_arch in self.mach_opt_flags: yield self.mach_opt_flags[all_arch][0] return (' '.join(gen_flags(with_debug_info, enable_optimizations))).strip() @staticmethod def _so_link_search(osname, debug_info): so_link_typ = [osname, 'default'] if debug_info: so_link_typ = [l + '-debug' for l in so_link_typ] + so_link_typ return so_link_typ def so_link_command_for(self, osname, options): """ Return the command needed to link a shared object """ for s in self._so_link_search(osname, options.with_debug_info): if s in self.so_link_commands: return self.so_link_commands[s] raise InternalError( "No shared library link command found for target '%s' in compiler settings '%s'" % (osname, self.infofile)) def binary_link_command_for(self, osname, options): """ Return the command needed to link an app/test object """ for s in self._so_link_search(osname, options.with_debug_info): if s in self.binary_link_commands: return self.binary_link_commands[s] return '$(LINKER)' class OsInfo(InfoObject): # pylint: disable=too-many-instance-attributes def __init__(self, infofile): super(OsInfo, self).__init__(infofile) lex = lex_me_harder( infofile, ['aliases', 'target_features'], [], { 'os_type': None, 'program_suffix': '', 'obj_suffix': 'o', 'soname_suffix': '', 'soname_pattern_patch': '', 'soname_pattern_abi': '', 'soname_pattern_base': '', 'static_suffix': 'a', 'ar_command': 'ar', 'ar_options': '', 'ar_output_to': '', 'install_root': '/usr/local', 'header_dir': 'include', 'bin_dir': 'bin', 'lib_dir': 'lib', 'doc_dir': 'share/doc', 'man_dir': 'share/man', 'use_stack_protector': 'true', 'so_post_link_command': '', 'cli_exe_name': 'botan', 'lib_prefix': 'lib', 'library_name': 'botan-{major}', }) if lex.ar_command == 'ar' and lex.ar_options == '': lex.ar_options = 'crs' if lex.soname_pattern_base: self.soname_pattern_base = lex.soname_pattern_base if lex.soname_pattern_patch == '' and lex.soname_pattern_abi == '': self.soname_pattern_patch = lex.soname_pattern_base self.soname_pattern_abi = lex.soname_pattern_base elif lex.soname_pattern_abi != '' and lex.soname_pattern_abi != '': self.soname_pattern_patch = lex.soname_pattern_patch self.soname_pattern_abi = lex.soname_pattern_abi else: # base set, only one of patch/abi set raise InternalError("Invalid soname_patterns in %s" % (self.infofile)) else: if lex.soname_suffix: self.soname_pattern_base = "libbotan-{version_major}.%s" % (lex.soname_suffix) self.soname_pattern_abi = self.soname_pattern_base + ".{abi_rev}" self.soname_pattern_patch = self.soname_pattern_abi + ".{version_minor}.{version_patch}" else: # Could not calculate soname_pattern_* # This happens for OSs without shared library support (e.g. nacl, mingw, includeos, cygwin) self.soname_pattern_base = None self.soname_pattern_abi = None self.soname_pattern_patch = None self._aliases = lex.aliases self.ar_command = lex.ar_command self.ar_options = lex.ar_options self.bin_dir = lex.bin_dir self.cli_exe_name = lex.cli_exe_name self.doc_dir = lex.doc_dir self.header_dir = lex.header_dir self.install_root = lex.install_root self.lib_dir = lex.lib_dir self.lib_prefix = lex.lib_prefix self.library_name = lex.library_name self.man_dir = lex.man_dir self.obj_suffix = lex.obj_suffix self.os_type = lex.os_type self.program_suffix = lex.program_suffix self.so_post_link_command = lex.so_post_link_command self.static_suffix = lex.static_suffix self.target_features = lex.target_features self.use_stack_protector = (lex.use_stack_protector == "true") def matches_name(self, nm): if nm in self._aliases: return True for alias in self._aliases: if re.match(alias, nm): return True return False def building_shared_supported(self): return self.soname_pattern_base != None def enabled_features(self, options): feats = [] for feat in self.target_features: if feat not in options.without_os_features: feats.append(feat) for feat in options.with_os_features: if feat not in self.target_features: feats.append(feat) return sorted(feats) def fixup_proc_name(proc): proc = proc.lower().replace(' ', '') for junk in ['(tm)', '(r)']: proc = proc.replace(junk, '') return proc def canon_processor(archinfo, proc): proc = fixup_proc_name(proc) # First, try to search for an exact match for ainfo in archinfo.values(): if ainfo.basename == proc or proc in ainfo.aliases: return (ainfo.basename, ainfo.basename) for (match, submodel) in ainfo.all_submodels(): if proc == submodel or proc == match: return (ainfo.basename, submodel) logging.debug('Could not find an exact match for CPU "%s"' % (proc)) # Now, try searching via regex match for ainfo in archinfo.values(): for (match, submodel) in ainfo.all_submodels(): if re.search(match, proc) != None: logging.debug('Possible match "%s" with "%s" (%s)' % ( proc, match, submodel)) return (ainfo.basename, submodel) return None def system_cpu_info(): cpu_info = [] if platform.machine() != '': cpu_info.append(platform.machine()) if platform.processor() != '': cpu_info.append(platform.processor()) try: with open('/proc/cpuinfo') as f: for line in f.readlines(): colon = line.find(':') if colon > 1: key = line[0:colon].strip() val = ' '.join([s.strip() for s in line[colon+1:].split(' ') if s != '']) # Different Linux arch use different names for this field in cpuinfo if key in ["model name", "cpu model", "Processor"]: logging.info('Detected CPU model "%s" in /proc/cpuinfo' % (val)) cpu_info.append(val) break except IOError: pass return cpu_info def guess_processor(archinfo): for info_part in system_cpu_info(): if info_part: match = canon_processor(archinfo, info_part) if match != None: logging.debug("Matched '%s' to processor '%s'" % (info_part, match)) return match else: logging.debug("Failed to deduce CPU from '%s'" % info_part) raise UserError('Could not determine target CPU; set with --cpu') def read_textfile(filepath): """ Read a whole file into memory as a string """ if filepath is None: return '' with open(filepath) as f: return ''.join(f.readlines()) def process_template(template_file, variables): # pylint: disable=too-many-branches,too-many-statements """ Perform template substitution The template language supports (un-nested) conditionals. """ class SimpleTemplate(object): def __init__(self, vals): self.vals = vals self.value_pattern = re.compile(r'%{([a-z][a-z_0-9\|]+)}') self.cond_pattern = re.compile('%{(if|unless) ([a-z][a-z_0-9]+)}') self.for_pattern = re.compile('(.*)%{for ([a-z][a-z_0-9]+)}') self.join_pattern = re.compile('(.*)%{join ([a-z][a-z_0-9]+)}') def substitute(self, template): # pylint: disable=too-many-locals def insert_value(match): v = match.group(1) if v in self.vals: return str(self.vals.get(v)) if v.endswith('|upper'): v = v.replace('|upper', '') if v in self.vals: return str(self.vals.get(v)).upper() raise KeyError(v) lines = template.splitlines() output = "" idx = 0 while idx < len(lines): cond_match = self.cond_pattern.match(lines[idx]) join_match = self.join_pattern.match(lines[idx]) for_match = self.for_pattern.match(lines[idx]) if cond_match: cond_type = cond_match.group(1) cond_var = cond_match.group(2) include_cond = False if cond_type == 'if' and cond_var in self.vals and self.vals.get(cond_var): include_cond = True elif cond_type == 'unless' and (cond_var not in self.vals or (not self.vals.get(cond_var))): include_cond = True idx += 1 while idx < len(lines): if lines[idx] == '%{endif}': break if include_cond: output += lines[idx] + "\n" idx += 1 elif join_match: join_var = join_match.group(2) join_str = ' ' join_line = '%%{join %s}' % (join_var) output += lines[idx].replace(join_line, join_str.join(self.vals[join_var])) + "\n" elif for_match: for_prefix = for_match.group(1) output += for_prefix for_var = for_match.group(2) if for_var not in self.vals: raise InternalError("Unknown for loop iteration variable '%s'" % (for_var)) var = self.vals[for_var] if not isinstance(var, list): raise InternalError("For loop iteration variable '%s' is not a list" % (for_var)) idx += 1 for_body = "" while idx < len(lines): if lines[idx] == '%{endfor}': break for_body += lines[idx] + "\n" idx += 1 for v in var: if isinstance(v, dict): for_val = for_body for ik, iv in v.items(): for_val = for_val.replace('%{' + ik + '}', iv) output += for_val + "\n" else: output += for_body.replace('%{i}', v).replace('%{i|upper}', v.upper()) output += "\n" else: output += lines[idx] + "\n" idx += 1 return self.value_pattern.sub(insert_value, output) + '\n' try: return SimpleTemplate(variables).substitute(read_textfile(template_file)) except KeyError as e: logging.error('Unbound var %s in template %s' % (e, template_file)) except Exception as e: # pylint: disable=broad-except logging.error('Exception %s during template processing file %s' % (e, template_file)) def yield_objectfile_list(sources, obj_dir, obj_suffix): obj_suffix = '.' + obj_suffix for src in sources: (directory, filename) = os.path.split(os.path.normpath(src)) parts = directory.split(os.sep) if 'src' in parts: parts = parts[parts.index('src')+2:] elif filename.find('botan_all') != -1: parts = [] else: raise InternalError("Unexpected file '%s/%s'" % (directory, filename)) if parts != []: # Handle src/X/X.cpp -> X.o if filename == parts[-1] + '.cpp': name = '_'.join(parts) + '.cpp' else: name = '_'.join(parts) + '_' + filename def fixup_obj_name(name): def remove_dups(parts): last = None for part in parts: if last is None or part != last: last = part yield part return '_'.join(remove_dups(name.split('_'))) name = fixup_obj_name(name) else: name = filename name = name.replace('.cpp', obj_suffix) yield os.path.join(obj_dir, name) def generate_build_info(build_paths, modules, cc, arch, osinfo): # pylint: disable=too-many-locals # first create a map of src_file->owning module module_that_owns = {} for mod in modules: for src in mod.sources(): module_that_owns[src] = mod def _isa_specific_flags(src): if os.path.basename(src) == 'test_simd.cpp': return cc.get_isa_specific_flags(['simd'], arch) if src in module_that_owns: module = module_that_owns[src] isas = module.need_isa if 'simd' in module.dependencies(): isas.append('simd') return cc.get_isa_specific_flags(isas, arch) if src.startswith('botan_all_'): isas = src.replace('botan_all_', '').replace('.cpp', '').split('_') return cc.get_isa_specific_flags(isas, arch) return '' def _build_info(sources, objects, target_type): output = [] for (obj_file, src) in zip(objects, sources): info = { 'src': src, 'obj': obj_file, 'isa_flags': _isa_specific_flags(src) } if target_type == 'fuzzer': fuzz_basename = os.path.basename(obj_file).replace('.' + osinfo.obj_suffix, '') info['exe'] = os.path.join(build_paths.fuzzer_output_dir, fuzz_basename) output.append(info) return output out = {} targets = ['lib', 'cli', 'test', 'fuzzer'] out['isa_build_info'] = [] fuzzer_bin = [] for t in targets: src_list, src_dir = build_paths.src_info(t) src_key = '%s_srcs' % (t) obj_key = '%s_objs' % (t) build_key = '%s_build_info' % (t) objects = [] build_info = [] if src_list is not None: src_list.sort() objects = list(yield_objectfile_list(src_list, src_dir, osinfo.obj_suffix)) build_info = _build_info(src_list, objects, t) for b in build_info: if b['isa_flags'] != '': out['isa_build_info'].append(b) if t == 'fuzzer': fuzzer_bin = [b['exe'] for b in build_info] out[src_key] = src_list if src_list else [] out[obj_key] = objects out[build_key] = build_info out['fuzzer_bin'] = ' '.join(fuzzer_bin) out['cli_headers'] = build_paths.cli_headers return out def house_ecc_curve_macros(house_curve): def _read_pem(filepath): try: with open(filepath) as f: lines = [line.rstrip() for line in f] except IOError: raise UserError("Error reading file '%s'" % filepath) for ndx, _ in enumerate(lines): lines[ndx] = ' \"%s\"' % lines[ndx] return "\\\n" + ' \\\n'.join(lines) if house_curve is None: return [] else: p = house_curve.split(",") if len(p) != 4: raise UserError('--house-curve must have 4 comma separated parameters. See --help') # make sure TLS curve id is in reserved for private use range (0xFE00..0xFEFF) curve_id = int(p[3], 16) if curve_id < 0xfe00 or curve_id > 0xfeff: raise UserError('TLS curve ID not in reserved range (see RFC 4492)') return ['NAME \"' + p[1] + '\"', 'OID \"' + p[2] + '\"', 'PEM ' + _read_pem(filepath=p[0]), 'TLS_ID ' + hex(curve_id)] def create_template_vars(source_paths, build_config, options, modules, cc, arch, osinfo): #pylint: disable=too-many-locals,too-many-branches,too-many-statements """ Create the template variables needed to process the makefile, build.h, etc """ def external_link_cmd(): return (' ' + cc.add_lib_dir_option + options.with_external_libdir) if options.with_external_libdir else '' def link_to(module_member_name): """ Figure out what external libraries/frameworks are needed based on selected modules """ if not (module_member_name == 'libs' or module_member_name == 'frameworks'): raise InternalError("Invalid argument") libs = set() for module in modules: for (osname, module_link_to) in getattr(module, module_member_name).items(): if osname == 'all' or osname == osinfo.basename: libs |= set(module_link_to) else: match = re.match('^all!(.*)', osname) if match is not None: exceptions = match.group(1).split(',') if osinfo.basename not in exceptions: libs |= set(module_link_to) return sorted(libs) def choose_mp_bits(): mp_bits = arch.wordsize # allow command line override? logging.debug('Using MP bits %d' % (mp_bits)) return mp_bits def innosetup_arch(os_name, arch): if os_name == 'windows': inno_arch = {'x86_32': '', 'x86_64': 'x64', 'ia64': 'ia64'} if arch in inno_arch: return inno_arch[arch] else: logging.warning('Unknown arch in innosetup_arch %s' % (arch)) return None def configure_command_line(): # Cut absolute path from main executable (e.g. configure.py or python interpreter) # to get the same result when configuring the same thing on different machines main_executable = os.path.basename(sys.argv[0]) return ' '.join([main_executable] + sys.argv[1:]) def cmake_escape(s): return s.replace('(', '\\(').replace(')', '\\)') def ar_command(): if options.ar_command: return options.ar_command if cc.ar_command: if cc.ar_command == cc.binary_name: return options.compiler_binary or cc.binary_name else: return cc.ar_command return osinfo.ar_command build_dir = options.with_build_dir or os.path.curdir program_suffix = options.program_suffix or osinfo.program_suffix variables = { 'version_major': Version.major(), 'version_minor': Version.minor(), 'version_patch': Version.patch(), 'version_vc_rev': Version.vc_rev(), 'abi_rev': Version.so_rev(), 'version': Version.as_string(), 'release_type': Version.release_type(), 'version_datestamp': Version.datestamp(), 'distribution_info': options.distribution_info, 'darwin_so_compat_ver': '%s.%s.0' % (Version.packed(), Version.so_rev()), 'darwin_so_current_ver': '%s.%s.%s' % (Version.packed(), Version.so_rev(), Version.patch()), 'base_dir': source_paths.base_dir, 'src_dir': source_paths.src_dir, 'doc_dir': source_paths.doc_dir, 'scripts_dir': source_paths.scripts_dir, 'python_dir': source_paths.python_dir, 'cli_exe_name': osinfo.cli_exe_name + program_suffix, 'cli_exe': os.path.join(build_dir, osinfo.cli_exe_name + program_suffix), 'test_exe': os.path.join(build_dir, 'botan-test' + program_suffix), 'lib_prefix': osinfo.lib_prefix, 'static_suffix': osinfo.static_suffix, 'libname': osinfo.library_name.format(major=Version.major(), minor=Version.minor()), 'command_line': configure_command_line(), 'local_config': read_textfile(options.local_config), 'program_suffix': program_suffix, 'prefix': options.prefix or osinfo.install_root, 'bindir': options.bindir or osinfo.bin_dir, 'libdir': options.libdir or osinfo.lib_dir, 'mandir': options.mandir or osinfo.man_dir, 'includedir': options.includedir or osinfo.header_dir, 'docdir': options.docdir or osinfo.doc_dir, 'with_documentation': options.with_documentation, 'with_sphinx': options.with_sphinx, 'with_pdf': options.with_pdf, 'with_rst2man': options.with_rst2man, 'sphinx_config_dir': source_paths.sphinx_config_dir, 'with_doxygen': options.with_doxygen, 'out_dir': options.with_build_dir or os.path.curdir, 'build_dir': build_config.build_dir, 'doc_stamp_file': os.path.join(build_config.build_dir, 'doc.stamp'), 'makefile_path': os.path.join(build_config.build_dir, '..', 'Makefile'), 'build_static_lib': options.build_static_lib, 'build_fuzzers': options.build_fuzzers, 'build_shared_lib': options.build_shared_lib, 'build_unix_shared_lib': options.build_shared_lib and options.compiler != 'msvc', 'build_msvc_shared_lib': options.build_shared_lib and options.compiler == 'msvc', 'libobj_dir': build_config.libobj_dir, 'cliobj_dir': build_config.cliobj_dir, 'testobj_dir': build_config.testobj_dir, 'fuzzobj_dir': build_config.fuzzobj_dir, 'fuzzer_output_dir': build_config.fuzzer_output_dir if build_config.fuzzer_output_dir else '', 'doc_output_dir': build_config.doc_output_dir, 'doc_output_dir_manual': build_config.doc_output_dir_manual, 'doc_output_dir_doxygen': build_config.doc_output_dir_doxygen, 'os': options.os, 'arch': options.arch, 'cpu_family': arch.family, 'submodel': options.cpu, 'endian': options.with_endian or arch.endian, 'cpu_is_64bit': arch.wordsize == 64, 'bakefile_arch': 'x86' if options.arch == 'x86_32' else 'x86_64', 'innosetup_arch': innosetup_arch(options.os, options.arch), 'mp_bits': choose_mp_bits(), 'python_exe': sys.executable, 'python_version': options.python_version, 'cxx': (options.compiler_binary or cc.binary_name), 'cxx_abi_flags': cc.mach_abi_link_flags(options), 'linker': cc.linker_name or '$(CXX)', 'make_supports_phony': cc.basename != 'msvc', 'cc_compile_opt_flags': cc.cc_compile_flags(options, False, True), 'cc_compile_debug_flags': cc.cc_compile_flags(options, True, False), 'cxx_abi_opt_flags': cc.mach_abi_link_flags(options, False), 'cxx_abi_debug_flags': cc.mach_abi_link_flags(options, True), 'dash_o': cc.output_to_object, 'dash_c': cc.compile_flags, 'cc_lang_flags': cc.cc_lang_flags(), 'cc_compile_flags': options.cxxflags or cc.cc_compile_flags(options), 'ldflags': options.ldflags or '', 'cc_warning_flags': cc.cc_warning_flags(options), 'output_to_exe': cc.output_to_exe, 'cc_macro': cc.macro_name, 'shared_flags': cc.gen_shared_flags(options), 'cmake_shared_flags': cmake_escape(cc.gen_shared_flags(options)), 'visibility_attribute': cc.gen_visibility_attribute(options), 'lib_link_cmd': cc.so_link_command_for(osinfo.basename, options) + external_link_cmd(), 'exe_link_cmd': cc.binary_link_command_for(osinfo.basename, options) + external_link_cmd(), 'post_link_cmd': '', 'ar_command': ar_command(), 'ar_options': cc.ar_options or osinfo.ar_options, 'ar_output_to': cc.ar_output_to, 'link_to': ' '.join( [cc.add_lib_option + lib for lib in link_to('libs')] + [cc.add_framework_option + fw for fw in link_to('frameworks')] ), 'cmake_link_to': ' '.join( [lib for lib in link_to('libs')] + [('"' + cc.add_framework_option + fw + '"') for fw in link_to('frameworks')] ), 'fuzzer_lib': (cc.add_lib_option + options.fuzzer_lib) if options.fuzzer_lib else '', 'libs_used': [lib.replace('.lib', '') for lib in link_to('libs')], 'include_paths': build_config.format_include_paths(cc, options.with_external_includedir), 'module_defines': sorted(flatten([m.defines() for m in modules])), 'os_features': osinfo.enabled_features(options), 'os_name': osinfo.basename, 'os_type': osinfo.os_type, 'cpu_features': arch.supported_isa_extensions(cc, options), 'house_ecc_curve_defines': house_ecc_curve_macros(options.house_curve), 'fuzzer_mode': options.unsafe_fuzzer_mode, 'fuzzer_type': options.build_fuzzers.upper() if options.build_fuzzers else '', 'with_valgrind': options.with_valgrind, 'with_openmp': options.with_openmp, 'mod_list': sorted([m.basename for m in modules]) } if options.os != 'windows': variables['botan_pkgconfig'] = os.path.join(build_config.build_dir, 'botan-%d.pc' % (Version.major())) # The name is always set because Windows build needs it variables['static_lib_name'] = '%s%s.%s' % (variables['lib_prefix'], variables['libname'], variables['static_suffix']) if options.build_shared_lib: if osinfo.soname_pattern_base != None: variables['soname_base'] = osinfo.soname_pattern_base.format(**variables) variables['shared_lib_name'] = variables['soname_base'] if osinfo.soname_pattern_abi != None: variables['soname_abi'] = osinfo.soname_pattern_abi.format(**variables) variables['shared_lib_name'] = variables['soname_abi'] if osinfo.soname_pattern_patch != None: variables['soname_patch'] = osinfo.soname_pattern_patch.format(**variables) variables['lib_link_cmd'] = variables['lib_link_cmd'].format(**variables) variables['post_link_cmd'] = osinfo.so_post_link_command.format(**variables) if options.build_shared_lib else '' lib_targets = [] if options.build_static_lib: lib_targets.append('static_lib_name') if options.build_shared_lib: lib_targets.append('shared_lib_name') variables['library_targets'] = ' '.join([os.path.join(build_dir, variables[t]) for t in lib_targets]) if options.os == 'llvm' or options.compiler == 'msvc': # llvm-link and msvc require just naming the file directly variables['link_to_botan'] = os.path.join(build_dir, variables['static_lib_name']) else: variables['link_to_botan'] = '%s%s %s%s' % (cc.add_lib_dir_option, build_dir, cc.add_lib_option, variables['libname']) return variables class ModulesChooser(object): """ Determine which modules to load based on options, target, etc """ def __init__(self, modules, module_policy, archinfo, ccinfo, cc_min_version, options): self._modules = modules self._module_policy = module_policy self._archinfo = archinfo self._ccinfo = ccinfo self._cc_min_version = cc_min_version self._options = options self._maybe_dep = set() self._to_load = set() # string to set mapping with reasons as key and modules as value self._not_using_because = collections.defaultdict(set) ModulesChooser._validate_dependencies_exist(self._modules) ModulesChooser._validate_user_selection( self._modules, self._options.enabled_modules, self._options.disabled_modules) def _check_usable(self, module, modname): if not module.compatible_os(self._options.os): self._not_using_because['incompatible OS'].add(modname) return False elif not module.compatible_compiler(self._ccinfo, self._cc_min_version, self._archinfo.basename): self._not_using_because['incompatible compiler'].add(modname) return False elif not module.compatible_cpu(self._archinfo, self._options): self._not_using_because['incompatible CPU'].add(modname) return False return True @staticmethod def _display_module_information_unused(skipped_modules): for reason in sorted(skipped_modules.keys()): disabled_mods = sorted(skipped_modules[reason]) if disabled_mods: logging.info('Skipping (%s): %s' % (reason, ' '.join(disabled_mods))) @staticmethod def _display_module_information_to_load(all_modules, modules_to_load): sorted_modules_to_load = sorted(modules_to_load) for modname in sorted_modules_to_load: if modname.startswith('simd_') and modname != 'simd_engine': logging.info('Using SIMD module ' + modname) for modname in sorted_modules_to_load: if all_modules[modname].comment: logging.info('%s: %s' % (modname, all_modules[modname].comment)) if all_modules[modname].warning: logging.warning('%s: %s' % (modname, all_modules[modname].warning)) if all_modules[modname].load_on == 'vendor': logging.info('Enabling use of external dependency %s' % modname) if sorted_modules_to_load: logging.info('Loading modules: %s', ' '.join(sorted_modules_to_load)) else: logging.error('This configuration disables every submodule and is invalid') @staticmethod def _validate_state(used_modules, unused_modules): for reason, unused_for_reason in unused_modules.items(): intersection = unused_for_reason & used_modules if intersection: raise InternalError( "Disabled modules (%s) and modules to load have common elements: %s" % (reason, intersection)) @staticmethod def _validate_dependencies_exist(modules): for module in modules.values(): module.dependencies_exist(modules) @staticmethod def _validate_user_selection(modules, enabled_modules, disabled_modules): for modname in enabled_modules: if modname not in modules: logging.error("Module not found: %s" % modname) for modname in disabled_modules: if modname not in modules: logging.warning("Disabled module not found: %s" % modname) def _handle_by_module_policy(self, modname, usable): if self._module_policy is not None: if modname in self._module_policy.required: if not usable: logging.error('Module policy requires module %s not usable on this platform' % (modname)) elif modname in self._options.disabled_modules: logging.error('Module %s was disabled but is required by policy' % (modname)) self._to_load.add(modname) return True elif modname in self._module_policy.if_available: if modname in self._options.disabled_modules: self._not_using_because['disabled by user'].add(modname) elif usable: logging.debug('Enabling optional module %s' % (modname)) self._to_load.add(modname) return True elif modname in self._module_policy.prohibited: if modname in self._options.enabled_modules: logging.error('Module %s was requested but is prohibited by policy' % (modname)) self._not_using_because['prohibited by module policy'].add(modname) return True return False @staticmethod def resolve_dependencies(available_modules, dependency_table, module, loaded_modules=None): """ Parameters - available_modules: modules to choose from. Constant. - dependency_table: module to dependencies map. Constant. - module: name of the module to resolve dependencies. Constant. - loaded_modules: modules already loaded. Defensive copy in order to not change value for caller. """ if loaded_modules is None: loaded_modules = set([]) else: loaded_modules = copy.copy(loaded_modules) if module not in available_modules: return False, None loaded_modules.add(module) for dependency in dependency_table[module]: dependency_choices = set(dependency.split('|')) dependency_met = False if not set(dependency_choices).isdisjoint(loaded_modules): dependency_met = True else: possible_mods = dependency_choices.intersection(available_modules) for mod in possible_mods: ok, dependency_modules = ModulesChooser.resolve_dependencies( available_modules, dependency_table, mod, loaded_modules) if ok: dependency_met = True loaded_modules.add(mod) loaded_modules.update(dependency_modules) break if not dependency_met: return False, None return True, loaded_modules def _modules_dependency_table(self): out = {} for modname in self._modules: out[modname] = self._modules[modname].dependencies() return out def _resolve_dependencies_for_all_modules(self): available_modules = set(self._to_load) | set(self._maybe_dep) dependency_table = self._modules_dependency_table() successfully_loaded = set() for modname in self._to_load: # This will try to recusively load all dependencies of modname ok, modules = self.resolve_dependencies(available_modules, dependency_table, modname) if ok: successfully_loaded.add(modname) successfully_loaded.update(modules) else: # Skip this module pass self._not_using_because['dependency failure'].update(self._to_load - successfully_loaded) self._to_load = successfully_loaded self._maybe_dep -= successfully_loaded def _handle_by_load_on(self, module): # pylint: disable=too-many-branches modname = module.basename if module.load_on == 'never': self._not_using_because['disabled as buggy'].add(modname) elif module.load_on == 'request': if self._options.with_everything: self._to_load.add(modname) else: self._not_using_because['by request only'].add(modname) elif module.load_on == 'vendor': if self._options.with_everything: self._to_load.add(modname) else: self._not_using_because['requires external dependency'].add(modname) elif module.load_on == 'dep': self._maybe_dep.add(modname) elif module.load_on == 'always': self._to_load.add(modname) elif module.load_on == 'auto': if self._options.no_autoload or self._module_policy is not None: self._maybe_dep.add(modname) else: self._to_load.add(modname) else: logging.error('Unknown load_on %s in %s' % ( module.load_on, modname)) def choose(self): for (modname, module) in self._modules.items(): usable = self._check_usable(module, modname) module_handled = self._handle_by_module_policy(modname, usable) if module_handled: continue if modname in self._options.disabled_modules: self._not_using_because['disabled by user'].add(modname) elif usable: if modname in self._options.enabled_modules: self._to_load.add(modname) # trust the user else: self._handle_by_load_on(module) if 'compression' in self._to_load: # Confirm that we have at least one compression library enabled # Otherwise we leave a lot of useless support code compiled in, plus a # make_compressor call that always fails if 'zlib' not in self._to_load and 'bzip2' not in self._to_load and 'lzma' not in self._to_load: self._to_load.remove('compression') self._not_using_because['no enabled compression schemes'].add('compression') self._resolve_dependencies_for_all_modules() for not_a_dep in self._maybe_dep: self._not_using_because['not requested'].add(not_a_dep) ModulesChooser._validate_state(self._to_load, self._not_using_because) ModulesChooser._display_module_information_unused(self._not_using_because) ModulesChooser._display_module_information_to_load(self._modules, self._to_load) return self._to_load def choose_link_method(options): """ Choose the link method based on system availability and user request """ req = options.link_method def useable_methods(): # Symbolic link support on Windows was introduced in Windows 6.0 (Vista) and Python 3.2 # Furthermore the SeCreateSymbolicLinkPrivilege is required in order to successfully create symlinks # So only try to use symlinks on Windows if explicitly requested if req == 'symlink' and options.os == 'windows': yield 'symlink' # otherwise keep old conservative behavior if 'symlink' in os.__dict__ and options.os != 'windows': yield 'symlink' if 'link' in os.__dict__: yield 'hardlink' yield 'copy' for method in useable_methods(): if req is None or req == method: logging.info('Using %s to link files into build dir ' \ '(use --link-method to change)' % (method)) return method logging.warning('Could not use link method "%s", will copy instead' % (req)) return 'copy' def portable_symlink(file_path, target_dir, method): """ Copy or link the file, depending on what the platform offers """ if not os.access(file_path, os.R_OK): logging.warning('Missing file %s' % (file_path)) return if method == 'symlink': rel_file_path = os.path.relpath(file_path, start=target_dir) os.symlink(rel_file_path, os.path.join(target_dir, os.path.basename(file_path))) elif method == 'hardlink': os.link(file_path, os.path.join(target_dir, os.path.basename(file_path))) elif method == 'copy': shutil.copy(file_path, target_dir) else: raise UserError('Unknown link method %s' % (method)) class AmalgamationHelper(object): # All include types may have trailing comment like e.g. '#include // IWYU pragma: export' _any_include = re.compile(r'#include <(.*)>') _botan_include = re.compile(r'#include ') # Only matches at the beginning of the line. By convention, this means that the include # is not wrapped by condition macros _unconditional_any_include = re.compile(r'^#include <(.*)>') _unconditional_std_include = re.compile(r'^#include <([^/\.]+|stddef.h)>') @staticmethod def is_any_include(cpp_source_line): match = AmalgamationHelper._any_include.search(cpp_source_line) if match: return match.group(1) else: return None @staticmethod def is_botan_include(cpp_source_line): match = AmalgamationHelper._botan_include.search(cpp_source_line) if match: return match.group(1) else: return None @staticmethod def is_unconditional_any_include(cpp_source_line): match = AmalgamationHelper._unconditional_any_include.search(cpp_source_line) if match: return match.group(1) else: return None @staticmethod def is_unconditional_std_include(cpp_source_line): match = AmalgamationHelper._unconditional_std_include.search(cpp_source_line) if match: return match.group(1) else: return None class AmalgamationHeader(object): def __init__(self, input_filepaths): self.included_already = set() self.all_std_includes = set() encoding_kwords = {} if sys.version_info[0] == 3: encoding_kwords['encoding'] = 'utf8' self.file_contents = {} for filepath in sorted(input_filepaths): try: with open(filepath, **encoding_kwords) as f: raw_content = f.readlines() contents = AmalgamationGenerator.strip_header_goop(filepath, raw_content) self.file_contents[os.path.basename(filepath)] = contents except IOError as e: logging.error('Error processing file %s for amalgamation: %s' % (filepath, e)) self.contents = '' for name in sorted(self.file_contents): self.contents += ''.join(list(self.header_contents(name))) self.header_includes = '' for std_header in sorted(self.all_std_includes): self.header_includes += '#include <%s>\n' % (std_header) self.header_includes += '\n' def header_contents(self, name): name = name.replace('internal/', '') if name in self.included_already: return if name == 'botan.h': return self.included_already.add(name) if name not in self.file_contents: return for line in self.file_contents[name]: header = AmalgamationHelper.is_botan_include(line) if header: for c in self.header_contents(header): yield c else: std_header = AmalgamationHelper.is_unconditional_std_include(line) if std_header: self.all_std_includes.add(std_header) else: yield line @staticmethod def write_banner(fd): fd.write("""/* * Botan %s Amalgamation * (C) 1999-2018 The Botan Authors * * Botan is released under the Simplified BSD License (see license.txt) */ """ % (Version.as_string())) @staticmethod def _write_start_include_guard(fd, title): fd.write(""" #ifndef %s #define %s """ % (title, title)) @staticmethod def _write_end_include_guard(fd, title): fd.write("\n#endif // %s\n" % (title)) def write_to_file(self, filepath, include_guard): with open(filepath, 'w') as f: self.write_banner(f) self._write_start_include_guard(f, include_guard) f.write(self.header_includes) f.write(self.contents) self._write_end_include_guard(f, include_guard) class AmalgamationGenerator(object): filename_prefix = 'botan_all' _header_guard_pattern = re.compile('^#define BOTAN_.*_H_$') @staticmethod def strip_header_goop(header_name, header_lines): lines = copy.copy(header_lines) # defensive copy start_header_guard_index = None for index, line in enumerate(lines): if AmalgamationGenerator._header_guard_pattern.match(line): start_header_guard_index = index break if start_header_guard_index is None: raise InternalError("No header guard start found in " + header_name) end_header_guard_index = None for index, line in enumerate(lines): if line == '#endif\n': end_header_guard_index = index # override with last found if end_header_guard_index is None: raise InternalError("No header guard end found in " + header_name) lines = lines[start_header_guard_index+1 : end_header_guard_index] # Strip leading and trailing empty lines while lines[0].strip() == "": lines = lines[1:] while lines[-1].strip() == "": lines = lines[0:-1] return lines def __init__(self, build_paths, modules, options): self._build_paths = build_paths self._modules = modules self._options = options def _target_for_module(self, mod): target = '' if not self._options.single_amalgamation_file: if mod.need_isa != []: target = '_'.join(sorted(mod.need_isa)) if target == 'sse2' and self._options.arch == 'x86_64': target = '' # SSE2 is always available on x86-64 if self._options.arch == 'x86_32' and 'simd' in mod.requires: target = 'sse2' return target def _isas_for_target(self, target): for mod in sorted(self._modules, key=lambda module: module.basename): # Only first module for target is considered. Does this make sense? if self._target_for_module(mod) == target: out = set() for isa in mod.need_isa: if isa == 'aesni': isa = "aes,ssse3,pclmul" elif isa == 'rdrand': isa = 'rdrnd' out.add(isa) return out # Return set such that we can also iterate over result in the NA case return set() def _generate_headers(self): pub_header_amalag = AmalgamationHeader(self._build_paths.public_headers) header_name = '%s.h' % (AmalgamationGenerator.filename_prefix) logging.info('Writing amalgamation header to %s' % (header_name)) pub_header_amalag.write_to_file(header_name, "BOTAN_AMALGAMATION_H_") internal_headers = AmalgamationHeader(self._build_paths.internal_headers) header_int_name = '%s_internal.h' % (AmalgamationGenerator.filename_prefix) logging.info('Writing amalgamation header to %s' % (header_int_name)) internal_headers.write_to_file(header_int_name, "BOTAN_AMALGAMATION_INTERNAL_H_") header_files = [header_name, header_int_name] included_in_headers = pub_header_amalag.all_std_includes | internal_headers.all_std_includes return header_files, included_in_headers def _generate_sources(self, amalgamation_headers, included_in_headers): #pylint: disable=too-many-locals,too-many-branches encoding_kwords = {} if sys.version_info[0] == 3: encoding_kwords['encoding'] = 'utf8' # target to filepath map amalgamation_sources = {} for mod in self._modules: target = self._target_for_module(mod) amalgamation_sources[target] = '%s%s.cpp' % ( AmalgamationGenerator.filename_prefix, '_' + target if target else '') # file descriptors for all `amalgamation_sources` amalgamation_files = {} for target, filepath in amalgamation_sources.items(): logging.info('Writing amalgamation source to %s' % (filepath)) amalgamation_files[target] = open(filepath, 'w', **encoding_kwords) for target, f in amalgamation_files.items(): AmalgamationHeader.write_banner(f) f.write('\n') for header in amalgamation_headers: f.write('#include "%s"\n' % (header)) f.write('\n') for isa in self._isas_for_target(target): f.write('#if defined(__GNUG__) && !defined(__clang__)\n') f.write('#pragma GCC target ("%s")\n' % (isa)) f.write('#endif\n') # target to include header map unconditional_headers_written = {} for target, _ in amalgamation_sources.items(): unconditional_headers_written[target] = included_in_headers.copy() for mod in sorted(self._modules, key=lambda module: module.basename): tgt = self._target_for_module(mod) for src in sorted(mod.source): with open(src, 'r', **encoding_kwords) as f: for line in f: if AmalgamationHelper.is_botan_include(line): # Botan headers are inlined in amalgamation headers continue if AmalgamationHelper.is_any_include(line) in unconditional_headers_written[tgt]: # This include (conditional or unconditional) was unconditionally added before continue amalgamation_files[tgt].write(line) unconditional_header = AmalgamationHelper.is_unconditional_any_include(line) if unconditional_header: unconditional_headers_written[tgt].add(unconditional_header) for f in amalgamation_files.values(): f.close() return set(amalgamation_sources.values()) def generate(self): amalgamation_headers, included_in_headers = self._generate_headers() amalgamation_sources = self._generate_sources(amalgamation_headers, included_in_headers) return (sorted(amalgamation_sources), sorted(amalgamation_headers)) def have_program(program): """ Test for the existence of a program """ def exe_test(path, program): exe_file = os.path.join(path, program) if os.path.exists(exe_file) and os.access(exe_file, os.X_OK): logging.debug('Found program %s in %s' % (program, path)) return True else: return False exe_suffixes = ['', '.exe'] for path in os.environ['PATH'].split(os.pathsep): for suffix in exe_suffixes: if exe_test(path, program + suffix): return True logging.debug('Program %s not found' % (program)) return False class BotanConfigureLogHandler(logging.StreamHandler, object): def emit(self, record): # Do the default stuff first super(BotanConfigureLogHandler, self).emit(record) # Exit script if and ERROR or worse occurred if record.levelno >= logging.ERROR: sys.exit(1) def setup_logging(options): if options.verbose: log_level = logging.DEBUG elif options.quiet: log_level = logging.WARNING else: log_level = logging.INFO lh = BotanConfigureLogHandler(sys.stdout) lh.setFormatter(logging.Formatter('%(levelname) 7s: %(message)s')) logging.getLogger().addHandler(lh) logging.getLogger().setLevel(log_level) def load_info_files(search_dir, descr, filename_matcher, class_t): info = {} def filename_matches(filename): if isinstance(filename_matcher, str): return filename == filename_matcher else: return filename_matcher.match(filename) is not None for (dirpath, _, filenames) in os.walk(search_dir): for filename in filenames: filepath = os.path.join(dirpath, filename) if filename_matches(filename): info_obj = class_t(filepath) info[info_obj.basename] = info_obj if info: infotxt_basenames = ' '.join(sorted([key for key in info])) logging.debug('Loaded %d %s files: %s' % (len(info), descr, infotxt_basenames)) else: logging.warning('Failed to load any %s files' % (descr)) return info def load_build_data_info_files(source_paths, descr, subdir, class_t): matcher = re.compile(r'[_a-z0-9]+\.txt$') return load_info_files(os.path.join(source_paths.build_data_dir, subdir), descr, matcher, class_t) # Workaround for Windows systems where antivirus is enabled GH #353 def robust_rmtree(path, max_retries=5): for _ in range(max_retries): try: shutil.rmtree(path) return except OSError: time.sleep(0.1) # Final attempt, pass any exceptions up to caller. shutil.rmtree(path) # Workaround for Windows systems where antivirus is enabled GH #353 def robust_makedirs(directory, max_retries=5): for _ in range(max_retries): try: os.makedirs(directory) return except OSError as e: if e.errno == errno.EEXIST: raise else: time.sleep(0.1) # Final attempt, pass any exceptions up to caller. os.makedirs(directory) # This is for otions that have --with-XYZ and --without-XYZ. If user does not # set any of those, we choose a default here. # Mutates `options` def set_defaults_for_unset_options(options, info_arch, info_cc): # pylint: disable=too-many-branches if options.os is None: system_from_python = platform.system().lower() if re.match('^cygwin_.*', system_from_python): logging.debug("Converting '%s' to 'cygwin'", system_from_python) options.os = 'cygwin' else: options.os = system_from_python logging.info('Guessing target OS is %s (use --os to set)' % (options.os)) def deduce_compiler_type_from_cc_bin(cc_bin): if cc_bin.find('clang') != -1 or cc_bin in ['emcc', 'em++']: return 'clang' if cc_bin.find('-g++') != -1: return 'gcc' return None if options.compiler is None and options.compiler_binary != None: options.compiler = deduce_compiler_type_from_cc_bin(options.compiler_binary) if options.compiler is None: if options.os == 'windows': if have_program('g++') and not have_program('cl'): options.compiler = 'gcc' else: options.compiler = 'msvc' elif options.os in ['darwin', 'freebsd', 'ios']: if have_program('clang++'): options.compiler = 'clang' elif options.os == 'openbsd': if have_program('eg++'): info_cc['gcc'].binary_name = 'eg++' else: logging.warning('Default GCC is too old; install a newer one using \'pkg_add gcc\'') # The assembler shipping with OpenBSD 5.9 does not support avx2 del info_cc['gcc'].isa_flags['avx2'] options.compiler = 'gcc' else: options.compiler = 'gcc' logging.info('Guessing to use compiler %s (use --cc to set)' % (options.compiler)) if options.cpu is None: (options.arch, options.cpu) = guess_processor(info_arch) logging.info('Guessing target processor is a %s/%s (use --cpu to set)' % ( options.arch, options.cpu)) if options.with_documentation is True: if options.with_sphinx is None and have_program('sphinx-build'): logging.info('Found sphinx-build (use --without-sphinx to disable)') options.with_sphinx = True if options.with_rst2man is None and have_program('rst2man'): logging.info('Found rst2man (use --without-rst2man to disable)') options.with_rst2man = True # Mutates `options` def canonicalize_options(options, info_os, info_arch): # pylint: disable=too-many-branches if options.os not in info_os: def find_canonical_os_name(os_name_variant): for (canonical_os_name, os_info) in info_os.items(): if os_info.matches_name(os_name_variant): return canonical_os_name return os_name_variant # not found options.os = find_canonical_os_name(options.os) # canonical ARCH/CPU cpu_from_user = options.cpu results = canon_processor(info_arch, options.cpu) if results != None: (options.arch, options.cpu) = results logging.info('Canonicalized CPU target %s to %s/%s' % ( cpu_from_user, options.arch, options.cpu)) else: raise UserError('Unknown or unidentifiable processor "%s"' % (options.cpu)) shared_libs_supported = options.os in info_os and info_os[options.os].building_shared_supported() if not shared_libs_supported: if options.build_shared_lib is not None: logging.warning('Shared libs not supported on %s, disabling shared lib support' % (options.os)) options.build_shared_lib = False else: logging.info('Shared libs not supported on %s, disabling shared lib support' % (options.os)) if options.os == 'windows' and options.build_shared_lib is None and options.build_static_lib is None: options.build_shared_lib = True if options.with_stack_protector is None: if options.os in info_os: options.with_stack_protector = info_os[options.os].use_stack_protector if options.build_shared_lib is None: if options.os == 'windows' and options.build_static_lib: pass else: options.build_shared_lib = shared_libs_supported if options.build_static_lib is None: if options.os == 'windows' and options.build_shared_lib: pass else: options.build_static_lib = True # Set default fuzzing lib if options.build_fuzzers == 'libfuzzer' and options.fuzzer_lib is None: options.fuzzer_lib = 'Fuzzer' # Checks user options for consistency # This method DOES NOT change options on behalf of the user but explains # why the given configuration does not work. def validate_options(options, info_os, info_cc, available_module_policies): # pylint: disable=too-many-branches if options.single_amalgamation_file and not options.amalgamation: raise UserError("--single-amalgamation-file requires --amalgamation.") if options.os == "java": raise UserError("Jython detected: need --os and --cpu to set target") if options.os not in info_os: raise UserError('Unknown OS "%s"; available options: %s' % ( options.os, ' '.join(sorted(info_os.keys())))) if options.compiler not in info_cc: raise UserError('Unknown compiler "%s"; available options: %s' % ( options.compiler, ' '.join(sorted(info_cc.keys())))) if options.cc_min_version is not None and not re.match(r'^[0-9]+\.[0-9]+$', options.cc_min_version): raise UserError("--cc-min-version must have the format MAJOR.MINOR") if options.module_policy and options.module_policy not in available_module_policies: raise UserError("Unknown module set %s" % options.module_policy) if options.os == 'llvm' or options.cpu == 'llvm': if options.compiler != 'clang': raise UserError('LLVM target requires using Clang') if options.os != options.cpu: raise UserError('LLVM target requires both CPU and OS be set to llvm') if options.build_fuzzers != None: if options.build_fuzzers not in ['libfuzzer', 'afl', 'klee', 'test']: raise UserError('Bad value to --build-fuzzers') if options.build_fuzzers == 'klee' and options.os != 'llvm': raise UserError('Building for KLEE requires targeting LLVM') if options.build_static_lib is False and options.build_shared_lib is False: raise UserError('With both --disable-static-library and --disable-shared-library, nothing to do') if options.os == 'windows' and options.build_static_lib is True and options.build_shared_lib is True: raise UserError('On Windows only one of static lib and DLL can be selected') if options.with_documentation is False: if options.with_doxygen: raise UserError('Using --with-doxygen plus --without-documentation makes no sense') if options.with_sphinx: raise UserError('Using --with-sphinx plus --without-documentation makes no sense') if options.with_pdf: raise UserError('Using --with-pdf plus --without-documentation makes no sense') if options.with_pdf and not options.with_sphinx: raise UserError('Option --with-pdf requires --with-sphinx') if options.with_bakefile: if options.os != 'windows' or options.compiler != 'msvc' or options.build_shared_lib is False: raise UserError("Building via bakefile is only supported for MSVC DLL build") if options.arch not in ['x86_64', 'x86_32']: raise UserError("Bakefile only supports x86 targets") # Warnings if options.os == 'windows' and options.compiler != 'msvc': logging.warning('The windows target is oriented towards MSVC; maybe you want cygwin or mingw') def prepare_configure_build(info_modules, source_paths, options, cc, cc_min_version, arch, osinfo, module_policy): loaded_module_names = ModulesChooser(info_modules, module_policy, arch, cc, cc_min_version, options).choose() using_mods = [info_modules[modname] for modname in loaded_module_names] build_config = BuildPaths(source_paths, options, using_mods) build_config.public_headers.append(os.path.join(build_config.build_dir, 'build.h')) template_vars = create_template_vars(source_paths, build_config, options, using_mods, cc, arch, osinfo) return using_mods, build_config, template_vars def calculate_cc_min_version(options, ccinfo, source_paths): version_patterns = { 'msvc': r'^ *MSVC ([0-9]{2})([0-9]{2})$', 'gcc': r'^ *GCC ([0-9]+) ([0-9]+)$', 'clang': r'^ *CLANG ([0-9]+) ([0-9]+)$', 'xlc': r'^ *XLC (0x[0-9a-fA-F]{2})([0-9a-fA-F]{2})$' } if ccinfo.basename not in version_patterns: logging.info("No compiler version detection available for %s" % (ccinfo.basename)) return "0.0" detect_version_source = os.path.join(source_paths.build_data_dir, "detect_version.cpp") cc_bin = options.compiler_binary or ccinfo.binary_name cmd = cc_bin.split(' ') + ccinfo.preproc_flags.split(' ') + [detect_version_source] try: logging.debug("Running '%s'", ' '.join(cmd)) stdout, stderr = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True).communicate() cc_output = stdout + "\n" + stderr except OSError as e: logging.warning('Could not execute %s for version check: %s' % (cmd, e)) return "0.0" def cleanup_output(output): return ('\n'.join([l for l in output.splitlines() if l.startswith('#') is False])).strip() match = re.search(version_patterns[ccinfo.basename], cc_output, flags=re.MULTILINE) if match is None: logging.warning("Tried to get %s version, but output '%s' does not match expected version format" % ( ccinfo.basename, cleanup_output(cc_output))) return "0.0" cc_version = "%d.%d" % (int(match.group(1), 0), int(match.group(2), 0)) logging.info('Auto-detected compiler version %s' % (cc_version)) return cc_version def main_action_configure_build(info_modules, source_paths, options, cc, cc_min_version, arch, osinfo, module_policy): # pylint: disable=too-many-locals using_mods, build_config, template_vars = prepare_configure_build( info_modules, source_paths, options, cc, cc_min_version, arch, osinfo, module_policy) # Now we start writing to disk try: robust_rmtree(build_config.build_dir) except OSError as e: if e.errno != errno.ENOENT: logging.error('Problem while removing build dir: %s' % (e)) for build_dir in build_config.build_dirs(): try: robust_makedirs(build_dir) except OSError as e: if e.errno != errno.EEXIST: logging.error('Error while creating "%s": %s' % (build_dir, e)) def write_template(sink, template): with open(sink, 'w') as f: f.write(process_template(template, template_vars)) def in_build_dir(p): return os.path.join(build_config.build_dir, p) def in_build_data(p): return os.path.join(source_paths.build_data_dir, p) write_template(in_build_dir('build.h'), in_build_data('buildh.in')) write_template(in_build_dir('botan.doxy'), in_build_data('botan.doxy.in')) if 'botan_pkgconfig' in template_vars: write_template(template_vars['botan_pkgconfig'], in_build_data('botan.pc.in')) if options.os == 'windows': write_template(in_build_dir('botan.iss'), in_build_data('innosetup.in')) link_method = choose_link_method(options) def link_headers(headers, visibility, directory): logging.debug('Linking %d %s header files in %s' % (len(headers), visibility, directory)) for header_file in headers: try: portable_symlink(header_file, directory, link_method) except OSError as e: if e.errno != errno.EEXIST: raise UserError('Error linking %s into %s: %s' % (header_file, directory, e)) link_headers(build_config.public_headers, 'public', build_config.botan_include_dir) link_headers(build_config.internal_headers, 'internal', build_config.internal_include_dir) link_headers(build_config.external_headers, 'external', build_config.external_include_dir) if options.amalgamation: (amalg_cpp_files, amalg_headers) = AmalgamationGenerator(build_config, using_mods, options).generate() build_config.lib_sources = amalg_cpp_files template_vars['generated_files'] = ' '.join(amalg_cpp_files + amalg_headers) template_vars.update(generate_build_info(build_config, using_mods, cc, arch, osinfo)) with open(os.path.join(build_config.build_dir, 'build_config.json'), 'w') as f: json.dump(template_vars, f, sort_keys=True, indent=2) if options.with_cmake: logging.warning("CMake build is only for development: use make for production builds") cmake_template = os.path.join(source_paths.build_data_dir, 'cmake.in') write_template('CMakeLists.txt', cmake_template) elif options.with_bakefile: logging.warning("Bakefile build is only for development: use make for production builds") bakefile_template = os.path.join(source_paths.build_data_dir, 'bakefile.in') write_template('botan.bkl', bakefile_template) else: makefile_template = os.path.join(source_paths.build_data_dir, 'makefile.in') write_template(template_vars['makefile_path'], makefile_template) logging.info('Botan %s (revision %s) (%s %s) build setup is complete' % ( Version.as_string(), Version.vc_rev(), Version.release_type(), ('dated %d' % (Version.datestamp())) if Version.datestamp() != 0 else 'undated')) if options.unsafe_fuzzer_mode: logging.warning("The fuzzer mode flag is labeled unsafe for a reason, this version is for testing only") def main(argv): """ Main driver """ options = process_command_line(argv[1:]) setup_logging(options) source_paths = SourcePaths(os.path.dirname(argv[0])) info_modules = load_info_files(source_paths.lib_dir, 'Modules', "info.txt", ModuleInfo) if options.list_modules: for mod in sorted(info_modules.keys()): print(mod) return 0 logging.info('%s invoked with options "%s"' % (argv[0], ' '.join(argv[1:]))) logging.debug('Platform running configuration (autodetected): OS="%s" machine="%s" proc="%s"' % ( platform.system(), platform.machine(), platform.processor())) info_arch = load_build_data_info_files(source_paths, 'CPU info', 'arch', ArchInfo) info_os = load_build_data_info_files(source_paths, 'OS info', 'os', OsInfo) info_cc = load_build_data_info_files(source_paths, 'compiler info', 'cc', CompilerInfo) info_module_policies = load_build_data_info_files(source_paths, 'module policy', 'policy', ModulePolicyInfo) for mod in info_modules.values(): mod.cross_check(info_arch, info_os, info_cc) for policy in info_module_policies.values(): policy.cross_check(info_modules) logging.debug('Known CPU names: ' + ' '.join( sorted(flatten([[ainfo.basename] + \ ainfo.aliases + \ [x for (x, _) in ainfo.all_submodels()] for ainfo in info_arch.values()])))) set_defaults_for_unset_options(options, info_arch, info_cc) canonicalize_options(options, info_os, info_arch) validate_options(options, info_os, info_cc, info_module_policies) cc = info_cc[options.compiler] arch = info_arch[options.arch] osinfo = info_os[options.os] module_policy = info_module_policies[options.module_policy] if options.module_policy else None cc_min_version = options.cc_min_version or calculate_cc_min_version(options, cc, source_paths) logging.info('Target is %s:%s-%s-%s-%s' % ( options.compiler, cc_min_version, options.os, options.arch, options.cpu)) main_action_configure_build(info_modules, source_paths, options, cc, cc_min_version, arch, osinfo, module_policy) return 0 if __name__ == '__main__': try: sys.exit(main(argv=sys.argv)) except UserError as e: logging.debug(traceback.format_exc()) logging.error(e) except Exception as e: # pylint: disable=broad-except # error() will stop script, so wrap all information into one call logging.error("""%s An internal error occurred. Don't panic, this is probably not your fault! Please report the entire output at https://github.com/randombit/botan or email to the mailing list https://lists.randombit.net/mailman/listinfo/botan-devel You'll meet friendly people happy to help!""" % traceback.format_exc()) sys.exit(0) botan-2.4.0/doc/000077500000000000000000000000001322470703100133645ustar00rootroot00000000000000botan-2.4.0/doc/authors.txt000066400000000000000000000015321322470703100156130ustar00rootroot00000000000000Jack Lloyd Daniel Neus (Rohde & Schwarz Cybersecurity) Falko Strenzke (cryptosource GmbH) Juraj Somorovsky (Hackmanit GmbH) Matthias Gierlings (Hackmanit GmbH) René Korthaus (Rohde & Schwarz Cybersecurity) Simon Warta (Kullo GmbH) Peter J Jones Justin Karneges Vaclav Ovsik Matthew Gregan Matt Johnston Luca Piccarreta Yves Jerschow FlexSecure GmbH Technische Universitat Darmstadt Martin Doering Manuel Hartl Christoph Ludwig Patrick Sona Projet SECRET, INRIA, Rocquencourt Bhaskar Biswas and Nicolas Sendrier cryptosource GmbH Markus Wanner Joel Low Daniel Seither (Kullo GmbH) Matej Kenda (TopIT d.o.o.) Uri Blumenthal Simon Cogliani Christian Mainka (Hackmanit GmbH) Kai Michaelis (Rohde & Schwarz Cybersecurity) Philipp Weber (Rohde & Schwarz Cybersecurity) Tobias @neverhub Alexander Bluhm (genua GmbH) Philippe Lieser (Rohde & Schwarz Cybersecurity) botan-2.4.0/doc/contributing.rst000066400000000000000000000276461322470703100166440ustar00rootroot00000000000000 Source Code Layout ================================================= Under ``src`` there are directories * ``lib`` is the library itself, more on that below * ``cli`` is the command line application ``botan`` * ``tests`` contain what you would expect. Input files go under ``tests/data``. * ``build-data`` contains files read by the configure script. For example ``build-data/cc/gcc.txt`` describes various gcc options. * ``scripts`` contains misc scripts: install, distribution, various codegen things. Scripts controlling CI go under ``scripts/ci``. * ``configs`` contains configuration files for emacs, astyle, pylint, etc * ``python/botan2.py`` is the Python ctypes wrapper Library Layout ======================================== * ``base`` defines some high level types * ``utils`` contains various utility functions and types * ``codec`` has hex, base64 * ``block`` contains the block cipher implementations * ``modes`` contains block cipher modes (CBC, GCM, etc) * ``stream`` contains the stream ciphers * ``hash`` contains the hash function implementations * ``passhash`` contains password hashing algorithms for authentication * ``kdf`` contains the key derivation functions * ``mac`` contains the message authentication codes * ``pbkdf`` contains password hashing algorithms for key derivation * ``math`` is the math library for public key operations. It is divided into four parts: ``mp`` which are the low level algorithms; ``bigint`` which is a C++ wrapper around ``mp``; ``numbertheory`` which contains algorithms like primality testing and exponentiation; and ``ec_gfp`` which defines elliptic curves over prime fields. * ``pubkey`` contains the public key implementations * ``pk_pad`` contains padding schemes for public key algorithms * ``rng`` contains the random number generators * ``entropy`` has various entropy sources * ``asn1`` is the DER encoder/decoder * ``cert/x509`` is X.509 certificates, PKCS #10 requests, OCSP * ``tls`` contains the TLS implementation * ``filters`` is a filter/pipe API for data transforms * ``compression`` has the compression wrappers (zlib, bzip2, lzma) * ``ffi`` is the C99 API * ``prov`` contains bindings to external libraries like OpenSSL * ``misc`` contains odds and ends: format preserving encryption, SRP, threshold secret sharing, all or nothing transform, and others Sending patches ======================================== All contributions should be submitted as pull requests via GitHub (https://github.com/randombit/botan). If you are planning a large change email the mailing list or open a discussion ticket on github before starting out to make sure you are on the right path. And once you have something written, free to open a [WIP] PR for early review and comment. If possible please sign your git commits using a PGP key. See https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work for instructions on how to set this up. Depending on what your change is, your PR should probably also include an update to ``news.rst`` with a note explaining the change. If your change is a simple bug fix, a one sentence description is perhaps sufficient. If there is an existing ticket on GitHub with discussion or other information, reference it in your change note as 'GH #000'. Update ``doc/credits.txt`` with your information so people know what you did! If you are interested in contributing but don't know where to start check out ``doc/todo.rst`` for some ideas - these are changes we would almost certainly accept once they've passed code review. Also, try building and testing it on whatever hardware you have handy, especially non-x86 platforms, or especially C++11 compilers other than the regularly tested GCC, Clang, and Visual Studio compilers. Git Usage ======================================== Do *NOT* merge ``master`` into your topic branch, this creates needless commits and noise in history. Instead, as needed, rebase your branch against master (``git rebase -i master``) and force push the branch to update the PR. If the GitHub PR page does not report any merge conflicts and nobody asks you to rebase, you don't need to rebase. Try to keep your history clean and use rebase to squash your commits as needed. If your diff is less than roughly 100 lines, it should probably be a single commit. Only split commits as needed to help with review/understanding of the change. Python ======================================== Scripts should be in Python whenever possible. For configure.py (and helper scripts install.py, cleanup.py and build_docs.py) the target is stock (no modules outside the standard library) CPython 2.7 plus latest CPython 3.x. Support for CPython 2.6, PyPy, etc is great when viable (in the sense of not causing problems for 2.7 or 3.x, and not requiring huge blocks of version dependent code). As running this program succesfully is required for a working build, making it as portable as possible is considered key. The python wrapper botan2.py targets CPython 2.7, 3.x, and latest PyPy. Note that a single file is used to avoid dealing with any of Python's various crazy module distribution issues. For random scripts not typically run by an end-user (codegen, visualization, and so on) there isn't any need to worry about 2.6 and even just running under Python2 xor Python3 is acceptable if needed. Here it's fine to depend on any useful modules such as graphviz or matplotlib, regardless if it is available from a stock CPython install. Build Tools and Hints ======================================== If you don't already use it for all your C/C++ development, install ``ccache`` now and configure a large cache on a fast disk. It allows for very quick rebuilds by caching the compiler output. Use ``--with-sanitizers`` to enable ASan. UBSan has to be added separately with ``--cc-abi-flags`` at the moment as GCC 4.8 does not have UBSan. Copyright Notice ======================================== At the top of any new file add a comment with a copyright and a reference to the license, for example:: /* * (C) 2015,2016 Copyright Holder * Botan is released under the Simplified BSD License (see license.txt) */ If you are making a substantial or non-trivial change to an existing file, add or update your own copyright statement at the top of the file. If you are making a change in a new year not covered by your existing statement, add the year. Even if the years you are making the change are consecutive, avoid year ranges: specify each year separated by a comma. Style Conventions ======================================== When writing your code remember the need for it to be easily understood by reviewers and auditors, both at the time of the patch submission and in the future. Avoid complicated template metaprogramming where possible. It has its places but should be used judiciously. When designing a new API (for use either by library users or just internally) try writing out the calling code first. That is, write out some code calling your idealized API, then just implement that API. This can often help avoid cut-and-paste by creating the correct abstractions needed to solve the problem at hand. The C++11 ``auto`` keyword is very convenient but only use it when the type truly is obvious (considering also the potential for unexpected integer conversions and the like, such as an apparent uint8_t being promoted to an int). If a variable is defined and not modified, declare it ``const``. Some exception for very short-lived variables, but generally speaking being able to read the declaration and know it will not be modified is useful. Use ``override`` annotations whenever overriding a virtual function. If introducing a new type that is not intended for derivation, mark it ``final``. Avoid explicit ``delete`` - use RAII. Use ``m_`` prefix on all member variables. For formatting, there are configs for emacs and astyle in ``src/configs``. No tabs, and remove trailing whitespace. Prefer using braces on both sides of if/else blocks, even if only using a single statement. The current code doesn't always do this. Avoid ``using namespace`` declarations, even inside of single functions. One allowed exception is ``using namespace std::placeholders`` in functions which use ``std::bind``. (But, don't use ``std::bind`` - use a lambda instead). Use ``::`` to explicitly refer to the global namespace (eg, when calling an OS or external library function like ``::select`` or ``::sqlite3_open``). Use of External Dependencies ======================================== Compiler Dependencies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The library should always be as functional as possible when compiled with just C++11. However, feel free to use the C++11 language. Little mercy is given to sub-par C++11 compilers that don't actually implement the language (some temporary concessions are made for MSVC 2013). Use of compiler extensions is fine whenever appropriate; this is typically restricted to a single file or an internal header. Compiler extensions used currently include native uint128_t, SIMD intrinsics, inline asm syntax and so on, so there are some existing examples of appropriate use. Generally intrinsics or inline asm is preferred over bare assembly to avoid calling convention issues among different platforms; the improvement in maintainability is seen as worth any potentially performance tradeoff. One risk with intrinsics is that the compiler might rewrite your clever const-time SIMD into something with a conditional jump, but code intended to be const-time should in any case be annotated so it can be checked at runtime with tools. Operating System Dependencies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you're adding a small OS dependency in some larger piece of code, try to contain the actual non-portable operations to utils/os_utils.* and then call them from there. Old and obsolete systems are supported where convenient but generally speaking SunOS 5, IRIX 9, Windows 2000 and company are not secure platforms to build anything on so no special contortions are necessary. Patches that complicate the code in order to support any OS not supported by its vendor will likely be rejected. In writing OS specific code, feel free to assume roughly POSIX 2008, or for Windows Vista/2008 Server (the oldest versions still supported by Microsoft). Library Dependencies ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Any external library dependency - even optional ones - is met with as one PR submitter put it "great skepticism". At every API boundary there is potential for confusion that does not exist when the call stack is all contained within the boundary. So the additional API really needs to pull its weight. For example a simple text parser or such which can be trivially implemented is not really for consideration. As a rough idea of the bar, equate the viewed cost of an external dependency as at least 1000 additional lines of code in the library. That is, if the library really does need this functionality, and it can be done in the library for less than that, then it makes sense to just write the code. Yup. Given the entire library is (accoriding to SLOCcount) 62K lines of code, that may give some estimate of the bar - you can do pretty much anything in 1000 lines of well written C++11 (the implementations of *all* of the message authentication codes is much less than 1K SLOC). Current the (optional) external dependencies of the library are OpenSSL (for access to fast and side channel hardened RSA, ECDSA, AES), zlib, bzip2, lzma, sqlite3, Trousers (TPM integration), plus various operating system utilities like basic filesystem operations. These provide major pieces of functionality which seem worth the trouble of maintaining an integration with. Examples of other external dependencies that would be appropriate include integration with system crypto (PKCS #11, TPM, CommonCrypto, CryptoAPI algorithms), potentially a parallelism framework such as Cilk (as part of a larger design for parallel message processing, say), or hypothentically use of a safe ASN.1 parser (that is, one written in a safe language like Rust or OCaml providing a C API). botan-2.4.0/doc/credits.rst000066400000000000000000000066751322470703100155710ustar00rootroot00000000000000 Credits ======================================== This is at least a partial credits-file of people that have contributed to botan. It is sorted by name and formatted to allow easy grepping and beautification by scripts. The fields are name (N), email (E), web-address (W), PGP key ID and fingerprint (P), description (D), snail-mail address (S), and Bitcoin address (B). :: N: Alexander Bluhm W: https://www.genua.de/ P: 1E3B BEA4 6C20 EA00 2FFC DE4D C5F4 83AD DEE8 6380 D: improve support for OpenBSD S: Kirchheim, Germany N: Charles Brockman W: http://www.securitygenetics.com/ D: documentation editing S: Oregon, USA N: Simon Cogliani E: simon.cogliani@tanker.io W: https://www.tanker.io/ P: EA73 D0AF 5A81 A61A 8931 C2CA C9AB F2E4 3820 4F25 D: Getting keystream of ChaCha S: Paris, France N: Martin Doering E: doering@cdc.informatik.tu-darmstadt.de D: GF(p) arithmetic N: Olivier de Gaalon D: SQLite encryption codec (src/contrib/sqlite) N: Matthias Gierlings E: matthias.gierlings@hackmanit.de W: https://www.hackmanit.de/ P: 39E0 D270 19A4 B356 05D0 29AE 1BD3 49CF 744A 02FF D: GMAC, Extended Hash-Based Signatures (XMSS) S: Bochum, Germany N: Matthew Gregan D: Binary file I/O support, allocator fixes N: Hany Greiss D: Windows porting N: Manuel Hartl E: hartl@flexsecure.de W: http://www.flexsecure.de/ D: ECDSA, ECDH N: Yves Jerschow E: yves.jerschow@uni-duesseldorf.de D: Optimizations for memory load/store and HMAC D: Support for IPv4 addresses in X.509 alternative names S: Germany N: Matt Johnston D: Allocator fixes and optimizations, decompressor fixes N: Peter J. Jones E: pjones@pmade.org D: Bzip2 compression module S: Colorado, USA N: Justin Karneges D: Qt support modules (mutexes and types), X.509 API design N: Vojtech Kral E: vojtech@kral.hk D: LZMA compression module S: Czech Republic N: Matej Kenda E: matej.kenda@topit.si D: Locking in Algo_Registry for Windows OS S: Slovenia N: René Korthaus E: r.korthaus@sirrix.com W: https://www.sirrix.com P: C196 FF9D 3DDC A5E7 F98C E745 9AD0 F9FA 587E 74D6 D: CI, ECGDSA, ECKCDSA S: Bochum, Germany N: Adam Langley E: agl@imperialviolet.org D: Curve25519 N: Jack Lloyd E: jack@randombit.net W: https://www.randombit.net/ P: 3F69 2E64 6D92 3BBE E7AE 9258 5C0F 96E8 4EC1 6D6B B: 1DwxWb2J4vuX4vjsbzaCXW696rZfeamahz D: Original designer/author, maintainer 2001-current S: Vermont, USA N: Joel Low D: DLL symbol visibility and Windows DLL support in general D: Threaded_Fork N: Christoph Ludwig E: ludwig@fh-worms.de D: GP(p) arithmetic N: Vaclav Ovsik E: vaclav.ovsik@i.cz D: Perl XS module (src/contrib/perl-xs) N: Luca Piccarreta E: luca.piccarreta@gmail.com D: x86/amd64 assembler, BigInt optimizations, Win32 mutex module S: Italy N: Daniel Seither E: post@tiwoc.de D: iOS support, improved Android support, improved MSVC support N: Falko Strenzke E: fstrenzke@cryptosource.de W: http://www.cryptosource.de D: McEliece, GF(p) arithmetic, CVC, Shanks-Tonelli algorithm S: Darmstadt, Germany N: Simon Warta E: simon@kullo.net W: https://www.kullo.net D: Build system S: Germany N: Philipp Weber E: p.weber@sirrix.com W: https://sirrix.com/ D: KDF1-18033, ECIES S: Saarland, Germany N: Daniel Neus E: d.neus@sirrix.com W: https://sirrix.com/ D: CI, PKCS#11, RdSeed, BSI module policy S: Bochum, Germany botan-2.4.0/doc/manual/000077500000000000000000000000001322470703100146415ustar00rootroot00000000000000botan-2.4.0/doc/manual/abi.rst000066400000000000000000000014711322470703100161310ustar00rootroot00000000000000 ABI Stability ==================== Botan uses semantic versioning for the API; if API features are added the minor version increases, whereas if API compatability breaks occur the major version is increased. However no guarantees about ABI are made between releases. Maintaining an ABI compatible release in a complex C++ API is exceedingly expensive in development time; just adding a single member variable or virtual function is enough to cause ABI issues. If ABI changes, the soname revision will increase to prevent applications from linking against a potentially incompatible version at runtime. If you are concerned about long-term ABI issues, considering using the C API instead; this subset *is* ABI stable. You can review a report on ABI changes to Botan at https://abi-laboratory.pro/tracker/timeline/botan/ botan-2.4.0/doc/manual/bigint.rst000066400000000000000000000103161322470703100166500ustar00rootroot00000000000000BigInt ======================================== ``BigInt`` is Botan's implementation of a multiple-precision integer. Thanks to C++'s operator overloading features, using ``BigInt`` is often quite similar to using a native integer type. The number of functions related to ``BigInt`` is quite large. You can find most of them in ``botan/bigint.h`` and ``botan/numthry.h``. Encoding Functions ---------------------------------------- These transform the normal representation of a ``BigInt`` into some other form, such as a decimal string: .. cpp:function:: secure_vector BigInt::encode(const BigInt& n, Encoding enc = Binary) This function encodes the BigInt n into a memory vector. ``Encoding`` is an enum that has values ``Binary``, ``Decimal``, and ``Hexadecimal``. .. cpp:function:: BigInt BigInt::decode(const std::vector& vec, Encoding enc) Decode the integer from ``vec`` using the encoding specified. These functions are static member functions, so they would be called like this:: BigInt n1 = ...; // some number secure_vector n1_encoded = BigInt::encode(n1); BigInt n2 = BigInt::decode(n1_encoded); assert(n1 == n2); There are also C++-style I/O operators defined for use with ``BigInt``. The input operator understands negative numbers and hexadecimal numbers (marked with a leading "0x"). The '-' must come before the "0x" marker. The output operator will never adorn the output; for example, when printing a hexadecimal number, there will not be a leading "0x" (though a leading '-' will be printed if the number is negative). If you want such things, you'll have to do them yourself. ``BigInt`` has constructors that can create a ``BigInt`` from an unsigned integer or a string. You can also decode an array (a ``byte`` pointer plus a length) into a ``BigInt`` using a constructor. Number Theory ---------------------------------------- Number theoretic functions available include: .. cpp:function:: BigInt gcd(BigInt x, BigInt y) Returns the greatest common divisor of x and y .. cpp:function:: BigInt lcm(BigInt x, BigInt y) Returns an integer z which is the smallest integer such that z % x == 0 and z % y == 0 .. cpp:function:: BigInt inverse_mod(BigInt x, BigInt m) Returns the modular inverse of x modulo m, that is, an integer y such that (x*y) % m == 1. If no such y exists, returns zero. .. cpp:function:: BigInt power_mod(BigInt b, BigInt x, BigInt m) Returns b to the xth power modulo m. If you are doing many exponentiations with a single fixed modulus, it is faster to use a ``Power_Mod`` implementation. .. cpp:function:: BigInt ressol(BigInt x, BigInt p) Returns the square root modulo a prime, that is, returns a number y such that (y*y) % p == x. Returns -1 if no such integer exists. .. cpp:function:: bool is_prime(BigInt n, RandomNumberGenerator& rng, \ size_t prob = 56, double is_random = false) Test *n* for primality using a probablistic algorithm (Miller-Rabin). With this algorithm, there is some non-zero probability that true will be returned even if *n* is actually composite. Modifying *prob* allows you to decrease the chance of such a false positive, at the cost of increased runtime. Sufficient tests will be run such that the chance *n* is composite is no more than 1 in 2\ :sup:`prob`. Set *is_random* to true if (and only if) *n* was randomly chosen (ie, there is no danger it was chosen maliciously) as far fewer tests are needed in that case. .. cpp:function:: bool quick_check_prime(BigInt n, RandomNumberGenerator& rng) .. cpp:function:: bool check_prime(BigInt n, RandomNumberGenerator& rng) .. cpp:function:: bool verify_prime(BigInt n, RandomNumberGenerator& rng) Three variations on *is_prime*, with probabilities set to 32, 56, and 80 respectively. .. cpp:function:: BigInt random_prime(RandomNumberGenerator& rng, \ size_t bits, \ BigInt coprime = 1, \ size_t equiv = 1, \ size_t equiv_mod = 2) Return a random prime number of ``bits`` bits long that is relatively prime to ``coprime``, and equivalent to ``equiv`` modulo ``equiv_mod``. botan-2.4.0/doc/manual/block_cipher.rst000066400000000000000000000257131322470703100200270ustar00rootroot00000000000000Block Ciphers ======================= Block ciphers are a n-bit permutation for some small n, typically 64 or 128 bits. They are a cryptographic primitive used to generate higher level operations such as authenticated encryption. .. note:: In general a bare block cipher is not what you should be using. You probably want a cipher mode instead (see :ref:`cipher_modes`) .. cpp:class:: BlockCipher .. cpp:function:: static std::unique_ptr create(const std::string& algo_spec, \ const std::string& provider = "") Create a new block cipher object, or else return null. .. cpp:function:: static std::unique_ptr create_or_throw(const std::string& algo_spec, \ const std::string& provider = "") Like ``create``, except instead of returning null an exception is thrown if the cipher is not known. .. cpp:function:: void set_key(const uint8_t* key, size_t length) This sets the key to the value specified. Most algorithms only accept keys of certain lengths. If you attempt to call ``set_key`` with a key length that is not supported, the exception ``Invalid_Key_Length`` will be thrown. In all cases, ``set_key`` must be called on an object before any data processing (encryption, decryption, etc) is done by that object. If this is not done, an exception will be thrown. thrown. .. cpp:function:: bool valid_keylength(size_t length) const This function returns true if and only if *length* is a valid keylength for this algorithm. .. cpp:function:: size_t minimum_keylength() const Return the smallest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: size_t maximum_keylength() const Return the largest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: std::string name() const Return a human readable name for this algorithm. This is guaranteed to round-trip with ``create`` and ``create_or_throw`` calls, ie create("Foo")->name() == "Foo" .. cpp:function:: void clear() Zero out the key. The key must be reset before the cipher object can be used. .. cpp:function:: BlockCipher* clone() const Return a newly allocated BlockCipher object of the same type as this one. .. cpp:function:: size_t block_size() const Return the size (in *bytes*) of the cipher. .. cpp:function:: size_t parallelism() const Return the parallelism underlying this implementation of the cipher. This value can vary across versions and machines. A return value of N means that encrypting or decrypting with N blocks can operate in parallel. .. cpp:function:: size_t parallel_bytes() const Returns ``parallelism`` multiplied by the block size as well as a small fudge factor. That's because even ciphers that have no implicit parallism typically see a small speedup for being called with several blocks due to caching effects. .. cpp:function:: std::string provider() const Return the provider type. Default value is "base" but can be any arbitrary string. Other example values are "sse2", "avx2", "openssl". .. cpp:function:: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const Encrypt *blocks* blocks of data, taking the input from the array *in* and placing the ciphertext into *out*. The two pointers may be identical, but should not overlap ranges. .. cpp:function:: void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const Decrypt *blocks* blocks of data, taking the input from the array *in* and placing the plaintext into *out*. The two pointers may be identical, but should not overlap ranges. .. cpp:function:: void encrypt(const uint8_t in[], uint8_t out[]) const Encrypt a single block. Equivalent to :cpp:func:`encrypt_n`\ (in, out, 1). .. cpp:function:: void encrypt(uint8_t block[]) const Encrypt a single block. Equivalent to :cpp:func:`encrypt_n`\ (block, block, 1) .. cpp:function:: void decrypt(const uint8_t in[], uint8_t out[]) const Decrypt a single block. Equivalent to :cpp:func:`decrypt_n`\ (in, out, 1) .. cpp:function:: void decrypt(uint8_t block[]) const Decrypt a single block. Equivalent to :cpp:func:`decrypt_n`\ (block, block, 1) .. cpp:function:: template void encrypt(std::vector& block) const Assumes ``block`` is of a multiple of the block size. .. cpp:function:: template void decrypt(std::vector& block) const Assumes ``block`` is of a multiple of the block size. Code Example ----------------- For sheer demonstrative purposes, the following code encrypts a provided single block of plaintext with AES-256 using two different keys. .. code-block:: cpp #include #include #include int main () { std::vector key = Botan::hex_decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); std::vector block = Botan::hex_decode("00112233445566778899AABBCCDDEEFF"); std::unique_ptr cipher(Botan::BlockCipher::create("AES-256")); cipher->set_key(key); cipher->encrypt(block); std::cout << std::endl <name() << "single block encrypt: " << Botan::hex_encode(block); //clear cipher for 2nd encryption with other key cipher->clear(); key = Botan::hex_decode("1337133713371337133713371337133713371337133713371337133713371337"); cipher->set_key(key); cipher->encrypt(block); std::cout << std::endl << cipher->name() << "single block encrypt: " << Botan::hex_encode(block); return 0; } Available Ciphers --------------------- Botan includes a number of block ciphers that are specific to particular countries, as well as a few that are included mostly due to their use in specific protocols such as PGP but not widely used elsewhere. The ciphers that seem best for new code are AES, Serpent, and Threefish-512. Avoid any 64-bit cipher in new code. There are combinatoric issues that affect any 64-bit cipher that render it insecure when large amounts of data are processed. AES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comes in three variants, AES-128, AES-192, and AES-256. The standard 128-bit block cipher. Many modern platforms offer hardware acceleration. However, on platforms without hardware support, AES implementations typically are vulnerable to side channel attacks. If you are developing new code and have no particular opinion, pick AES. Available if ``BOTAN_HAS_AES`` is defined. ARIA ~~~~~~ South Korean cipher used in industry there. No reason to use it otherwise. Available if ``BOTAN_HAS_ARIA`` is defined. Blowfish ~~~~~~~~~ A 64-bit cipher popular in the pre-AES era. Very slow key setup. Also used (with bcrypt) for password hashing. Available if ``BOTAN_HAS_BLOWFISH`` is defined. CAST-128 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 64-bit cipher, commonly used in OpenPGP. Available if ``BOTAN_HAS_CAST128`` is defined. CAST-256 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 128-bit cipher that was a contestent in the NIST AES competition. Rarely used, and now deprecated in Botan. Use AES or Serpent instead. Available if ``BOTAN_HAS_CAST256`` is defined. Camellia ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Comes in three variants, Camellia-128, Camellia-192, and Camellia-256. A Japanese design standardized by ISO, NESSIE and CRYPTREC. Somewhat common. Prefer AES or Serpent in new designs. Available if ``BOTAN_HAS_CAMELLIA`` is defined. Cascade ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Creates a block cipher cascade, where each block is encrypted by two ciphers with independent keys. Useful if you're very paranoid. In practice any single good cipher (such as Serpent, SHACAL2, or AES-256) is more than sufficient. Available if ``BOTAN_HAS_CASCADE`` is defined. DES, 3DES, DESX ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Originally designed by IBM and NSA in the 1970s. Very slow, but still common in some industries such as finance. Avoid in new code. Available if ``BOTAN_HAS_DES`` is defined. GOST-28147-89 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A old 64-bit Russian cipher. Possible security issues. Avoid unless compatability is needed. Available if ``BOTAN_HAS_GOST_28147_89`` is defined. IDEA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An older but still unbroken 64-bit cipher with a 128-bit key. Somewhat common due to its use in PGP. Avoid in new designs. Available if ``BOTAN_HAS_IDEA`` is defined. Kasumi ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 64-bit cipher used in 3GPP mobile phone protocols. There is no reason to use it outside of this context. Available if ``BOTAN_HAS_KASUMI`` is defined. Lion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A "block cipher construction" which can encrypt blocks of nearly arbitrary length. Built from a stream cipher and a hash function. Useful in certain protocols where being able to encrypt large or arbitrary length blocks is necessary. Available if ``BOTAN_HAS_LION`` is defined. MISTY1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 64-bit Japanese cipher standardized by NESSIE and ISO. Seemingly secure, but quite slow and saw little adoption. No reason to use it in new code. The implementation in Botan is deprecated, and it is likely to be removed in a future release. Available if ``BOTAN_HAS_MISTY1`` is defined. Noekeon ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A fast 128-bit cipher by the designers of AES. Easily secured against side channels. Available if ``BOTAN_HAS_NOEKEON`` is defined. SEED ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A older South Korean cipher, widely used in industry there. Available if ``BOTAN_HAS_SEED`` is defined. SHACAL2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The 256-bit block cipher used inside SHA-256. Accepts up to a 512-bit key. Fast and seemingly very secure, but obscure. Standardized by NESSIE. Available if ``BOTAN_HAS_SHACAL2`` is defined. SM4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 128-bit Chinese national cipher, required for use in certain commercial applications in China. Quite slow. Probably no reason to use it outside of legal requirements. Available if ``BOTAN_HAS_SM4`` is defined. Serpent ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An AES contender. Widely considered the most conservative design. Fairly slow, especially if no SIMD instruction set is available. Available if ``BOTAN_HAS_SERPENT`` is defined. Threefish-512 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 512-bit tweakable block cipher that was used in the Skein hash function. Very fast on 64-bit processors. Available if ``BOTAN_HAS_THREEFISH_512`` is defined. Twofish ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ An AES contender. Somewhat complicated key setup and a "kitchen sink" design. Available if ``BOTAN_HAS_TWOFISH`` is defined. XTEA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 64-bit cipher popular for its simple implementation. Avoid in new code. Available if ``BOTAN_HAS_XTEA`` is defined. botan-2.4.0/doc/manual/building.rst000066400000000000000000000445131322470703100171770ustar00rootroot00000000000000Building The Library ================================= This document describes how to build Botan on Unix/POSIX and Windows systems. The POSIX oriented descriptions should apply to most common Unix systems (including OS X), along with POSIX-ish systems like BeOS, QNX, and Plan 9. Currently, systems other than Windows and POSIX (such as VMS, MacOS 9, OS/390, OS/400, ...) are not supported by the build system, primarily due to lack of access. Please contact the maintainer if you would like to build Botan on such a system. Botan's build is controlled by configure.py, which is a `Python `_ script. Python 2.6 or later is required. .. highlight:: none For the impatient, this works for most systems:: $ ./configure.py [--prefix=/some/directory] $ make $ make install Or using ``nmake``, if you're compiling on Windows with Visual C++. On platforms that do not understand the '#!' convention for beginning script files, or that have Python installed in an unusual spot, you might need to prefix the ``configure.py`` command with ``python`` or ``/path/to/python``:: $ python ./configure.py [arguments] Configuring the Build --------------------------------- The first step is to run ``configure.py``, which is a Python script that creates various directories, config files, and a Makefile for building everything. This script should run under a vanilla install of Python 2.6, 2.7, or 3.x. The script will attempt to guess what kind of system you are trying to compile for (and will print messages telling you what it guessed). You can override this process by passing the options ``--cc``, ``--os``, and ``--cpu``. You can pass basically anything reasonable with ``--cpu``: the script knows about a large number of different architectures, their sub-models, and common aliases for them. You should only select the 64-bit version of a CPU (such as "sparc64" or "mips64") if your operating system knows how to handle 64-bit object code - a 32-bit kernel on a 64-bit CPU will generally not like 64-bit code. By default the script tries to figure out what will work on your system, and use that. It will print a display at the end showing which algorithms have and have not been enabled. For instance on one system we might see lines like:: INFO: Skipping, dependency failure - sessions_sqlite3 INFO: Skipping, incompatible CPU - mp_x86_32 simd_altivec INFO: Skipping, incompatible OS - beos_stats cryptoapi_rng darwin_secrandom win32_stats INFO: Skipping, incompatible compiler - mp_x86_32_msvc INFO: Skipping, loaded only if needed by dependency - dyn_load mp_generic simd_scalar INFO: Skipping, requires external dependency - boost bzip2 lzma sqlite3 tpm The ones that are skipped because they are require an external dependency have to be explicitly asked for, because they rely on third party libraries which your system might not have or that you might not want the resulting binary to depend on. For instance to enable zlib support, add ``--with-zlib`` to your invocation of ``configure.py``. All available modules can be listed with ``--list-modules``. You can control which algorithms and modules are built using the options ``--enable-modules=MODS`` and ``--disable-modules=MODS``, for instance ``--enable-modules=zlib`` and ``--disable-modules=rc5,idea``. Modules not listed on the command line will simply be loaded if needed or if configured to load by default. If you use ``--minimized-build``, only the most core modules will be included; you can then explicitly enable things that you want to use with ``--enable-modules``. This is useful for creating a minimal build targeting to a specific application, especially in conjunction with the amalgamation option; see :ref:`amalgamation`. For instance:: $ ./configure.py --minimized-build --enable-modules=rsa,eme_oaep,emsa_pssr will set up a build that only includes RSA, OAEP, PSS along with any required dependencies. A small subset of core features, including AES, SHA-2, HMAC, and the multiple precision integer library, are always loaded. Note that a minimized build does not include any random number generator, which is needed for example to generate keys, nonces and IVs. See :doc:`rng` on which random number generators are available. The option ``--module-policy=POL`` enables modules required by and disables modules prohibited by a text policy in ``src/build-data/policy``. Additional modules can be enabled if not prohibited by the policy. Currently available policies include ``bsi``, ``nist`` and ``modern``:: $ ./configure.py --module-policy=bsi --enable-modules=tls,xts Cross Compiling ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cross compiling refers to building software on one type of host (say Linux x86-64) but creating a binary for some other type (say MinGW x86-32). This is completely supported by the build system. To extend the example, we must tell `configure.py` to use the MinGW tools: $ ./configure.py --os=mingw --cpu=x86_32 --cc-bin=i686-w64-mingw32-g++ --ar=i686-w64-mingw32-ar ... $ make ... $ file botan.exe botan.exe: PE32 executable (console) Intel 80386, for MS Windows You can also specify the alternate tools by setting the `CXX` and `AR` environment variables (instead of the `--cc-bin` and `--ar-command` options), as is commonly done with autoconf builds. On Unix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The basic build procedure on Unix and Unix-like systems is:: $ ./configure.py [--enable-modules=] [--cc=CC] $ make $ ./botan-test If that fails with an error about not being able to find libbotan.so, you may need to set ``LD_LIBRARY_PATH``:: $ LD_LIBRARY_PATH=. ./botan-test If the tests look OK, install:: $ make install On Unix systems the script will default to using GCC; use ``--cc`` if you want something else. For instance use ``--cc=icc`` for Intel C++ and ``--cc=clang`` for Clang. The ``make install`` target has a default directory in which it will install Botan (typically ``/usr/local``). You can override this by using the ``--prefix`` argument to ``configure.py``, like so:: $ ./configure.py --prefix=/opt On some systems shared libraries might not be immediately visible to the runtime linker. For example, on Linux you may have to edit ``/etc/ld.so.conf`` and run ``ldconfig`` (as root) in order for new shared libraries to be picked up by the linker. An alternative is to set your ``LD_LIBRARY_PATH`` shell variable to include the directory that the Botan libraries were installed into. On macOS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A build on macOS works much like that on any other Unix-like system. To build a universal binary for macOS, you need to set some additional build flags. Do this with the `configure.py` flag `--cc-abi-flags`:: --cc-abi-flags="-force_cpusubtype_ALL -mmacosx-version-min=10.4 -arch i386 -arch ppc" On Windows ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: The earliest versions of Windows supported are Windows 7 and Windows 2008 R2 You need to have a copy of Python installed, and have both Python and your chosen compiler in your path. Open a command shell (or the SDK shell), and run:: $ python configure.py --cc=msvc --os=windows $ nmake $ botan-test.exe $ nmake install Botan supports the nmake replacement `Jom `_ which enables you to run multiple build jobs in parallel. For MinGW, use:: $ python configure.py --cc=gcc --os=mingw $ make By default the install target will be ``C:\botan``; you can modify this with the ``--prefix`` option. When building your applications, all you have to do is tell the compiler to look for both include files and library files in ``C:\botan``, and it will find both. Or you can move them to a place where they will be in the default compiler search paths (consult your documentation and/or local expert for details). For iOS using XCode ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For iOS, you typically build for 3 architectures: armv7 (32 bit, older iOS devices), armv8-a (64 bit, recent iOS devices) and x86_64 for the iPhone simulator. You can build for these 3 architectures and then create a universal binary containing code for all of these architectures, so you can link to Botan for the simulator as well as for an iOS device. To cross compile for armv7, configure and make with:: $ ./configure.py --os=ios --prefix="iphone-32" --cpu=armv7 --cc=clang \ --cc-abi-flags="-arch armv7" xcrun --sdk iphoneos make install To cross compile for armv8-a, configure and make with:: $ ./configure.py --os=ios --prefix="iphone-64" --cpu=armv8-a --cc=clang \ --cc-abi-flags="-arch arm64" xcrun --sdk iphoneos make install To compile for the iPhone Simulator, configure and make with:: $ ./configure.py --os=ios --prefix="iphone-simulator" --cpu=x86_64 --cc=clang \ --cc-abi-flags="-arch x86_64" xcrun --sdk iphonesimulator make install Now create the universal binary and confirm the library is compiled for all three architectures:: $ xcrun --sdk iphoneos lipo -create -output libbotan-2.a \ iphone-32/lib/libbotan-2.a \ iphone-64/lib/libbotan-2.a \ iphone-simulator/lib/libbotan-2.a $ xcrun --sdk iphoneos lipo -info libbotan-2.a Architectures in the fat file: libbotan-2.a are: armv7 x86_64 armv64 The resulting static library can be linked to your app in Xcode. For Android ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Instructions for building the library on Android can be found `here `_. Other Build-Related Tasks ---------------------------------------- .. _building_docs: Building The Documentation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are two documentation options available, Sphinx and Doxygen. Sphinx will be used if ``sphinx-build`` is detected in the PATH, or if ``--with-sphinx`` is used at configure time. Doxygen is only enabled if ``--with-doxygen`` is used. Both are generated by the makefile target ``docs``. .. _amalgamation: The Amalgamation Build ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can also configure Botan to be built using only a single source file; this is quite convenient if you plan to embed the library into another application. To generate the amalgamation, run ``configure.py`` with whatever options you would ordinarily use, along with the option ``--amalgamation``. This will create two (rather large) files, ``botan_all.h`` and ``botan_all.cpp``, plus (unless the option ``--single-amalgamation-file`` is used) also some number of files like ``botan_all_aesni.cpp`` and ``botan_all_sse2.cpp`` which need to be compiled with the appropriate compiler flags to enable that instruction set. The ISA specific files are only generated if there is code that requires them, so you can simplify your build. The ``--minimized-build`` option (described elsewhere in this documentation) is also quite useful with the amalgamation. Whenever you would have included a botan header, you can then include ``botan_all.h``, and include ``botan_all.cpp`` along with the rest of the source files in your build. If you want to be able to easily switch between amalgamated and non-amalgamated versions (for instance to take advantage of prepackaged versions of botan on operating systems that support it), you can instead ignore ``botan_all.h`` and use the headers from ``build/include`` as normal. You can also build the library using Botan's build system (as normal) but utilizing the amalgamation instead of the individual source files by running something like ``./configure.py --amalgamation && make``. This is essentially a very simple form of link time optimization; because the entire library source is visible to the compiler, it has more opportunities for interprocedural optimizations. Additionally, amalgamation builds usually have significantly shorter compile times for full rebuilds. Modules Relying on Third Party Libraries ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Currently ``configure.py`` cannot detect if external libraries are available, so using them is controlled explicitly at build time by the user using - ``--with-bzip2`` enables the filters providing bzip2 compression and decompression. Requires the bzip2 development libraries to be installed. - ``--with-zlib`` enables the filters providing zlib compression and decompression. Requires the zlib development libraries to be installed. - ``--with-lzma`` enables the filters providing lzma compression and decompression. Requires the lzma development libraries to be installed. - ``--with-sqlite3`` enables storing TLS session information to an encrypted SQLite database. - ``--with-openssl`` adds an engine that uses OpenSSL for some public key operations and ciphers/hashes. OpenSSL 1.0.1 or later is supported. LibreSSL is API compatible with OpenSSL 1.0 and can be used instead. Multiple Builds ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It may be useful to run multiple builds with different configurations. Specify ``--with-build-dir=`` to set up a build environment in a different directory. Setting Distribution Info ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The build allows you to set some information about what distribution this build of the library comes from. It is particularly relevant to people packaging the library for wider distribution, to signify what distribution this build is from. Applications can test this value by checking the string value of the macro ``BOTAN_DISTRIBUTION_INFO``. It can be set using the ``--distribution-info`` flag to ``configure.py``, and otherwise defaults to "unspecified". For instance, a `Gentoo `_ ebuild might set it with ``--distribution-info="Gentoo ${PVR}"`` where ``${PVR}`` is an ebuild variable automatically set to a combination of the library and ebuild versions. Local Configuration Settings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You may want to do something peculiar with the configuration; to support this there is a flag to ``configure.py`` called ``--with-local-config=``. The contents of the file are inserted into ``build/build.h`` which is (indirectly) included into every Botan header and source file. Configuration Parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are some configuration parameters which you may want to tweak before building the library. These can be found in ``build.h``. This file is overwritten every time the configure script is run (and does not exist until after you run the script for the first time). Also included in ``build/build.h`` are macros which let applications check which features are included in the current version of the library. All of them begin with ``BOTAN_HAS_``. For example, if ``BOTAN_HAS_BLOWFISH`` is defined, then an application can include ```` and use the Blowfish class. ``BOTAN_MP_WORD_BITS``: This macro controls the size of the words used for calculations with the MPI implementation in Botan. You can choose 8, 16, 32, or 64. Normally this defaults to either 32 or 64, depending on the processor. Unless you are building for a 8 or 16-bit CPU, this isn't worth messing with. ``BOTAN_DEFAULT_BUFFER_SIZE``: This constant is used as the size of buffers throughout Botan. The default should be fine for most purposes, reduce if you are very concerned about runtime memory usage. Building Applications ---------------------------------------- Unix ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Botan usually links in several different system libraries (such as ``librt`` or ``libz``), depending on which modules are configured at compile time. In many environments, particularly ones using static libraries, an application has to link against the same libraries as Botan for the linking step to succeed. But how does it figure out what libraries it *is* linked against? The answer is to ask the ``botan`` command line tool using the ``config`` and ``version`` commands. ``botan version``: Print the Botan version number. ``botan config prefix``: If no argument, print the prefix where Botan is installed (such as ``/opt`` or ``/usr/local``). ``botan config cflags``: Print options that should be passed to the compiler whenever a C++ file is compiled. Typically this is used for setting include paths. ``botan config libs``: Print options for which libraries to link to (this will include a reference to the botan library iself). Your ``Makefile`` can run ``botan config`` and get the options necessary for getting your application to compile and link, regardless of whatever crazy libraries Botan might be linked against. Windows ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ No special help exists for building applications on Windows. However, given that typically Windows software is distributed as binaries, this is less of a problem - only the developer needs to worry about it. As long as they can remember where they installed Botan, they just have to set the appropriate flags in their Makefile/project file. Language Wrappers ---------------------------------------- Building the Python wrappers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The Python wrappers for Botan use ctypes and the C89 API so no special build step is required, just import botan2.py See :doc:`Python Bindings ` for more information about the Python bindings. Building the Perl XS wrappers ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To build the Perl XS wrappers, after building the main library change your directory to ``src/contrib/perl-xs`` and run ``perl Makefile.PL``, then run ``make`` to build the module and ``make test`` to run the test suite:: $ perl Makefile.PL Checking if your kit is complete... Looks good Writing Makefile for Botan $ make cp Botan.pm blib/lib/Botan.pm AutoSplitting blib/lib/Botan.pm (blib/lib/auto/Botan) /usr/bin/perl5.8.8 /usr/lib64/perl5/5.8.8/ExtUtils/xsubpp [...] g++ -c -Wno-write-strings -fexceptions -g [...] Running Mkbootstrap for Botan () chmod 644 Botan.bs rm -f blib/arch/auto/Botan/Botan.so g++ -shared Botan.o -o blib/arch/auto/Botan/Botan.so \ -lbotan -lbz2 -lpthread -lrt -lz \ chmod 755 blib/arch/auto/Botan/Botan.so cp Botan.bs blib/arch/auto/Botan/Botan.bs chmod 644 blib/arch/auto/Botan/Botan.bs Manifying blib/man3/Botan.3pm $ make test PERL_DL_NONLAZY=1 /usr/bin/perl5.8.8 [...] t/base64......ok t/filt........ok t/hex.........ok t/oid.........ok t/pipe........ok t/x509cert....ok All tests successful. Files=6, Tests=83, 0 wallclock secs ( 0.08 cusr + 0.02 csys = 0.10 CPU) botan-2.4.0/doc/manual/cipher_modes.rst000066400000000000000000000252711322470703100200430ustar00rootroot00000000000000.. _cipher_modes: Cipher Modes ===================== A block cipher by itself, is only able to securely encrypt a single data block. To be able to securely encrypt data of arbitrary length, a mode of operation applies the block cipher's single block operation repeatedly to encrypt an entire message. All cipher mode implementations are are derived from the base class :cpp:class:`Cipher_Mode`, which is declared in ``botan/cipher_mode.h``. .. warning:: Using an unauthenticted cipher mode without combining it with a :ref:`mac` is insecure. Prefer using an :ref:`aead`. .. cpp:class:: Cipher_Mode .. cpp:function:: void set_key(const uint8_t* key, size_t length) Set the symmetric key to be used. .. cpp:function:: bool valid_keylength(size_t length) const This function returns true if and only if *length* is a valid keylength for the algorithm. .. cpp:function:: size_t minimum_keylength() const Return the smallest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: size_t maximum_keylength() const Return the largest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: void start_msg(const uint8_t* nonce, size_t nonce_len) Set the IV (unique per-message nonce) of the mode of operation and prepare for message processing. .. cpp:function:: void start(const std::vector nonce) Acts like :cpp:func:`start_msg`\ (nonce.data(), nonce.size()). .. cpp:function:: void start(const uint8_t* nonce, size_t nonce_len) Acts like :cpp:func:`start_msg`\ (nonce, nonce_len). .. cpp:function:: virtual size_t update_granularity() const The :cpp:class:`Cipher_Mode` interface requires message processing in multiples of the block size. Returns size of required blocks to update and 1, if the mode can process messages of any length. .. cpp:function:: virtual size_t process(uint8_t* msg, size_t msg_len) Process msg in place and returns bytes written. msg must be a multiple of :cpp:func:`update_granularity`. .. cpp:function:: void update(secure_vector& buffer, size_t offset = 0) Continue processing a message in the buffer in place. The passed buffer's size must be a multiple of :cpp:func:`update_granularity`. The first *offset* bytes of the buffer will be ignored. .. cpp:function:: size_t minimum_final_size() const Returns the minimum size needed for :cpp:func:`finish`. .. cpp:function:: void finish(secure_vector& final_block, size_t offset = 0) Finalize the message processing with a final block of at least :cpp:func:`minimum_final_size` size. The first *offset* bytes of the passed final block will be ignored. Code Example --------------------- The following code encrypts the specified plaintext using AES-128/CBC with PKCS#7 padding. .. warning:: This example ignores the requirement to authenticate the ciphertext .. code-block:: cpp #include #include #include #include #include int main() { Botan::AutoSeeded_RNG rng; const std::string plaintext("Your great-grandfather gave this watch to your granddad for good luck. Unfortunately, Dane's luck wasn't as good as his old man's."); const std::vector key = Botan::hex_decode("2B7E151628AED2A6ABF7158809CF4F3C"); std::unique_ptr enc(Botan::get_cipher_mode("AES-128/CBC/PKCS7", Botan::ENCRYPTION)); enc->set_key(key); Botan::secure_vector pt(plaintext.data(), plaintext.data()+plaintext.length()); //generate fresh nonce (IV) enc->start(rng.random_vec(enc->default_nonce_length())); enc->finish(pt); std::cout << enc->name() << " with iv " << Botan::hex_encode(iv) << " " << Botan::hex_encode(pt) << "\n"; return 0; } Available Unauthenticated Cipher Modes ----------------------------------------- .. note:: CTR and OFB modes are also implemented, but these are treated as :cpp:class:`Stream_Cipher`\s instead. CBC ~~~~~~~~~~~~ Available if ``BOTAN_HAS_MODE_CBC`` is defined. CBC requires the plaintext be padded using a reversible rule. The following padding schemes are implemented PKCS#7 (RFC5652) The last byte in the padded block defines the padding length p, the remaining padding bytes are set to p as well. ANSI X9.23 The last byte in the padded block defines the padding length, the remaining padding is filled with 0x00. OneAndZeros (ISO/IEC 7816-4) The first padding byte is set to 0x80, the remaining padding bytes are set to 0x00. CFB ~~~~~~~~~~~~ Available if ``BOTAN_HAS_MODE_CFB`` is defined. CFB uses a block cipher to create a self-syncronizing stream cipher. It is used for example in the OpenPGP protocol. There is no reason to prefer it. XTS ~~~~~~~~~ Available if ``BOTAN_HAS_MODE_XTS`` is defined. XTS is a mode specialized for encrypting disk storage. XTS requires all inputs be at least 1 byte longer than the native block size of the cipher. .. _aead: AEAD Mode --------------------------- AEAD (Authenticated Encryption with Associated Data) modes provide message encryption, message authentication, and the ability to authenticate additional data that is not included in the ciphertext (such as a sequence number or header). It is a subclass of :cpp:class:`Cipher_Mode`. The AEAD interface can be used directly, or as part of the filter system by using :cpp:class:`AEAD_Filter` (a subclass of :cpp:class:`Keyed_Filter` which will be returned by :cpp:func:`get_cipher` if the named cipher is an AEAD mode). .. cpp:class:: AEAD_Mode .. cpp:function:: void set_key(const SymmetricKey& key) Set the key .. cpp:function:: Key_Length_Specification key_spec() const Return the key length specification .. cpp:function:: void set_associated_data(const uint8_t ad[], size_t ad_len) Set any associated data for this message. For maximum portability between different modes, this must be called after :cpp:func:`set_key` and before :cpp:func:`start`. If the associated data does not change, it is not necessary to call this function more than once, even across multiple calls to :cpp:func:`start` and :cpp:func:`finish`. .. cpp:function:: void start(const uint8_t nonce[], size_t nonce_len) Start processing a message, using *nonce* as the unique per-message value. .. warning:: With most AEADs, if the same nonce is ever used to encrypt two different messages under the same key, all security is lost. .. cpp:function:: void update(secure_vector& buffer, size_t offset = 0) Continue processing a message. The *buffer* is an in/out parameter and may be resized. In particular, some modes require that all input be consumed before any output is produced; with these modes, *buffer* will be returned empty. On input, the buffer must be sized in blocks of size :cpp:func:`update_granularity`. For instance if the update granularity was 64, then *buffer* could be 64, 128, 192, ... bytes. The first *offset* bytes of *buffer* will be ignored (this allows in place processing of a buffer that contains an initial plaintext header) .. cpp:function:: void finish(secure_vector& buffer, size_t offset = 0) Complete processing a message with a final input of *buffer*, which is treated the same as with :cpp:func:`update`. It must contain at least :cpp:func:`final_minimum_size` bytes. Note that if you have the entire message in hand, calling finish without ever calling update is both efficient and convenient. .. note:: During decryption, finish will throw an instance of Integrity_Failure if the MAC does not validate. If this occurs, all plaintext previously output via calls to update must be destroyed and not used in any way that an attacker could observe the effects of. One simply way to assure this could never happen is to never call update, and instead always marshall the entire message into a single buffer and call finish on it when decrypting. .. cpp:function:: size_t update_granularity() const The AEAD interface requires :cpp:func:`update` be called with blocks of this size. This will be 1, if the mode can process any length inputs. .. cpp:function:: size_t final_minimum_size() const The AEAD interface requires :cpp:func:`finish` be called with at least this many bytes (which may be zero, or greater than :cpp:func:`update_granularity`) .. cpp:function:: bool valid_nonce_length(size_t nonce_len) const Returns true if *nonce_len* is a valid nonce length for this scheme. For EAX and GCM, any length nonces are allowed. OCB allows any value between 8 and 15 bytes. .. cpp:function:: size_t default_nonce_length() const Returns a reasonable length for the nonce, typically either 96 bits, or the only supported length for modes which don't support 96 bit nonces. Available AEAD Modes ------------------------- ChaCha20Poly1305 ~~~~~~~~~~~~~~~~~~ Available if ``BOTAN_HAS_AEAD_CHACHA20_POLY1305`` is defined. Unlike the other AEADs which are based on block ciphers, this mode is based on the ChaCha stream cipher and the Poly1305 authentication code. It is very fast on all modern platforms. GCM ~~~~~ Available if ``BOTAN_HAS_AEAD_GCM`` is defined. NIST standard, commonly used. Requires a 128-bit block cipher. Fairly slow, unless hardware support for carryless multiplies is available. OCB ~~~~~ Available if ``BOTAN_HAS_AEAD_OCB`` is defined. A block cipher based AEAD. Supports 128-bit, 256-bit and 512-bit block ciphers. This mode is very fast and easily secured against side channels. Adoption has been poor because it is patented in the United States, though a license is available allowing it to be freely used by open source software. EAX ~~~~~ Available if ``BOTAN_HAS_AEAD_EAX`` is defined. A secure composition of CTR mode and CMAC. Supports 128-bit, 256-bit and 512-bit block ciphers. SIV ~~~~~~ Available if ``BOTAN_HAS_AEAD_SIV`` is defined. Requires a 128-bit block cipher. Unlike other AEADs, SIV is "misuse resistent"; if a nonce is repeated, SIV retains security, with the exception that if the same nonce is used to encrypt the same message multiple times, an attacker can detect the duplicated message (this is because for identical plaintexts SIV will output the same ciphertext each time, in the case the nonce is repeated.) CCM ~~~~~ Available if ``BOTAN_HAS_AEAD_CCM`` is defined. Requires a 128-bit block cipher. This is a NIST standard mode but that is about all to recommenmd it. Prefer EAX. botan-2.4.0/doc/manual/cli.rst000066400000000000000000000262021322470703100161440ustar00rootroot00000000000000botan ======================================== :Subtitle: Botan command line util :Manual section: 1 Outline ------------ The ``botan`` program is a command line tool for using a broad variety of functions of the Botan library in the shell. All commands follow the syntax ``botan ``. If ``botan`` is run with an unknown command, or without any command, or with the ``--help`` option, all available commands with their options will be printed. Hash Function ---------------- ``hash --algo=SHA-256 --buf-size=4096 files`` Compute the *algo* digest over the data in any number of *files*. If no files are listed on the command line, the input source defaults to standard input. Password Hash ---------------- ``gen_bcrypt --work-factor=12 password`` Calculate the bcrypt password digest of *password*. *work-factor* is an integer between 4 and 18. A higher *work-factor* value results in a more expensive hash calculation. ``check_bcrypt password hash`` Checks if the bcrypt hash of the passed *password* equals the passed *hash* value. HMAC ---------------- ``hmac --hash=SHA-256 --buf-size=4096 key files`` Compute the HMAC tag with the cryptographic hash function *hash* using the key in file *key* over the data in *files*. *files* defaults to STDIN. Public Key Cryptography ------------------------------------- ``keygen --algo=RSA --params= --passphrase= --pbe= --pbe-millis=300 --der-out`` Generate a PKCS #8 *algo* private key. If *der-out* is passed, the pair is BER encoded. Otherwise, PEM encoding is used. To protect the PKCS #8 formatted key, it is recommended to encrypt it with a provided *passphrase*. *pbe* is the name of the desired encryption algorithm, which uses *pbe-millis* milliseconds to derive the encryption key from the passed *passphrase*. Algorithm specific parameters, as the desired bitlength of an RSA key, can be passed with *params*. - For RSA *params* specifies the bit length of the RSA modulus. It defaults to 3072. - For DH *params* specifies the DH parameters. It defaults to modp/ietf/2048. - For DSA *params* specifies the DSA parameters. It defaults to dsa/botan/2048. - For EC algorithms *params* specifies the elliptic curve. It defaults to secp256r1. ``pkcs8 --pass-in= --pub-out --der-out --pass-out= --pbe= --pbe-millis=300 key`` Open a PKCS #8 formatted key at *key*. If *key* is encrypted, the passphrase must be passed as *pass-in*. It is possible to (re)encrypt the read key with the passphrase passed as *pass-out*. The parameters *pbe-millis* and *pbe* work similarly to ``keygen``. ``sign --passphrase= --hash=SHA-256 --emsa= key file`` Sign the data in *file* using the PKCS #8 private key *key*. If *key* is encrypted, the used passphrase must be passed as *pass-in*. *emsa* specifies the signature scheme and *hash* the cryptographic hash function used in the scheme. - For RSA signatures EMSA4 (RSA-PSS) is the default scheme. - For ECDSA and DSA *emsa* defaults to EMSA1 (signing the hash directly) ``verify --hash=SHA-256 --emsa= pubkey file signature`` Verify the authenticity of the data in *file* with the provided signature *signature* and the public key *pubkey*. Similarly to the signing process, *emsa* specifies the signature scheme and *hash* the cryptographic hash function used in the scheme. ``gen_dl_group --pbits=1024 --qbits=0 --type=subgroup`` Generate ANSI X9.42 encoded Diffie-Hellman group parameters. - If *type=subgroup* is passed, the size of the prime subgroup q is sampled as a prime of *qbits* length and p is *pbits* long. If *qbits* is not passed, its length is estimated from *pbits* as described in RFC 3766. - If *type=strong* is passed, p is sampled as a safe prime with length *pbits* and the prime subgroup has size q with *pbits*-1 length. ``dl_group_info --pem name`` Print raw Diffie-Hellman parameters (p,g) of the standarized DH group *name*. If *pem* is set, the X9.42 encoded group is printed. ``ec_group_info --pem name`` Print raw elliptic curve domain parameters of the standarized curve *name*. If *pem* is set, the encoded domain is printed. X.509 ---------------------------------------------- ``gen_pkcs10 key CN --country= --organization= --email= --key-pass= --hash=SHA-256 --emsa=`` Generate a PKCS #10 certificate signing request (CSR) using the passed PKCS #8 private key *key*. If the private key is encrypted, the decryption passphrase *key-pass* has to be passed.*emsa* specifies the padding scheme to be used when calculating the signature. - For RSA keys EMSA4 (RSA-PSS) is the default scheme. - For ECDSA, DSA, ECGDSA, ECKCDSA and GOST-34.10 keys *emsa* defaults to EMSA1. ``gen_self_signed key CN --country= --dns= --organization= --email= --key-pass= --ca --hash=SHA-256 --emsa=`` Generate a self signed X.509 certificate using the PKCS #8 private key *key*. If the private key is encrypted, the decryption passphrase *key-pass* has to be passed. If *ca* is passed, the certificate is marked for certificate authority (CA) usage. *emsa* specifies the padding scheme to be used when calculating the signature. - For RSA keys EMSA4 (RSA-PSS) is the default scheme. - For ECDSA, DSA, ECGDSA, ECKCDSA and GOST-34.10 keys *emsa* defaults to EMSA1. ``sign_cert --ca-key-pass= --hash=SHA-256 --duration=365 --emsa= ca_cert ca_key pkcs10_req`` Create a CA signed X.509 certificate from the information contained in the PKCS #10 CSR *pkcs10_req*. The CA certificate is passed as *ca_cert* and the respective PKCS #8 private key as *ca_key*. If the private key is encrypted, the decryption passphrase *ca-key-pass* has to be passed. The created certificate has a validity period of *duration* days. *emsa* specifies the padding scheme to be used when calculating the signature. *emsa* defaults to the padding scheme used in the CA certificate. ``ocsp_check subject issuer`` Verify an X.509 certificate against the issuers OCSP responder. Pass the certificate to validate as *subject* and the CA certificate as *issuer*. ``cert_info --fingerprint --ber file`` Parse X.509 PEM certificate and display data fields. If ``--fingerprint`` is used, the certificate's fingerprint is also printed. ``cert_verify subject *ca_certs`` Verify if the provided X.509 certificate *subject* can be sucessfully validated. The list of trusted CA certificates is passed with *ca_certs*, which is a list of one or more certificates. TLS Server/Client ----------------------- ``tls_ciphers --policy=default --version=tls1.2`` Prints the list of ciphersuites that will be offered under a particular policy/version. The policy can be any of the the strings "default", "suiteb", "strict", or "all" to denote built-in policies, or it can name a file from which a policy description will be read. ``tls_client host --port=443 --print-certs --policy= --tls1.0 --tls1.1 --tls1.2 --session-db= --session-db-pass= --next-protocols= --type=tcp`` Implements a testing TLS client, which connects to *host* via TCP or UDP on port *port*. The TLS version can be set with the flags *tls1.0*, *tls1.1* and *tls1.2* of which the lowest specified version is automatically chosen. If none of the TLS version flags is set, the latest supported version is chosen. The client honors the TLS policy defined in the *policy* file and prints all certificates in the chain, if *print-certs* is passed. *next-protocols* is a comma seperated list and specifies the protocols to advertise with Application-Layer Protocol Negotiation (ALPN). ``tls_server cert key --port=443 --type=tcp --policy=`` Implements a testing TLS server, which allows TLS clients to connect. Binds to either TCP or UDP on port *port*. The server uses the certificate *cert* and the respective PKCS #8 private key *key*. The server honors the TLS policy defined in the *policy* file. ``tls_http_server cert key --port=443 --policy= --session-db --session-db-pass=`` Only available if asio support was enabled. Provides a simple HTTP server which replies to all requests with an informational text output. The server honors the TLS policy defined in the *policy* file. ``tls_proxy listen_port target_host target_port server_cert server_key`` Only available if asio support was enabled. Listens on a port and forwards all connects to a target server specified at ``target_host`` and ``target_port``. Number Theory ----------------------- ``is_prime --prob=56 n`` Test if the integer *n* is composite or prime with a Miller-Rabin primality test with *(prob+2)/2* iterations. ``factor n`` Factor the integer *n* using a combination of trial division by small primes, and Pollard's Rho algorithm. ``gen_prime --count=1 bits`` Samples *count* primes with a length of *bits* bits. PSK Database -------------------- Only available if sqlite3 support was compiled in. ``psk_set db db_key name psk`` Using the PSK database named db and encrypting under the (hex) key ``db_key``, save the provided psk (also hex) under ``name``:: $ botan psk_set psk.db deadba55 bunny f00fee ``psk_get db db_key name`` Get back a value saved with ``psk_set``:: $ botan psk_get psk.db deadba55 bunny f00fee ``psk_list db db_key`` List all values saved to the database under the given key:: $ botan psk_list psk.db deadba55 bunny Data Encoding/Decoding ------------------------ ``base64_dec file`` Encode *file* to Base64. ``base64_enc file`` Decode Base64 encoded *file*. ``hex_dec file`` Encode *file* to Hex. ``hex_enc file`` Decode Hex encoded *file*. Miscellaneous Commands ------------------------------------- ``version --full`` Print the version number. If option ``-full`` is provided additional details are printed. ``config info_type`` Prints build information, useful for applications which want to build against the library. The ``info_type`` argument can be any of ``prefix``, ``cflags``, ``ldflags``, or ``libs``. ``cpuid`` List available processor flags (aes_ni, SIMD extensions, ...). ``asn1print file`` Decode and print *file* with ASN.1 Basic Encoding Rules (BER). ``http_get url`` Retrieve ressource from the passed http/https *url*. ``speed --msec=100 --provider= --buf-size=4096 algos`` Measures the speed of the passed *algos*. If no *algos* are passed all available speed tests are executed. *msec* (in milliseconds) sets the period of measurement for each algorithm. ``rng --system --rdrand bytes`` Sample *bytes* random bytes from the specified random number generator. If *system* is set, the Botan System_RNG is used. If *system* is unset and *rdrand* is set, the hardware rng RDRAND_RNG is used. If both are unset, the Botan AutoSeeded_RNG is used. ``cc_encrypt CC passphrase --tweak=`` Encrypt the passed valid credit card number *CC* using FPE encryption and the passphrase *passphrase*. The key is derived from the passphrase using PBKDF2 with SHA256. Due to the nature of FPE, the ciphertext is also a credit card number with a valid checksum. *tweak* is public and parameterizes the encryption function. ``cc_decrypt CC passphrase --tweak=`` Decrypt the passed valid ciphertext *CC* using FPE decryption with the passphrase *passphrase* and the tweak *tweak*. botan-2.4.0/doc/manual/compression.rst000066400000000000000000000103041322470703100177320ustar00rootroot00000000000000Lossless Data Compression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Some lossless data compression algorithms are available in botan, currently all via third party libraries - these include zlib (including deflate and gzip formats), bzip2, and lzma. Support for these must be enabled at build time; you can check for them using the macros ``BOTAN_HAS_ZLIB``, ``BOTAN_HAS_BZIP2``, and ``BOTAN_HAS_LZMA``. .. note:: You should always compress *before* you encrypt, because encryption seeks to hide the redundancy that compression is supposed to try to find and remove. Compression is done through the ``Compression_Algorithm`` and ``Decompression_Algorithm`` classes, both defined in `compression.h` Compression and decompression both work in three stages: starting a message (``start``), continuing to process it (``update``), and then finally completing processing the stream (``finish``). .. cpp:class:: Compression_Algorithm .. cpp:function:: void start(size_t level) Initialize the compression engine. This must be done before calling ``update`` or ``finish``. The meaning of the `level` parameter varies by the algorithm but generally takes a value between 1 and 9, with higher values implying typically better compression from and more memory and/or CPU time consumed by the compression process. The decompressor can always handle input from any compressor. .. cpp:function:: void update(secure_vector& buf, \ size_t offset = 0, bool flush = false) Compress the material in the in/out parameter ``buf``. The leading ``offset`` bytes of ``buf`` are ignored and remain untouched; this can be useful for ignoring packet headers. If ``flush`` is true, the compression state is flushed, allowing the decompressor to recover the entire message up to this point without having the see the rest of the compressed stream. .. cpp::function:: void finish(secure_vector& buf, size_t offset = 0) Finish compressing a message. The ``buf`` and ``offset`` parameters are treated as in ``update``. It is acceptable to call ``start`` followed by ``finish`` with the entire message, without any intervening call to ``update``. .. cpp:class:: Decompression_Algorithm .. cpp:function:: void start() Initialize the decompression engine. This must be done before calling ``update`` or ``finish``. No level is provided here; the decompressor can accept input generated by any compression parameters. .. cpp:function:: void update(secure_vector& buf, \ size_t offset = 0) Decompress the material in the in/out parameter ``buf``. The leading ``offset`` bytes of ``buf`` are ignored and remain untouched; this can be useful for ignoring packet headers. This function may throw if the data seems to be invalid. .. cpp::function:: void finish(secure_vector& buf, size_t offset = 0) Finish decompressing a message. The ``buf`` and ``offset`` parameters are treated as in ``update``. It is acceptable to call ``start`` followed by ``finish`` with the entire message, without any intervening call to ``update``. This function may throw if the data seems to be invalid. The easiest way to get a compressor is via the functions .. cpp:function:: Compression_Algorithm* make_compressor(std::string type) .. cpp:function:: Decompression_Algorithm* make_decompressor(std::string type) Supported values for `type` include `zlib` (raw zlib with no checksum), `deflate` (zlib's deflate format), `gzip`, `bz2`, and `lzma`. A null pointer will be returned if the algorithm is unavailable. To use a compression algorithm in a `Pipe` use the adaptor types `Compression_Filter` and `Decompression_Filter` from `comp_filter.h`. The constructors of both filters take a `std::string` argument (passed to `make_compressor` or `make_decompressor`), the compression filter also takes a `level` parameter. Finally both constructors have a parameter `buf_sz` which specifies the size of the internal buffer that will be used - inputs will be broken into blocks of this size. The default is 4096. botan-2.4.0/doc/manual/contents.rst000066400000000000000000000007461322470703100172370ustar00rootroot00000000000000 Contents ======================================== .. toctree:: index goals support building versions secmem rng hash block_cipher stream_ciphers message_auth_codes cipher_modes pubkey x509 tls credentials_manager bigint kdf pbkdf keywrap passhash cryptobox srp psk_db filters fpe compression pkcs11 tpm otp ffi python cli side_channels packaging fuzzing deprecated abi botan-2.4.0/doc/manual/credentials_manager.rst000066400000000000000000000133641322470703100213710ustar00rootroot00000000000000 Credentials Manager ================================================== A ``Credentials_Manager`` is a way to abstract how the application stores credentials in a way that is usable by protocol implementations. Currently the main user is the :doc:`tls` implementation. .. cpp:class:: Credentials_Manager .. cpp:function:: std::vector \ trusted_certificate_authorities( \ const std::string& type, \ const std::string& context) Return the list of trusted certificate authorities. When *type* is "tls-client", *context* will be the hostname of the server, or empty if the hostname is not known. When *type* is "tls-server", the *context* will again be the hostname of the server, or empty if the client did not send a server name indicator. For TLS servers, these CAs are the ones trusted for signing of client certificates. If you do not want the TLS server to ask for a client cert, ``trusted_certificate_authorities`` should return an empty list for *type* "tls-server". The default implementation returns an empty list. .. cpp:function:: std::vector cert_chain( \ const std::vector& cert_key_types, \ const std::string& type, \ const std::string& context) Return the certificate chain to use to identify ourselves .. cpp:function:: std::vector cert_chain_single_type( \ const std::string& cert_key_type, \ const std::string& type, \ const std::string& context) Return the certificate chain to use to identifier ourselves, if we have one of type *cert_key_tye* and we would like to use a certificate in this *type*/*context*. .. cpp:function:: Private_Key* private_key_for(const X509_Certificate& cert, \ const std::string& type, \ const std::string& context) Return the private key for this certificate. The *cert* will be the leaf cert of a chain returned previously by ``cert_chain`` or ``cert_chain_single_type``. In versions before 1.11.34, there was an additional function on `Credentials_Manager` .. cpp::function:: void verify_certificate_chain( \ const std::string& type, \ const std::string& hostname, \ const std::vector& cert_chain) This function has been replaced by `TLS::Callbacks::tls_verify_cert_chain`. SRP Authentication ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``Credentials_Manager`` contains the hooks used by TLS clients and servers for SRP authentication. .. cpp:function:: bool attempt_srp(const std::string& type, \ const std::string& context) Returns if we should consider using SRP for authentication .. cpp:function:: std::string srp_identifier(const std::string& type, \ const std::string& context) Returns the SRP identifier we'd like to use (used by client) .. cpp:function:: std::string srp_password(const std::string& type, \ const std::string& context, \ const std::string& identifier) Returns the password for *identifier* (used by client) .. cpp:function:: bool srp_verifier(const std::string& type, \ const std::string& context, \ const std::string& identifier, \ std::string& group_name, \ BigInt& verifier, \ std::vector& salt, \ bool generate_fake_on_unknown) Returns the SRP verifier information for *identifier* (used by server) Preshared Keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TLS and some other protocols support the use of pre shared keys for authentication. .. cpp:function:: SymmetricKey psk(const std::string& type, \ const std::string& context, \ const std::string& identity) Return a symmetric key for use with *identity* One important special case for ``psk`` is where *type* is "tls-server", *context* is "session-ticket" and *identity* is an empty string. If a key is returned for this case, a TLS server will offer session tickets to clients who can use them, and the returned key will be used to encrypt the ticket. The server is allowed to change the key at any time (though changing the key means old session tickets can no longer be used for resumption, forcing a full re-handshake when the client next connects). One simple approach to add support for session tickets in your server is to generate a random key the first time ``psk`` is called to retrieve the session ticket key, cache it for later use in the ``Credentials_Manager``, and simply let it be thrown away when the process terminates. See :rfc:`4507` for more information about TLS session tickets. .. cpp:function:: std::string psk_identity_hint(const std::string& type, \ const std::string& context) Returns an identity hint which may be provided to the client. This can help a client understand what PSK to use. .. cpp:function:: std::string psk_identity(const std::string& type, \ const std::string& context, \ const std::string& identity_hint) Returns the identity we would like to use given this *type* and *context* and the optional *identity_hint*. Not all servers or protocols will provide a hint. botan-2.4.0/doc/manual/cryptobox.rst000066400000000000000000000022311322470703100174220ustar00rootroot00000000000000 Cryptobox ======================================== Encryption using a passphrase ---------------------------------------- .. versionadded:: 1.8.6 This is a set of simple routines that encrypt some data using a passphrase. There are defined in the header `cryptobox.h`, inside namespace `Botan::CryptoBox`. It generates cipher and MAC keys using 8192 iterations of PBKDF2 with HMAC(SHA-512), then encrypts using Serpent in CTR mode and authenticates using a HMAC(SHA-512) mac of the ciphertext, truncated to 160 bits. .. cpp:function:: std::string encrypt(const uint8_t input[], size_t input_len, \ const std::string& passphrase, \ RandomNumberGenerator& rng) Encrypt the contents using *passphrase*. .. cpp:function:: std::string decrypt(const uint8_t input[], size_t input_len, \ const std::string& passphrase) Decrypts something encrypted with encrypt. .. cpp:function:: std::string decrypt(const std::string& input, \ const std::string& passphrase) Decrypts something encrypted with encrypt. botan-2.4.0/doc/manual/deprecated.rst000066400000000000000000000042221322470703100174730ustar00rootroot00000000000000Deprecated Features ======================== The following functionality is currently deprecated, and will likely be removed in a future release. If you think you have a good reason to be using one of the following, contact the developers to explain your use case if you want to make sure your code continues to work. This is in addition to specific API calls marked with BOTAN_DEPRECATED in the source. - Directly accessing the member variables of types calendar_point, ASN1_Attribute, and AlgorithmIdentifier - The headers ``botan.h``, ``init.h``, ``lookup.h`` - All or nothing package transform (``package.h``) - The Perl-XS wrapper - The TLS constructors taking `std::function` for callbacks. Instead use the TLS::Callbacks interface. - Using ``X509_Certificate::subject_info`` and ``issuer_info`` to access any information that is not included in the DN or subject alternative name. Prefer using the specific accessor functions for other data, eg instead of ``cert.subject_info("X509.Certificate.serial")`` use ``cert.serial_number()``. - The Buffered_Computation base class. In a future release the class will be removed, and all of member functions instead declared directly on MessageAuthenticationCode and HashFunction. So this only affects you if you are directly referencing `Botan::Buffered_Computation` in some way. - The SymmetricAlgorithm base class. Similarly to Buffered_Computation, in a future release the class will be removed and its member functions copied to classes which currently subclass it. This only affects your code if you are referencing `Botan::SymmetricAlgorithm` directly. - Platform support for Google Native Client - Support for PathScale and HP compilers - TLS: 3DES and SEED ciphersuites - TLS: Anonymous DH/ECDH ciphersuites - TLS: DSA ciphersuites/certs - TLS: static RSA key exchange ciphersuites - TLS: CCM_8 ciphersuites - Block ciphers CAST-256, Kasumi, MISTY1, and DESX. - CBC-MAC, X9.19-MAC - PBKDF1 key derivation - GCM support for 64-bit tags - Old (Google specific) ChaCha20 TLS ciphersuites - All built in ECC groups < 256 bits - All built in MODP groups < 2048 bits - All pre-created DSA groups botan-2.4.0/doc/manual/ffi.rst000066400000000000000000001004201322470703100161340ustar00rootroot00000000000000 FFI (C89) Interface ======================================== .. versionadded:: 1.11.14 Botan's ffi module provides a C89 API intended to be easily usable with other language's foreign function interface (FFI) libraries. For instance the included Python wrapper uses Python's ``ctypes`` module and the C89 API. This API is of course also useful for programs written directly in C. Code examples can be found in `src/tests/test_ffi.cpp`. Versioning ---------------------------------------- .. cpp:function:: uint32_t botan_ffi_api_version() Returns the version of the currently supported FFI API. This is expressed in the form YYYYMMDD of the release date of this version of the API. .. cpp:function:: int botan_ffi_supports_api(uint32_t version) Returns 0 iff the FFI version specified is supported by this library. Otherwise returns -1. The expression botan_ffi_supports_api(botan_ffi_api_version()) will always evaluate to 0. A particular version of the library may also support other (older) versions of the FFI API. .. cpp:function:: const char* botan_version_string() Returns a free-from version string, e.g., 2.0.0 .. cpp:function:: uint32_t botan_version_major() Returns the major version of the library .. cpp:function:: uint32_t botan_version_minor() Returns the minor version of the library .. cpp:function:: uint32_t botan_version_patch() Returns the patch version of the library .. cpp:function:: uint32_t botan_version_datestamp() Returns the date this version was released as an integer, or 0 if an unreleased version Utility Functions ---------------------------------------- .. cpp:function:: int botan_same_mem(const uint8_t* x, const uint8_t* y, size_t len) Returns 0 if `x[0..len] == y[0..len]`, -1 otherwise. .. cpp:function:: int botan_hex_encode(const uint8_t* x, size_t len, char* out, uint32_t flags) Performs hex encoding of binary data in *x* of size *len* bytes. The output buffer *out* must be of at least *x*2* bytes in size. If *flags* contains ``BOTAN_FFI_HEX_LOWER_CASE``, hex encoding will only contain lower-case letters, upper-case letters otherwise. Returns 0 on success, 1 otherwise. Random Number Generators ---------------------------------------- .. cpp:type:: opaque* botan_rng_t An opaque data type for a random number generator. Don't mess with it. .. cpp:function:: int botan_rng_init(botan_rng_t* rng, const char* rng_type) Initialize a random number generator object from the given *rng_type*: "system" or `nullptr`: `System_RNG`, "user": `AutoSeeded_RNG`. .. cpp:function:: int botan_rng_get(botan_rng_t rng, uint8_t* out, size_t out_len) Get random bytes from a random number generator. .. cpp:function:: int botan_rng_reseed(botan_rng_t rng, size_t bits) Reseeds the random number generator with *bits* number of bits from the `System_RNG`. .. cpp:function:: int botan_rng_destroy(botan_rng_t rng) Destroy the object created by :cpp:func:`botan_rng_init`. Block Ciphers ---------------------------------------- This is a 'raw' interface to ECB mode block ciphers. Most applications want the higher level cipher API which provides authenticated encryption. This API exists as an escape hatch for applications which need to implement custom primitives using a PRP. .. cpp:type:: opaque* botan_block_cipher_t An opaque data type for a block cipher. Don't mess with it. .. cpp:function:: int botan_block_cipher_init(botan_block_cipher_t* bc, const char* cipher_name) Create a new cipher mode object, `cipher_name` should be for example "AES-128" or "Threefish-512" .. cpp:function:: int botan_block_cipher_block_size(botan_block_cipher_t bc) Return the block size of this cipher. .. cpp:function:: int botan_block_cipher_clear(botan_block_cipher_t bc) Clear the internal state (such as keys) of this cipher object, but do not deallocate it. .. cpp:function:: int botan_block_cipher_set_key(botan_block_cipher_t bc, const uint8_t key[], size_t key_len) Set the cipher key, which is required before encrypting or decrypting. .. cpp:function:: int botan_block_cipher_encrypt_blocks(botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks) The key must have been set first with :cpp:func:`botan_block_cipher_set_key`. Encrypt *blocks* blocks of data stored in *in* and place the ciphertext into *out*. The two parameters may be the same buffer, but must not overlap. .. cpp:function:: int botan_block_cipher_decrypt_blocks(botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks) The key must have been set first with :cpp:func:`botan_block_cipher_set_key`. Decrypt *blocks* blocks of data stored in *in* and place the ciphertext into *out*. The two parameters may be the same buffer, but must not overlap. .. cpp:function:: int botan_block_cipher_destroy(botan_block_cipher_t rng) Destroy the object created by :cpp:func:`botan_block_cipher_init`. Hash Functions ---------------------------------------- .. cpp:type:: opaque* botan_hash_t An opaque data type for a hash. Don't mess with it. .. cpp:function:: botan_hash_t botan_hash_init(const char* hash, uint32_t flags) Creates a hash of the given name, e.g., "SHA-384". Returns null on failure. Flags should always be zero in this version of the API. .. cpp:function:: int botan_hash_destroy(botan_hash_t hash) Destroy the object created by :cpp:func:`botan_hash_init`. .. cpp:function:: int botan_hash_copy_state(botan_hash_t* dest, const botan_hash_t source) Copies the state of the hash object to a new hash object. .. cpp:function:: int botan_hash_clear(botan_hash_t hash) Reset the state of this object back to clean, as if no input has been supplied. .. cpp:function:: size_t botan_hash_output_length(botan_hash_t hash) Return the output length of the hash function. .. cpp:function:: int botan_hash_update(botan_hash_t hash, const uint8_t* input, size_t len) Add input to the hash computation. .. cpp:function:: int botan_hash_final(botan_hash_t hash, uint8_t out[]) Finalize the hash and place the output in out. Exactly :cpp:func:`botan_hash_output_length` bytes will be written. Message Authentication Codes ---------------------------------------- .. cpp:type:: opaque* botan_mac_t An opaque data type for a MAC. Don't mess with it, but do remember to set a random key first. .. cpp:function:: botan_mac_t botan_mac_init(const char* mac, uint32_t flags) Creates a MAC of the given name, e.g., "HMAC(SHA-384)". Returns null on failure. Flags should always be zero in this version of the API. .. cpp:function:: int botan_mac_destroy(botan_mac_t mac) Destroy the object created by :cpp:func:`botan_mac_init`. .. cpp:function:: int botan_mac_clear(botan_mac_t mac) Reset the state of this object back to clean, as if no key and input have been supplied. .. cpp:function:: size_t botan_mac_output_length(botan_mac_t mac) Return the output length of the MAC. .. cpp:function:: int botan_mac_set_key(botan_mac_t mac, const uint8_t* key, size_t key_len) Set the random key. .. cpp:function:: int botan_mac_update(botan_mac_t mac, uint8_t buf[], size_t len) Add input to the MAC computation. .. cpp:function:: int botan_mac_final(botan_mac_t mac, uint8_t out[], size_t* out_len) Finalize the MAC and place the output in out. Exactly :cpp:func:`botan_mac_output_length` bytes will be written. Ciphers ---------------------------------------- .. cpp:type:: opaque* botan_cipher_t An opaque data type for a MAC. Don't mess with it, but do remember to set a random key first. And please use an AEAD. .. cpp:function:: botan_cipher_t botan_cipher_init(const char* cipher_name, uint32_t flags) Create a cipher object from a name such as "AES-256/GCM" or "Serpent/OCB". Flags is a bitfield The low bit of flags specifies if encrypt or decrypt .. cpp:function:: int botan_cipher_destroy(botan_cipher_t cipher) .. cpp:function:: int botan_cipher_clear(botan_cipher_t hash) .. cpp:function:: int botan_cipher_set_key(botan_cipher_t cipher, \ const uint8_t* key, size_t key_len) .. cpp:function:: int botan_cipher_set_associated_data(botan_cipher_t cipher, \ const uint8_t* ad, size_t ad_len) .. cpp:function:: int botan_cipher_start(botan_cipher_t cipher, \ const uint8_t* nonce, size_t nonce_len) .. cpp:function:: int botan_cipher_is_authenticated(botan_cipher_t cipher) .. cpp:function:: size_t botan_cipher_tag_size(botan_cipher_t cipher) .. cpp:function:: int botan_cipher_valid_nonce_length(botan_cipher_t cipher, size_t nl) .. cpp:function:: size_t botan_cipher_default_nonce_length(botan_cipher_t cipher) PBKDF ---------------------------------------- .. cpp:function:: int botan_pbkdf(const char* pbkdf_algo, \ uint8_t out[], size_t out_len, \ const char* passphrase, \ const uint8_t salt[], size_t salt_len, \ size_t iterations) Derive a key from a passphrase for a number of iterations using the given PBKDF algorithm, e.g., "PBKDF2". .. cpp:function:: int botan_pbkdf_timed(const char* pbkdf_algo, \ uint8_t out[], size_t out_len, \ const char* passphrase, \ const uint8_t salt[], size_t salt_len, \ size_t milliseconds_to_run, \ size_t* out_iterations_used) Derive a key from a passphrase using the given PBKDF algorithm, e.g., "PBKDF2". If *out_iterations_used* is zero, instead the PBKDF is run until *milliseconds_to_run* milliseconds have passed. In this case, the number of iterations run will be written to *out_iterations_used*. KDF ---------------------------------------- .. cpp:function:: int botan_kdf(const char* kdf_algo, \ uint8_t out[], size_t out_len, \ const uint8_t secret[], size_t secret_len, \ const uint8_t salt[], size_t salt_len, \ const uint8_t label[], size_t label_len) Derive a key using the given KDF algorithm, e.g., "SP800-56C". The derived key of length *out_len* bytes will be placed in *out*. Multiple Precision Integers ---------------------------------------- .. versionadded: 2.1.0 .. cpp:type:: opaque* botan_mp_t An opaque data type for a multiple precision integer. Don't mess with it. .. cpp:function:: int botan_mp_init(botan_mp_t* mp) Initialize a ``botan_mp_t``. Initial value is zero, use `botan_mp_set_X` to load a value. .. cpp:function:: int botan_mp_destroy(botan_mp_t mp) Free a ``botan_mp_t`` .. cpp:function:: int botan_mp_to_hex(botan_mp_t mp, char* out) Writes exactly ``botan_mp_num_bytes(mp)*2 + 1`` bytes to out .. cpp:function:: int botan_mp_to_str(botan_mp_t mp, uint8_t base, char* out, size_t* out_len) Base can be either 10 or 16. .. cpp:function:: int botan_mp_set_from_int(botan_mp_t mp, int initial_value) Set ``botan_mp_t`` from an integer value. .. cpp:function:: int botan_mp_set_from_mp(botan_mp_t dest, botan_mp_t source) Set ``botan_mp_t`` from another MP. .. cpp:function:: int botan_mp_set_from_str(botan_mp_t dest, const char* str) Set ``botan_mp_t`` from a string. Leading prefix of "0x" is accepted. .. cpp:function:: int botan_mp_num_bits(botan_mp_t n, size_t* bits) Return the size of ``n`` in bits. .. cpp:function:: int botan_mp_num_bytes(botan_mp_t n, size_t* uint8_ts) Return the size of ``n`` in bytes. .. cpp:function:: int botan_mp_to_bin(botan_mp_t mp, uint8_t vec[]) Writes exactly ``botan_mp_num_bytes(mp)`` to ``vec``. .. cpp:function:: int botan_mp_from_bin(botan_mp_t mp, const uint8_t vec[], size_t vec_len) Loads ``botan_mp_t`` from a binary vector (as produced by ``botan_mp_to_bin``). .. cpp:function:: int botan_mp_is_negative(botan_mp_t mp) Return 1 if ``mp`` is negative, otherwise 0. .. cpp:function:: int botan_mp_flip_sign(botan_mp_t mp) Flip the sign of ``mp``. .. cpp:function:: int botan_mp_add(botan_mp_t result, botan_mp_t x, botan_mp_t y) Add two ``botan_mp_t``s and store the output in ``result``. .. cpp:function:: int botan_mp_sub(botan_mp_t result, botan_mp_t x, botan_mp_t y) Subtract two ``botan_mp_t``s and store the output in ``result``. .. cpp:function:: int botan_mp_mul(botan_mp_t result, botan_mp_t x, botan_mp_t y) Multiply two ``botan_mp_t``s and store the output in ``result``. .. cpp:function:: int botan_mp_div(botan_mp_t quotient, botan_mp_t remainder, \ botan_mp_t x, botan_mp_t y) Divide ``x`` by ``y`` and store the output in ``quotient`` and ``remainder``. .. cpp:function:: int botan_mp_mod_mul(botan_mp_t result, botan_mp_t x, botan_mp_t y, botan_mp_t mod) Set ``result`` to ``x`` times ``y`` modulo ``mod``. .. cpp:function:: int botan_mp_equal(botan_mp_t x, botan_mp_t y) Return 1 if ``x`` is equal to ``y``, 0 if ``x`` is not equal to ``y`` .. cpp:function:: int botan_mp_is_zero(const botan_mp_t x) Return 1 if ``x`` is equal to zero, otherwise 0. .. cpp:function:: int botan_mp_is_odd(const botan_mp_t x) Return 1 if ``x`` is odd, otherwise 0. .. cpp:function:: int botan_mp_is_even(const botan_mp_t x) Return 1 if ``x`` is even, otherwise 0. .. cpp:function:: int botan_mp_is_positive(const botan_mp_t x) Return 1 if ``x`` is greater than or equal to zero. .. cpp:function:: int botan_mp_is_negative(const botan_mp_t x) Return 1 if ``x`` is less than zero. .. cpp:function:: int botan_mp_to_uint32(const botan_mp_t x, uint32_t* val) If x fits in a 32-bit integer, set val to it and return 0. If x is out of range an error is returned. .. cpp:function:: int botan_mp_cmp(int* result, botan_mp_t x, botan_mp_t y) Three way comparison: set result to -1 if ``x`` is less than ``y``, 0 if ``x`` is equal to ``y``, and 1 if ``x`` is greater than ``y``. .. cpp:function:: int botan_mp_swap(botan_mp_t x, botan_mp_t y) Swap two ``botan_mp_t`` values. .. cpp:function:: int botan_mp_powmod(botan_mp_t out, botan_mp_t base, botan_mp_t exponent, botan_mp_t modulus) Modular exponentiation. .. cpp:function:: int botan_mp_lshift(botan_mp_t out, botan_mp_t in, size_t shift) Left shift by specified bit count, place result in ``out``. .. cpp:function:: int botan_mp_rshift(botan_mp_t out, botan_mp_t in, size_t shift) Right shift by specified bit count, place result in ``out``. .. cpp:function:: int botan_mp_mod_inverse(botan_mp_t out, botan_mp_t in, botan_mp_t modulus) Compute modular inverse. If no modular inverse exists (for instance because ``in`` and ``modulus`` are not relatively prime), then sets ``out`` to -1. .. cpp:function:: int botan_mp_rand_bits(botan_mp_t rand_out, botan_rng_t rng, size_t bits) Create a random ``botan_mp_t`` of the specified bit size. .. cpp:function:: int botan_mp_rand_range(botan_mp_t rand_out, botan_rng_t rng, \ botan_mp_t lower_bound, botan_mp_t upper_bound) Create a random ``botan_mp_t`` within the provided range. .. cpp:function:: int botan_mp_gcd(botan_mp_t out, botan_mp_t x, botan_mp_t y) Compute the greatest common divisor of ``x`` and ``y``. .. cpp:function:: int botan_mp_is_prime(botan_mp_t n, botan_rng_t rng, size_t test_prob) Test if ``n`` is prime. The algorithm used (Miller-Rabin) is probabilistic, set ``test_prob`` to the desired assurance level. For example if ``test_prob`` is 64, then sufficient Miller-Rabin iterations will run to assure there is at most a ``1/2**64`` chance that ``n`` is composite. .. cpp:function:: int botan_mp_get_bit(botan_mp_t n, size_t bit) Returns 0 if the specified bit of ``n`` is not set, 1 if it is set. .. cpp:function:: int botan_mp_set_bit(botan_mp_t n, size_t bit) Set the specified bit of ``n`` .. cpp:function:: int botan_mp_clear_bit(botan_mp_t n, size_t bit) Clears the specified bit of ``n`` Password Hashing ---------------------------------------- .. cpp:function:: int botan_bcrypt_generate(uint8_t* out, size_t* out_len, \ const char* password, \ botan_rng_t rng, \ size_t work_factor, \ uint32_t flags) Create a password hash using Bcrypt. The output buffer *out* should be of length 64 bytes. The output is formatted bcrypt $2a$... .. cpp:function:: int botan_bcrypt_is_valid(const char* pass, const char* hash) Check a previously created password hash. Returns 0 if if this password/hash combination is valid, 1 if the combination is not valid (but otherwise well formed), negative on error. Public Key Creation, Import and Export ---------------------------------------- .. cpp:type:: opaque* botan_privkey_t An opaque data type for a private key. Don't mess with it. .. cpp:function:: int botan_privkey_create(botan_privkey_t* key, \ const char* algo_name, \ const char* algo_params, \ botan_rng_t rng) .. cpp:function:: int botan_privkey_create_rsa(botan_privkey_t* key, botan_rng_t rng, size_t n_bits) .. cpp:function:: int botan_privkey_create_ecdsa(botan_privkey_t* key, botan_rng_t rng, const char* params) .. cpp:function:: int botan_privkey_create_ecdh(botan_privkey_t* key, botan_rng_t rng, const char* params) .. cpp:function:: int botan_privkey_create_mceliece(botan_privkey_t* key, botan_rng_t rng, size_t n, size_t t) .. cpp:function:: int botan_privkey_create_dh(botan_privkey_t* key, botan_rng_t rng, const char* params) .. cpp:function:: int botan_privkey_load(botan_privkey_t* key, botan_rng_t rng, \ const uint8_t bits[], size_t len, \ const char* password) .. cpp:function:: int botan_privkey_destroy(botan_privkey_t key) .. cpp:function:: int botan_privkey_export(botan_privkey_t key, \ uint8_t out[], size_t* out_len, \ uint32_t flags) .. cpp:function:: int botan_privkey_export_encrypted(botan_privkey_t key, \ uint8_t out[], size_t* out_len, \ botan_rng_t rng, \ const char* passphrase, \ const char* encryption_algo, \ uint32_t flags) Deprecated, use ``botan_privkey_export_encrypted_msec`` or ``botan_privkey_export_encrypted_iter`` .. cpp::function:: int botan_privkey_export_encrypted_pbkdf_msec(botan_privkey_t key, uint8_t out[], size_t* out_len, \ botan_rng_t rng, \ const char* passphrase, \ uint32_t pbkdf_msec_runtime, \ size_t* pbkdf_iterations_out, \ const char* cipher_algo, \ const char* pbkdf_algo, \ uint32_t flags); Encrypt a key, running the key derivation function for ``pbkdf_msec_runtime`` milliseconds. Returns the number of iterations used in ``pbkdf_iterations_out``. ``cipher_algo`` must specify a CBC mode cipher (such as "AES-128/CBC") or as a Botan-specific extension a GCM mode may be used. .. cpp::function:: int botan_privkey_export_encrypted_pbkdf_iter(botan_privkey_t key, \ uint8_t out[], size_t* out_len, \ botan_rng_t rng, \ const char* passphrase, \ size_t pbkdf_iterations, \ const char* cipher_algo, \ const char* pbkdf_algo, \ uint32_t flags); Encrypt a private key. The PBKDF function runs for the specified number of iterations. At least 100,000 is recommended. .. cpp:type:: opaque* botan_pubkey_t An opaque data type for a public key. Don't mess with it. .. cpp:function:: int botan_pubkey_load(botan_pubkey_t* key, const uint8_t bits[], size_t len) .. cpp:function:: int botan_privkey_export_pubkey(botan_pubkey_t* out, botan_privkey_t in) .. cpp:function:: int botan_pubkey_export(botan_pubkey_t key, uint8_t out[], size_t* out_len, uint32_t flags) .. cpp:function:: int botan_pubkey_algo_name(botan_pubkey_t key, char out[], size_t* out_len) .. cpp:function:: int botan_pubkey_estimated_strength(botan_pubkey_t key, size_t* estimate) .. cpp:function:: int botan_pubkey_fingerprint(botan_pubkey_t key, const char* hash, \ uint8_t out[], size_t* out_len) .. cpp:function:: int botan_pubkey_destroy(botan_pubkey_t key) .. cpp:function:: int botan_pubkey_get_field(botan_mp_t output, \ botan_pubkey_t key, \ const char* field_name) Read an algorithm specific field from the public key object, placing it into output. For example "n" or "e" for RSA keys or "p", "q", "g", and "y" for DSA keys. .. cpp:function:: int botan_privkey_get_field(botan_mp_t output, \ botan_privkey_t key, \ const char* field_name) Read an algorithm specific field from the private key object, placing it into output. For example "p" or "q" for RSA keys, or "x" for DSA keys or ECC keys. RSA specific functions ---------------------------------------- .. cpp:function:: int botan_privkey_rsa_get_p(botan_mp_t p, botan_privkey_t rsa_key) Set ``p`` to the first RSA prime. .. cpp:function:: int botan_privkey_rsa_get_q(botan_mp_t q, botan_privkey_t rsa_key) Set ``q`` to the second RSA prime. .. cpp:function:: int botan_privkey_rsa_get_d(botan_mp_t d, botan_privkey_t rsa_key) Set ``d`` to the RSA private exponent. .. cpp:function:: int botan_privkey_rsa_get_n(botan_mp_t n, botan_privkey_t rsa_key) Set ``n`` to the RSA modulus. .. cpp:function:: int botan_privkey_rsa_get_e(botan_mp_t e, botan_privkey_t rsa_key) Set ``e`` to the RSA public exponent. .. cpp:function:: int botan_pubkey_rsa_get_e(botan_mp_t e, botan_pubkey_t rsa_key) Set ``e`` to the RSA public exponent. .. cpp:function:: int botan_pubkey_rsa_get_n(botan_mp_t n, botan_pubkey_t rsa_key) Set ``n`` to the RSA modulus. .. cpp:function:: int botan_privkey_load_rsa(botan_privkey_t* key, \ botan_mp_t p, botan_mp_t q, botan_mp_t e) Initialize a private RSA key using parameters p, q, and e. .. cpp:function:: int botan_pubkey_load_rsa(botan_pubkey_t* key, \ botan_mp_t n, botan_mp_t e) Initialize a public RSA key using parameters n and e. DSA specific functions ---------------------------------------- .. cpp:function:: int botan_privkey_load_dsa(botan_privkey_t* key, \ botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t x) Initialize a private DSA key using group parameters p, q, and g and private key x. .. cpp:function:: int botan_pubkey_load_dsa(botan_pubkey_t* key, \ botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t y) Initialize a private DSA key using group parameters p, q, and g and public key y. ElGamal specific functions ---------------------------------------- .. cpp:function:: int botan_privkey_load_elgamal(botan_privkey_t* key, \ botan_mp_t p, botan_mp_t g, botan_mp_t x) Initialize a private ElGamal key using group parameters p and g and private key x. .. cpp:function:: int botan_pubkey_load_elgamal(botan_pubkey_t* key, \ botan_mp_t p, botan_mp_t g, botan_mp_t y) Initialize a public ElGamal key using group parameters p and g and public key y. Diffie-Hellman specific functions ---------------------------------------- .. cpp:function:: int botan_privkey_load_dh(botan_privkey_t* key, \ botan_mp_t p, botan_mp_t g, botan_mp_t x) Initialize a private Diffie-Hellman key using group parameters p and g and private key x. .. cpp:function:: int botan_pubkey_load_dh(botan_pubkey_t* key, \ botan_mp_t p, botan_mp_t g, botan_mp_t y) Initialize a public Diffie-Hellman key using group parameters p and g and public key y. Public Key Encryption/Decryption ---------------------------------------- .. cpp:type:: opaque* botan_pk_op_encrypt_t An opaque data type for an encryption operation. Don't mess with it. .. cpp:function:: int botan_pk_op_encrypt_create(botan_pk_op_encrypt_t* op, \ botan_pubkey_t key, \ const char* padding, \ uint32_t flags) .. cpp:function:: int botan_pk_op_encrypt_destroy(botan_pk_op_encrypt_t op) .. cpp:function:: int botan_pk_op_encrypt(botan_pk_op_encrypt_t op, \ botan_rng_t rng, \ uint8_t out[], size_t* out_len, \ const uint8_t plaintext[], size_t plaintext_len) .. cpp:type:: opaque* botan_pk_op_decrypt_t An opaque data type for a decryption operation. Don't mess with it. .. cpp:function:: int botan_pk_op_decrypt_create(botan_pk_op_decrypt_t* op, \ botan_privkey_t key, \ const char* padding, \ uint32_t flags) .. cpp:function:: int botan_pk_op_decrypt_destroy(botan_pk_op_decrypt_t op) .. cpp:function:: int botan_pk_op_decrypt(botan_pk_op_decrypt_t op, \ uint8_t out[], size_t* out_len, \ uint8_t ciphertext[], size_t ciphertext_len) Signatures ---------------------------------------- .. cpp:type:: opaque* botan_pk_op_sign_t An opaque data type for a signature generation operation. Don't mess with it. .. cpp:function:: int botan_pk_op_sign_create(botan_pk_op_sign_t* op, \ botan_privkey_t key, \ const char* hash_and_padding, \ uint32_t flags) .. cpp:function:: int botan_pk_op_sign_destroy(botan_pk_op_sign_t op) .. cpp:function:: int botan_pk_op_sign_update(botan_pk_op_sign_t op, \ const uint8_t in[], size_t in_len) .. cpp:function:: int botan_pk_op_sign_finish(botan_pk_op_sign_t op, botan_rng_t rng, \ uint8_t sig[], size_t* sig_len) .. cpp:type:: opaque* botan_pk_op_verify_t An opaque data type for a signature verification operation. Don't mess with it. .. cpp:function:: int botan_pk_op_verify_create(botan_pk_op_verify_t* op, \ botan_pubkey_t key, \ const char* hash_and_padding, \ uint32_t flags) .. cpp:function:: int botan_pk_op_verify_destroy(botan_pk_op_verify_t op) .. cpp:function:: int botan_pk_op_verify_update(botan_pk_op_verify_t op, \ const uint8_t in[], size_t in_len) .. cpp:function:: int botan_pk_op_verify_finish(botan_pk_op_verify_t op, \ const uint8_t sig[], size_t sig_len) Key Agreement ---------------------------------------- .. cpp:type:: opaque* botan_pk_op_ka_t An opaque data type for a key agreement operation. Don't mess with it. .. cpp:function:: int botan_pk_op_key_agreement_create(botan_pk_op_ka_t* op, \ botan_privkey_t key, \ const char* kdf, \ uint32_t flags) .. cpp:function:: int botan_pk_op_key_agreement_destroy(botan_pk_op_ka_t op) .. cpp:function:: int botan_pk_op_key_agreement_export_public(botan_privkey_t key, \ uint8_t out[], size_t* out_len) .. cpp:function:: int botan_pk_op_key_agreement(botan_pk_op_ka_t op, \ uint8_t out[], size_t* out_len, \ const uint8_t other_key[], size_t other_key_len, \ const uint8_t salt[], size_t salt_len) .. cpp:function:: int botan_mceies_encrypt(botan_pubkey_t mce_key, \ botan_rng_t rng, \ const char* aead, \ const uint8_t pt[], size_t pt_len, \ const uint8_t ad[], size_t ad_len, \ uint8_t ct[], size_t* ct_len) .. cpp:function:: int botan_mceies_decrypt(botan_privkey_t mce_key, \ const char* aead, \ const uint8_t ct[], size_t ct_len, \ const uint8_t ad[], size_t ad_len, \ uint8_t pt[], size_t* pt_len) X.509 Certificates ---------------------------------------- .. cpp:type:: opaque* botan_x509_cert_t An opaque data type for an X.509 certificate. Don't mess with it. .. cpp:function:: int botan_x509_cert_load(botan_x509_cert_t* cert_obj, \ const uint8_t cert[], size_t cert_len) .. cpp:function:: int botan_x509_cert_load_file(botan_x509_cert_t* cert_obj, const char* filename) .. cpp:function:: int botan_x509_cert_destroy(botan_x509_cert_t cert) .. cpp:function:: int botan_x509_cert_gen_selfsigned(botan_x509_cert_t* cert, \ botan_privkey_t key, \ botan_rng_t rng, \ const char* common_name, \ const char* org_name) .. cpp:function:: int botan_x509_cert_get_time_starts(botan_x509_cert_t cert, char out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_time_expires(botan_x509_cert_t cert, char out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_fingerprint(botan_x509_cert_t cert, const char* hash, uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_serial_number(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_authority_key_id(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_subject_key_id(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_path_verify(botan_x509_cert_t cert, \ const char* ca_dir) .. cpp:function:: int botan_x509_cert_get_public_key_bits(botan_x509_cert_t cert, \ uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_public_key(botan_x509_cert_t cert, botan_pubkey_t* key) .. cpp:function:: int botan_x509_cert_get_issuer_dn(botan_x509_cert_t cert, \ const char* key, size_t index, \ uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_get_subject_dn(botan_x509_cert_t cert, \ const char* key, size_t index, \ uint8_t out[], size_t* out_len) .. cpp:function:: int botan_x509_cert_to_string(botan_x509_cert_t cert, char out[], size_t* out_len) .. cpp:enum:: botan_x509_cert_key_constraints Certificate key usage constraints. Allowed values: `NO_CONSTRAINTS`, `DIGITAL_SIGNATURE`, `NON_REPUDIATION`, `KEY_ENCIPHERMENT`, `DATA_ENCIPHERMENT`, `KEY_AGREEMENT`, `KEY_CERT_SIGN`, `CRL_SIGN`, `ENCIPHER_ONLY`, `DECIPHER_ONLY`. .. cpp:function:: int botan_x509_cert_allowed_usage(botan_x509_cert_t cert, unsigned int key_usage) botan-2.4.0/doc/manual/filters.rst000066400000000000000000000724521322470703100170550ustar00rootroot00000000000000 Pipe/Filter Message Processing ======================================== .. note:: The system described below provides a message processing system with a straightforward API. However it makes many extra memory copies and allocations than would otherwise be required, and also tends to make applications using it somewhat opaque because it is not obvious what this or that Pipe& object actually does (type of operation, number of messages output (if any!), and so on), whereas using say a HashFunction or AEAD_Mode provides a much better idea in the code of what operation is occuring. This filter interface is no longer used within the library itself (outside a few dusty corners) and will likely not see any further major development. However it will remain included because the API is often convenient and many applications use it. Many common uses of cryptography involve processing one or more streams of data. Botan provides services that make setting up data flows through various operations, such as compression, encryption, and base64 encoding. Each of these operations is implemented in what are called *filters* in Botan. A set of filters are created and placed into a *pipe*, and information "flows" through the pipe until it reaches the end, where the output is collected for retrieval. If you're familiar with the Unix shell environment, this design will sound quite familiar. Here is an example that uses a pipe to base64 encode some strings:: Pipe pipe(new Base64_Encoder); // pipe owns the pointer pipe.start_msg(); pipe.write("message 1"); pipe.end_msg(); // flushes buffers, increments message number // process_msg(x) is start_msg() && write(x) && end_msg() pipe.process_msg("message2"); std::string m1 = pipe.read_all_as_string(0); // "message1" std::string m2 = pipe.read_all_as_string(1); // "message2" Bytestreams in the pipe are grouped into messages; blocks of data that are processed in an identical fashion (ie, with the same sequence of filter operations). Messages are delimited by calls to ``start_msg`` and ``end_msg``. Each message in a pipe has its own identifier, which currently is an integer that increments up from zero. The ``Base64_Encoder`` was allocated using ``new``; but where was it deallocated? When a filter object is passed to a ``Pipe``, the pipe takes ownership of the object, and will deallocate it when it is no longer needed. There are two different ways to make use of messages. One is to send several messages through a ``Pipe`` without changing the ``Pipe`` configuration, so you end up with a sequence of messages; one use of this would be to send a sequence of identically encrypted UDP packets, for example (note that the *data* need not be identical; it is just that each is encrypted, encoded, signed, etc in an identical fashion). Another is to change the filters that are used in the ``Pipe`` between each message, by adding or removing filters; functions that let you do this are documented in the Pipe API section. Botan has about 40 filters that perform different operations on data. Here's code that uses one of them to encrypt a string with AES:: AutoSeeded_RNG rng, SymmetricKey key(rng, 16); // a random 128-bit key InitializationVector iv(rng, 16); // a random 128-bit IV // The algorithm we want is specified by a string Pipe pipe(get_cipher("AES-128/CBC", key, iv, ENCRYPTION)); pipe.process_msg("secrets"); pipe.process_msg("more secrets"); secure_vector c1 = pipe.read_all(0); uint8_t c2[4096] = { 0 }; size_t got_out = pipe.read(c2, sizeof(c2), 1); // use c2[0...got_out] Note the use of ``AutoSeeded_RNG``, which is a random number generator. If you want to, you can explicitly set up the random number generators and entropy sources you want to, however for 99% of cases ``AutoSeeded_RNG`` is preferable. ``Pipe`` also has convenience methods for dealing with ``std::iostream``. Here is an example of those, using the ``Bzip_Compression`` filter (included as a module; if you have bzlib available, check the build instructions for how to enable it) to compress a file:: std::ifstream in("data.bin", std::ios::binary) std::ofstream out("data.bin.bz2", std::ios::binary) Pipe pipe(new Bzip_Compression); pipe.start_msg(); in >> pipe; pipe.end_msg(); out << pipe; However there is a hitch to the code above; the complete contents of the compressed data will be held in memory until the entire message has been compressed, at which time the statement ``out << pipe`` is executed, and the data is freed as it is read from the pipe and written to the file. But if the file is very large, we might not have enough physical memory (or even enough virtual memory!) for that to be practical. So instead of storing the compressed data in the pipe for reading it out later, we divert it directly to the file:: std::ifstream in("data.bin", std::ios::binary) std::ofstream out("data.bin.bz2", std::ios::binary) Pipe pipe(new Bzip_Compression, new DataSink_Stream(out)); pipe.start_msg(); in >> pipe; pipe.end_msg(); This is the first code we've seen so far that uses more than one filter in a pipe. The output of the compressor is sent to the ``DataSink_Stream``. Anything written to a ``DataSink_Stream`` is written to a file; the filter produces no output. As soon as the compression algorithm finishes up a block of data, it will send it along to the sink filter, which will immediately write it to the stream; if you were to call ``pipe.read_all()`` after ``pipe.end_msg()``, you'd get an empty vector out. This is particularly useful for cases where you are processing a large amount of data, as it means you don't have to store everything in memory at once. Here's an example using two computational filters:: AutoSeeded_RNG rng, SymmetricKey key(rng, 32); InitializationVector iv(rng, 16); Pipe encryptor(get_cipher("AES/CBC/PKCS7", key, iv, ENCRYPTION), new Base64_Encoder); encryptor.start_msg(); file >> encryptor; encryptor.end_msg(); // flush buffers, complete computations std::cout << encryptor; You can read from a pipe while you are still writing to it, which allows you to bound the amount of memory that is in use at any one time. A common idiom for this is:: pipe.start_msg(); std::vector buffer(4096); // arbitrary size while(infile.good()) { infile.read((char*)&buffer[0], buffer.size()); const size_t got_from_infile = infile.gcount(); pipe.write(buffer, got_from_infile); if(infile.eof()) pipe.end_msg(); while(pipe.remaining() > 0) { const size_t buffered = pipe.read(buffer, buffer.size()); outfile.write((const char*)&buffer[0], buffered); } } if(infile.bad() || (infile.fail() && !infile.eof())) throw Some_Exception(); Fork --------------------------------- It is common that you might receive some data and want to perform more than one operation on it (ie, encrypt it with Serpent and calculate the SHA-256 hash of the plaintext at the same time). That's where ``Fork`` comes in. ``Fork`` is a filter that takes input and passes it on to *one or more* filters that are attached to it. ``Fork`` changes the nature of the pipe system completely: instead of being a linked list, it becomes a tree or acyclic graph. Each filter in the fork is given its own output buffer, and thus its own message. For example, if you had previously written two messages into a pipe, then you start a new one with a fork that has three paths of filter's inside it, you add three new messages to the pipe. The data you put into the pipe is duplicated and sent into each set of filter and the eventual output is placed into a dedicated message slot in the pipe. Messages in the pipe are allocated in a depth-first manner. This is only interesting if you are using more than one fork in a single pipe. As an example, consider the following:: Pipe pipe(new Fork( new Fork( new Base64_Encoder, new Fork( NULL, new Base64_Encoder ) ), new Hex_Encoder ) ); In this case, message 0 will be the output of the first ``Base64_Encoder``, message 1 will be a copy of the input (see below for how fork interprets NULL pointers), message 2 will be the output of the second ``Base64_Encoder``, and message 3 will be the output of the ``Hex_Encoder``. This results in message numbers being allocated in a top to bottom fashion, when looked at on the screen. However, note that there could be potential for bugs if this is not anticipated. For example, if your code is passed a filter, and you assume it is a "normal" one that only uses one message, your message offsets would be wrong, leading to some confusion during output. If Fork's first argument is a null pointer, but a later argument is not, then Fork will feed a copy of its input directly through. Here's a case where that is useful:: // have std::string ciphertext, auth_code, key, iv, mac_key; Pipe pipe(new Base64_Decoder, get_cipher("AES-128", key, iv, DECRYPTION), new Fork( 0, // this message gets plaintext new MAC_Filter("HMAC(SHA-1)", mac_key) ) ); pipe.process_msg(ciphertext); std::string plaintext = pipe.read_all_as_string(0); secure_vector mac = pipe.read_all(1); if(mac != auth_code) error(); Here we wanted to not only decrypt the message, but send the decrypted text through an additional computation, in order to compute the authentication code. Any filters that are attached to the pipe after the fork are implicitly attached onto the first branch created by the fork. For example, let's say you created this pipe:: Pipe pipe(new Fork(new Hash_Filter("SHA-256"), new Hash_Filter("SHA-512")), new Hex_Encoder); And then called ``start_msg``, inserted some data, then ``end_msg``. Then ``pipe`` would contain two messages. The first one (message number 0) would contain the SHA-256 sum of the input in hex encoded form, and the other would contain the SHA-512 sum of the input in raw binary. In many situations you'll want to perform a sequence of operations on multiple branches of the fork; in which case, use the filter described in :ref:`chain`. .. _chain: Chain --------------------------------- A ``Chain`` filter creates a chain of filters and encapsulates them inside a single filter (itself). This allows a sequence of filters to become a single filter, to be passed into or out of a function, or to a ``Fork`` constructor. You can call ``Chain``'s constructor with up to four ``Filter`` pointers (they will be added in order), or with an array of filter pointers and a ``size_t`` that tells ``Chain`` how many filters are in the array (again, they will be attached in order). Here's the example from the last section, using chain instead of relying on the implicit passthrough the other version used:: Pipe pipe(new Fork( new Chain(new Hash_Filter("SHA-256"), new Hex_Encoder), new Hash_Filter("SHA-512") ) ); Sources and Sinks ---------------------------------------- Data Sources ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A ``DataSource`` is a simple abstraction for a thing that stores bytes. This type is used heavily in the areas of the API related to ASN.1 encoding/decoding. The following types are ``DataSource``: ``Pipe``, ``SecureQueue``, and a couple of special purpose ones: ``DataSource_Memory`` and ``DataSource_Stream``. You can create a ``DataSource_Memory`` with an array of bytes and a length field. The object will make a copy of the data, so you don't have to worry about keeping that memory allocated. This is mostly for internal use, but if it comes in handy, feel free to use it. A ``DataSource_Stream`` is probably more useful than the memory based one. Its constructors take either a ``std::istream`` or a ``std::string``. If it's a stream, the data source will use the ``istream`` to satisfy read requests (this is particularly useful to use with ``std::cin``). If the string version is used, it will attempt to open up a file with that name and read from it. Data Sinks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A ``DataSink`` (in ``data_snk.h``) is a ``Filter`` that takes arbitrary amounts of input, and produces no output. This means it's doing something with the data outside the realm of what ``Filter``/``Pipe`` can handle, for example, writing it to a file (which is what the ``DataSink_Stream`` does). There is no need for ``DataSink``s that write to a ``std::string`` or memory buffer, because ``Pipe`` can handle that by itself. Here's a quick example of using a ``DataSink``, which encrypts ``in.txt`` and sends the output to ``out.txt``. There is no explicit output operation; the writing of ``out.txt`` is implicit:: DataSource_Stream in("in.txt"); Pipe pipe(get_cipher("AES-128/CTR-BE", key, iv), new DataSink_Stream("out.txt")); pipe.process_msg(in); A real advantage of this is that even if "in.txt" is large, only as much memory is needed for internal I/O buffers will be used. The Pipe API --------------------------------- Initializing Pipe ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, ``Pipe`` will do nothing at all; any input placed into the ``Pipe`` will be read back unchanged. Obviously, this has limited utility, and presumably you want to use one or more filters to somehow process the data. First, you can choose a set of filters to initialize the ``Pipe`` via the constructor. You can pass it either a set of up to four filter pointers, or a pre-defined array and a length:: Pipe pipe1(new Filter1(/*args*/), new Filter2(/*args*/), new Filter3(/*args*/), new Filter4(/*args*/)); Pipe pipe2(new Filter1(/*args*/), new Filter2(/*args*/)); Filter* filters[5] = { new Filter1(/*args*/), new Filter2(/*args*/), new Filter3(/*args*/), new Filter4(/*args*/), new Filter5(/*args*/) /* more if desired... */ }; Pipe pipe3(filters, 5); This is by far the most common way to initialize a ``Pipe``. However, occasionally a more flexible initialization strategy is necessary; this is supported by 4 member functions. These functions may only be used while the pipe in question is not in use; that is, either before calling ``start_msg``, or after ``end_msg`` has been called (and no new calls to ``start_msg`` have been made yet). .. cpp:function:: void Pipe::prepend(Filter* filter) Calling ``prepend`` will put the passed filter first in the list of transformations. For example, if you prepend a filter implementing encryption, and the pipe already had a filter that hex encoded the input, then the next message processed would be first encrypted, and *then* hex encoded. .. cpp:function:: void Pipe::append(Filter* filter) Like ``prepend``, but places the filter at the end of the message flow. This doesn't always do what you expect if there is a fork. .. cpp:function:: void Pipe::pop() Removes the first filter in the flow. .. cpp:function:: void Pipe::reset() Removes all the filters that the pipe currently holds - it is reset to an empty/no-op state. Any data that is being retained by the pipe is retained after a ``reset``, and ``reset`` does not affect message numbers (discussed later). Giving Data to a Pipe ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Input to a ``Pipe`` is delimited into messages, which can be read from independently (ie, you can read 5 bytes from one message, and then all of another message, without either read affecting any other messages). .. cpp:function:: void Pipe::start_msg() Starts a new message; if a message was already running, an exception is thrown. After this function returns, you can call ``write``. .. cpp:function:: void Pipe::write(const uint8_t* input, size_t length) .. cpp:function:: void Pipe::write(const std::vector& input) .. cpp:function:: void Pipe::write(const std::string& input) .. cpp:function:: void Pipe::write(DataSource& input) .. cpp:function:: void Pipe::write(uint8_t input) All versions of ``write`` write the input into the filter sequence. If a message is not currently active, an exception is thrown. .. cpp:function:: void Pipe::end_msg() End the currently active message Sometimes, you may want to do only a single write per message. In this case, you can use the ``process_msg`` series of functions, which start a message, write their argument into the pipe, and then end the message. In this case you would not make any explicit calls to ``start_msg``/``end_msg``. Pipes can also be used with the ``>>`` operator, and will accept a ``std::istream``, or on Unix systems with the ``fd_unix`` module, a Unix file descriptor. In either case, the entire contents of the file will be read into the pipe. Getting Output from a Pipe ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Retrieving the processed data from a pipe is a bit more complicated, for various reasons. The pipe will separate each message into a separate buffer, and you have to retrieve data from each message independently. Each of the reader functions has a final parameter that specifies what message to read from. If this parameter is set to ``Pipe::DEFAULT_MESSAGE``, it will read the current default message (``DEFAULT_MESSAGE`` is also the default value of this parameter). Functions in ``Pipe`` related to reading include: .. cpp:function:: size_t Pipe::read(uint8_t* out, size_t len) Reads up to ``len`` bytes into ``out``, and returns the number of bytes actually read. .. cpp:function:: size_t Pipe::peek(uint8_t* out, size_t len) Acts exactly like `read`, except the data is not actually read; the next read will return the same data. .. cpp:function:: secure_vector Pipe::read_all() Reads the entire message into a buffer and returns it .. cpp:function:: std::string Pipe::read_all_as_string() Like ``read_all``, but it returns the data as a ``std::string``. No encoding is done; if the message contains raw binary, so will the string. .. cpp:function:: size_t Pipe::remaining() Returns how many bytes are left in the message .. cpp:function:: Pipe::message_id Pipe::default_msg() Returns the current default message number .. cpp:function:: Pipe::message_id Pipe::message_count() Returns the total number of messages currently in the pipe .. cpp:function:: Pipe::set_default_msg(Pipe::message_id msgno) Sets the default message number (which must be a valid message number for that pipe). The ability to set the default message number is particularly important in the case of using the file output operations (``<<`` with a ``std::ostream`` or Unix file descriptor), because there is no way to specify the message explicitly when using the output operator. Pipe I/O for Unix File Descriptors ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is a minor feature, but it comes in handy sometimes. In all installations of the library, Botan's ``Pipe`` object overloads the ``<<`` and ``>>`` operators for C++ iostream objects, which is usually more than sufficient for doing I/O. However, there are cases where the iostream hierarchy does not map well to local 'file types', so there is also the ability to do I/O directly with Unix file descriptors. This is most useful when you want to read from or write to something like a TCP or Unix-domain socket, or a pipe, since for simple file access it's usually easier to just use C++'s file streams. If ``BOTAN_EXT_PIPE_UNIXFD_IO`` is defined, then you can use the overloaded I/O operators with Unix file descriptors. For an example of this, check out the ``hash_fd`` example, included in the Botan distribution. Filter Catalog --------------------------------- This section documents most of the useful filters included in the library. Keyed Filters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A few sections ago, it was mentioned that ``Pipe`` can process multiple messages, treating each of them the same. Well, that was a bit of a lie. There are some algorithms (in particular, block ciphers not in ECB mode, and all stream ciphers) that change their state as data is put through them. Naturally, you might well want to reset the keys or (in the case of block cipher modes) IVs used by such filters, so multiple messages can be processed using completely different keys, or new IVs, or new keys and IVs, or whatever. And in fact, even for a MAC or an ECB block cipher, you might well want to change the key used from message to message. Enter ``Keyed_Filter``, which acts as an abstract interface for any filter that is uses keys: block cipher modes, stream ciphers, MACs, and so on. It has two functions, ``set_key`` and ``set_iv``. Calling ``set_key`` will set (or reset) the key used by the algorithm. Setting the IV only makes sense in certain algorithms -- a call to ``set_iv`` on an object that doesn't support IVs will cause an exception. You must call ``set_key`` *before* calling ``set_iv``. Here's a example:: Keyed_Filter *aes, *hmac; Pipe pipe(new Base64_Decoder, // Note the assignments to the cast and hmac variables aes = get_cipher("AES-128/CBC", aes_key, iv), new Fork( 0, // Read the section 'Fork' to understand this new Chain( hmac = new MAC_Filter("HMAC(SHA-1)", mac_key, 12), new Base64_Encoder ) ) ); pipe.start_msg(); // use pipe for a while, decrypt some stuff, derive new keys and IVs pipe.end_msg(); aes->set_key(aes_key2); aes->set_iv(iv2); hmac->set_key(mac_key2); pipe.start_msg(); // use pipe for some other things pipe.end_msg(); There are some requirements to using ``Keyed_Filter`` that you must follow. If you call ``set_key`` or ``set_iv`` on a filter that is owned by a ``Pipe``, you must do so while the ``Pipe`` is "unlocked". This refers to the times when no messages are being processed by ``Pipe`` -- either before ``Pipe``'s ``start_msg`` is called, or after ``end_msg`` is called (and no new call to ``start_msg`` has happened yet). Doing otherwise will result in undefined behavior, probably silently getting invalid output. And remember: if you're resetting both values, reset the key *first*. Cipher Filters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Getting a hold of a ``Filter`` implementing a cipher is very easy. Make sure you're including the header ``lookup.h``, and then call ``get_cipher``. You will pass the return value directly into a ``Pipe``. There are a couple different functions which do varying levels of initialization: .. cpp:function:: Keyed_Filter* get_cipher(std::string cipher_spec, \ SymmetricKey key, InitializationVector iv, Cipher_Dir dir) .. cpp:function:: Keyed_Filter* get_cipher(std::string cipher_spec, \ SymmetricKey key, Cipher_Dir dir) The version that doesn't take an IV is useful for things that don't use them, like block ciphers in ECB mode, or most stream ciphers. If you specify a cipher spec that does want a IV, and you use the version that doesn't take one, an exception will be thrown. The ``dir`` argument can be either ``ENCRYPTION`` or ``DECRYPTION``. The cipher_spec is a string that specifies what cipher is to be used. The general syntax for "cipher_spec" is "STREAM_CIPHER", "BLOCK_CIPHER/MODE", or "BLOCK_CIPHER/MODE/PADDING". In the case of stream ciphers, no mode is necessary, so just the name is sufficient. A block cipher requires a mode of some sort, which can be "ECB", "CBC", "CFB(n)", "OFB", "CTR-BE", or "EAX(n)". The argument to CFB mode is how many bits of feedback should be used. If you just use "CFB" with no argument, it will default to using a feedback equal to the block size of the cipher. EAX mode also takes an optional bit argument, which tells EAX how large a tag size to use~--~generally this is the size of the block size of the cipher, which is the default if you don't specify any argument. In the case of the ECB and CBC modes, a padding method can also be specified. If it is not supplied, ECB defaults to not padding, and CBC defaults to using PKCS #5/#7 compatible padding. The padding methods currently available are "NoPadding", "PKCS7", "OneAndZeros", and "CTS". CTS padding is currently only available for CBC mode, but the others can also be used in ECB mode. Some example "cipher_spec arguments are: "AES-128/CBC", "Blowfish/CTR-BE", "Serpent/XTS", and "AES-256/EAX". "CTR-BE" refers to counter mode where the counter is incremented as if it were a big-endian encoded integer. This is compatible with most other implementations, but it is possible some will use the incompatible little endian convention. This version would be denoted as "CTR-LE" if it were supported. "EAX" is a new cipher mode designed by Wagner, Rogaway, and Bellare. It is an authenticated cipher mode (that is, no separate authentication is needed), has provable security, and is free from patent entanglements. It runs about half as fast as most of the other cipher modes (like CBC, OFB, or CTR), which is not bad considering you don't need to use an authentication code. Hashes and MACs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Hash functions and MACs don't need anything special when it comes to filters. Both just take their input and produce no output until ``end_msg`` is called, at which time they complete the hash or MAC and send that as output. These filters take a string naming the type to be used. If for some reason you name something that doesn't exist, an exception will be thrown. .. cpp:function:: Hash_Filter::Hash_Filter(std::string hash, size_t outlen = 0) This constructor creates a filter that hashes its input with ``hash``. When ``end_msg`` is called on the owning pipe, the hash is completed and the digest is sent on to the next filter in the pipeline. The parameter ``outlen`` specifies how many bytes of the hash output will be passed along to the next filter when ``end_msg`` is called. By default, it will pass the entire hash. Examples of names for ``Hash_Filter`` are "SHA-1" and "Whirlpool". .. cpp:function:: MAC_Filter::MAC_Filter(std::string mac, SymmetricKey key, size_t outlen = 0) This constructor takes a name for a mac, such as "HMAC(SHA-1)" or "CMAC(AES-128)", along with a key to use. The optional ``outlen`` works the same as in ``Hash_Filter``. Encoders ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Often you want your data to be in some form of text (for sending over channels that aren't 8-bit clean, printing it, etc). The filters ``Hex_Encoder`` and ``Base64_Encoder`` will convert arbitrary binary data into hex or base64 formats. Not surprisingly, you can use ``Hex_Decoder`` and ``Base64_Decoder`` to convert it back into its original form. Both of the encoders can take a few options about how the data should be formatted (all of which have defaults). The first is a ``bool`` which says if the encoder should insert line breaks. This defaults to false. Line breaks don't matter either way to the decoder, but it makes the output a bit more appealing to the human eye, and a few transport mechanisms (notably some email systems) limit the maximum line length. The second encoder option is an integer specifying how long such lines will be (obviously this will be ignored if line-breaking isn't being used). The default tends to be in the range of 60-80 characters, but is not specified. If you want a specific value, set it. Otherwise the default should be fine. Lastly, ``Hex_Encoder`` takes an argument of type ``Case``, which can be ``Uppercase`` or ``Lowercase`` (default is ``Uppercase``). This specifies what case the characters A-F should be output as. The base64 encoder has no such option, because it uses both upper and lower case letters for its output. You can find the declarations for these types in ``hex_filt.h`` and ``b64_filt.h``. Writing New Filters --------------------------------- The system of filters and pipes was designed in an attempt to make it as simple as possible to write new filter types. There are four functions that need to be implemented by a class deriving from ``Filter``: .. cpp:function:: void Filter::write(const uint8_t* input, size_t length) This function is what is called when a filter receives input for it to process. The filter is not required to process the data right away; many filters buffer their input before producing any output. A filter will usually have ``write`` called many times during its lifetime. .. cpp:function:: void Filter::send(uint8_t* output, size_t length) Eventually, a filter will want to produce some output to send along to the next filter in the pipeline. It does so by calling ``send`` with whatever it wants to send along to the next filter. There is also a version of ``send`` taking a single byte argument, as a convenience. .. cpp:function:: void Filter::start_msg() Implementing this function is optional. Implement it if your filter would like to do some processing or setup at the start of each message, such as allocating a data structure. .. cpp:function:: void Filter::end_msg() Implementing this function is optional. It is called when it has been requested that filters finish up their computations. The filter should finish up with whatever computation it is working on (for example, a compressing filter would flush the compressor and ``send`` the final block), and empty any buffers in preparation for processing a fresh new set of input. Additionally, if necessary, filters can define a constructor that takes any needed arguments, and a destructor to deal with deallocating memory, closing files, etc. botan-2.4.0/doc/manual/fpe.rst000066400000000000000000000051251322470703100161500ustar00rootroot00000000000000Format Preserving Encryption ======================================== .. versionadded:: 1.9.17 Format preserving encryption (FPE) refers to a set of techniques for encrypting data such that the ciphertext has the same format as the plaintext. For instance, you can use FPE to encrypt credit card numbers with valid checksums such that the ciphertext is also an credit card number with a valid checksum, or similiarly for bank account numbers, US Social Security numbers, or even more general mappings like English words onto other English words. The scheme currently implemented in botan is called FE1, and described in the paper `Format Preserving Encryption `_ by Mihir Bellare, Thomas Ristenpart, Phillip Rogaway, and Till Stegers. FPE is an area of ongoing standardization and it is likely that other schemes will be included in the future. To use FE1, use these functions, from ``fpe_fe1.h``: .. cpp:function:: BigInt FPE::fe1_encrypt(const BigInt& n, const BigInt& X, \ const SymmetricKey& key, const std::vector& tweak) Encrypts the value *X* modulo the value *n* using the *key* and *tweak* specified. Returns an integer less than *n*. The *tweak* is a value that does not need to be secret that parameterizes the encryption function. For instance, if you were encrypting a database column with a single key, you could use a per-row-unique integer index value as the tweak. To encrypt an arbitrary value using FE1, you need to use a ranking method. Basically, the idea is to assign an integer to every value you might encrypt. For instance, a 16 digit credit card number consists of a 15 digit code plus a 1 digit checksum. So to encrypt a credit card number, you first remove the checksum, encrypt the 15 digit value modulo 10\ :sup:`15`, and then calculate what the checksum is for the new (ciphertext) number. .. cpp:function:: BigInt FPE::fe1_decrypt(const BigInt& n, const BigInt& X, \ const SymmetricKey& key, const std::vector& tweak) Decrypts an FE1 ciphertext produced by :cpp:func:`fe1_encrypt`; the *n*, *key* and *tweak* should be the same as that provided to the encryption function. Returns the plaintext. Note that there is not any implicit authentication or checking of data, so if you provide an incorrect key or tweak the result is simply a random integer. This example encrypts a credit card number with a valid `Luhn checksum `_ to another number with the same format, including a correct checksum. .. literalinclude:: ../../src/cli/cc_enc.cpp botan-2.4.0/doc/manual/fuzzing.rst000066400000000000000000000053301322470703100170700ustar00rootroot00000000000000Fuzzing The Library ============================ Botan comes with a set of fuzzing endpoints which can be used to test the library. .. highlight:: shell Fuzzing with libFuzzer ------------------------ To fuzz with libFuzzer (https://llvm.org/docs/LibFuzzer.html), you'll first need to compile libFuzzer:: $ svn co https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/fuzzer libFuzzer $ cd libFuzzer && clang -c -g -O2 -std=c++11 *.cpp $ ar cr libFuzzer.a libFuzzer/*.o Then build the fuzzers:: $ ./configure.py --cc=clang --build-fuzzer=libfuzzer --unsafe-fuzzer-mode \ --cc-abi-flags='-fsanitize=address,undefined -fsanitize-coverage=edge,indirect-calls,8bit-counters -fno-sanitize-recover=undefined' $ make fuzzers The fuzzer binaries will be in `build/fuzzer`. Simply pick one and run it, optionally also passing a directory containing corpus inputs. Using `libfuzzer` build mode implicitly assumes the fuzzers need to link with `libFuzzer`; if another library is needed (for example in OSS-Fuzz, which uses `libFuzzingEngine`), use the flag `--with-fuzzer-lib` to specify the desired name. Fuzzing with AFL -------------------- To fuzz with AFL (http://lcamtuf.coredump.cx/afl/):: $ ./configure.py --with-sanitizers --build-fuzzer=afl --unsafe-fuzzer-mode --cc-bin=afl-g++ $ make fuzzers For AFL, `--with-sanitizers` is optional. You can also use `afl-clang-fast++` or `afl-clang++`. The fuzzer binaries will be in `build/fuzzer`. To run them you need to run under `afl-fuzz`:: $ afl-fuzz -i corpus_path -o output_path ./build/fuzzer/binary Fuzzing with TLS-Attacker -------------------------- TLS-Attacker (https://github.com/RUB-NDS/TLS-Attacker) includes a mode for fuzzing TLS servers. A prebuilt copy of TLS-Attacker is available in a git repo:: $ git clone --depth 1 https://github.com/randombit/botan-ci-tools.git To run it against Botan's server:: $ ./configure.py --with-sanitizers $ make botan $ ./src/scripts/run_tls_fuzzer.py ./botan ./botan-ci-tools Output and logs from the fuzzer are placed into `/tmp`. See the TLS-Attacker documentation for more information about how to use this tool. Input Corpus ----------------------- AFL requires an input corpus, and libFuzzer can certainly make good use of it. Some crypto corpus repositories include * https://github.com/randombit/crypto-corpus * https://github.com/mozilla/nss-fuzzing-corpus * https://github.com/google/boringssl/tree/master/fuzz * https://github.com/openssl/openssl/tree/master/fuzz/corpora Adding new fuzzers --------------------- New fuzzers are created by adding a source file to `src/fuzzers` which have the signature: ``void fuzz(const uint8_t in[], size_t len)`` After adding your fuzzer, rerun `./configure.py` and build. botan-2.4.0/doc/manual/goals.rst000066400000000000000000000163321322470703100165050ustar00rootroot00000000000000 Project Goals ================================ Botan seeks to be a broadly applicable library that can be used to implement a range of secure distributed systems. The library has the following project goals guiding changes. It does not succeed in all of these areas in every way just yet, but it describes the system that is the desired end result. Over time further progress is made in each. * Secure and reliable. The implementations must of course be correct and well tested, and attacks such as side channels and fault attacks should be accounted for where necessary. The library should never crash, or invoke undefined behavior, regardless of circumstances. * Implement schemes important in practice. It should be practical to implement any real-world crypto protocol using just what the library provides. It is worth some (limited) additional complexity in the library, in order to expand the set of applications which can easily adopt Botan. * Ease of use. It should be straightforward for an application programmer to do whatever it is they need to do. There should be one obvious way to perform any operation. The API should be predicable, and follow the "principle of least astonishment" in its design. This is not just a nicety; confusing APIs often result in errors that end up compromising security. * Simplicity of design, clarity of code, ease of review. The code should be easy to read and understand by other library developers, users seeking to better understand the behavior of the code, and by professional reviewers looking for bugs. This is important because bugs in convoluted code can easily escape multiple expert reviews, and end up living on for years. * Well tested. The code should be correct against the spec, with as close to 100% test coverage as possible. All available static and dynamic analysis tools at our disposal should be used, including fuzzers, symbolic execution, and protocol specific tools. Within reason, all warnings from compilers and static analyzers should be addressed, even if they seem like false positives, because that maximizes the signal value of new warnings from the tool. * Safe defaults. Policies should aim to be highly restrictive by default, and if they must be made less restrictive by certain applications, it should be obvious to the developer that they are doing something unsafe. * Post quantum security. Possibly a practical quantum computer that can break RSA and ECC will never be built, but the future is notoriously hard to predict. It seems prudent to begin designing and deploying systems now which have at least the option of using a post-quantum scheme. Botan provides a conservative selection of algorithms thought to be post-quantum secure. * Performance. Botan does not in every case strive to be faster than every other software implementation, but performance should be competitive and over time new optimizations are identified and applied. * Support whatever I/O mechanism the application wants. Allow the application to control all aspects of how the network is contacted, and ensure the API makes asynchronous operations easy to handle. This both insulates Botan from system-specific details and allows the application to use whatever networking style they please. * Portability to modern systems. Botan does not run everywhere, and we actually do not want it to (see non-goals below). But we do want it to run on anything that someone is deploying new applications on. That includes both major OSes like Windows, Linux, and BSD and also relatively new OSes such as IncludeOS. * Well documented. Ideally every public API would have some place in the manual describing its usage. * Useful command line utility. The botan command line tool should be flexible and featured enough to replace similar tools such as openssl for everyday users. Non-Goals ------------------------- There are goals some crypto libraries have, but which Botan actively does not seek to address. * Deep embedded support. Botan requires a heap, C++ exceptions, and RTTI, and at least in terms of performance optimizations effectively assumes a 32 or 64 bit processor. It is not suitable for deploying on, say FreeRTOS running on a MSP430, or smartcard with an 8 bit CPU and 256 bytes RAM. A larger SoC, such as a Cortex-A7 running Linux, is entirely within scope. * Implementing every crypto scheme in existence. The focus is on algorithms which are in practical use in systems deployed now, as well as promising algorithms for future deployment. Many algorithms which were of interest 5-15 years ago but which never saw widespread deployment and have no compelling benefit over other designs were originally implemented in the library but have since been removed to simplify the codebase. * Portable to obsolete systems. There is no reason for crypto software to support ancient OS platforms like SunOS or Windows 2000, since these unpatched systems are completely unsafe anyway. The additional complexity supporting such platforms just creates more room for bugs. * Portable to every C++ compiler ever made. Over time Botan moves forward to both take advantage of new language/compiler features, and to shed workarounds for dealing with bugs in ancient compilers. The set of supported compilers is fixed for each new release branch, for example Botan 2.x will always support GCC 4.8. But a future 3.x release version will likely increase the required versions for all compilers. * FIPS 140 validation. The primary developer was (long ago) a consultant with a NIST approved testing lab. He does not have a positive view of the process or results, at least when it comes to Level 1 software validations (a Level 4 validation is however the real deal). The only benefit of a Level 1 validation is to allow for government sales, and the cost of validation includes enormous amounts of time and money, adding 'checks' that are useless or actively harmful, then freezing the software version so security updates cannot be applied in the future. It does force a certain minimum standard (ie, FIPS Level 1 does assure AES and RSA are probably implemented correctly) but this is an issue of interop not security since Level 1 does not seriously consider attacks of any kind. Any security budget would be far better spent on a review from a specialized crypto consultancy, who would look for actual flaws. That said it would be easy to add a "FIPS 140" build mode to Botan, which just disabled all the builtin crypto and wrapped whatever the most recent OpenSSL FIPS module exports. * Educational purposes. The library code is intended to be easy to read and review, and so might be useful in an educational context. However it does not contain any toy ciphers (unless you count DES and RC4) nor any tools for simple cryptanalysis. Generally the manual and source comments assume previous knowledge on the basic concepts involved. * User proof. Some libraries provide a very high level API in an attempt to save the user from themselves. Occasionally they succeed. It would be appropriate and useful to build such an API on top of Botan, but Botan itself wants to cover a broad set of uses cases and some of these involve having pointy things within reach. botan-2.4.0/doc/manual/hash.rst000066400000000000000000000206011322470703100163150ustar00rootroot00000000000000Hash Functions and Checksums ============================= Hash functions are one-way functions, which map data of arbitrary size to a fixed output length. Most of the hash functions in Botan are designed to be cryptographically secure, which means that it is computationally infeasible to create a collision (finding two inputs with the same hash) or preimages (given a hash output, generating an arbitrary input with the same hash). But note that not all such hash functions meet their goals, in particular MD4 and MD5 are trivially broken. However they are still included due to their wide adoption in various protocols. The class :cpp:class:`HashFunction` is defined in `botan/hash.h`. Using a hash function is typically split into three stages: initialization, update, and finalization (often referred to as a IUF interface). The initialization stage is implicit: after creating a hash function object, it is ready to process data. Then update is called one or more times. Calling update several times is equivalent to calling it once with all of the arguments concatenated. After completing a hash computation (eg using ``final``), the internal state is reset to begin hashing a new message. .. cpp:class:: HashFunction .. cpp:function:: size_t output_length() Return the size (in *bytes*) of the output of this function. .. cpp:function:: void update(const uint8_t* input, size_t length) Updates the computation with *input*. .. cpp:function:: void update(uint8_t input) Updates the computation with *input*. .. cpp:function:: void update(const std::vector& input) Updates the computation with *input*. .. cpp:function:: void update(const std::string& input) Updates the computation with *input*. .. cpp:function:: void final(uint8_t* out) Finalize the calculation and place the result into ``out``. For the argument taking an array, exactly ``output_length`` bytes will be written. After you call ``final``, the algorithm is reset to its initial state, so it may be reused immediately. .. cpp:function:: secure_vector final() Similar to the other function of the same name, except it returns the result in a newly allocated vector. .. cpp:function:: secure_vector process(const uint8_t in[], size_t length) Equivalent to calling ``update`` followed by ``final``. .. cpp:function:: secure_vector process(const std::string& in) Equivalent to calling ``update`` followed by ``final``. Code Example ------------ Assume we want to calculate the SHA-1, Whirlpool and SHA-3 hash digests of the STDIN stream using the Botan library. .. code-block:: cpp #include #include #include int main () { std::unique_ptr hash1(Botan::HashFunction::create("SHA-1")); std::unique_ptr hash2(Botan::HashFunction::create("Whirlpool")); std::unique_ptr hash3(Botan::HashFunction::create("SHA-3")); std::vector buf(2048); while(std::cin.good()) { //read STDIN to buffer std::cin.read(reinterpret_cast(buf.data()), buf.size()); size_t readcount = std::cin.gcount(); //update hash computations with read data hash1->update(buf.data(),readcount); hash2->update(buf.data(),readcount); hash3->update(buf.data(),readcount); } std::cout << "SHA-1: " << Botan::hex_encode(hash1->final()) << std::endl; std::cout << "Whirlpool: " << Botan::hex_encode(hash2->final()) << std::endl; std::cout << "SHA-3: " << Botan::hex_encode(hash3->final()) << std::endl; return 0; } Available Hash Functions ------------------------------ The following cryptographic hash functions are implemented. BLAKE2b ^^^^^^^^^ Available if ``BOTAN_HAS_BLAKE2B`` is defined. A recently designed hash function. Very fast on 64-bit processors. Can output a hash of any length between 1 and 64 bytes, this is specified by passing a value to the constructor with the desired length. GOST-34.11 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_GOST_34_11`` is defined. Russian national standard hash. It is old, slow, and has some weaknesses. Avoid it unless you must. Keccak-1600 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_KECCAK`` is defined. An older (and incompatible) variant of SHA-3, but sometime used. Prefer SHA-3 in new code. MD4 ^^^^^^^^^ Available if ``BOTAN_HAS_MD4`` is defined. An old hash function that is now known to be trivially breakable. It is very fast, and may still be suitable as a (non-cryptographic) checksum. MD5 ^^^^^^^^^ Available if ``BOTAN_HAS_MD5`` is defined. Widely used, now known to be broken. RIPEMD-160 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_RIPEMD160`` is defined. A 160 bit hash function, quite old but still thought to be secure. Somewhat deprecated these days. SHA-1 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SHA1`` is defined. Widely adopted NSA designed hash function. Starting to show significant signs of weakness, and collisions can now be generated. Avoid in new designs. SHA-256 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SHA2_32`` is defined. Relatively fast 256 bit hash function, thought to be secure. Also includes the variant SHA-224. There is no real reason to use SHA-224. SHA-512 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SHA2_64`` is defined. SHA-512 is faster than SHA-256 on 64-bit processors. Also includes the truncated variants SHA-384 and SHA-512/256. SHA-3 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SHA3`` is defined. The new NIST standard hash. Fairly slow. SHAKE (SHAKE-128, SHAKE-256) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SHAKE`` is defined. These are actually XOFs (extensible output functions) based on SHA-3, which can output a value of any length. SM3 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SM3`` is defined. Chinese national hash function, 256 bit output. Widely used in industry there. Fast and seemingly secure. Skein-512 ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_SKEIN_512`` is defined. A contender for the NIST SHA-3 competition. Very fast on 64-bit systems. Can output a hash of any length between 1 and 64 bytes. It also accepts a "personalization string" which can create variants of the hash. This is useful for domain separation. Streebog (Streebog-256, Streebog-512) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_STREEBOG`` is defined. Newly designed Russian national hash function. Seemingly secure, but there is no real reason to use it unless compatibility is needed. Tiger ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_TIGER`` is defined. An older 192-bit hash function, optimized for 64-bit systems. Seemingly secure but not widely used. Prefer Skein-512 or BLAKE2b in new code. Whirlpool ^^^^^^^^^^^^^^^ Available if ``BOTAN_HAS_WHIRLPOOL`` is defined. A 512-bit hash function standarized by ISO and NESSIE. Relatively slow. Prefer Skein-512 or BLAKE2b in new code. Hash Function Combiners --------------------------- These are functions which combine multiple hash functions to create a new hash function. They are typically only used in specialized applications. Parallel ^^^^^^^^^^^^^ Available if ``BOTAN_HAS_PARALLEL_HASH`` is defined. Parallel simply concatenated multiple hash functions. For example "Parallel(SHA-256,SHA-512)" outputs a 256+512 bit hash created by hashing the input with both SHA-256 and SHA-512 and concatenating the outputs. Note that due to the "multicollision attack" it turns out that generating a collision for multiple parallel hash functions is no harder than generating a collision for the strongest hash function. Comp4P ^^^^^^^^^^^^^ Available if ``BOTAN_HAS_COMB4P`` is defined. This combines two cryptographic hashes in such a way that preimage and collision attacks are provably at least as hard as a preimage or collision attack on the strongest hash. Checksums ---------------- .. note:: Checksums are not suitable for cryptographic use, but can be used for error checking purposes. Adler32 ^^^^^^^^^^^ Available if ``BOTAN_HAS_ADLER32`` is defined. The Adler32 checksum is used in the zlib format. 32 bit output. CRC24 ^^^^^^^^^^^ Available if ``BOTAN_HAS_CRC24`` is defined. This is the CRC function used in OpenPGP. 24 bit output. CRC32 ^^^^^^^^^^^ Available if ``BOTAN_HAS_CRC32`` is defined. This is the 32-bit CRC used in protocols such as Ethernet, gzip, PNG, etc. botan-2.4.0/doc/manual/index.rst000066400000000000000000000033301322470703100165010ustar00rootroot00000000000000 Getting Started ======================================== If you need to build the library first, start with :doc:`building`. Some Linux distributions include packages for Botan, so building from source may not be required on your system. .. only:: html The :ref:`genindex` and :ref:`search` may be useful to get started. .. only:: html and website You can also download this manual as a `PDF `_. Books and other references ---------------------------- You should have some knowledge of cryptography *before* trying to use the library. This is an area where it is very easy to make mistakes, and where things are often subtle and/or counterintuitive. Obviously the library tries to provide things at a high level precisely to minimize the number of ways things can go wrong, but naive use will almost certainly not result in a secure system. Especially recommended are: - *Cryptography Engineering* by Niels Ferguson, Bruce Schneier, and Tadayoshi Kohno - `Security Engineering -- A Guide to Building Dependable Distributed Systems `_ by Ross Anderson - `Handbook of Applied Cryptography `_ by Alfred J. Menezes, Paul C. Van Oorschot, and Scott A. Vanstone If you're doing something non-trivial or unique, you might want to at the very least ask for review/input on a mailing list such as the `metzdowd `_ or `randombit `_ crypto lists. And (if possible) pay a professional cryptographer or security company to review your design and code. .. toctree:: :maxdepth: 1 :numbered: botan-2.4.0/doc/manual/kdf.rst000066400000000000000000000024401322470703100161370ustar00rootroot00000000000000 .. _key_derivation_function: Key Derivation Functions ======================================== Key derivation functions are used to turn some amount of shared secret material into uniform random keys suitable for use with symmetric algorithms. An example of an input which is useful for a KDF is a shared secret created using Diffie-Hellman key agreement. .. cpp:class:: KDF .. cpp:function:: secure_vector derive_key( \ size_t key_len, const std::vector& secret, \ const std::string& salt = "") const .. cpp:function:: secure_vector derive_key( \ size_t key_len, const std::vector& secret, \ const std::vector& salt) const .. cpp:function:: secure_vector derive_key( \ size_t key_len, const std::vector& secret, \ const uint8_t* salt, size_t salt_len) const .. cpp:function:: secure_vector derive_key( \ size_t key_len, const uint8_t* secret, size_t secret_len, \ const std::string& salt) const All variations on the same theme. Deterministically creates a uniform random value from *secret* and *salt*. Typically *salt* is a lable or identifier, such as a session id. You can create a :cpp:class:`KDF` using .. cpp:function:: KDF* get_kdf(const std::string& algo_spec) botan-2.4.0/doc/manual/keywrap.rst000066400000000000000000000050741322470703100170630ustar00rootroot00000000000000AES Key Wrapping ================================= NIST specifies two mechanisms for wrapping (encrypting) symmetric keys using another key. The first (and older, more widely supported) methd requres the input be a multiple of 8 bytes long. The other allows any length input, though only up to 2**32 bytes. These algorithms are described in NIST SP 800-38F, and RFCs 3394 and 5694. This API, defined in ``nist_keywrap.h``, first became available in version 2.4.0 These functions take an arbitrary 128-bit block cipher object, which must already have been keyed with the key encryption key. NIST only allows these functions with AES, but any 128-bit cipher will do and some other implementations (such as in OpenSSL) do also allow other ciphers. Use AES for best interop. .. cpp:function:: std::vector nist_key_wrap(const uint8_t input[], \ size_t input_len, const BlockCipher& bc) This performs KW (key wrap) mode. The input must be a multiple of 8 bytes long. .. cpp:function:: secure_vector nist_key_unwrap(const uint8_t input[], \ size_t input_len, const BlockCipher& bc) This unwraps the result of nist_key_wrap, or throw Integrity_Failure on error. .. cpp:function:: std::vector nist_key_wrap_padded(const uint8_t input[], \ size_t input_len, const BlockCipher& bc) This performs KWP (key wrap with padding) mode. The input can be any length. .. cpp:function:: secure_vector nist_key_unwrap_padded(const uint8_t input[], \ size_t input_len, const BlockCipher& bc) This unwraps the result of nist_key_wrap_padded, or throws Integrity_Failure on error. RFC 3394 Interface ----------------------------- This is an older interface that was first available (with slight changes) in 1.10, and available in its current form since 2.0 release. It uses a 128-bit, 192-bit, or 256-bit key to encrypt an input key. AES is always used. The input must be a multiple of 8 bytes; if not an exception is thrown. This interface is defined in ``rfc3394.h``. .. cpp:function:: secure_vector rfc3394_keywrap(const secure_vector& key, \ const SymmetricKey& kek) Wrap the input key using kek (the key encryption key), and return the result. It will be 8 bytes longer than the input key. .. cpp:function:: secure_vector rfc3394_keyunwrap(const secure_vector& key, \ const SymmetricKey& kek) Unwrap a key wrapped wtih rfc3394_keywrap. botan-2.4.0/doc/manual/message_auth_codes.rst000066400000000000000000000150641322470703100212230ustar00rootroot00000000000000 .. _mac: Message Authentication Codes (MAC) =================================== A Message Authentication Code algorithm computes a tag over a message utilizing a shared secret key. Thus a valid tag confirms the authenticity and integrity of the message. Only entities in possession of the shared secret key are able to verify the tag. .. note:: When combining a MAC with unauthenticated encryption mode, prefer to first encrypt the message and then MAC the ciphertext. The alternative is to MAC the plaintext, which depending on exact usage can suffer serious security issues. For a detailed discussion of this issue see the paper "The Order of Encryption and Authentication for Protecting Communications" by Hugo Krawczyk The Botan MAC computation is split into five stages. #. Instantiate the MAC algorithm. #. Set the secret key. #. Process IV. #. Process data. #. Finalize the MAC computation. .. cpp:class:: MessageAuthenticationCode .. cpp:function:: std::string name() const Returns a human-readable string of the name of this algorithm. .. cpp:function:: void clear() Clear the key. .. cpp:function:: MessageAuthenticationCode* clone() const Return a newly allocated object of the same type as this one. .. cpp:function:: void set_key(const uint8_t* key, size_t length) Set the shared MAC key for the calculation. This function has to be called before the data is processed. .. cpp:function:: bool valid_keylength(size_t length) const This function returns true if and only if *length* is a valid keylength for the algorithm. .. cpp:function:: size_t minimum_keylength() const Return the smallest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: size_t maximum_keylength() const Return the largest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: void start(const uint8_t* nonce, size_t nonce_len) Set the IV for the MAC calculation. Note that not all MAC algorithms require an IV. If an IV is required, the function has to be called before the data is processed. For algorithms that don't require it, the call can be omitted, or else called with ``nonce_len`` of zero. .. cpp:function:: void update(const uint8_t* input, size_t length) Process the passed data. .. cpp:function:: void update(const secure_vector& in) Process the passed data. .. cpp:function:: void update(uint8_t in) Process a single byte. .. cpp:function:: void final(uint8_t* out) Complete the MAC computation and write the calculated tag to the passed byte array. .. cpp:function:: secure_vector final() Complete the MAC computation and return the calculated tag. .. cpp:function:: bool verify_mac(const uint8_t* mac, size_t length) Finalize the current MAC computation and compare the result to the passed ``mac``. Returns ``true``, if the verification is successful and false otherwise. Code Example ------------------------ The following example code computes a AES-256 GMAC and subsequently verifies the tag. .. code-block:: cpp #include #include #include int main() { const std::vector key = Botan::hex_decode("1337133713371337133713371337133713371337133713371337133713371337"); const std::vector iv = Botan::hex_decode("FFFFFFFFFFFFFFFFFFFFFFFF"); const std::vector data = Botan::hex_decode("6BC1BEE22E409F96E93D7E117393172A"); std::unique_ptr mac(Botan::MessageAuthenticationCode::create("GMAC(AES-256)")); if(!mac) return 1; mac->set_key(key); mac->start(iv); mac->update(data); Botan::secure_vector tag = mac->final(); std::cout << mac->name() << ": " << Botan::hex_encode(tag) << std::endl; //Verify created MAC mac->start(iv); mac->update(data); std::cout << "Verification: " << (mac->verify_mac(tag) ? "success" : "failure"); return 0; } The following example code computes a valid AES-128 CMAC tag and modifies the data to demonstrate a MAC verification failure. .. code-block:: cpp #include #include #include int main() { const std::vector key = Botan::hex_decode("2B7E151628AED2A6ABF7158809CF4F3C"); std::vector data = Botan::hex_decode("6BC1BEE22E409F96E93D7E117393172A"); std::unique_ptr mac(Botan::MessageAuthenticationCode::create("CMAC(AES-128)")); if(!mac) return 1; mac->set_key(key); mac->update(data); Botan::secure_vector tag = mac->final(); //Corrupting data data.back()++; //Verify with corrupted data mac->update(data); std::cout << "Verification with malformed data: " << (mac->verify_mac(tag) ? "success" : "failure"); return 0; } Available MACs ------------------------------------------ Currently the following MAC algorithms are available in Botan. In new code, default to HMAC or CMAC. CBC-MAC ~~~~~~~~~~~~ An older authentication code based on a block cipher. Serious security problems, in particular **insecure** if messages of several different lengths are authenticated. Avoid unless required for compatability. Available if ``BOTAN_HAS_CBC_MAC`` is defined. CMAC ~~~~~~~~~~~~ A modern CBC-MAC variant that avoids the security problems of plain CBC-MAC. Approved by NIST. Also sometimes called OMAC. Available if ``BOTAN_HAS_CMAC`` is defined. GMAC ~~~~~~~~~~~~ GMAC is related to the GCM authenticated cipher mode. It is quite slow unless hardware support for carryless multiplications is available. A new nonce must be used with each message authenticated, or otherwise all security is lost. Available if ``BOTAN_HAS_GMAC`` is defined. HMAC ~~~~~~~~~~~~ A message authentication code based on a hash function. Very commonly used. Available if ``BOTAN_HAS_HMAC`` is defined. Poly1305 ~~~~~~~~~~~~ A polynomial mac (similar to GMAC). Very fast, but tricky to use safely. Forms part of the ChaCha20Poly1305 AEAD mode. A new key must be used for *each* message, or all security is lost. Available if ``BOTAN_HAS_POLY1305`` is defined. SipHash ~~~~~~~~~~~~ A modern and very fast PRF. Produces only a 64-bit output. Available if ``BOTAN_HAS_SIPHASH`` is defined. X9.19-MAC ~~~~~~~~~~~~ A CBC-MAC variant sometimes used in finance. Always uses DES. Avoid unless required. Available if ``BOTAN_HAS_X919_MAC`` is defined. botan-2.4.0/doc/manual/otp.rst000066400000000000000000000060611322470703100162000ustar00rootroot00000000000000One Time Passwords ======================== One time password schemes are a user authentication method that relies on a fixed secret key which is used to derive a sequence of short passwords, each of which is accepted only once. Commonly this is used to implement two-factor authentication (2FA), where the user authenticates using both a conventional password (or a public key signature) and an OTP generated by a small device such as a mobile phone. Botan implements the HOTP and TOTP schemes from RFC 4226 and 6238. Since the range of possible OTPs is quite small, applications must rate limit OTP authentication attempts to some small number per second. Otherwise an attacker could quickly try all 1000000 6-digit OTPs in a brief amount of time. HOTP ^^^^^^ HOTP generates OTPs that are a short numeric sequence, between 6 and 8 digits (most applications use 6 digits), created using the HMAC of a 64-bit counter value. If the counter ever repeats the OTP will also repeat, thus both parties must assure the counter only increments and is never repeated or decremented. Thus both client and server must keep track of the next counter expected. Anyone with access to the client-specific secret key can authenticate as that client, so it should be treated with the same security consideration as would be given to any other symmetric key or plaintext password. .. cpp:class:: HOTP Implement counter-based OTP .. cpp:function:: HOTP(const SymmetricKey& key, const std::string& hash_algo = "SHA-1", size_t digits = 6) Initialize an HOTP instance with a secret key (specific to each client), a hash algorithm (must be SHA-1, SHA-256, or SHA-512), and the number of digits with each OTP (must be 6, 7, or 8). In RFC 4226, HOTP is only defined with SHA-1, but many HOTP implementations support SHA-256 as an extension. The collision attacks on SHA-1 do not have any known effect on HOTP's security. .. cpp:function:: uint32_t generate_hotp(uint64_t counter) Return the OTP assosciated with a specific counter value. .. cpp:function:: std::pair verify_hotp(uint32_t otp, \ uint64_t starting_counter, size_t resync_range = 0) Check if a provided OTP matches the one that should be generated for the specified counter. The *starting_counter* should be the counter of the last successful authentication plus 1. If *resync_resync* is greater than 0, some number of counter values above *starting_counter* will also be checked if necessary. This is useful for instance when a client mistypes an OTP on entry; the authentication will fail so the server will not update its counter, but the client device will subsequently show the OTP for the next counter. Depending on the environment a *resync_range* of 3 to 10 might be appropriate. Returns a pair of (is_valid,next_counter_to_use). If the OTP is invalid then always returns (false,starting_counter), since the last successful authentication counter has not changed. botan-2.4.0/doc/manual/packaging.rst000066400000000000000000000042511322470703100173210ustar00rootroot00000000000000Notes for Distributors ======================== This document has information for anyone who is packaging copies of Botan for use by downstream developers, such as through a Linux distribution or other package management system. Recommended Options ------------------------ In most environments, zlib, bzip2, and sqlite are already installed, so there is no reason to not include support for them in Botan as well. Build with options ``--with-zlib --with-bzip2 --with-sqlite3`` to enable these features. Set Distribution Info ------------------------ If your distribution of Botan involves creating library binaries, use the configure.py flag ``--distribution-info=`` to set the version of your packaging. For example Foonix OS might distribute its 4th revision of the package for Botan 2.1.3 using ``--distribution-info='Foonix 2.1.3-4'``. The string is completely free-form, since it depends on how the distribution numbers releases and packages. Any value set with ``--distribution-info`` flag will be included in the version string, and can read through the ``BOTAN_DISTRIBUTION_INFO`` macro. Minimize Distribution Patches ------------------------------ We (Botan upstream) *strongly* prefer that downstream distributions maintain no long-term patches against Botan. Even if it is a build problem which probably only affects your environment, please open an issue on github and include the patch you are using. Perhaps the issue does affect other users, and even if not it would be better for everyone if the library were improved so it were not necessary for the patch to be created in the first place. For example, having to modify or remove a build data file, or edit the makefile after generation, suggests an area where the build system is insufficiently flexible. Obviously nothing in the BSD-2 license prevents you from distributing patches or modified versions of Botan however you please. But long term patches by downstream distributors have a tendency to bitrot and sometimes even result in security problems (such as in the Debian OpenSSL RNG fiasco) because the patches are never reviewed by the library developers. So we try to discourage them, and work to ensure they are never necessary. botan-2.4.0/doc/manual/passhash.rst000066400000000000000000000151461322470703100172140ustar00rootroot00000000000000Password Hashing ======================================== Storing passwords for user authentication purposes in plaintext is the simplest but least secure method; when an attacker compromises the database in which the passwords are stored, they immediately gain access to all of them. Often passwords are reused among multiple services or machines, meaning once a password to a single service is known an attacker has a substantial head start on attacking other machines. The general approach is to store, instead of the password, the output of a one way function of the password. Upon receiving an authentication request, the authenticator can recompute the one way function and compare the value just computed with the one that was stored. If they match, then the authentication request succeeds. But when an attacker gains access to the database, they only have the output of the one way function, not the original password. Common hash functions such as SHA-256 are one way, but used alone they have problems for this purpose. What an attacker can do, upon gaining access to such a stored password database, is hash common dictionary words and other possible passwords, storing them in a list. Then he can search through his list; if a stored hash and an entry in his list match, then he has found the password. Even worse, this can happen *offline*: an attacker can begin hashing common passwords days, months, or years before ever gaining access to the database. In addition, if two users choose the same password, the one way function output will be the same for both of them, which will be visible upon inspection of the database. There are two solutions to these problems: salting and iteration. Salting refers to including, along with the password, a randomly chosen value which perturbs the one way function. Salting can reduce the effectivness of offline dictionary generation, because for each potential password, an attacker would have to compute the one way function output for all possible salts. It also prevents the same password from producing the same output, as long as the salts do not collide. Choosing n-bit salts randomly, salt collisions become likely only after about 2\ :sup:\ `(n/2)` salts have been generated. Choosing a large salt (say 80 to 128 bits) ensures this is very unlikely. Note that in password hashing salt collisions are unfortunate, but not fatal - it simply allows the attacker to attack those two passwords in parallel easier than they would otherwise be able to. The other approach, iteration, refers to the general technique of forcing multiple one way function evaluations when computing the output, to slow down the operation. For instance if hashing a single password requires running SHA-256 100,000 times instead of just once, that will slow down user authentication by a factor of 100,000, but user authentication happens quite rarely, and usually there are more expensive operations that need to occur anyway (network and database I/O, etc). On the other hand, an attacker who is attempting to break a database full of stolen password hashes will be seriously inconvenienced by a factor of 100,000 slowdown; they will be able to only test at a rate of .0001% of what they would without iterations (or, equivalently, will require 100,000 times as many zombie botnet hosts). Memory usage while checking a password is also a consideration; if the computation requires using a certain minimum amount of memory, then an attacker can become memory-bound, which may in particular make customized cracking hardware more expensive. Some password hashing designs, such as scrypt, explicitly attempt to provide this. The bcrypt approach requires over 4 KiB of RAM (for the Blowfish key schedule) and may also make some hardware attacks more expensive. Botan provides two techniques for password hashing, bcrypt and passhash9. Bcrypt ---------------------------------------- `Bcrypt `_ is a password hashing scheme originally designed for use in OpenBSD, but numerous other implementations exist. It is made available by including ``bcrypt.h``. It has the advantage that it requires a small amount (4K) of fast RAM to compute, which can make hardware password cracking somewhat more expensive. Bcrypt provides outputs that look like this:: "$2a$12$7KIYdyv8Bp32WAvc.7YvI.wvRlyVn0HP/EhPmmOyMQA4YKxINO0p2" Currently only the `2a` bcrypt format is supported. .. cpp:function:: std::string generate_bcrypt(const std::string& password, \ RandomNumberGenerator& rng, uint16_t work_factor = 10) Takes the password to hash, a rng, and a work factor. Higher work factors increase the amount of time the algorithm runs, increasing the cost of cracking attempts. The increase is exponential, so a work factor of 10 takes roughly twice as long as work factor 9. The resulting password hash is returned as a string. Work factor must be at least 4. The bcrypt format allows up to 31, but Botan currently rejects all work factors greater than 18 since even that work factor requires roughly 30 seconds of computation on a fast machine. .. cpp:function:: bool check_bcrypt(const std::string& password, \ const std::string& hash) Takes a password and a bcrypt output and returns true if the password is the same as the one that was used to generate the bcrypt hash. .. _passhash9: Passhash9 ---------------------------------------- Botan also provides a password hashing technique called passhash9, in ``passhash9.h``, which is based on PBKDF2. Passhash9 hashes look like:: "$9$AAAKxwMGNPSdPkOKJS07Xutm3+1Cr3ytmbnkjO6LjHzCMcMQXvcT" This function should be secure with the proper parameters, and will remain in the library for the forseeable future, but it is specific to Botan rather than being a widely used password hash. Prefer bcrypt. .. warning:: This password format string ("$9$") conflicts with the format used for scrypt password hashes on Cisco systems. .. cpp:function:: std::string generate_passhash9(const std::string& password, \ RandomNumberGenerator& rng, uint16_t work_factor = 10, uint8_t alg_id = 1) Functions much like ``generate_bcrypt``. The last parameter, ``alg_id``, specifies which PRF to use. Currently defined values are 0: HMAC(SHA-1), 1: HMAC(SHA-256), 2: CMAC(Blowfish), 3: HMAC(SHA-384), 4: HMAC(SHA-512) Currently, this performs 10000 * ``work_factor`` PBKDF2 iterations, using 96 bits of salt taken from ``rng``. The iteration count is encoded as a 16-bit integer and is multiplied by 10000. .. cpp:function:: bool check_passhash9(const std::string& password, \ const std::string& hash) Functions much like ``check_bcrypt`` botan-2.4.0/doc/manual/pbkdf.rst000066400000000000000000000067501322470703100164710ustar00rootroot00000000000000 .. _pbkdf: PBKDF Algorithms ======================================== There are various procedures for turning a passphrase into a arbitrary length key for use with a symmetric cipher. A general interface for such algorithms is presented in ``pbkdf.h``. The main function is ``derive_key``, which takes a passphrase, a salt, an iteration count, and the desired length of the output key, and returns a key of that length, deterministically produced from the passphrase and salt. If an algorithm can't produce a key of that size, it will throw an exception (most notably, PKCS #5's PBKDF1 can only produce strings between 1 and $n$ bytes, where $n$ is the output size of the underlying hash function). The purpose of the iteration count is to make the algorithm take longer to compute the final key (reducing the speed of brute-force attacks of various kinds). Most standards recommend an iteration count of at least 10000. Currently defined PBKDF algorithms are "PBKDF1(digest)", "PBKDF2(digest)"; you can retrieve any of these using the ``get_pbkdf``, found in ``lookup.h``. As of this writing, "PBKDF2(SHA-256)" with at least 100000 iterations and a 16 byte salt is recommend for new applications. .. cpp:function:: OctetString PBKDF::derive_key( \ size_t output_len, const std::string& passphrase, \ const uint8_t* salt, size_t salt_len, \ size_t iterations) const Computes a key from *passphrase* and the *salt* (of length *salt_len* bytes) using an algorithm-specific interpretation of *iterations*, producing a key of length *output_len*. Use an iteration count of at least 10000. The salt should be randomly chosen by a good random number generator (see :ref:`random_number_generators` for how), or at the very least unique to this usage of the passphrase. If you call this function again with the same parameters, you will get the same key. :: PBKDF* pbkdf = get_pbkdf("PBKDF2(SHA-256)"); AutoSeeded_RNG rng; secure_vector salt = rng.random_vec(16); OctetString aes256_key = pbkdf->derive_key(32, "password", &salt[0], salt.size(), 10000); PBKDF1 ------------ PBKDF1 is an old scheme that can only produce an output length at most as long as the hash function. It is deprecated and will be removed in a future release. PBKDF2 ------------ PBKDF2 is a the "standard" password derivation scheme, widely implemented in many different libraries. OpenPGP S2K ------------- There are some oddities about OpenPGP's S2K algorithms that are documented here. For one thing, it uses the iteration count in a strange manner; instead of specifying how many times to iterate the hash, it tells how many *bytes* should be hashed in total (including the salt). So the exact iteration count will depend on the size of the salt (which is fixed at 8 bytes by the OpenPGP standard, though the implementation will allow any salt size) and the size of the passphrase. To get what OpenPGP calls "Simple S2K", set iterations to 0, and do not specify a salt. To get "Salted S2K", again leave the iteration count at 0, but give an 8-byte salt. "Salted and Iterated S2K" requires an 8-byte salt and some iteration count (this should be significantly larger than the size of the longest passphrase that might reasonably be used; somewhere from 1024 to 65536 would probably be about right). Using both a reasonably sized salt and a large iteration count is highly recommended to prevent password guessing attempts. botan-2.4.0/doc/manual/pkcs11.rst000066400000000000000000001423241322470703100165030ustar00rootroot00000000000000.. _pkcs11: PKCS#11 ======================================== .. versionadded:: 1.11.31 | PKCS#11 is a platform-independent interface for accessing smart cards and hardware security modules (HSM). Vendors of PKCS#11 compatible devices usually provide a so called middleware or "PKCS#11 module" which implements the PKCS#11 standard. This middleware translates calls from the platform-independent PKCS#11 API to device specific calls. So application developers don't have to write smart card or HSM specific code for each device they want to support. .. note:: The Botan PKCS#11 interface is implemented against version v2.40 of the standard. Botan wraps the C PKCS#11 API to provide a C++ PKCS#11 interface. This is done in two levels of abstraction: a low level API (see :ref:`pkcs11_low_level`) and a high level API (see :ref:`pkcs11_high_level`). The low level API provides access to all functions that are specified by the standard. The high level API represents an object oriented approach to use PKCS#11 compatible devices but only provides a subset of the functions described in the standard. To use the PKCS#11 implementation the ``pkcs11`` module has to be enabled. .. note:: Both PKCS#11 APIs live in the namespace ``Botan::PKCS11`` .. _pkcs11_low_level: Low Level API ---------------------------------------- The PKCS#11 standards committee provides header files (``pkcs11.h``, ``pkcs11f.h`` and ``pkcs11t.h``) which define the PKCS#11 API in the C programming language. These header files could be used directly to access PKCS#11 compatible smart cards or HSMs. The external header files are shipped with Botan in version v2.4 of the standard. The PKCS#11 low level API wraps the original PKCS#11 API, but still allows to access all functions described in the standard and has the advantage that it is a C++ interface with features like RAII, exceptions and automatic memory management. The low level API is implemented by the :cpp:class:`LowLevel` class and can be accessed by including the header ``botan/p11.h``. Preface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ All constants that belong together in the PKCS#11 standard are grouped into C++ enum classes. For example the different user types are grouped in the :cpp:enum:`UserType` enumeration: .. cpp:enum-class:: UserType : CK_USER_TYPE .. cpp:enumerator:: UserType::SO = CKU_SO .. cpp:enumerator:: UserType::User = CKU_USER .. cpp:enumerator:: UserType::ContextSpecific = CKU_CONTEXT_SPECIFIC Additionally, all types that are used by the low or high level API are mapped by type aliases to more C++ like names. For instance: .. cpp:type:: FunctionListPtr = CK_FUNCTION_LIST_PTR .. rubric:: C-API Wrapping There is at least one method in the :cpp:class:`LowLevel` class that corresponds to a PKCS#11 function. For example the :cpp:func:`C_GetSlotList` method in the :cpp:class:`LowLevel` class is defined as follows: .. cpp:class:: LowLevel .. cpp:function:: bool C_GetSlotList(Bbool token_present, SlotId* slot_list_ptr, Ulong* count_ptr, ReturnValue* return_value = ThrowException) const The :cpp:class:`LowLevel` class calls the PKCS#11 function from the function list of the PKCS#11 module: .. code-block:: c CK_DEFINE_FUNCTION(CK_RV, C_GetSlotList)( CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount ) Where it makes sense there is also an overload of the :cpp:class:`LowLevel` method to make usage easier and safer: .. cpp:function:: bool C_GetSlotList( bool token_present, std::vector& slot_ids, ReturnValue* return_value = ThrowException ) const With this overload the user of this API just has to pass a vector of :cpp:type:`SlotId` instead of pointers to preallocated memory for the slot list and the number of elements. Additionally, there is no need to call the method twice in order to determine the number of elements first. Another example is the :cpp:func:`C_InitPIN` overload: .. cpp:function:: template bool C_InitPIN( SessionHandle session, const std::vector& pin, ReturnValue* return_value = ThrowException ) const The templated ``pin`` parameter allows to pass the PIN as a ``std::vector`` or a ``secure_vector``. If used with a ``secure_vector`` it is assured that the memory is securely erased when the ``pin`` object is no longer needed. Error Handling ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All possible PKCS#11 return values are represented by the enum class: .. cpp:enum-class:: ReturnValue : CK_RV All methods of the :cpp:class:`LowLevel` class have a default parameter ``ReturnValue* return_value = ThrowException``. This parameter controls the error handling of all :cpp:class:`LowLevel` methods. The default behaviour ``return_value = ThrowException`` is to throw an exception if the method does not complete successfully. If a non-``NULL`` pointer is passed, ``return_value`` receives the return value of the PKCS#11 function and no exception is thrown. In case ``nullptr`` is passed as ``return_value``, the exact return value is ignored and the method just returns ``true`` if the function succeeds and ``false`` otherwise. Getting started ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ An object of this class can be instantiated by providing a :cpp:type:`FunctionListPtr` to the :cpp:class:`LowLevel` constructor: .. cpp:function:: explicit LowLevel(FunctionListPtr ptr) The :cpp:class:`LowLevel` class provides a static method to retrieve a :cpp:type:`FunctionListPtr` from a PKCS#11 module file: .. cpp:function:: static bool C_GetFunctionList(Dynamically_Loaded_Library& pkcs11_module, FunctionListPtr* function_list_ptr_ptr, ReturnValue* return_value = ThrowException) ---------- Code Example: Object Instantiation .. code-block:: cpp Botan::Dynamically_Loaded_Library pkcs11_module( "C:\\pkcs11-middleware\\library.dll" ); Botan::PKCS11::FunctionListPtr func_list = nullptr; Botan::PKCS11::LowLevel::C_GetFunctionList( pkcs11_module, &func_list ); Botan::PKCS11::LowLevel p11_low_level( func_list ); ---------- Code Example: PKCS#11 Module Initialization .. code-block:: cpp Botan::PKCS11::LowLevel p11_low_level(func_list); Botan::PKCS11::C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast(Botan::PKCS11::Flag::OsLockingOk), nullptr }; p11_low_level.C_Initialize(&init_args); // work with the token p11_low_level.C_Finalize(nullptr); More code examples can be found in the test suite in the ``test_pkcs11_low_level.cpp`` file. .. _pkcs11_high_level: High Level API ---------------------------------------- The high level API provides access to the most commonly used PKCS#11 functionality in an object oriented manner. Functionality of the high level API includes: * Loading/unloading of PKCS#11 modules * Initialization of tokens * Change of PIN/SO-PIN * Session management * Random number generation * Enumeration of objects on the token (certificates, public keys, private keys) * Import/export/deletion of certificates * Generation/import/export/deletion of RSA and EC public and private keys * Encryption/decryption using RSA with support for OAEP and PKCS1-v1_5 (and raw) * Signature generation/verification using RSA with support for PSS and PKCS1-v1_5 (and raw) * Signature generation/verification using ECDSA * Key derivation using ECDH Module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :cpp:class:`Module` class represents a PKCS#11 shared library (module) and is defined in ``botan/p11_module.h``. It is constructed from a a file path to a PKCS#11 module and optional :cpp:type:`C_InitializeArgs`: .. cpp:class:: Module .. code-block:: cpp Module(const std::string& file_path, C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast(Flag::OsLockingOk), nullptr }) It loads the shared library and calls :cpp:func:`C_Initialize` with the provided :cpp:type:`C_InitializeArgs`. On destruction of the object :cpp:func:`C_Finalize` is called. There are two more methods in this class. One is for reloading the shared library and reinitializing the PKCS#11 module: .. code-block:: cpp void reload(C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast< CK_FLAGS >(Flag::OsLockingOk), nullptr }); The other one is for getting general information about the PKCS#11 module: .. cpp:function:: Info get_info() const This function calls :cpp:func:`C_GetInfo` internally. ---------- Code example: .. code-block:: cpp Botan::PKCS11::Module module( "C:\\pkcs11-middleware\\library.dll" ); // Sometimes useful if a newly connected token is not detected by the PKCS#11 module module.reload(); Botan::PKCS11::Info info = module.get_info(); // print library version std::cout << std::to_string( info.libraryVersion.major ) << "." << std::to_string( info.libraryVersion.minor ) << std::endl; Slot ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :cpp:class:`Slot` class represents a PKCS#11 slot and is defined in ``botan/p11_slot.h``. A PKCS#11 slot is usually a smart card reader that potentially contains a token. .. cpp:class:: Slot .. cpp:function:: Slot(Module& module, SlotId slot_id) To instantiate this class a reference to a :cpp:class:`Module` object and a ``slot_id`` have to be passed to the constructor. To retrieve available slot ids this class has the following static method: .. cpp:function:: static std::vector get_available_slots(Module& module, bool token_present) The parameter ``token_present`` controls whether all slots or only slots with a token attached are returned by this method. This method calls :cpp:func:`C_GetSlotList()`. Further methods: .. cpp:function:: SlotInfo get_slot_info() const Returns information about the slot. Calls :cpp:func:`C_GetSlotInfo`. .. cpp:function:: TokenInfo get_token_info() const Obtains information about a particular token in the system. Calls :cpp:func:`C_GetTokenInfo`. .. cpp:function:: std::vector get_mechanism_list() const Obtains a list of mechanism types supported by the slot. Calls :cpp:func:`C_GetMechanismList`. .. cpp:function:: MechanismInfo get_mechanism_info(MechanismType mechanism_type) const Obtains information about a particular mechanism possibly supported by a slot. Calls :cpp:func:`C_GetMechanismInfo`. .. cpp:function:: void initialize(const std::string& label, const secure_string& so_pin) const Calls :cpp:func:`C_InitToken` to initialize the token. The :cpp:func:`label` must not exceed 32 bytes. The current PIN of the security officer must be passed in ``so_pin`` if the token is reinitialized or if it's a factory new token, the ``so_pin`` that is passed will initially be set. ---------- Code example: .. code-block:: cpp // only slots with connected token std::vector slots = Botan::PKCS11::Slot::get_available_slots( module, true ); // use first slot Botan::PKCS11::Slot slot( module, slots.at( 0 ) ); // print firmware version of the slot Botan::PKCS11::SlotInfo slot_info = slot.get_slot_info(); std::cout << std::to_string( slot_info.firmwareVersion.major ) << "." << std::to_string( slot_info.firmwareVersion.minor ) << std::endl; // print firmware version of the token Botan::PKCS11::TokenInfo token_info = slot.get_token_info(); std::cout << std::to_string( token_info.firmwareVersion.major ) << "." << std::to_string( token_info.firmwareVersion.minor ) << std::endl; // retrieve all mechanisms supported by the token std::vector mechanisms = slot.get_mechanism_list(); // retrieve information about a particular mechanism Botan::PKCS11::MechanismInfo mech_info = slot.get_mechanism_info( Botan::PKCS11::MechanismType::RsaPkcsOaep ); // maximum RSA key length supported: std::cout << mech_info.ulMaxKeySize << std::endl; // initialize the token Botan::PKCS11::secure_string so_pin( 8, '0' ); slot.initialize( "Botan PKCS11 documentation test label", so_pin ); Session ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The :cpp:class:`Session` class represents a PKCS#11 session and is defined in ``botan/p11_session.h``. A session is a logical connection between an application and a token. .. cpp:class:: Session There are two constructors to create a new session and one constructor to take ownership of an existing session. .. cpp:function:: Session(Slot& slot, bool read_only) To initialize a session object a :cpp:class:`Slot` has to be specified on which the session should operate. ``read_only`` specifies whether the session should be read only or read write. Calls :cpp:func:`C_OpenSession`. .. cpp:function:: Session(Slot& slot, Flags flags, VoidPtr callback_data, Notify notify_callback) Creates a new session by passing a :cpp:class:`Slot`, session ``flags``, ``callback_data`` and a ``notify_callback``. Calls :cpp:func:`C_OpenSession`. .. cpp:function:: Session(Slot& slot, SessionHandle handle) Takes ownership of an existing session by passing :cpp:class:`Slot` and a session ``handle``. The destructor calls :cpp:func:`C_Logout` if a user is logged in to this session and always :cpp:func:`C_CloseSession`. .. cpp:function:: SessionHandle release() Returns the released :cpp:type:`SessionHandle` .. cpp:function:: void login(UserType userType, const secure_string& pin) Login to this session by passing :cpp:enum:`UserType` and ``pin``. Calls :cpp:func:`C_Login`. .. cpp:function:: void logoff() Logout from this session. Not mandatory because on destruction of the :cpp:class:`Session` object this is done automatically. .. cpp:function:: SessionInfo get_info() const Returns information about this session. Calls :cpp:func:`C_GetSessionInfo`. .. cpp:function:: void set_pin(const secure_string& old_pin, const secure_string& new_pin) const Calls :cpp:func:`C_SetPIN` to change the PIN of the logged in user using the ``old_pin``. .. cpp:function:: void init_pin(const secure_string& new_pin) Calls :cpp:func:`C_InitPIN` to change or initialize the PIN using the SO_PIN (requires a logged in session). ---------- Code example: .. code-block:: cpp // open read only session { Botan::PKCS11::Session read_only_session( slot, true ); } // open read write session { Botan::PKCS11::Session read_write_session( slot, false ); } // open read write session by passing flags { Botan::PKCS11::Flags flags = Botan::PKCS11::flags( Botan::PKCS11::Flag::SerialSession | Botan::PKCS11::Flag::RwSession ); Botan::PKCS11::Session read_write_session( slot, flags, nullptr, nullptr ); } // move ownership of a session { Botan::PKCS11::Session session( slot, false ); Botan::PKCS11::SessionHandle handle = session.release(); Botan::PKCS11::Session session2( slot, handle ); } Botan::PKCS11::Session session( slot, false ); // get session info Botan::PKCS11::SessionInfo info = session.get_info(); std::cout << info.slotID << std::endl; // login Botan::PKCS11::secure_string pin = { '1', '2', '3', '4', '5', '6' }; session.login( Botan::PKCS11::UserType::User, pin ); // set pin Botan::PKCS11::secure_string new_pin = { '6', '5', '4', '3', '2', '1' }; session.set_pin( pin, new_pin ); // logoff session.logoff(); // log in as security officer Botan::PKCS11::secure_string so_pin = { '0', '0', '0', '0', '0', '0', '0', '0' }; session.login( Botan::PKCS11::UserType::SO, so_pin ); // change pin to old pin session.init_pin( pin ); Objects ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PKCS#11 objects consist of various attributes (:c:type:`CK_ATTRIBUTE`). For example :c:macro:`CKA_TOKEN` describes if a PKCS#11 object is a session object or a token object. The helper class :cpp:class:`AttributeContainer` helps with storing these attributes. The class is defined in ``botan/p11_object.h``. .. cpp:class:: AttributeContainer Attributes can be set in an :cpp:class:`AttributeContainer` by various ``add_`` methods: .. cpp:function:: void add_class(ObjectClass object_class) Add a class attribute (:c:macro:`CKA_CLASS` / :cpp:enumerator:`AttributeType::Class`) .. cpp:function:: void add_string(AttributeType attribute, const std::string& value) Add a string attribute (e.g. :c:macro:`CKA_LABEL` / :cpp:enumerator:`AttributeType::Label`). .. cpp:function:: void AttributeContainer::add_binary(AttributeType attribute, const uint8_t* value, size_t length) Add a binary attribute (e.g. :c:macro:`CKA_ID` / :cpp:enumerator:`AttributeType::Id`). .. cpp:function:: template void AttributeContainer::add_binary(AttributeType attribute, const std::vector& binary) Add a binary attribute by passing a ``vector``/``secure_vector`` (e.g. :c:macro:`CKA_ID` / :cpp:enumerator:`AttributeType::Id`). .. cpp:function:: void AttributeContainer::add_bool(AttributeType attribute, bool value) Add a bool attribute (e.g. :c:macro:`CKA_SENSITIVE` / :cpp:enumerator:`AttributeType::Sensitive`). .. cpp:function:: template void AttributeContainer::add_numeric(AttributeType attribute, T value) Add a numeric attribute (e.g. :c:macro:`CKA_MODULUS_BITS` / :cpp:enumerator:`AttributeType::ModulusBits`). .. rubric:: Object Properties The PKCS#11 standard defines the mandatory and optional attributes for each object class. The mandatory and optional attribute requirements are mapped in so called property classes. Mandatory attributes are set in the constructor, optional attributes can be set via ``set_`` methods. In the top hierarchy is the :cpp:class:`ObjectProperties` class which inherits from the :cpp:class:`AttributeContainer`. This class represents the common attributes of all PKCS#11 objects. .. cpp:class:: ObjectProperties : public AttributeContainer The constructor is defined as follows: .. cpp:function:: ObjectProperties(ObjectClass object_class) Every PKCS#11 object needs an object class attribute. The next level defines the :cpp:class:`StorageObjectProperties` class which inherits from :cpp:class:`ObjectProperties`. .. cpp:class:: StorageObjectProperties : public ObjectProperties The only mandatory attribute is the object class, so the constructor is defined as follows: .. cpp:function:: StorageObjectProperties(ObjectClass object_class) But in contrast to the :cpp:class:`ObjectProperties` class there are various setter methods. For example to set the :cpp:enumerator:`AttributeType::Label`: .. cpp:function:: void set_label(const std::string& label) Sets the label description of the object (RFC2279 string). The remaining hierarchy is defined as follows: * :cpp:class:`DataObjectProperties` inherits from :cpp:class:`StorageObjectProperties` * :cpp:class:`CertificateProperties` inherits from :cpp:class:`StorageObjectProperties` * :cpp:class:`DomainParameterProperties` inherits from :cpp:class:`StorageObjectProperties` * :cpp:class:`KeyProperties` inherits from :cpp:class:`StorageObjectProperties` * :cpp:class:`PublicKeyProperties` inherits from :cpp:class:`KeyProperties` * :cpp:class:`PrivateKeyProperties` inherits from :cpp:class:`KeyProperties` * :cpp:class:`SecretKeyProperties` inherits from :cpp:class:`KeyProperties` PKCS#11 objects themself are represented by the :cpp:class:`Object` class. .. cpp:class:: Object Following constructors are defined: .. cpp:function:: Object(Session& session, ObjectHandle handle) Takes ownership over an existing object. .. cpp:function:: Object(Session& session, const ObjectProperties& obj_props) Creates a new object with the :cpp:class:`ObjectProperties` provided in ``obj_props``. The other methods are: .. cpp:function:: secure_vector get_attribute_value(AttributeType attribute) const Returns the value of the given attribute (using :cpp:func:`C_GetAttributeValue`) .. cpp:function:: void set_attribute_value(AttributeType attribute, const secure_vector& value) const Sets the given value for the attribute (using :cpp:func:`C_SetAttributeValue`) .. cpp:function:: void destroy() const Destroys the object. .. cpp:function:: ObjectHandle copy(const AttributeContainer& modified_attributes) const Allows to copy the object with modified attributes. And static methods to search for objects: .. cpp:function:: template static std::vector search(Session& session, const std::vector& search_template) Searches for all objects of the given type that match ``search_template``. .. cpp:function:: template static std::vector search(Session& session, const std::string& label) Searches for all objects of the given type using the label (:c:macro:`CKA_LABEL`). .. cpp:function:: template static std::vector search(Session& session, const std::vector& id) Searches for all objects of the given type using the id (:c:macro:`CKA_ID`). .. cpp:function:: template static std::vector search(Session& session, const std::string& label, const std::vector& id) Searches for all objects of the given type using the label (:c:macro:`CKA_LABEL`) and id (:c:macro:`CKA_ID`). .. cpp:function:: template static std::vector search(Session& session) Searches for all objects of the given type. .. rubric:: The ObjectFinder Another way for searching objects is to use the :cpp:class:`ObjectFinder` class. This class manages calls to the ``C_FindObjects*`` functions: :cpp:func:`C_FindObjectsInit`, :cpp:func:`C_FindObjects` and :cpp:func:`C_FindObjectsFinal`. .. cpp:class:: ObjectFinder The constructor has the following signature: .. cpp:function:: ObjectFinder(Session& session, const std::vector& search_template) A search can be prepared with an :cpp:class:`ObjectSearcher` by passing a :cpp:class:`Session` and a ``search_template``. The actual search operation is started by calling the :cpp:func:`find` method: .. cpp:function:: std::vector find(std::uint32_t max_count = 100) const Starts or continues a search for token and session objects that match a template. ``max_count`` specifies the maximum number of search results (object handles) that are returned. .. cpp:function:: void finish() Finishes the search operation manually to allow a new :cpp:class:`ObjectFinder` to exist. Otherwise the search is finished by the destructor. ---------- Code example: .. code-block:: cpp // create an simple data object Botan::secure_vector value = { 0x00, 0x01 ,0x02, 0x03 }; std::size_t id = 1337; std::string label = "test data object"; // set properties of the new object Botan::PKCS11::DataObjectProperties data_obj_props; data_obj_props.set_label( label ); data_obj_props.set_value( value ); data_obj_props.set_token( true ); data_obj_props.set_modifiable( true ); data_obj_props.set_object_id( Botan::DER_Encoder().encode( id ).get_contents_unlocked() ); // create the object Botan::PKCS11::Object data_obj( session, data_obj_props ); // get label of this object Botan::PKCS11::secure_string retrieved_label = data_obj.get_attribute_value( Botan::PKCS11::AttributeType::Label ); // set a new label Botan::PKCS11::secure_string new_label = { 'B', 'o', 't', 'a', 'n' }; data_obj.set_attribute_value( Botan::PKCS11::AttributeType::Label, new_label ); // copy the object Botan::PKCS11::AttributeContainer copy_attributes; copy_attributes.add_string( Botan::PKCS11::AttributeType::Label, "copied object" ); Botan::PKCS11::ObjectHandle copied_obj_handle = data_obj.copy( copy_attributes ); // search for an object Botan::PKCS11::AttributeContainer search_template; search_template.add_string( Botan::PKCS11::AttributeType::Label, "Botan" ); auto found_objs = Botan::PKCS11::Object::search( session, search_template.attributes() ); // destroy the object data_obj.destroy(); RSA ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PKCS#11 RSA support is implemented in ````. .. rubric:: RSA Public Keys PKCS#11 RSA public keys are provided by the class :cpp:class:`PKCS11_RSA_PublicKey`. This class inherits from :cpp:class:`RSA_PublicKey` and :cpp:class:`Object`. Furthermore there are two property classes defined to generate and import RSA public keys analogous to the other property classes described before: :cpp:class:`RSA_PublicKeyGenerationProperties` and :cpp:class:`RSA_PublicKeyImportProperties`. .. cpp:class:: PKCS11_RSA_PublicKey : public RSA_PublicKey, public Object .. cpp:function:: PKCS11_RSA_PublicKey(Session& session, ObjectHandle handle) Existing PKCS#11 RSA public keys can be used by providing an :cpp:type:`ObjectHandle` to the constructor. .. cpp:function:: PKCS11_RSA_PublicKey(Session& session, const RSA_PublicKeyImportProperties& pubkey_props) This constructor can be used to import an existing RSA public key with the :cpp:class:`RSA_PublicKeyImportProperties` passed in ``pubkey_props`` to the token. .. rubric:: RSA Private Keys The support for PKCS#11 RSA private keys is implemented in a similar way. There are two property classes: :cpp:class:`RSA_PrivateKeyGenerationProperties` and :cpp:class:`RSA_PrivateKeyImportProperties`. The :cpp:class:`PKCS11_RSA_PrivateKey` class implements the actual support for PKCS#11 RSA private keys. This class inherits from :cpp:class:`Private_Key`, :cpp:class:`RSA_PublicKey` and :cpp:class:`Object`. In contrast to the public key class there is a third constructor to generate private keys directly on the token or in the session and one method to export private keys. .. cpp:class:: PKCS11_RSA_PrivateKey : public Private_Key, public RSA_PublicKey, public Object .. cpp:function:: PKCS11_RSA_PrivateKey(Session& session, ObjectHandle handle) Existing PKCS#11 RSA private keys can be used by providing an :cpp:type:`ObjectHandle` to the constructor. .. cpp:function:: PKCS11_RSA_PrivateKey(Session& session, const RSA_PrivateKeyImportProperties& priv_key_props) This constructor can be used to import an existing RSA private key with the :cpp:class:`RSA_PrivateKeyImportProperties` passed in ``priv_key_props`` to the token. .. cpp:function:: PKCS11_RSA_PrivateKey(Session& session, uint32_t bits, const RSA_PrivateKeyGenerationProperties& priv_key_props) Generates a new PKCS#11 RSA private key with bit length provided in ``bits`` and the :cpp:class:`RSA_PrivateKeyGenerationProperties` passed in ``priv_key_props``. .. cpp:function:: RSA_PrivateKey export_key() const Returns the exported :cpp:class:`RSA_PrivateKey`. PKCS#11 RSA key pairs can be generated with the following free function: .. cpp:function:: PKCS11_RSA_KeyPair PKCS11::generate_rsa_keypair(Session& session, const RSA_PublicKeyGenerationProperties& pub_props, const RSA_PrivateKeyGenerationProperties& priv_props) ---------- Code example: .. code-block:: cpp Botan::PKCS11::secure_string pin = { '1', '2', '3', '4', '5', '6' }; session.login( Botan::PKCS11::UserType::User, pin ); /************ import RSA private key *************/ // create private key in software Botan::AutoSeeded_RNG rng; Botan::RSA_PrivateKey priv_key_sw( rng, 2048 ); // set the private key import properties Botan::PKCS11::RSA_PrivateKeyImportProperties priv_import_props( priv_key_sw.get_n(), priv_key_sw.get_d() ); priv_import_props.set_pub_exponent( priv_key_sw.get_e() ); priv_import_props.set_prime_1( priv_key_sw.get_p() ); priv_import_props.set_prime_2( priv_key_sw.get_q() ); priv_import_props.set_coefficient( priv_key_sw.get_c() ); priv_import_props.set_exponent_1( priv_key_sw.get_d1() ); priv_import_props.set_exponent_2( priv_key_sw.get_d2() ); priv_import_props.set_token( true ); priv_import_props.set_private( true ); priv_import_props.set_decrypt( true ); priv_import_props.set_sign( true ); // import Botan::PKCS11::PKCS11_RSA_PrivateKey priv_key( session, priv_import_props ); /************ export PKCS#11 RSA private key *************/ Botan::RSA_PrivateKey exported = priv_key.export_key(); /************ import RSA public key *************/ // set the public key import properties Botan::PKCS11::RSA_PublicKeyImportProperties pub_import_props( priv_key.get_n(), priv_key.get_e() ); pub_import_props.set_token( true ); pub_import_props.set_encrypt( true ); pub_import_props.set_private( false ); // import Botan::PKCS11::PKCS11_RSA_PublicKey public_key( session, pub_import_props ); /************ generate RSA private key *************/ Botan::PKCS11::RSA_PrivateKeyGenerationProperties priv_generate_props; priv_generate_props.set_token( true ); priv_generate_props.set_private( true ); priv_generate_props.set_sign( true ); priv_generate_props.set_decrypt( true ); priv_generate_props.set_label( "BOTAN_TEST_RSA_PRIV_KEY" ); Botan::PKCS11::PKCS11_RSA_PrivateKey private_key2( session, 2048, priv_generate_props ); /************ generate RSA key pair *************/ Botan::PKCS11::RSA_PublicKeyGenerationProperties pub_generate_props( 2048UL ); pub_generate_props.set_pub_exponent(); pub_generate_props.set_label( "BOTAN_TEST_RSA_PUB_KEY" ); pub_generate_props.set_token( true ); pub_generate_props.set_encrypt( true ); pub_generate_props.set_verify( true ); pub_generate_props.set_private( false ); Botan::PKCS11::PKCS11_RSA_KeyPair rsa_keypair = Botan::PKCS11::generate_rsa_keypair( session, pub_generate_props, priv_generate_props ); /************ RSA encrypt *************/ Botan::secure_vector plaintext = { 0x00, 0x01, 0x02, 0x03 }; Botan::PK_Encryptor_EME encryptor( rsa_keypair.first, rng, "Raw" ); auto ciphertext = encryptor.encrypt( plaintext, rng ); /************ RSA decrypt *************/ Botan::PK_Decryptor_EME decryptor( rsa_keypair.second, rng, "Raw" ); plaintext = decryptor.decrypt( ciphertext ); /************ RSA sign *************/ Botan::PK_Signer signer( rsa_keypair.second, rng, "EMSA4(SHA-256)", Botan::IEEE_1363 ); auto signature = signer.sign_message( plaintext, rng ); /************ RSA verify *************/ Botan::PK_Verifier verifier( rsa_keypair.first, "EMSA4(SHA-256)", Botan::IEEE_1363 ); auto ok = verifier.verify_message( plaintext, signature ); ECDSA ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PKCS#11 ECDSA support is implemented in ````. .. rubric:: ECDSA Public Keys PKCS#11 ECDSA public keys are provided by the class :cpp:class:`PKCS11_ECDSA_PublicKey`. This class inherits from :cpp:class:`PKCS11_EC_PublicKey` and :cpp:class:`ECDSA_PublicKey`. The necessary property classes are defined in ````. For public keys there are :cpp:class:`EC_PublicKeyGenerationProperties` and :cpp:class:`EC_PublicKeyImportProperties`. .. cpp:class:: PKCS11_ECDSA_PublicKey : public PKCS11_EC_PublicKey, public virtual ECDSA_PublicKey .. cpp:function:: PKCS11_ECDSA_PublicKey(Session& session, ObjectHandle handle) Existing PKCS#11 ECDSA private keys can be used by providing an :cpp:type:`ObjectHandle` to the constructor. .. cpp:function:: PKCS11_ECDSA_PublicKey(Session& session, const EC_PublicKeyImportProperties& props) This constructor can be used to import an existing ECDSA public key with the :cpp:class:`EC_PublicKeyImportProperties` passed in ``props`` to the token. .. cpp:function:: ECDSA_PublicKey PKCS11_ECDSA_PublicKey::export_key() const Returns the exported :cpp:class:`ECDSA_PublicKey`. .. rubric:: ECDSA Private Keys The class :cpp:class:`PKCS11_ECDSA_PrivateKey` inherits from :cpp:class:`PKCS11_EC_PrivateKey` and implements support for PKCS#11 ECDSA private keys. There are two property classes for key generation and import: :cpp:class:`EC_PrivateKeyGenerationProperties` and :cpp:class:`EC_PrivateKeyImportProperties`. .. cpp:class:: PKCS11_ECDSA_PrivateKey : public PKCS11_EC_PrivateKey .. cpp:function:: PKCS11_ECDSA_PrivateKey(Session& session, ObjectHandle handle) Existing PKCS#11 ECDSA private keys can be used by providing an :cpp:type:`ObjectHandle` to the constructor. .. cpp:function:: PKCS11_ECDSA_PrivateKey(Session& session, const EC_PrivateKeyImportProperties& props) This constructor can be used to import an existing ECDSA private key with the :cpp:class:`EC_PrivateKeyImportProperties` passed in ``props`` to the token. .. cpp:function:: PKCS11_ECDSA_PrivateKey(Session& session, const std::vector& ec_params, const EC_PrivateKeyGenerationProperties& props) This constructor can be used to generate a new ECDSA private key with the :cpp:class:`EC_PrivateKeyGenerationProperties` passed in ``props`` on the token. The ``ec_params`` parameter is the DER-encoding of an ANSI X9.62 Parameters value. .. cpp:function:: ECDSA_PrivateKey export_key() const Returns the exported :cpp:class:`ECDSA_PrivateKey`. PKCS#11 ECDSA key pairs can be generated with the following free function: .. cpp:function:: PKCS11_ECDSA_KeyPair PKCS11::generate_ecdsa_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props) ---------- Code example: .. code-block:: cpp Botan::PKCS11::secure_string pin = { '1', '2', '3', '4', '5', '6' }; session.login( Botan::PKCS11::UserType::User, pin ); /************ import ECDSA private key *************/ // create private key in software Botan::AutoSeeded_RNG rng; Botan::ECDSA_PrivateKey priv_key_sw( rng, Botan::EC_Group( "secp256r1" ) ); priv_key_sw.set_parameter_encoding( Botan::EC_Group_Encoding::EC_DOMPAR_ENC_OID ); // set the private key import properties Botan::PKCS11::EC_PrivateKeyImportProperties priv_import_props( priv_key_sw.DER_domain(), priv_key_sw.private_value() ); priv_import_props.set_token( true ); priv_import_props.set_private( true ); priv_import_props.set_sign( true ); priv_import_props.set_extractable( true ); // label std::string label = "test ECDSA key"; priv_import_props.set_label( label ); // import to card Botan::PKCS11::PKCS11_ECDSA_PrivateKey priv_key( session, priv_import_props ); /************ export PKCS#11 ECDSA private key *************/ Botan::ECDSA_PrivateKey priv_exported = priv_key.export_key(); /************ import ECDSA public key *************/ // import to card Botan::PKCS11::EC_PublicKeyImportProperties pub_import_props( priv_key_sw.DER_domain(), Botan::DER_Encoder().encode( EC2OSP( priv_key_sw.public_point(), Botan::PointGFp::UNCOMPRESSED ), Botan::OCTET_STRING ).get_contents_unlocked() ); pub_import_props.set_token( true ); pub_import_props.set_verify( true ); pub_import_props.set_private( false ); // label label = "test ECDSA pub key"; pub_import_props.set_label( label ); Botan::PKCS11::PKCS11_ECDSA_PublicKey public_key( session, pub_import_props ); /************ export PKCS#11 ECDSA public key *************/ Botan::ECDSA_PublicKey pub_exported = public_key.export_key(); /************ generate PKCS#11 ECDSA private key *************/ Botan::PKCS11::EC_PrivateKeyGenerationProperties priv_generate_props; priv_generate_props.set_token( true ); priv_generate_props.set_private( true ); priv_generate_props.set_sign( true ); Botan::PKCS11::PKCS11_ECDSA_PrivateKey pk( session, Botan::EC_Group( "secp256r1" ).DER_encode( Botan::EC_Group_Encoding::EC_DOMPAR_ENC_OID ), priv_generate_props ); /************ generate PKCS#11 ECDSA key pair *************/ Botan::PKCS11::EC_PublicKeyGenerationProperties pub_generate_props( Botan::EC_Group( "secp256r1" ).DER_encode(Botan::EC_Group_Encoding::EC_DOMPAR_ENC_OID ) ); pub_generate_props.set_label( "BOTAN_TEST_ECDSA_PUB_KEY" ); pub_generate_props.set_token( true ); pub_generate_props.set_verify( true ); pub_generate_props.set_private( false ); pub_generate_props.set_modifiable( true ); Botan::PKCS11::PKCS11_ECDSA_KeyPair key_pair = Botan::PKCS11::generate_ecdsa_keypair( session, pub_generate_props, priv_generate_props ); /************ PKCS#11 ECDSA sign and verify *************/ std::vector plaintext( 20, 0x01 ); Botan::PK_Signer signer( key_pair.second, rng, "Raw", Botan::IEEE_1363, "pkcs11" ); auto signature = signer.sign_message( plaintext, rng ); Botan::PK_Verifier token_verifier( key_pair.first, "Raw", Botan::IEEE_1363, "pkcs11" ); bool ecdsa_ok = token_verifier.verify_message( plaintext, signature ); ECDH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PKCS#11 ECDH support is implemented in ````. .. rubric:: ECDH Public Keys PKCS#11 ECDH public keys are provided by the class :cpp:class:`PKCS11_ECDH_PublicKey`. This class inherits from :cpp:class:`PKCS11_EC_PublicKey`. The necessary property classes are defined in ````. For public keys there are :cpp:class:`EC_PublicKeyGenerationProperties` and :cpp:class:`EC_PublicKeyImportProperties`. .. cpp:class:: PKCS11_ECDH_PublicKey : public PKCS11_EC_PublicKey .. cpp:function:: PKCS11_ECDH_PublicKey(Session& session, ObjectHandle handle) Existing PKCS#11 ECDH private keys can be used by providing an :cpp:type:`ObjectHandle` to the constructor. .. cpp:function:: PKCS11_ECDH_PublicKey(Session& session, const EC_PublicKeyImportProperties& props) This constructor can be used to import an existing ECDH public key with the :cpp:class:`EC_PublicKeyImportProperties` passed in ``props`` to the token. .. cpp:function:: ECDH_PublicKey export_key() const Returns the exported :cpp:class:`ECDH_PublicKey`. .. rubric:: ECDH Private Keys The class :cpp:class:`PKCS11_ECDH_PrivateKey` inherits from :cpp:class:`PKCS11_EC_PrivateKey` and :cpp:class:`PK_Key_Agreement_Key` and implements support for PKCS#11 ECDH private keys. There are two property classes. One for key generation and one for import: :cpp:class:`EC_PrivateKeyGenerationProperties` and :cpp:class:`EC_PrivateKeyImportProperties`. .. cpp:class:: PKCS11_ECDH_PrivateKey : public virtual PKCS11_EC_PrivateKey, public virtual PK_Key_Agreement_Key .. cpp:function:: PKCS11_ECDH_PrivateKey(Session& session, ObjectHandle handle) Existing PKCS#11 ECDH private keys can be used by providing an :cpp:type:`ObjectHandle` to the constructor. .. cpp:function:: PKCS11_ECDH_PrivateKey(Session& session, const EC_PrivateKeyImportProperties& props) This constructor can be used to import an existing ECDH private key with the :cpp:class:`EC_PrivateKeyImportProperties` passed in ``props`` to the token. .. cpp:function:: PKCS11_ECDH_PrivateKey(Session& session, const std::vector& ec_params, const EC_PrivateKeyGenerationProperties& props) This constructor can be used to generate a new ECDH private key with the :cpp:class:`EC_PrivateKeyGenerationProperties` passed in ``props`` on the token. The ``ec_params`` parameter is the DER-encoding of an ANSI X9.62 Parameters value. .. cpp:function:: ECDH_PrivateKey export_key() const Returns the exported :cpp:class:`ECDH_PrivateKey`. PKCS#11 ECDH key pairs can be generated with the following free function: .. cpp:function:: PKCS11_ECDH_KeyPair PKCS11::generate_ecdh_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props) ---------- Code example: .. code-block:: cpp Botan::PKCS11::secure_string pin = { '1', '2', '3', '4', '5', '6' }; session.login( Botan::PKCS11::UserType::User, pin ); /************ import ECDH private key *************/ Botan::AutoSeeded_RNG rng; // create private key in software Botan::ECDH_PrivateKey priv_key_sw( rng, Botan::EC_Group( "secp256r1" ) ); priv_key_sw.set_parameter_encoding( Botan::EC_Group_Encoding::EC_DOMPAR_ENC_OID ); // set import properties Botan::PKCS11::EC_PrivateKeyImportProperties priv_import_props( priv_key_sw.DER_domain(), priv_key_sw.private_value() ); priv_import_props.set_token( true ); priv_import_props.set_private( true ); priv_import_props.set_derive( true ); priv_import_props.set_extractable( true ); // label std::string label = "test ECDH key"; priv_import_props.set_label( label ); // import to card Botan::PKCS11::PKCS11_ECDH_PrivateKey priv_key( session, priv_import_props ); /************ export ECDH private key *************/ Botan::ECDH_PrivateKey exported = priv_key.export_key(); /************ import ECDH public key *************/ // set import properties Botan::PKCS11::EC_PublicKeyImportProperties pub_import_props( priv_key_sw.DER_domain(), Botan::DER_Encoder().encode( EC2OSP( priv_key_sw.public_point(), Botan::PointGFp::UNCOMPRESSED ), Botan::OCTET_STRING ).get_contents_unlocked() ); pub_import_props.set_token( true ); pub_import_props.set_private( false ); pub_import_props.set_derive( true ); // label label = "test ECDH pub key"; pub_import_props.set_label( label ); // import Botan::PKCS11::PKCS11_ECDH_PublicKey pub_key( session, pub_import_props ); /************ export ECDH private key *************/ Botan::ECDH_PublicKey exported_pub = pub_key.export_key(); /************ generate ECDH private key *************/ Botan::PKCS11::EC_PrivateKeyGenerationProperties priv_generate_props; priv_generate_props.set_token( true ); priv_generate_props.set_private( true ); priv_generate_props.set_derive( true ); Botan::PKCS11::PKCS11_ECDH_PrivateKey priv_key2( session, Botan::EC_Group( "secp256r1" ).DER_encode( Botan::EC_Group_Encoding::EC_DOMPAR_ENC_OID ), priv_generate_props ); /************ generate ECDH key pair *************/ Botan::PKCS11::EC_PublicKeyGenerationProperties pub_generate_props( Botan::EC_Group( "secp256r1" ).DER_encode( Botan::EC_Group_Encoding::EC_DOMPAR_ENC_OID ) ); pub_generate_props.set_label( label + "_PUB_KEY" ); pub_generate_props.set_token( true ); pub_generate_props.set_derive( true ); pub_generate_props.set_private( false ); pub_generate_props.set_modifiable( true ); Botan::PKCS11::PKCS11_ECDH_KeyPair key_pair = Botan::PKCS11::generate_ecdh_keypair( session, pub_generate_props, priv_generate_props ); /************ ECDH derive *************/ Botan::PKCS11::PKCS11_ECDH_KeyPair key_pair_other = Botan::PKCS11::generate_ecdh_keypair( session, pub_generate_props, priv_generate_props ); Botan::PK_Key_Agreement ka( key_pair.second, rng, "Raw", "pkcs11" ); Botan::PK_Key_Agreement kb( key_pair_other.second, rng, "Raw", "pkcs11" ); Botan::SymmetricKey alice_key = ka.derive_key( 32, Botan::unlock( Botan::EC2OSP( key_pair_other.first.public_point(), Botan::PointGFp::UNCOMPRESSED ) ) ); Botan::SymmetricKey bob_key = kb.derive_key( 32, Botan::unlock( Botan::EC2OSP( key_pair.first.public_point(), Botan::PointGFp::UNCOMPRESSED ) ) ); bool eq = alice_key == bob_key; RNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The PKCS#11 RNG is defined in ````. The class :cpp:class:`PKCS11_RNG` implements the :cpp:class:`Hardware_RNG` interface. .. cpp:class:: PKCS11_RNG : public Hardware_RNG .. cpp:function:: PKCS11_RNG(Session& session) A PKCS#11 :cpp:class:`Session` must be passed to instantiate a ``PKCS11_RNG``. .. cpp:function:: void randomize(uint8_t output[], std::size_t length) override Calls :cpp:func:`C_GenerateRandom` to generate random data. .. cpp:function:: void add_entropy(const uint8_t in[], std::size_t length) override Calls :cpp:func:`C_SeedRandom` to add entropy to the random generation function of the token/middleware. ---------- Code example: .. code-block:: cpp Botan::PKCS11::PKCS11_RNG p11_rng( session ); /************ generate random data *************/ std::vector random( 20 ); p11_rng.randomize( random.data(), random.size() ); /************ add entropy *************/ Botan::AutoSeeded_RNG auto_rng; auto auto_rng_random = auto_rng.random_vec( 20 ); p11_rng.add_entropy( auto_rng_random.data(), auto_rng_random.size() ); /************ use PKCS#11 RNG to seed HMAC_DRBG *************/ Botan::HMAC_DRBG drbg( Botan::MessageAuthenticationCode::create( "HMAC(SHA-512)" ), p11_rng ); drbg.randomize( random.data(), random.size() ); Token Management Functions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The header file ```` also defines some free functions for token management: .. cpp:function:: void initialize_token(Slot& slot, const std::string& label, const secure_string& so_pin, const secure_string& pin) Initializes a token by passing a :cpp:class:`Slot`, a ``label`` and the ``so_pin`` of the security officer. .. cpp:function:: void change_pin(Slot& slot, const secure_string& old_pin, const secure_string& new_pin) Change PIN with ``old_pin`` to ``new_pin``. .. cpp:function:: void change_so_pin(Slot& slot, const secure_string& old_so_pin, const secure_string& new_so_pin) Change SO_PIN with ``old_so_pin`` to new ``new_so_pin``. .. cpp:function:: void set_pin(Slot& slot, const secure_string& so_pin, const secure_string& pin) Sets user ``pin`` with ``so_pin``. ---------- Code example: .. code-block:: cpp /************ set pin *************/ Botan::PKCS11::Module module( Middleware_path ); // only slots with connected token std::vector slots = Botan::PKCS11::Slot::get_available_slots( module, true ); // use first slot Botan::PKCS11::Slot slot( module, slots.at( 0 ) ); Botan::PKCS11::secure_string so_pin = { '1', '2', '3', '4', '5', '6', '7', '8' }; Botan::PKCS11::secure_string pin = { '1', '2', '3', '4', '5', '6' }; Botan::PKCS11::secure_string test_pin = { '6', '5', '4', '3', '2', '1' }; // set pin Botan::PKCS11::set_pin( slot, so_pin, test_pin ); // change back Botan::PKCS11::set_pin( slot, so_pin, pin ); /************ initialize *************/ Botan::PKCS11::initialize_token( slot, "Botan handbook example", so_pin, pin ); /************ change pin *************/ Botan::PKCS11::change_pin( slot, pin, test_pin ); // change back Botan::PKCS11::change_pin( slot, test_pin, pin ); /************ change security officer pin *************/ Botan::PKCS11::change_so_pin( slot, so_pin, test_pin ); // change back Botan::PKCS11::change_so_pin( slot, test_pin, so_pin ); X.509 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The header file ```` defines the property class :cpp:class:`X509_CertificateProperties` and the class :cpp:class:`PKCS11_X509_Certificate`. .. cpp:class:: PKCS11_X509_Certificate : public Object, public X509_Certificate .. cpp:function:: PKCS11_X509_Certificate(Session& session, ObjectHandle handle) Allows to use existing certificates on the token by passing a valid :cpp:type:`ObjectHandle`. .. cpp:function:: PKCS11_X509_Certificate(Session& session, const X509_CertificateProperties& props) Allows to import an existing X.509 certificate to the token with the :cpp:class:`X509_CertificateProperties` passed in ``props``. ---------- Code example: .. code-block:: cpp // load existing certificate Botan::X509_Certificate root( "test.crt" ); // set props Botan::PKCS11::X509_CertificateProperties props( Botan::DER_Encoder().encode( root.subject_dn() ).get_contents_unlocked(), root.BER_encode() ); props.set_label( "Botan PKCS#11 test certificate" ); props.set_private( false ); props.set_token( true ); // import Botan::PKCS11::PKCS11_X509_Certificate pkcs11_cert( session, props ); // load by handle Botan::PKCS11::PKCS11_X509_Certificate pkcs11_cert2( session, pkcs11_cert.handle() ); Tests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The PKCS#11 tests are not executed automatically because the depend on an external PKCS#11 module/middleware. The test tool has to be executed with ``--pkcs11-lib=`` followed with the path of the PKCS#11 module and a second argument which controls the PKCS#11 tests that are executed. Passing ``pkcs11`` will execute all PKCS#11 tests but it's also possible to execute only a subset with the following arguments: - pkcs11-ecdh - pkcs11-ecdsa - pkcs11-lowlevel - pkcs11-manage - pkcs11-module - pkcs11-object - pkcs11-rng - pkcs11-rsa - pkcs11-session - pkcs11-slot - pkcs11-x509 botan-2.4.0/doc/manual/psk_db.rst000066400000000000000000000106631322470703100166430ustar00rootroot00000000000000PSK Database ====================== .. versionadded:: 2.4.0 Many applications need to store pre-shared keys (hereafter PSKs) for authentication purposes. An abstract interface to PSK stores is provided in ``psk_db.h`` .. cpp:class:: PSK_Database .. cpp:function:: bool is_encrypted() const Returns true if (at least) the PSKs themselves are encrypted. Returns false if PSKs are stored in plaintext. .. cpp:function:: std::set list_names() const Return the set of valid names stored in the database, ie values for which ``get`` will return a value. .. cpp:function:: void set(const std::string& name, const uint8_t psk[], size_t psk_len) Save a PSK. If ``name`` already exists, the current value will be overwritten. .. cpp:function:: secure_vector get(const std::string& name) const Return a value saved with ``set``. Throws an exception if ``name`` doesn't exist. .. cpp:function:: void remove(const std::string& name) Remove ``name`` from the database. If ``name`` doesn't exist, ignores the request. .. cpp::function:: std::string get_str(const std::string& name) const Like ``get`` but casts the return value to a string. .. cpp:function:: void set_str(const std::string& name, const std::string& psk) Like ``set`` but accepts the psk as a string (eg for a password). .. cpp:function:: template void set_vec(const std::string& name, \ const std::vector& psk) Like ``set`` but accepting a vector. The same header also provides a specific instantiation of ``PSK_Database`` which encrypts both names and PSKs. It must be subclassed to provide the storage. .. cpp:class:: Encrypted_PSK_Database : public PSK_Database .. cpp:function:: Encrypted_PSK_Database(const secure_vector& master_key) Initializes or opens a PSK database. The master key is used the secure the contents. It may be of any length. If encrypting PSKs under a passphrase, use a suitable key derivation scheme (such as PBKDF2) to derive the secret key. If the master key is lost, all PSKs stored are unrecoverable. Both names and values are encrypted using NIST key wrapping (see NIST SP800-38F) with AES-256. First the master key is used with HMAC(SHA-256) to derive two 256-bit keys, one for encrypting all names and the other to key an instance of HMAC(SHA-256). Values are each encrypted under an individual key created by hashing the encrypted name with HMAC. This associates the encrypted key with the name, and prevents an attacker with write access to the data store from taking an encrypted key associated with one entity and copying it to another entity. Names and PSKs are both padded to the next multiple of 8 bytes, providing some obfuscation of the length. One artifact of the names being encrypted is that is is possible to use multiple different master keys with the same underlying storage. Each master key will be responsible for a subset of the keys. An attacker who knows one of the keys will be able to tell there are other values encrypted under another key. .. cpp:function:: virtual void kv_set(const std::string& index, const std::string& value) = 0 Save an encrypted value. Both ``index`` and ``value`` will be non-empty base64 encoded strings. .. cpp:function:: virtual std::string kv_get(const std::string& index) const = 0 Return a value saved with ``kv_set``, or return the empty string. .. cpp:function:: virtual void kv_del(const std::string& index) = 0 Remove a value saved with ``kv_set``. .. cpp:function:: virtual std::set kv_get_all() const = 0 Return all active names (ie values for which ``kv_get`` will return a non-empty string). A subclass of ``Encrypted_PSK_Database`` which stores data in a SQL database is also available. This class is declared in ``psk_db_sql.h``: .. cpp:class:: Encrypted_PSK_Database_SQL : public Encrypted_PSK_Database .. cpp:function:: Encrypted_PSK_Database_SQL(const secure_vector& master_key, \ std::shared_ptr db, \ const std::string& table_name) Creates or uses the named table in ``db``. The SQL schema of the table is ``(psk_name TEXT PRIMARY KEY, psk_value TEXT)``. botan-2.4.0/doc/manual/pubkey.rst000066400000000000000000001102661322470703100167000ustar00rootroot00000000000000Public Key Cryptography ================================= Public key cryptography (also called asymmetric cryptography) is a collection of techniques allowing for encryption, signatures, and key agreement. Key Objects ---------------------------------------- Public and private keys are represented by classes ``Public_Key`` and it's subclass ``Private_Key``. The use of inheritence here means that a ``Private_Key`` can be converted into a reference to a public key. None of the functions on ``Public_Key`` and ``Private_Key`` itself are particularly useful for users of the library, because 'bare' public key operations are *very insecure*. The only purpose of these functions is to provide a clean interface that higher level operations can be built on. So really the only thing you need to know is that when a function takes a reference to a ``Public_Key``, it can take any public key or private key, and similiarly for ``Private_Key``. Types of ``Public_Key`` include ``RSA_PublicKey``, ``DSA_PublicKey``, ``ECDSA_PublicKey``, ``ECKCDSA_PublicKey``, ``ECGDSA_PublicKey``, ``DH_PublicKey``, ``ECDH_PublicKey``, ``Curve25519_PublicKey``, ``ElGamal_PublicKey``, ``McEliece_PublicKey``, ``XMSS_PublicKey`` and ``GOST_3410_PublicKey``. There are cooresponding ``Private_Key`` classes for each of these algorithms. .. _creating_new_private_keys: Creating New Private Keys ---------------------------------------- Creating a new private key requires two things: a source of random numbers (see :ref:`random_number_generators`) and some algorithm specific parameters that define the *security level* of the resulting key. For instance, the security level of an RSA key is (at least in part) defined by the length of the public key modulus in bits. So to create a new RSA private key, you would call .. cpp:function:: RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, size_t bits) A constructor that creates a new random RSA private key with a modulus of length *bits*. Algorithms based on the discrete-logarithm problem use what is called a *group*; a group can safely be used with many keys, and for some operations, like key agreement, the two keys *must* use the same group. There are currently two kinds of discrete logarithm groups supported in botan: the integers modulo a prime, represented by :ref:`dl_group`, and elliptic curves in GF(p), represented by :ref:`ec_group`. A rough generalization is that the larger the group is, the more secure the algorithm is, but correspondingly the slower the operations will be. Given a ``DL_Group``, you can create new DSA, Diffie-Hellman and ElGamal key pairs with .. cpp:function:: DSA_PrivateKey::DSA_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) .. cpp:function:: DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) .. cpp:function:: ElGamal_PrivateKey::ElGamal_PrivateKey(RandomNumberGenerator& rng, \ const DL_Group& group, const BigInt& x = 0) The optional *x* parameter to each of these constructors is a private key value. This allows you to create keys where the private key is formed by some special technique; for instance you can use the hash of a password (see :ref:`pbkdf` for how to do that) as a private key value. Normally, you would leave the value as zero, letting the class generate a new random key. Finally, given an ``EC_Group`` object, you can create a new ECDSA, ECKCDSA, ECGDSA, ECDH, or GOST 34.10-2001 private key with .. cpp:function:: ECDSA_PrivateKey::ECDSA_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. cpp:function:: ECKCDSA_PrivateKey::ECKCDSA_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. cpp:function:: ECGDSA_PrivateKey::ECGDSA_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. cpp:function:: ECDH_PrivateKey::ECDH_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. cpp:function:: GOST_3410_PrivateKey::GOST_3410_PrivateKey(RandomNumberGenerator& rng, \ const EC_Group& domain, const BigInt& x = 0) .. _serializing_private_keys: Serializing Private Keys Using PKCS #8 ---------------------------------------- The standard format for serializing a private key is PKCS #8, the operations for which are defined in ``pkcs8.h``. It supports both unencrypted and encrypted storage. .. cpp:function:: secure_vector PKCS8::BER_encode(const Private_Key& key, \ RandomNumberGenerator& rng, const std::string& password, const std::string& pbe_algo = "") Takes any private key object, serializes it, encrypts it using *password*, and returns a binary structure representing the private key. The final (optional) argument, *pbe_algo*, specifies a particular password based encryption (or PBE) algorithm. If you don't specify a PBE, a sensible default will be used. .. cpp:function:: std::string PKCS8::PEM_encode(const Private_Key& key, \ RandomNumberGenerator& rng, const std::string& pass, const std::string& pbe_algo = "") This formats the key in the same manner as ``BER_encode``, but additionally encodes it into a text format with identifying headers. Using PEM encoding is *highly* recommended for many reasons, including compatibility with other software, for transmission over 8-bit unclean channels, because it can be identified by a human without special tools, and because it sometimes allows more sane behavior of tools that process the data. Unencrypted serialization is also supported. .. warning:: In most situations, using unecrypted private key storage is a bad idea, because anyone can come along and grab the private key without having to know any passwords or other secrets. Unless you have very particular security requirements, always use the versions that encrypt the key based on a passphrase, described above. .. cpp:function:: secure_vector PKCS8::BER_encode(const Private_Key& key) Serializes the private key and returns the result. .. cpp:function:: std::string PKCS8::PEM_encode(const Private_Key& key) Serializes the private key, base64 encodes it, and returns the result. Last but not least, there are some functions that will load (and decrypt, if necessary) a PKCS #8 private key: .. cpp:function:: Private_Key* PKCS8::load_key(DataSource& in, \ RandomNumberGenerator& rng, const User_Interface& ui) .. cpp:function:: Private_Key* PKCS8::load_key(DataSource& in, \ RandomNumberGenerator& rng, std::string passphrase = "") .. cpp:function:: Private_Key* PKCS8::load_key(const std::string& filename, \ RandomNumberGenerator& rng, const User_Interface& ui) .. cpp:function:: Private_Key* PKCS8::load_key(const std::string& filename, \ RandomNumberGenerator& rng, const std::string& passphrase = "") These functions will return an object allocated key object based on the data from whatever source it is using (assuming, of course, the source is in fact storing a representation of a private key, and the decryption was successful). The encoding used (PEM or BER) need not be specified; the format will be detected automatically. The key is allocated with ``new``, and should be released with ``delete`` when you are done with it. The first takes a generic ``DataSource`` that you have to create - the other is a simple wrapper functions that take either a filename or a memory buffer and create the appropriate ``DataSource``. The versions taking a ``std::string`` attempt to decrypt using the password given (if the key is encrypted; if it is not, the passphase value will be ignored). If the passphrase does not decrypt the key, an exception will be thrown. The ones taking a ``User_Interface`` provide a simple callback interface which makes handling incorrect passphrases and such a bit simpler. A ``User_Interface`` has very little to do with talking to users; it's just a way to glue together Botan and whatever user interface you happen to be using. .. note:: In a future version, it is likely that ``User_Interface`` will be replaced by a simple callback using ``std::function``. To use ``User_Interface``, derive a subclass and implement: .. cpp:function:: std::string User_Interface::get_passphrase(const std::string& what, \ const std::string& source, UI_Result& result) const The ``what`` argument specifies what the passphrase is needed for (for example, PKCS #8 key loading passes ``what`` as "PKCS #8 private key"). This lets you provide the user with some indication of *why* your application is asking for a passphrase; feel free to pass the string through ``gettext(3)`` or moral equivalent for i18n purposes. Similarly, ``source`` specifies where the data in question came from, if available (for example, a file name). If the source is not available for whatever reason, then ``source`` will be an empty string; be sure to account for this possibility. The function returns the passphrase as the return value, and a status code in ``result`` (either ``OK`` or ``CANCEL_ACTION``). If ``CANCEL_ACTION`` is returned in ``result``, then the return value will be ignored, and the caller will take whatever action is necessary (typically, throwing an exception stating that the passphrase couldn't be determined). In the specific case of PKCS #8 key decryption, a ``Decoding_Error`` exception will be thrown; your UI should assume this can happen, and provide appropriate error handling (such as putting up a dialog box informing the user of the situation, and canceling the operation in progress). .. _serializing_public_keys: Serializing Public Keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To import and export public keys, use: .. cpp:function:: std::vector X509::BER_encode(const Public_Key& key) .. cpp:function:: std::string X509::PEM_encode(const Public_Key& key) .. cpp:function:: Public_Key* X509::load_key(DataSource& in) .. cpp:function:: Public_Key* X509::load_key(const secure_vector& buffer) .. cpp:function:: Public_Key* X509::load_key(const std::string& filename) These functions operate in the same way as the ones described in :ref:`serializing_private_keys`, except that no encryption option is availabe. .. _dl_group: DL_Group ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As described in :ref:`creating_new_private_keys`, a discrete logarithm group can be shared among many keys, even keys created by users who do not trust each other. However, it is necessary to trust the entity who created the group; that is why organization like NIST use algorithms which generate groups in a deterministic way such that creating a bogus group would require breaking some trusted cryptographic primitive like SHA-2. Instantiating a ``DL_Group`` simply requires calling .. cpp:function:: DL_Group::DL_Group(const std::string& name) The *name* parameter is a specially formatted string that consists of three things, the type of the group ("modp" or "dsa"), the creator of the group, and the size of the group in bits, all delimited by '/' characters. Currently all "modp" groups included in botan are ones defined by the Internet Engineering Task Force, so the provider is "ietf", and the strings look like "modp/ietf/N" where N can be any of 1024, 1536, 2048, 3072, 4096, 6144, or 8192. This group type is used for Diffie-Hellman and ElGamal algorithms. The other type, "dsa" is used for DSA keys. They can also be used with Diffie-Hellman and ElGamal, but this is less common. The currently available groups are "dsa/jce/1024" and "dsa/botan/N" with N being 2048 or 3072. The "jce" groups are the standard DSA groups used in the Java Cryptography Extensions, while the "botan" groups were randomly generated using the FIPS 186-3 algorithm by the library maintainers. You can generate a new random group using .. cpp:function:: DL_Group::DL_Group(RandomNumberGenerator& rng, \ PrimeType type, size_t pbits, size_t qbits = 0) The *type* can be either ``Strong``, ``Prime_Subgroup``, or ``DSA_Kosherizer``. *pbits* specifies the size of the prime in bits. If the *type* is ``Prime_Subgroup`` or ``DSA_Kosherizer``, then *qbits* specifies the size of the subgroup. You can serialize a ``DL_Group`` using .. cpp:function:: secure_vector DL_Group::DER_Encode(Format format) or .. cpp:function:: std::string DL_Group::PEM_encode(Format format) where *format* is any of * ``ANSI_X9_42`` (or ``DH_PARAMETERS``) for modp groups * ``ANSI_X9_57`` (or ``DSA_PARAMETERS``) for DSA-style groups * ``PKCS_3`` is an older format for modp groups; it should only be used for backwards compatibility. You can reload a serialized group using .. cpp:function:: void DL_Group::BER_decode(DataSource& source, Format format) .. cpp:function:: void DL_Group::PEM_decode(DataSource& source) Code Example """"""""""""""""" The example below creates a new 2048 bit ``DL_Group``, prints the generated parameters and ANSI_X9_42 encodes the created group for further usage with DH. .. code-block:: cpp #include #include #include #include int main() { std::unique_ptr rng(new Botan::AutoSeeded_RNG); std::unique_ptr group(new Botan::DL_Group(*rng.get(), Botan::DL_Group::Strong, 2048)); std::cout << std::endl << "p: " << group->get_p(); std::cout << std::endl << "q: " << group->get_q(); std::cout << std::endl << "g: " << group->get_q(); std::cout << std::endl << "ANSI_X9_42: " << std::endl << group->PEM_encode(Botan::DL_Group::ANSI_X9_42); return 0; } .. _ec_group: EC_Group ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ An ``EC_Group`` is initialized by passing the name of the group to be used to the constructor. These groups have semi-standardized names like "secp256r1" and "brainpool512r1". Key Checking --------------------------------- Most public key algorithms have limitations or restrictions on their parameters. For example RSA requires an odd exponent, and algorithms based on the discrete logarithm problem need a generator > 1. Each public key type has a function .. cpp:function:: bool Public_Key::check_key(RandomNumberGenerator& rng, bool strong) This function performs a number of algorithm-specific tests that the key seems to be mathematically valid and consistent, and returns true if all of the tests pass. It does not have anything to do with the validity of the key for any particular use, nor does it have anything to do with certificates that link a key (which, after all, is just some numbers) with a user or other entity. If *strong* is ``true``, then it does "strong" checking, which includes expensive operations like primality checking. As key checks are not automatically performed they must be called manually after loading keys from untrusted sources. If a key from an untrusted source is not checked, the implementation might be vulnerable to algorithm specific attacks. The following example loads the Subject Public Key from the x509 certificate ``cert.pem`` and checks the loaded key. If the key check fails a respective error is thrown. .. code-block:: cpp #include #include #include int main() { Botan::X509_Certificate cert("cert.pem"); std::unique_ptr rng(new Botan::AutoSeeded_RNG); std::unique_ptr key(cert.subject_public_key()); if(!key->check_key(*rng.get(), false)) { throw std::invalid_argument("Loaded key is invalid"); } } Encryption --------------------------------- Safe public key encryption requires the use of a padding scheme which hides the underlying mathematical properties of the algorithm. Additionally, they will add randomness, so encrypting the same plaintext twice produces two different ciphertexts. The primary interface for encryption is .. cpp:class:: PK_Encryptor .. cpp:function:: secure_vector encrypt( \ const uint8_t* in, size_t length, RandomNumberGenerator& rng) const .. cpp:function:: secure_vector encrypt( \ const std::vector& in, RandomNumberGenerator& rng) const These encrypt a message, returning the ciphertext. .. cpp:function:: size_t maximum_input_size() const Returns the maximum size of the message that can be processed, in bytes. If you call :cpp:func:`PK_Encryptor::encrypt` with a value larger than this the operation will fail with an exception. :cpp:class:`PK_Encryptor` is only an interface - to actually encrypt you have to create an implementation, of which there are currently three available in the library, :cpp:class:`PK_Encryptor_EME`, :cpp:class:`DLIES_Encryptor` and :cpp:class:`ECIES_Encryptor`. DLIES is a hybrid encryption scheme (from IEEE 1363) that uses the DH key agreement technique in combination with a KDF, a MAC and a symmetric encryption algorithm to perform message encryption. ECIES is similar to DLIES, but uses ECDH for the key agreement. Normally, public key encryption is done using algorithms which support it directly, such as RSA or ElGamal; these use the EME class: .. cpp:class:: PK_Encryptor_EME .. cpp:function:: PK_Encryptor_EME(const Public_Key& key, std::string eme) With *key* being the key you want to encrypt messages to. The padding method to use is specified in *eme*. The recommended values for *eme* is "EME1(SHA-1)" or "EME1(SHA-256)". If you need compatibility with protocols using the PKCS #1 v1.5 standard, you can also use "EME-PKCS1-v1_5". .. cpp:class:: DLIES_Encryptor Available in the header ``dlies.h`` .. cpp:function:: DLIES_Encryptor(const DH_PrivateKey& own_priv_key, \ RandomNumberGenerator& rng, KDF* kdf, MessageAuthenticationCode* mac, \ size_t mac_key_len = 20) Where *kdf* is a key derivation function (see :ref:`key_derivation_function`) and *mac* is a MessageAuthenticationCode. The encryption is performed by XORing the message with a stream of bytes provided by the KDF. .. cpp:function:: DLIES_Encryptor(const DH_PrivateKey& own_priv_key, \ RandomNumberGenerator& rng, KDF* kdf, Cipher_Mode* cipher, \ size_t cipher_key_len, MessageAuthenticationCode* mac, \ size_t mac_key_len = 20) Instead of XORing the message a block cipher can be specified. .. cpp:class:: ECIES_Encryptor Available in the header ``ecies.h``. Parameters for encryption and decryption are set by the :cpp:class:`ECIES_System_Params` class which stores the EC domain parameters, the KDF (see :ref:`key_derivation_function`), the cipher (see :ref:`cipher_modes`) and the MAC. .. cpp:function:: ECIES_Encryptor(const PK_Key_Agreement_Key& private_key, \ const ECIES_System_Params& ecies_params, \ RandomNumberGenerator& rng) Where *private_key* is the key to use for the key agreement. The system paramters are specified in *ecies_params* and the RNG to use is passed in *rng*. .. cpp:function:: ECIES_Encryptor(RandomNumberGenerator& rng, \ const ECIES_System_Params& ecies_params) Creates an ephemeral private key which is used for the key agreement. The decryption classes are named :cpp:class:`PK_Decryptor`, :cpp:class:`PK_Decryptor_EME`, :cpp:class:`DLIES_Decryptor` and :cpp:class:`ECIES_Decryptor`. They are created in the exact same way, except they take the private key, and the processing function is named ``decrypt``. Botan implements the following encryption algorithms and padding schemes: 1. RSA - "PKCS1v15" || "EME-PKCS1-v1_5" - "OAEP" || "EME-OAEP" || "EME1" || "EME1(SHA-1)" || "EME1(SHA-256)" #. DLIES #. ECIES #. SM2 Code Example ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The following Code sample reads a PKCS #8 keypair from the passed location and subsequently encrypts a fixed plaintext with the included public key, using EME1 with SHA-256. For the sake of completeness, the ciphertext is then decrypted using the private key. .. code-block:: cpp #include #include #include #include #include #include #include int main (int argc, char* argv[]) { if(argc!=2) return 1; std::string plaintext("Your great-grandfather gave this watch to your granddad for good luck. Unfortunately, Dane's luck wasn't as good as his old man's."); std::vector pt(plaintext.data(),plaintext.data()+plaintext.length()); std::unique_ptr rng(new Botan::AutoSeeded_RNG); //load keypair std::unique_ptr kp(Botan::PKCS8::load_key(argv[1],*rng.get())); //encrypt with pk Botan::PK_Encryptor_EME enc(*kp,*rng.get(), "EME1(SHA-256)"); std::vector ct = enc.encrypt(pt,*rng.get()); //decrypt with sk Botan::PK_Decryptor_EME dec(*kp,*rng.get(), "EME1(SHA-256)"); std::cout << std::endl << "enc: " << Botan::hex_encode(ct) << std::endl << "dec: "<< Botan::hex_encode(dec.decrypt(ct)); return 0; } Signatures --------------------------------- Signature generation is performed using .. cpp:class:: PK_Signer .. cpp:function:: PK_Signer(const Private_Key& key, \ const std::string& emsa, \ Signature_Format format = IEEE_1363) Constructs a new signer object for the private key *key* using the signature format *emsa*. The key must support signature operations. In the current version of the library, this includes RSA, DSA, ECDSA, ECKCDSA, ECGDSA, GOST 34.10-2001. Other signature schemes may be supported in the future. .. note:: Botan both supports non-deterministic and deterministic (as per RFC 6979) DSA and ECDSA signatures. Deterministic signatures are compatible in the way that they can be verified with a non-deterministic implementation. If the ``rfc6979`` module is enabled, deterministic DSA and ECDSA signatures will be generated. Currently available values for *emsa* include EMSA1, EMSA2, EMSA3, EMSA4, and Raw. All of them, except Raw, take a parameter naming a message digest function to hash the message with. The Raw encoding signs the input directly; if the message is too big, the signing operation will fail. Raw is not useful except in very specialized applications. Examples are "EMSA1(SHA-1)" and "EMSA4(SHA-256)". For RSA, use EMSA4 (also called PSS) unless you need compatibility with software that uses the older PKCS #1 v1.5 standard, in which case use EMSA3 (also called "EMSA-PKCS1-v1_5"). For DSA, ECDSA, ECKCDSA, ECGDSA and GOST 34.10-2001 you should use EMSA1. The *format* defaults to ``IEEE_1363`` which is the only available format for RSA. For DSA, ECDSA, ECGDSA and ECKCDSA you can also use ``DER_SEQUENCE``, which will format the signature as an ASN.1 SEQUENCE value. .. cpp:function:: void update(const uint8_t* in, size_t length) .. cpp:function:: void update(const std::vector& in) .. cpp:function:: void update(uint8_t in) These add more data to be included in the signature computation. Typically, the input will be provided directly to a hash function. .. cpp:function:: secure_vector signature(RandomNumberGenerator& rng) Creates the signature and returns it .. cpp:function:: secure_vector sign_message( \ const uint8_t* in, size_t length, RandomNumberGenerator& rng) .. cpp:function:: secure_vector sign_message( \ const std::vector& in, RandomNumberGenerator& rng) These functions are equivalent to calling :cpp:func:`PK_Signer::update` and then :cpp:func:`PK_Signer::signature`. Any data previously provided using ``update`` will be included. Signatures are verified using .. cpp:class:: PK_Verifier .. cpp:function:: PK_Verifier(const Public_Key& pub_key, \ const std::string& emsa, Signature_Format format = IEEE_1363) Construct a new verifier for signatures assicated with public key *pub_key*. The *emsa* and *format* should be the same as that used by the signer. .. cpp:function:: void update(const uint8_t* in, size_t length) .. cpp:function:: void update(const std::vector& in) .. cpp:function:: void update(uint8_t in) Add further message data that is purportedly assocated with the signature that will be checked. .. cpp:function:: bool check_signature(const uint8_t* sig, size_t length) .. cpp:function:: bool check_signature(const std::vector& sig) Check to see if *sig* is a valid signature for the message data that was written in. Return true if so. This function clears the internal message state, so after this call you can call :cpp:func:`PK_Verifier::update` to start verifying another message. .. cpp:function:: bool verify_message(const uint8_t* msg, size_t msg_length, \ const uint8_t* sig, size_t sig_length) .. cpp:function:: bool verify_message(const std::vector& msg, \ const std::vector& sig) These are equivalent to calling :cpp:func:`PK_Verifier::update` on *msg* and then calling :cpp:func:`PK_Verifier::check_signature` on *sig*. Botan implements the following signature algorithms: 1. RSA #. DSA #. ECDSA #. ECGDSA #. ECKDSA #. GOST 34.10-2001 #. Ed25519 #. SM2 Code Example ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The following sample program below demonstrates the generation of a new ECDSA keypair over the curve secp512r1 and a ECDSA signature using EMSA1 with SHA-256. Subsequently the computed signature is validated. .. code-block:: cpp #include #include #include #include #include #include int main() { Botan::AutoSeeded_RNG rng; // Generate ECDSA keypair Botan::ECDSA_PrivateKey key(rng, Botan::EC_Group("secp521r1")); std::string text("This is a tasty burger!"); std::vector data(text.data(),text.data()+text.length()); // sign data Botan::PK_Signer signer(key, rng, "EMSA1(SHA-256)"); signer.update(data); std::vector signature = signer.signature(rng); std::cout << "Signature:" << std::endl << Botan::hex_encode(signature); // verify signature Botan::PK_Verifier verifier(key, "EMSA1(SHA-256)"); verifier.update(data); std::cout << std::endl << "is " << (verifier.check_signature(signature)? "valid" : "invalid"); return 0; } Key Agreement --------------------------------- You can get a hold of a ``PK_Key_Agreement_Scheme`` object by calling ``get_pk_kas`` with a key that is of a type that supports key agreement (such as a Diffie-Hellman key stored in a ``DH_PrivateKey`` object), and the name of a key derivation function. This can be "Raw", meaning the output of the primitive itself is returned as the key, or "KDF1(hash)" or "KDF2(hash)" where "hash" is any string you happen to like (hopefully you like strings like "SHA-256" or "RIPEMD-160"), or "X9.42-PRF(keywrap)", which uses the PRF specified in ANSI X9.42. It takes the name or OID of the key wrap algorithm that will be used to encrypt a content encryption key. How key agreement works is that you trade public values with some other party, and then each of you runs a computation with the other's value and your key (this should return the same result to both parties). This computation can be called by using ``derive_key`` with either a byte array/length pair, or a ``secure_vector`` than holds the public value of the other party. The last argument to either call is a number that specifies how long a key you want. Depending on the KDF you're using, you *might not* get back a key of the size you requested. In particular "Raw" will return a number about the size of the Diffie-Hellman modulus, and KDF1 can only return a key that is the same size as the output of the hash. KDF2, on the other hand, will always give you a key exactly as long as you request, regardless of the underlying hash used with it. The key returned is a ``SymmetricKey``, ready to pass to a block cipher, MAC, or other symmetric algorithm. The public value that should be used can be obtained by calling ``public_data``, which exists for any key that is associated with a key agreement algorithm. It returns a ``secure_vector``. "KDF2(SHA-256)" is by far the preferred algorithm for key derivation in new applications. The X9.42 algorithm may be useful in some circumstances, but unless you need X9.42 compatibility, KDF2 is easier to use. Botan implements the following key agreement methods: 1. ECDH over GF(p) Weierstrass curves #. ECDH over x25519 #. DH over prime fields #. McEliece #. NewHope Code Example ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The code below performs an unauthenticated ECDH key agreement using the secp521r elliptic curve and applies the key derivation function KDF2(SHA-256) with 256 bit output length to the computed shared secret. .. code-block:: cpp #include #include #include #include #include #include int main() { Botan::AutoSeeded_RNG rng // ec domain and Botan::EC_Group domain("secp521r1"); std::string kdf = "KDF2(SHA-256)"; // generate ECDH keys Botan::ECDH_PrivateKey keyA(rng, domain); Botan::ECDH_PrivateKey keyB(rng, domain); // Construct key agreements Botan::PK_Key_Agreement ecdhA(keyA,rng,kdf); Botan::PK_Key_Agreement ecdhB(keyB,rng,kdf); // Agree on shared secret and derive symmetric key of 256 bit length Botan::secure_vector sA = ecdhA.derive_key(32,keyB.public_value()).bits_of(); Botan::secure_vector sB = ecdhB.derive_key(32,keyA.public_value()).bits_of(); if(sA != sB) return 1; std::cout << "agreed key: " << std::endl << Botan::hex_encode(sA); return 0; } McEliece -------------------------- McEliece is a cryptographic scheme based on error correcting codes which is thought to be resistent to quantum computers. First proposed in 1978, it is fast and patent-free. Variants have been proposed and broken, but with suitable parameters the original scheme remains secure. However the public keys are quite large, which has hindered deployment in the past. The implementation of McEliece in Botan was contributed by cryptosource GmbH. It is based on the implementation HyMES, with the kind permission of Nicolas Sendrier and INRIA to release a C++ adaption of their original C code under the Botan license. It was then modified by Falko Strenzke to add side channel and fault attack countermeasures. You can read more about the implementation at http://www.cryptosource.de/docs/mceliece_in_botan.pdf Encryption in the McEliece scheme consists of choosing a message block of size `n`, encoding it in the error correcting code which is the public key, then adding `t` bit errors. The code is created such that knowing only the public key, decoding `t` errors is intractible, but with the additional knowledge of the secret structure of the code a fast decoding technique exists. The McEliece implementation in HyMES, and also in Botan, uses an optimization to reduce the public key size, by converting the public key into a systemic code. This means a portion of the public key is a identity matrix, and can be excluded from the published public key. However it also means that in McEliece the plaintext is represented directly in the ciphertext, with only a small number of bit errors. Thus it is absolutely essential to only use McEliece with a CCA2 secure scheme. One such scheme, KEM, is provided in Botan currently. It it a somewhat unusual scheme in that it outputs two values, a symmetric key for use with an AEAD, and an encrypted key. It does this by choosing a random plaintext (n - log2(n)*t bits) using ``McEliece_PublicKey::random_plaintext_element``. Then a random error mask is chosen and the message is coded and masked. The symmetric key is SHA-512(plaintext || error_mask). As long as the resulting key is used with a secure AEAD scheme (which can be used for transporting arbitrary amounts of data), CCA2 security is provided. In ``mcies.h`` there are functions for this combination: .. cpp:function:: secure_vector mceies_encrypt(const McEliece_PublicKey& pubkey, \ const secure_vector& pt, \ uint8_t ad[], size_t ad_len, \ RandomNumberGenerator& rng, \ const std::string& aead = "AES-256/OCB") .. cpp:function:: secure_vector mceies_decrypt(const McEliece_PrivateKey& privkey, \ const secure_vector& ct, \ uint8_t ad[], size_t ad_len, \ const std::string& aead = "AES-256/OCB") For a given security level (SL) a McEliece key would use parameters n and t, and have the cooresponding key sizes listed: +-----+------+-----+---------------+----------------+ | SL | n | t | public key KB | private key KB | +=====+======+=====+===============+================+ | 80 | 1632 | 33 | 59 | 140 | +-----+------+-----+---------------+----------------+ | 107 | 2280 | 45 | 128 | 300 | +-----+------+-----+---------------+----------------+ | 128 | 2960 | 57 | 195 | 459 | +-----+------+-----+---------------+----------------+ | 147 | 3408 | 67 | 265 | 622 | +-----+------+-----+---------------+----------------+ | 191 | 4624 | 95 | 516 | 1234 | +-----+------+-----+---------------+----------------+ | 256 | 6624 | 115 | 942 | 2184 | +-----+------+-----+---------------+----------------+ You can check the speed of McEliece with the suggested parameters above using ``botan speed McEliece`` eXtended Merkle Signature Scheme (XMSS) ---------------------------------------- Botan implements the single tree version of the eXtended Merkle Signature Scheme (XMSS) using Winternitz One Time Signatures+ (WOTS+). The implementation is based on IETF Internet-Draft "XMSS: Extended Hash-Based Signatures". XMSS uses the Botan interfaces for public key cryptography. The following algorithms are implemented: 1. XMSS_SHA2-256_W16_H10 #. XMSS_SHA2-256_W16_H16 #. XMSS_SHA2-256_W16_H20 #. XMSS_SHA2-512_W16_H10 #. XMSS_SHA2-512_W16_H16 #. XMSS_SHA2-512_W16_H20 #. XMSS_SHAKE128_W16_H10 #. XMSS_SHAKE128_W16_H10 #. XMSS_SHAKE128_W16_H10 #. XMSS_SHAKE256_W16_H10 #. XMSS_SHAKE256_W16_H10 #. XMSS_SHAKE256_W16_H10 Code Example ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The following code snippet shows a minimum example on how to create an XMSS public/private key pair and how to use these keys to create and verify a signature: .. code-block:: cpp #include #include #include int main() { // Create a random number generator used for key generation. Botan::AutoSeeded_RNG rng; // create a new public/private key pair using SHA2 256 as hash // function and a tree height of 10. Botan::XMSS_PrivateKey private_key( Botan::XMSS_Parameters::xmss_algorithm_t::XMSS_SHA2_256_W16_H10, rng); Botan::XMSS_PublicKey public_key(private_key); // create signature operation using the private key. std::unique_ptr sig_op = private_key.create_signature_op(rng, "", ""); // create and sign a message using the signature operation. Botan::secure_vector msg { 0x01, 0x02, 0x03, 0x04 }; sig_op->update(msg.data(), msg.size()); Botan::secure_vector sig = sig_op->sign(rng); // create verification operation using the public key std::unique_ptr ver_op = public_key.create_verification_op("", ""); // verify the signature for the previously generated message. ver_op->update(msg.data(), msg.size()); if(ver_op->is_valid_signature(sig.data(), sig.size())) { std::cout << "Success." << std::endl; } else { std::cout << "Error." << std::endl; } } botan-2.4.0/doc/manual/python.rst000066400000000000000000000146461322470703100167270ustar00rootroot00000000000000 Python Binding ======================================== .. versionadded:: 1.11.14 .. highlight:: python .. py:module:: botan The Python binding is based on the `ffi` module of botan and the `ctypes` module of the Python standard library. Versioning ---------------------------------------- .. py:function:: version_major() Returns the major number of the library version (currently, 1) .. py:function:: version_minor() Returns the minor number of the library version (currently, 11) .. py:function:: version_patch() Returns the patch number of the library version (currently, 14) .. py:function:: version_string() Returns a free form version string for the library Random Number Generators ---------------------------------------- .. py:class:: rng(rng_type = 'system') Type 'user' also allowed (userspace HKDF RNG seeded from system rng). The system RNG is very cheap to create, as just a single file handle or CSP handle is kept open, from first use until shutdown, no matter how many 'system' rng instances are created. Thus it is easy to use the RNG in a one-off way, with `botan.rng().get(32)`. .. py:method:: get(length) Return some bits .. py:method:: reseed(bits = 256) Meaningless on system RNG, on userspace RNG causes a reseed/rekey Hash Functions ---------------------------------------- .. py:class:: hash_function(algo) Algo is a string (eg 'SHA-1', 'SHA-384', 'Skein-512') .. py:method:: clear() Clear state .. py:method:: output_length() .. py:method:: update(x) Add some input .. py:method:: final() Returns the hash of all input provided, resets for another message. Message Authentication Codes ---------------------------------------- .. py:class:: message_authentication_code(algo) Algo is a string (eg 'HMAC(SHA-256)', 'Poly1305', 'CMAC(AES-256)') .. py:method:: clear() .. py:method:: output_length() .. py:method:: set_key(key) Set the key .. py:method:: update(x) Add some input .. py:method:: final() Returns the MAC of all input provided, resets for another message with the same key. Ciphers ---------------------------------------- .. py:class:: cipher(object, algo, encrypt = True) The algorithm is spcified as a string (eg 'AES-128/GCM', 'Serpent/OCB(12)', 'Threefish-512/EAX'). Set the second param to False for decryption .. py:method:: tag_length() Returns the tag length (0 for unauthenticated modes) .. py:method:: default_nonce_length() Returns default nonce length .. py:method:: update_granularity() Returns update block size. Call to update() must provide input of exactly this many bytes .. py:method:: is_authenticated() Returns True if this is an AEAD mode .. py:method:: valid_nonce_length(nonce_len) Returns True if nonce_len is a valid nonce len for this mode .. py:method:: clear() Resets all state .. py:method:: set_key(key) Set the key .. py:method:: start(nonce) Start processing a message using nonce .. py:method:: update(txt) Consumes input text and returns output. Input text must be of update_granularity() length. Alternately, always call finish with the entire message, avoiding calls to update entirely .. py:method:: finish(txt = None) Finish processing (with an optional final input). May throw if message authentication checks fail, in which case all plaintext previously processed must be discarded. You may call finish() with the entire message Bcrypt ---------------------------------------- .. py:function:: bcrypt(passwd, rng, work_factor = 10) Provided the password and an RNG object, returns a bcrypt string .. py:function:: check_bcrypt(passwd, bcrypt) Check a bcrypt hash against the provided password, returning True iff the password matches. PBKDF ---------------------------------------- .. py:function:: pbkdf(algo, password, out_len, iterations = 100000, salt = rng().get(12)) Runs a PBKDF2 algo specified as a string (eg 'PBKDF2(SHA-256)', 'PBKDF2(CMAC(Blowfish))'). Runs with n iterations with meaning depending on the algorithm. The salt can be provided or otherwise is randomly chosen. In any case it is returned from the call. Returns out_len bytes of output (or potentially less depending on the algorithm and the size of the request). Returns tuple of salt, iterations, and psk .. py:function:: pbkdf_timed(algo, password, out_len, ms_to_run = 300, salt = rng().get(12)) Runs for as many iterations as needed to consumed ms_to_run milliseconds on whatever we're running on. Returns tuple of salt, iterations, and psk KDF ---------------------------------------- .. py:function:: kdf(algo, secret, out_len, salt) Public Key ---------------------------------------- .. py:class:: public_key(object) .. py:method:: fingerprint(hash = 'SHA-256') .. py:class:: private_key(algo, param, rng) Constructor creates a new private key. The parameter type/value depends on the algorithm. For "rsa" is is the size of the key in bits. For "ecdsa" and "ecdh" it is a group name (for instance "secp256r1"). For "ecdh" there is also a special case for group "curve25519" (which is actually a completely distinct key type with a non-standard encoding). .. py:method:: get_public_key() Return a public_key object .. py:method:: export() Public Key Operations ---------------------------------------- .. py:class:: pk_op_encrypt(pubkey, padding) .. py:method:: encrypt(msg, rng) .. py:class:: pk_op_decrypt(privkey, padding) .. py:method:: decrypt(msg) .. py:class:: pk_op_sign(privkey, hash_w_padding) .. py:method:: update(msg) .. py:method:: finish(rng) .. py:class:: pk_op_verify(pubkey, hash_w_padding) .. py:method:: update(msg) .. py:method:: check_signature(signature) .. py:class:: pk_op_key_agreement(privkey, kdf) .. py:method:: public_value() Returns the public value to be passed to the other party .. py:method:: agree(other, key_len, salt) Returns a key derived by the KDF. botan-2.4.0/doc/manual/rng.rst000066400000000000000000000137641322470703100161740ustar00rootroot00000000000000.. _random_number_generators: Random Number Generators ======================================== The base class ``RandomNumberGenerator`` is in the header ``botan/rng.h``. The major interfaces are .. cpp:function:: void RandomNumberGenerator::randomize(uint8_t* output_array, size_t length) Places *length* random bytes into the provided buffer. .. cpp:function:: void RandomNumberGenerator::add_entropy(const uint8_t* data, size_t length) Incorporates provided data into the state of the PRNG, if at all possible. This works for most RNG types, including the system and TPM RNGs. But if the RNG doesn't support this operation, the data is dropped, no error is indicated. .. cpp:function:: void RandomNumberGenerator::randomize_with_input(uint8_t* data, size_t length, \ const uint8_t* ad, size_t ad_len) Like randomize, but first incorporates the additional input field into the state of the RNG. The additional input could be anything which parameterizes this request. Not all RNG types accept additional inputs. .. cpp:function:: void RandomNumberGenerator::randomize_with_ts_input(uint8_t* data, size_t length) Creates a buffer with some timestamp values and calls ``randomize_with_input`` .. cpp:function:: uint8_t RandomNumberGenerator::next_byte() Generates a single random byte and returns it. Note that calling this function several times is much slower than calling ``randomize`` once to produce multiple bytes at a time. RNG Types ---------------------------------------- The following RNG types are included HMAC_DRBG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ HMAC DRBG is a random number generator designed by NIST and specified in SP 800-90A. It seems to be the most conservative generator of the NIST approved options. It can be instantiated with any HMAC but is typically used with SHA-256, SHA-384, or SHA-512, as these are the hash functions approved for this use by NIST. System_RNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In ``system_rng.h``, objects of ``System_RNG`` reference a single (process global) reference to the system PRNG (such as ``/dev/urandom`` or ``CryptGenRandom``). You can also use the function ``system_rng()`` which returns a reference to the global handle to the system RNG. AutoSeeded_RNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AutoSeeded_RNG is type naming a 'best available' userspace PRNG. The exact definition of this has changed over time and may change in the future, fortunately there is no compatability concerns when changing any RNG since the only expectation is it produces bits indistinguishable from random. Note well: like most other classes in Botan, it is not safe to share an instance of ``AutoSeeded_RNG`` among multiple threads without serialization. The current version uses the HMAC_DRBG with SHA-384 or SHA-256. The initial seed is generated either by the system PRNG (if available) or a default set of entropy sources. These are also used for periodic reseeding of the RNG state. ChaCha_RNG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This is a very fast userspace PRNG based on ChaCha20 and HMAC(SHA-256). The key for ChaCha is derived by hashing entropy inputs with HMAC. Then the ChaCha keystream generator is run, first to generate the new HMAC key (used for any future entropy additions), then the desired RNG outputs. This RNG composes two primitives thought to be secure (ChaCha and HMAC) in a simple and well studied way (the extract-then-expand paradigm), but is still an ad-hoc and non-standard construction. It is included because it is roughly 20x faster then HMAC_DRBG, and certain applications need access to a very fast RNG. RDRAND_RNG ^^^^^^^^^^^^^^^^^ This RNG type directly calls the x86 ``rdrand`` instruction. If the instruction is not available it will throw at runtime, you can check beforehand by calling ``Botan::CPUID::has_rdrand()``. TPM_RNG ^^^^^^^^^^^^^^^^^ This RNG type allows using the RNG exported from a TPM chip. PKCS11_RNG ^^^^^^^^^^^^^^^^^ This RNG type allows using the RNG exported from a hardware token accessed via PKCS11. Entropy Sources --------------------------------- An ``EntropySource`` is an abstract representation of some method of gather "real" entropy. This tends to be very system dependent. The *only* way you should use an ``EntropySource`` is to pass it to a PRNG that will extract entropy from it -- never use the output directly for any kind of key or nonce generation! ``EntropySource`` has a pair of functions for getting entropy from some external source, called ``fast_poll`` and ``slow_poll``. These pass a buffer of bytes to be written; the functions then return how many bytes of entropy were gathered. Note for writers of ``EntropySource`` subclasses: it isn't necessary to use any kind of cryptographic hash on your output. The data produced by an EntropySource is only used by an application after it has been hashed by the ``RandomNumberGenerator`` that asked for the entropy, thus any hashing you do will be wasteful of both CPU cycles and entropy. Fork Safety --------------------------------- On Unix platforms, the ``fork()`` and ``clone()`` system calls can be used to spawn a new child process. Fork safety ensures that the child process doesn't see the same output of random bytes as the parent process. Botan tries to ensure fork safety by feeding the process ID into the internal state of the random generator and by automatically reseeding the random generator if the process ID changed between two requests of random bytes. However, this does not protect against PID wrap around. The process ID is usually implemented as a 16 bit integer. In this scenario, a process will spawn a new child process, which exits the parent process and spawns a new child process himself. If the PID wrapped around, the second child process may get assigned the process ID of it's grandparent and the fork safety can not be ensured. Therefore, it is strongly recommended to explicitly reseed any userspace random generators after forking a new process. If this is not possible in your application, prefer using the system PRNG instead. botan-2.4.0/doc/manual/secmem.rst000066400000000000000000000030471322470703100166500ustar00rootroot00000000000000 Memory container ======================================== A major concern with mixing modern multiuser OSes and cryptographic code is that at any time the code (including secret keys) could be swapped to disk, where it can later be read by an attacker, or left floating around in memory for later retreval. For this reason the library uses a ``std::vector`` with a custom allocator that will zero memory before deallocation, named via typedef as ``secure_vector``. Because it is simply a STL vector with a custom allocator, it has an identical API to the ``std::vector`` you know and love. Some operating systems offer the ability to lock memory into RAM, preventing swapping from occurring. Typically this operation is restricted to privledged users (root or admin), however some OSes including Linux and FreeBSD allow normal users to lock a small amount of memory. On these systems, allocations first attempt to allocate out of this small locked pool, and then if that fails will fall back to normal heap allocations. The ``secure_vector`` template is only meant for primitive data types (bytes or ints): if you want a container of higher level Botan objects, you can just use a ``std::vector``, since these objects know how to clear themselves when they are destroyed. You cannot, however, have a ``std::vector`` (or any other container) of ``Pipe`` objects or filters, because these types have pointers to other filters, and implementing copy constructors for these types would be both hard and quite expensive (vectors of pointers to such objects is fine, though). botan-2.4.0/doc/manual/side_channels.rst000066400000000000000000000432731322470703100202030ustar00rootroot00000000000000Side Channels ========================= Many cryptographic systems can be broken by side channels. This document notes side channel protections which are currently implemented, as well as areas of the code which are known to be vulnerable to side channels. The latter are obviously all open for future improvement. The following text assumes the reader is already familiar with cryptographic implementations, side channel attacks, and common countermeasures. RSA ---------------------- Blinding is always used to protect private key operations (there is no way to turn it off). As an optimization, instead of choosing a new random mask and inverse with each decryption, both the mask and its inverse are simply squared to choose the next blinding factor. This is much faster than computing a fresh value each time, and the additional relation is thought to provide only minimal useful information for an attacker. Every BOTAN_BLINDING_REINIT_INTERVAL (default 32) operations, a new starting point is chosen. RSA signing uses the CRT optimization, which is much faster but vulnerable to trivial fault attacks [RsaFault] which can result in the key being entirely compromised. To protect against this (or any other computational error which would have the same effect as a fault attack in this case), after every private key operation the result is checked for consistency with the public key. This introduces only slight additional overhead and blocks most fault attacks; it is possible to use a second fault attack to bypass this verification, but such a double fault attack requires significantly more control on the part of an attacker than a BellCore style attack, which is possible if any error at all occurs during either modular exponentiation involved in the RSA signature operation. See blinding.cpp and rsa.cpp. If the OpenSSL provider is enabled, then no explicit blinding is done; we assume OpenSSL handles this. See openssl_rsa.cpp. Decryption of PKCS #1 v1.5 Ciphertexts ---------------------------------------- This padding scheme is used with RSA, and is very vulnerable to errors. In a scenario where an attacker can repeatedly present RSA ciphertexts, and a legitimate key holder will attempt to decrypt each ciphertext and simply indicates to the attacker if the PKCS padding was valid or not (without revealing any additional information), the attacker can use this behavior as an oracle to perform iterative decryption of arbitrary RSA ciphertexts encrypted under that key. This is the famous million message attack [MillionMsg]. A side channel such as a difference in time taken to handle valid and invalid RSA ciphertexts is enough to mount the attack [MillionMsgTiming]. Preventing this issue in full requires some application level changes. In protocols which know the expected length of the encrypted key, PK_Decryptor provides the function `decrypt_or_random` which first generates a random fake key, then decrypts the presented ciphertext, then in constant time either copies out the random key or the decrypted plaintext depending on if the ciphertext was valid or not (valid padding and expected plaintext length). Then in the case of an attack, the protocol will carry on with a randomly chosen key, which will presumably cause total failure in a way that does not allow an attacker to distinguish (via any timing or other side channel, nor any error messages specific to the one situation vs the other) if the RSA padding was valid or invalid. One very important user of PKCS #1 v1.5 encryption is the TLS protocol. In TLS, some extra versioning information is embedded in the plaintext message, along with the key. It turns out that this version information must be treated in an identical (constant-time) way with the PKCS padding, or again the system is broken. [VersionOracle]. This is supported by a special version of PK_Decryptor::decrypt_or_random that additionally allows verifying one or more content bytes, in addition to the PKCS padding. See eme_pkcs.cpp and pubkey.cpp. Verification of PKCS #1 v1.5 Signatures ---------------------------------------- One way of verifying PKCS #1 v1.5 signature padding is to decode it with an ASN.1 BER parser. However such a design commonly leads to accepting signatures besides the (single) valid RSA PKCS #1 v1.5 signature for any given message, because often the BER parser accepts variations of the encoding which are actually invalid. It also needlessly exposes the BER parser to untrusted inputs. It is safer and simpler to instead re-encode the hash value we are expecting using the PKCS #1 v1.5 encoding rules, and const time compare our expected encoding with the output of the RSA operation. So that is what Botan does. See emsa_pkcs.cpp. OAEP ---------------------- RSA OAEP is (PKCS#1 v2) is the recommended version of RSA encoding standard, because it is not directly vulnerable to Bleichenbacher attack. However, if implemented incorrectly, a side channel can be presented to an attacker and create an oracle for decrypting RSA ciphertexts [OaepTiming]. This attack is avoided in Botan by making the OAEP decoding operation run without any conditional jumps or indexes, with the only variance in runtime coming from the length of the RSA key (which is public information). See eme_oaep.cpp. Modular Exponentiation ------------------------ Modular exponentiation uses a fixed window algorithm with Montgomery representation. A side channel silent table lookup is used to access the precomputed powers. See powm_mnt.cpp. The Karatsuba multiplication algorithm has some conditional branches that probably expose information through the branch predictor, but probably? does not expose a timing channel since the same amount of work is done on both sides of the conditional. There is certainly room for improvement here. See mp_karat.cpp for details. The Montgomery reduction is written (and tested) to run in constant time. See mp_monty.cpp. ECC point decoding ---------------------- The API function OS2ECP, which is used to convert byte strings to ECC points, verifies that all points satisfy the ECC curve equation. Points that do not satisfy the equation are invalid, and can sometimes be used to break protocols ([InvalidCurve] [InvalidCurveTLS]). See point_gfp.cpp. ECC scalar multiply ---------------------- There are two implementations of scalar multiply, PointGFp::operator* and the class Blinded_Point_Multiply. The default scalar multiply uses the Montgomery ladder. However it currently leaks the size of the scalar, because the loop iterations are bounded by the scalar size. Blinded_Point_Multiply (used by ECDH, ECDSA, etc) applies several additional side channel countermeasures. The scalar is masked by a small multiple of the group order (this is commonly called Coron's first countermeasure [CoronDpa]), the size of the scalar mask is currently controlled by build.h value BOTAN_POINTGFP_SCALAR_BLINDING_BITS which defaults to 20 bits. Botan stores all ECC points in Jacobian representation. This form allows faster computation by representing points (x,y) as (X,Y,Z) where x=X/Z^2 and y=Y/Z^3. As the representation is redundant, for any randomly chosen r, (X*r^2,Y*r^3,Z*r) is an equivalent point. Changing the point values prevents an attacker from mounting attacks based on the input point remaining unchanged over multiple executions. This is commonly called Coron's third countermeasure, see again [CoronDpa]. Currently Blinded_Point_Multiply uses one of two different algorithms, depending on a build-time flag. If BOTAN_POINTGFP_BLINDED_MULTIPLY_USE_MONTGOMERY_LADDER is set in build.h (default is for it *not* to be set), then a randomized Montgomery ladder algorithm from [RandomMonty] is used. Otherwise, a simple fixed window exponentiation is used; the current version leaks exponent bits through memory index values. We rely on scalar blinding to reduce this leakage. It would obviously be better for Blinded_Point_Multiply to converge on a single side channel silent algorithm. See point_gfp.cpp. ECDH ---------------------- ECDH verifies (through its use of OS2ECP) that all input points received from the other party satisfy the curve equation. This prevents twist attacks. The same check is performed on the output point, which helps prevent fault attacks. ECDSA ---------------------- Inversion of the ECDSA nonce k must be done in constant time, as any leak of even a single bit of the nonce can be sufficient to allow recovering the private key. In Botan all inverses modulo an odd number are performed using a constant time algorithm due to Niels Möller. x25519 ---------------------- The x25519 code is independent of the main Weiserstrass form ECC code, instead based on curve25519-donna-c64.c by Adam Langley. The code seems immune to cache based side channels. It does make use of integer multiplications; on some old CPUs these multiplications take variable time and might allow a side channel attack. This is not considered a problem on modern processors. TLS CBC ciphersuites ---------------------- The original TLS v1.0 CBC Mac-then-Encrypt mode is vulnerable to an oracle attack. If an attacker can distinguish padding errors through different error messages [TlsCbcOracle] or via a side channel attack like [Lucky13], they can abuse the server as a decryption oracle. The side channel protection for Lucky13 follows the approach proposed in the Lucky13 paper. It is not perfectly constant time, but does hide the padding oracle in practice. Tools to test TLS CBC decoding are included in the timing tests. See https://github.com/randombit/botan/pull/675 for more information. The Encrypt-then-MAC extension, which completely avoids the side channel, is implemented and used by default for CBC ciphersuites. CBC mode padding ---------------------- In theory, any good protocol protects CBC ciphertexts with a MAC. But in practice, some protocols are not good and cannot be fixed immediately. To avoid making a bad problem worse, the code to handle decoding CBC ciphertext padding bytes runs in constant time, depending only on the block size of the cipher. AES ---------------------- On x86 processors which support it, AES-NI instruction set is used, as it is fast and (presumed) side channel silent. There is no support at the moment for the similar ARMv8 or POWER AES instructions; patches would be welcome. On x86 processors without AES-NI but with SSSE3 (which includes older Intel Atoms and Core2 Duos, and even now some embedded or low power x86 chips), a version of AES using pshufb is used which is both fast and side channel silent. It is based on code by Mike Hamburg [VectorAes], see aes_ssse3.cpp. This same technique could be applied with NEON or AltiVec, and the paper suggests some optimizations for the AltiVec shuffle. On all other processors, a class 4K table lookup version based on the original Rijndael code is used. This approach relatively fast, but now known to be very vulnerable to side channels. The implementation does make modifications in the first and last rounds to reduce the cache signature, but these merely increase the number of observations required. See [AesCacheColl] for one paper which analyzes a number of implementations including Botan. Botan already follows both of their suggested countermeasures, which increased the number of samples required from 2**13 to the only slightly less pitiful 2**19 samples. The Botan block cipher API already supports bitslicing implementations, so a const time 8x bitsliced AES could be integrated fairly easily. GCM --------------------- On platforms that support a carryless multiply instruction (recent x86 and ARM), GCM is fast and constant time. On all other platforms, GCM is slow and constant time. It uses a simple bit at at time loop. It would be much faster using a table lookup, but we wish to avoid side channels. One improvement here would be the option of using a 2K or 4K table, but using a side-channel silent (masked) table lookup. OCB ----------------------- It is straightforward to implement OCB mode in a efficient way that does not depend on any secret branches or lookups. See ocb.cpp for the implementation. Poly1305 ---------------------- The Poly1305 implementation does not have any secret lookups or conditionals. The code is based on the public domain version by Andrew Moon. DES/3DES ---------------------- The DES implementation uses table lookups, and is likely vulnerable to side channel attacks. DES or 3DES should be avoided in new systems. The proper fix would be a scalar bitsliced implementation, this is not seen as worth the engineering investment given these algorithms end of life status. Twofish ------------------------ This algorithm uses table lookups with secret sboxes. No cache-based side channel attack on Twofish has ever been published, but it is possible nobody sufficiently skilled has ever tried. ChaCha20, Serpent, Threefish, ... ----------------------------------- Some algorithms including ChaCha, Salsa, Serpent and Threefish are 'naturally' silent to cache and timing side channels on all recent processors. IDEA --------------- IDEA encryption, decryption, and key schedule are implemented to take constant time regardless of their inputs. Hash Functions ------------------------- Most hash functions included in Botan such as MD5, SHA-1, SHA-2, SHA-3, Skein, and BLAKE2 do not require any input-dependent memory lookups, and so seem to not be affected by common CPU side channels. Memory comparisons ---------------------- The function same_mem in header mem_ops.h provides a constant-time comparison function. It is used when comparing MACs or other secret values. It is also exposed for application use. Memory zeroizing ---------------------- There is no way in portable C/C++ to zero out an array before freeing it, in such a way that it is guaranteed that the compiler will not elide the 'additional' (seemingly unnecessary) writes to zero out the memory. The function secure_scrub_memory (in mem_ops.cpp) uses some system specific trick to zero out an array. On Windows it uses the directly supported API function RtlSecureZeroMemory. On other platforms, by default the trick of referencing memset through a volatile function pointer is used. This approach is not guaranteed to work on all platforms, and currently there is no systematic check of the resulting binary function that it is compiled as expected. But, it is the best approach currently known and has been verified to work as expected on common platforms. If BOTAN_USE_VOLATILE_MEMSET_FOR_ZERO is set to 0 in build.h (not the default) a byte at a time loop through a volatile pointer is used to overwrite the array. Memory allocation ---------------------- Botan's secure_vector type is a std::vector with a custom allocator. The allocator calls secure_scrub_memory before freeing memory. Some operating systems support an API call to lock a range of pages into memory, such that they will never be swapped out (mlock on POSIX, VirtualLock on Windows). On many POSIX systems mlock is only usable by root, but on Linux, FreeBSD and possibly other systems a small amount of memory can be mlock'ed by processes without extra credentials. If available, Botan uses such a region for storing key material. It is created in anonymous mapped memory (not disk backed), locked in memory, and scrubbed on free. This memory pool is used by secure_vector when available. It can be disabled at runtime setting the environment variable BOTAN_MLOCK_POOL_SIZE to 0. Automated Analysis --------------------- Currently the main tool used by the Botan developers for testing for side channels at runtime is valgrind; valgrind's runtime API is used to taint memory values, and any jumps or indexes using data derived from these values will cause a valgrind warning. This technique was first used by Adam Langley in ctgrind. See header ct_utils.h. To check, install valgrind, configure the build with --with-valgrind, and run the tests. References --------------- [AesCacheColl] Bonneau, Mironov "Cache-Collision Timing Attacks Against AES" (http://www.jbonneau.com/doc/BM06-CHES-aes_cache_timing.pdf) [CoronDpa] Coron, "Resistance against Differential Power Analysis for Elliptic Curve Cryptosystems" (https://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.1.5695) [InvalidCurve] Biehl, Meyer, Müller: Differential fault attacks on elliptic curve cryptosystems (https://www.iacr.org/archive/crypto2000/18800131/18800131.pdf) [InvalidCurveTLS] Jager, Schwenk, Somorovsky: Practical Invalid Curve Attacks on TLS-ECDH (https://www.nds.rub.de/research/publications/ESORICS15/) [SafeCurves] Bernstein, Lange: SafeCurves: choosing safe curves for elliptic-curve cryptography. (https://safecurves.cr.yp.to) [Lucky13] AlFardan, Paterson "Lucky Thirteen: Breaking the TLS and DTLS Record Protocols" (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf) [MillionMsg] Bleichenbacher "Chosen Ciphertext Attacks Against Protocols Based on the RSA Encryption Standard PKCS1" (https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.8543) [MillionMsgTiming] Meyer, Somorovsky, Weiss, Schwenk, Schinzel, Tews: Revisiting SSL/TLS Implementations: New Bleichenbacher Side Channels and Attacks (https://www.nds.rub.de/research/publications/mswsst2014-bleichenbacher-usenix14/) [OaepTiming] Manger, "A Chosen Ciphertext Attack on RSA Optimal Asymmetric Encryption Padding (OAEP) as Standardized in PKCS #1 v2.0" (http://archiv.infsec.ethz.ch/education/fs08/secsem/Manger01.pdf) [RsaFault] Boneh, Demillo, Lipton "On the importance of checking cryptographic protocols for faults" (https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.9764) [RandomMonty] Le, Tan, Tunstall "Randomizing the Montgomery Powering Ladder" (https://eprint.iacr.org/2015/657) [VectorAes] Hamburg, "Accelerating AES with Vector Permute Instructions" https://shiftleft.org/papers/vector_aes/vector_aes.pdf [VersionOracle] Klíma, Pokorný, Rosa "Attacking RSA-based Sessions in SSL/TLS" (https://eprint.iacr.org/2003/052) botan-2.4.0/doc/manual/srp.rst000066400000000000000000000051011322470703100161740ustar00rootroot00000000000000Secure Remote Password ======================================== The library contains an implementation of the `SRP6-a `_ password authenticated key exchange protocol in ``srp6.h``. A SRP client provides what is called a SRP *verifier* to the server. This verifier is based on a password, but the password cannot be easily derived from the verifier. Later, the client and server can perform an SRP exchange, which results in a shared key. SRP works in a discrete logarithm group. Special parameter sets for SRP6 are defined, denoted in the library as "modp/srp/", for example "modp/srp/2048". .. warning:: While knowledge of the verifier does not easily allow an attacker to get the raw password, they could still use the verifier to impersonate the server to the client, so verifiers should be carefully protected. .. cpp:function:: BigInt generate_srp6_verifier( \ const std::string& identifier, \ const std::string& password, \ const std::vector& salt, \ const std::string& group_id, \ const std::string& hash_id) Generates a new verifier using the specified password and salt. This is stored by the server. The salt must also be stored. .. cpp:function:: std::string srp6_group_identifier( \ const BigInt& N, const BigInt& g) .. cpp:class:: SRP6_Server_Session .. cpp:function:: BigInt step1(const BigInt& v, \ const std::string& group_id, \ const std::string& hash_id, \ RandomNumberGenerator& rng) Takes a verifier (generated by generate_srp6_verifier) along with the group_id (which must match .. cpp:function:: SymmetricKey step2(const BigInt& A) Takes the parameter A generated by srp6_client_agree, and return the shared secret key. .. cpp:function:: std::pair srp6_client_agree( \ const std::string& username, \ const std::string& password, \ const std::string& group_id, \ const std::string& hash_id, \ const std::vector& salt, \ const BigInt& B, \ RandomNumberGenerator& rng) The client receives these parameters from the server, except for the username and password which are provided by the user. The parameter B is the output of `step1`. The client agreement step outputs a shared symmetric key along with the parameter A which is returned to the server (and allows it the compute the shared key). botan-2.4.0/doc/manual/stream_ciphers.rst000066400000000000000000000125441322470703100204110ustar00rootroot00000000000000Stream Ciphers ======================== In contrast to block ciphers, stream ciphers operate on a plaintext stream instead of blocks. Thus encrypting data results in changing the internal state of the cipher and encryption of plaintext with arbitrary length is possible in one go (in byte amounts). All implemented stream ciphers derive from the base class :cpp:class:`StreamCipher` (`botan/stream_cipher.h`). Note that some of the implemented stream ciphers require a fresh initialisation vector. .. cpp:class:: StreamCipher .. cpp:function:: std::string name() const Returns a human-readable string of the name of this algorithm. .. cpp:function:: void clear() Clear the key. .. cpp:function:: StreamCipher* clone() const Return a newly allocated object of the same type as this one. .. cpp:function:: void set_key(const uint8_t* key, size_t length) Set the stream cipher key. If the length is not accepted, an ``Invalid_Key_Length`` exception is thrown. .. cpp:function:: bool valid_keylength(size_t length) const This function returns true if and only if *length* is a valid keylength for the algorithm. .. cpp:function:: size_t minimum_keylength() const Return the smallest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: size_t maximum_keylength() const Return the largest key length (in bytes) that is acceptible for the algorithm. .. cpp:function:: bool valid_iv_length(size_t iv_len) const This function returns true if and only if *length* is a valid IV length for the stream cipher. Some ciphers do not support IVs at all, and will return false for any value except zero. .. cpp:function:: void set_iv(const uint8_t*, size_t len) Load IV into the stream cipher state. This should happen after the key is set and before any operation (encrypt/decrypt/seek) is called. .. cpp:function:: void seek(uint64_t offset) Sets the state of the stream cipher and keystream according to the passed *offset*. Therefore the key and the IV (if required) have to be set beforehand. .. cpp:function:: void cipher(const uint8_t* in, uint8_t* out, size_t n) Processes *n* bytes plain/ciphertext from *in* and writes the result to *out*. .. cpp:function:: void cipher1(uint8_t* inout, size_t n) Processes *n* bytes plain/ciphertext in place. Acts like :cpp:func:`cipher`\ (inout, inout, n). .. cpp:function:: void encipher(std::vector inout) .. cpp:function:: void encrypt(std::vector inout) .. cpp:function:: void decrypt(std::vector inout) Processes plain/ciphertext *inout* in place. Acts like :cpp:func:`cipher`\ (inout.data(), inout.data(), inout.size()). Code Example ----------------- The following code encrypts a provided plaintext using ChaCha20. .. code-block:: cpp #include #include #include #include int main() { std::string plaintext("This is a tasty burger!"); std::vector pt(plaintext.data(),plaintext.data()+plaintext.length()); const std::vector key = Botan::hex_decode("000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); std::unique_ptr cipher(Botan::StreamCipher::create("ChaCha(20)")); //generate fresh nonce (IV) std::unique_ptr rng(new Botan::AutoSeeded_RNG); std::vector iv(8); rng->randomize(iv.data(),iv.size()); //set key and IV cipher->set_key(key); cipher->set_iv(iv.data(),iv.size()); cipher->encipher(pt); std::cout << cipher->name() << " with iv " << Botan::hex_encode(iv) << ": " << Botan::hex_encode(pt) << "\n"; return 0; } Available Stream Ciphers ---------------------------- Botan provides the following stream ciphers. If in doubt use CTR or ChaCha. CTR-BE ~~~~~~~ A cipher mode that converts a block cipher into a stream cipher. It offers parallel execution and can seek within the output stream. (The ``-BE`` suffix refers to big-endian convention for the counter. This is the most common case.) OFB ~~~~~ Another stream cipher based on a block cipher. Unlike CTR mode, it does not allow parallel execution or seeking within the output stream. Prefer CTR. Available if ``BOTAN_HAS_OFB`` is defined. ChaCha ~~~~~~~~ A very fast cipher, now widely deployed in TLS as part of the ChaCha20Poly1305 AEAD. Can be used with 8 (fast but dangerous), 12 (balance), or 20 rounds (conservative). Even with 20 rounds, ChaCha is very fast. Use 20 rounds. Available if ``BOTAN_HAS_CHACHA`` is defined. Salsa20 ~~~~~~~~~ An earlier iteration of the ChaCha design, this cipher is popular due to its use in the libsodium library. Prefer ChaCha. .. note:: The 'XSalsa20' variant of Salsa20 is also supported by the same class; this is selected by using a 192-bit nonce instead of Salsa20's 64-bit nonce. Available if ``BOTAN_HAS_SALSA20`` is defined. SHAKE-128 ~~~~~~~~~~~~ This is the SHAKE-128 XOF exposed as a stream cipher. It is slower than ChaCha and somewhat obscure. Available if ``BOTAN_HAS_SHAKE_CIPHER`` is defined. RC4 ~~~~ An old and very widely deployed stream cipher notable for its simplicity. Now broken. **Avoid in new code** Available if ``BOTAN_HAS_RC4`` is defined. botan-2.4.0/doc/manual/support.rst000066400000000000000000000062631322470703100171160ustar00rootroot00000000000000Support Information ======================= Supported Platforms ------------------------ For Botan 2, the tier-1 supported platforms are * Linux x86-64, GCC 4.8 or higher * Linux x86-64, Clang 3.5 or higher * Linux aarch64, GCC 4.8+ * Linux ppc64le, GCC 4.8+ * Windows x86-64, Visual C++ 2013 and 2015 These platforms are all tested by continuous integration, and the developers have access to hardware in order to test patches. Problems affecting these platforms are considered release blockers. For Botan 2, the tier-2 supported platforms are * Linux x86-32, GCC 4.8+ * Linux arm32, GCC 4.8+ * Windows x86-64, MinGW GCC * Apple OS X x86-64, XCode Clang * iOS arm32/arm64, XCode Clang * Android arm32, NDK Clang * FreeBSD x86-64, Clang 3.8+ * IncludeOS x86-32, Clang 3.8+ Some (but not all) of the tier-2 platforms are tested by CI. Things should mostly work, and if problems are encountered, the Botan devs will probably be able to help. But they are not as well tested as tier-1. Of course many other modern OSes such as OpenBSD, NetBSD, AIX, Solaris or QNX are also probably fine (Botan has been tested on all of them successfully in the past), but none of the core developers run these OSes and may not be able to help so much in debugging problems. Patches to improve the build for these platforms are welcome. Note that as a policy Botan does not support any OS which is not supported by its original vendor; any such EOLed systems that are still running are unpatched and insecure. In theory any working C++11 compiler is fine but in practice, we only test with GCC, Clang, and Visual C++. There is support in the build system for several commercial C++ compilers (Intel, PGI, Sun Studio, Ekopath, etc) all of which worked with older (C++98) versions of both the code and the compilers, but it is not known if the latest versions of these compilers can compile the library properly. Branch Support Status ------------------------- Following table provides the support status for Botan branches. Any branch not listed here (including 1.11) is no longer supported. Dates in the future are approximate. ============== ============== ========================== ============ Branch First Release End of Active Development End of Life ============== ============== ========================== ============ 1.8 2008-12-08 2010-08-31 2016-02-13 1.10 2011-06-20 2012-07-10 2018-12-31 2 2017-01-06 2019-01-01 2021-12-31 3 (planned) 2019-04-01 2022-01-01 2023-12-31 ============== ============== ========================== ============ "Active development" refers to adding new features and optimizations. At the conclusion of the active development phase, only bugfixes are applied. Getting Help ------------------ To get help with Botan, open an issue on `GitHub `_ Custom Development or Support ----------------------------------------- Jack Lloyd, the primary developer, is available for projects including custom development, extended support, developer training, and reviewing code or protocol specifications for security flaws. Email him for more information. botan-2.4.0/doc/manual/tls.rst000066400000000000000000001274111322470703100162030ustar00rootroot00000000000000Transport Layer Security (TLS) ======================================== .. versionadded:: 1.11.0 Botan has client and server implementations of various versions of the TLS protocol, including TLS v1.0, TLS v1.1, and TLS v1.2. As of version 1.11.13, support for the insecure SSLv3 protocol has been removed. There is also support for DTLS (v1.0 and v1.2), a variant of TLS adapted for operation on datagram transports such as UDP and SCTP. DTLS support should be considered as beta quality and further testing is invited. The TLS implementation does not know anything about sockets or the network layer. Instead, it calls a user provided callback (hereafter ``output_fn``) whenever it has data that it would want to send to the other party (for instance, by writing it to a network socket), and whenever the application receives some data from the counterparty (for instance, by reading from a network socket) it passes that information to TLS using :cpp:func:`TLS::Channel::received_data`. If the data passed in results in some change in the state, such as a handshake completing, or some data or an alert being received from the other side, then the appropriate user provided callback will be invoked. If the reader is familiar with OpenSSL's BIO layer, it might be analagous to saying the only way of interacting with Botan's TLS is via a `BIO_mem` I/O abstraction. This makes the library completely agnostic to how you write your network layer, be it blocking sockets, libevent, asio, a message queue, lwIP on RTOS, some carrier pidgeons, etc. Starting in 1.11.31, the application callbacks are encapsulated as the class ``TLS::Callbacks`` with the following members. The first four (``tls_emit_data``, ``tls_record_received``, ``tls_alert``, and ``tls_session_established``) are mandatory for using TLS, all others are optional and provide additional information about the connection. .. cpp:function:: void tls_emit_data(const uint8_t data[], size_t data_len) Mandatory. The TLS stack requests that all bytes of *data* be queued up to send to the counterparty. After this function returns, the buffer containing *data* will be overwritten, so a copy of the input must be made if the callback cannot send the data immediately. As an example you could ``send`` to perform a blocking write on a socket, or append the data to a queue managed by your application, and initiate an asyncronous write. For TLS all writes must occur *in the order requested*. For DTLS this ordering is not strictly required, but is still recommended. .. cpp:function:: void tls_record_received(uint64_t rec_no, const uint8_t data[], size_t data_len) Mandatory. Called once for each application_data record which is received, with the matching (TLS level) record sequence number. Currently empty records are ignored and do not instigate a callback, but this may change in a future release. As with ``tls_emit_data``, the array will be overwritten sometime after the callback returns, so a copy should be made if needed. For TLS the record number will always increase. For DTLS, it is possible to receive records with the `rec_no` field out of order, or with gaps, cooresponding to reordered or lost datagrams. .. cpp:function:: void tls_alert(Alert alert) Mandatory. Called when an alert is received from the peer. Note that alerts received before the handshake is complete are not authenticated and could have been inserted by a MITM attacker. .. cpp:function:: bool tls_session_established(const TLS::Session& session) Mandatory. Called whenever a negotiation completes. This can happen more than once on any connection, if renegotiation occurs. The *session* parameter provides information about the session which was just established. If this function returns false, the session will not be cached for later resumption. If this function wishes to cancel the handshake, it can throw an exception which will send a close message to the counterparty and reset the connection state. .. cpp::function:: void tls_verify_cert_chain(const std::vector& cert_chain, \ const std::vector>& ocsp_responses, \ const std::vector& trusted_roots, \ Usage_Type usage, \ const std::string& hostname, \ const Policy& policy) Optional - default implementation should work for many users. It can be overrided for implementing extra validation routines such as public key pinning. Verifies the certificate chain in *cert_chain*, assuming the leaf certificate is the first element. Throws an exception if any error makes this certificate chain unacceptable. If usage is `Usage_Type::TLS_SERVER_AUTH`, then *hostname* should match the information in the server certificate. If usage is `TLS_CLIENT_AUTH`, then *hostname* specifies the host the client is authenticating against (from SNI); the callback can use this for any special site specific auth logic. The `ocsp_responses` is a possibly empty list of OCSP responses provided by the server. In the current implementation of TLS OCSP stapling, only a single OCSP response can be returned. A existing TLS extension allows the server to send multiple OCSP responses, this extension may be supported in the future in which case more than one OCSP response may be given during this callback. The `trusted_roots` parameter was returned by a call from the associated `Credentials_Manager`. The `policy` provided is the policy for the TLS session which is being authenticated using this certificate chain. It can be consulted for values such as allowable signature methods and key sizes. .. cpp::function:: std::chrono::milliseconds tls_verify_cert_chain_ocsp_timeout() const Called by default `tls_verify_cert_chain` to set timeout for online OCSP requests on the certificate chain. Return 0 to disable OCSP. Current default is 0. .. cpp:function:: std::string tls_server_choose_app_protocol(const std::vector& client_protos) Optional. Called by the server when a client includes a list of protocols in the ALPN extension. The server then choose which protocol to use, or "" to disable sending any ALPN response. The default implementation returns the empty string all of the time, effectively disabling ALPN responses. .. cpp:function:: void tls_inspect_handshake_msg(const Handshake_Message&) This callback is optional, and can be used to inspect all handshake messages while the session establishment occurs. .. cpp:function:: void tls_log_error(const char* msg) Optional logging for an error message. (Not currently used) .. cpp:function:: void tls_log_debug(const char* msg) Optional logging for an debug message. (Not currently used) .. cpp:function:: void tls_log_debug_bin(const char* descr, const uint8_t val[], size_t len) Optional logging for an debug value. (Not currently used) Versions from 1.11.0 to 1.11.30 did not have ``TLS::Callbacks`` and instead used independent std::functions to pass the various callback functions. This interface is currently still included but is deprecated and will be removed in a future release. For the documentation for this interface, please check the docs for 1.11.30. This version of the manual only documents the new interface added in 1.11.31. TLS Channels ---------------------------------------- TLS servers and clients share an interface called `TLS::Channel`. A TLS channel (either client or server object) has these methods available: .. cpp:class:: TLS::Channel .. cpp:function:: size_t received_data(const uint8_t buf[], size_t buf_size) .. cpp:function:: size_t received_data(const std::vector& buf) This function is used to provide data sent by the counterparty (eg data that you read off the socket layer). Depending on the current protocol state and the amount of data provided this may result in one or more callback functions that were provided to the constructor being called. The return value of ``received_data`` specifies how many more bytes of input are needed to make any progress, unless the end of the data fell exactly on a message boundary, in which case it will return 0 instead. .. cpp:function:: void send(const uint8_t buf[], size_t buf_size) .. cpp:function:: void send(const std::string& str) .. cpp:function:: void send(const std::vector& vec) Create one or more new TLS application records containing the provided data and send them. This will eventually result in at least one call to the ``output_fn`` callback before ``send`` returns. If the current TLS connection state is unable to transmit new application records (for example because a handshake has not yet completed or the connnection has already ended due to an error) an exception will be thrown. .. cpp:function:: void close() A close notification is sent to the counterparty, and the internal state is cleared. .. cpp:function:: void send_alert(const Alert& alert) Some other alert is sent to the counterparty. If the alert is fatal, the internal state is cleared. .. cpp:function:: bool is_active() Returns true if and only if a handshake has been completed on this connection and the connection has not been subsequently closed. .. cpp:function:: bool is_closed() Returns true if and only if either a close notification or a fatal alert message have been either sent or received. .. cpp:function:: bool timeout_check() This function does nothing unless the channel represents a DTLS connection and a handshake is actively in progress. In this case it will check the current timeout state and potentially initiate retransmission of handshake packets. Returns true if a timeout condition occurred. .. cpp:function:: void renegotiate(bool force_full_renegotiation = false) Initiates a renegotiation. The counterparty is allowed by the protocol to ignore this request. If a successful renegotiation occurs, the *handshake_cb* callback will be called again. If *force_full_renegotiation* is false, then the client will attempt to simply renew the current session - this will refresh the symmetric keys but will not change the session master secret. Otherwise it will initiate a completely new session. For a server, if *force_full_renegotiation* is false, then a session resumption will be allowed if the client attempts it. Otherwise the server will prevent resumption and force the creation of a new session. .. cpp:function:: std::vector peer_cert_chain() Returns the certificate chain of the counterparty. When acting as a client, this value will be non-empty unless the client's policy allowed anonymous connections and the server then chose an anonymous ciphersuite. Acting as a server, this value will ordinarily be empty, unless the server requested a certificate and the client responded with one. .. cpp:function:: SymmetricKey key_material_export( \ const std::string& label, \ const std::string& context, \ size_t length) Returns an exported key of *length* bytes derived from *label*, *context*, and the session's master secret and client and server random values. This key will be unique to this connection, and as long as the session master secret remains secure an attacker should not be able to guess the key. Per :rfc:`5705`, *label* should begin with "EXPERIMENTAL" unless the label has been standardized in an RFC. .. _tls_client: TLS Clients ---------------------------------------- .. cpp:class:: TLS::Client .. cpp:function:: Client( \ Callbacks& callbacks, \ Session_Manager& session_manager, \ Credentials_Manager& creds, \ const Policy& policy, \ RandomNumberGenerator& rng, \ const Server_Information& server_info = Server_Information(), \ const Protocol_Version offer_version = Protocol_Version::latest_tls_version(), \ const std::vector& next_protocols = {}, \ size_t reserved_io_buffer_size = 16*1024 \ ) Initialize a new TLS client. The constructor will immediately initiate a new session. The *callbacks* parameter specifies the various application callbacks which pertain to this particular client connection. The *session_manager* is an interface for storing TLS sessions, which allows for session resumption upon reconnecting to a server. In the absence of a need for persistent sessions, use :cpp:class:`TLS::Session_Manager_In_Memory` which caches connections for the lifetime of a single process. See :ref:`tls_session_managers` for more about session managers. The *credentials_manager* is an interface that will be called to retrieve any certificates, secret keys, pre-shared keys, or SRP information; see :doc:`credentials_manager` for more information. Use the optional *server_info* to specify the DNS name of the server you are attempting to connect to, if you know it. This helps the server select what certificate to use and helps the client validate the connection. Note that the server name indicator name must be a FQDN. IP addresses are not allowed by RFC 6066 and may lead to interoperability problems. Use the optional *offer_version* to control the version of TLS you wish the client to offer. Normally, you'll want to offer the most recent version of (D)TLS that is available, however some broken servers are intolerant of certain versions being offered, and for classes of applications that have to deal with such servers (typically web browsers) it may be necessary to implement a version backdown strategy if the initial attempt fails. .. warning:: Implementing such a backdown strategy allows an attacker to downgrade your connection to the weakest protocol that both you and the server support. Setting *offer_version* is also used to offer DTLS instead of TLS; use :cpp:func:`TLS::Protocol_Version::latest_dtls_version`. Optionally, the client will advertise *app_protocols* to the server using the ALPN extension. The optional *reserved_io_buffer_size* specifies how many bytes to pre-allocate in the I/O buffers. Use this if you want to control how much memory the channel uses initially (the buffers will be resized as needed to process inputs). Otherwise some reasonable default is used. Code Example ^^^^^^^^^^^^ A minimal example of a TLS client is provided below. The full code for a TLS client using BSD sockets is in `src/cli/tls_client.cpp` .. code-block:: cpp #include #include #include #include #include #include /** * @brief Callbacks invoked by TLS::Channel. * * Botan::TLS::Callbacks is an abstract class. * For improved readability, only the functions that are mandatory * to implement are listed here. See src/lib/tls/tls_callbacks.h. */ class Callbacks : public Botan::TLS::Callbacks { public: void tls_emit_data(const uint8_t data[], size_t size) override { // send data to tls server, e.g., using BSD sockets or boost asio } void tls_record_received(uint64_t seq_no, const uint8_t data[], size_t size) override { // process full TLS record received by tls server, e.g., // by passing it to the application } void tls_alert(Botan::TLS::Alert alert) override { // handle a tls alert received from the tls server } bool tls_session_established(const Botan::TLS::Session& session) override { // the session with the tls server was established // return false to prevent the session from being cached, true to // cache the session in the configured session manager return false; } }; /** * @brief Credentials storage for the tls client. * * It returns a list of trusted CA certificates from a local directory. * TLS client authentication is disabled. See src/lib/tls/credentials_manager.h. */ class Client_Credentials : public Botan::Credentials_Manager { public: std::vector trusted_certificate_authorities( const std::string& type, const std::string& context) override { // return a list of certificates of CAs we trust for tls server certificates, // e.g., all the certificates in the local directory "cas" return { new Botan::Certificate_Store_In_Memory("cas") }; } std::vector cert_chain( const std::vector& cert_key_types, const std::string& type, const std::string& context) override { // when using tls client authentication (optional), return // a certificate chain being sent to the tls server, // else an empty list return std::vector(); } Botan::Private_Key* private_key_for(const Botan::X509_Certificate& cert, const std::string& type, const std::string& context) override { // when returning a chain in cert_chain(), return the private key // associated with the leaf certificate here return nullptr; } }; int main() { // prepare all the parameters Callbacks callbacks; Botan::AutoSeeded_RNG rng; Botan::TLS::Session_Manager_In_Memory session_mgr(rng); Botan::Client_Credentials creds; Botan::TLS::Strict_Policy policy; // open the tls connection Botan::TLS::Client client(callbacks, session_mgr, creds, policy, rng, Botan::TLS::Server_Information("botan.randombit.net", 443), Botan::TLS::Protocol_Version::TLS_V12); while(!client.is_closed()) { // read data received from the tls server, e.g., using BSD sockets or boost asio // ... // send data to the tls server using client.send_data() } } TLS Servers ---------------------------------------- .. cpp:class:: TLS::Server .. cpp:function:: Server( \ Callbacks& callbacks, \ Session_Manager& session_manager, \ Credentials_Manager& creds, \ const Policy& policy, \ RandomNumberGenerator& rng, \ bool is_datagram = false, \ size_t reserved_io_buffer_size = 16*1024 \ ) The first 5 arguments as well as the final argument *reserved_io_buffer_size*, are treated similiarly to the :ref:`client `. If a client sends the ALPN extension, the ``callbacks`` function ``tls_server_choose_app_protocol`` will be called and the result sent back to the client. If the empty string is returned, the server will not send an ALPN response. The function can also throw an exception to abort the handshake entirely, the ALPN specification says that if this occurs the alert should be of type `NO_APPLICATION_PROTOCOL`. The optional argument *is_datagram* specifies if this is a TLS or DTLS server; unlike clients, which know what type of protocol (TLS vs DTLS) they are negotiating from the start via the *offer_version*, servers would not until they actually received a client hello. Code Example ^^^^^^^^^^^^ A minimal example of a TLS server is provided below. The full code for a TLS server using asio is in `src/cli/tls_proxy.cpp`. .. code-block:: cpp #include #include #include #include #include #include #include #include /** * @brief Callbacks invoked by TLS::Channel. * * Botan::TLS::Callbacks is an abstract class. * For improved readability, only the functions that are mandatory * to implement are listed here. See src/lib/tls/tls_callbacks.h. */ class Callbacks : public Botan::TLS::Callbacks { public: void tls_emit_data(const uint8_t data[], size_t size) override { // send data to tls client, e.g., using BSD sockets or boost asio } void tls_record_received(uint64_t seq_no, const uint8_t data[], size_t size) override { // process full TLS record received by tls client, e.g., // by passing it to the application } void tls_alert(Botan::TLS::Alert alert) override { // handle a tls alert received from the tls server } bool tls_session_established(const Botan::TLS::Session& session) override { // the session with the tls client was established // return false to prevent the session from being cached, true to // cache the session in the configured session manager return false; } }; /** * @brief Credentials storage for the tls server. * * It returns a certificate and the associated private key to * authenticate the tls server to the client. * TLS client authentication is not requested. * See src/lib/tls/credentials_manager.h. */ class Server_Credentials : public Botan::Credentials_Manager { public: Server_Credentials() : m_key(Botan::X509::load_key("botan.randombit.net.key")) { } std::vector trusted_certificate_authorities( const std::string& type, const std::string& context) override { // if client authentication is required, this function // shall return a list of certificates of CAs we trust // for tls client certificates, otherwise return an empty list return std::vector(); } std::vector cert_chain( const std::vector& cert_key_types, const std::string& type, const std::string& context) override { // return the certificate chain being sent to the tls client // e.g., the certificate file "botan.randombit.net.crt" return { Botan::X509_Certificate("botan.randombit.net.crt") }; } Botan::Private_Key* private_key_for(const Botan::X509_Certificate& cert, const std::string& type, const std::string& context) override { // return the private key associated with the leaf certificate, // in this case the one associated with "botan.randombit.net.crt" return &m_key; } private: std::unique_ptr m_key; }; int main() { // prepare all the parameters Callbacks callbacks; Botan::AutoSeeded_RNG rng; Botan::TLS::Session_Manager_In_Memory session_mgr(rng); Botan::Client_Credentials creds; Botan::TLS::Strict_Policy policy; // accept tls connection from client Botan::TLS::Server server(callbacks, session_mgr, creds, policy, rng); // read data received from the tls client, e.g., using BSD sockets or boost asio // and pass it to server.received_data(). // ... // send data to the tls client using server.send_data() // ... } .. _tls_sessions: TLS Sessions ---------------------------------------- TLS allows clients and servers to support *session resumption*, where the end point retains some information about an established session and then reuse that information to bootstrap a new session in way that is much cheaper computationally than a full handshake. Every time your handshake callback is called, a new session has been established, and a ``TLS::Session`` is included that provides information about that session: .. cpp:class:: TLS::Session .. cpp:function:: Protocol_Version version() const Returns the :cpp:class:`protocol version ` that was negotiated .. cpp:function:: Ciphersuite ciphersite() const Returns the :cpp:class:`ciphersuite ` that was negotiated. .. cpp:function:: Server_Information server_info() const Returns information that identifies the server side of the connection. This is useful for the client in that it identifies what was originally passed to the constructor. For the server, it includes the name the client specified in the server name indicator extension. .. cpp:function:: std::vector peer_certs() const Returns the certificate chain of the peer .. cpp:function:: std::string srp_identifier() const If an SRP ciphersuite was used, then this is the identifier that was used for authentication. .. cpp:function:: bool secure_renegotiation() const Returns ``true`` if the connection was negotiated with the correct extensions to prevent the renegotiation attack. .. cpp:function:: std::vector encrypt(const SymmetricKey& key, \ RandomNumberGenerator& rng) Encrypts a session using a symmetric key *key* and returns a raw binary value that can later be passed to ``decrypt``. The key may be of any length. Currently the implementation encrypts the session using AES-256 in GCM mode with a random nonce. .. cpp:function:: static Session decrypt(const uint8_t ciphertext[], \ size_t length, \ const SymmetricKey& key) Decrypts a session that was encrypted previously with ``encrypt`` and ``key``, or throws an exception if decryption fails. .. cpp:function:: secure_vector DER_encode() const Returns a serialized version of the session. .. warning:: The return value of ``DER_encode`` contains the master secret for the session, and an attacker who recovers it could recover plaintext of previous sessions or impersonate one side to the other. .. _tls_session_managers: TLS Session Managers ---------------------------------------- You may want sessions stored in a specific format or storage type. To do so, implement the ``TLS::Session_Manager`` interface and pass your implementation to the ``TLS::Client`` or ``TLS::Server`` constructor. .. cpp:class:: TLS::Session_Mananger .. cpp:function:: void save(const Session& session) Save a new *session*. It is possible that this sessions session ID will replicate a session ID already stored, in which case the new session information should overwrite the previous information. .. cpp:function:: void remove_entry(const std::vector& session_id) Remove the session identified by *session_id*. Future attempts at resumption should fail for this session. .. cpp:function:: bool load_from_session_id(const std::vector& session_id, \ Session& session) Attempt to resume a session identified by *session_id*. If located, *session* is set to the session data previously passed to *save*, and ``true`` is returned. Otherwise *session* is not modified and ``false`` is returned. .. cpp:function:: bool load_from_server_info(const Server_Information& server, \ Session& session) Attempt to resume a session with a known server. .. cpp:function:: std::chrono::seconds session_lifetime() const Returns the expected maximum lifetime of a session when using this session manager. Will return 0 if the lifetime is unknown or has no explicit expiration policy. .. _tls_session_manager_inmem: In Memory Session Manager ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``TLS::Session_Manager_In_Memory`` implementation saves sessions in memory, with an upper bound on the maximum number of sessions and the lifetime of a session. It is safe to share a single object across many threads as it uses a lock internally. .. cpp:class:: TLS::Session_Managers_In_Memory .. cpp:function:: Session_Manager_In_Memory(RandomNumberGenerator& rng, \ size_t max_sessions = 1000, \ std::chrono::seconds session_lifetime = 7200) Limits the maximum number of saved sessions to *max_sessions*, and expires all sessions older than *session_lifetime*. Noop Session Mananger ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``TLS::Session_Manager_Noop`` implementation does not save sessions at all, and thus session resumption always fails. Its constructor has no arguments. SQLite3 Session Manager ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This session manager is only available if support for SQLite3 was enabled at build time. If the macro ``BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER`` is defined, then ``botan/tls_session_manager_sqlite.h`` contains ``TLS::Session_Manager_SQLite`` which stores sessions persistently to a sqlite3 database. The session data is encrypted using a passphrase, and stored in two tables, named ``tls_sessions`` (which holds the actual session information) and ``tls_sessions_metadata`` (which holds the PBKDF information). .. warning:: The hostnames associated with the saved sessions are stored in the database in plaintext. This may be a serious privacy risk in some applications. .. cpp:class:: TLS::Session_Manager_SQLite .. cpp:function:: Session_Manager_SQLite( \ const std::string& passphrase, \ RandomNumberGenerator& rng, \ const std::string& db_filename, \ size_t max_sessions = 1000, \ std::chrono::seconds session_lifetime = 7200) Uses the sqlite3 database named by *db_filename*. TLS Policies ---------------------------------------- ``TLS::Policy`` is how an application can control details of what will be negotiated during a handshake. The base class acts as the default policy. There is also a ``Strict_Policy`` (which forces only secure options, reducing compatibility) and ``Text_Policy`` which reads policy settings from a file. .. cpp:class:: TLS::Policy .. cpp:function:: std::vector allowed_ciphers() const Returns the list of ciphers we are willing to negotiate, in order of preference. Clients send a list of ciphersuites in order of preference, servers are free to choose any of them. Some servers will use the clients preferences, others choose from the clients list prioritizing based on its preferences. No export key exchange mechanisms or ciphersuites are supported by botan. The null encryption ciphersuites (which provide only authentication, sending data in cleartext) are also not supported by the implementation and cannot be negotiated. Cipher names without an explicit mode refers to CBC+HMAC ciphersuites. Default value: "ChaCha20Poly1305", "AES-256/GCM", "AES-128/GCM", "AES-256/CCM", "AES-128/CCM", "AES-256", "AES-128" Also allowed: "AES-256/CCM(8)", "AES-128/CCM(8)", "Camellia-256/GCM", "Camellia-128/GCM", "ARIA-256/GCM", "ARIA-128/GCM", "Camellia-256", "Camellia-128" Also allowed (though currently experimental): "AES-128/OCB(12)", "AES-256/OCB(12)" Also allowed (although **not recommended**): "SEED", "3DES" .. note:: Before 1.11.30 only the non-standard ChaCha20Poly1305 ciphersuite was implemented. The RFC 7905 ciphersuites are supported in 1.11.30 onwards. .. note:: Support for the broken RC4 cipher was removed in 1.11.17 .. note:: SEED and 3DES are deprecated and will be removed in a future release. .. cpp:function:: std::vector allowed_macs() const Returns the list of algorithms we are willing to use for message authentication, in order of preference. Default: "AEAD", "SHA-256", "SHA-384", "SHA-1" A plain hash function indicates HMAC .. note:: SHA-256 is preferred over SHA-384 in CBC mode because the protections against the Lucky13 attack are somewhat more effective for SHA-256 than SHA-384. .. cpp:function:: std::vector allowed_key_exchange_methods() const Returns the list of key exchange methods we are willing to use, in order of preference. Default: "CECPQ1", "ECDH", "DH" .. note:: CECPQ1 key exchange provides post-quantum security to the key exchange by combining NewHope with a standard x25519 ECDH exchange. This prevents an attacker, even one with a quantum computer, from later decrypting the contents of a recorded TLS transcript. The NewHope algorithm is very fast, but adds roughly 4 KiB of additional data transfer to every TLS handshake. And even if NewHope ends up completely broken, the 'extra' x25519 exchange secures the handshake. For applications where the additional data transfer size is unacceptable, simply allow only ECDH key exchange in the application policy. DH exchange also often involves transferring several additional Kb (without the benefit of post quantum security) so if CECPQ1 is being disabled for traffic overhread reasons, DH should also be avoid. Also allowed: "RSA", "SRP_SHA", "ECDHE_PSK", "DHE_PSK", "PSK" .. note:: Static RSA ciphersuites are disabled by default since 1.11.34. In addition to not providing forward security, any server which is willing to negotiate these ciphersuites exposes themselves to a variety of chosen ciphertext oracle attacks which are all easily avoided by signing (as in PFS) instead of decrypting. .. cpp:function:: std::vector allowed_signature_hashes() const Returns the list of hash algorithms we are willing to use for public key signatures, in order of preference. Default: "SHA-512", "SHA-384", "SHA-256" Also allowed (although **not recommended**): "SHA-1" .. note:: This is only used with TLS v1.2. In earlier versions of the protocol, signatures are fixed to using only SHA-1 (for DSA/ECDSA) or a MD5/SHA-1 pair (for RSA). .. cpp:function:: std::vector allowed_signature_methods() const Default: "ECDSA", "RSA" Also allowed (disabled by default): "DSA", "" (empty string meaning anonymous) .. note:: DSA authentication is deprecated and will be removed in a future release. .. cpp:function:: std::vector allowed_ecc_curves() const Return a list of ECC curves we are willing to use, in order of preference. The default ordering puts the best performing ECC first. Default: "x25519", "secp256r1", "secp521r1", "secp384r1", "brainpool256r1", "brainpool384r1", "brainpool512r1" No other values are currently defined. .. cpp:function:: bool use_ecc_point_compression() const Prefer ECC point compression. Signals that we prefer ECC points to be compressed when transmitted to us. The other party may not support ECC point compression and therefore may still send points uncompressed. Note that the certificate used during authentication must also follow the other party's preference. Default: false .. cpp:function:: std::vector compression() const Return the list of compression methods we are willing to use, in order of preference. Default is null compression only. .. note:: TLS data compression is not currently supported. .. cpp:function:: bool acceptable_protocol_version(Protocol_Version version) Return true if this version of the protocol is one that we are willing to negotiate. Default: Accepts TLS v1.0 or higher and DTLS v1.2 or higher. .. cpp:function:: bool server_uses_own_ciphersuite_preferences() const If this returns true, a server will pick the cipher it prefers the most out of the client's list. Otherwise, it will negotiate the first cipher in the client's ciphersuite list that it supports. .. cpp:function:: bool negotiate_heartbeat_support() const If this function returns true, clients will offer the heartbeat support extension, and servers will respond to clients offering the extension. Otherwise, clients will not offer heartbeat support and servers will ignore clients offering heartbeat support. If this returns true, callers should expect to handle heartbeat data in their ``alert_cb``. Default: false .. cpp:function:: bool allow_client_initiated_renegotiation() const If this function returns true, a server will accept a client-initiated renegotiation attempt. Otherwise it will send the client a non-fatal ``no_renegotiation`` alert. Default: true .. cpp:function:: bool allow_server_initiated_renegotiation() const If this function returns true, a client will accept a server-initiated renegotiation attempt. Otherwise it will send the server a non-fatal ``no_renegotiation`` alert. Default: false .. cpp:function:: bool allow_insecure_renegotiation() const If this function returns true, we will allow renegotiation attempts even if the counterparty does not support the RFC 5746 extensions. .. warning:: Returning true here could expose you to attacks Default: false .. cpp:function:: size_t minimum_signature_strength() const Return the minimum strength (as ``n``, representing ``2**n`` work) we will accept for a signature algorithm on any certificate. Use 80 to enable RSA-1024 (*not recommended*), or 128 to require either ECC or large (~3000 bit) RSA keys. Default: 110 (allowing 2048 bit RSA) .. cpp:function:: bool require_cert_revocation_info() const If this function returns true, and a ciphersuite using certificates was negotiated, then we must have access to a valid CRL or OCSP response in order to trust the certificate. .. warning:: Returning false here could expose you to attacks Default: true .. cpp:function:: std::string dh_group() const For ephemeral Diffie-Hellman key exchange, the server sends a group parameter. Return a string specifying the group parameter a server should use. Default: 2048 bit IETF IPsec group ("modp/ietf/2048") .. cpp:function:: size_t minimum_dh_group_size() const Return the minimum size in bits for a Diffie-Hellman group that a client will accept. Due to the design of the protocol the client has only two options - accept the group, or reject it with a fatal alert then attempt to reconnect after disabling ephemeral Diffie-Hellman. Default: 2048 bits .. cpp:function:: size_t minimum_rsa_bits() const Minimum accepted RSA key size. Default 2048 bits. .. cpp:function:: size_t minimum_dsa_group_size() const Minimum accepted DSA key size. Default 2048 bits. .. cpp:function:: size_t minimum_ecdsa_group_size() const Minimum size for ECDSA keys (256 bits). .. cpp:function:: size_t minimum_ecdh_group_size() const Minimum size for ECDH keys (255 bits). .. cpp:function:: void check_peer_key_acceptable(const Public_Key& public_key) const Allows the policy to examine peer public keys. Throw an exception if the key should be rejected. Default implementation checks against policy values `minimum_dh_group_size`, `minimum_rsa_bits`, `minimum_ecdsa_group_size`, and `minimum_ecdh_group_size`. .. cpp:function:: bool hide_unknown_users() const The SRP and PSK suites work using an identifier along with a shared secret. If this function returns true, when an identifier that the server does not recognize is provided by a client, a random shared secret will be generated in such a way that a client should not be able to tell the difference between the identifier not being known and the secret being wrong. This can help protect against some username probing attacks. If it returns false, the server will instead send an ``unknown_psk_identity`` alert when an unknown identifier is used. Default: false .. cpp:function:: u32bit session_ticket_lifetime() const Return the lifetime of session tickets. Each session includes the start time. Sessions resumptions using tickets older than ``session_ticket_lifetime`` seconds will fail, forcing a full renegotiation. Default: 86400 seconds (1 day) TLS Ciphersuites ---------------------------------------- .. cpp:class:: TLS::Ciphersuite .. cpp:function:: uint16_t ciphersuite_code() const Return the numerical code for this ciphersuite .. cpp:function:: std::string to_string() const Return the ful name of ciphersuite (for example "RSA_WITH_RC4_128_SHA" or "ECDHE_RSA_WITH_AES_128_GCM_SHA256") .. cpp:function:: std::string kex_algo() const Return the key exchange algorithm of this ciphersuite .. cpp:function:: std::string sig_algo() const Return the signature algorithm of this ciphersuite .. cpp:function:: std::string cipher_algo() const Return the cipher algorithm of this ciphersuite .. cpp:function:: std::string mac_algo() const Return the authentication algorithm of this ciphersuite .. _tls_alerts: TLS Alerts ---------------------------------------- A ``TLS::Alert`` is passed to every invocation of a channel's *alert_cb*. .. cpp:class:: TLS::Alert .. cpp:function:: is_valid() const Return true if this alert is not a null alert .. cpp:function:: is_fatal() const Return true if this alert is fatal. A fatal alert causes the connection to be immediately disconnected. Otherwise, the alert is a warning and the connection remains valid. .. cpp:function:: Type type() const Returns the type of the alert as an enum .. cpp:function:: std::string type_string() Returns the type of the alert as a string TLS Protocol Version ---------------------------------------- TLS has several different versions with slightly different behaviors. The ``TLS::Protocol_Version`` class represents a specific version: .. cpp:class:: TLS::Protocol_Version .. cpp:enum:: Version_Code ``TLS_V10``, ``TLS_V11``, ``TLS_V12``, ``DTLS_V10``, ``DTLS_V12`` .. cpp:function:: Protocol_Version(Version_Code named_version) Create a specific version .. cpp:function:: uint8_t major_version() const Returns major number of the protocol version .. cpp:function:: uint8_t minor_version() const Returns minor number of the protocol version .. cpp:function:: std::string to_string() const Returns string description of the version, for instance "TLS v1.1" or "DTLS v1.0". .. cpp:function:: static Protocol_Version latest_tls_version() Returns the latest version of the TLS protocol known to the library (currently TLS v1.2) .. cpp:function:: static Protocol_Version latest_dtls_version() Returns the latest version of the DTLS protocol known to the library (currently DTLS v1.2) botan-2.4.0/doc/manual/tpm.rst000066400000000000000000000115511322470703100161760ustar00rootroot00000000000000Trusted Platform Module (TPM) ========================================== .. versionadded:: 1.11.26 Some computers come with a TPM, which is a small side processor which can perform certain operations which include RSA key generation and signing, a random number generator, accessing a small amount of NVRAM, and a set of PCRs which can be used to measure software state (this is TPMs most famous use, for authenticating a boot sequence). The TPM NVRAM and PCR APIs are not supported by Botan at this time, patches welcome. Currently only v1.2 TPMs are supported, and the only TPM library supported is TrouSerS (http://trousers.sourceforge.net/). Hopefully both of these limitations will be removed in a future release, in order to support newer TPM v2.0 systems. The current code has been tested with an ST TPM running in a Lenovo laptop. Test for TPM support with the macro ``BOTAN_HAS_TPM``, include ````. First, create a connection to the TPM with a ``TPM_Context``. The context is passed to all other TPM operations, and should remain alive as long as any other TPM object which the context was passed to is still alive, otherwise errors or even an application crash are possible. In the future, the API may change to using ``shared_ptr`` to remove this problem. .. cpp:class:: TPM_Context .. cpp:function:: TPM_Context(pin_cb cb, const char* srk_password) The (somewhat improperly named) pin_cb callback type takes a std::string as an argument, which is an informative message for the user. It should return a string containing the password entered by the user. Normally the SRK password is null. Use nullptr to signal this. The TPM contains a RNG of unknown design or quality. If that doesn't scare you off, you can use it with ``TPM_RNG`` which implements the standard ``RandomNumberGenerator`` interface. .. cpp:class:: TPM_RNG .. cpp:function:: TPM_RNG(TPM_Context& ctx) Initialize a TPM RNG object. After initialization, reading from this RNG reads from the hardware? RNG on the TPM. The v1.2 TPM uses only RSA, but because this key is implemented completely in hardware it uses a different private key type, with a somewhat different API to match the TPM's behavior. .. cpp:class:: TPM_PrivateKey .. cpp:function:: TPM_PrivateKey(TPM_Context& ctx, size_t bits, const char* key_password) Create a new RSA key stored on the TPM. The bits should be either 1024 or 2048; the TPM interface hypothetically allows larger keys but in practice no v1.2 TPM hardware supports them. The TPM processor is not fast, be prepared for this to take a while. The key_password is the password to the TPM key ? .. cpp:function:: std::string register_key(TPM_Storage_Type storage_type) Registers a key with the TPM. The storage_type can be either `TPM_Storage_Type::User` or `TPM_Storage_Type::System`. If System, the key is stored on the TPM itself. If User, it is stored on the local hard drive in a database maintained by an intermediate piece of system software (which actual interacts with the physical TPM on behalf of any number of applications calling the TPM API). The TPM has only some limited space to store private keys and may reject requests to store the key. In either case the key is encrypted with an RSA key which was generated on the TPM and which it will not allow to be exported. Thus (so goes the theory) without physically attacking the TPM Returns a UUID which can be passed back to constructor below. .. cpp:function:: TPM_PrivateKey(TPM_Context& ctx, const std::string& uuid, \ TPM_Storage_Type storage_type) Load a registered key. The UUID was returned by the ``register_key`` function. .. cpp:function:: std::vector export_blob() const Export the key as an encrypted blob. This blob can later be presented back to the same TPM to load the key. .. cpp:function:: TPM_PrivateKey(TPM_Context& ctx, const std::vector& blob) Load a TPM key previously exported as a blob with ``export_blob``. .. cpp:function:: std::unique_ptr public_key() const Return the public key associated with this TPM private key. TPM does not store public keys, nor does it support signature verification. .. cpp:function:: TSS_HKEY handle() const Returns the bare TSS key handle. Use if you need to call the raw TSS API. A ``TPM_PrivateKey`` can be passed to a ``PK_Signer`` constructor and used to sign messages just like any other key. Only PKCS #1 v1.5 signatures are supported by the v1.2 TPM. .. cpp:function:: std::vector TPM_PrivateKey::registered_keys(TPM_Context& ctx) This static function returns the list of all keys (in URL format) registered with the system botan-2.4.0/doc/manual/versions.rst000066400000000000000000000064021322470703100172450ustar00rootroot00000000000000 Versioning ======================================== All versions are of the tuple (major,minor,patch). As of Botan 2.0.0, Botan uses semantic versioning. The minor number increases if any feature addition is made. The patch version is used to indicate a release where only bug fixes were applied. If an incompatible API change is required, the major version will be increased. The library has functions for checking compile-time and runtime versions. The build-time version information is defined in `botan/build.h` .. c:macro:: BOTAN_VERSION_MAJOR The major version of the release. .. c:macro:: BOTAN_VERSION_MINOR The minor version of the release. .. c:macro:: BOTAN_VERSION_PATCH The patch version of the release. .. c:macro:: BOTAN_VERSION_DATESTAMP Expands to an integer of the form YYYYMMDD if this is an official release, or 0 otherwise. For instance, 1.10.1, which was released on July 11, 2011, has a `BOTAN_VERSION_DATESTAMP` of 20110711. .. c:macro:: BOTAN_DISTRIBUTION_INFO .. versionadded:: 1.9.3 A macro expanding to a string that is set at build time using the ``--distribution-info`` option. It allows a packager of the library to specify any distribution-specific patches. If no value is given at build time, the value is the string "unspecified". .. c:macro:: BOTAN_VERSION_VC_REVISION .. versionadded:: 1.10.1 A macro expanding to a string that is set to a revision identifier cooresponding to the source, or "unknown" if this could not be determined. It is set for all official releases, and for builds that originated from within a git checkout. The runtime version information, and some helpers for compile time version checks, are included in `botan/version.h` .. cpp:function:: std::string version_string() Returns a single-line string containing relevant information about this build and version of the library in an unspecified format. .. cpp:function:: uint32_t version_major() Returns the major part of the version. .. cpp:function:: uint32_t version_minor() Returns the minor part of the version. .. cpp:function:: uint32_t version_patch() Returns the patch part of the version. .. cpp:function:: uint32_t version_datestamp() Return the datestamp of the release (or 0 if the current version is not an official release). .. cpp:function:: std::string runtime_version_check(uint32_t major, uint32_t minor, uint32_t patch) Call this function with the compile-time version being built against, eg:: Botan::runtime_version_check(BOTAN_VERSION_MAJOR, BOTAN_VERSION_MINOR, BOTAN_VERSION_PATCH) It will return an empty string if the versions match, or otherwise an error message indicating the discrepency. This only is useful in dynamic libraries, where it is possible to compile and run against different versions. .. c:macro:: BOTAN_VERSION_CODE_FOR(maj,min,patch) Return a value that can be used to compare versions. The current (compile-time) version is available as the macro `BOTAN_VERSION_CODE`. For instance, to choose one code path for version 2.1.0 and later, and another code path for older releases:: #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(2,1,0) // 2.1+ code path #else // code path for older versions #endif botan-2.4.0/doc/manual/x509.rst000066400000000000000000001135331322470703100161060ustar00rootroot00000000000000.. _x509_certificates: X.509 Certificates and CRLs ================================= A certificate is a binding between some identifying information (called a *subject*) and a public key. This binding is asserted by a signature on the certificate, which is placed there by some authority (the *issuer*) that at least claims that it knows the subject named in the certificate really "owns" the private key corresponding to the public key in the certificate. The major certificate format in use today is X.509v3, used for instance in the :doc:`tls` protocol. A X.509 certificate is represented by .. cpp:class:: X509_Certificate .. cpp:function:: X509_Certificate(const std::string& filename) Load a certificate from a file. PEM or DER is accepted. .. cpp:function:: X509_Certificate(const std::vector& in) Load a certificate from a byte string. .. cpp:function:: X509_Certificate(DataSource& source) Load a certificate from an abstract ``DataSource``. .. cpp:function:: std::unique_ptr load_subject_public_key() const Deserialize the stored public key and return a new object. This might throw, if it happens that the public key object stored in the certificate is malformed in some way, or in the case that the public key algorithm used is not supported by the library. See :ref:`serializing_public_keys` for more information about what to do with the returned object. It may be any type of key, in principle, though RSA and ECDSA are most common. .. cpp:function:: std::vector serial_number() const Return the certificates serial number. The tuple of issuer DN and serial number should be unique. .. cpp:function:: X509_DN subject_dn() const Returns the distinguished name (DN) of the certificate's subject. .. cpp:function:: X509_DN issuer_dn() const Returns the distinguished name (DN) of the certificate's issuer .. cpp:function:: X509_Time not_before() const Returns the point in time the certificate becomes valid .. cpp:function:: X509_Time not_after() const Returns the point in time the certificate expires .. cpp:function:: const Extensions& v3_extensions() const Returns all extensions of this certificate. You can use this to examine any extension data associated with the certificate, including custom extensions the library doesn't know about. .. cpp:function:: const AlternativeName& subject_alt_name() const Return the subjects alternative name. This is used to store values like associated URIs, DNS addresses, and email addresses. .. cpp:function:: const AlternativeName& issuer_alt_name() const Return alternative names for the issuer. .. cpp:function:: std::string fingerprint(const std::string& hash_name = "SHA-1") const Return a fingerprint for the certificate. .. cpp:function:: Key_Constraints constraints() const Returns either an enumeration listing key constraints (what the associated key can be used for) or ``NO_CONSTRAINTS`` if the relevent extension was not included. Example values are ``DIGITAL_SIGNATURE`` and ``KEY_CERT_SIGN``. More than one value might be specified. .. cpp:function:: bool allowed_extended_usage(const OID& usage) const Returns true if the OID is included in the extended usage extension. .. cpp:function:: bool matches_dns_name(const std::string& name) const Check if the certificate's subject alternative name DNS fields match ``name``. This function also handles wildcard certificates. .. cpp:function:: std::string to_string() const Returns a free-form human readable string describing the certificate. The ``X509_Certificate`` class has several other functions not described here. See the header ``x509cert.h`` for details. The data of an X.509 certificate is stored as a ``shared_ptr`` to a structure containing the decoded information. So copying ``X509_Certificate`` objects is quite cheap. So what's in an X.509 certificate? ----------------------------------- Obviously, you want to be able to get the public key. This is achieved by calling the member function ``subject_public_key``, which will return a ``Public_Key``\*. As to what to do with this, read about ``load_key`` in :ref:`serializing_public_keys`. In the general case, this could be any kind of public key, though 99% of the time it will be an RSA key. However, Diffie-Hellman, DSA, and ECDSA keys are also supported, so be careful about how you treat this. It is also a wise idea to examine the value returned by ``constraints``, to see what uses the public key is approved for. The second major piece of information you'll want is the name/email/etc of the person to whom this certificate is assigned. Here is where things get a little nasty. X.509v3 has two (well, mostly just two...) different places where you can stick information about the user: the *subject* field, and in an extension called *subjectAlternativeName*. The *subject* field is supposed to only included the following information: country, organization, an organizational sub-unit name, and a so-called common name. The common name is usually the name of the person, or it could be a title associated with a position of some sort in the organization. It may also include fields for state/province and locality. What a locality is, nobody knows, but it's usually given as a city name. Like the distinguished names, subject alternative names can contain a lot of things that Botan will flat out ignore (most of which you would likely never want to use). However, there are three very useful pieces of information that this extension might hold: an email address (mailbox@example.com), a DNS name (somehost.example.com), or a URI (http://www.example.com). So, how to get the information? Call ``subject_info`` with the name of the piece of information you want, and it will return a ``std::string`` that is either empty (signifying that the certificate doesn't have this information), or has the information requested. There are several names for each possible item, but the most easily readable ones are: "Name", "Country", "Organization", "Organizational Unit", "Locality", "State", "RFC822", "URI", and "DNS". These values are returned as a ``std::string``. You can also get information about the issuer of the certificate in the same way, using ``issuer_info``. X.509v3 Extensions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ X.509v3 specifies a large number of possible extensions. Botan supports some, but by no means all of them. The following listing lists which X.509v3 extensions are supported and notes areas where there may be problems with the handling. - Key Usage and Extended Key Usage: No problems known. - Basic Constraints: No problems known. A self-signed v1 certificate is assumed to be a CA, while a v3 certificate is marked as a CA if and only if the basic constraints extension is present and set for a CA cert. - Subject Alternative Names: Only the "rfc822Name", "dNSName", and "uniformResourceIdentifier" and raw IPv4 fields will be stored; all others are ignored. - Issuer Alternative Names: Same restrictions as the Subject Alternative Names extension. New certificates generated by Botan never include the issuer alternative name. - Authority Key Identifier: Only the version using KeyIdentifier is supported. If the GeneralNames version is used and the extension is critical, an exception is thrown. If both the KeyIdentifier and GeneralNames versions are present, then the KeyIdentifier will be used, and the GeneralNames ignored. - Subject Key Identifier: No problems known. - Name Constraints: No problems known (though encoding is not supported). Any unknown critical extension in a certificate will lead to an exception during path validation. Extensions are handled by a special class taking care of encoding and decoding. It also supports encoding and decoding of custom extensions. To do this, it internally keeps two lists of extensions. Different lookup functions are provided to search them. .. note:: Validation of custom extensions during path validation is currently not supported. .. cpp:class:: Extensions .. cpp:function:: void add(Certificate_Extension* extn, bool critical = false) Adds a new extension to the list. ``critical`` specifies whether the extension should be marked as critical. .. cpp:function:: replace(Certificate_Extension* extn, bool critical = false) Adds an extension to the list or replaces it, if the same extension was already added .. cpp:function:: std::unique_ptr get(const OID& oid) const Searches for an extension by OID and returns the result .. cpp:function:: template \ std::unique_ptr get_raw(const OID& oid) Searches for an extension by OID and returns the result. Only the unknown extensions, that is, extensions types that are not listed above, are searched for by this function. .. cpp:function:: std::vector, bool>> extensions() const Returns the list of extensions together with the corresponding criticality flag. Only contains the supported extension types listed above. .. cpp:function:: std::map, bool>> extensions_raw() const Returns the list of extensions as raw, encoded bytes together with the corresponding criticality flag. Contains all extensions, known as well as unknown extensions. Certificate Revocation Lists ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It will occasionally happen that a certificate must be revoked before its expiration date. Examples of this happening include the private key being compromised, or the user to which it has been assigned leaving an organization. Certificate revocation lists are an answer to this problem (though online certificate validation techniques are starting to become somewhat more popular). Every once in a while the CA will release a new CRL, listing all certificates that have been revoked. Also included is various pieces of information like what time a particular certificate was revoked, and for what reason. In most systems, it is wise to support some form of certificate revocation, and CRLs handle this easily. For most users, processing a CRL is quite easy. All you have to do is call the constructor, which will take a filename (or a ``DataSource&``). The CRLs can either be in raw BER/DER, or in PEM format; the constructor will figure out which format without any extra information. For example:: X509_CRL crl1("crl1.der"); DataSource_Stream in("crl2.pem"); X509_CRL crl2(in); After that, pass the ``X509_CRL`` object to a ``Certificate_Store`` object with .. cpp:function:: void Certificate_Store::add_crl(const X509_CRL& crl) and all future verifications will take into account the provided CRL. Certificate Stores ---------------------------------------- An object of type ``Certificate_Store`` is a generalized interface to an external source for certificates (and CRLs). Examples of such a store would be one that looked up the certificates in a SQL database, or by contacting a CGI script running on a HTTP server. There are currently three mechanisms for looking up a certificate, and one for retrieving CRLs. By default, most of these mechanisms will return an empty ``std::shared_ptr`` of ``X509_Certificate``. This storage mechanism is *only* queried when doing certificate validation: it allows you to distribute only the root key with an application, and let some online method handle getting all the other certificates that are needed to validate an end entity certificate. In particular, the search routines will not attempt to access the external database. The certificate lookup methods are ``find_cert`` (by Subject Distinguished Name and optional Subject Key Identifier) and ``find_cert_by_pubkey_sha1`` (by SHA-1 hash of the certificate's public key). The Subject Distinguished Name is given as a ``X509_DN``, while the SKID parameter takes a ``std::vector`` containing the subject key identifier in raw binary. Both lookup methods are mandatory to implement. Finally, there is a method for finding a CRL, called ``find_crl_for``, that takes an ``X509_Certificate`` object, and returns a ``std::shared_ptr`` of ``X509_CRL``. The ``std::shared_ptr`` return type makes it easy to return no CRLs by returning ``nullptr`` (eg, if the certificate store doesn't support retrieving CRLs). Implementing the function is optional, and by default will return ``nullptr``. Certificate stores are used in the :doc:`tls` module to store a list of trusted certificate authorities. In Memory Certificate Store ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The in memory certificate store keeps all objects in memory only. Certificates can be loaded from disk initially, but also added later. .. cpp:class:: Certificate_Store_In_Memory .. cpp:function:: Certificate_Store_In_Memory(const std::string& dir) Attempt to parse all files in ``dir`` (including subdirectories) as certificates. Ignores errors. .. cpp:function:: Certificate_Store_In_Memory(const X509_Certificate& cert) Adds given certificate to the store .. cpp:function:: Certificate_Store_In_Memory() Create an empty store .. cpp:function:: void add_certificate(const X509_Certificate& cert) Add a certificate to the store .. cpp:function:: void add_certificate(std::shared_ptr cert) Add a certificate already in a shared_ptr to the store .. cpp:function:: void add_crl(const X509_CRL& crl) Add a certificate revocation list (CRL) to the store. .. cpp:function:: void add_crl(std::shared_ptr crl) Add a certificate revocation list (CRL) to the store as a shared_ptr SQL-backed Certificate Stores ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The SQL-backed certificate stores store all objects in an SQL database. They also additionally provide private key storage and revocation of individual certificates. .. cpp:class:: Certificate_Store_In_SQL .. cpp:function:: Certificate_Store_In_SQL(const std::shared_ptr db, \ const std::string& passwd, RandomNumberGenerator& rng, const std::string& table_prefix = "") Create or open an existing certificate store from an SQL database. The password in ``passwd`` will be used to encrypt private keys. .. cpp:function:: bool insert_cert(const X509_Certificate& cert) Inserts ``cert`` into the store. Returns `false` if the certificate is already known and `true` if insertion was successful. .. cpp:function:: remove_cert(const X509_Certificate& cert) Removes ``cert`` from the store. Returns `false` if the certificate could not be found and `true` if removal was successful. .. cpp:function:: std::shared_ptr find_key(const X509_Certificate&) const Returns the private key for "cert" or an empty shared_ptr if none was found .. cpp:function:: std::vector> \ find_certs_for_key(const Private_Key& key) const Returns all certificates for private key ``key`` .. cpp:function:: bool insert_key(const X509_Certificate& cert, const Private_Key& key) Inserts ``key`` for ``cert`` into the store, returns `false` if the key is already known and `true` if insertion was successful. .. cpp:function:: void remove_key(const Private_Key& key) Removes ``key`` from the store .. cpp:function:: void revoke_cert(const X509_Certificate&, CRL_Code, \ const X509_Time& time = X509_Time()) Marks ``cert`` as revoked starting from ``time`` .. cpp:function:: void affirm_cert(const X509_Certificate&) Reverses the revokation for ``cert`` .. cpp:function:: std::vector generate_crls() const Generates CRLs for all certificates marked as revoked. A CRL is returned for each unique issuer DN. The ``Certificate_Store_In_SQL`` class operates on an abstract ``SQL_Database`` object. If support for sqlite3 was enabled at build time, Botan includes an implementation of this interface for sqlite3, and a subclass of ``Certificate_Store_In_SQL`` which creates or opens a sqlite3 database. .. cpp:class:: Certificate_Store_In_SQLite .. cpp:function:: Certificate_Store_In_SQLite(const std::string& db_path, \ const std::string& passwd, RandomNumberGenerator& rng, const std::string& table_prefix = "") Create or open an existing certificate store from an sqlite database file. The password in ``passwd`` will be used to encrypt private keys. Path Validation ---------------------------------------- The process of validating a certfificate chain up to a trusted root is called `path validation`, and in botan that operation is handled by a set of functions in ``x509path.h`` named ``x509_path_validate``: .. cpp:function:: Path_Validation_Result \ x509_path_validate(const X509_Certificate& end_cert, \ const Path_Validation_Restrictions& restrictions, \ const Certificate_Store& store, const std::string& hostname = "", \ Usage_Type usage = Usage_Type::UNSPECIFIED, \ std::chrono::system_clock::time_point validation_time = std::chrono::system_clock::now(), \ std::chrono::milliseconds ocsp_timeout = std::chrono::milliseconds(0), \ const std::vector>& ocsp_resp = {}) The last five parameters are optional. ``hostname`` specifies a hostname which is matched against the subject DN in ``end_cert`` according to RFC 6125. An empty hostname disables hostname validation. ``usage`` specifies key usage restrictions that are compared to the key usage fields in `end_cert` according to RFC 5280, if not set to ``UNSPECIFIED``. ``validation_time`` allows setting the time point at which all certificates are validated. This is really only useful for testing. The default is the current system clock's current time. ``ocsp_timeout`` sets the timeout for OCSP requests. The default of 0 disables OCSP checks alltogether. ``ocsp_resp`` allows adding additional OCSP responses retrieved from outside of the path validation. Note that OCSP online checks are done only as long as the http_util module was compiled in. Availability of online OCSP checks can be checked using the macro BOTAN_HAS_ONLINE_REVOCATION_CHECKS. For the different flavours of ``x509_path_validate``, check ``x509path.h``. The result of the validation is returned as a class: .. cpp:class:: Path_Validation_Result Specifies the result of the validation .. cpp:function:: bool successful_validation() const Returns true if a certificate path from *end_cert* to a trusted root was found and all path validation checks passed. .. cpp:function:: std::string result_string() const Returns a descriptive string of the validation status (for instance "Verified", "Certificate is not yet valid", or "Signature error"). This is the string value of the `result` function below. .. cpp:function:: const X509_Certificate& trust_root() const If the validation was successful, returns the certificate which is acting as the trust root for *end_cert*. .. cpp:function:: const std::vector& cert_path() const Returns the full certificate path starting with the end entity certificate and ending in the trust root. .. cpp:function:: Certificate_Status_Code result() const Returns the 'worst' error that occurred during validation. For instance, we do not want an expired certificate with an invalid signature to be reported to the user as being simply expired (a relativly innocuous and common error) when the signature isn't even valid. .. cpp:function:: const std::vector>& all_statuses() const For each certificate in the chain, returns a set of status which indicate all errors which occurred during validation. This is primarily useful for diagnostic purposes. .. cpp:function:: std::set trusted_hashes() const Returns the set of all cryptographic hash functions which are implicitly trusted for this validation to be correct. A ``Path_Validation_Restrictions`` is passed to the path validator and specifies restrictions and options for the validation step. The two constructors are: .. cpp:function:: Path_Validation_Restrictions(bool require_rev, \ size_t minimum_key_strength, \ bool ocsp_all_intermediates, \ const std::set& trusted_hashes) If `require_rev` is true, then any path without revocation information (CRL or OCSP check) is rejected with the code `NO_REVOCATION_DATA`. The `minimum_key_strength` parameter specifies the minimum strength of public key signature we will accept is. The set of hash names `trusted_hashes` indicates which hash functions we'll accept for cryptographic signatures. Any untrusted hash will cause the error case `UNTRUSTED_HASH`. .. cpp:function:: Path_Validation_Restrictions(bool require_rev = false, \ size_t minimum_key_strength = 80, \ bool ocsp_all_intermediates = false) A variant of the above with some convenient defaults. The current default `minimum_key_strength` of 80 roughly cooresponds to 1024 bit RSA. The set of trusted hashes is set to all SHA-2 variants, and, if `minimum_key_strength` is less than or equal to 80, then SHA-1 signatures will also be accepted. Creating New Certificates --------------------------------- A CA is represented by the type ``X509_CA``, which can be found in ``x509_ca.h``. A CA always needs its own certificate, which can either be a self-signed certificate (see below on how to create one) or one issued by another CA (see the section on PKCS #10 requests). Creating a CA object is done by the following constructor: .. cpp:function:: X509_CA::X509_CA(const X509_Certificate& cert, \ const Private_Key& key, \ const std::string& hash_fn, \ RandomNumberGenerator& rng) The private ``key`` is the private key corresponding to the public key in the CA's certificate. ``hash_fn`` is the name of the hash function to use for signing, e.g., `SHA-256`. ``rng`` is queried for random during signing. There is an alternative constructor that lets you set additional options, namely the padding scheme that will be used by the X509_CA object to sign certificates and certificate revocation lists. If the padding is not set explicitly, the CA will use the padding scheme that was used when signing the CA certificate. .. cpp:function:: X509_CA::X509_CA(const X509_Certificate& cert, \ const Private_Key& key, \ const std::map& opts, \ const std::string& hash_fn, \ RandomNumberGenerator& rng) The only option valid at this moment is "padding". The supported padding schemes can be found in src/lib/pubkey/padding.cpp. Some alternative names for the padding schemes are understood, as well. Requests for new certificates are supplied to a CA in the form of PKCS #10 certificate requests (called a ``PKCS10_Request`` object in Botan). These are decoded in a similar manner to certificates/CRLs/etc. A request is vetted by humans (who somehow verify that the name in the request corresponds to the name of the entity who requested it), and then signed by a CA key, generating a new certificate: .. cpp:function:: X509_Certificate \ X509_CA::sign_request(const PKCS10_Request& req, \ RandomNumberGenerator& rng, \ const X509_Time& not_before, \ const X509_Time& not_after) Generating CRLs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As mentioned previously, the ability to process CRLs is highly important in many PKI systems. In fact, according to strict X.509 rules, you must not validate any certificate if the appropriate CRLs are not available (though hardly any systems are that strict). In any case, a CA should have a valid CRL available at all times. Of course, you might be wondering what to do if no certificates have been revoked. Never fear; empty CRLs, which revoke nothing at all, can be issued. To generate a new, empty CRL, just call .. cpp:function:: X509_CRL X509_CA::new_crl(RandomNumberGenerator& rng, \ uint32_t next_update = 0) This function will return a new, empty CRL. The ``next_update`` parameter is the number of seconds before the CRL expires. If it is set to the (default) value of zero, then a reasonable default (currently 7 days) will be used. On the other hand, you may have issued a CRL before. In that case, you will want to issue a new CRL that contains all previously revoked certificates, along with any new ones. This is done by calling .. cpp:function:: X509_CRL X509_CA::update_crl(const X509_CRL& last_crl, \ std::vector new_entries, RandomNumberGenerator& rng, \ size_t next_update = 0) Where ``last_crl`` is the last CRL this CA issued, and ``new_entries`` is a list of any newly revoked certificates. The function returns a new ``X509_CRL`` to make available for clients. The ``CRL_Entry`` type is a structure that contains, at a minimum, the serial number of the revoked certificate. As serial numbers are never repeated, the pairing of an issuer and a serial number (should) distinctly identify any certificate. In this case, we represent the serial number as a ``secure_vector`` called ``serial``. There are two additional (optional) values, an enumeration called ``CRL_Code`` that specifies the reason for revocation (``reason``), and an object that represents the time that the certificate became invalid (if this information is known). If you wish to remove an old entry from the CRL, insert a new entry for the same cert, with a ``reason`` code of ``REMOVE_FROM_CRL``. For example, if a revoked certificate has expired 'normally', there is no reason to continue to explicitly revoke it, since clients will reject the cert as expired in any case. Self-Signed Certificates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Generating a new self-signed certificate can often be useful, for example when setting up a new root CA, or for use in specialized protocols. The library provides a utility function for this: .. cpp:function:: X509_Certificate create_self_signed_cert( \ const X509_Cert_Options& opts, const Private_Key& key, \ const std::string& hash_fn, RandomNumberGenerator& rng) Where ``key`` is the private key you wish to use (the public key, used in the certificate itself is extracted from the private key), and ``opts`` is an structure that has various bits of information that will be used in creating the certificate (this structure, and its use, is discussed below). Creating PKCS #10 Requests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Also in ``x509self.h``, there is a function for generating new PKCS #10 certificate requests: .. cpp:function:: PKCS10_Request create_cert_req( \ const X509_Cert_Options& opts, const Private_Key& key, \ const std::string& hash_fn, RandomNumberGenerator& rng) This function acts quite similarly to :cpp:func:`create_self_signed_cert`, except it instead returns a PKCS #10 certificate request. After creating it, one would typically transmit it to a CA, who signs it and returns a freshly minted X.509 certificate. Certificate Options ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ What is this ``X509_Cert_Options`` thing we've been passing around? It's a class representing a bunch of information that will end up being stored into the certificate. This information comes in 3 major flavors: information about the subject (CA or end-user), the validity period of the certificate, and restrictions on the usage of the certificate. For special cases, you can also add custom X.509v3 extensions. First and foremost is a number of ``std::string`` members, which contains various bits of information about the user: ``common_name``, ``serial_number``, ``country``, ``organization``, ``org_unit``, ``locality``, ``state``, ``email``, ``dns_name``, and ``uri``. As many of these as possible should be filled it (especially an email address), though the only required ones are ``common_name`` and ``country``. There is another value that is only useful when creating a PKCS #10 request, which is called ``challenge``. This is a challenge password, which you can later use to request certificate revocation (*if* the CA supports doing revocations in this manner). Then there is the validity period; these are set with ``not_before`` and ``not_after``. Both of these functions also take a ``std::string``, which specifies when the certificate should start being valid, and when it should stop being valid. If you don't set the starting validity period, it will automatically choose the current time. If you don't set the ending time, it will choose the starting time plus a default time period. The arguments to these functions specify the time in the following format: "2002/11/27 1:50:14". The time is in 24-hour format, and the date is encoded as year/month/day. The date must be specified, but you can omit the time or trailing parts of it, for example "2002/11/27 1:50" or "2002/11/27". Third, you can set constraints on a key. The one you're mostly likely to want to use is to create (or request) a CA certificate, which can be done by calling the member function ``CA_key``. This should only be used when needed. Moreover, you can specify the padding scheme to be used when digital signatures are computed by calling function ``set_padding_scheme`` with a string representing the padding scheme. This way, you can control the padding scheme for self-signed certificates and PKCS #10 requests. The padding scheme used by a CA when building a certificate or a certificate revocation list can be set in the ``X509_CA`` constructor. The supported padding schemes can be found in src/lib/pubkey/padding.cpp. Some alternative names for the padding schemes are understood, as well. Other constraints can be set by calling the member functions ``add_constraints`` and ``add_ex_constraints``. The first takes a ``Key_Constraints`` value, and replaces any previously set value. If no value is set, then the certificate key is marked as being valid for any usage. You can set it to any of the following (for more than one usage, OR them together): ``DIGITAL_SIGNATURE``, ``NON_REPUDIATION``, ``KEY_ENCIPHERMENT``, ``DATA_ENCIPHERMENT``, ``KEY_AGREEMENT``, ``KEY_CERT_SIGN``, ``CRL_SIGN``, ``ENCIPHER_ONLY``, ``DECIPHER_ONLY``. Many of these have quite special semantics, so you should either consult the appropriate standards document (such as RFC 5280), or just not call ``add_constraints``, in which case the appropriate values will be chosen for you. The second function, ``add_ex_constraints``, allows you to specify an OID that has some meaning with regards to restricting the key to particular usages. You can, if you wish, specify any OID you like, but there is a set of standard ones that other applications will be able to understand. These are the ones specified by the PKIX standard, and are named "PKIX.ServerAuth" (for TLS server authentication), "PKIX.ClientAuth" (for TLS client authentication), "PKIX.CodeSigning", "PKIX.EmailProtection" (most likely for use with S/MIME), "PKIX.IPsecUser", "PKIX.IPsecTunnel", "PKIX.IPsecEndSystem", and "PKIX.TimeStamping". You can call "add_ex_constraints" any number of times - each new OID will be added to the list to include in the certificate. Lastly, you can add any X.509v3 extensions in the `extensions` member. This is really only useful if you want to encode custom extensions in the certificate. Most users probably won't need this. Note that extensions added this way will be overwritten by an ``X509_CA`` if also added by the ``X509_CA`` itself. This currently includes the Basic Constraints, Key Usage, Authority Key ID, Subject Key ID, Subject Alternative Name and Extended Key Usage extension. OCSP Requests ---------------------------------------- A client makes an OCSP request to what is termed an 'OCSP responder'. This responder returns a signed response attesting that the certificate in question has not been revoked. The most recent OCSP specification is as of this writing :rfc:`6960`. Normally OCSP validation happens automatically as part of X.509 certificate validation, as long as OCSP is enabled (by setting a non-zero ``ocsp_timeout`` in the call to ``x509_path_validate``, or for TLS by implementing the related ``tls_verify_cert_chain_ocsp_timeout`` callback and returning a non-zero value from that). So most applications should not need to directly manipulate OCSP request and response objects. For those that do, the primary ocsp interface is in ``ocsp.h``. First a request must be formed, using information contained in the subject certificate and in the subject's issuing certificate. .. cpp:class:: OCSP::Request .. cpp:function:: OCSP::Request(const X509_Certificate& issuer_cert, \ const BigInt& subject_serial) Create a new OCSP request .. cpp:function:: OCSP::Request(const X509_Certificate& issuer_cert, \ const X509_Certificate& subject_cert) Variant of the above, using serial number from ``subject_cert``. .. cpp:function:: std::vector BER_encode() const Encode the current OCSP request as a binary string. .. cpp:function:: std::string base64_encode() const Encode the current OCSP request as a base64 string. Then the response is parsed and validated, and if valid, can be consulted for certificate status information. .. cpp:class:: OCSP::Response .. cpp:function:: OCSP::Response(const uint8_t response_bits[], size_t response_bits_len) Attempts to parse ``response_bits`` as an OCSP response. Throws an exception if parsing fails. Note that this does not verify that the OCSP response is valid (ie that the signature is correct), merely that the ASN.1 structure matches an OCSP response. .. cpp:function:: Certificate_Status_Code check_signature( \ const std::vector& trust_roots, \ const std::vector>& cert_path = {}) const Find the issuing certificate of the OCSP response, and check the signature. If possible, pass the full certificate path being validated in the optional ``cert_path`` argument: this additional information helps locate the OCSP signer's certificate in some cases. If this does not return ``Certificate_Status_Code::OCSP_SIGNATURE_OK``, then the request must not be be used further. .. cpp:function:: Certificate_Status_Code verify_signature(const X509_Certificate& issuing_cert) const If the certificate that issued the OCSP response is already known (eg, because in some specific application all the OCSP responses will always be signed by a single trusted issuer whose cert is baked into the code) this provides an alternate version of `check_signature`. .. cpp:function:: Certificate_Status_Code status_for(const X509_Certificate& issuer, \ const X509_Certificate& subject, \ std::chrono::system_clock::time_point ref_time = std::chrono::system_clock::now()) const Assuming the signature is valid, returns the status for the subject certificate. Make sure to get the ordering of the issuer and subject certificates correct. The ``ref_time`` is normally just the system clock, but can be used if validation against some other reference time is desired (such as for testing, to verify an old previously valid OCSP response, or to use an alternate time source such as the Roughtime protocol instead of the local client system clock). .. cpp:function:: const X509_Time& produced_at() const Return the time this OCSP response was (claimed to be) produced at. .. cpp:function:: const X509_DN& signer_name() const Return the distinguished name of the signer. This is used to help find the issuing certificate. This field is optional in OCSP responses, and may not be set. .. cpp:function:: const std::vector& signer_key_hash() const Return the SHA-1 hash of the public key of the signer. This is used to help find the issuing certificate. The ``Certificate_Store`` API ``find_cert_by_pubkey_sha1`` can search on this value. This field is optional in OCSP responses, and may not be set. .. cpp:function:: const std::vector& raw_bits() const Return the entire raw ASN.1 blob (for debugging or specialized decoding needs) One common way of making OCSP requests is via HTTP, see :rfc:`2560` Appendix A for details. A basic implementation of this is the function ``online_check``, which is available as long as the ``http_util`` module was compiled in; check by testing for the macro ``BOTAN_HAS_HTTP_UTIL``. .. cpp:function:: OCSP::Response online_check(const X509_Certificate& issuer, \ const BigInt& subject_serial, \ const std::string& ocsp_responder, \ const Certificate_Store* trusted_roots) Assemble a OCSP request for serial number ``subject_serial`` and attempt to request it to responder at URI ``ocsp_responder`` over a new HTTP socket, parses and returns the response. If trusted_roots is not null, then the response is additionally validated using OCSP response API ``check_signature``. Otherwise, this call must be performed later by the application. .. cpp:function:: OCSP::Response online_check(const X509_Certificate& issuer, \ const X509_Certificate& subject, \ const Certificate_Store* trusted_roots) Variant of the above but uses serial number and OCSP responder URI from ``subject``. botan-2.4.0/doc/os.rst000066400000000000000000000056641322470703100145520ustar00rootroot00000000000000Botan OS information ======================================== OS Features ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A summary of OS features as defined in ``src/build-data/os``. :: a: aix a: android c: cygwin d: darwin d: dragonfly f: freebsd h: haiku h: hpux h: hurd i: includeos i: ios l: linux l: llvm m: mingw n: nacl n: netbsd o: openbsd q: qnx s: solaris w: windows w: winphone .. csv-table:: :header: "Feature", "a", "a", "c", "d", "d", "f", "h", "h", "h", "i", "i", "l", "l", "m", "n", "n", "o", "q", "s", "w", "w" "arc4random", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", " ", " ", " ", " " "clock_gettime", "X", "X", " ", " ", "X", "X", " ", " ", " ", " ", " ", "X", " ", " ", " ", "X", "X", "X", " ", " ", " " "cryptgenrandom", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", " " "crypto_ng", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X" "dlopen", "X", "X", " ", "X", "X", "X", " ", " ", " ", " ", "X", "X", " ", " ", " ", "X", "X", "X", " ", " ", " " "explicit_bzero", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " " "filesystem", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", "X", "X", "X", "X", " ", "X", "X", "X", "X", "X", "X" "getauxval", " ", "X", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", " ", " ", " ", " " "gmtime_r", "X", "X", " ", "X", " ", "X", "X", " ", " ", " ", "X", "X", " ", " ", " ", "X", "X", "X", " ", " ", " " "gmtime_s", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", "X" "loadlibrary", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", "X" "posix_mlock", " ", "X", " ", " ", "X", "X", " ", " ", "X", " ", " ", "X", " ", " ", " ", "X", "X", "X", "X", " ", " " "query_perf_counter", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", "X" "readdir", "X", "X", "X", "X", "X", "X", " ", " ", " ", " ", "X", "X", " ", " ", " ", "X", "X", " ", "X", " ", " " "rtlsecurezeromemory", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", "X" "sockets", "X", " ", " ", "X", "X", "X", " ", " ", " ", " ", "X", "X", " ", " ", " ", " ", "X", " ", " ", "X", "X" "stl_filesystem_msvc", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " " "threads", "X", "X", "X", "X", "X", "X", "X", "X", "X", " ", "X", "X", " ", "X", "X", "X", "X", "X", "X", "X", "X" "virtual_lock", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X", " ", " ", " ", " ", " ", "X", " " .. note:: This file is auto generated by ``src/scripts/update_docs.py``. Dont modify it manually. botan-2.4.0/doc/pgpkey.txt000066400000000000000000000206511322470703100154300ustar00rootroot00000000000000The following PGP key is used to sign all releases: pub 2048R/EFBADFBC 2004-10-30 Key fingerprint = 621D AF64 11E1 851C 4CF9 A2E1 6211 EBF1 EFBA DFBC uid Botan Distribution Key -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.17 (GNU/Linux) mQELBEGD1j0BCADHxPJkPcjJE+4Dlisx2hVc0Dj6JI1MSLrkM8R+2bOhVUSferxP T1EMPhfrAdOHTAloyvRThJztnZsNKqfLL49GGcBLdEGAVNks1pG37Teze5Lx1XIu zJFrozL2sqBy5C6nHpFgd1tcD68Rah2wp0u2cR9owXf1IqKdEfuo661+MTv7wTB1 4hKV75nB7ZO6676SEZRILYM+7RJwKAKEmEPJc6hEf94VXn9ecNzaTlHgYkjhz9db LOd3od9XvuUw+LMR1dwBqMxbvR90MiXjbedDEkbArcZB9YOAIvEX/lC3qaW4XJt4 iwHWl/YVZEfALcvQywe2CDrH5hO794wd9MpBAAYptBZCb3RhbiBEaXN0cmlidXRp b24gS2V5iQEqBBMBAgAUAhsDAh4BAheABQJKfFpnBBUKCQgACgkQYhHr8e+637xk PQf/aOi78XenwwvFrwXOVIVTdZIf8rK1zJksf26h09UD8uVV6z5iiTcpn86+eN9p 6Ar8IH3tD+JuFnPSwZ/r9MNC2XZwenYo4Gb14jqM6/9hBe328vmeM4Y1G7bD4HrL kgV5WEyokqm3zbp3FBLr3Vh68TAC5JB9aHevra+cCA2u3vBNI3YUM5z4TdO150P3 J00whkqImQEUni8bgxvllBLFM+uhucsX3HZWkoDEpotbg8yd0bqMkiPEyMr1OnJq eDVDMrB5wnyLgLFfRAAw3mopM0C1PNOAHr/BIYiaDHX2OwnOfep8rMDoRVf2Ge0D DBgsJJ6LduQHLeg403SHWL2F6YkCHAQTAQIABgUCQYPWUgAKCRBcD5boTsFta+r9 EACWVis7YcaGkKKgRB/5ox8rM36XVhMXdh/hnnGHt5rapbbRRkRHRcWU8WIcFO1A 59+TfwNNd8gN1MEt/5aX5KHWVKHBDexJgIxm6Dm1pisYHf/dnYQPM18hmqqwNlKY 97hFkPpHd7enrtc/SvGbQhhLXYlpwBrdMl76e9xJLnnrRQksxegGPo8cr+C9HTs1 Lwa8zzBxyBwYBYX+0moDkDShEhuXx6mEOXrGvQanJuIvpoIwGH+62E65MbJGlwWp w/MAtm2jFhBIhGV0bqJCFp9zIgdNgfskBaPr0oilbuJQZqP0Iqe/6CCt4XkS51yW ZqxjLAFpEpvDec4PGw3witKf/koGon9X8C035+nEjLBrWy18Q91vw2USyLI+mm9d iMAS8pY2gomfxBO2VwYHJryZykjCYQkccRA1tHteRj4gqTObo0Ak47y5MnplTWwi 40oP7K2cfhCRBmMioxmYES4xsHEupfRBo3xr1Jq9q0t688WTT1NXHPMPoueF9mKZ Cf2pa9aHsqBmWTm3sCaNQKGubCDBEUmJUyndmSatJyYM7NVYoUp6EfqMACFuTNdB sjKMh7aWVikQpbJDfA1BIU3lZeqgjgrghVAWkEOBfhG0IVZj+RVCJpsqoTJ8asY2 VreArSCyr/VnLEnfuH/QpgvCiCbepo3E34DJt4SaAOO2ZohGBBARAgAGBQJMGVc1 AAoJEKY/LL36AvvMgsoAn2G7kXd09BF7ffk1Sfh174SVrvM9AKC7+R7x0+yV3SCd JkkUOo3xR5cOxw== =1QuR -----END PGP PUBLIC KEY BLOCK----- This key can be used to contact the primary maintainer: pub rsa3072/57123B60 2015-03-23 Key fingerprint = 4E60 C735 51AF 2188 DF0A 5A62 78E9 8043 5712 3B60 uid Jack Lloyd -----BEGIN PGP PUBLIC KEY BLOCK----- mQGNBFUQXRMBDACZJvcSkr+GNDtIdP9fQWRXByriiIKvuKbqU8KGdhTcPeKwl3y3 l1W9XsWA2DJ8QDKo4ZcV0lycszIvwBLZllJJWSVNFKxJK2IW33xcIo9dhNqj+hcz LxKtBlBU3QKXdQ9+VKSY4EpO6gt/ar21PV+EQcFA9UtT1mRKVqY0pGGxqfQjrOss rJKoJyA+1trH4ir7+0/524HNzsBj3B1GmrYfstspqetXyVQ1DoFiThUnj/zJGes5 uW9laI9VBgrtMTBbYrylBytXiF0Flzx+bd21krgL37NH2uU0EHPjSx571q/XGG2U 4iOEPvPu7vtV8Rpqd0xQyaHcpoHNklcfND1c/6uZG1Sx9atDScRYHinUZvtTRtN+ OY5vW+H7LJqT6CeMjh6Ev53V+0JCDZFQLaBdP/NanSQBUhPkyfyQSiqWOSuaMD6n Eu+BigmzwDlsauuReTJ65gdIGI9Egt7Ax/ooKpBvPkWeT+GORKTs+qGy6sbKXrTe crFFN/HZPWAJ+c8AEQEAAbQfSmFjayBMbG95ZCA8amFja0ByYW5kb21iaXQubmV0 PokB1AQTAQgAPgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgBYhBE5gxzVRryGI 3wpaYnjpgENXEjtgBQJaUj7bBQkJBEjIAAoJEHjpgENXEjtgguwMAJGWq2S7jGjG qGllLTA1GterLBGP4zH3k8y3ch3PtXxFsyqUedx7RjvZst1FdgYGIk/aOvND64DW KEjqsjLbhVh9+ANzzNeGEPvkBjXWO/6LuuhdF/Rj4puo8pJX3HCuHde6njYPmOry XEptPpKblSGU7RVbhyaL4A0sukproRbdDHNuHPBiwTSiKWxOWN1NksSVwjXXPUH2 P0OqtwVxwDtFt/p4f4KtXZ0XYztI3bV9XLtITcQVIZHur9Pj0HWCtBgGvqdwADGn VE7BCUTKGYEFrpl1q/YKBhtqlEVNJ1mtF7zUbKhioVZIUhWu5x3hB1d3+2ezP9D8 Gncjch9KxlNY8hCy1jpncvH4j0ocbmqbqsNfJsS7PrsDTdD2fKbuNVy76uuP6tBy wvhqFpjrHWG9a0jReR9pC9QY5IaKOpt1w9YJaPhFRgSLmISobrfRWuF3nSahSq1X z/4oMg/9s63HAoY+1aDB5zbzIB/qPhX/c7oG2ywptN+5/UgmxWJAKLQhSmFjayBM bG95ZCA8amFjay5sbG95ZEBnbWFpbC5jb20+iQHUBBMBCAA+AhsDBQsJCAcCBhUI CQoLAgQWAgMBAh4BAheAFiEETmDHNVGvIYjfClpieOmAQ1cSO2AFAlpSPuAFCQkE SMgACgkQeOmAQ1cSO2CuMAv+L9/pk1Rt/N9Uh9BafxxZaqUtgnUHC40FPRjWX4Rl 26ezmrffBU7d+i9JYVrBRENBfj+lwPUNcXyPa2Ls2tr6IFyKoUf7eS6K0+6cMCWK 6Cjhb7/AiJnzbrIak8+pme40SImPeHaFtZLWNPgksS24ieAbz8gtTGvmi84VCl72 Ki8nbnwcHc89ADYPwJPKS+m37tKj8sn7rOcxFqL83fT8FOBYuNF07NA7O40e/gwW jIz+3rjr8vydlR+ptITxBjhP7196WaWUS9aX6jKhLzRVuiKsrkGIN4Q674CjYqqK CmfPzUQCCasAR4YXi6DI2FKvEOILv6AcrKMKSXi+gLcu9sOMGr9dSfiAlp4Jgr6r XM3PxYUVLJ7fSLX1Rc2C8Zftja3OWS7iwGGwk2s2pp/WIlZ7FJMcgt2Za66WT4S+ IiZK6t/TnREZCxdZkheA/KGpu3rGnbHOW2X+3X2K0+8z5LuqAg+MnBUTu5RfASOT SgsU+jvVTy17aEJ8ja4qt3FMtCBKYWNrIExsb3lkIDxsbG95ZEByYW5kb21iaXQu bmV0PokB1gQTAQIAQAIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAFiEETmDH NVGvIYjfClpieOmAQ1cSO2AFAlpSPuAFCQkESMgACgkQeOmAQ1cSO2D9HQv/dVeN Z38zaaHJFZUS2D0FQa6yHuIcQAbH4V3+7OxGyrt5M4hTYa31zQ8lwGcqBS4gP89x PDF77ZhiyxE8cBQ4djJrGJKzaSzeJ8x/163PYl5dB8dAsr1VfEEQFhePOGY2DiIr heEH5CWwvI5t9rxlRb1oPBhogXqAcWTGCQiDviHE+gI6tC5VeewoTwafNbut7j+i +XdkDDt05MXjySX1cxRG8MXpghrqWhX6miNKfhjiXrxWd4+Z7cEBHoo9n3lmHe0X PLfdj1Jt12C4iqkyieNwpx88cWqbmfinm3zFwPBvDZq1BGW89pq7jyBqpbtIIB4a fsD35pRaR+Bm1QLMAlNaYb+BgMLp0AN7WlcfyFeFYm5/I1SIZSno/V5SbWDSEG7n XmWiIeeI34a7P76icxxVstk7NSKlu3V9losD4wPrpzAK9Yr+LfWkCMa9km2q0nKy CuRKX2GW5+rwjm2TjcOFrGtUlq22ByBzB88oOSfyk8nfNQNGO6y4mGfvOdw2iQEc BBABCAAGBQJWGlBMAAoJEGIR6/Hvut+8y3kH/jnT/8RNmMhVCS9fsRCh6bwHjfvf FZ9QtrE5qLTSGj8FQWPRS3gOPOCFnRcJyX18dYEMsm8Zcrc+AWbguyc7utDhJpOS BUSKkKFcsBF1gjlIP1BAVmZvmXEcyBXIqo/T3Dn6berP2kmXefkXJuR1BgC2Aqnp NrPZxjvGtVp5OJvXdbv0QBpcRTNrYXtb+aefeyLRoXDj97Y1lTzzrk3tBPvxSN2c aaLShnX0uhfxgdmz+5JmtolTuttQrPcLGJq2RGpiqWse1+6fZsmgBtGEXQk7JRXf xDkyzpZT4cufA06+6srMATxCNMfFhA0xNBtCHUGDZi6uJLs3jmiJXFDFC825AY0E VRBdEwEMAN6NE/fR/Ours4jc6SaVocKSZ+/pGXVrxQ/ZFoba7kJq09DLQZ21vHYk q7wMrAta9D6gH5bLZ90xI6ScyR9fYTWYDXdDHx8Sg7Mj3ZKhxjr1tQicRPT6BP4W LqBICdlUWV//OCRFk13G8feDO+ZT8YP/dVUrj3n9/mwfOHm7Npb7PHX/LFuDyo/1 EXZZyqw3/LlI+z+1uBKFYD2WqzLw8Sm/U+ajzP6y04wUkf45VjLkFI2bPk6CVYNt 2TvOEzIO3zBAN6DSLSFOTYn9UwR2vrpvoJsDjjSRjcjbZ/8uFCWfLhgTwMeQcH0j xHr47Qs2coApHBAIB57eS6Z/y4Vja3Y0ANpb51Fu7MDPXQXW4g89GMTIEKu2/KUN /onGIYh6Js9RYNf8SJ+waQ0NULXAMk1AAfknl2Apl9gKRDH6EvevQXPVI6ElOTZw 4gqGz9xGqC+gbmh2UmS5n8B/nK2d0AMN+1elZAapTFFdOMhMdDeBk+1GRQ/t/zsL TUPSSRVLFwARAQABiQGfBBgBAgAJBQJVEF0TAhsMAAoJEHjpgENXEjtg3rgMAIDJ gnuEY7neuJMIzHyO59a8X+9ip9XfeDNwjaqJk0rIoqSdkIqjG8I6C4lbeL0pnGzl iudvEmQij4hnSNfOUk58oGyRdyUeK9eC2KeZ+Hs3sqMuAhlYIh+RR6ifo5kqxR/g eo6iXKS8VqDQRiqoSSrLqhIU7kQiFcQWc3wYaSOUXNpZzvlTlMYM4qP9Yrzu8dG1 tKST3fmWi8l9/TmHIPtskgB0dzTdkKe2kZpJFFquYtorWtCQwF+wmtA02NMHwrQz wh/RqNz9wUEwhQVBa/A8p0wdEskLFQZXt3PnY8GHQVz59tArolw3kes0/VrtgCUF S7tvmn9xI6lJxveQiN6Ec2z5gbwKBShkSvopi0g83YLeSNPrCIBmLSCOm1AjsXF3 sQazEYqAGhB6qibCsuebxnprq8Qa/j0wsq7n8ZO7a6cdcnhu4fF3YdWcaWlCUKzz Wb8WXXoeCaOKxmD5IgsGiAxnPKvsBge1rMhlCoJJhJEmUlwxoP67Nt2mHbYh/Q== =+t+P -----END PGP PUBLIC KEY BLOCK----- This key is used for signing git commits: pub rsa2048/AB50F90D 2016-03-03 [SC] [expires: 2020-03-02] Key fingerprint = 1175 1014 9DF4 18AB D19C B06D 9FFD 596F AB50 F90D uid Jack Lloyd (Git Signing Key) -----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFbYWi4BCACjgz3gYgWMybPLiovNLnLonG0ex2y9kJgsR+Pm08L2fwCVCaHx wjlK5Oq04x3bvujZk7P0TThqS1WonYtEiVxz3Hcvt7rlU5fSCj/1uYmZV+mbPBdY f/yXMx3UD1UkZrdzbM21L78dfOoLZ2ybyuk4QOEad/AkouDCUA2pY3DJdNyX8Aee dBdQ+sQqF6DyDz4SDY+KAq3nFmmT04bdkiL9sZb2HUokxIdeA6HIR+CxxFaZzrYW Ky4iNPS1Zxv5D1KmpZzUOfN9RTgkbdRltgWxjpB+DFNUkpu3hYm/Y9lTPqGBt2C8 JfIS5OaHxUVz0A+DtIGy+lk8/O5ek4suQBZ3ABEBAAG0MkphY2sgTGxveWQgKEdp dCBTaWduaW5nIEtleSkgPGxsb3lkQHJhbmRvbWJpdC5uZXQ+iQE9BBMBCAAnBQJW 2FwDAhsDBQkHhM4ABQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEJ/9WW+rUPkN K3cIAI+6M5JixbjdyoVSDor0RW4u5h6UESe2mRZ5YFzh8F5uGms8PE5HrIZAfNVy 9lJrDoLSPpeb5KLAdGpaJ1NuJJ2glYzZFYr05gVHgCKJgfo6jkW22XnwO+vyXK+6 TB6AExgO0RdN5aZcHL8KCfCWncVsWvF8d2cvbdb3sTfqtZoZ0l1DyYA62pz5BZd+ iySjnWGsL9YM53pC6hhq62onSqfv0X0fqzZ3+zIqTgVMOJxIFCXBiUBkHEuizUUL fPrPxfAiaEQcaOcpEos+/OsG3e3nFmXEAlDa9ZsS2VEaZ/nFJPIaKeDXt80ptScn xp2tlecw8hR/OfJJ6MFMw4W/J8WJAZwEEAEIAAYFAlbYXDcACgkQeOmAQ1cSO2C8 Kwv/ebJNrhMoknG5dSPVJpJxL0ta/m4KYBjX94VsB6Ofz96UmnNlCe9Exbi02ecL ygQfB9UUv7nsrORGOSoIEIV/RSYgN2eYUM21DHddlgVG3DTRrG//iV6rzAdgkZdR kxBhnzeFJRv4TMmnRQXM2x+gjognDWLpjgdvkRFcv5l6fTH24IldcdymnvmqBmsL vqoKFj13CtsDjngp5gGgp/ieIW6sPmgQX1pJCWHFDe/0qcjvuy0fKMq0Oyd0/8dX CnNawPb/9xlQY+lCpHILfvFsVty5djqHqDNKEBuYxyPjHICPGRukSK+zCS0EE8nz /oxor4OIr5svawfIO5Zw69USo01jC+K1OSRJQthFft5GqTwkfHniYJSVh7K1rPI/ H35tf+XZLBwlafWs7vQb8XZfAPzhqw9blc5RS478rqzNQ0F1PHITjbaSCkMCgaNa 2aeaoIw9uQjp6uB2T4xGAeqsd6JPrr5g1VZFPqthXdiDu6JmN4aVksG/SCx2Cwv2 qiuStDFKYWNrIExsb3lkIChHaXQgU2lnbmluZyBLZXkpIDxqYWNrQHJhbmRvbWJp dC5uZXQ+iQE9BBMBCAAnBQJYD2ybAhsDBQkHhM4ABQsJCAcCBhUICQoLAgQWAgMB Ah4BAheAAAoJEJ/9WW+rUPkNXfIIAIOgepYeZN2HL2T3A8pk+5JR2cfBoRufYgnG 6mVHPejgZDW+9PH1tPDgidnePw3/jfD1oskt1VwOCkqaSBAcG2QeOBEklcsrQuvO fW7B7XFydYGwT9Fm8/sxekiGjDQQWQEEH4j3Vt1GlI2sJrpqMe/WMXISsEnLfw0k DspUSlFOn8oyrBU9Pd8KaSi38lp05a9Mcun5enJ3JpQHQ5RlNXDNh/Sn9NZ+MKWg gytZqIy82jnv6zo0raZDup4hLKopjen/SINR5XcwRK2lUtYVwwQH8FHG9IkeVJNW JkVCdZLB08sq4WHRbtVjy6mpvEHTmolAtHjLSiV5W50LDKLwX24= =kbUT -----END PGP PUBLIC KEY BLOCK----- botan-2.4.0/doc/reading_list.txt000066400000000000000000000063211322470703100165730ustar00rootroot00000000000000 These are papers, articles and books that are interesting or useful from the perspective of crypto implementation. Papers ================== Implementation Techniques ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * "Randomizing the Montgomery Powering Ladder" Le, Tan, Tunstall https://eprint.iacr.org/2015/657 A variant of Algorithm 7 is used for GF(p) point multplications when BOTAN_POINTGFP_BLINDED_MULTIPLY_USE_MONTGOMERY_LADDER is set * "Accelerating AES with vector permute instructions" Mike Hamburg https://shiftleft.org/papers/vector_aes/ His public doman assembly code was rewritten into SSS3 intrinsics for aes_ssse3. * "Elliptic curves and their implementation" Langley http://www.imperialviolet.org/2010/12/04/ecc.html Describes sparse representations for ECC math Random Number Generation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * "On Extract-then-Expand Key Derivation Functions and an HMAC-based KDF" Hugo Krawczyk http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.131.8254 RNG design underlying HMAC_RNG AES Side Channels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * "Software mitigations to hedge AES against cache-based software side channel vulnerabilities" https://eprint.iacr.org/2006/052.pdf * "Cache Games - Bringing Access-Based Cache Attacks on AES to Practice" http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper031.pdf * "Cache-Collision Timing Attacks Against AES" Bonneau, Mironov http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.88.4753 Public Key Side Channels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * "Fast Elliptic Curve Multiplications Resistant against Side Channel Attacks" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.98.1028&rep=rep1&type=pdf * "Resistance against Differential Power Analysis for Elliptic Curve Cryptosystems" Coron http://www.jscoron.fr/publications/dpaecc.pdf * "Further Results and Considerations on Side Channel Attacks on RSA" Klima, Rosa https://eprint.iacr.org/2002/071 Side channel attacks on RSA-KEM and MGF1-SHA1 * "Side-Channel Attacks on the McEliece and Niederreiter Public-Key Cryptosystems" Avanzi, Hoerder, Page, and Tunstall https://eprint.iacr.org/2010/479 * "Minimum Requirements for Evaluating Side-Channel Attack Resistance of Elliptic Curve Implementations" BSI https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Zertifizierung/Interpretationen/AIS_46_ECCGuide_e_pdf.pdf Books ======= * "Handbook of Elliptic and Hyperelliptic Curve Cryptography" Cohen and Frey https://www.hyperelliptic.org/HEHCC/ An excellent reference for ECC math, algorithms, and side channels * "Post-Quantum Cryptography" Bernstein, Buchmann, Dahmen Covers code, lattice, and hash based cryptography Standards ============ * IEEE 1363 http://grouper.ieee.org/groups/1363/ Very influential early in the library lifetime, so a lot of terminology used in the public key (such as "EME" for message encoding) code comes from here. * ISO/IEC 18033-2 http://www.shoup.net/iso/std4.pdf RSA-KEM, PSEC-KEM * NIST SP 800-108 http://csrc.nist.gov/publications/nistpubs/800-108/sp800-108.pdf KDF schemes * NIST SP 800-90A http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf HMAC_DRBG, Hash_DRBG, CTR_DRBG, maybe one other thing? botan-2.4.0/doc/release_process.rst000066400000000000000000000074161322470703100173040ustar00rootroot00000000000000Release Process and Checklist ======================================== .. note:: This information is only useful if you are a developer of botan who is creating a new release of the library. Pre Release Testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Kick off a Coverity scan a day or so before the planned release. Do maintainer-mode builds with Clang and GCC to catch any warnings that should be corrected. And remember that CI doesn't test everything. In particular, not all tests run under valgrind or on the qemu cross builds due to time constraints. So before release, do a complete build/test cycle: - Running under valgrind (remember `--with-valgrind` flag) - Using Clang sanitizers (ASan + UbSan) - Native or cross compile for Linux aarch64 and ppc64le - Native compile on FreeBSD x86-64 - Native compile on at least one unusual platform (AIX, NetBSD, ...) Pre Release Checks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Confirm that the release notes in ``news.rst`` are accurate and complete and that the version number in ``version.txt`` is correct. Update the release date in the release notes and change the entry for the appropriate branch in ``readme.rst`` to point to the new release. Check in these changes (alone, with no other modifications) with a checkin message along the lines of "Update for X.Y.Z release", then tag the release with the version in git (eg tag '2.6.13', no prefix). Build The Release Tarballs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The release script is ``src/scripts/dist.py`` and must be run from a git workspace. $ src/scripts/dist.py 2.6.13 One useful option is ``--output-dir``, which specifies where the output will be placed. The ``--pgp-key-id`` option is used to specify a PGP keyid. If set, the script assumes that it can execute GnuPG and will attempt to create signatures for the tarballs. The default value is ``EFBADFBC``, which is the official signing key. You can use ``--pgp-key-id=none`` to avoid creating any signature, though official distributed releases *should not* be released without signatures. The releases served on the official site are taken from the contents in a git repository:: $ git checkout git@botan.randombit.net:/srv/git/botan-releases.git $ src/scripts/dist.py 2.6.13 --output-dir=botan-releases $ cd botan-releases $ sha256sum Botan-2.6.13.tgz >> sha256sums.txt $ git add . $ git commit -m "Release version 2.6.13" $ git push origin master A cron job updates the live site every 10 minutes. Build The Windows Installer ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ On Windows, run ``configure.py`` to setup a build:: $ python ./configure.py --cc=msvc --cpu=$ARCH --distribution-info=unmodified After completing the build (and running the tests), use `InnoSetup `_ to create the installer. A InnoSetup script is created from ``src/build-data/innosetup.in`` and placed in ``build/botan.iss`` by ``configure.py``. Create the installer either via the InnoSetup GUI by opening the ``iss`` file and selecting the 'Compile' option, or using the ``iscc`` command line tool. If all goes well it will produce an executable with a name like ``botan-2.6.13-x86_64.exe``. Sign the installers with GPG. Update The Website ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The website content is created by ``src/scripts/website.py``. The website is mirrored automatically from a git repository which must be updated:: $ git checkout git@botan.randombit.net:/srv/git/botan-website.git $ ./src/scripts/website.py --output botan-website $ cd botan-website $ git add . $ git commit -m "Update for 2.6.13" $ git push origin master Announce The Release ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Send an email to the botan-announce and botan-devel mailing lists noting that a new release is available. botan-2.4.0/doc/roadmap.rst000066400000000000000000000077441322470703100155550ustar00rootroot00000000000000 Botan Development Roadmap ======================================== Near Term Plans ---------------------------------------- Here is an outline for the development plans over the next 12-18 months, as of November 2017. TLS Hardening/Testing ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Leverage TLS-Attacker better, for example using custom workflows. Add tests using BoringSSL's hacked Go TLS stack. Add interop testing with OpenSSL as part of CI. Improve fuzzer coverage. Expose TLS to C89 and Python ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Exposing TLS to C would allow for many new applications to make use of Botan. Interface to PSK and SRP databases ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Adding support for databases storing encrypted PSKs and SRP credentials. (PSK database support was added in 2.4.0) ECC Refactoring ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Refactoring how elliptic curve groups are stored, sharing representation and allowing better precomputations (eg precomputing base point multiples). Performance Improvements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The eventual goal would be performance parity with OpenSSL, but initial target is probably more like "no worse than 30% slower for any algorithm". Elliptic Curve Pairings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ These are useful in many interesting protocols. Initially BN curves are the main target (particularly BN-256 for compatability with Go's bn256 module) but likely we'll also want BLS curves. TLS 1.3 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The RFC process seems to be approaching consensus so hopefully there will be a final spec soon. The handshake differences are quite substantial, it's an open question how to implement that without overly complicating the existing TLS v1.0-v1.2 handshake code. There will also be some API extensions required to support 0-RTT data. Initial work is focused on features which are included in TLS v1.3 but also available for TLS v1.2 (such as PSS signatures and FFDHE) as well as refactorings which will make the eventual implementation of v1.3 simpler. Assuming no source of dedicated funding appears, a full v1.3 implementation will likely not available until late in 2018. ASN.1 Redesign ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: This project has been deferred to 3.x as constexpr will likely make it much easier to implement. The current ASN.1 library (DER_Encoder/BER_Decoder) does make it roughly possible to write C++ code matching the ASN.1 structures. But it is not flexible enough for all cases and makes many unnecessary copies (and thus memory allocations) of the data as it works. It would be better to have a system that used (a simple subset of) ASN.1 to define the types as well as encoding/decoding logic. Then new types could be easily defined. This could also obviate the current code for handling OIDs, and allow representing the OIDs using the natural OID tree syntax of ASN.1. Another important feature will be supporting copy-free streaming decoding. That is, given a (ptr,len) range the decoding operation either returns an error (throws exception) or else the decoded object plus the number of bytes after ptr that contain the object, and it does so without making any allocations or copies. It will probably be easier to be consistently allocation free in machine generated code, so the two goals of the redesign seem to reinforce each other. Longer View (Future Major Release) ---------------------------------------- Eventually (currently estimated for summer 2019), Botan 3.x will be released. This schedule allows some substantial time with Botan 2.x and 3.x supported simultaneously, to allow for application switch over. This version will adopt C++17 and use new std types such as string_view, optional, and any, along with adopting memory span and guarded integer types. Likely C++17 constexpr will also be leveraged. In this future 3.x release, all deprecated features/APIs of 2.x will be removed. However outside of that, breaking API changes should be relatively minimal. botan-2.4.0/doc/security.rst000066400000000000000000000307601322470703100157730ustar00rootroot00000000000000 .. highlight:: none Security Advisories ======================================== If you think you have found a security bug in Botan please contact Jack Lloyd (jack@randombit.net). If you would like to encrypt your mail please use:: pub rsa3072/57123B60 2015-03-23 Key fingerprint = 4E60 C735 51AF 2188 DF0A 5A62 78E9 8043 5712 3B60 uid Jack Lloyd This key can be found in the file ``doc/pgpkey.txt`` or online at https://keybase.io/jacklloyd and on most PGP keyservers. 2017 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * 2017-10-02 (CVE-2017-14737): Potential side channel using cache information In the Montgomery exponentiation code, a table of precomputed values is used. An attacker able to analyze which cache lines were accessed (perhaps via an active attack such as Prime+Probe) could recover information about the exponent. Identified in "CacheD: Identifying Cache-Based Timing Channels in Production Software" by Wang, Wang, Liu, Zhang, and Wu (Usenix Security 2017). Fixed in 1.10.17 and 2.3.0, all prior versions affected. * 2017-07-16: Failure to fully zeroize memory before free The secure_allocator type attempts to zeroize memory before freeing it. Due to a error sometimes only a portion of the memory would be zeroed, because of a confusion between the number of elements vs the number of bytes that those elements use. So byte vectors would always be fully zeroed (since the two notions result in the same value), but for example with an array of 32-bit integers, only the first 1/4 of the elements would be zeroed before being deallocated. This may result in information leakage, if an attacker can access memory on the heap. Reported by Roman Pozlevich. Bug introduced in 1.11.10, fixed in 2.2.0 * 2017-04-04 (CVE-2017-2801): Incorrect comparison in X.509 DN strings Botan's implementation of X.509 name comparisons had a flaw which could result in an out of bound memory read while processing a specially formed DN. This could potentially be exploited for information disclosure or denial of service, or result in incorrect validation results. Found independently by Aleksandar Nikolic of Cisco Talos, and OSS-Fuzz automated fuzzing infrastructure. Bug introduced in 1.6.0 or earlier, fixed in 2.1.0 and 1.10.16 * 2017-03-23 (CVE-2017-7252): Incorrect bcrypt computation Botan's implementation of bcrypt password hashing scheme truncated long passwords at 56 characters, instead of at bcrypt's standard 72 characters limit. Passwords with lengths between these two bounds could be cracked more easily than should be the case due to the final password bytes being ignored. Found and reported by Solar Designer. Bug introduced in 1.11.0, fixed in 2.1.0. 2016 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * 2016-11-27 (CVE-2016-9132) Integer overflow in BER decoder While decoding BER length fields, an integer overflow could occur. This could occur while parsing untrusted inputs such as X.509 certificates. The overflow does not seem to lead to any obviously exploitable condition, but exploitation cannot be positively ruled out. Only 32-bit platforms are likely affected; to cause an overflow on 64-bit the parsed data would have to be many gigabytes. Bug found by Falko Strenzke, cryptosource GmbH. Fixed in 1.10.14 and 1.11.34, all prior versions affected. * 2016-10-26 (CVE-2016-8871) OAEP side channel A side channel in OAEP decoding could be used to distinguish RSA ciphertexts that did or did not have a leading 0 byte. For an attacker capable of precisely measuring the time taken for OAEP decoding, this could be used as an oracle allowing decryption of arbitrary RSA ciphertexts. Remote exploitation seems difficult as OAEP decoding is always paired with RSA decryption, which takes substantially more (and variable) time, and so will tend to mask the timing channel. This attack does seems well within reach of a local attacker capable of a cache or branch predictor based side channel attack. Finding, analysis, and patch by Juraj Somorovsky. Introduced in 1.11.29, fixed in 1.11.33 * 2016-08-30 (CVE-2016-6878) Undefined behavior in Curve25519 On systems without a native 128-bit integer type, the Curve25519 code invoked undefined behavior. This was known to produce incorrect results on 32-bit ARM when compiled by Clang. Introduced in 1.11.12, fixed in 1.11.31 * 2016-08-30 (CVE-2016-6879) Bad result from X509_Certificate::allowed_usage If allowed_usage was called with more than one Key_Usage set in the enum value, the function would return true if *any* of the allowed usages were set, instead of if *all* of the allowed usages are set. This could be used to bypass an application key usage check. Credit to Daniel Neus of Rohde & Schwarz Cybersecurity for finding this issue. Introduced in 1.11.0, fixed in 1.11.31 * 2016-03-17 (CVE-2016-2849): ECDSA side channel ECDSA (and DSA) signature algorithms perform a modular inverse on the signature nonce `k`. The modular inverse algorithm used had input dependent loops, and it is possible a side channel attack could recover sufficient information about the nonce to eventually recover the ECDSA secret key. Found by Sean Devlin. Introduced in 1.7.15, fixed in 1.10.13 and 1.11.29 * 2016-03-17 (CVE-2016-2850): Failure to enforce TLS policy TLS v1.2 allows negotiating which signature algorithms and hash functions each side is willing to accept. However received signatures were not actually checked against the specified policy. This had the effect of allowing a server to use an MD5 or SHA-1 signature, even though the default policy prohibits it. The same issue affected client cert authentication. The TLS client also failed to verify that the ECC curve the server chose to use was one which was acceptable by the client policy. Introduced in 1.11.0, fixed in 1.11.29 * 2016-02-01 (CVE-2016-2196): Overwrite in P-521 reduction The P-521 reduction function would overwrite zero to one word following the allocated block. This could potentially result in remote code execution or a crash. Found with AFL Introduced in 1.11.10, fixed in 1.11.27 * 2016-02-01 (CVE-2016-2195): Heap overflow on invalid ECC point The PointGFp constructor did not check that the affine coordinate arguments were less than the prime, but then in curve multiplication assumed that both arguments if multiplied would fit into an integer twice the size of the prime. The bigint_mul and bigint_sqr functions received the size of the output buffer, but only used it to dispatch to a faster algorithm in cases where there was sufficient output space to call an unrolled multiplication function. The result is a heap overflow accessible via ECC point decoding, which accepted untrusted inputs. This is likely exploitable for remote code execution. On systems which use the mlock pool allocator, it would allow an attacker to overwrite memory held in secure_vector objects. After this point the write will hit the guard page at the end of the mmap'ed region so it probably could not be used for code execution directly, but would allow overwriting adjacent key material. Found by Alex Gaynor fuzzing with AFL Introduced in 1.9.18, fixed in 1.11.27 and 1.10.11 * 2016-02-01 (CVE-2016-2194): Infinite loop in modular square root algorithm The ressol function implements the Tonelli-Shanks algorithm for finding square roots could be sent into a nearly infinite loop due to a misplaced conditional check. This could occur if a composite modulus is provided, as this algorithm is only defined for primes. This function is exposed to attacker controlled input via the OS2ECP function during ECC point decompression. Found by AFL Introduced in 1.7.15, fixed in 1.11.27 and 1.10.11 2015 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * 2015-11-04: TLS certificate authentication bypass When the bugs affecting X.509 path validation were fixed in 1.11.22, a check in Credentials_Manager::verify_certificate_chain was accidentally removed which caused path validation failures not to be signaled to the TLS layer. So for affected versions, certificate authentication in TLS is bypassed. As a workaround, applications can override the call and implement the correct check. Reported by Florent Le Coz in GH #324 Introduced in 1.11.22, fixed in 1.11.24 * 2015-10-26 (CVE-2015-7824): Padding oracle attack on TLS A padding oracle attack was possible against TLS CBC ciphersuites because if a certain length check on the packet fields failed, a different alert type than one used for message authentication failure would be returned to the sender. This check triggering would leak information about the value of the padding bytes and could be used to perform iterative decryption. As with most such oracle attacks, the danger depends on the underlying protocol - HTTP servers are particularly vulnerable. The current analysis suggests that to exploit it an attacker would first have to guess several bytes of plaintext, but again this is quite possible in many situations including HTTP. Found in a review by Sirrix AG and 3curity GmbH. Introduced in 1.11.0, fixed in 1.11.22 * 2015-10-26 (CVE-2015-7825): Infinite loop during certificate path validation When evaluating a certificate path, if a loop in the certificate chain was encountered (for instance where C1 certifies C2, which certifies C1) an infinite loop would occur eventually resulting in memory exhaustion. Found in a review by Sirrix AG and 3curity GmbH. Introduced in 1.11.6, fixed in 1.11.22 * 2015-10-26 (CVE-2015-7826): Acceptance of invalid certificate names RFC 6125 specifies how to match a X.509v3 certificate against a DNS name for application usage. Otherwise valid certificates using wildcards would be accepted as matching certain hostnames that should they should not according to RFC 6125. For example a certificate issued for ``*.example.com`` should match ``foo.example.com`` but not ``example.com`` or ``bar.foo.example.com``. Previously Botan would accept such a certificate as also valid for ``bar.foo.example.com``. RFC 6125 also requires that when matching a X.509 certificate against a DNS name, the CN entry is only compared if no subjectAlternativeName entry is available. Previously X509_Certificate::matches_dns_name would always check both names. Found in a review by Sirrix AG and 3curity GmbH. Introduced in 1.11.0, fixed in 1.11.22 * 2015-10-26 (CVE-2015-7827): PKCS #1 v1.5 decoding was not constant time During RSA decryption, how long decoding of PKCS #1 v1.5 padding took was input dependent. If these differences could be measured by an attacker, it could be used to mount a Bleichenbacher million-message attack. PKCS #1 v1.5 decoding has been rewritten to use a sequence of operations which do not contain any input-dependent indexes or jumps. Notations for checking constant time blocks with ctgrind (https://github.com/agl/ctgrind) were added to PKCS #1 decoding among other areas. Found in a review by Sirrix AG and 3curity GmbH. Fixed in 1.11.22 and 1.10.13. Affected all previous versions. * 2015-08-03 (CVE-2015-5726): Crash in BER decoder The BER decoder would crash due to reading from offset 0 of an empty vector if it encountered a BIT STRING which did not contain any data at all. This can be used to easily crash applications reading untrusted ASN.1 data, but does not seem exploitable for code execution. Found with afl. Fixed in 1.11.19 and 1.10.10, affected all previous versions of 1.10 and 1.11 * 2015-08-03 (CVE-2015-5727): Excess memory allocation in BER decoder The BER decoder would allocate a fairly arbitrary amount of memory in a length field, even if there was no chance the read request would succeed. This might cause the process to run out of memory or invoke the OOM killer. Found with afl. Fixed in 1.11.19 and 1.10.10, affected all previous versions of 1.10 and 1.11 2014 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * 2014-04-10 (CVE-2014-9742): Insufficient randomness in Miller-Rabin primality check A bug in the Miller-Rabin primality test resulted in only a single random base being used instead of a sequence of such bases. This increased the probability that a non-prime would be accepted by is_prime or that a randomly generated prime might actually be composite. The probability of a random 1024 bit number being incorrectly classed as prime with a single base is around 2^-40. Reported by Jeff Marrison. Introduced in 1.8.3, fixed in 1.10.8 and 1.11.9 botan-2.4.0/doc/todo.rst000066400000000000000000000146621322470703100150740ustar00rootroot00000000000000Projects ======================================== Feel free to take one of these on if it interests you. Before starting out on something, send an email to the dev list or open a discussion ticket on GitHub to make sure you're on the right track. Request a new feature by opening a pull request to update this file. Ciphers, Hashes, PBKDF ---------------------------------------- * Bitsliced AES or Camellia * Compressed tables for AES * AES using vector permutes for NEON or AltiVec * Camellia using AES-NI * Serpent using AVX2 or SSSE3/pshufb * ChaCha20 using AVX2, NEON * XSalsa20-Poly1305 AEAD compatible with NaCl * ASCON 1.2 (CAESAR) * NORX-64 3.0 (CAESAR) * scrypt PBKDF * Argon2 PBKDF (draft-irtf-cfrg-argon2) * bcrypt PBKDF * Skein-MAC * PMAC * Extend Cascade_Cipher to support arbitrary number of ciphers * EME* tweakable block cipher (https://eprint.iacr.org/2004/125.pdf) Public Key Crypto, Math ---------------------------------------- * Curves for pairings (BN-256 is widely implemented) * Identity based encryption * BBS group signatures * Paillier homomorphic cryptosystem * Hashing onto an elliptic curve * SPHINCS-256 * X448 and Ed448 * FHMQV * Use GLV decomposition to speed up secp256k1 operations * Support mixed hashes and non-empty param strings in OAEP * wNAF ECC point multiply * Recover ECDSA public key from signature/message pair (GH #664) * Fast new implementations/algorithms for ECC point operations, Montgomery multiplication, multi-exponentiation, ... * Some PK operations, especially RSA, have extensive computations per operation setup but many of the computed values depend only on the key and could be shared across operation objects. Utility Functions ------------------ * base58 and base32 encoding Multiparty Protocols ---------------------- * Distributed key generation for DL, RSA * Threshold signing, decryption * Socialist Millionaires Protocol External Providers, Hardware Support ---------------------------------------- * Access to system certificate stores (Windows, OS X) * Extend OpenSSL provider (DH, HMAC, CMAC, GCM) * Support using BoringSSL instead of OpenSSL or LibreSSL * /dev/crypto provider (ciphers, hashes) * Windows CryptoAPI provider (ciphers, hashes, RSA) * Apple CommonCrypto * POWER8 crypto extensions (AES, SHA-2) * Better TPM support: NVRAM, PCR measurements, sealing * Intel SGX support TLS ---------------------------------------- * Make DTLS support optional at build time * Improve/optimize DTLS defragmentation and retransmission * Implement logging callbacks for TLS * Make TLS v1.0 and v1.1 optional at build time * Make RSA optional at build time * Make finite field DH optional at build time * TLS OCSP stapling (RFC 6066) * Authentication using TOFU (sqlite3 storage) * Certificate pinning (using TACK?) * Certificate Transparency * TLS supplemental authorization data (RFC 4680, RFC 5878) * OpenPGP authentication (RFC 5081) * DTLS-SCTP (RFC 6083) * Perspectives (http://perspectives-project.org/) * Support for server key stored in TPM or PKCS #11 PKIX ---------------------------------------- * Further tests of validation API (see GH #785) * Test suite for validation of 'real world' cert chains (GH #611) * Improve output of X509_Certificate::to_string This is a free-form string for human consumption so the only constraints are being informative and concise. (GH #656) * X.509 policy constraints * OCSP responder logic * X.509 attribute certificates (RFC 5755) * Support generating/verifying XMSS certificates * Roughtime client (https://roughtime.googlesource.com/roughtime/) New Protocols / Formats ---------------------------------------- * PKCS7 / Cryptographic Message Syntax * NaCl compatible cryptobox functions * Off-The-Record v3 https://otr.cypherpunks.ca/ * Some useful subset of OpenPGP - Subset #1: symmetrically encrypted files Not aiming to process arbitrary OpenPGP, but rather produce something that happens to be readable by `gpg` and is relatively simple to process for decryption. Require a 128-bit block cipher and MDC packet. - Subset #2: Process OpenPGP public keys - Subset #3: Verification of OpenPGP signatures Cleanups ----------- * Split test_ffi.cpp into multiple files Compat Headers ---------------- * Write an OpenSSL-compatible TLS API stub so existing applications can be converted more easily. Would require some networking code since the OpenSSL API handles both crypto and IO. Use Asio, since it is expected to be the base of future C++ standard network library. * Write a module exposing a NaCl/libsodium compatible API header. FFI and Bindings ---------------------------------------- * Expose compression * Expose more of X.509 (CRLs, OCSP, cert signing, etc) * Expose TLS * Write a CLI or HTTPS client in Python Library Infrastructure ---------------------------------------- * Guarded integer type to prevent overflow bugs * Add logging callbacks * Add latency tracing framework Build/Test ---------------------------------------- * Create Docker image for Travis that runs 16.04 and has all the tools we need pre-installed. * Build/export Windows installer exe on AppVeyor * Code signing for Windows installers * Test runner python script that captures backtraces and other debug info during CI * Run the TPM tests against an emulator (https://github.com/PeterHuewe/tpm-emulator) * Add clang-tidy, clang-analyzer, cppcheck to CI FIPS 140 Build --------------------------------------- * Special build policy that disables all builtin crypto impls, then provides new FIPS 140 versions implemented using just calls to the OpenSSL FIPS module API plus wrapping the appropriate functions for self-tests and so on. This creates a library in FIPS 140 validated form (since there is no 'crypto' anymore from Botan, just the ASN.1 parser, TLS library, PKI etc all of which FIPS 140 does not care about) without the enourmous hassle and expense of actually having to maintain a FIPS validation on Botan. Email Jack if you are interested in this. CLI ---------------------------------------- * Change `tls_server` to be a tty<->socket app, like `tls_client` is, instead of a bogus echo server. * `encrypt` / `decrypt` tools providing password and/or public key based file encryption * Make help output more helpful Documentation ---------------------------------------- * X.509 certs, path validation * Specific docs covering one major topic (RSA, ECDSA, AES/GCM, ...) * Some howto style docs (setting up CA, ...) Packaging ------------ * Create a PPA for Ubuntu botan-2.4.0/license.txt000066400000000000000000000024371322470703100150100ustar00rootroot00000000000000Copyright (C) 1999-2018 The Botan Authors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. botan-2.4.0/news.rst000066400000000000000000006433671322470703100143500ustar00rootroot00000000000000Release Notes ======================================== Version 2.4.0, 2018-01-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Several build improvements requested by downstream packagers, including the ability to disable building the static library. All makefile constructs that were specific to nmake or GNU make have been eliminated, thus the option ``--makefile-style`` which was previously used to select the makefile type has also been removed. (GH #1230 #1237 #1300 #1318 #1319 #1324 #1325 #1346) * Support for negotiating the DH group as specified in RFC 7919 is now available in TLS (GH #1263) * Support for ARIA-GCM ciphersuites are now available in TLS. They are disabled by default. (GH #1284) * Add support for generating and verifying X.509 objects (certificates, CRLs, etc) using RSA-PSS signatures (GH #1270 and #1368) * Add support for AES key wrapping with padding, as specified in RFC 5649 and NIST SP 800-38F (GH #1301) * OCSP requests made during certificate verification had the potential to hang forever. Now the sockets are non-blocking and a timeout is enforced. (GH #1360 fixing GH #1326) * Add ``Public_Key::fingerprint_public`` which allows fingerprinting the public key. The previously available ``Private_Key::fingerprint`` is deprecated, now ``Private_Key::fingerprint_private`` should be used if this is required. (GH #1357) * ECC certificates generated by Botan used an invalid encoding for the parameters field, which was rejected by some certificate validation libraries notably BouncyCastle. (GH #1367) * Loading an ECC key which used OID encoding for the domain parameters, then saving it, would result in a key using the explicit parameters encoding. Now the OID encoding is retained. (GH #1365) * Correct various problems in certificate path validation that arose when multiple paths could be constructed leading to a trusted root but due to other constraints only some of them validated. (GH #1363) * It is now possible for certificate validation to return warning indicators, such as that the distinguished name is not within allowed limits or that a certificate with a negative serial number was observed. (GH #1363 #1359) * XMSS signatures now are multi-threaded for improved performance (GH #1267) * Fix a bug that caused the TLS peer cert list to be empty on a resumed session. (GH #1303 #1342) * Increase the maximum HMAC key length from 512 bytes to 4096 bytes. This allows using a DH key exchange in TLS with a group greater than 4096 bits. (GH #1316) * Fix a bug in the TLS server where, on receiving an SSLv3 client hello, it would attempt to negotiate TLS v1.2. Now a protocol_version alert is sent. Found with tlsfuzzer. (GH #1316) * Fix several bugs related to sending the wrong TLS alert type in various error scenarios, caught with tlsfuzzer. * Add support for a ``tls_http_server`` command line utility which responds to simple GET requests. This is useful for testing against a browser, or various TLS test tools which expect the underlying protocol to be HTTP. (GH #1315) * Add an interface for generic PSK data stores, as well as an implementation which encrypts stored values with AES key wrapping. (GH #1302) * Optimize GCM mode on systems both with and without carryless multiply support. This includes a new base case implementation (still constant time), a new SSSE3 implementation for systems with SSSE3 but not clmul, and better algorithms for systems with clmul and pmull. (GH #1253 #1263) * Various optimizations for OCB, CFB, CTR, SM3, SM4, GMAC, BLAKE2b, Blowfish, Twofish, CAST-128, and CRC24 (GH #1281) * Salsa20 now supports the seek operation. * Add ``EC_Group::known_named_groups`` (GH #1339) * Symmetric algorithms (block ciphers, stream ciphers, MACs) now verify that a key was set before accepting data. Previously attempting to use an unkeyed object would instead result in either a crash or invalid outputs. (GH #1279) * The X509 certificate, CRL and PKCS10 types have been heavily refactored internally. Previously all data of these types was serialized to strings, then in the event a more complicated data structure (such as X509_DN) was needed, it would be recreated from the string representation. However the round trip process was not perfect and could cause fields to become lost. This approach is no longer used, fixing several bugs (GH #1010 #1089 #1242 #1252). The internal data is now stored in a ``shared_ptr``, so copying such objects is now very cheap. (GH #884) * ASN.1 string objects previously held their contents as ISO 8859-1 codepoints. However this led to certificates which contained strings outside of this character set (eg in Cyrillic, Greek, or Chinese) being rejected. Now the strings are always converted to UTF-8, which allows representing any character. In addition, UCS-4 strings are now supported. (GH #1113 #1250 #1287 #1289) * It is now possible to create an uninitialized X509_Certificate object. Such an object will throw if any attempt to access its members is made. (GH #1335) * In BER decoder, avoid unbounded stack recursion when parsing nested indefinite length values. Now at most 16 nested indefinite length values are accepted, anything deeper resulting in a decoding error. (GH #1304 OSS-Fuzz 4353). * A new ASN.1 printer API allows generating a string representation of arbitrary BER data. This is used in the ``asn1print`` command line utility and may be useful in other applications, for instance for debugging. * New functions for bit rotations that distinguish rotating by a compile-time constant vs a runtime variable rotation. This allows better optimizations in both cases. Notably performance of CAST-128 and CAST-256 are substantially improved. (GH #1247) * TLS CBC ciphersuites now are implemented using the standard CBC code, instead of reimplementing CBC inside the TLS stack. This allows for parallel decryption of TLS CBC ciphertexts, and improves performance especially when using AES hardware support. (GH #1269) * Add callbacks to make it possible for an application using TLS to provide custom implementations of signature schemes, eg when offloading the computations to another device. (GH #1332) * Use a direct calculation for calendar computations instead of relying on non-portable operating system interfaces. (GH #1336) * Fix a bug in the amalgamation generation which could cause build failures on some systems including macOS. (GH #1264 #1265) * A particular code sequence in TLS handshake would always (with an ECC ciphersuite) result in an exception being thrown and then caught. This has changed so no exception is thrown. (GH #1275) * The code for byteswapping has been improved for ARMv7 and for Windows x86-64 systems using MSVC. (GH #1274) * The GMAC class no longer derives from GHASH. This should not cause any noticeable change for applications. (GH #1253) * The base implementation of AES now uses a single 4K table, instead of 4 such tables. This offers a significant improvement against cache-based side channels without hurting performance too much. In addition the table is now guaranteed to be aligned on a cache line, which ensures the additional countermeasure of reading each cache line works as expected. (GH #1255) * In TLS client resumption, avoid sending a OCSP stapling request. This caused resumption failures with some servers. (GH #1276) * The overhead of making a call through the FFI layer has been reduced. * The IDs for SHA-3 PKCSv1.5 signatures added in 2.3.0 were incorrect. They have been changed to use the correct encoding, and a test added to ensure such errors do not recur. * Counter mode allows setting a configurable width of the counter. Previously it was allowed for a counter of even 8 bits wide, which would mean the keystream would repeat after just 256 blocks. Now it requires the width be at least 32 bits. The only way this feature could be used was by manually constructing a ``CTR_BE`` object and setting the second parameter to something in the range of 1 to 3. * A new mechanism for formatting ASN.1 data is included in ``asn1_print.h``. This is the same functionality used by the command line ``asn1print`` util, now cleaned up and moved to the library. * Add ``Pipe::append_filter``. This is like the existing (deprecated) ``Pipe::append``, the difference being that ``append_filter`` only allows modification before the first call to ``start_msg``. (GH #1306 #1307) * The size of ASN1_Tag is increased to 32 bits. This avoids a problem with UbSan (GH #751) * Fix a bug affecting bzip2 compression. In certain circumstances, compression would fail with ``BZ_SEQUENCE_ERROR`` due to calling bzlib in an way it does not support. (GH #1308 #1309) * In 2.3.0, final annotations were added to many classes including the TLS policies (like ``Strict_Policy`` and ``BSI_TR_02102_2``). However it is reasonable and useful for an application to derive from one of these policies, so as to create an application specific policy that is based on a library-provided policy, but with a few tweaks. So the final annotations have been removed on these classes. (GH #1292) * A new option ``--with-pdf`` enables building a PDF copy of the handbook. (GH #1337) * A new option ``--with-rst2man`` enables building a man page for the command line util using Docutils rst2man. (GH #1349) * Support for NEON is now enabled under Clang. * Now the compiler version is detected using the preprocessor, instead of trying to parse the output of the compiler's version string, which was subject to problems with localization. (GH #1358) * By default the gzip compressor will not include a timestamp in the header. The timestamp can be set by passing it to the ``Gzip_Compression`` constructor. * Resolve a performance regression on Windows involving the system stats entropy source. (GH #1369) * Add an OID for RIPEMD-160 * Fixes for CMake build (GH #1251) * Avoid some signed overflow warnings (GH #1220 #1245) * As upstream support for Native Client has been deprecated by Google, support is now also deprecated in Botan and will be removed in a future release. * The Perl-XS wrapper has not been maintained in many years. It is now deprecated, and if no attempts are made to revive it, it will be removed in a future release. * Support for building on IRIX has been removed. Version 2.3.0, 2017-10-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Address a side channel affecting modular exponentiation. An attacker capable of a local or cross-VM cache analysis attack may be able to recover bits of secret exponents as used in RSA, DH, etc. CVE-2017-14737 * Add the SHACAL2 block cipher, including optimizations using SIMD and SHA-NI instructions. (GH #1151) * Add the ARIA block cipher (GH #1004 and #1157) * Add support for the ARMv8 AES instructions (GH #1182 and #1146) * Add support for the ARMv8 PMULL instruction (GH #1181 and #842) * On macOS and iOS the ``System_RNG`` class is now implemented using ``arc4random``. Previously the system RNG class was not available on iOS. (GH #1219) * Optimized the CMAC polynomial doubling operation, and removed a small timing channel due to a conditional operation. * Added support for the ECDHE_PSK AEAD TLS ciphersuites from draft-ietf-tls-ecdhe-psk-aead-05. * SM2 encryption and signature schemes were previously hardcoded to use SM3 hash, now any hash is allowed. (GH #1188) * SM2 encryption in 2.2.0 followed an obsolete version of the standard. The format of the ciphertext changed in a more recent revision of the standard, and now uses an ASN.1 encoding. Botan has changed to reflect this format, which is compatible with GmSSL (GH #1218) * OCB mode now supports 192, 256 and 512 bit block ciphers. (GH #1205) * XTS mode now supports 256-bit and 512-bit block ciphers. * Add ids to allow SHA-3 signatures with PKCSv1.5 (GH #1184) * Add support for ``PSSR_Raw`` signatures which PSS sign an externally derived hash. (GH #1212 #1211) * GCM now supports truncated tags in the range 96...128 bits. GCM had previously supported 64-bit truncated tags, but these are known to be insecure and are now deprecated. (GH #1210 #1207) * Add a new TLS policy hook ``allow_client_initiated_renegotiation`` which is the parallel of the existing ``allow_server_initiated_renegotiation``. If set to false, servers will reject attempts by the client to renegotiation the session, instead sending a ``no_renegotiation`` warning alert. Note that the default is ``false``, ie that client renegotiation is now prohibited by default. (GH #872) * Add HKDF-Expand-Label function which is used in TLS v1.3 and QUIC protocols. (GH #1226) * Fix decoding of ECC keys that use extensions from RFC 5915 (GH #1208) * The entropy source that called CryptGenRandom has been removed, and replaced by a version which invokes the system PRNG, which may be CryptGenRandom or some other source. (GH #1180) * Add support for gathering entropy using the Crypt-NG BCryptGenRandom API. This is necessary to build for Windows Phone/Windows Store. (GH #1180) * Extend "Raw" signature padding (which allows signing a hash computed externally) to optionally take a hash function name. In this case, it will be verified that the input matches the expected hash size. This also will control the hash algorithm used for RFC 6979 deterministic nonces; previously SHA-512 was always used for RFC 6979 nonces with "Raw". (GH #1153) * The advertised FFI API version has increased. This should have happened already in 2.2 but was neglected. The ``botan_ffi_supports_api`` call will return true for either the current or older versions of the API version since no backwards incompatible changes have occurred. * Add new C89 API functions ``botan_hex_decode``, ``botan_base64_encode``, ``botan_base64_decode``, ``botan_constant_time_compare``. * Add new C89 API functions ``botan_privkey_load_dh``, ``botan_pubkey_load_dh``, and ``botan_privkey_create_dh`` (GH #1155) * Add ``is_passhash9_alg_supported`` (GH #1154) * The ``power_mod`` function now supports negative bases (GH #1179 #1168) * Add a new command line utility for examining TLS client hellos. * Added a new target for LLVM bitcode (GH #1169) * Improve support for Windows Phone (GH #1180 #796 #794) * Correct return value of ``botan_pk_op_verify_finish``. In 2.2.0 this function returned -1 on invalid signature, instead of 1 which was used in 2.0, 2.1, and now again in 2.3. (GH #1189 #1187) * Allow loading unencrypted private keys via FFI API (GH #1197) * Add new command line options ``--rng-type=drbg`` and ``--drbg-seed`` which allow running commands with a deterministic RNG. (GH #1169) * Fix a number of warnings seen under Visual C++ (GH #1171 #795) * Workaround a GCC 7 bug that caused miscompilation of the GOST-34.11 hash function on x86-32. (GH #882 #1148) * Fix a bug in SIMD_4x32 which affected little-endian PowerPC processors. This would cause test failures for Serpent, among other problems. * Fix Altivec runtime detection, which was broken starting in Botan 2.1.0 * Optimized the verification of TLS CBC padding bytes. Previously the check examined every byte of the record, even though at most 256 bytes of padding may be appended. (GH #1227) * Simplified definition of ``Botan::secure_allocator``. In particular, not defining the ``construct`` and ``destroy`` methods avoids a performance problem under MSVC. (GH #1228 and #1229) * The ``secure_allocator`` class now uses ``calloc`` and ``free`` instead of ``new`` and ``delete``. In addition the actual allocation operation is hidden inside of compiled functions, which significantly reduces code size. (GH #1231) * The ``secure_scrub_memory`` function now uses ``explicit_bzero`` on OpenBSD. * Previously ARM feature detection (NEON, AES, ...) relied on getauxval, which is only supported on Linux and Android. Now iOS is supported, by checking the model name/version and matching it against known versions. Unfortunately this is the best available technique on iOS. On Aarch64 systems that are not iOS or Linux/Android, a technique based on trial execution while catching SIGILL is used. (GH #1213) * The output of ``botan config libs`` was incorrect, it produced ``-lbotan-2.X`` where X is the minor version, instead of the actual lib name ``-lbotan-2``. * Add ``constant_time_compare`` as better named equivalent of ``same_mem``. * Silence a Clang warning in ``create_private_key`` (GH #1150) * The fuzzers have been better integrated with the main build. See the handbook for details. (GH #1158) * The Travis CI and AppVeyor CI builds are now run via a Python script. This makes it easier to replicate the behavior of the CI build locally. Also a number of changes were made to improve the turnaround time of CI builds. (GH #1162 #1199) * Add support for Win32 filesystem operation, so the tests pass completely on MinGW now (GH #1203) * Added a script to automate running TLS-Attacker tests. * The distribution script now creates reproducible outputs, by forcing all modification times, uids, etc to values fixed by the release date. (GH #1217) * The ``BOTAN_DLL`` macro has been split up into ``BOTAN_PUBLIC_API``, ``BOTAN_UNSTABLE_API`` and ``BOTAN_TEST_API`` which allows indicating in the header the API stability of the export. All three are defined as ``BOTAN_DLL`` so overriding just that macro continues to work as before. (GH #1216) * Optimize ``bigint_divop`` when a double-word type is available. (GH #494) * Fix several memory leaks in the tests. Additionally a false positive leak seen under ``valgrind`` in the ``fork`` tests for the RNG was resolved. * Export ``CurveGFp_Repr`` type (only used internally) to resolve a long standing UBSan warning. (GH #453) * Now ``-fstack-protector`` and similar flags that affect linking are exported in ``botan config ldflags`` as they already were in the ``pkg-config`` output. (GH #863) * Remove double underscore in header guards to avoid using names reserved by ISO C++. (GH #512) * Additions to the SRP documentation (GH #1029) * The package transform (in ``package.h``) is now deprecated, and will be removed in a future release. (GH #1215) * Add more tests for the const-time utils (GH #1214) * Fix a bug in FFI tests that caused the test files not to be found when using ``--data-dir`` option (GH #1149) * C++ ``final`` annotations have been added to classes which are not intended for derivation. This keyword was already in use but was not applied consistently. * A typedef ``SecureVector`` has been added for the ``secure_vector`` type. This makes porting code from 1.10 to 2.x API slightly simpler. * Header files have been cleaned up to remove unnecessary inclusions. In some cases it may be required to include additional botan headers to get all the declarations that were previously visible. For example, ``bigint.h`` no longer includes ``rng.h``, but just forward declares ``RandomNumberGenerator``. * Improved support for IBM xlc compiler. Version 1.10.17, 2017-10-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Address a side channel affecting modular exponentiation. An attacker capable of a local or cross-VM cache analysis attack may be able to recover bits of secret exponents as used in RSA, DH, etc. CVE-2017-14737 * Workaround a miscompilation bug in GCC 7 on x86-32 affecting GOST-34.11 hash function. (GH #1192 #1148 #882) * Add SecureVector::data() function which returns the start of the buffer. This makes it slightly simpler to support both 1.10 and 2.x APIs in the same codebase. * When compiled by a C++11 (or later) compiler, a template typedef of SecureVector, secure_vector, is added. In 2.x this class is a std::vector with a custom allocator, so has a somewhat different interface than SecureVector in 1.10. But this makes it slightly simpler to support both 1.10 and 2.x APIs in the same codebase. * Fix a bug that prevented `configure.py` from running under Python3 * Botan 1.10.x does not support the OpenSSL 1.1 API. Now the build will `#error` if OpenSSL 1.1 is detected. Avoid `--with-openssl` if compiling against 1.1 or later. (GH #753) * Import patches from Debian adding basic support for building on aarch64, ppc64le, or1k, and mipsn32 platforms. Version 2.2.0, 2017-08-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add the Ed25519 signature scheme (GH #1066) * The format of x25519 keys, which previously used a non-standard encoding, has changed to match the upcoming IETF specification. (GH #1076) * Add the SM2 signature scheme (GH #1082) * Add the SM2 public key encryption scheme (GH #1142) * Add the SM3 hash function (GH #996) * Add the Streebog (GOST R 34.11-2012) hash function (GH #1114) * Add the SM4 block cipher (GH #1080) * Add the PGP S2K algorithm (GH #1060) * Add SP 800-56A KDF (GH #1040) * Add ChaCha_RNG which is a very fast and completely non-standard random bit generator (GH #1137) * Add support for SHA-1 and SHA-2 instructions added in Intel Goldmont (GH #826) * Add support for SHA-1 and SHA-2 instructions added in ARMv8 (GH #844) * Add support for HOTP (RFC 4226) and TOTP (RFC 6238) one-time-password algorithms (GH #1054) * Fix a bug that caused secure_allocator to not fully zeroize blocks when sizeof(T) was greater than 1. * Add HashFunction::copy_state which allows efficiently computing the hash of several messages with a common prefix (GH #1056 #1037) * ECC keys now encode their parameters using an OID instead of a literal encoding of the domain parameters. This will lead to smaller public and private keys in most instances. (GH #1093) * The OpenSSL backend now supports the 1.1.0 API (GH #1056) * Add a preliminary provider using BearSSL, currently EC and hashes supported (GH #1094) * Fix a bug in certificate path length checking that could cause valid chains to be rejected. (GH #1053) * It is possible for CBC, CFB, and stream ciphers to carry over the nonce from the previous message, which is needed by some applications. This worked in 1.10 but broke in 2.0. (GH #1044 fixing GH #864) * Avoid recursion in BER_Decoder::get_next_object which could cause stack exhaustion. (GH #989) * Fix missing flush in DataSink_Stream::end_msg. (GH #972 fixing GH #972) * Allow to seek in the big endian counter mode of operation (GH #999) * Support loading ElGamal keys through FFI interface (GH #1008) * Support Windows sockets in ``http_util`` (allowing OCSP checks on Windows), as well as in the TLS command line utils (GH #1138). * The ``--destdir`` flag to ``configure.py`` has been removed. Instead use the ``DESTDIR`` environment variable at install time. This change was done to more closely match how autoconf handles this case. (GH #1139 #1111 #997 #996). * Many changes to configure.py and botan2.py to make them pylint clean (GH #1041 #1002 #984) * Add command line utils ``hmac`` (GH #1001), ``encryption`` (GH #359), ``hex_enc``, and ``hex_dec``. * Fix an error in ``sign_cert`` command line util, which ignored the ``--ca-key-pass`` option. (GH #1106) * The ``speed`` util can now benchmark multiple buffer sizes (GH #1084) * Fix return value of FFI botan_bcrypt_is_valid (GH #1033) * Support generating RSA keys using OpenSSL (GH #1035) * Add new FFI functions botan_hash_block_size (GH #1036), botan_hash_copy_state (GH #1059), botan_scrub_mem * Add support for RFC 3394 keywrap through FFI (GH #1135) * Support AES-CBC ciphers via OpenSSL (GH #1022) * Add function to return certificates included in OCSP response (GH #1123) * Complete wildcard handling for X.509 certificates (GH #1017) * Add some missing functions to TLS::Text_Policy (GH #1023) * It was previously possible to use ``--single-amalgamation-file`` without ``--amalgamation``, though it did not do anything useful. Now ``--single-amalgamation-file`` requires ``--amalgamation`` also be set on the command line. Version 2.1.0, 2017-04-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix incorrect truncation in Bcrypt. Passwords in length between 56 and 72 characters were truncated at 56 characters. Found and reported by Solar Designer. (CVE-2017-7252) (GH #938) * Fix a bug in X509 DN string comparisons that could result in out of bound reads. This could result in information leakage, denial of service, or potentially incorrect certificate validation results. Found independently by Cisco Talos team and OSS-Fuzz. (CVE-2017-2801) * Correct minimum work factor for Bcrypt password hashes. All other implementations require the work factor be at least 4. Previously Botan simply required it be greater than zero. (GH #938) * Converge on a single side channel silent EC blinded multiply algorithm. Uses Montgomery ladder with order/2 bits scalar blinding and point randomization now by default. (GH #893) * Add ability to search for certificates using the SHA-256 of the distinguished name. (GH #900) * Support a 0-length IV in ChaCha stream cipher. Such an IV is treated identically to an 8-byte IV of all zeros. * Add new interfaces to the C API including multiple precision integers, key validity tests, block ciphers, and extracting algorithm specific key parameters (such as the modulus and public exponent from RSA public keys). GH #899 #944 #946 #961 #964 * The PKCS11 module did not require any external dependencies, so it has been enabled by default. The ``--with-pkcs11`` and ``--without-pkcs11`` flags to ``configure.py`` have been removed. PKCS11 can still be disabled using ``--disable-modules=pkcs11`` (GH #837) * Add ``OS::run_cpu_instruction_probe`` for runtime probing of ISA extensions. Supporting this requires system-specific techniques, currently Windows SEH and Unix signal handling are supported. * Add support for ARM NEON in the SIMD_4x32 type * Add support for ARM CPU feature detection using getauxval (GH #843) * Previously Botan forbid any use of times past 2037 to avoid Y2038 issues. Now this restriction is only in place on systems which have a 32-bit ``time_t``. (GH #933 fixing #917) * Add generic type decoder function to BER decoder (GH #897) * Fix portability or build problems affecting Sun Studio compiler (GH #846), Solaris, ppc64le, DragonflyBSD (GH #887) * Add ``--with-external-libdir`` to configure.py (GH #857 fixing #19 #767) * Add ``OS::get_high_resolution_clock`` which returns the best resolution clock available on the system. * Change ``OS::get_processor_timestamp`` to return 0 if no hardware cycle counter is available. Previously it silently fell back on some other clock type. * Report cycles/byte in the output of ``botan speed``. * Add speed tests for modular exponentiations and ECC scalar multiplies. * Avoid using IP address for SNI in ``tls_client``. (GH #942) * Add command line util ``timing_test`` which enables running timing-based side channel analysis of TLS CBC decryption, ECC scalar multiplies, OAEP decoding, and other operations which are prone to providing an oracle via side channel. This replaces the standalone timing test suite added in 1.11.34, which has been removed. * Various cleanups and refactorings (GH #965) * Add wrapper of C++14 make_unique (GH #974) * Fix pkg-config output when --build-dir was used (GH #936) * Make it possible to disable `-fstack-protector` using a build-time flag. GH #863 * Add tests for TLS DSA ciphersuites, more Noekeon tests, others. * Avoid a GCC warning that triggered on the public key types (GH #849) * Fix various warnings flagged by pylint and pyflakes linters in configure.py and botan.py (GH #832 #836 #839 #962 #975) * Improve support for OpenBSD including using getentropy (GH #954) for PRNG seeding, and arc4random to access system RNG (GH #953) * Add ability to build through CMake. As of now this is only supported for development rather than production builds. (GH #967) * Rename python wrapper to botan2.py (GH #847) * Change name constraint test to use a fixed reference time. Test certs have expired. * Increase Miller-Rabin iterations for DSA primes to match FIPS 186-4. (GH #881) * Fix possible ISO 9796-2 padding side channel, and add a missing length check (GH #891) * In command line utility, prefer the system RNG if it is available. Version 1.10.16, 2017-04-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a bug in X509 DN string comparisons that could result in out of bound reads. This could result in information leakage, denial of service, or potentially incorrect certificate validation results. (CVE-2017-2801) * Avoid throwing during a destructor since this is undefined in C++11 and rarely a good idea. (GH #930) Version 1.10.15, 2017-01-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a bug causing modular exponentiations done modulo even numbers to almost always be incorrect, unless the values were small. This bug is not known to affect any cryptographic operation in Botan. (GH #754) * Avoid use of C++11 std::to_string in some code added in 1.10.14 (GH #747 #834) Version 2.0.1, 2017-01-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Change an unintended behavior of 2.0.0, which named the include directory ``botan-2.0``. Since future release of Botan-2 should be compatible with code written against old versions, there does not seem to be any reason to version the include directory with the minor number. (GH #830 #833) * Fix a bug which caused an error when building on Cygwin or other platforms where shared libraries are not supported. (GH #821) * Enable use of readdir on Cygwin, which allows the tests to run (GH #824) * Switch to readthedocs Sphinx theme by default (GH #822 #823) Version 2.0.0, 2017-01-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * With this release the project adopts Semantic Versioning (GH #766) * Fix a longstanding bug in modular exponentiation which caused most exponentiations modulo an even number to have an incorrect result; such moduli occur only rarely in cryptographic contexts. (GH #754) * Fix a bug in BigInt multiply operation, introduced in 1.11.30, which could cause incorrect results. Found by OSS-Fuzz fuzzing the ressol function, where the bug manifested as an incorrect modular exponentiation. OSS-Fuzz bug #287 * Fix a bug that meant the "ietf/modp/6144" and "ietf/modp/8192" discrete log groups used an incorrect value for the generator, specifically the value (p-1)/2 was used instead of the correct value of 2. * The DL_Group enum value X942_DH_PARAMETERS has been renamed ANSI_X9_42_DH_PARAMETERS to avoid a conflict with Windows headers (GH #482) * Change default PEM header for X942 DH to match OpenSSL. Either version is accepted on reading. (GH #818) * DL_Group strong generation previously set the generator to 2. However sometimes 2 generates the entire group mod p, rather than the subgroup mod q. This is invalid by X9.42 standard, and exposes incautious applications to small subgroup attacks. Now DL_Group uses the smallest g which is a quadratic residue. (GH #818) * Add iOS build target instead of piggybacking on OS X configuration. (GH #793) * Changes all Public_Key derived class ctors to take a std::vector instead of a secure_vector for the DER encoded public key bits. (GH #768) * Allow use of custom extensions when creating X.509 certificates (GH #744) * The default TLS policy now requires 2048 or larger DH groups by default. * Add BSI_TR_02102_2 TLS::Policy subclass representing BSI TR-02102-2 recommendations. * The default Path_Validation_Restrictions constructor has changed to require at least 110 bit signature strength. This means 1024 bit RSA certificates and also SHA-1 certificates are rejected by default. Both settings were already the default for certificate validation in TLS handshake, but this changes it for applications also. * Add ISO 9796-2 signature padding schemes DS2 and DS3. These schemes provide message recovery (part or all of the plaintext message can be recovered from the signature alone) and are used by some industry protocols. (GH #759) * Rewrite all the code that handles parsing CBC padding bytes to run without conditional jumps or loads. (GH #765 #728) * Fix deref of invalid memory location in TLS client when the server chooses a ciphersuite value larger than the largest TLS ciphersuite ID compiled into the table. This might conceivably cause a crash in rare circumstances, but does not seem to be further exploitable. (GH #758) * Rename Public_Key::x509_subject_public_key, which does not return a X.509 SubjectPublicKey, to public_key_bits. Add a new non-virtual function Public_Key::subject_public_key which does exactly that. (GH #685 #757) * Rename Private_Key::pkcs8_private_key, which does not return a PKCS#8 private key, to private_key_bits. Add a new non-virtual function Private_Key::private_key_info which does exactly that. (GH #685 #757) * The deprecated ECB Cipher_Mode class has been removed (GH #756) * The class SRP6_Authenticator_File (in srp6_files.h) was meant to parse GnuTLS SRP files. But it was completely untested, and it turns out due to several problems it was completely unable to parse any SRP file correctly. It has been removed, with a future replacement planned that can handle both flat files (in the actual SRP format) or using a SQL database. * Fix tests errors when write access to /dev/urandom is prohibited (GH #748) * Add more Diffie-Hellman tests (GH #790), tests for RSA blinding, others. * Add `tls_ciphers` command which prints the ciphersuites a client hello will contain, depending on the policy specified. * Prevent TLS from negotiating SHA-2 ciphersuites in TLS v1.0/v1.1. These ciphersuites are technically not defined except for v1.2, so disable them in older protocols. (GH #496) * Documentation: add project goals (GH #788) and side channel info (GH #787) Version 1.11.34, 2016-11-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix integer overflow during BER decoding, found by Falko Strenzke. This bug is not thought to be directly exploitable but upgrading ASAP is advised. (CVE-2016-9132) * Add post-quantum signature scheme XMSS. Provides either 128 or 256 bit (post-quantum) security, with small public and private keys, fast verification, and reasonably small signatures (2500 bytes for 128-bit security). Signature generation is very slow, on the order of seconds. And very importantly the signature scheme is stateful: each leaf index must only be used once, or all security is lost. In the appropriate system where signatures are rarely generated (such as code signing) XMSS makes an excellent choice. (GH #717 #736) * Add support for CECPQ1 TLS ciphersuites. These use a combination of x25519 ECDH and NewHope to provide post-quantum security. The ciphersuites are not IETF standard, but is compatible with BoringSSL. (GH #729) * Add support for client-side OCSP stapling to TLS. (GH #738) * Previously both public and private keys performed automatic self testing after generation or loading. However this often caused unexpected application performance problems, and so has been removed. Instead applications must call check_key explicitly. (GH #704) * Fix TLS session resumption bugs which caused resumption failures if an application used a single session cache for both TLS and DTLS. (GH #688) * Add SHAKE-128 and SHAKE-256 XOFs as hash functions supporting paramaterized output lengths. * Add MessageAuthenticationCode::start_msg interface, for MACs which require or can use a nonce (GH #691) * Add GMAC, a MAC based on GCM (GH #488 / #691) * Add ESP block cipher padding from RFC 4304. GH #724 * Incompatible change to HKDF: previously the HKDF type in Botan was only the Expand half of HKDF. Now HKDF is the full Extract-then-Expand KDF, and HKDF_Extract and HKDF_Expand are available. If you previously used HKDF, you must switch to using HKDF_Expand. (GH #723) * Add Cipher_Mode::reset which resets message-specific state, allowing discarding state but allowing continued processing under the same key. (GH #552) * The ability to add OIDs at runtime has been removed. This additionally removes a global lock which was acquired on each OID lookup. (GH #706) * The default TLS policy now disables static RSA ciphersuites, all DSA ciphersuites, and the AES CCM-8 ciphersuites. Disabling static RSA by default protects servers from oracle attacks, as well as enforcing a forward secure ciphersuite. Some applications may be forced to re-enable RSA for interop reasons. DSA and CCM-8 are rarely used, and likely should not be negotiated outside of special circumstances. * The default TLS policy now prefers ChaCha20Poly1305 cipher over any AES mode. * The default TLS policy now orders ECC curve preferences in order by performance, with x25519 first, then P-256, then P-521, then the rest. * Add a BSD sockets version of the HTTP client code used for OCSP. GH #699 * Export the public key workfactor functions (GH #734) and add tests for them. * HMAC_DRBG allows configuring maximum number of bytes before reseed check (GH #690) * Salsa20 now accepts a null IV as equivalent to an all-zero one (GH #697) * Optimize ECKCDSA verification (GH #700 #701 #702) * The deprecated RNGs HMAC_RNG and X9.31 RNG have been removed. Now the only userspace PRNG included in the library is HMAC_DRBG. (GH #692) * The entropy sources for EGD and BeOS, as well as the Unix entropy source which executed processes to get statistical data have been removed. (GH #692) * The openpgp module (which just implemented OpenPGP compatible base64 encoding and decoding, nothing else) has been removed. * Added new configure.py argument `--optimize-for-size`. Currently just sets the flag for code size optimizations with the compiler, but may have other effects in the future. * Fixed bug in Threaded_Fork causing incorrect computations (GH #695 #716) * Add DSA deterministic parameter generation test from FIPS 186-3. * Fix PKCS11_ECDSA_PrivateKey::check_key (GH #712) * Fixed problems running configure.py outside of the base directory * The BOTAN_ENTROPY_PROC_FS_PATH value in build.h was being ignored (GH #708) * Add speed tests for ECGDSA and ECKCDSA (GH #696) * Fix a crash in speed command for Salsa20 (GH #697) * Allow a custom ECC curve to be specified at build time, for application or system specific curves. (GH #636 #710) * Use NOMINMAX on Windows to avoid problems in amalgamation build. (GH #740) * Add support to output bakefiles with new `configure.py` option `--with-bakefile`. (GH #360 #720) * The function `zero_mem` has been renamed `secure_scrub_memory` * More tests for pipe/filter (GH #689 #693), AEADs (GH #552), KDF::name (GH #727), * Add a test suite for timing analysis for TLS CBC decryption, OAEP decryption, and PKCS #1 v1.5 decryption. These operations all have the feature that if an attacker can distinguish internal operations, such as through a variance in timing, they can use this oracle to decrypt arbitrary ciphertexts. GH #733 * Add a test suite for testing and fuzzing with TLS-Attacker, a tool for analyzing TLS libraries. (https://github.com/RUB-NDS/TLS-Attacker) * Add a fuzzing framework. Supports fuzzing some APIs using AFL and libFuzzer. * Added documentation for PKCS #11 (GH #725) * The LibraryInitializer type is no longer needed and is now deprecated. * The license and news files were moved from doc to the top level directory. There should not be any other visible change (eg, to the installed version) as a result of this move. * Fixed some problems when running configure.py outside of the base directory, especially when using relative paths. * Add (back) the Perl XS wrapper and sqlite encryption code. Version 1.10.14, 2016-11-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * NOTE WELL: Botan 1.10.x is supported for security patches only until 2017-12-31 * Fix integer overflow during BER decoding, found by Falko Strenzke. This bug is not thought to be directly exploitable but upgrading ASAP is advised. (CVE-2016-9132) * Fix two cases where (in error situations) an exception would be thrown from a destructor, causing a call to std::terminate. * When RC4 is disabled in the build, also prevent it from being included in the OpenSSL provider. (GH #638) Version 1.11.33, 2016-10-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Avoid side channel during OAEP decryption. (CVE-2016-8871) * A countermeasure for the Lucky13 timing attack against CBC-based TLS ciphersuites has been added. (GH #675) * Added X25519-based key exchange for TLS (GH #673) * Add Certificate_Store_In_SQL which supports storing certs, keys, and revocation information in a SQL database. Subclass Certificate_Store_In_SQLite specializes with support for SQLite3 databases. (GH #631) * The Certificate_Store interface has been changed to deal with ``std::shared_ptrs`` instead of raw pointers (GH #471 #631) * Add support for official SHA-3. Keccak-1600 was already supported but used different padding from FIPS 202. (GH #669) * Add SHAKE-128 based stream cipher. (GH #669) * NewHope key exchange now supports the SHA-256/AES-128-CTR scheme used by BoringSSL in addition to the SHA-3/SHAKE-128 parameters used by the reference implementation. (GH #669) * Add support for the TLS Supported Point Formats Extension from RFC 4492. Adds ``TLS::Policy::use_ecc_point_compression`` policy option. If supported on both sides, ECC points can be sent in compressed format which saves a few bytes during the handshake. (GH #645) * Fix entropy source selection bug on Windows, which caused the CryptoAPI entropy source to be not available under its normal name "win32_cryptoapi" but instead "dev_random". GH #644 * Accept read-only access to ``/dev/urandom``. System_RNG previously required read-write access, to allow applications to provide inputs to the system PRNG. But local security policies might only allow read-only access, as is the case with Ubuntu's AppArmor profile for applications in the Snappy binary format. If opening read/write fails, System_RNG silently backs down to read-only, in which case calls to ``add_entropy`` on that object will fail. (GH #647 #648) * Fix use of Win32 CryptoAPI RNG as an entropy source, which was accidentally disabled due to empty list of acceptable providers being specified. Typically the library would fall back to gathering entropy from OS functions returning statistical information, but if this functionality was disabled in the build a ``PRNG_Unseeded`` exception would result. (GH #655) * Add support for building the library as part of the IncludeOS unikernel. This included making filesystem and threading support optional. (GH #665) * Added ISA annotations so that with GCC (all supported versions) and Clang (since 3.7) it is no longer required to compile amalgamation files with ABI specific flags such as ``-maes``. (GH #665) * Internal cleanups to TLS CBC record handling. TLS CBC ciphersuites can now be disabled by disabling ``tls_cbc`` module. (GH #642 #659) * Internal cleanups to the object lookup code eliminates most global locks and all use of static initializers (GH #668 #465) * Avoid ``static_assert`` triggering under MSVC debug builds (GH #646) * The antique PBKDF1 password hashing scheme is deprecated and will be removed in a future release. It was only used to support the equally ancient PBES1 private key encryption scheme, which was removed in 1.11.8. * Added MSVC debug/checked iterator builds (GH #666 #667) * Added Linux ppc64le cross compile target to Travis CI (GH #654) * If RC4 is disabled, also disable it coming from the OpenSSL provider (GH #641) * Add TLS message parsing tests (GH #640) * Updated BSI policy to prohibit DES, HKDF, HMAC_RNG (GH #649) * Documentation improvements (GH #660 #662 #663 #670) Version 1.11.32, 2016-09-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for the NewHope Ring-LWE key encapsulation algorithm. This scheme provides an estimated ~200 bit security level against a quantum attacker while also being very fast and requiring only modest message sizes of 1824 and 2048 bytes for initiator and responder, resp. This version is tested as having bit-for-bit identical output as the reference implementation by the authors. Be warned that NewHope is still a very new scheme and may yet fall to analysis. For best assurance, NewHope should be used only in combination with another key exchange mechanism, such as ECDH. * New TLS callbacks API. Instead of numerous std::function callbacks, the application passes an object implementing the TLS::Callbacks interface, which has virtual functions matching the previous callbacks (plus some extras). Full source compatability with previous versions is maintained for now, but the old interface is deprecated and will be removed in a future release. The manual has been updated to reflect the changes. (GH #457 and #567) * Add support for TLS Encrypt-then-MAC extension (GH #492 and #578), which fixes the known issues in the TLS CBC-HMAC construction. * The format of the TLS session struct has changed (to support EtM), so old TLS session caches will be invalidated. * How the library presents optimized algorithm implementations has changed. For example with the algorithm AES-128, previously there were three BlockCipher classes AES_128, AES_128_SSSE3, and AES_128_NI which used (resp) a table-based implementation vulnerable to side channels, a constant time version using SSSE3 SIMD extensions on modern x86, and x86 AES-NI instructions. Using the correct version at runtime required using ``BlockCipher::create``. Now, only the class AES_128 is presented, and the best available version is always used based on CPUID checks. The tests have been extended to selectively disable CPUID bits to ensure all available versions are tested. (GH #477 #623) Removes API classes AES_128_NI, AES_192_NI, AES_256_NI, AES_128_SSSE3, AES_192_SSSE3 AES_256_SSSE3, IDEA_SSE2, Noekeon_SIMD, Serpent_SIMD, Threefish_512_AVX2, SHA_160_SSE2 * The deprecated algorithms Rabin-Williams, Nyberg-Rueppel, MARS, RC2, RC5, RC6, SAFER-SK, TEA, MD2, HAS-160, and RIPEMD-128 have been removed. (GH #580) * A new Cipher_Mode interface ``process`` allows encryption/decryption of buffers without requiring copying into ``secure_vector`` first. (GH #516) * Fix verification of self-issued certificates (GH #634) * SSE2 optimizations for ChaCha, 60% faster on both Westmere and Skylake (GH #616) * The HMAC_RNG constructor added in 1.11.31 that took both an RNG and an entropy source list ignored the entropy sources. * The configure option ``--via-amalgamation`` was renamed to ``--amalgamation``. The configure option ``--gen-amalgamation`` was removed. It did generate amalgamations but build Botan without amalgamation. Users should migrate to ``--amalgamation``. (GH #621) * DH keys did not automatically self-test after being generated, contrary to the current behavior for other key types. * Add tests for TLS 1.2 PRF (GH #628) Version 1.11.31, 2016-08-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix undefined behavior in Curve25519 on platforms without a native 128-bit integer type. This was known to produce incorrect results on 32-bit ARM under Clang. GH #532 (CVE-2016-6878) * If X509_Certificate::allowed_usage was called with more than one Key_Usage set in the enum value, the function would return true if *any* of the allowed usages were set, instead of if *all* of the allowed usages are set. GH #591 (CVE-2016-6879) * Incompatible changes in DLIES: Previously the input to the KDF was the concatenation of the (ephemeral) public key and the secret value derived by the key agreement operation. Now the input is only the secret value obtained by the key agreement operation. That's how it is specified in the original paper "DHIES: An encryption scheme based on Diffie-Hellman Problem" or in BSI technical guideline TR-02102-1 for example. In addition to the already present XOR-encrypion/decryption mode it's now possible to use DLIES with a block cipher. Furthermore the order of the output was changed from {public key, tag, ciphertext} to {public key, ciphertext, tag}. Both modes are compatible with BouncyCastle. * Add initial PKCS #11 support (GH #507). Currently includes a low level wrapper to all of PKCS #11 (p11.h) and high level code for RSA and ECDSA signatures and hardware RNG access. * Add ECIES encryption scheme, compatible with BouncyCastle (GH #483) * Add ECKCDSA signature algorithm (GH #504) * Add KDF1 from ISO 18033 (GH #483) * Add FRP256v1 curve (GH #551) * Changes for userspace PRNGs HMAC_DRBG and HMAC_RNG (GH #520 and #593) These RNGs now derive from Stateful_RNG which handles issues like periodic reseeding and (on Unix) detecting use of fork. Previously these measures were included only in HMAC_RNG. Stateful_RNG allows reseeding from another RNG and/or a specified set of entropy sources. For example it is possible to configure a HMAC_DRBG to reseed using a PKCS #11 token RNG, the CPU's RDSEED instruction, and the system RNG but disabling all other entropy polls. * AutoSeeded_RNG now uses NIST SP800-90a HMAC_DRBG(SHA-384). (GH #520) * On Windows and Unix systems, the system PRNG is used as the sole reseeding source for a default AutoSeeded_RNG, completely skipping the standard entropy polling code. New constructors allow specifying the reseed RNG and/or entropy sources. (GH #520) * The `hres_timer` entropy source module has been removed. Timestamp inputs to the RNG are now handled as additional_data inputs to HMAC_DRBG. * Add RDRAND_RNG which directly exposes the CPU RNG (GH #543) * Add PKCS #1 v1.5 id for SHA-512/256 (GH #554) * Add X509_Time::to_std_timepoint (GH #560) * Fix a bug in ANSI X9.23 padding mode, which returned one byte more than the given block size (GH #529). * Fix bug in SipHash::clear, which did not reset all state (GH #547) * Fixes for FreeBSD (GH #517) and OpenBSD (GH #523). The compiler defaults to Clang on FreeBSD now. * SonarQube static analysis integration (GH #592) * Switched Travis CI to Ubuntu 14.04 LTS (GH #592) * Added ARM32, ARM64, PPC32, PPC64, and MinGW x86 cross compile targets to Travis CI (GH #608) * Clean up in TLS ciphersuite handling (GH #583) * Threefish-512 AVX2 optimization work (GH #581) * Remove build configuration host and timestamp from build.h This makes this header reproducible and allows using ccache's direct mode (GH #586 see also #587) * Prevent building for x86-64 with x86-32 compiler and the reverse (GH #585) * Avoid build problem on 32-bit userspace ARMv8 (GH #563) * Refactor of internal MP headers (GH #549) * Avoid MSVC C4100 warning (GH #525) * Change botan.exe to botan-cli.exe on Windows to workaround VC issue (GH #584) * More tests for RSA-KEM (GH #538), DH (GH #556), EME (GH #553), cipher mode padding (GH #529), CTS mode (GH #531), KDF1/ISO18033 (GH #537), OctetString (GH #545), OIDs (GH #546), parallel hash (GH #548), charset handling (GH #555), BigInt (GH #558), HMAC_DRBG (GH #598 #600) * New deprecations. See the full list in doc/deprecated.txt The X9.31 and HMAC_RNG RNGs are deprecated. If you need a userspace PRNG, use HMAC_DRBG (or AutoSeeded_RNG which is HMAC_DRBG with defaults). Support for getting entropy from EGD is deprecated, and will be removed in a future release. The developers believe that it is unlikely that any modern system requires EGD and so the code is now dead weight. If you rely on EGD support, you should contact the developers by email or GitHub ASAP. The TLS ciphersuites using 3DES and SEED are deprecated and will be removed in a future release. ECB mode Cipher_Mode is deprecated and will be removed in a future release. Support for BeOS/Haiku has not been tested in 5+ years and is in an unknown state. Unless reports are received of successful builds and use on this platform, support for BeOS/Haiku will be removed in a future release. Version 1.11.30, 2016-06-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * In 1.11.23 a bug was introduced such that CBC-encrypted TLS packets containing no plaintext bytes at all were incorrectly rejected with a MAC failure. Records like this are used by OpenSSL in TLS 1.0 connections in order to randomize the IV. * A bug in GCM caused incorrect results if the 32-bit counter field overflowed. This bug has no implications on the security but affects interoperability. With a 96-bit nonce, this could only occur if at least 2**32 128-bit blocks (64 GiB) were encrypted. This actually exceeds the maximum allowable length of a GCM plaintext; when messages longer than 2**32 - 2 blocks are encrypted, GCM loses its security properties. In addition to 96-bit nonces, GCM also supports nonces of arbitrary length using a different method which hashes the provided nonce under the authentication key. When using such a nonce, the last 4 bytes of the resulting CTR input might be near the overflow boundary, with the probability of incorrect overflow increasing with longer messages. when encrypting 256 MiB of data under a random 128 bit nonce, an incorrect result would be produced about 1/256 of the time. With 1 MiB texts, the probability of error is reduced to 1/65536. Since TLS uses GCM with 96 bit nonces and limits the length of any record to far less than 64 GiB, TLS GCM ciphersuites are not affected by this bug. Reported by Juraj Somorovsky, described also in "Nonce-Disrespecting Adversaries: Practical Forgery Attacks on GCM in TLS" (https://eprint.iacr.org/2016/475.pdf) * Previously when generating a new self-signed certificate or PKCS #10 request, the subject DN was required to contain both common name (CN) and country (C) fields. These restrictions have been removed. GH #496 * The Transform and Keyed_Transform interfaces has been removed. The two concrete implementations of these interfaces were Cipher_Mode and Compressor_Transform. The Cipher_Mode interface remains unchanged as the Transform and Keyed_Transform signatures have moved to it; no changes to Cipher_Mode usage should be necessary. Any uses of Transform& or Keyed_Transform& to refer to a cipher should be replaced by Cipher_Mode&. The compression algorithm interface has changed; the start function now takes the per-message compression ratio to use. Previously the compression level to use had to be set once, at creation time, and the required ``secure_vector`` argument to ``start`` was required to be empty. The new API is documented in `compression.rst` in the manual. * Add IETF versions of the ChaCha20Poly1305 TLS ciphersuites from draft-ietf-tls-chacha20-poly1305-04. The previously implemented (non-standard) ChaCha20Poly1305 ciphersuites from draft-agl-tls-chacha20poly1305 remain but are deprecated. * The OCB TLS ciphersuites have been updated to use the new nonce scheme from draft-zauner-tls-aes-ocb-04. This is incompatible with previous versions of the draft, and the ciphersuite numbers used for the (still experimental) OCB ciphersuites have changed. * Previously an unknown critical extension caused X.509 certificate parsing to fail; such a cert could not be created at all. Now parsing succeeds and the certificate validation fails with an error indicating an unknown critical extension. GH #469 * X509_CRL previously had an option to cause it to ignore unknown critical extensions. This has been removed. * Added StreamCipher::seek allowing seeking to arbitrary position in the key stream. Currently only implemented for ChaCha. (GH #497) * Added support for ChaCha stream cipher with 8 or 12 rounds. * Add ECGDSA signature algorithm (GH #479) * Add support for label argument to KDFs (GH #495) * Add NIST SP800-108 and 56C KDFs (GH #481) * Support for Card Verifiable Certificates and the obsolete EMSA1_BSI signature padding scheme have been removed. (GH #487) * A bug in the IETF version of ChaCha20Poly1305 (with 96 bit nonces) caused incorrect computation when the plaintext or AAD was exactly a multiple of 16 bytes. * Fix return type of TLS_Reader::get_u32bit, which was truncated to 16 bits. This only affected decoding of session ticket lifetimes. GH #478 * Fix OS X dylib naming problem (GH #468 #467) * Fix bcrypt function under Python 3 (GH #461) * The ``unix_procs`` entropy source is deprecated and will be removed in a future release. This entropy source attempts to get entropy by running Unix programs like ``arp``, ``netstat``, and ``dmesg`` which produce information which may be difficult for a remote attacker to guess. This exists primarily as a last-ditch for Unix systems without ``/dev/random``. But at this point such systems effectively no longer exist, and the use of ``fork`` and ``exec`` by the library complicates effective application sandboxing. * Changes to avoid implicit cast warnings in Visual C++ (GH #484) Version 1.10.13, 2016-04-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Use constant time modular inverse algorithm to avoid possible side channel attack against ECDSA (CVE-2016-2849) * Use constant time PKCS #1 unpadding to avoid possible side channel attack against RSA decryption (CVE-2015-7827) * Avoid a compilation problem in OpenSSL engine when ECDSA was disabled. Gentoo bug 542010 Version 1.11.29, 2016-03-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * CVE-2016-2849 DSA and ECDSA used a modular inverse function which had input dependent loops. It is possible a side channel attack on this function could be used to recover sufficient information about the nonce k to mount a lattice attack and recover the private key. Found by Sean Devlin. * CVE-2016-2850 The TLS client did not check that the signature algorithm or ECC curve a v1.2 server used was actually acceptable by the policy. This would allow a server who ignored the preferences indicated in the client to use a weak algorithm, and may allow MITM attacks by an attacker who can break MD5 signatures or 160 bit ECC in real time. The server similarly failed to check on the hash a client used during client certificate authentication. * Reject empty TLS records at the record processing layer since such a record is not valid regardless of the record type. Later checks already correctly rejected empty records, but during processing such a record, a pointer to the end of the vector was created, causing a assertion failure under checked iterators. Found by Juraj Somorovsky. * Add PK_Decryptor::decrypt_or_random which allows an application to atomically (in constant time) check that a decrypted ciphertext has the expected length and/or apply content checks on the result. This is used by the TLS server for decrypting PKCS #1 v1.5 RSA ciphertexts. Previously the server used a implementation which was potentially vulnerable to side channels. * Add support for processing X.509 name constraint extension during path validation. GH #454 * Add X509_Certificate::v3_extensions which allows retreiving the raw binary of all certificate extensions, including those which are not known to the library. This allows processing of custom extensions. GH #437 * Add support for module policies which are a preconfigured set of acceptable or prohibited modules. A policy based on BSI TR-02102-1 is included. GH #439 #446 * Support for the deprecated TLS heartbeat extension has been removed. * Support for the deprecated TLS minimum fragment length extension has been removed. * SRP6 support is now optional in TLS * Support for negotiating MD5 and SHA-224 signatures in TLS v1.2 has been removed. MD5 signatures are demonstratably insecure in TLS, SHA-224 is rarely used. * Support for negotiating ECC curves secp160r1, secp160r2, secp160k1, secp192k1, secp192r1 (P-192), secp224k1, secp224r1 (P-224), and secp256k1 have been removed from the TLS implementation. All were already disabled in the default policy. * HMAC_RNG now has an explicit check for fork using pid comparisons. It also includes the pid and system and CPU clocks into the PRF computation to help reduce the risk of pid wraparound. Even so, applications using fork and userspace RNGs should explicitly reseed all such RNGs whenever possible. * Deprecation warning: support for DSA certificates in TLS is deprecated and will be removed in a future release. * Deprecation warning: in addition to the algorithms deprecated in 1.11.26, the following algorithms are now deprecated and will be removed in a future release: Rabin-Williams signatures, TEA, XTEA. * Deprecation warning: the library has a number of compiled in MODP and ECC DL parameters. All MODP parameter sets under 2048 bits and all ECC parameters under 256 bits are deprecated and will be removed in a future release. This includes the MODP groups "modp/ietf/1024", "modp/srp/1024", "modp/ietf/1536", "modp/srp/1536" and the ECC groups "secp160k1", "secp160r1", "secp160r2", "secp192k1", "secp192r1", "secp224k1", "secp224r1", "brainpool160r1", "brainpool192r1", "brainpool224r1", "x962_p192v2", "x962_p192v3", "x962_p239v1", "x962_p239v2" and "x962_p239v3". Additionally all compiled in DSA parameter sets ("dsa/jce/1024", "dsa/botan/2048", and "dsa/botan/3072") are also deprecated. * RDSEED/RDRAND polling now retries if the operation fails. GH #373 * Fix various minor bugs found by static analysis with PVS-Studio (GH#421), Clang analyzer (GH #441), cppcheck (GH #444, #445), and Coverity. * Add --with-valgrind configure option to enable building against the valgrind client API. This currently enables checking of const time operations using memcheck. * Fix remaining Wshadow warnings. Enable Wshadow in build. GH #427 * Use noexcept in VS 2015 GH #429 * On Windows allow the user to explicitly request symlinks be used as part of the build. Likely only useful for someone working on the library itself. GH #430 * Remove use of TickCount64 introduced in 1.11.27 which caused problem with downstream distributors/users building XP compatiable binaries which is still an option even in VS 2015 * MCEIES requires KDF1 at runtime but did not require it be enabled in the build. GH #369 * Small optimizations to Keccak hash * Support for locking allocator on Windows using VirtualLock. GH #450 Version 1.8.15, 2016-02-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * NOTE WELL: Botan 1.8 is not supported for security issues anymore. Moving to 1.10 or 1.11 is certainly recommended. * Fix CVE-2014-9742: Insufficient randomness in Miller-Rabin primality check * Fix CVE-2016-2194: Infinite loop in modulur square root algorithm * Fix CVE-2015-5726: Crash in BER decoder * Fix CVE-2015-5727: Excess memory allocation in BER decoder Note: Unlike the fix in 1.10 which checks that the source actually contains enough data to satisfy the read before allocating the memory, 1.8.15 simply rejects all ASN.1 blocks larger than 1 MiB. This simpler check avoids the problem without breaking ABI. Version 1.10.12, 2016-02-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * In 1.10.11, the check in PointGFp intended to check the affine y argument actually checked the affine x again. Reported by Remi Gacogne The CVE-2016-2195 overflow is not exploitable in 1.10.11 due to an additional check in the multiplication function itself which was also added in that release, so there are no security implications from the missed check. However to avoid confusion the change was pushed in a new release immediately. The 1.10.11 release notes incorrectly identified CVE-2016-2195 as CVE-2016-2915 Version 1.10.11, 2016-02-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Resolve heap overflow in ECC point decoding. CVE-2016-2195 * Resolve infinite loop in modular square root algorithm. CVE-2016-2194 * Correct BigInt::to_u32bit to not fail on integers of exactly 32 bits. GH #239 Version 1.11.28, 2016-02-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * One of the checks added while addressing CVE-2016-2195 was incorrect and could cause needless assertion failures. Version 1.11.27, 2016-02-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * SECURITY: Avoid heap overflow in ECC point decoding. This could likely result in remote code execution. CVE-2016-2195 * SECURITY: Avoid one word heap overflow in P-521 reduction function. This could potentially lead to remote code execution or other attack. CVE-2016-2196. * SECURITY: Avoid infinite or near-infinite loop during modular square root algorithm with invalid inputs. CVE-2016-2194 * Add Blake2b hash function. GH #413 * Use ``m_`` prefix on all member variables. GH #398 and #407 * Use final qualifier on many classes. GH #408 * Use noreturn attribute on assertion failure function to assist static analysis. GH #403 * Use TickCount64 and MemoryStatusEx in the Windows entropy source. Note these calls are only available in Vista/Server 2008. No accomodations are made for XP or Server 2003, both of which are no longer patched by the vendor. GH #365 Version 1.11.26, 2016-01-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Deprecation warnings: Nyberg-Rueppel signatures, MARS, RC2, RC5, RC6, SAFER, HAS-160, RIPEMD-128, MD2 and support for the TLS minimum fragment length extensions are all being considered for removal in a future release. If there is a compelling use case for keeping any of them in the library, please open a discussion ticket on GitHub. * Support for the TLS extended master secret extension (RFC 7627) has been added. * The format of serialized TLS sessions has changed to add a flag indicating support for the extended master secret flag, which is needed for proper handling of the extension. * Root all exceptions thrown by the library in the ``Botan::Exception`` class. Previously the library would in many cases throw ``std::runtime_error`` or ``std::invalid_argument`` exceptions which would make it hard to determine the source of the error in some cases. * The command line interface has been mostly rewritten. The syntax of many of the sub-programs has changed, and a number have been extended with new features and options. * Correct an error in PointGFp multiplication when multiplying a point by the scalar value 3. PointGFp::operator* would instead erronously compute it as if the scalar was 1 instead. * Enable RdRand entropy source on Windows/MSVC. GH #364 * Add Intel's RdSeed as entropy source. GH #370 * Add preliminary support for accessing TPM v1.2 devices. Currently random number generation, RSA key generation, and signing are supported. Tested using Trousers and an ST TPM * Add generalized interface for KEM (key encapsulation) techniques. Convert McEliece KEM to use it. The previous interfaces McEliece_KEM_Encryptor and McEliece_KEM_Decryptor have been removed. The new KEM interface now uses a KDF to hash the resulting keys; to get the same output as previously provided by McEliece_KEM_Encryptor, use "KDF1(SHA-512)" and request exactly 64 bytes. * Add support for RSA-KEM from ISO 18033-2 * Add support for ECDH in the OpenSSL provider * Fix a bug in DataSource::discard_next() which could cause either an infinite loop or the discarding of an incorrect number of bytes. Reported on mailing list by Falko Strenzke. * Previously if BOTAN_TARGET_UNALIGNED_MEMORY_ACCESS_OK was defined, the code doing low level loads/stores would use pointer casts to access larger words out of a (potentially misaligned) byte array, rather than using byte-at-a-time accesses. However even on platforms such as x86 where this works, it triggers UBSan errors under Clang. Instead use memcpy, which the C standard says is usable for such purposes even with misaligned values. With recent GCC and Clang, the same code seems to be emitted for either approach. * Avoid calling memcpy, memset, or memmove with a length of zero to avoid undefined behavior, as calling these functions with an invalid or null pointer, even with a length of zero, is invalid. Often there are corner cases where this can occur, such as pointing to the very end of a buffer. * The function ``RandomNumberGenerator::gen_mask`` (added in 1.11.20) had undefined behavior when called with a bits value of 32 or higher, and was tested to behave in unpleasant ways (such as returning zero) when compiled by common compilers. This function was not being used anywhere in the library and rather than support something without a use case to justify it it seemed simpler to remove it. Undefined behavior found by Daniel Neus. * Support for using ``ctgrind`` for checking const time blocks has been replaced by calling the valgrind memcheck APIs directly. This allows const-time behavior to be tested without requiring a modified valgrind binary. Adding the appropriate calls requires defining BOTAN_HAS_VALGRIND in build.h. A binary compiled with this flag set can still run normally (though with some slight runtime overhead). * Export MGF1 function mgf1_mask GH #380 * Work around a problem with some antivirus programs which causes the ``shutil.rmtree`` and ``os.makedirs`` Python calls to occasionally fail. The could prevent ``configure.py`` from running sucessfully on such systems. GH #353 * Let ``configure.py`` run under CPython 2.6. GH #362 Version 1.11.25, 2015-12-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * In this release the test suite has been largely rewritten. Previously the tests had internally used several different test helper frameworks created or adopted over time, each of which was insufficient on its own for testing the entire library. These have been fully converged on a new framework which suffices for all of the tests. There should be no user-visible change as a result of this, except that the output format of `botan-test` has changed. * Improved side channel countermeasures for the table based AES implementation. The 4K T tables are computed (once) at runtime to avoid various cache based attacks which are possible due to shared VMM mappings of read only tables. Additionally every cache line of the table is read from prior to processing the block(s). * Support for the insecure ECC groups secp112r1, secp112r2, secp128r1, and secp128r2 has been removed. * The portable version of GCM has been changed to run using only constant time operations. * Work around a bug in MSVC 2013 std::mutex which on some Windows versions can result in a deadlock during static initialization. On Windows a CriticalSection is used instead. Analysis and patch from Matej Kenda (TopIT d.o.o.). GH #321 * The OpenSSL implementation of RC4 would return the wrong value from `name` if leading bytes of the keystream had been skipped in the output. * Fixed the signature of the FFI function botan_pubkey_destroy, which took the wrong type and was not usable. * The TLS client would erronously reject any server key exchange packet smaller than 6 bytes. This prevented negotiating a plain PSK TLS ciphersuite with an empty identity hint. ECDHE_PSK and DHE_PSK suites were not affected. * Fixed a bug that would cause the TLS client to occasionally reject a valid server key exchange message as having an invalid signature. This only affected DHE and SRP ciphersuites. * Support for negotiating use of SHA-224 in TLS has been disabled in the default policy. * Added `remove_all` function to the `TLS::Session_Manager` interface * Avoid GCC warning in pedantic mode when including bigint.h GH #330 Version 1.11.24, 2015-11-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * When the bugs affecting X.509 path validation were fixed in 1.11.23, a check in Credentials_Manager::verify_certificate_chain was accidentally removed which caused path validation failures not to be signaled to the TLS layer. Thus in 1.11.23 certificate authentication in TLS is bypassed. Reported by Florent Le Coz in GH #324 * Fixed an endian dependency in McEliece key generation which caused keys to be generated differently on big and little endian systems, even when using a deterministic PRNG with the same seed. * In `configure,py`, the flags for controlling use of debug, sanitizer, and converage information have been split out into individual options `--with-debug-info`, `--with-sanitizers`, and `--with-coverage`. These allow enabling more than one in a build in a controlled way. The `--build-mode` flag added in 1.11.17 has been removed. Version 1.11.23, 2015-10-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * CVE-2015-7824: An information leak allowed padding oracle attacks against TLS CBC decryption. Found in a review by Sirrix AG and 3curity GmbH. * CVE-2015-7825: Validating a malformed certificate chain could cause an infinite loop. Found in a review by Sirrix AG and 3curity GmbH. * CVE-2015-7826: X.509 path validation violated RFC 6125 and would accept certificates which should not validate under those rules. In particular botan would accept wildcard certificates as matching in situations where it should not (for example it would erroneously accept ``*.example.com`` as a valid wildcard for ``foo.bar.example.com``) * CVE-2015-7827: The routines for decoding PKCS #1 encryption and OAEP blocks have been rewritten to run without secret indexes or branches. These cryptographic operations are vulnerable to oracle attacks, including via side channels such as timing or cache-based analysis. In theory it would be possible to attack the previous implementations using such a side channel, which could allow an attacker to mount a plaintext recovery attack. By writing the code such that it does not depend on secret inputs for branch or memory indexes, such a side channel would be much less likely to exist. The OAEP code has previously made an attempt at constant time operation, but it used a construct which many compilers converted into a conditional jump. * Add support for using ctgrind (https://github.com/agl/ctgrind) to test that sections of code do not use secret inputs to decide branches or memory indexes. The testing relies on dynamic checking using valgrind. So far PKCS #1 decoding, OAEP decoding, Montgomery reduction, IDEA, and Curve25519 have been notated and confirmed to be constant time on Linux/x86-64 when compiled by gcc. * Public key operations can now be used with specified providers by passing an additional parameter to the constructor of the PK operation. * OpenSSL RSA provider now supports signature creation and verification. * The blinding code used for RSA, Diffie-Hellman, ElGamal and Rabin-Williams now periodically reinitializes the sequence of blinding values instead of always deriving the next value by squaring the previous ones. The reinitializion interval can be controlled by the build.h parameter BOTAN_BLINDING_REINIT_INTERVAL. * A bug decoding DTLS client hellos prevented session resumption for succeeding. * DL_Group now prohibits creating a group smaller than 1024 bits. * Add System_RNG type. Previously the global system RNG was only accessible via `system_rng` which returned a reference to the object. However is at times useful to have a unique_ptr which will be either the system RNG or an AutoSeeded_RNG, depending on availability, which this additional type allows. * New command line tools `dl_group` and `prime` * The `configure.py` option `--no-autoload` is now also available under the more understandable name `--minimized-build`. * Note: 1.11.22 was briefly released on 2015-10-26. The only difference between the two was a fix for a compilation problem in the OpenSSL RSA code. As the 1.11.22 release had already been tagged it was simpler to immediately release 1.11.23 rather than redo the release. Version 1.11.21, 2015-10-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add new methods for creating types such as BlockCiphers or HashFunctions, T::providers() returning list of provider for a type, and T::create() creating a new object of a specified provider. The functions in lookup.h forward to these new APIs. A change to the lookup system in 1.11.14 had caused problems with static libraries (GH #52). These problems have been fixed as part of these changes. GH #279 * Fix loading McEliece public or private keys with PKCS::load_key / X509::load_key * Add `mce` command line tool for McEliece key generation and file encryption * Add Darwin_SecRandom entropy source which uses `SecRandomCopyBytes` API call for OS X and iOS, as this call is accessible even from a sandboxed application. GH #288 * Add new HMAC_DRBG constructor taking a name for the MAC to use, rather than a pointer to an object. * The OCaml module is now a separate project at https://github.com/randombit/botan-ocaml * The encrypted sqlite database support in contrib has moved to https://github.com/randombit/botan-sqlite * The Perl XS module has been removed as it was no longer maintained. Version 1.11.20, 2015-09-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Additional countermeasures were added to ECC point multiplications including exponent blinding and randomization of the point representation to help protect against side channel attacks. * An ECDSA provider using OpenSSL has been added. * The ordering of algorithm priorities has been reversed. Previously 255 was the lowest priority and 0 was the highest priority. Now it is the reverse, with 0 being lowest priority and 255 being highest. The default priority for the base algorithms is 100. This only affects external providers or applications which directly set provider preferences. * On OS X, rename libs to avoid trailing version numbers, e.g. libbotan-1.11.dylib.19 -> libbotan-1.11.19.dylib. This was requested by the Homebrew project package audit. GH #241, #260 * Enable use of CPUID interface with clang. GH #232 * Add support for MSVC 2015 debug builds by satisfying C++ allocator requirements. SO 31802806, GH #236 * Make `X509_Time` string parsing and `to_u32bit()` more strict to avoid integer overflows and other potentially dangerous misinterpretations. GH #240, #243 * Remove all 'extern "C"' declarations from src/lib/math/mp/ because some of those did throw exceptions and thus cannot be C methods. GH #249 * Fix build configuration for clang debug on Linux. GH #250 * Fix zlib error when compressing an empty buffer. GH #265 * Fix iOS builds by allowing multiple compiler flags with the same name. GH #266 * Fix Solaris build issue caused by `RLIMIT_MEMLOCK`. GH #262 Version 1.11.19, 2015-08-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * SECURITY: The BER decoder would crash due to reading from offset 0 of an empty vector if it encountered a BIT STRING which did not contain any data at all. As the type requires a 1 byte field this is not valid BER but could occur in malformed data. Found with afl. CVE-2015-5726 * SECURITY: The BER decoder would allocate a fairly arbitrary amount of memory in a length field, even if there was no chance the read request would succeed. This might cause the process to run out of memory or invoke the OOM killer. Found with afl. CVE-2015-5727 * The TLS heartbeat extension is deprecated and unless strong arguments are raised in its favor it will be removed in a future release. Comment at https://github.com/randombit/botan/issues/187 * The x86-32 assembly versions of MD4, MD5, SHA-1, and Serpent and the x86-64 version of SHA-1 have been removed. With compilers from this decade the C++ versions are significantly faster. The SSE2 versions of SHA-1 and Serpent remain, as they are still the fastest version for processors with SIMD extensions. GH #216 * BigInt::to_u32bit would fail if the value was exactly 32 bits. GH #220 * Botan is now fully compaitible with _GLIBCXX_DEBUG. GH #73 * BigInt::random_integer distribution was not uniform. GH #108 * Added unit testing framework Catch. GH #169 * Fix `make install`. GH #181, #186 * Public header `fs.h` moved to `internal/filesystem.h`. Added filesystem support for MSVC 2013 when boost is not available, allowing tests to run on those systems. GH #198, #199 * Added os "android" and fix Android compilation issues. GH #203 * Drop support for Python 2.6 for all Botan Python scripts. GH #217 Version 1.10.10, 2015-08-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * SECURITY: The BER decoder would crash due to reading from offset 0 of an empty vector if it encountered a BIT STRING which did not contain any data at all. As the type requires a 1 byte field this is not valid BER but could occur in malformed data. Found with afl. CVE-2015-5726 * SECURITY: The BER decoder would allocate a fairly arbitrary amount of memory in a length field, even if there was no chance the read request would succeed. This might cause the process to run out of memory or invoke the OOM killer. Found with afl. CVE-2015-5727 * Due to an ABI incompatible (though not API incompatible) change in this release, the version number of the shared object has been increased. * The default TLS policy no longer allows RC4. * Fix a signed integer overflow in Blue Midnight Wish that may cause incorrect computations or undefined behavior. Version 1.11.18, 2015-07-05 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * In this release Botan has switched VCS from ``monotone`` to ``git``, and is now hosted on github at https://github.com/randombit/botan * The TLS client called ``std::set_difference`` on an invalid iterator pair. This could potentially lead to a crash depending on the compiler and STL implementation. It also would trigger assertion failures when using checked iterators. GH #73 * Remove code constructs which triggered errors under MSVC and GCC debug iterators. The primary of these was an idiom of ``&vec[x]`` to create a pointer offset of a ``std::vector``. This failed when x was set equal to ``vec.size()`` to create the one-past-the-end address. The pointer in question was never dereferenced, but it triggered the iterator debugging checks which prevented using these valuble analysis tools. From Simon Warta and Daniel Seither. GH #125 * Several incorrect or missing module dependencies have been fixed. These often prevented a successful build of a minimized amalgamation when only a small set of algorithms were specified. GH #71 From Simon Warta. * Add an initial binding to OCaml. Currently only hashes, RNGs, and bcrypt are supported. * The default key size generated by the ``keygen`` tool has increased to 2048 bits. From Rene Korthaus. * The ``Botan_types`` namespace, which contained ``using`` declarations for (just) ``Botan::byte`` and ``Botan::u32bit``, has been removed. Any use should be replaced by ``using`` declarations for those types directly. Version 1.11.17, 2015-06-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * All support for the insecure RC4 stream cipher has been removed from the TLS implementation. * Fix decoding of TLS maximum fragment length. Regardless of what value was actually negotiated, TLS would treat it as a negotiated limit of 4096. * Fix the configure.py flag ``--disable-aes-ni`` which did nothing of the sort. * Fixed nmake clean target. GitHub #104 * Correct buffering logic in ``Compression_Filter``. GitHub #93 and #95 Version 1.11.16, 2015-03-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * TLS has changed from using the non-standard NPN extension to the IETF standardized ALPN extension for negotiating an application-level protocol. Unfortunately the semantics of the exchange have changed with ALPN. Using NPN, the server offered a list of protocols it advertised, and then the client chose its favorite. With ALPN, the client offers a list of protocols and the server chooses. The the signatures of both the TLS::Client and TLS::Server constructors have changed to support this new flow. * Optimized ECDSA signature verification thanks to an observation by Dr. Falko Strenzke. On some systems verifications are between 1.5 and 2 times faster than in 1.11.15. * RSA encrypt and decrypt operations using OpenSSL have been added. * Public key operation types now handle all aspects of the operation, such as hashing and padding for signatures. This change allows supporting specialized implementations which only support particular padding types. * Added global timeout to HMAC_RNG entropy reseed. The defaults are the values set in the build.h macros ``BOTAN_RNG_AUTO_RESEED_TIMEOUT`` and ``BOTAN_RNG_RESEED_DEFAULT_TIMEOUT``, but can be overriden on a specific poll with the new API call reseed_with_timeout. * Fixed Python cipher update_granularity() and default_nonce_length() functions * The library now builds on Visual C++ 2013 * The GCM update granularity was reduced from 4096 to 16 bytes. * Fix a bug that prevented building the amalgamation until a non-amalgamation configuration was performed first in the same directory. * Add Travis CI integration. Github pull 60. Version 1.11.15, 2015-03-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Support for RC4 in TLS, already disabled by default, is now deprecated. The RC4 ciphersuites will be removed entirely in a future release. * A bug in ffi.cpp meant Python could only encrypt. Github issue 53. * When comparing two ASN.1 algorithm identifiers, consider empty and NULL parameters the same. * Fixed memory leaks in TLS and cipher modes introduced in 1.11.14 * MARK-4 failed when OpenSSL was enabled in the build in 1.11.14 because the OpenSSL version ignored the skip parameter. * Fix compilation problem on OS X/clang * Use BOTAN_NOEXCEPT macro to work around lack of noexcept in VS 2013 Version 1.11.14, 2015-02-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The global state object previously used by the library has been removed. This includes the global PRNG. The library can be safely initialized multiple times without harm. The engine code has also been removed, replaced by a much lighter-weight object registry system which provides lookups in faster time and with less memory overhead than the previous approach. One caveat of the current system with regards to static linking: because only symbols already mentioned elsewhere in the program are included in the final link step, few algorithms will be available through the lookup system by default, even though they were compiled into the library. Your application must explicitly reference the types you require or they will not end up being available in the final binary. See also Github issue #52 If you intend to build your application against a static library and don't want to explicitly reference each algo object you might attempt to look up by string, consider either building with ``--via-amalgamation``, or else (much simpler) using the amalgamation directly. * The new ``ffi`` submodule provides a simple C API/ABI for a number of useful operations (hashing, ciphers, public key operations, etc) which is easily accessed using the FFI modules included in many languages. * A new Python wrapper (in ``src/lib/python/botan.py``) using ``ffi`` and the Python ``ctypes`` module is available. The old Boost.Python wrapper has been removed. * Add specialized reducers for P-192, P-224, P-256, and P-384 * OCB mode, which provides a fast and constant time AEAD mode without requiring hardware support, is now supported in TLS, following draft-zauner-tls-aes-ocb-01. Because this specification is not yet finalized is not yet enabled by the default policy, and the ciphersuite numbers used are in the experimental range and may conflict with other uses. * Add ability to read TLS policy from a text file using ``TLS::Text_Policy``. * The amalgamation now splits off any ISA specific code (for instance, that requiring SSSE3 instruction sets) into a new file named (for instance) ``botan_all_ssse3.cpp``. This allows the main amalgamation file to be compiled without any special flags, so ``--via-amalgamation`` builds actually work now. This is disabled with the build option ``--single-amalgamation-file`` * PBKDF and KDF operations now provide a way to write the desired output directly to an application-specified area rather than always allocating a new heap buffer. * HKDF, previously provided using a non-standard interface, now uses the standard KDF interface and is retrievable using get_kdf. * It is once again possible to build the complete test suite without requiring any boost libraries. This is currently only supported on systems supporting the readdir interface. * Remove use of memset_s which caused problems with amalgamation on OS X. Github 42, 45 * The memory usage of the counter mode implementation has been reduced. Previously it encrypted 256 blocks in parallel as this leads to a slightly faster counter increment operation. Instead CTR_BE simply encrypts a buffer equal in size to the advertised parallelism of the cipher implementation. This is not measurably slower, and dramatically reduces the memory use of CTR mode. * The memory allocator available on Unix systems which uses mmap and mlock to lock a pool of memory now checks environment variable BOTAN_MLOCK_POOL_SIZE and interprets it as an integer. If the value set to a smaller value then the library would originally have allocated (based on resource limits) the user specified size is used instead. You can also set the variable to 0 to disable the pool entirely. Previously the allocator would consume all available mlocked memory, this allows botan to coexist with an application which wants to mlock memory for its own uses. * The botan-config script previously installed on Unix systems has been removed. Its functionality is replaced by the ``config`` command of the ``botan`` tool executable, for example ``botan config cflags`` instead of ``botan-config --cflags``. * Added a target for POWER8 processors Version 1.11.13, 2015-01-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * All support for the insecure SSLv3 protocol and the server support for processing SSLv2 client hellos has been removed. * The command line tool now has ``tls_proxy`` which negotiates TLS with clients and forwards the plaintext to a specified port. * Add MCEIES, a McEliece-based integrated encryption system using AES-256 in OCB mode for message encryption/authentication. * Add DTLS-SRTP negotiation defined in RFC 5764 * Add SipHash * Add SHA-512/256 * The format of serialized TLS sessions has changed. Additiionally, PEM formatted sessions now use the label of "TLS SESSION" instead of "SSL SESSION" * Serialized TLS sessions are now encrypted using AES-256/GCM instead of a CBC+HMAC construction. * The cryptobox_psk module added in 1.11.4 and previously used for TLS session encryption has been removed. * When sending a TLS heartbeat message, the number of pad bytes to use can now be specified, making it easier to use for PMTU discovery. * If available, zero_mem now uses RtlSecureZeroMemory or memset_s instead of a byte-at-a-time loop. * The functions base64_encode and base64_decode would erroneously throw an exception if passed a zero-length input. Github issue 37. * The Python install script added in version 1.11.10 failed to place the headers into a versioned subdirectory. * Fix the install script when running under Python3. * Avoid code that triggers iterator debugging asserts under MSVC 2013. Github pull 36 from Simon Warta. Version 1.11.12, 2015-01-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add Curve25519. The implementation is based on curve25519-donna-c64.c by Adam Langley. New (completely non-standard) OIDs and formats for encrypting Curve25519 keys under PKCS #8 and including them in certificates and CRLs have been defined. * Add Poly1305, based on the implementation poly1305-donna by Andrew Moon. * Add the ChaCha20Poly1305 AEADs defined in draft-irtf-cfrg-chacha20-poly1305-03 and draft-agl-tls-chacha20poly1305-04. * Add ChaCha20Poly1305 ciphersuites for TLS compatible with Google's servers following draft-agl-tls-chacha20poly1305-04 * When encrypted as PKCS #8 structures, Curve25519 and McEliece private keys default to using AES-256/GCM instead of AES-256/CBC * Define OIDs for OCB mode with AES, Serpent and Twofish. Version 1.11.11, 2014-12-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The Sqlite3 wrapper has been abstracted to a simple interface for SQL dbs in general, though Sqlite3 remains the only implementation. The main logic of the TLS session manager which stored encrypted sessions to a Sqlite3 database (``TLS::Session_Manager_SQLite``) has been moved to the new ``TLS::Session_Manager_SQL``. The Sqlite3 manager API remains the same but now just subclasses ``TLS::Session_Manager_SQL`` and has a constructor instantiate the concrete database instance. Applications which would like to use a different db can now do so without having to reimplement the session cache logic simply by implementing a database wrapper subtype. * The CryptGenRandom entropy source is now also used on MinGW. * The system_rng API is now also available on systems with CryptGenRandom * With GCC use -fstack-protector for linking as well as compiling, as this is required on MinGW. Github issue 34. * Fix missing dependency in filters that caused compilation problem in amalgamation builds. Github issue 33. * SSLv3 support is officially deprecated and will be removed in a future release. Version 1.10.9, 2014-12-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed EAX tag verification to run in constant time * The default TLS policy now disables SSLv3. * A crash could occur when reading from a blocking random device if the device initially indicated that entropy was available but a concurrent process drained the entropy pool before the read was initiated. * Fix decoding indefinite length BER constructs that contain a context sensitive tag of zero. Github pull 26 from Janusz Chorko. * The ``botan-config`` script previously tried to guess its prefix from the location of the binary. However this was error prone, and now the script assumes the final installation prefix matches the value set during the build. Github issue 29. Version 1.11.10, 2014-12-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * An implementation of McEliece code-based public key encryption based on INRIA's HyMES and secured against a variety of side-channels was contributed by cryptosource GmbH. The original version is LGPL but cryptosource has secured permission to release an adaptation under a BSD license. A CCA2-secure KEM scheme is also included. The implementation is further described in http://www.cryptosource.de/docs/mceliece_in_botan.pdf and http://cryptosource.de/news_mce_in_botan_en.html * DSA and ECDSA now create RFC 6979 deterministic signatures. * Add support for TLS fallback signaling (draft-ietf-tls-downgrade-scsv-00). Clients will send a fallback SCSV if the version passed to the Client constructor is less than the latest version supported by local policy, so applications implementing fallback are protected. Servers always check the SCSV. * In previous versions a TLS::Server could service either TLS or DTLS connections depending on policy settings and what type of client hello it received. This has changed and now a Server object is initialized for either TLS or DTLS operation. The default policy previously prohibited DTLS, precisely to prevent a TCP server from being surprised by a DTLS connection. The default policy now allows TLS v1.0 or higher or DTLS v1.2. * Fixed a bug in CCM mode which caused it to produce incorrect tags when used with a value of L other than 2. This affected CCM TLS ciphersuites, which use L=3. Thanks to Manuel Pégourié-Gonnard for the anaylsis and patch. Bugzilla 270. * DTLS now supports timeouts and handshake retransmits. Timeout checking is triggered by the application calling the new TLS::Channel::timeout_check. * Add a TLS policy hook to disable putting the value of the local clock in hello random fields. * All compression operations previously available as Filters are now performed via the Transformation API, which minimizes memory copies. Compression operations are still available through the Filter API using new general compression/decompression filters in comp_filter.h * The zlib module now also supports gzip compression and decompression. * Avoid a crash in low-entropy situations when reading from /dev/random, when select indicated the device was readable but by the time we start the read the entropy pool had been depleted. * The Miller-Rabin primality test function now takes a parameter allowing the user to directly specify the maximum false negative probability they are willing to accept. * PKCS #8 private keys can now be encrypted using GCM mode instead of unauthenticated CBC. The default remains CBC for compatibility. * The default PKCS #8 encryption scheme has changed to use PBKDF2 with SHA-256 instead of SHA-1 * A specialized reducer for P-521 was added. * On Linux the mlock allocator will use MADV_DONTDUMP on the pool so that the contents are not included in coredumps. * A new interface for directly using a system-provided PRNG is available in system_rng.h. Currently only systems with /dev/urandom are supported. * Fix decoding indefinite length BER constructs that contain a context sensitive tag of zero. Github pull 26 from Janusz Chorko. * The GNU MP engine has been removed. * Added AltiVec detection for POWER8 processors. * Add a new install script written in Python which replaces shell hackery in the makefiles. * Various modifications to better support Visual C++ 2013 and 2015. Github issues 11, 17, 18, 21, 22. Version 1.10.8, 2014-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * SECURITY: Fix a bug in primality testing introduced in 1.8.3 which caused only a single random base, rather than a sequence of random bases, to be used in the Miller-Rabin test. This increased the probability that a non-prime would be accepted, for instance a 1024 bit number would be incorrectly classed as prime with probability around 2^-40. Reported by Jeff Marrison. CVE-2014-9742 * The key length limit on HMAC has been raised to 512 bytes, allowing the use of very long passphrases with PBKDF2. Version 1.11.9, 2014-04-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * SECURITY: Fix a bug in primality testing introduced in 1.8.3 which caused only a single random base, rather than a sequence of random bases, to be used in the Miller-Rabin test. This increased the probability that a non-prime would be accepted, for instance a 1024 bit number would be incorrectly classed as prime with probability around 2^-40. Reported by Jeff Marrison. CVE-2014-9742 * X.509 path validation now returns a set of all errors that occurred during validation, rather than immediately returning the first detected error. This prevents a seemingly innocuous error (such as an expired certificate) from hiding an obviously serious error (such as an invalid signature). The Certificate_Status_Code enum is now ordered by severity, and the most severe error is returned by Path_Validation_Result::result(). The entire set of status codes is available with the new all_statuses call. * Fixed a bug in OCSP response decoding which would cause an error when attempting to decode responses from some widely used responders. * An implementation of HMAC_DRBG RNG from NIST SP800-90A has been added. Like the X9.31 PRNG implementation, it uses another underlying RNG for seeding material. * An implementation of the RFC 6979 deterministic nonce generator has been added. * Fix a bug in certificate path validation which prevented successful validation if intermediate certificates were presented out of order. * Fix a bug introduced in 1.11.5 which could cause crashes or other incorrect behavior when a cipher mode filter was followed in the pipe by another filter, and that filter had a non-empty start_msg. * The types.h header now uses stdint.h rather than cstdint to avoid problems with Clang on OS X. Version 1.11.8, 2014-02-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The ``botan`` command line application introduced in 1.11.7 is now installed along with the library. * A bug in certificate path validation introduced in 1.11.6 which caused all CRL signature checks to fail has been corrected. * The ChaCha20 stream cipher has been added. * The ``Transformation`` class no longer implements an interface for keying, this has been moved to a new subclass ``Keyed_Transformation``. * The ``Algorithm`` class, which previously acted as a global base for various types (ciphers, hashes, etc) has been removed. * CMAC now supports 256 and 512 bit block ciphers, which also allows the use of larger block ciphers with EAX mode. In particular this allows using Threefish in EAX mode. * The antique PBES1 private key encryption scheme (which only supports DES or 64-bit RC2) has been removed. * The Square, Skipjack, and Luby-Rackoff block ciphers have been removed. * The Blue Midnight Wish hash function has been removed. * Skein-512 no longer supports output lengths greater than 512 bits. * Skein did not reset its internal state properly if clear() was called, causing it to produce incorrect results for the following message. It was reset correctly in final() so most usages should not be affected. * A number of public key padding schemes have been renamed to match the most common notation; for instance EME1 is now called OAEP and EMSA4 is now called PSSR. Aliases are set which should allow all current applications to continue to work unmodified. * A bug in CFB encryption caused a few bytes past the end of the final block to be read. The actual output was not affected. * Fix compilation errors in the tests that occurred with minimized builds. Contributed by Markus Wanner. * Add a new ``--destdir`` option to ``configure.py`` which controls where the install target will place the output. The ``--prefix`` option continues to set the location where the library expects to be eventually installed. * Many class destructors which previously deleted memory have been removed in favor of using ``unique_ptr``. * Various portability fixes for Clang, Windows, Visual C++ 2013, OS X, and x86-32. Version 1.11.7, 2014-01-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Botan's basic numeric types are now defined in terms of the C99/C++11 standard integer types. For instance ``u32bit`` is now a typedef for ``uint32_t``, and both names are included in the library namespace. This should not result in any application-visible changes. * There are now two executable outputs of the build, ``botan-test``, which runs the tests, and ``botan`` which is used as a driver to call into various subcommands which can also act as examples of library use, much in the manner of the ``openssl`` command. It understands the commands ``base64``, ``asn1``, ``x509``, ``tls_client``, ``tls_server``, ``bcrypt``, ``keygen``, ``speed``, and various others. As part of this change many obsolete, duplicated, or one-off examples were removed, while others were extended with new functionality. Contributions of new subcommands, new bling for exising ones, or documentation in any form is welcome. * Fix a bug in Lion, which was broken by a change in 1.11.0. The problem was not noticed before as Lion was also missing a test vector in previous releases. Version 1.10.7, 2013-12-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * OAEP had two bugs, one of which allowed it to be used even if the key was too small, and the other of which would cause a crash during decryption if the EME data was too large for the associated key. Version 1.11.6, 2013-12-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The Boost filesystem and asio libraries are now being used by default. Pass ``--without-boost`` to ``configure.py`` to disable. * The default TLS policy no longer allows SSLv3 or RC4. * OAEP had two bugs, one of which allowed it to be used even if the key was too small, and the other of which would cause a crash during decryption if the EME data was too large for the associated key. * GCM mode now uses the Intel clmul instruction when available * Add the Threefish-512 tweakable block cipher, including an AVX2 version * Add SIV (from :rfc:`5297`) as a nonce-based AEAD * Add HKDF (from :rfc:`5869`) using an experimental PRF interface * Add HTTP utility functions and OCSP online checking * Add TLS::Policy::acceptable_ciphersuite hook to disable ciphersuites on an ad-hoc basis. * TLS::Session_Manager_In_Memory's constructor now requires a RNG Version 1.10.6, 2013-11-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The device reading entropy source now attempts to read from all available devices. Previously it would break out early if a partial read from a blocking source occurred, not continuing to read from a non-blocking device. This would cause the library to fall back on slower and less reliable techniques for collecting PRNG seed material. Reported by Rickard Bellgrim. * HMAC_RNG (the default PRNG implementation) now automatically reseeds itself periodically. Previously reseeds only occurred on explicit application request. * Fix an encoding error in EC_Group when encoding using EC_DOMPAR_ENC_OID. Reported by fxdupont on github. * In EMSA2 and Randpool, avoid calling name() on objects after deleting them if the provided algorithm objects are not suitable for use. Found by Clang analyzer, reported by Jeffrey Walton. * If X509_Store was copied, the u32bit containing how long to cache validation results was not initialized, potentially causing results to be cached for significant amounts of time. This could allow a certificate to be considered valid after its issuing CA's cert expired. Expiration of the end-entity cert is always checked, and reading a CRL always causes the status to be reset, so this issue does not affect revocation. Found by Coverity scanner. * Avoid off by one causing a potentially unterminated string to be passed to the connect system call if the library was configured to use a very long path name for the EGD socket. Found by Coverity Scanner. * In PK_Encryptor_EME, PK_Decryptor_EME, PK_Verifier, and PK_Key_Agreement, avoid dereferencing an unitialized pointer if no engine supported operations on the key object given. Found by Coverity scanner. * Avoid leaking a file descriptor in the /dev/random and EGD entropy sources if stdin (file descriptor 0) was closed. Found by Coverity scanner. * Avoid a potentially undefined operation in the bit rotation operations. Not known to have caused problems under any existing compiler, but might have caused problems in the future. Caught by Clang sanitizer, reported by Jeffrey Walton. * Increase default hash iterations from 10000 to 50000 in PBES1 and PBES2 * Add a fix for mips64el builds from Brad Smith. Version 1.11.5, 2013-11-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The TLS callback signatures have changed - there are now two distinct callbacks for application data and alerts. TLS::Client and TLS::Server have constructors which continue to accept the old callback and use it for both operations. * The entropy collector that read from randomness devices had two bugs - it would break out of the poll as soon as any read succeeded, and it selected on each device individually. When a blocking source was first in the device list and the entropy pool was running low, the reader might either block in select until eventually timing out (continuing on to read from /dev/urandom instead), or read just a few bytes, skip /dev/urandom, fail to satisfy the entropy target, and the poll would continue using other (slower) sources. This caused substantial performance/latency problems in RNG heavy applications. Now all devices are selected over at once, with the effect that a full read from urandom always occurs, along with however much (if any) output is available from blocking sources. * Previously AutoSeeded_RNG referenced a globally shared PRNG instance. Now each instance has distinct state. * The entropy collector that runs Unix programs to collect statistical data now runs multiple processes in parallel, greatly reducing poll times on some systems. * The Randpool RNG implementation was removed. * All existing cipher mode implementations (such as CBC and XTS) have been converted from filters to using the interface previously provided by AEAD modes which allows for in-place message processing. Code which directly references the filter objects will break, but an adaptor filter allows usage through get_cipher as usual. * An implementation of CCM mode from RFC 3601 has been added, as well as CCM ciphersuites for TLS. * The implementation of OCB mode now supports 64 and 96 bit tags * Optimized computation of XTS tweaks, producing a substantial speedup * Add support for negotiating Brainpool ECC curves in TLS * TLS v1.2 will not negotiate plain SHA-1 signatures by default. * TLS channels now support sending a ``std::vector`` * Add a generic 64x64->128 bit multiply instruction operation in mul128.h * Avoid potentially undefined operations in the bit rotation operations. Not known to have caused problems under existing compilers but might break in the future. Found by Clang sanitizer, reported by Jeffrey Walton. Version 1.11.4, 2013-07-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * CPU specific extensions are now always compiled if support for the operations is available at build time, and flags enabling use of extra operations (such as SSE2) are only included when compiling files which specifically request support. This means, for instance, that the SSSE3 and AES-NI implementations of AES are always included in x86 builds, relying on runtime cpuid checking to prevent their use on CPUs that do not support those operations. * The default TLS policy now only accepts TLS, to minimize surprise for servers which might not expect to negotiate DTLS. Previously a server would by default negotiate either protocol type (clients would only accept the same protocol type as they offered). Applications which use DTLS or combined TLS/DTLS need to override ``Policy::acceptable_protocol_version``. * The TLS channels now accept a new parameter specifying how many bytes to preallocate for the record handling buffers, which allows an application some control over how much memory is used at runtime for a particular connection. * Applications can now send arbitrary TLS alert messages using ``TLS::Channel::send_alert`` * A new TLS policy ``NSA_Suite_B_128`` is available, which will negotiate only the 128-bit security NSA Suite B. See :rfc:`6460` for more information about Suite B. * Adds a new interface for benchmarking, ``time_algorithm_ops``, which returns a map of operations to operations per second. For instance now both encrypt and decrypt speed of a block cipher can be checked, as well as the key schedule of all keyed algorithms. It additionally supports AEAD modes. * Rename ARC4 to RC4 Version 1.11.3, 2013-04-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add a new interface for AEAD modes (``AEAD_Mode``). * Implementations of the OCB and GCM authenticated cipher modes are now included. * Support for TLS GCM ciphersuites is now available. * A new TLS policy mechanism ``TLS::Policy::server_uses_own_ciphersuite_preferences`` controls how a server chooses a ciphersuite. Previously it always chose its most preferred cipher out of the client's list, but this can allow configuring a server to choose by the client's preferences instead. * ``Keyed_Filter`` now supports returning a ``Key_Length_Specification`` so the full details of what keylengths are supported is now available in keyed filters. * The experimental and rarely used Turing and WiderWAKE stream ciphers have been removed * New functions for symmetric encryption are included in cryptobox.h though interfaces and formats are subject to change. * A new function ``algorithm_kat_detailed`` returns a string providing information about failures, instead of just a pass/fail indicator as in ``algorithm_kat``. Version 1.10.5, 2013-03-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A potential crash in the AES-NI implementation of the AES-192 key schedule (caused by misaligned loads) has been fixed. * A previously conditional operation in Montgomery multiplication and squaring is now always performed, removing a possible timing channel. * Use correct flags for creating a shared library on OS X under Clang. * Fix a compile time incompatibility with Visual C++ 2012. Version 1.11.2, 2013-03-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A bug in the release script caused the ``botan_version.py`` included in 1.11.1`` to be invalid, which required a manual edit to fix (Bugzilla 226) * Previously ``clear_mem`` was implemented by an inlined call to ``std::memset``. However an optimizing compiler might notice cases where the memset could be skipped in cases allowed by the standard. Now ``clear_mem`` calls ``zero_mem`` which is compiled separately and which zeros out the array through a volatile pointer. It is possible some compiler with some optimization setting (especially with something like LTO) might still skip the writes. It would be nice if there was an automated way to test this. * The new filter ``Threaded_Fork`` acts like a normal ``Fork``, sending its input to a number of different filters, but each subchain of filters in the fork runs in its own thread. Contributed by Joel Low. * The default TLS policy formerly preferred AES over RC4, and allowed 3DES by default. Now the default policy is to negotiate only either AES or RC4, and to prefer RC4. * New TLS ``Blocking_Client`` provides a thread per connection style API similar to that provided in 1.10 * The API of ``Credentials_Manager::trusted_certificate_authorities`` has changed to return a vector of ``Certificate_Store*`` instead of ``X509_Certificate``. This allows the list of trusted CAs to be more easily updated dynamically or loaded lazily. * The ``asn1_int.h`` header was split into ``asn1_alt_name.h``, ``asn1_attribute.h`` and ``asn1_time.h``. Version 1.10.4, 2013-01-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Avoid a conditional operation in the power mod implementations on if a nibble of the exponent was zero or not. This may help protect against certain forms of side channel attacks. * The SRP6 code was checking for invalid values as specified in RFC 5054, specifically values equal to zero mod p. However SRP would accept negative A/B values, or ones larger than p, neither of which should occur in a normal run of the protocol. These values are now rejected. Credits to Timothy Prepscius for pointing out these values are not normally used and probably signal something fishy. * The return value of version_string is now a compile time constant string, so version information can be more easily extracted from binaries. Version 1.11.1, 2012-10-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Initial support for DTLS (both v1.0 and v1.2) is available in this release, though it should be considered highly experimental. Currently timeouts and retransmissions are not handled. The ``TLS::Client`` constructor now takes the version to offer to the server. The policy hook ``TLS::Policy`` function `pref_version``, which previously controlled this, has been removed. `TLS::Session_Manager_In_Memory`` now chooses a random 256-bit key at startup and encrypts all sessions (using the existing `TLS::Session::encrypt`` mechanism) while they are stored in memory. This is primarily to reduce pressure on locked memory, as each session normally requires 48 bytes of locked memory for the master secret, whereas now only 32 bytes are needed total. This change may also make it slightly harder for an attacker to extract session data from memory dumps (eg with a cold boot attack). The keys used in TLS session encryption were previously uniquely determined by the master key. Now the encrypted session blob includes two 80 bit salts which are used in the derivation of the cipher and MAC keys. The ``secure_renegotiation`` flag is now considered an aspect of the connection rather than the session, which matches the behavior of other implementations. As the format has changed, sessions saved to persistent storage by 1.11.0 will not load in this version and vice versa. In either case this will not cause any errors, the session will simply not resume and instead a full handshake will occur. New policy hooks ``TLS::Policy::acceptable_protocol_version``, `TLS::Policy::allow_server_initiated_renegotiation``, and `TLS::Policy::negotiate_heartbeat_support`` were added. TLS clients were not sending a next protocol message during a session resumption, which would cause resumption failures with servers that support NPN if NPN was being offered by the client. A bug caused heartbeat requests sent by the counterparty during a handshake to be passed to the application callback as if they were heartbeat responses. Support for TLS key material export as specified in :rfc:`5705` has been added, available via ``TLS::Channel::key_material_export`` A new function ``Public_Key::estimated_strength`` returns an estimate for the upper bound of the strength of the key. For instance for an RSA key, it will return an estimate of how many operations GNFS would take to factor the key. A new ``Path_Validation_Result`` code has been added ``SIGNATURE_METHOD_TOO_WEAK``. By default signatures created with keys below 80 bits of strength (as estimated by ``estimated_strength``) are rejected. This level can be modified using a parameter to the ``Path_Validation_Restrictions`` constructor. The SRP6 code was checking for invalid values as specified in :rfc:`5054`, ones equal to zero mod p, however it would accept negative A/B values, or ones larger than p, neither of which should occur in a normal run of the protocol. These values are now rejected. Credits to Timothy Prepscius for pointing out these values are not normally used and probably signal something fishy. Several ``BigInt`` functions have been removed, including ``operator[]``, ``assign``, ``get_reg``, and ``grow_reg``. The version of ``data`` that returns a mutable pointer has been renamed ``mutable_data``. Support for octal conversions has been removed. The constructor ``BigInt(NumberType type, size_t n)`` has been removed, replaced by ``BigInt::power_of_2``. In 1.11.0, when compiled by GCC, the AES-NI implementation of AES-192 would crash if the mlock-based allocator was used due to an alignment issue. Version 1.11.0, 2012-07-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: In this release, many new features of C++11 are being used in the library. Currently GCC 4.7 and Clang 3.1 are known to work well. This version of the library cannot be compiled by or used with a C++98 compiler. There have been many changes and improvements to TLS. The interface is now purely event driven and does not directly interact with sockets. New TLS features include TLS v1.2 support, client certificate authentication, renegotiation, session tickets, and session resumption. Session information can be saved in memory or to an encrypted SQLite3 database. Newly supported TLS ciphersuite algorithms include using SHA-2 for message authentication, pre shared keys and SRP for authentication and key exchange, ECC algorithms for key exchange and signatures, and anonymous DH/ECDH key exchange. Support for OCSP has been added. Currently only client-side support exists. The API for X.509 path validation has changed, with ``x509_path_validate`` in x509path.h now handles path validation and ``Certificate_Store`` handles storage of certificates and CRLs. The memory container types have changed substantially. The ``MemoryVector`` and ``SecureVector`` container types have been removed, and an alias of ``std::vector`` using an allocator that clears memory named ``secure_vector`` is used for key material, with plain ``std::vector`` being used for everything else. The technique used for mlock'ing memory on Linux and BSD systems is much improved. Now a single page-aligned block of memory (the exact limit of what we can mlock) is mmap'ed, with allocations being done using a best-fit allocator and all metadata held outside the mmap'ed range, in an effort to make best use of the very limited amount of memory current Linux kernels allow unpriveledged users to lock. A filter using LZMA was contributed by Vojtech Kral. It is available if LZMA support was enabled at compilation time by passing ``--with-lzma`` to ``configure.py``. :rfc:`5915` adds some extended information which can be included in ECC private keys which the ECC key decoder did not expect, causing an exception when such a key was loaded. In particular, recent versions of OpenSSL use these fields. Now these fields are decoded properly, and if the public key value is included it is used, as otherwise the public key needs to be rederived from the private key. However the library does not include these fields on encoding keys for compatibility with software that does not expect them (including older versions of botan). Version 1.8.14, 2012-07-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The malloc allocator would return null instead of throwing in the event of an allocation failure, which could cause an application crash due to null pointer dereference where normally an exception would occur. * Recent versions of OpenSSL include extra information in ECC private keys, the presence of which caused an exception when such a key was loaded by botan. The decoding of ECC private keys has been changed to ignore these fields if they are set. * AutoSeeded_RNG has been changed to prefer ``/dev/random`` over ``/dev/urandom`` * Fix detection of s390x (Debian bug 638347) Version 1.10.3, 2012-07-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A change in 1.10.2 accidentally broke ABI compatibility with 1.10.1 and earlier versions, causing programs compiled against 1.10.1 to crash if linked with 1.10.2 at runtime. Recent versions of OpenSSL include extra information in ECC private keys, the presence of which caused an exception when such a key was loaded by botan. The decoding of ECC private keys has been changed to ignore these fields if they are set. Version 1.10.2, 2012-06-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Several TLS bugs were fixed in this release, including a major omission that the renegotiation extension was not being used. As the 1.10 implementation of TLS does not properly support renegotiation, the approach in this release is simply to send the renegotiation extension SCSV, which should protect the client against any handshake splicing. In addition renegotiation attempts are handled properly instead of causing handshake failures - all hello requests, and all client hellos after the initial negotiation, are ignored. Some bugs affecting DSA server authentication were also fixed. By popular request, ``Pipe::reset`` no longer requires that message processing be completed, a requirement that caused problems when a Filter's end_msg call threw an exception, after which point the Pipe object was no longer usable. Support for getting entropy using the rdrand instruction introduced in Intel's Ivy Bridge processors has been added. In previous releases, the ``CPUID::has_rdrand`` function was checking the wrong cpuid bit, and would false positive on AMD Bulldozer processors. An implementation of SRP-6a compatible with the specification in RFC 5054 is now available in ``srp6.h``. In 1.11, this is being used for TLS-SRP, but may be useful in other environments as well. An implementation of the Camellia block cipher was added, again largely for use in TLS. If ``clock_gettime`` is available on the system, hres_timer will poll all the available clock types. AltiVec is now detected on IBM POWER7 processors and on OpenBSD systems. The OpenBSD support was contributed by Brad Smith. The Qt mutex wrapper was broken and would not compile with any recent version of Qt. Taking this as a clear indication that it is not in use, it has been removed. Avoid setting the soname on OpenBSD, as it doesn't support it (Bugzilla 158) A compilation problem in the dynamic loader that prevented using dyn_load under MinGW GCC has been fixed. A common error for people using MinGW is to target GCC on Windows, however the 'Windows' target assumes the existence of Visual C++ runtime functions which do not exist in MinGW. Now, configuring for GCC on Windows will cause the configure.py to warn that likely you wanted to configure for either MinGW or Cygwin, not the generic Windows target. A bug in configure.py would cause it to interpret ``--cpu=s390x`` as ``s390``. This may have affected other CPUs as well. Now configure.py searches for an exact match, and only if no exact match is found will it search for substring matches. An incompatibility in configure.py with the subprocess module included in Python 3.1 has been fixed (Bugzilla 157). The exception catching syntax of configure.py has been changed to the Python 3.x syntax. This syntax also works with Python 2.6 and 2.7, but not with any earlier Python 2 release. A simple search and replace will allow running it under Python 2.5: ``perl -pi -e 's/except (.*) as (.*):/except $1, $2:/g' configure.py`` Note that Python 2.4 is not supported at all. Version 1.10.1, 2011-07-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A race condition in ``Algorithm_Factory`` could cause crashes in multithreaded code. * The return value of ``name`` has changed for GOST 28147-89 and Skein-512. GOST's ``name`` now includes the name of the sbox, and Skein's includes the personalization string (if nonempty). This allows an object to be properly roundtripped, which is necessary to fix the race condition described above. * A new distribution script is now included, as ``src/build-data/scripts/dist.py`` * The ``build.h`` header now includes, if available, an identifier of the source revision that was used. This identifier is also included in the result of ``version_string``. Version 1.8.13, 2011-07-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * A race condition in ``Algorithm_Factory`` could cause crashes in multithreaded code. Version 1.10.0, 2011-06-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Detection for the rdrand instruction being added to upcoming Intel Ivy Bridge processors has been added. * A template specialization of std::swap was added for the memory container types. Version 1.8.12, 2011-06-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * If EMSA3(Raw) was used for more than one signature, it would produce incorrect output. * Fix the --enable-debug option to configure.py * Improve OS detection on Cygwin * Fix compilation under Sun Studio 12 on Solaris * Fix a memory leak in the constructors of DataSource_Stream and DataSink_Stream which would occur if opening the file failed (Bugzilla 144) Version 1.9.18, 2011-06-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fourth release candidate for 1.10.0 * The GOST 34.10 verification operation was not ensuring that s and r were both greater than zero. This could potentially have meant it would have accepted an invalid all-zero signature as valid for any message. Due to how ECC points are internally represented it instead resulted in an exception being thrown. * A simple multiexponentation algorithm is now used in ECDSA and GOST-34.10 signature verification, leading to 20 to 25% improvements in ECDSA and 25% to 40% improvements in GOST-34.10 verification performance. * The internal representation of elliptic curve points has been modified to use Montgomery representation exclusively, resulting in reduced memory usage and a 10 to 20% performance improvement for ECDSA and ECDH. * In OAEP decoding, scan for the delimiter bytes using a loop that is written without conditionals so as to help avoid timing analysis. Unfortunately GCC at least is 'smart' enough to compile it to jumps anyway. * The SSE2 implementation of IDEA did not work correctly when compiled by Clang, because the trick it used to emulate a 16 bit unsigned compare in SSE (which doesn't contain one natively) relied on signed overflow working in the 'usual' way. A different method that doesn't rely on signed overflow is now used. * Add support for compiling SSL using Visual C++ 2010's TR1 implementation. * Fix a bug under Visual C++ 2010 which would cause ``hex_encode`` to crash if given a zero-sized input to encode. * A new build option ``--via-amalgamation`` will first generate the single-file amalgamation, then build the library from that single file. This option requires a lot of memory and does not parallelize, but the resulting library is smaller and may be faster. * On Unix, the library and header paths have been changed to allow parallel installation of different versions of the library. Headers are installed into ``/include/botan-1.9/botan``, libraries are named ``libbotan-1.9``, and ``botan-config`` is now namespaced (so in this release ``botan-config-1.9``). All of these embedded versions will be 1.10 in the upcoming stable release. * The soname system has been modified. In this release the library soname is ``libbotan-1.9.so.0``, with the full library being named ``libbotan-1.9.so.0.18``. The ``0`` is the ABI version, and will be incremented whenever a breaking ABI change is made. * TR1 support is not longer automatically assumed under older versions of GCC * Functions for base64 decoding that work standalone (without needing to use a pipe) have been added to ``base64.h`` * The function ``BigInt::to_u32bit`` was inadvertently removed in 1.9.11 and has been added back. * The function ``BigInt::get_substring`` did not work correctly with a *length* argument of 32. * The implementation of ``FD_ZERO`` on Solaris uses ``memset`` and assumes the caller included ``string.h`` on its behalf. Do so to fix compilation in the ``dev_random`` and ``unix_procs`` entropy sources. Patch from Jeremy C. Reed. * Add two different configuration targets for Atom, since some are 32-bit and some are 64-bit. The 'atom' target now refers to the 64-bit implementations, use 'atom32' to target the 32-bit processors. * The (incomplete) support for CMS and card verifiable certificates are disabled by default; add ``--enable-modules=cms`` or ``--enable-modules=cvc`` during configuration to turn them back on. Version 1.9.17, 2011-04-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Third release candidate for 1.10.0 * The format preserving encryption method currently available was presented in the header ``fpe.h`` and the functions ``fpe_encrypt`` and ``fpe_decrypt``. These were renamed as it is likely that other FPE schemes will be included in the future. The header is now ``fpe_fe1.h``, and the functions are named ``fe1_encrypt`` and ``fe1_decrypt``. * New options to ``configure.py`` control what tools are used for documentation generation. The ``--with-sphinx`` option enables using Sphinx to convert ReST into HTML; otherwise the ReST sources are installed directly. If ``--with-doxygen`` is used, Doxygen will run as well. Documentation generation can be triggered via the ``docs`` target in the makefile; it will also be installed by the install target on Unix. * A bug in 1.9.16 effectively disabled support for runtime CPU feature detection on x86 under GCC in that release. * A mostly internal change, all references to "ia32" and "amd64" have been changed to the vendor neutral and probably easier to understand "x86-32" and "x86-64". For instance, the "mp_amd64" module has been renamed "mp_x86_64", and the macro indicating x86-32 has changed from ``BOTAN_TARGET_ARCH_IS_IA32`` to ``BOTAN_TARGET_ARCH_IS_X86_32``. The classes calling assembly have also been renamed. * Similiarly to the above change, the AES implemenations using the AES-NI instruction set have been renamed from AES_XXX_Intel to AES_XXX_NI. * Systems that are identified as ``sun4u`` will default to compiling for 32-bit SPARCv9 code rather than 64-bit. This matches the still common convention for 32-bit SPARC userspaces. If you want 64-bit code on such as system, use ``--cpu=sparc64``. * Some minor fixes for compiling botan under the BeOS clone/continuation `Haiku `_. * Further updates to the documentation Version 1.9.16, 2011-04-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Second release candidate for 1.10.0 * The documentation, previously written in LaTeX, is now in reStructuredText suitable for processing by `Sphinx `_, which can generate nicely formatted HTML and PDFs. The documentation has also been greatly updated and expanded. * The class ``EC_Domain_Params`` has been renamed ``EC_Group``, with a typedef for backwards compatibility. * The ``EC_Group`` string constructor didn't understand the standard names like "secp160r1", forcing use of the OIDs. * Two constructors for ECDSA private keys, the one that creates a new random key, and the one that provides a preset private key as a ``BigInt``, have been merged. This matches the existing interface for DSA and DH keys. If you previously used the version taking a ``BigInt`` private key, you'll have to additionally pass in a ``RandomNumberGenerator`` object starting in this release. * It is now possible to create ECDH keys with a preset ``BigInt`` private key; previously no method for this was available. * The overload of ``generate_passhash9`` that takes an explicit algorithm identifier has been merged with the one that does not. The algorithm identifier code has been moved from the second parameter to the fourth. * Change shared library versioning to match the normal Unix conventions. Instead of ``libbotan-X.Y.Z.so``, the shared lib is named ``libbotan-X.Y.so.Z``; this allows the runtime linker to do its runtime linky magic. It can be safely presumed that any change in the major or minor version indicates ABI incompatibility. * Remove the socket wrapper code; it was not actually used by anything in the library, only in the examples, and you can use whatever kind of (blocking) socket interface you like with the SSL/TLS code. It's available as socket.h in the examples directory if you want to use it. * Disable the by-default 'strong' checking of private keys that are loaded from storage. You can always request key material sanity checking using Private_Key::check_key. * Bring back removed functions ``min_keylength_of``, ``max_keylength_of``, ``keylength_multiple_of`` in ``lookup.h`` to avoid breaking applications written against 1.8 Version 1.9.15, 2011-03-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * First release candidate for 1.10.0 * Modify how message expansion is done in SHA-256 and SHA-512. Instead of expanding the entire message at the start, compute them in the minimum number of registers. Values are computed 15 rounds before they are needed. On a Core i7-860, GCC 4.5.2, went from 143 to 157 MiB/s in SHA-256, and 211 to 256 MiB/s in SHA-512. * Pipe will delete empty output queues as soon as they are no longer needed, even if earlier messages still have data unread. However an (empty) entry in a deque of pointers will remain until all prior messages are completely emptied. * Avoid reading the SPARC ``%tick`` register on OpenBSD as unlike the Linux and NetBSD kernels, it will not trap and emulate it for us, causing a illegal instruction crash. * Improve detection and autoconfiguration for ARM processors. Thanks go out to the the `Tahoe-LAFS Software Foundation `_, who donated a Sheevaplug that I'll be using to figure out how to make the cryptographic primitives Tahoe-LAFS relies on faster, particularly targeting the ARMv5TE. Version 1.9.14, 2011-03-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for bcrypt, OpenBSD's password hashing scheme. * Add support for NIST's AES key wrapping algorithm, as described in :rfc:`3394`. It is available by including ``rfc3394.h``. * Fix an infinite loop in zlib filters introduced in 1.9.11 (Bugzilla 142) Version 1.9.13, 2011-02-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ GOST 34.10 signatures were being formatted in a way that was not compatible with other implemenations, and specifically how GOST is used in DNSSEC. The Keccak hash function was updated to the tweaked variant proposed for round 3 of the NIST hash competition. This version is not compatible with the previous algorithm. A new option ``--distribution-info`` was added to the configure script. It allows the user building the library to set any distribution-specific notes on the build, which are available as a macro ``BOTAN_DISTRIBUTION_INFO``. The default value is 'unspecified'. If you are building an unmodified version of botan (especially for distribution), and want to indicate to applications that this is the case, consider using ``--distribution-info=pristine``. If you are making any patches or modifications, it is recommended to use ``--distribution-info=[Distribution Name] [Version]``, for instance 'FooNix 1.9.13-r3'. Some bugs preventing compilation under Clang 2.9 and Sun Studio 12 were fixed. The DER/BER codecs use ``size_t`` instead of ``u32bit`` for small integers Version 1.9.12, 2010-12-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add the Keccak hash function * Fix compilation problems in Python wrappers * Fix compilation problem in OpenSSL engine * Update SQLite3 database encryption codec Version 1.9.11, 2010-11-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The TLS API has changed substantially and now relies heavily on TR1's ``std::function`` is now required. Additionally, it is required that all callers derive a subclass of TLS_Policy and pass it to a client or server object. Please remember that the TLS interface/API is currently unstable and will very likely change further before TLS is included in a stable release. A handshake failure that occurred when RC4 was negotiated has also been fixed. * Some possible timing channels in the implementations of Montgomery reduction and the IDEA key schedule were removed. The table-based AES implementation uses smaller tables in the first round to help make some timing/cache attacks harder. * The library now uses size_t instead of u32bit to represent lengths. Also the interfaces for the memory containers have changed substantially to better match STL container interfaces; MemoryRegion::append, MemoryRegion::destroy, and MemoryRegion::set were all removed, and several other functions, like clear and resize, have changed meaning. * Update Skein-512 to match the v1.3 specification * Fix a number of CRL encoding and decoding bugs * Counter mode now always encrypts 256 blocks in parallel * Use small tables in the first round of AES * Removed AES class: app must choose AES-128, AES-192, or AES-256 * Add hex encoding/decoding functions that can be used without a Pipe * Add base64 encoding functions that can be used without a Pipe * Add to_string function to X509_Certificate * Add support for dynamic engine loading on Windows * Replace BlockCipher::BLOCK_SIZE attribute with function block_size() * Replace HashFunction::HASH_BLOCK_SIZE attribute with hash_block_size() * Move PBKDF lookup to engine system * The IDEA key schedule has been changed to run in constant time * Add Algorithm and Key_Length_Specification classes * Switch default PKCS #8 encryption algorithm from AES-128 to AES-256 * Allow using PBKDF2 with empty passphrases * Add compile-time deprecation warnings for GCC, Clang, and MSVC * Support use of HMAC(SHA-256) and CMAC(Blowfish) in passhash9 * Improve support for Intel Atom processors * Fix compilation problems under Sun Studio and Clang Version 1.8.11, 2010-11-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a number of CRL encoding and decoding bugs * When building a debug library under VC++, use the debug runtime * Fix compilation under Sun Studio on Linux and Solaris * Add several functions for compatibility with 1.9 * In the examples, read most input files as binary * The Perl build script has been removed in this release Version 1.8.10, 2010-08-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Switch default PKCS #8 encryption algorithm from 3DES to AES-256 * Increase default hash iterations from 2048 to 10000 in PBES1 and PBES2 * Use small tables in the first round of AES * Add PBKDF typedef and get_pbkdf for better compatibility with 1.9 * Add version of S2K::derive_key taking salt and iteration count * Enable the /proc-walking entropy source on NetBSD * Fix the doxygen makefile target Version 1.9.10, 2010-08-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add a constant-time AES implementation using SSSE3. This code is based on public domain assembly written by `Mike Hamburg `_, and described in his CHES 2009 paper "Accelerating AES with Vector Permute Instructions". In addition to being constant time, it is also significantly faster than the table-based implementation on some processors. The current code has been tested with GCC 4.5, Visual C++ 2008, and Clang 2.8. * Support for dynamically loading Engine objects at runtime was also added. Currently only system that use ``dlopen``-style dynamic linking are supported. * On GCC 4.3 and later, use the byteswap intrinsic functions. * Drop support for building with Python 2.4 * Fix benchmarking of block ciphers in ECB mode * Consolidate the two x86 assembly engines * Rename S2K to PBKDF Version 1.9.9, 2010-06-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A new pure virtual function has been added to ``Filter``, ``name`` which simply returns some useful identifier for the object. Any out-of-tree ``Filter`` implementations will need to be updated. Add ``Keyed_Filter::valid_iv_length`` which makes it possible to query as to what IV length(s) a particular filter allows. Previously, partially because there was no such query mechanism, if a filter did not support IVs at all, then calls to ``set_iv`` would be silently ignored. Now an exception about the invalid IV length will be thrown. The default iteration count for the password based encryption schemes has been increased from 2048 to 10000. This should make password-guessing attacks against private keys encrypted with versions after this release somewhat harder. New functions for encoding public and private keys to binary, ``X509::BER_encode`` and ``PKCS8::BER_encode`` have been added. Problems compiling under Apple's version of GCC 4.2.1 and on 64-bit MIPS systems using GCC 4.4 or later were fixed. The coverage of Doxygen documentation comments has significantly improved in this release. Version 1.8.9, 2010-06-16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Use constant time multiplication in IDEA * Avoid possible timing attack against OAEP decoding * Add new X509::BER_encode and PKCS8::BER_encode * Enable DLL builds under Windows * Add Win32 installer support * Add support for the Clang compiler * Fix problem in semcem.h preventing build under Clang or GCC 3.4 * Fix bug that prevented creation of DSA groups under 1024 bits * Fix crash in GMP_Engine if library is shutdown and reinitialized and a PK algorithm was used after the second init * Work around problem with recent binutils in x86-64 SHA-1 * The Perl build script is no longer supported and refuses to run by default. If you really want to use it, pass ``--i-know-this-is-broken`` to the script. Version 1.9.8, 2010-06-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for wide multiplications on 64-bit Windows * Use constant time multiplication in IDEA * Avoid possible timing attack against OAEP decoding * Removed FORK-256; rarely used and it has been broken * Rename ``--use-boost-python`` to ``--with-boost-python`` * Skip building shared libraries on MinGW/Cygwin * Fix creation of 512 and 768 bit DL groups using the DSA kosherizer * Fix compilation on GCC versions before 4.3 (missing cpuid.h) * Fix compilation under the Clang compiler Version 1.9.7, 2010-04-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * TLS: Support reading SSLv2 client hellos * TLS: Add support for SEED ciphersuites (RFC 4162) * Add Comb4P hash combiner function * Fix checking of EMSA_Raw signatures with leading 0 bytes, valid signatures could be rejected in certain scenarios. Version 1.9.6, 2010-04-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * TLS: Add support for TLS v1.1 * TLS: Support server name indicator extension * TLS: Fix server handshake * TLS: Fix server using DSA certificates * TLS: Avoid timing channel between CBC padding check and MAC verification Version 1.9.5, 2010-03-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Numerous ECC optimizations * Fix GOST 34.10-2001 X.509 key loading * Allow PK_Signer's fault protection checks to be toggled off * Avoid using pool-based locking allocator if we can't mlock * Remove all runtime options * New BER_Decoder::{decode_and_check, decode_octet_string_bigint} * Remove SecureBuffer in favor of SecureVector length parameter * HMAC_RNG: Perform a poll along with user-supplied entropy * Fix crash in MemoryRegion if Allocator::get failed * Fix small compilation problem on FreeBSD Version 1.9.4, 2010-03-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add the Ajisai SSLv3/TLSv1.0 implementation * Add GOST 34.10-2001 public key signature scheme * Add SIMD implementation of Noekeon * Add SSE2 implementation of IDEA * Extend Salsa20 to support longer IVs (XSalsa20) * Perform XTS encryption and decryption in parallel where possible * Perform CBC decryption in parallel where possible * Add SQLite3 db encryption codec, contributed by Olivier de Gaalon * Add a block cipher cascade construction * Add support for password hashing for authentication (passhash9.h) * Add support for Win32 high resolution system timers * Major refactoring and API changes in the public key code * PK_Signer class now verifies all signatures before releasing them to the caller; this should help prevent a wide variety of fault attacks, though it does have the downside of hurting signature performance, particularly for DSA/ECDSA. * Changed S2K interface: derive_key now takes salt, iteration count * Remove dependency on TR1 shared_ptr in ECC and CVC code * Renamed ECKAEG to its more usual name, ECDH * Fix crash in GMP_Engine if library is shutdown and reinitialized * Fix an invalid memory read in MD4 * Fix Visual C++ static builds * Remove Timer class entirely * Switch default PKCS #8 encryption algorithm from 3DES to AES-128 * New configuration option, ``--gen-amalgamation``, creates a pair of files (``botan_all.cpp`` and ``botan_all.h``) which contain the contents of the library as it would have normally been compiled based on the set configuration. * Many headers are now explicitly internal-use-only and are not installed * Greatly improve the Win32 installer * Several fixes for Visual C++ debug builds Version 1.9.3, 2009-11-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add new AES implementation using Intel's AES instruction intrinsics * Add an implementation of format preserving encryption * Allow use of any hash function in X.509 certificate creation * Optimizations for MARS, Skipjack, and AES * Set macros for available SIMD instructions in build.h * Add support for using InnoSetup to package Windows builds * By default build a DLL on Windows Version 1.8.8, 2009-11-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Alter Skein-512 to match the tweaked 1.2 specification * Fix use of inline asm for access to x86 bswap function * Allow building the library without AES enabled * Add 'powerpc64' alias to ppc64 arch for Gentoo ebuild Version 1.9.2, 2009-11-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add SIMD version of XTEA * Support both SSE2 and AltiVec SIMD for Serpent and XTEA * Optimizations for SHA-1 and SHA-2 * Add AltiVec runtime detection * Fix x86 CPU identification with Intel C++ and Visual C++ Version 1.9.1, 2009-10-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Better support for Python and Perl wrappers * Add an implementation of Blue Midnight Wish (Round 2 tweak version) * Modify Skein-512 to match the tweaked 1.2 specification * Add threshold secret sharing (draft-mcgrew-tss-02) * Add runtime cpu feature detection for x86/x86-64 * Add code for general runtime self testing for hashes, MACs, and ciphers * Optimize XTEA; twice as fast as before on Core2 and Opteron * Convert CTR_BE and OFB from filters to stream ciphers * New parsing code for SCAN algorithm names * Enable SSE2 optimizations under Visual C++ * Remove all use of C++ exception specifications * Add support for GNU/Hurd and Clang/LLVM Version 1.8.7, 2009-09-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix processing multiple messages in XTS mode * Add --no-autoload option to configure.py, for minimized builds Version 1.9.0, 2009-09-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for parallel invocation of block ciphers where possible * Add SSE2 implementation of Serpent * Add Rivest's package transform (an all or nothing transform) * Minor speedups to the Turing key schedule * Fix processing multiple messages in XTS mode * Add --no-autoload option to configure.py, for minimized builds * The previously used configure.pl script is no longer supported Version 1.8.6, 2009-08-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add Cryptobox, a set of simple password-based encryption routines * Only read world-readable files when walking /proc for entropy * Fix building with TR1 disabled * Fix x86 bswap support for Visual C++ * Fixes for compilation under Sun C++ * Add support for Dragonfly BSD (contributed by Patrick Georgi) * Add support for the Open64 C++ compiler * Build fixes for MIPS systems running Linux * Minor changes to license, now equivalent to the FreeBSD/NetBSD license Version 1.8.5, 2009-07-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Change configure.py to work on stock Python 2.4 * Avoid a crash in Skein_512::add_data processing a zero-length input * Small build fixes for SPARC, ARM, and HP-PA processors * The test suite now returns an error code from main() if any tests failed Version 1.8.4, 2009-07-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a bug in nonce generation in the Miller-Rabin test Version 1.8.3, 2009-07-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add a new Python configuration script * Add the Skein-512 SHA-3 candidate hash function * Add the XTS block cipher mode from IEEE P1619 * Fix random_prime when generating a prime of less than 7 bits * Improve handling of low-entropy situations during PRNG seeding * Change random device polling to prefer /dev/urandom over /dev/random * Use an input insensitive implementation of same_mem instead of memcmp * Correct DataSource::discard_next to return the number of discarded bytes * Provide a default value for AutoSeeded_RNG::reseed * Fix Gentoo bug 272242 Version 1.8.2, 2009-04-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Make entropy polling more flexible and in most cases faster * GOST 28147 now supports multiple sbox parameters * Added the GOST 34.11 hash function * Fix botan-config problems on MacOS X Version 1.8.1, 2009-01-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Avoid a valgrind warning in es_unix.cpp on 32-bit Linux * Fix memory leak in PKCS8 load_key and encrypt_key * Relicense api.tex from CC-By-SA 2.5 to BSD * Fix botan-config on MacOS X, Solaris Version 1.8.0, 2008-12-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix compilation on Solaris with GCC Version 1.7.24, 2008-12-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a compatibility problem with SHA-512/EMSA3 signature padding * Fix bug preventing EGD/PRNGD entropy poller from working * Fix integer overflow in Pooling_Allocator::get_more_core (bug id #27) * Add EMSA3_Raw, a variant of EMSA3 called CKM_RSA_PKCS in PKCS #11 * Add support for SHA-224 in EMSA2 and EMSA3 PK signature padding schemes * Add many more test vectors for RSA with EMSA2, EMSA3, and EMSA4 * Wrap private structs in SSE2 SHA-1 code in anonymous namespace * Change configure.pl's CPU autodetection output to be more consistent * Disable using OpenSSL's AES due to crashes of unknown cause * Fix warning in /proc walking entropy poller * Fix compilation with IBM XLC for Cell 0.9-200709 Version 1.7.23, 2008-11-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Change to use TR1 (thus enabling ECDSA) with GCC and ICC * Optimize almost all hash functions, especially MD4 and Tiger * Add configure.pl options --{with,without}-{bzip2,zlib,openssl,gnump} * Change Timer to be pure virtual, and add ANSI_Clock_Timer * Cache socket descriptors in the EGD entropy source * Avoid bogging down startup in /proc walking entropy source * Remove Buffered_EntropySource helper class * Add a Default_Benchmark_Timer typedef in benchmark.h * Add examples using benchmark.h and Algorithm_Factory * Add ECC tests from InSiTo * Minor documentation updates Version 1.7.22, 2008-11-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add provider preferences to Algorithm_Factory * Fix memory leaks in PBE_PKCS5v20 and get_pbe introduced in 1.7.21 * Optimize AES encryption and decryption (about 10% faster) * Enable SSE2 optimized SHA-1 implementation on Intel Prescott CPUs * Fix nanoseconds overflow in benchmark code * Remove Engine::add_engine Version 1.7.21, 2008-11-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Make algorithm lookup much more configuable * Add facilities for runtime performance testing of algorithms * Drop use of entropy estimation in the PRNGs * Increase intervals between HMAC_RNG automatic reseeding * Drop InitializerOptions class, all options but thread safety Version 1.7.20, 2008-11-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Namespace pkg-config file by major and minor versions * Cache device descriptors in Device_EntropySource * Split base.h into {block_cipher,stream_cipher,mac,hash}.h * Removed get_mgf function from lookup.h Version 1.7.19, 2008-11-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add HMAC_RNG, based on a design by Hugo Krawczyk * Optimized the Turing stream cipher (about 20% faster on x86-64) * Modify Randpool's reseeding algorithm to poll more sources * Add a new AutoSeeded_RNG in auto_rng.h * OpenPGP_S2K changed to take hash object instead of name * Add automatic identification for Intel's Prescott processors Version 1.7.18, 2008-10-22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add Doxygen comments from InSiTo * Add ECDSA and ECKAEG benchmarks * Add configure.pl switch --with-tr1-implementation * Fix configure.pl's --with-endian and --with-unaligned-mem options * Added support for pkg-config * Optimize byteswap with x86 inline asm for Visual C++ by Yves Jerschow * Use const references to avoid copying overhead in CurveGFp, GFpModulus Version 1.7.17, 2008-10-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add missing ECDSA object identifiers * Fix error in x86 and x86-64 assembler affecting GF(p) math * Remove Boost dependency from GF(p) math * Modify botan-config to not print -L/usr/lib or -L/usr/local/lib * Add BOTAN_DLL macro to over 30 classes missing it * Rename the two SHA-2 base classes for consistency Version 1.7.16, 2008-10-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add several missing pieces needed for ECDSA and ECKAEG * Add Card Verifiable Certificates from InSiTo * Add SHA-224 from InSiTo * Add BSI variant of EMSA1 from InSiTo * Add GF(p) and ECDSA tests from InSiTo * Split ECDSA and ECKAEG into distinct modules * Allow OpenSSL and GNU MP engines to be built with public key algos disabled * Rename sha256.h to sha2_32.h and sha_64.h to sha2_64.h Version 1.7.15, 2008-10-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add GF(p) arithmetic from InSiTo * Add ECDSA and ECKAEG implementations from InSiTo * Minimize internal dependencies, allowing for smaller build configurations * Add new User Manual and Architecture Guide from FlexSecure GmbH * Alter configure.pl options for better autotools compatibility * Update build instructions for recent changes to configure.pl * Fix CPU detection using /proc/cpuinfo Version 1.7.14, 2008-09-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Split library into parts allowing modular builds * Add (very preliminary) CMS support to the main library * Some constructors now require object pointers instead of names * Support multiple implementations of the same algorithm * Build support for Pentium-M processors, from Derek Scherger * Build support for MinGW/MSYS, from Zbigniew Zagorski * Use inline assembly for bswap on 32-bit x86 Version 1.7.13, 2008-09-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add SSLv3 MAC, SSLv3 PRF, and TLS v1.0 PRF from Ajisai * Allow all examples to compile even if compression not enabled * Make CMAC's polynomial doubling operation a public class method * Use the -m64 flag when compiling with Sun Forte on x86-64 * Clean up and slightly optimize CMAC::final_result Version 1.7.12, 2008-09-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add x86 assembly for Visual Studio C++, by Luca Piccarreta * Add a Perl XS module, by Vaclav Ovsik * Add SWIG-based wrapper for Botan * Add SSE2 implementation of SHA-1, by Dean Gaudet * Remove the BigInt::sig_words cache due to bugs * Combined the 4 Blowfish sboxes, suggested by Yves Jerschow * Changed BigInt::grow_by and BigInt::grow_to to be non-const * Add private assignment operators to classes that don't support assignment * Benchmark RSA encryption and signatures * Added test programs for random_prime and ressol * Add high resolution timers for IA-64, HP-PA, S390x * Reduce use of the RNG during benchmarks * Fix builds on STI Cell PPU * Add support for IBM's XLC compiler * Add IETF 8192 bit MODP group Version 1.7.11, 2008-09-11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the Salsa20 stream cipher * Optimized Montgomery reduction, Karatsuba squaring * Added 16x16->32 word Comba multiplication and squaring * Use a much larger Karatsuba cutoff point * Remove bigint_mul_add_words * Inlined several BigInt functions * Add useful information to the generated build.h * Rename alg_{ia32,amd64} modules to asm_{ia32,amd64} * Fix the Windows build Version 1.7.10, 2008-09-05 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Public key benchmarks run using a selection of random keys * New benchmark timer options are clock_gettime, gettimeofday, times, clock * Including reinterpret_cast optimization for xor_buf in default header * Split byte swapping and word rotation functions into distinct headers * Add IETF modp 6144 group and 2048 and 3072 bit DSS groups * Optimizes BigInt right shift * Add aliases in DL_Group::Format enum * BigInt now caches the significant word count Version 1.6.5, 2008-08-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add noexec stack marker for GNU linker in assembly code * Fix autoconfiguration problem on x86 with GCC 4.2 and 4.3 Version 1.7.9, 2008-08-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Make clear() in most algorithm base classes a pure virtual * Add noexec stack marker for GNU linker in assembly code * Avoid string operations in ressol * Compilation fixes for MinGW and Visual Studio C++ 2008 * Some autoconfiguration fixes for Windows Version 1.7.8, 2008-07-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the block cipher Noekeon * Remove global deref_alias function * X509_Store takes timeout options as constructor arguments * Add Shanks-Tonelli algorithm, contributed by FlexSecure GmbH * Extend random_prime() for generating primes of any bit length * Remove Config class * Allow adding new entropy via base RNG interface * Reseeding a X9.31 PRNG also reseeds the underlying PRNG Version 1.7.7, 2008-06-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Remove the global PRNG object * The PK filter objects were removed * Add a test suite for the ANSI X9.31 PRNG * Much cleaner and (mostly) thread-safe reimplementation of es_ftw * Remove both default arguments to ANSI_X931_RNG's constructor * Remove the randomizing version of OctetString::change * Make the cipher and MAC to use in Randpool configurable * Move RandomNumberGenerator declaration to rng.h * RSA_PrivateKey will not generate keys smaller than 1024 bits * Fix an error decoding BER UNIVERSAL types with special taggings Version 1.7.6, 2008-05-05 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initial support for Windows DLLs, from Joel Low * Reset the position pointer when a new block is generated in X9.32 PRNG * Timer objects are now treated as entropy sources * Moved several ASN.1-related enums from enums.h to an appropriate header * Removed the AEP module, due to inability to test * Removed Global_RNG and rng.h * Removed system_clock * Removed Library_State::UI and the pulse callback logic Version 1.7.5, 2008-04-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The API of X509_CA::sign_request was altered to avoid race conditions * New type Pipe::message_id to represent the Pipe message number * Remove the Named_Mutex_Holder for a small performance gain * Removed several unused or rarely used functions from Config * Ignore spaces inside of a decimal string in BigInt::decode * Allow using a std::istream to initialize a DataSource_Stream object * Fix compilation problem in zlib compression module * The chunk sized used by Pooling_Allocator is now a compile time setting * The size of random blinding factors is now a compile time setting * The install target no longer tries to set a particular owner/group Version 1.7.4, 2008-03-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Use unaligned memory read/writes on systems that allow it, for performance * Assembly for x86-64 for accessing the bswap instruction * Use larger buffers in ARC4 and WiderWAKE for significant throughput increase * Unroll loops in SHA-160 for a few percent increase in performance * Fix compilation with GCC 3.2 in es_ftw and es_unix * Build fix for NetBSD systems * Prevent es_dev from being built except on Unix systems Version 1.6.4, 2008-03-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a compilation problem with Visual Studio C++ 2003 Version 1.7.3, 2008-01-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * New invocation syntax for configure.pl with several new options * Support for IPv4 addresses in a subject alternative name * New fast poll for the generic Unix entropy source (es_unix) * The es_file entropy source has been replaced by the es_dev module * The malloc allocator does not inherit from Pooling_Allocator anymore * The path that es_unix will search in are now fully user-configurable * Truncate X9.42 PRF output rather than allow counter overflow * PowerPC is now assumed to be big-endian Version 1.7.2, 2007-10-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initialize the global library state lazily * Add plain CBC-MAC for backwards compatibility with old systems * Clean up some of the self test code * Throw a sensible exception if a DL_Group is not found * Truncate KDF2 output rather than allowing counter overflow * Add newly assigned OIDs for SHA-2 and DSA with SHA-224/256 * Fix a Visual Studio compilation problem in x509stat.cpp Version 1.6.3, 2007-07-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a race condition in the algorithm lookup cache * Fix problems building the memory pool on some versions of Visual C++ Version 1.7.1, 2007-07-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix a race condition in the algorithm object cache * HMAC key schedule optimization * The build header sets a macro defining endianness, if known * New word load/store abstraction allowing further optimization * Modify most of the library to avoid use the C-style casts * Use higher resolution timers in symmetric benchmarks Version 1.7.0, 2007-05-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * DSA parameter generation now follows FIPS 186-3 * Added OIDs for Rabin-Williams and Nyberg-Rueppel * Somewhat better support for out of tree builds * Minor optimizations for RC2 and Tiger * Documentation updates * Update the todo list Version 1.6.2, 2007-03-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix autodection on Athlon64s running Linux * Fix builds on QNX and compilers using STLport * Remove a call to abort() that crept into production Version 1.6.1, 2007-01-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix some base64 decoder bugs * Add a new option to base64 encoding, to always append a newline * Fix some build problems under Visual Studio with debug enabled * Fix a bug in BER_Decoder that was triggered under some compilers Version 1.6.0, 2006-12-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Minor cleanups versus 1.5.13 Version 1.5.13, 2006-12-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Compilation fixes for the bzip2, zlib, and GNU MP modules * Better support for Intel C++ and EKOpath C++ on x86-64 Version 1.5.12, 2006-10-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Cleanups in the initialization routines * Add some x86-64 assembly for multiply-add * Fix problems generating very small (below 384 bit) RSA keys * Support out of tree builds * Bring some of the documentation up to date * More improvements to the Python bindings Version 1.5.11, 2006-09-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Removed the Algorithm base class * Various cleanups in the public key inheritance hierarchy * Major overhaul of the configure/build setup * Added x86 assembler implementations of Serpent and low-level MPI code * Optimizations for the SHA-1 x86 assembler * Various improvements to the Python wrappers * Work around a Visual Studio compiler bug Version 1.5.10, 2006-08-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add x86 assembler versions of MD4, MD5, and SHA-1 * Expand InitializerOptions' language to support on/off switches * Fix definition of OID 2.5.4.8; was accidentally changed in 1.5.9 * Fix possible resource leaks in the mmap allocator * Slightly optimized buffering in MDx_HashFunction * Initialization failures are dealt with somewhat better * Add an example implementing Pollard's Rho algorithm * Better option handling in the test/benchmark tool * Expand the xor_ciph example to support longer keys * Some updates to the documentation Version 1.5.9, 2006-07-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed bitrot in the AEP engine * Fix support for marking certificate/CRL extensions as critical * Significant cleanups in the library state / initialization code * LibraryInitializer takes an explicit InitializerOptions object * Make Mutex_Factory an abstract class, add Default_Mutex_Factory * Change configuration access to using global_state() * Add support for global named mutexes throughout the library * Add some STL wrappers for the delete operator * Change how certificates are created to be more flexible and general Version 1.5.8, 2006-06-23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Many internal cleanups to the X.509 cert/CRL code * Allow for application code to support new X.509 extensions * Change the return type of X509_Certificate::{subject,issuer}_info * Allow for alternate character set handling mechanisms * Fix a bug that was slowing squaring performance somewhat * Fix a very hard to hit overflow bug in the C version of word3_muladd * Minor cleanups to the assembler modules * Disable es_unix module on FreeBSD due to build problem on FreeBSD 6.1 * Support for GCC 2.95.x has been dropped in this release Version 1.5.7, 2006-05-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Further, major changes to the BER/DER coding system * Updated the Qt mutex module to use Mutex_Factory * Moved the library global state object into an anonymous namespace * Drop the Visual C++ x86 assembly module due to bugs Version 1.5.6, 2006-03-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The low-level DER/BER coding system was redesigned and rewritten * Portions of the certificate code were cleaned up internally * Use macros to substantially clean up the GCC assembly code * Added 32-bit x86 assembly for Visual C++ (by Luca Piccarreta) * Avoid a couple of spurious warnings under Visual C++ * Some slight cleanups in X509_PublicKey::key_id Version 1.5.5, 2006-02-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a potential infinite loop in the memory pool code (Matt Johnston) * Made Pooling_Allocator::Memory_Block an actual class of sorts * Some small optimizations to the division and modulo computations * Cleaned up the implementation of some of the BigInt operators * Reduced use of dynamic memory allocation in low-level BigInt functions * A few simplifications in the Randpool mixing function * Removed power(), as it was not particularly useful (or fast) * Fixed some annoying bugs in the benchmark code * Added a real credits file Version 1.5.4, 2006-01-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Integrated x86 and amd64 assembly code, contributed by Luca Piccarreta * Fixed a memory access off-by-one in the Karatsuba code * Changed Pooling_Allocator's free list search to a log(N) algorithm * Merged ModularReducer with its only subclass, Barrett_Reducer * Fixed sign-handling bugs in some of the division and modulo code * Renamed the module description files to modinfo.txt * Further cleanups in the initialization code * Removed BigInt::add and BigInt::sub * Merged all the division-related functions into just divide() * Modified the functions to allow for better optimizations * Made the number of bits polled from an EntropySource user configurable * Avoid including in * Fixed some build problems with Sun Forte * Removed some dead code from bigint_modop * Fix the definition of same_mem Version 1.5.3, 2006-01-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Many optimizations in the low-level multiple precision integer code * Added hooks for assembly implementations of the MPI code * Support for the X.509 issuer alternative name extension in new certs * Fixed a bug in the decompression modules; found and patched by Matt Johnston * New Windows mutex module (mux_win32), by Luca Piccarreta * Changed the Windows timer module to use QueryPerformanceCounter * mem_pool.cpp was using std::set iterators instead of std::multiset ones * Fixed a bug in X509_CA preventing users from disabling particular extensions * Fixed the mp_asm64 module, which was entirely broken in 1.5.2 * Fixed some module build problems on FreeBSD and Tru64 Version 1.4.12, 2006-01-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an off-by-one memory read in MISTY1::key() * Fixed a nasty memory leak in Output_Buffers::retire() * Changed maximum HMAC keylength to 1024 bits * Fixed a build problem in the hardware timer module on 64-bit PowerPC Version 1.5.2, 2006-01-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an off-by-one memory read in MISTY1::key() * Fixed a nasty memory leak in Output_Buffers::retire() * Reimplemented the memory allocator from scratch * Improved memory caching in Montgomery exponentiation * Optimizations for multiple precision addition and subtraction * Fixed a build problem in the hardware timer module on 64-bit PowerPC * Changed default Karatsuba cutoff to 12 words (was 14) * Removed MemoryRegion::bits(), which was unused and incorrect * Changed maximum HMAC keylength to 1024 bits * Various minor Makefile and build system changes * Avoid using std::min in to bypass Windows libc macro pollution * Switched checks/clock.cpp back to using clock() by default * Enabled the symmetric algorithm tests, which were accidentally off in 1.5.1 * Removed the Default_Mutex's unused clone() member function Version 1.5.1, 2006-01-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implemented Montgomery exponentiation * Implemented generalized Karatsuba multiplication and squaring * Implemented Comba squaring for 4, 6, and 8 word inputs * Added new Modular_Exponentiator and Power_Mod classes * Removed FixedBase_Exp and FixedExponent_Exp * Fixed a performance regression in get_allocator introduced in 1.5.0 * Engines can now offer S2K algorithms and block cipher padding methods * Merged the remaining global 'algolist' code into Default_Engine * The low-level MPI code is linked as C again * Replaced BigInt's get_nibble with the more general get_substring * Some documentation updates Version 1.5.0, 2006-01-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Moved all global/shared library state into a single object * Mutex objects are created through mutex factories instead of a global * Removed ::get_mutex(), ::initialize_mutex(), and Mutex::clone() * Removed the RNG_Quality enum entirely * There is now only a single global-use PRNG * Removed the no_aliases and no_oids options for LibraryInitializer * Removed the deprecated algorithms SEAL, ISAAC, and HAVAL * Change es_ftw to use unbuffered I/O Version 1.4.11, 2005-12-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Changed Whirlpool diffusion matrix to match updated algorithm spec * Fixed several engine module build errors introduced in 1.4.10 * Fixed two build problems in es_capi; reported by Matthew Gregan * Added a constructor to DataSource_Memory taking a std::string * Placing the same Filter in multiple Pipes triggers an exception * The configure script accepts --docdir and --libdir * Merged doc/rngs.txt into the main API document * Thanks to Joel Low for several bug reports on early tarballs of 1.4.11 Version 1.4.10, 2005-12-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added an implementation of KASUMI, the block cipher used in 3G phones * Refactored Pipe; output queues are now managed by a distinct class * Made certain Filter facilities only available to subclasses of Fanout_Filter * There is no longer any overhead in Pipe for a message that has been read out * It is now possible to generate RSA keys as small as 128 bits * Changed some of the core classes to derive from Algorithm as a virtual base * Changed Randpool to use HMAC instead of a plain hash as the mixing function * Fixed a bug in the allocators; found and fixed by Matthew Gregan * Enabled the use of binary file I/O, when requested by the application * The OpenSSL engine's block cipher code was missing some deallocation calls * Disabled the es_ftw module on NetBSD, due to header problems there * Fixed a problem preventing tm_hard from building on MacOS X on PowerPC * Some cleanups for the modules that use inline assembler * config.h is now stored in build/ instead of build/include/botan/ * The header util.h was split into bit_ops.h, parsing.h, and util.h * Cleaned up some redundant include directives Version 1.4.9, 2005-11-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the IBM-created AES candidate algorithm MARS * Added the South Korean block cipher SEED * Added the stream cipher Turing * Added the new hash function FORK-256 * Deprecated the ISAAC stream cipher * Twofish and RC6 are significantly faster with GCC * Much better support for 64-bit PowerPC * Added support for high-resolution PowerPC timers * Fixed a bug in the configure script causing problems on FreeBSD * Changed ANSI X9.31 to support arbitrary block ciphers * Make the configure script a bit less noisy * Added more test vectors for some algorithms, including all the AES finalists * Various cosmetic source code cleanups Version 1.4.8, 2005-10-16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Resolved a bad performance problem in the allocators; fix by Matt Johnston * Worked around a Visual Studio 2003 compilation problem introduced in 1.4.7 * Renamed OMAC to CMAC to match the official NIST naming * Added single byte versions of update() to PK_Signer and PK_Verifier * Removed the unused reverse_bits and reverse_bytes functions Version 1.4.7, 2005-09-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed major performance problems with recent versions of GNU C++ * Added an implementation of the X9.31 PRNG * Removed the X9.17 and FIPS 186-2 PRNG algorithms * Changed defaults to use X9.31 PRNGs as global PRNG objects * Documentation updates to reflect the PRNG changes * Some cleanups related to the engine code * Removed two useless headers, base_eng.h and secalloc.h * Removed PK_Verifier::valid_signature * Fixed configure/build system bugs affecting MacOS X builds * Added support for the EKOPath x86-64 compiler * Added missing destructor for BlockCipherModePaddingMethod * Fix some build problems with Visual C++ 2005 beta * Fix some build problems with Visual C++ 2003 Workshop Version 1.4.6, 2005-03-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix an error in the shutdown code introduced in 1.4.5 * Setting base/pkcs8_tries to 0 disables the builtin fail-out * Support for XMPP identifiers in X.509 certificates * Duplicate entries in X.509 DNs are removed * More fixes for Borland C++, from Friedemann Kleint * Add a workaround for buggy iostreams Version 1.4.5, 2005-02-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add support for AES encryption of private keys * Minor fixes for PBES2 parameter decoding * Internal cleanups for global state variables * GCC 3.x version detection was broken in non-English locales * Work around a Sun Forte bug affecting mem_pool.h * Several fixes for Borland C++ 5.5, from Friedemann Kleint * Removed inclusion of init.h into base.h * Fixed a major bug in reading from certificate stores * Cleaned up a couple of mutex leaks * Removed some left-over debugging code * Removed SSL3_MAC, SSL3_PRF, and TLS_PRF Version 1.4.4, 2004-12-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Further tweaks to the pooling allocator * Modified EMSA3 to support SSL/TLS signatures * Changes to support Qt/QCA, from Justin Karneges * Moved mux_qt module code into mod_qt * Fixes for HP-UX from Mike Desjardins Version 1.4.3, 2004-11-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Split up SecureAllocator into Allocator and Pooling_Allocator * Memory locking allocators are more likely to be used * Fixed the placement of includes in some modules * Fixed broken installation procedure * Fixes in configure script to support alternate install programs * Modules can specify the minimum version they support Version 1.4.2, 2004-10-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a major CRL handling bug * Cipher and hash operations can be offloaded to engines * Added support for cipher and hash offload in OpenSSL engine * Improvements for 64-bit CPUs without a widening multiply instruction * Support for SHA2-* and Whirlpool with EMSA2 * Fixed a long-standing build problem with conflicting include files * Fixed some examples that hadn't been updated for 1.4.x * Portability fixes for Solaris, BSD, HP-UX, and others * Lots of fixes and cleanups in the configure script * Updated the Gentoo ebuild file Version 1.4.1, 2004-10-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed major errors in the X.509 and PKCS #8 copy_key functions * Added a LAST_MESSAGE meta-message number for Pipe * Added new aliases (3DES and DES-EDE) for Triple-DES * Added some new functions to PK_Verifier * Cleaned up the KDF interface * Disabled tm_posix on BSD due to header issues * Fixed a build problem on PowerPC with GNU C++ pre-3.4 Version 1.4.0, 2004-06-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the FIPS 186 RNG back * Added copy_key functions for X.509 public keys and PKCS #8 private keys * Fixed PKCS #1 signatures with RIPEMD-128 * Moved some code around to avoid warnings with Sun ONE compiler * Fixed a bug in botan-config affecting OpenBSD * Fixed some build problems on Tru64, HP-UX * Fixed compile problems with Intel C++, Compaq C++ Version 1.3.14, 2004-06-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for AEP's AEP1000/AEP2000 crypto cards * Added a Mutex module using Qt, from Justin Karneges * Added support for engine loading in LibraryInitializer * Tweaked SecureAllocator, giving 20% better performance under heavy load * Added timer and memory locking modules for Win32 (tm_win32, ml_win32) * Renamed PK_Engine to Engine_Core * Improved the Karatsuba cutoff points * Fixes for compiling with GCC 3.4 and Sun C++ 5.5 * Fixes for Linux/s390, OpenBSD, and Solaris * Added support for Linux/s390x * The configure script was totally broken for 'generic' OS * Removed Montgomery reduction due to bugs * Removed an unused header, pkcs8alg.h * check --validate returns an error code if any tests failed * Removed duplicate entry in Unix command list for es_unix * Moved the Cert_Usage enumeration into X509_Store * Added new timing methods for PK benchmarks, clock_gettime and RDTSC * Fixed a few minor bugs in the configure script * Removed some deprecated functions from x509cert.h and pkcs10.h * Removed the 'minimal' module, has to be updated for Engine support * Changed MP_WORD_BITS macro to BOTAN_MP_WORD_BITS to clean up namespace * Documentation updates Version 1.3.13, 2004-05-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major fixes for Cygwin builds * Minor MacOS X install fixes * The configure script is a little better at picking the right modules * Removed ml_unix from the 'unix' module set for Cygwin compatibility * Fixed a stupid compile problem in pkcs10.h Version 1.3.12, 2004-05-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added ability to remove old entries from CRLs * Swapped the first two arguments of X509_CA::update_crl() * Added an < operator for MemoryRegion, so it can be used as a std::map key * Changed X.509 searching by DNS name from substring to full string compares * Renamed a few X509_Certificate and PKCS10_Request member functions * Fixed a problem when decoding some PKCS #10 requests * Hex_Decoder would not check inputs, reported by Vaclav Ovsik * Changed default CRL expire time from 30 days to 7 days * X509_CRL's default PEM header is now "X509 CRL", for OpenSSL compatibility * Corrected errors in the API doc, fixes from Ken Perano * More documentation about the Pipe/Filter code Version 1.3.11, 2004-04-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed two show-stopping bugs in PKCS10_Request * Added some sanity checks in Pipe/Filter * The DNS and URI entries would get swapped in subjectAlternativeNames * MAC_Filter is now willing to not take a key at creation time * Setting the expiration times of certs and CRLs is more flexible * Fixed problems building on AIX with GCC * Fixed some problems in the tutorial pointed out by Dominik Vogt * Documentation updates Version 1.3.10, 2004-03-27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for OpenPGP's ASCII armor format * Cleaned up the RNG system; seeding is much more flexible * Added simple autoconfiguration abilities to configure.pl * Fixed a GCC 2.95.x compile problem * Updated the example configuration file * Documentation updates Version 1.3.9, 2004-03-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added an engine using OpenSSL (requires 0.9.7 or later) * X509_Certificate would lose email addresses stored in the DN * Fixed a missing initialization in a BigInt constructor * Fixed several Visual C++ compile problems * Fixed some BeOS build problems * Fixed the WiderWake benchmark Version 1.3.8, 2003-12-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initial introduction of engine support, which separates PK keys from the underlying operations. An engine using GNU MP was added. * DSA, DH, NR, and ElGamal constructors accept taking just the private key again since the public key is easily derived from it. * Montgomery reduction support was added. * ElGamal keys now support being imported/exported as ASN.1 objects * Added Montgomery reductions * Added an engine that uses GNU MP (requires 4.1 or later) * Removed the obsolete mp_gmp module * Moved several initialization/shutdown functions to init.h * Major refactoring of the memory containers * New non-locking container, MemoryVector * Fixed 64-bit problems in BigInt::set_bit/clear_bit * Renamed PK_Key::check_params() to check_key() * Some incompatible changes to OctetString * Added version checking macros in version.h * Removed the fips140 module pending rewrite * Added some functions and hooks to help GUIs * Moved more shared code into MDx_HashFunction * Added a policy hook for specifying the encoding of X.509 strings Version 1.3.7, 2003-12-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a big security problem in es_unix (use of untrusted PATH) * Fixed several stability problems in es_unix * Expanded the list of programs es_unix will try to use * SecureAllocator now only preallocates blocks in special cases * Added a special case in Global_RNG::seed for forcing a full poll * Removed the FIPS 186 RNG added in 1.3.5 pending further testing * Configure updates for PowerPC CPUs * Removed the (never tested) VAX support * Added support for S/390 Linux Version 1.3.6, 2003-12-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added a new module 'minimal', which disables most algorithms * SecureAllocator allocates a few blocks at startup * A few minor MPI cleanups * RPM spec file cleanups and fixes Version 1.3.5, 2003-11-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major improvements in ASN.1 string handling * Added partial support for ASN.1 UTF8 STRINGs and BMP STRINGs * Added partial support for the X.509v3 certificate policies extension * Centralized the handling of character set information * Added FIPS 140-2 startup self tests * Added a module (fips140) for doing extra FIPS 140-2 tests * Added FIPS 186-2 RNG * Improved ASN.1 BIT STRING handling * Removed a memory leak in PKCS10_Request * The encoding of DirectoryString now follows PKIX guidelines * Fixed some of the character set dependencies * Fixed a DER encoding error for tags greater than 30 * The BER decoder can now handle tags larger than 30 * Fixed tm_hard.cpp to recognize SPARC on more systems * Workarounds for a GCC 2.95.x bug in x509find.cpp * RPM changed to install into /usr instead of /usr/local * Added support for QNX Version 1.2.8, 2003-11-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Merged several important bug fixes from 1.3.x Version 1.3.4, 2003-11-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added a module that does certain MPI operations using GNU MP * Added the X9.42 Diffie-Hellman PRF * The Zlib and Bzip2 objects now use custom allocators * Added member functions for directly hashing/MACing SecureVectors * Minor optimizations to the MPI addition and subtraction algorithms * Some cleanups in the low-level MPI code * Created separate AES-{128,192,256} objects Version 1.3.3, 2003-11-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * The library can now be repeatedly initialized and shutdown without crashing * Fixed an off-by-one error in the CTS code * Fixed an error in the EMSA4 verification code * Fixed a memory leak in mutex.cpp (pointed out by James Widener) * Fixed a memory leak in Pthread_Mutex * Fixed several memory leaks in the testing code * Bulletproofed the EMSA/EME/KDF/MGF retrieval functions * Minor cleanups in SecureAllocator * Removed a needless mutex guarding the (stateless) global timer * Fixed a piece of bash-specific code in botan-config * X.509 objects report more information about decoding errors * Cleaned up some of the exception handling * Updated the example config file with new OIDSs * Moved the build instructions into a separate document, building.tex Version 1.3.2, 2003-11-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a bug preventing DSA signatures from verifying on X.509 objects * Made the X509_Store search routines more efficient and flexible * Added a function to X509_PublicKey to do easy public/private key matching * Added support for decoding indefinite length BER data * Changed Pipe's peek() to take an offset * Removed Filter::set_owns in favor of the new incr_owns function * Removed BigInt::zero() and BigInt::one() * Renamed the PEM related options from base/pem_* to pem/* * Added an option to specify the line width when encoding PEM * Removed the "rng/safe_longterm" option; it's always on now * Changed the cipher used for RNG super-encryption from ARC4 to WiderWake4+1 * Cleaned up the base64/hex encoders and decoders * Added an ASN.1/BER decoder as an example * AES had its internals marked 'public' in previous versions * Changed the value of the ASN.1 NO_OBJECT enum * Various new hacks in the configure script * Removed the already nominal support for SunOS Version 1.3.1, 2003-11-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Generalized a few pieces of the DER encoder * PKCS8::load_key would fail if handed an unencrypted key * Added a failsafe so PKCS #8 key decoding can't go into an infinite loop Version 1.3.0, 2003-11-02 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major redesign of the PKCS #8 private key import/export system * Added a small amount of UI interface code for getting passphrases * Added heuristics that tell if a key, cert, etc is stored as PEM or BER * Removed CS-Cipher, SHARK, ThreeWay, MD5-MAC, and EMAC * Removed certain deprecated constructors of RSA, DSA, DH, RW, NR * Made PEM decoding more forgiving of extra text before the header Version 1.2.7, 2003-10-31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for reading configuration files * Added constructors so NR and RW keys can be imported easily * Fixed mp_asm64, which was completely broken in 1.2.6 * Removed tm_hw_ia32 module; replaced by tm_hard * Added support for loading certain oddly formed RSA certificates * Fixed spelling of NON_REPUDIATION enum * Renamed the option default_to_ca to v1_assume_ca * Fixed a minor bug in X.509 certificate generation * Fixed a latent bug in the OID lookup code * Updated the RPM spec file * Added to the tutorial Version 1.2.6, 2003-07-04 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major performance increase for PK algorithms on most 64-bit systems * Cleanups in the low-level MPI code to support asm implementations * Fixed build problems with some versions of Compaq's C++ compiler * Removed useless constructors for NR public and private keys * Removed support for the patch_file directive in module files * Removed several deprecated functions Version 1.2.5, 2003-06-22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a tricky and long-standing memory leak in Pipe * Major cleanups and fixes in the memory allocation system * Removed alloc_mlock, which has been superseded by the ml_unix module * Removed a denial of service vulnerability in X509_Store * Fixed compilation problems with VS .NET 2003 and Codewarrior 8 * Added another variant of PKCS8::load_key, taking a memory buffer * Fixed various minor/obscure bugs which occurred when MP_WORD_BITS != 32 * BigInt::operator%=(word) was a no-op if the input was a power of 2 * Fixed portability problems in BigInt::to_u32bit * Fixed major bugs in SSL3-MAC * Cleaned up some messes in the PK algorithms * Cleanups and extensions for OMAC and EAX * Made changes to the entropy estimation function * Added a 'beos' module set for use on BeOS * Officially deprecated a few X509:: and PKCS8:: functions * Moved the contents of primes.h to numthry.h * Moved the contents of x509opt.h to x509self.h * Removed the (empty) desx.h header * Documentation updates Version 1.2.4, 2003-05-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a bug in EMSA1 affecting NR signature verification * Fixed a few latent bugs in BigInt related to word size * Removed an unused function, mp_add2_nc, from the MPI implementation * Reorganized the core MPI files Version 1.2.3, 2003-05-20 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a bug that prevented DSA/NR key generation * Fixed a bug that prevented importing some root CA certs * Fixed a bug in the BER decoder when handing optional bit or byte strings * Fixed the encoding of authorityKeyIdentifier in X509_CA * Added a sanity check in PBKDF2 for zero length passphrases * Added versions of X509::load_key and PKCS8::load_key that take a file name * X509_CA generates 128 bit serial numbers now * Added tests to check PK key generation * Added a simplistic X.509 CA example * Cleaned up some of the examples Version 1.2.2, 2003-05-13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Add checks to prevent any BigInt bugs from revealing an RSA or RW key * Changed the interface of Global_RNG::seed * Major improvements for the es_unix module * Added another Win32 entropy source, es_win32 * The Win32 CryptoAPI entropy source can now poll multiple providers * Improved the BeOS entropy source * Renamed pipe_unixfd module to fd_unix * Fixed a file descriptor leak in the EGD module * Fixed a few locking bugs Version 1.2.1, 2003-05-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added ANSI X9.23 compatible CBC padding * Added an entropy source using Win32 CryptoAPI * Removed the Pipe I/O operators taking a FILE* * Moved the BigInt encoding/decoding functions into the BigInt class * Integrated several fixes for VC++ 7 (from Hany Greiss) * Fixed the configure.pl script for Windows builds Version 1.2.0, 2003-04-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Tweaked the Karatsuba cut-off points * Increased the allowed keylength of HMAC and Blowfish * Removed the 'mpi_ia32' module, pending rewrite * Workaround a GCC 2.95.x bug in eme1.cpp Version 1.1.13, 2003-04-22 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added OMAC * Added EAX authenticated cipher mode * Diffie-Hellman would not do blinding in some cases * Optimized the OFB and CTR modes * Corrected Skipjack's word ordering, as per NIST clarification * Support for all subject/issuer attribute types required by RFC 3280 * The removeFromCRL CRL reason code is now handled correctly * Increased the flexibility of the allocators * Renamed Rijndael to AES, created aes.h, deleted rijndael.h * Removed support for the 'no_timer' LibraryInitializer option * Removed 'es_pthr' module, pending further testing * Cleaned up get_ciph.cpp Version 1.1.12, 2003-04-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a ASN.1 string encoding bug * Fixed a pair of X509_DN encoding problems * Base64_Decoder and Hex_Decoder can now validate input * Removed support for the LibraryInitializer option 'egd_path' * Added tests for DSA X.509 and PKCS #8 key formats * Removed a long deprecated feature of DH_PrivateKey's constructor * Updated the RPM .spec file * Major documentation updates Version 1.1.11, 2003-04-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added PKCS #10 certificate requests * Changed X509_Store searching interface to be more flexible * Added a generic Certificate_Store interface * Added a function for generating self-signed X.509 certs * Cleanups and changes to X509_CA * New examples for PKCS #10 and self-signed certificates * Some documentation updates Version 1.1.10, 2003-04-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * X509_CA can now generate new X.509 CRLs * Added blinding for RSA, RW, DH, and ElGamal to prevent timing attacks * More certificate and CRL extensions/attributes are supported * Better DN handling in X.509 certificates/CRLs * Added a DataSink hierarchy (suggested by Jim Darby) * Consolidated SecureAllocator and ManagedAllocator * Many cleanups and generalizations * Added a (slow) pthreads based EntropySource * Fixed some threading bugs Version 1.1.9, 2003-02-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added support for using X.509v2 CRLs * Fixed several bugs in the path validation algorithm * Certificates can be verified for a particular usage * Algorithm for comparing distinguished names now follows X.509 * Cleaned up the code for the es_beos, es_ftw, es_unix modules * Documentation updates Version 1.1.8, 2003-01-29 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixes for the certificate path validation algorithm in X509_Store * Fixed a bug affecting X509_Certificate::is_ca_cert() * Added a general configuration interface for policy issues * Cleanups and API changes in the X.509 CA, cert, and store code * Made various options available for X509_CA users * Changed X509_Time's interface to work around time_t problems * Fixed a theoretical weakness in Randpool's entropy mixing function * Fixed problems compiling with GCC 2.95.3 and GCC 2.96 * Fixed a configure bug (reported by Jon Wilson) affecting MinGW Version 1.0.2, 2003-01-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an obscure SEGFAULT causing bug in Pipe * Fixed an obscure but dangerous bug in SecureVector::swap Version 1.1.7, 2003-01-12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed an obscure but dangerous bug in SecureVector::swap * Consolidated SHA-384 and SHA-512 to save code space * Added SSL3-MAC and SSL3-PRF * Documentation updates, including a new tutorial Version 1.1.6, 2002-12-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Initial support for X.509v3 certificates and CAs * Major redesign/rewrite of the ASN.1 encoding/decoding code * Added handling for DSA/NR signatures encoded as DER SEQUENCEs * Documented the generic cipher lookup interface * Added an (untested) entropy source for BeOS * Various cleanups and bug fixes Version 1.1.5, 2002-11-17 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the discrete logarithm integrated encryption system (DLIES) * Various optimizations for BigInt * Added support for assembler optimizations in modules * Added BigInt x86 optimizations module (mpi_ia32) Version 1.1.4, 2002-11-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Speedup of 15-30% for PK algorithms * Implemented the PBES2 encryption scheme * Fixed a potential bug in decoding RSA and RW private keys * Changed the DL_Group class interface to handle different formats better * Added support for PKCS #3 encoded DH parameters * X9.42 DH parameters use a PEM label of 'X942 DH PARAMETERS' * Added key pair consistency checking * Fixed a compatibility problem with gcc 2.96 (pointed out by Hany Greiss) * A botan-config script is generated at configure time * Documentation updates Version 1.1.3, 2002-11-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added a generic public/private key loading interface * Fixed a small encoding bug in RSA, RW, and DH * Changed the PK encryption/decryption interface classes * ECB supports using padding methods * Added a function-based interface for library initialization * Added support for RIPEMD-128 and Tiger PKCS#1 v1.5 signatures * The cipher mode benchmarks now use 128-bit AES instead of DES * Removed some obsolete typedefs * Removed OpenCL support (opencl.h, the OPENCL_* macros, etc) * Added tests for PKCS #8 encoding/decoding * Added more tests for ECB and CBC Version 1.1.2, 2002-10-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Support for PKCS #8 encoded RSA, DSA, and DH private keys * Support for Diffie-Hellman X.509 public keys * Major reorganization of how X.509 keys are handled * Added PKCS #5 v2.0's PBES1 encryption scheme * Added a generic cipher lookup interface * Added the WiderWake4+1 stream cipher * Added support for sync-able stream ciphers * Added a 'paranoia level' option for the LibraryInitializer * More security for RNG output meant for long term keys * Added documentation for some of the new 1.1.x features * CFB's feedback argument is now specified in bits * Renamed CTR class to CTR_BE * Updated the RSA and DSA examples to use X.509 and PKCS #8 key formats Version 1.1.1, 2002-10-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added the Korean hash function HAS-160 * Partial support for RSA and DSA X.509 public keys * Added a mostly functional BER encoder/decoder * Added support for non-deterministic MAC functions * Initial support for PEM encoding/decoding * Internal cleanups in the PK algorithms * Several new convenience functions in Pipe * Fixed two nasty bugs in Pipe * Messed with the entropy sources for es_unix * Discrete logarithm groups are checked for safety more closely now * For compatibility with GnuPG, ElGamal now supports DSA-style groups Version 1.0.1, 2002-09-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed a minor bug in Randpool::random() * Added some new aliases and typedefs for 1.1.x compatibility * The 4096-bit RSA benchmark key was decimal instead of hex * EMAC was returning an incorrect name Version 1.1.0, 2002-09-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added entropy estimation to the RNGs * Improved the overall design of both Randpool and ANSI_X917_RNG * Added a separate RNG for nonce generation * Added window exponentiation support in power_mod * Added a get_s2k function and the PKCS #5 S2K algorithms * Added the TLSv1 PRF * Replaced BlockCipherModeIV typedef with InitializationVector class * Renamed PK_Key_Agreement_Scheme to PK_Key_Agreement * Renamed SHA1 -> SHA_160 and SHA2_x -> SHA_x * Added support for RIPEMD-160 PKCS#1 v1.5 signatures * Changed the key agreement scheme interface * Changed the S2K and KDF interfaces * Better SCAN compatibility for HAVAL, Tiger, MISTY1, SEAL, RC5, SAFER-SK * Added support for variable-pass Tiger * Major speedup for Rabin-Williams key generation Version 1.0.0, 2002-08-26 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Octal I/O of BigInt is now supported * Fixed portability problems in the es_egd module * Generalized IV handling in the block cipher modes * Added Karatsuba multiplication and k-ary exponentiation * Fixed a problem in the multiplication routines Version 0.9.2, 2002-08-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * DH_PrivateKey::public_value() was returning the wrong value * Various BigInt optimizations * The filters.h header now includes hex.h and base64.h * Moved Counter mode to ctr.h * Fixed a couple minor problems with VC++ 7 * Fixed problems with the RPM spec file Version 0.9.1, 2002-08-10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Grand rename from OpenCL to Botan * Major optimizations for the PK algorithms * Added ElGamal encryption * Added Whirlpool * Tweaked memory allocation parameters * Improved the method of seeding the global RNG * Moved pkcs1.h to eme_pkcs.h * Added more test vectors for some algorithms * Fixed error reporting in the BigInt tests * Removed Default_Timer, it was pointless * Added some new example applications * Removed some old examples that weren't that interesting * Documented the compression modules Version 0.9.0, 2002-08-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * EMSA4 supports variable salt size * PK_* can take a string naming the encoding method to use * Started writing some internals documentation Version 0.8.7, 2002-07-30 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed bugs in EME1 and EMSA4 * Fixed a potential crash at shutdown * Cipher modes returned an ill-formed name * Removed various deprecated types and headers * Cleaned up the Pipe interface a bit * Minor additions to the documentation * First stab at a Visual C++ makefile (doc/Makefile.vc7) Version 0.8.6, 2002-07-25 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added EMSA4 (aka PSS) * Brought the manual up to date; many corrections and additions * Added a parallel hash function construction * Lookup supports all available algorithms now * Lazy initialization of the lookup tables * Made more discrete logarithm groups available through get_dl_group() * StreamCipher_Filter supports seeking (if the underlying cipher does) * Minor optimization for GCD calculations * Renamed SAFER_SK128 to SAFER_SK * Removed many previously deprecated functions * Some now-obsolete functions, headers, and types have been deprecated * Fixed some bugs in DSA prime generation * DL_Group had a constructor for DSA-style prime gen but it wasn't defined * Reversed the ordering of the two arguments to SEAL's constructor * Fixed a threading problem in the PK algorithms * Fixed a minor memory leak in lookup.cpp * Fixed pk_types.h (it was broken in 0.8.5) * Made validation tests more verbose * Updated the check and example applications Version 0.8.5, 2002-07-21 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major changes to constructors for DL-based cryptosystems (DSA, NR, DH) * Added a DL_Group class * Reworking of the pubkey internals * Support in lookup for aliases and PK algorithms * Renamed CAST5 to CAST_128 and CAST256 to CAST_256 * Added EMSA1 * Reorganization of header files * LibraryInitializer will install new allocator types if requested * Fixed a bug in Diffie-Hellman key generation * Did a workaround in pipe.cpp for GCC 2.95.x on Linux * Removed some debugging code from init.cpp that made FTW ES useless * Better checking for invalid arguments in the PK algorithms * Reduced Base64 and Hex default line length (if line breaking is used) * Fixes for HP's aCC compiler * Cleanups in BigInt Version 0.8.4, 2002-07-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added Nyberg-Rueppel signatures * Added Diffie-Hellman key exchange (kex interface is subject to change) * Added KDF2 * Enhancements to the lookup API * Many things formerly taking pointers to algorithms now take names * Speedups for prime generation * LibraryInitializer has support for seeding the global RNG * Reduced SAFER-SK128 memory consumption * Reversed the ordering of public and private key values in DSA constructor * Fixed serious bugs in MemoryMapping_Allocator * Fixed memory leak in Lion * FTW_EntropySource was not closing the files it read * Fixed line breaking problem in Hex_Encoder Version 0.8.3, 2002-06-09 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added DSA and Rabin-Williams signature schemes * Added EMSA3 * Added PKCS#1 v1.5 encryption padding * Added Filters for PK algorithms * Added a Keyed_Filter class * LibraryInitializer processes arguments now * Major revamp of the PK interface classes * Changed almost all of the Filters for non-template operation * Changed HMAC, Lion, Luby-Rackoff to non-template classes * Some fairly minor BigInt optimizations * Added simple benchmarking for PK algorithms * Added hooks for fixed base and fixed exponent modular exponentiation * Added some examples for using RSA * Numerous bugfixes and cleanups * Documentation updates Version 0.8.2, 2002-05-18 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added an (experimental) algorithm lookup interface * Added code for directly testing BigInt * Added SHA2-384 * Optimized SHA2-512 * Major optimization for Adler32 (thanks to Dan Nicolaescu) * Various minor optimizations in BigInt and related areas * Fixed two bugs in X9.19 MAC, both reported by Darren Starsmore * Fixed a bug in BufferingFilter * Made a few fixes for MacOS X * Added a workaround in configure.pl for GCC 2.95.x * Better support for PowerPC, ARM, and Alpha * Some more cleanups Version 0.8.1, 2002-05-06 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Major code cleanup (check doc/deprecated.txt) * Various bugs fixed, including several portability problems * Renamed MessageAuthCode to MessageAuthenticationCode * A replacement for X917 is in x917_rng.h * Changed EMAC to non-template class * Added ANSI X9.19 compatible CBC-MAC * TripleDES now supports 128 bit keys Version 0.8.0, 2002-04-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Merged BigInt: many bugfixes and optimizations since alpha2 * Added RSA (rsa.h) * Added EMSA2 (emsa2.h) * Lots of new interface code for public key algorithms (pk_base.h, pubkey.h) * Changed some interfaces, including SymmetricKey, to support the global rng * Fixed a serious bug in ManagedAllocator * Renamed RIPEMD128 to RIPEMD_128 and RIPEMD160 to RIPEMD_160 * Removed some deprecated stuff * Added a global random number generator (rng.h) * Added clone functions to most of the basic algorithms * Added a library initializer class (init.h) * Version macros in version.h * Moved the base classes from opencl.h to base.h * Renamed the bzip2 module to comp_bzip2 and zlib to comp_zlib * Documentation updates for the new stuff (still incomplete) * Many new deprecated things: check doc/deprecated.txt Version 0.7.10, 2002-04-07 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Added EGD_EntropySource module (es_egd) * Added a file tree walking EntropySource (es_ftw) * Added MemoryLocking_Allocator module (alloc_mlock) * Renamed the pthr_mux, unix_rnd, and mmap_mem modules * Changed timer mechanism; the clock method can be switched on the fly. * Renamed MmapDisk_Allocator to MemoryMapping_Allocator * Renamed ent_file.h to es_file.h (ent_file.h is around, but deprecated) * Fixed several bugs in MemoryMapping_Allocator * Added more default sources for Unix_EntropySource * Changed SecureBuffer to use same allocation methods as SecureVector * Added bigint_divcore into mp_core to support BigInt alpha2 release * Removed some Pipe functions deprecated since 0.7.8 * Some fixes for the configure program Version 0.7.9, 2002-03-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Memory allocation substantially revamped * Added memory allocation method based on mmap(2) in the mmap_mem module * Added ECB and CTS block cipher modes (ecb.h, cts.h) * Added a Mutex interface (mutex.h) * Added module pthr_mux, implementing the Mutex interface * Added Threaded Filter interface (thr_filt.h) * All algorithms can now by keyed with SymmetricKey objects * More testing occurs with --validate (expected failures) * Fixed two bugs reported by Hany Greiss, in Luby-Rackoff and RC6 * Fixed a buffering bug in Bzip_Decompress and Zlib_Decompress * Made X917 safer (and about 1/3 as fast) * Documentation updates Version 0.7.8, 2002-02-28 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * More capabilities for Pipe, inspired by SysV STREAMS, including peeking, better buffering, and stack ops. NOT BACKWARDS COMPATIBLE: SEE DOCUMENTATION * Added a BufferingFilter class * Added popen() based EntropySource for generic Unix systems (unix_rnd) * Moved 'devrand' module into main distribution (ent_file.h), renamed to File_EntropySource, and changed interface somewhat. * Made Randpool somewhat more conservative and also 25% faster * Minor fixes and updates for the configure script * Added some tweaks for memory allocation * Documentation updates for the new Pipe interface * Fixed various minor bugs * Added a couple of new example programs (stack and hasher2) Version 0.7.7, 2001-11-24 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Filter::send now works in the constructor of a Filter subclass * You may now have to include explicitly in some code * Added preliminary PK infrastructure classes in pubkey.h and pkbase.h * Enhancements to SecureVector (append, destroy functions) * New infrastructure for secure memory allocation * Added IEEE P1363 primitives MGF1, EME1, KDF1 * Rijndael optimizations and cleanups * Changed CipherMode to BlockCipherMode(B*) * Fixed a nasty bug in pipe_unixfd * Added portions of the BigInt code into the main library * Support for VAX, SH, POWER, PowerPC-64, Intel C++ Version 0.7.6, 2001-10-14 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fixed several serious bugs in SecureVector created in 0.7.5 * Square optimizations * Fixed shared objects on MacOS X and HP-UX * Fixed static libs for KCC 4.0; works with KCC 3.4g as well * Full support for Athlon and K6 processors using GCC * Added a table of prime numbers < 2**16 (primes.h) * Some minor documentation updates Version 0.7.5, 2001-08-19 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Split checksum.h into adler32.h, crc24.h, and crc32.h * Split modes.h into cbc.h, cfb.h, and ofb.h * CBC_wPadding* has been replaced by CBC_Encryption and CBC_Decryption * Added OneAndZeros and NoPadding methods for CBC * Added Lion, a very fast block cipher construction * Added an S2K base class (s2k.h) and an OpenPGP_S2K class (pgp_s2k.h) * Basic types (ciphers, hashes, etc) know their names now (call name()) * Changed the EntropySource type somewhat * Big speed-ups for ISAAC, Adler32, CRC24, and CRC32 * Optimized CAST-256, DES, SAFER-SK, Serpent, SEAL, MD2, and RIPEMD-160 * Some semantics of SecureVector have changed slightly * The mlock module has been removed for the time being * Added string handling functions for hashes and MACs * Various non-user-visible cleanups * Shared library soname is now set to the full version number Version 0.7.4, 2001-07-15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * New modules: Zlib, gettimeofday and x86 RTC timers, Unix I/O for Pipe * Fixed a vast number of errors in the config script/makefile/specfile * Pipe now has a stdio(3) interface as well as C++ iostreams * ARC4 supports skipping the first N bytes of the cipher stream (ala MARK4) * Bzip2 supports decompressing multiple concatenated streams, and flushing * Added a simple 'overall average' score to the benchmarks * Fixed a small bug in the POSIX timer module * Removed a very-unlikely-to-occur bug in most of the hash functions * filtbase.h now includes , not * Minor documentation updates Version 0.7.3, 2001-06-08 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Fix build problems on Solaris/SPARC * Fix build problems with Perl versions < 5.6 * Fixed some stupid code that broke on a few compilers * Added string handling functions to Pipe * MISTY1 optimizations Version 0.7.2, 2001-06-03 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Build system supports modules * Added modules for mlock, a /dev/random EntropySource, POSIX1.b timers * Added Bzip2 compression filter, contributed by Peter Jones * GNU make no longer required (tested with 4.4BSD pmake and Solaris make) * Fixed minor bug in several of the hash functions * Various other minor fixes and changes * Updates to the documentation Version 0.7.1, 2001-05-16 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Rewrote configure script: more consistent and complete * Made it easier to find out parameters of types at run time (opencl.h) * New functions for finding the version being used (version.h) * New SymmetricKey interface for Filters (symkey.h) * InvalidKeyLength now records what the invalid key length was * Optimized DES, CS-Cipher, MISTY1, Skipjack, XTEA * Changed GOST to use correct S-box ordering (incompatible change) * Benchmark code was almost totally rewritten * Many more entries in the test vector file * Fixed minor and idiotic bug in check.cpp Version 0.7.0, 2001-03-01 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * First public release botan-2.4.0/readme.rst000066400000000000000000000177611322470703100146220ustar00rootroot00000000000000Botan: Crypto and TLS for C++11 ======================================== Botan (Japanese for peony) is a cryptography library written in C++11 and released under the permissive `Simplified BSD `_ license. Botan's goal is to be the best option for cryptography in new C++ code by offering the tools necessary to implement a range of practical systems, such as TLS/DTLS, PKIX certificate handling, PKCS#11 and TPM hardware support, password hashing, and post quantum crypto schemes. In addition to the C++, botan has a C89 API specifically designed to be easy to call from other languages. A Python binding using ctypes is included, and several other `language bindings `_ are available. Find the full feature list below. Development is coordinated on `GitHub `_ and contributions are welcome (read `doc/contributing.rst` for more info). If you need help with a problem, please open an `issue on GitHub `_ or email the `botan-devel mailing list `_. New releases are announced on the `botan-announce mailing list `_. If you think you have found a security bug in Botan please contact Jack Lloyd by emailing jack@randombit.net. His PGP public key with fingerprint 4E60C73551AF2188DF0A5A6278E9804357123B60 can can be found in ``doc/pgpkey.txt`` in the distribution, https://keybase.io/jacklloyd, and some public PGP key servers. .. highlight:: none For all the details on building the library, read the `users manual `_, but basically:: $ ./configure.py --help $ ./configure.py [probably some options] $ make $ ./botan-test # lots of output... Tests all ok $ ./botan # shows available commands $ make install Botan can also be built into a single-file amalgamation for easy inclusion into external build systems, see the manual for details. .. image:: https://travis-ci.org/randombit/botan.svg?branch=master :target: https://travis-ci.org/randombit/botan :alt: Travis CI status .. image:: https://ci.appveyor.com/api/projects/status/n9f94dljd03j2lce/branch/master?svg=true :target: https://ci.appveyor.com/project/randombit/botan/branch/master :alt: AppVeyor CI status .. image:: https://botan-ci.kullo.net/badge :target: https://botan-ci.kullo.net/ :alt: Kullo CI status .. image:: https://codecov.io/github/randombit/botan/coverage.svg?branch=master :target: https://codecov.io/github/randombit/botan :alt: Code coverage report .. image:: https://scan.coverity.com/projects/624/badge.svg :target: https://scan.coverity.com/projects/624 :alt: Coverity results .. image:: https://sonarcloud.io/api/badges/gate?key=botan :target: https://sonarcloud.io/dashboard/index/botan :alt: Sonarcloud analysis .. image:: https://bestpractices.coreinfrastructure.org/projects/531/badge :target: https://bestpractices.coreinfrastructure.org/projects/531 :alt: CII Best Practices statement Release Downloads ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See the `release notes `_ and `security advisories `_ All releases are signed with a `PGP key `_:: pub 2048R/EFBADFBC 2004-10-30 Key fingerprint = 621D AF64 11E1 851C 4CF9 A2E1 6211 EBF1 EFBA DFBC uid Botan Distribution Key Some `distributions `_ such as Arch, Fedora and Debian include packages for Botan. However these are often out of date; using the latest source release is recommended. Current Stable Release ---------------------------------------- Version 2 requires a C++11 compiler; GCC 4.8 and later, Clang 3.5 and later, and MSVC 2015/2017 are regularly tested. The latest 2.x release is `2.4.0 `_ `(sig) `_ released on 2018-01-08 Old Release ---------------------------------------- The 1.10 branch is the last version of the library written in C++98. It is no longer supported except for critical security updates (with all support ending in 2018), and the developers do not recommend its use anymore. The latest 1.10 release is `1.10.17 `_ `(sig) `_ released on 2017-10-02 Find Enclosed ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Transport Layer Security (TLS) Protocol ---------------------------------------- * TLS v1.0, v1.1, and v1.2. The broken SSLv3 protocol is no longer supported. * DTLS v1.0 and v1.2 are adaptations of TLS to datagram operation. * Extensions include session tickets, SNI, ALPN, OCSP staple requests (client side only right now), encrypt-then-mac CBC, and extended master secret. * Supports authentication using preshared keys (PSK) or passwords (SRP) * Supports record encryption with ChaCha20Poly1305, AES/OCB, AES/GCM, AES/CCM, Camellia/GCM, and legacy CBC ciphersuites with AES, Camellia, SEED, or 3DES. * Key exchange using Diffie-Hellman, ECDH, RSA, or CECPQ1 Public Key Infrastructure ---------------------------------------- * X.509v3 certificates and CRL creation and handling * PKIX certificate path validation, including name constraints. * OCSP request creation and response handling * PKCS #10 certificate request generation and processing * SQL database backed certificate store Public Key Cryptography ---------------------------------------- * RSA signatures and encryption * DH and ECDH key agreement * Signature schemes ECDSA, DSA, Ed25519, ECGDSA, ECKCDSA, SM2, and GOST 34.10-2001 * Post-quantum signature scheme XMSS * Post-quantum key agreement schemes McEliece and NewHope * ElGamal encryption * Padding schemes OAEP, PSS, PKCS #1 v1.5, X9.31 Ciphers, hashes, MACs, and checksums ---------------------------------------- * Authenticated cipher modes EAX, OCB, GCM, SIV, CCM, and ChaCha20Poly1305 * Cipher modes CTR, CBC, XTS, CFB, and OFB * Block ciphers AES, ARIA, Blowfish, Camellia, CAST-128, CAST-256, DES/3DES, GOST 28147, IDEA, KASUMI, Lion, MISTY1, Noekeon, SEED, Serpent, SHACAL2, SM4, Threefish-512, Twofish, XTEA * Stream ciphers ChaCha20, Salsa20/XSalsa20, SHAKE-128, and RC4 * Hash functions SHA-1, SHA-2, SHA-3, RIPEMD-160, Skein-512, BLAKE2b, SM3, Tiger, Whirlpool, GOST 34.11, MD5, MD4 * Hash function combiners Parallel and Comb4P * Authentication codes HMAC, CMAC, Poly1305, SipHash, GMAC, CBC-MAC, X9.19 DES-MAC * Non-cryptographic checksums Adler32, CRC24, and CRC32 Other Useful Things ---------------------------------------- * Full C++ PKCS #11 API wrapper * Interfaces for TPM v1.2 device access * Simple compression API wrapping zlib, bzip2, and lzma libraries * RNG wrappers for system RNG and hardware RNGs * HMAC_DRBG and entropy collection system for userspace RNGs * PBKDF2 password based key derivation * Password hashing function bcrypt and passhash9 (custom PBKDF scheme) * SRP-6a password authenticated key exchange * Key derivation functions including HKDF, KDF2, SP 800-108, SP 800-56A, SP 800-56C * HOTP and TOTP algorithms * Format preserving encryption scheme FE1 * Threshold secret sharing * RFC 3394 AES key wrap Recommended Algorithms ---------------------------------------- * For encryption of network traffic use TLS v1.2 * Packet encryption: AES-256/GCM, AES-256/OCB, Serpent/OCB, or ChaCha20Poly1305 * General hash function: BLAKE2b, SHA-2, SHA-3, or Skein-512 * Message authentication or PRF: HMAC with SHA-256 * Key derivation function: KDF2 or HKDF * Public Key Encryption: RSA, 2048+ bit keys, with OAEP/SHA-256 * Public Key Signatures: RSA, 2048+ bit keys with PSS/SHA-512, or ECDSA using P-256/SHA-256 or P-521/SHA-512 * Key Agreement: ECDH using P-256 or X25519. If you are concerned about quantum computers, combine ECC with NewHope. botan-2.4.0/src/000077500000000000000000000000001322470703100134065ustar00rootroot00000000000000botan-2.4.0/src/build-data/000077500000000000000000000000001322470703100154145ustar00rootroot00000000000000botan-2.4.0/src/build-data/arch/000077500000000000000000000000001322470703100163315ustar00rootroot00000000000000botan-2.4.0/src/build-data/arch/alpha.txt000066400000000000000000000006311322470703100201570ustar00rootroot00000000000000endian little wordsize 64 axp alphaaxp alpha-ev4 alpha-ev5 alpha-ev56 alpha-pca56 alpha-ev6 alpha-ev67 alpha-ev68 alpha-ev7 alphaev4 -> alpha-ev4 alphaev5 -> alpha-ev5 alphaev56 -> alpha-ev56 alphapca56 -> alpha-pca56 alphaev6 -> alpha-ev6 alphaev67 -> alpha-ev67 alphaev68 -> alpha-ev68 alphaev7 -> alpha-ev7 botan-2.4.0/src/build-data/arch/arm32.txt000066400000000000000000000006741322470703100200250ustar00rootroot00000000000000endian little family arm arm armel # For Debian armhf # For Debian evbarm # For NetBSD armv2 armv2a armv3 armv3m armv4 armv5 armv5e armv5te armv6 armv6j armv6t2 armv6z armv6zk armv6-m armv7 armv7-a armv7-r armv7-m iwmmxt iwmmxt2 ep9312 strongarm -> armv4 xscale -> armv5te cortex-a8 -> armv7-a cortex-a9 -> armv7-a neon botan-2.4.0/src/build-data/arch/arm64.txt000066400000000000000000000002171322470703100200230ustar00rootroot00000000000000endian little wordsize 64 family arm aarch64 armv8-a neon botan-2.4.0/src/build-data/arch/hppa.txt000066400000000000000000000001611322470703100200200ustar00rootroot00000000000000 hp-pa parisc pa-risc hp-parisc hp-pa-risc hppa1.0 hppa1.1 hppa2.0 botan-2.4.0/src/build-data/arch/ia64.txt000066400000000000000000000002411322470703100176320ustar00rootroot00000000000000wordsize 64 itanium itanic merced mckinley montvale itanium2 -> mckinley botan-2.4.0/src/build-data/arch/llvm.txt000066400000000000000000000000141322470703100200370ustar00rootroot00000000000000wordsize 64 botan-2.4.0/src/build-data/arch/m68k.txt000066400000000000000000000001351322470703100176560ustar00rootroot00000000000000endian big 680x0 68k 68020 68030 68040 68060 botan-2.4.0/src/build-data/arch/mips32.txt000066400000000000000000000003131322470703100202040ustar00rootroot00000000000000 mips mipsel # For Debian r3000 r6000 r3k -> r3000 r6k -> r6000 # These are for RPM mipsbe -> r3000 mipsle -> r3000 botan-2.4.0/src/build-data/arch/mips64.txt000066400000000000000000000003321322470703100202120ustar00rootroot00000000000000wordsize 64 mips64el r4000 r4100 r4300 r4400 r4600 r4560 r5000 r8000 r10000 r4k -> r4000 r5k -> r5000 r8k -> r8000 r10k -> r10000 botan-2.4.0/src/build-data/arch/ppc32.txt000066400000000000000000000004361322470703100200240ustar00rootroot00000000000000endian big family ppc powerpc ppc ppc601 ppc603 ppc604 ppc740 ppc750 ppc7400 ppc7450 e500v2 g3 -> ppc740 g4 -> ppc7450 powerpcspe -> e500v2 # for Debian altivec botan-2.4.0/src/build-data/arch/ppc64.txt000066400000000000000000000004761322470703100200350ustar00rootroot00000000000000endian big family ppc wordsize 64 powerpc64 g5 -> ppc970 ppc970 power3 power4 power5 power6 power7 power8 cellppu cellbroadbandengine -> cellppu altivec botan-2.4.0/src/build-data/arch/ppc64le.txt000066400000000000000000000003431322470703100203470ustar00rootroot00000000000000endian little family ppc wordsize 64 powerpc64 power8 altivec botan-2.4.0/src/build-data/arch/s390.txt000066400000000000000000000000521322470703100175650ustar00rootroot00000000000000endian big s390 botan-2.4.0/src/build-data/arch/s390x.txt000066400000000000000000000000671322470703100177630ustar00rootroot00000000000000endian big wordsize 64 s390x botan-2.4.0/src/build-data/arch/sparc32.txt000066400000000000000000000006631322470703100203540ustar00rootroot00000000000000endian big family sparc sparc sparc32-v7 sparc32-v8 sparc32-v9 cypress -> sparc32-v7 supersparc -> sparc32-v8 hypersparc -> sparc32-v8 microsparc -> sparc32-v8 sparclite -> sparc32-v8 sparcv7 -> sparc32-v7 sparcv8 -> sparc32-v8 sparcv9 -> sparc32-v9 sparc-v7 -> sparc32-v7 sparc-v8 -> sparc32-v8 sparc-v9 -> sparc32-v9 sun4u -> sparc32-v9 botan-2.4.0/src/build-data/arch/sparc64.txt000066400000000000000000000003151322470703100203530ustar00rootroot00000000000000family sparc wordsize 64 ultrasparc ultrasparc3 niagra niagra2 # Functionally the same for optimization purposes ultrasparc2 -> ultrasparc botan-2.4.0/src/build-data/arch/superh.txt000066400000000000000000000000451322470703100203770ustar00rootroot00000000000000 sh2 sh3 sh4 botan-2.4.0/src/build-data/arch/x86_32.txt000066400000000000000000000015431322470703100200260ustar00rootroot00000000000000endian little family x86 ia32 x86 ix86 80x86 i86pc # for Solaris x86pc # for QNX bepc # for Haiku i386 i486 i586 i686 pentium2 pentium3 pentium4 pentium-m prescott k6 athlon atom32 pentium -> i586 pentiumpro -> i686 pentium_pro -> i686 pentium2 -> pentium2 pentiumii -> pentium2 pentium3 -> pentium3 pentiumiii -> pentium3 x86family5 -> i586 x86family6 -> i686 pentiumm -> pentium-m intelpentiumm -> pentium-m intelpentium4 -> pentium4 duron -> athlon athlon-xp -> athlon k7 -> athlon p2 -> i686 p3 -> i686 p4 -> pentium4 intelcput2250 -> prescott intelcput2300 -> prescott intelcput2400 -> prescott intelcput2500 -> prescott intelcput2600 -> prescott intelcput2700 -> prescott aesni avx2 bmi2 rdrand rdseed sha sse2 sse41 sse42 ssse3 botan-2.4.0/src/build-data/arch/x86_64.txt000066400000000000000000000007711322470703100200350ustar00rootroot00000000000000endian little wordsize 64 family x86 amd64 x86-64 em64t x64 x86_amd64 k8 barcelona atom nocona core2 # conroe nehalem westmere sandybridge ivybridge haswell broadwell skylake znver1 core2duo -> core2 intelcore2 -> core2 intelcore2duo -> core2 sledgehammer -> k8 opteron -> k8 amdopteron -> k8 athlon64 -> k8 zen -> znver1 aesni avx2 bmi2 rdrand rdseed sha sse2 sse41 sse42 ssse3 botan-2.4.0/src/build-data/bakefile.in000066400000000000000000000015161322470703100175110ustar00rootroot00000000000000toolsets = vs2013; shared-library botan { defines = "BOTAN_DLL=__declspec(dllexport)"; sources { %{for lib_srcs} %{i} %{endfor} } } program cli { deps = botan; sources { %{for cli_srcs} %{i} %{endfor} } headers { %{for cli_headers} %{i} %{endfor} } } program tests { deps = botan; sources { %{for test_srcs} %{i} %{endfor} } } includedirs += build/include/; includedirs += build/include/external; %{for libs_used} libs += "%{i}"; %{endfor} archs = %{bakefile_arch}; vs2013.option.ClCompile.DisableSpecificWarnings = "4250;4251;4275"; vs2013.option.ClCompile.WarningLevel = Level4; vs2013.option.ClCompile.ExceptionHandling = SyncCThrow; vs2013.option.ClCompile.RuntimeTypeInfo = true; if ( $(config) == Release ) { vs2013.option.Configuration.WholeProgramOptimization = true; } botan-2.4.0/src/build-data/botan.doxy.in000066400000000000000000000161651322470703100200420ustar00rootroot00000000000000# Doxyfile 1.5.4 PROJECT_NAME = Botan PROJECT_NUMBER = %{version} PROJECT_BRIEF = Crypto and TLS for C++11 OUTPUT_DIRECTORY = %{doc_output_dir}/doxygen DOXYFILE_ENCODING = UTF-8 CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = YES FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # Set this to NO to get warnings about undocumented members/classes EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = YES SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = YES WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = YES WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = WARN_AS_ERROR = YES #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = %{src_dir}/lib INPUT_ENCODING = UTF-8 FILE_PATTERNS = RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = */wrap/* EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = YES STRIP_CODE_COMMENTS = NO REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = . HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = GENERATE_HTMLHELP = NO HTML_DYNAMIC_SECTIONS = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = NO TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # Configuration options related to other output formats #--------------------------------------------------------------------------- GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO GENERATE_XML = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = BOTAN_HAS_AES_SSSE3 \ BOTAN_HAS_AES_NI \ BOTAN_HAS_AES_ARMV8 \ BOTAN_HAS_IDEA_SSE2 \ BOTAN_HAS_NOEKEON_SIMD \ BOTAN_HAS_SERPENT_SIMD \ BOTAN_HAS_THREEFISH_512_AVX2 \ BOTAN_HAS_SHA1_SSE2 \ BOTAN_HAS_CHACHA_SSE2 \ BOTAN_HAS_SHACAL2_SIMD \ BOTAN_HAS_SHACAL2_X86 \ BOTAN_DEPRECATED(msg)= \ BOTAN_PUBLIC_API(maj,min)= EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = YES DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO botan-2.4.0/src/build-data/botan.pc.in000066400000000000000000000004531322470703100174520ustar00rootroot00000000000000prefix=%{prefix} exec_prefix=${prefix} libdir=${prefix}/%{libdir} includedir=${prefix}/include/botan-%{version_major} Name: Botan Description: Crypto and TLS for C++11 Version: %{version} Libs: -L${libdir} -lbotan-%{version_major} %{cxx_abi_flags} Libs.private: %{link_to} Cflags: -I${includedir} botan-2.4.0/src/build-data/buildh.in000066400000000000000000000171751322470703100172260ustar00rootroot00000000000000#ifndef BOTAN_BUILD_CONFIG_H_ #define BOTAN_BUILD_CONFIG_H_ /* * This file was automatically generated running * '%{command_line}' * * Target * - Compiler: %{cxx} %{cxx_abi_flags} %{cc_lang_flags} %{cc_compile_flags} * - Arch: %{submodel}/%{arch} * - OS: %{os} */ #define BOTAN_VERSION_MAJOR %{version_major} #define BOTAN_VERSION_MINOR %{version_minor} #define BOTAN_VERSION_PATCH %{version_patch} #define BOTAN_VERSION_DATESTAMP %{version_datestamp} #define BOTAN_VERSION_RELEASE_TYPE "%{release_type}" #define BOTAN_VERSION_VC_REVISION "%{version_vc_rev}" #define BOTAN_DISTRIBUTION_INFO "%{distribution_info}" /* How many bits per limb in a BigInt */ #define BOTAN_MP_WORD_BITS %{mp_bits} %{if fuzzer_mode} #define BOTAN_UNSAFE_FUZZER_MODE %{endif} %{if fuzzer_type} #define BOTAN_FUZZER_IS_%{fuzzer_type} %{endif} #define BOTAN_INSTALL_PREFIX R"(%{prefix})" #define BOTAN_INSTALL_HEADER_DIR "%{includedir}/botan-%{version_major}" #define BOTAN_INSTALL_LIB_DIR "%{libdir}" #define BOTAN_LIB_LINK "%{link_to}" #define BOTAN_LINK_FLAGS "%{cxx_abi_flags}" #ifndef BOTAN_DLL #define BOTAN_DLL %{visibility_attribute} #endif /* Target identification and feature test macros */ #define BOTAN_TARGET_OS_IS_%{os_name|upper} %{if os_type} #define BOTAN_TARGET_OS_TYPE_IS_%{os_type|upper} %{endif} %{for os_features} #define BOTAN_TARGET_OS_HAS_%{i|upper} %{endfor} #define BOTAN_BUILD_COMPILER_IS_%{cc_macro} #define BOTAN_TARGET_ARCH_IS_%{arch|upper} %{if endian} #define BOTAN_TARGET_CPU_IS_%{endian|upper}_ENDIAN %{endif} %{if cpu_family} #define BOTAN_TARGET_CPU_IS_%{cpu_family|upper}_FAMILY %{endif} %{if cpu_is_64bit} #define BOTAN_TARGET_CPU_HAS_NATIVE_64BIT %{endif} %{for cpu_features} #define BOTAN_TARGET_SUPPORTS_%{i|upper} %{endfor} %{if with_valgrind} #define BOTAN_HAS_VALGRIND %{endif} %{if with_openmp} #define BOTAN_TARGET_HAS_OPENMP %{endif} /* * Module availability definitions */ %{for module_defines} #define BOTAN_HAS_%{i} %{endfor} /* * Local/misc configuration options (if any) follow */ %{local_config} %{for house_ecc_curve_defines} #define BOTAN_HOUSE_ECC_CURVE_%{i} %{endfor} /* * Things you can edit (but probably shouldn't) */ /* How much to allocate for a buffer of no particular size */ #define BOTAN_DEFAULT_BUFFER_SIZE 1024 /* Minimum and maximum sizes to allocate out of the mlock pool (bytes) Default min is 16 as smaller values are easily bruteforceable and thus likely not cryptographic keys. */ #define BOTAN_MLOCK_ALLOCATOR_MIN_ALLOCATION 16 #define BOTAN_MLOCK_ALLOCATOR_MAX_ALLOCATION 128 /* * Total maximum amount of RAM (in KiB) we will lock into memory, even * if the OS would let us lock more */ #define BOTAN_MLOCK_ALLOCATOR_MAX_LOCKED_KB 512 /* * If enabled uses memset via volatile function pointer to zero memory, * otherwise does a byte at a time write via a volatile pointer. */ #define BOTAN_USE_VOLATILE_MEMSET_FOR_ZERO 1 /* * If enabled the ECC implementation will use scalar blinding with order.bits()/2 * bit long masks. */ #define BOTAN_POINTGFP_USE_SCALAR_BLINDING 1 /* * Set number of bits used to generate mask for blinding the * representation of an ECC point. Set to zero to disable this * side-channel countermeasure. */ #define BOTAN_POINTGFP_RANDOMIZE_BLINDING_BITS 80 /* * Normally blinding is performed by choosing a random starting point (plus * its inverse, of a form appropriate to the algorithm being blinded), and * then choosing new blinding operands by successive squaring of both * values. This is much faster than computing a new starting point but * introduces some possible corelation * * To avoid possible leakage problems in long-running processes, the blinder * periodically reinitializes the sequence. This value specifies how often * a new sequence should be started. */ #define BOTAN_BLINDING_REINIT_INTERVAL 32 /* * Userspace RNGs like HMAC_DRBG will reseed after a specified number * of outputs are generated. Set to zero to disable automatic reseeding. */ #define BOTAN_RNG_DEFAULT_RESEED_INTERVAL 1024 #define BOTAN_RNG_RESEED_POLL_BITS 256 #define BOTAN_RNG_AUTO_RESEED_TIMEOUT std::chrono::milliseconds(10) #define BOTAN_RNG_RESEED_DEFAULT_TIMEOUT std::chrono::milliseconds(50) /* * Specifies (in order) the list of entropy sources that will be used * to seed an in-memory RNG. The first in the default list: "rdseed" * and "rdrand" do not count as contributing any entropy but are * included as they are fast and help protect against a seriously * broken system RNG. */ #define BOTAN_ENTROPY_DEFAULT_SOURCES \ { "rdseed", "rdrand", "darwin_secrandom", "getentropy", \ "dev_random", "system_rng", "proc_walk", "system_stats" } /* Multiplier on a block cipher's native parallelism */ #define BOTAN_BLOCK_CIPHER_PAR_MULT 4 /* * These control the RNG used by the system RNG interface */ #define BOTAN_SYSTEM_RNG_DEVICE "/dev/urandom" #define BOTAN_SYSTEM_RNG_CRYPTOAPI_PROV_TYPE PROV_RSA_FULL /* * These paramaters control how many bytes to read from the system * PRNG, and how long to block if applicable. * * Timeout is ignored on Windows as CryptGenRandom doesn't block */ #define BOTAN_SYSTEM_RNG_POLL_DEVICES { "/dev/urandom", "/dev/random", "/dev/srandom" } /* * This directory will be monitored by ProcWalking_EntropySource and * the contents provided as entropy inputs to the RNG. May also be * usefully set to something like "/sys", depending on the system being * deployed to. Set to an empty string to disable. */ #define BOTAN_ENTROPY_PROC_FS_PATH "/proc" #define BOTAN_SYSTEM_RNG_POLL_REQUEST 64 #define BOTAN_SYSTEM_RNG_POLL_TIMEOUT_MS 20 /* How many times to read from the RDRAND/RDSEED RNGs. Each read generates 32 bits of output */ #define BOTAN_ENTROPY_INTEL_RNG_POLLS 32 // According to Intel, RDRAND is guaranteed to generate a random number within 10 retries on a working CPU #define BOTAN_ENTROPY_RDRAND_RETRIES 10 /* * RdSeed is not guaranteed to generate a random number within a specific number of retries * Define the number of retries here */ #define BOTAN_ENTROPY_RDSEED_RETRIES 20 /* * If no way of dynamically determining the cache line size for the * system exists, this value is used as the default. Used by the side * channel countermeasures rather than for alignment purposes, so it is * better to be on the smaller side if the exact value cannot be * determined. Typically 32 or 64 bytes on modern CPUs. */ #if !defined(BOTAN_TARGET_CPU_DEFAULT_CACHE_LINE_SIZE) #define BOTAN_TARGET_CPU_DEFAULT_CACHE_LINE_SIZE 32 #endif /** * Controls how AutoSeeded_RNG is instantiated */ #if !defined(BOTAN_AUTO_RNG_HMAC) #if defined(BOTAN_HAS_SHA2_64) #define BOTAN_AUTO_RNG_HMAC "HMAC(SHA-384)" #elif defined(BOTAN_HAS_SHA2_32) #define BOTAN_AUTO_RNG_HMAC "HMAC(SHA-256)" #elif defined(BOTAN_HAS_SHA3) #define BOTAN_AUTO_RNG_HMAC "HMAC(SHA-3(256))" #elif defined(BOTAN_HAS_SHA1) #define BOTAN_AUTO_RNG_HMAC "HMAC(SHA-1)" #endif // Otherwise, no hash found: leave BOTAN_AUTO_RNG_HMAC undefined #endif // Check for a common build problem: #if defined(BOTAN_TARGET_ARCH_IS_X86_64) && ((defined(_MSC_VER) && !defined(_WIN64)) || \ (defined(__clang__) && !defined(__x86_64__)) || \ (defined(__GNUG__) && !defined(__x86_64__))) #error "Trying to compile Botan configured as x86_64 with non-x86_64 compiler." #endif #if defined(BOTAN_TARGET_ARCH_IS_X86_32) && ((defined(_MSC_VER) && defined(_WIN64)) || \ (defined(__clang__) && !defined(__i386__)) || \ (defined(__GNUG__) && !defined(__i386__))) #error "Trying to compile Botan configured as x86_32 with non-x86_32 compiler." #endif #include #endif botan-2.4.0/src/build-data/cc/000077500000000000000000000000001322470703100160015ustar00rootroot00000000000000botan-2.4.0/src/build-data/cc/clang.txt000066400000000000000000000042771322470703100176400ustar00rootroot00000000000000macro_name CLANG binary_name clang++ lang_flags "-std=c++11 -D_REENTRANT" warning_flags "-Wall -Wextra -Wpedantic -Wshadow -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual" maintainer_warning_flags "-Wunreachable-code -Wdocumentation -Qunused-arguments -Werror -Wno-error=unused-parameter -Wno-error=unreachable-code -Wno-error=deprecated-declarations" optimization_flags "-O3" size_optimization_flags "-Os" #sanitizer_flags "-fsanitize=address,undefined -fsanitize-coverage=edge,indirect-calls,8bit-counters -fno-sanitize-recover=undefined" sanitizer_flags "-fsanitize=address,undefined" shared_flags "-fPIC" coverage_flags "--coverage" stack_protector_flags "-fstack-protector" visibility_build_flags "-fvisibility=hidden" visibility_attribute '__attribute__((visibility("default")))' darwin -> "$(CXX) -dynamiclib -fPIC -install_name $(INSTALLED_LIB_DIR)/{soname_abi} -current_version {darwin_so_current_ver} -compatibility_version {darwin_so_compat_ver}" # The default works for GNU ld and several other Unix linkers default -> "$(CXX) -shared -fPIC -Wl,-soname,{soname_abi}" darwin -> "$(LINKER) -headerpad_max_install_names" linux -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" freebsd -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" default -> "$(LINKER)" llvm -> "llvm-link" sse2 -> "-msse2" ssse3 -> "-mssse3" sse41 -> "-msse4.1" sse42 -> "-msse4.2" avx2 -> "-mavx2" bmi2 -> "-mbmi2" aesni -> "-maes -mpclmul -mssse3" rdrand -> "-mrdrnd" rdseed -> "-mrdseed" sha -> "-msha" altivec -> "-maltivec" arm32:neon -> "-mfpu=neon" arm64:neon -> "" all_llvm -> "-emit-llvm -fno-use-cxa-atexit" x86_32 -> "-march=SUBMODEL" x86_64 -> "-march=SUBMODEL" nehalem -> "-march=corei7" sandybridge -> "-march=corei7-avx" ivybridge -> "-march=core-avx-i" all!haiku -> "-pthread" openmp -> "-fopenmp" x86_32 -> "-m32" x86_64 -> "-m64" ppc64 -> "-m64" darwin -> "-stdlib=libc++" ios -> "-stdlib=libc++" netbsd -> "-D_NETBSD_SOURCE" botan-2.4.0/src/build-data/cc/ekopath.txt000066400000000000000000000007531322470703100202020ustar00rootroot00000000000000macro_name PATHSCALE binary_name pathCC optimization_flags "-O3" lang_flags "-D_REENTRANT -ansi -Wno-long-long" warning_flags "-W -Wall" ar_command pathCC ar_options "-ar -o" shared_flags "-fPIC" default -> "$(CXX) -shared -fPIC -Wl,-soname,{soname_abi}" athlon -> "-mcpu=athlon" pentium4 -> "-mcpu=pentium4" k8 -> "-mcpu=opteron" core2 -> "-mcpu=core" x86_32 -> "-mcpu=anyx86" x86_64 -> "-mcpu=athlon64" botan-2.4.0/src/build-data/cc/gcc.txt000066400000000000000000000073371322470703100173100ustar00rootroot00000000000000macro_name GCC binary_name g++ lang_flags "-std=c++11 -D_REENTRANT" # This should only contain flags which are included in GCC 4.8 warning_flags "-Wall -Wextra -Wpedantic -Wstrict-aliasing -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wzero-as-null-pointer-constant -Wnon-virtual-dtor" maintainer_warning_flags "-Wstrict-overflow=5 -Wold-style-cast -Wsuggest-override -Wshadow -Werror -Wno-error=strict-overflow -Wno-error=deprecated-declarations" optimization_flags "-O3" size_optimization_flags "-Os" shared_flags "-fPIC" coverage_flags "--coverage" stack_protector_flags "-fstack-protector" # GCC 4.8 sanitizer_flags "-D_GLIBCXX_DEBUG -fsanitize=address" # GCC 4.9 and later #sanitizer_flags "-D_GLIBCXX_DEBUG -fsanitize=address,undefined -fno-sanitize-recover=undefined" visibility_build_flags "-fvisibility=hidden" visibility_attribute '__attribute__((visibility("default")))' # The default works for GNU ld and several other Unix linkers default -> "$(CXX) -shared -fPIC -Wl,-soname,{soname_abi}" # Darwin, HP-UX and Solaris linkers use different syntax darwin -> "$(CXX) -dynamiclib -fPIC -install_name $(INSTALLED_LIB_DIR)/{soname_abi}" hpux -> "$(CXX) -shared -fPIC -Wl,+h,{soname_abi}" solaris -> "$(CXX) -shared -fPIC -Wl,-h,{soname_abi}" # AIX and OpenBSD don't use sonames at all aix -> "$(CXX) -shared -fPIC" openbsd -> "$(CXX) -shared -fPIC" linux -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" default -> "$(LINKER)" sse2 -> "-msse2" ssse3 -> "-mssse3" sse41 -> "-msse4.1" sse42 -> "-msse4.2" avx2 -> "-mavx2" bmi2 -> "-mbmi2" aesni -> "-maes -mpclmul -mssse3" rdrand -> "-mrdrnd" rdseed -> "-mrdseed" sha -> "-msha" altivec -> "-maltivec" # For Aarch32 -mfpu=neon is required # For Aarch64 NEON is enabled by default arm32:neon -> "-mfpu=neon" arm64:neon -> "" # Avoid using -march=i[3456]86, instead tune for generic i386 -> "-mtune=generic" i486 -> "-mtune=generic" i586 -> "-mtune=generic" i686 -> "-mtune=generic" # Translate to GCC-speak nehalem -> "-march=corei7" sandybridge -> "-march=corei7-avx" ivybridge -> "-march=core-avx-i" ppc601 -> "-mpowerpc -mcpu=601" cellppu -> "-mcpu=cell" e500v2 -> "-mcpu=8548" # No scheduler in GCC for anything after EV67 alpha-ev68 -> "-mcpu=ev67" alpha-ev7 -> "-mcpu=ev67" # The patch from Debian bug 594159 has this, don't know why though... sh4 -> "-m4 -mieee" # Default family options (SUBMODEL is substitued with the actual # submodel name). Anything after the pipe will be removed from the # submodel name before it's put into SUBMODEL. alpha -> "-mcpu=SUBMODEL|alpha-" arm32 -> "-march=SUBMODEL" arm64 -> "-march=SUBMODEL" superh -> "-mSUBMODEL|sh" hppa -> "-march=SUBMODEL|hppa" ia64 -> "-mtune=SUBMODEL" m68k -> "-mSUBMODEL" mips32 -> "-mips1 -mcpu=SUBMODEL|mips32-" mips64 -> "-mips3 -mcpu=SUBMODEL|mips64-" ppc32 -> "-mcpu=SUBMODEL|ppc" ppc64 -> "-mcpu=SUBMODEL|ppc" sparc32 -> "-mcpu=SUBMODEL -Wa,-xarch=v8plus|sparc32-" sparc64 -> "-mcpu=v9 -mtune=SUBMODEL" x86_32 -> "-march=SUBMODEL" x86_64 -> "-march=SUBMODEL" all_x86_32 -> "-momit-leaf-frame-pointer" all_x86_64 -> "-momit-leaf-frame-pointer" # Flags set here are included at compile and link time all!haiku -> "-pthread" openmp -> "-fopenmp" mips64 -> "-mabi=64" s390 -> "-m31" s390x -> "-m64" sparc32 -> "-m32 -mno-app-regs" sparc64 -> "-m64 -mno-app-regs" ppc64 -> "-m64" x86_64 -> "-m64" netbsd -> "-D_NETBSD_SOURCE" qnx -> "-fexceptions -D_QNX_SOURCE" cygwin -> "-U__STRICT_ANSI__" botan-2.4.0/src/build-data/cc/hpcc.txt000066400000000000000000000005501322470703100174570ustar00rootroot00000000000000macro_name HP_ACC binary_name aCC lang_flags "-AA -ext +eh -z" optimization_flags "+O2" warning_flags "+w" shared_flags "+Z" hppa1.0 -> "+DAportable" hppa1.1 -> "+DA1.1" hppa2.0 -> "+DA2.0W" default -> "$(CXX) +Z -b -Wl,+h,{soname_abi}" # Documented in cc(1), but not CC(1) (?) botan-2.4.0/src/build-data/cc/icc.txt000066400000000000000000000012771322470703100173070ustar00rootroot00000000000000macro_name INTEL binary_name icpc optimization_flags "-O2" size_optimization_flags "-Os" lang_flags "-std=c++11" warning_flags "-w1" shared_flags "-fPIC" sse2 -> "-msse2" ssse3 -> "-mssse3" sse41 -> "-msse4.1" sse42 -> "-msse4.2" avx2 -> "-march=core-avx2" aesni -> "-march=corei7" rdrand -> "-march=core-avx-i" pentium3 -> "-march=pentium3" pentium4 -> "-march=pentium4" pentium-m -> "-march=pentium-m" core2 -> "-march=core2" nehalem -> "-march=corei7" sandybridge -> "-march=corei7-avx" ivybridge -> "-march=core-avx-i" default -> "$(CXX) -fPIC -shared -Wl,-soname,{soname_abi}" botan-2.4.0/src/build-data/cc/msvc.txt000066400000000000000000000021421322470703100175110ustar00rootroot00000000000000macro_name MSVC binary_name cl linker_name link output_to_object "/Fo" output_to_exe "/OUT:" add_include_dir_option "/I" add_lib_dir_option "/LIBPATH:" add_lib_option "" compile_flags "/nologo /c" optimization_flags "/O2 /Oi" size_optimization_flags "/O1 /Os" # for debug info in the object file: #debug_info_flags "/Z7" # for using a PDB file: debug_info_flags "/Zi /FS" preproc_flags "/nologo /EP" lang_flags "/EHs /GR" warning_flags "/W4 /wd4250 /wd4251 /wd4275" visibility_build_flags "/DBOTAN_DLL=__declspec(dllexport)" visibility_attribute "__declspec(dllimport)" ar_command lib ar_options "/nologo" ar_output_to "/OUT:" sse2 -> "" ssse3 -> "" sse41 -> "" sse42 -> "" x86_64:avx2 -> "" bmi2 -> "" aesni -> "" clmul -> "" rdrand -> "" rdseed -> "" default -> "$(LINKER) /DLL" default-debug -> "$(LINKER) /DLL /DEBUG" default -> "$(LINKER)" default-debug -> "$(LINKER) /DEBUG" all -> "/MD /bigobj" all-debug -> "/MDd /bigobj" botan-2.4.0/src/build-data/cc/pgi.txt000066400000000000000000000005731322470703100173260ustar00rootroot00000000000000macro_name PORTLAND_GROUP binary_name pgCC optimization_flags "-fast -Minline" shared_flags "-fPIC" linux -> "$(CXX) -shared -fPIC -Wl,-soname,{soname_abi}" solaris -> "$(CXX) -G -fPIC -Wl,-h,{soname_abi}" i586 -> "-tp p5" i686 -> "-tp p6" athlon -> "-tp k7" pentium4 -> "-tp p6" x86_32 -> "-tp px" botan-2.4.0/src/build-data/cc/sunstudio.txt000066400000000000000000000030601322470703100205760ustar00rootroot00000000000000macro_name SUN_STUDIO binary_name CC optimization_flags "-xO2" shared_flags "-KPIC" warning_flags "+w -erroff=truncwarn,wnoretvalue" lang_flags "-std=c++11 +p -features=extensions -D__FUNCTION__=__func__" ar_command CC ar_options "-xar -o" default -> "$(CXX) -G -h{soname_abi}" i386 -> "-xtarget=486" i486 -> "-xtarget=486" i586 -> "-xtarget=pentium" k6 -> "-xtarget=pentium" i686 -> "-xtarget=pentium_pro" pentium3 -> "-xtarget=pentium3" pentium4 -> "-xtarget=pentium4" core2 -> "-xtarget=core2" opteron -> "-xtarget=opteron" nehalem -> "-xtarget=nehalem" sparc32-v9 -> "-xchip=ultra -xarch=v8" ultrasparc3 -> "-xchip=ultra3" niagra1 -> "-xchip=ultraT1" niagra2 -> "-xchip=ultraT2" sparc32 -> "-xchip=ultra -xarch=SUBMODEL|sparc32-" sparc64 -> "-xchip=generic" # Needed on some Linux distros linux -> "-library=stlport4" sparc64 -> "-xarch=v9" x86_64 -> "-m64" # Botan needs C++11, and that requires Sun Studio 12.4 or above. # Sun Studio 12.4 supports upto -xarch=avx2, but the processor must support it # AESNI requires -xarch=aes, and RDRAND requires -xarch=avx_i. # https://docs.oracle.com/cd/E37069_01/html/E37074/bjapp.html#OSSCGbkazd sse2 -> "-xarch=sse2" ssse3 -> "-xarch=ssse3" sse41 -> "-xarch=sse4.1" sse42 -> "-xarch=sse4.2" aesni -> "-xarch=aes" avx -> "-xarch=avx" rdrand -> "-xarch=avx_i" avx2 -> "-xarch=avx2" botan-2.4.0/src/build-data/cc/xlc.txt000066400000000000000000000004271322470703100173330ustar00rootroot00000000000000macro_name XLC binary_name xlC optimization_flags "-O2" lang_flags "-std=c++11" power8 -> "-qarch=pwr8" power9 -> "-qarch=pwr9" altivec -> "-qaltivec" default -> "$(CXX) -qmkshrobj" botan-2.4.0/src/build-data/cmake.in000066400000000000000000000061251322470703100170300ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.8.0) project(botan) if(POLICY CMP0042) cmake_policy(SET CMP0042 NEW) endif() set(BOTAN_SOURCES %{for lib_srcs} "${CMAKE_CURRENT_LIST_DIR}/%{i}" %{endfor} ) set(BOTAN_CLI %{for cli_srcs} "${CMAKE_CURRENT_LIST_DIR}/%{i}" %{endfor} ) set(BOTAN_TESTS %{for test_srcs} "${CMAKE_CURRENT_LIST_DIR}/%{i}" %{endfor} ) %{for isa_build_info} set_source_files_properties("${CMAKE_CURRENT_LIST_DIR}/%{src}" PROPERTIES COMPILE_FLAGS "%{isa_flags}") %{endfor} option(ENABLED_OPTIONAL_WARINIGS "If enabled more strict warning policy will be used" OFF) option(ENABLED_LTO "If enabled link time optimization will be used" OFF) set(COMPILER_FEATURES_RELEASE %{cc_lang_flags} %{cc_compile_opt_flags} %{cxx_abi_opt_flags}) set(COMPILER_FEATURES_DEBUG %{cc_lang_flags} %{cc_compile_debug_flags} %{cxx_abi_debug_flags}) set(COMPILER_FEATURES $<$>:${COMPILER_FEATURES_RELEASE}> $<$:${COMPILER_FEATURES_DEBUG}>) set(SHARED_FEATURES %{cmake_shared_flags}) set(STATIC_FEATURES -DBOTAN_DLL=) set(COMPILER_WARNINGS %{cc_warning_flags}) set(COMPILER_INCLUDE_DIRS build/include build/include/external) if(ENABLED_LTO) set(COMPILER_FEATURES ${COMPILER_FEATURES} -lto) endif() if(ENABLED_OPTIONAL_WARINIGS) set(COMPILER_OPTIONAL_WARNINGS -Wsign-promo -Wctor-dtor-privacy -Wdeprecated -Winit-self -Wnon-virtual-dtor -Wunused-macros -Wold-style-cast -Wuninitialized) endif() add_library(${PROJECT_NAME} STATIC ${BOTAN_SOURCES}) target_link_libraries(${PROJECT_NAME} PUBLIC %{cmake_link_to}) target_compile_options(${PROJECT_NAME} PUBLIC ${COMPILER_WARNINGS} ${COMPILER_FEATURES} ${COMPILER_OPTIONAL_WARNINGS} PRIVATE ${STATIC_FEATURES}) target_include_directories(${PROJECT_NAME} PUBLIC ${COMPILER_INCLUDE_DIRS}) set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME}-static) add_library(${PROJECT_NAME}_shared SHARED ${BOTAN_SOURCES}) target_link_libraries(${PROJECT_NAME}_shared PUBLIC %{cmake_link_to}) target_compile_options(${PROJECT_NAME}_shared PUBLIC ${COMPILER_WARNINGS} ${COMPILER_FEATURES} ${COMPILER_OPTIONAL_WARNINGS} PRIVATE ${SHARED_FEATURES}) target_include_directories(${PROJECT_NAME}_shared PUBLIC ${COMPILER_INCLUDE_DIRS}) set_target_properties(${PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) add_executable(${PROJECT_NAME}_cli ${BOTAN_CLI}) target_link_libraries(${PROJECT_NAME}_cli PRIVATE ${PROJECT_NAME}_shared ) set_target_properties(${PROJECT_NAME}_cli PROPERTIES OUTPUT_NAME ${PROJECT_NAME}-cli) add_executable(${PROJECT_NAME}_tests ${BOTAN_TESTS}) target_link_libraries(${PROJECT_NAME}_tests PRIVATE ${PROJECT_NAME}_shared ) set_target_properties(${PROJECT_NAME}_tests PROPERTIES OUTPUT_NAME botan-test) set(GLOBAL_CONFIGURATION_FILES configure.py .gitignore news.rst readme.rst) file(GLOB_RECURSE CONFIGURATION_FILES src/configs/* ) file(GLOB_RECURSE DOCUMENTATION_FILES doc/* ) file(GLOB_RECURSE HEADER_FILES src/*.h ) file(GLOB_RECURSE INFO_FILES src/lib/*info.txt ) add_custom_target(CONFIGURATION_DUMMY SOURCES ${GLOBAL_CONFIGURATION_FILES} ${CONFIGURATION_FILES} ${DOCUMENTATION_FILES} ${INFO_FILES} ${HEADER_FILES}) botan-2.4.0/src/build-data/detect_version.cpp000066400000000000000000000031411322470703100211340ustar00rootroot00000000000000/* * This file is preprocessed to produce output that is examined by * configure.py to determine the compilers version number. */ #if defined(_MSC_VER) /* _MSC_VER Defined as an integer literal that encodes the major and minor number elements of the compiler's version number. The major number is the first element of the period-delimited version number and the minor number is the second element. For example, if the version number of the Visual C++ compiler is 17.00.51106.1, the _MSC_VER macro evaluates to 1700. https://msdn.microsoft.com/en-us/library/b0084kay.aspx */ MSVC _MSC_VER #elif defined(__xlC__) XLC __xlC__ #elif defined(__clang__) && defined(__apple_build_version__) /* Map Apple LLVM versions as used in XCode back to standard Clang. This is not exact since the versions used in XCode are actually forks of Clang and do not coorespond perfectly to standard Clang releases. In addition we don't bother mapping very old versions (anything before XCode 7 is treated like Clang 3.5, which is the oldest version we support) and for "future" versions we simply treat them as Clang 4.0, since we don't currenly rely on any features not included in 4.0 */ #if __clang_major__ >= 9 CLANG 4 0 #elif __clang_major__ == 8 CLANG 3 9 #elif __clang_major__ == 7 && __clang_minor__ == 3 CLANG 3 8 #elif __clang_major__ == 7 CLANG 3 7 #else CLANG 3 5 #endif #elif defined(__clang__) CLANG __clang_major__ __clang_minor__ #elif defined(__GNUG__) GCC __GNUC__ __GNUC_MINOR__ #else UNKNOWN 0 0 #endif botan-2.4.0/src/build-data/innosetup.in000066400000000000000000000042771322470703100200020ustar00rootroot00000000000000; A script for packaging botan with InnoSetup [Setup] AppName=Botan AppVerName=Botan %{version} AppPublisher=Jack Lloyd AppPublisherURL=https://botan.randombit.net/ AppVersion=%{version} VersionInfoCopyright=Copyright (C) 1999-2012 Jack Lloyd and others VersionInfoVersion=%{version_major}.%{version_minor}.%{version_patch}.0 ; Require at least Windows XP MinVersion=5.1 ArchitecturesAllowed=%{innosetup_arch} ArchitecturesInstallIn64BitMode=%{innosetup_arch} DefaultDirName={pf}\botan DefaultGroupName=botan SolidCompression=yes OutputDir=. OutputBaseFilename=botan-%{version}-%{arch} [Types] Name: "user"; Description: "User" Name: "devel"; Description: "Developer" Name: "custom"; Description: "Custom"; Flags: iscustom [Components] name: "dll"; Description: "Runtime DLLs"; Types: user devel custom; Flags: fixed name: "implib"; Description: "Import Library"; Types: devel name: "includes"; Description: "Include Files"; Types: devel name: "docs"; Description: "Developer Documentation"; Types: devel [Files] ; DLL and license file is always included Source: "..\doc\license.rst"; DestDir: "{app}"; Components: dll; AfterInstall: ConvertLineEndings Source: "..\botan.dll"; DestDir: "{app}"; Components: dll Source: "..\botan.dll.manifest"; DestDir: "{app}"; Components: dll; Flags: skipifsourcedoesntexist Source: "include\botan\*"; DestDir: "{app}\include\botan"; Components: includes; AfterInstall: ConvertLineEndings Source: "..\doc\*.rst"; DestDir: "{app}\doc"; Excludes: "license.rst"; Components: docs; AfterInstall: ConvertLineEndings Source: "..\doc\examples\*.cpp"; DestDir: "{app}\doc\examples"; Components: docs; AfterInstall: ConvertLineEndings Source: "..\botan.exp"; DestDir: "{app}"; Components: implib Source: "..\botan.lib"; DestDir: "{app}"; Components: implib [Code] const LF = #10; CR = #13; CRLF = CR + LF; procedure ConvertLineEndings(); var FilePath : String; FileContents : String; begin FilePath := ExpandConstant(CurrentFileName) if ExtractFileName(CurrentFileName) <> 'build.h' then begin LoadStringFromFile(FilePath, FileContents); StringChangeEx(FileContents, LF, CRLF, False); SaveStringToFile(FilePath, FileContents, False); end; end; botan-2.4.0/src/build-data/makefile.in000066400000000000000000000063451322470703100175310ustar00rootroot00000000000000# Paths to relevant programs CXX = %{cxx} %{cxx_abi_flags} LINKER = %{linker} AR = %{ar_command} PYTHON_EXE = %{python_exe} # Compiler Flags LANG_FLAGS = %{cc_lang_flags} CXXFLAGS = %{cc_compile_flags} WARN_FLAGS = %{cc_warning_flags} SO_OBJ_FLAGS = %{shared_flags} LDFLAGS = %{ldflags} EXE_LINK_CMD = %{exe_link_cmd} LIB_LINKS_TO = %{link_to} EXE_LINKS_TO = %{link_to_botan} $(LIB_LINKS_TO) BUILD_FLAGS = $(LANG_FLAGS) $(CXXFLAGS) $(WARN_FLAGS) SCRIPTS_DIR = %{scripts_dir} INSTALLED_LIB_DIR = %{prefix}/%{libdir} # The primary target all: libs cli docs tests # Executable targets CLI = %{cli_exe} TEST = %{test_exe} LIBRARIES = %{library_targets} cli: $(CLI) tests: $(TEST) libs: $(LIBRARIES) docs: %{doc_stamp_file} # Misc targets %{if make_supports_phony} .PHONY = all cli libs tests docs clean distclean install %{endif} %{doc_stamp_file}: %{doc_dir}/manual/*.rst $(PYTHON_EXE) $(SCRIPTS_DIR)/build_docs.py --build-dir="%{build_dir}" clean: $(PYTHON_EXE) $(SCRIPTS_DIR)/cleanup.py --build-dir="%{build_dir}" distclean: $(PYTHON_EXE) $(SCRIPTS_DIR)/cleanup.py --build-dir="%{build_dir}" --distclean install: libs cli docs $(PYTHON_EXE) $(SCRIPTS_DIR)/install.py --prefix=%{prefix} --build-dir="%{build_dir}" --bindir=%{bindir} --libdir=%{libdir} --docdir=%{docdir} --includedir=%{includedir} # Object Files LIBOBJS = %{join lib_objs} CLIOBJS = %{join cli_objs} TESTOBJS = %{join test_objs} # Executable targets $(CLI): $(LIBRARIES) $(CLIOBJS) $(EXE_LINK_CMD) $(LDFLAGS) $(CLIOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ %{post_link_cmd} $(TEST): $(LIBRARIES) $(TESTOBJS) $(EXE_LINK_CMD) $(LDFLAGS) $(TESTOBJS) $(EXE_LINKS_TO) %{output_to_exe}$@ %{post_link_cmd} %{if build_fuzzers} FUZZERS = %{fuzzer_bin} fuzzers: libs $(FUZZERS) fuzzer_corpus: git clone --depth=1 https://github.com/randombit/crypto-corpus.git fuzzer_corpus fuzzer_corpus_zip: fuzzer_corpus ./src/scripts/create_corpus_zip.py fuzzer_corpus %{fuzzobj_dir} %{endif} # Library targets %{if build_static_lib} %{out_dir}/%{static_lib_name}: $(LIBOBJS) $(AR) %{ar_options} %{ar_output_to}$@ $(LIBOBJS) %{endif} %{if build_unix_shared_lib} %{out_dir}/%{shared_lib_name}: $(LIBOBJS) %{lib_link_cmd} $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_base} cd %{out_dir} && ln -fs %{shared_lib_name} %{soname_patch} %{endif} %{if build_msvc_shared_lib} %{out_dir}/%{shared_lib_name}: $(LIBOBJS) %{lib_link_cmd} $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) %{output_to_exe}$@ %{endif} # Build Commands %{for lib_build_info} %{obj}: %{src} $(CXX) %{isa_flags} $(SO_OBJ_FLAGS) $(BUILD_FLAGS) %{include_paths} %{dash_c} %{src} %{dash_o}$@ %{endfor} %{for cli_build_info} %{obj}: %{src} $(CXX) %{isa_flags} $(BUILD_FLAGS) %{include_paths} %{dash_c} %{src} %{dash_o}$@ %{endfor} %{for test_build_info} %{obj}: %{src} $(CXX) %{isa_flags} $(BUILD_FLAGS) %{include_paths} %{dash_c} %{src} %{dash_o}$@ %{endfor} %{for fuzzer_build_info} %{obj}: %{src} $(CXX) %{isa_flags} $(BUILD_FLAGS) %{include_paths} %{dash_c} %{src} %{dash_o}$@ %{exe}: %{obj} $(LIBRARIES) $(EXE_LINK_CMD) %{obj} $(EXE_LINKS_TO) %{fuzzer_lib} %{output_to_exe}$@ %{endfor} botan-2.4.0/src/build-data/oids.txt000066400000000000000000000200431322470703100171120ustar00rootroot00000000000000# Regenerate with ./src/scripts/oids.py oids > src/lib/asn1/oids.cpp # AND ./src/scripts/oids.py dn_ub > src/lib/x509/x509_dn_ub.cpp # (if you modified something under [dn] # AND ./src/scripts/oids.py pads > src/lib/pk_pad/padding.cpp # (if you modified something under [signature] # Public key types [pubkey] 1.2.840.113549.1.1.1 = RSA 2.5.8.1.1 = RSA 1.2.840.10040.4.1 = DSA 1.2.840.10046.2.1 = DH 1.3.6.1.4.1.3029.1.2.1 = ElGamal 1.3.6.1.4.1.25258.1.3 = McEliece 1.3.101.110 = Curve25519 1.3.6.1.4.1.25258.1.5 = XMSS 1.3.101.112 = Ed25519 # X9.62 ecPublicKey, valid for ECDSA and ECDH (RFC 3279 sec 2.3.5) 1.2.840.10045.2.1 = ECDSA 1.3.132.1.12 = ECDH 1.2.156.10197.1.301.1 = SM2_Sig 1.2.156.10197.1.301.2 = SM2_Kex 1.2.156.10197.1.301.3 = SM2_Enc # ecgPublicKey (see https://www.teletrust.de/projekte/oid/) 1.3.36.3.3.2.5.2.1 = ECGDSA # EC-KCDSA mechanism (Elliptic Curve KCDSA) 1.0.14888.3.0.5 = ECKCDSA 1.2.643.2.2.19 = GOST-34.10 [cipher] # Cipher modes 1.3.14.3.2.7 = DES/CBC 1.2.840.113549.3.7 = TripleDES/CBC 1.2.840.113549.3.2 = RC2/CBC 1.2.840.113533.7.66.10 = CAST-128/CBC 2.16.840.1.101.3.4.1.2 = AES-128/CBC 2.16.840.1.101.3.4.1.22 = AES-192/CBC 2.16.840.1.101.3.4.1.42 = AES-256/CBC 1.2.410.200004.1.4 = SEED/CBC 1.3.6.1.4.1.25258.3.1 = Serpent/CBC 1.3.6.1.4.1.25258.3.2 = Threefish-512/CBC 1.3.6.1.4.1.25258.3.3 = Twofish/CBC 2.16.840.1.101.3.4.1.6 = AES-128/GCM 2.16.840.1.101.3.4.1.26 = AES-192/GCM 2.16.840.1.101.3.4.1.46 = AES-256/GCM 2.16.840.1.101.3.4.1.7 = AES-128/CCM 2.16.840.1.101.3.4.1.27 = AES-192/CCM 2.16.840.1.101.3.4.1.47 = AES-256/CCM 1.3.6.1.4.1.25258.3.101 = Serpent/GCM 1.3.6.1.4.1.25258.3.102 = Twofish/GCM 1.3.6.1.4.1.25258.3.2.1 = AES-128/OCB 1.3.6.1.4.1.25258.3.2.2 = AES-192/OCB 1.3.6.1.4.1.25258.3.2.3 = AES-256/OCB 1.3.6.1.4.1.25258.3.2.4 = Serpent/OCB 1.3.6.1.4.1.25258.3.2.5 = Twofish/OCB [hash] # Hash functions 1.2.840.113549.2.5 = MD5 1.3.6.1.4.1.11591.12.2 = Tiger(24,3) 1.2.156.10197.1.401 = SM3 1.3.14.3.2.26 = SHA-160 1.3.36.3.2.1 = RIPEMD-160 # From NIST: 2.16.840.1.101.3.4.2.1 = SHA-256 2.16.840.1.101.3.4.2.2 = SHA-384 2.16.840.1.101.3.4.2.3 = SHA-512 2.16.840.1.101.3.4.2.4 = SHA-224 2.16.840.1.101.3.4.2.6 = SHA-512-256 2.16.840.1.101.3.4.2.7 = SHA-3(224) 2.16.840.1.101.3.4.2.8 = SHA-3(256) 2.16.840.1.101.3.4.2.9 = SHA-3(384) 2.16.840.1.101.3.4.2.10 = SHA-3(512) 2.16.840.1.101.3.4.2.11 = SHAKE-128 2.16.840.1.101.3.4.2.12 = SHAKE-256 1.2.643.7.1.1.2.2 = Streebog-256 1.2.643.7.1.1.2.3 = Streebog-512 [mac] # MACs 1.2.840.113549.2.7 = HMAC(SHA-160) 1.2.840.113549.2.8 = HMAC(SHA-224) 1.2.840.113549.2.9 = HMAC(SHA-256) 1.2.840.113549.2.10 = HMAC(SHA-384) 1.2.840.113549.2.11 = HMAC(SHA-512) [keywrap] # Keywrap algorithms 1.2.840.113549.1.9.16.3.6 = KeyWrap.TripleDES 1.2.840.113549.1.9.16.3.7 = KeyWrap.RC2 1.2.840.113533.7.66.15 = KeyWrap.CAST-128 2.16.840.1.101.3.4.1.5 = KeyWrap.AES-128 2.16.840.1.101.3.4.1.25 = KeyWrap.AES-192 2.16.840.1.101.3.4.1.45 = KeyWrap.AES-256 [compression] 1.2.840.113549.1.9.16.3.8 = Compression.Zlib # Signature algos [signature] 1.2.840.113549.1.1.4 = RSA/EMSA3(MD5) 1.2.840.113549.1.1.5 = RSA/EMSA3(SHA-160) 1.2.840.113549.1.1.8 = MGF1 1.2.840.113549.1.1.10 = RSA/EMSA4 1.2.840.113549.1.1.11 = RSA/EMSA3(SHA-256) 1.2.840.113549.1.1.12 = RSA/EMSA3(SHA-384) 1.2.840.113549.1.1.13 = RSA/EMSA3(SHA-512) 1.2.840.113549.1.1.14 = RSA/EMSA3(SHA-224) 1.2.840.113549.1.1.16 = RSA/EMSA3(SHA-512-256) 1.3.36.3.3.1.2 = RSA/EMSA3(RIPEMD-160) 1.2.156.10197.1.504 = RSA/EMSA3(SM3) 1.2.840.10040.4.3 = DSA/EMSA1(SHA-160) 2.16.840.1.101.3.4.3.1 = DSA/EMSA1(SHA-224) 2.16.840.1.101.3.4.3.2 = DSA/EMSA1(SHA-256) 2.16.840.1.101.3.4.3.3 = DSA/EMSA1(SHA-384) 2.16.840.1.101.3.4.3.4 = DSA/EMSA1(SHA-512) 2.16.840.1.101.3.4.3.5 = DSA/EMSA1(SHA-3(224)) 2.16.840.1.101.3.4.3.6 = DSA/EMSA1(SHA-3(256)) 2.16.840.1.101.3.4.3.7 = DSA/EMSA1(SHA-3(384)) 2.16.840.1.101.3.4.3.8 = DSA/EMSA1(SHA-3(512)) 2.16.840.1.101.3.4.3.9 = ECDSA/EMSA1(SHA-3(224)) 2.16.840.1.101.3.4.3.10 = ECDSA/EMSA1(SHA-3(256)) 2.16.840.1.101.3.4.3.11 = ECDSA/EMSA1(SHA-3(384)) 2.16.840.1.101.3.4.3.12 = ECDSA/EMSA1(SHA-3(512)) 2.16.840.1.101.3.4.3.13 = RSA/EMSA3(SHA-3(224)) 2.16.840.1.101.3.4.3.14 = RSA/EMSA3(SHA-3(256)) 2.16.840.1.101.3.4.3.15 = RSA/EMSA3(SHA-3(384)) 2.16.840.1.101.3.4.3.16 = RSA/EMSA3(SHA-3(512)) 1.2.840.10045.4.1 = ECDSA/EMSA1(SHA-160) 1.2.840.10045.4.3.1 = ECDSA/EMSA1(SHA-224) 1.2.840.10045.4.3.2 = ECDSA/EMSA1(SHA-256) 1.2.840.10045.4.3.3 = ECDSA/EMSA1(SHA-384) 1.2.840.10045.4.3.4 = ECDSA/EMSA1(SHA-512) 1.3.36.3.3.2.5.4.1 = ECGDSA/EMSA1(RIPEMD-160) 1.3.36.3.3.2.5.4.2 = ECGDSA/EMSA1(SHA-160) 1.3.36.3.3.2.5.4.3 = ECGDSA/EMSA1(SHA-224) 1.3.36.3.3.2.5.4.4 = ECGDSA/EMSA1(SHA-256) 1.3.36.3.3.2.5.4.5 = ECGDSA/EMSA1(SHA-384) 1.3.36.3.3.2.5.4.6 = ECGDSA/EMSA1(SHA-512) 1.2.410.200004.1.100.4.3 = ECKCDSA/EMSA1(SHA-1) 1.2.410.200004.1.100.4.4 = ECKCDSA/EMSA1(SHA-224) 1.2.410.200004.1.100.4.5 = ECKCDSA/EMSA1(SHA-256) 1.2.643.2.2.3 = GOST-34.10/EMSA1(GOST-R-34.11-94) 1.3.6.1.4.1.25258.1.6.1 = GOST-34.10/EMSA1(SHA-256) # Encryption algos [encryption] 1.2.840.113549.1.1.7 = RSA/OAEP # DN with upper bounds from RFC 5280, Appendix A [dn] 2.5.4.3 = X520.CommonName = 64 2.5.4.4 = X520.Surname = 40 2.5.4.5 = X520.SerialNumber = 64 2.5.4.6 = X520.Country = 3 2.5.4.7 = X520.Locality = 128 2.5.4.8 = X520.State = 128 2.5.4.10 = X520.Organization = 64 2.5.4.11 = X520.OrganizationalUnit = 64 2.5.4.12 = X520.Title = 64 # the following three types are naming attributes of type "X520name" and inherit its bound 2.5.4.42 = X520.GivenName = 32768 2.5.4.43 = X520.Initials = 32768 2.5.4.44 = X520.GenerationalQualifier = 32768 2.5.4.46 = X520.DNQualifier = 64 2.5.4.65 = X520.Pseudonym = 128 [pbe] 1.2.840.113549.1.5.12 = PKCS5.PBKDF2 1.2.840.113549.1.5.13 = PBE-PKCS5v20 [pkcs9] 1.2.840.113549.1.9.1 = PKCS9.EmailAddress 1.2.840.113549.1.9.2 = PKCS9.UnstructuredName 1.2.840.113549.1.9.3 = PKCS9.ContentType 1.2.840.113549.1.9.4 = PKCS9.MessageDigest 1.2.840.113549.1.9.7 = PKCS9.ChallengePassword 1.2.840.113549.1.9.14 = PKCS9.ExtensionRequest [pkix] 2.5.29.14 = X509v3.SubjectKeyIdentifier 2.5.29.15 = X509v3.KeyUsage 2.5.29.17 = X509v3.SubjectAlternativeName 2.5.29.18 = X509v3.IssuerAlternativeName 2.5.29.19 = X509v3.BasicConstraints 2.5.29.20 = X509v3.CRLNumber 2.5.29.21 = X509v3.ReasonCode 2.5.29.23 = X509v3.HoldInstructionCode 2.5.29.24 = X509v3.InvalidityDate 2.5.29.28 = X509v3.CRLIssuingDistributionPoint 2.5.29.30 = X509v3.NameConstraints 2.5.29.31 = X509v3.CRLDistributionPoints 2.5.29.32 = X509v3.CertificatePolicies 2.5.29.35 = X509v3.AuthorityKeyIdentifier 2.5.29.36 = X509v3.PolicyConstraints 2.5.29.37 = X509v3.ExtendedKeyUsage 1.3.6.1.5.5.7.1.1 = PKIX.AuthorityInformationAccess 2.5.29.32.0 = X509v3.AnyPolicy 1.3.6.1.5.5.7.3.1 = PKIX.ServerAuth 1.3.6.1.5.5.7.3.2 = PKIX.ClientAuth 1.3.6.1.5.5.7.3.3 = PKIX.CodeSigning 1.3.6.1.5.5.7.3.4 = PKIX.EmailProtection 1.3.6.1.5.5.7.3.5 = PKIX.IPsecEndSystem 1.3.6.1.5.5.7.3.6 = PKIX.IPsecTunnel 1.3.6.1.5.5.7.3.7 = PKIX.IPsecUser 1.3.6.1.5.5.7.3.8 = PKIX.TimeStamping 1.3.6.1.5.5.7.3.9 = PKIX.OCSPSigning 1.3.6.1.5.5.7.8.5 = PKIX.XMPPAddr 1.3.6.1.5.5.7.48.1 = PKIX.OCSP 1.3.6.1.5.5.7.48.1.1 = PKIX.OCSP.BasicResponse 1.3.6.1.5.5.7.48.2 = PKIX.CertificateAuthorityIssuers 1.3.6.1.4.1.311.20.2.2 = Microsoft SmartcardLogon # ECC param sets [ecc_param] 1.3.132.0.8 = secp160r1 1.3.132.0.9 = secp160k1 1.3.132.0.10 = secp256k1 1.3.132.0.30 = secp160r2 1.3.132.0.31 = secp192k1 1.3.132.0.32 = secp224k1 1.3.132.0.33 = secp224r1 1.3.132.0.34 = secp384r1 1.3.132.0.35 = secp521r1 1.3.6.1.4.1.8301.3.1.2.9.0.38 = secp521r1 1.2.840.10045.3.1.1 = secp192r1 1.2.840.10045.3.1.2 = x962_p192v2 1.2.840.10045.3.1.3 = x962_p192v3 1.2.840.10045.3.1.4 = x962_p239v1 1.2.840.10045.3.1.5 = x962_p239v2 1.2.840.10045.3.1.6 = x962_p239v3 1.2.840.10045.3.1.7 = secp256r1 1.2.156.10197.1.301 = sm2p256v1 1.3.36.3.3.2.8.1.1.1 = brainpool160r1 1.3.36.3.3.2.8.1.1.3 = brainpool192r1 1.3.36.3.3.2.8.1.1.5 = brainpool224r1 1.3.36.3.3.2.8.1.1.7 = brainpool256r1 1.3.36.3.3.2.8.1.1.9 = brainpool320r1 1.3.36.3.3.2.8.1.1.11 = brainpool384r1 1.3.36.3.3.2.8.1.1.13 = brainpool512r1 1.2.643.2.2.35.1 = gost_256A 1.2.643.2.2.36.0 = gost_256A 1.2.250.1.223.101.256.1 = frp256v1 botan-2.4.0/src/build-data/os/000077500000000000000000000000001322470703100160355ustar00rootroot00000000000000botan-2.4.0/src/build-data/os/aix.txt000066400000000000000000000002401322470703100173530ustar00rootroot00000000000000os_type unix soname_suffix "so" use_stack_protector no clock_gettime gmtime_r dlopen readdir sockets threads filesystem botan-2.4.0/src/build-data/os/android.txt000066400000000000000000000004551322470703100202220ustar00rootroot00000000000000os_type unix soname_suffix "so" clock_gettime posix_mlock gmtime_r # getauxval is available in Android NDK for min API 18 and in Crystax NDK # for all min API levels. Comment out if older API levels must be supported. getauxval dlopen readdir threads filesystem botan-2.4.0/src/build-data/os/cygwin.txt000066400000000000000000000005371322470703100201030ustar00rootroot00000000000000os_type unix program_suffix .exe # Cygwin supports shared libs fine, but there are problems with making a Botan # shared library when libraries it depends on are static-only (such as libz). # So until I can figure out a work-around, it's disabled. install_root c:\Botan doc_dir docs readdir threads filesystem botan-2.4.0/src/build-data/os/darwin.txt000066400000000000000000000011341322470703100200610ustar00rootroot00000000000000os_type unix soname_pattern_base "libbotan-{version_major}.dylib" soname_pattern_abi "libbotan-{version_major}.{abi_rev}.dylib" soname_pattern_patch "libbotan-{version_major}.{abi_rev}.{version_minor}.{version_patch}.dylib" # In order that these executables work from the build directory, # we need to change the install names so_post_link_command "install_name_tool -change '$(INSTALLED_LIB_DIR)/{soname_abi}' '@executable_path/{soname_abi}' $@" doc_dir doc arc4random dlopen filesystem gmtime_r readdir sockets threads macos macosx osx botan-2.4.0/src/build-data/os/dragonfly.txt000066400000000000000000000002131322470703100205570ustar00rootroot00000000000000os_type unix soname_suffix "so" clock_gettime posix_mlock sockets threads filesystem readdir dlopen botan-2.4.0/src/build-data/os/freebsd.txt000066400000000000000000000002241322470703100202060ustar00rootroot00000000000000os_type unix soname_suffix "so" clock_gettime posix_mlock gmtime_r dlopen readdir sockets threads filesystem botan-2.4.0/src/build-data/os/haiku.txt000066400000000000000000000004321322470703100176760ustar00rootroot00000000000000os_type unix soname_suffix "so" install_root /boot header_dir develop/headers lib_dir system/lib doc_dir system/documentation use_stack_protector no clock_gettime gmtime_r dlopen readdir sockets threads filesystem beos botan-2.4.0/src/build-data/os/hpux.txt000066400000000000000000000002441322470703100175620ustar00rootroot00000000000000os_type unix # It is "sl" on HP-PA, but HP-UX on PA is EOL soname_suffix "so" threads filesystem hp-ux botan-2.4.0/src/build-data/os/hurd.txt000066400000000000000000000002001322470703100175300ustar00rootroot00000000000000os_type unix soname_suffix "so" posix_mlock threads filesystem gnu botan-2.4.0/src/build-data/os/includeos.txt000066400000000000000000000000711322470703100205610ustar00rootroot00000000000000os_type unikernel botan-2.4.0/src/build-data/os/ios.txt000066400000000000000000000006131322470703100173700ustar00rootroot00000000000000os_type unix soname_pattern_base "libbotan-{version_major}.{version_minor}.dylib" soname_pattern_abi "libbotan-{version_major}.{version_minor}.{abi_rev}.dylib" soname_pattern_patch "libbotan-{version_major}.{version_minor}.{abi_rev}.{version_patch}.dylib" doc_dir doc arc4random dlopen filesystem gmtime_r readdir sockets threads botan-2.4.0/src/build-data/os/linux.txt000066400000000000000000000002761322470703100177420ustar00rootroot00000000000000os_type unix soname_suffix "so" clock_gettime posix_mlock gmtime_r dlopen getauxval readdir sockets threads filesystem linux-gnu botan-2.4.0/src/build-data/os/llvm.txt000066400000000000000000000001441322470703100175470ustar00rootroot00000000000000 obj_suffix bc ar_command llvm-link ar_options -o filesystem botan-2.4.0/src/build-data/os/mingw.txt000066400000000000000000000004171322470703100177210ustar00rootroot00000000000000os_type windows program_suffix .exe obj_suffix o static_suffix a install_root /mingw header_dir include lib_dir lib doc_dir share/doc msys mingw32.* cryptgenrandom loadlibrary virtual_lock threads filesystem botan-2.4.0/src/build-data/os/nacl.txt000066400000000000000000000000571322470703100175150ustar00rootroot00000000000000 threads botan-2.4.0/src/build-data/os/netbsd.txt000066400000000000000000000002141322470703100200520ustar00rootroot00000000000000os_type unix soname_suffix "so" clock_gettime posix_mlock gmtime_r dlopen readdir threads filesystem botan-2.4.0/src/build-data/os/openbsd.txt000066400000000000000000000005301322470703100202260ustar00rootroot00000000000000os_type unix soname_pattern_base "libbotan-{version_major}.so" soname_pattern_abi "libbotan-{version_major}.so.{abi_rev}" soname_pattern_patch "libbotan-{version_major}.so.{abi_rev}.{version_minor}" arc4random clock_gettime explicit_bzero posix_mlock gmtime_r dlopen readdir sockets threads filesystem botan-2.4.0/src/build-data/os/qnx.txt000066400000000000000000000002471322470703100174070ustar00rootroot00000000000000# not really, but for our purposes os_type unix soname_suffix "so" clock_gettime posix_mlock gmtime_r dlopen threads filesystem botan-2.4.0/src/build-data/os/solaris.txt000066400000000000000000000002121322470703100202450ustar00rootroot00000000000000os_type unix soname_suffix "so" posix_mlock threads readdir filesystem sunos botan-2.4.0/src/build-data/os/windows.txt000066400000000000000000000010501322470703100202640ustar00rootroot00000000000000os_type windows cli_exe_name botan-cli program_suffix .exe obj_suffix obj static_suffix lib lib_prefix '' # For historical reasons? the library does not have the major number on Windows # This should probably be fixed in a future major release. library_name 'botan' soname_pattern_base "{libname}.dll" install_root c:\\Botan doc_dir docs cryptgenrandom gmtime_s loadlibrary query_perf_counter virtual_lock rtlsecurezeromemory stl_filesystem_msvc threads filesystem sockets win32 MSWin32 botan-2.4.0/src/build-data/os/winphone.txt000066400000000000000000000004131322470703100204230ustar00rootroot00000000000000os_type windows # ? program_suffix .exe obj_suffix obj static_suffix lib install_root c:\\Botan doc_dir docs crypto_ng gmtime_s loadlibrary query_perf_counter rtlsecurezeromemory #stl_filesystem_msvc threads filesystem sockets botan-2.4.0/src/build-data/policy/000077500000000000000000000000001322470703100167135ustar00rootroot00000000000000botan-2.4.0/src/build-data/policy/bsi.txt000066400000000000000000000026151322470703100202350ustar00rootroot00000000000000 # block aes # modes gcm cbc mode_pad # stream ctr # hash sha2_32 sha2_64 sha3 # mac cmac hmac gmac # kdf kdf1_iso18033 sp800_108 sp800_56c # pk_pad eme_oaep emsa_pssr emsa1 iso9796 # pubkey dlies dh rsa dsa ecdsa ecgdsa ecies eckcdsa ecdh xmss # rng auto_rng hmac_drbg # block aes_ni aes_ssse3 # modes clmul clmul_ssse3 pmull # hash sha2_32_x86 sha2_32_armv8 # entropy sources darwin_secrandom dev_random proc_walk rdrand rdseed win32_stats # rng rdrand_rng system_rng # utils http_util # needed by x509 for OCSP online checks locking_allocator simd # block aria blowfish camellia cascade cast des gost_28147 idea idea_sse2 kasumi lion misty1 noekeon noekeon_simd seed serpent serpent_simd shacal2 shacal2_x86 shacal2_simd sm4 threefish threefish_avx2 twofish xtea # modes ccm chacha20poly1305 eax ocb siv cfb # stream chacha chacha_sse2 ofb rc4 salsa20 shake_cipher # kdf hkdf kdf1 kdf2 prf_x942 sp800_56a # pubkey cecpq1 curve25519 ed25519 elgamal gost_3410 mce mceies rfc6979 newhope sm2 # pk_pad #eme_pkcs1 // needed for tls #emsa_pkcs1 // needed for tls emsa_raw emsa_x931 # hash blake2 comb4p gost_3411 md4 #md5 // needed for tls rmd160 #sha1 // needed for tls #sha1_sse2 // needed for tls shake skein sm3 streebog tiger whirlpool keccak # rng chacha_rng # mac cbc_mac poly1305 siphash x919_mac # misc bcrypt botan-2.4.0/src/build-data/policy/modern.txt000066400000000000000000000020771322470703100207460ustar00rootroot00000000000000 aes serpent threefish chacha sha2_32 sha2_64 blake2 skein keccak sha3 gcm ocb chacha20poly1305 kdf2 hkdf cmac hmac poly1305 siphash pbkdf2 bcrypt # required for private key encryption pbes2 ed25519 curve25519 ecdh ecdsa rsa rfc6979 eme_oaep emsa_pssr emsa1 auto_rng hmac_drbg ffi tls prf_tls newhope ed25519 clmul clmul_ssse3 pmull locking_allocator http_util # needed by x509 for OCSP online checks aes_ni aes_ssse3 serpent_simd threefish_avx2 chacha_sse2 sha1_sse2 sha1_x86 sha1_armv8 sha2_32_x86 sha2_32_armv8 simd sessions_sql certstor_sql rdrand_rng system_rng # entropy sources darwin_secrandom dev_random proc_walk rdrand rdseed win32_stats # Just say no to TLS 1.0 tls_cbc cast des gost_28147 idea idea_sse2 kasumi lion misty1 rc4 seed xtea cbc_mac x919_mac # MD5 and SHA1 are broken but not prohibited. They are widely in use # in non-crypto contexts and are required by TLS currently md4 gost_3411 cfb ofb elgamal gost_3410 emsa_x931 pbkdf1 prf_x942 passhash9 cryptobox botan-2.4.0/src/build-data/policy/nist.txt000066400000000000000000000026351322470703100204370ustar00rootroot00000000000000 des aes gcm ccm ctr cbc mode_pad # hash sha2_32 sha2_64 sha3 # mac cmac hmac gmac # kdf sp800_108 sp800_56a sp800_56c shake # pk_pad eme_oaep emsa_pssr emsa1 # pubkey dh rsa dsa ecdsa ecdh # rng auto_rng hmac_drbg # keywrap rfc3394 # block aes_ni aes_ssse3 # hash sha1_sse2 sha1_x86 sha1_armv8 sha2_32_x86 sha2_32_armv8 # modes clmul clmul_ssse3 pmull # hash sha2_32_x86 sha2_32_armv8 # entropy sources darwin_secrandom dev_random proc_walk rdrand rdseed win32_stats # rng rdrand_rng system_rng # utils http_util # needed by x509 for OCSP online checks locking_allocator simd # block aria blowfish camellia cascade cast gost_28147 idea idea_sse2 kasumi lion misty1 noekeon noekeon_simd seed serpent serpent_simd sm4 shacal2 shacal2_x86 shacal2_simd threefish threefish_avx2 twofish xtea # modes chacha20poly1305 eax ocb siv cfb # stream chacha chacha_sse2 shake_cipher ofb rc4 salsa20 # kdf hkdf kdf1 kdf2 prf_x942 # pubkey curve25519 ed25519 ecgdsa eckcdsa elgamal gost_3410 mce mceies rfc6979 newhope cecpq1 xmss sm2 # pk_pad #eme_pkcs1 // needed for tls #emsa_pkcs1 // needed for tls emsa_raw emsa_x931 # hash blake2 comb4p gost_3411 md4 #md5 // needed for tls rmd160 #sha1 // needed for tls #sha1_sse2 // needed for tls skein sm3 streebog tiger whirlpool # rng chacha_rng # mac cbc_mac poly1305 siphash x919_mac # misc bcrypt botan-2.4.0/src/build-data/sonar-project.properties000066400000000000000000000007121322470703100223200ustar00rootroot00000000000000sonar.host.url=https://sonarcloud.io sonar.organization=randombit-github sonar.projectKey=botan sonar.projectName=Botan sonar.sources=src sonar.language=cpp sonar.cpp.file.suffixes=.cpp,.h sonar.cfamily.build-wrapper-output=bw-outputs sonar.sourceEncoding=UTF-8 # Sonar thinks these are duplicates sonar.exclusions=build/include/botan/*.h,build/include/botan/internal/*.h,build/include/external/*.h sonar.cfamily.llvm-cov.reportPath=build/cov_report.txt botan-2.4.0/src/cli/000077500000000000000000000000001322470703100141555ustar00rootroot00000000000000botan-2.4.0/src/cli/argparse.h000066400000000000000000000162351322470703100161410ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ARGPARSE_H_ #define BOTAN_ARGPARSE_H_ #include #include #include #include #include #include "cli_exceptions.h" namespace Botan_CLI { class Argument_Parser { public: Argument_Parser(const std::string& spec, const std::vector& extra_flags = {}, const std::vector& extra_opts = {}); void parse_args(const std::vector& params); bool flag_set(const std::string& flag) const; bool has_arg(const std::string& opt_name) const; std::string get_arg(const std::string& option) const; std::string get_arg_or(const std::string& option, const std::string& otherwise) const; size_t get_arg_sz(const std::string& option) const; std::vector get_arg_list(const std::string& what) const; private: // set in constructor std::vector m_spec_args; std::set m_spec_flags; std::map m_spec_opts; std::string m_spec_rest; // set in parse_args() std::map m_user_args; std::set m_user_flags; std::vector m_user_rest; }; bool Argument_Parser::flag_set(const std::string& flag_name) const { return m_user_flags.count(flag_name) > 0; } bool Argument_Parser::has_arg(const std::string& opt_name) const { return m_user_args.count(opt_name) > 0; } std::string Argument_Parser::get_arg(const std::string& opt_name) const { auto i = m_user_args.find(opt_name); if(i == m_user_args.end()) { // this shouldn't occur unless you passed the wrong thing to get_arg throw CLI_Error("Unknown option " + opt_name + " used (program bug)"); } return i->second; } std::string Argument_Parser::get_arg_or(const std::string& opt_name, const std::string& otherwise) const { auto i = m_user_args.find(opt_name); if(i == m_user_args.end() || i->second.empty()) { return otherwise; } return i->second; } size_t Argument_Parser::get_arg_sz(const std::string& opt_name) const { const std::string s = get_arg(opt_name); try { return static_cast(std::stoul(s)); } catch(std::exception&) { throw CLI_Usage_Error("Invalid integer value '" + s + "' for option " + opt_name); } } std::vector Argument_Parser::get_arg_list(const std::string& what) const { if(what != m_spec_rest) { throw CLI_Error("Unexpected list name '" + what + "'"); } return m_user_rest; } void Argument_Parser::parse_args(const std::vector& params) { std::vector args; for(auto const& param : params) { if(param.find("--") == 0) { // option const auto eq = param.find('='); if(eq == std::string::npos) { const std::string opt_name = param.substr(2, std::string::npos); if(m_spec_flags.count(opt_name) == 0) { if(m_spec_opts.count(opt_name)) { throw CLI_Usage_Error("Invalid usage of option --" + opt_name + " without value"); } else { throw CLI_Usage_Error("Unknown flag --" + opt_name); } } m_user_flags.insert(opt_name); } else { const std::string opt_name = param.substr(2, eq - 2); const std::string opt_val = param.substr(eq + 1, std::string::npos); if(m_spec_opts.count(opt_name) == 0) { throw CLI_Usage_Error("Unknown option --" + opt_name); } m_user_args.insert(std::make_pair(opt_name, opt_val)); } } else { // argument args.push_back(param); } } bool seen_stdin_flag = false; size_t arg_i = 0; for(auto const& arg : m_spec_args) { if(arg_i >= args.size()) { // not enough arguments throw CLI_Usage_Error("Invalid argument count, got " + std::to_string(args.size()) + " expected " + std::to_string(m_spec_args.size())); } m_user_args.insert(std::make_pair(arg, args[arg_i])); if(args[arg_i] == "-") { if(seen_stdin_flag) { throw CLI_Usage_Error("Cannot specify '-' (stdin) more than once"); } seen_stdin_flag = true; } ++arg_i; } if(m_spec_rest.empty()) { if(arg_i != args.size()) { throw CLI_Usage_Error("Too many arguments"); } } else { m_user_rest.assign(args.begin() + arg_i, args.end()); } // Now insert any defaults for options not supplied by the user for(auto const& opt : m_spec_opts) { if(m_user_args.count(opt.first) == 0) { m_user_args.insert(opt); } } } Argument_Parser::Argument_Parser(const std::string& spec, const std::vector& extra_flags, const std::vector& extra_opts) { class CLI_Error_Invalid_Spec : public CLI_Error { public: explicit CLI_Error_Invalid_Spec(const std::string& bad_spec) : CLI_Error("Invalid command spec '" + bad_spec + "'") {} }; const std::vector parts = Botan::split_on(spec, ' '); if(parts.size() == 0) { throw CLI_Error_Invalid_Spec(spec); } for(size_t i = 1; i != parts.size(); ++i) { const std::string s = parts[i]; if(s.empty()) // ?!? (shouldn't happen) { throw CLI_Error_Invalid_Spec(spec); } if(s.size() > 2 && s[0] == '-' && s[1] == '-') { // option or flag auto eq = s.find('='); if(eq == std::string::npos) { m_spec_flags.insert(s.substr(2, std::string::npos)); } else { m_spec_opts.insert(std::make_pair(s.substr(2, eq - 2), s.substr(eq + 1, std::string::npos))); } } else if(s[0] == '*') { // rest argument if(m_spec_rest.empty() && s.size() > 2) { m_spec_rest = s.substr(1, std::string::npos); } else { throw CLI_Error_Invalid_Spec(spec); } } else { // named argument if(!m_spec_rest.empty()) // rest arg wasn't last { throw CLI_Error_Invalid_Spec(spec); } m_spec_args.push_back(s); } } for(std::string flag : extra_flags) m_spec_flags.insert(flag); for(std::string opt : extra_opts) m_spec_opts.insert(std::make_pair(opt, "")); } } #endif botan-2.4.0/src/cli/asn1.cpp000066400000000000000000000025451322470703100155310ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_ASN1) #include #if defined(BOTAN_HAS_PEM_CODEC) #include #endif namespace Botan_CLI { class ASN1_Printer final : public Command { public: ASN1_Printer() : Command("asn1print --pem file") {} void go() override { const std::string input = get_arg("file"); std::vector contents; if(flag_set("pem")) { #if defined(BOTAN_HAS_PEM_CODEC) std::string pem_label; contents = unlock(Botan::PEM_Code::decode(slurp_file_as_str(input), pem_label)); #else throw CLI_Error_Unsupported("PEM decoding not available in this build"); #endif } else { contents = slurp_file(input); } // TODO make these configurable const size_t LIMIT = 4 * 1024; const size_t BIN_LIMIT = 1024; const bool PRINT_CONTEXT_SPECIFIC = true; Botan::ASN1_Pretty_Printer printer(LIMIT, BIN_LIMIT, PRINT_CONTEXT_SPECIFIC); printer.print_to_stream(output(), contents.data(), contents.size()); } }; BOTAN_REGISTER_COMMAND("asn1print", ASN1_Printer); } #endif // BOTAN_HAS_ASN1 && BOTAN_HAS_PEM_CODEC botan-2.4.0/src/cli/cc_enc.cpp000066400000000000000000000076461322470703100161100ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include #if defined(BOTAN_HAS_FPE_FE1) && defined(BOTAN_HAS_PBKDF) #include #include namespace Botan_CLI { namespace { uint8_t luhn_checksum(uint64_t cc_number) { uint8_t sum = 0; bool alt = false; while(cc_number) { uint8_t digit = cc_number % 10; if(alt) { digit *= 2; if(digit > 9) { digit -= 9; } } sum += digit; cc_number /= 10; alt = !alt; } return (sum % 10); } bool luhn_check(uint64_t cc_number) { return (luhn_checksum(cc_number) == 0); } uint64_t cc_rank(uint64_t cc_number) { // Remove Luhn checksum return cc_number / 10; } uint64_t cc_derank(uint64_t cc_number) { for(size_t i = 0; i != 10; ++i) { if(luhn_check(cc_number * 10 + i)) { return (cc_number * 10 + i); } } return 0; } uint64_t encrypt_cc_number(uint64_t cc_number, const Botan::secure_vector& key, const std::vector& tweak) { const Botan::BigInt n = 1000000000000000; const uint64_t cc_ranked = cc_rank(cc_number); const Botan::BigInt c = Botan::FPE::fe1_encrypt(n, cc_ranked, key, tweak); if(c.bits() > 50) { throw Botan::Internal_Error("FPE produced a number too large"); } uint64_t enc_cc = 0; for(size_t i = 0; i != 7; ++i) { enc_cc = (enc_cc << 8) | c.byte_at(6 - i); } return cc_derank(enc_cc); } uint64_t decrypt_cc_number(uint64_t enc_cc, const Botan::secure_vector& key, const std::vector& tweak) { const Botan::BigInt n = 1000000000000000; const uint64_t cc_ranked = cc_rank(enc_cc); const Botan::BigInt c = Botan::FPE::fe1_decrypt(n, cc_ranked, key, tweak); if(c.bits() > 50) { throw CLI_Error("FPE produced a number too large"); } uint64_t dec_cc = 0; for(size_t i = 0; i != 7; ++i) { dec_cc = (dec_cc << 8) | c.byte_at(6 - i); } return cc_derank(dec_cc); } } class CC_Encrypt final : public Command { public: CC_Encrypt() : Command("cc_encrypt CC passphrase --tweak=") {} void go() override { const uint64_t cc_number = std::stoull(get_arg("CC")); const std::vector tweak = Botan::hex_decode(get_arg("tweak")); const std::string pass = get_arg("passphrase"); std::unique_ptr pbkdf(Botan::PBKDF::create("PBKDF2(SHA-256)")); if(!pbkdf) { throw CLI_Error_Unsupported("PBKDF", "PBKDF2(SHA-256)"); } Botan::secure_vector key = pbkdf->pbkdf_iterations(32, pass, tweak.data(), tweak.size(), 100000); output() << encrypt_cc_number(cc_number, key, tweak) << "\n"; } }; BOTAN_REGISTER_COMMAND("cc_encrypt", CC_Encrypt); class CC_Decrypt final : public Command { public: CC_Decrypt() : Command("cc_decrypt CC passphrase --tweak=") {} void go() override { const uint64_t cc_number = std::stoull(get_arg("CC")); const std::vector tweak = Botan::hex_decode(get_arg("tweak")); const std::string pass = get_arg("passphrase"); std::unique_ptr pbkdf(Botan::PBKDF::create("PBKDF2(SHA-256)")); if(!pbkdf) { throw CLI_Error_Unsupported("PBKDF", "PBKDF2(SHA-256)"); } Botan::secure_vector key = pbkdf->pbkdf_iterations(32, pass, tweak.data(), tweak.size(), 100000); output() << decrypt_cc_number(cc_number, key, tweak) << "\n"; } }; BOTAN_REGISTER_COMMAND("cc_decrypt", CC_Decrypt); } #endif // FPE && PBKDF botan-2.4.0/src/cli/cli.cpp000066400000000000000000000141141322470703100154310ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include "argparse.h" #include #include #include #include namespace Botan_CLI { Command::Command(const std::string& cmd_spec) : m_spec(cmd_spec) { // for checking all spec strings at load time //m_args.reset(new Argument_Parser(m_spec)); } Command::~Command() { /* for unique_ptr */ } std::string Command::cmd_name() const { return m_spec.substr(0, m_spec.find(' ')); } std::string Command::help_text() const { return "Usage: " + m_spec; } int Command::run(const std::vector& params) { try { m_args.reset(new Argument_Parser(m_spec, {"verbose", "help"}, {"output", "error-output", "rng-type", "drbg-seed"})); m_args->parse_args(params); if(m_args->has_arg("output")) { const std::string output_file = get_arg("output"); if(output_file != "") { m_output_stream.reset(new std::ofstream(output_file, std::ios::binary)); if(!m_output_stream->good()) throw CLI_IO_Error("opening", output_file); } } if(m_args->has_arg("error-output")) { const std::string output_file = get_arg("error-output"); if(output_file != "") { m_error_output_stream.reset(new std::ofstream(output_file, std::ios::binary)); if(!m_error_output_stream->good()) throw CLI_IO_Error("opening", output_file); } } if(flag_set("help")) { output() << help_text() << "\n"; return 2; } this->go(); return m_return_code; } catch(CLI_Usage_Error& e) { error_output() << "Usage error: " << e.what() << "\n"; error_output() << help_text() << "\n"; return 1; } catch(std::exception& e) { error_output() << "Error: " << e.what() << "\n"; return 2; } catch(...) { error_output() << "Error: unknown exception\n"; return 2; } } bool Command::flag_set(const std::string& flag_name) const { return m_args->flag_set(flag_name); } std::string Command::get_arg(const std::string& opt_name) const { return m_args->get_arg(opt_name); } /* * Like get_arg() but if the argument was not specified or is empty, returns otherwise */ std::string Command::get_arg_or(const std::string& opt_name, const std::string& otherwise) const { return m_args->get_arg_or(opt_name, otherwise); } size_t Command::get_arg_sz(const std::string& opt_name) const { return m_args->get_arg_sz(opt_name); } std::vector Command::get_arg_list(const std::string& what) const { return m_args->get_arg_list(what); } std::ostream& Command::output() { if(m_output_stream.get()) { return *m_output_stream; } return std::cout; } std::ostream& Command::error_output() { if(m_error_output_stream.get()) { return *m_error_output_stream; } return std::cerr; } std::vector Command::slurp_file(const std::string& input_file, size_t buf_size) const { std::vector buf; auto insert_fn = [&](const uint8_t b[], size_t l) { buf.insert(buf.end(), b, b + l); }; this->read_file(input_file, insert_fn, buf_size); return buf; } std::string Command::slurp_file_as_str(const std::string& input_file, size_t buf_size) const { std::string str; auto insert_fn = [&](const uint8_t b[], size_t l) { str.append(reinterpret_cast(b), l); }; this->read_file(input_file, insert_fn, buf_size); return str; } void Command::read_file(const std::string& input_file, std::function consumer_fn, size_t buf_size) const { if(input_file == "-") { do_read_file(std::cin, consumer_fn, buf_size); } else { std::ifstream in(input_file, std::ios::binary); if(!in) { throw CLI_IO_Error("reading file", input_file); } do_read_file(in, consumer_fn, buf_size); } } void Command::do_read_file(std::istream& in, std::function consumer_fn, size_t buf_size) const { // Avoid an infinite loop on --buf-size=0 std::vector buf(buf_size == 0 ? 4096 : buf_size); while(in.good()) { in.read(reinterpret_cast(buf.data()), buf.size()); const size_t got = static_cast(in.gcount()); consumer_fn(buf.data(), got); } } Botan::RandomNumberGenerator& Command::rng() { if(m_rng == nullptr) { m_rng = cli_make_rng(get_arg("rng-type"), get_arg("drbg-seed")); } return *m_rng.get(); } // Registration code Command::Registration::Registration(const std::string& name, Command::cmd_maker_fn maker_fn) { std::map& reg = Command::global_registry(); if(reg.count(name) > 0) { throw CLI_Error("Duplicated registration of command " + name); } reg.insert(std::make_pair(name, maker_fn)); } //static std::map& Command::global_registry() { static std::map g_cmds; return g_cmds; } //static std::vector Command::registered_cmds() { std::vector cmds; for(auto& cmd : Command::global_registry()) cmds.push_back(cmd.first); return cmds; } //static std::unique_ptr Command::get_cmd(const std::string& name) { const std::map& reg = Command::global_registry(); std::unique_ptr r; auto i = reg.find(name); if(i != reg.end()) { r.reset(i->second()); } return r; } } botan-2.4.0/src/cli/cli.h000066400000000000000000000131361322470703100151010ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CLI_H_ #define BOTAN_CLI_H_ #include #include #include #include #include #include #include #include "cli_exceptions.h" namespace Botan { class RandomNumberGenerator; } namespace Botan_CLI { class Argument_Parser; /* Declared in cli_rng.cpp */ std::unique_ptr cli_make_rng(const std::string& type, const std::string& hex_drbg_seed); class Command { public: /** * Get a registered command */ static std::unique_ptr get_cmd(const std::string& name); static std::vector registered_cmds(); /** * The spec string specifies the format of the command line, eg for * a somewhat complicated command: * cmd_name --flag --option1= --option2=opt2val input1 input2 *rest * * By default this is the value returned by help_text() * * The first value is always the command name. Options may appear * in any order. Named arguments are taken from the command line * in the order they appear in the spec. * * --flag can optionally be specified, and takes no value. * Check for it in go() with flag_set() * * --option1 is an option whose default value (if the option * does not appear on the command line) is the empty string. * * --option2 is an option whose default value is opt2val * Read the values in go() using get_arg or get_arg_sz. * * The values input1 and input2 specify named arguments which must * be provided. They are also access via get_arg/get_arg_sz * Because options and arguments for a single command share the same * namespace you can't have a spec like: * cmd --input input * but you hopefully didn't want to do that anyway. * * The leading '*' on '*rest' specifies that all remaining arguments * should be packaged in a list which is available as get_arg_list("rest"). * This can only appear on a single value and should be the final * named argument. * * Every command has implicit flags --help, --verbose and implicit * options --output= and --error-output= which override the default * use of std::cout and std::cerr. * * Use of --help is captured in run() and returns help_text(). * Use of --verbose can be checked with verbose() or flag_set("verbose") */ explicit Command(const std::string& cmd_spec); virtual ~Command(); int run(const std::vector& params); virtual std::string help_text() const; const std::string& cmd_spec() const { return m_spec; } std::string cmd_name() const; protected: /* * The actual functionality of the cli command implemented in subclas. * The return value from main will be zero. */ virtual void go() = 0; void set_return_code(int rc) { m_return_code = rc; } std::ostream& output(); std::ostream& error_output(); bool verbose() const { return flag_set("verbose"); } bool flag_set(const std::string& flag_name) const; std::string get_arg(const std::string& opt_name) const; /* * Like get_arg() but if the argument was not specified or is empty, returns otherwise */ std::string get_arg_or(const std::string& opt_name, const std::string& otherwise) const; size_t get_arg_sz(const std::string& opt_name) const; std::vector get_arg_list(const std::string& what) const; /* * Read an entire file into memory and return the contents */ std::vector slurp_file(const std::string& input_file, size_t buf_size = 0) const; std::string slurp_file_as_str(const std::string& input_file, size_t buf_size = 0) const; /* * Read a file calling consumer_fn() with the inputs */ void read_file(const std::string& input_file, std::function consumer_fn, size_t buf_size = 0) const; void do_read_file(std::istream& in, std::function consumer_fn, size_t buf_size = 0) const; template void write_output(const std::vector& vec) { output().write(reinterpret_cast(vec.data()), vec.size()); } Botan::RandomNumberGenerator& rng(); private: void parse_spec(); typedef std::function cmd_maker_fn; static std::map& global_registry(); // set in constructor std::string m_spec; std::unique_ptr m_args; std::unique_ptr m_output_stream; std::unique_ptr m_error_output_stream; std::unique_ptr m_rng; // possibly set by calling set_return_code() int m_return_code = 0; public: // the registry interface: class Registration final { public: Registration(const std::string& name, cmd_maker_fn maker_fn); }; }; #define BOTAN_REGISTER_COMMAND(name, CLI_Class) \ Botan_CLI::Command::Registration reg_cmd_ ## CLI_Class(name, \ []() -> Botan_CLI::Command* { return new CLI_Class; }) } #endif botan-2.4.0/src/cli/cli_exceptions.h000066400000000000000000000021211322470703100173320ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CLI_EXCEPTIONS_H_ #define BOTAN_CLI_EXCEPTIONS_H_ namespace Botan_CLI { class CLI_Error : public std::runtime_error { public: explicit CLI_Error(const std::string& s) : std::runtime_error(s) {} }; class CLI_IO_Error : public CLI_Error { public: CLI_IO_Error(const std::string& op, const std::string& who) : CLI_Error("Error " + op + " " + who) {} }; class CLI_Usage_Error : public CLI_Error { public: explicit CLI_Usage_Error(const std::string& what) : CLI_Error(what) {} }; /* Thrown eg when a requested feature was compiled out of the library or is not available, eg hashing with */ class CLI_Error_Unsupported : public CLI_Error { public: CLI_Error_Unsupported(const std::string& msg) : CLI_Error(msg) {} CLI_Error_Unsupported(const std::string& what, const std::string& who) : CLI_Error(what + " with '" + who + "' unsupported or not available") {} }; } #endif botan-2.4.0/src/cli/cli_rng.cpp000066400000000000000000000046701322470703100163050ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include #include #include #include #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif #if defined(BOTAN_HAS_RDRAND_RNG) #include #endif #if defined(BOTAN_HAS_HMAC_DRBG) #include #endif namespace Botan_CLI { std::unique_ptr cli_make_rng(const std::string& rng_type, const std::string& hex_drbg_seed) { #if defined(BOTAN_HAS_SYSTEM_RNG) if(rng_type == "system" || rng_type.empty()) { return std::unique_ptr(new Botan::System_RNG); } #endif #if defined(BOTAN_HAS_RDRAND_RNG) if(rng_type == "rdrand") { if(Botan::CPUID::has_rdrand()) return std::unique_ptr(new Botan::RDRAND_RNG); else throw CLI_Error("RDRAND instruction not supported on this processor"); } #endif const std::vector drbg_seed = Botan::hex_decode(hex_drbg_seed); #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) if(rng_type == "auto" || rng_type == "entropy" || rng_type.empty()) { std::unique_ptr rng; if(rng_type == "entropy") rng.reset(new Botan::AutoSeeded_RNG(Botan::Entropy_Sources::global_sources())); else rng.reset(new Botan::AutoSeeded_RNG); if(drbg_seed.size() > 0) rng->add_entropy(drbg_seed.data(), drbg_seed.size()); return rng; } #endif #if defined(BOTAN_HAS_HMAC_DRBG) && defined(BOTAN_AUTO_RNG_HMAC) if(rng_type == "drbg") { std::unique_ptr mac = Botan::MessageAuthenticationCode::create(BOTAN_AUTO_RNG_HMAC); std::unique_ptr rng(new Botan::HMAC_DRBG(std::move(mac))); rng->add_entropy(drbg_seed.data(), drbg_seed.size()); if(rng->is_seeded() == false) throw CLI_Error("For " + rng->name() + " a seed of at least " + std::to_string(rng->security_level()/8) + " bytes must be provided"); return std::unique_ptr(rng.release()); } #endif throw CLI_Error_Unsupported("RNG", rng_type); } } botan-2.4.0/src/cli/compress.cpp000066400000000000000000000110051322470703100165110ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_COMPRESSION) #include #include #endif namespace Botan_CLI { #if defined(BOTAN_HAS_COMPRESSION) class Compress final : public Command { public: Compress() : Command("compress --type=gzip --level=6 --buf-size=8192 file") {} std::string output_filename(const std::string& input_fsname, const std::string& comp_type) { const std::map suffixes = { { "zlib", "zlib" }, { "gzip", "gz" }, { "bzip2", "bz2" }, { "lzma", "xz" }, }; auto suffix_info = suffixes.find(comp_type); if(suffixes.count(comp_type) == 0) { throw CLI_Error_Unsupported("Compressing", comp_type); } return input_fsname + "." + suffix_info->second; } void go() override { const std::string comp_type = get_arg("type"); const size_t buf_size = get_arg_sz("buf-size"); const size_t comp_level = get_arg_sz("level"); std::unique_ptr compress; compress.reset(Botan::make_compressor(comp_type)); if(!compress) { throw CLI_Error_Unsupported("Compression", comp_type); } const std::string in_file = get_arg("file"); std::ifstream in(in_file, std::ios::binary); if(!in.good()) { throw CLI_IO_Error("reading", in_file); } const std::string out_file = output_filename(in_file, comp_type); std::ofstream out(out_file, std::ios::binary); if(!in.good()) { throw CLI_IO_Error("writing", out_file); } Botan::secure_vector buf; compress->start(comp_level); while(in.good()) { buf.resize(buf_size); in.read(reinterpret_cast(buf.data()), buf.size()); buf.resize(in.gcount()); compress->update(buf); out.write(reinterpret_cast(buf.data()), buf.size()); } buf.clear(); compress->finish(buf); out.write(reinterpret_cast(buf.data()), buf.size()); out.close(); } }; BOTAN_REGISTER_COMMAND("compress", Compress); class Decompress final : public Command { public: Decompress() : Command("decompress --buf-size=8192 file") {} void parse_extension(const std::string& in_file, std::string& out_file, std::string& suffix) { auto last_dot = in_file.find_last_of('.'); if(last_dot == std::string::npos || last_dot == 0) { throw CLI_Error("No extension detected in filename '" + in_file + "'"); } out_file = in_file.substr(0, last_dot); suffix = in_file.substr(last_dot + 1, std::string::npos); } void go() override { const size_t buf_size = get_arg_sz("buf-size"); const std::string in_file = get_arg("file"); std::string out_file, suffix; parse_extension(in_file, out_file, suffix); std::ifstream in(in_file, std::ios::binary); if(!in.good()) { throw CLI_IO_Error("reading", in_file); } std::unique_ptr decompress; decompress.reset(Botan::make_decompressor(suffix)); if(!decompress) { throw CLI_Error_Unsupported("Decompression", suffix); } std::ofstream out(out_file, std::ios::binary); if(!out.good()) { throw CLI_IO_Error("writing", out_file); } Botan::secure_vector buf; decompress->start(); while(in.good()) { buf.resize(buf_size); in.read(reinterpret_cast(buf.data()), buf.size()); buf.resize(in.gcount()); decompress->update(buf); out.write(reinterpret_cast(buf.data()), buf.size()); } buf.clear(); decompress->finish(buf); out.write(reinterpret_cast(buf.data()), buf.size()); out.close(); } }; BOTAN_REGISTER_COMMAND("decompress", Decompress); #endif } botan-2.4.0/src/cli/credentials.h000066400000000000000000000075311322470703100166310ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef EXAMPLE_CREDENTIALS_MANAGER_H_ #define EXAMPLE_CREDENTIALS_MANAGER_H_ #include #include #include #include #include inline bool value_exists(const std::vector& vec, const std::string& val) { for(size_t i = 0; i != vec.size(); ++i) { if(vec[i] == val) { return true; } } return false; } class Basic_Credentials_Manager : public Botan::Credentials_Manager { public: Basic_Credentials_Manager() { load_certstores(); } Basic_Credentials_Manager(Botan::RandomNumberGenerator& rng, const std::string& server_crt, const std::string& server_key) { Certificate_Info cert; cert.key.reset(Botan::PKCS8::load_key(server_key, rng)); Botan::DataSource_Stream in(server_crt); while(!in.end_of_data()) { try { cert.certs.push_back(Botan::X509_Certificate(in)); } catch(std::exception&) { } } // TODO: attempt to validate chain ourselves m_creds.push_back(cert); } void load_certstores() { try { // TODO: make path configurable const std::vector paths = { "/etc/ssl/certs", "/usr/share/ca-certificates" }; for(auto const& path : paths) { std::shared_ptr cs(new Botan::Certificate_Store_In_Memory(path)); m_certstores.push_back(cs); } } catch(std::exception&) { } } std::vector trusted_certificate_authorities(const std::string& type, const std::string& /*hostname*/) override { std::vector v; // don't ask for client certs if(type == "tls-server") { return v; } for(auto const& cs : m_certstores) { v.push_back(cs.get()); } return v; } std::vector cert_chain( const std::vector& algos, const std::string& type, const std::string& hostname) override { BOTAN_UNUSED(type); for(auto const& i : m_creds) { if(std::find(algos.begin(), algos.end(), i.key->algo_name()) == algos.end()) { continue; } if(hostname != "" && !i.certs[0].matches_dns_name(hostname)) { continue; } return i.certs; } return std::vector(); } Botan::Private_Key* private_key_for(const Botan::X509_Certificate& cert, const std::string& /*type*/, const std::string& /*context*/) override { for(auto const& i : m_creds) { if(cert == i.certs[0]) { return i.key.get(); } } return nullptr; } private: struct Certificate_Info { std::vector certs; std::shared_ptr key; }; std::vector m_creds; std::vector> m_certstores; }; #endif botan-2.4.0/src/cli/encryption.cpp000066400000000000000000000063771322470703100170700ustar00rootroot00000000000000/* * (C) 2015,2017 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_AEAD_MODES) #include #include #include namespace Botan_CLI { namespace { auto VALID_MODES = std::map{ // Don't add algorithms here without extending tests // in `src/scripts/cli_tests.py` { "aes-128-cfb", "AES-128/CFB" }, { "aes-192-cfb", "AES-192/CFB" }, { "aes-256-cfb", "AES-256/CFB" }, { "aes-128-gcm", "AES-128/GCM" }, { "aes-192-gcm", "AES-192/GCM" }, { "aes-256-gcm", "AES-256/GCM" }, { "aes-128-ocb", "AES-128/OCB" }, { "aes-128-xts", "AES-128/XTS" }, { "aes-256-xts", "AES-256/XTS" }, }; Botan::secure_vector do_crypt(const std::string &cipher, const std::vector &input, const Botan::SymmetricKey &key, const Botan::InitializationVector &iv, const std::vector& ad, Botan::Cipher_Dir direction) { if(iv.size() == 0) throw CLI_Usage_Error("IV must not be empty"); // TODO: implement streaming std::unique_ptr processor(Botan::get_cipher_mode(cipher, direction)); if(!processor) throw CLI_Error("Cipher algorithm not found"); // Set key processor->set_key(key); if(Botan::AEAD_Mode* aead = dynamic_cast(processor.get())) { aead->set_ad(ad); } else if(ad.size() != 0) { throw CLI_Usage_Error("Cannot specify associated data with non-AEAD mode"); } // Set IV processor->start(iv.bits_of()); Botan::secure_vector buf(input.begin(), input.end()); processor->finish(buf); return buf; } } class Encryption final : public Command { public: Encryption() : Command("encryption --buf-size=4096 --decrypt --mode= --key= --iv= --ad=") {} void go() override { std::string mode = get_arg_or("mode", ""); if (!VALID_MODES.count(mode)) { std::ostringstream error; error << "Invalid mode: '" << mode << "'\n" << "valid modes are:"; for (auto valid_mode : VALID_MODES) error << " " << valid_mode.first; throw CLI_Usage_Error(error.str()); } const std::string key_hex = get_arg("key"); const std::string iv_hex = get_arg("iv"); const std::string ad_hex = get_arg_or("ad", ""); const size_t buf_size = get_arg_sz("buf-size"); const std::vector input = this->slurp_file("-", buf_size); if (verbose()) { error_output() << "Got " << input.size() << " bytes of input data.\n"; } const Botan::SymmetricKey key(key_hex); const Botan::InitializationVector iv(iv_hex); const std::vector ad = Botan::hex_decode(ad_hex); auto direction = flag_set("decrypt") ? Botan::Cipher_Dir::DECRYPTION : Botan::Cipher_Dir::ENCRYPTION; write_output(do_crypt(VALID_MODES[mode], input, key, iv, ad, direction)); } }; BOTAN_REGISTER_COMMAND("encryption", Encryption); } #endif botan-2.4.0/src/cli/main.cpp000066400000000000000000000014711322470703100156100ustar00rootroot00000000000000/* * (C) 2009,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include #include #include int main(int argc, char* argv[]) { std::cerr << Botan::runtime_version_check(BOTAN_VERSION_MAJOR, BOTAN_VERSION_MINOR, BOTAN_VERSION_PATCH); std::string cmd_name = "help"; if(argc >= 2) { cmd_name = argv[1]; if(cmd_name == "--help" || cmd_name == "-h") cmd_name = "help"; } std::unique_ptr cmd(Botan_CLI::Command::get_cmd(cmd_name)); if(!cmd) { std::cout << "Unknown command " << cmd_name << " (try --help)\n"; return 1; } std::vector args(argv + std::min(argc, 2), argv + argc); return cmd->run(args); } botan-2.4.0/src/cli/math.cpp000066400000000000000000000115731322470703100156210ustar00rootroot00000000000000/* * (C) 2009,2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_NUMBERTHEORY) #include #include #include namespace Botan_CLI { class Modular_Inverse final : public Command { public: Modular_Inverse() : Command("mod_inverse n mod") {} void go() override { const Botan::BigInt n(get_arg("n")); const Botan::BigInt mod(get_arg("mod")); output() << Botan::inverse_mod(n, mod) << "\n"; } }; BOTAN_REGISTER_COMMAND("mod_inverse", Modular_Inverse); class Gen_Prime final : public Command { public: Gen_Prime() : Command("gen_prime --count=1 bits") {} void go() override { const size_t bits = get_arg_sz("bits"); const size_t cnt = get_arg_sz("count"); for(size_t i = 0; i != cnt; ++i) { const Botan::BigInt p = Botan::random_prime(rng(), bits); output() << p << "\n"; } } }; BOTAN_REGISTER_COMMAND("gen_prime", Gen_Prime); class Is_Prime final : public Command { public: Is_Prime() : Command("is_prime --prob=56 n") {} void go() override { Botan::BigInt n(get_arg("n")); const size_t prob = get_arg_sz("prob"); const bool prime = Botan::is_prime(n, rng(), prob); output() << n << " is " << (prime ? "probably prime" : "composite") << "\n"; } }; BOTAN_REGISTER_COMMAND("is_prime", Is_Prime); /* * Factor integers using a combination of trial division by small * primes, and Pollard's Rho algorithm */ class Factor final : public Command { public: Factor() : Command("factor n") {} void go() override { Botan::BigInt n(get_arg("n")); std::vector factors = factorize(n, rng()); std::sort(factors.begin(), factors.end()); output() << n << ": "; std::copy(factors.begin(), factors.end(), std::ostream_iterator(output(), " ")); output() << std::endl; } private: std::vector factorize(const Botan::BigInt& n_in, Botan::RandomNumberGenerator& rng) { Botan::BigInt n = n_in; std::vector factors = remove_small_factors(n); while(n != 1) { if(Botan::is_prime(n, rng)) { factors.push_back(n); break; } Botan::BigInt a_factor = 0; while(a_factor == 0) { a_factor = rho(n, rng); } std::vector rho_factored = factorize(a_factor, rng); for(size_t j = 0; j != rho_factored.size(); j++) { factors.push_back(rho_factored[j]); } n /= a_factor; } return factors; } /* * Pollard's Rho algorithm, as described in the MIT algorithms book. We * use (x^2+x) mod n instead of (x*2-1) mod n as the random function, * it _seems_ to lead to faster factorization for the values I tried. */ Botan::BigInt rho(const Botan::BigInt& n, Botan::RandomNumberGenerator& rng) { Botan::BigInt x = Botan::BigInt::random_integer(rng, 0, n - 1); Botan::BigInt y = x; Botan::BigInt d = 0; Botan::Modular_Reducer mod_n(n); size_t i = 1, k = 2; while(true) { i++; if(i == 0) // overflow, bail out { break; } x = mod_n.multiply((x + 1), x); d = Botan::gcd(y - x, n); if(d != 1 && d != n) { return d; } if(i == k) { y = x; k = 2 * k; } } return 0; } // Remove (and return) any small (< 2^16) factors std::vector remove_small_factors(Botan::BigInt& n) { std::vector factors; while(n.is_even()) { factors.push_back(2); n /= 2; } for(size_t j = 0; j != Botan::PRIME_TABLE_SIZE; j++) { uint16_t prime = Botan::PRIMES[j]; if(n < prime) { break; } Botan::BigInt x = Botan::gcd(n, prime); if(x != 1) { n /= x; while(x != 1) { x /= prime; factors.push_back(prime); } } } return factors; } }; BOTAN_REGISTER_COMMAND("factor", Factor); } #endif botan-2.4.0/src/cli/psk.cpp000066400000000000000000000042631322470703100154630ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_PSK_DB) && defined(BOTAN_HAS_SQLITE3) #include #include #include namespace Botan_CLI { class PSK_Tool_Base : public Command { public: PSK_Tool_Base(const std::string& spec) : Command(spec) {} void go() override { const std::string db_filename = get_arg("db"); const Botan::secure_vector db_key = Botan::hex_decode_locked(get_arg("db_key")); std::shared_ptr db = std::make_shared(db_filename); Botan::Encrypted_PSK_Database_SQL psk(db_key, db, "psk"); psk_operation(psk); } private: virtual void psk_operation(Botan::PSK_Database& db) = 0; }; class PSK_Tool_Set final : public PSK_Tool_Base { public: PSK_Tool_Set() : PSK_Tool_Base("psk_set db db_key name psk") {} private: void psk_operation(Botan::PSK_Database& db) override { const std::string name = get_arg("name"); Botan::secure_vector key = Botan::hex_decode_locked(get_arg("psk")); db.set_vec(name, key); } }; class PSK_Tool_Get final : public PSK_Tool_Base { public: PSK_Tool_Get() : PSK_Tool_Base("psk_get db db_key name") {} private: void psk_operation(Botan::PSK_Database& db) override { const std::string name = get_arg("name"); const Botan::secure_vector val = db.get(name); output() << Botan::hex_encode(val) << "\n"; } }; class PSK_Tool_List final : public PSK_Tool_Base { public: PSK_Tool_List() : PSK_Tool_Base("psk_list db db_key") {} private: void psk_operation(Botan::PSK_Database& db) override { const std::set names = db.list_names(); for(std::string name : names) output() << name << "\n"; } }; BOTAN_REGISTER_COMMAND("psk_set", PSK_Tool_Set); BOTAN_REGISTER_COMMAND("psk_get", PSK_Tool_Get); BOTAN_REGISTER_COMMAND("psk_list", PSK_Tool_List); } #endif botan-2.4.0/src/cli/pubkey.cpp000066400000000000000000000217171322470703100161700ustar00rootroot00000000000000/* * (C) 2010,2014,2015 Jack Lloyd * (C) 2015 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #include #include #include #include #include #if defined(BOTAN_HAS_DL_GROUP) #include #endif #if defined(BOTAN_HAS_ECC_GROUP) #include #endif namespace Botan_CLI { class PK_Fingerprint final : public Command { public: PK_Fingerprint() : Command("fingerprint --algo=SHA-256 *keys") {} void go() override { const std::string hash_algo = get_arg("algo"); for(std::string key_file : get_arg_list("keys")) { std::unique_ptr key(Botan::X509::load_key(key_file)); output() << key_file << ": " << key->fingerprint_public(hash_algo) << "\n"; } } }; BOTAN_REGISTER_COMMAND("fingerprint", PK_Fingerprint); class PK_Keygen final : public Command { public: PK_Keygen() : Command("keygen --algo=RSA --params= --passphrase= --pbe= --pbe-millis=300 --der-out") {} void go() override { const std::string algo = get_arg("algo"); const std::string params = get_arg("params"); std::unique_ptr key(Botan::create_private_key(algo, rng(), params)); if(!key) { throw CLI_Error_Unsupported("keygen", algo); } const std::string pass = get_arg("passphrase"); const bool der_out = flag_set("der-out"); const std::chrono::milliseconds pbe_millis(get_arg_sz("pbe-millis")); const std::string pbe = get_arg("pbe"); if(der_out) { if(pass.empty()) { write_output(Botan::PKCS8::BER_encode(*key)); } else { write_output(Botan::PKCS8::BER_encode(*key, rng(), pass, pbe_millis, pbe)); } } else { if(pass.empty()) { output() << Botan::PKCS8::PEM_encode(*key); } else { output() << Botan::PKCS8::PEM_encode(*key, rng(), pass, pbe_millis, pbe); } } } }; BOTAN_REGISTER_COMMAND("keygen", PK_Keygen); namespace { std::string algo_default_emsa(const std::string& key) { if(key == "RSA") { return "EMSA4"; } // PSS else if(key == "ECDSA" || key == "DSA") { return "EMSA1"; } else { return "EMSA1"; } } } class PK_Sign final : public Command { public: PK_Sign() : Command("sign --passphrase= --hash=SHA-256 --emsa= key file") {} void go() override { std::unique_ptr key( Botan::PKCS8::load_key( get_arg("key"), rng(), get_arg("passphrase"))); if(!key) { throw CLI_Error("Unable to load private key"); } const std::string sig_padding = get_arg_or("emsa", algo_default_emsa(key->algo_name())) + "(" + get_arg("hash") + ")"; Botan::PK_Signer signer(*key, rng(), sig_padding); auto onData = [&signer](const uint8_t b[], size_t l) { signer.update(b, l); }; this->read_file(get_arg("file"), onData); output() << Botan::base64_encode(signer.signature(rng())) << "\n"; } }; BOTAN_REGISTER_COMMAND("sign", PK_Sign); class PK_Verify final : public Command { public: PK_Verify() : Command("verify --hash=SHA-256 --emsa= pubkey file signature") {} void go() override { std::unique_ptr key(Botan::X509::load_key(get_arg("pubkey"))); if(!key) { throw CLI_Error("Unable to load public key"); } const std::string sig_padding = get_arg_or("emsa", algo_default_emsa(key->algo_name())) + "(" + get_arg("hash") + ")"; Botan::PK_Verifier verifier(*key, sig_padding); auto onData = [&verifier](const uint8_t b[], size_t l) { verifier.update(b, l); }; this->read_file(get_arg("file"), onData); const Botan::secure_vector signature = Botan::base64_decode(this->slurp_file_as_str(get_arg("signature"))); const bool valid = verifier.check_signature(signature); output() << "Signature is " << (valid ? "valid" : "invalid") << "\n"; } }; BOTAN_REGISTER_COMMAND("verify", PK_Verify); #if defined(BOTAN_HAS_ECC_GROUP) class EC_Group_Info final : public Command { public: EC_Group_Info() : Command("ec_group_info --pem name") {} void go() override { Botan::EC_Group group(get_arg("name")); if(flag_set("pem")) { output() << group.PEM_encode(); } else { output() << "P = " << std::hex << group.get_curve().get_p() << "\n" << "A = " << std::hex << group.get_curve().get_a() << "\n" << "B = " << std::hex << group.get_curve().get_b() << "\n" << "G = " << group.get_base_point().get_affine_x() << "," << group.get_base_point().get_affine_y() << "\n"; } } }; BOTAN_REGISTER_COMMAND("ec_group_info", EC_Group_Info); #endif #if defined(BOTAN_HAS_DL_GROUP) class DL_Group_Info final : public Command { public: DL_Group_Info() : Command("dl_group_info --pem name") {} void go() override { Botan::DL_Group group(get_arg("name")); if(flag_set("pem")) { output() << group.PEM_encode(Botan::DL_Group::ANSI_X9_42_DH_PARAMETERS); } else { output() << "P = " << std::hex << group.get_p() << "\n" << "G = " << group.get_g() << "\n"; } } }; BOTAN_REGISTER_COMMAND("dl_group_info", DL_Group_Info); class Gen_DL_Group final : public Command { public: Gen_DL_Group() : Command("gen_dl_group --pbits=1024 --qbits=0 --type=subgroup") {} void go() override { const size_t pbits = get_arg_sz("pbits"); const std::string type = get_arg("type"); if(type == "strong") { Botan::DL_Group grp(rng(), Botan::DL_Group::Strong, pbits); output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); } else if(type == "subgroup") { Botan::DL_Group grp(rng(), Botan::DL_Group::Prime_Subgroup, pbits, get_arg_sz("qbits")); output() << grp.PEM_encode(Botan::DL_Group::ANSI_X9_42); } else { throw CLI_Usage_Error("Invalid DL type '" + type + "'"); } } }; BOTAN_REGISTER_COMMAND("gen_dl_group", Gen_DL_Group); #endif class PKCS8_Tool final : public Command { public: PKCS8_Tool() : Command("pkcs8 --pass-in= --pub-out --der-out --pass-out= --pbe= --pbe-millis=300 key") {} void go() override { std::unique_ptr key; std::string pass_in = get_arg("pass-in"); if (pass_in.empty()) { key.reset(Botan::PKCS8::load_key(get_arg("key"), rng())); } else { key.reset(Botan::PKCS8::load_key(get_arg("key"), rng(), pass_in)); } const std::chrono::milliseconds pbe_millis(get_arg_sz("pbe-millis")); const std::string pbe = get_arg("pbe"); const bool der_out = flag_set("der-out"); if(flag_set("pub-out")) { if(der_out) { write_output(Botan::X509::BER_encode(*key)); } else { output() << Botan::X509::PEM_encode(*key); } } else { const std::string pass_out = get_arg("pass-out"); if(der_out) { if(pass_out.empty()) { write_output(Botan::PKCS8::BER_encode(*key)); } else { write_output(Botan::PKCS8::BER_encode(*key, rng(), pass_out, pbe_millis, pbe)); } } else { if(pass_out.empty()) { output() << Botan::PKCS8::PEM_encode(*key); } else { output() << Botan::PKCS8::PEM_encode(*key, rng(), pass_out, pbe_millis, pbe); } } } } }; BOTAN_REGISTER_COMMAND("pkcs8", PKCS8_Tool); } #endif botan-2.4.0/src/cli/socket_utils.h000066400000000000000000000031321322470703100170350ustar00rootroot00000000000000/* * (C) 2014,2017 Jack Lloyd * 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SOCKET_H_ #define BOTAN_SOCKET_H_ #include #include "cli_exceptions.h" #if defined(BOTAN_TARGET_OS_IS_WINDOWS) #include #include typedef size_t ssize_t; #define STDIN_FILENO _fileno(stdin) inline void init_sockets() { WSAData wsa_data; WORD wsa_version = MAKEWORD(2, 2); if(::WSAStartup(wsa_version, &wsa_data) != 0) { throw Botan_CLI::CLI_Error("WSAStartup() failed: " + std::to_string(WSAGetLastError())); } if(LOBYTE(wsa_data.wVersion) != 2 || HIBYTE(wsa_data.wVersion) != 2) { ::WSACleanup(); throw Botan_CLI::CLI_Error("Could not find a usable version of Winsock.dll"); } } inline void stop_sockets() { ::WSACleanup(); } inline int close(int fd) { return ::closesocket(fd); } inline int read(int s, void* buf, size_t len) { return ::recv(s, reinterpret_cast(buf), static_cast(len), 0); } inline int send(int s, const uint8_t* buf, size_t len, int flags) { return ::send(s, reinterpret_cast(buf), static_cast(len), flags); } #else #include #include #include #include #include #include #include #include #include inline void init_sockets() {} inline void stop_sockets() {} #endif #if !defined(MSG_NOSIGNAL) #define MSG_NOSIGNAL 0 #endif #endif botan-2.4.0/src/cli/speed.cpp000066400000000000000000001535501322470703100157720ustar00rootroot00000000000000/* * (C) 2009,2010,2014,2015,2017 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include "../tests/test_rng.h" // FIXME #include #include #include #include #include #include #include // Always available: #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif #if defined(BOTAN_HAS_HMAC_DRBG) #include #endif #if defined(BOTAN_HAS_RDRAND_RNG) #include #endif #if defined(BOTAN_HAS_CHACHA_RNG) #include #endif #if defined(BOTAN_HAS_FPE_FE1) #include #endif #if defined(BOTAN_HAS_RFC3394_KEYWRAP) #include #endif #if defined(BOTAN_HAS_COMPRESSION) #include #endif #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #include #include #include #include #endif #if defined(BOTAN_HAS_NUMBERTHEORY) #include #include #endif #if defined(BOTAN_HAS_ECC_GROUP) #include #endif #if defined(BOTAN_HAS_DL_GROUP) #include #endif #if defined(BOTAN_HAS_MCELIECE) #include #endif #if defined(BOTAN_HAS_NEWHOPE) #include #endif namespace Botan_CLI { namespace { class Timer final { public: Timer(const std::string& name, uint64_t event_mult = 1, const std::string& doing = "", const std::string& provider = "", size_t buf_size = 0) : m_name(name + ((provider.empty() || provider == "base") ? "" : " [" + provider + "]")) , m_doing(doing) , m_buf_size(buf_size) , m_event_mult(event_mult) {} Timer(const std::string& name, const std::string& provider, const std::string& doing) : Timer(name, 1, doing, provider, 0) {} Timer(const Timer& other) = default; static uint64_t get_system_timestamp_ns() { return Botan::OS::get_system_timestamp_ns(); } static uint64_t get_cpu_cycle_counter() { return Botan::OS::get_processor_timestamp(); } void start() { stop(); m_timer_start = Timer::get_system_timestamp_ns(); m_cpu_cycles_start = Timer::get_cpu_cycle_counter(); } void stop(); bool under(std::chrono::milliseconds msec) { return (milliseconds() < msec.count()); } class Timer_Scope final { public: explicit Timer_Scope(Timer& timer) : m_timer(timer) { m_timer.start(); } ~Timer_Scope() { m_timer.stop(); } private: Timer& m_timer; }; template auto run(F f) -> decltype(f()) { Timer_Scope timer(*this); return f(); } template void run_until_elapsed(std::chrono::milliseconds msec, F f) { while(this->under(msec)) { run(f); } } uint64_t value() const { return m_time_used; } double seconds() const { return milliseconds() / 1000.0; } double milliseconds() const { return value() / 1000000.0; } double ms_per_event() const { return milliseconds() / events(); } uint64_t cycles_consumed() const { return m_cpu_cycles_used; } uint64_t events() const { return m_event_count * m_event_mult; } const std::string& get_name() const { return m_name; } const std::string& doing() const { return m_doing; } size_t buf_size() const { return m_buf_size; } double bytes_per_second() const { return seconds() > 0.0 ? events() / seconds() : 0.0; } double events_per_second() const { return seconds() > 0.0 ? events() / seconds() : 0.0; } double seconds_per_event() const { return events() > 0 ? seconds() / events() : 0.0; } void set_custom_msg(const std::string& s) { m_custom_msg = s; } bool operator<(const Timer& other) const { if(this->doing() != other.doing()) return (this->doing() < other.doing()); return (this->get_name() < other.get_name()); } std::string to_string() const { if(m_custom_msg.size() > 0) { return m_custom_msg; } else if(this->buf_size() == 0) { return result_string_ops(); } else { return result_string_bps(); } } private: std::string result_string_bps() const; std::string result_string_ops() const; // const data std::string m_name, m_doing; size_t m_buf_size; uint64_t m_event_mult; // set at runtime std::string m_custom_msg; uint64_t m_time_used = 0, m_timer_start = 0; uint64_t m_event_count = 0; uint64_t m_max_time = 0, m_min_time = 0; uint64_t m_cpu_cycles_start = 0, m_cpu_cycles_used = 0; }; void Timer::stop() { if(m_timer_start) { const uint64_t now = Timer::get_system_timestamp_ns(); if(now > m_timer_start) { uint64_t dur = now - m_timer_start; m_time_used += dur; if(m_cpu_cycles_start != 0) { uint64_t cycles_taken = Timer::get_cpu_cycle_counter() - m_cpu_cycles_start; if(cycles_taken > 0) { m_cpu_cycles_used += cycles_taken; } } if(m_event_count == 0) { m_min_time = m_max_time = dur; } else { m_max_time = std::max(m_max_time, dur); m_min_time = std::min(m_min_time, dur); } } m_timer_start = 0; ++m_event_count; } } std::string Timer::result_string_bps() const { const size_t MiB = 1024 * 1024; const double MiB_total = static_cast(events()) / MiB; const double MiB_per_sec = MiB_total / seconds(); std::ostringstream oss; oss << get_name(); if(!doing().empty()) { oss << " " << doing(); } if(buf_size() > 0) { oss << " buffer size " << buf_size() << " bytes:"; } if(events() == 0) oss << " " << "N/A"; else oss << " " << std::fixed << std::setprecision(3) << MiB_per_sec << " MiB/sec"; if(cycles_consumed() != 0) { const double cycles_per_byte = static_cast(cycles_consumed()) / events(); oss << " " << std::fixed << std::setprecision(2) << cycles_per_byte << " cycles/byte"; } oss << " (" << MiB_total << " MiB in " << milliseconds() << " ms)\n"; return oss.str(); } std::string Timer::result_string_ops() const { std::ostringstream oss; oss << get_name() << " "; if(events() == 0) { oss << "no events\n"; } else { oss << static_cast(events_per_second()) << ' ' << doing() << "/sec; " << std::setprecision(2) << std::fixed << ms_per_event() << " ms/op"; if(cycles_consumed() != 0) { const double cycles_per_op = static_cast(cycles_consumed()) / events(); const size_t precision = (cycles_per_op < 10000) ? 2 : 0; oss << " " << std::fixed << std::setprecision(precision) << cycles_per_op << " cycles/op"; } oss << " (" << events() << " " << (events() == 1 ? "op" : "ops") << " in " << milliseconds() << " ms)\n"; } return oss.str(); } class JSON_Output final { public: void add(const Timer& timer) { m_results.push_back(timer); } std::string print() const { std::ostringstream out; out << "[\n"; for(size_t i = 0; i != m_results.size(); ++i) { if(i != 0) out << ","; const Timer& t = m_results[i]; out << '{'; out << "\"algo\": \"" << t.get_name() << "\", "; out << "\"op\": \"" << t.doing() << "\", "; out << "\"events\": " << t.events() << ", "; if(t.cycles_consumed() > 0) out << "\"cycles\": " << t.cycles_consumed() << ", "; if(t.buf_size() > 0) { out << "\"bps\": " << static_cast(t.events() / (t.value() / 1000000000.0)) << ", "; out << "\"buf_size\": " << t.buf_size() << ", "; } out << "\"nanos\": " << t.value(); out << "}\n"; } out << "]\n"; return out.str(); } private: std::vector m_results; }; class Summary final { public: Summary() {} void add(const Timer& t) { if(t.buf_size() == 0) { m_ops_entries.push_back(t); } else { m_bps_entries[std::make_pair(t.doing(), t.get_name())].push_back(t); } } std::string print() { const size_t name_padding = 35; const size_t op_name_padding = 16; const size_t op_padding = 16; std::ostringstream result_ss; result_ss << std::fixed; if(m_bps_entries.size() > 0) { result_ss << "\n"; // add table header result_ss << std::setw(name_padding) << std::left << "algo" << std::setw(op_name_padding) << std::left << "operation"; for(const Timer& t : m_bps_entries.begin()->second) { result_ss << std::setw(op_padding) << std::right << (std::to_string(t.buf_size()) + " bytes"); } result_ss << "\n"; // add table entries for(const auto& entry : m_bps_entries) { if(entry.second.empty()) continue; result_ss << std::setw(name_padding) << std::left << (entry.first.second) << std::setw(op_name_padding) << std::left << (entry.first.first); for(const Timer& t : entry.second) { if(t.events() == 0) { result_ss << std::setw(op_padding) << std::right << "N/A"; } else { result_ss << std::setw(op_padding) << std::right << std::setprecision(2) << (t.bytes_per_second() / 1000.0); } } result_ss << "\n"; } result_ss << "\n[results are the number of 1000s bytes processed per second]\n"; } if(m_ops_entries.size() > 0) { result_ss << std::setprecision(6) << "\n"; // sort entries std::sort(m_ops_entries.begin(), m_ops_entries.end()); // add table header result_ss << std::setw(name_padding) << std::left << "algo" << std::setw(op_name_padding) << std::left << "operation" << std::setw(op_padding) << std::right << "sec/op" << std::setw(op_padding) << std::right << "op/sec" << "\n"; // add table entries for(const Timer& entry : m_ops_entries) { result_ss << std::setw(name_padding) << std::left << entry.get_name() << std::setw(op_name_padding) << std::left << entry.doing() << std::setw(op_padding) << std::right << entry.seconds_per_event() << std::setw(op_padding) << std::right << entry.events_per_second() << "\n"; } } return result_ss.str(); } private: std::map, std::vector> m_bps_entries; std::vector m_ops_entries; }; std::vector unique_buffer_sizes(const std::string& cmdline_arg) { std::set buf; for(std::string size_str : Botan::split_on(cmdline_arg, ',')) { size_t x = 0; try { size_t converted = 0; x = static_cast(std::stoul(size_str, &converted, 0)); if(converted != size_str.size()) throw CLI_Usage_Error("Invalid integer"); } catch(std::exception& e) { throw CLI_Usage_Error("Invalid integer value '" + size_str + "' for option buf-size"); } if(x == 0 || x > 16*1024*1024) throw CLI_Usage_Error("Invalid integer value '" + size_str + "' for option buf-size"); buf.insert(x); } return std::vector(buf.begin(), buf.end()); } } class Speed final : public Command { public: Speed() : Command("speed --msec=100 --format=default --provider= --buf-size=1024 --clear-cpuid= --ecc-groups= *algos") {} std::vector default_benchmark_list() { /* This is not intended to be exhaustive: it just hits the high points of the most interesting or widely used algorithms. */ return { /* Block ciphers */ "AES-128", "AES-192", "AES-256", "ARIA-128", "ARIA-192", "ARIA-256", "Blowfish", "CAST-128", "CAST-256", "Camellia-128", "Camellia-192", "Camellia-256", "DES", "TripleDES", "GOST-28147-89", "IDEA", "KASUMI", "MISTY1", "Noekeon", "SHACAL2", "SM4", "Serpent", "Threefish-512", "Twofish", "XTEA", /* Cipher modes */ "AES-128/CBC", "AES-128/CTR-BE", "AES-128/EAX", "AES-128/OCB", "AES-128/GCM", "AES-128/XTS", "Serpent/CBC", "Serpent/CTR-BE", "Serpent/EAX", "Serpent/OCB", "Serpent/GCM", "Serpent/XTS", "ChaCha20Poly1305", /* Stream ciphers */ "RC4", "Salsa20", /* Hashes */ "Tiger", "RIPEMD-160", "SHA-160", "SHA-256", "SHA-512", "Skein-512", "Keccak-1600(512)", "Whirlpool", /* MACs */ "CMAC(AES-128)", "HMAC(SHA-256)", /* Misc */ "random_prime" /* pubkey */ "RSA", "DH", "ECDH", "ECDSA", "ECKCDSA", "ECGDSA", "Ed25519", "Curve25519", "NEWHOPE", "McEliece", }; } void go() override { std::chrono::milliseconds msec(get_arg_sz("msec")); const std::string provider = get_arg("provider"); std::vector ecc_groups = Botan::split_on(get_arg("ecc-groups"), ','); const std::string format = get_arg("format"); if(format == "table") m_summary.reset(new Summary); else if(format == "json") m_json.reset(new JSON_Output); else if(format != "default") throw CLI_Usage_Error("Unknown --format type '" + format + "'"); if(ecc_groups.empty()) ecc_groups = { "secp256r1", "secp384r1", "secp521r1" }; std::vector algos = get_arg_list("algos"); const std::vector buf_sizes = unique_buffer_sizes(get_arg("buf-size")); Botan::CPUID::initialize(); for(std::string cpuid_to_clear : Botan::split_on(get_arg("clear-cpuid"), ',')) { for(auto bit : Botan::CPUID::bit_from_string(cpuid_to_clear)) { Botan::CPUID::clear_cpuid_bit(bit); } } const bool using_defaults = (algos.empty()); if(using_defaults) { algos = default_benchmark_list(); } for(auto algo : algos) { using namespace std::placeholders; if(Botan::HashFunction::providers(algo).size() > 0) { bench_providers_of( algo, provider, msec, buf_sizes, std::bind(&Speed::bench_hash, this, _1, _2, _3, _4)); } else if(Botan::BlockCipher::providers(algo).size() > 0) { bench_providers_of( algo, provider, msec, buf_sizes, std::bind(&Speed::bench_block_cipher, this, _1, _2, _3, _4)); } else if(Botan::StreamCipher::providers(algo).size() > 0) { bench_providers_of( algo, provider, msec, buf_sizes, std::bind(&Speed::bench_stream_cipher, this, _1, _2, _3, _4)); } else if(auto enc = Botan::get_cipher_mode(algo, Botan::ENCRYPTION)) { auto dec = Botan::get_cipher_mode(algo, Botan::DECRYPTION); bench_cipher_mode(*enc, *dec, msec, buf_sizes); } else if(Botan::MessageAuthenticationCode::providers(algo).size() > 0) { bench_providers_of( algo, provider, msec, buf_sizes, std::bind(&Speed::bench_mac, this, _1, _2, _3, _4)); } #if defined(BOTAN_HAS_RSA) else if(algo == "RSA") { bench_rsa(provider, msec); } #endif #if defined(BOTAN_HAS_ECDSA) else if(algo == "ECDSA") { bench_ecdsa(ecc_groups, provider, msec); } #endif #if defined(BOTAN_HAS_SM2) else if(algo == "SM2") { bench_sm2(ecc_groups, provider, msec); } #endif #if defined(BOTAN_HAS_ECKCDSA) else if(algo == "ECKCDSA") { bench_eckcdsa(ecc_groups, provider, msec); } #endif #if defined(BOTAN_HAS_ECGDSA) else if(algo == "ECGDSA") { bench_ecgdsa(ecc_groups, provider, msec); } #endif #if defined(BOTAN_HAS_ED25519) else if(algo == "Ed25519") { bench_ed25519(provider, msec); } #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) else if(algo == "DH") { bench_dh(provider, msec); } #endif #if defined(BOTAN_HAS_ECDH) else if(algo == "ECDH") { bench_ecdh(ecc_groups, provider, msec); } #endif #if defined(BOTAN_HAS_CURVE_25519) else if(algo == "Curve25519") { bench_curve25519(provider, msec); } #endif #if defined(BOTAN_HAS_MCELIECE) else if(algo == "McEliece") { bench_mceliece(provider, msec); } #endif #if defined(BOTAN_HAS_XMSS) else if(algo == "XMSS") { bench_xmss(provider, msec); } #endif #if defined(BOTAN_HAS_NEWHOPE) && defined(BOTAN_HAS_CHACHA_RNG) else if(algo == "NEWHOPE") { bench_newhope(provider, msec); } #endif #if defined(BOTAN_HAS_DL_GROUP) else if(algo == "modexp") { bench_modexp(msec); } #endif #if defined(BOTAN_HAS_NUMBERTHEORY) else if(algo == "random_prime") { bench_random_prime(msec); } else if(algo == "inverse_mod") { bench_inverse_mod(msec); } #endif #if defined(BOTAN_HAS_FPE_FE1) else if(algo == "fpe_fe1") { bench_fpe_fe1(msec); } #endif #if defined(BOTAN_HAS_RFC3394_KEYWRAP) else if(algo == "rfc3394") { bench_rfc3394(msec); } #endif #if defined(BOTAN_HAS_ECC_GROUP) else if(algo == "ecc_mult") { bench_ecc_mult(ecc_groups, msec); } else if(algo == "os2ecp") { bench_os2ecp(ecc_groups, msec); } #endif else if(algo == "RNG") { #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) Botan::AutoSeeded_RNG auto_rng; bench_rng(auto_rng, "AutoSeeded_RNG (with reseed)", msec, buf_sizes); #endif #if defined(BOTAN_HAS_SYSTEM_RNG) bench_rng(Botan::system_rng(), "System_RNG", msec, buf_sizes); #endif #if defined(BOTAN_HAS_RDRAND_RNG) if(Botan::CPUID::has_rdrand()) { Botan::RDRAND_RNG rdrand; bench_rng(rdrand, "RDRAND", msec, buf_sizes); } #endif #if defined(BOTAN_HAS_HMAC_DRBG) for(std::string hash : { "SHA-256", "SHA-384", "SHA-512" }) { Botan::HMAC_DRBG hmac_drbg(hash); bench_rng(hmac_drbg, hmac_drbg.name(), msec, buf_sizes); } #endif #if defined(BOTAN_HAS_CHACHA_RNG) // Provide a dummy seed Botan::ChaCha_RNG chacha_rng(Botan::secure_vector(32)); bench_rng(chacha_rng, "ChaCha_RNG", msec, buf_sizes); #endif } else if(algo == "entropy") { bench_entropy_sources(msec); } else { if(verbose() || !using_defaults) { error_output() << "Unknown algorithm '" << algo << "'\n"; } } } if(m_json) { output() << m_json->print(); } if(m_summary) { output() << m_summary->print() << "\n" << Botan::version_string() << "\n" << "CPUID: " << Botan::CPUID::to_string() << "\n"; } } private: std::unique_ptr m_summary; std::unique_ptr m_json; void record_result(const Timer& t) { if(m_json) { m_json->add(t); } else { output() << t.to_string() << std::flush; if(m_summary) m_summary->add(t); } } template using bench_fn = std::function&)>; template void bench_providers_of(const std::string& algo, const std::string& provider, /* user request, if any */ const std::chrono::milliseconds runtime, const std::vector& buf_sizes, bench_fn bench_one) { for(auto const& prov : T::providers(algo)) { if(provider.empty() || provider == prov) { auto p = T::create(algo, prov); if(p) { bench_one(*p, prov, runtime, buf_sizes); } } } } void bench_block_cipher(Botan::BlockCipher& cipher, const std::string& provider, std::chrono::milliseconds runtime, const std::vector& buf_sizes) { Timer ks_timer(cipher.name(), provider, "key schedule"); const Botan::SymmetricKey key(rng(), cipher.maximum_keylength()); ks_timer.run([&]() { cipher.set_key(key); }); const size_t bs = cipher.block_size(); std::set buf_sizes_in_blocks; for(size_t buf_size : buf_sizes) { if(buf_size % bs == 0) buf_sizes_in_blocks.insert(buf_size); else buf_sizes_in_blocks.insert(buf_size + bs - (buf_size % bs)); } for(size_t buf_size : buf_sizes_in_blocks) { std::vector buffer(buf_size); Timer encrypt_timer(cipher.name(), buffer.size(), "encrypt", provider, buf_size); Timer decrypt_timer(cipher.name(), buffer.size(), "decrypt", provider, buf_size); encrypt_timer.run_until_elapsed(runtime, [&]() { cipher.encrypt(buffer); }); record_result(encrypt_timer); decrypt_timer.run_until_elapsed(runtime, [&]() { cipher.decrypt(buffer); }); record_result(decrypt_timer); } } void bench_stream_cipher( Botan::StreamCipher& cipher, const std::string& provider, const std::chrono::milliseconds runtime, const std::vector& buf_sizes) { for(auto buf_size : buf_sizes) { Botan::secure_vector buffer = rng().random_vec(buf_size); Timer encrypt_timer(cipher.name(), buffer.size(), "encrypt", provider, buf_size); const Botan::SymmetricKey key(rng(), cipher.maximum_keylength()); cipher.set_key(key); if(cipher.valid_iv_length(12)) { const Botan::InitializationVector iv(rng(), 12); cipher.set_iv(iv.begin(), iv.size()); } while(encrypt_timer.under(runtime)) { encrypt_timer.run([&]() { cipher.encipher(buffer); }); } record_result(encrypt_timer); } } void bench_hash( Botan::HashFunction& hash, const std::string& provider, const std::chrono::milliseconds runtime, const std::vector& buf_sizes) { for(auto buf_size : buf_sizes) { Botan::secure_vector buffer = rng().random_vec(buf_size); Timer timer(hash.name(), buffer.size(), "hash", provider, buf_size); timer.run_until_elapsed(runtime, [&]() { hash.update(buffer); }); record_result(timer); } } void bench_mac( Botan::MessageAuthenticationCode& mac, const std::string& provider, const std::chrono::milliseconds runtime, const std::vector& buf_sizes) { for(auto buf_size : buf_sizes) { Botan::secure_vector buffer = rng().random_vec(buf_size); const Botan::SymmetricKey key(rng(), mac.maximum_keylength()); mac.set_key(key); mac.start(nullptr, 0); Timer timer(mac.name(), buffer.size(), "mac", provider, buf_size); timer.run_until_elapsed(runtime, [&]() { mac.update(buffer); }); record_result(timer); } } void bench_cipher_mode( Botan::Cipher_Mode& enc, Botan::Cipher_Mode& dec, const std::chrono::milliseconds runtime, const std::vector& buf_sizes) { Timer ks_timer(enc.name(), enc.provider(), "key schedule"); const Botan::SymmetricKey key(rng(), enc.key_spec().maximum_keylength()); ks_timer.run([&]() { enc.set_key(key); }); ks_timer.run([&]() { dec.set_key(key); }); record_result(ks_timer); for(auto buf_size : buf_sizes) { Botan::secure_vector buffer = rng().random_vec(buf_size); Timer encrypt_timer(enc.name(), buffer.size(), "encrypt", enc.provider(), buf_size); Timer decrypt_timer(dec.name(), buffer.size(), "decrypt", dec.provider(), buf_size); Botan::secure_vector iv = rng().random_vec(enc.default_nonce_length()); if(buf_size >= enc.minimum_final_size()) { while(encrypt_timer.under(runtime) && decrypt_timer.under(runtime)) { // Must run in this order, or AEADs will reject the ciphertext encrypt_timer.run([&]() { enc.start(iv); enc.finish(buffer); }); decrypt_timer.run([&]() { dec.start(iv); dec.finish(buffer); }); if(iv.size() > 0) { iv[0] += 1; } } } record_result(encrypt_timer); record_result(decrypt_timer); } } void bench_rng( Botan::RandomNumberGenerator& rng, const std::string& rng_name, const std::chrono::milliseconds runtime, const std::vector& buf_sizes) { for(auto buf_size : buf_sizes) { Botan::secure_vector buffer(buf_size); #if defined(BOTAN_HAS_SYSTEM_RNG) rng.reseed_from_rng(Botan::system_rng(), 256); #endif Timer timer(rng_name, buffer.size(), "generate", "", buf_size); timer.run_until_elapsed(runtime, [&]() { rng.randomize(buffer.data(), buffer.size()); }); record_result(timer); } } void bench_entropy_sources(const std::chrono::milliseconds) { Botan::Entropy_Sources& srcs = Botan::Entropy_Sources::global_sources(); for(auto src : srcs.enabled_sources()) { size_t entropy_bits = 0; Botan_Tests::SeedCapturing_RNG rng; Timer timer(src, "", "bytes"); timer.run([&]() { entropy_bits = srcs.poll_just(rng, src); }); size_t compressed_size = 0; #if defined(BOTAN_HAS_ZLIB) std::unique_ptr comp(Botan::make_compressor("zlib")); if(comp) { Botan::secure_vector compressed; compressed.assign(rng.seed_material().begin(), rng.seed_material().end()); comp->start(9); comp->finish(compressed); compressed_size = compressed.size(); } #endif std::ostringstream msg; msg << "Entropy source " << src << " output " << rng.seed_material().size() << " bytes" << " estimated entropy " << entropy_bits << " in " << timer.milliseconds() << " ms"; if(compressed_size > 0) { msg << " output compressed to " << compressed_size << " bytes"; } msg << " total samples " << rng.samples() << "\n"; timer.set_custom_msg(msg.str()); record_result(timer); } } #if defined(BOTAN_HAS_ECC_GROUP) void bench_ecc_mult(const std::vector& groups, const std::chrono::milliseconds runtime) { for(std::string group_name : groups) { const Botan::EC_Group group(group_name); Timer mult_timer(group_name + " scalar mult"); Timer blinded_mult_timer(group_name + " blinded scalar mult"); const Botan::BigInt scalar(rng(), group.get_curve().get_p().bits()); const Botan::PointGFp& base_point = group.get_base_point(); Botan::Blinded_Point_Multiply scalar_mult(base_point, group.get_order(), 4); while(blinded_mult_timer.under(runtime)) { const Botan::PointGFp r1 = mult_timer.run([&]() { return base_point * scalar; }); const Botan::PointGFp r2 = blinded_mult_timer.run( [&]() { return scalar_mult.blinded_multiply(scalar, rng()); }); BOTAN_ASSERT_EQUAL(r1, r2, "Same point computed by both methods"); } record_result(mult_timer); record_result(blinded_mult_timer); } } void bench_os2ecp(const std::vector& groups, const std::chrono::milliseconds runtime) { Timer uncmp_timer("OS2ECP uncompressed"); Timer cmp_timer("OS2ECP compressed"); for(std::string group_name : groups) { const Botan::EC_Group group(group_name); const Botan::CurveGFp& curve = group.get_curve(); while(uncmp_timer.under(runtime) && cmp_timer.under(runtime)) { const Botan::BigInt k(rng(), 256); const Botan::PointGFp p = group.get_base_point() * k; const Botan::secure_vector os_cmp = Botan::EC2OSP(p, Botan::PointGFp::COMPRESSED); const Botan::secure_vector os_uncmp = Botan::EC2OSP(p, Botan::PointGFp::UNCOMPRESSED); uncmp_timer.run([&]() { OS2ECP(os_uncmp, curve); }); cmp_timer.run([&]() { OS2ECP(os_cmp, curve); }); } record_result(uncmp_timer); record_result(cmp_timer); } } #endif #if defined(BOTAN_HAS_FPE_FE1) void bench_fpe_fe1(const std::chrono::milliseconds runtime) { const Botan::BigInt n = 1000000000000000; Timer enc_timer("FPE_FE1 encrypt"); Timer dec_timer("FPE_FE1 decrypt"); const Botan::SymmetricKey key(rng(), 32); const std::vector tweak(8); // 8 zeros Botan::BigInt x = 1; while(enc_timer.under(runtime)) { enc_timer.start(); x = Botan::FPE::fe1_encrypt(n, x, key, tweak); enc_timer.stop(); } for(size_t i = 0; i != enc_timer.events(); ++i) { dec_timer.start(); x = Botan::FPE::fe1_decrypt(n, x, key, tweak); dec_timer.stop(); } BOTAN_ASSERT(x == 1, "FPE works"); record_result(enc_timer); record_result(dec_timer); } #endif #if defined(BOTAN_HAS_RFC3394_KEYWRAP) void bench_rfc3394(const std::chrono::milliseconds runtime) { Timer wrap_timer("RFC3394 AES-256 key wrap"); Timer unwrap_timer("RFC3394 AES-256 key unwrap"); const Botan::SymmetricKey kek(rng(), 32); Botan::secure_vector key(64, 0); while(wrap_timer.under(runtime)) { wrap_timer.start(); key = Botan::rfc3394_keywrap(key, kek); wrap_timer.stop(); unwrap_timer.start(); key = Botan::rfc3394_keyunwrap(key, kek); unwrap_timer.stop(); key[0] += 1; } record_result(wrap_timer); record_result(unwrap_timer); } #endif #if defined(BOTAN_HAS_DL_GROUP) void bench_modexp(const std::chrono::milliseconds runtime) { for(size_t group_bits : { 1024, 1536, 2048, 3072, 4096 }) { const std::string group_bits_str = std::to_string(group_bits); const Botan::DL_Group group("modp/srp/" + group_bits_str); const size_t e_bits = Botan::dl_exponent_size(group_bits); const size_t f_bits = group_bits - 1; const Botan::BigInt random_e(rng(), e_bits); const Botan::BigInt random_f(rng(), f_bits); Timer e_timer(group_bits_str + " short exponent", "", "modexp"); Timer f_timer(group_bits_str + " full exponent", "", "modexp"); while(f_timer.under(runtime)) { e_timer.run([&]() { Botan::power_mod(group.get_g(), random_e, group.get_p()); }); f_timer.run([&]() { Botan::power_mod(group.get_g(), random_f, group.get_p()); }); } record_result(e_timer); record_result(f_timer); } } #endif #if defined(BOTAN_HAS_NUMBERTHEORY) void bench_inverse_mod(const std::chrono::milliseconds runtime) { Botan::BigInt p; p.set_bit(521); p--; Timer invmod_timer("inverse_mod"); Timer monty_timer("montgomery_inverse"); Timer ct_invmod_timer("ct_inverse_mod"); Timer powm_timer("exponentiation"); Botan::Fixed_Exponent_Power_Mod powm_p(p - 2, p); while(invmod_timer.under(runtime)) { const Botan::BigInt x(rng(), p.bits() - 1); const Botan::BigInt x_inv1 = invmod_timer.run([&] { return Botan::inverse_mod(x + p, p); }); const Botan::BigInt x_inv2 = monty_timer.run([&] { return Botan::normalized_montgomery_inverse(x, p); }); const Botan::BigInt x_inv3 = ct_invmod_timer.run([&] { return Botan::ct_inverse_mod_odd_modulus(x, p); }); const Botan::BigInt x_inv4 = powm_timer.run([&] { return powm_p(x); }); BOTAN_ASSERT_EQUAL(x_inv1, x_inv2, "Same result"); BOTAN_ASSERT_EQUAL(x_inv1, x_inv3, "Same result"); BOTAN_ASSERT_EQUAL(x_inv1, x_inv4, "Same result"); } record_result(invmod_timer); record_result(monty_timer); record_result(ct_invmod_timer); record_result(powm_timer); } void bench_random_prime(const std::chrono::milliseconds runtime) { const size_t coprime = 65537; // simulates RSA key gen for(size_t bits : { 1024, 1536 }) { Timer genprime_timer("random_prime " + std::to_string(bits)); Timer is_prime_timer("is_prime " + std::to_string(bits)); while(genprime_timer.under(runtime) && is_prime_timer.under(runtime)) { const Botan::BigInt p = genprime_timer.run([&] { return Botan::random_prime(rng(), bits, coprime); }); const bool ok = is_prime_timer.run([&] { return Botan::is_prime(p, rng(), 64, true); }); if(!ok) { error_output() << "Generated prime " << p << " which then failed primality test"; } // Now test p+2, p+4, ... which may or may not be prime for(size_t i = 2; i != 64; i += 2) { is_prime_timer.run([&]() { Botan::is_prime(p, rng(), 64, true); }); } } record_result(genprime_timer); record_result(is_prime_timer); } } #endif #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) void bench_pk_enc( const Botan::Private_Key& key, const std::string& nm, const std::string& provider, const std::string& padding, std::chrono::milliseconds msec) { std::vector plaintext, ciphertext; Botan::PK_Encryptor_EME enc(key, rng(), padding, provider); Botan::PK_Decryptor_EME dec(key, rng(), padding, provider); Timer enc_timer(nm + " " + padding, provider, "encrypt"); Timer dec_timer(nm + " " + padding, provider, "decrypt"); while(enc_timer.under(msec) || dec_timer.under(msec)) { // Generate a new random ciphertext to decrypt if(ciphertext.empty() || enc_timer.under(msec)) { plaintext = unlock(rng().random_vec(enc.maximum_input_size())); ciphertext = enc_timer.run([&]() { return enc.encrypt(plaintext, rng()); }); } if(dec_timer.under(msec)) { auto dec_pt = dec_timer.run([&]() { return dec.decrypt(ciphertext); }); if(dec_pt != plaintext) // sanity check { error_output() << "Bad roundtrip in PK encrypt/decrypt bench\n"; } } } record_result(enc_timer); record_result(dec_timer); } void bench_pk_ka(const std::string& algo, const std::string& nm, const std::string& params, const std::string& provider, std::chrono::milliseconds msec) { const std::string kdf = "KDF2(SHA-256)"; // arbitrary choice Timer keygen_timer(nm, provider, "keygen"); std::unique_ptr key1(keygen_timer.run([&] { return Botan::create_private_key(algo, rng(), params); })); std::unique_ptr key2(keygen_timer.run([&] { return Botan::create_private_key(algo, rng(), params); })); record_result(keygen_timer); const Botan::PK_Key_Agreement_Key& ka_key1 = dynamic_cast(*key1); const Botan::PK_Key_Agreement_Key& ka_key2 = dynamic_cast(*key2); Botan::PK_Key_Agreement ka1(ka_key1, rng(), kdf, provider); Botan::PK_Key_Agreement ka2(ka_key2, rng(), kdf, provider); const std::vector ka1_pub = ka_key1.public_value(); const std::vector ka2_pub = ka_key2.public_value(); Timer ka_timer(nm, provider, "key agreements"); while(ka_timer.under(msec)) { Botan::SymmetricKey symkey1 = ka_timer.run([&]() { return ka1.derive_key(32, ka2_pub); }); Botan::SymmetricKey symkey2 = ka_timer.run([&]() { return ka2.derive_key(32, ka1_pub); }); if(symkey1 != symkey2) { error_output() << "Key agreement mismatch in PK bench\n"; } } record_result(ka_timer); } void bench_pk_kem(const Botan::Private_Key& key, const std::string& nm, const std::string& provider, const std::string& kdf, std::chrono::milliseconds msec) { Botan::PK_KEM_Decryptor dec(key, rng(), kdf, provider); Botan::PK_KEM_Encryptor enc(key, rng(), kdf, provider); Timer kem_enc_timer(nm, provider, "KEM encrypt"); Timer kem_dec_timer(nm, provider, "KEM decrypt"); while(kem_enc_timer.under(msec) && kem_dec_timer.under(msec)) { Botan::secure_vector encap_key, enc_shared_key; Botan::secure_vector salt = rng().random_vec(16); kem_enc_timer.start(); enc.encrypt(encap_key, enc_shared_key, 64, rng(), salt); kem_enc_timer.stop(); kem_dec_timer.start(); Botan::secure_vector dec_shared_key = dec.decrypt(encap_key, 64, salt); kem_dec_timer.stop(); if(enc_shared_key != dec_shared_key) { error_output() << "KEM mismatch in PK bench\n"; } } record_result(kem_enc_timer); record_result(kem_dec_timer); } void bench_pk_sig_ecc(const std::string& algo, const std::string& emsa, const std::string& provider, const std::vector& params, std::chrono::milliseconds msec) { for(std::string grp : params) { const std::string nm = grp.empty() ? algo : (algo + "-" + grp); Timer keygen_timer(nm, provider, "keygen"); std::unique_ptr key(keygen_timer.run([&] { return Botan::create_private_key(algo, rng(), grp); })); record_result(keygen_timer); bench_pk_sig(*key, nm, provider, emsa, msec); } } void bench_pk_sig(const Botan::Private_Key& key, const std::string& nm, const std::string& provider, const std::string& padding, std::chrono::milliseconds msec) { std::vector message, signature, bad_signature; Botan::PK_Signer sig(key, rng(), padding, Botan::IEEE_1363, provider); Botan::PK_Verifier ver(key, padding, Botan::IEEE_1363, provider); Timer sig_timer(nm + " " + padding, provider, "sign"); Timer ver_timer(nm + " " + padding, provider, "verify"); while(ver_timer.under(msec) || sig_timer.under(msec)) { if(signature.empty() || sig_timer.under(msec)) { /* Length here is kind of arbitrary, but 48 bytes fits into a single hash block so minimizes hashing overhead versus the PK op itself. */ message = unlock(rng().random_vec(48)); signature = sig_timer.run([&]() { return sig.sign_message(message, rng()); }); bad_signature = signature; bad_signature[rng().next_byte() % bad_signature.size()] ^= rng().next_nonzero_byte(); } if(ver_timer.under(msec)) { const bool verified = ver_timer.run([&] { return ver.verify_message(message, signature); }); if(!verified) { error_output() << "Correct signature rejected in PK signature bench\n"; } const bool verified_bad = ver_timer.run([&] { return ver.verify_message(message, bad_signature); }); if(verified_bad) { error_output() << "Bad signature accepted in PK signature bench\n"; } } } record_result(sig_timer); record_result(ver_timer); } #endif #if defined(BOTAN_HAS_RSA) void bench_rsa(const std::string& provider, std::chrono::milliseconds msec) { for(size_t keylen : { 1024, 2048, 3072, 4096 }) { const std::string nm = "RSA-" + std::to_string(keylen); Timer keygen_timer(nm, provider, "keygen"); std::unique_ptr key(keygen_timer.run([&] { return Botan::create_private_key("RSA", rng(), std::to_string(keylen)); })); record_result(keygen_timer); // Using PKCS #1 padding so OpenSSL provider can play along bench_pk_enc(*key, nm, provider, "EME-PKCS1-v1_5", msec); bench_pk_enc(*key, nm, provider, "OAEP(SHA-1)", msec); bench_pk_sig(*key, nm, provider, "EMSA-PKCS1-v1_5(SHA-1)", msec); bench_pk_sig(*key, nm, provider, "PSSR(SHA-256)", msec); } } #endif #if defined(BOTAN_HAS_ECDSA) void bench_ecdsa(const std::vector& groups, const std::string& provider, std::chrono::milliseconds msec) { return bench_pk_sig_ecc("ECDSA", "EMSA1(SHA-256)", provider, groups, msec); } #endif #if defined(BOTAN_HAS_ECKCDSA) void bench_eckcdsa(const std::vector& groups, const std::string& provider, std::chrono::milliseconds msec) { return bench_pk_sig_ecc("ECKCDSA", "EMSA1(SHA-256)", provider, groups, msec); } #endif #if defined(BOTAN_HAS_SM2) void bench_sm2(const std::vector& groups, const std::string& provider, std::chrono::milliseconds msec) { return bench_pk_sig_ecc("SM2_Sig", "SM3", provider, groups, msec); } #endif #if defined(BOTAN_HAS_ECGDSA) void bench_ecgdsa(const std::vector& groups, const std::string& provider, std::chrono::milliseconds msec) { return bench_pk_sig_ecc("ECGDSA", "EMSA1(SHA-256)", provider, groups, msec); } #endif #if defined(BOTAN_HAS_ED25519) void bench_ed25519(const std::string& provider, std::chrono::milliseconds msec) { return bench_pk_sig_ecc("Ed25519", "Pure", provider, std::vector{""}, msec); } #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) void bench_dh(const std::string& provider, std::chrono::milliseconds msec) { for(size_t bits : { 1024, 2048, 3072 }) { bench_pk_ka("DH", "DH-" + std::to_string(bits), "modp/ietf/" + std::to_string(bits), provider, msec); } } #endif #if defined(BOTAN_HAS_ECDH) void bench_ecdh(const std::vector& groups, const std::string& provider, std::chrono::milliseconds msec) { for(std::string grp : groups) { bench_pk_ka("ECDH", "ECDH-" + grp, grp, provider, msec); } } #endif #if defined(BOTAN_HAS_CURVE_25519) void bench_curve25519(const std::string& provider, std::chrono::milliseconds msec) { bench_pk_ka("Curve25519", "Curve25519", "", provider, msec); } #endif #if defined(BOTAN_HAS_MCELIECE) void bench_mceliece(const std::string& provider, std::chrono::milliseconds msec) { /* SL=80 n=1632 t=33 - 59 KB pubkey 140 KB privkey SL=107 n=2480 t=45 - 128 KB pubkey 300 KB privkey SL=128 n=2960 t=57 - 195 KB pubkey 459 KB privkey SL=147 n=3408 t=67 - 265 KB pubkey 622 KB privkey SL=191 n=4624 t=95 - 516 KB pubkey 1234 KB privkey SL=256 n=6624 t=115 - 942 KB pubkey 2184 KB privkey */ const std::vector> mce_params = { { 2480, 45 }, { 2960, 57 }, { 3408, 67 }, { 4624, 95 }, { 6624, 115 } }; for(auto params : mce_params) { size_t n = params.first; size_t t = params.second; const std::string nm = "McEliece-" + std::to_string(n) + "," + std::to_string(t) + " (WF=" + std::to_string(Botan::mceliece_work_factor(n, t)) + ")"; Timer keygen_timer(nm, provider, "keygen"); std::unique_ptr key(keygen_timer.run([&] { return new Botan::McEliece_PrivateKey(rng(), n, t); })); record_result(keygen_timer); bench_pk_kem(*key, nm, provider, "KDF2(SHA-256)", msec); } } #endif #if defined(BOTAN_HAS_XMSS) void bench_xmss(const std::string& provider, std::chrono::milliseconds msec) { // H16 and H20 signatures take an hour or more to generate std::vector xmss_params { "XMSS_SHA2-256_W16_H10", "XMSS_SHA2-512_W16_H10", "XMSS_SHAKE128_W16_H10", "XMSS_SHAKE256_W16_H10", }; for(std::string params : xmss_params) { Timer keygen_timer(params, provider, "keygen"); std::unique_ptr key(keygen_timer.run([&] { return Botan::create_private_key("XMSS", rng(), params); })); record_result(keygen_timer); bench_pk_sig(*key, params, provider, "", msec); } } #endif #if defined(BOTAN_HAS_NEWHOPE) && defined(BOTAN_HAS_CHACHA_RNG) void bench_newhope(const std::string& /*provider*/, std::chrono::milliseconds msec) { const std::string nm = "NEWHOPE"; Timer keygen_timer(nm, "", "keygen"); Timer shareda_timer(nm, "", "shareda"); Timer sharedb_timer(nm, "", "sharedb"); Botan::ChaCha_RNG nh_rng(Botan::secure_vector(32)); while(sharedb_timer.under(msec)) { std::vector send_a(Botan::NEWHOPE_SENDABYTES), send_b(Botan::NEWHOPE_SENDBBYTES); std::vector shared_a(32), shared_b(32); Botan::newhope_poly sk_a; keygen_timer.start(); Botan::newhope_keygen(send_a.data(), &sk_a, nh_rng); keygen_timer.stop(); sharedb_timer.start(); Botan::newhope_sharedb(shared_b.data(), send_b.data(), send_a.data(), nh_rng); sharedb_timer.stop(); shareda_timer.start(); Botan::newhope_shareda(shared_a.data(), &sk_a, send_b.data()); shareda_timer.stop(); BOTAN_ASSERT(shared_a == shared_b, "Same derived key"); } record_result(keygen_timer); record_result(shareda_timer); record_result(sharedb_timer); } #endif }; BOTAN_REGISTER_COMMAND("speed", Speed); } botan-2.4.0/src/cli/timing_tests.cpp000066400000000000000000000341231322470703100173750ustar00rootroot00000000000000/* * Timing Analysis Tests * * These tests are not for performance, but verifying that two inputs are not handled * in a way that is vulnerable to simple timing attacks. * * Produces output which can be analyzed with the Mona reporting library * * $ git clone https://github.com/seecurity/mona-timing-report.git * $ cd mona-timing-report && ant * $ java -jar ReportingTool.jar --lowerBound=0.4 --upperBound=0.5 --inputFile=$file --name=$file * * (C) 2016 Juraj Somorovsky - juraj.somorovsky@hackmanit.de * (C) 2017 Neverhub * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include #include #include #include #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif #if defined(BOTAN_HAS_AUTO_SEEDED_RNG) #include #endif #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EME_RAW) #include #include #endif #if defined(BOTAN_HAS_TLS_CBC) #include #include #endif #if defined(BOTAN_HAS_ECDSA) #include #include #include #endif namespace Botan_CLI { typedef uint64_t ticks; class Timing_Test { public: Timing_Test() = default; virtual ~Timing_Test() = default; std::vector> execute_evaluation( const std::vector& inputs, size_t warmup_runs, size_t measurement_runs); virtual std::vector prepare_input(std::string input) = 0; virtual ticks measure_critical_function(std::vector input) = 0; protected: static ticks get_ticks() { // Returns CPU counter or best approximation (monotonic clock of some kind) return Botan::OS::get_high_resolution_clock(); } static Botan::RandomNumberGenerator& timing_test_rng() { #if defined(BOTAN_HAS_SYSTEM_RNG) return Botan::system_rng(); #elif defined(BOTAN_HAS_AUTO_SEEDED_RNG) static AutoSeeded_RNG static_timing_test_rng(Botan::Entropy_Sources::global_sources(), 0); return static_timing_test_rng; #else // we could just use SHA-256 in OFB mode for these purposes throw CLI_Error("Timing tests require a PRNG"); #endif } }; #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EME_PKCS1v15) && defined(BOTAN_HAS_EME_RAW) class Bleichenbacker_Timing_Test final : public Timing_Test { public: Bleichenbacker_Timing_Test(size_t keysize) : m_privkey(Timing_Test::timing_test_rng(), keysize) , m_pubkey(m_privkey) , m_enc(m_pubkey, Timing_Test::timing_test_rng(), "Raw") , m_dec(m_privkey, Timing_Test::timing_test_rng(), "PKCS1v15") {} std::vector prepare_input(std::string input) override { const std::vector input_vector = Botan::hex_decode(input); const std::vector encrypted = m_enc.encrypt(input_vector, Timing_Test::timing_test_rng()); return encrypted; } ticks measure_critical_function(std::vector input) override { const ticks start = get_ticks(); m_dec.decrypt_or_random(input.data(), m_ctext_length, m_expected_content_size, Timing_Test::timing_test_rng()); const ticks end = get_ticks(); return (end - start); } private: const size_t m_expected_content_size = 48; const size_t m_ctext_length = 256; Botan::RSA_PrivateKey m_privkey; Botan::RSA_PublicKey m_pubkey; Botan::PK_Encryptor_EME m_enc; Botan::PK_Decryptor_EME m_dec; }; #endif #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EME_OAEP) && defined(BOTAN_HAS_EME_RAW) /* * Test Manger OAEP side channel * * "A Chosen Ciphertext Attack on RSA Optimal Asymmetric Encryption * Padding (OAEP) as Standardized in PKCS #1 v2.0" James Manger * http://archiv.infsec.ethz.ch/education/fs08/secsem/Manger01.pdf */ class Manger_Timing_Test final : public Timing_Test { public: Manger_Timing_Test(size_t keysize) : m_privkey(Timing_Test::timing_test_rng(), keysize) , m_pubkey(m_privkey) , m_enc(m_pubkey, Timing_Test::timing_test_rng(), m_encrypt_padding) , m_dec(m_privkey, Timing_Test::timing_test_rng(), m_decrypt_padding) {} std::vector prepare_input(std::string input) override { const std::vector input_vector = Botan::hex_decode(input); const std::vector encrypted = m_enc.encrypt(input_vector, Timing_Test::timing_test_rng()); return encrypted; } ticks measure_critical_function(std::vector input) override { ticks start = get_ticks(); try { m_dec.decrypt(input.data(), m_ctext_length); } catch(Botan::Decoding_Error&) { } ticks end = get_ticks(); return (end - start); } private: const std::string m_encrypt_padding = "Raw"; const std::string m_decrypt_padding = "EME1(SHA-256)"; const size_t m_ctext_length = 256; Botan::RSA_PrivateKey m_privkey; Botan::RSA_PublicKey m_pubkey; Botan::PK_Encryptor_EME m_enc; Botan::PK_Decryptor_EME m_dec; }; #endif #if defined(BOTAN_HAS_TLS_CBC) /* * Test handling of countermeasure to the Lucky13 attack */ class Lucky13_Timing_Test final : public Timing_Test { public: Lucky13_Timing_Test(const std::string& mac_name, size_t mac_keylen) : m_mac_algo(mac_name) , m_mac_keylen(mac_keylen) , m_dec("AES-128", 16, m_mac_algo, m_mac_keylen, true, false) {} std::vector prepare_input(std::string input) override; ticks measure_critical_function(std::vector input) override; private: const std::string m_mac_algo; const size_t m_mac_keylen; Botan::TLS::TLS_CBC_HMAC_AEAD_Decryption m_dec; }; std::vector Lucky13_Timing_Test::prepare_input(std::string input) { const std::vector input_vector = Botan::hex_decode(input); const std::vector key(16); const std::vector iv(16); std::unique_ptr enc(Botan::get_cipher_mode("AES-128/CBC/NoPadding", Botan::ENCRYPTION)); enc->set_key(key); enc->start(iv); Botan::secure_vector buf(input_vector.begin(), input_vector.end()); enc->finish(buf); return unlock(buf); } ticks Lucky13_Timing_Test::measure_critical_function(std::vector input) { Botan::secure_vector data(input.begin(), input.end()); Botan::secure_vector aad(13); const Botan::secure_vector iv(16); Botan::secure_vector key(16 + m_mac_keylen); m_dec.set_key(unlock(key)); m_dec.set_ad(unlock(aad)); m_dec.start(unlock(iv)); ticks start = get_ticks(); try { m_dec.finish(data); } catch(Botan::TLS::TLS_Exception&) { } ticks end = get_ticks(); return (end - start); } #endif #if defined(BOTAN_HAS_ECDSA) class ECDSA_Timing_Test final : public Timing_Test { public: ECDSA_Timing_Test(std::string ecgroup); std::vector prepare_input(std::string input) override; ticks measure_critical_function(std::vector input) override; private: const Botan::ECDSA_PrivateKey m_privkey; const Botan::BigInt m_order; Botan::Blinded_Point_Multiply m_base_point; const Botan::BigInt m_x; const Botan::Modular_Reducer m_mod_order; }; ECDSA_Timing_Test::ECDSA_Timing_Test(std::string ecgroup) : m_privkey(Timing_Test::timing_test_rng(), Botan::EC_Group(ecgroup)) , m_order(m_privkey.domain().get_order()) , m_base_point(m_privkey.domain().get_base_point(), m_order) , m_x(m_privkey.private_value()) , m_mod_order(m_order) {} std::vector ECDSA_Timing_Test::prepare_input(std::string input) { const std::vector input_vector = Botan::hex_decode(input); return input_vector; } ticks ECDSA_Timing_Test::measure_critical_function(std::vector input) { const Botan::BigInt k(input.data(), input.size()); const Botan::BigInt msg(Timing_Test::timing_test_rng(), m_order.bits()); ticks start = get_ticks(); //The following ECDSA operations involve and should not leak any information about k. const Botan::PointGFp k_times_P = m_base_point.blinded_multiply(k, Timing_Test::timing_test_rng()); const Botan::BigInt r = m_mod_order.reduce(k_times_P.get_affine_x()); const Botan::BigInt s = m_mod_order.multiply(inverse_mod(k, m_order), mul_add(m_x, r, msg)); BOTAN_UNUSED(r); BOTAN_UNUSED(s); ticks end = get_ticks(); return (end - start); } #endif std::vector> Timing_Test::execute_evaluation( const std::vector& raw_inputs, size_t warmup_runs, size_t measurement_runs) { std::vector> all_results(raw_inputs.size()); std::vector> inputs(raw_inputs.size()); for(auto& result : all_results) { result.reserve(measurement_runs); } for(size_t i = 0; i != inputs.size(); ++i) { inputs[i] = prepare_input(raw_inputs[i]); } // arbitrary upper bounds of 1 and 10 million resp if(warmup_runs > 1000000 || measurement_runs > 100000000) { throw CLI_Error("Requested execution counts too large, rejecting"); } size_t total_runs = 0; while(total_runs < (warmup_runs + measurement_runs)) { std::vector results(inputs.size()); for(size_t i = 0; i != inputs.size(); ++i) { results[i] = measure_critical_function(inputs[i]); } total_runs++; if(total_runs >= warmup_runs) { for(size_t i = 0; i != results.size(); ++i) { all_results[i].push_back(results[i]); } } } return all_results; } class Timing_Test_Command final : public Command { public: Timing_Test_Command() : Command("timing_test test_type --test-data-file= --test-data-dir=src/tests/data/timing " "--warmup-runs=1000 --measurement-runs=10000") {} void go() override { const std::string test_type = get_arg("test_type"); const size_t warmup_runs = get_arg_sz("warmup-runs"); const size_t measurement_runs = get_arg_sz("measurement-runs"); std::unique_ptr test = lookup_timing_test(test_type); if(!test) { throw CLI_Error("Unknown or unavailable test type '" + test_type + "'"); } std::string filename = get_arg_or("test-data-file", ""); if(filename.empty()) { const std::string test_data_dir = get_arg("test-data-dir"); filename = test_data_dir + "/" + test_type + ".vec"; } std::vector lines = read_testdata(filename); std::vector> results = test->execute_evaluation(lines, warmup_runs, measurement_runs); size_t unique_id = 0; std::ostringstream oss; for(size_t secret_id = 0; secret_id != results.size(); ++secret_id) { for(size_t i = 0; i != results[secret_id].size(); ++i) { oss << unique_id++ << ";" << secret_id << ";" << results[secret_id][i] << "\n"; } } output() << oss.str(); } private: std::vector read_testdata(const std::string& filename) { std::vector lines; std::ifstream infile(filename); if(infile.good() == false) { throw CLI_Error("Error reading test data from '" + filename + "'"); } std::string line; while(std::getline(infile, line)) { if(line.size() > 0 && line.at(0) != '#') { lines.push_back(line); } } return lines; } std::unique_ptr lookup_timing_test(const std::string& test_type); std::string help_text() const override { // TODO check feature macros return (Command::help_text() + "\ntest_type can take on values " + "bleichenbacher " + "manger " "ecdsa " + "lucky13sha1sec3 " + "lucky13sha256sec3 " + "lucky13sec4sha1 " + "lucky13sec4sha256 " + "lucky13sec4sha384 " ); } }; BOTAN_REGISTER_COMMAND("timing_test", Timing_Test_Command); std::unique_ptr Timing_Test_Command::lookup_timing_test(const std::string& test_type) { #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EME_PKCS1v15) && defined(BOTAN_HAS_EME_RAW) if(test_type == "bleichenbacher") { return std::unique_ptr(new Bleichenbacker_Timing_Test(2048)); } #endif #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EME_OAEP) && defined(BOTAN_HAS_EME_RAW) if(test_type == "manger") { return std::unique_ptr(new Manger_Timing_Test(2048)); } #endif #if defined(BOTAN_HAS_ECDSA) if(test_type == "ecdsa") { return std::unique_ptr(new ECDSA_Timing_Test("secp384r1")); } #endif #if defined(BOTAN_HAS_TLS_CBC) if(test_type == "lucky13sha1sec3" || test_type == "lucky13sha1sec4") { return std::unique_ptr(new Lucky13_Timing_Test("SHA-1", 20)); } if(test_type == "lucky13sha256sec3" || test_type == "lucky13sha256sec4") { return std::unique_ptr(new Lucky13_Timing_Test("SHA-256", 32)); } if(test_type == "lucky13sha384") { return std::unique_ptr(new Lucky13_Timing_Test("SHA-384", 48)); } #endif BOTAN_UNUSED(test_type); return nullptr; } } botan-2.4.0/src/cli/tls_client.cpp000066400000000000000000000267401322470703100170320ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * 2016 Matthias Gierlings * 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_TLS) && defined(BOTAN_TARGET_OS_HAS_SOCKETS) #include #include #include #include #include #include #include #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) #include #endif #include #include #include "socket_utils.h" #include "credentials.h" namespace Botan_CLI { class TLS_Client final : public Command, public Botan::TLS::Callbacks { public: TLS_Client() : Command("tls_client host --port=443 --print-certs --policy= " "--tls1.0 --tls1.1 --tls1.2 " "--session-db= --session-db-pass= --next-protocols= --type=tcp") { init_sockets(); } ~TLS_Client() { stop_sockets(); } void go() override { // TODO client cert auth std::unique_ptr session_mgr; const std::string sessions_db = get_arg("session-db"); if(!sessions_db.empty()) { #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) const std::string sessions_passphrase = get_arg("session-db-pass"); session_mgr.reset(new Botan::TLS::Session_Manager_SQLite(sessions_passphrase, rng(), sessions_db)); #else error_output() << "Ignoring session DB file, sqlite not enabled\n"; #endif } if(!session_mgr) { session_mgr.reset(new Botan::TLS::Session_Manager_In_Memory(rng())); } std::string policy_file = get_arg("policy"); std::unique_ptr policy; if(policy_file.size() > 0) { std::ifstream policy_stream(policy_file); if(!policy_stream.good()) { error_output() << "Failed reading policy file\n"; return; } policy.reset(new Botan::TLS::Text_Policy(policy_stream)); } if(!policy) { policy.reset(new Botan::TLS::Policy); } Basic_Credentials_Manager creds; const std::string host = get_arg("host"); const uint16_t port = get_arg_sz("port"); const std::string transport = get_arg("type"); const std::string next_protos = get_arg("next-protocols"); if(transport != "tcp" && transport != "udp") { throw CLI_Usage_Error("Invalid transport type '" + transport + "' for TLS"); } const bool use_tcp = (transport == "tcp"); const std::vector protocols_to_offer = Botan::split_on(next_protos, ','); m_sockfd = connect_to_host(host, port, use_tcp); using namespace std::placeholders; auto version = policy->latest_supported_version(!use_tcp); if(flag_set("tls1.0")) { version = Botan::TLS::Protocol_Version::TLS_V10; } else if(flag_set("tls1.1")) { version = Botan::TLS::Protocol_Version::TLS_V11; } struct sockaddr_storage addrbuf; std::string hostname; if(!host.empty() && inet_pton(AF_INET, host.c_str(), &addrbuf) != 1 && inet_pton(AF_INET6, host.c_str(), &addrbuf) != 1) { hostname = host; } Botan::TLS::Client client(*this, *session_mgr, creds, *policy, rng(), Botan::TLS::Server_Information(hostname, port), version, protocols_to_offer); bool first_active = true; while(!client.is_closed()) { fd_set readfds; FD_ZERO(&readfds); FD_SET(m_sockfd, &readfds); if(client.is_active()) { FD_SET(STDIN_FILENO, &readfds); if(first_active && !protocols_to_offer.empty()) { std::string app = client.application_protocol(); if(app != "") { output() << "Server choose protocol: " << client.application_protocol() << "\n"; } first_active = false; } } struct timeval timeout = { 1, 0 }; ::select(m_sockfd + 1, &readfds, nullptr, nullptr, &timeout); if(FD_ISSET(m_sockfd, &readfds)) { uint8_t buf[4 * 1024] = { 0 }; ssize_t got = ::read(m_sockfd, buf, sizeof(buf)); if(got == 0) { output() << "EOF on socket\n"; break; } else if(got == -1) { output() << "Socket error: " << errno << " " << std::strerror(errno) << "\n"; continue; } client.received_data(buf, got); } if(FD_ISSET(STDIN_FILENO, &readfds)) { uint8_t buf[1024] = { 0 }; ssize_t got = read(STDIN_FILENO, buf, sizeof(buf)); if(got == 0) { output() << "EOF on stdin\n"; client.close(); break; } else if(got == -1) { output() << "Stdin error: " << errno << " " << std::strerror(errno) << "\n"; continue; } if(got == 2 && buf[1] == '\n') { char cmd = buf[0]; if(cmd == 'R' || cmd == 'r') { output() << "Client initiated renegotiation\n"; client.renegotiate(cmd == 'R'); } else if(cmd == 'Q') { output() << "Client initiated close\n"; client.close(); } } else { client.send(buf, got); } } if(client.timeout_check()) { output() << "Timeout detected\n"; } } ::close(m_sockfd); } private: int connect_to_host(const std::string& host, uint16_t port, bool tcp) { addrinfo hints; std::memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = tcp ? SOCK_STREAM : SOCK_DGRAM; addrinfo* res, *rp = nullptr; if(::getaddrinfo(host.c_str(), std::to_string(port).c_str(), &hints, &res) != 0) { throw CLI_Error("getaddrinfo failed for " + host); } int fd = 0; for(rp = res; rp != nullptr; rp = rp->ai_next) { fd = ::socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if(fd == -1) { continue; } if(::connect(fd, rp->ai_addr, rp->ai_addrlen) != 0) { ::close(fd); continue; } break; } ::freeaddrinfo(res); if(rp == nullptr) // no address succeeded { throw CLI_Error("connect failed"); } return fd; } void tls_verify_cert_chain( const std::vector& cert_chain, const std::vector>& ocsp, const std::vector& trusted_roots, Botan::Usage_Type usage, const std::string& hostname, const Botan::TLS::Policy& policy) override { if(cert_chain.empty()) { throw std::invalid_argument("Certificate chain was empty"); } Botan::Path_Validation_Restrictions restrictions( policy.require_cert_revocation_info(), policy.minimum_signature_strength()); auto ocsp_timeout = std::chrono::milliseconds(1000); Botan::Path_Validation_Result result = Botan::x509_path_validate( cert_chain, restrictions, trusted_roots, hostname, usage, std::chrono::system_clock::now(), ocsp_timeout, ocsp); output() << "Certificate validation status: " << result.result_string() << "\n"; if(result.successful_validation()) { auto status = result.all_statuses(); if(status.size() > 0 && status[0].count(Botan::Certificate_Status_Code::OCSP_RESPONSE_GOOD)) { output() << "Valid OCSP response for this server\n"; } } } bool tls_session_established(const Botan::TLS::Session& session) override { output() << "Handshake complete, " << session.version().to_string() << " using " << session.ciphersuite().to_string() << "\n"; if(!session.session_id().empty()) { output() << "Session ID " << Botan::hex_encode(session.session_id()) << "\n"; } if(!session.session_ticket().empty()) { output() << "Session ticket " << Botan::hex_encode(session.session_ticket()) << "\n"; } if(flag_set("print-certs")) { const std::vector& certs = session.peer_certs(); for(size_t i = 0; i != certs.size(); ++i) { output() << "Certificate " << i + 1 << "/" << certs.size() << "\n"; output() << certs[i].to_string(); output() << certs[i].PEM_encode(); } } return true; } static void dgram_socket_write(int sockfd, const uint8_t buf[], size_t length) { int r = ::send(sockfd, buf, length, MSG_NOSIGNAL); if(r == -1) { throw CLI_Error("Socket write failed errno=" + std::to_string(errno)); } } void tls_emit_data(const uint8_t buf[], size_t length) override { size_t offset = 0; while(length) { ssize_t sent = ::send(m_sockfd, buf + offset, length, MSG_NOSIGNAL); if(sent == -1) { if(errno == EINTR) { sent = 0; } else { throw CLI_Error("Socket write failed errno=" + std::to_string(errno)); } } offset += sent; length -= sent; } } void tls_alert(Botan::TLS::Alert alert) override { output() << "Alert: " << alert.type_string() << "\n"; } void tls_record_received(uint64_t /*seq_no*/, const uint8_t buf[], size_t buf_size) override { for(size_t i = 0; i != buf_size; ++i) { output() << buf[i]; } } private: int m_sockfd = -1; }; BOTAN_REGISTER_COMMAND("tls_client", TLS_Client); } #endif botan-2.4.0/src/cli/tls_http_server.cpp000066400000000000000000000375321322470703100201220ustar00rootroot00000000000000/* * (C) 2014,2015,2017 Jack Lloyd * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_TLS) && defined(BOTAN_HAS_BOOST_ASIO) #include #include #include #include #include #include #define _GLIBCXX_HAVE_GTHR_DEFAULT #include #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) #include #endif #include "credentials.h" namespace Botan_CLI { namespace { using boost::asio::ip::tcp; inline void log_exception(const char* where, const std::exception& e) { std::cout << where << ' ' << e.what() << std::endl; } /* * This is an incomplete and highly buggy HTTP request parser. It is just * barely sufficient to handle a GET request sent by a browser. */ class HTTP_Parser { public: class Request { public: const std::string& verb() const { return m_verb; } const std::string& location() const { return m_location; } const std::map& headers() const { return m_headers; } Request(const std::string& verb, const std::string& location, const std::map& headers) : m_verb(verb), m_location(location), m_headers(headers) {} private: std::string m_verb; std::string m_location; std::map m_headers; }; class Callbacks { public: virtual void handle_http_request(const Request& request) = 0; virtual ~Callbacks() = default; }; HTTP_Parser(Callbacks& cb) : m_cb(cb) {} void consume_input(const uint8_t buf[], size_t buf_len) { m_req_buf.append(reinterpret_cast(buf), buf_len); std::istringstream strm(m_req_buf); std::string http_version; std::string verb; std::string location; std::map headers; strm >> verb >> location >> http_version; if(verb.empty() || location.empty()) return; while(true) { std::string header_line; std::getline(strm, header_line); if(header_line == "\r") { continue; } auto delim = header_line.find(": "); if(delim == std::string::npos) { break; } const std::string hdr_name = header_line.substr(0, delim); const std::string hdr_val = header_line.substr(delim + 2, std::string::npos); headers[hdr_name] = hdr_val; if(headers.size() > 1024) throw std::runtime_error("That's an awful lot of headers"); } if(verb != "" && location != "") { Request req(verb, location, headers); m_cb.handle_http_request(req); m_req_buf.clear(); } else printf("ignoring\n"); } private: Callbacks& m_cb; std::string m_req_buf; }; static const size_t READBUF_SIZE = 4096; class TLS_Asio_HTTP_Session final : public boost::enable_shared_from_this, public Botan::TLS::Callbacks, public HTTP_Parser::Callbacks { public: typedef boost::shared_ptr pointer; static pointer create( boost::asio::io_service& io, Botan::TLS::Session_Manager& session_manager, Botan::Credentials_Manager& credentials, Botan::TLS::Policy& policy) { return pointer(new TLS_Asio_HTTP_Session(io, session_manager, credentials, policy)); } tcp::socket& client_socket() { return m_client_socket; } void start() { m_c2s.resize(READBUF_SIZE); client_read(boost::system::error_code(), 0); // start read loop } void stop() { m_tls.close(); } private: TLS_Asio_HTTP_Session(boost::asio::io_service& io, Botan::TLS::Session_Manager& session_manager, Botan::Credentials_Manager& credentials, Botan::TLS::Policy& policy) : m_strand(io) , m_client_socket(io) , m_tls(*this, session_manager, credentials, policy, m_rng) {} void client_read(const boost::system::error_code& error, size_t bytes_transferred) { if(error) { stop(); return; } try { m_tls.received_data(&m_c2s[0], bytes_transferred); } catch(Botan::Exception& e) { log_exception("TLS connection failed", e); stop(); return; } m_client_socket.async_read_some( boost::asio::buffer(&m_c2s[0], m_c2s.size()), m_strand.wrap( boost::bind( &TLS_Asio_HTTP_Session::client_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred))); } void handle_client_write_completion(const boost::system::error_code& error) { if(error) { stop(); return; } m_s2c.clear(); if(m_s2c_pending.empty() && m_tls.is_closed()) { m_client_socket.close(); } tls_emit_data(nullptr, 0); // initiate another write if needed } std::string tls_server_choose_app_protocol(const std::vector& client_protos) override { return "http/1.1"; } void tls_record_received(uint64_t /*rec_no*/, const uint8_t buf[], size_t buf_len) override { if(!m_http_parser) m_http_parser.reset(new HTTP_Parser(*this)); m_http_parser->consume_input(buf, buf_len); } std::string summarize_request(const HTTP_Parser::Request& request) { std::ostringstream strm; strm << "Client " << client_socket().remote_endpoint().address().to_string() << " requested " << request.verb() << " " << request.location() << "\n"; if(request.headers().empty() == false) { strm << "Client HTTP headers:\n"; for(auto kv : request.headers()) strm << " " << kv.first << ": " << kv.second << "\n"; } return strm.str(); } void handle_http_request(const HTTP_Parser::Request& request) override { std::ostringstream response; if(request.verb() != "GET") { response << "HTTP/1.0 405 Method Not Allowed\r\n\r\nNo POST for you"; } else { if(request.location() == "/" || request.location() == "/status") { const std::string http_summary = summarize_request(request); const std::string report = http_summary + m_session_summary + m_chello_summary; response << "HTTP/1.0 200 OK\r\n"; response << "Server: " << Botan::version_string() << "\r\n"; response << "Content-Type: text/plain\r\n"; response << "Content-Length: " << report.size() << "\r\n"; response << "\r\n"; response << report; } else { response << "HTTP/1.0 404 Not Found\r\n\r\nSorry, no"; } } const std::string response_str = response.str(); m_tls.send(response_str); m_tls.close(); } void tls_emit_data(const uint8_t buf[], size_t buf_len) override { if(buf_len > 0) { m_s2c_pending.insert(m_s2c_pending.end(), buf, buf + buf_len); } // no write now active and we still have output pending if(m_s2c.empty() && !m_s2c_pending.empty()) { std::swap(m_s2c_pending, m_s2c); boost::asio::async_write( m_client_socket, boost::asio::buffer(&m_s2c[0], m_s2c.size()), m_strand.wrap( boost::bind( &TLS_Asio_HTTP_Session::handle_client_write_completion, shared_from_this(), boost::asio::placeholders::error))); } } bool tls_session_established(const Botan::TLS::Session& session) override { std::ostringstream strm; strm << "TLS negotiation with " << Botan::version_string() << " test server\n\n"; strm << "Version: " << session.version().to_string() << "\n"; strm << "Ciphersuite: " << session.ciphersuite().to_string() << "\n"; if(session.session_id().empty() == false) { strm << "SessionID: " << Botan::hex_encode(session.session_id()) << "\n"; } if(session.server_info().hostname() != "") { strm << "SNI: " << session.server_info().hostname() << "\n"; } m_session_summary = strm.str(); return true; } void tls_inspect_handshake_msg(const Botan::TLS::Handshake_Message& message) { if(message.type() == Botan::TLS::CLIENT_HELLO) { const Botan::TLS::Client_Hello& client_hello = dynamic_cast(message); std::ostringstream strm; strm << "Client random: " << Botan::hex_encode(client_hello.random()) << "\n"; strm << "Client offered following ciphersuites:\n"; for(uint16_t suite_id : client_hello.ciphersuites()) { Botan::TLS::Ciphersuite ciphersuite = Botan::TLS::Ciphersuite::by_id(suite_id); strm << " - 0x" << std::hex << std::setfill('0') << std::setw(4) << suite_id << std::dec << std::setfill(' ') << std::setw(0) << " "; if(ciphersuite.valid()) strm << ciphersuite.to_string() << "\n"; else if(suite_id == 0x00FF) strm << "Renegotiation SCSV\n"; else strm << "Unknown ciphersuite\n"; } m_chello_summary = strm.str(); } } void tls_alert(Botan::TLS::Alert alert) override { if(alert.type() == Botan::TLS::Alert::CLOSE_NOTIFY) { m_tls.close(); return; } else { std::cout << "Alert " << alert.type_string() << std::endl; } } boost::asio::io_service::strand m_strand; tcp::socket m_client_socket; Botan::AutoSeeded_RNG m_rng; // RNG per connection Botan::TLS::Server m_tls; std::string m_chello_summary; std::string m_session_summary; std::unique_ptr m_http_parser; std::vector m_c2s; std::vector m_s2c; std::vector m_s2c_pending; }; class TLS_Asio_HTTP_Server final { public: typedef TLS_Asio_HTTP_Session session; TLS_Asio_HTTP_Server( boost::asio::io_service& io, unsigned short port, Botan::Credentials_Manager& creds, Botan::TLS::Policy& policy, Botan::TLS::Session_Manager& session_mgr) : m_acceptor(io, tcp::endpoint(tcp::v4(), port)) , m_creds(creds) , m_policy(policy) , m_session_manager(session_mgr) { session::pointer new_session = make_session(); m_acceptor.async_accept( new_session->client_socket(), boost::bind( &TLS_Asio_HTTP_Server::handle_accept, this, new_session, boost::asio::placeholders::error)); } private: session::pointer make_session() { return session::create( m_acceptor.get_io_service(), m_session_manager, m_creds, m_policy); } void handle_accept(session::pointer new_session, const boost::system::error_code& error) { if(!error) { new_session->start(); new_session = make_session(); m_acceptor.async_accept( new_session->client_socket(), boost::bind( &TLS_Asio_HTTP_Server::handle_accept, this, new_session, boost::asio::placeholders::error)); } } tcp::acceptor m_acceptor; Botan::Credentials_Manager& m_creds; Botan::TLS::Policy& m_policy; Botan::TLS::Session_Manager& m_session_manager; }; } class TLS_HTTP_Server final : public Command { public: TLS_HTTP_Server() : Command("tls_http_server server_cert server_key " "--port=443 --policy= --threads=0 " "--session-db= --session-db-pass=") {} void go() override { const size_t listen_port = get_arg_sz("port"); const std::string server_crt = get_arg("server_cert"); const std::string server_key = get_arg("server_key"); const size_t num_threads = get_arg_sz("threads") || std::thread::hardware_concurrency() || 2; Basic_Credentials_Manager creds(rng(), server_crt, server_key); std::unique_ptr policy; const std::string policy_file = get_arg("policy"); if(policy_file.size() > 0) { std::ifstream policy_stream(policy_file); if(!policy_stream.good()) { error_output() << "Failed reading policy file\n"; return; } policy.reset(new Botan::TLS::Text_Policy(policy_stream)); } if(!policy) { policy.reset(new Botan::TLS::Policy); } std::unique_ptr session_mgr; const std::string sessions_db = get_arg("session-db"); if(!sessions_db.empty()) { #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) const std::string sessions_passphrase = get_arg("session-db-pass"); session_mgr.reset(new Botan::TLS::Session_Manager_SQLite(sessions_passphrase, rng(), sessions_db)); #else throw CLI_Error_Unsupported("Sqlite3 support not available"); #endif } if(!session_mgr) { session_mgr.reset(new Botan::TLS::Session_Manager_In_Memory(rng())); } boost::asio::io_service io; TLS_Asio_HTTP_Server server(io, listen_port, creds, *policy, *session_mgr); std::vector> threads; // run forever... first thread is main calling io.run below for(size_t i = 2; i <= num_threads; ++i) { threads.push_back(std::make_shared([&io]() { io.run(); })); } io.run(); for(size_t i = 0; i < threads.size(); ++i) { threads[i]->join(); } } }; BOTAN_REGISTER_COMMAND("tls_http_server", TLS_HTTP_Server); } #endif botan-2.4.0/src/cli/tls_proxy.cpp000066400000000000000000000332431322470703100167310ustar00rootroot00000000000000/* * TLS Server Proxy * (C) 2014,2015 Jack Lloyd * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_TLS) && defined(BOTAN_HAS_BOOST_ASIO) #include #include #include #include #define _GLIBCXX_HAVE_GTHR_DEFAULT #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) #include #endif #include "credentials.h" namespace Botan_CLI { namespace { using boost::asio::ip::tcp; inline void log_exception(const char* where, const std::exception& e) { std::cout << where << ' ' << e.what() << std::endl; } inline void log_error(const char* where, const boost::system::error_code& error) { std::cout << where << ' ' << error.message() << std::endl; } inline void log_binary_message(const char* where, const uint8_t buf[], size_t buf_len) { //std::cout << where << ' ' << Botan::hex_encode(buf, buf_len) << std::endl; } void log_text_message(const char* where, const uint8_t buf[], size_t buf_len) { //const char* c = reinterpret_cast(buf); //std::cout << where << ' ' << std::string(c, c + buf_len) << std::endl; } class tls_proxy_session final : public boost::enable_shared_from_this, public Botan::TLS::Callbacks { public: enum { readbuf_size = 4 * 1024 }; typedef boost::shared_ptr pointer; static pointer create( boost::asio::io_service& io, Botan::TLS::Session_Manager& session_manager, Botan::Credentials_Manager& credentials, Botan::TLS::Policy& policy, tcp::resolver::iterator endpoints) { return pointer( new tls_proxy_session( io, session_manager, credentials, policy, endpoints) ); } tcp::socket& client_socket() { return m_client_socket; } void start() { m_c2p.resize(readbuf_size); client_read(boost::system::error_code(), 0); // start read loop } void stop() { /* Don't need to talk to the server anymore Client socket is closed during write callback */ m_server_socket.close(); m_tls.close(); } private: tls_proxy_session( boost::asio::io_service& io, Botan::TLS::Session_Manager& session_manager, Botan::Credentials_Manager& credentials, Botan::TLS::Policy& policy, tcp::resolver::iterator endpoints) : m_strand(io) , m_server_endpoints(endpoints) , m_client_socket(io) , m_server_socket(io) , m_tls(*this, session_manager, credentials, policy, m_rng) {} void client_read(const boost::system::error_code& error, size_t bytes_transferred) { if(error) { log_error("Read failed", error); stop(); return; } try { if(!m_tls.is_active()) { log_binary_message("From client", &m_c2p[0], bytes_transferred); } m_tls.received_data(&m_c2p[0], bytes_transferred); } catch(Botan::Exception& e) { log_exception("TLS connection failed", e); stop(); return; } m_client_socket.async_read_some( boost::asio::buffer(&m_c2p[0], m_c2p.size()), m_strand.wrap( boost::bind( &tls_proxy_session::client_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred))); } void handle_client_write_completion(const boost::system::error_code& error) { if(error) { log_error("Client write", error); stop(); return; } m_p2c.clear(); if(m_p2c_pending.empty() && m_tls.is_closed()) { m_client_socket.close(); } tls_emit_data(nullptr, 0); // initiate another write if needed } void handle_server_write_completion(const boost::system::error_code& error) { if(error) { log_error("Server write", error); stop(); return; } m_p2s.clear(); proxy_write_to_server(nullptr, 0); // initiate another write if needed } void tls_record_received(uint64_t /*rec_no*/, const uint8_t buf[], size_t buf_len) override { // Immediately bounce message to server proxy_write_to_server(buf, buf_len); } void tls_emit_data(const uint8_t buf[], size_t buf_len) override { if(buf_len > 0) { m_p2c_pending.insert(m_p2c_pending.end(), buf, buf + buf_len); } // no write now active and we still have output pending if(m_p2c.empty() && !m_p2c_pending.empty()) { std::swap(m_p2c_pending, m_p2c); log_binary_message("To Client", &m_p2c[0], m_p2c.size()); boost::asio::async_write( m_client_socket, boost::asio::buffer(&m_p2c[0], m_p2c.size()), m_strand.wrap( boost::bind( &tls_proxy_session::handle_client_write_completion, shared_from_this(), boost::asio::placeholders::error))); } } void proxy_write_to_server(const uint8_t buf[], size_t buf_len) { if(buf_len > 0) { m_p2s_pending.insert(m_p2s_pending.end(), buf, buf + buf_len); } // no write now active and we still have output pending if(m_p2s.empty() && !m_p2s_pending.empty()) { std::swap(m_p2s_pending, m_p2s); log_text_message("To Server", &m_p2s[0], m_p2s.size()); boost::asio::async_write( m_server_socket, boost::asio::buffer(&m_p2s[0], m_p2s.size()), m_strand.wrap( boost::bind( &tls_proxy_session::handle_server_write_completion, shared_from_this(), boost::asio::placeholders::error))); } } void server_read(const boost::system::error_code& error, size_t bytes_transferred) { if(error) { log_error("Server read failed", error); stop(); return; } try { if(bytes_transferred) { log_text_message("Server to client", &m_s2p[0], m_s2p.size()); log_binary_message("Server to client", &m_s2p[0], m_s2p.size()); m_tls.send(&m_s2p[0], bytes_transferred); } } catch(Botan::Exception& e) { log_exception("TLS connection failed", e); stop(); return; } m_s2p.resize(readbuf_size); m_server_socket.async_read_some( boost::asio::buffer(&m_s2p[0], m_s2p.size()), m_strand.wrap( boost::bind(&tls_proxy_session::server_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred))); } bool tls_session_established(const Botan::TLS::Session& session) override { //std::cout << "Handshake from client complete" << std::endl; m_hostname = session.server_info().hostname(); if(m_hostname != "") { std::cout << "Client requested hostname '" << m_hostname << "'" << std::endl; } auto onConnect = [this](boost::system::error_code ec, tcp::resolver::iterator endpoint) { if(ec) { log_error("Server connection", ec); return; } server_read(boost::system::error_code(), 0); // start read loop proxy_write_to_server(nullptr, 0); }; async_connect(m_server_socket, m_server_endpoints, onConnect); return true; } void tls_alert(Botan::TLS::Alert alert) override { if(alert.type() == Botan::TLS::Alert::CLOSE_NOTIFY) { m_tls.close(); return; } else { std::cout << "Alert " << alert.type_string() << std::endl; } } boost::asio::io_service::strand m_strand; tcp::resolver::iterator m_server_endpoints; tcp::socket m_client_socket; tcp::socket m_server_socket; Botan::AutoSeeded_RNG m_rng; // RNG per connection Botan::TLS::Server m_tls; std::string m_hostname; std::vector m_c2p; std::vector m_p2c; std::vector m_p2c_pending; std::vector m_s2p; std::vector m_p2s; std::vector m_p2s_pending; }; class tls_proxy_server final { public: typedef tls_proxy_session session; tls_proxy_server( boost::asio::io_service& io, unsigned short port, tcp::resolver::iterator endpoints, Botan::Credentials_Manager& creds, Botan::TLS::Policy& policy, Botan::TLS::Session_Manager& session_mgr) : m_acceptor(io, tcp::endpoint(tcp::v4(), port)) , m_server_endpoints(endpoints) , m_creds(creds) , m_policy(policy) , m_session_manager(session_mgr) { session::pointer new_session = make_session(); m_acceptor.async_accept( new_session->client_socket(), boost::bind( &tls_proxy_server::handle_accept, this, new_session, boost::asio::placeholders::error)); } private: session::pointer make_session() { return session::create( m_acceptor.get_io_service(), m_session_manager, m_creds, m_policy, m_server_endpoints); } void handle_accept(session::pointer new_session, const boost::system::error_code& error) { if(!error) { new_session->start(); new_session = make_session(); m_acceptor.async_accept( new_session->client_socket(), boost::bind( &tls_proxy_server::handle_accept, this, new_session, boost::asio::placeholders::error)); } } tcp::acceptor m_acceptor; tcp::resolver::iterator m_server_endpoints; Botan::Credentials_Manager& m_creds; Botan::TLS::Policy& m_policy; Botan::TLS::Session_Manager& m_session_manager; }; } class TLS_Proxy final : public Command { public: TLS_Proxy() : Command("tls_proxy listen_port target_host target_port server_cert server_key " "--threads=0 --session-db= --session-db-pass=") {} void go() override { const size_t listen_port = get_arg_sz("listen_port"); const std::string target = get_arg("target_host"); const std::string target_port = get_arg("target_port"); const std::string server_crt = get_arg("server_cert"); const std::string server_key = get_arg("server_key"); const size_t num_threads = get_arg_sz("threads") || std::thread::hardware_concurrency() || 2; Basic_Credentials_Manager creds(rng(), server_crt, server_key); Botan::TLS::Policy policy; // TODO: Read policy from text file boost::asio::io_service io; tcp::resolver resolver(io); auto server_endpoint_iterator = resolver.resolve({ target, target_port }); std::unique_ptr session_mgr; #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) const std::string sessions_passphrase = get_arg("session-db-pass"); const std::string sessions_db = get_arg("session-db"); if(!sessions_db.empty()) { session_mgr.reset(new Botan::TLS::Session_Manager_SQLite(sessions_passphrase, rng(), sessions_db)); } #endif if(!session_mgr) { session_mgr.reset(new Botan::TLS::Session_Manager_In_Memory(rng())); } tls_proxy_server server(io, listen_port, server_endpoint_iterator, creds, policy, *session_mgr); std::vector> threads; // run forever... first thread is main calling io.run below for(size_t i = 2; i <= num_threads; ++i) { threads.push_back(std::make_shared([&io]() { io.run(); })); } io.run(); for(size_t i = 0; i < threads.size(); ++i) { threads[i]->join(); } } }; BOTAN_REGISTER_COMMAND("tls_proxy", TLS_Proxy); } #endif botan-2.4.0/src/cli/tls_server.cpp000066400000000000000000000222641322470703100170570ustar00rootroot00000000000000/* * TLS echo server using BSD sockets * (C) 2014 Jack Lloyd * 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_TLS) && defined(BOTAN_TARGET_OS_HAS_SOCKETS) #include #include #include #include #include #include #include "credentials.h" #include "socket_utils.h" namespace Botan_CLI { class TLS_Server final : public Command, public Botan::TLS::Callbacks { public: TLS_Server() : Command("tls_server cert key --port=443 --type=tcp --policy= --dump-traces=") { init_sockets(); } ~TLS_Server() { stop_sockets(); } void go() override { const std::string server_crt = get_arg("cert"); const std::string server_key = get_arg("key"); const int port = get_arg_sz("port"); const std::string transport = get_arg("type"); const std::string dump_traces_to = get_arg("dump-traces"); if(transport != "tcp" && transport != "udp") { throw CLI_Usage_Error("Invalid transport type '" + transport + "' for TLS"); } m_is_tcp = (transport == "tcp"); std::unique_ptr policy; const std::string policy_file = get_arg("policy"); if(policy_file.size() > 0) { std::ifstream policy_stream(policy_file); if(!policy_stream.good()) { error_output() << "Failed reading policy file\n"; return; } policy.reset(new Botan::TLS::Text_Policy(policy_stream)); } if(!policy) { policy.reset(new Botan::TLS::Policy); } Botan::TLS::Session_Manager_In_Memory session_manager(rng()); // TODO sqlite3 Basic_Credentials_Manager creds(rng(), server_crt, server_key); output() << "Listening for new connections on " << transport << " port " << port << std::endl; int server_fd = make_server_socket(port); while(true) { if(m_is_tcp) { m_socket = ::accept(server_fd, nullptr, nullptr); } else { struct sockaddr_in from; socklen_t from_len = sizeof(sockaddr_in); if(::recvfrom(server_fd, nullptr, 0, MSG_PEEK, reinterpret_cast(&from), &from_len) != 0) { throw CLI_Error("Could not peek next packet"); } if(::connect(server_fd, reinterpret_cast(&from), from_len) != 0) { throw CLI_Error("Could not connect UDP socket"); } m_socket = server_fd; } Botan::TLS::Server server( *this, session_manager, creds, *policy, rng(), m_is_tcp == false); std::unique_ptr dump_stream; if(!dump_traces_to.empty()) { uint64_t timestamp = Botan::OS::get_high_resolution_clock(); const std::string dump_file = dump_traces_to + "/tls_" + std::to_string(timestamp) + ".bin"; dump_stream.reset(new std::ofstream(dump_file.c_str())); } try { while(!server.is_closed()) { try { uint8_t buf[4 * 1024] = { 0 }; ssize_t got = ::read(m_socket, buf, sizeof(buf)); if(got == -1) { error_output() << "Error in socket read - " << std::strerror(errno) << std::endl; break; } if(got == 0) { error_output() << "EOF on socket" << std::endl; break; } if(dump_stream) { dump_stream->write(reinterpret_cast(buf), got); } server.received_data(buf, got); while(server.is_active() && !m_pending_output.empty()) { std::string output = m_pending_output.front(); m_pending_output.pop_front(); server.send(output); if(output == "quit\n") { server.close(); } } } catch(std::exception& e) { error_output() << "Connection problem: " << e.what() << std::endl; if(m_is_tcp) { ::close(m_socket); m_socket = -1; } } } } catch(Botan::Exception& e) { error_output() << "Connection failed: " << e.what() << "\n"; } if(m_is_tcp) { ::close(m_socket); m_socket = -1; } } } private: int make_server_socket(uint16_t port) { const int type = m_is_tcp ? SOCK_STREAM : SOCK_DGRAM; int fd = ::socket(PF_INET, type, 0); if(fd == -1) { throw CLI_Error("Unable to acquire socket"); } sockaddr_in socket_info; ::memset(&socket_info, 0, sizeof(socket_info)); socket_info.sin_family = AF_INET; socket_info.sin_port = htons(port); // FIXME: support limiting listeners socket_info.sin_addr.s_addr = INADDR_ANY; if(::bind(fd, reinterpret_cast(&socket_info), sizeof(struct sockaddr)) != 0) { ::close(fd); throw CLI_Error("server bind failed"); } if(m_is_tcp) { if(::listen(fd, 100) != 0) { ::close(fd); throw CLI_Error("listen failed"); } } return fd; } bool tls_session_established(const Botan::TLS::Session& session) override { output() << "Handshake complete, " << session.version().to_string() << " using " << session.ciphersuite().to_string() << std::endl; if(!session.session_id().empty()) { output() << "Session ID " << Botan::hex_encode(session.session_id()) << std::endl; } if(!session.session_ticket().empty()) { output() << "Session ticket " << Botan::hex_encode(session.session_ticket()) << std::endl; } return true; } void tls_record_received(uint64_t, const uint8_t input[], size_t input_len) override { for(size_t i = 0; i != input_len; ++i) { const char c = static_cast(input[i]); m_line_buf += c; if(c == '\n') { m_pending_output.push_back(m_line_buf); m_line_buf.clear(); } } }; void tls_emit_data(const uint8_t buf[], size_t length) override { if(m_is_tcp) { ssize_t sent = ::send(m_socket, buf, length, MSG_NOSIGNAL); if(sent == -1) { error_output() << "Error writing to socket - " << std::strerror(errno) << std::endl; } else if(sent != static_cast(length)) { error_output() << "Packet of length " << length << " truncated to " << sent << std::endl; } } else { while(length) { ssize_t sent = ::send(m_socket, buf, length, MSG_NOSIGNAL); if(sent == -1) { if(errno == EINTR) { sent = 0; } else { throw CLI_Error("Socket write failed"); } } buf += sent; length -= sent; } } } void tls_alert(Botan::TLS::Alert alert) override { output() << "Alert: " << alert.type_string() << std::endl; } std::string tls_server_choose_app_protocol(const std::vector&) override { // we ignore whatever the client sends here return "echo/0.1"; } int m_socket = -1; bool m_is_tcp = false; std::string m_line_buf; std::list m_pending_output; }; BOTAN_REGISTER_COMMAND("tls_server", TLS_Server); } #endif botan-2.4.0/src/cli/tls_utils.cpp000066400000000000000000000161211322470703100167040ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_TLS) #include #include #include #include #include namespace Botan_CLI { class TLS_All_Policy final : public Botan::TLS::Policy { public: std::vector allowed_ciphers() const override { return std::vector { "ChaCha20Poly1305", "AES-256/OCB(12)", "AES-128/OCB(12)", "AES-256/GCM", "AES-128/GCM", "AES-256/CCM", "AES-128/CCM", "AES-256/CCM(8)", "AES-128/CCM(8)", "Camellia-256/GCM", "Camellia-128/GCM", "AES-256", "AES-128", "Camellia-256", "Camellia-128", "SEED" "3DES" }; } std::vector allowed_key_exchange_methods() const override { return { "SRP_SHA", "ECDHE_PSK", "DHE_PSK", "PSK", "CECPQ1", "ECDH", "DH", "RSA" }; } std::vector allowed_signature_methods() const override { return { "ECDSA", "RSA", "DSA" }; } }; class TLS_Ciphersuites final : public Command { public: TLS_Ciphersuites() : Command("tls_ciphers --policy=default --version=tls1.2") {} static Botan::TLS::Protocol_Version::Version_Code tls_version_from_str(const std::string& str) { if(str == "tls1.2" || str == "TLS1.2" || str == "TLS-1.2") { return Botan::TLS::Protocol_Version::TLS_V12; } else if(str == "tls1.1" || str == "TLS1.1" || str == "TLS-1.1") { return Botan::TLS::Protocol_Version::TLS_V11; } else if(str == "tls1.0" || str == "TLS1.1" || str == "TLS-1.1") { return Botan::TLS::Protocol_Version::TLS_V10; } if(str == "dtls1.2" || str == "DTLS1.2" || str == "DTLS-1.2") { return Botan::TLS::Protocol_Version::DTLS_V12; } else if(str == "dtls1.0" || str == "DTLS1.0" || str == "DTLS-1.0") { return Botan::TLS::Protocol_Version::DTLS_V10; } else { throw CLI_Error("Unknown TLS version '" + str + "'"); } } void go() override { const std::string policy_type = get_arg("policy"); const Botan::TLS::Protocol_Version version(tls_version_from_str(get_arg("version"))); const bool with_srp = false; // fixme std::unique_ptr policy; if(policy_type == "default") { policy.reset(new Botan::TLS::Policy); } else if(policy_type == "suiteb") { policy.reset(new Botan::TLS::NSA_Suite_B_128); } else if(policy_type == "strict") { policy.reset(new Botan::TLS::Strict_Policy); } else if(policy_type == "all") { policy.reset(new TLS_All_Policy); } else { const std::string policy_txt = slurp_file_as_str(policy_type); policy.reset(new Botan::TLS::Text_Policy(policy_txt)); } for(uint16_t suite_id : policy->ciphersuite_list(version, with_srp)) { const Botan::TLS::Ciphersuite suite(Botan::TLS::Ciphersuite::by_id(suite_id)); output() << suite.to_string() << "\n"; } } }; BOTAN_REGISTER_COMMAND("tls_ciphers", TLS_Ciphersuites); class TLS_Client_Hello_Reader final : public Command { public: TLS_Client_Hello_Reader() : Command("tls_client_hello --hex input") {} void go() override { const std::string input_file = get_arg("input"); std::vector input; if(flag_set("hex")) { input = Botan::hex_decode(slurp_file_as_str(input_file)); } else { input = slurp_file(input_file); } if(input.size() < 45) { error_output() << "Input too short to be valid\n"; return; } // Input also contains the record layer header, strip it if(input[0] == 22) { const size_t len = Botan::make_uint16(input[3], input[4]); if(input.size() != len + 5) { error_output() << "Record layer length invalid\n"; return; } input = std::vector(input.begin() + 5, input.end()); } // Assume the handshake header is there, strip it if(input[0] != 1) { error_output() << "Input message is not a TLS client hello\n"; return; } const size_t hs_len = Botan::make_uint32(0, input[1], input[2], input[3]); if(input.size() != hs_len + 4) { error_output() << "Handshake layer length invalid\n"; return; } input = std::vector(input.begin() + 4, input.end()); try { Botan::TLS::Client_Hello hello(input); output() << format_hello(hello); } catch(std::exception& e) { error_output() << "Parsing client hello failed: " << e.what() << "\n"; } } private: std::string format_hello(const Botan::TLS::Client_Hello& hello) { std::ostringstream oss; oss << "Version: " << hello.version().to_string() << "\n" << "Random: " << Botan::hex_encode(hello.random()) << "\n"; if(!hello.session_id().empty()) oss << "SessionID: " << Botan::hex_encode(hello.session_id()) << "\n"; for(uint16_t csuite_id : hello.ciphersuites()) oss << "Cipher: " << Botan::TLS::Ciphersuite::by_id(csuite_id).to_string() << "\n"; oss << "Supported signature schemes: "; if(hello.supported_algos().empty()) { oss << "Did not send signature_algorithms extension\n"; } else { for(auto&& hash_and_sig : hello.supported_algos()) oss << hash_and_sig.second << '+' << hash_and_sig.first << ' '; oss << "\n"; } std::map hello_flags; hello_flags["ALPN"] = hello.supports_alpn(); hello_flags["Encrypt Then Mac"] = hello.supports_encrypt_then_mac(); hello_flags["Extended Master Secret"] = hello.supports_extended_master_secret(); hello_flags["Session Ticket"] = hello.supports_session_ticket(); for(auto&& i : hello_flags) oss << "Supports " << i.first << "? " << (i.second ? "yes" : "no") << "\n"; return oss.str(); } }; BOTAN_REGISTER_COMMAND("tls_client_hello", TLS_Client_Hello_Reader); } #endif botan-2.4.0/src/cli/utils.cpp000066400000000000000000000251751322470703100160330ustar00rootroot00000000000000/* * (C) 2009,2010,2014,2015 Jack Lloyd * (C) 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_BASE64_CODEC) #include #endif #if defined(BOTAN_HAS_HTTP_UTIL) #include #endif #if defined(BOTAN_HAS_BCRYPT) #include #endif namespace Botan_CLI { class Print_Help final : public Command { public: Print_Help() : Command("help") {} std::string help_text() const override { std::ostringstream oss; oss << "Usage: botan \n\n"; oss << "All commands support --verbose --help --output= --error-output= --rng-type= --drbg-seed=\n\n"; oss << "Available commands:\n"; for(const auto& cmd_name : Command::registered_cmds()) { std::unique_ptr cmd = Command::get_cmd(cmd_name); oss << " " << cmd->cmd_spec() << "\n"; } return oss.str(); } void go() override { this->set_return_code(1); output() << help_text(); } }; BOTAN_REGISTER_COMMAND("help", Print_Help); class Config_Info final : public Command { public: Config_Info() : Command("config info_type") {} std::string help_text() const override { return "Usage: config info_type\n" " prefix: Print install prefix\n" " cflags: Print include params\n" " ldflags: Print linker params\n" " libs: Print libraries\n"; } void go() override { const std::string arg = get_arg("info_type"); if(arg == "prefix") { output() << BOTAN_INSTALL_PREFIX << "\n"; } else if(arg == "cflags") { output() << "-I" << BOTAN_INSTALL_PREFIX << "/" << BOTAN_INSTALL_HEADER_DIR << "\n"; } else if(arg == "ldflags") { if(*BOTAN_LINK_FLAGS) output() << BOTAN_LINK_FLAGS << ' '; output() << "-L" << BOTAN_INSTALL_PREFIX << "/" << BOTAN_INSTALL_LIB_DIR << "\n"; } else if(arg == "libs") { output() << "-lbotan-" << Botan::version_major() << " " << BOTAN_LIB_LINK << "\n"; } else { throw CLI_Usage_Error("Unknown option to botan config " + arg); } } }; BOTAN_REGISTER_COMMAND("config", Config_Info); class Version_Info final : public Command { public: Version_Info() : Command("version --full") {} void go() override { if(flag_set("full")) { output() << Botan::version_string() << "\n"; } else { output() << Botan::short_version_string() << "\n"; } } }; BOTAN_REGISTER_COMMAND("version", Version_Info); class Print_Cpuid final : public Command { public: Print_Cpuid() : Command("cpuid") {} void go() override { output() << "CPUID flags: " << Botan::CPUID::to_string() << "\n"; } }; BOTAN_REGISTER_COMMAND("cpuid", Print_Cpuid); class Hash final : public Command { public: Hash() : Command("hash --algo=SHA-256 --buf-size=4096 *files") {} void go() override { const std::string hash_algo = get_arg("algo"); std::unique_ptr hash_fn(Botan::HashFunction::create(hash_algo)); if(!hash_fn) { throw CLI_Error_Unsupported("hashing", hash_algo); } const size_t buf_size = get_arg_sz("buf-size"); std::vector files = get_arg_list("files"); if(files.empty()) { files.push_back("-"); } // read stdin if no arguments on command line for(const std::string& fsname : files) { try { auto update_hash = [&](const uint8_t b[], size_t l) { hash_fn->update(b, l); }; read_file(fsname, update_hash, buf_size); output() << Botan::hex_encode(hash_fn->final()) << " " << fsname << "\n"; } catch(CLI_IO_Error& e) { error_output() << e.what() << "\n"; } } } }; BOTAN_REGISTER_COMMAND("hash", Hash); class RNG final : public Command { public: RNG() : Command("rng --system --rdrand --auto --entropy --drbg --drbg-seed= *bytes") {} void go() override { std::string type = get_arg("rng-type"); if(type.empty()) { for(std::string flag : { "system", "rdrand", "auto", "entropy", "drbg" }) { if(flag_set(flag)) { type = flag; break; } } } const std::string drbg_seed = get_arg("drbg-seed"); std::unique_ptr rng = cli_make_rng(type, drbg_seed); for(const std::string& req : get_arg_list("bytes")) { output() << Botan::hex_encode(rng->random_vec(Botan::to_u32bit(req))) << "\n"; } } }; BOTAN_REGISTER_COMMAND("rng", RNG); #if defined(BOTAN_HAS_HTTP_UTIL) class HTTP_Get final : public Command { public: HTTP_Get() : Command("http_get --redirects=1 --timeout=3000 url") {} void go() override { const std::string url = get_arg("url"); const std::chrono::milliseconds timeout(get_arg_sz("timeout")); const size_t redirects = get_arg_sz("redirects"); output() << Botan::HTTP::GET_sync(url, redirects, timeout) << "\n"; } }; BOTAN_REGISTER_COMMAND("http_get", HTTP_Get); #endif // http_util #if defined(BOTAN_HAS_HEX_CODEC) class Hex_Encode final : public Command { public: Hex_Encode() : Command("hex_enc file") {} void go() override { auto hex_enc_f = [&](const uint8_t b[], size_t l) { output() << Botan::hex_encode(b, l); }; this->read_file(get_arg("file"), hex_enc_f, 2); } }; BOTAN_REGISTER_COMMAND("hex_enc", Hex_Encode); class Hex_Decode final : public Command { public: Hex_Decode() : Command("hex_dec file") {} void go() override { auto hex_dec_f = [&](const uint8_t b[], size_t l) { std::vector bin = Botan::hex_decode(reinterpret_cast(b), l); output().write(reinterpret_cast(bin.data()), bin.size()); }; this->read_file(get_arg("file"), hex_dec_f, 2); } }; BOTAN_REGISTER_COMMAND("hex_dec", Hex_Decode); #endif #if defined(BOTAN_HAS_BASE64_CODEC) class Base64_Encode final : public Command { public: Base64_Encode() : Command("base64_enc file") {} void go() override { auto onData = [&](const uint8_t b[], size_t l) { output() << Botan::base64_encode(b, l); }; this->read_file(get_arg("file"), onData, 768); } }; BOTAN_REGISTER_COMMAND("base64_enc", Base64_Encode); class Base64_Decode final : public Command { public: Base64_Decode() : Command("base64_dec file") {} void go() override { auto write_bin = [&](const uint8_t b[], size_t l) { Botan::secure_vector bin = Botan::base64_decode(reinterpret_cast(b), l); output().write(reinterpret_cast(bin.data()), bin.size()); }; this->read_file(get_arg("file"), write_bin, 1024); } }; BOTAN_REGISTER_COMMAND("base64_dec", Base64_Decode); #endif // base64 #if defined(BOTAN_HAS_BCRYPT) class Generate_Bcrypt final : public Command { public: Generate_Bcrypt() : Command("gen_bcrypt --work-factor=12 password") {} void go() override { const std::string password = get_arg("password"); const size_t wf = get_arg_sz("work-factor"); if(wf < 4 || wf > 18) { error_output() << "Invalid bcrypt work factor\n"; } else { const uint16_t wf16 = static_cast(wf); output() << Botan::generate_bcrypt(password, rng(), wf16) << "\n"; } } }; BOTAN_REGISTER_COMMAND("gen_bcrypt", Generate_Bcrypt); class Check_Bcrypt final : public Command { public: Check_Bcrypt() : Command("check_bcrypt password hash") {} void go() override { const std::string password = get_arg("password"); const std::string hash = get_arg("hash"); if(hash.length() != 60) { error_output() << "Note: bcrypt '" << hash << "' has wrong length and cannot be valid\n"; } const bool ok = Botan::check_bcrypt(password, hash); output() << "Password is " << (ok ? "valid" : "NOT valid") << std::endl; } }; BOTAN_REGISTER_COMMAND("check_bcrypt", Check_Bcrypt); #endif // bcrypt #if defined(BOTAN_HAS_HMAC) class HMAC final : public Command { public: HMAC() : Command("hmac --hash=SHA-256 --buf-size=4096 key *files") {} void go() override { const std::string hash_algo = get_arg("hash"); std::unique_ptr hmac = Botan::MessageAuthenticationCode::create("HMAC(" + hash_algo + ")"); if(!hmac) { throw CLI_Error_Unsupported("HMAC", hash_algo); } hmac->set_key(slurp_file(get_arg("key"))); const size_t buf_size = get_arg_sz("buf-size"); std::vector files = get_arg_list("files"); if(files.empty()) { files.push_back("-"); } // read stdin if no arguments on command line for(const std::string& fsname : files) { try { auto update_hmac = [&](const uint8_t b[], size_t l) { hmac->update(b, l); }; read_file(fsname, update_hmac, buf_size); output() << Botan::hex_encode(hmac->final()) << " " << fsname << "\n"; } catch(CLI_IO_Error& e) { error_output() << e.what() << "\n"; } } } }; BOTAN_REGISTER_COMMAND("hmac", HMAC); #endif // hmac } botan-2.4.0/src/cli/x509.cpp000066400000000000000000000165071322470703100153770ustar00rootroot00000000000000/* * (C) 2010,2014,2015 Jack Lloyd * (C) 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "cli.h" #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_OCSP) #include #endif namespace Botan_CLI { class Sign_Cert final : public Command { public: Sign_Cert() : Command("sign_cert --ca-key-pass= --hash=SHA-256 " "--duration=365 --emsa= ca_cert ca_key pkcs10_req") {} void go() override { Botan::X509_Certificate ca_cert(get_arg("ca_cert")); std::unique_ptr key; const std::string pass = get_arg("ca-key-pass"); if(!pass.empty()) { key.reset(Botan::PKCS8::load_key(get_arg("ca_key"), rng(), pass)); } else { key.reset(Botan::PKCS8::load_key(get_arg("ca_key"), rng())); } if(!key) { throw CLI_Error("Failed to load key from " + get_arg("ca_key")); } Botan::X509_CA ca(ca_cert, *key, {{"padding",get_arg_or("emsa", "EMSA4")}}, get_arg("hash"), rng()); Botan::PKCS10_Request req(get_arg("pkcs10_req")); auto now = std::chrono::system_clock::now(); Botan::X509_Time start_time(now); typedef std::chrono::duration> days; Botan::X509_Time end_time(now + days(get_arg_sz("duration"))); Botan::X509_Certificate new_cert = ca.sign_request(req, rng(), start_time, end_time); output() << new_cert.PEM_encode(); } }; BOTAN_REGISTER_COMMAND("sign_cert", Sign_Cert); class Cert_Info final : public Command { public: Cert_Info() : Command("cert_info --fingerprint --ber file") {} void go() override { Botan::DataSource_Stream in(get_arg("file"), flag_set("ber")); while(!in.end_of_data()) { try { Botan::X509_Certificate cert(in); try { output() << cert.to_string() << std::endl; } catch(Botan::Exception& e) { // to_string failed - report the exception and continue output() << "X509_Certificate::to_string failed: " << e.what() << "\n"; } if(flag_set("fingerprint")) output() << "Fingerprint: " << cert.fingerprint("SHA-256") << std::endl; } catch(Botan::Exception& e) { if(!in.end_of_data()) { output() << "X509_Certificate parsing failed " << e.what() << "\n"; } } } } }; BOTAN_REGISTER_COMMAND("cert_info", Cert_Info); #if defined(BOTAN_HAS_OCSP) && defined(BOTAN_HAS_HTTP_UTIL) class OCSP_Check final : public Command { public: OCSP_Check() : Command("ocsp_check --timeout=3000 subject issuer") {} void go() override { Botan::X509_Certificate subject(get_arg("subject")); Botan::X509_Certificate issuer(get_arg("issuer")); std::chrono::milliseconds timeout(get_arg_sz("timeout")); Botan::Certificate_Store_In_Memory cas; cas.add_certificate(issuer); Botan::OCSP::Response resp = Botan::OCSP::online_check(issuer, subject, &cas, timeout); auto status = resp.status_for(issuer, subject, std::chrono::system_clock::now()); if(status == Botan::Certificate_Status_Code::OCSP_RESPONSE_GOOD) { output() << "OCSP check OK\n"; } else { output() << "OCSP check failed " << Botan::Path_Validation_Result::status_string(status) << "\n"; } } }; BOTAN_REGISTER_COMMAND("ocsp_check", OCSP_Check); #endif // OCSP && HTTP class Cert_Verify final : public Command { public: Cert_Verify() : Command("cert_verify subject *ca_certs") {} void go() override { Botan::X509_Certificate subject_cert(get_arg("subject")); Botan::Certificate_Store_In_Memory trusted; for(auto const& certfile : get_arg_list("ca_certs")) { trusted.add_certificate(Botan::X509_Certificate(certfile)); } Botan::Path_Validation_Restrictions restrictions; Botan::Path_Validation_Result result = Botan::x509_path_validate(subject_cert, restrictions, trusted); if(result.successful_validation()) { output() << "Certificate passes validation checks\n"; } else { output() << "Certificate did not validate - " << result.result_string() << "\n"; } } }; BOTAN_REGISTER_COMMAND("cert_verify", Cert_Verify); class Gen_Self_Signed final : public Command { public: Gen_Self_Signed() : Command("gen_self_signed key CN --country= --dns= " "--organization= --email= --key-pass= --ca --hash=SHA-256 --emsa=") {} void go() override { std::unique_ptr key(Botan::PKCS8::load_key(get_arg("key"), rng(), get_arg("key-pass"))); if(!key) { throw CLI_Error("Failed to load key from " + get_arg("key")); } Botan::X509_Cert_Options opts; opts.common_name = get_arg("CN"); opts.country = get_arg("country"); opts.organization = get_arg("organization"); opts.email = get_arg("email"); opts.dns = get_arg("dns"); opts.set_padding_scheme(get_arg_or("emsa", "EMSA4")); if(flag_set("ca")) { opts.CA_key(); } Botan::X509_Certificate cert = Botan::X509::create_self_signed_cert(opts, *key, get_arg("hash"), rng()); output() << cert.PEM_encode(); } }; BOTAN_REGISTER_COMMAND("gen_self_signed", Gen_Self_Signed); class Generate_PKCS10 final : public Command { public: Generate_PKCS10() : Command("gen_pkcs10 key CN --country= --organization= " "--email= --key-pass= --hash=SHA-256 --emsa=") {} void go() override { std::unique_ptr key(Botan::PKCS8::load_key(get_arg("key"), rng(), get_arg("key-pass"))); if(!key) { throw CLI_Error("Failed to load key from " + get_arg("key")); } Botan::X509_Cert_Options opts; opts.common_name = get_arg("CN"); opts.country = get_arg("country"); opts.organization = get_arg("organization"); opts.email = get_arg("email"); opts.set_padding_scheme(get_arg_or("emsa", "EMSA4")); Botan::PKCS10_Request req = Botan::X509::create_cert_req(opts, *key, get_arg("hash"), rng()); output() << req.PEM_encode(); } }; BOTAN_REGISTER_COMMAND("gen_pkcs10", Generate_PKCS10); } #endif botan-2.4.0/src/configs/000077500000000000000000000000001322470703100150365ustar00rootroot00000000000000botan-2.4.0/src/configs/astyle.rc000066400000000000000000000004701322470703100166660ustar00rootroot00000000000000--style=whitesmith --indent=spaces=3 --attach-namespaces --break-one-line-headers --convert-tabs --max-code-length=120 --indent-preproc-block #--pad-oper --pad-comma --unpad-paren --align-pointer=type --align-reference=type -j # --add-braces / --add-brackets -J # --add-one-line-braces / --add-one-line-brackets botan-2.4.0/src/configs/coverage.rc000066400000000000000000000005311322470703100171560ustar00rootroot00000000000000# .coveragerc to control coverage.py [run] branch = True [report] # Regexes for lines to exclude from consideration exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain if non-runnable code isn't run: if 0: def main if __name__ == .__main__.: # Exclude tests def test botan-2.4.0/src/configs/eclipse.xml000066400000000000000000000423361322470703100172140ustar00rootroot00000000000000 botan-2.4.0/src/configs/indent.el000066400000000000000000000026451322470703100166500ustar00rootroot00000000000000; This Emacs Lips code defines the indentation style used in Botan. If doesn't ; get everything perfectly correct, but it's pretty close. Copy this code into ; your .emacs file, or use M-x eval-buffer. Make sure to also set ; indent-tabs-mode to nil so spaces are inserted instead. ; ; This style is basically Whitesmiths style with 3 space indents (the Emacs ; "whitesmith" style seems more like a weird Whitesmiths/Allman mutant style). ; ; To activate using this style, open the file you want to edit and run this: ; M-x c-set-style and then enter "botan". (setq botan-style '( (c-basic-offset . 3) (c-comment-only-line-offset . 0) (c-offsets-alist (c . 0) (comment-intro . 0) (statement-block-intro . 0) (statement-cont . +) (substatement . +) (substatement-open . +) (block-open . +) (block-close . 0) (defun-open . +) (defun-close . 0) (defun-block-intro . 0) (func-decl-cont . +) (class-open . +) (class-close . +) (inclass . +) (access-label . -) (inline-open . +) (inline-close . 0) (extern-lang-open . 0) (extern-lang-close . 0) (inextern-lang . 0) (statement-case-open +) (namespace-open . 0) (namespace-close . 0) (innamespace . 0) (label . 0) ) )) (add-hook 'c++-mode-common-hook (function (lambda () (c-add-style "botan" botan-style nil)))) botan-2.4.0/src/configs/pylint.rc000066400000000000000000000265061322470703100167140ustar00rootroot00000000000000[MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Pickle collected data for later comparisons. persistent=yes # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Use multiple processes to speed up Pylint. jobs=1 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist= # Allow optimization of some AST trees. This will activate a peephole AST # optimizer, which will apply various small optimizations. For instance, it can # be used to obtain the result of joining multiple strings with the addition # operator. Joining a lot of strings can lead to a maximum recursion error in # Pylint and this flag can prevent that. It has one side effect, the resulting # AST will be different than the one from reality. optimize-ast=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time. See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=missing-docstring,no-else-return,logging-not-lazy [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". files-output=no # Tells whether to display a full report or only the messages reports=no # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [BASIC] # List of builtins function names that should not be used, separated by a comma bad-functions=map,filter # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # Regular expression matching correct argument names argument-rgx=[a-z_][a-z0-9_]{0,30}$ # Naming hint for argument names argument-name-hint=[a-z_][a-z0-9_]{0,30}$ # Regular expression matching correct function names function-rgx=[a-z_][a-z0-9_]{2,45}$ # Naming hint for function names function-name-hint=[a-z_][a-z0-9_]{2,45}$ # Regular expression matching correct variable names variable-rgx=[a-z_][a-z0-9_]{0,45}$ # Naming hint for variable names variable-name-hint=[a-z_][a-z0-9_]{0,45}$ # Regular expression matching correct attribute names attr-rgx=[a-z_][a-z0-9_]{1,30}$ # Naming hint for attribute names attr-name-hint=[a-z_][a-z0-9_]{1,30}$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression matching correct method names method-rgx=[a-z_][a-z0-9_]{2,45}$ # Naming hint for method names method-name-hint=[a-z_][a-z0-9_]{2,45}$ # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 [ELIF] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [TYPECHECK] # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # List of classes names for which member attributes should not be checked # (useful for classes with attributes dynamically set). This supports can work # with qualified names. ignored-classes=LexResult # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=_$|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb [FORMAT] # Maximum number of characters on a single line. max-line-length=120 # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Maximum number of lines in a module max-module-lines=3500 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=optparse # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make [DESIGN] # Maximum number of arguments for function / method max-args=8 # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.* # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branches=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=15 # Minimum number of public methods for a class (see R0903). min-public-methods=0 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of boolean expressions in a if statement max-bool-expr=5 [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exception botan-2.4.0/src/configs/sphinx/000077500000000000000000000000001322470703100163475ustar00rootroot00000000000000botan-2.4.0/src/configs/sphinx/conf.py000066400000000000000000000143061322470703100176520ustar00rootroot00000000000000# Sphinx configuration file import sys import re #import sphinx def check_for_tag(tag): # Nasty hack :( try: opt_t = sys.argv.index('-t') opt_tag = sys.argv.index(tag) return opt_t + 1 == opt_tag except ValueError: return False def parse_version_file(version_path): version_file = open(version_path) key_and_val = re.compile(r"([a-z_]+) = ([a-zA-Z0-9:\-\']+)") results = {} for line in version_file.readlines(): if not line or line[0] == '#': continue match = key_and_val.match(line) if match: key = match.group(1) val = match.group(2) if val == 'None': val = None elif val.startswith("'") and val.endswith("'"): val = val[1:len(val)-1] else: val = int(val) results[key] = val return results version_info = parse_version_file('../../../version.txt') version_major = version_info['release_major'] version_minor = version_info['release_minor'] version_patch = version_info['release_patch'] is_website_build = check_for_tag('website') needs_sphinx = '1.1' templates_path = ['templates'] source_suffix = '.rst' source_encoding = 'utf-8-sig' master_doc = 'contents' project = u'botan' copyright = u'2000-2017, The Botan Authors' version = '%d.%d' % (version_major, version_minor) release = '%d.%d.%d' % (version_major, version_minor, version_patch) #today = '' today_fmt = '%Y-%m-%d' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = False # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False highlight_language = 'cpp' # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. try: # On Arch this is python-sphinx_rtd_theme import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] except ImportError as e: html_theme = 'agogo' html_theme_path = [] print("Ignoring ImportError and using old theme") # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = 'Botan' # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%Y-%m-%d' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. html_show_sourcelink = False # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. html_show_sphinx = False # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. html_show_copyright = False # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. if is_website_build: html_use_opensearch = 'https://botan.randombit.net/' else: html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'botandoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). authors = u'Jack Lloyd \\and Daniel Neus \\and Ren\u00e9 Korthaus \\and Juraj Somorovsky \\and Tobias Niemann' latex_documents = [ ('contents', 'botan.tex', u'Botan Reference Manual', authors, 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. latex_show_pagerefs = False # If true, show URL addresses after external links. latex_show_urls = 'inline' # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. latex_domain_indices = False botan-2.4.0/src/configs/sphinx/templates/000077500000000000000000000000001322470703100203455ustar00rootroot00000000000000botan-2.4.0/src/configs/sphinx/templates/layout.html000066400000000000000000000002701322470703100225470ustar00rootroot00000000000000{% extends "!layout.html" %} {% block header %}

{{ shorttitle|e }}

{% endblock %} botan-2.4.0/src/contrib/000077500000000000000000000000001322470703100150465ustar00rootroot00000000000000botan-2.4.0/src/contrib/perl-xs/000077500000000000000000000000001322470703100164405ustar00rootroot00000000000000botan-2.4.0/src/contrib/perl-xs/Botan.pm000066400000000000000000000035551322470703100200510ustar00rootroot00000000000000package Botan; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); require DynaLoader; require AutoLoader; use Carp; @ISA = qw(DynaLoader); $VERSION = '0.01'; @EXPORT_OK = qw( NONE IGNORE_WS FULL_CHECK ); %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK ], 'decoder_checking' => [ qw( NONE IGNORE_WS FULL_CHECK )], ); sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. my $constname = $AUTOLOAD; $constname =~ s/.*:://; croak '& not defined' if $constname eq 'constant'; # my $val = constant($constname, @_ ? $_[0] : 0); my $val = constant($constname); if ($! != 0) { if ( $! =~ /Invalid/ ) { $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } else { croak "Your vendor has not defined Botan symbol $constname"; } } no strict 'refs'; *$AUTOLOAD = sub { $val }; goto &$AUTOLOAD; } bootstrap Botan $VERSION; # to setup inheritance... package Botan::Filter; use vars qw(@ISA); @ISA = qw(); package Botan::Chain; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Fork; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Hex_Encoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Hex_Decoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Base64_Decoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan::Base64_Encoder; use vars qw(@ISA); @ISA = qw( Botan::Filter ); package Botan; 1; __END__ =head1 NAME Botan - Perl extension for access to Botan ... =head1 SYNOPSIS use Botan; blah blah blah =head1 DESCRIPTION Blah blah blah. =head1 AUTHOR Vaclav Ovsik =head1 SEE ALSO Bla =cut botan-2.4.0/src/contrib/perl-xs/Botan.xs000066400000000000000000000375331322470703100200720ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifdef __cplusplus } #endif #include #include #include #include #include #include #include #include /* xsubpp converts ':' to '_' in typemap. We create our types without ':' */ typedef Botan::ASN1_String Botan__ASN1_String; typedef Botan::AlgorithmIdentifier Botan__AlgorithmIdentifier; typedef Botan::AlternativeName Botan__AlternativeName; typedef Botan::Attribute Botan__Attribute; typedef Botan::Base64_Decoder Botan__Base64_Decoder; typedef Botan::Base64_Encoder Botan__Base64_Encoder; typedef Botan::Chain Botan__Chain; typedef Botan::Certificate_Extension Botan__Extension; typedef Botan::Filter Botan__Filter; typedef Botan::Fork Botan__Fork; typedef Botan::Hex_Decoder Botan__Hex_Decoder; typedef Botan::Hex_Encoder Botan__Hex_Encoder; typedef Botan::OID Botan__OID; typedef Botan::Pipe Botan__Pipe; typedef Botan::X509_Certificate Botan__X509_Certificate; typedef Botan::X509_DN Botan__X509_DN; typedef Botan::X509_Time Botan__X509_Time; typedef Botan::u32bit Botan__u32bit; /* Types to keep track of destruction C++ objects passed * into other objects... * An Botan object is deleted by his parent object into which is passed, * e.g. some Filter is deleted when his Pipe is destructed. We must * track this and not to delete object again in Perls destructor. */ class ObjectInfo { private: I32 d_signature; bool d_del; public: static I32 const SIGNVAL = 0x696a626f; ObjectInfo() : d_signature(SIGNVAL), d_del(true) {}; ~ObjectInfo() {}; void set_delete(bool del = true) { d_del = del; }; void set_delete_no() { set_delete(false); }; void set_delete_yes() { set_delete(true); }; bool should_delete() const { return d_del; }; }; /* Constant object in initial state - template */ ObjectInfo const oi_init; /*============================================================================*/ MODULE = Botan PACKAGE = Botan PROTOTYPES: ENABLE void constant(char *name) CODE: using namespace Botan; errno = 0; switch (name[0]) { case 'F': if ( strEQ(name, "FULL_CHECK") ) XSRETURN_IV( FULL_CHECK ); // Decoder_Checking enum break; case 'I': if ( strEQ(name, "IGNORE_WS") ) XSRETURN_IV( IGNORE_WS ); // Decoder_Checking enum break; case 'N': if ( strEQ(name, "NONE") ) XSRETURN_IV( NONE ); // Decoder_Checking enum break; } errno = EINVAL; XSRETURN_UNDEF; # =========================== Botan::Chain ========================== MODULE = Botan PACKAGE = Botan::Chain Botan__Chain * Botan__Chain::new(f1 = 0, f2 = 0, f3 = 0, f4 = 0) Botan__Filter *f1; Botan__Filter *f2; Botan__Filter *f3; Botan__Filter *f4; PREINIT: ObjectInfo *f1_oi; ObjectInfo *f2_oi; ObjectInfo *f3_oi; ObjectInfo *f4_oi; CODE: try { RETVAL = new Botan__Chain(f1, f2, f3, f4); if ( f1 ) f1_oi->set_delete_no(); if ( f2 ) f2_oi->set_delete_no(); if ( f3 ) f3_oi->set_delete_no(); if ( f4 ) f4_oi->set_delete_no(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Chain::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # =========================== Botan::Fork ========================== MODULE = Botan PACKAGE = Botan::Fork Botan__Fork * Botan__Fork::new(f1 = 0, f2 = 0, f3 = 0, f4 = 0) Botan__Filter *f1; Botan__Filter *f2; Botan__Filter *f3; Botan__Filter *f4; PREINIT: ObjectInfo *f1_oi; ObjectInfo *f2_oi; ObjectInfo *f3_oi; ObjectInfo *f4_oi; CODE: try { RETVAL = new Botan__Fork(f1, f2, f3, f4); if ( f1 ) f1_oi->set_delete_no(); if ( f2 ) f2_oi->set_delete_no(); if ( f3 ) f3_oi->set_delete_no(); if ( f4 ) f4_oi->set_delete_no(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Fork::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ============================ Botan::Base64_Decoder ============================ MODULE = Botan PACKAGE = Botan::Base64_Decoder Botan__Base64_Decoder * Botan__Base64_Decoder::new(checking = Botan::NONE) int checking; CODE: try { using namespace Botan; RETVAL = new Base64_Decoder((Decoder_Checking)checking); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Base64_Decoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # =========================== Botan::Base64_Encoder ========================== MODULE = Botan PACKAGE = Botan::Base64_Encoder Botan__Base64_Encoder * Botan__Base64_Encoder::new(breaks = false, length = 72) bool breaks; Botan__u32bit length; CODE: try { RETVAL = new Botan__Base64_Encoder(breaks, length); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Base64_Encoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ============================ Botan::Hex_Decoder ============================ MODULE = Botan PACKAGE = Botan::Hex_Decoder Botan__Hex_Decoder * Botan__Hex_Decoder::new(checking = Botan::NONE) int checking; CODE: try { using namespace Botan; RETVAL = new Hex_Decoder((Decoder_Checking)checking); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Hex_Decoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ============================ Botan::Hex_Encoder ============================ MODULE = Botan PACKAGE = Botan::Hex_Encoder Botan__Hex_Encoder * Botan__Hex_Encoder::new(breaks = false, length = 72, lcase = false) bool breaks; Botan__u32bit length; bool lcase; CODE: try { using Botan::Hex_Encoder; RETVAL = new Hex_Encoder(breaks, length, lcase ? Hex_Encoder::Lowercase : Hex_Encoder::Uppercase); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Hex_Encoder::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: if ( THIS_oi->should_delete() ) try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } # ================================ Botan::OID ================================ MODULE = Botan PACKAGE = Botan::OID Botan__OID * Botan__OID::new(s) char *s; CODE: try { RETVAL = new Botan__OID(s); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__OID::DESTROY() CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } char * Botan__OID::as_string() CODE: try { RETVAL = const_cast(THIS->as_string().c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL # ================================ Botan::OIDS ================================ MODULE = Botan PACKAGE = Botan::OIDS char * lookup_by_oid(oid) Botan__OID *oid; CODE: try { RETVAL = const_cast(Botan::OIDS::lookup(*oid).c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan__OID * lookup_by_name(name) char *name; CODE: try { RETVAL = new Botan__OID(Botan::OIDS::lookup(name)); } catch (const std::exception &e) { croak(e.what()); } char const * CLASS = "Botan::OID"; OUTPUT: RETVAL int have_oid(name) char *name; CODE: try { RETVAL = Botan::OIDS::have_oid(name); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL # ================================ Botan::Pipe ================================ MODULE = Botan PACKAGE = Botan::Pipe Botan__Pipe * Botan__Pipe::new(...) CODE: for (I32 i = 1; i < items; i++) { if ( !sv_isobject(ST(i)) || (SvTYPE(SvRV(ST(i))) != SVt_PVMG) ) croak("Botan::Pipe::new() -- arg %u is not " "a blessed SV reference", i +1); if ( !sv_derived_from(ST(i), "Botan::Filter") ) croak("Botan::Pipe::new() -- arg %u is not " "an object derived from Botan::Filter", i +1); MAGIC *mg = mg_find(SvRV(ST(i)), '~'); if ( mg == 0 || mg->mg_len != sizeof(ObjectInfo) || *(I32 *)(mg->mg_ptr) != ObjectInfo::SIGNVAL ) croak("Botan::Pipe::new() -- arg %u has no " "valid private magic data (ObjectInfo)", i +1); } try { RETVAL = new Botan__Pipe(); for (I32 i = 1; i < items; i++) { SV *osv = (SV *)SvRV(ST(i)); ObjectInfo *oi = (ObjectInfo *)(mg_find(osv, '~')->mg_ptr); RETVAL->append((Botan__Filter *)(SvIV(osv))); oi->set_delete_no(); } } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Pipe::DESTROY() PREINIT: ObjectInfo *THIS_oi; CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::write(s) SV *s; PREINIT: ObjectInfo *THIS_oi; CODE: STRLEN len; char *ptr = SvPV(s, len); try { THIS->write((unsigned char *)ptr, len); } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::process_msg(s) SV *s; PREINIT: ObjectInfo *THIS_oi; CODE: STRLEN len; char *ptr = SvPV(s, len); try { THIS->process_msg((unsigned char *)ptr, len); } catch (const std::exception &e) { croak(e.what()); } Botan__u32bit Botan__Pipe::remaining(msgno = Botan::Pipe::DEFAULT_MESSAGE) Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->remaining(msgno); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL SV * Botan__Pipe::read(len = 0xFFFFFFFF, msgno = Botan::Pipe::DEFAULT_MESSAGE) Botan__u32bit len; Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { if ( len > THIS->remaining(msgno) ) len = THIS->remaining(msgno); RETVAL = NEWSV(0, len); SvPOK_on(RETVAL); if ( len > 0 ) SvCUR_set(RETVAL, THIS->read((unsigned char *)SvPVX(RETVAL), len, msgno)); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL SV * Botan__Pipe::peek(len = 0xFFFFFFFF, offset = 0, \ msgno = Botan::Pipe::DEFAULT_MESSAGE) Botan__u32bit len; Botan__u32bit offset; Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { if ( len > THIS->remaining(msgno) ) len = THIS->remaining(msgno); RETVAL = NEWSV(0, len); SvPOK_on(RETVAL); if ( len > 0 ) SvCUR_set(RETVAL, THIS->peek((unsigned char *)SvPVX(RETVAL), len, offset, msgno)); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan__u32bit Botan__Pipe::default_msg() PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->default_msg(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Pipe::set_default_msg(msgno) Botan__u32bit msgno; PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->set_default_msg(msgno); } catch (const std::exception &e) { croak(e.what()); } Botan__u32bit Botan__Pipe::message_count() PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->message_count(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL bool Botan__Pipe::end_of_data() PREINIT: ObjectInfo *THIS_oi; CODE: try { RETVAL = THIS->end_of_data(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__Pipe::start_msg() PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->start_msg(); } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::end_msg() PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->end_msg(); } catch (const std::exception &e) { croak(e.what()); } void Botan__Pipe::reset() PREINIT: ObjectInfo *THIS_oi; CODE: try { THIS->reset(); } catch (const std::exception &e) { croak(e.what()); } # ========================== Botan::X509_Certificate ========================== MODULE = Botan PACKAGE = Botan::X509_Certificate Botan__X509_Certificate * Botan__X509_Certificate::new(char *fn) CODE: try { RETVAL = new Botan__X509_Certificate(fn); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__X509_Certificate::DESTROY() CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } unsigned int Botan__X509_Certificate::x509_version() CODE: try { RETVAL = THIS->x509_version(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::start_time() CODE: try { RETVAL = const_cast(THIS->start_time().c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::end_time() CODE: try { RETVAL = const_cast(THIS->end_time().c_str()); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::subject_info(char *info) CODE: try { std::vector s = THIS->subject_info(info); if(s.size() > 0) RETVAL = const_cast(s[0].c_str()); else RETVAL = "err"; } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL char * Botan__X509_Certificate::issuer_info(char *info) CODE: try { std::vector s = THIS->subject_info(info); if(s.size() > 0) RETVAL = const_cast(s[0].c_str()); else RETVAL = "err"; } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL Botan__X509_DN * Botan__X509_Certificate::subject_dn() CODE: try { RETVAL = new Botan__X509_DN(THIS->subject_dn()); } catch (const std::exception &e) { croak(e.what()); } char const * CLASS = "Botan::X509_DN"; OUTPUT: RETVAL Botan__X509_DN * Botan__X509_Certificate::issuer_dn() CODE: try { RETVAL = new Botan__X509_DN(THIS->issuer_dn()); } catch (const std::exception &e) { croak(e.what()); } char const * CLASS = "Botan::X509_DN"; OUTPUT: RETVAL # ============================== Botan::X509_DN ============================== MODULE = Botan PACKAGE = Botan::X509_DN Botan__X509_DN * Botan__X509_DN::new() CODE: try { RETVAL = new Botan__X509_DN(); } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL void Botan__X509_DN::DESTROY() CODE: try { delete THIS; } catch (const std::exception &e) { croak(e.what()); } AV * Botan__X509_DN::get_attributes() CODE: try { using namespace std; using namespace Botan; typedef multimap::const_iterator rdn_iter; multimap const &atrmmap = THIS->get_attributes(); RETVAL = newAV(); for(rdn_iter i = atrmmap.begin(); i != atrmmap.end(); i++) { string const &atr = i->first.as_string(); string const &val = i->second; av_push(RETVAL, newSVpvn(atr.c_str(), atr.length())); av_push(RETVAL, newSVpvn(val.c_str(), val.length())); } } catch (const std::exception &e) { croak(e.what()); } OUTPUT: RETVAL botan-2.4.0/src/contrib/perl-xs/Changes000066400000000000000000000001451322470703100177330ustar00rootroot00000000000000Revision history for Perl extension to Botan. 0.01 Fri, 20 Feb 2004 15:10:50 +0100 - first version botan-2.4.0/src/contrib/perl-xs/MANIFEST000066400000000000000000000002401322470703100175650ustar00rootroot00000000000000Botan.pm Botan.xs Changes MANIFEST Makefile.PL data/ca.cert.der data/ca.cert.pem t/base64.t t/filt.t t/hex.t t/oid.t t/pipe.t t/testutl.pl t/x509cert.t typemap botan-2.4.0/src/contrib/perl-xs/Makefile.PL000066400000000000000000000012321322470703100204100ustar00rootroot00000000000000use ExtUtils::MakeMaker; my ($cc, $cflags, $lids); if ( $^O eq 'MSWin32' ) { # $cflags = ''; # $libs = ':nosearch -lgdi32 -llibeay32'; } else { $cc = 'g++'; $cflags = $Config::Config{ccflags} . ' -Wno-write-strings -fexceptions ' . qx( botan config cflags ); $libs = qx( botan config libs ); } WriteMakefile( 'NAME' => 'Botan', 'DISTNAME' => 'Botan-XS', 'VERSION_FROM' => 'Botan.pm', # finds $VERSION 'XSOPT' => '-C++', 'CC' => $cc, 'LD' => '$(CC)', 'CCFLAGS' => $cflags, 'LIBS' => [ $libs ], 'OPTIMIZE' => '-g', # 'clean' => { # 'FILES' => 'neco.p12 rnd', # }, ); botan-2.4.0/src/contrib/perl-xs/data/000077500000000000000000000000001322470703100173515ustar00rootroot00000000000000botan-2.4.0/src/contrib/perl-xs/data/ca.cert.der000066400000000000000000000013101322470703100213570ustar00rootroot000000000000000‚Ä0‚- 0  *†H†÷ 0R1 0 UCZ10U ICZ a.s.10UTest primary CA10 *†H†÷  ca@i.cz0 000820214800Z 020810214800Z0O1 0 UCZ10U ICZ a.s.10U Test sign CA10 *†H†÷  ca@i.cz0Ÿ0  *†H†÷ 0‰¨Ød^6¬Óÿe›šæiQïÔ™ò 5pöæ4d Éj{™¿6æ~Ô”²ŽGÉLµ·ê³½Ó›¼¹ô?M ª?`|new(&Botan::NONE); }; print "not " if $@ || !defined $f; print "ok 2\n"; my $dec; eval { $dec = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec; print "ok 3\n"; eval { $f = Botan::Base64_Decoder->new(&Botan::IGNORE_WS); }; print "not " if $@ || !defined $f; print "ok 4\n"; my $dec_is; eval { $dec_is = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_is; print "ok 5\n"; eval { $f = Botan::Base64_Decoder->new(&Botan::FULL_CHECK); }; print "not " if $@ || !defined $f; print "ok 6\n"; my $dec_fc; eval { $dec_fc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_fc; print "ok 7\n"; # Testing clean base64 input my $data; undef $data; eval { $dec->process_msg($botan_lic_b64); $data = $dec->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 8\n"; undef $data; eval { $dec_is->process_msg($botan_lic_b64); $data = $dec_is->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 9\n"; undef $data; eval { $dec_fc->process_msg($botan_lic_b64); $data = $dec_fc->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 10\n"; # Testing base64 input with whitespaces undef $data; eval { $dec->process_msg($botan_lic_b64_ws); $dec->set_default_msg(1); $data = $dec->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 11\n"; undef $data; eval { $dec_is->process_msg($botan_lic_b64_ws); $dec_is->set_default_msg(1); $data = $dec_is->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 12\n"; undef $data; eval { $dec_fc->process_msg($botan_lic_b64_ws); $dec_fc->set_default_msg(1); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 13\n"; # Testing base64 input with garbage undef $data; eval { $dec->process_msg($botan_lic_b64_garbage); $dec->set_default_msg(2); $data = $dec->read(); }; print "not " if $@ || $data ne $botan_lic; print "ok 14\n"; undef $data; eval { $dec_is->process_msg($botan_lic_b64_garbage); $dec_is->set_default_msg(2); $data = $dec_is->read(); }; print "not " unless $@ && !defined $data; print "ok 15\n"; undef $data; eval { $dec_fc->process_msg($botan_lic_b64_garbage); $dec_fc->set_default_msg(2); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 16\n"; # Encoder... eval { $f = Botan::Base64_Encoder->new(); }; print "not " if $@ || !defined $f; print "ok 17\n"; my $enc; eval { $enc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc; print "ok 18\n"; eval { $f = Botan::Base64_Encoder->new(1, 5); }; print "not " if $@ || !defined $f; print "ok 19\n"; my $enc2; eval { $enc2 = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc2; print "ok 20\n"; undef $data; eval { $enc->process_msg("Hello\n"); $data = $enc->read(); }; print "not " if $@ || $data ne "SGVsbG8K"; print "ok 21\n"; undef $data; eval { $enc2->process_msg("Hello\n"); $data = $enc2->read(); }; print "not " if $@ || $data ne "SGVsb\nG8K\n"; print "ok 22\n"; # Encoder with decoder... my $p; eval { $p = Botan::Pipe->new( Botan::Base64_Encoder->new(), Botan::Base64_Decoder->new(), ); }; print "not " if $@ || !defined $p; print "ok 23\n"; print "not " unless random_message_ok($p); print "ok 24\n"; botan-2.4.0/src/contrib/perl-xs/t/filt.t000066400000000000000000000023101322470703100200220ustar00rootroot00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..5\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; my $pipe = Botan::Pipe->new(Botan::Hex_Encoder->new()); print "not " unless $pipe; print "ok 2\n"; $pipe->process_msg('FOO'); print "not " if $pipe->read() ne '464F4F'; print "ok 3\n"; $pipe = Botan::Pipe->new(Botan::Hex_Encoder->new(0, 0, 1)); print "not " unless $pipe; print "ok 4\n"; $pipe->process_msg('FOO'); print "not " if $pipe->read() ne '464f4f'; print "ok 5\n"; #my $pipe = Botan::Pipe->new(Botan::Base64_Encoder->new()); #$pipe->process_msg('FOO'); # #print "not " if $pipe->read() ne 'Rk9P'; #print "ok 4\n"; botan-2.4.0/src/contrib/perl-xs/t/hex.t000066400000000000000000000137361322470703100176660ustar00rootroot00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..24\n"; } END { print "not ok 1\n" unless $loaded; } require 't/testutl.pl'; use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; # Data prep my ($hex, $hex_ws, $hex_garbage); while ( $_ = ) { $hex_garbage .= $_; s/[^[:xdigit:][:space:]]//g; $hex_ws .= $_; s/[^[:xdigit:]]//g; $hex .= $_; } my $data_test = pack("H*", $hex); # Decoder... my $f; eval { $f = Botan::Hex_Decoder->new(&Botan::NONE); }; print "not " if $@ || !defined $f; print "ok 2\n"; my $dec; eval { $dec = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec; print "ok 3\n"; eval { $f = Botan::Hex_Decoder->new(&Botan::IGNORE_WS); }; print "not " if $@ || !defined $f; print "ok 4\n"; my $dec_is; eval { $dec_is = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_is; print "ok 5\n"; eval { $f = Botan::Hex_Decoder->new(&Botan::FULL_CHECK); }; print "not " if $@ || !defined $f; print "ok 6\n"; my $dec_fc; eval { $dec_fc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $dec_fc; print "ok 7\n"; # Testing clean hexadecimal input my $data; undef $data; eval { $dec->process_msg($hex); $data = $dec->read(); }; print "not " if $@ || $data ne $data_test; print "ok 8\n"; undef $data; eval { $dec_is->process_msg($hex); $data = $dec_is->read(); }; print "not " if $@ || $data ne $data_test; print "ok 9\n"; undef $data; eval { $dec_fc->process_msg($hex); $data = $dec_fc->read(); }; print "not " if $@ || $data ne $data_test; print "ok 10\n"; # Testing hexadecimal input with whitespaces undef $data; eval { $dec->process_msg($hex_ws); $dec->set_default_msg(1); $data = $dec->read(); }; print "not " if $@ || $data ne $data_test; print "ok 11\n"; undef $data; eval { $dec_is->process_msg($hex_ws); $dec_is->set_default_msg(1); $data = $dec_is->read(); }; print "not " if $@ || $data ne $data_test; print "ok 12\n"; undef $data; eval { $dec_fc->process_msg($hex_ws); $dec_fc->set_default_msg(1); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 13\n"; # Testing hexadecimal input with garbage undef $data; eval { $dec->process_msg($hex_garbage); $dec->set_default_msg(2); $data = $dec->read(); }; print "not " if $@ || $data ne $data_test; print "ok 14\n"; undef $data; eval { $dec_is->process_msg($hex_garbage); $dec_is->set_default_msg(2); $data = $dec_is->read(); }; print "not " unless $@ && !defined $data; print "ok 15\n"; undef $data; eval { $dec_fc->process_msg($hex_garbage); $dec_fc->set_default_msg(2); $data = $dec_fc->read(); }; print "not " unless $@ && !defined $data; print "ok 16\n"; # Encoder... eval { $f = Botan::Hex_Encoder->new(); }; print "not " if $@ || !defined $f; print "ok 17\n"; my $enc; eval { $enc = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc; print "ok 18\n"; eval { $f = Botan::Hex_Encoder->new(1, 5, 1); }; print "not " if $@ || !defined $f; print "ok 19\n"; my $enc2; eval { $enc2 = Botan::Pipe->new($f); }; print "not " if $@ || !defined $enc2; print "ok 20\n"; undef $data; eval { $enc->process_msg("Hello\n"); $data = $enc->read(); }; print "not " if $@ || $data ne "48656C6C6F0A"; print "ok 21\n"; undef $data; eval { $enc2->process_msg("Hello\n"); $data = $enc2->read(); }; print "not " if $@ || $data ne "48656\nc6c6f\n0a\n"; print "ok 22\n"; # Encoder with decoder... my $p; eval { $p = Botan::Pipe->new( Botan::Hex_Encoder->new(), Botan::Hex_Decoder->new(), ); }; print "not " if $@ || !defined $p; print "ok 23\n"; print "not " unless random_message_ok($p); print "ok 24\n"; __DATA__ cb13 4a4d 7522 1fd3 c6f6 7786 d04b 3043 ..JMu"....w..K.. 4552 4bcf 4d2b 9d71 0cfe 4d6a 1caf bcfd .RK.M+.q..Mj.... 8f91 6151 ff85 e900 7e6a bafc 15e9 ae51 ...Q....~j.....Q b14b 7210 bb40 5958 2b82 d49e b808 68a5 .Kr..@YX+.....h. 7945 9dec f686 9b98 989e 826d 8088 6ee7 y..........m..n. d066 1eac 8c34 c461 bb54 7726 87ab d681 .........Tw&.... a0be 52e5 1128 0cf2 759e cb2d e690 4ed9 ..R..(..u..-..N. 7e88 bda7 2523 4a0f 185a 02b1 f898 fc41 ~...%#J..Z...... dd48 fa87 945d 7611 b8c9 a50a 2de2 b670 .H...]v.....-..p 0056 c8be 2cbb e7d0 1e70 4a3d 79f0 dce9 .V..,....pJ=y... b57f 154b 2b3a db73 f086 de11 9f3e 1641 ...K+:.s.....>.. 3a28 8b9b bb0f 682b 80db b791 89e0 62c0 :(....h+........ 7204 db97 5432 2eb0 a04e f38e 809f 7223 r...T....N....r# 912e e552 1452 6dd2 e09f dd06 c715 7c1a ...R.Rm.......|. fe3d d6cc b6d0 a17a 27d7 4327 4e43 8af3 .=.....z'..'N... 6eb5 e9f8 bfe9 34c3 6636 8243 358f 966d n..............m 7d87 d17b 5c37 6acb 4972 f4ec 6806 bbde }..{\.j.Ir..h... 2689 a019 a9e2 4101 7fe2 de72 bc03 eb5e &..........r...^ b699 2d6b f8cd a08e 6e01 edfc a81a 94b6 ..-k....n....... 9073 15fb efb2 c8d9 9f85 6633 85f1 e9d0 .s.............. 20ce 578b ab9d 2e51 b947 69bf fba5 82c6 .W....Q.Gi..... 2ed0 dd36 d679 a399 7db3 8a0d cdef 0eda .....y..}....... e761 e7f1 5b17 3f67 0c83 215a eddf 9d2a ....[.?g..!Z...* 5e70 0a77 c92e 94e1 a82b fd7c f10a 894f ^p.w.....+.|...O 2955 f0e8 7398 f409 2040 b797 da03 a5a6 )U..s... @...... 7ba4 c3c9 2659 b9f7 6a56 e17a b481 983f {...&Y..jV.z...? 00ed 3cc8 5a22 ad5c b6e0 3566 d717 35a6 ..<.Z".\........ 1523 4104 de63 477e fd24 68e5 e816 98df .#....G~.$h..... 1747 417e db72 a76a be5b b9dc 3dfb 2d05 .G.~.r.j.[..=.-. d27f e597 eafc 9a29 15c5 792d 9c88 9aea .......)..y-.... 485e e431 96c3 7723 da6d 28b2 477a fd12 H^....w#.m(.Gz.. e645 5dcd 7d5a d8b4 7acc 10b2 b41a e11d ..].}Z..z....... botan-2.4.0/src/contrib/perl-xs/t/oid.t000066400000000000000000000022731322470703100176470ustar00rootroot00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..5\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; print "not " unless Botan::OIDS::have_oid('X520.CommonName'); print "ok 2\n"; my $oid_c = Botan::OID->new('2.5.4.3'); print "not " if Botan::OIDS::lookup_by_oid($oid_c) ne 'X520.CommonName'; print "ok 3\n"; my $oid_x = Botan::OIDS::lookup_by_name('X520.CommonName'); print "not " if $oid_x->as_string() ne '2.5.4.3'; print "ok 4\n"; my $oid_foo_num = '1.2.3.4.5.6.7.8.9.10.11.12.13.14.15'; my $oid_foo = Botan::OID->new($oid_foo_num); print "not " if Botan::OIDS::lookup_by_oid($oid_foo) ne $oid_foo_num; print "ok 5\n"; botan-2.4.0/src/contrib/perl-xs/t/pipe.t000066400000000000000000000042711322470703100200310ustar00rootroot00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..20\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; my $pipe = Botan::Pipe->new(); print "not " unless $pipe; print "ok 2\n"; $pipe->start_msg(); $pipe->write('Hello world'); $pipe->end_msg(); print "not " if $pipe->message_count() != 1; print "ok 3\n"; print "not " if $pipe->remaining() != 11; print "ok 4\n"; print "not " if $pipe->end_of_data(); print "ok 5\n"; print "not " if $pipe->read() ne 'Hello world'; print "ok 6\n"; print "not " if $pipe->remaining() != 0; print "ok 7\n"; print "not " unless $pipe->end_of_data(); print "ok 8\n"; $pipe->process_msg('Hello world'); print "not " if $pipe->message_count() != 2; print "ok 9\n"; my $msg_num = $pipe->message_count() -1; print "not " if $pipe->read(5, $msg_num) ne 'Hello'; print "ok 10\n"; print "not " if $pipe->read(6, $msg_num) ne ' world'; print "ok 11\n"; print "not " if $pipe->remaining() != 0; print "ok 12\n"; print "not " unless $pipe->end_of_data(); print "ok 13\n"; $pipe->process_msg("The\0string\0with\0null\0chars\0"); $msg_num = $pipe->message_count() -1; print "not " if $pipe->read(80, $msg_num) ne "The\0string\0with\0null\0chars\0"; print "ok 14\n"; $pipe->process_msg('FOO BAR'); $pipe->set_default_msg($pipe->message_count() -1); print "not " if $pipe->peek(3) ne 'FOO'; print "ok 15\n"; print "not " if $pipe->peek(3, 4) ne 'BAR'; print "ok 16\n"; print "not " if $pipe->peek() ne 'FOO BAR'; print "ok 17\n"; print "not " if $pipe->read() ne 'FOO BAR'; print "ok 18\n"; print "not " if $pipe->remaining() != 0; print "ok 19\n"; print "not " unless $pipe->end_of_data(); print "ok 20\n"; botan-2.4.0/src/contrib/perl-xs/t/testutl.pl000066400000000000000000000011011322470703100207350ustar00rootroot00000000000000#!/usr/bin/perl sub random_message_ok { my ($pipe, $iter, $chunkmax) = @_; $iter = 100 unless defined $iter; $chunkmax = 300 unless defined $chunkmax; eval { my $input = ''; $pipe->start_msg(); for(my $i = 0; $i < $iter; $i++) { my $chunk = ''; my $chunklen = int(rand($chunkmax)); $chunk .= pack("C", int(rand(256))) while $chunklen--; $input .= $chunk; $pipe->write($chunk); } $pipe->end_msg(); my $msg_num = $pipe->message_count() -1; my $output = $pipe->read(0xFFFFFFFF, $msg_num); return $input eq $output; }; } 1; botan-2.4.0/src/contrib/perl-xs/t/x509cert.t000066400000000000000000000022501322470703100204520ustar00rootroot00000000000000# vim: set ft=perl: # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..4\n"; } END { print "not ok 1\n" unless $loaded; } use Botan; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; my $cert = Botan::X509_Certificate->new('data/ca.cert.der'); print "not " if $cert->x509_version() != 3; print "ok 2\n"; print "not " if $cert->start_time() ne '2000/8/20 21:48:00 UTC'; print "ok 3\n"; print "not " if $cert->end_time() ne '2002/8/10 21:48:00 UTC'; print "ok 4\n"; #my $subject = $cert->subject_dn()->get_attributes(); #print STDERR "subject=", join(',', @{$subject}), "\n"; # #my $issuer = $cert->issuer_dn()->get_attributes(); #print STDERR "issuer=", join(',', @{$issuer}), "\n"; # botan-2.4.0/src/contrib/perl-xs/typemap000066400000000000000000000035241322470703100200460ustar00rootroot00000000000000TYPEMAP Botan__ASN1_String * O_OBJECT Botan__AlgorithmIdentifier * O_OBJECT Botan__AlternativeName * O_OBJECT Botan__Attribute * O_OBJECT Botan__Base64_Decoder * O_EXTOBJECT Botan__Base64_Encoder * O_EXTOBJECT Botan__Chain * O_EXTOBJECT Botan__Extension * O_OBJECT Botan__Filter * O_EXTOBJECT Botan__Fork * O_EXTOBJECT Botan__Hex_Decoder * O_EXTOBJECT Botan__Hex_Encoder * O_EXTOBJECT Botan__OID * O_OBJECT Botan__Pipe * O_OBJECT Botan__X509_Certificate * O_OBJECT Botan__X509_DN * O_OBJECT Botan__X509_Time * O_OBJECT Botan__u32bit T_UV ###################################################################### OUTPUT # The Perl object is blessed into 'CLASS', which should be a # char* having the name of the package for the blessing. O_OBJECT sv_setref_pv($arg, CLASS, (void*)$var); O_EXTOBJECT sv_setref_pv($arg, CLASS, (void*)$var); sv_magic(SvRV($arg), 0, '~', (char *)&oi_init, sizeof(oi_init)); ###################################################################### INPUT O_OBJECT if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) $var = ($type)SvIV((SV*)SvRV( $arg )); else croak(\"${Package}::$func_name() -- \" \"$var is not a blessed SV reference\"); # The pointer variable "ObjectInfo *${var}_oi;" must be declared # in PREINIT section. I don't know how to emit this declaration safely here. O_EXTOBJECT if ( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) $var = ($type)SvIV((SV*)SvRV($arg)); else croak(\"${Package}::$func_name() -- \" \"$var is not a blessed SV reference\"); { MAGIC *mg = mg_find(SvRV($arg), '~'); if ( mg == 0 || mg->mg_len != sizeof(ObjectInfo) || *(I32 *)(mg->mg_ptr) != ObjectInfo::SIGNVAL ) croak(\"${Package}::$func_name() -- \" \"private magic data for $var invalid\"); ${var}_oi = (ObjectInfo *)(mg->mg_ptr); } botan-2.4.0/src/contrib/readme.txt000066400000000000000000000004311322470703100170420ustar00rootroot00000000000000 The code is this directory may be of use to you, but is not written or maintained by the Botan developers. Patches are welcome. - In sqlite, find a patch to enable building a special version of sqlite3 that encrypts the database - In perl-xs, find a wrapper for Perl using XS botan-2.4.0/src/contrib/sqlite/000077500000000000000000000000001322470703100163475ustar00rootroot00000000000000botan-2.4.0/src/contrib/sqlite/codec.cpp000066400000000000000000000125411322470703100201330ustar00rootroot00000000000000/* * Codec class for SQLite3 encryption codec. * (C) 2010 Olivier de Gaalon * * Botan is released under the Simplified BSD License (see license.txt) */ #include "codec.h" Codec::Codec(void *db) { InitializeCodec(db); } Codec::Codec(const Codec *other, void *db) { //Only used to copy main db key for an attached db InitializeCodec(db); m_hasReadKey = other->m_hasReadKey; m_hasWriteKey = other->m_hasWriteKey; m_readKey = other->m_readKey; m_ivReadKey = other->m_ivReadKey; m_writeKey = other->m_writeKey; m_ivWriteKey = other->m_ivWriteKey; } void Codec::InitializeCodec(void *db) { m_hasReadKey = false; m_hasWriteKey = false; m_db = db; try { m_encipherFilter = get_cipher(BLOCK_CIPHER_STR, ENCRYPTION); m_decipherFilter = get_cipher(BLOCK_CIPHER_STR, DECRYPTION); m_cmac = new MAC_Filter(MAC_STR); m_encipherPipe.append(m_encipherFilter); m_decipherPipe.append(m_decipherFilter); m_macPipe.append(m_cmac); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } void Codec::GenerateWriteKey(const char *userPassword, int passwordLength) { try { #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4) PBKDF *pbkdf = get_pbkdf(PBKDF_STR); SymmetricKey masterKey = pbkdf->derive_key(KEY_SIZE + IV_DERIVATION_KEY_SIZE, std::string(userPassword, passwordLength), (const byte*)SALT_STR.c_str(), SALT_SIZE, PBKDF_ITERATIONS); #elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,8,0) S2K* s2k = get_s2k(PBKDF_STR); s2k->set_iterations(PBKDF_ITERATIONS); s2k->change_salt((const byte*)SALT_STR.c_str(), SALT_SIZE); SymmetricKey masterKey = s2k->derive_key(KEY_SIZE + IV_DERIVATION_KEY_SIZE, std::string(userPassword, passwordLength)); #else #error "This code requires botan 1.8 or newer" #endif m_writeKey = SymmetricKey(masterKey.bits_of(), KEY_SIZE); m_ivWriteKey = SymmetricKey(masterKey.bits_of() + KEY_SIZE, IV_DERIVATION_KEY_SIZE); m_hasWriteKey = true; } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } void Codec::DropWriteKey() { m_hasWriteKey = false; } void Codec::SetReadIsWrite() { m_readKey = m_writeKey; m_ivReadKey = m_ivWriteKey; m_hasReadKey = m_hasWriteKey; } void Codec::SetWriteIsRead() { m_writeKey = m_readKey; m_ivWriteKey = m_ivReadKey; m_hasWriteKey = m_hasReadKey; } unsigned char* Codec::Encrypt(int page, unsigned char *data, bool useWriteKey) { memcpy(m_page, data, m_pageSize); try { m_encipherFilter->set_key(useWriteKey ? m_writeKey : m_readKey); m_encipherFilter->set_iv(GetIVForPage(page, useWriteKey)); m_encipherPipe.process_msg(m_page, m_pageSize); m_encipherPipe.read(m_page, m_encipherPipe.remaining(Pipe::LAST_MESSAGE), Pipe::LAST_MESSAGE); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } return m_page; //return location of newly ciphered data } void Codec::Decrypt(int page, unsigned char *data) { try { m_decipherFilter->set_key(m_readKey); m_decipherFilter->set_iv(GetIVForPage(page, false)); m_decipherPipe.process_msg(data, m_pageSize); m_decipherPipe.read(data, m_decipherPipe.remaining(Pipe::LAST_MESSAGE), Pipe::LAST_MESSAGE); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } InitializationVector Codec::GetIVForPage(u32bit page, bool useWriteKey) { try { static unsigned char *intiv[4]; store_le(page, (byte*)intiv); m_cmac->set_key(useWriteKey ? m_ivWriteKey : m_ivReadKey); m_macPipe.process_msg((byte*)intiv, 4); return m_macPipe.read_all(Pipe::LAST_MESSAGE); } catch(Botan::Exception e) { m_botanErrorMsg = e.what(); } } const char* Codec::GetAndResetError() { const char *message = m_botanErrorMsg; m_botanErrorMsg = 0; return message; } #include "codec_c_interface.h" void InitializeBotan() { } void* InitializeNewCodec(void *db) { return new Codec(db); } void* InitializeFromOtherCodec(const void *otherCodec, void *db) { return new Codec((Codec*)otherCodec, db); } void GenerateWriteKey(void *codec, const char *userPassword, int passwordLength) { ((Codec*)codec)->GenerateWriteKey(userPassword, passwordLength); } void DropWriteKey(void *codec) { ((Codec*)codec)->DropWriteKey(); } void SetWriteIsRead(void *codec) { ((Codec*)codec)->SetWriteIsRead(); } void SetReadIsWrite(void *codec) { ((Codec*)codec)->SetReadIsWrite(); } unsigned char* Encrypt(void *codec, int page, unsigned char *data, Bool useWriteKey) { return ((Codec*)codec)->Encrypt(page, data, useWriteKey); } void Decrypt(void *codec, int page, unsigned char *data) { ((Codec*)codec)->Decrypt(page, data); } void SetPageSize(void *codec, int pageSize) { ((Codec*)codec)->SetPageSize(pageSize); } Bool HasReadKey(void *codec) { return ((Codec*)codec)->HasReadKey(); } Bool HasWriteKey(void *codec) { return ((Codec*)codec)->HasWriteKey(); } void* GetDB(void *codec) { return ((Codec*)codec)->GetDB(); } const char* GetAndResetError(void *codec) { return ((Codec*)codec)->GetAndResetError(); } void DeleteCodec(void *codec) { Codec *deleteThisCodec = (Codec*)codec; delete deleteThisCodec; } botan-2.4.0/src/contrib/sqlite/codec.h000066400000000000000000000060051322470703100175760ustar00rootroot00000000000000/* * Codec class for SQLite3 encryption codec. * (C) 2010 Olivier de Gaalon * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef _CODEC_H_ #define _CODEC_H_ #include #include #include using namespace std; using namespace Botan; /*These constants can be used to tweak the codec behavior as follows *Note that once you've encrypted a database with these settings, *recompiling with any different settings will give you a library that *cannot read that database, even given the same passphrase.*/ //BLOCK_CIPHER_STR: Cipher and mode used for encrypting the database //make sure to add "/NoPadding" for modes that use padding schemes const string BLOCK_CIPHER_STR = "Twofish/XTS"; //PBKDF_STR: Key derivation function used to derive both the encryption //and IV derivation keys from the given database passphrase const string PBKDF_STR = "PBKDF2(SHA-160)"; //SALT_STR: Hard coded salt used to derive the key from the passphrase. const string SALT_STR = "&g#nB'9]"; //SALT_SIZE: Size of the salt in bytes (as given in SALT_STR) const int SALT_SIZE = 64/8; //64 bit, 8 byte salt //MAC_STR: CMAC used to derive the IV that is used for db page //encryption const string MAC_STR = "CMAC(Twofish)"; //PBKDF_ITERATIONS: Number of hash iterations used in the key derivation //process. const int PBKDF_ITERATIONS = 10000; //KEY_SIZE: Size of the encryption key. Note that XTS splits the key //between two ciphers, so if you're using XTS, double the intended key //size. (ie, "AES-128/XTS" should have a 256 bit KEY_SIZE) const int KEY_SIZE = 512/8; //512 bit, 64 byte key. (256 bit XTS key) //IV_DERIVATION_KEY_SIZE: Size of the key used with the CMAC (MAC_STR) //above. const int IV_DERIVATION_KEY_SIZE = 256/8; //256 bit, 32 byte key //This is definited in sqlite.h and very unlikely to change #define SQLITE_MAX_PAGE_SIZE 32768 class Codec { public: Codec(void *db); Codec(const Codec* other, void *db); void GenerateWriteKey(const char *userPassword, int passwordLength); void DropWriteKey(); void SetWriteIsRead(); void SetReadIsWrite(); unsigned char* Encrypt(int page, unsigned char *data, bool useWriteKey); void Decrypt(int page, unsigned char *data); void SetPageSize(int pageSize) { m_pageSize = pageSize; } bool HasReadKey() { return m_hasReadKey; } bool HasWriteKey() { return m_hasWriteKey; } void* GetDB() { return m_db; } const char* GetAndResetError(); private: bool m_hasReadKey; bool m_hasWriteKey; SymmetricKey m_readKey, m_writeKey, m_ivReadKey, m_ivWriteKey; Pipe m_encipherPipe, m_decipherPipe, m_macPipe; Keyed_Filter *m_encipherFilter; Keyed_Filter *m_decipherFilter; MAC_Filter *m_cmac; int m_pageSize; unsigned char m_page[SQLITE_MAX_PAGE_SIZE]; void *m_db; const char *m_botanErrorMsg; InitializationVector GetIVForPage(u32bit page, bool useWriteKey); void InitializeCodec(void *db); }; #endif botan-2.4.0/src/contrib/sqlite/codec_c_interface.h000066400000000000000000000027351322470703100221260ustar00rootroot00000000000000/* * Encryption codec class C interface * (C) 2010 Olivier de Gaalon * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef _CODEC_C_INTERFACE_H_ #define _CODEC_C_INTERFACE_H_ #ifdef __cplusplus typedef unsigned char Bool; #endif #ifdef __cplusplus extern "C" #endif void InitializeBotan(); #ifdef __cplusplus extern "C" #endif void* InitializeNewCodec(void *db); #ifdef __cplusplus extern "C" #endif void* InitializeFromOtherCodec(const void *otherCodec, void *db); #ifdef __cplusplus extern "C" #endif void GenerateWriteKey(void *codec, const char *userPassword, int passwordLength); #ifdef __cplusplus extern "C" #endif void DropWriteKey(void *codec); #ifdef __cplusplus extern "C" #endif void SetWriteIsRead(void *codec); #ifdef __cplusplus extern "C" #endif void SetReadIsWrite(void *codec); #ifdef __cplusplus extern "C" #endif unsigned char* Encrypt(void *codec, int page, unsigned char *data, Bool useWriteKey); #ifdef __cplusplus extern "C" #endif void Decrypt(void *codec, int page, unsigned char *data); #ifdef __cplusplus extern "C" #endif void SetPageSize(void *codec, int pageSize); #ifdef __cplusplus extern "C" #endif Bool HasReadKey(void *codec); #ifdef __cplusplus extern "C" #endif Bool HasWriteKey(void *codec); #ifdef __cplusplus extern "C" #endif void* GetDB(void *codec); #ifdef __cplusplus extern "C" #endif const char* GetAndResetError(void *codec); #ifdef __cplusplus extern "C" #endif void DeleteCodec(void *codec); #endifbotan-2.4.0/src/contrib/sqlite/codecext.c000066400000000000000000000166531322470703100203240ustar00rootroot00000000000000/* * Encryption codec implementation * (C) 2010 Olivier de Gaalon * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef SQLITE_OMIT_DISKIO #ifdef SQLITE_HAS_CODEC #include "codec_c_interface.h" Bool HandleError(void *pCodec) { const char *error = GetAndResetError(pCodec); if (error) { sqlite3Error((sqlite3*)GetDB(pCodec), SQLITE_ERROR, "Botan Error: %s", error); return 1; } return 0; } // Guessing that "see" is related to SQLite Encryption Extension" (the semi-official, for-pay, encryption codec) // Just as useful for initializing Botan. void sqlite3_activate_see(const char *info) { InitializeBotan(); } // Free the encryption codec, called from pager.c (address passed in sqlite3PagerSetCodec) void sqlite3PagerFreeCodec(void *pCodec) { if (pCodec) DeleteCodec(pCodec); } // Report the page size to the codec, called from pager.c (address passed in sqlite3PagerSetCodec) void sqlite3CodecSizeChange(void *pCodec, int pageSize, int nReserve) { SetPageSize(pCodec, pageSize); } // Encrypt/Decrypt functionality, called by pager.c void* sqlite3Codec(void *pCodec, void *data, Pgno nPageNum, int nMode) { if (pCodec == NULL) //Db not encrypted return data; switch(nMode) { case 0: // Undo a "case 7" journal file encryption case 2: // Reload a page case 3: // Load a page if (HasReadKey(pCodec)) Decrypt(pCodec, nPageNum, (unsigned char*) data); break; case 6: // Encrypt a page for the main database file if (HasWriteKey(pCodec)) data = Encrypt(pCodec, nPageNum, (unsigned char*) data, 1); break; case 7: // Encrypt a page for the journal file /* *Under normal circumstances, the readkey is the same as the writekey. However, *when the database is being rekeyed, the readkey is not the same as the writekey. *(The writekey is the "destination key" for the rekey operation and the readkey *is the key the db is currently encrypted with) *Therefore, for case 7, when the rollback is being written, always encrypt using *the database's readkey, which is guaranteed to be the same key that was used to *read and write the original data. */ if (HasReadKey(pCodec)) data = Encrypt(pCodec, nPageNum, (unsigned char*) data, 0); break; } HandleError(pCodec); return data; } int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *zKey, int nKey) { void *pCodec = NULL; if (zKey == NULL || nKey <= 0) { // No key specified, could mean either use the main db's encryption or no encryption if (nDb != 0 && nKey < 0) { //Is an attached database, therefore use the key of main database, if main database is encrypted void *pMainCodec = sqlite3PagerGetCodec(sqlite3BtreePager(db->aDb[0].pBt)); if (pMainCodec != NULL) { pCodec = InitializeFromOtherCodec(pMainCodec, db); sqlite3PagerSetCodec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, sqlite3CodecSizeChange, sqlite3PagerFreeCodec, pCodec); } } } else { // Key specified, setup encryption key for database pCodec = InitializeNewCodec(db); GenerateWriteKey(pCodec, (const char*) zKey, nKey); SetReadIsWrite(pCodec); sqlite3PagerSetCodec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, sqlite3CodecSizeChange, sqlite3PagerFreeCodec, pCodec); } if (HandleError(pCodec)) return SQLITE_ERROR; return SQLITE_OK; } void sqlite3CodecGetKey(sqlite3* db, int nDb, void **zKey, int *nKey) { // The unencrypted password is not stored for security reasons // therefore always return NULL *zKey = NULL; *nKey = -1; } int sqlite3_key(sqlite3 *db, const void *zKey, int nKey) { // The key is only set for the main database, not the temp database return sqlite3CodecAttach(db, 0, zKey, nKey); } int sqlite3_rekey(sqlite3 *db, const void *zKey, int nKey) { // Changes the encryption key for an existing database. int rc = SQLITE_ERROR; Btree *pbt = db->aDb[0].pBt; Pager *pPager = sqlite3BtreePager(pbt); void *pCodec = sqlite3PagerGetCodec(pPager); if ((zKey == NULL || nKey == 0) && pCodec == NULL) { // Database not encrypted and key not specified. Do nothing return SQLITE_OK; } if (pCodec == NULL) { // Database not encrypted, but key specified. Encrypt database pCodec = InitializeNewCodec(db); GenerateWriteKey(pCodec, (const char*) zKey, nKey); if (HandleError(pCodec)) return SQLITE_ERROR; sqlite3PagerSetCodec(pPager, sqlite3Codec, sqlite3CodecSizeChange, sqlite3PagerFreeCodec, pCodec); } else if (zKey == NULL || nKey == 0) { // Database encrypted, but key not specified. Decrypt database // Keep read key, drop write key DropWriteKey(pCodec); } else { // Database encrypted and key specified. Re-encrypt database with new key // Keep read key, change write key to new key GenerateWriteKey(pCodec, (const char*) zKey, nKey); if (HandleError(pCodec)) return SQLITE_ERROR; } // Start transaction rc = sqlite3BtreeBeginTrans(pbt, 1); if (rc == SQLITE_OK) { // Rewrite all pages using the new encryption key (if specified) int nPageCount = -1; sqlite3PagerPagecount(pPager, &nPageCount); Pgno nPage = (Pgno) nPageCount; Pgno nSkip = PAGER_MJ_PGNO(pPager); DbPage *pPage; Pgno n; for (n = 1; rc == SQLITE_OK && n <= nPage; n++) { if (n == nSkip) continue; rc = sqlite3PagerGet(pPager, n, &pPage); if (!rc) { rc = sqlite3PagerWrite(pPage); sqlite3PagerUnref(pPage); } else sqlite3Error(db, SQLITE_ERROR, "%s", "Error while rekeying database page. Transaction Canceled."); } } else sqlite3Error(db, SQLITE_ERROR, "%s", "Error beginning rekey transaction. Make sure that the current encryption key is correct."); if (rc == SQLITE_OK) { // All good, commit rc = sqlite3BtreeCommit(pbt); if (rc == SQLITE_OK) { //Database rekeyed and committed successfully, update read key if (HasWriteKey(pCodec)) SetReadIsWrite(pCodec); else //No write key == no longer encrypted sqlite3PagerSetCodec(pPager, NULL, NULL, NULL, NULL); } else { //FIXME: can't trigger this, not sure if rollback is needed, reference implementation didn't rollback sqlite3Error(db, SQLITE_ERROR, "%s", "Could not commit rekey transaction."); } } else { // Rollback, rekey failed sqlite3BtreeRollback(pbt, SQLITE_ERROR); // go back to read key if (HasReadKey(pCodec)) SetWriteIsRead(pCodec); else //Database wasn't encrypted to start with sqlite3PagerSetCodec(pPager, NULL, NULL, NULL, NULL); } return rc; } #endif // SQLITE_HAS_CODEC #endif // SQLITE_OMIT_DISKIO botan-2.4.0/src/contrib/sqlite/readme.txt000066400000000000000000000021741322470703100203510ustar00rootroot00000000000000Build instructions for BotanSqlite3 --- Requirements: 1. Botan 1.9.0 or later 2. SQLite3 amalgamation source, version 3.7.12.1 or later (previous versions may work, some will need minor changes) Building: 1. Extract sqlite3 amalgamation to a directory and add BotanSqlite3 source files If desired, codec.h can be modified to tweak the encryption algothrithms and parameters. (Defaults to Twofish/XTS with 256 bit key) 2. Apply the patch "sqlite3.diff": $ patch -p0 < sqlite3-amalgamation.patch If the patching fails for some reason (ie, changes in SQLite3), it should be trivial to do it manually. 3. Compile the sqlite3 library with Botan encryption support: $ gcc -c sqlite3.c -o botansqlite3.o && gcc -c codec.cpp -o codec.o `pkg-config --cflags botan-1.10` && ar rcs libbotansqlite3.a botansqlite3.o codec.o (replace "botan-1.10" with appropriate version) Testing: 1. Build the test: $ g++ test_sqlite.cpp -o test_sqlite `botan-config-1.10 --libs` ./libbotansqlite3.a (replace botan-config-1.10 w/ appropriate version) 2. Run the test $ ./test_sqlite 3. Look for "All seems good" botan-2.4.0/src/contrib/sqlite/sqlite3-amalgamation.patch000066400000000000000000000011121322470703100233770ustar00rootroot00000000000000--- ./sqlite3.c.orig 2011-05-12 10:03:32.051879390 +0800 +++ ./sqlite3.c 2011-05-12 10:09:04.028550281 +0800 @@ -17,6 +17,7 @@ ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. */ +#define SQLITE_HAS_CODEC 1 #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 #ifndef SQLITE_PRIVATE @@ -125956,3 +125957,4 @@ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ /************** End of fts3_icu.c ********************************************/ +#include "codecext.c" botan-2.4.0/src/contrib/sqlite/test_sqlite.cpp000066400000000000000000000102201322470703100214060ustar00rootroot00000000000000/* * Quick and dirty test for SQLite3 encryption codec. * (C) 2010 Olivier de Gaalon * * Botan is released under the Simplified BSD License (see license.txt) */ #define SQLITE_HAS_CODEC 1 #include #include namespace SQL { const char * CREATE_TABLE_TEST = "create table 'test' (id INTEGER PRIMARY KEY, name TEXT, creationtime TEXT);"; const char * CREATE_TABLE_TEST2 = "create table 'test2' (id INTEGER PRIMARY KEY, name TEXT, creationtime TEXT);"; const char * INSERT_INTO_TEST = "INSERT INTO test (name, creationtime) VALUES ('widget', '1st time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '2nd time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '3rd time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '4th time');\ INSERT INTO test (name, creationtime) VALUES ('widget', '5th time');"; const char * INSERT_INTO_TEST2 = "INSERT INTO test2 (name, creationtime) VALUES ('widget2', '1st time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '2nd time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '3rd time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '4th time2');\ INSERT INTO test2 (name, creationtime) VALUES ('widget2', '5th time2');"; const char * SELECT_FROM_TEST = "SELECT * FROM test;"; const char * SELECT_FROM_TEST2 = "SELECT * FROM test2;"; }; static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "\t"); for(i=0; i #include class ASN1_Parser final : public Botan::ASN1_Formatter { public: ASN1_Parser() : Botan::ASN1_Formatter(true) {} protected: std::string format(Botan::ASN1_Tag, Botan::ASN1_Tag, size_t, size_t, const std::string&) const override { return ""; } std::string format_bin(Botan::ASN1_Tag, Botan::ASN1_Tag, const std::vector&) const override { return ""; } }; void fuzz(const uint8_t in[], size_t len) { try { /* * Here we use an uninitialized ofstream so the fuzzer doesn't spend time * on actual output formatting, no memory is allocated, etc. */ std::ofstream out; ASN1_Parser printer; printer.print_to_stream(out, in, len); } catch(Botan::Exception& e) { } } botan-2.4.0/src/fuzzer/bn_sqr.cpp000066400000000000000000000006601322470703100167250ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include void fuzz(const uint8_t in[], size_t len) { if(len > 8192/8) return; Botan::BigInt x = Botan::BigInt::decode(in, len); Botan::BigInt x_sqr = square(x); Botan::BigInt x_mul = x * x; FUZZER_ASSERT_EQUAL(x_sqr, x_mul); } botan-2.4.0/src/fuzzer/cert.cpp000066400000000000000000000006621322470703100164000ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include void fuzz(const uint8_t in[], size_t len) { if(len > max_fuzzer_input_size) return; try { Botan::DataSource_Memory input(in, len); Botan::X509_Certificate cert(input); } catch(Botan::Exception& e) { } } botan-2.4.0/src/fuzzer/crl.cpp000066400000000000000000000005661322470703100162260ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include void fuzz(const uint8_t in[], size_t len) { try { Botan::DataSource_Memory input(in, len); Botan::X509_CRL crl(input); } catch(Botan::Exception& e) {} } botan-2.4.0/src/fuzzer/divide.cpp000066400000000000000000000010741322470703100167050ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include void fuzz(const uint8_t in[], size_t len) { if(len % 2 == 1 || len > 2*4096/8) return; const Botan::BigInt x = Botan::BigInt::decode(in, len / 2); const Botan::BigInt y = Botan::BigInt::decode(in + len / 2, len / 2); if(y == 0) return; Botan::BigInt q, r; Botan::divide(x, y, q, r); FUZZER_ASSERT_TRUE(r < y); Botan::BigInt z = q*y + r; FUZZER_ASSERT_EQUAL(z, x); } botan-2.4.0/src/fuzzer/ecc_bp256.cpp000066400000000000000000000005151322470703100171100ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "ecc_helper.h" void fuzz(const uint8_t in[], size_t len) { if(len > 2*256/8) return; static Botan::EC_Group bp256("brainpool256r1"); return check_ecc_math(bp256, in, len); } botan-2.4.0/src/fuzzer/ecc_helper.h000066400000000000000000000030441322470703100171760ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef ECC_HELPERS_H_ #define ECC_HELPERS_H_ #include "fuzzers.h" #include #include #include namespace { inline std::ostream& operator<<(std::ostream& o, const Botan::PointGFp& point) { o << point.get_affine_x() << "," << point.get_affine_y(); return o; } void check_ecc_math(const Botan::EC_Group& group, const uint8_t in[], size_t len) { // These depend only on the group, which is also static static const Botan::PointGFp base_point = group.get_base_point(); static Botan::Blinded_Point_Multiply blind(base_point, group.get_order(), 4); const size_t hlen = len / 2; const Botan::BigInt a = Botan::BigInt::decode(in, hlen); const Botan::BigInt b = Botan::BigInt::decode(in + hlen, len - hlen); const Botan::BigInt c = a + b; const Botan::PointGFp P = base_point * a; const Botan::PointGFp Q = base_point * b; const Botan::PointGFp R = base_point * c; const Botan::PointGFp A1 = P + Q; const Botan::PointGFp A2 = Q + P; FUZZER_ASSERT_EQUAL(A1, A2); const Botan::PointGFp P1 = blind.blinded_multiply(a, fuzzer_rng()); const Botan::PointGFp Q1 = blind.blinded_multiply(b, fuzzer_rng()); const Botan::PointGFp R1 = blind.blinded_multiply(c, fuzzer_rng()); const Botan::PointGFp S1 = P1 + Q1; const Botan::PointGFp S2 = Q1 + P1; FUZZER_ASSERT_EQUAL(S1, S2); FUZZER_ASSERT_EQUAL(S1, A1); } } #endif botan-2.4.0/src/fuzzer/ecc_p256.cpp000066400000000000000000000005051322470703100167450ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "ecc_helper.h" void fuzz(const uint8_t in[], size_t len) { if(len > 2*256/8) return; static Botan::EC_Group p256("secp256r1"); return check_ecc_math(p256, in, len); } botan-2.4.0/src/fuzzer/ecc_p384.cpp000066400000000000000000000005051322470703100167470ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "ecc_helper.h" void fuzz(const uint8_t in[], size_t len) { if(len > 2*384/8) return; static Botan::EC_Group p384("secp384r1"); return check_ecc_math(p384, in, len); } botan-2.4.0/src/fuzzer/ecc_p521.cpp000066400000000000000000000005111322470703100167350ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "ecc_helper.h" void fuzz(const uint8_t in[], size_t len) { if(len > 2*(521+7)/8) return; static Botan::EC_Group p521("secp521r1"); return check_ecc_math(p521, in, len); } botan-2.4.0/src/fuzzer/fuzzers.h000066400000000000000000000056021322470703100166170ustar00rootroot00000000000000/* * (C) 2015,2016,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FUZZER_DRIVER_H_ #define BOTAN_FUZZER_DRIVER_H_ #include #include // for setenv #include #include #include #include static const size_t max_fuzzer_input_size = 8192; extern void fuzz(const uint8_t in[], size_t len); extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv); extern "C" int LLVMFuzzerTestOneInput(const uint8_t in[], size_t len); extern "C" int LLVMFuzzerInitialize(int *, char ***) { /* * This disables the mlock pool, as overwrites within the pool are * opaque to ASan or other instrumentation. */ ::setenv("BOTAN_MLOCK_POOL_SIZE", "0", 1); return 0; } // Called by main() in libFuzzer or in main for AFL below extern "C" int LLVMFuzzerTestOneInput(const uint8_t in[], size_t len) { if(len <= max_fuzzer_input_size) { fuzz(in, len); } return 0; } // Some helpers for the fuzzer jigs inline Botan::RandomNumberGenerator& fuzzer_rng() { static Botan::ChaCha_RNG rng(Botan::secure_vector(32)); return rng; } #define FUZZER_WRITE_AND_CRASH(expr) \ do { std::cerr << expr; abort(); } while(0) #define FUZZER_ASSERT_EQUAL(x, y) do { \ if(x != y) { \ FUZZER_WRITE_AND_CRASH(#x << " = " << x << " !=\n" \ << #y << " = " << y << "\n"); \ } } while(0) #define FUZZER_ASSERT_TRUE(e) \ do { \ if(!(e)) { \ FUZZER_WRITE_AND_CRASH("Expression " << #e << " was false"); \ } } while(0) #if defined(BOTAN_FUZZER_IS_AFL) || defined(BOTAN_FUZZER_IS_TEST) /* Stub for AFL */ #if defined(BOTAN_FUZZER_IS_AFL) && !defined(__AFL_COMPILER) #error "Build configured for AFL but not being compiled by AFL compiler" #endif int main(int argc, char* argv[]) { LLVMFuzzerInitialize(&argc, &argv); #if defined(__AFL_LOOP) while(__AFL_LOOP(1000)) #endif { std::vector buf(max_fuzzer_input_size); std::cin.read((char*)buf.data(), buf.size()); const size_t got = std::cin.gcount(); buf.resize(got); buf.shrink_to_fit(); LLVMFuzzerTestOneInput(buf.data(), got); } } #elif defined(BOTAN_FUZZER_IS_KLEE) #include int main(int argc, char* argv[]) { LLVMFuzzerInitialize(&argc, &argv); uint8_t input[max_fuzzer_input_size] = { 0 }; klee_make_symbolic(&input, sizeof(input), "input"); size_t input_len = klee_range(0, sizeof(input), "input_len"); LLVMFuzzerTestOneInput(input, input_len); } #endif #endif botan-2.4.0/src/fuzzer/invert.cpp000066400000000000000000000037351322470703100167560ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include namespace { Botan::BigInt inverse_mod_ref(const Botan::BigInt& n, const Botan::BigInt& mod) { if(n == 0) return 0; Botan::BigInt u = mod, v = n; Botan::BigInt B = 0, D = 1; while(u.is_nonzero()) { const size_t u_zero_bits = low_zero_bits(u); u >>= u_zero_bits; for(size_t i = 0; i != u_zero_bits; ++i) { //B.cond_sub(B.is_odd(), mod); if(B.is_odd()) { B -= mod; } B >>= 1; } const size_t v_zero_bits = low_zero_bits(v); v >>= v_zero_bits; for(size_t i = 0; i != v_zero_bits; ++i) { if(D.is_odd()) { D -= mod; } D >>= 1; } if(u >= v) { u -= v; B -= D; } else { v -= u; D -= B; } } if(v != 1) return 0; // no modular inverse while(D.is_negative()) D += mod; while(D >= mod) D -= mod; return D; } } void fuzz(const uint8_t in[], size_t len) { if(len % 2 == 1 || len > 2*4096/8) return; const Botan::BigInt x = Botan::BigInt::decode(in, len / 2); Botan::BigInt mod = Botan::BigInt::decode(in + len / 2, len / 2); mod.set_bit(0); if(mod < 3 || x >= mod) return; Botan::BigInt ref = inverse_mod_ref(x, mod); Botan::BigInt ct = Botan::ct_inverse_mod_odd_modulus(x, mod); //Botan::BigInt mon = Botan::normalized_montgomery_inverse(x, mod); if(ref != ct) { FUZZER_WRITE_AND_CRASH("X = " << x << "\n" << "P = " << mod << "\n" << "GCD = " << gcd(x, mod) << "\n" << "Ref = " << ref << "\n" << "CT = " << ct << "\n" << "RefCheck = " << (ref*ref)%mod << "\n" << "CTCheck = " << (ct*ct)%mod << "\n"); } } botan-2.4.0/src/fuzzer/ocsp.cpp000066400000000000000000000004651322470703100164100ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include void fuzz(const uint8_t in[], size_t len) { try { Botan::OCSP::Response response(in, len); } catch(Botan::Exception& e) { } } botan-2.4.0/src/fuzzer/os2ecp.cpp000066400000000000000000000021041322470703100166270ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include namespace { void check_os2ecp(const Botan::EC_Group& group, const uint8_t in[], size_t len) { try { Botan::PointGFp point = Botan::OS2ECP(in, len, group.get_curve()); } catch(Botan::Exception& e) {} } } void fuzz(const uint8_t in[], size_t len) { if(len >= 256) return; static Botan::EC_Group p192("secp192r1"); static Botan::EC_Group p224("secp224r1"); static Botan::EC_Group p256("secp256r1"); static Botan::EC_Group p384("secp384r1"); static Botan::EC_Group p521("secp521r1"); static Botan::EC_Group bp256("brainpool256r1"); static Botan::EC_Group bp512("brainpool512r1"); check_os2ecp(p192, in, len); check_os2ecp(p224, in, len); check_os2ecp(p256, in, len); check_os2ecp(p384, in, len); check_os2ecp(p521, in, len); check_os2ecp(p521, in, len); check_os2ecp(bp256, in, len); check_os2ecp(bp512, in, len); } botan-2.4.0/src/fuzzer/pkcs1.cpp000066400000000000000000000037201322470703100164620ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include namespace { std::vector simple_pkcs1_unpad(const uint8_t in[], size_t len) { if(len < 10) throw Botan::Decoding_Error("bad len"); if(in[0] != 0 || in[1] != 2) throw Botan::Decoding_Error("bad header field"); for(size_t i = 2; i < len; ++i) { if(in[i] == 0) { if(i < 10) // at least 8 padding bytes required throw Botan::Decoding_Error("insufficient padding bytes"); return std::vector(in + i + 1, in + len); } } throw Botan::Decoding_Error("delim not found"); } } void fuzz(const uint8_t in[], size_t len) { static Botan::EME_PKCS1v15 pkcs1; Botan::secure_vector lib_result; std::vector ref_result; bool lib_rejected = false, ref_rejected = false; try { uint8_t valid_mask = 0; Botan::secure_vector decoded = (static_cast(&pkcs1))->unpad(valid_mask, in, len); if(valid_mask == 0) lib_rejected = true; else if(valid_mask == 0xFF) lib_rejected = false; else FUZZER_WRITE_AND_CRASH("Invalid valid_mask from unpad"); } catch(Botan::Decoding_Error&) { lib_rejected = true; } try { ref_result = simple_pkcs1_unpad(in, len); } catch(Botan::Decoding_Error& e) { ref_rejected = true; } if(lib_rejected == true && ref_rejected == false) { FUZZER_WRITE_AND_CRASH("Library rejected input accepted by ref " << Botan::hex_encode(ref_result)); } else if(ref_rejected == true && lib_rejected == false) { FUZZER_WRITE_AND_CRASH("Library accepted input rejected by ref " << Botan::hex_encode(lib_result)); } // otherwise the two implementations agree } botan-2.4.0/src/fuzzer/pkcs8.cpp000066400000000000000000000007451322470703100164750ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include #include void fuzz(const uint8_t in[], size_t len) { try { Botan::DataSource_Memory input(in, len); Botan::Null_RNG null_rng; std::unique_ptr key(Botan::PKCS8::load_key(input, null_rng)); } catch(Botan::Exception& e) { } } botan-2.4.0/src/fuzzer/pow_mod.cpp000066400000000000000000000031441322470703100171050ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include #include namespace { Botan::BigInt simple_power_mod(Botan::BigInt x, Botan::BigInt n, const Botan::BigInt& p, const Botan::Modular_Reducer& mod_p) { if(n == 0) { if(p == 1) return 0; return 1; } Botan::BigInt y = 1; while(n > 1) { if(n.is_odd()) { y = mod_p.multiply(x, y); } x = mod_p.square(x); n >>= 1; } return mod_p.multiply(x, y); } } void fuzz(const uint8_t in[], size_t len) { static const size_t p_bits = 1024; static const Botan::BigInt p = random_prime(fuzzer_rng(), p_bits); static Botan::Modular_Reducer mod_p(p); if(len == 0 || len > p_bits/8) return; try { const Botan::BigInt g = Botan::BigInt::decode(in, len / 2); const Botan::BigInt x = Botan::BigInt::decode(in + len / 2, len / 2); const Botan::BigInt ref = simple_power_mod(g, x, p, mod_p); const Botan::BigInt z = Botan::power_mod(g, x, p); if(ref != z) { FUZZER_WRITE_AND_CRASH("G = " << g << "\n" << "X = " << x << "\n" << "P = " << p << "\n" << "Z = " << z << "\n" << "R = " << ref << "\n"); } } catch(Botan::Exception& e) {} } botan-2.4.0/src/fuzzer/redc_helper.h000066400000000000000000000013601322470703100173600ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FUZZ_REDC_HELPERS_H_ #define BOTAN_FUZZ_REDC_HELPERS_H_ #include "fuzzers.h" #include #include namespace { void check_redc(std::function&)> redc_fn, const Botan::Modular_Reducer& redc, const Botan::BigInt& prime, const Botan::BigInt& x) { const Botan::BigInt v1 = x % prime; const Botan::BigInt v2 = redc.reduce(x); Botan::secure_vector ws; Botan::BigInt v3 = x; redc_fn(v3, ws); FUZZER_ASSERT_EQUAL(v1, v2); FUZZER_ASSERT_EQUAL(v2, v3); } } #endif botan-2.4.0/src/fuzzer/redc_p192.cpp000066400000000000000000000011141322470703100171240ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "redc_helper.h" #include void fuzz(const uint8_t in[], size_t len) { if(len > 2*192/8) return; static const Botan::BigInt& prime = Botan::prime_p192(); static const Botan::BigInt prime_2 = prime * prime; static Botan::Modular_Reducer prime_redc(prime); Botan::BigInt x = Botan::BigInt::decode(in, len); if(x < prime_2) { check_redc(Botan::redc_p192, prime_redc, prime, x); } } botan-2.4.0/src/fuzzer/redc_p224.cpp000066400000000000000000000010501322470703100171170ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "redc_helper.h" #include void fuzz(const uint8_t in[], size_t len) { static const Botan::BigInt& prime = Botan::prime_p224(); static const Botan::BigInt prime_2 = prime * prime; static Botan::Modular_Reducer prime_redc(prime); Botan::BigInt x = Botan::BigInt::decode(in, len); if(x < prime_2) { check_redc(Botan::redc_p224, prime_redc, prime, x); } } botan-2.4.0/src/fuzzer/redc_p256.cpp000066400000000000000000000011141322470703100171250ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "redc_helper.h" #include void fuzz(const uint8_t in[], size_t len) { if(len > 2*256/8) return; static const Botan::BigInt& prime = Botan::prime_p256(); static const Botan::BigInt prime_2 = prime * prime; static Botan::Modular_Reducer prime_redc(prime); Botan::BigInt x = Botan::BigInt::decode(in, len); if(x < prime_2) { check_redc(Botan::redc_p256, prime_redc, prime, x); } } botan-2.4.0/src/fuzzer/redc_p384.cpp000066400000000000000000000011141322470703100171270ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "redc_helper.h" #include void fuzz(const uint8_t in[], size_t len) { if(len > 2*384/8) return; static const Botan::BigInt& prime = Botan::prime_p384(); static const Botan::BigInt prime_2 = prime * prime; static Botan::Modular_Reducer prime_redc(prime); Botan::BigInt x = Botan::BigInt::decode(in, len); if(x < prime_2) { check_redc(Botan::redc_p384, prime_redc, prime, x); } } botan-2.4.0/src/fuzzer/redc_p521.cpp000066400000000000000000000011201322470703100171150ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include "redc_helper.h" #include void fuzz(const uint8_t in[], size_t len) { if(len > 2*(521+7)/8) return; static const Botan::BigInt& prime = Botan::prime_p521(); static const Botan::BigInt prime_2 = prime * prime; static Botan::Modular_Reducer prime_redc(prime); Botan::BigInt x = Botan::BigInt::decode(in, len); if(x < prime_2) { check_redc(Botan::redc_p521, prime_redc, prime, x); } } botan-2.4.0/src/fuzzer/ressol.cpp000066400000000000000000000021661322470703100167530ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include void fuzz(const uint8_t in[], size_t len) { // Ressol is mostly used for ECC point decompression so best to test smaller sizes static const size_t p_bits = 256; static const Botan::BigInt p = random_prime(fuzzer_rng(), p_bits); static const Botan::Modular_Reducer mod_p(p); if(len > p_bits / 8) return; try { const Botan::BigInt a = Botan::BigInt::decode(in, len); Botan::BigInt a_sqrt = Botan::ressol(a, p); if(a_sqrt > 0) { const Botan::BigInt a_redc = mod_p.reduce(a); const Botan::BigInt z = mod_p.square(a_sqrt); if(z != a_redc) { FUZZER_WRITE_AND_CRASH("A = " << a << "\n" << "P = " << p << "\n" << "R = " << a_sqrt << "\n" << "Z = " << z << "\n"); } } } catch(Botan::Exception& e) {} return; } botan-2.4.0/src/fuzzer/tls_client.cpp000066400000000000000000000032071322470703100176010ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include class Fuzzer_TLS_Client_Creds : public Botan::Credentials_Manager { public: std::string psk_identity_hint(const std::string&, const std::string&) override { return "psk_hint"; } std::string psk_identity(const std::string&, const std::string&, const std::string&) override { return "psk_id"; } Botan::SymmetricKey psk(const std::string&, const std::string&, const std::string&) override { return Botan::SymmetricKey("AABBCCDDEEFF00112233445566778899"); } }; void fuzz(const uint8_t in[], size_t len) { if(len == 0) return; auto dev_null = [](const uint8_t[], size_t) {}; auto ignore_alerts = [](Botan::TLS::Alert, const uint8_t[], size_t) {}; auto ignore_hs = [](const Botan::TLS::Session&) { abort(); return true; }; Botan::TLS::Session_Manager_Noop session_manager; Botan::TLS::Policy policy; Botan::TLS::Protocol_Version client_offer = Botan::TLS::Protocol_Version::TLS_V12; Botan::TLS::Server_Information info("server.name", 443); Fuzzer_TLS_Client_Creds creds; Botan::TLS::Client client(dev_null, dev_null, ignore_alerts, ignore_hs, session_manager, creds, policy, fuzzer_rng(), info, client_offer); try { client.received_data(in, len); } catch(std::exception& e) { } } botan-2.4.0/src/fuzzer/tls_client_hello.cpp000066400000000000000000000005371322470703100207670ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include void fuzz(const uint8_t in[], size_t len) { try { std::vector v(in, in + len); Botan::TLS::Client_Hello ch(v); } catch(Botan::Exception& e) {} } botan-2.4.0/src/fuzzer/tls_server.cpp000066400000000000000000000143121322470703100176300ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "fuzzers.h" #include #include const char* fixed_rsa_key = "-----BEGIN PRIVATE KEY-----\n" "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCe6qqpMQVJ7zCJ\n" "oSnpxia0yO6M7Ie3FGqPcd0DzueC+kWPvuHQ+PpP5vfO6qqRaDVII37PFX5NUZQm\n" "GK/rAm7spjIHTCMgqSZ8pN13LU8m1gDwIdu9al16LXN9zZjB67uLlFn2trtLi234\n" "i0cnyeF8IC0cz7tgCOzMSVEBcqJjkdgGrZ3WUgOXecVm2lXVrYlEiaSxFp4VOE9k\n" "RFeVrELCjmNtc4hRd1yJsF+vObCtvyqGYQE1Qcb0MVSQDBHMkiUVmO6zuW7td5ef\n" "O/1OyntQJGyVa+SnWbkSLCybta2J7MreHENrF5GA0K1KL140SNRHeWifRMuNQua7\n" "qmKXMBTFAgMBAAECggEAIk3fxyQI0zvpy1vZ01ft1QqmzA7nAPNMSWi33/GS8iga\n" "SfxXfKeySPs/tQ/dAARxs//NiOBH4mLgyxR7LQzaawU5OXALCSraXv+ruuUx990s\n" "WKnGaG4EfbJAAwEVn47Gbkv425P4fEc91vAhzQn8PbIoatbAyOtESpjs/pYDTeC/\n" "mnJId8gqO90cqyRECEMjk9sQ8iEjWPlik4ayGlUVbeeMu6/pJ9F8IZEgkLZiNDAB\n" "4anmOFaT7EmqUjI4IlcaqfbbXyDXlvWUYukidEss+CNvPuqbQHBDnpFVvBxdDR2N\n" "Uj2D5Xd5blcIe2/+1IVRnznjoQ5zvutzb7ThBmMehQKBgQDOITKG0ht2kXLxjVoR\n" "r/pVpx+f3hs3H7wE0+vrLHoQgkVjpMWXQ47YuZTT9rCOOYNI2cMoH2D27t1j78/B\n" "9kGYABUVpvQQ+6amqJDI1eYI6e68TPueEDjeALfSCdmPNiI3lZZrCIK9XLpkoy8K\n" "tGYBRRJ+JJxjj1zPXj9SGshPgwKBgQDFXUtoxY3mCStH3+0b1qxGG9r1L5goHEmd\n" "Am8WBYDheNpL0VqPNzouhuM/ZWMGyyAs/py6aLATe+qhR1uX5vn7LVZwjCSONZ4j\n" "7ieEEUh1BHetPI1oI5PxgokRYfVuckotqVseanI/536Er3Yf2FXNQ1/ceVp9WykX\n" "3mYTKMhQFwKBgQDKakcXpZNaZ5IcKdZcsBZ/rdGcR5sqEnursf9lvRNQytwg8Vkn\n" "JSxNHlBLpV/TCh8lltHRwJ6TXhUBYij+KzhWbx5FWOErHDOWTMmArqtp7W6GcoJT\n" "wVJWjxXzp8CApYQMWVSQXpckJL7UvHohZO0WKiHyxTjde5aD++TqV2qEyQKBgBbD\n" "jvoTpy08K4DLxCZs2Uvw1I1pIuylbpwsdrGciuP2s38BM6fHH+/T4Qwj3osfDKQD\n" "7gHWJ1Dn/wUBHQBlRLoC3bB3iZPZfVb5lhc2gxv0GvWhQVIcoGi/vJ2DpfJKPmIL\n" "4ZWdg3X5dm9JaZ98rVDSj5D3ckd5J0E4hp95GbmbAoGBAJJHM4O9lx60tIjw9Sf/\n" "QmKWyUk0NLnt8DcgRMW7fVxtzPNDy9DBKGIkDdWZ2s+ForICA3C9WSxBC1EOEHGG\n" "xkg2xKt66CeutGroP6M191mHQrRClt1VbEYzQFX21BCk5kig9i/BURyoTHtFiV+t\n" "kbf4VLg8Vk9u/R3RU1HsYWhe\n" "-----END PRIVATE KEY-----\n"; const char* fixed_rsa_cert = "-----BEGIN CERTIFICATE-----\n" "MIIDUDCCAjgCCQD7pIb1ZsoafjANBgkqhkiG9w0BAQsFADBqMQswCQYDVQQGEwJW\n" "VDEQMA4GA1UECAwHVmVybW9udDEWMBQGA1UEBwwNVGhlIEludGVybmV0czEUMBIG\n" "A1UECgwLTWFuZ29zIFIgVXMxGzAZBgNVBAMMEnNlcnZlci5leGFtcGxlLmNvbTAe\n" "Fw0xNjAxMDYxNzQ3MjNaFw0yNjAxMDMxNzQ3MjNaMGoxCzAJBgNVBAYTAlZUMRAw\n" "DgYDVQQIDAdWZXJtb250MRYwFAYDVQQHDA1UaGUgSW50ZXJuZXRzMRQwEgYDVQQK\n" "DAtNYW5nb3MgUiBVczEbMBkGA1UEAwwSc2VydmVyLmV4YW1wbGUuY29tMIIBIjAN\n" "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnuqqqTEFSe8wiaEp6cYmtMjujOyH\n" "txRqj3HdA87ngvpFj77h0Pj6T+b3zuqqkWg1SCN+zxV+TVGUJhiv6wJu7KYyB0wj\n" "IKkmfKTddy1PJtYA8CHbvWpdei1zfc2Yweu7i5RZ9ra7S4tt+ItHJ8nhfCAtHM+7\n" "YAjszElRAXKiY5HYBq2d1lIDl3nFZtpV1a2JRImksRaeFThPZERXlaxCwo5jbXOI\n" "UXdcibBfrzmwrb8qhmEBNUHG9DFUkAwRzJIlFZjus7lu7XeXnzv9Tsp7UCRslWvk\n" "p1m5Eiwsm7WtiezK3hxDaxeRgNCtSi9eNEjUR3lon0TLjULmu6pilzAUxQIDAQAB\n" "MA0GCSqGSIb3DQEBCwUAA4IBAQA1eZGc/4V7z/E/6eG0hVkzoAZeuTcSP7WqBSx+\n" "OP2yh0163UYjoa6nehmkKYQQ9PbYPZGzIcl+dBFyYzy6jcp0NdtzpWnTFrjl4rMq\n" "akcQ1D0LTYjJXVP9G/vF/SvatOFeVTnQmLlLt/a8ZtRUINqejeZZPzH8ifzFW6tu\n" "mlhTVIEKyPHpxClh5Y3ubw/mZYygekFTqMkTx3FwJxKU8J6rYGZxanWAODUIvCUo\n" "Fxer1qC5Love3uWl3vXPLEZWZdORnExSRByzz2immBP2vX4zYZoeZRhTQ9ae1TIV\n" "Dk02a/1AOJZdZReDbgXhlqaUx5pk/rzo4mDzvu5HSCeXmClz\n" "-----END CERTIFICATE-----\n"; class Fuzzer_TLS_Server_Creds : public Botan::Credentials_Manager { public: Fuzzer_TLS_Server_Creds() { Botan::DataSource_Memory cert_in(fixed_rsa_cert); Botan::DataSource_Memory key_in(fixed_rsa_key); m_rsa_cert.reset(new Botan::X509_Certificate(cert_in)); //m_rsa_key.reset(Botan::PKCS8::load_key(key_in, fuzzer_rng()); } std::vector cert_chain( const std::vector& algos, const std::string& /*type*/, const std::string& /*hostname*/) override { std::vector v; for(auto algo : algos) { if(algo == "RSA") { v.push_back(*m_rsa_cert); break; } } return v; } Botan::Private_Key* private_key_for(const Botan::X509_Certificate& /*cert*/, const std::string& /*type*/, const std::string& /*context*/) override { return m_rsa_key.get(); } std::string psk_identity_hint(const std::string&, const std::string&) override { return "psk_hint"; } std::string psk_identity(const std::string&, const std::string&, const std::string&) override { return "psk_id"; } Botan::SymmetricKey psk(const std::string&, const std::string&, const std::string&) override { return Botan::SymmetricKey("AABBCCDDEEFF00112233445566778899"); } private: std::unique_ptr m_rsa_cert; std::unique_ptr m_rsa_key; }; void fuzz(const uint8_t in[], size_t len) { if(len == 0) return; auto dev_null = [](const uint8_t[], size_t) {}; auto ignore_alerts = [](Botan::TLS::Alert, const uint8_t[], size_t) {}; auto ignore_hs = [](const Botan::TLS::Session&) { return true; }; Botan::TLS::Session_Manager_Noop session_manager; Botan::TLS::Policy policy; Botan::TLS::Server_Information info("server.name", 443); Fuzzer_TLS_Server_Creds creds; auto next_proto_fn = [](const std::vector& protos) -> std::string { if(protos.size() > 1) return protos[0]; else return "fuzzed"; }; const bool is_datagram = (len % 2 == 0); Botan::TLS::Server server(dev_null, dev_null, ignore_alerts, ignore_hs, session_manager, creds, policy, fuzzer_rng(), next_proto_fn, is_datagram); try { server.received_data(in, len); } catch(std::exception& e) { } } botan-2.4.0/src/lib/000077500000000000000000000000001322470703100141545ustar00rootroot00000000000000botan-2.4.0/src/lib/asn1/000077500000000000000000000000001322470703100150165ustar00rootroot00000000000000botan-2.4.0/src/lib/asn1/alg_id.cpp000066400000000000000000000047551322470703100167540ustar00rootroot00000000000000/* * Algorithm Identifier * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const OID& alg_id, const std::vector& param) : oid(alg_id), parameters(param) {} /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const std::string& alg_id, const std::vector& param) : oid(OIDS::lookup(alg_id)), parameters(param) {} /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const OID& alg_id, Encoding_Option option) : oid(alg_id), parameters() { const uint8_t DER_NULL[] = { 0x05, 0x00 }; if(option == USE_NULL_PARAM) parameters.assign(DER_NULL, DER_NULL + 2); } /* * Create an AlgorithmIdentifier */ AlgorithmIdentifier::AlgorithmIdentifier(const std::string& alg_id, Encoding_Option option) : oid(OIDS::lookup(alg_id)), parameters() { const uint8_t DER_NULL[] = { 0x05, 0x00 }; if(option == USE_NULL_PARAM) parameters.assign(DER_NULL, DER_NULL + 2); } /* * Compare two AlgorithmIdentifiers */ namespace { bool param_null_or_empty(const std::vector& p) { if(p.size() == 2 && (p[0] == 0x05) && (p[1] == 0x00)) return true; return p.empty(); } } bool operator==(const AlgorithmIdentifier& a1, const AlgorithmIdentifier& a2) { if(a1.get_oid() != a2.get_oid()) return false; if(param_null_or_empty(a1.get_parameters()) && param_null_or_empty(a2.get_parameters())) return true; return (a1.get_parameters() == a2.get_parameters()); } /* * Compare two AlgorithmIdentifiers */ bool operator!=(const AlgorithmIdentifier& a1, const AlgorithmIdentifier& a2) { return !(a1 == a2); } /* * DER encode an AlgorithmIdentifier */ void AlgorithmIdentifier::encode_into(DER_Encoder& codec) const { codec.start_cons(SEQUENCE) .encode(get_oid()) .raw_bytes(get_parameters()) .end_cons(); } /* * Decode a BER encoded AlgorithmIdentifier */ void AlgorithmIdentifier::decode_from(BER_Decoder& codec) { codec.start_cons(SEQUENCE) .decode(oid) .raw_bytes(parameters) .end_cons(); } } botan-2.4.0/src/lib/asn1/alg_id.h000066400000000000000000000031061322470703100164060ustar00rootroot00000000000000/* * Algorithm Identifier * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ALGORITHM_IDENTIFIER_H_ #define BOTAN_ALGORITHM_IDENTIFIER_H_ #include #include #include #include namespace Botan { /** * Algorithm Identifier */ class BOTAN_PUBLIC_API(2,0) AlgorithmIdentifier final : public ASN1_Object { public: enum Encoding_Option { USE_NULL_PARAM }; void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; AlgorithmIdentifier() = default; AlgorithmIdentifier(const OID& oid, Encoding_Option enc); AlgorithmIdentifier(const std::string& oid_name, Encoding_Option enc); AlgorithmIdentifier(const OID& oid, const std::vector& params); AlgorithmIdentifier(const std::string& oid_name, const std::vector& params); const OID& get_oid() const { return oid; } const std::vector& get_parameters() const { return parameters; } /* * These values are public for historical reasons, but in a future release * they will be made private. Do not access them. */ OID oid; std::vector parameters; }; /* * Comparison Operations */ bool BOTAN_PUBLIC_API(2,0) operator==(const AlgorithmIdentifier&, const AlgorithmIdentifier&); bool BOTAN_PUBLIC_API(2,0) operator!=(const AlgorithmIdentifier&, const AlgorithmIdentifier&); } #endif botan-2.4.0/src/lib/asn1/asn1_attribute.cpp000066400000000000000000000021041322470703100204440ustar00rootroot00000000000000/* * Attribute * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Create an Attribute */ Attribute::Attribute(const OID& attr_oid, const std::vector& attr_value) : oid(attr_oid), parameters(attr_value) {} /* * Create an Attribute */ Attribute::Attribute(const std::string& attr_oid, const std::vector& attr_value) : oid(OIDS::lookup(attr_oid)), parameters(attr_value) {} /* * DER encode a Attribute */ void Attribute::encode_into(DER_Encoder& codec) const { codec.start_cons(SEQUENCE) .encode(oid) .start_cons(SET) .raw_bytes(parameters) .end_cons() .end_cons(); } /* * Decode a BER encoded Attribute */ void Attribute::decode_from(BER_Decoder& codec) { codec.start_cons(SEQUENCE) .decode(oid) .start_cons(SET) .raw_bytes(parameters) .end_cons() .end_cons(); } } botan-2.4.0/src/lib/asn1/asn1_attribute.h000066400000000000000000000017731322470703100201240ustar00rootroot00000000000000/* * ASN.1 Attribute * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASN1_ATTRIBUTE_H_ #define BOTAN_ASN1_ATTRIBUTE_H_ #include #include #include namespace Botan { /** * Attribute */ class BOTAN_PUBLIC_API(2,0) Attribute final : public ASN1_Object { public: void encode_into(class DER_Encoder& to) const override; void decode_from(class BER_Decoder& from) override; Attribute() = default; Attribute(const OID&, const std::vector&); Attribute(const std::string&, const std::vector&); const OID& get_oid() const { return oid; } const std::vector& get_parameters() const { return parameters; } /* * These values are public for historical reasons, but in a future release * they will be made private. Do not access them. */ OID oid; std::vector parameters; }; } #endif botan-2.4.0/src/lib/asn1/asn1_obj.cpp000066400000000000000000000053611322470703100172230ustar00rootroot00000000000000/* * ASN.1 Internals * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { std::string asn1_tag_to_string(ASN1_Tag type) { switch(type) { case Botan::SEQUENCE: return "SEQUENCE"; case Botan::SET: return "SET"; case Botan::PRINTABLE_STRING: return "PRINTABLE STRING"; case Botan::NUMERIC_STRING: return "NUMERIC STRING"; case Botan::IA5_STRING: return "IA5 STRING"; case Botan::T61_STRING: return "T61 STRING"; case Botan::UTF8_STRING: return "UTF8 STRING"; case Botan::VISIBLE_STRING: return "VISIBLE STRING"; case Botan::BMP_STRING: return "BMP STRING"; case Botan::UTC_TIME: return "UTC TIME"; case Botan::GENERALIZED_TIME: return "GENERALIZED TIME"; case Botan::OCTET_STRING: return "OCTET STRING"; case Botan::BIT_STRING: return "BIT STRING"; case Botan::ENUMERATED: return "ENUMERATED"; case Botan::INTEGER: return "INTEGER"; case Botan::NULL_TAG: return "NULL"; case Botan::OBJECT_ID: return "OBJECT"; case Botan::BOOLEAN: return "BOOLEAN"; default: return "TAG(" + std::to_string(static_cast(type)) + ")"; } } /* * BER Decoding Exceptions */ BER_Decoding_Error::BER_Decoding_Error(const std::string& str) : Decoding_Error("BER: " + str) {} BER_Bad_Tag::BER_Bad_Tag(const std::string& str, ASN1_Tag tag) : BER_Decoding_Error(str + ": " + std::to_string(tag)) {} BER_Bad_Tag::BER_Bad_Tag(const std::string& str, ASN1_Tag tag1, ASN1_Tag tag2) : BER_Decoding_Error(str + ": " + std::to_string(tag1) + "/" + std::to_string(tag2)) {} namespace ASN1 { /* * Put some arbitrary bytes into a SEQUENCE */ std::vector put_in_sequence(const std::vector& contents) { return DER_Encoder() .start_cons(SEQUENCE) .raw_bytes(contents) .end_cons() .get_contents_unlocked(); } /* * Convert a BER object into a string object */ std::string to_string(const BER_Object& obj) { return to_string(obj.value); } /* * Do heuristic tests for BER data */ bool maybe_BER(DataSource& source) { uint8_t first_u8; if(!source.peek_byte(first_u8)) { BOTAN_ASSERT_EQUAL(source.read_byte(first_u8), 0, "Expected EOF"); throw Stream_IO_Error("ASN1::maybe_BER: Source was empty"); } if(first_u8 == (SEQUENCE | CONSTRUCTED)) return true; return false; } } } botan-2.4.0/src/lib/asn1/asn1_obj.h000066400000000000000000000057211322470703100166700ustar00rootroot00000000000000/* * ASN.1 Internals * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASN1_H_ #define BOTAN_ASN1_H_ #include #include namespace Botan { class BER_Decoder; class DER_Encoder; /** * ASN.1 Type and Class Tags */ enum ASN1_Tag : uint32_t { UNIVERSAL = 0x00, APPLICATION = 0x40, CONTEXT_SPECIFIC = 0x80, CONSTRUCTED = 0x20, PRIVATE = CONSTRUCTED | CONTEXT_SPECIFIC, EOC = 0x00, BOOLEAN = 0x01, INTEGER = 0x02, BIT_STRING = 0x03, OCTET_STRING = 0x04, NULL_TAG = 0x05, OBJECT_ID = 0x06, ENUMERATED = 0x0A, SEQUENCE = 0x10, SET = 0x11, UTF8_STRING = 0x0C, NUMERIC_STRING = 0x12, PRINTABLE_STRING = 0x13, T61_STRING = 0x14, IA5_STRING = 0x16, VISIBLE_STRING = 0x1A, UNIVERSAL_STRING = 0x1C, BMP_STRING = 0x1E, UTC_TIME = 0x17, GENERALIZED_TIME = 0x18, UTC_OR_GENERALIZED_TIME = 0x19, NO_OBJECT = 0xFF00, DIRECTORY_STRING = 0xFF01 }; std::string BOTAN_DLL asn1_tag_to_string(ASN1_Tag type); /** * Basic ASN.1 Object Interface */ class BOTAN_PUBLIC_API(2,0) ASN1_Object { public: /** * Encode whatever this object is into to * @param to the DER_Encoder that will be written to */ virtual void encode_into(DER_Encoder& to) const = 0; /** * Decode whatever this object is from from * @param from the BER_Decoder that will be read from */ virtual void decode_from(BER_Decoder& from) = 0; ASN1_Object() = default; ASN1_Object(const ASN1_Object&) = default; ASN1_Object & operator=(const ASN1_Object&) = default; virtual ~ASN1_Object() = default; }; /** * BER Encoded Object */ class BOTAN_PUBLIC_API(2,0) BER_Object final { public: void assert_is_a(ASN1_Tag type_tag, ASN1_Tag class_tag) const; // public member variable: ASN1_Tag type_tag, class_tag; // public member variable: secure_vector value; }; /* * ASN.1 Utility Functions */ class DataSource; namespace ASN1 { std::vector put_in_sequence(const std::vector& val); std::string to_string(const BER_Object& obj); /** * Heuristics tests; is this object possibly BER? * @param src a data source that will be peeked at but not modified */ bool maybe_BER(DataSource& src); } /** * General BER Decoding Error Exception */ class BOTAN_PUBLIC_API(2,0) BER_Decoding_Error : public Decoding_Error { public: explicit BER_Decoding_Error(const std::string&); }; /** * Exception For Incorrect BER Taggings */ class BOTAN_PUBLIC_API(2,0) BER_Bad_Tag final : public BER_Decoding_Error { public: BER_Bad_Tag(const std::string& msg, ASN1_Tag tag); BER_Bad_Tag(const std::string& msg, ASN1_Tag tag1, ASN1_Tag tag2); }; } #endif botan-2.4.0/src/lib/asn1/asn1_oid.cpp000066400000000000000000000077471322470703100172360ustar00rootroot00000000000000/* * ASN.1 OID * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * ASN.1 OID Constructor */ OID::OID(const std::string& oid_str) { if(!oid_str.empty()) { try { m_id = parse_asn1_oid(oid_str); } catch(...) { throw Invalid_OID(oid_str); } if(m_id.size() < 2 || m_id[0] > 2) throw Invalid_OID(oid_str); if((m_id[0] == 0 || m_id[0] == 1) && m_id[1] > 39) throw Invalid_OID(oid_str); } } /* * Clear the current OID */ void OID::clear() { m_id.clear(); } /* * Return this OID as a string */ std::string OID::as_string() const { std::string oid_str; for(size_t i = 0; i != m_id.size(); ++i) { oid_str += std::to_string(m_id[i]); if(i != m_id.size() - 1) oid_str += "."; } return oid_str; } /* * OID equality comparison */ bool OID::operator==(const OID& oid) const { if(m_id.size() != oid.m_id.size()) return false; for(size_t i = 0; i != m_id.size(); ++i) if(m_id[i] != oid.m_id[i]) return false; return true; } /* * Append another component to the OID */ OID& OID::operator+=(uint32_t component) { m_id.push_back(component); return (*this); } /* * Append another component to the OID */ OID operator+(const OID& oid, uint32_t component) { OID new_oid(oid); new_oid += component; return new_oid; } /* * OID inequality comparison */ bool operator!=(const OID& a, const OID& b) { return !(a == b); } /* * Compare two OIDs */ bool operator<(const OID& a, const OID& b) { const std::vector& oid1 = a.get_id(); const std::vector& oid2 = b.get_id(); if(oid1.size() < oid2.size()) return true; if(oid1.size() > oid2.size()) return false; for(size_t i = 0; i != oid1.size(); ++i) { if(oid1[i] < oid2[i]) return true; if(oid1[i] > oid2[i]) return false; } return false; } /* * DER encode an OBJECT IDENTIFIER */ void OID::encode_into(DER_Encoder& der) const { if(m_id.size() < 2) throw Invalid_Argument("OID::encode_into: OID is invalid"); std::vector encoding; if(m_id[0] > 2 || m_id[1] >= 40) throw Encoding_Error("Invalid OID prefix, cannot encode"); encoding.push_back(static_cast(40 * m_id[0] + m_id[1])); for(size_t i = 2; i != m_id.size(); ++i) { if(m_id[i] == 0) encoding.push_back(0); else { size_t blocks = high_bit(m_id[i]) + 6; blocks = (blocks - (blocks % 7)) / 7; BOTAN_ASSERT(blocks > 0, "Math works"); for(size_t j = 0; j != blocks - 1; ++j) encoding.push_back(0x80 | ((m_id[i] >> 7*(blocks-j-1)) & 0x7F)); encoding.push_back(m_id[i] & 0x7F); } } der.add_object(OBJECT_ID, UNIVERSAL, encoding); } /* * Decode a BER encoded OBJECT IDENTIFIER */ void OID::decode_from(BER_Decoder& decoder) { BER_Object obj = decoder.get_next_object(); if(obj.type_tag != OBJECT_ID || obj.class_tag != UNIVERSAL) throw BER_Bad_Tag("Error decoding OID, unknown tag", obj.type_tag, obj.class_tag); if(obj.value.size() < 2) throw BER_Decoding_Error("OID encoding is too short"); clear(); m_id.push_back(obj.value[0] / 40); m_id.push_back(obj.value[0] % 40); size_t i = 0; while(i != obj.value.size() - 1) { uint32_t component = 0; while(i != obj.value.size() - 1) { ++i; if(component >> (32-7)) throw Decoding_Error("OID component overflow"); component = (component << 7) + (obj.value[i] & 0x7F); if(!(obj.value[i] & 0x80)) break; } m_id.push_back(component); } } } botan-2.4.0/src/lib/asn1/asn1_oid.h000066400000000000000000000043221322470703100166650ustar00rootroot00000000000000/* * ASN.1 OID * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASN1_OID_H_ #define BOTAN_ASN1_OID_H_ #include #include #include namespace Botan { /** * This class represents ASN.1 object identifiers. */ class BOTAN_PUBLIC_API(2,0) OID final : public ASN1_Object { public: void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; /** * Find out whether this OID is empty * @return true is no OID value is set */ bool empty() const { return m_id.size() == 0; } /** * Get this OID as list (vector) of its components. * @return vector representing this OID */ const std::vector& get_id() const { return m_id; } /** * Get this OID as a string * @return string representing this OID */ std::string as_string() const; /** * Compare two OIDs. * @return true if they are equal, false otherwise */ bool operator==(const OID&) const; /** * Reset this instance to an empty OID. */ void clear(); /** * Add a component to this OID. * @param new_comp the new component to add to the end of this OID * @return reference to *this */ OID& operator+=(uint32_t new_comp); /** * Construct an OID from a string. * @param str a string in the form "a.b.c" etc., where a,b,c are numbers */ OID(const std::string& str = ""); private: std::vector m_id; }; /** * Append another component onto the OID. * @param oid the OID to add the new component to * @param new_comp the new component to add */ OID BOTAN_PUBLIC_API(2,0) operator+(const OID& oid, uint32_t new_comp); /** * Compare two OIDs. * @param a the first OID * @param b the second OID * @return true if a is not equal to b */ bool BOTAN_PUBLIC_API(2,0) operator!=(const OID& a, const OID& b); /** * Compare two OIDs. * @param a the first OID * @param b the second OID * @return true if a is lexicographically smaller than b */ bool BOTAN_PUBLIC_API(2,0) operator<(const OID& a, const OID& b); } #endif botan-2.4.0/src/lib/asn1/asn1_print.cpp000066400000000000000000000205451322470703100176060ustar00rootroot00000000000000/* * (C) 2014,2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace { bool all_printable_chars(const uint8_t bits[], size_t bits_len) { for(size_t i = 0; i != bits_len; ++i) { int c = bits[i]; if(c > 127) return false; if((std::isalnum(c) || c == '.' || c == ':' || c == '/' || c == '-') == false) return false; } return true; } /* * Special hack to handle GeneralName [2] and [6] (DNS name and URI) */ bool possibly_a_general_name(const uint8_t bits[], size_t bits_len) { if(bits_len <= 2) return false; if(bits[0] != 0x82 && bits[0] != 0x86) return false; if(bits[1] != bits_len - 2) return false; if(all_printable_chars(bits + 2, bits_len - 2) == false) return false; return true; } } std::string ASN1_Formatter::print(const uint8_t in[], size_t len) const { std::ostringstream output; print_to_stream(output, in, len); return output.str(); } void ASN1_Formatter::print_to_stream(std::ostream& output, const uint8_t in[], size_t len) const { BER_Decoder dec(in, len); decode(output, dec, 0); } void ASN1_Formatter::decode(std::ostream& output, BER_Decoder& decoder, size_t level) const { BER_Object obj = decoder.get_next_object(); while(obj.type_tag != NO_OBJECT) { const ASN1_Tag type_tag = obj.type_tag; const ASN1_Tag class_tag = obj.class_tag; const size_t length = obj.value.size(); /* hack to insert the tag+length back in front of the stuff now that we've gotten the type info */ DER_Encoder encoder; encoder.add_object(type_tag, class_tag, obj.value); const std::vector bits = encoder.get_contents_unlocked(); BER_Decoder data(bits); if(class_tag & CONSTRUCTED) { BER_Decoder cons_info(obj.value); output << format(type_tag, class_tag, level, length, ""); decode(output, cons_info, level + 1); // recurse } else if((class_tag & APPLICATION) || (class_tag & CONTEXT_SPECIFIC)) { bool success_parsing_cs = false; if(m_print_context_specific) { try { if(possibly_a_general_name(bits.data(), bits.size())) { output << format(type_tag, class_tag, level, level, std::string(cast_uint8_ptr_to_char(&bits[2]), bits.size() - 2)); success_parsing_cs = true; } else { std::vector inner_bits; data.decode(inner_bits, type_tag); BER_Decoder inner(inner_bits); std::ostringstream inner_data; decode(inner_data, inner, level + 1); // recurse output << inner_data.str(); success_parsing_cs = true; } } catch(...) { } } if(success_parsing_cs == false) { output << format(type_tag, class_tag, level, length, format_bin(type_tag, class_tag, bits)); } } else if(type_tag == OBJECT_ID) { OID oid; data.decode(oid); std::string out = OIDS::lookup(oid); if(out.empty()) { out = oid.as_string(); } else { out += " [" + oid.as_string() + "]"; } output << format(type_tag, class_tag, level, length, out); } else if(type_tag == INTEGER || type_tag == ENUMERATED) { BigInt number; if(type_tag == INTEGER) { data.decode(number); } else if(type_tag == ENUMERATED) { data.decode(number, ENUMERATED, class_tag); } const std::vector rep = BigInt::encode(number, BigInt::Hexadecimal); std::string str; for(size_t i = 0; i != rep.size(); ++i) { str += static_cast(rep[i]); } output << format(type_tag, class_tag, level, length, str); } else if(type_tag == BOOLEAN) { bool boolean; data.decode(boolean); output << format(type_tag, class_tag, level, length, (boolean ? "true" : "false")); } else if(type_tag == NULL_TAG) { output << format(type_tag, class_tag, level, length, ""); } else if(type_tag == OCTET_STRING || type_tag == BIT_STRING) { std::vector decoded_bits; data.decode(decoded_bits, type_tag); try { BER_Decoder inner(decoded_bits); std::ostringstream inner_data; decode(inner_data, inner, level + 1); // recurse output << format(type_tag, class_tag, level, length, ""); output << inner_data.str(); } catch(...) { output << format(type_tag, class_tag, level, length, format_bin(type_tag, class_tag, decoded_bits)); } } else if(ASN1_String::is_string_type(type_tag)) { ASN1_String str; data.decode(str); output << format(type_tag, class_tag, level, length, str.value()); } else if(type_tag == UTC_TIME || type_tag == GENERALIZED_TIME) { X509_Time time; data.decode(time); output << format(type_tag, class_tag, level, length, time.readable_string()); } else { output << "Unknown ASN.1 tag class=" << static_cast(class_tag) << " type=" << static_cast(type_tag) << "\n";; } obj = decoder.get_next_object(); } } namespace { std::string format_type(ASN1_Tag type_tag, ASN1_Tag class_tag) { if(class_tag == UNIVERSAL) return asn1_tag_to_string(type_tag); if(class_tag == CONSTRUCTED && (type_tag == SEQUENCE || type_tag == SET)) return asn1_tag_to_string(type_tag); std::string name; if(class_tag & CONSTRUCTED) name += "cons "; name += "[" + std::to_string(type_tag) + "]"; if(class_tag & APPLICATION) { name += " appl"; } if(class_tag & CONTEXT_SPECIFIC) { name += " context"; } return name; } } std::string ASN1_Pretty_Printer::format(ASN1_Tag type_tag, ASN1_Tag class_tag, size_t level, size_t length, const std::string& value) const { bool should_skip = false; if(value.length() > m_print_limit) { should_skip = true; } if((type_tag == OCTET_STRING || type_tag == BIT_STRING) && value.length() > m_print_binary_limit) { should_skip = true; } level += m_initial_level; std::ostringstream oss; oss << " d=" << std::setw(2) << level << ", l=" << std::setw(4) << length << ":" << std::string(level + 1, ' ') << format_type(type_tag, class_tag); if(value != "" && !should_skip) { const size_t current_pos = static_cast(oss.tellp()); const size_t spaces_to_align = (current_pos >= m_value_column) ? 1 : (m_value_column - current_pos); oss << std::string(spaces_to_align, ' ') << value; } oss << "\n"; return oss.str(); } std::string ASN1_Pretty_Printer::format_bin(ASN1_Tag /*type_tag*/, ASN1_Tag /*class_tag*/, const std::vector& vec) const { if(all_printable_chars(vec.data(), vec.size())) { return std::string(cast_uint8_ptr_to_char(vec.data()), vec.size()); } else return hex_encode(vec); } } botan-2.4.0/src/lib/asn1/asn1_print.h000066400000000000000000000072641322470703100172560ustar00rootroot00000000000000/* * (C) 2014,2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASN1_PRINT_H_ #define BOTAN_ASN1_PRINT_H_ #include #include #include #include namespace Botan { class BER_Decoder; /** * Format ASN.1 data and call a virtual to format */ class BOTAN_DLL ASN1_Formatter { public: virtual ~ASN1_Formatter() = default; /** * @param print_context_specific if true, try to parse nested context specific data. */ ASN1_Formatter(bool print_context_specific) : m_print_context_specific(print_context_specific) {} void print_to_stream(std::ostream& out, const uint8_t in[], size_t len) const; std::string print(const uint8_t in[], size_t len) const; template std::string print(const std::vector& vec) const { return print(vec.data(), vec.size()); } protected: /** * This is called for each element */ virtual std::string format(ASN1_Tag type_tag, ASN1_Tag class_tag, size_t level, size_t length, const std::string& value) const = 0; /** * This is called to format binary elements that we don't know how to * convert to a string The result will be passed as value to format; the * tags are included as a hint to aid decoding. */ virtual std::string format_bin(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::vector& vec) const = 0; private: void decode(std::ostream& output, BER_Decoder& decoder, size_t level) const; const bool m_print_context_specific; }; /** * Format ASN.1 data into human readable output. The exact form of the output for * any particular input is not guaranteed and may change from release to release. */ class BOTAN_DLL ASN1_Pretty_Printer final : public ASN1_Formatter { public: /** * @param print_limit strings larger than this are not printed * @param print_binary_limit binary strings larger than this are not printed * @param print_context_specific if true, try to parse nested context specific data. * @param initial_level the initial depth (0 or 1 are the only reasonable values) * @param value_column ASN.1 values are lined up at this column in output */ ASN1_Pretty_Printer(size_t print_limit = 4096, size_t print_binary_limit = 2048, bool print_context_specific = true, size_t initial_level = 0, size_t value_column = 60) : ASN1_Formatter(print_context_specific), m_print_limit(print_limit), m_print_binary_limit(print_binary_limit), m_initial_level(initial_level), m_value_column(value_column) {} private: std::string format(ASN1_Tag type_tag, ASN1_Tag class_tag, size_t level, size_t length, const std::string& value) const override; std::string format_bin(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::vector& vec) const override; const size_t m_print_limit; const size_t m_print_binary_limit; const size_t m_initial_level; const size_t m_value_column; }; } #endif botan-2.4.0/src/lib/asn1/asn1_str.cpp000066400000000000000000000105011322470703100172510ustar00rootroot00000000000000/* * Simple ASN.1 String Types * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { /* * Choose an encoding for the string */ ASN1_Tag choose_encoding(const std::string& str) { static const uint8_t IS_PRINTABLE[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; for(size_t i = 0; i != str.size(); ++i) { if(!IS_PRINTABLE[static_cast(str[i])]) { return UTF8_STRING; } } return PRINTABLE_STRING; } void assert_is_string_type(ASN1_Tag tag) { if(!ASN1_String::is_string_type(tag)) { throw Invalid_Argument("ASN1_String: Unknown string type " + std::to_string(tag)); } } } //static bool ASN1_String::is_string_type(ASN1_Tag tag) { return (tag == NUMERIC_STRING || tag == PRINTABLE_STRING || tag == VISIBLE_STRING || tag == T61_STRING || tag == IA5_STRING || tag == UTF8_STRING || tag == BMP_STRING || tag == UNIVERSAL_STRING); } /* * Create an ASN1_String */ ASN1_String::ASN1_String(const std::string& str, ASN1_Tag t) : m_utf8_str(str), m_tag(t) { if(m_tag == DIRECTORY_STRING) { m_tag = choose_encoding(m_utf8_str); } assert_is_string_type(m_tag); } /* * Create an ASN1_String */ ASN1_String::ASN1_String(const std::string& str) : m_utf8_str(str), m_tag(choose_encoding(m_utf8_str)) {} /* * Return this string in ISO 8859-1 encoding */ std::string ASN1_String::iso_8859() const { return utf8_to_latin1(m_utf8_str); } /* * DER encode an ASN1_String */ void ASN1_String::encode_into(DER_Encoder& encoder) const { if(m_data.empty()) { encoder.add_object(tagging(), UNIVERSAL, m_utf8_str); } else { // If this string was decoded, reserialize using original encoding encoder.add_object(tagging(), UNIVERSAL, m_data.data(), m_data.size()); } } /* * Decode a BER encoded ASN1_String */ void ASN1_String::decode_from(BER_Decoder& source) { BER_Object obj = source.get_next_object(); assert_is_string_type(obj.type_tag); m_tag = obj.type_tag; m_data.assign(obj.value.begin(), obj.value.end()); if(m_tag == BMP_STRING) { m_utf8_str = ucs2_to_utf8(m_data.data(), m_data.size()); } else if(m_tag == UNIVERSAL_STRING) { m_utf8_str = ucs4_to_utf8(m_data.data(), m_data.size()); } else { // All other supported string types are UTF-8 or some subset thereof m_utf8_str = ASN1::to_string(obj); } } } botan-2.4.0/src/lib/asn1/asn1_str.h000066400000000000000000000022421322470703100167210ustar00rootroot00000000000000/* * ASN.1 string type * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASN1_STRING_H_ #define BOTAN_ASN1_STRING_H_ #include namespace Botan { /** * ASN.1 string type * This class normalizes all inputs to a UTF-8 std::string */ class BOTAN_PUBLIC_API(2,0) ASN1_String final : public ASN1_Object { public: void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; ASN1_Tag tagging() const { return m_tag; } const std::string& value() const { return m_utf8_str; } std::string BOTAN_DEPRECATED("Use value() to get UTF-8 string instead") iso_8859() const; /** * Return true iff this is a tag for a known string type we can handle. * This ignores string types that are not supported, eg teletexString */ static bool is_string_type(ASN1_Tag tag); explicit ASN1_String(const std::string& utf8 = ""); ASN1_String(const std::string& utf8, ASN1_Tag tag); private: std::vector m_data; std::string m_utf8_str; ASN1_Tag m_tag; }; } #endif botan-2.4.0/src/lib/asn1/asn1_time.cpp000066400000000000000000000164611322470703100174120ustar00rootroot00000000000000/* * X.509 Time Types * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include namespace Botan { X509_Time::X509_Time(const std::chrono::system_clock::time_point& time) { calendar_point cal = calendar_value(time); m_year = cal.get_year(); m_month = cal.get_month(); m_day = cal.get_day(); m_hour = cal.get_hour(); m_minute = cal.get_minutes(); m_second = cal.get_seconds(); m_tag = (m_year >= 2050) ? GENERALIZED_TIME : UTC_TIME; } X509_Time::X509_Time(const std::string& t_spec, ASN1_Tag tag) { set_to(t_spec, tag); } void X509_Time::encode_into(DER_Encoder& der) const { if(m_tag != GENERALIZED_TIME && m_tag != UTC_TIME) throw Invalid_Argument("X509_Time: Bad encoding tag"); der.add_object(m_tag, UNIVERSAL, to_string()); } void X509_Time::decode_from(BER_Decoder& source) { BER_Object ber_time = source.get_next_object(); set_to(ASN1::to_string(ber_time), ber_time.type_tag); } std::string X509_Time::to_string() const { if(time_is_set() == false) throw Invalid_State("X509_Time::as_string: No time set"); uint32_t full_year = m_year; if(m_tag == UTC_TIME) { if(m_year < 1950 || m_year >= 2050) throw Encoding_Error("X509_Time: The time " + readable_string() + " cannot be encoded as a UTCTime"); full_year = (m_year >= 2000) ? (m_year - 2000) : (m_year - 1900); } const uint64_t YEAR_FACTOR = 10000000000ULL; const uint64_t MON_FACTOR = 100000000; const uint64_t DAY_FACTOR = 1000000; const uint64_t HOUR_FACTOR = 10000; const uint64_t MIN_FACTOR = 100; const uint64_t int_repr = YEAR_FACTOR * full_year + MON_FACTOR * m_month + DAY_FACTOR * m_day + HOUR_FACTOR * m_hour + MIN_FACTOR * m_minute + m_second; std::string repr = std::to_string(int_repr) + "Z"; uint32_t desired_size = (m_tag == UTC_TIME) ? 13 : 15; while(repr.size() < desired_size) repr = "0" + repr; return repr; } std::string X509_Time::readable_string() const { if(time_is_set() == false) throw Invalid_State("X509_Time::readable_string: No time set"); // desired format: "%04d/%02d/%02d %02d:%02d:%02d UTC" std::stringstream output; output << std::setfill('0') << std::setw(4) << m_year << "/" << std::setw(2) << m_month << "/" << std::setw(2) << m_day << " " << std::setw(2) << m_hour << ":" << std::setw(2) << m_minute << ":" << std::setw(2) << m_second << " UTC"; return output.str(); } bool X509_Time::time_is_set() const { return (m_year != 0); } int32_t X509_Time::cmp(const X509_Time& other) const { if(time_is_set() == false) throw Invalid_State("X509_Time::cmp: No time set"); const int32_t EARLIER = -1, LATER = 1, SAME_TIME = 0; if(m_year < other.m_year) return EARLIER; if(m_year > other.m_year) return LATER; if(m_month < other.m_month) return EARLIER; if(m_month > other.m_month) return LATER; if(m_day < other.m_day) return EARLIER; if(m_day > other.m_day) return LATER; if(m_hour < other.m_hour) return EARLIER; if(m_hour > other.m_hour) return LATER; if(m_minute < other.m_minute) return EARLIER; if(m_minute > other.m_minute) return LATER; if(m_second < other.m_second) return EARLIER; if(m_second > other.m_second) return LATER; return SAME_TIME; } void X509_Time::set_to(const std::string& t_spec, ASN1_Tag spec_tag) { if(spec_tag == UTC_OR_GENERALIZED_TIME) { try { set_to(t_spec, GENERALIZED_TIME); return; } catch(Invalid_Argument&) {} // Not a generalized time. Continue try { set_to(t_spec, UTC_TIME); return; } catch(Invalid_Argument&) {} // Not a UTC time. Continue throw Invalid_Argument("Time string could not be parsed as GeneralizedTime or UTCTime."); } BOTAN_ASSERT(spec_tag == UTC_TIME || spec_tag == GENERALIZED_TIME, "Invalid tag."); if(t_spec.empty()) throw Invalid_Argument("Time string must not be empty."); if(t_spec.back() != 'Z') throw Unsupported_Argument("Botan does not support times with timezones other than Z: " + t_spec); if(spec_tag == GENERALIZED_TIME) { if(t_spec.size() != 15) throw Invalid_Argument("Invalid GeneralizedTime string: '" + t_spec + "'"); } else if(spec_tag == UTC_TIME) { if(t_spec.size() != 13) throw Invalid_Argument("Invalid UTCTime string: '" + t_spec + "'"); } const size_t YEAR_SIZE = (spec_tag == UTC_TIME) ? 2 : 4; std::vector params; std::string current; for(size_t j = 0; j != YEAR_SIZE; ++j) current += t_spec[j]; params.push_back(current); current.clear(); for(size_t j = YEAR_SIZE; j != t_spec.size() - 1; ++j) { current += t_spec[j]; if(current.size() == 2) { params.push_back(current); current.clear(); } } m_year = to_u32bit(params[0]); m_month = to_u32bit(params[1]); m_day = to_u32bit(params[2]); m_hour = to_u32bit(params[3]); m_minute = to_u32bit(params[4]); m_second = (params.size() == 6) ? to_u32bit(params[5]) : 0; m_tag = spec_tag; if(spec_tag == UTC_TIME) { if(m_year >= 50) m_year += 1900; else m_year += 2000; } if(!passes_sanity_check()) throw Invalid_Argument("Time did not pass sanity check: " + t_spec); } /* * Do a general sanity check on the time */ bool X509_Time::passes_sanity_check() const { if(m_year < 1950 || m_year > 2100) return false; if(m_month == 0 || m_month > 12) return false; if(m_day == 0 || m_day > 31) return false; if(m_hour >= 24 || m_minute > 60 || m_second > 60) return false; if (m_tag == UTC_TIME) { /* UTCTime limits the value of components such that leap seconds are not covered. See "UNIVERSAL 23" in "Information technology Abstract Syntax Notation One (ASN.1): Specification of basic notation" http://www.itu.int/ITU-T/studygroups/com17/languages/ */ if (m_hour > 23 || m_minute > 59 || m_second > 59) { return false; } } return true; } std::chrono::system_clock::time_point X509_Time::to_std_timepoint() const { return calendar_point(m_year, m_month, m_day, m_hour, m_minute, m_second).to_std_timepoint(); } /* * Compare two X509_Times for in various ways */ bool operator==(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) == 0); } bool operator!=(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) != 0); } bool operator<=(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) <= 0); } bool operator>=(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) >= 0); } bool operator<(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) < 0); } bool operator>(const X509_Time& t1, const X509_Time& t2) { return (t1.cmp(t2) > 0); } } botan-2.4.0/src/lib/asn1/asn1_time.h000066400000000000000000000041541322470703100170530ustar00rootroot00000000000000/* * ASN.1 Time Representation * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASN1_TIME_H_ #define BOTAN_ASN1_TIME_H_ #include #include namespace Botan { /** * X.509 Time */ class BOTAN_PUBLIC_API(2,0) X509_Time final : public ASN1_Object { public: /// DER encode a X509_Time void encode_into(DER_Encoder&) const override; // Decode a BER encoded X509_Time void decode_from(BER_Decoder&) override; /// Return an internal string representation of the time std::string to_string() const; /// Returns a human friendly string replesentation of no particular formatting std::string readable_string() const; /// Return if the time has been set somehow bool time_is_set() const; /// Compare this time against another int32_t cmp(const X509_Time& other) const; /// Create an invalid X509_Time X509_Time() = default; /// Create a X509_Time from a time point explicit X509_Time(const std::chrono::system_clock::time_point& time); /// Create an X509_Time from string X509_Time(const std::string& t_spec, ASN1_Tag tag); /// Returns a STL timepoint object std::chrono::system_clock::time_point to_std_timepoint() const; private: void set_to(const std::string& t_spec, ASN1_Tag); bool passes_sanity_check() const; uint32_t m_year = 0; uint32_t m_month = 0; uint32_t m_day = 0; uint32_t m_hour = 0; uint32_t m_minute = 0; uint32_t m_second = 0; ASN1_Tag m_tag = NO_OBJECT; }; /* * Comparison Operations */ bool BOTAN_PUBLIC_API(2,0) operator==(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator!=(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator<=(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator>=(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator<(const X509_Time&, const X509_Time&); bool BOTAN_PUBLIC_API(2,0) operator>(const X509_Time&, const X509_Time&); } #endif botan-2.4.0/src/lib/asn1/ber_dec.cpp000066400000000000000000000315371322470703100171160ustar00rootroot00000000000000/* * BER Decoder * (C) 1999-2008,2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { /* * This value is somewhat arbitrary. OpenSSL allows up to 128 nested * indefinite length sequences. If you increase this, also increase the * limit in the test in test_asn1.cpp */ const size_t ALLOWED_EOC_NESTINGS = 16; /* * BER decode an ASN.1 type tag */ size_t decode_tag(DataSource* ber, ASN1_Tag& type_tag, ASN1_Tag& class_tag) { uint8_t b; if(!ber->read_byte(b)) { class_tag = type_tag = NO_OBJECT; return 0; } if((b & 0x1F) != 0x1F) { type_tag = ASN1_Tag(b & 0x1F); class_tag = ASN1_Tag(b & 0xE0); return 1; } size_t tag_bytes = 1; class_tag = ASN1_Tag(b & 0xE0); size_t tag_buf = 0; while(true) { if(!ber->read_byte(b)) throw BER_Decoding_Error("Long-form tag truncated"); if(tag_buf & 0xFF000000) throw BER_Decoding_Error("Long-form tag overflowed 32 bits"); ++tag_bytes; tag_buf = (tag_buf << 7) | (b & 0x7F); if((b & 0x80) == 0) break; } type_tag = ASN1_Tag(tag_buf); return tag_bytes; } /* * Find the EOC marker */ size_t find_eoc(DataSource* src, size_t allow_indef); /* * BER decode an ASN.1 length field */ size_t decode_length(DataSource* ber, size_t& field_size, size_t allow_indef) { uint8_t b; if(!ber->read_byte(b)) throw BER_Decoding_Error("Length field not found"); field_size = 1; if((b & 0x80) == 0) return b; field_size += (b & 0x7F); if(field_size > 5) throw BER_Decoding_Error("Length field is too large"); if(field_size == 1) { if(allow_indef == 0) { throw BER_Decoding_Error("Nested EOC markers too deep, rejecting to avoid stack exhaustion"); } else { return find_eoc(ber, allow_indef - 1); } } size_t length = 0; for(size_t i = 0; i != field_size - 1; ++i) { if(get_byte(0, length) != 0) throw BER_Decoding_Error("Field length overflow"); if(!ber->read_byte(b)) throw BER_Decoding_Error("Corrupted length field"); length = (length << 8) | b; } return length; } /* * Find the EOC marker */ size_t find_eoc(DataSource* ber, size_t allow_indef) { secure_vector buffer(DEFAULT_BUFFERSIZE), data; while(true) { const size_t got = ber->peek(buffer.data(), buffer.size(), data.size()); if(got == 0) break; data += std::make_pair(buffer.data(), got); } DataSource_Memory source(data); data.clear(); size_t length = 0; while(true) { ASN1_Tag type_tag, class_tag; size_t tag_size = decode_tag(&source, type_tag, class_tag); if(type_tag == NO_OBJECT) break; size_t length_size = 0; size_t item_size = decode_length(&source, length_size, allow_indef); source.discard_next(item_size); length = BOTAN_CHECKED_ADD(length, item_size); length = BOTAN_CHECKED_ADD(length, tag_size); length = BOTAN_CHECKED_ADD(length, length_size); if(type_tag == EOC && class_tag == UNIVERSAL) break; } return length; } } /* * Check a type invariant on BER data */ void BER_Object::assert_is_a(ASN1_Tag type_tag_, ASN1_Tag class_tag_) const { if(type_tag != type_tag_ || class_tag != class_tag_) throw BER_Decoding_Error("Tag mismatch when decoding got " + std::to_string(type_tag) + "/" + std::to_string(class_tag) + " expected " + std::to_string(type_tag_) + "/" + std::to_string(class_tag_)); } /* * Check if more objects are there */ bool BER_Decoder::more_items() const { if(m_source->end_of_data() && (m_pushed.type_tag == NO_OBJECT)) return false; return true; } /* * Verify that no bytes remain in the source */ BER_Decoder& BER_Decoder::verify_end() { if(!m_source->end_of_data() || (m_pushed.type_tag != NO_OBJECT)) throw Invalid_State("BER_Decoder::verify_end called, but data remains"); return (*this); } /* * Discard all the bytes remaining in the source */ BER_Decoder& BER_Decoder::discard_remaining() { uint8_t buf; while(m_source->read_byte(buf)) {} return (*this); } /* * Return the BER encoding of the next object */ BER_Object BER_Decoder::get_next_object() { BER_Object next; if(m_pushed.type_tag != NO_OBJECT) { next = m_pushed; m_pushed.class_tag = m_pushed.type_tag = NO_OBJECT; return next; } for(;;) { decode_tag(m_source, next.type_tag, next.class_tag); if(next.type_tag == NO_OBJECT) return next; size_t field_size; const size_t length = decode_length(m_source, field_size, ALLOWED_EOC_NESTINGS); if(!m_source->check_available(length)) throw BER_Decoding_Error("Value truncated"); next.value.resize(length); if(m_source->read(next.value.data(), length) != length) throw BER_Decoding_Error("Value truncated"); if(next.type_tag == EOC && next.class_tag == UNIVERSAL) continue; else break; } return next; } BER_Decoder& BER_Decoder::get_next(BER_Object& ber) { ber = get_next_object(); return (*this); } /* * Push a object back into the stream */ void BER_Decoder::push_back(const BER_Object& obj) { if(m_pushed.type_tag != NO_OBJECT) throw Invalid_State("BER_Decoder: Only one push back is allowed"); m_pushed = obj; } /* * Begin decoding a CONSTRUCTED type */ BER_Decoder BER_Decoder::start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, ASN1_Tag(class_tag | CONSTRUCTED)); BER_Decoder result(obj.value.data(), obj.value.size()); result.m_parent = this; return result; } /* * Finish decoding a CONSTRUCTED type */ BER_Decoder& BER_Decoder::end_cons() { if(!m_parent) throw Invalid_State("BER_Decoder::end_cons called with NULL parent"); if(!m_source->end_of_data()) throw Decoding_Error("BER_Decoder::end_cons called with data left"); return (*m_parent); } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(DataSource& src) { m_source = &src; m_pushed.type_tag = m_pushed.class_tag = NO_OBJECT; m_parent = nullptr; } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(const uint8_t data[], size_t length) { m_data_src.reset(new DataSource_Memory(data, length)); m_source = m_data_src.get(); m_pushed.type_tag = m_pushed.class_tag = NO_OBJECT; m_parent = nullptr; } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(const secure_vector& data) { m_data_src.reset(new DataSource_Memory(data)); m_source = m_data_src.get(); m_pushed.type_tag = m_pushed.class_tag = NO_OBJECT; m_parent = nullptr; } /* * BER_Decoder Constructor */ BER_Decoder::BER_Decoder(const std::vector& data) { m_data_src.reset(new DataSource_Memory(data.data(), data.size())); m_source = m_data_src.get(); m_pushed.type_tag = m_pushed.class_tag = NO_OBJECT; m_parent = nullptr; } /* * BER_Decoder Copy Constructor */ BER_Decoder::BER_Decoder(const BER_Decoder& other) { m_source = other.m_source; // take ownership std::swap(m_data_src, other.m_data_src); m_pushed.type_tag = m_pushed.class_tag = NO_OBJECT; m_parent = other.m_parent; } /* * Request for an object to decode itself */ BER_Decoder& BER_Decoder::decode(ASN1_Object& obj, ASN1_Tag, ASN1_Tag) { obj.decode_from(*this); return (*this); } /* * Decode a BER encoded NULL */ BER_Decoder& BER_Decoder::decode_null() { BER_Object obj = get_next_object(); obj.assert_is_a(NULL_TAG, UNIVERSAL); if(obj.value.size()) throw BER_Decoding_Error("NULL object had nonzero size"); return (*this); } /* * Decode a BER encoded BOOLEAN */ BER_Decoder& BER_Decoder::decode(bool& out) { return decode(out, BOOLEAN, UNIVERSAL); } /* * Decode a small BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(size_t& out) { return decode(out, INTEGER, UNIVERSAL); } /* * Decode a BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(BigInt& out) { return decode(out, INTEGER, UNIVERSAL); } BER_Decoder& BER_Decoder::decode_octet_string_bigint(BigInt& out) { secure_vector out_vec; decode(out_vec, OCTET_STRING); out = BigInt::decode(out_vec.data(), out_vec.size()); return (*this); } std::vector BER_Decoder::get_next_octet_string() { std::vector out_vec; decode(out_vec, OCTET_STRING); return out_vec; } /* * Decode a BER encoded BOOLEAN */ BER_Decoder& BER_Decoder::decode(bool& out, ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, class_tag); if(obj.value.size() != 1) throw BER_Decoding_Error("BER boolean value had invalid size"); out = (obj.value[0]) ? true : false; return (*this); } /* * Decode a small BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(size_t& out, ASN1_Tag type_tag, ASN1_Tag class_tag) { BigInt integer; decode(integer, type_tag, class_tag); if(integer.bits() > 32) throw BER_Decoding_Error("Decoded integer value larger than expected"); out = 0; for(size_t i = 0; i != 4; ++i) out = (out << 8) | integer.byte_at(3-i); return (*this); } /* * Decode a small BER encoded INTEGER */ uint64_t BER_Decoder::decode_constrained_integer(ASN1_Tag type_tag, ASN1_Tag class_tag, size_t T_bytes) { if(T_bytes > 8) throw BER_Decoding_Error("Can't decode small integer over 8 bytes"); BigInt integer; decode(integer, type_tag, class_tag); if(integer.bits() > 8*T_bytes) throw BER_Decoding_Error("Decoded integer value larger than expected"); uint64_t out = 0; for(size_t i = 0; i != 8; ++i) out = (out << 8) | integer.byte_at(7-i); return out; } /* * Decode a BER encoded INTEGER */ BER_Decoder& BER_Decoder::decode(BigInt& out, ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, class_tag); if(obj.value.empty()) out = 0; else { const bool negative = (obj.value[0] & 0x80) ? true : false; if(negative) { for(size_t i = obj.value.size(); i > 0; --i) if(obj.value[i-1]--) break; for(size_t i = 0; i != obj.value.size(); ++i) obj.value[i] = ~obj.value[i]; } out = BigInt(&obj.value[0], obj.value.size()); if(negative) out.flip_sign(); } return (*this); } namespace { template void asn1_decode_binary_string(std::vector& buffer, const BER_Object& obj, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { obj.assert_is_a(type_tag, class_tag); if(real_type == OCTET_STRING) { buffer.assign(obj.value.begin(), obj.value.end()); } else { if(obj.value.empty()) throw BER_Decoding_Error("Invalid BIT STRING"); if(obj.value[0] >= 8) throw BER_Decoding_Error("Bad number of unused bits in BIT STRING"); buffer.resize(obj.value.size() - 1); if(obj.value.size() > 1) copy_mem(buffer.data(), &obj.value[1], obj.value.size() - 1); } } } /* * BER decode a BIT STRING or OCTET STRING */ BER_Decoder& BER_Decoder::decode(secure_vector& buffer, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(real_type != OCTET_STRING && real_type != BIT_STRING) throw BER_Bad_Tag("Bad tag for {BIT,OCTET} STRING", real_type); asn1_decode_binary_string(buffer, get_next_object(), real_type, type_tag, class_tag); return (*this); } BER_Decoder& BER_Decoder::decode(std::vector& buffer, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(real_type != OCTET_STRING && real_type != BIT_STRING) throw BER_Bad_Tag("Bad tag for {BIT,OCTET} STRING", real_type); asn1_decode_binary_string(buffer, get_next_object(), real_type, type_tag, class_tag); return (*this); } } botan-2.4.0/src/lib/asn1/ber_dec.h000066400000000000000000000215441322470703100165600ustar00rootroot00000000000000/* * BER Decoder * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BER_DECODER_H_ #define BOTAN_BER_DECODER_H_ #include #include namespace Botan { /** * BER Decoding Object */ class BOTAN_PUBLIC_API(2,0) BER_Decoder final { public: BER_Object get_next_object(); std::vector get_next_octet_string(); void push_back(const BER_Object& obj); bool more_items() const; BER_Decoder& verify_end(); BER_Decoder& discard_remaining(); BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); BER_Decoder& end_cons(); BER_Decoder& get_next(BER_Object& ber); /** * Get next object and copy value to POD type * Asserts value length is equal to POD type sizeof. * Asserts Type tag and optional Class tag according to parameters. * Copy value to POD type (struct, union, C-style array, std::array, etc.). * @param out POD type reference where to copy object value * @param type_tag ASN1_Tag enum to assert type on object read * @param class_tag ASN1_Tag enum to assert class on object read (default: CONTEXT_SPECIFIC) * @return this reference */ template BER_Decoder& get_next_value(T &out, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC) { static_assert(std::is_pod::value, "Type must be POD"); BER_Object obj = get_next_object(); obj.assert_is_a(type_tag, class_tag); if (obj.value.size() != sizeof(T)) throw BER_Decoding_Error( "Size mismatch. Object value size is " + std::to_string(obj.value.size()) + "; Output type size is " + std::to_string(sizeof(T))); copy_mem(reinterpret_cast(&out), obj.value.data(), obj.value.size()); return (*this); } /* * Save all the bytes remaining in the source */ template BER_Decoder& raw_bytes(std::vector& out) { out.clear(); uint8_t buf; while(m_source->read_byte(buf)) out.push_back(buf); return (*this); } BER_Decoder& decode_null(); BER_Decoder& decode(bool& v); BER_Decoder& decode(size_t& v); BER_Decoder& decode(class BigInt& v); /* * BER decode a BIT STRING or OCTET STRING */ template BER_Decoder& decode(std::vector& out, ASN1_Tag real_type) { return decode(out, real_type, real_type, UNIVERSAL); } BER_Decoder& decode(bool& v, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); BER_Decoder& decode(size_t& v, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); BER_Decoder& decode(class BigInt& v, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); BER_Decoder& decode(std::vector& v, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); BER_Decoder& decode(secure_vector& v, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); BER_Decoder& decode(class ASN1_Object& obj, ASN1_Tag type_tag = NO_OBJECT, ASN1_Tag class_tag = NO_OBJECT); BER_Decoder& decode_octet_string_bigint(class BigInt& b); uint64_t decode_constrained_integer(ASN1_Tag type_tag, ASN1_Tag class_tag, size_t T_bytes); template BER_Decoder& decode_integer_type(T& out) { return decode_integer_type(out, INTEGER, UNIVERSAL); } template BER_Decoder& decode_integer_type(T& out, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC) { out = static_cast(decode_constrained_integer(type_tag, class_tag, sizeof(out))); return (*this); } template BER_Decoder& decode_optional(T& out, ASN1_Tag type_tag, ASN1_Tag class_tag, const T& default_value = T()); template BER_Decoder& decode_optional_implicit( T& out, ASN1_Tag type_tag, ASN1_Tag class_tag, ASN1_Tag real_type, ASN1_Tag real_class, const T& default_value = T()); template BER_Decoder& decode_list(std::vector& out, ASN1_Tag type_tag = SEQUENCE, ASN1_Tag class_tag = UNIVERSAL); template BER_Decoder& decode_and_check(const T& expected, const std::string& error_msg) { T actual; decode(actual); if(actual != expected) throw Decoding_Error(error_msg); return (*this); } /* * Decode an OPTIONAL string type */ template BER_Decoder& decode_optional_string(std::vector& out, ASN1_Tag real_type, uint16_t type_no, ASN1_Tag class_tag = CONTEXT_SPECIFIC) { BER_Object obj = get_next_object(); ASN1_Tag type_tag = static_cast(type_no); if(obj.type_tag == type_tag && obj.class_tag == class_tag) { if((class_tag & CONSTRUCTED) && (class_tag & CONTEXT_SPECIFIC)) BER_Decoder(obj.value).decode(out, real_type).verify_end(); else { push_back(obj); decode(out, real_type, type_tag, class_tag); } } else { out.clear(); push_back(obj); } return (*this); } BER_Decoder& operator=(const BER_Decoder&) = delete; explicit BER_Decoder(DataSource&); BER_Decoder(const uint8_t[], size_t); explicit BER_Decoder(const secure_vector&); explicit BER_Decoder(const std::vector& vec); BER_Decoder(const BER_Decoder&); private: BER_Decoder* m_parent; BER_Object m_pushed; // either m_data_src.get() or an unowned pointer DataSource* m_source; mutable std::unique_ptr m_data_src; }; /* * Decode an OPTIONAL or DEFAULT element */ template BER_Decoder& BER_Decoder::decode_optional(T& out, ASN1_Tag type_tag, ASN1_Tag class_tag, const T& default_value) { BER_Object obj = get_next_object(); if(obj.type_tag == type_tag && obj.class_tag == class_tag) { if((class_tag & CONSTRUCTED) && (class_tag & CONTEXT_SPECIFIC)) BER_Decoder(obj.value).decode(out).verify_end(); else { push_back(obj); decode(out, type_tag, class_tag); } } else { out = default_value; push_back(obj); } return (*this); } /* * Decode an OPTIONAL or DEFAULT element */ template BER_Decoder& BER_Decoder::decode_optional_implicit( T& out, ASN1_Tag type_tag, ASN1_Tag class_tag, ASN1_Tag real_type, ASN1_Tag real_class, const T& default_value) { BER_Object obj = get_next_object(); if(obj.type_tag == type_tag && obj.class_tag == class_tag) { obj.type_tag = real_type; obj.class_tag = real_class; push_back(obj); decode(out, real_type, real_class); } else { out = default_value; push_back(obj); } return (*this); } /* * Decode a list of homogenously typed values */ template BER_Decoder& BER_Decoder::decode_list(std::vector& vec, ASN1_Tag type_tag, ASN1_Tag class_tag) { BER_Decoder list = start_cons(type_tag, class_tag); while(list.more_items()) { T value; list.decode(value); vec.push_back(value); } list.end_cons(); return (*this); } } #endif botan-2.4.0/src/lib/asn1/der_enc.cpp000066400000000000000000000221741322470703100171270ustar00rootroot00000000000000/* * DER Encoder * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { /* * DER encode an ASN.1 type tag */ secure_vector encode_tag(ASN1_Tag type_tag, ASN1_Tag class_tag) { if((class_tag | 0xE0) != 0xE0) throw Encoding_Error("DER_Encoder: Invalid class tag " + std::to_string(class_tag)); secure_vector encoded_tag; if(type_tag <= 30) encoded_tag.push_back(static_cast(type_tag | class_tag)); else { size_t blocks = high_bit(type_tag) + 6; blocks = (blocks - (blocks % 7)) / 7; BOTAN_ASSERT(blocks > 0, "Math works"); encoded_tag.push_back(static_cast(class_tag | 0x1F)); for(size_t i = 0; i != blocks - 1; ++i) encoded_tag.push_back(0x80 | ((type_tag >> 7*(blocks-i-1)) & 0x7F)); encoded_tag.push_back(type_tag & 0x7F); } return encoded_tag; } /* * DER encode an ASN.1 length field */ secure_vector encode_length(size_t length) { secure_vector encoded_length; if(length <= 127) encoded_length.push_back(static_cast(length)); else { const size_t bytes_needed = significant_bytes(length); encoded_length.push_back(static_cast(0x80 | bytes_needed)); for(size_t i = sizeof(length) - bytes_needed; i < sizeof(length); ++i) encoded_length.push_back(get_byte(i, length)); } return encoded_length; } } /* * Return the encoded SEQUENCE/SET */ secure_vector DER_Encoder::DER_Sequence::get_contents() { const ASN1_Tag real_class_tag = ASN1_Tag(m_class_tag | CONSTRUCTED); if(m_type_tag == SET) { std::sort(m_set_contents.begin(), m_set_contents.end()); for(size_t i = 0; i != m_set_contents.size(); ++i) m_contents += m_set_contents[i]; m_set_contents.clear(); } secure_vector result; result += encode_tag(m_type_tag, real_class_tag); result += encode_length(m_contents.size()); result += m_contents; m_contents.clear(); return result; } /* * Add an encoded value to the SEQUENCE/SET */ void DER_Encoder::DER_Sequence::add_bytes(const uint8_t data[], size_t length) { if(m_type_tag == SET) m_set_contents.push_back(secure_vector(data, data + length)); else m_contents += std::make_pair(data, length); } /* * Return the type and class taggings */ ASN1_Tag DER_Encoder::DER_Sequence::tag_of() const { return ASN1_Tag(m_type_tag | m_class_tag); } /* * DER_Sequence Constructor */ DER_Encoder::DER_Sequence::DER_Sequence(ASN1_Tag t1, ASN1_Tag t2) : m_type_tag(t1), m_class_tag(t2) { } /* * Return the encoded contents */ secure_vector DER_Encoder::get_contents() { if(m_subsequences.size() != 0) throw Invalid_State("DER_Encoder: Sequence hasn't been marked done"); secure_vector output; std::swap(output, m_contents); return output; } /* * Start a new ASN.1 SEQUENCE/SET/EXPLICIT */ DER_Encoder& DER_Encoder::start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag) { m_subsequences.push_back(DER_Sequence(type_tag, class_tag)); return (*this); } /* * Finish the current ASN.1 SEQUENCE/SET/EXPLICIT */ DER_Encoder& DER_Encoder::end_cons() { if(m_subsequences.empty()) throw Invalid_State("DER_Encoder::end_cons: No such sequence"); secure_vector seq = m_subsequences[m_subsequences.size()-1].get_contents(); m_subsequences.pop_back(); raw_bytes(seq); return (*this); } /* * Start a new ASN.1 EXPLICIT encoding */ DER_Encoder& DER_Encoder::start_explicit(uint16_t type_no) { ASN1_Tag type_tag = static_cast(type_no); if(type_tag == SET) throw Internal_Error("DER_Encoder.start_explicit(SET); cannot perform"); return start_cons(type_tag, CONTEXT_SPECIFIC); } /* * Finish the current ASN.1 EXPLICIT encoding */ DER_Encoder& DER_Encoder::end_explicit() { return end_cons(); } /* * Write raw bytes into the stream */ DER_Encoder& DER_Encoder::raw_bytes(const uint8_t bytes[], size_t length) { if(m_subsequences.size()) m_subsequences[m_subsequences.size()-1].add_bytes(bytes, length); else m_contents += std::make_pair(bytes, length); return (*this); } /* * Encode a NULL object */ DER_Encoder& DER_Encoder::encode_null() { return add_object(NULL_TAG, UNIVERSAL, nullptr, 0); } /* * DER encode a BOOLEAN */ DER_Encoder& DER_Encoder::encode(bool is_true) { return encode(is_true, BOOLEAN, UNIVERSAL); } /* * DER encode a small INTEGER */ DER_Encoder& DER_Encoder::encode(size_t n) { return encode(BigInt(n), INTEGER, UNIVERSAL); } /* * DER encode a small INTEGER */ DER_Encoder& DER_Encoder::encode(const BigInt& n) { return encode(n, INTEGER, UNIVERSAL); } /* * Encode this object */ DER_Encoder& DER_Encoder::encode(const uint8_t bytes[], size_t length, ASN1_Tag real_type) { return encode(bytes, length, real_type, real_type, UNIVERSAL); } /* * DER encode a BOOLEAN */ DER_Encoder& DER_Encoder::encode(bool is_true, ASN1_Tag type_tag, ASN1_Tag class_tag) { uint8_t val = is_true ? 0xFF : 0x00; return add_object(type_tag, class_tag, &val, 1); } /* * DER encode a small INTEGER */ DER_Encoder& DER_Encoder::encode(size_t n, ASN1_Tag type_tag, ASN1_Tag class_tag) { return encode(BigInt(n), type_tag, class_tag); } /* * DER encode an INTEGER */ DER_Encoder& DER_Encoder::encode(const BigInt& n, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(n == 0) return add_object(type_tag, class_tag, 0); const size_t extra_zero = (n.bits() % 8 == 0) ? 1 : 0; secure_vector contents(extra_zero + n.bytes()); BigInt::encode(&contents[extra_zero], n); if(n < 0) { for(size_t i = 0; i != contents.size(); ++i) contents[i] = ~contents[i]; for(size_t i = contents.size(); i > 0; --i) if(++contents[i-1]) break; } return add_object(type_tag, class_tag, contents); } /* * DER encode an OCTET STRING or BIT STRING */ DER_Encoder& DER_Encoder::encode(const secure_vector& bytes, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { return encode(bytes.data(), bytes.size(), real_type, type_tag, class_tag); } /* * DER encode an OCTET STRING or BIT STRING */ DER_Encoder& DER_Encoder::encode(const std::vector& bytes, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { return encode(bytes.data(), bytes.size(), real_type, type_tag, class_tag); } /* * DER encode an OCTET STRING or BIT STRING */ DER_Encoder& DER_Encoder::encode(const uint8_t bytes[], size_t length, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag) { if(real_type != OCTET_STRING && real_type != BIT_STRING) throw Invalid_Argument("DER_Encoder: Invalid tag for byte/bit string"); if(real_type == BIT_STRING) { secure_vector encoded; encoded.push_back(0); encoded += std::make_pair(bytes, length); return add_object(type_tag, class_tag, encoded); } else return add_object(type_tag, class_tag, bytes, length); } /* * Conditionally write some values to the stream */ DER_Encoder& DER_Encoder::encode_if(bool cond, DER_Encoder& codec) { if(cond) return raw_bytes(codec.get_contents()); return (*this); } DER_Encoder& DER_Encoder::encode_if(bool cond, const ASN1_Object& obj) { if(cond) encode(obj); return (*this); } /* * Request for an object to encode itself */ DER_Encoder& DER_Encoder::encode(const ASN1_Object& obj) { obj.encode_into(*this); return (*this); } /* * Write the encoding of the byte(s) */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const uint8_t rep[], size_t length) { secure_vector buffer; buffer += encode_tag(type_tag, class_tag); buffer += encode_length(length); buffer += std::make_pair(rep, length); return raw_bytes(buffer); } /* * Write the encoding of the byte(s) */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::string& rep_str) { const uint8_t* rep = cast_char_ptr_to_uint8(rep_str.data()); const size_t rep_len = rep_str.size(); return add_object(type_tag, class_tag, rep, rep_len); } /* * Write the encoding of the byte */ DER_Encoder& DER_Encoder::add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, uint8_t rep) { return add_object(type_tag, class_tag, &rep, 1); } } botan-2.4.0/src/lib/asn1/der_enc.h000066400000000000000000000107571322470703100166000ustar00rootroot00000000000000/* * DER Encoder * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DER_ENCODER_H_ #define BOTAN_DER_ENCODER_H_ #include #include namespace Botan { class BigInt; class ASN1_Object; /** * General DER Encoding Object */ class BOTAN_PUBLIC_API(2,0) DER_Encoder final { public: secure_vector get_contents(); std::vector get_contents_unlocked() { return unlock(get_contents()); } DER_Encoder& start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag = UNIVERSAL); DER_Encoder& end_cons(); DER_Encoder& start_explicit(uint16_t type_tag); DER_Encoder& end_explicit(); /** * Insert raw bytes directly into the output stream */ DER_Encoder& raw_bytes(const uint8_t val[], size_t len); template DER_Encoder& raw_bytes(const std::vector& val) { return raw_bytes(val.data(), val.size()); } DER_Encoder& encode_null(); DER_Encoder& encode(bool b); DER_Encoder& encode(size_t s); DER_Encoder& encode(const BigInt& n); DER_Encoder& encode(const uint8_t val[], size_t len, ASN1_Tag real_type); template DER_Encoder& encode(const std::vector& vec, ASN1_Tag real_type) { return encode(vec.data(), vec.size(), real_type); } DER_Encoder& encode(bool b, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(size_t s, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const BigInt& n, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const std::vector& v, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const secure_vector& v, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); DER_Encoder& encode(const uint8_t v[], size_t len, ASN1_Tag real_type, ASN1_Tag type_tag, ASN1_Tag class_tag = CONTEXT_SPECIFIC); template DER_Encoder& encode_optional(const T& value, const T& default_value) { if(value != default_value) encode(value); return (*this); } template DER_Encoder& encode_list(const std::vector& values) { for(size_t i = 0; i != values.size(); ++i) encode(values[i]); return (*this); } DER_Encoder& encode(const ASN1_Object& obj); DER_Encoder& encode_if(bool pred, DER_Encoder& enc); DER_Encoder& encode_if(bool pred, const ASN1_Object& obj); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const uint8_t rep[], size_t length); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::vector& rep) { return add_object(type_tag, class_tag, rep.data(), rep.size()); } DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const secure_vector& rep) { return add_object(type_tag, class_tag, rep.data(), rep.size()); } DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, const std::string& str); DER_Encoder& add_object(ASN1_Tag type_tag, ASN1_Tag class_tag, uint8_t val); private: class DER_Sequence final { public: ASN1_Tag tag_of() const; secure_vector get_contents(); void add_bytes(const uint8_t[], size_t); DER_Sequence(ASN1_Tag, ASN1_Tag); private: ASN1_Tag m_type_tag, m_class_tag; secure_vector m_contents; std::vector< secure_vector > m_set_contents; }; secure_vector m_contents; std::vector m_subsequences; }; } #endif botan-2.4.0/src/lib/asn1/info.txt000066400000000000000000000001051322470703100165060ustar00rootroot00000000000000 ASN1 -> 20171109 bigint botan-2.4.0/src/lib/asn1/oids.cpp000066400000000000000000000636401322470703100164710ustar00rootroot00000000000000/* * OID maps * * This file was automatically generated by ./src/scripts/oids.py on 2018-01-03 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace OIDS { std::string lookup(const OID& oid) { const std::string oid_str = oid.as_string(); if(oid_str == "1.0.14888.3.0.5") return "ECKCDSA"; if(oid_str == "1.2.156.10197.1.301") return "sm2p256v1"; if(oid_str == "1.2.156.10197.1.301.1") return "SM2_Sig"; if(oid_str == "1.2.156.10197.1.301.2") return "SM2_Kex"; if(oid_str == "1.2.156.10197.1.301.3") return "SM2_Enc"; if(oid_str == "1.2.156.10197.1.401") return "SM3"; if(oid_str == "1.2.156.10197.1.504") return "RSA/EMSA3(SM3)"; if(oid_str == "1.2.250.1.223.101.256.1") return "frp256v1"; if(oid_str == "1.2.410.200004.1.100.4.3") return "ECKCDSA/EMSA1(SHA-1)"; if(oid_str == "1.2.410.200004.1.100.4.4") return "ECKCDSA/EMSA1(SHA-224)"; if(oid_str == "1.2.410.200004.1.100.4.5") return "ECKCDSA/EMSA1(SHA-256)"; if(oid_str == "1.2.410.200004.1.4") return "SEED/CBC"; if(oid_str == "1.2.643.2.2.19") return "GOST-34.10"; if(oid_str == "1.2.643.2.2.3") return "GOST-34.10/EMSA1(GOST-R-34.11-94)"; if(oid_str == "1.2.643.2.2.35.1") return "gost_256A"; if(oid_str == "1.2.643.2.2.36.0") return "gost_256A"; if(oid_str == "1.2.643.7.1.1.2.2") return "Streebog-256"; if(oid_str == "1.2.643.7.1.1.2.3") return "Streebog-512"; if(oid_str == "1.2.840.10040.4.1") return "DSA"; if(oid_str == "1.2.840.10040.4.3") return "DSA/EMSA1(SHA-160)"; if(oid_str == "1.2.840.10045.2.1") return "ECDSA"; if(oid_str == "1.2.840.10045.3.1.1") return "secp192r1"; if(oid_str == "1.2.840.10045.3.1.2") return "x962_p192v2"; if(oid_str == "1.2.840.10045.3.1.3") return "x962_p192v3"; if(oid_str == "1.2.840.10045.3.1.4") return "x962_p239v1"; if(oid_str == "1.2.840.10045.3.1.5") return "x962_p239v2"; if(oid_str == "1.2.840.10045.3.1.6") return "x962_p239v3"; if(oid_str == "1.2.840.10045.3.1.7") return "secp256r1"; if(oid_str == "1.2.840.10045.4.1") return "ECDSA/EMSA1(SHA-160)"; if(oid_str == "1.2.840.10045.4.3.1") return "ECDSA/EMSA1(SHA-224)"; if(oid_str == "1.2.840.10045.4.3.2") return "ECDSA/EMSA1(SHA-256)"; if(oid_str == "1.2.840.10045.4.3.3") return "ECDSA/EMSA1(SHA-384)"; if(oid_str == "1.2.840.10045.4.3.4") return "ECDSA/EMSA1(SHA-512)"; if(oid_str == "1.2.840.10046.2.1") return "DH"; if(oid_str == "1.2.840.113533.7.66.10") return "CAST-128/CBC"; if(oid_str == "1.2.840.113533.7.66.15") return "KeyWrap.CAST-128"; if(oid_str == "1.2.840.113549.1.1.1") return "RSA"; if(oid_str == "1.2.840.113549.1.1.10") return "RSA/EMSA4"; if(oid_str == "1.2.840.113549.1.1.11") return "RSA/EMSA3(SHA-256)"; if(oid_str == "1.2.840.113549.1.1.12") return "RSA/EMSA3(SHA-384)"; if(oid_str == "1.2.840.113549.1.1.13") return "RSA/EMSA3(SHA-512)"; if(oid_str == "1.2.840.113549.1.1.14") return "RSA/EMSA3(SHA-224)"; if(oid_str == "1.2.840.113549.1.1.16") return "RSA/EMSA3(SHA-512-256)"; if(oid_str == "1.2.840.113549.1.1.4") return "RSA/EMSA3(MD5)"; if(oid_str == "1.2.840.113549.1.1.5") return "RSA/EMSA3(SHA-160)"; if(oid_str == "1.2.840.113549.1.1.7") return "RSA/OAEP"; if(oid_str == "1.2.840.113549.1.1.8") return "MGF1"; if(oid_str == "1.2.840.113549.1.5.12") return "PKCS5.PBKDF2"; if(oid_str == "1.2.840.113549.1.5.13") return "PBE-PKCS5v20"; if(oid_str == "1.2.840.113549.1.9.1") return "PKCS9.EmailAddress"; if(oid_str == "1.2.840.113549.1.9.14") return "PKCS9.ExtensionRequest"; if(oid_str == "1.2.840.113549.1.9.16.3.6") return "KeyWrap.TripleDES"; if(oid_str == "1.2.840.113549.1.9.16.3.7") return "KeyWrap.RC2"; if(oid_str == "1.2.840.113549.1.9.16.3.8") return "Compression.Zlib"; if(oid_str == "1.2.840.113549.1.9.2") return "PKCS9.UnstructuredName"; if(oid_str == "1.2.840.113549.1.9.3") return "PKCS9.ContentType"; if(oid_str == "1.2.840.113549.1.9.4") return "PKCS9.MessageDigest"; if(oid_str == "1.2.840.113549.1.9.7") return "PKCS9.ChallengePassword"; if(oid_str == "1.2.840.113549.2.10") return "HMAC(SHA-384)"; if(oid_str == "1.2.840.113549.2.11") return "HMAC(SHA-512)"; if(oid_str == "1.2.840.113549.2.5") return "MD5"; if(oid_str == "1.2.840.113549.2.7") return "HMAC(SHA-160)"; if(oid_str == "1.2.840.113549.2.8") return "HMAC(SHA-224)"; if(oid_str == "1.2.840.113549.2.9") return "HMAC(SHA-256)"; if(oid_str == "1.2.840.113549.3.2") return "RC2/CBC"; if(oid_str == "1.2.840.113549.3.7") return "TripleDES/CBC"; if(oid_str == "1.3.101.110") return "Curve25519"; if(oid_str == "1.3.101.112") return "Ed25519"; if(oid_str == "1.3.132.0.10") return "secp256k1"; if(oid_str == "1.3.132.0.30") return "secp160r2"; if(oid_str == "1.3.132.0.31") return "secp192k1"; if(oid_str == "1.3.132.0.32") return "secp224k1"; if(oid_str == "1.3.132.0.33") return "secp224r1"; if(oid_str == "1.3.132.0.34") return "secp384r1"; if(oid_str == "1.3.132.0.35") return "secp521r1"; if(oid_str == "1.3.132.0.8") return "secp160r1"; if(oid_str == "1.3.132.0.9") return "secp160k1"; if(oid_str == "1.3.132.1.12") return "ECDH"; if(oid_str == "1.3.14.3.2.26") return "SHA-160"; if(oid_str == "1.3.14.3.2.7") return "DES/CBC"; if(oid_str == "1.3.36.3.2.1") return "RIPEMD-160"; if(oid_str == "1.3.36.3.3.1.2") return "RSA/EMSA3(RIPEMD-160)"; if(oid_str == "1.3.36.3.3.2.5.2.1") return "ECGDSA"; if(oid_str == "1.3.36.3.3.2.5.4.1") return "ECGDSA/EMSA1(RIPEMD-160)"; if(oid_str == "1.3.36.3.3.2.5.4.2") return "ECGDSA/EMSA1(SHA-160)"; if(oid_str == "1.3.36.3.3.2.5.4.3") return "ECGDSA/EMSA1(SHA-224)"; if(oid_str == "1.3.36.3.3.2.5.4.4") return "ECGDSA/EMSA1(SHA-256)"; if(oid_str == "1.3.36.3.3.2.5.4.5") return "ECGDSA/EMSA1(SHA-384)"; if(oid_str == "1.3.36.3.3.2.5.4.6") return "ECGDSA/EMSA1(SHA-512)"; if(oid_str == "1.3.36.3.3.2.8.1.1.1") return "brainpool160r1"; if(oid_str == "1.3.36.3.3.2.8.1.1.11") return "brainpool384r1"; if(oid_str == "1.3.36.3.3.2.8.1.1.13") return "brainpool512r1"; if(oid_str == "1.3.36.3.3.2.8.1.1.3") return "brainpool192r1"; if(oid_str == "1.3.36.3.3.2.8.1.1.5") return "brainpool224r1"; if(oid_str == "1.3.36.3.3.2.8.1.1.7") return "brainpool256r1"; if(oid_str == "1.3.36.3.3.2.8.1.1.9") return "brainpool320r1"; if(oid_str == "1.3.6.1.4.1.11591.12.2") return "Tiger(24,3)"; if(oid_str == "1.3.6.1.4.1.25258.1.3") return "McEliece"; if(oid_str == "1.3.6.1.4.1.25258.1.5") return "XMSS"; if(oid_str == "1.3.6.1.4.1.25258.1.6.1") return "GOST-34.10/EMSA1(SHA-256)"; if(oid_str == "1.3.6.1.4.1.25258.3.1") return "Serpent/CBC"; if(oid_str == "1.3.6.1.4.1.25258.3.101") return "Serpent/GCM"; if(oid_str == "1.3.6.1.4.1.25258.3.102") return "Twofish/GCM"; if(oid_str == "1.3.6.1.4.1.25258.3.2") return "Threefish-512/CBC"; if(oid_str == "1.3.6.1.4.1.25258.3.2.1") return "AES-128/OCB"; if(oid_str == "1.3.6.1.4.1.25258.3.2.2") return "AES-192/OCB"; if(oid_str == "1.3.6.1.4.1.25258.3.2.3") return "AES-256/OCB"; if(oid_str == "1.3.6.1.4.1.25258.3.2.4") return "Serpent/OCB"; if(oid_str == "1.3.6.1.4.1.25258.3.2.5") return "Twofish/OCB"; if(oid_str == "1.3.6.1.4.1.25258.3.3") return "Twofish/CBC"; if(oid_str == "1.3.6.1.4.1.3029.1.2.1") return "ElGamal"; if(oid_str == "1.3.6.1.4.1.311.20.2.2") return "Microsoft SmartcardLogon"; if(oid_str == "1.3.6.1.4.1.8301.3.1.2.9.0.38") return "secp521r1"; if(oid_str == "1.3.6.1.5.5.7.1.1") return "PKIX.AuthorityInformationAccess"; if(oid_str == "1.3.6.1.5.5.7.3.1") return "PKIX.ServerAuth"; if(oid_str == "1.3.6.1.5.5.7.3.2") return "PKIX.ClientAuth"; if(oid_str == "1.3.6.1.5.5.7.3.3") return "PKIX.CodeSigning"; if(oid_str == "1.3.6.1.5.5.7.3.4") return "PKIX.EmailProtection"; if(oid_str == "1.3.6.1.5.5.7.3.5") return "PKIX.IPsecEndSystem"; if(oid_str == "1.3.6.1.5.5.7.3.6") return "PKIX.IPsecTunnel"; if(oid_str == "1.3.6.1.5.5.7.3.7") return "PKIX.IPsecUser"; if(oid_str == "1.3.6.1.5.5.7.3.8") return "PKIX.TimeStamping"; if(oid_str == "1.3.6.1.5.5.7.3.9") return "PKIX.OCSPSigning"; if(oid_str == "1.3.6.1.5.5.7.48.1") return "PKIX.OCSP"; if(oid_str == "1.3.6.1.5.5.7.48.1.1") return "PKIX.OCSP.BasicResponse"; if(oid_str == "1.3.6.1.5.5.7.48.2") return "PKIX.CertificateAuthorityIssuers"; if(oid_str == "1.3.6.1.5.5.7.8.5") return "PKIX.XMPPAddr"; if(oid_str == "2.16.840.1.101.3.4.1.2") return "AES-128/CBC"; if(oid_str == "2.16.840.1.101.3.4.1.22") return "AES-192/CBC"; if(oid_str == "2.16.840.1.101.3.4.1.25") return "KeyWrap.AES-192"; if(oid_str == "2.16.840.1.101.3.4.1.26") return "AES-192/GCM"; if(oid_str == "2.16.840.1.101.3.4.1.27") return "AES-192/CCM"; if(oid_str == "2.16.840.1.101.3.4.1.42") return "AES-256/CBC"; if(oid_str == "2.16.840.1.101.3.4.1.45") return "KeyWrap.AES-256"; if(oid_str == "2.16.840.1.101.3.4.1.46") return "AES-256/GCM"; if(oid_str == "2.16.840.1.101.3.4.1.47") return "AES-256/CCM"; if(oid_str == "2.16.840.1.101.3.4.1.5") return "KeyWrap.AES-128"; if(oid_str == "2.16.840.1.101.3.4.1.6") return "AES-128/GCM"; if(oid_str == "2.16.840.1.101.3.4.1.7") return "AES-128/CCM"; if(oid_str == "2.16.840.1.101.3.4.2.1") return "SHA-256"; if(oid_str == "2.16.840.1.101.3.4.2.10") return "SHA-3(512)"; if(oid_str == "2.16.840.1.101.3.4.2.11") return "SHAKE-128"; if(oid_str == "2.16.840.1.101.3.4.2.12") return "SHAKE-256"; if(oid_str == "2.16.840.1.101.3.4.2.2") return "SHA-384"; if(oid_str == "2.16.840.1.101.3.4.2.3") return "SHA-512"; if(oid_str == "2.16.840.1.101.3.4.2.4") return "SHA-224"; if(oid_str == "2.16.840.1.101.3.4.2.6") return "SHA-512-256"; if(oid_str == "2.16.840.1.101.3.4.2.7") return "SHA-3(224)"; if(oid_str == "2.16.840.1.101.3.4.2.8") return "SHA-3(256)"; if(oid_str == "2.16.840.1.101.3.4.2.9") return "SHA-3(384)"; if(oid_str == "2.16.840.1.101.3.4.3.1") return "DSA/EMSA1(SHA-224)"; if(oid_str == "2.16.840.1.101.3.4.3.10") return "ECDSA/EMSA1(SHA-3(256))"; if(oid_str == "2.16.840.1.101.3.4.3.11") return "ECDSA/EMSA1(SHA-3(384))"; if(oid_str == "2.16.840.1.101.3.4.3.12") return "ECDSA/EMSA1(SHA-3(512))"; if(oid_str == "2.16.840.1.101.3.4.3.13") return "RSA/EMSA3(SHA-3(224))"; if(oid_str == "2.16.840.1.101.3.4.3.14") return "RSA/EMSA3(SHA-3(256))"; if(oid_str == "2.16.840.1.101.3.4.3.15") return "RSA/EMSA3(SHA-3(384))"; if(oid_str == "2.16.840.1.101.3.4.3.16") return "RSA/EMSA3(SHA-3(512))"; if(oid_str == "2.16.840.1.101.3.4.3.2") return "DSA/EMSA1(SHA-256)"; if(oid_str == "2.16.840.1.101.3.4.3.3") return "DSA/EMSA1(SHA-384)"; if(oid_str == "2.16.840.1.101.3.4.3.4") return "DSA/EMSA1(SHA-512)"; if(oid_str == "2.16.840.1.101.3.4.3.5") return "DSA/EMSA1(SHA-3(224))"; if(oid_str == "2.16.840.1.101.3.4.3.6") return "DSA/EMSA1(SHA-3(256))"; if(oid_str == "2.16.840.1.101.3.4.3.7") return "DSA/EMSA1(SHA-3(384))"; if(oid_str == "2.16.840.1.101.3.4.3.8") return "DSA/EMSA1(SHA-3(512))"; if(oid_str == "2.16.840.1.101.3.4.3.9") return "ECDSA/EMSA1(SHA-3(224))"; if(oid_str == "2.5.29.14") return "X509v3.SubjectKeyIdentifier"; if(oid_str == "2.5.29.15") return "X509v3.KeyUsage"; if(oid_str == "2.5.29.17") return "X509v3.SubjectAlternativeName"; if(oid_str == "2.5.29.18") return "X509v3.IssuerAlternativeName"; if(oid_str == "2.5.29.19") return "X509v3.BasicConstraints"; if(oid_str == "2.5.29.20") return "X509v3.CRLNumber"; if(oid_str == "2.5.29.21") return "X509v3.ReasonCode"; if(oid_str == "2.5.29.23") return "X509v3.HoldInstructionCode"; if(oid_str == "2.5.29.24") return "X509v3.InvalidityDate"; if(oid_str == "2.5.29.28") return "X509v3.CRLIssuingDistributionPoint"; if(oid_str == "2.5.29.30") return "X509v3.NameConstraints"; if(oid_str == "2.5.29.31") return "X509v3.CRLDistributionPoints"; if(oid_str == "2.5.29.32") return "X509v3.CertificatePolicies"; if(oid_str == "2.5.29.32.0") return "X509v3.AnyPolicy"; if(oid_str == "2.5.29.35") return "X509v3.AuthorityKeyIdentifier"; if(oid_str == "2.5.29.36") return "X509v3.PolicyConstraints"; if(oid_str == "2.5.29.37") return "X509v3.ExtendedKeyUsage"; if(oid_str == "2.5.4.10") return "X520.Organization"; if(oid_str == "2.5.4.11") return "X520.OrganizationalUnit"; if(oid_str == "2.5.4.12") return "X520.Title"; if(oid_str == "2.5.4.3") return "X520.CommonName"; if(oid_str == "2.5.4.4") return "X520.Surname"; if(oid_str == "2.5.4.42") return "X520.GivenName"; if(oid_str == "2.5.4.43") return "X520.Initials"; if(oid_str == "2.5.4.44") return "X520.GenerationalQualifier"; if(oid_str == "2.5.4.46") return "X520.DNQualifier"; if(oid_str == "2.5.4.5") return "X520.SerialNumber"; if(oid_str == "2.5.4.6") return "X520.Country"; if(oid_str == "2.5.4.65") return "X520.Pseudonym"; if(oid_str == "2.5.4.7") return "X520.Locality"; if(oid_str == "2.5.4.8") return "X520.State"; if(oid_str == "2.5.8.1.1") return "RSA"; #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) if(oid_str == BOTAN_HOUSE_ECC_CURVE_OID) return BOTAN_HOUSE_ECC_CURVE_NAME; #endif return std::string(); } OID lookup(const std::string& name) { if(name == "AES-128/CBC") return OID("2.16.840.1.101.3.4.1.2"); if(name == "AES-128/CCM") return OID("2.16.840.1.101.3.4.1.7"); if(name == "AES-128/GCM") return OID("2.16.840.1.101.3.4.1.6"); if(name == "AES-128/OCB") return OID("1.3.6.1.4.1.25258.3.2.1"); if(name == "AES-192/CBC") return OID("2.16.840.1.101.3.4.1.22"); if(name == "AES-192/CCM") return OID("2.16.840.1.101.3.4.1.27"); if(name == "AES-192/GCM") return OID("2.16.840.1.101.3.4.1.26"); if(name == "AES-192/OCB") return OID("1.3.6.1.4.1.25258.3.2.2"); if(name == "AES-256/CBC") return OID("2.16.840.1.101.3.4.1.42"); if(name == "AES-256/CCM") return OID("2.16.840.1.101.3.4.1.47"); if(name == "AES-256/GCM") return OID("2.16.840.1.101.3.4.1.46"); if(name == "AES-256/OCB") return OID("1.3.6.1.4.1.25258.3.2.3"); if(name == "CAST-128/CBC") return OID("1.2.840.113533.7.66.10"); if(name == "Compression.Zlib") return OID("1.2.840.113549.1.9.16.3.8"); if(name == "Curve25519") return OID("1.3.101.110"); if(name == "DES/CBC") return OID("1.3.14.3.2.7"); if(name == "DH") return OID("1.2.840.10046.2.1"); if(name == "DSA") return OID("1.2.840.10040.4.1"); if(name == "DSA/EMSA1(SHA-160)") return OID("1.2.840.10040.4.3"); if(name == "DSA/EMSA1(SHA-224)") return OID("2.16.840.1.101.3.4.3.1"); if(name == "DSA/EMSA1(SHA-256)") return OID("2.16.840.1.101.3.4.3.2"); if(name == "DSA/EMSA1(SHA-3(224))") return OID("2.16.840.1.101.3.4.3.5"); if(name == "DSA/EMSA1(SHA-3(256))") return OID("2.16.840.1.101.3.4.3.6"); if(name == "DSA/EMSA1(SHA-3(384))") return OID("2.16.840.1.101.3.4.3.7"); if(name == "DSA/EMSA1(SHA-3(512))") return OID("2.16.840.1.101.3.4.3.8"); if(name == "DSA/EMSA1(SHA-384)") return OID("2.16.840.1.101.3.4.3.3"); if(name == "DSA/EMSA1(SHA-512)") return OID("2.16.840.1.101.3.4.3.4"); if(name == "ECDH") return OID("1.3.132.1.12"); if(name == "ECDSA") return OID("1.2.840.10045.2.1"); if(name == "ECDSA/EMSA1(SHA-160)") return OID("1.2.840.10045.4.1"); if(name == "ECDSA/EMSA1(SHA-224)") return OID("1.2.840.10045.4.3.1"); if(name == "ECDSA/EMSA1(SHA-256)") return OID("1.2.840.10045.4.3.2"); if(name == "ECDSA/EMSA1(SHA-3(224))") return OID("2.16.840.1.101.3.4.3.9"); if(name == "ECDSA/EMSA1(SHA-3(256))") return OID("2.16.840.1.101.3.4.3.10"); if(name == "ECDSA/EMSA1(SHA-3(384))") return OID("2.16.840.1.101.3.4.3.11"); if(name == "ECDSA/EMSA1(SHA-3(512))") return OID("2.16.840.1.101.3.4.3.12"); if(name == "ECDSA/EMSA1(SHA-384)") return OID("1.2.840.10045.4.3.3"); if(name == "ECDSA/EMSA1(SHA-512)") return OID("1.2.840.10045.4.3.4"); if(name == "ECGDSA") return OID("1.3.36.3.3.2.5.2.1"); if(name == "ECGDSA/EMSA1(RIPEMD-160)") return OID("1.3.36.3.3.2.5.4.1"); if(name == "ECGDSA/EMSA1(SHA-160)") return OID("1.3.36.3.3.2.5.4.2"); if(name == "ECGDSA/EMSA1(SHA-224)") return OID("1.3.36.3.3.2.5.4.3"); if(name == "ECGDSA/EMSA1(SHA-256)") return OID("1.3.36.3.3.2.5.4.4"); if(name == "ECGDSA/EMSA1(SHA-384)") return OID("1.3.36.3.3.2.5.4.5"); if(name == "ECGDSA/EMSA1(SHA-512)") return OID("1.3.36.3.3.2.5.4.6"); if(name == "ECKCDSA") return OID("1.0.14888.3.0.5"); if(name == "ECKCDSA/EMSA1(SHA-1)") return OID("1.2.410.200004.1.100.4.3"); if(name == "ECKCDSA/EMSA1(SHA-224)") return OID("1.2.410.200004.1.100.4.4"); if(name == "ECKCDSA/EMSA1(SHA-256)") return OID("1.2.410.200004.1.100.4.5"); if(name == "Ed25519") return OID("1.3.101.112"); if(name == "ElGamal") return OID("1.3.6.1.4.1.3029.1.2.1"); if(name == "GOST-34.10") return OID("1.2.643.2.2.19"); if(name == "GOST-34.10/EMSA1(GOST-R-34.11-94)") return OID("1.2.643.2.2.3"); if(name == "GOST-34.10/EMSA1(SHA-256)") return OID("1.3.6.1.4.1.25258.1.6.1"); if(name == "HMAC(SHA-160)") return OID("1.2.840.113549.2.7"); if(name == "HMAC(SHA-224)") return OID("1.2.840.113549.2.8"); if(name == "HMAC(SHA-256)") return OID("1.2.840.113549.2.9"); if(name == "HMAC(SHA-384)") return OID("1.2.840.113549.2.10"); if(name == "HMAC(SHA-512)") return OID("1.2.840.113549.2.11"); if(name == "KeyWrap.AES-128") return OID("2.16.840.1.101.3.4.1.5"); if(name == "KeyWrap.AES-192") return OID("2.16.840.1.101.3.4.1.25"); if(name == "KeyWrap.AES-256") return OID("2.16.840.1.101.3.4.1.45"); if(name == "KeyWrap.CAST-128") return OID("1.2.840.113533.7.66.15"); if(name == "KeyWrap.RC2") return OID("1.2.840.113549.1.9.16.3.7"); if(name == "KeyWrap.TripleDES") return OID("1.2.840.113549.1.9.16.3.6"); if(name == "MD5") return OID("1.2.840.113549.2.5"); if(name == "MGF1") return OID("1.2.840.113549.1.1.8"); if(name == "McEliece") return OID("1.3.6.1.4.1.25258.1.3"); if(name == "Microsoft SmartcardLogon") return OID("1.3.6.1.4.1.311.20.2.2"); if(name == "PBE-PKCS5v20") return OID("1.2.840.113549.1.5.13"); if(name == "PKCS5.PBKDF2") return OID("1.2.840.113549.1.5.12"); if(name == "PKCS9.ChallengePassword") return OID("1.2.840.113549.1.9.7"); if(name == "PKCS9.ContentType") return OID("1.2.840.113549.1.9.3"); if(name == "PKCS9.EmailAddress") return OID("1.2.840.113549.1.9.1"); if(name == "PKCS9.ExtensionRequest") return OID("1.2.840.113549.1.9.14"); if(name == "PKCS9.MessageDigest") return OID("1.2.840.113549.1.9.4"); if(name == "PKCS9.UnstructuredName") return OID("1.2.840.113549.1.9.2"); if(name == "PKIX.AuthorityInformationAccess") return OID("1.3.6.1.5.5.7.1.1"); if(name == "PKIX.CertificateAuthorityIssuers") return OID("1.3.6.1.5.5.7.48.2"); if(name == "PKIX.ClientAuth") return OID("1.3.6.1.5.5.7.3.2"); if(name == "PKIX.CodeSigning") return OID("1.3.6.1.5.5.7.3.3"); if(name == "PKIX.EmailProtection") return OID("1.3.6.1.5.5.7.3.4"); if(name == "PKIX.IPsecEndSystem") return OID("1.3.6.1.5.5.7.3.5"); if(name == "PKIX.IPsecTunnel") return OID("1.3.6.1.5.5.7.3.6"); if(name == "PKIX.IPsecUser") return OID("1.3.6.1.5.5.7.3.7"); if(name == "PKIX.OCSP") return OID("1.3.6.1.5.5.7.48.1"); if(name == "PKIX.OCSP.BasicResponse") return OID("1.3.6.1.5.5.7.48.1.1"); if(name == "PKIX.OCSPSigning") return OID("1.3.6.1.5.5.7.3.9"); if(name == "PKIX.ServerAuth") return OID("1.3.6.1.5.5.7.3.1"); if(name == "PKIX.TimeStamping") return OID("1.3.6.1.5.5.7.3.8"); if(name == "PKIX.XMPPAddr") return OID("1.3.6.1.5.5.7.8.5"); if(name == "RC2/CBC") return OID("1.2.840.113549.3.2"); if(name == "RIPEMD-160") return OID("1.3.36.3.2.1"); if(name == "RSA") return OID("1.2.840.113549.1.1.1"); if(name == "RSA/EMSA3(MD5)") return OID("1.2.840.113549.1.1.4"); if(name == "RSA/EMSA3(RIPEMD-160)") return OID("1.3.36.3.3.1.2"); if(name == "RSA/EMSA3(SHA-160)") return OID("1.2.840.113549.1.1.5"); if(name == "RSA/EMSA3(SHA-224)") return OID("1.2.840.113549.1.1.14"); if(name == "RSA/EMSA3(SHA-256)") return OID("1.2.840.113549.1.1.11"); if(name == "RSA/EMSA3(SHA-3(224))") return OID("2.16.840.1.101.3.4.3.13"); if(name == "RSA/EMSA3(SHA-3(256))") return OID("2.16.840.1.101.3.4.3.14"); if(name == "RSA/EMSA3(SHA-3(384))") return OID("2.16.840.1.101.3.4.3.15"); if(name == "RSA/EMSA3(SHA-3(512))") return OID("2.16.840.1.101.3.4.3.16"); if(name == "RSA/EMSA3(SHA-384)") return OID("1.2.840.113549.1.1.12"); if(name == "RSA/EMSA3(SHA-512)") return OID("1.2.840.113549.1.1.13"); if(name == "RSA/EMSA3(SHA-512-256)") return OID("1.2.840.113549.1.1.16"); if(name == "RSA/EMSA3(SM3)") return OID("1.2.156.10197.1.504"); if(name == "RSA/EMSA4") return OID("1.2.840.113549.1.1.10"); if(name == "RSA/OAEP") return OID("1.2.840.113549.1.1.7"); if(name == "SEED/CBC") return OID("1.2.410.200004.1.4"); if(name == "SHA-160") return OID("1.3.14.3.2.26"); if(name == "SHA-224") return OID("2.16.840.1.101.3.4.2.4"); if(name == "SHA-256") return OID("2.16.840.1.101.3.4.2.1"); if(name == "SHA-3(224)") return OID("2.16.840.1.101.3.4.2.7"); if(name == "SHA-3(256)") return OID("2.16.840.1.101.3.4.2.8"); if(name == "SHA-3(384)") return OID("2.16.840.1.101.3.4.2.9"); if(name == "SHA-3(512)") return OID("2.16.840.1.101.3.4.2.10"); if(name == "SHA-384") return OID("2.16.840.1.101.3.4.2.2"); if(name == "SHA-512") return OID("2.16.840.1.101.3.4.2.3"); if(name == "SHA-512-256") return OID("2.16.840.1.101.3.4.2.6"); if(name == "SHAKE-128") return OID("2.16.840.1.101.3.4.2.11"); if(name == "SHAKE-256") return OID("2.16.840.1.101.3.4.2.12"); if(name == "SM2_Enc") return OID("1.2.156.10197.1.301.3"); if(name == "SM2_Kex") return OID("1.2.156.10197.1.301.2"); if(name == "SM2_Sig") return OID("1.2.156.10197.1.301.1"); if(name == "SM3") return OID("1.2.156.10197.1.401"); if(name == "Serpent/CBC") return OID("1.3.6.1.4.1.25258.3.1"); if(name == "Serpent/GCM") return OID("1.3.6.1.4.1.25258.3.101"); if(name == "Serpent/OCB") return OID("1.3.6.1.4.1.25258.3.2.4"); if(name == "Streebog-256") return OID("1.2.643.7.1.1.2.2"); if(name == "Streebog-512") return OID("1.2.643.7.1.1.2.3"); if(name == "Threefish-512/CBC") return OID("1.3.6.1.4.1.25258.3.2"); if(name == "Tiger(24,3)") return OID("1.3.6.1.4.1.11591.12.2"); if(name == "TripleDES/CBC") return OID("1.2.840.113549.3.7"); if(name == "Twofish/CBC") return OID("1.3.6.1.4.1.25258.3.3"); if(name == "Twofish/GCM") return OID("1.3.6.1.4.1.25258.3.102"); if(name == "Twofish/OCB") return OID("1.3.6.1.4.1.25258.3.2.5"); if(name == "X509v3.AnyPolicy") return OID("2.5.29.32.0"); if(name == "X509v3.AuthorityKeyIdentifier") return OID("2.5.29.35"); if(name == "X509v3.BasicConstraints") return OID("2.5.29.19"); if(name == "X509v3.CRLDistributionPoints") return OID("2.5.29.31"); if(name == "X509v3.CRLIssuingDistributionPoint") return OID("2.5.29.28"); if(name == "X509v3.CRLNumber") return OID("2.5.29.20"); if(name == "X509v3.CertificatePolicies") return OID("2.5.29.32"); if(name == "X509v3.ExtendedKeyUsage") return OID("2.5.29.37"); if(name == "X509v3.HoldInstructionCode") return OID("2.5.29.23"); if(name == "X509v3.InvalidityDate") return OID("2.5.29.24"); if(name == "X509v3.IssuerAlternativeName") return OID("2.5.29.18"); if(name == "X509v3.KeyUsage") return OID("2.5.29.15"); if(name == "X509v3.NameConstraints") return OID("2.5.29.30"); if(name == "X509v3.PolicyConstraints") return OID("2.5.29.36"); if(name == "X509v3.ReasonCode") return OID("2.5.29.21"); if(name == "X509v3.SubjectAlternativeName") return OID("2.5.29.17"); if(name == "X509v3.SubjectKeyIdentifier") return OID("2.5.29.14"); if(name == "X520.CommonName") return OID("2.5.4.3"); if(name == "X520.Country") return OID("2.5.4.6"); if(name == "X520.DNQualifier") return OID("2.5.4.46"); if(name == "X520.GenerationalQualifier") return OID("2.5.4.44"); if(name == "X520.GivenName") return OID("2.5.4.42"); if(name == "X520.Initials") return OID("2.5.4.43"); if(name == "X520.Locality") return OID("2.5.4.7"); if(name == "X520.Organization") return OID("2.5.4.10"); if(name == "X520.OrganizationalUnit") return OID("2.5.4.11"); if(name == "X520.Pseudonym") return OID("2.5.4.65"); if(name == "X520.SerialNumber") return OID("2.5.4.5"); if(name == "X520.State") return OID("2.5.4.8"); if(name == "X520.Surname") return OID("2.5.4.4"); if(name == "X520.Title") return OID("2.5.4.12"); if(name == "XMSS") return OID("1.3.6.1.4.1.25258.1.5"); if(name == "brainpool160r1") return OID("1.3.36.3.3.2.8.1.1.1"); if(name == "brainpool192r1") return OID("1.3.36.3.3.2.8.1.1.3"); if(name == "brainpool224r1") return OID("1.3.36.3.3.2.8.1.1.5"); if(name == "brainpool256r1") return OID("1.3.36.3.3.2.8.1.1.7"); if(name == "brainpool320r1") return OID("1.3.36.3.3.2.8.1.1.9"); if(name == "brainpool384r1") return OID("1.3.36.3.3.2.8.1.1.11"); if(name == "brainpool512r1") return OID("1.3.36.3.3.2.8.1.1.13"); if(name == "frp256v1") return OID("1.2.250.1.223.101.256.1"); if(name == "gost_256A") return OID("1.2.643.2.2.35.1"); if(name == "secp160k1") return OID("1.3.132.0.9"); if(name == "secp160r1") return OID("1.3.132.0.8"); if(name == "secp160r2") return OID("1.3.132.0.30"); if(name == "secp192k1") return OID("1.3.132.0.31"); if(name == "secp192r1") return OID("1.2.840.10045.3.1.1"); if(name == "secp224k1") return OID("1.3.132.0.32"); if(name == "secp224r1") return OID("1.3.132.0.33"); if(name == "secp256k1") return OID("1.3.132.0.10"); if(name == "secp256r1") return OID("1.2.840.10045.3.1.7"); if(name == "secp384r1") return OID("1.3.132.0.34"); if(name == "secp521r1") return OID("1.3.132.0.35"); if(name == "sm2p256v1") return OID("1.2.156.10197.1.301"); if(name == "x962_p192v2") return OID("1.2.840.10045.3.1.2"); if(name == "x962_p192v3") return OID("1.2.840.10045.3.1.3"); if(name == "x962_p239v1") return OID("1.2.840.10045.3.1.4"); if(name == "x962_p239v2") return OID("1.2.840.10045.3.1.5"); if(name == "x962_p239v3") return OID("1.2.840.10045.3.1.6"); #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) if(name == BOTAN_HOUSE_ECC_CURVE_NAME) return OID(BOTAN_HOUSE_ECC_CURVE_OID); #endif return OID(); } } } botan-2.4.0/src/lib/asn1/oids.h000066400000000000000000000020161322470703100161240ustar00rootroot00000000000000/* * OID Registry * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OIDS_H_ #define BOTAN_OIDS_H_ #include namespace Botan { namespace OIDS { /** * Resolve an OID * @param oid the OID to look up * @return name associated with this OID */ BOTAN_PUBLIC_API(2,0) std::string lookup(const OID& oid); /** * Find the OID to a name. The lookup will be performed in the * general OID section of the configuration. * @param name the name to resolve * @return OID associated with the specified name */ BOTAN_PUBLIC_API(2,0) OID lookup(const std::string& name); inline std::string oid2str(const OID& oid) { return lookup(oid); } inline OID str2oid(const std::string& name) { return lookup(name); } /** * See if an OID exists in the internal table. * @param oid the oid to check for * @return true if the oid is registered */ inline bool have_oid(const std::string& oid) { return (lookup(oid).empty() == false); } } } #endif botan-2.4.0/src/lib/base/000077500000000000000000000000001322470703100150665ustar00rootroot00000000000000botan-2.4.0/src/lib/base/botan.h000066400000000000000000000017551322470703100163520ustar00rootroot00000000000000/* * A vague catch all include file for Botan * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BOTAN_H_ #define BOTAN_BOTAN_H_ /* * There is no real reason for this header to exist beyond historical * reasons. The application should instead include the specific header * files that define the interfaces it intends to use. * * This header file will be removed in Botan 3.x */ #if defined(__GNUC__) #warning "botan/botan.h is deprecated" #elif defined(_MSC_VER) #pragma message ("botan/botan.h is deprecated") #endif #include #include #include #include #include #include #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif #if defined(BOTAN_HAS_FILTERS) #include #endif #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #include #endif #endif botan-2.4.0/src/lib/base/buf_comp.h000066400000000000000000000116351322470703100170370ustar00rootroot00000000000000/* * Buffered Computation * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BUFFERED_COMPUTATION_H_ #define BOTAN_BUFFERED_COMPUTATION_H_ #include #include #include namespace Botan { /** * This class represents any kind of computation which uses an internal * state, such as hash functions or MACs */ class BOTAN_PUBLIC_API(2,0) Buffered_Computation { public: /** * @return length of the output of this function in bytes */ virtual size_t output_length() const = 0; /** * Add new input to process. * @param in the input to process as a byte array * @param length of param in in bytes */ void update(const uint8_t in[], size_t length) { add_data(in, length); } /** * Add new input to process. * @param in the input to process as a secure_vector */ void update(const secure_vector& in) { add_data(in.data(), in.size()); } /** * Add new input to process. * @param in the input to process as a std::vector */ void update(const std::vector& in) { add_data(in.data(), in.size()); } /** * Add an integer in big-endian order * @param in the value */ template void update_be(const T in) { for(size_t i = 0; i != sizeof(T); ++i) { uint8_t b = get_byte(i, in); add_data(&b, 1); } } /** * Add new input to process. * @param str the input to process as a std::string. Will be interpreted * as a byte array based on the strings encoding. */ void update(const std::string& str) { add_data(cast_char_ptr_to_uint8(str.data()), str.size()); } /** * Process a single byte. * @param in the byte to process */ void update(uint8_t in) { add_data(&in, 1); } /** * Complete the computation and retrieve the * final result. * @param out The byte array to be filled with the result. * Must be of length output_length() */ void final(uint8_t out[]) { final_result(out); } /** * Complete the computation and retrieve the * final result. * @return secure_vector holding the result */ secure_vector final() { secure_vector output(output_length()); final_result(output.data()); return output; } std::vector final_stdvec() { std::vector output(output_length()); final_result(output.data()); return output; } template void final(std::vector& out) { out.resize(output_length()); final_result(out.data()); } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process as a byte array * @param length the length of the byte array * @result the result of the call to final() */ secure_vector process(const uint8_t in[], size_t length) { add_data(in, length); return final(); } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process * @result the result of the call to final() */ secure_vector process(const secure_vector& in) { add_data(in.data(), in.size()); return final(); } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process * @result the result of the call to final() */ secure_vector process(const std::vector& in) { add_data(in.data(), in.size()); return final(); } /** * Update and finalize computation. Does the same as calling update() * and final() consecutively. * @param in the input to process as a string * @result the result of the call to final() */ secure_vector process(const std::string& in) { update(in); return final(); } virtual ~Buffered_Computation() = default; private: /** * Add more data to the computation * @param input is an input buffer * @param length is the length of input in bytes */ virtual void add_data(const uint8_t input[], size_t length) = 0; /** * Write the final output to out * @param out is an output buffer of output_length() */ virtual void final_result(uint8_t out[]) = 0; }; } #endif botan-2.4.0/src/lib/base/info.txt000066400000000000000000000002721322470703100165630ustar00rootroot00000000000000 botan.h buf_comp.h init.h key_spec.h lookup.h secmem.h scan_name.h sym_algo.h symkey.h block hash hex mac modes rng stream utils botan-2.4.0/src/lib/base/init.h000066400000000000000000000014741322470703100162100ustar00rootroot00000000000000/* * Library Initialization * (C) 1999-2008,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_LIBRARY_INITIALIZER_H_ #define BOTAN_LIBRARY_INITIALIZER_H_ #include #include namespace Botan { /* * Previously botan had state whose lifetime had to be explicitly * managed by the application. As of 1.11.14 this is no longer the * case, and this class is no longer needed and kept only for backwards * compatibility. */ class BOTAN_PUBLIC_API(2,0) BOTAN_DEPRECATED("LibraryInitializer is no longer required") LibraryInitializer final { public: explicit LibraryInitializer(const std::string& /*ignored*/ = "") { } static void initialize(const std::string& /*ignored*/ = "") {} static void deinitialize() {} }; } #endif botan-2.4.0/src/lib/base/key_spec.h000066400000000000000000000047501322470703100170470ustar00rootroot00000000000000/* * Symmetric Key Length Specification * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KEY_LEN_SPECIFICATION_H_ #define BOTAN_KEY_LEN_SPECIFICATION_H_ #include namespace Botan { /** * Represents the length requirements on an algorithm key */ class BOTAN_PUBLIC_API(2,0) Key_Length_Specification final { public: /** * Constructor for fixed length keys * @param keylen the supported key length */ explicit Key_Length_Specification(size_t keylen) : m_min_keylen(keylen), m_max_keylen(keylen), m_keylen_mod(1) { } /** * Constructor for variable length keys * @param min_k the smallest supported key length * @param max_k the largest supported key length * @param k_mod the number of bytes the key must be a multiple of */ Key_Length_Specification(size_t min_k, size_t max_k, size_t k_mod = 1) : m_min_keylen(min_k), m_max_keylen(max_k ? max_k : min_k), m_keylen_mod(k_mod) { } /** * @param length is a key length in bytes * @return true iff this length is a valid length for this algo */ bool valid_keylength(size_t length) const { return ((length >= m_min_keylen) && (length <= m_max_keylen) && (length % m_keylen_mod == 0)); } /** * @return minimum key length in bytes */ size_t minimum_keylength() const { return m_min_keylen; } /** * @return maximum key length in bytes */ size_t maximum_keylength() const { return m_max_keylen; } /** * @return key length multiple in bytes */ size_t keylength_multiple() const { return m_keylen_mod; } /* * Multiplies all length requirements with the given factor * @param n the multiplication factor * @return a key length specification multiplied by the factor */ Key_Length_Specification multiple(size_t n) const { return Key_Length_Specification(n * m_min_keylen, n * m_max_keylen, n * m_keylen_mod); } private: size_t m_min_keylen, m_max_keylen, m_keylen_mod; }; } #endif botan-2.4.0/src/lib/base/lookup.h000066400000000000000000000111701322470703100165500ustar00rootroot00000000000000/* * Algorithm Lookup * (C) 1999-2007,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_LOOKUP_H_ #define BOTAN_LOOKUP_H_ #include #include #include #include #include #include #include #include namespace Botan { /* * As of 1.11.26 this header is deprecated. Instead use the calls T::create and * T::providers (as demonstrated in the implementation below). */ /* * Get an algorithm object * NOTE: these functions create and return new objects, letting the * caller assume ownership of them */ /** * Block cipher factory method. * * @param algo_spec the name of the desired block cipher * @param provider the provider to use * @return pointer to the block cipher object */ BOTAN_DEPRECATED("Use BlockCipher::create") inline BlockCipher* get_block_cipher(const std::string& algo_spec, const std::string& provider = "") { return BlockCipher::create(algo_spec, provider).release(); } BOTAN_DEPRECATED("Use BlockCipher::create_or_throw") inline std::unique_ptr make_block_cipher(const std::string& algo_spec, const std::string& provider = "") { return BlockCipher::create_or_throw(algo_spec, provider); } BOTAN_DEPRECATED("Use BlockCipher::providers") inline std::vector get_block_cipher_providers(const std::string& algo_spec) { return BlockCipher::providers(algo_spec); } /** * Stream cipher factory method. * * @param algo_spec the name of the desired stream cipher * @param provider the provider to use * @return pointer to the stream cipher object */ BOTAN_DEPRECATED("Use StreamCipher::create") inline StreamCipher* get_stream_cipher(const std::string& algo_spec, const std::string& provider = "") { return StreamCipher::create(algo_spec, provider).release(); } BOTAN_DEPRECATED("Use StreamCipher::create_or_throw") inline std::unique_ptr make_stream_cipher(const std::string& algo_spec, const std::string& provider = "") { return StreamCipher::create_or_throw(algo_spec, provider); } BOTAN_DEPRECATED("Use StreamCipher::providers") inline std::vector get_stream_cipher_providers(const std::string& algo_spec) { return StreamCipher::providers(algo_spec); } /** * Hash function factory method. * * @param algo_spec the name of the desired hash function * @param provider the provider to use * @return pointer to the hash function object */ BOTAN_DEPRECATED("Use HashFunction::create") inline HashFunction* get_hash_function(const std::string& algo_spec, const std::string& provider = "") { return HashFunction::create(algo_spec, provider).release(); } BOTAN_DEPRECATED("Use HashFunction::create_or_throw") inline std::unique_ptr make_hash_function(const std::string& algo_spec, const std::string& provider = "") { return HashFunction::create_or_throw(algo_spec, provider); } BOTAN_DEPRECATED("Use HashFunction::create") inline HashFunction* get_hash(const std::string& algo_spec, const std::string& provider = "") { return HashFunction::create(algo_spec, provider).release(); } BOTAN_DEPRECATED("Use HashFunction::providers") inline std::vector get_hash_function_providers(const std::string& algo_spec) { return HashFunction::providers(algo_spec); } /** * MAC factory method. * * @param algo_spec the name of the desired MAC * @param provider the provider to use * @return pointer to the MAC object */ BOTAN_DEPRECATED("MessageAuthenticationCode::create") inline MessageAuthenticationCode* get_mac(const std::string& algo_spec, const std::string& provider = "") { return MessageAuthenticationCode::create(algo_spec, provider).release(); } BOTAN_DEPRECATED("MessageAuthenticationCode::create_or_throw") inline std::unique_ptr make_message_auth(const std::string& algo_spec, const std::string& provider = "") { return MessageAuthenticationCode::create(algo_spec, provider); } BOTAN_DEPRECATED("MessageAuthenticationCode::providers") inline std::vector get_mac_providers(const std::string& algo_spec) { return MessageAuthenticationCode::providers(algo_spec); } } #endif botan-2.4.0/src/lib/base/scan_name.cpp000066400000000000000000000064151322470703100175240ustar00rootroot00000000000000/* * SCAN Name Abstraction * (C) 2008-2009,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { std::string make_arg( const std::vector >& name, size_t start) { std::string output = name[start].second; size_t level = name[start].first; size_t paren_depth = 0; for(size_t i = start + 1; i != name.size(); ++i) { if(name[i].first <= name[start].first) break; if(name[i].first > level) { output += "(" + name[i].second; ++paren_depth; } else if(name[i].first < level) { output += ")," + name[i].second; --paren_depth; } else { if(output[output.size() - 1] != '(') output += ","; output += name[i].second; } level = name[i].first; } for(size_t i = 0; i != paren_depth; ++i) output += ")"; return output; } } SCAN_Name::SCAN_Name(const char* algo_spec) : SCAN_Name(std::string(algo_spec)) { } SCAN_Name::SCAN_Name(std::string algo_spec) : m_orig_algo_spec(algo_spec), m_alg_name(), m_args(), m_mode_info() { std::vector > name; size_t level = 0; std::pair accum = std::make_pair(level, ""); const std::string decoding_error = "Bad SCAN name '" + algo_spec + "': "; for(size_t i = 0; i != algo_spec.size(); ++i) { char c = algo_spec[i]; if(c == '/' || c == ',' || c == '(' || c == ')') { if(c == '(') ++level; else if(c == ')') { if(level == 0) throw Decoding_Error(decoding_error + "Mismatched parens"); --level; } if(c == '/' && level > 0) accum.second.push_back(c); else { if(accum.second != "") name.push_back(accum); accum = std::make_pair(level, ""); } } else accum.second.push_back(c); } if(accum.second != "") name.push_back(accum); if(level != 0) throw Decoding_Error(decoding_error + "Missing close paren"); if(name.size() == 0) throw Decoding_Error(decoding_error + "Empty name"); m_alg_name = name[0].second; bool in_modes = false; for(size_t i = 1; i != name.size(); ++i) { if(name[i].first == 0) { m_mode_info.push_back(make_arg(name, i)); in_modes = true; } else if(name[i].first == 1 && !in_modes) m_args.push_back(make_arg(name, i)); } } std::string SCAN_Name::arg(size_t i) const { if(i >= arg_count()) throw Invalid_Argument("SCAN_Name::arg " + std::to_string(i) + " out of range for '" + as_string() + "'"); return m_args[i]; } std::string SCAN_Name::arg(size_t i, const std::string& def_value) const { if(i >= arg_count()) return def_value; return m_args[i]; } size_t SCAN_Name::arg_as_integer(size_t i, size_t def_value) const { if(i >= arg_count()) return def_value; return to_u32bit(m_args[i]); } } botan-2.4.0/src/lib/base/scan_name.h000066400000000000000000000056251322470703100171730ustar00rootroot00000000000000/* * SCAN Name Abstraction * (C) 2008,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SCAN_NAME_H_ #define BOTAN_SCAN_NAME_H_ #include #include #include namespace Botan { /** A class encapsulating a SCAN name (similar to JCE conventions) http://www.users.zetnet.co.uk/hopwood/crypto/scan/ */ class BOTAN_PUBLIC_API(2,0) SCAN_Name final { public: /** * Create a SCAN_Name * @param algo_spec A SCAN-format name */ explicit SCAN_Name(const char* algo_spec); /** * Create a SCAN_Name * @param algo_spec A SCAN-format name */ explicit SCAN_Name(std::string algo_spec); /** * @return original input string */ const std::string& as_string() const { return m_orig_algo_spec; } /** * @return algorithm name */ const std::string& algo_name() const { return m_alg_name; } /** * @return number of arguments */ size_t arg_count() const { return m_args.size(); } /** * @param lower is the lower bound * @param upper is the upper bound * @return if the number of arguments is between lower and upper */ bool arg_count_between(size_t lower, size_t upper) const { return ((arg_count() >= lower) && (arg_count() <= upper)); } /** * @param i which argument * @return ith argument */ std::string arg(size_t i) const; /** * @param i which argument * @param def_value the default value * @return ith argument or the default value */ std::string arg(size_t i, const std::string& def_value) const; /** * @param i which argument * @param def_value the default value * @return ith argument as an integer, or the default value */ size_t arg_as_integer(size_t i, size_t def_value) const; /** * @return cipher mode (if any) */ std::string cipher_mode() const { return (m_mode_info.size() >= 1) ? m_mode_info[0] : ""; } /** * @return cipher mode padding (if any) */ std::string cipher_mode_pad() const { return (m_mode_info.size() >= 2) ? m_mode_info[1] : ""; } private: std::string m_orig_algo_spec; std::string m_alg_name; std::vector m_args; std::vector m_mode_info; }; // This is unrelated but it is convenient to stash it here template std::vector probe_providers_of(const std::string& algo_spec, const std::vector& possible) { std::vector providers; for(auto&& prov : possible) { std::unique_ptr o(T::create(algo_spec, prov)); if(o) { providers.push_back(prov); // available } } return providers; } } #endif botan-2.4.0/src/lib/base/secmem.h000066400000000000000000000126201322470703100165110ustar00rootroot00000000000000/* * Secure Memory Buffers * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SECURE_MEMORY_BUFFERS_H_ #define BOTAN_SECURE_MEMORY_BUFFERS_H_ #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include #include #include namespace Botan { template class secure_allocator { public: /* * Assert exists to prevent someone from doing something that will * probably crash anyway (like secure_vector where ~non_POD_t * deletes a member pointer which was zeroed before it ran). * MSVC in debug mode uses non-integral proxy types in container types * like std::vector, thus we disable the check there. */ #if !defined(_ITERATOR_DEBUG_LEVEL) || _ITERATOR_DEBUG_LEVEL == 0 static_assert(std::is_integral::value, "secure_allocator supports only integer types"); #endif typedef T value_type; typedef std::size_t size_type; #ifdef BOTAN_BUILD_COMPILER_IS_MSVC_2013 secure_allocator() = default; secure_allocator(const secure_allocator&) = default; secure_allocator& operator=(const secure_allocator&) = default; ~secure_allocator() = default; template struct rebind { typedef secure_allocator other; }; void construct(value_type* mem, const value_type& value) { std::_Construct(mem, value); } void destroy(value_type* mem) { std::_Destroy(mem); } #else secure_allocator() BOTAN_NOEXCEPT = default; secure_allocator(const secure_allocator&) BOTAN_NOEXCEPT = default; secure_allocator& operator=(const secure_allocator&) BOTAN_NOEXCEPT = default; ~secure_allocator() BOTAN_NOEXCEPT = default; #endif template secure_allocator(const secure_allocator&) BOTAN_NOEXCEPT {} T* allocate(std::size_t n) { return static_cast(allocate_memory(n, sizeof(T))); } void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); } }; template inline bool operator==(const secure_allocator&, const secure_allocator&) { return true; } template inline bool operator!=(const secure_allocator&, const secure_allocator&) { return false; } template using secure_vector = std::vector>; template using secure_deque = std::deque>; // For better compatability with 1.10 API template using SecureVector = secure_vector; template std::vector unlock(const secure_vector& in) { std::vector out(in.size()); copy_mem(out.data(), in.data(), in.size()); return out; } template size_t buffer_insert(std::vector& buf, size_t buf_offset, const T input[], size_t input_length) { const size_t to_copy = std::min(input_length, buf.size() - buf_offset); if(to_copy > 0) { copy_mem(&buf[buf_offset], input, to_copy); } return to_copy; } template size_t buffer_insert(std::vector& buf, size_t buf_offset, const std::vector& input) { const size_t to_copy = std::min(input.size(), buf.size() - buf_offset); if(to_copy > 0) { copy_mem(&buf[buf_offset], input.data(), to_copy); } return to_copy; } template std::vector& operator+=(std::vector& out, const std::vector& in) { const size_t copy_offset = out.size(); out.resize(out.size() + in.size()); if(in.size() > 0) { copy_mem(&out[copy_offset], in.data(), in.size()); } return out; } template std::vector& operator+=(std::vector& out, T in) { out.push_back(in); return out; } template std::vector& operator+=(std::vector& out, const std::pair& in) { const size_t copy_offset = out.size(); out.resize(out.size() + in.second); if(in.second > 0) { copy_mem(&out[copy_offset], in.first, in.second); } return out; } template std::vector& operator+=(std::vector& out, const std::pair& in) { const size_t copy_offset = out.size(); out.resize(out.size() + in.second); if(in.second > 0) { copy_mem(&out[copy_offset], in.first, in.second); } return out; } /** * Zeroise the values; length remains unchanged * @param vec the vector to zeroise */ template void zeroise(std::vector& vec) { clear_mem(vec.data(), vec.size()); } /** * Zeroise the values then free the memory * @param vec the vector to zeroise and free */ template void zap(std::vector& vec) { zeroise(vec); vec.clear(); vec.shrink_to_fit(); } } #endif botan-2.4.0/src/lib/base/sym_algo.h000066400000000000000000000050201322470703100170460ustar00rootroot00000000000000/* * Symmetric Algorithm Base Class * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SYMMETRIC_ALGORITHM_H_ #define BOTAN_SYMMETRIC_ALGORITHM_H_ #include #include #include #include namespace Botan { /** * This class represents a symmetric algorithm object. */ class BOTAN_PUBLIC_API(2,0) SymmetricAlgorithm { public: virtual ~SymmetricAlgorithm() = default; /** * Reset the state. */ virtual void clear() = 0; /** * @return object describing limits on key size */ virtual Key_Length_Specification key_spec() const = 0; /** * @return minimum allowed key length */ size_t maximum_keylength() const { return key_spec().maximum_keylength(); } /** * @return maximum allowed key length */ size_t minimum_keylength() const { return key_spec().minimum_keylength(); } /** * Check whether a given key length is valid for this algorithm. * @param length the key length to be checked. * @return true if the key length is valid. */ bool valid_keylength(size_t length) const { return key_spec().valid_keylength(length); } /** * Set the symmetric key of this object. * @param key the SymmetricKey to be set. */ void set_key(const SymmetricKey& key) { set_key(key.begin(), key.length()); } template void set_key(const std::vector& key) { set_key(key.data(), key.size()); } /** * Set the symmetric key of this object. * @param key the to be set as a byte array. * @param length in bytes of key param */ void set_key(const uint8_t key[], size_t length) { if(!valid_keylength(length)) throw Invalid_Key_Length(name(), length); key_schedule(key, length); } /** * @return the algorithm name */ virtual std::string name() const = 0; protected: void verify_key_set(bool cond) const { if(cond == false) throw Key_Not_Set(name()); } private: /** * Run the key schedule * @param key the key * @param length of key */ virtual void key_schedule(const uint8_t key[], size_t length) = 0; }; } #endif botan-2.4.0/src/lib/base/symkey.cpp000066400000000000000000000074771322470703100171320ustar00rootroot00000000000000/* * OctetString * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Create an OctetString from RNG output */ OctetString::OctetString(RandomNumberGenerator& rng, size_t len) { m_data = rng.random_vec(len); } /* * Create an OctetString from a hex string */ OctetString::OctetString(const std::string& hex_string) { m_data.resize(1 + hex_string.length() / 2); m_data.resize(hex_decode(m_data.data(), hex_string)); } /* * Create an OctetString from a byte string */ OctetString::OctetString(const uint8_t in[], size_t n) { m_data.assign(in, in + n); } /* * Set the parity of each key byte to odd */ void OctetString::set_odd_parity() { const uint8_t ODD_PARITY[256] = { 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x07, 0x07, 0x08, 0x08, 0x0B, 0x0B, 0x0D, 0x0D, 0x0E, 0x0E, 0x10, 0x10, 0x13, 0x13, 0x15, 0x15, 0x16, 0x16, 0x19, 0x19, 0x1A, 0x1A, 0x1C, 0x1C, 0x1F, 0x1F, 0x20, 0x20, 0x23, 0x23, 0x25, 0x25, 0x26, 0x26, 0x29, 0x29, 0x2A, 0x2A, 0x2C, 0x2C, 0x2F, 0x2F, 0x31, 0x31, 0x32, 0x32, 0x34, 0x34, 0x37, 0x37, 0x38, 0x38, 0x3B, 0x3B, 0x3D, 0x3D, 0x3E, 0x3E, 0x40, 0x40, 0x43, 0x43, 0x45, 0x45, 0x46, 0x46, 0x49, 0x49, 0x4A, 0x4A, 0x4C, 0x4C, 0x4F, 0x4F, 0x51, 0x51, 0x52, 0x52, 0x54, 0x54, 0x57, 0x57, 0x58, 0x58, 0x5B, 0x5B, 0x5D, 0x5D, 0x5E, 0x5E, 0x61, 0x61, 0x62, 0x62, 0x64, 0x64, 0x67, 0x67, 0x68, 0x68, 0x6B, 0x6B, 0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x70, 0x73, 0x73, 0x75, 0x75, 0x76, 0x76, 0x79, 0x79, 0x7A, 0x7A, 0x7C, 0x7C, 0x7F, 0x7F, 0x80, 0x80, 0x83, 0x83, 0x85, 0x85, 0x86, 0x86, 0x89, 0x89, 0x8A, 0x8A, 0x8C, 0x8C, 0x8F, 0x8F, 0x91, 0x91, 0x92, 0x92, 0x94, 0x94, 0x97, 0x97, 0x98, 0x98, 0x9B, 0x9B, 0x9D, 0x9D, 0x9E, 0x9E, 0xA1, 0xA1, 0xA2, 0xA2, 0xA4, 0xA4, 0xA7, 0xA7, 0xA8, 0xA8, 0xAB, 0xAB, 0xAD, 0xAD, 0xAE, 0xAE, 0xB0, 0xB0, 0xB3, 0xB3, 0xB5, 0xB5, 0xB6, 0xB6, 0xB9, 0xB9, 0xBA, 0xBA, 0xBC, 0xBC, 0xBF, 0xBF, 0xC1, 0xC1, 0xC2, 0xC2, 0xC4, 0xC4, 0xC7, 0xC7, 0xC8, 0xC8, 0xCB, 0xCB, 0xCD, 0xCD, 0xCE, 0xCE, 0xD0, 0xD0, 0xD3, 0xD3, 0xD5, 0xD5, 0xD6, 0xD6, 0xD9, 0xD9, 0xDA, 0xDA, 0xDC, 0xDC, 0xDF, 0xDF, 0xE0, 0xE0, 0xE3, 0xE3, 0xE5, 0xE5, 0xE6, 0xE6, 0xE9, 0xE9, 0xEA, 0xEA, 0xEC, 0xEC, 0xEF, 0xEF, 0xF1, 0xF1, 0xF2, 0xF2, 0xF4, 0xF4, 0xF7, 0xF7, 0xF8, 0xF8, 0xFB, 0xFB, 0xFD, 0xFD, 0xFE, 0xFE }; for(size_t j = 0; j != m_data.size(); ++j) m_data[j] = ODD_PARITY[m_data[j]]; } /* * Hex encode an OctetString */ std::string OctetString::as_string() const { return hex_encode(m_data.data(), m_data.size()); } /* * XOR Operation for OctetStrings */ OctetString& OctetString::operator^=(const OctetString& k) { if(&k == this) { zeroise(m_data); return (*this); } xor_buf(m_data.data(), k.begin(), std::min(length(), k.length())); return (*this); } /* * Equality Operation for OctetStrings */ bool operator==(const OctetString& s1, const OctetString& s2) { return (s1.bits_of() == s2.bits_of()); } /* * Unequality Operation for OctetStrings */ bool operator!=(const OctetString& s1, const OctetString& s2) { return !(s1 == s2); } /* * Append Operation for OctetStrings */ OctetString operator+(const OctetString& k1, const OctetString& k2) { secure_vector out; out += k1.bits_of(); out += k2.bits_of(); return OctetString(out); } /* * XOR Operation for OctetStrings */ OctetString operator^(const OctetString& k1, const OctetString& k2) { secure_vector out(std::max(k1.length(), k2.length())); copy_mem(out.data(), k1.begin(), k1.length()); xor_buf(out.data(), k2.begin(), k2.length()); return OctetString(out); } } botan-2.4.0/src/lib/base/symkey.h000066400000000000000000000064201322470703100165620ustar00rootroot00000000000000/* * OctetString * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SYMKEY_H_ #define BOTAN_SYMKEY_H_ #include #include namespace Botan { /** * Octet String */ class BOTAN_PUBLIC_API(2,0) OctetString final { public: /** * @return size of this octet string in bytes */ size_t length() const { return m_data.size(); } size_t size() const { return m_data.size(); } /** * @return this object as a secure_vector */ secure_vector bits_of() const { return m_data; } /** * @return start of this string */ const uint8_t* begin() const { return m_data.data(); } /** * @return end of this string */ const uint8_t* end() const { return begin() + m_data.size(); } /** * @return this encoded as hex */ std::string as_string() const; /** * XOR the contents of another octet string into this one * @param other octet string * @return reference to this */ OctetString& operator^=(const OctetString& other); /** * Force to have odd parity */ void set_odd_parity(); /** * Create a new OctetString * @param str is a hex encoded string */ explicit OctetString(const std::string& str = ""); /** * Create a new random OctetString * @param rng is a random number generator * @param len is the desired length in bytes */ OctetString(class RandomNumberGenerator& rng, size_t len); /** * Create a new OctetString * @param in is an array * @param len is the length of in in bytes */ OctetString(const uint8_t in[], size_t len); /** * Create a new OctetString * @param in a bytestring */ OctetString(const secure_vector& in) : m_data(in) {} /** * Create a new OctetString * @param in a bytestring */ OctetString(const std::vector& in) : m_data(in.begin(), in.end()) {} private: secure_vector m_data; }; /** * Compare two strings * @param x an octet string * @param y an octet string * @return if x is equal to y */ BOTAN_PUBLIC_API(2,0) bool operator==(const OctetString& x, const OctetString& y); /** * Compare two strings * @param x an octet string * @param y an octet string * @return if x is not equal to y */ BOTAN_PUBLIC_API(2,0) bool operator!=(const OctetString& x, const OctetString& y); /** * Concatenate two strings * @param x an octet string * @param y an octet string * @return x concatenated with y */ BOTAN_PUBLIC_API(2,0) OctetString operator+(const OctetString& x, const OctetString& y); /** * XOR two strings * @param x an octet string * @param y an octet string * @return x XORed with y */ BOTAN_PUBLIC_API(2,0) OctetString operator^(const OctetString& x, const OctetString& y); /** * Alternate name for octet string showing intent to use as a key */ using SymmetricKey = OctetString; /** * Alternate name for octet string showing intent to use as an IV */ using InitializationVector = OctetString; } #endif botan-2.4.0/src/lib/block/000077500000000000000000000000001322470703100152465ustar00rootroot00000000000000botan-2.4.0/src/lib/block/aes/000077500000000000000000000000001322470703100160165ustar00rootroot00000000000000botan-2.4.0/src/lib/block/aes/aes.cpp000066400000000000000000000501501322470703100172730ustar00rootroot00000000000000/* * AES * (C) 1999-2010,2015,2017 Jack Lloyd * * Based on the public domain reference implementation by Paulo Baretto * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include /* * This implementation is based on table lookups which are known to be * vulnerable to timing and cache based side channel attacks. Some * countermeasures are used which may be helpful in some situations: * * - Only a single 256-word T-table is used, with rotations applied. * Most implementations use 4 T-tables which leaks much more * information via cache usage. * * - The TE and TD tables are computed at runtime to avoid flush+reload * attacks using clflush. As different processes will not share the * same underlying table data, an attacker can't manipulate another * processes cache lines via their shared reference to the library * read only segment. * * - Each cache line of the lookup tables is accessed at the beginning * of each call to encrypt or decrypt. (See the Z variable below) * * If available SSSE3 or AES-NI are used instead of this version, as both * are faster and immune to side channel attacks. * * Some AES cache timing papers for reference: * * "Software mitigations to hedge AES against cache-based software side * channel vulnerabilities" https://eprint.iacr.org/2006/052.pdf * * "Cache Games - Bringing Access-Based Cache Attacks on AES to Practice" * http://www.ieee-security.org/TC/SP2011/PAPERS/2011/paper031.pdf * * "Cache-Collision Timing Attacks Against AES" Bonneau, Mironov * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.88.4753 */ namespace Botan { namespace { BOTAN_ALIGNAS(64) const uint8_t SE[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; BOTAN_ALIGNAS(64) const uint8_t SD[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; inline uint8_t xtime(uint8_t s) { return static_cast(s << 1) ^ ((s >> 7) * 0x1B); } inline uint8_t xtime4(uint8_t s) { return xtime(xtime(s)); } inline uint8_t xtime8(uint8_t s) { return xtime(xtime(xtime(s))); } inline uint8_t xtime3(uint8_t s) { return xtime(s) ^ s; } inline uint8_t xtime9(uint8_t s) { return xtime8(s) ^ s; } inline uint8_t xtime11(uint8_t s) { return xtime8(s) ^ xtime(s) ^ s; } inline uint8_t xtime13(uint8_t s) { return xtime8(s) ^ xtime4(s) ^ s; } inline uint8_t xtime14(uint8_t s) { return xtime8(s) ^ xtime4(s) ^ xtime(s); } inline uint32_t SE_word(uint32_t x) { return make_uint32(SE[get_byte(0, x)], SE[get_byte(1, x)], SE[get_byte(2, x)], SE[get_byte(3, x)]); } const uint32_t* AES_TE() { class TE_Table final { public: TE_Table() { uint32_t* p = reinterpret_cast(&data); for(size_t i = 0; i != 256; ++i) { const uint8_t s = SE[i]; p[i] = make_uint32(xtime(s), s, s, xtime3(s)); } } const uint32_t* ptr() const { return reinterpret_cast(&data); } private: std::aligned_storage<256*sizeof(uint32_t), 64>::type data; }; static TE_Table table; return table.ptr(); } const uint32_t* AES_TD() { class TD_Table final { public: TD_Table() { uint32_t* p = reinterpret_cast(&data); for(size_t i = 0; i != 256; ++i) { const uint8_t s = SD[i]; p[i] = make_uint32(xtime14(s), xtime9(s), xtime13(s), xtime11(s)); } } const uint32_t* ptr() const { return reinterpret_cast(&data); } private: std::aligned_storage<256*sizeof(uint32_t), 64>::type data; }; static TD_Table table; return table.ptr(); } #define AES_T(T, K, V0, V1, V2, V3) \ (K ^ T[get_byte(0, V0)] ^ \ rotr< 8>(T[get_byte(1, V1)]) ^ \ rotr<16>(T[get_byte(2, V2)]) ^ \ rotr<24>(T[get_byte(3, V3)])) /* * AES Encryption */ void aes_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector& EK, const secure_vector& ME) { BOTAN_ASSERT(EK.size() && ME.size() == 16, "Key was set"); const size_t cache_line_size = CPUID::cache_line_size(); const uint32_t* TE = AES_TE(); // Hit every cache line of TE volatile uint32_t Z = 0; for(size_t i = 0; i < 256; i += cache_line_size / sizeof(uint32_t)) { Z |= TE[i]; } Z &= TE[82]; // this is zero, which hopefully the compiler cannot deduce for(size_t i = 0; i < blocks; ++i) { uint32_t T0, T1, T2, T3; load_be(in + 16*i, T0, T1, T2, T3); T0 ^= EK[0]; T1 ^= EK[1]; T2 ^= EK[2]; T3 ^= EK[3]; T0 ^= Z; uint32_t B0 = AES_T(TE, EK[4], T0, T1, T2, T3); uint32_t B1 = AES_T(TE, EK[5], T1, T2, T3, T0); uint32_t B2 = AES_T(TE, EK[6], T2, T3, T0, T1); uint32_t B3 = AES_T(TE, EK[7], T3, T0, T1, T2); for(size_t r = 2*4; r < EK.size(); r += 2*4) { T0 = AES_T(TE, EK[r ], B0, B1, B2, B3); T1 = AES_T(TE, EK[r+1], B1, B2, B3, B0); T2 = AES_T(TE, EK[r+2], B2, B3, B0, B1); T3 = AES_T(TE, EK[r+3], B3, B0, B1, B2); B0 = AES_T(TE, EK[r+4], T0, T1, T2, T3); B1 = AES_T(TE, EK[r+5], T1, T2, T3, T0); B2 = AES_T(TE, EK[r+6], T2, T3, T0, T1); B3 = AES_T(TE, EK[r+7], T3, T0, T1, T2); } /* * Use TE[x] >> 8 instead of SE[] so encryption only references a single * lookup table. */ out[16*i+ 0] = static_cast(TE[get_byte(0, B0)] >> 8) ^ ME[0]; out[16*i+ 1] = static_cast(TE[get_byte(1, B1)] >> 8) ^ ME[1]; out[16*i+ 2] = static_cast(TE[get_byte(2, B2)] >> 8) ^ ME[2]; out[16*i+ 3] = static_cast(TE[get_byte(3, B3)] >> 8) ^ ME[3]; out[16*i+ 4] = static_cast(TE[get_byte(0, B1)] >> 8) ^ ME[4]; out[16*i+ 5] = static_cast(TE[get_byte(1, B2)] >> 8) ^ ME[5]; out[16*i+ 6] = static_cast(TE[get_byte(2, B3)] >> 8) ^ ME[6]; out[16*i+ 7] = static_cast(TE[get_byte(3, B0)] >> 8) ^ ME[7]; out[16*i+ 8] = static_cast(TE[get_byte(0, B2)] >> 8) ^ ME[8]; out[16*i+ 9] = static_cast(TE[get_byte(1, B3)] >> 8) ^ ME[9]; out[16*i+10] = static_cast(TE[get_byte(2, B0)] >> 8) ^ ME[10]; out[16*i+11] = static_cast(TE[get_byte(3, B1)] >> 8) ^ ME[11]; out[16*i+12] = static_cast(TE[get_byte(0, B3)] >> 8) ^ ME[12]; out[16*i+13] = static_cast(TE[get_byte(1, B0)] >> 8) ^ ME[13]; out[16*i+14] = static_cast(TE[get_byte(2, B1)] >> 8) ^ ME[14]; out[16*i+15] = static_cast(TE[get_byte(3, B2)] >> 8) ^ ME[15]; } } /* * AES Decryption */ void aes_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector& DK, const secure_vector& MD) { BOTAN_ASSERT(DK.size() && MD.size() == 16, "Key was set"); const size_t cache_line_size = CPUID::cache_line_size(); const uint32_t* TD = AES_TD(); volatile uint32_t Z = 0; for(size_t i = 0; i < 256; i += cache_line_size / sizeof(uint32_t)) { Z |= TD[i]; } Z &= TD[99]; // this is zero, which hopefully the compiler cannot deduce for(size_t i = 0; i != blocks; ++i) { uint32_t T0 = load_be(in, 0) ^ DK[0]; uint32_t T1 = load_be(in, 1) ^ DK[1]; uint32_t T2 = load_be(in, 2) ^ DK[2]; uint32_t T3 = load_be(in, 3) ^ DK[3]; T0 ^= Z; uint32_t B0 = AES_T(TD, DK[4], T0, T3, T2, T1); uint32_t B1 = AES_T(TD, DK[5], T1, T0, T3, T2); uint32_t B2 = AES_T(TD, DK[6], T2, T1, T0, T3); uint32_t B3 = AES_T(TD, DK[7], T3, T2, T1, T0); for(size_t r = 2*4; r < DK.size(); r += 2*4) { T0 = AES_T(TD, DK[r ], B0, B3, B2, B1); T1 = AES_T(TD, DK[r+1], B1, B0, B3, B2); T2 = AES_T(TD, DK[r+2], B2, B1, B0, B3); T3 = AES_T(TD, DK[r+3], B3, B2, B1, B0); B0 = AES_T(TD, DK[r+4], T0, T3, T2, T1); B1 = AES_T(TD, DK[r+5], T1, T0, T3, T2); B2 = AES_T(TD, DK[r+6], T2, T1, T0, T3); B3 = AES_T(TD, DK[r+7], T3, T2, T1, T0); } out[ 0] = SD[get_byte(0, B0)] ^ MD[0]; out[ 1] = SD[get_byte(1, B3)] ^ MD[1]; out[ 2] = SD[get_byte(2, B2)] ^ MD[2]; out[ 3] = SD[get_byte(3, B1)] ^ MD[3]; out[ 4] = SD[get_byte(0, B1)] ^ MD[4]; out[ 5] = SD[get_byte(1, B0)] ^ MD[5]; out[ 6] = SD[get_byte(2, B3)] ^ MD[6]; out[ 7] = SD[get_byte(3, B2)] ^ MD[7]; out[ 8] = SD[get_byte(0, B2)] ^ MD[8]; out[ 9] = SD[get_byte(1, B1)] ^ MD[9]; out[10] = SD[get_byte(2, B0)] ^ MD[10]; out[11] = SD[get_byte(3, B3)] ^ MD[11]; out[12] = SD[get_byte(0, B3)] ^ MD[12]; out[13] = SD[get_byte(1, B2)] ^ MD[13]; out[14] = SD[get_byte(2, B1)] ^ MD[14]; out[15] = SD[get_byte(3, B0)] ^ MD[15]; in += 16; out += 16; } } void aes_key_schedule(const uint8_t key[], size_t length, secure_vector& EK, secure_vector& DK, secure_vector& ME, secure_vector& MD) { static const uint32_t RC[10] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 }; const size_t rounds = (length / 4) + 6; secure_vector XEK(length + 32), XDK(length + 32); const size_t X = length / 4; // Can't happen, but make static analyzers happy if(X != 4 && X != 6 && X != 8) throw Invalid_Argument("Invalid AES key size"); for(size_t i = 0; i != X; ++i) XEK[i] = load_be(key, i); for(size_t i = X; i < 4*(rounds+1); i += X) { XEK[i] = XEK[i-X] ^ RC[(i-X)/X] ^ SE_word(rotl<8>(XEK[i-1])); for(size_t j = 1; j != X; ++j) { XEK[i+j] = XEK[i+j-X]; if(X == 8 && j == 4) XEK[i+j] ^= SE_word(XEK[i+j-1]); else XEK[i+j] ^= XEK[i+j-1]; } } for(size_t i = 0; i != 4*(rounds+1); i += 4) { XDK[i ] = XEK[4*rounds-i ]; XDK[i+1] = XEK[4*rounds-i+1]; XDK[i+2] = XEK[4*rounds-i+2]; XDK[i+3] = XEK[4*rounds-i+3]; } for(size_t i = 4; i != length + 24; ++i) { XDK[i] = SE_word(XDK[i]); XDK[i] = AES_T(AES_TD(), 0, XDK[i], XDK[i], XDK[i], XDK[i]); } ME.resize(16); MD.resize(16); for(size_t i = 0; i != 4; ++i) { store_be(XEK[i+4*rounds], &ME[4*i]); store_be(XEK[i], &MD[4*i]); } EK.resize(length + 24); DK.resize(length + 24); copy_mem(EK.data(), XEK.data(), EK.size()); copy_mem(DK.data(), XDK.data(), DK.size()); #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { // ARM needs the subkeys to be byte reversed for(size_t i = 0; i != EK.size(); ++i) EK[i] = reverse_bytes(EK[i]); for(size_t i = 0; i != DK.size(); ++i) DK[i] = reverse_bytes(DK[i]); } #endif } #undef AES_T size_t aes_parallelism() { #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return 4; } #endif return 1; } const char* aes_provider() { #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return "aesni"; } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return "ssse3"; } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return "armv8"; } #endif return "base"; } } std::string AES_128::provider() const { return aes_provider(); } std::string AES_192::provider() const { return aes_provider(); } std::string AES_256::provider() const { return aes_provider(); } size_t AES_128::parallelism() const { return aes_parallelism(); } size_t AES_192::parallelism() const { return aes_parallelism(); } size_t AES_256::parallelism() const { return aes_parallelism(); } void AES_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_encrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_encrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return armv8_encrypt_n(in, out, blocks); } #endif aes_encrypt_n(in, out, blocks, m_EK, m_ME); } void AES_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_DK.empty() == false); #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_decrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_decrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return armv8_decrypt_n(in, out, blocks); } #endif aes_decrypt_n(in, out, blocks, m_DK, m_MD); } void AES_128::key_schedule(const uint8_t key[], size_t length) { #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_key_schedule(key, length); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_key_schedule(key, length); } #endif aes_key_schedule(key, length, m_EK, m_DK, m_ME, m_MD); } void AES_128::clear() { zap(m_EK); zap(m_DK); zap(m_ME); zap(m_MD); } void AES_192::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_encrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_encrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return armv8_encrypt_n(in, out, blocks); } #endif aes_encrypt_n(in, out, blocks, m_EK, m_ME); } void AES_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_DK.empty() == false); #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_decrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_decrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return armv8_decrypt_n(in, out, blocks); } #endif aes_decrypt_n(in, out, blocks, m_DK, m_MD); } void AES_192::key_schedule(const uint8_t key[], size_t length) { #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_key_schedule(key, length); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_key_schedule(key, length); } #endif aes_key_schedule(key, length, m_EK, m_DK, m_ME, m_MD); } void AES_192::clear() { zap(m_EK); zap(m_DK); zap(m_ME); zap(m_MD); } void AES_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_encrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_encrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return armv8_encrypt_n(in, out, blocks); } #endif aes_encrypt_n(in, out, blocks, m_EK, m_ME); } void AES_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_DK.empty() == false); #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_decrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_decrypt_n(in, out, blocks); } #endif #if defined(BOTAN_HAS_AES_ARMV8) if(CPUID::has_arm_aes()) { return armv8_decrypt_n(in, out, blocks); } #endif aes_decrypt_n(in, out, blocks, m_DK, m_MD); } void AES_256::key_schedule(const uint8_t key[], size_t length) { #if defined(BOTAN_HAS_AES_NI) if(CPUID::has_aes_ni()) { return aesni_key_schedule(key, length); } #endif #if defined(BOTAN_HAS_AES_SSSE3) if(CPUID::has_ssse3()) { return ssse3_key_schedule(key, length); } #endif aes_key_schedule(key, length, m_EK, m_DK, m_ME, m_MD); } void AES_256::clear() { zap(m_EK); zap(m_DK); zap(m_ME); zap(m_MD); } } botan-2.4.0/src/lib/block/aes/aes.h000066400000000000000000000110301322470703100167320ustar00rootroot00000000000000/* * AES * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AES_H_ #define BOTAN_AES_H_ #include namespace Botan { /** * AES-128 */ class BOTAN_PUBLIC_API(2,0) AES_128 final : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string provider() const override; std::string name() const override { return "AES-128"; } BlockCipher* clone() const override { return new AES_128; } size_t parallelism() const override; private: void key_schedule(const uint8_t key[], size_t length) override; #if defined(BOTAN_HAS_AES_SSSE3) void ssse3_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void ssse3_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void ssse3_key_schedule(const uint8_t key[], size_t length); #endif #if defined(BOTAN_HAS_AES_NI) void aesni_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void aesni_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void aesni_key_schedule(const uint8_t key[], size_t length); #endif #if defined(BOTAN_HAS_AES_ARMV8) void armv8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void armv8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; #endif secure_vector m_EK, m_DK; secure_vector m_ME, m_MD; }; /** * AES-192 */ class BOTAN_PUBLIC_API(2,0) AES_192 final : public Block_Cipher_Fixed_Params<16, 24> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string provider() const override; std::string name() const override { return "AES-192"; } BlockCipher* clone() const override { return new AES_192; } size_t parallelism() const override; private: #if defined(BOTAN_HAS_AES_SSSE3) void ssse3_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void ssse3_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void ssse3_key_schedule(const uint8_t key[], size_t length); #endif #if defined(BOTAN_HAS_AES_NI) void aesni_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void aesni_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void aesni_key_schedule(const uint8_t key[], size_t length); #endif #if defined(BOTAN_HAS_AES_ARMV8) void armv8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void armv8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; #endif void key_schedule(const uint8_t key[], size_t length) override; secure_vector m_EK, m_DK; secure_vector m_ME, m_MD; }; /** * AES-256 */ class BOTAN_PUBLIC_API(2,0) AES_256 final : public Block_Cipher_Fixed_Params<16, 32> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string provider() const override; std::string name() const override { return "AES-256"; } BlockCipher* clone() const override { return new AES_256; } size_t parallelism() const override; private: #if defined(BOTAN_HAS_AES_SSSE3) void ssse3_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void ssse3_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void ssse3_key_schedule(const uint8_t key[], size_t length); #endif #if defined(BOTAN_HAS_AES_NI) void aesni_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void aesni_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void aesni_key_schedule(const uint8_t key[], size_t length); #endif #if defined(BOTAN_HAS_AES_ARMV8) void armv8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void armv8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; #endif void key_schedule(const uint8_t key[], size_t length) override; secure_vector m_EK, m_DK; secure_vector m_ME, m_MD; }; } #endif botan-2.4.0/src/lib/block/aes/aes_armv8/000077500000000000000000000000001322470703100177035ustar00rootroot00000000000000botan-2.4.0/src/lib/block/aes/aes_armv8/aes_armv8.cpp000066400000000000000000000235541322470703100223050ustar00rootroot00000000000000/* * AES using ARMv8 * Contributed by Jeffrey Walton * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * AES-128 Encryption */ BOTAN_FUNC_ISA("+crypto") void AES_128::armv8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_EK.empty() == false, "Key was set"); const uint8_t *skey = reinterpret_cast(m_EK.data()); const uint8_t *mkey = reinterpret_cast(m_ME.data()); const uint8x16_t K0 = vld1q_u8(skey + 0); const uint8x16_t K1 = vld1q_u8(skey + 16); const uint8x16_t K2 = vld1q_u8(skey + 32); const uint8x16_t K3 = vld1q_u8(skey + 48); const uint8x16_t K4 = vld1q_u8(skey + 64); const uint8x16_t K5 = vld1q_u8(skey + 80); const uint8x16_t K6 = vld1q_u8(skey + 96); const uint8x16_t K7 = vld1q_u8(skey + 112); const uint8x16_t K8 = vld1q_u8(skey + 128); const uint8x16_t K9 = vld1q_u8(skey + 144); const uint8x16_t K10 = vld1q_u8(mkey); for(size_t i = 0; i != blocks; ++i) { uint8x16_t data = vld1q_u8(in+16*i); data = vaesmcq_u8(vaeseq_u8(data, K0)); data = vaesmcq_u8(vaeseq_u8(data, K1)); data = vaesmcq_u8(vaeseq_u8(data, K2)); data = vaesmcq_u8(vaeseq_u8(data, K3)); data = vaesmcq_u8(vaeseq_u8(data, K4)); data = vaesmcq_u8(vaeseq_u8(data, K5)); data = vaesmcq_u8(vaeseq_u8(data, K6)); data = vaesmcq_u8(vaeseq_u8(data, K7)); data = vaesmcq_u8(vaeseq_u8(data, K8)); data = veorq_u8(vaeseq_u8(data, K9), K10); vst1q_u8(out+16*i, data); } } /* * AES-128 Decryption */ BOTAN_FUNC_ISA("+crypto") void AES_128::armv8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_DK.empty() == false, "Key was set"); const uint8_t *skey = reinterpret_cast(m_DK.data()); const uint8_t *mkey = reinterpret_cast(m_MD.data()); const uint8x16_t K0 = vld1q_u8(skey + 0); const uint8x16_t K1 = vld1q_u8(skey + 16); const uint8x16_t K2 = vld1q_u8(skey + 32); const uint8x16_t K3 = vld1q_u8(skey + 48); const uint8x16_t K4 = vld1q_u8(skey + 64); const uint8x16_t K5 = vld1q_u8(skey + 80); const uint8x16_t K6 = vld1q_u8(skey + 96); const uint8x16_t K7 = vld1q_u8(skey + 112); const uint8x16_t K8 = vld1q_u8(skey + 128); const uint8x16_t K9 = vld1q_u8(skey + 144); const uint8x16_t K10 = vld1q_u8(mkey); for(size_t i = 0; i != blocks; ++i) { uint8x16_t data = vld1q_u8(in+16*i); data = vaesimcq_u8(vaesdq_u8(data, K0)); data = vaesimcq_u8(vaesdq_u8(data, K1)); data = vaesimcq_u8(vaesdq_u8(data, K2)); data = vaesimcq_u8(vaesdq_u8(data, K3)); data = vaesimcq_u8(vaesdq_u8(data, K4)); data = vaesimcq_u8(vaesdq_u8(data, K5)); data = vaesimcq_u8(vaesdq_u8(data, K6)); data = vaesimcq_u8(vaesdq_u8(data, K7)); data = vaesimcq_u8(vaesdq_u8(data, K8)); data = veorq_u8(vaesdq_u8(data, K9), K10); vst1q_u8(out+16*i, data); } } /* * AES-192 Encryption */ BOTAN_FUNC_ISA("+crypto") void AES_192::armv8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_EK.empty() == false, "Key was set"); const uint8_t *skey = reinterpret_cast(m_EK.data()); const uint8_t *mkey = reinterpret_cast(m_ME.data()); const uint8x16_t K0 = vld1q_u8(skey + 0); const uint8x16_t K1 = vld1q_u8(skey + 16); const uint8x16_t K2 = vld1q_u8(skey + 32); const uint8x16_t K3 = vld1q_u8(skey + 48); const uint8x16_t K4 = vld1q_u8(skey + 64); const uint8x16_t K5 = vld1q_u8(skey + 80); const uint8x16_t K6 = vld1q_u8(skey + 96); const uint8x16_t K7 = vld1q_u8(skey + 112); const uint8x16_t K8 = vld1q_u8(skey + 128); const uint8x16_t K9 = vld1q_u8(skey + 144); const uint8x16_t K10 = vld1q_u8(skey + 160); const uint8x16_t K11 = vld1q_u8(skey + 176); const uint8x16_t K12 = vld1q_u8(mkey); for(size_t i = 0; i != blocks; ++i) { uint8x16_t data = vld1q_u8(in+16*i); data = vaesmcq_u8(vaeseq_u8(data, K0)); data = vaesmcq_u8(vaeseq_u8(data, K1)); data = vaesmcq_u8(vaeseq_u8(data, K2)); data = vaesmcq_u8(vaeseq_u8(data, K3)); data = vaesmcq_u8(vaeseq_u8(data, K4)); data = vaesmcq_u8(vaeseq_u8(data, K5)); data = vaesmcq_u8(vaeseq_u8(data, K6)); data = vaesmcq_u8(vaeseq_u8(data, K7)); data = vaesmcq_u8(vaeseq_u8(data, K8)); data = vaesmcq_u8(vaeseq_u8(data, K9)); data = vaesmcq_u8(vaeseq_u8(data, K10)); data = veorq_u8(vaeseq_u8(data, K11), K12); vst1q_u8(out+16*i, data); } } /* * AES-192 Decryption */ BOTAN_FUNC_ISA("+crypto") void AES_192::armv8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_DK.empty() == false, "Key was set"); const uint8_t *skey = reinterpret_cast(m_DK.data()); const uint8_t *mkey = reinterpret_cast(m_MD.data()); const uint8x16_t K0 = vld1q_u8(skey + 0); const uint8x16_t K1 = vld1q_u8(skey + 16); const uint8x16_t K2 = vld1q_u8(skey + 32); const uint8x16_t K3 = vld1q_u8(skey + 48); const uint8x16_t K4 = vld1q_u8(skey + 64); const uint8x16_t K5 = vld1q_u8(skey + 80); const uint8x16_t K6 = vld1q_u8(skey + 96); const uint8x16_t K7 = vld1q_u8(skey + 112); const uint8x16_t K8 = vld1q_u8(skey + 128); const uint8x16_t K9 = vld1q_u8(skey + 144); const uint8x16_t K10 = vld1q_u8(skey + 160); const uint8x16_t K11 = vld1q_u8(skey + 176); const uint8x16_t K12 = vld1q_u8(mkey); for(size_t i = 0; i != blocks; ++i) { uint8x16_t data = vld1q_u8(in+16*i); data = vaesimcq_u8(vaesdq_u8(data, K0)); data = vaesimcq_u8(vaesdq_u8(data, K1)); data = vaesimcq_u8(vaesdq_u8(data, K2)); data = vaesimcq_u8(vaesdq_u8(data, K3)); data = vaesimcq_u8(vaesdq_u8(data, K4)); data = vaesimcq_u8(vaesdq_u8(data, K5)); data = vaesimcq_u8(vaesdq_u8(data, K6)); data = vaesimcq_u8(vaesdq_u8(data, K7)); data = vaesimcq_u8(vaesdq_u8(data, K8)); data = vaesimcq_u8(vaesdq_u8(data, K9)); data = vaesimcq_u8(vaesdq_u8(data, K10)); data = veorq_u8(vaesdq_u8(data, K11), K12); vst1q_u8(out+16*i, data); } } /* * AES-256 Encryption */ BOTAN_FUNC_ISA("+crypto") void AES_256::armv8_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_EK.empty() == false, "Key was set"); const uint8_t *skey = reinterpret_cast(m_EK.data()); const uint8_t *mkey = reinterpret_cast(m_ME.data()); const uint8x16_t K0 = vld1q_u8(skey + 0); const uint8x16_t K1 = vld1q_u8(skey + 16); const uint8x16_t K2 = vld1q_u8(skey + 32); const uint8x16_t K3 = vld1q_u8(skey + 48); const uint8x16_t K4 = vld1q_u8(skey + 64); const uint8x16_t K5 = vld1q_u8(skey + 80); const uint8x16_t K6 = vld1q_u8(skey + 96); const uint8x16_t K7 = vld1q_u8(skey + 112); const uint8x16_t K8 = vld1q_u8(skey + 128); const uint8x16_t K9 = vld1q_u8(skey + 144); const uint8x16_t K10 = vld1q_u8(skey + 160); const uint8x16_t K11 = vld1q_u8(skey + 176); const uint8x16_t K12 = vld1q_u8(skey + 192); const uint8x16_t K13 = vld1q_u8(skey + 208); const uint8x16_t K14 = vld1q_u8(mkey); for(size_t i = 0; i != blocks; ++i) { uint8x16_t data = vld1q_u8(in+16*i); data = vaesmcq_u8(vaeseq_u8(data, K0)); data = vaesmcq_u8(vaeseq_u8(data, K1)); data = vaesmcq_u8(vaeseq_u8(data, K2)); data = vaesmcq_u8(vaeseq_u8(data, K3)); data = vaesmcq_u8(vaeseq_u8(data, K4)); data = vaesmcq_u8(vaeseq_u8(data, K5)); data = vaesmcq_u8(vaeseq_u8(data, K6)); data = vaesmcq_u8(vaeseq_u8(data, K7)); data = vaesmcq_u8(vaeseq_u8(data, K8)); data = vaesmcq_u8(vaeseq_u8(data, K9)); data = vaesmcq_u8(vaeseq_u8(data, K10)); data = vaesmcq_u8(vaeseq_u8(data, K11)); data = vaesmcq_u8(vaeseq_u8(data, K12)); data = veorq_u8(vaeseq_u8(data, K13), K14); vst1q_u8(out+16*i, data); } } /* * AES-256 Decryption */ BOTAN_FUNC_ISA("+crypto") void AES_256::armv8_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_DK.empty() == false, "Key was set"); const uint8_t *skey = reinterpret_cast(m_DK.data()); const uint8_t *mkey = reinterpret_cast(m_MD.data()); const uint8x16_t K0 = vld1q_u8(skey + 0); const uint8x16_t K1 = vld1q_u8(skey + 16); const uint8x16_t K2 = vld1q_u8(skey + 32); const uint8x16_t K3 = vld1q_u8(skey + 48); const uint8x16_t K4 = vld1q_u8(skey + 64); const uint8x16_t K5 = vld1q_u8(skey + 80); const uint8x16_t K6 = vld1q_u8(skey + 96); const uint8x16_t K7 = vld1q_u8(skey + 112); const uint8x16_t K8 = vld1q_u8(skey + 128); const uint8x16_t K9 = vld1q_u8(skey + 144); const uint8x16_t K10 = vld1q_u8(skey + 160); const uint8x16_t K11 = vld1q_u8(skey + 176); const uint8x16_t K12 = vld1q_u8(skey + 192); const uint8x16_t K13 = vld1q_u8(skey + 208); const uint8x16_t K14 = vld1q_u8(mkey); for(size_t i = 0; i != blocks; ++i) { uint8x16_t data = vld1q_u8(in+16*i); data = vaesimcq_u8(vaesdq_u8(data, K0)); data = vaesimcq_u8(vaesdq_u8(data, K1)); data = vaesimcq_u8(vaesdq_u8(data, K2)); data = vaesimcq_u8(vaesdq_u8(data, K3)); data = vaesimcq_u8(vaesdq_u8(data, K4)); data = vaesimcq_u8(vaesdq_u8(data, K5)); data = vaesimcq_u8(vaesdq_u8(data, K6)); data = vaesimcq_u8(vaesdq_u8(data, K7)); data = vaesimcq_u8(vaesdq_u8(data, K8)); data = vaesimcq_u8(vaesdq_u8(data, K9)); data = vaesimcq_u8(vaesdq_u8(data, K10)); data = vaesimcq_u8(vaesdq_u8(data, K11)); data = vaesimcq_u8(vaesdq_u8(data, K12)); data = veorq_u8(vaesdq_u8(data, K13), K14); vst1q_u8(out+16*i, data); } } } botan-2.4.0/src/lib/block/aes/aes_armv8/info.txt000066400000000000000000000001351322470703100213760ustar00rootroot00000000000000 AES_ARMV8 -> 20170903 arm64 gcc:5 clang:3.8 botan-2.4.0/src/lib/block/aes/aes_ni/000077500000000000000000000000001322470703100172545ustar00rootroot00000000000000botan-2.4.0/src/lib/block/aes/aes_ni/aes_ni.cpp000066400000000000000000000627411322470703100212300ustar00rootroot00000000000000/* * AES using AES-NI instructions * (C) 2009,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { BOTAN_FUNC_ISA("ssse3") __m128i aes_128_key_expansion(__m128i key, __m128i key_with_rcon) { key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(3,3,3,3)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); return _mm_xor_si128(key, key_with_rcon); } BOTAN_FUNC_ISA("ssse3") void aes_192_key_expansion(__m128i* K1, __m128i* K2, __m128i key2_with_rcon, uint32_t out[], bool last) { __m128i key1 = *K1; __m128i key2 = *K2; key2_with_rcon = _mm_shuffle_epi32(key2_with_rcon, _MM_SHUFFLE(1,1,1,1)); key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); key1 = _mm_xor_si128(key1, _mm_slli_si128(key1, 4)); key1 = _mm_xor_si128(key1, key2_with_rcon); *K1 = key1; _mm_storeu_si128(reinterpret_cast<__m128i*>(out), key1); if(last) return; key2 = _mm_xor_si128(key2, _mm_slli_si128(key2, 4)); key2 = _mm_xor_si128(key2, _mm_shuffle_epi32(key1, _MM_SHUFFLE(3,3,3,3))); *K2 = key2; out[4] = _mm_cvtsi128_si32(key2); out[5] = _mm_cvtsi128_si32(_mm_srli_si128(key2, 4)); } /* * The second half of the AES-256 key expansion (other half same as AES-128) */ BOTAN_FUNC_ISA("ssse3,aes") __m128i aes_256_key_expansion(__m128i key, __m128i key2) { __m128i key_with_rcon = _mm_aeskeygenassist_si128(key2, 0x00); key_with_rcon = _mm_shuffle_epi32(key_with_rcon, _MM_SHUFFLE(2,2,2,2)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); key = _mm_xor_si128(key, _mm_slli_si128(key, 4)); return _mm_xor_si128(key, key_with_rcon); } } #define AES_ENC_4_ROUNDS(K) \ do \ { \ B0 = _mm_aesenc_si128(B0, K); \ B1 = _mm_aesenc_si128(B1, K); \ B2 = _mm_aesenc_si128(B2, K); \ B3 = _mm_aesenc_si128(B3, K); \ } while(0) #define AES_ENC_4_LAST_ROUNDS(K) \ do \ { \ B0 = _mm_aesenclast_si128(B0, K); \ B1 = _mm_aesenclast_si128(B1, K); \ B2 = _mm_aesenclast_si128(B2, K); \ B3 = _mm_aesenclast_si128(B3, K); \ } while(0) #define AES_DEC_4_ROUNDS(K) \ do \ { \ B0 = _mm_aesdec_si128(B0, K); \ B1 = _mm_aesdec_si128(B1, K); \ B2 = _mm_aesdec_si128(B2, K); \ B3 = _mm_aesdec_si128(B3, K); \ } while(0) #define AES_DEC_4_LAST_ROUNDS(K) \ do \ { \ B0 = _mm_aesdeclast_si128(B0, K); \ B1 = _mm_aesdeclast_si128(B1, K); \ B2 = _mm_aesdeclast_si128(B2, K); \ B3 = _mm_aesdeclast_si128(B3, K); \ } while(0) /* * AES-128 Encryption */ BOTAN_FUNC_ISA("ssse3,aes") void AES_128::aesni_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_EK.empty() == false, "Key was set"); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* key_mm = reinterpret_cast(m_EK.data()); const __m128i K0 = _mm_loadu_si128(key_mm); const __m128i K1 = _mm_loadu_si128(key_mm + 1); const __m128i K2 = _mm_loadu_si128(key_mm + 2); const __m128i K3 = _mm_loadu_si128(key_mm + 3); const __m128i K4 = _mm_loadu_si128(key_mm + 4); const __m128i K5 = _mm_loadu_si128(key_mm + 5); const __m128i K6 = _mm_loadu_si128(key_mm + 6); const __m128i K7 = _mm_loadu_si128(key_mm + 7); const __m128i K8 = _mm_loadu_si128(key_mm + 8); const __m128i K9 = _mm_loadu_si128(key_mm + 9); const __m128i K10 = _mm_loadu_si128(key_mm + 10); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_ENC_4_ROUNDS(K1); AES_ENC_4_ROUNDS(K2); AES_ENC_4_ROUNDS(K3); AES_ENC_4_ROUNDS(K4); AES_ENC_4_ROUNDS(K5); AES_ENC_4_ROUNDS(K6); AES_ENC_4_ROUNDS(K7); AES_ENC_4_ROUNDS(K8); AES_ENC_4_ROUNDS(K9); AES_ENC_4_LAST_ROUNDS(K10); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesenc_si128(B, K1); B = _mm_aesenc_si128(B, K2); B = _mm_aesenc_si128(B, K3); B = _mm_aesenc_si128(B, K4); B = _mm_aesenc_si128(B, K5); B = _mm_aesenc_si128(B, K6); B = _mm_aesenc_si128(B, K7); B = _mm_aesenc_si128(B, K8); B = _mm_aesenc_si128(B, K9); B = _mm_aesenclast_si128(B, K10); _mm_storeu_si128(out_mm + i, B); } } /* * AES-128 Decryption */ BOTAN_FUNC_ISA("ssse3,aes") void AES_128::aesni_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_DK.empty() == false, "Key was set"); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* key_mm = reinterpret_cast(m_DK.data()); const __m128i K0 = _mm_loadu_si128(key_mm); const __m128i K1 = _mm_loadu_si128(key_mm + 1); const __m128i K2 = _mm_loadu_si128(key_mm + 2); const __m128i K3 = _mm_loadu_si128(key_mm + 3); const __m128i K4 = _mm_loadu_si128(key_mm + 4); const __m128i K5 = _mm_loadu_si128(key_mm + 5); const __m128i K6 = _mm_loadu_si128(key_mm + 6); const __m128i K7 = _mm_loadu_si128(key_mm + 7); const __m128i K8 = _mm_loadu_si128(key_mm + 8); const __m128i K9 = _mm_loadu_si128(key_mm + 9); const __m128i K10 = _mm_loadu_si128(key_mm + 10); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_DEC_4_ROUNDS(K1); AES_DEC_4_ROUNDS(K2); AES_DEC_4_ROUNDS(K3); AES_DEC_4_ROUNDS(K4); AES_DEC_4_ROUNDS(K5); AES_DEC_4_ROUNDS(K6); AES_DEC_4_ROUNDS(K7); AES_DEC_4_ROUNDS(K8); AES_DEC_4_ROUNDS(K9); AES_DEC_4_LAST_ROUNDS(K10); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesdec_si128(B, K1); B = _mm_aesdec_si128(B, K2); B = _mm_aesdec_si128(B, K3); B = _mm_aesdec_si128(B, K4); B = _mm_aesdec_si128(B, K5); B = _mm_aesdec_si128(B, K6); B = _mm_aesdec_si128(B, K7); B = _mm_aesdec_si128(B, K8); B = _mm_aesdec_si128(B, K9); B = _mm_aesdeclast_si128(B, K10); _mm_storeu_si128(out_mm + i, B); } } /* * AES-128 Key Schedule */ BOTAN_FUNC_ISA("ssse3,aes") void AES_128::aesni_key_schedule(const uint8_t key[], size_t) { m_EK.resize(44); m_DK.resize(44); #define AES_128_key_exp(K, RCON) \ aes_128_key_expansion(K, _mm_aeskeygenassist_si128(K, RCON)) const __m128i K0 = _mm_loadu_si128(reinterpret_cast(key)); const __m128i K1 = AES_128_key_exp(K0, 0x01); const __m128i K2 = AES_128_key_exp(K1, 0x02); const __m128i K3 = AES_128_key_exp(K2, 0x04); const __m128i K4 = AES_128_key_exp(K3, 0x08); const __m128i K5 = AES_128_key_exp(K4, 0x10); const __m128i K6 = AES_128_key_exp(K5, 0x20); const __m128i K7 = AES_128_key_exp(K6, 0x40); const __m128i K8 = AES_128_key_exp(K7, 0x80); const __m128i K9 = AES_128_key_exp(K8, 0x1B); const __m128i K10 = AES_128_key_exp(K9, 0x36); __m128i* EK_mm = reinterpret_cast<__m128i*>(m_EK.data()); _mm_storeu_si128(EK_mm , K0); _mm_storeu_si128(EK_mm + 1, K1); _mm_storeu_si128(EK_mm + 2, K2); _mm_storeu_si128(EK_mm + 3, K3); _mm_storeu_si128(EK_mm + 4, K4); _mm_storeu_si128(EK_mm + 5, K5); _mm_storeu_si128(EK_mm + 6, K6); _mm_storeu_si128(EK_mm + 7, K7); _mm_storeu_si128(EK_mm + 8, K8); _mm_storeu_si128(EK_mm + 9, K9); _mm_storeu_si128(EK_mm + 10, K10); // Now generate decryption keys __m128i* DK_mm = reinterpret_cast<__m128i*>(m_DK.data()); _mm_storeu_si128(DK_mm , K10); _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(K9)); _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(K8)); _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(K7)); _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(K6)); _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(K5)); _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(K4)); _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(K3)); _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(K2)); _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(K1)); _mm_storeu_si128(DK_mm + 10, K0); } /* * AES-192 Encryption */ BOTAN_FUNC_ISA("ssse3,aes") void AES_192::aesni_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_EK.empty() == false, "Key was set"); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* key_mm = reinterpret_cast(m_EK.data()); const __m128i K0 = _mm_loadu_si128(key_mm); const __m128i K1 = _mm_loadu_si128(key_mm + 1); const __m128i K2 = _mm_loadu_si128(key_mm + 2); const __m128i K3 = _mm_loadu_si128(key_mm + 3); const __m128i K4 = _mm_loadu_si128(key_mm + 4); const __m128i K5 = _mm_loadu_si128(key_mm + 5); const __m128i K6 = _mm_loadu_si128(key_mm + 6); const __m128i K7 = _mm_loadu_si128(key_mm + 7); const __m128i K8 = _mm_loadu_si128(key_mm + 8); const __m128i K9 = _mm_loadu_si128(key_mm + 9); const __m128i K10 = _mm_loadu_si128(key_mm + 10); const __m128i K11 = _mm_loadu_si128(key_mm + 11); const __m128i K12 = _mm_loadu_si128(key_mm + 12); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_ENC_4_ROUNDS(K1); AES_ENC_4_ROUNDS(K2); AES_ENC_4_ROUNDS(K3); AES_ENC_4_ROUNDS(K4); AES_ENC_4_ROUNDS(K5); AES_ENC_4_ROUNDS(K6); AES_ENC_4_ROUNDS(K7); AES_ENC_4_ROUNDS(K8); AES_ENC_4_ROUNDS(K9); AES_ENC_4_ROUNDS(K10); AES_ENC_4_ROUNDS(K11); AES_ENC_4_LAST_ROUNDS(K12); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesenc_si128(B, K1); B = _mm_aesenc_si128(B, K2); B = _mm_aesenc_si128(B, K3); B = _mm_aesenc_si128(B, K4); B = _mm_aesenc_si128(B, K5); B = _mm_aesenc_si128(B, K6); B = _mm_aesenc_si128(B, K7); B = _mm_aesenc_si128(B, K8); B = _mm_aesenc_si128(B, K9); B = _mm_aesenc_si128(B, K10); B = _mm_aesenc_si128(B, K11); B = _mm_aesenclast_si128(B, K12); _mm_storeu_si128(out_mm + i, B); } } /* * AES-192 Decryption */ BOTAN_FUNC_ISA("ssse3,aes") void AES_192::aesni_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_DK.empty() == false, "Key was set"); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* key_mm = reinterpret_cast(m_DK.data()); const __m128i K0 = _mm_loadu_si128(key_mm); const __m128i K1 = _mm_loadu_si128(key_mm + 1); const __m128i K2 = _mm_loadu_si128(key_mm + 2); const __m128i K3 = _mm_loadu_si128(key_mm + 3); const __m128i K4 = _mm_loadu_si128(key_mm + 4); const __m128i K5 = _mm_loadu_si128(key_mm + 5); const __m128i K6 = _mm_loadu_si128(key_mm + 6); const __m128i K7 = _mm_loadu_si128(key_mm + 7); const __m128i K8 = _mm_loadu_si128(key_mm + 8); const __m128i K9 = _mm_loadu_si128(key_mm + 9); const __m128i K10 = _mm_loadu_si128(key_mm + 10); const __m128i K11 = _mm_loadu_si128(key_mm + 11); const __m128i K12 = _mm_loadu_si128(key_mm + 12); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_DEC_4_ROUNDS(K1); AES_DEC_4_ROUNDS(K2); AES_DEC_4_ROUNDS(K3); AES_DEC_4_ROUNDS(K4); AES_DEC_4_ROUNDS(K5); AES_DEC_4_ROUNDS(K6); AES_DEC_4_ROUNDS(K7); AES_DEC_4_ROUNDS(K8); AES_DEC_4_ROUNDS(K9); AES_DEC_4_ROUNDS(K10); AES_DEC_4_ROUNDS(K11); AES_DEC_4_LAST_ROUNDS(K12); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesdec_si128(B, K1); B = _mm_aesdec_si128(B, K2); B = _mm_aesdec_si128(B, K3); B = _mm_aesdec_si128(B, K4); B = _mm_aesdec_si128(B, K5); B = _mm_aesdec_si128(B, K6); B = _mm_aesdec_si128(B, K7); B = _mm_aesdec_si128(B, K8); B = _mm_aesdec_si128(B, K9); B = _mm_aesdec_si128(B, K10); B = _mm_aesdec_si128(B, K11); B = _mm_aesdeclast_si128(B, K12); _mm_storeu_si128(out_mm + i, B); } } /* * AES-192 Key Schedule */ BOTAN_FUNC_ISA("ssse3,aes") void AES_192::aesni_key_schedule(const uint8_t key[], size_t) { m_EK.resize(52); m_DK.resize(52); __m128i K0 = _mm_loadu_si128(reinterpret_cast(key)); __m128i K1 = _mm_loadu_si128(reinterpret_cast(key + 8)); K1 = _mm_srli_si128(K1, 8); load_le(m_EK.data(), key, 6); #define AES_192_key_exp(RCON, EK_OFF) \ aes_192_key_expansion(&K0, &K1, \ _mm_aeskeygenassist_si128(K1, RCON), \ &m_EK[EK_OFF], EK_OFF == 48) AES_192_key_exp(0x01, 6); AES_192_key_exp(0x02, 12); AES_192_key_exp(0x04, 18); AES_192_key_exp(0x08, 24); AES_192_key_exp(0x10, 30); AES_192_key_exp(0x20, 36); AES_192_key_exp(0x40, 42); AES_192_key_exp(0x80, 48); #undef AES_192_key_exp // Now generate decryption keys const __m128i* EK_mm = reinterpret_cast(m_EK.data()); __m128i* DK_mm = reinterpret_cast<__m128i*>(m_DK.data()); _mm_storeu_si128(DK_mm , _mm_loadu_si128(EK_mm + 12)); _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 11))); _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 10))); _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 9))); _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 8))); _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 7))); _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 6))); _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 5))); _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 4))); _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 3))); _mm_storeu_si128(DK_mm + 10, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 2))); _mm_storeu_si128(DK_mm + 11, _mm_aesimc_si128(_mm_loadu_si128(EK_mm + 1))); _mm_storeu_si128(DK_mm + 12, _mm_loadu_si128(EK_mm + 0)); } /* * AES-256 Encryption */ BOTAN_FUNC_ISA("ssse3,aes") void AES_256::aesni_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_EK.empty() == false, "Key was set"); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* key_mm = reinterpret_cast(m_EK.data()); const __m128i K0 = _mm_loadu_si128(key_mm); const __m128i K1 = _mm_loadu_si128(key_mm + 1); const __m128i K2 = _mm_loadu_si128(key_mm + 2); const __m128i K3 = _mm_loadu_si128(key_mm + 3); const __m128i K4 = _mm_loadu_si128(key_mm + 4); const __m128i K5 = _mm_loadu_si128(key_mm + 5); const __m128i K6 = _mm_loadu_si128(key_mm + 6); const __m128i K7 = _mm_loadu_si128(key_mm + 7); const __m128i K8 = _mm_loadu_si128(key_mm + 8); const __m128i K9 = _mm_loadu_si128(key_mm + 9); const __m128i K10 = _mm_loadu_si128(key_mm + 10); const __m128i K11 = _mm_loadu_si128(key_mm + 11); const __m128i K12 = _mm_loadu_si128(key_mm + 12); const __m128i K13 = _mm_loadu_si128(key_mm + 13); const __m128i K14 = _mm_loadu_si128(key_mm + 14); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_ENC_4_ROUNDS(K1); AES_ENC_4_ROUNDS(K2); AES_ENC_4_ROUNDS(K3); AES_ENC_4_ROUNDS(K4); AES_ENC_4_ROUNDS(K5); AES_ENC_4_ROUNDS(K6); AES_ENC_4_ROUNDS(K7); AES_ENC_4_ROUNDS(K8); AES_ENC_4_ROUNDS(K9); AES_ENC_4_ROUNDS(K10); AES_ENC_4_ROUNDS(K11); AES_ENC_4_ROUNDS(K12); AES_ENC_4_ROUNDS(K13); AES_ENC_4_LAST_ROUNDS(K14); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesenc_si128(B, K1); B = _mm_aesenc_si128(B, K2); B = _mm_aesenc_si128(B, K3); B = _mm_aesenc_si128(B, K4); B = _mm_aesenc_si128(B, K5); B = _mm_aesenc_si128(B, K6); B = _mm_aesenc_si128(B, K7); B = _mm_aesenc_si128(B, K8); B = _mm_aesenc_si128(B, K9); B = _mm_aesenc_si128(B, K10); B = _mm_aesenc_si128(B, K11); B = _mm_aesenc_si128(B, K12); B = _mm_aesenc_si128(B, K13); B = _mm_aesenclast_si128(B, K14); _mm_storeu_si128(out_mm + i, B); } } /* * AES-256 Decryption */ BOTAN_FUNC_ISA("ssse3,aes") void AES_256::aesni_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { BOTAN_ASSERT(m_DK.empty() == false, "Key was set"); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* key_mm = reinterpret_cast(m_DK.data()); const __m128i K0 = _mm_loadu_si128(key_mm); const __m128i K1 = _mm_loadu_si128(key_mm + 1); const __m128i K2 = _mm_loadu_si128(key_mm + 2); const __m128i K3 = _mm_loadu_si128(key_mm + 3); const __m128i K4 = _mm_loadu_si128(key_mm + 4); const __m128i K5 = _mm_loadu_si128(key_mm + 5); const __m128i K6 = _mm_loadu_si128(key_mm + 6); const __m128i K7 = _mm_loadu_si128(key_mm + 7); const __m128i K8 = _mm_loadu_si128(key_mm + 8); const __m128i K9 = _mm_loadu_si128(key_mm + 9); const __m128i K10 = _mm_loadu_si128(key_mm + 10); const __m128i K11 = _mm_loadu_si128(key_mm + 11); const __m128i K12 = _mm_loadu_si128(key_mm + 12); const __m128i K13 = _mm_loadu_si128(key_mm + 13); const __m128i K14 = _mm_loadu_si128(key_mm + 14); while(blocks >= 4) { __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); B0 = _mm_xor_si128(B0, K0); B1 = _mm_xor_si128(B1, K0); B2 = _mm_xor_si128(B2, K0); B3 = _mm_xor_si128(B3, K0); AES_DEC_4_ROUNDS(K1); AES_DEC_4_ROUNDS(K2); AES_DEC_4_ROUNDS(K3); AES_DEC_4_ROUNDS(K4); AES_DEC_4_ROUNDS(K5); AES_DEC_4_ROUNDS(K6); AES_DEC_4_ROUNDS(K7); AES_DEC_4_ROUNDS(K8); AES_DEC_4_ROUNDS(K9); AES_DEC_4_ROUNDS(K10); AES_DEC_4_ROUNDS(K11); AES_DEC_4_ROUNDS(K12); AES_DEC_4_ROUNDS(K13); AES_DEC_4_LAST_ROUNDS(K14); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B1); _mm_storeu_si128(out_mm + 2, B2); _mm_storeu_si128(out_mm + 3, B3); blocks -= 4; in_mm += 4; out_mm += 4; } for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); B = _mm_xor_si128(B, K0); B = _mm_aesdec_si128(B, K1); B = _mm_aesdec_si128(B, K2); B = _mm_aesdec_si128(B, K3); B = _mm_aesdec_si128(B, K4); B = _mm_aesdec_si128(B, K5); B = _mm_aesdec_si128(B, K6); B = _mm_aesdec_si128(B, K7); B = _mm_aesdec_si128(B, K8); B = _mm_aesdec_si128(B, K9); B = _mm_aesdec_si128(B, K10); B = _mm_aesdec_si128(B, K11); B = _mm_aesdec_si128(B, K12); B = _mm_aesdec_si128(B, K13); B = _mm_aesdeclast_si128(B, K14); _mm_storeu_si128(out_mm + i, B); } } /* * AES-256 Key Schedule */ BOTAN_FUNC_ISA("ssse3,aes") void AES_256::aesni_key_schedule(const uint8_t key[], size_t) { m_EK.resize(60); m_DK.resize(60); const __m128i K0 = _mm_loadu_si128(reinterpret_cast(key)); const __m128i K1 = _mm_loadu_si128(reinterpret_cast(key + 16)); const __m128i K2 = aes_128_key_expansion(K0, _mm_aeskeygenassist_si128(K1, 0x01)); const __m128i K3 = aes_256_key_expansion(K1, K2); const __m128i K4 = aes_128_key_expansion(K2, _mm_aeskeygenassist_si128(K3, 0x02)); const __m128i K5 = aes_256_key_expansion(K3, K4); const __m128i K6 = aes_128_key_expansion(K4, _mm_aeskeygenassist_si128(K5, 0x04)); const __m128i K7 = aes_256_key_expansion(K5, K6); const __m128i K8 = aes_128_key_expansion(K6, _mm_aeskeygenassist_si128(K7, 0x08)); const __m128i K9 = aes_256_key_expansion(K7, K8); const __m128i K10 = aes_128_key_expansion(K8, _mm_aeskeygenassist_si128(K9, 0x10)); const __m128i K11 = aes_256_key_expansion(K9, K10); const __m128i K12 = aes_128_key_expansion(K10, _mm_aeskeygenassist_si128(K11, 0x20)); const __m128i K13 = aes_256_key_expansion(K11, K12); const __m128i K14 = aes_128_key_expansion(K12, _mm_aeskeygenassist_si128(K13, 0x40)); __m128i* EK_mm = reinterpret_cast<__m128i*>(m_EK.data()); _mm_storeu_si128(EK_mm , K0); _mm_storeu_si128(EK_mm + 1, K1); _mm_storeu_si128(EK_mm + 2, K2); _mm_storeu_si128(EK_mm + 3, K3); _mm_storeu_si128(EK_mm + 4, K4); _mm_storeu_si128(EK_mm + 5, K5); _mm_storeu_si128(EK_mm + 6, K6); _mm_storeu_si128(EK_mm + 7, K7); _mm_storeu_si128(EK_mm + 8, K8); _mm_storeu_si128(EK_mm + 9, K9); _mm_storeu_si128(EK_mm + 10, K10); _mm_storeu_si128(EK_mm + 11, K11); _mm_storeu_si128(EK_mm + 12, K12); _mm_storeu_si128(EK_mm + 13, K13); _mm_storeu_si128(EK_mm + 14, K14); // Now generate decryption keys __m128i* DK_mm = reinterpret_cast<__m128i*>(m_DK.data()); _mm_storeu_si128(DK_mm , K14); _mm_storeu_si128(DK_mm + 1, _mm_aesimc_si128(K13)); _mm_storeu_si128(DK_mm + 2, _mm_aesimc_si128(K12)); _mm_storeu_si128(DK_mm + 3, _mm_aesimc_si128(K11)); _mm_storeu_si128(DK_mm + 4, _mm_aesimc_si128(K10)); _mm_storeu_si128(DK_mm + 5, _mm_aesimc_si128(K9)); _mm_storeu_si128(DK_mm + 6, _mm_aesimc_si128(K8)); _mm_storeu_si128(DK_mm + 7, _mm_aesimc_si128(K7)); _mm_storeu_si128(DK_mm + 8, _mm_aesimc_si128(K6)); _mm_storeu_si128(DK_mm + 9, _mm_aesimc_si128(K5)); _mm_storeu_si128(DK_mm + 10, _mm_aesimc_si128(K4)); _mm_storeu_si128(DK_mm + 11, _mm_aesimc_si128(K3)); _mm_storeu_si128(DK_mm + 12, _mm_aesimc_si128(K2)); _mm_storeu_si128(DK_mm + 13, _mm_aesimc_si128(K1)); _mm_storeu_si128(DK_mm + 14, K0); } #undef AES_ENC_4_ROUNDS #undef AES_ENC_4_LAST_ROUNDS #undef AES_DEC_4_ROUNDS #undef AES_DEC_4_LAST_ROUNDS } botan-2.4.0/src/lib/block/aes/aes_ni/info.txt000066400000000000000000000001061322470703100207450ustar00rootroot00000000000000 AES_NI -> 20131128 load_on auto need_isa aesni botan-2.4.0/src/lib/block/aes/aes_ssse3/000077500000000000000000000000001322470703100177065ustar00rootroot00000000000000botan-2.4.0/src/lib/block/aes/aes_ssse3/aes_ssse3.cpp000066400000000000000000000475711322470703100223200ustar00rootroot00000000000000/* * AES using SSSE3 * (C) 2010,2016 Jack Lloyd * * This is more or less a direct translation of public domain x86-64 * assembly written by Mike Hamburg, described in "Accelerating AES * with Vector Permute Instructions" (CHES 2009). His original code is * available at https://crypto.stanford.edu/vpaes/ * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { const __m128i low_nibs = _mm_set1_epi8(0x0F); const __m128i k_ipt1 = _mm_set_epi32( 0xCABAE090, 0x52227808, 0xC2B2E898, 0x5A2A7000); const __m128i k_ipt2 = _mm_set_epi32( 0xCD80B1FC, 0xB0FDCC81, 0x4C01307D, 0x317C4D00); const __m128i k_inv1 = _mm_set_epi32( 0x04070309, 0x0A0B0C02, 0x0E05060F, 0x0D080180); const __m128i k_inv2 = _mm_set_epi32( 0x030D0E0C, 0x02050809, 0x01040A06, 0x0F0B0780); const __m128i sb1u = _mm_set_epi32( 0xA5DF7A6E, 0x142AF544, 0xB19BE18F, 0xCB503E00); const __m128i sb1t = _mm_set_epi32( 0x3BF7CCC1, 0x0D2ED9EF, 0x3618D415, 0xFAE22300); const __m128i mc_forward[4] = { _mm_set_epi32(0x0C0F0E0D, 0x080B0A09, 0x04070605, 0x00030201), _mm_set_epi32(0x00030201, 0x0C0F0E0D, 0x080B0A09, 0x04070605), _mm_set_epi32(0x04070605, 0x00030201, 0x0C0F0E0D, 0x080B0A09), _mm_set_epi32(0x080B0A09, 0x04070605, 0x00030201, 0x0C0F0E0D) }; const __m128i sr[4] = { _mm_set_epi32(0x0F0E0D0C, 0x0B0A0908, 0x07060504, 0x03020100), _mm_set_epi32(0x0B06010C, 0x07020D08, 0x030E0904, 0x0F0A0500), _mm_set_epi32(0x070E050C, 0x030A0108, 0x0F060D04, 0x0B020900), _mm_set_epi32(0x0306090C, 0x0F020508, 0x0B0E0104, 0x070A0D00), }; #define mm_xor3(x, y, z) _mm_xor_si128(x, _mm_xor_si128(y, z)) BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_transform(__m128i input, __m128i table_1, __m128i table_2) { __m128i i_1 = _mm_and_si128(low_nibs, input); __m128i i_2 = _mm_srli_epi32(_mm_andnot_si128(low_nibs, input), 4); return _mm_xor_si128( _mm_shuffle_epi8(table_1, i_1), _mm_shuffle_epi8(table_2, i_2)); } BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_mangle(__m128i k, uint8_t round_no) { __m128i t = _mm_shuffle_epi8(_mm_xor_si128(k, _mm_set1_epi8(0x5B)), mc_forward[0]); __m128i t2 = t; t = _mm_shuffle_epi8(t, mc_forward[0]); t2 = mm_xor3(t2, t, _mm_shuffle_epi8(t, mc_forward[0])); return _mm_shuffle_epi8(t2, sr[round_no % 4]); } BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_192_smear(__m128i x, __m128i y) { return mm_xor3(y, _mm_shuffle_epi32(x, 0xFE), _mm_shuffle_epi32(y, 0x80)); } BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_mangle_dec(__m128i k, uint8_t round_no) { const __m128i dsk[8] = { _mm_set_epi32(0x4AED9334, 0x82255BFC, 0xB6116FC8, 0x7ED9A700), _mm_set_epi32(0x8BB89FAC, 0xE9DAFDCE, 0x45765162, 0x27143300), _mm_set_epi32(0x4622EE8A, 0xADC90561, 0x27438FEB, 0xCCA86400), _mm_set_epi32(0x73AEE13C, 0xBD602FF2, 0x815C13CE, 0x4F92DD00), _mm_set_epi32(0xF83F3EF9, 0xFA3D3CFB, 0x03C4C502, 0x01C6C700), _mm_set_epi32(0xA5526A9D, 0x7384BC4B, 0xEE1921D6, 0x38CFF700), _mm_set_epi32(0xA080D3F3, 0x10306343, 0xE3C390B0, 0x53732000), _mm_set_epi32(0x2F45AEC4, 0x8CE60D67, 0xA0CA214B, 0x036982E8) }; __m128i t = aes_schedule_transform(k, dsk[0], dsk[1]); __m128i output = _mm_shuffle_epi8(t, mc_forward[0]); t = aes_schedule_transform(t, dsk[2], dsk[3]); output = _mm_shuffle_epi8(_mm_xor_si128(t, output), mc_forward[0]); t = aes_schedule_transform(t, dsk[4], dsk[5]); output = _mm_shuffle_epi8(_mm_xor_si128(t, output), mc_forward[0]); t = aes_schedule_transform(t, dsk[6], dsk[7]); output = _mm_shuffle_epi8(_mm_xor_si128(t, output), mc_forward[0]); return _mm_shuffle_epi8(output, sr[round_no % 4]); } BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_mangle_last(__m128i k, uint8_t round_no) { const __m128i out_tr1 = _mm_set_epi32( 0xF7974121, 0xDEBE6808, 0xFF9F4929, 0xD6B66000); const __m128i out_tr2 = _mm_set_epi32( 0xE10D5DB1, 0xB05C0CE0, 0x01EDBD51, 0x50BCEC00); k = _mm_shuffle_epi8(k, sr[round_no % 4]); k = _mm_xor_si128(k, _mm_set1_epi8(0x5B)); return aes_schedule_transform(k, out_tr1, out_tr2); } BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_mangle_last_dec(__m128i k) { const __m128i deskew1 = _mm_set_epi32( 0x1DFEB95A, 0x5DBEF91A, 0x07E4A340, 0x47A4E300); const __m128i deskew2 = _mm_set_epi32( 0x2841C2AB, 0xF49D1E77, 0x5F36B5DC, 0x83EA6900); k = _mm_xor_si128(k, _mm_set1_epi8(0x5B)); return aes_schedule_transform(k, deskew1, deskew2); } BOTAN_FUNC_ISA("ssse3") __m128i aes_schedule_round(__m128i* rcon, __m128i input1, __m128i input2) { if(rcon) { input2 = _mm_xor_si128(_mm_alignr_epi8(_mm_setzero_si128(), *rcon, 15), input2); *rcon = _mm_alignr_epi8(*rcon, *rcon, 15); // next rcon input1 = _mm_shuffle_epi32(input1, 0xFF); // rotate input1 = _mm_alignr_epi8(input1, input1, 1); } __m128i smeared = _mm_xor_si128(input2, _mm_slli_si128(input2, 4)); smeared = mm_xor3(smeared, _mm_slli_si128(smeared, 8), _mm_set1_epi8(0x5B)); __m128i t = _mm_srli_epi32(_mm_andnot_si128(low_nibs, input1), 4); input1 = _mm_and_si128(low_nibs, input1); __m128i t2 = _mm_shuffle_epi8(k_inv2, input1); input1 = _mm_xor_si128(input1, t); __m128i t3 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, t)); __m128i t4 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, input1)); __m128i t5 = _mm_xor_si128(input1, _mm_shuffle_epi8(k_inv1, t3)); __m128i t6 = _mm_xor_si128(t, _mm_shuffle_epi8(k_inv1, t4)); return mm_xor3(_mm_shuffle_epi8(sb1u, t5), _mm_shuffle_epi8(sb1t, t6), smeared); } BOTAN_FUNC_ISA("ssse3") __m128i aes_ssse3_encrypt(__m128i B, const __m128i* keys, size_t rounds) { const __m128i sb2u = _mm_set_epi32( 0x5EB7E955, 0xBC982FCD, 0xE27A93C6, 0x0B712400); const __m128i sb2t = _mm_set_epi32( 0xC2A163C8, 0xAB82234A, 0x69EB8840, 0x0AE12900); const __m128i sbou = _mm_set_epi32( 0x15AABF7A, 0xC502A878, 0xD0D26D17, 0x6FBDC700); const __m128i sbot = _mm_set_epi32( 0x8E1E90D1, 0x412B35FA, 0xCFE474A5, 0x5FBB6A00); const __m128i mc_backward[4] = { _mm_set_epi32(0x0E0D0C0F, 0x0A09080B, 0x06050407, 0x02010003), _mm_set_epi32(0x0A09080B, 0x06050407, 0x02010003, 0x0E0D0C0F), _mm_set_epi32(0x06050407, 0x02010003, 0x0E0D0C0F, 0x0A09080B), _mm_set_epi32(0x02010003, 0x0E0D0C0F, 0x0A09080B, 0x06050407), }; B = mm_xor3(_mm_shuffle_epi8(k_ipt1, _mm_and_si128(low_nibs, B)), _mm_shuffle_epi8(k_ipt2, _mm_srli_epi32( _mm_andnot_si128(low_nibs, B), 4)), _mm_loadu_si128(keys)); for(size_t r = 1; ; ++r) { const __m128i K = _mm_loadu_si128(keys + r); __m128i t = _mm_srli_epi32(_mm_andnot_si128(low_nibs, B), 4); B = _mm_and_si128(low_nibs, B); __m128i t2 = _mm_shuffle_epi8(k_inv2, B); B = _mm_xor_si128(B, t); __m128i t3 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, t)); __m128i t4 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, B)); __m128i t5 = _mm_xor_si128(B, _mm_shuffle_epi8(k_inv1, t3)); __m128i t6 = _mm_xor_si128(t, _mm_shuffle_epi8(k_inv1, t4)); if(r == rounds) { B = _mm_shuffle_epi8( mm_xor3(_mm_shuffle_epi8(sbou, t5), _mm_shuffle_epi8(sbot, t6), K), sr[r % 4]); return B; } __m128i t7 = mm_xor3(_mm_shuffle_epi8(sb1t, t6), _mm_shuffle_epi8(sb1u, t5), K); __m128i t8 = mm_xor3(_mm_shuffle_epi8(sb2t, t6), _mm_shuffle_epi8(sb2u, t5), _mm_shuffle_epi8(t7, mc_forward[r % 4])); B = mm_xor3(_mm_shuffle_epi8(t8, mc_forward[r % 4]), _mm_shuffle_epi8(t7, mc_backward[r % 4]), t8); } } BOTAN_FUNC_ISA("ssse3") __m128i aes_ssse3_decrypt(__m128i B, const __m128i* keys, size_t rounds) { const __m128i k_dipt1 = _mm_set_epi32( 0x154A411E, 0x114E451A, 0x0F505B04, 0x0B545F00); const __m128i k_dipt2 = _mm_set_epi32( 0x12771772, 0xF491F194, 0x86E383E6, 0x60056500); const __m128i sb9u = _mm_set_epi32( 0xCAD51F50, 0x4F994CC9, 0x851C0353, 0x9A86D600); const __m128i sb9t = _mm_set_epi32( 0x725E2C9E, 0xB2FBA565, 0xC03B1789, 0xECD74900); const __m128i sbeu = _mm_set_epi32( 0x22426004, 0x64B4F6B0, 0x46F29296, 0x26D4D000); const __m128i sbet = _mm_set_epi32( 0x9467F36B, 0x98593E32, 0x0C55A6CD, 0xFFAAC100); const __m128i sbdu = _mm_set_epi32( 0xF56E9B13, 0x882A4439, 0x7D57CCDF, 0xE6B1A200); const __m128i sbdt = _mm_set_epi32( 0x2931180D, 0x15DEEFD3, 0x3CE2FAF7, 0x24C6CB00); const __m128i sbbu = _mm_set_epi32( 0x602646F6, 0xB0F2D404, 0xD0226492, 0x96B44200); const __m128i sbbt = _mm_set_epi32( 0xF3FF0C3E, 0x3255AA6B, 0xC19498A6, 0xCD596700); __m128i mc = mc_forward[3]; __m128i t = _mm_shuffle_epi8(k_dipt2, _mm_srli_epi32( _mm_andnot_si128(low_nibs, B), 4)); B = mm_xor3(t, _mm_loadu_si128(keys), _mm_shuffle_epi8(k_dipt1, _mm_and_si128(B, low_nibs))); for(size_t r = 1; ; ++r) { const __m128i K = _mm_loadu_si128(keys + r); t = _mm_srli_epi32(_mm_andnot_si128(low_nibs, B), 4); B = _mm_and_si128(low_nibs, B); __m128i t2 = _mm_shuffle_epi8(k_inv2, B); B = _mm_xor_si128(B, t); __m128i t3 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, t)); __m128i t4 = _mm_xor_si128(t2, _mm_shuffle_epi8(k_inv1, B)); __m128i t5 = _mm_xor_si128(B, _mm_shuffle_epi8(k_inv1, t3)); __m128i t6 = _mm_xor_si128(t, _mm_shuffle_epi8(k_inv1, t4)); if(r == rounds) { const __m128i sbou = _mm_set_epi32( 0xC7AA6DB9, 0xD4943E2D, 0x1387EA53, 0x7EF94000); const __m128i sbot = _mm_set_epi32( 0xCA4B8159, 0xD8C58E9C, 0x12D7560F, 0x93441D00); __m128i x = _mm_shuffle_epi8(sbou, t5); __m128i y = _mm_shuffle_epi8(sbot, t6); x = _mm_xor_si128(x, K); x = _mm_xor_si128(x, y); const uint32_t which_sr = ((((rounds - 1) << 4) ^ 48) & 48) / 16; return _mm_shuffle_epi8(x, sr[which_sr]); } __m128i t8 = _mm_xor_si128(_mm_shuffle_epi8(sb9t, t6), _mm_xor_si128(_mm_shuffle_epi8(sb9u, t5), K)); __m128i t9 = mm_xor3(_mm_shuffle_epi8(t8, mc), _mm_shuffle_epi8(sbdu, t5), _mm_shuffle_epi8(sbdt, t6)); __m128i t12 = _mm_xor_si128( _mm_xor_si128( _mm_shuffle_epi8(t9, mc), _mm_shuffle_epi8(sbbu, t5)), _mm_shuffle_epi8(sbbt, t6)); B = _mm_xor_si128(_mm_xor_si128(_mm_shuffle_epi8(t12, mc), _mm_shuffle_epi8(sbeu, t5)), _mm_shuffle_epi8(sbet, t6)); mc = _mm_alignr_epi8(mc, mc, 12); } } } /* * AES-128 Encryption */ BOTAN_FUNC_ISA("ssse3") void AES_128::ssse3_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(m_EK.data()); CT::poison(in, blocks * block_size()); BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 10)); } CT::unpoison(in, blocks * block_size()); CT::unpoison(out, blocks * block_size()); } /* * AES-128 Decryption */ BOTAN_FUNC_ISA("ssse3") void AES_128::ssse3_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(m_DK.data()); CT::poison(in, blocks * block_size()); BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 10)); } CT::unpoison(in, blocks * block_size()); CT::unpoison(out, blocks * block_size()); } /* * AES-128 Key Schedule */ BOTAN_FUNC_ISA("ssse3") void AES_128::ssse3_key_schedule(const uint8_t keyb[], size_t) { __m128i rcon = _mm_set_epi32(0x702A9808, 0x4D7C7D81, 0x1F8391B9, 0xAF9DEEB6); __m128i key = _mm_loadu_si128(reinterpret_cast(keyb)); m_EK.resize(11*4); m_DK.resize(11*4); __m128i* EK_mm = reinterpret_cast<__m128i*>(m_EK.data()); __m128i* DK_mm = reinterpret_cast<__m128i*>(m_DK.data()); _mm_storeu_si128(DK_mm + 10, _mm_shuffle_epi8(key, sr[2])); key = aes_schedule_transform(key, k_ipt1, k_ipt2); _mm_storeu_si128(EK_mm, key); for(size_t i = 1; i != 10; ++i) { key = aes_schedule_round(&rcon, key, key); _mm_storeu_si128(EK_mm + i, aes_schedule_mangle(key, (12-i) % 4)); _mm_storeu_si128(DK_mm + (10-i), aes_schedule_mangle_dec(key, (10-i) % 4)); } key = aes_schedule_round(&rcon, key, key); _mm_storeu_si128(EK_mm + 10, aes_schedule_mangle_last(key, 2)); _mm_storeu_si128(DK_mm, aes_schedule_mangle_last_dec(key)); } /* * AES-192 Encryption */ BOTAN_FUNC_ISA("ssse3") void AES_192::ssse3_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(m_EK.data()); CT::poison(in, blocks * block_size()); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 12)); } CT::unpoison(in, blocks * block_size()); CT::unpoison(out, blocks * block_size()); } /* * AES-192 Decryption */ BOTAN_FUNC_ISA("ssse3") void AES_192::ssse3_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(m_DK.data()); CT::poison(in, blocks * block_size()); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 12)); } CT::unpoison(in, blocks * block_size()); CT::unpoison(out, blocks * block_size()); } /* * AES-192 Key Schedule */ BOTAN_FUNC_ISA("ssse3") void AES_192::ssse3_key_schedule(const uint8_t keyb[], size_t) { __m128i rcon = _mm_set_epi32(0x702A9808, 0x4D7C7D81, 0x1F8391B9, 0xAF9DEEB6); m_EK.resize(13*4); m_DK.resize(13*4); __m128i* EK_mm = reinterpret_cast<__m128i*>(m_EK.data()); __m128i* DK_mm = reinterpret_cast<__m128i*>(m_DK.data()); __m128i key1 = _mm_loadu_si128(reinterpret_cast(keyb)); __m128i key2 = _mm_loadu_si128(reinterpret_cast((keyb + 8))); _mm_storeu_si128(DK_mm + 12, _mm_shuffle_epi8(key1, sr[0])); key1 = aes_schedule_transform(key1, k_ipt1, k_ipt2); key2 = aes_schedule_transform(key2, k_ipt1, k_ipt2); _mm_storeu_si128(EK_mm + 0, key1); // key2 with 8 high bytes masked off __m128i t = _mm_slli_si128(_mm_srli_si128(key2, 8), 8); for(size_t i = 0; i != 4; ++i) { key2 = aes_schedule_round(&rcon, key2, key1); _mm_storeu_si128(EK_mm + 3*i+1, aes_schedule_mangle(_mm_alignr_epi8(key2, t, 8), (i+3)%4)); _mm_storeu_si128(DK_mm + 11-3*i, aes_schedule_mangle_dec(_mm_alignr_epi8(key2, t, 8), (i+3)%4)); t = aes_schedule_192_smear(key2, t); _mm_storeu_si128(EK_mm + 3*i+2, aes_schedule_mangle(t, (i+2)%4)); _mm_storeu_si128(DK_mm + 10-3*i, aes_schedule_mangle_dec(t, (i+2)%4)); key2 = aes_schedule_round(&rcon, t, key2); if(i == 3) { _mm_storeu_si128(EK_mm + 3*i+3, aes_schedule_mangle_last(key2, (i+1)%4)); _mm_storeu_si128(DK_mm + 9-3*i, aes_schedule_mangle_last_dec(key2)); } else { _mm_storeu_si128(EK_mm + 3*i+3, aes_schedule_mangle(key2, (i+1)%4)); _mm_storeu_si128(DK_mm + 9-3*i, aes_schedule_mangle_dec(key2, (i+1)%4)); } key1 = key2; key2 = aes_schedule_192_smear(key2, _mm_slli_si128(_mm_srli_si128(t, 8), 8)); t = _mm_slli_si128(_mm_srli_si128(key2, 8), 8); } } /* * AES-256 Encryption */ BOTAN_FUNC_ISA("ssse3") void AES_256::ssse3_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(m_EK.data()); CT::poison(in, blocks * block_size()); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_encrypt(B, keys, 14)); } CT::unpoison(in, blocks * block_size()); CT::unpoison(out, blocks * block_size()); } /* * AES-256 Decryption */ BOTAN_FUNC_ISA("ssse3") void AES_256::ssse3_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); const __m128i* keys = reinterpret_cast(m_DK.data()); CT::poison(in, blocks * block_size()); for(size_t i = 0; i != blocks; ++i) { __m128i B = _mm_loadu_si128(in_mm + i); _mm_storeu_si128(out_mm + i, aes_ssse3_decrypt(B, keys, 14)); } CT::unpoison(in, blocks * block_size()); CT::unpoison(out, blocks * block_size()); } /* * AES-256 Key Schedule */ BOTAN_FUNC_ISA("ssse3") void AES_256::ssse3_key_schedule(const uint8_t keyb[], size_t) { __m128i rcon = _mm_set_epi32(0x702A9808, 0x4D7C7D81, 0x1F8391B9, 0xAF9DEEB6); m_EK.resize(15*4); m_DK.resize(15*4); __m128i* EK_mm = reinterpret_cast<__m128i*>(m_EK.data()); __m128i* DK_mm = reinterpret_cast<__m128i*>(m_DK.data()); __m128i key1 = _mm_loadu_si128(reinterpret_cast(keyb)); __m128i key2 = _mm_loadu_si128(reinterpret_cast((keyb + 16))); _mm_storeu_si128(DK_mm + 14, _mm_shuffle_epi8(key1, sr[2])); key1 = aes_schedule_transform(key1, k_ipt1, k_ipt2); key2 = aes_schedule_transform(key2, k_ipt1, k_ipt2); _mm_storeu_si128(EK_mm + 0, key1); _mm_storeu_si128(EK_mm + 1, aes_schedule_mangle(key2, 3)); _mm_storeu_si128(DK_mm + 13, aes_schedule_mangle_dec(key2, 1)); for(size_t i = 2; i != 14; i += 2) { __m128i k_t = key2; key1 = key2 = aes_schedule_round(&rcon, key2, key1); _mm_storeu_si128(EK_mm + i, aes_schedule_mangle(key2, i % 4)); _mm_storeu_si128(DK_mm + (14-i), aes_schedule_mangle_dec(key2, (i+2) % 4)); key2 = aes_schedule_round(nullptr, _mm_shuffle_epi32(key2, 0xFF), k_t); _mm_storeu_si128(EK_mm + i + 1, aes_schedule_mangle(key2, (i - 1) % 4)); _mm_storeu_si128(DK_mm + (13-i), aes_schedule_mangle_dec(key2, (i+1) % 4)); } key2 = aes_schedule_round(&rcon, key2, key1); _mm_storeu_si128(EK_mm + 14, aes_schedule_mangle_last(key2, 2)); _mm_storeu_si128(DK_mm + 0, aes_schedule_mangle_last_dec(key2)); } } botan-2.4.0/src/lib/block/aes/aes_ssse3/info.txt000066400000000000000000000002531322470703100214020ustar00rootroot00000000000000 AES_SSSE3 -> 20131128 load_on auto need_isa ssse3 # Intel C++ can't deal with syntax for defining constants :( gcc clang msvc sunstudio botan-2.4.0/src/lib/block/aes/info.txt000066400000000000000000000000451322470703100175110ustar00rootroot00000000000000 AES -> 20131128 botan-2.4.0/src/lib/block/aria/000077500000000000000000000000001322470703100161625ustar00rootroot00000000000000botan-2.4.0/src/lib/block/aria/aria.cpp000066400000000000000000000537201322470703100176110ustar00rootroot00000000000000/* * ARIA * Adapted for Botan by Jeffrey Walton, public domain * * Further changes * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) * * This ARIA implementation is based on the 32-bit implementation by Aaram Yun from the * National Security Research Institute, KOREA. Aaram Yun's implementation is based on * the 8-bit implementation by Jin Hong. The source files are available in ARIA.zip from * the Korea Internet & Security Agency website. * RFC 5794, A Description of the ARIA Encryption Algorithm, * Korea * Internet & Security Agency homepage */ #include #include #include namespace Botan { namespace { namespace ARIA_F { BOTAN_ALIGNAS(16) const uint32_t S1[256]={ 0x00636363,0x007c7c7c,0x00777777,0x007b7b7b,0x00f2f2f2,0x006b6b6b,0x006f6f6f,0x00c5c5c5, 0x00303030,0x00010101,0x00676767,0x002b2b2b,0x00fefefe,0x00d7d7d7,0x00ababab,0x00767676, 0x00cacaca,0x00828282,0x00c9c9c9,0x007d7d7d,0x00fafafa,0x00595959,0x00474747,0x00f0f0f0, 0x00adadad,0x00d4d4d4,0x00a2a2a2,0x00afafaf,0x009c9c9c,0x00a4a4a4,0x00727272,0x00c0c0c0, 0x00b7b7b7,0x00fdfdfd,0x00939393,0x00262626,0x00363636,0x003f3f3f,0x00f7f7f7,0x00cccccc, 0x00343434,0x00a5a5a5,0x00e5e5e5,0x00f1f1f1,0x00717171,0x00d8d8d8,0x00313131,0x00151515, 0x00040404,0x00c7c7c7,0x00232323,0x00c3c3c3,0x00181818,0x00969696,0x00050505,0x009a9a9a, 0x00070707,0x00121212,0x00808080,0x00e2e2e2,0x00ebebeb,0x00272727,0x00b2b2b2,0x00757575, 0x00090909,0x00838383,0x002c2c2c,0x001a1a1a,0x001b1b1b,0x006e6e6e,0x005a5a5a,0x00a0a0a0, 0x00525252,0x003b3b3b,0x00d6d6d6,0x00b3b3b3,0x00292929,0x00e3e3e3,0x002f2f2f,0x00848484, 0x00535353,0x00d1d1d1,0x00000000,0x00ededed,0x00202020,0x00fcfcfc,0x00b1b1b1,0x005b5b5b, 0x006a6a6a,0x00cbcbcb,0x00bebebe,0x00393939,0x004a4a4a,0x004c4c4c,0x00585858,0x00cfcfcf, 0x00d0d0d0,0x00efefef,0x00aaaaaa,0x00fbfbfb,0x00434343,0x004d4d4d,0x00333333,0x00858585, 0x00454545,0x00f9f9f9,0x00020202,0x007f7f7f,0x00505050,0x003c3c3c,0x009f9f9f,0x00a8a8a8, 0x00515151,0x00a3a3a3,0x00404040,0x008f8f8f,0x00929292,0x009d9d9d,0x00383838,0x00f5f5f5, 0x00bcbcbc,0x00b6b6b6,0x00dadada,0x00212121,0x00101010,0x00ffffff,0x00f3f3f3,0x00d2d2d2, 0x00cdcdcd,0x000c0c0c,0x00131313,0x00ececec,0x005f5f5f,0x00979797,0x00444444,0x00171717, 0x00c4c4c4,0x00a7a7a7,0x007e7e7e,0x003d3d3d,0x00646464,0x005d5d5d,0x00191919,0x00737373, 0x00606060,0x00818181,0x004f4f4f,0x00dcdcdc,0x00222222,0x002a2a2a,0x00909090,0x00888888, 0x00464646,0x00eeeeee,0x00b8b8b8,0x00141414,0x00dedede,0x005e5e5e,0x000b0b0b,0x00dbdbdb, 0x00e0e0e0,0x00323232,0x003a3a3a,0x000a0a0a,0x00494949,0x00060606,0x00242424,0x005c5c5c, 0x00c2c2c2,0x00d3d3d3,0x00acacac,0x00626262,0x00919191,0x00959595,0x00e4e4e4,0x00797979, 0x00e7e7e7,0x00c8c8c8,0x00373737,0x006d6d6d,0x008d8d8d,0x00d5d5d5,0x004e4e4e,0x00a9a9a9, 0x006c6c6c,0x00565656,0x00f4f4f4,0x00eaeaea,0x00656565,0x007a7a7a,0x00aeaeae,0x00080808, 0x00bababa,0x00787878,0x00252525,0x002e2e2e,0x001c1c1c,0x00a6a6a6,0x00b4b4b4,0x00c6c6c6, 0x00e8e8e8,0x00dddddd,0x00747474,0x001f1f1f,0x004b4b4b,0x00bdbdbd,0x008b8b8b,0x008a8a8a, 0x00707070,0x003e3e3e,0x00b5b5b5,0x00666666,0x00484848,0x00030303,0x00f6f6f6,0x000e0e0e, 0x00616161,0x00353535,0x00575757,0x00b9b9b9,0x00868686,0x00c1c1c1,0x001d1d1d,0x009e9e9e, 0x00e1e1e1,0x00f8f8f8,0x00989898,0x00111111,0x00696969,0x00d9d9d9,0x008e8e8e,0x00949494, 0x009b9b9b,0x001e1e1e,0x00878787,0x00e9e9e9,0x00cecece,0x00555555,0x00282828,0x00dfdfdf, 0x008c8c8c,0x00a1a1a1,0x00898989,0x000d0d0d,0x00bfbfbf,0x00e6e6e6,0x00424242,0x00686868, 0x00414141,0x00999999,0x002d2d2d,0x000f0f0f,0x00b0b0b0,0x00545454,0x00bbbbbb,0x00161616 }; BOTAN_ALIGNAS(16) const uint32_t S2[256]={ 0xe200e2e2,0x4e004e4e,0x54005454,0xfc00fcfc,0x94009494,0xc200c2c2,0x4a004a4a,0xcc00cccc, 0x62006262,0x0d000d0d,0x6a006a6a,0x46004646,0x3c003c3c,0x4d004d4d,0x8b008b8b,0xd100d1d1, 0x5e005e5e,0xfa00fafa,0x64006464,0xcb00cbcb,0xb400b4b4,0x97009797,0xbe00bebe,0x2b002b2b, 0xbc00bcbc,0x77007777,0x2e002e2e,0x03000303,0xd300d3d3,0x19001919,0x59005959,0xc100c1c1, 0x1d001d1d,0x06000606,0x41004141,0x6b006b6b,0x55005555,0xf000f0f0,0x99009999,0x69006969, 0xea00eaea,0x9c009c9c,0x18001818,0xae00aeae,0x63006363,0xdf00dfdf,0xe700e7e7,0xbb00bbbb, 0x00000000,0x73007373,0x66006666,0xfb00fbfb,0x96009696,0x4c004c4c,0x85008585,0xe400e4e4, 0x3a003a3a,0x09000909,0x45004545,0xaa00aaaa,0x0f000f0f,0xee00eeee,0x10001010,0xeb00ebeb, 0x2d002d2d,0x7f007f7f,0xf400f4f4,0x29002929,0xac00acac,0xcf00cfcf,0xad00adad,0x91009191, 0x8d008d8d,0x78007878,0xc800c8c8,0x95009595,0xf900f9f9,0x2f002f2f,0xce00cece,0xcd00cdcd, 0x08000808,0x7a007a7a,0x88008888,0x38003838,0x5c005c5c,0x83008383,0x2a002a2a,0x28002828, 0x47004747,0xdb00dbdb,0xb800b8b8,0xc700c7c7,0x93009393,0xa400a4a4,0x12001212,0x53005353, 0xff00ffff,0x87008787,0x0e000e0e,0x31003131,0x36003636,0x21002121,0x58005858,0x48004848, 0x01000101,0x8e008e8e,0x37003737,0x74007474,0x32003232,0xca00caca,0xe900e9e9,0xb100b1b1, 0xb700b7b7,0xab00abab,0x0c000c0c,0xd700d7d7,0xc400c4c4,0x56005656,0x42004242,0x26002626, 0x07000707,0x98009898,0x60006060,0xd900d9d9,0xb600b6b6,0xb900b9b9,0x11001111,0x40004040, 0xec00ecec,0x20002020,0x8c008c8c,0xbd00bdbd,0xa000a0a0,0xc900c9c9,0x84008484,0x04000404, 0x49004949,0x23002323,0xf100f1f1,0x4f004f4f,0x50005050,0x1f001f1f,0x13001313,0xdc00dcdc, 0xd800d8d8,0xc000c0c0,0x9e009e9e,0x57005757,0xe300e3e3,0xc300c3c3,0x7b007b7b,0x65006565, 0x3b003b3b,0x02000202,0x8f008f8f,0x3e003e3e,0xe800e8e8,0x25002525,0x92009292,0xe500e5e5, 0x15001515,0xdd00dddd,0xfd00fdfd,0x17001717,0xa900a9a9,0xbf00bfbf,0xd400d4d4,0x9a009a9a, 0x7e007e7e,0xc500c5c5,0x39003939,0x67006767,0xfe00fefe,0x76007676,0x9d009d9d,0x43004343, 0xa700a7a7,0xe100e1e1,0xd000d0d0,0xf500f5f5,0x68006868,0xf200f2f2,0x1b001b1b,0x34003434, 0x70007070,0x05000505,0xa300a3a3,0x8a008a8a,0xd500d5d5,0x79007979,0x86008686,0xa800a8a8, 0x30003030,0xc600c6c6,0x51005151,0x4b004b4b,0x1e001e1e,0xa600a6a6,0x27002727,0xf600f6f6, 0x35003535,0xd200d2d2,0x6e006e6e,0x24002424,0x16001616,0x82008282,0x5f005f5f,0xda00dada, 0xe600e6e6,0x75007575,0xa200a2a2,0xef00efef,0x2c002c2c,0xb200b2b2,0x1c001c1c,0x9f009f9f, 0x5d005d5d,0x6f006f6f,0x80008080,0x0a000a0a,0x72007272,0x44004444,0x9b009b9b,0x6c006c6c, 0x90009090,0x0b000b0b,0x5b005b5b,0x33003333,0x7d007d7d,0x5a005a5a,0x52005252,0xf300f3f3, 0x61006161,0xa100a1a1,0xf700f7f7,0xb000b0b0,0xd600d6d6,0x3f003f3f,0x7c007c7c,0x6d006d6d, 0xed00eded,0x14001414,0xe000e0e0,0xa500a5a5,0x3d003d3d,0x22002222,0xb300b3b3,0xf800f8f8, 0x89008989,0xde00dede,0x71007171,0x1a001a1a,0xaf00afaf,0xba00baba,0xb500b5b5,0x81008181 }; BOTAN_ALIGNAS(16) const uint32_t X1[256]={ 0x52520052,0x09090009,0x6a6a006a,0xd5d500d5,0x30300030,0x36360036,0xa5a500a5,0x38380038, 0xbfbf00bf,0x40400040,0xa3a300a3,0x9e9e009e,0x81810081,0xf3f300f3,0xd7d700d7,0xfbfb00fb, 0x7c7c007c,0xe3e300e3,0x39390039,0x82820082,0x9b9b009b,0x2f2f002f,0xffff00ff,0x87870087, 0x34340034,0x8e8e008e,0x43430043,0x44440044,0xc4c400c4,0xdede00de,0xe9e900e9,0xcbcb00cb, 0x54540054,0x7b7b007b,0x94940094,0x32320032,0xa6a600a6,0xc2c200c2,0x23230023,0x3d3d003d, 0xeeee00ee,0x4c4c004c,0x95950095,0x0b0b000b,0x42420042,0xfafa00fa,0xc3c300c3,0x4e4e004e, 0x08080008,0x2e2e002e,0xa1a100a1,0x66660066,0x28280028,0xd9d900d9,0x24240024,0xb2b200b2, 0x76760076,0x5b5b005b,0xa2a200a2,0x49490049,0x6d6d006d,0x8b8b008b,0xd1d100d1,0x25250025, 0x72720072,0xf8f800f8,0xf6f600f6,0x64640064,0x86860086,0x68680068,0x98980098,0x16160016, 0xd4d400d4,0xa4a400a4,0x5c5c005c,0xcccc00cc,0x5d5d005d,0x65650065,0xb6b600b6,0x92920092, 0x6c6c006c,0x70700070,0x48480048,0x50500050,0xfdfd00fd,0xeded00ed,0xb9b900b9,0xdada00da, 0x5e5e005e,0x15150015,0x46460046,0x57570057,0xa7a700a7,0x8d8d008d,0x9d9d009d,0x84840084, 0x90900090,0xd8d800d8,0xabab00ab,0x00000000,0x8c8c008c,0xbcbc00bc,0xd3d300d3,0x0a0a000a, 0xf7f700f7,0xe4e400e4,0x58580058,0x05050005,0xb8b800b8,0xb3b300b3,0x45450045,0x06060006, 0xd0d000d0,0x2c2c002c,0x1e1e001e,0x8f8f008f,0xcaca00ca,0x3f3f003f,0x0f0f000f,0x02020002, 0xc1c100c1,0xafaf00af,0xbdbd00bd,0x03030003,0x01010001,0x13130013,0x8a8a008a,0x6b6b006b, 0x3a3a003a,0x91910091,0x11110011,0x41410041,0x4f4f004f,0x67670067,0xdcdc00dc,0xeaea00ea, 0x97970097,0xf2f200f2,0xcfcf00cf,0xcece00ce,0xf0f000f0,0xb4b400b4,0xe6e600e6,0x73730073, 0x96960096,0xacac00ac,0x74740074,0x22220022,0xe7e700e7,0xadad00ad,0x35350035,0x85850085, 0xe2e200e2,0xf9f900f9,0x37370037,0xe8e800e8,0x1c1c001c,0x75750075,0xdfdf00df,0x6e6e006e, 0x47470047,0xf1f100f1,0x1a1a001a,0x71710071,0x1d1d001d,0x29290029,0xc5c500c5,0x89890089, 0x6f6f006f,0xb7b700b7,0x62620062,0x0e0e000e,0xaaaa00aa,0x18180018,0xbebe00be,0x1b1b001b, 0xfcfc00fc,0x56560056,0x3e3e003e,0x4b4b004b,0xc6c600c6,0xd2d200d2,0x79790079,0x20200020, 0x9a9a009a,0xdbdb00db,0xc0c000c0,0xfefe00fe,0x78780078,0xcdcd00cd,0x5a5a005a,0xf4f400f4, 0x1f1f001f,0xdddd00dd,0xa8a800a8,0x33330033,0x88880088,0x07070007,0xc7c700c7,0x31310031, 0xb1b100b1,0x12120012,0x10100010,0x59590059,0x27270027,0x80800080,0xecec00ec,0x5f5f005f, 0x60600060,0x51510051,0x7f7f007f,0xa9a900a9,0x19190019,0xb5b500b5,0x4a4a004a,0x0d0d000d, 0x2d2d002d,0xe5e500e5,0x7a7a007a,0x9f9f009f,0x93930093,0xc9c900c9,0x9c9c009c,0xefef00ef, 0xa0a000a0,0xe0e000e0,0x3b3b003b,0x4d4d004d,0xaeae00ae,0x2a2a002a,0xf5f500f5,0xb0b000b0, 0xc8c800c8,0xebeb00eb,0xbbbb00bb,0x3c3c003c,0x83830083,0x53530053,0x99990099,0x61610061, 0x17170017,0x2b2b002b,0x04040004,0x7e7e007e,0xbaba00ba,0x77770077,0xd6d600d6,0x26260026, 0xe1e100e1,0x69690069,0x14140014,0x63630063,0x55550055,0x21210021,0x0c0c000c,0x7d7d007d }; BOTAN_ALIGNAS(16) const uint32_t X2[256]={ 0x30303000,0x68686800,0x99999900,0x1b1b1b00,0x87878700,0xb9b9b900,0x21212100,0x78787800, 0x50505000,0x39393900,0xdbdbdb00,0xe1e1e100,0x72727200,0x09090900,0x62626200,0x3c3c3c00, 0x3e3e3e00,0x7e7e7e00,0x5e5e5e00,0x8e8e8e00,0xf1f1f100,0xa0a0a000,0xcccccc00,0xa3a3a300, 0x2a2a2a00,0x1d1d1d00,0xfbfbfb00,0xb6b6b600,0xd6d6d600,0x20202000,0xc4c4c400,0x8d8d8d00, 0x81818100,0x65656500,0xf5f5f500,0x89898900,0xcbcbcb00,0x9d9d9d00,0x77777700,0xc6c6c600, 0x57575700,0x43434300,0x56565600,0x17171700,0xd4d4d400,0x40404000,0x1a1a1a00,0x4d4d4d00, 0xc0c0c000,0x63636300,0x6c6c6c00,0xe3e3e300,0xb7b7b700,0xc8c8c800,0x64646400,0x6a6a6a00, 0x53535300,0xaaaaaa00,0x38383800,0x98989800,0x0c0c0c00,0xf4f4f400,0x9b9b9b00,0xededed00, 0x7f7f7f00,0x22222200,0x76767600,0xafafaf00,0xdddddd00,0x3a3a3a00,0x0b0b0b00,0x58585800, 0x67676700,0x88888800,0x06060600,0xc3c3c300,0x35353500,0x0d0d0d00,0x01010100,0x8b8b8b00, 0x8c8c8c00,0xc2c2c200,0xe6e6e600,0x5f5f5f00,0x02020200,0x24242400,0x75757500,0x93939300, 0x66666600,0x1e1e1e00,0xe5e5e500,0xe2e2e200,0x54545400,0xd8d8d800,0x10101000,0xcecece00, 0x7a7a7a00,0xe8e8e800,0x08080800,0x2c2c2c00,0x12121200,0x97979700,0x32323200,0xababab00, 0xb4b4b400,0x27272700,0x0a0a0a00,0x23232300,0xdfdfdf00,0xefefef00,0xcacaca00,0xd9d9d900, 0xb8b8b800,0xfafafa00,0xdcdcdc00,0x31313100,0x6b6b6b00,0xd1d1d100,0xadadad00,0x19191900, 0x49494900,0xbdbdbd00,0x51515100,0x96969600,0xeeeeee00,0xe4e4e400,0xa8a8a800,0x41414100, 0xdadada00,0xffffff00,0xcdcdcd00,0x55555500,0x86868600,0x36363600,0xbebebe00,0x61616100, 0x52525200,0xf8f8f800,0xbbbbbb00,0x0e0e0e00,0x82828200,0x48484800,0x69696900,0x9a9a9a00, 0xe0e0e000,0x47474700,0x9e9e9e00,0x5c5c5c00,0x04040400,0x4b4b4b00,0x34343400,0x15151500, 0x79797900,0x26262600,0xa7a7a700,0xdedede00,0x29292900,0xaeaeae00,0x92929200,0xd7d7d700, 0x84848400,0xe9e9e900,0xd2d2d200,0xbababa00,0x5d5d5d00,0xf3f3f300,0xc5c5c500,0xb0b0b000, 0xbfbfbf00,0xa4a4a400,0x3b3b3b00,0x71717100,0x44444400,0x46464600,0x2b2b2b00,0xfcfcfc00, 0xebebeb00,0x6f6f6f00,0xd5d5d500,0xf6f6f600,0x14141400,0xfefefe00,0x7c7c7c00,0x70707000, 0x5a5a5a00,0x7d7d7d00,0xfdfdfd00,0x2f2f2f00,0x18181800,0x83838300,0x16161600,0xa5a5a500, 0x91919100,0x1f1f1f00,0x05050500,0x95959500,0x74747400,0xa9a9a900,0xc1c1c100,0x5b5b5b00, 0x4a4a4a00,0x85858500,0x6d6d6d00,0x13131300,0x07070700,0x4f4f4f00,0x4e4e4e00,0x45454500, 0xb2b2b200,0x0f0f0f00,0xc9c9c900,0x1c1c1c00,0xa6a6a600,0xbcbcbc00,0xececec00,0x73737300, 0x90909000,0x7b7b7b00,0xcfcfcf00,0x59595900,0x8f8f8f00,0xa1a1a100,0xf9f9f900,0x2d2d2d00, 0xf2f2f200,0xb1b1b100,0x00000000,0x94949400,0x37373700,0x9f9f9f00,0xd0d0d000,0x2e2e2e00, 0x9c9c9c00,0x6e6e6e00,0x28282800,0x3f3f3f00,0x80808000,0xf0f0f000,0x3d3d3d00,0xd3d3d300, 0x25252500,0x8a8a8a00,0xb5b5b500,0xe7e7e700,0x42424200,0xb3b3b300,0xc7c7c700,0xeaeaea00, 0xf7f7f700,0x4c4c4c00,0x11111100,0x33333300,0x03030300,0xa2a2a200,0xacacac00,0x60606000 }; inline void ARIA_FO(uint32_t& T0, uint32_t& T1, uint32_t& T2, uint32_t& T3) { T0 = S1[get_byte(0,T0)] ^ S2[get_byte(1,T0)] ^ X1[get_byte(2,T0)] ^ X2[get_byte(3,T0)]; T1 = S1[get_byte(0,T1)] ^ S2[get_byte(1,T1)] ^ X1[get_byte(2,T1)] ^ X2[get_byte(3,T1)]; T2 = S1[get_byte(0,T2)] ^ S2[get_byte(1,T2)] ^ X1[get_byte(2,T2)] ^ X2[get_byte(3,T2)]; T3 = S1[get_byte(0,T3)] ^ S2[get_byte(1,T3)] ^ X1[get_byte(2,T3)] ^ X2[get_byte(3,T3)]; T1 ^= T2; T2 ^= T3; T0 ^= T1; T3 ^= T1; T2 ^= T0; T1 ^= T2; T1 = ((T1 << 8) & 0xFF00FF00) | ((T1 >> 8) & 0x00FF00FF); T2 = rotr<16>(T2); T3 = reverse_bytes(T3); T1 ^= T2; T2 ^= T3; T0 ^= T1; T3 ^= T1; T2 ^= T0; T1 ^= T2; } inline void ARIA_FE(uint32_t& T0, uint32_t& T1, uint32_t& T2, uint32_t& T3) { T0 = X1[get_byte(0,T0)] ^ X2[get_byte(1,T0)] ^ S1[get_byte(2,T0)] ^ S2[get_byte(3,T0)]; T1 = X1[get_byte(0,T1)] ^ X2[get_byte(1,T1)] ^ S1[get_byte(2,T1)] ^ S2[get_byte(3,T1)]; T2 = X1[get_byte(0,T2)] ^ X2[get_byte(1,T2)] ^ S1[get_byte(2,T2)] ^ S2[get_byte(3,T2)]; T3 = X1[get_byte(0,T3)] ^ X2[get_byte(1,T3)] ^ S1[get_byte(2,T3)] ^ S2[get_byte(3,T3)]; T1 ^= T2; T2 ^= T3; T0 ^= T1; T3 ^= T1; T2 ^= T0; T1 ^= T2; T3 = ((T3 << 8) & 0xFF00FF00) | ((T3 >> 8) & 0x00FF00FF); T0 = rotr<16>(T0); T1 = reverse_bytes(T1); T1 ^= T2; T2 ^= T3; T0 ^= T1; T3 ^= T1; T2 ^= T0; T1 ^= T2; } /* * ARIA encryption and decryption */ void transform(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector& KS) { if(KS.empty()) throw Invalid_State("ARIA key was not set"); // Hit every cache line of S1 and S2 const size_t cache_line_size = CPUID::cache_line_size(); /* * This initializer ensures Z == 0xFFFFFFFF for any cache line size * in {32,64,128,256,512} */ volatile uint32_t Z = 0x11101010; for(size_t i = 0; i < 256; i += cache_line_size / sizeof(uint32_t)) { Z |= S1[i] | S2[i]; } const size_t ROUNDS = (KS.size() / 4) - 1; for(size_t i = 0; i != blocks; ++i) { uint32_t t0, t1, t2, t3; load_be(in + 16*i, t0, t1, t2, t3); t0 &= Z; for(size_t r = 0; r < ROUNDS; r += 2) { t0 ^= KS[4*r]; t1 ^= KS[4*r+1]; t2 ^= KS[4*r+2]; t3 ^= KS[4*r+3]; ARIA_FO(t0,t1,t2,t3); t0 ^= KS[4*r+4]; t1 ^= KS[4*r+5]; t2 ^= KS[4*r+6]; t3 ^= KS[4*r+7]; if(r != ROUNDS-2) ARIA_FE(t0,t1,t2,t3); } out[16*i+ 0] = static_cast(X1[get_byte(0,t0)] ) ^ get_byte(0, KS[4*ROUNDS]); out[16*i+ 1] = static_cast(X2[get_byte(1,t0)]>>8) ^ get_byte(1, KS[4*ROUNDS]); out[16*i+ 2] = static_cast(S1[get_byte(2,t0)] ) ^ get_byte(2, KS[4*ROUNDS]); out[16*i+ 3] = static_cast(S2[get_byte(3,t0)] ) ^ get_byte(3, KS[4*ROUNDS]); out[16*i+ 4] = static_cast(X1[get_byte(0,t1)] ) ^ get_byte(0, KS[4*ROUNDS+1]); out[16*i+ 5] = static_cast(X2[get_byte(1,t1)]>>8) ^ get_byte(1, KS[4*ROUNDS+1]); out[16*i+ 6] = static_cast(S1[get_byte(2,t1)] ) ^ get_byte(2, KS[4*ROUNDS+1]); out[16*i+ 7] = static_cast(S2[get_byte(3,t1)] ) ^ get_byte(3, KS[4*ROUNDS+1]); out[16*i+ 8] = static_cast(X1[get_byte(0,t2)] ) ^ get_byte(0, KS[4*ROUNDS+2]); out[16*i+ 9] = static_cast(X2[get_byte(1,t2)]>>8) ^ get_byte(1, KS[4*ROUNDS+2]); out[16*i+10] = static_cast(S1[get_byte(2,t2)] ) ^ get_byte(2, KS[4*ROUNDS+2]); out[16*i+11] = static_cast(S2[get_byte(3,t2)] ) ^ get_byte(3, KS[4*ROUNDS+2]); out[16*i+12] = static_cast(X1[get_byte(0,t3)] ) ^ get_byte(0, KS[4*ROUNDS+3]); out[16*i+13] = static_cast(X2[get_byte(1,t3)]>>8) ^ get_byte(1, KS[4*ROUNDS+3]); out[16*i+14] = static_cast(S1[get_byte(2,t3)] ) ^ get_byte(2, KS[4*ROUNDS+3]); out[16*i+15] = static_cast(S2[get_byte(3,t3)] ) ^ get_byte(3, KS[4*ROUNDS+3]); } } // n-bit right shift of Y XORed to X template inline void ARIA_ROL128(const uint32_t X[4], const uint32_t Y[4], uint32_t KS[4]) { // MSVC is not generating a "rotate immediate". Constify to help it along. static const unsigned int Q = 4 - (N / 32); static const unsigned int R = N % 32; KS[0] = (X[0]) ^ ((Y[(Q )%4])>>R) ^ ((Y[(Q+3)%4])<<(32-R)); KS[1] = (X[1]) ^ ((Y[(Q+1)%4])>>R) ^ ((Y[(Q )%4])<<(32-R)); KS[2] = (X[2]) ^ ((Y[(Q+2)%4])>>R) ^ ((Y[(Q+1)%4])<<(32-R)); KS[3] = (X[3]) ^ ((Y[(Q+3)%4])>>R) ^ ((Y[(Q+2)%4])<<(32-R)); } /* * ARIA Key Schedule */ void key_schedule(secure_vector& ERK, secure_vector& DRK, const uint8_t key[], size_t length) { const uint32_t KRK[3][4] = { {0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0}, {0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0}, {0xdb92371d, 0x2126e970, 0x03249775, 0x04e8c90e} }; const size_t CK0 = (length / 8) - 2; const size_t CK1 = (CK0 + 1) % 3; const size_t CK2 = (CK1 + 1) % 3; uint32_t w0[4]; uint32_t w1[4]; uint32_t w2[4]; uint32_t w3[4]; w0[0] = load_be(key,0); w0[1] = load_be(key,1); w0[2] = load_be(key,2); w0[3] = load_be(key,3); w1[0] = w0[0] ^ KRK[CK0][0]; w1[1] = w0[1] ^ KRK[CK0][1]; w1[2] = w0[2] ^ KRK[CK0][2]; w1[3] = w0[3] ^ KRK[CK0][3]; ARIA_FO(w1[0], w1[1], w1[2], w1[3]); if(length == 24 || length == 32) { w1[0] ^= load_be(key,4); w1[1] ^= load_be(key,5); } if(length == 32) { w1[2] ^= load_be(key,6); w1[3] ^= load_be(key,7); } w2[0] = w1[0] ^ KRK[CK1][0]; w2[1] = w1[1] ^ KRK[CK1][1]; w2[2] = w1[2] ^ KRK[CK1][2]; w2[3] = w1[3] ^ KRK[CK1][3]; ARIA_FE(w2[0], w2[1], w2[2], w2[3]); w2[0] ^= w0[0]; w2[1] ^= w0[1]; w2[2] ^= w0[2]; w2[3] ^= w0[3]; w3[0] = w2[0] ^ KRK[CK2][0]; w3[1] = w2[1] ^ KRK[CK2][1]; w3[2] = w2[2] ^ KRK[CK2][2]; w3[3] = w2[3] ^ KRK[CK2][3]; ARIA_FO(w3[0], w3[1], w3[2], w3[3]); w3[0] ^= w1[0]; w3[1] ^= w1[1]; w3[2] ^= w1[2]; w3[3] ^= w1[3]; if(length == 16) ERK.resize(4*13); else if(length == 24) ERK.resize(4*15); else if(length == 32) ERK.resize(4*17); ARIA_ROL128<19>(w0, w1, &ERK[ 0]); ARIA_ROL128<19>(w1, w2, &ERK[ 4]); ARIA_ROL128<19>(w2, w3, &ERK[ 8]); ARIA_ROL128<19>(w3, w0, &ERK[12]); ARIA_ROL128<31>(w0, w1, &ERK[16]); ARIA_ROL128<31>(w1, w2, &ERK[20]); ARIA_ROL128<31>(w2, w3, &ERK[24]); ARIA_ROL128<31>(w3, w0, &ERK[28]); ARIA_ROL128<67>(w0, w1, &ERK[32]); ARIA_ROL128<67>(w1, w2, &ERK[36]); ARIA_ROL128<67>(w2, w3, &ERK[40]); ARIA_ROL128<67>(w3, w0, &ERK[44]); ARIA_ROL128<97>(w0, w1, &ERK[48]); if(length == 24 || length == 32) { ARIA_ROL128<97>(w1, w2, &ERK[52]); ARIA_ROL128<97>(w2, w3, &ERK[56]); if(length == 32) { ARIA_ROL128< 97>(w3, w0, &ERK[60]); ARIA_ROL128<109>(w0, w1, &ERK[64]); } } // Now create the decryption key schedule DRK.resize(ERK.size()); for(size_t i = 0; i != DRK.size(); i += 4) { DRK[i ] = ERK[ERK.size()-4-i]; DRK[i+1] = ERK[ERK.size()-3-i]; DRK[i+2] = ERK[ERK.size()-2-i]; DRK[i+3] = ERK[ERK.size()-1-i]; } for(size_t i = 4; i != DRK.size() - 4; i += 4) { for(size_t j = 0; j != 4; ++j) { DRK[i+j] = rotr<8>(DRK[i+j]) ^ rotr<16>(DRK[i+j]) ^ rotr<24>(DRK[i+j]); } DRK[i+1] ^= DRK[i+2]; DRK[i+2] ^= DRK[i+3]; DRK[i+0] ^= DRK[i+1]; DRK[i+3] ^= DRK[i+1]; DRK[i+2] ^= DRK[i+0]; DRK[i+1] ^= DRK[i+2]; DRK[i+1] = ((DRK[i+1] << 8) & 0xFF00FF00) | ((DRK[i+1] >> 8) & 0x00FF00FF); DRK[i+2] = rotr<16>(DRK[i+2]); DRK[i+3] = reverse_bytes(DRK[i+3]); DRK[i+1] ^= DRK[i+2]; DRK[i+2] ^= DRK[i+3]; DRK[i+0] ^= DRK[i+1]; DRK[i+3] ^= DRK[i+1]; DRK[i+2] ^= DRK[i+0]; DRK[i+1] ^= DRK[i+2]; } } } } void ARIA_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { ARIA_F::transform(in, out, blocks, m_ERK); } void ARIA_192::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { ARIA_F::transform(in, out, blocks, m_ERK); } void ARIA_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { ARIA_F::transform(in, out, blocks, m_ERK); } void ARIA_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { ARIA_F::transform(in, out, blocks, m_DRK); } void ARIA_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { ARIA_F::transform(in, out, blocks, m_DRK); } void ARIA_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { ARIA_F::transform(in, out, blocks, m_DRK); } void ARIA_128::key_schedule(const uint8_t key[], size_t length) { ARIA_F::key_schedule(m_ERK, m_DRK, key, length); } void ARIA_192::key_schedule(const uint8_t key[], size_t length) { ARIA_F::key_schedule(m_ERK, m_DRK, key, length); } void ARIA_256::key_schedule(const uint8_t key[], size_t length) { ARIA_F::key_schedule(m_ERK, m_DRK, key, length); } void ARIA_128::clear() { zap(m_ERK); zap(m_DRK); } void ARIA_192::clear() { zap(m_ERK); zap(m_DRK); } void ARIA_256::clear() { zap(m_ERK); zap(m_DRK); } } botan-2.4.0/src/lib/block/aria/aria.h000066400000000000000000000051741322470703100172560ustar00rootroot00000000000000/* * ARIA * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) * * This ARIA implementation is based on the 32-bit implementation by Aaram Yun from the * National Security Research Institute, KOREA. Aaram Yun's implementation is based on * the 8-bit implementation by Jin Hong. The source files are available in ARIA.zip from * the Korea Internet & Security Agency website. * RFC 5794, A Description of the ARIA Encryption Algorithm, * Korea * Internet & Security Agency homepage */ #ifndef BOTAN_ARIA_H_ #define BOTAN_ARIA_H_ #include namespace Botan { /** * ARIA-128 */ class BOTAN_PUBLIC_API(2,3) ARIA_128 final : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "ARIA-128"; } BlockCipher* clone() const override { return new ARIA_128; } private: void key_schedule(const uint8_t key[], size_t length) override; // Encryption and Decryption round keys. secure_vector m_ERK, m_DRK; }; /** * ARIA-192 */ class BOTAN_PUBLIC_API(2,3) ARIA_192 final : public Block_Cipher_Fixed_Params<16, 24> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "ARIA-192"; } BlockCipher* clone() const override { return new ARIA_192; } private: void key_schedule(const uint8_t key[], size_t length) override; // Encryption and Decryption round keys. secure_vector m_ERK, m_DRK; }; /** * ARIA-256 */ class BOTAN_PUBLIC_API(2,3) ARIA_256 final : public Block_Cipher_Fixed_Params<16, 32> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "ARIA-256"; } BlockCipher* clone() const override { return new ARIA_256; } private: void key_schedule(const uint8_t key[], size_t length) override; // Encryption and Decryption round keys. secure_vector m_ERK, m_DRK; }; } #endif botan-2.4.0/src/lib/block/aria/info.txt000066400000000000000000000001171322470703100176550ustar00rootroot00000000000000 ARIA -> 20170415 aria.h botan-2.4.0/src/lib/block/block_cipher.cpp000066400000000000000000000157641322470703100204130ustar00rootroot00000000000000/* * Block Ciphers * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_AES) #include #endif #if defined(BOTAN_HAS_ARIA) #include #endif #if defined(BOTAN_HAS_BLOWFISH) #include #endif #if defined(BOTAN_HAS_CAMELLIA) #include #endif #if defined(BOTAN_HAS_CAST_128) #include #endif #if defined(BOTAN_HAS_CAST_256) #include #endif #if defined(BOTAN_HAS_CASCADE) #include #endif #if defined(BOTAN_HAS_DES) #include #include #endif #if defined(BOTAN_HAS_GOST_28147_89) #include #endif #if defined(BOTAN_HAS_IDEA) #include #endif #if defined(BOTAN_HAS_KASUMI) #include #endif #if defined(BOTAN_HAS_LION) #include #endif #if defined(BOTAN_HAS_MISTY1) #include #endif #if defined(BOTAN_HAS_NOEKEON) #include #endif #if defined(BOTAN_HAS_SEED) #include #endif #if defined(BOTAN_HAS_SERPENT) #include #endif #if defined(BOTAN_HAS_SHACAL2) #include #endif #if defined(BOTAN_HAS_SM4) #include #endif #if defined(BOTAN_HAS_TWOFISH) #include #endif #if defined(BOTAN_HAS_THREEFISH_512) #include #endif #if defined(BOTAN_HAS_XTEA) #include #endif #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { std::unique_ptr BlockCipher::create(const std::string& algo, const std::string& provider) { #if defined(BOTAN_HAS_OPENSSL) if(provider.empty() || provider == "openssl") { if(auto bc = make_openssl_block_cipher(algo)) return bc; if(!provider.empty()) return nullptr; } #endif // TODO: CommonCrypto // TODO: CryptoAPI // TODO: /dev/crypto // Only base providers from here on out if(provider.empty() == false && provider != "base") return nullptr; #if defined(BOTAN_HAS_AES) if(algo == "AES-128") { return std::unique_ptr(new AES_128); } if(algo == "AES-192") { return std::unique_ptr(new AES_192); } if(algo == "AES-256") { return std::unique_ptr(new AES_256); } #endif #if defined(BOTAN_HAS_ARIA) if(algo == "ARIA-128") { return std::unique_ptr(new ARIA_128); } if(algo == "ARIA-192") { return std::unique_ptr(new ARIA_192); } if(algo == "ARIA-256") { return std::unique_ptr(new ARIA_256); } #endif #if defined(BOTAN_HAS_SERPENT) if(algo == "Serpent") { return std::unique_ptr(new Serpent); } #endif #if defined(BOTAN_HAS_SHACAL2) if(algo == "SHACAL2") { return std::unique_ptr(new SHACAL2); } #endif #if defined(BOTAN_HAS_TWOFISH) if(algo == "Twofish") { return std::unique_ptr(new Twofish); } #endif #if defined(BOTAN_HAS_THREEFISH_512) if(algo == "Threefish-512") { return std::unique_ptr(new Threefish_512); } #endif #if defined(BOTAN_HAS_BLOWFISH) if(algo == "Blowfish") { return std::unique_ptr(new Blowfish); } #endif #if defined(BOTAN_HAS_CAMELLIA) if(algo == "Camellia-128") { return std::unique_ptr(new Camellia_128); } if(algo == "Camellia-192") { return std::unique_ptr(new Camellia_192); } if(algo == "Camellia-256") { return std::unique_ptr(new Camellia_256); } #endif #if defined(BOTAN_HAS_DES) if(algo == "DES") { return std::unique_ptr(new DES); } if(algo == "DESX") { return std::unique_ptr(new DESX); } if(algo == "TripleDES" || algo == "3DES" || algo == "DES-EDE") { return std::unique_ptr(new TripleDES); } #endif #if defined(BOTAN_HAS_NOEKEON) if(algo == "Noekeon") { return std::unique_ptr(new Noekeon); } #endif #if defined(BOTAN_HAS_CAST_128) if(algo == "CAST-128" || algo == "CAST5") { return std::unique_ptr(new CAST_128); } #endif #if defined(BOTAN_HAS_CAST_256) if(algo == "CAST-256") { return std::unique_ptr(new CAST_256); } #endif #if defined(BOTAN_HAS_IDEA) if(algo == "IDEA") { return std::unique_ptr(new IDEA); } #endif #if defined(BOTAN_HAS_KASUMI) if(algo == "KASUMI") { return std::unique_ptr(new KASUMI); } #endif #if defined(BOTAN_HAS_MISTY1) if(algo == "MISTY1") { return std::unique_ptr(new MISTY1); } #endif #if defined(BOTAN_HAS_SEED) if(algo == "SEED") { return std::unique_ptr(new SEED); } #endif #if defined(BOTAN_HAS_SM4) if(algo == "SM4") { return std::unique_ptr(new SM4); } #endif #if defined(BOTAN_HAS_XTEA) if(algo == "XTEA") { return std::unique_ptr(new XTEA); } #endif const SCAN_Name req(algo); #if defined(BOTAN_HAS_GOST_28147_89) if(req.algo_name() == "GOST-28147-89") { return std::unique_ptr(new GOST_28147_89(req.arg(0, "R3411_94_TestParam"))); } #endif #if defined(BOTAN_HAS_CASCADE) if(req.algo_name() == "Cascade" && req.arg_count() == 2) { std::unique_ptr c1(BlockCipher::create(req.arg(0))); std::unique_ptr c2(BlockCipher::create(req.arg(1))); if(c1 && c2) return std::unique_ptr(new Cascade_Cipher(c1.release(), c2.release())); } #endif #if defined(BOTAN_HAS_LION) if(req.algo_name() == "Lion" && req.arg_count_between(2, 3)) { std::unique_ptr hash(HashFunction::create(req.arg(0))); std::unique_ptr stream(StreamCipher::create(req.arg(1))); if(hash && stream) { const size_t block_size = req.arg_as_integer(2, 1024); return std::unique_ptr(new Lion(hash.release(), stream.release(), block_size)); } } #endif BOTAN_UNUSED(req); BOTAN_UNUSED(provider); return nullptr; } //static std::unique_ptr BlockCipher::create_or_throw(const std::string& algo, const std::string& provider) { if(auto bc = BlockCipher::create(algo, provider)) { return bc; } throw Lookup_Error("Block cipher", algo, provider); } std::vector BlockCipher::providers(const std::string& algo) { return probe_providers_of(algo, { "base", "openssl" }); } } botan-2.4.0/src/lib/block/block_cipher.h000066400000000000000000000167071322470703100200560ustar00rootroot00000000000000/* * Block Cipher Base Class * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BLOCK_CIPHER_H_ #define BOTAN_BLOCK_CIPHER_H_ #include #include #include namespace Botan { /** * This class represents a block cipher object. */ class BOTAN_PUBLIC_API(2,0) BlockCipher : public SymmetricAlgorithm { public: /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to choose * @return a null pointer if the algo/provider combination cannot be found */ static std::unique_ptr create(const std::string& algo_spec, const std::string& provider = ""); /** * Create an instance based on a name, or throw if the * algo/provider combination cannot be found. If provider is * empty then best available is chosen. */ static std::unique_ptr create_or_throw(const std::string& algo_spec, const std::string& provider = ""); /** * @return list of available providers for this algorithm, empty if not available * @param algo_spec algorithm name */ static std::vector providers(const std::string& algo_spec); /** * @return block size of this algorithm */ virtual size_t block_size() const = 0; /** * @return native parallelism of this cipher in blocks */ virtual size_t parallelism() const { return 1; } /** * @return prefererred parallelism of this cipher in bytes */ size_t parallel_bytes() const { return parallelism() * block_size() * BOTAN_BLOCK_CIPHER_PAR_MULT; } /** * @return provider information about this implementation. Default is "base", * might also return "sse2", "avx2", "openssl", or some other arbitrary string. */ virtual std::string provider() const { return "base"; } /** * Encrypt a block. * @param in The plaintext block to be encrypted as a byte array. * Must be of length block_size(). * @param out The byte array designated to hold the encrypted block. * Must be of length block_size(). */ void encrypt(const uint8_t in[], uint8_t out[]) const { encrypt_n(in, out, 1); } /** * Decrypt a block. * @param in The ciphertext block to be decypted as a byte array. * Must be of length block_size(). * @param out The byte array designated to hold the decrypted block. * Must be of length block_size(). */ void decrypt(const uint8_t in[], uint8_t out[]) const { decrypt_n(in, out, 1); } /** * Encrypt a block. * @param block the plaintext block to be encrypted * Must be of length block_size(). Will hold the result when the function * has finished. */ void encrypt(uint8_t block[]) const { encrypt_n(block, block, 1); } /** * Decrypt a block. * @param block the ciphertext block to be decrypted * Must be of length block_size(). Will hold the result when the function * has finished. */ void decrypt(uint8_t block[]) const { decrypt_n(block, block, 1); } /** * Encrypt one or more blocks * @param block the input/output buffer (multiple of block_size()) */ template void encrypt(std::vector& block) const { return encrypt_n(block.data(), block.data(), block.size() / block_size()); } /** * Decrypt one or more blocks * @param block the input/output buffer (multiple of block_size()) */ template void decrypt(std::vector& block) const { return decrypt_n(block.data(), block.data(), block.size() / block_size()); } /** * Encrypt one or more blocks * @param in the input buffer (multiple of block_size()) * @param out the output buffer (same size as in) */ template void encrypt(const std::vector& in, std::vector& out) const { return encrypt_n(in.data(), out.data(), in.size() / block_size()); } /** * Decrypt one or more blocks * @param in the input buffer (multiple of block_size()) * @param out the output buffer (same size as in) */ template void decrypt(const std::vector& in, std::vector& out) const { return decrypt_n(in.data(), out.data(), in.size() / block_size()); } /** * Encrypt one or more blocks * @param in the input buffer (multiple of block_size()) * @param out the output buffer (same size as in) * @param blocks the number of blocks to process */ virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const = 0; /** * Decrypt one or more blocks * @param in the input buffer (multiple of block_size()) * @param out the output buffer (same size as in) * @param blocks the number of blocks to process */ virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const = 0; virtual void encrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const { const size_t BS = block_size(); xor_buf(data, mask, blocks * BS); encrypt_n(data, data, blocks); xor_buf(data, mask, blocks * BS); } virtual void decrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const { const size_t BS = block_size(); xor_buf(data, mask, blocks * BS); decrypt_n(data, data, blocks); xor_buf(data, mask, blocks * BS); } /** * @return new object representing the same algorithm as *this */ virtual BlockCipher* clone() const = 0; virtual ~BlockCipher() = default; }; /** * Represents a block cipher with a single fixed block size */ template class Block_Cipher_Fixed_Params : public BlockCipher { public: enum { BLOCK_SIZE = BS }; size_t block_size() const override { return BS; } // override to take advantage of compile time constant block size void encrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const override { xor_buf(data, mask, blocks * BS); encrypt_n(data, data, blocks); xor_buf(data, mask, blocks * BS); } void decrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const override { xor_buf(data, mask, blocks * BS); decrypt_n(data, data, blocks); xor_buf(data, mask, blocks * BS); } Key_Length_Specification key_spec() const override { return Key_Length_Specification(KMIN, KMAX, KMOD); } }; } #endif botan-2.4.0/src/lib/block/blowfish/000077500000000000000000000000001322470703100170635ustar00rootroot00000000000000botan-2.4.0/src/lib/block/blowfish/blowfish.cpp000066400000000000000000000436471322470703100214220ustar00rootroot00000000000000/* * Blowfish * (C) 1999-2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { const uint32_t P_INIT[18] = { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B }; const uint32_t S_INIT[1024] = { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A, 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7, 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0, 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }; inline uint32_t BFF(uint32_t X, const secure_vector& S) { return ((S[ get_byte(0, X)] + S[256+get_byte(1, X)]) ^ S[512+get_byte(2, X)]) + S[768+get_byte(3, X)]; } } /* * Blowfish Encryption */ void Blowfish::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_S.empty() == false); while(blocks >= 2) { uint32_t L0, R0, L1, R1; load_be(in, L0, R0, L1, R1); for(size_t r = 0; r != 16; r += 2) { L0 ^= m_P[r]; L1 ^= m_P[r]; R0 ^= BFF(L0, m_S); R1 ^= BFF(L1, m_S); R0 ^= m_P[r+1]; R1 ^= m_P[r+1]; L0 ^= BFF(R0, m_S); L1 ^= BFF(R1, m_S); } L0 ^= m_P[16]; R0 ^= m_P[17]; L1 ^= m_P[16]; R1 ^= m_P[17]; store_be(out, R0, L0, R1, L1); in += 2*BLOCK_SIZE; out += 2*BLOCK_SIZE; blocks -= 2; } if(blocks) { uint32_t L, R; load_be(in, L, R); for(size_t r = 0; r != 16; r += 2) { L ^= m_P[r]; R ^= BFF(L, m_S); R ^= m_P[r+1]; L ^= BFF(R, m_S); } L ^= m_P[16]; R ^= m_P[17]; store_be(out, R, L); } } /* * Blowfish Decryption */ void Blowfish::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_S.empty() == false); while(blocks >= 2) { uint32_t L0, R0, L1, R1; load_be(in, L0, R0, L1, R1); for(size_t r = 17; r != 1; r -= 2) { L0 ^= m_P[r]; L1 ^= m_P[r]; R0 ^= BFF(L0, m_S); R1 ^= BFF(L1, m_S); R0 ^= m_P[r-1]; R1 ^= m_P[r-1]; L0 ^= BFF(R0, m_S); L1 ^= BFF(R1, m_S); } L0 ^= m_P[1]; R0 ^= m_P[0]; L1 ^= m_P[1]; R1 ^= m_P[0]; store_be(out, R0, L0, R1, L1); in += 2*BLOCK_SIZE; out += 2*BLOCK_SIZE; blocks -= 2; } if(blocks) { uint32_t L, R; load_be(in, L, R); for(size_t r = 17; r != 1; r -= 2) { L ^= m_P[r]; R ^= BFF(L, m_S); R ^= m_P[r-1]; L ^= BFF(R, m_S); } L ^= m_P[1]; R ^= m_P[0]; store_be(out, R, L); } } /* * Blowfish Key Schedule */ void Blowfish::key_schedule(const uint8_t key[], size_t length) { m_P.resize(18); copy_mem(m_P.data(), P_INIT, 18); m_S.resize(1024); copy_mem(m_S.data(), S_INIT, 1024); const uint8_t null_salt[16] = { 0 }; key_expansion(key, length, null_salt); } void Blowfish::key_expansion(const uint8_t key[], size_t length, const uint8_t salt[16]) { for(size_t i = 0, j = 0; i != 18; ++i, j += 4) m_P[i] ^= make_uint32(key[(j ) % length], key[(j+1) % length], key[(j+2) % length], key[(j+3) % length]); uint32_t L = 0, R = 0; generate_sbox(m_P, L, R, salt, 0); generate_sbox(m_S, L, R, salt, 2); } /* * Modified key schedule used for bcrypt password hashing */ void Blowfish::eks_key_schedule(const uint8_t key[], size_t length, const uint8_t salt[16], size_t workfactor) { /* * On a 2.8 GHz Core-i7, workfactor == 18 takes about 25 seconds to * hash a password. This seems like a reasonable upper bound for the * time being. * Bcrypt allows up to work factor 31 (2^31 iterations) */ if(workfactor > 18) throw Invalid_Argument("Requested Bcrypt work factor " + std::to_string(workfactor) + " too large"); if(workfactor < 4) throw Invalid_Argument("Bcrypt requires work factor at least 4"); if(length > 72) { // Truncate longer passwords to the 72 char bcrypt limit length = 72; } m_P.resize(18); copy_mem(m_P.data(), P_INIT, 18); m_S.resize(1024); copy_mem(m_S.data(), S_INIT, 1024); key_expansion(key, length, salt); const uint8_t null_salt[16] = { 0 }; const size_t rounds = static_cast(1) << workfactor; for(size_t r = 0; r != rounds; ++r) { key_expansion(key, length, null_salt); key_expansion(salt, 16, null_salt); } } /* * Generate one of the Sboxes */ void Blowfish::generate_sbox(secure_vector& box, uint32_t& L, uint32_t& R, const uint8_t salt[16], size_t salt_off) const { for(size_t i = 0; i != box.size(); i += 2) { L ^= load_be(salt, (i + salt_off) % 4); R ^= load_be(salt, (i + salt_off + 1) % 4); for(size_t r = 0; r != 16; r += 2) { L ^= m_P[r]; R ^= BFF(L, m_S); R ^= m_P[r+1]; L ^= BFF(R, m_S); } uint32_t T = R; R = L ^ m_P[16]; L = T ^ m_P[17]; box[i] = L; box[i+1] = R; } } /* * Clear memory of sensitive data */ void Blowfish::clear() { zap(m_P); zap(m_S); } } botan-2.4.0/src/lib/block/blowfish/blowfish.h000066400000000000000000000025711322470703100210560ustar00rootroot00000000000000/* * Blowfish * (C) 1999-2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BLOWFISH_H_ #define BOTAN_BLOWFISH_H_ #include namespace Botan { /** * Blowfish */ class BOTAN_PUBLIC_API(2,0) Blowfish final : public Block_Cipher_Fixed_Params<8, 1, 56> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; /** * Modified EKSBlowfish key schedule, used for bcrypt password hashing */ void eks_key_schedule(const uint8_t key[], size_t key_length, const uint8_t salt[16], size_t workfactor); void clear() override; std::string name() const override { return "Blowfish"; } BlockCipher* clone() const override { return new Blowfish; } private: void key_schedule(const uint8_t key[], size_t length) override; void key_expansion(const uint8_t key[], size_t key_length, const uint8_t salt[16]); void generate_sbox(secure_vector& box, uint32_t& L, uint32_t& R, const uint8_t salt[16], size_t salt_off) const; secure_vector m_S, m_P; }; } #endif botan-2.4.0/src/lib/block/blowfish/info.txt000066400000000000000000000000521322470703100205540ustar00rootroot00000000000000 BLOWFISH -> 20131128 botan-2.4.0/src/lib/block/camellia/000077500000000000000000000000001322470703100170155ustar00rootroot00000000000000botan-2.4.0/src/lib/block/camellia/camellia.cpp000066400000000000000000001470311322470703100212760ustar00rootroot00000000000000/* * Camellia * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { const uint64_t Camellia_SBOX1[256] = { 0x7070700070000070, 0x8282820082000082, 0x2C2C2C002C00002C, 0xECECEC00EC0000EC, 0xB3B3B300B30000B3, 0x2727270027000027, 0xC0C0C000C00000C0, 0xE5E5E500E50000E5, 0xE4E4E400E40000E4, 0x8585850085000085, 0x5757570057000057, 0x3535350035000035, 0xEAEAEA00EA0000EA, 0x0C0C0C000C00000C, 0xAEAEAE00AE0000AE, 0x4141410041000041, 0x2323230023000023, 0xEFEFEF00EF0000EF, 0x6B6B6B006B00006B, 0x9393930093000093, 0x4545450045000045, 0x1919190019000019, 0xA5A5A500A50000A5, 0x2121210021000021, 0xEDEDED00ED0000ED, 0x0E0E0E000E00000E, 0x4F4F4F004F00004F, 0x4E4E4E004E00004E, 0x1D1D1D001D00001D, 0x6565650065000065, 0x9292920092000092, 0xBDBDBD00BD0000BD, 0x8686860086000086, 0xB8B8B800B80000B8, 0xAFAFAF00AF0000AF, 0x8F8F8F008F00008F, 0x7C7C7C007C00007C, 0xEBEBEB00EB0000EB, 0x1F1F1F001F00001F, 0xCECECE00CE0000CE, 0x3E3E3E003E00003E, 0x3030300030000030, 0xDCDCDC00DC0000DC, 0x5F5F5F005F00005F, 0x5E5E5E005E00005E, 0xC5C5C500C50000C5, 0x0B0B0B000B00000B, 0x1A1A1A001A00001A, 0xA6A6A600A60000A6, 0xE1E1E100E10000E1, 0x3939390039000039, 0xCACACA00CA0000CA, 0xD5D5D500D50000D5, 0x4747470047000047, 0x5D5D5D005D00005D, 0x3D3D3D003D00003D, 0xD9D9D900D90000D9, 0x0101010001000001, 0x5A5A5A005A00005A, 0xD6D6D600D60000D6, 0x5151510051000051, 0x5656560056000056, 0x6C6C6C006C00006C, 0x4D4D4D004D00004D, 0x8B8B8B008B00008B, 0x0D0D0D000D00000D, 0x9A9A9A009A00009A, 0x6666660066000066, 0xFBFBFB00FB0000FB, 0xCCCCCC00CC0000CC, 0xB0B0B000B00000B0, 0x2D2D2D002D00002D, 0x7474740074000074, 0x1212120012000012, 0x2B2B2B002B00002B, 0x2020200020000020, 0xF0F0F000F00000F0, 0xB1B1B100B10000B1, 0x8484840084000084, 0x9999990099000099, 0xDFDFDF00DF0000DF, 0x4C4C4C004C00004C, 0xCBCBCB00CB0000CB, 0xC2C2C200C20000C2, 0x3434340034000034, 0x7E7E7E007E00007E, 0x7676760076000076, 0x0505050005000005, 0x6D6D6D006D00006D, 0xB7B7B700B70000B7, 0xA9A9A900A90000A9, 0x3131310031000031, 0xD1D1D100D10000D1, 0x1717170017000017, 0x0404040004000004, 0xD7D7D700D70000D7, 0x1414140014000014, 0x5858580058000058, 0x3A3A3A003A00003A, 0x6161610061000061, 0xDEDEDE00DE0000DE, 0x1B1B1B001B00001B, 0x1111110011000011, 0x1C1C1C001C00001C, 0x3232320032000032, 0x0F0F0F000F00000F, 0x9C9C9C009C00009C, 0x1616160016000016, 0x5353530053000053, 0x1818180018000018, 0xF2F2F200F20000F2, 0x2222220022000022, 0xFEFEFE00FE0000FE, 0x4444440044000044, 0xCFCFCF00CF0000CF, 0xB2B2B200B20000B2, 0xC3C3C300C30000C3, 0xB5B5B500B50000B5, 0x7A7A7A007A00007A, 0x9191910091000091, 0x2424240024000024, 0x0808080008000008, 0xE8E8E800E80000E8, 0xA8A8A800A80000A8, 0x6060600060000060, 0xFCFCFC00FC0000FC, 0x6969690069000069, 0x5050500050000050, 0xAAAAAA00AA0000AA, 0xD0D0D000D00000D0, 0xA0A0A000A00000A0, 0x7D7D7D007D00007D, 0xA1A1A100A10000A1, 0x8989890089000089, 0x6262620062000062, 0x9797970097000097, 0x5454540054000054, 0x5B5B5B005B00005B, 0x1E1E1E001E00001E, 0x9595950095000095, 0xE0E0E000E00000E0, 0xFFFFFF00FF0000FF, 0x6464640064000064, 0xD2D2D200D20000D2, 0x1010100010000010, 0xC4C4C400C40000C4, 0x0000000000000000, 0x4848480048000048, 0xA3A3A300A30000A3, 0xF7F7F700F70000F7, 0x7575750075000075, 0xDBDBDB00DB0000DB, 0x8A8A8A008A00008A, 0x0303030003000003, 0xE6E6E600E60000E6, 0xDADADA00DA0000DA, 0x0909090009000009, 0x3F3F3F003F00003F, 0xDDDDDD00DD0000DD, 0x9494940094000094, 0x8787870087000087, 0x5C5C5C005C00005C, 0x8383830083000083, 0x0202020002000002, 0xCDCDCD00CD0000CD, 0x4A4A4A004A00004A, 0x9090900090000090, 0x3333330033000033, 0x7373730073000073, 0x6767670067000067, 0xF6F6F600F60000F6, 0xF3F3F300F30000F3, 0x9D9D9D009D00009D, 0x7F7F7F007F00007F, 0xBFBFBF00BF0000BF, 0xE2E2E200E20000E2, 0x5252520052000052, 0x9B9B9B009B00009B, 0xD8D8D800D80000D8, 0x2626260026000026, 0xC8C8C800C80000C8, 0x3737370037000037, 0xC6C6C600C60000C6, 0x3B3B3B003B00003B, 0x8181810081000081, 0x9696960096000096, 0x6F6F6F006F00006F, 0x4B4B4B004B00004B, 0x1313130013000013, 0xBEBEBE00BE0000BE, 0x6363630063000063, 0x2E2E2E002E00002E, 0xE9E9E900E90000E9, 0x7979790079000079, 0xA7A7A700A70000A7, 0x8C8C8C008C00008C, 0x9F9F9F009F00009F, 0x6E6E6E006E00006E, 0xBCBCBC00BC0000BC, 0x8E8E8E008E00008E, 0x2929290029000029, 0xF5F5F500F50000F5, 0xF9F9F900F90000F9, 0xB6B6B600B60000B6, 0x2F2F2F002F00002F, 0xFDFDFD00FD0000FD, 0xB4B4B400B40000B4, 0x5959590059000059, 0x7878780078000078, 0x9898980098000098, 0x0606060006000006, 0x6A6A6A006A00006A, 0xE7E7E700E70000E7, 0x4646460046000046, 0x7171710071000071, 0xBABABA00BA0000BA, 0xD4D4D400D40000D4, 0x2525250025000025, 0xABABAB00AB0000AB, 0x4242420042000042, 0x8888880088000088, 0xA2A2A200A20000A2, 0x8D8D8D008D00008D, 0xFAFAFA00FA0000FA, 0x7272720072000072, 0x0707070007000007, 0xB9B9B900B90000B9, 0x5555550055000055, 0xF8F8F800F80000F8, 0xEEEEEE00EE0000EE, 0xACACAC00AC0000AC, 0x0A0A0A000A00000A, 0x3636360036000036, 0x4949490049000049, 0x2A2A2A002A00002A, 0x6868680068000068, 0x3C3C3C003C00003C, 0x3838380038000038, 0xF1F1F100F10000F1, 0xA4A4A400A40000A4, 0x4040400040000040, 0x2828280028000028, 0xD3D3D300D30000D3, 0x7B7B7B007B00007B, 0xBBBBBB00BB0000BB, 0xC9C9C900C90000C9, 0x4343430043000043, 0xC1C1C100C10000C1, 0x1515150015000015, 0xE3E3E300E30000E3, 0xADADAD00AD0000AD, 0xF4F4F400F40000F4, 0x7777770077000077, 0xC7C7C700C70000C7, 0x8080800080000080, 0x9E9E9E009E00009E }; const uint64_t Camellia_SBOX2[256] = { 0x00E0E0E0E0E00000, 0x0005050505050000, 0x0058585858580000, 0x00D9D9D9D9D90000, 0x0067676767670000, 0x004E4E4E4E4E0000, 0x0081818181810000, 0x00CBCBCBCBCB0000, 0x00C9C9C9C9C90000, 0x000B0B0B0B0B0000, 0x00AEAEAEAEAE0000, 0x006A6A6A6A6A0000, 0x00D5D5D5D5D50000, 0x0018181818180000, 0x005D5D5D5D5D0000, 0x0082828282820000, 0x0046464646460000, 0x00DFDFDFDFDF0000, 0x00D6D6D6D6D60000, 0x0027272727270000, 0x008A8A8A8A8A0000, 0x0032323232320000, 0x004B4B4B4B4B0000, 0x0042424242420000, 0x00DBDBDBDBDB0000, 0x001C1C1C1C1C0000, 0x009E9E9E9E9E0000, 0x009C9C9C9C9C0000, 0x003A3A3A3A3A0000, 0x00CACACACACA0000, 0x0025252525250000, 0x007B7B7B7B7B0000, 0x000D0D0D0D0D0000, 0x0071717171710000, 0x005F5F5F5F5F0000, 0x001F1F1F1F1F0000, 0x00F8F8F8F8F80000, 0x00D7D7D7D7D70000, 0x003E3E3E3E3E0000, 0x009D9D9D9D9D0000, 0x007C7C7C7C7C0000, 0x0060606060600000, 0x00B9B9B9B9B90000, 0x00BEBEBEBEBE0000, 0x00BCBCBCBCBC0000, 0x008B8B8B8B8B0000, 0x0016161616160000, 0x0034343434340000, 0x004D4D4D4D4D0000, 0x00C3C3C3C3C30000, 0x0072727272720000, 0x0095959595950000, 0x00ABABABABAB0000, 0x008E8E8E8E8E0000, 0x00BABABABABA0000, 0x007A7A7A7A7A0000, 0x00B3B3B3B3B30000, 0x0002020202020000, 0x00B4B4B4B4B40000, 0x00ADADADADAD0000, 0x00A2A2A2A2A20000, 0x00ACACACACAC0000, 0x00D8D8D8D8D80000, 0x009A9A9A9A9A0000, 0x0017171717170000, 0x001A1A1A1A1A0000, 0x0035353535350000, 0x00CCCCCCCCCC0000, 0x00F7F7F7F7F70000, 0x0099999999990000, 0x0061616161610000, 0x005A5A5A5A5A0000, 0x00E8E8E8E8E80000, 0x0024242424240000, 0x0056565656560000, 0x0040404040400000, 0x00E1E1E1E1E10000, 0x0063636363630000, 0x0009090909090000, 0x0033333333330000, 0x00BFBFBFBFBF0000, 0x0098989898980000, 0x0097979797970000, 0x0085858585850000, 0x0068686868680000, 0x00FCFCFCFCFC0000, 0x00ECECECECEC0000, 0x000A0A0A0A0A0000, 0x00DADADADADA0000, 0x006F6F6F6F6F0000, 0x0053535353530000, 0x0062626262620000, 0x00A3A3A3A3A30000, 0x002E2E2E2E2E0000, 0x0008080808080000, 0x00AFAFAFAFAF0000, 0x0028282828280000, 0x00B0B0B0B0B00000, 0x0074747474740000, 0x00C2C2C2C2C20000, 0x00BDBDBDBDBD0000, 0x0036363636360000, 0x0022222222220000, 0x0038383838380000, 0x0064646464640000, 0x001E1E1E1E1E0000, 0x0039393939390000, 0x002C2C2C2C2C0000, 0x00A6A6A6A6A60000, 0x0030303030300000, 0x00E5E5E5E5E50000, 0x0044444444440000, 0x00FDFDFDFDFD0000, 0x0088888888880000, 0x009F9F9F9F9F0000, 0x0065656565650000, 0x0087878787870000, 0x006B6B6B6B6B0000, 0x00F4F4F4F4F40000, 0x0023232323230000, 0x0048484848480000, 0x0010101010100000, 0x00D1D1D1D1D10000, 0x0051515151510000, 0x00C0C0C0C0C00000, 0x00F9F9F9F9F90000, 0x00D2D2D2D2D20000, 0x00A0A0A0A0A00000, 0x0055555555550000, 0x00A1A1A1A1A10000, 0x0041414141410000, 0x00FAFAFAFAFA0000, 0x0043434343430000, 0x0013131313130000, 0x00C4C4C4C4C40000, 0x002F2F2F2F2F0000, 0x00A8A8A8A8A80000, 0x00B6B6B6B6B60000, 0x003C3C3C3C3C0000, 0x002B2B2B2B2B0000, 0x00C1C1C1C1C10000, 0x00FFFFFFFFFF0000, 0x00C8C8C8C8C80000, 0x00A5A5A5A5A50000, 0x0020202020200000, 0x0089898989890000, 0x0000000000000000, 0x0090909090900000, 0x0047474747470000, 0x00EFEFEFEFEF0000, 0x00EAEAEAEAEA0000, 0x00B7B7B7B7B70000, 0x0015151515150000, 0x0006060606060000, 0x00CDCDCDCDCD0000, 0x00B5B5B5B5B50000, 0x0012121212120000, 0x007E7E7E7E7E0000, 0x00BBBBBBBBBB0000, 0x0029292929290000, 0x000F0F0F0F0F0000, 0x00B8B8B8B8B80000, 0x0007070707070000, 0x0004040404040000, 0x009B9B9B9B9B0000, 0x0094949494940000, 0x0021212121210000, 0x0066666666660000, 0x00E6E6E6E6E60000, 0x00CECECECECE0000, 0x00EDEDEDEDED0000, 0x00E7E7E7E7E70000, 0x003B3B3B3B3B0000, 0x00FEFEFEFEFE0000, 0x007F7F7F7F7F0000, 0x00C5C5C5C5C50000, 0x00A4A4A4A4A40000, 0x0037373737370000, 0x00B1B1B1B1B10000, 0x004C4C4C4C4C0000, 0x0091919191910000, 0x006E6E6E6E6E0000, 0x008D8D8D8D8D0000, 0x0076767676760000, 0x0003030303030000, 0x002D2D2D2D2D0000, 0x00DEDEDEDEDE0000, 0x0096969696960000, 0x0026262626260000, 0x007D7D7D7D7D0000, 0x00C6C6C6C6C60000, 0x005C5C5C5C5C0000, 0x00D3D3D3D3D30000, 0x00F2F2F2F2F20000, 0x004F4F4F4F4F0000, 0x0019191919190000, 0x003F3F3F3F3F0000, 0x00DCDCDCDCDC0000, 0x0079797979790000, 0x001D1D1D1D1D0000, 0x0052525252520000, 0x00EBEBEBEBEB0000, 0x00F3F3F3F3F30000, 0x006D6D6D6D6D0000, 0x005E5E5E5E5E0000, 0x00FBFBFBFBFB0000, 0x0069696969690000, 0x00B2B2B2B2B20000, 0x00F0F0F0F0F00000, 0x0031313131310000, 0x000C0C0C0C0C0000, 0x00D4D4D4D4D40000, 0x00CFCFCFCFCF0000, 0x008C8C8C8C8C0000, 0x00E2E2E2E2E20000, 0x0075757575750000, 0x00A9A9A9A9A90000, 0x004A4A4A4A4A0000, 0x0057575757570000, 0x0084848484840000, 0x0011111111110000, 0x0045454545450000, 0x001B1B1B1B1B0000, 0x00F5F5F5F5F50000, 0x00E4E4E4E4E40000, 0x000E0E0E0E0E0000, 0x0073737373730000, 0x00AAAAAAAAAA0000, 0x00F1F1F1F1F10000, 0x00DDDDDDDDDD0000, 0x0059595959590000, 0x0014141414140000, 0x006C6C6C6C6C0000, 0x0092929292920000, 0x0054545454540000, 0x00D0D0D0D0D00000, 0x0078787878780000, 0x0070707070700000, 0x00E3E3E3E3E30000, 0x0049494949490000, 0x0080808080800000, 0x0050505050500000, 0x00A7A7A7A7A70000, 0x00F6F6F6F6F60000, 0x0077777777770000, 0x0093939393930000, 0x0086868686860000, 0x0083838383830000, 0x002A2A2A2A2A0000, 0x00C7C7C7C7C70000, 0x005B5B5B5B5B0000, 0x00E9E9E9E9E90000, 0x00EEEEEEEEEE0000, 0x008F8F8F8F8F0000, 0x0001010101010000, 0x003D3D3D3D3D0000 }; const uint64_t Camellia_SBOX3[256] = { 0x3800383800383800, 0x4100414100414100, 0x1600161600161600, 0x7600767600767600, 0xD900D9D900D9D900, 0x9300939300939300, 0x6000606000606000, 0xF200F2F200F2F200, 0x7200727200727200, 0xC200C2C200C2C200, 0xAB00ABAB00ABAB00, 0x9A009A9A009A9A00, 0x7500757500757500, 0x0600060600060600, 0x5700575700575700, 0xA000A0A000A0A000, 0x9100919100919100, 0xF700F7F700F7F700, 0xB500B5B500B5B500, 0xC900C9C900C9C900, 0xA200A2A200A2A200, 0x8C008C8C008C8C00, 0xD200D2D200D2D200, 0x9000909000909000, 0xF600F6F600F6F600, 0x0700070700070700, 0xA700A7A700A7A700, 0x2700272700272700, 0x8E008E8E008E8E00, 0xB200B2B200B2B200, 0x4900494900494900, 0xDE00DEDE00DEDE00, 0x4300434300434300, 0x5C005C5C005C5C00, 0xD700D7D700D7D700, 0xC700C7C700C7C700, 0x3E003E3E003E3E00, 0xF500F5F500F5F500, 0x8F008F8F008F8F00, 0x6700676700676700, 0x1F001F1F001F1F00, 0x1800181800181800, 0x6E006E6E006E6E00, 0xAF00AFAF00AFAF00, 0x2F002F2F002F2F00, 0xE200E2E200E2E200, 0x8500858500858500, 0x0D000D0D000D0D00, 0x5300535300535300, 0xF000F0F000F0F000, 0x9C009C9C009C9C00, 0x6500656500656500, 0xEA00EAEA00EAEA00, 0xA300A3A300A3A300, 0xAE00AEAE00AEAE00, 0x9E009E9E009E9E00, 0xEC00ECEC00ECEC00, 0x8000808000808000, 0x2D002D2D002D2D00, 0x6B006B6B006B6B00, 0xA800A8A800A8A800, 0x2B002B2B002B2B00, 0x3600363600363600, 0xA600A6A600A6A600, 0xC500C5C500C5C500, 0x8600868600868600, 0x4D004D4D004D4D00, 0x3300333300333300, 0xFD00FDFD00FDFD00, 0x6600666600666600, 0x5800585800585800, 0x9600969600969600, 0x3A003A3A003A3A00, 0x0900090900090900, 0x9500959500959500, 0x1000101000101000, 0x7800787800787800, 0xD800D8D800D8D800, 0x4200424200424200, 0xCC00CCCC00CCCC00, 0xEF00EFEF00EFEF00, 0x2600262600262600, 0xE500E5E500E5E500, 0x6100616100616100, 0x1A001A1A001A1A00, 0x3F003F3F003F3F00, 0x3B003B3B003B3B00, 0x8200828200828200, 0xB600B6B600B6B600, 0xDB00DBDB00DBDB00, 0xD400D4D400D4D400, 0x9800989800989800, 0xE800E8E800E8E800, 0x8B008B8B008B8B00, 0x0200020200020200, 0xEB00EBEB00EBEB00, 0x0A000A0A000A0A00, 0x2C002C2C002C2C00, 0x1D001D1D001D1D00, 0xB000B0B000B0B000, 0x6F006F6F006F6F00, 0x8D008D8D008D8D00, 0x8800888800888800, 0x0E000E0E000E0E00, 0x1900191900191900, 0x8700878700878700, 0x4E004E4E004E4E00, 0x0B000B0B000B0B00, 0xA900A9A900A9A900, 0x0C000C0C000C0C00, 0x7900797900797900, 0x1100111100111100, 0x7F007F7F007F7F00, 0x2200222200222200, 0xE700E7E700E7E700, 0x5900595900595900, 0xE100E1E100E1E100, 0xDA00DADA00DADA00, 0x3D003D3D003D3D00, 0xC800C8C800C8C800, 0x1200121200121200, 0x0400040400040400, 0x7400747400747400, 0x5400545400545400, 0x3000303000303000, 0x7E007E7E007E7E00, 0xB400B4B400B4B400, 0x2800282800282800, 0x5500555500555500, 0x6800686800686800, 0x5000505000505000, 0xBE00BEBE00BEBE00, 0xD000D0D000D0D000, 0xC400C4C400C4C400, 0x3100313100313100, 0xCB00CBCB00CBCB00, 0x2A002A2A002A2A00, 0xAD00ADAD00ADAD00, 0x0F000F0F000F0F00, 0xCA00CACA00CACA00, 0x7000707000707000, 0xFF00FFFF00FFFF00, 0x3200323200323200, 0x6900696900696900, 0x0800080800080800, 0x6200626200626200, 0x0000000000000000, 0x2400242400242400, 0xD100D1D100D1D100, 0xFB00FBFB00FBFB00, 0xBA00BABA00BABA00, 0xED00EDED00EDED00, 0x4500454500454500, 0x8100818100818100, 0x7300737300737300, 0x6D006D6D006D6D00, 0x8400848400848400, 0x9F009F9F009F9F00, 0xEE00EEEE00EEEE00, 0x4A004A4A004A4A00, 0xC300C3C300C3C300, 0x2E002E2E002E2E00, 0xC100C1C100C1C100, 0x0100010100010100, 0xE600E6E600E6E600, 0x2500252500252500, 0x4800484800484800, 0x9900999900999900, 0xB900B9B900B9B900, 0xB300B3B300B3B300, 0x7B007B7B007B7B00, 0xF900F9F900F9F900, 0xCE00CECE00CECE00, 0xBF00BFBF00BFBF00, 0xDF00DFDF00DFDF00, 0x7100717100717100, 0x2900292900292900, 0xCD00CDCD00CDCD00, 0x6C006C6C006C6C00, 0x1300131300131300, 0x6400646400646400, 0x9B009B9B009B9B00, 0x6300636300636300, 0x9D009D9D009D9D00, 0xC000C0C000C0C000, 0x4B004B4B004B4B00, 0xB700B7B700B7B700, 0xA500A5A500A5A500, 0x8900898900898900, 0x5F005F5F005F5F00, 0xB100B1B100B1B100, 0x1700171700171700, 0xF400F4F400F4F400, 0xBC00BCBC00BCBC00, 0xD300D3D300D3D300, 0x4600464600464600, 0xCF00CFCF00CFCF00, 0x3700373700373700, 0x5E005E5E005E5E00, 0x4700474700474700, 0x9400949400949400, 0xFA00FAFA00FAFA00, 0xFC00FCFC00FCFC00, 0x5B005B5B005B5B00, 0x9700979700979700, 0xFE00FEFE00FEFE00, 0x5A005A5A005A5A00, 0xAC00ACAC00ACAC00, 0x3C003C3C003C3C00, 0x4C004C4C004C4C00, 0x0300030300030300, 0x3500353500353500, 0xF300F3F300F3F300, 0x2300232300232300, 0xB800B8B800B8B800, 0x5D005D5D005D5D00, 0x6A006A6A006A6A00, 0x9200929200929200, 0xD500D5D500D5D500, 0x2100212100212100, 0x4400444400444400, 0x5100515100515100, 0xC600C6C600C6C600, 0x7D007D7D007D7D00, 0x3900393900393900, 0x8300838300838300, 0xDC00DCDC00DCDC00, 0xAA00AAAA00AAAA00, 0x7C007C7C007C7C00, 0x7700777700777700, 0x5600565600565600, 0x0500050500050500, 0x1B001B1B001B1B00, 0xA400A4A400A4A400, 0x1500151500151500, 0x3400343400343400, 0x1E001E1E001E1E00, 0x1C001C1C001C1C00, 0xF800F8F800F8F800, 0x5200525200525200, 0x2000202000202000, 0x1400141400141400, 0xE900E9E900E9E900, 0xBD00BDBD00BDBD00, 0xDD00DDDD00DDDD00, 0xE400E4E400E4E400, 0xA100A1A100A1A100, 0xE000E0E000E0E000, 0x8A008A8A008A8A00, 0xF100F1F100F1F100, 0xD600D6D600D6D600, 0x7A007A7A007A7A00, 0xBB00BBBB00BBBB00, 0xE300E3E300E3E300, 0x4000404000404000, 0x4F004F4F004F4F00 }; const uint64_t Camellia_SBOX4[256] = { 0x7070007000007070, 0x2C2C002C00002C2C, 0xB3B300B30000B3B3, 0xC0C000C00000C0C0, 0xE4E400E40000E4E4, 0x5757005700005757, 0xEAEA00EA0000EAEA, 0xAEAE00AE0000AEAE, 0x2323002300002323, 0x6B6B006B00006B6B, 0x4545004500004545, 0xA5A500A50000A5A5, 0xEDED00ED0000EDED, 0x4F4F004F00004F4F, 0x1D1D001D00001D1D, 0x9292009200009292, 0x8686008600008686, 0xAFAF00AF0000AFAF, 0x7C7C007C00007C7C, 0x1F1F001F00001F1F, 0x3E3E003E00003E3E, 0xDCDC00DC0000DCDC, 0x5E5E005E00005E5E, 0x0B0B000B00000B0B, 0xA6A600A60000A6A6, 0x3939003900003939, 0xD5D500D50000D5D5, 0x5D5D005D00005D5D, 0xD9D900D90000D9D9, 0x5A5A005A00005A5A, 0x5151005100005151, 0x6C6C006C00006C6C, 0x8B8B008B00008B8B, 0x9A9A009A00009A9A, 0xFBFB00FB0000FBFB, 0xB0B000B00000B0B0, 0x7474007400007474, 0x2B2B002B00002B2B, 0xF0F000F00000F0F0, 0x8484008400008484, 0xDFDF00DF0000DFDF, 0xCBCB00CB0000CBCB, 0x3434003400003434, 0x7676007600007676, 0x6D6D006D00006D6D, 0xA9A900A90000A9A9, 0xD1D100D10000D1D1, 0x0404000400000404, 0x1414001400001414, 0x3A3A003A00003A3A, 0xDEDE00DE0000DEDE, 0x1111001100001111, 0x3232003200003232, 0x9C9C009C00009C9C, 0x5353005300005353, 0xF2F200F20000F2F2, 0xFEFE00FE0000FEFE, 0xCFCF00CF0000CFCF, 0xC3C300C30000C3C3, 0x7A7A007A00007A7A, 0x2424002400002424, 0xE8E800E80000E8E8, 0x6060006000006060, 0x6969006900006969, 0xAAAA00AA0000AAAA, 0xA0A000A00000A0A0, 0xA1A100A10000A1A1, 0x6262006200006262, 0x5454005400005454, 0x1E1E001E00001E1E, 0xE0E000E00000E0E0, 0x6464006400006464, 0x1010001000001010, 0x0000000000000000, 0xA3A300A30000A3A3, 0x7575007500007575, 0x8A8A008A00008A8A, 0xE6E600E60000E6E6, 0x0909000900000909, 0xDDDD00DD0000DDDD, 0x8787008700008787, 0x8383008300008383, 0xCDCD00CD0000CDCD, 0x9090009000009090, 0x7373007300007373, 0xF6F600F60000F6F6, 0x9D9D009D00009D9D, 0xBFBF00BF0000BFBF, 0x5252005200005252, 0xD8D800D80000D8D8, 0xC8C800C80000C8C8, 0xC6C600C60000C6C6, 0x8181008100008181, 0x6F6F006F00006F6F, 0x1313001300001313, 0x6363006300006363, 0xE9E900E90000E9E9, 0xA7A700A70000A7A7, 0x9F9F009F00009F9F, 0xBCBC00BC0000BCBC, 0x2929002900002929, 0xF9F900F90000F9F9, 0x2F2F002F00002F2F, 0xB4B400B40000B4B4, 0x7878007800007878, 0x0606000600000606, 0xE7E700E70000E7E7, 0x7171007100007171, 0xD4D400D40000D4D4, 0xABAB00AB0000ABAB, 0x8888008800008888, 0x8D8D008D00008D8D, 0x7272007200007272, 0xB9B900B90000B9B9, 0xF8F800F80000F8F8, 0xACAC00AC0000ACAC, 0x3636003600003636, 0x2A2A002A00002A2A, 0x3C3C003C00003C3C, 0xF1F100F10000F1F1, 0x4040004000004040, 0xD3D300D30000D3D3, 0xBBBB00BB0000BBBB, 0x4343004300004343, 0x1515001500001515, 0xADAD00AD0000ADAD, 0x7777007700007777, 0x8080008000008080, 0x8282008200008282, 0xECEC00EC0000ECEC, 0x2727002700002727, 0xE5E500E50000E5E5, 0x8585008500008585, 0x3535003500003535, 0x0C0C000C00000C0C, 0x4141004100004141, 0xEFEF00EF0000EFEF, 0x9393009300009393, 0x1919001900001919, 0x2121002100002121, 0x0E0E000E00000E0E, 0x4E4E004E00004E4E, 0x6565006500006565, 0xBDBD00BD0000BDBD, 0xB8B800B80000B8B8, 0x8F8F008F00008F8F, 0xEBEB00EB0000EBEB, 0xCECE00CE0000CECE, 0x3030003000003030, 0x5F5F005F00005F5F, 0xC5C500C50000C5C5, 0x1A1A001A00001A1A, 0xE1E100E10000E1E1, 0xCACA00CA0000CACA, 0x4747004700004747, 0x3D3D003D00003D3D, 0x0101000100000101, 0xD6D600D60000D6D6, 0x5656005600005656, 0x4D4D004D00004D4D, 0x0D0D000D00000D0D, 0x6666006600006666, 0xCCCC00CC0000CCCC, 0x2D2D002D00002D2D, 0x1212001200001212, 0x2020002000002020, 0xB1B100B10000B1B1, 0x9999009900009999, 0x4C4C004C00004C4C, 0xC2C200C20000C2C2, 0x7E7E007E00007E7E, 0x0505000500000505, 0xB7B700B70000B7B7, 0x3131003100003131, 0x1717001700001717, 0xD7D700D70000D7D7, 0x5858005800005858, 0x6161006100006161, 0x1B1B001B00001B1B, 0x1C1C001C00001C1C, 0x0F0F000F00000F0F, 0x1616001600001616, 0x1818001800001818, 0x2222002200002222, 0x4444004400004444, 0xB2B200B20000B2B2, 0xB5B500B50000B5B5, 0x9191009100009191, 0x0808000800000808, 0xA8A800A80000A8A8, 0xFCFC00FC0000FCFC, 0x5050005000005050, 0xD0D000D00000D0D0, 0x7D7D007D00007D7D, 0x8989008900008989, 0x9797009700009797, 0x5B5B005B00005B5B, 0x9595009500009595, 0xFFFF00FF0000FFFF, 0xD2D200D20000D2D2, 0xC4C400C40000C4C4, 0x4848004800004848, 0xF7F700F70000F7F7, 0xDBDB00DB0000DBDB, 0x0303000300000303, 0xDADA00DA0000DADA, 0x3F3F003F00003F3F, 0x9494009400009494, 0x5C5C005C00005C5C, 0x0202000200000202, 0x4A4A004A00004A4A, 0x3333003300003333, 0x6767006700006767, 0xF3F300F30000F3F3, 0x7F7F007F00007F7F, 0xE2E200E20000E2E2, 0x9B9B009B00009B9B, 0x2626002600002626, 0x3737003700003737, 0x3B3B003B00003B3B, 0x9696009600009696, 0x4B4B004B00004B4B, 0xBEBE00BE0000BEBE, 0x2E2E002E00002E2E, 0x7979007900007979, 0x8C8C008C00008C8C, 0x6E6E006E00006E6E, 0x8E8E008E00008E8E, 0xF5F500F50000F5F5, 0xB6B600B60000B6B6, 0xFDFD00FD0000FDFD, 0x5959005900005959, 0x9898009800009898, 0x6A6A006A00006A6A, 0x4646004600004646, 0xBABA00BA0000BABA, 0x2525002500002525, 0x4242004200004242, 0xA2A200A20000A2A2, 0xFAFA00FA0000FAFA, 0x0707000700000707, 0x5555005500005555, 0xEEEE00EE0000EEEE, 0x0A0A000A00000A0A, 0x4949004900004949, 0x6868006800006868, 0x3838003800003838, 0xA4A400A40000A4A4, 0x2828002800002828, 0x7B7B007B00007B7B, 0xC9C900C90000C9C9, 0xC1C100C10000C1C1, 0xE3E300E30000E3E3, 0xF4F400F40000F4F4, 0xC7C700C70000C7C7, 0x9E9E009E00009E9E }; const uint64_t Camellia_SBOX5[256] = { 0x00E0E0E000E0E0E0, 0x0005050500050505, 0x0058585800585858, 0x00D9D9D900D9D9D9, 0x0067676700676767, 0x004E4E4E004E4E4E, 0x0081818100818181, 0x00CBCBCB00CBCBCB, 0x00C9C9C900C9C9C9, 0x000B0B0B000B0B0B, 0x00AEAEAE00AEAEAE, 0x006A6A6A006A6A6A, 0x00D5D5D500D5D5D5, 0x0018181800181818, 0x005D5D5D005D5D5D, 0x0082828200828282, 0x0046464600464646, 0x00DFDFDF00DFDFDF, 0x00D6D6D600D6D6D6, 0x0027272700272727, 0x008A8A8A008A8A8A, 0x0032323200323232, 0x004B4B4B004B4B4B, 0x0042424200424242, 0x00DBDBDB00DBDBDB, 0x001C1C1C001C1C1C, 0x009E9E9E009E9E9E, 0x009C9C9C009C9C9C, 0x003A3A3A003A3A3A, 0x00CACACA00CACACA, 0x0025252500252525, 0x007B7B7B007B7B7B, 0x000D0D0D000D0D0D, 0x0071717100717171, 0x005F5F5F005F5F5F, 0x001F1F1F001F1F1F, 0x00F8F8F800F8F8F8, 0x00D7D7D700D7D7D7, 0x003E3E3E003E3E3E, 0x009D9D9D009D9D9D, 0x007C7C7C007C7C7C, 0x0060606000606060, 0x00B9B9B900B9B9B9, 0x00BEBEBE00BEBEBE, 0x00BCBCBC00BCBCBC, 0x008B8B8B008B8B8B, 0x0016161600161616, 0x0034343400343434, 0x004D4D4D004D4D4D, 0x00C3C3C300C3C3C3, 0x0072727200727272, 0x0095959500959595, 0x00ABABAB00ABABAB, 0x008E8E8E008E8E8E, 0x00BABABA00BABABA, 0x007A7A7A007A7A7A, 0x00B3B3B300B3B3B3, 0x0002020200020202, 0x00B4B4B400B4B4B4, 0x00ADADAD00ADADAD, 0x00A2A2A200A2A2A2, 0x00ACACAC00ACACAC, 0x00D8D8D800D8D8D8, 0x009A9A9A009A9A9A, 0x0017171700171717, 0x001A1A1A001A1A1A, 0x0035353500353535, 0x00CCCCCC00CCCCCC, 0x00F7F7F700F7F7F7, 0x0099999900999999, 0x0061616100616161, 0x005A5A5A005A5A5A, 0x00E8E8E800E8E8E8, 0x0024242400242424, 0x0056565600565656, 0x0040404000404040, 0x00E1E1E100E1E1E1, 0x0063636300636363, 0x0009090900090909, 0x0033333300333333, 0x00BFBFBF00BFBFBF, 0x0098989800989898, 0x0097979700979797, 0x0085858500858585, 0x0068686800686868, 0x00FCFCFC00FCFCFC, 0x00ECECEC00ECECEC, 0x000A0A0A000A0A0A, 0x00DADADA00DADADA, 0x006F6F6F006F6F6F, 0x0053535300535353, 0x0062626200626262, 0x00A3A3A300A3A3A3, 0x002E2E2E002E2E2E, 0x0008080800080808, 0x00AFAFAF00AFAFAF, 0x0028282800282828, 0x00B0B0B000B0B0B0, 0x0074747400747474, 0x00C2C2C200C2C2C2, 0x00BDBDBD00BDBDBD, 0x0036363600363636, 0x0022222200222222, 0x0038383800383838, 0x0064646400646464, 0x001E1E1E001E1E1E, 0x0039393900393939, 0x002C2C2C002C2C2C, 0x00A6A6A600A6A6A6, 0x0030303000303030, 0x00E5E5E500E5E5E5, 0x0044444400444444, 0x00FDFDFD00FDFDFD, 0x0088888800888888, 0x009F9F9F009F9F9F, 0x0065656500656565, 0x0087878700878787, 0x006B6B6B006B6B6B, 0x00F4F4F400F4F4F4, 0x0023232300232323, 0x0048484800484848, 0x0010101000101010, 0x00D1D1D100D1D1D1, 0x0051515100515151, 0x00C0C0C000C0C0C0, 0x00F9F9F900F9F9F9, 0x00D2D2D200D2D2D2, 0x00A0A0A000A0A0A0, 0x0055555500555555, 0x00A1A1A100A1A1A1, 0x0041414100414141, 0x00FAFAFA00FAFAFA, 0x0043434300434343, 0x0013131300131313, 0x00C4C4C400C4C4C4, 0x002F2F2F002F2F2F, 0x00A8A8A800A8A8A8, 0x00B6B6B600B6B6B6, 0x003C3C3C003C3C3C, 0x002B2B2B002B2B2B, 0x00C1C1C100C1C1C1, 0x00FFFFFF00FFFFFF, 0x00C8C8C800C8C8C8, 0x00A5A5A500A5A5A5, 0x0020202000202020, 0x0089898900898989, 0x0000000000000000, 0x0090909000909090, 0x0047474700474747, 0x00EFEFEF00EFEFEF, 0x00EAEAEA00EAEAEA, 0x00B7B7B700B7B7B7, 0x0015151500151515, 0x0006060600060606, 0x00CDCDCD00CDCDCD, 0x00B5B5B500B5B5B5, 0x0012121200121212, 0x007E7E7E007E7E7E, 0x00BBBBBB00BBBBBB, 0x0029292900292929, 0x000F0F0F000F0F0F, 0x00B8B8B800B8B8B8, 0x0007070700070707, 0x0004040400040404, 0x009B9B9B009B9B9B, 0x0094949400949494, 0x0021212100212121, 0x0066666600666666, 0x00E6E6E600E6E6E6, 0x00CECECE00CECECE, 0x00EDEDED00EDEDED, 0x00E7E7E700E7E7E7, 0x003B3B3B003B3B3B, 0x00FEFEFE00FEFEFE, 0x007F7F7F007F7F7F, 0x00C5C5C500C5C5C5, 0x00A4A4A400A4A4A4, 0x0037373700373737, 0x00B1B1B100B1B1B1, 0x004C4C4C004C4C4C, 0x0091919100919191, 0x006E6E6E006E6E6E, 0x008D8D8D008D8D8D, 0x0076767600767676, 0x0003030300030303, 0x002D2D2D002D2D2D, 0x00DEDEDE00DEDEDE, 0x0096969600969696, 0x0026262600262626, 0x007D7D7D007D7D7D, 0x00C6C6C600C6C6C6, 0x005C5C5C005C5C5C, 0x00D3D3D300D3D3D3, 0x00F2F2F200F2F2F2, 0x004F4F4F004F4F4F, 0x0019191900191919, 0x003F3F3F003F3F3F, 0x00DCDCDC00DCDCDC, 0x0079797900797979, 0x001D1D1D001D1D1D, 0x0052525200525252, 0x00EBEBEB00EBEBEB, 0x00F3F3F300F3F3F3, 0x006D6D6D006D6D6D, 0x005E5E5E005E5E5E, 0x00FBFBFB00FBFBFB, 0x0069696900696969, 0x00B2B2B200B2B2B2, 0x00F0F0F000F0F0F0, 0x0031313100313131, 0x000C0C0C000C0C0C, 0x00D4D4D400D4D4D4, 0x00CFCFCF00CFCFCF, 0x008C8C8C008C8C8C, 0x00E2E2E200E2E2E2, 0x0075757500757575, 0x00A9A9A900A9A9A9, 0x004A4A4A004A4A4A, 0x0057575700575757, 0x0084848400848484, 0x0011111100111111, 0x0045454500454545, 0x001B1B1B001B1B1B, 0x00F5F5F500F5F5F5, 0x00E4E4E400E4E4E4, 0x000E0E0E000E0E0E, 0x0073737300737373, 0x00AAAAAA00AAAAAA, 0x00F1F1F100F1F1F1, 0x00DDDDDD00DDDDDD, 0x0059595900595959, 0x0014141400141414, 0x006C6C6C006C6C6C, 0x0092929200929292, 0x0054545400545454, 0x00D0D0D000D0D0D0, 0x0078787800787878, 0x0070707000707070, 0x00E3E3E300E3E3E3, 0x0049494900494949, 0x0080808000808080, 0x0050505000505050, 0x00A7A7A700A7A7A7, 0x00F6F6F600F6F6F6, 0x0077777700777777, 0x0093939300939393, 0x0086868600868686, 0x0083838300838383, 0x002A2A2A002A2A2A, 0x00C7C7C700C7C7C7, 0x005B5B5B005B5B5B, 0x00E9E9E900E9E9E9, 0x00EEEEEE00EEEEEE, 0x008F8F8F008F8F8F, 0x0001010100010101, 0x003D3D3D003D3D3D }; const uint64_t Camellia_SBOX6[256] = { 0x3800383838003838, 0x4100414141004141, 0x1600161616001616, 0x7600767676007676, 0xD900D9D9D900D9D9, 0x9300939393009393, 0x6000606060006060, 0xF200F2F2F200F2F2, 0x7200727272007272, 0xC200C2C2C200C2C2, 0xAB00ABABAB00ABAB, 0x9A009A9A9A009A9A, 0x7500757575007575, 0x0600060606000606, 0x5700575757005757, 0xA000A0A0A000A0A0, 0x9100919191009191, 0xF700F7F7F700F7F7, 0xB500B5B5B500B5B5, 0xC900C9C9C900C9C9, 0xA200A2A2A200A2A2, 0x8C008C8C8C008C8C, 0xD200D2D2D200D2D2, 0x9000909090009090, 0xF600F6F6F600F6F6, 0x0700070707000707, 0xA700A7A7A700A7A7, 0x2700272727002727, 0x8E008E8E8E008E8E, 0xB200B2B2B200B2B2, 0x4900494949004949, 0xDE00DEDEDE00DEDE, 0x4300434343004343, 0x5C005C5C5C005C5C, 0xD700D7D7D700D7D7, 0xC700C7C7C700C7C7, 0x3E003E3E3E003E3E, 0xF500F5F5F500F5F5, 0x8F008F8F8F008F8F, 0x6700676767006767, 0x1F001F1F1F001F1F, 0x1800181818001818, 0x6E006E6E6E006E6E, 0xAF00AFAFAF00AFAF, 0x2F002F2F2F002F2F, 0xE200E2E2E200E2E2, 0x8500858585008585, 0x0D000D0D0D000D0D, 0x5300535353005353, 0xF000F0F0F000F0F0, 0x9C009C9C9C009C9C, 0x6500656565006565, 0xEA00EAEAEA00EAEA, 0xA300A3A3A300A3A3, 0xAE00AEAEAE00AEAE, 0x9E009E9E9E009E9E, 0xEC00ECECEC00ECEC, 0x8000808080008080, 0x2D002D2D2D002D2D, 0x6B006B6B6B006B6B, 0xA800A8A8A800A8A8, 0x2B002B2B2B002B2B, 0x3600363636003636, 0xA600A6A6A600A6A6, 0xC500C5C5C500C5C5, 0x8600868686008686, 0x4D004D4D4D004D4D, 0x3300333333003333, 0xFD00FDFDFD00FDFD, 0x6600666666006666, 0x5800585858005858, 0x9600969696009696, 0x3A003A3A3A003A3A, 0x0900090909000909, 0x9500959595009595, 0x1000101010001010, 0x7800787878007878, 0xD800D8D8D800D8D8, 0x4200424242004242, 0xCC00CCCCCC00CCCC, 0xEF00EFEFEF00EFEF, 0x2600262626002626, 0xE500E5E5E500E5E5, 0x6100616161006161, 0x1A001A1A1A001A1A, 0x3F003F3F3F003F3F, 0x3B003B3B3B003B3B, 0x8200828282008282, 0xB600B6B6B600B6B6, 0xDB00DBDBDB00DBDB, 0xD400D4D4D400D4D4, 0x9800989898009898, 0xE800E8E8E800E8E8, 0x8B008B8B8B008B8B, 0x0200020202000202, 0xEB00EBEBEB00EBEB, 0x0A000A0A0A000A0A, 0x2C002C2C2C002C2C, 0x1D001D1D1D001D1D, 0xB000B0B0B000B0B0, 0x6F006F6F6F006F6F, 0x8D008D8D8D008D8D, 0x8800888888008888, 0x0E000E0E0E000E0E, 0x1900191919001919, 0x8700878787008787, 0x4E004E4E4E004E4E, 0x0B000B0B0B000B0B, 0xA900A9A9A900A9A9, 0x0C000C0C0C000C0C, 0x7900797979007979, 0x1100111111001111, 0x7F007F7F7F007F7F, 0x2200222222002222, 0xE700E7E7E700E7E7, 0x5900595959005959, 0xE100E1E1E100E1E1, 0xDA00DADADA00DADA, 0x3D003D3D3D003D3D, 0xC800C8C8C800C8C8, 0x1200121212001212, 0x0400040404000404, 0x7400747474007474, 0x5400545454005454, 0x3000303030003030, 0x7E007E7E7E007E7E, 0xB400B4B4B400B4B4, 0x2800282828002828, 0x5500555555005555, 0x6800686868006868, 0x5000505050005050, 0xBE00BEBEBE00BEBE, 0xD000D0D0D000D0D0, 0xC400C4C4C400C4C4, 0x3100313131003131, 0xCB00CBCBCB00CBCB, 0x2A002A2A2A002A2A, 0xAD00ADADAD00ADAD, 0x0F000F0F0F000F0F, 0xCA00CACACA00CACA, 0x7000707070007070, 0xFF00FFFFFF00FFFF, 0x3200323232003232, 0x6900696969006969, 0x0800080808000808, 0x6200626262006262, 0x0000000000000000, 0x2400242424002424, 0xD100D1D1D100D1D1, 0xFB00FBFBFB00FBFB, 0xBA00BABABA00BABA, 0xED00EDEDED00EDED, 0x4500454545004545, 0x8100818181008181, 0x7300737373007373, 0x6D006D6D6D006D6D, 0x8400848484008484, 0x9F009F9F9F009F9F, 0xEE00EEEEEE00EEEE, 0x4A004A4A4A004A4A, 0xC300C3C3C300C3C3, 0x2E002E2E2E002E2E, 0xC100C1C1C100C1C1, 0x0100010101000101, 0xE600E6E6E600E6E6, 0x2500252525002525, 0x4800484848004848, 0x9900999999009999, 0xB900B9B9B900B9B9, 0xB300B3B3B300B3B3, 0x7B007B7B7B007B7B, 0xF900F9F9F900F9F9, 0xCE00CECECE00CECE, 0xBF00BFBFBF00BFBF, 0xDF00DFDFDF00DFDF, 0x7100717171007171, 0x2900292929002929, 0xCD00CDCDCD00CDCD, 0x6C006C6C6C006C6C, 0x1300131313001313, 0x6400646464006464, 0x9B009B9B9B009B9B, 0x6300636363006363, 0x9D009D9D9D009D9D, 0xC000C0C0C000C0C0, 0x4B004B4B4B004B4B, 0xB700B7B7B700B7B7, 0xA500A5A5A500A5A5, 0x8900898989008989, 0x5F005F5F5F005F5F, 0xB100B1B1B100B1B1, 0x1700171717001717, 0xF400F4F4F400F4F4, 0xBC00BCBCBC00BCBC, 0xD300D3D3D300D3D3, 0x4600464646004646, 0xCF00CFCFCF00CFCF, 0x3700373737003737, 0x5E005E5E5E005E5E, 0x4700474747004747, 0x9400949494009494, 0xFA00FAFAFA00FAFA, 0xFC00FCFCFC00FCFC, 0x5B005B5B5B005B5B, 0x9700979797009797, 0xFE00FEFEFE00FEFE, 0x5A005A5A5A005A5A, 0xAC00ACACAC00ACAC, 0x3C003C3C3C003C3C, 0x4C004C4C4C004C4C, 0x0300030303000303, 0x3500353535003535, 0xF300F3F3F300F3F3, 0x2300232323002323, 0xB800B8B8B800B8B8, 0x5D005D5D5D005D5D, 0x6A006A6A6A006A6A, 0x9200929292009292, 0xD500D5D5D500D5D5, 0x2100212121002121, 0x4400444444004444, 0x5100515151005151, 0xC600C6C6C600C6C6, 0x7D007D7D7D007D7D, 0x3900393939003939, 0x8300838383008383, 0xDC00DCDCDC00DCDC, 0xAA00AAAAAA00AAAA, 0x7C007C7C7C007C7C, 0x7700777777007777, 0x5600565656005656, 0x0500050505000505, 0x1B001B1B1B001B1B, 0xA400A4A4A400A4A4, 0x1500151515001515, 0x3400343434003434, 0x1E001E1E1E001E1E, 0x1C001C1C1C001C1C, 0xF800F8F8F800F8F8, 0x5200525252005252, 0x2000202020002020, 0x1400141414001414, 0xE900E9E9E900E9E9, 0xBD00BDBDBD00BDBD, 0xDD00DDDDDD00DDDD, 0xE400E4E4E400E4E4, 0xA100A1A1A100A1A1, 0xE000E0E0E000E0E0, 0x8A008A8A8A008A8A, 0xF100F1F1F100F1F1, 0xD600D6D6D600D6D6, 0x7A007A7A7A007A7A, 0xBB00BBBBBB00BBBB, 0xE300E3E3E300E3E3, 0x4000404040004040, 0x4F004F4F4F004F4F }; const uint64_t Camellia_SBOX7[256] = { 0x7070007070700070, 0x2C2C002C2C2C002C, 0xB3B300B3B3B300B3, 0xC0C000C0C0C000C0, 0xE4E400E4E4E400E4, 0x5757005757570057, 0xEAEA00EAEAEA00EA, 0xAEAE00AEAEAE00AE, 0x2323002323230023, 0x6B6B006B6B6B006B, 0x4545004545450045, 0xA5A500A5A5A500A5, 0xEDED00EDEDED00ED, 0x4F4F004F4F4F004F, 0x1D1D001D1D1D001D, 0x9292009292920092, 0x8686008686860086, 0xAFAF00AFAFAF00AF, 0x7C7C007C7C7C007C, 0x1F1F001F1F1F001F, 0x3E3E003E3E3E003E, 0xDCDC00DCDCDC00DC, 0x5E5E005E5E5E005E, 0x0B0B000B0B0B000B, 0xA6A600A6A6A600A6, 0x3939003939390039, 0xD5D500D5D5D500D5, 0x5D5D005D5D5D005D, 0xD9D900D9D9D900D9, 0x5A5A005A5A5A005A, 0x5151005151510051, 0x6C6C006C6C6C006C, 0x8B8B008B8B8B008B, 0x9A9A009A9A9A009A, 0xFBFB00FBFBFB00FB, 0xB0B000B0B0B000B0, 0x7474007474740074, 0x2B2B002B2B2B002B, 0xF0F000F0F0F000F0, 0x8484008484840084, 0xDFDF00DFDFDF00DF, 0xCBCB00CBCBCB00CB, 0x3434003434340034, 0x7676007676760076, 0x6D6D006D6D6D006D, 0xA9A900A9A9A900A9, 0xD1D100D1D1D100D1, 0x0404000404040004, 0x1414001414140014, 0x3A3A003A3A3A003A, 0xDEDE00DEDEDE00DE, 0x1111001111110011, 0x3232003232320032, 0x9C9C009C9C9C009C, 0x5353005353530053, 0xF2F200F2F2F200F2, 0xFEFE00FEFEFE00FE, 0xCFCF00CFCFCF00CF, 0xC3C300C3C3C300C3, 0x7A7A007A7A7A007A, 0x2424002424240024, 0xE8E800E8E8E800E8, 0x6060006060600060, 0x6969006969690069, 0xAAAA00AAAAAA00AA, 0xA0A000A0A0A000A0, 0xA1A100A1A1A100A1, 0x6262006262620062, 0x5454005454540054, 0x1E1E001E1E1E001E, 0xE0E000E0E0E000E0, 0x6464006464640064, 0x1010001010100010, 0x0000000000000000, 0xA3A300A3A3A300A3, 0x7575007575750075, 0x8A8A008A8A8A008A, 0xE6E600E6E6E600E6, 0x0909000909090009, 0xDDDD00DDDDDD00DD, 0x8787008787870087, 0x8383008383830083, 0xCDCD00CDCDCD00CD, 0x9090009090900090, 0x7373007373730073, 0xF6F600F6F6F600F6, 0x9D9D009D9D9D009D, 0xBFBF00BFBFBF00BF, 0x5252005252520052, 0xD8D800D8D8D800D8, 0xC8C800C8C8C800C8, 0xC6C600C6C6C600C6, 0x8181008181810081, 0x6F6F006F6F6F006F, 0x1313001313130013, 0x6363006363630063, 0xE9E900E9E9E900E9, 0xA7A700A7A7A700A7, 0x9F9F009F9F9F009F, 0xBCBC00BCBCBC00BC, 0x2929002929290029, 0xF9F900F9F9F900F9, 0x2F2F002F2F2F002F, 0xB4B400B4B4B400B4, 0x7878007878780078, 0x0606000606060006, 0xE7E700E7E7E700E7, 0x7171007171710071, 0xD4D400D4D4D400D4, 0xABAB00ABABAB00AB, 0x8888008888880088, 0x8D8D008D8D8D008D, 0x7272007272720072, 0xB9B900B9B9B900B9, 0xF8F800F8F8F800F8, 0xACAC00ACACAC00AC, 0x3636003636360036, 0x2A2A002A2A2A002A, 0x3C3C003C3C3C003C, 0xF1F100F1F1F100F1, 0x4040004040400040, 0xD3D300D3D3D300D3, 0xBBBB00BBBBBB00BB, 0x4343004343430043, 0x1515001515150015, 0xADAD00ADADAD00AD, 0x7777007777770077, 0x8080008080800080, 0x8282008282820082, 0xECEC00ECECEC00EC, 0x2727002727270027, 0xE5E500E5E5E500E5, 0x8585008585850085, 0x3535003535350035, 0x0C0C000C0C0C000C, 0x4141004141410041, 0xEFEF00EFEFEF00EF, 0x9393009393930093, 0x1919001919190019, 0x2121002121210021, 0x0E0E000E0E0E000E, 0x4E4E004E4E4E004E, 0x6565006565650065, 0xBDBD00BDBDBD00BD, 0xB8B800B8B8B800B8, 0x8F8F008F8F8F008F, 0xEBEB00EBEBEB00EB, 0xCECE00CECECE00CE, 0x3030003030300030, 0x5F5F005F5F5F005F, 0xC5C500C5C5C500C5, 0x1A1A001A1A1A001A, 0xE1E100E1E1E100E1, 0xCACA00CACACA00CA, 0x4747004747470047, 0x3D3D003D3D3D003D, 0x0101000101010001, 0xD6D600D6D6D600D6, 0x5656005656560056, 0x4D4D004D4D4D004D, 0x0D0D000D0D0D000D, 0x6666006666660066, 0xCCCC00CCCCCC00CC, 0x2D2D002D2D2D002D, 0x1212001212120012, 0x2020002020200020, 0xB1B100B1B1B100B1, 0x9999009999990099, 0x4C4C004C4C4C004C, 0xC2C200C2C2C200C2, 0x7E7E007E7E7E007E, 0x0505000505050005, 0xB7B700B7B7B700B7, 0x3131003131310031, 0x1717001717170017, 0xD7D700D7D7D700D7, 0x5858005858580058, 0x6161006161610061, 0x1B1B001B1B1B001B, 0x1C1C001C1C1C001C, 0x0F0F000F0F0F000F, 0x1616001616160016, 0x1818001818180018, 0x2222002222220022, 0x4444004444440044, 0xB2B200B2B2B200B2, 0xB5B500B5B5B500B5, 0x9191009191910091, 0x0808000808080008, 0xA8A800A8A8A800A8, 0xFCFC00FCFCFC00FC, 0x5050005050500050, 0xD0D000D0D0D000D0, 0x7D7D007D7D7D007D, 0x8989008989890089, 0x9797009797970097, 0x5B5B005B5B5B005B, 0x9595009595950095, 0xFFFF00FFFFFF00FF, 0xD2D200D2D2D200D2, 0xC4C400C4C4C400C4, 0x4848004848480048, 0xF7F700F7F7F700F7, 0xDBDB00DBDBDB00DB, 0x0303000303030003, 0xDADA00DADADA00DA, 0x3F3F003F3F3F003F, 0x9494009494940094, 0x5C5C005C5C5C005C, 0x0202000202020002, 0x4A4A004A4A4A004A, 0x3333003333330033, 0x6767006767670067, 0xF3F300F3F3F300F3, 0x7F7F007F7F7F007F, 0xE2E200E2E2E200E2, 0x9B9B009B9B9B009B, 0x2626002626260026, 0x3737003737370037, 0x3B3B003B3B3B003B, 0x9696009696960096, 0x4B4B004B4B4B004B, 0xBEBE00BEBEBE00BE, 0x2E2E002E2E2E002E, 0x7979007979790079, 0x8C8C008C8C8C008C, 0x6E6E006E6E6E006E, 0x8E8E008E8E8E008E, 0xF5F500F5F5F500F5, 0xB6B600B6B6B600B6, 0xFDFD00FDFDFD00FD, 0x5959005959590059, 0x9898009898980098, 0x6A6A006A6A6A006A, 0x4646004646460046, 0xBABA00BABABA00BA, 0x2525002525250025, 0x4242004242420042, 0xA2A200A2A2A200A2, 0xFAFA00FAFAFA00FA, 0x0707000707070007, 0x5555005555550055, 0xEEEE00EEEEEE00EE, 0x0A0A000A0A0A000A, 0x4949004949490049, 0x6868006868680068, 0x3838003838380038, 0xA4A400A4A4A400A4, 0x2828002828280028, 0x7B7B007B7B7B007B, 0xC9C900C9C9C900C9, 0xC1C100C1C1C100C1, 0xE3E300E3E3E300E3, 0xF4F400F4F4F400F4, 0xC7C700C7C7C700C7, 0x9E9E009E9E9E009E }; const uint64_t Camellia_SBOX8[256] = { 0x7070700070707000, 0x8282820082828200, 0x2C2C2C002C2C2C00, 0xECECEC00ECECEC00, 0xB3B3B300B3B3B300, 0x2727270027272700, 0xC0C0C000C0C0C000, 0xE5E5E500E5E5E500, 0xE4E4E400E4E4E400, 0x8585850085858500, 0x5757570057575700, 0x3535350035353500, 0xEAEAEA00EAEAEA00, 0x0C0C0C000C0C0C00, 0xAEAEAE00AEAEAE00, 0x4141410041414100, 0x2323230023232300, 0xEFEFEF00EFEFEF00, 0x6B6B6B006B6B6B00, 0x9393930093939300, 0x4545450045454500, 0x1919190019191900, 0xA5A5A500A5A5A500, 0x2121210021212100, 0xEDEDED00EDEDED00, 0x0E0E0E000E0E0E00, 0x4F4F4F004F4F4F00, 0x4E4E4E004E4E4E00, 0x1D1D1D001D1D1D00, 0x6565650065656500, 0x9292920092929200, 0xBDBDBD00BDBDBD00, 0x8686860086868600, 0xB8B8B800B8B8B800, 0xAFAFAF00AFAFAF00, 0x8F8F8F008F8F8F00, 0x7C7C7C007C7C7C00, 0xEBEBEB00EBEBEB00, 0x1F1F1F001F1F1F00, 0xCECECE00CECECE00, 0x3E3E3E003E3E3E00, 0x3030300030303000, 0xDCDCDC00DCDCDC00, 0x5F5F5F005F5F5F00, 0x5E5E5E005E5E5E00, 0xC5C5C500C5C5C500, 0x0B0B0B000B0B0B00, 0x1A1A1A001A1A1A00, 0xA6A6A600A6A6A600, 0xE1E1E100E1E1E100, 0x3939390039393900, 0xCACACA00CACACA00, 0xD5D5D500D5D5D500, 0x4747470047474700, 0x5D5D5D005D5D5D00, 0x3D3D3D003D3D3D00, 0xD9D9D900D9D9D900, 0x0101010001010100, 0x5A5A5A005A5A5A00, 0xD6D6D600D6D6D600, 0x5151510051515100, 0x5656560056565600, 0x6C6C6C006C6C6C00, 0x4D4D4D004D4D4D00, 0x8B8B8B008B8B8B00, 0x0D0D0D000D0D0D00, 0x9A9A9A009A9A9A00, 0x6666660066666600, 0xFBFBFB00FBFBFB00, 0xCCCCCC00CCCCCC00, 0xB0B0B000B0B0B000, 0x2D2D2D002D2D2D00, 0x7474740074747400, 0x1212120012121200, 0x2B2B2B002B2B2B00, 0x2020200020202000, 0xF0F0F000F0F0F000, 0xB1B1B100B1B1B100, 0x8484840084848400, 0x9999990099999900, 0xDFDFDF00DFDFDF00, 0x4C4C4C004C4C4C00, 0xCBCBCB00CBCBCB00, 0xC2C2C200C2C2C200, 0x3434340034343400, 0x7E7E7E007E7E7E00, 0x7676760076767600, 0x0505050005050500, 0x6D6D6D006D6D6D00, 0xB7B7B700B7B7B700, 0xA9A9A900A9A9A900, 0x3131310031313100, 0xD1D1D100D1D1D100, 0x1717170017171700, 0x0404040004040400, 0xD7D7D700D7D7D700, 0x1414140014141400, 0x5858580058585800, 0x3A3A3A003A3A3A00, 0x6161610061616100, 0xDEDEDE00DEDEDE00, 0x1B1B1B001B1B1B00, 0x1111110011111100, 0x1C1C1C001C1C1C00, 0x3232320032323200, 0x0F0F0F000F0F0F00, 0x9C9C9C009C9C9C00, 0x1616160016161600, 0x5353530053535300, 0x1818180018181800, 0xF2F2F200F2F2F200, 0x2222220022222200, 0xFEFEFE00FEFEFE00, 0x4444440044444400, 0xCFCFCF00CFCFCF00, 0xB2B2B200B2B2B200, 0xC3C3C300C3C3C300, 0xB5B5B500B5B5B500, 0x7A7A7A007A7A7A00, 0x9191910091919100, 0x2424240024242400, 0x0808080008080800, 0xE8E8E800E8E8E800, 0xA8A8A800A8A8A800, 0x6060600060606000, 0xFCFCFC00FCFCFC00, 0x6969690069696900, 0x5050500050505000, 0xAAAAAA00AAAAAA00, 0xD0D0D000D0D0D000, 0xA0A0A000A0A0A000, 0x7D7D7D007D7D7D00, 0xA1A1A100A1A1A100, 0x8989890089898900, 0x6262620062626200, 0x9797970097979700, 0x5454540054545400, 0x5B5B5B005B5B5B00, 0x1E1E1E001E1E1E00, 0x9595950095959500, 0xE0E0E000E0E0E000, 0xFFFFFF00FFFFFF00, 0x6464640064646400, 0xD2D2D200D2D2D200, 0x1010100010101000, 0xC4C4C400C4C4C400, 0x0000000000000000, 0x4848480048484800, 0xA3A3A300A3A3A300, 0xF7F7F700F7F7F700, 0x7575750075757500, 0xDBDBDB00DBDBDB00, 0x8A8A8A008A8A8A00, 0x0303030003030300, 0xE6E6E600E6E6E600, 0xDADADA00DADADA00, 0x0909090009090900, 0x3F3F3F003F3F3F00, 0xDDDDDD00DDDDDD00, 0x9494940094949400, 0x8787870087878700, 0x5C5C5C005C5C5C00, 0x8383830083838300, 0x0202020002020200, 0xCDCDCD00CDCDCD00, 0x4A4A4A004A4A4A00, 0x9090900090909000, 0x3333330033333300, 0x7373730073737300, 0x6767670067676700, 0xF6F6F600F6F6F600, 0xF3F3F300F3F3F300, 0x9D9D9D009D9D9D00, 0x7F7F7F007F7F7F00, 0xBFBFBF00BFBFBF00, 0xE2E2E200E2E2E200, 0x5252520052525200, 0x9B9B9B009B9B9B00, 0xD8D8D800D8D8D800, 0x2626260026262600, 0xC8C8C800C8C8C800, 0x3737370037373700, 0xC6C6C600C6C6C600, 0x3B3B3B003B3B3B00, 0x8181810081818100, 0x9696960096969600, 0x6F6F6F006F6F6F00, 0x4B4B4B004B4B4B00, 0x1313130013131300, 0xBEBEBE00BEBEBE00, 0x6363630063636300, 0x2E2E2E002E2E2E00, 0xE9E9E900E9E9E900, 0x7979790079797900, 0xA7A7A700A7A7A700, 0x8C8C8C008C8C8C00, 0x9F9F9F009F9F9F00, 0x6E6E6E006E6E6E00, 0xBCBCBC00BCBCBC00, 0x8E8E8E008E8E8E00, 0x2929290029292900, 0xF5F5F500F5F5F500, 0xF9F9F900F9F9F900, 0xB6B6B600B6B6B600, 0x2F2F2F002F2F2F00, 0xFDFDFD00FDFDFD00, 0xB4B4B400B4B4B400, 0x5959590059595900, 0x7878780078787800, 0x9898980098989800, 0x0606060006060600, 0x6A6A6A006A6A6A00, 0xE7E7E700E7E7E700, 0x4646460046464600, 0x7171710071717100, 0xBABABA00BABABA00, 0xD4D4D400D4D4D400, 0x2525250025252500, 0xABABAB00ABABAB00, 0x4242420042424200, 0x8888880088888800, 0xA2A2A200A2A2A200, 0x8D8D8D008D8D8D00, 0xFAFAFA00FAFAFA00, 0x7272720072727200, 0x0707070007070700, 0xB9B9B900B9B9B900, 0x5555550055555500, 0xF8F8F800F8F8F800, 0xEEEEEE00EEEEEE00, 0xACACAC00ACACAC00, 0x0A0A0A000A0A0A00, 0x3636360036363600, 0x4949490049494900, 0x2A2A2A002A2A2A00, 0x6868680068686800, 0x3C3C3C003C3C3C00, 0x3838380038383800, 0xF1F1F100F1F1F100, 0xA4A4A400A4A4A400, 0x4040400040404000, 0x2828280028282800, 0xD3D3D300D3D3D300, 0x7B7B7B007B7B7B00, 0xBBBBBB00BBBBBB00, 0xC9C9C900C9C9C900, 0x4343430043434300, 0xC1C1C100C1C1C100, 0x1515150015151500, 0xE3E3E300E3E3E300, 0xADADAD00ADADAD00, 0xF4F4F400F4F4F400, 0x7777770077777700, 0xC7C7C700C7C7C700, 0x8080800080808000, 0x9E9E9E009E9E9E00 }; namespace Camellia_F { /* * We use the slow byte-wise version of F in the first and last rounds * to help protect against timing attacks */ uint64_t F_SLOW(uint64_t v, uint64_t K) { static const uint8_t SBOX[256] = { 0x70, 0x82, 0x2C, 0xEC, 0xB3, 0x27, 0xC0, 0xE5, 0xE4, 0x85, 0x57, 0x35, 0xEA, 0x0C, 0xAE, 0x41, 0x23, 0xEF, 0x6B, 0x93, 0x45, 0x19, 0xA5, 0x21, 0xED, 0x0E, 0x4F, 0x4E, 0x1D, 0x65, 0x92, 0xBD, 0x86, 0xB8, 0xAF, 0x8F, 0x7C, 0xEB, 0x1F, 0xCE, 0x3E, 0x30, 0xDC, 0x5F, 0x5E, 0xC5, 0x0B, 0x1A, 0xA6, 0xE1, 0x39, 0xCA, 0xD5, 0x47, 0x5D, 0x3D, 0xD9, 0x01, 0x5A, 0xD6, 0x51, 0x56, 0x6C, 0x4D, 0x8B, 0x0D, 0x9A, 0x66, 0xFB, 0xCC, 0xB0, 0x2D, 0x74, 0x12, 0x2B, 0x20, 0xF0, 0xB1, 0x84, 0x99, 0xDF, 0x4C, 0xCB, 0xC2, 0x34, 0x7E, 0x76, 0x05, 0x6D, 0xB7, 0xA9, 0x31, 0xD1, 0x17, 0x04, 0xD7, 0x14, 0x58, 0x3A, 0x61, 0xDE, 0x1B, 0x11, 0x1C, 0x32, 0x0F, 0x9C, 0x16, 0x53, 0x18, 0xF2, 0x22, 0xFE, 0x44, 0xCF, 0xB2, 0xC3, 0xB5, 0x7A, 0x91, 0x24, 0x08, 0xE8, 0xA8, 0x60, 0xFC, 0x69, 0x50, 0xAA, 0xD0, 0xA0, 0x7D, 0xA1, 0x89, 0x62, 0x97, 0x54, 0x5B, 0x1E, 0x95, 0xE0, 0xFF, 0x64, 0xD2, 0x10, 0xC4, 0x00, 0x48, 0xA3, 0xF7, 0x75, 0xDB, 0x8A, 0x03, 0xE6, 0xDA, 0x09, 0x3F, 0xDD, 0x94, 0x87, 0x5C, 0x83, 0x02, 0xCD, 0x4A, 0x90, 0x33, 0x73, 0x67, 0xF6, 0xF3, 0x9D, 0x7F, 0xBF, 0xE2, 0x52, 0x9B, 0xD8, 0x26, 0xC8, 0x37, 0xC6, 0x3B, 0x81, 0x96, 0x6F, 0x4B, 0x13, 0xBE, 0x63, 0x2E, 0xE9, 0x79, 0xA7, 0x8C, 0x9F, 0x6E, 0xBC, 0x8E, 0x29, 0xF5, 0xF9, 0xB6, 0x2F, 0xFD, 0xB4, 0x59, 0x78, 0x98, 0x06, 0x6A, 0xE7, 0x46, 0x71, 0xBA, 0xD4, 0x25, 0xAB, 0x42, 0x88, 0xA2, 0x8D, 0xFA, 0x72, 0x07, 0xB9, 0x55, 0xF8, 0xEE, 0xAC, 0x0A, 0x36, 0x49, 0x2A, 0x68, 0x3C, 0x38, 0xF1, 0xA4, 0x40, 0x28, 0xD3, 0x7B, 0xBB, 0xC9, 0x43, 0xC1, 0x15, 0xE3, 0xAD, 0xF4, 0x77, 0xC7, 0x80, 0x9E }; const uint64_t x = v ^ K; const uint8_t t1 = SBOX[get_byte(0, x)]; const uint8_t t2 = rotl<1>(SBOX[get_byte(1, x)]); const uint8_t t3 = rotl<7>(SBOX[get_byte(2, x)]); const uint8_t t4 = SBOX[rotl<1>(get_byte(3, x))]; const uint8_t t5 = rotl<1>(SBOX[get_byte(4, x)]); const uint8_t t6 = rotl<7>(SBOX[get_byte(5, x)]); const uint8_t t7 = SBOX[rotl<1>(get_byte(6, x))]; const uint8_t t8 = SBOX[get_byte(7, x)]; const uint8_t y1 = t1 ^ t3 ^ t4 ^ t6 ^ t7 ^ t8; const uint8_t y2 = t1 ^ t2 ^ t4 ^ t5 ^ t7 ^ t8; const uint8_t y3 = t1 ^ t2 ^ t3 ^ t5 ^ t6 ^ t8; const uint8_t y4 = t2 ^ t3 ^ t4 ^ t5 ^ t6 ^ t7; const uint8_t y5 = t1 ^ t2 ^ t6 ^ t7 ^ t8; const uint8_t y6 = t2 ^ t3 ^ t5 ^ t7 ^ t8; const uint8_t y7 = t3 ^ t4 ^ t5 ^ t6 ^ t8; const uint8_t y8 = t1 ^ t4 ^ t5 ^ t6 ^ t7; return make_uint64(y1, y2, y3, y4, y5, y6, y7, y8); } inline uint64_t F(uint64_t v, uint64_t K) { const uint64_t x = v ^ K; return Camellia_SBOX1[get_byte(0, x)] ^ Camellia_SBOX2[get_byte(1, x)] ^ Camellia_SBOX3[get_byte(2, x)] ^ Camellia_SBOX4[get_byte(3, x)] ^ Camellia_SBOX5[get_byte(4, x)] ^ Camellia_SBOX6[get_byte(5, x)] ^ Camellia_SBOX7[get_byte(6, x)] ^ Camellia_SBOX8[get_byte(7, x)]; } inline uint64_t FL(uint64_t v, uint64_t K) { uint32_t x1 = static_cast(v >> 32); uint32_t x2 = static_cast(v & 0xFFFFFFFF); const uint32_t k1 = static_cast(K >> 32); const uint32_t k2 = static_cast(K & 0xFFFFFFFF); x2 ^= rotl<1>(x1 & k1); x1 ^= (x2 | k2); return ((static_cast(x1) << 32) | x2); } inline uint64_t FLINV(uint64_t v, uint64_t K) { uint32_t x1 = static_cast(v >> 32); uint32_t x2 = static_cast(v & 0xFFFFFFFF); const uint32_t k1 = static_cast(K >> 32); const uint32_t k2 = static_cast(K & 0xFFFFFFFF); x1 ^= (x2 | k2); x2 ^= rotl<1>(x1 & k1); return ((static_cast(x1) << 32) | x2); } /* * Camellia Encryption */ void encrypt(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector& SK, const size_t rounds) { BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks; ++i) { uint64_t D1, D2; load_be(in + 16*i, D1, D2); const uint64_t* K = SK.data(); D1 ^= *K++; D2 ^= *K++; D2 ^= F_SLOW(D1, *K++); D1 ^= F_SLOW(D2, *K++); for(size_t r = 1; r != rounds - 1; ++r) { if(r % 3 == 0) { D1 = FL (D1, *K++); D2 = FLINV(D2, *K++); } D2 ^= F(D1, *K++); D1 ^= F(D2, *K++); } D2 ^= F_SLOW(D1, *K++); D1 ^= F_SLOW(D2, *K++); D2 ^= *K++; D1 ^= *K++; store_be(out + 16*i, D2, D1); } } /* * Camellia Decryption */ void decrypt(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector& SK, const size_t rounds) { BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks; ++i) { uint64_t D1, D2; load_be(in + 16*i, D1, D2); const uint64_t* K = &SK[SK.size()-1]; D2 ^= *K--; D1 ^= *K--; D2 ^= F_SLOW(D1, *K--); D1 ^= F_SLOW(D2, *K--); for(size_t r = 1; r != rounds - 1; ++r) { if(r % 3 == 0) { D1 = FL (D1, *K--); D2 = FLINV(D2, *K--); } D2 ^= F(D1, *K--); D1 ^= F(D2, *K--); } D2 ^= F_SLOW(D1, *K--); D1 ^= F_SLOW(D2, *K--); D1 ^= *K--; D2 ^= *K; store_be(out + 16*i, D2, D1); } } uint64_t left_rot_hi(uint64_t h, uint64_t l, size_t shift) { return (h << shift) | (l >> (64-shift)); } uint64_t left_rot_lo(uint64_t h, uint64_t l, size_t shift) { return (h >> (64-shift)) | (l << shift); } /* * Camellia Key Schedule */ void key_schedule(secure_vector& SK, const uint8_t key[], size_t length) { const uint64_t Sigma1 = 0xA09E667F3BCC908B; const uint64_t Sigma2 = 0xB67AE8584CAA73B2; const uint64_t Sigma3 = 0xC6EF372FE94F82BE; const uint64_t Sigma4 = 0x54FF53A5F1D36F1C; const uint64_t Sigma5 = 0x10E527FADE682D1D; const uint64_t Sigma6 = 0xB05688C2B3E6C1FD; const uint64_t KL_H = load_be(key, 0); const uint64_t KL_L = load_be(key, 1); const uint64_t KR_H = (length >= 24) ? load_be(key, 2) : 0; const uint64_t KR_L = (length == 32) ? load_be(key, 3) : ((length == 24) ? ~KR_H : 0); uint64_t D1 = KL_H ^ KR_H; uint64_t D2 = KL_L ^ KR_L; D2 ^= F(D1, Sigma1); D1 ^= F(D2, Sigma2); D1 ^= KL_H; D2 ^= KL_L; D2 ^= F(D1, Sigma3); D1 ^= F(D2, Sigma4); const uint64_t KA_H = D1; const uint64_t KA_L = D2; D1 = KA_H ^ KR_H; D2 = KA_L ^ KR_L; D2 ^= F(D1, Sigma5); D1 ^= F(D2, Sigma6); const uint64_t KB_H = D1; const uint64_t KB_L = D2; if(length == 16) { SK.resize(26); SK[ 0] = KL_H; SK[ 1] = KL_L; SK[ 2] = KA_H; SK[ 3] = KA_L; SK[ 4] = left_rot_hi(KL_H, KL_L, 15); SK[ 5] = left_rot_lo(KL_H, KL_L, 15); SK[ 6] = left_rot_hi(KA_H, KA_L, 15); SK[ 7] = left_rot_lo(KA_H, KA_L, 15); SK[ 8] = left_rot_hi(KA_H, KA_L, 30); SK[ 9] = left_rot_lo(KA_H, KA_L, 30); SK[10] = left_rot_hi(KL_H, KL_L, 45); SK[11] = left_rot_lo(KL_H, KL_L, 45); SK[12] = left_rot_hi(KA_H, KA_L, 45); SK[13] = left_rot_lo(KL_H, KL_L, 60); SK[14] = left_rot_hi(KA_H, KA_L, 60); SK[15] = left_rot_lo(KA_H, KA_L, 60); SK[16] = left_rot_lo(KL_H, KL_L, 77-64); SK[17] = left_rot_hi(KL_H, KL_L, 77-64); SK[18] = left_rot_lo(KL_H, KL_L, 94-64); SK[19] = left_rot_hi(KL_H, KL_L, 94-64); SK[20] = left_rot_lo(KA_H, KA_L, 94-64); SK[21] = left_rot_hi(KA_H, KA_L, 94-64); SK[22] = left_rot_lo(KL_H, KL_L, 111-64); SK[23] = left_rot_hi(KL_H, KL_L, 111-64); SK[24] = left_rot_lo(KA_H, KA_L, 111-64); SK[25] = left_rot_hi(KA_H, KA_L, 111-64); } else { SK.resize(34); SK[ 0] = KL_H; SK[ 1] = KL_L; SK[ 2] = KB_H; SK[ 3] = KB_L; SK[ 4] = left_rot_hi(KR_H, KR_L, 15); SK[ 5] = left_rot_lo(KR_H, KR_L, 15); SK[ 6] = left_rot_hi(KA_H, KA_L, 15); SK[ 7] = left_rot_lo(KA_H, KA_L, 15); SK[ 8] = left_rot_hi(KR_H, KR_L, 30); SK[ 9] = left_rot_lo(KR_H, KR_L, 30); SK[10] = left_rot_hi(KB_H, KB_L, 30); SK[11] = left_rot_lo(KB_H, KB_L, 30); SK[12] = left_rot_hi(KL_H, KL_L, 45); SK[13] = left_rot_lo(KL_H, KL_L, 45); SK[14] = left_rot_hi(KA_H, KA_L, 45); SK[15] = left_rot_lo(KA_H, KA_L, 45); SK[16] = left_rot_hi(KL_H, KL_L, 60); SK[17] = left_rot_lo(KL_H, KL_L, 60); SK[18] = left_rot_hi(KR_H, KR_L, 60); SK[19] = left_rot_lo(KR_H, KR_L, 60); SK[20] = left_rot_hi(KB_H, KB_L, 60); SK[21] = left_rot_lo(KB_H, KB_L, 60); SK[22] = left_rot_lo(KL_H, KL_L, 77-64); SK[23] = left_rot_hi(KL_H, KL_L, 77-64); SK[24] = left_rot_lo(KA_H, KA_L, 77-64); SK[25] = left_rot_hi(KA_H, KA_L, 77-64); SK[26] = left_rot_lo(KR_H, KR_L, 94-64); SK[27] = left_rot_hi(KR_H, KR_L, 94-64); SK[28] = left_rot_lo(KA_H, KA_L, 94-64); SK[29] = left_rot_hi(KA_H, KA_L, 94-64); SK[30] = left_rot_lo(KL_H, KL_L, 111-64); SK[31] = left_rot_hi(KL_H, KL_L, 111-64); SK[32] = left_rot_lo(KB_H, KB_L, 111-64); SK[33] = left_rot_hi(KB_H, KB_L, 111-64); } } } } void Camellia_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SK.empty() == false); Camellia_F::encrypt(in, out, blocks, m_SK, 9); } void Camellia_192::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SK.empty() == false); Camellia_F::encrypt(in, out, blocks, m_SK, 12); } void Camellia_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SK.empty() == false); Camellia_F::encrypt(in, out, blocks, m_SK, 12); } void Camellia_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SK.empty() == false); Camellia_F::decrypt(in, out, blocks, m_SK, 9); } void Camellia_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SK.empty() == false); Camellia_F::decrypt(in, out, blocks, m_SK, 12); } void Camellia_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SK.empty() == false); Camellia_F::decrypt(in, out, blocks, m_SK, 12); } void Camellia_128::key_schedule(const uint8_t key[], size_t length) { Camellia_F::key_schedule(m_SK, key, length); } void Camellia_192::key_schedule(const uint8_t key[], size_t length) { Camellia_F::key_schedule(m_SK, key, length); } void Camellia_256::key_schedule(const uint8_t key[], size_t length) { Camellia_F::key_schedule(m_SK, key, length); } void Camellia_128::clear() { zap(m_SK); } void Camellia_192::clear() { zap(m_SK); } void Camellia_256::clear() { zap(m_SK); } } botan-2.4.0/src/lib/block/camellia/camellia.h000066400000000000000000000037401322470703100207410ustar00rootroot00000000000000/* * Camellia * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CAMELLIA_H_ #define BOTAN_CAMELLIA_H_ #include namespace Botan { /** * Camellia-128 */ class BOTAN_PUBLIC_API(2,0) Camellia_128 final : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "Camellia-128"; } BlockCipher* clone() const override { return new Camellia_128; } private: void key_schedule(const uint8_t key[], size_t length) override; secure_vector m_SK; }; /** * Camellia-192 */ class BOTAN_PUBLIC_API(2,0) Camellia_192 final : public Block_Cipher_Fixed_Params<16, 24> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "Camellia-192"; } BlockCipher* clone() const override { return new Camellia_192; } private: void key_schedule(const uint8_t key[], size_t length) override; secure_vector m_SK; }; /** * Camellia-256 */ class BOTAN_PUBLIC_API(2,0) Camellia_256 final : public Block_Cipher_Fixed_Params<16, 32> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "Camellia-256"; } BlockCipher* clone() const override { return new Camellia_256; } private: void key_schedule(const uint8_t key[], size_t length) override; secure_vector m_SK; }; } #endif botan-2.4.0/src/lib/block/camellia/info.txt000066400000000000000000000001271322470703100205110ustar00rootroot00000000000000 CAMELLIA -> 20150922 camellia.h botan-2.4.0/src/lib/block/cascade/000077500000000000000000000000001322470703100166315ustar00rootroot00000000000000botan-2.4.0/src/lib/block/cascade/cascade.cpp000066400000000000000000000042401322470703100207200ustar00rootroot00000000000000/* * Block Cipher Cascade * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { void Cascade_Cipher::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { size_t c1_blocks = blocks * (block_size() / m_cipher1->block_size()); size_t c2_blocks = blocks * (block_size() / m_cipher2->block_size()); m_cipher1->encrypt_n(in, out, c1_blocks); m_cipher2->encrypt_n(out, out, c2_blocks); } void Cascade_Cipher::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { size_t c1_blocks = blocks * (block_size() / m_cipher1->block_size()); size_t c2_blocks = blocks * (block_size() / m_cipher2->block_size()); m_cipher2->decrypt_n(in, out, c2_blocks); m_cipher1->decrypt_n(out, out, c1_blocks); } void Cascade_Cipher::key_schedule(const uint8_t key[], size_t) { const uint8_t* key2 = key + m_cipher1->maximum_keylength(); m_cipher1->set_key(key , m_cipher1->maximum_keylength()); m_cipher2->set_key(key2, m_cipher2->maximum_keylength()); } void Cascade_Cipher::clear() { m_cipher1->clear(); m_cipher2->clear(); } std::string Cascade_Cipher::name() const { return "Cascade(" + m_cipher1->name() + "," + m_cipher2->name() + ")"; } BlockCipher* Cascade_Cipher::clone() const { return new Cascade_Cipher(m_cipher1->clone(), m_cipher2->clone()); } namespace { size_t euclids_algorithm(size_t a, size_t b) { while(b != 0) // gcd { size_t t = b; b = a % b; a = t; } return a; } size_t block_size_for_cascade(size_t bs, size_t bs2) { if(bs == bs2) return bs; size_t gcd = euclids_algorithm(bs, bs2); return (bs * bs2) / gcd; } } Cascade_Cipher::Cascade_Cipher(BlockCipher* c1, BlockCipher* c2) : m_cipher1(c1), m_cipher2(c2) { m_block = block_size_for_cascade(c1->block_size(), c2->block_size()); if(block_size() % c1->block_size() || block_size() % c2->block_size()) throw Internal_Error("Failure in " + name() + " constructor"); } } botan-2.4.0/src/lib/block/cascade/cascade.h000066400000000000000000000026201322470703100203650ustar00rootroot00000000000000/* * Block Cipher Cascade * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CASCADE_H_ #define BOTAN_CASCADE_H_ #include namespace Botan { /** * Block Cipher Cascade */ class BOTAN_PUBLIC_API(2,0) Cascade_Cipher final : public BlockCipher { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; size_t block_size() const override { return m_block; } Key_Length_Specification key_spec() const override { return Key_Length_Specification(m_cipher1->maximum_keylength() + m_cipher2->maximum_keylength()); } void clear() override; std::string name() const override; BlockCipher* clone() const override; /** * Create a cascade of two block ciphers * @param cipher1 the first cipher * @param cipher2 the second cipher */ Cascade_Cipher(BlockCipher* cipher1, BlockCipher* cipher2); Cascade_Cipher(const Cascade_Cipher&) = delete; Cascade_Cipher& operator=(const Cascade_Cipher&) = delete; private: void key_schedule(const uint8_t[], size_t) override; size_t m_block; std::unique_ptr m_cipher1, m_cipher2; }; } #endif botan-2.4.0/src/lib/block/cascade/info.txt000066400000000000000000000001251322470703100203230ustar00rootroot00000000000000 CASCADE -> 20131128 cascade.h botan-2.4.0/src/lib/block/cast/000077500000000000000000000000001322470703100162005ustar00rootroot00000000000000botan-2.4.0/src/lib/block/cast/cast128.cpp000066400000000000000000000542221322470703100200760ustar00rootroot00000000000000/* * CAST-128 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * CAST-128 Round Type 1 */ inline uint32_t F1(uint32_t R, uint32_t MK, uint8_t RK) { const uint32_t T = rotl_var(MK + R, RK); return (CAST_SBOX1[get_byte(0, T)] ^ CAST_SBOX2[get_byte(1, T)]) - CAST_SBOX3[get_byte(2, T)] + CAST_SBOX4[get_byte(3, T)]; } /* * CAST-128 Round Type 2 */ inline uint32_t F2(uint32_t R, uint32_t MK, uint8_t RK) { const uint32_t T = rotl_var(MK ^ R, RK); return (CAST_SBOX1[get_byte(0, T)] - CAST_SBOX2[get_byte(1, T)] + CAST_SBOX3[get_byte(2, T)]) ^ CAST_SBOX4[get_byte(3, T)]; } /* * CAST-128 Round Type 3 */ inline uint32_t F3(uint32_t R, uint32_t MK, uint8_t RK) { const uint32_t T = rotl_var(MK - R, RK); return ((CAST_SBOX1[get_byte(0, T)] + CAST_SBOX2[get_byte(1, T)]) ^ CAST_SBOX3[get_byte(2, T)]) - CAST_SBOX4[get_byte(3, T)]; } } /* * CAST-128 Encryption */ void CAST_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); while(blocks >= 2) { uint32_t L0, R0, L1, R1; load_be(in, L0, R0, L1, R1); L0 ^= F1(R0, m_MK[ 0], m_RK[ 0]); L1 ^= F1(R1, m_MK[ 0], m_RK[ 0]); R0 ^= F2(L0, m_MK[ 1], m_RK[ 1]); R1 ^= F2(L1, m_MK[ 1], m_RK[ 1]); L0 ^= F3(R0, m_MK[ 2], m_RK[ 2]); L1 ^= F3(R1, m_MK[ 2], m_RK[ 2]); R0 ^= F1(L0, m_MK[ 3], m_RK[ 3]); R1 ^= F1(L1, m_MK[ 3], m_RK[ 3]); L0 ^= F2(R0, m_MK[ 4], m_RK[ 4]); L1 ^= F2(R1, m_MK[ 4], m_RK[ 4]); R0 ^= F3(L0, m_MK[ 5], m_RK[ 5]); R1 ^= F3(L1, m_MK[ 5], m_RK[ 5]); L0 ^= F1(R0, m_MK[ 6], m_RK[ 6]); L1 ^= F1(R1, m_MK[ 6], m_RK[ 6]); R0 ^= F2(L0, m_MK[ 7], m_RK[ 7]); R1 ^= F2(L1, m_MK[ 7], m_RK[ 7]); L0 ^= F3(R0, m_MK[ 8], m_RK[ 8]); L1 ^= F3(R1, m_MK[ 8], m_RK[ 8]); R0 ^= F1(L0, m_MK[ 9], m_RK[ 9]); R1 ^= F1(L1, m_MK[ 9], m_RK[ 9]); L0 ^= F2(R0, m_MK[10], m_RK[10]); L1 ^= F2(R1, m_MK[10], m_RK[10]); R0 ^= F3(L0, m_MK[11], m_RK[11]); R1 ^= F3(L1, m_MK[11], m_RK[11]); L0 ^= F1(R0, m_MK[12], m_RK[12]); L1 ^= F1(R1, m_MK[12], m_RK[12]); R0 ^= F2(L0, m_MK[13], m_RK[13]); R1 ^= F2(L1, m_MK[13], m_RK[13]); L0 ^= F3(R0, m_MK[14], m_RK[14]); L1 ^= F3(R1, m_MK[14], m_RK[14]); R0 ^= F1(L0, m_MK[15], m_RK[15]); R1 ^= F1(L1, m_MK[15], m_RK[15]); store_be(out, R0, L0, R1, L1); blocks -= 2; out += 2 * BLOCK_SIZE; in += 2 * BLOCK_SIZE; } if(blocks) { uint32_t L, R; load_be(in, L, R); L ^= F1(R, m_MK[ 0], m_RK[ 0]); R ^= F2(L, m_MK[ 1], m_RK[ 1]); L ^= F3(R, m_MK[ 2], m_RK[ 2]); R ^= F1(L, m_MK[ 3], m_RK[ 3]); L ^= F2(R, m_MK[ 4], m_RK[ 4]); R ^= F3(L, m_MK[ 5], m_RK[ 5]); L ^= F1(R, m_MK[ 6], m_RK[ 6]); R ^= F2(L, m_MK[ 7], m_RK[ 7]); L ^= F3(R, m_MK[ 8], m_RK[ 8]); R ^= F1(L, m_MK[ 9], m_RK[ 9]); L ^= F2(R, m_MK[10], m_RK[10]); R ^= F3(L, m_MK[11], m_RK[11]); L ^= F1(R, m_MK[12], m_RK[12]); R ^= F2(L, m_MK[13], m_RK[13]); L ^= F3(R, m_MK[14], m_RK[14]); R ^= F1(L, m_MK[15], m_RK[15]); store_be(out, R, L); } } /* * CAST-128 Decryption */ void CAST_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); while(blocks >= 2) { uint32_t L0, R0, L1, R1; load_be(in, L0, R0, L1, R1); L0 ^= F1(R0, m_MK[15], m_RK[15]); L1 ^= F1(R1, m_MK[15], m_RK[15]); R0 ^= F3(L0, m_MK[14], m_RK[14]); R1 ^= F3(L1, m_MK[14], m_RK[14]); L0 ^= F2(R0, m_MK[13], m_RK[13]); L1 ^= F2(R1, m_MK[13], m_RK[13]); R0 ^= F1(L0, m_MK[12], m_RK[12]); R1 ^= F1(L1, m_MK[12], m_RK[12]); L0 ^= F3(R0, m_MK[11], m_RK[11]); L1 ^= F3(R1, m_MK[11], m_RK[11]); R0 ^= F2(L0, m_MK[10], m_RK[10]); R1 ^= F2(L1, m_MK[10], m_RK[10]); L0 ^= F1(R0, m_MK[ 9], m_RK[ 9]); L1 ^= F1(R1, m_MK[ 9], m_RK[ 9]); R0 ^= F3(L0, m_MK[ 8], m_RK[ 8]); R1 ^= F3(L1, m_MK[ 8], m_RK[ 8]); L0 ^= F2(R0, m_MK[ 7], m_RK[ 7]); L1 ^= F2(R1, m_MK[ 7], m_RK[ 7]); R0 ^= F1(L0, m_MK[ 6], m_RK[ 6]); R1 ^= F1(L1, m_MK[ 6], m_RK[ 6]); L0 ^= F3(R0, m_MK[ 5], m_RK[ 5]); L1 ^= F3(R1, m_MK[ 5], m_RK[ 5]); R0 ^= F2(L0, m_MK[ 4], m_RK[ 4]); R1 ^= F2(L1, m_MK[ 4], m_RK[ 4]); L0 ^= F1(R0, m_MK[ 3], m_RK[ 3]); L1 ^= F1(R1, m_MK[ 3], m_RK[ 3]); R0 ^= F3(L0, m_MK[ 2], m_RK[ 2]); R1 ^= F3(L1, m_MK[ 2], m_RK[ 2]); L0 ^= F2(R0, m_MK[ 1], m_RK[ 1]); L1 ^= F2(R1, m_MK[ 1], m_RK[ 1]); R0 ^= F1(L0, m_MK[ 0], m_RK[ 0]); R1 ^= F1(L1, m_MK[ 0], m_RK[ 0]); store_be(out, R0, L0, R1, L1); blocks -= 2; out += 2 * BLOCK_SIZE; in += 2 * BLOCK_SIZE; } if(blocks) { uint32_t L, R; load_be(in, L, R); L ^= F1(R, m_MK[15], m_RK[15]); R ^= F3(L, m_MK[14], m_RK[14]); L ^= F2(R, m_MK[13], m_RK[13]); R ^= F1(L, m_MK[12], m_RK[12]); L ^= F3(R, m_MK[11], m_RK[11]); R ^= F2(L, m_MK[10], m_RK[10]); L ^= F1(R, m_MK[ 9], m_RK[ 9]); R ^= F3(L, m_MK[ 8], m_RK[ 8]); L ^= F2(R, m_MK[ 7], m_RK[ 7]); R ^= F1(L, m_MK[ 6], m_RK[ 6]); L ^= F3(R, m_MK[ 5], m_RK[ 5]); R ^= F2(L, m_MK[ 4], m_RK[ 4]); L ^= F1(R, m_MK[ 3], m_RK[ 3]); R ^= F3(L, m_MK[ 2], m_RK[ 2]); L ^= F2(R, m_MK[ 1], m_RK[ 1]); R ^= F1(L, m_MK[ 0], m_RK[ 0]); store_be(out, R, L); } } /* * CAST-128 Key Schedule */ void CAST_128::key_schedule(const uint8_t key[], size_t length) { m_MK.resize(48); m_RK.resize(48); secure_vector X(4); for(size_t i = 0; i != length; ++i) X[i/4] = (X[i/4] << 8) + key[i]; cast_ks(m_MK, X); secure_vector RK32(48); cast_ks(RK32, X); for(size_t i = 0; i != 16; ++i) m_RK[i] = RK32[i] % 32; } void CAST_128::clear() { zap(m_MK); zap(m_RK); } /* * S-Box Based Key Expansion */ void CAST_128::cast_ks(secure_vector& K, secure_vector& X) { static const uint32_t S5[256] = { 0x7EC90C04, 0x2C6E74B9, 0x9B0E66DF, 0xA6337911, 0xB86A7FFF, 0x1DD358F5, 0x44DD9D44, 0x1731167F, 0x08FBF1FA, 0xE7F511CC, 0xD2051B00, 0x735ABA00, 0x2AB722D8, 0x386381CB, 0xACF6243A, 0x69BEFD7A, 0xE6A2E77F, 0xF0C720CD, 0xC4494816, 0xCCF5C180, 0x38851640, 0x15B0A848, 0xE68B18CB, 0x4CAADEFF, 0x5F480A01, 0x0412B2AA, 0x259814FC, 0x41D0EFE2, 0x4E40B48D, 0x248EB6FB, 0x8DBA1CFE, 0x41A99B02, 0x1A550A04, 0xBA8F65CB, 0x7251F4E7, 0x95A51725, 0xC106ECD7, 0x97A5980A, 0xC539B9AA, 0x4D79FE6A, 0xF2F3F763, 0x68AF8040, 0xED0C9E56, 0x11B4958B, 0xE1EB5A88, 0x8709E6B0, 0xD7E07156, 0x4E29FEA7, 0x6366E52D, 0x02D1C000, 0xC4AC8E05, 0x9377F571, 0x0C05372A, 0x578535F2, 0x2261BE02, 0xD642A0C9, 0xDF13A280, 0x74B55BD2, 0x682199C0, 0xD421E5EC, 0x53FB3CE8, 0xC8ADEDB3, 0x28A87FC9, 0x3D959981, 0x5C1FF900, 0xFE38D399, 0x0C4EFF0B, 0x062407EA, 0xAA2F4FB1, 0x4FB96976, 0x90C79505, 0xB0A8A774, 0xEF55A1FF, 0xE59CA2C2, 0xA6B62D27, 0xE66A4263, 0xDF65001F, 0x0EC50966, 0xDFDD55BC, 0x29DE0655, 0x911E739A, 0x17AF8975, 0x32C7911C, 0x89F89468, 0x0D01E980, 0x524755F4, 0x03B63CC9, 0x0CC844B2, 0xBCF3F0AA, 0x87AC36E9, 0xE53A7426, 0x01B3D82B, 0x1A9E7449, 0x64EE2D7E, 0xCDDBB1DA, 0x01C94910, 0xB868BF80, 0x0D26F3FD, 0x9342EDE7, 0x04A5C284, 0x636737B6, 0x50F5B616, 0xF24766E3, 0x8ECA36C1, 0x136E05DB, 0xFEF18391, 0xFB887A37, 0xD6E7F7D4, 0xC7FB7DC9, 0x3063FCDF, 0xB6F589DE, 0xEC2941DA, 0x26E46695, 0xB7566419, 0xF654EFC5, 0xD08D58B7, 0x48925401, 0xC1BACB7F, 0xE5FF550F, 0xB6083049, 0x5BB5D0E8, 0x87D72E5A, 0xAB6A6EE1, 0x223A66CE, 0xC62BF3CD, 0x9E0885F9, 0x68CB3E47, 0x086C010F, 0xA21DE820, 0xD18B69DE, 0xF3F65777, 0xFA02C3F6, 0x407EDAC3, 0xCBB3D550, 0x1793084D, 0xB0D70EBA, 0x0AB378D5, 0xD951FB0C, 0xDED7DA56, 0x4124BBE4, 0x94CA0B56, 0x0F5755D1, 0xE0E1E56E, 0x6184B5BE, 0x580A249F, 0x94F74BC0, 0xE327888E, 0x9F7B5561, 0xC3DC0280, 0x05687715, 0x646C6BD7, 0x44904DB3, 0x66B4F0A3, 0xC0F1648A, 0x697ED5AF, 0x49E92FF6, 0x309E374F, 0x2CB6356A, 0x85808573, 0x4991F840, 0x76F0AE02, 0x083BE84D, 0x28421C9A, 0x44489406, 0x736E4CB8, 0xC1092910, 0x8BC95FC6, 0x7D869CF4, 0x134F616F, 0x2E77118D, 0xB31B2BE1, 0xAA90B472, 0x3CA5D717, 0x7D161BBA, 0x9CAD9010, 0xAF462BA2, 0x9FE459D2, 0x45D34559, 0xD9F2DA13, 0xDBC65487, 0xF3E4F94E, 0x176D486F, 0x097C13EA, 0x631DA5C7, 0x445F7382, 0x175683F4, 0xCDC66A97, 0x70BE0288, 0xB3CDCF72, 0x6E5DD2F3, 0x20936079, 0x459B80A5, 0xBE60E2DB, 0xA9C23101, 0xEBA5315C, 0x224E42F2, 0x1C5C1572, 0xF6721B2C, 0x1AD2FFF3, 0x8C25404E, 0x324ED72F, 0x4067B7FD, 0x0523138E, 0x5CA3BC78, 0xDC0FD66E, 0x75922283, 0x784D6B17, 0x58EBB16E, 0x44094F85, 0x3F481D87, 0xFCFEAE7B, 0x77B5FF76, 0x8C2302BF, 0xAAF47556, 0x5F46B02A, 0x2B092801, 0x3D38F5F7, 0x0CA81F36, 0x52AF4A8A, 0x66D5E7C0, 0xDF3B0874, 0x95055110, 0x1B5AD7A8, 0xF61ED5AD, 0x6CF6E479, 0x20758184, 0xD0CEFA65, 0x88F7BE58, 0x4A046826, 0x0FF6F8F3, 0xA09C7F70, 0x5346ABA0, 0x5CE96C28, 0xE176EDA3, 0x6BAC307F, 0x376829D2, 0x85360FA9, 0x17E3FE2A, 0x24B79767, 0xF5A96B20, 0xD6CD2595, 0x68FF1EBF, 0x7555442C, 0xF19F06BE, 0xF9E0659A, 0xEEB9491D, 0x34010718, 0xBB30CAB8, 0xE822FE15, 0x88570983, 0x750E6249, 0xDA627E55, 0x5E76FFA8, 0xB1534546, 0x6D47DE08, 0xEFE9E7D4 }; static const uint32_t S6[256] = { 0xF6FA8F9D, 0x2CAC6CE1, 0x4CA34867, 0xE2337F7C, 0x95DB08E7, 0x016843B4, 0xECED5CBC, 0x325553AC, 0xBF9F0960, 0xDFA1E2ED, 0x83F0579D, 0x63ED86B9, 0x1AB6A6B8, 0xDE5EBE39, 0xF38FF732, 0x8989B138, 0x33F14961, 0xC01937BD, 0xF506C6DA, 0xE4625E7E, 0xA308EA99, 0x4E23E33C, 0x79CBD7CC, 0x48A14367, 0xA3149619, 0xFEC94BD5, 0xA114174A, 0xEAA01866, 0xA084DB2D, 0x09A8486F, 0xA888614A, 0x2900AF98, 0x01665991, 0xE1992863, 0xC8F30C60, 0x2E78EF3C, 0xD0D51932, 0xCF0FEC14, 0xF7CA07D2, 0xD0A82072, 0xFD41197E, 0x9305A6B0, 0xE86BE3DA, 0x74BED3CD, 0x372DA53C, 0x4C7F4448, 0xDAB5D440, 0x6DBA0EC3, 0x083919A7, 0x9FBAEED9, 0x49DBCFB0, 0x4E670C53, 0x5C3D9C01, 0x64BDB941, 0x2C0E636A, 0xBA7DD9CD, 0xEA6F7388, 0xE70BC762, 0x35F29ADB, 0x5C4CDD8D, 0xF0D48D8C, 0xB88153E2, 0x08A19866, 0x1AE2EAC8, 0x284CAF89, 0xAA928223, 0x9334BE53, 0x3B3A21BF, 0x16434BE3, 0x9AEA3906, 0xEFE8C36E, 0xF890CDD9, 0x80226DAE, 0xC340A4A3, 0xDF7E9C09, 0xA694A807, 0x5B7C5ECC, 0x221DB3A6, 0x9A69A02F, 0x68818A54, 0xCEB2296F, 0x53C0843A, 0xFE893655, 0x25BFE68A, 0xB4628ABC, 0xCF222EBF, 0x25AC6F48, 0xA9A99387, 0x53BDDB65, 0xE76FFBE7, 0xE967FD78, 0x0BA93563, 0x8E342BC1, 0xE8A11BE9, 0x4980740D, 0xC8087DFC, 0x8DE4BF99, 0xA11101A0, 0x7FD37975, 0xDA5A26C0, 0xE81F994F, 0x9528CD89, 0xFD339FED, 0xB87834BF, 0x5F04456D, 0x22258698, 0xC9C4C83B, 0x2DC156BE, 0x4F628DAA, 0x57F55EC5, 0xE2220ABE, 0xD2916EBF, 0x4EC75B95, 0x24F2C3C0, 0x42D15D99, 0xCD0D7FA0, 0x7B6E27FF, 0xA8DC8AF0, 0x7345C106, 0xF41E232F, 0x35162386, 0xE6EA8926, 0x3333B094, 0x157EC6F2, 0x372B74AF, 0x692573E4, 0xE9A9D848, 0xF3160289, 0x3A62EF1D, 0xA787E238, 0xF3A5F676, 0x74364853, 0x20951063, 0x4576698D, 0xB6FAD407, 0x592AF950, 0x36F73523, 0x4CFB6E87, 0x7DA4CEC0, 0x6C152DAA, 0xCB0396A8, 0xC50DFE5D, 0xFCD707AB, 0x0921C42F, 0x89DFF0BB, 0x5FE2BE78, 0x448F4F33, 0x754613C9, 0x2B05D08D, 0x48B9D585, 0xDC049441, 0xC8098F9B, 0x7DEDE786, 0xC39A3373, 0x42410005, 0x6A091751, 0x0EF3C8A6, 0x890072D6, 0x28207682, 0xA9A9F7BE, 0xBF32679D, 0xD45B5B75, 0xB353FD00, 0xCBB0E358, 0x830F220A, 0x1F8FB214, 0xD372CF08, 0xCC3C4A13, 0x8CF63166, 0x061C87BE, 0x88C98F88, 0x6062E397, 0x47CF8E7A, 0xB6C85283, 0x3CC2ACFB, 0x3FC06976, 0x4E8F0252, 0x64D8314D, 0xDA3870E3, 0x1E665459, 0xC10908F0, 0x513021A5, 0x6C5B68B7, 0x822F8AA0, 0x3007CD3E, 0x74719EEF, 0xDC872681, 0x073340D4, 0x7E432FD9, 0x0C5EC241, 0x8809286C, 0xF592D891, 0x08A930F6, 0x957EF305, 0xB7FBFFBD, 0xC266E96F, 0x6FE4AC98, 0xB173ECC0, 0xBC60B42A, 0x953498DA, 0xFBA1AE12, 0x2D4BD736, 0x0F25FAAB, 0xA4F3FCEB, 0xE2969123, 0x257F0C3D, 0x9348AF49, 0x361400BC, 0xE8816F4A, 0x3814F200, 0xA3F94043, 0x9C7A54C2, 0xBC704F57, 0xDA41E7F9, 0xC25AD33A, 0x54F4A084, 0xB17F5505, 0x59357CBE, 0xEDBD15C8, 0x7F97C5AB, 0xBA5AC7B5, 0xB6F6DEAF, 0x3A479C3A, 0x5302DA25, 0x653D7E6A, 0x54268D49, 0x51A477EA, 0x5017D55B, 0xD7D25D88, 0x44136C76, 0x0404A8C8, 0xB8E5A121, 0xB81A928A, 0x60ED5869, 0x97C55B96, 0xEAEC991B, 0x29935913, 0x01FDB7F1, 0x088E8DFA, 0x9AB6F6F5, 0x3B4CBF9F, 0x4A5DE3AB, 0xE6051D35, 0xA0E1D855, 0xD36B4CF1, 0xF544EDEB, 0xB0E93524, 0xBEBB8FBD, 0xA2D762CF, 0x49C92F54, 0x38B5F331, 0x7128A454, 0x48392905, 0xA65B1DB8, 0x851C97BD, 0xD675CF2F }; static const uint32_t S7[256] = { 0x85E04019, 0x332BF567, 0x662DBFFF, 0xCFC65693, 0x2A8D7F6F, 0xAB9BC912, 0xDE6008A1, 0x2028DA1F, 0x0227BCE7, 0x4D642916, 0x18FAC300, 0x50F18B82, 0x2CB2CB11, 0xB232E75C, 0x4B3695F2, 0xB28707DE, 0xA05FBCF6, 0xCD4181E9, 0xE150210C, 0xE24EF1BD, 0xB168C381, 0xFDE4E789, 0x5C79B0D8, 0x1E8BFD43, 0x4D495001, 0x38BE4341, 0x913CEE1D, 0x92A79C3F, 0x089766BE, 0xBAEEADF4, 0x1286BECF, 0xB6EACB19, 0x2660C200, 0x7565BDE4, 0x64241F7A, 0x8248DCA9, 0xC3B3AD66, 0x28136086, 0x0BD8DFA8, 0x356D1CF2, 0x107789BE, 0xB3B2E9CE, 0x0502AA8F, 0x0BC0351E, 0x166BF52A, 0xEB12FF82, 0xE3486911, 0xD34D7516, 0x4E7B3AFF, 0x5F43671B, 0x9CF6E037, 0x4981AC83, 0x334266CE, 0x8C9341B7, 0xD0D854C0, 0xCB3A6C88, 0x47BC2829, 0x4725BA37, 0xA66AD22B, 0x7AD61F1E, 0x0C5CBAFA, 0x4437F107, 0xB6E79962, 0x42D2D816, 0x0A961288, 0xE1A5C06E, 0x13749E67, 0x72FC081A, 0xB1D139F7, 0xF9583745, 0xCF19DF58, 0xBEC3F756, 0xC06EBA30, 0x07211B24, 0x45C28829, 0xC95E317F, 0xBC8EC511, 0x38BC46E9, 0xC6E6FA14, 0xBAE8584A, 0xAD4EBC46, 0x468F508B, 0x7829435F, 0xF124183B, 0x821DBA9F, 0xAFF60FF4, 0xEA2C4E6D, 0x16E39264, 0x92544A8B, 0x009B4FC3, 0xABA68CED, 0x9AC96F78, 0x06A5B79A, 0xB2856E6E, 0x1AEC3CA9, 0xBE838688, 0x0E0804E9, 0x55F1BE56, 0xE7E5363B, 0xB3A1F25D, 0xF7DEBB85, 0x61FE033C, 0x16746233, 0x3C034C28, 0xDA6D0C74, 0x79AAC56C, 0x3CE4E1AD, 0x51F0C802, 0x98F8F35A, 0x1626A49F, 0xEED82B29, 0x1D382FE3, 0x0C4FB99A, 0xBB325778, 0x3EC6D97B, 0x6E77A6A9, 0xCB658B5C, 0xD45230C7, 0x2BD1408B, 0x60C03EB7, 0xB9068D78, 0xA33754F4, 0xF430C87D, 0xC8A71302, 0xB96D8C32, 0xEBD4E7BE, 0xBE8B9D2D, 0x7979FB06, 0xE7225308, 0x8B75CF77, 0x11EF8DA4, 0xE083C858, 0x8D6B786F, 0x5A6317A6, 0xFA5CF7A0, 0x5DDA0033, 0xF28EBFB0, 0xF5B9C310, 0xA0EAC280, 0x08B9767A, 0xA3D9D2B0, 0x79D34217, 0x021A718D, 0x9AC6336A, 0x2711FD60, 0x438050E3, 0x069908A8, 0x3D7FEDC4, 0x826D2BEF, 0x4EEB8476, 0x488DCF25, 0x36C9D566, 0x28E74E41, 0xC2610ACA, 0x3D49A9CF, 0xBAE3B9DF, 0xB65F8DE6, 0x92AEAF64, 0x3AC7D5E6, 0x9EA80509, 0xF22B017D, 0xA4173F70, 0xDD1E16C3, 0x15E0D7F9, 0x50B1B887, 0x2B9F4FD5, 0x625ABA82, 0x6A017962, 0x2EC01B9C, 0x15488AA9, 0xD716E740, 0x40055A2C, 0x93D29A22, 0xE32DBF9A, 0x058745B9, 0x3453DC1E, 0xD699296E, 0x496CFF6F, 0x1C9F4986, 0xDFE2ED07, 0xB87242D1, 0x19DE7EAE, 0x053E561A, 0x15AD6F8C, 0x66626C1C, 0x7154C24C, 0xEA082B2A, 0x93EB2939, 0x17DCB0F0, 0x58D4F2AE, 0x9EA294FB, 0x52CF564C, 0x9883FE66, 0x2EC40581, 0x763953C3, 0x01D6692E, 0xD3A0C108, 0xA1E7160E, 0xE4F2DFA6, 0x693ED285, 0x74904698, 0x4C2B0EDD, 0x4F757656, 0x5D393378, 0xA132234F, 0x3D321C5D, 0xC3F5E194, 0x4B269301, 0xC79F022F, 0x3C997E7E, 0x5E4F9504, 0x3FFAFBBD, 0x76F7AD0E, 0x296693F4, 0x3D1FCE6F, 0xC61E45BE, 0xD3B5AB34, 0xF72BF9B7, 0x1B0434C0, 0x4E72B567, 0x5592A33D, 0xB5229301, 0xCFD2A87F, 0x60AEB767, 0x1814386B, 0x30BCC33D, 0x38A0C07D, 0xFD1606F2, 0xC363519B, 0x589DD390, 0x5479F8E6, 0x1CB8D647, 0x97FD61A9, 0xEA7759F4, 0x2D57539D, 0x569A58CF, 0xE84E63AD, 0x462E1B78, 0x6580F87E, 0xF3817914, 0x91DA55F4, 0x40A230F3, 0xD1988F35, 0xB6E318D2, 0x3FFA50BC, 0x3D40F021, 0xC3C0BDAE, 0x4958C24C, 0x518F36B2, 0x84B1D370, 0x0FEDCE83, 0x878DDADA, 0xF2A279C7, 0x94E01BE8, 0x90716F4B, 0x954B8AA3 }; static const uint32_t S8[256] = { 0xE216300D, 0xBBDDFFFC, 0xA7EBDABD, 0x35648095, 0x7789F8B7, 0xE6C1121B, 0x0E241600, 0x052CE8B5, 0x11A9CFB0, 0xE5952F11, 0xECE7990A, 0x9386D174, 0x2A42931C, 0x76E38111, 0xB12DEF3A, 0x37DDDDFC, 0xDE9ADEB1, 0x0A0CC32C, 0xBE197029, 0x84A00940, 0xBB243A0F, 0xB4D137CF, 0xB44E79F0, 0x049EEDFD, 0x0B15A15D, 0x480D3168, 0x8BBBDE5A, 0x669DED42, 0xC7ECE831, 0x3F8F95E7, 0x72DF191B, 0x7580330D, 0x94074251, 0x5C7DCDFA, 0xABBE6D63, 0xAA402164, 0xB301D40A, 0x02E7D1CA, 0x53571DAE, 0x7A3182A2, 0x12A8DDEC, 0xFDAA335D, 0x176F43E8, 0x71FB46D4, 0x38129022, 0xCE949AD4, 0xB84769AD, 0x965BD862, 0x82F3D055, 0x66FB9767, 0x15B80B4E, 0x1D5B47A0, 0x4CFDE06F, 0xC28EC4B8, 0x57E8726E, 0x647A78FC, 0x99865D44, 0x608BD593, 0x6C200E03, 0x39DC5FF6, 0x5D0B00A3, 0xAE63AFF2, 0x7E8BD632, 0x70108C0C, 0xBBD35049, 0x2998DF04, 0x980CF42A, 0x9B6DF491, 0x9E7EDD53, 0x06918548, 0x58CB7E07, 0x3B74EF2E, 0x522FFFB1, 0xD24708CC, 0x1C7E27CD, 0xA4EB215B, 0x3CF1D2E2, 0x19B47A38, 0x424F7618, 0x35856039, 0x9D17DEE7, 0x27EB35E6, 0xC9AFF67B, 0x36BAF5B8, 0x09C467CD, 0xC18910B1, 0xE11DBF7B, 0x06CD1AF8, 0x7170C608, 0x2D5E3354, 0xD4DE495A, 0x64C6D006, 0xBCC0C62C, 0x3DD00DB3, 0x708F8F34, 0x77D51B42, 0x264F620F, 0x24B8D2BF, 0x15C1B79E, 0x46A52564, 0xF8D7E54E, 0x3E378160, 0x7895CDA5, 0x859C15A5, 0xE6459788, 0xC37BC75F, 0xDB07BA0C, 0x0676A3AB, 0x7F229B1E, 0x31842E7B, 0x24259FD7, 0xF8BEF472, 0x835FFCB8, 0x6DF4C1F2, 0x96F5B195, 0xFD0AF0FC, 0xB0FE134C, 0xE2506D3D, 0x4F9B12EA, 0xF215F225, 0xA223736F, 0x9FB4C428, 0x25D04979, 0x34C713F8, 0xC4618187, 0xEA7A6E98, 0x7CD16EFC, 0x1436876C, 0xF1544107, 0xBEDEEE14, 0x56E9AF27, 0xA04AA441, 0x3CF7C899, 0x92ECBAE6, 0xDD67016D, 0x151682EB, 0xA842EEDF, 0xFDBA60B4, 0xF1907B75, 0x20E3030F, 0x24D8C29E, 0xE139673B, 0xEFA63FB8, 0x71873054, 0xB6F2CF3B, 0x9F326442, 0xCB15A4CC, 0xB01A4504, 0xF1E47D8D, 0x844A1BE5, 0xBAE7DFDC, 0x42CBDA70, 0xCD7DAE0A, 0x57E85B7A, 0xD53F5AF6, 0x20CF4D8C, 0xCEA4D428, 0x79D130A4, 0x3486EBFB, 0x33D3CDDC, 0x77853B53, 0x37EFFCB5, 0xC5068778, 0xE580B3E6, 0x4E68B8F4, 0xC5C8B37E, 0x0D809EA2, 0x398FEB7C, 0x132A4F94, 0x43B7950E, 0x2FEE7D1C, 0x223613BD, 0xDD06CAA2, 0x37DF932B, 0xC4248289, 0xACF3EBC3, 0x5715F6B7, 0xEF3478DD, 0xF267616F, 0xC148CBE4, 0x9052815E, 0x5E410FAB, 0xB48A2465, 0x2EDA7FA4, 0xE87B40E4, 0xE98EA084, 0x5889E9E1, 0xEFD390FC, 0xDD07D35B, 0xDB485694, 0x38D7E5B2, 0x57720101, 0x730EDEBC, 0x5B643113, 0x94917E4F, 0x503C2FBA, 0x646F1282, 0x7523D24A, 0xE0779695, 0xF9C17A8F, 0x7A5B2121, 0xD187B896, 0x29263A4D, 0xBA510CDF, 0x81F47C9F, 0xAD1163ED, 0xEA7B5965, 0x1A00726E, 0x11403092, 0x00DA6D77, 0x4A0CDD61, 0xAD1F4603, 0x605BDFB0, 0x9EEDC364, 0x22EBE6A8, 0xCEE7D28A, 0xA0E736A0, 0x5564A6B9, 0x10853209, 0xC7EB8F37, 0x2DE705CA, 0x8951570F, 0xDF09822B, 0xBD691A6C, 0xAA12E4F2, 0x87451C0F, 0xE0F6A27A, 0x3ADA4819, 0x4CF1764F, 0x0D771C2B, 0x67CDB156, 0x350D8384, 0x5938FA0F, 0x42399EF3, 0x36997B07, 0x0E84093D, 0x4AA93E61, 0x8360D87B, 0x1FA98B0C, 0x1149382C, 0xE97625A5, 0x0614D1B7, 0x0E25244B, 0x0C768347, 0x589E8D82, 0x0D2059D1, 0xA466BB1E, 0xF8DA0A82, 0x04F19130, 0xBA6E4EC0, 0x99265164, 0x1EE7230D, 0x50B2AD80, 0xEAEE6801, 0x8DB2A283, 0xEA8BF59E }; class ByteReader final { public: uint8_t operator()(size_t i) const { return static_cast(m_X[i/4] >> (8*(3 - (i%4)))); } explicit ByteReader(const uint32_t* x) : m_X(x) {} private: const uint32_t* m_X; }; secure_vector Z(4); ByteReader x(X.data()), z(Z.data()); Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; Z[1] = X[2] ^ S5[z( 0)] ^ S6[z( 2)] ^ S7[z( 1)] ^ S8[z( 3)] ^ S8[x(10)]; Z[2] = X[3] ^ S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S5[x( 9)]; Z[3] = X[1] ^ S5[z(10)] ^ S6[z( 9)] ^ S7[z(11)] ^ S8[z( 8)] ^ S6[x(11)]; K[ 0] = S5[z( 8)] ^ S6[z( 9)] ^ S7[z( 7)] ^ S8[z( 6)] ^ S5[z( 2)]; K[ 1] = S5[z(10)] ^ S6[z(11)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S6[z( 6)]; K[ 2] = S5[z(12)] ^ S6[z(13)] ^ S7[z( 3)] ^ S8[z( 2)] ^ S7[z( 9)]; K[ 3] = S5[z(14)] ^ S6[z(15)] ^ S7[z( 1)] ^ S8[z( 0)] ^ S8[z(12)]; X[0] = Z[2] ^ S5[z( 5)] ^ S6[z( 7)] ^ S7[z( 4)] ^ S8[z( 6)] ^ S7[z( 0)]; X[1] = Z[0] ^ S5[x( 0)] ^ S6[x( 2)] ^ S7[x( 1)] ^ S8[x( 3)] ^ S8[z( 2)]; X[2] = Z[1] ^ S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S5[z( 1)]; X[3] = Z[3] ^ S5[x(10)] ^ S6[x( 9)] ^ S7[x(11)] ^ S8[x( 8)] ^ S6[z( 3)]; K[ 4] = S5[x( 3)] ^ S6[x( 2)] ^ S7[x(12)] ^ S8[x(13)] ^ S5[x( 8)]; K[ 5] = S5[x( 1)] ^ S6[x( 0)] ^ S7[x(14)] ^ S8[x(15)] ^ S6[x(13)]; K[ 6] = S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 8)] ^ S8[x( 9)] ^ S7[x( 3)]; K[ 7] = S5[x( 5)] ^ S6[x( 4)] ^ S7[x(10)] ^ S8[x(11)] ^ S8[x( 7)]; Z[0] = X[0] ^ S5[x(13)] ^ S6[x(15)] ^ S7[x(12)] ^ S8[x(14)] ^ S7[x( 8)]; Z[1] = X[2] ^ S5[z( 0)] ^ S6[z( 2)] ^ S7[z( 1)] ^ S8[z( 3)] ^ S8[x(10)]; Z[2] = X[3] ^ S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 5)] ^ S8[z( 4)] ^ S5[x( 9)]; Z[3] = X[1] ^ S5[z(10)] ^ S6[z( 9)] ^ S7[z(11)] ^ S8[z( 8)] ^ S6[x(11)]; K[ 8] = S5[z( 3)] ^ S6[z( 2)] ^ S7[z(12)] ^ S8[z(13)] ^ S5[z( 9)]; K[ 9] = S5[z( 1)] ^ S6[z( 0)] ^ S7[z(14)] ^ S8[z(15)] ^ S6[z(12)]; K[10] = S5[z( 7)] ^ S6[z( 6)] ^ S7[z( 8)] ^ S8[z( 9)] ^ S7[z( 2)]; K[11] = S5[z( 5)] ^ S6[z( 4)] ^ S7[z(10)] ^ S8[z(11)] ^ S8[z( 6)]; X[0] = Z[2] ^ S5[z( 5)] ^ S6[z( 7)] ^ S7[z( 4)] ^ S8[z( 6)] ^ S7[z( 0)]; X[1] = Z[0] ^ S5[x( 0)] ^ S6[x( 2)] ^ S7[x( 1)] ^ S8[x( 3)] ^ S8[z( 2)]; X[2] = Z[1] ^ S5[x( 7)] ^ S6[x( 6)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S5[z( 1)]; X[3] = Z[3] ^ S5[x(10)] ^ S6[x( 9)] ^ S7[x(11)] ^ S8[x( 8)] ^ S6[z( 3)]; K[12] = S5[x( 8)] ^ S6[x( 9)] ^ S7[x( 7)] ^ S8[x( 6)] ^ S5[x( 3)]; K[13] = S5[x(10)] ^ S6[x(11)] ^ S7[x( 5)] ^ S8[x( 4)] ^ S6[x( 7)]; K[14] = S5[x(12)] ^ S6[x(13)] ^ S7[x( 3)] ^ S8[x( 2)] ^ S7[x( 8)]; K[15] = S5[x(14)] ^ S6[x(15)] ^ S7[x( 1)] ^ S8[x( 0)] ^ S8[x(13)]; } } botan-2.4.0/src/lib/block/cast/cast128.h000066400000000000000000000016751322470703100175470ustar00rootroot00000000000000/* * CAST-128 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CAST128_H_ #define BOTAN_CAST128_H_ #include namespace Botan { /** * CAST-128 */ class BOTAN_PUBLIC_API(2,0) CAST_128 final : public Block_Cipher_Fixed_Params<8, 11, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "CAST-128"; } BlockCipher* clone() const override { return new CAST_128; } private: void key_schedule(const uint8_t[], size_t) override; static void cast_ks(secure_vector& ks, secure_vector& user_key); secure_vector m_MK; secure_vector m_RK; }; } #endif botan-2.4.0/src/lib/block/cast/cast256.cpp000066400000000000000000000235771322470703100201110ustar00rootroot00000000000000/* * CAST-256 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * CAST-256 Round Type 1 */ void round1(uint32_t& out, uint32_t in, uint32_t MK, uint32_t RK) { const uint32_t T = rotl_var(MK + in, RK); out ^= (CAST_SBOX1[get_byte(0, T)] ^ CAST_SBOX2[get_byte(1, T)]) - CAST_SBOX3[get_byte(2, T)] + CAST_SBOX4[get_byte(3, T)]; } /* * CAST-256 Round Type 2 */ void round2(uint32_t& out, uint32_t in, uint32_t MK, uint32_t RK) { const uint32_t T = rotl_var(MK ^ in, RK); out ^= (CAST_SBOX1[get_byte(0, T)] - CAST_SBOX2[get_byte(1, T)] + CAST_SBOX3[get_byte(2, T)]) ^ CAST_SBOX4[get_byte(3, T)]; } /* * CAST-256 Round Type 3 */ void round3(uint32_t& out, uint32_t in, uint32_t MK, uint32_t RK) { const uint32_t T = rotl_var(MK - in, RK); out ^= ((CAST_SBOX1[get_byte(0, T)] + CAST_SBOX2[get_byte(1, T)]) ^ CAST_SBOX3[get_byte(2, T)]) - CAST_SBOX4[get_byte(3, T)]; } } /* * CAST-256 Encryption */ void CAST_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t A = load_be(in, 0); uint32_t B = load_be(in, 1); uint32_t C = load_be(in, 2); uint32_t D = load_be(in, 3); round1(C, D, m_MK[ 0], m_RK[ 0]); round2(B, C, m_MK[ 1], m_RK[ 1]); round3(A, B, m_MK[ 2], m_RK[ 2]); round1(D, A, m_MK[ 3], m_RK[ 3]); round1(C, D, m_MK[ 4], m_RK[ 4]); round2(B, C, m_MK[ 5], m_RK[ 5]); round3(A, B, m_MK[ 6], m_RK[ 6]); round1(D, A, m_MK[ 7], m_RK[ 7]); round1(C, D, m_MK[ 8], m_RK[ 8]); round2(B, C, m_MK[ 9], m_RK[ 9]); round3(A, B, m_MK[10], m_RK[10]); round1(D, A, m_MK[11], m_RK[11]); round1(C, D, m_MK[12], m_RK[12]); round2(B, C, m_MK[13], m_RK[13]); round3(A, B, m_MK[14], m_RK[14]); round1(D, A, m_MK[15], m_RK[15]); round1(C, D, m_MK[16], m_RK[16]); round2(B, C, m_MK[17], m_RK[17]); round3(A, B, m_MK[18], m_RK[18]); round1(D, A, m_MK[19], m_RK[19]); round1(C, D, m_MK[20], m_RK[20]); round2(B, C, m_MK[21], m_RK[21]); round3(A, B, m_MK[22], m_RK[22]); round1(D, A, m_MK[23], m_RK[23]); round1(D, A, m_MK[27], m_RK[27]); round3(A, B, m_MK[26], m_RK[26]); round2(B, C, m_MK[25], m_RK[25]); round1(C, D, m_MK[24], m_RK[24]); round1(D, A, m_MK[31], m_RK[31]); round3(A, B, m_MK[30], m_RK[30]); round2(B, C, m_MK[29], m_RK[29]); round1(C, D, m_MK[28], m_RK[28]); round1(D, A, m_MK[35], m_RK[35]); round3(A, B, m_MK[34], m_RK[34]); round2(B, C, m_MK[33], m_RK[33]); round1(C, D, m_MK[32], m_RK[32]); round1(D, A, m_MK[39], m_RK[39]); round3(A, B, m_MK[38], m_RK[38]); round2(B, C, m_MK[37], m_RK[37]); round1(C, D, m_MK[36], m_RK[36]); round1(D, A, m_MK[43], m_RK[43]); round3(A, B, m_MK[42], m_RK[42]); round2(B, C, m_MK[41], m_RK[41]); round1(C, D, m_MK[40], m_RK[40]); round1(D, A, m_MK[47], m_RK[47]); round3(A, B, m_MK[46], m_RK[46]); round2(B, C, m_MK[45], m_RK[45]); round1(C, D, m_MK[44], m_RK[44]); store_be(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * CAST-256 Decryption */ void CAST_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t A = load_be(in, 0); uint32_t B = load_be(in, 1); uint32_t C = load_be(in, 2); uint32_t D = load_be(in, 3); round1(C, D, m_MK[44], m_RK[44]); round2(B, C, m_MK[45], m_RK[45]); round3(A, B, m_MK[46], m_RK[46]); round1(D, A, m_MK[47], m_RK[47]); round1(C, D, m_MK[40], m_RK[40]); round2(B, C, m_MK[41], m_RK[41]); round3(A, B, m_MK[42], m_RK[42]); round1(D, A, m_MK[43], m_RK[43]); round1(C, D, m_MK[36], m_RK[36]); round2(B, C, m_MK[37], m_RK[37]); round3(A, B, m_MK[38], m_RK[38]); round1(D, A, m_MK[39], m_RK[39]); round1(C, D, m_MK[32], m_RK[32]); round2(B, C, m_MK[33], m_RK[33]); round3(A, B, m_MK[34], m_RK[34]); round1(D, A, m_MK[35], m_RK[35]); round1(C, D, m_MK[28], m_RK[28]); round2(B, C, m_MK[29], m_RK[29]); round3(A, B, m_MK[30], m_RK[30]); round1(D, A, m_MK[31], m_RK[31]); round1(C, D, m_MK[24], m_RK[24]); round2(B, C, m_MK[25], m_RK[25]); round3(A, B, m_MK[26], m_RK[26]); round1(D, A, m_MK[27], m_RK[27]); round1(D, A, m_MK[23], m_RK[23]); round3(A, B, m_MK[22], m_RK[22]); round2(B, C, m_MK[21], m_RK[21]); round1(C, D, m_MK[20], m_RK[20]); round1(D, A, m_MK[19], m_RK[19]); round3(A, B, m_MK[18], m_RK[18]); round2(B, C, m_MK[17], m_RK[17]); round1(C, D, m_MK[16], m_RK[16]); round1(D, A, m_MK[15], m_RK[15]); round3(A, B, m_MK[14], m_RK[14]); round2(B, C, m_MK[13], m_RK[13]); round1(C, D, m_MK[12], m_RK[12]); round1(D, A, m_MK[11], m_RK[11]); round3(A, B, m_MK[10], m_RK[10]); round2(B, C, m_MK[ 9], m_RK[ 9]); round1(C, D, m_MK[ 8], m_RK[ 8]); round1(D, A, m_MK[ 7], m_RK[ 7]); round3(A, B, m_MK[ 6], m_RK[ 6]); round2(B, C, m_MK[ 5], m_RK[ 5]); round1(C, D, m_MK[ 4], m_RK[ 4]); round1(D, A, m_MK[ 3], m_RK[ 3]); round3(A, B, m_MK[ 2], m_RK[ 2]); round2(B, C, m_MK[ 1], m_RK[ 1]); round1(C, D, m_MK[ 0], m_RK[ 0]); store_be(out, A, B, C, D); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * CAST-256 Key Schedule */ void CAST_256::key_schedule(const uint8_t key[], size_t length) { static const uint32_t KEY_MASK[192] = { 0x5A827999, 0xC95C653A, 0x383650DB, 0xA7103C7C, 0x15EA281D, 0x84C413BE, 0xF39DFF5F, 0x6277EB00, 0xD151D6A1, 0x402BC242, 0xAF05ADE3, 0x1DDF9984, 0x8CB98525, 0xFB9370C6, 0x6A6D5C67, 0xD9474808, 0x482133A9, 0xB6FB1F4A, 0x25D50AEB, 0x94AEF68C, 0x0388E22D, 0x7262CDCE, 0xE13CB96F, 0x5016A510, 0xBEF090B1, 0x2DCA7C52, 0x9CA467F3, 0x0B7E5394, 0x7A583F35, 0xE9322AD6, 0x580C1677, 0xC6E60218, 0x35BFEDB9, 0xA499D95A, 0x1373C4FB, 0x824DB09C, 0xF1279C3D, 0x600187DE, 0xCEDB737F, 0x3DB55F20, 0xAC8F4AC1, 0x1B693662, 0x8A432203, 0xF91D0DA4, 0x67F6F945, 0xD6D0E4E6, 0x45AAD087, 0xB484BC28, 0x235EA7C9, 0x9238936A, 0x01127F0B, 0x6FEC6AAC, 0xDEC6564D, 0x4DA041EE, 0xBC7A2D8F, 0x2B541930, 0x9A2E04D1, 0x0907F072, 0x77E1DC13, 0xE6BBC7B4, 0x5595B355, 0xC46F9EF6, 0x33498A97, 0xA2237638, 0x10FD61D9, 0x7FD74D7A, 0xEEB1391B, 0x5D8B24BC, 0xCC65105D, 0x3B3EFBFE, 0xAA18E79F, 0x18F2D340, 0x87CCBEE1, 0xF6A6AA82, 0x65809623, 0xD45A81C4, 0x43346D65, 0xB20E5906, 0x20E844A7, 0x8FC23048, 0xFE9C1BE9, 0x6D76078A, 0xDC4FF32B, 0x4B29DECC, 0xBA03CA6D, 0x28DDB60E, 0x97B7A1AF, 0x06918D50, 0x756B78F1, 0xE4456492, 0x531F5033, 0xC1F93BD4, 0x30D32775, 0x9FAD1316, 0x0E86FEB7, 0x7D60EA58, 0xEC3AD5F9, 0x5B14C19A, 0xC9EEAD3B, 0x38C898DC, 0xA7A2847D, 0x167C701E, 0x85565BBF, 0xF4304760, 0x630A3301, 0xD1E41EA2, 0x40BE0A43, 0xAF97F5E4, 0x1E71E185, 0x8D4BCD26, 0xFC25B8C7, 0x6AFFA468, 0xD9D99009, 0x48B37BAA, 0xB78D674B, 0x266752EC, 0x95413E8D, 0x041B2A2E, 0x72F515CF, 0xE1CF0170, 0x50A8ED11, 0xBF82D8B2, 0x2E5CC453, 0x9D36AFF4, 0x0C109B95, 0x7AEA8736, 0xE9C472D7, 0x589E5E78, 0xC7784A19, 0x365235BA, 0xA52C215B, 0x14060CFC, 0x82DFF89D, 0xF1B9E43E, 0x6093CFDF, 0xCF6DBB80, 0x3E47A721, 0xAD2192C2, 0x1BFB7E63, 0x8AD56A04, 0xF9AF55A5, 0x68894146, 0xD7632CE7, 0x463D1888, 0xB5170429, 0x23F0EFCA, 0x92CADB6B, 0x01A4C70C, 0x707EB2AD, 0xDF589E4E, 0x4E3289EF, 0xBD0C7590, 0x2BE66131, 0x9AC04CD2, 0x099A3873, 0x78742414, 0xE74E0FB5, 0x5627FB56, 0xC501E6F7, 0x33DBD298, 0xA2B5BE39, 0x118FA9DA, 0x8069957B, 0xEF43811C, 0x5E1D6CBD, 0xCCF7585E, 0x3BD143FF, 0xAAAB2FA0, 0x19851B41, 0x885F06E2, 0xF738F283, 0x6612DE24, 0xD4ECC9C5, 0x43C6B566, 0xB2A0A107, 0x217A8CA8, 0x90547849, 0xFF2E63EA, 0x6E084F8B, 0xDCE23B2C, 0x4BBC26CD, 0xBA96126E, 0x296FFE0F, 0x9849E9B0, 0x0723D551, 0x75FDC0F2, 0xE4D7AC93, 0x53B19834, 0xC28B83D5, 0x31656F76, 0xA03F5B17, 0x0F1946B8 }; static const uint8_t KEY_ROT[32] = { 0x13, 0x04, 0x15, 0x06, 0x17, 0x08, 0x19, 0x0A, 0x1B, 0x0C, 0x1D, 0x0E, 0x1F, 0x10, 0x01, 0x12, 0x03, 0x14, 0x05, 0x16, 0x07, 0x18, 0x09, 0x1A, 0x0B, 0x1C, 0x0D, 0x1E, 0x0F, 0x00, 0x11, 0x02 }; m_MK.resize(48); m_RK.resize(48); secure_vector K(8); for(size_t i = 0; i != length; ++i) K[i/4] = (K[i/4] << 8) + key[i]; uint32_t A = K[0], B = K[1], C = K[2], D = K[3], E = K[4], F = K[5], G = K[6], H = K[7]; for(size_t i = 0; i != 48; i += 4) { round1(G, H, KEY_MASK[4*i+ 0], KEY_ROT[(4*i+ 0) % 32]); round2(F, G, KEY_MASK[4*i+ 1], KEY_ROT[(4*i+ 1) % 32]); round3(E, F, KEY_MASK[4*i+ 2], KEY_ROT[(4*i+ 2) % 32]); round1(D, E, KEY_MASK[4*i+ 3], KEY_ROT[(4*i+ 3) % 32]); round2(C, D, KEY_MASK[4*i+ 4], KEY_ROT[(4*i+ 4) % 32]); round3(B, C, KEY_MASK[4*i+ 5], KEY_ROT[(4*i+ 5) % 32]); round1(A, B, KEY_MASK[4*i+ 6], KEY_ROT[(4*i+ 6) % 32]); round2(H, A, KEY_MASK[4*i+ 7], KEY_ROT[(4*i+ 7) % 32]); round1(G, H, KEY_MASK[4*i+ 8], KEY_ROT[(4*i+ 8) % 32]); round2(F, G, KEY_MASK[4*i+ 9], KEY_ROT[(4*i+ 9) % 32]); round3(E, F, KEY_MASK[4*i+10], KEY_ROT[(4*i+10) % 32]); round1(D, E, KEY_MASK[4*i+11], KEY_ROT[(4*i+11) % 32]); round2(C, D, KEY_MASK[4*i+12], KEY_ROT[(4*i+12) % 32]); round3(B, C, KEY_MASK[4*i+13], KEY_ROT[(4*i+13) % 32]); round1(A, B, KEY_MASK[4*i+14], KEY_ROT[(4*i+14) % 32]); round2(H, A, KEY_MASK[4*i+15], KEY_ROT[(4*i+15) % 32]); m_RK[i ] = (A % 32); m_RK[i+1] = (C % 32); m_RK[i+2] = (E % 32); m_RK[i+3] = (G % 32); m_MK[i ] = H; m_MK[i+1] = F; m_MK[i+2] = D; m_MK[i+3] = B; } } void CAST_256::clear() { zap(m_MK); zap(m_RK); } } botan-2.4.0/src/lib/block/cast/cast256.h000066400000000000000000000015111322470703100175360ustar00rootroot00000000000000/* * CAST-256 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CAST256_H_ #define BOTAN_CAST256_H_ #include namespace Botan { /** * CAST-256 */ class BOTAN_PUBLIC_API(2,0) CAST_256 final : public Block_Cipher_Fixed_Params<16, 4, 32, 4> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "CAST-256"; } BlockCipher* clone() const override { return new CAST_256; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_MK; secure_vector m_RK; }; } #endif botan-2.4.0/src/lib/block/cast/cast_sboxes.h000066400000000000000000000316541322470703100206770ustar00rootroot00000000000000/* * S-Box Tables for CAST-128 and CAST-256 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CAST_SBOX_TABLES_H_ #define BOTAN_CAST_SBOX_TABLES_H_ #include namespace Botan { const uint32_t CAST_SBOX1[256] = { 0x30FB40D4, 0x9FA0FF0B, 0x6BECCD2F, 0x3F258C7A, 0x1E213F2F, 0x9C004DD3, 0x6003E540, 0xCF9FC949, 0xBFD4AF27, 0x88BBBDB5, 0xE2034090, 0x98D09675, 0x6E63A0E0, 0x15C361D2, 0xC2E7661D, 0x22D4FF8E, 0x28683B6F, 0xC07FD059, 0xFF2379C8, 0x775F50E2, 0x43C340D3, 0xDF2F8656, 0x887CA41A, 0xA2D2BD2D, 0xA1C9E0D6, 0x346C4819, 0x61B76D87, 0x22540F2F, 0x2ABE32E1, 0xAA54166B, 0x22568E3A, 0xA2D341D0, 0x66DB40C8, 0xA784392F, 0x004DFF2F, 0x2DB9D2DE, 0x97943FAC, 0x4A97C1D8, 0x527644B7, 0xB5F437A7, 0xB82CBAEF, 0xD751D159, 0x6FF7F0ED, 0x5A097A1F, 0x827B68D0, 0x90ECF52E, 0x22B0C054, 0xBC8E5935, 0x4B6D2F7F, 0x50BB64A2, 0xD2664910, 0xBEE5812D, 0xB7332290, 0xE93B159F, 0xB48EE411, 0x4BFF345D, 0xFD45C240, 0xAD31973F, 0xC4F6D02E, 0x55FC8165, 0xD5B1CAAD, 0xA1AC2DAE, 0xA2D4B76D, 0xC19B0C50, 0x882240F2, 0x0C6E4F38, 0xA4E4BFD7, 0x4F5BA272, 0x564C1D2F, 0xC59C5319, 0xB949E354, 0xB04669FE, 0xB1B6AB8A, 0xC71358DD, 0x6385C545, 0x110F935D, 0x57538AD5, 0x6A390493, 0xE63D37E0, 0x2A54F6B3, 0x3A787D5F, 0x6276A0B5, 0x19A6FCDF, 0x7A42206A, 0x29F9D4D5, 0xF61B1891, 0xBB72275E, 0xAA508167, 0x38901091, 0xC6B505EB, 0x84C7CB8C, 0x2AD75A0F, 0x874A1427, 0xA2D1936B, 0x2AD286AF, 0xAA56D291, 0xD7894360, 0x425C750D, 0x93B39E26, 0x187184C9, 0x6C00B32D, 0x73E2BB14, 0xA0BEBC3C, 0x54623779, 0x64459EAB, 0x3F328B82, 0x7718CF82, 0x59A2CEA6, 0x04EE002E, 0x89FE78E6, 0x3FAB0950, 0x325FF6C2, 0x81383F05, 0x6963C5C8, 0x76CB5AD6, 0xD49974C9, 0xCA180DCF, 0x380782D5, 0xC7FA5CF6, 0x8AC31511, 0x35E79E13, 0x47DA91D0, 0xF40F9086, 0xA7E2419E, 0x31366241, 0x051EF495, 0xAA573B04, 0x4A805D8D, 0x548300D0, 0x00322A3C, 0xBF64CDDF, 0xBA57A68E, 0x75C6372B, 0x50AFD341, 0xA7C13275, 0x915A0BF5, 0x6B54BFAB, 0x2B0B1426, 0xAB4CC9D7, 0x449CCD82, 0xF7FBF265, 0xAB85C5F3, 0x1B55DB94, 0xAAD4E324, 0xCFA4BD3F, 0x2DEAA3E2, 0x9E204D02, 0xC8BD25AC, 0xEADF55B3, 0xD5BD9E98, 0xE31231B2, 0x2AD5AD6C, 0x954329DE, 0xADBE4528, 0xD8710F69, 0xAA51C90F, 0xAA786BF6, 0x22513F1E, 0xAA51A79B, 0x2AD344CC, 0x7B5A41F0, 0xD37CFBAD, 0x1B069505, 0x41ECE491, 0xB4C332E6, 0x032268D4, 0xC9600ACC, 0xCE387E6D, 0xBF6BB16C, 0x6A70FB78, 0x0D03D9C9, 0xD4DF39DE, 0xE01063DA, 0x4736F464, 0x5AD328D8, 0xB347CC96, 0x75BB0FC3, 0x98511BFB, 0x4FFBCC35, 0xB58BCF6A, 0xE11F0ABC, 0xBFC5FE4A, 0xA70AEC10, 0xAC39570A, 0x3F04442F, 0x6188B153, 0xE0397A2E, 0x5727CB79, 0x9CEB418F, 0x1CACD68D, 0x2AD37C96, 0x0175CB9D, 0xC69DFF09, 0xC75B65F0, 0xD9DB40D8, 0xEC0E7779, 0x4744EAD4, 0xB11C3274, 0xDD24CB9E, 0x7E1C54BD, 0xF01144F9, 0xD2240EB1, 0x9675B3FD, 0xA3AC3755, 0xD47C27AF, 0x51C85F4D, 0x56907596, 0xA5BB15E6, 0x580304F0, 0xCA042CF1, 0x011A37EA, 0x8DBFAADB, 0x35BA3E4A, 0x3526FFA0, 0xC37B4D09, 0xBC306ED9, 0x98A52666, 0x5648F725, 0xFF5E569D, 0x0CED63D0, 0x7C63B2CF, 0x700B45E1, 0xD5EA50F1, 0x85A92872, 0xAF1FBDA7, 0xD4234870, 0xA7870BF3, 0x2D3B4D79, 0x42E04198, 0x0CD0EDE7, 0x26470DB8, 0xF881814C, 0x474D6AD7, 0x7C0C5E5C, 0xD1231959, 0x381B7298, 0xF5D2F4DB, 0xAB838653, 0x6E2F1E23, 0x83719C9E, 0xBD91E046, 0x9A56456E, 0xDC39200C, 0x20C8C571, 0x962BDA1C, 0xE1E696FF, 0xB141AB08, 0x7CCA89B9, 0x1A69E783, 0x02CC4843, 0xA2F7C579, 0x429EF47D, 0x427B169C, 0x5AC9F049, 0xDD8F0F00, 0x5C8165BF }; const uint32_t CAST_SBOX2[256] = { 0x1F201094, 0xEF0BA75B, 0x69E3CF7E, 0x393F4380, 0xFE61CF7A, 0xEEC5207A, 0x55889C94, 0x72FC0651, 0xADA7EF79, 0x4E1D7235, 0xD55A63CE, 0xDE0436BA, 0x99C430EF, 0x5F0C0794, 0x18DCDB7D, 0xA1D6EFF3, 0xA0B52F7B, 0x59E83605, 0xEE15B094, 0xE9FFD909, 0xDC440086, 0xEF944459, 0xBA83CCB3, 0xE0C3CDFB, 0xD1DA4181, 0x3B092AB1, 0xF997F1C1, 0xA5E6CF7B, 0x01420DDB, 0xE4E7EF5B, 0x25A1FF41, 0xE180F806, 0x1FC41080, 0x179BEE7A, 0xD37AC6A9, 0xFE5830A4, 0x98DE8B7F, 0x77E83F4E, 0x79929269, 0x24FA9F7B, 0xE113C85B, 0xACC40083, 0xD7503525, 0xF7EA615F, 0x62143154, 0x0D554B63, 0x5D681121, 0xC866C359, 0x3D63CF73, 0xCEE234C0, 0xD4D87E87, 0x5C672B21, 0x071F6181, 0x39F7627F, 0x361E3084, 0xE4EB573B, 0x602F64A4, 0xD63ACD9C, 0x1BBC4635, 0x9E81032D, 0x2701F50C, 0x99847AB4, 0xA0E3DF79, 0xBA6CF38C, 0x10843094, 0x2537A95E, 0xF46F6FFE, 0xA1FF3B1F, 0x208CFB6A, 0x8F458C74, 0xD9E0A227, 0x4EC73A34, 0xFC884F69, 0x3E4DE8DF, 0xEF0E0088, 0x3559648D, 0x8A45388C, 0x1D804366, 0x721D9BFD, 0xA58684BB, 0xE8256333, 0x844E8212, 0x128D8098, 0xFED33FB4, 0xCE280AE1, 0x27E19BA5, 0xD5A6C252, 0xE49754BD, 0xC5D655DD, 0xEB667064, 0x77840B4D, 0xA1B6A801, 0x84DB26A9, 0xE0B56714, 0x21F043B7, 0xE5D05860, 0x54F03084, 0x066FF472, 0xA31AA153, 0xDADC4755, 0xB5625DBF, 0x68561BE6, 0x83CA6B94, 0x2D6ED23B, 0xECCF01DB, 0xA6D3D0BA, 0xB6803D5C, 0xAF77A709, 0x33B4A34C, 0x397BC8D6, 0x5EE22B95, 0x5F0E5304, 0x81ED6F61, 0x20E74364, 0xB45E1378, 0xDE18639B, 0x881CA122, 0xB96726D1, 0x8049A7E8, 0x22B7DA7B, 0x5E552D25, 0x5272D237, 0x79D2951C, 0xC60D894C, 0x488CB402, 0x1BA4FE5B, 0xA4B09F6B, 0x1CA815CF, 0xA20C3005, 0x8871DF63, 0xB9DE2FCB, 0x0CC6C9E9, 0x0BEEFF53, 0xE3214517, 0xB4542835, 0x9F63293C, 0xEE41E729, 0x6E1D2D7C, 0x50045286, 0x1E6685F3, 0xF33401C6, 0x30A22C95, 0x31A70850, 0x60930F13, 0x73F98417, 0xA1269859, 0xEC645C44, 0x52C877A9, 0xCDFF33A6, 0xA02B1741, 0x7CBAD9A2, 0x2180036F, 0x50D99C08, 0xCB3F4861, 0xC26BD765, 0x64A3F6AB, 0x80342676, 0x25A75E7B, 0xE4E6D1FC, 0x20C710E6, 0xCDF0B680, 0x17844D3B, 0x31EEF84D, 0x7E0824E4, 0x2CCB49EB, 0x846A3BAE, 0x8FF77888, 0xEE5D60F6, 0x7AF75673, 0x2FDD5CDB, 0xA11631C1, 0x30F66F43, 0xB3FAEC54, 0x157FD7FA, 0xEF8579CC, 0xD152DE58, 0xDB2FFD5E, 0x8F32CE19, 0x306AF97A, 0x02F03EF8, 0x99319AD5, 0xC242FA0F, 0xA7E3EBB0, 0xC68E4906, 0xB8DA230C, 0x80823028, 0xDCDEF3C8, 0xD35FB171, 0x088A1BC8, 0xBEC0C560, 0x61A3C9E8, 0xBCA8F54D, 0xC72FEFFA, 0x22822E99, 0x82C570B4, 0xD8D94E89, 0x8B1C34BC, 0x301E16E6, 0x273BE979, 0xB0FFEAA6, 0x61D9B8C6, 0x00B24869, 0xB7FFCE3F, 0x08DC283B, 0x43DAF65A, 0xF7E19798, 0x7619B72F, 0x8F1C9BA4, 0xDC8637A0, 0x16A7D3B1, 0x9FC393B7, 0xA7136EEB, 0xC6BCC63E, 0x1A513742, 0xEF6828BC, 0x520365D6, 0x2D6A77AB, 0x3527ED4B, 0x821FD216, 0x095C6E2E, 0xDB92F2FB, 0x5EEA29CB, 0x145892F5, 0x91584F7F, 0x5483697B, 0x2667A8CC, 0x85196048, 0x8C4BACEA, 0x833860D4, 0x0D23E0F9, 0x6C387E8A, 0x0AE6D249, 0xB284600C, 0xD835731D, 0xDCB1C647, 0xAC4C56EA, 0x3EBD81B3, 0x230EABB0, 0x6438BC87, 0xF0B5B1FA, 0x8F5EA2B3, 0xFC184642, 0x0A036B7A, 0x4FB089BD, 0x649DA589, 0xA345415E, 0x5C038323, 0x3E5D3BB9, 0x43D79572, 0x7E6DD07C, 0x06DFDF1E, 0x6C6CC4EF, 0x7160A539, 0x73BFBE70, 0x83877605, 0x4523ECF1 }; const uint32_t CAST_SBOX3[256] = { 0x8DEFC240, 0x25FA5D9F, 0xEB903DBF, 0xE810C907, 0x47607FFF, 0x369FE44B, 0x8C1FC644, 0xAECECA90, 0xBEB1F9BF, 0xEEFBCAEA, 0xE8CF1950, 0x51DF07AE, 0x920E8806, 0xF0AD0548, 0xE13C8D83, 0x927010D5, 0x11107D9F, 0x07647DB9, 0xB2E3E4D4, 0x3D4F285E, 0xB9AFA820, 0xFADE82E0, 0xA067268B, 0x8272792E, 0x553FB2C0, 0x489AE22B, 0xD4EF9794, 0x125E3FBC, 0x21FFFCEE, 0x825B1BFD, 0x9255C5ED, 0x1257A240, 0x4E1A8302, 0xBAE07FFF, 0x528246E7, 0x8E57140E, 0x3373F7BF, 0x8C9F8188, 0xA6FC4EE8, 0xC982B5A5, 0xA8C01DB7, 0x579FC264, 0x67094F31, 0xF2BD3F5F, 0x40FFF7C1, 0x1FB78DFC, 0x8E6BD2C1, 0x437BE59B, 0x99B03DBF, 0xB5DBC64B, 0x638DC0E6, 0x55819D99, 0xA197C81C, 0x4A012D6E, 0xC5884A28, 0xCCC36F71, 0xB843C213, 0x6C0743F1, 0x8309893C, 0x0FEDDD5F, 0x2F7FE850, 0xD7C07F7E, 0x02507FBF, 0x5AFB9A04, 0xA747D2D0, 0x1651192E, 0xAF70BF3E, 0x58C31380, 0x5F98302E, 0x727CC3C4, 0x0A0FB402, 0x0F7FEF82, 0x8C96FDAD, 0x5D2C2AAE, 0x8EE99A49, 0x50DA88B8, 0x8427F4A0, 0x1EAC5790, 0x796FB449, 0x8252DC15, 0xEFBD7D9B, 0xA672597D, 0xADA840D8, 0x45F54504, 0xFA5D7403, 0xE83EC305, 0x4F91751A, 0x925669C2, 0x23EFE941, 0xA903F12E, 0x60270DF2, 0x0276E4B6, 0x94FD6574, 0x927985B2, 0x8276DBCB, 0x02778176, 0xF8AF918D, 0x4E48F79E, 0x8F616DDF, 0xE29D840E, 0x842F7D83, 0x340CE5C8, 0x96BBB682, 0x93B4B148, 0xEF303CAB, 0x984FAF28, 0x779FAF9B, 0x92DC560D, 0x224D1E20, 0x8437AA88, 0x7D29DC96, 0x2756D3DC, 0x8B907CEE, 0xB51FD240, 0xE7C07CE3, 0xE566B4A1, 0xC3E9615E, 0x3CF8209D, 0x6094D1E3, 0xCD9CA341, 0x5C76460E, 0x00EA983B, 0xD4D67881, 0xFD47572C, 0xF76CEDD9, 0xBDA8229C, 0x127DADAA, 0x438A074E, 0x1F97C090, 0x081BDB8A, 0x93A07EBE, 0xB938CA15, 0x97B03CFF, 0x3DC2C0F8, 0x8D1AB2EC, 0x64380E51, 0x68CC7BFB, 0xD90F2788, 0x12490181, 0x5DE5FFD4, 0xDD7EF86A, 0x76A2E214, 0xB9A40368, 0x925D958F, 0x4B39FFFA, 0xBA39AEE9, 0xA4FFD30B, 0xFAF7933B, 0x6D498623, 0x193CBCFA, 0x27627545, 0x825CF47A, 0x61BD8BA0, 0xD11E42D1, 0xCEAD04F4, 0x127EA392, 0x10428DB7, 0x8272A972, 0x9270C4A8, 0x127DE50B, 0x285BA1C8, 0x3C62F44F, 0x35C0EAA5, 0xE805D231, 0x428929FB, 0xB4FCDF82, 0x4FB66A53, 0x0E7DC15B, 0x1F081FAB, 0x108618AE, 0xFCFD086D, 0xF9FF2889, 0x694BCC11, 0x236A5CAE, 0x12DECA4D, 0x2C3F8CC5, 0xD2D02DFE, 0xF8EF5896, 0xE4CF52DA, 0x95155B67, 0x494A488C, 0xB9B6A80C, 0x5C8F82BC, 0x89D36B45, 0x3A609437, 0xEC00C9A9, 0x44715253, 0x0A874B49, 0xD773BC40, 0x7C34671C, 0x02717EF6, 0x4FEB5536, 0xA2D02FFF, 0xD2BF60C4, 0xD43F03C0, 0x50B4EF6D, 0x07478CD1, 0x006E1888, 0xA2E53F55, 0xB9E6D4BC, 0xA2048016, 0x97573833, 0xD7207D67, 0xDE0F8F3D, 0x72F87B33, 0xABCC4F33, 0x7688C55D, 0x7B00A6B0, 0x947B0001, 0x570075D2, 0xF9BB88F8, 0x8942019E, 0x4264A5FF, 0x856302E0, 0x72DBD92B, 0xEE971B69, 0x6EA22FDE, 0x5F08AE2B, 0xAF7A616D, 0xE5C98767, 0xCF1FEBD2, 0x61EFC8C2, 0xF1AC2571, 0xCC8239C2, 0x67214CB8, 0xB1E583D1, 0xB7DC3E62, 0x7F10BDCE, 0xF90A5C38, 0x0FF0443D, 0x606E6DC6, 0x60543A49, 0x5727C148, 0x2BE98A1D, 0x8AB41738, 0x20E1BE24, 0xAF96DA0F, 0x68458425, 0x99833BE5, 0x600D457D, 0x282F9350, 0x8334B362, 0xD91D1120, 0x2B6D8DA0, 0x642B1E31, 0x9C305A00, 0x52BCE688, 0x1B03588A, 0xF7BAEFD5, 0x4142ED9C, 0xA4315C11, 0x83323EC5, 0xDFEF4636, 0xA133C501, 0xE9D3531C, 0xEE353783 }; const uint32_t CAST_SBOX4[256] = { 0x9DB30420, 0x1FB6E9DE, 0xA7BE7BEF, 0xD273A298, 0x4A4F7BDB, 0x64AD8C57, 0x85510443, 0xFA020ED1, 0x7E287AFF, 0xE60FB663, 0x095F35A1, 0x79EBF120, 0xFD059D43, 0x6497B7B1, 0xF3641F63, 0x241E4ADF, 0x28147F5F, 0x4FA2B8CD, 0xC9430040, 0x0CC32220, 0xFDD30B30, 0xC0A5374F, 0x1D2D00D9, 0x24147B15, 0xEE4D111A, 0x0FCA5167, 0x71FF904C, 0x2D195FFE, 0x1A05645F, 0x0C13FEFE, 0x081B08CA, 0x05170121, 0x80530100, 0xE83E5EFE, 0xAC9AF4F8, 0x7FE72701, 0xD2B8EE5F, 0x06DF4261, 0xBB9E9B8A, 0x7293EA25, 0xCE84FFDF, 0xF5718801, 0x3DD64B04, 0xA26F263B, 0x7ED48400, 0x547EEBE6, 0x446D4CA0, 0x6CF3D6F5, 0x2649ABDF, 0xAEA0C7F5, 0x36338CC1, 0x503F7E93, 0xD3772061, 0x11B638E1, 0x72500E03, 0xF80EB2BB, 0xABE0502E, 0xEC8D77DE, 0x57971E81, 0xE14F6746, 0xC9335400, 0x6920318F, 0x081DBB99, 0xFFC304A5, 0x4D351805, 0x7F3D5CE3, 0xA6C866C6, 0x5D5BCCA9, 0xDAEC6FEA, 0x9F926F91, 0x9F46222F, 0x3991467D, 0xA5BF6D8E, 0x1143C44F, 0x43958302, 0xD0214EEB, 0x022083B8, 0x3FB6180C, 0x18F8931E, 0x281658E6, 0x26486E3E, 0x8BD78A70, 0x7477E4C1, 0xB506E07C, 0xF32D0A25, 0x79098B02, 0xE4EABB81, 0x28123B23, 0x69DEAD38, 0x1574CA16, 0xDF871B62, 0x211C40B7, 0xA51A9EF9, 0x0014377B, 0x041E8AC8, 0x09114003, 0xBD59E4D2, 0xE3D156D5, 0x4FE876D5, 0x2F91A340, 0x557BE8DE, 0x00EAE4A7, 0x0CE5C2EC, 0x4DB4BBA6, 0xE756BDFF, 0xDD3369AC, 0xEC17B035, 0x06572327, 0x99AFC8B0, 0x56C8C391, 0x6B65811C, 0x5E146119, 0x6E85CB75, 0xBE07C002, 0xC2325577, 0x893FF4EC, 0x5BBFC92D, 0xD0EC3B25, 0xB7801AB7, 0x8D6D3B24, 0x20C763EF, 0xC366A5FC, 0x9C382880, 0x0ACE3205, 0xAAC9548A, 0xECA1D7C7, 0x041AFA32, 0x1D16625A, 0x6701902C, 0x9B757A54, 0x31D477F7, 0x9126B031, 0x36CC6FDB, 0xC70B8B46, 0xD9E66A48, 0x56E55A79, 0x026A4CEB, 0x52437EFF, 0x2F8F76B4, 0x0DF980A5, 0x8674CDE3, 0xEDDA04EB, 0x17A9BE04, 0x2C18F4DF, 0xB7747F9D, 0xAB2AF7B4, 0xEFC34D20, 0x2E096B7C, 0x1741A254, 0xE5B6A035, 0x213D42F6, 0x2C1C7C26, 0x61C2F50F, 0x6552DAF9, 0xD2C231F8, 0x25130F69, 0xD8167FA2, 0x0418F2C8, 0x001A96A6, 0x0D1526AB, 0x63315C21, 0x5E0A72EC, 0x49BAFEFD, 0x187908D9, 0x8D0DBD86, 0x311170A7, 0x3E9B640C, 0xCC3E10D7, 0xD5CAD3B6, 0x0CAEC388, 0xF73001E1, 0x6C728AFF, 0x71EAE2A1, 0x1F9AF36E, 0xCFCBD12F, 0xC1DE8417, 0xAC07BE6B, 0xCB44A1D8, 0x8B9B0F56, 0x013988C3, 0xB1C52FCA, 0xB4BE31CD, 0xD8782806, 0x12A3A4E2, 0x6F7DE532, 0x58FD7EB6, 0xD01EE900, 0x24ADFFC2, 0xF4990FC5, 0x9711AAC5, 0x001D7B95, 0x82E5E7D2, 0x109873F6, 0x00613096, 0xC32D9521, 0xADA121FF, 0x29908415, 0x7FBB977F, 0xAF9EB3DB, 0x29C9ED2A, 0x5CE2A465, 0xA730F32C, 0xD0AA3FE8, 0x8A5CC091, 0xD49E2CE7, 0x0CE454A9, 0xD60ACD86, 0x015F1919, 0x77079103, 0xDEA03AF6, 0x78A8565E, 0xDEE356DF, 0x21F05CBE, 0x8B75E387, 0xB3C50651, 0xB8A5C3EF, 0xD8EEB6D2, 0xE523BE77, 0xC2154529, 0x2F69EFDF, 0xAFE67AFB, 0xF470C4B2, 0xF3E0EB5B, 0xD6CC9876, 0x39E4460C, 0x1FDA8538, 0x1987832F, 0xCA007367, 0xA99144F8, 0x296B299E, 0x492FC295, 0x9266BEAB, 0xB5676E69, 0x9BD3DDDA, 0xDF7E052F, 0xDB25701C, 0x1B5E51EE, 0xF65324E6, 0x6AFCE36C, 0x0316CC04, 0x8644213E, 0xB7DC59D0, 0x7965291F, 0xCCD6FD43, 0x41823979, 0x932BCDF6, 0xB657C34D, 0x4EDFD282, 0x7AE5290C, 0x3CB9536B, 0x851E20FE, 0x9833557E, 0x13ECF0B0, 0xD3FFB372, 0x3F85C5C1, 0x0AEF7ED2 }; } #endif botan-2.4.0/src/lib/block/cast/info.txt000066400000000000000000000002721322470703100176750ustar00rootroot00000000000000 CAST -> 20131128 CAST_128 -> 20171203 CAST_256 -> 20171203 cast_sboxes.h cast128.h cast256.h botan-2.4.0/src/lib/block/des/000077500000000000000000000000001322470703100160215ustar00rootroot00000000000000botan-2.4.0/src/lib/block/des/des.cpp000066400000000000000000000260711322470703100173060ustar00rootroot00000000000000/* * DES * (C) 1999-2008 Jack Lloyd * * Based on a public domain implemenation by Phil Karn (who in turn * credited Richard Outerbridge and Jim Gillogly) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { /* * DES Key Schedule */ void des_key_schedule(uint32_t round_key[32], const uint8_t key[8]) { static const uint8_t ROT[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; uint32_t C = ((key[7] & 0x80) << 20) | ((key[6] & 0x80) << 19) | ((key[5] & 0x80) << 18) | ((key[4] & 0x80) << 17) | ((key[3] & 0x80) << 16) | ((key[2] & 0x80) << 15) | ((key[1] & 0x80) << 14) | ((key[0] & 0x80) << 13) | ((key[7] & 0x40) << 13) | ((key[6] & 0x40) << 12) | ((key[5] & 0x40) << 11) | ((key[4] & 0x40) << 10) | ((key[3] & 0x40) << 9) | ((key[2] & 0x40) << 8) | ((key[1] & 0x40) << 7) | ((key[0] & 0x40) << 6) | ((key[7] & 0x20) << 6) | ((key[6] & 0x20) << 5) | ((key[5] & 0x20) << 4) | ((key[4] & 0x20) << 3) | ((key[3] & 0x20) << 2) | ((key[2] & 0x20) << 1) | ((key[1] & 0x20) ) | ((key[0] & 0x20) >> 1) | ((key[7] & 0x10) >> 1) | ((key[6] & 0x10) >> 2) | ((key[5] & 0x10) >> 3) | ((key[4] & 0x10) >> 4); uint32_t D = ((key[7] & 0x02) << 26) | ((key[6] & 0x02) << 25) | ((key[5] & 0x02) << 24) | ((key[4] & 0x02) << 23) | ((key[3] & 0x02) << 22) | ((key[2] & 0x02) << 21) | ((key[1] & 0x02) << 20) | ((key[0] & 0x02) << 19) | ((key[7] & 0x04) << 17) | ((key[6] & 0x04) << 16) | ((key[5] & 0x04) << 15) | ((key[4] & 0x04) << 14) | ((key[3] & 0x04) << 13) | ((key[2] & 0x04) << 12) | ((key[1] & 0x04) << 11) | ((key[0] & 0x04) << 10) | ((key[7] & 0x08) << 8) | ((key[6] & 0x08) << 7) | ((key[5] & 0x08) << 6) | ((key[4] & 0x08) << 5) | ((key[3] & 0x08) << 4) | ((key[2] & 0x08) << 3) | ((key[1] & 0x08) << 2) | ((key[0] & 0x08) << 1) | ((key[3] & 0x10) >> 1) | ((key[2] & 0x10) >> 2) | ((key[1] & 0x10) >> 3) | ((key[0] & 0x10) >> 4); for(size_t i = 0; i != 16; ++i) { C = ((C << ROT[i]) | (C >> (28-ROT[i]))) & 0x0FFFFFFF; D = ((D << ROT[i]) | (D >> (28-ROT[i]))) & 0x0FFFFFFF; round_key[2*i ] = ((C & 0x00000010) << 22) | ((C & 0x00000800) << 17) | ((C & 0x00000020) << 16) | ((C & 0x00004004) << 15) | ((C & 0x00000200) << 11) | ((C & 0x00020000) << 10) | ((C & 0x01000000) >> 6) | ((C & 0x00100000) >> 4) | ((C & 0x00010000) << 3) | ((C & 0x08000000) >> 2) | ((C & 0x00800000) << 1) | ((D & 0x00000010) << 8) | ((D & 0x00000002) << 7) | ((D & 0x00000001) << 2) | ((D & 0x00000200) ) | ((D & 0x00008000) >> 2) | ((D & 0x00000088) >> 3) | ((D & 0x00001000) >> 7) | ((D & 0x00080000) >> 9) | ((D & 0x02020000) >> 14) | ((D & 0x00400000) >> 21); round_key[2*i+1] = ((C & 0x00000001) << 28) | ((C & 0x00000082) << 18) | ((C & 0x00002000) << 14) | ((C & 0x00000100) << 10) | ((C & 0x00001000) << 9) | ((C & 0x00040000) << 6) | ((C & 0x02400000) << 4) | ((C & 0x00008000) << 2) | ((C & 0x00200000) >> 1) | ((C & 0x04000000) >> 10) | ((D & 0x00000020) << 6) | ((D & 0x00000100) ) | ((D & 0x00000800) >> 1) | ((D & 0x00000040) >> 3) | ((D & 0x00010000) >> 4) | ((D & 0x00000400) >> 5) | ((D & 0x00004000) >> 10) | ((D & 0x04000000) >> 13) | ((D & 0x00800000) >> 14) | ((D & 0x00100000) >> 18) | ((D & 0x01000000) >> 24) | ((D & 0x08000000) >> 26); } } /* * DES Encryption */ void des_encrypt(uint32_t& L, uint32_t& R, const uint32_t round_key[32]) { for(size_t i = 0; i != 16; i += 2) { uint32_t T0, T1; T0 = rotr<4>(R) ^ round_key[2*i]; T1 = R ^ round_key[2*i + 1]; L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; T0 = rotr<4>(L) ^ round_key[2*i + 2]; T1 = L ^ round_key[2*i + 3]; R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; } } /* * DES Decryption */ void des_decrypt(uint32_t& L, uint32_t& R, const uint32_t round_key[32]) { for(size_t i = 16; i != 0; i -= 2) { uint32_t T0, T1; T0 = rotr<4>(R) ^ round_key[2*i - 2]; T1 = R ^ round_key[2*i - 1]; L ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; T0 = rotr<4>(L) ^ round_key[2*i - 4]; T1 = L ^ round_key[2*i - 3]; R ^= DES_SPBOX1[get_byte(0, T0)] ^ DES_SPBOX2[get_byte(0, T1)] ^ DES_SPBOX3[get_byte(1, T0)] ^ DES_SPBOX4[get_byte(1, T1)] ^ DES_SPBOX5[get_byte(2, T0)] ^ DES_SPBOX6[get_byte(2, T1)] ^ DES_SPBOX7[get_byte(3, T0)] ^ DES_SPBOX8[get_byte(3, T1)]; } } } /* * DES Encryption */ void DES::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); for(size_t i = 0; i < blocks; ++i) { uint64_t T = (DES_IPTAB1[in[8*i+0]] ) | (DES_IPTAB1[in[8*i+1]] << 1) | (DES_IPTAB1[in[8*i+2]] << 2) | (DES_IPTAB1[in[8*i+3]] << 3) | (DES_IPTAB1[in[8*i+4]] << 4) | (DES_IPTAB1[in[8*i+5]] << 5) | (DES_IPTAB1[in[8*i+6]] << 6) | (DES_IPTAB2[in[8*i+7]] ); uint32_t L = static_cast(T >> 32); uint32_t R = static_cast(T); des_encrypt(L, R, m_round_key.data()); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotl<32>(T); store_be(T, out + 8*i); } } /* * DES Decryption */ void DES::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); for(size_t i = 0; i < blocks; ++i) { uint64_t T = (DES_IPTAB1[in[BLOCK_SIZE*i+0]] ) | (DES_IPTAB1[in[BLOCK_SIZE*i+1]] << 1) | (DES_IPTAB1[in[BLOCK_SIZE*i+2]] << 2) | (DES_IPTAB1[in[BLOCK_SIZE*i+3]] << 3) | (DES_IPTAB1[in[BLOCK_SIZE*i+4]] << 4) | (DES_IPTAB1[in[BLOCK_SIZE*i+5]] << 5) | (DES_IPTAB1[in[BLOCK_SIZE*i+6]] << 6) | (DES_IPTAB2[in[BLOCK_SIZE*i+7]] ); uint32_t L = static_cast(T >> 32); uint32_t R = static_cast(T); des_decrypt(L, R, m_round_key.data()); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotl<32>(T); store_be(T, out + BLOCK_SIZE*i); } } /* * DES Key Schedule */ void DES::key_schedule(const uint8_t key[], size_t) { m_round_key.resize(32); des_key_schedule(m_round_key.data(), key); } void DES::clear() { zap(m_round_key); } /* * TripleDES Encryption */ void TripleDES::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint64_t T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); uint32_t L = static_cast(T >> 32); uint32_t R = static_cast(T); des_encrypt(L, R, &m_round_key[0]); des_decrypt(R, L, &m_round_key[32]); des_encrypt(L, R, &m_round_key[64]); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotl<32>(T); store_be(T, out); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * TripleDES Decryption */ void TripleDES::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint64_t T = (DES_IPTAB1[in[0]] ) | (DES_IPTAB1[in[1]] << 1) | (DES_IPTAB1[in[2]] << 2) | (DES_IPTAB1[in[3]] << 3) | (DES_IPTAB1[in[4]] << 4) | (DES_IPTAB1[in[5]] << 5) | (DES_IPTAB1[in[6]] << 6) | (DES_IPTAB2[in[7]] ); uint32_t L = static_cast(T >> 32); uint32_t R = static_cast(T); des_decrypt(L, R, &m_round_key[64]); des_encrypt(R, L, &m_round_key[32]); des_decrypt(L, R, &m_round_key[0]); T = (DES_FPTAB1[get_byte(0, L)] << 5) | (DES_FPTAB1[get_byte(1, L)] << 3) | (DES_FPTAB1[get_byte(2, L)] << 1) | (DES_FPTAB2[get_byte(3, L)] << 1) | (DES_FPTAB1[get_byte(0, R)] << 4) | (DES_FPTAB1[get_byte(1, R)] << 2) | (DES_FPTAB1[get_byte(2, R)] ) | (DES_FPTAB2[get_byte(3, R)] ); T = rotl<32>(T); store_be(T, out); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * TripleDES Key Schedule */ void TripleDES::key_schedule(const uint8_t key[], size_t length) { m_round_key.resize(3*32); des_key_schedule(&m_round_key[0], key); des_key_schedule(&m_round_key[32], key + 8); if(length == 24) des_key_schedule(&m_round_key[64], key + 16); else copy_mem(&m_round_key[64], &m_round_key[0], 32); } void TripleDES::clear() { zap(m_round_key); } } botan-2.4.0/src/lib/block/des/des.h000066400000000000000000000034701322470703100167510ustar00rootroot00000000000000/* * DES * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DES_H_ #define BOTAN_DES_H_ #include namespace Botan { /** * DES */ class BOTAN_PUBLIC_API(2,0) DES final : public Block_Cipher_Fixed_Params<8, 8> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "DES"; } BlockCipher* clone() const override { return new DES; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_round_key; }; /** * Triple DES */ class BOTAN_PUBLIC_API(2,0) TripleDES final : public Block_Cipher_Fixed_Params<8, 16, 24, 8> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "TripleDES"; } BlockCipher* clone() const override { return new TripleDES; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_round_key; }; /* * DES Tables */ extern const uint32_t DES_SPBOX1[256]; extern const uint32_t DES_SPBOX2[256]; extern const uint32_t DES_SPBOX3[256]; extern const uint32_t DES_SPBOX4[256]; extern const uint32_t DES_SPBOX5[256]; extern const uint32_t DES_SPBOX6[256]; extern const uint32_t DES_SPBOX7[256]; extern const uint32_t DES_SPBOX8[256]; extern const uint64_t DES_IPTAB1[256]; extern const uint64_t DES_IPTAB2[256]; extern const uint64_t DES_FPTAB1[256]; extern const uint64_t DES_FPTAB2[256]; } #endif botan-2.4.0/src/lib/block/des/des_tab.cpp000066400000000000000000001332221322470703100201310ustar00rootroot00000000000000/* * Substitution/Permutation Tables for DES * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { const uint32_t DES_SPBOX1[256] = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004, 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; const uint32_t DES_SPBOX2[256] = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000, 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; const uint32_t DES_SPBOX3[256] = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200, 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; const uint32_t DES_SPBOX4[256] = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; const uint32_t DES_SPBOX5[256] = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100, 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; const uint32_t DES_SPBOX6[256] = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010, 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; const uint32_t DES_SPBOX7[256] = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002, 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; const uint32_t DES_SPBOX8[256] = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000, 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; const uint64_t DES_IPTAB1[256] = { 0x0000000000000000, 0x0000000200000000, 0x0000000000000002, 0x0000000200000002, 0x0000020000000000, 0x0000020200000000, 0x0000020000000002, 0x0000020200000002, 0x0000000000000200, 0x0000000200000200, 0x0000000000000202, 0x0000000200000202, 0x0000020000000200, 0x0000020200000200, 0x0000020000000202, 0x0000020200000202, 0x0002000000000000, 0x0002000200000000, 0x0002000000000002, 0x0002000200000002, 0x0002020000000000, 0x0002020200000000, 0x0002020000000002, 0x0002020200000002, 0x0002000000000200, 0x0002000200000200, 0x0002000000000202, 0x0002000200000202, 0x0002020000000200, 0x0002020200000200, 0x0002020000000202, 0x0002020200000202, 0x0000000000020000, 0x0000000200020000, 0x0000000000020002, 0x0000000200020002, 0x0000020000020000, 0x0000020200020000, 0x0000020000020002, 0x0000020200020002, 0x0000000000020200, 0x0000000200020200, 0x0000000000020202, 0x0000000200020202, 0x0000020000020200, 0x0000020200020200, 0x0000020000020202, 0x0000020200020202, 0x0002000000020000, 0x0002000200020000, 0x0002000000020002, 0x0002000200020002, 0x0002020000020000, 0x0002020200020000, 0x0002020000020002, 0x0002020200020002, 0x0002000000020200, 0x0002000200020200, 0x0002000000020202, 0x0002000200020202, 0x0002020000020200, 0x0002020200020200, 0x0002020000020202, 0x0002020200020202, 0x0200000000000000, 0x0200000200000000, 0x0200000000000002, 0x0200000200000002, 0x0200020000000000, 0x0200020200000000, 0x0200020000000002, 0x0200020200000002, 0x0200000000000200, 0x0200000200000200, 0x0200000000000202, 0x0200000200000202, 0x0200020000000200, 0x0200020200000200, 0x0200020000000202, 0x0200020200000202, 0x0202000000000000, 0x0202000200000000, 0x0202000000000002, 0x0202000200000002, 0x0202020000000000, 0x0202020200000000, 0x0202020000000002, 0x0202020200000002, 0x0202000000000200, 0x0202000200000200, 0x0202000000000202, 0x0202000200000202, 0x0202020000000200, 0x0202020200000200, 0x0202020000000202, 0x0202020200000202, 0x0200000000020000, 0x0200000200020000, 0x0200000000020002, 0x0200000200020002, 0x0200020000020000, 0x0200020200020000, 0x0200020000020002, 0x0200020200020002, 0x0200000000020200, 0x0200000200020200, 0x0200000000020202, 0x0200000200020202, 0x0200020000020200, 0x0200020200020200, 0x0200020000020202, 0x0200020200020202, 0x0202000000020000, 0x0202000200020000, 0x0202000000020002, 0x0202000200020002, 0x0202020000020000, 0x0202020200020000, 0x0202020000020002, 0x0202020200020002, 0x0202000000020200, 0x0202000200020200, 0x0202000000020202, 0x0202000200020202, 0x0202020000020200, 0x0202020200020200, 0x0202020000020202, 0x0202020200020202, 0x0000000002000000, 0x0000000202000000, 0x0000000002000002, 0x0000000202000002, 0x0000020002000000, 0x0000020202000000, 0x0000020002000002, 0x0000020202000002, 0x0000000002000200, 0x0000000202000200, 0x0000000002000202, 0x0000000202000202, 0x0000020002000200, 0x0000020202000200, 0x0000020002000202, 0x0000020202000202, 0x0002000002000000, 0x0002000202000000, 0x0002000002000002, 0x0002000202000002, 0x0002020002000000, 0x0002020202000000, 0x0002020002000002, 0x0002020202000002, 0x0002000002000200, 0x0002000202000200, 0x0002000002000202, 0x0002000202000202, 0x0002020002000200, 0x0002020202000200, 0x0002020002000202, 0x0002020202000202, 0x0000000002020000, 0x0000000202020000, 0x0000000002020002, 0x0000000202020002, 0x0000020002020000, 0x0000020202020000, 0x0000020002020002, 0x0000020202020002, 0x0000000002020200, 0x0000000202020200, 0x0000000002020202, 0x0000000202020202, 0x0000020002020200, 0x0000020202020200, 0x0000020002020202, 0x0000020202020202, 0x0002000002020000, 0x0002000202020000, 0x0002000002020002, 0x0002000202020002, 0x0002020002020000, 0x0002020202020000, 0x0002020002020002, 0x0002020202020002, 0x0002000002020200, 0x0002000202020200, 0x0002000002020202, 0x0002000202020202, 0x0002020002020200, 0x0002020202020200, 0x0002020002020202, 0x0002020202020202, 0x0200000002000000, 0x0200000202000000, 0x0200000002000002, 0x0200000202000002, 0x0200020002000000, 0x0200020202000000, 0x0200020002000002, 0x0200020202000002, 0x0200000002000200, 0x0200000202000200, 0x0200000002000202, 0x0200000202000202, 0x0200020002000200, 0x0200020202000200, 0x0200020002000202, 0x0200020202000202, 0x0202000002000000, 0x0202000202000000, 0x0202000002000002, 0x0202000202000002, 0x0202020002000000, 0x0202020202000000, 0x0202020002000002, 0x0202020202000002, 0x0202000002000200, 0x0202000202000200, 0x0202000002000202, 0x0202000202000202, 0x0202020002000200, 0x0202020202000200, 0x0202020002000202, 0x0202020202000202, 0x0200000002020000, 0x0200000202020000, 0x0200000002020002, 0x0200000202020002, 0x0200020002020000, 0x0200020202020000, 0x0200020002020002, 0x0200020202020002, 0x0200000002020200, 0x0200000202020200, 0x0200000002020202, 0x0200000202020202, 0x0200020002020200, 0x0200020202020200, 0x0200020002020202, 0x0200020202020202, 0x0202000002020000, 0x0202000202020000, 0x0202000002020002, 0x0202000202020002, 0x0202020002020000, 0x0202020202020000, 0x0202020002020002, 0x0202020202020002, 0x0202000002020200, 0x0202000202020200, 0x0202000002020202, 0x0202000202020202, 0x0202020002020200, 0x0202020202020200, 0x0202020002020202, 0x0202020202020202 }; const uint64_t DES_IPTAB2[256] = { 0x0000000000000000, 0x0000010000000000, 0x0000000000000100, 0x0000010000000100, 0x0001000000000000, 0x0001010000000000, 0x0001000000000100, 0x0001010000000100, 0x0000000000010000, 0x0000010000010000, 0x0000000000010100, 0x0000010000010100, 0x0001000000010000, 0x0001010000010000, 0x0001000000010100, 0x0001010000010100, 0x0100000000000000, 0x0100010000000000, 0x0100000000000100, 0x0100010000000100, 0x0101000000000000, 0x0101010000000000, 0x0101000000000100, 0x0101010000000100, 0x0100000000010000, 0x0100010000010000, 0x0100000000010100, 0x0100010000010100, 0x0101000000010000, 0x0101010000010000, 0x0101000000010100, 0x0101010000010100, 0x0000000001000000, 0x0000010001000000, 0x0000000001000100, 0x0000010001000100, 0x0001000001000000, 0x0001010001000000, 0x0001000001000100, 0x0001010001000100, 0x0000000001010000, 0x0000010001010000, 0x0000000001010100, 0x0000010001010100, 0x0001000001010000, 0x0001010001010000, 0x0001000001010100, 0x0001010001010100, 0x0100000001000000, 0x0100010001000000, 0x0100000001000100, 0x0100010001000100, 0x0101000001000000, 0x0101010001000000, 0x0101000001000100, 0x0101010001000100, 0x0100000001010000, 0x0100010001010000, 0x0100000001010100, 0x0100010001010100, 0x0101000001010000, 0x0101010001010000, 0x0101000001010100, 0x0101010001010100, 0x0000000100000000, 0x0000010100000000, 0x0000000100000100, 0x0000010100000100, 0x0001000100000000, 0x0001010100000000, 0x0001000100000100, 0x0001010100000100, 0x0000000100010000, 0x0000010100010000, 0x0000000100010100, 0x0000010100010100, 0x0001000100010000, 0x0001010100010000, 0x0001000100010100, 0x0001010100010100, 0x0100000100000000, 0x0100010100000000, 0x0100000100000100, 0x0100010100000100, 0x0101000100000000, 0x0101010100000000, 0x0101000100000100, 0x0101010100000100, 0x0100000100010000, 0x0100010100010000, 0x0100000100010100, 0x0100010100010100, 0x0101000100010000, 0x0101010100010000, 0x0101000100010100, 0x0101010100010100, 0x0000000101000000, 0x0000010101000000, 0x0000000101000100, 0x0000010101000100, 0x0001000101000000, 0x0001010101000000, 0x0001000101000100, 0x0001010101000100, 0x0000000101010000, 0x0000010101010000, 0x0000000101010100, 0x0000010101010100, 0x0001000101010000, 0x0001010101010000, 0x0001000101010100, 0x0001010101010100, 0x0100000101000000, 0x0100010101000000, 0x0100000101000100, 0x0100010101000100, 0x0101000101000000, 0x0101010101000000, 0x0101000101000100, 0x0101010101000100, 0x0100000101010000, 0x0100010101010000, 0x0100000101010100, 0x0100010101010100, 0x0101000101010000, 0x0101010101010000, 0x0101000101010100, 0x0101010101010100, 0x0000000000000001, 0x0000010000000001, 0x0000000000000101, 0x0000010000000101, 0x0001000000000001, 0x0001010000000001, 0x0001000000000101, 0x0001010000000101, 0x0000000000010001, 0x0000010000010001, 0x0000000000010101, 0x0000010000010101, 0x0001000000010001, 0x0001010000010001, 0x0001000000010101, 0x0001010000010101, 0x0100000000000001, 0x0100010000000001, 0x0100000000000101, 0x0100010000000101, 0x0101000000000001, 0x0101010000000001, 0x0101000000000101, 0x0101010000000101, 0x0100000000010001, 0x0100010000010001, 0x0100000000010101, 0x0100010000010101, 0x0101000000010001, 0x0101010000010001, 0x0101000000010101, 0x0101010000010101, 0x0000000001000001, 0x0000010001000001, 0x0000000001000101, 0x0000010001000101, 0x0001000001000001, 0x0001010001000001, 0x0001000001000101, 0x0001010001000101, 0x0000000001010001, 0x0000010001010001, 0x0000000001010101, 0x0000010001010101, 0x0001000001010001, 0x0001010001010001, 0x0001000001010101, 0x0001010001010101, 0x0100000001000001, 0x0100010001000001, 0x0100000001000101, 0x0100010001000101, 0x0101000001000001, 0x0101010001000001, 0x0101000001000101, 0x0101010001000101, 0x0100000001010001, 0x0100010001010001, 0x0100000001010101, 0x0100010001010101, 0x0101000001010001, 0x0101010001010001, 0x0101000001010101, 0x0101010001010101, 0x0000000100000001, 0x0000010100000001, 0x0000000100000101, 0x0000010100000101, 0x0001000100000001, 0x0001010100000001, 0x0001000100000101, 0x0001010100000101, 0x0000000100010001, 0x0000010100010001, 0x0000000100010101, 0x0000010100010101, 0x0001000100010001, 0x0001010100010001, 0x0001000100010101, 0x0001010100010101, 0x0100000100000001, 0x0100010100000001, 0x0100000100000101, 0x0100010100000101, 0x0101000100000001, 0x0101010100000001, 0x0101000100000101, 0x0101010100000101, 0x0100000100010001, 0x0100010100010001, 0x0100000100010101, 0x0100010100010101, 0x0101000100010001, 0x0101010100010001, 0x0101000100010101, 0x0101010100010101, 0x0000000101000001, 0x0000010101000001, 0x0000000101000101, 0x0000010101000101, 0x0001000101000001, 0x0001010101000001, 0x0001000101000101, 0x0001010101000101, 0x0000000101010001, 0x0000010101010001, 0x0000000101010101, 0x0000010101010101, 0x0001000101010001, 0x0001010101010001, 0x0001000101010101, 0x0001010101010101, 0x0100000101000001, 0x0100010101000001, 0x0100000101000101, 0x0100010101000101, 0x0101000101000001, 0x0101010101000001, 0x0101000101000101, 0x0101010101000101, 0x0100000101010001, 0x0100010101010001, 0x0100000101010101, 0x0100010101010101, 0x0101000101010001, 0x0101010101010001, 0x0101000101010101, 0x0101010101010101 }; const uint64_t DES_FPTAB1[256] = { 0x0000000000000000, 0x0000000100000000, 0x0000000004000000, 0x0000000104000000, 0x0000000000040000, 0x0000000100040000, 0x0000000004040000, 0x0000000104040000, 0x0000000000000400, 0x0000000100000400, 0x0000000004000400, 0x0000000104000400, 0x0000000000040400, 0x0000000100040400, 0x0000000004040400, 0x0000000104040400, 0x0000000000000004, 0x0000000100000004, 0x0000000004000004, 0x0000000104000004, 0x0000000000040004, 0x0000000100040004, 0x0000000004040004, 0x0000000104040004, 0x0000000000000404, 0x0000000100000404, 0x0000000004000404, 0x0000000104000404, 0x0000000000040404, 0x0000000100040404, 0x0000000004040404, 0x0000000104040404, 0x0400000000000000, 0x0400000100000000, 0x0400000004000000, 0x0400000104000000, 0x0400000000040000, 0x0400000100040000, 0x0400000004040000, 0x0400000104040000, 0x0400000000000400, 0x0400000100000400, 0x0400000004000400, 0x0400000104000400, 0x0400000000040400, 0x0400000100040400, 0x0400000004040400, 0x0400000104040400, 0x0400000000000004, 0x0400000100000004, 0x0400000004000004, 0x0400000104000004, 0x0400000000040004, 0x0400000100040004, 0x0400000004040004, 0x0400000104040004, 0x0400000000000404, 0x0400000100000404, 0x0400000004000404, 0x0400000104000404, 0x0400000000040404, 0x0400000100040404, 0x0400000004040404, 0x0400000104040404, 0x0004000000000000, 0x0004000100000000, 0x0004000004000000, 0x0004000104000000, 0x0004000000040000, 0x0004000100040000, 0x0004000004040000, 0x0004000104040000, 0x0004000000000400, 0x0004000100000400, 0x0004000004000400, 0x0004000104000400, 0x0004000000040400, 0x0004000100040400, 0x0004000004040400, 0x0004000104040400, 0x0004000000000004, 0x0004000100000004, 0x0004000004000004, 0x0004000104000004, 0x0004000000040004, 0x0004000100040004, 0x0004000004040004, 0x0004000104040004, 0x0004000000000404, 0x0004000100000404, 0x0004000004000404, 0x0004000104000404, 0x0004000000040404, 0x0004000100040404, 0x0004000004040404, 0x0004000104040404, 0x0404000000000000, 0x0404000100000000, 0x0404000004000000, 0x0404000104000000, 0x0404000000040000, 0x0404000100040000, 0x0404000004040000, 0x0404000104040000, 0x0404000000000400, 0x0404000100000400, 0x0404000004000400, 0x0404000104000400, 0x0404000000040400, 0x0404000100040400, 0x0404000004040400, 0x0404000104040400, 0x0404000000000004, 0x0404000100000004, 0x0404000004000004, 0x0404000104000004, 0x0404000000040004, 0x0404000100040004, 0x0404000004040004, 0x0404000104040004, 0x0404000000000404, 0x0404000100000404, 0x0404000004000404, 0x0404000104000404, 0x0404000000040404, 0x0404000100040404, 0x0404000004040404, 0x0404000104040404, 0x0000040000000000, 0x0000040100000000, 0x0000040004000000, 0x0000040104000000, 0x0000040000040000, 0x0000040100040000, 0x0000040004040000, 0x0000040104040000, 0x0000040000000400, 0x0000040100000400, 0x0000040004000400, 0x0000040104000400, 0x0000040000040400, 0x0000040100040400, 0x0000040004040400, 0x0000040104040400, 0x0000040000000004, 0x0000040100000004, 0x0000040004000004, 0x0000040104000004, 0x0000040000040004, 0x0000040100040004, 0x0000040004040004, 0x0000040104040004, 0x0000040000000404, 0x0000040100000404, 0x0000040004000404, 0x0000040104000404, 0x0000040000040404, 0x0000040100040404, 0x0000040004040404, 0x0000040104040404, 0x0400040000000000, 0x0400040100000000, 0x0400040004000000, 0x0400040104000000, 0x0400040000040000, 0x0400040100040000, 0x0400040004040000, 0x0400040104040000, 0x0400040000000400, 0x0400040100000400, 0x0400040004000400, 0x0400040104000400, 0x0400040000040400, 0x0400040100040400, 0x0400040004040400, 0x0400040104040400, 0x0400040000000004, 0x0400040100000004, 0x0400040004000004, 0x0400040104000004, 0x0400040000040004, 0x0400040100040004, 0x0400040004040004, 0x0400040104040004, 0x0400040000000404, 0x0400040100000404, 0x0400040004000404, 0x0400040104000404, 0x0400040000040404, 0x0400040100040404, 0x0400040004040404, 0x0400040104040404, 0x0004040000000000, 0x0004040100000000, 0x0004040004000000, 0x0004040104000000, 0x0004040000040000, 0x0004040100040000, 0x0004040004040000, 0x0004040104040000, 0x0004040000000400, 0x0004040100000400, 0x0004040004000400, 0x0004040104000400, 0x0004040000040400, 0x0004040100040400, 0x0004040004040400, 0x0004040104040400, 0x0004040000000004, 0x0004040100000004, 0x0004040004000004, 0x0004040104000004, 0x0004040000040004, 0x0004040100040004, 0x0004040004040004, 0x0004040104040004, 0x0004040000000404, 0x0004040100000404, 0x0004040004000404, 0x0004040104000404, 0x0004040000040404, 0x0004040100040404, 0x0004040004040404, 0x0004040104040404, 0x0404040000000000, 0x0404040100000000, 0x0404040004000000, 0x0404040104000000, 0x0404040000040000, 0x0404040100040000, 0x0404040004040000, 0x0404040104040000, 0x0404040000000400, 0x0404040100000400, 0x0404040004000400, 0x0404040104000400, 0x0404040000040400, 0x0404040100040400, 0x0404040004040400, 0x0404040104040400, 0x0404040000000004, 0x0404040100000004, 0x0404040004000004, 0x0404040104000004, 0x0404040000040004, 0x0404040100040004, 0x0404040004040004, 0x0404040104040004, 0x0404040000000404, 0x0404040100000404, 0x0404040004000404, 0x0404040104000404, 0x0404040000040404, 0x0404040100040404, 0x0404040004040404, 0x0404040104040404 }; const uint64_t DES_FPTAB2[256] = { 0x0000000000000000, 0x0000004000000000, 0x0000000001000000, 0x0000004001000000, 0x0000000000010000, 0x0000004000010000, 0x0000000001010000, 0x0000004001010000, 0x0000000000000100, 0x0000004000000100, 0x0000000001000100, 0x0000004001000100, 0x0000000000010100, 0x0000004000010100, 0x0000000001010100, 0x0000004001010100, 0x0000000000000001, 0x0000004000000001, 0x0000000001000001, 0x0000004001000001, 0x0000000000010001, 0x0000004000010001, 0x0000000001010001, 0x0000004001010001, 0x0000000000000101, 0x0000004000000101, 0x0000000001000101, 0x0000004001000101, 0x0000000000010101, 0x0000004000010101, 0x0000000001010101, 0x0000004001010101, 0x0100000000000000, 0x0100004000000000, 0x0100000001000000, 0x0100004001000000, 0x0100000000010000, 0x0100004000010000, 0x0100000001010000, 0x0100004001010000, 0x0100000000000100, 0x0100004000000100, 0x0100000001000100, 0x0100004001000100, 0x0100000000010100, 0x0100004000010100, 0x0100000001010100, 0x0100004001010100, 0x0100000000000001, 0x0100004000000001, 0x0100000001000001, 0x0100004001000001, 0x0100000000010001, 0x0100004000010001, 0x0100000001010001, 0x0100004001010001, 0x0100000000000101, 0x0100004000000101, 0x0100000001000101, 0x0100004001000101, 0x0100000000010101, 0x0100004000010101, 0x0100000001010101, 0x0100004001010101, 0x0001000000000000, 0x0001004000000000, 0x0001000001000000, 0x0001004001000000, 0x0001000000010000, 0x0001004000010000, 0x0001000001010000, 0x0001004001010000, 0x0001000000000100, 0x0001004000000100, 0x0001000001000100, 0x0001004001000100, 0x0001000000010100, 0x0001004000010100, 0x0001000001010100, 0x0001004001010100, 0x0001000000000001, 0x0001004000000001, 0x0001000001000001, 0x0001004001000001, 0x0001000000010001, 0x0001004000010001, 0x0001000001010001, 0x0001004001010001, 0x0001000000000101, 0x0001004000000101, 0x0001000001000101, 0x0001004001000101, 0x0001000000010101, 0x0001004000010101, 0x0001000001010101, 0x0001004001010101, 0x0101000000000000, 0x0101004000000000, 0x0101000001000000, 0x0101004001000000, 0x0101000000010000, 0x0101004000010000, 0x0101000001010000, 0x0101004001010000, 0x0101000000000100, 0x0101004000000100, 0x0101000001000100, 0x0101004001000100, 0x0101000000010100, 0x0101004000010100, 0x0101000001010100, 0x0101004001010100, 0x0101000000000001, 0x0101004000000001, 0x0101000001000001, 0x0101004001000001, 0x0101000000010001, 0x0101004000010001, 0x0101000001010001, 0x0101004001010001, 0x0101000000000101, 0x0101004000000101, 0x0101000001000101, 0x0101004001000101, 0x0101000000010101, 0x0101004000010101, 0x0101000001010101, 0x0101004001010101, 0x0000010000000000, 0x0000014000000000, 0x0000010001000000, 0x0000014001000000, 0x0000010000010000, 0x0000014000010000, 0x0000010001010000, 0x0000014001010000, 0x0000010000000100, 0x0000014000000100, 0x0000010001000100, 0x0000014001000100, 0x0000010000010100, 0x0000014000010100, 0x0000010001010100, 0x0000014001010100, 0x0000010000000001, 0x0000014000000001, 0x0000010001000001, 0x0000014001000001, 0x0000010000010001, 0x0000014000010001, 0x0000010001010001, 0x0000014001010001, 0x0000010000000101, 0x0000014000000101, 0x0000010001000101, 0x0000014001000101, 0x0000010000010101, 0x0000014000010101, 0x0000010001010101, 0x0000014001010101, 0x0100010000000000, 0x0100014000000000, 0x0100010001000000, 0x0100014001000000, 0x0100010000010000, 0x0100014000010000, 0x0100010001010000, 0x0100014001010000, 0x0100010000000100, 0x0100014000000100, 0x0100010001000100, 0x0100014001000100, 0x0100010000010100, 0x0100014000010100, 0x0100010001010100, 0x0100014001010100, 0x0100010000000001, 0x0100014000000001, 0x0100010001000001, 0x0100014001000001, 0x0100010000010001, 0x0100014000010001, 0x0100010001010001, 0x0100014001010001, 0x0100010000000101, 0x0100014000000101, 0x0100010001000101, 0x0100014001000101, 0x0100010000010101, 0x0100014000010101, 0x0100010001010101, 0x0100014001010101, 0x0001010000000000, 0x0001014000000000, 0x0001010001000000, 0x0001014001000000, 0x0001010000010000, 0x0001014000010000, 0x0001010001010000, 0x0001014001010000, 0x0001010000000100, 0x0001014000000100, 0x0001010001000100, 0x0001014001000100, 0x0001010000010100, 0x0001014000010100, 0x0001010001010100, 0x0001014001010100, 0x0001010000000001, 0x0001014000000001, 0x0001010001000001, 0x0001014001000001, 0x0001010000010001, 0x0001014000010001, 0x0001010001010001, 0x0001014001010001, 0x0001010000000101, 0x0001014000000101, 0x0001010001000101, 0x0001014001000101, 0x0001010000010101, 0x0001014000010101, 0x0001010001010101, 0x0001014001010101, 0x0101010000000000, 0x0101014000000000, 0x0101010001000000, 0x0101014001000000, 0x0101010000010000, 0x0101014000010000, 0x0101010001010000, 0x0101014001010000, 0x0101010000000100, 0x0101014000000100, 0x0101010001000100, 0x0101014001000100, 0x0101010000010100, 0x0101014000010100, 0x0101010001010100, 0x0101014001010100, 0x0101010000000001, 0x0101014000000001, 0x0101010001000001, 0x0101014001000001, 0x0101010000010001, 0x0101014000010001, 0x0101010001010001, 0x0101014001010001, 0x0101010000000101, 0x0101014000000101, 0x0101010001000101, 0x0101014001000101, 0x0101010000010101, 0x0101014000010101, 0x0101010001010101, 0x0101014001010101 }; } botan-2.4.0/src/lib/block/des/desx.cpp000066400000000000000000000022351322470703100174720ustar00rootroot00000000000000/* * DES * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* * DESX Encryption */ void DESX::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_K1.empty() == false); for(size_t i = 0; i != blocks; ++i) { xor_buf(out, in, m_K1.data(), BLOCK_SIZE); m_des.encrypt(out); xor_buf(out, m_K2.data(), BLOCK_SIZE); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * DESX Decryption */ void DESX::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_K1.empty() == false); for(size_t i = 0; i != blocks; ++i) { xor_buf(out, in, m_K2.data(), BLOCK_SIZE); m_des.decrypt(out); xor_buf(out, m_K1.data(), BLOCK_SIZE); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * DESX Key Schedule */ void DESX::key_schedule(const uint8_t key[], size_t) { m_K1.assign(key, key + 8); m_des.set_key(key + 8, 8); m_K2.assign(key + 16, key + 24); } void DESX::clear() { m_des.clear(); zap(m_K1); zap(m_K2); } } botan-2.4.0/src/lib/block/des/desx.h000066400000000000000000000014211322470703100171330ustar00rootroot00000000000000/* * DESX * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DESX_H_ #define BOTAN_DESX_H_ #include namespace Botan { /** * DESX */ class BOTAN_PUBLIC_API(2,0) DESX final : public Block_Cipher_Fixed_Params<8, 24> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "DESX"; } BlockCipher* clone() const override { return new DESX; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_K1, m_K2; DES m_des; }; } #endif botan-2.4.0/src/lib/block/des/info.txt000066400000000000000000000000451322470703100175140ustar00rootroot00000000000000 DES -> 20131128 botan-2.4.0/src/lib/block/gost_28147/000077500000000000000000000000001322470703100167675ustar00rootroot00000000000000botan-2.4.0/src/lib/block/gost_28147/gost_28147.cpp000066400000000000000000000125371322470703100212240ustar00rootroot00000000000000/* * GOST 28147-89 * (C) 1999-2009,2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { uint8_t GOST_28147_89_Params::sbox_entry(size_t row, size_t col) const { const uint8_t x = m_sboxes[4 * col + (row / 2)]; return (row % 2 == 0) ? (x >> 4) : (x & 0x0F); } uint8_t GOST_28147_89_Params::sbox_pair(size_t row, size_t col) const { const uint8_t x = m_sboxes[4 * (col % 16) + row]; const uint8_t y = m_sboxes[4 * (col / 16) + row]; return (x >> 4) | (y << 4); } GOST_28147_89_Params::GOST_28147_89_Params(const std::string& n) : m_name(n) { // Encoded in the packed fromat from RFC 4357 // GostR3411_94_TestParamSet (OID 1.2.643.2.2.31.0) static const uint8_t GOST_R_3411_TEST_PARAMS[64] = { 0x4E, 0x57, 0x64, 0xD1, 0xAB, 0x8D, 0xCB, 0xBF, 0x94, 0x1A, 0x7A, 0x4D, 0x2C, 0xD1, 0x10, 0x10, 0xD6, 0xA0, 0x57, 0x35, 0x8D, 0x38, 0xF2, 0xF7, 0x0F, 0x49, 0xD1, 0x5A, 0xEA, 0x2F, 0x8D, 0x94, 0x62, 0xEE, 0x43, 0x09, 0xB3, 0xF4, 0xA6, 0xA2, 0x18, 0xC6, 0x98, 0xE3, 0xC1, 0x7C, 0xE5, 0x7E, 0x70, 0x6B, 0x09, 0x66, 0xF7, 0x02, 0x3C, 0x8B, 0x55, 0x95, 0xBF, 0x28, 0x39, 0xB3, 0x2E, 0xCC }; // GostR3411-94-CryptoProParamSet (OID 1.2.643.2.2.31.1) static const uint8_t GOST_R_3411_CRYPTOPRO_PARAMS[64] = { 0xA5, 0x74, 0x77, 0xD1, 0x4F, 0xFA, 0x66, 0xE3, 0x54, 0xC7, 0x42, 0x4A, 0x60, 0xEC, 0xB4, 0x19, 0x82, 0x90, 0x9D, 0x75, 0x1D, 0x4F, 0xC9, 0x0B, 0x3B, 0x12, 0x2F, 0x54, 0x79, 0x08, 0xA0, 0xAF, 0xD1, 0x3E, 0x1A, 0x38, 0xC7, 0xB1, 0x81, 0xC6, 0xE6, 0x56, 0x05, 0x87, 0x03, 0x25, 0xEB, 0xFE, 0x9C, 0x6D, 0xF8, 0x6D, 0x2E, 0xAB, 0xDE, 0x20, 0xBA, 0x89, 0x3C, 0x92, 0xF8, 0xD3, 0x53, 0xBC }; if(m_name == "R3411_94_TestParam") m_sboxes = GOST_R_3411_TEST_PARAMS; else if(m_name == "R3411_CryptoPro") m_sboxes = GOST_R_3411_CRYPTOPRO_PARAMS; else throw Invalid_Argument("GOST_28147_89_Params: Unknown " + m_name); } /* * GOST Constructor */ GOST_28147_89::GOST_28147_89(const GOST_28147_89_Params& param) : m_SBOX(1024) { // Convert the parallel 4x4 sboxes into larger word-based sboxes for(size_t i = 0; i != 256; ++i) { m_SBOX[i ] = rotl<11, uint32_t>(param.sbox_pair(0, i)); m_SBOX[i+256] = rotl<19, uint32_t>(param.sbox_pair(1, i)); m_SBOX[i+512] = rotl<27, uint32_t>(param.sbox_pair(2, i)); m_SBOX[i+768] = rotl< 3, uint32_t>(param.sbox_pair(3, i)); } } std::string GOST_28147_89::name() const { /* 'Guess' the right name for the sbox on the basis of the values. This would need to be updated if support for other sbox parameters is added. Preferably, we would just store the string value in the constructor, but can't break binary compat. */ std::string sbox_name = ""; if(m_SBOX[0] == 0x00072000) sbox_name = "R3411_94_TestParam"; else if(m_SBOX[0] == 0x0002D000) sbox_name = "R3411_CryptoPro"; else throw Internal_Error("GOST-28147 unrecognized sbox value"); return "GOST-28147-89(" + sbox_name + ")"; } /* * Two rounds of GOST */ #define GOST_2ROUND(N1, N2, R1, R2) \ do { \ uint32_t T0 = N1 + m_EK[R1]; \ N2 ^= m_SBOX[get_byte(3, T0)] | \ m_SBOX[get_byte(2, T0)+256] | \ m_SBOX[get_byte(1, T0)+512] | \ m_SBOX[get_byte(0, T0)+768]; \ \ uint32_t T1 = N2 + m_EK[R2]; \ N1 ^= m_SBOX[get_byte(3, T1)] | \ m_SBOX[get_byte(2, T1)+256] | \ m_SBOX[get_byte(1, T1)+512] | \ m_SBOX[get_byte(0, T1)+768]; \ } while(0) /* * GOST Encryption */ void GOST_28147_89::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t N1 = load_le(in, 0); uint32_t N2 = load_le(in, 1); for(size_t j = 0; j != 3; ++j) { GOST_2ROUND(N1, N2, 0, 1); GOST_2ROUND(N1, N2, 2, 3); GOST_2ROUND(N1, N2, 4, 5); GOST_2ROUND(N1, N2, 6, 7); } GOST_2ROUND(N1, N2, 7, 6); GOST_2ROUND(N1, N2, 5, 4); GOST_2ROUND(N1, N2, 3, 2); GOST_2ROUND(N1, N2, 1, 0); store_le(out, N2, N1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * GOST Decryption */ void GOST_28147_89::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t N1 = load_le(in, 0); uint32_t N2 = load_le(in, 1); GOST_2ROUND(N1, N2, 0, 1); GOST_2ROUND(N1, N2, 2, 3); GOST_2ROUND(N1, N2, 4, 5); GOST_2ROUND(N1, N2, 6, 7); for(size_t j = 0; j != 3; ++j) { GOST_2ROUND(N1, N2, 7, 6); GOST_2ROUND(N1, N2, 5, 4); GOST_2ROUND(N1, N2, 3, 2); GOST_2ROUND(N1, N2, 1, 0); } store_le(out, N2, N1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * GOST Key Schedule */ void GOST_28147_89::key_schedule(const uint8_t key[], size_t) { m_EK.resize(8); for(size_t i = 0; i != 8; ++i) m_EK[i] = load_le(key, i); } void GOST_28147_89::clear() { zap(m_EK); } } botan-2.4.0/src/lib/block/gost_28147/gost_28147.h000066400000000000000000000050141322470703100206610ustar00rootroot00000000000000/* * GOST 28147-89 * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GOST_28147_89_H_ #define BOTAN_GOST_28147_89_H_ #include namespace Botan { /** * The GOST 28147-89 block cipher uses a set of 4 bit Sboxes, however * the standard does not actually define these Sboxes; they are * considered a local configuration issue. Several different sets are * used. */ class BOTAN_PUBLIC_API(2,0) GOST_28147_89_Params final { public: /** * @param row the row * @param col the column * @return sbox entry at this row/column */ uint8_t sbox_entry(size_t row, size_t col) const; /** * @return name of this parameter set */ std::string param_name() const { return m_name; } /** * Return a representation used for building larger tables * For internal use */ uint8_t sbox_pair(size_t row, size_t col) const; /** * Default GOST parameters are the ones given in GOST R 34.11 for * testing purposes; these sboxes are also used by Crypto++, and, * at least according to Wikipedia, the Central Bank of Russian * Federation * @param name of the parameter set */ explicit GOST_28147_89_Params(const std::string& name = "R3411_94_TestParam"); private: const uint8_t* m_sboxes; std::string m_name; }; /** * GOST 28147-89 */ class BOTAN_PUBLIC_API(2,0) GOST_28147_89 final : public Block_Cipher_Fixed_Params<8, 32> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override; BlockCipher* clone() const override { return new GOST_28147_89(m_SBOX); } /** * @param params the sbox parameters to use */ explicit GOST_28147_89(const GOST_28147_89_Params& params); explicit GOST_28147_89(const std::string& param_name) : GOST_28147_89(GOST_28147_89_Params(param_name)) {} private: explicit GOST_28147_89(const std::vector& other_SBOX) : m_SBOX(other_SBOX), m_EK(8) {} void key_schedule(const uint8_t[], size_t) override; /* * The sbox is not secret, this is just a larger expansion of it * which we generate at runtime for faster execution */ std::vector m_SBOX; secure_vector m_EK; }; } #endif botan-2.4.0/src/lib/block/gost_28147/info.txt000066400000000000000000000000571322470703100204650ustar00rootroot00000000000000 GOST_28147_89 -> 20131128 botan-2.4.0/src/lib/block/idea/000077500000000000000000000000001322470703100161505ustar00rootroot00000000000000botan-2.4.0/src/lib/block/idea/idea.cpp000066400000000000000000000114501322470703100175570ustar00rootroot00000000000000/* * IDEA * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { /* * Multiplication modulo 65537 */ inline uint16_t mul(uint16_t x, uint16_t y) { const uint32_t P = static_cast(x) * y; const uint16_t Z_mask = static_cast(CT::expand_mask(P) & 0xFFFF); const uint32_t P_hi = P >> 16; const uint32_t P_lo = P & 0xFFFF; const uint16_t carry = (P_lo < P_hi); const uint16_t r_1 = static_cast((P_lo - P_hi) + carry); const uint16_t r_2 = 1 - x - y; return CT::select(Z_mask, r_1, r_2); } /* * Find multiplicative inverses modulo 65537 * * 65537 is prime; thus Fermat's little theorem tells us that * x^65537 == x modulo 65537, which means * x^(65537-2) == x^-1 modulo 65537 since * x^(65537-2) * x == 1 mod 65537 * * Do the exponentiation with a basic square and multiply: all bits are * of exponent are 1 so we always multiply */ uint16_t mul_inv(uint16_t x) { uint16_t y = x; for(size_t i = 0; i != 15; ++i) { y = mul(y, y); // square y = mul(y, x); } return y; } /** * IDEA is involutional, depending only on the key schedule */ void idea_op(const uint8_t in[], uint8_t out[], size_t blocks, const uint16_t K[52]) { const size_t BLOCK_SIZE = 8; CT::poison(in, blocks * 8); CT::poison(out, blocks * 8); CT::poison(K, 52); BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks; ++i) { uint16_t X1, X2, X3, X4; load_be(in + BLOCK_SIZE*i, X1, X2, X3, X4); for(size_t j = 0; j != 8; ++j) { X1 = mul(X1, K[6*j+0]); X2 += K[6*j+1]; X3 += K[6*j+2]; X4 = mul(X4, K[6*j+3]); uint16_t T0 = X3; X3 = mul(X3 ^ X1, K[6*j+4]); uint16_t T1 = X2; X2 = mul((X2 ^ X4) + X3, K[6*j+5]); X3 += X2; X1 ^= X2; X4 ^= X3; X2 ^= T0; X3 ^= T1; } X1 = mul(X1, K[48]); X2 += K[50]; X3 += K[49]; X4 = mul(X4, K[51]); store_be(out + BLOCK_SIZE*i, X1, X3, X2, X4); } CT::unpoison(in, blocks * 8); CT::unpoison(out, blocks * 8); CT::unpoison(K, 52); } } size_t IDEA::parallelism() const { #if defined(BOTAN_HAS_IDEA_SSE2) if(CPUID::has_sse2()) { return 8; } #endif return 1; } std::string IDEA::provider() const { #if defined(BOTAN_HAS_IDEA_SSE2) if(CPUID::has_sse2()) { return "sse2"; } #endif return "base"; } /* * IDEA Encryption */ void IDEA::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); #if defined(BOTAN_HAS_IDEA_SSE2) if(CPUID::has_sse2()) { while(blocks >= 8) { sse2_idea_op_8(in, out, m_EK.data()); in += 8 * BLOCK_SIZE; out += 8 * BLOCK_SIZE; blocks -= 8; } } #endif idea_op(in, out, blocks, m_EK.data()); } /* * IDEA Decryption */ void IDEA::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_DK.empty() == false); #if defined(BOTAN_HAS_IDEA_SSE2) if(CPUID::has_sse2()) { while(blocks >= 8) { sse2_idea_op_8(in, out, m_DK.data()); in += 8 * BLOCK_SIZE; out += 8 * BLOCK_SIZE; blocks -= 8; } } #endif idea_op(in, out, blocks, m_DK.data()); } /* * IDEA Key Schedule */ void IDEA::key_schedule(const uint8_t key[], size_t) { m_EK.resize(52); m_DK.resize(52); CT::poison(key, 16); CT::poison(m_EK.data(), 52); CT::poison(m_DK.data(), 52); for(size_t i = 0; i != 8; ++i) m_EK[i] = load_be(key, i); for(size_t i = 1, j = 8, offset = 0; j != 52; i %= 8, ++i, ++j) { m_EK[i+7+offset] = static_cast((m_EK[(i % 8) + offset] << 9) | (m_EK[((i+1) % 8) + offset] >> 7)); offset += (i == 8) ? 8 : 0; } m_DK[51] = mul_inv(m_EK[3]); m_DK[50] = -m_EK[2]; m_DK[49] = -m_EK[1]; m_DK[48] = mul_inv(m_EK[0]); for(size_t i = 1, j = 4, counter = 47; i != 8; ++i, j += 6) { m_DK[counter--] = m_EK[j+1]; m_DK[counter--] = m_EK[j]; m_DK[counter--] = mul_inv(m_EK[j+5]); m_DK[counter--] = -m_EK[j+3]; m_DK[counter--] = -m_EK[j+4]; m_DK[counter--] = mul_inv(m_EK[j+2]); } m_DK[5] = m_EK[47]; m_DK[4] = m_EK[46]; m_DK[3] = mul_inv(m_EK[51]); m_DK[2] = -m_EK[50]; m_DK[1] = -m_EK[49]; m_DK[0] = mul_inv(m_EK[48]); CT::unpoison(key, 16); CT::unpoison(m_EK.data(), 52); CT::unpoison(m_DK.data(), 52); } void IDEA::clear() { zap(m_EK); zap(m_DK); } } botan-2.4.0/src/lib/block/idea/idea.h000066400000000000000000000017551322470703100172330ustar00rootroot00000000000000/* * IDEA * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_IDEA_H_ #define BOTAN_IDEA_H_ #include namespace Botan { /** * IDEA */ class BOTAN_PUBLIC_API(2,0) IDEA final : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string provider() const override; std::string name() const override { return "IDEA"; } BlockCipher* clone() const override { return new IDEA; } size_t parallelism() const override; private: #if defined(BOTAN_HAS_IDEA_SSE2) void sse2_idea_op_8(const uint8_t in[64], uint8_t out[64], const uint16_t EK[52]) const; #endif void key_schedule(const uint8_t[], size_t) override; secure_vector m_EK, m_DK; }; } #endif botan-2.4.0/src/lib/block/idea/idea_sse2/000077500000000000000000000000001322470703100200065ustar00rootroot00000000000000botan-2.4.0/src/lib/block/idea/idea_sse2/idea_sse2.cpp000066400000000000000000000143241322470703100223540ustar00rootroot00000000000000/* * IDEA in SSE2 * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { BOTAN_FUNC_ISA("sse2") inline __m128i mul(__m128i X, uint16_t K_16) { const __m128i zeros = _mm_set1_epi16(0); const __m128i ones = _mm_set1_epi16(1); const __m128i K = _mm_set1_epi16(K_16); const __m128i X_is_zero = _mm_cmpeq_epi16(X, zeros); const __m128i K_is_zero = _mm_cmpeq_epi16(K, zeros); const __m128i mul_lo = _mm_mullo_epi16(X, K); const __m128i mul_hi = _mm_mulhi_epu16(X, K); __m128i T = _mm_sub_epi16(mul_lo, mul_hi); // Unsigned compare; cmp = 1 if mul_lo < mul_hi else 0 const __m128i subs = _mm_subs_epu16(mul_hi, mul_lo); const __m128i cmp = _mm_min_epu8( _mm_or_si128(subs, _mm_srli_epi16(subs, 8)), ones); T = _mm_add_epi16(T, cmp); /* Selection: if X[i] is zero then assign 1-K if K is zero then assign 1-X[i] Could if() off value of K_16 for the second, but this gives a constant time implementation which is a nice bonus. */ T = _mm_or_si128( _mm_andnot_si128(X_is_zero, T), _mm_and_si128(_mm_sub_epi16(ones, K), X_is_zero)); T = _mm_or_si128( _mm_andnot_si128(K_is_zero, T), _mm_and_si128(_mm_sub_epi16(ones, X), K_is_zero)); return T; } /* * 4x8 matrix transpose * * FIXME: why do I need the extra set of unpack_epi32 here? Inverse in * transpose_out doesn't need it. Something with the shuffle? Removing * that extra unpack could easily save 3-4 cycles per block, and would * also help a lot with register pressure on 32-bit x86 */ BOTAN_FUNC_ISA("sse2") void transpose_in(__m128i& B0, __m128i& B1, __m128i& B2, __m128i& B3) { __m128i T0 = _mm_unpackhi_epi32(B0, B1); __m128i T1 = _mm_unpacklo_epi32(B0, B1); __m128i T2 = _mm_unpackhi_epi32(B2, B3); __m128i T3 = _mm_unpacklo_epi32(B2, B3); __m128i T4 = _mm_unpacklo_epi32(T0, T1); __m128i T5 = _mm_unpackhi_epi32(T0, T1); __m128i T6 = _mm_unpacklo_epi32(T2, T3); __m128i T7 = _mm_unpackhi_epi32(T2, T3); T0 = _mm_shufflehi_epi16(T4, _MM_SHUFFLE(1, 3, 0, 2)); T1 = _mm_shufflehi_epi16(T5, _MM_SHUFFLE(1, 3, 0, 2)); T2 = _mm_shufflehi_epi16(T6, _MM_SHUFFLE(1, 3, 0, 2)); T3 = _mm_shufflehi_epi16(T7, _MM_SHUFFLE(1, 3, 0, 2)); T0 = _mm_shufflelo_epi16(T0, _MM_SHUFFLE(1, 3, 0, 2)); T1 = _mm_shufflelo_epi16(T1, _MM_SHUFFLE(1, 3, 0, 2)); T2 = _mm_shufflelo_epi16(T2, _MM_SHUFFLE(1, 3, 0, 2)); T3 = _mm_shufflelo_epi16(T3, _MM_SHUFFLE(1, 3, 0, 2)); T0 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shuffle_epi32(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shuffle_epi32(T3, _MM_SHUFFLE(3, 1, 2, 0)); B0 = _mm_unpacklo_epi64(T0, T2); B1 = _mm_unpackhi_epi64(T0, T2); B2 = _mm_unpacklo_epi64(T1, T3); B3 = _mm_unpackhi_epi64(T1, T3); } /* * 4x8 matrix transpose (reverse) */ BOTAN_FUNC_ISA("sse2") void transpose_out(__m128i& B0, __m128i& B1, __m128i& B2, __m128i& B3) { __m128i T0 = _mm_unpacklo_epi64(B0, B1); __m128i T1 = _mm_unpacklo_epi64(B2, B3); __m128i T2 = _mm_unpackhi_epi64(B0, B1); __m128i T3 = _mm_unpackhi_epi64(B2, B3); T0 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shuffle_epi32(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shuffle_epi32(T3, _MM_SHUFFLE(3, 1, 2, 0)); T0 = _mm_shufflehi_epi16(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shufflehi_epi16(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shufflehi_epi16(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shufflehi_epi16(T3, _MM_SHUFFLE(3, 1, 2, 0)); T0 = _mm_shufflelo_epi16(T0, _MM_SHUFFLE(3, 1, 2, 0)); T1 = _mm_shufflelo_epi16(T1, _MM_SHUFFLE(3, 1, 2, 0)); T2 = _mm_shufflelo_epi16(T2, _MM_SHUFFLE(3, 1, 2, 0)); T3 = _mm_shufflelo_epi16(T3, _MM_SHUFFLE(3, 1, 2, 0)); B0 = _mm_unpacklo_epi32(T0, T1); B1 = _mm_unpackhi_epi32(T0, T1); B2 = _mm_unpacklo_epi32(T2, T3); B3 = _mm_unpackhi_epi32(T2, T3); } } /* * 8 wide IDEA encryption/decryption in SSE2 */ BOTAN_FUNC_ISA("sse2") void IDEA::sse2_idea_op_8(const uint8_t in[64], uint8_t out[64], const uint16_t EK[52]) const { CT::poison(in, 64); CT::poison(out, 64); CT::poison(EK, 52); const __m128i* in_mm = reinterpret_cast(in); __m128i B0 = _mm_loadu_si128(in_mm + 0); __m128i B1 = _mm_loadu_si128(in_mm + 1); __m128i B2 = _mm_loadu_si128(in_mm + 2); __m128i B3 = _mm_loadu_si128(in_mm + 3); transpose_in(B0, B1, B2, B3); // byte swap B0 = _mm_or_si128(_mm_slli_epi16(B0, 8), _mm_srli_epi16(B0, 8)); B1 = _mm_or_si128(_mm_slli_epi16(B1, 8), _mm_srli_epi16(B1, 8)); B2 = _mm_or_si128(_mm_slli_epi16(B2, 8), _mm_srli_epi16(B2, 8)); B3 = _mm_or_si128(_mm_slli_epi16(B3, 8), _mm_srli_epi16(B3, 8)); for(size_t i = 0; i != 8; ++i) { B0 = mul(B0, EK[6*i+0]); B1 = _mm_add_epi16(B1, _mm_set1_epi16(EK[6*i+1])); B2 = _mm_add_epi16(B2, _mm_set1_epi16(EK[6*i+2])); B3 = mul(B3, EK[6*i+3]); __m128i T0 = B2; B2 = _mm_xor_si128(B2, B0); B2 = mul(B2, EK[6*i+4]); __m128i T1 = B1; B1 = _mm_xor_si128(B1, B3); B1 = _mm_add_epi16(B1, B2); B1 = mul(B1, EK[6*i+5]); B2 = _mm_add_epi16(B2, B1); B0 = _mm_xor_si128(B0, B1); B1 = _mm_xor_si128(B1, T0); B3 = _mm_xor_si128(B3, B2); B2 = _mm_xor_si128(B2, T1); } B0 = mul(B0, EK[48]); B1 = _mm_add_epi16(B1, _mm_set1_epi16(EK[50])); B2 = _mm_add_epi16(B2, _mm_set1_epi16(EK[49])); B3 = mul(B3, EK[51]); // byte swap B0 = _mm_or_si128(_mm_slli_epi16(B0, 8), _mm_srli_epi16(B0, 8)); B1 = _mm_or_si128(_mm_slli_epi16(B1, 8), _mm_srli_epi16(B1, 8)); B2 = _mm_or_si128(_mm_slli_epi16(B2, 8), _mm_srli_epi16(B2, 8)); B3 = _mm_or_si128(_mm_slli_epi16(B3, 8), _mm_srli_epi16(B3, 8)); transpose_out(B0, B2, B1, B3); __m128i* out_mm = reinterpret_cast<__m128i*>(out); _mm_storeu_si128(out_mm + 0, B0); _mm_storeu_si128(out_mm + 1, B2); _mm_storeu_si128(out_mm + 2, B1); _mm_storeu_si128(out_mm + 3, B3); CT::unpoison(in, 64); CT::unpoison(out, 64); CT::unpoison(EK, 52); } } botan-2.4.0/src/lib/block/idea/idea_sse2/info.txt000066400000000000000000000000721322470703100215010ustar00rootroot00000000000000 IDEA_SSE2 -> 20131128 need_isa sse2 botan-2.4.0/src/lib/block/idea/info.txt000066400000000000000000000000461322470703100176440ustar00rootroot00000000000000 IDEA -> 20131128 botan-2.4.0/src/lib/block/info.txt000066400000000000000000000001371322470703100167430ustar00rootroot00000000000000 BLOCK_CIPHER -> 20131128 block_cipher.h botan-2.4.0/src/lib/block/kasumi/000077500000000000000000000000001322470703100165375ustar00rootroot00000000000000botan-2.4.0/src/lib/block/kasumi/info.txt000066400000000000000000000000501322470703100202260ustar00rootroot00000000000000 KASUMI -> 20131128 botan-2.4.0/src/lib/block/kasumi/kasumi.cpp000066400000000000000000000210361322470703100205360ustar00rootroot00000000000000/* * KASUMI * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { /* * KASUMI S-Boxes */ const uint8_t KASUMI_SBOX_S7[128] = { 0x36, 0x32, 0x3E, 0x38, 0x16, 0x22, 0x5E, 0x60, 0x26, 0x06, 0x3F, 0x5D, 0x02, 0x12, 0x7B, 0x21, 0x37, 0x71, 0x27, 0x72, 0x15, 0x43, 0x41, 0x0C, 0x2F, 0x49, 0x2E, 0x1B, 0x19, 0x6F, 0x7C, 0x51, 0x35, 0x09, 0x79, 0x4F, 0x34, 0x3C, 0x3A, 0x30, 0x65, 0x7F, 0x28, 0x78, 0x68, 0x46, 0x47, 0x2B, 0x14, 0x7A, 0x48, 0x3D, 0x17, 0x6D, 0x0D, 0x64, 0x4D, 0x01, 0x10, 0x07, 0x52, 0x0A, 0x69, 0x62, 0x75, 0x74, 0x4C, 0x0B, 0x59, 0x6A, 0x00, 0x7D, 0x76, 0x63, 0x56, 0x45, 0x1E, 0x39, 0x7E, 0x57, 0x70, 0x33, 0x11, 0x05, 0x5F, 0x0E, 0x5A, 0x54, 0x5B, 0x08, 0x23, 0x67, 0x20, 0x61, 0x1C, 0x42, 0x66, 0x1F, 0x1A, 0x2D, 0x4B, 0x04, 0x55, 0x5C, 0x25, 0x4A, 0x50, 0x31, 0x44, 0x1D, 0x73, 0x2C, 0x40, 0x6B, 0x6C, 0x18, 0x6E, 0x53, 0x24, 0x4E, 0x2A, 0x13, 0x0F, 0x29, 0x58, 0x77, 0x3B, 0x03 }; const uint16_t KASUMI_SBOX_S9[512] = { 0x00A7, 0x00EF, 0x00A1, 0x017B, 0x0187, 0x014E, 0x0009, 0x0152, 0x0026, 0x00E2, 0x0030, 0x0166, 0x01C4, 0x0181, 0x005A, 0x018D, 0x00B7, 0x00FD, 0x0093, 0x014B, 0x019F, 0x0154, 0x0033, 0x016A, 0x0132, 0x01F4, 0x0106, 0x0052, 0x00D8, 0x009F, 0x0164, 0x00B1, 0x00AF, 0x00F1, 0x01E9, 0x0025, 0x00CE, 0x0011, 0x0000, 0x014D, 0x002C, 0x00FE, 0x017A, 0x003A, 0x008F, 0x00DC, 0x0051, 0x0190, 0x005F, 0x0003, 0x013B, 0x00F5, 0x0036, 0x00EB, 0x00DA, 0x0195, 0x01D8, 0x0108, 0x00AC, 0x01EE, 0x0173, 0x0122, 0x018F, 0x004C, 0x00A5, 0x00C5, 0x018B, 0x0079, 0x0101, 0x01E0, 0x01A7, 0x00D4, 0x00F0, 0x001C, 0x01CE, 0x00B0, 0x0196, 0x01FB, 0x0120, 0x00DF, 0x01F5, 0x0197, 0x00F9, 0x0109, 0x0059, 0x00BA, 0x00DD, 0x01AC, 0x00A4, 0x004A, 0x01B8, 0x00C4, 0x01CA, 0x01A5, 0x015E, 0x00A3, 0x00E8, 0x009E, 0x0086, 0x0162, 0x000D, 0x00FA, 0x01EB, 0x008E, 0x00BF, 0x0045, 0x00C1, 0x01A9, 0x0098, 0x00E3, 0x016E, 0x0087, 0x0158, 0x012C, 0x0114, 0x00F2, 0x01B5, 0x0140, 0x0071, 0x0116, 0x000B, 0x00F3, 0x0057, 0x013D, 0x0024, 0x005D, 0x01F0, 0x001B, 0x01E7, 0x01BE, 0x01E2, 0x0029, 0x0044, 0x009C, 0x01C9, 0x0083, 0x0146, 0x0193, 0x0153, 0x0014, 0x0027, 0x0073, 0x01BA, 0x007C, 0x01DB, 0x0180, 0x01FC, 0x0035, 0x0070, 0x00AA, 0x01DF, 0x0097, 0x007E, 0x00A9, 0x0049, 0x010C, 0x0117, 0x0141, 0x00A8, 0x016C, 0x016B, 0x0124, 0x002E, 0x01F3, 0x0189, 0x0147, 0x0144, 0x0018, 0x01C8, 0x010B, 0x009D, 0x01CC, 0x01E8, 0x01AA, 0x0135, 0x00E5, 0x01B7, 0x01FA, 0x00D0, 0x010F, 0x015D, 0x0191, 0x01B2, 0x00EC, 0x0010, 0x00D1, 0x0167, 0x0034, 0x0038, 0x0078, 0x00C7, 0x0115, 0x01D1, 0x01A0, 0x00FC, 0x011F, 0x00F6, 0x0006, 0x0053, 0x0131, 0x01A4, 0x0159, 0x0099, 0x01F6, 0x0041, 0x003D, 0x00F4, 0x011A, 0x00AD, 0x00DE, 0x01A2, 0x0043, 0x0182, 0x0170, 0x0105, 0x0065, 0x01DC, 0x0123, 0x00C3, 0x01AE, 0x0031, 0x004F, 0x00A6, 0x014A, 0x0118, 0x017F, 0x0175, 0x0080, 0x017E, 0x0198, 0x009B, 0x01EF, 0x016F, 0x0184, 0x0112, 0x006B, 0x01CB, 0x01A1, 0x003E, 0x01C6, 0x0084, 0x00E1, 0x00CB, 0x013C, 0x00EA, 0x000E, 0x012D, 0x005B, 0x01F7, 0x011E, 0x01A8, 0x00D3, 0x015B, 0x0133, 0x008C, 0x0176, 0x0023, 0x0067, 0x007D, 0x01AB, 0x0013, 0x00D6, 0x01C5, 0x0092, 0x01F2, 0x013A, 0x01BC, 0x00E6, 0x0100, 0x0149, 0x00C6, 0x011D, 0x0032, 0x0074, 0x004E, 0x019A, 0x000A, 0x00CD, 0x01FE, 0x00AB, 0x00E7, 0x002D, 0x008B, 0x01D3, 0x001D, 0x0056, 0x01F9, 0x0020, 0x0048, 0x001A, 0x0156, 0x0096, 0x0139, 0x01EA, 0x01AF, 0x00EE, 0x019B, 0x0145, 0x0095, 0x01D9, 0x0028, 0x0077, 0x00AE, 0x0163, 0x00B9, 0x00E9, 0x0185, 0x0047, 0x01C0, 0x0111, 0x0174, 0x0037, 0x006E, 0x00B2, 0x0142, 0x000C, 0x01D5, 0x0188, 0x0171, 0x00BE, 0x0001, 0x006D, 0x0177, 0x0089, 0x00B5, 0x0058, 0x004B, 0x0134, 0x0104, 0x01E4, 0x0062, 0x0110, 0x0172, 0x0113, 0x019C, 0x006F, 0x0150, 0x013E, 0x0004, 0x01F8, 0x01EC, 0x0103, 0x0130, 0x004D, 0x0151, 0x01B3, 0x0015, 0x0165, 0x012F, 0x014C, 0x01E3, 0x0012, 0x002F, 0x0055, 0x0019, 0x01F1, 0x01DA, 0x0121, 0x0064, 0x010D, 0x0128, 0x01DE, 0x010E, 0x006A, 0x001F, 0x0068, 0x01B1, 0x0054, 0x019E, 0x01E6, 0x018A, 0x0060, 0x0063, 0x009A, 0x01FF, 0x0094, 0x019D, 0x0169, 0x0199, 0x00FF, 0x00A2, 0x00D7, 0x012E, 0x00C9, 0x010A, 0x015F, 0x0157, 0x0090, 0x01B9, 0x016D, 0x006C, 0x012A, 0x00FB, 0x0022, 0x00B6, 0x01FD, 0x008A, 0x00D2, 0x014F, 0x0085, 0x0137, 0x0160, 0x0148, 0x008D, 0x018C, 0x015A, 0x007B, 0x013F, 0x01C2, 0x0119, 0x01AD, 0x00E4, 0x01BB, 0x01E1, 0x005C, 0x0194, 0x01E5, 0x01A6, 0x00F8, 0x0129, 0x0017, 0x00D5, 0x0082, 0x01D2, 0x0016, 0x00D9, 0x011B, 0x0046, 0x0126, 0x0168, 0x01A3, 0x007F, 0x0138, 0x0179, 0x0007, 0x01D4, 0x00C2, 0x0002, 0x0075, 0x0127, 0x01CF, 0x0102, 0x00E0, 0x01BF, 0x00F7, 0x00BB, 0x0050, 0x018E, 0x011C, 0x0161, 0x0069, 0x0186, 0x012B, 0x01D7, 0x01D6, 0x00B8, 0x0039, 0x00C8, 0x015C, 0x003F, 0x00CC, 0x00BC, 0x0021, 0x01C3, 0x0061, 0x001E, 0x0136, 0x00DB, 0x005E, 0x00A0, 0x0081, 0x01ED, 0x0040, 0x00B3, 0x0107, 0x0066, 0x00BD, 0x00CF, 0x0072, 0x0192, 0x01B6, 0x01DD, 0x0183, 0x007A, 0x00C0, 0x002A, 0x017D, 0x0005, 0x0091, 0x0076, 0x00B4, 0x01C1, 0x0125, 0x0143, 0x0088, 0x017C, 0x002B, 0x0042, 0x003C, 0x01C7, 0x0155, 0x01BD, 0x00CA, 0x01B0, 0x0008, 0x00ED, 0x000F, 0x0178, 0x01B4, 0x01D0, 0x003B, 0x01CD }; /* * KASUMI FI Function */ uint16_t FI(uint16_t I, uint16_t K) { uint16_t D9 = (I >> 7); uint8_t D7 = (I & 0x7F); D9 = KASUMI_SBOX_S9[D9] ^ D7; D7 = KASUMI_SBOX_S7[D7] ^ (D9 & 0x7F); D7 ^= (K >> 9); D9 = KASUMI_SBOX_S9[D9 ^ (K & 0x1FF)] ^ D7; D7 = KASUMI_SBOX_S7[D7] ^ (D9 & 0x7F); return static_cast(D7 << 9) | D9; } } /* * KASUMI Encryption */ void KASUMI::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint16_t B0 = load_be(in, 0); uint16_t B1 = load_be(in, 1); uint16_t B2 = load_be(in, 2); uint16_t B3 = load_be(in, 3); for(size_t j = 0; j != 8; j += 2) { const uint16_t* K = &m_EK[8*j]; uint16_t R = B1 ^ (rotl<1>(B0) & K[0]); uint16_t L = B0 ^ (rotl<1>(R) | K[1]); L = FI(L ^ K[ 2], K[ 3]) ^ R; R = FI(R ^ K[ 4], K[ 5]) ^ L; L = FI(L ^ K[ 6], K[ 7]) ^ R; R = B2 ^= R; L = B3 ^= L; R = FI(R ^ K[10], K[11]) ^ L; L = FI(L ^ K[12], K[13]) ^ R; R = FI(R ^ K[14], K[15]) ^ L; R ^= (rotl<1>(L) & K[8]); L ^= (rotl<1>(R) | K[9]); B0 ^= L; B1 ^= R; } store_be(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * KASUMI Decryption */ void KASUMI::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint16_t B0 = load_be(in, 0); uint16_t B1 = load_be(in, 1); uint16_t B2 = load_be(in, 2); uint16_t B3 = load_be(in, 3); for(size_t j = 0; j != 8; j += 2) { const uint16_t* K = &m_EK[8*(6-j)]; uint16_t L = B2, R = B3; L = FI(L ^ K[10], K[11]) ^ R; R = FI(R ^ K[12], K[13]) ^ L; L = FI(L ^ K[14], K[15]) ^ R; L ^= (rotl<1>(R) & K[8]); R ^= (rotl<1>(L) | K[9]); R = B0 ^= R; L = B1 ^= L; L ^= (rotl<1>(R) & K[0]); R ^= (rotl<1>(L) | K[1]); R = FI(R ^ K[2], K[3]) ^ L; L = FI(L ^ K[4], K[5]) ^ R; R = FI(R ^ K[6], K[7]) ^ L; B2 ^= L; B3 ^= R; } store_be(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * KASUMI Key Schedule */ void KASUMI::key_schedule(const uint8_t key[], size_t) { static const uint16_t RC[] = { 0x0123, 0x4567, 0x89AB, 0xCDEF, 0xFEDC, 0xBA98, 0x7654, 0x3210 }; secure_vector K(16); for(size_t i = 0; i != 8; ++i) { K[i] = load_be(key, i); K[i+8] = K[i] ^ RC[i]; } m_EK.resize(64); for(size_t i = 0; i != 8; ++i) { m_EK[8*i ] = rotl<2>(K[(i+0) % 8]); m_EK[8*i+1] = rotl<1>(K[(i+2) % 8 + 8]); m_EK[8*i+2] = rotl<5>(K[(i+1) % 8]); m_EK[8*i+3] = K[(i+4) % 8 + 8]; m_EK[8*i+4] = rotl<8>(K[(i+5) % 8]); m_EK[8*i+5] = K[(i+3) % 8 + 8]; m_EK[8*i+6] = rotl<13>(K[(i+6) % 8]); m_EK[8*i+7] = K[(i+7) % 8 + 8]; } } void KASUMI::clear() { zap(m_EK); } } botan-2.4.0/src/lib/block/kasumi/kasumi.h000066400000000000000000000014721322470703100202050ustar00rootroot00000000000000/* * KASUMI * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KASUMI_H_ #define BOTAN_KASUMI_H_ #include namespace Botan { /** * KASUMI, the block cipher used in 3G telephony */ class BOTAN_PUBLIC_API(2,0) KASUMI final : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "KASUMI"; } BlockCipher* clone() const override { return new KASUMI; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_EK; }; } #endif botan-2.4.0/src/lib/block/lion/000077500000000000000000000000001322470703100162075ustar00rootroot00000000000000botan-2.4.0/src/lib/block/lion/info.txt000066400000000000000000000000461322470703100177030ustar00rootroot00000000000000 LION -> 20131128 botan-2.4.0/src/lib/block/lion/lion.cpp000066400000000000000000000063201322470703100176550ustar00rootroot00000000000000/* * Lion * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* * Lion Encryption */ void Lion::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_key1.empty() == false); const size_t LEFT_SIZE = left_size(); const size_t RIGHT_SIZE = right_size(); secure_vector buffer_vec(LEFT_SIZE); uint8_t* buffer = buffer_vec.data(); for(size_t i = 0; i != blocks; ++i) { xor_buf(buffer, in, m_key1.data(), LEFT_SIZE); m_cipher->set_key(buffer, LEFT_SIZE); m_cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE); m_hash->update(out + LEFT_SIZE, RIGHT_SIZE); m_hash->final(buffer); xor_buf(out, in, buffer, LEFT_SIZE); xor_buf(buffer, out, m_key2.data(), LEFT_SIZE); m_cipher->set_key(buffer, LEFT_SIZE); m_cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE); in += m_block_size; out += m_block_size; } } /* * Lion Decryption */ void Lion::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_key1.empty() == false); const size_t LEFT_SIZE = left_size(); const size_t RIGHT_SIZE = right_size(); secure_vector buffer_vec(LEFT_SIZE); uint8_t* buffer = buffer_vec.data(); for(size_t i = 0; i != blocks; ++i) { xor_buf(buffer, in, m_key2.data(), LEFT_SIZE); m_cipher->set_key(buffer, LEFT_SIZE); m_cipher->cipher(in + LEFT_SIZE, out + LEFT_SIZE, RIGHT_SIZE); m_hash->update(out + LEFT_SIZE, RIGHT_SIZE); m_hash->final(buffer); xor_buf(out, in, buffer, LEFT_SIZE); xor_buf(buffer, out, m_key1.data(), LEFT_SIZE); m_cipher->set_key(buffer, LEFT_SIZE); m_cipher->cipher1(out + LEFT_SIZE, RIGHT_SIZE); in += m_block_size; out += m_block_size; } } /* * Lion Key Schedule */ void Lion::key_schedule(const uint8_t key[], size_t length) { clear(); const size_t half = length / 2; m_key1.resize(left_size()); m_key2.resize(left_size()); clear_mem(m_key1.data(), m_key1.size()); clear_mem(m_key2.data(), m_key2.size()); copy_mem(m_key1.data(), key, half); copy_mem(m_key2.data(), key + half, half); } /* * Return the name of this type */ std::string Lion::name() const { return "Lion(" + m_hash->name() + "," + m_cipher->name() + "," + std::to_string(block_size()) + ")"; } /* * Return a clone of this object */ BlockCipher* Lion::clone() const { return new Lion(m_hash->clone(), m_cipher->clone(), block_size()); } /* * Clear memory of sensitive data */ void Lion::clear() { zap(m_key1); zap(m_key2); m_hash->clear(); m_cipher->clear(); } /* * Lion Constructor */ Lion::Lion(HashFunction* hash, StreamCipher* cipher, size_t bs) : m_block_size(std::max(2*hash->output_length() + 1, bs)), m_hash(hash), m_cipher(cipher) { if(2*left_size() + 1 > m_block_size) throw Invalid_Argument(name() + ": Chosen block size is too small"); if(!m_cipher->valid_keylength(left_size())) throw Invalid_Argument(name() + ": This stream/hash combo is invalid"); } } botan-2.4.0/src/lib/block/lion/lion.h000066400000000000000000000034721322470703100173270ustar00rootroot00000000000000/* * Lion * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_LION_H_ #define BOTAN_LION_H_ #include #include #include namespace Botan { /** * Lion is a block cipher construction designed by Ross Anderson and * Eli Biham, described in "Two Practical and Provably Secure Block * Ciphers: BEAR and LION". It has a variable block size and is * designed to encrypt very large blocks (up to a megabyte) * https://www.cl.cam.ac.uk/~rja14/Papers/bear-lion.pdf */ class BOTAN_PUBLIC_API(2,0) Lion final : public BlockCipher { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; size_t block_size() const override { return m_block_size; } Key_Length_Specification key_spec() const override { return Key_Length_Specification(2, 2*m_hash->output_length(), 2); } void clear() override; std::string name() const override; BlockCipher* clone() const override; /** * @param hash the hash to use internally * @param cipher the stream cipher to use internally * @param block_size the size of the block to use */ Lion(HashFunction* hash, StreamCipher* cipher, size_t block_size); private: void key_schedule(const uint8_t[], size_t) override; size_t left_size() const { return m_hash->output_length(); } size_t right_size() const { return m_block_size - left_size(); } const size_t m_block_size; std::unique_ptr m_hash; std::unique_ptr m_cipher; secure_vector m_key1, m_key2; }; } #endif botan-2.4.0/src/lib/block/misty1/000077500000000000000000000000001322470703100164745ustar00rootroot00000000000000botan-2.4.0/src/lib/block/misty1/info.txt000066400000000000000000000000501322470703100201630ustar00rootroot00000000000000 MISTY1 -> 20131128 botan-2.4.0/src/lib/block/misty1/misty1.cpp000066400000000000000000000241211322470703100204260ustar00rootroot00000000000000/* * MISTY1 * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { static const uint8_t MISTY1_SBOX_S7[128] = { 0x1B, 0x32, 0x33, 0x5A, 0x3B, 0x10, 0x17, 0x54, 0x5B, 0x1A, 0x72, 0x73, 0x6B, 0x2C, 0x66, 0x49, 0x1F, 0x24, 0x13, 0x6C, 0x37, 0x2E, 0x3F, 0x4A, 0x5D, 0x0F, 0x40, 0x56, 0x25, 0x51, 0x1C, 0x04, 0x0B, 0x46, 0x20, 0x0D, 0x7B, 0x35, 0x44, 0x42, 0x2B, 0x1E, 0x41, 0x14, 0x4B, 0x79, 0x15, 0x6F, 0x0E, 0x55, 0x09, 0x36, 0x74, 0x0C, 0x67, 0x53, 0x28, 0x0A, 0x7E, 0x38, 0x02, 0x07, 0x60, 0x29, 0x19, 0x12, 0x65, 0x2F, 0x30, 0x39, 0x08, 0x68, 0x5F, 0x78, 0x2A, 0x4C, 0x64, 0x45, 0x75, 0x3D, 0x59, 0x48, 0x03, 0x57, 0x7C, 0x4F, 0x62, 0x3C, 0x1D, 0x21, 0x5E, 0x27, 0x6A, 0x70, 0x4D, 0x3A, 0x01, 0x6D, 0x6E, 0x63, 0x18, 0x77, 0x23, 0x05, 0x26, 0x76, 0x00, 0x31, 0x2D, 0x7A, 0x7F, 0x61, 0x50, 0x22, 0x11, 0x06, 0x47, 0x16, 0x52, 0x4E, 0x71, 0x3E, 0x69, 0x43, 0x34, 0x5C, 0x58, 0x7D }; static const uint16_t MISTY1_SBOX_S9[512] = { 0x01C3, 0x00CB, 0x0153, 0x019F, 0x01E3, 0x00E9, 0x00FB, 0x0035, 0x0181, 0x00B9, 0x0117, 0x01EB, 0x0133, 0x0009, 0x002D, 0x00D3, 0x00C7, 0x014A, 0x0037, 0x007E, 0x00EB, 0x0164, 0x0193, 0x01D8, 0x00A3, 0x011E, 0x0055, 0x002C, 0x001D, 0x01A2, 0x0163, 0x0118, 0x014B, 0x0152, 0x01D2, 0x000F, 0x002B, 0x0030, 0x013A, 0x00E5, 0x0111, 0x0138, 0x018E, 0x0063, 0x00E3, 0x00C8, 0x01F4, 0x001B, 0x0001, 0x009D, 0x00F8, 0x01A0, 0x016D, 0x01F3, 0x001C, 0x0146, 0x007D, 0x00D1, 0x0082, 0x01EA, 0x0183, 0x012D, 0x00F4, 0x019E, 0x01D3, 0x00DD, 0x01E2, 0x0128, 0x01E0, 0x00EC, 0x0059, 0x0091, 0x0011, 0x012F, 0x0026, 0x00DC, 0x00B0, 0x018C, 0x010F, 0x01F7, 0x00E7, 0x016C, 0x00B6, 0x00F9, 0x00D8, 0x0151, 0x0101, 0x014C, 0x0103, 0x00B8, 0x0154, 0x012B, 0x01AE, 0x0017, 0x0071, 0x000C, 0x0047, 0x0058, 0x007F, 0x01A4, 0x0134, 0x0129, 0x0084, 0x015D, 0x019D, 0x01B2, 0x01A3, 0x0048, 0x007C, 0x0051, 0x01CA, 0x0023, 0x013D, 0x01A7, 0x0165, 0x003B, 0x0042, 0x00DA, 0x0192, 0x00CE, 0x00C1, 0x006B, 0x009F, 0x01F1, 0x012C, 0x0184, 0x00FA, 0x0196, 0x01E1, 0x0169, 0x017D, 0x0031, 0x0180, 0x010A, 0x0094, 0x01DA, 0x0186, 0x013E, 0x011C, 0x0060, 0x0175, 0x01CF, 0x0067, 0x0119, 0x0065, 0x0068, 0x0099, 0x0150, 0x0008, 0x0007, 0x017C, 0x00B7, 0x0024, 0x0019, 0x00DE, 0x0127, 0x00DB, 0x00E4, 0x01A9, 0x0052, 0x0109, 0x0090, 0x019C, 0x01C1, 0x0028, 0x01B3, 0x0135, 0x016A, 0x0176, 0x00DF, 0x01E5, 0x0188, 0x00C5, 0x016E, 0x01DE, 0x01B1, 0x00C3, 0x01DF, 0x0036, 0x00EE, 0x01EE, 0x00F0, 0x0093, 0x0049, 0x009A, 0x01B6, 0x0069, 0x0081, 0x0125, 0x000B, 0x005E, 0x00B4, 0x0149, 0x01C7, 0x0174, 0x003E, 0x013B, 0x01B7, 0x008E, 0x01C6, 0x00AE, 0x0010, 0x0095, 0x01EF, 0x004E, 0x00F2, 0x01FD, 0x0085, 0x00FD, 0x00F6, 0x00A0, 0x016F, 0x0083, 0x008A, 0x0156, 0x009B, 0x013C, 0x0107, 0x0167, 0x0098, 0x01D0, 0x01E9, 0x0003, 0x01FE, 0x00BD, 0x0122, 0x0089, 0x00D2, 0x018F, 0x0012, 0x0033, 0x006A, 0x0142, 0x00ED, 0x0170, 0x011B, 0x00E2, 0x014F, 0x0158, 0x0131, 0x0147, 0x005D, 0x0113, 0x01CD, 0x0079, 0x0161, 0x01A5, 0x0179, 0x009E, 0x01B4, 0x00CC, 0x0022, 0x0132, 0x001A, 0x00E8, 0x0004, 0x0187, 0x01ED, 0x0197, 0x0039, 0x01BF, 0x01D7, 0x0027, 0x018B, 0x00C6, 0x009C, 0x00D0, 0x014E, 0x006C, 0x0034, 0x01F2, 0x006E, 0x00CA, 0x0025, 0x00BA, 0x0191, 0x00FE, 0x0013, 0x0106, 0x002F, 0x01AD, 0x0172, 0x01DB, 0x00C0, 0x010B, 0x01D6, 0x00F5, 0x01EC, 0x010D, 0x0076, 0x0114, 0x01AB, 0x0075, 0x010C, 0x01E4, 0x0159, 0x0054, 0x011F, 0x004B, 0x00C4, 0x01BE, 0x00F7, 0x0029, 0x00A4, 0x000E, 0x01F0, 0x0077, 0x004D, 0x017A, 0x0086, 0x008B, 0x00B3, 0x0171, 0x00BF, 0x010E, 0x0104, 0x0097, 0x015B, 0x0160, 0x0168, 0x00D7, 0x00BB, 0x0066, 0x01CE, 0x00FC, 0x0092, 0x01C5, 0x006F, 0x0016, 0x004A, 0x00A1, 0x0139, 0x00AF, 0x00F1, 0x0190, 0x000A, 0x01AA, 0x0143, 0x017B, 0x0056, 0x018D, 0x0166, 0x00D4, 0x01FB, 0x014D, 0x0194, 0x019A, 0x0087, 0x01F8, 0x0123, 0x00A7, 0x01B8, 0x0141, 0x003C, 0x01F9, 0x0140, 0x002A, 0x0155, 0x011A, 0x01A1, 0x0198, 0x00D5, 0x0126, 0x01AF, 0x0061, 0x012E, 0x0157, 0x01DC, 0x0072, 0x018A, 0x00AA, 0x0096, 0x0115, 0x00EF, 0x0045, 0x007B, 0x008D, 0x0145, 0x0053, 0x005F, 0x0178, 0x00B2, 0x002E, 0x0020, 0x01D5, 0x003F, 0x01C9, 0x01E7, 0x01AC, 0x0044, 0x0038, 0x0014, 0x00B1, 0x016B, 0x00AB, 0x00B5, 0x005A, 0x0182, 0x01C8, 0x01D4, 0x0018, 0x0177, 0x0064, 0x00CF, 0x006D, 0x0100, 0x0199, 0x0130, 0x015A, 0x0005, 0x0120, 0x01BB, 0x01BD, 0x00E0, 0x004F, 0x00D6, 0x013F, 0x01C4, 0x012A, 0x0015, 0x0006, 0x00FF, 0x019B, 0x00A6, 0x0043, 0x0088, 0x0050, 0x015F, 0x01E8, 0x0121, 0x0073, 0x017E, 0x00BC, 0x00C2, 0x00C9, 0x0173, 0x0189, 0x01F5, 0x0074, 0x01CC, 0x01E6, 0x01A8, 0x0195, 0x001F, 0x0041, 0x000D, 0x01BA, 0x0032, 0x003D, 0x01D1, 0x0080, 0x00A8, 0x0057, 0x01B9, 0x0162, 0x0148, 0x00D9, 0x0105, 0x0062, 0x007A, 0x0021, 0x01FF, 0x0112, 0x0108, 0x01C0, 0x00A9, 0x011D, 0x01B0, 0x01A6, 0x00CD, 0x00F3, 0x005C, 0x0102, 0x005B, 0x01D9, 0x0144, 0x01F6, 0x00AD, 0x00A5, 0x003A, 0x01CB, 0x0136, 0x017F, 0x0046, 0x00E1, 0x001E, 0x01DD, 0x00E6, 0x0137, 0x01FA, 0x0185, 0x008C, 0x008F, 0x0040, 0x01B5, 0x00BE, 0x0078, 0x0000, 0x00AC, 0x0110, 0x015E, 0x0124, 0x0002, 0x01BC, 0x00A2, 0x00EA, 0x0070, 0x01FC, 0x0116, 0x015C, 0x004C, 0x01C2 }; /* * MISTY1 FI Function */ uint16_t FI(uint16_t input, uint16_t key7, uint16_t key9) { uint16_t D9 = input >> 7, D7 = input & 0x7F; D9 = MISTY1_SBOX_S9[D9] ^ D7; D7 = (MISTY1_SBOX_S7[D7] ^ key7 ^ D9) & 0x7F; D9 = MISTY1_SBOX_S9[D9 ^ key9] ^ D7; return static_cast(D7 << 9) | D9; } } /* * MISTY1 Encryption */ void MISTY1::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint16_t B0 = load_be(in, 0); uint16_t B1 = load_be(in, 1); uint16_t B2 = load_be(in, 2); uint16_t B3 = load_be(in, 3); for(size_t j = 0; j != 12; j += 3) { const uint16_t* RK = &m_EK[8 * j]; B1 ^= B0 & RK[0]; B0 ^= B1 | RK[1]; B3 ^= B2 & RK[2]; B2 ^= B3 | RK[3]; uint16_t T0, T1; T0 = FI(B0 ^ RK[ 4], RK[ 5], RK[ 6]) ^ B1; T1 = FI(B1 ^ RK[ 7], RK[ 8], RK[ 9]) ^ T0; T0 = FI(T0 ^ RK[10], RK[11], RK[12]) ^ T1; B2 ^= T1 ^ RK[13]; B3 ^= T0; T0 = FI(B2 ^ RK[14], RK[15], RK[16]) ^ B3; T1 = FI(B3 ^ RK[17], RK[18], RK[19]) ^ T0; T0 = FI(T0 ^ RK[20], RK[21], RK[22]) ^ T1; B0 ^= T1 ^ RK[23]; B1 ^= T0; } B1 ^= B0 & m_EK[96]; B0 ^= B1 | m_EK[97]; B3 ^= B2 & m_EK[98]; B2 ^= B3 | m_EK[99]; store_be(out, B2, B3, B0, B1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * MISTY1 Decryption */ void MISTY1::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_DK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint16_t B0 = load_be(in, 2); uint16_t B1 = load_be(in, 3); uint16_t B2 = load_be(in, 0); uint16_t B3 = load_be(in, 1); for(size_t j = 0; j != 12; j += 3) { const uint16_t* RK = &m_DK[8 * j]; B2 ^= B3 | RK[0]; B3 ^= B2 & RK[1]; B0 ^= B1 | RK[2]; B1 ^= B0 & RK[3]; uint16_t T0, T1; T0 = FI(B2 ^ RK[ 4], RK[ 5], RK[ 6]) ^ B3; T1 = FI(B3 ^ RK[ 7], RK[ 8], RK[ 9]) ^ T0; T0 = FI(T0 ^ RK[10], RK[11], RK[12]) ^ T1; B0 ^= T1 ^ RK[13]; B1 ^= T0; T0 = FI(B0 ^ RK[14], RK[15], RK[16]) ^ B1; T1 = FI(B1 ^ RK[17], RK[18], RK[19]) ^ T0; T0 = FI(T0 ^ RK[20], RK[21], RK[22]) ^ T1; B2 ^= T1 ^ RK[23]; B3 ^= T0; } B2 ^= B3 | m_DK[96]; B3 ^= B2 & m_DK[97]; B0 ^= B1 | m_DK[98]; B1 ^= B0 & m_DK[99]; store_be(out, B0, B1, B2, B3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * MISTY1 Key Schedule */ void MISTY1::key_schedule(const uint8_t key[], size_t length) { secure_vector KS(32); for(size_t i = 0; i != length / 2; ++i) KS[i] = load_be(key, i); for(size_t i = 0; i != 8; ++i) { KS[i+ 8] = FI(KS[i], KS[(i+1) % 8] >> 9, KS[(i+1) % 8] & 0x1FF); KS[i+16] = KS[i+8] >> 9; KS[i+24] = KS[i+8] & 0x1FF; } /* * Precomputed indexes for the orderings of the subkeys (MISTY1 reuses * values) */ static const uint8_t EK_ORDER[100] = { 0x00, 0x0E, 0x0A, 0x04, 0x00, 0x15, 0x1D, 0x02, 0x11, 0x19, 0x07, 0x13, 0x1B, 0x04, 0x01, 0x16, 0x1E, 0x03, 0x12, 0x1A, 0x00, 0x14, 0x1C, 0x05, 0x01, 0x0F, 0x0B, 0x05, 0x02, 0x17, 0x1F, 0x04, 0x13, 0x1B, 0x01, 0x15, 0x1D, 0x06, 0x03, 0x10, 0x18, 0x05, 0x14, 0x1C, 0x02, 0x16, 0x1E, 0x07, 0x02, 0x08, 0x0C, 0x06, 0x04, 0x11, 0x19, 0x06, 0x15, 0x1D, 0x03, 0x17, 0x1F, 0x00, 0x05, 0x12, 0x1A, 0x07, 0x16, 0x1E, 0x04, 0x10, 0x18, 0x01, 0x03, 0x09, 0x0D, 0x07, 0x06, 0x13, 0x1B, 0x00, 0x17, 0x1F, 0x05, 0x11, 0x19, 0x02, 0x07, 0x14, 0x1C, 0x01, 0x10, 0x18, 0x06, 0x12, 0x1A, 0x03, 0x04, 0x0A, 0x0E, 0x00 }; static const uint8_t DK_ORDER[100] = { 0x00, 0x0E, 0x0A, 0x04, 0x07, 0x14, 0x1C, 0x01, 0x10, 0x18, 0x06, 0x12, 0x1A, 0x03, 0x06, 0x13, 0x1B, 0x00, 0x17, 0x1F, 0x05, 0x11, 0x19, 0x02, 0x07, 0x0D, 0x09, 0x03, 0x05, 0x12, 0x1A, 0x07, 0x16, 0x1E, 0x04, 0x10, 0x18, 0x01, 0x04, 0x11, 0x19, 0x06, 0x15, 0x1D, 0x03, 0x17, 0x1F, 0x00, 0x06, 0x0C, 0x08, 0x02, 0x03, 0x10, 0x18, 0x05, 0x14, 0x1C, 0x02, 0x16, 0x1E, 0x07, 0x02, 0x17, 0x1F, 0x04, 0x13, 0x1B, 0x01, 0x15, 0x1D, 0x06, 0x05, 0x0B, 0x0F, 0x01, 0x01, 0x16, 0x1E, 0x03, 0x12, 0x1A, 0x00, 0x14, 0x1C, 0x05, 0x00, 0x15, 0x1D, 0x02, 0x11, 0x19, 0x07, 0x13, 0x1B, 0x04, 0x04, 0x0A, 0x0E, 0x00 }; m_EK.resize(100); m_DK.resize(100); for(size_t i = 0; i != 100; ++i) { m_EK[i] = KS[EK_ORDER[i]]; m_DK[i] = KS[DK_ORDER[i]]; } } void MISTY1::clear() { zap(m_EK); zap(m_DK); } } botan-2.4.0/src/lib/block/misty1/misty1.h000066400000000000000000000014471322470703100201010ustar00rootroot00000000000000/* * MISTY1 * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MISTY1_H_ #define BOTAN_MISTY1_H_ #include namespace Botan { /** * MISTY1 with 8 rounds */ class BOTAN_PUBLIC_API(2,0) MISTY1 final : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "MISTY1"; } BlockCipher* clone() const override { return new MISTY1; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_EK, m_DK; }; } #endif botan-2.4.0/src/lib/block/noekeon/000077500000000000000000000000001322470703100167045ustar00rootroot00000000000000botan-2.4.0/src/lib/block/noekeon/info.txt000066400000000000000000000000511322470703100203740ustar00rootroot00000000000000 NOEKEON -> 20131128 botan-2.4.0/src/lib/block/noekeon/noekeon.cpp000066400000000000000000000113401322470703100210450ustar00rootroot00000000000000/* * Noekeon * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * Noekeon's Theta Operation */ inline void theta(uint32_t& A0, uint32_t& A1, uint32_t& A2, uint32_t& A3, const uint32_t EK[4]) { uint32_t T = A0 ^ A2; T ^= rotl<8>(T) ^ rotr<8>(T); A1 ^= T; A3 ^= T; A0 ^= EK[0]; A1 ^= EK[1]; A2 ^= EK[2]; A3 ^= EK[3]; T = A1 ^ A3; T ^= rotl<8>(T) ^ rotr<8>(T); A0 ^= T; A2 ^= T; } /* * Theta With Null Key */ inline void theta(uint32_t& A0, uint32_t& A1, uint32_t& A2, uint32_t& A3) { uint32_t T = A0 ^ A2; T ^= rotl<8>(T) ^ rotr<8>(T); A1 ^= T; A3 ^= T; T = A1 ^ A3; T ^= rotl<8>(T) ^ rotr<8>(T); A0 ^= T; A2 ^= T; } /* * Noekeon's Gamma S-Box Layer */ inline void gamma(uint32_t& A0, uint32_t& A1, uint32_t& A2, uint32_t& A3) { A1 ^= ~A3 & ~A2; A0 ^= A2 & A1; uint32_t T = A3; A3 = A0; A0 = T; A2 ^= A0 ^ A1 ^ A3; A1 ^= ~A3 & ~A2; A0 ^= A2 & A1; } } size_t Noekeon::parallelism() const { #if defined(BOTAN_HAS_NOEKEON_SIMD) if(CPUID::has_simd_32()) { return 4; } #endif return 1; } std::string Noekeon::provider() const { #if defined(BOTAN_HAS_NOEKEON_SIMD) if(CPUID::has_simd_32()) { return "simd"; } #endif return "base"; } /* * Noekeon Round Constants */ const uint8_t Noekeon::RC[] = { 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A, 0x2F, 0x5E, 0xBC, 0x63, 0xC6, 0x97, 0x35, 0x6A, 0xD4 }; /* * Noekeon Encryption */ void Noekeon::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); #if defined(BOTAN_HAS_NOEKEON_SIMD) if(CPUID::has_simd_32()) { while(blocks >= 4) { simd_encrypt_4(in, out); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } } #endif for(size_t i = 0; i != blocks; ++i) { uint32_t A0 = load_be(in, 0); uint32_t A1 = load_be(in, 1); uint32_t A2 = load_be(in, 2); uint32_t A3 = load_be(in, 3); for(size_t j = 0; j != 16; ++j) { A0 ^= RC[j]; theta(A0, A1, A2, A3, m_EK.data()); A1 = rotl<1>(A1); A2 = rotl<5>(A2); A3 = rotl<2>(A3); gamma(A0, A1, A2, A3); A1 = rotr<1>(A1); A2 = rotr<5>(A2); A3 = rotr<2>(A3); } A0 ^= RC[16]; theta(A0, A1, A2, A3, m_EK.data()); store_be(out, A0, A1, A2, A3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Noekeon Encryption */ void Noekeon::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_DK.empty() == false); #if defined(BOTAN_HAS_NOEKEON_SIMD) if(CPUID::has_simd_32()) { while(blocks >= 4) { simd_decrypt_4(in, out); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } } #endif for(size_t i = 0; i != blocks; ++i) { uint32_t A0 = load_be(in, 0); uint32_t A1 = load_be(in, 1); uint32_t A2 = load_be(in, 2); uint32_t A3 = load_be(in, 3); for(size_t j = 16; j != 0; --j) { theta(A0, A1, A2, A3, m_DK.data()); A0 ^= RC[j]; A1 = rotl<1>(A1); A2 = rotl<5>(A2); A3 = rotl<2>(A3); gamma(A0, A1, A2, A3); A1 = rotr<1>(A1); A2 = rotr<5>(A2); A3 = rotr<2>(A3); } theta(A0, A1, A2, A3, m_DK.data()); A0 ^= RC[0]; store_be(out, A0, A1, A2, A3); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * Noekeon Key Schedule */ void Noekeon::key_schedule(const uint8_t key[], size_t) { uint32_t A0 = load_be(key, 0); uint32_t A1 = load_be(key, 1); uint32_t A2 = load_be(key, 2); uint32_t A3 = load_be(key, 3); for(size_t i = 0; i != 16; ++i) { A0 ^= RC[i]; theta(A0, A1, A2, A3); A1 = rotl<1>(A1); A2 = rotl<5>(A2); A3 = rotl<2>(A3); gamma(A0, A1, A2, A3); A1 = rotr<1>(A1); A2 = rotr<5>(A2); A3 = rotr<2>(A3); } A0 ^= RC[16]; m_DK.resize(4); m_DK[0] = A0; m_DK[1] = A1; m_DK[2] = A2; m_DK[3] = A3; theta(A0, A1, A2, A3); m_EK.resize(4); m_EK[0] = A0; m_EK[1] = A1; m_EK[2] = A2; m_EK[3] = A3; } /* * Clear memory of sensitive data */ void Noekeon::clear() { zap(m_EK); zap(m_DK); } } botan-2.4.0/src/lib/block/noekeon/noekeon.h000066400000000000000000000022101322470703100205060ustar00rootroot00000000000000/* * Noekeon * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_NOEKEON_H_ #define BOTAN_NOEKEON_H_ #include namespace Botan { /** * Noekeon */ class BOTAN_PUBLIC_API(2,0) Noekeon final : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; std::string provider() const override; void clear() override; std::string name() const override { return "Noekeon"; } BlockCipher* clone() const override { return new Noekeon; } size_t parallelism() const override; private: #if defined(BOTAN_HAS_NOEKEON_SIMD) void simd_encrypt_4(const uint8_t in[], uint8_t out[]) const; void simd_decrypt_4(const uint8_t in[], uint8_t out[]) const; #endif /** * The Noekeon round constants */ static const uint8_t RC[17]; void key_schedule(const uint8_t[], size_t) override; secure_vector m_EK, m_DK; }; } #endif botan-2.4.0/src/lib/block/noekeon/noekeon_simd/000077500000000000000000000000001322470703100213565ustar00rootroot00000000000000botan-2.4.0/src/lib/block/noekeon/noekeon_simd/info.txt000066400000000000000000000001231322470703100230460ustar00rootroot00000000000000 NOEKEON_SIMD -> 20160903 noekeon simd botan-2.4.0/src/lib/block/noekeon/noekeon_simd/noekeon_simd.cpp000066400000000000000000000104731322470703100245410ustar00rootroot00000000000000/* * Noekeon in SIMD * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Noekeon's Theta Operation */ #define NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3) \ do { \ SIMD_32 T = A0 ^ A2; \ T ^= T.rotl<8>() ^ T.rotr<8>(); \ A1 ^= T; \ A3 ^= T; \ \ A0 ^= K0; \ A1 ^= K1; \ A2 ^= K2; \ A3 ^= K3; \ \ T = A1 ^ A3; \ T ^= T.rotl<8>() ^ T.rotr<8>(); \ A0 ^= T; \ A2 ^= T; \ } while(0) /* * Noekeon's Gamma S-Box Layer */ #define NOK_SIMD_GAMMA(A0, A1, A2, A3) \ do \ { \ A1 ^= A3.andc(~A2); \ A0 ^= A2 & A1; \ \ SIMD_32 T = A3; \ A3 = A0; \ A0 = T; \ \ A2 ^= A0 ^ A1 ^ A3; \ \ A1 ^= A3.andc(~A2); \ A0 ^= A2 & A1; \ } while(0) /* * Noekeon Encryption */ void Noekeon::simd_encrypt_4(const uint8_t in[], uint8_t out[]) const { const SIMD_32 K0 = SIMD_32::splat(m_EK[0]); const SIMD_32 K1 = SIMD_32::splat(m_EK[1]); const SIMD_32 K2 = SIMD_32::splat(m_EK[2]); const SIMD_32 K3 = SIMD_32::splat(m_EK[3]); SIMD_32 A0 = SIMD_32::load_be(in ); SIMD_32 A1 = SIMD_32::load_be(in + 16); SIMD_32 A2 = SIMD_32::load_be(in + 32); SIMD_32 A3 = SIMD_32::load_be(in + 48); SIMD_32::transpose(A0, A1, A2, A3); for(size_t i = 0; i != 16; ++i) { A0 ^= SIMD_32::splat(RC[i]); NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); A1 = A1.rotl<1>(); A2 = A2.rotl<5>(); A3 = A3.rotl<2>(); NOK_SIMD_GAMMA(A0, A1, A2, A3); A1 = A1.rotr<1>(); A2 = A2.rotr<5>(); A3 = A3.rotr<2>(); } A0 ^= SIMD_32::splat(RC[16]); NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); SIMD_32::transpose(A0, A1, A2, A3); A0.store_be(out); A1.store_be(out + 16); A2.store_be(out + 32); A3.store_be(out + 48); } /* * Noekeon Encryption */ void Noekeon::simd_decrypt_4(const uint8_t in[], uint8_t out[]) const { const SIMD_32 K0 = SIMD_32::splat(m_DK[0]); const SIMD_32 K1 = SIMD_32::splat(m_DK[1]); const SIMD_32 K2 = SIMD_32::splat(m_DK[2]); const SIMD_32 K3 = SIMD_32::splat(m_DK[3]); SIMD_32 A0 = SIMD_32::load_be(in ); SIMD_32 A1 = SIMD_32::load_be(in + 16); SIMD_32 A2 = SIMD_32::load_be(in + 32); SIMD_32 A3 = SIMD_32::load_be(in + 48); SIMD_32::transpose(A0, A1, A2, A3); for(size_t i = 0; i != 16; ++i) { NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); A0 ^= SIMD_32::splat(RC[16-i]); A1 = A1.rotl<1>(); A2 = A2.rotl<5>(); A3 = A3.rotl<2>(); NOK_SIMD_GAMMA(A0, A1, A2, A3); A1 = A1.rotr<1>(); A2 = A2.rotr<5>(); A3 = A3.rotr<2>(); } NOK_SIMD_THETA(A0, A1, A2, A3, K0, K1, K2, K3); A0 ^= SIMD_32::splat(RC[0]); SIMD_32::transpose(A0, A1, A2, A3); A0.store_be(out); A1.store_be(out + 16); A2.store_be(out + 32); A3.store_be(out + 48); } } botan-2.4.0/src/lib/block/seed/000077500000000000000000000000001322470703100161665ustar00rootroot00000000000000botan-2.4.0/src/lib/block/seed/info.txt000066400000000000000000000000461322470703100176620ustar00rootroot00000000000000 SEED -> 20131128 botan-2.4.0/src/lib/block/seed/seed.cpp000066400000000000000000000375751322470703100176330ustar00rootroot00000000000000/* * SEED * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { const uint32_t SEED_S0[256] = { 0x2989A1A8, 0x05858184, 0x16C6D2D4, 0x13C3D3D0, 0x14445054, 0x1D0D111C, 0x2C8CA0AC, 0x25052124, 0x1D4D515C, 0x03434340, 0x18081018, 0x1E0E121C, 0x11415150, 0x3CCCF0FC, 0x0ACAC2C8, 0x23436360, 0x28082028, 0x04444044, 0x20002020, 0x1D8D919C, 0x20C0E0E0, 0x22C2E2E0, 0x08C8C0C8, 0x17071314, 0x2585A1A4, 0x0F8F838C, 0x03030300, 0x3B4B7378, 0x3B8BB3B8, 0x13031310, 0x12C2D2D0, 0x2ECEE2EC, 0x30407070, 0x0C8C808C, 0x3F0F333C, 0x2888A0A8, 0x32023230, 0x1DCDD1DC, 0x36C6F2F4, 0x34447074, 0x2CCCE0EC, 0x15859194, 0x0B0B0308, 0x17475354, 0x1C4C505C, 0x1B4B5358, 0x3D8DB1BC, 0x01010100, 0x24042024, 0x1C0C101C, 0x33437370, 0x18889098, 0x10001010, 0x0CCCC0CC, 0x32C2F2F0, 0x19C9D1D8, 0x2C0C202C, 0x27C7E3E4, 0x32427270, 0x03838380, 0x1B8B9398, 0x11C1D1D0, 0x06868284, 0x09C9C1C8, 0x20406060, 0x10405050, 0x2383A3A0, 0x2BCBE3E8, 0x0D0D010C, 0x3686B2B4, 0x1E8E929C, 0x0F4F434C, 0x3787B3B4, 0x1A4A5258, 0x06C6C2C4, 0x38487078, 0x2686A2A4, 0x12021210, 0x2F8FA3AC, 0x15C5D1D4, 0x21416160, 0x03C3C3C0, 0x3484B0B4, 0x01414140, 0x12425250, 0x3D4D717C, 0x0D8D818C, 0x08080008, 0x1F0F131C, 0x19899198, 0x00000000, 0x19091118, 0x04040004, 0x13435350, 0x37C7F3F4, 0x21C1E1E0, 0x3DCDF1FC, 0x36467274, 0x2F0F232C, 0x27072324, 0x3080B0B0, 0x0B8B8388, 0x0E0E020C, 0x2B8BA3A8, 0x2282A2A0, 0x2E4E626C, 0x13839390, 0x0D4D414C, 0x29496168, 0x3C4C707C, 0x09090108, 0x0A0A0208, 0x3F8FB3BC, 0x2FCFE3EC, 0x33C3F3F0, 0x05C5C1C4, 0x07878384, 0x14041014, 0x3ECEF2FC, 0x24446064, 0x1ECED2DC, 0x2E0E222C, 0x0B4B4348, 0x1A0A1218, 0x06060204, 0x21012120, 0x2B4B6368, 0x26466264, 0x02020200, 0x35C5F1F4, 0x12829290, 0x0A8A8288, 0x0C0C000C, 0x3383B3B0, 0x3E4E727C, 0x10C0D0D0, 0x3A4A7278, 0x07474344, 0x16869294, 0x25C5E1E4, 0x26062224, 0x00808080, 0x2D8DA1AC, 0x1FCFD3DC, 0x2181A1A0, 0x30003030, 0x37073334, 0x2E8EA2AC, 0x36063234, 0x15051114, 0x22022220, 0x38083038, 0x34C4F0F4, 0x2787A3A4, 0x05454144, 0x0C4C404C, 0x01818180, 0x29C9E1E8, 0x04848084, 0x17879394, 0x35053134, 0x0BCBC3C8, 0x0ECEC2CC, 0x3C0C303C, 0x31417170, 0x11011110, 0x07C7C3C4, 0x09898188, 0x35457174, 0x3BCBF3F8, 0x1ACAD2D8, 0x38C8F0F8, 0x14849094, 0x19495158, 0x02828280, 0x04C4C0C4, 0x3FCFF3FC, 0x09494148, 0x39093138, 0x27476364, 0x00C0C0C0, 0x0FCFC3CC, 0x17C7D3D4, 0x3888B0B8, 0x0F0F030C, 0x0E8E828C, 0x02424240, 0x23032320, 0x11819190, 0x2C4C606C, 0x1BCBD3D8, 0x2484A0A4, 0x34043034, 0x31C1F1F0, 0x08484048, 0x02C2C2C0, 0x2F4F636C, 0x3D0D313C, 0x2D0D212C, 0x00404040, 0x3E8EB2BC, 0x3E0E323C, 0x3C8CB0BC, 0x01C1C1C0, 0x2A8AA2A8, 0x3A8AB2B8, 0x0E4E424C, 0x15455154, 0x3B0B3338, 0x1CCCD0DC, 0x28486068, 0x3F4F737C, 0x1C8C909C, 0x18C8D0D8, 0x0A4A4248, 0x16465254, 0x37477374, 0x2080A0A0, 0x2DCDE1EC, 0x06464244, 0x3585B1B4, 0x2B0B2328, 0x25456164, 0x3ACAF2F8, 0x23C3E3E0, 0x3989B1B8, 0x3181B1B0, 0x1F8F939C, 0x1E4E525C, 0x39C9F1F8, 0x26C6E2E4, 0x3282B2B0, 0x31013130, 0x2ACAE2E8, 0x2D4D616C, 0x1F4F535C, 0x24C4E0E4, 0x30C0F0F0, 0x0DCDC1CC, 0x08888088, 0x16061214, 0x3A0A3238, 0x18485058, 0x14C4D0D4, 0x22426260, 0x29092128, 0x07070304, 0x33033330, 0x28C8E0E8, 0x1B0B1318, 0x05050104, 0x39497178, 0x10809090, 0x2A4A6268, 0x2A0A2228, 0x1A8A9298 }; const uint32_t SEED_S1[256] = { 0x38380830, 0xE828C8E0, 0x2C2D0D21, 0xA42686A2, 0xCC0FCFC3, 0xDC1ECED2, 0xB03383B3, 0xB83888B0, 0xAC2F8FA3, 0x60204060, 0x54154551, 0xC407C7C3, 0x44044440, 0x6C2F4F63, 0x682B4B63, 0x581B4B53, 0xC003C3C3, 0x60224262, 0x30330333, 0xB43585B1, 0x28290921, 0xA02080A0, 0xE022C2E2, 0xA42787A3, 0xD013C3D3, 0x90118191, 0x10110111, 0x04060602, 0x1C1C0C10, 0xBC3C8CB0, 0x34360632, 0x480B4B43, 0xEC2FCFE3, 0x88088880, 0x6C2C4C60, 0xA82888A0, 0x14170713, 0xC404C4C0, 0x14160612, 0xF434C4F0, 0xC002C2C2, 0x44054541, 0xE021C1E1, 0xD416C6D2, 0x3C3F0F33, 0x3C3D0D31, 0x8C0E8E82, 0x98188890, 0x28280820, 0x4C0E4E42, 0xF436C6F2, 0x3C3E0E32, 0xA42585A1, 0xF839C9F1, 0x0C0D0D01, 0xDC1FCFD3, 0xD818C8D0, 0x282B0B23, 0x64264662, 0x783A4A72, 0x24270723, 0x2C2F0F23, 0xF031C1F1, 0x70324272, 0x40024242, 0xD414C4D0, 0x40014141, 0xC000C0C0, 0x70334373, 0x64274763, 0xAC2C8CA0, 0x880B8B83, 0xF437C7F3, 0xAC2D8DA1, 0x80008080, 0x1C1F0F13, 0xC80ACAC2, 0x2C2C0C20, 0xA82A8AA2, 0x34340430, 0xD012C2D2, 0x080B0B03, 0xEC2ECEE2, 0xE829C9E1, 0x5C1D4D51, 0x94148490, 0x18180810, 0xF838C8F0, 0x54174753, 0xAC2E8EA2, 0x08080800, 0xC405C5C1, 0x10130313, 0xCC0DCDC1, 0x84068682, 0xB83989B1, 0xFC3FCFF3, 0x7C3D4D71, 0xC001C1C1, 0x30310131, 0xF435C5F1, 0x880A8A82, 0x682A4A62, 0xB03181B1, 0xD011C1D1, 0x20200020, 0xD417C7D3, 0x00020202, 0x20220222, 0x04040400, 0x68284860, 0x70314171, 0x04070703, 0xD81BCBD3, 0x9C1D8D91, 0x98198991, 0x60214161, 0xBC3E8EB2, 0xE426C6E2, 0x58194951, 0xDC1DCDD1, 0x50114151, 0x90108090, 0xDC1CCCD0, 0x981A8A92, 0xA02383A3, 0xA82B8BA3, 0xD010C0D0, 0x80018181, 0x0C0F0F03, 0x44074743, 0x181A0A12, 0xE023C3E3, 0xEC2CCCE0, 0x8C0D8D81, 0xBC3F8FB3, 0x94168692, 0x783B4B73, 0x5C1C4C50, 0xA02282A2, 0xA02181A1, 0x60234363, 0x20230323, 0x4C0D4D41, 0xC808C8C0, 0x9C1E8E92, 0x9C1C8C90, 0x383A0A32, 0x0C0C0C00, 0x2C2E0E22, 0xB83A8AB2, 0x6C2E4E62, 0x9C1F8F93, 0x581A4A52, 0xF032C2F2, 0x90128292, 0xF033C3F3, 0x48094941, 0x78384870, 0xCC0CCCC0, 0x14150511, 0xF83BCBF3, 0x70304070, 0x74354571, 0x7C3F4F73, 0x34350531, 0x10100010, 0x00030303, 0x64244460, 0x6C2D4D61, 0xC406C6C2, 0x74344470, 0xD415C5D1, 0xB43484B0, 0xE82ACAE2, 0x08090901, 0x74364672, 0x18190911, 0xFC3ECEF2, 0x40004040, 0x10120212, 0xE020C0E0, 0xBC3D8DB1, 0x04050501, 0xF83ACAF2, 0x00010101, 0xF030C0F0, 0x282A0A22, 0x5C1E4E52, 0xA82989A1, 0x54164652, 0x40034343, 0x84058581, 0x14140410, 0x88098981, 0x981B8B93, 0xB03080B0, 0xE425C5E1, 0x48084840, 0x78394971, 0x94178793, 0xFC3CCCF0, 0x1C1E0E12, 0x80028282, 0x20210121, 0x8C0C8C80, 0x181B0B13, 0x5C1F4F53, 0x74374773, 0x54144450, 0xB03282B2, 0x1C1D0D11, 0x24250521, 0x4C0F4F43, 0x00000000, 0x44064642, 0xEC2DCDE1, 0x58184850, 0x50124252, 0xE82BCBE3, 0x7C3E4E72, 0xD81ACAD2, 0xC809C9C1, 0xFC3DCDF1, 0x30300030, 0x94158591, 0x64254561, 0x3C3C0C30, 0xB43686B2, 0xE424C4E0, 0xB83B8BB3, 0x7C3C4C70, 0x0C0E0E02, 0x50104050, 0x38390931, 0x24260622, 0x30320232, 0x84048480, 0x68294961, 0x90138393, 0x34370733, 0xE427C7E3, 0x24240420, 0xA42484A0, 0xC80BCBC3, 0x50134353, 0x080A0A02, 0x84078783, 0xD819C9D1, 0x4C0C4C40, 0x80038383, 0x8C0F8F83, 0xCC0ECEC2, 0x383B0B33, 0x480A4A42, 0xB43787B3 }; const uint32_t SEED_S2[256] = { 0xA1A82989, 0x81840585, 0xD2D416C6, 0xD3D013C3, 0x50541444, 0x111C1D0D, 0xA0AC2C8C, 0x21242505, 0x515C1D4D, 0x43400343, 0x10181808, 0x121C1E0E, 0x51501141, 0xF0FC3CCC, 0xC2C80ACA, 0x63602343, 0x20282808, 0x40440444, 0x20202000, 0x919C1D8D, 0xE0E020C0, 0xE2E022C2, 0xC0C808C8, 0x13141707, 0xA1A42585, 0x838C0F8F, 0x03000303, 0x73783B4B, 0xB3B83B8B, 0x13101303, 0xD2D012C2, 0xE2EC2ECE, 0x70703040, 0x808C0C8C, 0x333C3F0F, 0xA0A82888, 0x32303202, 0xD1DC1DCD, 0xF2F436C6, 0x70743444, 0xE0EC2CCC, 0x91941585, 0x03080B0B, 0x53541747, 0x505C1C4C, 0x53581B4B, 0xB1BC3D8D, 0x01000101, 0x20242404, 0x101C1C0C, 0x73703343, 0x90981888, 0x10101000, 0xC0CC0CCC, 0xF2F032C2, 0xD1D819C9, 0x202C2C0C, 0xE3E427C7, 0x72703242, 0x83800383, 0x93981B8B, 0xD1D011C1, 0x82840686, 0xC1C809C9, 0x60602040, 0x50501040, 0xA3A02383, 0xE3E82BCB, 0x010C0D0D, 0xB2B43686, 0x929C1E8E, 0x434C0F4F, 0xB3B43787, 0x52581A4A, 0xC2C406C6, 0x70783848, 0xA2A42686, 0x12101202, 0xA3AC2F8F, 0xD1D415C5, 0x61602141, 0xC3C003C3, 0xB0B43484, 0x41400141, 0x52501242, 0x717C3D4D, 0x818C0D8D, 0x00080808, 0x131C1F0F, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343, 0xF3F437C7, 0xE1E021C1, 0xF1FC3DCD, 0x72743646, 0x232C2F0F, 0x23242707, 0xB0B03080, 0x83880B8B, 0x020C0E0E, 0xA3A82B8B, 0xA2A02282, 0x626C2E4E, 0x93901383, 0x414C0D4D, 0x61682949, 0x707C3C4C, 0x01080909, 0x02080A0A, 0xB3BC3F8F, 0xE3EC2FCF, 0xF3F033C3, 0xC1C405C5, 0x83840787, 0x10141404, 0xF2FC3ECE, 0x60642444, 0xD2DC1ECE, 0x222C2E0E, 0x43480B4B, 0x12181A0A, 0x02040606, 0x21202101, 0x63682B4B, 0x62642646, 0x02000202, 0xF1F435C5, 0x92901282, 0x82880A8A, 0x000C0C0C, 0xB3B03383, 0x727C3E4E, 0xD0D010C0, 0x72783A4A, 0x43440747, 0x92941686, 0xE1E425C5, 0x22242606, 0x80800080, 0xA1AC2D8D, 0xD3DC1FCF, 0xA1A02181, 0x30303000, 0x33343707, 0xA2AC2E8E, 0x32343606, 0x11141505, 0x22202202, 0x30383808, 0xF0F434C4, 0xA3A42787, 0x41440545, 0x404C0C4C, 0x81800181, 0xE1E829C9, 0x80840484, 0x93941787, 0x31343505, 0xC3C80BCB, 0xC2CC0ECE, 0x303C3C0C, 0x71703141, 0x11101101, 0xC3C407C7, 0x81880989, 0x71743545, 0xF3F83BCB, 0xD2D81ACA, 0xF0F838C8, 0x90941484, 0x51581949, 0x82800282, 0xC0C404C4, 0xF3FC3FCF, 0x41480949, 0x31383909, 0x63642747, 0xC0C000C0, 0xC3CC0FCF, 0xD3D417C7, 0xB0B83888, 0x030C0F0F, 0x828C0E8E, 0x42400242, 0x23202303, 0x91901181, 0x606C2C4C, 0xD3D81BCB, 0xA0A42484, 0x30343404, 0xF1F031C1, 0x40480848, 0xC2C002C2, 0x636C2F4F, 0x313C3D0D, 0x212C2D0D, 0x40400040, 0xB2BC3E8E, 0x323C3E0E, 0xB0BC3C8C, 0xC1C001C1, 0xA2A82A8A, 0xB2B83A8A, 0x424C0E4E, 0x51541545, 0x33383B0B, 0xD0DC1CCC, 0x60682848, 0x737C3F4F, 0x909C1C8C, 0xD0D818C8, 0x42480A4A, 0x52541646, 0x73743747, 0xA0A02080, 0xE1EC2DCD, 0x42440646, 0xB1B43585, 0x23282B0B, 0x61642545, 0xF2F83ACA, 0xE3E023C3, 0xB1B83989, 0xB1B03181, 0x939C1F8F, 0x525C1E4E, 0xF1F839C9, 0xE2E426C6, 0xB2B03282, 0x31303101, 0xE2E82ACA, 0x616C2D4D, 0x535C1F4F, 0xE0E424C4, 0xF0F030C0, 0xC1CC0DCD, 0x80880888, 0x12141606, 0x32383A0A, 0x50581848, 0xD0D414C4, 0x62602242, 0x21282909, 0x03040707, 0x33303303, 0xE0E828C8, 0x13181B0B, 0x01040505, 0x71783949, 0x90901080, 0x62682A4A, 0x22282A0A, 0x92981A8A }; const uint32_t SEED_S3[256] = { 0x08303838, 0xC8E0E828, 0x0D212C2D, 0x86A2A426, 0xCFC3CC0F, 0xCED2DC1E, 0x83B3B033, 0x88B0B838, 0x8FA3AC2F, 0x40606020, 0x45515415, 0xC7C3C407, 0x44404404, 0x4F636C2F, 0x4B63682B, 0x4B53581B, 0xC3C3C003, 0x42626022, 0x03333033, 0x85B1B435, 0x09212829, 0x80A0A020, 0xC2E2E022, 0x87A3A427, 0xC3D3D013, 0x81919011, 0x01111011, 0x06020406, 0x0C101C1C, 0x8CB0BC3C, 0x06323436, 0x4B43480B, 0xCFE3EC2F, 0x88808808, 0x4C606C2C, 0x88A0A828, 0x07131417, 0xC4C0C404, 0x06121416, 0xC4F0F434, 0xC2C2C002, 0x45414405, 0xC1E1E021, 0xC6D2D416, 0x0F333C3F, 0x0D313C3D, 0x8E828C0E, 0x88909818, 0x08202828, 0x4E424C0E, 0xC6F2F436, 0x0E323C3E, 0x85A1A425, 0xC9F1F839, 0x0D010C0D, 0xCFD3DC1F, 0xC8D0D818, 0x0B23282B, 0x46626426, 0x4A72783A, 0x07232427, 0x0F232C2F, 0xC1F1F031, 0x42727032, 0x42424002, 0xC4D0D414, 0x41414001, 0xC0C0C000, 0x43737033, 0x47636427, 0x8CA0AC2C, 0x8B83880B, 0xC7F3F437, 0x8DA1AC2D, 0x80808000, 0x0F131C1F, 0xCAC2C80A, 0x0C202C2C, 0x8AA2A82A, 0x04303434, 0xC2D2D012, 0x0B03080B, 0xCEE2EC2E, 0xC9E1E829, 0x4D515C1D, 0x84909414, 0x08101818, 0xC8F0F838, 0x47535417, 0x8EA2AC2E, 0x08000808, 0xC5C1C405, 0x03131013, 0xCDC1CC0D, 0x86828406, 0x89B1B839, 0xCFF3FC3F, 0x4D717C3D, 0xC1C1C001, 0x01313031, 0xC5F1F435, 0x8A82880A, 0x4A62682A, 0x81B1B031, 0xC1D1D011, 0x00202020, 0xC7D3D417, 0x02020002, 0x02222022, 0x04000404, 0x48606828, 0x41717031, 0x07030407, 0xCBD3D81B, 0x8D919C1D, 0x89919819, 0x41616021, 0x8EB2BC3E, 0xC6E2E426, 0x49515819, 0xCDD1DC1D, 0x41515011, 0x80909010, 0xCCD0DC1C, 0x8A92981A, 0x83A3A023, 0x8BA3A82B, 0xC0D0D010, 0x81818001, 0x0F030C0F, 0x47434407, 0x0A12181A, 0xC3E3E023, 0xCCE0EC2C, 0x8D818C0D, 0x8FB3BC3F, 0x86929416, 0x4B73783B, 0x4C505C1C, 0x82A2A022, 0x81A1A021, 0x43636023, 0x03232023, 0x4D414C0D, 0xC8C0C808, 0x8E929C1E, 0x8C909C1C, 0x0A32383A, 0x0C000C0C, 0x0E222C2E, 0x8AB2B83A, 0x4E626C2E, 0x8F939C1F, 0x4A52581A, 0xC2F2F032, 0x82929012, 0xC3F3F033, 0x49414809, 0x48707838, 0xCCC0CC0C, 0x05111415, 0xCBF3F83B, 0x40707030, 0x45717435, 0x4F737C3F, 0x05313435, 0x00101010, 0x03030003, 0x44606424, 0x4D616C2D, 0xC6C2C406, 0x44707434, 0xC5D1D415, 0x84B0B434, 0xCAE2E82A, 0x09010809, 0x46727436, 0x09111819, 0xCEF2FC3E, 0x40404000, 0x02121012, 0xC0E0E020, 0x8DB1BC3D, 0x05010405, 0xCAF2F83A, 0x01010001, 0xC0F0F030, 0x0A22282A, 0x4E525C1E, 0x89A1A829, 0x46525416, 0x43434003, 0x85818405, 0x04101414, 0x89818809, 0x8B93981B, 0x80B0B030, 0xC5E1E425, 0x48404808, 0x49717839, 0x87939417, 0xCCF0FC3C, 0x0E121C1E, 0x82828002, 0x01212021, 0x8C808C0C, 0x0B13181B, 0x4F535C1F, 0x47737437, 0x44505414, 0x82B2B032, 0x0D111C1D, 0x05212425, 0x4F434C0F, 0x00000000, 0x46424406, 0xCDE1EC2D, 0x48505818, 0x42525012, 0xCBE3E82B, 0x4E727C3E, 0xCAD2D81A, 0xC9C1C809, 0xCDF1FC3D, 0x00303030, 0x85919415, 0x45616425, 0x0C303C3C, 0x86B2B436, 0xC4E0E424, 0x8BB3B83B, 0x4C707C3C, 0x0E020C0E, 0x40505010, 0x09313839, 0x06222426, 0x02323032, 0x84808404, 0x49616829, 0x83939013, 0x07333437, 0xC7E3E427, 0x04202424, 0x84A0A424, 0xCBC3C80B, 0x43535013, 0x0A02080A, 0x87838407, 0xC9D1D819, 0x4C404C0C, 0x83838003, 0x8F838C0F, 0xCEC2CC0E, 0x0B33383B, 0x4A42480A, 0x87B3B437 }; /* * SEED G Function */ inline uint32_t SEED_G(uint32_t X) { return (SEED_S0[get_byte(3, X)] ^ SEED_S1[get_byte(2, X)] ^ SEED_S2[get_byte(1, X)] ^ SEED_S3[get_byte(0, X)]); } } /* * SEED Encryption */ void SEED::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_K.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t B0 = load_be(in, 0); uint32_t B1 = load_be(in, 1); uint32_t B2 = load_be(in, 2); uint32_t B3 = load_be(in, 3); for(size_t j = 0; j != 16; j += 2) { uint32_t T0, T1; T0 = B2 ^ m_K[2*j]; T1 = SEED_G(B2 ^ B3 ^ m_K[2*j+1]); T0 = SEED_G(T1 + T0); T1 = SEED_G(T1 + T0); B1 ^= T1; B0 ^= T0 + T1; T0 = B0 ^ m_K[2*j+2]; T1 = SEED_G(B0 ^ B1 ^ m_K[2*j+3]); T0 = SEED_G(T1 + T0); T1 = SEED_G(T1 + T0); B3 ^= T1; B2 ^= T0 + T1; } store_be(out, B2, B3, B0, B1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SEED Decryption */ void SEED::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_K.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t B0 = load_be(in, 0); uint32_t B1 = load_be(in, 1); uint32_t B2 = load_be(in, 2); uint32_t B3 = load_be(in, 3); for(size_t j = 0; j != 16; j += 2) { uint32_t T0, T1; T0 = B2 ^ m_K[30-2*j]; T1 = SEED_G(B2 ^ B3 ^ m_K[31-2*j]); T0 = SEED_G(T1 + T0); T1 = SEED_G(T1 + T0); B1 ^= T1; B0 ^= T0 + T1; T0 = B0 ^ m_K[28-2*j]; T1 = SEED_G(B0 ^ B1 ^ m_K[29-2*j]); T0 = SEED_G(T1 + T0); T1 = SEED_G(T1 + T0); B3 ^= T1; B2 ^= T0 + T1; } store_be(out, B2, B3, B0, B1); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SEED Key Schedule */ void SEED::key_schedule(const uint8_t key[], size_t) { const uint32_t RC[16] = { 0x9E3779B9, 0x3C6EF373, 0x78DDE6E6, 0xF1BBCDCC, 0xE3779B99, 0xC6EF3733, 0x8DDE6E67, 0x1BBCDCCF, 0x3779B99E, 0x6EF3733C, 0xDDE6E678, 0xBBCDCCF1, 0x779B99E3, 0xEF3733C6, 0xDE6E678D, 0xBCDCCF1B }; secure_vector WK(4); for(size_t i = 0; i != 4; ++i) WK[i] = load_be(key, i); m_K.resize(32); for(size_t i = 0; i != 16; i += 2) { m_K[2*i ] = SEED_G(WK[0] + WK[2] - RC[i]); m_K[2*i+1] = SEED_G(WK[1] - WK[3] + RC[i]) ^ m_K[2*i]; uint32_t T = (WK[0] & 0xFF) << 24; WK[0] = (WK[0] >> 8) | (get_byte(3, WK[1]) << 24); WK[1] = (WK[1] >> 8) | T; m_K[2*i+2] = SEED_G(WK[0] + WK[2] - RC[i+1]); m_K[2*i+3] = SEED_G(WK[1] - WK[3] + RC[i+1]) ^ m_K[2*i+2]; T = get_byte(0, WK[3]); WK[3] = (WK[3] << 8) | get_byte(0, WK[2]); WK[2] = (WK[2] << 8) | T; } } void SEED::clear() { zap(m_K); } } botan-2.4.0/src/lib/block/seed/seed.h000066400000000000000000000014341322470703100172610ustar00rootroot00000000000000/* * SEED * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SEED_H_ #define BOTAN_SEED_H_ #include namespace Botan { /** * SEED, a Korean block cipher */ class BOTAN_PUBLIC_API(2,0) SEED final : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "SEED"; } BlockCipher* clone() const override { return new SEED; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_K; }; } #endif botan-2.4.0/src/lib/block/serpent/000077500000000000000000000000001322470703100167265ustar00rootroot00000000000000botan-2.4.0/src/lib/block/serpent/info.txt000066400000000000000000000002121322470703100204150ustar00rootroot00000000000000 SERPENT -> 20131128 serpent.h serpent_sbox.h botan-2.4.0/src/lib/block/serpent/serpent.cpp000066400000000000000000000224661322470703100211240ustar00rootroot00000000000000/* * Serpent * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_SERPENT_SIMD) #include #endif namespace Botan { namespace { /* * Serpent's Linear Transform */ inline void transform(uint32_t& B0, uint32_t& B1, uint32_t& B2, uint32_t& B3) { B0 = rotl<13>(B0); B2 = rotl<3>(B2); B1 ^= B0 ^ B2; B3 ^= B2 ^ (B0 << 3); B1 = rotl<1>(B1); B3 = rotl<7>(B3); B0 ^= B1 ^ B3; B2 ^= B3 ^ (B1 << 7); B0 = rotl<5>(B0); B2 = rotl<22>(B2); } /* * Serpent's Inverse Linear Transform */ inline void i_transform(uint32_t& B0, uint32_t& B1, uint32_t& B2, uint32_t& B3) { B2 = rotr<22>(B2); B0 = rotr<5>(B0); B2 ^= B3 ^ (B1 << 7); B0 ^= B1 ^ B3; B3 = rotr<7>(B3); B1 = rotr<1>(B1); B3 ^= B2 ^ (B0 << 3); B1 ^= B0 ^ B2; B2 = rotr<3>(B2); B0 = rotr<13>(B0); } } /* * XOR a key block with a data block */ #define key_xor(round, B0, B1, B2, B3) \ B0 ^= m_round_key[4*round ]; \ B1 ^= m_round_key[4*round+1]; \ B2 ^= m_round_key[4*round+2]; \ B3 ^= m_round_key[4*round+3]; /* * Serpent Encryption */ void Serpent::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); #if defined(BOTAN_HAS_SERPENT_SIMD) if(CPUID::has_simd_32()) { while(blocks >= 4) { simd_encrypt_4(in, out); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } } #endif BOTAN_PARALLEL_SIMD_FOR(size_t i = 0; i < blocks; ++i) { uint32_t B0, B1, B2, B3; load_le(in + 16*i, B0, B1, B2, B3); key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3); store_le(out + 16*i, B0, B1, B2, B3); } } /* * Serpent Decryption */ void Serpent::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_round_key.empty() == false); #if defined(BOTAN_HAS_SERPENT_SIMD) if(CPUID::has_simd_32()) { while(blocks >= 4) { simd_decrypt_4(in, out); in += 4 * BLOCK_SIZE; out += 4 * BLOCK_SIZE; blocks -= 4; } } #endif BOTAN_PARALLEL_SIMD_FOR(size_t i = 0; i < blocks; ++i) { uint32_t B0, B1, B2, B3; load_le(in + 16*i, B0, B1, B2, B3); key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3); store_le(out + 16*i, B0, B1, B2, B3); } } #undef key_xor #undef transform #undef i_transform /* * Serpent Key Schedule */ void Serpent::key_schedule(const uint8_t key[], size_t length) { const uint32_t PHI = 0x9E3779B9; secure_vector W(140); for(size_t i = 0; i != length / 4; ++i) W[i] = load_le(key, i); W[length / 4] |= uint32_t(1) << ((length%4)*8); for(size_t i = 8; i != 140; ++i) { uint32_t wi = W[i-8] ^ W[i-5] ^ W[i-3] ^ W[i-1] ^ PHI ^ uint32_t(i-8); W[i] = rotl<11>(wi); } SBoxE1(W[ 20],W[ 21],W[ 22],W[ 23]); SBoxE1(W[ 52],W[ 53],W[ 54],W[ 55]); SBoxE1(W[ 84],W[ 85],W[ 86],W[ 87]); SBoxE1(W[116],W[117],W[118],W[119]); SBoxE2(W[ 16],W[ 17],W[ 18],W[ 19]); SBoxE2(W[ 48],W[ 49],W[ 50],W[ 51]); SBoxE2(W[ 80],W[ 81],W[ 82],W[ 83]); SBoxE2(W[112],W[113],W[114],W[115]); SBoxE3(W[ 12],W[ 13],W[ 14],W[ 15]); SBoxE3(W[ 44],W[ 45],W[ 46],W[ 47]); SBoxE3(W[ 76],W[ 77],W[ 78],W[ 79]); SBoxE3(W[108],W[109],W[110],W[111]); SBoxE4(W[ 8],W[ 9],W[ 10],W[ 11]); SBoxE4(W[ 40],W[ 41],W[ 42],W[ 43]); SBoxE4(W[ 72],W[ 73],W[ 74],W[ 75]); SBoxE4(W[104],W[105],W[106],W[107]); SBoxE4(W[136],W[137],W[138],W[139]); SBoxE5(W[ 36],W[ 37],W[ 38],W[ 39]); SBoxE5(W[ 68],W[ 69],W[ 70],W[ 71]); SBoxE5(W[100],W[101],W[102],W[103]); SBoxE5(W[132],W[133],W[134],W[135]); SBoxE6(W[ 32],W[ 33],W[ 34],W[ 35]); SBoxE6(W[ 64],W[ 65],W[ 66],W[ 67]); SBoxE6(W[ 96],W[ 97],W[ 98],W[ 99]); SBoxE6(W[128],W[129],W[130],W[131]); SBoxE7(W[ 28],W[ 29],W[ 30],W[ 31]); SBoxE7(W[ 60],W[ 61],W[ 62],W[ 63]); SBoxE7(W[ 92],W[ 93],W[ 94],W[ 95]); SBoxE7(W[124],W[125],W[126],W[127]); SBoxE8(W[ 24],W[ 25],W[ 26],W[ 27]); SBoxE8(W[ 56],W[ 57],W[ 58],W[ 59]); SBoxE8(W[ 88],W[ 89],W[ 90],W[ 91]); SBoxE8(W[120],W[121],W[122],W[123]); m_round_key.assign(W.begin() + 8, W.end()); } void Serpent::clear() { zap(m_round_key); } std::string Serpent::provider() const { #if defined(BOTAN_HAS_SERPENT_SIMD) if(CPUID::has_simd_32()) { return "simd"; } #endif return "base"; } } botan-2.4.0/src/lib/block/serpent/serpent.h000066400000000000000000000025211322470703100205570ustar00rootroot00000000000000/* * Serpent * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SERPENT_H_ #define BOTAN_SERPENT_H_ #include namespace Botan { /** * Serpent is the most conservative of the AES finalists * https://www.cl.cam.ac.uk/~rja14/serpent.html */ class BOTAN_PUBLIC_API(2,0) Serpent final : public Block_Cipher_Fixed_Params<16, 16, 32, 8> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string provider() const override; std::string name() const override { return "Serpent"; } BlockCipher* clone() const override { return new Serpent; } size_t parallelism() const override { return 4; } private: #if defined(BOTAN_HAS_SERPENT_SIMD) /** * Encrypt 4 blocks in parallel using SSE2 or AltiVec */ void simd_encrypt_4(const uint8_t in[64], uint8_t out[64]) const; /** * Decrypt 4 blocks in parallel using SSE2 or AltiVec */ void simd_decrypt_4(const uint8_t in[64], uint8_t out[64]) const; #endif void key_schedule(const uint8_t key[], size_t length) override; secure_vector m_round_key; }; } #endif botan-2.4.0/src/lib/block/serpent/serpent_sbox.h000066400000000000000000000477541322470703100216330ustar00rootroot00000000000000/* * Serpent SBox Expressions * (C) 1999-2007,2013 Jack Lloyd * * The sbox expressions used here were discovered by Dag Arne Osvik and * are described in his paper "Speeding Up Serpent". * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SERPENT_SBOX_H_ #define BOTAN_SERPENT_SBOX_H_ #define SBoxE1(B0, B1, B2, B3) \ do { \ B3 ^= B0; \ auto B4 = B1; \ B1 &= B3; \ B4 ^= B2; \ B1 ^= B0; \ B0 |= B3; \ B0 ^= B4; \ B4 ^= B3; \ B3 ^= B2; \ B2 |= B1; \ B2 ^= B4; \ B4 = ~B4; \ B4 |= B1; \ B1 ^= B3; \ B1 ^= B4; \ B3 |= B0; \ B1 ^= B3; \ B4 ^= B3; \ B3 = B0; \ B0 = B1; \ B1 = B4; \ } while(0) #define SBoxE2(B0, B1, B2, B3) \ do { \ B0 = ~B0; \ B2 = ~B2; \ auto B4 = B0; \ B0 &= B1; \ B2 ^= B0; \ B0 |= B3; \ B3 ^= B2; \ B1 ^= B0; \ B0 ^= B4; \ B4 |= B1; \ B1 ^= B3; \ B2 |= B0; \ B2 &= B4; \ B0 ^= B1; \ B1 &= B2; \ B1 ^= B0; \ B0 &= B2; \ B4 ^= B0; \ B0 = B2; \ B2 = B3; \ B3 = B1; \ B1 = B4; \ } while(0) #define SBoxE3(B0, B1, B2, B3) \ do { \ auto B4 = B0; \ B0 &= B2; \ B0 ^= B3; \ B2 ^= B1; \ B2 ^= B0; \ B3 |= B4; \ B3 ^= B1; \ B4 ^= B2; \ B1 = B3; \ B3 |= B4; \ B3 ^= B0; \ B0 &= B1; \ B4 ^= B0; \ B1 ^= B3; \ B1 ^= B4; \ B0 = B2; \ B2 = B1; \ B1 = B3; \ B3 = ~B4; \ } while(0) #define SBoxE4(B0, B1, B2, B3) \ do { \ auto B4 = B0; \ B0 |= B3; \ B3 ^= B1; \ B1 &= B4; \ B4 ^= B2; \ B2 ^= B3; \ B3 &= B0; \ B4 |= B1; \ B3 ^= B4; \ B0 ^= B1; \ B4 &= B0; \ B1 ^= B3; \ B4 ^= B2; \ B1 |= B0; \ B1 ^= B2; \ B0 ^= B3; \ B2 = B1; \ B1 |= B3; \ B0 ^= B1; \ B1 = B2; \ B2 = B3; \ B3 = B4; \ } while(0) #define SBoxE5(B0, B1, B2, B3) \ do { \ B1 ^= B3; \ B3 = ~B3; \ B2 ^= B3; \ B3 ^= B0; \ auto B4 = B1; \ B1 &= B3; \ B1 ^= B2; \ B4 ^= B3; \ B0 ^= B4; \ B2 &= B4; \ B2 ^= B0; \ B0 &= B1; \ B3 ^= B0; \ B4 |= B1; \ B4 ^= B0; \ B0 |= B3; \ B0 ^= B2; \ B2 &= B3; \ B0 = ~B0; \ B4 ^= B2; \ B2 = B0; \ B0 = B1; \ B1 = B4; \ } while(0) #define SBoxE6(B0, B1, B2, B3) \ do { \ B0 ^= B1; \ B1 ^= B3; \ B3 = ~B3; \ auto B4 = B1; \ B1 &= B0; \ B2 ^= B3; \ B1 ^= B2; \ B2 |= B4; \ B4 ^= B3; \ B3 &= B1; \ B3 ^= B0; \ B4 ^= B1; \ B4 ^= B2; \ B2 ^= B0; \ B0 &= B3; \ B2 = ~B2; \ B0 ^= B4; \ B4 |= B3; \ B4 ^= B2; \ B2 = B0; \ B0 = B1; \ B1 = B3; \ B3 = B4; \ } while(0) #define SBoxE7(B0, B1, B2, B3) \ do { \ B2 = ~B2; \ auto B4 = B3; \ B3 &= B0; \ B0 ^= B4; \ B3 ^= B2; \ B2 |= B4; \ B1 ^= B3; \ B2 ^= B0; \ B0 |= B1; \ B2 ^= B1; \ B4 ^= B0; \ B0 |= B3; \ B0 ^= B2; \ B4 ^= B3; \ B4 ^= B0; \ B3 = ~B3; \ B2 &= B4; \ B3 ^= B2; \ B2 = B4; \ } while(0) #define SBoxE8(B0, B1, B2, B3) \ do { \ auto B4 = B1; \ B1 |= B2; \ B1 ^= B3; \ B4 ^= B2; \ B2 ^= B1; \ B3 |= B4; \ B3 &= B0; \ B4 ^= B2; \ B3 ^= B1; \ B1 |= B4; \ B1 ^= B0; \ B0 |= B4; \ B0 ^= B2; \ B1 ^= B4; \ B2 ^= B1; \ B1 &= B0; \ B1 ^= B4; \ B2 = ~B2; \ B2 |= B0; \ B4 ^= B2; \ B2 = B1; \ B1 = B3; \ B3 = B0; \ B0 = B4; \ } while(0) #define SBoxD1(B0, B1, B2, B3) \ do { \ B2 = ~B2; \ auto B4 = B1; \ B1 |= B0; \ B4 = ~B4; \ B1 ^= B2; \ B2 |= B4; \ B1 ^= B3; \ B0 ^= B4; \ B2 ^= B0; \ B0 &= B3; \ B4 ^= B0; \ B0 |= B1; \ B0 ^= B2; \ B3 ^= B4; \ B2 ^= B1; \ B3 ^= B0; \ B3 ^= B1; \ B2 &= B3; \ B4 ^= B2; \ B2 = B1; \ B1 = B4; \ } while(0) #define SBoxD2(B0, B1, B2, B3) \ do { \ auto B4 = B1; \ B1 ^= B3; \ B3 &= B1; \ B4 ^= B2; \ B3 ^= B0; \ B0 |= B1; \ B2 ^= B3; \ B0 ^= B4; \ B0 |= B2; \ B1 ^= B3; \ B0 ^= B1; \ B1 |= B3; \ B1 ^= B0; \ B4 = ~B4; \ B4 ^= B1; \ B1 |= B0; \ B1 ^= B0; \ B1 |= B4; \ B3 ^= B1; \ B1 = B0; \ B0 = B4; \ B4 = B2; \ B2 = B3; \ B3 = B4; \ } while(0) #define SBoxD3(B0, B1, B2, B3) \ do { \ B2 ^= B3; \ B3 ^= B0; \ auto B4 = B3; \ B3 &= B2; \ B3 ^= B1; \ B1 |= B2; \ B1 ^= B4; \ B4 &= B3; \ B2 ^= B3; \ B4 &= B0; \ B4 ^= B2; \ B2 &= B1; \ B2 |= B0; \ B3 = ~B3; \ B2 ^= B3; \ B0 ^= B3; \ B0 &= B1; \ B3 ^= B4; \ B3 ^= B0; \ B0 = B1; \ B1 = B4; \ } while(0) #define SBoxD4(B0, B1, B2, B3) \ do { \ auto B4 = B2; \ B2 ^= B1; \ B0 ^= B2; \ B4 &= B2; \ B4 ^= B0; \ B0 &= B1; \ B1 ^= B3; \ B3 |= B4; \ B2 ^= B3; \ B0 ^= B3; \ B1 ^= B4; \ B3 &= B2; \ B3 ^= B1; \ B1 ^= B0; \ B1 |= B2; \ B0 ^= B3; \ B1 ^= B4; \ B0 ^= B1; \ B4 = B0; \ B0 = B2; \ B2 = B3; \ B3 = B4; \ } while(0) #define SBoxD5(B0, B1, B2, B3) \ do { \ auto B4 = B2; \ B2 &= B3; \ B2 ^= B1; \ B1 |= B3; \ B1 &= B0; \ B4 ^= B2; \ B4 ^= B1; \ B1 &= B2; \ B0 = ~B0; \ B3 ^= B4; \ B1 ^= B3; \ B3 &= B0; \ B3 ^= B2; \ B0 ^= B1; \ B2 &= B0; \ B3 ^= B0; \ B2 ^= B4; \ B2 |= B3; \ B3 ^= B0; \ B2 ^= B1; \ B1 = B3; \ B3 = B4; \ } while(0) #define SBoxD6(B0, B1, B2, B3) \ do { \ B1 = ~B1; \ auto B4 = B3; \ B2 ^= B1; \ B3 |= B0; \ B3 ^= B2; \ B2 |= B1; \ B2 &= B0; \ B4 ^= B3; \ B2 ^= B4; \ B4 |= B0; \ B4 ^= B1; \ B1 &= B2; \ B1 ^= B3; \ B4 ^= B2; \ B3 &= B4; \ B4 ^= B1; \ B3 ^= B4; \ B4 = ~B4; \ B3 ^= B0; \ B0 = B1; \ B1 = B4; \ B4 = B3; \ B3 = B2; \ B2 = B4; \ } while(0) #define SBoxD7(B0, B1, B2, B3) \ do { \ B0 ^= B2; \ auto B4 = B2; \ B2 &= B0; \ B4 ^= B3; \ B2 = ~B2; \ B3 ^= B1; \ B2 ^= B3; \ B4 |= B0; \ B0 ^= B2; \ B3 ^= B4; \ B4 ^= B1; \ B1 &= B3; \ B1 ^= B0; \ B0 ^= B3; \ B0 |= B2; \ B3 ^= B1; \ B4 ^= B0; \ B0 = B1; \ B1 = B2; \ B2 = B4; \ } while(0) #define SBoxD8(B0, B1, B2, B3) \ do { \ auto B4 = B2; \ B2 ^= B0; \ B0 &= B3; \ B4 |= B3; \ B2 = ~B2; \ B3 ^= B1; \ B1 |= B0; \ B0 ^= B2; \ B2 &= B4; \ B3 &= B4; \ B1 ^= B2; \ B2 ^= B0; \ B0 |= B2; \ B4 ^= B1; \ B0 ^= B3; \ B3 ^= B4; \ B4 |= B0; \ B3 ^= B2; \ B4 ^= B2; \ B2 = B1; \ B1 = B0; \ B0 = B3; \ B3 = B4; \ } while(0) #endif botan-2.4.0/src/lib/block/serpent/serpent_simd/000077500000000000000000000000001322470703100214225ustar00rootroot00000000000000botan-2.4.0/src/lib/block/serpent/serpent_simd/info.txt000066400000000000000000000001131322470703100231110ustar00rootroot00000000000000 SERPENT_SIMD -> 20160903 simd botan-2.4.0/src/lib/block/serpent/serpent_simd/serpent_simd.cpp000066400000000000000000000177631322470703100246400ustar00rootroot00000000000000/* * Serpent (SIMD) * (C) 2009,2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { #define key_xor(round, B0, B1, B2, B3) \ do { \ B0 ^= SIMD_32::splat(m_round_key[4*round ]); \ B1 ^= SIMD_32::splat(m_round_key[4*round+1]); \ B2 ^= SIMD_32::splat(m_round_key[4*round+2]); \ B3 ^= SIMD_32::splat(m_round_key[4*round+3]); \ } while(0) /* * Serpent's linear transformations */ #define transform(B0, B1, B2, B3) \ do { \ B0 = B0.rotl<13>(); \ B2 = B2.rotl<3>(); \ B1 ^= B0 ^ B2; \ B3 ^= B2 ^ B0.shl<3>(); \ B1 = B1.rotl<1>(); \ B3 = B3.rotl<7>(); \ B0 ^= B1 ^ B3; \ B2 ^= B3 ^ B1.shl<7>(); \ B0 = B0.rotl<5>(); \ B2 = B2.rotl<22>(); \ } while(0) #define i_transform(B0, B1, B2, B3) \ do { \ B2 = B2.rotr<22>(); \ B0 = B0.rotr<5>(); \ B2 ^= B3 ^ B1.shl<7>(); \ B0 ^= B1 ^ B3; \ B3 = B3.rotr<7>(); \ B1 = B1.rotr<1>(); \ B3 ^= B2 ^ B0.shl<3>(); \ B1 ^= B0 ^ B2; \ B2 = B2.rotr<3>(); \ B0 = B0.rotr<13>(); \ } while(0) /* * SIMD Serpent Encryption of 4 blocks in parallel */ void Serpent::simd_encrypt_4(const uint8_t in[64], uint8_t out[64]) const { SIMD_32 B0 = SIMD_32::load_le(in); SIMD_32 B1 = SIMD_32::load_le(in + 16); SIMD_32 B2 = SIMD_32::load_le(in + 32); SIMD_32 B3 = SIMD_32::load_le(in + 48); SIMD_32::transpose(B0, B1, B2, B3); key_xor( 0,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); SBoxE1(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); SBoxE2(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); SBoxE3(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); SBoxE4(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); SBoxE5(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); SBoxE6(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); SBoxE7(B0,B1,B2,B3); transform(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); SBoxE8(B0,B1,B2,B3); key_xor(32,B0,B1,B2,B3); SIMD_32::transpose(B0, B1, B2, B3); B0.store_le(out); B1.store_le(out + 16); B2.store_le(out + 32); B3.store_le(out + 48); } /* * SIMD Serpent Decryption of 4 blocks in parallel */ void Serpent::simd_decrypt_4(const uint8_t in[64], uint8_t out[64]) const { SIMD_32 B0 = SIMD_32::load_le(in); SIMD_32 B1 = SIMD_32::load_le(in + 16); SIMD_32 B2 = SIMD_32::load_le(in + 32); SIMD_32 B3 = SIMD_32::load_le(in + 48); SIMD_32::transpose(B0, B1, B2, B3); key_xor(32,B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(31,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(30,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(29,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(28,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(27,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(26,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(25,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(24,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(23,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(22,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(21,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(20,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(19,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(18,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor(17,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor(16,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor(15,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor(14,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor(13,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor(12,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor(11,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor(10,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 9,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 8,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD8(B0,B1,B2,B3); key_xor( 7,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD7(B0,B1,B2,B3); key_xor( 6,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD6(B0,B1,B2,B3); key_xor( 5,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD5(B0,B1,B2,B3); key_xor( 4,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD4(B0,B1,B2,B3); key_xor( 3,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD3(B0,B1,B2,B3); key_xor( 2,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD2(B0,B1,B2,B3); key_xor( 1,B0,B1,B2,B3); i_transform(B0,B1,B2,B3); SBoxD1(B0,B1,B2,B3); key_xor( 0,B0,B1,B2,B3); SIMD_32::transpose(B0, B1, B2, B3); B0.store_le(out); B1.store_le(out + 16); B2.store_le(out + 32); B3.store_le(out + 48); } #undef key_xor #undef transform #undef i_transform } botan-2.4.0/src/lib/block/shacal2/000077500000000000000000000000001322470703100165635ustar00rootroot00000000000000botan-2.4.0/src/lib/block/shacal2/info.txt000066400000000000000000000000531322470703100202550ustar00rootroot00000000000000 SHACAL2 -> 20170813 botan-2.4.0/src/lib/block/shacal2/shacal2.cpp000066400000000000000000000142041322470703100206050ustar00rootroot00000000000000/* * SHACAL-2 * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { inline void SHACAL2_Fwd(uint32_t A, uint32_t B, uint32_t C, uint32_t& D, uint32_t E, uint32_t F, uint32_t G, uint32_t& H, uint32_t RK) { const uint32_t A_rho = rotr<2>(A) ^ rotr<13>(A) ^ rotr<22>(A); const uint32_t E_rho = rotr<6>(E) ^ rotr<11>(E) ^ rotr<25>(E); H += E_rho + ((E & F) ^ (~E & G)) + RK; D += H; H += A_rho + ((A & B) | ((A | B) & C)); } inline void SHACAL2_Rev(uint32_t A, uint32_t B, uint32_t C, uint32_t& D, uint32_t E, uint32_t F, uint32_t G, uint32_t& H, uint32_t RK) { const uint32_t A_rho = rotr<2>(A) ^ rotr<13>(A) ^ rotr<22>(A); const uint32_t E_rho = rotr<6>(E) ^ rotr<11>(E) ^ rotr<25>(E); H -= A_rho + ((A & B) | ((A | B) & C)); D -= H; H -= E_rho + ((E & F) ^ (~E & G)) + RK; } } /* * SHACAL2 Encryption */ void SHACAL2::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); #if defined(BOTAN_HAS_SHACAL2_X86) if(CPUID::has_intel_sha()) { return x86_encrypt_blocks(in, out, blocks); } #endif #if defined(BOTAN_HAS_SHACAL2_SIMD) if(CPUID::has_simd_32()) { while(blocks >= 4) { simd_encrypt_4(in, out); in += 4*BLOCK_SIZE; out += 4*BLOCK_SIZE; blocks -= 4; } } #endif for(size_t i = 0; i != blocks; ++i) { uint32_t A = load_be(in, 0); uint32_t B = load_be(in, 1); uint32_t C = load_be(in, 2); uint32_t D = load_be(in, 3); uint32_t E = load_be(in, 4); uint32_t F = load_be(in, 5); uint32_t G = load_be(in, 6); uint32_t H = load_be(in, 7); for(size_t r = 0; r != 64; r += 8) { SHACAL2_Fwd(A, B, C, D, E, F, G, H, m_RK[r+0]); SHACAL2_Fwd(H, A, B, C, D, E, F, G, m_RK[r+1]); SHACAL2_Fwd(G, H, A, B, C, D, E, F, m_RK[r+2]); SHACAL2_Fwd(F, G, H, A, B, C, D, E, m_RK[r+3]); SHACAL2_Fwd(E, F, G, H, A, B, C, D, m_RK[r+4]); SHACAL2_Fwd(D, E, F, G, H, A, B, C, m_RK[r+5]); SHACAL2_Fwd(C, D, E, F, G, H, A, B, m_RK[r+6]); SHACAL2_Fwd(B, C, D, E, F, G, H, A, m_RK[r+7]); } store_be(out, A, B, C, D, E, F, G, H); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SHACAL2 Encryption */ void SHACAL2::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); #if defined(BOTAN_HAS_SHACAL2_SIMD) if(CPUID::has_simd_32()) { while(blocks >= 4) { simd_decrypt_4(in, out); in += 4*BLOCK_SIZE; out += 4*BLOCK_SIZE; blocks -= 4; } } #endif for(size_t i = 0; i != blocks; ++i) { uint32_t A = load_be(in, 0); uint32_t B = load_be(in, 1); uint32_t C = load_be(in, 2); uint32_t D = load_be(in, 3); uint32_t E = load_be(in, 4); uint32_t F = load_be(in, 5); uint32_t G = load_be(in, 6); uint32_t H = load_be(in, 7); for(size_t r = 0; r != 64; r += 8) { SHACAL2_Rev(B, C, D, E, F, G, H, A, m_RK[63-r]); SHACAL2_Rev(C, D, E, F, G, H, A, B, m_RK[62-r]); SHACAL2_Rev(D, E, F, G, H, A, B, C, m_RK[61-r]); SHACAL2_Rev(E, F, G, H, A, B, C, D, m_RK[60-r]); SHACAL2_Rev(F, G, H, A, B, C, D, E, m_RK[59-r]); SHACAL2_Rev(G, H, A, B, C, D, E, F, m_RK[58-r]); SHACAL2_Rev(H, A, B, C, D, E, F, G, m_RK[57-r]); SHACAL2_Rev(A, B, C, D, E, F, G, H, m_RK[56-r]); } store_be(out, A, B, C, D, E, F, G, H); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SHACAL2 Key Schedule */ void SHACAL2::key_schedule(const uint8_t key[], size_t len) { const uint32_t RC[64] = { 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 }; if(m_RK.empty()) m_RK.resize(64); else clear_mem(m_RK.data(), m_RK.size()); load_be(m_RK.data(), key, len/4); for(size_t i = 16; i != 64; ++i) { const uint32_t sigma0_15 = rotr< 7>(m_RK[i-15]) ^ rotr<18>(m_RK[i-15]) ^ (m_RK[i-15] >> 3); const uint32_t sigma1_2 = rotr<17>(m_RK[i- 2]) ^ rotr<19>(m_RK[i- 2]) ^ (m_RK[i- 2] >> 10); m_RK[i] = m_RK[i-16] + sigma0_15 + m_RK[i-7] + sigma1_2; } for(size_t i = 0; i != 64; ++i) { m_RK[i] += RC[i]; } } size_t SHACAL2::parallelism() const { #if defined(BOTAN_HAS_SHACAL2_X86) if(CPUID::has_intel_sha()) { return 4; } #endif #if defined(BOTAN_HAS_SHACAL2_SIMD) if(CPUID::has_simd_32()) { return 4; } #endif return 1; } std::string SHACAL2::provider() const { #if defined(BOTAN_HAS_SHACAL2_X86) if(CPUID::has_intel_sha()) { return "intel_sha"; } #endif #if defined(BOTAN_HAS_SHACAL2_SIMD) if(CPUID::has_simd_32()) { return "simd"; } #endif return "base"; } /* * Clear memory of sensitive data */ void SHACAL2::clear() { zap(m_RK); } } botan-2.4.0/src/lib/block/shacal2/shacal2.h000066400000000000000000000022551322470703100202550ustar00rootroot00000000000000/* * SHACAL-2 * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHACAL2_H_ #define BOTAN_SHACAL2_H_ #include namespace Botan { /** * SHACAL2 */ class BOTAN_PUBLIC_API(2,3) SHACAL2 final : public Block_Cipher_Fixed_Params<32, 16, 64, 4> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; std::string provider() const override; void clear() override; std::string name() const override { return "SHACAL2"; } BlockCipher* clone() const override { return new SHACAL2; } size_t parallelism() const override; private: void key_schedule(const uint8_t[], size_t) override; #if defined(BOTAN_HAS_SHACAL2_SIMD) void simd_encrypt_4(const uint8_t in[], uint8_t out[]) const; void simd_decrypt_4(const uint8_t in[], uint8_t out[]) const; #endif #if defined(BOTAN_HAS_SHACAL2_X86) void x86_encrypt_blocks(const uint8_t in[], uint8_t out[], size_t blocks) const; #endif secure_vector m_RK; }; } #endif botan-2.4.0/src/lib/block/shacal2/shacal2_simd/000077500000000000000000000000001322470703100211145ustar00rootroot00000000000000botan-2.4.0/src/lib/block/shacal2/shacal2_simd/info.txt000066400000000000000000000001231322470703100226040ustar00rootroot00000000000000 SHACAL2_SIMD -> 20170813 shacal2 simd botan-2.4.0/src/lib/block/shacal2/shacal2_simd/shacal2_simd.cpp000066400000000000000000000065551322470703100241640ustar00rootroot00000000000000/* * SHACAL-2 using SIMD * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { inline void SHACAL2_Fwd(const SIMD_32& A, const SIMD_32& B, const SIMD_32& C, SIMD_32& D, const SIMD_32& E, const SIMD_32& F, const SIMD_32& G, SIMD_32& H, uint32_t RK) { H += E.rho<6,11,25>() + ((E & F) ^ (~E & G)) + SIMD_32::splat(RK); D += H; H += A.rho<2,13,22>() + ((A & B) | ((A | B) & C)); } inline void SHACAL2_Rev(const SIMD_32& A, const SIMD_32& B, const SIMD_32& C, SIMD_32& D, const SIMD_32& E, const SIMD_32& F, const SIMD_32& G, SIMD_32& H, uint32_t RK) { H -= A.rho<2,13,22>() + ((A & B) | ((A | B) & C)); D -= H; H -= E.rho<6,11,25>() + ((E & F) ^ (~E & G)) + SIMD_32::splat(RK); } } void SHACAL2::simd_encrypt_4(const uint8_t in[], uint8_t out[]) const { SIMD_4x32 A = SIMD_4x32::load_be(in); SIMD_4x32 E = SIMD_4x32::load_be(in+16); SIMD_4x32 B = SIMD_4x32::load_be(in+32); SIMD_4x32 F = SIMD_4x32::load_be(in+48); SIMD_4x32 C = SIMD_4x32::load_be(in+64); SIMD_4x32 G = SIMD_4x32::load_be(in+80); SIMD_4x32 D = SIMD_4x32::load_be(in+96); SIMD_4x32 H = SIMD_4x32::load_be(in+112); SIMD_4x32::transpose(A, B, C, D); SIMD_4x32::transpose(E, F, G, H); for(size_t r = 0; r != 64; r += 8) { SHACAL2_Fwd(A, B, C, D, E, F, G, H, m_RK[r+0]); SHACAL2_Fwd(H, A, B, C, D, E, F, G, m_RK[r+1]); SHACAL2_Fwd(G, H, A, B, C, D, E, F, m_RK[r+2]); SHACAL2_Fwd(F, G, H, A, B, C, D, E, m_RK[r+3]); SHACAL2_Fwd(E, F, G, H, A, B, C, D, m_RK[r+4]); SHACAL2_Fwd(D, E, F, G, H, A, B, C, m_RK[r+5]); SHACAL2_Fwd(C, D, E, F, G, H, A, B, m_RK[r+6]); SHACAL2_Fwd(B, C, D, E, F, G, H, A, m_RK[r+7]); } SIMD_4x32::transpose(A, B, C, D); SIMD_4x32::transpose(E, F, G, H); A.store_be(out); E.store_be(out+16); B.store_be(out+32); F.store_be(out+48); C.store_be(out+64); G.store_be(out+80); D.store_be(out+96); H.store_be(out+112); } void SHACAL2::simd_decrypt_4(const uint8_t in[], uint8_t out[]) const { SIMD_4x32 A = SIMD_4x32::load_be(in); SIMD_4x32 E = SIMD_4x32::load_be(in+16); SIMD_4x32 B = SIMD_4x32::load_be(in+32); SIMD_4x32 F = SIMD_4x32::load_be(in+48); SIMD_4x32 C = SIMD_4x32::load_be(in+64); SIMD_4x32 G = SIMD_4x32::load_be(in+80); SIMD_4x32 D = SIMD_4x32::load_be(in+96); SIMD_4x32 H = SIMD_4x32::load_be(in+112); SIMD_4x32::transpose(A, B, C, D); SIMD_4x32::transpose(E, F, G, H); for(size_t r = 0; r != 64; r += 8) { SHACAL2_Rev(B, C, D, E, F, G, H, A, m_RK[63-r]); SHACAL2_Rev(C, D, E, F, G, H, A, B, m_RK[62-r]); SHACAL2_Rev(D, E, F, G, H, A, B, C, m_RK[61-r]); SHACAL2_Rev(E, F, G, H, A, B, C, D, m_RK[60-r]); SHACAL2_Rev(F, G, H, A, B, C, D, E, m_RK[59-r]); SHACAL2_Rev(G, H, A, B, C, D, E, F, m_RK[58-r]); SHACAL2_Rev(H, A, B, C, D, E, F, G, m_RK[57-r]); SHACAL2_Rev(A, B, C, D, E, F, G, H, m_RK[56-r]); } SIMD_4x32::transpose(A, B, C, D); SIMD_4x32::transpose(E, F, G, H); A.store_be(out); E.store_be(out+16); B.store_be(out+32); F.store_be(out+48); C.store_be(out+64); G.store_be(out+80); D.store_be(out+96); H.store_be(out+112); } } botan-2.4.0/src/lib/block/shacal2/shacal2_x86/000077500000000000000000000000001322470703100206055ustar00rootroot00000000000000botan-2.4.0/src/lib/block/shacal2/shacal2_x86/info.txt000066400000000000000000000002261322470703100223010ustar00rootroot00000000000000 SHACAL2_X86 -> 20170814 shacal2 need_isa sha,ssse3 gcc:5.0 clang:3.9 msvc:19.0 # MSVS 2015 botan-2.4.0/src/lib/block/shacal2/shacal2_x86/shacal2_x86.cpp000066400000000000000000000071661322470703100233450ustar00rootroot00000000000000/* * SHACAL-2 using x86 SHA extensions * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* Only encryption is supported since the inverse round function would require a different instruction */ BOTAN_FUNC_ISA("sha,ssse3") void SHACAL2::x86_encrypt_blocks(const uint8_t in[], uint8_t out[], size_t blocks) const { const __m128i MASK1 = _mm_set_epi8(8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7); const __m128i MASK2 = _mm_set_epi8(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); const __m128i* RK_mm = reinterpret_cast(m_RK.data()); const __m128i* in_mm = reinterpret_cast(in); __m128i* out_mm = reinterpret_cast<__m128i*>(out); while(blocks >= 2) { __m128i B0_0 = _mm_loadu_si128(in_mm); __m128i B0_1 = _mm_loadu_si128(in_mm+1); __m128i B1_0 = _mm_loadu_si128(in_mm+2); __m128i B1_1 = _mm_loadu_si128(in_mm+3); __m128i TMP = _mm_shuffle_epi8(_mm_unpacklo_epi64(B0_0, B0_1), MASK2); B0_1 = _mm_shuffle_epi8(_mm_unpackhi_epi64(B0_0, B0_1), MASK2); B0_0 = TMP; TMP = _mm_shuffle_epi8(_mm_unpacklo_epi64(B1_0, B1_1), MASK2); B1_1 = _mm_shuffle_epi8(_mm_unpackhi_epi64(B1_0, B1_1), MASK2); B1_0 = TMP; for(size_t i = 0; i != 8; ++i) { const __m128i RK0 = _mm_loadu_si128(RK_mm + 2*i); const __m128i RK2 = _mm_loadu_si128(RK_mm + 2*i+1); const __m128i RK1 = _mm_srli_si128(RK0, 8); const __m128i RK3 = _mm_srli_si128(RK2, 8); B0_1 = _mm_sha256rnds2_epu32(B0_1, B0_0, RK0); B1_1 = _mm_sha256rnds2_epu32(B1_1, B1_0, RK0); B0_0 = _mm_sha256rnds2_epu32(B0_0, B0_1, RK1); B1_0 = _mm_sha256rnds2_epu32(B1_0, B1_1, RK1); B0_1 = _mm_sha256rnds2_epu32(B0_1, B0_0, RK2); B1_1 = _mm_sha256rnds2_epu32(B1_1, B1_0, RK2); B0_0 = _mm_sha256rnds2_epu32(B0_0, B0_1, RK3); B1_0 = _mm_sha256rnds2_epu32(B1_0, B1_1, RK3); } TMP = _mm_shuffle_epi8(_mm_unpackhi_epi64(B0_0, B0_1), MASK1); B0_1 = _mm_shuffle_epi8(_mm_unpacklo_epi64(B0_0, B0_1), MASK1); B0_0 = TMP; TMP = _mm_shuffle_epi8(_mm_unpackhi_epi64(B1_0, B1_1), MASK1); B1_1 = _mm_shuffle_epi8(_mm_unpacklo_epi64(B1_0, B1_1), MASK1); B1_0 = TMP; // Save state _mm_storeu_si128(out_mm + 0, B0_0); _mm_storeu_si128(out_mm + 1, B0_1); _mm_storeu_si128(out_mm + 2, B1_0); _mm_storeu_si128(out_mm + 3, B1_1); blocks -= 2; in_mm += 4; out_mm += 4; } while(blocks) { __m128i B0 = _mm_loadu_si128(in_mm); __m128i B1 = _mm_loadu_si128(in_mm+1); __m128i TMP = _mm_shuffle_epi8(_mm_unpacklo_epi64(B0, B1), MASK2); B1 = _mm_shuffle_epi8(_mm_unpackhi_epi64(B0, B1), MASK2); B0 = TMP; for(size_t i = 0; i != 8; ++i) { const __m128i RK0 = _mm_loadu_si128(RK_mm + 2*i); const __m128i RK2 = _mm_loadu_si128(RK_mm + 2*i+1); const __m128i RK1 = _mm_srli_si128(RK0, 8); const __m128i RK3 = _mm_srli_si128(RK2, 8); B1 = _mm_sha256rnds2_epu32(B1, B0, RK0); B0 = _mm_sha256rnds2_epu32(B0, B1, RK1); B1 = _mm_sha256rnds2_epu32(B1, B0, RK2); B0 = _mm_sha256rnds2_epu32(B0, B1, RK3); } TMP = _mm_shuffle_epi8(_mm_unpackhi_epi64(B0, B1), MASK1); B1 = _mm_shuffle_epi8(_mm_unpacklo_epi64(B0, B1), MASK1); B0 = TMP; // Save state _mm_storeu_si128(out_mm, B0); _mm_storeu_si128(out_mm + 1, B1); blocks--; in_mm += 2; out_mm += 2; } } } botan-2.4.0/src/lib/block/sm4/000077500000000000000000000000001322470703100157515ustar00rootroot00000000000000botan-2.4.0/src/lib/block/sm4/info.txt000066400000000000000000000000451322470703100174440ustar00rootroot00000000000000 SM4 -> 20170716 botan-2.4.0/src/lib/block/sm4/sm4.cpp000066400000000000000000000214651322470703100171700ustar00rootroot00000000000000/* * SM4 * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { const uint8_t SM4_SBOX[256] = { 0xD6, 0x90, 0xE9, 0xFE, 0xCC, 0xE1, 0x3D, 0xB7, 0x16, 0xB6, 0x14, 0xC2, 0x28, 0xFB, 0x2C, 0x05, 0x2B, 0x67, 0x9A, 0x76, 0x2A, 0xBE, 0x04, 0xC3, 0xAA, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9C, 0x42, 0x50, 0xF4, 0x91, 0xEF, 0x98, 0x7A, 0x33, 0x54, 0x0B, 0x43, 0xED, 0xCF, 0xAC, 0x62, 0xE4, 0xB3, 0x1C, 0xA9, 0xC9, 0x08, 0xE8, 0x95, 0x80, 0xDF, 0x94, 0xFA, 0x75, 0x8F, 0x3F, 0xA6, 0x47, 0x07, 0xA7, 0xFC, 0xF3, 0x73, 0x17, 0xBA, 0x83, 0x59, 0x3C, 0x19, 0xE6, 0x85, 0x4F, 0xA8, 0x68, 0x6B, 0x81, 0xB2, 0x71, 0x64, 0xDA, 0x8B, 0xF8, 0xEB, 0x0F, 0x4B, 0x70, 0x56, 0x9D, 0x35, 0x1E, 0x24, 0x0E, 0x5E, 0x63, 0x58, 0xD1, 0xA2, 0x25, 0x22, 0x7C, 0x3B, 0x01, 0x21, 0x78, 0x87, 0xD4, 0x00, 0x46, 0x57, 0x9F, 0xD3, 0x27, 0x52, 0x4C, 0x36, 0x02, 0xE7, 0xA0, 0xC4, 0xC8, 0x9E, 0xEA, 0xBF, 0x8A, 0xD2, 0x40, 0xC7, 0x38, 0xB5, 0xA3, 0xF7, 0xF2, 0xCE, 0xF9, 0x61, 0x15, 0xA1, 0xE0, 0xAE, 0x5D, 0xA4, 0x9B, 0x34, 0x1A, 0x55, 0xAD, 0x93, 0x32, 0x30, 0xF5, 0x8C, 0xB1, 0xE3, 0x1D, 0xF6, 0xE2, 0x2E, 0x82, 0x66, 0xCA, 0x60, 0xC0, 0x29, 0x23, 0xAB, 0x0D, 0x53, 0x4E, 0x6F, 0xD5, 0xDB, 0x37, 0x45, 0xDE, 0xFD, 0x8E, 0x2F, 0x03, 0xFF, 0x6A, 0x72, 0x6D, 0x6C, 0x5B, 0x51, 0x8D, 0x1B, 0xAF, 0x92, 0xBB, 0xDD, 0xBC, 0x7F, 0x11, 0xD9, 0x5C, 0x41, 0x1F, 0x10, 0x5A, 0xD8, 0x0A, 0xC1, 0x31, 0x88, 0xA5, 0xCD, 0x7B, 0xBD, 0x2D, 0x74, 0xD0, 0x12, 0xB8, 0xE5, 0xB4, 0xB0, 0x89, 0x69, 0x97, 0x4A, 0x0C, 0x96, 0x77, 0x7E, 0x65, 0xB9, 0xF1, 0x09, 0xC5, 0x6E, 0xC6, 0x84, 0x18, 0xF0, 0x7D, 0xEC, 0x3A, 0xDC, 0x4D, 0x20, 0x79, 0xEE, 0x5F, 0x3E, 0xD7, 0xCB, 0x39, 0x48 }; /* * SM4_SBOX_T[j] == L(SM4_SBOX[j]). */ const uint32_t SM4_SBOX_T[256] = { 0x8ED55B5B, 0xD0924242, 0x4DEAA7A7, 0x06FDFBFB, 0xFCCF3333, 0x65E28787, 0xC93DF4F4, 0x6BB5DEDE, 0x4E165858, 0x6EB4DADA, 0x44145050, 0xCAC10B0B, 0x8828A0A0, 0x17F8EFEF, 0x9C2CB0B0, 0x11051414, 0x872BACAC, 0xFB669D9D, 0xF2986A6A, 0xAE77D9D9, 0x822AA8A8, 0x46BCFAFA, 0x14041010, 0xCFC00F0F, 0x02A8AAAA, 0x54451111, 0x5F134C4C, 0xBE269898, 0x6D482525, 0x9E841A1A, 0x1E061818, 0xFD9B6666, 0xEC9E7272, 0x4A430909, 0x10514141, 0x24F7D3D3, 0xD5934646, 0x53ECBFBF, 0xF89A6262, 0x927BE9E9, 0xFF33CCCC, 0x04555151, 0x270B2C2C, 0x4F420D0D, 0x59EEB7B7, 0xF3CC3F3F, 0x1CAEB2B2, 0xEA638989, 0x74E79393, 0x7FB1CECE, 0x6C1C7070, 0x0DABA6A6, 0xEDCA2727, 0x28082020, 0x48EBA3A3, 0xC1975656, 0x80820202, 0xA3DC7F7F, 0xC4965252, 0x12F9EBEB, 0xA174D5D5, 0xB38D3E3E, 0xC33FFCFC, 0x3EA49A9A, 0x5B461D1D, 0x1B071C1C, 0x3BA59E9E, 0x0CFFF3F3, 0x3FF0CFCF, 0xBF72CDCD, 0x4B175C5C, 0x52B8EAEA, 0x8F810E0E, 0x3D586565, 0xCC3CF0F0, 0x7D196464, 0x7EE59B9B, 0x91871616, 0x734E3D3D, 0x08AAA2A2, 0xC869A1A1, 0xC76AADAD, 0x85830606, 0x7AB0CACA, 0xB570C5C5, 0xF4659191, 0xB2D96B6B, 0xA7892E2E, 0x18FBE3E3, 0x47E8AFAF, 0x330F3C3C, 0x674A2D2D, 0xB071C1C1, 0x0E575959, 0xE99F7676, 0xE135D4D4, 0x661E7878, 0xB4249090, 0x360E3838, 0x265F7979, 0xEF628D8D, 0x38596161, 0x95D24747, 0x2AA08A8A, 0xB1259494, 0xAA228888, 0x8C7DF1F1, 0xD73BECEC, 0x05010404, 0xA5218484, 0x9879E1E1, 0x9B851E1E, 0x84D75353, 0x00000000, 0x5E471919, 0x0B565D5D, 0xE39D7E7E, 0x9FD04F4F, 0xBB279C9C, 0x1A534949, 0x7C4D3131, 0xEE36D8D8, 0x0A020808, 0x7BE49F9F, 0x20A28282, 0xD4C71313, 0xE8CB2323, 0xE69C7A7A, 0x42E9ABAB, 0x43BDFEFE, 0xA2882A2A, 0x9AD14B4B, 0x40410101, 0xDBC41F1F, 0xD838E0E0, 0x61B7D6D6, 0x2FA18E8E, 0x2BF4DFDF, 0x3AF1CBCB, 0xF6CD3B3B, 0x1DFAE7E7, 0xE5608585, 0x41155454, 0x25A38686, 0x60E38383, 0x16ACBABA, 0x295C7575, 0x34A69292, 0xF7996E6E, 0xE434D0D0, 0x721A6868, 0x01545555, 0x19AFB6B6, 0xDF914E4E, 0xFA32C8C8, 0xF030C0C0, 0x21F6D7D7, 0xBC8E3232, 0x75B3C6C6, 0x6FE08F8F, 0x691D7474, 0x2EF5DBDB, 0x6AE18B8B, 0x962EB8B8, 0x8A800A0A, 0xFE679999, 0xE2C92B2B, 0xE0618181, 0xC0C30303, 0x8D29A4A4, 0xAF238C8C, 0x07A9AEAE, 0x390D3434, 0x1F524D4D, 0x764F3939, 0xD36EBDBD, 0x81D65757, 0xB7D86F6F, 0xEB37DCDC, 0x51441515, 0xA6DD7B7B, 0x09FEF7F7, 0xB68C3A3A, 0x932FBCBC, 0x0F030C0C, 0x03FCFFFF, 0xC26BA9A9, 0xBA73C9C9, 0xD96CB5B5, 0xDC6DB1B1, 0x375A6D6D, 0x15504545, 0xB98F3636, 0x771B6C6C, 0x13ADBEBE, 0xDA904A4A, 0x57B9EEEE, 0xA9DE7777, 0x4CBEF2F2, 0x837EFDFD, 0x55114444, 0xBDDA6767, 0x2C5D7171, 0x45400505, 0x631F7C7C, 0x50104040, 0x325B6969, 0xB8DB6363, 0x220A2828, 0xC5C20707, 0xF531C4C4, 0xA88A2222, 0x31A79696, 0xF9CE3737, 0x977AEDED, 0x49BFF6F6, 0x992DB4B4, 0xA475D1D1, 0x90D34343, 0x5A124848, 0x58BAE2E2, 0x71E69797, 0x64B6D2D2, 0x70B2C2C2, 0xAD8B2626, 0xCD68A5A5, 0xCB955E5E, 0x624B2929, 0x3C0C3030, 0xCE945A5A, 0xAB76DDDD, 0x867FF9F9, 0xF1649595, 0x5DBBE6E6, 0x35F2C7C7, 0x2D092424, 0xD1C61717, 0xD66FB9B9, 0xDEC51B1B, 0x94861212, 0x78186060, 0x30F3C3C3, 0x897CF5F5, 0x5CEFB3B3, 0xD23AE8E8, 0xACDF7373, 0x794C3535, 0xA0208080, 0x9D78E5E5, 0x56EDBBBB, 0x235E7D7D, 0xC63EF8F8, 0x8BD45F5F, 0xE7C82F2F, 0xDD39E4E4, 0x68492121 }; inline uint32_t SM4_T_slow(uint32_t b) { const uint32_t t = make_uint32(SM4_SBOX[get_byte(0,b)], SM4_SBOX[get_byte(1,b)], SM4_SBOX[get_byte(2,b)], SM4_SBOX[get_byte(3,b)]); // L linear transform return t ^ rotl<2>(t) ^ rotl<10>(t) ^ rotl<18>(t) ^ rotl<24>(t); } inline uint32_t SM4_T(uint32_t b) { return SM4_SBOX_T[get_byte(0,b)] ^ rotr< 8>(SM4_SBOX_T[get_byte(1,b)]) ^ rotr<16>(SM4_SBOX_T[get_byte(2,b)]) ^ rotr<24>(SM4_SBOX_T[get_byte(3,b)]); } // Variant of T for key schedule inline uint32_t SM4_Tp(uint32_t b) { const uint32_t t = make_uint32(SM4_SBOX[get_byte(0,b)], SM4_SBOX[get_byte(1,b)], SM4_SBOX[get_byte(2,b)], SM4_SBOX[get_byte(3,b)]); // L' linear transform return t ^ rotl<13>(t) ^ rotl<23>(t); } #define SM4_RNDS(k0,k1,k2,k3,F) do { \ B0 ^= F(B1 ^ B2 ^ B3 ^ m_RK[k0]); \ B1 ^= F(B0 ^ B2 ^ B3 ^ m_RK[k1]); \ B2 ^= F(B0 ^ B1 ^ B3 ^ m_RK[k2]); \ B3 ^= F(B0 ^ B1 ^ B2 ^ m_RK[k3]); \ } while(0) } /* * SM4 Encryption */ void SM4::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t B0 = load_be(in, 0); uint32_t B1 = load_be(in, 1); uint32_t B2 = load_be(in, 2); uint32_t B3 = load_be(in, 3); SM4_RNDS( 0, 1, 2, 3, SM4_T_slow); SM4_RNDS( 4, 5, 6, 7, SM4_T); SM4_RNDS( 8, 9, 10, 11, SM4_T); SM4_RNDS(12, 13, 14, 15, SM4_T); SM4_RNDS(16, 17, 18, 19, SM4_T); SM4_RNDS(20, 21, 22, 23, SM4_T); SM4_RNDS(24, 25, 26, 27, SM4_T); SM4_RNDS(28, 29, 30, 31, SM4_T_slow); store_be(out, B3, B2, B1, B0); in += BLOCK_SIZE; out += BLOCK_SIZE; } } /* * SM4 Decryption */ void SM4::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_RK.empty() == false); for(size_t i = 0; i != blocks; ++i) { uint32_t B0 = load_be(in, 0); uint32_t B1 = load_be(in, 1); uint32_t B2 = load_be(in, 2); uint32_t B3 = load_be(in, 3); SM4_RNDS(31, 30, 29, 28, SM4_T_slow); SM4_RNDS(27, 26, 25, 24, SM4_T); SM4_RNDS(23, 22, 21, 20, SM4_T); SM4_RNDS(19, 18, 17, 16, SM4_T); SM4_RNDS(15, 14, 13, 12, SM4_T); SM4_RNDS(11, 10, 9, 8, SM4_T); SM4_RNDS( 7, 6, 5, 4, SM4_T); SM4_RNDS( 3, 2, 1, 0, SM4_T_slow); store_be(out, B3, B2, B1, B0); in += BLOCK_SIZE; out += BLOCK_SIZE; } } #undef SM4_RNDS /* * SM4 Key Schedule */ void SM4::key_schedule(const uint8_t key[], size_t) { // System parameter or family key const uint32_t FK[4] = { 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc }; const uint32_t CK[32] = { 0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9, 0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9, 0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299, 0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279 }; secure_vector K(4); K[0] = load_be(key, 0) ^ FK[0]; K[1] = load_be(key, 1) ^ FK[1]; K[2] = load_be(key, 2) ^ FK[2]; K[3] = load_be(key, 3) ^ FK[3]; m_RK.resize(32); for(size_t i = 0; i != 32; ++i) { K[i % 4] ^= SM4_Tp(K[(i+1)%4] ^ K[(i+2)%4] ^ K[(i+3)%4] ^ CK[i]); m_RK[i] = K[i % 4]; } } void SM4::clear() { zap(m_RK); } } botan-2.4.0/src/lib/block/sm4/sm4.h000066400000000000000000000013721322470703100166300ustar00rootroot00000000000000/* * SM4 * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SM4_H_ #define BOTAN_SM4_H_ #include namespace Botan { /** * SM4 */ class BOTAN_PUBLIC_API(2,2) SM4 final : public Block_Cipher_Fixed_Params<16, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "SM4"; } BlockCipher* clone() const override { return new SM4; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_RK; }; } #endif botan-2.4.0/src/lib/block/threefish/000077500000000000000000000000001322470703100172275ustar00rootroot00000000000000botan-2.4.0/src/lib/block/threefish/info.txt000066400000000000000000000000571322470703100207250ustar00rootroot00000000000000 THREEFISH_512 -> 20131224 botan-2.4.0/src/lib/block/threefish/threefish.cpp000066400000000000000000000216121322470703100217160ustar00rootroot00000000000000/* * Threefish-512 * (C) 2013,2014,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { #define THREEFISH_ROUND(X0,X1,X2,X3,X4,X5,X6,X7,ROT1,ROT2,ROT3,ROT4) \ do { \ X0 += X4; \ X1 += X5; \ X2 += X6; \ X3 += X7; \ X4 = rotl(X4); \ X5 = rotl(X5); \ X6 = rotl(X6); \ X7 = rotl(X7); \ X4 ^= X0; \ X5 ^= X1; \ X6 ^= X2; \ X7 ^= X3; \ } while(0) #define THREEFISH_INJECT_KEY(r) \ do { \ X0 += m_K[(r ) % 9]; \ X1 += m_K[(r+1) % 9]; \ X2 += m_K[(r+2) % 9]; \ X3 += m_K[(r+3) % 9]; \ X4 += m_K[(r+4) % 9]; \ X5 += m_K[(r+5) % 9] + m_T[(r ) % 3]; \ X6 += m_K[(r+6) % 9] + m_T[(r+1) % 3]; \ X7 += m_K[(r+7) % 9] + (r); \ } while(0) #define THREEFISH_ENC_8_ROUNDS(R1,R2) \ do { \ THREEFISH_ROUND(X0,X2,X4,X6, X1,X3,X5,X7, 46,36,19,37); \ THREEFISH_ROUND(X2,X4,X6,X0, X1,X7,X5,X3, 33,27,14,42); \ THREEFISH_ROUND(X4,X6,X0,X2, X1,X3,X5,X7, 17,49,36,39); \ THREEFISH_ROUND(X6,X0,X2,X4, X1,X7,X5,X3, 44, 9,54,56); \ THREEFISH_INJECT_KEY(R1); \ \ THREEFISH_ROUND(X0,X2,X4,X6, X1,X3,X5,X7, 39,30,34,24); \ THREEFISH_ROUND(X2,X4,X6,X0, X1,X7,X5,X3, 13,50,10,17); \ THREEFISH_ROUND(X4,X6,X0,X2, X1,X3,X5,X7, 25,29,39,43); \ THREEFISH_ROUND(X6,X0,X2,X4, X1,X7,X5,X3, 8,35,56,22); \ THREEFISH_INJECT_KEY(R2); \ } while(0) void Threefish_512::skein_feedfwd(const secure_vector& M, const secure_vector& T) { BOTAN_ASSERT(m_K.size() == 9, "Key was set"); BOTAN_ASSERT(M.size() == 8, "Single block"); m_T[0] = T[0]; m_T[1] = T[1]; m_T[2] = T[0] ^ T[1]; uint64_t X0 = M[0]; uint64_t X1 = M[1]; uint64_t X2 = M[2]; uint64_t X3 = M[3]; uint64_t X4 = M[4]; uint64_t X5 = M[5]; uint64_t X6 = M[6]; uint64_t X7 = M[7]; THREEFISH_INJECT_KEY(0); THREEFISH_ENC_8_ROUNDS(1,2); THREEFISH_ENC_8_ROUNDS(3,4); THREEFISH_ENC_8_ROUNDS(5,6); THREEFISH_ENC_8_ROUNDS(7,8); THREEFISH_ENC_8_ROUNDS(9,10); THREEFISH_ENC_8_ROUNDS(11,12); THREEFISH_ENC_8_ROUNDS(13,14); THREEFISH_ENC_8_ROUNDS(15,16); THREEFISH_ENC_8_ROUNDS(17,18); m_K[0] = M[0] ^ X0; m_K[1] = M[1] ^ X1; m_K[2] = M[2] ^ X2; m_K[3] = M[3] ^ X3; m_K[4] = M[4] ^ X4; m_K[5] = M[5] ^ X5; m_K[6] = M[6] ^ X6; m_K[7] = M[7] ^ X7; m_K[8] = m_K[0] ^ m_K[1] ^ m_K[2] ^ m_K[3] ^ m_K[4] ^ m_K[5] ^ m_K[6] ^ m_K[7] ^ 0x1BD11BDAA9FC1A22; } size_t Threefish_512::parallelism() const { #if defined(BOTAN_HAS_THREEFISH_512_AVX2) if(CPUID::has_avx2()) { return 2; } #endif return 1; } std::string Threefish_512::provider() const { #if defined(BOTAN_HAS_THREEFISH_512_AVX2) if(CPUID::has_avx2()) { return "avx2"; } #endif return "base"; } void Threefish_512::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_K.empty() == false); #if defined(BOTAN_HAS_THREEFISH_512_AVX2) if(CPUID::has_avx2()) { return avx2_encrypt_n(in, out, blocks); } #endif BOTAN_PARALLEL_SIMD_FOR(size_t i = 0; i < blocks; ++i) { uint64_t X0, X1, X2, X3, X4, X5, X6, X7; load_le(in + BLOCK_SIZE*i, X0, X1, X2, X3, X4, X5, X6, X7); THREEFISH_INJECT_KEY(0); THREEFISH_ENC_8_ROUNDS(1,2); THREEFISH_ENC_8_ROUNDS(3,4); THREEFISH_ENC_8_ROUNDS(5,6); THREEFISH_ENC_8_ROUNDS(7,8); THREEFISH_ENC_8_ROUNDS(9,10); THREEFISH_ENC_8_ROUNDS(11,12); THREEFISH_ENC_8_ROUNDS(13,14); THREEFISH_ENC_8_ROUNDS(15,16); THREEFISH_ENC_8_ROUNDS(17,18); store_le(out + BLOCK_SIZE*i, X0, X1, X2, X3, X4, X5, X6, X7); } } #undef THREEFISH_ENC_8_ROUNDS #undef THREEFISH_INJECT_KEY #undef THREEFISH_ROUND void Threefish_512::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_K.empty() == false); #if defined(BOTAN_HAS_THREEFISH_512_AVX2) if(CPUID::has_avx2()) { return avx2_decrypt_n(in, out, blocks); } #endif #define THREEFISH_ROUND(X0,X1,X2,X3,X4,X5,X6,X7,ROT1,ROT2,ROT3,ROT4) \ do { \ X4 ^= X0; \ X5 ^= X1; \ X6 ^= X2; \ X7 ^= X3; \ X4 = rotr(X4); \ X5 = rotr(X5); \ X6 = rotr(X6); \ X7 = rotr(X7); \ X0 -= X4; \ X1 -= X5; \ X2 -= X6; \ X3 -= X7; \ } while(0) #define THREEFISH_INJECT_KEY(r) \ do { \ X0 -= m_K[(r ) % 9]; \ X1 -= m_K[(r+1) % 9]; \ X2 -= m_K[(r+2) % 9]; \ X3 -= m_K[(r+3) % 9]; \ X4 -= m_K[(r+4) % 9]; \ X5 -= m_K[(r+5) % 9] + m_T[(r ) % 3]; \ X6 -= m_K[(r+6) % 9] + m_T[(r+1) % 3]; \ X7 -= m_K[(r+7) % 9] + (r); \ } while(0) #define THREEFISH_DEC_8_ROUNDS(R1,R2) \ do { \ THREEFISH_ROUND(X6,X0,X2,X4, X1,X7,X5,X3, 8,35,56,22); \ THREEFISH_ROUND(X4,X6,X0,X2, X1,X3,X5,X7, 25,29,39,43); \ THREEFISH_ROUND(X2,X4,X6,X0, X1,X7,X5,X3, 13,50,10,17); \ THREEFISH_ROUND(X0,X2,X4,X6, X1,X3,X5,X7, 39,30,34,24); \ THREEFISH_INJECT_KEY(R1); \ \ THREEFISH_ROUND(X6,X0,X2,X4, X1,X7,X5,X3, 44, 9,54,56); \ THREEFISH_ROUND(X4,X6,X0,X2, X1,X3,X5,X7, 17,49,36,39); \ THREEFISH_ROUND(X2,X4,X6,X0, X1,X7,X5,X3, 33,27,14,42); \ THREEFISH_ROUND(X0,X2,X4,X6, X1,X3,X5,X7, 46,36,19,37); \ THREEFISH_INJECT_KEY(R2); \ } while(0) BOTAN_PARALLEL_SIMD_FOR(size_t i = 0; i < blocks; ++i) { uint64_t X0, X1, X2, X3, X4, X5, X6, X7; load_le(in + BLOCK_SIZE*i, X0, X1, X2, X3, X4, X5, X6, X7); THREEFISH_INJECT_KEY(18); THREEFISH_DEC_8_ROUNDS(17,16); THREEFISH_DEC_8_ROUNDS(15,14); THREEFISH_DEC_8_ROUNDS(13,12); THREEFISH_DEC_8_ROUNDS(11,10); THREEFISH_DEC_8_ROUNDS(9,8); THREEFISH_DEC_8_ROUNDS(7,6); THREEFISH_DEC_8_ROUNDS(5,4); THREEFISH_DEC_8_ROUNDS(3,2); THREEFISH_DEC_8_ROUNDS(1,0); store_le(out + BLOCK_SIZE*i, X0, X1, X2, X3, X4, X5, X6, X7); } #undef THREEFISH_DEC_8_ROUNDS #undef THREEFISH_INJECT_KEY #undef THREEFISH_ROUND } void Threefish_512::set_tweak(const uint8_t tweak[], size_t len) { if(len != 16) throw Exception("Threefish-512 requires 128 bit tweak"); m_T.resize(3); m_T[0] = load_le(tweak, 0); m_T[1] = load_le(tweak, 1); m_T[2] = m_T[0] ^ m_T[1]; } void Threefish_512::key_schedule(const uint8_t key[], size_t) { // todo: define key schedule for smaller keys m_K.resize(9); for(size_t i = 0; i != 8; ++i) m_K[i] = load_le(key, i); m_K[8] = m_K[0] ^ m_K[1] ^ m_K[2] ^ m_K[3] ^ m_K[4] ^ m_K[5] ^ m_K[6] ^ m_K[7] ^ 0x1BD11BDAA9FC1A22; // Reset tweak to all zeros on key reset m_T.resize(3); zeroise(m_T); } void Threefish_512::clear() { zap(m_K); zap(m_T); } } botan-2.4.0/src/lib/block/threefish/threefish.h000066400000000000000000000030431322470703100213610ustar00rootroot00000000000000/* * Threefish * (C) 2013,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_THREEFISH_H_ #define BOTAN_THREEFISH_H_ #include namespace Botan { /** * Threefish-512 */ class BOTAN_PUBLIC_API(2,0) Threefish_512 final : public Block_Cipher_Fixed_Params<64, 64> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void set_tweak(const uint8_t tweak[], size_t len); void clear() override; std::string provider() const override; std::string name() const override { return "Threefish-512"; } BlockCipher* clone() const override { return new Threefish_512; } size_t parallelism() const override; private: const secure_vector& get_T() const { return m_T; } const secure_vector& get_K() const { return m_K; } #if defined(BOTAN_HAS_THREEFISH_512_AVX2) void avx2_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; void avx2_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const; #endif void key_schedule(const uint8_t key[], size_t key_len) override; // Interface for Skein friend class Skein_512; void skein_feedfwd(const secure_vector& M, const secure_vector& T); // Private data secure_vector m_T; secure_vector m_K; }; } #endif botan-2.4.0/src/lib/block/threefish/threefish_avx2/000077500000000000000000000000001322470703100221505ustar00rootroot00000000000000botan-2.4.0/src/lib/block/threefish/threefish_avx2/info.txt000066400000000000000000000001421322470703100236410ustar00rootroot00000000000000 THREEFISH_512_AVX2 -> 20160903 need_isa avx2 gcc clang msvc icc botan-2.4.0/src/lib/block/threefish/threefish_avx2/threefish_avx2.cpp000066400000000000000000000505151322470703100256030ustar00rootroot00000000000000/* * Threefish-512 using AVX2 * (C) 2013,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { BOTAN_FUNC_ISA("avx2") inline void interleave_epi64(__m256i& X0, __m256i& X1) { // interleave X0 and X1 qwords // (X0,X1,X2,X3),(X4,X5,X6,X7) -> (X0,X2,X4,X6),(X1,X3,X5,X7) const __m256i T0 = _mm256_unpacklo_epi64(X0, X1); const __m256i T1 = _mm256_unpackhi_epi64(X0, X1); X0 = _mm256_permute4x64_epi64(T0, _MM_SHUFFLE(3,1,2,0)); X1 = _mm256_permute4x64_epi64(T1, _MM_SHUFFLE(3,1,2,0)); } BOTAN_FUNC_ISA("avx2") inline void deinterleave_epi64(__m256i& X0, __m256i& X1) { const __m256i T0 = _mm256_permute4x64_epi64(X0, _MM_SHUFFLE(3,1,2,0)); const __m256i T1 = _mm256_permute4x64_epi64(X1, _MM_SHUFFLE(3,1,2,0)); X0 = _mm256_unpacklo_epi64(T0, T1); X1 = _mm256_unpackhi_epi64(T0, T1); } BOTAN_FUNC_ISA("avx2") inline void rotate_keys(__m256i& R0, __m256i& R1, __m256i R2) { /* Behold. The key schedule progresses like so. The values loop back to the originals after the rounds are complete so we don't need to reload for starting the next block. R0 R1 R2 K1,K2,K3 (7,5,3,1),(8,6,4,2),(0,7,5,3) K3,K4,K5 (0,7,5,3),(1,8,6,4),(2,0,7,5) K5,K6,K7 (2,0,7,5),(3,1,8,6),(4,2,0,7) K7,K8,K0 (4,2,0,7),(5,3,1,8),(6,4,2,0) K0,K1,K2 (6,4,2,0),(7,5,3,1),(8,6,4,2) K2,K3,K4 (8,6,4,2),(0,7,5,3),(1,8,6,4) K4,K5,K6 (1,8,6,4),(2,0,7,5),(3,1,8,6) K6,K7,K8 (3,1,8,6),(4,2,0,7),(5,3,1,8) K8,K0,K1 (5,3,1,8),(6,4,2,0),(7,5,3,1) To compute the values for the next round: X0 is X2 from the last round X1 becomes (X0[4],X1[1:3]) X2 becomes (X1[4],X2[1:3]) Uses 3 permutes and 2 blends, is there a faster way? */ __m256i T0 = _mm256_permute4x64_epi64(R0, _MM_SHUFFLE(0,0,0,0)); __m256i T1 = _mm256_permute4x64_epi64(R1, _MM_SHUFFLE(0,3,2,1)); __m256i T2 = _mm256_permute4x64_epi64(R2, _MM_SHUFFLE(0,3,2,1)); R0 = _mm256_blend_epi32(T1, T0, 0xC0); R1 = _mm256_blend_epi32(T2, T1, 0xC0); } } BOTAN_FUNC_ISA("avx2") void Threefish_512::avx2_encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const uint64_t* K = &get_K()[0]; const uint64_t* T_64 = &get_T()[0]; const __m256i ROTATE_1 = _mm256_set_epi64x(37,19,36,46); const __m256i ROTATE_2 = _mm256_set_epi64x(42,14,27,33); const __m256i ROTATE_3 = _mm256_set_epi64x(39,36,49,17); const __m256i ROTATE_4 = _mm256_set_epi64x(56,54, 9,44); const __m256i ROTATE_5 = _mm256_set_epi64x(24,34,30,39); const __m256i ROTATE_6 = _mm256_set_epi64x(17,10,50,13); const __m256i ROTATE_7 = _mm256_set_epi64x(43,39,29,25); const __m256i ROTATE_8 = _mm256_set_epi64x(22,56,35, 8); #define THREEFISH_ROUND(X0, X1, SHL) \ do { \ const __m256i SHR = _mm256_sub_epi64(_mm256_set1_epi64x(64), SHL); \ X0 = _mm256_add_epi64(X0, X1); \ X1 = _mm256_or_si256(_mm256_sllv_epi64(X1, SHL), _mm256_srlv_epi64(X1, SHR)); \ X1 = _mm256_xor_si256(X1, X0); \ X0 = _mm256_permute4x64_epi64(X0, _MM_SHUFFLE(0, 3, 2, 1)); \ X1 = _mm256_permute4x64_epi64(X1, _MM_SHUFFLE(1, 2, 3, 0)); \ } while(0) #define THREEFISH_ROUND_2(X0, X1, X2, X3, SHL) \ do { \ const __m256i SHR = _mm256_sub_epi64(_mm256_set1_epi64x(64), SHL); \ X0 = _mm256_add_epi64(X0, X1); \ X2 = _mm256_add_epi64(X2, X3); \ X1 = _mm256_or_si256(_mm256_sllv_epi64(X1, SHL), _mm256_srlv_epi64(X1, SHR)); \ X3 = _mm256_or_si256(_mm256_sllv_epi64(X3, SHL), _mm256_srlv_epi64(X3, SHR)); \ X1 = _mm256_xor_si256(X1, X0); \ X3 = _mm256_xor_si256(X3, X2); \ X0 = _mm256_permute4x64_epi64(X0, _MM_SHUFFLE(0, 3, 2, 1)); \ X2 = _mm256_permute4x64_epi64(X2, _MM_SHUFFLE(0, 3, 2, 1)); \ X1 = _mm256_permute4x64_epi64(X1, _MM_SHUFFLE(1, 2, 3, 0)); \ X3 = _mm256_permute4x64_epi64(X3, _MM_SHUFFLE(1, 2, 3, 0)); \ } while(0) #define THREEFISH_INJECT_KEY(X0, X1, R, K0, K1, T0I, T1I) \ do { \ const __m256i T0 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(T0I, 0, 0, 0)); \ const __m256i T1 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(0, T1I, 0, 0)); \ X0 = _mm256_add_epi64(X0, K0); \ X1 = _mm256_add_epi64(X1, K1); \ X1 = _mm256_add_epi64(X1, _mm256_set_epi64x(R,0,0,0)); \ X0 = _mm256_add_epi64(X0, T0); \ X1 = _mm256_add_epi64(X1, T1); \ } while(0) #define THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R, K0, K1, T0I, T1I) \ do { \ const __m256i T0 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(T0I, 0, 0, 0)); \ __m256i T1 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(0, T1I, 0, 0)); \ X0 = _mm256_add_epi64(X0, K0); \ X2 = _mm256_add_epi64(X2, K0); \ X1 = _mm256_add_epi64(X1, K1); \ X3 = _mm256_add_epi64(X3, K1); \ T1 = _mm256_add_epi64(T1, _mm256_set_epi64x(R,0,0,0)); \ X0 = _mm256_add_epi64(X0, T0); \ X2 = _mm256_add_epi64(X2, T0); \ X1 = _mm256_add_epi64(X1, T1); \ X3 = _mm256_add_epi64(X3, T1); \ } while(0) #define THREEFISH_ENC_8_ROUNDS(X0, X1, R, K0, K1, K2, T0, T1, T2) \ do { \ rotate_keys(K1, K2, K0); \ THREEFISH_ROUND(X0, X1, ROTATE_1); \ THREEFISH_ROUND(X0, X1, ROTATE_2); \ THREEFISH_ROUND(X0, X1, ROTATE_3); \ THREEFISH_ROUND(X0, X1, ROTATE_4); \ THREEFISH_INJECT_KEY(X0, X1, R, K0, K1, T0, T1); \ \ THREEFISH_ROUND(X0, X1, ROTATE_5); \ THREEFISH_ROUND(X0, X1, ROTATE_6); \ THREEFISH_ROUND(X0, X1, ROTATE_7); \ THREEFISH_ROUND(X0, X1, ROTATE_8); \ THREEFISH_INJECT_KEY(X0, X1, R+1, K1, K2, T2, T0); \ } while(0) #define THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K0, K1, K2, T0, T1, T2) \ do { \ rotate_keys(K1, K2, K0); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_1); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_2); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_3); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_4); \ THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R, K0, K1, T0, T1); \ \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_5); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_6); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_7); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_8); \ THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R+1, K1, K2, T2, T0); \ } while(0) __m256i K0 = _mm256_set_epi64x(K[5], K[3], K[1], K[8]); __m256i K1 = _mm256_set_epi64x(K[6], K[4], K[2], K[0]); __m256i K2 = _mm256_set_epi64x(K[7], K[5], K[3], K[1]); const __m256i* in_mm = reinterpret_cast(in); __m256i* out_mm = reinterpret_cast<__m256i*>(out); while(blocks >= 2) { __m256i X0 = _mm256_loadu_si256(in_mm++); __m256i X1 = _mm256_loadu_si256(in_mm++); __m256i X2 = _mm256_loadu_si256(in_mm++); __m256i X3 = _mm256_loadu_si256(in_mm++); const __m256i T = _mm256_set_epi64x(T_64[0], T_64[1], T_64[2], 0); interleave_epi64(X0, X1); interleave_epi64(X2, X3); THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, 0, K1, K2, 2, 3); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 1, K2,K0,K1, 1, 2, 3); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 3, K1,K2,K0, 2, 3, 1); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 5, K0,K1,K2, 3, 1, 2); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 7, K2,K0,K1, 1, 2, 3); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 9, K1,K2,K0, 2, 3, 1); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 11, K0,K1,K2, 3, 1, 2); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 13, K2,K0,K1, 1, 2, 3); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 15, K1,K2,K0, 2, 3, 1); THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, 17, K0,K1,K2, 3, 1, 2); deinterleave_epi64(X0, X1); deinterleave_epi64(X2, X3); _mm256_storeu_si256(out_mm++, X0); _mm256_storeu_si256(out_mm++, X1); _mm256_storeu_si256(out_mm++, X2); _mm256_storeu_si256(out_mm++, X3); blocks -= 2; } for(size_t i = 0; i != blocks; ++i) { __m256i X0 = _mm256_loadu_si256(in_mm++); __m256i X1 = _mm256_loadu_si256(in_mm++); const __m256i T = _mm256_set_epi64x(T_64[0], T_64[1], T_64[2], 0); interleave_epi64(X0, X1); THREEFISH_INJECT_KEY(X0, X1, 0, K1, K2, 2, 3); THREEFISH_ENC_8_ROUNDS(X0, X1, 1, K2,K0,K1, 1, 2, 3); THREEFISH_ENC_8_ROUNDS(X0, X1, 3, K1,K2,K0, 2, 3, 1); THREEFISH_ENC_8_ROUNDS(X0, X1, 5, K0,K1,K2, 3, 1, 2); THREEFISH_ENC_8_ROUNDS(X0, X1, 7, K2,K0,K1, 1, 2, 3); THREEFISH_ENC_8_ROUNDS(X0, X1, 9, K1,K2,K0, 2, 3, 1); THREEFISH_ENC_8_ROUNDS(X0, X1, 11, K0,K1,K2, 3, 1, 2); THREEFISH_ENC_8_ROUNDS(X0, X1, 13, K2,K0,K1, 1, 2, 3); THREEFISH_ENC_8_ROUNDS(X0, X1, 15, K1,K2,K0, 2, 3, 1); THREEFISH_ENC_8_ROUNDS(X0, X1, 17, K0,K1,K2, 3, 1, 2); deinterleave_epi64(X0, X1); _mm256_storeu_si256(out_mm++, X0); _mm256_storeu_si256(out_mm++, X1); } #undef THREEFISH_ENC_8_ROUNDS #undef THREEFISH_ROUND #undef THREEFISH_INJECT_KEY #undef THREEFISH_DEC_2_8_ROUNDS #undef THREEFISH_ROUND_2 #undef THREEFISH_INJECT_KEY_2 } BOTAN_FUNC_ISA("avx2") void Threefish_512::avx2_decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { const uint64_t* K = &get_K()[0]; const uint64_t* T_64 = &get_T()[0]; const __m256i ROTATE_1 = _mm256_set_epi64x(37,19,36,46); const __m256i ROTATE_2 = _mm256_set_epi64x(42,14,27,33); const __m256i ROTATE_3 = _mm256_set_epi64x(39,36,49,17); const __m256i ROTATE_4 = _mm256_set_epi64x(56,54, 9,44); const __m256i ROTATE_5 = _mm256_set_epi64x(24,34,30,39); const __m256i ROTATE_6 = _mm256_set_epi64x(17,10,50,13); const __m256i ROTATE_7 = _mm256_set_epi64x(43,39,29,25); const __m256i ROTATE_8 = _mm256_set_epi64x(22,56,35, 8); #define THREEFISH_ROUND(X0, X1, SHR) \ do { \ const __m256i SHL = _mm256_sub_epi64(_mm256_set1_epi64x(64), SHR); \ X0 = _mm256_permute4x64_epi64(X0, _MM_SHUFFLE(2, 1, 0, 3)); \ X1 = _mm256_permute4x64_epi64(X1, _MM_SHUFFLE(1, 2, 3, 0)); \ X1 = _mm256_xor_si256(X1, X0); \ X1 = _mm256_or_si256(_mm256_sllv_epi64(X1, SHL), _mm256_srlv_epi64(X1, SHR)); \ X0 = _mm256_sub_epi64(X0, X1); \ } while(0) #define THREEFISH_ROUND_2(X0, X1, X2, X3, SHR) \ do { \ const __m256i SHL = _mm256_sub_epi64(_mm256_set1_epi64x(64), SHR); \ X0 = _mm256_permute4x64_epi64(X0, _MM_SHUFFLE(2, 1, 0, 3)); \ X2 = _mm256_permute4x64_epi64(X2, _MM_SHUFFLE(2, 1, 0, 3)); \ X1 = _mm256_permute4x64_epi64(X1, _MM_SHUFFLE(1, 2, 3, 0)); \ X3 = _mm256_permute4x64_epi64(X3, _MM_SHUFFLE(1, 2, 3, 0)); \ X1 = _mm256_xor_si256(X1, X0); \ X3 = _mm256_xor_si256(X3, X2); \ X1 = _mm256_or_si256(_mm256_sllv_epi64(X1, SHL), _mm256_srlv_epi64(X1, SHR)); \ X3 = _mm256_or_si256(_mm256_sllv_epi64(X3, SHL), _mm256_srlv_epi64(X3, SHR)); \ X0 = _mm256_sub_epi64(X0, X1); \ X2 = _mm256_sub_epi64(X2, X3); \ } while(0) #define THREEFISH_INJECT_KEY(X0, X1, R, K0, K1, T0I, T1I) \ do { \ const __m256i T0 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(T0I, 0, 0, 0)); \ const __m256i T1 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(0, T1I, 0, 0)); \ X0 = _mm256_sub_epi64(X0, K0); \ X1 = _mm256_sub_epi64(X1, K1); \ X1 = _mm256_sub_epi64(X1, _mm256_set_epi64x(R, 0, 0, 0)); \ X0 = _mm256_sub_epi64(X0, T0); \ X1 = _mm256_sub_epi64(X1, T1); \ } while(0) #define THREEFISH_DEC_8_ROUNDS(X0, X1, R, K1, K2, K3, T0, T1, T2) \ do { \ THREEFISH_INJECT_KEY(X0, X1, R+1, K2, K3, T2, T0); \ THREEFISH_ROUND(X0, X1, ROTATE_8); \ THREEFISH_ROUND(X0, X1, ROTATE_7); \ THREEFISH_ROUND(X0, X1, ROTATE_6); \ THREEFISH_ROUND(X0, X1, ROTATE_5); \ \ THREEFISH_INJECT_KEY(X0, X1, R, K1, K2, T0, T1); \ THREEFISH_ROUND(X0, X1, ROTATE_4); \ THREEFISH_ROUND(X0, X1, ROTATE_3); \ THREEFISH_ROUND(X0, X1, ROTATE_2); \ THREEFISH_ROUND(X0, X1, ROTATE_1); \ } while(0) #define THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R, K0, K1, T0I, T1I) \ do { \ const __m256i T0 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(T0I, 0, 0, 0)); \ __m256i T1 = _mm256_permute4x64_epi64(T, _MM_SHUFFLE(0, T1I, 0, 0)); \ X0 = _mm256_sub_epi64(X0, K0); \ X2 = _mm256_sub_epi64(X2, K0); \ X1 = _mm256_sub_epi64(X1, K1); \ X3 = _mm256_sub_epi64(X3, K1); \ T1 = _mm256_add_epi64(T1, _mm256_set_epi64x(R,0,0,0)); \ X0 = _mm256_sub_epi64(X0, T0); \ X2 = _mm256_sub_epi64(X2, T0); \ X1 = _mm256_sub_epi64(X1, T1); \ X3 = _mm256_sub_epi64(X3, T1); \ } while(0) #define THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, R, K1, K2, K3, T0, T1, T2) \ do { \ THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R+1, K2, K3, T2, T0); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_8); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_7); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_6); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_5); \ \ THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R, K1, K2, T0, T1); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_4); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_3); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_2); \ THREEFISH_ROUND_2(X0, X1, X2, X3, ROTATE_1); \ } while(0) /* v1.0 key schedule: 9 ymm registers (only need 2 or 3) (0,1,2,3),(4,5,6,7) [8] then mutating with vpermq */ const __m256i K0 = _mm256_set_epi64x(K[6], K[4], K[2], K[0]); const __m256i K1 = _mm256_set_epi64x(K[7], K[5], K[3], K[1]); const __m256i K2 = _mm256_set_epi64x(K[8], K[6], K[4], K[2]); const __m256i K3 = _mm256_set_epi64x(K[0], K[7], K[5], K[3]); const __m256i K4 = _mm256_set_epi64x(K[1], K[8], K[6], K[4]); const __m256i K5 = _mm256_set_epi64x(K[2], K[0], K[7], K[5]); const __m256i K6 = _mm256_set_epi64x(K[3], K[1], K[8], K[6]); const __m256i K7 = _mm256_set_epi64x(K[4], K[2], K[0], K[7]); const __m256i K8 = _mm256_set_epi64x(K[5], K[3], K[1], K[8]); const __m256i* in_mm = reinterpret_cast(in); __m256i* out_mm = reinterpret_cast<__m256i*>(out); while(blocks >= 2) { __m256i X0 = _mm256_loadu_si256(in_mm++); __m256i X1 = _mm256_loadu_si256(in_mm++); __m256i X2 = _mm256_loadu_si256(in_mm++); __m256i X3 = _mm256_loadu_si256(in_mm++); const __m256i T = _mm256_set_epi64x(T_64[0], T_64[1], T_64[2], 0); interleave_epi64(X0, X1); interleave_epi64(X2, X3); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 17, K8,K0,K1, 3, 1, 2); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 15, K6,K7,K8, 2, 3, 1); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 13, K4,K5,K6, 1, 2, 3); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 11, K2,K3,K4, 3, 1, 2); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 9, K0,K1,K2, 2, 3, 1); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 7, K7,K8,K0, 1, 2, 3); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 5, K5,K6,K7, 3, 1, 2); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 3, K3,K4,K5, 2, 3, 1); THREEFISH_DEC_2_8_ROUNDS(X0, X1, X2, X3, 1, K1,K2,K3, 1, 2, 3); THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, 0, K0, K1, 2, 3); deinterleave_epi64(X0, X1); deinterleave_epi64(X2, X3); _mm256_storeu_si256(out_mm++, X0); _mm256_storeu_si256(out_mm++, X1); _mm256_storeu_si256(out_mm++, X2); _mm256_storeu_si256(out_mm++, X3); blocks -= 2; } for(size_t i = 0; i != blocks; ++i) { __m256i X0 = _mm256_loadu_si256(in_mm++); __m256i X1 = _mm256_loadu_si256(in_mm++); const __m256i T = _mm256_set_epi64x(T_64[0], T_64[1], T_64[2], 0); interleave_epi64(X0, X1); THREEFISH_DEC_8_ROUNDS(X0, X1, 17, K8,K0,K1, 3, 1, 2); THREEFISH_DEC_8_ROUNDS(X0, X1, 15, K6,K7,K8, 2, 3, 1); THREEFISH_DEC_8_ROUNDS(X0, X1, 13, K4,K5,K6, 1, 2, 3); THREEFISH_DEC_8_ROUNDS(X0, X1, 11, K2,K3,K4, 3, 1, 2); THREEFISH_DEC_8_ROUNDS(X0, X1, 9, K0,K1,K2, 2, 3, 1); THREEFISH_DEC_8_ROUNDS(X0, X1, 7, K7,K8,K0, 1, 2, 3); THREEFISH_DEC_8_ROUNDS(X0, X1, 5, K5,K6,K7, 3, 1, 2); THREEFISH_DEC_8_ROUNDS(X0, X1, 3, K3,K4,K5, 2, 3, 1); THREEFISH_DEC_8_ROUNDS(X0, X1, 1, K1,K2,K3, 1, 2, 3); THREEFISH_INJECT_KEY(X0, X1, 0, K0, K1, 2, 3); deinterleave_epi64(X0, X1); _mm256_storeu_si256(out_mm++, X0); _mm256_storeu_si256(out_mm++, X1); } #undef THREEFISH_DEC_8_ROUNDS #undef THREEFISH_ROUND #undef THREEFISH_INJECT_KEY #undef THREEFISH_DEC_2_8_ROUNDS #undef THREEFISH_ROUND_2 #undef THREEFISH_INJECT_KEY_2 } } botan-2.4.0/src/lib/block/twofish/000077500000000000000000000000001322470703100167315ustar00rootroot00000000000000botan-2.4.0/src/lib/block/twofish/info.txt000066400000000000000000000000511322470703100204210ustar00rootroot00000000000000 TWOFISH -> 20131128 botan-2.4.0/src/lib/block/twofish/twofish.cpp000066400000000000000000000207161322470703100211260ustar00rootroot00000000000000/* * Twofish * (C) 1999-2007,2017 Jack Lloyd * * The key schedule implemenation is based on a public domain * implementation by Matthew Skala * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { inline void TF_E(uint32_t A, uint32_t B, uint32_t& C, uint32_t& D, uint32_t RK1, uint32_t RK2, const secure_vector& SB) { uint32_t X = SB[ get_byte(3, A)] ^ SB[256+get_byte(2, A)] ^ SB[512+get_byte(1, A)] ^ SB[768+get_byte(0, A)]; uint32_t Y = SB[ get_byte(0, B)] ^ SB[256+get_byte(3, B)] ^ SB[512+get_byte(2, B)] ^ SB[768+get_byte(1, B)]; X += Y; Y += X; X += RK1; Y += RK2; C = rotr<1>(C ^ X); D = rotl<1>(D) ^ Y; } inline void TF_D(uint32_t A, uint32_t B, uint32_t& C, uint32_t& D, uint32_t RK1, uint32_t RK2, const secure_vector& SB) { uint32_t X = SB[ get_byte(3, A)] ^ SB[256+get_byte(2, A)] ^ SB[512+get_byte(1, A)] ^ SB[768+get_byte(0, A)]; uint32_t Y = SB[ get_byte(0, B)] ^ SB[256+get_byte(3, B)] ^ SB[512+get_byte(2, B)] ^ SB[768+get_byte(1, B)]; X += Y; Y += X; X += RK1; Y += RK2; C = rotl<1>(C) ^ X; D = rotr<1>(D ^ Y); } } /* * Twofish Encryption */ void Twofish::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SB.empty() == false); while(blocks >= 2) { uint32_t A0, B0, C0, D0; uint32_t A1, B1, C1, D1; load_le(in, A0, B0, C0, D0, A1, B1, C1, D1); A0 ^= m_RK[0]; A1 ^= m_RK[0]; B0 ^= m_RK[1]; B1 ^= m_RK[1]; C0 ^= m_RK[2]; C1 ^= m_RK[2]; D0 ^= m_RK[3]; D1 ^= m_RK[3]; for(size_t k = 8; k != 40; k += 4) { TF_E(A0, B0, C0, D0, m_RK[k+0], m_RK[k+1], m_SB); TF_E(A1, B1, C1, D1, m_RK[k+0], m_RK[k+1], m_SB); TF_E(C0, D0, A0, B0, m_RK[k+2], m_RK[k+3], m_SB); TF_E(C1, D1, A1, B1, m_RK[k+2], m_RK[k+3], m_SB); } C0 ^= m_RK[4]; C1 ^= m_RK[4]; D0 ^= m_RK[5]; D1 ^= m_RK[5]; A0 ^= m_RK[6]; A1 ^= m_RK[6]; B0 ^= m_RK[7]; B1 ^= m_RK[7]; store_le(out, C0, D0, A0, B0, C1, D1, A1, B1); blocks -= 2; out += 2*BLOCK_SIZE; in += 2*BLOCK_SIZE; } if(blocks) { uint32_t A, B, C, D; load_le(in, A, B, C, D); A ^= m_RK[0]; B ^= m_RK[1]; C ^= m_RK[2]; D ^= m_RK[3]; for(size_t k = 8; k != 40; k += 4) { TF_E(A, B, C, D, m_RK[k ], m_RK[k+1], m_SB); TF_E(C, D, A, B, m_RK[k+2], m_RK[k+3], m_SB); } C ^= m_RK[4]; D ^= m_RK[5]; A ^= m_RK[6]; B ^= m_RK[7]; store_le(out, C, D, A, B); } } /* * Twofish Decryption */ void Twofish::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_SB.empty() == false); while(blocks >= 2) { uint32_t A0, B0, C0, D0; uint32_t A1, B1, C1, D1; load_le(in, A0, B0, C0, D0, A1, B1, C1, D1); A0 ^= m_RK[4]; A1 ^= m_RK[4]; B0 ^= m_RK[5]; B1 ^= m_RK[5]; C0 ^= m_RK[6]; C1 ^= m_RK[6]; D0 ^= m_RK[7]; D1 ^= m_RK[7]; for(size_t k = 40; k != 8; k -= 4) { TF_D(A0, B0, C0, D0, m_RK[k-2], m_RK[k-1], m_SB); TF_D(A1, B1, C1, D1, m_RK[k-2], m_RK[k-1], m_SB); TF_D(C0, D0, A0, B0, m_RK[k-4], m_RK[k-3], m_SB); TF_D(C1, D1, A1, B1, m_RK[k-4], m_RK[k-3], m_SB); } C0 ^= m_RK[0]; C1 ^= m_RK[0]; D0 ^= m_RK[1]; D1 ^= m_RK[1]; A0 ^= m_RK[2]; A1 ^= m_RK[2]; B0 ^= m_RK[3]; B1 ^= m_RK[3]; store_le(out, C0, D0, A0, B0, C1, D1, A1, B1); blocks -= 2; out += 2*BLOCK_SIZE; in += 2*BLOCK_SIZE; } if(blocks) { uint32_t A, B, C, D; load_le(in, A, B, C, D); A ^= m_RK[4]; B ^= m_RK[5]; C ^= m_RK[6]; D ^= m_RK[7]; for(size_t k = 40; k != 8; k -= 4) { TF_D(A, B, C, D, m_RK[k-2], m_RK[k-1], m_SB); TF_D(C, D, A, B, m_RK[k-4], m_RK[k-3], m_SB); } C ^= m_RK[0]; D ^= m_RK[1]; A ^= m_RK[2]; B ^= m_RK[3]; store_le(out, C, D, A, B); } } /* * Twofish Key Schedule */ void Twofish::key_schedule(const uint8_t key[], size_t length) { m_SB.resize(1024); m_RK.resize(40); secure_vector S(16); for(size_t i = 0; i != length; ++i) { /* * Do one column of the RS matrix multiplcation */ if(key[i]) { uint8_t X = POLY_TO_EXP[key[i] - 1]; uint8_t RS1 = RS[(4*i ) % 32]; uint8_t RS2 = RS[(4*i+1) % 32]; uint8_t RS3 = RS[(4*i+2) % 32]; uint8_t RS4 = RS[(4*i+3) % 32]; S[4*(i/8) ] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS1 - 1]) % 255]; S[4*(i/8)+1] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS2 - 1]) % 255]; S[4*(i/8)+2] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS3 - 1]) % 255]; S[4*(i/8)+3] ^= EXP_TO_POLY[(X + POLY_TO_EXP[RS4 - 1]) % 255]; } } if(length == 16) { for(size_t i = 0; i != 256; ++i) { m_SB[ i] = MDS0[Q0[Q0[i]^S[ 0]]^S[ 4]]; m_SB[256+i] = MDS1[Q0[Q1[i]^S[ 1]]^S[ 5]]; m_SB[512+i] = MDS2[Q1[Q0[i]^S[ 2]]^S[ 6]]; m_SB[768+i] = MDS3[Q1[Q1[i]^S[ 3]]^S[ 7]]; } for(size_t i = 0; i < 40; i += 2) { uint32_t X = MDS0[Q0[Q0[i ]^key[ 8]]^key[ 0]] ^ MDS1[Q0[Q1[i ]^key[ 9]]^key[ 1]] ^ MDS2[Q1[Q0[i ]^key[10]]^key[ 2]] ^ MDS3[Q1[Q1[i ]^key[11]]^key[ 3]]; uint32_t Y = MDS0[Q0[Q0[i+1]^key[12]]^key[ 4]] ^ MDS1[Q0[Q1[i+1]^key[13]]^key[ 5]] ^ MDS2[Q1[Q0[i+1]^key[14]]^key[ 6]] ^ MDS3[Q1[Q1[i+1]^key[15]]^key[ 7]]; Y = rotl<8>(Y); X += Y; Y += X; m_RK[i] = X; m_RK[i+1] = rotl<9>(Y); } } else if(length == 24) { for(size_t i = 0; i != 256; ++i) { m_SB[ i] = MDS0[Q0[Q0[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]; m_SB[256+i] = MDS1[Q0[Q1[Q1[i]^S[ 1]]^S[ 5]]^S[ 9]]; m_SB[512+i] = MDS2[Q1[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]; m_SB[768+i] = MDS3[Q1[Q1[Q0[i]^S[ 3]]^S[ 7]]^S[11]]; } for(size_t i = 0; i < 40; i += 2) { uint32_t X = MDS0[Q0[Q0[Q1[i ]^key[16]]^key[ 8]]^key[ 0]] ^ MDS1[Q0[Q1[Q1[i ]^key[17]]^key[ 9]]^key[ 1]] ^ MDS2[Q1[Q0[Q0[i ]^key[18]]^key[10]]^key[ 2]] ^ MDS3[Q1[Q1[Q0[i ]^key[19]]^key[11]]^key[ 3]]; uint32_t Y = MDS0[Q0[Q0[Q1[i+1]^key[20]]^key[12]]^key[ 4]] ^ MDS1[Q0[Q1[Q1[i+1]^key[21]]^key[13]]^key[ 5]] ^ MDS2[Q1[Q0[Q0[i+1]^key[22]]^key[14]]^key[ 6]] ^ MDS3[Q1[Q1[Q0[i+1]^key[23]]^key[15]]^key[ 7]]; Y = rotl<8>(Y); X += Y; Y += X; m_RK[i] = X; m_RK[i+1] = rotl<9>(Y); } } else if(length == 32) { for(size_t i = 0; i != 256; ++i) { m_SB[ i] = MDS0[Q0[Q0[Q1[Q1[i]^S[ 0]]^S[ 4]]^S[ 8]]^S[12]]; m_SB[256+i] = MDS1[Q0[Q1[Q1[Q0[i]^S[ 1]]^S[ 5]]^S[ 9]]^S[13]]; m_SB[512+i] = MDS2[Q1[Q0[Q0[Q0[i]^S[ 2]]^S[ 6]]^S[10]]^S[14]]; m_SB[768+i] = MDS3[Q1[Q1[Q0[Q1[i]^S[ 3]]^S[ 7]]^S[11]]^S[15]]; } for(size_t i = 0; i < 40; i += 2) { uint32_t X = MDS0[Q0[Q0[Q1[Q1[i ]^key[24]]^key[16]]^key[ 8]]^key[ 0]] ^ MDS1[Q0[Q1[Q1[Q0[i ]^key[25]]^key[17]]^key[ 9]]^key[ 1]] ^ MDS2[Q1[Q0[Q0[Q0[i ]^key[26]]^key[18]]^key[10]]^key[ 2]] ^ MDS3[Q1[Q1[Q0[Q1[i ]^key[27]]^key[19]]^key[11]]^key[ 3]]; uint32_t Y = MDS0[Q0[Q0[Q1[Q1[i+1]^key[28]]^key[20]]^key[12]]^key[ 4]] ^ MDS1[Q0[Q1[Q1[Q0[i+1]^key[29]]^key[21]]^key[13]]^key[ 5]] ^ MDS2[Q1[Q0[Q0[Q0[i+1]^key[30]]^key[22]]^key[14]]^key[ 6]] ^ MDS3[Q1[Q1[Q0[Q1[i+1]^key[31]]^key[23]]^key[15]]^key[ 7]]; Y = rotl<8>(Y); X += Y; Y += X; m_RK[i] = X; m_RK[i+1] = rotl<9>(Y); } } } /* * Clear memory of sensitive data */ void Twofish::clear() { zap(m_SB); zap(m_RK); } } botan-2.4.0/src/lib/block/twofish/twofish.h000066400000000000000000000022331322470703100205650ustar00rootroot00000000000000/* * Twofish * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TWOFISH_H_ #define BOTAN_TWOFISH_H_ #include namespace Botan { /** * Twofish, an AES finalist */ class BOTAN_PUBLIC_API(2,0) Twofish final : public Block_Cipher_Fixed_Params<16, 16, 32, 8> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "Twofish"; } BlockCipher* clone() const override { return new Twofish; } private: void key_schedule(const uint8_t[], size_t) override; static const uint32_t MDS0[256]; static const uint32_t MDS1[256]; static const uint32_t MDS2[256]; static const uint32_t MDS3[256]; static const uint8_t Q0[256]; static const uint8_t Q1[256]; static const uint8_t RS[32]; static const uint8_t EXP_TO_POLY[255]; static const uint8_t POLY_TO_EXP[255]; secure_vector m_SB, m_RK; }; } #endif botan-2.4.0/src/lib/block/twofish/twofish_tab.cpp000066400000000000000000000467731322470703100217670ustar00rootroot00000000000000/* * S-Box and MDS Tables for Twofish * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { const uint8_t Twofish::Q0[256] = { 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 }; const uint8_t Twofish::Q1[256] = { 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 }; const uint8_t Twofish::RS[32] = { 0x01, 0xA4, 0x02, 0xA4, 0xA4, 0x56, 0xA1, 0x55, 0x55, 0x82, 0xFC, 0x87, 0x87, 0xF3, 0xC1, 0x5A, 0x5A, 0x1E, 0x47, 0x58, 0x58, 0xC6, 0xAE, 0xDB, 0xDB, 0x68, 0x3D, 0x9E, 0x9E, 0xE5, 0x19, 0x03 }; const uint8_t Twofish::EXP_TO_POLY[255] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79, 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5, 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3, 0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, 0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12, 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7, 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C, 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64, 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A, 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56, 0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, 0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, 0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB, 0x3B, 0x76, 0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1, 0x8F, 0x53, 0xA6 }; const uint8_t Twofish::POLY_TO_EXP[255] = { 0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93, 0x19, 0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94, 0x4B, 0x1A, 0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24, 0x5D, 0x87, 0x6C, 0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95, 0x98, 0x4C, 0xCA, 0x1B, 0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12, 0x56, 0x62, 0xAB, 0xF0, 0x47, 0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25, 0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D, 0xD6, 0x9C, 0x79, 0xB8, 0x08, 0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8, 0x8A, 0xA4, 0x5A, 0x96, 0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C, 0x7B, 0xE7, 0x3B, 0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83, 0x6F, 0x13, 0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48, 0x0A, 0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26, 0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC, 0x6E, 0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09, 0x41, 0xC3, 0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52, 0xFE, 0x16, 0xA9, 0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97, 0xC9, 0x2A, 0xA2, 0x9A, 0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF, 0xCC, 0x11, 0xE5, 0x72, 0x1D, 0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C, 0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75, 0x1E, 0xF5, 0x3E, 0x38, 0xF6, 0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84, 0xA0, 0x70, 0xED, 0x14, 0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64, 0xD0, 0xDD, 0x77, 0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49, 0xB4, 0x0B, 0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF, 0x85, 0xC8, 0xA1 }; const uint32_t Twofish::MDS0[256] = { 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 }; const uint32_t Twofish::MDS1[256] = { 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 }; const uint32_t Twofish::MDS2[256] = { 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF }; const uint32_t Twofish::MDS3[256] = { 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 }; } botan-2.4.0/src/lib/block/xtea/000077500000000000000000000000001322470703100162075ustar00rootroot00000000000000botan-2.4.0/src/lib/block/xtea/info.txt000066400000000000000000000000461322470703100177030ustar00rootroot00000000000000 XTEA -> 20131128 botan-2.4.0/src/lib/block/xtea/xtea.cpp000066400000000000000000000067161322470703100176660ustar00rootroot00000000000000/* * XTEA * (C) 1999-2009,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * XTEA Encryption */ void XTEA::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); const uint32_t* EK = &m_EK[0]; const size_t blocks4 = blocks / 4; const size_t blocks_left = blocks % 4; BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks4; i++) { uint32_t L0, R0, L1, R1, L2, R2, L3, R3; load_be(in + 4*BLOCK_SIZE*i, L0, R0, L1, R1, L2, R2, L3, R3); for(size_t r = 0; r != 32; ++r) { L0 += (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[2*r]; L1 += (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[2*r]; L2 += (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[2*r]; L3 += (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[2*r]; R0 += (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[2*r+1]; R1 += (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[2*r+1]; R2 += (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[2*r+1]; R3 += (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[2*r+1]; } store_be(out + 4*BLOCK_SIZE*i, L0, R0, L1, R1, L2, R2, L3, R3); } BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks_left; ++i) { uint32_t L, R; load_be(in + BLOCK_SIZE*(4*blocks4+i), L, R); for(size_t r = 0; r != 32; ++r) { L += (((R << 4) ^ (R >> 5)) + R) ^ EK[2*r]; R += (((L << 4) ^ (L >> 5)) + L) ^ EK[2*r+1]; } store_be(out + BLOCK_SIZE*(4*blocks4+i), L, R); } } /* * XTEA Decryption */ void XTEA::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const { verify_key_set(m_EK.empty() == false); const uint32_t* EK = &m_EK[0]; const size_t blocks4 = blocks / 4; const size_t blocks_left = blocks % 4; BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks4; i++) { uint32_t L0, R0, L1, R1, L2, R2, L3, R3; load_be(in + 4*BLOCK_SIZE*i, L0, R0, L1, R1, L2, R2, L3, R3); for(size_t r = 0; r != 32; ++r) { R0 -= (((L0 << 4) ^ (L0 >> 5)) + L0) ^ EK[63 - 2*r]; R1 -= (((L1 << 4) ^ (L1 >> 5)) + L1) ^ EK[63 - 2*r]; R2 -= (((L2 << 4) ^ (L2 >> 5)) + L2) ^ EK[63 - 2*r]; R3 -= (((L3 << 4) ^ (L3 >> 5)) + L3) ^ EK[63 - 2*r]; L0 -= (((R0 << 4) ^ (R0 >> 5)) + R0) ^ EK[62 - 2*r]; L1 -= (((R1 << 4) ^ (R1 >> 5)) + R1) ^ EK[62 - 2*r]; L2 -= (((R2 << 4) ^ (R2 >> 5)) + R2) ^ EK[62 - 2*r]; L3 -= (((R3 << 4) ^ (R3 >> 5)) + R3) ^ EK[62 - 2*r]; } store_be(out + 4*BLOCK_SIZE*i, L0, R0, L1, R1, L2, R2, L3, R3); } BOTAN_PARALLEL_FOR(size_t i = 0; i < blocks_left; ++i) { uint32_t L, R; load_be(in + BLOCK_SIZE*(4*blocks4+i), L, R); for(size_t r = 0; r != 32; ++r) { R -= (((L << 4) ^ (L >> 5)) + L) ^ m_EK[63 - 2*r]; L -= (((R << 4) ^ (R >> 5)) + R) ^ m_EK[62 - 2*r]; } store_be(out + BLOCK_SIZE*(4*blocks4+i), L, R); } } /* * XTEA Key Schedule */ void XTEA::key_schedule(const uint8_t key[], size_t) { m_EK.resize(64); secure_vector UK(4); for(size_t i = 0; i != 4; ++i) UK[i] = load_be(key, i); uint32_t D = 0; for(size_t i = 0; i != 64; i += 2) { m_EK[i ] = D + UK[D % 4]; D += 0x9E3779B9; m_EK[i+1] = D + UK[(D >> 11) % 4]; } } void XTEA::clear() { zap(m_EK); } } botan-2.4.0/src/lib/block/xtea/xtea.h000066400000000000000000000014051322470703100173210ustar00rootroot00000000000000/* * XTEA * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_XTEA_H_ #define BOTAN_XTEA_H_ #include namespace Botan { /** * XTEA */ class BOTAN_PUBLIC_API(2,0) XTEA final : public Block_Cipher_Fixed_Params<8, 16> { public: void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override; void clear() override; std::string name() const override { return "XTEA"; } BlockCipher* clone() const override { return new XTEA; } private: void key_schedule(const uint8_t[], size_t) override; secure_vector m_EK; }; } #endif botan-2.4.0/src/lib/codec/000077500000000000000000000000001322470703100152315ustar00rootroot00000000000000botan-2.4.0/src/lib/codec/base64/000077500000000000000000000000001322470703100163155ustar00rootroot00000000000000botan-2.4.0/src/lib/codec/base64/base64.cpp000066400000000000000000000176731322470703100201230ustar00rootroot00000000000000/* * Base64 Encoding and Decoding * (C) 2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { static const uint8_t BIN_TO_BASE64[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; void do_base64_encode(char out[4], const uint8_t in[3]) { out[0] = BIN_TO_BASE64[(in[0] & 0xFC) >> 2]; out[1] = BIN_TO_BASE64[((in[0] & 0x03) << 4) | (in[1] >> 4)]; out[2] = BIN_TO_BASE64[((in[1] & 0x0F) << 2) | (in[2] >> 6)]; out[3] = BIN_TO_BASE64[in[2] & 0x3F]; } } size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t& input_consumed, bool final_inputs) { input_consumed = 0; size_t input_remaining = input_length; size_t output_produced = 0; while(input_remaining >= 3) { do_base64_encode(out + output_produced, in + input_consumed); input_consumed += 3; output_produced += 4; input_remaining -= 3; } if(final_inputs && input_remaining) { uint8_t remainder[3] = { 0 }; for(size_t i = 0; i != input_remaining; ++i) remainder[i] = in[input_consumed + i]; do_base64_encode(out + output_produced, remainder); size_t empty_bits = 8 * (3 - input_remaining); size_t index = output_produced + 4 - 1; while(empty_bits >= 8) { out[index--] = '='; empty_bits -= 6; } input_consumed += input_remaining; output_produced += 4; } return output_produced; } std::string base64_encode(const uint8_t input[], size_t input_length) { const size_t output_length = base64_encode_max_output(input_length); std::string output(output_length, 0); size_t consumed = 0; size_t produced = 0; if (output_length > 0) { produced = base64_encode(&output.front(), input, input_length, consumed, true); } BOTAN_ASSERT_EQUAL(consumed, input_length, "Consumed the entire input"); BOTAN_ASSERT_EQUAL(produced, output.size(), "Produced expected size"); return output; } size_t base64_decode(uint8_t output[], const char input[], size_t input_length, size_t& input_consumed, bool final_inputs, bool ignore_ws) { /* * Base64 Decoder Lookup Table * Warning: assumes ASCII encodings */ static const uint8_t BASE64_TO_BIN[256] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xFF, 0xFF, 0x3F, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; uint8_t* out_ptr = output; uint8_t decode_buf[4]; size_t decode_buf_pos = 0; size_t final_truncate = 0; clear_mem(output, input_length * 3 / 4); for(size_t i = 0; i != input_length; ++i) { const uint8_t bin = BASE64_TO_BIN[static_cast(input[i])]; if(bin <= 0x3F) { decode_buf[decode_buf_pos] = bin; decode_buf_pos += 1; } else if(!(bin == 0x81 || (bin == 0x80 && ignore_ws))) { std::string bad_char(1, input[i]); if(bad_char == "\t") bad_char = "\\t"; else if(bad_char == "\n") bad_char = "\\n"; else if(bad_char == "\r") bad_char = "\\r"; throw Invalid_Argument( std::string("base64_decode: invalid base64 character '") + bad_char + "'"); } /* * If we're at the end of the input, pad with 0s and truncate */ if(final_inputs && (i == input_length - 1)) { if(decode_buf_pos) { for(size_t j = decode_buf_pos; j != 4; ++j) decode_buf[j] = 0; final_truncate = (4 - decode_buf_pos); decode_buf_pos = 4; } } if(decode_buf_pos == 4) { out_ptr[0] = (decode_buf[0] << 2) | (decode_buf[1] >> 4); out_ptr[1] = (decode_buf[1] << 4) | (decode_buf[2] >> 2); out_ptr[2] = (decode_buf[2] << 6) | decode_buf[3]; out_ptr += 3; decode_buf_pos = 0; input_consumed = i+1; } } while(input_consumed < input_length && BASE64_TO_BIN[static_cast(input[input_consumed])] == 0x80) { ++input_consumed; } size_t written = (out_ptr - output) - final_truncate; return written; } size_t base64_decode(uint8_t output[], const char input[], size_t input_length, bool ignore_ws) { size_t consumed = 0; size_t written = base64_decode(output, input, input_length, consumed, true, ignore_ws); if(consumed != input_length) throw Invalid_Argument("base64_decode: input did not have full bytes"); return written; } size_t base64_decode(uint8_t output[], const std::string& input, bool ignore_ws) { return base64_decode(output, input.data(), input.length(), ignore_ws); } secure_vector base64_decode(const char input[], size_t input_length, bool ignore_ws) { const size_t output_length = base64_decode_max_output(input_length); secure_vector bin(output_length); size_t written = base64_decode(bin.data(), input, input_length, ignore_ws); bin.resize(written); return bin; } secure_vector base64_decode(const std::string& input, bool ignore_ws) { return base64_decode(input.data(), input.size(), ignore_ws); } size_t base64_encode_max_output(size_t input_length) { return (round_up(input_length, 3) / 3) * 4; } size_t base64_decode_max_output(size_t input_length) { return (round_up(input_length, 4) * 3) / 4; } } botan-2.4.0/src/lib/codec/base64/base64.h000066400000000000000000000117231322470703100175560ustar00rootroot00000000000000/* * Base64 Encoding and Decoding * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BASE64_CODEC_H_ #define BOTAN_BASE64_CODEC_H_ #include #include namespace Botan { /** * Perform base64 encoding * @param output an array of at least base64_encode_max_output bytes * @param input is some binary data * @param input_length length of input in bytes * @param input_consumed is an output parameter which says how many * bytes of input were actually consumed. If less than * input_length, then the range input[consumed:length] * should be passed in later along with more input. * @param final_inputs true iff this is the last input, in which case padding chars will be applied if needed * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) base64_encode(char output[], const uint8_t input[], size_t input_length, size_t& input_consumed, bool final_inputs); /** * Perform base64 encoding * @param input some input * @param input_length length of input in bytes * @return base64adecimal representation of input */ std::string BOTAN_PUBLIC_API(2,0) base64_encode(const uint8_t input[], size_t input_length); /** * Perform base64 encoding * @param input some input * @return base64adecimal representation of input */ template std::string base64_encode(const std::vector& input) { return base64_encode(input.data(), input.size()); } /** * Perform base64 decoding * @param output an array of at least base64_decode_max_output bytes * @param input some base64 input * @param input_length length of input in bytes * @param input_consumed is an output parameter which says how many * bytes of input were actually consumed. If less than * input_length, then the range input[consumed:length] * should be passed in later along with more input. * @param final_inputs true iff this is the last input, in which case padding is allowed * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) base64_decode(uint8_t output[], const char input[], size_t input_length, size_t& input_consumed, bool final_inputs, bool ignore_ws = true); /** * Perform base64 decoding * @param output an array of at least base64_decode_max_output bytes * @param input some base64 input * @param input_length length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) base64_decode(uint8_t output[], const char input[], size_t input_length, bool ignore_ws = true); /** * Perform base64 decoding * @param output an array of at least base64_decode_max_output bytes * @param input some base64 input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) base64_decode(uint8_t output[], const std::string& input, bool ignore_ws = true); /** * Perform base64 decoding * @param input some base64 input * @param input_length the length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded base64 output */ secure_vector BOTAN_PUBLIC_API(2,0) base64_decode(const char input[], size_t input_length, bool ignore_ws = true); /** * Perform base64 decoding * @param input some base64 input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded base64 output */ secure_vector BOTAN_PUBLIC_API(2,0) base64_decode(const std::string& input, bool ignore_ws = true); /** * Calculate the size of output buffer for base64_encode * @param input_length the length of input in bytes * @return the size of output buffer in bytes */ size_t BOTAN_PUBLIC_API(2,1) base64_encode_max_output(size_t input_length); /** * Calculate the size of output buffer for base64_decode * @param input_length the length of input in bytes * @return the size of output buffer in bytes */ size_t BOTAN_PUBLIC_API(2,1) base64_decode_max_output(size_t input_length); } #endif botan-2.4.0/src/lib/codec/base64/info.txt000066400000000000000000000000561322470703100200120ustar00rootroot00000000000000 BASE64_CODEC -> 20131128 botan-2.4.0/src/lib/codec/hex/000077500000000000000000000000001322470703100160155ustar00rootroot00000000000000botan-2.4.0/src/lib/codec/hex/hex.cpp000066400000000000000000000143221322470703100173070ustar00rootroot00000000000000/* * Hex Encoding and Decoding * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase) { static const uint8_t BIN_TO_HEX_UPPER[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static const uint8_t BIN_TO_HEX_LOWER[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; const uint8_t* tbl = uppercase ? BIN_TO_HEX_UPPER : BIN_TO_HEX_LOWER; for(size_t i = 0; i != input_length; ++i) { uint8_t x = input[i]; output[2*i ] = tbl[(x >> 4) & 0x0F]; output[2*i+1] = tbl[(x ) & 0x0F]; } } std::string hex_encode(const uint8_t input[], size_t input_length, bool uppercase) { std::string output(2 * input_length, 0); if(input_length) hex_encode(&output.front(), input, input_length, uppercase); return output; } size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t& input_consumed, bool ignore_ws) { /* * Mapping of hex characters to either their binary equivalent * or to an error code. * If valid hex (0-9 A-F a-f), the value. * If whitespace, then 0x80 * Otherwise 0xFF * Warning: this table assumes ASCII character encodings */ static const uint8_t HEX_TO_BIN[256] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; uint8_t* out_ptr = output; bool top_nibble = true; clear_mem(output, input_length / 2); for(size_t i = 0; i != input_length; ++i) { const uint8_t bin = HEX_TO_BIN[static_cast(input[i])]; if(bin >= 0x10) { if(bin == 0x80 && ignore_ws) continue; std::string bad_char(1, input[i]); if(bad_char == "\t") bad_char = "\\t"; else if(bad_char == "\n") bad_char = "\\n"; throw Invalid_Argument( std::string("hex_decode: invalid hex character '") + bad_char + "'"); } if(top_nibble) *out_ptr |= bin << 4; else *out_ptr |= bin; top_nibble = !top_nibble; if(top_nibble) ++out_ptr; } input_consumed = input_length; size_t written = (out_ptr - output); /* * We only got half of a uint8_t at the end; zap the half-written * output and mark it as unread */ if(!top_nibble) { *out_ptr = 0; input_consumed -= 1; } return written; } size_t hex_decode(uint8_t output[], const char input[], size_t input_length, bool ignore_ws) { size_t consumed = 0; size_t written = hex_decode(output, input, input_length, consumed, ignore_ws); if(consumed != input_length) throw Invalid_Argument("hex_decode: input did not have full bytes"); return written; } size_t hex_decode(uint8_t output[], const std::string& input, bool ignore_ws) { return hex_decode(output, input.data(), input.length(), ignore_ws); } secure_vector hex_decode_locked(const char input[], size_t input_length, bool ignore_ws) { secure_vector bin(1 + input_length / 2); size_t written = hex_decode(bin.data(), input, input_length, ignore_ws); bin.resize(written); return bin; } secure_vector hex_decode_locked(const std::string& input, bool ignore_ws) { return hex_decode_locked(input.data(), input.size(), ignore_ws); } std::vector hex_decode(const char input[], size_t input_length, bool ignore_ws) { std::vector bin(1 + input_length / 2); size_t written = hex_decode(bin.data(), input, input_length, ignore_ws); bin.resize(written); return bin; } std::vector hex_decode(const std::string& input, bool ignore_ws) { return hex_decode(input.data(), input.size(), ignore_ws); } } botan-2.4.0/src/lib/codec/hex/hex.h000066400000000000000000000112551322470703100167560ustar00rootroot00000000000000/* * Hex Encoding and Decoding * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HEX_CODEC_H_ #define BOTAN_HEX_CODEC_H_ #include #include namespace Botan { /** * Perform hex encoding * @param output an array of at least input_length*2 bytes * @param input is some binary data * @param input_length length of input in bytes * @param uppercase should output be upper or lower case? */ void BOTAN_PUBLIC_API(2,0) hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase = true); /** * Perform hex encoding * @param input some input * @param input_length length of input in bytes * @param uppercase should output be upper or lower case? * @return hexadecimal representation of input */ std::string BOTAN_PUBLIC_API(2,0) hex_encode(const uint8_t input[], size_t input_length, bool uppercase = true); /** * Perform hex encoding * @param input some input * @param uppercase should output be upper or lower case? * @return hexadecimal representation of input */ template std::string hex_encode(const std::vector& input, bool uppercase = true) { return hex_encode(input.data(), input.size(), uppercase); } /** * Perform hex decoding * @param output an array of at least input_length/2 bytes * @param input some hex input * @param input_length length of input in bytes * @param input_consumed is an output parameter which says how many * bytes of input were actually consumed. If less than * input_length, then the range input[consumed:length] * should be passed in later along with more input. * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) hex_decode(uint8_t output[], const char input[], size_t input_length, size_t& input_consumed, bool ignore_ws = true); /** * Perform hex decoding * @param output an array of at least input_length/2 bytes * @param input some hex input * @param input_length length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) hex_decode(uint8_t output[], const char input[], size_t input_length, bool ignore_ws = true); /** * Perform hex decoding * @param output an array of at least input_length/2 bytes * @param input some hex input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return number of bytes written to output */ size_t BOTAN_PUBLIC_API(2,0) hex_decode(uint8_t output[], const std::string& input, bool ignore_ws = true); /** * Perform hex decoding * @param input some hex input * @param input_length the length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded hex output */ std::vector BOTAN_PUBLIC_API(2,0) hex_decode(const char input[], size_t input_length, bool ignore_ws = true); /** * Perform hex decoding * @param input some hex input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded hex output */ std::vector BOTAN_PUBLIC_API(2,0) hex_decode(const std::string& input, bool ignore_ws = true); /** * Perform hex decoding * @param input some hex input * @param input_length the length of input in bytes * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded hex output */ secure_vector BOTAN_PUBLIC_API(2,0) hex_decode_locked(const char input[], size_t input_length, bool ignore_ws = true); /** * Perform hex decoding * @param input some hex input * @param ignore_ws ignore whitespace on input; if false, throw an exception if whitespace is encountered * @return decoded hex output */ secure_vector BOTAN_PUBLIC_API(2,0) hex_decode_locked(const std::string& input, bool ignore_ws = true); } #endif botan-2.4.0/src/lib/codec/hex/info.txt000066400000000000000000000000531322470703100175070ustar00rootroot00000000000000 HEX_CODEC -> 20131128 botan-2.4.0/src/lib/compression/000077500000000000000000000000001322470703100165155ustar00rootroot00000000000000botan-2.4.0/src/lib/compression/bzip2/000077500000000000000000000000001322470703100175435ustar00rootroot00000000000000botan-2.4.0/src/lib/compression/bzip2/bzip2.cpp000066400000000000000000000060231322470703100212760ustar00rootroot00000000000000/* * Bzip2 Compressor * (C) 2001 Peter J Jones * 2001-2007,2014 Jack Lloyd * 2006 Matt Johnston * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #define BZ_NO_STDIO #include namespace Botan { namespace { class Bzip2_Stream : public Zlib_Style_Stream { public: Bzip2_Stream() { streamp()->opaque = alloc(); streamp()->bzalloc = Compression_Alloc_Info::malloc; streamp()->bzfree = Compression_Alloc_Info::free; } uint32_t run_flag() const override { return BZ_RUN; } uint32_t flush_flag() const override { return BZ_FLUSH; } uint32_t finish_flag() const override { return BZ_FINISH; } }; class Bzip2_Compression_Stream final : public Bzip2_Stream { public: explicit Bzip2_Compression_Stream(size_t block_size) { /* * Defaults to 900k blocks as the computation cost of * compression is not overly affected by the size, though * more memory is required. */ if(block_size == 0 || block_size >= 9) block_size = 9; int rc = BZ2_bzCompressInit(streamp(), block_size, 0, 0); if(rc == BZ_MEM_ERROR) throw Exception("bzip memory allocation failure"); else if(rc != BZ_OK) throw Exception("bzip compress initialization failed"); } ~Bzip2_Compression_Stream() { BZ2_bzCompressEnd(streamp()); } bool run(uint32_t flags) override { int rc = BZ2_bzCompress(streamp(), flags); if(rc == BZ_MEM_ERROR) throw Exception("bzip memory allocation failure"); else if(rc < 0) throw Exception("bzip compress error " + std::to_string(-rc)); return (rc == BZ_STREAM_END); } }; class Bzip2_Decompression_Stream final : public Bzip2_Stream { public: Bzip2_Decompression_Stream() { int rc = BZ2_bzDecompressInit(streamp(), 0, 0); if(rc == BZ_MEM_ERROR) throw Exception("bzip memory allocation failure"); else if(rc != BZ_OK) throw Exception("bzip decompress initialization failed"); } ~Bzip2_Decompression_Stream() { BZ2_bzDecompressEnd(streamp()); } bool run(uint32_t) override { int rc = BZ2_bzDecompress(streamp()); if(rc == BZ_MEM_ERROR) throw Exception("bzip memory allocation failure"); else if(rc != BZ_OK && rc != BZ_STREAM_END) throw Exception("bzip decompress error " + std::to_string(-rc)); return (rc == BZ_STREAM_END); } }; } Compression_Stream* Bzip2_Compression::make_stream(size_t comp_level) const { return new Bzip2_Compression_Stream(comp_level); } Compression_Stream* Bzip2_Decompression::make_stream() const { return new Bzip2_Decompression_Stream; } } botan-2.4.0/src/lib/compression/bzip2/bzip2.h000066400000000000000000000014761322470703100207520ustar00rootroot00000000000000/* * Bzip2 Compressor * (C) 2001 Peter J Jones * 2001-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BZIP2_H_ #define BOTAN_BZIP2_H_ #include namespace Botan { /** * Bzip2 Compression */ class BOTAN_PUBLIC_API(2,0) Bzip2_Compression final : public Stream_Compression { public: std::string name() const override { return "Bzip2_Compression"; } private: Compression_Stream* make_stream(size_t comp_level) const override; }; /** * Bzip2 Deccompression */ class BOTAN_PUBLIC_API(2,0) Bzip2_Decompression final : public Stream_Decompression { public: std::string name() const override { return "Bzip2_Decompression"; } private: Compression_Stream* make_stream() const override; }; } #endif botan-2.4.0/src/lib/compression/bzip2/info.txt000066400000000000000000000001221322470703100212320ustar00rootroot00000000000000 BZIP2 -> 20160412 load_on vendor all -> bz2 botan-2.4.0/src/lib/compression/compress_utils.cpp000066400000000000000000000127461322470703100223060ustar00rootroot00000000000000/* * Compression Utils * (C) 2014,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { void* Compression_Alloc_Info::do_malloc(size_t n, size_t size) { // TODO maximum length check here? void* ptr = std::calloc(n, size); /* * Return null rather than throwing here as we are being called by a * C library and it may not be possible for an exception to unwind * the call stack from here. The compression library is expecting a * function written in C and a null return on error, which it will * send upwards to the compression wrappers. */ if(ptr) { m_current_allocs[ptr] = n * size; } return ptr; } void Compression_Alloc_Info::do_free(void* ptr) { if(ptr) { auto i = m_current_allocs.find(ptr); if(i == m_current_allocs.end()) throw Exception("Compression_Alloc_Info::free got pointer not allocated by us"); secure_scrub_memory(ptr, i->second); std::free(ptr); m_current_allocs.erase(i); } } void Stream_Compression::clear() { m_stream.reset(); } void Stream_Compression::start(size_t level) { m_stream.reset(make_stream(level)); } void Stream_Compression::process(secure_vector& buf, size_t offset, uint32_t flags) { BOTAN_ASSERT(m_stream, "Initialized"); BOTAN_ASSERT(buf.size() >= offset, "Offset is sane"); // bzip doesn't like being called with no input and BZ_RUN if(buf.size() == offset && flags == m_stream->run_flag()) { return; } if(m_buffer.size() < buf.size() + offset) m_buffer.resize(buf.size() + offset); // If the output buffer has zero length, .data() might return nullptr. This would // make some compression algorithms (notably those provided by zlib) fail. // Any small positive value works fine, but we choose 32 as it is the smallest power // of two that is large enough to hold all the headers and trailers of the common // formats, preventing further resizings to make room for output data. if(m_buffer.size() == 0) m_buffer.resize(32); m_stream->next_in(buf.data() + offset, buf.size() - offset); m_stream->next_out(m_buffer.data() + offset, m_buffer.size() - offset); while(true) { const bool stream_end = m_stream->run(flags); if(stream_end) { BOTAN_ASSERT(m_stream->avail_in() == 0, "After stream is done, no input remains to be processed"); m_buffer.resize(m_buffer.size() - m_stream->avail_out()); break; } else if(m_stream->avail_out() == 0) { const size_t added = 8 + m_buffer.size(); m_buffer.resize(m_buffer.size() + added); m_stream->next_out(m_buffer.data() + m_buffer.size() - added, added); } else if(m_stream->avail_in() == 0) { m_buffer.resize(m_buffer.size() - m_stream->avail_out()); break; } } copy_mem(m_buffer.data(), buf.data(), offset); buf.swap(m_buffer); } void Stream_Compression::update(secure_vector& buf, size_t offset, bool flush) { BOTAN_ASSERT(m_stream, "Initialized"); process(buf, offset, flush ? m_stream->flush_flag() : m_stream->run_flag()); } void Stream_Compression::finish(secure_vector& buf, size_t offset) { BOTAN_ASSERT(m_stream, "Initialized"); process(buf, offset, m_stream->finish_flag()); clear(); } void Stream_Decompression::clear() { m_stream.reset(); } void Stream_Decompression::start() { m_stream.reset(make_stream()); } void Stream_Decompression::process(secure_vector& buf, size_t offset, uint32_t flags) { BOTAN_ASSERT(m_stream, "Initialized"); BOTAN_ASSERT(buf.size() >= offset, "Offset is sane"); if(m_buffer.size() < buf.size() + offset) m_buffer.resize(buf.size() + offset); m_stream->next_in(buf.data() + offset, buf.size() - offset); m_stream->next_out(m_buffer.data() + offset, m_buffer.size() - offset); while(true) { const bool stream_end = m_stream->run(flags); if(stream_end) { if(m_stream->avail_in() == 0) // all data consumed? { m_buffer.resize(m_buffer.size() - m_stream->avail_out()); clear(); break; } // More data follows: try to process as a following stream const size_t read = (buf.size() - offset) - m_stream->avail_in(); start(); m_stream->next_in(buf.data() + offset + read, buf.size() - offset - read); } if(m_stream->avail_out() == 0) { const size_t added = 8 + m_buffer.size(); m_buffer.resize(m_buffer.size() + added); m_stream->next_out(m_buffer.data() + m_buffer.size() - added, added); } else if(m_stream->avail_in() == 0) { m_buffer.resize(m_buffer.size() - m_stream->avail_out()); break; } } copy_mem(m_buffer.data(), buf.data(), offset); buf.swap(m_buffer); } void Stream_Decompression::update(secure_vector& buf, size_t offset) { process(buf, offset, m_stream->run_flag()); } void Stream_Decompression::finish(secure_vector& buf, size_t offset) { if(buf.size() != offset || m_stream.get()) process(buf, offset, m_stream->finish_flag()); if(m_stream.get()) throw Exception(name() + " finished but not at stream end"); } } botan-2.4.0/src/lib/compression/compress_utils.h000066400000000000000000000037721322470703100217520ustar00rootroot00000000000000/* * Compression utility header * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_COMPRESSION_UTILS_H_ #define BOTAN_COMPRESSION_UTILS_H_ #include #include #include namespace Botan { /* * Allocation Size Tracking Helper for Zlib/Bzlib/LZMA */ class Compression_Alloc_Info final { public: template static void* malloc(void* self, T n, T size) { return static_cast(self)->do_malloc(n, size); } static void free(void* self, void* ptr) { static_cast(self)->do_free(ptr); } private: void* do_malloc(size_t n, size_t size); void do_free(void* ptr); std::unordered_map m_current_allocs; }; /** * Wrapper for Zlib/Bzlib/LZMA stream types */ template class Zlib_Style_Stream : public Compression_Stream { public: void next_in(uint8_t* b, size_t len) override { m_stream.next_in = reinterpret_cast(b); m_stream.avail_in = len; } void next_out(uint8_t* b, size_t len) override { m_stream.next_out = reinterpret_cast(b); m_stream.avail_out = len; } size_t avail_in() const override { return m_stream.avail_in; } size_t avail_out() const override { return m_stream.avail_out; } Zlib_Style_Stream() { clear_mem(&m_stream, 1); m_allocs.reset(new Compression_Alloc_Info); } ~Zlib_Style_Stream() { clear_mem(&m_stream, 1); m_allocs.reset(); } protected: typedef Stream stream_t; stream_t* streamp() { return &m_stream; } Compression_Alloc_Info* alloc() { return m_allocs.get(); } private: stream_t m_stream; std::unique_ptr m_allocs; }; } #endif botan-2.4.0/src/lib/compression/compression.cpp000066400000000000000000000053321322470703100215650ustar00rootroot00000000000000/* * Compression Factory * (C) 2014,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_ZLIB) #include #endif #if defined(BOTAN_HAS_BZIP2) #include #endif #if defined(BOTAN_HAS_LZMA) #include #endif namespace Botan { Compression_Algorithm* make_compressor(const std::string& name) { #if defined(BOTAN_HAS_ZLIB) if(name == "Zlib" || name == "zlib") return new Zlib_Compression; if(name == "Gzip" || name == "gzip" || name == "gz") return new Gzip_Compression; if(name == "Deflate" || name == "deflate") return new Deflate_Compression; #endif #if defined(BOTAN_HAS_BZIP2) if(name == "bzip2" || name == "bz2" || name == "Bzip2") return new Bzip2_Compression; #endif #if defined(BOTAN_HAS_LZMA) if(name == "lzma" || name == "xz" || name == "LZMA") return new LZMA_Compression; #endif BOTAN_UNUSED(name); return nullptr; } //static std::unique_ptr Compression_Algorithm::create(const std::string& algo) { std::unique_ptr compressor(make_compressor(algo)); return compressor; } //static std::unique_ptr Compression_Algorithm::create_or_throw(const std::string& algo) { if(auto compressor = Compression_Algorithm::create(algo)) { return compressor; } throw Lookup_Error("Compression", algo, ""); } Decompression_Algorithm* make_decompressor(const std::string& name) { #if defined(BOTAN_HAS_ZLIB) if(name == "Zlib" || name == "zlib") return new Zlib_Decompression; if(name == "Gzip" || name == "gzip" || name == "gz") return new Gzip_Decompression; if(name == "Deflate" || name == "deflate") return new Deflate_Decompression; #endif #if defined(BOTAN_HAS_BZIP2) if(name == "bzip2" || name == "bz2" || name == "Bzip2") return new Bzip2_Decompression; #endif #if defined(BOTAN_HAS_LZMA) if(name == "lzma" || name == "xz" || name == "LZMA") return new LZMA_Decompression; #endif BOTAN_UNUSED(name); return nullptr; } //static std::unique_ptr Decompression_Algorithm::create(const std::string& algo) { std::unique_ptr decompressor(make_decompressor(algo)); return decompressor; } //static std::unique_ptr Decompression_Algorithm::create_or_throw(const std::string& algo) { if(auto decompressor = Decompression_Algorithm::create(algo)) { return decompressor; } throw Lookup_Error("Decompression", algo, ""); } } botan-2.4.0/src/lib/compression/compression.h000066400000000000000000000131601322470703100212300ustar00rootroot00000000000000/* * Compression Transform * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_COMPRESSION_TRANSFORM_H_ #define BOTAN_COMPRESSION_TRANSFORM_H_ #include #include namespace Botan { /* * Interface for a compression algorithm. */ class BOTAN_PUBLIC_API(2,0) Compression_Algorithm { public: /** * Create an instance based on a name, or return null if the * algo combination cannot be found. */ static std::unique_ptr create(const std::string& algo_spec); /** * Create an instance based on a name * @param algo_spec algorithm name * Throws Lookup_Error if not found. */ static std::unique_ptr create_or_throw(const std::string& algo_spec); /** * Begin compressing. Most compression algorithms offer a tunable * time/compression tradeoff parameter generally represented by * an integer in the range of 1 to 9. * * If 0 or a value out of range is provided, a compression algorithm * specific default is used. */ virtual void start(size_t comp_level = 0) = 0; /** * Process some data. * @param buf in/out parameter which will possibly be resized or swapped * @param offset an offset into blocks to begin processing * @param flush if true the compressor will be told to flush state */ virtual void update(secure_vector& buf, size_t offset = 0, bool flush = false) = 0; /** * Finish compressing * * @param final_block in/out parameter * @param offset an offset into final_block to begin processing */ virtual void finish(secure_vector& final_block, size_t offset = 0) = 0; /** * @return name of the compression algorithm */ virtual std::string name() const = 0; /** * Reset the state and abort the current message; start can be * called again to process a new message. */ virtual void clear() = 0; virtual ~Compression_Algorithm() = default; }; /* * Interface for a decompression algorithm. */ class BOTAN_PUBLIC_API(2,0) Decompression_Algorithm { public: /** * Create an instance based on a name, or return null if the * algo combination cannot be found. */ static std::unique_ptr create(const std::string& algo_spec); /** * Create an instance based on a name * @param algo_spec algorithm name * Throws Lookup_Error if not found. */ static std::unique_ptr create_or_throw(const std::string& algo_spec); /** * Begin decompressing. * Decompression does not support levels, as compression does. */ virtual void start() = 0; /** * Process some data. * @param buf in/out parameter which will possibly be resized or swapped * @param offset an offset into blocks to begin processing */ virtual void update(secure_vector& buf, size_t offset = 0) = 0; /** * Finish decompressing * * @param final_block in/out parameter * @param offset an offset into final_block to begin processing */ virtual void finish(secure_vector& final_block, size_t offset = 0) = 0; /** * @return name of the decompression algorithm */ virtual std::string name() const = 0; /** * Reset the state and abort the current message; start can be * called again to process a new message. */ virtual void clear() = 0; virtual ~Decompression_Algorithm() = default; }; BOTAN_PUBLIC_API(2,0) Compression_Algorithm* make_compressor(const std::string& type); BOTAN_PUBLIC_API(2,0) Decompression_Algorithm* make_decompressor(const std::string& type); /** * Adapts a zlib style API */ class Compression_Stream { public: virtual ~Compression_Stream() = default; virtual void next_in(uint8_t* b, size_t len) = 0; virtual void next_out(uint8_t* b, size_t len) = 0; virtual size_t avail_in() const = 0; virtual size_t avail_out() const = 0; virtual uint32_t run_flag() const = 0; virtual uint32_t flush_flag() const = 0; virtual uint32_t finish_flag() const = 0; virtual bool run(uint32_t flags) = 0; }; /** * Used to implement compression using Compression_Stream */ class Stream_Compression : public Compression_Algorithm { public: void update(secure_vector& buf, size_t offset, bool flush) final override; void finish(secure_vector& buf, size_t offset) final override; void clear() final override; private: void start(size_t level) final override; void process(secure_vector& buf, size_t offset, uint32_t flags); virtual Compression_Stream* make_stream(size_t level) const = 0; secure_vector m_buffer; std::unique_ptr m_stream; }; /** * FIXME add doc */ class Stream_Decompression : public Decompression_Algorithm { public: void update(secure_vector& buf, size_t offset) final override; void finish(secure_vector& buf, size_t offset) final override; void clear() final override; private: void start() final override; void process(secure_vector& buf, size_t offset, uint32_t flags); virtual Compression_Stream* make_stream() const = 0; secure_vector m_buffer; std::unique_ptr m_stream; }; } #endif botan-2.4.0/src/lib/compression/info.txt000066400000000000000000000002241322470703100202070ustar00rootroot00000000000000 COMPRESSION -> 20141117 compress_utils.h compression.h botan-2.4.0/src/lib/compression/lzma/000077500000000000000000000000001322470703100174605ustar00rootroot00000000000000botan-2.4.0/src/lib/compression/lzma/info.txt000066400000000000000000000001221322470703100211470ustar00rootroot00000000000000 LZMA -> 20160412 load_on vendor all -> lzma botan-2.4.0/src/lib/compression/lzma/lzma.cpp000066400000000000000000000052131322470703100211300ustar00rootroot00000000000000/* * Lzma Compressor * (C) 2001 Peter J Jones * 2001-2007,2014 Jack Lloyd * 2006 Matt Johnston * 2012 Vojtech Kral * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { class LZMA_Stream : public Zlib_Style_Stream { public: LZMA_Stream() { m_allocator.opaque = alloc(); m_allocator.alloc = Compression_Alloc_Info::malloc; m_allocator.free = Compression_Alloc_Info::free; streamp()->allocator = &m_allocator; } ~LZMA_Stream() { ::lzma_end(streamp()); } bool run(uint32_t flags) override { lzma_ret rc = ::lzma_code(streamp(), static_cast(flags)); if(rc == LZMA_MEM_ERROR) throw Exception("lzma memory allocation failed"); else if (rc != LZMA_OK && rc != LZMA_STREAM_END) throw Exception("Lzma error"); return (rc == LZMA_STREAM_END); } uint32_t run_flag() const override { return LZMA_RUN; } uint32_t flush_flag() const override { return LZMA_FULL_FLUSH; } uint32_t finish_flag() const override { return LZMA_FINISH; } private: ::lzma_allocator m_allocator; }; class LZMA_Compression_Stream final : public LZMA_Stream { public: explicit LZMA_Compression_Stream(size_t level) { if(level == 0) level = 6; // default else if(level > 9) level = 9; // clamp to maximum allowed value lzma_ret rc = ::lzma_easy_encoder(streamp(), level, LZMA_CHECK_CRC64); if(rc == LZMA_MEM_ERROR) throw Exception("lzma memory allocation failed"); else if(rc != LZMA_OK) throw Exception("lzma compress initialization failed"); } }; class LZMA_Decompression_Stream final : public LZMA_Stream { public: LZMA_Decompression_Stream() { lzma_ret rc = ::lzma_stream_decoder(streamp(), UINT64_MAX, LZMA_TELL_UNSUPPORTED_CHECK); if(rc == LZMA_MEM_ERROR) throw Exception("lzma memory allocation failed"); else if(rc != LZMA_OK) throw Exception("Bad setting in lzma_stream_decoder"); } }; } Compression_Stream* LZMA_Compression::make_stream(size_t level) const { return new LZMA_Compression_Stream(level); } Compression_Stream* LZMA_Decompression::make_stream() const { return new LZMA_Decompression_Stream; } } botan-2.4.0/src/lib/compression/lzma/lzma.h000066400000000000000000000015041322470703100205740ustar00rootroot00000000000000/* * Lzma Compressor * (C) 2001 Peter J Jones * 2001-2007 Jack Lloyd * 2012 Vojtech Kral * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_LZMA_H_ #define BOTAN_LZMA_H_ #include namespace Botan { /** * LZMA Compression */ class BOTAN_PUBLIC_API(2,0) LZMA_Compression final : public Stream_Compression { public: std::string name() const override { return "LZMA_Compression"; } private: Compression_Stream* make_stream(size_t level) const override; }; /** * LZMA Deccompression */ class BOTAN_PUBLIC_API(2,0) LZMA_Decompression final : public Stream_Decompression { public: std::string name() const override { return "LZMA_Decompression"; } private: Compression_Stream* make_stream() const override; }; } #endif botan-2.4.0/src/lib/compression/zlib/000077500000000000000000000000001322470703100174555ustar00rootroot00000000000000botan-2.4.0/src/lib/compression/zlib/info.txt000066400000000000000000000001171322470703100211500ustar00rootroot00000000000000 ZLIB -> 20160412 load_on vendor all -> z botan-2.4.0/src/lib/compression/zlib/zlib.cpp000066400000000000000000000114211322470703100211200ustar00rootroot00000000000000/* * Zlib Compressor * (C) 2001 Peter J Jones * 2001-2007,2014 Jack Lloyd * 2006 Matt Johnston * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { class Zlib_Stream : public Zlib_Style_Stream { public: Zlib_Stream() { streamp()->opaque = alloc(); streamp()->zalloc = Compression_Alloc_Info::malloc; streamp()->zfree = Compression_Alloc_Info::free; } uint32_t run_flag() const override { return Z_NO_FLUSH; } uint32_t flush_flag() const override { return Z_SYNC_FLUSH; } uint32_t finish_flag() const override { return Z_FINISH; } int compute_window_bits(int wbits, int wbits_offset) const { if(wbits_offset == -1) return -wbits; else return wbits + wbits_offset; } }; class Zlib_Compression_Stream : public Zlib_Stream { public: Zlib_Compression_Stream(size_t level, int wbits, int wbits_offset = 0) { wbits = compute_window_bits(wbits, wbits_offset); if(level >= 9) level = 9; else if(level == 0) level = 6; int rc = ::deflateInit2(streamp(), level, Z_DEFLATED, wbits, 8, Z_DEFAULT_STRATEGY); if(rc != Z_OK) throw Exception("zlib deflate initialization failed"); } ~Zlib_Compression_Stream() { ::deflateEnd(streamp()); } bool run(uint32_t flags) override { int rc = ::deflate(streamp(), flags); if(rc == Z_MEM_ERROR) throw Exception("zlib memory allocation failure"); else if(rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) throw Exception("zlib deflate error " + std::to_string(rc)); return (rc == Z_STREAM_END); } }; class Zlib_Decompression_Stream : public Zlib_Stream { public: Zlib_Decompression_Stream(int wbits, int wbits_offset = 0) { int rc = ::inflateInit2(streamp(), compute_window_bits(wbits, wbits_offset)); if(rc == Z_MEM_ERROR) throw Exception("zlib memory allocation failure"); else if(rc != Z_OK) throw Exception("zlib inflate initialization failed"); } ~Zlib_Decompression_Stream() { ::inflateEnd(streamp()); } bool run(uint32_t flags) override { int rc = ::inflate(streamp(), flags); if(rc == Z_MEM_ERROR) throw Exception("zlib memory allocation failure"); else if(rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) throw Exception("zlib inflate error " + std::to_string(rc)); return (rc == Z_STREAM_END); } }; class Deflate_Compression_Stream final : public Zlib_Compression_Stream { public: Deflate_Compression_Stream(size_t level, int wbits) : Zlib_Compression_Stream(level, wbits, -1) {} }; class Deflate_Decompression_Stream final : public Zlib_Decompression_Stream { public: explicit Deflate_Decompression_Stream(int wbits) : Zlib_Decompression_Stream(wbits, -1) {} }; class Gzip_Compression_Stream final : public Zlib_Compression_Stream { public: Gzip_Compression_Stream(size_t level, int wbits, uint8_t os_code, uint64_t hdr_time) : Zlib_Compression_Stream(level, wbits, 16) { clear_mem(&m_header, 1); m_header.os = os_code; m_header.time = static_cast(hdr_time); int rc = deflateSetHeader(streamp(), &m_header); if(rc != Z_OK) throw Exception("setting gzip header failed"); } private: ::gz_header m_header; }; class Gzip_Decompression_Stream final : public Zlib_Decompression_Stream { public: explicit Gzip_Decompression_Stream(int wbits) : Zlib_Decompression_Stream(wbits, 16) {} }; } Compression_Stream* Zlib_Compression::make_stream(size_t level) const { return new Zlib_Compression_Stream(level, 15); } Compression_Stream* Zlib_Decompression::make_stream() const { return new Zlib_Decompression_Stream(15); } Compression_Stream* Deflate_Compression::make_stream(size_t level) const { return new Deflate_Compression_Stream(level, 15); } Compression_Stream* Deflate_Decompression::make_stream() const { return new Deflate_Decompression_Stream(15); } Compression_Stream* Gzip_Compression::make_stream(size_t level) const { return new Gzip_Compression_Stream(level, 15, m_os_code, m_hdr_time); } Compression_Stream* Gzip_Decompression::make_stream() const { return new Gzip_Decompression_Stream(15); } } botan-2.4.0/src/lib/compression/zlib/zlib.h000066400000000000000000000041331322470703100205670ustar00rootroot00000000000000/* * Zlib Compressor * (C) 2001 Peter J Jones * 2001-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ZLIB_H_ #define BOTAN_ZLIB_H_ #include namespace Botan { /** * Zlib Compression */ class BOTAN_PUBLIC_API(2,0) Zlib_Compression final : public Stream_Compression { public: std::string name() const override { return "Zlib_Compression"; } private: Compression_Stream* make_stream(size_t level) const override; }; /** * Zlib Decompression */ class BOTAN_PUBLIC_API(2,0) Zlib_Decompression final : public Stream_Decompression { public: std::string name() const override { return "Zlib_Decompression"; } private: Compression_Stream* make_stream() const override; }; /** * Deflate Compression */ class BOTAN_PUBLIC_API(2,0) Deflate_Compression final : public Stream_Compression { public: std::string name() const override { return "Deflate_Compression"; } private: Compression_Stream* make_stream(size_t level) const override; }; /** * Deflate Decompression */ class BOTAN_PUBLIC_API(2,0) Deflate_Decompression final : public Stream_Decompression { public: std::string name() const override { return "Deflate_Decompression"; } private: Compression_Stream* make_stream() const override; }; /** * Gzip Compression */ class BOTAN_PUBLIC_API(2,0) Gzip_Compression final : public Stream_Compression { public: explicit Gzip_Compression(uint8_t os_code = 255, uint64_t hdr_time = 0) : m_hdr_time(hdr_time), m_os_code(os_code) {} std::string name() const override { return "Gzip_Compression"; } private: Compression_Stream* make_stream(size_t level) const override; const uint64_t m_hdr_time; const uint8_t m_os_code; }; /** * Gzip Decompression */ class BOTAN_PUBLIC_API(2,0) Gzip_Decompression final : public Stream_Decompression { public: std::string name() const override { return "Gzip_Decompression"; } private: Compression_Stream* make_stream() const override; }; } #endif botan-2.4.0/src/lib/entropy/000077500000000000000000000000001322470703100156545ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/darwin_secrandom/000077500000000000000000000000001322470703100211735ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/darwin_secrandom/darwin_secrandom.cpp000066400000000000000000000012131322470703100252130ustar00rootroot00000000000000/* * Darwin SecRandomCopyBytes EntropySource * (C) 2015 Daniel Seither (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /** * Gather entropy from SecRandomCopyBytes */ size_t Darwin_SecRandom::poll(RandomNumberGenerator& rng) { secure_vector buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); if(0 == SecRandomCopyBytes(kSecRandomDefault, buf.size(), buf.data())) { rng.add_entropy(buf.data(), buf.size()); return buf.size() * 8; } return 0; } } botan-2.4.0/src/lib/entropy/darwin_secrandom/darwin_secrandom.h000066400000000000000000000011311322470703100246570ustar00rootroot00000000000000/* * Darwin SecRandomCopyBytes EntropySource * (C) 2015 Daniel Seither (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_DARWIN_SECRANDOM_H_ #define BOTAN_ENTROPY_SRC_DARWIN_SECRANDOM_H_ #include namespace Botan { /** * Entropy source using SecRandomCopyBytes from Darwin's Security.framework */ class Darwin_SecRandom final : public Entropy_Source { public: std::string name() const override { return "darwin_secrandom"; } size_t poll(RandomNumberGenerator& rng) override; }; } #endif botan-2.4.0/src/lib/entropy/darwin_secrandom/info.txt000066400000000000000000000003151322470703100226660ustar00rootroot00000000000000 ENTROPY_SRC_DARWIN_SECRANDOM -> 20150925 darwin_secrandom.h darwin ios darwin -> Security ios -> Security botan-2.4.0/src/lib/entropy/dev_random/000077500000000000000000000000001322470703100177725ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/dev_random/dev_random.cpp000066400000000000000000000054761322470703100226300ustar00rootroot00000000000000/* * Reader of /dev/random and company * (C) 1999-2009,2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { /** Device_EntropySource constructor Open a file descriptor to each (available) device in fsnames */ Device_EntropySource::Device_EntropySource(const std::vector& fsnames) { #ifndef O_NONBLOCK #define O_NONBLOCK 0 #endif #ifndef O_NOCTTY #define O_NOCTTY 0 #endif const int flags = O_RDONLY | O_NONBLOCK | O_NOCTTY; m_max_fd = 0; for(auto fsname : fsnames) { int fd = ::open(fsname.c_str(), flags); if(fd < 0) { /* ENOENT or EACCES is normal as some of the named devices may not exist on this system. But any other errno value probably indicates either a bug in the application or file descriptor exhaustion. */ if(errno != ENOENT && errno != EACCES) throw Exception("Opening OS RNG device failed with errno " + std::to_string(errno)); } else { if(fd > FD_SETSIZE) { ::close(fd); throw Exception("Open of OS RNG succeeded but fd is too large for fd_set"); } m_dev_fds.push_back(fd); m_max_fd = std::max(m_max_fd, fd); } } } /** Device_EntropySource destructor: close all open devices */ Device_EntropySource::~Device_EntropySource() { for(int fd : m_dev_fds) { // ignoring return value here, can't throw in destructor anyway ::close(fd); } } /** * Gather entropy from a RNG device */ size_t Device_EntropySource::poll(RandomNumberGenerator& rng) { size_t bits = 0; if(m_dev_fds.size() > 0) { fd_set read_set; FD_ZERO(&read_set); for(int dev_fd : m_dev_fds) { FD_SET(dev_fd, &read_set); } secure_vector io_buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); struct ::timeval timeout; timeout.tv_sec = (BOTAN_SYSTEM_RNG_POLL_TIMEOUT_MS / 1000); timeout.tv_usec = (BOTAN_SYSTEM_RNG_POLL_TIMEOUT_MS % 1000) * 1000; if(::select(m_max_fd + 1, &read_set, nullptr, nullptr, &timeout) > 0) { for(int dev_fd : m_dev_fds) { if(FD_ISSET(dev_fd, &read_set)) { const ssize_t got = ::read(dev_fd, io_buf.data(), io_buf.size()); if(got > 0) { rng.add_entropy(io_buf.data(), static_cast(got)); bits += got * 8; } } } } } return bits; } } botan-2.4.0/src/lib/entropy/dev_random/dev_random.h000066400000000000000000000013611322470703100222620ustar00rootroot00000000000000/* * /dev/random EntropySource * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_DEVICE_H_ #define BOTAN_ENTROPY_SRC_DEVICE_H_ #include #include #include namespace Botan { /** * Entropy source reading from kernel devices like /dev/random */ class Device_EntropySource final : public Entropy_Source { public: std::string name() const override { return "dev_random"; } size_t poll(RandomNumberGenerator& rng) override; explicit Device_EntropySource(const std::vector& fsnames); ~Device_EntropySource(); private: std::vector m_dev_fds; int m_max_fd; }; } #endif botan-2.4.0/src/lib/entropy/dev_random/info.txt000066400000000000000000000003241322470703100214650ustar00rootroot00000000000000 ENTROPY_SRC_DEV_RANDOM -> 20131128 dev_random.h aix android cygwin darwin dragonfly freebsd haiku hpux hurd linux netbsd openbsd qnx solaris botan-2.4.0/src/lib/entropy/entropy_src.h000066400000000000000000000046461322470703100204060ustar00rootroot00000000000000/* * EntropySource * (C) 2008,2009,2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_H_ #define BOTAN_ENTROPY_H_ #include #include #include #include #include #include namespace Botan { class RandomNumberGenerator; /** * Abstract interface to a source of entropy */ class BOTAN_PUBLIC_API(2,0) Entropy_Source { public: /** * Return a new entropy source of a particular type, or null * Each entropy source may require substantial resources (eg, a file handle * or socket instance), so try to share them among multiple RNGs, or just * use the preconfigured global list accessed by Entropy_Sources::global_sources() */ static std::unique_ptr create(const std::string& type); /** * @return name identifying this entropy source */ virtual std::string name() const = 0; /** * Perform an entropy gathering poll * @param rng will be provided with entropy via calls to add_entropy * @return conservative estimate of actual entropy added to rng during poll */ virtual size_t poll(RandomNumberGenerator& rng) = 0; Entropy_Source() = default; Entropy_Source(const Entropy_Source& other) = delete; Entropy_Source(Entropy_Source&& other) = delete; Entropy_Source& operator=(const Entropy_Source& other) = delete; virtual ~Entropy_Source() = default; }; class BOTAN_PUBLIC_API(2,0) Entropy_Sources final { public: static Entropy_Sources& global_sources(); void add_source(std::unique_ptr src); std::vector enabled_sources() const; size_t poll(RandomNumberGenerator& rng, size_t bits, std::chrono::milliseconds timeout); /** * Poll just a single named source. Ordinally only used for testing */ size_t poll_just(RandomNumberGenerator& rng, const std::string& src); Entropy_Sources() = default; explicit Entropy_Sources(const std::vector& sources); Entropy_Sources(const Entropy_Sources& other) = delete; Entropy_Sources(Entropy_Sources&& other) = delete; Entropy_Sources& operator=(const Entropy_Sources& other) = delete; private: std::vector> m_srcs; }; } #endif botan-2.4.0/src/lib/entropy/entropy_srcs.cpp000066400000000000000000000107251322470703100211170ustar00rootroot00000000000000/* * Entropy Source Polling * (C) 2008-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_PROC_WALKER) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_DARWIN_SECRANDOM) #include #endif #if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY) #include #endif namespace Botan { #if defined(BOTAN_HAS_SYSTEM_RNG) namespace { class System_RNG_EntropySource final : public Entropy_Source { public: size_t poll(RandomNumberGenerator& rng) override { const size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS; rng.reseed_from_rng(system_rng(), poll_bits); return poll_bits; } std::string name() const override { return "system_rng"; } }; } #endif std::unique_ptr Entropy_Source::create(const std::string& name) { #if defined(BOTAN_HAS_SYSTEM_RNG) if(name == "system_rng" || name == "win32_cryptoapi") { return std::unique_ptr(new System_RNG_EntropySource); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND) if(name == "rdrand") { return std::unique_ptr(new Intel_Rdrand); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED) if(name == "rdseed") { return std::unique_ptr(new Intel_Rdseed); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_DARWIN_SECRANDOM) if(name == "darwin_secrandom") { return std::unique_ptr(new Darwin_SecRandom); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY) if(name == "getentropy") { return std::unique_ptr(new Getentropy); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM) if(name == "dev_random") { return std::unique_ptr(new Device_EntropySource(BOTAN_SYSTEM_RNG_POLL_DEVICES)); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_PROC_WALKER) if(name == "proc_walk") { const std::string root_dir = BOTAN_ENTROPY_PROC_FS_PATH; if(!root_dir.empty()) return std::unique_ptr(new ProcWalking_EntropySource(root_dir)); } #endif #if defined(BOTAN_HAS_ENTROPY_SRC_WIN32) if(name == "system_stats") { return std::unique_ptr(new Win32_EntropySource); } #endif BOTAN_UNUSED(name); return std::unique_ptr(); } void Entropy_Sources::add_source(std::unique_ptr src) { if(src.get()) { m_srcs.push_back(std::move(src)); } } std::vector Entropy_Sources::enabled_sources() const { std::vector sources; for(size_t i = 0; i != m_srcs.size(); ++i) { sources.push_back(m_srcs[i]->name()); } return sources; } size_t Entropy_Sources::poll(RandomNumberGenerator& rng, size_t poll_bits, std::chrono::milliseconds timeout) { typedef std::chrono::system_clock clock; auto deadline = clock::now() + timeout; size_t bits_collected = 0; for(size_t i = 0; i != m_srcs.size(); ++i) { bits_collected += m_srcs[i]->poll(rng); if (bits_collected >= poll_bits || clock::now() > deadline) break; } return bits_collected; } size_t Entropy_Sources::poll_just(RandomNumberGenerator& rng, const std::string& the_src) { for(size_t i = 0; i != m_srcs.size(); ++i) { if(m_srcs[i]->name() == the_src) { return m_srcs[i]->poll(rng); } } return 0; } Entropy_Sources::Entropy_Sources(const std::vector& sources) { for(auto&& src_name : sources) { add_source(Entropy_Source::create(src_name)); } } Entropy_Sources& Entropy_Sources::global_sources() { static Entropy_Sources global_entropy_sources(BOTAN_ENTROPY_DEFAULT_SOURCES); return global_entropy_sources; } } botan-2.4.0/src/lib/entropy/getentropy/000077500000000000000000000000001322470703100200545ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/getentropy/getentropy.cpp000066400000000000000000000012041322470703100227550ustar00rootroot00000000000000/* * System Call getentropy(2) * (C) 2017 Alexander Bluhm (genua GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /** * Gather 256 bytes entropy from getentropy(2). Note that maximum * buffer size is limited to 256 bytes. On OpenBSD this does neither * block nor fail. */ size_t Getentropy::poll(RandomNumberGenerator& rng) { secure_vector buf(256); if(::getentropy(buf.data(), buf.size()) == 0) { rng.add_entropy(buf.data(), buf.size()); return buf.size() * 8; } return 0; } } botan-2.4.0/src/lib/entropy/getentropy/getentropy.h000066400000000000000000000011671322470703100224320ustar00rootroot00000000000000/* * Entropy Source Using OpenBSD getentropy(2) system call * (C) 2017 Alexander Bluhm (genua GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_GETENTROPY_H_ #define BOTAN_ENTROPY_SRC_GETENTROPY_H_ #include namespace Botan { /** * Entropy source using the getentropy(2) sustem call first introduced in * OpenBSD 5.6 and added to Solaris 11.3. */ class Getentropy final : public Entropy_Source { public: std::string name() const override { return "getentropy"; } size_t poll(RandomNumberGenerator& rng) override; }; } #endif botan-2.4.0/src/lib/entropy/getentropy/info.txt000066400000000000000000000001771322470703100215550ustar00rootroot00000000000000 ENTROPY_SRC_GETENTROPY -> 20170327 getentropy.h openbsd botan-2.4.0/src/lib/entropy/info.txt000066400000000000000000000001141322470703100173440ustar00rootroot00000000000000 ENTROPY_SOURCE -> 20151120 rng botan-2.4.0/src/lib/entropy/proc_walk/000077500000000000000000000000001322470703100176355ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/proc_walk/info.txt000066400000000000000000000002761322470703100213360ustar00rootroot00000000000000 ENTROPY_SRC_PROC_WALKER -> 20131128 proc_walk.h android aix cygwin darwin dragonfly hpux hurd linux netbsd qnx solaris botan-2.4.0/src/lib/entropy/proc_walk/proc_walk.cpp000066400000000000000000000067471322470703100223400ustar00rootroot00000000000000/* * Entropy source based on reading files in /proc on the assumption * that a remote attacker will have difficulty guessing some of them. * * (C) 1999-2008,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 199309 #endif #include #include #include #include #include namespace Botan { namespace { class Directory_Walker final : public File_Descriptor_Source { public: explicit Directory_Walker(const std::string& root) : m_cur_dir(std::make_pair(nullptr, "")) { if(DIR* root_dir = ::opendir(root.c_str())) m_cur_dir = std::make_pair(root_dir, root); } ~Directory_Walker() { if(m_cur_dir.first) ::closedir(m_cur_dir.first); } int next_fd() override; private: std::pair get_next_dirent(); std::pair m_cur_dir; std::deque m_dirlist; }; std::pair Directory_Walker::get_next_dirent() { while(m_cur_dir.first) { if(struct dirent* dir = ::readdir(m_cur_dir.first)) return std::make_pair(dir, m_cur_dir.second); ::closedir(m_cur_dir.first); m_cur_dir = std::make_pair(nullptr, ""); while(!m_dirlist.empty() && !m_cur_dir.first) { const std::string next_dir_name = m_dirlist[0]; m_dirlist.pop_front(); if(DIR* next_dir = ::opendir(next_dir_name.c_str())) m_cur_dir = std::make_pair(next_dir, next_dir_name); } } return std::make_pair(nullptr, ""); // nothing left } int Directory_Walker::next_fd() { while(true) { std::pair entry = get_next_dirent(); if(!entry.first) break; // no more dirs const std::string filename = entry.first->d_name; if(filename == "." || filename == "..") continue; const std::string full_path = entry.second + "/" + filename; struct stat stat_buf; if(::lstat(full_path.c_str(), &stat_buf) == -1) continue; if(S_ISDIR(stat_buf.st_mode)) { m_dirlist.push_back(full_path); } else if(S_ISREG(stat_buf.st_mode) && (stat_buf.st_mode & S_IROTH)) { int fd = ::open(full_path.c_str(), O_RDONLY | O_NOCTTY); if(fd >= 0) return fd; } } return -1; } } size_t ProcWalking_EntropySource::poll(RandomNumberGenerator& rng) { const size_t MAX_FILES_READ_PER_POLL = 2048; lock_guard_type lock(m_mutex); if(!m_dir) m_dir.reset(new Directory_Walker(m_path)); m_buf.resize(4096); size_t bits = 0; for(size_t i = 0; i != MAX_FILES_READ_PER_POLL; ++i) { int fd = m_dir->next_fd(); // If we've exhaused this walk of the directory, halt the poll if(fd == -1) { m_dir.reset(); break; } ssize_t got = ::read(fd, m_buf.data(), m_buf.size()); ::close(fd); if(got > 0) { rng.add_entropy(m_buf.data(), static_cast(got)); // Conservative estimate of 4 bits per file bits += 4; } if(bits > 128) break; } return bits; } } botan-2.4.0/src/lib/entropy/proc_walk/proc_walk.h000066400000000000000000000017101322470703100217660ustar00rootroot00000000000000/* * File Tree Walking EntropySource * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_PROC_WALK_H_ #define BOTAN_ENTROPY_SRC_PROC_WALK_H_ #include #include namespace Botan { class File_Descriptor_Source { public: virtual int next_fd() = 0; virtual ~File_Descriptor_Source() = default; }; /** * File Tree Walking Entropy Source */ class ProcWalking_EntropySource final : public Entropy_Source { public: std::string name() const override { return "proc_walk"; } size_t poll(RandomNumberGenerator& rng) override; explicit ProcWalking_EntropySource(const std::string& root_dir) : m_path(root_dir), m_dir(nullptr) {} private: const std::string m_path; mutex_type m_mutex; std::unique_ptr m_dir; secure_vector m_buf; }; } #endif botan-2.4.0/src/lib/entropy/rdrand/000077500000000000000000000000001322470703100171265ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/rdrand/info.txt000066400000000000000000000002061322470703100206200ustar00rootroot00000000000000 ENTROPY_SRC_RDRAND -> 20131128 rdrand_rng rdrand.h botan-2.4.0/src/lib/entropy/rdrand/rdrand.cpp000066400000000000000000000012531322470703100211050ustar00rootroot00000000000000/* * Entropy Source Using Intel's rdrand instruction * (C) 2012,2015 Jack Lloyd * (C) 2015 Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { size_t Intel_Rdrand::poll(RandomNumberGenerator& rng) { if(CPUID::has_rdrand() && BOTAN_ENTROPY_INTEL_RNG_POLLS > 0) { RDRAND_RNG rdrand_rng; secure_vector buf(4 * BOTAN_ENTROPY_INTEL_RNG_POLLS); rdrand_rng.randomize(buf.data(), buf.size()); rng.add_entropy(buf.data(), buf.size()); } // RDRAND is used but not trusted return 0; } } botan-2.4.0/src/lib/entropy/rdrand/rdrand.h000066400000000000000000000011071322470703100205500ustar00rootroot00000000000000/* * Entropy Source Using Intel's rdrand instruction * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_RDRAND_H_ #define BOTAN_ENTROPY_SRC_RDRAND_H_ #include namespace Botan { /** * Entropy source using the rdrand instruction first introduced on * Intel's Ivy Bridge architecture. */ class Intel_Rdrand final : public Entropy_Source { public: std::string name() const override { return "rdrand"; } size_t poll(RandomNumberGenerator& rng) override; }; } #endif botan-2.4.0/src/lib/entropy/rdseed/000077500000000000000000000000001322470703100171225ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/rdseed/info.txt000066400000000000000000000002231322470703100206130ustar00rootroot00000000000000 ENTROPY_SRC_RDSEED -> 20151218 need_isa rdseed rdseed.h gcc clang icc msvc botan-2.4.0/src/lib/entropy/rdseed/rdseed.cpp000066400000000000000000000020531322470703100210740ustar00rootroot00000000000000/* * Entropy Source Using Intel's rdseed instruction * (C) 2015 Jack Lloyd, Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if !defined(BOTAN_USE_GCC_INLINE_ASM) #include #endif namespace Botan { BOTAN_FUNC_ISA("rdseed") size_t Intel_Rdseed::poll(RandomNumberGenerator& rng) { if(CPUID::has_rdseed()) { for(size_t p = 0; p != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++p) { for(size_t i = 0; i != BOTAN_ENTROPY_RDSEED_RETRIES; ++i) { uint32_t r = 0; #if defined(BOTAN_USE_GCC_INLINE_ASM) int cf = 0; // Encoding of rdseed %eax asm(".byte 0x0F, 0xC7, 0xF8; adcl $0,%1" : "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc"); #else int cf = _rdseed32_step(&r); #endif if(1 == cf) { rng.add_entropy_T(r); break; } } } } return 0; } } botan-2.4.0/src/lib/entropy/rdseed/rdseed.h000066400000000000000000000011231322470703100205360ustar00rootroot00000000000000/* * Entropy Source Using Intel's rdseed instruction * (C) 2015 Jack Lloyd, Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_RDSEED_H_ #define BOTAN_ENTROPY_SRC_RDSEED_H_ #include namespace Botan { /** * Entropy source using the rdseed instruction first introduced on * Intel's Broadwell architecture. */ class Intel_Rdseed final : public Entropy_Source { public: std::string name() const override { return "rdseed"; } size_t poll(RandomNumberGenerator& rng) override; }; } #endif botan-2.4.0/src/lib/entropy/win32_stats/000077500000000000000000000000001322470703100200345ustar00rootroot00000000000000botan-2.4.0/src/lib/entropy/win32_stats/es_win32.cpp000066400000000000000000000071341322470703100221760ustar00rootroot00000000000000/* * Win32 EntropySource * (C) 1999-2009,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #define NOMINMAX 1 #define _WINSOCKAPI_ // stop windows.h including winsock.h #include #include namespace Botan { /** * Win32 poll using stats functions including Tooltip32 */ size_t Win32_EntropySource::poll(RandomNumberGenerator& rng) { const size_t POLL_TARGET = 128; const size_t EST_ENTROPY_HEAP_INFO = 4; const size_t EST_ENTROPY_THREAD_INFO = 2; /* First query a bunch of basic statistical stuff */ rng.add_entropy_T(::GetTickCount()); rng.add_entropy_T(::GetMessagePos()); rng.add_entropy_T(::GetMessageTime()); rng.add_entropy_T(::GetInputState()); rng.add_entropy_T(::GetCurrentProcessId()); rng.add_entropy_T(::GetCurrentThreadId()); SYSTEM_INFO sys_info; ::GetSystemInfo(&sys_info); rng.add_entropy_T(sys_info); MEMORYSTATUSEX mem_info; ::GlobalMemoryStatusEx(&mem_info); rng.add_entropy_T(mem_info); POINT point; ::GetCursorPos(&point); rng.add_entropy_T(point); ::GetCaretPos(&point); rng.add_entropy_T(point); /* Now use the Tooltip library to iterate through various objects on the system, including processes, threads, and heap objects. */ HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); size_t collected = 0; #define TOOLHELP32_ITER(DATA_TYPE, FUNC_FIRST, FUNC_NEXT) \ if(collected < POLL_TARGET) \ { \ DATA_TYPE info; \ info.dwSize = sizeof(DATA_TYPE); \ if(FUNC_FIRST(snapshot, &info)) \ { \ do \ { \ rng.add_entropy_T(info); \ collected += EST_ENTROPY_THREAD_INFO; \ if(collected >= POLL_TARGET) \ break; \ } while(FUNC_NEXT(snapshot, &info)); \ } \ } TOOLHELP32_ITER(MODULEENTRY32, ::Module32First, ::Module32Next); TOOLHELP32_ITER(PROCESSENTRY32, ::Process32First, ::Process32Next); TOOLHELP32_ITER(THREADENTRY32, ::Thread32First, ::Thread32Next); #undef TOOLHELP32_ITER if(collected < POLL_TARGET) { HEAPLIST32 heap_list; heap_list.dwSize = sizeof(HEAPLIST32); if(::Heap32ListFirst(snapshot, &heap_list)) { do { rng.add_entropy_T(heap_list); HEAPENTRY32 heap_entry; heap_entry.dwSize = sizeof(HEAPENTRY32); if(::Heap32First(&heap_entry, heap_list.th32ProcessID, heap_list.th32HeapID)) { do { rng.add_entropy_T(heap_entry); collected += EST_ENTROPY_HEAP_INFO; if(collected >= POLL_TARGET) break; } while(::Heap32Next(&heap_entry)); } if(collected >= POLL_TARGET) break; } while(::Heap32ListNext(snapshot, &heap_list)); } } ::CloseHandle(snapshot); return collected; } } botan-2.4.0/src/lib/entropy/win32_stats/es_win32.h000066400000000000000000000007551322470703100216450ustar00rootroot00000000000000/* * Win32 EntropySource * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENTROPY_SRC_WIN32_H_ #define BOTAN_ENTROPY_SRC_WIN32_H_ #include namespace Botan { /** * Win32 Entropy Source */ class Win32_EntropySource final : public Entropy_Source { public: std::string name() const override { return "system_stats"; } size_t poll(RandomNumberGenerator& rng) override; }; } #endif botan-2.4.0/src/lib/entropy/win32_stats/info.txt000066400000000000000000000002531322470703100215300ustar00rootroot00000000000000 ENTROPY_SRC_WIN32 -> 20131128 es_win32.h windows cygwin mingw windows -> user32.lib botan-2.4.0/src/lib/ffi/000077500000000000000000000000001322470703100147205ustar00rootroot00000000000000botan-2.4.0/src/lib/ffi/ffi.cpp000066400000000000000000000062431322470703100161750ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan_FFI { int ffi_error_exception_thrown(const char* func_name, const char* exn) { fprintf(stderr, "in %s exception %s\n", func_name, exn); return BOTAN_FFI_ERROR_EXCEPTION_THROWN; } } extern "C" { using namespace Botan_FFI; /* * Versioning */ uint32_t botan_ffi_api_version() { return BOTAN_HAS_FFI; } int botan_ffi_supports_api(uint32_t api_version) { // Current API version if(api_version == BOTAN_HAS_FFI) return BOTAN_FFI_SUCCESS; // Older versions that are still supported // This is the 2.1/2.2 API if(api_version == 20170327) return BOTAN_FFI_SUCCESS; // This is the 2.0 API if(api_version == 20150515) return BOTAN_FFI_SUCCESS; return -1; } const char* botan_version_string() { return Botan::version_cstr(); } uint32_t botan_version_major() { return Botan::version_major(); } uint32_t botan_version_minor() { return Botan::version_minor(); } uint32_t botan_version_patch() { return Botan::version_patch(); } uint32_t botan_version_datestamp() { return Botan::version_datestamp(); } int botan_constant_time_compare(const uint8_t* x, const uint8_t* y, size_t len) { return Botan::constant_time_compare(x, y, len) ? 0 : -1; } int botan_same_mem(const uint8_t* x, const uint8_t* y, size_t len) { return botan_constant_time_compare(x, y, len); } int botan_scrub_mem(void* mem, size_t bytes) { Botan::secure_scrub_memory(mem, bytes); return BOTAN_FFI_SUCCESS; } int botan_hex_encode(const uint8_t* in, size_t len, char* out, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const bool uppercase = (flags & BOTAN_FFI_HEX_LOWER_CASE) == 0; Botan::hex_encode(out, in, len, uppercase); return BOTAN_FFI_SUCCESS; }); } int botan_hex_decode(const char* hex_str, size_t in_len, uint8_t* out, size_t* out_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const std::vector bin = Botan::hex_decode(hex_str, in_len); return Botan_FFI::write_vec_output(out, out_len, bin); }); } int botan_base64_encode(const uint8_t* in, size_t len, char* out, size_t* out_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const std::string base64 = Botan::base64_encode(in, len); return Botan_FFI::write_str_output(out, out_len, base64); }); } int botan_base64_decode(const char* base64_str, size_t in_len, uint8_t* out, size_t* out_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(*out_len < Botan::base64_decode_max_output(in_len)) { *out_len = Botan::base64_decode_max_output(in_len); return BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE; } *out_len = Botan::base64_decode(out, std::string(base64_str, in_len)); return BOTAN_FFI_SUCCESS; }); } } botan-2.4.0/src/lib/ffi/ffi.h000066400000000000000000001346571322470703100156550ustar00rootroot00000000000000/* * FFI (C89 API) * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FFI_H_ #define BOTAN_FFI_H_ #ifdef __cplusplus extern "C" { #endif /* This header exports some of botan's functionality via a C89 interface. This API is uesd by the Python and OCaml bindings via those languages respective ctypes libraries. The API is intended to be as easy as possible to call from other languages, which often have easy ways to call C, because C. But some C code is easier to deal with than others, so to make things easy this API follows a few simple rules: - All interactions are via pointers to opaque structs. No need to worry about structure padding issues and the like. - All functions return an int error code (except the version calls, which are assumed to always have something to say). - Use simple types: size_t for lengths, const char* NULL terminated strings, uint8_t for binary. - No ownership of memory transfers across the API boundary. The API will consume data from const pointers, and will produce output by writing to variables provided by the caller. - If exporting a value (a string or a blob) the function takes a pointer to the output array and a read/write pointer to the length. If the length is insufficient, an error is returned. So passing nullptr/0 allows querying the final value. Note this does not apply to all functions, like `botan_hash_final` which is not idempotent and are documented specially. But it's a general theory of operation. The API is not currently documented, nor should it be considered stable. It is buggy as heck, most likely, and error handling is a mess. However the goal is to provide a long term API usable for language bindings, or for use by systems written in C. Suggestions on how to provide the cleanest API for such users would be most welcome. * TODO: * - Better error reporting * - User callback for exception logging? * - Doxygen comments for all functions/params * - X.509 certs and PKIX path validation goo * - TLS */ #include #include #include /** * Return the version of the currently supported FFI API. This is * expressed in the form YYYYMMDD of the release date of this version * of the API. */ BOTAN_PUBLIC_API(2,0) uint32_t botan_ffi_api_version(); /** * Return 0 (ok) if the version given is one this library supports. * botan_ffi_supports_api(botan_ffi_api_version()) will always return 0. */ BOTAN_PUBLIC_API(2,0) int botan_ffi_supports_api(uint32_t api_version); /** * Return a free-form version string, e.g., 2.0.0 */ BOTAN_PUBLIC_API(2,0) const char* botan_version_string(); /** * Return the major version of the library */ BOTAN_PUBLIC_API(2,0) uint32_t botan_version_major(); /** * Return the minor version of the library */ BOTAN_PUBLIC_API(2,0) uint32_t botan_version_minor(); /** * Return the patch version of the library */ BOTAN_PUBLIC_API(2,0) uint32_t botan_version_patch(); /** * Return the date this version was released as * an integer, or 0 if an unreleased version */ BOTAN_PUBLIC_API(2,0) uint32_t botan_version_datestamp(); /* * Error handling * * Some way of exporting these values to other languages would be useful THIS FUNCTION ASSUMES BOTH ARGUMENTS ARE LITERAL STRINGS so it retains only the pointers and does not make a copy. int botan_make_error(const char* msg, const char* func, int line); * This value is returned to callers ^^ normally called like return botan_make_error(BOTAN_ERROR_STRING_NOT_IMPLEMENTED, BOTAN_FUNCTION, __LINE__); // This would seem to require both saving the message permanently catch(std::exception& e) { return botan_make_error_from_transient_string(e.what(), BOTAN_FUNCTION, __LINE__); } #define botan_make_error_inf(s) return botan_make_error(s, BOTAN_FUNCTION, __LINE__); Easier to return a const char* from each function directly? However, catch(std::exception& e) { return e.what(); } doesn't exactly work well either! * * Later call: * const char* botan_get_error_str(int); * To recover the msg, func, and line */ #define BOTAN_FFI_SUCCESS (0) #define BOTAN_FFI_INVALID_VERIFIER (1) #define BOTAN_FFI_ERROR_INVALID_INPUT (-1) #define BOTAN_FFI_ERROR_BAD_MAC (-2) #define BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE (-10) #define BOTAN_FFI_ERROR_EXCEPTION_THROWN (-20) #define BOTAN_FFI_ERROR_BAD_FLAG (-30) #define BOTAN_FFI_ERROR_NULL_POINTER (-31) #define BOTAN_FFI_ERROR_BAD_PARAMETER (-32) #define BOTAN_FFI_ERROR_NOT_IMPLEMENTED (-40) #define BOTAN_FFI_ERROR_INVALID_OBJECT (-50) #define BOTAN_FFI_ERROR_UNKNOWN_ERROR (-100) //const char* botan_error_description(int err); /** * Returns 0 if x[0..len] == y[0..len], or otherwise -1 */ BOTAN_PUBLIC_API(2,3) int botan_constant_time_compare(const uint8_t* x, const uint8_t* y, size_t len); /** * Deprecated equivalent to botan_constant_time_compare */ BOTAN_PUBLIC_API(2,0) int botan_same_mem(const uint8_t* x, const uint8_t* y, size_t len); /** * Clear out memory using a system specific approach to bypass elision by the * compiler (currently using RtlSecureZeroMemory or tricks with volatile pointers). */ BOTAN_PUBLIC_API(2,2) int botan_scrub_mem(void* mem, size_t bytes); #define BOTAN_FFI_HEX_LOWER_CASE 1 /** * Perform hex encoding * @param x is some binary data * @param len length of x in bytes * @param out an array of at least x*2 bytes * @param flags flags out be upper or lower case? * @return 0 on success, 1 on failure */ BOTAN_PUBLIC_API(2,0) int botan_hex_encode(const uint8_t* x, size_t len, char* out, uint32_t flags); /** * Perform hex decoding * @param hex_str a string of hex chars (whitespace is ignored) * @param in_len the length of hex_str * @param out the output buffer should be at least strlen(hex_str)/2 bytes * @param out_len the size of out */ BOTAN_PUBLIC_API(2,3) int botan_hex_decode(const char* hex_str, size_t in_len, uint8_t* out, size_t* out_len); /** * Perform base64 encoding */ BOTAN_PUBLIC_API(2,3) int botan_base64_encode(const uint8_t* x, size_t len, char* out, size_t* out_len); /** * Perform base64 decoding */ BOTAN_PUBLIC_API(2,3) int botan_base64_decode(const char* base64_str, size_t in_len, uint8_t* out, size_t* out_len); /** * RNG type */ typedef struct botan_rng_struct* botan_rng_t; /** * Initialize a random number generator object * @param rng rng object * @param rng_type type of the rng, possible values: * "system": System_RNG, "user": AutoSeeded_RNG * Set rng_type to null or empty string to let the library choose * * TODO: replace rng_type with simple flags? */ BOTAN_PUBLIC_API(2,0) int botan_rng_init(botan_rng_t* rng, const char* rng_type); /** * Get random bytes from a random number generator * @param rng rng object * @param out output buffer of size out_len * @param out_len number of requested bytes * @return 0 on success, negative on failure * * TODO: better name */ BOTAN_PUBLIC_API(2,0) int botan_rng_get(botan_rng_t rng, uint8_t* out, size_t out_len); /** * Reseed a random number generator * Uses the System_RNG as a seed generator. * * @param rng rng object * @param bits number of bits to to reseed with * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_rng_reseed(botan_rng_t rng, size_t bits); /** * Frees all resources of the random number generator object * @param rng rng object * @return always returns 0 */ BOTAN_PUBLIC_API(2,0) int botan_rng_destroy(botan_rng_t rng); /* * Hash type */ typedef struct botan_hash_struct* botan_hash_t; /** * Initialize a hash function object * @param hash hash object * @param hash_name name of the hash function, e.g., "SHA-384" * @param flags should be 0 in current API revision, all other uses are reserved * and return BOTAN_FFI_ERROR_BAD_FLAG * * TODO: since output_length is effectively required to use this API, * return it from init as an output parameter */ BOTAN_PUBLIC_API(2,0) int botan_hash_init(botan_hash_t* hash, const char* hash_name, uint32_t flags); /** * Copy the state of a hash function object * @param dest destination hash object * @param source source hash object * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,2) int botan_hash_copy_state(botan_hash_t *dest, const botan_hash_t source); /** * Writes the output length of the hash function to *output_length * @param hash hash object * @param output_length output buffer to hold the hash function output length * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_hash_output_length(botan_hash_t hash, size_t* output_length); /** * Writes the block size of the hash function to *block_size * @param hash hash object * @param block_size output buffer to hold the hash function output length * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,2) int botan_hash_block_size(botan_hash_t hash, size_t* block_size); /** * Send more input to the hash function * @param hash hash object * @param in input buffer * @param in_len number of bytes to read from the input buffer * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_hash_update(botan_hash_t hash, const uint8_t* in, size_t in_len); /** * Finalizes the hash computation and writes the output to * out[0:botan_hash_output_length()] then reinitializes for computing * another digest as if botan_hash_clear had been called. * @param hash hash object * @param out output buffer * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_hash_final(botan_hash_t hash, uint8_t out[]); /** * Reinitializes the state of the hash computation. A hash can * be computed (with update/final) immediately. * @param hash hash object * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_hash_clear(botan_hash_t hash); /** * Frees all resources of the hash object * @param hash hash object * @return always returns 0 */ BOTAN_PUBLIC_API(2,0) int botan_hash_destroy(botan_hash_t hash); /** * TODO has no implementation */ BOTAN_PUBLIC_API(2,0) int botan_hash_name(botan_hash_t hash, char* name, size_t name_len); /* * Message Authentication type */ typedef struct botan_mac_struct* botan_mac_t; /** * Initialize a message authentication code object * @param mac mac object * @param mac_name name of the hash function, e.g., "HMAC(SHA-384)" * @param flags should be 0 in current API revision, all other uses are reserved * and return a negative value (error code) * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_mac_init(botan_mac_t* mac, const char* mac_name, uint32_t flags); /** * Writes the output length of the message authentication code to *output_length * @param mac mac object * @param output_length output buffer to hold the MAC output length * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_mac_output_length(botan_mac_t mac, size_t* output_length); /** * Sets the key on the MAC * @param mac mac object * @param key buffer holding the key * @param key_len size of the key buffer in bytes * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_mac_set_key(botan_mac_t mac, const uint8_t* key, size_t key_len); /** * Send more input to the message authentication code * @param mac mac object * @param buf input buffer * @param len number of bytes to read from the input buffer * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_mac_update(botan_mac_t mac, const uint8_t* buf, size_t len); /** * Finalizes the MAC computation and writes the output to * out[0:botan_mac_output_length()] then reinitializes for computing * another MAC as if botan_mac_clear had been called. * @param mac mac object * @param out output buffer * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_mac_final(botan_mac_t mac, uint8_t out[]); /** * Reinitializes the state of the MAC computation. A MAC can * be computed (with update/final) immediately. * @param mac mac object * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_mac_clear(botan_mac_t mac); /** * Frees all resources of the MAC object * @param mac mac object * @return always returns 0 */ BOTAN_PUBLIC_API(2,0) int botan_mac_destroy(botan_mac_t mac); /* * Cipher modes */ typedef struct botan_cipher_struct* botan_cipher_t; #define BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION 1 #define BOTAN_CIPHER_INIT_FLAG_ENCRYPT 0 #define BOTAN_CIPHER_INIT_FLAG_DECRYPT 1 BOTAN_PUBLIC_API(2,0) int botan_cipher_init(botan_cipher_t* cipher, const char* name, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_cipher_valid_nonce_length(botan_cipher_t cipher, size_t nl); BOTAN_PUBLIC_API(2,0) int botan_cipher_get_tag_length(botan_cipher_t cipher, size_t* tag_size); BOTAN_PUBLIC_API(2,0) int botan_cipher_get_default_nonce_length(botan_cipher_t cipher, size_t* nl); BOTAN_PUBLIC_API(2,0) int botan_cipher_get_update_granularity(botan_cipher_t cipher, size_t* ug); BOTAN_PUBLIC_API(2,0) int botan_cipher_query_keylen(botan_cipher_t, size_t* out_minimum_keylength, size_t* out_maximum_keylength); BOTAN_PUBLIC_API(2,0) int botan_cipher_set_key(botan_cipher_t cipher, const uint8_t* key, size_t key_len); BOTAN_PUBLIC_API(2,0) int botan_cipher_set_associated_data(botan_cipher_t cipher, const uint8_t* ad, size_t ad_len); BOTAN_PUBLIC_API(2,0) int botan_cipher_start(botan_cipher_t cipher, const uint8_t* nonce, size_t nonce_len); #define BOTAN_CIPHER_UPDATE_FLAG_FINAL (1U << 0) BOTAN_PUBLIC_API(2,0) int botan_cipher_update(botan_cipher_t cipher, uint32_t flags, uint8_t output[], size_t output_size, size_t* output_written, const uint8_t input_bytes[], size_t input_size, size_t* input_consumed); BOTAN_PUBLIC_API(2,0) int botan_cipher_clear(botan_cipher_t hash); BOTAN_PUBLIC_API(2,0) int botan_cipher_destroy(botan_cipher_t cipher); /* * Derive a key from a passphrase for a number of iterations * @param pbkdf_algo PBKDF algorithm, e.g., "PBKDF2" * @param out buffer to store the derived key, must be of out_len bytes * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param iterations the number of iterations to use (use 10K or more) * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_pbkdf(const char* pbkdf_algo, uint8_t out[], size_t out_len, const char* passphrase, const uint8_t salt[], size_t salt_len, size_t iterations); /** * Derive a key from a passphrase, running until msec time has elapsed. * @param pbkdf_algo PBKDF algorithm, e.g., "PBKDF2" * @param out buffer to store the derived key, must be of out_len bytes * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param milliseconds_to_run if iterations is zero, then instead the PBKDF is * run until milliseconds_to_run milliseconds has passed * @param out_iterations_used set to the number iterations executed * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_pbkdf_timed(const char* pbkdf_algo, uint8_t out[], size_t out_len, const char* passphrase, const uint8_t salt[], size_t salt_len, size_t milliseconds_to_run, size_t* out_iterations_used); /** * Derive a key * @param kdf_algo KDF algorithm, e.g., "SP800-56C" * @param out buffer holding the derived key, must be of length out_len * @param out_len the desired output length in bytes * @param secret the secret input * @param secret_len size of secret in bytes * @param salt a diversifier * @param salt_len size of salt in bytes * @param label purpose for the derived keying material * @param label_len size of label in bytes * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_kdf(const char* kdf_algo, uint8_t out[], size_t out_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len); /** * Create a password hash using Bcrypt * @param out buffer holding the password hash, should be of length 64 bytes * @param out_len the desired output length in bytes * @param password the password * @param rng a random number generator * @param work_factor how much work to do to slow down guessing attacks * @param flags should be 0 in current API revision, all other uses are reserved * and return BOTAN_FFI_ERROR_BAD_FLAG * @return 0 on success, a negative value on failure * Output is formatted bcrypt $2a$... */ BOTAN_PUBLIC_API(2,0) int botan_bcrypt_generate(uint8_t* out, size_t* out_len, const char* password, botan_rng_t rng, size_t work_factor, uint32_t flags); /* * Raw Block Cipher (PRP) interface */ typedef struct botan_block_cipher_struct* botan_block_cipher_t; /** * Initialize a block cipher object */ BOTAN_PUBLIC_API(2,1) int botan_block_cipher_init(botan_block_cipher_t* bc, const char* cipher_name); /** * Destroy a block cipher object */ BOTAN_PUBLIC_API(2,1) int botan_block_cipher_destroy(botan_block_cipher_t bc); /** * Reinitializes the block cipher * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,1) int botan_block_cipher_clear(botan_block_cipher_t bc); /** * Set the key for a block cipher instance */ BOTAN_PUBLIC_API(2,1) int botan_block_cipher_set_key(botan_block_cipher_t bc, const uint8_t key[], size_t len); /** * Return the positive block size of this block cipher, or negative to * indicate an error */ BOTAN_PUBLIC_API(2,1) int botan_block_cipher_block_size(botan_block_cipher_t bc); BOTAN_PUBLIC_API(2,1) int botan_block_cipher_encrypt_blocks(botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks); BOTAN_PUBLIC_API(2,1) int botan_block_cipher_decrypt_blocks(botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks); /* * Multiple precision integers */ typedef struct botan_mp_struct* botan_mp_t; BOTAN_PUBLIC_API(2,1) int botan_mp_init(botan_mp_t* mp); BOTAN_PUBLIC_API(2,1) int botan_mp_destroy(botan_mp_t mp); // writes botan_mp_num_bytes(mp)*2 + 1 bytes to out[] BOTAN_PUBLIC_API(2,1) int botan_mp_to_hex(const botan_mp_t mp, char* out); BOTAN_PUBLIC_API(2,1) int botan_mp_to_str(const botan_mp_t mp, uint8_t base, char* out, size_t* out_len); BOTAN_PUBLIC_API(2,1) int botan_mp_clear(botan_mp_t mp); BOTAN_PUBLIC_API(2,1) int botan_mp_set_from_int(botan_mp_t mp, int initial_value); BOTAN_PUBLIC_API(2,1) int botan_mp_set_from_mp(botan_mp_t dest, const botan_mp_t source); BOTAN_PUBLIC_API(2,1) int botan_mp_set_from_str(botan_mp_t dest, const char* str); BOTAN_PUBLIC_API(2,1) int botan_mp_set_from_radix_str(botan_mp_t dest, const char* str, size_t radix); BOTAN_PUBLIC_API(2,1) int botan_mp_num_bits(const botan_mp_t n, size_t* bits); BOTAN_PUBLIC_API(2,1) int botan_mp_num_bytes(const botan_mp_t n, size_t* bytes); // Writes botan_mp_num_bytes(mp) to vec BOTAN_PUBLIC_API(2,1) int botan_mp_to_bin(const botan_mp_t mp, uint8_t vec[]); BOTAN_PUBLIC_API(2,1) int botan_mp_from_bin(const botan_mp_t mp, const uint8_t vec[], size_t vec_len); BOTAN_PUBLIC_API(2,1) int botan_mp_to_uint32(const botan_mp_t mp, uint32_t* val); /** * This function is not well named. Returns 1 iff mp is greater than * *or equal to* zero. Use botan_mp_is_negative to detect negative * numbers, botan_mp_is_zero to check for zero. */ BOTAN_PUBLIC_API(2,1) int botan_mp_is_positive(const botan_mp_t mp); /** * Return 1 iff mp is less than 0 */ BOTAN_PUBLIC_API(2,1) int botan_mp_is_negative(const botan_mp_t mp); BOTAN_PUBLIC_API(2,1) int botan_mp_flip_sign(botan_mp_t mp); //BOTAN_PUBLIC_API(2,1) int botan_mp_set_negative(botan_mp_t mp); BOTAN_PUBLIC_API(2,1) int botan_mp_is_zero(const botan_mp_t mp); BOTAN_PUBLIC_API(2,1) int botan_mp_is_odd(const botan_mp_t mp); BOTAN_PUBLIC_API(2,1) int botan_mp_is_even(const botan_mp_t mp); BOTAN_PUBLIC_API(2,1) int botan_mp_add(botan_mp_t result, const botan_mp_t x, const botan_mp_t y); BOTAN_PUBLIC_API(2,1) int botan_mp_sub(botan_mp_t result, const botan_mp_t x, const botan_mp_t y); BOTAN_PUBLIC_API(2,1) int botan_mp_mul(botan_mp_t result, const botan_mp_t x, const botan_mp_t y); BOTAN_PUBLIC_API(2,1) int botan_mp_div(botan_mp_t quotient, botan_mp_t remainder, const botan_mp_t x, const botan_mp_t y); BOTAN_PUBLIC_API(2,1) int botan_mp_mod_mul(botan_mp_t result, const botan_mp_t x, const botan_mp_t y, const botan_mp_t mod); /* * Returns 0 if x != y * Returns 1 if x == y * Returns negative number on error */ BOTAN_PUBLIC_API(2,1) int botan_mp_equal(const botan_mp_t x, const botan_mp_t y); /* * Sets *result to comparison result: * -1 if x < y, 0 if x == y, 1 if x > y * Returns negative number on error or zero on success */ BOTAN_PUBLIC_API(2,1) int botan_mp_cmp(int* result, const botan_mp_t x, const botan_mp_t y); /* * Swap two botan_mp_t */ BOTAN_PUBLIC_API(2,1) int botan_mp_swap(botan_mp_t x, botan_mp_t y); // Return (base^exponent) % modulus BOTAN_PUBLIC_API(2,1) int botan_mp_powmod(botan_mp_t out, const botan_mp_t base, const botan_mp_t exponent, const botan_mp_t modulus); BOTAN_PUBLIC_API(2,1) int botan_mp_lshift(botan_mp_t out, const botan_mp_t in, size_t shift); BOTAN_PUBLIC_API(2,1) int botan_mp_rshift(botan_mp_t out, const botan_mp_t in, size_t shift); BOTAN_PUBLIC_API(2,1) int botan_mp_mod_inverse(botan_mp_t out, const botan_mp_t in, const botan_mp_t modulus); BOTAN_PUBLIC_API(2,1) int botan_mp_rand_bits(botan_mp_t rand_out, botan_rng_t rng, size_t bits); BOTAN_PUBLIC_API(2,1) int botan_mp_rand_range(botan_mp_t rand_out, botan_rng_t rng, const botan_mp_t lower_bound, const botan_mp_t upper_bound); BOTAN_PUBLIC_API(2,1) int botan_mp_gcd(botan_mp_t out, const botan_mp_t x, const botan_mp_t y); /** * Returns 0 if n is not prime * Returns 1 if n is prime * Returns negative number on error */ BOTAN_PUBLIC_API(2,1) int botan_mp_is_prime(const botan_mp_t n, botan_rng_t rng, size_t test_prob); /** * Returns 0 if specified bit of n is not set * Returns 1 if specified bit of n is set * Returns negative number on error */ BOTAN_PUBLIC_API(2,1) int botan_mp_get_bit(const botan_mp_t n, size_t bit); /** * Set the specified bit */ BOTAN_PUBLIC_API(2,1) int botan_mp_set_bit(botan_mp_t n, size_t bit); /** * Clear the specified bit */ BOTAN_PUBLIC_API(2,1) int botan_mp_clear_bit(botan_mp_t n, size_t bit); /* Bcrypt password hashing */ /** * Check a previously created password hash * @param pass the password to check against * @param hash the stored hash to check against * @return 0 if if this password/hash combination is valid, * 1 if the combination is not valid (but otherwise well formed), * negative on error */ BOTAN_PUBLIC_API(2,0) int botan_bcrypt_is_valid(const char* pass, const char* hash); /* * Public/private key creation, import, ... */ typedef struct botan_privkey_struct* botan_privkey_t; BOTAN_PUBLIC_API(2,0) int botan_privkey_create(botan_privkey_t* key, const char* algo_name, const char* algo_params, botan_rng_t rng); #define BOTAN_CHECK_KEY_EXPENSIVE_TESTS 1 BOTAN_PUBLIC_API(2,0) int botan_privkey_check_key(botan_privkey_t key, botan_rng_t rng, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_privkey_create_rsa(botan_privkey_t* key, botan_rng_t rng, size_t n_bits); BOTAN_PUBLIC_API(2,0) int botan_privkey_create_ecdsa(botan_privkey_t* key, botan_rng_t rng, const char* params); BOTAN_PUBLIC_API(2,0) int botan_privkey_create_ecdh(botan_privkey_t* key, botan_rng_t rng, const char* params); BOTAN_PUBLIC_API(2,0) int botan_privkey_create_mceliece(botan_privkey_t* key, botan_rng_t rng, size_t n, size_t t); BOTAN_PUBLIC_API(2,0) int botan_privkey_create_dh(botan_privkey_t* key, botan_rng_t rng, const char* param); /* * Input currently assumed to be PKCS #8 structure; * Set password to NULL to indicate no encryption expected */ BOTAN_PUBLIC_API(2,0) int botan_privkey_load(botan_privkey_t* key, botan_rng_t rng, const uint8_t bits[], size_t len, const char* password); BOTAN_PUBLIC_API(2,0) int botan_privkey_destroy(botan_privkey_t key); #define BOTAN_PRIVKEY_EXPORT_FLAG_DER 0 #define BOTAN_PRIVKEY_EXPORT_FLAG_PEM 1 /* * On input *out_len is number of bytes in out[] * On output *out_len is number of bytes written (or required) * If out is not big enough no output is written, *out_len is set and 1 is returned * Returns 0 on success and sets * If some other error occurs a negative integer is returned. */ BOTAN_PUBLIC_API(2,0) int botan_privkey_export(botan_privkey_t key, uint8_t out[], size_t* out_len, uint32_t flags); /* * Set encryption_algo to NULL or "" to have the library choose a default (recommended) */ BOTAN_DEPRECATED("Use botan_privkey_export_encrypted_pbkdf_{msec,iter}") BOTAN_PUBLIC_API(2,0) int botan_privkey_export_encrypted(botan_privkey_t key, uint8_t out[], size_t* out_len, botan_rng_t rng, const char* passphrase, const char* encryption_algo, uint32_t flags); /* * Export a private key, running PBKDF for specified amount of time * @param key the private key to export */ BOTAN_PUBLIC_API(2,0) int botan_privkey_export_encrypted_pbkdf_msec(botan_privkey_t key, uint8_t out[], size_t* out_len, botan_rng_t rng, const char* passphrase, uint32_t pbkdf_msec_runtime, size_t* pbkdf_iterations_out, const char* cipher_algo, const char* pbkdf_algo, uint32_t flags); /* * Export a private key using the specified number of iterations. */ BOTAN_PUBLIC_API(2,0) int botan_privkey_export_encrypted_pbkdf_iter(botan_privkey_t key, uint8_t out[], size_t* out_len, botan_rng_t rng, const char* passphrase, size_t pbkdf_iterations, const char* cipher_algo, const char* pbkdf_algo, uint32_t flags); typedef struct botan_pubkey_struct* botan_pubkey_t; BOTAN_PUBLIC_API(2,0) int botan_pubkey_load(botan_pubkey_t* key, const uint8_t bits[], size_t len); BOTAN_PUBLIC_API(2,0) int botan_privkey_export_pubkey(botan_pubkey_t* out, botan_privkey_t in); BOTAN_PUBLIC_API(2,0) int botan_pubkey_export(botan_pubkey_t key, uint8_t out[], size_t* out_len, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pubkey_algo_name(botan_pubkey_t key, char out[], size_t* out_len); /** * Returns 0 if key is valid, negative if invalid key or some other error */ BOTAN_PUBLIC_API(2,0) int botan_pubkey_check_key(botan_pubkey_t key, botan_rng_t rng, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pubkey_estimated_strength(botan_pubkey_t key, size_t* estimate); BOTAN_PUBLIC_API(2,0) int botan_pubkey_fingerprint(botan_pubkey_t key, const char* hash, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_pubkey_destroy(botan_pubkey_t key); /* * Get arbitrary named fields from public or privat keys */ BOTAN_PUBLIC_API(2,0) int botan_pubkey_get_field(botan_mp_t output, botan_pubkey_t key, const char* field_name); BOTAN_PUBLIC_API(2,0) int botan_privkey_get_field(botan_mp_t output, botan_privkey_t key, const char* field_name); /* * Algorithm specific key operations: RSA */ BOTAN_PUBLIC_API(2,0) int botan_privkey_load_rsa(botan_privkey_t* key, botan_mp_t p, botan_mp_t q, botan_mp_t e); BOTAN_PUBLIC_API(2,0) int botan_privkey_rsa_get_p(botan_mp_t p, botan_privkey_t rsa_key); BOTAN_PUBLIC_API(2,0) int botan_privkey_rsa_get_q(botan_mp_t q, botan_privkey_t rsa_key); BOTAN_PUBLIC_API(2,0) int botan_privkey_rsa_get_d(botan_mp_t d, botan_privkey_t rsa_key); BOTAN_PUBLIC_API(2,0) int botan_privkey_rsa_get_n(botan_mp_t n, botan_privkey_t rsa_key); BOTAN_PUBLIC_API(2,0) int botan_privkey_rsa_get_e(botan_mp_t e, botan_privkey_t rsa_key); BOTAN_PUBLIC_API(2,0) int botan_pubkey_load_rsa(botan_pubkey_t* key, botan_mp_t n, botan_mp_t e); BOTAN_PUBLIC_API(2,0) int botan_pubkey_rsa_get_e(botan_mp_t e, botan_pubkey_t rsa_key); BOTAN_PUBLIC_API(2,0) int botan_pubkey_rsa_get_n(botan_mp_t n, botan_pubkey_t rsa_key); /* * Algorithm specific key operations: DSA */ BOTAN_PUBLIC_API(2,0) int botan_privkey_load_dsa(botan_privkey_t* key, botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t x); BOTAN_PUBLIC_API(2,0) int botan_pubkey_load_dsa(botan_pubkey_t* key, botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t y); BOTAN_PUBLIC_API(2,0) int botan_privkey_dsa_get_x(botan_mp_t n, botan_privkey_t key); BOTAN_PUBLIC_API(2,0) int botan_pubkey_dsa_get_p(botan_mp_t p, botan_pubkey_t key); BOTAN_PUBLIC_API(2,0) int botan_pubkey_dsa_get_q(botan_mp_t q, botan_pubkey_t key); BOTAN_PUBLIC_API(2,0) int botan_pubkey_dsa_get_g(botan_mp_t d, botan_pubkey_t key); BOTAN_PUBLIC_API(2,0) int botan_pubkey_dsa_get_y(botan_mp_t y, botan_pubkey_t key); /* * Loads Diffie Hellman private key * * @param key variable populated with key material * @param p prime order of a Z_p group * @param g group generator * @param x private key * * @pre key is NULL on input * @post function allocates memory and assigns to `key' * * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_privkey_load_dh(botan_privkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t x); /* * Loads Diffie Hellman public key * * @param key variable populated with key material * @param p prime order of a Z_p group * @param g group generator * @param y public key * * @pre key is NULL on input * @post function allocates memory and assigns to `key' * * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_pubkey_load_dh(botan_pubkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t y); /* * Algorithm specific key operations: ElGamal */ /* * Loads ElGamal public key * @param key variable populated with key material * @param p prime order of a Z_p group * @param g group generator * @param y public key * * @pre key is NULL on input * @post function allocates memory and assigns to `key' * * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_pubkey_load_elgamal(botan_pubkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t y); /* * Loads ElGamal private key * * @param key variable populated with key material * @param p prime order of a Z_p group * @param g group generator * @param x private key * * @pre key is NULL on input * @post function allocates memory and assigns to `key' * * @return 0 on success, a negative value on failure */ BOTAN_PUBLIC_API(2,0) int botan_privkey_load_elgamal(botan_privkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t x); /* * Algorithm specific key operations: Ed25519 */ BOTAN_PUBLIC_API(2,2) int botan_privkey_load_ed25519(botan_privkey_t* key, const uint8_t privkey[32]); BOTAN_PUBLIC_API(2,2) int botan_pubkey_load_ed25519(botan_pubkey_t* key, const uint8_t pubkey[32]); BOTAN_PUBLIC_API(2,2) int botan_privkey_ed25519_get_privkey(botan_privkey_t key, uint8_t output[64]); BOTAN_PUBLIC_API(2,2) int botan_pubkey_ed25519_get_pubkey(botan_pubkey_t key, uint8_t pubkey[32]); /* * Algorithm specific key operations: ECDSA and ECDH */ BOTAN_PUBLIC_API(2,2) int botan_privkey_load_ecdsa(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_pubkey_load_ecdsa(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_pubkey_load_ecdh(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_privkey_load_ecdh(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_pubkey_load_sm2(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_privkey_load_sm2(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_pubkey_load_sm2_enc(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name); BOTAN_PUBLIC_API(2,2) int botan_privkey_load_sm2_enc(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name); BOTAN_PUBLIC_API(2,3) int botan_pubkey_sm2_compute_za(uint8_t out[], size_t* out_len, const char* ident, const char* hash_algo, const botan_pubkey_t key); /* * Public Key Encryption */ typedef struct botan_pk_op_encrypt_struct* botan_pk_op_encrypt_t; BOTAN_PUBLIC_API(2,0) int botan_pk_op_encrypt_create(botan_pk_op_encrypt_t* op, botan_pubkey_t key, const char* padding, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pk_op_encrypt_destroy(botan_pk_op_encrypt_t op); BOTAN_PUBLIC_API(2,0) int botan_pk_op_encrypt(botan_pk_op_encrypt_t op, botan_rng_t rng, uint8_t out[], size_t* out_len, const uint8_t plaintext[], size_t plaintext_len); /* * Public Key Decryption */ typedef struct botan_pk_op_decrypt_struct* botan_pk_op_decrypt_t; BOTAN_PUBLIC_API(2,0) int botan_pk_op_decrypt_create(botan_pk_op_decrypt_t* op, botan_privkey_t key, const char* padding, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pk_op_decrypt_destroy(botan_pk_op_decrypt_t op); BOTAN_PUBLIC_API(2,0) int botan_pk_op_decrypt(botan_pk_op_decrypt_t op, uint8_t out[], size_t* out_len, const uint8_t ciphertext[], size_t ciphertext_len); /* * Signature Generation */ typedef struct botan_pk_op_sign_struct* botan_pk_op_sign_t; BOTAN_PUBLIC_API(2,0) int botan_pk_op_sign_create(botan_pk_op_sign_t* op, botan_privkey_t key, const char* hash_and_padding, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pk_op_sign_destroy(botan_pk_op_sign_t op); BOTAN_PUBLIC_API(2,0) int botan_pk_op_sign_update(botan_pk_op_sign_t op, const uint8_t in[], size_t in_len); BOTAN_PUBLIC_API(2,0) int botan_pk_op_sign_finish(botan_pk_op_sign_t op, botan_rng_t rng, uint8_t sig[], size_t* sig_len); /* * Signature Verification */ typedef struct botan_pk_op_verify_struct* botan_pk_op_verify_t; BOTAN_PUBLIC_API(2,0) int botan_pk_op_verify_create(botan_pk_op_verify_t* op, botan_pubkey_t key, const char* hash_and_padding, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pk_op_verify_destroy(botan_pk_op_verify_t op); BOTAN_PUBLIC_API(2,0) int botan_pk_op_verify_update(botan_pk_op_verify_t op, const uint8_t in[], size_t in_len); BOTAN_PUBLIC_API(2,0) int botan_pk_op_verify_finish(botan_pk_op_verify_t op, const uint8_t sig[], size_t sig_len); /* * Key Agreement */ typedef struct botan_pk_op_ka_struct* botan_pk_op_ka_t; BOTAN_PUBLIC_API(2,0) int botan_pk_op_key_agreement_create(botan_pk_op_ka_t* op, botan_privkey_t key, const char* kdf, uint32_t flags); BOTAN_PUBLIC_API(2,0) int botan_pk_op_key_agreement_destroy(botan_pk_op_ka_t op); BOTAN_PUBLIC_API(2,0) int botan_pk_op_key_agreement_export_public(botan_privkey_t key, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_pk_op_key_agreement(botan_pk_op_ka_t op, uint8_t out[], size_t* out_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len); BOTAN_PUBLIC_API(2,0) int botan_pkcs_hash_id(const char* hash_name, uint8_t pkcs_id[], size_t* pkcs_id_len); /* * * @param mce_key must be a McEliece key * ct_len should be pt_len + n/8 + a few? */ BOTAN_PUBLIC_API(2,0) int botan_mceies_encrypt(botan_pubkey_t mce_key, botan_rng_t rng, const char* aead, const uint8_t pt[], size_t pt_len, const uint8_t ad[], size_t ad_len, uint8_t ct[], size_t* ct_len); BOTAN_PUBLIC_API(2,0) int botan_mceies_decrypt(botan_privkey_t mce_key, const char* aead, const uint8_t ct[], size_t ct_len, const uint8_t ad[], size_t ad_len, uint8_t pt[], size_t* pt_len); typedef struct botan_x509_cert_struct* botan_x509_cert_t; BOTAN_PUBLIC_API(2,0) int botan_x509_cert_load(botan_x509_cert_t* cert_obj, const uint8_t cert[], size_t cert_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_load_file(botan_x509_cert_t* cert_obj, const char* filename); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_destroy(botan_x509_cert_t cert); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_gen_selfsigned(botan_x509_cert_t* cert, botan_privkey_t key, botan_rng_t rng, const char* common_name, const char* org_name); // TODO: return botan_time_struct instead BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_time_starts(botan_x509_cert_t cert, char out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_time_expires(botan_x509_cert_t cert, char out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_fingerprint(botan_x509_cert_t cert, const char* hash, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_serial_number(botan_x509_cert_t cert, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_authority_key_id(botan_x509_cert_t cert, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_subject_key_id(botan_x509_cert_t cert, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_public_key_bits(botan_x509_cert_t cert, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_public_key(botan_x509_cert_t cert, botan_pubkey_t* key); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_issuer_dn(botan_x509_cert_t cert, const char* key, size_t index, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_get_subject_dn(botan_x509_cert_t cert, const char* key, size_t index, uint8_t out[], size_t* out_len); BOTAN_PUBLIC_API(2,0) int botan_x509_cert_to_string(botan_x509_cert_t cert, char out[], size_t* out_len); // Must match values of Key_Constraints in key_constraints.h enum botan_x509_cert_key_constraints { NO_CONSTRAINTS = 0, DIGITAL_SIGNATURE = 32768, NON_REPUDIATION = 16384, KEY_ENCIPHERMENT = 8192, DATA_ENCIPHERMENT = 4096, KEY_AGREEMENT = 2048, KEY_CERT_SIGN = 1024, CRL_SIGN = 512, ENCIPHER_ONLY = 256, DECIPHER_ONLY = 128 }; BOTAN_PUBLIC_API(2,0) int botan_x509_cert_allowed_usage(botan_x509_cert_t cert, unsigned int key_usage); /** * Key wrapping as per RFC 3394 */ BOTAN_PUBLIC_API(2,2) int botan_key_wrap3394(const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t *wrapped_key_len); BOTAN_PUBLIC_API(2,2) int botan_key_unwrap3394(const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t *key_len); /* * TLS (WIP) */ #if defined(BOTAN_HAS_TLS) && 0 typedef struct botan_tls_session_struct* botan_tls_session_t; BOTAN_TEST_API int botan_tls_session_decrypt(botan_tls_session_t* session, const uint8_t key[], size_t key_len, const uint8_t blob[], size_t blob_len); BOTAN_TEST_API int botan_tls_session_get_version(botan_tls_session_t session, uint16_t* tls_version); BOTAN_TEST_API int botan_tls_session_get_ciphersuite(botan_tls_session_t session, uint16_t* ciphersuite); BOTAN_TEST_API int botan_tls_session_encrypt(botan_tls_session_t session, botan_rng_t rng, uint8_t key[], size_t* key_len); BOTAN_TEST_API int botan_tls_session_get_peer_certs(botan_tls_session_t session, botan_x509_cert_t certs[], size_t* cert_len); // TODO: peer certs, validation, ... typedef struct botan_tls_channel_struct* botan_tls_channel_t; typedef void (*botan_tls_channel_output_fn)(void* application_data, const uint8_t* data, size_t data_len); typedef void (*botan_tls_channel_data_cb)(void* application_data, const uint8_t* data, size_t data_len); typedef void (*botan_tls_channel_alert_cb)(void* application_data, uint16_t alert_code); typedef void (*botan_tls_channel_session_established)(void* application_data, botan_tls_channel_t channel, botan_tls_session_t session); BOTAN_TEST_API int botan_tls_channel_init_client(botan_tls_channel_t* channel, botan_tls_channel_output_fn output_fn, botan_tls_channel_data_cb data_cb, botan_tls_channel_alert_cb alert_cb, botan_tls_channel_session_established session_cb, const char* server_name); BOTAN_TEST_API int botan_tls_channel_init_server(botan_tls_channel_t* channel, botan_tls_channel_output_fn output_fn, botan_tls_channel_data_cb data_cb, botan_tls_channel_alert_cb alert_cb, botan_tls_channel_session_established session_cb); BOTAN_TEST_API int botan_tls_channel_received_data(botan_tls_channel_t chan, const uint8_t input[], size_t len); /** * Returns 0 for client, 1 for server, negative for error */ BOTAN_TEST_API int botan_tls_channel_type(botan_tls_channel_t chan); BOTAN_TEST_API int botan_tls_channel_send(botan_tls_channel_t chan, const uint8_t input[], size_t len); BOTAN_TEST_API int botan_tls_channel_close(botan_tls_channel_t chan); BOTAN_TEST_API int botan_tls_channel_destroy(botan_tls_channel_t chan); #endif #ifdef __cplusplus } #endif #endif botan-2.4.0/src/lib/ffi/ffi_block.cpp000066400000000000000000000044571322470703100173540ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include extern "C" { using namespace Botan_FFI; BOTAN_FFI_DECLARE_STRUCT(botan_block_cipher_struct, Botan::BlockCipher, 0x64C29716); int botan_block_cipher_init(botan_block_cipher_t* bc, const char* bc_name) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(bc == nullptr || bc_name == nullptr || *bc_name == 0) return BOTAN_FFI_ERROR_NULL_POINTER; *bc = nullptr; std::unique_ptr cipher(Botan::BlockCipher::create(bc_name)); if(cipher == nullptr) return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; *bc = new botan_block_cipher_struct(cipher.release()); return BOTAN_FFI_SUCCESS; }); } /** * Destroy a block cipher object */ int botan_block_cipher_destroy(botan_block_cipher_t bc) { return BOTAN_FFI_CHECKED_DELETE(bc); } int botan_block_cipher_clear(botan_block_cipher_t bc) { return BOTAN_FFI_DO(Botan::BlockCipher, bc, b, { b.clear(); }); } /** * Set the key for a block cipher instance */ int botan_block_cipher_set_key(botan_block_cipher_t bc, const uint8_t key[], size_t len) { return BOTAN_FFI_DO(Botan::BlockCipher, bc, b, { b.set_key(key, len); }); } /** * Return the positive block size of this block cipher, or negative to * indicate an error */ int botan_block_cipher_block_size(botan_block_cipher_t bc) { return BOTAN_FFI_DO(Botan::BlockCipher, bc, b, { return static_cast(b.block_size()); }); } int botan_block_cipher_encrypt_blocks(botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks) { return BOTAN_FFI_DO(Botan::BlockCipher, bc, b, { b.encrypt_n(in, out, blocks); }); } int botan_block_cipher_decrypt_blocks(botan_block_cipher_t bc, const uint8_t in[], uint8_t out[], size_t blocks) { return BOTAN_FFI_DO(Botan::BlockCipher, bc, b, { b.decrypt_n(in, out, blocks); }); } } botan-2.4.0/src/lib/ffi/ffi_cert.cpp000066400000000000000000000114531322470703100172110ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include extern "C" { using namespace Botan_FFI; BOTAN_FFI_DECLARE_STRUCT(botan_x509_cert_struct, Botan::X509_Certificate, 0x8F628937); int botan_x509_cert_load_file(botan_x509_cert_t* cert_obj, const char* cert_path) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(!cert_obj || !cert_path) return BOTAN_FFI_ERROR_NULL_POINTER; #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) std::unique_ptr c(new Botan::X509_Certificate(cert_path)); *cert_obj = new botan_x509_cert_struct(c.release()); return BOTAN_FFI_SUCCESS; #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif }); } int botan_x509_cert_load(botan_x509_cert_t* cert_obj, const uint8_t cert_bits[], size_t cert_bits_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(!cert_obj || !cert_bits) return BOTAN_FFI_ERROR_NULL_POINTER; Botan::DataSource_Memory bits(cert_bits, cert_bits_len); std::unique_ptr c(new Botan::X509_Certificate(bits)); *cert_obj = new botan_x509_cert_struct(c.release()); return BOTAN_FFI_SUCCESS; }); } int botan_x509_cert_get_public_key(botan_x509_cert_t cert, botan_pubkey_t* key) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(key == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; *key = nullptr; #if defined(BOTAN_HAS_RSA) std::unique_ptr publicKey = safe_get(cert).load_subject_public_key(); *key = new botan_pubkey_struct(publicKey.release()); return BOTAN_FFI_SUCCESS; #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif }); } int botan_x509_cert_get_issuer_dn(botan_x509_cert_t cert, const char* key, size_t index, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_str_output(out, out_len, c.issuer_info(key).at(index)); }); } int botan_x509_cert_get_subject_dn(botan_x509_cert_t cert, const char* key, size_t index, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_str_output(out, out_len, c.subject_info(key).at(index)); }); } int botan_x509_cert_to_string(botan_x509_cert_t cert, char out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_str_output(out, out_len, c.to_string()); }); } int botan_x509_cert_allowed_usage(botan_x509_cert_t cert, unsigned int key_usage) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { const Botan::Key_Constraints k = static_cast(key_usage); if(c.allowed_usage(k)) return BOTAN_FFI_SUCCESS; return 1; }); } int botan_x509_cert_destroy(botan_x509_cert_t cert) { return BOTAN_FFI_CHECKED_DELETE(cert); } int botan_x509_cert_get_time_starts(botan_x509_cert_t cert, char out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_str_output(out, out_len, c.not_before().to_string()); }); } int botan_x509_cert_get_time_expires(botan_x509_cert_t cert, char out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_str_output(out, out_len, c.not_after().to_string()); }); } int botan_x509_cert_get_serial_number(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_vec_output(out, out_len, c.serial_number()); }); } int botan_x509_cert_get_fingerprint(botan_x509_cert_t cert, const char* hash, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_str_output(out, out_len, c.fingerprint(hash)); }); } int botan_x509_cert_get_authority_key_id(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_vec_output(out, out_len, c.authority_key_id()); }); } int botan_x509_cert_get_subject_key_id(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_vec_output(out, out_len, c.subject_key_id()); }); } int botan_x509_cert_get_public_key_bits(botan_x509_cert_t cert, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::X509_Certificate, cert, c, { return write_vec_output(out, out_len, c.subject_public_key_bits()); }); } } botan-2.4.0/src/lib/ffi/ffi_cipher.cpp000066400000000000000000000133651322470703100175320ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include extern "C" { using namespace Botan_FFI; struct botan_cipher_struct final : public botan_struct { explicit botan_cipher_struct(Botan::Cipher_Mode* x) : botan_struct(x) {} Botan::secure_vector m_buf; }; int botan_cipher_init(botan_cipher_t* cipher, const char* cipher_name, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const bool encrypt_p = ((flags & BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION) == BOTAN_CIPHER_INIT_FLAG_ENCRYPT); const Botan::Cipher_Dir dir = encrypt_p ? Botan::ENCRYPTION : Botan::DECRYPTION; std::unique_ptr mode(Botan::get_cipher_mode(cipher_name, dir)); if(!mode) return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; *cipher = new botan_cipher_struct(mode.release()); return BOTAN_FFI_SUCCESS; }); } int botan_cipher_destroy(botan_cipher_t cipher) { return BOTAN_FFI_CHECKED_DELETE(cipher); } int botan_cipher_clear(botan_cipher_t cipher) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { c.clear(); }); } int botan_cipher_query_keylen(botan_cipher_t cipher, size_t* out_minimum_keylength, size_t* out_maximum_keylength) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *out_minimum_keylength = c.key_spec().minimum_keylength(); *out_maximum_keylength = c.key_spec().maximum_keylength(); }); } int botan_cipher_set_key(botan_cipher_t cipher, const uint8_t* key, size_t key_len) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { c.set_key(key, key_len); }); } int botan_cipher_start(botan_cipher_t cipher_obj, const uint8_t* nonce, size_t nonce_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::Cipher_Mode& cipher = safe_get(cipher_obj); cipher.start(nonce, nonce_len); cipher_obj->m_buf.reserve(cipher.update_granularity()); return BOTAN_FFI_SUCCESS; }); } int botan_cipher_update(botan_cipher_t cipher_obj, uint32_t flags, uint8_t output_ptr[], size_t orig_output_size, size_t* output_written, const uint8_t input_ptr[], size_t orig_input_size, size_t* input_consumed) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { size_t input_size = orig_input_size; size_t output_size = orig_output_size; const uint8_t* input = input_ptr; uint8_t* output = output_ptr; using namespace Botan; Cipher_Mode& cipher = safe_get(cipher_obj); secure_vector& mbuf = cipher_obj->m_buf; const bool final_input = (flags & BOTAN_CIPHER_UPDATE_FLAG_FINAL); if(final_input) { mbuf.assign(input, input + input_size); *input_consumed = input_size; *output_written = 0; try { cipher.finish(mbuf); } catch(Integrity_Failure&) { return BOTAN_FFI_ERROR_BAD_MAC; } *output_written = mbuf.size(); if(mbuf.size() <= output_size) { copy_mem(output, mbuf.data(), mbuf.size()); mbuf.clear(); return BOTAN_FFI_SUCCESS; } return -1; } if(input_size == 0) { // Currently must take entire buffer in this case *output_written = mbuf.size(); if(output_size >= mbuf.size()) { copy_mem(output, mbuf.data(), mbuf.size()); mbuf.clear(); return BOTAN_FFI_SUCCESS; } return -1; } const size_t ud = cipher.update_granularity(); BOTAN_ASSERT(cipher.update_granularity() > cipher.minimum_final_size(), "logic error"); mbuf.resize(ud); size_t taken = 0, written = 0; while(input_size >= ud && output_size >= ud) { copy_mem(mbuf.data(), input, ud); cipher.update(mbuf); input_size -= ud; copy_mem(output, mbuf.data(), ud); input += ud; taken += ud; output_size -= ud; output += ud; written += ud; } *output_written = written; *input_consumed = taken; return BOTAN_FFI_SUCCESS; }); } int botan_cipher_set_associated_data(botan_cipher_t cipher, const uint8_t* ad, size_t ad_len) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { if(Botan::AEAD_Mode* aead = dynamic_cast(&c)) { aead->set_associated_data(ad, ad_len); return BOTAN_FFI_SUCCESS; } return BOTAN_FFI_ERROR_BAD_PARAMETER; }); } int botan_cipher_valid_nonce_length(botan_cipher_t cipher, size_t nl) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { return c.valid_nonce_length(nl) ? 1 : 0; }); } int botan_cipher_get_default_nonce_length(botan_cipher_t cipher, size_t* nl) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *nl = c.default_nonce_length(); }); } int botan_cipher_get_update_granularity(botan_cipher_t cipher, size_t* ug) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *ug = c.update_granularity(); }); } int botan_cipher_get_tag_length(botan_cipher_t cipher, size_t* tl) { return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *tl = c.tag_size(); }); } } botan-2.4.0/src/lib/ffi/ffi_hash.cpp000066400000000000000000000036301322470703100171750ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include extern "C" { using namespace Botan_FFI; BOTAN_FFI_DECLARE_STRUCT(botan_hash_struct, Botan::HashFunction, 0x1F0A4F84); int botan_hash_init(botan_hash_t* hash, const char* hash_name, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(hash == nullptr || hash_name == nullptr || *hash_name == 0) return BOTAN_FFI_ERROR_NULL_POINTER; if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; std::unique_ptr h = Botan::HashFunction::create(hash_name); if(h == nullptr) return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; *hash = new botan_hash_struct(h.release()); return BOTAN_FFI_SUCCESS; }); } int botan_hash_destroy(botan_hash_t hash) { return BOTAN_FFI_CHECKED_DELETE(hash); } int botan_hash_output_length(botan_hash_t hash, size_t* out) { return BOTAN_FFI_DO(Botan::HashFunction, hash, h, { *out = h.output_length(); }); } int botan_hash_block_size(botan_hash_t hash, size_t* out) { return BOTAN_FFI_DO(Botan::HashFunction, hash, h, { *out = h.hash_block_size(); }); } int botan_hash_clear(botan_hash_t hash) { return BOTAN_FFI_DO(Botan::HashFunction, hash, h, { h.clear(); }); } int botan_hash_update(botan_hash_t hash, const uint8_t* buf, size_t len) { return BOTAN_FFI_DO(Botan::HashFunction, hash, h, { h.update(buf, len); }); } int botan_hash_final(botan_hash_t hash, uint8_t out[]) { return BOTAN_FFI_DO(Botan::HashFunction, hash, h, { h.final(out); }); } int botan_hash_copy_state(botan_hash_t* dest, const botan_hash_t source) { return BOTAN_FFI_DO(Botan::HashFunction, source, src, { *dest = new botan_hash_struct(src.copy_state().release()); }); } } botan-2.4.0/src/lib/ffi/ffi_kdf.cpp000066400000000000000000000061411322470703100170160ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #if defined(BOTAN_HAS_BCRYPT) #include #endif extern "C" { using namespace Botan_FFI; int botan_pbkdf(const char* pbkdf_algo, uint8_t out[], size_t out_len, const char* pass, const uint8_t salt[], size_t salt_len, size_t iterations) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr pbkdf(Botan::get_pbkdf(pbkdf_algo)); pbkdf->pbkdf_iterations(out, out_len, pass, salt, salt_len, iterations); return BOTAN_FFI_SUCCESS; }); } int botan_pbkdf_timed(const char* pbkdf_algo, uint8_t out[], size_t out_len, const char* password, const uint8_t salt[], size_t salt_len, size_t ms_to_run, size_t* iterations_used) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr pbkdf(Botan::get_pbkdf(pbkdf_algo)); pbkdf->pbkdf_timed(out, out_len, password, salt, salt_len, std::chrono::milliseconds(ms_to_run), *iterations_used); return BOTAN_FFI_SUCCESS; }); } int botan_kdf(const char* kdf_algo, uint8_t out[], size_t out_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr kdf(Botan::get_kdf(kdf_algo)); kdf->kdf(out, out_len, secret, secret_len, salt, salt_len, label, label_len); return BOTAN_FFI_SUCCESS; }); } int botan_bcrypt_generate(uint8_t* out, size_t* out_len, const char* pass, botan_rng_t rng_obj, size_t wf, uint32_t flags) { #if defined(BOTAN_HAS_BCRYPT) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(out == nullptr || out_len == nullptr || pass == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; if(wf < 4 || wf > 18) throw FFI_Error("Bad bcrypt work factor " + std::to_string(wf)); Botan::RandomNumberGenerator& rng = safe_get(rng_obj); const std::string bcrypt = Botan::generate_bcrypt(pass, rng, static_cast(wf)); return write_str_output(out, out_len, bcrypt); }); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_bcrypt_is_valid(const char* pass, const char* hash) { #if defined(BOTAN_HAS_BCRYPT) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { return Botan::check_bcrypt(pass, hash) ? BOTAN_FFI_SUCCESS : BOTAN_FFI_INVALID_VERIFIER; }); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } } botan-2.4.0/src/lib/ffi/ffi_keywrap.cpp000066400000000000000000000031201322470703100177260ustar00rootroot00000000000000/* * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_RFC3394_KEYWRAP) #include #endif extern "C" { using namespace Botan_FFI; int botan_key_wrap3394(const uint8_t key[], size_t key_len, const uint8_t kek[], size_t kek_len, uint8_t wrapped_key[], size_t* wrapped_key_len) { #if defined(BOTAN_HAS_RFC3394_KEYWRAP) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const Botan::SymmetricKey kek_sym(kek, kek_len); const Botan::secure_vector key_pt(key, key + key_len); const Botan::secure_vector key_ct = Botan::rfc3394_keywrap(key_pt, kek_sym); return write_vec_output(wrapped_key, wrapped_key_len, key_ct); }); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_key_unwrap3394(const uint8_t wrapped_key[], size_t wrapped_key_len, const uint8_t kek[], size_t kek_len, uint8_t key[], size_t* key_len) { #if defined(BOTAN_HAS_RFC3394_KEYWRAP) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const Botan::SymmetricKey kek_sym(kek, kek_len); const Botan::secure_vector key_ct(wrapped_key, wrapped_key + wrapped_key_len); const Botan::secure_vector key_pt = Botan::rfc3394_keyunwrap(key_ct, kek_sym); return write_vec_output(key, key_len, key_pt); }); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } } botan-2.4.0/src/lib/ffi/ffi_mac.cpp000066400000000000000000000033141322470703100170110ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include extern "C" { using namespace Botan_FFI; BOTAN_FFI_DECLARE_STRUCT(botan_mac_struct, Botan::MessageAuthenticationCode, 0xA06E8FC1); int botan_mac_init(botan_mac_t* mac, const char* mac_name, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(!mac || !mac_name || flags != 0) return BOTAN_FFI_ERROR_NULL_POINTER; std::unique_ptr m = Botan::MessageAuthenticationCode::create(mac_name); if(m == nullptr) return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; *mac = new botan_mac_struct(m.release()); return BOTAN_FFI_SUCCESS; }); } int botan_mac_destroy(botan_mac_t mac) { return BOTAN_FFI_CHECKED_DELETE(mac); } int botan_mac_set_key(botan_mac_t mac, const uint8_t* key, size_t key_len) { return BOTAN_FFI_DO(Botan::MessageAuthenticationCode, mac, m, { m.set_key(key, key_len); }); } int botan_mac_output_length(botan_mac_t mac, size_t* out) { return BOTAN_FFI_DO(Botan::MessageAuthenticationCode, mac, m, { *out = m.output_length(); }); } int botan_mac_clear(botan_mac_t mac) { return BOTAN_FFI_DO(Botan::MessageAuthenticationCode, mac, m, { m.clear(); }); } int botan_mac_update(botan_mac_t mac, const uint8_t* buf, size_t len) { return BOTAN_FFI_DO(Botan::MessageAuthenticationCode, mac, m, { m.update(buf, len); }); } int botan_mac_final(botan_mac_t mac, uint8_t out[]) { return BOTAN_FFI_DO(Botan::MessageAuthenticationCode, mac, m, { m.final(out); }); } } botan-2.4.0/src/lib/ffi/ffi_mp.cpp000066400000000000000000000202071322470703100166650ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include extern "C" { using namespace Botan_FFI; int botan_mp_init(botan_mp_t* mp_out) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(mp_out == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; *mp_out = new botan_mp_struct(new Botan::BigInt); return BOTAN_FFI_SUCCESS; }); } int botan_mp_clear(botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { bn.clear(); }); } int botan_mp_set_from_int(botan_mp_t mp, int initial_value) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { if(initial_value >= 0) { bn = Botan::BigInt(static_cast(initial_value)); } else { bn = Botan::BigInt(static_cast(-initial_value)); bn.flip_sign(); } }); } int botan_mp_set_from_str(botan_mp_t mp, const char* str) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { bn = Botan::BigInt(str); }); } int botan_mp_set_from_radix_str(botan_mp_t mp, const char* str, size_t radix) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { Botan::BigInt::Base base; if(radix == 10) base = Botan::BigInt::Decimal; else if(radix == 16) base = Botan::BigInt::Hexadecimal; else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; const uint8_t* bytes = Botan::cast_char_ptr_to_uint8(str); const size_t len = strlen(str); bn = Botan::BigInt::decode(bytes, len, base); }); } int botan_mp_set_from_mp(botan_mp_t dest, const botan_mp_t source) { return BOTAN_FFI_DO(Botan::BigInt, dest, bn, { bn = safe_get(source); }); } int botan_mp_is_negative(const botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { return bn.is_negative() ? 1 : 0; }); } int botan_mp_is_positive(const botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { return bn.is_positive() ? 1 : 0; }); } int botan_mp_flip_sign(botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { bn.flip_sign(); }); } int botan_mp_from_bin(botan_mp_t mp, const uint8_t bin[], size_t bin_len) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { bn.binary_decode(bin, bin_len); }); } int botan_mp_to_hex(const botan_mp_t mp, char* out) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { std::vector hex = Botan::BigInt::encode(bn, Botan::BigInt::Hexadecimal); std::memcpy(out, hex.data(), hex.size()); out[hex.size()] = 0; // null terminate }); } int botan_mp_to_str(const botan_mp_t mp, uint8_t digit_base, char* out, size_t* out_len) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { Botan::BigInt::Base base; if(digit_base == 0 || digit_base == 10) base = Botan::BigInt::Decimal; else if(digit_base == 16) base = Botan::BigInt::Hexadecimal; else throw FFI_Error("botan_mp_to_str invalid digit base"); std::vector hex = Botan::BigInt::encode(bn, base); hex.push_back(0); // null terminator return write_str_output(out, out_len, hex); }); } int botan_mp_to_bin(const botan_mp_t mp, uint8_t vec[]) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { bn.binary_encode(vec); }); } int botan_mp_to_uint32(const botan_mp_t mp, uint32_t* val) { if(val == nullptr) { return BOTAN_FFI_ERROR_NULL_POINTER; } return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { *val = bn.to_u32bit(); }); } int botan_mp_destroy(botan_mp_t mp) { return BOTAN_FFI_CHECKED_DELETE(mp); } int botan_mp_add(botan_mp_t result, const botan_mp_t x, const botan_mp_t y) { return BOTAN_FFI_DO(Botan::BigInt, result, res, { res = safe_get(x) + safe_get(y); }); } int botan_mp_sub(botan_mp_t result, const botan_mp_t x, const botan_mp_t y) { return BOTAN_FFI_DO(Botan::BigInt, result, res, { res = safe_get(x) - safe_get(y); }); } int botan_mp_mul(botan_mp_t result, const botan_mp_t x, const botan_mp_t y) { return BOTAN_FFI_DO(Botan::BigInt, result, res, { res = safe_get(x) * safe_get(y); }); } int botan_mp_div(botan_mp_t quotient, botan_mp_t remainder, const botan_mp_t x, const botan_mp_t y) { return BOTAN_FFI_DO(Botan::BigInt, quotient, q, { Botan::BigInt r; Botan::divide(safe_get(x), safe_get(y), q, r); safe_get(remainder) = r; }); } int botan_mp_equal(const botan_mp_t x_w, const botan_mp_t y_w) { return BOTAN_FFI_DO(Botan::BigInt, x_w, x, { return x == safe_get(y_w); }); } int botan_mp_is_zero(const botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { return bn.is_zero(); }); } int botan_mp_is_odd(const botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { return bn.is_odd(); }); } int botan_mp_is_even(const botan_mp_t mp) { return BOTAN_FFI_DO(Botan::BigInt, mp, bn, { return bn.is_even(); }); } int botan_mp_cmp(int* result, const botan_mp_t x_w, const botan_mp_t y_w) { return BOTAN_FFI_DO(Botan::BigInt, x_w, x, { *result = x.cmp(safe_get(y_w)); }); } int botan_mp_swap(botan_mp_t x_w, botan_mp_t y_w) { return BOTAN_FFI_DO(Botan::BigInt, x_w, x, { x.swap(safe_get(y_w)); }); } // Return (base^exponent) % modulus int botan_mp_powmod(botan_mp_t out, const botan_mp_t base, const botan_mp_t exponent, const botan_mp_t modulus) { return BOTAN_FFI_DO(Botan::BigInt, out, o, { o = Botan::power_mod(safe_get(base), safe_get(exponent), safe_get(modulus)); }); } int botan_mp_lshift(botan_mp_t out, const botan_mp_t in, size_t shift) { return BOTAN_FFI_DO(Botan::BigInt, out, o, { o = safe_get(in) << shift; }); } int botan_mp_rshift(botan_mp_t out, const botan_mp_t in, size_t shift) { return BOTAN_FFI_DO(Botan::BigInt, out, o, { o = safe_get(in) >> shift; }); } int botan_mp_mod_inverse(botan_mp_t out, const botan_mp_t in, const botan_mp_t modulus) { return BOTAN_FFI_DO(Botan::BigInt, out, o, { o = Botan::inverse_mod(safe_get(in), safe_get(modulus)); }); } int botan_mp_mod_mul(botan_mp_t out, const botan_mp_t x, const botan_mp_t y, const botan_mp_t modulus) { return BOTAN_FFI_DO(Botan::BigInt, out, o, { Botan::Modular_Reducer reducer(safe_get(modulus)); o = reducer.multiply(safe_get(x), safe_get(y)); }); } int botan_mp_rand_bits(botan_mp_t rand_out, botan_rng_t rng, size_t bits) { return BOTAN_FFI_DO(Botan::RandomNumberGenerator, rng, r, { safe_get(rand_out).randomize(r, bits); }); } int botan_mp_rand_range(botan_mp_t rand_out, botan_rng_t rng, const botan_mp_t lower, const botan_mp_t upper) { return BOTAN_FFI_DO(Botan::RandomNumberGenerator, rng, r, { safe_get(rand_out) = Botan::BigInt::random_integer(r, safe_get(lower), safe_get(upper)); }); } int botan_mp_gcd(botan_mp_t out, const botan_mp_t x, const botan_mp_t y) { return BOTAN_FFI_DO(Botan::BigInt, out, o, { o = Botan::gcd(safe_get(x), safe_get(y)); }); } int botan_mp_is_prime(const botan_mp_t mp, botan_rng_t rng, size_t test_prob) { return BOTAN_FFI_DO(Botan::BigInt, mp, n, { return (Botan::is_prime(n, safe_get(rng), test_prob)) ? 1 : 0; }); } int botan_mp_get_bit(const botan_mp_t mp, size_t bit) { return BOTAN_FFI_DO(Botan::BigInt, mp, n, { return (n.get_bit(bit)); }); } int botan_mp_set_bit(botan_mp_t mp, size_t bit) { return BOTAN_FFI_DO(Botan::BigInt, mp, n, { n.set_bit(bit); }); } int botan_mp_clear_bit(botan_mp_t mp, size_t bit) { return BOTAN_FFI_DO(Botan::BigInt, mp, n, { n.clear_bit(bit); }); } int botan_mp_num_bits(const botan_mp_t mp, size_t* bits) { return BOTAN_FFI_DO(Botan::BigInt, mp, n, { *bits = n.bits(); }); } int botan_mp_num_bytes(const botan_mp_t mp, size_t* bytes) { return BOTAN_FFI_DO(Botan::BigInt, mp, n, { *bytes = n.bytes(); }); } } botan-2.4.0/src/lib/ffi/ffi_mp.h000066400000000000000000000004661322470703100163370ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FFI_MP_H_ #define BOTAN_FFI_MP_H_ #include #include extern "C" { BOTAN_FFI_DECLARE_STRUCT(botan_mp_struct, Botan::BigInt, 0xC828B9D2); } #endif botan-2.4.0/src/lib/ffi/ffi_pk_op.cpp000066400000000000000000000154601322470703100173660ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include extern "C" { using namespace Botan_FFI; BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_encrypt_struct, Botan::PK_Encryptor, 0x891F3FC3); BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_decrypt_struct, Botan::PK_Decryptor, 0x912F3C37); BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_sign_struct, Botan::PK_Signer, 0x1AF0C39F); BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_verify_struct, Botan::PK_Verifier, 0x2B91F936); BOTAN_FFI_DECLARE_STRUCT(botan_pk_op_ka_struct, Botan::PK_Key_Agreement, 0x2939CAB1); int botan_pk_op_encrypt_create(botan_pk_op_encrypt_t* op, botan_pubkey_t key_obj, const char* padding, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { BOTAN_ASSERT_NONNULL(op); *op = nullptr; if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; std::unique_ptr pk(new Botan::PK_Encryptor_EME(safe_get(key_obj), Botan::system_rng(), padding)); *op = new botan_pk_op_encrypt_struct(pk.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pk_op_encrypt_destroy(botan_pk_op_encrypt_t op) { return BOTAN_FFI_CHECKED_DELETE(op); } int botan_pk_op_encrypt(botan_pk_op_encrypt_t op, botan_rng_t rng_obj, uint8_t out[], size_t* out_len, const uint8_t plaintext[], size_t plaintext_len) { return BOTAN_FFI_DO(Botan::PK_Encryptor, op, o, { return write_vec_output(out, out_len, o.encrypt(plaintext, plaintext_len, safe_get(rng_obj))); }); } /* * Public Key Decryption */ int botan_pk_op_decrypt_create(botan_pk_op_decrypt_t* op, botan_privkey_t key_obj, const char* padding, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { BOTAN_ASSERT_NONNULL(op); *op = nullptr; if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; std::unique_ptr pk(new Botan::PK_Decryptor_EME(safe_get(key_obj), Botan::system_rng(), padding)); *op = new botan_pk_op_decrypt_struct(pk.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pk_op_decrypt_destroy(botan_pk_op_decrypt_t op) { return BOTAN_FFI_CHECKED_DELETE(op); } int botan_pk_op_decrypt(botan_pk_op_decrypt_t op, uint8_t out[], size_t* out_len, const uint8_t ciphertext[], size_t ciphertext_len) { return BOTAN_FFI_DO(Botan::PK_Decryptor, op, o, { return write_vec_output(out, out_len, o.decrypt(ciphertext, ciphertext_len)); }); } /* * Signature Generation */ int botan_pk_op_sign_create(botan_pk_op_sign_t* op, botan_privkey_t key_obj, const char* hash, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { BOTAN_ASSERT_NONNULL(op); *op = nullptr; if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; std::unique_ptr pk(new Botan::PK_Signer(safe_get(key_obj),Botan::system_rng(), hash)); *op = new botan_pk_op_sign_struct(pk.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pk_op_sign_destroy(botan_pk_op_sign_t op) { return BOTAN_FFI_CHECKED_DELETE(op); } int botan_pk_op_sign_update(botan_pk_op_sign_t op, const uint8_t in[], size_t in_len) { return BOTAN_FFI_DO(Botan::PK_Signer, op, o, { o.update(in, in_len); }); } int botan_pk_op_sign_finish(botan_pk_op_sign_t op, botan_rng_t rng_obj, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::PK_Signer, op, o, { return write_vec_output(out, out_len, o.signature(safe_get(rng_obj))); }); } int botan_pk_op_verify_create(botan_pk_op_verify_t* op, botan_pubkey_t key_obj, const char* hash, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { BOTAN_ASSERT_NONNULL(op); if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; std::unique_ptr pk(new Botan::PK_Verifier(safe_get(key_obj), hash)); *op = new botan_pk_op_verify_struct(pk.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pk_op_verify_destroy(botan_pk_op_verify_t op) { return BOTAN_FFI_CHECKED_DELETE(op); } int botan_pk_op_verify_update(botan_pk_op_verify_t op, const uint8_t in[], size_t in_len) { return BOTAN_FFI_DO(Botan::PK_Verifier, op, o, { o.update(in, in_len); }); } int botan_pk_op_verify_finish(botan_pk_op_verify_t op, const uint8_t sig[], size_t sig_len) { return BOTAN_FFI_DO(Botan::PK_Verifier, op, o, { const bool legit = o.check_signature(sig, sig_len); if(legit) return BOTAN_FFI_SUCCESS; else return BOTAN_FFI_INVALID_VERIFIER; }); } int botan_pk_op_key_agreement_create(botan_pk_op_ka_t* op, botan_privkey_t key_obj, const char* kdf, uint32_t flags) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { BOTAN_ASSERT_NONNULL(op); *op = nullptr; if(flags != 0) return BOTAN_FFI_ERROR_BAD_FLAG; std::unique_ptr pk(new Botan::PK_Key_Agreement(safe_get(key_obj), Botan::system_rng(), kdf)); *op = new botan_pk_op_ka_struct(pk.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pk_op_key_agreement_destroy(botan_pk_op_ka_t op) { return BOTAN_FFI_CHECKED_DELETE(op); } int botan_pk_op_key_agreement_export_public(botan_privkey_t key, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::Private_Key, key, k, { if(auto kak = dynamic_cast(&k)) return write_vec_output(out, out_len, kak->public_value()); return BOTAN_FFI_ERROR_BAD_FLAG; }); } int botan_pk_op_key_agreement(botan_pk_op_ka_t op, uint8_t out[], size_t* out_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len) { return BOTAN_FFI_DO(Botan::PK_Key_Agreement, op, o, { auto k = o.derive_key(*out_len, other_key, other_key_len, salt, salt_len).bits_of(); return write_vec_output(out, out_len, k); }); } } botan-2.4.0/src/lib/ffi/ffi_pkey.cpp000066400000000000000000000224641322470703100172300ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_HASH_ID) #include #endif extern "C" { using namespace Botan_FFI; int botan_privkey_create(botan_privkey_t* key_obj, const char* algo_name, const char* algo_params, botan_rng_t rng_obj) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(key_obj == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; *key_obj = nullptr; if(rng_obj == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; Botan::RandomNumberGenerator& rng = safe_get(rng_obj); std::unique_ptr key( Botan::create_private_key(algo_name ? algo_name : "RSA", rng, algo_params ? algo_params : "")); if(key) { *key_obj = new botan_privkey_struct(key.release()); return BOTAN_FFI_SUCCESS; } else { return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; } }); } int botan_privkey_load(botan_privkey_t* key, botan_rng_t rng_obj, const uint8_t bits[], size_t len, const char* password) { *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::DataSource_Memory src(bits, len); Botan::RandomNumberGenerator& rng = safe_get(rng_obj); std::unique_ptr pkcs8; if(password == nullptr) { pkcs8.reset(Botan::PKCS8::load_key(src, rng)); } else { pkcs8.reset(Botan::PKCS8::load_key(src, rng, static_cast(password))); } if(pkcs8) { *key = new botan_privkey_struct(pkcs8.release()); return BOTAN_FFI_SUCCESS; } return BOTAN_FFI_ERROR_UNKNOWN_ERROR; }); } int botan_privkey_destroy(botan_privkey_t key) { return BOTAN_FFI_CHECKED_DELETE(key); } int botan_pubkey_load(botan_pubkey_t* key, const uint8_t bits[], size_t bits_len) { *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::DataSource_Memory src(bits, bits_len); std::unique_ptr pubkey(Botan::X509::load_key(src)); if(pubkey == nullptr) return BOTAN_FFI_ERROR_UNKNOWN_ERROR; *key = new botan_pubkey_struct(pubkey.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pubkey_destroy(botan_pubkey_t key) { return BOTAN_FFI_CHECKED_DELETE(key); } int botan_privkey_export_pubkey(botan_pubkey_t* pubout, botan_privkey_t key_obj) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr pubkey(Botan::X509::load_key(Botan::X509::BER_encode(safe_get(key_obj)))); *pubout = new botan_pubkey_struct(pubkey.release()); return BOTAN_FFI_SUCCESS; }); } int botan_pubkey_algo_name(botan_pubkey_t key, char out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::Public_Key, key, k, { return write_str_output(out, out_len, k.algo_name()); }); } int botan_pubkey_check_key(botan_pubkey_t key, botan_rng_t rng, uint32_t flags) { const bool strong = (flags & BOTAN_CHECK_KEY_EXPENSIVE_TESTS); return BOTAN_FFI_DO(Botan::Public_Key, key, k, { return (k.check_key(safe_get(rng), strong) == true) ? 0 : -1; }); } int botan_privkey_check_key(botan_privkey_t key, botan_rng_t rng, uint32_t flags) { const bool strong = (flags & BOTAN_CHECK_KEY_EXPENSIVE_TESTS); return BOTAN_FFI_DO(Botan::Private_Key, key, k, { return (k.check_key(safe_get(rng), strong) == true) ? 0 : -1; }); } int botan_pubkey_export(botan_pubkey_t key, uint8_t out[], size_t* out_len, uint32_t flags) { return BOTAN_FFI_DO(Botan::Public_Key, key, k, { if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) return write_vec_output(out, out_len, Botan::X509::BER_encode(k)); else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) return write_str_output(out, out_len, Botan::X509::PEM_encode(k)); else return BOTAN_FFI_ERROR_BAD_FLAG; }); } int botan_privkey_export(botan_privkey_t key, uint8_t out[], size_t* out_len, uint32_t flags) { return BOTAN_FFI_DO(Botan::Private_Key, key, k, { if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) return write_vec_output(out, out_len, Botan::PKCS8::BER_encode(k)); else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) return write_str_output(out, out_len, Botan::PKCS8::PEM_encode(k)); else return BOTAN_FFI_ERROR_BAD_FLAG; }); } int botan_privkey_export_encrypted(botan_privkey_t key, uint8_t out[], size_t* out_len, botan_rng_t rng_obj, const char* pass, const char* /*ignored - pbe*/, uint32_t flags) { return botan_privkey_export_encrypted_pbkdf_iter(key, out, out_len, rng_obj, pass, 100000, nullptr, nullptr, flags); } int botan_privkey_export_encrypted_pbkdf_msec(botan_privkey_t key, uint8_t out[], size_t* out_len, botan_rng_t rng_obj, const char* pass, uint32_t pbkdf_msec, size_t* pbkdf_iters_out, const char* maybe_cipher, const char* maybe_pbkdf_hash, uint32_t flags) { return BOTAN_FFI_DO(Botan::Private_Key, key, k, { const std::chrono::milliseconds pbkdf_time(pbkdf_msec); Botan::RandomNumberGenerator& rng = safe_get(rng_obj); const std::string cipher = (maybe_cipher ? maybe_cipher : ""); const std::string pbkdf_hash = (maybe_pbkdf_hash ? maybe_pbkdf_hash : ""); if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) { return write_vec_output(out, out_len, Botan::PKCS8::BER_encode_encrypted_pbkdf_msec(k, rng, pass, pbkdf_time, pbkdf_iters_out, cipher, pbkdf_hash)); } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) { return write_str_output(out, out_len, Botan::PKCS8::PEM_encode_encrypted_pbkdf_msec(k, rng, pass, pbkdf_time, pbkdf_iters_out, cipher, pbkdf_hash)); } else { return -2; } }); } int botan_privkey_export_encrypted_pbkdf_iter(botan_privkey_t key, uint8_t out[], size_t* out_len, botan_rng_t rng_obj, const char* pass, size_t pbkdf_iter, const char* maybe_cipher, const char* maybe_pbkdf_hash, uint32_t flags) { return BOTAN_FFI_DO(Botan::Private_Key, key, k, { Botan::RandomNumberGenerator& rng = safe_get(rng_obj); const std::string cipher = (maybe_cipher ? maybe_cipher : ""); const std::string pbkdf_hash = (maybe_pbkdf_hash ? maybe_pbkdf_hash : ""); if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_DER) { return write_vec_output(out, out_len, Botan::PKCS8::BER_encode_encrypted_pbkdf_iter(k, rng, pass, pbkdf_iter, cipher, pbkdf_hash)); } else if(flags == BOTAN_PRIVKEY_EXPORT_FLAG_PEM) { return write_str_output(out, out_len, Botan::PKCS8::PEM_encode_encrypted_pbkdf_iter(k, rng, pass, pbkdf_iter, cipher, pbkdf_hash)); } else { return -2; } }); } int botan_pubkey_estimated_strength(botan_pubkey_t key, size_t* estimate) { return BOTAN_FFI_DO(Botan::Public_Key, key, k, { *estimate = k.estimated_strength(); }); } int botan_pubkey_fingerprint(botan_pubkey_t key, const char* hash_fn, uint8_t out[], size_t* out_len) { return BOTAN_FFI_DO(Botan::Public_Key, key, k, { std::unique_ptr h(Botan::HashFunction::create(hash_fn)); return write_vec_output(out, out_len, h->process(k.public_key_bits())); }); } int botan_pkcs_hash_id(const char* hash_name, uint8_t pkcs_id[], size_t* pkcs_id_len) { #if defined(BOTAN_HAS_HASH_ID) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const std::vector hash_id = Botan::pkcs_hash_id(hash_name); return write_output(pkcs_id, pkcs_id_len, hash_id.data(), hash_id.size()); }); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } } botan-2.4.0/src/lib/ffi/ffi_pkey.h000066400000000000000000000006231322470703100166660ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FFI_PKEY_H_ #define BOTAN_FFI_PKEY_H_ #include #include extern "C" { BOTAN_FFI_DECLARE_STRUCT(botan_pubkey_struct, Botan::Public_Key, 0x2C286519); BOTAN_FFI_DECLARE_STRUCT(botan_privkey_struct, Botan::Private_Key, 0x7F96385E); } #endif botan-2.4.0/src/lib/ffi/ffi_pkey_algs.cpp000066400000000000000000000610371322470703100202350ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) #include #endif #if defined(BOTAN_HAS_DL_PUBLIC_KEY_FAMILY) #include #endif #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_ELGAMAL) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_SM2) #include #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif #if defined(BOTAN_HAS_CURVE_25519) #include #endif #if defined(BOTAN_HAS_ED25519) #include #endif #if defined(BOTAN_HAS_MCELIECE) #include #endif #if defined(BOTAN_HAS_MCEIES) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif namespace { #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) // These are always called within an existing try/catch block template int privkey_load_ec(std::unique_ptr& key, const Botan::BigInt& scalar, const char* curve_name) { if(curve_name == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; Botan::Null_RNG null_rng; Botan::EC_Group grp(curve_name); key.reset(new ECPrivateKey_t(null_rng, grp, scalar)); return BOTAN_FFI_SUCCESS; } template int pubkey_load_ec(std::unique_ptr& key, const Botan::BigInt& public_x, const Botan::BigInt& public_y, const char* curve_name) { if(curve_name == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; Botan::EC_Group grp(curve_name); Botan::PointGFp uncompressed_point(grp.get_curve(), public_x, public_y); key.reset(new ECPublicKey_t(grp, uncompressed_point)); return BOTAN_FFI_SUCCESS; } #endif Botan::BigInt pubkey_get_field(const Botan::Public_Key& key, const std::string& field) { // Maybe this should be `return key.get_integer_field(field_name)`? #if defined(BOTAN_HAS_RSA) if(const Botan::RSA_PublicKey* rsa = dynamic_cast(&key)) { if(field == "n") return rsa->get_n(); else if(field == "e") return rsa->get_e(); else throw Botan::Exception("Field not supported"); } #endif #if defined(BOTAN_HAS_DL_PUBLIC_KEY_FAMILY) // Handles DSA, ElGamal, etc if(const Botan::DL_Scheme_PublicKey* dl = dynamic_cast(&key)) { if(field == "p") return dl->group_p(); else if(field == "q") return dl->group_q(); else if(field == "g") return dl->group_g(); else if(field == "y") return dl->get_y(); else throw Botan::Exception("Field not supported"); } #endif #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) if(const Botan::EC_PublicKey* ecc = dynamic_cast(&key)) { if(field == "public_x") return ecc->public_point().get_affine_x(); else if(field == "public_y") return ecc->public_point().get_affine_y(); else if(field == "base_x") return ecc->domain().get_base_point().get_affine_x(); else if(field == "base_y") return ecc->domain().get_base_point().get_affine_y(); else if(field == "p") return ecc->domain().get_curve().get_p(); else if(field == "a") return ecc->domain().get_curve().get_a(); else if(field == "b") return ecc->domain().get_curve().get_b(); else if(field == "cofactor") return ecc->domain().get_cofactor(); else if(field == "order") return ecc->domain().get_order(); else throw Botan::Exception("Field not supported"); } #endif // Some other algorithm type not supported by this function throw Botan::Exception("Unsupported algorithm type for botan_pubkey_get_field"); } Botan::BigInt privkey_get_field(const Botan::Private_Key& key, const std::string& field) { //return key.get_integer_field(field); #if defined(BOTAN_HAS_RSA) if(const Botan::RSA_PrivateKey* rsa = dynamic_cast(&key)) { if(field == "p") return rsa->get_p(); else if(field == "q") return rsa->get_q(); else if(field == "d") return rsa->get_d(); else if(field == "c") return rsa->get_c(); else if(field == "d1") return rsa->get_d1(); else if(field == "d2") return rsa->get_d2(); else return pubkey_get_field(key, field); } #endif #if defined(BOTAN_HAS_DL_PUBLIC_KEY_FAMILY) // Handles DSA, ElGamal, etc if(const Botan::DL_Scheme_PrivateKey* dl = dynamic_cast(&key)) { if(field == "x") return dl->get_x(); else return pubkey_get_field(key, field); } #endif #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) if(const Botan::EC_PrivateKey* ecc = dynamic_cast(&key)) { if(field == "x") return ecc->private_value(); else return pubkey_get_field(key, field); } #endif // Some other algorithm type not supported by this function throw Botan::Exception("Unsupported algorithm type for botan_privkey_get_field"); } } extern "C" { using namespace Botan_FFI; int botan_pubkey_get_field(botan_mp_t output, botan_pubkey_t key, const char* field_name_cstr) { if(field_name_cstr == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; const std::string field_name(field_name_cstr); return BOTAN_FFI_DO(Botan::Public_Key, key, k, { safe_get(output) = pubkey_get_field(k, field_name); }); } int botan_privkey_get_field(botan_mp_t output, botan_privkey_t key, const char* field_name_cstr) { if(field_name_cstr == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; const std::string field_name(field_name_cstr); return BOTAN_FFI_DO(Botan::Private_Key, key, k, { safe_get(output) = privkey_get_field(k, field_name); }); } /* RSA specific operations */ int botan_privkey_create_rsa(botan_privkey_t* key_obj, botan_rng_t rng_obj, size_t n_bits) { if(n_bits < 1024 || n_bits > 16*1024) return BOTAN_FFI_ERROR_BAD_PARAMETER; std::string n_str = std::to_string(n_bits); return botan_privkey_create(key_obj, "RSA", n_str.c_str(), rng_obj); } int botan_privkey_load_rsa(botan_privkey_t* key, botan_mp_t rsa_p, botan_mp_t rsa_q, botan_mp_t rsa_e) { #if defined(BOTAN_HAS_RSA) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { *key = new botan_privkey_struct(new Botan::RSA_PrivateKey(safe_get(rsa_p), safe_get(rsa_q), safe_get(rsa_e))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, rsa_p, rsa_q, rsa_e); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_load_rsa(botan_pubkey_t* key, botan_mp_t n, botan_mp_t e) { #if defined(BOTAN_HAS_RSA) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { *key = new botan_pubkey_struct(new Botan::RSA_PublicKey(safe_get(n), safe_get(e))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, n, e); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_rsa_get_p(botan_mp_t p, botan_privkey_t key) { return botan_privkey_get_field(p, key, "p"); } int botan_privkey_rsa_get_q(botan_mp_t q, botan_privkey_t key) { return botan_privkey_get_field(q, key, "q"); } int botan_privkey_rsa_get_n(botan_mp_t n, botan_privkey_t key) { return botan_privkey_get_field(n, key, "n"); } int botan_privkey_rsa_get_e(botan_mp_t e, botan_privkey_t key) { return botan_privkey_get_field(e, key, "e"); } int botan_privkey_rsa_get_d(botan_mp_t d, botan_privkey_t key) { return botan_privkey_get_field(d, key, "d"); } int botan_pubkey_rsa_get_e(botan_mp_t e, botan_pubkey_t key) { return botan_pubkey_get_field(e, key, "e"); } int botan_pubkey_rsa_get_n(botan_mp_t n, botan_pubkey_t key) { return botan_pubkey_get_field(n, key, "n"); } /* DSA specific operations */ int botan_privkey_load_dsa(botan_privkey_t* key, botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t x) { #if defined(BOTAN_HAS_DSA) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::Null_RNG null_rng; Botan::DL_Group group(safe_get(p), safe_get(q), safe_get(g)); *key = new botan_privkey_struct(new Botan::DSA_PrivateKey(null_rng, group, safe_get(x))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, p, q, g, x); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_load_dsa(botan_pubkey_t* key, botan_mp_t p, botan_mp_t q, botan_mp_t g, botan_mp_t y) { #if defined(BOTAN_HAS_DSA) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::DL_Group group(safe_get(p), safe_get(q), safe_get(g)); *key = new botan_pubkey_struct(new Botan::DSA_PublicKey(group, safe_get(y))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, p, q, g, y); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_dsa_get_x(botan_mp_t x, botan_privkey_t key) { return botan_privkey_get_field(x, key, "x"); } int botan_pubkey_dsa_get_p(botan_mp_t p, botan_pubkey_t key) { return botan_pubkey_get_field(p, key, "p"); } int botan_pubkey_dsa_get_q(botan_mp_t q, botan_pubkey_t key) { return botan_pubkey_get_field(q, key, "q"); } int botan_pubkey_dsa_get_g(botan_mp_t g, botan_pubkey_t key) { return botan_pubkey_get_field(g, key, "g"); } int botan_pubkey_dsa_get_y(botan_mp_t y, botan_pubkey_t key) { return botan_pubkey_get_field(y, key, "y"); } int botan_privkey_create_ecdsa(botan_privkey_t* key_obj, botan_rng_t rng_obj, const char* param_str) { return botan_privkey_create(key_obj, "ECDSA", param_str, rng_obj); } /* ECDSA specific operations */ int botan_pubkey_load_ecdsa(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name) { #if defined(BOTAN_HAS_ECDSA) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; int rc = pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name); if(rc == BOTAN_FFI_SUCCESS) *key = new botan_pubkey_struct(p_key.release()); return rc; }); #else BOTAN_UNUSED(key, public_x, public_y, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_load_ecdsa(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name) { #if defined(BOTAN_HAS_ECDSA) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name); if(rc == BOTAN_FFI_SUCCESS) *key = new botan_privkey_struct(p_key.release()); return rc; }); #else BOTAN_UNUSED(key, scalar, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } /* ElGamal specific operations */ int botan_pubkey_load_elgamal(botan_pubkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t y) { #if defined(BOTAN_HAS_ELGAMAL) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::DL_Group group(safe_get(p), safe_get(g)); *key = new botan_pubkey_struct(new Botan::ElGamal_PublicKey(group, safe_get(y))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, p, g, y); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_load_elgamal(botan_privkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t x) { #if defined(BOTAN_HAS_ELGAMAL) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::Null_RNG null_rng; Botan::DL_Group group(safe_get(p), safe_get(g)); *key = new botan_privkey_struct(new Botan::ElGamal_PrivateKey(null_rng, group, safe_get(x))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, p, g, x); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } /* Diffie Hellman specific operations */ int botan_privkey_create_dh(botan_privkey_t* key_obj, botan_rng_t rng_obj, const char* param_str) { return botan_privkey_create(key_obj, "DH", param_str, rng_obj); } int botan_privkey_load_dh(botan_privkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t x) { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::Null_RNG null_rng; Botan::DL_Group group(safe_get(p), safe_get(g)); *key = new botan_privkey_struct(new Botan::DH_PrivateKey(null_rng, group, safe_get(x))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, p, g, x); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_load_dh(botan_pubkey_t* key, botan_mp_t p, botan_mp_t g, botan_mp_t y) { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::DL_Group group(safe_get(p), safe_get(g)); *key = new botan_pubkey_struct(new Botan::DH_PublicKey(group, safe_get(y))); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, p, g, y); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } /* ECDH + x25519 specific operations */ int botan_privkey_create_ecdh(botan_privkey_t* key_obj, botan_rng_t rng_obj, const char* param_str) { if(param_str == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; const std::string params(param_str); if(params == "curve25519") return botan_privkey_create(key_obj, "Curve25519", "", rng_obj); return botan_privkey_create(key_obj, "ECDH", param_str, rng_obj); } int botan_pubkey_load_ecdh(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name) { #if defined(BOTAN_HAS_ECDH) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; int rc = pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name); if(rc == BOTAN_FFI_SUCCESS) *key = new botan_pubkey_struct(p_key.release()); return rc; }); #else BOTAN_UNUSED(key, public_x, public_y, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_load_ecdh(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name) { #if defined(BOTAN_HAS_ECDH) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name); if(rc == BOTAN_FFI_SUCCESS) *key = new botan_privkey_struct(p_key.release()); return rc; }); #else BOTAN_UNUSED(key, scalar, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } /* SM2 specific operations */ int botan_pubkey_sm2_compute_za(uint8_t out[], size_t* out_len, const char* ident, const char* hash_algo, const botan_pubkey_t key) { if(out == nullptr || out_len == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; if(ident == nullptr || hash_algo == nullptr || key == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; #if defined(BOTAN_HAS_SM2) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const Botan::Public_Key& pub_key = safe_get(key); const Botan::EC_PublicKey* ec_key = dynamic_cast(&pub_key); if(ec_key == nullptr) return BOTAN_FFI_ERROR_BAD_PARAMETER; if(ec_key->algo_name() != "SM2_Sig" && ec_key->algo_name() != "SM2_Enc") return BOTAN_FFI_ERROR_BAD_PARAMETER; const std::string ident_str(ident); std::unique_ptr hash = Botan::HashFunction::create_or_throw(hash_algo); const std::vector za = Botan::sm2_compute_za(*hash, ident_str, ec_key->domain(), ec_key->public_point()); return write_vec_output(out, out_len, za); }); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_load_sm2(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name) { #if defined(BOTAN_HAS_SM2) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; if(!pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name)) { *key = new botan_pubkey_struct(p_key.release()); return BOTAN_FFI_SUCCESS; } return BOTAN_FFI_ERROR_UNKNOWN_ERROR; }); #else BOTAN_UNUSED(key, public_x, public_y, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_load_sm2(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name) { #if defined(BOTAN_HAS_SM2) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name); if(rc == BOTAN_FFI_SUCCESS) *key = new botan_privkey_struct(p_key.release()); return rc; }); #else BOTAN_UNUSED(key, scalar, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_load_sm2_enc(botan_pubkey_t* key, const botan_mp_t public_x, const botan_mp_t public_y, const char* curve_name) { #if defined(BOTAN_HAS_SM2) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; if(!pubkey_load_ec(p_key, safe_get(public_x), safe_get(public_y), curve_name)) { *key = new botan_pubkey_struct(p_key.release()); return BOTAN_FFI_SUCCESS; } return BOTAN_FFI_ERROR_UNKNOWN_ERROR; }); #else BOTAN_UNUSED(key, public_x, public_y, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_load_sm2_enc(botan_privkey_t* key, const botan_mp_t scalar, const char* curve_name) { #if defined(BOTAN_HAS_SM2) return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { std::unique_ptr p_key; int rc = privkey_load_ec(p_key, safe_get(scalar), curve_name); if(rc == BOTAN_FFI_SUCCESS) *key = new botan_privkey_struct(p_key.release()); return rc; }); #else BOTAN_UNUSED(key, scalar, curve_name); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } /* Ed25519 specific operations */ int botan_privkey_load_ed25519(botan_privkey_t* key, const uint8_t privkey[32]) { #if defined(BOTAN_HAS_ED25519) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const Botan::secure_vector privkey_vec(privkey, privkey + 32); *key = new botan_privkey_struct(new Botan::Ed25519_PrivateKey(privkey_vec)); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, privkey); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_load_ed25519(botan_pubkey_t* key, const uint8_t pubkey[32]) { #if defined(BOTAN_HAS_ED25519) *key = nullptr; return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { const std::vector pubkey_vec(pubkey, pubkey + 32); *key = new botan_pubkey_struct(new Botan::Ed25519_PublicKey(pubkey_vec)); return BOTAN_FFI_SUCCESS; }); #else BOTAN_UNUSED(key, pubkey); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_ed25519_get_privkey(botan_privkey_t key, uint8_t output[64]) { #if defined(BOTAN_HAS_ED25519) return BOTAN_FFI_DO(Botan::Private_Key, key, k, { if(Botan::Ed25519_PrivateKey* ed = dynamic_cast(&k)) { const Botan::secure_vector& ed_key = ed->get_private_key(); if(ed_key.size() != 64) return BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE; Botan::copy_mem(output, ed_key.data(), ed_key.size()); return BOTAN_FFI_SUCCESS; } else { return BOTAN_FFI_ERROR_BAD_PARAMETER; } }); #else BOTAN_UNUSED(key, output); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_pubkey_ed25519_get_pubkey(botan_pubkey_t key, uint8_t output[32]) { #if defined(BOTAN_HAS_ED25519) return BOTAN_FFI_DO(Botan::Public_Key, key, k, { if(Botan::Ed25519_PublicKey* ed = dynamic_cast(&k)) { const std::vector& ed_key = ed->get_public_key(); if(ed_key.size() != 32) return BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE; Botan::copy_mem(output, ed_key.data(), ed_key.size()); return BOTAN_FFI_SUCCESS; } else { return BOTAN_FFI_ERROR_BAD_PARAMETER; } }); #else BOTAN_UNUSED(key, output); return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif } int botan_privkey_create_mceliece(botan_privkey_t* key_obj, botan_rng_t rng_obj, size_t n, size_t t) { const std::string mce_params = std::to_string(n) + "," + std::to_string(t); return botan_privkey_create(key_obj, "McEliece", mce_params.c_str(), rng_obj); } int botan_mceies_decrypt(botan_privkey_t mce_key_obj, const char* aead, const uint8_t ct[], size_t ct_len, const uint8_t ad[], size_t ad_len, uint8_t out[], size_t* out_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::Private_Key& key = safe_get(mce_key_obj); #if defined(BOTAN_HAS_MCELIECE) && defined(BOTAN_HAS_MCEIES) Botan::McEliece_PrivateKey* mce = dynamic_cast(&key); if(!mce) return BOTAN_FFI_ERROR_BAD_PARAMETER; const Botan::secure_vector pt = mceies_decrypt(*mce, ct, ct_len, ad, ad_len, aead); return write_vec_output(out, out_len, pt); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif }); } int botan_mceies_encrypt(botan_pubkey_t mce_key_obj, botan_rng_t rng_obj, const char* aead, const uint8_t pt[], size_t pt_len, const uint8_t ad[], size_t ad_len, uint8_t out[], size_t* out_len) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { Botan::Public_Key& key = safe_get(mce_key_obj); Botan::RandomNumberGenerator& rng = safe_get(rng_obj); #if defined(BOTAN_HAS_MCELIECE) && defined(BOTAN_HAS_MCEIES) Botan::McEliece_PublicKey* mce = dynamic_cast(&key); if(!mce) return BOTAN_FFI_ERROR_BAD_PARAMETER; Botan::secure_vector ct = mceies_encrypt(*mce, pt, pt_len, ad, ad_len, rng, aead); return write_vec_output(out, out_len, ct); #else return BOTAN_FFI_ERROR_NOT_IMPLEMENTED; #endif }); } } botan-2.4.0/src/lib/ffi/ffi_rng.cpp000066400000000000000000000025661322470703100170470ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include extern "C" { using namespace Botan_FFI; int botan_rng_init(botan_rng_t* rng_out, const char* rng_type) { return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int { if(rng_out == nullptr) return BOTAN_FFI_ERROR_NULL_POINTER; const std::string rng_type_s(rng_type ? rng_type : "system"); std::unique_ptr rng; if(rng_type_s == "system") rng.reset(new Botan::System_RNG); else if(rng_type_s == "user") rng.reset(new Botan::AutoSeeded_RNG); else return BOTAN_FFI_ERROR_BAD_PARAMETER; *rng_out = new botan_rng_struct(rng.release()); return BOTAN_FFI_SUCCESS; }); } int botan_rng_destroy(botan_rng_t rng) { return BOTAN_FFI_CHECKED_DELETE(rng); } int botan_rng_get(botan_rng_t rng, uint8_t* out, size_t out_len) { return BOTAN_FFI_DO(Botan::RandomNumberGenerator, rng, r, { r.randomize(out, out_len); }); } int botan_rng_reseed(botan_rng_t rng, size_t bits) { return BOTAN_FFI_DO(Botan::RandomNumberGenerator, rng, r, { r.reseed_from_rng(Botan::system_rng(), bits); }); } } botan-2.4.0/src/lib/ffi/ffi_rng.h000066400000000000000000000005051322470703100165030ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FFI_RNG_H_ #define BOTAN_FFI_RNG_H_ #include #include extern "C" { BOTAN_FFI_DECLARE_STRUCT(botan_rng_struct, Botan::RandomNumberGenerator, 0x4901F9C1); } #endif botan-2.4.0/src/lib/ffi/ffi_util.h000066400000000000000000000105471322470703100167010ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FFI_UTILS_H_ #define BOTAN_FFI_UTILS_H_ #include #include #include #include #include namespace Botan_FFI { class FFI_Error final : public Botan::Exception { public: explicit FFI_Error(const std::string& what) : Exception("FFI error", what) {} }; template struct botan_struct { public: botan_struct(T* obj) : m_magic(MAGIC), m_obj(obj) {} virtual ~botan_struct() { m_magic = 0; m_obj.reset(); } bool magic_ok() const { return (m_magic == MAGIC); } T* unsafe_get() const { return m_obj.get(); } private: uint32_t m_magic = 0; std::unique_ptr m_obj; }; #define BOTAN_FFI_DECLARE_STRUCT(NAME, TYPE, MAGIC) \ struct NAME final : public Botan_FFI::botan_struct { explicit NAME(TYPE* x) : botan_struct(x) {} } // Declared in ffi.cpp int ffi_error_exception_thrown(const char* func_name, const char* exn); template T& safe_get(botan_struct* p) { if(!p) throw FFI_Error("Null pointer argument"); if(p->magic_ok() == false) throw FFI_Error("Bad magic in ffi object"); T* t = p->unsafe_get(); if(t) return *t; else throw FFI_Error("Invalid object pointer"); } template int ffi_guard_thunk(const char* func_name, Thunk thunk) { try { return thunk(); } catch(std::bad_alloc&) { return ffi_error_exception_thrown(func_name, "bad_alloc"); } catch(std::exception& e) { return ffi_error_exception_thrown(func_name, e.what()); } catch(...) { return ffi_error_exception_thrown(func_name, "unknown exception"); } return BOTAN_FFI_ERROR_UNKNOWN_ERROR; } template int apply_fn(botan_struct* o, const char* func_name, F func) { if(!o) return BOTAN_FFI_ERROR_NULL_POINTER; if(o->magic_ok() == false) return BOTAN_FFI_ERROR_INVALID_OBJECT; return ffi_guard_thunk(func_name, [&]() { return func(*o->unsafe_get()); }); } #define BOTAN_FFI_DO(T, obj, param, block) \ apply_fn(obj, BOTAN_CURRENT_FUNCTION, \ [=](T& param) -> int { do { block } while(0); return BOTAN_FFI_SUCCESS; }) template int ffi_delete_object(botan_struct* obj, const char* func_name) { try { if(obj == nullptr) return BOTAN_FFI_SUCCESS; // ignore delete of null objects if(obj->magic_ok() == false) return BOTAN_FFI_ERROR_INVALID_OBJECT; delete obj; return BOTAN_FFI_SUCCESS; } catch(std::exception& e) { return ffi_error_exception_thrown(func_name, e.what()); } catch(...) { return ffi_error_exception_thrown(func_name, "unknown exception"); } } #define BOTAN_FFI_CHECKED_DELETE(o) ffi_delete_object(o, BOTAN_CURRENT_FUNCTION) inline int write_output(uint8_t out[], size_t* out_len, const uint8_t buf[], size_t buf_len) { const size_t avail = *out_len; *out_len = buf_len; if(avail >= buf_len) { Botan::copy_mem(out, buf, buf_len); return BOTAN_FFI_SUCCESS; } else { Botan::clear_mem(out, avail); return BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE; } } template int write_vec_output(uint8_t out[], size_t* out_len, const std::vector& buf) { return write_output(out, out_len, buf.data(), buf.size()); } inline int write_str_output(uint8_t out[], size_t* out_len, const std::string& str) { return write_output(out, out_len, Botan::cast_char_ptr_to_uint8(str.data()), str.size() + 1); } inline int write_str_output(char out[], size_t* out_len, const std::string& str) { return write_str_output(Botan::cast_char_ptr_to_uint8(out), out_len, str); } inline int write_str_output(char out[], size_t* out_len, const std::vector& str_vec) { return write_output(Botan::cast_char_ptr_to_uint8(out), out_len, str_vec.data(), str_vec.size()); } } #endif botan-2.4.0/src/lib/ffi/info.txt000066400000000000000000000003571322470703100164210ustar00rootroot00000000000000 FFI -> 20170815 ffi_mp.h ffi_pkey.h ffi_rng.h ffi_util.h ffi.h aead kdf pbkdf pubkey bigint x509 #tls system_rng auto_rng botan-2.4.0/src/lib/filters/000077500000000000000000000000001322470703100156245ustar00rootroot00000000000000botan-2.4.0/src/lib/filters/aead_filt.h000066400000000000000000000016201322470703100177040ustar00rootroot00000000000000/* * Filter interface for AEAD Modes * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_FILTER_H_ #define BOTAN_AEAD_FILTER_H_ #include #include namespace Botan { /** * Filter interface for AEAD Modes */ class AEAD_Filter final : public Cipher_Mode_Filter { public: AEAD_Filter(AEAD_Mode* aead) : Cipher_Mode_Filter(aead) {} /** * Set associated data that is not included in the ciphertext but * that should be authenticated. Must be called after set_key * and before end_msg. * * @param ad the associated data * @param ad_len length of add in bytes */ void set_associated_data(const uint8_t ad[], size_t ad_len) { dynamic_cast(get_transform()).set_associated_data(ad, ad_len); } }; } #endif botan-2.4.0/src/lib/filters/algo_filt.cpp000066400000000000000000000041041322470703100202670ustar00rootroot00000000000000/* * Filters * (C) 1999-2007,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { StreamCipher_Filter::StreamCipher_Filter(StreamCipher* cipher) : m_buffer(DEFAULT_BUFFERSIZE), m_cipher(cipher) { } StreamCipher_Filter::StreamCipher_Filter(StreamCipher* cipher, const SymmetricKey& key) : m_buffer(DEFAULT_BUFFERSIZE), m_cipher(cipher) { m_cipher->set_key(key); } StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name) : m_buffer(DEFAULT_BUFFERSIZE), m_cipher(StreamCipher::create_or_throw(sc_name)) { } StreamCipher_Filter::StreamCipher_Filter(const std::string& sc_name, const SymmetricKey& key) : m_buffer(DEFAULT_BUFFERSIZE), m_cipher(StreamCipher::create_or_throw(sc_name)) { m_cipher->set_key(key); } void StreamCipher_Filter::write(const uint8_t input[], size_t length) { while(length) { size_t copied = std::min(length, m_buffer.size()); m_cipher->cipher(input, m_buffer.data(), copied); send(m_buffer, copied); input += copied; length -= copied; } } Hash_Filter::Hash_Filter(const std::string& hash_name, size_t len) : m_hash(HashFunction::create_or_throw(hash_name)), m_out_len(len) { } void Hash_Filter::end_msg() { secure_vector output = m_hash->final(); if(m_out_len) send(output, std::min(m_out_len, output.size())); else send(output); } MAC_Filter::MAC_Filter(const std::string& mac_name, size_t len) : m_mac(MessageAuthenticationCode::create_or_throw(mac_name)), m_out_len(len) { } MAC_Filter::MAC_Filter(const std::string& mac_name, const SymmetricKey& key, size_t len) : m_mac(MessageAuthenticationCode::create_or_throw(mac_name)), m_out_len(len) { m_mac->set_key(key); } void MAC_Filter::end_msg() { secure_vector output = m_mac->final(); if(m_out_len) send(output, std::min(m_out_len, output.size())); else send(output); } } botan-2.4.0/src/lib/filters/basefilt.cpp000066400000000000000000000022721322470703100201240ustar00rootroot00000000000000/* * Basic Filters * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { void Keyed_Filter::set_iv(const InitializationVector& iv) { if(iv.length() != 0) throw Invalid_IV_Length(name(), iv.length()); } /* * Chain Constructor */ Chain::Chain(Filter* f1, Filter* f2, Filter* f3, Filter* f4) { if(f1) { attach(f1); incr_owns(); } if(f2) { attach(f2); incr_owns(); } if(f3) { attach(f3); incr_owns(); } if(f4) { attach(f4); incr_owns(); } } /* * Chain Constructor */ Chain::Chain(Filter* filters[], size_t count) { for(size_t j = 0; j != count; ++j) if(filters[j]) { attach(filters[j]); incr_owns(); } } std::string Chain::name() const { return "Chain"; } /* * Fork Constructor */ Fork::Fork(Filter* f1, Filter* f2, Filter* f3, Filter* f4) { Filter* filters[4] = { f1, f2, f3, f4 }; set_next(filters, 4); } /* * Fork Constructor */ Fork::Fork(Filter* filters[], size_t count) { set_next(filters, count); } std::string Fork::name() const { return "Fork"; } } botan-2.4.0/src/lib/filters/basefilt.h000066400000000000000000000065351322470703100175770ustar00rootroot00000000000000/* * Basic Filters * (C) 1999-2007 Jack Lloyd * (C) 2013 Joel Low * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BASEFILT_H_ #define BOTAN_BASEFILT_H_ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #endif namespace Botan { /** * BitBucket is a filter which simply discards all inputs */ class BOTAN_PUBLIC_API(2,0) BitBucket final : public Filter { public: void write(const uint8_t[], size_t) override { /* discard */ } std::string name() const override { return "BitBucket"; } }; /** * This class represents Filter chains. A Filter chain is an ordered * concatenation of Filters, the input to a Chain sequentially passes * through all the Filters contained in the Chain. */ class BOTAN_PUBLIC_API(2,0) Chain final : public Fanout_Filter { public: void write(const uint8_t input[], size_t length) override { send(input, length); } std::string name() const override; /** * Construct a chain of up to four filters. The filters are set * up in the same order as the arguments. */ Chain(Filter* = nullptr, Filter* = nullptr, Filter* = nullptr, Filter* = nullptr); /** * Construct a chain from range of filters * @param filter_arr the list of filters * @param length how many filters */ Chain(Filter* filter_arr[], size_t length); }; /** * This class represents a fork filter, whose purpose is to fork the * flow of data. It causes an input message to result in n messages at * the end of the filter, where n is the number of forks. */ class BOTAN_PUBLIC_API(2,0) Fork : public Fanout_Filter { public: void write(const uint8_t input[], size_t length) override { send(input, length); } void set_port(size_t n) { Fanout_Filter::set_port(n); } std::string name() const override; /** * Construct a Fork filter with up to four forks. */ Fork(Filter*, Filter*, Filter* = nullptr, Filter* = nullptr); /** * Construct a Fork from range of filters * @param filter_arr the list of filters * @param length how many filters */ Fork(Filter* filter_arr[], size_t length); }; #if defined(BOTAN_TARGET_OS_HAS_THREADS) /** * This class is a threaded version of the Fork filter. While this uses * threads, the class itself is NOT thread-safe. This is meant as a drop- * in replacement for Fork where performance gains are possible. */ class BOTAN_PUBLIC_API(2,0) Threaded_Fork final : public Fork { public: std::string name() const override; /** * Construct a Threaded_Fork filter with up to four forks. */ Threaded_Fork(Filter*, Filter*, Filter* = nullptr, Filter* = nullptr); /** * Construct a Threaded_Fork from range of filters * @param filter_arr the list of filters * @param length how many filters */ Threaded_Fork(Filter* filter_arr[], size_t length); ~Threaded_Fork(); private: void set_next(Filter* f[], size_t n); void send(const uint8_t in[], size_t length) override; void thread_delegate_work(const uint8_t input[], size_t length); void thread_entry(Filter* filter); std::vector> m_threads; std::unique_ptr m_thread_data; }; #endif } #endif botan-2.4.0/src/lib/filters/buf_filt.cpp000066400000000000000000000047501322470703100201300ustar00rootroot00000000000000/* * Buffered Filter * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Buffered_Filter Constructor */ Buffered_Filter::Buffered_Filter(size_t b, size_t f) : m_main_block_mod(b), m_final_minimum(f) { if(m_main_block_mod == 0) throw Invalid_Argument("m_main_block_mod == 0"); if(m_final_minimum > m_main_block_mod) throw Invalid_Argument("m_final_minimum > m_main_block_mod"); m_buffer.resize(2 * m_main_block_mod); m_buffer_pos = 0; } /* * Buffer input into blocks, trying to minimize copying */ void Buffered_Filter::write(const uint8_t input[], size_t input_size) { if(!input_size) return; if(m_buffer_pos + input_size >= m_main_block_mod + m_final_minimum) { size_t to_copy = std::min(m_buffer.size() - m_buffer_pos, input_size); copy_mem(&m_buffer[m_buffer_pos], input, to_copy); m_buffer_pos += to_copy; input += to_copy; input_size -= to_copy; size_t total_to_consume = round_down(std::min(m_buffer_pos, m_buffer_pos + input_size - m_final_minimum), m_main_block_mod); buffered_block(m_buffer.data(), total_to_consume); m_buffer_pos -= total_to_consume; copy_mem(m_buffer.data(), m_buffer.data() + total_to_consume, m_buffer_pos); } if(input_size >= m_final_minimum) { size_t full_blocks = (input_size - m_final_minimum) / m_main_block_mod; size_t to_copy = full_blocks * m_main_block_mod; if(to_copy) { buffered_block(input, to_copy); input += to_copy; input_size -= to_copy; } } copy_mem(&m_buffer[m_buffer_pos], input, input_size); m_buffer_pos += input_size; } /* * Finish/flush operation */ void Buffered_Filter::end_msg() { if(m_buffer_pos < m_final_minimum) throw Exception("Buffered filter end_msg without enough input"); size_t spare_blocks = (m_buffer_pos - m_final_minimum) / m_main_block_mod; if(spare_blocks) { size_t spare_bytes = m_main_block_mod * spare_blocks; buffered_block(m_buffer.data(), spare_bytes); buffered_final(&m_buffer[spare_bytes], m_buffer_pos - spare_bytes); } else { buffered_final(m_buffer.data(), m_buffer_pos); } m_buffer_pos = 0; } } botan-2.4.0/src/lib/filters/buf_filt.h000066400000000000000000000047411322470703100175750ustar00rootroot00000000000000/* * Buffered Filter * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BUFFERED_FILTER_H_ #define BOTAN_BUFFERED_FILTER_H_ #include namespace Botan { /** * Filter mixin that breaks input into blocks, useful for * cipher modes */ class BOTAN_PUBLIC_API(2,0) Buffered_Filter { public: /** * Write bytes into the buffered filter, which will them emit them * in calls to buffered_block in the subclass * @param in the input bytes * @param length of in in bytes */ void write(const uint8_t in[], size_t length); template void write(const std::vector& in, size_t length) { write(in.data(), length); } /** * Finish a message, emitting to buffered_block and buffered_final * Will throw an exception if less than final_minimum bytes were * written into the filter. */ void end_msg(); /** * Initialize a Buffered_Filter * @param block_size the function buffered_block will be called * with inputs which are a multiple of this size * @param final_minimum the function buffered_final will be called * with at least this many bytes. */ Buffered_Filter(size_t block_size, size_t final_minimum); virtual ~Buffered_Filter() = default; protected: /** * The block processor, implemented by subclasses * @param input some input bytes * @param length the size of input, guaranteed to be a multiple * of block_size */ virtual void buffered_block(const uint8_t input[], size_t length) = 0; /** * The final block, implemented by subclasses * @param input some input bytes * @param length the size of input, guaranteed to be at least * final_minimum bytes */ virtual void buffered_final(const uint8_t input[], size_t length) = 0; /** * @return block size of inputs */ size_t buffered_block_size() const { return m_main_block_mod; } /** * @return current position in the buffer */ size_t current_position() const { return m_buffer_pos; } /** * Reset the buffer position */ void buffer_reset() { m_buffer_pos = 0; } private: size_t m_main_block_mod, m_final_minimum; secure_vector m_buffer; size_t m_buffer_pos; }; } #endif botan-2.4.0/src/lib/filters/cipher_filter.cpp000066400000000000000000000043751322470703100211600ustar00rootroot00000000000000/* * Filter interface for Cipher_Modes * (C) 2013,2014,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { size_t choose_update_size(size_t update_granularity) { const size_t target_size = 1024; if(update_granularity >= target_size) return update_granularity; return round_up(target_size, update_granularity); } } Cipher_Mode_Filter::Cipher_Mode_Filter(Cipher_Mode* mode) : Buffered_Filter(choose_update_size(mode->update_granularity()), mode->minimum_final_size()), m_mode(mode), m_nonce(mode->default_nonce_length()), m_buffer(m_mode->update_granularity()) { } std::string Cipher_Mode_Filter::name() const { return m_mode->name(); } void Cipher_Mode_Filter::set_iv(const InitializationVector& iv) { m_nonce = unlock(iv.bits_of()); } void Cipher_Mode_Filter::set_key(const SymmetricKey& key) { m_mode->set_key(key); } Key_Length_Specification Cipher_Mode_Filter::key_spec() const { return m_mode->key_spec(); } bool Cipher_Mode_Filter::valid_iv_length(size_t length) const { return m_mode->valid_nonce_length(length); } void Cipher_Mode_Filter::write(const uint8_t input[], size_t input_length) { Buffered_Filter::write(input, input_length); } void Cipher_Mode_Filter::end_msg() { Buffered_Filter::end_msg(); } void Cipher_Mode_Filter::start_msg() { if(m_nonce.empty() && !m_mode->valid_nonce_length(0)) throw Invalid_State("Cipher " + m_mode->name() + " requires a fresh nonce for each message"); m_mode->start(m_nonce); m_nonce.clear(); } void Cipher_Mode_Filter::buffered_block(const uint8_t input[], size_t input_length) { while(input_length) { const size_t take = std::min(m_mode->update_granularity(), input_length); m_buffer.assign(input, input + take); m_mode->update(m_buffer); send(m_buffer); input += take; input_length -= take; } } void Cipher_Mode_Filter::buffered_final(const uint8_t input[], size_t input_length) { secure_vector buf(input, input + input_length); m_mode->finish(buf); send(buf); } } botan-2.4.0/src/lib/filters/cipher_filter.h000066400000000000000000000026221322470703100206160ustar00rootroot00000000000000/* * Filter interface for ciphers * (C) 2013,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TRANSFORM_FILTER_H_ #define BOTAN_TRANSFORM_FILTER_H_ #include #include #include namespace Botan { /** * Filter interface for cipher modes */ class BOTAN_PUBLIC_API(2,0) Cipher_Mode_Filter final : public Keyed_Filter, private Buffered_Filter { public: explicit Cipher_Mode_Filter(Cipher_Mode* t); void set_iv(const InitializationVector& iv) override; void set_key(const SymmetricKey& key) override; Key_Length_Specification key_spec() const override; bool valid_iv_length(size_t length) const override; std::string name() const override; private: void write(const uint8_t input[], size_t input_length) override; void start_msg() override; void end_msg() override; void buffered_block(const uint8_t input[], size_t input_length) override; void buffered_final(const uint8_t input[], size_t input_length) override; std::unique_ptr m_mode; std::vector m_nonce; secure_vector m_buffer; }; // deprecated aliases, will be removed before 2.0 typedef Cipher_Mode_Filter Transform_Filter; typedef Transform_Filter Transformation_Filter; } #endif botan-2.4.0/src/lib/filters/codec_filt/000077500000000000000000000000001322470703100177175ustar00rootroot00000000000000botan-2.4.0/src/lib/filters/codec_filt/b64_filt.cpp000066400000000000000000000103771322470703100220440ustar00rootroot00000000000000/* * Base64 Encoder/Decoder * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Base64_Encoder Constructor */ Base64_Encoder::Base64_Encoder(bool breaks, size_t length, bool t_n) : m_line_length(breaks ? length : 0), m_trailing_newline(t_n && breaks), m_in(48), m_out(64), m_position(0), m_out_position(0) { } /* * Encode and send a block */ void Base64_Encoder::encode_and_send(const uint8_t input[], size_t length, bool final_inputs) { while(length) { const size_t proc = std::min(length, m_in.size()); size_t consumed = 0; size_t produced = base64_encode(cast_uint8_ptr_to_char(m_out.data()), input, proc, consumed, final_inputs); do_output(m_out.data(), produced); // FIXME: s/proc/consumed/? input += proc; length -= proc; } } /* * Handle the output */ void Base64_Encoder::do_output(const uint8_t input[], size_t length) { if(m_line_length == 0) send(input, length); else { size_t remaining = length, offset = 0; while(remaining) { size_t sent = std::min(m_line_length - m_out_position, remaining); send(input + offset, sent); m_out_position += sent; remaining -= sent; offset += sent; if(m_out_position == m_line_length) { send('\n'); m_out_position = 0; } } } } /* * Convert some data into Base64 */ void Base64_Encoder::write(const uint8_t input[], size_t length) { buffer_insert(m_in, m_position, input, length); if(m_position + length >= m_in.size()) { encode_and_send(m_in.data(), m_in.size()); input += (m_in.size() - m_position); length -= (m_in.size() - m_position); while(length >= m_in.size()) { encode_and_send(input, m_in.size()); input += m_in.size(); length -= m_in.size(); } copy_mem(m_in.data(), input, length); m_position = 0; } m_position += length; } /* * Flush buffers */ void Base64_Encoder::end_msg() { encode_and_send(m_in.data(), m_position, true); if(m_trailing_newline || (m_out_position && m_line_length)) send('\n'); m_out_position = m_position = 0; } /* * Base64_Decoder Constructor */ Base64_Decoder::Base64_Decoder(Decoder_Checking c) : m_checking(c), m_in(64), m_out(48), m_position(0) { } /* * Convert some data from Base64 */ void Base64_Decoder::write(const uint8_t input[], size_t length) { while(length) { size_t to_copy = std::min(length, m_in.size() - m_position); if(to_copy == 0) { m_in.resize(m_in.size()*2); m_out.resize(m_out.size()*2); } copy_mem(&m_in[m_position], input, to_copy); m_position += to_copy; size_t consumed = 0; size_t written = base64_decode(m_out.data(), cast_uint8_ptr_to_char(m_in.data()), m_position, consumed, false, m_checking != FULL_CHECK); send(m_out, written); if(consumed != m_position) { copy_mem(m_in.data(), m_in.data() + consumed, m_position - consumed); m_position = m_position - consumed; } else m_position = 0; length -= to_copy; input += to_copy; } } /* * Flush buffers */ void Base64_Decoder::end_msg() { size_t consumed = 0; size_t written = base64_decode(m_out.data(), cast_uint8_ptr_to_char(m_in.data()), m_position, consumed, true, m_checking != FULL_CHECK); send(m_out, written); const bool not_full_bytes = consumed != m_position; m_position = 0; if(not_full_bytes) throw Invalid_Argument("Base64_Decoder: Input not full bytes"); } } botan-2.4.0/src/lib/filters/codec_filt/b64_filt.h000066400000000000000000000045121322470703100215030ustar00rootroot00000000000000/* * Base64 Encoder/Decoder * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BASE64_FILTER_H_ #define BOTAN_BASE64_FILTER_H_ #include namespace Botan { /** * This class represents a Base64 encoder. */ class BOTAN_PUBLIC_API(2,0) Base64_Encoder final : public Filter { public: std::string name() const override { return "Base64_Encoder"; } /** * Input a part of a message to the encoder. * @param input the message to input as a byte array * @param length the length of the byte array input */ void write(const uint8_t input[], size_t length) override; /** * Inform the Encoder that the current message shall be closed. */ void end_msg() override; /** * Create a base64 encoder. * @param breaks whether to use line breaks in the output * @param length the length of the lines of the output * @param t_n whether to use a trailing newline */ Base64_Encoder(bool breaks = false, size_t length = 72, bool t_n = false); private: void encode_and_send(const uint8_t input[], size_t length, bool final_inputs = false); void do_output(const uint8_t output[], size_t length); const size_t m_line_length; const bool m_trailing_newline; std::vector m_in, m_out; size_t m_position, m_out_position; }; /** * This object represents a Base64 decoder. */ class BOTAN_PUBLIC_API(2,0) Base64_Decoder final : public Filter { public: std::string name() const override { return "Base64_Decoder"; } /** * Input a part of a message to the decoder. * @param input the message to input as a byte array * @param length the length of the byte array input */ void write(const uint8_t input[], size_t length) override; /** * Finish up the current message */ void end_msg() override; /** * Create a base64 decoder. * @param checking the type of checking that shall be performed by * the decoder */ explicit Base64_Decoder(Decoder_Checking checking = NONE); private: const Decoder_Checking m_checking; std::vector m_in, m_out; size_t m_position; }; } #endif botan-2.4.0/src/lib/filters/codec_filt/hex_filt.cpp000066400000000000000000000076001322470703100222300ustar00rootroot00000000000000/* * Hex Encoder/Decoder * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /** * Size used for internal buffer in hex encoder/decoder */ const size_t HEX_CODEC_BUFFER_SIZE = 256; /* * Hex_Encoder Constructor */ Hex_Encoder::Hex_Encoder(bool breaks, size_t length, Case c) : m_casing(c), m_line_length(breaks ? length : 0) { m_in.resize(HEX_CODEC_BUFFER_SIZE); m_out.resize(2*m_in.size()); m_counter = m_position = 0; } /* * Hex_Encoder Constructor */ Hex_Encoder::Hex_Encoder(Case c) : m_casing(c), m_line_length(0) { m_in.resize(HEX_CODEC_BUFFER_SIZE); m_out.resize(2*m_in.size()); m_counter = m_position = 0; } /* * Encode and send a block */ void Hex_Encoder::encode_and_send(const uint8_t block[], size_t length) { hex_encode(cast_uint8_ptr_to_char(m_out.data()), block, length, m_casing == Uppercase); if(m_line_length == 0) send(m_out, 2*length); else { size_t remaining = 2*length, offset = 0; while(remaining) { size_t sent = std::min(m_line_length - m_counter, remaining); send(&m_out[offset], sent); m_counter += sent; remaining -= sent; offset += sent; if(m_counter == m_line_length) { send('\n'); m_counter = 0; } } } } /* * Convert some data into hex format */ void Hex_Encoder::write(const uint8_t input[], size_t length) { buffer_insert(m_in, m_position, input, length); if(m_position + length >= m_in.size()) { encode_and_send(m_in.data(), m_in.size()); input += (m_in.size() - m_position); length -= (m_in.size() - m_position); while(length >= m_in.size()) { encode_and_send(input, m_in.size()); input += m_in.size(); length -= m_in.size(); } copy_mem(m_in.data(), input, length); m_position = 0; } m_position += length; } /* * Flush buffers */ void Hex_Encoder::end_msg() { encode_and_send(m_in.data(), m_position); if(m_counter && m_line_length) send('\n'); m_counter = m_position = 0; } /* * Hex_Decoder Constructor */ Hex_Decoder::Hex_Decoder(Decoder_Checking c) : m_checking(c) { m_in.resize(HEX_CODEC_BUFFER_SIZE); m_out.resize(m_in.size() / 2); m_position = 0; } /* * Convert some data from hex format */ void Hex_Decoder::write(const uint8_t input[], size_t length) { while(length) { size_t to_copy = std::min(length, m_in.size() - m_position); copy_mem(&m_in[m_position], input, to_copy); m_position += to_copy; size_t consumed = 0; size_t written = hex_decode(m_out.data(), cast_uint8_ptr_to_char(m_in.data()), m_position, consumed, m_checking != FULL_CHECK); send(m_out, written); if(consumed != m_position) { copy_mem(m_in.data(), m_in.data() + consumed, m_position - consumed); m_position = m_position - consumed; } else m_position = 0; length -= to_copy; input += to_copy; } } /* * Flush buffers */ void Hex_Decoder::end_msg() { size_t consumed = 0; size_t written = hex_decode(m_out.data(), cast_uint8_ptr_to_char(m_in.data()), m_position, consumed, m_checking != FULL_CHECK); send(m_out, written); const bool not_full_bytes = consumed != m_position; m_position = 0; if(not_full_bytes) throw Invalid_Argument("Hex_Decoder: Input not full bytes"); } } botan-2.4.0/src/lib/filters/codec_filt/hex_filt.h000066400000000000000000000040051322470703100216710ustar00rootroot00000000000000/* * Hex Encoder/Decoder * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HEX_FILTER_H_ #define BOTAN_HEX_FILTER_H_ #include namespace Botan { /** * Converts arbitrary binary data to hex strings, optionally with * newlines inserted */ class BOTAN_PUBLIC_API(2,0) Hex_Encoder final : public Filter { public: /** * Whether to use uppercase or lowercase letters for the encoded string. */ enum Case { Uppercase, Lowercase }; std::string name() const override { return "Hex_Encoder"; } void write(const uint8_t in[], size_t length) override; void end_msg() override; /** * Create a hex encoder. * @param the_case the case to use in the encoded strings. */ explicit Hex_Encoder(Case the_case); /** * Create a hex encoder. * @param newlines should newlines be used * @param line_length if newlines are used, how long are lines * @param the_case the case to use in the encoded strings */ Hex_Encoder(bool newlines = false, size_t line_length = 72, Case the_case = Uppercase); private: void encode_and_send(const uint8_t[], size_t); const Case m_casing; const size_t m_line_length; std::vector m_in, m_out; size_t m_position, m_counter; }; /** * Converts hex strings to bytes */ class BOTAN_PUBLIC_API(2,0) Hex_Decoder final : public Filter { public: std::string name() const override { return "Hex_Decoder"; } void write(const uint8_t[], size_t) override; void end_msg() override; /** * Construct a Hex Decoder using the specified * character checking. * @param checking the checking to use during decoding. */ explicit Hex_Decoder(Decoder_Checking checking = NONE); private: const Decoder_Checking m_checking; std::vector m_in, m_out; size_t m_position; }; } #endif botan-2.4.0/src/lib/filters/codec_filt/info.txt000066400000000000000000000001261322470703100214120ustar00rootroot00000000000000 CODEC_FILTERS -> 20131128 base64 filters botan-2.4.0/src/lib/filters/comp_filter.cpp000066400000000000000000000047541322470703100206450ustar00rootroot00000000000000/* * Filter interface for compression * (C) 2014,2015,2016 Jack Lloyd * (C) 2015 Matej Kenda * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_COMPRESSION) #include #endif namespace Botan { #if defined(BOTAN_HAS_COMPRESSION) Compression_Filter::Compression_Filter(const std::string& type, size_t level, size_t bs) : m_comp(make_compressor(type)), m_buffersize(std::max(bs, 256)), m_level(level) { if(!m_comp) { throw Invalid_Argument("Compression type '" + type + "' not found"); } } Compression_Filter::~Compression_Filter() { /* for unique_ptr */ } std::string Compression_Filter::name() const { return m_comp->name(); } void Compression_Filter::start_msg() { m_comp->start(m_level); } void Compression_Filter::write(const uint8_t input[], size_t input_length) { while(input_length) { const size_t take = std::min(m_buffersize, input_length); BOTAN_ASSERT(take > 0, "Consumed something"); m_buffer.assign(input, input + take); m_comp->update(m_buffer); send(m_buffer); input += take; input_length -= take; } } void Compression_Filter::flush() { m_buffer.clear(); m_comp->update(m_buffer, 0, true); send(m_buffer); } void Compression_Filter::end_msg() { m_buffer.clear(); m_comp->finish(m_buffer); send(m_buffer); } Decompression_Filter::Decompression_Filter(const std::string& type, size_t bs) : m_comp(make_decompressor(type)), m_buffersize(std::max(bs, 256)) { if(!m_comp) { throw Invalid_Argument("Compression type '" + type + "' not found"); } } Decompression_Filter::~Decompression_Filter() { /* for unique_ptr */ } std::string Decompression_Filter::name() const { return m_comp->name(); } void Decompression_Filter::start_msg() { m_comp->start(); } void Decompression_Filter::write(const uint8_t input[], size_t input_length) { while(input_length) { const size_t take = std::min(m_buffersize, input_length); BOTAN_ASSERT(take > 0, "Consumed something"); m_buffer.assign(input, input + take); m_comp->update(m_buffer); send(m_buffer); input += take; input_length -= take; } } void Decompression_Filter::end_msg() { m_buffer.clear(); m_comp->finish(m_buffer); send(m_buffer); } #endif } botan-2.4.0/src/lib/filters/comp_filter.h000066400000000000000000000031371322470703100203040ustar00rootroot00000000000000/* * Filter interface for compression * (C) 2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_COMPRESSION_FILTER_H_ #define BOTAN_COMPRESSION_FILTER_H_ #include namespace Botan { #if defined(BOTAN_HAS_COMPRESSION) class Compression_Algorithm; class Decompression_Algorithm; /** * Filter interface for compression */ class BOTAN_PUBLIC_API(2,0) Compression_Filter final : public Filter { public: void start_msg() override; void write(const uint8_t input[], size_t input_length) override; void end_msg() override; void flush(); std::string name() const override; Compression_Filter(const std::string& type, size_t compression_level, size_t buffer_size = 4096); ~Compression_Filter(); private: std::unique_ptr m_comp; size_t m_buffersize, m_level; secure_vector m_buffer; }; /** * Filter interface for decompression */ class BOTAN_PUBLIC_API(2,0) Decompression_Filter final : public Filter { public: void start_msg() override; void write(const uint8_t input[], size_t input_length) override; void end_msg() override; std::string name() const override; Decompression_Filter(const std::string& type, size_t buffer_size = 4096); ~Decompression_Filter(); private: std::unique_ptr m_comp; std::size_t m_buffersize; secure_vector m_buffer; }; #endif } #endif botan-2.4.0/src/lib/filters/data_snk.cpp000066400000000000000000000027041322470703100201170ustar00rootroot00000000000000/* * DataSink * (C) 1999-2007 Jack Lloyd * 2005 Matthew Gregan * 2017 Philippe Lieser * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) #include #endif namespace Botan { /* * Write to a stream */ void DataSink_Stream::write(const uint8_t out[], size_t length) { m_sink.write(cast_uint8_ptr_to_char(out), length); if(!m_sink.good()) throw Stream_IO_Error("DataSink_Stream: Failure writing to " + m_identifier); } /* * Flush the stream */ void DataSink_Stream::end_msg() { m_sink.flush(); } /* * DataSink_Stream Constructor */ DataSink_Stream::DataSink_Stream(std::ostream& out, const std::string& name) : m_identifier(name), m_sink(out) { } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /* * DataSink_Stream Constructor */ DataSink_Stream::DataSink_Stream(const std::string& path, bool use_binary) : m_identifier(path), m_sink_memory(new std::ofstream(path, use_binary ? std::ios::binary : std::ios::out)), m_sink(*m_sink_memory) { if(!m_sink.good()) { throw Stream_IO_Error("DataSink_Stream: Failure opening " + path); } } #endif /* * DataSink_Stream Destructor */ DataSink_Stream::~DataSink_Stream() { // for ~unique_ptr } } botan-2.4.0/src/lib/filters/data_snk.h000066400000000000000000000034451322470703100175670ustar00rootroot00000000000000/* * DataSink * (C) 1999-2007 Jack Lloyd * 2017 Philippe Lieser * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DATA_SINK_H_ #define BOTAN_DATA_SINK_H_ #include #include #include namespace Botan { /** * This class represents abstract data sink objects. */ class BOTAN_PUBLIC_API(2,0) DataSink : public Filter { public: bool attachable() override { return false; } DataSink() = default; virtual ~DataSink() = default; DataSink& operator=(const DataSink&) = delete; DataSink(const DataSink&) = delete; }; /** * This class represents a data sink which writes its output to a stream. */ class BOTAN_PUBLIC_API(2,0) DataSink_Stream final : public DataSink { public: /** * Construct a DataSink_Stream from a stream. * @param stream the stream to write to * @param name identifier */ DataSink_Stream(std::ostream& stream, const std::string& name = ""); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Construct a DataSink_Stream from a filesystem path name. * @param pathname the name of the file to open a stream to * @param use_binary indicates whether to treat the file * as a binary file or not */ DataSink_Stream(const std::string& pathname, bool use_binary = false); #endif std::string name() const override { return m_identifier; } void write(const uint8_t[], size_t) override; void end_msg() override; ~DataSink_Stream(); private: const std::string m_identifier; // May be null, if m_sink was an external reference std::unique_ptr m_sink_memory; std::ostream& m_sink; }; } #endif botan-2.4.0/src/lib/filters/fd_unix/000077500000000000000000000000001322470703100172605ustar00rootroot00000000000000botan-2.4.0/src/lib/filters/fd_unix/fd_unix.cpp000066400000000000000000000023331322470703100214210ustar00rootroot00000000000000/* * Pipe I/O for Unix * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Write data from a pipe into a Unix fd */ int operator<<(int fd, Pipe& pipe) { secure_vector buffer(DEFAULT_BUFFERSIZE); while(pipe.remaining()) { size_t got = pipe.read(buffer.data(), buffer.size()); size_t position = 0; while(got) { ssize_t ret = ::write(fd, &buffer[position], got); if(ret < 0) throw Stream_IO_Error("Pipe output operator (unixfd) has failed"); position += static_cast(ret); got -= static_cast(ret); } } return fd; } /* * Read data from a Unix fd into a pipe */ int operator>>(int fd, Pipe& pipe) { secure_vector buffer(DEFAULT_BUFFERSIZE); while(true) { ssize_t ret = ::read(fd, buffer.data(), buffer.size()); if(ret < 0) throw Stream_IO_Error("Pipe input operator (unixfd) has failed"); else if(ret == 0) break; pipe.write(buffer.data(), static_cast(ret)); } return fd; } } botan-2.4.0/src/lib/filters/fd_unix/fd_unix.h000066400000000000000000000013501322470703100210640ustar00rootroot00000000000000/* * Pipe I/O for Unix * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PIPE_UNIXFD_H_ #define BOTAN_PIPE_UNIXFD_H_ #include namespace Botan { class Pipe; /** * Stream output operator; dumps the results from pipe's default * message to the output stream. * @param out file descriptor for an open output stream * @param pipe the pipe */ int BOTAN_PUBLIC_API(2,0) operator<<(int out, Pipe& pipe); /** * File descriptor input operator; dumps the remaining bytes of input * to the (assumed open) pipe message. * @param in file descriptor for an open input stream * @param pipe the pipe */ int BOTAN_PUBLIC_API(2,0) operator>>(int in, Pipe& pipe); } #endif botan-2.4.0/src/lib/filters/fd_unix/info.txt000066400000000000000000000002421322470703100207520ustar00rootroot00000000000000 PIPE_UNIXFD_IO -> 20131128 load_on auto android aix cygwin darwin dragonfly freebsd haiku hpux linux netbsd openbsd qnx solaris botan-2.4.0/src/lib/filters/filter.cpp000066400000000000000000000044111322470703100176150ustar00rootroot00000000000000/* * Filter * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Filter Constructor */ Filter::Filter() { m_next.resize(1); m_port_num = 0; m_filter_owns = 0; m_owned = false; } /* * Send data to all ports */ void Filter::send(const uint8_t input[], size_t length) { if(!length) return; bool nothing_attached = true; for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) { if(m_write_queue.size()) m_next[j]->write(m_write_queue.data(), m_write_queue.size()); m_next[j]->write(input, length); nothing_attached = false; } if(nothing_attached) m_write_queue += std::make_pair(input, length); else m_write_queue.clear(); } /* * Start a new message */ void Filter::new_msg() { start_msg(); for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) m_next[j]->new_msg(); } /* * End the current message */ void Filter::finish_msg() { end_msg(); for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) m_next[j]->finish_msg(); } /* * Attach a filter to the current port */ void Filter::attach(Filter* new_filter) { if(new_filter) { Filter* last = this; while(last->get_next()) last = last->get_next(); last->m_next[last->current_port()] = new_filter; } } /* * Set the active port on a filter */ void Filter::set_port(size_t new_port) { if(new_port >= total_ports()) throw Invalid_Argument("Filter: Invalid port number"); m_port_num = new_port; } /* * Return the next Filter in the logical chain */ Filter* Filter::get_next() const { if(m_port_num < m_next.size()) return m_next[m_port_num]; return nullptr; } /* * Set the next Filters */ void Filter::set_next(Filter* filters[], size_t size) { m_next.clear(); m_port_num = 0; m_filter_owns = 0; while(size && filters && (filters[size-1] == nullptr)) --size; if(filters && size) m_next.assign(filters, filters + size); } /* * Return the total number of ports */ size_t Filter::total_ports() const { return m_next.size(); } } botan-2.4.0/src/lib/filters/filter.h000066400000000000000000000110061322470703100172600ustar00rootroot00000000000000/* * Filter * (C) 1999-2007 Jack Lloyd * (C) 2013 Joel Low * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FILTER_H_ #define BOTAN_FILTER_H_ #include #include #include namespace Botan { /** * This class represents general abstract filter objects. */ class BOTAN_PUBLIC_API(2,0) Filter { public: /** * @return descriptive name for this filter */ virtual std::string name() const = 0; /** * Write a portion of a message to this filter. * @param input the input as a byte array * @param length the length of the byte array input */ virtual void write(const uint8_t input[], size_t length) = 0; /** * Start a new message. Must be closed by end_msg() before another * message can be started. */ virtual void start_msg() { /* default empty */ } /** * Notify that the current message is finished; flush buffers and * do end-of-message processing (if any). */ virtual void end_msg() { /* default empty */ } /** * Check whether this filter is an attachable filter. * @return true if this filter is attachable, false otherwise */ virtual bool attachable() { return true; } virtual ~Filter() = default; protected: /** * @param in some input for the filter * @param length the length of in */ virtual void send(const uint8_t in[], size_t length); /** * @param in some input for the filter */ void send(uint8_t in) { send(&in, 1); } /** * @param in some input for the filter */ void send(const secure_vector& in) { send(in.data(), in.size()); } /** * @param in some input for the filter */ void send(const std::vector& in) { send(in.data(), in.size()); } /** * @param in some input for the filter * @param length the number of bytes of in to send */ void send(const secure_vector& in, size_t length) { send(in.data(), length); } /** * @param in some input for the filter * @param length the number of bytes of in to send */ void send(const std::vector& in, size_t length) { send(in.data(), length); } Filter(); Filter(const Filter&) = delete; Filter& operator=(const Filter&) = delete; private: /** * Start a new message in *this and all following filters. Only for * internal use, not intended for use in client applications. */ void new_msg(); /** * End a new message in *this and all following filters. Only for * internal use, not intended for use in client applications. */ void finish_msg(); friend class Pipe; friend class Fanout_Filter; size_t total_ports() const; size_t current_port() const { return m_port_num; } /** * Set the active port * @param new_port the new value */ void set_port(size_t new_port); size_t owns() const { return m_filter_owns; } /** * Attach another filter to this one * @param f filter to attach */ void attach(Filter* f); /** * @param filters the filters to set * @param count number of items in filters */ void set_next(Filter* filters[], size_t count); Filter* get_next() const; secure_vector m_write_queue; std::vector m_next; // not owned size_t m_port_num, m_filter_owns; // true if filter belongs to a pipe --> prohibit filter sharing! bool m_owned; }; /** * This is the abstract Fanout_Filter base class. **/ class BOTAN_PUBLIC_API(2,0) Fanout_Filter : public Filter { protected: /** * Increment the number of filters past us that we own */ void incr_owns() { ++m_filter_owns; } void set_port(size_t n) { Filter::set_port(n); } void set_next(Filter* f[], size_t n) { Filter::set_next(f, n); } void attach(Filter* f) { Filter::attach(f); } private: friend class Threaded_Fork; using Filter::m_write_queue; using Filter::total_ports; using Filter::m_next; }; /** * The type of checking to be performed by decoders: * NONE - no checks, IGNORE_WS - perform checks, but ignore * whitespaces, FULL_CHECK - perform checks, also complain * about white spaces. */ enum Decoder_Checking { NONE, IGNORE_WS, FULL_CHECK }; } #endif botan-2.4.0/src/lib/filters/filters.h000066400000000000000000000144131322470703100174500ustar00rootroot00000000000000/* * Filters * (C) 1999-2007,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FILTERS_H_ #define BOTAN_FILTERS_H_ #include #include #include #include #include #include #include #if defined(BOTAN_HAS_CODEC_FILTERS) #include #include #endif namespace Botan { /** * Stream Cipher Filter */ class BOTAN_PUBLIC_API(2,0) StreamCipher_Filter final : public Keyed_Filter { public: std::string name() const override { return m_cipher->name(); } /** * Write input data * @param input data * @param input_len length of input in bytes */ void write(const uint8_t input[], size_t input_len) override; bool valid_iv_length(size_t iv_len) const override { return m_cipher->valid_iv_length(iv_len); } /** * Set the initialization vector for this filter. * @param iv the initialization vector to set */ void set_iv(const InitializationVector& iv) override { m_cipher->set_iv(iv.begin(), iv.length()); } /** * Set the key of this filter. * @param key the key to set */ void set_key(const SymmetricKey& key) override { m_cipher->set_key(key); } Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } /** * Construct a stream cipher filter. * @param cipher a cipher object to use */ explicit StreamCipher_Filter(StreamCipher* cipher); /** * Construct a stream cipher filter. * @param cipher a cipher object to use * @param key the key to use inside this filter */ StreamCipher_Filter(StreamCipher* cipher, const SymmetricKey& key); /** * Construct a stream cipher filter. * @param cipher the name of the desired cipher */ explicit StreamCipher_Filter(const std::string& cipher); /** * Construct a stream cipher filter. * @param cipher the name of the desired cipher * @param key the key to use inside this filter */ StreamCipher_Filter(const std::string& cipher, const SymmetricKey& key); private: secure_vector m_buffer; std::unique_ptr m_cipher; }; /** * Hash Filter. */ class BOTAN_PUBLIC_API(2,0) Hash_Filter final : public Filter { public: void write(const uint8_t input[], size_t len) override { m_hash->update(input, len); } void end_msg() override; std::string name() const override { return m_hash->name(); } /** * Construct a hash filter. * @param hash the hash function to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the hashfunction * hash. Otherwise, specify a smaller value here so that the * output of the hash algorithm will be cut off. */ Hash_Filter(HashFunction* hash, size_t len = 0) : m_hash(hash), m_out_len(len) {} /** * Construct a hash filter. * @param request the name of the hash algorithm to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the hashfunction * hash. Otherwise, specify a smaller value here so that the * output of the hash algorithm will be cut off. */ Hash_Filter(const std::string& request, size_t len = 0); private: std::unique_ptr m_hash; const size_t m_out_len; }; /** * MessageAuthenticationCode Filter. */ class BOTAN_PUBLIC_API(2,0) MAC_Filter final : public Keyed_Filter { public: void write(const uint8_t input[], size_t len) override { m_mac->update(input, len); } void end_msg() override; std::string name() const override { return m_mac->name(); } /** * Set the key of this filter. * @param key the key to set */ void set_key(const SymmetricKey& key) override { m_mac->set_key(key); } Key_Length_Specification key_spec() const override { return m_mac->key_spec(); } /** * Construct a MAC filter. The MAC key will be left empty. * @param mac the MAC to use * @param out_len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(MessageAuthenticationCode* mac, size_t out_len = 0) : m_mac(mac), m_out_len(out_len) { } /** * Construct a MAC filter. * @param mac the MAC to use * @param key the MAC key to use * @param out_len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(MessageAuthenticationCode* mac, const SymmetricKey& key, size_t out_len = 0) : m_mac(mac), m_out_len(out_len) { m_mac->set_key(key); } /** * Construct a MAC filter. The MAC key will be left empty. * @param mac the name of the MAC to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(const std::string& mac, size_t len = 0); /** * Construct a MAC filter. * @param mac the name of the MAC to use * @param key the MAC key to use * @param len the output length of this filter. Leave the default * value 0 if you want to use the full output of the * MAC. Otherwise, specify a smaller value here so that the * output of the MAC will be cut off. */ MAC_Filter(const std::string& mac, const SymmetricKey& key, size_t len = 0); private: std::unique_ptr m_mac; const size_t m_out_len; }; } #endif botan-2.4.0/src/lib/filters/info.txt000066400000000000000000000004101322470703100173130ustar00rootroot00000000000000 FILTERS -> 20160415 basefilt.h buf_filt.h data_snk.h comp_filter.h filter.h filters.h key_filt.h pipe.h secqueue.h cipher_filter.h out_buf.h modes botan-2.4.0/src/lib/filters/key_filt.cpp000066400000000000000000000020761322470703100201430ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { Keyed_Filter* get_cipher(const std::string& algo_spec, Cipher_Dir direction) { std::unique_ptr c(get_cipher_mode(algo_spec, direction)); if(c) return new Cipher_Mode_Filter(c.release()); throw Algorithm_Not_Found(algo_spec); } Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, const InitializationVector& iv, Cipher_Dir direction) { Keyed_Filter* cipher = get_cipher(algo_spec, key, direction); if(iv.length()) cipher->set_iv(iv); return cipher; } Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, Cipher_Dir direction) { Keyed_Filter* cipher = get_cipher(algo_spec, direction); cipher->set_key(key); return cipher; } } botan-2.4.0/src/lib/filters/key_filt.h000066400000000000000000000064141322470703100176100ustar00rootroot00000000000000/* * Keyed_Filter * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KEYED_FILTER_H_ #define BOTAN_KEYED_FILTER_H_ #include #include #include namespace Botan { /** * This class represents keyed filters, i.e. filters that have to be * fed with a key in order to function. */ class BOTAN_PUBLIC_API(2,0) Keyed_Filter : public Filter { public: /** * Set the key of this filter * @param key the key to use */ virtual void set_key(const SymmetricKey& key) = 0; /** * Set the initialization vector of this filter. Note: you should * call set_iv() only after you have called set_key() * @param iv the initialization vector to use */ virtual void set_iv(const InitializationVector& iv); /** * Check whether a key length is valid for this filter * @param length the key length to be checked for validity * @return true if the key length is valid, false otherwise */ bool valid_keylength(size_t length) const { return key_spec().valid_keylength(length); } /** * @return object describing limits on key size */ virtual Key_Length_Specification key_spec() const = 0; /** * Check whether an IV length is valid for this filter * @param length the IV length to be checked for validity * @return true if the IV length is valid, false otherwise */ virtual bool valid_iv_length(size_t length) const { return (length == 0); } }; /* * Get a cipher object */ /** * Factory method for general symmetric cipher filters. * @param algo_spec the name of the desired cipher * @param key the key to be used for encryption/decryption performed by * the filter * @param iv the initialization vector to be used * @param direction determines whether the filter will be an encrypting * or decrypting filter * @return pointer to newly allocated encryption or decryption filter */ BOTAN_PUBLIC_API(2,0) Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, const InitializationVector& iv, Cipher_Dir direction); /** * Factory method for general symmetric cipher filters. * @param algo_spec the name of the desired cipher * @param key the key to be used for encryption/decryption performed by * the filter * @param direction determines whether the filter will be an encrypting * or decrypting filter * @return pointer to the encryption or decryption filter */ BOTAN_PUBLIC_API(2,0) Keyed_Filter* get_cipher(const std::string& algo_spec, const SymmetricKey& key, Cipher_Dir direction); /** * Factory method for general symmetric cipher filters. No key will be * set in the filter. * * @param algo_spec the name of the desired cipher * @param direction determines whether the filter will be an encrypting or * decrypting filter * @return pointer to the encryption or decryption filter */ BOTAN_PUBLIC_API(2,0) Keyed_Filter* get_cipher(const std::string& algo_spec, Cipher_Dir direction); } #endif botan-2.4.0/src/lib/filters/out_buf.cpp000066400000000000000000000045641322470703100200040ustar00rootroot00000000000000/* * Pipe Output Buffer * (C) 1999-2007,2011 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Read data from a message */ size_t Output_Buffers::read(uint8_t output[], size_t length, Pipe::message_id msg) { SecureQueue* q = get(msg); if(q) return q->read(output, length); return 0; } /* * Peek at data in a message */ size_t Output_Buffers::peek(uint8_t output[], size_t length, size_t stream_offset, Pipe::message_id msg) const { SecureQueue* q = get(msg); if(q) return q->peek(output, length, stream_offset); return 0; } /* * Check available bytes in a message */ size_t Output_Buffers::remaining(Pipe::message_id msg) const { SecureQueue* q = get(msg); if(q) return q->size(); return 0; } /* * Return the total bytes of a message that have already been read. */ size_t Output_Buffers::get_bytes_read(Pipe::message_id msg) const { SecureQueue* q = get(msg); if (q) return q->get_bytes_read(); return 0; } /* * Add a new output queue */ void Output_Buffers::add(SecureQueue* queue) { BOTAN_ASSERT(queue, "queue was provided"); BOTAN_ASSERT(m_buffers.size() < m_buffers.max_size(), "Room was available in container"); m_buffers.push_back(std::unique_ptr(queue)); } /* * Retire old output queues */ void Output_Buffers::retire() { for(size_t i = 0; i != m_buffers.size(); ++i) if(m_buffers[i] && m_buffers[i]->size() == 0) { m_buffers[i].reset(); } while(m_buffers.size() && !m_buffers[0]) { m_buffers.pop_front(); m_offset = m_offset + Pipe::message_id(1); } } /* * Get a particular output queue */ SecureQueue* Output_Buffers::get(Pipe::message_id msg) const { if(msg < m_offset) return nullptr; BOTAN_ASSERT(msg < message_count(), "Message number is in range"); return m_buffers[msg-m_offset].get(); } /* * Return the total number of messages */ Pipe::message_id Output_Buffers::message_count() const { return (m_offset + m_buffers.size()); } /* * Output_Buffers Constructor */ Output_Buffers::Output_Buffers() { m_offset = 0; } } botan-2.4.0/src/lib/filters/out_buf.h000066400000000000000000000016261322470703100174450ustar00rootroot00000000000000/* * Output Buffer * (C) 1999-2007 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OUTPUT_BUFFER_H_ #define BOTAN_OUTPUT_BUFFER_H_ #include #include #include namespace Botan { /** * Container of output buffers for Pipe */ class Output_Buffers final { public: size_t read(uint8_t[], size_t, Pipe::message_id); size_t peek(uint8_t[], size_t, size_t, Pipe::message_id) const; size_t get_bytes_read(Pipe::message_id) const; size_t remaining(Pipe::message_id) const; void add(class SecureQueue*); void retire(); Pipe::message_id message_count() const; Output_Buffers(); private: class SecureQueue* get(Pipe::message_id) const; std::deque> m_buffers; Pipe::message_id m_offset; }; } #endif botan-2.4.0/src/lib/filters/pipe.cpp000066400000000000000000000133471322470703100172750ustar00rootroot00000000000000/* * Pipe * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * A Filter that does nothing */ class Null_Filter final : public Filter { public: void write(const uint8_t input[], size_t length) override { send(input, length); } std::string name() const override { return "Null"; } }; } /* * Pipe Constructor */ Pipe::Pipe(Filter* f1, Filter* f2, Filter* f3, Filter* f4) : Pipe({f1,f2,f3,f4}) { } /* * Pipe Constructor */ Pipe::Pipe(std::initializer_list args) { m_outputs.reset(new Output_Buffers); m_pipe = nullptr; m_default_read = 0; m_inside_msg = false; for(auto i = args.begin(); i != args.end(); ++i) do_append(*i); } /* * Pipe Destructor */ Pipe::~Pipe() { destruct(m_pipe); } /* * Reset the Pipe */ void Pipe::reset() { destruct(m_pipe); m_pipe = nullptr; m_inside_msg = false; } /* * Destroy the Pipe */ void Pipe::destruct(Filter* to_kill) { if(!to_kill || dynamic_cast(to_kill)) return; for(size_t j = 0; j != to_kill->total_ports(); ++j) destruct(to_kill->m_next[j]); delete to_kill; } /* * Test if the Pipe has any data in it */ bool Pipe::end_of_data() const { return (remaining() == 0); } /* * Set the default read message */ void Pipe::set_default_msg(message_id msg) { if(msg >= message_count()) throw Invalid_Argument("Pipe::set_default_msg: msg number is too high"); m_default_read = msg; } /* * Process a full message at once */ void Pipe::process_msg(const uint8_t input[], size_t length) { start_msg(); write(input, length); end_msg(); } /* * Process a full message at once */ void Pipe::process_msg(const secure_vector& input) { process_msg(input.data(), input.size()); } void Pipe::process_msg(const std::vector& input) { process_msg(input.data(), input.size()); } /* * Process a full message at once */ void Pipe::process_msg(const std::string& input) { process_msg(cast_char_ptr_to_uint8(input.data()), input.length()); } /* * Process a full message at once */ void Pipe::process_msg(DataSource& input) { start_msg(); write(input); end_msg(); } /* * Start a new message */ void Pipe::start_msg() { if(m_inside_msg) throw Invalid_State("Pipe::start_msg: Message was already started"); if(m_pipe == nullptr) m_pipe = new Null_Filter; find_endpoints(m_pipe); m_pipe->new_msg(); m_inside_msg = true; } /* * End the current message */ void Pipe::end_msg() { if(!m_inside_msg) throw Invalid_State("Pipe::end_msg: Message was already ended"); m_pipe->finish_msg(); clear_endpoints(m_pipe); if(dynamic_cast(m_pipe)) { delete m_pipe; m_pipe = nullptr; } m_inside_msg = false; m_outputs->retire(); } /* * Find the endpoints of the Pipe */ void Pipe::find_endpoints(Filter* f) { for(size_t j = 0; j != f->total_ports(); ++j) if(f->m_next[j] && !dynamic_cast(f->m_next[j])) find_endpoints(f->m_next[j]); else { SecureQueue* q = new SecureQueue; f->m_next[j] = q; m_outputs->add(q); } } /* * Remove the SecureQueues attached to the Filter */ void Pipe::clear_endpoints(Filter* f) { if(!f) return; for(size_t j = 0; j != f->total_ports(); ++j) { if(f->m_next[j] && dynamic_cast(f->m_next[j])) f->m_next[j] = nullptr; clear_endpoints(f->m_next[j]); } } void Pipe::append(Filter* filter) { do_append(filter); } void Pipe::append_filter(Filter* filter) { if(m_outputs->message_count() != 0) throw Invalid_State("Cannot call Pipe::append_filter after start_msg"); do_append(filter); } /* * Append a Filter to the Pipe */ void Pipe::do_append(Filter* filter) { if(!filter) return; if(dynamic_cast(filter)) throw Invalid_Argument("Pipe::append: SecureQueue cannot be used"); if(filter->m_owned) throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); if(m_inside_msg) throw Invalid_State("Cannot append to a Pipe while it is processing"); filter->m_owned = true; if(!m_pipe) m_pipe = filter; else m_pipe->attach(filter); } /* * Prepend a Filter to the Pipe */ void Pipe::prepend(Filter* filter) { if(m_inside_msg) throw Invalid_State("Cannot prepend to a Pipe while it is processing"); if(!filter) return; if(dynamic_cast(filter)) throw Invalid_Argument("Pipe::prepend: SecureQueue cannot be used"); if(filter->m_owned) throw Invalid_Argument("Filters cannot be shared among multiple Pipes"); filter->m_owned = true; if(m_pipe) filter->attach(m_pipe); m_pipe = filter; } /* * Pop a Filter off the Pipe */ void Pipe::pop() { if(m_inside_msg) throw Invalid_State("Cannot pop off a Pipe while it is processing"); if(!m_pipe) return; if(m_pipe->total_ports() > 1) throw Invalid_State("Cannot pop off a Filter with multiple ports"); size_t to_remove = m_pipe->owns() + 1; while(to_remove--) { std::unique_ptr to_destroy(m_pipe); m_pipe = m_pipe->m_next[0]; } } /* * Return the number of messages in this Pipe */ Pipe::message_id Pipe::message_count() const { return m_outputs->message_count(); } /* * Static Member Variables */ const Pipe::message_id Pipe::LAST_MESSAGE = static_cast(-2); const Pipe::message_id Pipe::DEFAULT_MESSAGE = static_cast(-1); } botan-2.4.0/src/lib/filters/pipe.h000066400000000000000000000275001322470703100167360ustar00rootroot00000000000000/* * Pipe * (C) 1999-2007 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PIPE_H_ #define BOTAN_PIPE_H_ #include #include #include #include namespace Botan { class Filter; class Output_Buffers; /** * This class represents pipe objects. * A set of filters can be placed into a pipe, and information flows * through the pipe until it reaches the end, where the output is * collected for retrieval. If you're familiar with the Unix shell * environment, this design will sound quite familiar. */ class BOTAN_PUBLIC_API(2,0) Pipe final : public DataSource { public: /** * An opaque type that identifies a message in this Pipe */ typedef size_t message_id; /** * Exception if you use an invalid message as an argument to * read, remaining, etc */ class BOTAN_PUBLIC_API(2,0) Invalid_Message_Number final : public Invalid_Argument { public: /** * @param where the error occurred * @param msg the invalid message id that was used */ Invalid_Message_Number(const std::string& where, message_id msg) : Invalid_Argument("Pipe::" + where + ": Invalid message number " + std::to_string(msg)) {} }; /** * A meta-id for whatever the last message is */ static const message_id LAST_MESSAGE; /** * A meta-id for the default message (set with set_default_msg) */ static const message_id DEFAULT_MESSAGE; /** * Write input to the pipe, i.e. to its first filter. * @param in the byte array to write * @param length the length of the byte array in */ void write(const uint8_t in[], size_t length); /** * Write input to the pipe, i.e. to its first filter. * @param in the secure_vector containing the data to write */ void write(const secure_vector& in) { write(in.data(), in.size()); } /** * Write input to the pipe, i.e. to its first filter. * @param in the std::vector containing the data to write */ void write(const std::vector& in) { write(in.data(), in.size()); } /** * Write input to the pipe, i.e. to its first filter. * @param in the string containing the data to write */ void write(const std::string& in); /** * Write input to the pipe, i.e. to its first filter. * @param in the DataSource to read the data from */ void write(DataSource& in); /** * Write input to the pipe, i.e. to its first filter. * @param in a single byte to be written */ void write(uint8_t in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the byte array containing the data to write * @param length the length of the byte array to write */ void process_msg(const uint8_t in[], size_t length); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the secure_vector containing the data to write */ void process_msg(const secure_vector& in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the secure_vector containing the data to write */ void process_msg(const std::vector& in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the string containing the data to write */ void process_msg(const std::string& in); /** * Perform start_msg(), write() and end_msg() sequentially. * @param in the DataSource providing the data to write */ void process_msg(DataSource& in); /** * Find out how many bytes are ready to read. * @param msg the number identifying the message * for which the information is desired * @return number of bytes that can still be read */ size_t remaining(message_id msg = DEFAULT_MESSAGE) const BOTAN_WARN_UNUSED_RESULT; /** * Read the default message from the pipe. Moves the internal * offset so that every call to read will return a new portion of * the message. * * @param output the byte array to write the read bytes to * @param length the length of the byte array output * @return number of bytes actually read into output */ size_t read(uint8_t output[], size_t length) override BOTAN_WARN_UNUSED_RESULT; /** * Read a specified message from the pipe. Moves the internal * offset so that every call to read will return a new portion of * the message. * @param output the byte array to write the read bytes to * @param length the length of the byte array output * @param msg the number identifying the message to read from * @return number of bytes actually read into output */ size_t read(uint8_t output[], size_t length, message_id msg) BOTAN_WARN_UNUSED_RESULT; /** * Read a single byte from the pipe. Moves the internal offset so * that every call to read will return a new portion of the * message. * * @param output the byte to write the result to * @param msg the message to read from * @return number of bytes actually read into output */ size_t read(uint8_t& output, message_id msg = DEFAULT_MESSAGE) BOTAN_WARN_UNUSED_RESULT; /** * Read the full contents of the pipe. * @param msg the number identifying the message to read from * @return secure_vector holding the contents of the pipe */ secure_vector read_all(message_id msg = DEFAULT_MESSAGE) BOTAN_WARN_UNUSED_RESULT; /** * Read the full contents of the pipe. * @param msg the number identifying the message to read from * @return string holding the contents of the pipe */ std::string read_all_as_string(message_id msg = DEFAULT_MESSAGE) BOTAN_WARN_UNUSED_RESULT; /** * Read from the default message but do not modify the internal * offset. Consecutive calls to peek() will return portions of * the message starting at the same position. * @param output the byte array to write the peeked message part to * @param length the length of the byte array output * @param offset the offset from the current position in message * @return number of bytes actually peeked and written into output */ size_t peek(uint8_t output[], size_t length, size_t offset) const override BOTAN_WARN_UNUSED_RESULT; /** Read from the specified message but do not modify the * internal offset. Consecutive calls to peek() will return * portions of the message starting at the same position. * @param output the byte array to write the peeked message part to * @param length the length of the byte array output * @param offset the offset from the current position in message * @param msg the number identifying the message to peek from * @return number of bytes actually peeked and written into output */ size_t peek(uint8_t output[], size_t length, size_t offset, message_id msg) const BOTAN_WARN_UNUSED_RESULT; /** Read a single byte from the specified message but do not * modify the internal offset. Consecutive calls to peek() will * return portions of the message starting at the same position. * @param output the byte to write the peeked message byte to * @param offset the offset from the current position in message * @param msg the number identifying the message to peek from * @return number of bytes actually peeked and written into output */ size_t peek(uint8_t& output, size_t offset, message_id msg = DEFAULT_MESSAGE) const BOTAN_WARN_UNUSED_RESULT; /** * @return the number of bytes read from the default message. */ size_t get_bytes_read() const override; /** * @return the number of bytes read from the specified message. */ size_t get_bytes_read(message_id msg) const; bool check_available(size_t n) override; bool check_available_msg(size_t n, message_id msg); /** * @return currently set default message */ size_t default_msg() const { return m_default_read; } /** * Set the default message * @param msg the number identifying the message which is going to * be the new default message */ void set_default_msg(message_id msg); /** * Get the number of messages the are in this pipe. * @return number of messages the are in this pipe */ message_id message_count() const; /** * Test whether this pipe has any data that can be read from. * @return true if there is more data to read, false otherwise */ bool end_of_data() const override; /** * Start a new message in the pipe. A potential other message in this pipe * must be closed with end_msg() before this function may be called. */ void start_msg(); /** * End the current message. */ void end_msg(); /** * Insert a new filter at the front of the pipe * @param filt the new filter to insert */ BOTAN_DEPRECATED("Runtime modification of Pipe deprecated") void prepend(Filter* filt); /** * Insert a new filter at the back of the pipe * @param filt the new filter to insert */ BOTAN_DEPRECATED("Runtime modification of Pipe deprecated") void append(Filter* filt); /** * Remove the first filter at the front of the pipe. */ BOTAN_DEPRECATED("Runtime modification of Pipe deprecated") void pop(); /** * Reset this pipe to an empty pipe. */ BOTAN_DEPRECATED("Runtime modification of Pipe deprecated") void reset(); /** * Append a new filter onto the filter sequence. This may only be * called immediately after initial construction, before _any_ * calls to start_msg have been made. * * This function (unlike append) is not deprecated, as it allows * only modification of the pipe at initialization (before use) * rather than after messages have been processed. */ void append_filter(Filter* filt); /** * Construct a Pipe of up to four filters. The filters are set up * in the same order as the arguments. */ Pipe(Filter* = nullptr, Filter* = nullptr, Filter* = nullptr, Filter* = nullptr); /** * Construct a Pipe from a list of filters * @param filters the set of filters to use */ explicit Pipe(std::initializer_list filters); Pipe(const Pipe&) = delete; Pipe& operator=(const Pipe&) = delete; ~Pipe(); private: void destruct(Filter*); void do_append(Filter* filt); void find_endpoints(Filter*); void clear_endpoints(Filter*); message_id get_message_no(const std::string&, message_id) const; Filter* m_pipe; std::unique_ptr m_outputs; message_id m_default_read; bool m_inside_msg; }; /** * Stream output operator; dumps the results from pipe's default * message to the output stream. * @param out an output stream * @param pipe the pipe */ BOTAN_PUBLIC_API(2,0) std::ostream& operator<<(std::ostream& out, Pipe& pipe); /** * Stream input operator; dumps the remaining bytes of input * to the (assumed open) pipe message. * @param in the input stream * @param pipe the pipe */ BOTAN_PUBLIC_API(2,0) std::istream& operator>>(std::istream& in, Pipe& pipe); } #if defined(BOTAN_HAS_PIPE_UNIXFD_IO) #include #endif #endif botan-2.4.0/src/lib/filters/pipe_io.cpp000066400000000000000000000022721322470703100177570ustar00rootroot00000000000000/* * Pipe I/O * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Write data from a pipe into an ostream */ std::ostream& operator<<(std::ostream& stream, Pipe& pipe) { secure_vector buffer(DEFAULT_BUFFERSIZE); while(stream.good() && pipe.remaining()) { const size_t got = pipe.read(buffer.data(), buffer.size()); stream.write(cast_uint8_ptr_to_char(buffer.data()), got); } if(!stream.good()) throw Stream_IO_Error("Pipe output operator (iostream) has failed"); return stream; } /* * Read data from an istream into a pipe */ std::istream& operator>>(std::istream& stream, Pipe& pipe) { secure_vector buffer(DEFAULT_BUFFERSIZE); while(stream.good()) { stream.read(cast_uint8_ptr_to_char(buffer.data()), buffer.size()); const size_t got = static_cast(stream.gcount()); pipe.write(buffer.data(), got); } if(stream.bad() || (stream.fail() && !stream.eof())) throw Stream_IO_Error("Pipe input operator (iostream) has failed"); return stream; } } botan-2.4.0/src/lib/filters/pipe_rw.cpp000066400000000000000000000073661322470703100200110ustar00rootroot00000000000000/* * Pipe Reading/Writing * (C) 1999-2007 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Look up the canonical ID for a queue */ Pipe::message_id Pipe::get_message_no(const std::string& func_name, message_id msg) const { if(msg == DEFAULT_MESSAGE) msg = default_msg(); else if(msg == LAST_MESSAGE) msg = message_count() - 1; if(msg >= message_count()) throw Invalid_Message_Number(func_name, msg); return msg; } /* * Write into a Pipe */ void Pipe::write(const uint8_t input[], size_t length) { if(!m_inside_msg) throw Invalid_State("Cannot write to a Pipe while it is not processing"); m_pipe->write(input, length); } /* * Write a string into a Pipe */ void Pipe::write(const std::string& str) { write(cast_char_ptr_to_uint8(str.data()), str.size()); } /* * Write a single byte into a Pipe */ void Pipe::write(uint8_t input) { write(&input, 1); } /* * Write the contents of a DataSource into a Pipe */ void Pipe::write(DataSource& source) { secure_vector buffer(DEFAULT_BUFFERSIZE); while(!source.end_of_data()) { size_t got = source.read(buffer.data(), buffer.size()); write(buffer.data(), got); } } /* * Read some data from the pipe */ size_t Pipe::read(uint8_t output[], size_t length, message_id msg) { return m_outputs->read(output, length, get_message_no("read", msg)); } /* * Read some data from the pipe */ size_t Pipe::read(uint8_t output[], size_t length) { return read(output, length, DEFAULT_MESSAGE); } /* * Read a single byte from the pipe */ size_t Pipe::read(uint8_t& out, message_id msg) { return read(&out, 1, msg); } /* * Return all data in the pipe */ secure_vector Pipe::read_all(message_id msg) { msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); secure_vector buffer(remaining(msg)); size_t got = read(buffer.data(), buffer.size(), msg); buffer.resize(got); return buffer; } /* * Return all data in the pipe as a string */ std::string Pipe::read_all_as_string(message_id msg) { msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg()); secure_vector buffer(DEFAULT_BUFFERSIZE); std::string str; str.reserve(remaining(msg)); while(true) { size_t got = read(buffer.data(), buffer.size(), msg); if(got == 0) break; str.append(cast_uint8_ptr_to_char(buffer.data()), got); } return str; } /* * Find out how many bytes are ready to read */ size_t Pipe::remaining(message_id msg) const { return m_outputs->remaining(get_message_no("remaining", msg)); } /* * Peek at some data in the pipe */ size_t Pipe::peek(uint8_t output[], size_t length, size_t offset, message_id msg) const { return m_outputs->peek(output, length, offset, get_message_no("peek", msg)); } /* * Peek at some data in the pipe */ size_t Pipe::peek(uint8_t output[], size_t length, size_t offset) const { return peek(output, length, offset, DEFAULT_MESSAGE); } /* * Peek at a byte in the pipe */ size_t Pipe::peek(uint8_t& out, size_t offset, message_id msg) const { return peek(&out, 1, offset, msg); } size_t Pipe::get_bytes_read() const { return m_outputs->get_bytes_read(default_msg()); } size_t Pipe::get_bytes_read(message_id msg) const { return m_outputs->get_bytes_read(msg); } bool Pipe::check_available(size_t n) { return (n <= remaining(default_msg())); } bool Pipe::check_available_msg(size_t n, message_id msg) { return (n <= remaining(msg)); } } botan-2.4.0/src/lib/filters/secqueue.cpp000066400000000000000000000113511322470703100201500ustar00rootroot00000000000000/* * SecureQueue * (C) 1999-2007 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /** * A node in a SecureQueue */ class SecureQueueNode final { public: SecureQueueNode() : m_buffer(DEFAULT_BUFFERSIZE) { m_next = nullptr; m_start = m_end = 0; } ~SecureQueueNode() { m_next = nullptr; m_start = m_end = 0; } size_t write(const uint8_t input[], size_t length) { size_t copied = std::min(length, m_buffer.size() - m_end); copy_mem(m_buffer.data() + m_end, input, copied); m_end += copied; return copied; } size_t read(uint8_t output[], size_t length) { size_t copied = std::min(length, m_end - m_start); copy_mem(output, m_buffer.data() + m_start, copied); m_start += copied; return copied; } size_t peek(uint8_t output[], size_t length, size_t offset = 0) { const size_t left = m_end - m_start; if(offset >= left) return 0; size_t copied = std::min(length, left - offset); copy_mem(output, m_buffer.data() + m_start + offset, copied); return copied; } size_t size() const { return (m_end - m_start); } private: friend class SecureQueue; SecureQueueNode* m_next; secure_vector m_buffer; size_t m_start, m_end; }; /* * Create a SecureQueue */ SecureQueue::SecureQueue() { m_bytes_read = 0; set_next(nullptr, 0); m_head = m_tail = new SecureQueueNode; } /* * Copy a SecureQueue */ SecureQueue::SecureQueue(const SecureQueue& input) : Fanout_Filter(), DataSource() { m_bytes_read = 0; set_next(nullptr, 0); m_head = m_tail = new SecureQueueNode; SecureQueueNode* temp = input.m_head; while(temp) { write(&temp->m_buffer[temp->m_start], temp->m_end - temp->m_start); temp = temp->m_next; } } /* * Destroy this SecureQueue */ void SecureQueue::destroy() { SecureQueueNode* temp = m_head; while(temp) { SecureQueueNode* holder = temp->m_next; delete temp; temp = holder; } m_head = m_tail = nullptr; } /* * Copy a SecureQueue */ SecureQueue& SecureQueue::operator=(const SecureQueue& input) { if(this == &input) return *this; destroy(); m_bytes_read = input.get_bytes_read(); m_head = m_tail = new SecureQueueNode; SecureQueueNode* temp = input.m_head; while(temp) { write(&temp->m_buffer[temp->m_start], temp->m_end - temp->m_start); temp = temp->m_next; } return (*this); } /* * Add some bytes to the queue */ void SecureQueue::write(const uint8_t input[], size_t length) { if(!m_head) m_head = m_tail = new SecureQueueNode; while(length) { const size_t n = m_tail->write(input, length); input += n; length -= n; if(length) { m_tail->m_next = new SecureQueueNode; m_tail = m_tail->m_next; } } } /* * Read some bytes from the queue */ size_t SecureQueue::read(uint8_t output[], size_t length) { size_t got = 0; while(length && m_head) { const size_t n = m_head->read(output, length); output += n; got += n; length -= n; if(m_head->size() == 0) { SecureQueueNode* holder = m_head->m_next; delete m_head; m_head = holder; } } m_bytes_read += got; return got; } /* * Read data, but do not remove it from queue */ size_t SecureQueue::peek(uint8_t output[], size_t length, size_t offset) const { SecureQueueNode* current = m_head; while(offset && current) { if(offset >= current->size()) { offset -= current->size(); current = current->m_next; } else break; } size_t got = 0; while(length && current) { const size_t n = current->peek(output, length, offset); offset = 0; output += n; got += n; length -= n; current = current->m_next; } return got; } /** * Return how many bytes have been read so far. */ size_t SecureQueue::get_bytes_read() const { return m_bytes_read; } /* * Return how many bytes the queue holds */ size_t SecureQueue::size() const { SecureQueueNode* current = m_head; size_t count = 0; while(current) { count += current->size(); current = current->m_next; } return count; } /* * Test if the queue has any data in it */ bool SecureQueue::end_of_data() const { return (size() == 0); } bool SecureQueue::empty() const { return (size() == 0); } } botan-2.4.0/src/lib/filters/secqueue.h000066400000000000000000000030551322470703100176170ustar00rootroot00000000000000/* * SecureQueue * (C) 1999-2007 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SECURE_QUEUE_H_ #define BOTAN_SECURE_QUEUE_H_ #include #include namespace Botan { /** * A queue that knows how to zeroize itself */ class BOTAN_PUBLIC_API(2,0) SecureQueue final : public Fanout_Filter, public DataSource { public: std::string name() const override { return "Queue"; } void write(const uint8_t[], size_t) override; size_t read(uint8_t[], size_t) override; size_t peek(uint8_t[], size_t, size_t = 0) const override; size_t get_bytes_read() const override; bool end_of_data() const override; bool empty() const; bool check_available(size_t n) override { return n <= size(); } /** * @return number of bytes available in the queue */ size_t size() const; bool attachable() override { return false; } /** * SecureQueue assignment * @param other the queue to copy */ SecureQueue& operator=(const SecureQueue& other); /** * SecureQueue default constructor (creates empty queue) */ SecureQueue(); /** * SecureQueue copy constructor * @param other the queue to copy */ SecureQueue(const SecureQueue& other); ~SecureQueue() { destroy(); } private: void destroy(); size_t m_bytes_read; class SecureQueueNode* m_head; class SecureQueueNode* m_tail; }; } #endif botan-2.4.0/src/lib/filters/threaded_fork.cpp000066400000000000000000000070401322470703100211320ustar00rootroot00000000000000/* * Threaded Fork * (C) 2013 Joel Low * 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #include #include namespace Botan { struct Threaded_Fork_Data { /* * Semaphore for indicating that there is work to be done (or to * quit) */ Semaphore m_input_ready_semaphore; /* * Synchronises all threads to complete processing data in lock-step. */ Barrier m_input_complete_barrier; /* * The work that needs to be done. This should be only when the threads * are NOT running (i.e. before notifying the work condition, after * the input_complete_barrier has reset.) */ const uint8_t* m_input = nullptr; /* * The length of the work that needs to be done. */ size_t m_input_length = 0; }; /* * Threaded_Fork constructor */ Threaded_Fork::Threaded_Fork(Filter* f1, Filter* f2, Filter* f3, Filter* f4) : Fork(nullptr, static_cast(0)), m_thread_data(new Threaded_Fork_Data) { Filter* filters[4] = { f1, f2, f3, f4 }; set_next(filters, 4); } /* * Threaded_Fork constructor */ Threaded_Fork::Threaded_Fork(Filter* filters[], size_t count) : Fork(nullptr, static_cast(0)), m_thread_data(new Threaded_Fork_Data) { set_next(filters, count); } Threaded_Fork::~Threaded_Fork() { m_thread_data->m_input = nullptr; m_thread_data->m_input_length = 0; m_thread_data->m_input_ready_semaphore.release(m_threads.size()); for(auto& thread : m_threads) thread->join(); } std::string Threaded_Fork::name() const { return "Threaded Fork"; } void Threaded_Fork::set_next(Filter* f[], size_t n) { Fork::set_next(f, n); n = m_next.size(); if(n < m_threads.size()) m_threads.resize(n); else { m_threads.reserve(n); for(size_t i = m_threads.size(); i != n; ++i) { m_threads.push_back( std::shared_ptr( new std::thread( std::bind(&Threaded_Fork::thread_entry, this, m_next[i])))); } } } void Threaded_Fork::send(const uint8_t input[], size_t length) { if(m_write_queue.size()) thread_delegate_work(m_write_queue.data(), m_write_queue.size()); thread_delegate_work(input, length); bool nothing_attached = true; for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) nothing_attached = false; if(nothing_attached) m_write_queue += std::make_pair(input, length); else m_write_queue.clear(); } void Threaded_Fork::thread_delegate_work(const uint8_t input[], size_t length) { //Set the data to do. m_thread_data->m_input = input; m_thread_data->m_input_length = length; //Let the workers start processing. m_thread_data->m_input_complete_barrier.wait(total_ports() + 1); m_thread_data->m_input_ready_semaphore.release(total_ports()); //Wait for all the filters to finish processing. m_thread_data->m_input_complete_barrier.sync(); //Reset the thread data m_thread_data->m_input = nullptr; m_thread_data->m_input_length = 0; } void Threaded_Fork::thread_entry(Filter* filter) { while(true) { m_thread_data->m_input_ready_semaphore.acquire(); if(!m_thread_data->m_input) break; filter->write(m_thread_data->m_input, m_thread_data->m_input_length); m_thread_data->m_input_complete_barrier.sync(); } } } #endif botan-2.4.0/src/lib/hash/000077500000000000000000000000001322470703100150775ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/blake2/000077500000000000000000000000001322470703100162375ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/blake2/blake2b.cpp000066400000000000000000000125161322470703100202520ustar00rootroot00000000000000/* * Blake2b * (C) 2016 cynecx * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { enum blake2b_constant { BLAKE2B_BLOCKBYTES = 128, BLAKE2B_IVU64COUNT = 8 }; const uint64_t blake2b_IV[BLAKE2B_IVU64COUNT] = { 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179 }; } Blake2b::Blake2b(size_t output_bits) : m_output_bits(output_bits), m_buffer(BLAKE2B_BLOCKBYTES), m_bufpos(0), m_H(BLAKE2B_IVU64COUNT) { if(output_bits == 0 || output_bits > 512 || output_bits % 8 != 0) { throw Invalid_Argument("Bad output bits size for Blake2b"); } state_init(); } void Blake2b::state_init() { copy_mem(m_H.data(), blake2b_IV, BLAKE2B_IVU64COUNT); m_H[0] ^= 0x01010000 ^ static_cast(output_length()); m_T[0] = m_T[1] = 0; m_F[0] = m_F[1] = 0; } namespace { inline void G(uint64_t& a, uint64_t& b, uint64_t& c, uint64_t& d, uint64_t M0, uint64_t M1) { a = a + b + M0; d = rotr<32>(d ^ a); c = c + d; b = rotr<24>(b ^ c); a = a + b + M1; d = rotr<16>(d ^ a); c = c + d; b = rotr<63>(b ^ c); } template inline void ROUND(uint64_t* v, const uint64_t* M) { G(v[ 0], v[ 4], v[ 8], v[12], M[i0], M[i1]); G(v[ 1], v[ 5], v[ 9], v[13], M[i2], M[i3]); G(v[ 2], v[ 6], v[10], v[14], M[i4], M[i5]); G(v[ 3], v[ 7], v[11], v[15], M[i6], M[i7]); G(v[ 0], v[ 5], v[10], v[15], M[i8], M[i9]); G(v[ 1], v[ 6], v[11], v[12], M[iA], M[iB]); G(v[ 2], v[ 7], v[ 8], v[13], M[iC], M[iD]); G(v[ 3], v[ 4], v[ 9], v[14], M[iE], M[iF]); } } void Blake2b::compress(const uint8_t* input, size_t blocks, uint64_t increment) { for(size_t b = 0; b != blocks; ++b) { m_T[0] += increment; if(m_T[0] < increment) { m_T[1]++; } uint64_t M[16]; uint64_t v[16]; load_le(M, input, 16); input += BLAKE2B_BLOCKBYTES; for(size_t i = 0; i < 8; i++) v[i] = m_H[i]; for(size_t i = 0; i != 8; ++i) v[i + 8] = blake2b_IV[i]; v[12] ^= m_T[0]; v[13] ^= m_T[1]; v[14] ^= m_F[0]; v[15] ^= m_F[1]; ROUND< 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15>(v, M); ROUND<14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3>(v, M); ROUND<11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4>(v, M); ROUND< 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8>(v, M); ROUND< 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13>(v, M); ROUND< 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9>(v, M); ROUND<12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11>(v, M); ROUND<13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10>(v, M); ROUND< 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5>(v, M); ROUND<10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0>(v, M); ROUND< 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15>(v, M); ROUND<14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3>(v, M); for(size_t i = 0; i < 8; i++) { m_H[i] ^= v[i] ^ v[i + 8]; } } } void Blake2b::add_data(const uint8_t input[], size_t length) { if(length == 0) return; if(m_bufpos > 0) { if(m_bufpos < BLAKE2B_BLOCKBYTES) { const size_t take = std::min(BLAKE2B_BLOCKBYTES - m_bufpos, length); copy_mem(&m_buffer[m_bufpos], input, take); m_bufpos += take; length -= take; input += take; } if(m_bufpos == m_buffer.size() && length > 0) { compress(m_buffer.data(), 1, BLAKE2B_BLOCKBYTES); m_bufpos = 0; } } if(length > BLAKE2B_BLOCKBYTES) { const size_t full_blocks = ((length-1) / BLAKE2B_BLOCKBYTES); compress(input, full_blocks, BLAKE2B_BLOCKBYTES); input += full_blocks * BLAKE2B_BLOCKBYTES; length -= full_blocks * BLAKE2B_BLOCKBYTES; } if(length > 0) { copy_mem(&m_buffer[m_bufpos], input, length); m_bufpos += length; } } void Blake2b::final_result(uint8_t output[]) { if(m_bufpos != BLAKE2B_BLOCKBYTES) clear_mem(&m_buffer[m_bufpos], BLAKE2B_BLOCKBYTES - m_bufpos); m_F[0] = 0xFFFFFFFFFFFFFFFF; compress(m_buffer.data(), 1, m_bufpos); copy_out_vec_le(output, output_length(), m_H); clear(); } std::string Blake2b::name() const { return "Blake2b(" + std::to_string(m_output_bits) + ")"; } HashFunction* Blake2b::clone() const { return new Blake2b(m_output_bits); } std::unique_ptr Blake2b::copy_state() const { return std::unique_ptr(new Blake2b(*this)); } void Blake2b::clear() { zeroise(m_H); zeroise(m_buffer); m_bufpos = 0; state_init(); } } botan-2.4.0/src/lib/hash/blake2/blake2b.h000066400000000000000000000022771322470703100177220ustar00rootroot00000000000000/* * Blake2b * (C) 2016 cynecx * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BLAKE2B_H_ #define BOTAN_BLAKE2B_H_ #include #include #include namespace Botan { /** * BLAKE2B */ class BOTAN_PUBLIC_API(2,0) Blake2b final : public HashFunction { public: /** * @param output_bits the output size of Blake2b in bits */ explicit Blake2b(size_t output_bits = 512); size_t hash_block_size() const override { return 128; } size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override; std::string name() const override; void clear() override; std::unique_ptr copy_state() const override; private: void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; void state_init(); void compress(const uint8_t* data, size_t blocks, uint64_t increment); const size_t m_output_bits; secure_vector m_buffer; size_t m_bufpos; secure_vector m_H; uint64_t m_T[2]; uint64_t m_F[2]; }; } #endif botan-2.4.0/src/lib/hash/blake2/info.txt000066400000000000000000000000511322470703100177270ustar00rootroot00000000000000 BLAKE2B -> 20130131 botan-2.4.0/src/lib/hash/checksum/000077500000000000000000000000001322470703100167015ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/checksum/adler32/000077500000000000000000000000001322470703100201355ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/checksum/adler32/adler32.cpp000066400000000000000000000034071322470703100221010ustar00rootroot00000000000000/* * Adler32 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { void adler32_update(const uint8_t input[], size_t length, uint16_t& S1, uint16_t& S2) { uint32_t S1x = S1; uint32_t S2x = S2; while(length >= 16) { S1x += input[ 0]; S2x += S1x; S1x += input[ 1]; S2x += S1x; S1x += input[ 2]; S2x += S1x; S1x += input[ 3]; S2x += S1x; S1x += input[ 4]; S2x += S1x; S1x += input[ 5]; S2x += S1x; S1x += input[ 6]; S2x += S1x; S1x += input[ 7]; S2x += S1x; S1x += input[ 8]; S2x += S1x; S1x += input[ 9]; S2x += S1x; S1x += input[10]; S2x += S1x; S1x += input[11]; S2x += S1x; S1x += input[12]; S2x += S1x; S1x += input[13]; S2x += S1x; S1x += input[14]; S2x += S1x; S1x += input[15]; S2x += S1x; input += 16; length -= 16; } for(size_t j = 0; j != length; ++j) { S1x += input[j]; S2x += S1x; } S1 = S1x % 65521; S2 = S2x % 65521; } } /* * Update an Adler32 Checksum */ void Adler32::add_data(const uint8_t input[], size_t length) { const size_t PROCESS_AMOUNT = 5552; while(length >= PROCESS_AMOUNT) { adler32_update(input, PROCESS_AMOUNT, m_S1, m_S2); input += PROCESS_AMOUNT; length -= PROCESS_AMOUNT; } adler32_update(input, length, m_S1, m_S2); } /* * Finalize an Adler32 Checksum */ void Adler32::final_result(uint8_t output[]) { store_be(output, m_S2, m_S1); clear(); } std::unique_ptr Adler32::copy_state() const { return std::unique_ptr(new Adler32(*this)); } } botan-2.4.0/src/lib/hash/checksum/adler32/adler32.h000066400000000000000000000015311322470703100215420ustar00rootroot00000000000000/* * Adler32 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ADLER32_H_ #define BOTAN_ADLER32_H_ #include namespace Botan { /** * The Adler32 checksum, used in zlib */ class BOTAN_PUBLIC_API(2,0) Adler32 final : public HashFunction { public: std::string name() const override { return "Adler32"; } size_t output_length() const override { return 4; } HashFunction* clone() const override { return new Adler32; } std::unique_ptr copy_state() const override; void clear() override { m_S1 = 1; m_S2 = 0; } Adler32() { clear(); } ~Adler32() { clear(); } private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; uint16_t m_S1, m_S2; }; } #endif botan-2.4.0/src/lib/hash/checksum/adler32/info.txt000066400000000000000000000000511322470703100216250ustar00rootroot00000000000000 ADLER32 -> 20131128 botan-2.4.0/src/lib/hash/checksum/crc24/000077500000000000000000000000001322470703100176165ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/checksum/crc24/crc24.cpp000066400000000000000000000354371322470703100212530ustar00rootroot00000000000000/* * CRC24 * (C) 1999-2007 Jack Lloyd * (C) 2017 [Ribose Inc](https://www.ribose.com). Performed by Krzysztof Kwiatkowski. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { const uint32_t CRC24_T0[256] = { 0x00000000, 0x00FB4C86, 0x000DD58A, 0x00F6990C, 0x00E1E693, 0x001AAA15, 0x00EC3319, 0x00177F9F, 0x003981A1, 0x00C2CD27, 0x0034542B, 0x00CF18AD, 0x00D86732, 0x00232BB4, 0x00D5B2B8, 0x002EFE3E, 0x00894EC5, 0x00720243, 0x00849B4F, 0x007FD7C9, 0x0068A856, 0x0093E4D0, 0x00657DDC, 0x009E315A, 0x00B0CF64, 0x004B83E2, 0x00BD1AEE, 0x00465668, 0x005129F7, 0x00AA6571, 0x005CFC7D, 0x00A7B0FB, 0x00E9D10C, 0x00129D8A, 0x00E40486, 0x001F4800, 0x0008379F, 0x00F37B19, 0x0005E215, 0x00FEAE93, 0x00D050AD, 0x002B1C2B, 0x00DD8527, 0x0026C9A1, 0x0031B63E, 0x00CAFAB8, 0x003C63B4, 0x00C72F32, 0x00609FC9, 0x009BD34F, 0x006D4A43, 0x009606C5, 0x0081795A, 0x007A35DC, 0x008CACD0, 0x0077E056, 0x00591E68, 0x00A252EE, 0x0054CBE2, 0x00AF8764, 0x00B8F8FB, 0x0043B47D, 0x00B52D71, 0x004E61F7, 0x00D2A319, 0x0029EF9F, 0x00DF7693, 0x00243A15, 0x0033458A, 0x00C8090C, 0x003E9000, 0x00C5DC86, 0x00EB22B8, 0x00106E3E, 0x00E6F732, 0x001DBBB4, 0x000AC42B, 0x00F188AD, 0x000711A1, 0x00FC5D27, 0x005BEDDC, 0x00A0A15A, 0x00563856, 0x00AD74D0, 0x00BA0B4F, 0x004147C9, 0x00B7DEC5, 0x004C9243, 0x00626C7D, 0x009920FB, 0x006FB9F7, 0x0094F571, 0x00838AEE, 0x0078C668, 0x008E5F64, 0x007513E2, 0x003B7215, 0x00C03E93, 0x0036A79F, 0x00CDEB19, 0x00DA9486, 0x0021D800, 0x00D7410C, 0x002C0D8A, 0x0002F3B4, 0x00F9BF32, 0x000F263E, 0x00F46AB8, 0x00E31527, 0x001859A1, 0x00EEC0AD, 0x00158C2B, 0x00B23CD0, 0x00497056, 0x00BFE95A, 0x0044A5DC, 0x0053DA43, 0x00A896C5, 0x005E0FC9, 0x00A5434F, 0x008BBD71, 0x0070F1F7, 0x008668FB, 0x007D247D, 0x006A5BE2, 0x00911764, 0x00678E68, 0x009CC2EE, 0x00A44733, 0x005F0BB5, 0x00A992B9, 0x0052DE3F, 0x0045A1A0, 0x00BEED26, 0x0048742A, 0x00B338AC, 0x009DC692, 0x00668A14, 0x00901318, 0x006B5F9E, 0x007C2001, 0x00876C87, 0x0071F58B, 0x008AB90D, 0x002D09F6, 0x00D64570, 0x0020DC7C, 0x00DB90FA, 0x00CCEF65, 0x0037A3E3, 0x00C13AEF, 0x003A7669, 0x00148857, 0x00EFC4D1, 0x00195DDD, 0x00E2115B, 0x00F56EC4, 0x000E2242, 0x00F8BB4E, 0x0003F7C8, 0x004D963F, 0x00B6DAB9, 0x004043B5, 0x00BB0F33, 0x00AC70AC, 0x00573C2A, 0x00A1A526, 0x005AE9A0, 0x0074179E, 0x008F5B18, 0x0079C214, 0x00828E92, 0x0095F10D, 0x006EBD8B, 0x00982487, 0x00636801, 0x00C4D8FA, 0x003F947C, 0x00C90D70, 0x003241F6, 0x00253E69, 0x00DE72EF, 0x0028EBE3, 0x00D3A765, 0x00FD595B, 0x000615DD, 0x00F08CD1, 0x000BC057, 0x001CBFC8, 0x00E7F34E, 0x00116A42, 0x00EA26C4, 0x0076E42A, 0x008DA8AC, 0x007B31A0, 0x00807D26, 0x009702B9, 0x006C4E3F, 0x009AD733, 0x00619BB5, 0x004F658B, 0x00B4290D, 0x0042B001, 0x00B9FC87, 0x00AE8318, 0x0055CF9E, 0x00A35692, 0x00581A14, 0x00FFAAEF, 0x0004E669, 0x00F27F65, 0x000933E3, 0x001E4C7C, 0x00E500FA, 0x001399F6, 0x00E8D570, 0x00C62B4E, 0x003D67C8, 0x00CBFEC4, 0x0030B242, 0x0027CDDD, 0x00DC815B, 0x002A1857, 0x00D154D1, 0x009F3526, 0x006479A0, 0x0092E0AC, 0x0069AC2A, 0x007ED3B5, 0x00859F33, 0x0073063F, 0x00884AB9, 0x00A6B487, 0x005DF801, 0x00AB610D, 0x00502D8B, 0x00475214, 0x00BC1E92, 0x004A879E, 0x00B1CB18, 0x00167BE3, 0x00ED3765, 0x001BAE69, 0x00E0E2EF, 0x00F79D70, 0x000CD1F6, 0x00FA48FA, 0x0001047C, 0x002FFA42, 0x00D4B6C4, 0x00222FC8, 0x00D9634E, 0x00CE1CD1, 0x00355057, 0x00C3C95B, 0x003885DD }; const uint32_t CRC24_T1[256] = { 0x00000000, 0x00488F66, 0x00901ECD, 0x00D891AB, 0x00DB711C, 0x0093FE7A, 0x004B6FD1, 0x0003E0B7, 0x00B6E338, 0x00FE6C5E, 0x0026FDF5, 0x006E7293, 0x006D9224, 0x00251D42, 0x00FD8CE9, 0x00B5038F, 0x006CC771, 0x00244817, 0x00FCD9BC, 0x00B456DA, 0x00B7B66D, 0x00FF390B, 0x0027A8A0, 0x006F27C6, 0x00DA2449, 0x0092AB2F, 0x004A3A84, 0x0002B5E2, 0x00015555, 0x0049DA33, 0x00914B98, 0x00D9C4FE, 0x00D88EE3, 0x00900185, 0x0048902E, 0x00001F48, 0x0003FFFF, 0x004B7099, 0x0093E132, 0x00DB6E54, 0x006E6DDB, 0x0026E2BD, 0x00FE7316, 0x00B6FC70, 0x00B51CC7, 0x00FD93A1, 0x0025020A, 0x006D8D6C, 0x00B44992, 0x00FCC6F4, 0x0024575F, 0x006CD839, 0x006F388E, 0x0027B7E8, 0x00FF2643, 0x00B7A925, 0x0002AAAA, 0x004A25CC, 0x0092B467, 0x00DA3B01, 0x00D9DBB6, 0x009154D0, 0x0049C57B, 0x00014A1D, 0x004B5141, 0x0003DE27, 0x00DB4F8C, 0x0093C0EA, 0x0090205D, 0x00D8AF3B, 0x00003E90, 0x0048B1F6, 0x00FDB279, 0x00B53D1F, 0x006DACB4, 0x002523D2, 0x0026C365, 0x006E4C03, 0x00B6DDA8, 0x00FE52CE, 0x00279630, 0x006F1956, 0x00B788FD, 0x00FF079B, 0x00FCE72C, 0x00B4684A, 0x006CF9E1, 0x00247687, 0x00917508, 0x00D9FA6E, 0x00016BC5, 0x0049E4A3, 0x004A0414, 0x00028B72, 0x00DA1AD9, 0x009295BF, 0x0093DFA2, 0x00DB50C4, 0x0003C16F, 0x004B4E09, 0x0048AEBE, 0x000021D8, 0x00D8B073, 0x00903F15, 0x00253C9A, 0x006DB3FC, 0x00B52257, 0x00FDAD31, 0x00FE4D86, 0x00B6C2E0, 0x006E534B, 0x0026DC2D, 0x00FF18D3, 0x00B797B5, 0x006F061E, 0x00278978, 0x002469CF, 0x006CE6A9, 0x00B47702, 0x00FCF864, 0x0049FBEB, 0x0001748D, 0x00D9E526, 0x00916A40, 0x00928AF7, 0x00DA0591, 0x0002943A, 0x004A1B5C, 0x0096A282, 0x00DE2DE4, 0x0006BC4F, 0x004E3329, 0x004DD39E, 0x00055CF8, 0x00DDCD53, 0x00954235, 0x002041BA, 0x0068CEDC, 0x00B05F77, 0x00F8D011, 0x00FB30A6, 0x00B3BFC0, 0x006B2E6B, 0x0023A10D, 0x00FA65F3, 0x00B2EA95, 0x006A7B3E, 0x0022F458, 0x002114EF, 0x00699B89, 0x00B10A22, 0x00F98544, 0x004C86CB, 0x000409AD, 0x00DC9806, 0x00941760, 0x0097F7D7, 0x00DF78B1, 0x0007E91A, 0x004F667C, 0x004E2C61, 0x0006A307, 0x00DE32AC, 0x0096BDCA, 0x00955D7D, 0x00DDD21B, 0x000543B0, 0x004DCCD6, 0x00F8CF59, 0x00B0403F, 0x0068D194, 0x00205EF2, 0x0023BE45, 0x006B3123, 0x00B3A088, 0x00FB2FEE, 0x0022EB10, 0x006A6476, 0x00B2F5DD, 0x00FA7ABB, 0x00F99A0C, 0x00B1156A, 0x006984C1, 0x00210BA7, 0x00940828, 0x00DC874E, 0x000416E5, 0x004C9983, 0x004F7934, 0x0007F652, 0x00DF67F9, 0x0097E89F, 0x00DDF3C3, 0x00957CA5, 0x004DED0E, 0x00056268, 0x000682DF, 0x004E0DB9, 0x00969C12, 0x00DE1374, 0x006B10FB, 0x00239F9D, 0x00FB0E36, 0x00B38150, 0x00B061E7, 0x00F8EE81, 0x00207F2A, 0x0068F04C, 0x00B134B2, 0x00F9BBD4, 0x00212A7F, 0x0069A519, 0x006A45AE, 0x0022CAC8, 0x00FA5B63, 0x00B2D405, 0x0007D78A, 0x004F58EC, 0x0097C947, 0x00DF4621, 0x00DCA696, 0x009429F0, 0x004CB85B, 0x0004373D, 0x00057D20, 0x004DF246, 0x009563ED, 0x00DDEC8B, 0x00DE0C3C, 0x0096835A, 0x004E12F1, 0x00069D97, 0x00B39E18, 0x00FB117E, 0x002380D5, 0x006B0FB3, 0x0068EF04, 0x00206062, 0x00F8F1C9, 0x00B07EAF, 0x0069BA51, 0x00213537, 0x00F9A49C, 0x00B12BFA, 0x00B2CB4D, 0x00FA442B, 0x0022D580, 0x006A5AE6, 0x00DF5969, 0x0097D60F, 0x004F47A4, 0x0007C8C2, 0x00042875, 0x004CA713, 0x009436B8, 0x00DCB9DE }; const uint32_t CRC24_T2[256] = { 0x00000000, 0x00D70983, 0x00555F80, 0x00825603, 0x0051F286, 0x0086FB05, 0x0004AD06, 0x00D3A485, 0x0059A88B, 0x008EA108, 0x000CF70B, 0x00DBFE88, 0x00085A0D, 0x00DF538E, 0x005D058D, 0x008A0C0E, 0x00491C91, 0x009E1512, 0x001C4311, 0x00CB4A92, 0x0018EE17, 0x00CFE794, 0x004DB197, 0x009AB814, 0x0010B41A, 0x00C7BD99, 0x0045EB9A, 0x0092E219, 0x0041469C, 0x00964F1F, 0x0014191C, 0x00C3109F, 0x006974A4, 0x00BE7D27, 0x003C2B24, 0x00EB22A7, 0x00388622, 0x00EF8FA1, 0x006DD9A2, 0x00BAD021, 0x0030DC2F, 0x00E7D5AC, 0x006583AF, 0x00B28A2C, 0x00612EA9, 0x00B6272A, 0x00347129, 0x00E378AA, 0x00206835, 0x00F761B6, 0x007537B5, 0x00A23E36, 0x00719AB3, 0x00A69330, 0x0024C533, 0x00F3CCB0, 0x0079C0BE, 0x00AEC93D, 0x002C9F3E, 0x00FB96BD, 0x00283238, 0x00FF3BBB, 0x007D6DB8, 0x00AA643B, 0x0029A4CE, 0x00FEAD4D, 0x007CFB4E, 0x00ABF2CD, 0x00785648, 0x00AF5FCB, 0x002D09C8, 0x00FA004B, 0x00700C45, 0x00A705C6, 0x002553C5, 0x00F25A46, 0x0021FEC3, 0x00F6F740, 0x0074A143, 0x00A3A8C0, 0x0060B85F, 0x00B7B1DC, 0x0035E7DF, 0x00E2EE5C, 0x00314AD9, 0x00E6435A, 0x00641559, 0x00B31CDA, 0x003910D4, 0x00EE1957, 0x006C4F54, 0x00BB46D7, 0x0068E252, 0x00BFEBD1, 0x003DBDD2, 0x00EAB451, 0x0040D06A, 0x0097D9E9, 0x00158FEA, 0x00C28669, 0x001122EC, 0x00C62B6F, 0x00447D6C, 0x009374EF, 0x001978E1, 0x00CE7162, 0x004C2761, 0x009B2EE2, 0x00488A67, 0x009F83E4, 0x001DD5E7, 0x00CADC64, 0x0009CCFB, 0x00DEC578, 0x005C937B, 0x008B9AF8, 0x00583E7D, 0x008F37FE, 0x000D61FD, 0x00DA687E, 0x00506470, 0x00876DF3, 0x00053BF0, 0x00D23273, 0x000196F6, 0x00D69F75, 0x0054C976, 0x0083C0F5, 0x00A9041B, 0x007E0D98, 0x00FC5B9B, 0x002B5218, 0x00F8F69D, 0x002FFF1E, 0x00ADA91D, 0x007AA09E, 0x00F0AC90, 0x0027A513, 0x00A5F310, 0x0072FA93, 0x00A15E16, 0x00765795, 0x00F40196, 0x00230815, 0x00E0188A, 0x00371109, 0x00B5470A, 0x00624E89, 0x00B1EA0C, 0x0066E38F, 0x00E4B58C, 0x0033BC0F, 0x00B9B001, 0x006EB982, 0x00ECEF81, 0x003BE602, 0x00E84287, 0x003F4B04, 0x00BD1D07, 0x006A1484, 0x00C070BF, 0x0017793C, 0x00952F3F, 0x004226BC, 0x00918239, 0x00468BBA, 0x00C4DDB9, 0x0013D43A, 0x0099D834, 0x004ED1B7, 0x00CC87B4, 0x001B8E37, 0x00C82AB2, 0x001F2331, 0x009D7532, 0x004A7CB1, 0x00896C2E, 0x005E65AD, 0x00DC33AE, 0x000B3A2D, 0x00D89EA8, 0x000F972B, 0x008DC128, 0x005AC8AB, 0x00D0C4A5, 0x0007CD26, 0x00859B25, 0x005292A6, 0x00813623, 0x00563FA0, 0x00D469A3, 0x00036020, 0x0080A0D5, 0x0057A956, 0x00D5FF55, 0x0002F6D6, 0x00D15253, 0x00065BD0, 0x00840DD3, 0x00530450, 0x00D9085E, 0x000E01DD, 0x008C57DE, 0x005B5E5D, 0x0088FAD8, 0x005FF35B, 0x00DDA558, 0x000AACDB, 0x00C9BC44, 0x001EB5C7, 0x009CE3C4, 0x004BEA47, 0x00984EC2, 0x004F4741, 0x00CD1142, 0x001A18C1, 0x009014CF, 0x00471D4C, 0x00C54B4F, 0x001242CC, 0x00C1E649, 0x0016EFCA, 0x0094B9C9, 0x0043B04A, 0x00E9D471, 0x003EDDF2, 0x00BC8BF1, 0x006B8272, 0x00B826F7, 0x006F2F74, 0x00ED7977, 0x003A70F4, 0x00B07CFA, 0x00677579, 0x00E5237A, 0x00322AF9, 0x00E18E7C, 0x003687FF, 0x00B4D1FC, 0x0063D87F, 0x00A0C8E0, 0x0077C163, 0x00F59760, 0x00229EE3, 0x00F13A66, 0x002633E5, 0x00A465E6, 0x00736C65, 0x00F9606B, 0x002E69E8, 0x00AC3FEB, 0x007B3668, 0x00A892ED, 0x007F9B6E, 0x00FDCD6D, 0x002AC4EE }; const uint32_t CRC24_T3[256] = { 0x00000000, 0x00520936, 0x00A4126C, 0x00F61B5A, 0x004825D8, 0x001A2CEE, 0x00EC37B4, 0x00BE3E82, 0x006B0636, 0x00390F00, 0x00CF145A, 0x009D1D6C, 0x002323EE, 0x00712AD8, 0x00873182, 0x00D538B4, 0x00D60C6C, 0x0084055A, 0x00721E00, 0x00201736, 0x009E29B4, 0x00CC2082, 0x003A3BD8, 0x006832EE, 0x00BD0A5A, 0x00EF036C, 0x00191836, 0x004B1100, 0x00F52F82, 0x00A726B4, 0x00513DEE, 0x000334D8, 0x00AC19D8, 0x00FE10EE, 0x00080BB4, 0x005A0282, 0x00E43C00, 0x00B63536, 0x00402E6C, 0x0012275A, 0x00C71FEE, 0x009516D8, 0x00630D82, 0x003104B4, 0x008F3A36, 0x00DD3300, 0x002B285A, 0x0079216C, 0x007A15B4, 0x00281C82, 0x00DE07D8, 0x008C0EEE, 0x0032306C, 0x0060395A, 0x00962200, 0x00C42B36, 0x00111382, 0x00431AB4, 0x00B501EE, 0x00E708D8, 0x0059365A, 0x000B3F6C, 0x00FD2436, 0x00AF2D00, 0x00A37F36, 0x00F17600, 0x00076D5A, 0x0055646C, 0x00EB5AEE, 0x00B953D8, 0x004F4882, 0x001D41B4, 0x00C87900, 0x009A7036, 0x006C6B6C, 0x003E625A, 0x00805CD8, 0x00D255EE, 0x00244EB4, 0x00764782, 0x0075735A, 0x00277A6C, 0x00D16136, 0x00836800, 0x003D5682, 0x006F5FB4, 0x009944EE, 0x00CB4DD8, 0x001E756C, 0x004C7C5A, 0x00BA6700, 0x00E86E36, 0x005650B4, 0x00045982, 0x00F242D8, 0x00A04BEE, 0x000F66EE, 0x005D6FD8, 0x00AB7482, 0x00F97DB4, 0x00474336, 0x00154A00, 0x00E3515A, 0x00B1586C, 0x006460D8, 0x003669EE, 0x00C072B4, 0x00927B82, 0x002C4500, 0x007E4C36, 0x0088576C, 0x00DA5E5A, 0x00D96A82, 0x008B63B4, 0x007D78EE, 0x002F71D8, 0x00914F5A, 0x00C3466C, 0x00355D36, 0x00675400, 0x00B26CB4, 0x00E06582, 0x00167ED8, 0x004477EE, 0x00FA496C, 0x00A8405A, 0x005E5B00, 0x000C5236, 0x0046FF6C, 0x0014F65A, 0x00E2ED00, 0x00B0E436, 0x000EDAB4, 0x005CD382, 0x00AAC8D8, 0x00F8C1EE, 0x002DF95A, 0x007FF06C, 0x0089EB36, 0x00DBE200, 0x0065DC82, 0x0037D5B4, 0x00C1CEEE, 0x0093C7D8, 0x0090F300, 0x00C2FA36, 0x0034E16C, 0x0066E85A, 0x00D8D6D8, 0x008ADFEE, 0x007CC4B4, 0x002ECD82, 0x00FBF536, 0x00A9FC00, 0x005FE75A, 0x000DEE6C, 0x00B3D0EE, 0x00E1D9D8, 0x0017C282, 0x0045CBB4, 0x00EAE6B4, 0x00B8EF82, 0x004EF4D8, 0x001CFDEE, 0x00A2C36C, 0x00F0CA5A, 0x0006D100, 0x0054D836, 0x0081E082, 0x00D3E9B4, 0x0025F2EE, 0x0077FBD8, 0x00C9C55A, 0x009BCC6C, 0x006DD736, 0x003FDE00, 0x003CEAD8, 0x006EE3EE, 0x0098F8B4, 0x00CAF182, 0x0074CF00, 0x0026C636, 0x00D0DD6C, 0x0082D45A, 0x0057ECEE, 0x0005E5D8, 0x00F3FE82, 0x00A1F7B4, 0x001FC936, 0x004DC000, 0x00BBDB5A, 0x00E9D26C, 0x00E5805A, 0x00B7896C, 0x00419236, 0x00139B00, 0x00ADA582, 0x00FFACB4, 0x0009B7EE, 0x005BBED8, 0x008E866C, 0x00DC8F5A, 0x002A9400, 0x00789D36, 0x00C6A3B4, 0x0094AA82, 0x0062B1D8, 0x0030B8EE, 0x00338C36, 0x00618500, 0x00979E5A, 0x00C5976C, 0x007BA9EE, 0x0029A0D8, 0x00DFBB82, 0x008DB2B4, 0x00588A00, 0x000A8336, 0x00FC986C, 0x00AE915A, 0x0010AFD8, 0x0042A6EE, 0x00B4BDB4, 0x00E6B482, 0x00499982, 0x001B90B4, 0x00ED8BEE, 0x00BF82D8, 0x0001BC5A, 0x0053B56C, 0x00A5AE36, 0x00F7A700, 0x00229FB4, 0x00709682, 0x00868DD8, 0x00D484EE, 0x006ABA6C, 0x0038B35A, 0x00CEA800, 0x009CA136, 0x009F95EE, 0x00CD9CD8, 0x003B8782, 0x00698EB4, 0x00D7B036, 0x0085B900, 0x0073A25A, 0x0021AB6C, 0x00F493D8, 0x00A69AEE, 0x005081B4, 0x00028882, 0x00BCB600, 0x00EEBF36, 0x0018A46C, 0x004AAD5A }; inline uint32_t process8(uint32_t crc, uint8_t data) { return (crc >> 8) ^ CRC24_T0[(crc & 0xff) ^ data]; } inline uint32_t process32(uint32_t crc, uint32_t word) { crc ^= word; crc = CRC24_T3[(crc >> 0) & 0xff] ^ CRC24_T2[(crc >> 8) & 0xff] ^ CRC24_T1[(crc >> 16) & 0xff] ^ CRC24_T0[(crc >> 24) & 0xff]; return crc; } } std::unique_ptr CRC24::copy_state() const { return std::unique_ptr(new CRC24(*this)); } /* * Update a CRC24 Checksum * * Implementation uses Slicing-by-N algorithm described in * "Novel Table Lookup-Based Algorithms for High-Performance * CRC Generation", by M.Kounavis. * * This algorithm uses 4 precomputed look-up tables. First * table T0 is computed same way as in a method proposed * by D. Sarwate (1988). Then T_1, T2 and T3 are computed * in following way: * * T1[j] = (T0[j] >> 8) ^ T0[ T0[j] & 0xFF ] * T2[j] = (T1[j] >> 8) ^ T0[ T1[j] & 0xFF ] * T3[j] = (T2[j] >> 8) ^ T0[ T2[j] & 0xFF ] * */ void CRC24::add_data(const uint8_t input[], size_t length) { uint32_t d[4]; uint32_t tmp = m_crc; // Input is word aligned if WA & input == 0 static const uint8_t WA = (BOTAN_MP_WORD_BITS/8) - 1; // Ensure input is word aligned before processing in parallel for(;length && (reinterpret_cast(input) & WA); length--) tmp = process8(tmp, *input++); while(length >= 16) { load_le(d, input, 4); tmp = process32(tmp, d[0]); tmp = process32(tmp, d[1]); tmp = process32(tmp, d[2]); tmp = process32(tmp, d[3]); input += 16; length -= 16; } while(length--) tmp = process8(tmp, *input++); m_crc = tmp & 0xffffff; } /* * Finalize a CRC24 Checksum */ void CRC24::final_result(uint8_t output[]) { output[0] = get_byte(3, m_crc); output[1] = get_byte(2, m_crc); output[2] = get_byte(1, m_crc); clear(); } } botan-2.4.0/src/lib/hash/checksum/crc24/crc24.h000066400000000000000000000016241322470703100207070ustar00rootroot00000000000000/* * CRC24 * (C) 1999-2007 Jack Lloyd * (C) 2017 [Ribose Inc](https://www.ribose.com). Performed by Krzysztof Kwiatkowski. * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CRC24_H_ #define BOTAN_CRC24_H_ #include namespace Botan { /** * 24-bit cyclic redundancy check */ class BOTAN_PUBLIC_API(2,0) CRC24 final : public HashFunction { public: std::string name() const override { return "CRC24"; } size_t output_length() const override { return 3; } HashFunction* clone() const override { return new CRC24; } std::unique_ptr copy_state() const override; void clear() override { m_crc = 0XCE04B7L; } CRC24() { clear(); } ~CRC24() { clear(); } private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; uint32_t m_crc; }; } #endif botan-2.4.0/src/lib/hash/checksum/crc24/info.txt000066400000000000000000000000471322470703100213130ustar00rootroot00000000000000 CRC24 -> 20131128 botan-2.4.0/src/lib/hash/checksum/crc32/000077500000000000000000000000001322470703100176155ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/checksum/crc32/crc32.cpp000066400000000000000000000117311322470703100212400ustar00rootroot00000000000000/* * CRC32 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::unique_ptr CRC32::copy_state() const { return std::unique_ptr(new CRC32(*this)); } /* * Update a CRC32 Checksum */ void CRC32::add_data(const uint8_t input[], size_t length) { const uint32_t TABLE[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; uint32_t tmp = m_crc; while(length >= 16) { tmp = TABLE[(tmp ^ input[ 0]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 1]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 2]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 3]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 4]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 5]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 6]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 7]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 8]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[ 9]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[10]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[11]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[12]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[13]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[14]) & 0xFF] ^ (tmp >> 8); tmp = TABLE[(tmp ^ input[15]) & 0xFF] ^ (tmp >> 8); input += 16; length -= 16; } for(size_t i = 0; i != length; ++i) tmp = TABLE[(tmp ^ input[i]) & 0xFF] ^ (tmp >> 8); m_crc = tmp; } /* * Finalize a CRC32 Checksum */ void CRC32::final_result(uint8_t output[]) { m_crc ^= 0xFFFFFFFF; store_be(m_crc, output); clear(); } } botan-2.4.0/src/lib/hash/checksum/crc32/crc32.h000066400000000000000000000015001322470703100206760ustar00rootroot00000000000000/* * CRC32 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CRC32_H_ #define BOTAN_CRC32_H_ #include namespace Botan { /** * 32-bit cyclic redundancy check */ class BOTAN_PUBLIC_API(2,0) CRC32 final : public HashFunction { public: std::string name() const override { return "CRC32"; } size_t output_length() const override { return 4; } HashFunction* clone() const override { return new CRC32; } std::unique_ptr copy_state() const override; void clear() override { m_crc = 0xFFFFFFFF; } CRC32() { clear(); } ~CRC32() { clear(); } private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; uint32_t m_crc; }; } #endif botan-2.4.0/src/lib/hash/checksum/crc32/info.txt000066400000000000000000000000471322470703100213120ustar00rootroot00000000000000 CRC32 -> 20131128 botan-2.4.0/src/lib/hash/comb4p/000077500000000000000000000000001322470703100162635ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/comb4p/comb4p.cpp000066400000000000000000000051301322470703100201520ustar00rootroot00000000000000/* * Comb4P hash combiner * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { void comb4p_round(secure_vector& out, const secure_vector& in, uint8_t round_no, HashFunction& h1, HashFunction& h2) { h1.update(round_no); h2.update(round_no); h1.update(in.data(), in.size()); h2.update(in.data(), in.size()); secure_vector h_buf = h1.final(); xor_buf(out.data(), h_buf.data(), std::min(out.size(), h_buf.size())); h_buf = h2.final(); xor_buf(out.data(), h_buf.data(), std::min(out.size(), h_buf.size())); } } Comb4P::Comb4P(HashFunction* h1, HashFunction* h2) : m_hash1(h1), m_hash2(h2) { if(m_hash1->name() == m_hash2->name()) throw Invalid_Argument("Comb4P: Must use two distinct hashes"); if(m_hash1->output_length() != m_hash2->output_length()) throw Invalid_Argument("Comb4P: Incompatible hashes " + m_hash1->name() + " and " + m_hash2->name()); clear(); } size_t Comb4P::hash_block_size() const { if(m_hash1->hash_block_size() == m_hash2->hash_block_size()) return m_hash1->hash_block_size(); /* * Return LCM of the block sizes? This would probably be OK for * HMAC, which is the main thing relying on knowing the block size. */ return 0; } void Comb4P::clear() { m_hash1->clear(); m_hash2->clear(); // Prep for processing next message, if any m_hash1->update(0); m_hash2->update(0); } std::unique_ptr Comb4P::copy_state() const { std::unique_ptr copy(new Comb4P); copy->m_hash1 = m_hash1->copy_state(); copy->m_hash2 = m_hash2->copy_state(); return std::move(copy); } void Comb4P::add_data(const uint8_t input[], size_t length) { m_hash1->update(input, length); m_hash2->update(input, length); } void Comb4P::final_result(uint8_t out[]) { secure_vector h1 = m_hash1->final(); secure_vector h2 = m_hash2->final(); // First round xor_buf(h1.data(), h2.data(), std::min(h1.size(), h2.size())); // Second round comb4p_round(h2, h1, 1, *m_hash1, *m_hash2); // Third round comb4p_round(h1, h2, 2, *m_hash1, *m_hash2); copy_mem(out , h1.data(), h1.size()); copy_mem(out + h1.size(), h2.data(), h2.size()); // Prep for processing next message, if any m_hash1->update(0); m_hash2->update(0); } } botan-2.4.0/src/lib/hash/comb4p/comb4p.h000066400000000000000000000025001322470703100176150ustar00rootroot00000000000000/* * Comb4P hash combiner * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_COMB4P_H_ #define BOTAN_COMB4P_H_ #include namespace Botan { /** * Combines two hash functions using a Feistel scheme. Described in * "On the Security of Hash Function Combiners", Anja Lehmann */ class BOTAN_PUBLIC_API(2,0) Comb4P final : public HashFunction { public: /** * @param h1 the first hash * @param h2 the second hash */ Comb4P(HashFunction* h1, HashFunction* h2); size_t hash_block_size() const override; size_t output_length() const override { return m_hash1->output_length() + m_hash2->output_length(); } HashFunction* clone() const override { return new Comb4P(m_hash1->clone(), m_hash2->clone()); } std::unique_ptr copy_state() const override; std::string name() const override { return "Comb4P(" + m_hash1->name() + "," + m_hash2->name() + ")"; } void clear() override; private: Comb4P() = default; void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; std::unique_ptr m_hash1, m_hash2; }; } #endif botan-2.4.0/src/lib/hash/comb4p/info.txt000066400000000000000000000000501322470703100177520ustar00rootroot00000000000000 COMB4P -> 20131128 botan-2.4.0/src/lib/hash/gost_3411/000077500000000000000000000000001322470703100165235ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/gost_3411/gost_3411.cpp000066400000000000000000000207371322470703100206640ustar00rootroot00000000000000/* * GOST 34.11 * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /** * GOST 34.11 Constructor */ GOST_34_11::GOST_34_11() : m_cipher(GOST_28147_89_Params("R3411_CryptoPro")), m_buffer(32), m_sum(32), m_hash(32) { m_count = 0; m_position = 0; } void GOST_34_11::clear() { m_cipher.clear(); zeroise(m_sum); zeroise(m_hash); m_count = 0; m_position = 0; } std::unique_ptr GOST_34_11::copy_state() const { return std::unique_ptr(new GOST_34_11(*this)); } /** * Hash additional inputs */ void GOST_34_11::add_data(const uint8_t input[], size_t length) { m_count += length; if(m_position) { buffer_insert(m_buffer, m_position, input, length); if(m_position + length >= hash_block_size()) { compress_n(m_buffer.data(), 1); input += (hash_block_size() - m_position); length -= (hash_block_size() - m_position); m_position = 0; } } const size_t full_blocks = length / hash_block_size(); const size_t remaining = length % hash_block_size(); if(full_blocks) compress_n(input, full_blocks); buffer_insert(m_buffer, m_position, input + full_blocks * hash_block_size(), remaining); m_position += remaining; } /** * The GOST 34.11 compression function */ void GOST_34_11::compress_n(const uint8_t input[], size_t blocks) { for(size_t i = 0; i != blocks; ++i) { for(uint16_t j = 0, carry = 0; j != 32; ++j) { uint16_t s = m_sum[j] + input[32*i+j] + carry; carry = get_byte(0, s); m_sum[j] = get_byte(1, s); } uint8_t S[32] = { 0 }; uint64_t U[4], V[4]; load_be(U, m_hash.data(), 4); load_be(V, input + 32*i, 4); for(size_t j = 0; j != 4; ++j) { uint8_t key[32] = { 0 }; // P transformation for(size_t k = 0; k != 4; ++k) { const uint64_t UVk = U[k] ^ V[k]; for(size_t l = 0; l != 8; ++l) key[4*l+k] = get_byte(l, UVk); } m_cipher.set_key(key, 32); m_cipher.encrypt(&m_hash[8*j], S + 8*j); if(j == 3) break; // A(x) uint64_t A_U = U[0]; U[0] = U[1]; U[1] = U[2]; U[2] = U[3]; U[3] = U[0] ^ A_U; if(j == 1) // C_3 { U[0] ^= 0x00FF00FF00FF00FF; U[1] ^= 0xFF00FF00FF00FF00; U[2] ^= 0x00FFFF00FF0000FF; U[3] ^= 0xFF000000FFFF00FF; } // A(A(x)) uint64_t AA_V_1 = V[0] ^ V[1]; uint64_t AA_V_2 = V[1] ^ V[2]; V[0] = V[2]; V[1] = V[3]; V[2] = AA_V_1; V[3] = AA_V_2; } uint8_t S2[32] = { 0 }; // 12 rounds of psi S2[ 0] = S[24]; S2[ 1] = S[25]; S2[ 2] = S[26]; S2[ 3] = S[27]; S2[ 4] = S[28]; S2[ 5] = S[29]; S2[ 6] = S[30]; S2[ 7] = S[31]; S2[ 8] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[ 6] ^ S[24] ^ S[30]; S2[ 9] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[ 7] ^ S[25] ^ S[31]; S2[10] = S[ 0] ^ S[ 8] ^ S[24] ^ S[26] ^ S[30]; S2[11] = S[ 1] ^ S[ 9] ^ S[25] ^ S[27] ^ S[31]; S2[12] = S[ 0] ^ S[ 4] ^ S[ 6] ^ S[10] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[13] = S[ 1] ^ S[ 5] ^ S[ 7] ^ S[11] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[14] = S[ 0] ^ S[ 4] ^ S[ 8] ^ S[12] ^ S[24] ^ S[26] ^ S[28]; S2[15] = S[ 1] ^ S[ 5] ^ S[ 9] ^ S[13] ^ S[25] ^ S[27] ^ S[29]; S2[16] = S[ 2] ^ S[ 6] ^ S[10] ^ S[14] ^ S[26] ^ S[28] ^ S[30]; S2[17] = S[ 3] ^ S[ 7] ^ S[11] ^ S[15] ^ S[27] ^ S[29] ^ S[31]; S2[18] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[12] ^ S[16] ^ S[24] ^ S[28]; S2[19] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[13] ^ S[17] ^ S[25] ^ S[29]; S2[20] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[14] ^ S[18] ^ S[26] ^ S[30]; S2[21] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[15] ^ S[19] ^ S[27] ^ S[31]; S2[22] = S[ 0] ^ S[ 2] ^ S[10] ^ S[12] ^ S[16] ^ S[20] ^ S[24] ^ S[28] ^ S[30]; S2[23] = S[ 1] ^ S[ 3] ^ S[11] ^ S[13] ^ S[17] ^ S[21] ^ S[25] ^ S[29] ^ S[31]; S2[24] = S[ 0] ^ S[ 6] ^ S[12] ^ S[14] ^ S[18] ^ S[22] ^ S[24] ^ S[26]; S2[25] = S[ 1] ^ S[ 7] ^ S[13] ^ S[15] ^ S[19] ^ S[23] ^ S[25] ^ S[27]; S2[26] = S[ 2] ^ S[ 8] ^ S[14] ^ S[16] ^ S[20] ^ S[24] ^ S[26] ^ S[28]; S2[27] = S[ 3] ^ S[ 9] ^ S[15] ^ S[17] ^ S[21] ^ S[25] ^ S[27] ^ S[29]; S2[28] = S[ 4] ^ S[10] ^ S[16] ^ S[18] ^ S[22] ^ S[26] ^ S[28] ^ S[30]; S2[29] = S[ 5] ^ S[11] ^ S[17] ^ S[19] ^ S[23] ^ S[27] ^ S[29] ^ S[31]; S2[30] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[12] ^ S[18] ^ S[20] ^ S[28]; S2[31] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[13] ^ S[19] ^ S[21] ^ S[29]; xor_buf(S, S2, input + 32*i, 32); S2[0] = S[0] ^ S[2] ^ S[4] ^ S[6] ^ S[24] ^ S[30]; S2[1] = S[1] ^ S[3] ^ S[5] ^ S[7] ^ S[25] ^ S[31]; copy_mem(S, S+2, 30); S[30] = S2[0]; S[31] = S2[1]; xor_buf(S, m_hash.data(), 32); // 61 rounds of psi S2[ 0] = S[ 2] ^ S[ 6] ^ S[14] ^ S[20] ^ S[22] ^ S[26] ^ S[28] ^ S[30]; S2[ 1] = S[ 3] ^ S[ 7] ^ S[15] ^ S[21] ^ S[23] ^ S[27] ^ S[29] ^ S[31]; S2[ 2] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[16] ^ S[22] ^ S[28]; S2[ 3] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[17] ^ S[23] ^ S[29]; S2[ 4] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[18] ^ S[24] ^ S[30]; S2[ 5] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[19] ^ S[25] ^ S[31]; S2[ 6] = S[ 0] ^ S[ 2] ^ S[10] ^ S[12] ^ S[20] ^ S[24] ^ S[26] ^ S[30]; S2[ 7] = S[ 1] ^ S[ 3] ^ S[11] ^ S[13] ^ S[21] ^ S[25] ^ S[27] ^ S[31]; S2[ 8] = S[ 0] ^ S[ 6] ^ S[12] ^ S[14] ^ S[22] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[ 9] = S[ 1] ^ S[ 7] ^ S[13] ^ S[15] ^ S[23] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[10] = S[ 0] ^ S[ 4] ^ S[ 6] ^ S[ 8] ^ S[14] ^ S[16] ^ S[26] ^ S[28]; S2[11] = S[ 1] ^ S[ 5] ^ S[ 7] ^ S[ 9] ^ S[15] ^ S[17] ^ S[27] ^ S[29]; S2[12] = S[ 2] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[16] ^ S[18] ^ S[28] ^ S[30]; S2[13] = S[ 3] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[17] ^ S[19] ^ S[29] ^ S[31]; S2[14] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[12] ^ S[18] ^ S[20] ^ S[24]; S2[15] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[13] ^ S[19] ^ S[21] ^ S[25]; S2[16] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[10] ^ S[12] ^ S[14] ^ S[20] ^ S[22] ^ S[26]; S2[17] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[11] ^ S[13] ^ S[15] ^ S[21] ^ S[23] ^ S[27]; S2[18] = S[ 4] ^ S[ 6] ^ S[10] ^ S[12] ^ S[14] ^ S[16] ^ S[22] ^ S[24] ^ S[28]; S2[19] = S[ 5] ^ S[ 7] ^ S[11] ^ S[13] ^ S[15] ^ S[17] ^ S[23] ^ S[25] ^ S[29]; S2[20] = S[ 6] ^ S[ 8] ^ S[12] ^ S[14] ^ S[16] ^ S[18] ^ S[24] ^ S[26] ^ S[30]; S2[21] = S[ 7] ^ S[ 9] ^ S[13] ^ S[15] ^ S[17] ^ S[19] ^ S[25] ^ S[27] ^ S[31]; S2[22] = S[ 0] ^ S[ 2] ^ S[ 4] ^ S[ 6] ^ S[ 8] ^ S[10] ^ S[14] ^ S[16] ^ S[18] ^ S[20] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[23] = S[ 1] ^ S[ 3] ^ S[ 5] ^ S[ 7] ^ S[ 9] ^ S[11] ^ S[15] ^ S[17] ^ S[19] ^ S[21] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[24] = S[ 0] ^ S[ 8] ^ S[10] ^ S[12] ^ S[16] ^ S[18] ^ S[20] ^ S[22] ^ S[24] ^ S[26] ^ S[28]; S2[25] = S[ 1] ^ S[ 9] ^ S[11] ^ S[13] ^ S[17] ^ S[19] ^ S[21] ^ S[23] ^ S[25] ^ S[27] ^ S[29]; S2[26] = S[ 2] ^ S[10] ^ S[12] ^ S[14] ^ S[18] ^ S[20] ^ S[22] ^ S[24] ^ S[26] ^ S[28] ^ S[30]; S2[27] = S[ 3] ^ S[11] ^ S[13] ^ S[15] ^ S[19] ^ S[21] ^ S[23] ^ S[25] ^ S[27] ^ S[29] ^ S[31]; S2[28] = S[ 0] ^ S[ 2] ^ S[ 6] ^ S[12] ^ S[14] ^ S[16] ^ S[20] ^ S[22] ^ S[26] ^ S[28]; S2[29] = S[ 1] ^ S[ 3] ^ S[ 7] ^ S[13] ^ S[15] ^ S[17] ^ S[21] ^ S[23] ^ S[27] ^ S[29]; S2[30] = S[ 2] ^ S[ 4] ^ S[ 8] ^ S[14] ^ S[16] ^ S[18] ^ S[22] ^ S[24] ^ S[28] ^ S[30]; S2[31] = S[ 3] ^ S[ 5] ^ S[ 9] ^ S[15] ^ S[17] ^ S[19] ^ S[23] ^ S[25] ^ S[29] ^ S[31]; copy_mem(m_hash.data(), S2, 32); } } /** * Produce the final GOST 34.11 output */ void GOST_34_11::final_result(uint8_t out[]) { if(m_position) { clear_mem(m_buffer.data() + m_position, m_buffer.size() - m_position); compress_n(m_buffer.data(), 1); } secure_vector length_buf(32); const uint64_t bit_count = m_count * 8; store_le(bit_count, length_buf.data()); secure_vector sum_buf = m_sum; compress_n(length_buf.data(), 1); compress_n(sum_buf.data(), 1); copy_mem(out, m_hash.data(), 32); clear(); } } botan-2.4.0/src/lib/hash/gost_3411/gost_3411.h000066400000000000000000000020311322470703100203140ustar00rootroot00000000000000/* * GOST 34.11 * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GOST_3411_H_ #define BOTAN_GOST_3411_H_ #include #include namespace Botan { /** * GOST 34.11 */ class BOTAN_PUBLIC_API(2,0) GOST_34_11 final : public HashFunction { public: std::string name() const override { return "GOST-R-34.11-94" ; } size_t output_length() const override { return 32; } size_t hash_block_size() const override { return 32; } HashFunction* clone() const override { return new GOST_34_11; } std::unique_ptr copy_state() const override; void clear() override; GOST_34_11(); private: void compress_n(const uint8_t input[], size_t blocks); void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; GOST_28147_89 m_cipher; secure_vector m_buffer, m_sum, m_hash; size_t m_position; uint64_t m_count; }; } #endif botan-2.4.0/src/lib/hash/gost_3411/info.txt000066400000000000000000000001171322470703100202160ustar00rootroot00000000000000 GOST_34_11 -> 20131128 gost_28147 botan-2.4.0/src/lib/hash/hash.cpp000066400000000000000000000170461322470703100165360ustar00rootroot00000000000000/* * Hash Functions * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_ADLER32) #include #endif #if defined(BOTAN_HAS_CRC24) #include #endif #if defined(BOTAN_HAS_CRC32) #include #endif #if defined(BOTAN_HAS_GOST_34_11) #include #endif #if defined(BOTAN_HAS_KECCAK) #include #endif #if defined(BOTAN_HAS_MD4) #include #endif #if defined(BOTAN_HAS_MD5) #include #endif #if defined(BOTAN_HAS_RIPEMD_160) #include #endif #if defined(BOTAN_HAS_SHA1) #include #endif #if defined(BOTAN_HAS_SHA2_32) #include #endif #if defined(BOTAN_HAS_SHA2_64) #include #endif #if defined(BOTAN_HAS_SHA3) #include #endif #if defined(BOTAN_HAS_SHAKE) #include #endif #if defined(BOTAN_HAS_SKEIN_512) #include #endif #if defined(BOTAN_HAS_STREEBOG) #include #endif #if defined(BOTAN_HAS_SM3) #include #endif #if defined(BOTAN_HAS_TIGER) #include #endif #if defined(BOTAN_HAS_WHIRLPOOL) #include #endif #if defined(BOTAN_HAS_PARALLEL_HASH) #include #endif #if defined(BOTAN_HAS_COMB4P) #include #endif #if defined(BOTAN_HAS_BLAKE2B) #include #endif #if defined(BOTAN_HAS_BEARSSL) #include #endif #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { std::unique_ptr HashFunction::create(const std::string& algo_spec, const std::string& provider) { #if defined(BOTAN_HAS_OPENSSL) if(provider.empty() || provider == "openssl") { if(auto hash = make_openssl_hash(algo_spec)) return hash; if(!provider.empty()) return nullptr; } #endif #if defined(BOTAN_HAS_BEARSSL) if(provider.empty() || provider == "bearssl") { if(auto hash = make_bearssl_hash(algo_spec)) return hash; if(!provider.empty()) return nullptr; } #endif // TODO: CommonCrypto hashes if(provider.empty() == false && provider != "base") return nullptr; // unknown provider #if defined(BOTAN_HAS_SHA1) if(algo_spec == "SHA-160" || algo_spec == "SHA-1" || algo_spec == "SHA1") { return std::unique_ptr(new SHA_160); } #endif #if defined(BOTAN_HAS_SHA2_32) if(algo_spec == "SHA-224") { return std::unique_ptr(new SHA_224); } if(algo_spec == "SHA-256") { return std::unique_ptr(new SHA_256); } #endif #if defined(BOTAN_HAS_SHA2_64) if(algo_spec == "SHA-384") { return std::unique_ptr(new SHA_384); } if(algo_spec == "SHA-512") { return std::unique_ptr(new SHA_512); } if(algo_spec == "SHA-512-256") { return std::unique_ptr(new SHA_512_256); } #endif #if defined(BOTAN_HAS_RIPEMD_160) if(algo_spec == "RIPEMD-160") { return std::unique_ptr(new RIPEMD_160); } #endif #if defined(BOTAN_HAS_WHIRLPOOL) if(algo_spec == "Whirlpool") { return std::unique_ptr(new Whirlpool); } #endif #if defined(BOTAN_HAS_MD5) if(algo_spec == "MD5") { return std::unique_ptr(new MD5); } #endif #if defined(BOTAN_HAS_MD4) if(algo_spec == "MD4") { return std::unique_ptr(new MD4); } #endif #if defined(BOTAN_HAS_GOST_34_11) if(algo_spec == "GOST-R-34.11-94" || algo_spec == "GOST-34.11") { return std::unique_ptr(new GOST_34_11); } #endif #if defined(BOTAN_HAS_ADLER32) if(algo_spec == "Adler32") { return std::unique_ptr(new Adler32); } #endif #if defined(BOTAN_HAS_CRC24) if(algo_spec == "CRC24") { return std::unique_ptr(new CRC24); } #endif #if defined(BOTAN_HAS_CRC32) if(algo_spec == "CRC32") { return std::unique_ptr(new CRC32); } #endif const SCAN_Name req(algo_spec); #if defined(BOTAN_HAS_TIGER) if(req.algo_name() == "Tiger") { return std::unique_ptr( new Tiger(req.arg_as_integer(0, 24), req.arg_as_integer(1, 3))); } #endif #if defined(BOTAN_HAS_SKEIN_512) if(req.algo_name() == "Skein-512") { return std::unique_ptr( new Skein_512(req.arg_as_integer(0, 512), req.arg(1, ""))); } #endif #if defined(BOTAN_HAS_BLAKE2B) if(req.algo_name() == "Blake2b") { return std::unique_ptr( new Blake2b(req.arg_as_integer(0, 512))); } #endif #if defined(BOTAN_HAS_KECCAK) if(req.algo_name() == "Keccak-1600") { return std::unique_ptr( new Keccak_1600(req.arg_as_integer(0, 512))); } #endif #if defined(BOTAN_HAS_SHA3) if(req.algo_name() == "SHA-3") { return std::unique_ptr( new SHA_3(req.arg_as_integer(0, 512))); } #endif #if defined(BOTAN_HAS_SHAKE) if(req.algo_name() == "SHAKE-128") { return std::unique_ptr(new SHAKE_128(req.arg_as_integer(0, 128))); } if(req.algo_name() == "SHAKE-256") { return std::unique_ptr(new SHAKE_256(req.arg_as_integer(0, 256))); } #endif #if defined(BOTAN_HAS_STREEBOG) if(algo_spec == "Streebog-256") { return std::unique_ptr(new Streebog_256); } if(algo_spec == "Streebog-512") { return std::unique_ptr(new Streebog_512); } #endif #if defined(BOTAN_HAS_SM3) if(algo_spec == "SM3") { return std::unique_ptr(new SM3); } #endif #if defined(BOTAN_HAS_WHIRLPOOL) if(req.algo_name() == "Whirlpool") { return std::unique_ptr(new Whirlpool); } #endif #if defined(BOTAN_HAS_PARALLEL_HASH) if(req.algo_name() == "Parallel") { std::vector> hashes; for(size_t i = 0; i != req.arg_count(); ++i) { auto h = HashFunction::create(req.arg(i)); if(!h) { return nullptr; } hashes.push_back(std::move(h)); } return std::unique_ptr(new Parallel(hashes)); } #endif #if defined(BOTAN_HAS_COMB4P) if(req.algo_name() == "Comb4P" && req.arg_count() == 2) { std::unique_ptr h1(HashFunction::create(req.arg(0))); std::unique_ptr h2(HashFunction::create(req.arg(1))); if(h1 && h2) return std::unique_ptr(new Comb4P(h1.release(), h2.release())); } #endif return nullptr; } //static std::unique_ptr HashFunction::create_or_throw(const std::string& algo, const std::string& provider) { if(auto hash = HashFunction::create(algo, provider)) { return hash; } throw Lookup_Error("Hash", algo, provider); } std::vector HashFunction::providers(const std::string& algo_spec) { return probe_providers_of(algo_spec, {"base", "bearssl", "openssl"}); } } botan-2.4.0/src/lib/hash/hash.h000066400000000000000000000051531322470703100161770ustar00rootroot00000000000000/* * Hash Function Base Class * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HASH_FUNCTION_BASE_CLASS_H_ #define BOTAN_HASH_FUNCTION_BASE_CLASS_H_ #include #include #include namespace Botan { /** * This class represents hash function (message digest) objects */ class BOTAN_PUBLIC_API(2,0) HashFunction : public Buffered_Computation { public: /** * Create an instance based on a name, or return null if the * algo/provider combination cannot be found. If provider is * empty then best available is chosen. */ static std::unique_ptr create(const std::string& algo_spec, const std::string& provider = ""); /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to use * Throws Lookup_Error if not found. */ static std::unique_ptr create_or_throw(const std::string& algo_spec, const std::string& provider = ""); /** * @return list of available providers for this algorithm, empty if not available * @param algo_spec algorithm name */ static std::vector providers(const std::string& algo_spec); /** * @return new object representing the same algorithm as *this */ virtual HashFunction* clone() const = 0; /** * @return provider information about this implementation. Default is "base", * might also return "sse2", "avx2", "openssl", or some other arbitrary string. */ virtual std::string provider() const { return "base"; } virtual ~HashFunction() = default; /** * Reset the state. */ virtual void clear() = 0; /** * @return the hash function name */ virtual std::string name() const = 0; /** * @return hash block size as defined for this algorithm */ virtual size_t hash_block_size() const { return 0; } /** * Return a new hash object with the same state as *this. This * allows computing the hash of several messages with a common * prefix more efficiently than would otherwise be possible. * * This function should be called `clone` but that was already * used for the case of returning an uninitialized object. * @return new hash object */ virtual std::unique_ptr copy_state() const = 0; }; } #endif botan-2.4.0/src/lib/hash/info.txt000066400000000000000000000000501322470703100165660ustar00rootroot00000000000000 hash.h botan-2.4.0/src/lib/hash/keccak/000077500000000000000000000000001322470703100163205ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/keccak/info.txt000066400000000000000000000001051322470703100200100ustar00rootroot00000000000000 KECCAK -> 20131128 sha3 botan-2.4.0/src/lib/hash/keccak/keccak.cpp000066400000000000000000000031761322470703100202540ustar00rootroot00000000000000/* * Keccak * (C) 2010,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { std::unique_ptr Keccak_1600::copy_state() const { return std::unique_ptr(new Keccak_1600(*this)); } Keccak_1600::Keccak_1600(size_t output_bits) : m_output_bits(output_bits), m_bitrate(1600 - 2*output_bits), m_S(25), m_S_pos(0) { // We only support the parameters for the SHA-3 proposal if(output_bits != 224 && output_bits != 256 && output_bits != 384 && output_bits != 512) throw Invalid_Argument("Keccak_1600: Invalid output length " + std::to_string(output_bits)); } std::string Keccak_1600::name() const { return "Keccak-1600(" + std::to_string(m_output_bits) + ")"; } HashFunction* Keccak_1600::clone() const { return new Keccak_1600(m_output_bits); } void Keccak_1600::clear() { zeroise(m_S); m_S_pos = 0; } void Keccak_1600::add_data(const uint8_t input[], size_t length) { m_S_pos = SHA_3::absorb(m_bitrate, m_S, m_S_pos, input, length); } void Keccak_1600::final_result(uint8_t output[]) { std::vector padding(m_bitrate / 8 - m_S_pos); padding[0] = 0x01; padding[padding.size()-1] |= 0x80; add_data(padding.data(), padding.size()); /* * We never have to run the permutation again because we only support * limited output lengths */ for(size_t i = 0; i != m_output_bits/8; ++i) output[i] = get_byte(7 - (i % 8), m_S[i/8]); clear(); } } botan-2.4.0/src/lib/hash/keccak/keccak.h000066400000000000000000000021621322470703100177130ustar00rootroot00000000000000/* * Keccak * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KECCAK_H_ #define BOTAN_KECCAK_H_ #include #include #include namespace Botan { /** * Keccak[1600], a SHA-3 candidate */ class BOTAN_PUBLIC_API(2,0) Keccak_1600 final : public HashFunction { public: /** * @param output_bits the size of the hash output; must be one of * 224, 256, 384, or 512 */ explicit Keccak_1600(size_t output_bits = 512); size_t hash_block_size() const override { return m_bitrate / 8; } size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override; std::unique_ptr copy_state() const override; std::string name() const override; void clear() override; private: void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; size_t m_output_bits, m_bitrate; secure_vector m_S; size_t m_S_pos; }; } #endif botan-2.4.0/src/lib/hash/md4/000077500000000000000000000000001322470703100155635ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/md4/info.txt000066400000000000000000000001061322470703100172540ustar00rootroot00000000000000 MD4 -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/md4/md4.cpp000066400000000000000000000067371322470703100167700ustar00rootroot00000000000000/* * MD4 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::unique_ptr MD4::copy_state() const { return std::unique_ptr(new MD4(*this)); } namespace { inline void FF4(uint32_t& A, uint32_t& B, uint32_t& C, uint32_t& D, uint32_t M0, uint32_t M1, uint32_t M2, uint32_t M3) { A += (D ^ (B & (C ^ D))) + M0; A = rotl<3>(A); D += (C ^ (A & (B ^ C))) + M1; D = rotl<7>(D); C += (B ^ (D & (A ^ B))) + M2; C = rotl<11>(C); B += (A ^ (C & (D ^ A))) + M3; B = rotl<19>(B); } inline void GG4(uint32_t& A, uint32_t& B, uint32_t& C, uint32_t& D, uint32_t M0, uint32_t M1, uint32_t M2, uint32_t M3) { A += ((B & C) | (D & (B | C))) + M0 + 0x5A827999; A = rotl<3>(A); D += ((A & B) | (C & (A | B))) + M1 + 0x5A827999; D = rotl<5>(D); C += ((D & A) | (B & (D | A))) + M2 + 0x5A827999; C = rotl<9>(C); B += ((C & D) | (A & (C | D))) + M3 + 0x5A827999; B = rotl<13>(B); } inline void HH4(uint32_t& A, uint32_t& B, uint32_t& C, uint32_t& D, uint32_t M0, uint32_t M1, uint32_t M2, uint32_t M3) { A += (B ^ C ^ D) + M0 + 0x6ED9EBA1; A = rotl<3>(A); D += (A ^ B ^ C) + M1 + 0x6ED9EBA1; D = rotl<9>(D); C += (A ^ B ^ D) + M2 + 0x6ED9EBA1; C = rotl<11>(C); B += (A ^ C ^ D) + M3 + 0x6ED9EBA1; B = rotl<15>(B); } } /* * MD4 Compression Function */ void MD4::compress_n(const uint8_t input[], size_t blocks) { uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3]; for(size_t i = 0; i != blocks; ++i) { uint32_t M00 = load_le(input, 0); uint32_t M01 = load_le(input, 1); uint32_t M02 = load_le(input, 2); uint32_t M03 = load_le(input, 3); uint32_t M04 = load_le(input, 4); uint32_t M05 = load_le(input, 5); uint32_t M06 = load_le(input, 6); uint32_t M07 = load_le(input, 7); uint32_t M08 = load_le(input, 8); uint32_t M09 = load_le(input, 9); uint32_t M10 = load_le(input, 10); uint32_t M11 = load_le(input, 11); uint32_t M12 = load_le(input, 12); uint32_t M13 = load_le(input, 13); uint32_t M14 = load_le(input, 14); uint32_t M15 = load_le(input, 15); FF4(A, B, C, D, M00, M01, M02, M03); FF4(A, B, C, D, M04, M05, M06, M07); FF4(A, B, C, D, M08, M09, M10, M11); FF4(A, B, C, D, M12, M13, M14, M15); GG4(A, B, C, D, M00, M04, M08, M12); GG4(A, B, C, D, M01, M05, M09, M13); GG4(A, B, C, D, M02, M06, M10, M14); GG4(A, B, C, D, M03, M07, M11, M15); HH4(A, B, C, D, M00, M08, M04, M12); HH4(A, B, C, D, M02, M10, M06, M14); HH4(A, B, C, D, M01, M09, M05, M13); HH4(A, B, C, D, M03, M11, M07, M15); A = (m_digest[0] += A); B = (m_digest[1] += B); C = (m_digest[2] += C); D = (m_digest[3] += D); input += hash_block_size(); } } /* * Copy out the digest */ void MD4::copy_out(uint8_t output[]) { copy_out_vec_le(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void MD4::clear() { MDx_HashFunction::clear(); m_digest[0] = 0x67452301; m_digest[1] = 0xEFCDAB89; m_digest[2] = 0x98BADCFE; m_digest[3] = 0x10325476; } } botan-2.4.0/src/lib/hash/md4/md4.h000066400000000000000000000015621322470703100164240ustar00rootroot00000000000000/* * MD4 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MD4_H_ #define BOTAN_MD4_H_ #include namespace Botan { /** * MD4 */ class BOTAN_PUBLIC_API(2,0) MD4 final : public MDx_HashFunction { public: std::string name() const override { return "MD4"; } size_t output_length() const override { return 16; } HashFunction* clone() const override { return new MD4; } std::unique_ptr copy_state() const override; void clear() override; MD4() : MDx_HashFunction(64, false, true), m_digest(4) { clear(); } private: void compress_n(const uint8_t input[], size_t blocks) override; void copy_out(uint8_t[]) override; /** * The digest value */ secure_vector m_digest; }; } #endif botan-2.4.0/src/lib/hash/md5/000077500000000000000000000000001322470703100155645ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/md5/info.txt000066400000000000000000000001061322470703100172550ustar00rootroot00000000000000 MD5 -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/md5/md5.cpp000066400000000000000000000104561322470703100167630ustar00rootroot00000000000000/* * MD5 * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::unique_ptr MD5::copy_state() const { return std::unique_ptr(new MD5(*this)); } namespace { /* * MD5 FF Function */ template inline void FF(uint32_t& A, uint32_t B, uint32_t C, uint32_t D, uint32_t M) { A += (D ^ (B & (C ^ D))) + M; A = rotl(A) + B; } /* * MD5 GG Function */ template inline void GG(uint32_t& A, uint32_t B, uint32_t C, uint32_t D, uint32_t M) { A += (C ^ (D & (B ^ C))) + M; A = rotl(A) + B; } /* * MD5 HH Function */ template inline void HH(uint32_t& A, uint32_t B, uint32_t C, uint32_t D, uint32_t M) { A += (B ^ C ^ D) + M; A = rotl(A) + B; } /* * MD5 II Function */ template inline void II(uint32_t& A, uint32_t B, uint32_t C, uint32_t D, uint32_t M) { A += (C ^ (B | ~D)) + M; A = rotl(A) + B; } } /* * MD5 Compression Function */ void MD5::compress_n(const uint8_t input[], size_t blocks) { uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3]; for(size_t i = 0; i != blocks; ++i) { load_le(m_M.data(), input, m_M.size()); FF< 7>(A,B,C,D,m_M[ 0]+0xD76AA478); FF<12>(D,A,B,C,m_M[ 1]+0xE8C7B756); FF<17>(C,D,A,B,m_M[ 2]+0x242070DB); FF<22>(B,C,D,A,m_M[ 3]+0xC1BDCEEE); FF< 7>(A,B,C,D,m_M[ 4]+0xF57C0FAF); FF<12>(D,A,B,C,m_M[ 5]+0x4787C62A); FF<17>(C,D,A,B,m_M[ 6]+0xA8304613); FF<22>(B,C,D,A,m_M[ 7]+0xFD469501); FF< 7>(A,B,C,D,m_M[ 8]+0x698098D8); FF<12>(D,A,B,C,m_M[ 9]+0x8B44F7AF); FF<17>(C,D,A,B,m_M[10]+0xFFFF5BB1); FF<22>(B,C,D,A,m_M[11]+0x895CD7BE); FF< 7>(A,B,C,D,m_M[12]+0x6B901122); FF<12>(D,A,B,C,m_M[13]+0xFD987193); FF<17>(C,D,A,B,m_M[14]+0xA679438E); FF<22>(B,C,D,A,m_M[15]+0x49B40821); GG< 5>(A,B,C,D,m_M[ 1]+0xF61E2562); GG< 9>(D,A,B,C,m_M[ 6]+0xC040B340); GG<14>(C,D,A,B,m_M[11]+0x265E5A51); GG<20>(B,C,D,A,m_M[ 0]+0xE9B6C7AA); GG< 5>(A,B,C,D,m_M[ 5]+0xD62F105D); GG< 9>(D,A,B,C,m_M[10]+0x02441453); GG<14>(C,D,A,B,m_M[15]+0xD8A1E681); GG<20>(B,C,D,A,m_M[ 4]+0xE7D3FBC8); GG< 5>(A,B,C,D,m_M[ 9]+0x21E1CDE6); GG< 9>(D,A,B,C,m_M[14]+0xC33707D6); GG<14>(C,D,A,B,m_M[ 3]+0xF4D50D87); GG<20>(B,C,D,A,m_M[ 8]+0x455A14ED); GG< 5>(A,B,C,D,m_M[13]+0xA9E3E905); GG< 9>(D,A,B,C,m_M[ 2]+0xFCEFA3F8); GG<14>(C,D,A,B,m_M[ 7]+0x676F02D9); GG<20>(B,C,D,A,m_M[12]+0x8D2A4C8A); HH< 4>(A,B,C,D,m_M[ 5]+0xFFFA3942); HH<11>(D,A,B,C,m_M[ 8]+0x8771F681); HH<16>(C,D,A,B,m_M[11]+0x6D9D6122); HH<23>(B,C,D,A,m_M[14]+0xFDE5380C); HH< 4>(A,B,C,D,m_M[ 1]+0xA4BEEA44); HH<11>(D,A,B,C,m_M[ 4]+0x4BDECFA9); HH<16>(C,D,A,B,m_M[ 7]+0xF6BB4B60); HH<23>(B,C,D,A,m_M[10]+0xBEBFBC70); HH< 4>(A,B,C,D,m_M[13]+0x289B7EC6); HH<11>(D,A,B,C,m_M[ 0]+0xEAA127FA); HH<16>(C,D,A,B,m_M[ 3]+0xD4EF3085); HH<23>(B,C,D,A,m_M[ 6]+0x04881D05); HH< 4>(A,B,C,D,m_M[ 9]+0xD9D4D039); HH<11>(D,A,B,C,m_M[12]+0xE6DB99E5); HH<16>(C,D,A,B,m_M[15]+0x1FA27CF8); HH<23>(B,C,D,A,m_M[ 2]+0xC4AC5665); II< 6>(A,B,C,D,m_M[ 0]+0xF4292244); II<10>(D,A,B,C,m_M[ 7]+0x432AFF97); II<15>(C,D,A,B,m_M[14]+0xAB9423A7); II<21>(B,C,D,A,m_M[ 5]+0xFC93A039); II< 6>(A,B,C,D,m_M[12]+0x655B59C3); II<10>(D,A,B,C,m_M[ 3]+0x8F0CCC92); II<15>(C,D,A,B,m_M[10]+0xFFEFF47D); II<21>(B,C,D,A,m_M[ 1]+0x85845DD1); II< 6>(A,B,C,D,m_M[ 8]+0x6FA87E4F); II<10>(D,A,B,C,m_M[15]+0xFE2CE6E0); II<15>(C,D,A,B,m_M[ 6]+0xA3014314); II<21>(B,C,D,A,m_M[13]+0x4E0811A1); II< 6>(A,B,C,D,m_M[ 4]+0xF7537E82); II<10>(D,A,B,C,m_M[11]+0xBD3AF235); II<15>(C,D,A,B,m_M[ 2]+0x2AD7D2BB); II<21>(B,C,D,A,m_M[ 9]+0xEB86D391); A = (m_digest[0] += A); B = (m_digest[1] += B); C = (m_digest[2] += C); D = (m_digest[3] += D); input += hash_block_size(); } } /* * Copy out the digest */ void MD5::copy_out(uint8_t output[]) { copy_out_vec_le(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void MD5::clear() { MDx_HashFunction::clear(); zeroise(m_M); m_digest[0] = 0x67452301; m_digest[1] = 0xEFCDAB89; m_digest[2] = 0x98BADCFE; m_digest[3] = 0x10325476; } } botan-2.4.0/src/lib/hash/md5/md5.h000066400000000000000000000017071322470703100164270ustar00rootroot00000000000000/* * MD5 * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MD5_H_ #define BOTAN_MD5_H_ #include namespace Botan { /** * MD5 */ class BOTAN_PUBLIC_API(2,0) MD5 final : public MDx_HashFunction { public: std::string name() const override { return "MD5"; } size_t output_length() const override { return 16; } HashFunction* clone() const override { return new MD5; } std::unique_ptr copy_state() const override; void clear() override; MD5() : MDx_HashFunction(64, false, true), m_M(16), m_digest(4) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; /** * The message buffer */ secure_vector m_M; /** * The digest value */ secure_vector m_digest; }; } #endif botan-2.4.0/src/lib/hash/mdx_hash/000077500000000000000000000000001322470703100166725ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/mdx_hash/info.txt000066400000000000000000000001001322470703100203550ustar00rootroot00000000000000 MDX_HASH_FUNCTION -> 20131128 load_on dep botan-2.4.0/src/lib/hash/mdx_hash/mdx_hash.cpp000066400000000000000000000047341322470703100212010ustar00rootroot00000000000000/* * Merkle-Damgard Hash Function * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * MDx_HashFunction Constructor */ MDx_HashFunction::MDx_HashFunction(size_t block_len, bool byte_end, bool bit_end, size_t cnt_size) : m_buffer(block_len), m_count(0), m_position(0), BIG_BYTE_ENDIAN(byte_end), BIG_BIT_ENDIAN(bit_end), COUNT_SIZE(cnt_size) { } /* * Clear memory of sensitive data */ void MDx_HashFunction::clear() { zeroise(m_buffer); m_count = m_position = 0; } /* * Update the hash */ void MDx_HashFunction::add_data(const uint8_t input[], size_t length) { m_count += length; if(m_position) { buffer_insert(m_buffer, m_position, input, length); if(m_position + length >= m_buffer.size()) { compress_n(m_buffer.data(), 1); input += (m_buffer.size() - m_position); length -= (m_buffer.size() - m_position); m_position = 0; } } const size_t full_blocks = length / m_buffer.size(); const size_t remaining = length % m_buffer.size(); if(full_blocks) compress_n(input, full_blocks); buffer_insert(m_buffer, m_position, input + full_blocks * m_buffer.size(), remaining); m_position += remaining; } /* * Finalize a hash */ void MDx_HashFunction::final_result(uint8_t output[]) { m_buffer[m_position] = (BIG_BIT_ENDIAN ? 0x80 : 0x01); for(size_t i = m_position+1; i != m_buffer.size(); ++i) m_buffer[i] = 0; if(m_position >= m_buffer.size() - COUNT_SIZE) { compress_n(m_buffer.data(), 1); zeroise(m_buffer); } write_count(&m_buffer[m_buffer.size() - COUNT_SIZE]); compress_n(m_buffer.data(), 1); copy_out(output); clear(); } /* * Write the count bits to the buffer */ void MDx_HashFunction::write_count(uint8_t out[]) { if(COUNT_SIZE < 8) throw Invalid_State("MDx_HashFunction::write_count: COUNT_SIZE < 8"); if(COUNT_SIZE >= output_length() || COUNT_SIZE >= hash_block_size()) throw Invalid_Argument("MDx_HashFunction: COUNT_SIZE is too big"); const uint64_t bit_count = m_count * 8; if(BIG_BYTE_ENDIAN) store_be(bit_count, out + COUNT_SIZE - 8); else store_le(bit_count, out + COUNT_SIZE - 8); } } botan-2.4.0/src/lib/hash/mdx_hash/mdx_hash.h000066400000000000000000000034571322470703100206470ustar00rootroot00000000000000/* * MDx Hash Function * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MDX_BASE_H_ #define BOTAN_MDX_BASE_H_ #include namespace Botan { /** * MDx Hash Function Base Class */ class BOTAN_PUBLIC_API(2,0) MDx_HashFunction : public HashFunction { public: /** * @param block_length is the number of bytes per block * @param big_byte_endian specifies if the hash uses big-endian bytes * @param big_bit_endian specifies if the hash uses big-endian bits * @param counter_size specifies the size of the counter var in bytes */ MDx_HashFunction(size_t block_length, bool big_byte_endian, bool big_bit_endian, size_t counter_size = 8); size_t hash_block_size() const override final { return m_buffer.size(); } protected: void add_data(const uint8_t input[], size_t length) override final; void final_result(uint8_t output[]) override final; /** * Run the hash's compression function over a set of blocks * @param blocks the input * @param block_n the number of blocks */ virtual void compress_n(const uint8_t blocks[], size_t block_n) = 0; void clear() override; /** * Copy the output to the buffer * @param buffer to put the output into */ virtual void copy_out(uint8_t buffer[]) = 0; /** * Write the count, if used, to this spot * @param out where to write the counter to */ virtual void write_count(uint8_t out[]); private: secure_vector m_buffer; uint64_t m_count; size_t m_position; const bool BIG_BYTE_ENDIAN, BIG_BIT_ENDIAN; const size_t COUNT_SIZE; }; } #endif botan-2.4.0/src/lib/hash/par_hash/000077500000000000000000000000001322470703100166645ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/par_hash/info.txt000066400000000000000000000000571322470703100203620ustar00rootroot00000000000000 PARALLEL_HASH -> 20131128 botan-2.4.0/src/lib/hash/par_hash/par_hash.cpp000066400000000000000000000033461322470703100211630ustar00rootroot00000000000000/* * Parallel Hash * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { void Parallel::add_data(const uint8_t input[], size_t length) { for(auto&& hash : m_hashes) hash->update(input, length); } void Parallel::final_result(uint8_t out[]) { size_t offset = 0; for(auto&& hash : m_hashes) { hash->final(out + offset); offset += hash->output_length(); } } size_t Parallel::output_length() const { size_t sum = 0; for(auto&& hash : m_hashes) sum += hash->output_length(); return sum; } std::string Parallel::name() const { std::vector names; for(auto&& hash : m_hashes) names.push_back(hash->name()); return "Parallel(" + string_join(names, ',') + ")"; } HashFunction* Parallel::clone() const { std::vector> hash_copies; for(auto&& hash : m_hashes) hash_copies.push_back(std::unique_ptr(hash->clone())); return new Parallel(hash_copies); } std::unique_ptr Parallel::copy_state() const { std::vector> hash_clones; for(const std::unique_ptr& hash : m_hashes) { hash_clones.push_back(hash->copy_state()); } return std::unique_ptr(new Parallel(hash_clones)); } void Parallel::clear() { for(auto&& hash : m_hashes) hash->clear(); } Parallel::Parallel(std::vector>& h) { for(size_t i = 0; i != h.size(); ++i) { m_hashes.push_back(std::unique_ptr(h[i].release())); } } } botan-2.4.0/src/lib/hash/par_hash/par_hash.h000066400000000000000000000021021322470703100206150ustar00rootroot00000000000000/* * Parallel Hash * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PARALLEL_HASH_H_ #define BOTAN_PARALLEL_HASH_H_ #include #include namespace Botan { /** * Parallel Hashes */ class BOTAN_PUBLIC_API(2,0) Parallel final : public HashFunction { public: void clear() override; std::string name() const override; HashFunction* clone() const override; std::unique_ptr copy_state() const override; size_t output_length() const override; /** * @param hashes a set of hashes to compute in parallel * Takes ownership of all pointers */ explicit Parallel(std::vector>& hashes); Parallel(const Parallel&) = delete; Parallel& operator=(const Parallel&) = delete; private: Parallel() = delete; void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; std::vector> m_hashes; }; } #endif botan-2.4.0/src/lib/hash/rmd160/000077500000000000000000000000001322470703100161105ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/rmd160/info.txt000066400000000000000000000001151322470703100176010ustar00rootroot00000000000000 RIPEMD_160 -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/rmd160/rmd160.cpp000066400000000000000000000227101322470703100176270ustar00rootroot00000000000000/* * RIPEMD-160 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::unique_ptr RIPEMD_160::copy_state() const { return std::unique_ptr(new RIPEMD_160(*this)); } namespace { /* * RIPEMD-160 F1 Function */ template inline void F1(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) { A += (B ^ C ^ D) + M; A = rotl(A) + E; C = rotl<10>(C); } /* * RIPEMD-160 F2 Function */ template inline void F2(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) { A += (D ^ (B & (C ^ D))) + M; A = rotl(A) + E; C = rotl<10>(C); } /* * RIPEMD-160 F3 Function */ template inline void F3(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) { A += (D ^ (B | ~C)) + M; A = rotl(A) + E; C = rotl<10>(C); } /* * RIPEMD-160 F4 Function */ template inline void F4(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) { A += (C ^ (D & (B ^ C))) + M; A = rotl(A) + E; C = rotl<10>(C); } /* * RIPEMD-160 F5 Function */ template inline void F5(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) { A += (B ^ (C | ~D)) + M; A = rotl(A) + E; C = rotl<10>(C); } } /* * RIPEMD-160 Compression Function */ void RIPEMD_160::compress_n(const uint8_t input[], size_t blocks) { const uint32_t MAGIC2 = 0x5A827999, MAGIC3 = 0x6ED9EBA1, MAGIC4 = 0x8F1BBCDC, MAGIC5 = 0xA953FD4E, MAGIC6 = 0x50A28BE6, MAGIC7 = 0x5C4DD124, MAGIC8 = 0x6D703EF3, MAGIC9 = 0x7A6D76E9; for(size_t i = 0; i != blocks; ++i) { load_le(m_M.data(), input, m_M.size()); uint32_t A1 = m_digest[0], A2 = A1, B1 = m_digest[1], B2 = B1, C1 = m_digest[2], C2 = C1, D1 = m_digest[3], D2 = D1, E1 = m_digest[4], E2 = E1; F1<11>(A1,B1,C1,D1,E1,m_M[ 0] ); F5< 8>(A2,B2,C2,D2,E2,m_M[ 5]+MAGIC6); F1<14>(E1,A1,B1,C1,D1,m_M[ 1] ); F5< 9>(E2,A2,B2,C2,D2,m_M[14]+MAGIC6); F1<15>(D1,E1,A1,B1,C1,m_M[ 2] ); F5< 9>(D2,E2,A2,B2,C2,m_M[ 7]+MAGIC6); F1<12>(C1,D1,E1,A1,B1,m_M[ 3] ); F5<11>(C2,D2,E2,A2,B2,m_M[ 0]+MAGIC6); F1< 5>(B1,C1,D1,E1,A1,m_M[ 4] ); F5<13>(B2,C2,D2,E2,A2,m_M[ 9]+MAGIC6); F1< 8>(A1,B1,C1,D1,E1,m_M[ 5] ); F5<15>(A2,B2,C2,D2,E2,m_M[ 2]+MAGIC6); F1< 7>(E1,A1,B1,C1,D1,m_M[ 6] ); F5<15>(E2,A2,B2,C2,D2,m_M[11]+MAGIC6); F1< 9>(D1,E1,A1,B1,C1,m_M[ 7] ); F5< 5>(D2,E2,A2,B2,C2,m_M[ 4]+MAGIC6); F1<11>(C1,D1,E1,A1,B1,m_M[ 8] ); F5< 7>(C2,D2,E2,A2,B2,m_M[13]+MAGIC6); F1<13>(B1,C1,D1,E1,A1,m_M[ 9] ); F5< 7>(B2,C2,D2,E2,A2,m_M[ 6]+MAGIC6); F1<14>(A1,B1,C1,D1,E1,m_M[10] ); F5< 8>(A2,B2,C2,D2,E2,m_M[15]+MAGIC6); F1<15>(E1,A1,B1,C1,D1,m_M[11] ); F5<11>(E2,A2,B2,C2,D2,m_M[ 8]+MAGIC6); F1< 6>(D1,E1,A1,B1,C1,m_M[12] ); F5<14>(D2,E2,A2,B2,C2,m_M[ 1]+MAGIC6); F1< 7>(C1,D1,E1,A1,B1,m_M[13] ); F5<14>(C2,D2,E2,A2,B2,m_M[10]+MAGIC6); F1< 9>(B1,C1,D1,E1,A1,m_M[14] ); F5<12>(B2,C2,D2,E2,A2,m_M[ 3]+MAGIC6); F1< 8>(A1,B1,C1,D1,E1,m_M[15] ); F5< 6>(A2,B2,C2,D2,E2,m_M[12]+MAGIC6); F2< 7>(E1,A1,B1,C1,D1,m_M[ 7]+MAGIC2); F4< 9>(E2,A2,B2,C2,D2,m_M[ 6]+MAGIC7); F2< 6>(D1,E1,A1,B1,C1,m_M[ 4]+MAGIC2); F4<13>(D2,E2,A2,B2,C2,m_M[11]+MAGIC7); F2< 8>(C1,D1,E1,A1,B1,m_M[13]+MAGIC2); F4<15>(C2,D2,E2,A2,B2,m_M[ 3]+MAGIC7); F2<13>(B1,C1,D1,E1,A1,m_M[ 1]+MAGIC2); F4< 7>(B2,C2,D2,E2,A2,m_M[ 7]+MAGIC7); F2<11>(A1,B1,C1,D1,E1,m_M[10]+MAGIC2); F4<12>(A2,B2,C2,D2,E2,m_M[ 0]+MAGIC7); F2< 9>(E1,A1,B1,C1,D1,m_M[ 6]+MAGIC2); F4< 8>(E2,A2,B2,C2,D2,m_M[13]+MAGIC7); F2< 7>(D1,E1,A1,B1,C1,m_M[15]+MAGIC2); F4< 9>(D2,E2,A2,B2,C2,m_M[ 5]+MAGIC7); F2<15>(C1,D1,E1,A1,B1,m_M[ 3]+MAGIC2); F4<11>(C2,D2,E2,A2,B2,m_M[10]+MAGIC7); F2< 7>(B1,C1,D1,E1,A1,m_M[12]+MAGIC2); F4< 7>(B2,C2,D2,E2,A2,m_M[14]+MAGIC7); F2<12>(A1,B1,C1,D1,E1,m_M[ 0]+MAGIC2); F4< 7>(A2,B2,C2,D2,E2,m_M[15]+MAGIC7); F2<15>(E1,A1,B1,C1,D1,m_M[ 9]+MAGIC2); F4<12>(E2,A2,B2,C2,D2,m_M[ 8]+MAGIC7); F2< 9>(D1,E1,A1,B1,C1,m_M[ 5]+MAGIC2); F4< 7>(D2,E2,A2,B2,C2,m_M[12]+MAGIC7); F2<11>(C1,D1,E1,A1,B1,m_M[ 2]+MAGIC2); F4< 6>(C2,D2,E2,A2,B2,m_M[ 4]+MAGIC7); F2< 7>(B1,C1,D1,E1,A1,m_M[14]+MAGIC2); F4<15>(B2,C2,D2,E2,A2,m_M[ 9]+MAGIC7); F2<13>(A1,B1,C1,D1,E1,m_M[11]+MAGIC2); F4<13>(A2,B2,C2,D2,E2,m_M[ 1]+MAGIC7); F2<12>(E1,A1,B1,C1,D1,m_M[ 8]+MAGIC2); F4<11>(E2,A2,B2,C2,D2,m_M[ 2]+MAGIC7); F3<11>(D1,E1,A1,B1,C1,m_M[ 3]+MAGIC3); F3< 9>(D2,E2,A2,B2,C2,m_M[15]+MAGIC8); F3<13>(C1,D1,E1,A1,B1,m_M[10]+MAGIC3); F3< 7>(C2,D2,E2,A2,B2,m_M[ 5]+MAGIC8); F3< 6>(B1,C1,D1,E1,A1,m_M[14]+MAGIC3); F3<15>(B2,C2,D2,E2,A2,m_M[ 1]+MAGIC8); F3< 7>(A1,B1,C1,D1,E1,m_M[ 4]+MAGIC3); F3<11>(A2,B2,C2,D2,E2,m_M[ 3]+MAGIC8); F3<14>(E1,A1,B1,C1,D1,m_M[ 9]+MAGIC3); F3< 8>(E2,A2,B2,C2,D2,m_M[ 7]+MAGIC8); F3< 9>(D1,E1,A1,B1,C1,m_M[15]+MAGIC3); F3< 6>(D2,E2,A2,B2,C2,m_M[14]+MAGIC8); F3<13>(C1,D1,E1,A1,B1,m_M[ 8]+MAGIC3); F3< 6>(C2,D2,E2,A2,B2,m_M[ 6]+MAGIC8); F3<15>(B1,C1,D1,E1,A1,m_M[ 1]+MAGIC3); F3<14>(B2,C2,D2,E2,A2,m_M[ 9]+MAGIC8); F3<14>(A1,B1,C1,D1,E1,m_M[ 2]+MAGIC3); F3<12>(A2,B2,C2,D2,E2,m_M[11]+MAGIC8); F3< 8>(E1,A1,B1,C1,D1,m_M[ 7]+MAGIC3); F3<13>(E2,A2,B2,C2,D2,m_M[ 8]+MAGIC8); F3<13>(D1,E1,A1,B1,C1,m_M[ 0]+MAGIC3); F3< 5>(D2,E2,A2,B2,C2,m_M[12]+MAGIC8); F3< 6>(C1,D1,E1,A1,B1,m_M[ 6]+MAGIC3); F3<14>(C2,D2,E2,A2,B2,m_M[ 2]+MAGIC8); F3< 5>(B1,C1,D1,E1,A1,m_M[13]+MAGIC3); F3<13>(B2,C2,D2,E2,A2,m_M[10]+MAGIC8); F3<12>(A1,B1,C1,D1,E1,m_M[11]+MAGIC3); F3<13>(A2,B2,C2,D2,E2,m_M[ 0]+MAGIC8); F3< 7>(E1,A1,B1,C1,D1,m_M[ 5]+MAGIC3); F3< 7>(E2,A2,B2,C2,D2,m_M[ 4]+MAGIC8); F3< 5>(D1,E1,A1,B1,C1,m_M[12]+MAGIC3); F3< 5>(D2,E2,A2,B2,C2,m_M[13]+MAGIC8); F4<11>(C1,D1,E1,A1,B1,m_M[ 1]+MAGIC4); F2<15>(C2,D2,E2,A2,B2,m_M[ 8]+MAGIC9); F4<12>(B1,C1,D1,E1,A1,m_M[ 9]+MAGIC4); F2< 5>(B2,C2,D2,E2,A2,m_M[ 6]+MAGIC9); F4<14>(A1,B1,C1,D1,E1,m_M[11]+MAGIC4); F2< 8>(A2,B2,C2,D2,E2,m_M[ 4]+MAGIC9); F4<15>(E1,A1,B1,C1,D1,m_M[10]+MAGIC4); F2<11>(E2,A2,B2,C2,D2,m_M[ 1]+MAGIC9); F4<14>(D1,E1,A1,B1,C1,m_M[ 0]+MAGIC4); F2<14>(D2,E2,A2,B2,C2,m_M[ 3]+MAGIC9); F4<15>(C1,D1,E1,A1,B1,m_M[ 8]+MAGIC4); F2<14>(C2,D2,E2,A2,B2,m_M[11]+MAGIC9); F4< 9>(B1,C1,D1,E1,A1,m_M[12]+MAGIC4); F2< 6>(B2,C2,D2,E2,A2,m_M[15]+MAGIC9); F4< 8>(A1,B1,C1,D1,E1,m_M[ 4]+MAGIC4); F2<14>(A2,B2,C2,D2,E2,m_M[ 0]+MAGIC9); F4< 9>(E1,A1,B1,C1,D1,m_M[13]+MAGIC4); F2< 6>(E2,A2,B2,C2,D2,m_M[ 5]+MAGIC9); F4<14>(D1,E1,A1,B1,C1,m_M[ 3]+MAGIC4); F2< 9>(D2,E2,A2,B2,C2,m_M[12]+MAGIC9); F4< 5>(C1,D1,E1,A1,B1,m_M[ 7]+MAGIC4); F2<12>(C2,D2,E2,A2,B2,m_M[ 2]+MAGIC9); F4< 6>(B1,C1,D1,E1,A1,m_M[15]+MAGIC4); F2< 9>(B2,C2,D2,E2,A2,m_M[13]+MAGIC9); F4< 8>(A1,B1,C1,D1,E1,m_M[14]+MAGIC4); F2<12>(A2,B2,C2,D2,E2,m_M[ 9]+MAGIC9); F4< 6>(E1,A1,B1,C1,D1,m_M[ 5]+MAGIC4); F2< 5>(E2,A2,B2,C2,D2,m_M[ 7]+MAGIC9); F4< 5>(D1,E1,A1,B1,C1,m_M[ 6]+MAGIC4); F2<15>(D2,E2,A2,B2,C2,m_M[10]+MAGIC9); F4<12>(C1,D1,E1,A1,B1,m_M[ 2]+MAGIC4); F2< 8>(C2,D2,E2,A2,B2,m_M[14]+MAGIC9); F5< 9>(B1,C1,D1,E1,A1,m_M[ 4]+MAGIC5); F1< 8>(B2,C2,D2,E2,A2,m_M[12] ); F5<15>(A1,B1,C1,D1,E1,m_M[ 0]+MAGIC5); F1< 5>(A2,B2,C2,D2,E2,m_M[15] ); F5< 5>(E1,A1,B1,C1,D1,m_M[ 5]+MAGIC5); F1<12>(E2,A2,B2,C2,D2,m_M[10] ); F5<11>(D1,E1,A1,B1,C1,m_M[ 9]+MAGIC5); F1< 9>(D2,E2,A2,B2,C2,m_M[ 4] ); F5< 6>(C1,D1,E1,A1,B1,m_M[ 7]+MAGIC5); F1<12>(C2,D2,E2,A2,B2,m_M[ 1] ); F5< 8>(B1,C1,D1,E1,A1,m_M[12]+MAGIC5); F1< 5>(B2,C2,D2,E2,A2,m_M[ 5] ); F5<13>(A1,B1,C1,D1,E1,m_M[ 2]+MAGIC5); F1<14>(A2,B2,C2,D2,E2,m_M[ 8] ); F5<12>(E1,A1,B1,C1,D1,m_M[10]+MAGIC5); F1< 6>(E2,A2,B2,C2,D2,m_M[ 7] ); F5< 5>(D1,E1,A1,B1,C1,m_M[14]+MAGIC5); F1< 8>(D2,E2,A2,B2,C2,m_M[ 6] ); F5<12>(C1,D1,E1,A1,B1,m_M[ 1]+MAGIC5); F1<13>(C2,D2,E2,A2,B2,m_M[ 2] ); F5<13>(B1,C1,D1,E1,A1,m_M[ 3]+MAGIC5); F1< 6>(B2,C2,D2,E2,A2,m_M[13] ); F5<14>(A1,B1,C1,D1,E1,m_M[ 8]+MAGIC5); F1< 5>(A2,B2,C2,D2,E2,m_M[14] ); F5<11>(E1,A1,B1,C1,D1,m_M[11]+MAGIC5); F1<15>(E2,A2,B2,C2,D2,m_M[ 0] ); F5< 8>(D1,E1,A1,B1,C1,m_M[ 6]+MAGIC5); F1<13>(D2,E2,A2,B2,C2,m_M[ 3] ); F5< 5>(C1,D1,E1,A1,B1,m_M[15]+MAGIC5); F1<11>(C2,D2,E2,A2,B2,m_M[ 9] ); F5< 6>(B1,C1,D1,E1,A1,m_M[13]+MAGIC5); F1<11>(B2,C2,D2,E2,A2,m_M[11] ); C1 = m_digest[1] + C1 + D2; m_digest[1] = m_digest[2] + D1 + E2; m_digest[2] = m_digest[3] + E1 + A2; m_digest[3] = m_digest[4] + A1 + B2; m_digest[4] = m_digest[0] + B1 + C2; m_digest[0] = C1; input += hash_block_size(); } } /* * Copy out the digest */ void RIPEMD_160::copy_out(uint8_t output[]) { copy_out_vec_le(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void RIPEMD_160::clear() { MDx_HashFunction::clear(); zeroise(m_M); m_digest[0] = 0x67452301; m_digest[1] = 0xEFCDAB89; m_digest[2] = 0x98BADCFE; m_digest[3] = 0x10325476; m_digest[4] = 0xC3D2E1F0; } } botan-2.4.0/src/lib/hash/rmd160/rmd160.h000066400000000000000000000016051322470703100172740ustar00rootroot00000000000000/* * RIPEMD-160 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RIPEMD_160_H_ #define BOTAN_RIPEMD_160_H_ #include namespace Botan { /** * RIPEMD-160 */ class BOTAN_PUBLIC_API(2,0) RIPEMD_160 final : public MDx_HashFunction { public: std::string name() const override { return "RIPEMD-160"; } size_t output_length() const override { return 20; } HashFunction* clone() const override { return new RIPEMD_160; } std::unique_ptr copy_state() const override; void clear() override; RIPEMD_160() : MDx_HashFunction(64, false, true), m_M(16), m_digest(5) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; secure_vector m_M, m_digest; }; } #endif botan-2.4.0/src/lib/hash/sha1/000077500000000000000000000000001322470703100157335ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha1/info.txt000066400000000000000000000001071322470703100174250ustar00rootroot00000000000000 SHA1 -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/sha1/sha160.cpp000066400000000000000000000132541322470703100174460ustar00rootroot00000000000000/* * SHA-160 * (C) 1999-2008,2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::unique_ptr SHA_160::copy_state() const { return std::unique_ptr(new SHA_160(*this)); } namespace SHA1_F { namespace { /* * SHA-160 F1 Function */ inline void F1(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += (D ^ (B & (C ^ D))) + msg + 0x5A827999 + rotl<5>(A); B = rotl<30>(B); } /* * SHA-160 F2 Function */ inline void F2(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += (B ^ C ^ D) + msg + 0x6ED9EBA1 + rotl<5>(A); B = rotl<30>(B); } /* * SHA-160 F3 Function */ inline void F3(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += ((B & C) | ((B | C) & D)) + msg + 0x8F1BBCDC + rotl<5>(A); B = rotl<30>(B); } /* * SHA-160 F4 Function */ inline void F4(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += (B ^ C ^ D) + msg + 0xCA62C1D6 + rotl<5>(A); B = rotl<30>(B); } } } /* * SHA-160 Compression Function */ void SHA_160::compress_n(const uint8_t input[], size_t blocks) { using namespace SHA1_F; #if defined(BOTAN_HAS_SHA1_X86_SHA_NI) if(CPUID::has_intel_sha()) { return sha1_compress_x86(m_digest, input, blocks); } #endif #if defined(BOTAN_HAS_SHA1_ARMV8) if(CPUID::has_arm_sha1()) { return sha1_armv8_compress_n(m_digest, input, blocks); } #endif #if defined(BOTAN_HAS_SHA1_SSE2) if(CPUID::has_sse2()) { return sse2_compress_n(m_digest, input, blocks); } #endif uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3], E = m_digest[4]; m_W.resize(80); for(size_t i = 0; i != blocks; ++i) { load_be(m_W.data(), input, 16); for(size_t j = 16; j != 80; j += 8) { m_W[j ] = rotl<1>(m_W[j-3] ^ m_W[j-8] ^ m_W[j-14] ^ m_W[j-16]); m_W[j+1] = rotl<1>(m_W[j-2] ^ m_W[j-7] ^ m_W[j-13] ^ m_W[j-15]); m_W[j+2] = rotl<1>(m_W[j-1] ^ m_W[j-6] ^ m_W[j-12] ^ m_W[j-14]); m_W[j+3] = rotl<1>(m_W[j ] ^ m_W[j-5] ^ m_W[j-11] ^ m_W[j-13]); m_W[j+4] = rotl<1>(m_W[j+1] ^ m_W[j-4] ^ m_W[j-10] ^ m_W[j-12]); m_W[j+5] = rotl<1>(m_W[j+2] ^ m_W[j-3] ^ m_W[j- 9] ^ m_W[j-11]); m_W[j+6] = rotl<1>(m_W[j+3] ^ m_W[j-2] ^ m_W[j- 8] ^ m_W[j-10]); m_W[j+7] = rotl<1>(m_W[j+4] ^ m_W[j-1] ^ m_W[j- 7] ^ m_W[j- 9]); } F1(A, B, C, D, E, m_W[ 0]); F1(E, A, B, C, D, m_W[ 1]); F1(D, E, A, B, C, m_W[ 2]); F1(C, D, E, A, B, m_W[ 3]); F1(B, C, D, E, A, m_W[ 4]); F1(A, B, C, D, E, m_W[ 5]); F1(E, A, B, C, D, m_W[ 6]); F1(D, E, A, B, C, m_W[ 7]); F1(C, D, E, A, B, m_W[ 8]); F1(B, C, D, E, A, m_W[ 9]); F1(A, B, C, D, E, m_W[10]); F1(E, A, B, C, D, m_W[11]); F1(D, E, A, B, C, m_W[12]); F1(C, D, E, A, B, m_W[13]); F1(B, C, D, E, A, m_W[14]); F1(A, B, C, D, E, m_W[15]); F1(E, A, B, C, D, m_W[16]); F1(D, E, A, B, C, m_W[17]); F1(C, D, E, A, B, m_W[18]); F1(B, C, D, E, A, m_W[19]); F2(A, B, C, D, E, m_W[20]); F2(E, A, B, C, D, m_W[21]); F2(D, E, A, B, C, m_W[22]); F2(C, D, E, A, B, m_W[23]); F2(B, C, D, E, A, m_W[24]); F2(A, B, C, D, E, m_W[25]); F2(E, A, B, C, D, m_W[26]); F2(D, E, A, B, C, m_W[27]); F2(C, D, E, A, B, m_W[28]); F2(B, C, D, E, A, m_W[29]); F2(A, B, C, D, E, m_W[30]); F2(E, A, B, C, D, m_W[31]); F2(D, E, A, B, C, m_W[32]); F2(C, D, E, A, B, m_W[33]); F2(B, C, D, E, A, m_W[34]); F2(A, B, C, D, E, m_W[35]); F2(E, A, B, C, D, m_W[36]); F2(D, E, A, B, C, m_W[37]); F2(C, D, E, A, B, m_W[38]); F2(B, C, D, E, A, m_W[39]); F3(A, B, C, D, E, m_W[40]); F3(E, A, B, C, D, m_W[41]); F3(D, E, A, B, C, m_W[42]); F3(C, D, E, A, B, m_W[43]); F3(B, C, D, E, A, m_W[44]); F3(A, B, C, D, E, m_W[45]); F3(E, A, B, C, D, m_W[46]); F3(D, E, A, B, C, m_W[47]); F3(C, D, E, A, B, m_W[48]); F3(B, C, D, E, A, m_W[49]); F3(A, B, C, D, E, m_W[50]); F3(E, A, B, C, D, m_W[51]); F3(D, E, A, B, C, m_W[52]); F3(C, D, E, A, B, m_W[53]); F3(B, C, D, E, A, m_W[54]); F3(A, B, C, D, E, m_W[55]); F3(E, A, B, C, D, m_W[56]); F3(D, E, A, B, C, m_W[57]); F3(C, D, E, A, B, m_W[58]); F3(B, C, D, E, A, m_W[59]); F4(A, B, C, D, E, m_W[60]); F4(E, A, B, C, D, m_W[61]); F4(D, E, A, B, C, m_W[62]); F4(C, D, E, A, B, m_W[63]); F4(B, C, D, E, A, m_W[64]); F4(A, B, C, D, E, m_W[65]); F4(E, A, B, C, D, m_W[66]); F4(D, E, A, B, C, m_W[67]); F4(C, D, E, A, B, m_W[68]); F4(B, C, D, E, A, m_W[69]); F4(A, B, C, D, E, m_W[70]); F4(E, A, B, C, D, m_W[71]); F4(D, E, A, B, C, m_W[72]); F4(C, D, E, A, B, m_W[73]); F4(B, C, D, E, A, m_W[74]); F4(A, B, C, D, E, m_W[75]); F4(E, A, B, C, D, m_W[76]); F4(D, E, A, B, C, m_W[77]); F4(C, D, E, A, B, m_W[78]); F4(B, C, D, E, A, m_W[79]); A = (m_digest[0] += A); B = (m_digest[1] += B); C = (m_digest[2] += C); D = (m_digest[3] += D); E = (m_digest[4] += E); input += hash_block_size(); } } /* * Copy out the digest */ void SHA_160::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void SHA_160::clear() { MDx_HashFunction::clear(); zeroise(m_W); m_digest[0] = 0x67452301; m_digest[1] = 0xEFCDAB89; m_digest[2] = 0x98BADCFE; m_digest[3] = 0x10325476; m_digest[4] = 0xC3D2E1F0; } } botan-2.4.0/src/lib/hash/sha1/sha160.h000066400000000000000000000034201322470703100171050ustar00rootroot00000000000000/* * SHA-160 * (C) 1999-2007,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHA_160_H_ #define BOTAN_SHA_160_H_ #include namespace Botan { /** * NIST's SHA-160 */ class BOTAN_PUBLIC_API(2,0) SHA_160 final : public MDx_HashFunction { public: std::string name() const override { return "SHA-160"; } size_t output_length() const override { return 20; } HashFunction* clone() const override { return new SHA_160; } std::unique_ptr copy_state() const override; void clear() override; SHA_160() : MDx_HashFunction(64, true, true), m_digest(5) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; #if defined(BOTAN_HAS_SHA1_ARMV8) static void sha1_armv8_compress_n(secure_vector& digest, const uint8_t blocks[], size_t block_count); #endif #if defined(BOTAN_HAS_SHA1_SSE2) static void sse2_compress_n(secure_vector& digest, const uint8_t blocks[], size_t block_count); #endif #if defined(BOTAN_HAS_SHA1_X86_SHA_NI) // Using x86 SHA instructions in Intel Goldmont and Cannonlake static void sha1_compress_x86(secure_vector& digest, const uint8_t blocks[], size_t block_count); #endif void copy_out(uint8_t[]) override; /** * The digest value */ secure_vector m_digest; /** * The message buffer */ secure_vector m_W; }; typedef SHA_160 SHA_1; } #endif botan-2.4.0/src/lib/hash/sha1/sha1_armv8/000077500000000000000000000000001322470703100177045ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha1/sha1_armv8/info.txt000066400000000000000000000001471322470703100214020ustar00rootroot00000000000000 SHA1_ARMV8 -> 20170117 #arm32 arm64 gcc:4.9 clang:3.8 botan-2.4.0/src/lib/hash/sha1/sha1_armv8/sha1_armv8.cpp000066400000000000000000000142001322470703100223560ustar00rootroot00000000000000/* * SHA-1 using CPU instructions in ARMv8 * * Contributed by Jeffrey Walton. Based on public domain code by * Johannes Schneiders, Skip Hovsmith and Barry O'Rourke. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * SHA-1 using CPU instructions in ARMv8 */ //static #if defined(BOTAN_HAS_SHA1_ARMV8) BOTAN_FUNC_ISA("+crypto") void SHA_160::sha1_armv8_compress_n(secure_vector& digest, const uint8_t input8[], size_t blocks) { uint32x4_t C0, C1, C2, C3; uint32x4_t ABCD, ABCD_SAVED; uint32_t E0, E0_SAVED, E1; // Load initial values C0 = vdupq_n_u32(0x5A827999); C1 = vdupq_n_u32(0x6ED9EBA1); C2 = vdupq_n_u32(0x8F1BBCDC); C3 = vdupq_n_u32(0xCA62C1D6); ABCD = vld1q_u32(&digest[0]); E0 = digest[4]; // Intermediate void* cast due to https://llvm.org/bugs/show_bug.cgi?id=20670 const uint32_t* input32 = reinterpret_cast(reinterpret_cast(input8)); while (blocks) { uint32x4_t MSG0, MSG1, MSG2, MSG3; uint32x4_t TMP0, TMP1; // Save current hash ABCD_SAVED = ABCD; E0_SAVED = E0; MSG0 = vld1q_u32(input32 + 0); MSG1 = vld1q_u32(input32 + 4); MSG2 = vld1q_u32(input32 + 8); MSG3 = vld1q_u32(input32 + 12); MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0))); MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1))); MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2))); MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3))); TMP0 = vaddq_u32(MSG0, C0); TMP1 = vaddq_u32(MSG1, C0); // Rounds 0-3 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1cq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG2, C0); MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2); // Rounds 4-7 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1cq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG3, C0); MSG0 = vsha1su1q_u32(MSG0, MSG3); MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3); // Rounds 8-11 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1cq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG0, C0); MSG1 = vsha1su1q_u32(MSG1, MSG0); MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0); // Rounds 12-15 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1cq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG1, C1); MSG2 = vsha1su1q_u32(MSG2, MSG1); MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1); // Rounds 16-19 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1cq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG2, C1); MSG3 = vsha1su1q_u32(MSG3, MSG2); MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2); // Rounds 20-23 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG3, C1); MSG0 = vsha1su1q_u32(MSG0, MSG3); MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3); // Rounds 24-27 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG0, C1); MSG1 = vsha1su1q_u32(MSG1, MSG0); MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0); // Rounds 28-31 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG1, C1); MSG2 = vsha1su1q_u32(MSG2, MSG1); MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1); // Rounds 32-35 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG2, C2); MSG3 = vsha1su1q_u32(MSG3, MSG2); MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2); // Rounds 36-39 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG3, C2); MSG0 = vsha1su1q_u32(MSG0, MSG3); MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3); // Rounds 40-43 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1mq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG0, C2); MSG1 = vsha1su1q_u32(MSG1, MSG0); MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0); // Rounds 44-47 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1mq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG1, C2); MSG2 = vsha1su1q_u32(MSG2, MSG1); MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1); // Rounds 48-51 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1mq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG2, C2); MSG3 = vsha1su1q_u32(MSG3, MSG2); MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2); // Rounds 52-55 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1mq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG3, C3); MSG0 = vsha1su1q_u32(MSG0, MSG3); MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3); // Rounds 56-59 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1mq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG0, C3); MSG1 = vsha1su1q_u32(MSG1, MSG0); MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0); // Rounds 60-63 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG1, C3); MSG2 = vsha1su1q_u32(MSG2, MSG1); MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1); // Rounds 64-67 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E0, TMP0); TMP0 = vaddq_u32(MSG2, C3); MSG3 = vsha1su1q_u32(MSG3, MSG2); MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2); // Rounds 68-71 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E1, TMP1); TMP1 = vaddq_u32(MSG3, C3); MSG0 = vsha1su1q_u32(MSG0, MSG3); // Rounds 72-75 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E0, TMP0); // Rounds 76-79 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0)); ABCD = vsha1pq_u32(ABCD, E1, TMP1); // Add state back E0 += E0_SAVED; ABCD = vaddq_u32(ABCD_SAVED, ABCD); input32 += 64/4; blocks--; } // Save digest vst1q_u32(&digest[0], ABCD); digest[4] = E0; } #endif } botan-2.4.0/src/lib/hash/sha1/sha1_sse2/000077500000000000000000000000001322470703100175235ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha1/sha1_sse2/info.txt000066400000000000000000000000721322470703100212160ustar00rootroot00000000000000 SHA1_SSE2 -> 20160803 need_isa sse2 botan-2.4.0/src/lib/hash/sha1/sha1_sse2/sha1_sse2.cpp000066400000000000000000000247331322470703100220300ustar00rootroot00000000000000/* * SHA-1 using SSE2 * Based on public domain code by Dean Gaudet * (http://arctic.org/~dean/crypto/sha1.html) * (C) 2009-2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace SHA1_SSE2_F { namespace { /* * First 16 bytes just need byte swapping. Preparing just means * adding in the round constants. */ #define prep00_15(P, W) \ do { \ W = _mm_shufflehi_epi16(W, _MM_SHUFFLE(2, 3, 0, 1)); \ W = _mm_shufflelo_epi16(W, _MM_SHUFFLE(2, 3, 0, 1)); \ W = _mm_or_si128(_mm_slli_epi16(W, 8), \ _mm_srli_epi16(W, 8)); \ P.u128 = _mm_add_epi32(W, K00_19); \ } while(0) /* For each multiple of 4, t, we want to calculate this: W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1); W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1); W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1); W[t+3] = rol(W[t] ^ W[t-5] ^ W[t-11] ^ W[t-13], 1); we'll actually calculate this: W[t+0] = rol(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1); W[t+1] = rol(W[t-2] ^ W[t-7] ^ W[t-13] ^ W[t-15], 1); W[t+2] = rol(W[t-1] ^ W[t-6] ^ W[t-12] ^ W[t-14], 1); W[t+3] = rol( 0 ^ W[t-5] ^ W[t-11] ^ W[t-13], 1); W[t+3] ^= rol(W[t+0], 1); the parameters are: W0 = &W[t-16]; W1 = &W[t-12]; W2 = &W[t- 8]; W3 = &W[t- 4]; and on output: prepared = W0 + K W0 = W[t]..W[t+3] */ /* note that there is a step here where i want to do a rol by 1, which * normally would look like this: * * r1 = psrld r0,$31 * r0 = pslld r0,$1 * r0 = por r0,r1 * * but instead i do this: * * r1 = pcmpltd r0,zero * r0 = paddd r0,r0 * r0 = psub r0,r1 * * because pcmpltd and paddd are available in both MMX units on * efficeon, pentium-m, and opteron but shifts are available in * only one unit. */ #define prep(prep, XW0, XW1, XW2, XW3, K) \ do { \ __m128i r0, r1, r2, r3; \ \ /* load W[t-4] 16-byte aligned, and shift */ \ r3 = _mm_srli_si128((XW3), 4); \ r0 = (XW0); \ /* get high 64-bits of XW0 into low 64-bits */ \ r1 = _mm_shuffle_epi32((XW0), _MM_SHUFFLE(1,0,3,2)); \ /* load high 64-bits of r1 */ \ r1 = _mm_unpacklo_epi64(r1, (XW1)); \ r2 = (XW2); \ \ r0 = _mm_xor_si128(r1, r0); \ r2 = _mm_xor_si128(r3, r2); \ r0 = _mm_xor_si128(r2, r0); \ /* unrotated W[t]..W[t+2] in r0 ... still need W[t+3] */ \ \ r2 = _mm_slli_si128(r0, 12); \ r1 = _mm_cmplt_epi32(r0, _mm_setzero_si128()); \ r0 = _mm_add_epi32(r0, r0); /* shift left by 1 */ \ r0 = _mm_sub_epi32(r0, r1); /* r0 has W[t]..W[t+2] */ \ \ r3 = _mm_srli_epi32(r2, 30); \ r2 = _mm_slli_epi32(r2, 2); \ \ r0 = _mm_xor_si128(r0, r3); \ r0 = _mm_xor_si128(r0, r2); /* r0 now has W[t+3] */ \ \ (XW0) = r0; \ (prep).u128 = _mm_add_epi32(r0, K); \ } while(0) /* * SHA-160 F1 Function */ inline void F1(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += (D ^ (B & (C ^ D))) + msg + rotl<5>(A); B = rotl<30>(B); } /* * SHA-160 F2 Function */ inline void F2(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += (B ^ C ^ D) + msg + rotl<5>(A); B = rotl<30>(B); } /* * SHA-160 F3 Function */ inline void F3(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += ((B & C) | ((B | C) & D)) + msg + rotl<5>(A); B = rotl<30>(B); } /* * SHA-160 F4 Function */ inline void F4(uint32_t A, uint32_t& B, uint32_t C, uint32_t D, uint32_t& E, uint32_t msg) { E += (B ^ C ^ D) + msg + rotl<5>(A); B = rotl<30>(B); } } } /* * SHA-160 Compression Function using SSE for message expansion */ //static BOTAN_FUNC_ISA("sse2") void SHA_160::sse2_compress_n(secure_vector& digest, const uint8_t input[], size_t blocks) { using namespace SHA1_SSE2_F; const __m128i K00_19 = _mm_set1_epi32(0x5A827999); const __m128i K20_39 = _mm_set1_epi32(0x6ED9EBA1); const __m128i K40_59 = _mm_set1_epi32(0x8F1BBCDC); const __m128i K60_79 = _mm_set1_epi32(0xCA62C1D6); uint32_t A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4]; const __m128i* input_mm = reinterpret_cast(input); for(size_t i = 0; i != blocks; ++i) { union v4si { uint32_t u32[4]; __m128i u128; }; v4si P0, P1, P2, P3; __m128i W0 = _mm_loadu_si128(&input_mm[0]); prep00_15(P0, W0); __m128i W1 = _mm_loadu_si128(&input_mm[1]); prep00_15(P1, W1); __m128i W2 = _mm_loadu_si128(&input_mm[2]); prep00_15(P2, W2); __m128i W3 = _mm_loadu_si128(&input_mm[3]); prep00_15(P3, W3); /* Using SSE4; slower on Core2 and Nehalem #define GET_P_32(P, i) _mm_extract_epi32(P.u128, i) Much slower on all tested platforms #define GET_P_32(P,i) _mm_cvtsi128_si32(_mm_srli_si128(P.u128, i*4)) */ #define GET_P_32(P, i) P.u32[i] F1(A, B, C, D, E, GET_P_32(P0, 0)); F1(E, A, B, C, D, GET_P_32(P0, 1)); F1(D, E, A, B, C, GET_P_32(P0, 2)); F1(C, D, E, A, B, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K00_19); F1(B, C, D, E, A, GET_P_32(P1, 0)); F1(A, B, C, D, E, GET_P_32(P1, 1)); F1(E, A, B, C, D, GET_P_32(P1, 2)); F1(D, E, A, B, C, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K20_39); F1(C, D, E, A, B, GET_P_32(P2, 0)); F1(B, C, D, E, A, GET_P_32(P2, 1)); F1(A, B, C, D, E, GET_P_32(P2, 2)); F1(E, A, B, C, D, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K20_39); F1(D, E, A, B, C, GET_P_32(P3, 0)); F1(C, D, E, A, B, GET_P_32(P3, 1)); F1(B, C, D, E, A, GET_P_32(P3, 2)); F1(A, B, C, D, E, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K20_39); F1(E, A, B, C, D, GET_P_32(P0, 0)); F1(D, E, A, B, C, GET_P_32(P0, 1)); F1(C, D, E, A, B, GET_P_32(P0, 2)); F1(B, C, D, E, A, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K20_39); F2(A, B, C, D, E, GET_P_32(P1, 0)); F2(E, A, B, C, D, GET_P_32(P1, 1)); F2(D, E, A, B, C, GET_P_32(P1, 2)); F2(C, D, E, A, B, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K20_39); F2(B, C, D, E, A, GET_P_32(P2, 0)); F2(A, B, C, D, E, GET_P_32(P2, 1)); F2(E, A, B, C, D, GET_P_32(P2, 2)); F2(D, E, A, B, C, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K40_59); F2(C, D, E, A, B, GET_P_32(P3, 0)); F2(B, C, D, E, A, GET_P_32(P3, 1)); F2(A, B, C, D, E, GET_P_32(P3, 2)); F2(E, A, B, C, D, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K40_59); F2(D, E, A, B, C, GET_P_32(P0, 0)); F2(C, D, E, A, B, GET_P_32(P0, 1)); F2(B, C, D, E, A, GET_P_32(P0, 2)); F2(A, B, C, D, E, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K40_59); F2(E, A, B, C, D, GET_P_32(P1, 0)); F2(D, E, A, B, C, GET_P_32(P1, 1)); F2(C, D, E, A, B, GET_P_32(P1, 2)); F2(B, C, D, E, A, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K40_59); F3(A, B, C, D, E, GET_P_32(P2, 0)); F3(E, A, B, C, D, GET_P_32(P2, 1)); F3(D, E, A, B, C, GET_P_32(P2, 2)); F3(C, D, E, A, B, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K40_59); F3(B, C, D, E, A, GET_P_32(P3, 0)); F3(A, B, C, D, E, GET_P_32(P3, 1)); F3(E, A, B, C, D, GET_P_32(P3, 2)); F3(D, E, A, B, C, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K60_79); F3(C, D, E, A, B, GET_P_32(P0, 0)); F3(B, C, D, E, A, GET_P_32(P0, 1)); F3(A, B, C, D, E, GET_P_32(P0, 2)); F3(E, A, B, C, D, GET_P_32(P0, 3)); prep(P0, W0, W1, W2, W3, K60_79); F3(D, E, A, B, C, GET_P_32(P1, 0)); F3(C, D, E, A, B, GET_P_32(P1, 1)); F3(B, C, D, E, A, GET_P_32(P1, 2)); F3(A, B, C, D, E, GET_P_32(P1, 3)); prep(P1, W1, W2, W3, W0, K60_79); F3(E, A, B, C, D, GET_P_32(P2, 0)); F3(D, E, A, B, C, GET_P_32(P2, 1)); F3(C, D, E, A, B, GET_P_32(P2, 2)); F3(B, C, D, E, A, GET_P_32(P2, 3)); prep(P2, W2, W3, W0, W1, K60_79); F4(A, B, C, D, E, GET_P_32(P3, 0)); F4(E, A, B, C, D, GET_P_32(P3, 1)); F4(D, E, A, B, C, GET_P_32(P3, 2)); F4(C, D, E, A, B, GET_P_32(P3, 3)); prep(P3, W3, W0, W1, W2, K60_79); F4(B, C, D, E, A, GET_P_32(P0, 0)); F4(A, B, C, D, E, GET_P_32(P0, 1)); F4(E, A, B, C, D, GET_P_32(P0, 2)); F4(D, E, A, B, C, GET_P_32(P0, 3)); F4(C, D, E, A, B, GET_P_32(P1, 0)); F4(B, C, D, E, A, GET_P_32(P1, 1)); F4(A, B, C, D, E, GET_P_32(P1, 2)); F4(E, A, B, C, D, GET_P_32(P1, 3)); F4(D, E, A, B, C, GET_P_32(P2, 0)); F4(C, D, E, A, B, GET_P_32(P2, 1)); F4(B, C, D, E, A, GET_P_32(P2, 2)); F4(A, B, C, D, E, GET_P_32(P2, 3)); F4(E, A, B, C, D, GET_P_32(P3, 0)); F4(D, E, A, B, C, GET_P_32(P3, 1)); F4(C, D, E, A, B, GET_P_32(P3, 2)); F4(B, C, D, E, A, GET_P_32(P3, 3)); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); input_mm += (64 / 16); } #undef GET_P_32 } #undef prep00_15 #undef prep } botan-2.4.0/src/lib/hash/sha1/sha1_x86/000077500000000000000000000000001322470703100172745ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha1/sha1_x86/info.txt000066400000000000000000000001771322470703100207750ustar00rootroot00000000000000 SHA1_X86_SHA_NI -> 20170518 need_isa sha,ssse3,sse41 clang:3.9 gcc:5.0 msvc:19.0 # MSVS 2015 botan-2.4.0/src/lib/hash/sha1/sha1_x86/sha1_x86.cpp000066400000000000000000000145771322470703100213570ustar00rootroot00000000000000/* * SHA-1 using Intel SHA intrinsic * * Based on public domain code by Sean Gulley * (https://github.com/mitls/hacl-star/tree/master/experimental/hash) * Adapted to Botan by Jeffrey Walton. * * Further changes * * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { #if defined(BOTAN_HAS_SHA1_X86_SHA_NI) BOTAN_FUNC_ISA("sha,ssse3,sse4.1") void SHA_160::sha1_compress_x86(secure_vector& digest, const uint8_t input[], size_t blocks) { const __m128i MASK = _mm_set_epi64x(0x0001020304050607ULL, 0x08090a0b0c0d0e0fULL); const __m128i* input_mm = reinterpret_cast(input); uint32_t* state = digest.data(); // Load initial values __m128i ABCD = _mm_loadu_si128(reinterpret_cast<__m128i*>(state)); __m128i E0 = _mm_set_epi32(state[4], 0, 0, 0); ABCD = _mm_shuffle_epi32(ABCD, 0x1B); while (blocks) { // Save current hash const __m128i ABCD_SAVE = ABCD; const __m128i E0_SAVE = E0; __m128i MSG0, MSG1, MSG2, MSG3; __m128i E1; // Rounds 0-3 MSG0 = _mm_loadu_si128(input_mm+0); MSG0 = _mm_shuffle_epi8(MSG0, MASK); E0 = _mm_add_epi32(E0, MSG0); E1 = ABCD; ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0); // Rounds 4-7 MSG1 = _mm_loadu_si128(input_mm+1); MSG1 = _mm_shuffle_epi8(MSG1, MASK); E1 = _mm_sha1nexte_epu32(E1, MSG1); E0 = ABCD; ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 0); MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1); // Rounds 8-11 MSG2 = _mm_loadu_si128(input_mm+2); MSG2 = _mm_shuffle_epi8(MSG2, MASK); E0 = _mm_sha1nexte_epu32(E0, MSG2); E1 = ABCD; ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0); MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2); MSG0 = _mm_xor_si128(MSG0, MSG2); // Rounds 12-15 MSG3 = _mm_loadu_si128(input_mm+3); MSG3 = _mm_shuffle_epi8(MSG3, MASK); E1 = _mm_sha1nexte_epu32(E1, MSG3); E0 = ABCD; MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 0); MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3); MSG1 = _mm_xor_si128(MSG1, MSG3); // Rounds 16-19 E0 = _mm_sha1nexte_epu32(E0, MSG0); E1 = ABCD; MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 0); MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0); MSG2 = _mm_xor_si128(MSG2, MSG0); // Rounds 20-23 E1 = _mm_sha1nexte_epu32(E1, MSG1); E0 = ABCD; MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1); MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1); MSG3 = _mm_xor_si128(MSG3, MSG1); // Rounds 24-27 E0 = _mm_sha1nexte_epu32(E0, MSG2); E1 = ABCD; MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 1); MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2); MSG0 = _mm_xor_si128(MSG0, MSG2); // Rounds 28-31 E1 = _mm_sha1nexte_epu32(E1, MSG3); E0 = ABCD; MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1); MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3); MSG1 = _mm_xor_si128(MSG1, MSG3); // Rounds 32-35 E0 = _mm_sha1nexte_epu32(E0, MSG0); E1 = ABCD; MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 1); MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0); MSG2 = _mm_xor_si128(MSG2, MSG0); // Rounds 36-39 E1 = _mm_sha1nexte_epu32(E1, MSG1); E0 = ABCD; MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 1); MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1); MSG3 = _mm_xor_si128(MSG3, MSG1); // Rounds 40-43 E0 = _mm_sha1nexte_epu32(E0, MSG2); E1 = ABCD; MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2); MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2); MSG0 = _mm_xor_si128(MSG0, MSG2); // Rounds 44-47 E1 = _mm_sha1nexte_epu32(E1, MSG3); E0 = ABCD; MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 2); MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3); MSG1 = _mm_xor_si128(MSG1, MSG3); // Rounds 48-51 E0 = _mm_sha1nexte_epu32(E0, MSG0); E1 = ABCD; MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2); MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0); MSG2 = _mm_xor_si128(MSG2, MSG0); // Rounds 52-55 E1 = _mm_sha1nexte_epu32(E1, MSG1); E0 = ABCD; MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 2); MSG0 = _mm_sha1msg1_epu32(MSG0, MSG1); MSG3 = _mm_xor_si128(MSG3, MSG1); // Rounds 56-59 E0 = _mm_sha1nexte_epu32(E0, MSG2); E1 = ABCD; MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 2); MSG1 = _mm_sha1msg1_epu32(MSG1, MSG2); MSG0 = _mm_xor_si128(MSG0, MSG2); // Rounds 60-63 E1 = _mm_sha1nexte_epu32(E1, MSG3); E0 = ABCD; MSG0 = _mm_sha1msg2_epu32(MSG0, MSG3); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3); MSG2 = _mm_sha1msg1_epu32(MSG2, MSG3); MSG1 = _mm_xor_si128(MSG1, MSG3); // Rounds 64-67 E0 = _mm_sha1nexte_epu32(E0, MSG0); E1 = ABCD; MSG1 = _mm_sha1msg2_epu32(MSG1, MSG0); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 3); MSG3 = _mm_sha1msg1_epu32(MSG3, MSG0); MSG2 = _mm_xor_si128(MSG2, MSG0); // Rounds 68-71 E1 = _mm_sha1nexte_epu32(E1, MSG1); E0 = ABCD; MSG2 = _mm_sha1msg2_epu32(MSG2, MSG1); ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3); MSG3 = _mm_xor_si128(MSG3, MSG1); // Rounds 72-75 E0 = _mm_sha1nexte_epu32(E0, MSG2); E1 = ABCD; MSG3 = _mm_sha1msg2_epu32(MSG3, MSG2); ABCD = _mm_sha1rnds4_epu32(ABCD, E0, 3); // Rounds 76-79 E1 = _mm_sha1nexte_epu32(E1, MSG3); E0 = ABCD; ABCD = _mm_sha1rnds4_epu32(ABCD, E1, 3); // Add values back to state E0 = _mm_sha1nexte_epu32(E0, E0_SAVE); ABCD = _mm_add_epi32(ABCD, ABCD_SAVE); input_mm += 4; blocks--; } // Save state ABCD = _mm_shuffle_epi32(ABCD, 0x1B); _mm_storeu_si128(reinterpret_cast<__m128i*>(state), ABCD); state[4] = _mm_extract_epi32(E0, 3); } #endif } botan-2.4.0/src/lib/hash/sha2_32/000077500000000000000000000000001322470703100162405ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha2_32/info.txt000066400000000000000000000001121322470703100177260ustar00rootroot00000000000000 SHA2_32 -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/sha2_32/sha2_32.cpp000066400000000000000000000215331322470703100201110ustar00rootroot00000000000000/* * SHA-{224,256} * (C) 1999-2010,2017 Jack Lloyd * 2007 FlexSecure GmbH * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::unique_ptr SHA_224::copy_state() const { return std::unique_ptr(new SHA_224(*this)); } std::unique_ptr SHA_256::copy_state() const { return std::unique_ptr(new SHA_256(*this)); } /* * SHA-256 F1 Function * * Use a macro as many compilers won't inline a function this big, * even though it is much faster if inlined. */ #define SHA2_32_F(A, B, C, D, E, F, G, H, M1, M2, M3, M4, magic) do { \ uint32_t A_rho = rotr<2>(A) ^ rotr<13>(A) ^ rotr<22>(A); \ uint32_t E_rho = rotr<6>(E) ^ rotr<11>(E) ^ rotr<25>(E); \ uint32_t M2_sigma = rotr<17>(M2) ^ rotr<19>(M2) ^ (M2 >> 10); \ uint32_t M4_sigma = rotr<7>(M4) ^ rotr<18>(M4) ^ (M4 >> 3); \ H += magic + E_rho + ((E & F) ^ (~E & G)) + M1; \ D += H; \ H += A_rho + ((A & B) | ((A | B) & C)); \ M1 += M2_sigma + M3 + M4_sigma; \ } while(0); /* * SHA-224 / SHA-256 compression function */ void SHA_256::compress_digest(secure_vector& digest, const uint8_t input[], size_t blocks) { #if defined(BOTAN_HAS_SHA2_32_X86) if(CPUID::has_intel_sha()) { return SHA_256::compress_digest_x86(digest, input, blocks); } #endif #if defined(BOTAN_HAS_SHA2_32_ARMV8) if(CPUID::has_arm_sha2()) { return SHA_256::compress_digest_armv8(digest, input, blocks); } #endif uint32_t A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4], F = digest[5], G = digest[6], H = digest[7]; for(size_t i = 0; i != blocks; ++i) { uint32_t W00 = load_be(input, 0); uint32_t W01 = load_be(input, 1); uint32_t W02 = load_be(input, 2); uint32_t W03 = load_be(input, 3); uint32_t W04 = load_be(input, 4); uint32_t W05 = load_be(input, 5); uint32_t W06 = load_be(input, 6); uint32_t W07 = load_be(input, 7); uint32_t W08 = load_be(input, 8); uint32_t W09 = load_be(input, 9); uint32_t W10 = load_be(input, 10); uint32_t W11 = load_be(input, 11); uint32_t W12 = load_be(input, 12); uint32_t W13 = load_be(input, 13); uint32_t W14 = load_be(input, 14); uint32_t W15 = load_be(input, 15); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x71374491); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCF); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA5); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25B); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B01); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A7); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C1); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC6); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DC); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C8); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF3); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x14292967); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A85); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B2138); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D13); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A7354); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C85); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A1); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664B); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A3); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD6990624); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E3585); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA070); SHA2_32_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116); SHA2_32_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C08); SHA2_32_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774C); SHA2_32_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5); SHA2_32_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3); SHA2_32_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4A); SHA2_32_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F); SHA2_32_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3); SHA2_32_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE); SHA2_32_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F); SHA2_32_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814); SHA2_32_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC70208); SHA2_32_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA); SHA2_32_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEB); SHA2_32_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7); SHA2_32_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); F = (digest[5] += F); G = (digest[6] += G); H = (digest[7] += H); input += 64; } } /* * SHA-224 compression function */ void SHA_224::compress_n(const uint8_t input[], size_t blocks) { SHA_256::compress_digest(m_digest, input, blocks); } /* * Copy out the digest */ void SHA_224::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void SHA_224::clear() { MDx_HashFunction::clear(); m_digest[0] = 0xC1059ED8; m_digest[1] = 0x367CD507; m_digest[2] = 0x3070DD17; m_digest[3] = 0xF70E5939; m_digest[4] = 0xFFC00B31; m_digest[5] = 0x68581511; m_digest[6] = 0x64F98FA7; m_digest[7] = 0xBEFA4FA4; } /* * SHA-256 compression function */ void SHA_256::compress_n(const uint8_t input[], size_t blocks) { SHA_256::compress_digest(m_digest, input, blocks); } /* * Copy out the digest */ void SHA_256::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void SHA_256::clear() { MDx_HashFunction::clear(); m_digest[0] = 0x6A09E667; m_digest[1] = 0xBB67AE85; m_digest[2] = 0x3C6EF372; m_digest[3] = 0xA54FF53A; m_digest[4] = 0x510E527F; m_digest[5] = 0x9B05688C; m_digest[6] = 0x1F83D9AB; m_digest[7] = 0x5BE0CD19; } } botan-2.4.0/src/lib/hash/sha2_32/sha2_32.h000066400000000000000000000043201322470703100175510ustar00rootroot00000000000000/* * SHA-{224,256} * (C) 1999-2011 Jack Lloyd * 2007 FlexSecure GmbH * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHA_224_256_H_ #define BOTAN_SHA_224_256_H_ #include namespace Botan { /** * SHA-224 */ class BOTAN_PUBLIC_API(2,0) SHA_224 final : public MDx_HashFunction { public: std::string name() const override { return "SHA-224"; } size_t output_length() const override { return 28; } HashFunction* clone() const override { return new SHA_224; } std::unique_ptr copy_state() const override; void clear() override; SHA_224() : MDx_HashFunction(64, true, true), m_digest(8) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; secure_vector m_digest; }; /** * SHA-256 */ class BOTAN_PUBLIC_API(2,0) SHA_256 final : public MDx_HashFunction { public: std::string name() const override { return "SHA-256"; } size_t output_length() const override { return 32; } HashFunction* clone() const override { return new SHA_256; } std::unique_ptr copy_state() const override; void clear() override; SHA_256() : MDx_HashFunction(64, true, true), m_digest(8) { clear(); } /* * Perform a SHA-256 compression. For internal use */ static void compress_digest(secure_vector& digest, const uint8_t input[], size_t blocks); private: #if defined(BOTAN_HAS_SHA2_32_ARMV8) static void compress_digest_armv8(secure_vector& digest, const uint8_t input[], size_t blocks); #endif #if defined(BOTAN_HAS_SHA2_32_X86) static void compress_digest_x86(secure_vector& digest, const uint8_t input[], size_t blocks); #endif void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; secure_vector m_digest; }; } #endif botan-2.4.0/src/lib/hash/sha2_32/sha2_32_armv8/000077500000000000000000000000001322470703100205165ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha2_32/sha2_32_armv8/info.txt000066400000000000000000000001521322470703100222100ustar00rootroot00000000000000 SHA2_32_ARMV8 -> 20170117 #arm32 arm64 gcc:4.9 clang:3.8 botan-2.4.0/src/lib/hash/sha2_32/sha2_32_armv8/sha2_32_armv8.cpp000066400000000000000000000154141322470703100235050ustar00rootroot00000000000000/* * SHA-256 using CPU instructions in ARMv8 * * Contributed by Jeffrey Walton. Based on public domain code by * Johannes Schneiders, Skip Hovsmith and Barry O'Rourke. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * SHA-256 using CPU instructions in ARMv8 */ //static #if defined(BOTAN_HAS_SHA2_32_ARMV8) BOTAN_FUNC_ISA("+crypto") void SHA_256::compress_digest_armv8(secure_vector& digest, const uint8_t input8[], size_t blocks) { static const uint32_t K[] = { 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, }; uint32x4_t STATE0, STATE1, ABEF_SAVE, CDGH_SAVE; uint32x4_t MSG0, MSG1, MSG2, MSG3; uint32x4_t TMP0, TMP1, TMP2; // Load initial values STATE0 = vld1q_u32(&digest[0]); STATE1 = vld1q_u32(&digest[4]); // Intermediate void* cast due to https://llvm.org/bugs/show_bug.cgi?id=20670 const uint32_t* input32 = reinterpret_cast(reinterpret_cast(input8)); while (blocks) { // Save current state ABEF_SAVE = STATE0; CDGH_SAVE = STATE1; MSG0 = vld1q_u32(input32 + 0); MSG1 = vld1q_u32(input32 + 4); MSG2 = vld1q_u32(input32 + 8); MSG3 = vld1q_u32(input32 + 12); MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0))); MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1))); MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2))); MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3))); TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0x00])); // Rounds 0-3 MSG0 = vsha256su0q_u32(MSG0, MSG1); TMP2 = STATE0; TMP1 = vaddq_u32(MSG1, vld1q_u32(&K[0x04])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3); // Rounds 4-7 MSG1 = vsha256su0q_u32(MSG1, MSG2); TMP2 = STATE0; TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[0x08])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0); // Rounds 8-11 MSG2 = vsha256su0q_u32(MSG2, MSG3); TMP2 = STATE0; TMP1 = vaddq_u32(MSG3, vld1q_u32(&K[0x0c])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1); // Rounds 12-15 MSG3 = vsha256su0q_u32(MSG3, MSG0); TMP2 = STATE0; TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0x10])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2); // Rounds 16-19 MSG0 = vsha256su0q_u32(MSG0, MSG1); TMP2 = STATE0; TMP1 = vaddq_u32(MSG1, vld1q_u32(&K[0x14])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3); // Rounds 20-23 MSG1 = vsha256su0q_u32(MSG1, MSG2); TMP2 = STATE0; TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[0x18])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0); // Rounds 24-27 MSG2 = vsha256su0q_u32(MSG2, MSG3); TMP2 = STATE0; TMP1 = vaddq_u32(MSG3, vld1q_u32(&K[0x1c])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1); // Rounds 28-31 MSG3 = vsha256su0q_u32(MSG3, MSG0); TMP2 = STATE0; TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0x20])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2); // Rounds 32-35 MSG0 = vsha256su0q_u32(MSG0, MSG1); TMP2 = STATE0; TMP1 = vaddq_u32(MSG1, vld1q_u32(&K[0x24])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3); // Rounds 36-39 MSG1 = vsha256su0q_u32(MSG1, MSG2); TMP2 = STATE0; TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[0x28])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0); // Rounds 40-43 MSG2 = vsha256su0q_u32(MSG2, MSG3); TMP2 = STATE0; TMP1 = vaddq_u32(MSG3, vld1q_u32(&K[0x2c])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1); // Rounds 44-47 MSG3 = vsha256su0q_u32(MSG3, MSG0); TMP2 = STATE0; TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0x30])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2); // Rounds 48-51 TMP2 = STATE0; TMP1 = vaddq_u32(MSG1, vld1q_u32(&K[0x34])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); // Rounds 52-55 TMP2 = STATE0; TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[0x38])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); // Rounds 56-59 TMP2 = STATE0; TMP1 = vaddq_u32(MSG3, vld1q_u32(&K[0x3c])); STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0); // Rounds 60-63 TMP2 = STATE0; STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1); STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1); // Add back to state STATE0 = vaddq_u32(STATE0, ABEF_SAVE); STATE1 = vaddq_u32(STATE1, CDGH_SAVE); input32 += 64/4; blocks--; } // Save state vst1q_u32(&digest[0], STATE0); vst1q_u32(&digest[4], STATE1); } #endif } botan-2.4.0/src/lib/hash/sha2_32/sha2_32_x86/000077500000000000000000000000001322470703100201065ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha2_32/sha2_32_x86/info.txt000066400000000000000000000001731322470703100216030ustar00rootroot00000000000000 SHA2_32_X86 -> 20170518 need_isa sha,ssse3,sse41 gcc:5.0 clang:3.9 msvc:19.0 # MSVS 2015 botan-2.4.0/src/lib/hash/sha2_32/sha2_32_x86/sha2_32_x86.cpp000066400000000000000000000213131322470703100224600ustar00rootroot00000000000000/* * Support for SHA-256 x86 instrinsic * Based on public domain code by Sean Gulley * (https://github.com/mitls/hacl-star/tree/master/experimental/hash) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { // called from sha2_32.cpp #if defined(BOTAN_HAS_SHA2_32_X86) BOTAN_FUNC_ISA("sha,sse4.1,ssse3") void SHA_256::compress_digest_x86(secure_vector& digest, const uint8_t input[], size_t blocks) { __m128i STATE0, STATE1; __m128i MSG, TMP, MASK; __m128i TMSG0, TMSG1, TMSG2, TMSG3; __m128i ABEF_SAVE, CDGH_SAVE; uint32_t* state = &digest[0]; const __m128i* input_mm = reinterpret_cast(input); // Load initial values TMP = _mm_loadu_si128(reinterpret_cast<__m128i*>(&state[0])); STATE1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&state[4])); MASK = _mm_set_epi64x(0x0c0d0e0f08090a0bULL, 0x0405060700010203ULL); TMP = _mm_shuffle_epi32(TMP, 0xB1); // CDAB STATE1 = _mm_shuffle_epi32(STATE1, 0x1B); // EFGH STATE0 = _mm_alignr_epi8(TMP, STATE1, 8); // ABEF STATE1 = _mm_blend_epi16(STATE1, TMP, 0xF0); // CDGH while (blocks) { // Save current hash ABEF_SAVE = STATE0; CDGH_SAVE = STATE1; // Rounds 0-3 MSG = _mm_loadu_si128(input_mm); TMSG0 = _mm_shuffle_epi8(MSG, MASK); MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(0xE9B5DBA5B5C0FBCFULL, 0x71374491428A2F98ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); // Rounds 4-7 TMSG1 = _mm_loadu_si128(input_mm + 1); TMSG1 = _mm_shuffle_epi8(TMSG1, MASK); MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(0xAB1C5ED5923F82A4ULL, 0x59F111F13956C25BULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1); // Rounds 8-11 TMSG2 = _mm_loadu_si128(input_mm + 2); TMSG2 = _mm_shuffle_epi8(TMSG2, MASK); MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(0x550C7DC3243185BEULL, 0x12835B01D807AA98ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2); // Rounds 12-15 TMSG3 = _mm_loadu_si128(input_mm + 3); TMSG3 = _mm_shuffle_epi8(TMSG3, MASK); MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(0xC19BF1749BDC06A7ULL, 0x80DEB1FE72BE5D74ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG3, TMSG2, 4); TMSG0 = _mm_add_epi32(TMSG0, TMP); TMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3); // Rounds 16-19 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(0x240CA1CC0FC19DC6ULL, 0xEFBE4786E49B69C1ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG0, TMSG3, 4); TMSG1 = _mm_add_epi32(TMSG1, TMP); TMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0); // Rounds 20-23 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(0x76F988DA5CB0A9DCULL, 0x4A7484AA2DE92C6FULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG1, TMSG0, 4); TMSG2 = _mm_add_epi32(TMSG2, TMP); TMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1); // Rounds 24-27 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(0xBF597FC7B00327C8ULL, 0xA831C66D983E5152ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG2, TMSG1, 4); TMSG3 = _mm_add_epi32(TMSG3, TMP); TMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2); // Rounds 28-31 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(0x1429296706CA6351ULL, 0xD5A79147C6E00BF3ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG3, TMSG2, 4); TMSG0 = _mm_add_epi32(TMSG0, TMP); TMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3); // Rounds 32-35 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(0x53380D134D2C6DFCULL, 0x2E1B213827B70A85ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG0, TMSG3, 4); TMSG1 = _mm_add_epi32(TMSG1, TMP); TMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0); // Rounds 36-39 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(0x92722C8581C2C92EULL, 0x766A0ABB650A7354ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG1, TMSG0, 4); TMSG2 = _mm_add_epi32(TMSG2, TMP); TMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1); // Rounds 40-43 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(0xC76C51A3C24B8B70ULL, 0xA81A664BA2BFE8A1ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG2, TMSG1, 4); TMSG3 = _mm_add_epi32(TMSG3, TMP); TMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2); // Rounds 44-47 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(0x106AA070F40E3585ULL, 0xD6990624D192E819ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG3, TMSG2, 4); TMSG0 = _mm_add_epi32(TMSG0, TMP); TMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3); // Rounds 48-51 MSG = _mm_add_epi32(TMSG0, _mm_set_epi64x(0x34B0BCB52748774CULL, 0x1E376C0819A4C116ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG0, TMSG3, 4); TMSG1 = _mm_add_epi32(TMSG1, TMP); TMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); TMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0); // Rounds 52-55 MSG = _mm_add_epi32(TMSG1, _mm_set_epi64x(0x682E6FF35B9CCA4FULL, 0x4ED8AA4A391C0CB3ULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG1, TMSG0, 4); TMSG2 = _mm_add_epi32(TMSG2, TMP); TMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); // Rounds 56-59 MSG = _mm_add_epi32(TMSG2, _mm_set_epi64x(0x8CC7020884C87814ULL, 0x78A5636F748F82EEULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); TMP = _mm_alignr_epi8(TMSG2, TMSG1, 4); TMSG3 = _mm_add_epi32(TMSG3, TMP); TMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); // Rounds 60-63 MSG = _mm_add_epi32(TMSG3, _mm_set_epi64x(0xC67178F2BEF9A3F7ULL, 0xA4506CEB90BEFFFAULL)); STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG); MSG = _mm_shuffle_epi32(MSG, 0x0E); STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG); // Add values back to state STATE0 = _mm_add_epi32(STATE0, ABEF_SAVE); STATE1 = _mm_add_epi32(STATE1, CDGH_SAVE); input_mm += 4; blocks--; } TMP = _mm_shuffle_epi32(STATE0, 0x1B); // FEBA STATE1 = _mm_shuffle_epi32(STATE1, 0xB1); // DCHG STATE0 = _mm_blend_epi16(TMP, STATE1, 0xF0); // DCBA STATE1 = _mm_alignr_epi8(STATE1, TMP, 8); // ABEF // Save state _mm_storeu_si128(reinterpret_cast<__m128i*>(&state[0]), STATE0); _mm_storeu_si128(reinterpret_cast<__m128i*>(&state[4]), STATE1); } #endif } botan-2.4.0/src/lib/hash/sha2_64/000077500000000000000000000000001322470703100162455ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha2_64/info.txt000066400000000000000000000001121322470703100177330ustar00rootroot00000000000000 SHA2_64 -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/sha2_64/sha2_64.cpp000066400000000000000000000256511322470703100201300ustar00rootroot00000000000000/* * SHA-{384,512} * (C) 1999-2011,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::unique_ptr SHA_384::copy_state() const { return std::unique_ptr(new SHA_384(*this)); } std::unique_ptr SHA_512::copy_state() const { return std::unique_ptr(new SHA_512(*this)); } std::unique_ptr SHA_512_256::copy_state() const { return std::unique_ptr(new SHA_512_256(*this)); } namespace { /* * SHA-512 F1 Function * * Use a macro as many compilers won't inline a function this big, * even though it is much faster if inlined. */ #define SHA2_64_F(A, B, C, D, E, F, G, H, M1, M2, M3, M4, magic) \ do { \ const uint64_t E_rho = rotr<14>(E) ^ rotr<18>(E) ^ rotr<41>(E); \ const uint64_t A_rho = rotr<28>(A) ^ rotr<34>(A) ^ rotr<39>(A); \ const uint64_t M2_sigma = rotr<19>(M2) ^ rotr<61>(M2) ^ (M2 >> 6); \ const uint64_t M4_sigma = rotr<1>(M4) ^ rotr<8>(M4) ^ (M4 >> 7); \ H += magic + E_rho + ((E & F) ^ (~E & G)) + M1; \ D += H; \ H += A_rho + ((A & B) | ((A | B) & C)); \ M1 += M2_sigma + M3 + M4_sigma; \ } while(0); /* * SHA-{384,512} Compression Function */ void SHA64_compress(secure_vector& digest, const uint8_t input[], size_t blocks) { uint64_t A = digest[0], B = digest[1], C = digest[2], D = digest[3], E = digest[4], F = digest[5], G = digest[6], H = digest[7]; for(size_t i = 0; i != blocks; ++i) { uint64_t W00 = load_be(input, 0); uint64_t W01 = load_be(input, 1); uint64_t W02 = load_be(input, 2); uint64_t W03 = load_be(input, 3); uint64_t W04 = load_be(input, 4); uint64_t W05 = load_be(input, 5); uint64_t W06 = load_be(input, 6); uint64_t W07 = load_be(input, 7); uint64_t W08 = load_be(input, 8); uint64_t W09 = load_be(input, 9); uint64_t W10 = load_be(input, 10); uint64_t W11 = load_be(input, 11); uint64_t W12 = load_be(input, 12); uint64_t W13 = load_be(input, 13); uint64_t W14 = load_be(input, 14); uint64_t W15 = load_be(input, 15); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98D728AE22); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x7137449123EF65CD); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCFEC4D3B2F); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA58189DBBC); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25BF348B538); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1B605D019); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4AF194F9B); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5DA6D8118); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98A3030242); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B0145706FBE); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE4EE4B28C); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3D5FFB4E2); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74F27B896F); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE3B1696B1); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A725C71235); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174CF692694); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C19EF14AD2); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786384F25E3); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC68B8CD5B5); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC77AC9C65); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F592B0275); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA6EA6E483); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DCBD41FBD4); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA831153B5); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152EE66DFAB); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D2DB43210); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C898FB213F); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7BEEF0EE4); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF33DA88FC2); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147930AA725); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351E003826F); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x142929670A0E6E70); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A8546D22FFC); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B21385C26C926); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC5AC42AED); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D139D95B3DF); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A73548BAF63DE); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB3C77B2A8); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E47EDAEE6); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C851482353B); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A14CF10364); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664BBC423001); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70D0F89791); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A30654BE30); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819D6EF5218); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD69906245565A910); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E35855771202A); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA07032BBD1B8); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116B8D2D0C8); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C085141AB53); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774CDF8EEB99); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5E19B48A8); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3C5C95A63); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4AE3418ACB); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F7763E373); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3D6B2B8A3); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE5DEFB2FC); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F43172F60); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814A1F0AB72); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC702081A6439EC); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA23631E28); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEBDE82BDE9); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7B2C67915); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2E372532B); SHA2_64_F(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xCA273ECEEA26619C); SHA2_64_F(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xD186B8C721C0C207); SHA2_64_F(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xEADA7DD6CDE0EB1E); SHA2_64_F(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xF57D4F7FEE6ED178); SHA2_64_F(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x06F067AA72176FBA); SHA2_64_F(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x0A637DC5A2C898A6); SHA2_64_F(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x113F9804BEF90DAE); SHA2_64_F(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x1B710B35131C471B); SHA2_64_F(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x28DB77F523047D84); SHA2_64_F(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x32CAAB7B40C72493); SHA2_64_F(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x3C9EBE0A15C9BEBC); SHA2_64_F(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x431D67C49C100D4C); SHA2_64_F(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x4CC5D4BECB3E42B6); SHA2_64_F(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x597F299CFC657E2A); SHA2_64_F(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x5FCB6FAB3AD6FAEC); SHA2_64_F(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x6C44198C4A475817); A = (digest[0] += A); B = (digest[1] += B); C = (digest[2] += C); D = (digest[3] += D); E = (digest[4] += E); F = (digest[5] += F); G = (digest[6] += G); H = (digest[7] += H); input += 128; } } } void SHA_512_256::compress_n(const uint8_t input[], size_t blocks) { SHA64_compress(m_digest, input, blocks); } void SHA_384::compress_n(const uint8_t input[], size_t blocks) { SHA64_compress(m_digest, input, blocks); } void SHA_512::compress_n(const uint8_t input[], size_t blocks) { SHA64_compress(m_digest, input, blocks); } void SHA_512_256::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } void SHA_384::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } void SHA_512::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } void SHA_512_256::clear() { MDx_HashFunction::clear(); m_digest[0] = 0x22312194FC2BF72C; m_digest[1] = 0x9F555FA3C84C64C2; m_digest[2] = 0x2393B86B6F53B151; m_digest[3] = 0x963877195940EABD; m_digest[4] = 0x96283EE2A88EFFE3; m_digest[5] = 0xBE5E1E2553863992; m_digest[6] = 0x2B0199FC2C85B8AA; m_digest[7] = 0x0EB72DDC81C52CA2; } void SHA_384::clear() { MDx_HashFunction::clear(); m_digest[0] = 0xCBBB9D5DC1059ED8; m_digest[1] = 0x629A292A367CD507; m_digest[2] = 0x9159015A3070DD17; m_digest[3] = 0x152FECD8F70E5939; m_digest[4] = 0x67332667FFC00B31; m_digest[5] = 0x8EB44A8768581511; m_digest[6] = 0xDB0C2E0D64F98FA7; m_digest[7] = 0x47B5481DBEFA4FA4; } void SHA_512::clear() { MDx_HashFunction::clear(); m_digest[0] = 0x6A09E667F3BCC908; m_digest[1] = 0xBB67AE8584CAA73B; m_digest[2] = 0x3C6EF372FE94F82B; m_digest[3] = 0xA54FF53A5F1D36F1; m_digest[4] = 0x510E527FADE682D1; m_digest[5] = 0x9B05688C2B3E6C1F; m_digest[6] = 0x1F83D9ABFB41BD6B; m_digest[7] = 0x5BE0CD19137E2179; } } botan-2.4.0/src/lib/hash/sha2_64/sha2_64.h000066400000000000000000000041771322470703100175750ustar00rootroot00000000000000/* * SHA-{384,512} * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHA_64BIT_H_ #define BOTAN_SHA_64BIT_H_ #include namespace Botan { /** * SHA-384 */ class BOTAN_PUBLIC_API(2,0) SHA_384 final : public MDx_HashFunction { public: std::string name() const override { return "SHA-384"; } size_t output_length() const override { return 48; } HashFunction* clone() const override { return new SHA_384; } std::unique_ptr copy_state() const override; void clear() override; SHA_384() : MDx_HashFunction(128, true, true, 16), m_digest(8) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; secure_vector m_digest; }; /** * SHA-512 */ class BOTAN_PUBLIC_API(2,0) SHA_512 final : public MDx_HashFunction { public: std::string name() const override { return "SHA-512"; } size_t output_length() const override { return 64; } HashFunction* clone() const override { return new SHA_512; } std::unique_ptr copy_state() const override; void clear() override; SHA_512() : MDx_HashFunction(128, true, true, 16), m_digest(8) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; secure_vector m_digest; }; /** * SHA-512/256 */ class BOTAN_PUBLIC_API(2,0) SHA_512_256 final : public MDx_HashFunction { public: std::string name() const override { return "SHA-512-256"; } size_t output_length() const override { return 32; } HashFunction* clone() const override { return new SHA_512_256; } std::unique_ptr copy_state() const override; void clear() override; SHA_512_256() : MDx_HashFunction(128, true, true, 16), m_digest(8) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; secure_vector m_digest; }; } #endif botan-2.4.0/src/lib/hash/sha3/000077500000000000000000000000001322470703100157355ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sha3/info.txt000066400000000000000000000000461322470703100174310ustar00rootroot00000000000000 SHA3 -> 20161018 botan-2.4.0/src/lib/hash/sha3/sha3.cpp000066400000000000000000000144261322470703100173060ustar00rootroot00000000000000/* * SHA-3 * (C) 2010,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::unique_ptr SHA_3::copy_state() const { return std::unique_ptr(new SHA_3(*this)); } //static void SHA_3::permute(uint64_t A[25]) { static const uint64_t RC[24] = { 0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000, 0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, 0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A, 0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A, 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 }; for(size_t i = 0; i != 24; ++i) { const uint64_t C0 = A[0] ^ A[5] ^ A[10] ^ A[15] ^ A[20]; const uint64_t C1 = A[1] ^ A[6] ^ A[11] ^ A[16] ^ A[21]; const uint64_t C2 = A[2] ^ A[7] ^ A[12] ^ A[17] ^ A[22]; const uint64_t C3 = A[3] ^ A[8] ^ A[13] ^ A[18] ^ A[23]; const uint64_t C4 = A[4] ^ A[9] ^ A[14] ^ A[19] ^ A[24]; const uint64_t D0 = rotl<1>(C0) ^ C3; const uint64_t D1 = rotl<1>(C1) ^ C4; const uint64_t D2 = rotl<1>(C2) ^ C0; const uint64_t D3 = rotl<1>(C3) ^ C1; const uint64_t D4 = rotl<1>(C4) ^ C2; const uint64_t B00 = A[ 0] ^ D1; const uint64_t B10 = rotl<1>(A[ 1] ^ D2); const uint64_t B20 = rotl<62>(A[ 2] ^ D3); const uint64_t B05 = rotl<28>(A[ 3] ^ D4); const uint64_t B15 = rotl<27>(A[ 4] ^ D0); const uint64_t B16 = rotl<36>(A[ 5] ^ D1); const uint64_t B01 = rotl<44>(A[ 6] ^ D2); const uint64_t B11 = rotl<6>(A[ 7] ^ D3); const uint64_t B21 = rotl<55>(A[ 8] ^ D4); const uint64_t B06 = rotl<20>(A[ 9] ^ D0); const uint64_t B07 = rotl<3>(A[10] ^ D1); const uint64_t B17 = rotl<10>(A[11] ^ D2); const uint64_t B02 = rotl<43>(A[12] ^ D3); const uint64_t B12 = rotl<25>(A[13] ^ D4); const uint64_t B22 = rotl<39>(A[14] ^ D0); const uint64_t B23 = rotl<41>(A[15] ^ D1); const uint64_t B08 = rotl<45>(A[16] ^ D2); const uint64_t B18 = rotl<15>(A[17] ^ D3); const uint64_t B03 = rotl<21>(A[18] ^ D4); const uint64_t B13 = rotl<8>(A[19] ^ D0); const uint64_t B14 = rotl<18>(A[20] ^ D1); const uint64_t B24 = rotl<2>(A[21] ^ D2); const uint64_t B09 = rotl<61>(A[22] ^ D3); const uint64_t B19 = rotl<56>(A[23] ^ D4); const uint64_t B04 = rotl<14>(A[24] ^ D0); A[ 0] = B00 ^ (~B01 & B02); A[ 1] = B01 ^ (~B02 & B03); A[ 2] = B02 ^ (~B03 & B04); A[ 3] = B03 ^ (~B04 & B00); A[ 4] = B04 ^ (~B00 & B01); A[ 5] = B05 ^ (~B06 & B07); A[ 6] = B06 ^ (~B07 & B08); A[ 7] = B07 ^ (~B08 & B09); A[ 8] = B08 ^ (~B09 & B05); A[ 9] = B09 ^ (~B05 & B06); A[10] = B10 ^ (~B11 & B12); A[11] = B11 ^ (~B12 & B13); A[12] = B12 ^ (~B13 & B14); A[13] = B13 ^ (~B14 & B10); A[14] = B14 ^ (~B10 & B11); A[15] = B15 ^ (~B16 & B17); A[16] = B16 ^ (~B17 & B18); A[17] = B17 ^ (~B18 & B19); A[18] = B18 ^ (~B19 & B15); A[19] = B19 ^ (~B15 & B16); A[20] = B20 ^ (~B21 & B22); A[21] = B21 ^ (~B22 & B23); A[22] = B22 ^ (~B23 & B24); A[23] = B23 ^ (~B24 & B20); A[24] = B24 ^ (~B20 & B21); A[0] ^= RC[i]; } } SHA_3::SHA_3(size_t output_bits) : m_output_bits(output_bits), m_bitrate(1600 - 2*output_bits), m_S(25), m_S_pos(0) { // We only support the parameters for SHA-3 in this constructor if(output_bits != 224 && output_bits != 256 && output_bits != 384 && output_bits != 512) throw Invalid_Argument("SHA_3: Invalid output length " + std::to_string(output_bits)); } std::string SHA_3::name() const { return "SHA-3(" + std::to_string(m_output_bits) + ")"; } HashFunction* SHA_3::clone() const { return new SHA_3(m_output_bits); } void SHA_3::clear() { zeroise(m_S); m_S_pos = 0; } //static size_t SHA_3::absorb(size_t bitrate, secure_vector& S, size_t S_pos, const uint8_t input[], size_t length) { while(length > 0) { size_t to_take = std::min(length, bitrate / 8 - S_pos); length -= to_take; while(to_take && S_pos % 8) { S[S_pos / 8] ^= static_cast(input[0]) << (8 * (S_pos % 8)); ++S_pos; ++input; --to_take; } while(to_take && to_take % 8 == 0) { S[S_pos / 8] ^= load_le(input, 0); S_pos += 8; input += 8; to_take -= 8; } while(to_take) { S[S_pos / 8] ^= static_cast(input[0]) << (8 * (S_pos % 8)); ++S_pos; ++input; --to_take; } if(S_pos == bitrate / 8) { SHA_3::permute(S.data()); S_pos = 0; } } return S_pos; } //static void SHA_3::expand(size_t bitrate, secure_vector& S, uint8_t output[], size_t output_length) { BOTAN_ARG_CHECK(bitrate % 8 == 0); size_t Si = 0; for(size_t i = 0; i != output_length; ++i) { if(i > 0) { if(i % (bitrate / 8) == 0) { SHA_3::permute(S.data()); Si = 0; } else if(i % 8 == 0) { Si += 1; } } output[i] = get_byte(7 - (i % 8), S[Si]); } } void SHA_3::add_data(const uint8_t input[], size_t length) { m_S_pos = SHA_3::absorb(m_bitrate, m_S, m_S_pos, input, length); } void SHA_3::final_result(uint8_t output[]) { std::vector padding(m_bitrate / 8 - m_S_pos); padding[0] = 0x06; padding[padding.size()-1] |= 0x80; add_data(padding.data(), padding.size()); /* * We never have to run the permutation again because we only support * limited output lengths */ for(size_t i = 0; i != m_output_bits/8; ++i) output[i] = get_byte(7 - (i % 8), m_S[i/8]); clear(); } } botan-2.4.0/src/lib/hash/sha3/sha3.h000066400000000000000000000051041322470703100167440ustar00rootroot00000000000000/* * SHA-3 * (C) 2010,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHA3_H_ #define BOTAN_SHA3_H_ #include #include #include namespace Botan { /** * SHA-3 */ class BOTAN_PUBLIC_API(2,0) SHA_3 : public HashFunction { public: /** * @param output_bits the size of the hash output; must be one of * 224, 256, 384, or 512 */ explicit SHA_3(size_t output_bits); size_t hash_block_size() const override { return m_bitrate / 8; } size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override; std::unique_ptr copy_state() const override; std::string name() const override; void clear() override; // Static functions for internal usage /** * Absorb data into the provided state * @param bitrate the bitrate to absorb into the sponge * @param S the sponge state * @param S_pos where to begin absorbing into S * @param input the input data * @param length size of input in bytes */ static size_t absorb(size_t bitrate, secure_vector& S, size_t S_pos, const uint8_t input[], size_t length); /** * Expand from provided state * @param bitrate sponge parameter * @param S the state * @param output the output buffer * @param output_length the size of output in bytes */ static void expand(size_t bitrate, secure_vector& S, uint8_t output[], size_t output_length); /** * The bare Keccak-1600 permutation */ static void permute(uint64_t A[25]); private: void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; size_t m_output_bits, m_bitrate; secure_vector m_S; size_t m_S_pos; }; /** * SHA-3-224 */ class BOTAN_PUBLIC_API(2,0) SHA_3_224 final : public SHA_3 { public: SHA_3_224() : SHA_3(224) {} }; /** * SHA-3-256 */ class BOTAN_PUBLIC_API(2,0) SHA_3_256 final : public SHA_3 { public: SHA_3_256() : SHA_3(256) {} }; /** * SHA-3-384 */ class BOTAN_PUBLIC_API(2,0) SHA_3_384 final : public SHA_3 { public: SHA_3_384() : SHA_3(384) {} }; /** * SHA-3-512 */ class BOTAN_PUBLIC_API(2,0) SHA_3_512 final : public SHA_3 { public: SHA_3_512() : SHA_3(512) {} }; } #endif botan-2.4.0/src/lib/hash/shake/000077500000000000000000000000001322470703100161725ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/shake/info.txt000066400000000000000000000001041322470703100176610ustar00rootroot00000000000000 SHAKE -> 20161009 sha3 botan-2.4.0/src/lib/hash/shake/shake.cpp000066400000000000000000000046461322470703100200030ustar00rootroot00000000000000/* * SHAKE-128/256 as a hash * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { SHAKE_128::SHAKE_128(size_t output_bits) : m_output_bits(output_bits), m_S(25), m_S_pos(0) { if(output_bits % 8 != 0) throw Invalid_Argument("SHAKE_128: Invalid output length " + std::to_string(output_bits)); } std::string SHAKE_128::name() const { return "SHAKE-128(" + std::to_string(m_output_bits) + ")"; } HashFunction* SHAKE_128::clone() const { return new SHAKE_128(m_output_bits); } std::unique_ptr SHAKE_128::copy_state() const { return std::unique_ptr(new SHAKE_128(*this)); } void SHAKE_128::clear() { zeroise(m_S); m_S_pos = 0; } void SHAKE_128::add_data(const uint8_t input[], size_t length) { m_S_pos = SHA_3::absorb(SHAKE_128_BITRATE, m_S, m_S_pos, input, length); } void SHAKE_128::final_result(uint8_t output[]) { std::vector padding(SHAKE_128_BITRATE / 8 - m_S_pos); padding[0] = 0x1F; padding[padding.size()-1] |= 0x80; add_data(padding.data(), padding.size()); SHA_3::expand(SHAKE_128_BITRATE, m_S, output, output_length()); clear(); } SHAKE_256::SHAKE_256(size_t output_bits) : m_output_bits(output_bits), m_S(25), m_S_pos(0) { if(output_bits % 8 != 0) throw Invalid_Argument("SHAKE_256: Invalid output length " + std::to_string(output_bits)); } std::string SHAKE_256::name() const { return "SHAKE-256(" + std::to_string(m_output_bits) + ")"; } HashFunction* SHAKE_256::clone() const { return new SHAKE_256(m_output_bits); } std::unique_ptr SHAKE_256::copy_state() const { return std::unique_ptr(new SHAKE_256(*this)); } void SHAKE_256::clear() { zeroise(m_S); m_S_pos = 0; } void SHAKE_256::add_data(const uint8_t input[], size_t length) { m_S_pos = SHA_3::absorb(SHAKE_256_BITRATE, m_S, m_S_pos, input, length); } void SHAKE_256::final_result(uint8_t output[]) { std::vector padding(SHAKE_256_BITRATE / 8 - m_S_pos); padding[0] = 0x1F; padding[padding.size()-1] |= 0x80; add_data(padding.data(), padding.size()); SHA_3::expand(SHAKE_256_BITRATE, m_S, output, output_length()); clear(); } } botan-2.4.0/src/lib/hash/shake/shake.h000066400000000000000000000037631322470703100174470ustar00rootroot00000000000000/* * SHAKE hash functions * (C) 2010,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHAKE_HASH_H_ #define BOTAN_SHAKE_HASH_H_ #include #include #include namespace Botan { /** * SHAKE-128 */ class BOTAN_PUBLIC_API(2,0) SHAKE_128 final : public HashFunction { public: /** * @param output_bits the desired output size in bits * must be a multiple of 8 */ explicit SHAKE_128(size_t output_bits); size_t hash_block_size() const override { return SHAKE_128_BITRATE / 8; } size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override; std::unique_ptr copy_state() const override; std::string name() const override; void clear() override; private: void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; static const size_t SHAKE_128_BITRATE = 1600 - 256; size_t m_output_bits; secure_vector m_S; size_t m_S_pos; }; /** * SHAKE-256 */ class BOTAN_PUBLIC_API(2,0) SHAKE_256 final : public HashFunction { public: /** * @param output_bits the desired output size in bits * must be a multiple of 8 */ explicit SHAKE_256(size_t output_bits); size_t hash_block_size() const override { return SHAKE_256_BITRATE / 8; } size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override; std::unique_ptr copy_state() const override; std::string name() const override; void clear() override; private: void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; static const size_t SHAKE_256_BITRATE = 1600 - 512; size_t m_output_bits; secure_vector m_S; size_t m_S_pos; }; } #endif botan-2.4.0/src/lib/hash/skein/000077500000000000000000000000001322470703100162105ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/skein/info.txt000066400000000000000000000001151322470703100177010ustar00rootroot00000000000000 SKEIN_512 -> 20131128 threefish botan-2.4.0/src/lib/hash/skein/skein_512.cpp000066400000000000000000000104651322470703100204220ustar00rootroot00000000000000/* * The Skein-512 hash function * (C) 2009,2010,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { Skein_512::Skein_512(size_t arg_output_bits, const std::string& arg_personalization) : m_personalization(arg_personalization), m_output_bits(arg_output_bits), m_threefish(new Threefish_512), m_T(2), m_buffer(64), m_buf_pos(0) { if(m_output_bits == 0 || m_output_bits % 8 != 0 || m_output_bits > 512) throw Invalid_Argument("Bad output bits size for Skein-512"); initial_block(); } std::string Skein_512::name() const { if(m_personalization != "") return "Skein-512(" + std::to_string(m_output_bits) + "," + m_personalization + ")"; return "Skein-512(" + std::to_string(m_output_bits) + ")"; } HashFunction* Skein_512::clone() const { return new Skein_512(m_output_bits, m_personalization); } std::unique_ptr Skein_512::copy_state() const { std::unique_ptr copy(new Skein_512(m_output_bits, m_personalization)); copy->m_threefish->m_K = this->m_threefish->m_K; copy->m_T = this->m_T; copy->m_buffer = this->m_buffer; copy->m_buf_pos = this->m_buf_pos; return std::move(copy); } void Skein_512::clear() { zeroise(m_buffer); m_buf_pos = 0; initial_block(); } void Skein_512::reset_tweak(type_code type, bool is_final) { m_T[0] = 0; m_T[1] = (static_cast(type) << 56) | (static_cast(1) << 62) | (static_cast(is_final) << 63); } void Skein_512::initial_block() { const uint8_t zeros[64] = { 0 }; m_threefish->set_key(zeros, sizeof(zeros)); // ASCII("SHA3") followed by version (0x0001) code uint8_t config_str[32] = { 0x53, 0x48, 0x41, 0x33, 0x01, 0x00, 0 }; store_le(uint32_t(m_output_bits), config_str + 8); reset_tweak(SKEIN_CONFIG, true); ubi_512(config_str, sizeof(config_str)); if(m_personalization != "") { /* This is a limitation of this implementation, and not of the algorithm specification. Could be fixed relatively easily, but doesn't seem worth the trouble. */ if(m_personalization.length() > 64) throw Invalid_Argument("Skein personalization must be less than 64 bytes"); const uint8_t* bits = cast_char_ptr_to_uint8(m_personalization.data()); reset_tweak(SKEIN_PERSONALIZATION, true); ubi_512(bits, m_personalization.length()); } reset_tweak(SKEIN_MSG, false); } void Skein_512::ubi_512(const uint8_t msg[], size_t msg_len) { secure_vector M(8); do { const size_t to_proc = std::min(msg_len, 64); m_T[0] += to_proc; load_le(M.data(), msg, to_proc / 8); if(to_proc % 8) { for(size_t j = 0; j != to_proc % 8; ++j) M[to_proc/8] |= static_cast(msg[8*(to_proc/8)+j]) << (8*j); } m_threefish->skein_feedfwd(M, m_T); // clear first flag if set m_T[1] &= ~(static_cast(1) << 62); msg_len -= to_proc; msg += to_proc; } while(msg_len); } void Skein_512::add_data(const uint8_t input[], size_t length) { if(length == 0) return; if(m_buf_pos) { buffer_insert(m_buffer, m_buf_pos, input, length); if(m_buf_pos + length > 64) { ubi_512(m_buffer.data(), m_buffer.size()); input += (64 - m_buf_pos); length -= (64 - m_buf_pos); m_buf_pos = 0; } } const size_t full_blocks = (length - 1) / 64; if(full_blocks) ubi_512(input, 64*full_blocks); length -= full_blocks * 64; buffer_insert(m_buffer, m_buf_pos, input + full_blocks * 64, length); m_buf_pos += length; } void Skein_512::final_result(uint8_t out[]) { m_T[1] |= (static_cast(1) << 63); // final block flag for(size_t i = m_buf_pos; i != m_buffer.size(); ++i) m_buffer[i] = 0; ubi_512(m_buffer.data(), m_buf_pos); const uint8_t counter[8] = { 0 }; reset_tweak(SKEIN_OUTPUT, true); ubi_512(counter, sizeof(counter)); copy_out_vec_le(out, m_output_bits / 8, m_threefish->m_K); m_buf_pos = 0; initial_block(); } } botan-2.4.0/src/lib/hash/skein/skein_512.h000066400000000000000000000033601322470703100200630ustar00rootroot00000000000000/* * The Skein-512 hash function * (C) 2009,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SKEIN_512_H_ #define BOTAN_SKEIN_512_H_ #include #include #include #include namespace Botan { /** * Skein-512, a SHA-3 candidate */ class BOTAN_PUBLIC_API(2,0) Skein_512 final : public HashFunction { public: /** * @param output_bits the output size of Skein in bits * @param personalization is a string that will parameterize the * hash output */ Skein_512(size_t output_bits = 512, const std::string& personalization = ""); size_t hash_block_size() const override { return 64; } size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override; std::unique_ptr copy_state() const override; std::string name() const override; void clear() override; private: enum type_code { SKEIN_KEY = 0, SKEIN_CONFIG = 4, SKEIN_PERSONALIZATION = 8, SKEIN_PUBLIC_KEY = 12, SKEIN_KEY_IDENTIFIER = 16, SKEIN_NONCE = 20, SKEIN_MSG = 48, SKEIN_OUTPUT = 63 }; void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; void ubi_512(const uint8_t msg[], size_t msg_len); void initial_block(); void reset_tweak(type_code type, bool is_final); std::string m_personalization; size_t m_output_bits; std::unique_ptr m_threefish; secure_vector m_T; secure_vector m_buffer; size_t m_buf_pos; }; } #endif botan-2.4.0/src/lib/hash/sm3/000077500000000000000000000000001322470703100156015ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/sm3/info.txt000066400000000000000000000001061322470703100172720ustar00rootroot00000000000000 SM3 -> 20170402 mdx_hash botan-2.4.0/src/lib/hash/sm3/sm3.cpp000066400000000000000000000232751322470703100170200ustar00rootroot00000000000000/* * SM3 * (C) 2017 Ribose Inc. * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::unique_ptr SM3::copy_state() const { return std::unique_ptr(new SM3(*this)); } namespace { const uint32_t SM3_IV[] = { 0x7380166fUL, 0x4914b2b9UL, 0x172442d7UL, 0xda8a0600UL, 0xa96f30bcUL, 0x163138aaUL, 0xe38dee4dUL, 0xb0fb0e4eUL }; inline uint32_t P0(uint32_t X) { return X ^ rotl<9>(X) ^ rotl<17>(X); } inline uint32_t FF1(uint32_t X, uint32_t Y, uint32_t Z) { return (X & Y) | ((X | Y) & Z); //return (X & Y) | (X & Z) | (Y & Z); } inline uint32_t GG1(uint32_t X, uint32_t Y, uint32_t Z) { //return (X & Y) | (~X & Z); return ((Z ^ (X & (Y ^ Z)))); } inline void R1(uint32_t A, uint32_t& B, uint32_t C, uint32_t& D, uint32_t E, uint32_t& F, uint32_t G, uint32_t& H, uint32_t TJ, uint32_t Wi, uint32_t Wj) { const uint32_t A12 = rotl<12>(A); const uint32_t SS1 = rotl<7>(A12 + E + TJ); const uint32_t TT1 = (A ^ B ^ C) + D + (SS1 ^ A12) + Wj; const uint32_t TT2 = (E ^ F ^ G) + H + SS1 + Wi; B = rotl<9>(B); D = TT1; F = rotl<19>(F); H = P0(TT2); } inline void R2(uint32_t A, uint32_t& B, uint32_t C, uint32_t& D, uint32_t E, uint32_t& F, uint32_t G, uint32_t& H, uint32_t TJ, uint32_t Wi, uint32_t Wj) { const uint32_t A12 = rotl<12>(A); const uint32_t SS1 = rotl<7>(A12 + E + TJ); const uint32_t TT1 = FF1(A, B, C) + D + (SS1 ^ A12) + Wj; const uint32_t TT2 = GG1(E, F, G) + H + SS1 + Wi; B = rotl<9>(B); D = TT1; F = rotl<19>(F); H = P0(TT2); } inline uint32_t P1(uint32_t X) { return X ^ rotl<15>(X) ^ rotl<23>(X); } inline uint32_t SM3_E(uint32_t W0, uint32_t W7, uint32_t W13, uint32_t W3, uint32_t W10) { return P1(W0 ^ W7 ^ rotl<15>(W13)) ^ rotl<7>(W3) ^ W10; } } /* * SM3 Compression Function */ void SM3::compress_n(const uint8_t input[], size_t blocks) { uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3], E = m_digest[4], F = m_digest[5], G = m_digest[6], H = m_digest[7]; for(size_t i = 0; i != blocks; ++i) { uint32_t W00 = load_be(input, 0); uint32_t W01 = load_be(input, 1); uint32_t W02 = load_be(input, 2); uint32_t W03 = load_be(input, 3); uint32_t W04 = load_be(input, 4); uint32_t W05 = load_be(input, 5); uint32_t W06 = load_be(input, 6); uint32_t W07 = load_be(input, 7); uint32_t W08 = load_be(input, 8); uint32_t W09 = load_be(input, 9); uint32_t W10 = load_be(input, 10); uint32_t W11 = load_be(input, 11); uint32_t W12 = load_be(input, 12); uint32_t W13 = load_be(input, 13); uint32_t W14 = load_be(input, 14); uint32_t W15 = load_be(input, 15); R1(A, B, C, D, E, F, G, H, 0x79CC4519, W00, W00 ^ W04); W00 = SM3_E(W00, W07, W13, W03, W10); R1(D, A, B, C, H, E, F, G, 0xF3988A32, W01, W01 ^ W05); W01 = SM3_E(W01, W08, W14, W04, W11); R1(C, D, A, B, G, H, E, F, 0xE7311465, W02, W02 ^ W06); W02 = SM3_E(W02, W09, W15, W05, W12); R1(B, C, D, A, F, G, H, E, 0xCE6228CB, W03, W03 ^ W07); W03 = SM3_E(W03, W10, W00, W06, W13); R1(A, B, C, D, E, F, G, H, 0x9CC45197, W04, W04 ^ W08); W04 = SM3_E(W04, W11, W01, W07, W14); R1(D, A, B, C, H, E, F, G, 0x3988A32F, W05, W05 ^ W09); W05 = SM3_E(W05, W12, W02, W08, W15); R1(C, D, A, B, G, H, E, F, 0x7311465E, W06, W06 ^ W10); W06 = SM3_E(W06, W13, W03, W09, W00); R1(B, C, D, A, F, G, H, E, 0xE6228CBC, W07, W07 ^ W11); W07 = SM3_E(W07, W14, W04, W10, W01); R1(A, B, C, D, E, F, G, H, 0xCC451979, W08, W08 ^ W12); W08 = SM3_E(W08, W15, W05, W11, W02); R1(D, A, B, C, H, E, F, G, 0x988A32F3, W09, W09 ^ W13); W09 = SM3_E(W09, W00, W06, W12, W03); R1(C, D, A, B, G, H, E, F, 0x311465E7, W10, W10 ^ W14); W10 = SM3_E(W10, W01, W07, W13, W04); R1(B, C, D, A, F, G, H, E, 0x6228CBCE, W11, W11 ^ W15); W11 = SM3_E(W11, W02, W08, W14, W05); R1(A, B, C, D, E, F, G, H, 0xC451979C, W12, W12 ^ W00); W12 = SM3_E(W12, W03, W09, W15, W06); R1(D, A, B, C, H, E, F, G, 0x88A32F39, W13, W13 ^ W01); W13 = SM3_E(W13, W04, W10, W00, W07); R1(C, D, A, B, G, H, E, F, 0x11465E73, W14, W14 ^ W02); W14 = SM3_E(W14, W05, W11, W01, W08); R1(B, C, D, A, F, G, H, E, 0x228CBCE6, W15, W15 ^ W03); W15 = SM3_E(W15, W06, W12, W02, W09); R2(A, B, C, D, E, F, G, H, 0x9D8A7A87, W00, W00 ^ W04); W00 = SM3_E(W00, W07, W13, W03, W10); R2(D, A, B, C, H, E, F, G, 0x3B14F50F, W01, W01 ^ W05); W01 = SM3_E(W01, W08, W14, W04, W11); R2(C, D, A, B, G, H, E, F, 0x7629EA1E, W02, W02 ^ W06); W02 = SM3_E(W02, W09, W15, W05, W12); R2(B, C, D, A, F, G, H, E, 0xEC53D43C, W03, W03 ^ W07); W03 = SM3_E(W03, W10, W00, W06, W13); R2(A, B, C, D, E, F, G, H, 0xD8A7A879, W04, W04 ^ W08); W04 = SM3_E(W04, W11, W01, W07, W14); R2(D, A, B, C, H, E, F, G, 0xB14F50F3, W05, W05 ^ W09); W05 = SM3_E(W05, W12, W02, W08, W15); R2(C, D, A, B, G, H, E, F, 0x629EA1E7, W06, W06 ^ W10); W06 = SM3_E(W06, W13, W03, W09, W00); R2(B, C, D, A, F, G, H, E, 0xC53D43CE, W07, W07 ^ W11); W07 = SM3_E(W07, W14, W04, W10, W01); R2(A, B, C, D, E, F, G, H, 0x8A7A879D, W08, W08 ^ W12); W08 = SM3_E(W08, W15, W05, W11, W02); R2(D, A, B, C, H, E, F, G, 0x14F50F3B, W09, W09 ^ W13); W09 = SM3_E(W09, W00, W06, W12, W03); R2(C, D, A, B, G, H, E, F, 0x29EA1E76, W10, W10 ^ W14); W10 = SM3_E(W10, W01, W07, W13, W04); R2(B, C, D, A, F, G, H, E, 0x53D43CEC, W11, W11 ^ W15); W11 = SM3_E(W11, W02, W08, W14, W05); R2(A, B, C, D, E, F, G, H, 0xA7A879D8, W12, W12 ^ W00); W12 = SM3_E(W12, W03, W09, W15, W06); R2(D, A, B, C, H, E, F, G, 0x4F50F3B1, W13, W13 ^ W01); W13 = SM3_E(W13, W04, W10, W00, W07); R2(C, D, A, B, G, H, E, F, 0x9EA1E762, W14, W14 ^ W02); W14 = SM3_E(W14, W05, W11, W01, W08); R2(B, C, D, A, F, G, H, E, 0x3D43CEC5, W15, W15 ^ W03); W15 = SM3_E(W15, W06, W12, W02, W09); R2(A, B, C, D, E, F, G, H, 0x7A879D8A, W00, W00 ^ W04); W00 = SM3_E(W00, W07, W13, W03, W10); R2(D, A, B, C, H, E, F, G, 0xF50F3B14, W01, W01 ^ W05); W01 = SM3_E(W01, W08, W14, W04, W11); R2(C, D, A, B, G, H, E, F, 0xEA1E7629, W02, W02 ^ W06); W02 = SM3_E(W02, W09, W15, W05, W12); R2(B, C, D, A, F, G, H, E, 0xD43CEC53, W03, W03 ^ W07); W03 = SM3_E(W03, W10, W00, W06, W13); R2(A, B, C, D, E, F, G, H, 0xA879D8A7, W04, W04 ^ W08); W04 = SM3_E(W04, W11, W01, W07, W14); R2(D, A, B, C, H, E, F, G, 0x50F3B14F, W05, W05 ^ W09); W05 = SM3_E(W05, W12, W02, W08, W15); R2(C, D, A, B, G, H, E, F, 0xA1E7629E, W06, W06 ^ W10); W06 = SM3_E(W06, W13, W03, W09, W00); R2(B, C, D, A, F, G, H, E, 0x43CEC53D, W07, W07 ^ W11); W07 = SM3_E(W07, W14, W04, W10, W01); R2(A, B, C, D, E, F, G, H, 0x879D8A7A, W08, W08 ^ W12); W08 = SM3_E(W08, W15, W05, W11, W02); R2(D, A, B, C, H, E, F, G, 0x0F3B14F5, W09, W09 ^ W13); W09 = SM3_E(W09, W00, W06, W12, W03); R2(C, D, A, B, G, H, E, F, 0x1E7629EA, W10, W10 ^ W14); W10 = SM3_E(W10, W01, W07, W13, W04); R2(B, C, D, A, F, G, H, E, 0x3CEC53D4, W11, W11 ^ W15); W11 = SM3_E(W11, W02, W08, W14, W05); R2(A, B, C, D, E, F, G, H, 0x79D8A7A8, W12, W12 ^ W00); W12 = SM3_E(W12, W03, W09, W15, W06); R2(D, A, B, C, H, E, F, G, 0xF3B14F50, W13, W13 ^ W01); W13 = SM3_E(W13, W04, W10, W00, W07); R2(C, D, A, B, G, H, E, F, 0xE7629EA1, W14, W14 ^ W02); W14 = SM3_E(W14, W05, W11, W01, W08); R2(B, C, D, A, F, G, H, E, 0xCEC53D43, W15, W15 ^ W03); W15 = SM3_E(W15, W06, W12, W02, W09); R2(A, B, C, D, E, F, G, H, 0x9D8A7A87, W00, W00 ^ W04); W00 = SM3_E(W00, W07, W13, W03, W10); R2(D, A, B, C, H, E, F, G, 0x3B14F50F, W01, W01 ^ W05); W01 = SM3_E(W01, W08, W14, W04, W11); R2(C, D, A, B, G, H, E, F, 0x7629EA1E, W02, W02 ^ W06); W02 = SM3_E(W02, W09, W15, W05, W12); R2(B, C, D, A, F, G, H, E, 0xEC53D43C, W03, W03 ^ W07); W03 = SM3_E(W03, W10, W00, W06, W13); R2(A, B, C, D, E, F, G, H, 0xD8A7A879, W04, W04 ^ W08); R2(D, A, B, C, H, E, F, G, 0xB14F50F3, W05, W05 ^ W09); R2(C, D, A, B, G, H, E, F, 0x629EA1E7, W06, W06 ^ W10); R2(B, C, D, A, F, G, H, E, 0xC53D43CE, W07, W07 ^ W11); R2(A, B, C, D, E, F, G, H, 0x8A7A879D, W08, W08 ^ W12); R2(D, A, B, C, H, E, F, G, 0x14F50F3B, W09, W09 ^ W13); R2(C, D, A, B, G, H, E, F, 0x29EA1E76, W10, W10 ^ W14); R2(B, C, D, A, F, G, H, E, 0x53D43CEC, W11, W11 ^ W15); R2(A, B, C, D, E, F, G, H, 0xA7A879D8, W12, W12 ^ W00); R2(D, A, B, C, H, E, F, G, 0x4F50F3B1, W13, W13 ^ W01); R2(C, D, A, B, G, H, E, F, 0x9EA1E762, W14, W14 ^ W02); R2(B, C, D, A, F, G, H, E, 0x3D43CEC5, W15, W15 ^ W03); A = (m_digest[0] ^= A); B = (m_digest[1] ^= B); C = (m_digest[2] ^= C); D = (m_digest[3] ^= D); E = (m_digest[4] ^= E); F = (m_digest[5] ^= F); G = (m_digest[6] ^= G); H = (m_digest[7] ^= H); input += hash_block_size(); } } /* * Copy out the digest */ void SM3::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void SM3::clear() { MDx_HashFunction::clear(); std::copy(std::begin(SM3_IV), std::end(SM3_IV), m_digest.begin()); } } botan-2.4.0/src/lib/hash/sm3/sm3.h000066400000000000000000000017131322470703100164560ustar00rootroot00000000000000/* * SM3 * (C) 2017 Ribose Inc. * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SM3_H_ #define BOTAN_SM3_H_ #include namespace Botan { enum { SM3_BLOCK_BYTES = 64, SM3_DIGEST_BYTES = 32 }; /** * SM3 */ class BOTAN_PUBLIC_API(2,2) SM3 final : public MDx_HashFunction { public: std::string name() const override { return "SM3"; } size_t output_length() const override { return SM3_DIGEST_BYTES; } HashFunction* clone() const override { return new SM3; } std::unique_ptr copy_state() const override; void clear() override; SM3() : MDx_HashFunction(SM3_BLOCK_BYTES, true, true), m_digest(SM3_DIGEST_BYTES) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; /** * The digest value */ secure_vector m_digest; }; } #endif botan-2.4.0/src/lib/hash/streebog/000077500000000000000000000000001322470703100167115ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/streebog/info.txt000066400000000000000000000000521322470703100204020ustar00rootroot00000000000000 STREEBOG -> 20170623 botan-2.4.0/src/lib/hash/streebog/streebog.cpp000066400000000000000000000107241322470703100212330ustar00rootroot00000000000000/* * Streebog * (C) 2017 Ribose Inc. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { extern const uint64_t STREEBOG_Ax[8][256]; extern const uint64_t STREEBOG_C[12][8]; std::unique_ptr Streebog::copy_state() const { return std::unique_ptr(new Streebog(*this)); } namespace { static inline void addm(const uint8_t* m, uint64_t* h) { uint64_t carry = false; for(int i = 0; i < 8; i++) { const uint64_t m64 = load_le(m, i); const uint64_t hi = load_le(reinterpret_cast(h), i); const uint64_t t = hi + m64; const uint64_t overflow = (t < hi ? 1 : 0) | (t < m64 ? 1 : 0); store_le(t + carry, reinterpret_cast(&h[i])); carry = overflow; } } inline void lps(uint64_t* block) { uint8_t r[64]; std::memcpy(r, block, 64); for(int i = 0; i < 8; ++i) { block[i] = load_le(reinterpret_cast(&STREEBOG_Ax[0][r[i]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[1][r[i + 8]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[2][r[i + 16]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[3][r[i + 24]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[4][r[i + 32]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[5][r[i + 40]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[6][r[i + 48]]), 0) ^ load_le(reinterpret_cast(&STREEBOG_Ax[7][r[i + 56]]), 0); } } inline void e(uint64_t* K, const uint64_t* m) { uint64_t A[8]; uint64_t C[8]; copy_mem(A, K, 8); for(size_t i = 0; i != 8; ++i) { K[i] ^= m[i]; } for(size_t i = 0; i < 12; ++i) { lps(K); load_le(C, reinterpret_cast(&STREEBOG_C[i][0]), 8); for(size_t j = 0; j != 8; ++j) A[j] ^= C[j]; lps(A); for(size_t j = 0; j != 8; ++j) K[j] ^= A[j]; } } inline void g(uint64_t* h, const uint8_t* m, uint64_t N) { uint64_t hN[8]; // force N to little-endian store_le(N, reinterpret_cast(&N)); copy_mem(hN, h, 8); hN[0] ^= N; lps(hN); const uint64_t* m64 = reinterpret_cast(m); e(hN, m64); for(size_t i = 0; i != 8; ++i) { h[i] ^= hN[i] ^ m64[i]; } } } //namespace Streebog::Streebog(size_t output_bits) : m_output_bits(output_bits), m_count(0), m_position(0), m_buffer(64), m_h(8), m_S(8) { if(output_bits != 256 && output_bits != 512) throw Invalid_Argument("Streebog: Invalid output length " + std::to_string(output_bits)); clear(); } std::string Streebog::name() const { return "Streebog-" + std::to_string(m_output_bits); } /* * Clear memory of sensitive data */ void Streebog::clear() { m_count = 0; m_position = 0; zeroise(m_buffer); zeroise(m_S); const uint64_t fill = (m_output_bits == 512) ? 0 : 0x0101010101010101; std::fill(m_h.begin(), m_h.end(), fill); } /* * Update the hash */ void Streebog::add_data(const uint8_t input[], size_t length) { while(m_position + length >= 64) { buffer_insert(m_buffer, m_position, input, 64 - m_position); compress(m_buffer.data()); m_count += 512; input += (64 - m_position); length -= (64 - m_position); m_position = 0; } buffer_insert(m_buffer, m_position, input, length); m_position += length; } /* * Finalize a hash */ void Streebog::final_result(uint8_t output[]) { m_buffer[m_position++] = 0x01; if(m_position != m_buffer.size()) clear_mem(&m_buffer[m_position], m_buffer.size() - m_position); compress(m_buffer.data()); m_count += (m_position - 1) * 8; zeroise(m_buffer); store_le(m_count, m_buffer.data()); compress(m_buffer.data(), true); compress(reinterpret_cast(m_S.data()), true); std::memcpy(output, &m_h[8 - output_length() / 8], output_length()); clear(); } void Streebog::compress(const uint8_t input[], bool last_block) { g(m_h.data(), input, last_block ? 0ULL : m_count); if(!last_block) { addm(input, m_S.data()); } } } botan-2.4.0/src/lib/hash/streebog/streebog.h000066400000000000000000000026641322470703100207040ustar00rootroot00000000000000/* * Streebog * (C) 2017 Ribose Inc. * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STREEBOG_H_ #define BOTAN_STREEBOG_H_ #include namespace Botan { /** * Streebog (GOST R 34.11-2012) * RFC 6986 */ class BOTAN_PUBLIC_API(2,2) Streebog : public HashFunction { public: size_t output_length() const override { return m_output_bits / 8; } HashFunction* clone() const override { return new Streebog(m_output_bits); } void clear() override; std::string name() const override; size_t hash_block_size() const override { return 64; }; std::unique_ptr copy_state() const override; explicit Streebog(size_t output_bits); protected: void add_data(const uint8_t input[], size_t length) override; void final_result(uint8_t out[]) override; void compress(const uint8_t input[], bool lastblock = false); private: const size_t m_output_bits; uint64_t m_count; size_t m_position; secure_vector m_buffer; secure_vector m_h; secure_vector m_S; }; /** * Streebog-256 */ class BOTAN_PUBLIC_API(2,2) Streebog_256 final : public Streebog { public: Streebog_256() : Streebog(256) {} }; /** * Streebog-512 */ class BOTAN_PUBLIC_API(2,2) Streebog_512 final : public Streebog { public: Streebog_512() : Streebog(512) {} }; } #endif botan-2.4.0/src/lib/hash/streebog/streebog_precalc.cpp000066400000000000000000001552361322470703100227340ustar00rootroot00000000000000/* * Derived from: * https://github.com/degtyarevalexey/streebog * * Copyright (c) 2013, Alexey Degtyarev . * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include namespace Botan { extern const uint64_t STREEBOG_Ax[8][256] = { { 0xd01f715b5c7ef8e6ULL, 0x16fa240980778325ULL, 0xa8a42e857ee049c8ULL, 0x6ac1068fa186465bULL, 0x6e417bd7a2e9320bULL, 0x665c8167a437daabULL, 0x7666681aa89617f6ULL, 0x4b959163700bdcf5ULL, 0xf14be6b78df36248ULL, 0xc585bd689a625cffULL, 0x9557d7fca67d82cbULL, 0x89f0b969af6dd366ULL, 0xb0833d48749f6c35ULL, 0xa1998c23b1ecbc7cULL, 0x8d70c431ac02a736ULL, 0xd6dfbc2fd0a8b69eULL, 0x37aeb3e551fa198bULL, 0x0b7d128a40b5cf9cULL, 0x5a8f2008b5780cbcULL, 0xedec882284e333e5ULL, 0xd25fc177d3c7c2ceULL, 0x5e0f5d50b61778ecULL, 0x1d873683c0c24cb9ULL, 0xad040bcbb45d208cULL, 0x2f89a0285b853c76ULL, 0x5732fff6791b8d58ULL, 0x3e9311439ef6ec3fULL, 0xc9183a809fd3c00fULL, 0x83adf3f5260a01eeULL, 0xa6791941f4e8ef10ULL, 0x103ae97d0ca1cd5dULL, 0x2ce948121dee1b4aULL, 0x39738421dbf2bf53ULL, 0x093da2a6cf0cf5b4ULL, 0xcd9847d89cbcb45fULL, 0xf9561c078b2d8ae8ULL, 0x9c6a755a6971777fULL, 0xbc1ebaa0712ef0c5ULL, 0x72e61542abf963a6ULL, 0x78bb5fde229eb12eULL, 0x14ba94250fceb90dULL, 0x844d6697630e5282ULL, 0x98ea08026a1e032fULL, 0xf06bbea144217f5cULL, 0xdb6263d11ccb377aULL, 0x641c314b2b8ee083ULL, 0x320e96ab9b4770cfULL, 0x1ee7deb986a96b85ULL, 0xe96cf57a878c47b5ULL, 0xfdd6615f8842feb8ULL, 0xc83862965601dd1bULL, 0x2ea9f83e92572162ULL, 0xf876441142ff97fcULL, 0xeb2c455608357d9dULL, 0x5612a7e0b0c9904cULL, 0x6c01cbfb2d500823ULL, 0x4548a6a7fa037a2dULL, 0xabc4c6bf388b6ef4ULL, 0xbade77d4fdf8bebdULL, 0x799b07c8eb4cac3aULL, 0x0c9d87e805b19cf0ULL, 0xcb588aac106afa27ULL, 0xea0c1d40c1e76089ULL, 0x2869354a1e816f1aULL, 0xff96d17307fbc490ULL, 0x9f0a9d602f1a5043ULL, 0x96373fc6e016a5f7ULL, 0x5292dab8b3a6e41cULL, 0x9b8ae0382c752413ULL, 0x4f15ec3b7364a8a5ULL, 0x3fb349555724f12bULL, 0xc7c50d4415db66d7ULL, 0x92b7429ee379d1a7ULL, 0xd37f99611a15dfdaULL, 0x231427c05e34a086ULL, 0xa439a96d7b51d538ULL, 0xb403401077f01865ULL, 0xdda2aea5901d7902ULL, 0x0a5d4a9c8967d288ULL, 0xc265280adf660f93ULL, 0x8bb0094520d4e94eULL, 0x2a29856691385532ULL, 0x42a833c5bf072941ULL, 0x73c64d54622b7eb2ULL, 0x07e095624504536cULL, 0x8a905153e906f45aULL, 0x6f6123c16b3b2f1fULL, 0xc6e55552dc097bc3ULL, 0x4468feb133d16739ULL, 0xe211e7f0c7398829ULL, 0xa2f96419f7879b40ULL, 0x19074bdbc3ad38e9ULL, 0xf4ebc3f9474e0b0cULL, 0x43886bd376d53455ULL, 0xd8028beb5aa01046ULL, 0x51f23282f5cdc320ULL, 0xe7b1c2be0d84e16dULL, 0x081dfab006dee8a0ULL, 0x3b33340d544b857bULL, 0x7f5bcabc679ae242ULL, 0x0edd37c48a08a6d8ULL, 0x81ed43d9a9b33bc6ULL, 0xb1a3655ebd4d7121ULL, 0x69a1eeb5e7ed6167ULL, 0xf6ab73d5c8f73124ULL, 0x1a67a3e185c61fd5ULL, 0x2dc91004d43c065eULL, 0x0240b02c8fb93a28ULL, 0x90f7f2b26cc0eb8fULL, 0x3cd3a16f114fd617ULL, 0xaae49ea9f15973e0ULL, 0x06c0cd748cd64e78ULL, 0xda423bc7d5192a6eULL, 0xc345701c16b41287ULL, 0x6d2193ede4821537ULL, 0xfcf639494190e3acULL, 0x7c3b228621f1c57eULL, 0xfb16ac2b0494b0c0ULL, 0xbf7e529a3745d7f9ULL, 0x6881b6a32e3f7c73ULL, 0xca78d2bad9b8e733ULL, 0xbbfe2fc2342aa3a9ULL, 0x0dbddffecc6381e4ULL, 0x70a6a56e2440598eULL, 0xe4d12a844befc651ULL, 0x8c509c2765d0ba22ULL, 0xee8c6018c28814d9ULL, 0x17da7c1f49a59e31ULL, 0x609c4c1328e194d3ULL, 0xb3e3d57232f44b09ULL, 0x91d7aaa4a512f69bULL, 0x0ffd6fd243dabbccULL, 0x50d26a943c1fde34ULL, 0x6be15e9968545b4fULL, 0x94778fea6faf9fdfULL, 0x2b09dd7058ea4826ULL, 0x677cd9716de5c7bfULL, 0x49d5214fffb2e6ddULL, 0x0360e83a466b273cULL, 0x1fc786af4f7b7691ULL, 0xa0b9d435783ea168ULL, 0xd49f0c035f118cb6ULL, 0x01205816c9d21d14ULL, 0xac2453dd7d8f3d98ULL, 0x545217cc3f70aa64ULL, 0x26b4028e9489c9c2ULL, 0xdec2469fd6765e3eULL, 0x04807d58036f7450ULL, 0xe5f17292823ddb45ULL, 0xf30b569b024a5860ULL, 0x62dcfc3fa758aefbULL, 0xe84cad6c4e5e5aa1ULL, 0xccb81fce556ea94bULL, 0x53b282ae7a74f908ULL, 0x1b47fbf74c1402c1ULL, 0x368eebf39828049fULL, 0x7afbeff2ad278b06ULL, 0xbe5e0a8cfe97caedULL, 0xcfd8f7f413058e77ULL, 0xf78b2bc301252c30ULL, 0x4d555c17fcdd928dULL, 0x5f2f05467fc565f8ULL, 0x24f4b2a21b30f3eaULL, 0x860dd6bbecb768aaULL, 0x4c750401350f8f99ULL, 0x0000000000000000ULL, 0xecccd0344d312ef1ULL, 0xb5231806be220571ULL, 0xc105c030990d28afULL, 0x653c695de25cfd97ULL, 0x159acc33c61ca419ULL, 0xb89ec7f872418495ULL, 0xa9847693b73254dcULL, 0x58cf90243ac13694ULL, 0x59efc832f3132b80ULL, 0x5c4fed7c39ae42c4ULL, 0x828dabe3efd81cfaULL, 0xd13f294d95ace5f2ULL, 0x7d1b7a90e823d86aULL, 0xb643f03cf849224dULL, 0x3df3f979d89dcb03ULL, 0x7426d836272f2ddeULL, 0xdfe21e891fa4432aULL, 0x3a136c1b9d99986fULL, 0xfa36f43dcd46add4ULL, 0xc025982650df35bbULL, 0x856d3e81aadc4f96ULL, 0xc4a5e57e53b041ebULL, 0x4708168b75ba4005ULL, 0xaf44bbe73be41aa4ULL, 0x971767d029c4b8e3ULL, 0xb9be9feebb939981ULL, 0x215497ecd18d9aaeULL, 0x316e7e91dd2c57f3ULL, 0xcef8afe2dad79363ULL, 0x3853dc371220a247ULL, 0x35ee03c9de4323a3ULL, 0xe6919aa8c456fc79ULL, 0xe05157dc4880b201ULL, 0x7bdbb7e464f59612ULL, 0x127a59518318f775ULL, 0x332ecebd52956ddbULL, 0x8f30741d23bb9d1eULL, 0xd922d3fd93720d52ULL, 0x7746300c61440ae2ULL, 0x25d4eab4d2e2eefeULL, 0x75068020eefd30caULL, 0x135a01474acaea61ULL, 0x304e268714fe4ae7ULL, 0xa519f17bb283c82cULL, 0xdc82f6b359cf6416ULL, 0x5baf781e7caa11a8ULL, 0xb2c38d64fb26561dULL, 0x34ce5bdf17913eb7ULL, 0x5d6fb56af07c5fd0ULL, 0x182713cd0a7f25fdULL, 0x9e2ac576e6c84d57ULL, 0x9aaab82ee5a73907ULL, 0xa3d93c0f3e558654ULL, 0x7e7b92aaae48ff56ULL, 0x872d8ead256575beULL, 0x41c8dbfff96c0e7dULL, 0x99ca5014a3cc1e3bULL, 0x40e883e930be1369ULL, 0x1ca76e95091051adULL, 0x4e35b42dbab6b5b1ULL, 0x05a0254ecabd6944ULL, 0xe1710fca8152af15ULL, 0xf22b0e8dcb984574ULL, 0xb763a82a319b3f59ULL, 0x63fca4296e8ab3efULL, 0x9d4a2d4ca0a36a6bULL, 0xe331bfe60eeb953dULL, 0xd5bf541596c391a2ULL, 0xf5cb9bef8e9c1618ULL, 0x46284e9dbc685d11ULL, 0x2074cffa185f87baULL, 0xbd3ee2b6b8fcedd1ULL, 0xae64e3f1f23607b0ULL, 0xfeb68965ce29d984ULL, 0x55724fdaf6a2b770ULL, 0x29496d5cd753720eULL, 0xa75941573d3af204ULL, 0x8e102c0bea69800aULL, 0x111ab16bc573d049ULL, 0xd7ffe439197aab8aULL, 0xefac380e0b5a09cdULL, 0x48f579593660fbc9ULL, 0x22347fd697e6bd92ULL, 0x61bc1405e13389c7ULL, 0x4ab5c975b9d9c1e1ULL, 0x80cd1bcf606126d2ULL, 0x7186fd78ed92449aULL, 0x93971a882aabccb3ULL, 0x88d0e17f66bfce72ULL, 0x27945a985d5bd4d6ULL }, { 0xde553f8c05a811c8ULL, 0x1906b59631b4f565ULL, 0x436e70d6b1964ff7ULL, 0x36d343cb8b1e9d85ULL, 0x843dfacc858aab5aULL, 0xfdfc95c299bfc7f9ULL, 0x0f634bdea1d51fa2ULL, 0x6d458b3b76efb3cdULL, 0x85c3f77cf8593f80ULL, 0x3c91315fbe737cb2ULL, 0x2148b03366ace398ULL, 0x18f8b8264c6761bfULL, 0xc830c1c495c9fb0fULL, 0x981a76102086a0aaULL, 0xaa16012142f35760ULL, 0x35cc54060c763cf6ULL, 0x42907d66cc45db2dULL, 0x8203d44b965af4bcULL, 0x3d6f3cefc3a0e868ULL, 0xbc73ff69d292bda7ULL, 0x8722ed0102e20a29ULL, 0x8f8185e8cd34deb7ULL, 0x9b0561dda7ee01d9ULL, 0x5335a0193227fad6ULL, 0xc9cecc74e81a6fd5ULL, 0x54f5832e5c2431eaULL, 0x99e47ba05d553470ULL, 0xf7bee756acd226ceULL, 0x384e05a5571816fdULL, 0xd1367452a47d0e6aULL, 0xf29fde1c386ad85bULL, 0x320c77316275f7caULL, 0xd0c879e2d9ae9ab0ULL, 0xdb7406c69110ef5dULL, 0x45505e51a2461011ULL, 0xfc029872e46c5323ULL, 0xfa3cb6f5f7bc0cc5ULL, 0x031f17cd8768a173ULL, 0xbd8df2d9af41297dULL, 0x9d3b4f5ab43e5e3fULL, 0x4071671b36feee84ULL, 0x716207e7d3e3b83dULL, 0x48d20ff2f9283a1aULL, 0x27769eb4757cbc7eULL, 0x5c56ebc793f2e574ULL, 0xa48b474f9ef5dc18ULL, 0x52cbada94ff46e0cULL, 0x60c7da982d8199c6ULL, 0x0e9d466edc068b78ULL, 0x4eec2175eaf865fcULL, 0x550b8e9e21f7a530ULL, 0x6b7ba5bc653fec2bULL, 0x5eb7f1ba6949d0ddULL, 0x57ea94e3db4c9099ULL, 0xf640eae6d101b214ULL, 0xdd4a284182c0b0bbULL, 0xff1d8fbf6304f250ULL, 0xb8accb933bf9d7e8ULL, 0xe8867c478eb68c4dULL, 0x3f8e2692391bddc1ULL, 0xcb2fd60912a15a7cULL, 0xaec935dbab983d2fULL, 0xf55ffd2b56691367ULL, 0x80e2ce366ce1c115ULL, 0x179bf3f8edb27e1dULL, 0x01fe0db07dd394daULL, 0xda8a0b76ecc37b87ULL, 0x44ae53e1df9584cbULL, 0xb310b4b77347a205ULL, 0xdfab323c787b8512ULL, 0x3b511268d070b78eULL, 0x65e6e3d2b9396753ULL, 0x6864b271e2574d58ULL, 0x259784c98fc789d7ULL, 0x02e11a7dfabb35a9ULL, 0x8841a6dfa337158bULL, 0x7ade78c39b5dcdd0ULL, 0xb7cf804d9a2cc84aULL, 0x20b6bd831b7f7742ULL, 0x75bd331d3a88d272ULL, 0x418f6aab4b2d7a5eULL, 0xd9951cbb6babdaf4ULL, 0xb6318dfde7ff5c90ULL, 0x1f389b112264aa83ULL, 0x492c024284fbaec0ULL, 0xe33a0363c608f9a0ULL, 0x2688930408af28a4ULL, 0xc7538a1a341ce4adULL, 0x5da8e677ee2171aeULL, 0x8c9e92254a5c7fc4ULL, 0x63d8cd55aae938b5ULL, 0x29ebd8daa97a3706ULL, 0x959827b37be88aa1ULL, 0x1484e4356adadf6eULL, 0xa7945082199d7d6bULL, 0xbf6ce8a455fa1cd4ULL, 0x9cc542eac9edcae5ULL, 0x79c16f0e1c356ca3ULL, 0x89bfab6fdee48151ULL, 0xd4174d1830c5f0ffULL, 0x9258048415eb419dULL, 0x6139d72850520d1cULL, 0x6a85a80c18ec78f1ULL, 0xcd11f88e0171059aULL, 0xcceff53e7ca29140ULL, 0xd229639f2315af19ULL, 0x90b91ef9ef507434ULL, 0x5977d28d074a1be1ULL, 0x311360fce51d56b9ULL, 0xc093a92d5a1f2f91ULL, 0x1a19a25bb6dc5416ULL, 0xeb996b8a09de2d3eULL, 0xfee3820f1ed7668aULL, 0xd7085ad5b7ad518cULL, 0x7fff41890fe53345ULL, 0xec5948bd67dde602ULL, 0x2fd5f65dbaaa68e0ULL, 0xa5754affe32648c2ULL, 0xf8ddac880d07396cULL, 0x6fa491468c548664ULL, 0x0c7c5c1326bdbed1ULL, 0x4a33158f03930fb3ULL, 0x699abfc19f84d982ULL, 0xe4fa2054a80b329cULL, 0x6707f9af438252faULL, 0x08a368e9cfd6d49eULL, 0x47b1442c58fd25b8ULL, 0xbbb3dc5ebc91769bULL, 0x1665fe489061eac7ULL, 0x33f27a811fa66310ULL, 0x93a609346838d547ULL, 0x30ed6d4c98cec263ULL, 0x1dd9816cd8df9f2aULL, 0x94662a03063b1e7bULL, 0x83fdd9fbeb896066ULL, 0x7b207573e68e590aULL, 0x5f49fc0a149a4407ULL, 0x343259b671a5a82cULL, 0xfbc2bb458a6f981fULL, 0xc272b350a0a41a38ULL, 0x3aaf1fd8ada32354ULL, 0x6cbb868b0b3c2717ULL, 0xa2b569c88d2583feULL, 0xf180c9d1bf027928ULL, 0xaf37386bd64ba9f5ULL, 0x12bacab2790a8088ULL, 0x4c0d3b0810435055ULL, 0xb2eeb9070e9436dfULL, 0xc5b29067cea7d104ULL, 0xdcb425f1ff132461ULL, 0x4f122cc5972bf126ULL, 0xac282fa651230886ULL, 0xe7e537992f6393efULL, 0xe61b3a2952b00735ULL, 0x709c0a57ae302ce7ULL, 0xe02514ae416058d3ULL, 0xc44c9dd7b37445deULL, 0x5a68c5408022ba92ULL, 0x1c278cdca50c0bf0ULL, 0x6e5a9cf6f18712beULL, 0x86dce0b17f319ef3ULL, 0x2d34ec2040115d49ULL, 0x4bcd183f7e409b69ULL, 0x2815d56ad4a9a3dcULL, 0x24698979f2141d0dULL, 0x0000000000000000ULL, 0x1ec696a15fb73e59ULL, 0xd86b110b16784e2eULL, 0x8e7f8858b0e74a6dULL, 0x063e2e8713d05fe6ULL, 0xe2c40ed3bbdb6d7aULL, 0xb1f1aeca89fc97acULL, 0xe1db191e3cb3cc09ULL, 0x6418ee62c4eaf389ULL, 0xc6ad87aa49cf7077ULL, 0xd6f65765ca7ec556ULL, 0x9afb6c6dda3d9503ULL, 0x7ce05644888d9236ULL, 0x8d609f95378feb1eULL, 0x23a9aa4e9c17d631ULL, 0x6226c0e5d73aac6fULL, 0x56149953a69f0443ULL, 0xeeb852c09d66d3abULL, 0x2b0ac2a753c102afULL, 0x07c023376e03cb3cULL, 0x2ccae1903dc2c993ULL, 0xd3d76e2f5ec63bc3ULL, 0x9e2458973356ff4cULL, 0xa66a5d32644ee9b1ULL, 0x0a427294356de137ULL, 0x783f62be61e6f879ULL, 0x1344c70204d91452ULL, 0x5b96c8f0fdf12e48ULL, 0xa90916ecc59bf613ULL, 0xbe92e5142829880eULL, 0x727d102a548b194eULL, 0x1be7afebcb0fc0ccULL, 0x3e702b2244c8491bULL, 0xd5e940a84d166425ULL, 0x66f9f41f3e51c620ULL, 0xabe80c913f20c3baULL, 0xf07ec461c2d1edf2ULL, 0xf361d3ac45b94c81ULL, 0x0521394a94b8fe95ULL, 0xadd622162cf09c5cULL, 0xe97871f7f3651897ULL, 0xf4a1f09b2bba87bdULL, 0x095d6559b2054044ULL, 0x0bbc7f2448be75edULL, 0x2af4cf172e129675ULL, 0x157ae98517094bb4ULL, 0x9fda55274e856b96ULL, 0x914713499283e0eeULL, 0xb952c623462a4332ULL, 0x74433ead475b46a8ULL, 0x8b5eb112245fb4f8ULL, 0xa34b6478f0f61724ULL, 0x11a5dd7ffe6221fbULL, 0xc16da49d27ccbb4bULL, 0x76a224d0bde07301ULL, 0x8aa0bca2598c2022ULL, 0x4df336b86d90c48fULL, 0xea67663a740db9e4ULL, 0xef465f70e0b54771ULL, 0x39b008152acb8227ULL, 0x7d1e5bf4f55e06ecULL, 0x105bd0cf83b1b521ULL, 0x775c2960c033e7dbULL, 0x7e014c397236a79fULL, 0x811cc386113255cfULL, 0xeda7450d1a0e72d8ULL, 0x5889df3d7a998f3bULL, 0x2e2bfbedc779fc3aULL, 0xce0eef438619a4e9ULL, 0x372d4e7bf6cd095fULL, 0x04df34fae96b6a4fULL, 0xf923a13870d4adb6ULL, 0xa1aa7e050a4d228dULL, 0xa8f71b5cb84862c9ULL, 0xb52e9a306097fde3ULL, 0x0d8251a35b6e2a0bULL, 0x2257a7fee1c442ebULL, 0x73831d9a29588d94ULL, 0x51d4ba64c89ccf7fULL, 0x502ab7d4b54f5ba5ULL, 0x97793dce8153bf08ULL, 0xe5042de4d5d8a646ULL, 0x9687307efc802bd2ULL, 0xa05473b5779eb657ULL, 0xb4d097801d446939ULL, 0xcff0e2f3fbca3033ULL, 0xc38cbee0dd778ee2ULL, 0x464f499c252eb162ULL, 0xcad1dbb96f72cea6ULL, 0xba4dd1eec142e241ULL, 0xb00fa37af42f0376ULL }, { 0xcce4cd3aa968b245ULL, 0x089d5484e80b7fafULL, 0x638246c1b3548304ULL, 0xd2fe0ec8c2355492ULL, 0xa7fbdf7ff2374eeeULL, 0x4df1600c92337a16ULL, 0x84e503ea523b12fbULL, 0x0790bbfd53ab0c4aULL, 0x198a780f38f6ea9dULL, 0x2ab30c8f55ec48cbULL, 0xe0f7fed6b2c49db5ULL, 0xb6ecf3f422cadbdcULL, 0x409c9a541358df11ULL, 0xd3ce8a56dfde3fe3ULL, 0xc3e9224312c8c1a0ULL, 0x0d6dfa58816ba507ULL, 0xddf3e1b179952777ULL, 0x04c02a42748bb1d9ULL, 0x94c2abff9f2decb8ULL, 0x4f91752da8f8acf4ULL, 0x78682befb169bf7bULL, 0xe1c77a48af2ff6c4ULL, 0x0c5d7ec69c80ce76ULL, 0x4cc1e4928fd81167ULL, 0xfeed3d24d9997b62ULL, 0x518bb6dfc3a54a23ULL, 0x6dbf2d26151f9b90ULL, 0xb5bc624b05ea664fULL, 0xe86aaa525acfe21aULL, 0x4801ced0fb53a0beULL, 0xc91463e6c00868edULL, 0x1027a815cd16fe43ULL, 0xf67069a0319204cdULL, 0xb04ccc976c8abce7ULL, 0xc0b9b3fc35e87c33ULL, 0xf380c77c58f2de65ULL, 0x50bb3241de4e2152ULL, 0xdf93f490435ef195ULL, 0xf1e0d25d62390887ULL, 0xaf668bfb1a3c3141ULL, 0xbc11b251f00a7291ULL, 0x73a5eed47e427d47ULL, 0x25bee3f6ee4c3b2eULL, 0x43cc0beb34786282ULL, 0xc824e778dde3039cULL, 0xf97d86d98a327728ULL, 0xf2b043e24519b514ULL, 0xe297ebf7880f4b57ULL, 0x3a94a49a98fab688ULL, 0x868516cb68f0c419ULL, 0xeffa11af0964ee50ULL, 0xa4ab4ec0d517f37dULL, 0xa9c6b498547c567aULL, 0x8e18424f80fbbbb6ULL, 0x0bcdc53bcf2bc23cULL, 0x137739aaea3643d0ULL, 0x2c1333ec1bac2ff0ULL, 0x8d48d3f0a7db0625ULL, 0x1e1ac3f26b5de6d7ULL, 0xf520f81f16b2b95eULL, 0x9f0f6ec450062e84ULL, 0x0130849e1deb6b71ULL, 0xd45e31ab8c7533a9ULL, 0x652279a2fd14e43fULL, 0x3209f01e70f1c927ULL, 0xbe71a770cac1a473ULL, 0x0e3d6be7a64b1894ULL, 0x7ec8148cff29d840ULL, 0xcb7476c7fac3be0fULL, 0x72956a4a63a91636ULL, 0x37f95ec21991138fULL, 0x9e3fea5a4ded45f5ULL, 0x7b38ba50964902e8ULL, 0x222e580bbde73764ULL, 0x61e253e0899f55e6ULL, 0xfc8d2805e352ad80ULL, 0x35994be3235ac56dULL, 0x09add01af5e014deULL, 0x5e8659a6780539c6ULL, 0xb17c48097161d796ULL, 0x026015213acbd6e2ULL, 0xd1ae9f77e515e901ULL, 0xb7dc776a3f21b0adULL, 0xaba6a1b96eb78098ULL, 0x9bcf4486248d9f5dULL, 0x582666c536455efdULL, 0xfdbdac9bfeb9c6f1ULL, 0xc47999be4163cdeaULL, 0x765540081722a7efULL, 0x3e548ed8ec710751ULL, 0x3d041f67cb51bac2ULL, 0x7958af71ac82d40aULL, 0x36c9da5c047a78feULL, 0xed9a048e33af38b2ULL, 0x26ee7249c96c86bdULL, 0x900281bdeba65d61ULL, 0x11172c8bd0fd9532ULL, 0xea0abf73600434f8ULL, 0x42fc8f75299309f3ULL, 0x34a9cf7d3eb1ae1cULL, 0x2b838811480723baULL, 0x5ce64c8742ceef24ULL, 0x1adae9b01fd6570eULL, 0x3c349bf9d6bad1b3ULL, 0x82453c891c7b75c0ULL, 0x97923a40b80d512bULL, 0x4a61dbf1c198765cULL, 0xb48ce6d518010d3eULL, 0xcfb45c858e480fd6ULL, 0xd933cbf30d1e96aeULL, 0xd70ea014ab558e3aULL, 0xc189376228031742ULL, 0x9262949cd16d8b83ULL, 0xeb3a3bed7def5f89ULL, 0x49314a4ee6b8cbcfULL, 0xdcc3652f647e4c06ULL, 0xda635a4c2a3e2b3dULL, 0x470c21a940f3d35bULL, 0x315961a157d174b4ULL, 0x6672e81dda3459acULL, 0x5b76f77a1165e36eULL, 0x445cb01667d36ec8ULL, 0xc5491d205c88a69bULL, 0x456c34887a3805b9ULL, 0xffddb9bac4721013ULL, 0x99af51a71e4649bfULL, 0xa15be01cbc7729d5ULL, 0x52db2760e485f7b0ULL, 0x8c78576eba306d54ULL, 0xae560f6507d75a30ULL, 0x95f22f6182c687c9ULL, 0x71c5fbf54489aba5ULL, 0xca44f259e728d57eULL, 0x88b87d2ccebbdc8dULL, 0xbab18d32be4a15aaULL, 0x8be8ec93e99b611eULL, 0x17b713e89ebdf209ULL, 0xb31c5d284baa0174ULL, 0xeeca9531148f8521ULL, 0xb8d198138481c348ULL, 0x8988f9b2d350b7fcULL, 0xb9e11c8d996aa839ULL, 0x5a4673e40c8e881fULL, 0x1687977683569978ULL, 0xbf4123eed72acf02ULL, 0x4ea1f1b3b513c785ULL, 0xe767452be16f91ffULL, 0x7505d1b730021a7cULL, 0xa59bca5ec8fc980cULL, 0xad069eda20f7e7a3ULL, 0x38f4b1bba231606aULL, 0x60d2d77e94743e97ULL, 0x9affc0183966f42cULL, 0x248e6768f3a7505fULL, 0xcdd449a4b483d934ULL, 0x87b59255751baf68ULL, 0x1bea6d2e023d3c7fULL, 0x6b1f12455b5ffcabULL, 0x743555292de9710dULL, 0xd8034f6d10f5fddfULL, 0xc6198c9f7ba81b08ULL, 0xbb8109aca3a17edbULL, 0xfa2d1766ad12cabbULL, 0xc729080166437079ULL, 0x9c5fff7b77269317ULL, 0x0000000000000000ULL, 0x15d706c9a47624ebULL, 0x6fdf38072fd44d72ULL, 0x5fb6dd3865ee52b7ULL, 0xa33bf53d86bcff37ULL, 0xe657c1b5fc84fa8eULL, 0xaa962527735cebe9ULL, 0x39c43525bfda0b1bULL, 0x204e4d2a872ce186ULL, 0x7a083ece8ba26999ULL, 0x554b9c9db72efbfaULL, 0xb22cd9b656416a05ULL, 0x96a2bedea5e63a5aULL, 0x802529a826b0a322ULL, 0x8115ad363b5bc853ULL, 0x8375b81701901eb1ULL, 0x3069e53f4a3a1fc5ULL, 0xbd2136cfede119e0ULL, 0x18bafc91251d81ecULL, 0x1d4a524d4c7d5b44ULL, 0x05f0aedc6960daa8ULL, 0x29e39d3072ccf558ULL, 0x70f57f6b5962c0d4ULL, 0x989fd53903ad22ceULL, 0xf84d024797d91c59ULL, 0x547b1803aac5908bULL, 0xf0d056c37fd263f6ULL, 0xd56eb535919e58d8ULL, 0x1c7ad6d351963035ULL, 0x2e7326cd2167f912ULL, 0xac361a443d1c8cd2ULL, 0x697f076461942a49ULL, 0x4b515f6fdc731d2dULL, 0x8ad8680df4700a6fULL, 0x41ac1eca0eb3b460ULL, 0x7d988533d80965d3ULL, 0xa8f6300649973d0bULL, 0x7765c4960ac9cc9eULL, 0x7ca801adc5e20ea2ULL, 0xdea3700e5eb59ae4ULL, 0xa06b6482a19c42a4ULL, 0x6a2f96db46b497daULL, 0x27def6d7d487edccULL, 0x463ca5375d18b82aULL, 0xa6cb5be1efdc259fULL, 0x53eba3fef96e9cc1ULL, 0xce84d81b93a364a7ULL, 0xf4107c810b59d22fULL, 0x333974806d1aa256ULL, 0x0f0def79bba073e5ULL, 0x231edc95a00c5c15ULL, 0xe437d494c64f2c6cULL, 0x91320523f64d3610ULL, 0x67426c83c7df32ddULL, 0x6eefbc99323f2603ULL, 0x9d6f7be56acdf866ULL, 0x5916e25b2bae358cULL, 0x7ff89012e2c2b331ULL, 0x035091bf2720bd93ULL, 0x561b0d22900e4669ULL, 0x28d319ae6f279e29ULL, 0x2f43a2533c8c9263ULL, 0xd09e1be9f8fe8270ULL, 0xf740ed3e2c796fbcULL, 0xdb53ded237d5404cULL, 0x62b2c25faebfe875ULL, 0x0afd41a5d2c0a94dULL, 0x6412fd3ce0ff8f4eULL, 0xe3a76f6995e42026ULL, 0x6c8fa9b808f4f0e1ULL, 0xc2d9a6dd0f23aad1ULL, 0x8f28c6d19d10d0c7ULL, 0x85d587744fd0798aULL, 0xa20b71a39b579446ULL, 0x684f83fa7c7f4138ULL, 0xe507500adba4471dULL, 0x3f640a46f19a6c20ULL, 0x1247bd34f7dd28a1ULL, 0x2d23b77206474481ULL, 0x93521002cc86e0f2ULL, 0x572b89bc8de52d18ULL, 0xfb1d93f8b0f9a1caULL, 0xe95a2ecc4724896bULL, 0x3ba420048511ddf9ULL, 0xd63e248ab6bee54bULL, 0x5dd6c8195f258455ULL, 0x06a03f634e40673bULL, 0x1f2a476c76b68da6ULL, 0x217ec9b49ac78af7ULL, 0xecaa80102e4453c3ULL, 0x14e78257b99d4f9aULL }, { 0x20329b2cc87bba05ULL, 0x4f5eb6f86546a531ULL, 0xd4f44775f751b6b1ULL, 0x8266a47b850dfa8bULL, 0xbb986aa15a6ca985ULL, 0xc979eb08f9ae0f99ULL, 0x2da6f447a2375ea1ULL, 0x1e74275dcd7d8576ULL, 0xbc20180a800bc5f8ULL, 0xb4a2f701b2dc65beULL, 0xe726946f981b6d66ULL, 0x48e6c453bf21c94cULL, 0x42cad9930f0a4195ULL, 0xefa47b64aacccd20ULL, 0x71180a8960409a42ULL, 0x8bb3329bf6a44e0cULL, 0xd34c35de2d36daccULL, 0xa92f5b7cbc23dc96ULL, 0xb31a85aa68bb09c3ULL, 0x13e04836a73161d2ULL, 0xb24dfc4129c51d02ULL, 0x8ae44b70b7da5acdULL, 0xe671ed84d96579a7ULL, 0xa4bb3417d66f3832ULL, 0x4572ab38d56d2de8ULL, 0xb1b47761ea47215cULL, 0xe81c09cf70aba15dULL, 0xffbdb872ce7f90acULL, 0xa8782297fd5dc857ULL, 0x0d946f6b6a4ce4a4ULL, 0xe4df1f4f5b995138ULL, 0x9ebc71edca8c5762ULL, 0x0a2c1dc0b02b88d9ULL, 0x3b503c115d9d7b91ULL, 0xc64376a8111ec3a2ULL, 0xcec199a323c963e4ULL, 0xdc76a87ec58616f7ULL, 0x09d596e073a9b487ULL, 0x14583a9d7d560dafULL, 0xf4c6dc593f2a0cb4ULL, 0xdd21d19584f80236ULL, 0x4a4836983ddde1d3ULL, 0xe58866a41ae745f9ULL, 0xf591a5b27e541875ULL, 0x891dc05074586693ULL, 0x5b068c651810a89eULL, 0xa30346bc0c08544fULL, 0x3dbf3751c684032dULL, 0x2a1e86ec785032dcULL, 0xf73f5779fca830eaULL, 0xb60c05ca30204d21ULL, 0x0cc316802b32f065ULL, 0x8770241bdd96be69ULL, 0xb861e18199ee95dbULL, 0xf805cad91418fcd1ULL, 0x29e70dccbbd20e82ULL, 0xc7140f435060d763ULL, 0x0f3a9da0e8b0cc3bULL, 0xa2543f574d76408eULL, 0xbd7761e1c175d139ULL, 0x4b1f4f737ca3f512ULL, 0x6dc2df1f2fc137abULL, 0xf1d05c3967b14856ULL, 0xa742bf3715ed046cULL, 0x654030141d1697edULL, 0x07b872abda676c7dULL, 0x3ce84eba87fa17ecULL, 0xc1fb0403cb79afdfULL, 0x3e46bc7105063f73ULL, 0x278ae987121cd678ULL, 0xa1adb4778ef47cd0ULL, 0x26dd906c5362c2b9ULL, 0x05168060589b44e2ULL, 0xfbfc41f9d79ac08fULL, 0x0e6de44ba9ced8faULL, 0x9feb08068bf243a3ULL, 0x7b341749d06b129bULL, 0x229c69e74a87929aULL, 0xe09ee6c4427c011bULL, 0x5692e30e725c4c3aULL, 0xda99a33e5e9f6e4bULL, 0x353dd85af453a36bULL, 0x25241b4c90e0fee7ULL, 0x5de987258309d022ULL, 0xe230140fc0802984ULL, 0x93281e86a0c0b3c6ULL, 0xf229d719a4337408ULL, 0x6f6c2dd4ad3d1f34ULL, 0x8ea5b2fbae3f0aeeULL, 0x8331dd90c473ee4aULL, 0x346aa1b1b52db7aaULL, 0xdf8f235e06042aa9ULL, 0xcc6f6b68a1354b7bULL, 0x6c95a6f46ebf236aULL, 0x52d31a856bb91c19ULL, 0x1a35ded6d498d555ULL, 0xf37eaef2e54d60c9ULL, 0x72e181a9a3c2a61cULL, 0x98537aad51952fdeULL, 0x16f6c856ffaa2530ULL, 0xd960281e9d1d5215ULL, 0x3a0745fa1ce36f50ULL, 0x0b7b642bf1559c18ULL, 0x59a87eae9aec8001ULL, 0x5e100c05408bec7cULL, 0x0441f98b19e55023ULL, 0xd70dcc5534d38aefULL, 0x927f676de1bea707ULL, 0x9769e70db925e3e5ULL, 0x7a636ea29115065aULL, 0x468b201816ef11b6ULL, 0xab81a9b73edff409ULL, 0xc0ac7de88a07bb1eULL, 0x1f235eb68c0391b7ULL, 0x6056b074458dd30fULL, 0xbe8eeac102f7ed67ULL, 0xcd381283e04b5fbaULL, 0x5cbefecec277c4e3ULL, 0xd21b4c356c48ce0dULL, 0x1019c31664b35d8cULL, 0x247362a7d19eea26ULL, 0xebe582efb3299d03ULL, 0x02aef2cb82fc289fULL, 0x86275df09ce8aaa8ULL, 0x28b07427faac1a43ULL, 0x38a9b7319e1f47cfULL, 0xc82e92e3b8d01b58ULL, 0x06ef0b409b1978bcULL, 0x62f842bfc771fb90ULL, 0x9904034610eb3b1fULL, 0xded85ab5477a3e68ULL, 0x90d195a663428f98ULL, 0x5384636e2ac708d8ULL, 0xcbd719c37b522706ULL, 0xae9729d76644b0ebULL, 0x7c8c65e20a0c7ee6ULL, 0x80c856b007f1d214ULL, 0x8c0b40302cc32271ULL, 0xdbcedad51fe17a8aULL, 0x740e8ae938dbdea0ULL, 0xa615c6dc549310adULL, 0x19cc55f6171ae90bULL, 0x49b1bdb8fe5fdd8dULL, 0xed0a89af2830e5bfULL, 0x6a7aadb4f5a65bd6ULL, 0x7e22972988f05679ULL, 0xf952b3325566e810ULL, 0x39fecedadf61530eULL, 0x6101c99f04f3c7ceULL, 0x2e5f7f6761b562ffULL, 0xf08725d226cf5c97ULL, 0x63af3b54860fef51ULL, 0x8ff2cb10ef411e2fULL, 0x884ab9bb35267252ULL, 0x4df04433e7ba8daeULL, 0x9afd8866d3690741ULL, 0x66b9bb34de94abb3ULL, 0x9baaf18d92171380ULL, 0x543c11c5f0a064a5ULL, 0x17a1b1bdbed431f1ULL, 0xb5f58eeaf3a2717fULL, 0xc355f6c849858740ULL, 0xec5df044694ef17eULL, 0xd83751f5dc6346d4ULL, 0xfc4433520dfdacf2ULL, 0x0000000000000000ULL, 0x5a51f58e596ebc5fULL, 0x3285aaf12e34cf16ULL, 0x8d5c39db6dbd36b0ULL, 0x12b731dde64f7513ULL, 0x94906c2d7aa7dfbbULL, 0x302b583aacc8e789ULL, 0x9d45facd090e6b3cULL, 0x2165e2c78905aec4ULL, 0x68d45f7f775a7349ULL, 0x189b2c1d5664fdcaULL, 0xe1c99f2f030215daULL, 0x6983269436246788ULL, 0x8489af3b1e148237ULL, 0xe94b702431d5b59cULL, 0x33d2d31a6f4adbd7ULL, 0xbfd9932a4389f9a6ULL, 0xb0e30e8aab39359dULL, 0xd1e2c715afcaf253ULL, 0x150f43763c28196eULL, 0xc4ed846393e2eb3dULL, 0x03f98b20c3823c5eULL, 0xfd134ab94c83b833ULL, 0x556b682eb1de7064ULL, 0x36c4537a37d19f35ULL, 0x7559f30279a5ca61ULL, 0x799ae58252973a04ULL, 0x9c12832648707ffdULL, 0x78cd9c6913e92ec5ULL, 0x1d8dac7d0effb928ULL, 0x439da0784e745554ULL, 0x413352b3cc887dcbULL, 0xbacf134a1b12bd44ULL, 0x114ebafd25cd494dULL, 0x2f08068c20cb763eULL, 0x76a07822ba27f63fULL, 0xeab2fb04f25789c2ULL, 0xe3676de481fe3d45ULL, 0x1b62a73d95e6c194ULL, 0x641749ff5c68832cULL, 0xa5ec4dfc97112cf3ULL, 0xf6682e92bdd6242bULL, 0x3f11c59a44782bb2ULL, 0x317c21d1edb6f348ULL, 0xd65ab5be75ad9e2eULL, 0x6b2dd45fb4d84f17ULL, 0xfaab381296e4d44eULL, 0xd0b5befeeeb4e692ULL, 0x0882ef0b32d7a046ULL, 0x512a91a5a83b2047ULL, 0x963e9ee6f85bf724ULL, 0x4e09cf132438b1f0ULL, 0x77f701c9fb59e2feULL, 0x7ddb1c094b726a27ULL, 0x5f4775ee01f5f8bdULL, 0x9186ec4d223c9b59ULL, 0xfeeac1998f01846dULL, 0xac39db1ce4b89874ULL, 0xb75b7c21715e59e0ULL, 0xafc0503c273aa42aULL, 0x6e3b543fec430bf5ULL, 0x704f7362213e8e83ULL, 0x58ff0745db9294c0ULL, 0x67eec2df9feabf72ULL, 0xa0facd9ccf8a6811ULL, 0xb936986ad890811aULL, 0x95c715c63bd9cb7aULL, 0xca8060283a2c33c7ULL, 0x507de84ee9453486ULL, 0x85ded6d05f6a96f6ULL, 0x1cdad5964f81ade9ULL, 0xd5a33e9eb62fa270ULL, 0x40642b588df6690aULL, 0x7f75eec2c98e42b8ULL, 0x2cf18dace3494a60ULL, 0x23cb100c0bf9865bULL, 0xeef3028febb2d9e1ULL, 0x4425d2d394133929ULL, 0xaad6d05c7fa1e0c8ULL, 0xad6ea2f7a5c68cb5ULL, 0xc2028f2308fb9381ULL, 0x819f2f5b468fc6d5ULL, 0xc5bafd88d29cfffcULL, 0x47dc59f357910577ULL, 0x2b49ff07392e261dULL, 0x57c59ae5332258fbULL, 0x73b6f842e2bcb2ddULL, 0xcf96e04862b77725ULL, 0x4ca73dd8a6c4996fULL, 0x015779eb417e14c1ULL, 0x37932a9176af8bf4ULL }, { 0x190a2c9b249df23eULL, 0x2f62f8b62263e1e9ULL, 0x7a7f754740993655ULL, 0x330b7ba4d5564d9fULL, 0x4c17a16a46672582ULL, 0xb22f08eb7d05f5b8ULL, 0x535f47f40bc148ccULL, 0x3aec5d27d4883037ULL, 0x10ed0a1825438f96ULL, 0x516101f72c233d17ULL, 0x13cc6f949fd04eaeULL, 0x739853c441474bfdULL, 0x653793d90d3f5b1bULL, 0x5240647b96b0fc2fULL, 0x0c84890ad27623e0ULL, 0xd7189b32703aaea3ULL, 0x2685de3523bd9c41ULL, 0x99317c5b11bffefaULL, 0x0d9baa854f079703ULL, 0x70b93648fbd48ac5ULL, 0xa80441fce30bc6beULL, 0x7287704bdc36ff1eULL, 0xb65384ed33dc1f13ULL, 0xd36417343ee34408ULL, 0x39cd38ab6e1bf10fULL, 0x5ab861770a1f3564ULL, 0x0ebacf09f594563bULL, 0xd04572b884708530ULL, 0x3cae9722bdb3af47ULL, 0x4a556b6f2f5cbaf2ULL, 0xe1704f1f76c4bd74ULL, 0x5ec4ed7144c6dfcfULL, 0x16afc01d4c7810e6ULL, 0x283f113cd629ca7aULL, 0xaf59a8761741ed2dULL, 0xeed5a3991e215facULL, 0x3bf37ea849f984d4ULL, 0xe413e096a56ce33cULL, 0x2c439d3a98f020d1ULL, 0x637559dc6404c46bULL, 0x9e6c95d1e5f5d569ULL, 0x24bb9836045fe99aULL, 0x44efa466dac8ecc9ULL, 0xc6eab2a5c80895d6ULL, 0x803b50c035220cc4ULL, 0x0321658cba93c138ULL, 0x8f9ebc465dc7ee1cULL, 0xd15a5137190131d3ULL, 0x0fa5ec8668e5e2d8ULL, 0x91c979578d1037b1ULL, 0x0642ca05693b9f70ULL, 0xefca80168350eb4fULL, 0x38d21b24f36a45ecULL, 0xbeab81e1af73d658ULL, 0x8cbfd9cae7542f24ULL, 0xfd19cc0d81f11102ULL, 0x0ac6430fbb4dbc90ULL, 0x1d76a09d6a441895ULL, 0x2a01573ff1cbbfa1ULL, 0xb572e161894fde2bULL, 0x8124734fa853b827ULL, 0x614b1fdf43e6b1b0ULL, 0x68ac395c4238cc18ULL, 0x21d837bfd7f7b7d2ULL, 0x20c714304a860331ULL, 0x5cfaab726324aa14ULL, 0x74c5ba4eb50d606eULL, 0xf3a3030474654739ULL, 0x23e671bcf015c209ULL, 0x45f087e947b9582aULL, 0xd8bd77b418df4c7bULL, 0xe06f6c90ebb50997ULL, 0x0bd96080263c0873ULL, 0x7e03f9410e40dcfeULL, 0xb8e94be4c6484928ULL, 0xfb5b0608e8ca8e72ULL, 0x1a2b49179e0e3306ULL, 0x4e29e76961855059ULL, 0x4f36c4e6fcf4e4baULL, 0x49740ee395cf7bcaULL, 0xc2963ea386d17f7dULL, 0x90d65ad810618352ULL, 0x12d34c1b02a1fa4dULL, 0xfa44258775bb3a91ULL, 0x18150f14b9ec46ddULL, 0x1491861e6b9a653dULL, 0x9a1019d7ab2c3fc2ULL, 0x3668d42d06fe13d7ULL, 0xdcc1fbb25606a6d0ULL, 0x969490dd795a1c22ULL, 0x3549b1a1bc6dd2efULL, 0xc94f5e23a0ed770eULL, 0xb9f6686b5b39fdcbULL, 0xc4d4f4a6efeae00dULL, 0xe732851a1fff2204ULL, 0x94aad6de5eb869f9ULL, 0x3f8ff2ae07206e7fULL, 0xfe38a9813b62d03aULL, 0xa7a1ad7a8bee2466ULL, 0x7b6056c8dde882b6ULL, 0x302a1e286fc58ca7ULL, 0x8da0fa457a259bc7ULL, 0xb3302b64e074415bULL, 0x5402ae7eff8b635fULL, 0x08f8050c9cafc94bULL, 0xae468bf98a3059ceULL, 0x88c355cca98dc58fULL, 0xb10e6d67c7963480ULL, 0xbad70de7e1aa3cf3ULL, 0xbfb4a26e320262bbULL, 0xcb711820870f02d5ULL, 0xce12b7a954a75c9dULL, 0x563ce87dd8691684ULL, 0x9f73b65e7884618aULL, 0x2b1e74b06cba0b42ULL, 0x47cec1ea605b2df1ULL, 0x1c698312f735ac76ULL, 0x5fdbcefed9b76b2cULL, 0x831a354c8fb1cdfcULL, 0x820516c312c0791fULL, 0xb74ca762aeadabf0ULL, 0xfc06ef821c80a5e1ULL, 0x5723cbf24518a267ULL, 0x9d4df05d5f661451ULL, 0x588627742dfd40bfULL, 0xda8331b73f3d39a0ULL, 0x17b0e392d109a405ULL, 0xf965400bcf28fba9ULL, 0x7c3dbf4229a2a925ULL, 0x023e460327e275dbULL, 0x6cd0b55a0ce126b3ULL, 0xe62da695828e96e7ULL, 0x42ad6e63b3f373b9ULL, 0xe50cc319381d57dfULL, 0xc5cbd729729b54eeULL, 0x46d1e265fd2a9912ULL, 0x6428b056904eeff8ULL, 0x8be23040131e04b7ULL, 0x6709d5da2add2ec0ULL, 0x075de98af44a2b93ULL, 0x8447dcc67bfbe66fULL, 0x6616f655b7ac9a23ULL, 0xd607b8bded4b1a40ULL, 0x0563af89d3a85e48ULL, 0x3db1b4ad20c21ba4ULL, 0x11f22997b8323b75ULL, 0x292032b34b587e99ULL, 0x7f1cdace9331681dULL, 0x8e819fc9c0b65affULL, 0xa1e3677fe2d5bb16ULL, 0xcd33d225ee349da5ULL, 0xd9a2543b85aef898ULL, 0x795e10cbfa0af76dULL, 0x25a4bbb9992e5d79ULL, 0x78413344677b438eULL, 0xf0826688cef68601ULL, 0xd27b34bba392f0ebULL, 0x551d8df162fad7bcULL, 0x1e57c511d0d7d9adULL, 0xdeffbdb171e4d30bULL, 0xf4feea8e802f6caaULL, 0xa480c8f6317de55eULL, 0xa0fc44f07fa40ff5ULL, 0x95b5f551c3c9dd1aULL, 0x22f952336d6476eaULL, 0x0000000000000000ULL, 0xa6be8ef5169f9085ULL, 0xcc2cf1aa73452946ULL, 0x2e7ddb39bf12550aULL, 0xd526dd3157d8db78ULL, 0x486b2d6c08becf29ULL, 0x9b0f3a58365d8b21ULL, 0xac78cdfaadd22c15ULL, 0xbc95c7e28891a383ULL, 0x6a927f5f65dab9c3ULL, 0xc3891d2c1ba0cb9eULL, 0xeaa92f9f50f8b507ULL, 0xcf0d9426c9d6e87eULL, 0xca6e3baf1a7eb636ULL, 0xab25247059980786ULL, 0x69b31ad3df4978fbULL, 0xe2512a93cc577c4cULL, 0xff278a0ea61364d9ULL, 0x71a615c766a53e26ULL, 0x89dc764334fc716cULL, 0xf87a638452594f4aULL, 0xf2bc208be914f3daULL, 0x8766b94ac1682757ULL, 0xbbc82e687cdb8810ULL, 0x626a7a53f9757088ULL, 0xa2c202f358467a2eULL, 0x4d0882e5db169161ULL, 0x09e7268301de7da8ULL, 0xe897699c771ac0dcULL, 0xc8507dac3d9cc3edULL, 0xc0a878a0a1330aa6ULL, 0x978bb352e42ba8c1ULL, 0xe9884a13ea6b743fULL, 0x279afdbabecc28a2ULL, 0x047c8c064ed9eaabULL, 0x507e2278b15289f4ULL, 0x599904fbb08cf45cULL, 0xbd8ae46d15e01760ULL, 0x31353da7f2b43844ULL, 0x8558ff49e68a528cULL, 0x76fbfc4d92ef15b5ULL, 0x3456922e211c660cULL, 0x86799ac55c1993b4ULL, 0x3e90d1219a51da9cULL, 0x2d5cbeb505819432ULL, 0x982e5fd48cce4a19ULL, 0xdb9c1238a24c8d43ULL, 0xd439febecaa96f9bULL, 0x418c0bef0960b281ULL, 0x158ea591f6ebd1deULL, 0x1f48e69e4da66d4eULL, 0x8afd13cf8e6fb054ULL, 0xf5e1c9011d5ed849ULL, 0xe34e091c5126c8afULL, 0xad67ee7530a398f6ULL, 0x43b24dec2e82c75aULL, 0x75da99c1287cd48dULL, 0x92e81cdb3783f689ULL, 0xa3dd217cc537cecdULL, 0x60543c50de970553ULL, 0x93f73f54aaf2426aULL, 0xa91b62737e7a725dULL, 0xf19d4507538732e2ULL, 0x77e4dfc20f9ea156ULL, 0x7d229ccdb4d31dc6ULL, 0x1b346a98037f87e5ULL, 0xedf4c615a4b29e94ULL, 0x4093286094110662ULL, 0xb0114ee85ae78063ULL, 0x6ff1d0d6b672e78bULL, 0x6dcf96d591909250ULL, 0xdfe09e3eec9567e8ULL, 0x3214582b4827f97cULL, 0xb46dc2ee143e6ac8ULL, 0xf6c0ac8da7cd1971ULL, 0xebb60c10cd8901e4ULL, 0xf7df8f023abcad92ULL, 0x9c52d3d2c217a0b2ULL, 0x6b8d5cd0f8ab0d20ULL, 0x3777f7a29b8fa734ULL, 0x011f238f9d71b4e3ULL, 0xc1b75b2f3c42be45ULL, 0x5de588fdfe551ef7ULL, 0x6eeef3592b035368ULL, 0xaa3a07ffc4e9b365ULL, 0xecebe59a39c32a77ULL, 0x5ba742f8976e8187ULL, 0x4b4a48e0b22d0e11ULL, 0xddded83dcb771233ULL, 0xa59feb79ac0c51bdULL, 0xc7f5912a55792135ULL }, { 0x6d6ae04668a9b08aULL, 0x3ab3f04b0be8c743ULL, 0xe51e166b54b3c908ULL, 0xbe90a9eb35c2f139ULL, 0xb2c7066637f2bec1ULL, 0xaa6945613392202cULL, 0x9a28c36f3b5201ebULL, 0xddce5a93ab536994ULL, 0x0e34133ef6382827ULL, 0x52a02ba1ec55048bULL, 0xa2f88f97c4b2a177ULL, 0x8640e513ca2251a5ULL, 0xcdf1d36258137622ULL, 0xfe6cb708dedf8ddbULL, 0x8a174a9ec8121e5dULL, 0x679896036b81560eULL, 0x59ed033395795feeULL, 0x1dd778ab8b74edafULL, 0xee533ef92d9f926dULL, 0x2a8c79baf8a8d8f5ULL, 0x6bcf398e69b119f6ULL, 0xe20491742fafdd95ULL, 0x276488e0809c2aecULL, 0xea955b82d88f5cceULL, 0x7102c63a99d9e0c4ULL, 0xf9763017a5c39946ULL, 0x429fa2501f151b3dULL, 0x4659c72bea05d59eULL, 0x984b7fdccf5a6634ULL, 0xf742232953fbb161ULL, 0x3041860e08c021c7ULL, 0x747bfd9616cd9386ULL, 0x4bb1367192312787ULL, 0x1b72a1638a6c44d3ULL, 0x4a0e68a6e8359a66ULL, 0x169a5039f258b6caULL, 0xb98a2ef44edee5a4ULL, 0xd9083fe85e43a737ULL, 0x967f6ce239624e13ULL, 0x8874f62d3c1a7982ULL, 0x3c1629830af06e3fULL, 0x9165ebfd427e5a8eULL, 0xb5dd81794ceeaa5cULL, 0x0de8f15a7834f219ULL, 0x70bd98ede3dd5d25ULL, 0xaccc9ca9328a8950ULL, 0x56664eda1945ca28ULL, 0x221db34c0f8859aeULL, 0x26dbd637fa98970dULL, 0x1acdffb4f068f932ULL, 0x4585254f64090fa0ULL, 0x72de245e17d53afaULL, 0x1546b25d7c546cf4ULL, 0x207e0ffffb803e71ULL, 0xfaaad2732bcf4378ULL, 0xb462dfae36ea17bdULL, 0xcf926fd1ac1b11fdULL, 0xe0672dc7dba7ba4aULL, 0xd3fa49ad5d6b41b3ULL, 0x8ba81449b216a3bcULL, 0x14f9ec8a0650d115ULL, 0x40fc1ee3eb1d7ce2ULL, 0x23a2ed9b758ce44fULL, 0x782c521b14fddc7eULL, 0x1c68267cf170504eULL, 0xbcf31558c1ca96e6ULL, 0xa781b43b4ba6d235ULL, 0xf6fd7dfe29ff0c80ULL, 0xb0a4bad5c3fad91eULL, 0xd199f51ea963266cULL, 0x414340349119c103ULL, 0x5405f269ed4dadf7ULL, 0xabd61bb649969dcdULL, 0x6813dbeae7bdc3c8ULL, 0x65fb2ab09f8931d1ULL, 0xf1e7fae152e3181dULL, 0xc1a67cef5a2339daULL, 0x7a4feea8e0f5bba1ULL, 0x1e0b9acf05783791ULL, 0x5b8ebf8061713831ULL, 0x80e53cdbcb3af8d9ULL, 0x7e898bd315e57502ULL, 0xc6bcfbf0213f2d47ULL, 0x95a38e86b76e942dULL, 0x092e94218d243cbaULL, 0x8339debf453622e7ULL, 0xb11be402b9fe64ffULL, 0x57d9100d634177c9ULL, 0xcc4e8db52217cbc3ULL, 0x3b0cae9c71ec7aa2ULL, 0xfb158ca451cbfe99ULL, 0x2b33276d82ac6514ULL, 0x01bf5ed77a04bde1ULL, 0xc5601994af33f779ULL, 0x75c4a3416cc92e67ULL, 0xf3844652a6eb7fc2ULL, 0x3487e375fdd0ef64ULL, 0x18ae430704609eedULL, 0x4d14efb993298efbULL, 0x815a620cb13e4538ULL, 0x125c354207487869ULL, 0x9eeea614ce42cf48ULL, 0xce2d3106d61fac1cULL, 0xbbe99247bad6827bULL, 0x071a871f7b1c149dULL, 0x2e4a1cc10db81656ULL, 0x77a71ff298c149b8ULL, 0x06a5d9c80118a97cULL, 0xad73c27e488e34b1ULL, 0x443a7b981e0db241ULL, 0xe3bbcfa355ab6074ULL, 0x0af276450328e684ULL, 0x73617a896dd1871bULL, 0x58525de4ef7de20fULL, 0xb7be3dcab8e6cd83ULL, 0x19111dd07e64230cULL, 0x842359a03e2a367aULL, 0x103f89f1f3401fb6ULL, 0xdc710444d157d475ULL, 0xb835702334da5845ULL, 0x4320fc876511a6dcULL, 0xd026abc9d3679b8dULL, 0x17250eee885c0b2bULL, 0x90dab52a387ae76fULL, 0x31fed8d972c49c26ULL, 0x89cba8fa461ec463ULL, 0x2ff5421677bcabb7ULL, 0x396f122f85e41d7dULL, 0xa09b332430bac6a8ULL, 0xc888e8ced7070560ULL, 0xaeaf201ac682ee8fULL, 0x1180d7268944a257ULL, 0xf058a43628e7a5fcULL, 0xbd4c4b8fbbce2b07ULL, 0xa1246df34abe7b49ULL, 0x7d5569b79be9af3cULL, 0xa9b5a705bd9efa12ULL, 0xdb6b835baa4bc0e8ULL, 0x05793bac8f147342ULL, 0x21c1512881848390ULL, 0xfdb0556c50d357e5ULL, 0x613d4fcb6a99ff72ULL, 0x03dce2648e0cda3eULL, 0xe949b9e6568386f0ULL, 0xfc0f0bbb2ad7ea04ULL, 0x6a70675913b5a417ULL, 0x7f36d5046fe1c8e3ULL, 0x0c57af8d02304ff8ULL, 0x32223abdfcc84618ULL, 0x0891caf6f720815bULL, 0xa63eeaec31a26fd4ULL, 0x2507345374944d33ULL, 0x49d28ac266394058ULL, 0xf5219f9aa7f3d6beULL, 0x2d96fea583b4cc68ULL, 0x5a31e1571b7585d0ULL, 0x8ed12fe53d02d0feULL, 0xdfade6205f5b0e4bULL, 0x4cabb16ee92d331aULL, 0x04c6657bf510cea3ULL, 0xd73c2cd6a87b8f10ULL, 0xe1d87310a1a307abULL, 0x6cd5be9112ad0d6bULL, 0x97c032354366f3f2ULL, 0xd4e0ceb22677552eULL, 0x0000000000000000ULL, 0x29509bde76a402cbULL, 0xc27a9e8bd42fe3e4ULL, 0x5ef7842cee654b73ULL, 0xaf107ecdbc86536eULL, 0x3fcacbe784fcb401ULL, 0xd55f90655c73e8cfULL, 0xe6c2f40fdabf1336ULL, 0xe8f6e7312c873b11ULL, 0xeb2a0555a28be12fULL, 0xe4a148bc2eb774e9ULL, 0x9b979db84156bc0aULL, 0x6eb60222e6a56ab4ULL, 0x87ffbbc4b026ec44ULL, 0xc703a5275b3b90a6ULL, 0x47e699fc9001687fULL, 0x9c8d1aa73a4aa897ULL, 0x7cea3760e1ed12ddULL, 0x4ec80ddd1d2554c5ULL, 0x13e36b957d4cc588ULL, 0x5d2b66486069914dULL, 0x92b90999cc7280b0ULL, 0x517cc9c56259deb5ULL, 0xc937b619ad03b881ULL, 0xec30824ad997f5b2ULL, 0xa45d565fc5aa080bULL, 0xd6837201d27f32f1ULL, 0x635ef3789e9198adULL, 0x531f75769651b96aULL, 0x4f77530a6721e924ULL, 0x486dd4151c3dfdb9ULL, 0x5f48dafb9461f692ULL, 0x375b011173dc355aULL, 0x3da9775470f4d3deULL, 0x8d0dcd81b30e0ac0ULL, 0x36e45fc609d888bbULL, 0x55baacbe97491016ULL, 0x8cb29356c90ab721ULL, 0x76184125e2c5f459ULL, 0x99f4210bb55edbd5ULL, 0x6f095cf59ca1d755ULL, 0x9f51f8c3b44672a9ULL, 0x3538bda287d45285ULL, 0x50c39712185d6354ULL, 0xf23b1885dcefc223ULL, 0x79930ccc6ef9619fULL, 0xed8fdc9da3934853ULL, 0xcb540aaa590bdf5eULL, 0x5c94389f1a6d2cacULL, 0xe77daad8a0bbaed7ULL, 0x28efc5090ca0bf2aULL, 0xbf2ff73c4fc64cd8ULL, 0xb37858b14df60320ULL, 0xf8c96ec0dfc724a7ULL, 0x828680683f329f06ULL, 0x941cd051cd6a29ccULL, 0xc3c5c05cae2b5e05ULL, 0xb601631dc2e27062ULL, 0xc01922382027843bULL, 0x24b86a840e90f0d2ULL, 0xd245177a276ffc52ULL, 0x0f8b4de98c3c95c6ULL, 0x3e759530fef809e0ULL, 0x0b4d2892792c5b65ULL, 0xc4df4743d5374a98ULL, 0xa5e20888bfaeb5eaULL, 0xba56cc90c0d23f9aULL, 0x38d04cf8ffe0a09cULL, 0x62e1adafe495254cULL, 0x0263bcb3f40867dfULL, 0xcaeb547d230f62bfULL, 0x6082111c109d4293ULL, 0xdad4dd8cd04f7d09ULL, 0xefec602e579b2f8cULL, 0x1fb4c4187f7c8a70ULL, 0xffd3e9dfa4db303aULL, 0x7bf0b07f9af10640ULL, 0xf49ec14dddf76b5fULL, 0x8f6e713247066d1fULL, 0x339d646a86ccfbf9ULL, 0x64447467e58d8c30ULL, 0x2c29a072f9b07189ULL, 0xd8b7613f24471ad6ULL, 0x6627c8d41185ebefULL, 0xa347d140beb61c96ULL, 0xde12b8f7255fb3aaULL, 0x9d324470404e1576ULL, 0x9306574eb6763d51ULL, 0xa80af9d2c79a47f3ULL, 0x859c0777442e8b9bULL, 0x69ac853d9db97e29ULL }, { 0xc3407dfc2de6377eULL, 0x5b9e93eea4256f77ULL, 0xadb58fdd50c845e0ULL, 0x5219ff11a75bed86ULL, 0x356b61cfd90b1de9ULL, 0xfb8f406e25abe037ULL, 0x7a5a0231c0f60796ULL, 0x9d3cd216e1f5020bULL, 0x0c6550fb6b48d8f3ULL, 0xf57508c427ff1c62ULL, 0x4ad35ffa71cb407dULL, 0x6290a2da1666aa6dULL, 0xe284ec2349355f9fULL, 0xb3c307c53d7c84ecULL, 0x05e23c0468365a02ULL, 0x190bac4d6c9ebfa8ULL, 0x94bbbee9e28b80faULL, 0xa34fc777529cb9b5ULL, 0xcc7b39f095bcd978ULL, 0x2426addb0ce532e3ULL, 0x7e79329312ce4fc7ULL, 0xab09a72eebec2917ULL, 0xf8d15499f6b9d6c2ULL, 0x1a55b8babf8c895dULL, 0xdb8add17fb769a85ULL, 0xb57f2f368658e81bULL, 0x8acd36f18f3f41f6ULL, 0x5ce3b7bba50f11d3ULL, 0x114dcc14d5ee2f0aULL, 0xb91a7fcded1030e8ULL, 0x81d5425fe55de7a1ULL, 0xb6213bc1554adeeeULL, 0x80144ef95f53f5f2ULL, 0x1e7688186db4c10cULL, 0x3b912965db5fe1bcULL, 0xc281715a97e8252dULL, 0x54a5d7e21c7f8171ULL, 0x4b12535ccbc5522eULL, 0x1d289cefbea6f7f9ULL, 0x6ef5f2217d2e729eULL, 0xe6a7dc819b0d17ceULL, 0x1b94b41c05829b0eULL, 0x33d7493c622f711eULL, 0xdcf7f942fa5ce421ULL, 0x600fba8b7f7a8ecbULL, 0x46b60f011a83988eULL, 0x235b898e0dcf4c47ULL, 0x957ab24f588592a9ULL, 0x4354330572b5c28cULL, 0xa5f3ef84e9b8d542ULL, 0x8c711e02341b2d01ULL, 0x0b1874ae6a62a657ULL, 0x1213d8e306fc19ffULL, 0xfe6d7c6a4d9dba35ULL, 0x65ed868f174cd4c9ULL, 0x88522ea0e6236550ULL, 0x899322065c2d7703ULL, 0xc01e690bfef4018bULL, 0x915982ed8abddaf8ULL, 0xbe675b98ec3a4e4cULL, 0xa996bf7f82f00db1ULL, 0xe1daf8d49a27696aULL, 0x2effd5d3dc8986e7ULL, 0xd153a51f2b1a2e81ULL, 0x18caa0ebd690adfbULL, 0x390e3134b243c51aULL, 0x2778b92cdff70416ULL, 0x029f1851691c24a6ULL, 0x5e7cafeacc133575ULL, 0xfa4e4cc89fa5f264ULL, 0x5a5f9f481e2b7d24ULL, 0x484c47ab18d764dbULL, 0x400a27f2a1a7f479ULL, 0xaeeb9b2a83da7315ULL, 0x721c626879869734ULL, 0x042330a2d2384851ULL, 0x85f672fd3765aff0ULL, 0xba446b3a3e02061dULL, 0x73dd6ecec3888567ULL, 0xffac70ccf793a866ULL, 0xdfa9edb5294ed2d4ULL, 0x6c6aea7014325638ULL, 0x834a5a0e8c41c307ULL, 0xcdba35562fb2cb2bULL, 0x0ad97808d06cb404ULL, 0x0f3b440cb85aee06ULL, 0xe5f9c876481f213bULL, 0x98deee1289c35809ULL, 0x59018bbfcd394bd1ULL, 0xe01bf47220297b39ULL, 0xde68e1139340c087ULL, 0x9fa3ca4788e926adULL, 0xbb85679c840c144eULL, 0x53d8f3b71d55ffd5ULL, 0x0da45c5dd146caa0ULL, 0x6f34fe87c72060cdULL, 0x57fbc315cf6db784ULL, 0xcee421a1fca0fddeULL, 0x3d2d0196607b8d4bULL, 0x642c8a29ad42c69aULL, 0x14aff010bdd87508ULL, 0xac74837beac657b3ULL, 0x3216459ad821634dULL, 0x3fb219c70967a9edULL, 0x06bc28f3bb246cf7ULL, 0xf2082c9126d562c6ULL, 0x66b39278c45ee23cULL, 0xbd394f6f3f2878b9ULL, 0xfd33689d9e8f8cc0ULL, 0x37f4799eb017394fULL, 0x108cc0b26fe03d59ULL, 0xda4bd1b1417888d6ULL, 0xb09d1332ee6eb219ULL, 0x2f3ed975668794b4ULL, 0x58c0871977375982ULL, 0x7561463d78ace990ULL, 0x09876cff037e82f1ULL, 0x7fb83e35a8c05d94ULL, 0x26b9b58a65f91645ULL, 0xef20b07e9873953fULL, 0x3148516d0b3355b8ULL, 0x41cb2b541ba9e62aULL, 0x790416c613e43163ULL, 0xa011d380818e8f40ULL, 0x3a5025c36151f3efULL, 0xd57095bdf92266d0ULL, 0x498d4b0da2d97688ULL, 0x8b0c3a57353153a5ULL, 0x21c491df64d368e1ULL, 0x8f2f0af5e7091bf4ULL, 0x2da1c1240f9bb012ULL, 0xc43d59a92ccc49daULL, 0xbfa6573e56345c1fULL, 0x828b56a8364fd154ULL, 0x9a41f643e0df7cafULL, 0xbcf843c985266aeaULL, 0x2b1de9d7b4bfdce5ULL, 0x20059d79dedd7ab2ULL, 0x6dabe6d6ae3c446bULL, 0x45e81bf6c991ae7bULL, 0x6351ae7cac68b83eULL, 0xa432e32253b6c711ULL, 0xd092a9b991143cd2ULL, 0xcac711032e98b58fULL, 0xd8d4c9e02864ac70ULL, 0xc5fc550f96c25b89ULL, 0xd7ef8dec903e4276ULL, 0x67729ede7e50f06fULL, 0xeac28c7af045cf3dULL, 0xb15c1f945460a04aULL, 0x9cfddeb05bfb1058ULL, 0x93c69abce3a1fe5eULL, 0xeb0380dc4a4bdd6eULL, 0xd20db1e8f8081874ULL, 0x229a8528b7c15e14ULL, 0x44291750739fbc28ULL, 0xd3ccbd4e42060a27ULL, 0xf62b1c33f4ed2a97ULL, 0x86a8660ae4779905ULL, 0xd62e814a2a305025ULL, 0x477703a7a08d8addULL, 0x7b9b0e977af815c5ULL, 0x78c51a60a9ea2330ULL, 0xa6adfb733aaae3b7ULL, 0x97e5aa1e3199b60fULL, 0x0000000000000000ULL, 0xf4b404629df10e31ULL, 0x5564db44a6719322ULL, 0x9207961a59afec0dULL, 0x9624a6b88b97a45cULL, 0x363575380a192b1cULL, 0x2c60cd82b595a241ULL, 0x7d272664c1dc7932ULL, 0x7142769faa94a1c1ULL, 0xa1d0df263b809d13ULL, 0x1630e841d4c451aeULL, 0xc1df65ad44fa13d8ULL, 0x13d2d445bcf20bacULL, 0xd915c546926abe23ULL, 0x38cf3d92084dd749ULL, 0xe766d0272103059dULL, 0xc7634d5effde7f2fULL, 0x077d2455012a7ea4ULL, 0xedbfa82ff16fb199ULL, 0xaf2a978c39d46146ULL, 0x42953fa3c8bbd0dfULL, 0xcb061da59496a7dcULL, 0x25e7a17db6eb20b0ULL, 0x34aa6d6963050fbaULL, 0xa76cf7d580a4f1e4ULL, 0xf7ea10954ee338c4ULL, 0xfcf2643b24819e93ULL, 0xcf252d0746aeef8dULL, 0x4ef06f58a3f3082cULL, 0x563acfb37563a5d7ULL, 0x5086e740ce47c920ULL, 0x2982f186dda3f843ULL, 0x87696aac5e798b56ULL, 0x5d22bb1d1f010380ULL, 0x035e14f7d31236f5ULL, 0x3cec0d30da759f18ULL, 0xf3c920379cdb7095ULL, 0xb8db736b571e22bbULL, 0xdd36f5e44052f672ULL, 0xaac8ab8851e23b44ULL, 0xa857b3d938fe1fe2ULL, 0x17f1e4e76eca43fdULL, 0xec7ea4894b61a3caULL, 0x9e62c6e132e734feULL, 0xd4b1991b432c7483ULL, 0x6ad6c283af163acfULL, 0x1ce9904904a8e5aaULL, 0x5fbda34c761d2726ULL, 0xf910583f4cb7c491ULL, 0xc6a241f845d06d7cULL, 0x4f3163fe19fd1a7fULL, 0xe99c988d2357f9c8ULL, 0x8eee06535d0709a7ULL, 0x0efa48aa0254fc55ULL, 0xb4be23903c56fa48ULL, 0x763f52caabbedf65ULL, 0xeee1bcd8227d876cULL, 0xe345e085f33b4dccULL, 0x3e731561b369bbbeULL, 0x2843fd2067adea10ULL, 0x2adce5710eb1ceb6ULL, 0xb7e03767ef44ccbdULL, 0x8db012a48e153f52ULL, 0x61ceb62dc5749c98ULL, 0xe85d942b9959eb9bULL, 0x4c6f7709caef2c8aULL, 0x84377e5b8d6bbda3ULL, 0x30895dcbb13d47ebULL, 0x74a04a9bc2a2fbc3ULL, 0x6b17ce251518289cULL, 0xe438c4d0f2113368ULL, 0x1fb784bed7bad35fULL, 0x9b80fae55ad16efcULL, 0x77fe5e6c11b0cd36ULL, 0xc858095247849129ULL, 0x08466059b97090a2ULL, 0x01c10ca6ba0e1253ULL, 0x6988d6747c040c3aULL, 0x6849dad2c60a1e69ULL, 0x5147ebe67449db73ULL, 0xc99905f4fd8a837aULL, 0x991fe2b433cd4a5aULL, 0xf09734c04fc94660ULL, 0xa28ecbd1e892abe6ULL, 0xf1563866f5c75433ULL, 0x4dae7baf70e13ed9ULL, 0x7ce62ac27bd26b61ULL, 0x70837a39109ab392ULL, 0x90988e4b30b3c8abULL, 0xb2020b63877296bfULL, 0x156efcb607d6675bULL }, { 0xe63f55ce97c331d0ULL, 0x25b506b0015bba16ULL, 0xc8706e29e6ad9ba8ULL, 0x5b43d3775d521f6aULL, 0x0bfa3d577035106eULL, 0xab95fc172afb0e66ULL, 0xf64b63979e7a3276ULL, 0xf58b4562649dad4bULL, 0x48f7c3dbae0c83f1ULL, 0xff31916642f5c8c5ULL, 0xcbb048dc1c4a0495ULL, 0x66b8f83cdf622989ULL, 0x35c130e908e2b9b0ULL, 0x7c761a61f0b34fa1ULL, 0x3601161cf205268dULL, 0x9e54ccfe2219b7d6ULL, 0x8b7d90a538940837ULL, 0x9cd403588ea35d0bULL, 0xbc3c6fea9ccc5b5aULL, 0xe5ff733b6d24aeedULL, 0xceed22de0f7eb8d2ULL, 0xec8581cab1ab545eULL, 0xb96105e88ff8e71dULL, 0x8ca03501871a5eadULL, 0x76ccce65d6db2a2fULL, 0x5883f582a7b58057ULL, 0x3f7be4ed2e8adc3eULL, 0x0fe7be06355cd9c9ULL, 0xee054e6c1d11be83ULL, 0x1074365909b903a6ULL, 0x5dde9f80b4813c10ULL, 0x4a770c7d02b6692cULL, 0x5379c8d5d7809039ULL, 0xb4067448161ed409ULL, 0x5f5e5026183bd6cdULL, 0xe898029bf4c29df9ULL, 0x7fb63c940a54d09cULL, 0xc5171f897f4ba8bcULL, 0xa6f28db7b31d3d72ULL, 0x2e4f3be7716eaa78ULL, 0x0d6771a099e63314ULL, 0x82076254e41bf284ULL, 0x2f0fd2b42733df98ULL, 0x5c9e76d3e2dc49f0ULL, 0x7aeb569619606cdbULL, 0x83478b07b2468764ULL, 0xcfadcb8d5923cd32ULL, 0x85dac7f05b95a41eULL, 0xb5469d1b4043a1e9ULL, 0xb821ecbbd9a592fdULL, 0x1b8e0b0e798c13c8ULL, 0x62a57b6d9a0be02eULL, 0xfcf1b793b81257f8ULL, 0x9d94ea0bd8fe28ebULL, 0x4cea408aeb654a56ULL, 0x23284a47e888996cULL, 0x2d8f1d128b893545ULL, 0xf4cbac3132c0d8abULL, 0xbd7c86b9ca912ebaULL, 0x3a268eef3dbe6079ULL, 0xf0d62f6077a9110cULL, 0x2735c916ade150cbULL, 0x89fd5f03942ee2eaULL, 0x1acee25d2fd16628ULL, 0x90f39bab41181bffULL, 0x430dfe8cde39939fULL, 0xf70b8ac4c8274796ULL, 0x1c53aeaac6024552ULL, 0x13b410acf35e9c9bULL, 0xa532ab4249faa24fULL, 0x2b1251e5625a163fULL, 0xd7e3e676da4841c7ULL, 0xa7b264e4e5404892ULL, 0xda8497d643ae72d3ULL, 0x861ae105a1723b23ULL, 0x38a6414991048aa4ULL, 0x6578dec92585b6b4ULL, 0x0280cfa6acbaeaddULL, 0x88bdb650c273970aULL, 0x9333bd5ebbff84c2ULL, 0x4e6a8f2c47dfa08bULL, 0x321c954db76cef2aULL, 0x418d312a72837942ULL, 0xb29b38bfffcdf773ULL, 0x6c022c38f90a4c07ULL, 0x5a033a240b0f6a8aULL, 0x1f93885f3ce5da6fULL, 0xc38a537e96988bc6ULL, 0x39e6a81ac759ff44ULL, 0x29929e43cee0fce2ULL, 0x40cdd87924de0ca2ULL, 0xe9d8ebc8a29fe819ULL, 0x0c2798f3cfbb46f4ULL, 0x55e484223e53b343ULL, 0x4650948ecd0d2fd8ULL, 0x20e86cb2126f0651ULL, 0x6d42c56baf5739e7ULL, 0xa06fc1405ace1e08ULL, 0x7babbfc54f3d193bULL, 0x424d17df8864e67fULL, 0xd8045870ef14980eULL, 0xc6d7397c85ac3781ULL, 0x21a885e1443273b1ULL, 0x67f8116f893f5c69ULL, 0x24f5efe35706cff6ULL, 0xd56329d076f2ab1aULL, 0x5e1eb9754e66a32dULL, 0x28d2771098bd8902ULL, 0x8f6013f47dfdc190ULL, 0x17a993fdb637553cULL, 0xe0a219397e1012aaULL, 0x786b9930b5da8606ULL, 0x6e82e39e55b0a6daULL, 0x875a0856f72f4ec3ULL, 0x3741ff4fa458536dULL, 0xac4859b3957558fcULL, 0x7ef6d5c75c09a57cULL, 0xc04a758b6c7f14fbULL, 0xf9acdd91ab26ebbfULL, 0x7391a467c5ef9668ULL, 0x335c7c1ee1319acaULL, 0xa91533b18641e4bbULL, 0xe4bf9a683b79db0dULL, 0x8e20faa72ba0b470ULL, 0x51f907737b3a7ae4ULL, 0x2268a314bed5ec8cULL, 0xd944b123b949edeeULL, 0x31dcb3b84d8b7017ULL, 0xd3fe65279f218860ULL, 0x097af2f1dc8ffab3ULL, 0x9b09a6fc312d0b91ULL, 0xcc6ded78a3c4520fULL, 0x3481d9ba5ebfcc50ULL, 0x4f2a667f1182d56bULL, 0xdfd9fdd4509ace94ULL, 0x26752045fbbc252bULL, 0xbffc491f662bc467ULL, 0xdd593272fc202449ULL, 0x3cbbc218d46d4303ULL, 0x91b372f817456e1fULL, 0x681faf69bc6385a0ULL, 0xb686bbeebaa43ed4ULL, 0x1469b5084cd0ca01ULL, 0x98c98009cbca94acULL, 0x6438379a73d8c354ULL, 0xc2caba2dc0c5fe26ULL, 0x3e3b0dbe78d7a9deULL, 0x50b9ee202d670f04ULL, 0x4590b27b37eab0e5ULL, 0x6025b4cb36b10af3ULL, 0xfb2c1237079c0162ULL, 0xa12f28130c936be8ULL, 0x4b37e52e54eb1cccULL, 0x083a1ba28ad28f53ULL, 0xc10a9cd83a22611bULL, 0x9f1425ad7444c236ULL, 0x069d4cf7e9d3237aULL, 0xedc56899e7f621beULL, 0x778c273680865fcfULL, 0x309c5aeb1bd605f7ULL, 0x8de0dc52d1472b4dULL, 0xf8ec34c2fd7b9e5fULL, 0xea18cd3d58787724ULL, 0xaad515447ca67b86ULL, 0x9989695a9d97e14cULL, 0x0000000000000000ULL, 0xf196c63321f464ecULL, 0x71116bc169557cb5ULL, 0xaf887f466f92c7c1ULL, 0x972e3e0ffe964d65ULL, 0x190ec4a8d536f915ULL, 0x95aef1a9522ca7b8ULL, 0xdc19db21aa7d51a9ULL, 0x94ee18fa0471d258ULL, 0x8087adf248a11859ULL, 0xc457f6da2916dd5cULL, 0xfa6cfb6451c17482ULL, 0xf256e0c6db13fbd1ULL, 0x6a9f60cf10d96f7dULL, 0x4daaa9d9bd383fb6ULL, 0x03c026f5fae79f3dULL, 0xde99148706c7bb74ULL, 0x2a52b8b6340763dfULL, 0x6fc20acd03edd33aULL, 0xd423c08320afdefaULL, 0xbbe1ca4e23420dc0ULL, 0x966ed75ca8cb3885ULL, 0xeb58246e0e2502c4ULL, 0x055d6a021334bc47ULL, 0xa47242111fa7d7afULL, 0xe3623fcc84f78d97ULL, 0x81c744a11efc6db9ULL, 0xaec8961539cfb221ULL, 0xf31609958d4e8e31ULL, 0x63e5923ecc5695ceULL, 0x47107ddd9b505a38ULL, 0xa3afe7b5a0298135ULL, 0x792b7063e387f3e6ULL, 0x0140e953565d75e0ULL, 0x12f4f9ffa503e97bULL, 0x750ce8902c3cb512ULL, 0xdbc47e8515f30733ULL, 0x1ed3610c6ab8af8fULL, 0x5239218681dde5d9ULL, 0xe222d69fd2aaf877ULL, 0xfe71783514a8bd25ULL, 0xcaf0a18f4a177175ULL, 0x61655d9860ec7f13ULL, 0xe77fbc9dc19e4430ULL, 0x2ccff441ddd440a5ULL, 0x16e97aaee06a20dcULL, 0xa855dae2d01c915bULL, 0x1d1347f9905f30b2ULL, 0xb7c652bdecf94b34ULL, 0xd03e43d265c6175dULL, 0xfdb15ec0ee4f2218ULL, 0x57644b8492e9599eULL, 0x07dda5a4bf8e569aULL, 0x54a46d71680ec6a3ULL, 0x5624a2d7c4b42c7eULL, 0xbebca04c3076b187ULL, 0x7d36f332a6ee3a41ULL, 0x3b6667bc6be31599ULL, 0x695f463aea3ef040ULL, 0xad08b0e0c3282d1cULL, 0xb15b1e4a052a684eULL, 0x44d05b2861b7c505ULL, 0x15295c5b1a8dbfe1ULL, 0x744c01c37a61c0f2ULL, 0x59c31cd1f1e8f5b7ULL, 0xef45a73f4b4ccb63ULL, 0x6bdf899c46841a9dULL, 0x3dfb2b4b823036e3ULL, 0xa2ef0ee6f674f4d5ULL, 0x184e2dfb836b8cf5ULL, 0x1134df0a5fe47646ULL, 0xbaa1231d751f7820ULL, 0xd17eaa81339b62bdULL, 0xb01bf71953771daeULL, 0x849a2ea30dc8d1feULL, 0x705182923f080955ULL, 0x0ea757556301ac29ULL, 0x041d83514569c9a7ULL, 0x0abad4042668658eULL, 0x49b72a88f851f611ULL, 0x8a3d79f66ec97dd7ULL, 0xcd2d042bf59927efULL, 0xc930877ab0f0ee48ULL, 0x9273540deda2f122ULL, 0xc797d02fd3f14261ULL, 0xe1e2f06a284d674aULL, 0xd2be8c74c97cfd80ULL, 0x9a494faf67707e71ULL, 0xb3dbd1eca9908293ULL, 0x72d14d3493b2e388ULL, 0xd6a30f258c153427ULL } }; extern const uint64_t STREEBOG_C[12][8] = { { 0xdd806559f2a64507ULL, 0x05767436cc744d23ULL, 0xa2422a08a460d315ULL, 0x4b7ce09192676901ULL, 0x714eb88d7585c4fcULL, 0x2f6a76432e45d016ULL, 0xebcb2f81c0657c1fULL, 0xb1085bda1ecadae9ULL }, { 0xe679047021b19bb7ULL, 0x55dda21bd7cbcd56ULL, 0x5cb561c2db0aa7caULL, 0x9ab5176b12d69958ULL, 0x61d55e0f16b50131ULL, 0xf3feea720a232b98ULL, 0x4fe39d460f70b5d7ULL, 0x6fa3b58aa99d2f1aULL }, { 0x991e96f50aba0ab2ULL, 0xc2b6f443867adb31ULL, 0xc1c93a376062db09ULL, 0xd3e20fe490359eb1ULL, 0xf2ea7514b1297b7bULL, 0x06f15e5f529c1f8bULL, 0x0a39fc286a3d8435ULL, 0xf574dcac2bce2fc7ULL }, { 0x220cbebc84e3d12eULL, 0x3453eaa193e837f1ULL, 0xd8b71333935203beULL, 0xa9d72c82ed03d675ULL, 0x9d721cad685e353fULL, 0x488e857e335c3c7dULL, 0xf948e1a05d71e4ddULL, 0xef1fdfb3e81566d2ULL }, { 0x601758fd7c6cfe57ULL, 0x7a56a27ea9ea63f5ULL, 0xdfff00b723271a16ULL, 0xbfcd1747253af5a3ULL, 0x359e35d7800fffbdULL, 0x7f151c1f1686104aULL, 0x9a3f410c6ca92363ULL, 0x4bea6bacad474799ULL }, { 0xfa68407a46647d6eULL, 0xbf71c57236904f35ULL, 0x0af21f66c2bec6b6ULL, 0xcffaa6b71c9ab7b4ULL, 0x187f9ab49af08ec6ULL, 0x2d66c4f95142a46cULL, 0x6fa4c33b7a3039c0ULL, 0xae4faeae1d3ad3d9ULL }, { 0x8886564d3a14d493ULL, 0x3517454ca23c4af3ULL, 0x06476983284a0504ULL, 0x0992abc52d822c37ULL, 0xd3473e33197a93c9ULL, 0x399ec6c7e6bf87c9ULL, 0x51ac86febf240954ULL, 0xf4c70e16eeaac5ecULL }, { 0xa47f0dd4bf02e71eULL, 0x36acc2355951a8d9ULL, 0x69d18d2bd1a5c42fULL, 0xf4892bcb929b0690ULL, 0x89b4443b4ddbc49aULL, 0x4eb7f8719c36de1eULL, 0x03e7aa020c6e4141ULL, 0x9b1f5b424d93c9a7ULL }, { 0x7261445183235adbULL, 0x0e38dc92cb1f2a60ULL, 0x7b2b8a9aa6079c54ULL, 0x800a440bdbb2ceb1ULL, 0x3cd955b7e00d0984ULL, 0x3a7d3a1b25894224ULL, 0x944c9ad8ec165fdeULL, 0x378f5a541631229bULL }, { 0x74b4c7fb98459cedULL, 0x3698fad1153bb6c3ULL, 0x7a1e6c303b7652f4ULL, 0x9fe76702af69334bULL, 0x1fffe18a1b336103ULL, 0x8941e71cff8a78dbULL, 0x382ae548b2e4f3f3ULL, 0xabbedea680056f52ULL }, { 0x6bcaa4cd81f32d1bULL, 0xdea2594ac06fd85dULL, 0xefbacd1d7d476e98ULL, 0x8a1d71efea48b9caULL, 0x2001802114846679ULL, 0xd8fa6bbbebab0761ULL, 0x3002c6cd635afe94ULL, 0x7bcd9ed0efc889fbULL }, { 0x48bc924af11bd720ULL, 0xfaf417d5d9b21b99ULL, 0xe71da4aa88e12852ULL, 0x5d80ef9d1891cc86ULL, 0xf82012d430219f9bULL, 0xcda43c32bcdf1d77ULL, 0xd21380b00449b17aULL, 0x378ee767f11631baULL } }; } botan-2.4.0/src/lib/hash/tiger/000077500000000000000000000000001322470703100162115ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/tiger/info.txt000066400000000000000000000001101322470703100176750ustar00rootroot00000000000000 TIGER -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/tiger/tig_tab.cpp000066400000000000000000000525331322470703100203360ustar00rootroot00000000000000/* * S-Box Tables for Tiger * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { const uint64_t Tiger::SBOX1[256] = { 0x02AAB17CF7E90C5E, 0xAC424B03E243A8EC, 0x72CD5BE30DD5FCD3, 0x6D019B93F6F97F3A, 0xCD9978FFD21F9193, 0x7573A1C9708029E2, 0xB164326B922A83C3, 0x46883EEE04915870, 0xEAACE3057103ECE6, 0xC54169B808A3535C, 0x4CE754918DDEC47C, 0x0AA2F4DFDC0DF40C, 0x10B76F18A74DBEFA, 0xC6CCB6235AD1AB6A, 0x13726121572FE2FF, 0x1A488C6F199D921E, 0x4BC9F9F4DA0007CA, 0x26F5E6F6E85241C7, 0x859079DBEA5947B6, 0x4F1885C5C99E8C92, 0xD78E761EA96F864B, 0x8E36428C52B5C17D, 0x69CF6827373063C1, 0xB607C93D9BB4C56E, 0x7D820E760E76B5EA, 0x645C9CC6F07FDC42, 0xBF38A078243342E0, 0x5F6B343C9D2E7D04, 0xF2C28AEB600B0EC6, 0x6C0ED85F7254BCAC, 0x71592281A4DB4FE5, 0x1967FA69CE0FED9F, 0xFD5293F8B96545DB, 0xC879E9D7F2A7600B, 0x860248920193194E, 0xA4F9533B2D9CC0B3, 0x9053836C15957613, 0xDB6DCF8AFC357BF1, 0x18BEEA7A7A370F57, 0x037117CA50B99066, 0x6AB30A9774424A35, 0xF4E92F02E325249B, 0x7739DB07061CCAE1, 0xD8F3B49CECA42A05, 0xBD56BE3F51382F73, 0x45FAED5843B0BB28, 0x1C813D5C11BF1F83, 0x8AF0E4B6D75FA169, 0x33EE18A487AD9999, 0x3C26E8EAB1C94410, 0xB510102BC0A822F9, 0x141EEF310CE6123B, 0xFC65B90059DDB154, 0xE0158640C5E0E607, 0x884E079826C3A3CF, 0x930D0D9523C535FD, 0x35638D754E9A2B00, 0x4085FCCF40469DD5, 0xC4B17AD28BE23A4C, 0xCAB2F0FC6A3E6A2E, 0x2860971A6B943FCD, 0x3DDE6EE212E30446, 0x6222F32AE01765AE, 0x5D550BB5478308FE, 0xA9EFA98DA0EDA22A, 0xC351A71686C40DA7, 0x1105586D9C867C84, 0xDCFFEE85FDA22853, 0xCCFBD0262C5EEF76, 0xBAF294CB8990D201, 0xE69464F52AFAD975, 0x94B013AFDF133E14, 0x06A7D1A32823C958, 0x6F95FE5130F61119, 0xD92AB34E462C06C0, 0xED7BDE33887C71D2, 0x79746D6E6518393E, 0x5BA419385D713329, 0x7C1BA6B948A97564, 0x31987C197BFDAC67, 0xDE6C23C44B053D02, 0x581C49FED002D64D, 0xDD474D6338261571, 0xAA4546C3E473D062, 0x928FCE349455F860, 0x48161BBACAAB94D9, 0x63912430770E6F68, 0x6EC8A5E602C6641C, 0x87282515337DDD2B, 0x2CDA6B42034B701B, 0xB03D37C181CB096D, 0xE108438266C71C6F, 0x2B3180C7EB51B255, 0xDF92B82F96C08BBC, 0x5C68C8C0A632F3BA, 0x5504CC861C3D0556, 0xABBFA4E55FB26B8F, 0x41848B0AB3BACEB4, 0xB334A273AA445D32, 0xBCA696F0A85AD881, 0x24F6EC65B528D56C, 0x0CE1512E90F4524A, 0x4E9DD79D5506D35A, 0x258905FAC6CE9779, 0x2019295B3E109B33, 0xF8A9478B73A054CC, 0x2924F2F934417EB0, 0x3993357D536D1BC4, 0x38A81AC21DB6FF8B, 0x47C4FBF17D6016BF, 0x1E0FAADD7667E3F5, 0x7ABCFF62938BEB96, 0xA78DAD948FC179C9, 0x8F1F98B72911E50D, 0x61E48EAE27121A91, 0x4D62F7AD31859808, 0xECEBA345EF5CEAEB, 0xF5CEB25EBC9684CE, 0xF633E20CB7F76221, 0xA32CDF06AB8293E4, 0x985A202CA5EE2CA4, 0xCF0B8447CC8A8FB1, 0x9F765244979859A3, 0xA8D516B1A1240017, 0x0BD7BA3EBB5DC726, 0xE54BCA55B86ADB39, 0x1D7A3AFD6C478063, 0x519EC608E7669EDD, 0x0E5715A2D149AA23, 0x177D4571848FF194, 0xEEB55F3241014C22, 0x0F5E5CA13A6E2EC2, 0x8029927B75F5C361, 0xAD139FABC3D6E436, 0x0D5DF1A94CCF402F, 0x3E8BD948BEA5DFC8, 0xA5A0D357BD3FF77E, 0xA2D12E251F74F645, 0x66FD9E525E81A082, 0x2E0C90CE7F687A49, 0xC2E8BCBEBA973BC5, 0x000001BCE509745F, 0x423777BBE6DAB3D6, 0xD1661C7EAEF06EB5, 0xA1781F354DAACFD8, 0x2D11284A2B16AFFC, 0xF1FC4F67FA891D1F, 0x73ECC25DCB920ADA, 0xAE610C22C2A12651, 0x96E0A810D356B78A, 0x5A9A381F2FE7870F, 0xD5AD62EDE94E5530, 0xD225E5E8368D1427, 0x65977B70C7AF4631, 0x99F889B2DE39D74F, 0x233F30BF54E1D143, 0x9A9675D3D9A63C97, 0x5470554FF334F9A8, 0x166ACB744A4F5688, 0x70C74CAAB2E4AEAD, 0xF0D091646F294D12, 0x57B82A89684031D1, 0xEFD95A5A61BE0B6B, 0x2FBD12E969F2F29A, 0x9BD37013FEFF9FE8, 0x3F9B0404D6085A06, 0x4940C1F3166CFE15, 0x09542C4DCDF3DEFB, 0xB4C5218385CD5CE3, 0xC935B7DC4462A641, 0x3417F8A68ED3B63F, 0xB80959295B215B40, 0xF99CDAEF3B8C8572, 0x018C0614F8FCB95D, 0x1B14ACCD1A3ACDF3, 0x84D471F200BB732D, 0xC1A3110E95E8DA16, 0x430A7220BF1A82B8, 0xB77E090D39DF210E, 0x5EF4BD9F3CD05E9D, 0x9D4FF6DA7E57A444, 0xDA1D60E183D4A5F8, 0xB287C38417998E47, 0xFE3EDC121BB31886, 0xC7FE3CCC980CCBEF, 0xE46FB590189BFD03, 0x3732FD469A4C57DC, 0x7EF700A07CF1AD65, 0x59C64468A31D8859, 0x762FB0B4D45B61F6, 0x155BAED099047718, 0x68755E4C3D50BAA6, 0xE9214E7F22D8B4DF, 0x2ADDBF532EAC95F4, 0x32AE3909B4BD0109, 0x834DF537B08E3450, 0xFA209DA84220728D, 0x9E691D9B9EFE23F7, 0x0446D288C4AE8D7F, 0x7B4CC524E169785B, 0x21D87F0135CA1385, 0xCEBB400F137B8AA5, 0x272E2B66580796BE, 0x3612264125C2B0DE, 0x057702BDAD1EFBB2, 0xD4BABB8EACF84BE9, 0x91583139641BC67B, 0x8BDC2DE08036E024, 0x603C8156F49F68ED, 0xF7D236F7DBEF5111, 0x9727C4598AD21E80, 0xA08A0896670A5FD7, 0xCB4A8F4309EBA9CB, 0x81AF564B0F7036A1, 0xC0B99AA778199ABD, 0x959F1EC83FC8E952, 0x8C505077794A81B9, 0x3ACAAF8F056338F0, 0x07B43F50627A6778, 0x4A44AB49F5ECCC77, 0x3BC3D6E4B679EE98, 0x9CC0D4D1CF14108C, 0x4406C00B206BC8A0, 0x82A18854C8D72D89, 0x67E366B35C3C432C, 0xB923DD61102B37F2, 0x56AB2779D884271D, 0xBE83E1B0FF1525AF, 0xFB7C65D4217E49A9, 0x6BDBE0E76D48E7D4, 0x08DF828745D9179E, 0x22EA6A9ADD53BD34, 0xE36E141C5622200A, 0x7F805D1B8CB750EE, 0xAFE5C7A59F58E837, 0xE27F996A4FB1C23C, 0xD3867DFB0775F0D0, 0xD0E673DE6E88891A, 0x123AEB9EAFB86C25, 0x30F1D5D5C145B895, 0xBB434A2DEE7269E7, 0x78CB67ECF931FA38, 0xF33B0372323BBF9C, 0x52D66336FB279C74, 0x505F33AC0AFB4EAA, 0xE8A5CD99A2CCE187, 0x534974801E2D30BB, 0x8D2D5711D5876D90, 0x1F1A412891BC038E, 0xD6E2E71D82E56648, 0x74036C3A497732B7, 0x89B67ED96361F5AB, 0xFFED95D8F1EA02A2, 0xE72B3BD61464D43D, 0xA6300F170BDC4820, 0xEBC18760ED78A77A }; const uint64_t Tiger::SBOX2[256] = { 0xE6A6BE5A05A12138, 0xB5A122A5B4F87C98, 0x563C6089140B6990, 0x4C46CB2E391F5DD5, 0xD932ADDBC9B79434, 0x08EA70E42015AFF5, 0xD765A6673E478CF1, 0xC4FB757EAB278D99, 0xDF11C6862D6E0692, 0xDDEB84F10D7F3B16, 0x6F2EF604A665EA04, 0x4A8E0F0FF0E0DFB3, 0xA5EDEEF83DBCBA51, 0xFC4F0A2A0EA4371E, 0xE83E1DA85CB38429, 0xDC8FF882BA1B1CE2, 0xCD45505E8353E80D, 0x18D19A00D4DB0717, 0x34A0CFEDA5F38101, 0x0BE77E518887CAF2, 0x1E341438B3C45136, 0xE05797F49089CCF9, 0xFFD23F9DF2591D14, 0x543DDA228595C5CD, 0x661F81FD99052A33, 0x8736E641DB0F7B76, 0x15227725418E5307, 0xE25F7F46162EB2FA, 0x48A8B2126C13D9FE, 0xAFDC541792E76EEA, 0x03D912BFC6D1898F, 0x31B1AAFA1B83F51B, 0xF1AC2796E42AB7D9, 0x40A3A7D7FCD2EBAC, 0x1056136D0AFBBCC5, 0x7889E1DD9A6D0C85, 0xD33525782A7974AA, 0xA7E25D09078AC09B, 0xBD4138B3EAC6EDD0, 0x920ABFBE71EB9E70, 0xA2A5D0F54FC2625C, 0xC054E36B0B1290A3, 0xF6DD59FF62FE932B, 0x3537354511A8AC7D, 0xCA845E9172FADCD4, 0x84F82B60329D20DC, 0x79C62CE1CD672F18, 0x8B09A2ADD124642C, 0xD0C1E96A19D9E726, 0x5A786A9B4BA9500C, 0x0E020336634C43F3, 0xC17B474AEB66D822, 0x6A731AE3EC9BAAC2, 0x8226667AE0840258, 0x67D4567691CAECA5, 0x1D94155C4875ADB5, 0x6D00FD985B813FDF, 0x51286EFCB774CD06, 0x5E8834471FA744AF, 0xF72CA0AEE761AE2E, 0xBE40E4CDAEE8E09A, 0xE9970BBB5118F665, 0x726E4BEB33DF1964, 0x703B000729199762, 0x4631D816F5EF30A7, 0xB880B5B51504A6BE, 0x641793C37ED84B6C, 0x7B21ED77F6E97D96, 0x776306312EF96B73, 0xAE528948E86FF3F4, 0x53DBD7F286A3F8F8, 0x16CADCE74CFC1063, 0x005C19BDFA52C6DD, 0x68868F5D64D46AD3, 0x3A9D512CCF1E186A, 0x367E62C2385660AE, 0xE359E7EA77DCB1D7, 0x526C0773749ABE6E, 0x735AE5F9D09F734B, 0x493FC7CC8A558BA8, 0xB0B9C1533041AB45, 0x321958BA470A59BD, 0x852DB00B5F46C393, 0x91209B2BD336B0E5, 0x6E604F7D659EF19F, 0xB99A8AE2782CCB24, 0xCCF52AB6C814C4C7, 0x4727D9AFBE11727B, 0x7E950D0C0121B34D, 0x756F435670AD471F, 0xF5ADD442615A6849, 0x4E87E09980B9957A, 0x2ACFA1DF50AEE355, 0xD898263AFD2FD556, 0xC8F4924DD80C8FD6, 0xCF99CA3D754A173A, 0xFE477BACAF91BF3C, 0xED5371F6D690C12D, 0x831A5C285E687094, 0xC5D3C90A3708A0A4, 0x0F7F903717D06580, 0x19F9BB13B8FDF27F, 0xB1BD6F1B4D502843, 0x1C761BA38FFF4012, 0x0D1530C4E2E21F3B, 0x8943CE69A7372C8A, 0xE5184E11FEB5CE66, 0x618BDB80BD736621, 0x7D29BAD68B574D0B, 0x81BB613E25E6FE5B, 0x071C9C10BC07913F, 0xC7BEEB7909AC2D97, 0xC3E58D353BC5D757, 0xEB017892F38F61E8, 0xD4EFFB9C9B1CC21A, 0x99727D26F494F7AB, 0xA3E063A2956B3E03, 0x9D4A8B9A4AA09C30, 0x3F6AB7D500090FB4, 0x9CC0F2A057268AC0, 0x3DEE9D2DEDBF42D1, 0x330F49C87960A972, 0xC6B2720287421B41, 0x0AC59EC07C00369C, 0xEF4EAC49CB353425, 0xF450244EEF0129D8, 0x8ACC46E5CAF4DEB6, 0x2FFEAB63989263F7, 0x8F7CB9FE5D7A4578, 0x5BD8F7644E634635, 0x427A7315BF2DC900, 0x17D0C4AA2125261C, 0x3992486C93518E50, 0xB4CBFEE0A2D7D4C3, 0x7C75D6202C5DDD8D, 0xDBC295D8E35B6C61, 0x60B369D302032B19, 0xCE42685FDCE44132, 0x06F3DDB9DDF65610, 0x8EA4D21DB5E148F0, 0x20B0FCE62FCD496F, 0x2C1B912358B0EE31, 0xB28317B818F5A308, 0xA89C1E189CA6D2CF, 0x0C6B18576AAADBC8, 0xB65DEAA91299FAE3, 0xFB2B794B7F1027E7, 0x04E4317F443B5BEB, 0x4B852D325939D0A6, 0xD5AE6BEEFB207FFC, 0x309682B281C7D374, 0xBAE309A194C3B475, 0x8CC3F97B13B49F05, 0x98A9422FF8293967, 0x244B16B01076FF7C, 0xF8BF571C663D67EE, 0x1F0D6758EEE30DA1, 0xC9B611D97ADEB9B7, 0xB7AFD5887B6C57A2, 0x6290AE846B984FE1, 0x94DF4CDEACC1A5FD, 0x058A5BD1C5483AFF, 0x63166CC142BA3C37, 0x8DB8526EB2F76F40, 0xE10880036F0D6D4E, 0x9E0523C9971D311D, 0x45EC2824CC7CD691, 0x575B8359E62382C9, 0xFA9E400DC4889995, 0xD1823ECB45721568, 0xDAFD983B8206082F, 0xAA7D29082386A8CB, 0x269FCD4403B87588, 0x1B91F5F728BDD1E0, 0xE4669F39040201F6, 0x7A1D7C218CF04ADE, 0x65623C29D79CE5CE, 0x2368449096C00BB1, 0xAB9BF1879DA503BA, 0xBC23ECB1A458058E, 0x9A58DF01BB401ECC, 0xA070E868A85F143D, 0x4FF188307DF2239E, 0x14D565B41A641183, 0xEE13337452701602, 0x950E3DCF3F285E09, 0x59930254B9C80953, 0x3BF299408930DA6D, 0xA955943F53691387, 0xA15EDECAA9CB8784, 0x29142127352BE9A0, 0x76F0371FFF4E7AFB, 0x0239F450274F2228, 0xBB073AF01D5E868B, 0xBFC80571C10E96C1, 0xD267088568222E23, 0x9671A3D48E80B5B0, 0x55B5D38AE193BB81, 0x693AE2D0A18B04B8, 0x5C48B4ECADD5335F, 0xFD743B194916A1CA, 0x2577018134BE98C4, 0xE77987E83C54A4AD, 0x28E11014DA33E1B9, 0x270CC59E226AA213, 0x71495F756D1A5F60, 0x9BE853FB60AFEF77, 0xADC786A7F7443DBF, 0x0904456173B29A82, 0x58BC7A66C232BD5E, 0xF306558C673AC8B2, 0x41F639C6B6C9772A, 0x216DEFE99FDA35DA, 0x11640CC71C7BE615, 0x93C43694565C5527, 0xEA038E6246777839, 0xF9ABF3CE5A3E2469, 0x741E768D0FD312D2, 0x0144B883CED652C6, 0xC20B5A5BA33F8552, 0x1AE69633C3435A9D, 0x97A28CA4088CFDEC, 0x8824A43C1E96F420, 0x37612FA66EEEA746, 0x6B4CB165F9CF0E5A, 0x43AA1C06A0ABFB4A, 0x7F4DC26FF162796B, 0x6CBACC8E54ED9B0F, 0xA6B7FFEFD2BB253E, 0x2E25BC95B0A29D4F, 0x86D6A58BDEF1388C, 0xDED74AC576B6F054, 0x8030BDBC2B45805D, 0x3C81AF70E94D9289, 0x3EFF6DDA9E3100DB, 0xB38DC39FDFCC8847, 0x123885528D17B87E, 0xF2DA0ED240B1B642, 0x44CEFADCD54BF9A9, 0x1312200E433C7EE6, 0x9FFCC84F3A78C748, 0xF0CD1F72248576BB, 0xEC6974053638CFE4, 0x2BA7B67C0CEC4E4C, 0xAC2F4DF3E5CE32ED, 0xCB33D14326EA4C11, 0xA4E9044CC77E58BC, 0x5F513293D934FCEF, 0x5DC9645506E55444, 0x50DE418F317DE40A, 0x388CB31A69DDE259, 0x2DB4A83455820A86, 0x9010A91E84711AE9, 0x4DF7F0B7B1498371, 0xD62A2EABC0977179, 0x22FAC097AA8D5C0E }; const uint64_t Tiger::SBOX3[256] = { 0xF49FCC2FF1DAF39B, 0x487FD5C66FF29281, 0xE8A30667FCDCA83F, 0x2C9B4BE3D2FCCE63, 0xDA3FF74B93FBBBC2, 0x2FA165D2FE70BA66, 0xA103E279970E93D4, 0xBECDEC77B0E45E71, 0xCFB41E723985E497, 0xB70AAA025EF75017, 0xD42309F03840B8E0, 0x8EFC1AD035898579, 0x96C6920BE2B2ABC5, 0x66AF4163375A9172, 0x2174ABDCCA7127FB, 0xB33CCEA64A72FF41, 0xF04A4933083066A5, 0x8D970ACDD7289AF5, 0x8F96E8E031C8C25E, 0xF3FEC02276875D47, 0xEC7BF310056190DD, 0xF5ADB0AEBB0F1491, 0x9B50F8850FD58892, 0x4975488358B74DE8, 0xA3354FF691531C61, 0x0702BBE481D2C6EE, 0x89FB24057DEDED98, 0xAC3075138596E902, 0x1D2D3580172772ED, 0xEB738FC28E6BC30D, 0x5854EF8F63044326, 0x9E5C52325ADD3BBE, 0x90AA53CF325C4623, 0xC1D24D51349DD067, 0x2051CFEEA69EA624, 0x13220F0A862E7E4F, 0xCE39399404E04864, 0xD9C42CA47086FCB7, 0x685AD2238A03E7CC, 0x066484B2AB2FF1DB, 0xFE9D5D70EFBF79EC, 0x5B13B9DD9C481854, 0x15F0D475ED1509AD, 0x0BEBCD060EC79851, 0xD58C6791183AB7F8, 0xD1187C5052F3EEE4, 0xC95D1192E54E82FF, 0x86EEA14CB9AC6CA2, 0x3485BEB153677D5D, 0xDD191D781F8C492A, 0xF60866BAA784EBF9, 0x518F643BA2D08C74, 0x8852E956E1087C22, 0xA768CB8DC410AE8D, 0x38047726BFEC8E1A, 0xA67738B4CD3B45AA, 0xAD16691CEC0DDE19, 0xC6D4319380462E07, 0xC5A5876D0BA61938, 0x16B9FA1FA58FD840, 0x188AB1173CA74F18, 0xABDA2F98C99C021F, 0x3E0580AB134AE816, 0x5F3B05B773645ABB, 0x2501A2BE5575F2F6, 0x1B2F74004E7E8BA9, 0x1CD7580371E8D953, 0x7F6ED89562764E30, 0xB15926FF596F003D, 0x9F65293DA8C5D6B9, 0x6ECEF04DD690F84C, 0x4782275FFF33AF88, 0xE41433083F820801, 0xFD0DFE409A1AF9B5, 0x4325A3342CDB396B, 0x8AE77E62B301B252, 0xC36F9E9F6655615A, 0x85455A2D92D32C09, 0xF2C7DEA949477485, 0x63CFB4C133A39EBA, 0x83B040CC6EBC5462, 0x3B9454C8FDB326B0, 0x56F56A9E87FFD78C, 0x2DC2940D99F42BC6, 0x98F7DF096B096E2D, 0x19A6E01E3AD852BF, 0x42A99CCBDBD4B40B, 0xA59998AF45E9C559, 0x366295E807D93186, 0x6B48181BFAA1F773, 0x1FEC57E2157A0A1D, 0x4667446AF6201AD5, 0xE615EBCACFB0F075, 0xB8F31F4F68290778, 0x22713ED6CE22D11E, 0x3057C1A72EC3C93B, 0xCB46ACC37C3F1F2F, 0xDBB893FD02AAF50E, 0x331FD92E600B9FCF, 0xA498F96148EA3AD6, 0xA8D8426E8B6A83EA, 0xA089B274B7735CDC, 0x87F6B3731E524A11, 0x118808E5CBC96749, 0x9906E4C7B19BD394, 0xAFED7F7E9B24A20C, 0x6509EADEEB3644A7, 0x6C1EF1D3E8EF0EDE, 0xB9C97D43E9798FB4, 0xA2F2D784740C28A3, 0x7B8496476197566F, 0x7A5BE3E6B65F069D, 0xF96330ED78BE6F10, 0xEEE60DE77A076A15, 0x2B4BEE4AA08B9BD0, 0x6A56A63EC7B8894E, 0x02121359BA34FEF4, 0x4CBF99F8283703FC, 0x398071350CAF30C8, 0xD0A77A89F017687A, 0xF1C1A9EB9E423569, 0x8C7976282DEE8199, 0x5D1737A5DD1F7ABD, 0x4F53433C09A9FA80, 0xFA8B0C53DF7CA1D9, 0x3FD9DCBC886CCB77, 0xC040917CA91B4720, 0x7DD00142F9D1DCDF, 0x8476FC1D4F387B58, 0x23F8E7C5F3316503, 0x032A2244E7E37339, 0x5C87A5D750F5A74B, 0x082B4CC43698992E, 0xDF917BECB858F63C, 0x3270B8FC5BF86DDA, 0x10AE72BB29B5DD76, 0x576AC94E7700362B, 0x1AD112DAC61EFB8F, 0x691BC30EC5FAA427, 0xFF246311CC327143, 0x3142368E30E53206, 0x71380E31E02CA396, 0x958D5C960AAD76F1, 0xF8D6F430C16DA536, 0xC8FFD13F1BE7E1D2, 0x7578AE66004DDBE1, 0x05833F01067BE646, 0xBB34B5AD3BFE586D, 0x095F34C9A12B97F0, 0x247AB64525D60CA8, 0xDCDBC6F3017477D1, 0x4A2E14D4DECAD24D, 0xBDB5E6D9BE0A1EEB, 0x2A7E70F7794301AB, 0xDEF42D8A270540FD, 0x01078EC0A34C22C1, 0xE5DE511AF4C16387, 0x7EBB3A52BD9A330A, 0x77697857AA7D6435, 0x004E831603AE4C32, 0xE7A21020AD78E312, 0x9D41A70C6AB420F2, 0x28E06C18EA1141E6, 0xD2B28CBD984F6B28, 0x26B75F6C446E9D83, 0xBA47568C4D418D7F, 0xD80BADBFE6183D8E, 0x0E206D7F5F166044, 0xE258A43911CBCA3E, 0x723A1746B21DC0BC, 0xC7CAA854F5D7CDD3, 0x7CAC32883D261D9C, 0x7690C26423BA942C, 0x17E55524478042B8, 0xE0BE477656A2389F, 0x4D289B5E67AB2DA0, 0x44862B9C8FBBFD31, 0xB47CC8049D141365, 0x822C1B362B91C793, 0x4EB14655FB13DFD8, 0x1ECBBA0714E2A97B, 0x6143459D5CDE5F14, 0x53A8FBF1D5F0AC89, 0x97EA04D81C5E5B00, 0x622181A8D4FDB3F3, 0xE9BCD341572A1208, 0x1411258643CCE58A, 0x9144C5FEA4C6E0A4, 0x0D33D06565CF620F, 0x54A48D489F219CA1, 0xC43E5EAC6D63C821, 0xA9728B3A72770DAF, 0xD7934E7B20DF87EF, 0xE35503B61A3E86E5, 0xCAE321FBC819D504, 0x129A50B3AC60BFA6, 0xCD5E68EA7E9FB6C3, 0xB01C90199483B1C7, 0x3DE93CD5C295376C, 0xAED52EDF2AB9AD13, 0x2E60F512C0A07884, 0xBC3D86A3E36210C9, 0x35269D9B163951CE, 0x0C7D6E2AD0CDB5FA, 0x59E86297D87F5733, 0x298EF221898DB0E7, 0x55000029D1A5AA7E, 0x8BC08AE1B5061B45, 0xC2C31C2B6C92703A, 0x94CC596BAF25EF42, 0x0A1D73DB22540456, 0x04B6A0F9D9C4179A, 0xEFFDAFA2AE3D3C60, 0xF7C8075BB49496C4, 0x9CC5C7141D1CD4E3, 0x78BD1638218E5534, 0xB2F11568F850246A, 0xEDFABCFA9502BC29, 0x796CE5F2DA23051B, 0xAAE128B0DC93537C, 0x3A493DA0EE4B29AE, 0xB5DF6B2C416895D7, 0xFCABBD25122D7F37, 0x70810B58105DC4B1, 0xE10FDD37F7882A90, 0x524DCAB5518A3F5C, 0x3C9E85878451255B, 0x4029828119BD34E2, 0x74A05B6F5D3CECCB, 0xB610021542E13ECA, 0x0FF979D12F59E2AC, 0x6037DA27E4F9CC50, 0x5E92975A0DF1847D, 0xD66DE190D3E623FE, 0x5032D6B87B568048, 0x9A36B7CE8235216E, 0x80272A7A24F64B4A, 0x93EFED8B8C6916F7, 0x37DDBFF44CCE1555, 0x4B95DB5D4B99BD25, 0x92D3FDA169812FC0, 0xFB1A4A9A90660BB6, 0x730C196946A4B9B2, 0x81E289AA7F49DA68, 0x64669A0F83B1A05F, 0x27B3FF7D9644F48B, 0xCC6B615C8DB675B3, 0x674F20B9BCEBBE95, 0x6F31238275655982, 0x5AE488713E45CF05, 0xBF619F9954C21157, 0xEABAC46040A8EAE9, 0x454C6FE9F2C0C1CD, 0x419CF6496412691C, 0xD3DC3BEF265B0F70, 0x6D0E60F5C3578A9E }; const uint64_t Tiger::SBOX4[256] = { 0x5B0E608526323C55, 0x1A46C1A9FA1B59F5, 0xA9E245A17C4C8FFA, 0x65CA5159DB2955D7, 0x05DB0A76CE35AFC2, 0x81EAC77EA9113D45, 0x528EF88AB6AC0A0D, 0xA09EA253597BE3FF, 0x430DDFB3AC48CD56, 0xC4B3A67AF45CE46F, 0x4ECECFD8FBE2D05E, 0x3EF56F10B39935F0, 0x0B22D6829CD619C6, 0x17FD460A74DF2069, 0x6CF8CC8E8510ED40, 0xD6C824BF3A6ECAA7, 0x61243D581A817049, 0x048BACB6BBC163A2, 0xD9A38AC27D44CC32, 0x7FDDFF5BAAF410AB, 0xAD6D495AA804824B, 0xE1A6A74F2D8C9F94, 0xD4F7851235DEE8E3, 0xFD4B7F886540D893, 0x247C20042AA4BFDA, 0x096EA1C517D1327C, 0xD56966B4361A6685, 0x277DA5C31221057D, 0x94D59893A43ACFF7, 0x64F0C51CCDC02281, 0x3D33BCC4FF6189DB, 0xE005CB184CE66AF1, 0xFF5CCD1D1DB99BEA, 0xB0B854A7FE42980F, 0x7BD46A6A718D4B9F, 0xD10FA8CC22A5FD8C, 0xD31484952BE4BD31, 0xC7FA975FCB243847, 0x4886ED1E5846C407, 0x28CDDB791EB70B04, 0xC2B00BE2F573417F, 0x5C9590452180F877, 0x7A6BDDFFF370EB00, 0xCE509E38D6D9D6A4, 0xEBEB0F00647FA702, 0x1DCC06CF76606F06, 0xE4D9F28BA286FF0A, 0xD85A305DC918C262, 0x475B1D8732225F54, 0x2D4FB51668CCB5FE, 0xA679B9D9D72BBA20, 0x53841C0D912D43A5, 0x3B7EAA48BF12A4E8, 0x781E0E47F22F1DDF, 0xEFF20CE60AB50973, 0x20D261D19DFFB742, 0x16A12B03062A2E39, 0x1960EB2239650495, 0x251C16FED50EB8B8, 0x9AC0C330F826016E, 0xED152665953E7671, 0x02D63194A6369570, 0x5074F08394B1C987, 0x70BA598C90B25CE1, 0x794A15810B9742F6, 0x0D5925E9FCAF8C6C, 0x3067716CD868744E, 0x910AB077E8D7731B, 0x6A61BBDB5AC42F61, 0x93513EFBF0851567, 0xF494724B9E83E9D5, 0xE887E1985C09648D, 0x34B1D3C675370CFD, 0xDC35E433BC0D255D, 0xD0AAB84234131BE0, 0x08042A50B48B7EAF, 0x9997C4EE44A3AB35, 0x829A7B49201799D0, 0x263B8307B7C54441, 0x752F95F4FD6A6CA6, 0x927217402C08C6E5, 0x2A8AB754A795D9EE, 0xA442F7552F72943D, 0x2C31334E19781208, 0x4FA98D7CEAEE6291, 0x55C3862F665DB309, 0xBD0610175D53B1F3, 0x46FE6CB840413F27, 0x3FE03792DF0CFA59, 0xCFE700372EB85E8F, 0xA7BE29E7ADBCE118, 0xE544EE5CDE8431DD, 0x8A781B1B41F1873E, 0xA5C94C78A0D2F0E7, 0x39412E2877B60728, 0xA1265EF3AFC9A62C, 0xBCC2770C6A2506C5, 0x3AB66DD5DCE1CE12, 0xE65499D04A675B37, 0x7D8F523481BFD216, 0x0F6F64FCEC15F389, 0x74EFBE618B5B13C8, 0xACDC82B714273E1D, 0xDD40BFE003199D17, 0x37E99257E7E061F8, 0xFA52626904775AAA, 0x8BBBF63A463D56F9, 0xF0013F1543A26E64, 0xA8307E9F879EC898, 0xCC4C27A4150177CC, 0x1B432F2CCA1D3348, 0xDE1D1F8F9F6FA013, 0x606602A047A7DDD6, 0xD237AB64CC1CB2C7, 0x9B938E7225FCD1D3, 0xEC4E03708E0FF476, 0xFEB2FBDA3D03C12D, 0xAE0BCED2EE43889A, 0x22CB8923EBFB4F43, 0x69360D013CF7396D, 0x855E3602D2D4E022, 0x073805BAD01F784C, 0x33E17A133852F546, 0xDF4874058AC7B638, 0xBA92B29C678AA14A, 0x0CE89FC76CFAADCD, 0x5F9D4E0908339E34, 0xF1AFE9291F5923B9, 0x6E3480F60F4A265F, 0xEEBF3A2AB29B841C, 0xE21938A88F91B4AD, 0x57DFEFF845C6D3C3, 0x2F006B0BF62CAAF2, 0x62F479EF6F75EE78, 0x11A55AD41C8916A9, 0xF229D29084FED453, 0x42F1C27B16B000E6, 0x2B1F76749823C074, 0x4B76ECA3C2745360, 0x8C98F463B91691BD, 0x14BCC93CF1ADE66A, 0x8885213E6D458397, 0x8E177DF0274D4711, 0xB49B73B5503F2951, 0x10168168C3F96B6B, 0x0E3D963B63CAB0AE, 0x8DFC4B5655A1DB14, 0xF789F1356E14DE5C, 0x683E68AF4E51DAC1, 0xC9A84F9D8D4B0FD9, 0x3691E03F52A0F9D1, 0x5ED86E46E1878E80, 0x3C711A0E99D07150, 0x5A0865B20C4E9310, 0x56FBFC1FE4F0682E, 0xEA8D5DE3105EDF9B, 0x71ABFDB12379187A, 0x2EB99DE1BEE77B9C, 0x21ECC0EA33CF4523, 0x59A4D7521805C7A1, 0x3896F5EB56AE7C72, 0xAA638F3DB18F75DC, 0x9F39358DABE9808E, 0xB7DEFA91C00B72AC, 0x6B5541FD62492D92, 0x6DC6DEE8F92E4D5B, 0x353F57ABC4BEEA7E, 0x735769D6DA5690CE, 0x0A234AA642391484, 0xF6F9508028F80D9D, 0xB8E319A27AB3F215, 0x31AD9C1151341A4D, 0x773C22A57BEF5805, 0x45C7561A07968633, 0xF913DA9E249DBE36, 0xDA652D9B78A64C68, 0x4C27A97F3BC334EF, 0x76621220E66B17F4, 0x967743899ACD7D0B, 0xF3EE5BCAE0ED6782, 0x409F753600C879FC, 0x06D09A39B5926DB6, 0x6F83AEB0317AC588, 0x01E6CA4A86381F21, 0x66FF3462D19F3025, 0x72207C24DDFD3BFB, 0x4AF6B6D3E2ECE2EB, 0x9C994DBEC7EA08DE, 0x49ACE597B09A8BC4, 0xB38C4766CF0797BA, 0x131B9373C57C2A75, 0xB1822CCE61931E58, 0x9D7555B909BA1C0C, 0x127FAFDD937D11D2, 0x29DA3BADC66D92E4, 0xA2C1D57154C2ECBC, 0x58C5134D82F6FE24, 0x1C3AE3515B62274F, 0xE907C82E01CB8126, 0xF8ED091913E37FCB, 0x3249D8F9C80046C9, 0x80CF9BEDE388FB63, 0x1881539A116CF19E, 0x5103F3F76BD52457, 0x15B7E6F5AE47F7A8, 0xDBD7C6DED47E9CCF, 0x44E55C410228BB1A, 0xB647D4255EDB4E99, 0x5D11882BB8AAFC30, 0xF5098BBB29D3212A, 0x8FB5EA14E90296B3, 0x677B942157DD025A, 0xFB58E7C0A390ACB5, 0x89D3674C83BD4A01, 0x9E2DA4DF4BF3B93B, 0xFCC41E328CAB4829, 0x03F38C96BA582C52, 0xCAD1BDBD7FD85DB2, 0xBBB442C16082AE83, 0xB95FE86BA5DA9AB0, 0xB22E04673771A93F, 0x845358C9493152D8, 0xBE2A488697B4541E, 0x95A2DC2DD38E6966, 0xC02C11AC923C852B, 0x2388B1990DF2A87B, 0x7C8008FA1B4F37BE, 0x1F70D0C84D54E503, 0x5490ADEC7ECE57D4, 0x002B3C27D9063A3A, 0x7EAEA3848030A2BF, 0xC602326DED2003C0, 0x83A7287D69A94086, 0xC57A5FCB30F57A8A, 0xB56844E479EBE779, 0xA373B40F05DCBCE9, 0xD71A786E88570EE2, 0x879CBACDBDE8F6A0, 0x976AD1BCC164A32F, 0xAB21E25E9666D78B, 0x901063AAE5E5C33C, 0x9818B34448698D90, 0xE36487AE3E1E8ABB, 0xAFBDF931893BDCB4, 0x6345A0DC5FBBD519, 0x8628FE269B9465CA, 0x1E5D01603F9C51EC, 0x4DE44006A15049B7, 0xBF6C70E5F776CBB1, 0x411218F2EF552BED, 0xCB0C0708705A36A3, 0xE74D14754F986044, 0xCD56D9430EA8280E, 0xC12591D7535F5065, 0xC83223F1720AEF96, 0xC3A0396F7363A51F }; } botan-2.4.0/src/lib/hash/tiger/tiger.cpp000066400000000000000000000112311322470703100200250ustar00rootroot00000000000000/* * Tiger * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::unique_ptr Tiger::copy_state() const { return std::unique_ptr(new Tiger(*this)); } namespace { /* * Tiger Mixing Function */ inline void mix(secure_vector& X) { X[0] -= X[7] ^ 0xA5A5A5A5A5A5A5A5; X[1] ^= X[0]; X[2] += X[1]; X[3] -= X[2] ^ ((~X[1]) << 19); X[4] ^= X[3]; X[5] += X[4]; X[6] -= X[5] ^ ((~X[4]) >> 23); X[7] ^= X[6]; X[0] += X[7]; X[1] -= X[0] ^ ((~X[7]) << 19); X[2] ^= X[1]; X[3] += X[2]; X[4] -= X[3] ^ ((~X[2]) >> 23); X[5] ^= X[4]; X[6] += X[5]; X[7] -= X[6] ^ 0x0123456789ABCDEF; } } /* * Tiger Compression Function */ void Tiger::compress_n(const uint8_t input[], size_t blocks) { uint64_t A = m_digest[0], B = m_digest[1], C = m_digest[2]; for(size_t i = 0; i != blocks; ++i) { load_le(m_X.data(), input, m_X.size()); pass(A, B, C, m_X, 5); mix(m_X); pass(C, A, B, m_X, 7); mix(m_X); pass(B, C, A, m_X, 9); for(size_t j = 3; j != m_passes; ++j) { mix(m_X); pass(A, B, C, m_X, 9); uint64_t T = A; A = C; C = B; B = T; } A = (m_digest[0] ^= A); B = m_digest[1] = B - m_digest[1]; C = (m_digest[2] += C); input += hash_block_size(); } } /* * Copy out the digest */ void Tiger::copy_out(uint8_t output[]) { copy_out_vec_le(output, output_length(), m_digest); } /* * Tiger Pass */ void Tiger::pass(uint64_t& A, uint64_t& B, uint64_t& C, const secure_vector& X, uint8_t mul) { C ^= X[0]; A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; B *= mul; A ^= X[1]; B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; C *= mul; B ^= X[2]; C -= SBOX1[get_byte(7, B)] ^ SBOX2[get_byte(5, B)] ^ SBOX3[get_byte(3, B)] ^ SBOX4[get_byte(1, B)]; A += SBOX1[get_byte(0, B)] ^ SBOX2[get_byte(2, B)] ^ SBOX3[get_byte(4, B)] ^ SBOX4[get_byte(6, B)]; A *= mul; C ^= X[3]; A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; B *= mul; A ^= X[4]; B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; C *= mul; B ^= X[5]; C -= SBOX1[get_byte(7, B)] ^ SBOX2[get_byte(5, B)] ^ SBOX3[get_byte(3, B)] ^ SBOX4[get_byte(1, B)]; A += SBOX1[get_byte(0, B)] ^ SBOX2[get_byte(2, B)] ^ SBOX3[get_byte(4, B)] ^ SBOX4[get_byte(6, B)]; A *= mul; C ^= X[6]; A -= SBOX1[get_byte(7, C)] ^ SBOX2[get_byte(5, C)] ^ SBOX3[get_byte(3, C)] ^ SBOX4[get_byte(1, C)]; B += SBOX1[get_byte(0, C)] ^ SBOX2[get_byte(2, C)] ^ SBOX3[get_byte(4, C)] ^ SBOX4[get_byte(6, C)]; B *= mul; A ^= X[7]; B -= SBOX1[get_byte(7, A)] ^ SBOX2[get_byte(5, A)] ^ SBOX3[get_byte(3, A)] ^ SBOX4[get_byte(1, A)]; C += SBOX1[get_byte(0, A)] ^ SBOX2[get_byte(2, A)] ^ SBOX3[get_byte(4, A)] ^ SBOX4[get_byte(6, A)]; C *= mul; } /* * Clear memory of sensitive data */ void Tiger::clear() { MDx_HashFunction::clear(); zeroise(m_X); m_digest[0] = 0x0123456789ABCDEF; m_digest[1] = 0xFEDCBA9876543210; m_digest[2] = 0xF096A5B4C3B2E187; } /* * Return the name of this type */ std::string Tiger::name() const { return "Tiger(" + std::to_string(output_length()) + "," + std::to_string(m_passes) + ")"; } /* * Tiger Constructor */ Tiger::Tiger(size_t hash_len, size_t passes) : MDx_HashFunction(64, false, false), m_X(8), m_digest(3), m_hash_len(hash_len), m_passes(passes) { if(output_length() != 16 && output_length() != 20 && output_length() != 24) throw Invalid_Argument("Tiger: Illegal hash output size: " + std::to_string(output_length())); if(passes < 3) throw Invalid_Argument("Tiger: Invalid number of passes: " + std::to_string(passes)); clear(); } } botan-2.4.0/src/lib/hash/tiger/tiger.h000066400000000000000000000025241322470703100174770ustar00rootroot00000000000000/* * Tiger * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TIGER_H_ #define BOTAN_TIGER_H_ #include namespace Botan { /** * Tiger */ class BOTAN_PUBLIC_API(2,0) Tiger final : public MDx_HashFunction { public: std::string name() const override; size_t output_length() const override { return m_hash_len; } HashFunction* clone() const override { return new Tiger(output_length(), m_passes); } std::unique_ptr copy_state() const override; void clear() override; /** * @param out_size specifies the output length; can be 16, 20, or 24 * @param passes to make in the algorithm */ Tiger(size_t out_size = 24, size_t passes = 3); private: void compress_n(const uint8_t[], size_t block) override; void copy_out(uint8_t[]) override; static void pass(uint64_t& A, uint64_t& B, uint64_t& C, const secure_vector& M, uint8_t mul); static const uint64_t SBOX1[256]; static const uint64_t SBOX2[256]; static const uint64_t SBOX3[256]; static const uint64_t SBOX4[256]; secure_vector m_X, m_digest; const size_t m_hash_len, m_passes; }; } #endif botan-2.4.0/src/lib/hash/whirlpool/000077500000000000000000000000001322470703100171165ustar00rootroot00000000000000botan-2.4.0/src/lib/hash/whirlpool/info.txt000066400000000000000000000001141322470703100206060ustar00rootroot00000000000000 WHIRLPOOL -> 20131128 mdx_hash botan-2.4.0/src/lib/hash/whirlpool/whirlpool.cpp000066400000000000000000000132701322470703100216440ustar00rootroot00000000000000/* * Whirlpool * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::unique_ptr Whirlpool::copy_state() const { return std::unique_ptr(new Whirlpool(*this)); } /* * Whirlpool Compression Function */ void Whirlpool::compress_n(const uint8_t in[], size_t blocks) { static const uint64_t RC[10] = { 0x1823C6E887B8014F, 0x36A6D2F5796F9152, 0x60BC9B8EA30C7B35, 0x1DE0D7C22E4BFE57, 0x157737E59FF04ADA, 0x58C9290AB1A06B85, 0xBD5D10F4CB3E0567, 0xE427418BA77D95D8, 0xFBEE7C66DD17479E, 0xCA2DBF07AD5A8333 }; for(size_t i = 0; i != blocks; ++i) { load_be(m_M.data(), in, m_M.size()); uint64_t K0, K1, K2, K3, K4, K5, K6, K7; K0 = m_digest[0]; K1 = m_digest[1]; K2 = m_digest[2]; K3 = m_digest[3]; K4 = m_digest[4]; K5 = m_digest[5]; K6 = m_digest[6]; K7 = m_digest[7]; uint64_t B0, B1, B2, B3, B4, B5, B6, B7; B0 = K0 ^ m_M[0]; B1 = K1 ^ m_M[1]; B2 = K2 ^ m_M[2]; B3 = K3 ^ m_M[3]; B4 = K4 ^ m_M[4]; B5 = K5 ^ m_M[5]; B6 = K6 ^ m_M[6]; B7 = K7 ^ m_M[7]; for(size_t j = 0; j != 10; ++j) { uint64_t T0, T1, T2, T3, T4, T5, T6, T7; T0 = C0[get_byte(0, K0)] ^ C1[get_byte(1, K7)] ^ C2[get_byte(2, K6)] ^ C3[get_byte(3, K5)] ^ C4[get_byte(4, K4)] ^ C5[get_byte(5, K3)] ^ C6[get_byte(6, K2)] ^ C7[get_byte(7, K1)] ^ RC[j]; T1 = C0[get_byte(0, K1)] ^ C1[get_byte(1, K0)] ^ C2[get_byte(2, K7)] ^ C3[get_byte(3, K6)] ^ C4[get_byte(4, K5)] ^ C5[get_byte(5, K4)] ^ C6[get_byte(6, K3)] ^ C7[get_byte(7, K2)]; T2 = C0[get_byte(0, K2)] ^ C1[get_byte(1, K1)] ^ C2[get_byte(2, K0)] ^ C3[get_byte(3, K7)] ^ C4[get_byte(4, K6)] ^ C5[get_byte(5, K5)] ^ C6[get_byte(6, K4)] ^ C7[get_byte(7, K3)]; T3 = C0[get_byte(0, K3)] ^ C1[get_byte(1, K2)] ^ C2[get_byte(2, K1)] ^ C3[get_byte(3, K0)] ^ C4[get_byte(4, K7)] ^ C5[get_byte(5, K6)] ^ C6[get_byte(6, K5)] ^ C7[get_byte(7, K4)]; T4 = C0[get_byte(0, K4)] ^ C1[get_byte(1, K3)] ^ C2[get_byte(2, K2)] ^ C3[get_byte(3, K1)] ^ C4[get_byte(4, K0)] ^ C5[get_byte(5, K7)] ^ C6[get_byte(6, K6)] ^ C7[get_byte(7, K5)]; T5 = C0[get_byte(0, K5)] ^ C1[get_byte(1, K4)] ^ C2[get_byte(2, K3)] ^ C3[get_byte(3, K2)] ^ C4[get_byte(4, K1)] ^ C5[get_byte(5, K0)] ^ C6[get_byte(6, K7)] ^ C7[get_byte(7, K6)]; T6 = C0[get_byte(0, K6)] ^ C1[get_byte(1, K5)] ^ C2[get_byte(2, K4)] ^ C3[get_byte(3, K3)] ^ C4[get_byte(4, K2)] ^ C5[get_byte(5, K1)] ^ C6[get_byte(6, K0)] ^ C7[get_byte(7, K7)]; T7 = C0[get_byte(0, K7)] ^ C1[get_byte(1, K6)] ^ C2[get_byte(2, K5)] ^ C3[get_byte(3, K4)] ^ C4[get_byte(4, K3)] ^ C5[get_byte(5, K2)] ^ C6[get_byte(6, K1)] ^ C7[get_byte(7, K0)]; K0 = T0; K1 = T1; K2 = T2; K3 = T3; K4 = T4; K5 = T5; K6 = T6; K7 = T7; T0 = C0[get_byte(0, B0)] ^ C1[get_byte(1, B7)] ^ C2[get_byte(2, B6)] ^ C3[get_byte(3, B5)] ^ C4[get_byte(4, B4)] ^ C5[get_byte(5, B3)] ^ C6[get_byte(6, B2)] ^ C7[get_byte(7, B1)] ^ K0; T1 = C0[get_byte(0, B1)] ^ C1[get_byte(1, B0)] ^ C2[get_byte(2, B7)] ^ C3[get_byte(3, B6)] ^ C4[get_byte(4, B5)] ^ C5[get_byte(5, B4)] ^ C6[get_byte(6, B3)] ^ C7[get_byte(7, B2)] ^ K1; T2 = C0[get_byte(0, B2)] ^ C1[get_byte(1, B1)] ^ C2[get_byte(2, B0)] ^ C3[get_byte(3, B7)] ^ C4[get_byte(4, B6)] ^ C5[get_byte(5, B5)] ^ C6[get_byte(6, B4)] ^ C7[get_byte(7, B3)] ^ K2; T3 = C0[get_byte(0, B3)] ^ C1[get_byte(1, B2)] ^ C2[get_byte(2, B1)] ^ C3[get_byte(3, B0)] ^ C4[get_byte(4, B7)] ^ C5[get_byte(5, B6)] ^ C6[get_byte(6, B5)] ^ C7[get_byte(7, B4)] ^ K3; T4 = C0[get_byte(0, B4)] ^ C1[get_byte(1, B3)] ^ C2[get_byte(2, B2)] ^ C3[get_byte(3, B1)] ^ C4[get_byte(4, B0)] ^ C5[get_byte(5, B7)] ^ C6[get_byte(6, B6)] ^ C7[get_byte(7, B5)] ^ K4; T5 = C0[get_byte(0, B5)] ^ C1[get_byte(1, B4)] ^ C2[get_byte(2, B3)] ^ C3[get_byte(3, B2)] ^ C4[get_byte(4, B1)] ^ C5[get_byte(5, B0)] ^ C6[get_byte(6, B7)] ^ C7[get_byte(7, B6)] ^ K5; T6 = C0[get_byte(0, B6)] ^ C1[get_byte(1, B5)] ^ C2[get_byte(2, B4)] ^ C3[get_byte(3, B3)] ^ C4[get_byte(4, B2)] ^ C5[get_byte(5, B1)] ^ C6[get_byte(6, B0)] ^ C7[get_byte(7, B7)] ^ K6; T7 = C0[get_byte(0, B7)] ^ C1[get_byte(1, B6)] ^ C2[get_byte(2, B5)] ^ C3[get_byte(3, B4)] ^ C4[get_byte(4, B3)] ^ C5[get_byte(5, B2)] ^ C6[get_byte(6, B1)] ^ C7[get_byte(7, B0)] ^ K7; B0 = T0; B1 = T1; B2 = T2; B3 = T3; B4 = T4; B5 = T5; B6 = T6; B7 = T7; } m_digest[0] ^= B0 ^ m_M[0]; m_digest[1] ^= B1 ^ m_M[1]; m_digest[2] ^= B2 ^ m_M[2]; m_digest[3] ^= B3 ^ m_M[3]; m_digest[4] ^= B4 ^ m_M[4]; m_digest[5] ^= B5 ^ m_M[5]; m_digest[6] ^= B6 ^ m_M[6]; m_digest[7] ^= B7 ^ m_M[7]; in += hash_block_size(); } } /* * Copy out the digest */ void Whirlpool::copy_out(uint8_t output[]) { copy_out_vec_be(output, output_length(), m_digest); } /* * Clear memory of sensitive data */ void Whirlpool::clear() { MDx_HashFunction::clear(); zeroise(m_M); zeroise(m_digest); } } botan-2.4.0/src/lib/hash/whirlpool/whrl_tab.cpp000066400000000000000000001210061322470703100214240ustar00rootroot00000000000000/* * Diffusion Tables for Whirlpool * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { const uint64_t Whirlpool::C0[256] = { 0x18186018C07830D8, 0x23238C2305AF4626, 0xC6C63FC67EF991B8, 0xE8E887E8136FCDFB, 0x878726874CA113CB, 0xB8B8DAB8A9626D11, 0x0101040108050209, 0x4F4F214F426E9E0D, 0x3636D836ADEE6C9B, 0xA6A6A2A6590451FF, 0xD2D26FD2DEBDB90C, 0xF5F5F3F5FB06F70E, 0x7979F979EF80F296, 0x6F6FA16F5FCEDE30, 0x91917E91FCEF3F6D, 0x52525552AA07A4F8, 0x60609D6027FDC047, 0xBCBCCABC89766535, 0x9B9B569BACCD2B37, 0x8E8E028E048C018A, 0xA3A3B6A371155BD2, 0x0C0C300C603C186C, 0x7B7BF17BFF8AF684, 0x3535D435B5E16A80, 0x1D1D741DE8693AF5, 0xE0E0A7E05347DDB3, 0xD7D77BD7F6ACB321, 0xC2C22FC25EED999C, 0x2E2EB82E6D965C43, 0x4B4B314B627A9629, 0xFEFEDFFEA321E15D, 0x575741578216AED5, 0x15155415A8412ABD, 0x7777C1779FB6EEE8, 0x3737DC37A5EB6E92, 0xE5E5B3E57B56D79E, 0x9F9F469F8CD92313, 0xF0F0E7F0D317FD23, 0x4A4A354A6A7F9420, 0xDADA4FDA9E95A944, 0x58587D58FA25B0A2, 0xC9C903C906CA8FCF, 0x2929A429558D527C, 0x0A0A280A5022145A, 0xB1B1FEB1E14F7F50, 0xA0A0BAA0691A5DC9, 0x6B6BB16B7FDAD614, 0x85852E855CAB17D9, 0xBDBDCEBD8173673C, 0x5D5D695DD234BA8F, 0x1010401080502090, 0xF4F4F7F4F303F507, 0xCBCB0BCB16C08BDD, 0x3E3EF83EEDC67CD3, 0x0505140528110A2D, 0x676781671FE6CE78, 0xE4E4B7E47353D597, 0x27279C2725BB4E02, 0x4141194132588273, 0x8B8B168B2C9D0BA7, 0xA7A7A6A7510153F6, 0x7D7DE97DCF94FAB2, 0x95956E95DCFB3749, 0xD8D847D88E9FAD56, 0xFBFBCBFB8B30EB70, 0xEEEE9FEE2371C1CD, 0x7C7CED7CC791F8BB, 0x6666856617E3CC71, 0xDDDD53DDA68EA77B, 0x17175C17B84B2EAF, 0x4747014702468E45, 0x9E9E429E84DC211A, 0xCACA0FCA1EC589D4, 0x2D2DB42D75995A58, 0xBFBFC6BF9179632E, 0x07071C07381B0E3F, 0xADAD8EAD012347AC, 0x5A5A755AEA2FB4B0, 0x838336836CB51BEF, 0x3333CC3385FF66B6, 0x636391633FF2C65C, 0x02020802100A0412, 0xAAAA92AA39384993, 0x7171D971AFA8E2DE, 0xC8C807C80ECF8DC6, 0x19196419C87D32D1, 0x494939497270923B, 0xD9D943D9869AAF5F, 0xF2F2EFF2C31DF931, 0xE3E3ABE34B48DBA8, 0x5B5B715BE22AB6B9, 0x88881A8834920DBC, 0x9A9A529AA4C8293E, 0x262698262DBE4C0B, 0x3232C8328DFA64BF, 0xB0B0FAB0E94A7D59, 0xE9E983E91B6ACFF2, 0x0F0F3C0F78331E77, 0xD5D573D5E6A6B733, 0x80803A8074BA1DF4, 0xBEBEC2BE997C6127, 0xCDCD13CD26DE87EB, 0x3434D034BDE46889, 0x48483D487A759032, 0xFFFFDBFFAB24E354, 0x7A7AF57AF78FF48D, 0x90907A90F4EA3D64, 0x5F5F615FC23EBE9D, 0x202080201DA0403D, 0x6868BD6867D5D00F, 0x1A1A681AD07234CA, 0xAEAE82AE192C41B7, 0xB4B4EAB4C95E757D, 0x54544D549A19A8CE, 0x93937693ECE53B7F, 0x222288220DAA442F, 0x64648D6407E9C863, 0xF1F1E3F1DB12FF2A, 0x7373D173BFA2E6CC, 0x12124812905A2482, 0x40401D403A5D807A, 0x0808200840281048, 0xC3C32BC356E89B95, 0xECEC97EC337BC5DF, 0xDBDB4BDB9690AB4D, 0xA1A1BEA1611F5FC0, 0x8D8D0E8D1C830791, 0x3D3DF43DF5C97AC8, 0x97976697CCF1335B, 0x0000000000000000, 0xCFCF1BCF36D483F9, 0x2B2BAC2B4587566E, 0x7676C57697B3ECE1, 0x8282328264B019E6, 0xD6D67FD6FEA9B128, 0x1B1B6C1BD87736C3, 0xB5B5EEB5C15B7774, 0xAFAF86AF112943BE, 0x6A6AB56A77DFD41D, 0x50505D50BA0DA0EA, 0x45450945124C8A57, 0xF3F3EBF3CB18FB38, 0x3030C0309DF060AD, 0xEFEF9BEF2B74C3C4, 0x3F3FFC3FE5C37EDA, 0x55554955921CAAC7, 0xA2A2B2A2791059DB, 0xEAEA8FEA0365C9E9, 0x656589650FECCA6A, 0xBABAD2BAB9686903, 0x2F2FBC2F65935E4A, 0xC0C027C04EE79D8E, 0xDEDE5FDEBE81A160, 0x1C1C701CE06C38FC, 0xFDFDD3FDBB2EE746, 0x4D4D294D52649A1F, 0x92927292E4E03976, 0x7575C9758FBCEAFA, 0x06061806301E0C36, 0x8A8A128A249809AE, 0xB2B2F2B2F940794B, 0xE6E6BFE66359D185, 0x0E0E380E70361C7E, 0x1F1F7C1FF8633EE7, 0x6262956237F7C455, 0xD4D477D4EEA3B53A, 0xA8A89AA829324D81, 0x96966296C4F43152, 0xF9F9C3F99B3AEF62, 0xC5C533C566F697A3, 0x2525942535B14A10, 0x59597959F220B2AB, 0x84842A8454AE15D0, 0x7272D572B7A7E4C5, 0x3939E439D5DD72EC, 0x4C4C2D4C5A619816, 0x5E5E655ECA3BBC94, 0x7878FD78E785F09F, 0x3838E038DDD870E5, 0x8C8C0A8C14860598, 0xD1D163D1C6B2BF17, 0xA5A5AEA5410B57E4, 0xE2E2AFE2434DD9A1, 0x616199612FF8C24E, 0xB3B3F6B3F1457B42, 0x2121842115A54234, 0x9C9C4A9C94D62508, 0x1E1E781EF0663CEE, 0x4343114322528661, 0xC7C73BC776FC93B1, 0xFCFCD7FCB32BE54F, 0x0404100420140824, 0x51515951B208A2E3, 0x99995E99BCC72F25, 0x6D6DA96D4FC4DA22, 0x0D0D340D68391A65, 0xFAFACFFA8335E979, 0xDFDF5BDFB684A369, 0x7E7EE57ED79BFCA9, 0x242490243DB44819, 0x3B3BEC3BC5D776FE, 0xABAB96AB313D4B9A, 0xCECE1FCE3ED181F0, 0x1111441188552299, 0x8F8F068F0C890383, 0x4E4E254E4A6B9C04, 0xB7B7E6B7D1517366, 0xEBEB8BEB0B60CBE0, 0x3C3CF03CFDCC78C1, 0x81813E817CBF1FFD, 0x94946A94D4FE3540, 0xF7F7FBF7EB0CF31C, 0xB9B9DEB9A1676F18, 0x13134C13985F268B, 0x2C2CB02C7D9C5851, 0xD3D36BD3D6B8BB05, 0xE7E7BBE76B5CD38C, 0x6E6EA56E57CBDC39, 0xC4C437C46EF395AA, 0x03030C03180F061B, 0x565645568A13ACDC, 0x44440D441A49885E, 0x7F7FE17FDF9EFEA0, 0xA9A99EA921374F88, 0x2A2AA82A4D825467, 0xBBBBD6BBB16D6B0A, 0xC1C123C146E29F87, 0x53535153A202A6F1, 0xDCDC57DCAE8BA572, 0x0B0B2C0B58271653, 0x9D9D4E9D9CD32701, 0x6C6CAD6C47C1D82B, 0x3131C43195F562A4, 0x7474CD7487B9E8F3, 0xF6F6FFF6E309F115, 0x464605460A438C4C, 0xACAC8AAC092645A5, 0x89891E893C970FB5, 0x14145014A04428B4, 0xE1E1A3E15B42DFBA, 0x16165816B04E2CA6, 0x3A3AE83ACDD274F7, 0x6969B9696FD0D206, 0x09092409482D1241, 0x7070DD70A7ADE0D7, 0xB6B6E2B6D954716F, 0xD0D067D0CEB7BD1E, 0xEDED93ED3B7EC7D6, 0xCCCC17CC2EDB85E2, 0x424215422A578468, 0x98985A98B4C22D2C, 0xA4A4AAA4490E55ED, 0x2828A0285D885075, 0x5C5C6D5CDA31B886, 0xF8F8C7F8933FED6B, 0x8686228644A411C2 }; const uint64_t Whirlpool::C1[256] = { 0xD818186018C07830, 0x2623238C2305AF46, 0xB8C6C63FC67EF991, 0xFBE8E887E8136FCD, 0xCB878726874CA113, 0x11B8B8DAB8A9626D, 0x0901010401080502, 0x0D4F4F214F426E9E, 0x9B3636D836ADEE6C, 0xFFA6A6A2A6590451, 0x0CD2D26FD2DEBDB9, 0x0EF5F5F3F5FB06F7, 0x967979F979EF80F2, 0x306F6FA16F5FCEDE, 0x6D91917E91FCEF3F, 0xF852525552AA07A4, 0x4760609D6027FDC0, 0x35BCBCCABC897665, 0x379B9B569BACCD2B, 0x8A8E8E028E048C01, 0xD2A3A3B6A371155B, 0x6C0C0C300C603C18, 0x847B7BF17BFF8AF6, 0x803535D435B5E16A, 0xF51D1D741DE8693A, 0xB3E0E0A7E05347DD, 0x21D7D77BD7F6ACB3, 0x9CC2C22FC25EED99, 0x432E2EB82E6D965C, 0x294B4B314B627A96, 0x5DFEFEDFFEA321E1, 0xD5575741578216AE, 0xBD15155415A8412A, 0xE87777C1779FB6EE, 0x923737DC37A5EB6E, 0x9EE5E5B3E57B56D7, 0x139F9F469F8CD923, 0x23F0F0E7F0D317FD, 0x204A4A354A6A7F94, 0x44DADA4FDA9E95A9, 0xA258587D58FA25B0, 0xCFC9C903C906CA8F, 0x7C2929A429558D52, 0x5A0A0A280A502214, 0x50B1B1FEB1E14F7F, 0xC9A0A0BAA0691A5D, 0x146B6BB16B7FDAD6, 0xD985852E855CAB17, 0x3CBDBDCEBD817367, 0x8F5D5D695DD234BA, 0x9010104010805020, 0x07F4F4F7F4F303F5, 0xDDCBCB0BCB16C08B, 0xD33E3EF83EEDC67C, 0x2D0505140528110A, 0x78676781671FE6CE, 0x97E4E4B7E47353D5, 0x0227279C2725BB4E, 0x7341411941325882, 0xA78B8B168B2C9D0B, 0xF6A7A7A6A7510153, 0xB27D7DE97DCF94FA, 0x4995956E95DCFB37, 0x56D8D847D88E9FAD, 0x70FBFBCBFB8B30EB, 0xCDEEEE9FEE2371C1, 0xBB7C7CED7CC791F8, 0x716666856617E3CC, 0x7BDDDD53DDA68EA7, 0xAF17175C17B84B2E, 0x454747014702468E, 0x1A9E9E429E84DC21, 0xD4CACA0FCA1EC589, 0x582D2DB42D75995A, 0x2EBFBFC6BF917963, 0x3F07071C07381B0E, 0xACADAD8EAD012347, 0xB05A5A755AEA2FB4, 0xEF838336836CB51B, 0xB63333CC3385FF66, 0x5C636391633FF2C6, 0x1202020802100A04, 0x93AAAA92AA393849, 0xDE7171D971AFA8E2, 0xC6C8C807C80ECF8D, 0xD119196419C87D32, 0x3B49493949727092, 0x5FD9D943D9869AAF, 0x31F2F2EFF2C31DF9, 0xA8E3E3ABE34B48DB, 0xB95B5B715BE22AB6, 0xBC88881A8834920D, 0x3E9A9A529AA4C829, 0x0B262698262DBE4C, 0xBF3232C8328DFA64, 0x59B0B0FAB0E94A7D, 0xF2E9E983E91B6ACF, 0x770F0F3C0F78331E, 0x33D5D573D5E6A6B7, 0xF480803A8074BA1D, 0x27BEBEC2BE997C61, 0xEBCDCD13CD26DE87, 0x893434D034BDE468, 0x3248483D487A7590, 0x54FFFFDBFFAB24E3, 0x8D7A7AF57AF78FF4, 0x6490907A90F4EA3D, 0x9D5F5F615FC23EBE, 0x3D202080201DA040, 0x0F6868BD6867D5D0, 0xCA1A1A681AD07234, 0xB7AEAE82AE192C41, 0x7DB4B4EAB4C95E75, 0xCE54544D549A19A8, 0x7F93937693ECE53B, 0x2F222288220DAA44, 0x6364648D6407E9C8, 0x2AF1F1E3F1DB12FF, 0xCC7373D173BFA2E6, 0x8212124812905A24, 0x7A40401D403A5D80, 0x4808082008402810, 0x95C3C32BC356E89B, 0xDFECEC97EC337BC5, 0x4DDBDB4BDB9690AB, 0xC0A1A1BEA1611F5F, 0x918D8D0E8D1C8307, 0xC83D3DF43DF5C97A, 0x5B97976697CCF133, 0x0000000000000000, 0xF9CFCF1BCF36D483, 0x6E2B2BAC2B458756, 0xE17676C57697B3EC, 0xE68282328264B019, 0x28D6D67FD6FEA9B1, 0xC31B1B6C1BD87736, 0x74B5B5EEB5C15B77, 0xBEAFAF86AF112943, 0x1D6A6AB56A77DFD4, 0xEA50505D50BA0DA0, 0x5745450945124C8A, 0x38F3F3EBF3CB18FB, 0xAD3030C0309DF060, 0xC4EFEF9BEF2B74C3, 0xDA3F3FFC3FE5C37E, 0xC755554955921CAA, 0xDBA2A2B2A2791059, 0xE9EAEA8FEA0365C9, 0x6A656589650FECCA, 0x03BABAD2BAB96869, 0x4A2F2FBC2F65935E, 0x8EC0C027C04EE79D, 0x60DEDE5FDEBE81A1, 0xFC1C1C701CE06C38, 0x46FDFDD3FDBB2EE7, 0x1F4D4D294D52649A, 0x7692927292E4E039, 0xFA7575C9758FBCEA, 0x3606061806301E0C, 0xAE8A8A128A249809, 0x4BB2B2F2B2F94079, 0x85E6E6BFE66359D1, 0x7E0E0E380E70361C, 0xE71F1F7C1FF8633E, 0x556262956237F7C4, 0x3AD4D477D4EEA3B5, 0x81A8A89AA829324D, 0x5296966296C4F431, 0x62F9F9C3F99B3AEF, 0xA3C5C533C566F697, 0x102525942535B14A, 0xAB59597959F220B2, 0xD084842A8454AE15, 0xC57272D572B7A7E4, 0xEC3939E439D5DD72, 0x164C4C2D4C5A6198, 0x945E5E655ECA3BBC, 0x9F7878FD78E785F0, 0xE53838E038DDD870, 0x988C8C0A8C148605, 0x17D1D163D1C6B2BF, 0xE4A5A5AEA5410B57, 0xA1E2E2AFE2434DD9, 0x4E616199612FF8C2, 0x42B3B3F6B3F1457B, 0x342121842115A542, 0x089C9C4A9C94D625, 0xEE1E1E781EF0663C, 0x6143431143225286, 0xB1C7C73BC776FC93, 0x4FFCFCD7FCB32BE5, 0x2404041004201408, 0xE351515951B208A2, 0x2599995E99BCC72F, 0x226D6DA96D4FC4DA, 0x650D0D340D68391A, 0x79FAFACFFA8335E9, 0x69DFDF5BDFB684A3, 0xA97E7EE57ED79BFC, 0x19242490243DB448, 0xFE3B3BEC3BC5D776, 0x9AABAB96AB313D4B, 0xF0CECE1FCE3ED181, 0x9911114411885522, 0x838F8F068F0C8903, 0x044E4E254E4A6B9C, 0x66B7B7E6B7D15173, 0xE0EBEB8BEB0B60CB, 0xC13C3CF03CFDCC78, 0xFD81813E817CBF1F, 0x4094946A94D4FE35, 0x1CF7F7FBF7EB0CF3, 0x18B9B9DEB9A1676F, 0x8B13134C13985F26, 0x512C2CB02C7D9C58, 0x05D3D36BD3D6B8BB, 0x8CE7E7BBE76B5CD3, 0x396E6EA56E57CBDC, 0xAAC4C437C46EF395, 0x1B03030C03180F06, 0xDC565645568A13AC, 0x5E44440D441A4988, 0xA07F7FE17FDF9EFE, 0x88A9A99EA921374F, 0x672A2AA82A4D8254, 0x0ABBBBD6BBB16D6B, 0x87C1C123C146E29F, 0xF153535153A202A6, 0x72DCDC57DCAE8BA5, 0x530B0B2C0B582716, 0x019D9D4E9D9CD327, 0x2B6C6CAD6C47C1D8, 0xA43131C43195F562, 0xF37474CD7487B9E8, 0x15F6F6FFF6E309F1, 0x4C464605460A438C, 0xA5ACAC8AAC092645, 0xB589891E893C970F, 0xB414145014A04428, 0xBAE1E1A3E15B42DF, 0xA616165816B04E2C, 0xF73A3AE83ACDD274, 0x066969B9696FD0D2, 0x4109092409482D12, 0xD77070DD70A7ADE0, 0x6FB6B6E2B6D95471, 0x1ED0D067D0CEB7BD, 0xD6EDED93ED3B7EC7, 0xE2CCCC17CC2EDB85, 0x68424215422A5784, 0x2C98985A98B4C22D, 0xEDA4A4AAA4490E55, 0x752828A0285D8850, 0x865C5C6D5CDA31B8, 0x6BF8F8C7F8933FED, 0xC28686228644A411 }; const uint64_t Whirlpool::C2[256] = { 0x30D818186018C078, 0x462623238C2305AF, 0x91B8C6C63FC67EF9, 0xCDFBE8E887E8136F, 0x13CB878726874CA1, 0x6D11B8B8DAB8A962, 0x0209010104010805, 0x9E0D4F4F214F426E, 0x6C9B3636D836ADEE, 0x51FFA6A6A2A65904, 0xB90CD2D26FD2DEBD, 0xF70EF5F5F3F5FB06, 0xF2967979F979EF80, 0xDE306F6FA16F5FCE, 0x3F6D91917E91FCEF, 0xA4F852525552AA07, 0xC04760609D6027FD, 0x6535BCBCCABC8976, 0x2B379B9B569BACCD, 0x018A8E8E028E048C, 0x5BD2A3A3B6A37115, 0x186C0C0C300C603C, 0xF6847B7BF17BFF8A, 0x6A803535D435B5E1, 0x3AF51D1D741DE869, 0xDDB3E0E0A7E05347, 0xB321D7D77BD7F6AC, 0x999CC2C22FC25EED, 0x5C432E2EB82E6D96, 0x96294B4B314B627A, 0xE15DFEFEDFFEA321, 0xAED5575741578216, 0x2ABD15155415A841, 0xEEE87777C1779FB6, 0x6E923737DC37A5EB, 0xD79EE5E5B3E57B56, 0x23139F9F469F8CD9, 0xFD23F0F0E7F0D317, 0x94204A4A354A6A7F, 0xA944DADA4FDA9E95, 0xB0A258587D58FA25, 0x8FCFC9C903C906CA, 0x527C2929A429558D, 0x145A0A0A280A5022, 0x7F50B1B1FEB1E14F, 0x5DC9A0A0BAA0691A, 0xD6146B6BB16B7FDA, 0x17D985852E855CAB, 0x673CBDBDCEBD8173, 0xBA8F5D5D695DD234, 0x2090101040108050, 0xF507F4F4F7F4F303, 0x8BDDCBCB0BCB16C0, 0x7CD33E3EF83EEDC6, 0x0A2D050514052811, 0xCE78676781671FE6, 0xD597E4E4B7E47353, 0x4E0227279C2725BB, 0x8273414119413258, 0x0BA78B8B168B2C9D, 0x53F6A7A7A6A75101, 0xFAB27D7DE97DCF94, 0x374995956E95DCFB, 0xAD56D8D847D88E9F, 0xEB70FBFBCBFB8B30, 0xC1CDEEEE9FEE2371, 0xF8BB7C7CED7CC791, 0xCC716666856617E3, 0xA77BDDDD53DDA68E, 0x2EAF17175C17B84B, 0x8E45474701470246, 0x211A9E9E429E84DC, 0x89D4CACA0FCA1EC5, 0x5A582D2DB42D7599, 0x632EBFBFC6BF9179, 0x0E3F07071C07381B, 0x47ACADAD8EAD0123, 0xB4B05A5A755AEA2F, 0x1BEF838336836CB5, 0x66B63333CC3385FF, 0xC65C636391633FF2, 0x041202020802100A, 0x4993AAAA92AA3938, 0xE2DE7171D971AFA8, 0x8DC6C8C807C80ECF, 0x32D119196419C87D, 0x923B494939497270, 0xAF5FD9D943D9869A, 0xF931F2F2EFF2C31D, 0xDBA8E3E3ABE34B48, 0xB6B95B5B715BE22A, 0x0DBC88881A883492, 0x293E9A9A529AA4C8, 0x4C0B262698262DBE, 0x64BF3232C8328DFA, 0x7D59B0B0FAB0E94A, 0xCFF2E9E983E91B6A, 0x1E770F0F3C0F7833, 0xB733D5D573D5E6A6, 0x1DF480803A8074BA, 0x6127BEBEC2BE997C, 0x87EBCDCD13CD26DE, 0x68893434D034BDE4, 0x903248483D487A75, 0xE354FFFFDBFFAB24, 0xF48D7A7AF57AF78F, 0x3D6490907A90F4EA, 0xBE9D5F5F615FC23E, 0x403D202080201DA0, 0xD00F6868BD6867D5, 0x34CA1A1A681AD072, 0x41B7AEAE82AE192C, 0x757DB4B4EAB4C95E, 0xA8CE54544D549A19, 0x3B7F93937693ECE5, 0x442F222288220DAA, 0xC86364648D6407E9, 0xFF2AF1F1E3F1DB12, 0xE6CC7373D173BFA2, 0x248212124812905A, 0x807A40401D403A5D, 0x1048080820084028, 0x9B95C3C32BC356E8, 0xC5DFECEC97EC337B, 0xAB4DDBDB4BDB9690, 0x5FC0A1A1BEA1611F, 0x07918D8D0E8D1C83, 0x7AC83D3DF43DF5C9, 0x335B97976697CCF1, 0x0000000000000000, 0x83F9CFCF1BCF36D4, 0x566E2B2BAC2B4587, 0xECE17676C57697B3, 0x19E68282328264B0, 0xB128D6D67FD6FEA9, 0x36C31B1B6C1BD877, 0x7774B5B5EEB5C15B, 0x43BEAFAF86AF1129, 0xD41D6A6AB56A77DF, 0xA0EA50505D50BA0D, 0x8A5745450945124C, 0xFB38F3F3EBF3CB18, 0x60AD3030C0309DF0, 0xC3C4EFEF9BEF2B74, 0x7EDA3F3FFC3FE5C3, 0xAAC755554955921C, 0x59DBA2A2B2A27910, 0xC9E9EAEA8FEA0365, 0xCA6A656589650FEC, 0x6903BABAD2BAB968, 0x5E4A2F2FBC2F6593, 0x9D8EC0C027C04EE7, 0xA160DEDE5FDEBE81, 0x38FC1C1C701CE06C, 0xE746FDFDD3FDBB2E, 0x9A1F4D4D294D5264, 0x397692927292E4E0, 0xEAFA7575C9758FBC, 0x0C3606061806301E, 0x09AE8A8A128A2498, 0x794BB2B2F2B2F940, 0xD185E6E6BFE66359, 0x1C7E0E0E380E7036, 0x3EE71F1F7C1FF863, 0xC4556262956237F7, 0xB53AD4D477D4EEA3, 0x4D81A8A89AA82932, 0x315296966296C4F4, 0xEF62F9F9C3F99B3A, 0x97A3C5C533C566F6, 0x4A102525942535B1, 0xB2AB59597959F220, 0x15D084842A8454AE, 0xE4C57272D572B7A7, 0x72EC3939E439D5DD, 0x98164C4C2D4C5A61, 0xBC945E5E655ECA3B, 0xF09F7878FD78E785, 0x70E53838E038DDD8, 0x05988C8C0A8C1486, 0xBF17D1D163D1C6B2, 0x57E4A5A5AEA5410B, 0xD9A1E2E2AFE2434D, 0xC24E616199612FF8, 0x7B42B3B3F6B3F145, 0x42342121842115A5, 0x25089C9C4A9C94D6, 0x3CEE1E1E781EF066, 0x8661434311432252, 0x93B1C7C73BC776FC, 0xE54FFCFCD7FCB32B, 0x0824040410042014, 0xA2E351515951B208, 0x2F2599995E99BCC7, 0xDA226D6DA96D4FC4, 0x1A650D0D340D6839, 0xE979FAFACFFA8335, 0xA369DFDF5BDFB684, 0xFCA97E7EE57ED79B, 0x4819242490243DB4, 0x76FE3B3BEC3BC5D7, 0x4B9AABAB96AB313D, 0x81F0CECE1FCE3ED1, 0x2299111144118855, 0x03838F8F068F0C89, 0x9C044E4E254E4A6B, 0x7366B7B7E6B7D151, 0xCBE0EBEB8BEB0B60, 0x78C13C3CF03CFDCC, 0x1FFD81813E817CBF, 0x354094946A94D4FE, 0xF31CF7F7FBF7EB0C, 0x6F18B9B9DEB9A167, 0x268B13134C13985F, 0x58512C2CB02C7D9C, 0xBB05D3D36BD3D6B8, 0xD38CE7E7BBE76B5C, 0xDC396E6EA56E57CB, 0x95AAC4C437C46EF3, 0x061B03030C03180F, 0xACDC565645568A13, 0x885E44440D441A49, 0xFEA07F7FE17FDF9E, 0x4F88A9A99EA92137, 0x54672A2AA82A4D82, 0x6B0ABBBBD6BBB16D, 0x9F87C1C123C146E2, 0xA6F153535153A202, 0xA572DCDC57DCAE8B, 0x16530B0B2C0B5827, 0x27019D9D4E9D9CD3, 0xD82B6C6CAD6C47C1, 0x62A43131C43195F5, 0xE8F37474CD7487B9, 0xF115F6F6FFF6E309, 0x8C4C464605460A43, 0x45A5ACAC8AAC0926, 0x0FB589891E893C97, 0x28B414145014A044, 0xDFBAE1E1A3E15B42, 0x2CA616165816B04E, 0x74F73A3AE83ACDD2, 0xD2066969B9696FD0, 0x124109092409482D, 0xE0D77070DD70A7AD, 0x716FB6B6E2B6D954, 0xBD1ED0D067D0CEB7, 0xC7D6EDED93ED3B7E, 0x85E2CCCC17CC2EDB, 0x8468424215422A57, 0x2D2C98985A98B4C2, 0x55EDA4A4AAA4490E, 0x50752828A0285D88, 0xB8865C5C6D5CDA31, 0xED6BF8F8C7F8933F, 0x11C28686228644A4 }; const uint64_t Whirlpool::C3[256] = { 0x7830D818186018C0, 0xAF462623238C2305, 0xF991B8C6C63FC67E, 0x6FCDFBE8E887E813, 0xA113CB878726874C, 0x626D11B8B8DAB8A9, 0x0502090101040108, 0x6E9E0D4F4F214F42, 0xEE6C9B3636D836AD, 0x0451FFA6A6A2A659, 0xBDB90CD2D26FD2DE, 0x06F70EF5F5F3F5FB, 0x80F2967979F979EF, 0xCEDE306F6FA16F5F, 0xEF3F6D91917E91FC, 0x07A4F852525552AA, 0xFDC04760609D6027, 0x766535BCBCCABC89, 0xCD2B379B9B569BAC, 0x8C018A8E8E028E04, 0x155BD2A3A3B6A371, 0x3C186C0C0C300C60, 0x8AF6847B7BF17BFF, 0xE16A803535D435B5, 0x693AF51D1D741DE8, 0x47DDB3E0E0A7E053, 0xACB321D7D77BD7F6, 0xED999CC2C22FC25E, 0x965C432E2EB82E6D, 0x7A96294B4B314B62, 0x21E15DFEFEDFFEA3, 0x16AED55757415782, 0x412ABD15155415A8, 0xB6EEE87777C1779F, 0xEB6E923737DC37A5, 0x56D79EE5E5B3E57B, 0xD923139F9F469F8C, 0x17FD23F0F0E7F0D3, 0x7F94204A4A354A6A, 0x95A944DADA4FDA9E, 0x25B0A258587D58FA, 0xCA8FCFC9C903C906, 0x8D527C2929A42955, 0x22145A0A0A280A50, 0x4F7F50B1B1FEB1E1, 0x1A5DC9A0A0BAA069, 0xDAD6146B6BB16B7F, 0xAB17D985852E855C, 0x73673CBDBDCEBD81, 0x34BA8F5D5D695DD2, 0x5020901010401080, 0x03F507F4F4F7F4F3, 0xC08BDDCBCB0BCB16, 0xC67CD33E3EF83EED, 0x110A2D0505140528, 0xE6CE78676781671F, 0x53D597E4E4B7E473, 0xBB4E0227279C2725, 0x5882734141194132, 0x9D0BA78B8B168B2C, 0x0153F6A7A7A6A751, 0x94FAB27D7DE97DCF, 0xFB374995956E95DC, 0x9FAD56D8D847D88E, 0x30EB70FBFBCBFB8B, 0x71C1CDEEEE9FEE23, 0x91F8BB7C7CED7CC7, 0xE3CC716666856617, 0x8EA77BDDDD53DDA6, 0x4B2EAF17175C17B8, 0x468E454747014702, 0xDC211A9E9E429E84, 0xC589D4CACA0FCA1E, 0x995A582D2DB42D75, 0x79632EBFBFC6BF91, 0x1B0E3F07071C0738, 0x2347ACADAD8EAD01, 0x2FB4B05A5A755AEA, 0xB51BEF838336836C, 0xFF66B63333CC3385, 0xF2C65C636391633F, 0x0A04120202080210, 0x384993AAAA92AA39, 0xA8E2DE7171D971AF, 0xCF8DC6C8C807C80E, 0x7D32D119196419C8, 0x70923B4949394972, 0x9AAF5FD9D943D986, 0x1DF931F2F2EFF2C3, 0x48DBA8E3E3ABE34B, 0x2AB6B95B5B715BE2, 0x920DBC88881A8834, 0xC8293E9A9A529AA4, 0xBE4C0B262698262D, 0xFA64BF3232C8328D, 0x4A7D59B0B0FAB0E9, 0x6ACFF2E9E983E91B, 0x331E770F0F3C0F78, 0xA6B733D5D573D5E6, 0xBA1DF480803A8074, 0x7C6127BEBEC2BE99, 0xDE87EBCDCD13CD26, 0xE468893434D034BD, 0x75903248483D487A, 0x24E354FFFFDBFFAB, 0x8FF48D7A7AF57AF7, 0xEA3D6490907A90F4, 0x3EBE9D5F5F615FC2, 0xA0403D202080201D, 0xD5D00F6868BD6867, 0x7234CA1A1A681AD0, 0x2C41B7AEAE82AE19, 0x5E757DB4B4EAB4C9, 0x19A8CE54544D549A, 0xE53B7F93937693EC, 0xAA442F222288220D, 0xE9C86364648D6407, 0x12FF2AF1F1E3F1DB, 0xA2E6CC7373D173BF, 0x5A24821212481290, 0x5D807A40401D403A, 0x2810480808200840, 0xE89B95C3C32BC356, 0x7BC5DFECEC97EC33, 0x90AB4DDBDB4BDB96, 0x1F5FC0A1A1BEA161, 0x8307918D8D0E8D1C, 0xC97AC83D3DF43DF5, 0xF1335B97976697CC, 0x0000000000000000, 0xD483F9CFCF1BCF36, 0x87566E2B2BAC2B45, 0xB3ECE17676C57697, 0xB019E68282328264, 0xA9B128D6D67FD6FE, 0x7736C31B1B6C1BD8, 0x5B7774B5B5EEB5C1, 0x2943BEAFAF86AF11, 0xDFD41D6A6AB56A77, 0x0DA0EA50505D50BA, 0x4C8A574545094512, 0x18FB38F3F3EBF3CB, 0xF060AD3030C0309D, 0x74C3C4EFEF9BEF2B, 0xC37EDA3F3FFC3FE5, 0x1CAAC75555495592, 0x1059DBA2A2B2A279, 0x65C9E9EAEA8FEA03, 0xECCA6A656589650F, 0x686903BABAD2BAB9, 0x935E4A2F2FBC2F65, 0xE79D8EC0C027C04E, 0x81A160DEDE5FDEBE, 0x6C38FC1C1C701CE0, 0x2EE746FDFDD3FDBB, 0x649A1F4D4D294D52, 0xE0397692927292E4, 0xBCEAFA7575C9758F, 0x1E0C360606180630, 0x9809AE8A8A128A24, 0x40794BB2B2F2B2F9, 0x59D185E6E6BFE663, 0x361C7E0E0E380E70, 0x633EE71F1F7C1FF8, 0xF7C4556262956237, 0xA3B53AD4D477D4EE, 0x324D81A8A89AA829, 0xF4315296966296C4, 0x3AEF62F9F9C3F99B, 0xF697A3C5C533C566, 0xB14A102525942535, 0x20B2AB59597959F2, 0xAE15D084842A8454, 0xA7E4C57272D572B7, 0xDD72EC3939E439D5, 0x6198164C4C2D4C5A, 0x3BBC945E5E655ECA, 0x85F09F7878FD78E7, 0xD870E53838E038DD, 0x8605988C8C0A8C14, 0xB2BF17D1D163D1C6, 0x0B57E4A5A5AEA541, 0x4DD9A1E2E2AFE243, 0xF8C24E616199612F, 0x457B42B3B3F6B3F1, 0xA542342121842115, 0xD625089C9C4A9C94, 0x663CEE1E1E781EF0, 0x5286614343114322, 0xFC93B1C7C73BC776, 0x2BE54FFCFCD7FCB3, 0x1408240404100420, 0x08A2E351515951B2, 0xC72F2599995E99BC, 0xC4DA226D6DA96D4F, 0x391A650D0D340D68, 0x35E979FAFACFFA83, 0x84A369DFDF5BDFB6, 0x9BFCA97E7EE57ED7, 0xB44819242490243D, 0xD776FE3B3BEC3BC5, 0x3D4B9AABAB96AB31, 0xD181F0CECE1FCE3E, 0x5522991111441188, 0x8903838F8F068F0C, 0x6B9C044E4E254E4A, 0x517366B7B7E6B7D1, 0x60CBE0EBEB8BEB0B, 0xCC78C13C3CF03CFD, 0xBF1FFD81813E817C, 0xFE354094946A94D4, 0x0CF31CF7F7FBF7EB, 0x676F18B9B9DEB9A1, 0x5F268B13134C1398, 0x9C58512C2CB02C7D, 0xB8BB05D3D36BD3D6, 0x5CD38CE7E7BBE76B, 0xCBDC396E6EA56E57, 0xF395AAC4C437C46E, 0x0F061B03030C0318, 0x13ACDC565645568A, 0x49885E44440D441A, 0x9EFEA07F7FE17FDF, 0x374F88A9A99EA921, 0x8254672A2AA82A4D, 0x6D6B0ABBBBD6BBB1, 0xE29F87C1C123C146, 0x02A6F153535153A2, 0x8BA572DCDC57DCAE, 0x2716530B0B2C0B58, 0xD327019D9D4E9D9C, 0xC1D82B6C6CAD6C47, 0xF562A43131C43195, 0xB9E8F37474CD7487, 0x09F115F6F6FFF6E3, 0x438C4C464605460A, 0x2645A5ACAC8AAC09, 0x970FB589891E893C, 0x4428B414145014A0, 0x42DFBAE1E1A3E15B, 0x4E2CA616165816B0, 0xD274F73A3AE83ACD, 0xD0D2066969B9696F, 0x2D12410909240948, 0xADE0D77070DD70A7, 0x54716FB6B6E2B6D9, 0xB7BD1ED0D067D0CE, 0x7EC7D6EDED93ED3B, 0xDB85E2CCCC17CC2E, 0x578468424215422A, 0xC22D2C98985A98B4, 0x0E55EDA4A4AAA449, 0x8850752828A0285D, 0x31B8865C5C6D5CDA, 0x3FED6BF8F8C7F893, 0xA411C28686228644 }; const uint64_t Whirlpool::C4[256] = { 0xC07830D818186018, 0x05AF462623238C23, 0x7EF991B8C6C63FC6, 0x136FCDFBE8E887E8, 0x4CA113CB87872687, 0xA9626D11B8B8DAB8, 0x0805020901010401, 0x426E9E0D4F4F214F, 0xADEE6C9B3636D836, 0x590451FFA6A6A2A6, 0xDEBDB90CD2D26FD2, 0xFB06F70EF5F5F3F5, 0xEF80F2967979F979, 0x5FCEDE306F6FA16F, 0xFCEF3F6D91917E91, 0xAA07A4F852525552, 0x27FDC04760609D60, 0x89766535BCBCCABC, 0xACCD2B379B9B569B, 0x048C018A8E8E028E, 0x71155BD2A3A3B6A3, 0x603C186C0C0C300C, 0xFF8AF6847B7BF17B, 0xB5E16A803535D435, 0xE8693AF51D1D741D, 0x5347DDB3E0E0A7E0, 0xF6ACB321D7D77BD7, 0x5EED999CC2C22FC2, 0x6D965C432E2EB82E, 0x627A96294B4B314B, 0xA321E15DFEFEDFFE, 0x8216AED557574157, 0xA8412ABD15155415, 0x9FB6EEE87777C177, 0xA5EB6E923737DC37, 0x7B56D79EE5E5B3E5, 0x8CD923139F9F469F, 0xD317FD23F0F0E7F0, 0x6A7F94204A4A354A, 0x9E95A944DADA4FDA, 0xFA25B0A258587D58, 0x06CA8FCFC9C903C9, 0x558D527C2929A429, 0x5022145A0A0A280A, 0xE14F7F50B1B1FEB1, 0x691A5DC9A0A0BAA0, 0x7FDAD6146B6BB16B, 0x5CAB17D985852E85, 0x8173673CBDBDCEBD, 0xD234BA8F5D5D695D, 0x8050209010104010, 0xF303F507F4F4F7F4, 0x16C08BDDCBCB0BCB, 0xEDC67CD33E3EF83E, 0x28110A2D05051405, 0x1FE6CE7867678167, 0x7353D597E4E4B7E4, 0x25BB4E0227279C27, 0x3258827341411941, 0x2C9D0BA78B8B168B, 0x510153F6A7A7A6A7, 0xCF94FAB27D7DE97D, 0xDCFB374995956E95, 0x8E9FAD56D8D847D8, 0x8B30EB70FBFBCBFB, 0x2371C1CDEEEE9FEE, 0xC791F8BB7C7CED7C, 0x17E3CC7166668566, 0xA68EA77BDDDD53DD, 0xB84B2EAF17175C17, 0x02468E4547470147, 0x84DC211A9E9E429E, 0x1EC589D4CACA0FCA, 0x75995A582D2DB42D, 0x9179632EBFBFC6BF, 0x381B0E3F07071C07, 0x012347ACADAD8EAD, 0xEA2FB4B05A5A755A, 0x6CB51BEF83833683, 0x85FF66B63333CC33, 0x3FF2C65C63639163, 0x100A041202020802, 0x39384993AAAA92AA, 0xAFA8E2DE7171D971, 0x0ECF8DC6C8C807C8, 0xC87D32D119196419, 0x7270923B49493949, 0x869AAF5FD9D943D9, 0xC31DF931F2F2EFF2, 0x4B48DBA8E3E3ABE3, 0xE22AB6B95B5B715B, 0x34920DBC88881A88, 0xA4C8293E9A9A529A, 0x2DBE4C0B26269826, 0x8DFA64BF3232C832, 0xE94A7D59B0B0FAB0, 0x1B6ACFF2E9E983E9, 0x78331E770F0F3C0F, 0xE6A6B733D5D573D5, 0x74BA1DF480803A80, 0x997C6127BEBEC2BE, 0x26DE87EBCDCD13CD, 0xBDE468893434D034, 0x7A75903248483D48, 0xAB24E354FFFFDBFF, 0xF78FF48D7A7AF57A, 0xF4EA3D6490907A90, 0xC23EBE9D5F5F615F, 0x1DA0403D20208020, 0x67D5D00F6868BD68, 0xD07234CA1A1A681A, 0x192C41B7AEAE82AE, 0xC95E757DB4B4EAB4, 0x9A19A8CE54544D54, 0xECE53B7F93937693, 0x0DAA442F22228822, 0x07E9C86364648D64, 0xDB12FF2AF1F1E3F1, 0xBFA2E6CC7373D173, 0x905A248212124812, 0x3A5D807A40401D40, 0x4028104808082008, 0x56E89B95C3C32BC3, 0x337BC5DFECEC97EC, 0x9690AB4DDBDB4BDB, 0x611F5FC0A1A1BEA1, 0x1C8307918D8D0E8D, 0xF5C97AC83D3DF43D, 0xCCF1335B97976697, 0x0000000000000000, 0x36D483F9CFCF1BCF, 0x4587566E2B2BAC2B, 0x97B3ECE17676C576, 0x64B019E682823282, 0xFEA9B128D6D67FD6, 0xD87736C31B1B6C1B, 0xC15B7774B5B5EEB5, 0x112943BEAFAF86AF, 0x77DFD41D6A6AB56A, 0xBA0DA0EA50505D50, 0x124C8A5745450945, 0xCB18FB38F3F3EBF3, 0x9DF060AD3030C030, 0x2B74C3C4EFEF9BEF, 0xE5C37EDA3F3FFC3F, 0x921CAAC755554955, 0x791059DBA2A2B2A2, 0x0365C9E9EAEA8FEA, 0x0FECCA6A65658965, 0xB9686903BABAD2BA, 0x65935E4A2F2FBC2F, 0x4EE79D8EC0C027C0, 0xBE81A160DEDE5FDE, 0xE06C38FC1C1C701C, 0xBB2EE746FDFDD3FD, 0x52649A1F4D4D294D, 0xE4E0397692927292, 0x8FBCEAFA7575C975, 0x301E0C3606061806, 0x249809AE8A8A128A, 0xF940794BB2B2F2B2, 0x6359D185E6E6BFE6, 0x70361C7E0E0E380E, 0xF8633EE71F1F7C1F, 0x37F7C45562629562, 0xEEA3B53AD4D477D4, 0x29324D81A8A89AA8, 0xC4F4315296966296, 0x9B3AEF62F9F9C3F9, 0x66F697A3C5C533C5, 0x35B14A1025259425, 0xF220B2AB59597959, 0x54AE15D084842A84, 0xB7A7E4C57272D572, 0xD5DD72EC3939E439, 0x5A6198164C4C2D4C, 0xCA3BBC945E5E655E, 0xE785F09F7878FD78, 0xDDD870E53838E038, 0x148605988C8C0A8C, 0xC6B2BF17D1D163D1, 0x410B57E4A5A5AEA5, 0x434DD9A1E2E2AFE2, 0x2FF8C24E61619961, 0xF1457B42B3B3F6B3, 0x15A5423421218421, 0x94D625089C9C4A9C, 0xF0663CEE1E1E781E, 0x2252866143431143, 0x76FC93B1C7C73BC7, 0xB32BE54FFCFCD7FC, 0x2014082404041004, 0xB208A2E351515951, 0xBCC72F2599995E99, 0x4FC4DA226D6DA96D, 0x68391A650D0D340D, 0x8335E979FAFACFFA, 0xB684A369DFDF5BDF, 0xD79BFCA97E7EE57E, 0x3DB4481924249024, 0xC5D776FE3B3BEC3B, 0x313D4B9AABAB96AB, 0x3ED181F0CECE1FCE, 0x8855229911114411, 0x0C8903838F8F068F, 0x4A6B9C044E4E254E, 0xD1517366B7B7E6B7, 0x0B60CBE0EBEB8BEB, 0xFDCC78C13C3CF03C, 0x7CBF1FFD81813E81, 0xD4FE354094946A94, 0xEB0CF31CF7F7FBF7, 0xA1676F18B9B9DEB9, 0x985F268B13134C13, 0x7D9C58512C2CB02C, 0xD6B8BB05D3D36BD3, 0x6B5CD38CE7E7BBE7, 0x57CBDC396E6EA56E, 0x6EF395AAC4C437C4, 0x180F061B03030C03, 0x8A13ACDC56564556, 0x1A49885E44440D44, 0xDF9EFEA07F7FE17F, 0x21374F88A9A99EA9, 0x4D8254672A2AA82A, 0xB16D6B0ABBBBD6BB, 0x46E29F87C1C123C1, 0xA202A6F153535153, 0xAE8BA572DCDC57DC, 0x582716530B0B2C0B, 0x9CD327019D9D4E9D, 0x47C1D82B6C6CAD6C, 0x95F562A43131C431, 0x87B9E8F37474CD74, 0xE309F115F6F6FFF6, 0x0A438C4C46460546, 0x092645A5ACAC8AAC, 0x3C970FB589891E89, 0xA04428B414145014, 0x5B42DFBAE1E1A3E1, 0xB04E2CA616165816, 0xCDD274F73A3AE83A, 0x6FD0D2066969B969, 0x482D124109092409, 0xA7ADE0D77070DD70, 0xD954716FB6B6E2B6, 0xCEB7BD1ED0D067D0, 0x3B7EC7D6EDED93ED, 0x2EDB85E2CCCC17CC, 0x2A57846842421542, 0xB4C22D2C98985A98, 0x490E55EDA4A4AAA4, 0x5D8850752828A028, 0xDA31B8865C5C6D5C, 0x933FED6BF8F8C7F8, 0x44A411C286862286 }; const uint64_t Whirlpool::C5[256] = { 0x18C07830D8181860, 0x2305AF462623238C, 0xC67EF991B8C6C63F, 0xE8136FCDFBE8E887, 0x874CA113CB878726, 0xB8A9626D11B8B8DA, 0x0108050209010104, 0x4F426E9E0D4F4F21, 0x36ADEE6C9B3636D8, 0xA6590451FFA6A6A2, 0xD2DEBDB90CD2D26F, 0xF5FB06F70EF5F5F3, 0x79EF80F2967979F9, 0x6F5FCEDE306F6FA1, 0x91FCEF3F6D91917E, 0x52AA07A4F8525255, 0x6027FDC04760609D, 0xBC89766535BCBCCA, 0x9BACCD2B379B9B56, 0x8E048C018A8E8E02, 0xA371155BD2A3A3B6, 0x0C603C186C0C0C30, 0x7BFF8AF6847B7BF1, 0x35B5E16A803535D4, 0x1DE8693AF51D1D74, 0xE05347DDB3E0E0A7, 0xD7F6ACB321D7D77B, 0xC25EED999CC2C22F, 0x2E6D965C432E2EB8, 0x4B627A96294B4B31, 0xFEA321E15DFEFEDF, 0x578216AED5575741, 0x15A8412ABD151554, 0x779FB6EEE87777C1, 0x37A5EB6E923737DC, 0xE57B56D79EE5E5B3, 0x9F8CD923139F9F46, 0xF0D317FD23F0F0E7, 0x4A6A7F94204A4A35, 0xDA9E95A944DADA4F, 0x58FA25B0A258587D, 0xC906CA8FCFC9C903, 0x29558D527C2929A4, 0x0A5022145A0A0A28, 0xB1E14F7F50B1B1FE, 0xA0691A5DC9A0A0BA, 0x6B7FDAD6146B6BB1, 0x855CAB17D985852E, 0xBD8173673CBDBDCE, 0x5DD234BA8F5D5D69, 0x1080502090101040, 0xF4F303F507F4F4F7, 0xCB16C08BDDCBCB0B, 0x3EEDC67CD33E3EF8, 0x0528110A2D050514, 0x671FE6CE78676781, 0xE47353D597E4E4B7, 0x2725BB4E0227279C, 0x4132588273414119, 0x8B2C9D0BA78B8B16, 0xA7510153F6A7A7A6, 0x7DCF94FAB27D7DE9, 0x95DCFB374995956E, 0xD88E9FAD56D8D847, 0xFB8B30EB70FBFBCB, 0xEE2371C1CDEEEE9F, 0x7CC791F8BB7C7CED, 0x6617E3CC71666685, 0xDDA68EA77BDDDD53, 0x17B84B2EAF17175C, 0x4702468E45474701, 0x9E84DC211A9E9E42, 0xCA1EC589D4CACA0F, 0x2D75995A582D2DB4, 0xBF9179632EBFBFC6, 0x07381B0E3F07071C, 0xAD012347ACADAD8E, 0x5AEA2FB4B05A5A75, 0x836CB51BEF838336, 0x3385FF66B63333CC, 0x633FF2C65C636391, 0x02100A0412020208, 0xAA39384993AAAA92, 0x71AFA8E2DE7171D9, 0xC80ECF8DC6C8C807, 0x19C87D32D1191964, 0x497270923B494939, 0xD9869AAF5FD9D943, 0xF2C31DF931F2F2EF, 0xE34B48DBA8E3E3AB, 0x5BE22AB6B95B5B71, 0x8834920DBC88881A, 0x9AA4C8293E9A9A52, 0x262DBE4C0B262698, 0x328DFA64BF3232C8, 0xB0E94A7D59B0B0FA, 0xE91B6ACFF2E9E983, 0x0F78331E770F0F3C, 0xD5E6A6B733D5D573, 0x8074BA1DF480803A, 0xBE997C6127BEBEC2, 0xCD26DE87EBCDCD13, 0x34BDE468893434D0, 0x487A75903248483D, 0xFFAB24E354FFFFDB, 0x7AF78FF48D7A7AF5, 0x90F4EA3D6490907A, 0x5FC23EBE9D5F5F61, 0x201DA0403D202080, 0x6867D5D00F6868BD, 0x1AD07234CA1A1A68, 0xAE192C41B7AEAE82, 0xB4C95E757DB4B4EA, 0x549A19A8CE54544D, 0x93ECE53B7F939376, 0x220DAA442F222288, 0x6407E9C86364648D, 0xF1DB12FF2AF1F1E3, 0x73BFA2E6CC7373D1, 0x12905A2482121248, 0x403A5D807A40401D, 0x0840281048080820, 0xC356E89B95C3C32B, 0xEC337BC5DFECEC97, 0xDB9690AB4DDBDB4B, 0xA1611F5FC0A1A1BE, 0x8D1C8307918D8D0E, 0x3DF5C97AC83D3DF4, 0x97CCF1335B979766, 0x0000000000000000, 0xCF36D483F9CFCF1B, 0x2B4587566E2B2BAC, 0x7697B3ECE17676C5, 0x8264B019E6828232, 0xD6FEA9B128D6D67F, 0x1BD87736C31B1B6C, 0xB5C15B7774B5B5EE, 0xAF112943BEAFAF86, 0x6A77DFD41D6A6AB5, 0x50BA0DA0EA50505D, 0x45124C8A57454509, 0xF3CB18FB38F3F3EB, 0x309DF060AD3030C0, 0xEF2B74C3C4EFEF9B, 0x3FE5C37EDA3F3FFC, 0x55921CAAC7555549, 0xA2791059DBA2A2B2, 0xEA0365C9E9EAEA8F, 0x650FECCA6A656589, 0xBAB9686903BABAD2, 0x2F65935E4A2F2FBC, 0xC04EE79D8EC0C027, 0xDEBE81A160DEDE5F, 0x1CE06C38FC1C1C70, 0xFDBB2EE746FDFDD3, 0x4D52649A1F4D4D29, 0x92E4E03976929272, 0x758FBCEAFA7575C9, 0x06301E0C36060618, 0x8A249809AE8A8A12, 0xB2F940794BB2B2F2, 0xE66359D185E6E6BF, 0x0E70361C7E0E0E38, 0x1FF8633EE71F1F7C, 0x6237F7C455626295, 0xD4EEA3B53AD4D477, 0xA829324D81A8A89A, 0x96C4F43152969662, 0xF99B3AEF62F9F9C3, 0xC566F697A3C5C533, 0x2535B14A10252594, 0x59F220B2AB595979, 0x8454AE15D084842A, 0x72B7A7E4C57272D5, 0x39D5DD72EC3939E4, 0x4C5A6198164C4C2D, 0x5ECA3BBC945E5E65, 0x78E785F09F7878FD, 0x38DDD870E53838E0, 0x8C148605988C8C0A, 0xD1C6B2BF17D1D163, 0xA5410B57E4A5A5AE, 0xE2434DD9A1E2E2AF, 0x612FF8C24E616199, 0xB3F1457B42B3B3F6, 0x2115A54234212184, 0x9C94D625089C9C4A, 0x1EF0663CEE1E1E78, 0x4322528661434311, 0xC776FC93B1C7C73B, 0xFCB32BE54FFCFCD7, 0x0420140824040410, 0x51B208A2E3515159, 0x99BCC72F2599995E, 0x6D4FC4DA226D6DA9, 0x0D68391A650D0D34, 0xFA8335E979FAFACF, 0xDFB684A369DFDF5B, 0x7ED79BFCA97E7EE5, 0x243DB44819242490, 0x3BC5D776FE3B3BEC, 0xAB313D4B9AABAB96, 0xCE3ED181F0CECE1F, 0x1188552299111144, 0x8F0C8903838F8F06, 0x4E4A6B9C044E4E25, 0xB7D1517366B7B7E6, 0xEB0B60CBE0EBEB8B, 0x3CFDCC78C13C3CF0, 0x817CBF1FFD81813E, 0x94D4FE354094946A, 0xF7EB0CF31CF7F7FB, 0xB9A1676F18B9B9DE, 0x13985F268B13134C, 0x2C7D9C58512C2CB0, 0xD3D6B8BB05D3D36B, 0xE76B5CD38CE7E7BB, 0x6E57CBDC396E6EA5, 0xC46EF395AAC4C437, 0x03180F061B03030C, 0x568A13ACDC565645, 0x441A49885E44440D, 0x7FDF9EFEA07F7FE1, 0xA921374F88A9A99E, 0x2A4D8254672A2AA8, 0xBBB16D6B0ABBBBD6, 0xC146E29F87C1C123, 0x53A202A6F1535351, 0xDCAE8BA572DCDC57, 0x0B582716530B0B2C, 0x9D9CD327019D9D4E, 0x6C47C1D82B6C6CAD, 0x3195F562A43131C4, 0x7487B9E8F37474CD, 0xF6E309F115F6F6FF, 0x460A438C4C464605, 0xAC092645A5ACAC8A, 0x893C970FB589891E, 0x14A04428B4141450, 0xE15B42DFBAE1E1A3, 0x16B04E2CA6161658, 0x3ACDD274F73A3AE8, 0x696FD0D2066969B9, 0x09482D1241090924, 0x70A7ADE0D77070DD, 0xB6D954716FB6B6E2, 0xD0CEB7BD1ED0D067, 0xED3B7EC7D6EDED93, 0xCC2EDB85E2CCCC17, 0x422A578468424215, 0x98B4C22D2C98985A, 0xA4490E55EDA4A4AA, 0x285D8850752828A0, 0x5CDA31B8865C5C6D, 0xF8933FED6BF8F8C7, 0x8644A411C2868622 }; const uint64_t Whirlpool::C6[256] = { 0x6018C07830D81818, 0x8C2305AF46262323, 0x3FC67EF991B8C6C6, 0x87E8136FCDFBE8E8, 0x26874CA113CB8787, 0xDAB8A9626D11B8B8, 0x0401080502090101, 0x214F426E9E0D4F4F, 0xD836ADEE6C9B3636, 0xA2A6590451FFA6A6, 0x6FD2DEBDB90CD2D2, 0xF3F5FB06F70EF5F5, 0xF979EF80F2967979, 0xA16F5FCEDE306F6F, 0x7E91FCEF3F6D9191, 0x5552AA07A4F85252, 0x9D6027FDC0476060, 0xCABC89766535BCBC, 0x569BACCD2B379B9B, 0x028E048C018A8E8E, 0xB6A371155BD2A3A3, 0x300C603C186C0C0C, 0xF17BFF8AF6847B7B, 0xD435B5E16A803535, 0x741DE8693AF51D1D, 0xA7E05347DDB3E0E0, 0x7BD7F6ACB321D7D7, 0x2FC25EED999CC2C2, 0xB82E6D965C432E2E, 0x314B627A96294B4B, 0xDFFEA321E15DFEFE, 0x41578216AED55757, 0x5415A8412ABD1515, 0xC1779FB6EEE87777, 0xDC37A5EB6E923737, 0xB3E57B56D79EE5E5, 0x469F8CD923139F9F, 0xE7F0D317FD23F0F0, 0x354A6A7F94204A4A, 0x4FDA9E95A944DADA, 0x7D58FA25B0A25858, 0x03C906CA8FCFC9C9, 0xA429558D527C2929, 0x280A5022145A0A0A, 0xFEB1E14F7F50B1B1, 0xBAA0691A5DC9A0A0, 0xB16B7FDAD6146B6B, 0x2E855CAB17D98585, 0xCEBD8173673CBDBD, 0x695DD234BA8F5D5D, 0x4010805020901010, 0xF7F4F303F507F4F4, 0x0BCB16C08BDDCBCB, 0xF83EEDC67CD33E3E, 0x140528110A2D0505, 0x81671FE6CE786767, 0xB7E47353D597E4E4, 0x9C2725BB4E022727, 0x1941325882734141, 0x168B2C9D0BA78B8B, 0xA6A7510153F6A7A7, 0xE97DCF94FAB27D7D, 0x6E95DCFB37499595, 0x47D88E9FAD56D8D8, 0xCBFB8B30EB70FBFB, 0x9FEE2371C1CDEEEE, 0xED7CC791F8BB7C7C, 0x856617E3CC716666, 0x53DDA68EA77BDDDD, 0x5C17B84B2EAF1717, 0x014702468E454747, 0x429E84DC211A9E9E, 0x0FCA1EC589D4CACA, 0xB42D75995A582D2D, 0xC6BF9179632EBFBF, 0x1C07381B0E3F0707, 0x8EAD012347ACADAD, 0x755AEA2FB4B05A5A, 0x36836CB51BEF8383, 0xCC3385FF66B63333, 0x91633FF2C65C6363, 0x0802100A04120202, 0x92AA39384993AAAA, 0xD971AFA8E2DE7171, 0x07C80ECF8DC6C8C8, 0x6419C87D32D11919, 0x39497270923B4949, 0x43D9869AAF5FD9D9, 0xEFF2C31DF931F2F2, 0xABE34B48DBA8E3E3, 0x715BE22AB6B95B5B, 0x1A8834920DBC8888, 0x529AA4C8293E9A9A, 0x98262DBE4C0B2626, 0xC8328DFA64BF3232, 0xFAB0E94A7D59B0B0, 0x83E91B6ACFF2E9E9, 0x3C0F78331E770F0F, 0x73D5E6A6B733D5D5, 0x3A8074BA1DF48080, 0xC2BE997C6127BEBE, 0x13CD26DE87EBCDCD, 0xD034BDE468893434, 0x3D487A7590324848, 0xDBFFAB24E354FFFF, 0xF57AF78FF48D7A7A, 0x7A90F4EA3D649090, 0x615FC23EBE9D5F5F, 0x80201DA0403D2020, 0xBD6867D5D00F6868, 0x681AD07234CA1A1A, 0x82AE192C41B7AEAE, 0xEAB4C95E757DB4B4, 0x4D549A19A8CE5454, 0x7693ECE53B7F9393, 0x88220DAA442F2222, 0x8D6407E9C8636464, 0xE3F1DB12FF2AF1F1, 0xD173BFA2E6CC7373, 0x4812905A24821212, 0x1D403A5D807A4040, 0x2008402810480808, 0x2BC356E89B95C3C3, 0x97EC337BC5DFECEC, 0x4BDB9690AB4DDBDB, 0xBEA1611F5FC0A1A1, 0x0E8D1C8307918D8D, 0xF43DF5C97AC83D3D, 0x6697CCF1335B9797, 0x0000000000000000, 0x1BCF36D483F9CFCF, 0xAC2B4587566E2B2B, 0xC57697B3ECE17676, 0x328264B019E68282, 0x7FD6FEA9B128D6D6, 0x6C1BD87736C31B1B, 0xEEB5C15B7774B5B5, 0x86AF112943BEAFAF, 0xB56A77DFD41D6A6A, 0x5D50BA0DA0EA5050, 0x0945124C8A574545, 0xEBF3CB18FB38F3F3, 0xC0309DF060AD3030, 0x9BEF2B74C3C4EFEF, 0xFC3FE5C37EDA3F3F, 0x4955921CAAC75555, 0xB2A2791059DBA2A2, 0x8FEA0365C9E9EAEA, 0x89650FECCA6A6565, 0xD2BAB9686903BABA, 0xBC2F65935E4A2F2F, 0x27C04EE79D8EC0C0, 0x5FDEBE81A160DEDE, 0x701CE06C38FC1C1C, 0xD3FDBB2EE746FDFD, 0x294D52649A1F4D4D, 0x7292E4E039769292, 0xC9758FBCEAFA7575, 0x1806301E0C360606, 0x128A249809AE8A8A, 0xF2B2F940794BB2B2, 0xBFE66359D185E6E6, 0x380E70361C7E0E0E, 0x7C1FF8633EE71F1F, 0x956237F7C4556262, 0x77D4EEA3B53AD4D4, 0x9AA829324D81A8A8, 0x6296C4F431529696, 0xC3F99B3AEF62F9F9, 0x33C566F697A3C5C5, 0x942535B14A102525, 0x7959F220B2AB5959, 0x2A8454AE15D08484, 0xD572B7A7E4C57272, 0xE439D5DD72EC3939, 0x2D4C5A6198164C4C, 0x655ECA3BBC945E5E, 0xFD78E785F09F7878, 0xE038DDD870E53838, 0x0A8C148605988C8C, 0x63D1C6B2BF17D1D1, 0xAEA5410B57E4A5A5, 0xAFE2434DD9A1E2E2, 0x99612FF8C24E6161, 0xF6B3F1457B42B3B3, 0x842115A542342121, 0x4A9C94D625089C9C, 0x781EF0663CEE1E1E, 0x1143225286614343, 0x3BC776FC93B1C7C7, 0xD7FCB32BE54FFCFC, 0x1004201408240404, 0x5951B208A2E35151, 0x5E99BCC72F259999, 0xA96D4FC4DA226D6D, 0x340D68391A650D0D, 0xCFFA8335E979FAFA, 0x5BDFB684A369DFDF, 0xE57ED79BFCA97E7E, 0x90243DB448192424, 0xEC3BC5D776FE3B3B, 0x96AB313D4B9AABAB, 0x1FCE3ED181F0CECE, 0x4411885522991111, 0x068F0C8903838F8F, 0x254E4A6B9C044E4E, 0xE6B7D1517366B7B7, 0x8BEB0B60CBE0EBEB, 0xF03CFDCC78C13C3C, 0x3E817CBF1FFD8181, 0x6A94D4FE35409494, 0xFBF7EB0CF31CF7F7, 0xDEB9A1676F18B9B9, 0x4C13985F268B1313, 0xB02C7D9C58512C2C, 0x6BD3D6B8BB05D3D3, 0xBBE76B5CD38CE7E7, 0xA56E57CBDC396E6E, 0x37C46EF395AAC4C4, 0x0C03180F061B0303, 0x45568A13ACDC5656, 0x0D441A49885E4444, 0xE17FDF9EFEA07F7F, 0x9EA921374F88A9A9, 0xA82A4D8254672A2A, 0xD6BBB16D6B0ABBBB, 0x23C146E29F87C1C1, 0x5153A202A6F15353, 0x57DCAE8BA572DCDC, 0x2C0B582716530B0B, 0x4E9D9CD327019D9D, 0xAD6C47C1D82B6C6C, 0xC43195F562A43131, 0xCD7487B9E8F37474, 0xFFF6E309F115F6F6, 0x05460A438C4C4646, 0x8AAC092645A5ACAC, 0x1E893C970FB58989, 0x5014A04428B41414, 0xA3E15B42DFBAE1E1, 0x5816B04E2CA61616, 0xE83ACDD274F73A3A, 0xB9696FD0D2066969, 0x2409482D12410909, 0xDD70A7ADE0D77070, 0xE2B6D954716FB6B6, 0x67D0CEB7BD1ED0D0, 0x93ED3B7EC7D6EDED, 0x17CC2EDB85E2CCCC, 0x15422A5784684242, 0x5A98B4C22D2C9898, 0xAAA4490E55EDA4A4, 0xA0285D8850752828, 0x6D5CDA31B8865C5C, 0xC7F8933FED6BF8F8, 0x228644A411C28686 }; const uint64_t Whirlpool::C7[256] = { 0x186018C07830D818, 0x238C2305AF462623, 0xC63FC67EF991B8C6, 0xE887E8136FCDFBE8, 0x8726874CA113CB87, 0xB8DAB8A9626D11B8, 0x0104010805020901, 0x4F214F426E9E0D4F, 0x36D836ADEE6C9B36, 0xA6A2A6590451FFA6, 0xD26FD2DEBDB90CD2, 0xF5F3F5FB06F70EF5, 0x79F979EF80F29679, 0x6FA16F5FCEDE306F, 0x917E91FCEF3F6D91, 0x525552AA07A4F852, 0x609D6027FDC04760, 0xBCCABC89766535BC, 0x9B569BACCD2B379B, 0x8E028E048C018A8E, 0xA3B6A371155BD2A3, 0x0C300C603C186C0C, 0x7BF17BFF8AF6847B, 0x35D435B5E16A8035, 0x1D741DE8693AF51D, 0xE0A7E05347DDB3E0, 0xD77BD7F6ACB321D7, 0xC22FC25EED999CC2, 0x2EB82E6D965C432E, 0x4B314B627A96294B, 0xFEDFFEA321E15DFE, 0x5741578216AED557, 0x155415A8412ABD15, 0x77C1779FB6EEE877, 0x37DC37A5EB6E9237, 0xE5B3E57B56D79EE5, 0x9F469F8CD923139F, 0xF0E7F0D317FD23F0, 0x4A354A6A7F94204A, 0xDA4FDA9E95A944DA, 0x587D58FA25B0A258, 0xC903C906CA8FCFC9, 0x29A429558D527C29, 0x0A280A5022145A0A, 0xB1FEB1E14F7F50B1, 0xA0BAA0691A5DC9A0, 0x6BB16B7FDAD6146B, 0x852E855CAB17D985, 0xBDCEBD8173673CBD, 0x5D695DD234BA8F5D, 0x1040108050209010, 0xF4F7F4F303F507F4, 0xCB0BCB16C08BDDCB, 0x3EF83EEDC67CD33E, 0x05140528110A2D05, 0x6781671FE6CE7867, 0xE4B7E47353D597E4, 0x279C2725BB4E0227, 0x4119413258827341, 0x8B168B2C9D0BA78B, 0xA7A6A7510153F6A7, 0x7DE97DCF94FAB27D, 0x956E95DCFB374995, 0xD847D88E9FAD56D8, 0xFBCBFB8B30EB70FB, 0xEE9FEE2371C1CDEE, 0x7CED7CC791F8BB7C, 0x66856617E3CC7166, 0xDD53DDA68EA77BDD, 0x175C17B84B2EAF17, 0x47014702468E4547, 0x9E429E84DC211A9E, 0xCA0FCA1EC589D4CA, 0x2DB42D75995A582D, 0xBFC6BF9179632EBF, 0x071C07381B0E3F07, 0xAD8EAD012347ACAD, 0x5A755AEA2FB4B05A, 0x8336836CB51BEF83, 0x33CC3385FF66B633, 0x6391633FF2C65C63, 0x020802100A041202, 0xAA92AA39384993AA, 0x71D971AFA8E2DE71, 0xC807C80ECF8DC6C8, 0x196419C87D32D119, 0x4939497270923B49, 0xD943D9869AAF5FD9, 0xF2EFF2C31DF931F2, 0xE3ABE34B48DBA8E3, 0x5B715BE22AB6B95B, 0x881A8834920DBC88, 0x9A529AA4C8293E9A, 0x2698262DBE4C0B26, 0x32C8328DFA64BF32, 0xB0FAB0E94A7D59B0, 0xE983E91B6ACFF2E9, 0x0F3C0F78331E770F, 0xD573D5E6A6B733D5, 0x803A8074BA1DF480, 0xBEC2BE997C6127BE, 0xCD13CD26DE87EBCD, 0x34D034BDE4688934, 0x483D487A75903248, 0xFFDBFFAB24E354FF, 0x7AF57AF78FF48D7A, 0x907A90F4EA3D6490, 0x5F615FC23EBE9D5F, 0x2080201DA0403D20, 0x68BD6867D5D00F68, 0x1A681AD07234CA1A, 0xAE82AE192C41B7AE, 0xB4EAB4C95E757DB4, 0x544D549A19A8CE54, 0x937693ECE53B7F93, 0x2288220DAA442F22, 0x648D6407E9C86364, 0xF1E3F1DB12FF2AF1, 0x73D173BFA2E6CC73, 0x124812905A248212, 0x401D403A5D807A40, 0x0820084028104808, 0xC32BC356E89B95C3, 0xEC97EC337BC5DFEC, 0xDB4BDB9690AB4DDB, 0xA1BEA1611F5FC0A1, 0x8D0E8D1C8307918D, 0x3DF43DF5C97AC83D, 0x976697CCF1335B97, 0x0000000000000000, 0xCF1BCF36D483F9CF, 0x2BAC2B4587566E2B, 0x76C57697B3ECE176, 0x82328264B019E682, 0xD67FD6FEA9B128D6, 0x1B6C1BD87736C31B, 0xB5EEB5C15B7774B5, 0xAF86AF112943BEAF, 0x6AB56A77DFD41D6A, 0x505D50BA0DA0EA50, 0x450945124C8A5745, 0xF3EBF3CB18FB38F3, 0x30C0309DF060AD30, 0xEF9BEF2B74C3C4EF, 0x3FFC3FE5C37EDA3F, 0x554955921CAAC755, 0xA2B2A2791059DBA2, 0xEA8FEA0365C9E9EA, 0x6589650FECCA6A65, 0xBAD2BAB9686903BA, 0x2FBC2F65935E4A2F, 0xC027C04EE79D8EC0, 0xDE5FDEBE81A160DE, 0x1C701CE06C38FC1C, 0xFDD3FDBB2EE746FD, 0x4D294D52649A1F4D, 0x927292E4E0397692, 0x75C9758FBCEAFA75, 0x061806301E0C3606, 0x8A128A249809AE8A, 0xB2F2B2F940794BB2, 0xE6BFE66359D185E6, 0x0E380E70361C7E0E, 0x1F7C1FF8633EE71F, 0x62956237F7C45562, 0xD477D4EEA3B53AD4, 0xA89AA829324D81A8, 0x966296C4F4315296, 0xF9C3F99B3AEF62F9, 0xC533C566F697A3C5, 0x25942535B14A1025, 0x597959F220B2AB59, 0x842A8454AE15D084, 0x72D572B7A7E4C572, 0x39E439D5DD72EC39, 0x4C2D4C5A6198164C, 0x5E655ECA3BBC945E, 0x78FD78E785F09F78, 0x38E038DDD870E538, 0x8C0A8C148605988C, 0xD163D1C6B2BF17D1, 0xA5AEA5410B57E4A5, 0xE2AFE2434DD9A1E2, 0x6199612FF8C24E61, 0xB3F6B3F1457B42B3, 0x21842115A5423421, 0x9C4A9C94D625089C, 0x1E781EF0663CEE1E, 0x4311432252866143, 0xC73BC776FC93B1C7, 0xFCD7FCB32BE54FFC, 0x0410042014082404, 0x515951B208A2E351, 0x995E99BCC72F2599, 0x6DA96D4FC4DA226D, 0x0D340D68391A650D, 0xFACFFA8335E979FA, 0xDF5BDFB684A369DF, 0x7EE57ED79BFCA97E, 0x2490243DB4481924, 0x3BEC3BC5D776FE3B, 0xAB96AB313D4B9AAB, 0xCE1FCE3ED181F0CE, 0x1144118855229911, 0x8F068F0C8903838F, 0x4E254E4A6B9C044E, 0xB7E6B7D1517366B7, 0xEB8BEB0B60CBE0EB, 0x3CF03CFDCC78C13C, 0x813E817CBF1FFD81, 0x946A94D4FE354094, 0xF7FBF7EB0CF31CF7, 0xB9DEB9A1676F18B9, 0x134C13985F268B13, 0x2CB02C7D9C58512C, 0xD36BD3D6B8BB05D3, 0xE7BBE76B5CD38CE7, 0x6EA56E57CBDC396E, 0xC437C46EF395AAC4, 0x030C03180F061B03, 0x5645568A13ACDC56, 0x440D441A49885E44, 0x7FE17FDF9EFEA07F, 0xA99EA921374F88A9, 0x2AA82A4D8254672A, 0xBBD6BBB16D6B0ABB, 0xC123C146E29F87C1, 0x535153A202A6F153, 0xDC57DCAE8BA572DC, 0x0B2C0B582716530B, 0x9D4E9D9CD327019D, 0x6CAD6C47C1D82B6C, 0x31C43195F562A431, 0x74CD7487B9E8F374, 0xF6FFF6E309F115F6, 0x4605460A438C4C46, 0xAC8AAC092645A5AC, 0x891E893C970FB589, 0x145014A04428B414, 0xE1A3E15B42DFBAE1, 0x165816B04E2CA616, 0x3AE83ACDD274F73A, 0x69B9696FD0D20669, 0x092409482D124109, 0x70DD70A7ADE0D770, 0xB6E2B6D954716FB6, 0xD067D0CEB7BD1ED0, 0xED93ED3B7EC7D6ED, 0xCC17CC2EDB85E2CC, 0x4215422A57846842, 0x985A98B4C22D2C98, 0xA4AAA4490E55EDA4, 0x28A0285D88507528, 0x5C6D5CDA31B8865C, 0xF8C7F8933FED6BF8, 0x86228644A411C286 }; } botan-2.4.0/src/lib/hash/whirlpool/whrlpool.h000066400000000000000000000022501322470703100211340ustar00rootroot00000000000000/* * Whirlpool * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_WHIRLPOOL_H_ #define BOTAN_WHIRLPOOL_H_ #include namespace Botan { /** * Whirlpool */ class BOTAN_PUBLIC_API(2,0) Whirlpool final : public MDx_HashFunction { public: std::string name() const override { return "Whirlpool"; } size_t output_length() const override { return 64; } HashFunction* clone() const override { return new Whirlpool; } std::unique_ptr copy_state() const override; void clear() override; Whirlpool() : MDx_HashFunction(64, true, true, 32), m_M(8), m_digest(8) { clear(); } private: void compress_n(const uint8_t[], size_t blocks) override; void copy_out(uint8_t[]) override; static const uint64_t C0[256]; static const uint64_t C1[256]; static const uint64_t C2[256]; static const uint64_t C3[256]; static const uint64_t C4[256]; static const uint64_t C5[256]; static const uint64_t C6[256]; static const uint64_t C7[256]; secure_vector m_M, m_digest; }; } #endif botan-2.4.0/src/lib/kdf/000077500000000000000000000000001322470703100147205ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/hkdf/000077500000000000000000000000001322470703100156345ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/hkdf/hkdf.cpp000066400000000000000000000073571322470703100172700ustar00rootroot00000000000000/* * HKDF * (C) 2013,2015,2017 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { size_t HKDF::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { HKDF_Extract extract(m_prf->clone()); HKDF_Expand expand(m_prf->clone()); secure_vector prk(m_prf->output_length()); extract.kdf(prk.data(), prk.size(), secret, secret_len, salt, salt_len, nullptr, 0); return expand.kdf(key, key_len, prk.data(), prk.size(), nullptr, 0, label, label_len); } size_t HKDF_Extract::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t[], size_t) const { secure_vector prk; if(salt_len == 0) { m_prf->set_key(std::vector(m_prf->output_length())); } else { m_prf->set_key(salt, salt_len); } m_prf->update(secret, secret_len); m_prf->final(prk); const size_t written = std::min(prk.size(), key_len); copy_mem(&key[0], prk.data(), written); return written; } size_t HKDF_Expand::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { m_prf->set_key(secret, secret_len); uint8_t counter = 1; secure_vector h; size_t offset = 0; while(offset != key_len && counter != 0) { m_prf->update(h); m_prf->update(label, label_len); m_prf->update(salt, salt_len); m_prf->update(counter++); m_prf->final(h); const size_t written = std::min(h.size(), key_len - offset); copy_mem(&key[offset], h.data(), written); offset += written; } return offset; } secure_vector hkdf_expand_label(const std::string& hash_fn, const uint8_t secret[], size_t secret_len, const std::string& label, const uint8_t hash_val[], size_t hash_val_len, size_t length) { if(length > 0xFFFF) throw Invalid_Argument("HKDF-Expand-Label requested output too large"); if(label.size() > 0xFF) throw Invalid_Argument("HKDF-Expand-Label label too long"); if(hash_val_len > 0xFF) throw Invalid_Argument("HKDF-Expand-Label hash too long"); const uint16_t length16 = static_cast(length); auto mac = MessageAuthenticationCode::create("HMAC(" + hash_fn + ")"); if(!mac) throw Invalid_Argument("HKDF-Expand-Label with HMAC(" + hash_fn + ") not available"); HKDF_Expand hkdf(mac.release()); secure_vector output(length16); std::vector prefix(3 + label.size() + 1); prefix[0] = get_byte(0, length16); prefix[1] = get_byte(1, length16); prefix[2] = static_cast(label.size()); copy_mem(prefix.data() + 3, cast_char_ptr_to_uint8(label.data()), label.size()); prefix[3 + label.size()] = static_cast(hash_val_len); /* * We do something a little dirty here to avoid copying the hash_val, * making use of the fact that Botan's KDF interface supports label+salt, * and knowing that our HKDF hashes first param label then param salt. */ hkdf.kdf(output.data(), output.size(), secret, secret_len, hash_val, hash_val_len, prefix.data(), prefix.size()); return output; } } botan-2.4.0/src/lib/kdf/hkdf/hkdf.h000066400000000000000000000060341322470703100167240ustar00rootroot00000000000000/* * HKDF * (C) 2013,2015 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HKDF_H_ #define BOTAN_HKDF_H_ #include #include namespace Botan { /** * HKDF from RFC 5869. */ class BOTAN_PUBLIC_API(2,0) HKDF final : public KDF { public: /** * @param prf MAC algorithm to use */ explicit HKDF(MessageAuthenticationCode* prf) : m_prf(prf) {} KDF* clone() const override { return new HKDF(m_prf->clone()); } std::string name() const override { return "HKDF(" + m_prf->name() + ")"; } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; private: std::unique_ptr m_prf; }; /** * HKDF Extraction Step from RFC 5869. */ class BOTAN_PUBLIC_API(2,0) HKDF_Extract final : public KDF { public: /** * @param prf MAC algorithm to use */ explicit HKDF_Extract(MessageAuthenticationCode* prf) : m_prf(prf) {} KDF* clone() const override { return new HKDF_Extract(m_prf->clone()); } std::string name() const override { return "HKDF-Extract(" + m_prf->name() + ")"; } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; private: std::unique_ptr m_prf; }; /** * HKDF Expansion Step from RFC 5869. */ class BOTAN_PUBLIC_API(2,0) HKDF_Expand final : public KDF { public: /** * @param prf MAC algorithm to use */ explicit HKDF_Expand(MessageAuthenticationCode* prf) : m_prf(prf) {} KDF* clone() const override { return new HKDF_Expand(m_prf->clone()); } std::string name() const override { return "HKDF-Expand(" + m_prf->name() + ")"; } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; private: std::unique_ptr m_prf; }; /** * HKDF-Expand-Label from TLS 1.3/QUIC * @param hash_fn the hash to use * @param secret the secret bits * @param secret_len the length of secret * @param label the full label (no "TLS 1.3, " or "tls13 " prefix * is applied) * @param hash_val the previous hash value (used for chaining, may be empty) * @param hash_val_len the length of hash_val * @param length the desired output length */ secure_vector BOTAN_PUBLIC_API(2,3) hkdf_expand_label( const std::string& hash_fn, const uint8_t secret[], size_t secret_len, const std::string& label, const uint8_t hash_val[], size_t hash_val_len, size_t length); } #endif botan-2.4.0/src/lib/kdf/hkdf/info.txt000066400000000000000000000001031322470703100173220ustar00rootroot00000000000000 HKDF -> 20170927 hmac botan-2.4.0/src/lib/kdf/info.txt000066400000000000000000000001571322470703100164170ustar00rootroot00000000000000 KDF_BASE -> 20131128 base kdf.h botan-2.4.0/src/lib/kdf/kdf.cpp000066400000000000000000000142521322470703100161740ustar00rootroot00000000000000/* * KDF Retrieval * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_HKDF) #include #endif #if defined(BOTAN_HAS_KDF1) #include #endif #if defined(BOTAN_HAS_KDF2) #include #endif #if defined(BOTAN_HAS_KDF1_18033) #include #endif #if defined(BOTAN_HAS_TLS_V10_PRF) || defined(BOTAN_HAS_TLS_V12_PRF) #include #endif #if defined(BOTAN_HAS_X942_PRF) #include #endif #if defined(BOTAN_HAS_SP800_108) #include #endif #if defined(BOTAN_HAS_SP800_56A) #include #endif #if defined(BOTAN_HAS_SP800_56C) #include #endif namespace Botan { namespace { template std::unique_ptr kdf_create_mac_or_hash(const std::string& nm) { if(auto mac = MessageAuthenticationCode::create(nm)) return std::unique_ptr(new KDF_Type(mac.release())); if(auto mac = MessageAuthenticationCode::create("HMAC(" + nm + ")")) return std::unique_ptr(new KDF_Type(mac.release())); return nullptr; } } std::unique_ptr KDF::create(const std::string& algo_spec, const std::string& provider) { const SCAN_Name req(algo_spec); #if defined(BOTAN_HAS_HKDF) if(req.algo_name() == "HKDF" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } if(req.algo_name() == "HKDF-Extract" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } if(req.algo_name() == "HKDF-Expand" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } #endif #if defined(BOTAN_HAS_KDF2) if(req.algo_name() == "KDF2" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { if(auto hash = HashFunction::create(req.arg(0))) return std::unique_ptr(new KDF2(hash.release())); } } #endif #if defined(BOTAN_HAS_KDF1_18033) if(req.algo_name() == "KDF1-18033" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { if(auto hash = HashFunction::create(req.arg(0))) return std::unique_ptr(new KDF1_18033(hash.release())); } } #endif #if defined(BOTAN_HAS_KDF1) if(req.algo_name() == "KDF1" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { if(auto hash = HashFunction::create(req.arg(0))) return std::unique_ptr(new KDF1(hash.release())); } } #endif #if defined(BOTAN_HAS_TLS_V10_PRF) if(req.algo_name() == "TLS-PRF" && req.arg_count() == 0) { if(provider.empty() || provider == "base") { return std::unique_ptr(new TLS_PRF); } } #endif #if defined(BOTAN_HAS_TLS_V12_PRF) if(req.algo_name() == "TLS-12-PRF" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } #endif #if defined(BOTAN_HAS_X942_PRF) if(req.algo_name() == "X9.42-PRF" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return std::unique_ptr(new X942_PRF(req.arg(0))); } } #endif #if defined(BOTAN_HAS_SP800_108) if(req.algo_name() == "SP800-108-Counter" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } if(req.algo_name() == "SP800-108-Feedback" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } if(req.algo_name() == "SP800-108-Pipeline" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { return kdf_create_mac_or_hash(req.arg(0)); } } #endif #if defined(BOTAN_HAS_SP800_56A) if(req.algo_name() == "SP800-56A" && req.arg_count() == 1) { if(auto hash = HashFunction::create(req.arg(0))) return std::unique_ptr(new SP800_56A_Hash(hash.release())); if(auto mac = MessageAuthenticationCode::create(req.arg(0))) return std::unique_ptr(new SP800_56A_HMAC(mac.release())); } #endif #if defined(BOTAN_HAS_SP800_56C) if(req.algo_name() == "SP800-56C" && req.arg_count() == 1) { std::unique_ptr exp(kdf_create_mac_or_hash(req.arg(0))); if(exp) { if(auto mac = MessageAuthenticationCode::create(req.arg(0))) return std::unique_ptr(new SP800_56C(mac.release(), exp.release())); if(auto mac = MessageAuthenticationCode::create("HMAC(" + req.arg(0) + ")")) return std::unique_ptr(new SP800_56C(mac.release(), exp.release())); } } #endif BOTAN_UNUSED(req); BOTAN_UNUSED(provider); return nullptr; } //static std::unique_ptr KDF::create_or_throw(const std::string& algo, const std::string& provider) { if(auto kdf = KDF::create(algo, provider)) { return kdf; } throw Lookup_Error("KDF", algo, provider); } std::vector KDF::providers(const std::string& algo_spec) { return probe_providers_of(algo_spec, { "base" }); } KDF* get_kdf(const std::string& algo_spec) { SCAN_Name request(algo_spec); if(request.algo_name() == "Raw") return nullptr; // No KDF //return KDF::create_or_throw(algo_spec).release(); auto kdf = KDF::create(algo_spec); if(!kdf) throw Algorithm_Not_Found(algo_spec); return kdf.release(); } } botan-2.4.0/src/lib/kdf/kdf.h000066400000000000000000000156611322470703100156460ustar00rootroot00000000000000/* * Key Derivation Function interfaces * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KDF_BASE_H_ #define BOTAN_KDF_BASE_H_ #include #include #include namespace Botan { /** * Key Derivation Function */ class BOTAN_PUBLIC_API(2,0) KDF { public: virtual ~KDF() = default; /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to choose * @return a null pointer if the algo/provider combination cannot be found */ static std::unique_ptr create(const std::string& algo_spec, const std::string& provider = ""); /** * Create an instance based on a name, or throw if the * algo/provider combination cannot be found. If provider is * empty then best available is chosen. */ static std::unique_ptr create_or_throw(const std::string& algo_spec, const std::string& provider = ""); /** * @return list of available providers for this algorithm, empty if not available */ static std::vector providers(const std::string& algo_spec); /** * @return KDF name */ virtual std::string name() const = 0; /** * Derive a key * @param key buffer holding the derived key, must be of length key_len * @param key_len the desired output length in bytes * @param secret the secret input * @param secret_len size of secret in bytes * @param salt a diversifier * @param salt_len size of salt in bytes * @param label purpose for the derived keying material * @param label_len size of label in bytes * @return the derived key */ virtual size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const = 0; /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param secret_len size of secret in bytes * @param salt a diversifier * @param salt_len size of salt in bytes * @param label purpose for the derived keying material * @param label_len size of label in bytes * @return the derived key */ secure_vector derive_key(size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[] = nullptr, size_t label_len = 0) const { secure_vector key(key_len); key.resize(kdf(key.data(), key.size(), secret, secret_len, salt, salt_len, label, label_len)); return key; } /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param salt a diversifier * @param label purpose for the derived keying material * @return the derived key */ secure_vector derive_key(size_t key_len, const secure_vector& secret, const std::string& salt = "", const std::string& label = "") const { return derive_key(key_len, secret.data(), secret.size(), cast_char_ptr_to_uint8(salt.data()), salt.length(), cast_char_ptr_to_uint8(label.data()), label.length()); } /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param salt a diversifier * @param label purpose for the derived keying material * @return the derived key */ template secure_vector derive_key(size_t key_len, const std::vector& secret, const std::vector& salt, const std::vector& label) const { return derive_key(key_len, secret.data(), secret.size(), salt.data(), salt.size(), label.data(), label.size()); } /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param salt a diversifier * @param salt_len size of salt in bytes * @param label purpose for the derived keying material * @return the derived key */ secure_vector derive_key(size_t key_len, const secure_vector& secret, const uint8_t salt[], size_t salt_len, const std::string& label = "") const { return derive_key(key_len, secret.data(), secret.size(), salt, salt_len, cast_char_ptr_to_uint8(label.data()), label.size()); } /** * Derive a key * @param key_len the desired output length in bytes * @param secret the secret input * @param secret_len size of secret in bytes * @param salt a diversifier * @param label purpose for the derived keying material * @return the derived key */ secure_vector derive_key(size_t key_len, const uint8_t secret[], size_t secret_len, const std::string& salt = "", const std::string& label = "") const { return derive_key(key_len, secret, secret_len, cast_char_ptr_to_uint8(salt.data()), salt.length(), cast_char_ptr_to_uint8(label.data()), label.length()); } /** * @return new object representing the same algorithm as *this */ virtual KDF* clone() const = 0; }; /** * Factory method for KDF (key derivation function) * @param algo_spec the name of the KDF to create * @return pointer to newly allocated object of that type */ BOTAN_PUBLIC_API(2,0) KDF* get_kdf(const std::string& algo_spec); } #endif botan-2.4.0/src/lib/kdf/kdf1/000077500000000000000000000000001322470703100155455ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/kdf1/info.txt000066400000000000000000000000461322470703100172410ustar00rootroot00000000000000 KDF1 -> 20131128 botan-2.4.0/src/lib/kdf/kdf1/kdf1.cpp000066400000000000000000000013431322470703100170770ustar00rootroot00000000000000/* * KDF1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { size_t KDF1::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { m_hash->update(secret, secret_len); m_hash->update(label, label_len); m_hash->update(salt, salt_len); if(key_len < m_hash->output_length()) { secure_vector v = m_hash->final(); copy_mem(key, v.data(), key_len); return key_len; } m_hash->final(key); return m_hash->output_length(); } } botan-2.4.0/src/lib/kdf/kdf1/kdf1.h000066400000000000000000000016061322470703100165460ustar00rootroot00000000000000/* * KDF1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KDF1_H_ #define BOTAN_KDF1_H_ #include #include namespace Botan { /** * KDF1, from IEEE 1363 */ class BOTAN_PUBLIC_API(2,0) KDF1 final : public KDF { public: std::string name() const override { return "KDF1(" + m_hash->name() + ")"; } KDF* clone() const override { return new KDF1(m_hash->clone()); } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param h hash function to use */ explicit KDF1(HashFunction* h) : m_hash(h) {} private: std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/kdf/kdf1_iso18033/000077500000000000000000000000001322470703100170165ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/kdf1_iso18033/info.txt000066400000000000000000000000541322470703100205110ustar00rootroot00000000000000 KDF1_18033 -> 20160128 botan-2.4.0/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.cpp000066400000000000000000000016401322470703100216210ustar00rootroot00000000000000/* * KDF1 from ISO 18033-2 * (C) 2016 Philipp Weber * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { size_t KDF1_18033::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { uint32_t counter = 0; secure_vector h; size_t offset = 0; while(offset != key_len && counter != 0xFFFFFFFF) { m_hash->update(secret, secret_len); m_hash->update_be(counter++); m_hash->update(label, label_len); m_hash->update(salt, salt_len); m_hash->final(h); const size_t added = std::min(h.size(), key_len - offset); copy_mem(&key[offset], h.data(), added); offset += added; } return offset; } } botan-2.4.0/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.h000066400000000000000000000016731322470703100212740ustar00rootroot00000000000000/* * KDF1 from ISO 18033-2 * (C) 2016 Philipp Weber * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KDF1_18033_H_ #define BOTAN_KDF1_18033_H_ #include #include namespace Botan { /** * KDF1, from ISO 18033-2 */ class BOTAN_PUBLIC_API(2,0) KDF1_18033 final : public KDF { public: std::string name() const override { return "KDF1-18033(" + m_hash->name() + ")"; } KDF* clone() const override { return new KDF1_18033(m_hash->clone()); } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param h hash function to use */ explicit KDF1_18033(HashFunction* h) : m_hash(h) {} private: std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/kdf/kdf2/000077500000000000000000000000001322470703100155465ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/kdf2/info.txt000066400000000000000000000000461322470703100172420ustar00rootroot00000000000000 KDF2 -> 20131128 botan-2.4.0/src/lib/kdf/kdf2/kdf2.cpp000066400000000000000000000015471322470703100171070ustar00rootroot00000000000000/* * KDF2 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { size_t KDF2::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { uint32_t counter = 1; secure_vector h; size_t offset = 0; while(offset != key_len && counter != 0) { m_hash->update(secret, secret_len); m_hash->update_be(counter++); m_hash->update(label, label_len); m_hash->update(salt, salt_len); m_hash->final(h); const size_t added = std::min(h.size(), key_len - offset); copy_mem(&key[offset], h.data(), added); offset += added; } return offset; } } botan-2.4.0/src/lib/kdf/kdf2/kdf2.h000066400000000000000000000016061322470703100165500ustar00rootroot00000000000000/* * KDF2 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KDF2_H_ #define BOTAN_KDF2_H_ #include #include namespace Botan { /** * KDF2, from IEEE 1363 */ class BOTAN_PUBLIC_API(2,0) KDF2 final : public KDF { public: std::string name() const override { return "KDF2(" + m_hash->name() + ")"; } KDF* clone() const override { return new KDF2(m_hash->clone()); } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param h hash function to use */ explicit KDF2(HashFunction* h) : m_hash(h) {} private: std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/kdf/prf_tls/000077500000000000000000000000001322470703100163715ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/prf_tls/info.txt000066400000000000000000000001531322470703100200640ustar00rootroot00000000000000 TLS_V10_PRF -> 20131128 TLS_V12_PRF -> 20131128 hmac md5 sha1 botan-2.4.0/src/lib/kdf/prf_tls/prf_tls.cpp000066400000000000000000000047761322470703100205640ustar00rootroot00000000000000/* * TLS v1.0 and v1.2 PRFs * (C) 2004-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { TLS_PRF::TLS_PRF() : m_hmac_md5(MessageAuthenticationCode::create_or_throw("HMAC(MD5)")), m_hmac_sha1(MessageAuthenticationCode::create_or_throw("HMAC(SHA-1)")) { } namespace { /* * TLS PRF P_hash function */ void P_hash(uint8_t out[], size_t out_len, MessageAuthenticationCode& mac, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len) { try { mac.set_key(secret, secret_len); } catch(Invalid_Key_Length) { throw Internal_Error("The premaster secret of " + std::to_string(secret_len) + " bytes is too long for the PRF"); } secure_vector A(salt, salt + salt_len); secure_vector h; size_t offset = 0; while(offset != out_len) { A = mac.process(A); mac.update(A); mac.update(salt, salt_len); mac.final(h); const size_t writing = std::min(h.size(), out_len - offset); xor_buf(&out[offset], h.data(), writing); offset += writing; } } } size_t TLS_PRF::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { const size_t S1_len = (secret_len + 1) / 2, S2_len = (secret_len + 1) / 2; const uint8_t* S1 = secret; const uint8_t* S2 = secret + (secret_len - S2_len); secure_vector msg; msg.reserve(label_len + salt_len); msg += std::make_pair(label, label_len); msg += std::make_pair(salt, salt_len); P_hash(key, key_len, *m_hmac_md5, S1, S1_len, msg.data(), msg.size()); P_hash(key, key_len, *m_hmac_sha1, S2, S2_len, msg.data(), msg.size()); return key_len; } size_t TLS_12_PRF::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { secure_vector msg; msg.reserve(label_len + salt_len); msg += std::make_pair(label, label_len); msg += std::make_pair(salt, salt_len); P_hash(key, key_len, *m_mac, secret, secret_len, msg.data(), msg.size()); return key_len; } } botan-2.4.0/src/lib/kdf/prf_tls/prf_tls.h000066400000000000000000000031001322470703100202050ustar00rootroot00000000000000/* * TLS v1.0 and v1.2 PRFs * (C) 2004-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_PRF_H_ #define BOTAN_TLS_PRF_H_ #include #include namespace Botan { /** * PRF used in TLS 1.0/1.1 */ class BOTAN_PUBLIC_API(2,0) TLS_PRF final : public KDF { public: std::string name() const override { return "TLS-PRF"; } KDF* clone() const override { return new TLS_PRF; } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; TLS_PRF(); private: std::unique_ptr m_hmac_md5; std::unique_ptr m_hmac_sha1; }; /** * PRF used in TLS 1.2 */ class BOTAN_PUBLIC_API(2,0) TLS_12_PRF final : public KDF { public: std::string name() const override { return "TLS-12-PRF(" + m_mac->name() + ")"; } KDF* clone() const override { return new TLS_12_PRF(m_mac->clone()); } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param mac MAC algorithm to use */ explicit TLS_12_PRF(MessageAuthenticationCode* mac) : m_mac(mac) {} private: std::unique_ptr m_mac; }; } #endif botan-2.4.0/src/lib/kdf/prf_x942/000077500000000000000000000000001322470703100162755ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/prf_x942/info.txt000066400000000000000000000001141322470703100177650ustar00rootroot00000000000000 X942_PRF -> 20131128 asn1 sha1 botan-2.4.0/src/lib/kdf/prf_x942/prf_x942.cpp000066400000000000000000000042661322470703100203660ustar00rootroot00000000000000/* * X9.42 PRF * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { /* * Encode an integer as an OCTET STRING */ std::vector encode_x942_int(uint32_t n) { uint8_t n_buf[4] = { 0 }; store_be(n, n_buf); return DER_Encoder().encode(n_buf, 4, OCTET_STRING).get_contents_unlocked(); } } size_t X942_PRF::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { std::unique_ptr hash(HashFunction::create("SHA-160")); const OID kek_algo(m_key_wrap_oid); secure_vector h; secure_vector in; size_t offset = 0; uint32_t counter = 1; in.reserve(salt_len + label_len); in += std::make_pair(label,label_len); in += std::make_pair(salt,salt_len); while(offset != key_len && counter) { hash->update(secret, secret_len); hash->update( DER_Encoder().start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(kek_algo) .raw_bytes(encode_x942_int(counter)) .end_cons() .encode_if(salt_len != 0, DER_Encoder() .start_explicit(0) .encode(in, OCTET_STRING) .end_explicit() ) .start_explicit(2) .raw_bytes(encode_x942_int(static_cast(8 * key_len))) .end_explicit() .end_cons().get_contents() ); hash->final(h); const size_t copied = std::min(h.size(), key_len - offset); copy_mem(&key[offset], h.data(), copied); offset += copied; ++counter; } return offset; } /* * X9.42 Constructor */ X942_PRF::X942_PRF(const std::string& oid) { if(OIDS::have_oid(oid)) m_key_wrap_oid = OIDS::lookup(oid).as_string(); else m_key_wrap_oid = oid; } } botan-2.4.0/src/lib/kdf/prf_x942/prf_x942.h000066400000000000000000000015121322470703100200220ustar00rootroot00000000000000/* * X9.42 PRF * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ANSI_X942_PRF_H_ #define BOTAN_ANSI_X942_PRF_H_ #include namespace Botan { /** * PRF from ANSI X9.42 */ class BOTAN_PUBLIC_API(2,0) X942_PRF final : public KDF { public: std::string name() const override { return "X9.42-PRF(" + m_key_wrap_oid + ")"; } KDF* clone() const override { return new X942_PRF(m_key_wrap_oid); } size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; explicit X942_PRF(const std::string& oid); private: std::string m_key_wrap_oid; }; } #endif botan-2.4.0/src/lib/kdf/sp800_108/000077500000000000000000000000001322470703100161625ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/sp800_108/info.txt000066400000000000000000000001141322470703100176520ustar00rootroot00000000000000 SP800_108 -> 20160128 mac hmac botan-2.4.0/src/lib/kdf/sp800_108/sp800_108.cpp000066400000000000000000000103561322470703100201350ustar00rootroot00000000000000/* * KDFs defined in NIST SP 800-108 * (C) 2016 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { size_t SP800_108_Counter::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { const std::size_t prf_len = m_prf->output_length(); const uint8_t delim = 0; const uint32_t length = static_cast(key_len * 8); uint8_t *p = key; uint32_t counter = 1; uint8_t be_len[4] = { 0 }; secure_vector tmp; store_be(length, be_len); m_prf->set_key(secret, secret_len); while(p < key + key_len && counter != 0) { const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len); uint8_t be_cnt[4] = { 0 }; store_be(counter, be_cnt); m_prf->update(be_cnt,4); m_prf->update(label,label_len); m_prf->update(delim); m_prf->update(salt,salt_len); m_prf->update(be_len,4); m_prf->final(tmp); copy_mem(p, tmp.data(), to_copy); p += to_copy; ++counter; if(counter == 0) throw Invalid_Argument("Can't process more than 4GB"); } return key_len; } size_t SP800_108_Feedback::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { const uint32_t length = static_cast(key_len * 8); const std::size_t prf_len = m_prf->output_length(); const std::size_t iv_len = (salt_len >= prf_len ? prf_len : 0); const uint8_t delim = 0; uint8_t *p = key; uint32_t counter = 1; uint8_t be_len[4] = { 0 }; secure_vector< uint8_t > prev(salt, salt + iv_len); secure_vector< uint8_t > ctx(salt + iv_len, salt + salt_len); store_be(length, be_len); m_prf->set_key(secret, secret_len); while(p < key + key_len && counter != 0) { const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len); uint8_t be_cnt[4] = { 0 }; store_be(counter, be_cnt); m_prf->update(prev); m_prf->update(be_cnt,4); m_prf->update(label,label_len); m_prf->update(delim); m_prf->update(ctx); m_prf->update(be_len,4); m_prf->final(prev); copy_mem(p, prev.data(), to_copy); p += to_copy; ++counter; if(counter == 0) throw Invalid_Argument("Can't process more than 4GB"); } return key_len; } size_t SP800_108_Pipeline::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { const uint32_t length = static_cast(key_len * 8); const std::size_t prf_len = m_prf->output_length(); const uint8_t delim = 0; uint8_t *p = key; uint32_t counter = 1; uint8_t be_len[4] = { 0 }; secure_vector ai, ki; store_be(length, be_len); m_prf->set_key(secret,secret_len); // A(0) std::copy(label,label + label_len,std::back_inserter(ai)); ai.emplace_back(delim); std::copy(salt,salt + salt_len,std::back_inserter(ai)); std::copy(be_len,be_len + 4,std::back_inserter(ai)); while(p < key + key_len && counter != 0) { // A(i) m_prf->update(ai); m_prf->final(ai); // K(i) const std::size_t to_copy = std::min< std::size_t >(key + key_len - p, prf_len); uint8_t be_cnt[4] = { 0 }; store_be(counter, be_cnt); m_prf->update(ai); m_prf->update(be_cnt,4); m_prf->update(label, label_len); m_prf->update(delim); m_prf->update(salt, salt_len); m_prf->update(be_len,4); m_prf->final(ki); copy_mem(p, ki.data(), to_copy); p += to_copy; ++counter; if(counter == 0) throw Invalid_Argument("Can't process more than 4GB"); } return key_len; } } botan-2.4.0/src/lib/kdf/sp800_108/sp800_108.h000066400000000000000000000103311322470703100175730ustar00rootroot00000000000000/* * KDFs defined in NIST SP 800-108 * (C) 2016 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SP800_108_H_ #define BOTAN_SP800_108_H_ #include #include namespace Botan { /** * NIST SP 800-108 KDF in Counter Mode (5.1) */ class BOTAN_PUBLIC_API(2,0) SP800_108_Counter final : public KDF { public: std::string name() const override { return "SP800-108-Counter(" + m_prf->name() + ")"; } KDF* clone() const override { return new SP800_108_Counter(m_prf->clone()); } /** * Derive a key using the SP800-108 KDF in Counter mode. * * The implementation hard codes the length of [L]_2 * and [i]_2 (the value r) to 32 bits. * * @param key resulting keying material * @param key_len the desired output length in bytes * @param secret K_I * @param secret_len size of K_I in bytes * @param salt Context * @param salt_len size of Context in bytes * @param label Label * @param label_len size of Label in bytes * * @throws Invalid_Argument key_len > 2^32 */ size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param mac MAC algorithm to use */ explicit SP800_108_Counter(MessageAuthenticationCode* mac) : m_prf(mac) {} private: std::unique_ptr m_prf; }; /** * NIST SP 800-108 KDF in Feedback Mode (5.2) */ class BOTAN_PUBLIC_API(2,0) SP800_108_Feedback final : public KDF { public: std::string name() const override { return "SP800-108-Feedback(" + m_prf->name() + ")"; } KDF* clone() const override { return new SP800_108_Feedback(m_prf->clone()); } /** * Derive a key using the SP800-108 KDF in Feedback mode. * * The implementation uses the optional counter i and hard * codes the length of [L]_2 and [i]_2 (the value r) to 32 bits. * * @param key resulting keying material * @param key_len the desired output length in bytes * @param secret K_I * @param secret_len size of K_I in bytes * @param salt IV || Context * @param salt_len size of Context plus IV in bytes * @param label Label * @param label_len size of Label in bytes * * @throws Invalid_Argument key_len > 2^32 */ size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; explicit SP800_108_Feedback(MessageAuthenticationCode* mac) : m_prf(mac) {} private: std::unique_ptr m_prf; }; /** * NIST SP 800-108 KDF in Double Pipeline Mode (5.3) */ class BOTAN_PUBLIC_API(2,0) SP800_108_Pipeline final : public KDF { public: std::string name() const override { return "SP800-108-Pipeline(" + m_prf->name() + ")"; } KDF* clone() const override { return new SP800_108_Pipeline(m_prf->clone()); } /** * Derive a key using the SP800-108 KDF in Double Pipeline mode. * * The implementation uses the optional counter i and hard * codes the length of [L]_2 and [i]_2 (the value r) to 32 bits. * * @param key resulting keying material * @param key_len the desired output length in bytes * @param secret K_I * @param secret_len size of K_I in bytes * @param salt Context * @param salt_len size of Context in bytes * @param label Label * @param label_len size of Label in bytes * * @throws Invalid_Argument key_len > 2^32 */ size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; explicit SP800_108_Pipeline(MessageAuthenticationCode* mac) : m_prf(mac) {} private: std::unique_ptr m_prf; }; } #endif botan-2.4.0/src/lib/kdf/sp800_56a/000077500000000000000000000000001322470703100162455ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/sp800_56a/info.txt000066400000000000000000000001101322470703100177310ustar00rootroot00000000000000 SP800_56A -> 20170501 hmac botan-2.4.0/src/lib/kdf/sp800_56a/sp800_56a.cpp000066400000000000000000000054461322470703100203070ustar00rootroot00000000000000/* * KDF defined in NIST SP 800-56a (Approved Alternative 1) * * (C) 2017 Ribose Inc. Written by Krzysztof Kwiatkowski. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { template size_t SP800_56A_kdf( AuxiliaryFunction_t& auxfunc, uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t label[], size_t label_len) { const uint64_t kRepsUpperBound = (1ULL << 32); const size_t digest_len = auxfunc.output_length(); const size_t reps = key_len / digest_len + ((key_len % digest_len) ? 1 : 0); if (reps >= kRepsUpperBound) { // See SP-800-56A, point 5.8.1 throw Invalid_Argument("SP800-56A KDF requested output too large"); } uint32_t counter = 1; secure_vector result; for(size_t i = 0; i < reps; i++) { auxfunc.update_be(counter++); auxfunc.update(secret, secret_len); auxfunc.update(label, label_len); auxfunc.final(result); const size_t offset = digest_len * i; const size_t len = std::min(result.size(), key_len - offset); copy_mem(&key[offset], result.data(), len); } return key_len; } } size_t SP800_56A_Hash::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { /* * TODO: should we reject a non-empty salt with an exception? * Ignoring the salt seems quite dangerous to applications which * don't expect it. */ BOTAN_UNUSED(salt, salt_len); return SP800_56A_kdf(*m_hash, key, key_len, secret, secret_len, label, label_len); } SP800_56A_HMAC::SP800_56A_HMAC(MessageAuthenticationCode* mac) : m_mac(mac) { // TODO: we need a MessageAuthenticationCode::is_hmac const SCAN_Name req(m_mac->name()); if(req.algo_name() != "HMAC") { throw Algorithm_Not_Found("Only HMAC can be used with KDF SP800-56A"); } } size_t SP800_56A_HMAC::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { /* * SP 800-56A specifies if the salt is empty then a block of zeros * equal to the hash's underlying block size are used. However this * is equivalent to setting a zero-length key, so the same call * works for either case. */ m_mac->set_key(salt, salt_len); return SP800_56A_kdf(*m_mac, key, key_len, secret, secret_len, label, label_len); } } botan-2.4.0/src/lib/kdf/sp800_56a/sp800_56a.h000066400000000000000000000061041322470703100177440ustar00rootroot00000000000000/* * KDF defined in NIST SP 800-56a revision 2 (Single-step key-derivation function) * * (C) 2017 Ribose Inc. Written by Krzysztof Kwiatkowski. * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SP800_56A_H_ #define BOTAN_SP800_56A_H_ #include #include #include namespace Botan { /** * NIST SP 800-56A KDF using hash function * @warning This KDF ignores the provided salt value */ class BOTAN_PUBLIC_API(2,2) SP800_56A_Hash final : public KDF { public: std::string name() const override { return "SP800-56A(" + m_hash->name() + ")"; } KDF* clone() const override { return new SP800_56A_Hash(m_hash->clone()); } /** * Derive a key using the SP800-56A KDF. * * The implementation hard codes the context value for the * expansion step to the empty string. * * @param key derived keying material K_M * @param key_len the desired output length in bytes * @param secret shared secret Z * @param secret_len size of Z in bytes * @param salt ignored * @param salt_len ignored * @param label label for the expansion step * @param label_len size of label in bytes * * @throws Invalid_Argument key_len > 2^32 */ size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param hash the hash function to use as the auxiliary function */ explicit SP800_56A_Hash(HashFunction* hash) : m_hash(hash) {} private: std::unique_ptr m_hash; }; /** * NIST SP 800-56A KDF using HMAC */ class BOTAN_PUBLIC_API(2,2) SP800_56A_HMAC final : public KDF { public: std::string name() const override { return "SP800-56A(" + m_mac->name() + ")"; } KDF* clone() const override { return new SP800_56A_HMAC(m_mac->clone()); } /** * Derive a key using the SP800-56A KDF. * * The implementation hard codes the context value for the * expansion step to the empty string. * * @param key derived keying material K_M * @param key_len the desired output length in bytes * @param secret shared secret Z * @param secret_len size of Z in bytes * @param salt ignored * @param salt_len ignored * @param label label for the expansion step * @param label_len size of label in bytes * * @throws Invalid_Argument key_len > 2^32 or MAC is not a HMAC */ size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param mac the HMAC to use as the auxiliary function */ explicit SP800_56A_HMAC(MessageAuthenticationCode* mac); private: std::unique_ptr m_mac; }; } #endif botan-2.4.0/src/lib/kdf/sp800_56c/000077500000000000000000000000001322470703100162475ustar00rootroot00000000000000botan-2.4.0/src/lib/kdf/sp800_56c/info.txt000066400000000000000000000001221322470703100177360ustar00rootroot00000000000000 SP800_56C -> 20160211 sp800_108 hmac botan-2.4.0/src/lib/kdf/sp800_56c/sp800_56c.cpp000066400000000000000000000013621322470703100203040ustar00rootroot00000000000000/* * KDF defined in NIST SP 800-56c * (C) 2016 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { size_t SP800_56C::kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const { // Randomness Extraction secure_vector< uint8_t > k_dk; m_prf->set_key(salt, salt_len); m_prf->update(secret, secret_len); m_prf->final(k_dk); // Key Expansion m_exp->kdf(key, key_len, k_dk.data(), k_dk.size(), nullptr, 0, label, label_len); return key_len; } } botan-2.4.0/src/lib/kdf/sp800_56c/sp800_56c.h000066400000000000000000000033141322470703100177500ustar00rootroot00000000000000/* * KDF defined in NIST SP 800-56c * (C) 2016 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SP800_56C_H_ #define BOTAN_SP800_56C_H_ #include #include namespace Botan { /** * NIST SP 800-56C KDF */ class BOTAN_PUBLIC_API(2,0) SP800_56C final : public KDF { public: std::string name() const override { return "SP800-56C(" + m_prf->name() + ")"; } KDF* clone() const override { return new SP800_56C(m_prf->clone(), m_exp->clone()); } /** * Derive a key using the SP800-56C KDF. * * The implementation hard codes the context value for the * expansion step to the empty string. * * @param key derived keying material K_M * @param key_len the desired output length in bytes * @param secret shared secret Z * @param secret_len size of Z in bytes * @param salt salt s of the extraction step * @param salt_len size of s in bytes * @param label label for the expansion step * @param label_len size of label in bytes * * @throws Invalid_Argument key_len > 2^32 */ size_t kdf(uint8_t key[], size_t key_len, const uint8_t secret[], size_t secret_len, const uint8_t salt[], size_t salt_len, const uint8_t label[], size_t label_len) const override; /** * @param mac MAC algorithm used for randomness extraction * @param exp KDF used for key expansion */ SP800_56C(MessageAuthenticationCode* mac, KDF* exp) : m_prf(mac), m_exp(exp) {} private: std::unique_ptr m_prf; std::unique_ptr m_exp; }; } #endif botan-2.4.0/src/lib/mac/000077500000000000000000000000001322470703100147145ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/cbc_mac/000077500000000000000000000000001322470703100162635ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/cbc_mac/cbc_mac.cpp000066400000000000000000000034141322470703100203400ustar00rootroot00000000000000/* * CBC-MAC * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* * Update an CBC-MAC Calculation */ void CBC_MAC::add_data(const uint8_t input[], size_t length) { verify_key_set(m_state.empty() == false); size_t xored = std::min(output_length() - m_position, length); xor_buf(&m_state[m_position], input, xored); m_position += xored; if(m_position < output_length()) return; m_cipher->encrypt(m_state); input += xored; length -= xored; while(length >= output_length()) { xor_buf(m_state, input, output_length()); m_cipher->encrypt(m_state); input += output_length(); length -= output_length(); } xor_buf(m_state, input, length); m_position = length; } /* * Finalize an CBC-MAC Calculation */ void CBC_MAC::final_result(uint8_t mac[]) { verify_key_set(m_state.empty() == false); if(m_position) m_cipher->encrypt(m_state); copy_mem(mac, m_state.data(), m_state.size()); zeroise(m_state); m_position = 0; } /* * CBC-MAC Key Schedule */ void CBC_MAC::key_schedule(const uint8_t key[], size_t length) { m_state.resize(m_cipher->block_size()); m_cipher->set_key(key, length); } /* * Clear memory of sensitive data */ void CBC_MAC::clear() { m_cipher->clear(); zap(m_state); m_position = 0; } /* * Return the name of this type */ std::string CBC_MAC::name() const { return "CBC-MAC(" + m_cipher->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* CBC_MAC::clone() const { return new CBC_MAC(m_cipher->clone()); } /* * CBC-MAC Constructor */ CBC_MAC::CBC_MAC(BlockCipher* cipher) : m_cipher(cipher) { } } botan-2.4.0/src/lib/mac/cbc_mac/cbc_mac.h000066400000000000000000000021011322470703100177750ustar00rootroot00000000000000/* * CBC-MAC * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CBC_MAC_H_ #define BOTAN_CBC_MAC_H_ #include #include namespace Botan { /** * CBC-MAC */ class BOTAN_PUBLIC_API(2,0) CBC_MAC final : public MessageAuthenticationCode { public: std::string name() const override; MessageAuthenticationCode* clone() const override; size_t output_length() const override { return m_cipher->block_size(); } void clear() override; Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } /** * @param cipher the block cipher to use */ explicit CBC_MAC(BlockCipher* cipher); private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void key_schedule(const uint8_t[], size_t) override; std::unique_ptr m_cipher; secure_vector m_state; size_t m_position = 0; }; } #endif botan-2.4.0/src/lib/mac/cbc_mac/info.txt000066400000000000000000000000511322470703100177530ustar00rootroot00000000000000 CBC_MAC -> 20131128 botan-2.4.0/src/lib/mac/cmac/000077500000000000000000000000001322470703100156175ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/cmac/cmac.cpp000066400000000000000000000054221322470703100172310ustar00rootroot00000000000000/* * CMAC * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Perform CMAC's multiplication in GF(2^n) */ secure_vector CMAC::poly_double(const secure_vector& in) { secure_vector out(in.size()); poly_double_n(out.data(), in.data(), out.size()); return out; } /* * Update an CMAC Calculation */ void CMAC::add_data(const uint8_t input[], size_t length) { const size_t bs = output_length(); buffer_insert(m_buffer, m_position, input, length); if(m_position + length > bs) { xor_buf(m_state, m_buffer, bs); m_cipher->encrypt(m_state); input += (bs - m_position); length -= (bs - m_position); while(length > bs) { xor_buf(m_state, input, bs); m_cipher->encrypt(m_state); input += bs; length -= bs; } copy_mem(m_buffer.data(), input, length); m_position = 0; } m_position += length; } /* * Finalize an CMAC Calculation */ void CMAC::final_result(uint8_t mac[]) { xor_buf(m_state, m_buffer, m_position); if(m_position == output_length()) { xor_buf(m_state, m_B, output_length()); } else { m_state[m_position] ^= 0x80; xor_buf(m_state, m_P, output_length()); } m_cipher->encrypt(m_state); copy_mem(mac, m_state.data(), output_length()); zeroise(m_state); zeroise(m_buffer); m_position = 0; } /* * CMAC Key Schedule */ void CMAC::key_schedule(const uint8_t key[], size_t length) { clear(); m_cipher->set_key(key, length); m_cipher->encrypt(m_B); poly_double_n(m_B.data(), m_B.size()); poly_double_n(m_P.data(), m_B.data(), m_P.size()); } /* * Clear memory of sensitive data */ void CMAC::clear() { m_cipher->clear(); zeroise(m_state); zeroise(m_buffer); zeroise(m_B); zeroise(m_P); m_position = 0; } /* * Return the name of this type */ std::string CMAC::name() const { return "CMAC(" + m_cipher->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* CMAC::clone() const { return new CMAC(m_cipher->clone()); } /* * CMAC Constructor */ CMAC::CMAC(BlockCipher* cipher) : m_cipher(cipher), m_block_size(m_cipher->block_size()) { if(poly_double_supported_size(m_block_size) == false) { throw Invalid_Argument("CMAC cannot use the " + std::to_string(m_block_size * 8) + " bit cipher " + m_cipher->name()); } m_state.resize(output_length()); m_buffer.resize(output_length()); m_B.resize(output_length()); m_P.resize(output_length()); m_position = 0; } } botan-2.4.0/src/lib/mac/cmac/cmac.h000066400000000000000000000031731322470703100166770ustar00rootroot00000000000000/* * CMAC * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CMAC_H_ #define BOTAN_CMAC_H_ #include #include namespace Botan { /** * CMAC, also known as OMAC1 */ class BOTAN_PUBLIC_API(2,0) CMAC final : public MessageAuthenticationCode { public: std::string name() const override; size_t output_length() const override { return m_block_size; } MessageAuthenticationCode* clone() const override; void clear() override; Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } /** * CMAC's polynomial doubling operation * * This function was only exposed for use elsewhere in the library, but it is not * longer used. This function will be removed in a future release. * * @param in the input */ static secure_vector BOTAN_DEPRECATED("This was only for internal use and is no longer used") poly_double(const secure_vector& in); /** * @param cipher the block cipher to use */ explicit CMAC(BlockCipher* cipher); CMAC(const CMAC&) = delete; CMAC& operator=(const CMAC&) = delete; private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void key_schedule(const uint8_t[], size_t) override; std::unique_ptr m_cipher; secure_vector m_buffer, m_state, m_B, m_P; const size_t m_block_size; size_t m_position; }; } #endif botan-2.4.0/src/lib/mac/cmac/info.txt000066400000000000000000000001071322470703100173110ustar00rootroot00000000000000 CMAC -> 20131128 poly_dbl botan-2.4.0/src/lib/mac/gmac/000077500000000000000000000000001322470703100156235ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/gmac/gmac.cpp000066400000000000000000000060701322470703100172410ustar00rootroot00000000000000/* * GMAC * (C) 2016 Matthias Gierlings, René Korthaus * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { GMAC::GMAC(BlockCipher* cipher) : m_cipher(cipher), m_ghash(new GHASH), m_aad_buf(GCM_BS), m_aad_buf_pos(0), m_initialized(false) { } void GMAC::clear() { m_cipher->clear(); m_ghash->clear(); zeroise(m_aad_buf); m_aad_buf_pos = 0; m_initialized = false; } GMAC::~GMAC() { /* for unique_ptr */ } Key_Length_Specification GMAC::key_spec() const { return m_cipher->key_spec(); } std::string GMAC::name() const { return "GMAC(" + m_cipher->name() + ")"; } size_t GMAC::output_length() const { return GCM_BS; } void GMAC::add_data(const uint8_t input[], size_t size) { if(m_aad_buf_pos > 0) { const size_t taking = std::min(GCM_BS - m_aad_buf_pos, size); copy_mem(&m_aad_buf[m_aad_buf_pos], input, taking); m_aad_buf_pos += taking; input += taking; size -= taking; if(m_aad_buf_pos == GCM_BS) { m_ghash->update_associated_data(m_aad_buf.data(), GCM_BS); m_aad_buf_pos = 0; } } const size_t left_over = size % GCM_BS; const size_t full_blocks = size - left_over; m_ghash->update_associated_data(input, full_blocks); input += full_blocks; if(left_over > 0) { copy_mem(&m_aad_buf[m_aad_buf_pos], input, left_over); m_aad_buf_pos += left_over; } } void GMAC::key_schedule(const uint8_t key[], size_t size) { clear(); m_cipher->set_key(key, size); secure_vector H(GCM_BS); m_cipher->encrypt(H); m_ghash->set_key(H); } void GMAC::start_msg(const uint8_t nonce[], size_t nonce_len) { secure_vector y0(GCM_BS); if(nonce_len == 12) { copy_mem(y0.data(), nonce, nonce_len); y0[GCM_BS - 1] = 1; } else { m_ghash->ghash_update(y0, nonce, nonce_len); m_ghash->add_final_block(y0, 0, nonce_len); } secure_vector m_enc_y0(GCM_BS); m_cipher->encrypt(y0.data(), m_enc_y0.data()); m_ghash->start(m_enc_y0.data(), m_enc_y0.size()); m_initialized = true; } void GMAC::final_result(uint8_t mac[]) { // This ensures the GMAC computation has been initialized with a fresh // nonce. The aim of this check is to prevent developers from re-using // nonces (and potential nonce-reuse attacks). if(m_initialized == false) throw Invalid_State("GMAC was not used with a fresh nonce"); // process the rest of the aad buffer. Even if it is a partial block only // ghash_update will process it properly. if(m_aad_buf_pos > 0) { m_ghash->update_associated_data(m_aad_buf.data(), m_aad_buf_pos); } secure_vector result = m_ghash->final(); copy_mem(mac, result.data(), result.size()); clear(); } MessageAuthenticationCode* GMAC::clone() const { return new GMAC(m_cipher->clone()); } } botan-2.4.0/src/lib/mac/gmac/gmac.h000066400000000000000000000027451322470703100167130ustar00rootroot00000000000000/* * GMAC * (C) 2016 Matthias Gierlings, René Korthaus * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GMAC_H_ #define BOTAN_GMAC_H_ #include namespace Botan { class BlockCipher; class GHASH; /** * GMAC * * GMAC requires a unique initialization vector be used for each message. * This must be provided via the MessageAuthenticationCode::start() API */ class BOTAN_PUBLIC_API(2,0) GMAC final : public MessageAuthenticationCode { public: void clear() override; std::string name() const override; size_t output_length() const override; MessageAuthenticationCode* clone() const override; Key_Length_Specification key_spec() const override; /** * Creates a new GMAC instance. * * @param cipher the underlying block cipher to use */ explicit GMAC(BlockCipher* cipher); GMAC(const GMAC&) = delete; GMAC& operator=(const GMAC&) = delete; ~GMAC(); private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t size) override; static const size_t GCM_BS = 16; std::unique_ptr m_cipher; std::unique_ptr m_ghash; secure_vector m_aad_buf; size_t m_aad_buf_pos; bool m_initialized; }; } #endif botan-2.4.0/src/lib/mac/gmac/info.txt000066400000000000000000000001061322470703100173140ustar00rootroot00000000000000 GMAC -> 20160207 gcm mac botan-2.4.0/src/lib/mac/hmac/000077500000000000000000000000001322470703100156245ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/hmac/hmac.cpp000066400000000000000000000040771322470703100172500ustar00rootroot00000000000000/* * HMAC * (C) 1999-2007,2014 Jack Lloyd * 2007 Yves Jerschow * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* * Update a HMAC Calculation */ void HMAC::add_data(const uint8_t input[], size_t length) { verify_key_set(m_ikey.empty() == false); m_hash->update(input, length); } /* * Finalize a HMAC Calculation */ void HMAC::final_result(uint8_t mac[]) { verify_key_set(m_okey.empty() == false); m_hash->final(mac); m_hash->update(m_okey); m_hash->update(mac, output_length()); m_hash->final(mac); m_hash->update(m_ikey); } Key_Length_Specification HMAC::key_spec() const { // Support very long lengths for things like PBKDF2 and the TLS PRF return Key_Length_Specification(0, 4096); } /* * HMAC Key Schedule */ void HMAC::key_schedule(const uint8_t key[], size_t length) { m_hash->clear(); m_ikey.resize(m_hash->hash_block_size()); m_okey.resize(m_hash->hash_block_size()); const uint8_t ipad = 0x36; const uint8_t opad = 0x5C; std::fill(m_ikey.begin(), m_ikey.end(), ipad); std::fill(m_okey.begin(), m_okey.end(), opad); if(length > m_hash->hash_block_size()) { secure_vector hmac_key = m_hash->process(key, length); xor_buf(m_ikey, hmac_key, hmac_key.size()); xor_buf(m_okey, hmac_key, hmac_key.size()); } else { xor_buf(m_ikey, key, length); xor_buf(m_okey, key, length); } m_hash->update(m_ikey); } /* * Clear memory of sensitive data */ void HMAC::clear() { m_hash->clear(); zap(m_ikey); zap(m_okey); } /* * Return the name of this type */ std::string HMAC::name() const { return "HMAC(" + m_hash->name() + ")"; } /* * Return a clone of this object */ MessageAuthenticationCode* HMAC::clone() const { return new HMAC(m_hash->clone()); } /* * HMAC Constructor */ HMAC::HMAC(HashFunction* hash) : m_hash(hash) { if(m_hash->hash_block_size() == 0) throw Invalid_Argument("HMAC cannot be used with " + m_hash->name()); } } botan-2.4.0/src/lib/mac/hmac/hmac.h000066400000000000000000000020551322470703100167070ustar00rootroot00000000000000/* * HMAC * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HMAC_H_ #define BOTAN_HMAC_H_ #include #include namespace Botan { /** * HMAC */ class BOTAN_PUBLIC_API(2,0) HMAC final : public MessageAuthenticationCode { public: void clear() override; std::string name() const override; MessageAuthenticationCode* clone() const override; size_t output_length() const override { return m_hash->output_length(); } Key_Length_Specification key_spec() const override; /** * @param hash the hash to use for HMACing */ explicit HMAC(HashFunction* hash); HMAC(const HMAC&) = delete; HMAC& operator=(const HMAC&) = delete; private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void key_schedule(const uint8_t[], size_t) override; std::unique_ptr m_hash; secure_vector m_ikey, m_okey; }; } #endif botan-2.4.0/src/lib/mac/hmac/info.txt000066400000000000000000000000461322470703100173200ustar00rootroot00000000000000 HMAC -> 20131128 botan-2.4.0/src/lib/mac/info.txt000066400000000000000000000001151322470703100164050ustar00rootroot00000000000000 MAC -> 20150626 mac.h botan-2.4.0/src/lib/mac/mac.cpp000066400000000000000000000077621322470703100161740ustar00rootroot00000000000000/* * Message Authentication Code base class * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_CBC_MAC) #include #endif #if defined(BOTAN_HAS_CMAC) #include #endif #if defined(BOTAN_HAS_GMAC) #include #include #endif #if defined(BOTAN_HAS_HMAC) #include #include #endif #if defined(BOTAN_HAS_POLY1305) #include #endif #if defined(BOTAN_HAS_SIPHASH) #include #endif #if defined(BOTAN_HAS_ANSI_X919_MAC) #include #endif namespace Botan { std::unique_ptr MessageAuthenticationCode::create(const std::string& algo_spec, const std::string& provider) { const SCAN_Name req(algo_spec); #if defined(BOTAN_HAS_GMAC) if(req.algo_name() == "GMAC" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { if(auto bc = BlockCipher::create(req.arg(0))) return std::unique_ptr(new GMAC(bc.release())); } } #endif #if defined(BOTAN_HAS_HMAC) if(req.algo_name() == "HMAC" && req.arg_count() == 1) { // TODO OpenSSL if(provider.empty() || provider == "base") { if(auto h = HashFunction::create(req.arg(0))) return std::unique_ptr(new HMAC(h.release())); } } #endif #if defined(BOTAN_HAS_POLY1305) if(req.algo_name() == "Poly1305" && req.arg_count() == 0) { if(provider.empty() || provider == "base") return std::unique_ptr(new Poly1305); } #endif #if defined(BOTAN_HAS_SIPHASH) if(req.algo_name() == "SipHash") { if(provider.empty() || provider == "base") { return std::unique_ptr( new SipHash(req.arg_as_integer(0, 2), req.arg_as_integer(1, 4))); } } #endif #if defined(BOTAN_HAS_CMAC) if((req.algo_name() == "CMAC" || req.algo_name() == "OMAC") && req.arg_count() == 1) { // TODO: OpenSSL CMAC if(provider.empty() || provider == "base") { if(auto bc = BlockCipher::create(req.arg(0))) return std::unique_ptr(new CMAC(bc.release())); } } #endif #if defined(BOTAN_HAS_CBC_MAC) if(req.algo_name() == "CBC-MAC" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { if(auto bc = BlockCipher::create(req.arg(0))) return std::unique_ptr(new CBC_MAC(bc.release())); } } #endif #if defined(BOTAN_HAS_ANSI_X919_MAC) if(req.algo_name() == "X9.19-MAC") { if(provider.empty() || provider == "base") { return std::unique_ptr(new ANSI_X919_MAC); } } #endif BOTAN_UNUSED(req); BOTAN_UNUSED(provider); return nullptr; } std::vector MessageAuthenticationCode::providers(const std::string& algo_spec) { return probe_providers_of(algo_spec, {"base", "openssl"}); } //static std::unique_ptr MessageAuthenticationCode::create_or_throw(const std::string& algo, const std::string& provider) { if(auto mac = MessageAuthenticationCode::create(algo, provider)) { return mac; } throw Lookup_Error("MAC", algo, provider); } /* * Default (deterministic) MAC verification operation */ bool MessageAuthenticationCode::verify_mac(const uint8_t mac[], size_t length) { secure_vector our_mac = final(); if(our_mac.size() != length) return false; return constant_time_compare(our_mac.data(), mac, length); } } botan-2.4.0/src/lib/mac/mac.h000066400000000000000000000106421322470703100156300ustar00rootroot00000000000000/* * Base class for message authentiction codes * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MESSAGE_AUTH_CODE_BASE_H_ #define BOTAN_MESSAGE_AUTH_CODE_BASE_H_ #include #include #include #include namespace Botan { /** * This class represents Message Authentication Code (MAC) objects. */ class BOTAN_PUBLIC_API(2,0) MessageAuthenticationCode : public Buffered_Computation, public SymmetricAlgorithm { public: /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to use * @return a null pointer if the algo/provider combination cannot be found */ static std::unique_ptr create(const std::string& algo_spec, const std::string& provider = ""); /* * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to use * Throws a Lookup_Error if algo/provider combination cannot be found */ static std::unique_ptr create_or_throw(const std::string& algo_spec, const std::string& provider = ""); /** * @return list of available providers for this algorithm, empty if not available */ static std::vector providers(const std::string& algo_spec); virtual ~MessageAuthenticationCode() = default; /** * Prepare for processing a message under the specified nonce * * Most MACs neither require nor support a nonce; for these algorithms * calling `start_msg` is optional and calling it with anything other than * an empty string is an error. One MAC which *requires* a per-message * nonce be specified is GMAC. * * @param nonce the message nonce bytes * @param nonce_len the size of len in bytes * Default implementation simply rejects all non-empty nonces * since most hash/MAC algorithms do not support randomization */ virtual void start_msg(const uint8_t nonce[], size_t nonce_len) { BOTAN_UNUSED(nonce); if(nonce_len > 0) throw Invalid_IV_Length(name(), nonce_len); } /** * Begin processing a message with a nonce * * @param nonce the per message nonce */ template void start(const std::vector& nonce) { start_msg(nonce.data(), nonce.size()); } /** * Begin processing a message. * @param nonce the per message nonce * @param nonce_len length of nonce */ void start(const uint8_t nonce[], size_t nonce_len) { start_msg(nonce, nonce_len); } /** * Begin processing a message. */ void start() { return start_msg(nullptr, 0); } /** * Verify a MAC. * @param in the MAC to verify as a byte array * @param length the length of param in * @return true if the MAC is valid, false otherwise */ virtual bool verify_mac(const uint8_t in[], size_t length); /** * Verify a MAC. * @param in the MAC to verify as a byte array * @return true if the MAC is valid, false otherwise */ virtual bool verify_mac(const std::vector& in) { return verify_mac(in.data(), in.size()); } /** * Verify a MAC. * @param in the MAC to verify as a byte array * @return true if the MAC is valid, false otherwise */ virtual bool verify_mac(const secure_vector& in) { return verify_mac(in.data(), in.size()); } /** * Get a new object representing the same algorithm as *this */ virtual MessageAuthenticationCode* clone() const = 0; /** * @return provider information about this implementation. Default is "base", * might also return "sse2", "avx2", "openssl", or some other arbitrary string. */ virtual std::string provider() const { return "base"; } }; typedef MessageAuthenticationCode MAC; } #endif botan-2.4.0/src/lib/mac/poly1305/000077500000000000000000000000001322470703100162105ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/poly1305/info.txt000066400000000000000000000001271322470703100177040ustar00rootroot00000000000000 POLY1305 -> 20141227 poly1305.h botan-2.4.0/src/lib/mac/poly1305/poly1305.cpp000066400000000000000000000124011322470703100202060ustar00rootroot00000000000000/* * Derived from poly1305-donna-64.h by Andrew Moon * in https://github.com/floodyberry/poly1305-donna * * (C) 2014 Andrew Moon * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { void poly1305_init(secure_vector& X, const uint8_t key[32]) { /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ const uint64_t t0 = load_le(key, 0); const uint64_t t1 = load_le(key, 1); X[0] = ( t0 ) & 0xffc0fffffff; X[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffff; X[2] = ((t1 >> 24) ) & 0x00ffffffc0f; /* h = 0 */ X[3] = 0; X[4] = 0; X[5] = 0; /* save pad for later */ X[6] = load_le(key, 2); X[7] = load_le(key, 3); } void poly1305_blocks(secure_vector& X, const uint8_t *m, size_t blocks, bool is_final = false) { #if !defined(BOTAN_TARGET_HAS_NATIVE_UINT128) typedef donna128 uint128_t; #endif const uint64_t hibit = is_final ? 0 : (static_cast(1) << 40); /* 1 << 128 */ const uint64_t r0 = X[0]; const uint64_t r1 = X[1]; const uint64_t r2 = X[2]; uint64_t h0 = X[3+0]; uint64_t h1 = X[3+1]; uint64_t h2 = X[3+2]; const uint64_t s1 = r1 * (5 << 2); const uint64_t s2 = r2 * (5 << 2); while(blocks--) { /* h += m[i] */ const uint64_t t0 = load_le(m, 0); const uint64_t t1 = load_le(m, 1); h0 += (( t0 ) & 0xfffffffffff); h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff); h2 += (((t1 >> 24) ) & 0x3ffffffffff) | hibit; /* h *= r */ uint128_t d0 = uint128_t(h0) * r0 + uint128_t(h1) * s2 + uint128_t(h2) * s1; uint128_t d1 = uint128_t(h0) * r1 + uint128_t(h1) * r0 + uint128_t(h2) * s2; uint128_t d2 = uint128_t(h0) * r2 + uint128_t(h1) * r1 + uint128_t(h2) * r0; /* (partial) h %= p */ uint64_t c = carry_shift(d0, 44); h0 = d0 & 0xfffffffffff; d1 += c; c = carry_shift(d1, 44); h1 = d1 & 0xfffffffffff; d2 += c; c = carry_shift(d2, 42); h2 = d2 & 0x3ffffffffff; h0 += c * 5; c = carry_shift(h0, 44); h0 = h0 & 0xfffffffffff; h1 += c; m += 16; } X[3+0] = h0; X[3+1] = h1; X[3+2] = h2; } void poly1305_finish(secure_vector& X, uint8_t mac[16]) { /* fully carry h */ uint64_t h0 = X[3+0]; uint64_t h1 = X[3+1]; uint64_t h2 = X[3+2]; uint64_t c; c = (h1 >> 44); h1 &= 0xfffffffffff; h2 += c; c = (h2 >> 42); h2 &= 0x3ffffffffff; h0 += c * 5; c = (h0 >> 44); h0 &= 0xfffffffffff; h1 += c; c = (h1 >> 44); h1 &= 0xfffffffffff; h2 += c; c = (h2 >> 42); h2 &= 0x3ffffffffff; h0 += c * 5; c = (h0 >> 44); h0 &= 0xfffffffffff; h1 += c; /* compute h + -p */ uint64_t g0 = h0 + 5; c = (g0 >> 44); g0 &= 0xfffffffffff; uint64_t g1 = h1 + c; c = (g1 >> 44); g1 &= 0xfffffffffff; uint64_t g2 = h2 + c - (static_cast(1) << 42); /* select h if h < p, or h + -p if h >= p */ c = (g2 >> ((sizeof(uint64_t) * 8) - 1)) - 1; g0 &= c; g1 &= c; g2 &= c; c = ~c; h0 = (h0 & c) | g0; h1 = (h1 & c) | g1; h2 = (h2 & c) | g2; /* h = (h + pad) */ const uint64_t t0 = X[6]; const uint64_t t1 = X[7]; h0 += (( t0 ) & 0xfffffffffff) ; c = (h0 >> 44); h0 &= 0xfffffffffff; h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff) + c; c = (h1 >> 44); h1 &= 0xfffffffffff; h2 += (((t1 >> 24) ) & 0x3ffffffffff) + c; h2 &= 0x3ffffffffff; /* mac = h % (2^128) */ h0 = ((h0 ) | (h1 << 44)); h1 = ((h1 >> 20) | (h2 << 24)); store_le(mac, h0, h1); /* zero out the state */ clear_mem(X.data(), X.size()); } } void Poly1305::clear() { zap(m_poly); zap(m_buf); m_buf_pos = 0; } void Poly1305::key_schedule(const uint8_t key[], size_t) { m_buf_pos = 0; m_buf.resize(16); m_poly.resize(8); poly1305_init(m_poly, key); } void Poly1305::add_data(const uint8_t input[], size_t length) { verify_key_set(m_poly.size() == 8); if(m_buf_pos) { buffer_insert(m_buf, m_buf_pos, input, length); if(m_buf_pos + length >= m_buf.size()) { poly1305_blocks(m_poly, m_buf.data(), 1); input += (m_buf.size() - m_buf_pos); length -= (m_buf.size() - m_buf_pos); m_buf_pos = 0; } } const size_t full_blocks = length / m_buf.size(); const size_t remaining = length % m_buf.size(); if(full_blocks) poly1305_blocks(m_poly, input, full_blocks); buffer_insert(m_buf, m_buf_pos, input + full_blocks * m_buf.size(), remaining); m_buf_pos += remaining; } void Poly1305::final_result(uint8_t out[]) { verify_key_set(m_poly.size() == 8); if(m_buf_pos != 0) { m_buf[m_buf_pos] = 1; const size_t len = m_buf.size() - m_buf_pos - 1; if (len > 0) { clear_mem(&m_buf[m_buf_pos+1], len); } poly1305_blocks(m_poly, m_buf.data(), 1, true); } poly1305_finish(m_poly, out); m_poly.clear(); m_buf_pos = 0; } } botan-2.4.0/src/lib/mac/poly1305/poly1305.h000066400000000000000000000020371322470703100176570ustar00rootroot00000000000000/* * Poly1305 * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MAC_POLY1305_H_ #define BOTAN_MAC_POLY1305_H_ #include #include namespace Botan { /** * DJB's Poly1305 * Important note: each key can only be used once */ class BOTAN_PUBLIC_API(2,0) Poly1305 final : public MessageAuthenticationCode { public: std::string name() const override { return "Poly1305"; } MessageAuthenticationCode* clone() const override { return new Poly1305; } void clear() override; size_t output_length() const override { return 16; } Key_Length_Specification key_spec() const override { return Key_Length_Specification(32); } private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void key_schedule(const uint8_t[], size_t) override; secure_vector m_poly; secure_vector m_buf; size_t m_buf_pos = 0; }; } #endif botan-2.4.0/src/lib/mac/siphash/000077500000000000000000000000001322470703100163535ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/siphash/info.txt000066400000000000000000000000511322470703100200430ustar00rootroot00000000000000 SIPHASH -> 20150110 botan-2.4.0/src/lib/mac/siphash/siphash.cpp000066400000000000000000000051711322470703100205220ustar00rootroot00000000000000/* * SipHash * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace { void SipRounds(uint64_t M, secure_vector& V, size_t r) { uint64_t V0 = V[0], V1 = V[1], V2 = V[2], V3 = V[3]; V3 ^= M; for(size_t i = 0; i != r; ++i) { V0 += V1; V2 += V3; V1 = rotl<13>(V1); V3 = rotl<16>(V3); V1 ^= V0; V3 ^= V2; V0 = rotl<32>(V0); V2 += V1; V0 += V3; V1 = rotl<17>(V1); V3 = rotl<21>(V3); V1 ^= V2; V3 ^= V0; V2 = rotl<32>(V2); } V0 ^= M; V[0] = V0; V[1] = V1; V[2] = V2; V[3] = V3; } } void SipHash::add_data(const uint8_t input[], size_t length) { verify_key_set(m_V.empty() == false); // SipHash counts the message length mod 256 m_words += static_cast(length); if(m_mbuf_pos) { while(length && m_mbuf_pos != 8) { m_mbuf = (m_mbuf >> 8) | (static_cast(input[0]) << 56); ++m_mbuf_pos; ++input; length--; } if(m_mbuf_pos == 8) { SipRounds(m_mbuf, m_V, m_C); m_mbuf_pos = 0; m_mbuf = 0; } } while(length >= 8) { SipRounds(load_le(input, 0), m_V, m_C); input += 8; length -= 8; } for(size_t i = 0; i != length; ++i) { m_mbuf = (m_mbuf >> 8) | (static_cast(input[i]) << 56); m_mbuf_pos++; } } void SipHash::final_result(uint8_t mac[]) { verify_key_set(m_V.empty() == false); if(m_mbuf_pos == 0) { m_mbuf = (static_cast(m_words) << 56); } else if(m_mbuf_pos < 8) { m_mbuf = (m_mbuf >> (64-m_mbuf_pos*8)) | (static_cast(m_words) << 56); } SipRounds(m_mbuf, m_V, m_C); m_V[2] ^= 0xFF; SipRounds(0, m_V, m_D); const uint64_t X = m_V[0] ^ m_V[1] ^ m_V[2] ^ m_V[3]; store_le(X, mac); clear(); } void SipHash::key_schedule(const uint8_t key[], size_t) { const uint64_t K0 = load_le(key, 0); const uint64_t K1 = load_le(key, 1); m_V.resize(4); m_V[0] = K0 ^ 0x736F6D6570736575; m_V[1] = K1 ^ 0x646F72616E646F6D; m_V[2] = K0 ^ 0x6C7967656E657261; m_V[3] = K1 ^ 0x7465646279746573; } void SipHash::clear() { zap(m_V); m_mbuf = 0; m_mbuf_pos = 0; m_words = 0; } std::string SipHash::name() const { return "SipHash(" + std::to_string(m_C) + "," + std::to_string(m_D) + ")"; } MessageAuthenticationCode* SipHash::clone() const { return new SipHash(m_C, m_D); } } botan-2.4.0/src/lib/mac/siphash/siphash.h000066400000000000000000000017701322470703100201700ustar00rootroot00000000000000/* * SipHash * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SIPHASH_H_ #define BOTAN_SIPHASH_H_ #include namespace Botan { class BOTAN_PUBLIC_API(2,0) SipHash final : public MessageAuthenticationCode { public: SipHash(size_t c = 2, size_t d = 4) : m_C(c), m_D(d) {} void clear() override; std::string name() const override; MessageAuthenticationCode* clone() const override; size_t output_length() const override { return 8; } Key_Length_Specification key_spec() const override { return Key_Length_Specification(16); } private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void key_schedule(const uint8_t[], size_t) override; const size_t m_C, m_D; secure_vector m_V; uint64_t m_mbuf = 0; size_t m_mbuf_pos = 0; uint8_t m_words = 0; }; } #endif botan-2.4.0/src/lib/mac/x919_mac/000077500000000000000000000000001322470703100162465ustar00rootroot00000000000000botan-2.4.0/src/lib/mac/x919_mac/info.txt000066400000000000000000000001131322470703100177350ustar00rootroot00000000000000 ANSI_X919_MAC -> 20131128 des botan-2.4.0/src/lib/mac/x919_mac/x919_mac.cpp000066400000000000000000000033271322470703100203110ustar00rootroot00000000000000/* * ANSI X9.19 MAC * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* * Update an ANSI X9.19 MAC Calculation */ void ANSI_X919_MAC::add_data(const uint8_t input[], size_t length) { verify_key_set(m_state.empty() == false); size_t xored = std::min(8 - m_position, length); xor_buf(&m_state[m_position], input, xored); m_position += xored; if(m_position < 8) return; m_des1->encrypt(m_state); input += xored; length -= xored; while(length >= 8) { xor_buf(m_state, input, 8); m_des1->encrypt(m_state); input += 8; length -= 8; } xor_buf(m_state, input, length); m_position = length; } /* * Finalize an ANSI X9.19 MAC Calculation */ void ANSI_X919_MAC::final_result(uint8_t mac[]) { if(m_position) m_des1->encrypt(m_state); m_des2->decrypt(m_state.data(), mac); m_des1->encrypt(mac); zeroise(m_state); m_position = 0; } /* * ANSI X9.19 MAC Key Schedule */ void ANSI_X919_MAC::key_schedule(const uint8_t key[], size_t length) { m_state.resize(8); m_des1->set_key(key, 8); if(length == 16) key += 8; m_des2->set_key(key, 8); } /* * Clear memory of sensitive data */ void ANSI_X919_MAC::clear() { m_des1->clear(); m_des2->clear(); zap(m_state); m_position = 0; } std::string ANSI_X919_MAC::name() const { return "X9.19-MAC"; } MessageAuthenticationCode* ANSI_X919_MAC::clone() const { return new ANSI_X919_MAC; } /* * ANSI X9.19 MAC Constructor */ ANSI_X919_MAC::ANSI_X919_MAC() : m_des1(BlockCipher::create("DES")), m_des2(m_des1->clone()), m_position(0) { } } botan-2.4.0/src/lib/mac/x919_mac/x919_mac.h000066400000000000000000000022161322470703100177520ustar00rootroot00000000000000/* * ANSI X9.19 MAC * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ANSI_X919_MAC_H_ #define BOTAN_ANSI_X919_MAC_H_ #include #include namespace Botan { /** * DES/3DES-based MAC from ANSI X9.19 */ class BOTAN_PUBLIC_API(2,0) ANSI_X919_MAC final : public MessageAuthenticationCode { public: void clear() override; std::string name() const override; size_t output_length() const override { return 8; } MessageAuthenticationCode* clone() const override; Key_Length_Specification key_spec() const override { return Key_Length_Specification(8, 16, 8); } ANSI_X919_MAC(); ANSI_X919_MAC(const ANSI_X919_MAC&) = delete; ANSI_X919_MAC& operator=(const ANSI_X919_MAC&) = delete; private: void add_data(const uint8_t[], size_t) override; void final_result(uint8_t[]) override; void key_schedule(const uint8_t[], size_t) override; std::unique_ptr m_des1, m_des2; secure_vector m_state; size_t m_position; }; } #endif botan-2.4.0/src/lib/math/000077500000000000000000000000001322470703100151055ustar00rootroot00000000000000botan-2.4.0/src/lib/math/bigint/000077500000000000000000000000001322470703100163615ustar00rootroot00000000000000botan-2.4.0/src/lib/math/bigint/big_code.cpp000066400000000000000000000102601322470703100206170ustar00rootroot00000000000000/* * BigInt Encoding/Decoding * (C) 1999-2010,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Encode a BigInt */ void BigInt::encode(uint8_t output[], const BigInt& n, Base base) { if(base == Binary) { n.binary_encode(output); } else if(base == Hexadecimal) { secure_vector binary(n.encoded_size(Binary)); n.binary_encode(binary.data()); hex_encode(cast_uint8_ptr_to_char(output), binary.data(), binary.size()); } else if(base == Decimal) { BigInt copy = n; BigInt remainder; copy.set_sign(Positive); const size_t output_size = n.encoded_size(Decimal); for(size_t j = 0; j != output_size; ++j) { divide(copy, 10, copy, remainder); output[output_size - 1 - j] = Charset::digit2char(static_cast(remainder.word_at(0))); if(copy.is_zero()) break; } } else throw Invalid_Argument("Unknown BigInt encoding method"); } /* * Encode a BigInt */ std::vector BigInt::encode(const BigInt& n, Base base) { std::vector output(n.encoded_size(base)); encode(output.data(), n, base); if(base != Binary) for(size_t j = 0; j != output.size(); ++j) if(output[j] == 0) output[j] = '0'; return output; } /* * Encode a BigInt */ secure_vector BigInt::encode_locked(const BigInt& n, Base base) { secure_vector output(n.encoded_size(base)); encode(output.data(), n, base); if(base != Binary) for(size_t j = 0; j != output.size(); ++j) if(output[j] == 0) output[j] = '0'; return output; } /* * Encode a BigInt, with leading 0s if needed */ secure_vector BigInt::encode_1363(const BigInt& n, size_t bytes) { secure_vector output(bytes); BigInt::encode_1363(output.data(), output.size(), n); return output; } //static void BigInt::encode_1363(uint8_t output[], size_t bytes, const BigInt& n) { const size_t n_bytes = n.bytes(); if(n_bytes > bytes) throw Encoding_Error("encode_1363: n is too large to encode properly"); const size_t leading_0s = bytes - n_bytes; encode(&output[leading_0s], n, Binary); } /* * Encode two BigInt, with leading 0s if needed, and concatenate */ secure_vector BigInt::encode_fixed_length_int_pair(const BigInt& n1, const BigInt& n2, size_t bytes) { secure_vector output(2 * bytes); BigInt::encode_1363(output.data(), bytes, n1); BigInt::encode_1363(output.data() + bytes, bytes, n2); return output; } /* * Decode a BigInt */ BigInt BigInt::decode(const uint8_t buf[], size_t length, Base base) { BigInt r; if(base == Binary) r.binary_decode(buf, length); else if(base == Hexadecimal) { secure_vector binary; if(length % 2) { // Handle lack of leading 0 const char buf0_with_leading_0[2] = { '0', static_cast(buf[0]) }; binary = hex_decode_locked(buf0_with_leading_0, 2); binary += hex_decode_locked(cast_uint8_ptr_to_char(&buf[1]), length - 1, false); } else binary = hex_decode_locked(cast_uint8_ptr_to_char(buf), length, false); r.binary_decode(binary.data(), binary.size()); } else if(base == Decimal) { for(size_t i = 0; i != length; ++i) { if(Charset::is_space(buf[i])) continue; if(!Charset::is_digit(buf[i])) throw Invalid_Argument("BigInt::decode: " "Invalid character in decimal input"); const uint8_t x = Charset::char2digit(buf[i]); if(x >= 10) throw Invalid_Argument("BigInt: Invalid decimal string"); r *= 10; r += x; } } else throw Invalid_Argument("Unknown BigInt decoding method"); return r; } } botan-2.4.0/src/lib/math/bigint/big_io.cpp000066400000000000000000000025121322470703100203150ustar00rootroot00000000000000/* * BigInt Input/Output * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Write the BigInt into a stream */ std::ostream& operator<<(std::ostream& stream, const BigInt& n) { BigInt::Base base = BigInt::Decimal; if(stream.flags() & std::ios::hex) base = BigInt::Hexadecimal; else if(stream.flags() & std::ios::oct) throw Exception("Octal output of BigInt not supported"); if(n == 0) stream.write("0", 1); else { if(n < 0) stream.write("-", 1); const std::vector buffer = BigInt::encode(n, base); size_t skip = 0; while(skip < buffer.size() && buffer[skip] == '0') ++skip; stream.write(cast_uint8_ptr_to_char(buffer.data()) + skip, buffer.size() - skip); } if(!stream.good()) throw Stream_IO_Error("BigInt output operator has failed"); return stream; } /* * Read the BigInt from a stream */ std::istream& operator>>(std::istream& stream, BigInt& n) { std::string str; std::getline(stream, str); if(stream.bad() || (stream.fail() && !stream.eof())) throw Stream_IO_Error("BigInt input operator has failed"); n = BigInt(str); return stream; } } botan-2.4.0/src/lib/math/bigint/big_ops2.cpp000066400000000000000000000110051322470703100205660ustar00rootroot00000000000000/* * BigInt Assignment Operators * (C) 1999-2007 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Addition Operator */ BigInt& BigInt::operator+=(const BigInt& y) { const size_t x_sw = sig_words(), y_sw = y.sig_words(); const size_t reg_size = std::max(x_sw, y_sw) + 1; grow_to(reg_size); if(sign() == y.sign()) bigint_add2(mutable_data(), reg_size - 1, y.data(), y_sw); else { int32_t relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); if(relative_size < 0) { secure_vector z(reg_size - 1); bigint_sub3(z.data(), y.data(), reg_size - 1, data(), x_sw); std::swap(m_reg, z); set_sign(y.sign()); } else if(relative_size == 0) { zeroise(m_reg); set_sign(Positive); } else if(relative_size > 0) bigint_sub2(mutable_data(), x_sw, y.data(), y_sw); } return (*this); } /* * Subtraction Operator */ BigInt& BigInt::operator-=(const BigInt& y) { const size_t x_sw = sig_words(), y_sw = y.sig_words(); int32_t relative_size = bigint_cmp(data(), x_sw, y.data(), y_sw); const size_t reg_size = std::max(x_sw, y_sw) + 1; grow_to(reg_size); if(relative_size < 0) { if(sign() == y.sign()) bigint_sub2_rev(mutable_data(), y.data(), y_sw); else bigint_add2(mutable_data(), reg_size - 1, y.data(), y_sw); set_sign(y.reverse_sign()); } else if(relative_size == 0) { if(sign() == y.sign()) { clear(); set_sign(Positive); } else bigint_shl1(mutable_data(), x_sw, 0, 1); } else if(relative_size > 0) { if(sign() == y.sign()) bigint_sub2(mutable_data(), x_sw, y.data(), y_sw); else bigint_add2(mutable_data(), reg_size - 1, y.data(), y_sw); } return (*this); } /* * Multiplication Operator */ BigInt& BigInt::operator*=(const BigInt& y) { const size_t x_sw = sig_words(), y_sw = y.sig_words(); set_sign((sign() == y.sign()) ? Positive : Negative); if(x_sw == 0 || y_sw == 0) { clear(); set_sign(Positive); } else if(x_sw == 1 && y_sw) { grow_to(y_sw + 2); bigint_linmul3(mutable_data(), y.data(), y_sw, word_at(0)); } else if(y_sw == 1 && x_sw) { grow_to(x_sw + 2); bigint_linmul2(mutable_data(), x_sw, y.word_at(0)); } else { grow_to(size() + y.size()); secure_vector workspace(size()); bigint_mul(*this, BigInt(*this), y, workspace.data()); } return (*this); } /* * Division Operator */ BigInt& BigInt::operator/=(const BigInt& y) { if(y.sig_words() == 1 && is_power_of_2(y.word_at(0))) (*this) >>= (y.bits() - 1); else (*this) = (*this) / y; return (*this); } /* * Modulo Operator */ BigInt& BigInt::operator%=(const BigInt& mod) { return (*this = (*this) % mod); } /* * Modulo Operator */ word BigInt::operator%=(word mod) { if(mod == 0) throw BigInt::DivideByZero(); if(is_power_of_2(mod)) { word result = (word_at(0) & (mod - 1)); clear(); grow_to(2); m_reg[0] = result; return result; } word remainder = 0; for(size_t j = sig_words(); j > 0; --j) remainder = bigint_modop(remainder, word_at(j-1), mod); clear(); grow_to(2); if(remainder && sign() == BigInt::Negative) m_reg[0] = mod - remainder; else m_reg[0] = remainder; set_sign(BigInt::Positive); return word_at(0); } /* * Left Shift Operator */ BigInt& BigInt::operator<<=(size_t shift) { if(shift) { const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS, words = sig_words(); grow_to(words + shift_words + (shift_bits ? 1 : 0)); bigint_shl1(mutable_data(), words, shift_words, shift_bits); } return (*this); } /* * Right Shift Operator */ BigInt& BigInt::operator>>=(size_t shift) { if(shift) { const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS; bigint_shr1(mutable_data(), sig_words(), shift_words, shift_bits); if(is_zero()) set_sign(Positive); } return (*this); } } botan-2.4.0/src/lib/math/bigint/big_ops3.cpp000066400000000000000000000105331322470703100205740ustar00rootroot00000000000000/* * BigInt Binary Operators * (C) 1999-2007 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * Addition Operator */ BigInt operator+(const BigInt& x, const BigInt& y) { const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); BigInt z(x.sign(), std::max(x_sw, y_sw) + 1); if(x.sign() == y.sign()) bigint_add3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); else { int32_t relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); if(relative_size < 0) { bigint_sub3(z.mutable_data(), y.data(), y_sw, x.data(), x_sw); z.set_sign(y.sign()); } else if(relative_size == 0) z.set_sign(BigInt::Positive); else if(relative_size > 0) bigint_sub3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); } return z; } /* * Subtraction Operator */ BigInt operator-(const BigInt& x, const BigInt& y) { const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); int32_t relative_size = bigint_cmp(x.data(), x_sw, y.data(), y_sw); BigInt z(BigInt::Positive, std::max(x_sw, y_sw) + 1); if(relative_size < 0) { if(x.sign() == y.sign()) bigint_sub3(z.mutable_data(), y.data(), y_sw, x.data(), x_sw); else bigint_add3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); z.set_sign(y.reverse_sign()); } else if(relative_size == 0) { if(x.sign() != y.sign()) bigint_shl2(z.mutable_data(), x.data(), x_sw, 0, 1); } else if(relative_size > 0) { if(x.sign() == y.sign()) bigint_sub3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); else bigint_add3(z.mutable_data(), x.data(), x_sw, y.data(), y_sw); z.set_sign(x.sign()); } return z; } /* * Multiplication Operator */ BigInt operator*(const BigInt& x, const BigInt& y) { const size_t x_sw = x.sig_words(), y_sw = y.sig_words(); BigInt z(BigInt::Positive, x.size() + y.size()); if(x_sw == 1 && y_sw) bigint_linmul3(z.mutable_data(), y.data(), y_sw, x.word_at(0)); else if(y_sw == 1 && x_sw) bigint_linmul3(z.mutable_data(), x.data(), x_sw, y.word_at(0)); else if(x_sw && y_sw) { secure_vector workspace(z.size()); bigint_mul(z, x, y, workspace.data()); } if(x_sw && y_sw && x.sign() != y.sign()) z.flip_sign(); return z; } /* * Division Operator */ BigInt operator/(const BigInt& x, const BigInt& y) { BigInt q, r; divide(x, y, q, r); return q; } /* * Modulo Operator */ BigInt operator%(const BigInt& n, const BigInt& mod) { if(mod.is_zero()) throw BigInt::DivideByZero(); if(mod.is_negative()) throw Invalid_Argument("BigInt::operator%: modulus must be > 0"); if(n.is_positive() && mod.is_positive() && n < mod) return n; BigInt q, r; divide(n, mod, q, r); return r; } /* * Modulo Operator */ word operator%(const BigInt& n, word mod) { if(mod == 0) throw BigInt::DivideByZero(); if(is_power_of_2(mod)) return (n.word_at(0) & (mod - 1)); word remainder = 0; for(size_t j = n.sig_words(); j > 0; --j) remainder = bigint_modop(remainder, n.word_at(j-1), mod); if(remainder && n.sign() == BigInt::Negative) return mod - remainder; return remainder; } /* * Left Shift Operator */ BigInt operator<<(const BigInt& x, size_t shift) { if(shift == 0) return x; const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS; const size_t x_sw = x.sig_words(); BigInt y(x.sign(), x_sw + shift_words + (shift_bits ? 1 : 0)); bigint_shl2(y.mutable_data(), x.data(), x_sw, shift_words, shift_bits); return y; } /* * Right Shift Operator */ BigInt operator>>(const BigInt& x, size_t shift) { if(shift == 0) return x; if(x.bits() <= shift) return 0; const size_t shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS, x_sw = x.sig_words(); BigInt y(x.sign(), x_sw - shift_words); bigint_shr2(y.mutable_data(), x.data(), x_sw, shift_words, shift_bits); return y; } } botan-2.4.0/src/lib/math/bigint/big_rand.cpp000066400000000000000000000022401322470703100206300ustar00rootroot00000000000000/* * BigInt Random Generation * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Randomize this number */ void BigInt::randomize(RandomNumberGenerator& rng, size_t bitsize, bool set_high_bit) { set_sign(Positive); if(bitsize == 0) { clear(); } else { secure_vector array = rng.random_vec(round_up(bitsize, 8) / 8); // Always cut unwanted bits if(bitsize % 8) array[0] &= 0xFF >> (8 - (bitsize % 8)); // Set the highest bit if wanted if (set_high_bit) array[0] |= 0x80 >> ((bitsize % 8) ? (8 - bitsize % 8) : 0); binary_decode(array); } } /* * Generate a random integer within given range */ BigInt BigInt::random_integer(RandomNumberGenerator& rng, const BigInt& min, const BigInt& max) { BigInt r; const size_t bits = max.bits(); do { r.randomize(rng, bits, false); } while(r < min || r >= max); return r; } } botan-2.4.0/src/lib/math/bigint/bigint.cpp000066400000000000000000000155421322470703100203500ustar00rootroot00000000000000/* * BigInt Base * (C) 1999-2011,2012,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * Construct a BigInt from a regular number */ BigInt::BigInt(uint64_t n) { if(n == 0) return; const size_t limbs_needed = sizeof(uint64_t) / sizeof(word); m_reg.resize(4*limbs_needed); for(size_t i = 0; i != limbs_needed; ++i) m_reg[i] = ((n >> (i*MP_WORD_BITS)) & MP_WORD_MASK); } /* * Construct a BigInt of the specified size */ BigInt::BigInt(Sign s, size_t size) { m_reg.resize(round_up(size, 8)); m_signedness = s; } /* * Copy constructor */ BigInt::BigInt(const BigInt& other) { m_reg = other.m_reg; m_signedness = other.m_signedness; } /* * Construct a BigInt from a string */ BigInt::BigInt(const std::string& str) { Base base = Decimal; size_t markers = 0; bool negative = false; if(str.length() > 0 && str[0] == '-') { markers += 1; negative = true; } if(str.length() > markers + 2 && str[markers ] == '0' && str[markers + 1] == 'x') { markers += 2; base = Hexadecimal; } *this = decode(cast_char_ptr_to_uint8(str.data()) + markers, str.length() - markers, base); if(negative) set_sign(Negative); else set_sign(Positive); } /* * Construct a BigInt from an encoded BigInt */ BigInt::BigInt(const uint8_t input[], size_t length, Base base) { *this = decode(input, length, base); } /* * Construct a BigInt from an encoded BigInt */ BigInt::BigInt(RandomNumberGenerator& rng, size_t bits, bool set_high_bit) { randomize(rng, bits, set_high_bit); } /* * Comparison Function */ int32_t BigInt::cmp(const BigInt& other, bool check_signs) const { if(check_signs) { if(other.is_positive() && this->is_negative()) return -1; if(other.is_negative() && this->is_positive()) return 1; if(other.is_negative() && this->is_negative()) return (-bigint_cmp(this->data(), this->sig_words(), other.data(), other.sig_words())); } return bigint_cmp(this->data(), this->sig_words(), other.data(), other.sig_words()); } /* * Return bits {offset...offset+length} */ uint32_t BigInt::get_substring(size_t offset, size_t length) const { if(length > 32) throw Invalid_Argument("BigInt::get_substring: Substring size too big"); uint64_t piece = 0; for(size_t i = 0; i != 8; ++i) { const uint8_t part = byte_at((offset / 8) + (7-i)); piece = (piece << 8) | part; } const uint64_t mask = (static_cast(1) << length) - 1; const size_t shift = (offset % 8); return static_cast((piece >> shift) & mask); } /* * Convert this number to a uint32_t, if possible */ uint32_t BigInt::to_u32bit() const { if(is_negative()) throw Encoding_Error("BigInt::to_u32bit: Number is negative"); if(bits() > 32) throw Encoding_Error("BigInt::to_u32bit: Number is too big to convert"); uint32_t out = 0; for(size_t i = 0; i != 4; ++i) out = (out << 8) | byte_at(3-i); return out; } /* * Set bit number n */ void BigInt::set_bit(size_t n) { const size_t which = n / MP_WORD_BITS; const word mask = static_cast(1) << (n % MP_WORD_BITS); if(which >= size()) grow_to(which + 1); m_reg[which] |= mask; } /* * Clear bit number n */ void BigInt::clear_bit(size_t n) { const size_t which = n / MP_WORD_BITS; const word mask = static_cast(1) << (n % MP_WORD_BITS); if(which < size()) m_reg[which] &= ~mask; } size_t BigInt::bytes() const { return round_up(bits(), 8) / 8; } /* * Count how many bits are being used */ size_t BigInt::bits() const { const size_t words = sig_words(); if(words == 0) return 0; const size_t full_words = words - 1; return (full_words * MP_WORD_BITS + high_bit(word_at(full_words))); } /* * Calcluate the size in a certain base */ size_t BigInt::encoded_size(Base base) const { static const double LOG_2_BASE_10 = 0.30102999566; if(base == Binary) return bytes(); else if(base == Hexadecimal) return 2*bytes(); else if(base == Decimal) return static_cast((bits() * LOG_2_BASE_10) + 1); else throw Invalid_Argument("Unknown base for BigInt encoding"); } /* * Set the sign */ void BigInt::set_sign(Sign s) { if(is_zero()) m_signedness = Positive; else m_signedness = s; } /* * Reverse the value of the sign flag */ void BigInt::flip_sign() { set_sign(reverse_sign()); } /* * Return the opposite value of the current sign */ BigInt::Sign BigInt::reverse_sign() const { if(sign() == Positive) return Negative; return Positive; } /* * Return the negation of this number */ BigInt BigInt::operator-() const { BigInt x = (*this); x.flip_sign(); return x; } /* * Return the absolute value of this number */ BigInt BigInt::abs() const { BigInt x = (*this); x.set_sign(Positive); return x; } void BigInt::grow_to(size_t n) { if(n > size()) m_reg.resize(round_up(n, 8)); } /* * Encode this number into bytes */ void BigInt::binary_encode(uint8_t output[]) const { const size_t sig_bytes = bytes(); for(size_t i = 0; i != sig_bytes; ++i) output[sig_bytes-i-1] = byte_at(i); } /* * Set this number to the value in buf */ void BigInt::binary_decode(const uint8_t buf[], size_t length) { const size_t WORD_BYTES = sizeof(word); clear(); m_reg.resize(round_up((length / WORD_BYTES) + 1, 8)); for(size_t i = 0; i != length / WORD_BYTES; ++i) { const size_t top = length - WORD_BYTES*i; for(size_t j = WORD_BYTES; j > 0; --j) m_reg[i] = (m_reg[i] << 8) | buf[top - j]; } for(size_t i = 0; i != length % WORD_BYTES; ++i) m_reg[length / WORD_BYTES] = (m_reg[length / WORD_BYTES] << 8) | buf[i]; } void BigInt::shrink_to_fit() { m_reg.resize(sig_words()); } void BigInt::const_time_lookup(secure_vector& output, const std::vector& vec, size_t idx) { const size_t words = output.size(); clear_mem(output.data(), output.size()); CT::poison(&idx, sizeof(idx)); for(size_t i = 0; i != vec.size(); ++i) { BOTAN_ASSERT(vec[i].size() >= words, "Word size as expected in const_time_lookup"); for(size_t w = 0; w != words; ++w) output[w] |= CT::select(CT::is_equal(i, idx), vec[i].word_at(w), 0); } CT::unpoison(idx); CT::unpoison(output.data(), output.size()); } } botan-2.4.0/src/lib/math/bigint/bigint.h000066400000000000000000000431321322470703100200110ustar00rootroot00000000000000/* * BigInt * (C) 1999-2008,2012 Jack Lloyd * 2007 FlexSecure * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BIGINT_H_ #define BOTAN_BIGINT_H_ #include #include #include #include #include namespace Botan { class RandomNumberGenerator; /** * Arbitrary precision integer */ class BOTAN_PUBLIC_API(2,0) BigInt final { public: /** * Base enumerator for encoding and decoding */ enum Base { Decimal = 10, Hexadecimal = 16, Binary = 256 }; /** * Sign symbol definitions for positive and negative numbers */ enum Sign { Negative = 0, Positive = 1 }; /** * DivideByZero Exception */ class BOTAN_PUBLIC_API(2,0) DivideByZero final : public Exception { public: DivideByZero() : Exception("BigInt divide by zero") {} }; /** * Create empty BigInt */ BigInt() = default; /** * Create BigInt from 64 bit integer * @param n initial value of this BigInt */ BigInt(uint64_t n); /** * Copy Constructor * @param other the BigInt to copy */ BigInt(const BigInt& other); /** * Create BigInt from a string. If the string starts with 0x the * rest of the string will be interpreted as hexadecimal digits. * Otherwise, it will be interpreted as a decimal number. * * @param str the string to parse for an integer value */ explicit BigInt(const std::string& str); /** * Create a BigInt from an integer in a byte array * @param buf the byte array holding the value * @param length size of buf * @param base is the number base of the integer in buf */ BigInt(const uint8_t buf[], size_t length, Base base = Binary); /** * \brief Create a random BigInt of the specified size * * @param rng random number generator * @param bits size in bits * @param set_high_bit if true, the highest bit is always set * * @see randomize */ BigInt(RandomNumberGenerator& rng, size_t bits, bool set_high_bit = true); /** * Create BigInt of specified size, all zeros * @param sign the sign * @param n size of the internal register in words */ BigInt(Sign sign, size_t n); /** * Move constructor */ BigInt(BigInt&& other) { this->swap(other); } /** * Move assignment */ BigInt& operator=(BigInt&& other) { if(this != &other) this->swap(other); return (*this); } /** * Copy assignment */ BigInt& operator=(const BigInt&) = default; /** * Swap this value with another * @param other BigInt to swap values with */ void swap(BigInt& other) { m_reg.swap(other.m_reg); std::swap(m_signedness, other.m_signedness); } void swap_reg(secure_vector& reg) { m_reg.swap(reg); } /** * += operator * @param y the BigInt to add to this */ BigInt& operator+=(const BigInt& y); /** * -= operator * @param y the BigInt to subtract from this */ BigInt& operator-=(const BigInt& y); /** * *= operator * @param y the BigInt to multiply with this */ BigInt& operator*=(const BigInt& y); /** * /= operator * @param y the BigInt to divide this by */ BigInt& operator/=(const BigInt& y); /** * Modulo operator * @param y the modulus to reduce this by */ BigInt& operator%=(const BigInt& y); /** * Modulo operator * @param y the modulus (word) to reduce this by */ word operator%=(word y); /** * Left shift operator * @param shift the number of bits to shift this left by */ BigInt& operator<<=(size_t shift); /** * Right shift operator * @param shift the number of bits to shift this right by */ BigInt& operator>>=(size_t shift); /** * Increment operator */ BigInt& operator++() { return (*this += 1); } /** * Decrement operator */ BigInt& operator--() { return (*this -= 1); } /** * Postfix increment operator */ BigInt operator++(int) { BigInt x = (*this); ++(*this); return x; } /** * Postfix decrement operator */ BigInt operator--(int) { BigInt x = (*this); --(*this); return x; } /** * Unary negation operator * @return negative this */ BigInt operator-() const; /** * ! operator * @return true iff this is zero, otherwise false */ bool operator !() const { return (!is_nonzero()); } /** * Zeroize the BigInt. The size of the underlying register is not * modified. */ void clear() { zeroise(m_reg); } /** * Compare this to another BigInt * @param n the BigInt value to compare with * @param check_signs include sign in comparison? * @result if (thisn) return 1, if both * values are identical return 0 [like Perl's <=> operator] */ int32_t cmp(const BigInt& n, bool check_signs = true) const; /** * Test if the integer has an even value * @result true if the integer is even, false otherwise */ bool is_even() const { return (get_bit(0) == 0); } /** * Test if the integer has an odd value * @result true if the integer is odd, false otherwise */ bool is_odd() const { return (get_bit(0) == 1); } /** * Test if the integer is not zero * @result true if the integer is non-zero, false otherwise */ bool is_nonzero() const { return (!is_zero()); } /** * Test if the integer is zero * @result true if the integer is zero, false otherwise */ bool is_zero() const { const size_t sw = sig_words(); for(size_t i = 0; i != sw; ++i) if(m_reg[i]) return false; return true; } /** * Set bit at specified position * @param n bit position to set */ void set_bit(size_t n); /** * Clear bit at specified position * @param n bit position to clear */ void clear_bit(size_t n); /** * Clear all but the lowest n bits * @param n amount of bits to keep */ void mask_bits(size_t n) { if(n == 0) { clear(); return; } const size_t top_word = n / BOTAN_MP_WORD_BITS; const word mask = (static_cast(1) << (n % BOTAN_MP_WORD_BITS)) - 1; if(top_word < size()) { const size_t len = size() - (top_word + 1); if (len > 0) { clear_mem(&m_reg[top_word+1], len); } m_reg[top_word] &= mask; } } /** * Return bit value at specified position * @param n the bit offset to test * @result true, if the bit at position n is set, false otherwise */ bool get_bit(size_t n) const { return ((word_at(n / BOTAN_MP_WORD_BITS) >> (n % BOTAN_MP_WORD_BITS)) & 1); } /** * Return (a maximum of) 32 bits of the complete value * @param offset the offset to start extracting * @param length amount of bits to extract (starting at offset) * @result the integer extracted from the register starting at * offset with specified length */ uint32_t get_substring(size_t offset, size_t length) const; /** * Convert this value into a uint32_t, if it is in the range * [0 ... 2**32-1], or otherwise throw an exception. * @result the value as a uint32_t if conversion is possible */ uint32_t to_u32bit() const; /** * @param n the offset to get a byte from * @result byte at offset n */ uint8_t byte_at(size_t n) const { return get_byte(sizeof(word) - (n % sizeof(word)) - 1, word_at(n / sizeof(word))); } /** * Return the word at a specified position of the internal register * @param n position in the register * @return value at position n */ word word_at(size_t n) const { return ((n < size()) ? m_reg[n] : 0); } void set_word_at(size_t i, word w) { grow_to(i + 1); m_reg[i] = w; } /** * Tests if the sign of the integer is negative * @result true, iff the integer has a negative sign */ bool is_negative() const { return (sign() == Negative); } /** * Tests if the sign of the integer is positive * @result true, iff the integer has a positive sign */ bool is_positive() const { return (sign() == Positive); } /** * Return the sign of the integer * @result the sign of the integer */ Sign sign() const { return (m_signedness); } /** * @result the opposite sign of the represented integer value */ Sign reverse_sign() const; /** * Flip the sign of this BigInt */ void flip_sign(); /** * Set sign of the integer * @param sign new Sign to set */ void set_sign(Sign sign); /** * @result absolute (positive) value of this */ BigInt abs() const; /** * Give size of internal register * @result size of internal register in words */ size_t size() const { return m_reg.size(); } /** * Return how many words we need to hold this value * @result significant words of the represented integer value */ size_t sig_words() const { const word* x = m_reg.data(); size_t sig = m_reg.size(); while(sig && (x[sig-1] == 0)) sig--; return sig; } /** * Give byte length of the integer * @result byte length of the represented integer value */ size_t bytes() const; /** * Get the bit length of the integer * @result bit length of the represented integer value */ size_t bits() const; /** * Return a mutable pointer to the register * @result a pointer to the start of the internal register */ word* mutable_data() { return m_reg.data(); } /** * Return a const pointer to the register * @result a pointer to the start of the internal register */ const word* data() const { return m_reg.data(); } secure_vector& get_word_vector() { return m_reg; } const secure_vector& get_word_vector() const { return m_reg; } /** * Increase internal register buffer to at least n words * @param n new size of register */ void grow_to(size_t n); void shrink_to_fit(); /** * Fill BigInt with a random number with size of bitsize * * If \p set_high_bit is true, the highest bit will be set, which causes * the entropy to be \a bits-1. Otherwise the highest bit is randomly chosen * by the rng, causing the entropy to be \a bits. * * @param rng the random number generator to use * @param bitsize number of bits the created random value should have * @param set_high_bit if true, the highest bit is always set */ void randomize(RandomNumberGenerator& rng, size_t bitsize, bool set_high_bit = true); /** * Store BigInt-value in a given byte array * @param buf destination byte array for the integer value */ void binary_encode(uint8_t buf[]) const; /** * Read integer value from a byte array with given size * @param buf byte array buffer containing the integer * @param length size of buf */ void binary_decode(const uint8_t buf[], size_t length); /** * Read integer value from a byte array (secure_vector) * @param buf the array to load from */ void binary_decode(const secure_vector& buf) { binary_decode(buf.data(), buf.size()); } /** * @param base the base to measure the size for * @return size of this integer in base base */ size_t encoded_size(Base base = Binary) const; /** * @param rng a random number generator * @param min the minimum value * @param max the maximum value * @return random integer in [min,max) */ static BigInt random_integer(RandomNumberGenerator& rng, const BigInt& min, const BigInt& max); /** * Create a power of two * @param n the power of two to create * @return bigint representing 2^n */ static BigInt power_of_2(size_t n) { BigInt b; b.set_bit(n); return b; } /** * Encode the integer value from a BigInt to a std::vector of bytes * @param n the BigInt to use as integer source * @param base number-base of resulting byte array representation * @result secure_vector of bytes containing the integer with given base */ static std::vector encode(const BigInt& n, Base base = Binary); /** * Encode the integer value from a BigInt to a secure_vector of bytes * @param n the BigInt to use as integer source * @param base number-base of resulting byte array representation * @result secure_vector of bytes containing the integer with given base */ static secure_vector encode_locked(const BigInt& n, Base base = Binary); /** * Encode the integer value from a BigInt to a byte array * @param buf destination byte array for the encoded integer * value with given base * @param n the BigInt to use as integer source * @param base number-base of resulting byte array representation */ static void encode(uint8_t buf[], const BigInt& n, Base base = Binary); /** * Create a BigInt from an integer in a byte array * @param buf the binary value to load * @param length size of buf * @param base number-base of the integer in buf * @result BigInt representing the integer in the byte array */ static BigInt decode(const uint8_t buf[], size_t length, Base base = Binary); /** * Create a BigInt from an integer in a byte array * @param buf the binary value to load * @param base number-base of the integer in buf * @result BigInt representing the integer in the byte array */ static BigInt decode(const secure_vector& buf, Base base = Binary) { return BigInt::decode(buf.data(), buf.size(), base); } /** * Create a BigInt from an integer in a byte array * @param buf the binary value to load * @param base number-base of the integer in buf * @result BigInt representing the integer in the byte array */ static BigInt decode(const std::vector& buf, Base base = Binary) { return BigInt::decode(buf.data(), buf.size(), base); } /** * Encode a BigInt to a byte array according to IEEE 1363 * @param n the BigInt to encode * @param bytes the length of the resulting secure_vector * @result a secure_vector containing the encoded BigInt */ static secure_vector encode_1363(const BigInt& n, size_t bytes); static void encode_1363(uint8_t out[], size_t bytes, const BigInt& n); /** * Encode two BigInt to a byte array according to IEEE 1363 * @param n1 the first BigInt to encode * @param n2 the second BigInt to encode * @param bytes the length of the encoding of each single BigInt * @result a secure_vector containing the concatenation of the two encoded BigInt */ static secure_vector encode_fixed_length_int_pair(const BigInt& n1, const BigInt& n2, size_t bytes); /** * Set output = vec[idx].m_reg in constant time * All words of vec must have the same size */ static void const_time_lookup( secure_vector& output, const std::vector& vec, size_t idx); private: secure_vector m_reg; Sign m_signedness = Positive; }; /* * Arithmetic Operators */ BigInt BOTAN_PUBLIC_API(2,0) operator+(const BigInt& x, const BigInt& y); BigInt BOTAN_PUBLIC_API(2,0) operator-(const BigInt& x, const BigInt& y); BigInt BOTAN_PUBLIC_API(2,0) operator*(const BigInt& x, const BigInt& y); BigInt BOTAN_PUBLIC_API(2,0) operator/(const BigInt& x, const BigInt& d); BigInt BOTAN_PUBLIC_API(2,0) operator%(const BigInt& x, const BigInt& m); word BOTAN_PUBLIC_API(2,0) operator%(const BigInt& x, word m); BigInt BOTAN_PUBLIC_API(2,0) operator<<(const BigInt& x, size_t n); BigInt BOTAN_PUBLIC_API(2,0) operator>>(const BigInt& x, size_t n); /* * Comparison Operators */ inline bool operator==(const BigInt& a, const BigInt& b) { return (a.cmp(b) == 0); } inline bool operator!=(const BigInt& a, const BigInt& b) { return (a.cmp(b) != 0); } inline bool operator<=(const BigInt& a, const BigInt& b) { return (a.cmp(b) <= 0); } inline bool operator>=(const BigInt& a, const BigInt& b) { return (a.cmp(b) >= 0); } inline bool operator<(const BigInt& a, const BigInt& b) { return (a.cmp(b) < 0); } inline bool operator>(const BigInt& a, const BigInt& b) { return (a.cmp(b) > 0); } /* * I/O Operators */ BOTAN_PUBLIC_API(2,0) std::ostream& operator<<(std::ostream&, const BigInt&); BOTAN_PUBLIC_API(2,0) std::istream& operator>>(std::istream&, BigInt&); } namespace std { template<> inline void swap(Botan::BigInt& x, Botan::BigInt& y) { x.swap(y); } } #endif botan-2.4.0/src/lib/math/bigint/divide.cpp000066400000000000000000000055731322470703100203430ustar00rootroot00000000000000/* * Division Algorithm * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * Handle signed operands, if necessary */ void sign_fixup(const BigInt& x, const BigInt& y, BigInt& q, BigInt& r) { if(x.sign() == BigInt::Negative) { q.flip_sign(); if(r.is_nonzero()) { --q; r = y.abs() - r; } } if(y.sign() == BigInt::Negative) q.flip_sign(); } bool division_check(word q, word y2, word y1, word x3, word x2, word x1) { // Compute (y3,y2,y1) = (y2,y1) * q word y3 = 0; y1 = word_madd2(q, y1, &y3); y2 = word_madd2(q, y2, &y3); // Return (y3,y2,y1) >? (x3,x2,x1) if(y3 > x3) return true; if(y3 < x3) return false; if(y2 > x2) return true; if(y2 < x2) return false; if(y1 > x1) return true; if(y1 < x1) return false; return false; } } /* * Solve x = q * y + r */ void divide(const BigInt& x, const BigInt& y_arg, BigInt& q, BigInt& r) { if(y_arg.is_zero()) throw BigInt::DivideByZero(); BigInt y = y_arg; const size_t y_words = y.sig_words(); r = x; q = 0; r.set_sign(BigInt::Positive); y.set_sign(BigInt::Positive); int32_t compare = r.cmp(y); if(compare == 0) { q = 1; r = 0; } else if(compare > 0) { size_t shifts = 0; word y_top = y.word_at(y.sig_words()-1); while(y_top < MP_WORD_TOP_BIT) { y_top <<= 1; ++shifts; } y <<= shifts; r <<= shifts; const size_t n = r.sig_words() - 1, t = y_words - 1; if(n < t) throw Internal_Error("BigInt division word sizes"); q.grow_to(n - t + 1); word* q_words = q.mutable_data(); if(n <= t) { while(r > y) { r -= y; ++q; } r >>= shifts; sign_fixup(x, y_arg, q, r); return; } BigInt temp = y << (MP_WORD_BITS * (n-t)); while(r >= temp) { r -= temp; q_words[n-t] += 1; } for(size_t j = n; j != t; --j) { const word x_j0 = r.word_at(j); const word x_j1 = r.word_at(j-1); const word y_t = y.word_at(t); if(x_j0 == y_t) q_words[j-t-1] = MP_WORD_MAX; else q_words[j-t-1] = bigint_divop(x_j0, x_j1, y_t); while(division_check(q_words[j-t-1], y_t, y.word_at(t-1), x_j0, x_j1, r.word_at(j-2))) { q_words[j-t-1] -= 1; } r -= (q_words[j-t-1] * y) << (MP_WORD_BITS * (j-t-1)); if(r.is_negative()) { r += y << (MP_WORD_BITS * (j-t-1)); q_words[j-t-1] -= 1; } } r >>= shifts; } sign_fixup(x, y_arg, q, r); } } botan-2.4.0/src/lib/math/bigint/divide.h000066400000000000000000000010401322470703100177710ustar00rootroot00000000000000/* * Division * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DIVISON_ALGORITHM_H_ #define BOTAN_DIVISON_ALGORITHM_H_ #include namespace Botan { /** * BigInt Division * @param x an integer * @param y a non-zero integer * @param q will be set to x / y * @param r will be set to x % y */ void BOTAN_PUBLIC_API(2,0) divide(const BigInt& x, const BigInt& y, BigInt& q, BigInt& r); } #endif botan-2.4.0/src/lib/math/bigint/info.txt000066400000000000000000000002151322470703100200530ustar00rootroot00000000000000 BIGINT -> 20131128 load_on auto bigint.h divide.h mp hex rng botan-2.4.0/src/lib/math/ec_gfp/000077500000000000000000000000001322470703100163305ustar00rootroot00000000000000botan-2.4.0/src/lib/math/ec_gfp/curve_gfp.cpp000066400000000000000000000170471322470703100210250ustar00rootroot00000000000000/* * Elliptic curves over GF(p) Montgomery Representation * (C) 2014,2015 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { class CurveGFp_Montgomery final : public CurveGFp_Repr { public: CurveGFp_Montgomery(const BigInt& p, const BigInt& a, const BigInt& b) : m_p(p), m_a(a), m_b(b), m_p_words(m_p.sig_words()), m_p_dash(monty_inverse(m_p.word_at(0))) { const BigInt r = BigInt::power_of_2(m_p_words * BOTAN_MP_WORD_BITS); m_r2 = (r * r) % p; m_a_r = (m_a * r) % p; m_b_r = (m_b * r) % p; } const BigInt& get_a() const override { return m_a; } const BigInt& get_b() const override { return m_b; } const BigInt& get_p() const override { return m_p; } const BigInt& get_a_rep() const override { return m_a_r; } const BigInt& get_b_rep() const override { return m_b_r; } size_t get_p_words() const override { return m_p_words; } void to_curve_rep(BigInt& x, secure_vector& ws) const override; void from_curve_rep(BigInt& x, secure_vector& ws) const override; void curve_mul(BigInt& z, const BigInt& x, const BigInt& y, secure_vector& ws) const override; void curve_sqr(BigInt& z, const BigInt& x, secure_vector& ws) const override; private: BigInt m_p, m_a, m_b; size_t m_p_words; // cache of m_p.sig_words() // Montgomery parameters BigInt m_r2, m_a_r, m_b_r; word m_p_dash; }; void CurveGFp_Montgomery::to_curve_rep(BigInt& x, secure_vector& ws) const { const BigInt tx = x; curve_mul(x, tx, m_r2, ws); } void CurveGFp_Montgomery::from_curve_rep(BigInt& x, secure_vector& ws) const { const BigInt tx = x; curve_mul(x, tx, 1, ws); } void CurveGFp_Montgomery::curve_mul(BigInt& z, const BigInt& x, const BigInt& y, secure_vector& ws) const { if(x.is_zero() || y.is_zero()) { z = 0; return; } const size_t output_size = 2*m_p_words + 1; ws.resize(2*(m_p_words+2)); z.grow_to(output_size); z.clear(); bigint_monty_mul(z, x, y, m_p.data(), m_p_words, m_p_dash, ws.data()); } void CurveGFp_Montgomery::curve_sqr(BigInt& z, const BigInt& x, secure_vector& ws) const { if(x.is_zero()) { z = 0; return; } const size_t x_sw = x.sig_words(); BOTAN_ASSERT(x_sw <= m_p_words, "Input in range"); const size_t output_size = 2*m_p_words + 1; ws.resize(2*(m_p_words+2)); z.grow_to(output_size); z.clear(); bigint_monty_sqr(z, x, m_p.data(), m_p_words, m_p_dash, ws.data()); } class CurveGFp_NIST : public CurveGFp_Repr { public: CurveGFp_NIST(size_t p_bits, const BigInt& a, const BigInt& b) : m_a(a), m_b(b), m_p_words((p_bits + BOTAN_MP_WORD_BITS - 1) / BOTAN_MP_WORD_BITS) { } const BigInt& get_a() const override { return m_a; } const BigInt& get_b() const override { return m_b; } size_t get_p_words() const override { return m_p_words; } const BigInt& get_a_rep() const override { return m_a; } const BigInt& get_b_rep() const override { return m_b; } void to_curve_rep(BigInt& x, secure_vector& ws) const override { redc(x, ws); } void from_curve_rep(BigInt& x, secure_vector& ws) const override { redc(x, ws); } void curve_mul(BigInt& z, const BigInt& x, const BigInt& y, secure_vector& ws) const override; void curve_sqr(BigInt& z, const BigInt& x, secure_vector& ws) const override; private: virtual void redc(BigInt& x, secure_vector& ws) const = 0; // Curve parameters BigInt m_a, m_b; size_t m_p_words; // cache of m_p.sig_words() }; void CurveGFp_NIST::curve_mul(BigInt& z, const BigInt& x, const BigInt& y, secure_vector& ws) const { if(x.is_zero() || y.is_zero()) { z = 0; return; } const size_t p_words = get_p_words(); const size_t output_size = 2*p_words + 1; ws.resize(2*(p_words+2)); z.grow_to(output_size); z.clear(); bigint_mul(z, x, y, ws.data()); this->redc(z, ws); } void CurveGFp_NIST::curve_sqr(BigInt& z, const BigInt& x, secure_vector& ws) const { if(x.is_zero()) { z = 0; return; } const size_t p_words = get_p_words(); const size_t output_size = 2*p_words + 1; ws.resize(2*(p_words+2)); z.grow_to(output_size); z.clear(); bigint_sqr(z.mutable_data(), output_size, ws.data(), x.data(), x.size(), x.sig_words()); this->redc(z, ws); } #if defined(BOTAN_HAS_NIST_PRIME_REDUCERS_W32) /** * The NIST P-192 curve */ class CurveGFp_P192 final : public CurveGFp_NIST { public: CurveGFp_P192(const BigInt& a, const BigInt& b) : CurveGFp_NIST(192, a, b) {} const BigInt& get_p() const override { return prime_p192(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p192(x, ws); } }; /** * The NIST P-224 curve */ class CurveGFp_P224 final : public CurveGFp_NIST { public: CurveGFp_P224(const BigInt& a, const BigInt& b) : CurveGFp_NIST(224, a, b) {} const BigInt& get_p() const override { return prime_p224(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p224(x, ws); } }; /** * The NIST P-256 curve */ class CurveGFp_P256 final : public CurveGFp_NIST { public: CurveGFp_P256(const BigInt& a, const BigInt& b) : CurveGFp_NIST(256, a, b) {} const BigInt& get_p() const override { return prime_p256(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p256(x, ws); } }; /** * The NIST P-384 curve */ class CurveGFp_P384 final : public CurveGFp_NIST { public: CurveGFp_P384(const BigInt& a, const BigInt& b) : CurveGFp_NIST(384, a, b) {} const BigInt& get_p() const override { return prime_p384(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p384(x, ws); } }; #endif /** * The NIST P-521 curve */ class CurveGFp_P521 final : public CurveGFp_NIST { public: CurveGFp_P521(const BigInt& a, const BigInt& b) : CurveGFp_NIST(521, a, b) {} const BigInt& get_p() const override { return prime_p521(); } private: void redc(BigInt& x, secure_vector& ws) const override { redc_p521(x, ws); } }; } std::shared_ptr CurveGFp::choose_repr(const BigInt& p, const BigInt& a, const BigInt& b) { #if defined(BOTAN_HAS_NIST_PRIME_REDUCERS_W32) if(p == prime_p192()) return std::shared_ptr(new CurveGFp_P192(a, b)); if(p == prime_p224()) return std::shared_ptr(new CurveGFp_P224(a, b)); if(p == prime_p256()) return std::shared_ptr(new CurveGFp_P256(a, b)); if(p == prime_p384()) return std::shared_ptr(new CurveGFp_P384(a, b)); #endif if(p == prime_p521()) return std::shared_ptr(new CurveGFp_P521(a, b)); return std::shared_ptr(new CurveGFp_Montgomery(p, a, b)); } } botan-2.4.0/src/lib/math/ec_gfp/curve_gfp.h000066400000000000000000000106001322470703100204560ustar00rootroot00000000000000/* * Elliptic curves over GF(p) * * (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * 2010-2011,2012,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GFP_CURVE_H_ #define BOTAN_GFP_CURVE_H_ #include #include namespace Botan { class BOTAN_UNSTABLE_API CurveGFp_Repr { public: virtual ~CurveGFp_Repr() = default; virtual const BigInt& get_p() const = 0; virtual const BigInt& get_a() const = 0; virtual const BigInt& get_b() const = 0; virtual size_t get_p_words() const = 0; /* * Returns to_curve_rep(get_a()) */ virtual const BigInt& get_a_rep() const = 0; /* * Returns to_curve_rep(get_b()) */ virtual const BigInt& get_b_rep() const = 0; virtual void to_curve_rep(BigInt& x, secure_vector& ws) const = 0; virtual void from_curve_rep(BigInt& x, secure_vector& ws) const = 0; virtual void curve_mul(BigInt& z, const BigInt& x, const BigInt& y, secure_vector& ws) const = 0; virtual void curve_sqr(BigInt& z, const BigInt& x, secure_vector& ws) const = 0; }; /** * This class represents an elliptic curve over GF(p) */ class BOTAN_PUBLIC_API(2,0) CurveGFp final { public: /** * Create an uninitialized CurveGFp */ CurveGFp() = default; /** * Construct the elliptic curve E: y^2 = x^3 + ax + b over GF(p) * @param p prime number of the field * @param a first coefficient * @param b second coefficient */ CurveGFp(const BigInt& p, const BigInt& a, const BigInt& b) : m_repr(choose_repr(p, a, b)) { } CurveGFp(const CurveGFp&) = default; CurveGFp& operator=(const CurveGFp&) = default; /** * @return curve coefficient a */ const BigInt& get_a() const { return m_repr->get_a(); } /** * @return curve coefficient b */ const BigInt& get_b() const { return m_repr->get_b(); } /** * Get prime modulus of the field of the curve * @return prime modulus of the field of the curve */ const BigInt& get_p() const { return m_repr->get_p(); } const BigInt& get_a_rep() const { return m_repr->get_a_rep(); } const BigInt& get_b_rep() const { return m_repr->get_b_rep(); } void to_rep(BigInt& x, secure_vector& ws) const { m_repr->to_curve_rep(x, ws); } void from_rep(BigInt& x, secure_vector& ws) const { m_repr->from_curve_rep(x, ws); } BigInt from_rep(const BigInt& x, secure_vector& ws) const { BigInt xt(x); m_repr->from_curve_rep(xt, ws); return xt; } // TODO: from_rep taking && ref void mul(BigInt& z, const BigInt& x, const BigInt& y, secure_vector& ws) const { m_repr->curve_mul(z, x, y, ws); } BigInt mul(const BigInt& x, const BigInt& y, secure_vector& ws) const { BigInt z; m_repr->curve_mul(z, x, y, ws); return z; } void sqr(BigInt& z, const BigInt& x, secure_vector& ws) const { m_repr->curve_sqr(z, x, ws); } BigInt sqr(const BigInt& x, secure_vector& ws) const { BigInt z; m_repr->curve_sqr(z, x, ws); return z; } void swap(CurveGFp& other) { std::swap(m_repr, other.m_repr); } private: static std::shared_ptr choose_repr(const BigInt& p, const BigInt& a, const BigInt& b); std::shared_ptr m_repr; }; /** * Equality operator * @param lhs a curve * @param rhs a curve * @return true iff lhs is the same as rhs */ inline bool operator==(const CurveGFp& lhs, const CurveGFp& rhs) { return (lhs.get_p() == rhs.get_p()) && (lhs.get_a() == rhs.get_a()) && (lhs.get_b() == rhs.get_b()); } inline bool operator!=(const CurveGFp& lhs, const CurveGFp& rhs) { return !(lhs == rhs); } } namespace std { template<> inline void swap(Botan::CurveGFp& curve1, Botan::CurveGFp& curve2) BOTAN_NOEXCEPT { curve1.swap(curve2); } } // namespace std #endif botan-2.4.0/src/lib/math/ec_gfp/curve_nistp.cpp000066400000000000000000000263131322470703100214020ustar00rootroot00000000000000/* * NIST prime reductions * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { void normalize(const BigInt& p, BigInt& x, secure_vector& ws, size_t bound) { const word* prime = p.data(); const size_t p_words = p.sig_words(); while(x.is_negative()) x += p; // TODO: provide a high level function for this compare-and-sub operation x.grow_to(p_words + 1); if(ws.size() < p_words + 1) ws.resize(p_words + 1); for(size_t i = 0; bound == 0 || i < bound; ++i) { const word* xd = x.data(); word borrow = 0; for(size_t j = 0; j != p_words; ++j) { ws[j] = word_sub(xd[j], prime[j], &borrow); } ws[p_words] = word_sub(xd[p_words], 0, &borrow); if(borrow) break; x.swap_reg(ws); } } } const BigInt& prime_p521() { static const BigInt p521("0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); return p521; } void redc_p521(BigInt& x, secure_vector& ws) { const size_t p_full_words = 521 / MP_WORD_BITS; const size_t p_top_bits = 521 % MP_WORD_BITS; const size_t p_words = p_full_words + 1; const size_t x_sw = x.sig_words(); if(x_sw < p_words) return; // already smaller if(ws.size() < p_words + 1) ws.resize(p_words + 1); clear_mem(ws.data(), ws.size()); bigint_shr2(ws.data(), x.data(), x_sw, p_full_words, p_top_bits); x.mask_bits(521); word carry = bigint_add3_nc(x.mutable_data(), x.data(), p_words, ws.data(), p_words); BOTAN_ASSERT_EQUAL(carry, 0, "Final final carry in P-521 reduction"); normalize(prime_p521(), x, ws, 1); } #if defined(BOTAN_HAS_NIST_PRIME_REDUCERS_W32) namespace { /** * Treating this MPI as a sequence of 32-bit words in big-endian * order, return word i (or 0 if out of range) */ inline uint32_t get_uint32_t(const BigInt& x, size_t i) { #if (BOTAN_MP_WORD_BITS == 32) return x.word_at(i); #elif (BOTAN_MP_WORD_BITS == 64) return static_cast(x.word_at(i/2) >> ((i % 2)*32)); #else #error "Not implemented" #endif } /** * Treating this MPI as a sequence of 32-bit words in big-endian * order, set word i to the value x */ template inline void set_uint32_t(BigInt& x, size_t i, T v_in) { const uint32_t v = static_cast(v_in); #if (BOTAN_MP_WORD_BITS == 32) x.set_word_at(i, v); #elif (BOTAN_MP_WORD_BITS == 64) const word shift_32 = (i % 2) * 32; const word w = (x.word_at(i/2) & (static_cast(0xFFFFFFFF) << (32-shift_32))) | (static_cast(v) << shift_32); x.set_word_at(i/2, w); #else #error "Not implemented" #endif } } const BigInt& prime_p192() { static const BigInt p192("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"); return p192; } void redc_p192(BigInt& x, secure_vector& ws) { const uint32_t X6 = get_uint32_t(x, 6); const uint32_t X7 = get_uint32_t(x, 7); const uint32_t X8 = get_uint32_t(x, 8); const uint32_t X9 = get_uint32_t(x, 9); const uint32_t X10 = get_uint32_t(x, 10); const uint32_t X11 = get_uint32_t(x, 11); x.mask_bits(192); uint64_t S = 0; S += get_uint32_t(x, 0); S += X6; S += X10; set_uint32_t(x, 0, S); S >>= 32; S += get_uint32_t(x, 1); S += X7; S += X11; set_uint32_t(x, 1, S); S >>= 32; S += get_uint32_t(x, 2); S += X6; S += X8; S += X10; set_uint32_t(x, 2, S); S >>= 32; S += get_uint32_t(x, 3); S += X7; S += X9; S += X11; set_uint32_t(x, 3, S); S >>= 32; S += get_uint32_t(x, 4); S += X8; S += X10; set_uint32_t(x, 4, S); S >>= 32; S += get_uint32_t(x, 5); S += X9; S += X11; set_uint32_t(x, 5, S); S >>= 32; set_uint32_t(x, 6, S); // No underflow possible normalize(prime_p192(), x, ws, 3); } const BigInt& prime_p224() { static const BigInt p224("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"); return p224; } void redc_p224(BigInt& x, secure_vector& ws) { const uint32_t X7 = get_uint32_t(x, 7); const uint32_t X8 = get_uint32_t(x, 8); const uint32_t X9 = get_uint32_t(x, 9); const uint32_t X10 = get_uint32_t(x, 10); const uint32_t X11 = get_uint32_t(x, 11); const uint32_t X12 = get_uint32_t(x, 12); const uint32_t X13 = get_uint32_t(x, 13); x.mask_bits(224); // One full copy of P224 is added, so the result is always positive int64_t S = 0; S += get_uint32_t(x, 0); S += 1; S -= X7; S -= X11; set_uint32_t(x, 0, S); S >>= 32; S += get_uint32_t(x, 1); S -= X8; S -= X12; set_uint32_t(x, 1, S); S >>= 32; S += get_uint32_t(x, 2); S -= X9; S -= X13; set_uint32_t(x, 2, S); S >>= 32; S += get_uint32_t(x, 3); S += 0xFFFFFFFF; S += X7; S += X11; S -= X10; set_uint32_t(x, 3, S); S >>= 32; S += get_uint32_t(x, 4); S += 0xFFFFFFFF; S += X8; S += X12; S -= X11; set_uint32_t(x, 4, S); S >>= 32; S += get_uint32_t(x, 5); S += 0xFFFFFFFF; S += X9; S += X13; S -= X12; set_uint32_t(x, 5, S); S >>= 32; S += get_uint32_t(x, 6); S += 0xFFFFFFFF; S += X10; S -= X13; set_uint32_t(x, 6, S); S >>= 32; set_uint32_t(x, 7, S); BOTAN_ASSERT_EQUAL(S >> 32, 0, "No underflow"); normalize(prime_p224(), x, ws, 3); } const BigInt& prime_p256() { static const BigInt p256("0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"); return p256; } void redc_p256(BigInt& x, secure_vector& ws) { const uint32_t X8 = get_uint32_t(x, 8); const uint32_t X9 = get_uint32_t(x, 9); const uint32_t X10 = get_uint32_t(x, 10); const uint32_t X11 = get_uint32_t(x, 11); const uint32_t X12 = get_uint32_t(x, 12); const uint32_t X13 = get_uint32_t(x, 13); const uint32_t X14 = get_uint32_t(x, 14); const uint32_t X15 = get_uint32_t(x, 15); x.mask_bits(256); int64_t S = 0; // Adds 6 * P-256 to prevent underflow S = get_uint32_t(x, 0); S += 0xFFFFFFFA; S += X8; S += X9; S -= X11; S -= X12; S -= X13; S -= X14; set_uint32_t(x, 0, S); S >>= 32; S += get_uint32_t(x, 1); S += 0xFFFFFFFF; S += X9; S += X10; S -= X12; S -= X13; S -= X14; S -= X15; set_uint32_t(x, 1, S); S >>= 32; S += get_uint32_t(x, 2); S += 0xFFFFFFFF; S += X10; S += X11; S -= X13; S -= X14; S -= X15; set_uint32_t(x, 2, S); S >>= 32; S += get_uint32_t(x, 3); S += 5; S += X11; S += X11; S += X12; S += X12; S += X13; S -= X15; S -= X8; S -= X9; set_uint32_t(x, 3, S); S >>= 32; S += get_uint32_t(x, 4); S += X12; S += X12; S += X13; S += X13; S += X14; S -= X9; S -= X10; set_uint32_t(x, 4, S); S >>= 32; S += get_uint32_t(x, 5); S += X13; S += X13; S += X14; S += X14; S += X15; S -= X10; S -= X11; set_uint32_t(x, 5, S); S >>= 32; S += get_uint32_t(x, 6); S += 6; S += X14; S += X14; S += X15; S += X15; S += X14; S += X13; S -= X8; S -= X9; set_uint32_t(x, 6, S); S >>= 32; S += get_uint32_t(x, 7); S += 0xFFFFFFFA; S += X15; S += X15; S += X15; S += X8; S -= X10; S -= X11; S -= X12; S -= X13; set_uint32_t(x, 7, S); S >>= 32; S += 5; set_uint32_t(x, 8, S); BOTAN_ASSERT_EQUAL(S >> 32, 0, "No underflow"); #if 0 if(S >= 2) { BOTAN_ASSERT(S <= 10, "Expected overflow"); static const BigInt P256_mults[9] = { 2*CurveGFp_P256::prime(), 3*CurveGFp_P256::prime(), 4*CurveGFp_P256::prime(), 5*CurveGFp_P256::prime(), 6*CurveGFp_P256::prime(), 7*CurveGFp_P256::prime(), 8*CurveGFp_P256::prime(), 9*CurveGFp_P256::prime(), 10*CurveGFp_P256::prime() }; x -= P256_mults[S - 2]; } #endif normalize(prime_p256(), x, ws, 10); } const BigInt& prime_p384() { static const BigInt p384("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"); return p384; } void redc_p384(BigInt& x, secure_vector& ws) { const uint32_t X12 = get_uint32_t(x, 12); const uint32_t X13 = get_uint32_t(x, 13); const uint32_t X14 = get_uint32_t(x, 14); const uint32_t X15 = get_uint32_t(x, 15); const uint32_t X16 = get_uint32_t(x, 16); const uint32_t X17 = get_uint32_t(x, 17); const uint32_t X18 = get_uint32_t(x, 18); const uint32_t X19 = get_uint32_t(x, 19); const uint32_t X20 = get_uint32_t(x, 20); const uint32_t X21 = get_uint32_t(x, 21); const uint32_t X22 = get_uint32_t(x, 22); const uint32_t X23 = get_uint32_t(x, 23); x.mask_bits(384); int64_t S = 0; // One copy of P-384 is added to prevent underflow S = get_uint32_t(x, 0); S += 0xFFFFFFFF; S += X12; S += X21; S += X20; S -= X23; set_uint32_t(x, 0, S); S >>= 32; S += get_uint32_t(x, 1); S += X13; S += X22; S += X23; S -= X12; S -= X20; set_uint32_t(x, 1, S); S >>= 32; S += get_uint32_t(x, 2); S += X14; S += X23; S -= X13; S -= X21; set_uint32_t(x, 2, S); S >>= 32; S += get_uint32_t(x, 3); S += 0xFFFFFFFF; S += X15; S += X12; S += X20; S += X21; S -= X14; S -= X22; S -= X23; set_uint32_t(x, 3, S); S >>= 32; S += get_uint32_t(x, 4); S += 0xFFFFFFFE; S += X21; S += X21; S += X16; S += X13; S += X12; S += X20; S += X22; S -= X15; S -= X23; S -= X23; set_uint32_t(x, 4, S); S >>= 32; S += get_uint32_t(x, 5); S += 0xFFFFFFFF; S += X22; S += X22; S += X17; S += X14; S += X13; S += X21; S += X23; S -= X16; set_uint32_t(x, 5, S); S >>= 32; S += get_uint32_t(x, 6); S += 0xFFFFFFFF; S += X23; S += X23; S += X18; S += X15; S += X14; S += X22; S -= X17; set_uint32_t(x, 6, S); S >>= 32; S += get_uint32_t(x, 7); S += 0xFFFFFFFF; S += X19; S += X16; S += X15; S += X23; S -= X18; set_uint32_t(x, 7, S); S >>= 32; S += get_uint32_t(x, 8); S += 0xFFFFFFFF; S += X20; S += X17; S += X16; S -= X19; set_uint32_t(x, 8, S); S >>= 32; S += get_uint32_t(x, 9); S += 0xFFFFFFFF; S += X21; S += X18; S += X17; S -= X20; set_uint32_t(x, 9, S); S >>= 32; S += get_uint32_t(x, 10); S += 0xFFFFFFFF; S += X22; S += X19; S += X18; S -= X21; set_uint32_t(x, 10, S); S >>= 32; S += get_uint32_t(x, 11); S += 0xFFFFFFFF; S += X23; S += X20; S += X19; S -= X22; set_uint32_t(x, 11, S); S >>= 32; BOTAN_ASSERT_EQUAL(S >> 32, 0, "No underflow"); set_uint32_t(x, 12, S); #if 0 if(S >= 2) { BOTAN_ASSERT(S <= 4, "Expected overflow"); static const BigInt P384_mults[3] = { 2*CurveGFp_P384::prime(), 3*CurveGFp_P384::prime(), 4*CurveGFp_P384::prime() }; x -= P384_mults[S - 2]; } #endif normalize(prime_p384(), x, ws, 4); } #endif } botan-2.4.0/src/lib/math/ec_gfp/curve_nistp.h000066400000000000000000000022361322470703100210450ustar00rootroot00000000000000/* * Arithmetic operations specialized for NIST ECC primes * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_NIST_PRIMES_H_ #define BOTAN_NIST_PRIMES_H_ #include namespace Botan { /** * NIST Prime reduction functions. * * Reduces the value in place * * ws is a workspace function which is used as a temporary, * and will be resized as needed. */ BOTAN_PUBLIC_API(2,0) const BigInt& prime_p521(); BOTAN_PUBLIC_API(2,0) void redc_p521(BigInt& x, secure_vector& ws); #if (BOTAN_MP_WORD_BITS == 32) || (BOTAN_MP_WORD_BITS == 64) #define BOTAN_HAS_NIST_PRIME_REDUCERS_W32 BOTAN_PUBLIC_API(2,0) const BigInt& prime_p384(); BOTAN_PUBLIC_API(2,0) void redc_p384(BigInt& x, secure_vector& ws); BOTAN_PUBLIC_API(2,0) const BigInt& prime_p256(); BOTAN_PUBLIC_API(2,0) void redc_p256(BigInt& x, secure_vector& ws); BOTAN_PUBLIC_API(2,0) const BigInt& prime_p224(); BOTAN_PUBLIC_API(2,0) void redc_p224(BigInt& x, secure_vector& ws); BOTAN_PUBLIC_API(2,0) const BigInt& prime_p192(); BOTAN_PUBLIC_API(2,0) void redc_p192(BigInt& x, secure_vector& ws); #endif } #endif botan-2.4.0/src/lib/math/ec_gfp/info.txt000066400000000000000000000001411322470703100200200ustar00rootroot00000000000000 EC_CURVE_GFP -> 20131128 load_on auto numbertheory botan-2.4.0/src/lib/math/ec_gfp/point_gfp.cpp000066400000000000000000000331411322470703100210230ustar00rootroot00000000000000/* * Point arithmetic on elliptic curves over GF(p) * * (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * 2008-2011,2012,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { PointGFp::PointGFp(const CurveGFp& curve) : m_curve(curve), m_coord_x(0), m_coord_y(1), m_coord_z(0) { m_curve.to_rep(m_coord_x, m_monty_ws); m_curve.to_rep(m_coord_y, m_monty_ws); m_curve.to_rep(m_coord_z, m_monty_ws); } PointGFp::PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y) : m_curve(curve), m_coord_x(x), m_coord_y(y), m_coord_z(1) { if(x <= 0 || x >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp affine x"); if(y <= 0 || y >= curve.get_p()) throw Invalid_Argument("Invalid PointGFp affine y"); m_curve.to_rep(m_coord_x, m_monty_ws); m_curve.to_rep(m_coord_y, m_monty_ws); m_curve.to_rep(m_coord_z, m_monty_ws); } void PointGFp::randomize_repr(RandomNumberGenerator& rng) { if(BOTAN_POINTGFP_RANDOMIZE_BLINDING_BITS > 1) { BigInt mask; while(mask.is_zero()) mask.randomize(rng, BOTAN_POINTGFP_RANDOMIZE_BLINDING_BITS, false); m_curve.to_rep(mask, m_monty_ws); const BigInt mask2 = curve_mult(mask, mask); const BigInt mask3 = curve_mult(mask2, mask); m_coord_x = curve_mult(m_coord_x, mask2); m_coord_y = curve_mult(m_coord_y, mask3); m_coord_z = curve_mult(m_coord_z, mask); } } // Point addition void PointGFp::add(const PointGFp& rhs, std::vector& ws_bn) { if(is_zero()) { m_coord_x = rhs.m_coord_x; m_coord_y = rhs.m_coord_y; m_coord_z = rhs.m_coord_z; return; } else if(rhs.is_zero()) return; const BigInt& p = m_curve.get_p(); BigInt& rhs_z2 = ws_bn[0]; BigInt& U1 = ws_bn[1]; BigInt& S1 = ws_bn[2]; BigInt& lhs_z2 = ws_bn[3]; BigInt& U2 = ws_bn[4]; BigInt& S2 = ws_bn[5]; BigInt& H = ws_bn[6]; BigInt& r = ws_bn[7]; /* https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#addition-add-1998-cmo-2 */ curve_sqr(rhs_z2, rhs.m_coord_z); curve_mult(U1, m_coord_x, rhs_z2); curve_mult(S1, m_coord_y, curve_mult(rhs.m_coord_z, rhs_z2)); curve_sqr(lhs_z2, m_coord_z); curve_mult(U2, rhs.m_coord_x, lhs_z2); curve_mult(S2, rhs.m_coord_y, curve_mult(m_coord_z, lhs_z2)); H = U2; H -= U1; if(H.is_negative()) H += p; r = S2; r -= S1; if(r.is_negative()) r += p; if(H.is_zero()) { if(r.is_zero()) { mult2(ws_bn); return; } // setting to zero: m_coord_x = 0; m_coord_y = 1; m_coord_z = 0; return; } curve_sqr(U2, H); curve_mult(S2, U2, H); U2 = curve_mult(U1, U2); curve_sqr(m_coord_x, r); m_coord_x -= S2; m_coord_x -= (U2 << 1); while(m_coord_x.is_negative()) m_coord_x += p; U2 -= m_coord_x; if(U2.is_negative()) U2 += p; curve_mult(m_coord_y, r, U2); m_coord_y -= curve_mult(S1, S2); if(m_coord_y.is_negative()) m_coord_y += p; curve_mult(m_coord_z, curve_mult(m_coord_z, rhs.m_coord_z), H); } // *this *= 2 void PointGFp::mult2(std::vector& ws_bn) { if(is_zero()) return; else if(m_coord_y.is_zero()) { *this = PointGFp(m_curve); // setting myself to zero return; } /* https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-1986-cc */ const BigInt& p = m_curve.get_p(); BigInt& y_2 = ws_bn[0]; BigInt& S = ws_bn[1]; BigInt& z4 = ws_bn[2]; BigInt& a_z4 = ws_bn[3]; BigInt& M = ws_bn[4]; BigInt& U = ws_bn[5]; BigInt& x = ws_bn[6]; BigInt& y = ws_bn[7]; BigInt& z = ws_bn[8]; curve_sqr(y_2, m_coord_y); curve_mult(S, m_coord_x, y_2); S <<= 2; // * 4 while(S >= p) S -= p; curve_sqr(z4, curve_sqr(m_coord_z)); curve_mult(a_z4, m_curve.get_a_rep(), z4); M = curve_sqr(m_coord_x); M *= 3; M += a_z4; while(M >= p) M -= p; curve_sqr(x, M); x -= (S << 1); while(x.is_negative()) x += p; curve_sqr(U, y_2); U <<= 3; while(U >= p) U -= p; S -= x; while(S.is_negative()) S += p; curve_mult(y, M, S); y -= U; if(y.is_negative()) y += p; curve_mult(z, m_coord_y, m_coord_z); z <<= 1; if(z >= p) z -= p; m_coord_x = x; m_coord_y = y; m_coord_z = z; } // arithmetic operators PointGFp& PointGFp::operator+=(const PointGFp& rhs) { std::vector ws(9); add(rhs, ws); return *this; } PointGFp& PointGFp::operator-=(const PointGFp& rhs) { PointGFp minus_rhs = PointGFp(rhs).negate(); if(is_zero()) *this = minus_rhs; else *this += minus_rhs; return *this; } PointGFp& PointGFp::operator*=(const BigInt& scalar) { *this = scalar * *this; return *this; } PointGFp multi_exponentiate(const PointGFp& p1, const BigInt& z1, const PointGFp& p2, const BigInt& z2) { const PointGFp p3 = p1 + p2; PointGFp H(p1.get_curve()); // create as zero size_t bits_left = std::max(z1.bits(), z2.bits()); std::vector ws(9); while(bits_left) { H.mult2(ws); const bool z1_b = z1.get_bit(bits_left - 1); const bool z2_b = z2.get_bit(bits_left - 1); if(z1_b == true && z2_b == true) H.add(p3, ws); else if(z1_b) H.add(p1, ws); else if(z2_b) H.add(p2, ws); --bits_left; } if(z1.is_negative() != z2.is_negative()) H.negate(); return H; } PointGFp operator*(const BigInt& scalar, const PointGFp& point) { //BOTAN_ASSERT(point.on_the_curve(), "Input is on the curve"); const CurveGFp& curve = point.get_curve(); const size_t scalar_bits = scalar.bits(); std::vector ws(9); PointGFp R[2] = { PointGFp(curve), point }; for(size_t i = scalar_bits; i > 0; i--) { const size_t b = scalar.get_bit(i - 1); R[b ^ 1].add(R[b], ws); R[b].mult2(ws); } if(scalar.is_negative()) R[0].negate(); //BOTAN_ASSERT(R[0].on_the_curve(), "Output is on the curve"); return R[0]; } Blinded_Point_Multiply::Blinded_Point_Multiply(const PointGFp& base, const BigInt& order, size_t h) : m_h(h > 0 ? h : 4), m_order(order), m_ws(9) { // Upper bound is a sanity check rather than hard limit if(m_h < 1 || m_h > 8) throw Invalid_Argument("Blinded_Point_Multiply invalid h param"); const CurveGFp& curve = base.get_curve(); const PointGFp inv = -base; m_U.resize(6*m_h + 3); m_U[3*m_h+0] = inv; m_U[3*m_h+1] = PointGFp::zero_of(curve); m_U[3*m_h+2] = base; for(size_t i = 1; i <= 3 * m_h + 1; ++i) { m_U[3*m_h+1+i] = m_U[3*m_h+i]; m_U[3*m_h+1+i].add(base, m_ws); m_U[3*m_h+1-i] = m_U[3*m_h+2-i]; m_U[3*m_h+1-i].add(inv, m_ws); } } PointGFp Blinded_Point_Multiply::blinded_multiply(const BigInt& scalar_in, RandomNumberGenerator& rng) { if(scalar_in.is_negative()) throw Invalid_Argument("Blinded_Point_Multiply scalar must be positive"); #if BOTAN_POINTGFP_USE_SCALAR_BLINDING // Choose a small mask m and use k' = k + m*order (Coron's 1st countermeasure) const BigInt mask(rng, (m_order.bits()+1)/2, false); const BigInt scalar = scalar_in + m_order * mask; #else const BigInt& scalar = scalar_in; #endif const size_t scalar_bits = scalar.bits(); // Randomize each point representation (Coron's 3rd countermeasure) for(size_t i = 0; i != m_U.size(); ++i) m_U[i].randomize_repr(rng); PointGFp R = m_U.at(3*m_h + 2); // base point int32_t alpha = 0; R.randomize_repr(rng); /* Algorithm 7 from "Randomizing the Montgomery Powering Ladder" Duc-Phong Le, Chik How Tan and Michael Tunstall https://eprint.iacr.org/2015/657 It takes a random walk through (a subset of) the set of addition chains that end in k. */ for(size_t i = scalar_bits; i > 0; i--) { const int32_t ki = scalar.get_bit(i); // choose gamma from -h,...,h const int32_t gamma = static_cast((rng.next_byte() % (2*m_h))) - m_h; const int32_t l = gamma - 2*alpha + ki - (ki ^ 1); R.mult2(m_ws); R.add(m_U.at(3*m_h + 1 + l), m_ws); alpha = gamma; } const int32_t k0 = scalar.get_bit(0); R.add(m_U[3*m_h + 1 - alpha - (k0 ^ 1)], m_ws); //BOTAN_ASSERT(R.on_the_curve(), "Output is on the curve"); return R; } BigInt PointGFp::get_affine_x() const { if(is_zero()) throw Illegal_Transformation("Cannot convert zero point to affine"); BigInt z2 = curve_sqr(m_coord_z); m_curve.from_rep(z2, m_monty_ws); z2 = inverse_mod(z2, m_curve.get_p()); return curve_mult(z2, m_coord_x); } BigInt PointGFp::get_affine_y() const { if(is_zero()) throw Illegal_Transformation("Cannot convert zero point to affine"); BigInt z3 = curve_mult(m_coord_z, curve_sqr(m_coord_z)); z3 = inverse_mod(z3, m_curve.get_p()); m_curve.to_rep(z3, m_monty_ws); return curve_mult(z3, m_coord_y); } bool PointGFp::on_the_curve() const { /* Is the point still on the curve?? (If everything is correct, the point is always on its curve; then the function will return true. If somehow the state is corrupted, which suggests a fault attack (or internal computational error), then return false. */ if(is_zero()) return true; const BigInt y2 = m_curve.from_rep(curve_sqr(m_coord_y), m_monty_ws); const BigInt x3 = curve_mult(m_coord_x, curve_sqr(m_coord_x)); const BigInt ax = curve_mult(m_coord_x, m_curve.get_a_rep()); const BigInt z2 = curve_sqr(m_coord_z); if(m_coord_z == z2) // Is z equal to 1 (in Montgomery form)? { if(y2 != m_curve.from_rep(x3 + ax + m_curve.get_b_rep(), m_monty_ws)) return false; } const BigInt z3 = curve_mult(m_coord_z, z2); const BigInt ax_z4 = curve_mult(ax, curve_sqr(z2)); const BigInt b_z6 = curve_mult(m_curve.get_b_rep(), curve_sqr(z3)); if(y2 != m_curve.from_rep(x3 + ax_z4 + b_z6, m_monty_ws)) return false; return true; } // swaps the states of *this and other, does not throw! void PointGFp::swap(PointGFp& other) { m_curve.swap(other.m_curve); m_coord_x.swap(other.m_coord_x); m_coord_y.swap(other.m_coord_y); m_coord_z.swap(other.m_coord_z); m_monty_ws.swap(other.m_monty_ws); } bool PointGFp::operator==(const PointGFp& other) const { if(get_curve() != other.get_curve()) return false; // If this is zero, only equal if other is also zero if(is_zero()) return other.is_zero(); return (get_affine_x() == other.get_affine_x() && get_affine_y() == other.get_affine_y()); } // encoding and decoding secure_vector EC2OSP(const PointGFp& point, uint8_t format) { if(point.is_zero()) return secure_vector(1); // single 0 byte const size_t p_bytes = point.get_curve().get_p().bytes(); BigInt x = point.get_affine_x(); BigInt y = point.get_affine_y(); secure_vector bX = BigInt::encode_1363(x, p_bytes); secure_vector bY = BigInt::encode_1363(y, p_bytes); if(format == PointGFp::UNCOMPRESSED) { secure_vector result; result.push_back(0x04); result += bX; result += bY; return result; } else if(format == PointGFp::COMPRESSED) { secure_vector result; result.push_back(0x02 | static_cast(y.get_bit(0))); result += bX; return result; } else if(format == PointGFp::HYBRID) { secure_vector result; result.push_back(0x06 | static_cast(y.get_bit(0))); result += bX; result += bY; return result; } else throw Invalid_Argument("EC2OSP illegal point encoding"); } namespace { BigInt decompress_point(bool yMod2, const BigInt& x, const CurveGFp& curve) { BigInt xpow3 = x * x * x; const BigInt& p = curve.get_p(); BigInt g = curve.get_a() * x; g += xpow3; g += curve.get_b(); g = g % p; BigInt z = ressol(g, p); if(z < 0) throw Illegal_Point("error during EC point decompression"); if(z.get_bit(0) != yMod2) z = p - z; return z; } } PointGFp OS2ECP(const uint8_t data[], size_t data_len, const CurveGFp& curve) { if(data_len <= 1) return PointGFp(curve); // return zero const uint8_t pc = data[0]; BigInt x, y; if(pc == 2 || pc == 3) { //compressed form x = BigInt::decode(&data[1], data_len - 1); const bool y_mod_2 = ((pc & 0x01) == 1); y = decompress_point(y_mod_2, x, curve); } else if(pc == 4) { const size_t l = (data_len - 1) / 2; // uncompressed form x = BigInt::decode(&data[1], l); y = BigInt::decode(&data[l+1], l); } else if(pc == 6 || pc == 7) { const size_t l = (data_len - 1) / 2; // hybrid form x = BigInt::decode(&data[1], l); y = BigInt::decode(&data[l+1], l); const bool y_mod_2 = ((pc & 0x01) == 1); if(decompress_point(y_mod_2, x, curve) != y) throw Illegal_Point("OS2ECP: Decoding error in hybrid format"); } else throw Invalid_Argument("OS2ECP: Unknown format type " + std::to_string(pc)); PointGFp result(curve, x, y); if(!result.on_the_curve()) throw Illegal_Point("OS2ECP: Decoded point was not on the curve"); return result; } } botan-2.4.0/src/lib/math/ec_gfp/point_gfp.h000066400000000000000000000167321322470703100204770ustar00rootroot00000000000000/* * Point arithmetic on elliptic curves over GF(p) * * (C) 2007 Martin Doering, Christoph Ludwig, Falko Strenzke * 2008-2011,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_POINT_GFP_H_ #define BOTAN_POINT_GFP_H_ #include #include namespace Botan { /** * Exception thrown if you try to convert a zero point to an affine * coordinate */ class BOTAN_PUBLIC_API(2,0) Illegal_Transformation final : public Exception { public: explicit Illegal_Transformation(const std::string& err = "Requested transformation is not possible") : Exception(err) {} }; /** * Exception thrown if some form of illegal point is decoded */ class BOTAN_PUBLIC_API(2,0) Illegal_Point final : public Exception { public: explicit Illegal_Point(const std::string& err = "Malformed ECP point detected") : Exception(err) {} }; /** * This class represents one point on a curve of GF(p) */ class BOTAN_PUBLIC_API(2,0) PointGFp final { public: enum Compression_Type { UNCOMPRESSED = 0, COMPRESSED = 1, HYBRID = 2 }; /** * Construct an uninitialized PointGFp */ PointGFp() = default; /** * Construct the zero point * @param curve The base curve */ explicit PointGFp(const CurveGFp& curve); static PointGFp zero_of(const CurveGFp& curve) { return PointGFp(curve); } /** * Copy constructor */ PointGFp(const PointGFp&) = default; /** * Move Constructor */ PointGFp(PointGFp&& other) { this->swap(other); } /** * Standard Assignment */ PointGFp& operator=(const PointGFp&) = default; /** * Move Assignment */ PointGFp& operator=(PointGFp&& other) { if(this != &other) this->swap(other); return (*this); } /** * Construct a point from its affine coordinates * @param curve the base curve * @param x affine x coordinate * @param y affine y coordinate */ PointGFp(const CurveGFp& curve, const BigInt& x, const BigInt& y); /** * += Operator * @param rhs the PointGFp to add to the local value * @result resulting PointGFp */ PointGFp& operator+=(const PointGFp& rhs); /** * -= Operator * @param rhs the PointGFp to subtract from the local value * @result resulting PointGFp */ PointGFp& operator-=(const PointGFp& rhs); /** * *= Operator * @param scalar the PointGFp to multiply with *this * @result resulting PointGFp */ PointGFp& operator*=(const BigInt& scalar); /** * Multiplication Operator * @param scalar the scalar value * @param point the point value * @return scalar*point on the curve */ friend BOTAN_PUBLIC_API(2,0) PointGFp operator*(const BigInt& scalar, const PointGFp& point); /** * Multiexponentiation * @param p1 a point * @param z1 a scalar * @param p2 a point * @param z2 a scalar * @result (p1 * z1 + p2 * z2) */ friend BOTAN_PUBLIC_API(2,0) PointGFp multi_exponentiate( const PointGFp& p1, const BigInt& z1, const PointGFp& p2, const BigInt& z2); /** * Negate this point * @return *this */ PointGFp& negate() { if(!is_zero()) m_coord_y = m_curve.get_p() - m_coord_y; return *this; } /** * Return base curve of this point * @result the curve over GF(p) of this point */ const CurveGFp& get_curve() const { return m_curve; } /** * get affine x coordinate * @result affine x coordinate */ BigInt get_affine_x() const; /** * get affine y coordinate * @result affine y coordinate */ BigInt get_affine_y() const; /** * Is this the point at infinity? * @result true, if this point is at infinity, false otherwise. */ bool is_zero() const { return (m_coord_x.is_zero() && m_coord_z.is_zero()); } /** * Checks whether the point is to be found on the underlying * curve; used to prevent fault attacks. * @return if the point is on the curve */ bool on_the_curve() const; /** * swaps the states of *this and other, does not throw! * @param other the object to swap values with */ void swap(PointGFp& other); /** * Randomize the point representation * The actual value (get_affine_x, get_affine_y) does not change */ void randomize_repr(RandomNumberGenerator& rng); /** * Equality operator */ bool operator==(const PointGFp& other) const; private: friend class Blinded_Point_Multiply; BigInt curve_mult(const BigInt& x, const BigInt& y) const { BigInt z; m_curve.mul(z, x, y, m_monty_ws); return z; } void curve_mult(BigInt& z, const BigInt& x, const BigInt& y) const { m_curve.mul(z, x, y, m_monty_ws); } BigInt curve_sqr(const BigInt& x) const { BigInt z; m_curve.sqr(z, x, m_monty_ws); return z; } void curve_sqr(BigInt& z, const BigInt& x) const { m_curve.sqr(z, x, m_monty_ws); } /** * Point addition * @param workspace temp space, at least 11 elements */ void add(const PointGFp& other, std::vector& workspace); /** * Point doubling * @param workspace temp space, at least 9 elements */ void mult2(std::vector& workspace); CurveGFp m_curve; BigInt m_coord_x, m_coord_y, m_coord_z; mutable secure_vector m_monty_ws; // workspace for Montgomery }; // relational operators inline bool operator!=(const PointGFp& lhs, const PointGFp& rhs) { return !(rhs == lhs); } // arithmetic operators inline PointGFp operator-(const PointGFp& lhs) { return PointGFp(lhs).negate(); } inline PointGFp operator+(const PointGFp& lhs, const PointGFp& rhs) { PointGFp tmp(lhs); return tmp += rhs; } inline PointGFp operator-(const PointGFp& lhs, const PointGFp& rhs) { PointGFp tmp(lhs); return tmp -= rhs; } inline PointGFp operator*(const PointGFp& point, const BigInt& scalar) { return scalar * point; } // encoding and decoding secure_vector BOTAN_PUBLIC_API(2,0) EC2OSP(const PointGFp& point, uint8_t format); PointGFp BOTAN_PUBLIC_API(2,0) OS2ECP(const uint8_t data[], size_t data_len, const CurveGFp& curve); template PointGFp OS2ECP(const std::vector& data, const CurveGFp& curve) { return OS2ECP(data.data(), data.size(), curve); } /** */ class BOTAN_PUBLIC_API(2,0) Blinded_Point_Multiply final { public: Blinded_Point_Multiply(const PointGFp& base, const BigInt& order, size_t h = 0); PointGFp blinded_multiply(const BigInt& scalar, RandomNumberGenerator& rng); private: const size_t m_h; const BigInt& m_order; std::vector m_ws; std::vector m_U; }; } namespace std { template<> inline void swap(Botan::PointGFp& x, Botan::PointGFp& y) { x.swap(y); } } #endif botan-2.4.0/src/lib/math/mp/000077500000000000000000000000001322470703100155215ustar00rootroot00000000000000botan-2.4.0/src/lib/math/mp/info.txt000066400000000000000000000002731322470703100172170ustar00rootroot00000000000000 BIGINT_MP -> 20151225 mp_types.h mp_core.h mp_madd.h mp_asmi.h bigint botan-2.4.0/src/lib/math/mp/mp_asmi.h000066400000000000000000000514201322470703100173210ustar00rootroot00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MP_ASM_INTERNAL_H_ #define BOTAN_MP_ASM_INTERNAL_H_ #include namespace Botan { #if defined(BOTAN_MP_USE_X86_32_ASM) #define ADDSUB2_OP(OPERATION, INDEX) \ ASM("movl 4*" #INDEX "(%[y]), %[carry]") \ ASM(OPERATION " %[carry], 4*" #INDEX "(%[x])") \ #define ADDSUB3_OP(OPERATION, INDEX) \ ASM("movl 4*" #INDEX "(%[x]), %[carry]") \ ASM(OPERATION " 4*" #INDEX "(%[y]), %[carry]") \ ASM("movl %[carry], 4*" #INDEX "(%[z])") \ #define LINMUL_OP(WRITE_TO, INDEX) \ ASM("movl 4*" #INDEX "(%[x]),%%eax") \ ASM("mull %[y]") \ ASM("addl %[carry],%%eax") \ ASM("adcl $0,%%edx") \ ASM("movl %%edx,%[carry]") \ ASM("movl %%eax, 4*" #INDEX "(%[" WRITE_TO "])") #define MULADD_OP(IGNORED, INDEX) \ ASM("movl 4*" #INDEX "(%[x]),%%eax") \ ASM("mull %[y]") \ ASM("addl %[carry],%%eax") \ ASM("adcl $0,%%edx") \ ASM("addl 4*" #INDEX "(%[z]),%%eax") \ ASM("adcl $0,%%edx") \ ASM("movl %%edx,%[carry]") \ ASM("movl %%eax, 4*" #INDEX " (%[z])") #define ADD_OR_SUBTRACT(CORE_CODE) \ ASM("rorl %[carry]") \ CORE_CODE \ ASM("sbbl %[carry],%[carry]") \ ASM("negl %[carry]") #elif defined(BOTAN_MP_USE_X86_64_ASM) #define ADDSUB2_OP(OPERATION, INDEX) \ ASM("movq 8*" #INDEX "(%[y]), %[carry]") \ ASM(OPERATION " %[carry], 8*" #INDEX "(%[x])") \ #define ADDSUB3_OP(OPERATION, INDEX) \ ASM("movq 8*" #INDEX "(%[x]), %[carry]") \ ASM(OPERATION " 8*" #INDEX "(%[y]), %[carry]") \ ASM("movq %[carry], 8*" #INDEX "(%[z])") \ #define LINMUL_OP(WRITE_TO, INDEX) \ ASM("movq 8*" #INDEX "(%[x]),%%rax") \ ASM("mulq %[y]") \ ASM("addq %[carry],%%rax") \ ASM("adcq $0,%%rdx") \ ASM("movq %%rdx,%[carry]") \ ASM("movq %%rax, 8*" #INDEX "(%[" WRITE_TO "])") #define MULADD_OP(IGNORED, INDEX) \ ASM("movq 8*" #INDEX "(%[x]),%%rax") \ ASM("mulq %[y]") \ ASM("addq %[carry],%%rax") \ ASM("adcq $0,%%rdx") \ ASM("addq 8*" #INDEX "(%[z]),%%rax") \ ASM("adcq $0,%%rdx") \ ASM("movq %%rdx,%[carry]") \ ASM("movq %%rax, 8*" #INDEX " (%[z])") #define ADD_OR_SUBTRACT(CORE_CODE) \ ASM("rorq %[carry]") \ CORE_CODE \ ASM("sbbq %[carry],%[carry]") \ ASM("negq %[carry]") #endif #if defined(ADD_OR_SUBTRACT) #define ASM(x) x "\n\t" #define DO_8_TIMES(MACRO, ARG) \ MACRO(ARG, 0) \ MACRO(ARG, 1) \ MACRO(ARG, 2) \ MACRO(ARG, 3) \ MACRO(ARG, 4) \ MACRO(ARG, 5) \ MACRO(ARG, 6) \ MACRO(ARG, 7) #endif /* * Word Addition */ inline word word_add(word x, word y, word* carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(ASM("adcl %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(ASM("adcq %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; #else word z = x + y; word c1 = (z < x); z += *carry; *carry = c1 | (z < *carry); return z; #endif } /* * Eight Word Block Addition, Two Argument */ inline word word8_add2(word x[8], const word y[8], word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "adcl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "adcq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_32_MSVC_ASM) __asm { mov edx,[x] mov esi,[y] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov eax,[esi] adc [edx],eax mov eax,[esi+4] adc [edx+4],eax mov eax,[esi+8] adc [edx+8],eax mov eax,[esi+12] adc [edx+12],eax mov eax,[esi+16] adc [edx+16],eax mov eax,[esi+20] adc [edx+20],eax mov eax,[esi+24] adc [edx+24],eax mov eax,[esi+28] adc [edx+28],eax sbb eax,eax neg eax } #else x[0] = word_add(x[0], y[0], &carry); x[1] = word_add(x[1], y[1], &carry); x[2] = word_add(x[2], y[2], &carry); x[3] = word_add(x[3], y[3], &carry); x[4] = word_add(x[4], y[4], &carry); x[5] = word_add(x[5], y[5], &carry); x[6] = word_add(x[6], y[6], &carry); x[7] = word_add(x[7], y[7], &carry); return carry; #endif } /* * Eight Word Block Addition, Three Argument */ inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "adcl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "adcq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_32_MSVC_ASM) __asm { mov edi,[x] mov esi,[y] mov ebx,[z] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov eax,[edi] adc eax,[esi] mov [ebx],eax mov eax,[edi+4] adc eax,[esi+4] mov [ebx+4],eax mov eax,[edi+8] adc eax,[esi+8] mov [ebx+8],eax mov eax,[edi+12] adc eax,[esi+12] mov [ebx+12],eax mov eax,[edi+16] adc eax,[esi+16] mov [ebx+16],eax mov eax,[edi+20] adc eax,[esi+20] mov [ebx+20],eax mov eax,[edi+24] adc eax,[esi+24] mov [ebx+24],eax mov eax,[edi+28] adc eax,[esi+28] mov [ebx+28],eax sbb eax,eax neg eax } #else z[0] = word_add(x[0], y[0], &carry); z[1] = word_add(x[1], y[1], &carry); z[2] = word_add(x[2], y[2], &carry); z[3] = word_add(x[3], y[3], &carry); z[4] = word_add(x[4], y[4], &carry); z[5] = word_add(x[5], y[5], &carry); z[6] = word_add(x[6], y[6], &carry); z[7] = word_add(x[7], y[7], &carry); return carry; #endif } /* * Word Subtraction */ inline word word_sub(word x, word y, word* carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(ASM("sbbl %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(ASM("sbbq %[y],%[x]")) : [x]"=r"(x), [carry]"=r"(*carry) : "0"(x), [y]"rm"(y), "1"(*carry) : "cc"); return x; #else word t0 = x - y; word c1 = (t0 > x); word z = t0 - *carry; *carry = c1 | (z > t0); return z; #endif } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2(word x[8], const word y[8], word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "sbbl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB2_OP, "sbbq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_32_MSVC_ASM) __asm { mov edi,[x] mov esi,[y] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov eax,[edi] sbb eax,[esi] mov [edi],eax mov eax,[edi+4] sbb eax,[esi+4] mov [edi+4],eax mov eax,[edi+8] sbb eax,[esi+8] mov [edi+8],eax mov eax,[edi+12] sbb eax,[esi+12] mov [edi+12],eax mov eax,[edi+16] sbb eax,[esi+16] mov [edi+16],eax mov eax,[edi+20] sbb eax,[esi+20] mov [edi+20],eax mov eax,[edi+24] sbb eax,[esi+24] mov [edi+24],eax mov eax,[edi+28] sbb eax,[esi+28] mov [edi+28],eax sbb eax,eax neg eax } #else x[0] = word_sub(x[0], y[0], &carry); x[1] = word_sub(x[1], y[1], &carry); x[2] = word_sub(x[2], y[2], &carry); x[3] = word_sub(x[3], y[3], &carry); x[4] = word_sub(x[4], y[4], &carry); x[5] = word_sub(x[5], y[5], &carry); x[6] = word_sub(x[6], y[6], &carry); x[7] = word_sub(x[7], y[7], &carry); return carry; #endif } /* * Eight Word Block Subtraction, Two Argument */ inline word word8_sub2_rev(word x[8], const word y[8], word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbl")) : [carry]"=r"(carry) : [x]"r"(y), [y]"r"(x), [z]"r"(x), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbq")) : [carry]"=r"(carry) : [x]"r"(y), [y]"r"(x), [z]"r"(x), "0"(carry) : "cc", "memory"); return carry; #else x[0] = word_sub(y[0], x[0], &carry); x[1] = word_sub(y[1], x[1], &carry); x[2] = word_sub(y[2], x[2], &carry); x[3] = word_sub(y[3], x[3], &carry); x[4] = word_sub(y[4], x[4], &carry); x[5] = word_sub(y[5], x[5], &carry); x[6] = word_sub(y[6], x[6], &carry); x[7] = word_sub(y[7], x[7], &carry); return carry; #endif } /* * Eight Word Block Subtraction, Three Argument */ inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbl")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ADD_OR_SUBTRACT(DO_8_TIMES(ADDSUB3_OP, "sbbq")) : [carry]"=r"(carry) : [x]"r"(x), [y]"r"(y), [z]"r"(z), "0"(carry) : "cc", "memory"); return carry; #elif defined(BOTAN_MP_USE_X86_32_MSVC_ASM) __asm { mov edi,[x] mov esi,[y] xor eax,eax sub eax,[carry] //force CF=1 iff *carry==1 mov ebx,[z] mov eax,[edi] sbb eax,[esi] mov [ebx],eax mov eax,[edi+4] sbb eax,[esi+4] mov [ebx+4],eax mov eax,[edi+8] sbb eax,[esi+8] mov [ebx+8],eax mov eax,[edi+12] sbb eax,[esi+12] mov [ebx+12],eax mov eax,[edi+16] sbb eax,[esi+16] mov [ebx+16],eax mov eax,[edi+20] sbb eax,[esi+20] mov [ebx+20],eax mov eax,[edi+24] sbb eax,[esi+24] mov [ebx+24],eax mov eax,[edi+28] sbb eax,[esi+28] mov [ebx+28],eax sbb eax,eax neg eax } #else z[0] = word_sub(x[0], y[0], &carry); z[1] = word_sub(x[1], y[1], &carry); z[2] = word_sub(x[2], y[2], &carry); z[3] = word_sub(x[3], y[3], &carry); z[4] = word_sub(x[4], y[4], &carry); z[5] = word_sub(x[5], y[5], &carry); z[6] = word_sub(x[6], y[6], &carry); z[7] = word_sub(x[7], y[7], &carry); return carry; #endif } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul2(word x[8], word y, word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( DO_8_TIMES(LINMUL_OP, "x") : [carry]"=r"(carry) : [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%eax", "%edx"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( DO_8_TIMES(LINMUL_OP, "x") : [carry]"=r"(carry) : [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%rax", "%rdx"); return carry; #elif defined(BOTAN_MP_USE_X86_32_MSVC_ASM) __asm { mov esi,[x] mov eax,[esi] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,[carry] //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi],eax //load a mov eax,[esi+4] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+4],eax //load a mov eax,[esi+8] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+8],eax //load a mov eax,[esi+12] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+12],eax //load a mov eax,[esi+16] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+16],eax //load a mov eax,[esi+20] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+20],eax //load a mov eax,[esi+24] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [esi+24],eax //load a mov eax,[esi+28] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov [esi+28],eax //load a mov eax,edx //store carry } #else x[0] = word_madd2(x[0], y, &carry); x[1] = word_madd2(x[1], y, &carry); x[2] = word_madd2(x[2], y, &carry); x[3] = word_madd2(x[3], y, &carry); x[4] = word_madd2(x[4], y, &carry); x[5] = word_madd2(x[5], y, &carry); x[6] = word_madd2(x[6], y, &carry); x[7] = word_madd2(x[7], y, &carry); return carry; #endif } /* * Eight Word Block Linear Multiplication */ inline word word8_linmul3(word z[8], const word x[8], word y, word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( DO_8_TIMES(LINMUL_OP, "z") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%eax", "%edx"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( DO_8_TIMES(LINMUL_OP, "z") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%rax", "%rdx"); return carry; #elif defined(BOTAN_MP_USE_X86_32_MSVC_ASM) __asm { mov edi,[z] mov esi,[x] mov eax,[esi] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,[carry] //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi],eax //load a mov eax,[esi+4] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+4],eax //load a mov eax,[esi+8] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+8],eax //load a mov eax,[esi+12] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+12],eax //load a mov eax,[esi+16] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+16],eax //load a mov eax,[esi+20] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+20],eax //load a mov eax,[esi+24] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov ecx,edx //store carry mov [edi+24],eax //load a mov eax,[esi+28] //load a mul [y] //edx(hi):eax(lo)=a*b add eax,ecx //sum lo carry adc edx,0 //sum hi carry mov [edi+28],eax //load a mov eax,edx //store carry } #else z[0] = word_madd2(x[0], y, &carry); z[1] = word_madd2(x[1], y, &carry); z[2] = word_madd2(x[2], y, &carry); z[3] = word_madd2(x[3], y, &carry); z[4] = word_madd2(x[4], y, &carry); z[5] = word_madd2(x[5], y, &carry); z[6] = word_madd2(x[6], y, &carry); z[7] = word_madd2(x[7], y, &carry); return carry; #endif } /* * Eight Word Block Multiply/Add */ inline word word8_madd3(word z[8], const word x[8], word y, word carry) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( DO_8_TIMES(MULADD_OP, "") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%eax", "%edx"); return carry; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( DO_8_TIMES(MULADD_OP, "") : [carry]"=r"(carry) : [z]"r"(z), [x]"r"(x), [y]"rm"(y), "0"(carry) : "cc", "%rax", "%rdx"); return carry; #else z[0] = word_madd3(x[0], y, z[0], &carry); z[1] = word_madd3(x[1], y, z[1], &carry); z[2] = word_madd3(x[2], y, z[2], &carry); z[3] = word_madd3(x[3], y, z[3], &carry); z[4] = word_madd3(x[4], y, z[4], &carry); z[5] = word_madd3(x[5], y, z[5], &carry); z[6] = word_madd3(x[6], y, z[6], &carry); z[7] = word_madd3(x[7], y, z[7], &carry); return carry; #endif } /* * Multiply-Add Accumulator * (w2,w1,w0) += x * y */ inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ASM("mull %[y]") ASM("addl %[x],%[w0]") ASM("adcl %[y],%[w1]") ASM("adcl $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ASM("mulq %[y]") ASM("addq %[x],%[w0]") ASM("adcq %[y],%[w1]") ASM("adcq $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); #else word carry = *w0; *w0 = word_madd2(x, y, &carry); *w1 += carry; *w2 += (*w1 < carry) ? 1 : 0; #endif } /* * Multiply-Add Accumulator * (w2,w1,w0) += 2 * x * y */ inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ASM("mull %[y]") ASM("addl %[x],%[w0]") ASM("adcl %[y],%[w1]") ASM("adcl $0,%[w2]") ASM("addl %[x],%[w0]") ASM("adcl %[y],%[w1]") ASM("adcl $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ASM("mulq %[y]") ASM("addq %[x],%[w0]") ASM("adcq %[y],%[w1]") ASM("adcq $0,%[w2]") ASM("addq %[x],%[w0]") ASM("adcq %[y],%[w1]") ASM("adcq $0,%[w2]") : [w0]"=r"(*w0), [w1]"=r"(*w1), [w2]"=r"(*w2) : [x]"a"(x), [y]"d"(y), "0"(*w0), "1"(*w1), "2"(*w2) : "cc"); #else word carry = 0; x = word_madd2(x, y, &carry); y = carry; word top = (y >> (BOTAN_MP_WORD_BITS-1)); y <<= 1; y |= (x >> (BOTAN_MP_WORD_BITS-1)); x <<= 1; carry = 0; *w0 = word_add(*w0, x, &carry); *w1 = word_add(*w1, y, &carry); *w2 = word_add(*w2, top, &carry); #endif } #if defined(ASM) #undef ASM #undef DO_8_TIMES #undef ADD_OR_SUBTRACT #undef ADDSUB2_OP #undef ADDSUB3_OP #undef LINMUL_OP #undef MULADD_OP #endif } #endif botan-2.4.0/src/lib/math/mp/mp_comba.cpp000066400000000000000000001126761322470703100200170ustar00rootroot00000000000000/* * Comba Multiplication and Squaring * * This file was automatically generated by ./src/scripts/comba.py on 2016-01-01 * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Comba 4x4 Squaring */ void bigint_comba_sqr4(word z[8], const word x[4]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd (&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd (&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd (&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd (&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; z[ 7] = w1; } /* * Comba 4x4 Multiplication */ void bigint_comba_mul4(word z[8], const word x[4], const word y[4]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); z[ 6] = w0; z[ 7] = w1; } /* * Comba 6x6 Squaring */ void bigint_comba_sqr6(word z[12], const word x[6]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd (&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd (&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd (&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd (&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd (&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd (&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; z[11] = w2; } /* * Comba 6x6 Multiplication */ void bigint_comba_mul6(word z[12], const word x[6], const word y[6]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); z[10] = w1; z[11] = w2; } /* * Comba 8x8 Squaring */ void bigint_comba_sqr8(word z[16], const word x[8]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd (&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd (&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd (&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd (&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd (&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]); word3_muladd (&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]); z[11] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); word3_muladd (&w2, &w1, &w0, x[ 6], x[ 6]); z[12] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]); z[13] = w1; w1 = 0; word3_muladd (&w1, &w0, &w2, x[ 7], x[ 7]); z[14] = w2; z[15] = w0; } /* * Comba 8x8 Multiplication */ void bigint_comba_mul8(word z[16], const word x[8], const word y[8]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]); z[10] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]); z[11] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); z[12] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]); z[13] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]); z[14] = w2; z[15] = w0; } /* * Comba 9x9 Squaring */ void bigint_comba_sqr9(word z[18], const word x[9]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd (&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd (&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd (&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd (&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd (&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]); word3_muladd (&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]); z[11] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); word3_muladd (&w2, &w1, &w0, x[ 6], x[ 6]); z[12] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]); z[13] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]); word3_muladd (&w1, &w0, &w2, x[ 7], x[ 7]); z[14] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]); z[15] = w0; w0 = 0; word3_muladd (&w0, &w2, &w1, x[ 8], x[ 8]); z[16] = w1; z[17] = w2; } /* * Comba 9x9 Multiplication */ void bigint_comba_mul9(word z[18], const word x[9], const word y[9]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]); z[10] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]); z[11] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]); z[12] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]); z[13] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]); z[14] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]); z[15] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]); z[16] = w1; z[17] = w2; } /* * Comba 16x16 Squaring */ void bigint_comba_sqr16(word z[32], const word x[16]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd (&w2, &w1, &w0, x[ 0], x[ 0]); z[ 0] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 1]); z[ 1] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 2]); word3_muladd (&w1, &w0, &w2, x[ 1], x[ 1]); z[ 2] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 3]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 2]); z[ 3] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 4]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 3]); word3_muladd (&w0, &w2, &w1, x[ 2], x[ 2]); z[ 4] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 5]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 4]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 3]); z[ 5] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 5]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 4]); word3_muladd (&w2, &w1, &w0, x[ 3], x[ 3]); z[ 6] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 6]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 5]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 4]); z[ 7] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[ 8]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 6]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 5]); word3_muladd (&w1, &w0, &w2, x[ 4], x[ 4]); z[ 8] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[ 9]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[ 8]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[ 7]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 6]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 5]); z[ 9] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[10]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[ 9]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[ 8]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[ 7]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 6]); word3_muladd (&w0, &w2, &w1, x[ 5], x[ 5]); z[10] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[11]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[10]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[ 9]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[ 8]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[ 7]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 6]); z[11] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[12]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[11]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[10]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[ 9]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[ 8]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[ 7]); word3_muladd (&w2, &w1, &w0, x[ 6], x[ 6]); z[12] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 0], x[13]); word3_muladd_2(&w0, &w2, &w1, x[ 1], x[12]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[11]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[10]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[ 9]); word3_muladd_2(&w0, &w2, &w1, x[ 5], x[ 8]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[ 7]); z[13] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 0], x[14]); word3_muladd_2(&w1, &w0, &w2, x[ 1], x[13]); word3_muladd_2(&w1, &w0, &w2, x[ 2], x[12]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[11]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[10]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[ 9]); word3_muladd_2(&w1, &w0, &w2, x[ 6], x[ 8]); word3_muladd (&w1, &w0, &w2, x[ 7], x[ 7]); z[14] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 0], x[15]); word3_muladd_2(&w2, &w1, &w0, x[ 1], x[14]); word3_muladd_2(&w2, &w1, &w0, x[ 2], x[13]); word3_muladd_2(&w2, &w1, &w0, x[ 3], x[12]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[11]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[10]); word3_muladd_2(&w2, &w1, &w0, x[ 6], x[ 9]); word3_muladd_2(&w2, &w1, &w0, x[ 7], x[ 8]); z[15] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 1], x[15]); word3_muladd_2(&w0, &w2, &w1, x[ 2], x[14]); word3_muladd_2(&w0, &w2, &w1, x[ 3], x[13]); word3_muladd_2(&w0, &w2, &w1, x[ 4], x[12]); word3_muladd_2(&w0, &w2, &w1, x[ 5], x[11]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[10]); word3_muladd_2(&w0, &w2, &w1, x[ 7], x[ 9]); word3_muladd (&w0, &w2, &w1, x[ 8], x[ 8]); z[16] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 2], x[15]); word3_muladd_2(&w1, &w0, &w2, x[ 3], x[14]); word3_muladd_2(&w1, &w0, &w2, x[ 4], x[13]); word3_muladd_2(&w1, &w0, &w2, x[ 5], x[12]); word3_muladd_2(&w1, &w0, &w2, x[ 6], x[11]); word3_muladd_2(&w1, &w0, &w2, x[ 7], x[10]); word3_muladd_2(&w1, &w0, &w2, x[ 8], x[ 9]); z[17] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 3], x[15]); word3_muladd_2(&w2, &w1, &w0, x[ 4], x[14]); word3_muladd_2(&w2, &w1, &w0, x[ 5], x[13]); word3_muladd_2(&w2, &w1, &w0, x[ 6], x[12]); word3_muladd_2(&w2, &w1, &w0, x[ 7], x[11]); word3_muladd_2(&w2, &w1, &w0, x[ 8], x[10]); word3_muladd (&w2, &w1, &w0, x[ 9], x[ 9]); z[18] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 4], x[15]); word3_muladd_2(&w0, &w2, &w1, x[ 5], x[14]); word3_muladd_2(&w0, &w2, &w1, x[ 6], x[13]); word3_muladd_2(&w0, &w2, &w1, x[ 7], x[12]); word3_muladd_2(&w0, &w2, &w1, x[ 8], x[11]); word3_muladd_2(&w0, &w2, &w1, x[ 9], x[10]); z[19] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 5], x[15]); word3_muladd_2(&w1, &w0, &w2, x[ 6], x[14]); word3_muladd_2(&w1, &w0, &w2, x[ 7], x[13]); word3_muladd_2(&w1, &w0, &w2, x[ 8], x[12]); word3_muladd_2(&w1, &w0, &w2, x[ 9], x[11]); word3_muladd (&w1, &w0, &w2, x[10], x[10]); z[20] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 6], x[15]); word3_muladd_2(&w2, &w1, &w0, x[ 7], x[14]); word3_muladd_2(&w2, &w1, &w0, x[ 8], x[13]); word3_muladd_2(&w2, &w1, &w0, x[ 9], x[12]); word3_muladd_2(&w2, &w1, &w0, x[10], x[11]); z[21] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[ 7], x[15]); word3_muladd_2(&w0, &w2, &w1, x[ 8], x[14]); word3_muladd_2(&w0, &w2, &w1, x[ 9], x[13]); word3_muladd_2(&w0, &w2, &w1, x[10], x[12]); word3_muladd (&w0, &w2, &w1, x[11], x[11]); z[22] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[ 8], x[15]); word3_muladd_2(&w1, &w0, &w2, x[ 9], x[14]); word3_muladd_2(&w1, &w0, &w2, x[10], x[13]); word3_muladd_2(&w1, &w0, &w2, x[11], x[12]); z[23] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[ 9], x[15]); word3_muladd_2(&w2, &w1, &w0, x[10], x[14]); word3_muladd_2(&w2, &w1, &w0, x[11], x[13]); word3_muladd (&w2, &w1, &w0, x[12], x[12]); z[24] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[10], x[15]); word3_muladd_2(&w0, &w2, &w1, x[11], x[14]); word3_muladd_2(&w0, &w2, &w1, x[12], x[13]); z[25] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[11], x[15]); word3_muladd_2(&w1, &w0, &w2, x[12], x[14]); word3_muladd (&w1, &w0, &w2, x[13], x[13]); z[26] = w2; w2 = 0; word3_muladd_2(&w2, &w1, &w0, x[12], x[15]); word3_muladd_2(&w2, &w1, &w0, x[13], x[14]); z[27] = w0; w0 = 0; word3_muladd_2(&w0, &w2, &w1, x[13], x[15]); word3_muladd (&w0, &w2, &w1, x[14], x[14]); z[28] = w1; w1 = 0; word3_muladd_2(&w1, &w0, &w2, x[14], x[15]); z[29] = w2; w2 = 0; word3_muladd (&w2, &w1, &w0, x[15], x[15]); z[30] = w0; z[31] = w1; } /* * Comba 16x16 Multiplication */ void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) { word w2 = 0, w1 = 0, w0 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 0]); z[ 0] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 0]); z[ 1] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 0]); z[ 2] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 0]); z[ 3] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 0]); z[ 4] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 0]); z[ 5] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 0]); z[ 6] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 1]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 0]); z[ 7] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 1], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 2]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 1]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 0]); z[ 8] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[ 9]); word3_muladd(&w2, &w1, &w0, x[ 1], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 2], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 3]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 2]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 1]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 0]); z[ 9] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[10]); word3_muladd(&w0, &w2, &w1, x[ 1], y[ 9]); word3_muladd(&w0, &w2, &w1, x[ 2], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 3], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 4]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 3]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 2]); word3_muladd(&w0, &w2, &w1, x[ 9], y[ 1]); word3_muladd(&w0, &w2, &w1, x[10], y[ 0]); z[10] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[11]); word3_muladd(&w1, &w0, &w2, x[ 1], y[10]); word3_muladd(&w1, &w0, &w2, x[ 2], y[ 9]); word3_muladd(&w1, &w0, &w2, x[ 3], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 4], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 5]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 4]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 3]); word3_muladd(&w1, &w0, &w2, x[ 9], y[ 2]); word3_muladd(&w1, &w0, &w2, x[10], y[ 1]); word3_muladd(&w1, &w0, &w2, x[11], y[ 0]); z[11] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[12]); word3_muladd(&w2, &w1, &w0, x[ 1], y[11]); word3_muladd(&w2, &w1, &w0, x[ 2], y[10]); word3_muladd(&w2, &w1, &w0, x[ 3], y[ 9]); word3_muladd(&w2, &w1, &w0, x[ 4], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 5], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 6]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 5]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 4]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 3]); word3_muladd(&w2, &w1, &w0, x[10], y[ 2]); word3_muladd(&w2, &w1, &w0, x[11], y[ 1]); word3_muladd(&w2, &w1, &w0, x[12], y[ 0]); z[12] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 0], y[13]); word3_muladd(&w0, &w2, &w1, x[ 1], y[12]); word3_muladd(&w0, &w2, &w1, x[ 2], y[11]); word3_muladd(&w0, &w2, &w1, x[ 3], y[10]); word3_muladd(&w0, &w2, &w1, x[ 4], y[ 9]); word3_muladd(&w0, &w2, &w1, x[ 5], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 6], y[ 7]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 6]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 5]); word3_muladd(&w0, &w2, &w1, x[ 9], y[ 4]); word3_muladd(&w0, &w2, &w1, x[10], y[ 3]); word3_muladd(&w0, &w2, &w1, x[11], y[ 2]); word3_muladd(&w0, &w2, &w1, x[12], y[ 1]); word3_muladd(&w0, &w2, &w1, x[13], y[ 0]); z[13] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 0], y[14]); word3_muladd(&w1, &w0, &w2, x[ 1], y[13]); word3_muladd(&w1, &w0, &w2, x[ 2], y[12]); word3_muladd(&w1, &w0, &w2, x[ 3], y[11]); word3_muladd(&w1, &w0, &w2, x[ 4], y[10]); word3_muladd(&w1, &w0, &w2, x[ 5], y[ 9]); word3_muladd(&w1, &w0, &w2, x[ 6], y[ 8]); word3_muladd(&w1, &w0, &w2, x[ 7], y[ 7]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 6]); word3_muladd(&w1, &w0, &w2, x[ 9], y[ 5]); word3_muladd(&w1, &w0, &w2, x[10], y[ 4]); word3_muladd(&w1, &w0, &w2, x[11], y[ 3]); word3_muladd(&w1, &w0, &w2, x[12], y[ 2]); word3_muladd(&w1, &w0, &w2, x[13], y[ 1]); word3_muladd(&w1, &w0, &w2, x[14], y[ 0]); z[14] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 0], y[15]); word3_muladd(&w2, &w1, &w0, x[ 1], y[14]); word3_muladd(&w2, &w1, &w0, x[ 2], y[13]); word3_muladd(&w2, &w1, &w0, x[ 3], y[12]); word3_muladd(&w2, &w1, &w0, x[ 4], y[11]); word3_muladd(&w2, &w1, &w0, x[ 5], y[10]); word3_muladd(&w2, &w1, &w0, x[ 6], y[ 9]); word3_muladd(&w2, &w1, &w0, x[ 7], y[ 8]); word3_muladd(&w2, &w1, &w0, x[ 8], y[ 7]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 6]); word3_muladd(&w2, &w1, &w0, x[10], y[ 5]); word3_muladd(&w2, &w1, &w0, x[11], y[ 4]); word3_muladd(&w2, &w1, &w0, x[12], y[ 3]); word3_muladd(&w2, &w1, &w0, x[13], y[ 2]); word3_muladd(&w2, &w1, &w0, x[14], y[ 1]); word3_muladd(&w2, &w1, &w0, x[15], y[ 0]); z[15] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 1], y[15]); word3_muladd(&w0, &w2, &w1, x[ 2], y[14]); word3_muladd(&w0, &w2, &w1, x[ 3], y[13]); word3_muladd(&w0, &w2, &w1, x[ 4], y[12]); word3_muladd(&w0, &w2, &w1, x[ 5], y[11]); word3_muladd(&w0, &w2, &w1, x[ 6], y[10]); word3_muladd(&w0, &w2, &w1, x[ 7], y[ 9]); word3_muladd(&w0, &w2, &w1, x[ 8], y[ 8]); word3_muladd(&w0, &w2, &w1, x[ 9], y[ 7]); word3_muladd(&w0, &w2, &w1, x[10], y[ 6]); word3_muladd(&w0, &w2, &w1, x[11], y[ 5]); word3_muladd(&w0, &w2, &w1, x[12], y[ 4]); word3_muladd(&w0, &w2, &w1, x[13], y[ 3]); word3_muladd(&w0, &w2, &w1, x[14], y[ 2]); word3_muladd(&w0, &w2, &w1, x[15], y[ 1]); z[16] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 2], y[15]); word3_muladd(&w1, &w0, &w2, x[ 3], y[14]); word3_muladd(&w1, &w0, &w2, x[ 4], y[13]); word3_muladd(&w1, &w0, &w2, x[ 5], y[12]); word3_muladd(&w1, &w0, &w2, x[ 6], y[11]); word3_muladd(&w1, &w0, &w2, x[ 7], y[10]); word3_muladd(&w1, &w0, &w2, x[ 8], y[ 9]); word3_muladd(&w1, &w0, &w2, x[ 9], y[ 8]); word3_muladd(&w1, &w0, &w2, x[10], y[ 7]); word3_muladd(&w1, &w0, &w2, x[11], y[ 6]); word3_muladd(&w1, &w0, &w2, x[12], y[ 5]); word3_muladd(&w1, &w0, &w2, x[13], y[ 4]); word3_muladd(&w1, &w0, &w2, x[14], y[ 3]); word3_muladd(&w1, &w0, &w2, x[15], y[ 2]); z[17] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 3], y[15]); word3_muladd(&w2, &w1, &w0, x[ 4], y[14]); word3_muladd(&w2, &w1, &w0, x[ 5], y[13]); word3_muladd(&w2, &w1, &w0, x[ 6], y[12]); word3_muladd(&w2, &w1, &w0, x[ 7], y[11]); word3_muladd(&w2, &w1, &w0, x[ 8], y[10]); word3_muladd(&w2, &w1, &w0, x[ 9], y[ 9]); word3_muladd(&w2, &w1, &w0, x[10], y[ 8]); word3_muladd(&w2, &w1, &w0, x[11], y[ 7]); word3_muladd(&w2, &w1, &w0, x[12], y[ 6]); word3_muladd(&w2, &w1, &w0, x[13], y[ 5]); word3_muladd(&w2, &w1, &w0, x[14], y[ 4]); word3_muladd(&w2, &w1, &w0, x[15], y[ 3]); z[18] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 4], y[15]); word3_muladd(&w0, &w2, &w1, x[ 5], y[14]); word3_muladd(&w0, &w2, &w1, x[ 6], y[13]); word3_muladd(&w0, &w2, &w1, x[ 7], y[12]); word3_muladd(&w0, &w2, &w1, x[ 8], y[11]); word3_muladd(&w0, &w2, &w1, x[ 9], y[10]); word3_muladd(&w0, &w2, &w1, x[10], y[ 9]); word3_muladd(&w0, &w2, &w1, x[11], y[ 8]); word3_muladd(&w0, &w2, &w1, x[12], y[ 7]); word3_muladd(&w0, &w2, &w1, x[13], y[ 6]); word3_muladd(&w0, &w2, &w1, x[14], y[ 5]); word3_muladd(&w0, &w2, &w1, x[15], y[ 4]); z[19] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 5], y[15]); word3_muladd(&w1, &w0, &w2, x[ 6], y[14]); word3_muladd(&w1, &w0, &w2, x[ 7], y[13]); word3_muladd(&w1, &w0, &w2, x[ 8], y[12]); word3_muladd(&w1, &w0, &w2, x[ 9], y[11]); word3_muladd(&w1, &w0, &w2, x[10], y[10]); word3_muladd(&w1, &w0, &w2, x[11], y[ 9]); word3_muladd(&w1, &w0, &w2, x[12], y[ 8]); word3_muladd(&w1, &w0, &w2, x[13], y[ 7]); word3_muladd(&w1, &w0, &w2, x[14], y[ 6]); word3_muladd(&w1, &w0, &w2, x[15], y[ 5]); z[20] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 6], y[15]); word3_muladd(&w2, &w1, &w0, x[ 7], y[14]); word3_muladd(&w2, &w1, &w0, x[ 8], y[13]); word3_muladd(&w2, &w1, &w0, x[ 9], y[12]); word3_muladd(&w2, &w1, &w0, x[10], y[11]); word3_muladd(&w2, &w1, &w0, x[11], y[10]); word3_muladd(&w2, &w1, &w0, x[12], y[ 9]); word3_muladd(&w2, &w1, &w0, x[13], y[ 8]); word3_muladd(&w2, &w1, &w0, x[14], y[ 7]); word3_muladd(&w2, &w1, &w0, x[15], y[ 6]); z[21] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[ 7], y[15]); word3_muladd(&w0, &w2, &w1, x[ 8], y[14]); word3_muladd(&w0, &w2, &w1, x[ 9], y[13]); word3_muladd(&w0, &w2, &w1, x[10], y[12]); word3_muladd(&w0, &w2, &w1, x[11], y[11]); word3_muladd(&w0, &w2, &w1, x[12], y[10]); word3_muladd(&w0, &w2, &w1, x[13], y[ 9]); word3_muladd(&w0, &w2, &w1, x[14], y[ 8]); word3_muladd(&w0, &w2, &w1, x[15], y[ 7]); z[22] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[ 8], y[15]); word3_muladd(&w1, &w0, &w2, x[ 9], y[14]); word3_muladd(&w1, &w0, &w2, x[10], y[13]); word3_muladd(&w1, &w0, &w2, x[11], y[12]); word3_muladd(&w1, &w0, &w2, x[12], y[11]); word3_muladd(&w1, &w0, &w2, x[13], y[10]); word3_muladd(&w1, &w0, &w2, x[14], y[ 9]); word3_muladd(&w1, &w0, &w2, x[15], y[ 8]); z[23] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[ 9], y[15]); word3_muladd(&w2, &w1, &w0, x[10], y[14]); word3_muladd(&w2, &w1, &w0, x[11], y[13]); word3_muladd(&w2, &w1, &w0, x[12], y[12]); word3_muladd(&w2, &w1, &w0, x[13], y[11]); word3_muladd(&w2, &w1, &w0, x[14], y[10]); word3_muladd(&w2, &w1, &w0, x[15], y[ 9]); z[24] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[10], y[15]); word3_muladd(&w0, &w2, &w1, x[11], y[14]); word3_muladd(&w0, &w2, &w1, x[12], y[13]); word3_muladd(&w0, &w2, &w1, x[13], y[12]); word3_muladd(&w0, &w2, &w1, x[14], y[11]); word3_muladd(&w0, &w2, &w1, x[15], y[10]); z[25] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[11], y[15]); word3_muladd(&w1, &w0, &w2, x[12], y[14]); word3_muladd(&w1, &w0, &w2, x[13], y[13]); word3_muladd(&w1, &w0, &w2, x[14], y[12]); word3_muladd(&w1, &w0, &w2, x[15], y[11]); z[26] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[12], y[15]); word3_muladd(&w2, &w1, &w0, x[13], y[14]); word3_muladd(&w2, &w1, &w0, x[14], y[13]); word3_muladd(&w2, &w1, &w0, x[15], y[12]); z[27] = w0; w0 = 0; word3_muladd(&w0, &w2, &w1, x[13], y[15]); word3_muladd(&w0, &w2, &w1, x[14], y[14]); word3_muladd(&w0, &w2, &w1, x[15], y[13]); z[28] = w1; w1 = 0; word3_muladd(&w1, &w0, &w2, x[14], y[15]); word3_muladd(&w1, &w0, &w2, x[15], y[14]); z[29] = w2; w2 = 0; word3_muladd(&w2, &w1, &w0, x[15], y[15]); z[30] = w0; z[31] = w1; } } botan-2.4.0/src/lib/math/mp/mp_core.cpp000066400000000000000000000231501322470703100176520ustar00rootroot00000000000000/* * MPI Add, Subtract, Word Multiply * (C) 1999-2010,2016 Jack Lloyd * 2006 Luca Piccarreta * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * If cond == 0, does nothing. * If cond > 0, swaps x[0:size] with y[0:size] * Runs in constant time */ void bigint_cnd_swap(word cnd, word x[], word y[], size_t size) { const word mask = CT::expand_mask(cnd); for(size_t i = 0; i != size; ++i) { word a = x[i]; word b = y[i]; x[i] = CT::select(mask, b, a); y[i] = CT::select(mask, a, b); } } /* * If cond > 0 adds x[0:size] to y[0:size] and returns carry * Runs in constant time */ word bigint_cnd_add(word cnd, word x[], const word y[], size_t size) { const word mask = CT::expand_mask(cnd); word carry = 0; for(size_t i = 0; i != size; ++i) { /* Here we are relying on asm version of word_add being a single addcl or equivalent. Fix this. */ const word z = word_add(x[i], y[i], &carry); x[i] = CT::select(mask, z, x[i]); } return carry & mask; } /* * If cond > 0 subs x[0:size] to y[0:size] and returns borrow * Runs in constant time */ word bigint_cnd_sub(word cnd, word x[], const word y[], size_t size) { const word mask = CT::expand_mask(cnd); word carry = 0; for(size_t i = 0; i != size; ++i) { const word z = word_sub(x[i], y[i], &carry); x[i] = CT::select(mask, z, x[i]); } return carry & mask; } void bigint_cnd_abs(word cnd, word x[], size_t size) { const word mask = CT::expand_mask(cnd); word carry = mask & 1; for(size_t i = 0; i != size; ++i) { const word z = word_add(~x[i], 0, &carry); x[i] = CT::select(mask, z, x[i]); } } /* * Two Operand Addition, No Carry */ word bigint_add2_nc(word x[], size_t x_size, const word y[], size_t y_size) { word carry = 0; BOTAN_ASSERT(x_size >= y_size, "Expected sizes"); const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) carry = word8_add2(x + i, y + i, carry); for(size_t i = blocks; i != y_size; ++i) x[i] = word_add(x[i], y[i], &carry); for(size_t i = y_size; i != x_size; ++i) x[i] = word_add(x[i], 0, &carry); return carry; } /* * Three Operand Addition, No Carry */ word bigint_add3_nc(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { if(x_size < y_size) { return bigint_add3_nc(z, y, y_size, x, x_size); } word carry = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) carry = word8_add3(z + i, x + i, y + i, carry); for(size_t i = blocks; i != y_size; ++i) z[i] = word_add(x[i], y[i], &carry); for(size_t i = y_size; i != x_size; ++i) z[i] = word_add(x[i], 0, &carry); return carry; } /* * Two Operand Addition */ void bigint_add2(word x[], size_t x_size, const word y[], size_t y_size) { if(bigint_add2_nc(x, x_size, y, y_size)) x[x_size] += 1; } /* * Three Operand Addition */ void bigint_add3(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { z[x_size > y_size ? x_size : y_size] += bigint_add3_nc(z, x, x_size, y, y_size); } /* * Two Operand Subtraction */ word bigint_sub2(word x[], size_t x_size, const word y[], size_t y_size) { word borrow = 0; BOTAN_ASSERT(x_size >= y_size, "Expected sizes"); const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) borrow = word8_sub2(x + i, y + i, borrow); for(size_t i = blocks; i != y_size; ++i) x[i] = word_sub(x[i], y[i], &borrow); for(size_t i = y_size; i != x_size; ++i) x[i] = word_sub(x[i], 0, &borrow); return borrow; } /* * Two Operand Subtraction x = y - x */ void bigint_sub2_rev(word x[], const word y[], size_t y_size) { word borrow = 0; const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) borrow = word8_sub2_rev(x + i, y + i, borrow); for(size_t i = blocks; i != y_size; ++i) x[i] = word_sub(y[i], x[i], &borrow); BOTAN_ASSERT(!borrow, "y must be greater than x"); } /* * Three Operand Subtraction */ word bigint_sub3(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { word borrow = 0; BOTAN_ASSERT(x_size >= y_size, "Expected sizes"); const size_t blocks = y_size - (y_size % 8); for(size_t i = 0; i != blocks; i += 8) borrow = word8_sub3(z + i, x + i, y + i, borrow); for(size_t i = blocks; i != y_size; ++i) z[i] = word_sub(x[i], y[i], &borrow); for(size_t i = y_size; i != x_size; ++i) z[i] = word_sub(x[i], 0, &borrow); return borrow; } /* * Two Operand Linear Multiply */ void bigint_linmul2(word x[], size_t x_size, word y) { const size_t blocks = x_size - (x_size % 8); word carry = 0; for(size_t i = 0; i != blocks; i += 8) carry = word8_linmul2(x + i, y, carry); for(size_t i = blocks; i != x_size; ++i) x[i] = word_madd2(x[i], y, &carry); x[x_size] = carry; } /* * Three Operand Linear Multiply */ void bigint_linmul3(word z[], const word x[], size_t x_size, word y) { const size_t blocks = x_size - (x_size % 8); word carry = 0; for(size_t i = 0; i != blocks; i += 8) carry = word8_linmul3(z + i, x + i, y, carry); for(size_t i = blocks; i != x_size; ++i) z[i] = word_madd2(x[i], y, &carry); z[x_size] = carry; } /* * Single Operand Left Shift */ void bigint_shl1(word x[], size_t x_size, size_t word_shift, size_t bit_shift) { if(word_shift) { copy_mem(x + word_shift, x, x_size); clear_mem(x, word_shift); } if(bit_shift) { word carry = 0; for(size_t j = word_shift; j != x_size + word_shift + 1; ++j) { word temp = x[j]; x[j] = (temp << bit_shift) | carry; carry = (temp >> (MP_WORD_BITS - bit_shift)); } } } /* * Single Operand Right Shift */ void bigint_shr1(word x[], size_t x_size, size_t word_shift, size_t bit_shift) { if(x_size < word_shift) { clear_mem(x, x_size); return; } if(word_shift) { copy_mem(x, x + word_shift, x_size - word_shift); clear_mem(x + x_size - word_shift, word_shift); } if(bit_shift) { word carry = 0; size_t top = x_size - word_shift; while(top >= 4) { word w = x[top-1]; x[top-1] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); w = x[top-2]; x[top-2] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); w = x[top-3]; x[top-3] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); w = x[top-4]; x[top-4] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); top -= 4; } while(top) { word w = x[top-1]; x[top-1] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); top--; } } } /* * Two Operand Left Shift */ void bigint_shl2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift) { for(size_t j = 0; j != x_size; ++j) y[j + word_shift] = x[j]; if(bit_shift) { word carry = 0; for(size_t j = word_shift; j != x_size + word_shift + 1; ++j) { word w = y[j]; y[j] = (w << bit_shift) | carry; carry = (w >> (MP_WORD_BITS - bit_shift)); } } } /* * Two Operand Right Shift */ void bigint_shr2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift) { if(x_size < word_shift) return; for(size_t j = 0; j != x_size - word_shift; ++j) y[j] = x[j + word_shift]; if(bit_shift) { word carry = 0; for(size_t j = x_size - word_shift; j > 0; --j) { word w = y[j-1]; y[j-1] = (w >> bit_shift) | carry; carry = (w << (MP_WORD_BITS - bit_shift)); } } } /* * Compare two MP integers */ int32_t bigint_cmp(const word x[], size_t x_size, const word y[], size_t y_size) { if(x_size < y_size) { return (-bigint_cmp(y, y_size, x, x_size)); } while(x_size > y_size) { if(x[x_size-1]) return 1; x_size--; } for(size_t i = x_size; i > 0; --i) { if(x[i-1] > y[i-1]) return 1; if(x[i-1] < y[i-1]) return -1; } return 0; } /* * Do a 2-word/1-word Division */ word bigint_divop(word n1, word n0, word d) { if(d == 0) throw Invalid_Argument("bigint_divop divide by zero"); #if defined(BOTAN_HAS_MP_DWORD) return ((static_cast(n1) << MP_WORD_BITS) | n0) / d; #else word high = n1 % d, quotient = 0; for(size_t i = 0; i != MP_WORD_BITS; ++i) { word high_top_bit = (high & MP_WORD_TOP_BIT); high <<= 1; high |= (n0 >> (MP_WORD_BITS-1-i)) & 1; quotient <<= 1; if(high_top_bit || high >= d) { high -= d; quotient |= 1; } } return quotient; #endif } /* * Do a 2-word/1-word Modulo */ word bigint_modop(word n1, word n0, word d) { word z = bigint_divop(n1, n0, d); word dummy = 0; z = word_madd2(z, d, &dummy); return (n0-z); } } botan-2.4.0/src/lib/math/mp/mp_core.h000066400000000000000000000120251322470703100173160ustar00rootroot00000000000000/* * MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MP_CORE_OPS_H_ #define BOTAN_MP_CORE_OPS_H_ #include namespace Botan { class BigInt; /* * The size of the word type, in bits */ const size_t MP_WORD_BITS = BOTAN_MP_WORD_BITS; /* * If cond == 0, does nothing. * If cond > 0, swaps x[0:size] with y[0:size] * Runs in constant time */ BOTAN_TEST_API void bigint_cnd_swap(word cnd, word x[], word y[], size_t size); /* * If cond > 0 adds x[0:size] to y[0:size] and returns carry * Runs in constant time */ BOTAN_TEST_API word bigint_cnd_add(word cnd, word x[], const word y[], size_t size); /* * If cond > 0 subs x[0:size] to y[0:size] and returns borrow * Runs in constant time */ BOTAN_TEST_API word bigint_cnd_sub(word cnd, word x[], const word y[], size_t size); /* * 2s complement absolute value * If cond > 0 sets x to ~x + 1 * Runs in constant time */ BOTAN_TEST_API void bigint_cnd_abs(word cnd, word x[], size_t size); /** * Two operand addition * @param x the first operand (and output) * @param x_size size of x * @param y the second operand * @param y_size size of y (must be >= x_size) */ void bigint_add2(word x[], size_t x_size, const word y[], size_t y_size); /** * Three operand addition */ void bigint_add3(word z[], const word x[], size_t x_size, const word y[], size_t y_size); /** * Two operand addition with carry out */ word bigint_add2_nc(word x[], size_t x_size, const word y[], size_t y_size); /** * Three operand addition with carry out */ word bigint_add3_nc(word z[], const word x[], size_t x_size, const word y[], size_t y_size); /** * Two operand subtraction */ word bigint_sub2(word x[], size_t x_size, const word y[], size_t y_size); /** * Two operand subtraction, x = y - x; assumes y >= x */ void bigint_sub2_rev(word x[], const word y[], size_t y_size); /** * Three operand subtraction */ word bigint_sub3(word z[], const word x[], size_t x_size, const word y[], size_t y_size); /* * Shift Operations */ void bigint_shl1(word x[], size_t x_size, size_t word_shift, size_t bit_shift); void bigint_shr1(word x[], size_t x_size, size_t word_shift, size_t bit_shift); void bigint_shl2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift); void bigint_shr2(word y[], const word x[], size_t x_size, size_t word_shift, size_t bit_shift); /* * Linear Multiply */ void bigint_linmul2(word x[], size_t x_size, word y); void bigint_linmul3(word z[], const word x[], size_t x_size, word y); /** * Montgomery Reduction * @param z integer to reduce, of size exactly 2*(p_size+1). Output is in the first p_size+1 words, higher words are set to zero. * @param p modulus * @param p_size size of p * @param p_dash Montgomery value * @param workspace array of at least 2*(p_size+1) words */ void bigint_monty_redc(word z[], const word p[], size_t p_size, word p_dash, word workspace[]); /* * Montgomery Multiplication */ void bigint_monty_mul(BigInt& z, const BigInt& x, const BigInt& y, const word p[], size_t p_size, word p_dash, word workspace[]); /* * Montgomery Squaring */ void bigint_monty_sqr(BigInt& z, const BigInt& x, const word p[], size_t p_size, word p_dash, word workspace[]); /** * Compare x and y */ int32_t bigint_cmp(const word x[], size_t x_size, const word y[], size_t y_size); /** * Compute ((n1< #include #include #include namespace Botan { namespace { const size_t KARATSUBA_MULTIPLY_THRESHOLD = 32; const size_t KARATSUBA_SQUARE_THRESHOLD = 32; /* * Simple O(N^2) Multiplication */ void basecase_mul(word z[], const word x[], size_t x_size, const word y[], size_t y_size) { const size_t x_size_8 = x_size - (x_size % 8); clear_mem(z, x_size + y_size); for(size_t i = 0; i != y_size; ++i) { const word y_i = y[i]; word carry = 0; for(size_t j = 0; j != x_size_8; j += 8) carry = word8_madd3(z + i + j, x + j, y_i, carry); for(size_t j = x_size_8; j != x_size; ++j) z[i+j] = word_madd3(x[j], y_i, z[i+j], &carry); z[x_size+i] = carry; } } /* * Karatsuba Multiplication Operation */ void karatsuba_mul(word z[], const word x[], const word y[], size_t N, word workspace[]) { if(N < KARATSUBA_MULTIPLY_THRESHOLD || N % 2) { if(N == 6) return bigint_comba_mul6(z, x, y); else if(N == 8) return bigint_comba_mul8(z, x, y); else if(N == 16) return bigint_comba_mul16(z, x, y); else return basecase_mul(z, x, N, y, N); } const size_t N2 = N / 2; const word* x0 = x; const word* x1 = x + N2; const word* y0 = y; const word* y1 = y + N2; word* z0 = z; word* z1 = z + N; const int32_t cmp0 = bigint_cmp(x0, N2, x1, N2); const int32_t cmp1 = bigint_cmp(y1, N2, y0, N2); clear_mem(workspace, 2*N); /* * If either of cmp0 or cmp1 is zero then z0 or z1 resp is zero here, * resulting in a no-op - z0*z1 will be equal to zero so we don't need to do * anything, clear_mem above already set the correct result. * * However we ignore the result of the comparisons and always perform the * subtractions and recursively multiply to avoid the timing channel. */ //if(cmp0 && cmp1) { if(cmp0 > 0) bigint_sub3(z0, x0, N2, x1, N2); else bigint_sub3(z0, x1, N2, x0, N2); if(cmp1 > 0) bigint_sub3(z1, y1, N2, y0, N2); else bigint_sub3(z1, y0, N2, y1, N2); karatsuba_mul(workspace, z0, z1, N2, workspace+N); } karatsuba_mul(z0, x0, y0, N2, workspace+N); karatsuba_mul(z1, x1, y1, N2, workspace+N); const word ws_carry = bigint_add3_nc(workspace + N, z0, N, z1, N); word z_carry = bigint_add2_nc(z + N2, N, workspace + N, N); z_carry += bigint_add2_nc(z + N + N2, N2, &ws_carry, 1); bigint_add2_nc(z + N + N2, N2, &z_carry, 1); if((cmp0 == cmp1) || (cmp0 == 0) || (cmp1 == 0)) bigint_add2(z + N2, 2*N-N2, workspace, N); else bigint_sub2(z + N2, 2*N-N2, workspace, N); } /* * Karatsuba Squaring Operation */ void karatsuba_sqr(word z[], const word x[], size_t N, word workspace[]) { if(N < KARATSUBA_SQUARE_THRESHOLD || N % 2) { if(N == 6) return bigint_comba_sqr6(z, x); else if(N == 8) return bigint_comba_sqr8(z, x); else if(N == 16) return bigint_comba_sqr16(z, x); else return basecase_mul(z, x, N, x, N); } const size_t N2 = N / 2; const word* x0 = x; const word* x1 = x + N2; word* z0 = z; word* z1 = z + N; const int32_t cmp = bigint_cmp(x0, N2, x1, N2); clear_mem(workspace, 2*N); // See comment in karatsuba_mul //if(cmp) { if(cmp > 0) bigint_sub3(z0, x0, N2, x1, N2); else bigint_sub3(z0, x1, N2, x0, N2); karatsuba_sqr(workspace, z0, N2, workspace+N); } karatsuba_sqr(z0, x0, N2, workspace+N); karatsuba_sqr(z1, x1, N2, workspace+N); const word ws_carry = bigint_add3_nc(workspace + N, z0, N, z1, N); word z_carry = bigint_add2_nc(z + N2, N, workspace + N, N); z_carry += bigint_add2_nc(z + N + N2, N2, &ws_carry, 1); bigint_add2_nc(z + N + N2, N2, &z_carry, 1); /* * This is only actually required if cmp is != 0, however * if cmp==0 then workspace[0:N] == 0 and avoiding the jump * hides a timing channel. */ bigint_sub2(z + N2, 2*N-N2, workspace, N); } /* * Pick a good size for the Karatsuba multiply */ size_t karatsuba_size(size_t z_size, size_t x_size, size_t x_sw, size_t y_size, size_t y_sw) { if(x_sw > x_size || x_sw > y_size || y_sw > x_size || y_sw > y_size) return 0; if(((x_size == x_sw) && (x_size % 2)) || ((y_size == y_sw) && (y_size % 2))) return 0; const size_t start = (x_sw > y_sw) ? x_sw : y_sw; const size_t end = (x_size < y_size) ? x_size : y_size; if(start == end) { if(start % 2) return 0; return start; } for(size_t j = start; j <= end; ++j) { if(j % 2) continue; if(2*j > z_size) return 0; if(x_sw <= j && j <= x_size && y_sw <= j && j <= y_size) { if(j % 4 == 2 && (j+2) <= x_size && (j+2) <= y_size && 2*(j+2) <= z_size) return j+2; return j; } } return 0; } /* * Pick a good size for the Karatsuba squaring */ size_t karatsuba_size(size_t z_size, size_t x_size, size_t x_sw) { if(x_sw == x_size) { if(x_sw % 2) return 0; return x_sw; } for(size_t j = x_sw; j <= x_size; ++j) { if(j % 2) continue; if(2*j > z_size) return 0; if(j % 4 == 2 && (j+2) <= x_size && 2*(j+2) <= z_size) return j+2; return j; } return 0; } } /* * Multiplication Algorithm Dispatcher */ void bigint_mul(BigInt& z, const BigInt& x, const BigInt& y, word workspace[]) { return bigint_mul(z.mutable_data(), z.size(), x.data(), x.size(), x.sig_words(), y.data(), y.size(), y.sig_words(), workspace); } void bigint_mul(word z[], size_t z_size, const word x[], size_t x_size, size_t x_sw, const word y[], size_t y_size, size_t y_sw, word workspace[]) { clear_mem(z, z_size); if(x_sw == 1) { bigint_linmul3(z, y, y_sw, x[0]); } else if(y_sw == 1) { bigint_linmul3(z, x, x_sw, y[0]); } else if(x_sw <= 4 && x_size >= 4 && y_sw <= 4 && y_size >= 4 && z_size >= 8) { bigint_comba_mul4(z, x, y); } else if(x_sw <= 6 && x_size >= 6 && y_sw <= 6 && y_size >= 6 && z_size >= 12) { bigint_comba_mul6(z, x, y); } else if(x_sw <= 8 && x_size >= 8 && y_sw <= 8 && y_size >= 8 && z_size >= 16) { bigint_comba_mul8(z, x, y); } else if(x_sw <= 9 && x_size >= 9 && y_sw <= 9 && y_size >= 9 && z_size >= 18) { bigint_comba_mul9(z, x, y); } else if(x_sw <= 16 && x_size >= 16 && y_sw <= 16 && y_size >= 16 && z_size >= 32) { bigint_comba_mul16(z, x, y); } else if(x_sw < KARATSUBA_MULTIPLY_THRESHOLD || y_sw < KARATSUBA_MULTIPLY_THRESHOLD || !workspace) { basecase_mul(z, x, x_sw, y, y_sw); } else { const size_t N = karatsuba_size(z_size, x_size, x_sw, y_size, y_sw); if(N) karatsuba_mul(z, x, y, N, workspace); else basecase_mul(z, x, x_sw, y, y_sw); } } /* * Squaring Algorithm Dispatcher */ void bigint_sqr(word z[], size_t z_size, word workspace[], const word x[], size_t x_size, size_t x_sw) { BOTAN_ASSERT(z_size/2 >= x_sw, "Output size is sufficient"); if(x_sw == 1) { bigint_linmul3(z, x, x_sw, x[0]); } else if(x_sw <= 4 && x_size >= 4 && z_size >= 8) { bigint_comba_sqr4(z, x); } else if(x_sw <= 6 && x_size >= 6 && z_size >= 12) { bigint_comba_sqr6(z, x); } else if(x_sw <= 8 && x_size >= 8 && z_size >= 16) { bigint_comba_sqr8(z, x); } else if(x_sw == 9 && x_size >= 9 && z_size >= 18) { bigint_comba_sqr9(z, x); } else if(x_sw <= 16 && x_size >= 16 && z_size >= 32) { bigint_comba_sqr16(z, x); } else if(x_size < KARATSUBA_SQUARE_THRESHOLD || !workspace) { basecase_mul(z, x, x_sw, x, x_sw); } else { const size_t N = karatsuba_size(z_size, x_size, x_sw); if(N) karatsuba_sqr(z, x, N, workspace); else basecase_mul(z, x, x_sw, x, x_sw); } } } botan-2.4.0/src/lib/math/mp/mp_madd.h000066400000000000000000000067161322470703100173050ustar00rootroot00000000000000/* * Lowest Level MPI Algorithms * (C) 1999-2008,2013 Jack Lloyd * 2006 Luca Piccarreta * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MP_WORD_MULADD_H_ #define BOTAN_MP_WORD_MULADD_H_ #include #include namespace Botan { #if (BOTAN_MP_WORD_BITS == 8) typedef uint16_t dword; #define BOTAN_HAS_MP_DWORD #elif (BOTAN_MP_WORD_BITS == 16) typedef uint32_t dword; #define BOTAN_HAS_MP_DWORD #elif (BOTAN_MP_WORD_BITS == 32) typedef uint64_t dword; #define BOTAN_HAS_MP_DWORD #elif (BOTAN_MP_WORD_BITS == 64) #if defined(BOTAN_TARGET_HAS_NATIVE_UINT128) typedef uint128_t dword; #define BOTAN_HAS_MP_DWORD #else // No native 128 bit integer type; use mul64x64_128 instead #endif #else #error BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64 #endif #if defined(BOTAN_TARGET_ARCH_IS_X86_32) && (BOTAN_MP_WORD_BITS == 32) #if defined(BOTAN_USE_GCC_INLINE_ASM) #define BOTAN_MP_USE_X86_32_ASM #define ASM(x) x "\n\t" #elif defined(BOTAN_BUILD_COMPILER_IS_MSVC) #define BOTAN_MP_USE_X86_32_MSVC_ASM #endif #elif defined(BOTAN_TARGET_ARCH_IS_X86_64) && (BOTAN_MP_WORD_BITS == 64) && (BOTAN_USE_GCC_INLINE_ASM) #define BOTAN_MP_USE_X86_64_ASM #define ASM(x) x "\n\t" #endif #if defined(BOTAN_MP_USE_X86_32_ASM) || defined(BOTAN_MP_USE_X86_64_ASM) #define ASM(x) x "\n\t" #endif /* * Word Multiply/Add */ inline word word_madd2(word a, word b, word* c) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ASM("mull %[b]") ASM("addl %[c],%[a]") ASM("adcl $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c) : "0"(a), "1"(b), [c]"g"(*c) : "cc"); return a; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ASM("mulq %[b]") ASM("addq %[c],%[a]") ASM("adcq $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c) : "0"(a), "1"(b), [c]"g"(*c) : "cc"); return a; #elif defined(BOTAN_HAS_MP_DWORD) const dword s = static_cast(a) * b + *c; *c = static_cast(s >> BOTAN_MP_WORD_BITS); return static_cast(s); #else static_assert(BOTAN_MP_WORD_BITS == 64, "Unexpected word size"); word hi = 0, lo = 0; mul64x64_128(a, b, &lo, &hi); lo += *c; hi += (lo < *c); // carry? *c = hi; return lo; #endif } /* * Word Multiply/Add */ inline word word_madd3(word a, word b, word c, word* d) { #if defined(BOTAN_MP_USE_X86_32_ASM) asm( ASM("mull %[b]") ASM("addl %[c],%[a]") ASM("adcl $0,%[carry]") ASM("addl %[d],%[a]") ASM("adcl $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d) : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc"); return a; #elif defined(BOTAN_MP_USE_X86_64_ASM) asm( ASM("mulq %[b]") ASM("addq %[c],%[a]") ASM("adcq $0,%[carry]") ASM("addq %[d],%[a]") ASM("adcq $0,%[carry]") : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*d) : "0"(a), "1"(b), [c]"g"(c), [d]"g"(*d) : "cc"); return a; #elif defined(BOTAN_HAS_MP_DWORD) const dword s = static_cast(a) * b + c + *d; *d = static_cast(s >> BOTAN_MP_WORD_BITS); return static_cast(s); #else static_assert(BOTAN_MP_WORD_BITS == 64, "Unexpected word size"); word hi = 0, lo = 0; mul64x64_128(a, b, &lo, &hi); lo += c; hi += (lo < c); // carry? lo += *d; hi += (lo < *d); // carry? *d = hi; return lo; #endif } #if defined(ASM) #undef ASM #endif } #endif botan-2.4.0/src/lib/math/mp/mp_monty.cpp000066400000000000000000000061471322470703100200770ustar00rootroot00000000000000/* * Montgomery Reduction * (C) 1999-2011 Jack Lloyd * 2006 Luca Piccarreta * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { /* * Montgomery Reduction Algorithm */ void bigint_monty_redc(word z[], const word p[], size_t p_size, word p_dash, word ws[]) { const size_t z_size = 2*(p_size+1); CT::poison(z, z_size); CT::poison(p, p_size); CT::poison(ws, 2*(p_size+1)); const size_t blocks_of_8 = p_size - (p_size % 8); for(size_t i = 0; i != p_size; ++i) { word* z_i = z + i; const word y = z_i[0] * p_dash; /* bigint_linmul3(ws, p, p_size, y); bigint_add2(z_i, z_size - i, ws, p_size+1); */ word carry = 0; for(size_t j = 0; j != blocks_of_8; j += 8) carry = word8_madd3(z_i + j, p + j, y, carry); for(size_t j = blocks_of_8; j != p_size; ++j) z_i[j] = word_madd3(p[j], y, z_i[j], &carry); word z_sum = z_i[p_size] + carry; carry = (z_sum < z_i[p_size]); z_i[p_size] = z_sum; for(size_t j = p_size + 1; j < z_size - i; ++j) { z_i[j] += carry; carry = carry & !z_i[j]; } } /* * The result might need to be reduced mod p. To avoid a timing * channel, always perform the subtraction. If in the compution * of x - p a borrow is required then x was already < p. * * x - p starts at ws[0] and is p_size+1 bytes long * x starts at ws[p_size+1] and is also p_size+1 bytes log * (that's the copy_mem) * * Select which address to copy from indexing off of the final * borrow. */ word borrow = 0; for(size_t i = 0; i != p_size; ++i) ws[i] = word_sub(z[p_size + i], p[i], &borrow); ws[p_size] = word_sub(z[p_size+p_size], 0, &borrow); copy_mem(ws + p_size + 1, z + p_size, p_size + 1); CT::conditional_copy_mem(borrow, z, ws + (p_size + 1), ws, (p_size + 1)); clear_mem(z + p_size + 1, z_size - p_size - 1); CT::unpoison(z, z_size); CT::unpoison(p, p_size); CT::unpoison(ws, 2*(p_size+1)); // This check comes after we've used it but that's ok here CT::unpoison(&borrow, 1); BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow"); } void bigint_monty_mul(BigInt& z, const BigInt& x, const BigInt& y, const word p[], size_t p_size, word p_dash, word ws[]) { bigint_mul(z, x, y, &ws[0]); bigint_monty_redc(z.mutable_data(), p, p_size, p_dash, ws); } void bigint_monty_sqr(BigInt& z, const BigInt& x, const word p[], size_t p_size, word p_dash, word ws[]) { bigint_sqr(z.mutable_data(), z.size(), &ws[0], x.data(), x.size(), x.sig_words()); bigint_monty_redc(z.mutable_data(), p, p_size, p_dash, ws); } } botan-2.4.0/src/lib/math/mp/mp_types.h000066400000000000000000000012721322470703100175340ustar00rootroot00000000000000/* * Low Level MPI Types * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MPI_TYPES_H_ #define BOTAN_MPI_TYPES_H_ #include namespace Botan { #if (BOTAN_MP_WORD_BITS == 8) typedef uint8_t word; #elif (BOTAN_MP_WORD_BITS == 16) typedef uint16_t word; #elif (BOTAN_MP_WORD_BITS == 32) typedef uint32_t word; #elif (BOTAN_MP_WORD_BITS == 64) typedef uint64_t word; #else #error BOTAN_MP_WORD_BITS must be 8, 16, 32, or 64 #endif const word MP_WORD_MASK = ~static_cast(0); const word MP_WORD_TOP_BIT = static_cast(1) << (8*sizeof(word) - 1); const word MP_WORD_MAX = MP_WORD_MASK; } #endif botan-2.4.0/src/lib/math/numbertheory/000077500000000000000000000000001322470703100176305ustar00rootroot00000000000000botan-2.4.0/src/lib/math/numbertheory/def_powm.h000066400000000000000000000030641322470703100216040ustar00rootroot00000000000000/* * Modular Exponentiation * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DEFAULT_MODEXP_H_ #define BOTAN_DEFAULT_MODEXP_H_ #include #include #include namespace Botan { /** * Fixed Window Exponentiator */ class Fixed_Window_Exponentiator final : public Modular_Exponentiator { public: void set_exponent(const BigInt&) override; void set_base(const BigInt&) override; BigInt execute() const override; Modular_Exponentiator* copy() const override { return new Fixed_Window_Exponentiator(*this); } Fixed_Window_Exponentiator(const BigInt&, Power_Mod::Usage_Hints); private: Modular_Reducer m_reducer; BigInt m_exp; size_t m_window_bits; std::vector m_g; Power_Mod::Usage_Hints m_hints; }; /** * Montgomery Exponentiator */ class Montgomery_Exponentiator final : public Modular_Exponentiator { public: void set_exponent(const BigInt&) override; void set_base(const BigInt&) override; BigInt execute() const override; Modular_Exponentiator* copy() const override { return new Montgomery_Exponentiator(*this); } Montgomery_Exponentiator(const BigInt&, Power_Mod::Usage_Hints); private: BigInt m_exp, m_modulus, m_R_mod, m_R2_mod; Modular_Reducer m_reducer; word m_mod_prime; size_t m_mod_words, m_exp_bits, m_window_bits; Power_Mod::Usage_Hints m_hints; std::vector m_g; }; } #endif botan-2.4.0/src/lib/math/numbertheory/dsa_gen.cpp000066400000000000000000000062301322470703100217350ustar00rootroot00000000000000/* * DSA Parameter Generation * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * Check if this size is allowed by FIPS 186-3 */ bool fips186_3_valid_size(size_t pbits, size_t qbits) { if(qbits == 160) return (pbits == 1024); if(qbits == 224) return (pbits == 2048); if(qbits == 256) return (pbits == 2048 || pbits == 3072); return false; } } /* * Attempt DSA prime generation with given seed */ bool generate_dsa_primes(RandomNumberGenerator& rng, BigInt& p, BigInt& q, size_t pbits, size_t qbits, const std::vector& seed_c, size_t offset) { if(!fips186_3_valid_size(pbits, qbits)) throw Invalid_Argument( "FIPS 186-3 does not allow DSA domain parameters of " + std::to_string(pbits) + "/" + std::to_string(qbits) + " bits long"); if(seed_c.size() * 8 < qbits) throw Invalid_Argument( "Generating a DSA parameter set with a " + std::to_string(qbits) + "long q requires a seed at least as many bits long"); const std::string hash_name = "SHA-" + std::to_string(qbits); std::unique_ptr hash(HashFunction::create_or_throw(hash_name)); const size_t HASH_SIZE = hash->output_length(); class Seed final { public: explicit Seed(const std::vector& s) : m_seed(s) {} const std::vector& value() const { return m_seed; } Seed& operator++() { for(size_t j = m_seed.size(); j > 0; --j) if(++m_seed[j-1]) break; return (*this); } private: std::vector m_seed; }; Seed seed(seed_c); q.binary_decode(hash->process(seed.value())); q.set_bit(qbits-1); q.set_bit(0); if(!is_prime(q, rng, 126)) return false; const size_t n = (pbits-1) / (HASH_SIZE * 8), b = (pbits-1) % (HASH_SIZE * 8); BigInt X; std::vector V(HASH_SIZE * (n+1)); for(size_t j = 0; j != 4*pbits; ++j) { for(size_t k = 0; k <= n; ++k) { ++seed; hash->update(seed.value()); hash->final(&V[HASH_SIZE * (n-k)]); } if(j >= offset) { X.binary_decode(&V[HASH_SIZE - 1 - b/8], V.size() - (HASH_SIZE - 1 - b/8)); X.set_bit(pbits-1); p = X - (X % (2*q) - 1); if(p.bits() == pbits && is_prime(p, rng, 126)) return true; } } return false; } /* * Generate DSA Primes */ std::vector generate_dsa_primes(RandomNumberGenerator& rng, BigInt& p, BigInt& q, size_t pbits, size_t qbits) { while(true) { std::vector seed(qbits / 8); rng.randomize(seed.data(), seed.size()); if(generate_dsa_primes(rng, p, q, pbits, qbits, seed)) return seed; } } } botan-2.4.0/src/lib/math/numbertheory/info.txt000066400000000000000000000003251322470703100213240ustar00rootroot00000000000000 NUMBERTHEORY -> 20131128 load_on auto numthry.h pow_mod.h reducer.h def_powm.h bigint hash rng botan-2.4.0/src/lib/math/numbertheory/jacobi.cpp000066400000000000000000000017461322470703100215730ustar00rootroot00000000000000/* * Jacobi Function * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* * Calculate the Jacobi symbol */ int32_t jacobi(const BigInt& a, const BigInt& n) { if(a.is_negative()) throw Invalid_Argument("jacobi: first argument must be non-negative"); if(n.is_even() || n < 2) throw Invalid_Argument("jacobi: second argument must be odd and > 1"); BigInt x = a, y = n; int32_t J = 1; while(y > 1) { x %= y; if(x > y / 2) { x = y - x; if(y % 4 == 3) J = -J; } if(x.is_zero()) return 0; size_t shifts = low_zero_bits(x); x >>= shifts; if(shifts % 2) { word y_mod_8 = y % 8; if(y_mod_8 == 3 || y_mod_8 == 5) J = -J; } if(x % 4 == 3 && y % 4 == 3) J = -J; std::swap(x, y); } return J; } } botan-2.4.0/src/lib/math/numbertheory/make_prm.cpp000066400000000000000000000054761322470703100221430ustar00rootroot00000000000000/* * Prime Generation * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Generate a random prime */ BigInt random_prime(RandomNumberGenerator& rng, size_t bits, const BigInt& coprime, size_t equiv, size_t modulo) { if(coprime <= 0) { throw Invalid_Argument("random_prime: coprime must be > 0"); } if(modulo % 2 == 1 || modulo == 0) { throw Invalid_Argument("random_prime: Invalid modulo value"); } if(equiv >= modulo || equiv % 2 == 0) { throw Invalid_Argument("random_prime: equiv must be < modulo, and odd"); } // Handle small values: if(bits <= 1) { throw Invalid_Argument("random_prime: Can't make a prime of " + std::to_string(bits) + " bits"); } else if(bits == 2) { return ((rng.next_byte() % 2) ? 2 : 3); } else if(bits == 3) { return ((rng.next_byte() % 2) ? 5 : 7); } else if(bits == 4) { return ((rng.next_byte() % 2) ? 11 : 13); } while(true) { BigInt p(rng, bits); // Force lowest and two top bits on p.set_bit(bits - 1); p.set_bit(bits - 2); p.set_bit(0); if(p % modulo != equiv) p += (modulo - p % modulo) + equiv; const size_t sieve_size = std::min(bits / 2, PRIME_TABLE_SIZE); secure_vector sieve(sieve_size); for(size_t j = 0; j != sieve.size(); ++j) sieve[j] = static_cast(p % PRIMES[j]); size_t counter = 0; while(true) { ++counter; if(counter >= 4096) { break; // don't try forever, choose a new starting point } p += modulo; if(p.bits() > bits) break; bool passes_sieve = true; for(size_t j = 0; j != sieve.size(); ++j) { sieve[j] = (sieve[j] + modulo) % PRIMES[j]; if(sieve[j] == 0) { passes_sieve = false; break; } } if(!passes_sieve) continue; if(gcd(p - 1, coprime) != 1) continue; if(is_prime(p, rng, 128, true)) { return p; } } } } /* * Generate a random safe prime */ BigInt random_safe_prime(RandomNumberGenerator& rng, size_t bits) { if(bits <= 64) throw Invalid_Argument("random_safe_prime: Can't make a prime of " + std::to_string(bits) + " bits"); BigInt p; do p = (random_prime(rng, bits - 1) << 1) + 1; while(!is_prime(p, rng, 128, true)); return p; } } botan-2.4.0/src/lib/math/numbertheory/mp_numth.cpp000066400000000000000000000034171322470703100221700ustar00rootroot00000000000000/* * Fused and Important MP Algorithms * (C) 1999-2007 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Square a BigInt */ BigInt square(const BigInt& x) { const size_t x_sw = x.sig_words(); BigInt z(BigInt::Positive, round_up(2*x_sw, 16)); secure_vector workspace(z.size()); bigint_sqr(z.mutable_data(), z.size(), workspace.data(), x.data(), x.size(), x_sw); return z; } /* * Multiply-Add Operation */ BigInt mul_add(const BigInt& a, const BigInt& b, const BigInt& c) { if(c.is_negative()) throw Invalid_Argument("mul_add: Third argument must be > 0"); BigInt::Sign sign = BigInt::Positive; if(a.sign() != b.sign()) sign = BigInt::Negative; BigInt r(sign, std::max(a.size() + b.size(), c.sig_words()) + 1); secure_vector workspace(r.size()); bigint_mul(r, a, b, workspace.data()); const size_t r_size = std::max(r.sig_words(), c.sig_words()); bigint_add2(r.mutable_data(), r_size, c.data(), c.sig_words()); return r; } /* * Subtract-Multiply Operation */ BigInt sub_mul(const BigInt& a, const BigInt& b, const BigInt& c) { if(a.is_negative() || b.is_negative()) throw Invalid_Argument("sub_mul: First two arguments must be >= 0"); BigInt r = a; r -= b; r *= c; return r; } /* * Multiply-Subtract Operation */ BigInt mul_sub(const BigInt& a, const BigInt& b, const BigInt& c) { if(c.is_negative() || c.is_zero()) throw Invalid_Argument("mul_sub: Third argument must be > 0"); BigInt r = a; r *= b; r -= c; return r; } } botan-2.4.0/src/lib/math/numbertheory/numthry.cpp000066400000000000000000000257131322470703100220520ustar00rootroot00000000000000/* * Number Theory Functions * (C) 1999-2011,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { /* * Return the number of 0 bits at the end of n */ size_t low_zero_bits(const BigInt& n) { size_t low_zero = 0; if(n.is_positive() && n.is_nonzero()) { for(size_t i = 0; i != n.size(); ++i) { const word x = n.word_at(i); if(x) { low_zero += ctz(x); break; } else low_zero += BOTAN_MP_WORD_BITS; } } return low_zero; } /* * Calculate the GCD */ BigInt gcd(const BigInt& a, const BigInt& b) { if(a.is_zero() || b.is_zero()) return 0; if(a == 1 || b == 1) return 1; BigInt x = a, y = b; x.set_sign(BigInt::Positive); y.set_sign(BigInt::Positive); size_t shift = std::min(low_zero_bits(x), low_zero_bits(y)); x >>= shift; y >>= shift; while(x.is_nonzero()) { x >>= low_zero_bits(x); y >>= low_zero_bits(y); if(x >= y) { x -= y; x >>= 1; } else { y -= x; y >>= 1; } } return (y << shift); } /* * Calculate the LCM */ BigInt lcm(const BigInt& a, const BigInt& b) { return ((a * b) / gcd(a, b)); } /* Sets result to a^-1 * 2^k mod a with n <= k <= 2n Returns k "The Montgomery Modular Inverse - Revisited" Çetin Koç, E. Savas https://citeseerx.ist.psu.edu/viewdoc/citations?doi=10.1.1.75.8377 A const time implementation of this algorithm is described in "Constant Time Modular Inversion" Joppe W. Bos http://www.joppebos.com/files/CTInversion.pdf */ size_t almost_montgomery_inverse(BigInt& result, const BigInt& a, const BigInt& p) { size_t k = 0; BigInt u = p, v = a, r = 0, s = 1; while(v > 0) { if(u.is_even()) { u >>= 1; s <<= 1; } else if(v.is_even()) { v >>= 1; r <<= 1; } else if(u > v) { u -= v; u >>= 1; r += s; s <<= 1; } else { v -= u; v >>= 1; s += r; r <<= 1; } ++k; } if(r >= p) { r = r - p; } result = p - r; return k; } BigInt normalized_montgomery_inverse(const BigInt& a, const BigInt& p) { BigInt r; size_t k = almost_montgomery_inverse(r, a, p); for(size_t i = 0; i != k; ++i) { if(r.is_odd()) r += p; r >>= 1; } return r; } BigInt ct_inverse_mod_odd_modulus(const BigInt& n, const BigInt& mod) { if(n.is_negative() || mod.is_negative()) throw Invalid_Argument("ct_inverse_mod_odd_modulus: arguments must be non-negative"); if(mod < 3 || mod.is_even()) throw Invalid_Argument("Bad modulus to ct_inverse_mod_odd_modulus"); /* This uses a modular inversion algorithm designed by Niels Möller and implemented in Nettle. The same algorithm was later also adapted to GMP in mpn_sec_invert. It can be easily implemented in a way that does not depend on secret branches or memory lookups, providing resistance against some forms of side channel attack. There is also a description of the algorithm in Appendix 5 of "Fast Software Polynomial Multiplication on ARM Processors using the NEON Engine" by Danilo Câmara, Conrado P. L. Gouvêa, Julio López, and Ricardo Dahab in LNCS 8182 https://conradoplg.cryptoland.net/files/2010/12/mocrysen13.pdf Thanks to Niels for creating the algorithm, explaining some things about it, and the reference to the paper. */ // todo allow this to be pre-calculated and passed in as arg BigInt mp1o2 = (mod + 1) >> 1; const size_t mod_words = mod.sig_words(); BOTAN_ASSERT(mod_words > 0, "Not empty"); BigInt a = n; BigInt b = mod; BigInt u = 1, v = 0; a.grow_to(mod_words); u.grow_to(mod_words); v.grow_to(mod_words); mp1o2.grow_to(mod_words); secure_vector& a_w = a.get_word_vector(); secure_vector& b_w = b.get_word_vector(); secure_vector& u_w = u.get_word_vector(); secure_vector& v_w = v.get_word_vector(); CT::poison(a_w.data(), a_w.size()); CT::poison(b_w.data(), b_w.size()); CT::poison(u_w.data(), u_w.size()); CT::poison(v_w.data(), v_w.size()); // Only n.bits() + mod.bits() iterations are required, but avoid leaking the size of n size_t bits = 2 * mod.bits(); while(bits--) { /* const word odd = a.is_odd(); a -= odd * b; const word underflow = a.is_negative(); b += a * underflow; a.set_sign(BigInt::Positive); a >>= 1; if(underflow) { std::swap(u, v); } u -= odd * v; u += u.is_negative() * mod; const word odd_u = u.is_odd(); u >>= 1; u += mp1o2 * odd_u; */ const word odd_a = a_w[0] & 1; //if(odd_a) a -= b word underflow = bigint_cnd_sub(odd_a, a_w.data(), b_w.data(), mod_words); //if(underflow) { b -= a; a = abs(a); swap(u, v); } bigint_cnd_add(underflow, b_w.data(), a_w.data(), mod_words); bigint_cnd_abs(underflow, a_w.data(), mod_words); bigint_cnd_swap(underflow, u_w.data(), v_w.data(), mod_words); // a >>= 1 bigint_shr1(a_w.data(), mod_words, 0, 1); //if(odd_a) u -= v; word borrow = bigint_cnd_sub(odd_a, u_w.data(), v_w.data(), mod_words); // if(borrow) u += p bigint_cnd_add(borrow, u_w.data(), mod.data(), mod_words); const word odd_u = u_w[0] & 1; // u >>= 1 bigint_shr1(u_w.data(), mod_words, 0, 1); //if(odd_u) u += mp1o2; bigint_cnd_add(odd_u, u_w.data(), mp1o2.data(), mod_words); } CT::unpoison(a_w.data(), a_w.size()); CT::unpoison(b_w.data(), b_w.size()); CT::unpoison(u_w.data(), u_w.size()); CT::unpoison(v_w.data(), v_w.size()); BOTAN_ASSERT(a.is_zero(), "A is zero"); if(b != 1) return 0; return v; } /* * Find the Modular Inverse */ BigInt inverse_mod(const BigInt& n, const BigInt& mod) { if(mod.is_zero()) throw BigInt::DivideByZero(); if(mod.is_negative() || n.is_negative()) throw Invalid_Argument("inverse_mod: arguments must be non-negative"); if(n.is_zero() || (n.is_even() && mod.is_even())) return 0; // fast fail checks if(mod.is_odd()) return ct_inverse_mod_odd_modulus(n, mod); BigInt u = mod, v = n; BigInt A = 1, B = 0, C = 0, D = 1; while(u.is_nonzero()) { const size_t u_zero_bits = low_zero_bits(u); u >>= u_zero_bits; for(size_t i = 0; i != u_zero_bits; ++i) { if(A.is_odd() || B.is_odd()) { A += n; B -= mod; } A >>= 1; B >>= 1; } const size_t v_zero_bits = low_zero_bits(v); v >>= v_zero_bits; for(size_t i = 0; i != v_zero_bits; ++i) { if(C.is_odd() || D.is_odd()) { C += n; D -= mod; } C >>= 1; D >>= 1; } if(u >= v) { u -= v; A -= C; B -= D; } else { v -= u; C -= A; D -= B; } } if(v != 1) return 0; // no modular inverse while(D.is_negative()) D += mod; while(D >= mod) D -= mod; return D; } word monty_inverse(word input) { if(input == 0) throw Exception("monty_inverse: divide by zero"); word b = input; word x2 = 1, x1 = 0, y2 = 0, y1 = 1; // First iteration, a = n+1 word q = bigint_divop(1, 0, b); word r = (MP_WORD_MAX - q*b) + 1; word x = x2 - q*x1; word y = y2 - q*y1; word a = b; b = r; x2 = x1; x1 = x; y2 = y1; y1 = y; while(b > 0) { q = a / b; r = a - q*b; x = x2 - q*x1; y = y2 - q*y1; a = b; b = r; x2 = x1; x1 = x; y2 = y1; y1 = y; } const word check = y2 * input; BOTAN_ASSERT_EQUAL(check, 1, "monty_inverse result is inverse of input"); // Now invert in addition space y2 = (MP_WORD_MAX - y2) + 1; return y2; } /* * Modular Exponentiation */ BigInt power_mod(const BigInt& base, const BigInt& exp, const BigInt& mod) { Power_Mod pow_mod(mod); /* * Calling set_base before set_exponent means we end up using a * minimal window. This makes sense given that here we know that any * precomputation is wasted. */ if(base.is_negative()) { pow_mod.set_base(-base); pow_mod.set_exponent(exp); if(exp.is_even()) return pow_mod.execute(); else return (mod - pow_mod.execute()); } else { pow_mod.set_base(base); pow_mod.set_exponent(exp); return pow_mod.execute(); } } namespace { bool mr_witness(BigInt&& y, const Modular_Reducer& reducer_n, const BigInt& n_minus_1, size_t s) { if(y == 1 || y == n_minus_1) return false; for(size_t i = 1; i != s; ++i) { y = reducer_n.square(y); if(y == 1) // found a non-trivial square root return true; if(y == n_minus_1) // -1, trivial square root, so give up return false; } return true; // fails Fermat test } size_t mr_test_iterations(size_t n_bits, size_t prob, bool random) { const size_t base = (prob + 2) / 2; // worst case 4^-t error rate /* * For randomly chosen numbers we can use the estimates from * http://www.math.dartmouth.edu/~carlp/PDF/paper88.pdf * * These values are derived from the inequality for p(k,t) given on * the second page. */ if(random && prob <= 80) { if(n_bits >= 1536) return 2; // < 2^-89 if(n_bits >= 1024) return 4; // < 2^-89 if(n_bits >= 512) return 5; // < 2^-80 if(n_bits >= 256) return 11; // < 2^-80 } return base; } } /* * Test for primaility using Miller-Rabin */ bool is_prime(const BigInt& n, RandomNumberGenerator& rng, size_t prob, bool is_random) { if(n == 2) return true; if(n <= 1 || n.is_even()) return false; // Fast path testing for small numbers (<= 65521) if(n <= PRIMES[PRIME_TABLE_SIZE-1]) { const uint16_t num = static_cast(n.word_at(0)); return std::binary_search(PRIMES, PRIMES + PRIME_TABLE_SIZE, num); } const size_t test_iterations = mr_test_iterations(n.bits(), prob, is_random); const BigInt n_minus_1 = n - 1; const size_t s = low_zero_bits(n_minus_1); Fixed_Exponent_Power_Mod pow_mod(n_minus_1 >> s, n); Modular_Reducer reducer(n); for(size_t i = 0; i != test_iterations; ++i) { const BigInt a = BigInt::random_integer(rng, 2, n_minus_1); BigInt y = pow_mod(a); if(mr_witness(std::move(y), reducer, n_minus_1, s)) return false; } return true; } } botan-2.4.0/src/lib/math/numbertheory/numthry.h000066400000000000000000000162331322470703100215140ustar00rootroot00000000000000/* * Number Theory Functions * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_NUMBER_THEORY_H_ #define BOTAN_NUMBER_THEORY_H_ #include namespace Botan { class RandomNumberGenerator; /** * Fused multiply-add * @param a an integer * @param b an integer * @param c an integer * @return (a*b)+c */ BigInt BOTAN_PUBLIC_API(2,0) mul_add(const BigInt& a, const BigInt& b, const BigInt& c); /** * Fused subtract-multiply * @param a an integer * @param b an integer * @param c an integer * @return (a-b)*c */ BigInt BOTAN_PUBLIC_API(2,0) sub_mul(const BigInt& a, const BigInt& b, const BigInt& c); /** * Fused multiply-subtract * @param a an integer * @param b an integer * @param c an integer * @return (a*b)-c */ BigInt BOTAN_PUBLIC_API(2,0) mul_sub(const BigInt& a, const BigInt& b, const BigInt& c); /** * Return the absolute value * @param n an integer * @return absolute value of n */ inline BigInt abs(const BigInt& n) { return n.abs(); } /** * Compute the greatest common divisor * @param x a positive integer * @param y a positive integer * @return gcd(x,y) */ BigInt BOTAN_PUBLIC_API(2,0) gcd(const BigInt& x, const BigInt& y); /** * Least common multiple * @param x a positive integer * @param y a positive integer * @return z, smallest integer such that z % x == 0 and z % y == 0 */ BigInt BOTAN_PUBLIC_API(2,0) lcm(const BigInt& x, const BigInt& y); /** * @param x an integer * @return (x*x) */ BigInt BOTAN_PUBLIC_API(2,0) square(const BigInt& x); /** * Modular inversion * @param x a positive integer * @param modulus a positive integer * @return y st (x*y) % modulus == 1 or 0 if no such value * Not const time */ BigInt BOTAN_PUBLIC_API(2,0) inverse_mod(const BigInt& x, const BigInt& modulus); /** * Const time modular inversion * Requires the modulus be odd */ BigInt BOTAN_PUBLIC_API(2,0) ct_inverse_mod_odd_modulus(const BigInt& n, const BigInt& mod); /** * Return a^-1 * 2^k mod b * Returns k, between n and 2n * Not const time */ size_t BOTAN_PUBLIC_API(2,0) almost_montgomery_inverse(BigInt& result, const BigInt& a, const BigInt& b); /** * Call almost_montgomery_inverse and correct the result to a^-1 mod b */ BigInt BOTAN_PUBLIC_API(2,0) normalized_montgomery_inverse(const BigInt& a, const BigInt& b); /** * Compute the Jacobi symbol. If n is prime, this is equivalent * to the Legendre symbol. * @see http://mathworld.wolfram.com/JacobiSymbol.html * * @param a is a non-negative integer * @param n is an odd integer > 1 * @return (n / m) */ int32_t BOTAN_PUBLIC_API(2,0) jacobi(const BigInt& a, const BigInt& n); /** * Modular exponentation * @param b an integer base * @param x a positive exponent * @param m a positive modulus * @return (b^x) % m */ BigInt BOTAN_PUBLIC_API(2,0) power_mod(const BigInt& b, const BigInt& x, const BigInt& m); /** * Compute the square root of x modulo a prime using the * Shanks-Tonnelli algorithm * * @param x the input * @param p the prime * @return y such that (y*y)%p == x, or -1 if no such integer */ BigInt BOTAN_PUBLIC_API(2,0) ressol(const BigInt& x, const BigInt& p); /* * Compute -input^-1 mod 2^MP_WORD_BITS. Returns zero if input * is even. If input is odd, input and 2^n are relatively prime * and an inverse exists. */ word BOTAN_PUBLIC_API(2,0) monty_inverse(word input); /** * @param x a positive integer * @return count of the zero bits in x, or, equivalently, the largest * value of n such that 2^n divides x evenly. Returns zero if * n is less than or equal to zero. */ size_t BOTAN_PUBLIC_API(2,0) low_zero_bits(const BigInt& x); /** * Check for primality * @param n a positive integer to test for primality * @param rng a random number generator * @param prob chance of false positive is bounded by 1/2**prob * @param is_random true if n was randomly chosen by us * @return true if all primality tests passed, otherwise false */ bool BOTAN_PUBLIC_API(2,0) is_prime(const BigInt& n, RandomNumberGenerator& rng, size_t prob = 56, bool is_random = false); inline bool quick_check_prime(const BigInt& n, RandomNumberGenerator& rng) { return is_prime(n, rng, 32); } inline bool check_prime(const BigInt& n, RandomNumberGenerator& rng) { return is_prime(n, rng, 56); } inline bool verify_prime(const BigInt& n, RandomNumberGenerator& rng) { return is_prime(n, rng, 80); } /** * Randomly generate a prime * @param rng a random number generator * @param bits how large the resulting prime should be in bits * @param coprime a positive integer that (prime - 1) should be coprime to * @param equiv a non-negative number that the result should be equivalent to modulo equiv_mod * @param equiv_mod the modulus equiv should be checked against * @return random prime with the specified criteria */ BigInt BOTAN_PUBLIC_API(2,0) random_prime(RandomNumberGenerator& rng, size_t bits, const BigInt& coprime = 1, size_t equiv = 1, size_t equiv_mod = 2); /** * Return a 'safe' prime, of the form p=2*q+1 with q prime * @param rng a random number generator * @param bits is how long the resulting prime should be * @return prime randomly chosen from safe primes of length bits */ BigInt BOTAN_PUBLIC_API(2,0) random_safe_prime(RandomNumberGenerator& rng, size_t bits); /** * Generate DSA parameters using the FIPS 186 kosherizer * @param rng a random number generator * @param p_out where the prime p will be stored * @param q_out where the prime q will be stored * @param pbits how long p will be in bits * @param qbits how long q will be in bits * @return random seed used to generate this parameter set */ std::vector BOTAN_PUBLIC_API(2,0) generate_dsa_primes(RandomNumberGenerator& rng, BigInt& p_out, BigInt& q_out, size_t pbits, size_t qbits); /** * Generate DSA parameters using the FIPS 186 kosherizer * @param rng a random number generator * @param p_out where the prime p will be stored * @param q_out where the prime q will be stored * @param pbits how long p will be in bits * @param qbits how long q will be in bits * @param seed the seed used to generate the parameters * @param offset optional offset from seed to start searching at * @return true if seed generated a valid DSA parameter set, otherwise false. p_out and q_out are only valid if true was returned. */ bool BOTAN_PUBLIC_API(2,0) generate_dsa_primes(RandomNumberGenerator& rng, BigInt& p_out, BigInt& q_out, size_t pbits, size_t qbits, const std::vector& seed, size_t offset = 0); /** * The size of the PRIMES[] array */ const size_t PRIME_TABLE_SIZE = 6541; /** * A const array of all primes less than 65535 */ extern const uint16_t BOTAN_PUBLIC_API(2,0) PRIMES[]; } #endif botan-2.4.0/src/lib/math/numbertheory/pow_mod.cpp000066400000000000000000000102261322470703100220010ustar00rootroot00000000000000/* * Modular Exponentiation Proxy * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Power_Mod Constructor */ Power_Mod::Power_Mod(const BigInt& n, Usage_Hints hints, bool disable_monty) { set_modulus(n, hints, disable_monty); } /* * Power_Mod Copy Constructor */ Power_Mod::Power_Mod(const Power_Mod& other) { if(other.m_core.get()) m_core.reset(other.m_core->copy()); } /* * Power_Mod Assignment Operator */ Power_Mod& Power_Mod::operator=(const Power_Mod& other) { if(this != &other) { if(other.m_core) m_core.reset(other.m_core->copy()); else m_core.reset(); } return (*this); } /* * Set the modulus */ void Power_Mod::set_modulus(const BigInt& n, Usage_Hints hints, bool disable_monty) const { // Allow set_modulus(0) to mean "drop old state" m_core.reset(); if(n != 0) { if(n.is_odd() && disable_monty == false) m_core.reset(new Montgomery_Exponentiator(n, hints)); else m_core.reset(new Fixed_Window_Exponentiator(n, hints)); } } /* * Set the base */ void Power_Mod::set_base(const BigInt& b) const { if(b.is_zero() || b.is_negative()) throw Invalid_Argument("Power_Mod::set_base: arg must be > 0"); if(!m_core) throw Internal_Error("Power_Mod::set_base: m_core was NULL"); m_core->set_base(b); } /* * Set the exponent */ void Power_Mod::set_exponent(const BigInt& e) const { if(e.is_negative()) throw Invalid_Argument("Power_Mod::set_exponent: arg must be > 0"); if(!m_core) throw Internal_Error("Power_Mod::set_exponent: m_core was NULL"); m_core->set_exponent(e); } /* * Compute the result */ BigInt Power_Mod::execute() const { if(!m_core) throw Internal_Error("Power_Mod::execute: m_core was NULL"); return m_core->execute(); } /* * Try to choose a good window size */ size_t Power_Mod::window_bits(size_t exp_bits, size_t, Power_Mod::Usage_Hints hints) { static const size_t wsize[][2] = { { 1434, 7 }, { 539, 6 }, { 197, 4 }, { 70, 3 }, { 25, 2 }, { 0, 0 } }; size_t window_bits = 1; if(exp_bits) { for(size_t j = 0; wsize[j][0]; ++j) { if(exp_bits >= wsize[j][0]) { window_bits += wsize[j][1]; break; } } } if(hints & Power_Mod::BASE_IS_FIXED) window_bits += 2; if(hints & Power_Mod::EXP_IS_LARGE) ++window_bits; return window_bits; } namespace { /* * Choose potentially useful hints */ Power_Mod::Usage_Hints choose_base_hints(const BigInt& b, const BigInt& n) { if(b == 2) return Power_Mod::Usage_Hints(Power_Mod::BASE_IS_2 | Power_Mod::BASE_IS_SMALL); const size_t b_bits = b.bits(); const size_t n_bits = n.bits(); if(b_bits < n_bits / 32) return Power_Mod::BASE_IS_SMALL; if(b_bits > n_bits / 4) return Power_Mod::BASE_IS_LARGE; return Power_Mod::NO_HINTS; } /* * Choose potentially useful hints */ Power_Mod::Usage_Hints choose_exp_hints(const BigInt& e, const BigInt& n) { const size_t e_bits = e.bits(); const size_t n_bits = n.bits(); if(e_bits < n_bits / 32) return Power_Mod::BASE_IS_SMALL; if(e_bits > n_bits / 4) return Power_Mod::BASE_IS_LARGE; return Power_Mod::NO_HINTS; } } /* * Fixed_Exponent_Power_Mod Constructor */ Fixed_Exponent_Power_Mod::Fixed_Exponent_Power_Mod(const BigInt& e, const BigInt& n, Usage_Hints hints) : Power_Mod(n, Usage_Hints(hints | EXP_IS_FIXED | choose_exp_hints(e, n))) { set_exponent(e); } /* * Fixed_Base_Power_Mod Constructor */ Fixed_Base_Power_Mod::Fixed_Base_Power_Mod(const BigInt& b, const BigInt& n, Usage_Hints hints) : Power_Mod(n, Usage_Hints(hints | BASE_IS_FIXED | choose_base_hints(b, n))) { set_base(b); } } botan-2.4.0/src/lib/math/numbertheory/pow_mod.h000066400000000000000000000070611322470703100214510ustar00rootroot00000000000000/* * Modular Exponentiator * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_POWER_MOD_H_ #define BOTAN_POWER_MOD_H_ #include namespace Botan { /** * Modular Exponentiator Interface */ class BOTAN_PUBLIC_API(2,0) Modular_Exponentiator { public: virtual void set_base(const BigInt&) = 0; virtual void set_exponent(const BigInt&) = 0; virtual BigInt execute() const = 0; virtual Modular_Exponentiator* copy() const = 0; Modular_Exponentiator() = default; Modular_Exponentiator(const Modular_Exponentiator&) = default; Modular_Exponentiator & operator=(const Modular_Exponentiator&) = default; virtual ~Modular_Exponentiator() = default; }; /** * Modular Exponentiator Proxy */ class BOTAN_PUBLIC_API(2,0) Power_Mod { public: enum Usage_Hints { NO_HINTS = 0x0000, BASE_IS_FIXED = 0x0001, BASE_IS_SMALL = 0x0002, BASE_IS_LARGE = 0x0004, BASE_IS_2 = 0x0008, EXP_IS_FIXED = 0x0100, EXP_IS_SMALL = 0x0200, EXP_IS_LARGE = 0x0400 }; /* * Try to choose a good window size */ static size_t window_bits(size_t exp_bits, size_t base_bits, Power_Mod::Usage_Hints hints); /** * @param modulus the modulus * @param hints Passed to set_modulus if modulus > 0 * @param disable_montgomery_arith Disables use of Montgomery * representation. Likely only useful for testing. */ void set_modulus(const BigInt& modulus, Usage_Hints hints = NO_HINTS, bool disable_montgomery_arith = false) const; /** * Set the base */ void set_base(const BigInt& base) const; /** * Set the exponent */ void set_exponent(const BigInt& exponent) const; /** * All three of the above functions must have already been called. * @return result of g^x%p */ BigInt execute() const; Power_Mod& operator=(const Power_Mod&); /** * @param modulus Optionally call set_modulus * @param hints Passed to set_modulus if modulus > 0 * @param disable_montgomery_arith Disables use of Montgomery * representation. Likely only useful for testing. */ Power_Mod(const BigInt& modulus = 0, Usage_Hints hints = NO_HINTS, bool disable_montgomery_arith = false); Power_Mod(const Power_Mod&); virtual ~Power_Mod() = default; private: mutable std::unique_ptr m_core; }; /** * Fixed Exponent Modular Exponentiator Proxy */ class BOTAN_PUBLIC_API(2,0) Fixed_Exponent_Power_Mod final : public Power_Mod { public: BigInt operator()(const BigInt& b) const { set_base(b); return execute(); } Fixed_Exponent_Power_Mod() = default; Fixed_Exponent_Power_Mod(const BigInt& exponent, const BigInt& modulus, Usage_Hints hints = NO_HINTS); }; /** * Fixed Base Modular Exponentiator Proxy */ class BOTAN_PUBLIC_API(2,0) Fixed_Base_Power_Mod final : public Power_Mod { public: BigInt operator()(const BigInt& e) const { set_exponent(e); return execute(); } Fixed_Base_Power_Mod() = default; Fixed_Base_Power_Mod(const BigInt& base, const BigInt& modulus, Usage_Hints hints = NO_HINTS); }; } #endif botan-2.4.0/src/lib/math/numbertheory/powm_fw.cpp000066400000000000000000000026451322470703100220210ustar00rootroot00000000000000/* * Fixed Window Exponentiation * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Set the exponent */ void Fixed_Window_Exponentiator::set_exponent(const BigInt& e) { m_exp = e; } /* * Set the base */ void Fixed_Window_Exponentiator::set_base(const BigInt& base) { m_window_bits = Power_Mod::window_bits(m_exp.bits(), base.bits(), m_hints); m_g.resize(1U << m_window_bits); m_g[0] = 1; m_g[1] = base; for(size_t i = 2; i != m_g.size(); ++i) m_g[i] = m_reducer.multiply(m_g[i-1], m_g[1]); } /* * Compute the result */ BigInt Fixed_Window_Exponentiator::execute() const { const size_t exp_nibbles = (m_exp.bits() + m_window_bits - 1) / m_window_bits; BigInt x = 1; for(size_t i = exp_nibbles; i > 0; --i) { for(size_t j = 0; j != m_window_bits; ++j) x = m_reducer.square(x); const uint32_t nibble = m_exp.get_substring(m_window_bits*(i-1), m_window_bits); x = m_reducer.multiply(x, m_g[nibble]); } return x; } /* * Fixed_Window_Exponentiator Constructor */ Fixed_Window_Exponentiator::Fixed_Window_Exponentiator(const BigInt& n, Power_Mod::Usage_Hints hints) : m_reducer{Modular_Reducer(n)}, m_exp{}, m_window_bits{}, m_g{}, m_hints{hints} {} } botan-2.4.0/src/lib/math/numbertheory/powm_mnt.cpp000066400000000000000000000066541322470703100222070ustar00rootroot00000000000000/* * Montgomery Exponentiation * (C) 1999-2010,2012 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /* * Set the exponent */ void Montgomery_Exponentiator::set_exponent(const BigInt& exp) { m_exp = exp; m_exp_bits = exp.bits(); } /* * Set the base */ void Montgomery_Exponentiator::set_base(const BigInt& base) { m_window_bits = Power_Mod::window_bits(m_exp.bits(), base.bits(), m_hints); m_g.resize(1U << m_window_bits); BigInt z(BigInt::Positive, 2 * (m_mod_words + 1)); secure_vector workspace(z.size()); m_g[0] = 1; bigint_monty_mul(z, m_g[0], m_R2_mod, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); m_g[0] = z; m_g[1] = m_reducer.reduce(base); bigint_monty_mul(z, m_g[1], m_R2_mod, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); m_g[1] = z; const BigInt& x = m_g[1]; for(size_t i = 2; i != m_g.size(); ++i) { const BigInt& y = m_g[i-1]; bigint_monty_mul(z, x, y, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); m_g[i] = z; m_g[i].shrink_to_fit(); m_g[i].grow_to(m_mod_words); } } /* * Compute the result */ BigInt Montgomery_Exponentiator::execute() const { const size_t exp_nibbles = (m_exp_bits + m_window_bits - 1) / m_window_bits; BigInt x = m_R_mod; const size_t z_size = 2*(m_mod_words + 1); BigInt z(BigInt::Positive, z_size); secure_vector workspace(z.size()); secure_vector e(m_mod_words); for(size_t i = exp_nibbles; i > 0; --i) { for(size_t k = 0; k != m_window_bits; ++k) { bigint_monty_sqr(z, x, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); x = z; } const uint32_t nibble = m_exp.get_substring(m_window_bits*(i-1), m_window_bits); BigInt::const_time_lookup(e, m_g, nibble); bigint_mul(z.mutable_data(), z.size(), x.data(), x.size(), x.sig_words(), e.data(), m_mod_words, m_mod_words, workspace.data()); bigint_monty_redc(z.mutable_data(), m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); x = z; } x.grow_to(2*m_mod_words + 1); bigint_monty_redc(x.mutable_data(), m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); return x; } /* * Montgomery_Exponentiator Constructor */ Montgomery_Exponentiator::Montgomery_Exponentiator(const BigInt& mod, Power_Mod::Usage_Hints hints) : m_modulus(mod), m_reducer(m_modulus), m_mod_words(m_modulus.sig_words()), m_window_bits(1), m_hints(hints) { // Montgomery reduction only works for positive odd moduli if(!m_modulus.is_positive() || m_modulus.is_even()) throw Invalid_Argument("Montgomery_Exponentiator: invalid modulus"); m_mod_prime = monty_inverse(mod.word_at(0)); const BigInt r = BigInt::power_of_2(m_mod_words * BOTAN_MP_WORD_BITS); m_R_mod = m_reducer.reduce(r); m_R2_mod = m_reducer.square(m_R_mod); m_exp_bits = 0; } } botan-2.4.0/src/lib/math/numbertheory/primes.cpp000066400000000000000000001317001322470703100216350ustar00rootroot00000000000000/* * Small Primes Table * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { const uint16_t PRIMES[PRIME_TABLE_SIZE+1] = { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, 65519, 65521, 0 }; } botan-2.4.0/src/lib/math/numbertheory/reducer.cpp000066400000000000000000000032561322470703100217730ustar00rootroot00000000000000/* * Modular Reducer * (C) 1999-2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Modular_Reducer Constructor */ Modular_Reducer::Modular_Reducer(const BigInt& mod) { if(mod <= 0) throw Invalid_Argument("Modular_Reducer: modulus must be positive"); m_modulus = mod; m_mod_words = m_modulus.sig_words(); m_modulus_2 = Botan::square(m_modulus); m_mu = BigInt::power_of_2(2 * MP_WORD_BITS * m_mod_words) / m_modulus; } /* * Barrett Reduction */ BigInt Modular_Reducer::reduce(const BigInt& x) const { if(m_mod_words == 0) throw Invalid_State("Modular_Reducer: Never initalized"); if(x.cmp(m_modulus, false) < 0) { if(x.is_negative()) return x + m_modulus; // make positive return x; } else if(x.cmp(m_modulus_2, false) < 0) { BigInt t1 = x; t1.set_sign(BigInt::Positive); t1 >>= (MP_WORD_BITS * (m_mod_words - 1)); t1 *= m_mu; t1 >>= (MP_WORD_BITS * (m_mod_words + 1)); t1 *= m_modulus; t1.mask_bits(MP_WORD_BITS * (m_mod_words + 1)); BigInt t2 = x; t2.set_sign(BigInt::Positive); t2.mask_bits(MP_WORD_BITS * (m_mod_words + 1)); t2 -= t1; if(t2.is_negative()) { t2 += BigInt::power_of_2(MP_WORD_BITS * (m_mod_words + 1)); } while(t2 >= m_modulus) t2 -= m_modulus; if(x.is_positive()) return t2; else return (m_modulus - t2); } else { // too big, fall back to normal division return (x % m_modulus); } } } botan-2.4.0/src/lib/math/numbertheory/reducer.h000066400000000000000000000025041322470703100214330ustar00rootroot00000000000000/* * Modular Reducer * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MODULAR_REDUCER_H_ #define BOTAN_MODULAR_REDUCER_H_ #include namespace Botan { /** * Modular Reducer (using Barrett's technique) */ class BOTAN_PUBLIC_API(2,0) Modular_Reducer { public: const BigInt& get_modulus() const { return m_modulus; } BigInt reduce(const BigInt& x) const; /** * Multiply mod p * @param x the first operand * @param y the second operand * @return (x * y) % p */ BigInt multiply(const BigInt& x, const BigInt& y) const { return reduce(x * y); } /** * Square mod p * @param x the value to square * @return (x * x) % p */ BigInt square(const BigInt& x) const { return reduce(Botan::square(x)); } /** * Cube mod p * @param x the value to cube * @return (x * x * x) % p */ BigInt cube(const BigInt& x) const { return multiply(x, this->square(x)); } bool initialized() const { return (m_mod_words != 0); } Modular_Reducer() { m_mod_words = 0; } explicit Modular_Reducer(const BigInt& mod); private: BigInt m_modulus, m_modulus_2, m_mu; size_t m_mod_words; }; } #endif botan-2.4.0/src/lib/math/numbertheory/ressol.cpp000066400000000000000000000033131322470703100216430ustar00rootroot00000000000000/* * Shanks-Tonnelli (RESSOL) * (C) 2007-2008 Falko Strenzke, FlexSecure GmbH * (C) 2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Shanks-Tonnelli algorithm */ BigInt ressol(const BigInt& a, const BigInt& p) { if(a == 0) return 0; else if(a < 0) throw Invalid_Argument("ressol: value to solve for must be positive"); else if(a >= p) throw Invalid_Argument("ressol: value to solve for must be less than p"); if(p == 2) return a; else if(p <= 1) throw Invalid_Argument("ressol: prime must be > 1 a"); else if(p.is_even()) throw Invalid_Argument("ressol: invalid prime"); if(jacobi(a, p) != 1) // not a quadratic residue return -BigInt(1); if(p % 4 == 3) return power_mod(a, ((p+1) >> 2), p); size_t s = low_zero_bits(p - 1); BigInt q = p >> s; q -= 1; q >>= 1; Modular_Reducer mod_p(p); BigInt r = power_mod(a, q, p); BigInt n = mod_p.multiply(a, mod_p.square(r)); r = mod_p.multiply(r, a); if(n == 1) return r; // find random non quadratic residue z BigInt z = 2; while(jacobi(z, p) == 1) // while z quadratic residue ++z; BigInt c = power_mod(z, (q << 1) + 1, p); while(n > 1) { q = n; size_t i = 0; while(q != 1) { q = mod_p.square(q); ++i; if(i >= s) { return -BigInt(1); } } c = power_mod(c, BigInt::power_of_2(s-i-1), p); r = mod_p.multiply(r, c); c = mod_p.square(c); n = mod_p.multiply(n, c); s = i; } return r; } } botan-2.4.0/src/lib/misc/000077500000000000000000000000001322470703100151075ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/aont/000077500000000000000000000000001322470703100160505ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/aont/info.txt000066400000000000000000000001331322470703100175410ustar00rootroot00000000000000 PACKAGE_TRANSFORM -> 20131128 ctr rng filters botan-2.4.0/src/lib/misc/aont/package.cpp000066400000000000000000000072121322470703100201510ustar00rootroot00000000000000/* * Rivest's Package Tranform * * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { void aont_package(RandomNumberGenerator& rng, BlockCipher* cipher, const uint8_t input[], size_t input_len, uint8_t output[]) { if(input_len <= 1) throw Encoding_Error("Package transform cannot encode small inputs"); const size_t BLOCK_SIZE = cipher->block_size(); if(!cipher->valid_keylength(BLOCK_SIZE)) throw Invalid_Argument("AONT::package: Invalid cipher"); // The all-zero string which is used both as the CTR IV and as K0 const std::string all_zeros(BLOCK_SIZE*2, '0'); SymmetricKey package_key(rng, BLOCK_SIZE); Pipe pipe(new StreamCipher_Filter(new CTR_BE(cipher), package_key)); pipe.process_msg(input, input_len); const size_t remaining = pipe.remaining(); BOTAN_ASSERT_EQUAL(remaining, pipe.read(output, remaining), "Expected read size"); // Set K0 (the all zero key) cipher->set_key(SymmetricKey(all_zeros)); secure_vector buf(BLOCK_SIZE); const size_t blocks = (input_len + BLOCK_SIZE - 1) / BLOCK_SIZE; uint8_t* final_block = output + input_len; clear_mem(final_block, BLOCK_SIZE); // XOR the hash blocks into the final block for(size_t i = 0; i != blocks; ++i) { const size_t left = std::min(BLOCK_SIZE, input_len - BLOCK_SIZE * i); zeroise(buf); copy_mem(buf.data(), output + (BLOCK_SIZE * i), left); for(size_t j = 0; j != sizeof(i); ++j) buf[BLOCK_SIZE - 1 - j] ^= get_byte(sizeof(i)-1-j, i); cipher->encrypt(buf.data()); xor_buf(final_block, buf.data(), BLOCK_SIZE); } // XOR the random package key into the final block xor_buf(final_block, package_key.begin(), BLOCK_SIZE); } void aont_unpackage(BlockCipher* cipher, const uint8_t input[], size_t input_len, uint8_t output[]) { const size_t BLOCK_SIZE = cipher->block_size(); if(!cipher->valid_keylength(BLOCK_SIZE)) throw Invalid_Argument("AONT::unpackage: Invalid cipher"); if(input_len < BLOCK_SIZE) throw Invalid_Argument("AONT::unpackage: Input too short"); // The all-zero string which is used both as the CTR IV and as K0 const std::string all_zeros(BLOCK_SIZE*2, '0'); cipher->set_key(SymmetricKey(all_zeros)); secure_vector package_key(BLOCK_SIZE); secure_vector buf(BLOCK_SIZE); // Copy the package key (masked with the block hashes) copy_mem(package_key.data(), input + (input_len - BLOCK_SIZE), BLOCK_SIZE); const size_t blocks = ((input_len - 1) / BLOCK_SIZE); // XOR the blocks into the package key bits for(size_t i = 0; i != blocks; ++i) { const size_t left = std::min(BLOCK_SIZE, input_len - BLOCK_SIZE * (i+1)); zeroise(buf); copy_mem(buf.data(), input + (BLOCK_SIZE * i), left); for(size_t j = 0; j != sizeof(i); ++j) buf[BLOCK_SIZE - 1 - j] ^= get_byte(sizeof(i)-1-j, i); cipher->encrypt(buf.data()); xor_buf(package_key.data(), buf.data(), BLOCK_SIZE); } Pipe pipe(new StreamCipher_Filter(new CTR_BE(cipher), package_key)); pipe.process_msg(input, input_len - BLOCK_SIZE); const size_t remaining = pipe.remaining(); BOTAN_ASSERT_EQUAL(remaining, pipe.read(output, remaining), "Expected read size"); } } botan-2.4.0/src/lib/misc/aont/package.h000066400000000000000000000026021322470703100176140ustar00rootroot00000000000000/* * Rivest's Package Tranform * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AONT_PACKAGE_TRANSFORM_H_ #define BOTAN_AONT_PACKAGE_TRANSFORM_H_ #include namespace Botan { class RandomNumberGenerator; /** * Rivest's Package Tranform * @param rng the random number generator to use * @param cipher the block cipher to use (aont_package takes ownership) * @param input the input data buffer * @param input_len the length of the input data in bytes * @param output the output data buffer (must be at least * input_len + cipher->BLOCK_SIZE bytes long) */ BOTAN_DEPRECATED("Possibly broken, avoid") void BOTAN_PUBLIC_API(2,0) aont_package(RandomNumberGenerator& rng, BlockCipher* cipher, const uint8_t input[], size_t input_len, uint8_t output[]); /** * Rivest's Package Tranform (Inversion) * @param cipher the block cipher to use (aont_package takes ownership) * @param input the input data buffer * @param input_len the length of the input data in bytes * @param output the output data buffer (must be at least * input_len - cipher->BLOCK_SIZE bytes long) */ BOTAN_DEPRECATED("Possibly broken, avoid") void BOTAN_PUBLIC_API(2,0) aont_unpackage(BlockCipher* cipher, const uint8_t input[], size_t input_len, uint8_t output[]); } #endif botan-2.4.0/src/lib/misc/cryptobox/000077500000000000000000000000001322470703100171405ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/cryptobox/cryptobox.cpp000066400000000000000000000131261322470703100217000ustar00rootroot00000000000000/* * Cryptobox Message Routines * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include namespace Botan { namespace CryptoBox { namespace { /* First 24 bits of SHA-256("Botan Cryptobox"), followed by 8 0 bits for later use as flags, etc if needed */ const uint32_t CRYPTOBOX_VERSION_CODE = 0xEFC22400; const size_t VERSION_CODE_LEN = 4; const size_t CIPHER_KEY_LEN = 32; const size_t CIPHER_IV_LEN = 16; const size_t MAC_KEY_LEN = 32; const size_t MAC_OUTPUT_LEN = 20; const size_t PBKDF_SALT_LEN = 10; const size_t PBKDF_ITERATIONS = 8 * 1024; const size_t PBKDF_OUTPUT_LEN = CIPHER_KEY_LEN + MAC_KEY_LEN + CIPHER_IV_LEN; const size_t CRYPTOBOX_HEADER_LEN = VERSION_CODE_LEN + PBKDF_SALT_LEN + MAC_OUTPUT_LEN; } std::string encrypt(const uint8_t input[], size_t input_len, const std::string& passphrase, RandomNumberGenerator& rng) { /* Output format is: version # (4 bytes) salt (10 bytes) mac (20 bytes) ciphertext */ secure_vector out_buf(CRYPTOBOX_HEADER_LEN + input_len); for(size_t i = 0; i != VERSION_CODE_LEN; ++i) out_buf[i] = get_byte(i, CRYPTOBOX_VERSION_CODE); rng.randomize(&out_buf[VERSION_CODE_LEN], PBKDF_SALT_LEN); // space left for MAC here if(input_len > 0) copy_mem(&out_buf[CRYPTOBOX_HEADER_LEN], input, input_len); // Generate the keys and IV std::unique_ptr pbkdf(PBKDF::create_or_throw("PBKDF2(HMAC(SHA-512))")); OctetString master_key = pbkdf->derive_key( CIPHER_KEY_LEN + MAC_KEY_LEN + CIPHER_IV_LEN, passphrase, &out_buf[VERSION_CODE_LEN], PBKDF_SALT_LEN, PBKDF_ITERATIONS); const uint8_t* mk = master_key.begin(); const uint8_t* cipher_key = mk; const uint8_t* mac_key = mk + CIPHER_KEY_LEN; const uint8_t* iv = mk + CIPHER_KEY_LEN + MAC_KEY_LEN; // Now encrypt and authenticate std::unique_ptr ctr(get_cipher_mode("Serpent/CTR-BE", ENCRYPTION)); ctr->set_key(cipher_key, CIPHER_KEY_LEN); ctr->start(iv, CIPHER_IV_LEN); ctr->finish(out_buf, CRYPTOBOX_HEADER_LEN); std::unique_ptr hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-512)"); hmac->set_key(mac_key, MAC_KEY_LEN); if(input_len > 0) hmac->update(&out_buf[CRYPTOBOX_HEADER_LEN], input_len); // Can't write directly because of MAC truncation secure_vector mac = hmac->final(); copy_mem(&out_buf[VERSION_CODE_LEN + PBKDF_SALT_LEN], mac.data(), MAC_OUTPUT_LEN); return PEM_Code::encode(out_buf, "BOTAN CRYPTOBOX MESSAGE"); } secure_vector decrypt_bin(const uint8_t input[], size_t input_len, const std::string& passphrase) { DataSource_Memory input_src(input, input_len); secure_vector ciphertext = PEM_Code::decode_check_label(input_src, "BOTAN CRYPTOBOX MESSAGE"); if(ciphertext.size() < CRYPTOBOX_HEADER_LEN) throw Decoding_Error("Invalid CryptoBox input"); for(size_t i = 0; i != VERSION_CODE_LEN; ++i) if(ciphertext[i] != get_byte(i, CRYPTOBOX_VERSION_CODE)) throw Decoding_Error("Bad CryptoBox version"); const uint8_t* pbkdf_salt = &ciphertext[VERSION_CODE_LEN]; const uint8_t* box_mac = &ciphertext[VERSION_CODE_LEN + PBKDF_SALT_LEN]; std::unique_ptr pbkdf(PBKDF::create_or_throw("PBKDF2(HMAC(SHA-512))")); OctetString master_key = pbkdf->derive_key( PBKDF_OUTPUT_LEN, passphrase, pbkdf_salt, PBKDF_SALT_LEN, PBKDF_ITERATIONS); const uint8_t* mk = master_key.begin(); const uint8_t* cipher_key = mk; const uint8_t* mac_key = mk + CIPHER_KEY_LEN; const uint8_t* iv = mk + CIPHER_KEY_LEN + MAC_KEY_LEN; // Now authenticate and decrypt std::unique_ptr hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-512)"); hmac->set_key(mac_key, MAC_KEY_LEN); if(ciphertext.size() > CRYPTOBOX_HEADER_LEN) { hmac->update(&ciphertext[CRYPTOBOX_HEADER_LEN], ciphertext.size() - CRYPTOBOX_HEADER_LEN); } secure_vector computed_mac = hmac->final(); if(!constant_time_compare(computed_mac.data(), box_mac, MAC_OUTPUT_LEN)) throw Decoding_Error("CryptoBox integrity failure"); std::unique_ptr ctr(get_cipher_mode("Serpent/CTR-BE", DECRYPTION)); ctr->set_key(cipher_key, CIPHER_KEY_LEN); ctr->start(iv, CIPHER_IV_LEN); ctr->finish(ciphertext, CRYPTOBOX_HEADER_LEN); ciphertext.erase(ciphertext.begin(), ciphertext.begin() + CRYPTOBOX_HEADER_LEN); return ciphertext; } secure_vector decrypt_bin(const std::string& input, const std::string& passphrase) { return decrypt_bin(cast_char_ptr_to_uint8(input.data()), input.size(), passphrase); } std::string decrypt(const uint8_t input[], size_t input_len, const std::string& passphrase) { const secure_vector bin = decrypt_bin(input, input_len, passphrase); return std::string(cast_uint8_ptr_to_char(&bin[0]), bin.size()); } std::string decrypt(const std::string& input, const std::string& passphrase) { return decrypt(cast_char_ptr_to_uint8(input.data()), input.size(), passphrase); } } } botan-2.4.0/src/lib/misc/cryptobox/cryptobox.h000066400000000000000000000040461322470703100213460ustar00rootroot00000000000000/* * Cryptobox Message Routines * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CRYPTOBOX_H_ #define BOTAN_CRYPTOBOX_H_ #include #include namespace Botan { class RandomNumberGenerator; /** * This namespace holds various high-level crypto functions */ namespace CryptoBox { /** * Encrypt a message using a passphrase * @param input the input data * @param input_len the length of input in bytes * @param passphrase the passphrase used to encrypt the message * @param rng a ref to a random number generator, such as AutoSeeded_RNG */ BOTAN_PUBLIC_API(2,0) std::string encrypt(const uint8_t input[], size_t input_len, const std::string& passphrase, RandomNumberGenerator& rng); /** * Decrypt a message encrypted with CryptoBox::encrypt * @param input the input data * @param input_len the length of input in bytes * @param passphrase the passphrase used to encrypt the message */ BOTAN_PUBLIC_API(2,3) secure_vector decrypt_bin(const uint8_t input[], size_t input_len, const std::string& passphrase); /** * Decrypt a message encrypted with CryptoBox::encrypt * @param input the input data * @param passphrase the passphrase used to encrypt the message */ BOTAN_PUBLIC_API(2,3) secure_vector decrypt_bin(const std::string& input, const std::string& passphrase); /** * Decrypt a message encrypted with CryptoBox::encrypt * @param input the input data * @param input_len the length of input in bytes * @param passphrase the passphrase used to encrypt the message */ BOTAN_PUBLIC_API(2,0) std::string decrypt(const uint8_t input[], size_t input_len, const std::string& passphrase); /** * Decrypt a message encrypted with CryptoBox::encrypt * @param input the input data * @param passphrase the passphrase used to encrypt the message */ BOTAN_PUBLIC_API(2,0) std::string decrypt(const std::string& input, const std::string& passphrase); } } #endif botan-2.4.0/src/lib/misc/cryptobox/info.txt000066400000000000000000000001571322470703100206370ustar00rootroot00000000000000 CRYPTO_BOX -> 20131128 base64 ctr hmac pbkdf2 pem serpent sha2_64 botan-2.4.0/src/lib/misc/fpe_fe1/000077500000000000000000000000001322470703100164145ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/fpe_fe1/fpe_fe1.cpp000066400000000000000000000100741322470703100204270ustar00rootroot00000000000000/* * Format Preserving Encryption (FE1 scheme) * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace FPE { namespace { // Normally FPE is for SSNs, CC#s, etc, nothing too big const size_t MAX_N_BYTES = 128/8; /* * Factor n into a and b which are as close together as possible. * Assumes n is composed mostly of small factors which is the case for * typical uses of FPE (typically, n is a power of 10) * * Want a >= b since the safe number of rounds is 2+log_a(b); if a >= b * then this is always 3 */ void factor(BigInt n, BigInt& a, BigInt& b) { a = 1; b = 1; size_t n_low_zero = low_zero_bits(n); a <<= (n_low_zero / 2); b <<= n_low_zero - (n_low_zero / 2); n >>= n_low_zero; for(size_t i = 0; i != PRIME_TABLE_SIZE; ++i) { while(n % PRIMES[i] == 0) { a *= PRIMES[i]; if(a > b) std::swap(a, b); n /= PRIMES[i]; } } if(a > b) std::swap(a, b); a *= n; if(a < b) std::swap(a, b); if(a <= 1 || b <= 1) throw Exception("Could not factor n for use in FPE"); } /* * According to a paper by Rogaway, Bellare, etc, the min safe number * of rounds to use for FPE is 2+log_a(b). If a >= b then log_a(b) <= 1 * so 3 rounds is safe. The FPE factorization routine should always * return a >= b, so just confirm that and return 3. */ size_t rounds(const BigInt& a, const BigInt& b) { if(a < b) throw Internal_Error("FPE rounds: a < b"); return 3; } /* * A simple round function based on HMAC(SHA-256) */ class FPE_Encryptor final { public: FPE_Encryptor(const SymmetricKey& key, const BigInt& n, const std::vector& tweak); BigInt operator()(size_t i, const BigInt& R); private: std::unique_ptr m_mac; std::vector m_mac_n_t; }; FPE_Encryptor::FPE_Encryptor(const SymmetricKey& key, const BigInt& n, const std::vector& tweak) { m_mac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_mac->set_key(key); std::vector n_bin = BigInt::encode(n); if(n_bin.size() > MAX_N_BYTES) throw Exception("N is too large for FPE encryption"); m_mac->update_be(static_cast(n_bin.size())); m_mac->update(n_bin.data(), n_bin.size()); m_mac->update_be(static_cast(tweak.size())); m_mac->update(tweak.data(), tweak.size()); m_mac_n_t = unlock(m_mac->final()); } BigInt FPE_Encryptor::operator()(size_t round_no, const BigInt& R) { secure_vector r_bin = BigInt::encode_locked(R); m_mac->update(m_mac_n_t); m_mac->update_be(static_cast(round_no)); m_mac->update_be(static_cast(r_bin.size())); m_mac->update(r_bin.data(), r_bin.size()); secure_vector X = m_mac->final(); return BigInt(X.data(), X.size()); } } /* * Generic Z_n FPE encryption, FE1 scheme */ BigInt fe1_encrypt(const BigInt& n, const BigInt& X0, const SymmetricKey& key, const std::vector& tweak) { FPE_Encryptor F(key, n, tweak); BigInt a, b; factor(n, a, b); const size_t r = rounds(a, b); BigInt X = X0; for(size_t i = 0; i != r; ++i) { BigInt L = X / b; BigInt R = X % b; BigInt W = (L + F(i, R)) % a; X = a * R + W; } return X; } /* * Generic Z_n FPE decryption, FD1 scheme */ BigInt fe1_decrypt(const BigInt& n, const BigInt& X0, const SymmetricKey& key, const std::vector& tweak) { FPE_Encryptor F(key, n, tweak); BigInt a, b; factor(n, a, b); const size_t r = rounds(a, b); BigInt X = X0; for(size_t i = 0; i != r; ++i) { BigInt W = X % a; BigInt R = X / a; BigInt L = (W - F(r-i-1, R)) % a; X = b * L + R; } return X; } } } botan-2.4.0/src/lib/misc/fpe_fe1/fpe_fe1.h000066400000000000000000000024141322470703100200730ustar00rootroot00000000000000/* * Format Preserving Encryption (FE1 scheme) * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_FPE_FE1_H_ #define BOTAN_FPE_FE1_H_ #include #include namespace Botan { namespace FPE { /** * Format Preserving Encryption using the scheme FE1 from the paper * "Format-Preserving Encryption" by Bellare, Rogaway, et al * (https://eprint.iacr.org/2009/251) * * Encrypt X from and onto the group Z_n using key and tweak * @param n the modulus * @param X the plaintext as a BigInt * @param key a random key * @param tweak will modify the ciphertext (think of as an IV) */ BigInt BOTAN_PUBLIC_API(2,0) fe1_encrypt(const BigInt& n, const BigInt& X, const SymmetricKey& key, const std::vector& tweak); /** * Decrypt X from and onto the group Z_n using key and tweak * @param n the modulus * @param X the ciphertext as a BigInt * @param key is the key used for encryption * @param tweak the same tweak used for encryption */ BigInt BOTAN_PUBLIC_API(2,0) fe1_decrypt(const BigInt& n, const BigInt& X, const SymmetricKey& key, const std::vector& tweak); } } #endif botan-2.4.0/src/lib/misc/fpe_fe1/info.txt000066400000000000000000000001421322470703100201050ustar00rootroot00000000000000 FPE_FE1 -> 20131128 bigint hmac numbertheory sha2_32 botan-2.4.0/src/lib/misc/hotp/000077500000000000000000000000001322470703100160615ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/hotp/hotp.cpp000066400000000000000000000033271322470703100175440ustar00rootroot00000000000000/* * HOTP * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { HOTP::HOTP(const SymmetricKey& key, const std::string& hash_algo, size_t digits) { if(digits == 6) m_digit_mod = 1000000; else if(digits == 7) m_digit_mod = 10000000; else if(digits == 8) m_digit_mod = 100000000; else throw Invalid_Argument("Invalid HOTP digits"); /* RFC 4228 only supports SHA-1 but TOTP allows SHA-256 and SHA-512 and some HOTP libs support one or both as extensions */ if(hash_algo == "SHA-1") m_mac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-1)"); else if(hash_algo == "SHA-256") m_mac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); else if(hash_algo == "SHA-512") m_mac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-512)"); else throw Invalid_Argument("Unsupported HOTP hash function"); m_mac->set_key(key); } uint32_t HOTP::generate_hotp(uint64_t counter) { uint8_t counter8[8] = { 0 }; store_be(counter, counter8); m_mac->update(counter8, sizeof(counter8)); const secure_vector mac = m_mac->final(); const size_t offset = mac[mac.size()-1] & 0x0F; const uint32_t code = load_be(mac.data() + offset, 0) & 0x7FFFFFFF; return code % m_digit_mod; } std::pair HOTP::verify_hotp(uint32_t otp, uint64_t starting_counter, size_t resync_range) { for(size_t i = 0; i <= resync_range; ++i) { if(generate_hotp(starting_counter + i) == otp) return std::make_pair(true, starting_counter + i + 1); } return std::make_pair(false, starting_counter); } } botan-2.4.0/src/lib/misc/hotp/hotp.h000066400000000000000000000032011322470703100172000ustar00rootroot00000000000000/* * HOTP * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HOTP_H_ #define BOTAN_HOTP_H_ #include namespace Botan { /** * HOTP one time passwords (RFC 4226) */ class BOTAN_PUBLIC_API(2,2) HOTP final { public: /** * @param key the secret key shared between client and server * @param hash_algo the hash algorithm to use, should be SHA-1 or SHA-256 * @param digits the number of digits in the OTP (must be 6, 7, or 8) */ HOTP(const SymmetricKey& key, const std::string& hash_algo = "SHA-1", size_t digits = 6); /** * Generate the HOTP for a particular counter value * @warning if the counter value is repeated the OTP ceases to be one-time */ uint32_t generate_hotp(uint64_t counter); /** * Check an OTP value using a starting counter and a resync range * @param otp the client provided OTP * @param starting_counter the server's guess as to the current counter state * @param resync_range if 0 then only HOTP(starting_counter) is accepted * If larger than 0, up to resync_range values after HOTP are also checked. * @return (valid,next_counter). If the OTP does not validate, always * returns (false,starting_counter). Otherwise returns (true,next_counter) * where next_counter is at most starting_counter + resync_range + 1 */ std::pair verify_hotp(uint32_t otp, uint64_t starting_counter, size_t resync_range = 0); private: std::unique_ptr m_mac; uint32_t m_digit_mod; }; } #endif botan-2.4.0/src/lib/misc/hotp/info.txt000066400000000000000000000001321322470703100175510ustar00rootroot00000000000000 HOTP -> 20170513 TOTP -> 20170519 hmac utils botan-2.4.0/src/lib/misc/hotp/totp.cpp000066400000000000000000000032551322470703100175600ustar00rootroot00000000000000/* * TOTP * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { TOTP::TOTP(const SymmetricKey& key, const std::string& hash_algo, size_t digits, size_t time_step) : m_hotp(key, hash_algo, digits) , m_time_step(time_step) , m_unix_epoch(calendar_point(1970, 1, 1, 0, 0, 0).to_std_timepoint()) { /* * Technically any time step except 0 is valid, but 30 is typical * and over 5 minutes seems unlikely. */ if(m_time_step == 0 || m_time_step > 300) throw Invalid_Argument("Invalid TOTP time step"); } uint32_t TOTP::generate_totp(std::chrono::system_clock::time_point current_time) { const uint64_t unix_time = std::chrono::duration_cast(current_time - m_unix_epoch).count(); return this->generate_totp(unix_time); } uint32_t TOTP::generate_totp(uint64_t unix_time) { return m_hotp.generate_hotp(unix_time / m_time_step); } bool TOTP::verify_totp(uint32_t otp, std::chrono::system_clock::time_point current_time, size_t clock_drift_accepted) { const uint64_t unix_time = std::chrono::duration_cast(current_time - m_unix_epoch).count(); return verify_totp(otp, unix_time, clock_drift_accepted); } bool TOTP::verify_totp(uint32_t otp, uint64_t unix_time, size_t clock_drift_accepted) { uint64_t t = unix_time / m_time_step; for(size_t i = 0; i <= clock_drift_accepted; ++i) { if(m_hotp.generate_hotp(t-i) == otp) { return true; } } return false; } } botan-2.4.0/src/lib/misc/hotp/totp.h000066400000000000000000000030151322470703100172170ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TOTP_H_ #define BOTAN_TOTP_H_ #include #include namespace Botan { /** * TOTP (time based) one time passwords (RFC 6238) */ class BOTAN_PUBLIC_API(2,2) TOTP final { public: /** * @param key the secret key shared between client and server * @param hash_algo the hash algorithm to use, should be SHA-1, SHA-256 or SHA-512 * @param digits the number of digits in the OTP (must be 6, 7, or 8) * @param time_step granularity of OTP in seconds */ TOTP(const SymmetricKey& key, const std::string& hash_algo = "SHA-1", size_t digits = 6, size_t time_step = 30); /** * Convert the provided time_point to a Unix timestamp and call generate_totp */ uint32_t generate_totp(std::chrono::system_clock::time_point time_point); /** * Generate the OTP cooresponding the the provided "Unix timestamp" (ie * number of seconds since midnight Jan 1, 1970) */ uint32_t generate_totp(uint64_t unix_time); bool verify_totp(uint32_t otp, std::chrono::system_clock::time_point time, size_t clock_drift_accepted = 0); bool verify_totp(uint32_t otp, uint64_t unix_time, size_t clock_drift_accepted = 0); private: HOTP m_hotp; size_t m_time_step; std::chrono::system_clock::time_point m_unix_epoch; }; } #endif botan-2.4.0/src/lib/misc/nist_keywrap/000077500000000000000000000000001322470703100176265ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/nist_keywrap/info.txt000066400000000000000000000000561322470703100213230ustar00rootroot00000000000000 NIST_KEYWRAP -> 20171119 botan-2.4.0/src/lib/misc/nist_keywrap/nist_keywrap.cpp000066400000000000000000000117451322470703100230610ustar00rootroot00000000000000/* * (C) 2011,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { std::vector raw_nist_key_wrap(const uint8_t input[], size_t input_len, const BlockCipher& bc, uint64_t ICV) { const size_t n = (input_len + 7) / 8; secure_vector R((n + 1) * 8); secure_vector A(16); store_be(ICV, A.data()); copy_mem(&R[8], input, input_len); for(size_t j = 0; j <= 5; ++j) { for(size_t i = 1; i <= n; ++i) { const uint32_t t = static_cast((n * j) + i); copy_mem(&A[8], &R[8*i], 8); bc.encrypt(A.data()); copy_mem(&R[8*i], &A[8], 8); uint8_t t_buf[4] = { 0 }; store_be(t, t_buf); xor_buf(&A[4], t_buf, 4); } } copy_mem(R.data(), A.data(), 8); return std::vector(R.begin(), R.end()); } secure_vector raw_nist_key_unwrap(const uint8_t input[], size_t input_len, const BlockCipher& bc, uint64_t& ICV_out) { if(input_len < 16 || input_len % 8 != 0) throw Invalid_Argument("Bad input size for NIST key unwrap"); const size_t n = (input_len - 8) / 8; secure_vector R(n * 8); secure_vector A(16); for(size_t i = 0; i != 8; ++i) A[i] = input[i]; copy_mem(R.data(), input + 8, input_len - 8); for(size_t j = 0; j <= 5; ++j) { for(size_t i = n; i != 0; --i) { const uint32_t t = static_cast((5 - j) * n + i); uint8_t t_buf[4] = { 0 }; store_be(t, t_buf); xor_buf(&A[4], t_buf, 4); copy_mem(&A[8], &R[8*(i-1)], 8); bc.decrypt(A.data()); copy_mem(&R[8*(i-1)], &A[8], 8); } } ICV_out = load_be(A.data(), 0); return R; } } std::vector nist_key_wrap(const uint8_t input[], size_t input_len, const BlockCipher& bc) { if(bc.block_size() != 16) throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); if(input_len % 8 != 0) throw Invalid_Argument("Bad input size for NIST key wrap"); return raw_nist_key_wrap(input, input_len, bc, 0xA6A6A6A6A6A6A6A6); } secure_vector nist_key_unwrap(const uint8_t input[], size_t input_len, const BlockCipher& bc) { if(bc.block_size() != 16) throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); if(input_len < 16 || input_len % 8 != 0) throw Invalid_Argument("Bad input size for NIST key unwrap"); uint64_t ICV_out = 0; secure_vector R = raw_nist_key_unwrap(input, input_len, bc, ICV_out); if(ICV_out != 0xA6A6A6A6A6A6A6A6) throw Integrity_Failure("NIST key unwrap failed"); return R; } std::vector nist_key_wrap_padded(const uint8_t input[], size_t input_len, const BlockCipher& bc) { if(bc.block_size() != 16) throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); const uint64_t ICV = 0xA65959A600000000 | static_cast(input_len); if(input_len <= 8) { /* * Special case for small inputs: if input <= 8 bytes just use ECB */ std::vector block(16); store_be(ICV, block.data()); copy_mem(block.data() + 8, input, input_len); bc.encrypt(block); return block; } else { return raw_nist_key_wrap(input, input_len, bc, ICV); } } secure_vector nist_key_unwrap_padded(const uint8_t input[], size_t input_len, const BlockCipher& bc) { if(bc.block_size() != 16) throw Invalid_Argument("NIST key wrap algorithm requires a 128-bit cipher"); if(input_len < 16 || input_len % 8 != 0) throw Invalid_Argument("Bad input size for NIST key unwrap"); uint64_t ICV_out = 0; secure_vector R; if(input_len == 16) { secure_vector block(input, input + input_len); bc.decrypt(block); ICV_out = load_be(block.data(), 0); R.resize(8); copy_mem(R.data(), block.data() + 8, 8); } else { R = raw_nist_key_unwrap(input, input_len, bc, ICV_out); } if((ICV_out >> 32) != 0xA65959A6) throw Integrity_Failure("NIST key unwrap failed"); const size_t len = (ICV_out & 0xFFFFFFFF); if(len > R.size() || len < R.size() - 8) throw Integrity_Failure("NIST key unwrap failed"); const size_t padding = R.size() - len; for(size_t i = 0; i != padding; ++i) { if(R[R.size() - i - 1] != 0) throw Integrity_Failure("NIST key unwrap failed"); } R.resize(R.size() - padding); return R; } } botan-2.4.0/src/lib/misc/nist_keywrap/nist_keywrap.h000066400000000000000000000037651322470703100225310ustar00rootroot00000000000000/* * (C) 2011,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_NIST_KEY_WRAP_H_ #define BOTAN_NIST_KEY_WRAP_H_ #include namespace Botan { class BlockCipher; /** * Key wrap. See RFC 3394 and NIST SP800-38F * @param input the value to be encrypted * @param input_len length of input, must be a multiple of 8 * @param bc a keyed 128-bit block cipher that will be used to encrypt input * @return input encrypted under NIST key wrap algorithm */ std::vector BOTAN_PUBLIC_API(2,4) nist_key_wrap(const uint8_t input[], size_t input_len, const BlockCipher& bc); /** * @param input the value to be decrypted, output of nist_key_wrap * @param input_len length of input * @param bc a keyed 128-bit block cipher that will be used to decrypt input * @return input decrypted under NIST key wrap algorithm * Throws an exception if decryption fails. */ secure_vector BOTAN_PUBLIC_API(2,4) nist_key_unwrap(const uint8_t input[], size_t input_len, const BlockCipher& bc); /** * KWP (key wrap with padding). See RFC 5649 and NIST SP800-38F * @param input the value to be encrypted * @param input_len length of input * @param bc a keyed 128-bit block cipher that will be used to encrypt input * @return input encrypted under NIST key wrap algorithm */ std::vector BOTAN_PUBLIC_API(2,4) nist_key_wrap_padded(const uint8_t input[], size_t input_len, const BlockCipher& bc); /** * @param input the value to be decrypted, output of nist_key_wrap * @param input_len length of input * @param bc a keyed 128-bit block cipher that will be used to decrypt input * @return input decrypted under NIST key wrap algorithm * Throws an exception if decryption fails. */ secure_vector BOTAN_PUBLIC_API(2,4) nist_key_unwrap_padded(const uint8_t input[], size_t input_len, const BlockCipher& bc); } #endif botan-2.4.0/src/lib/misc/rfc3394/000077500000000000000000000000001322470703100162045ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/rfc3394/info.txt000066400000000000000000000001321322470703100176740ustar00rootroot00000000000000 RFC3394_KEYWRAP -> 20131128 aes nist_keywrap botan-2.4.0/src/lib/misc/rfc3394/rfc3394.cpp000066400000000000000000000030201322470703100200000ustar00rootroot00000000000000/* * AES Key Wrap (RFC 3394) * (C) 2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { secure_vector rfc3394_keywrap(const secure_vector& key, const SymmetricKey& kek) { if(kek.size() != 16 && kek.size() != 24 && kek.size() != 32) throw Invalid_Argument("Bad KEK length " + std::to_string(kek.size()) + " for NIST key wrap"); const std::string cipher_name = "AES-" + std::to_string(8*kek.size()); std::unique_ptr aes(BlockCipher::create_or_throw(cipher_name)); aes->set_key(kek); std::vector wrapped = nist_key_wrap(key.data(), key.size(), *aes); return secure_vector(wrapped.begin(), wrapped.end()); } secure_vector rfc3394_keyunwrap(const secure_vector& key, const SymmetricKey& kek) { if(key.size() < 16 || key.size() % 8 != 0) throw Invalid_Argument("Bad input key size for NIST key unwrap"); if(kek.size() != 16 && kek.size() != 24 && kek.size() != 32) throw Invalid_Argument("Bad KEK length " + std::to_string(kek.size()) + " for NIST key unwrap"); const std::string cipher_name = "AES-" + std::to_string(8*kek.size()); std::unique_ptr aes(BlockCipher::create_or_throw(cipher_name)); aes->set_key(kek); return nist_key_unwrap(key.data(), key.size(), *aes); } } botan-2.4.0/src/lib/misc/rfc3394/rfc3394.h000066400000000000000000000017771322470703100174660ustar00rootroot00000000000000/* * AES Key Wrap (RFC 3394) * (C) 2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RFC3394_H_ #define BOTAN_RFC3394_H_ #include namespace Botan { /** * Encrypt a key under a key encryption key using the algorithm * described in RFC 3394 * * @param key the plaintext key to encrypt * @param kek the key encryption key * @return key encrypted under kek */ secure_vector BOTAN_PUBLIC_API(2,0) rfc3394_keywrap(const secure_vector& key, const SymmetricKey& kek); /** * Decrypt a key under a key encryption key using the algorithm * described in RFC 3394 * * @param key the encrypted key to decrypt * @param kek the key encryption key * @return key decrypted under kek */ secure_vector BOTAN_PUBLIC_API(2,0) rfc3394_keyunwrap(const secure_vector& key, const SymmetricKey& kek); } #endif botan-2.4.0/src/lib/misc/srp6/000077500000000000000000000000001322470703100160015ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/srp6/info.txt000066400000000000000000000001161322470703100174730ustar00rootroot00000000000000 SRP6 -> 20161017 bigint dl_group botan-2.4.0/src/lib/misc/srp6/srp6.cpp000066400000000000000000000101441322470703100173770ustar00rootroot00000000000000/* * SRP-6a (RFC 5054 compatatible) * (C) 2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { BigInt hash_seq(const std::string& hash_id, size_t pad_to, const BigInt& in1, const BigInt& in2) { std::unique_ptr hash_fn(HashFunction::create_or_throw(hash_id)); hash_fn->update(BigInt::encode_1363(in1, pad_to)); hash_fn->update(BigInt::encode_1363(in2, pad_to)); return BigInt::decode(hash_fn->final()); } BigInt compute_x(const std::string& hash_id, const std::string& identifier, const std::string& password, const std::vector& salt) { std::unique_ptr hash_fn(HashFunction::create_or_throw(hash_id)); hash_fn->update(identifier); hash_fn->update(":"); hash_fn->update(password); secure_vector inner_h = hash_fn->final(); hash_fn->update(salt); hash_fn->update(inner_h); secure_vector outer_h = hash_fn->final(); return BigInt::decode(outer_h); } } std::string srp6_group_identifier(const BigInt& N, const BigInt& g) { /* This function assumes that only one 'standard' SRP parameter set has been defined for a particular bitsize. As of this writing that is the case. */ try { const std::string group_name = "modp/srp/" + std::to_string(N.bits()); DL_Group group(group_name); if(group.get_p() == N && group.get_g() == g) return group_name; throw Exception("Unknown SRP params"); } catch(...) { throw Invalid_Argument("Bad SRP group parameters"); } } std::pair srp6_client_agree(const std::string& identifier, const std::string& password, const std::string& group_id, const std::string& hash_id, const std::vector& salt, const BigInt& B, RandomNumberGenerator& rng) { DL_Group group(group_id); const BigInt& g = group.get_g(); const BigInt& p = group.get_p(); const size_t p_bytes = group.get_p().bytes(); if(B <= 0 || B >= p) throw Exception("Invalid SRP parameter from server"); BigInt k = hash_seq(hash_id, p_bytes, p, g); BigInt a(rng, 256); BigInt A = power_mod(g, a, p); BigInt u = hash_seq(hash_id, p_bytes, A, B); const BigInt x = compute_x(hash_id, identifier, password, salt); BigInt S = power_mod((B - (k * power_mod(g, x, p))) % p, (a + (u * x)), p); SymmetricKey Sk(BigInt::encode_1363(S, p_bytes)); return std::make_pair(A, Sk); } BigInt generate_srp6_verifier(const std::string& identifier, const std::string& password, const std::vector& salt, const std::string& group_id, const std::string& hash_id) { const BigInt x = compute_x(hash_id, identifier, password, salt); DL_Group group(group_id); return power_mod(group.get_g(), x, group.get_p()); } BigInt SRP6_Server_Session::step1(const BigInt& v, const std::string& group_id, const std::string& hash_id, RandomNumberGenerator& rng) { DL_Group group(group_id); const BigInt& g = group.get_g(); const BigInt& p = group.get_p(); m_p_bytes = p.bytes(); m_v = v; m_b = BigInt(rng, 256); m_p = p; m_hash_id = hash_id; const BigInt k = hash_seq(hash_id, m_p_bytes, p, g); m_B = (v*k + power_mod(g, m_b, p)) % p; return m_B; } SymmetricKey SRP6_Server_Session::step2(const BigInt& A) { if(A <= 0 || A >= m_p) throw Exception("Invalid SRP parameter from client"); const BigInt u = hash_seq(m_hash_id, m_p_bytes, A, m_B); const BigInt S = power_mod(A * power_mod(m_v, u, m_p), m_b, m_p); return BigInt::encode_1363(S, m_p_bytes); } } botan-2.4.0/src/lib/misc/srp6/srp6.h000066400000000000000000000056611322470703100170540ustar00rootroot00000000000000/* * SRP-6a (RFC 5054 compatatible) * (C) 2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RFC5054_SRP6_H_ #define BOTAN_RFC5054_SRP6_H_ #include #include #include namespace Botan { class RandomNumberGenerator; /** * SRP6a Client side * @param username the username we are attempting login for * @param password the password we are attempting to use * @param group_id specifies the shared SRP group * @param hash_id specifies a secure hash function * @param salt is the salt value sent by the server * @param B is the server's public value * @param rng is a random number generator * * @return (A,K) the client public key and the shared secret key */ std::pair BOTAN_PUBLIC_API(2,0) srp6_client_agree(const std::string& username, const std::string& password, const std::string& group_id, const std::string& hash_id, const std::vector& salt, const BigInt& B, RandomNumberGenerator& rng); /** * Generate a new SRP-6 verifier * @param identifier a username or other client identifier * @param password the secret used to authenticate user * @param salt a randomly chosen value, at least 128 bits long * @param group_id specifies the shared SRP group * @param hash_id specifies a secure hash function */ BigInt BOTAN_PUBLIC_API(2,0) generate_srp6_verifier(const std::string& identifier, const std::string& password, const std::vector& salt, const std::string& group_id, const std::string& hash_id); /** * Return the group id for this SRP param set, or else thrown an * exception * @param N the group modulus * @param g the group generator * @return group identifier */ std::string BOTAN_PUBLIC_API(2,0) srp6_group_identifier(const BigInt& N, const BigInt& g); /** * Represents a SRP-6a server session */ class BOTAN_PUBLIC_API(2,0) SRP6_Server_Session final { public: /** * Server side step 1 * @param v the verification value saved from client registration * @param group_id the SRP group id * @param hash_id the SRP hash in use * @param rng a random number generator * @return SRP-6 B value */ BigInt step1(const BigInt& v, const std::string& group_id, const std::string& hash_id, RandomNumberGenerator& rng); /** * Server side step 2 * @param A the client's value * @return shared symmetric key */ SymmetricKey step2(const BigInt& A); private: std::string m_hash_id; BigInt m_B, m_b, m_v, m_S, m_p; size_t m_p_bytes = 0; }; } #endif botan-2.4.0/src/lib/misc/tss/000077500000000000000000000000001322470703100157205ustar00rootroot00000000000000botan-2.4.0/src/lib/misc/tss/info.txt000066400000000000000000000001471322470703100174160ustar00rootroot00000000000000 THRESHOLD_SECRET_SHARING -> 20131128 rng hex sha1 sha2_32 botan-2.4.0/src/lib/misc/tss/tss.cpp000066400000000000000000000215171322470703100172430ustar00rootroot00000000000000/* * RTSS (threshold secret sharing) * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { /** Table for GF(2^8) arithmetic (exponentials) */ const uint8_t RTSS_EXP[256] = { 0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35, 0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA, 0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31, 0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD, 0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88, 0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A, 0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3, 0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0, 0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41, 0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75, 0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80, 0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54, 0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA, 0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E, 0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17, 0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01 }; /** Table for GF(2^8) arithmetic (logarithms) */ const uint8_t RTSS_LOG[] = { 0x90, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1A, 0xC6, 0x4B, 0xC7, 0x1B, 0x68, 0x33, 0xEE, 0xDF, 0x03, 0x64, 0x04, 0xE0, 0x0E, 0x34, 0x8D, 0x81, 0xEF, 0x4C, 0x71, 0x08, 0xC8, 0xF8, 0x69, 0x1C, 0xC1, 0x7D, 0xC2, 0x1D, 0xB5, 0xF9, 0xB9, 0x27, 0x6A, 0x4D, 0xE4, 0xA6, 0x72, 0x9A, 0xC9, 0x09, 0x78, 0x65, 0x2F, 0x8A, 0x05, 0x21, 0x0F, 0xE1, 0x24, 0x12, 0xF0, 0x82, 0x45, 0x35, 0x93, 0xDA, 0x8E, 0x96, 0x8F, 0xDB, 0xBD, 0x36, 0xD0, 0xCE, 0x94, 0x13, 0x5C, 0xD2, 0xF1, 0x40, 0x46, 0x83, 0x38, 0x66, 0xDD, 0xFD, 0x30, 0xBF, 0x06, 0x8B, 0x62, 0xB3, 0x25, 0xE2, 0x98, 0x22, 0x88, 0x91, 0x10, 0x7E, 0x6E, 0x48, 0xC3, 0xA3, 0xB6, 0x1E, 0x42, 0x3A, 0x6B, 0x28, 0x54, 0xFA, 0x85, 0x3D, 0xBA, 0x2B, 0x79, 0x0A, 0x15, 0x9B, 0x9F, 0x5E, 0xCA, 0x4E, 0xD4, 0xAC, 0xE5, 0xF3, 0x73, 0xA7, 0x57, 0xAF, 0x58, 0xA8, 0x50, 0xF4, 0xEA, 0xD6, 0x74, 0x4F, 0xAE, 0xE9, 0xD5, 0xE7, 0xE6, 0xAD, 0xE8, 0x2C, 0xD7, 0x75, 0x7A, 0xEB, 0x16, 0x0B, 0xF5, 0x59, 0xCB, 0x5F, 0xB0, 0x9C, 0xA9, 0x51, 0xA0, 0x7F, 0x0C, 0xF6, 0x6F, 0x17, 0xC4, 0x49, 0xEC, 0xD8, 0x43, 0x1F, 0x2D, 0xA4, 0x76, 0x7B, 0xB7, 0xCC, 0xBB, 0x3E, 0x5A, 0xFB, 0x60, 0xB1, 0x86, 0x3B, 0x52, 0xA1, 0x6C, 0xAA, 0x55, 0x29, 0x9D, 0x97, 0xB2, 0x87, 0x90, 0x61, 0xBE, 0xDC, 0xFC, 0xBC, 0x95, 0xCF, 0xCD, 0x37, 0x3F, 0x5B, 0xD1, 0x53, 0x39, 0x84, 0x3C, 0x41, 0xA2, 0x6D, 0x47, 0x14, 0x2A, 0x9E, 0x5D, 0x56, 0xF2, 0xD3, 0xAB, 0x44, 0x11, 0x92, 0xD9, 0x23, 0x20, 0x2E, 0x89, 0xB4, 0x7C, 0xB8, 0x26, 0x77, 0x99, 0xE3, 0xA5, 0x67, 0x4A, 0xED, 0xDE, 0xC5, 0x31, 0xFE, 0x18, 0x0D, 0x63, 0x8C, 0x80, 0xC0, 0xF7, 0x70, 0x07 }; uint8_t gfp_mul(uint8_t x, uint8_t y) { if(x == 0 || y == 0) return 0; return RTSS_EXP[(RTSS_LOG[x] + RTSS_LOG[y]) % 255]; } uint8_t rtss_hash_id(const std::string& hash_name) { if(hash_name == "SHA-160" || hash_name == "SHA-1" || hash_name == "SHA1") return 1; else if(hash_name == "SHA-256") return 2; else throw Invalid_Argument("RTSS only supports SHA-1 and SHA-256"); } std::unique_ptr get_rtss_hash_by_id(uint8_t id) { if(id == 1) return HashFunction::create_or_throw("SHA-1"); else if(id == 2) return HashFunction::create_or_throw("SHA-256"); else throw Decoding_Error("Bad RTSS hash identifier"); } } RTSS_Share::RTSS_Share(const std::string& hex_input) { m_contents = hex_decode_locked(hex_input); } uint8_t RTSS_Share::share_id() const { if(!initialized()) throw Invalid_State("RTSS_Share::share_id not initialized"); return m_contents[20]; } std::string RTSS_Share::to_string() const { return hex_encode(m_contents.data(), m_contents.size()); } std::vector RTSS_Share::split(uint8_t M, uint8_t N, const uint8_t S[], uint16_t S_len, const uint8_t identifier[16], RandomNumberGenerator& rng) { if(M == 0 || N == 0 || M > N) throw Encoding_Error("RTSS_Share::split: M == 0 or N == 0 or M > N"); // always use SHA-256 when generating shares std::unique_ptr hash = HashFunction::create_or_throw("SHA-256"); std::vector shares(N); // Create RTSS header in each share for(uint8_t i = 0; i != N; ++i) { shares[i].m_contents += std::make_pair(identifier, 16); shares[i].m_contents += rtss_hash_id(hash->name()); shares[i].m_contents += M; shares[i].m_contents += get_byte(0, S_len); shares[i].m_contents += get_byte(1, S_len); } // Choose sequential values for X starting from 1 for(uint8_t i = 0; i != N; ++i) shares[i].m_contents.push_back(i+1); // secret = S || H(S) secure_vector secret(S, S + S_len); secret += hash->process(S, S_len); for(size_t i = 0; i != secret.size(); ++i) { std::vector coefficients(M-1); rng.randomize(coefficients.data(), coefficients.size()); for(uint8_t j = 0; j != N; ++j) { const uint8_t X = j + 1; uint8_t sum = secret[i]; uint8_t X_i = X; for(size_t k = 0; k != coefficients.size(); ++k) { sum ^= gfp_mul(X_i, coefficients[k]); X_i = gfp_mul(X_i, X); } shares[j].m_contents.push_back(sum); } } return shares; } secure_vector RTSS_Share::reconstruct(const std::vector& shares) { const size_t RTSS_HEADER_SIZE = 20; for(size_t i = 0; i != shares.size(); ++i) { if(shares[i].size() != shares[0].size()) throw Decoding_Error("Different sized RTSS shares detected"); if(shares[i].share_id() == 0) throw Decoding_Error("Invalid (id = 0) RTSS share detected"); if(shares[i].size() < RTSS_HEADER_SIZE) throw Decoding_Error("Missing or malformed RTSS header"); if(!same_mem(&shares[0].m_contents[0], &shares[i].m_contents[0], RTSS_HEADER_SIZE)) throw Decoding_Error("Different RTSS headers detected"); } if(shares.size() < shares[0].m_contents[17]) throw Decoding_Error("Insufficient shares to do TSS reconstruction"); uint16_t secret_len = make_uint16(shares[0].m_contents[18], shares[0].m_contents[19]); uint8_t hash_id = shares[0].m_contents[16]; std::unique_ptr hash(get_rtss_hash_by_id(hash_id)); if(shares[0].size() != secret_len + hash->output_length() + RTSS_HEADER_SIZE + 1) throw Decoding_Error("Bad RTSS length field in header"); std::vector V(shares.size()); secure_vector secret; for(size_t i = RTSS_HEADER_SIZE + 1; i != shares[0].size(); ++i) { for(size_t j = 0; j != V.size(); ++j) V[j] = shares[j].m_contents[i]; uint8_t r = 0; for(size_t k = 0; k != shares.size(); ++k) { // L_i function: uint8_t r2 = 1; for(size_t l = 0; l != shares.size(); ++l) { if(k == l) continue; uint8_t share_k = shares[k].share_id(); uint8_t share_l = shares[l].share_id(); if(share_k == share_l) throw Decoding_Error("Duplicate shares found in RTSS recovery"); uint8_t div = RTSS_EXP[(255 + RTSS_LOG[share_l] - RTSS_LOG[share_k ^ share_l]) % 255]; r2 = gfp_mul(r2, div); } r ^= gfp_mul(V[k], r2); } secret.push_back(r); } if(secret.size() != secret_len + hash->output_length()) throw Decoding_Error("Bad length in RTSS output"); hash->update(secret.data(), secret_len); secure_vector hash_check = hash->final(); if(!constant_time_compare(hash_check.data(), &secret[secret_len], hash->output_length())) { throw Decoding_Error("RTSS hash check failed"); } return secure_vector(secret.cbegin(), secret.cbegin() + secret_len); } } botan-2.4.0/src/lib/misc/tss/tss.h000066400000000000000000000033751322470703100167120ustar00rootroot00000000000000/* * RTSS (threshold secret sharing) * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RTSS_H_ #define BOTAN_RTSS_H_ #include #include namespace Botan { class RandomNumberGenerator; /** * A split secret, using the format from draft-mcgrew-tss-03 */ class BOTAN_PUBLIC_API(2,0) RTSS_Share final { public: /** * @param M the number of shares needed to reconstruct * @param N the number of shares generated * @param secret the secret to split * @param secret_len the length of the secret * @param identifier the 16 byte share identifier * @param rng the random number generator to use */ static std::vector split(uint8_t M, uint8_t N, const uint8_t secret[], uint16_t secret_len, const uint8_t identifier[16], RandomNumberGenerator& rng); /** * @param shares the list of shares */ static secure_vector reconstruct(const std::vector& shares); RTSS_Share() = default; /** * @param hex_input the share encoded in hexadecimal */ explicit RTSS_Share(const std::string& hex_input); /** * @return hex representation */ std::string to_string() const; /** * @return share identifier */ uint8_t share_id() const; /** * @return size of this share in bytes */ size_t size() const { return m_contents.size(); } /** * @return if this TSS share was initialized or not */ bool initialized() const { return (m_contents.size() > 0); } private: secure_vector m_contents; }; } #endif botan-2.4.0/src/lib/modes/000077500000000000000000000000001322470703100152635ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/000077500000000000000000000000001322470703100161555ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/aead.cpp000066400000000000000000000066701322470703100175640ustar00rootroot00000000000000/* * (C) 2013,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_BLOCK_CIPHER) #include #endif #if defined(BOTAN_HAS_AEAD_CCM) #include #endif #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305) #include #endif #if defined(BOTAN_HAS_AEAD_EAX) #include #endif #if defined(BOTAN_HAS_AEAD_GCM) #include #endif #if defined(BOTAN_HAS_AEAD_OCB) #include #endif #if defined(BOTAN_HAS_AEAD_SIV) #include #endif namespace Botan { AEAD_Mode* get_aead(const std::string& algo, Cipher_Dir dir) { #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305) if(algo == "ChaCha20Poly1305") { if(dir == ENCRYPTION) return new ChaCha20Poly1305_Encryption; else return new ChaCha20Poly1305_Decryption; } #endif if(algo.find('/') != std::string::npos) { const std::vector algo_parts = split_on(algo, '/'); const std::string cipher_name = algo_parts[0]; const std::vector mode_info = parse_algorithm_name(algo_parts[1]); if(mode_info.empty()) return nullptr; std::ostringstream alg_args; alg_args << '(' << cipher_name; for(size_t i = 1; i < mode_info.size(); ++i) alg_args << ',' << mode_info[i]; for(size_t i = 2; i < algo_parts.size(); ++i) alg_args << ',' << algo_parts[i]; alg_args << ')'; const std::string mode_name = mode_info[0] + alg_args.str(); return get_aead(mode_name, dir); } #if defined(BOTAN_HAS_BLOCK_CIPHER) SCAN_Name req(algo); if(req.arg_count() == 0) { return nullptr; } std::unique_ptr bc(BlockCipher::create(req.arg(0))); if(!bc) { return nullptr; } #if defined(BOTAN_HAS_AEAD_CCM) if(req.algo_name() == "CCM") { size_t tag_len = req.arg_as_integer(1, 16); size_t L_len = req.arg_as_integer(2, 3); if(dir == ENCRYPTION) return new CCM_Encryption(bc.release(), tag_len, L_len); else return new CCM_Decryption(bc.release(), tag_len, L_len); } #endif #if defined(BOTAN_HAS_AEAD_GCM) if(req.algo_name() == "GCM") { size_t tag_len = req.arg_as_integer(1, 16); if(dir == ENCRYPTION) return new GCM_Encryption(bc.release(), tag_len); else return new GCM_Decryption(bc.release(), tag_len); } #endif #if defined(BOTAN_HAS_AEAD_OCB) if(req.algo_name() == "OCB") { size_t tag_len = req.arg_as_integer(1, 16); if(dir == ENCRYPTION) return new OCB_Encryption(bc.release(), tag_len); else return new OCB_Decryption(bc.release(), tag_len); } #endif #if defined(BOTAN_HAS_AEAD_EAX) if(req.algo_name() == "EAX") { size_t tag_len = req.arg_as_integer(1, bc->block_size()); if(dir == ENCRYPTION) return new EAX_Encryption(bc.release(), tag_len); else return new EAX_Decryption(bc.release(), tag_len); } #endif #if defined(BOTAN_HAS_AEAD_SIV) if(req.algo_name() == "SIV") { if(dir == ENCRYPTION) return new SIV_Encryption(bc.release()); else return new SIV_Decryption(bc.release()); } #endif #endif return nullptr; } } botan-2.4.0/src/lib/modes/aead/aead.h000066400000000000000000000050531322470703100172230ustar00rootroot00000000000000/* * Interface for AEAD modes * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_MODE_H_ #define BOTAN_AEAD_MODE_H_ #include namespace Botan { /** * Interface for AEAD (Authenticated Encryption with Associated Data) * modes. These modes provide both encryption and message * authentication, and can authenticate additional per-message data * which is not included in the ciphertext (for instance a sequence * number). */ class BOTAN_PUBLIC_API(2,0) AEAD_Mode : public Cipher_Mode { public: bool authenticated() const override { return true; } /** * Set associated data that is not included in the ciphertext but * that should be authenticated. Must be called after set_key and * before start. * * Unless reset by another call, the associated data is kept * between messages. Thus, if the AD does not change, calling * once (after set_key) is the optimum. * * @param ad the associated data * @param ad_len length of add in bytes */ virtual void set_associated_data(const uint8_t ad[], size_t ad_len) = 0; /** * Set associated data that is not included in the ciphertext but * that should be authenticated. Must be called after set_key and * before start. * * See @ref set_associated_data(). * * @param ad the associated data */ template void set_associated_data_vec(const std::vector& ad) { set_associated_data(ad.data(), ad.size()); } /** * Set associated data that is not included in the ciphertext but * that should be authenticated. Must be called after set_key and * before start. * * See @ref set_associated_data(). * * @param ad the associated data */ template void set_ad(const std::vector& ad) { set_associated_data(ad.data(), ad.size()); } /** * @return default AEAD nonce size (a commonly supported value among AEAD * modes, and large enough that random collisions are unlikely) */ size_t default_nonce_length() const override { return 12; } virtual ~AEAD_Mode() = default; }; /** * Get an AEAD mode by name (eg "AES-128/GCM" or "Serpent/EAX") * @param name AEAD name * @param direction ENCRYPTION or DECRYPTION */ BOTAN_PUBLIC_API(2,0) AEAD_Mode* get_aead(const std::string& name, Cipher_Dir direction); } #endif botan-2.4.0/src/lib/modes/aead/ccm/000077500000000000000000000000001322470703100167175ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/ccm/ccm.cpp000066400000000000000000000146401322470703100201720ustar00rootroot00000000000000/* * CCM Mode Encryption * (C) 2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { // 128-bit cipher is intrinsic to CCM definition static const size_t CCM_BS = 16; /* * CCM_Mode Constructor */ CCM_Mode::CCM_Mode(BlockCipher* cipher, size_t tag_size, size_t L) : m_tag_size(tag_size), m_L(L), m_cipher(cipher) { if(m_cipher->block_size() != CCM_BS) throw Invalid_Argument(m_cipher->name() + " cannot be used with CCM mode"); if(L < 2 || L > 8) throw Invalid_Argument("Invalid CCM L value " + std::to_string(L)); if(tag_size < 4 || tag_size > 16 || tag_size % 2 != 0) throw Invalid_Argument("invalid CCM tag length " + std::to_string(tag_size)); } void CCM_Mode::clear() { m_cipher->clear(); reset(); } void CCM_Mode::reset() { m_nonce.clear(); m_msg_buf.clear(); m_ad_buf.clear(); } std::string CCM_Mode::name() const { return (m_cipher->name() + "/CCM(" + std::to_string(tag_size()) + "," + std::to_string(L())) + ")"; } bool CCM_Mode::valid_nonce_length(size_t n) const { return (n == (15-L())); } size_t CCM_Mode::default_nonce_length() const { return (15-L()); } size_t CCM_Mode::update_granularity() const { /* This value does not particularly matter as regardless CCM_Mode::update buffers all input, so in theory this could be 1. However as for instance Transform_Filter creates update_granularity() uint8_t buffers, use a somewhat large size to avoid bouncing on a tiny buffer. */ return m_cipher->parallel_bytes(); } Key_Length_Specification CCM_Mode::key_spec() const { return m_cipher->key_spec(); } void CCM_Mode::key_schedule(const uint8_t key[], size_t length) { m_cipher->set_key(key, length); } void CCM_Mode::set_associated_data(const uint8_t ad[], size_t length) { m_ad_buf.clear(); if(length) { // FIXME: support larger AD using length encoding rules BOTAN_ASSERT(length < (0xFFFF - 0xFF), "Supported CCM AD length"); m_ad_buf.push_back(get_byte(0, static_cast(length))); m_ad_buf.push_back(get_byte(1, static_cast(length))); m_ad_buf += std::make_pair(ad, length); while(m_ad_buf.size() % CCM_BS) m_ad_buf.push_back(0); // pad with zeros to full block size } } void CCM_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); m_nonce.assign(nonce, nonce + nonce_len); m_msg_buf.clear(); } size_t CCM_Mode::process(uint8_t buf[], size_t sz) { m_msg_buf.insert(m_msg_buf.end(), buf, buf + sz); return 0; // no output until finished } void CCM_Mode::encode_length(size_t len, uint8_t out[]) { const size_t len_bytes = L(); BOTAN_ASSERT(len_bytes < sizeof(size_t), "Length field fits"); for(size_t i = 0; i != len_bytes; ++i) out[len_bytes-1-i] = get_byte(sizeof(size_t)-1-i, len); BOTAN_ASSERT((len >> (len_bytes*8)) == 0, "Message length fits in field"); } void CCM_Mode::inc(secure_vector& C) { for(size_t i = 0; i != C.size(); ++i) if(++C[C.size()-i-1]) break; } secure_vector CCM_Mode::format_b0(size_t sz) { secure_vector B0(CCM_BS); const uint8_t b_flags = static_cast((m_ad_buf.size() ? 64 : 0) + (((tag_size()/2)-1) << 3) + (L()-1)); B0[0] = b_flags; copy_mem(&B0[1], m_nonce.data(), m_nonce.size()); encode_length(sz, &B0[m_nonce.size()+1]); return B0; } secure_vector CCM_Mode::format_c0() { secure_vector C(CCM_BS); const uint8_t a_flags = static_cast(L() - 1); C[0] = a_flags; copy_mem(&C[1], m_nonce.data(), m_nonce.size()); return C; } void CCM_Encryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); buffer.insert(buffer.begin() + offset, msg_buf().begin(), msg_buf().end()); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; const secure_vector& ad = ad_buf(); BOTAN_ASSERT(ad.size() % CCM_BS == 0, "AD is block size multiple"); const BlockCipher& E = cipher(); secure_vector T(CCM_BS); E.encrypt(format_b0(sz), T); for(size_t i = 0; i != ad.size(); i += CCM_BS) { xor_buf(T.data(), &ad[i], CCM_BS); E.encrypt(T); } secure_vector C = format_c0(); secure_vector S0(CCM_BS); E.encrypt(C, S0); inc(C); secure_vector X(CCM_BS); const uint8_t* buf_end = &buf[sz]; while(buf != buf_end) { const size_t to_proc = std::min(CCM_BS, buf_end - buf); xor_buf(T.data(), buf, to_proc); E.encrypt(T); E.encrypt(C, X); xor_buf(buf, X.data(), to_proc); inc(C); buf += to_proc; } T ^= S0; buffer += std::make_pair(T.data(), tag_size()); } void CCM_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); buffer.insert(buffer.begin() + offset, msg_buf().begin(), msg_buf().end()); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; BOTAN_ASSERT(sz >= tag_size(), "We have the tag"); const secure_vector& ad = ad_buf(); BOTAN_ASSERT(ad.size() % CCM_BS == 0, "AD is block size multiple"); const BlockCipher& E = cipher(); secure_vector T(CCM_BS); E.encrypt(format_b0(sz - tag_size()), T); for(size_t i = 0; i != ad.size(); i += CCM_BS) { xor_buf(T.data(), &ad[i], CCM_BS); E.encrypt(T); } secure_vector C = format_c0(); secure_vector S0(CCM_BS); E.encrypt(C, S0); inc(C); secure_vector X(CCM_BS); const uint8_t* buf_end = &buf[sz - tag_size()]; while(buf != buf_end) { const size_t to_proc = std::min(CCM_BS, buf_end - buf); E.encrypt(C, X); xor_buf(buf, X.data(), to_proc); inc(C); xor_buf(T.data(), buf, to_proc); E.encrypt(T); buf += to_proc; } T ^= S0; if(!constant_time_compare(T.data(), buf_end, tag_size())) throw Integrity_Failure("CCM tag check failed"); buffer.resize(buffer.size() - tag_size()); } } botan-2.4.0/src/lib/modes/aead/ccm/ccm.h000066400000000000000000000067421322470703100176430ustar00rootroot00000000000000/* * CCM Mode * (C) 2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_CCM_H_ #define BOTAN_AEAD_CCM_H_ #include #include namespace Botan { /** * Base class for CCM encryption and decryption * @see RFC 3610 */ class BOTAN_PUBLIC_API(2,0) CCM_Mode : public AEAD_Mode { public: size_t process(uint8_t buf[], size_t sz) override; void set_associated_data(const uint8_t ad[], size_t ad_len) override; std::string name() const override; size_t update_granularity() const override; Key_Length_Specification key_spec() const override; bool valid_nonce_length(size_t) const override; size_t default_nonce_length() const override; void clear() override; void reset() override; size_t tag_size() const override { return m_tag_size; } protected: CCM_Mode(BlockCipher* cipher, size_t tag_size, size_t L); size_t L() const { return m_L; } const BlockCipher& cipher() const { return *m_cipher; } void encode_length(size_t len, uint8_t out[]); void inc(secure_vector& C); const secure_vector& ad_buf() const { return m_ad_buf; } secure_vector& msg_buf() { return m_msg_buf; } secure_vector format_b0(size_t msg_size); secure_vector format_c0(); private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; const size_t m_tag_size; const size_t m_L; std::unique_ptr m_cipher; secure_vector m_nonce, m_msg_buf, m_ad_buf; }; /** * CCM Encryption */ class BOTAN_PUBLIC_API(2,0) CCM_Encryption final : public CCM_Mode { public: /** * @param cipher a 128-bit block cipher * @param tag_size is how big the auth tag will be (even values * between 4 and 16 are accepted) * @param L length of L parameter. The total message length * must be less than 2**L bytes, and the nonce is 15-L bytes. */ CCM_Encryption(BlockCipher* cipher, size_t tag_size = 16, size_t L = 3) : CCM_Mode(cipher, tag_size, L) {} void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override { return input_length + tag_size(); } size_t minimum_final_size() const override { return 0; } }; /** * CCM Decryption */ class BOTAN_PUBLIC_API(2,0) CCM_Decryption final : public CCM_Mode { public: /** * @param cipher a 128-bit block cipher * @param tag_size is how big the auth tag will be (even values * between 4 and 16 are accepted) * @param L length of L parameter. The total message length * must be less than 2**L bytes, and the nonce is 15-L bytes. */ CCM_Decryption(BlockCipher* cipher, size_t tag_size = 16, size_t L = 3) : CCM_Mode(cipher, tag_size, L) {} void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override { BOTAN_ASSERT(input_length >= tag_size(), "Sufficient input"); return input_length - tag_size(); } size_t minimum_final_size() const override { return tag_size(); } }; } #endif botan-2.4.0/src/lib/modes/aead/ccm/info.txt000066400000000000000000000000521322470703100204100ustar00rootroot00000000000000 AEAD_CCM -> 20131128 botan-2.4.0/src/lib/modes/aead/chacha20poly1305/000077500000000000000000000000001322470703100207435ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/chacha20poly1305/chacha20poly1305.cpp000066400000000000000000000076651322470703100242530ustar00rootroot00000000000000/* * ChaCha20Poly1305 AEAD * (C) 2014,2016 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { ChaCha20Poly1305_Mode::ChaCha20Poly1305_Mode() : m_chacha(StreamCipher::create("ChaCha")), m_poly1305(MessageAuthenticationCode::create("Poly1305")) { if(!m_chacha || !m_poly1305) throw Algorithm_Not_Found("ChaCha20Poly1305"); } bool ChaCha20Poly1305_Mode::valid_nonce_length(size_t n) const { return (n == 8 || n == 12); } void ChaCha20Poly1305_Mode::clear() { m_chacha->clear(); m_poly1305->clear(); reset(); } void ChaCha20Poly1305_Mode::reset() { m_ad.clear(); m_ctext_len = 0; m_nonce_len = 0; } void ChaCha20Poly1305_Mode::key_schedule(const uint8_t key[], size_t length) { m_chacha->set_key(key, length); } void ChaCha20Poly1305_Mode::set_associated_data(const uint8_t ad[], size_t length) { if(m_ctext_len) throw Exception("Too late to set AD for ChaCha20Poly1305"); m_ad.assign(ad, ad + length); } void ChaCha20Poly1305_Mode::update_len(size_t len) { uint8_t len8[8] = { 0 }; store_le(static_cast(len), len8); m_poly1305->update(len8, 8); } void ChaCha20Poly1305_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); m_ctext_len = 0; m_nonce_len = nonce_len; m_chacha->set_iv(nonce, nonce_len); secure_vector init(64); // zeros m_chacha->encrypt(init); m_poly1305->set_key(init.data(), 32); // Remainder of output is discard m_poly1305->update(m_ad); if(cfrg_version()) { if(m_ad.size() % 16) { const uint8_t zeros[16] = { 0 }; m_poly1305->update(zeros, 16 - m_ad.size() % 16); } } else { update_len(m_ad.size()); } } size_t ChaCha20Poly1305_Encryption::process(uint8_t buf[], size_t sz) { m_chacha->cipher1(buf, sz); m_poly1305->update(buf, sz); // poly1305 of ciphertext m_ctext_len += sz; return sz; } void ChaCha20Poly1305_Encryption::finish(secure_vector& buffer, size_t offset) { update(buffer, offset); if(cfrg_version()) { if(m_ctext_len % 16) { const uint8_t zeros[16] = { 0 }; m_poly1305->update(zeros, 16 - m_ctext_len % 16); } update_len(m_ad.size()); } update_len(m_ctext_len); const secure_vector mac = m_poly1305->final(); buffer += std::make_pair(mac.data(), tag_size()); m_ctext_len = 0; } size_t ChaCha20Poly1305_Decryption::process(uint8_t buf[], size_t sz) { m_poly1305->update(buf, sz); // poly1305 of ciphertext m_chacha->cipher1(buf, sz); m_ctext_len += sz; return sz; } void ChaCha20Poly1305_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; BOTAN_ASSERT(sz >= tag_size(), "Have the tag as part of final input"); const size_t remaining = sz - tag_size(); if(remaining) { m_poly1305->update(buf, remaining); // poly1305 of ciphertext m_chacha->cipher1(buf, remaining); m_ctext_len += remaining; } if(cfrg_version()) { if(m_ctext_len % 16) { const uint8_t zeros[16] = { 0 }; m_poly1305->update(zeros, 16 - m_ctext_len % 16); } update_len(m_ad.size()); } update_len(m_ctext_len); const secure_vector mac = m_poly1305->final(); const uint8_t* included_tag = &buf[remaining]; m_ctext_len = 0; if(!constant_time_compare(mac.data(), included_tag, tag_size())) throw Integrity_Failure("ChaCha20Poly1305 tag check failed"); buffer.resize(offset + remaining); } } botan-2.4.0/src/lib/modes/aead/chacha20poly1305/chacha20poly1305.h000066400000000000000000000052121322470703100237020ustar00rootroot00000000000000/* * ChaCha20Poly1305 AEAD * (C) 2014 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_CHACHA20_POLY1305_H_ #define BOTAN_AEAD_CHACHA20_POLY1305_H_ #include #include #include namespace Botan { /** * Base class * See draft-irtf-cfrg-chacha20-poly1305-03 for specification * If a nonce of 64 bits is used the older version described in * draft-agl-tls-chacha20poly1305-04 is used instead. */ class BOTAN_PUBLIC_API(2,0) ChaCha20Poly1305_Mode : public AEAD_Mode { public: void set_associated_data(const uint8_t ad[], size_t ad_len) override; std::string name() const override { return "ChaCha20Poly1305"; } size_t update_granularity() const override { return 64; } Key_Length_Specification key_spec() const override { return Key_Length_Specification(32); } bool valid_nonce_length(size_t n) const override; size_t tag_size() const override { return 16; } void clear() override; void reset() override; protected: std::unique_ptr m_chacha; std::unique_ptr m_poly1305; ChaCha20Poly1305_Mode(); secure_vector m_ad; size_t m_nonce_len = 0; size_t m_ctext_len = 0; bool cfrg_version() const { return m_nonce_len == 12; } void update_len(size_t len); private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; }; /** * ChaCha20Poly1305 Encryption */ class BOTAN_PUBLIC_API(2,0) ChaCha20Poly1305_Encryption final : public ChaCha20Poly1305_Mode { public: size_t output_length(size_t input_length) const override { return input_length + tag_size(); } size_t minimum_final_size() const override { return 0; } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; /** * ChaCha20Poly1305 Decryption */ class BOTAN_PUBLIC_API(2,0) ChaCha20Poly1305_Decryption final : public ChaCha20Poly1305_Mode { public: size_t output_length(size_t input_length) const override { BOTAN_ASSERT(input_length >= tag_size(), "Sufficient input"); return input_length - tag_size(); } size_t minimum_final_size() const override { return tag_size(); } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; } #endif botan-2.4.0/src/lib/modes/aead/chacha20poly1305/info.txt000066400000000000000000000001401322470703100224320ustar00rootroot00000000000000 AEAD_CHACHA20_POLY1305 -> 20141228 chacha poly1305 botan-2.4.0/src/lib/modes/aead/eax/000077500000000000000000000000001322470703100167325ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/eax/eax.cpp000066400000000000000000000100671322470703100202170ustar00rootroot00000000000000/* * EAX Mode Encryption * (C) 1999-2007 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { /* * EAX MAC-based PRF */ secure_vector eax_prf(uint8_t tag, size_t block_size, MessageAuthenticationCode& mac, const uint8_t in[], size_t length) { for(size_t i = 0; i != block_size - 1; ++i) { mac.update(0); } mac.update(tag); mac.update(in, length); return mac.final(); } } /* * EAX_Mode Constructor */ EAX_Mode::EAX_Mode(BlockCipher* cipher, size_t tag_size) : m_tag_size(tag_size ? tag_size : cipher->block_size()), m_cipher(cipher), m_ctr(new CTR_BE(m_cipher->clone())), m_cmac(new CMAC(m_cipher->clone())) { if(m_tag_size < 8 || m_tag_size > m_cmac->output_length()) throw Invalid_Argument(name() + ": Bad tag size " + std::to_string(tag_size)); } void EAX_Mode::clear() { m_cipher->clear(); m_ctr->clear(); m_cmac->clear(); reset(); } void EAX_Mode::reset() { m_ad_mac.clear(); m_nonce_mac.clear(); } std::string EAX_Mode::name() const { return (m_cipher->name() + "/EAX"); } size_t EAX_Mode::update_granularity() const { /* * For EAX this actually can be as low as 1 but that causes problems * for applications which use update_granularity as the buffer size. */ return m_cipher->parallel_bytes(); } Key_Length_Specification EAX_Mode::key_spec() const { return m_cipher->key_spec(); } /* * Set the EAX key */ void EAX_Mode::key_schedule(const uint8_t key[], size_t length) { /* * These could share the key schedule, which is one nice part of EAX, * but it's much easier to ignore that here... */ m_ctr->set_key(key, length); m_cmac->set_key(key, length); } /* * Set the EAX associated data */ void EAX_Mode::set_associated_data(const uint8_t ad[], size_t length) { m_ad_mac = eax_prf(1, block_size(), *m_cmac, ad, length); } void EAX_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); m_nonce_mac = eax_prf(0, block_size(), *m_cmac, nonce, nonce_len); m_ctr->set_iv(m_nonce_mac.data(), m_nonce_mac.size()); for(size_t i = 0; i != block_size() - 1; ++i) m_cmac->update(0); m_cmac->update(2); } size_t EAX_Encryption::process(uint8_t buf[], size_t sz) { m_ctr->cipher(buf, buf, sz); m_cmac->update(buf, sz); return sz; } void EAX_Encryption::finish(secure_vector& buffer, size_t offset) { update(buffer, offset); secure_vector data_mac = m_cmac->final(); xor_buf(data_mac, m_nonce_mac, data_mac.size()); if(m_ad_mac.empty()) { m_ad_mac = eax_prf(1, block_size(), *m_cmac, nullptr, 0); } xor_buf(data_mac, m_ad_mac, data_mac.size()); buffer += std::make_pair(data_mac.data(), tag_size()); } size_t EAX_Decryption::process(uint8_t buf[], size_t sz) { m_cmac->update(buf, sz); m_ctr->cipher(buf, buf, sz); return sz; } void EAX_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; BOTAN_ASSERT(sz >= tag_size(), "Have the tag as part of final input"); const size_t remaining = sz - tag_size(); if(remaining) { m_cmac->update(buf, remaining); m_ctr->cipher(buf, buf, remaining); } const uint8_t* included_tag = &buf[remaining]; secure_vector mac = m_cmac->final(); mac ^= m_nonce_mac; if(m_ad_mac.empty()) { m_ad_mac = eax_prf(1, block_size(), *m_cmac, nullptr, 0); } mac ^= m_ad_mac; if(!constant_time_compare(mac.data(), included_tag, tag_size())) throw Integrity_Failure("EAX tag check failed"); buffer.resize(offset + remaining); } } botan-2.4.0/src/lib/modes/aead/eax/eax.h000066400000000000000000000057131322470703100176660ustar00rootroot00000000000000/* * EAX Mode * (C) 1999-2007,2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_EAX_H_ #define BOTAN_AEAD_EAX_H_ #include #include #include #include namespace Botan { /** * EAX base class */ class BOTAN_PUBLIC_API(2,0) EAX_Mode : public AEAD_Mode { public: void set_associated_data(const uint8_t ad[], size_t ad_len) override; std::string name() const override; size_t update_granularity() const override; Key_Length_Specification key_spec() const override; // EAX supports arbitrary nonce lengths bool valid_nonce_length(size_t) const override { return true; } size_t tag_size() const override { return m_tag_size; } void clear() override; void reset() override; protected: /** * @param cipher the cipher to use * @param tag_size is how big the auth tag will be */ EAX_Mode(BlockCipher* cipher, size_t tag_size); size_t block_size() const { return m_cipher->block_size(); } size_t m_tag_size; std::unique_ptr m_cipher; std::unique_ptr m_ctr; std::unique_ptr m_cmac; secure_vector m_ad_mac; secure_vector m_nonce_mac; private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; }; /** * EAX Encryption */ class BOTAN_PUBLIC_API(2,0) EAX_Encryption final : public EAX_Mode { public: /** * @param cipher a 128-bit block cipher * @param tag_size is how big the auth tag will be */ EAX_Encryption(BlockCipher* cipher, size_t tag_size = 0) : EAX_Mode(cipher, tag_size) {} size_t output_length(size_t input_length) const override { return input_length + tag_size(); } size_t minimum_final_size() const override { return 0; } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; /** * EAX Decryption */ class BOTAN_PUBLIC_API(2,0) EAX_Decryption final : public EAX_Mode { public: /** * @param cipher a 128-bit block cipher * @param tag_size is how big the auth tag will be */ EAX_Decryption(BlockCipher* cipher, size_t tag_size = 0) : EAX_Mode(cipher, tag_size) {} size_t output_length(size_t input_length) const override { BOTAN_ASSERT(input_length >= tag_size(), "Sufficient input"); return input_length - tag_size(); } size_t minimum_final_size() const override { return tag_size(); } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; } #endif botan-2.4.0/src/lib/modes/aead/eax/info.txt000066400000000000000000000001131322470703100204210ustar00rootroot00000000000000 AEAD_EAX -> 20131128 cmac ctr botan-2.4.0/src/lib/modes/aead/gcm/000077500000000000000000000000001322470703100167235ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/gcm/clmul/000077500000000000000000000000001322470703100200375ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/gcm/clmul/clmul.cpp000066400000000000000000000133231322470703100216610ustar00rootroot00000000000000/* * CLMUL hook * (C) 2013,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { BOTAN_FUNC_ISA("sse2") inline __m128i gcm_reduce(const __m128i& B0, const __m128i& B1) { __m128i T0, T1, T2, T3; T0 = _mm_srli_epi32(B1, 31); T1 = _mm_slli_epi32(B1, 1); T2 = _mm_srli_epi32(B0, 31); T3 = _mm_slli_epi32(B0, 1); T3 = _mm_or_si128(T3, _mm_srli_si128(T0, 12)); T3 = _mm_or_si128(T3, _mm_slli_si128(T2, 4)); T1 = _mm_or_si128(T1, _mm_slli_si128(T0, 4)); T0 = _mm_xor_si128(_mm_slli_epi32(T1, 31), _mm_slli_epi32(T1, 30)); T0 = _mm_xor_si128(T0, _mm_slli_epi32(T1, 25)); T1 = _mm_xor_si128(T1, _mm_slli_si128(T0, 12)); T0 = _mm_xor_si128(T3, _mm_srli_si128(T0, 4)); T0 = _mm_xor_si128(T0, T1); T0 = _mm_xor_si128(T0, _mm_srli_epi32(T1, 7)); T0 = _mm_xor_si128(T0, _mm_srli_epi32(T1, 1)); T0 = _mm_xor_si128(T0, _mm_srli_epi32(T1, 2)); return T0; } BOTAN_FUNC_ISA("pclmul,sse2") inline __m128i gcm_multiply(const __m128i& H, const __m128i& x) { __m128i T0, T1, T2, T3; T0 = _mm_clmulepi64_si128(x, H, 0x11); T1 = _mm_clmulepi64_si128(x, H, 0x10); T2 = _mm_clmulepi64_si128(x, H, 0x01); T3 = _mm_clmulepi64_si128(x, H, 0x00); T1 = _mm_xor_si128(T1, T2); T0 = _mm_xor_si128(T0, _mm_srli_si128(T1, 8)); T3 = _mm_xor_si128(T3, _mm_slli_si128(T1, 8)); return gcm_reduce(T0, T3); } BOTAN_FUNC_ISA("pclmul,sse2") inline __m128i gcm_multiply_x4(const __m128i& H1, const __m128i& H2, const __m128i& H3, const __m128i& H4, const __m128i& X1, const __m128i& X2, const __m128i& X3, const __m128i& X4) { /* * Mutiply with delayed reduction, algorithm by Krzysztof Jankowski * and Pierre Laurent of Intel */ const __m128i H1_X1_lo = _mm_clmulepi64_si128(H1, X1, 0x00); const __m128i H2_X2_lo = _mm_clmulepi64_si128(H2, X2, 0x00); const __m128i H3_X3_lo = _mm_clmulepi64_si128(H3, X3, 0x00); const __m128i H4_X4_lo = _mm_clmulepi64_si128(H4, X4, 0x00); const __m128i lo = _mm_xor_si128( _mm_xor_si128(H1_X1_lo, H2_X2_lo), _mm_xor_si128(H3_X3_lo, H4_X4_lo)); const __m128i H1_X1_hi = _mm_clmulepi64_si128(H1, X1, 0x11); const __m128i H2_X2_hi = _mm_clmulepi64_si128(H2, X2, 0x11); const __m128i H3_X3_hi = _mm_clmulepi64_si128(H3, X3, 0x11); const __m128i H4_X4_hi = _mm_clmulepi64_si128(H4, X4, 0x11); const __m128i hi = _mm_xor_si128( _mm_xor_si128(H1_X1_hi, H2_X2_hi), _mm_xor_si128(H3_X3_hi, H4_X4_hi)); __m128i T0 = _mm_xor_si128(lo, hi); __m128i T1, T2, T3, T4; T1 = _mm_xor_si128(_mm_srli_si128(H1, 8), H1); T2 = _mm_xor_si128(_mm_srli_si128(X1, 8), X1); T3 = _mm_xor_si128(_mm_srli_si128(H2, 8), H2); T4 = _mm_xor_si128(_mm_srli_si128(X2, 8), X2); T0 = _mm_xor_si128(T0, _mm_clmulepi64_si128(T1, T2, 0x00)); T0 = _mm_xor_si128(T0, _mm_clmulepi64_si128(T3, T4, 0x00)); T1 = _mm_xor_si128(_mm_srli_si128(H3, 8), H3); T2 = _mm_xor_si128(_mm_srli_si128(X3, 8), X3); T3 = _mm_xor_si128(_mm_srli_si128(H4, 8), H4); T4 = _mm_xor_si128(_mm_srli_si128(X4, 8), X4); T0 = _mm_xor_si128(T0, _mm_clmulepi64_si128(T1, T2, 0x00)); T0 = _mm_xor_si128(T0, _mm_clmulepi64_si128(T3, T4, 0x00)); T1 = _mm_xor_si128(_mm_srli_si128(T0, 8), hi); T2 = _mm_xor_si128(_mm_slli_si128(T0, 8), lo); return gcm_reduce(T1, T2); } } BOTAN_FUNC_ISA("ssse3") void gcm_clmul_precompute(const uint8_t H_bytes[16], uint64_t H_pow[4*2]) { const __m128i BSWAP_MASK = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const __m128i H = _mm_shuffle_epi8(_mm_loadu_si128(reinterpret_cast(H_bytes)), BSWAP_MASK); const __m128i H2 = gcm_multiply(H, H); const __m128i H3 = gcm_multiply(H, H2); const __m128i H4 = gcm_multiply(H, H3); __m128i* H_pow_mm = reinterpret_cast<__m128i*>(H_pow); _mm_storeu_si128(H_pow_mm+0, H); _mm_storeu_si128(H_pow_mm+1, H2); _mm_storeu_si128(H_pow_mm+2, H3); _mm_storeu_si128(H_pow_mm+3, H4); } BOTAN_FUNC_ISA("ssse3") void gcm_multiply_clmul(uint8_t x[16], const uint64_t H_pow[8], const uint8_t input_bytes[], size_t blocks) { /* * Algorithms 1 and 5 from Intel's CLMUL guide */ const __m128i BSWAP_MASK = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const __m128i* input = reinterpret_cast(input_bytes); const __m128i* H_pow_mm = reinterpret_cast(H_pow); const __m128i H = _mm_loadu_si128(H_pow_mm); __m128i a = _mm_loadu_si128(reinterpret_cast(x)); a = _mm_shuffle_epi8(a, BSWAP_MASK); if(blocks >= 4) { const __m128i H2 = _mm_loadu_si128(H_pow_mm + 1); const __m128i H3 = _mm_loadu_si128(H_pow_mm + 2); const __m128i H4 = _mm_loadu_si128(H_pow_mm + 3); while(blocks >= 4) { const __m128i m0 = _mm_shuffle_epi8(_mm_loadu_si128(input + 0), BSWAP_MASK); const __m128i m1 = _mm_shuffle_epi8(_mm_loadu_si128(input + 1), BSWAP_MASK); const __m128i m2 = _mm_shuffle_epi8(_mm_loadu_si128(input + 2), BSWAP_MASK); const __m128i m3 = _mm_shuffle_epi8(_mm_loadu_si128(input + 3), BSWAP_MASK); a = _mm_xor_si128(a, m0); a = gcm_multiply_x4(H, H2, H3, H4, m3, m2, m1, a); input += 4; blocks -= 4; } } for(size_t i = 0; i != blocks; ++i) { const __m128i m = _mm_shuffle_epi8(_mm_loadu_si128(input + i), BSWAP_MASK); a = _mm_xor_si128(a, m); a = gcm_multiply(H, a); } a = _mm_shuffle_epi8(a, BSWAP_MASK); _mm_storeu_si128(reinterpret_cast<__m128i*>(x), a); } } botan-2.4.0/src/lib/modes/aead/gcm/clmul/clmul.h000066400000000000000000000007011322470703100213220ustar00rootroot00000000000000/* * CLMUL hook * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GCM_CLMUL_H_ #define BOTAN_GCM_CLMUL_H_ #include namespace Botan { void gcm_clmul_precompute(const uint8_t H[16], uint64_t H_pow[4*2]); void gcm_multiply_clmul(uint8_t x[16], const uint64_t H_pow[4*2], const uint8_t input[], size_t blocks); } #endif botan-2.4.0/src/lib/modes/aead/gcm/clmul/info.txt000066400000000000000000000001511322470703100215300ustar00rootroot00000000000000 GCM_CLMUL -> 20131227 need_isa aesni clmul.h botan-2.4.0/src/lib/modes/aead/gcm/clmul_ssse3/000077500000000000000000000000001322470703100211575ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/gcm/clmul_ssse3/clmul_ssse3.cpp000066400000000000000000000037131322470703100241230ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { BOTAN_FUNC_ISA("ssse3") void gcm_multiply_ssse3(uint8_t x[16], const uint64_t HM[256], const uint8_t input_bytes[], size_t blocks) { const __m128i BSWAP_MASK = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); const __m128i* HM_mm = reinterpret_cast(HM); __m128i X = _mm_loadu_si128(reinterpret_cast<__m128i*>(x)); X = _mm_shuffle_epi8(X, BSWAP_MASK); const __m128i ones = _mm_set1_epi8(-1); for(size_t b = 0; b != blocks; ++b) { __m128i M = _mm_loadu_si128(reinterpret_cast(input_bytes) + b); M = _mm_shuffle_epi8(M, BSWAP_MASK); X = _mm_xor_si128(X, M); __m128i Z = _mm_setzero_si128(); for(size_t i = 0; i != 64; i += 2) { const __m128i HM0 = _mm_loadu_si128(HM_mm + 2*i); const __m128i HM1 = _mm_loadu_si128(HM_mm + 2*i + 1); const __m128i HM2 = _mm_loadu_si128(HM_mm + 2*i + 2); const __m128i HM3 = _mm_loadu_si128(HM_mm + 2*i + 3); const __m128i XMASK1 = _mm_add_epi64(_mm_srli_epi64(X, 63), ones); X = _mm_slli_epi64(X, 1); const __m128i XMASK2 = _mm_add_epi64(_mm_srli_epi64(X, 63), ones); X = _mm_slli_epi64(X, 1); Z = _mm_xor_si128(Z, _mm_andnot_si128(_mm_unpackhi_epi64(XMASK1, XMASK1), HM0)); Z = _mm_xor_si128(Z, _mm_andnot_si128(_mm_unpacklo_epi64(XMASK1, XMASK1), HM1)); Z = _mm_xor_si128(Z, _mm_andnot_si128(_mm_unpackhi_epi64(XMASK2, XMASK2), HM2)); Z = _mm_xor_si128(Z, _mm_andnot_si128(_mm_unpacklo_epi64(XMASK2, XMASK2), HM3)); } X = _mm_shuffle_epi32(Z, _MM_SHUFFLE(1, 0, 3, 2)); } X = _mm_shuffle_epi8(X, BSWAP_MASK); _mm_storeu_si128(reinterpret_cast<__m128i*>(x), X); } } botan-2.4.0/src/lib/modes/aead/gcm/clmul_ssse3/clmul_ssse3.h000066400000000000000000000005671322470703100235740ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GCM_CLMUL_SSSE3_H_ #define BOTAN_GCM_CLMUL_SSSE3_H_ #include namespace Botan { void gcm_multiply_ssse3(uint8_t x[16], const uint64_t HM[256], const uint8_t input[], size_t blocks); } #endif botan-2.4.0/src/lib/modes/aead/gcm/clmul_ssse3/info.txt000066400000000000000000000001651322470703100226550ustar00rootroot00000000000000 GCM_CLMUL_SSSE3 -> 20171020 need_isa ssse3 clmul_ssse3.h botan-2.4.0/src/lib/modes/aead/gcm/gcm.cpp000066400000000000000000000076331322470703100202060ustar00rootroot00000000000000/* * GCM Mode Encryption * (C) 2013,2015 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * GCM_Mode Constructor */ GCM_Mode::GCM_Mode(BlockCipher* cipher, size_t tag_size) : m_tag_size(tag_size), m_cipher_name(cipher->name()) { if(cipher->block_size() != GCM_BS) throw Invalid_Argument("Invalid block cipher for GCM"); m_ghash.reset(new GHASH); m_ctr.reset(new CTR_BE(cipher, 4)); // CTR_BE takes ownership of cipher /* We allow any of the values 128, 120, 112, 104, or 96 bits as a tag size */ /* 64 bit tag is still supported but deprecated and will be removed in the future */ if(m_tag_size != 8 && (m_tag_size < 12 || m_tag_size > 16)) throw Invalid_Argument(name() + ": Bad tag size " + std::to_string(m_tag_size)); } GCM_Mode::~GCM_Mode() { /* for unique_ptr */ } void GCM_Mode::clear() { m_ctr->clear(); m_ghash->clear(); reset(); } void GCM_Mode::reset() { m_ghash->reset(); } std::string GCM_Mode::name() const { return (m_cipher_name + "/GCM(" + std::to_string(tag_size()) + ")"); } std::string GCM_Mode::provider() const { return m_ghash->provider(); } size_t GCM_Mode::update_granularity() const { return GCM_BS; } Key_Length_Specification GCM_Mode::key_spec() const { return m_ctr->key_spec(); } void GCM_Mode::key_schedule(const uint8_t key[], size_t keylen) { m_ctr->set_key(key, keylen); const std::vector zeros(GCM_BS); m_ctr->set_iv(zeros.data(), zeros.size()); secure_vector H(GCM_BS); m_ctr->encipher(H); m_ghash->set_key(H); } void GCM_Mode::set_associated_data(const uint8_t ad[], size_t ad_len) { m_ghash->set_associated_data(ad, ad_len); } void GCM_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); secure_vector y0(GCM_BS); if(nonce_len == 12) { copy_mem(y0.data(), nonce, nonce_len); y0[15] = 1; } else { y0 = m_ghash->nonce_hash(nonce, nonce_len); } m_ctr->set_iv(y0.data(), y0.size()); zeroise(y0); m_ctr->encipher(y0); m_ghash->start(y0.data(), y0.size()); } size_t GCM_Encryption::process(uint8_t buf[], size_t sz) { BOTAN_ARG_CHECK(sz % update_granularity() == 0); m_ctr->cipher(buf, buf, sz); m_ghash->update(buf, sz); return sz; } void GCM_Encryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ARG_CHECK(offset <= buffer.size()); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; m_ctr->cipher(buf, buf, sz); m_ghash->update(buf, sz); auto mac = m_ghash->final(); buffer += std::make_pair(mac.data(), tag_size()); } size_t GCM_Decryption::process(uint8_t buf[], size_t sz) { BOTAN_ARG_CHECK(sz % update_granularity() == 0); m_ghash->update(buf, sz); m_ctr->cipher(buf, buf, sz); return sz; } void GCM_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ARG_CHECK(offset <= buffer.size()); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; if(sz < tag_size()) throw Exception("Insufficient input for GCM decryption, tag missing"); const size_t remaining = sz - tag_size(); // handle any final input before the tag if(remaining) { m_ghash->update(buf, remaining); m_ctr->cipher(buf, buf, remaining); } auto mac = m_ghash->final(); const uint8_t* included_tag = &buffer[remaining+offset]; if(!constant_time_compare(mac.data(), included_tag, tag_size())) throw Integrity_Failure("GCM tag check failed"); buffer.resize(offset + remaining); } } botan-2.4.0/src/lib/modes/aead/gcm/gcm.h000066400000000000000000000054241322470703100176470ustar00rootroot00000000000000/* * GCM Mode * (C) 2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_GCM_H_ #define BOTAN_AEAD_GCM_H_ #include #include namespace Botan { class BlockCipher; class StreamCipher; class GHASH; /** * GCM Mode */ class BOTAN_PUBLIC_API(2,0) GCM_Mode : public AEAD_Mode { public: void set_associated_data(const uint8_t ad[], size_t ad_len) override; std::string name() const override; size_t update_granularity() const override; Key_Length_Specification key_spec() const override; // GCM supports arbitrary nonce lengths bool valid_nonce_length(size_t) const override { return true; } size_t tag_size() const override { return m_tag_size; } void clear() override; void reset() override; std::string provider() const override; protected: GCM_Mode(BlockCipher* cipher, size_t tag_size); ~GCM_Mode(); static const size_t GCM_BS = 16; const size_t m_tag_size; const std::string m_cipher_name; std::unique_ptr m_ctr; std::unique_ptr m_ghash; private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; }; /** * GCM Encryption */ class BOTAN_PUBLIC_API(2,0) GCM_Encryption final : public GCM_Mode { public: /** * @param cipher the 128 bit block cipher to use * @param tag_size is how big the auth tag will be */ GCM_Encryption(BlockCipher* cipher, size_t tag_size = 16) : GCM_Mode(cipher, tag_size) {} size_t output_length(size_t input_length) const override { return input_length + tag_size(); } size_t minimum_final_size() const override { return 0; } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; /** * GCM Decryption */ class BOTAN_PUBLIC_API(2,0) GCM_Decryption final : public GCM_Mode { public: /** * @param cipher the 128 bit block cipher to use * @param tag_size is how big the auth tag will be */ GCM_Decryption(BlockCipher* cipher, size_t tag_size = 16) : GCM_Mode(cipher, tag_size) {} size_t output_length(size_t input_length) const override { BOTAN_ASSERT(input_length >= tag_size(), "Sufficient input"); return input_length - tag_size(); } size_t minimum_final_size() const override { return tag_size(); } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; } #endif botan-2.4.0/src/lib/modes/aead/gcm/ghash.cpp000066400000000000000000000136611322470703100205300ustar00rootroot00000000000000/* * GCM GHASH * (C) 2013,2015,2017 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_GCM_CLMUL) #include #endif #if defined(BOTAN_HAS_GCM_CLMUL_SSSE3) #include #endif #if defined(BOTAN_HAS_GCM_PMULL) #include #endif namespace Botan { std::string GHASH::provider() const { #if defined(BOTAN_HAS_GCM_CLMUL) if(CPUID::has_clmul()) return "clmul"; #endif #if defined(BOTAN_HAS_GCM_CLMUL_SSSE3) if(CPUID::has_ssse3()) return "ssse3"; #endif #if defined(BOTAN_HAS_GCM_PMULL) if(CPUID::has_arm_pmull()) return "pmull"; #endif return "base"; } void GHASH::gcm_multiply(secure_vector& x, const uint8_t input[], size_t blocks) { #if defined(BOTAN_HAS_GCM_CLMUL) if(CPUID::has_clmul()) { return gcm_multiply_clmul(x.data(), m_H_pow.data(), input, blocks); } #endif #if defined(BOTAN_HAS_GCM_CLMUL_SSSE3) if(CPUID::has_ssse3()) { return gcm_multiply_ssse3(x.data(), m_HM.data(), input, blocks); } #endif #if defined(BOTAN_HAS_GCM_PMULL) if(CPUID::has_arm_pmull()) { return gcm_multiply_pmull(x.data(), m_H_pow.data(), input, blocks); } #endif CT::poison(x.data(), x.size()); const uint64_t ALL_BITS = 0xFFFFFFFFFFFFFFFF; uint64_t X[2] = { load_be(x.data(), 0), load_be(x.data(), 1) }; for(size_t b = 0; b != blocks; ++b) { X[0] ^= load_be(input, 2*b); X[1] ^= load_be(input, 2*b+1); uint64_t Z[2] = { 0, 0 }; for(size_t i = 0; i != 64; ++i) { const uint64_t X0MASK = (ALL_BITS + (X[0] >> 63)) ^ ALL_BITS; const uint64_t X1MASK = (ALL_BITS + (X[1] >> 63)) ^ ALL_BITS; X[0] <<= 1; X[1] <<= 1; Z[0] ^= m_HM[4*i ] & X0MASK; Z[1] ^= m_HM[4*i+1] & X0MASK; Z[0] ^= m_HM[4*i+2] & X1MASK; Z[1] ^= m_HM[4*i+3] & X1MASK; } X[0] = Z[0]; X[1] = Z[1]; } store_be(x.data(), X[0], X[1]); CT::unpoison(x.data(), x.size()); } void GHASH::ghash_update(secure_vector& ghash, const uint8_t input[], size_t length) { /* This assumes if less than block size input then we're just on the final block and should pad with zeros */ const size_t full_blocks = length / GCM_BS; const size_t final_bytes = length - (full_blocks * GCM_BS); if(full_blocks > 0) { gcm_multiply(ghash, input, full_blocks); } if(final_bytes) { secure_vector last_block(GCM_BS); copy_mem(last_block.data(), input + full_blocks * GCM_BS, final_bytes); gcm_multiply(ghash, last_block.data(), 1); } } void GHASH::key_schedule(const uint8_t key[], size_t length) { m_H.assign(key, key+length); m_H_ad.resize(GCM_BS); m_ad_len = 0; m_text_len = 0; uint64_t H0 = load_be(m_H.data(), 0); uint64_t H1 = load_be(m_H.data(), 1); const uint64_t R = 0xE100000000000000; m_HM.resize(256); // precompute the multiples of H for(size_t i = 0; i != 2; ++i) { for(size_t j = 0; j != 64; ++j) { /* we interleave H^1, H^65, H^2, H^66, H3, H67, H4, H68 to make indexing nicer in the multiplication code */ m_HM[4*j+2*i] = H0; m_HM[4*j+2*i+1] = H1; // GCM's bit ops are reversed so we carry out of the bottom const uint64_t carry = R * (H1 & 1); H1 = (H1 >> 1) | (H0 << 63); H0 = (H0 >> 1) ^ carry; } } #if defined(BOTAN_HAS_GCM_CLMUL) if(CPUID::has_clmul()) { m_H_pow.resize(8); gcm_clmul_precompute(m_H.data(), m_H_pow.data()); } #endif #if defined(BOTAN_HAS_GCM_PMULL) if(CPUID::has_arm_pmull()) { m_H_pow.resize(8); gcm_pmull_precompute(m_H.data(), m_H_pow.data()); } #endif } void GHASH::start(const uint8_t nonce[], size_t len) { m_nonce.assign(nonce, nonce + len); m_ghash = m_H_ad; } void GHASH::set_associated_data(const uint8_t input[], size_t length) { zeroise(m_H_ad); ghash_update(m_H_ad, input, length); m_ad_len = length; } void GHASH::update_associated_data(const uint8_t ad[], size_t length) { verify_key_set(m_ghash.size() == GCM_BS); m_ad_len += length; ghash_update(m_ghash, ad, length); } void GHASH::update(const uint8_t input[], size_t length) { BOTAN_ASSERT(m_ghash.size() == GCM_BS, "Key was set"); m_text_len += length; ghash_update(m_ghash, input, length); } void GHASH::add_final_block(secure_vector& hash, size_t ad_len, size_t text_len) { /* * stack buffer is fine here since the text len is public * and the length of the AD is probably not sensitive either. */ uint8_t final_block[GCM_BS]; store_be(final_block, 8*ad_len, 8*text_len); ghash_update(hash, final_block, GCM_BS); } secure_vector GHASH::final() { add_final_block(m_ghash, m_ad_len, m_text_len); secure_vector mac; mac.swap(m_ghash); mac ^= m_nonce; m_text_len = 0; return mac; } secure_vector GHASH::nonce_hash(const uint8_t nonce[], size_t nonce_len) { BOTAN_ASSERT(m_ghash.size() == 0, "nonce_hash called during wrong time"); secure_vector y0(GCM_BS); ghash_update(y0, nonce, nonce_len); add_final_block(y0, 0, nonce_len); return y0; } void GHASH::clear() { zeroise(m_H); zeroise(m_HM); reset(); } void GHASH::reset() { zeroise(m_H_ad); m_ghash.clear(); m_nonce.clear(); m_text_len = m_ad_len = 0; } } botan-2.4.0/src/lib/modes/aead/gcm/ghash.h000066400000000000000000000037101322470703100201670ustar00rootroot00000000000000/* * (C) 2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GCM_GHASH_H_ #define BOTAN_GCM_GHASH_H_ #include namespace Botan { /** * GCM's GHASH * This is not intended for general use, but is exposed to allow * shared code between GCM and GMAC */ class BOTAN_PUBLIC_API(2,0) GHASH final : public SymmetricAlgorithm { public: void set_associated_data(const uint8_t ad[], size_t ad_len); secure_vector nonce_hash(const uint8_t nonce[], size_t len); void start(const uint8_t nonce[], size_t len); /* * Assumes input len is multiple of 16 */ void update(const uint8_t in[], size_t len); /* * Incremental update of associated data */ void update_associated_data(const uint8_t ad[], size_t len); secure_vector final(); Key_Length_Specification key_spec() const override { return Key_Length_Specification(16); } void clear() override; void reset(); std::string name() const override { return "GHASH"; } std::string provider() const; void ghash_update(secure_vector& x, const uint8_t input[], size_t input_len); void add_final_block(secure_vector& x, size_t ad_len, size_t pt_len); private: void key_schedule(const uint8_t key[], size_t key_len) override; void gcm_multiply(secure_vector& x, const uint8_t input[], size_t blocks); static const size_t GCM_BS = 16; secure_vector m_H; secure_vector m_H_ad; secure_vector m_ghash; secure_vector m_nonce; secure_vector m_HM; secure_vector m_H_pow; size_t m_ad_len = 0; size_t m_text_len = 0; }; } #endif botan-2.4.0/src/lib/modes/aead/gcm/info.txt000066400000000000000000000001061322470703100204140ustar00rootroot00000000000000 AEAD_GCM -> 20131128 ctr botan-2.4.0/src/lib/modes/aead/gcm/pmull/000077500000000000000000000000001322470703100200545ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/gcm/pmull/info.txt000066400000000000000000000002151322470703100215460ustar00rootroot00000000000000 GCM_PMULL -> 20170903 arm64 gcc:4.9 clang:3.8 pmull.h botan-2.4.0/src/lib/modes/aead/gcm/pmull/pmull.cpp000066400000000000000000000141711322470703100217150ustar00rootroot00000000000000/* * Contributed by Jeffrey Walton * * Further changes * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* This follows the same pattern as the clmul implementation. See also https://conradoplg.cryptoland.net/files/2010/12/gcm14.pdf */ namespace { BOTAN_FUNC_ISA("+simd") inline uint64x2_t gcm_reduce(uint32x4_t B0, uint32x4_t B1) { const uint32x4_t zero = vdupq_n_u32(0); uint32x4_t T0, T1, T2, T3, T4, T5; T4 = vshrq_n_u32(B0, 31); T0 = vshlq_n_u32(B0, 1); T5 = vshrq_n_u32(B1, 31); T3 = vshlq_n_u32(B1, 1); T2 = vextq_u32(T4, zero, 3); T5 = vextq_u32(zero, T5, 3); T4 = vextq_u32(zero, T4, 3); T0 = vorrq_u32(T0, T4); T3 = vorrq_u32(T3, T5); T3 = vorrq_u32(T3, T2); T4 = vshlq_n_u32(T0, 31); T5 = vshlq_n_u32(T0, 30); T2 = vshlq_n_u32(T0, 25); T4 = veorq_u32(T4, T5); T4 = veorq_u32(T4, T2); T5 = vextq_u32(T4, zero, 1); T3 = veorq_u32(T3, T5); T4 = vextq_u32(zero, T4, 1); T0 = veorq_u32(T0, T4); T3 = veorq_u32(T3, T0); T4 = vshrq_n_u32(T0, 1); T1 = vshrq_n_u32(T0, 2); T2 = vshrq_n_u32(T0, 7); T3 = veorq_u32(T3, T1); T3 = veorq_u32(T3, T2); T3 = veorq_u32(T3, T4); return vreinterpretq_u64_u32(T3); } BOTAN_FUNC_ISA("+crypto") inline uint64x2_t gcm_multiply(uint64x2_t H, uint64x2_t x) { const uint32x4_t zero = vdupq_n_u32(0); const uint64_t x_hi = vgetq_lane_u64(x, 0); const uint64_t x_lo = vgetq_lane_u64(x, 1); const uint64_t H_hi = vgetq_lane_u64(H, 0); const uint64_t H_lo = vgetq_lane_u64(H, 1); uint32x4_t T0 = (uint32x4_t)vmull_p64(x_hi, H_hi); uint32x4_t T1 = (uint32x4_t)vmull_p64(x_lo, H_hi); uint32x4_t T2 = (uint32x4_t)vmull_p64(x_hi, H_lo); uint32x4_t T3 = (uint32x4_t)vmull_p64(x_lo, H_lo); T1 = veorq_u32(T1, T2); T0 = veorq_u32(T0, vextq_u32(zero, T1, 2)); T3 = veorq_u32(T3, vextq_u32(T1, zero, 2)); return gcm_reduce(T0, T3); } BOTAN_FUNC_ISA("+crypto") inline uint64x2_t gcm_multiply_x4(uint64x2_t H1, uint64x2_t H2, uint64x2_t H3, uint64x2_t H4, uint64x2_t X1, uint64x2_t X2, uint64x2_t X3, uint64x2_t X4) { const uint64_t H1_hi = vgetq_lane_u64(H1, 0); const uint64_t H1_lo = vgetq_lane_u64(H1, 1); const uint64_t H2_hi = vgetq_lane_u64(H2, 0); const uint64_t H2_lo = vgetq_lane_u64(H2, 1); const uint64_t H3_hi = vgetq_lane_u64(H3, 0); const uint64_t H3_lo = vgetq_lane_u64(H3, 1); const uint64_t H4_hi = vgetq_lane_u64(H4, 0); const uint64_t H4_lo = vgetq_lane_u64(H4, 1); const uint64_t X1_hi = vgetq_lane_u64(X1, 0); const uint64_t X1_lo = vgetq_lane_u64(X1, 1); const uint64_t X2_hi = vgetq_lane_u64(X2, 0); const uint64_t X2_lo = vgetq_lane_u64(X2, 1); const uint64_t X3_hi = vgetq_lane_u64(X3, 0); const uint64_t X3_lo = vgetq_lane_u64(X3, 1); const uint64_t X4_hi = vgetq_lane_u64(X4, 0); const uint64_t X4_lo = vgetq_lane_u64(X4, 1); const uint32x4_t H1_X1_lo = (uint32x4_t)vmull_p64(X1_lo, H1_lo); const uint32x4_t H2_X2_lo = (uint32x4_t)vmull_p64(X2_lo, H2_lo); const uint32x4_t H3_X3_lo = (uint32x4_t)vmull_p64(X3_lo, H3_lo); const uint32x4_t H4_X4_lo = (uint32x4_t)vmull_p64(X4_lo, H4_lo); const uint32x4_t lo = veorq_u32( veorq_u32(H1_X1_lo, H2_X2_lo), veorq_u32(H3_X3_lo, H4_X4_lo)); const uint32x4_t H1_X1_hi = (uint32x4_t)vmull_p64(X1_hi, H1_hi); const uint32x4_t H2_X2_hi = (uint32x4_t)vmull_p64(X2_hi, H2_hi); const uint32x4_t H3_X3_hi = (uint32x4_t)vmull_p64(X3_hi, H3_hi); const uint32x4_t H4_X4_hi = (uint32x4_t)vmull_p64(X4_hi, H4_hi); const uint32x4_t hi = veorq_u32( veorq_u32(H1_X1_hi, H2_X2_hi), veorq_u32(H3_X3_hi, H4_X4_hi)); uint32x4_t T0 = veorq_u32(lo, hi); T0 = veorq_u32(T0, (uint32x4_t)vmull_p64(X1_hi ^ X1_lo, H1_hi ^ H1_lo)); T0 = veorq_u32(T0, (uint32x4_t)vmull_p64(X2_hi ^ X2_lo, H2_hi ^ H2_lo)); T0 = veorq_u32(T0, (uint32x4_t)vmull_p64(X3_hi ^ X3_lo, H3_hi ^ H3_lo)); T0 = veorq_u32(T0, (uint32x4_t)vmull_p64(X4_hi ^ X4_lo, H4_hi ^ H4_lo)); const uint32x4_t zero = vdupq_n_u32(0); uint32x4_t B0 = veorq_u32(vextq_u32(zero, T0, 2), hi); uint32x4_t B1 = veorq_u32(vextq_u32(T0, zero, 2), lo); return gcm_reduce(B0, B1); } BOTAN_FUNC_ISA("+simd") inline uint8x16_t bswap_vec(uint8x16_t v) { const uint8_t maskb[16] = { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; const uint8x16_t mask = vld1q_u8(maskb); return vqtbl1q_u8(v, mask); } } BOTAN_FUNC_ISA("+simd") void gcm_pmull_precompute(const uint8_t H_bytes[16], uint64_t H_pow[4*2]) { const uint64x2_t H = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(H_bytes))); const uint64x2_t H2 = gcm_multiply(H, H); const uint64x2_t H3 = gcm_multiply(H, H2); const uint64x2_t H4 = gcm_multiply(H, H3); vst1q_u64(H_pow , H); vst1q_u64(H_pow+2, H2); vst1q_u64(H_pow+4, H3); vst1q_u64(H_pow+6, H4); } BOTAN_FUNC_ISA("+simd") void gcm_multiply_pmull(uint8_t x[16], const uint64_t H64[8], const uint8_t input[], size_t blocks) { const uint64x2_t H = vld1q_u64(H64); uint64x2_t a = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(x))); if(blocks >= 4) { const uint64x2_t H2 = vld1q_u64(H64 + 2); const uint64x2_t H3 = vld1q_u64(H64 + 4); const uint64x2_t H4 = vld1q_u64(H64 + 6); while(blocks >= 4) { const uint64x2_t m0 = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(input))); const uint64x2_t m1 = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(input + 16))); const uint64x2_t m2 = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(input + 32))); const uint64x2_t m3 = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(input + 48))); a = veorq_u64(a, m0); a = gcm_multiply_x4(H, H2, H3, H4, m3, m2, m1, a); input += 64; blocks -= 4; } } for(size_t i = 0; i != blocks; ++i) { const uint64x2_t m = vreinterpretq_u64_u8(bswap_vec(vld1q_u8(input + 16*i))); a = veorq_u64(a, m); a = gcm_multiply(H, a); } vst1q_u8(x, bswap_vec(vreinterpretq_u8_u64(a))); } } botan-2.4.0/src/lib/modes/aead/gcm/pmull/pmull.h000066400000000000000000000006731322470703100213640ustar00rootroot00000000000000/* * PMULL hook * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GCM_PMULL_H_ #define BOTAN_GCM_PMULL_H_ #include namespace Botan { void gcm_pmull_precompute(const uint8_t H[16], uint64_t H_pow[4*2]); void gcm_multiply_pmull(uint8_t x[16], const uint64_t H[8], const uint8_t input[], size_t blocks); } #endif botan-2.4.0/src/lib/modes/aead/info.txt000066400000000000000000000000541322470703100176500ustar00rootroot00000000000000 AEAD_MODES -> 20131128 botan-2.4.0/src/lib/modes/aead/ocb/000077500000000000000000000000001322470703100167205ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/ocb/info.txt000066400000000000000000000001131322470703100204070ustar00rootroot00000000000000 AEAD_OCB -> 20131128 poly_dbl botan-2.4.0/src/lib/modes/aead/ocb/ocb.cpp000066400000000000000000000337451322470703100202030ustar00rootroot00000000000000/* * OCB Mode * (C) 2013,2017 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { // Has to be in Botan namespace so unique_ptr can reference it class L_computer final { public: explicit L_computer(const BlockCipher& cipher) : m_BS(cipher.block_size()), m_max_blocks(cipher.parallel_bytes() / m_BS) { m_L_star.resize(m_BS); cipher.encrypt(m_L_star); m_L_dollar = poly_double(star()); m_L.push_back(poly_double(dollar())); while(m_L.size() < 8) m_L.push_back(poly_double(m_L.back())); m_offset_buf.resize(m_BS * m_max_blocks); } void init(const secure_vector& offset) { m_offset = offset; } const secure_vector& star() const { return m_L_star; } const secure_vector& dollar() const { return m_L_dollar; } const secure_vector& offset() const { return m_offset; } const secure_vector& get(size_t i) const { while(m_L.size() <= i) m_L.push_back(poly_double(m_L.back())); return m_L[i]; } const uint8_t* compute_offsets(size_t block_index, size_t blocks) { BOTAN_ASSERT(blocks <= m_max_blocks, "OCB offsets"); uint8_t* offsets = m_offset_buf.data(); if(block_index % 4 == 0) { const secure_vector& L0 = get(0); const secure_vector& L1 = get(1); while(blocks >= 4) { // ntz(4*i+1) == 0 // ntz(4*i+2) == 1 // ntz(4*i+3) == 0 block_index += 4; const size_t ntz4 = ctz(block_index); xor_buf(offsets, m_offset.data(), L0.data(), m_BS); offsets += m_BS; xor_buf(offsets, offsets - m_BS, L1.data(), m_BS); offsets += m_BS; xor_buf(m_offset.data(), L1.data(), m_BS); copy_mem(offsets, m_offset.data(), m_BS); offsets += m_BS; xor_buf(m_offset.data(), get(ntz4).data(), m_BS); copy_mem(offsets, m_offset.data(), m_BS); offsets += m_BS; blocks -= 4; } } for(size_t i = 0; i != blocks; ++i) { // could be done in parallel const size_t ntz = ctz(block_index + i + 1); xor_buf(m_offset.data(), get(ntz).data(), m_BS); copy_mem(offsets, m_offset.data(), m_BS); offsets += m_BS; } return m_offset_buf.data(); } private: secure_vector poly_double(const secure_vector& in) const { secure_vector out(in.size()); poly_double_n(out.data(), in.data(), out.size()); return out; } const size_t m_BS, m_max_blocks; secure_vector m_L_dollar, m_L_star; secure_vector m_offset; mutable std::vector> m_L; secure_vector m_offset_buf; }; namespace { /* * OCB's HASH */ secure_vector ocb_hash(const L_computer& L, const BlockCipher& cipher, const uint8_t ad[], size_t ad_len) { const size_t BS = cipher.block_size(); secure_vector sum(BS); secure_vector offset(BS); secure_vector buf(BS); const size_t ad_blocks = (ad_len / BS); const size_t ad_remainder = (ad_len % BS); for(size_t i = 0; i != ad_blocks; ++i) { // this loop could run in parallel offset ^= L.get(ctz(i+1)); buf = offset; xor_buf(buf.data(), &ad[BS*i], BS); cipher.encrypt(buf); sum ^= buf; } if(ad_remainder) { offset ^= L.star(); buf = offset; xor_buf(buf.data(), &ad[BS*ad_blocks], ad_remainder); buf[ad_remainder] ^= 0x80; cipher.encrypt(buf); sum ^= buf; } return sum; } } OCB_Mode::OCB_Mode(BlockCipher* cipher, size_t tag_size) : m_cipher(cipher), m_checksum(m_cipher->parallel_bytes()), m_ad_hash(m_cipher->block_size()), m_tag_size(tag_size), m_block_size(m_cipher->block_size()), m_par_blocks(m_cipher->parallel_bytes() / m_block_size) { const size_t BS = block_size(); /* * draft-krovetz-ocb-wide-d1 specifies OCB for several other block * sizes but only 128, 192, 256 and 512 bit are currently supported * by this implementation. */ if(BS != 16 && BS != 24 && BS != 32 && BS != 64) throw Invalid_Argument("OCB does not support cipher " + m_cipher->name()); if(m_tag_size % 4 != 0 || m_tag_size < 8 || m_tag_size > BS || m_tag_size > 32) throw Invalid_Argument("Invalid OCB tag length"); } OCB_Mode::~OCB_Mode() { /* for unique_ptr destructor */ } void OCB_Mode::clear() { m_cipher->clear(); m_L.reset(); // add clear here? reset(); } void OCB_Mode::reset() { m_block_index = 0; zeroise(m_ad_hash); zeroise(m_checksum); m_last_nonce.clear(); m_stretch.clear(); } bool OCB_Mode::valid_nonce_length(size_t length) const { if(length == 0) return false; if(block_size() == 16) return length < 16; else return length < (block_size() - 1); } std::string OCB_Mode::name() const { return m_cipher->name() + "/OCB"; // include tag size? } size_t OCB_Mode::update_granularity() const { return (m_par_blocks * block_size()); } Key_Length_Specification OCB_Mode::key_spec() const { return m_cipher->key_spec(); } void OCB_Mode::key_schedule(const uint8_t key[], size_t length) { m_cipher->set_key(key, length); m_L.reset(new L_computer(*m_cipher)); } void OCB_Mode::set_associated_data(const uint8_t ad[], size_t ad_len) { BOTAN_ASSERT(m_L, "A key was set"); m_ad_hash = ocb_hash(*m_L, *m_cipher, ad, ad_len); } secure_vector OCB_Mode::update_nonce(const uint8_t nonce[], size_t nonce_len) { const size_t BS = block_size(); BOTAN_ASSERT(BS == 16 || BS == 24 || BS == 32 || BS == 64, "OCB block size is supported"); const size_t MASKLEN = (BS == 16 ? 6 : ((BS == 24) ? 7 : 8)); const uint8_t BOTTOM_MASK = static_cast((static_cast(1) << MASKLEN) - 1); secure_vector nonce_buf(BS); copy_mem(&nonce_buf[BS - nonce_len], nonce, nonce_len); nonce_buf[0] = static_cast(((tag_size()*8) % (BS*8)) << (BS <= 16 ? 1 : 0)); nonce_buf[BS - nonce_len - 1] ^= 1; const uint8_t bottom = nonce_buf[BS-1] & BOTTOM_MASK; nonce_buf[BS-1] &= ~BOTTOM_MASK; const bool need_new_stretch = (m_last_nonce != nonce_buf); if(need_new_stretch) { m_last_nonce = nonce_buf; m_cipher->encrypt(nonce_buf); /* The loop bounds (BS vs BS/2) are derived from the relation between the block size and the MASKLEN. Using the terminology of draft-krovetz-ocb-wide, we have to derive enough bits in ShiftedKtop to read up to BLOCKLEN+bottom bits from Stretch. +----------+---------+-------+---------+ | BLOCKLEN | RESIDUE | SHIFT | MASKLEN | +----------+---------+-------+---------+ | 32 | 141 | 17 | 4 | | 64 | 27 | 25 | 5 | | 96 | 1601 | 33 | 6 | | 128 | 135 | 8 | 6 | | 192 | 135 | 40 | 7 | | 256 | 1061 | 1 | 8 | | 384 | 4109 | 80 | 8 | | 512 | 293 | 176 | 8 | | 1024 | 524355 | 352 | 9 | +----------+---------+-------+---------+ */ if(BS == 16) { for(size_t i = 0; i != BS / 2; ++i) nonce_buf.push_back(nonce_buf[i] ^ nonce_buf[i+1]); } else if(BS == 24) { for(size_t i = 0; i != 16; ++i) nonce_buf.push_back(nonce_buf[i] ^ nonce_buf[i+5]); } else if(BS == 32) { for(size_t i = 0; i != BS; ++i) nonce_buf.push_back(nonce_buf[i] ^ (nonce_buf[i] << 1) ^ (nonce_buf[i+1] >> 7)); } else if(BS == 64) { for(size_t i = 0; i != BS / 2; ++i) nonce_buf.push_back(nonce_buf[i] ^ nonce_buf[i+22]); } m_stretch = nonce_buf; } // now set the offset from stretch and bottom const size_t shift_bytes = bottom / 8; const size_t shift_bits = bottom % 8; BOTAN_ASSERT(m_stretch.size() >= BS + shift_bytes + 1, "Size ok"); secure_vector offset(BS); for(size_t i = 0; i != BS; ++i) { offset[i] = (m_stretch[i+shift_bytes] << shift_bits); offset[i] |= (m_stretch[i+shift_bytes+1] >> (8-shift_bits)); } return offset; } void OCB_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); BOTAN_ASSERT(m_L, "A key was set"); m_L->init(update_nonce(nonce, nonce_len)); zeroise(m_checksum); m_block_index = 0; } void OCB_Encryption::encrypt(uint8_t buffer[], size_t blocks) { const size_t BS = block_size(); BOTAN_ASSERT(m_L, "A key was set"); while(blocks) { const size_t proc_blocks = std::min(blocks, par_blocks()); const size_t proc_bytes = proc_blocks * BS; const uint8_t* offsets = m_L->compute_offsets(m_block_index, proc_blocks); xor_buf(m_checksum.data(), buffer, proc_bytes); m_cipher->encrypt_n_xex(buffer, offsets, proc_blocks); buffer += proc_bytes; blocks -= proc_blocks; m_block_index += proc_blocks; } } size_t OCB_Encryption::process(uint8_t buf[], size_t sz) { BOTAN_ASSERT(sz % update_granularity() == 0, "Invalid OCB input size"); encrypt(buf, sz / block_size()); return sz; } void OCB_Encryption::finish(secure_vector& buffer, size_t offset) { const size_t BS = block_size(); BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; secure_vector mac(BS); if(sz) { const size_t final_full_blocks = sz / BS; const size_t remainder_bytes = sz - (final_full_blocks * BS); encrypt(buf, final_full_blocks); mac = m_L->offset(); if(remainder_bytes) { BOTAN_ASSERT(remainder_bytes < BS, "Only a partial block left"); uint8_t* remainder = &buf[sz - remainder_bytes]; xor_buf(m_checksum.data(), remainder, remainder_bytes); m_checksum[remainder_bytes] ^= 0x80; // Offset_* mac ^= m_L->star(); secure_vector pad(BS); m_cipher->encrypt(mac, pad); xor_buf(remainder, pad.data(), remainder_bytes); } } else { mac = m_L->offset(); } // now compute the tag // fold checksum for(size_t i = 0; i != m_checksum.size(); i += BS) { xor_buf(mac.data(), m_checksum.data() + i, BS); } xor_buf(mac.data(), m_L->dollar().data(), BS); m_cipher->encrypt(mac); xor_buf(mac.data(), m_ad_hash.data(), BS); buffer += std::make_pair(mac.data(), tag_size()); zeroise(m_checksum); m_block_index = 0; } void OCB_Decryption::decrypt(uint8_t buffer[], size_t blocks) { const size_t BS = block_size(); while(blocks) { const size_t proc_blocks = std::min(blocks, par_blocks()); const size_t proc_bytes = proc_blocks * BS; const uint8_t* offsets = m_L->compute_offsets(m_block_index, proc_blocks); m_cipher->decrypt_n_xex(buffer, offsets, proc_blocks); xor_buf(m_checksum.data(), buffer, proc_bytes); buffer += proc_bytes; blocks -= proc_blocks; m_block_index += proc_blocks; } } size_t OCB_Decryption::process(uint8_t buf[], size_t sz) { BOTAN_ASSERT(sz % update_granularity() == 0, "Invalid OCB input size"); decrypt(buf, sz / block_size()); return sz; } void OCB_Decryption::finish(secure_vector& buffer, size_t offset) { const size_t BS = block_size(); BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; BOTAN_ASSERT(sz >= tag_size(), "We have the tag"); const size_t remaining = sz - tag_size(); secure_vector mac(BS); if(remaining) { const size_t final_full_blocks = remaining / BS; const size_t final_bytes = remaining - (final_full_blocks * BS); decrypt(buf, final_full_blocks); mac ^= m_L->offset(); if(final_bytes) { BOTAN_ASSERT(final_bytes < BS, "Only a partial block left"); uint8_t* remainder = &buf[remaining - final_bytes]; mac ^= m_L->star(); secure_vector pad(BS); m_cipher->encrypt(mac, pad); // P_* xor_buf(remainder, pad.data(), final_bytes); xor_buf(m_checksum.data(), remainder, final_bytes); m_checksum[final_bytes] ^= 0x80; } } else mac = m_L->offset(); // compute the mac // fold checksum for(size_t i = 0; i != m_checksum.size(); i += BS) { xor_buf(mac.data(), m_checksum.data() + i, BS); } mac ^= m_L->dollar(); m_cipher->encrypt(mac); mac ^= m_ad_hash; // reset state zeroise(m_checksum); m_block_index = 0; // compare mac const uint8_t* included_tag = &buf[remaining]; if(!constant_time_compare(mac.data(), included_tag, tag_size())) throw Integrity_Failure("OCB tag check failed"); // remove tag from end of message buffer.resize(remaining + offset); } } botan-2.4.0/src/lib/modes/aead/ocb/ocb.h000066400000000000000000000074561322470703100176500ustar00rootroot00000000000000/* * OCB Mode * (C) 2013,2014 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_OCB_H_ #define BOTAN_AEAD_OCB_H_ #include namespace Botan { class BlockCipher; class L_computer; /** * OCB Mode (base class for OCB_Encryption and OCB_Decryption). Note * that OCB is patented, but is freely licensed in some circumstances. * * @see "The OCB Authenticated-Encryption Algorithm" RFC 7253 * https://tools.ietf.org/html/rfc7253 * @see "OCB For Block Ciphers Without 128-Bit Blocks" * (draft-krovetz-ocb-wide-d3) for the extension of OCB to * block ciphers with larger block sizes. * @see Free Licenses http://www.cs.ucdavis.edu/~rogaway/ocb/license.htm * @see OCB home page http://www.cs.ucdavis.edu/~rogaway/ocb */ class BOTAN_PUBLIC_API(2,0) OCB_Mode : public AEAD_Mode { public: void set_associated_data(const uint8_t ad[], size_t ad_len) override; std::string name() const override; size_t update_granularity() const override; Key_Length_Specification key_spec() const override; bool valid_nonce_length(size_t) const override; size_t tag_size() const override { return m_tag_size; } void clear() override; void reset() override; ~OCB_Mode(); protected: /** * @param cipher the block cipher to use * @param tag_size is how big the auth tag will be */ OCB_Mode(BlockCipher* cipher, size_t tag_size); size_t block_size() const { return m_block_size; } size_t par_blocks() const { return m_par_blocks; } size_t par_bytes() const { return m_checksum.size(); } // fixme make these private std::unique_ptr m_cipher; std::unique_ptr m_L; size_t m_block_index = 0; secure_vector m_checksum; secure_vector m_ad_hash; private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; secure_vector update_nonce(const uint8_t nonce[], size_t nonce_len); const size_t m_tag_size; const size_t m_block_size; const size_t m_par_blocks; secure_vector m_last_nonce; secure_vector m_stretch; }; class BOTAN_PUBLIC_API(2,0) OCB_Encryption final : public OCB_Mode { public: /** * @param cipher the block cipher to use * @param tag_size is how big the auth tag will be */ OCB_Encryption(BlockCipher* cipher, size_t tag_size = 16) : OCB_Mode(cipher, tag_size) {} size_t output_length(size_t input_length) const override { return input_length + tag_size(); } size_t minimum_final_size() const override { return 0; } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; private: void encrypt(uint8_t input[], size_t blocks); }; class BOTAN_PUBLIC_API(2,0) OCB_Decryption final : public OCB_Mode { public: /** * @param cipher the block cipher to use * @param tag_size is how big the auth tag will be */ OCB_Decryption(BlockCipher* cipher, size_t tag_size = 16) : OCB_Mode(cipher, tag_size) {} size_t output_length(size_t input_length) const override { BOTAN_ASSERT(input_length >= tag_size(), "Sufficient input"); return input_length - tag_size(); } size_t minimum_final_size() const override { return tag_size(); } size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; private: void decrypt(uint8_t input[], size_t blocks); }; } #endif botan-2.4.0/src/lib/modes/aead/siv/000077500000000000000000000000001322470703100167565ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/aead/siv/info.txt000066400000000000000000000001421322470703100204470ustar00rootroot00000000000000 AEAD_SIV -> 20131202 load_on auto cmac ctr poly_dbl botan-2.4.0/src/lib/modes/aead/siv/siv.cpp000066400000000000000000000117411322470703100202670ustar00rootroot00000000000000/* * SIV Mode Encryption * (C) 2013,2017 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { SIV_Mode::SIV_Mode(BlockCipher* cipher) : m_name(cipher->name() + "/SIV"), m_ctr(new CTR_BE(cipher->clone(), 8)), m_mac(new CMAC(cipher)), m_bs(cipher->block_size()) { // Not really true but only 128 bit allowed at the moment if(m_bs != 16) throw Invalid_Argument("SIV requires a 128 bit block cipher"); } SIV_Mode::~SIV_Mode() { // for ~unique_ptr } void SIV_Mode::clear() { m_ctr->clear(); m_mac->clear(); reset(); } void SIV_Mode::reset() { m_nonce.clear(); m_msg_buf.clear(); m_ad_macs.clear(); } std::string SIV_Mode::name() const { return m_name; } bool SIV_Mode::valid_nonce_length(size_t) const { return true; } size_t SIV_Mode::update_granularity() const { /* This value does not particularly matter as regardless SIV_Mode::update buffers all input, so in theory this could be 1. However as for instance Transform_Filter creates update_granularity() uint8_t buffers, use a somewhat large size to avoid bouncing on a tiny buffer. */ return 128; } Key_Length_Specification SIV_Mode::key_spec() const { return m_mac->key_spec().multiple(2); } void SIV_Mode::key_schedule(const uint8_t key[], size_t length) { const size_t keylen = length / 2; m_mac->set_key(key, keylen); m_ctr->set_key(key + keylen, keylen); m_ad_macs.clear(); } void SIV_Mode::set_associated_data_n(size_t n, const uint8_t ad[], size_t length) { const size_t max_ads = block_size() * 8 - 2; if(n > max_ads) throw Invalid_Argument(name() + " allows no more than " + std::to_string(max_ads) + " ADs"); if(n >= m_ad_macs.size()) m_ad_macs.resize(n+1); m_ad_macs[n] = m_mac->process(ad, length); } void SIV_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); if(nonce_len) m_nonce = m_mac->process(nonce, nonce_len); else m_nonce.clear(); m_msg_buf.clear(); } size_t SIV_Mode::process(uint8_t buf[], size_t sz) { // all output is saved for processing in finish m_msg_buf.insert(m_msg_buf.end(), buf, buf + sz); return 0; } secure_vector SIV_Mode::S2V(const uint8_t* text, size_t text_len) { const std::vector zeros(block_size()); secure_vector V = m_mac->process(zeros.data(), zeros.size()); for(size_t i = 0; i != m_ad_macs.size(); ++i) { poly_double_n(V.data(), V.size()); V ^= m_ad_macs[i]; } if(m_nonce.size()) { poly_double_n(V.data(), V.size()); V ^= m_nonce; } if(text_len < block_size()) { poly_double_n(V.data(), V.size()); xor_buf(V.data(), text, text_len); V[text_len] ^= 0x80; return m_mac->process(V); } m_mac->update(text, text_len - block_size()); xor_buf(V.data(), &text[text_len - block_size()], block_size()); m_mac->update(V); return m_mac->final(); } void SIV_Mode::set_ctr_iv(secure_vector V) { V[m_bs-8] &= 0x7F; V[m_bs-4] &= 0x7F; ctr().set_iv(V.data(), V.size()); } void SIV_Encryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); buffer.insert(buffer.begin() + offset, msg_buf().begin(), msg_buf().end()); msg_buf().clear(); const secure_vector V = S2V(buffer.data() + offset, buffer.size() - offset); buffer.insert(buffer.begin() + offset, V.begin(), V.end()); if(buffer.size() != offset + V.size()) { set_ctr_iv(V); ctr().cipher1(&buffer[offset + V.size()], buffer.size() - offset - V.size()); } } void SIV_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); if(msg_buf().size() > 0) { buffer.insert(buffer.begin() + offset, msg_buf().begin(), msg_buf().end()); msg_buf().clear(); } const size_t sz = buffer.size() - offset; BOTAN_ASSERT(sz >= tag_size(), "We have the tag"); secure_vector V(buffer.data() + offset, buffer.data() + offset + block_size()); if(buffer.size() != offset + V.size()) { set_ctr_iv(V); ctr().cipher(buffer.data() + offset + V.size(), buffer.data() + offset, buffer.size() - offset - V.size()); } const secure_vector T = S2V(buffer.data() + offset, buffer.size() - offset - V.size()); if(!constant_time_compare(T.data(), V.data(), T.size())) throw Integrity_Failure("SIV tag check failed"); buffer.resize(buffer.size() - tag_size()); } } botan-2.4.0/src/lib/modes/aead/siv/siv.h000066400000000000000000000062231322470703100177330ustar00rootroot00000000000000/* * SIV Mode * (C) 2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AEAD_SIV_H_ #define BOTAN_AEAD_SIV_H_ #include #include namespace Botan { class BlockCipher; class MessageAuthenticationCode; /** * Base class for SIV encryption and decryption (@see RFC 5297) */ class BOTAN_PUBLIC_API(2,0) SIV_Mode : public AEAD_Mode { public: size_t process(uint8_t buf[], size_t size) override; /** * Sets the nth element of the vector of associated data * @param n index into the AD vector * @param ad associated data * @param ad_len length of associated data in bytes */ void set_associated_data_n(size_t n, const uint8_t ad[], size_t ad_len); void set_associated_data(const uint8_t ad[], size_t ad_len) override { set_associated_data_n(0, ad, ad_len); } std::string name() const override; size_t update_granularity() const override; Key_Length_Specification key_spec() const override; bool valid_nonce_length(size_t) const override; void clear() override; void reset() override; size_t tag_size() const override { return 16; } ~SIV_Mode(); protected: explicit SIV_Mode(BlockCipher* cipher); size_t block_size() const { return m_bs; } StreamCipher& ctr() { return *m_ctr; } void set_ctr_iv(secure_vector V); secure_vector& msg_buf() { return m_msg_buf; } secure_vector S2V(const uint8_t text[], size_t text_len); private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; const std::string m_name; std::unique_ptr m_ctr; std::unique_ptr m_mac; secure_vector m_nonce, m_msg_buf; std::vector> m_ad_macs; const size_t m_bs; }; /** * SIV Encryption */ class BOTAN_PUBLIC_API(2,0) SIV_Encryption final : public SIV_Mode { public: /** * @param cipher a block cipher */ explicit SIV_Encryption(BlockCipher* cipher) : SIV_Mode(cipher) {} void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override { return input_length + tag_size(); } size_t minimum_final_size() const override { return 0; } }; /** * SIV Decryption */ class BOTAN_PUBLIC_API(2,0) SIV_Decryption final : public SIV_Mode { public: /** * @param cipher a 128-bit block cipher */ explicit SIV_Decryption(BlockCipher* cipher) : SIV_Mode(cipher) {} void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override { BOTAN_ASSERT(input_length >= tag_size(), "Sufficient input"); return input_length - tag_size(); } size_t minimum_final_size() const override { return tag_size(); } }; } #endif botan-2.4.0/src/lib/modes/cbc/000077500000000000000000000000001322470703100160125ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/cbc/cbc.cpp000066400000000000000000000170721322470703100172540ustar00rootroot00000000000000/* * CBC Mode * (C) 1999-2007,2013,2017 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { CBC_Mode::CBC_Mode(BlockCipher* cipher, BlockCipherModePaddingMethod* padding) : m_cipher(cipher), m_padding(padding), m_state(m_cipher->block_size()) { if(m_padding && !m_padding->valid_blocksize(cipher->block_size())) throw Invalid_Argument("Padding " + m_padding->name() + " cannot be used with " + cipher->name() + "/CBC"); } void CBC_Mode::clear() { m_cipher->clear(); reset(); } void CBC_Mode::reset() { zeroise(m_state); } std::string CBC_Mode::name() const { if(m_padding) return cipher().name() + "/CBC/" + padding().name(); else return cipher().name() + "/CBC/CTS"; } size_t CBC_Mode::update_granularity() const { return cipher().parallel_bytes(); } Key_Length_Specification CBC_Mode::key_spec() const { return cipher().key_spec(); } size_t CBC_Mode::default_nonce_length() const { return block_size(); } bool CBC_Mode::valid_nonce_length(size_t n) const { return (n == 0 || n == block_size()); } void CBC_Mode::key_schedule(const uint8_t key[], size_t length) { m_cipher->set_key(key, length); } void CBC_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); /* * A nonce of zero length means carry the last ciphertext value over * as the new IV, as unfortunately some protocols require this. If * this is the first message then we use an IV of all zeros. */ if(nonce_len) m_state.assign(nonce, nonce + nonce_len); } size_t CBC_Encryption::minimum_final_size() const { return 0; } size_t CBC_Encryption::output_length(size_t input_length) const { if(input_length == 0) return block_size(); else return round_up(input_length, block_size()); } size_t CBC_Encryption::process(uint8_t buf[], size_t sz) { const size_t BS = block_size(); BOTAN_ASSERT(sz % BS == 0, "CBC input is full blocks"); const size_t blocks = sz / BS; if(blocks > 0) { xor_buf(&buf[0], state_ptr(), BS); cipher().encrypt(&buf[0]); for(size_t i = 1; i != blocks; ++i) { xor_buf(&buf[BS*i], &buf[BS*(i-1)], BS); cipher().encrypt(&buf[BS*i]); } state().assign(&buf[BS*(blocks-1)], &buf[BS*blocks]); } return sz; } void CBC_Encryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t BS = block_size(); const size_t bytes_in_final_block = (buffer.size()-offset) % BS; padding().add_padding(buffer, bytes_in_final_block, BS); if((buffer.size()-offset) % BS) throw Exception("Did not pad to full block size in " + name()); update(buffer, offset); } bool CTS_Encryption::valid_nonce_length(size_t n) const { return (n == block_size()); } size_t CTS_Encryption::minimum_final_size() const { return block_size() + 1; } size_t CTS_Encryption::output_length(size_t input_length) const { return input_length; // no ciphertext expansion in CTS } void CTS_Encryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); uint8_t* buf = buffer.data() + offset; const size_t sz = buffer.size() - offset; const size_t BS = block_size(); if(sz < BS + 1) throw Encoding_Error(name() + ": insufficient data to encrypt"); if(sz % BS == 0) { update(buffer, offset); // swap last two blocks for(size_t i = 0; i != BS; ++i) std::swap(buffer[buffer.size()-BS+i], buffer[buffer.size()-2*BS+i]); } else { const size_t full_blocks = ((sz / BS) - 1) * BS; const size_t final_bytes = sz - full_blocks; BOTAN_ASSERT(final_bytes > BS && final_bytes < 2*BS, "Left over size in expected range"); secure_vector last(buf + full_blocks, buf + full_blocks + final_bytes); buffer.resize(full_blocks + offset); update(buffer, offset); xor_buf(last.data(), state_ptr(), BS); cipher().encrypt(last.data()); for(size_t i = 0; i != final_bytes - BS; ++i) { last[i] ^= last[i + BS]; last[i + BS] ^= last[i]; } cipher().encrypt(last.data()); buffer += last; } } size_t CBC_Decryption::output_length(size_t input_length) const { return input_length; // precise for CTS, worst case otherwise } size_t CBC_Decryption::minimum_final_size() const { return block_size(); } size_t CBC_Decryption::process(uint8_t buf[], size_t sz) { const size_t BS = block_size(); BOTAN_ASSERT(sz % BS == 0, "Input is full blocks"); size_t blocks = sz / BS; while(blocks) { const size_t to_proc = std::min(BS * blocks, m_tempbuf.size()); cipher().decrypt_n(buf, m_tempbuf.data(), to_proc / BS); xor_buf(m_tempbuf.data(), state_ptr(), BS); xor_buf(&m_tempbuf[BS], buf, to_proc - BS); copy_mem(state_ptr(), buf + (to_proc - BS), BS); copy_mem(buf, m_tempbuf.data(), to_proc); buf += to_proc; blocks -= to_proc / BS; } return sz; } void CBC_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; const size_t BS = block_size(); if(sz == 0 || sz % BS) throw Decoding_Error(name() + ": Ciphertext not a multiple of block size"); update(buffer, offset); const size_t pad_bytes = BS - padding().unpad(&buffer[buffer.size()-BS], BS); buffer.resize(buffer.size() - pad_bytes); // remove padding if(pad_bytes == 0 && padding().name() != "NoPadding") { throw Decoding_Error(name()); } } void CBC_Decryption::reset() { zeroise(state()); zeroise(m_tempbuf); } bool CTS_Decryption::valid_nonce_length(size_t n) const { return (n == block_size()); } size_t CTS_Decryption::minimum_final_size() const { return block_size() + 1; } void CTS_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; const size_t BS = block_size(); if(sz < BS + 1) throw Encoding_Error(name() + ": insufficient data to decrypt"); if(sz % BS == 0) { // swap last two blocks for(size_t i = 0; i != BS; ++i) std::swap(buffer[buffer.size()-BS+i], buffer[buffer.size()-2*BS+i]); update(buffer, offset); } else { const size_t full_blocks = ((sz / BS) - 1) * BS; const size_t final_bytes = sz - full_blocks; BOTAN_ASSERT(final_bytes > BS && final_bytes < 2*BS, "Left over size in expected range"); secure_vector last(buf + full_blocks, buf + full_blocks + final_bytes); buffer.resize(full_blocks + offset); update(buffer, offset); cipher().decrypt(last.data()); xor_buf(last.data(), &last[BS], final_bytes - BS); for(size_t i = 0; i != final_bytes - BS; ++i) std::swap(last[i], last[i + BS]); cipher().decrypt(last.data()); xor_buf(last.data(), state_ptr(), BS); buffer += last; } } } botan-2.4.0/src/lib/modes/cbc/cbc.h000066400000000000000000000075401322470703100167200ustar00rootroot00000000000000/* * CBC mode * (C) 1999-2007,2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MODE_CBC_H_ #define BOTAN_MODE_CBC_H_ #include #include #include namespace Botan { /** * CBC Mode */ class BOTAN_PUBLIC_API(2,0) CBC_Mode : public Cipher_Mode { public: std::string name() const override; size_t update_granularity() const override; Key_Length_Specification key_spec() const override; size_t default_nonce_length() const override; bool valid_nonce_length(size_t n) const override; void clear() override; void reset() override; protected: CBC_Mode(BlockCipher* cipher, BlockCipherModePaddingMethod* padding); const BlockCipher& cipher() const { return *m_cipher; } const BlockCipherModePaddingMethod& padding() const { BOTAN_ASSERT_NONNULL(m_padding); return *m_padding; } secure_vector& state() { return m_state; } size_t block_size() const { return m_state.size(); } uint8_t* state_ptr() { return m_state.data(); } private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; std::unique_ptr m_cipher; std::unique_ptr m_padding; secure_vector m_state; }; /** * CBC Encryption */ class BOTAN_PUBLIC_API(2,0) CBC_Encryption : public CBC_Mode { public: /** * @param cipher block cipher to use * @param padding padding method to use */ CBC_Encryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding) : CBC_Mode(cipher, padding) {} size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override; size_t minimum_final_size() const override; }; /** * CBC Encryption with ciphertext stealing (CBC-CS3 variant) */ class BOTAN_PUBLIC_API(2,0) CTS_Encryption final : public CBC_Encryption { public: /** * @param cipher block cipher to use */ explicit CTS_Encryption(BlockCipher* cipher) : CBC_Encryption(cipher, nullptr) {} size_t output_length(size_t input_length) const override; void finish(secure_vector& final_block, size_t offset = 0) override; size_t minimum_final_size() const override; bool valid_nonce_length(size_t n) const override; }; /** * CBC Decryption */ class BOTAN_PUBLIC_API(2,0) CBC_Decryption : public CBC_Mode { public: /** * @param cipher block cipher to use * @param padding padding method to use */ CBC_Decryption(BlockCipher* cipher, BlockCipherModePaddingMethod* padding) : CBC_Mode(cipher, padding), m_tempbuf(update_granularity()) {} size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override; size_t minimum_final_size() const override; void reset() override; private: secure_vector m_tempbuf; }; /** * CBC Decryption with ciphertext stealing (CBC-CS3 variant) */ class BOTAN_PUBLIC_API(2,0) CTS_Decryption final : public CBC_Decryption { public: /** * @param cipher block cipher to use */ explicit CTS_Decryption(BlockCipher* cipher) : CBC_Decryption(cipher, nullptr) {} void finish(secure_vector& final_block, size_t offset = 0) override; size_t minimum_final_size() const override; bool valid_nonce_length(size_t n) const override; }; } #endif botan-2.4.0/src/lib/modes/cbc/info.txt000066400000000000000000000001131322470703100175010ustar00rootroot00000000000000 MODE_CBC -> 20131128 mode_pad botan-2.4.0/src/lib/modes/cfb/000077500000000000000000000000001322470703100160155ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/cfb/cfb.cpp000066400000000000000000000110661322470703100172570ustar00rootroot00000000000000/* * CFB Mode * (C) 1999-2007,2013,2017 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { CFB_Mode::CFB_Mode(BlockCipher* cipher, size_t feedback_bits) : m_cipher(cipher), m_block_size(m_cipher->block_size()), m_feedback_bytes(feedback_bits ? feedback_bits / 8 : m_block_size) { if(feedback_bits % 8 || feedback() > cipher->block_size()) throw Invalid_Argument(name() + ": feedback bits " + std::to_string(feedback_bits) + " not supported"); } void CFB_Mode::clear() { m_cipher->clear(); reset(); } void CFB_Mode::reset() { m_state.clear(); m_keystream.clear(); } std::string CFB_Mode::name() const { if(feedback() == cipher().block_size()) return cipher().name() + "/CFB"; else return cipher().name() + "/CFB(" + std::to_string(feedback()*8) + ")"; } size_t CFB_Mode::output_length(size_t input_length) const { return input_length; } size_t CFB_Mode::update_granularity() const { return feedback(); } size_t CFB_Mode::minimum_final_size() const { return 0; } Key_Length_Specification CFB_Mode::key_spec() const { return cipher().key_spec(); } size_t CFB_Mode::default_nonce_length() const { return block_size(); } bool CFB_Mode::valid_nonce_length(size_t n) const { return (n == 0 || n == block_size()); } void CFB_Mode::key_schedule(const uint8_t key[], size_t length) { m_cipher->set_key(key, length); } void CFB_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); if(nonce_len == 0) { if(m_state.empty()) { throw Invalid_State("CFB requires a non-empty initial nonce"); } // No reason to encrypt state->keystream_buf, because no change } else { m_state.assign(nonce, nonce + nonce_len); m_keystream.resize(m_state.size()); cipher().encrypt(m_state, m_keystream); m_keystream_pos = 0; } } void CFB_Mode::shift_register() { const size_t shift = feedback(); const size_t carryover = block_size() - shift; if(carryover > 0) { copy_mem(m_state.data(), &m_state[shift], carryover); } copy_mem(&m_state[carryover], m_keystream.data(), shift); cipher().encrypt(m_state, m_keystream); m_keystream_pos = 0; } size_t CFB_Encryption::process(uint8_t buf[], size_t sz) { const size_t shift = feedback(); size_t left = sz; if(m_keystream_pos != 0) { const size_t take = std::min(left, shift - m_keystream_pos); xor_buf(m_keystream.data() + m_keystream_pos, buf, take); copy_mem(buf, m_keystream.data() + m_keystream_pos, take); m_keystream_pos += take; left -= take; buf += take; if(m_keystream_pos == shift) { shift_register(); } } while(left >= shift) { xor_buf(m_keystream.data(), buf, shift); copy_mem(buf, m_keystream.data(), shift); left -= shift; buf += shift; shift_register(); } if(left > 0) { xor_buf(m_keystream.data(), buf, left); copy_mem(buf, m_keystream.data(), left); m_keystream_pos += left; } return sz; } void CFB_Encryption::finish(secure_vector& buffer, size_t offset) { update(buffer, offset); } namespace { inline void xor_copy(uint8_t buf[], uint8_t key_buf[], size_t len) { for(size_t i = 0; i != len; ++i) { uint8_t k = key_buf[i]; key_buf[i] = buf[i]; buf[i] ^= k; } } } size_t CFB_Decryption::process(uint8_t buf[], size_t sz) { const size_t shift = feedback(); size_t left = sz; if(m_keystream_pos != 0) { const size_t take = std::min(left, shift - m_keystream_pos); xor_copy(buf, m_keystream.data() + m_keystream_pos, take); m_keystream_pos += take; left -= take; buf += take; if(m_keystream_pos == shift) { shift_register(); } } while(left >= shift) { xor_copy(buf, m_keystream.data(), shift); left -= shift; buf += shift; shift_register(); } if(left > 0) { xor_copy(buf, m_keystream.data(), left); m_keystream_pos += left; } return sz; } void CFB_Decryption::finish(secure_vector& buffer, size_t offset) { update(buffer, offset); } } botan-2.4.0/src/lib/modes/cfb/cfb.h000066400000000000000000000053731322470703100167300ustar00rootroot00000000000000/* * CFB mode * (C) 1999-2007,2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MODE_CFB_H_ #define BOTAN_MODE_CFB_H_ #include #include namespace Botan { /** * CFB Mode */ class BOTAN_PUBLIC_API(2,0) CFB_Mode : public Cipher_Mode { public: std::string name() const override final; size_t update_granularity() const override final; size_t minimum_final_size() const override final; Key_Length_Specification key_spec() const override final; size_t output_length(size_t input_length) const override final; size_t default_nonce_length() const override final; bool valid_nonce_length(size_t n) const override final; void clear() override final; void reset() override final; protected: CFB_Mode(BlockCipher* cipher, size_t feedback_bits); void shift_register(); size_t feedback() const { return m_feedback_bytes; } const BlockCipher& cipher() const { return *m_cipher; } size_t block_size() const { return m_block_size; } secure_vector m_state; secure_vector m_keystream; size_t m_keystream_pos = 0; private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; std::unique_ptr m_cipher; const size_t m_block_size; const size_t m_feedback_bytes; }; /** * CFB Encryption */ class BOTAN_PUBLIC_API(2,0) CFB_Encryption final : public CFB_Mode { public: /** * If feedback_bits is zero, cipher->block_size() bytes will be used. * @param cipher block cipher to use * @param feedback_bits number of bits fed back into the shift register, * must be a multiple of 8 */ CFB_Encryption(BlockCipher* cipher, size_t feedback_bits) : CFB_Mode(cipher, feedback_bits) {} size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; /** * CFB Decryption */ class BOTAN_PUBLIC_API(2,0) CFB_Decryption final : public CFB_Mode { public: /** * If feedback_bits is zero, cipher->block_size() bytes will be used. * @param cipher block cipher to use * @param feedback_bits number of bits fed back into the shift register, * must be a multiple of 8 */ CFB_Decryption(BlockCipher* cipher, size_t feedback_bits) : CFB_Mode(cipher, feedback_bits) {} size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; }; } #endif botan-2.4.0/src/lib/modes/cfb/info.txt000066400000000000000000000000521322470703100175060ustar00rootroot00000000000000 MODE_CFB -> 20131128 botan-2.4.0/src/lib/modes/cipher_mode.cpp000066400000000000000000000077651322470703100202640ustar00rootroot00000000000000/* * Cipher Modes * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #if defined(BOTAN_HAS_BLOCK_CIPHER) #include #endif #if defined(BOTAN_HAS_AEAD_MODES) #include #endif #if defined(BOTAN_HAS_MODE_CBC) #include #endif #if defined(BOTAN_HAS_MODE_CFB) #include #endif #if defined(BOTAN_HAS_MODE_XTS) #include #endif #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { Cipher_Mode* get_cipher_mode(const std::string& algo, Cipher_Dir direction, const std::string& provider) { #if defined(BOTAN_HAS_OPENSSL) if(provider.empty() || provider == "openssl") { if(Cipher_Mode* bc = make_openssl_cipher_mode(algo, direction)) return bc; if(!provider.empty()) return nullptr; } #endif if(auto sc = StreamCipher::create(algo)) { return new Stream_Cipher_Mode(sc.release()); } #if defined(BOTAN_HAS_AEAD_MODES) if(auto aead = get_aead(algo, direction)) { return aead; } #endif if(algo.find('/') != std::string::npos) { const std::vector algo_parts = split_on(algo, '/'); const std::string cipher_name = algo_parts[0]; const std::vector mode_info = parse_algorithm_name(algo_parts[1]); if(mode_info.empty()) return nullptr; std::ostringstream alg_args; alg_args << '(' << cipher_name; for(size_t i = 1; i < mode_info.size(); ++i) alg_args << ',' << mode_info[i]; for(size_t i = 2; i < algo_parts.size(); ++i) alg_args << ',' << algo_parts[i]; alg_args << ')'; const std::string mode_name = mode_info[0] + alg_args.str(); return get_cipher_mode(mode_name, direction, provider); } #if defined(BOTAN_HAS_BLOCK_CIPHER) SCAN_Name spec(algo); if(spec.arg_count() == 0) { return nullptr; } std::unique_ptr bc(BlockCipher::create(spec.arg(0), provider)); if(!bc) { return nullptr; } #if defined(BOTAN_HAS_MODE_CBC) if(spec.algo_name() == "CBC") { const std::string padding = spec.arg(1, "PKCS7"); if(padding == "CTS") { if(direction == ENCRYPTION) return new CTS_Encryption(bc.release()); else return new CTS_Decryption(bc.release()); } else { std::unique_ptr pad(get_bc_pad(padding)); if(pad) { if(direction == ENCRYPTION) return new CBC_Encryption(bc.release(), pad.release()); else return new CBC_Decryption(bc.release(), pad.release()); } } } #endif #if defined(BOTAN_HAS_MODE_XTS) if(spec.algo_name() == "XTS") { if(direction == ENCRYPTION) return new XTS_Encryption(bc.release()); else return new XTS_Decryption(bc.release()); } #endif #if defined(BOTAN_HAS_MODE_CFB) if(spec.algo_name() == "CFB") { const size_t feedback_bits = spec.arg_as_integer(1, 8*bc->block_size()); if(direction == ENCRYPTION) return new CFB_Encryption(bc.release(), feedback_bits); else return new CFB_Decryption(bc.release(), feedback_bits); } #endif #endif return nullptr; } //static std::vector Cipher_Mode::providers(const std::string& algo_spec) { const std::vector& possible = { "base", "openssl" }; std::vector providers; for(auto&& prov : possible) { std::unique_ptr mode(get_cipher_mode(algo_spec, ENCRYPTION, prov)); if(mode) { providers.push_back(prov); // available } } return providers; } } botan-2.4.0/src/lib/modes/cipher_mode.h000066400000000000000000000151201322470703100177110ustar00rootroot00000000000000/* * Cipher Modes * (C) 2013,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CIPHER_MODE_H_ #define BOTAN_CIPHER_MODE_H_ #include #include #include #include #include #include namespace Botan { /** * Interface for cipher modes */ class BOTAN_PUBLIC_API(2,0) Cipher_Mode { public: virtual ~Cipher_Mode() = default; /** * @return list of available providers for this algorithm, empty if not available * @param algo_spec algorithm name */ static std::vector providers(const std::string& algo_spec); /* * Prepare for processing a message under the specified nonce */ virtual void start_msg(const uint8_t nonce[], size_t nonce_len) = 0; /** * Begin processing a message. * @param nonce the per message nonce */ template void start(const std::vector& nonce) { start_msg(nonce.data(), nonce.size()); } /** * Begin processing a message. * @param nonce the per message nonce * @param nonce_len length of nonce */ void start(const uint8_t nonce[], size_t nonce_len) { start_msg(nonce, nonce_len); } /** * Begin processing a message. */ void start() { return start_msg(nullptr, 0); } /** * Process message blocks * * Input must be a multiple of update_granularity * * Processes msg in place and returns bytes written. Normally * this will be either msg_len (indicating the entire message was * processed) or for certain AEAD modes zero (indicating that the * mode requires the entire message be processed in one pass). * * @param msg the message to be processed * @param msg_len length of the message in bytes */ virtual size_t process(uint8_t msg[], size_t msg_len) = 0; /** * Process some data. Input must be in size update_granularity() uint8_t blocks. * @param buffer in/out parameter which will possibly be resized * @param offset an offset into blocks to begin processing */ void update(secure_vector& buffer, size_t offset = 0) { BOTAN_ASSERT(buffer.size() >= offset, "Offset ok"); uint8_t* buf = buffer.data() + offset; const size_t buf_size = buffer.size() - offset; const size_t written = process(buf, buf_size); buffer.resize(offset + written); } /** * Complete processing of a message. * * @param final_block in/out parameter which must be at least * minimum_final_size() bytes, and will be set to any final output * @param offset an offset into final_block to begin processing */ virtual void finish(secure_vector& final_block, size_t offset = 0) = 0; /** * Returns the size of the output if this transform is used to process a * message with input_length bytes. Will throw if unable to give a precise * answer. */ virtual size_t output_length(size_t input_length) const = 0; /** * @return size of required blocks to update */ virtual size_t update_granularity() const = 0; /** * @return required minimium size to finalize() - may be any * length larger than this. */ virtual size_t minimum_final_size() const = 0; /** * @return the default size for a nonce */ virtual size_t default_nonce_length() const = 0; /** * @return true iff nonce_len is a valid length for the nonce */ virtual bool valid_nonce_length(size_t nonce_len) const = 0; virtual std::string name() const = 0; /** * Zeroise all state * See also reset_msg() */ virtual void clear() = 0; /** * Resets just the message specific state and allows encrypting again under the existing key */ virtual void reset() = 0; /** * @return true iff this mode provides authentication as well as * confidentiality. */ virtual bool authenticated() const { return false; } /** * @return the size of the authentication tag used (in bytes) */ virtual size_t tag_size() const { return 0; } /** * @return object describing limits on key size */ virtual Key_Length_Specification key_spec() const = 0; /** * Check whether a given key length is valid for this algorithm. * @param length the key length to be checked. * @return true if the key length is valid. */ bool valid_keylength(size_t length) const { return key_spec().valid_keylength(length); } /** * Set the symmetric key of this transform * @param key contains the key material */ template void set_key(const std::vector& key) { set_key(key.data(), key.size()); } /** * Set the symmetric key of this transform * @param key contains the key material */ void set_key(const SymmetricKey& key) { set_key(key.begin(), key.length()); } /** * Set the symmetric key of this transform * @param key contains the key material * @param length in bytes of key param */ void set_key(const uint8_t key[], size_t length) { if(!valid_keylength(length)) throw Invalid_Key_Length(name(), length); key_schedule(key, length); } /** * @return provider information about this implementation. Default is "base", * might also return "sse2", "avx2", "openssl", or some other arbitrary string. */ virtual std::string provider() const { return "base"; } private: virtual void key_schedule(const uint8_t key[], size_t length) = 0; }; /** * The two possible directions for cipher filters, determining whether they * actually perform encryption or decryption. */ enum Cipher_Dir : int { ENCRYPTION, DECRYPTION }; /** * Get a cipher mode by name (eg "AES-128/CBC" or "Serpent/XTS") * @param algo_spec cipher name * @param direction ENCRYPTION or DECRYPTION * @param provider provider implementation to choose */ BOTAN_PUBLIC_API(2,2) Cipher_Mode* get_cipher_mode(const std::string& algo_spec, Cipher_Dir direction, const std::string& provider = ""); } #endif botan-2.4.0/src/lib/modes/info.txt000066400000000000000000000001451322470703100167570ustar00rootroot00000000000000 MODES -> 20150626 cipher_mode.h stream_mode.h botan-2.4.0/src/lib/modes/mode_pad/000077500000000000000000000000001322470703100170335ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/mode_pad/info.txt000066400000000000000000000000651322470703100205300ustar00rootroot00000000000000 CIPHER_MODE_PADDING -> 20131128 botan-2.4.0/src/lib/modes/mode_pad/mode_pad.cpp000066400000000000000000000113161322470703100213110ustar00rootroot00000000000000/* * CBC Padding Methods * (C) 1999-2007,2013 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { /** * Get a block cipher padding method by name */ BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec) { if(algo_spec == "NoPadding") return new Null_Padding; if(algo_spec == "PKCS7") return new PKCS7_Padding; if(algo_spec == "OneAndZeros") return new OneAndZeros_Padding; if(algo_spec == "X9.23") return new ANSI_X923_Padding; if(algo_spec == "ESP") return new ESP_Padding; return nullptr; } /* * Pad with PKCS #7 Method */ void PKCS7_Padding::add_padding(secure_vector& buffer, size_t last_byte_pos, size_t block_size) const { const uint8_t pad_value = static_cast(block_size - last_byte_pos); for(size_t i = 0; i != pad_value; ++i) buffer.push_back(pad_value); } /* * Unpad with PKCS #7 Method */ size_t PKCS7_Padding::unpad(const uint8_t block[], size_t size) const { CT::poison(block,size); size_t bad_input = 0; const uint8_t last_byte = block[size-1]; bad_input |= CT::expand_mask(last_byte > size); size_t pad_pos = size - last_byte; size_t i = size - 2; while(i) { bad_input |= (~CT::is_equal(block[i],last_byte)) & CT::expand_mask(i >= pad_pos); --i; } CT::conditional_copy_mem(bad_input,&pad_pos,&size,&pad_pos,1); CT::unpoison(block,size); CT::unpoison(pad_pos); return pad_pos; } /* * Pad with ANSI X9.23 Method */ void ANSI_X923_Padding::add_padding(secure_vector& buffer, size_t last_byte_pos, size_t block_size) const { const uint8_t pad_value = static_cast(block_size - last_byte_pos); for(size_t i = last_byte_pos; i < block_size-1; ++i) { buffer.push_back(0); } buffer.push_back(pad_value); } /* * Unpad with ANSI X9.23 Method */ size_t ANSI_X923_Padding::unpad(const uint8_t block[], size_t size) const { CT::poison(block,size); size_t bad_input = 0; const size_t last_byte = block[size-1]; bad_input |= CT::expand_mask(last_byte > size); size_t pad_pos = size - last_byte; size_t i = size - 2; while(i) { bad_input |= (~CT::is_zero(block[i])) & CT::expand_mask(i >= pad_pos); --i; } CT::conditional_copy_mem(bad_input,&pad_pos,&size,&pad_pos,1); CT::unpoison(block,size); CT::unpoison(pad_pos); return pad_pos; } /* * Pad with One and Zeros Method */ void OneAndZeros_Padding::add_padding(secure_vector& buffer, size_t last_byte_pos, size_t block_size) const { buffer.push_back(0x80); for(size_t i = last_byte_pos + 1; i % block_size; ++i) buffer.push_back(0x00); } /* * Unpad with One and Zeros Method */ size_t OneAndZeros_Padding::unpad(const uint8_t block[], size_t size) const { CT::poison(block, size); uint8_t bad_input = 0; uint8_t seen_one = 0; size_t pad_pos = size - 1; size_t i = size; while(i) { seen_one |= CT::is_equal(block[i-1],0x80); pad_pos -= CT::select(~seen_one, 1, 0); bad_input |= ~CT::is_zero(block[i-1]) & ~seen_one; i--; } bad_input |= ~seen_one; CT::conditional_copy_mem(size_t(bad_input),&pad_pos,&size,&pad_pos,1); CT::unpoison(block, size); CT::unpoison(pad_pos); return pad_pos; } /* * Pad with ESP Padding Method */ void ESP_Padding::add_padding(secure_vector& buffer, size_t last_byte_pos, size_t block_size) const { uint8_t pad_value = 0x01; for(size_t i = last_byte_pos; i < block_size; ++i) { buffer.push_back(pad_value++); } } /* * Unpad with ESP Padding Method */ size_t ESP_Padding::unpad(const uint8_t block[], size_t size) const { CT::poison(block,size); const size_t last_byte = block[size-1]; size_t bad_input = 0; bad_input |= CT::expand_mask(last_byte > size); size_t pad_pos = size - last_byte; size_t i = size - 1; while(i) { bad_input |= ~CT::is_equal(size_t(block[i-1]),size_t(block[i])-1) & CT::expand_mask(i > pad_pos); --i; } CT::conditional_copy_mem(bad_input,&pad_pos,&size,&pad_pos,1); CT::unpoison(block, size); CT::unpoison(pad_pos); return pad_pos; } } botan-2.4.0/src/lib/modes/mode_pad/mode_pad.h000066400000000000000000000107761322470703100207670ustar00rootroot00000000000000/* * CBC Padding Methods * (C) 1999-2008,2013 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MODE_PADDING_H_ #define BOTAN_MODE_PADDING_H_ #include #include namespace Botan { /** * Block Cipher Mode Padding Method * This class is pretty limited, it cannot deal well with * randomized padding methods, or any padding method that * wants to add more than one block. For instance, it should * be possible to define cipher text stealing mode as simply * a padding mode for CBC, which happens to consume the last * two block (and requires use of the block cipher). */ class BOTAN_PUBLIC_API(2,0) BlockCipherModePaddingMethod { public: /** * Add padding bytes to buffer. * @param buffer data to pad * @param final_block_bytes size of the final block in bytes * @param block_size size of each block in bytes */ virtual void add_padding(secure_vector& buffer, size_t final_block_bytes, size_t block_size) const = 0; /** * Remove padding bytes from block * @param block the last block * @param size the size of the block in bytes * @return number of padding bytes */ virtual size_t unpad(const uint8_t block[], size_t size) const = 0; /** * @param block_size of the cipher * @return valid block size for this padding mode */ virtual bool valid_blocksize(size_t block_size) const = 0; /** * @return name of the mode */ virtual std::string name() const = 0; /** * virtual destructor */ virtual ~BlockCipherModePaddingMethod() = default; }; /** * PKCS#7 Padding */ class BOTAN_PUBLIC_API(2,0) PKCS7_Padding final : public BlockCipherModePaddingMethod { public: void add_padding(secure_vector& buffer, size_t final_block_bytes, size_t block_size) const override; size_t unpad(const uint8_t[], size_t) const override; bool valid_blocksize(size_t bs) const override { return (bs > 0 && bs < 256); } std::string name() const override { return "PKCS7"; } }; /** * ANSI X9.23 Padding */ class BOTAN_PUBLIC_API(2,0) ANSI_X923_Padding final : public BlockCipherModePaddingMethod { public: void add_padding(secure_vector& buffer, size_t final_block_bytes, size_t block_size) const override; size_t unpad(const uint8_t[], size_t) const override; bool valid_blocksize(size_t bs) const override { return (bs > 0 && bs < 256); } std::string name() const override { return "X9.23"; } }; /** * One And Zeros Padding (ISO/IEC 9797-1, padding method 2) */ class BOTAN_PUBLIC_API(2,0) OneAndZeros_Padding final : public BlockCipherModePaddingMethod { public: void add_padding(secure_vector& buffer, size_t final_block_bytes, size_t block_size) const override; size_t unpad(const uint8_t[], size_t) const override; bool valid_blocksize(size_t bs) const override { return (bs > 0); } std::string name() const override { return "OneAndZeros"; } }; /** * ESP Padding (RFC 4304) */ class BOTAN_PUBLIC_API(2,0) ESP_Padding final : public BlockCipherModePaddingMethod { public: void add_padding(secure_vector& buffer, size_t final_block_bytes, size_t block_size) const override; size_t unpad(const uint8_t[], size_t) const override; bool valid_blocksize(size_t bs) const override { return (bs > 0); } std::string name() const override { return "ESP"; } }; /** * Null Padding */ class BOTAN_PUBLIC_API(2,0) Null_Padding final : public BlockCipherModePaddingMethod { public: void add_padding(secure_vector&, size_t, size_t) const override { /* no padding */ } size_t unpad(const uint8_t[], size_t size) const override { return size; } bool valid_blocksize(size_t) const override { return true; } std::string name() const override { return "NoPadding"; } }; /** * Get a block cipher padding mode by name (eg "NoPadding" or "PKCS7") * @param algo_spec block cipher padding mode name */ BOTAN_PUBLIC_API(2,0) BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec); } #endif botan-2.4.0/src/lib/modes/stream_mode.h000066400000000000000000000035571322470703100177450ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STREAM_MODE_H_ #define BOTAN_STREAM_MODE_H_ #include #include namespace Botan { class BOTAN_PUBLIC_API(2,0) Stream_Cipher_Mode final : public Cipher_Mode { public: /** * @param cipher underyling stream cipher */ explicit Stream_Cipher_Mode(StreamCipher* cipher) : m_cipher(cipher) {} size_t process(uint8_t buf[], size_t sz) override { m_cipher->cipher1(buf, sz); return sz; } void finish(secure_vector& buf, size_t offset) override { return update(buf, offset); } size_t output_length(size_t input_length) const override { return input_length; } size_t update_granularity() const override { return 1; } size_t minimum_final_size() const override { return 0; } size_t default_nonce_length() const override { return 0; } bool valid_nonce_length(size_t nonce_len) const override { return m_cipher->valid_iv_length(nonce_len); } Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } std::string name() const override { return m_cipher->name(); } void clear() override { m_cipher->clear(); reset(); } void reset() override { /* no msg state */ } private: void start_msg(const uint8_t nonce[], size_t nonce_len) override { if(nonce_len > 0) { m_cipher->set_iv(nonce, nonce_len); } } void key_schedule(const uint8_t key[], size_t length) override { m_cipher->set_key(key, length); } std::unique_ptr m_cipher; }; } #endif botan-2.4.0/src/lib/modes/xts/000077500000000000000000000000001322470703100161015ustar00rootroot00000000000000botan-2.4.0/src/lib/modes/xts/info.txt000066400000000000000000000001131322470703100175700ustar00rootroot00000000000000 MODE_XTS -> 20131128 poly_dbl botan-2.4.0/src/lib/modes/xts/xts.cpp000066400000000000000000000135231322470703100174270ustar00rootroot00000000000000/* * XTS Mode * (C) 2009,2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { XTS_Mode::XTS_Mode(BlockCipher* cipher) : m_cipher(cipher) { if(poly_double_supported_size(m_cipher->block_size()) == false) { throw Invalid_Argument("Cannot use " + cipher->name() + " with XTS"); } m_tweak_cipher.reset(m_cipher->clone()); m_tweak.resize(update_granularity()); } void XTS_Mode::clear() { m_cipher->clear(); m_tweak_cipher->clear(); reset(); } void XTS_Mode::reset() { zeroise(m_tweak); } std::string XTS_Mode::name() const { return cipher().name() + "/XTS"; } size_t XTS_Mode::update_granularity() const { return cipher().parallel_bytes(); } size_t XTS_Mode::minimum_final_size() const { return cipher().block_size() + 1; } Key_Length_Specification XTS_Mode::key_spec() const { return cipher().key_spec().multiple(2); } size_t XTS_Mode::default_nonce_length() const { return cipher().block_size(); } bool XTS_Mode::valid_nonce_length(size_t n) const { return cipher().block_size() == n; } void XTS_Mode::key_schedule(const uint8_t key[], size_t length) { const size_t key_half = length / 2; if(length % 2 == 1 || !m_cipher->valid_keylength(key_half)) throw Invalid_Key_Length(name(), length); m_cipher->set_key(key, key_half); m_tweak_cipher->set_key(&key[key_half], key_half); } void XTS_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); copy_mem(m_tweak.data(), nonce, nonce_len); m_tweak_cipher->encrypt(m_tweak.data()); update_tweak(0); } void XTS_Mode::update_tweak(size_t which) { const size_t BS = m_tweak_cipher->block_size(); if(which > 0) poly_double_n_le(m_tweak.data(), &m_tweak[(which-1)*BS], BS); const size_t blocks_in_tweak = update_granularity() / BS; for(size_t i = 1; i < blocks_in_tweak; ++i) poly_double_n_le(&m_tweak[i*BS], &m_tweak[(i-1)*BS], BS); } size_t XTS_Encryption::output_length(size_t input_length) const { return input_length; } size_t XTS_Encryption::process(uint8_t buf[], size_t sz) { const size_t BS = cipher().block_size(); BOTAN_ASSERT(sz % BS == 0, "Input is full blocks"); size_t blocks = sz / BS; const size_t blocks_in_tweak = update_granularity() / BS; while(blocks) { const size_t to_proc = std::min(blocks, blocks_in_tweak); cipher().encrypt_n_xex(buf, tweak(), to_proc); buf += to_proc * BS; blocks -= to_proc; update_tweak(to_proc); } return sz; } void XTS_Encryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; BOTAN_ASSERT(sz >= minimum_final_size(), "Have sufficient final input in XTS encrypt"); const size_t BS = cipher().block_size(); if(sz % BS == 0) { update(buffer, offset); } else { // steal ciphertext const size_t full_blocks = ((sz / BS) - 1) * BS; const size_t final_bytes = sz - full_blocks; BOTAN_ASSERT(final_bytes > BS && final_bytes < 2*BS, "Left over size in expected range"); secure_vector last(buf + full_blocks, buf + full_blocks + final_bytes); buffer.resize(full_blocks + offset); update(buffer, offset); xor_buf(last, tweak(), BS); cipher().encrypt(last); xor_buf(last, tweak(), BS); for(size_t i = 0; i != final_bytes - BS; ++i) { last[i] ^= last[i + BS]; last[i + BS] ^= last[i]; last[i] ^= last[i + BS]; } xor_buf(last, tweak() + BS, BS); cipher().encrypt(last); xor_buf(last, tweak() + BS, BS); buffer += last; } } size_t XTS_Decryption::output_length(size_t input_length) const { return input_length; } size_t XTS_Decryption::process(uint8_t buf[], size_t sz) { const size_t BS = cipher().block_size(); BOTAN_ASSERT(sz % BS == 0, "Input is full blocks"); size_t blocks = sz / BS; const size_t blocks_in_tweak = update_granularity() / BS; while(blocks) { const size_t to_proc = std::min(blocks, blocks_in_tweak); cipher().decrypt_n_xex(buf, tweak(), to_proc); buf += to_proc * BS; blocks -= to_proc; update_tweak(to_proc); } return sz; } void XTS_Decryption::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset is sane"); const size_t sz = buffer.size() - offset; uint8_t* buf = buffer.data() + offset; BOTAN_ASSERT(sz >= minimum_final_size(), "Have sufficient final input in XTS decrypt"); const size_t BS = cipher().block_size(); if(sz % BS == 0) { update(buffer, offset); } else { // steal ciphertext const size_t full_blocks = ((sz / BS) - 1) * BS; const size_t final_bytes = sz - full_blocks; BOTAN_ASSERT(final_bytes > BS && final_bytes < 2*BS, "Left over size in expected range"); secure_vector last(buf + full_blocks, buf + full_blocks + final_bytes); buffer.resize(full_blocks + offset); update(buffer, offset); xor_buf(last, tweak() + BS, BS); cipher().decrypt(last); xor_buf(last, tweak() + BS, BS); for(size_t i = 0; i != final_bytes - BS; ++i) { last[i] ^= last[i + BS]; last[i + BS] ^= last[i]; last[i] ^= last[i + BS]; } xor_buf(last, tweak(), BS); cipher().decrypt(last); xor_buf(last, tweak(), BS); buffer += last; } } } botan-2.4.0/src/lib/modes/xts/xts.h000066400000000000000000000043111322470703100170670ustar00rootroot00000000000000/* * XTS mode, from IEEE P1619 * (C) 2009,2013 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MODE_XTS_H_ #define BOTAN_MODE_XTS_H_ #include #include namespace Botan { /** * IEEE P1619 XTS Mode */ class BOTAN_PUBLIC_API(2,0) XTS_Mode : public Cipher_Mode { public: std::string name() const override; size_t update_granularity() const override; size_t minimum_final_size() const override; Key_Length_Specification key_spec() const override; size_t default_nonce_length() const override; bool valid_nonce_length(size_t n) const override; void clear() override; void reset() override; protected: explicit XTS_Mode(BlockCipher* cipher); const uint8_t* tweak() const { return m_tweak.data(); } const BlockCipher& cipher() const { return *m_cipher; } void update_tweak(size_t last_used); private: void start_msg(const uint8_t nonce[], size_t nonce_len) override; void key_schedule(const uint8_t key[], size_t length) override; std::unique_ptr m_cipher, m_tweak_cipher; secure_vector m_tweak; }; /** * IEEE P1619 XTS Encryption */ class BOTAN_PUBLIC_API(2,0) XTS_Encryption final : public XTS_Mode { public: /** * @param cipher underlying block cipher */ explicit XTS_Encryption(BlockCipher* cipher) : XTS_Mode(cipher) {} size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override; }; /** * IEEE P1619 XTS Decryption */ class BOTAN_PUBLIC_API(2,0) XTS_Decryption final : public XTS_Mode { public: /** * @param cipher underlying block cipher */ explicit XTS_Decryption(BlockCipher* cipher) : XTS_Mode(cipher) {} size_t process(uint8_t buf[], size_t size) override; void finish(secure_vector& final_block, size_t offset = 0) override; size_t output_length(size_t input_length) const override; }; } #endif botan-2.4.0/src/lib/passhash/000077500000000000000000000000001322470703100157665ustar00rootroot00000000000000botan-2.4.0/src/lib/passhash/bcrypt/000077500000000000000000000000001322470703100172715ustar00rootroot00000000000000botan-2.4.0/src/lib/passhash/bcrypt/bcrypt.cpp000066400000000000000000000143261322470703100213060ustar00rootroot00000000000000/* * Bcrypt Password Hashing * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { std::string bcrypt_base64_encode(const uint8_t input[], size_t length) { // Bcrypt uses a non-standard base64 alphabet const uint8_t OPENBSD_BASE64_SUB[256] = { 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x38, 0x80, 0x80, 0x80, 0x39, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2E, 0x2F, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; std::string b64 = base64_encode(input, length); while(b64.size() && b64[b64.size()-1] == '=') b64 = b64.substr(0, b64.size() - 1); for(size_t i = 0; i != b64.size(); ++i) b64[i] = OPENBSD_BASE64_SUB[static_cast(b64[i])]; return b64; } std::vector bcrypt_base64_decode(std::string input) { const uint8_t OPENBSD_BASE64_SUB[256] = { 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x42, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; for(size_t i = 0; i != input.size(); ++i) input[i] = OPENBSD_BASE64_SUB[static_cast(input[i])]; return unlock(base64_decode(input)); } std::string make_bcrypt(const std::string& pass, const std::vector& salt, uint16_t work_factor) { static const uint8_t BCRYPT_MAGIC[8*3] = { 0x4F, 0x72, 0x70, 0x68, 0x65, 0x61, 0x6E, 0x42, 0x65, 0x68, 0x6F, 0x6C, 0x64, 0x65, 0x72, 0x53, 0x63, 0x72, 0x79, 0x44, 0x6F, 0x75, 0x62, 0x74 }; Blowfish blowfish; // Include the trailing NULL byte, so we need c_str() not data() blowfish.eks_key_schedule(cast_char_ptr_to_uint8(pass.c_str()), pass.length() + 1, salt.data(), work_factor); std::vector ctext(BCRYPT_MAGIC, BCRYPT_MAGIC + 8*3); for(size_t i = 0; i != 64; ++i) blowfish.encrypt_n(ctext.data(), ctext.data(), 3); std::string salt_b64 = bcrypt_base64_encode(salt.data(), salt.size()); std::string work_factor_str = std::to_string(work_factor); if(work_factor_str.length() == 1) work_factor_str = "0" + work_factor_str; return "$2a$" + work_factor_str + "$" + salt_b64.substr(0, 22) + bcrypt_base64_encode(ctext.data(), ctext.size() - 1); } } std::string generate_bcrypt(const std::string& pass, RandomNumberGenerator& rng, uint16_t work_factor) { return make_bcrypt(pass, unlock(rng.random_vec(16)), work_factor); } bool check_bcrypt(const std::string& pass, const std::string& hash) { if(hash.size() != 60 || hash[0] != '$' || hash[1] != '2' || hash[2] != 'a' || hash[3] != '$' || hash[6] != '$') { return false; } const uint16_t workfactor = to_uint16(hash.substr(4, 2)); const std::vector salt = bcrypt_base64_decode(hash.substr(7, 22)); if(salt.size() != 16) return false; const std::string compare = make_bcrypt(pass, salt, workfactor); return same_mem(hash.data(), compare.data(), compare.size()); } } botan-2.4.0/src/lib/passhash/bcrypt/bcrypt.h000066400000000000000000000017671322470703100207600ustar00rootroot00000000000000/* * Bcrypt Password Hashing * (C) 2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BCRYPT_H_ #define BOTAN_BCRYPT_H_ #include #include namespace Botan { class RandomNumberGenerator; /** * Create a password hash using Bcrypt * @param password the password * @param rng a random number generator * @param work_factor how much work to do to slow down guessing attacks * * @see https://www.usenix.org/events/usenix99/provos/provos_html/ */ std::string BOTAN_PUBLIC_API(2,0) generate_bcrypt(const std::string& password, RandomNumberGenerator& rng, uint16_t work_factor = 10); /** * Check a previously created password hash * @param password the password to check against * @param hash the stored hash to check against */ bool BOTAN_PUBLIC_API(2,0) check_bcrypt(const std::string& password, const std::string& hash); } #endif botan-2.4.0/src/lib/passhash/bcrypt/info.txt000066400000000000000000000001241322470703100207620ustar00rootroot00000000000000 BCRYPT -> 20131128 blowfish rng base64 botan-2.4.0/src/lib/passhash/passhash9/000077500000000000000000000000001322470703100176715ustar00rootroot00000000000000botan-2.4.0/src/lib/passhash/passhash9/info.txt000066400000000000000000000001251322470703100213630ustar00rootroot00000000000000 PASSHASH9 -> 20131128 pbkdf2 rng base64 botan-2.4.0/src/lib/passhash/passhash9/passhash9.cpp000066400000000000000000000076141322470703100223100ustar00rootroot00000000000000/* * Passhash9 Password Hashing * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { const std::string MAGIC_PREFIX = "$9$"; const size_t WORKFACTOR_BYTES = 2; const size_t ALGID_BYTES = 1; const size_t SALT_BYTES = 12; // 96 bits of salt const size_t PASSHASH9_PBKDF_OUTPUT_LEN = 24; // 192 bits output const size_t WORK_FACTOR_SCALE = 10000; std::unique_ptr get_pbkdf_prf(uint8_t alg_id) { if(alg_id == 0) return MessageAuthenticationCode::create("HMAC(SHA-1)"); else if(alg_id == 1) return MessageAuthenticationCode::create("HMAC(SHA-256)"); else if(alg_id == 2) return MessageAuthenticationCode::create("CMAC(Blowfish)"); else if(alg_id == 3) return MessageAuthenticationCode::create("HMAC(SHA-384)"); else if(alg_id == 4) return MessageAuthenticationCode::create("HMAC(SHA-512)"); return nullptr; } } std::string generate_passhash9(const std::string& pass, RandomNumberGenerator& rng, uint16_t work_factor, uint8_t alg_id) { std::unique_ptr prf = get_pbkdf_prf(alg_id); if(!prf) throw Invalid_Argument("Passhash9: Algorithm id " + std::to_string(alg_id) + " is not defined"); PKCS5_PBKDF2 kdf(prf.release()); // takes ownership of pointer secure_vector salt(SALT_BYTES); rng.randomize(salt.data(), salt.size()); const size_t kdf_iterations = WORK_FACTOR_SCALE * work_factor; secure_vector blob; blob.push_back(alg_id); blob.push_back(get_byte(0, work_factor)); blob.push_back(get_byte(1, work_factor)); blob += salt; blob += kdf.derive_key(PASSHASH9_PBKDF_OUTPUT_LEN, pass, salt.data(), salt.size(), kdf_iterations).bits_of(); return MAGIC_PREFIX + base64_encode(blob); } bool check_passhash9(const std::string& pass, const std::string& hash) { const size_t BINARY_LENGTH = ALGID_BYTES + WORKFACTOR_BYTES + PASSHASH9_PBKDF_OUTPUT_LEN + SALT_BYTES; const size_t BASE64_LENGTH = MAGIC_PREFIX.size() + (BINARY_LENGTH * 8) / 6; if(hash.size() != BASE64_LENGTH) return false; for(size_t i = 0; i != MAGIC_PREFIX.size(); ++i) if(hash[i] != MAGIC_PREFIX[i]) return false; secure_vector bin = base64_decode(hash.c_str() + MAGIC_PREFIX.size()); if(bin.size() != BINARY_LENGTH) return false; uint8_t alg_id = bin[0]; const size_t work_factor = load_be(&bin[ALGID_BYTES], 0); // Bug in the format, bad states shouldn't be representable, but are... if(work_factor == 0) return false; if(work_factor > 512) throw Invalid_Argument("Requested passhash9 work factor " + std::to_string(work_factor) + " is too large"); const size_t kdf_iterations = WORK_FACTOR_SCALE * work_factor; std::unique_ptr pbkdf_prf = get_pbkdf_prf(alg_id); if(!pbkdf_prf) return false; // unknown algorithm, reject PKCS5_PBKDF2 kdf(pbkdf_prf.release()); // takes ownership of pointer secure_vector cmp = kdf.derive_key( PASSHASH9_PBKDF_OUTPUT_LEN, pass, &bin[ALGID_BYTES + WORKFACTOR_BYTES], SALT_BYTES, kdf_iterations).bits_of(); return constant_time_compare(cmp.data(), &bin[ALGID_BYTES + WORKFACTOR_BYTES + SALT_BYTES], PASSHASH9_PBKDF_OUTPUT_LEN); } bool is_passhash9_alg_supported(uint8_t alg_id) { if (get_pbkdf_prf(alg_id)) { return true; } return false; } } botan-2.4.0/src/lib/passhash/passhash9/passhash9.h000066400000000000000000000026601322470703100217510ustar00rootroot00000000000000/* * Passhash9 Password Hashing * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PASSHASH9_H_ #define BOTAN_PASSHASH9_H_ #include #include namespace Botan { class RandomNumberGenerator; /** * Create a password hash using PBKDF2 * @param password the password * @param rng a random number generator * @param work_factor how much work to do to slow down guessing attacks * @param alg_id specifies which PRF to use with PBKDF2 * 0 is HMAC(SHA-1) * 1 is HMAC(SHA-256) * 2 is CMAC(Blowfish) * 3 is HMAC(SHA-384) * 4 is HMAC(SHA-512) * all other values are currently undefined */ std::string BOTAN_PUBLIC_API(2,0) generate_passhash9(const std::string& password, RandomNumberGenerator& rng, uint16_t work_factor = 10, uint8_t alg_id = 1); /** * Check a previously created password hash * @param password the password to check against * @param hash the stored hash to check against */ bool BOTAN_PUBLIC_API(2,0) check_passhash9(const std::string& password, const std::string& hash); /** * Check if the PRF used with PBKDF2 is supported * @param alg_id alg_id used in generate_passhash9() */ bool BOTAN_PUBLIC_API(2,3) is_passhash9_alg_supported(uint8_t alg_id); } #endif botan-2.4.0/src/lib/pbkdf/000077500000000000000000000000001322470703100152425ustar00rootroot00000000000000botan-2.4.0/src/lib/pbkdf/info.txt000066400000000000000000000001561322470703100167400ustar00rootroot00000000000000 PBKDF -> 20150626 base pbkdf.h botan-2.4.0/src/lib/pbkdf/pbkdf.cpp000066400000000000000000000076271322470703100170500ustar00rootroot00000000000000/* * PBKDF * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_PBKDF1) #include #endif #if defined(BOTAN_HAS_PBKDF2) #include #endif #if defined(BOTAN_HAS_PGP_S2K) #include #endif namespace Botan { std::unique_ptr PBKDF::create(const std::string& algo_spec, const std::string& provider) { const SCAN_Name req(algo_spec); #if defined(BOTAN_HAS_PBKDF2) if(req.algo_name() == "PBKDF2") { // TODO OpenSSL if(provider.empty() || provider == "base") { if(auto mac = MessageAuthenticationCode::create(req.arg(0))) return std::unique_ptr(new PKCS5_PBKDF2(mac.release())); if(auto mac = MessageAuthenticationCode::create("HMAC(" + req.arg(0) + ")")) return std::unique_ptr(new PKCS5_PBKDF2(mac.release())); } return nullptr; } #endif #if defined(BOTAN_HAS_PBKDF1) if(req.algo_name() == "PBKDF1" && req.arg_count() == 1) { if(auto hash = HashFunction::create(req.arg(0))) return std::unique_ptr(new PKCS5_PBKDF1(hash.release())); } #endif #if defined(BOTAN_HAS_PGP_S2K) if(req.algo_name() == "OpenPGP-S2K" && req.arg_count() == 1) { if(auto hash = HashFunction::create(req.arg(0))) return std::unique_ptr(new OpenPGP_S2K(hash.release())); } #endif BOTAN_UNUSED(req); BOTAN_UNUSED(provider); return nullptr; } //static std::unique_ptr PBKDF::create_or_throw(const std::string& algo, const std::string& provider) { if(auto pbkdf = PBKDF::create(algo, provider)) { return pbkdf; } throw Lookup_Error("PBKDF", algo, provider); } std::vector PBKDF::providers(const std::string& algo_spec) { return probe_providers_of(algo_spec, { "base", "openssl" }); } void PBKDF::pbkdf_timed(uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, std::chrono::milliseconds msec, size_t& iterations) const { iterations = pbkdf(out, out_len, passphrase, salt, salt_len, 0, msec); } void PBKDF::pbkdf_iterations(uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations) const { if(iterations == 0) throw Invalid_Argument(name() + ": Invalid iteration count"); const size_t iterations_run = pbkdf(out, out_len, passphrase, salt, salt_len, iterations, std::chrono::milliseconds(0)); BOTAN_ASSERT_EQUAL(iterations, iterations_run, "Expected PBKDF iterations"); } secure_vector PBKDF::pbkdf_iterations(size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations) const { secure_vector out(out_len); pbkdf_iterations(out.data(), out_len, passphrase, salt, salt_len, iterations); return out; } secure_vector PBKDF::pbkdf_timed(size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, std::chrono::milliseconds msec, size_t& iterations) const { secure_vector out(out_len); pbkdf_timed(out.data(), out_len, passphrase, salt, salt_len, msec, iterations); return out; } } botan-2.4.0/src/lib/pbkdf/pbkdf.h000066400000000000000000000225701322470703100165070ustar00rootroot00000000000000/* * PBKDF * (C) 1999-2007,2012,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PBKDF_H_ #define BOTAN_PBKDF_H_ #include #include #include namespace Botan { /** * Base class for PBKDF (password based key derivation function) * implementations. Converts a password into a key using a salt * and iterated hashing to make brute force attacks harder. */ class BOTAN_PUBLIC_API(2,0) PBKDF { public: /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to choose * @return a null pointer if the algo/provider combination cannot be found */ static std::unique_ptr create(const std::string& algo_spec, const std::string& provider = ""); /** * Create an instance based on a name, or throw if the * algo/provider combination cannot be found. If provider is * empty then best available is chosen. */ static std::unique_ptr create_or_throw(const std::string& algo_spec, const std::string& provider = ""); /** * @return list of available providers for this algorithm, empty if not available */ static std::vector providers(const std::string& algo_spec); /** * @return new instance of this same algorithm */ virtual PBKDF* clone() const = 0; /** * @return name of this PBKDF */ virtual std::string name() const = 0; virtual ~PBKDF() = default; /** * Derive a key from a passphrase for a number of iterations * specified by either iterations or if iterations == 0 then * running until msec time has elapsed. * * @param out buffer to store the derived key, must be of out_len bytes * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param iterations the number of iterations to use (use 10K or more) * @param msec if iterations is zero, then instead the PBKDF is * run until msec milliseconds has passed. * @return the number of iterations performed */ virtual size_t pbkdf(uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const = 0; /** * Derive a key from a passphrase for a number of iterations. * * @param out buffer to store the derived key, must be of out_len bytes * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param iterations the number of iterations to use (use 10K or more) */ void pbkdf_iterations(uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations) const; /** * Derive a key from a passphrase, running until msec time has elapsed. * * @param out buffer to store the derived key, must be of out_len bytes * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param msec if iterations is zero, then instead the PBKDF is * run until msec milliseconds has passed. * @param iterations set to the number iterations executed */ void pbkdf_timed(uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, std::chrono::milliseconds msec, size_t& iterations) const; /** * Derive a key from a passphrase for a number of iterations. * * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param iterations the number of iterations to use (use 10K or more) * @return the derived key */ secure_vector pbkdf_iterations(size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations) const; /** * Derive a key from a passphrase, running until msec time has elapsed. * * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param msec if iterations is zero, then instead the PBKDF is * run until msec milliseconds has passed. * @param iterations set to the number iterations executed * @return the derived key */ secure_vector pbkdf_timed(size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, std::chrono::milliseconds msec, size_t& iterations) const; // Following kept for compat with 1.10: /** * Derive a key from a passphrase * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param iterations the number of iterations to use (use 10K or more) */ OctetString derive_key(size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations) const { return pbkdf_iterations(out_len, passphrase, salt, salt_len, iterations); } /** * Derive a key from a passphrase * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param iterations the number of iterations to use (use 10K or more) */ template OctetString derive_key(size_t out_len, const std::string& passphrase, const std::vector& salt, size_t iterations) const { return pbkdf_iterations(out_len, passphrase, salt.data(), salt.size(), iterations); } /** * Derive a key from a passphrase * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param salt_len length of salt in bytes * @param msec is how long to run the PBKDF * @param iterations is set to the number of iterations used */ OctetString derive_key(size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, std::chrono::milliseconds msec, size_t& iterations) const { return pbkdf_timed(out_len, passphrase, salt, salt_len, msec, iterations); } /** * Derive a key from a passphrase using a certain amount of time * @param out_len the desired length of the key to produce * @param passphrase the password to derive the key from * @param salt a randomly chosen salt * @param msec is how long to run the PBKDF * @param iterations is set to the number of iterations used */ template OctetString derive_key(size_t out_len, const std::string& passphrase, const std::vector& salt, std::chrono::milliseconds msec, size_t& iterations) const { return pbkdf_timed(out_len, passphrase, salt.data(), salt.size(), msec, iterations); } }; /* * Compatability typedef */ typedef PBKDF S2K; /** * Password based key derivation function factory method * @param algo_spec the name of the desired PBKDF algorithm * @param provider the provider to use * @return pointer to newly allocated object of that type */ inline PBKDF* get_pbkdf(const std::string& algo_spec, const std::string& provider = "") { std::unique_ptr p(PBKDF::create(algo_spec, provider)); if(p) return p.release(); throw Algorithm_Not_Found(algo_spec); } inline PBKDF* get_s2k(const std::string& algo_spec) { return get_pbkdf(algo_spec); } } #endif botan-2.4.0/src/lib/pbkdf/pbkdf1/000077500000000000000000000000001322470703100164115ustar00rootroot00000000000000botan-2.4.0/src/lib/pbkdf/pbkdf1/info.txt000066400000000000000000000001051322470703100201010ustar00rootroot00000000000000 PBKDF1 -> 20131128 hash botan-2.4.0/src/lib/pbkdf/pbkdf1/pbkdf1.cpp000066400000000000000000000027041322470703100202670ustar00rootroot00000000000000/* * PBKDF1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { size_t PKCS5_PBKDF1::pbkdf(uint8_t output_buf[], size_t output_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const { if(output_len > m_hash->output_length()) throw Invalid_Argument("PKCS5_PBKDF1: Requested output length too long"); m_hash->update(passphrase); m_hash->update(salt, salt_len); secure_vector key = m_hash->final(); const auto start = std::chrono::high_resolution_clock::now(); size_t iterations_performed = 1; while(true) { if(iterations == 0) { if(iterations_performed % 10000 == 0) { auto time_taken = std::chrono::high_resolution_clock::now() - start; auto msec_taken = std::chrono::duration_cast(time_taken); if(msec_taken > msec) break; } } else if(iterations_performed == iterations) break; m_hash->update(key); m_hash->final(key.data()); ++iterations_performed; } copy_mem(output_buf, key.data(), output_len); return iterations_performed; } } botan-2.4.0/src/lib/pbkdf/pbkdf1/pbkdf1.h000066400000000000000000000024121322470703100177300ustar00rootroot00000000000000/* * PBKDF1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PBKDF1_H_ #define BOTAN_PBKDF1_H_ #include #include namespace Botan { /** * PKCS #5 v1 PBKDF, aka PBKDF1 * Can only generate a key up to the size of the hash output. * Unless needed for backwards compatibility, use PKCS5_PBKDF2 */ class BOTAN_PUBLIC_API(2,0) PKCS5_PBKDF1 final : public PBKDF { public: /** * Create a PKCS #5 instance using the specified hash function. * @param hash pointer to a hash function object to use */ explicit PKCS5_PBKDF1(HashFunction* hash) : m_hash(hash) {} std::string name() const override { return "PBKDF1(" + m_hash->name() + ")"; } PBKDF* clone() const override { return new PKCS5_PBKDF1(m_hash->clone()); } size_t pbkdf(uint8_t output_buf[], size_t output_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const override; private: std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/pbkdf/pbkdf2/000077500000000000000000000000001322470703100164125ustar00rootroot00000000000000botan-2.4.0/src/lib/pbkdf/pbkdf2/info.txt000066400000000000000000000001051322470703100201020ustar00rootroot00000000000000 PBKDF2 -> 20131128 hmac botan-2.4.0/src/lib/pbkdf/pbkdf2/pbkdf2.cpp000066400000000000000000000061431322470703100202720ustar00rootroot00000000000000/* * PBKDF2 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { size_t pbkdf2(MessageAuthenticationCode& prf, uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) { clear_mem(out, out_len); if(out_len == 0) return 0; try { prf.set_key(cast_char_ptr_to_uint8(passphrase.data()), passphrase.size()); } catch(Invalid_Key_Length&) { throw Exception("PBKDF2 with " + prf.name() + " cannot accept passphrases of length " + std::to_string(passphrase.size())); } const size_t prf_sz = prf.output_length(); secure_vector U(prf_sz); const size_t blocks_needed = round_up(out_len, prf_sz) / prf_sz; std::chrono::microseconds usec_per_block = std::chrono::duration_cast(msec) / blocks_needed; uint32_t counter = 1; while(out_len) { const size_t prf_output = std::min(prf_sz, out_len); prf.update(salt, salt_len); prf.update_be(counter++); prf.final(U.data()); xor_buf(out, U.data(), prf_output); if(iterations == 0) { /* If no iterations set, run the first block to calibrate based on how long hashing takes on whatever machine we're running on. */ const auto start = std::chrono::high_resolution_clock::now(); iterations = 1; // the first iteration we did above while(true) { prf.update(U); prf.final(U.data()); xor_buf(out, U.data(), prf_output); iterations++; /* Only break on relatively 'even' iterations. For one it avoids confusion, and likely some broken implementations break on getting completely randomly distributed values */ if(iterations % 10000 == 0) { auto time_taken = std::chrono::high_resolution_clock::now() - start; auto usec_taken = std::chrono::duration_cast(time_taken); if(usec_taken > usec_per_block) break; } } } else { for(size_t i = 1; i != iterations; ++i) { prf.update(U); prf.final(U.data()); xor_buf(out, U.data(), prf_output); } } out_len -= prf_output; out += prf_output; } return iterations; } size_t PKCS5_PBKDF2::pbkdf(uint8_t key[], size_t key_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const { return pbkdf2(*m_mac.get(), key, key_len, passphrase, salt, salt_len, iterations, msec); } } botan-2.4.0/src/lib/pbkdf/pbkdf2/pbkdf2.h000066400000000000000000000027461322470703100177440ustar00rootroot00000000000000/* * PBKDF2 * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PBKDF2_H_ #define BOTAN_PBKDF2_H_ #include #include namespace Botan { BOTAN_PUBLIC_API(2,0) size_t pbkdf2(MessageAuthenticationCode& prf, uint8_t out[], size_t out_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec); /** * PKCS #5 PBKDF2 */ class BOTAN_PUBLIC_API(2,0) PKCS5_PBKDF2 final : public PBKDF { public: std::string name() const override { return "PBKDF2(" + m_mac->name() + ")"; } PBKDF* clone() const override { return new PKCS5_PBKDF2(m_mac->clone()); } size_t pbkdf(uint8_t output_buf[], size_t output_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const override; /** * Create a PKCS #5 instance using the specified message auth code * @param mac_fn the MAC object to use as PRF */ explicit PKCS5_PBKDF2(MessageAuthenticationCode* mac_fn) : m_mac(mac_fn) {} private: std::unique_ptr m_mac; }; } #endif botan-2.4.0/src/lib/pbkdf/pgp_s2k/000077500000000000000000000000001322470703100166075ustar00rootroot00000000000000botan-2.4.0/src/lib/pbkdf/pgp_s2k/info.txt000066400000000000000000000001061322470703100203000ustar00rootroot00000000000000 PGP_S2K -> 20170527 hash botan-2.4.0/src/lib/pbkdf/pgp_s2k/pgp_s2k.cpp000066400000000000000000000114311322470703100206600ustar00rootroot00000000000000/* * OpenPGP S2K * (C) 1999-2007,2017 Jack Lloyd * * Distributed under the terms of the Botan license */ #include namespace Botan { /* PGP stores the iteration count as a single byte Thus it can only actually take on one of 256 values, based on the formula in RFC 4880 section 3.6.1.3 */ static const uint32_t OPENPGP_S2K_ITERS[256] = { 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728, 1792, 1856, 1920, 1984, 2048, 2176, 2304, 2432, 2560, 2688, 2816, 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840, 3968, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656, 6912, 7168, 7424, 7680, 7936, 8192, 8704, 9216, 9728, 10240, 10752, 11264, 11776, 12288, 12800, 13312, 13824, 14336, 14848, 15360, 15872, 16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, 30720, 31744, 32768, 34816, 36864, 38912, 40960, 43008, 45056, 47104, 49152, 51200, 53248, 55296, 57344, 59392, 61440, 63488, 65536, 69632, 73728, 77824, 81920, 86016, 90112, 94208, 98304, 102400, 106496, 110592, 114688, 118784, 122880, 126976, 131072, 139264, 147456, 155648, 163840, 172032, 180224, 188416, 196608, 204800, 212992, 221184, 229376, 237568, 245760, 253952, 262144, 278528, 294912, 311296, 327680, 344064, 360448, 376832, 393216, 409600, 425984, 442368, 458752, 475136, 491520, 507904, 524288, 557056, 589824, 622592, 655360, 688128, 720896, 753664, 786432, 819200, 851968, 884736, 917504, 950272, 983040, 1015808, 1048576, 1114112, 1179648, 1245184, 1310720, 1376256, 1441792, 1507328, 1572864, 1638400, 1703936, 1769472, 1835008, 1900544, 1966080, 2031616, 2097152, 2228224, 2359296, 2490368, 2621440, 2752512, 2883584, 3014656, 3145728, 3276800, 3407872, 3538944, 3670016, 3801088, 3932160, 4063232, 4194304, 4456448, 4718592, 4980736, 5242880, 5505024, 5767168, 6029312, 6291456, 6553600, 6815744, 7077888, 7340032, 7602176, 7864320, 8126464, 8388608, 8912896, 9437184, 9961472, 10485760, 11010048, 11534336, 12058624, 12582912, 13107200, 13631488, 14155776, 14680064, 15204352, 15728640, 16252928, 16777216, 17825792, 18874368, 19922944, 20971520, 22020096, 23068672, 24117248, 25165824, 26214400, 27262976, 28311552, 29360128, 30408704, 31457280, 32505856, 33554432, 35651584, 37748736, 39845888, 41943040, 44040192, 46137344, 48234496, 50331648, 52428800, 54525952, 56623104, 58720256, 60817408, 62914560, 65011712 }; //static uint8_t OpenPGP_S2K::encode_count(size_t desired_iterations) { /* Only 256 different iterations are actually representable in OpenPGP format ... */ for(size_t c = 0; c < 256; ++c) { const uint32_t decoded_iter = OPENPGP_S2K_ITERS[c]; if(decoded_iter >= desired_iterations) return static_cast(c); } return 255; } //static size_t OpenPGP_S2K::decode_count(uint8_t iter) { return OPENPGP_S2K_ITERS[iter]; } size_t OpenPGP_S2K::pbkdf(uint8_t output_buf[], size_t output_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const { if(iterations == 0 && msec.count() > 0) // FIXME throw Not_Implemented("OpenPGP_S2K does not implemented timed KDF"); if(iterations > 1 && salt_len == 0) throw Invalid_Argument("OpenPGP_S2K requires a salt in iterated mode"); secure_vector input_buf(salt_len + passphrase.size()); if(salt_len > 0) { copy_mem(&input_buf[0], salt, salt_len); } if(passphrase.empty() == false) { copy_mem(&input_buf[salt_len], cast_char_ptr_to_uint8(passphrase.data()), passphrase.size()); } secure_vector hash_buf(m_hash->output_length()); size_t pass = 0; size_t generated = 0; while(generated != output_len) { const size_t output_this_pass = std::min(hash_buf.size(), output_len - generated); // Preload some number of zero bytes (empty first iteration) std::vector zero_padding(pass); m_hash->update(zero_padding); // The input is always fully processed even if iterations is very small if(input_buf.empty() == false) { size_t left = std::max(iterations, input_buf.size()); while(left > 0) { const size_t input_to_take = std::min(left, input_buf.size()); m_hash->update(input_buf.data(), input_to_take); left -= input_to_take; } } m_hash->final(hash_buf.data()); copy_mem(output_buf + generated, hash_buf.data(), output_this_pass); generated += output_this_pass; ++pass; } return iterations; } } botan-2.4.0/src/lib/pbkdf/pgp_s2k/pgp_s2k.h000066400000000000000000000035511322470703100203310ustar00rootroot00000000000000/* * OpenPGP PBKDF * (C) 1999-2007,2017 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_OPENPGP_S2K_H_ #define BOTAN_OPENPGP_S2K_H_ #include #include namespace Botan { /** * OpenPGP's S2K * * See RFC 4880 sections 3.7.1.1, 3.7.1.2, and 3.7.1.3 * If the salt is empty and iterations == 1, "simple" S2K is used * If the salt is non-empty and iterations == 1, "salted" S2K is used * If the salt is non-empty and iterations > 1, "iterated" S2K is used * * Due to complexities of the PGP S2K algorithm, time-based derivation * is not supported. So if iterations == 0 and msec.count() > 0, an * exception is thrown. In the future this may be supported, in which * case "iterated" S2K will be used and the number of iterations * performed is returned. * * Note that unlike PBKDF2, OpenPGP S2K's "iterations" are defined as * the number of bytes hashed. */ class BOTAN_PUBLIC_API(2,2) OpenPGP_S2K final : public PBKDF { public: /** * @param hash the hash function to use */ explicit OpenPGP_S2K(HashFunction* hash) : m_hash(hash) {} std::string name() const override { return "OpenPGP-S2K(" + m_hash->name() + ")"; } PBKDF* clone() const override { return new OpenPGP_S2K(m_hash->clone()); } size_t pbkdf(uint8_t output_buf[], size_t output_len, const std::string& passphrase, const uint8_t salt[], size_t salt_len, size_t iterations, std::chrono::milliseconds msec) const override; /** * RFC 4880 encodes the iteration count to a single-byte value */ static uint8_t encode_count(size_t iterations); static size_t decode_count(uint8_t encoded_iter); private: std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/pk_pad/000077500000000000000000000000001322470703100154125ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/eme.cpp000066400000000000000000000032471322470703100166720ustar00rootroot00000000000000/* * EME Base Class * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_EME_OAEP) #include #endif #if defined(BOTAN_HAS_EME_PKCS1v15) #include #endif #if defined(BOTAN_HAS_EME_RAW) #include #endif namespace Botan { EME* get_eme(const std::string& algo_spec) { #if defined(BOTAN_HAS_EME_RAW) if(algo_spec == "Raw") return new EME_Raw; #endif #if defined(BOTAN_HAS_EME_PKCS1v15) if(algo_spec == "PKCS1v15" || algo_spec == "EME-PKCS1-v1_5") return new EME_PKCS1v15; #endif #if defined(BOTAN_HAS_EME_OAEP) SCAN_Name req(algo_spec); if(req.algo_name() == "OAEP" || req.algo_name() == "EME-OAEP" || req.algo_name() == "EME1") { if(req.arg_count() == 1 || (req.arg_count() == 2 && req.arg(1) == "MGF1")) { if(auto hash = HashFunction::create(req.arg(0))) return new OAEP(hash.release()); } } #endif throw Algorithm_Not_Found(algo_spec); } /* * Encode a message */ secure_vector EME::encode(const uint8_t msg[], size_t msg_len, size_t key_bits, RandomNumberGenerator& rng) const { return pad(msg, msg_len, key_bits, rng); } /* * Encode a message */ secure_vector EME::encode(const secure_vector& msg, size_t key_bits, RandomNumberGenerator& rng) const { return pad(msg.data(), msg.size(), key_bits, rng); } } botan-2.4.0/src/lib/pk_pad/eme.h000066400000000000000000000054151322470703100163360ustar00rootroot00000000000000/* * EME Classes * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PUBKEY_EME_ENCRYPTION_PAD_H_ #define BOTAN_PUBKEY_EME_ENCRYPTION_PAD_H_ #include namespace Botan { class RandomNumberGenerator; /** * Encoding Method for Encryption */ class BOTAN_PUBLIC_API(2,0) EME { public: virtual ~EME() = default; /** * Return the maximum input size in bytes we can support * @param keybits the size of the key in bits * @return upper bound of input in bytes */ virtual size_t maximum_input_size(size_t keybits) const = 0; /** * Encode an input * @param in the plaintext * @param in_length length of plaintext in bytes * @param key_length length of the key in bits * @param rng a random number generator * @return encoded plaintext */ secure_vector encode(const uint8_t in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const; /** * Encode an input * @param in the plaintext * @param key_length length of the key in bits * @param rng a random number generator * @return encoded plaintext */ secure_vector encode(const secure_vector& in, size_t key_length, RandomNumberGenerator& rng) const; /** * Decode an input * @param valid_mask written to specifies if output is valid * @param in the encoded plaintext * @param in_len length of encoded plaintext in bytes * @return bytes of out[] written to along with * validity mask (0xFF if valid, else 0x00) */ virtual secure_vector unpad(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const = 0; /** * Encode an input * @param in the plaintext * @param in_length length of plaintext in bytes * @param key_length length of the key in bits * @param rng a random number generator * @return encoded plaintext */ virtual secure_vector pad(const uint8_t in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const = 0; }; /** * Factory method for EME (message-encoding methods for encryption) objects * @param algo_spec the name of the EME to create * @return pointer to newly allocated object of that type */ BOTAN_PUBLIC_API(2,0) EME* get_eme(const std::string& algo_spec); } #endif botan-2.4.0/src/lib/pk_pad/eme_oaep/000077500000000000000000000000001322470703100171645ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/eme_oaep/info.txt000066400000000000000000000001071322470703100206560ustar00rootroot00000000000000 EME_OAEP -> 20140118 mgf1 botan-2.4.0/src/lib/pk_pad/eme_oaep/oaep.cpp000066400000000000000000000076371322470703100206310ustar00rootroot00000000000000/* * OAEP * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * OAEP Pad Operation */ secure_vector OAEP::pad(const uint8_t in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const { key_length /= 8; if(in_length > maximum_input_size(key_length * 8)) { throw Invalid_Argument("OAEP: Input is too large"); } secure_vector out(key_length); rng.randomize(out.data(), m_Phash.size()); buffer_insert(out, m_Phash.size(), m_Phash.data(), m_Phash.size()); out[out.size() - in_length - 1] = 0x01; buffer_insert(out, out.size() - in_length, in, in_length); mgf1_mask(*m_hash, out.data(), m_Phash.size(), &out[m_Phash.size()], out.size() - m_Phash.size()); mgf1_mask(*m_hash, &out[m_Phash.size()], out.size() - m_Phash.size(), out.data(), m_Phash.size()); return out; } /* * OAEP Unpad Operation */ secure_vector OAEP::unpad(uint8_t& valid_mask, const uint8_t in[], size_t in_length) const { /* Must be careful about error messages here; if an attacker can distinguish them, it is easy to use the differences as an oracle to find the secret key, as described in "A Chosen Ciphertext Attack on RSA Optimal Asymmetric Encryption Padding (OAEP) as Standardized in PKCS #1 v2.0", James Manger, Crypto 2001 Also have to be careful about timing attacks! Pointed out by Falko Strenzke. According to the standard (Section 7.1.1), the encryptor always creates a message as follows: i. Concatenate a single octet with hexadecimal value 0x00, maskedSeed, and maskedDB to form an encoded message EM of length k octets as EM = 0x00 || maskedSeed || maskedDB. where k is the length of the modulus N. Therefore, the first byte can always be skipped safely. */ uint8_t skip_first = CT::is_zero(in[0]) & 0x01; secure_vector input(in + skip_first, in + in_length); CT::poison(input.data(), input.size()); const size_t hlen = m_Phash.size(); mgf1_mask(*m_hash, &input[hlen], input.size() - hlen, input.data(), hlen); mgf1_mask(*m_hash, input.data(), hlen, &input[hlen], input.size() - hlen); size_t delim_idx = 2 * hlen; uint8_t waiting_for_delim = 0xFF; uint8_t bad_input = 0; for(size_t i = delim_idx; i < input.size(); ++i) { const uint8_t zero_m = CT::is_zero(input[i]); const uint8_t one_m = CT::is_equal(input[i], 1); const uint8_t add_m = waiting_for_delim & zero_m; bad_input |= waiting_for_delim & ~(zero_m | one_m); delim_idx += CT::select(add_m, 1, 0); waiting_for_delim &= zero_m; } // If we never saw any non-zero byte, then it's not valid input bad_input |= waiting_for_delim; bad_input |= CT::is_equal(constant_time_compare(&input[hlen], m_Phash.data(), hlen), false); CT::unpoison(input.data(), input.size()); CT::unpoison(&bad_input, 1); CT::unpoison(&delim_idx, 1); valid_mask = ~bad_input; secure_vector output(input.begin() + delim_idx + 1, input.end()); CT::cond_zero_mem(bad_input, output.data(), output.size()); return output; } /* * Return the max input size for a given key size */ size_t OAEP::maximum_input_size(size_t keybits) const { if(keybits / 8 > 2*m_Phash.size() + 1) return ((keybits / 8) - 2*m_Phash.size() - 1); else return 0; } /* * OAEP Constructor */ OAEP::OAEP(HashFunction* hash, const std::string& P) : m_hash(hash) { m_Phash = m_hash->process(P); } } botan-2.4.0/src/lib/pk_pad/eme_oaep/oaep.h000066400000000000000000000022301322470703100202560ustar00rootroot00000000000000/* * OAEP * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OAEP_H_ #define BOTAN_OAEP_H_ #include #include namespace Botan { /** * OAEP (called EME1 in IEEE 1363 and in earlier versions of the library) * as specified in PKCS#1 v2.0 (RFC 2437) */ class BOTAN_PUBLIC_API(2,0) OAEP final : public EME { public: size_t maximum_input_size(size_t) const override; /** * @param hash function to use for hashing (takes ownership) * @param P an optional label. Normally empty. */ OAEP(HashFunction* hash, const std::string& P = ""); private: secure_vector pad(const uint8_t in[], size_t in_length, size_t key_length, RandomNumberGenerator& rng) const override; secure_vector unpad(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const override; secure_vector m_Phash; std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/pk_pad/eme_pkcs1/000077500000000000000000000000001322470703100172615ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/eme_pkcs1/eme_pkcs.cpp000066400000000000000000000045061322470703100215600ustar00rootroot00000000000000/* * PKCS #1 v1.5 Type 2 (encryption) padding * (C) 1999-2007,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * PKCS1 Pad Operation */ secure_vector EME_PKCS1v15::pad(const uint8_t in[], size_t inlen, size_t key_length, RandomNumberGenerator& rng) const { key_length /= 8; if(inlen > maximum_input_size(key_length * 8)) { throw Invalid_Argument("PKCS1: Input is too large"); } secure_vector out(key_length); out[0] = 0x02; rng.randomize(out.data() + 1, (key_length - inlen - 2)); for(size_t j = 1; j != key_length - inlen - 1; ++j) { if(out[j] == 0) { out[j] = rng.next_nonzero_byte(); } } buffer_insert(out, key_length - inlen, in, inlen); return out; } /* * PKCS1 Unpad Operation */ secure_vector EME_PKCS1v15::unpad(uint8_t& valid_mask, const uint8_t in[], size_t inlen) const { if(inlen < 2) { valid_mask = false; return secure_vector(); } CT::poison(in, inlen); uint8_t bad_input_m = 0; uint8_t seen_zero_m = 0; size_t delim_idx = 0; bad_input_m |= ~CT::is_equal(in[0], 0); bad_input_m |= ~CT::is_equal(in[1], 2); for(size_t i = 2; i < inlen; ++i) { const uint8_t is_zero_m = CT::is_zero(in[i]); delim_idx += CT::select(~seen_zero_m, 1, 0); bad_input_m |= is_zero_m & CT::expand_mask(i < 10); seen_zero_m |= is_zero_m; } bad_input_m |= ~seen_zero_m; bad_input_m |= CT::is_less(delim_idx, 8); CT::unpoison(in, inlen); CT::unpoison(bad_input_m); CT::unpoison(delim_idx); secure_vector output(&in[delim_idx + 2], &in[inlen]); CT::cond_zero_mem(bad_input_m, output.data(), output.size()); valid_mask = ~bad_input_m; return output; } /* * Return the max input size for a given key size */ size_t EME_PKCS1v15::maximum_input_size(size_t keybits) const { if(keybits / 8 > 10) return ((keybits / 8) - 10); else return 0; } } botan-2.4.0/src/lib/pk_pad/eme_pkcs1/eme_pkcs.h000066400000000000000000000013221322470703100212160ustar00rootroot00000000000000/* * EME PKCS#1 v1.5 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EME_PKCS1_H_ #define BOTAN_EME_PKCS1_H_ #include namespace Botan { /** * EME from PKCS #1 v1.5 */ class BOTAN_PUBLIC_API(2,0) EME_PKCS1v15 final : public EME { public: size_t maximum_input_size(size_t) const override; private: secure_vector pad(const uint8_t[], size_t, size_t, RandomNumberGenerator&) const override; secure_vector unpad(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const override; }; } #endif botan-2.4.0/src/lib/pk_pad/eme_pkcs1/info.txt000066400000000000000000000000561322470703100207560ustar00rootroot00000000000000 EME_PKCS1v15 -> 20131128 botan-2.4.0/src/lib/pk_pad/eme_raw/000077500000000000000000000000001322470703100170315ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/eme_raw/eme_raw.cpp000066400000000000000000000014171322470703100211570ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { secure_vector EME_Raw::pad(const uint8_t in[], size_t in_length, size_t, RandomNumberGenerator&) const { return secure_vector(in, in + in_length); } secure_vector EME_Raw::unpad(uint8_t& valid_mask, const uint8_t in[], size_t in_length) const { valid_mask = 0xFF; return CT::strip_leading_zeros(in, in_length); } size_t EME_Raw::maximum_input_size(size_t keybits) const { return keybits / 8; } } botan-2.4.0/src/lib/pk_pad/eme_raw/eme_raw.h000066400000000000000000000012611322470703100206210ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EME_RAW_H_ #define BOTAN_EME_RAW_H_ #include namespace Botan { class BOTAN_PUBLIC_API(2,0) EME_Raw final : public EME { public: size_t maximum_input_size(size_t i) const override; EME_Raw() = default; private: secure_vector pad(const uint8_t[], size_t, size_t, RandomNumberGenerator&) const override; secure_vector unpad(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const override; }; } #endif botan-2.4.0/src/lib/pk_pad/eme_raw/info.txt000066400000000000000000000000511322470703100205210ustar00rootroot00000000000000 EME_RAW -> 20150313 botan-2.4.0/src/lib/pk_pad/emsa.cpp000066400000000000000000000105341322470703100170460ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_EMSA1) #include #endif #if defined(BOTAN_HAS_EMSA_X931) #include #endif #if defined(BOTAN_HAS_EMSA_PKCS1) #include #endif #if defined(BOTAN_HAS_EMSA_PSSR) #include #endif #if defined(BOTAN_HAS_EMSA_RAW) #include #endif #if defined(BOTAN_HAS_ISO_9796) #include #endif namespace Botan { AlgorithmIdentifier EMSA::config_for_x509(const Private_Key&, const std::string&) const { throw Not_Implemented("Encoding " + name() + " not supported for signing X509 objects"); } EMSA* get_emsa(const std::string& algo_spec) { SCAN_Name req(algo_spec); #if defined(BOTAN_HAS_EMSA1) if(req.algo_name() == "EMSA1" && req.arg_count() == 1) { if(auto hash = HashFunction::create(req.arg(0))) return new EMSA1(hash.release()); } #endif #if defined(BOTAN_HAS_EMSA_PKCS1) if(req.algo_name() == "EMSA_PKCS1" || req.algo_name() == "EMSA-PKCS1-v1_5" || req.algo_name() == "EMSA3") { if(req.arg_count() == 2 && req.arg(0) == "Raw") { return new EMSA_PKCS1v15_Raw(req.arg(1)); } else if(req.arg_count() == 1) { if(req.arg(0) == "Raw") { return new EMSA_PKCS1v15_Raw; } else { if(auto hash = HashFunction::create(req.arg(0))) { return new EMSA_PKCS1v15(hash.release()); } } } } #endif #if defined(BOTAN_HAS_EMSA_PSSR) if(req.algo_name() == "PSSR" || req.algo_name() == "EMSA-PSS" || req.algo_name() == "PSS-MGF1" || req.algo_name() == "EMSA4" || req.algo_name() == "PSSR_Raw") { if(req.arg_count_between(1, 3)) { if(req.arg(1, "MGF1") != "MGF1") return nullptr; // not supported if(auto h = HashFunction::create(req.arg(0))) { const size_t salt_size = req.arg_as_integer(2, h->output_length()); if(req.algo_name() == "PSSR_Raw") return new PSSR_Raw(h.release(), salt_size); else return new PSSR(h.release(), salt_size); } } } #endif #if defined(BOTAN_HAS_ISO_9796) if(req.algo_name() == "ISO_9796_DS2") { if(req.arg_count_between(1, 3)) { if(auto h = HashFunction::create(req.arg(0))) { const size_t salt_size = req.arg_as_integer(2, h->output_length()); const bool implicit = req.arg(1, "exp") == "imp"; return new ISO_9796_DS2(h.release(), implicit, salt_size); } } } //ISO-9796-2 DS 3 is deterministic and DS2 without a salt if(req.algo_name() == "ISO_9796_DS3") { if(req.arg_count_between(1, 2)) { if(auto h = HashFunction::create(req.arg(0))) { const bool implicit = req.arg(1, "exp") == "imp"; return new ISO_9796_DS3(h.release(), implicit); } } } #endif #if defined(BOTAN_HAS_EMSA_X931) if(req.algo_name() == "EMSA_X931" || req.algo_name() == "EMSA2" || req.algo_name() == "X9.31") { if(req.arg_count() == 1) { if(auto hash = HashFunction::create(req.arg(0))) { return new EMSA_X931(hash.release()); } } } #endif #if defined(BOTAN_HAS_EMSA_RAW) if(req.algo_name() == "Raw") { if(req.arg_count() == 0) { return new EMSA_Raw; } else { auto hash = HashFunction::create(req.arg(0)); if(hash) return new EMSA_Raw(hash->output_length()); } } #endif throw Algorithm_Not_Found(algo_spec); } std::string hash_for_emsa(const std::string& algo_spec) { SCAN_Name emsa_name(algo_spec); if(emsa_name.arg_count() > 0) { const std::string pos_hash = emsa_name.arg(0); return pos_hash; } return "SHA-512"; // safe default if nothing we understand } } botan-2.4.0/src/lib/pk_pad/emsa.h000066400000000000000000000061271322470703100165160ustar00rootroot00000000000000/* * EMSA Classes * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PUBKEY_EMSA_H_ #define BOTAN_PUBKEY_EMSA_H_ #include #include namespace Botan { class Private_Key; class RandomNumberGenerator; /** * EMSA, from IEEE 1363s Encoding Method for Signatures, Appendix * * Any way of encoding/padding signatures */ class BOTAN_PUBLIC_API(2,0) EMSA { public: virtual ~EMSA() = default; /** * Add more data to the signature computation * @param input some data * @param length length of input in bytes */ virtual void update(const uint8_t input[], size_t length) = 0; /** * @return raw hash */ virtual secure_vector raw_data() = 0; /** * Return the encoding of a message * @param msg the result of raw_data() * @param output_bits the desired output bit size * @param rng a random number generator * @return encoded signature */ virtual secure_vector encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) = 0; /** * Verify the encoding * @param coded the received (coded) message representative * @param raw the computed (local, uncoded) message representative * @param key_bits the size of the key in bits * @return true if coded is a valid encoding of raw, otherwise false */ virtual bool verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) = 0; /** * Prepare sig_algo for use in choose_sig_format for x509 certs * * @param key used for checking compatibility with the encoding scheme * @param cert_hash_name is checked to equal the hash for the encoding * @return algorithm identifier to signatures created using this key, * padding method and hash. */ virtual AlgorithmIdentifier config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const; /** * @return a new object representing the same encoding method as *this */ virtual EMSA* clone() = 0; /** * @return the SCAN name of the encoding/padding scheme */ virtual std::string name() const = 0; }; /** * Factory method for EMSA (message-encoding methods for signatures * with appendix) objects * @param algo_spec the name of the EMSA to create * @return pointer to newly allocated object of that type */ BOTAN_PUBLIC_API(2,0) EMSA* get_emsa(const std::string& algo_spec); /** * Returns the hash function used in the given EMSA scheme * If the hash function is not specified or not understood, * returns "SHA-512" * @param algo_spec the name of the EMSA * @return hash function used in the given EMSA scheme */ BOTAN_PUBLIC_API(2,0) std::string hash_for_emsa(const std::string& algo_spec); } #endif botan-2.4.0/src/lib/pk_pad/emsa1/000077500000000000000000000000001322470703100164205ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/emsa1/emsa1.cpp000066400000000000000000000072471322470703100201440ustar00rootroot00000000000000/* * EMSA1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { secure_vector emsa1_encoding(const secure_vector& msg, size_t output_bits) { if(8*msg.size() <= output_bits) return msg; size_t shift = 8*msg.size() - output_bits; size_t byte_shift = shift / 8, bit_shift = shift % 8; secure_vector digest(msg.size() - byte_shift); for(size_t j = 0; j != msg.size() - byte_shift; ++j) digest[j] = msg[j]; if(bit_shift) { uint8_t carry = 0; for(size_t j = 0; j != digest.size(); ++j) { uint8_t temp = digest[j]; digest[j] = (temp >> bit_shift) | carry; carry = (temp << (8 - bit_shift)); } } return digest; } } std::string EMSA1::name() const { return "EMSA1(" + m_hash->name() + ")"; } EMSA* EMSA1::clone() { return new EMSA1(m_hash->clone()); } void EMSA1::update(const uint8_t input[], size_t length) { m_hash->update(input, length); } secure_vector EMSA1::raw_data() { return m_hash->final(); } secure_vector EMSA1::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator&) { if(msg.size() != hash_output_length()) throw Encoding_Error("EMSA1::encoding_of: Invalid size for input"); return emsa1_encoding(msg, output_bits); } bool EMSA1::verify(const secure_vector& input, const secure_vector& raw, size_t key_bits) { try { if(raw.size() != m_hash->output_length()) throw Encoding_Error("EMSA1::encoding_of: Invalid size for input"); // Call emsa1_encoding to handle any required bit shifting const secure_vector our_coding = emsa1_encoding(raw, key_bits); if(our_coding.size() < input.size()) return false; const size_t offset = our_coding.size() - input.size(); // must be >= 0 per check above // If our encoding is longer, all the bytes in it must be zero for(size_t i = 0; i != offset; ++i) if(our_coding[i] != 0) return false; return constant_time_compare(input.data(), &our_coding[offset], input.size()); } catch(Invalid_Argument) { return false; } } AlgorithmIdentifier EMSA1::config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const { if(cert_hash_name != m_hash->name()) throw Invalid_Argument("Hash function from opts and hash_fn argument" " need to be identical"); // check that the signature algorithm and the padding scheme fit if(!sig_algo_and_pad_ok(key.algo_name(), "EMSA1")) { throw Invalid_Argument("Encoding scheme with canonical name EMSA1" " not supported for signature algorithm " + key.algo_name()); } AlgorithmIdentifier sig_algo; sig_algo.oid = OIDS::lookup( key.algo_name() + "/" + name() ); std::string algo_name = key.algo_name(); if(algo_name == "DSA" || algo_name == "ECDSA" || algo_name == "ECGDSA" || algo_name == "ECKCDSA" || algo_name == "GOST-34.10") { // for DSA, ECDSA, GOST parameters "SHALL" be empty sig_algo.parameters = {}; } else { sig_algo.parameters = key.algorithm_identifier().parameters; } return sig_algo; } } botan-2.4.0/src/lib/pk_pad/emsa1/emsa1.h000066400000000000000000000025051322470703100176010ustar00rootroot00000000000000/* * EMSA1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EMSA1_H_ #define BOTAN_EMSA1_H_ #include #include namespace Botan { /** * EMSA1 from IEEE 1363 * Essentially, sign the hash directly */ class BOTAN_PUBLIC_API(2,0) EMSA1 final : public EMSA { public: /** * @param hash the hash function to use */ explicit EMSA1(HashFunction* hash) : m_hash(hash) {} EMSA* clone() override; std::string name() const override; AlgorithmIdentifier config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const override; private: size_t hash_output_length() const { return m_hash->output_length(); } void update(const uint8_t[], size_t) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) override; bool verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) override; std::unique_ptr m_hash; }; } #endif botan-2.4.0/src/lib/pk_pad/emsa1/info.txt000066400000000000000000000000471322470703100201150ustar00rootroot00000000000000 EMSA1 -> 20131128 botan-2.4.0/src/lib/pk_pad/emsa_pkcs1/000077500000000000000000000000001322470703100174405ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.cpp000066400000000000000000000112751322470703100222000ustar00rootroot00000000000000/* * PKCS #1 v1.5 signature padding * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { secure_vector emsa3_encoding(const secure_vector& msg, size_t output_bits, const uint8_t hash_id[], size_t hash_id_length) { size_t output_length = output_bits / 8; if(output_length < hash_id_length + msg.size() + 10) throw Encoding_Error("emsa3_encoding: Output length is too small"); secure_vector T(output_length); const size_t P_LENGTH = output_length - msg.size() - hash_id_length - 2; T[0] = 0x01; set_mem(&T[1], P_LENGTH, 0xFF); T[P_LENGTH+1] = 0x00; if(hash_id_length > 0) { BOTAN_ASSERT_NONNULL(hash_id); buffer_insert(T, P_LENGTH+2, hash_id, hash_id_length); } buffer_insert(T, output_length-msg.size(), msg.data(), msg.size()); return T; } } void EMSA_PKCS1v15::update(const uint8_t input[], size_t length) { m_hash->update(input, length); } secure_vector EMSA_PKCS1v15::raw_data() { return m_hash->final(); } secure_vector EMSA_PKCS1v15::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator&) { if(msg.size() != m_hash->output_length()) throw Encoding_Error("EMSA_PKCS1v15::encoding_of: Bad input length"); return emsa3_encoding(msg, output_bits, m_hash_id.data(), m_hash_id.size()); } bool EMSA_PKCS1v15::verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) { if(raw.size() != m_hash->output_length()) return false; try { return (coded == emsa3_encoding(raw, key_bits, m_hash_id.data(), m_hash_id.size())); } catch(...) { return false; } } AlgorithmIdentifier EMSA_PKCS1v15::config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const { if(cert_hash_name != m_hash->name()) throw Invalid_Argument("Hash function from opts and hash_fn argument" " need to be identical"); // check that the signature algorithm and the padding scheme fit if(!sig_algo_and_pad_ok(key.algo_name(), "EMSA3")) { throw Invalid_Argument("Encoding scheme with canonical name EMSA3" " not supported for signature algorithm " + key.algo_name()); } AlgorithmIdentifier sig_algo; sig_algo.oid = OIDS::lookup( key.algo_name() + "/" + name() ); // for RSA PKCSv1.5 parameters "SHALL" be NULL as configured by // RSA_PublicKey::algorithm_identifier() sig_algo.parameters = key.algorithm_identifier().parameters; return sig_algo; } EMSA_PKCS1v15::EMSA_PKCS1v15(HashFunction* hash) : m_hash(hash) { m_hash_id = pkcs_hash_id(m_hash->name()); } EMSA_PKCS1v15_Raw::EMSA_PKCS1v15_Raw(const std::string& hash_algo) { if(!hash_algo.empty()) { m_hash_id = pkcs_hash_id(hash_algo); std::unique_ptr hash(HashFunction::create(hash_algo)); m_hash_name = hash->name(); m_hash_output_len = hash->output_length(); } else { m_hash_output_len = 0; } } void EMSA_PKCS1v15_Raw::update(const uint8_t input[], size_t length) { m_message += std::make_pair(input, length); } secure_vector EMSA_PKCS1v15_Raw::raw_data() { secure_vector ret; std::swap(ret, m_message); if(m_hash_output_len > 0 && ret.size() != m_hash_output_len) throw Encoding_Error("EMSA_PKCS1v15_Raw::encoding_of: Bad input length"); return ret; } secure_vector EMSA_PKCS1v15_Raw::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator&) { return emsa3_encoding(msg, output_bits, m_hash_id.data(), m_hash_id.size()); } bool EMSA_PKCS1v15_Raw::verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) { if(m_hash_output_len > 0 && raw.size() != m_hash_output_len) return false; try { return (coded == emsa3_encoding(raw, key_bits, m_hash_id.data(), m_hash_id.size())); } catch(...) { return false; } } } botan-2.4.0/src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.h000066400000000000000000000050651322470703100216450ustar00rootroot00000000000000/* * PKCS #1 v1.5 signature padding * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EMSA_PKCS1_H_ #define BOTAN_EMSA_PKCS1_H_ #include #include namespace Botan { /** * PKCS #1 v1.5 signature padding * aka PKCS #1 block type 1 * aka EMSA3 from IEEE 1363 */ class BOTAN_PUBLIC_API(2,0) EMSA_PKCS1v15 final : public EMSA { public: /** * @param hash the hash function to use */ explicit EMSA_PKCS1v15(HashFunction* hash); EMSA* clone() override { return new EMSA_PKCS1v15(m_hash->clone()); } void update(const uint8_t[], size_t) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector&, size_t, RandomNumberGenerator& rng) override; bool verify(const secure_vector&, const secure_vector&, size_t) override; std::string name() const override { return "EMSA3(" + m_hash->name() + ")"; } AlgorithmIdentifier config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const override; private: std::unique_ptr m_hash; std::vector m_hash_id; }; /** * EMSA_PKCS1v15_Raw which is EMSA_PKCS1v15 without a hash or digest id * (which according to QCA docs is "identical to PKCS#11's CKM_RSA_PKCS * mechanism", something I have not confirmed) */ class BOTAN_PUBLIC_API(2,0) EMSA_PKCS1v15_Raw final : public EMSA { public: EMSA* clone() override { return new EMSA_PKCS1v15_Raw(); } void update(const uint8_t[], size_t) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector&, size_t, RandomNumberGenerator& rng) override; bool verify(const secure_vector&, const secure_vector&, size_t) override; /** * @param hash_algo if non-empty, the digest id for that hash is * included in the signature. */ EMSA_PKCS1v15_Raw(const std::string& hash_algo = ""); std::string name() const override { if(m_hash_name.empty()) return "EMSA3(Raw)"; else return "EMSA3(Raw," + m_hash_name + ")"; } private: size_t m_hash_output_len = 0; std::string m_hash_name; std::vector m_hash_id; secure_vector m_message; }; } #endif botan-2.4.0/src/lib/pk_pad/emsa_pkcs1/info.txt000066400000000000000000000001141322470703100211300ustar00rootroot00000000000000 EMSA_PKCS1 -> 20140118 hash_id botan-2.4.0/src/lib/pk_pad/emsa_pssr/000077500000000000000000000000001322470703100174065ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/emsa_pssr/info.txt000066400000000000000000000001101322470703100210720ustar00rootroot00000000000000 EMSA_PSSR -> 20131128 mgf1 botan-2.4.0/src/lib/pk_pad/emsa_pssr/pssr.cpp000066400000000000000000000163411322470703100211060ustar00rootroot00000000000000/* * PSSR * (C) 1999-2007,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include namespace Botan { namespace { /* * PSSR Encode Operation */ secure_vector pss_encode(HashFunction& hash, const secure_vector& msg, const secure_vector& salt, size_t output_bits) { const size_t HASH_SIZE = hash.output_length(); const size_t SALT_SIZE = salt.size(); if(msg.size() != HASH_SIZE) throw Encoding_Error("Cannot encode PSS string, input length invalid for hash"); if(output_bits < 8*HASH_SIZE + 8*SALT_SIZE + 9) throw Encoding_Error("Cannot encode PSS string, output length too small"); const size_t output_length = (output_bits + 7) / 8; for(size_t i = 0; i != 8; ++i) hash.update(0); hash.update(msg); hash.update(salt); secure_vector H = hash.final(); secure_vector EM(output_length); EM[output_length - HASH_SIZE - SALT_SIZE - 2] = 0x01; buffer_insert(EM, output_length - 1 - HASH_SIZE - SALT_SIZE, salt); mgf1_mask(hash, H.data(), HASH_SIZE, EM.data(), output_length - HASH_SIZE - 1); EM[0] &= 0xFF >> (8 * ((output_bits + 7) / 8) - output_bits); buffer_insert(EM, output_length - 1 - HASH_SIZE, H); EM[output_length-1] = 0xBC; return EM; } bool pss_verify(HashFunction& hash, const secure_vector& const_coded, const secure_vector& raw, size_t key_bits) { const size_t HASH_SIZE = hash.output_length(); const size_t KEY_BYTES = (key_bits + 7) / 8; if(key_bits < 8*HASH_SIZE + 9) return false; if(raw.size() != HASH_SIZE) return false; if(const_coded.size() > KEY_BYTES || const_coded.size() <= 1) return false; if(const_coded[const_coded.size()-1] != 0xBC) return false; secure_vector coded = const_coded; if(coded.size() < KEY_BYTES) { secure_vector temp(KEY_BYTES); buffer_insert(temp, KEY_BYTES - coded.size(), coded); coded = temp; } const size_t TOP_BITS = 8 * ((key_bits + 7) / 8) - key_bits; if(TOP_BITS > 8 - high_bit(coded[0])) return false; uint8_t* DB = coded.data(); const size_t DB_size = coded.size() - HASH_SIZE - 1; const uint8_t* H = &coded[DB_size]; const size_t H_size = HASH_SIZE; mgf1_mask(hash, H, H_size, DB, DB_size); DB[0] &= 0xFF >> TOP_BITS; size_t salt_offset = 0; for(size_t j = 0; j != DB_size; ++j) { if(DB[j] == 0x01) { salt_offset = j + 1; break; } if(DB[j]) return false; } if(salt_offset == 0) return false; const size_t salt_size = DB_size - salt_offset; for(size_t j = 0; j != 8; ++j) hash.update(0); hash.update(raw); hash.update(&DB[salt_offset], salt_size); secure_vector H2 = hash.final(); return constant_time_compare(H, H2.data(), HASH_SIZE); } } PSSR::PSSR(HashFunction* h) : m_hash(h), m_SALT_SIZE(m_hash->output_length()) { } PSSR::PSSR(HashFunction* h, size_t salt_size) : m_hash(h), m_SALT_SIZE(salt_size) { } /* * PSSR Update Operation */ void PSSR::update(const uint8_t input[], size_t length) { m_hash->update(input, length); } /* * Return the raw (unencoded) data */ secure_vector PSSR::raw_data() { return m_hash->final(); } secure_vector PSSR::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) { secure_vector salt = rng.random_vec(m_SALT_SIZE); return pss_encode(*m_hash, msg, salt, output_bits); } /* * PSSR Decode/Verify Operation */ bool PSSR::verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) { return pss_verify(*m_hash, coded, raw, key_bits); } std::string PSSR::name() const { return "EMSA4(" + m_hash->name() + ",MGF1," + std::to_string(m_SALT_SIZE) + ")"; } AlgorithmIdentifier PSSR::config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const { if(cert_hash_name != m_hash->name()) throw Invalid_Argument("Hash function from opts and hash_fn argument" " need to be identical"); // check that the signature algorithm and the padding scheme fit if(!sig_algo_and_pad_ok(key.algo_name(), "EMSA4")) { throw Invalid_Argument("Encoding scheme with canonical name EMSA4" " not supported for signature algorithm " + key.algo_name()); } AlgorithmIdentifier sig_algo; // hardcoded as RSA is the only valid algorithm for EMSA4 at the moment sig_algo.oid = OIDS::lookup( "RSA/EMSA4" ); sig_algo.parameters = DER_Encoder() .start_cons( SEQUENCE ) .start_cons( ASN1_Tag(0), CONTEXT_SPECIFIC ) .encode( AlgorithmIdentifier( cert_hash_name, AlgorithmIdentifier::USE_NULL_PARAM ) ) .end_cons() .start_cons( ASN1_Tag(1), CONTEXT_SPECIFIC ) .encode( AlgorithmIdentifier( "MGF1", DER_Encoder() .encode( AlgorithmIdentifier( cert_hash_name, AlgorithmIdentifier::USE_NULL_PARAM ) ) .get_contents_unlocked() ) ) .end_cons() .start_cons( ASN1_Tag(2), CONTEXT_SPECIFIC ) .encode( size_t( m_SALT_SIZE ) ) .end_cons() .start_cons( ASN1_Tag(3), CONTEXT_SPECIFIC ) .encode( size_t( 1 ) ) // trailer field .end_cons() .end_cons() .get_contents_unlocked(); return sig_algo; } PSSR_Raw::PSSR_Raw(HashFunction* h) : m_hash(h), m_SALT_SIZE(m_hash->output_length()) { } PSSR_Raw::PSSR_Raw(HashFunction* h, size_t salt_size) : m_hash(h), m_SALT_SIZE(salt_size) { } /* * PSSR_Raw Update Operation */ void PSSR_Raw::update(const uint8_t input[], size_t length) { m_msg.insert(m_msg.end(), input, input + length); } /* * Return the raw (unencoded) data */ secure_vector PSSR_Raw::raw_data() { secure_vector ret; std::swap(ret, m_msg); if(ret.size() != m_hash->output_length()) throw Encoding_Error("PSSR_Raw Bad input length, did not match hash"); return ret; } secure_vector PSSR_Raw::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) { secure_vector salt = rng.random_vec(m_SALT_SIZE); return pss_encode(*m_hash, msg, salt, output_bits); } /* * PSSR_Raw Decode/Verify Operation */ bool PSSR_Raw::verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) { return pss_verify(*m_hash, coded, raw, key_bits); } std::string PSSR_Raw::name() const { return "PSSR_Raw(" + m_hash->name() + ",MGF1," + std::to_string(m_SALT_SIZE) + ")"; } } botan-2.4.0/src/lib/pk_pad/emsa_pssr/pssr.h000066400000000000000000000051531322470703100205520ustar00rootroot00000000000000/* * PSSR * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PSSR_H_ #define BOTAN_PSSR_H_ #include #include namespace Botan { /** * PSSR (called EMSA4 in IEEE 1363 and in old versions of the library) */ class BOTAN_PUBLIC_API(2,0) PSSR final : public EMSA { public: /** * @param hash the hash function to use */ explicit PSSR(HashFunction* hash); /** * @param hash the hash function to use * @param salt_size the size of the salt to use in bytes */ PSSR(HashFunction* hash, size_t salt_size); EMSA* clone() override { return new PSSR(m_hash->clone(), m_SALT_SIZE); } std::string name() const override; AlgorithmIdentifier config_for_x509(const Private_Key& key, const std::string& cert_hash_name) const override; private: void update(const uint8_t input[], size_t length) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) override; bool verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) override; std::unique_ptr m_hash; size_t m_SALT_SIZE; }; /** * PSSR_Raw * This accepts a pre-hashed buffer */ class BOTAN_DLL PSSR_Raw final : public EMSA { public: /** * @param hash the hash function to use */ explicit PSSR_Raw(HashFunction* hash); /** * @param hash the hash function to use * @param salt_size the size of the salt to use in bytes */ PSSR_Raw(HashFunction* hash, size_t salt_size); EMSA* clone() override { return new PSSR_Raw(m_hash->clone(), m_SALT_SIZE); } std::string name() const override; private: void update(const uint8_t input[], size_t length) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) override; bool verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) override; std::unique_ptr m_hash; size_t m_SALT_SIZE; secure_vector m_msg; }; } #endif botan-2.4.0/src/lib/pk_pad/emsa_raw/000077500000000000000000000000001322470703100172105ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/emsa_raw/emsa_raw.cpp000066400000000000000000000045231322470703100215160ustar00rootroot00000000000000/* * EMSA-Raw * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::string EMSA_Raw::name() const { if(m_expected_size > 0) return "Raw(" + std::to_string(m_expected_size) + ")"; return "Raw"; } /* * EMSA-Raw Encode Operation */ void EMSA_Raw::update(const uint8_t input[], size_t length) { m_message += std::make_pair(input, length); } /* * Return the raw (unencoded) data */ secure_vector EMSA_Raw::raw_data() { if(m_expected_size && m_message.size() != m_expected_size) throw Invalid_Argument("EMSA_Raw was configured to use a " + std::to_string(m_expected_size) + " byte hash but instead was used for a " + std::to_string(m_message.size()) + " hash"); secure_vector output; std::swap(m_message, output); return output; } /* * EMSA-Raw Encode Operation */ secure_vector EMSA_Raw::encoding_of(const secure_vector& msg, size_t, RandomNumberGenerator&) { if(m_expected_size && msg.size() != m_expected_size) throw Invalid_Argument("EMSA_Raw was configured to use a " + std::to_string(m_expected_size) + " byte hash but instead was used for a " + std::to_string(msg.size()) + " hash"); return msg; } /* * EMSA-Raw Verify Operation */ bool EMSA_Raw::verify(const secure_vector& coded, const secure_vector& raw, size_t) { if(m_expected_size && raw.size() != m_expected_size) return false; if(coded.size() == raw.size()) return (coded == raw); if(coded.size() > raw.size()) return false; // handle zero padding differences const size_t leading_zeros_expected = raw.size() - coded.size(); bool same_modulo_leading_zeros = true; for(size_t i = 0; i != leading_zeros_expected; ++i) if(raw[i]) same_modulo_leading_zeros = false; if(!constant_time_compare(coded.data(), raw.data() + leading_zeros_expected, coded.size())) same_modulo_leading_zeros = false; return same_modulo_leading_zeros; } } botan-2.4.0/src/lib/pk_pad/emsa_raw/emsa_raw.h000066400000000000000000000020761322470703100211640ustar00rootroot00000000000000/* * EMSA-Raw * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EMSA_RAW_H_ #define BOTAN_EMSA_RAW_H_ #include namespace Botan { /** * EMSA-Raw - sign inputs directly * Don't use this unless you know what you are doing. */ class BOTAN_PUBLIC_API(2,0) EMSA_Raw final : public EMSA { public: EMSA* clone() override { return new EMSA_Raw(); } explicit EMSA_Raw(size_t expected_hash_size = 0) : m_expected_size(expected_hash_size) {} std::string name() const override; private: void update(const uint8_t[], size_t) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector&, size_t, RandomNumberGenerator&) override; bool verify(const secure_vector&, const secure_vector&, size_t) override; const size_t m_expected_size; secure_vector m_message; }; } #endif botan-2.4.0/src/lib/pk_pad/emsa_raw/info.txt000066400000000000000000000000521322470703100207010ustar00rootroot00000000000000 EMSA_RAW -> 20131128 botan-2.4.0/src/lib/pk_pad/emsa_x931/000077500000000000000000000000001322470703100171235ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/emsa_x931/emsa_x931.cpp000066400000000000000000000047271322470703100213520ustar00rootroot00000000000000/* * EMSA_X931 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { secure_vector emsa2_encoding(const secure_vector& msg, size_t output_bits, const secure_vector& empty_hash, uint8_t hash_id) { const size_t HASH_SIZE = empty_hash.size(); size_t output_length = (output_bits + 1) / 8; if(msg.size() != HASH_SIZE) throw Encoding_Error("EMSA_X931::encoding_of: Bad input length"); if(output_length < HASH_SIZE + 4) throw Encoding_Error("EMSA_X931::encoding_of: Output length is too small"); const bool empty_input = (msg == empty_hash); secure_vector output(output_length); output[0] = (empty_input ? 0x4B : 0x6B); output[output_length - 3 - HASH_SIZE] = 0xBA; set_mem(&output[1], output_length - 4 - HASH_SIZE, 0xBB); buffer_insert(output, output_length - (HASH_SIZE + 2), msg.data(), msg.size()); output[output_length-2] = hash_id; output[output_length-1] = 0xCC; return output; } } std::string EMSA_X931::name() const { return "EMSA2(" + m_hash->name() + ")"; } void EMSA_X931::update(const uint8_t input[], size_t length) { m_hash->update(input, length); } secure_vector EMSA_X931::raw_data() { return m_hash->final(); } /* * EMSA_X931 Encode Operation */ secure_vector EMSA_X931::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator&) { return emsa2_encoding(msg, output_bits, m_empty_hash, m_hash_id); } /* * EMSA_X931 Verify Operation */ bool EMSA_X931::verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) { try { return (coded == emsa2_encoding(raw, key_bits, m_empty_hash, m_hash_id)); } catch(...) { return false; } } /* * EMSA_X931 Constructor */ EMSA_X931::EMSA_X931(HashFunction* hash) : m_hash(hash) { m_empty_hash = m_hash->final(); m_hash_id = ieee1363_hash_id(hash->name()); if(!m_hash_id) throw Encoding_Error("EMSA_X931 no hash identifier for " + hash->name()); } } botan-2.4.0/src/lib/pk_pad/emsa_x931/emsa_x931.h000066400000000000000000000022411322470703100210040ustar00rootroot00000000000000/* * X9.31 EMSA * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EMSA_X931_H_ #define BOTAN_EMSA_X931_H_ #include #include namespace Botan { /** * EMSA from X9.31 (EMSA2 in IEEE 1363) * Useful for Rabin-Williams, also sometimes used with RSA in * odd protocols. */ class BOTAN_PUBLIC_API(2,0) EMSA_X931 final : public EMSA { public: /** * @param hash the hash function to use */ explicit EMSA_X931(HashFunction* hash); EMSA* clone() override { return new EMSA_X931(m_hash->clone()); } std::string name() const override; private: void update(const uint8_t[], size_t) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector&, size_t, RandomNumberGenerator& rng) override; bool verify(const secure_vector&, const secure_vector&, size_t) override; secure_vector m_empty_hash; std::unique_ptr m_hash; uint8_t m_hash_id; }; } #endif botan-2.4.0/src/lib/pk_pad/emsa_x931/info.txt000066400000000000000000000001131322470703100206120ustar00rootroot00000000000000 EMSA_X931 -> 20140118 hash_id botan-2.4.0/src/lib/pk_pad/hash_id/000077500000000000000000000000001322470703100170115ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/hash_id/hash_id.cpp000066400000000000000000000122501322470703100211140ustar00rootroot00000000000000/* * Hash Function Identification * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { const uint8_t MD5_PKCS_ID[] = { 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 }; const uint8_t RIPEMD_160_PKCS_ID[] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24, 0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14 }; const uint8_t SHA_160_PKCS_ID[] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14 }; const uint8_t SHA_224_PKCS_ID[] = { 0x30, 0x2D, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04, 0x1C }; const uint8_t SHA_256_PKCS_ID[] = { 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 }; const uint8_t SHA_384_PKCS_ID[] = { 0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30 }; const uint8_t SHA_512_PKCS_ID[] = { 0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 }; const uint8_t SHA_512_256_PKCS_ID[] = { 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06, 0x05, 0x00, 0x04, 0x20 }; const uint8_t SHA3_224_PKCS_ID[] = { 0x30, 0x2D, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x07, 0x05, 0x00, 0x04, 0x1C }; const uint8_t SHA3_256_PKCS_ID[] = { 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x08, 0x05, 0x00, 0x04, 0x20 }; const uint8_t SHA3_384_PKCS_ID[] = { 0x30, 0x41, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x09, 0x05, 0x00, 0x04, 0x30 }; const uint8_t SHA3_512_PKCS_ID[] = { 0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0A, 0x05, 0x00, 0x04, 0x40 }; const uint8_t SM3_PKCS_ID[] = { 0x30, 0x30, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x83, 0x11, 0x05, 0x00, 0x04, 0x20, }; const uint8_t TIGER_PKCS_ID[] = { 0x30, 0x29, 0x30, 0x0D, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0C, 0x02, 0x05, 0x00, 0x04, 0x18 }; } /* * HashID as specified by PKCS */ std::vector pkcs_hash_id(const std::string& name) { // Special case for SSL/TLS RSA signatures if(name == "Parallel(MD5,SHA-160)") return std::vector(); // If you add a value to this function, also update test_hash_id.cpp if(name == "MD5") return std::vector(MD5_PKCS_ID, MD5_PKCS_ID + sizeof(MD5_PKCS_ID)); if(name == "RIPEMD-160") return std::vector(RIPEMD_160_PKCS_ID, RIPEMD_160_PKCS_ID + sizeof(RIPEMD_160_PKCS_ID)); if(name == "SHA-160" || name == "SHA-1" || name == "SHA1") return std::vector(SHA_160_PKCS_ID, SHA_160_PKCS_ID + sizeof(SHA_160_PKCS_ID)); if(name == "SHA-224") return std::vector(SHA_224_PKCS_ID, SHA_224_PKCS_ID + sizeof(SHA_224_PKCS_ID)); if(name == "SHA-256") return std::vector(SHA_256_PKCS_ID, SHA_256_PKCS_ID + sizeof(SHA_256_PKCS_ID)); if(name == "SHA-384") return std::vector(SHA_384_PKCS_ID, SHA_384_PKCS_ID + sizeof(SHA_384_PKCS_ID)); if(name == "SHA-512") return std::vector(SHA_512_PKCS_ID, SHA_512_PKCS_ID + sizeof(SHA_512_PKCS_ID)); if(name == "SHA-512-256") return std::vector(SHA_512_256_PKCS_ID, SHA_512_256_PKCS_ID + sizeof(SHA_512_256_PKCS_ID)); if(name == "SHA-3(224)") return std::vector(SHA3_224_PKCS_ID, SHA3_224_PKCS_ID + sizeof(SHA3_224_PKCS_ID)); if(name == "SHA-3(256)") return std::vector(SHA3_256_PKCS_ID, SHA3_256_PKCS_ID + sizeof(SHA3_256_PKCS_ID)); if(name == "SHA-3(384)") return std::vector(SHA3_384_PKCS_ID, SHA3_384_PKCS_ID + sizeof(SHA3_384_PKCS_ID)); if(name == "SHA-3(512)") return std::vector(SHA3_512_PKCS_ID, SHA3_512_PKCS_ID + sizeof(SHA3_512_PKCS_ID)); if(name == "SM3") return std::vector(SM3_PKCS_ID, SM3_PKCS_ID + sizeof(SM3_PKCS_ID)); if(name == "Tiger(24,3)") return std::vector(TIGER_PKCS_ID, TIGER_PKCS_ID + sizeof(TIGER_PKCS_ID)); throw Invalid_Argument("No PKCS #1 identifier for " + name); } /* * HashID as specified by IEEE 1363/X9.31 */ uint8_t ieee1363_hash_id(const std::string& name) { if(name == "SHA-160" || name == "SHA-1" || name == "SHA1") return 0x33; if(name == "SHA-224") return 0x38; if(name == "SHA-256") return 0x34; if(name == "SHA-384") return 0x36; if(name == "SHA-512") return 0x35; if(name == "RIPEMD-160") return 0x31; if(name == "Whirlpool") return 0x37; return 0; } } botan-2.4.0/src/lib/pk_pad/hash_id/hash_id.h000066400000000000000000000014661322470703100205700ustar00rootroot00000000000000/* * Hash Function Identification * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HASHID_H_ #define BOTAN_HASHID_H_ #include #include namespace Botan { /** * Return the PKCS #1 hash identifier * @see RFC 3447 section 9.2 * @param hash_name the name of the hash function * @return uint8_t sequence identifying the hash * @throw Invalid_Argument if the hash has no known PKCS #1 hash id */ BOTAN_PUBLIC_API(2,0) std::vector pkcs_hash_id(const std::string& hash_name); /** * Return the IEEE 1363 hash identifier * @param hash_name the name of the hash function * @return uint8_t code identifying the hash, or 0 if not known */ BOTAN_PUBLIC_API(2,0) uint8_t ieee1363_hash_id(const std::string& hash_name); } #endif botan-2.4.0/src/lib/pk_pad/hash_id/info.txt000066400000000000000000000000511322470703100205010ustar00rootroot00000000000000 HASH_ID -> 20131128 botan-2.4.0/src/lib/pk_pad/info.txt000066400000000000000000000003011322470703100171000ustar00rootroot00000000000000 PK_PADDING -> 20131128 load_on auto asn1 rng pubkey padding.h eme.h emsa.h botan-2.4.0/src/lib/pk_pad/iso9796/000077500000000000000000000000001322470703100165435ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/iso9796/info.txt000066400000000000000000000001201322470703100202300ustar00rootroot00000000000000 ISO_9796 -> 20161121 mgf1 hash_id botan-2.4.0/src/lib/pk_pad/iso9796/iso9796.cpp000066400000000000000000000216751322470703100204130ustar00rootroot00000000000000/* * ISO-9796-2 - Digital signature schemes giving message recovery schemes 2 and 3 * (C) 2016 Tobias Niemann, Hackmanit GmbH * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace { secure_vector iso9796_encoding(const secure_vector& msg, size_t output_bits, std::unique_ptr& hash, size_t SALT_SIZE, bool implicit, RandomNumberGenerator& rng) { const size_t output_length = (output_bits + 7) / 8; //set trailer length size_t tLength = 1; if(!implicit) { tLength = 2; } const size_t HASH_SIZE = hash->output_length(); if(output_length <= HASH_SIZE + SALT_SIZE + tLength) { throw Encoding_Error("ISO9796-2::encoding_of: Output length is too small"); } //calculate message capacity const size_t capacity = output_length - HASH_SIZE - SALT_SIZE - tLength - 1; //msg1 is the recoverable and msg2 the unrecoverable message part. secure_vector msg1; secure_vector msg2; if(msg.size() > capacity) { msg1 = secure_vector (msg.begin(), msg.begin() + capacity); msg2 = secure_vector (msg.begin() + capacity, msg.end()); hash->update(msg2); } else { msg1 = msg; } msg2 = hash->final(); //compute H(C||msg1 ||H(msg2)||S) uint64_t msgLength = msg1.size(); secure_vector salt = rng.random_vec(SALT_SIZE); hash->update_be(msgLength * 8); hash->update(msg1); hash->update(msg2); hash->update(salt); secure_vector H = hash->final(); secure_vector EM(output_length); //compute message offset. size_t offset = output_length - HASH_SIZE - SALT_SIZE - tLength - msgLength - 1; //insert message border (0x01), msg1 and salt into the output buffer EM[offset] = 0x01; buffer_insert(EM, offset + 1, msg1); buffer_insert(EM, offset + 1 + msgLength, salt); //apply mask mgf1_mask(*hash, H.data(), HASH_SIZE, EM.data(), output_length - HASH_SIZE - tLength); buffer_insert(EM, output_length - HASH_SIZE - tLength, H); //set implicit/ISO trailer if(!implicit) { uint8_t hash_id = ieee1363_hash_id(hash->name()); if(!hash_id) { throw Encoding_Error("ISO9796-2::encoding_of: no hash identifier for " + hash->name()); } EM[output_length - 1] = 0xCC; EM[output_length - 2] = hash_id; } else { EM[output_length - 1] = 0xBC; } //clear the leftmost bit (confer bouncy castle) EM[0] &= 0x7F; return EM; } bool iso9796_verification(const secure_vector& const_coded, const secure_vector& raw, size_t key_bits, std::unique_ptr& hash, size_t SALT_SIZE) { const size_t HASH_SIZE = hash->output_length(); const size_t KEY_BYTES = (key_bits + 7) / 8; if(const_coded.size() != KEY_BYTES) { return false; } //get trailer length size_t tLength; if(const_coded[const_coded.size() - 1] == 0xBC) { tLength = 1; } else { uint8_t hash_id = ieee1363_hash_id(hash->name()); if((!const_coded[const_coded.size() - 2]) || (const_coded[const_coded.size() - 2] != hash_id) || (const_coded[const_coded.size() - 1] != 0xCC)) { return false; //in case of wrong ISO trailer. } tLength = 2; } secure_vector coded = const_coded; CT::poison(coded.data(), coded.size()); //remove mask uint8_t* DB = coded.data(); const size_t DB_size = coded.size() - HASH_SIZE - tLength; const uint8_t* H = &coded[DB_size]; mgf1_mask(*hash, H, HASH_SIZE, DB, DB_size); //clear the leftmost bit (confer bouncy castle) DB[0] &= 0x7F; //recover msg1 and salt size_t msg1_offset = 1; uint8_t waiting_for_delim = 0xFF; uint8_t bad_input = 0; for(size_t j = 0; j < DB_size; ++j) { const uint8_t one_m = CT::is_equal(DB[j], 0x01); const uint8_t zero_m = CT::is_zero(DB[j]); const uint8_t add_m = waiting_for_delim & zero_m; bad_input |= waiting_for_delim & ~(zero_m | one_m); msg1_offset += CT::select(add_m, 1, 0); waiting_for_delim &= zero_m; } //invalid, if delimiter 0x01 was not found or msg1_offset is too big bad_input |= waiting_for_delim; bad_input |= CT::is_less(coded.size(), tLength + HASH_SIZE + msg1_offset + SALT_SIZE); //in case that msg1_offset is too big, just continue with offset = 0. msg1_offset = CT::select(bad_input, 0, msg1_offset); CT::unpoison(coded.data(), coded.size()); CT::unpoison(msg1_offset); secure_vector msg1(coded.begin() + msg1_offset, coded.end() - tLength - HASH_SIZE - SALT_SIZE); secure_vector salt(coded.begin() + msg1_offset + msg1.size(), coded.end() - tLength - HASH_SIZE); //compute H2(C||msg1||H(msg2)||S*). * indicates a recovered value const size_t capacity = (key_bits - 2 + 7) / 8 - HASH_SIZE - SALT_SIZE - tLength - 1; secure_vector msg1raw; secure_vector msg2; if(raw.size() > capacity) { msg1raw = secure_vector (raw.begin(), raw.begin() + capacity); msg2 = secure_vector (raw.begin() + capacity, raw.end()); hash->update(msg2); } else { msg1raw = raw; } msg2 = hash->final(); uint64_t msg1rawLength = msg1raw.size(); hash->update_be(msg1rawLength * 8); hash->update(msg1raw); hash->update(msg2); hash->update(salt); secure_vector H3 = hash->final(); //compute H3(C*||msg1*||H(msg2)||S*) * indicates a recovered value uint64_t msgLength = msg1.size(); hash->update_be(msgLength * 8); hash->update(msg1); hash->update(msg2); hash->update(salt); secure_vector H2 = hash->final(); //check if H3 == H2 bad_input |= CT::is_equal(constant_time_compare(H3.data(), H2.data(), HASH_SIZE), false); CT::unpoison(bad_input); return (bad_input == 0); } } EMSA* ISO_9796_DS2::clone() { return new ISO_9796_DS2(m_hash->clone(), m_implicit, m_SALT_SIZE); } /* * ISO-9796-2 signature scheme 2 * DS 2 is probabilistic */ void ISO_9796_DS2::update(const uint8_t input[], size_t length) { //need to buffer message completely, before digest m_msg_buffer.insert(m_msg_buffer.end(), input, input+length); } /* * Return the raw (unencoded) data */ secure_vector ISO_9796_DS2::raw_data() { secure_vector retbuffer = m_msg_buffer; m_msg_buffer.clear(); return retbuffer; } /* * ISO-9796-2 scheme 2 encode operation */ secure_vector ISO_9796_DS2::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) { return iso9796_encoding(msg, output_bits, m_hash, m_SALT_SIZE, m_implicit, rng); } /* * ISO-9796-2 scheme 2 verify operation */ bool ISO_9796_DS2::verify(const secure_vector& const_coded, const secure_vector& raw, size_t key_bits) { return iso9796_verification(const_coded,raw,key_bits,m_hash,m_SALT_SIZE); } /* * Return the SCAN name */ std::string ISO_9796_DS2::name() const { return "ISO_9796_DS2(" + m_hash->name() + "," + (m_implicit ? "imp" : "exp") + "," + std::to_string(m_SALT_SIZE) + ")"; } EMSA* ISO_9796_DS3::clone() { return new ISO_9796_DS3(m_hash->clone(), m_implicit); } /* * ISO-9796-2 signature scheme 3 * DS 3 is deterministic and equals DS2 without salt */ void ISO_9796_DS3::update(const uint8_t input[], size_t length) { //need to buffer message completely, before digest m_msg_buffer.insert(m_msg_buffer.end(), input, input+length); } /* * Return the raw (unencoded) data */ secure_vector ISO_9796_DS3::raw_data() { secure_vector retbuffer = m_msg_buffer; m_msg_buffer.clear(); return retbuffer; } /* * ISO-9796-2 scheme 3 encode operation */ secure_vector ISO_9796_DS3::encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) { return iso9796_encoding(msg, output_bits, m_hash, 0, m_implicit, rng); } /* * ISO-9796-2 scheme 3 verify operation */ bool ISO_9796_DS3::verify(const secure_vector& const_coded, const secure_vector& raw, size_t key_bits) { return iso9796_verification(const_coded, raw, key_bits, m_hash, 0); } /* * Return the SCAN name */ std::string ISO_9796_DS3::name() const { return "ISO_9796_DS3(" + m_hash->name() + "," + (m_implicit ? "imp" : "exp") + ")"; } } botan-2.4.0/src/lib/pk_pad/iso9796/iso9796.h000066400000000000000000000054451322470703100200550ustar00rootroot00000000000000/* * ISO-9796-2 - Digital signature schemes giving message recovery schemes 2 and 3 * (C) 2016 Tobias Niemann, Hackmanit GmbH * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ISO9796_H_ #define BOTAN_ISO9796_H_ #include #include namespace Botan { /** * ISO-9796-2 - Digital signature scheme 2 (probabilistic) */ class BOTAN_PUBLIC_API(2,0) ISO_9796_DS2 final : public EMSA { public: /** * @param hash function to use * @param implicit whether or not the trailer is implicit */ explicit ISO_9796_DS2(HashFunction* hash, bool implicit = false) : m_hash(hash), m_implicit(implicit), m_SALT_SIZE(hash->output_length()) {} /** * @param hash function to use * @param implicit whether or not the trailer is implicit * @param salt_size size of the salt to use in bytes */ ISO_9796_DS2(HashFunction* hash, bool implicit, size_t salt_size) : m_hash(hash), m_implicit(implicit), m_SALT_SIZE(salt_size) {} EMSA* clone() override; std::string name() const override; private: void update(const uint8_t input[], size_t length) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) override; bool verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) override; std::unique_ptr m_hash; bool m_implicit; size_t m_SALT_SIZE; secure_vector m_msg_buffer; }; /** * ISO-9796-2 - Digital signature scheme 3 (deterministic) */ class BOTAN_PUBLIC_API(2,0) ISO_9796_DS3 final : public EMSA { public: /** * @param hash function to use * @param implicit whether or not the trailer is implicit */ ISO_9796_DS3(HashFunction* hash, bool implicit = false) : m_hash(hash), m_implicit(implicit) {} EMSA* clone() override; std::string name() const override; private: void update(const uint8_t input[], size_t length) override; secure_vector raw_data() override; secure_vector encoding_of(const secure_vector& msg, size_t output_bits, RandomNumberGenerator& rng) override; bool verify(const secure_vector& coded, const secure_vector& raw, size_t key_bits) override; std::unique_ptr m_hash; bool m_implicit; secure_vector m_msg_buffer; }; } #endif botan-2.4.0/src/lib/pk_pad/mgf1/000077500000000000000000000000001322470703100162445ustar00rootroot00000000000000botan-2.4.0/src/lib/pk_pad/mgf1/info.txt000066400000000000000000000000461322470703100177400ustar00rootroot00000000000000 MGF1 -> 20140118 botan-2.4.0/src/lib/pk_pad/mgf1/mgf1.cpp000066400000000000000000000012611322470703100176020ustar00rootroot00000000000000/* * MGF1 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { void mgf1_mask(HashFunction& hash, const uint8_t in[], size_t in_len, uint8_t out[], size_t out_len) { uint32_t counter = 0; while(out_len) { hash.update(in, in_len); hash.update_be(counter); secure_vector buffer = hash.final(); size_t xored = std::min(buffer.size(), out_len); xor_buf(out, buffer.data(), xored); out += xored; out_len -= xored; ++counter; } } } botan-2.4.0/src/lib/pk_pad/mgf1/mgf1.h000066400000000000000000000011741322470703100172520ustar00rootroot00000000000000/* * MGF1 * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MGF1_H_ #define BOTAN_MGF1_H_ #include namespace Botan { class HashFunction; /** * MGF1 from PKCS #1 v2.0 * @param hash hash function to use * @param in input buffer * @param in_len size of the input buffer in bytes * @param out output buffer * @param out_len size of the output buffer in bytes */ void BOTAN_PUBLIC_API(2,0) mgf1_mask(HashFunction& hash, const uint8_t in[], size_t in_len, uint8_t out[], size_t out_len); } #endif botan-2.4.0/src/lib/pk_pad/padding.cpp000066400000000000000000000021561322470703100175300ustar00rootroot00000000000000/* * Sets of allowed padding schemes for public key types * * This file was automatically generated by ./src/scripts/oids.py on 2017-12-20 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { const std::map> allowed_signature_paddings = { { "DSA", {"EMSA1"} }, { "ECDSA", {"EMSA1"} }, { "ECGDSA", {"EMSA1"} }, { "ECKCDSA", {"EMSA1"} }, { "GOST-34.10", {"EMSA1"} }, { "RSA", {"EMSA4", "EMSA3"} }, }; const std::vector get_sig_paddings(const std::string algo) { if(allowed_signature_paddings.count(algo) > 0) return allowed_signature_paddings.at(algo); return {}; } bool sig_algo_and_pad_ok(const std::string algo, const std::string padding) { std::vector pads = get_sig_paddings(algo); return std::find(pads.begin(), pads.end(), padding) != pads.end(); } } botan-2.4.0/src/lib/pk_pad/padding.h000066400000000000000000000016051322470703100171730ustar00rootroot00000000000000/* * (C) 2017 Fabian Weissberg, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PADDING_H_ #define BOTAN_PADDING_H_ #include #include #include namespace Botan { /** * Returns the allowed padding schemes when using the given * algorithm (key type) for creating digital signatures. * * @param algo the algorithm for which to look up supported padding schemes * @return a vector of supported padding schemes */ BOTAN_TEST_API const std::vector get_sig_paddings(const std::string algo); /** * Returns true iff the given padding scheme is valid for the given * signature algorithm (key type). * * @param algo the signature algorithm to be used * @param padding the padding scheme to be used */ bool sig_algo_and_pad_ok(const std::string algo, const std::string padding); } #endif botan-2.4.0/src/lib/prov/000077500000000000000000000000001322470703100151425ustar00rootroot00000000000000botan-2.4.0/src/lib/prov/bearssl/000077500000000000000000000000001322470703100165755ustar00rootroot00000000000000botan-2.4.0/src/lib/prov/bearssl/bearssl.h000066400000000000000000000017231322470703100204040ustar00rootroot00000000000000/* * Utils for calling BearSSL * (C) 2015,2016 Jack Lloyd * (C) 2017 Patrick Wildt * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_INTERNAL_BEARSSL_H_ #define BOTAN_INTERNAL_BEARSSL_H_ #include #include #include #include #include namespace Botan { class HashFunction; class BearSSL_Error final : public Exception { public: BearSSL_Error(const std::string& what) : Exception(what + " failed") {} }; /* Hash */ std::unique_ptr make_bearssl_hash(const std::string& name); /* ECDSA */ #if defined(BOTAN_HAS_ECDSA) class ECDSA_PublicKey; class ECDSA_PrivateKey; std::unique_ptr make_bearssl_ecdsa_ver_op(const ECDSA_PublicKey& key, const std::string& params); std::unique_ptr make_bearssl_ecdsa_sig_op(const ECDSA_PrivateKey& key, const std::string& params); #endif } #endif botan-2.4.0/src/lib/prov/bearssl/bearssl_ec.cpp000066400000000000000000000127771322470703100214210ustar00rootroot00000000000000/* * ECDSA via BearSSL * (C) 2015,2016 Jack Lloyd * (C) 2017 Patrick Wildt * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) #include #include #include #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif extern "C" { #include #include } namespace Botan { #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) namespace { int BearSSL_EC_curve_for(const OID& oid) { if(oid.empty()) return -1; const std::string name = OIDS::lookup(oid); if(name == "secp256r1") return BR_EC_secp256r1; if(name == "secp384r1") return BR_EC_secp384r1; if(name == "secp521r1") return BR_EC_secp521r1; return -1; } const br_hash_class *BearSSL_hash_class_for(const std::string& emsa) { if (emsa == "EMSA1(SHA-1)") return &br_sha1_vtable; if (emsa == "EMSA1(SHA-224)") return &br_sha224_vtable; if (emsa == "EMSA1(SHA-256)") return &br_sha256_vtable; if (emsa == "EMSA1(SHA-384)") return &br_sha384_vtable; if (emsa == "EMSA1(SHA-512)") return &br_sha512_vtable; return nullptr; } } #endif #if defined(BOTAN_HAS_ECDSA) namespace { class BearSSL_ECDSA_Verification_Operation final : public PK_Ops::Verification { public: BearSSL_ECDSA_Verification_Operation(const ECDSA_PublicKey& ecdsa, const std::string& emsa) : m_order_bits(ecdsa.domain().get_order().bits()) { const int curve = BearSSL_EC_curve_for(ecdsa.domain().get_oid()); if (curve < 0) throw Lookup_Error("BearSSL ECDSA does not support this curve"); m_hash = BearSSL_hash_class_for(emsa); if (m_hash == nullptr) throw Lookup_Error("BearSSL ECDSA does not support EMSA " + emsa); const SCAN_Name req(emsa); m_hf = make_bearssl_hash(req.arg(0)); if (m_hf == nullptr) throw Lookup_Error("BearSSL ECDSA does not support hash " + req.arg(0)); m_q_buf = EC2OSP(ecdsa.public_point(), PointGFp::UNCOMPRESSED); m_key.qlen = m_q_buf.size(); m_key.q = m_q_buf.data(); m_key.curve = curve; } void update(const uint8_t msg[], size_t msg_len) override { m_hf->update(msg, msg_len); } bool is_valid_signature(const uint8_t sig[], size_t sig_len) override { const size_t order_bytes = (m_order_bits + 7) / 8; if (sig_len != 2 * order_bytes) return false; secure_vector msg = m_hf->final(); br_ecdsa_vrfy engine = br_ecdsa_vrfy_raw_get_default(); if (!engine(&br_ec_prime_i31, msg.data(), msg.size(), &m_key, sig, sig_len)) return false; return true; } size_t max_input_bits() const { return m_order_bits; } private: br_ec_public_key m_key; std::unique_ptr m_hf; secure_vector m_q_buf; const br_hash_class *m_hash; size_t m_order_bits; }; class BearSSL_ECDSA_Signing_Operation final : public PK_Ops::Signature { public: BearSSL_ECDSA_Signing_Operation(const ECDSA_PrivateKey& ecdsa, const std::string& emsa) : m_order_bits(ecdsa.domain().get_order().bits()) { const int curve = BearSSL_EC_curve_for(ecdsa.domain().get_oid()); if(curve < 0) throw Lookup_Error("BearSSL ECDSA does not support this curve"); m_hash = BearSSL_hash_class_for(emsa); if (m_hash == nullptr) throw Lookup_Error("BearSSL ECDSA does not support EMSA " + emsa); const SCAN_Name req(emsa); m_hf = make_bearssl_hash(req.arg(0)); if (m_hf == nullptr) throw Lookup_Error("BearSSL ECDSA does not support hash " + req.arg(0)); m_x_buf = BigInt::encode_locked(ecdsa.private_value()); m_key.xlen = m_x_buf.size(); m_key.x = m_x_buf.data(); m_key.curve = curve; } void update(const uint8_t msg[], size_t msg_len) override { m_hf->update(msg, msg_len); } secure_vector sign(RandomNumberGenerator&) override { const size_t order_bytes = (m_order_bits + 7) / 8; secure_vector sigval(2*order_bytes); br_ecdsa_sign engine = br_ecdsa_sign_raw_get_default(); size_t sign_len = engine(&br_ec_prime_i31, m_hash, m_hf->final().data(), &m_key, sigval.data()); if (sign_len == 0) throw BearSSL_Error("br_ecdsa_sign"); sigval.resize(sign_len); return sigval; } size_t max_input_bits() const { return m_order_bits; } private: br_ec_private_key m_key; std::unique_ptr m_hf; secure_vector m_x_buf; const br_hash_class *m_hash; size_t m_order_bits; }; } std::unique_ptr make_bearssl_ecdsa_ver_op(const ECDSA_PublicKey& key, const std::string& params) { return std::unique_ptr(new BearSSL_ECDSA_Verification_Operation(key, params)); } std::unique_ptr make_bearssl_ecdsa_sig_op(const ECDSA_PrivateKey& key, const std::string& params) { return std::unique_ptr(new BearSSL_ECDSA_Signing_Operation(key, params)); } #endif } botan-2.4.0/src/lib/prov/bearssl/bearssl_hash.cpp000066400000000000000000000055721322470703100217500ustar00rootroot00000000000000/* * BearSSL Hash Functions * (C) 1999-2007,2015 Jack Lloyd * (C) 2017 Patrick Wildt * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include extern "C" { #include } namespace Botan { namespace { class BearSSL_HashFunction final : public HashFunction { public: void clear() override { m_ctx.vtable->init(&m_ctx.vtable); } std::string provider() const override { return "bearssl"; } std::string name() const override { return m_name; } HashFunction* clone() const override { return new BearSSL_HashFunction(m_ctx.vtable, m_name); } std::unique_ptr copy_state() const override { std::unique_ptr copy(new BearSSL_HashFunction(m_ctx.vtable, m_name)); memcpy(©->m_ctx, &m_ctx, sizeof(m_ctx)); return std::move(copy); } size_t output_length() const override { return (m_ctx.vtable->desc >> BR_HASHDESC_OUT_OFF) & BR_HASHDESC_OUT_MASK; } size_t hash_block_size() const override { return 1 << ((m_ctx.vtable->desc >> BR_HASHDESC_LBLEN_OFF) & BR_HASHDESC_LBLEN_MASK); } BearSSL_HashFunction(const br_hash_class *hash, const std::string name) { m_name = name; hash->init(&m_ctx.vtable); } ~BearSSL_HashFunction() { } private: void add_data(const uint8_t input[], size_t length) override { m_ctx.vtable->update(&m_ctx.vtable, input, length); } void final_result(uint8_t output[]) override { m_ctx.vtable->out(&m_ctx.vtable, output); m_ctx.vtable->init(&m_ctx.vtable); } std::string m_name; br_hash_compat_context m_ctx; }; } std::unique_ptr make_bearssl_hash(const std::string& name) { #define MAKE_BEARSSL_HASH(vtable) \ std::unique_ptr(new BearSSL_HashFunction(vtable, name)) #if defined(BOTAN_HAS_SHA2_32) if(name == "SHA-224") return MAKE_BEARSSL_HASH(&br_sha224_vtable); if(name == "SHA-256") return MAKE_BEARSSL_HASH(&br_sha256_vtable); #endif #if defined(BOTAN_HAS_SHA2_64) if(name == "SHA-384") return MAKE_BEARSSL_HASH(&br_sha384_vtable); if(name == "SHA-512") return MAKE_BEARSSL_HASH(&br_sha512_vtable); #endif #if defined(BOTAN_HAS_SHA1) if(name == "SHA-160" || name == "SHA-1" || name == "SHA1") return MAKE_BEARSSL_HASH(&br_sha1_vtable); #endif #if defined(BOTAN_HAS_MD5) if(name == "MD5") return MAKE_BEARSSL_HASH(&br_md5_vtable); #endif #if defined(BOTAN_HAS_PARALLEL_HASH) if(name == "Parallel(MD5,SHA-160)") return MAKE_BEARSSL_HASH(&br_md5sha1_vtable); #endif return nullptr; } } botan-2.4.0/src/lib/prov/bearssl/info.txt000066400000000000000000000002571322470703100202750ustar00rootroot00000000000000 BEARSSL -> 20170628 load_on vendor bearssl.h all!windows -> bearssl pubkey botan-2.4.0/src/lib/prov/openssl/000077500000000000000000000000001322470703100166255ustar00rootroot00000000000000botan-2.4.0/src/lib/prov/openssl/info.txt000066400000000000000000000003061322470703100203200ustar00rootroot00000000000000 OPENSSL -> 20151219 load_on vendor openssl.h all!windows -> crypto windows -> libeay32.lib pubkey botan-2.4.0/src/lib/prov/openssl/openssl.h000066400000000000000000000045161322470703100204670ustar00rootroot00000000000000/* * Utils for calling OpenSSL * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_INTERNAL_OPENSSL_H_ #define BOTAN_INTERNAL_OPENSSL_H_ #include #include #include #include #include #include #include #if defined(BOTAN_HAS_RC4) #include #endif namespace Botan { class BlockCipher; class Cipher_Mode; class StreamCipher; class HashFunction; class RandomNumberGenerator; enum Cipher_Dir : int; class OpenSSL_Error final : public Exception { public: OpenSSL_Error(const std::string& what) : Exception(what + " failed: " + ERR_error_string(ERR_get_error(), nullptr)) {} }; /* Block Ciphers */ std::unique_ptr make_openssl_block_cipher(const std::string& name); /* Cipher Modes */ Cipher_Mode* make_openssl_cipher_mode(const std::string& name, Cipher_Dir direction); /* Hash */ std::unique_ptr make_openssl_hash(const std::string& name); /* RSA */ #if defined(BOTAN_HAS_RSA) class RSA_PublicKey; class RSA_PrivateKey; std::unique_ptr make_openssl_rsa_enc_op(const RSA_PublicKey& key, const std::string& params); std::unique_ptr make_openssl_rsa_dec_op(const RSA_PrivateKey& key, const std::string& params); std::unique_ptr make_openssl_rsa_ver_op(const RSA_PublicKey& key, const std::string& params); std::unique_ptr make_openssl_rsa_sig_op(const RSA_PrivateKey& key, const std::string& params); std::unique_ptr make_openssl_rsa_private_key(RandomNumberGenerator& rng, size_t rsa_bits); #endif /* ECDSA */ #if defined(BOTAN_HAS_ECDSA) class ECDSA_PublicKey; class ECDSA_PrivateKey; std::unique_ptr make_openssl_ecdsa_ver_op(const ECDSA_PublicKey& key, const std::string& params); std::unique_ptr make_openssl_ecdsa_sig_op(const ECDSA_PrivateKey& key, const std::string& params); #endif /* ECDH */ #if defined(BOTAN_HAS_ECDH) class ECDH_PrivateKey; std::unique_ptr make_openssl_ecdh_ka_op(const ECDH_PrivateKey& key, const std::string& params); #endif #if defined(BOTAN_HAS_RC4) std::unique_ptr make_openssl_rc4(size_t skip); #endif } #endif botan-2.4.0/src/lib/prov/openssl/openssl_block.cpp000066400000000000000000000204601322470703100221700ustar00rootroot00000000000000/* * Block Ciphers via OpenSSL * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { class OpenSSL_BlockCipher final : public BlockCipher { public: OpenSSL_BlockCipher(const std::string& name, const EVP_CIPHER* cipher); OpenSSL_BlockCipher(const std::string& name, const EVP_CIPHER* cipher, size_t kl_min, size_t kl_max, size_t kl_mod); ~OpenSSL_BlockCipher(); void clear() override; std::string provider() const override { return "openssl"; } std::string name() const override { return m_cipher_name; } BlockCipher* clone() const override; size_t block_size() const override { return m_block_sz; } Key_Length_Specification key_spec() const override { return m_cipher_key_spec; } void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override { verify_key_set(m_key_set); int out_len = 0; if(!EVP_EncryptUpdate(m_encrypt, out, &out_len, in, blocks * m_block_sz)) throw OpenSSL_Error("EVP_EncryptUpdate"); } void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override { verify_key_set(m_key_set); int out_len = 0; if(!EVP_DecryptUpdate(m_decrypt, out, &out_len, in, blocks * m_block_sz)) throw OpenSSL_Error("EVP_DecryptUpdate"); } void key_schedule(const uint8_t key[], size_t key_len) override; size_t m_block_sz; Key_Length_Specification m_cipher_key_spec; std::string m_cipher_name; EVP_CIPHER_CTX *m_encrypt; EVP_CIPHER_CTX *m_decrypt; bool m_key_set; }; OpenSSL_BlockCipher::OpenSSL_BlockCipher(const std::string& algo_name, const EVP_CIPHER* algo) : m_block_sz(EVP_CIPHER_block_size(algo)), m_cipher_key_spec(EVP_CIPHER_key_length(algo)), m_cipher_name(algo_name), m_key_set(false) { if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) throw Invalid_Argument("OpenSSL_BlockCipher: Non-ECB EVP was passed in"); m_encrypt = EVP_CIPHER_CTX_new(); m_decrypt = EVP_CIPHER_CTX_new(); if (m_encrypt == nullptr || m_decrypt == nullptr) throw OpenSSL_Error("Can't allocate new context"); EVP_CIPHER_CTX_init(m_encrypt); EVP_CIPHER_CTX_init(m_decrypt); if(!EVP_EncryptInit_ex(m_encrypt, algo, nullptr, nullptr, nullptr)) throw OpenSSL_Error("EVP_EncryptInit_ex"); if(!EVP_DecryptInit_ex(m_decrypt, algo, nullptr, nullptr, nullptr)) throw OpenSSL_Error("EVP_DecryptInit_ex"); if(!EVP_CIPHER_CTX_set_padding(m_encrypt, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding encrypt"); if(!EVP_CIPHER_CTX_set_padding(m_decrypt, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding decrypt"); } OpenSSL_BlockCipher::OpenSSL_BlockCipher(const std::string& algo_name, const EVP_CIPHER* algo, size_t key_min, size_t key_max, size_t key_mod) : m_block_sz(EVP_CIPHER_block_size(algo)), m_cipher_key_spec(key_min, key_max, key_mod), m_cipher_name(algo_name), m_key_set(false) { if(EVP_CIPHER_mode(algo) != EVP_CIPH_ECB_MODE) throw Invalid_Argument("OpenSSL_BlockCipher: Non-ECB EVP was passed in"); m_encrypt = EVP_CIPHER_CTX_new(); m_decrypt = EVP_CIPHER_CTX_new(); if (m_encrypt == nullptr || m_decrypt == nullptr) throw OpenSSL_Error("Can't allocate new context"); EVP_CIPHER_CTX_init(m_encrypt); EVP_CIPHER_CTX_init(m_decrypt); if(!EVP_EncryptInit_ex(m_encrypt, algo, nullptr, nullptr, nullptr)) throw OpenSSL_Error("EVP_EncryptInit_ex"); if(!EVP_DecryptInit_ex(m_decrypt, algo, nullptr, nullptr, nullptr)) throw OpenSSL_Error("EVP_DecryptInit_ex"); if(!EVP_CIPHER_CTX_set_padding(m_encrypt, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding encrypt"); if(!EVP_CIPHER_CTX_set_padding(m_decrypt, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding decrypt"); } OpenSSL_BlockCipher::~OpenSSL_BlockCipher() { EVP_CIPHER_CTX_cleanup(m_encrypt); EVP_CIPHER_CTX_cleanup(m_decrypt); } /* * Set the key */ void OpenSSL_BlockCipher::key_schedule(const uint8_t key[], size_t length) { secure_vector full_key(key, key + length); if(m_cipher_name == "TripleDES" && length == 16) { full_key += std::make_pair(key, 8); } else { if(EVP_CIPHER_CTX_set_key_length(m_encrypt, length) == 0 || EVP_CIPHER_CTX_set_key_length(m_decrypt, length) == 0) throw Invalid_Argument("OpenSSL_BlockCipher: Bad key length for " + m_cipher_name); } if(!EVP_EncryptInit_ex(m_encrypt, nullptr, nullptr, full_key.data(), nullptr)) throw OpenSSL_Error("EVP_EncryptInit_ex"); if(!EVP_DecryptInit_ex(m_decrypt, nullptr, nullptr, full_key.data(), nullptr)) throw OpenSSL_Error("EVP_DecryptInit_ex"); m_key_set = true; } /* * Return a clone of this object */ BlockCipher* OpenSSL_BlockCipher::clone() const { return new OpenSSL_BlockCipher(m_cipher_name, EVP_CIPHER_CTX_cipher(m_encrypt), m_cipher_key_spec.minimum_keylength(), m_cipher_key_spec.maximum_keylength(), m_cipher_key_spec.keylength_multiple()); } /* * Clear memory of sensitive data */ void OpenSSL_BlockCipher::clear() { const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(m_encrypt); m_key_set = false; if(!EVP_CIPHER_CTX_cleanup(m_encrypt)) throw OpenSSL_Error("EVP_CIPHER_CTX_cleanup encrypt"); if(!EVP_CIPHER_CTX_cleanup(m_decrypt)) throw OpenSSL_Error("EVP_CIPHER_CTX_cleanup decrypt"); EVP_CIPHER_CTX_init(m_encrypt); EVP_CIPHER_CTX_init(m_decrypt); if(!EVP_EncryptInit_ex(m_encrypt, algo, nullptr, nullptr, nullptr)) throw OpenSSL_Error("EVP_EncryptInit_ex"); if(!EVP_DecryptInit_ex(m_decrypt, algo, nullptr, nullptr, nullptr)) throw OpenSSL_Error("EVP_DecryptInit_ex"); if(!EVP_CIPHER_CTX_set_padding(m_encrypt, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding encrypt"); if(!EVP_CIPHER_CTX_set_padding(m_decrypt, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding decrypt"); } } std::unique_ptr make_openssl_block_cipher(const std::string& name) { #define MAKE_OPENSSL_BLOCK(evp_fn) \ std::unique_ptr(new OpenSSL_BlockCipher(name, evp_fn())) #define MAKE_OPENSSL_BLOCK_KEYLEN(evp_fn, kl_min, kl_max, kl_mod) \ std::unique_ptr(new OpenSSL_BlockCipher(name, evp_fn(), kl_min, kl_max, kl_mod)) #if defined(BOTAN_HAS_AES) && !defined(OPENSSL_NO_AES) if(name == "AES-128") return MAKE_OPENSSL_BLOCK(EVP_aes_128_ecb); if(name == "AES-192") return MAKE_OPENSSL_BLOCK(EVP_aes_192_ecb); if(name == "AES-256") return MAKE_OPENSSL_BLOCK(EVP_aes_256_ecb); #endif #if defined(BOTAN_HAS_CAMELLIA) && !defined(OPENSSL_NO_CAMELLIA) if(name == "Camellia-128") return MAKE_OPENSSL_BLOCK(EVP_camellia_128_ecb); if(name == "Camellia-192") return MAKE_OPENSSL_BLOCK(EVP_camellia_192_ecb); if(name == "Camellia-256") return MAKE_OPENSSL_BLOCK(EVP_camellia_256_ecb); #endif #if defined(BOTAN_HAS_DES) && !defined(OPENSSL_NO_DES) if(name == "DES") return MAKE_OPENSSL_BLOCK(EVP_des_ecb); if(name == "TripleDES") return MAKE_OPENSSL_BLOCK_KEYLEN(EVP_des_ede3_ecb, 16, 24, 8); #endif #if defined(BOTAN_HAS_BLOWFISH) && !defined(OPENSSL_NO_BF) if(name == "Blowfish") return MAKE_OPENSSL_BLOCK_KEYLEN(EVP_bf_ecb, 1, 56, 1); #endif #if defined(BOTAN_HAS_CAST) && !defined(OPENSSL_NO_CAST) if(name == "CAST-128") return MAKE_OPENSSL_BLOCK_KEYLEN(EVP_cast5_ecb, 1, 16, 1); #endif #if defined(BOTAN_HAS_IDEA) && !defined(OPENSSL_NO_IDEA) if(name == "IDEA") return MAKE_OPENSSL_BLOCK(EVP_idea_ecb); #endif #if defined(BOTAN_HAS_SEED) && !defined(OPENSSL_NO_SEED) if(name == "SEED") return MAKE_OPENSSL_BLOCK(EVP_seed_ecb); #endif return nullptr; } } botan-2.4.0/src/lib/prov/openssl/openssl_ec.cpp000066400000000000000000000251131322470703100214650ustar00rootroot00000000000000/* * ECDSA and ECDH via OpenSSL * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) #include #include #include #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif #include #include #if !defined(OPENSSL_NO_EC) #include #endif #if !defined(OPENSSL_NO_ECDSA) #include #endif #if !defined(OPENSSL_NO_ECDH) #include #endif namespace Botan { #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) namespace { secure_vector PKCS8_for_openssl(const EC_PrivateKey& ec) { const PointGFp& pub_key = ec.public_point(); const BigInt& priv_key = ec.private_value(); return DER_Encoder() .start_cons(SEQUENCE) .encode(static_cast(1)) .encode(BigInt::encode_1363(priv_key, priv_key.bytes()), OCTET_STRING) .start_cons(ASN1_Tag(0), PRIVATE) .raw_bytes(ec.domain().DER_encode(EC_DOMPAR_ENC_OID)) .end_cons() .start_cons(ASN1_Tag(1), PRIVATE) .encode(EC2OSP(pub_key, PointGFp::UNCOMPRESSED), BIT_STRING) .end_cons() .end_cons() .get_contents(); } int OpenSSL_EC_curve_builtin(int nid) { // the NID macro is still defined even though the curve may not be // supported, so we need to check the list of builtin curves at runtime EC_builtin_curve builtin_curves[100]; size_t num = 0; if (!(num = EC_get_builtin_curves(builtin_curves, sizeof(builtin_curves)))) { return -1; } for(size_t i = 0; i < num; ++i) { if(builtin_curves[i].nid == nid) { return nid; } } return -1; } int OpenSSL_EC_nid_for(const OID& oid) { if(oid.empty()) return -1; const std::string name = OIDS::lookup(oid); if(name == "secp192r1") return OpenSSL_EC_curve_builtin(NID_X9_62_prime192v1); if(name == "secp224r1") return OpenSSL_EC_curve_builtin(NID_secp224r1); if(name == "secp256r1") return OpenSSL_EC_curve_builtin(NID_X9_62_prime256v1); if(name == "secp384r1") return OpenSSL_EC_curve_builtin(NID_secp384r1); if(name == "secp521r1") return OpenSSL_EC_curve_builtin(NID_secp521r1); // OpenSSL 1.0.2 added brainpool curves #if OPENSSL_VERSION_NUMBER >= 0x1000200fL if(name == "brainpool160r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP160r1); if(name == "brainpool192r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP192r1); if(name == "brainpool224r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP224r1); if(name == "brainpool256r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP256r1); if(name == "brainpool320r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP320r1); if(name == "brainpool384r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP384r1); if(name == "brainpool512r1") return OpenSSL_EC_curve_builtin(NID_brainpoolP512r1); #endif return -1; } } #endif #if defined(BOTAN_HAS_ECDSA) && !defined(OPENSSL_NO_ECDSA) namespace { class OpenSSL_ECDSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: OpenSSL_ECDSA_Verification_Operation(const ECDSA_PublicKey& ecdsa, const std::string& emsa, int nid) : PK_Ops::Verification_with_EMSA(emsa), m_ossl_ec(::EC_KEY_new(), ::EC_KEY_free) { std::unique_ptr<::EC_GROUP, std::function> grp(::EC_GROUP_new_by_curve_name(nid), ::EC_GROUP_free); if(!grp) throw OpenSSL_Error("EC_GROUP_new_by_curve_name"); if(!::EC_KEY_set_group(m_ossl_ec.get(), grp.get())) throw OpenSSL_Error("EC_KEY_set_group"); const secure_vector enc = EC2OSP(ecdsa.public_point(), PointGFp::UNCOMPRESSED); const uint8_t* enc_ptr = enc.data(); EC_KEY* key_ptr = m_ossl_ec.get(); if(!::o2i_ECPublicKey(&key_ptr, &enc_ptr, enc.size())) throw OpenSSL_Error("o2i_ECPublicKey"); const EC_GROUP* group = ::EC_KEY_get0_group(m_ossl_ec.get()); m_order_bits = ::EC_GROUP_get_degree(group); } size_t max_input_bits() const override { return m_order_bits; } bool with_recovery() const override { return false; } bool verify(const uint8_t msg[], size_t msg_len, const uint8_t sig_bytes[], size_t sig_len) override { const size_t order_bytes = (m_order_bits + 7) / 8; if(sig_len != 2 * order_bytes) return false; std::unique_ptr> sig(nullptr, ECDSA_SIG_free); sig.reset(::ECDSA_SIG_new()); BIGNUM* r = BN_bin2bn(sig_bytes , sig_len / 2, nullptr); BIGNUM* s = BN_bin2bn(sig_bytes + sig_len / 2, sig_len / 2, nullptr); if(r == nullptr || s == nullptr) throw OpenSSL_Error("BN_bin2bn sig s"); #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) sig->r = r; sig->s = s; #else ECDSA_SIG_set0(sig.get(), r, s); #endif const int res = ECDSA_do_verify(msg, msg_len, sig.get(), m_ossl_ec.get()); if(res < 0) throw OpenSSL_Error("ECDSA_do_verify"); return (res == 1); } private: std::unique_ptr> m_ossl_ec; size_t m_order_bits = 0; }; class OpenSSL_ECDSA_Signing_Operation final : public PK_Ops::Signature_with_EMSA { public: OpenSSL_ECDSA_Signing_Operation(const ECDSA_PrivateKey& ecdsa, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_ossl_ec(nullptr, ::EC_KEY_free) { const secure_vector der = PKCS8_for_openssl(ecdsa); const uint8_t* der_ptr = der.data(); m_ossl_ec.reset(d2i_ECPrivateKey(nullptr, &der_ptr, der.size())); if(!m_ossl_ec) throw OpenSSL_Error("d2i_ECPrivateKey"); const EC_GROUP* group = ::EC_KEY_get0_group(m_ossl_ec.get()); m_order_bits = ::EC_GROUP_get_degree(group); } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator&) override { std::unique_ptr> sig(nullptr, ECDSA_SIG_free); sig.reset(::ECDSA_do_sign(msg, msg_len, m_ossl_ec.get())); if(!sig) throw OpenSSL_Error("ECDSA_do_sign"); const size_t order_bytes = (m_order_bits + 7) / 8; #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) const BIGNUM* r = sig->r; const BIGNUM* s = sig->s; #else const BIGNUM* r; const BIGNUM* s; ECDSA_SIG_get0(sig.get(), &r, &s); #endif const size_t r_bytes = BN_num_bytes(r); const size_t s_bytes = BN_num_bytes(s); secure_vector sigval(2*order_bytes); BN_bn2bin(r, &sigval[order_bytes - r_bytes]); BN_bn2bin(s, &sigval[2*order_bytes - s_bytes]); return sigval; } size_t max_input_bits() const override { return m_order_bits; } private: std::unique_ptr> m_ossl_ec; size_t m_order_bits = 0; }; } std::unique_ptr make_openssl_ecdsa_ver_op(const ECDSA_PublicKey& key, const std::string& params) { const int nid = OpenSSL_EC_nid_for(key.domain().get_oid()); if(nid < 0) { throw Lookup_Error("OpenSSL ECDSA does not support this curve"); } return std::unique_ptr(new OpenSSL_ECDSA_Verification_Operation(key, params, nid)); } std::unique_ptr make_openssl_ecdsa_sig_op(const ECDSA_PrivateKey& key, const std::string& params) { const int nid = OpenSSL_EC_nid_for(key.domain().get_oid()); if(nid < 0) { throw Lookup_Error("OpenSSL ECDSA does not support this curve"); } return std::unique_ptr(new OpenSSL_ECDSA_Signing_Operation(key, params)); } #endif #if defined(BOTAN_HAS_ECDH) && !defined(OPENSSL_NO_ECDH) namespace { class OpenSSL_ECDH_KA_Operation final : public PK_Ops::Key_Agreement_with_KDF { public: OpenSSL_ECDH_KA_Operation(const ECDH_PrivateKey& ecdh, const std::string& kdf) : PK_Ops::Key_Agreement_with_KDF(kdf), m_ossl_ec(::EC_KEY_new(), ::EC_KEY_free) { const secure_vector der = PKCS8_for_openssl(ecdh); const uint8_t* der_ptr = der.data(); m_ossl_ec.reset(d2i_ECPrivateKey(nullptr, &der_ptr, der.size())); if(!m_ossl_ec) throw OpenSSL_Error("d2i_ECPrivateKey"); } secure_vector raw_agree(const uint8_t w[], size_t w_len) override { const EC_GROUP* group = ::EC_KEY_get0_group(m_ossl_ec.get()); const size_t out_len = (::EC_GROUP_get_degree(group) + 7) / 8; secure_vector out(out_len); EC_POINT* pub_key = ::EC_POINT_new(group); if(!pub_key) throw OpenSSL_Error("EC_POINT_new"); const int os2ecp_rc = ::EC_POINT_oct2point(group, pub_key, w, w_len, nullptr); if(os2ecp_rc != 1) throw OpenSSL_Error("EC_POINT_oct2point"); const int ecdh_rc = ::ECDH_compute_key(out.data(), out.size(), pub_key, m_ossl_ec.get(), /*KDF*/nullptr); if(ecdh_rc <= 0) throw OpenSSL_Error("ECDH_compute_key"); const size_t ecdh_sz = static_cast(ecdh_rc); if(ecdh_sz > out.size()) throw Internal_Error("OpenSSL ECDH returned more than requested"); out.resize(ecdh_sz); return out; } private: std::unique_ptr> m_ossl_ec; }; } std::unique_ptr make_openssl_ecdh_ka_op(const ECDH_PrivateKey& key, const std::string& params) { const int nid = OpenSSL_EC_nid_for(key.domain().get_oid()); if(nid < 0) { throw Lookup_Error("OpenSSL ECDH does not support this curve"); } return std::unique_ptr(new OpenSSL_ECDH_KA_Operation(key, params)); } #endif } botan-2.4.0/src/lib/prov/openssl/openssl_hash.cpp000066400000000000000000000076361322470703100220330ustar00rootroot00000000000000/* * OpenSSL Hash Functions * (C) 1999-2007,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { class OpenSSL_HashFunction final : public HashFunction { public: void clear() override { const EVP_MD* algo = EVP_MD_CTX_md(m_md); if(!EVP_DigestInit_ex(m_md, algo, nullptr)) throw OpenSSL_Error("EVP_DigestInit_ex"); } std::string provider() const override { return "openssl"; } std::string name() const override { return m_name; } HashFunction* clone() const override { const EVP_MD* algo = EVP_MD_CTX_md(m_md); return new OpenSSL_HashFunction(name(), algo); } std::unique_ptr copy_state() const override { std::unique_ptr copy(new OpenSSL_HashFunction(m_name, nullptr)); EVP_MD_CTX_copy(copy->m_md, m_md); return std::move(copy); } size_t output_length() const override { return EVP_MD_size(EVP_MD_CTX_md(m_md)); } size_t hash_block_size() const override { return EVP_MD_block_size(EVP_MD_CTX_md(m_md)); } OpenSSL_HashFunction(const std::string& name, const EVP_MD* md) : m_name(name) { #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) m_md = EVP_MD_CTX_create(); #else m_md = EVP_MD_CTX_new(); #endif if(m_md == nullptr) throw OpenSSL_Error("Can't allocate new context"); EVP_MD_CTX_init(m_md); if(md && !EVP_DigestInit_ex(m_md, md, nullptr)) throw OpenSSL_Error("EVP_DigestInit_ex"); } OpenSSL_HashFunction(EVP_MD_CTX* ctx) : m_md(ctx) { } ~OpenSSL_HashFunction() { #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) EVP_MD_CTX_destroy(m_md); #else EVP_MD_CTX_free(m_md); #endif } private: void add_data(const uint8_t input[], size_t length) override { if(!EVP_DigestUpdate(m_md, input, length)) throw OpenSSL_Error("EVP_DigestUpdate"); } void final_result(uint8_t output[]) override { if(!EVP_DigestFinal_ex(m_md, output, nullptr)) throw OpenSSL_Error("EVP_DigestFinal_ex"); const EVP_MD* algo = EVP_MD_CTX_md(m_md); if(!EVP_DigestInit_ex(m_md, algo, nullptr)) throw OpenSSL_Error("EVP_DigestInit_ex"); } std::string m_name; EVP_MD_CTX* m_md; }; } std::unique_ptr make_openssl_hash(const std::string& name) { #define MAKE_OPENSSL_HASH(fn) \ std::unique_ptr(new OpenSSL_HashFunction(name, fn ())) #if defined(BOTAN_HAS_SHA2_32) && !defined(OPENSSL_NO_SHA256) if(name == "SHA-224") return MAKE_OPENSSL_HASH(EVP_sha224); if(name == "SHA-256") return MAKE_OPENSSL_HASH(EVP_sha256); #endif #if defined(BOTAN_HAS_SHA2_64) && !defined(OPENSSL_NO_SHA512) if(name == "SHA-384") return MAKE_OPENSSL_HASH(EVP_sha384); if(name == "SHA-512") return MAKE_OPENSSL_HASH(EVP_sha512); #endif #if defined(BOTAN_HAS_SHA1) && !defined(OPENSSL_NO_SHA) if(name == "SHA-160" || name == "SHA-1" || name == "SHA1") return MAKE_OPENSSL_HASH(EVP_sha1); #endif #if defined(BOTAN_HAS_RIPEMD_160) && !defined(OPENSSL_NO_RIPEMD) if(name == "RIPEMD-160") return MAKE_OPENSSL_HASH(EVP_ripemd160); #endif #if defined(BOTAN_HAS_MD5) && !defined(OPENSSL_NO_MD5) if(name == "MD5") return MAKE_OPENSSL_HASH(EVP_md5); #endif #if defined(BOTAN_HAS_MD4) && !defined(OPENSSL_NO_MD4) if(name == "MD4") return MAKE_OPENSSL_HASH(EVP_md4); #endif return nullptr; } } botan-2.4.0/src/lib/prov/openssl/openssl_mode.cpp000066400000000000000000000142261322470703100220250ustar00rootroot00000000000000/* * Cipher Modes via OpenSSL * (C) 1999-2010,2015 Jack Lloyd * (C) 2017 Alexander Bluhm (genua GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { class OpenSSL_Cipher_Mode final : public Cipher_Mode { public: OpenSSL_Cipher_Mode(const std::string& name, const EVP_CIPHER* cipher, Cipher_Dir direction); ~OpenSSL_Cipher_Mode(); std::string provider() const override { return "openssl"; } std::string name() const override { return m_mode_name; } void start_msg(const uint8_t nonce[], size_t nonce_len) override; size_t process(uint8_t msg[], size_t msg_len) override; void finish(secure_vector& final_block, size_t offset0) override; size_t output_length(size_t input_length) const override; size_t update_granularity() const override; size_t minimum_final_size() const override; size_t default_nonce_length() const override; bool valid_nonce_length(size_t nonce_len) const override; void clear() override; void reset() override; Key_Length_Specification key_spec() const override; private: void key_schedule(const uint8_t key[], size_t length) override; const std::string m_mode_name; const Cipher_Dir m_direction; size_t m_block_size; EVP_CIPHER_CTX* m_cipher; }; OpenSSL_Cipher_Mode::OpenSSL_Cipher_Mode(const std::string& name, const EVP_CIPHER* algo, Cipher_Dir direction) : m_mode_name(name), m_direction(direction) { m_block_size = EVP_CIPHER_block_size(algo); if(EVP_CIPHER_mode(algo) != EVP_CIPH_CBC_MODE) throw Invalid_Argument("OpenSSL_BlockCipher: Non-CBC EVP was passed in"); m_cipher = EVP_CIPHER_CTX_new(); if (m_cipher == nullptr) throw OpenSSL_Error("Can't allocate new context"); EVP_CIPHER_CTX_init(m_cipher); if(!EVP_CipherInit_ex(m_cipher, algo, nullptr, nullptr, nullptr, m_direction == ENCRYPTION ? 1 : 0)) throw OpenSSL_Error("EVP_CipherInit_ex"); if(!EVP_CIPHER_CTX_set_padding(m_cipher, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding"); } OpenSSL_Cipher_Mode::~OpenSSL_Cipher_Mode() { EVP_CIPHER_CTX_free(m_cipher); } void OpenSSL_Cipher_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) throw Invalid_IV_Length(name(), nonce_len); if(nonce_len) { if(!EVP_CipherInit_ex(m_cipher, nullptr, nullptr, nullptr, nonce, -1)) throw OpenSSL_Error("EVP_CipherInit_ex nonce"); } } size_t OpenSSL_Cipher_Mode::process(uint8_t msg[], size_t msg_len) { if(msg_len == 0) return 0; if(msg_len > INT_MAX) throw Internal_Error("msg_len overflow"); int outl = msg_len; secure_vector out(outl); if(!EVP_CipherUpdate(m_cipher, out.data(), &outl, msg, msg_len)) throw OpenSSL_Error("EVP_CipherUpdate"); memcpy(msg, out.data(), outl); return outl; } void OpenSSL_Cipher_Mode::finish(secure_vector& buffer, size_t offset) { BOTAN_ASSERT(buffer.size() >= offset, "Offset ok"); uint8_t* buf = buffer.data() + offset; const size_t buf_size = buffer.size() - offset; size_t written = process(buf, buf_size); int outl = buf_size - written; secure_vector out(outl); if(!EVP_CipherFinal_ex(m_cipher, out.data(), &outl)) throw OpenSSL_Error("EVP_CipherFinal_ex"); memcpy(buf + written, out.data(), outl); written += outl; buffer.resize(offset + written); } size_t OpenSSL_Cipher_Mode::update_granularity() const { return m_block_size * BOTAN_BLOCK_CIPHER_PAR_MULT; } size_t OpenSSL_Cipher_Mode::minimum_final_size() const { return 0; // no padding } size_t OpenSSL_Cipher_Mode::default_nonce_length() const { return m_block_size; } bool OpenSSL_Cipher_Mode::valid_nonce_length(size_t nonce_len) const { return (nonce_len == 0 || nonce_len == m_block_size); } size_t OpenSSL_Cipher_Mode::output_length(size_t input_length) const { if(input_length == 0) return m_block_size; else return round_up(input_length, m_block_size); } void OpenSSL_Cipher_Mode::clear() { const EVP_CIPHER* algo = EVP_CIPHER_CTX_cipher(m_cipher); if(!EVP_CIPHER_CTX_cleanup(m_cipher)) throw OpenSSL_Error("EVP_CIPHER_CTX_cleanup"); EVP_CIPHER_CTX_init(m_cipher); if(!EVP_CipherInit_ex(m_cipher, algo, nullptr, nullptr, nullptr, m_direction == ENCRYPTION ? 1 : 0)) throw OpenSSL_Error("EVP_CipherInit_ex clear"); if(!EVP_CIPHER_CTX_set_padding(m_cipher, 0)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_padding clear"); } void OpenSSL_Cipher_Mode::reset() { if(!EVP_CipherInit_ex(m_cipher, nullptr, nullptr, nullptr, nullptr, -1)) throw OpenSSL_Error("EVP_CipherInit_ex clear"); } Key_Length_Specification OpenSSL_Cipher_Mode::key_spec() const { return Key_Length_Specification(EVP_CIPHER_CTX_key_length(m_cipher)); } void OpenSSL_Cipher_Mode::key_schedule(const uint8_t key[], size_t length) { if(!EVP_CIPHER_CTX_set_key_length(m_cipher, length)) throw OpenSSL_Error("EVP_CIPHER_CTX_set_key_length"); if(!EVP_CipherInit_ex(m_cipher, nullptr, nullptr, key, nullptr, -1)) throw OpenSSL_Error("EVP_CipherInit_ex key"); } } Cipher_Mode* make_openssl_cipher_mode(const std::string& name, Cipher_Dir direction) { #define MAKE_OPENSSL_MODE(evp_fn) \ new OpenSSL_Cipher_Mode(name, (evp_fn)(), direction) #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_MODE_CBC) && !defined(OPENSSL_NO_AES) if(name == "AES-128/CBC/NoPadding") return MAKE_OPENSSL_MODE(EVP_aes_128_cbc); if(name == "AES-192/CBC/NoPadding") return MAKE_OPENSSL_MODE(EVP_aes_192_cbc); if(name == "AES-256/CBC/NoPadding") return MAKE_OPENSSL_MODE(EVP_aes_256_cbc); #endif #undef MAKE_OPENSSL_MODE return nullptr; } } botan-2.4.0/src/lib/prov/openssl/openssl_rc4.cpp000066400000000000000000000041401322470703100215630ustar00rootroot00000000000000/* * OpenSSL RC4 * (C) 1999-2007,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_OPENSSL) && defined(BOTAN_HAS_RC4) #include #include #include #include namespace Botan { namespace { class OpenSSL_RC4 final : public StreamCipher { public: void clear() override { clear_mem(&m_rc4, 1); m_key_set = false; } std::string provider() const override { return "openssl"; } std::string name() const override { switch(m_skip) { case 0: return "RC4"; case 256: return "MARK-4"; default: return "RC4(" + std::to_string(m_skip) + ")"; } } StreamCipher* clone() const override { return new OpenSSL_RC4(m_skip); } Key_Length_Specification key_spec() const override { return Key_Length_Specification(1, 32); } explicit OpenSSL_RC4(size_t skip = 0) : m_skip(skip) { clear(); } ~OpenSSL_RC4() { clear(); } void set_iv(const uint8_t*, size_t len) override { if(len > 0) throw Exception("RC4 does not support an IV"); } void seek(uint64_t) override { throw Not_Implemented("RC4 does not support seeking"); } private: void cipher(const uint8_t in[], uint8_t out[], size_t length) override { verify_key_set(m_key_set); ::RC4(&m_rc4, length, in, out); } void key_schedule(const uint8_t key[], size_t length) override { ::RC4_set_key(&m_rc4, length, key); uint8_t d = 0; for(size_t i = 0; i != m_skip; ++i) ::RC4(&m_rc4, 1, &d, &d); m_key_set = true; } size_t m_skip; RC4_KEY m_rc4; bool m_key_set; }; } std::unique_ptr make_openssl_rc4(size_t skip) { return std::unique_ptr(new OpenSSL_RC4(skip)); } } #endif botan-2.4.0/src/lib/prov/openssl/openssl_rsa.cpp000066400000000000000000000230421322470703100216620ustar00rootroot00000000000000/* * RSA operations provided by OpenSSL * (C) 2015 Jack Lloyd * (C) 2017 Alexander Bluhm * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_RSA) #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace { std::pair get_openssl_enc_pad(const std::string& eme) { if(eme == "Raw") return std::make_pair(RSA_NO_PADDING, 0); else if(eme == "EME-PKCS1-v1_5") return std::make_pair(RSA_PKCS1_PADDING, 11); else if(eme == "OAEP(SHA-1)" || eme == "EME1(SHA-1)") return std::make_pair(RSA_PKCS1_OAEP_PADDING, 41); else throw Lookup_Error("OpenSSL RSA does not support EME " + eme); } class OpenSSL_RSA_Encryption_Operation final : public PK_Ops::Encryption { public: OpenSSL_RSA_Encryption_Operation(const RSA_PublicKey& rsa, int pad, size_t pad_overhead) : m_openssl_rsa(nullptr, ::RSA_free), m_padding(pad) { const std::vector der = rsa.public_key_bits(); const uint8_t* der_ptr = der.data(); m_openssl_rsa.reset(::d2i_RSAPublicKey(nullptr, &der_ptr, der.size())); if(!m_openssl_rsa) throw OpenSSL_Error("d2i_RSAPublicKey"); m_bits = 8 * (n_size() - pad_overhead) - 1; } size_t max_input_bits() const override { return m_bits; }; secure_vector encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator&) override { const size_t mod_sz = n_size(); if(msg_len > mod_sz) throw Invalid_Argument("Input too large for RSA key"); secure_vector outbuf(mod_sz); secure_vector inbuf; if(m_padding == RSA_NO_PADDING) { inbuf.resize(mod_sz); copy_mem(&inbuf[mod_sz - msg_len], msg, msg_len); } else { inbuf.assign(msg, msg + msg_len); } int rc = ::RSA_public_encrypt(inbuf.size(), inbuf.data(), outbuf.data(), m_openssl_rsa.get(), m_padding); if(rc < 0) throw OpenSSL_Error("RSA_public_encrypt"); return outbuf; } private: size_t n_size() const { return ::RSA_size(m_openssl_rsa.get()); } std::unique_ptr> m_openssl_rsa; size_t m_bits = 0; int m_padding = 0; }; class OpenSSL_RSA_Decryption_Operation final : public PK_Ops::Decryption { public: OpenSSL_RSA_Decryption_Operation(const RSA_PrivateKey& rsa, int pad) : m_openssl_rsa(nullptr, ::RSA_free), m_padding(pad) { const secure_vector der = rsa.private_key_bits(); const uint8_t* der_ptr = der.data(); m_openssl_rsa.reset(d2i_RSAPrivateKey(nullptr, &der_ptr, der.size())); if(!m_openssl_rsa) throw OpenSSL_Error("d2i_RSAPrivateKey"); } secure_vector decrypt(uint8_t& valid_mask, const uint8_t msg[], size_t msg_len) override { secure_vector buf(::RSA_size(m_openssl_rsa.get())); int rc = ::RSA_private_decrypt(msg_len, msg, buf.data(), m_openssl_rsa.get(), m_padding); if(rc < 0 || static_cast(rc) > buf.size()) { valid_mask = 0; buf.resize(0); } else { valid_mask = 0xFF; buf.resize(rc); } if(m_padding == RSA_NO_PADDING) { return CT::strip_leading_zeros(buf); } return buf; } private: std::unique_ptr> m_openssl_rsa; int m_padding = 0; }; class OpenSSL_RSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: OpenSSL_RSA_Verification_Operation(const RSA_PublicKey& rsa, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_openssl_rsa(nullptr, ::RSA_free) { const std::vector der = rsa.public_key_bits(); const uint8_t* der_ptr = der.data(); m_openssl_rsa.reset(::d2i_RSAPublicKey(nullptr, &der_ptr, der.size())); if(!m_openssl_rsa) throw OpenSSL_Error("d2i_RSAPublicKey"); } size_t max_input_bits() const override { #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) return ::BN_num_bits(m_openssl_rsa->n) - 1; #else return ::RSA_bits(m_openssl_rsa.get()) - 1; #endif } bool with_recovery() const override { return true; } secure_vector verify_mr(const uint8_t msg[], size_t msg_len) override { const size_t mod_sz = ::RSA_size(m_openssl_rsa.get()); if(msg_len > mod_sz) throw Invalid_Argument("OpenSSL RSA verify input too large"); secure_vector inbuf(mod_sz); if(msg_len > 0) copy_mem(&inbuf[mod_sz - msg_len], msg, msg_len); secure_vector outbuf(mod_sz); int rc = ::RSA_public_decrypt(inbuf.size(), inbuf.data(), outbuf.data(), m_openssl_rsa.get(), RSA_NO_PADDING); if(rc < 0) throw Invalid_Argument("RSA_public_decrypt"); return CT::strip_leading_zeros(outbuf); } private: std::unique_ptr> m_openssl_rsa; }; class OpenSSL_RSA_Signing_Operation final : public PK_Ops::Signature_with_EMSA { public: OpenSSL_RSA_Signing_Operation(const RSA_PrivateKey& rsa, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_openssl_rsa(nullptr, ::RSA_free) { const secure_vector der = rsa.private_key_bits(); const uint8_t* der_ptr = der.data(); m_openssl_rsa.reset(d2i_RSAPrivateKey(nullptr, &der_ptr, der.size())); if(!m_openssl_rsa) throw OpenSSL_Error("d2i_RSAPrivateKey"); } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator&) override { const size_t mod_sz = ::RSA_size(m_openssl_rsa.get()); if(msg_len > mod_sz) throw Invalid_Argument("OpenSSL RSA sign input too large"); secure_vector inbuf(mod_sz); copy_mem(&inbuf[mod_sz - msg_len], msg, msg_len); secure_vector outbuf(mod_sz); int rc = ::RSA_private_encrypt(inbuf.size(), inbuf.data(), outbuf.data(), m_openssl_rsa.get(), RSA_NO_PADDING); if(rc < 0) throw OpenSSL_Error("RSA_private_encrypt"); return outbuf; } size_t max_input_bits() const override { #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) return ::BN_num_bits(m_openssl_rsa->n) - 1; #else return ::RSA_bits(m_openssl_rsa.get()) - 1; #endif } private: std::unique_ptr> m_openssl_rsa; }; } std::unique_ptr make_openssl_rsa_enc_op(const RSA_PublicKey& key, const std::string& params) { auto pad_info = get_openssl_enc_pad(params); return std::unique_ptr( new OpenSSL_RSA_Encryption_Operation(key, pad_info.first, pad_info.second)); } std::unique_ptr make_openssl_rsa_dec_op(const RSA_PrivateKey& key, const std::string& params) { auto pad_info = get_openssl_enc_pad(params); return std::unique_ptr(new OpenSSL_RSA_Decryption_Operation(key, pad_info.first)); } std::unique_ptr make_openssl_rsa_ver_op(const RSA_PublicKey& key, const std::string& params) { return std::unique_ptr(new OpenSSL_RSA_Verification_Operation(key, params)); } std::unique_ptr make_openssl_rsa_sig_op(const RSA_PrivateKey& key, const std::string& params) { return std::unique_ptr(new OpenSSL_RSA_Signing_Operation(key, params)); } std::unique_ptr make_openssl_rsa_private_key(RandomNumberGenerator& rng, size_t rsa_bits) { if (rsa_bits > INT_MAX) throw Internal_Error("rsa_bits overflow"); secure_vector seed(BOTAN_SYSTEM_RNG_POLL_REQUEST); rng.randomize(seed.data(), seed.size()); RAND_seed(seed.data(), seed.size()); std::unique_ptr> bn(BN_new(), BN_free); if(!bn) throw OpenSSL_Error("BN_new"); if(!BN_set_word(bn.get(), RSA_F4)) throw OpenSSL_Error("BN_set_word"); std::unique_ptr> rsa(RSA_new(), RSA_free); if(!rsa) throw OpenSSL_Error("RSA_new"); if(!RSA_generate_key_ex(rsa.get(), rsa_bits, bn.get(), nullptr)) throw OpenSSL_Error("RSA_generate_key_ex"); uint8_t* der = nullptr; int bytes = i2d_RSAPrivateKey(rsa.get(), &der); if(bytes < 0) throw OpenSSL_Error("i2d_RSAPrivateKey"); const secure_vector keydata(der, der + bytes); memset(der, 0, bytes); std::free(der); return std::unique_ptr (new RSA_PrivateKey(AlgorithmIdentifier(), keydata)); } } #endif // BOTAN_HAS_RSA botan-2.4.0/src/lib/prov/pkcs11/000077500000000000000000000000001322470703100162445ustar00rootroot00000000000000botan-2.4.0/src/lib/prov/pkcs11/info.txt000066400000000000000000000005701322470703100177420ustar00rootroot00000000000000 PKCS11 -> 20160219 dyn_load rng pk_pad p11_mechanism.h pkcs11.h pkcs11f.h pkcs11t.h p11.h p11_ecc_key.h p11_ecdh.h p11_ecdsa.h p11_module.h p11_object.h p11_randomgenerator.h p11_rsa.h p11_session.h p11_slot.h p11_x509.h botan-2.4.0/src/lib/prov/pkcs11/p11.cpp000066400000000000000000000757701322470703100173710ustar00rootroot00000000000000/* * PKCS#11 * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace PKCS11 { ReturnValue* ThrowException = reinterpret_cast< ReturnValue* >(-1); namespace { /// @param function_result Return value of the PKCS11 module function /// @param return_value if (`ThrowException`) is passed the function throws an exception, otherwise if a non-NULL pointer is passed: /// return_value receives the return value of the PKCS#11 function and no exception is thrown. /// @return true if function call was successful, false otherwise bool handle_return_value(const CK_RV function_result, ReturnValue* return_value) { if(return_value == ThrowException) { if(static_cast< ReturnValue >(function_result) != ReturnValue::OK) { // caller wants exception throw PKCS11_ReturnError(static_cast< ReturnValue >(function_result)); } } else if(return_value != nullptr) { // caller wants return value *return_value = static_cast< ReturnValue >(function_result); } return static_cast< ReturnValue >(function_result) == ReturnValue::OK; } } void initialize_token(Slot& slot, const std::string& label, const secure_string& so_pin, const secure_string& pin) { slot.initialize(label, so_pin); set_pin(slot, so_pin, pin); } void change_pin(Slot& slot, const secure_string& old_pin, const secure_string& new_pin) { Session session(slot, false); session.login(UserType::User, old_pin); session.set_pin(old_pin, new_pin); } void change_so_pin(Slot& slot, const secure_string& old_so_pin, const secure_string& new_so_pin) { Session session(slot, false); session.login(UserType::SO, old_so_pin); session.set_pin(old_so_pin, new_so_pin); } void set_pin(Slot& slot, const secure_string& so_pin, const secure_string& pin) { Session session(slot, false); session.login(UserType::SO, so_pin); session.init_pin(pin); } LowLevel::LowLevel(FunctionListPtr ptr) : m_func_list_ptr(ptr) { if(m_func_list_ptr == nullptr) { throw Invalid_Argument("Invalid PKCS#11 function list ptr"); } } /****************************** General purpose functions ******************************/ bool LowLevel::C_Initialize(VoidPtr init_args, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Initialize(init_args), return_value); } bool LowLevel::C_Finalize(VoidPtr reserved, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Finalize(reserved), return_value); } bool LowLevel::C_GetInfo(Info* info_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetInfo(info_ptr), return_value); } bool LowLevel::C_GetFunctionList(Dynamically_Loaded_Library& pkcs11_module, FunctionListPtr* function_list_ptr_ptr, ReturnValue* return_value) { using get_function_list = CK_RV(*)(FunctionListPtr*); get_function_list get_function_list_ptr = pkcs11_module.resolve("C_GetFunctionList"); return handle_return_value(get_function_list_ptr(function_list_ptr_ptr), return_value); } /****************************** Slot and token management functions ******************************/ bool LowLevel::C_GetSlotList(Bbool token_present, SlotId* slot_list_ptr, Ulong* count_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetSlotList(token_present, slot_list_ptr, count_ptr), return_value); } bool LowLevel::C_GetSlotList(bool token_present, std::vector& slot_ids, ReturnValue* return_value) const { slot_ids.clear(); // first get available slots Ulong number_slots = 0; bool success = C_GetSlotList(token_present, nullptr, &number_slots, return_value); if(!success || !number_slots) { return success; } // get actual slot ids slot_ids.resize(number_slots); return C_GetSlotList(token_present, slot_ids.data(), &number_slots, return_value); } bool LowLevel::C_GetSlotInfo(SlotId slot_id, SlotInfo* info_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetSlotInfo(slot_id, info_ptr), return_value); } bool LowLevel::C_GetTokenInfo(SlotId slot_id, TokenInfo* info_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetTokenInfo(slot_id, info_ptr), return_value); } bool LowLevel::C_WaitForSlotEvent(Flags flags, SlotId* slot_ptr, VoidPtr reserved, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_WaitForSlotEvent(flags, slot_ptr, reserved), return_value); } bool LowLevel::C_GetMechanismList(SlotId slot_id, MechanismType* mechanism_list_ptr, Ulong* count_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetMechanismList(slot_id, reinterpret_cast< CK_MECHANISM_TYPE_PTR >(mechanism_list_ptr), count_ptr), return_value); } bool LowLevel::C_GetMechanismList(SlotId slot_id, std::vector& mechanisms, ReturnValue* return_value) const { mechanisms.clear(); // first get number of mechanisms Ulong number_mechanisms = 0; bool success = C_GetMechanismList(slot_id, nullptr, &number_mechanisms, return_value); if(!success || !number_mechanisms) { return success; } // get actual mechanisms mechanisms.resize(number_mechanisms); return C_GetMechanismList(slot_id, reinterpret_cast< MechanismType* >(mechanisms.data()), &number_mechanisms, return_value); } bool LowLevel::C_GetMechanismInfo(SlotId slot_id, MechanismType type, MechanismInfo* info_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetMechanismInfo(slot_id, static_cast< CK_MECHANISM_TYPE >(type), info_ptr), return_value); } bool LowLevel::C_InitToken(SlotId slot_id, Utf8Char* so_pin_ptr, Ulong so_pin_len, Utf8Char* label_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_InitToken(slot_id, so_pin_ptr, so_pin_len, label_ptr), return_value); } bool LowLevel::C_InitPIN(SessionHandle session, Utf8Char* pin_ptr, Ulong pin_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_InitPIN(session, pin_ptr, pin_len), return_value); } bool LowLevel::C_SetPIN(SessionHandle session, Utf8Char* old_pin_ptr, Ulong old_len, Utf8Char* new_pin_ptr, Ulong new_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SetPIN(session, old_pin_ptr, old_len, new_pin_ptr, new_len), return_value); } /****************************** Session management ******************************/ bool LowLevel::C_OpenSession(SlotId slot_id, Flags flags, VoidPtr application, Notify notify, SessionHandle* session_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_OpenSession(slot_id, flags, application, notify, session_ptr), return_value); } bool LowLevel::C_CloseSession(SessionHandle session, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_CloseSession(session), return_value); } bool LowLevel::C_CloseAllSessions(SlotId slot_id, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_CloseAllSessions(slot_id), return_value); } bool LowLevel::C_GetSessionInfo(SessionHandle session, SessionInfo* info_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetSessionInfo(session, info_ptr), return_value); } bool LowLevel::C_GetOperationState(SessionHandle session, Byte* operation_state_ptr, Ulong* operation_state_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetOperationState(session, operation_state_ptr, operation_state_len_ptr), return_value); } bool LowLevel::C_SetOperationState(SessionHandle session, Byte* operation_state_ptr, Ulong operation_state_len, ObjectHandle encryption_key, ObjectHandle authentication_key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SetOperationState(session, operation_state_ptr, operation_state_len, encryption_key, authentication_key), return_value); } bool LowLevel::C_Login(SessionHandle session, UserType user_type, Utf8Char* pin_ptr, Ulong pin_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Login(session, static_cast< CK_USER_TYPE >(user_type), pin_ptr, pin_len), return_value); } bool LowLevel::C_Logout(SessionHandle session, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Logout(session), return_value); } /****************************** Object management functions ******************************/ bool LowLevel::C_CreateObject(SessionHandle session, Attribute* attribute_template_ptr, Ulong count, ObjectHandle* object_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_CreateObject(session, attribute_template_ptr, count, object_ptr), return_value); } bool LowLevel::C_CopyObject(SessionHandle session, ObjectHandle object, Attribute* attribute_template_ptr, Ulong count, ObjectHandle* new_object_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_CopyObject(session, object, attribute_template_ptr, count, new_object_ptr), return_value); } bool LowLevel::C_DestroyObject(SessionHandle session, ObjectHandle object, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DestroyObject(session, object), return_value); } bool LowLevel::C_GetObjectSize(SessionHandle session, ObjectHandle object, Ulong* size_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetObjectSize(session, object, size_ptr), return_value); } bool LowLevel::C_GetAttributeValue(SessionHandle session, ObjectHandle object, Attribute* attribute_template_ptr, Ulong count, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetAttributeValue(session, object, attribute_template_ptr, count), return_value); } bool LowLevel::C_SetAttributeValue(SessionHandle session, ObjectHandle object, Attribute* attribute_template_ptr, Ulong count, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SetAttributeValue(session, object, attribute_template_ptr, count), return_value); } bool LowLevel::C_FindObjectsInit(SessionHandle session, Attribute* attribute_template_ptr, Ulong count, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_FindObjectsInit(session, attribute_template_ptr, count), return_value); } bool LowLevel::C_FindObjects(SessionHandle session, ObjectHandle* object_ptr, Ulong max_object_count, Ulong* object_count_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_FindObjects(session, object_ptr, max_object_count, object_count_ptr), return_value); } bool LowLevel::C_FindObjectsFinal(SessionHandle session, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_FindObjectsFinal(session), return_value); } /****************************** Encryption functions ******************************/ bool LowLevel::C_EncryptInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_EncryptInit(session, mechanism_ptr, key), return_value); } bool LowLevel::C_Encrypt(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* encrypted_data_ptr, Ulong* encrypted_data_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Encrypt(session, data_ptr, data_len, encrypted_data_ptr, encrypted_data_len_ptr), return_value); } bool LowLevel::C_EncryptUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, Byte* encrypted_part_ptr, Ulong* encrypted_part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_EncryptUpdate(session, part_ptr, part_len, encrypted_part_ptr, encrypted_part_len_ptr), return_value); } bool LowLevel::C_EncryptFinal(SessionHandle session, Byte* last_encrypted_part_ptr, Ulong* last_encrypted_part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_EncryptFinal(session, last_encrypted_part_ptr, last_encrypted_part_len_ptr), return_value); } /****************************** Decryption functions ******************************/ bool LowLevel::C_DecryptInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DecryptInit(session, mechanism_ptr, key), return_value); } bool LowLevel::C_Decrypt(SessionHandle session, Byte* encrypted_data_ptr, Ulong encrypted_data_len, Byte* data_ptr, Ulong* data_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Decrypt(session, encrypted_data_ptr, encrypted_data_len, data_ptr, data_len_ptr), return_value); } bool LowLevel::C_DecryptUpdate(SessionHandle session, Byte* encrypted_part_ptr, Ulong encrypted_part_len, Byte* part_ptr, Ulong* part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DecryptUpdate(session, encrypted_part_ptr, encrypted_part_len, part_ptr, part_len_ptr), return_value); } bool LowLevel::C_DecryptFinal(SessionHandle session, Byte* last_part_ptr, Ulong* last_part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DecryptFinal(session, last_part_ptr, last_part_len_ptr), return_value); } /****************************** Message digesting functions ******************************/ bool LowLevel::C_DigestInit(SessionHandle session, Mechanism* mechanism, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DigestInit(session, mechanism), return_value); } bool LowLevel::C_Digest(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* digest_ptr, Ulong* digest_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Digest(session, data_ptr, data_len, digest_ptr, digest_len_ptr), return_value); } bool LowLevel::C_DigestUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DigestUpdate(session, part_ptr, part_len), return_value); } bool LowLevel::C_DigestKey(SessionHandle session, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DigestKey(session, key), return_value); } bool LowLevel::C_DigestFinal(SessionHandle session, Byte* digest_ptr, Ulong* digest_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DigestFinal(session, digest_ptr, digest_len_ptr), return_value); } /****************************** Signing and MACing functions ******************************/ bool LowLevel::C_SignInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SignInit(session, mechanism_ptr, key), return_value); } bool LowLevel::C_Sign(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* signature_ptr, Ulong* signature_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Sign(session, data_ptr, data_len, signature_ptr, signature_len_ptr), return_value); } bool LowLevel::C_SignUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SignUpdate(session, part_ptr, part_len), return_value); } bool LowLevel::C_SignFinal(SessionHandle session, Byte* signature_ptr, Ulong* signature_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SignFinal(session, signature_ptr, signature_len_ptr), return_value); } bool LowLevel::C_SignRecoverInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SignRecoverInit(session, mechanism_ptr, key), return_value); } bool LowLevel::C_SignRecover(SessionHandle session, Byte* data, Ulong data_len, Byte* signature, Ulong* signature_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SignRecover(session, data, data_len, signature, signature_len), return_value); } /****************************** Functions for verifying signatures and MACs ******************************/ bool LowLevel::C_VerifyInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_VerifyInit(session, mechanism_ptr, key), return_value); } bool LowLevel::C_Verify(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* signature_ptr, Ulong signature_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_Verify(session, data_ptr, data_len, signature_ptr, signature_len), return_value); } bool LowLevel::C_VerifyUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_VerifyUpdate(session, part_ptr, part_len), return_value); } bool LowLevel::C_VerifyFinal(SessionHandle session, Byte* signature_ptr, Ulong signature_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_VerifyFinal(session, signature_ptr, signature_len), return_value); } bool LowLevel::C_VerifyRecoverInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_VerifyRecoverInit(session, mechanism_ptr, key), return_value); } bool LowLevel::C_VerifyRecover(SessionHandle session, Byte* signature_ptr, Ulong signature_len, Byte* data_ptr, Ulong* data_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_VerifyRecover(session, signature_ptr, signature_len, data_ptr, data_len_ptr), return_value); } /****************************** Dual-purpose cryptographic functions ******************************/ bool LowLevel::C_DigestEncryptUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, Byte* encrypted_part_ptr, Ulong* encrypted_part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DigestEncryptUpdate(session, part_ptr, part_len, encrypted_part_ptr, encrypted_part_len_ptr), return_value); } bool LowLevel::C_DecryptDigestUpdate(SessionHandle session, Byte* encrypted_part_ptr, Ulong encrypted_part_len, Byte* part_ptr, Ulong* part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DecryptDigestUpdate(session, encrypted_part_ptr, encrypted_part_len, part_ptr, part_len_ptr), return_value); } bool LowLevel::C_SignEncryptUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, Byte* encrypted_part_ptr, Ulong* encrypted_part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SignEncryptUpdate(session, part_ptr, part_len, encrypted_part_ptr, encrypted_part_len_ptr), return_value); } bool LowLevel::C_DecryptVerifyUpdate(SessionHandle session, Byte* encrypted_part_ptr, Ulong encrypted_part_len, Byte* part_ptr, Ulong* part_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DecryptVerifyUpdate(session, encrypted_part_ptr, encrypted_part_len, part_ptr, part_len_ptr), return_value); } /****************************** Key management functions ******************************/ bool LowLevel::C_GenerateKey(SessionHandle session, Mechanism* mechanism_ptr, Attribute* attribute_template_ptr, Ulong count, ObjectHandle* key_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GenerateKey(session, mechanism_ptr, attribute_template_ptr, count, key_ptr), return_value); } bool LowLevel::C_GenerateKeyPair(SessionHandle session, Mechanism* mechanism_ptr, Attribute* public_key_template_ptr, Ulong public_key_attribute_count, Attribute* private_key_template_ptr, Ulong private_key_attribute_count, ObjectHandle* public_key_ptr, ObjectHandle* private_key_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GenerateKeyPair(session, mechanism_ptr, public_key_template_ptr, public_key_attribute_count, private_key_template_ptr, private_key_attribute_count, public_key_ptr, private_key_ptr), return_value); } bool LowLevel::C_WrapKey(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle wrapping_key, ObjectHandle key, Byte* wrapped_key_ptr, Ulong* wrapped_key_len_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_WrapKey(session, mechanism_ptr, wrapping_key, key, wrapped_key_ptr, wrapped_key_len_ptr), return_value); } bool LowLevel::C_UnwrapKey(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle unwrapping_key, Byte* wrapped_key_ptr, Ulong wrapped_key_len, Attribute* attribute_template_ptr, Ulong attribute_count, ObjectHandle* key_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_UnwrapKey(session, mechanism_ptr, unwrapping_key, wrapped_key_ptr, wrapped_key_len, attribute_template_ptr, attribute_count, key_ptr), return_value); } bool LowLevel::C_DeriveKey(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle base_key, Attribute* attribute_template_ptr, Ulong attribute_count, ObjectHandle* key_ptr, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_DeriveKey(session, mechanism_ptr, base_key, attribute_template_ptr, attribute_count, key_ptr), return_value); } /****************************** Random number generation functions ******************************/ bool LowLevel::C_SeedRandom(SessionHandle session, Byte* seed_ptr, Ulong seed_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_SeedRandom(session, seed_ptr, seed_len), return_value); } bool LowLevel::C_GenerateRandom(SessionHandle session, Byte* random_data_ptr, Ulong random_len, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GenerateRandom(session, random_data_ptr, random_len), return_value); } /****************************** Parallel function management functions ******************************/ bool LowLevel::C_GetFunctionStatus(SessionHandle session, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_GetFunctionStatus(session), return_value); } bool LowLevel::C_CancelFunction(SessionHandle session, ReturnValue* return_value) const { return handle_return_value(m_func_list_ptr->C_CancelFunction(session), return_value); } } } botan-2.4.0/src/lib/prov/pkcs11/p11.h000066400000000000000000004144101322470703100170220ustar00rootroot00000000000000/* * PKCS#11 * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_H_ #define BOTAN_P11_H_ #include #include #include #include #include #include #define CK_PTR * #if defined(_MSC_VER) #define CK_DECLARE_FUNCTION(returnType, name) \ returnType __declspec(dllimport) name #else #define CK_DECLARE_FUNCTION(returnType, name) \ returnType name #endif #if defined(_MSC_VER) #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ returnType __declspec(dllimport) (* name) #else #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ returnType (* name) #endif #define CK_CALLBACK_FUNCTION(returnType, name) \ returnType (* name) #ifndef NULL_PTR #define NULL_PTR nullptr #endif #if defined(_MSC_VER) #pragma pack(push, cryptoki, 1) #endif #include "pkcs11.h" #if defined(_MSC_VER) #pragma pack(pop, cryptoki) #endif static_assert(CRYPTOKI_VERSION_MAJOR == 2 && CRYPTOKI_VERSION_MINOR == 40, "The Botan PKCS#11 module was implemented against PKCS#11 v2.40. Please use the correct PKCS#11 headers."); namespace Botan { namespace PKCS11 { using secure_string = secure_vector; enum class AttributeType : CK_ATTRIBUTE_TYPE { Class = CKA_CLASS, Token = CKA_TOKEN, Private = CKA_PRIVATE, Label = CKA_LABEL, Application = CKA_APPLICATION, Value = CKA_VALUE, ObjectId = CKA_OBJECT_ID, CertificateType = CKA_CERTIFICATE_TYPE, Issuer = CKA_ISSUER, SerialNumber = CKA_SERIAL_NUMBER, AcIssuer = CKA_AC_ISSUER, Owner = CKA_OWNER, AttrTypes = CKA_ATTR_TYPES, Trusted = CKA_TRUSTED, CertificateCategory = CKA_CERTIFICATE_CATEGORY, JavaMidpSecurityDomain = CKA_JAVA_MIDP_SECURITY_DOMAIN, Url = CKA_URL, HashOfSubjectPublicKey = CKA_HASH_OF_SUBJECT_PUBLIC_KEY, HashOfIssuerPublicKey = CKA_HASH_OF_ISSUER_PUBLIC_KEY, NameHashAlgorithm = CKA_NAME_HASH_ALGORITHM, CheckValue = CKA_CHECK_VALUE, KeyType = CKA_KEY_TYPE, Subject = CKA_SUBJECT, Id = CKA_ID, Sensitive = CKA_SENSITIVE, Encrypt = CKA_ENCRYPT, Decrypt = CKA_DECRYPT, Wrap = CKA_WRAP, Unwrap = CKA_UNWRAP, Sign = CKA_SIGN, SignRecover = CKA_SIGN_RECOVER, Verify = CKA_VERIFY, VerifyRecover = CKA_VERIFY_RECOVER, Derive = CKA_DERIVE, StartDate = CKA_START_DATE, EndDate = CKA_END_DATE, Modulus = CKA_MODULUS, ModulusBits = CKA_MODULUS_BITS, PublicExponent = CKA_PUBLIC_EXPONENT, PrivateExponent = CKA_PRIVATE_EXPONENT, Prime1 = CKA_PRIME_1, Prime2 = CKA_PRIME_2, Exponent1 = CKA_EXPONENT_1, Exponent2 = CKA_EXPONENT_2, Coefficient = CKA_COEFFICIENT, PublicKeyInfo = CKA_PUBLIC_KEY_INFO, Prime = CKA_PRIME, Subprime = CKA_SUBPRIME, Base = CKA_BASE, PrimeBits = CKA_PRIME_BITS, SubprimeBits = CKA_SUBPRIME_BITS, SubPrimeBits = CKA_SUB_PRIME_BITS, ValueBits = CKA_VALUE_BITS, ValueLen = CKA_VALUE_LEN, Extractable = CKA_EXTRACTABLE, Local = CKA_LOCAL, NeverExtractable = CKA_NEVER_EXTRACTABLE, AlwaysSensitive = CKA_ALWAYS_SENSITIVE, KeyGenMechanism = CKA_KEY_GEN_MECHANISM, Modifiable = CKA_MODIFIABLE, Copyable = CKA_COPYABLE, Destroyable = CKA_DESTROYABLE, EcdsaParams = CKA_ECDSA_PARAMS, EcParams = CKA_EC_PARAMS, EcPoint = CKA_EC_POINT, SecondaryAuth = CKA_SECONDARY_AUTH, AuthPinFlags = CKA_AUTH_PIN_FLAGS, AlwaysAuthenticate = CKA_ALWAYS_AUTHENTICATE, WrapWithTrusted = CKA_WRAP_WITH_TRUSTED, WrapTemplate = CKA_WRAP_TEMPLATE, UnwrapTemplate = CKA_UNWRAP_TEMPLATE, DeriveTemplate = CKA_DERIVE_TEMPLATE, OtpFormat = CKA_OTP_FORMAT, OtpLength = CKA_OTP_LENGTH, OtpTimeInterval = CKA_OTP_TIME_INTERVAL, OtpUserFriendlyMode = CKA_OTP_USER_FRIENDLY_MODE, OtpChallengeRequirement = CKA_OTP_CHALLENGE_REQUIREMENT, OtpTimeRequirement = CKA_OTP_TIME_REQUIREMENT, OtpCounterRequirement = CKA_OTP_COUNTER_REQUIREMENT, OtpPinRequirement = CKA_OTP_PIN_REQUIREMENT, OtpCounter = CKA_OTP_COUNTER, OtpTime = CKA_OTP_TIME, OtpUserIdentifier = CKA_OTP_USER_IDENTIFIER, OtpServiceIdentifier = CKA_OTP_SERVICE_IDENTIFIER, OtpServiceLogo = CKA_OTP_SERVICE_LOGO, OtpServiceLogoType = CKA_OTP_SERVICE_LOGO_TYPE, Gostr3410Params = CKA_GOSTR3410_PARAMS, Gostr3411Params = CKA_GOSTR3411_PARAMS, Gost28147Params = CKA_GOST28147_PARAMS, HwFeatureType = CKA_HW_FEATURE_TYPE, ResetOnInit = CKA_RESET_ON_INIT, HasReset = CKA_HAS_RESET, PixelX = CKA_PIXEL_X, PixelY = CKA_PIXEL_Y, Resolution = CKA_RESOLUTION, CharRows = CKA_CHAR_ROWS, CharColumns = CKA_CHAR_COLUMNS, Color = CKA_COLOR, BitsPerPixel = CKA_BITS_PER_PIXEL, CharSets = CKA_CHAR_SETS, EncodingMethods = CKA_ENCODING_METHODS, MimeTypes = CKA_MIME_TYPES, MechanismType = CKA_MECHANISM_TYPE, RequiredCmsAttributes = CKA_REQUIRED_CMS_ATTRIBUTES, DefaultCmsAttributes = CKA_DEFAULT_CMS_ATTRIBUTES, SupportedCmsAttributes = CKA_SUPPORTED_CMS_ATTRIBUTES, AllowedMechanisms = CKA_ALLOWED_MECHANISMS, VendorDefined = CKA_VENDOR_DEFINED, }; enum class CertificateType : CK_CERTIFICATE_TYPE { X509 = CKC_X_509, X509AttrCert = CKC_X_509_ATTR_CERT, Wtls = CKC_WTLS, VendorDefined = CKC_VENDOR_DEFINED, }; /// Indicates if a stored certificate is a user certificate for which the corresponding private key is available /// on the token ("token user"), a CA certificate ("authority"), or another end-entity certificate ("other entity"). enum class CertificateCategory : CK_ULONG { Unspecified = CK_CERTIFICATE_CATEGORY_UNSPECIFIED, TokenUser = CK_CERTIFICATE_CATEGORY_TOKEN_USER, Authority = CK_CERTIFICATE_CATEGORY_AUTHORITY, OtherEntity = CK_CERTIFICATE_CATEGORY_OTHER_ENTITY }; enum class KeyDerivation : CK_ULONG { Null = CKD_NULL, Sha1Kdf = CKD_SHA1_KDF, Sha1KdfAsn1 = CKD_SHA1_KDF_ASN1, Sha1KdfConcatenate = CKD_SHA1_KDF_CONCATENATE, Sha224Kdf = CKD_SHA224_KDF, Sha256Kdf = CKD_SHA256_KDF, Sha384Kdf = CKD_SHA384_KDF, Sha512Kdf = CKD_SHA512_KDF, CpdiversifyKdf = CKD_CPDIVERSIFY_KDF, }; enum class Flag : CK_FLAGS { None = 0, TokenPresent = CKF_TOKEN_PRESENT, RemovableDevice = CKF_REMOVABLE_DEVICE, HwSlot = CKF_HW_SLOT, Rng = CKF_RNG, WriteProtected = CKF_WRITE_PROTECTED, LoginRequired = CKF_LOGIN_REQUIRED, UserPinInitialized = CKF_USER_PIN_INITIALIZED, RestoreKeyNotNeeded = CKF_RESTORE_KEY_NOT_NEEDED, ClockOnToken = CKF_CLOCK_ON_TOKEN, ProtectedAuthenticationPath = CKF_PROTECTED_AUTHENTICATION_PATH, DualCryptoOperations = CKF_DUAL_CRYPTO_OPERATIONS, TokenInitialized = CKF_TOKEN_INITIALIZED, SecondaryAuthentication = CKF_SECONDARY_AUTHENTICATION, UserPinCountLow = CKF_USER_PIN_COUNT_LOW, UserPinFinalTry = CKF_USER_PIN_FINAL_TRY, UserPinLocked = CKF_USER_PIN_LOCKED, UserPinToBeChanged = CKF_USER_PIN_TO_BE_CHANGED, SoPinCountLow = CKF_SO_PIN_COUNT_LOW, SoPinFinalTry = CKF_SO_PIN_FINAL_TRY, SoPinLocked = CKF_SO_PIN_LOCKED, SoPinToBeChanged = CKF_SO_PIN_TO_BE_CHANGED, ErrorState = CKF_ERROR_STATE, RwSession = CKF_RW_SESSION, SerialSession = CKF_SERIAL_SESSION, ArrayAttribute = CKF_ARRAY_ATTRIBUTE, Hw = CKF_HW, Encrypt = CKF_ENCRYPT, Decrypt = CKF_DECRYPT, Digest = CKF_DIGEST, Sign = CKF_SIGN, SignRecover = CKF_SIGN_RECOVER, Verify = CKF_VERIFY, VerifyRecover = CKF_VERIFY_RECOVER, Generate = CKF_GENERATE, GenerateKeyPair = CKF_GENERATE_KEY_PAIR, Wrap = CKF_WRAP, Unwrap = CKF_UNWRAP, Derive = CKF_DERIVE, EcFP = CKF_EC_F_P, EcF2m = CKF_EC_F_2M, EcEcparameters = CKF_EC_ECPARAMETERS, EcNamedcurve = CKF_EC_NAMEDCURVE, EcUncompress = CKF_EC_UNCOMPRESS, EcCompress = CKF_EC_COMPRESS, Extension = CKF_EXTENSION, LibraryCantCreateOsThreads = CKF_LIBRARY_CANT_CREATE_OS_THREADS, OsLockingOk = CKF_OS_LOCKING_OK, DontBlock = CKF_DONT_BLOCK, NextOtp = CKF_NEXT_OTP, ExcludeTime = CKF_EXCLUDE_TIME, ExcludeCounter = CKF_EXCLUDE_COUNTER, ExcludeChallenge = CKF_EXCLUDE_CHALLENGE, ExcludePin = CKF_EXCLUDE_PIN, UserFriendlyOtp = CKF_USER_FRIENDLY_OTP, }; inline Flag operator | (Flag a, Flag b) { return static_cast< Flag >(static_cast< CK_FLAGS >(a) | static_cast< CK_FLAGS >(b)); } enum class MGF : CK_RSA_PKCS_MGF_TYPE { Mgf1Sha1 = CKG_MGF1_SHA1, Mgf1Sha256 = CKG_MGF1_SHA256, Mgf1Sha384 = CKG_MGF1_SHA384, Mgf1Sha512 = CKG_MGF1_SHA512, Mgf1Sha224 = CKG_MGF1_SHA224, }; enum class HardwareType : CK_HW_FEATURE_TYPE { MonotonicCounter = CKH_MONOTONIC_COUNTER, Clock = CKH_CLOCK, UserInterface = CKH_USER_INTERFACE, VendorDefined = CKH_VENDOR_DEFINED, }; enum class KeyType : CK_KEY_TYPE { Rsa = CKK_RSA, Dsa = CKK_DSA, Dh = CKK_DH, Ecdsa = CKK_ECDSA, Ec = CKK_EC, X942Dh = CKK_X9_42_DH, Kea = CKK_KEA, GenericSecret = CKK_GENERIC_SECRET, Rc2 = CKK_RC2, Rc4 = CKK_RC4, Des = CKK_DES, Des2 = CKK_DES2, Des3 = CKK_DES3, Cast = CKK_CAST, Cast3 = CKK_CAST3, Cast5 = CKK_CAST5, Cast128 = CKK_CAST128, Rc5 = CKK_RC5, Idea = CKK_IDEA, Skipjack = CKK_SKIPJACK, Baton = CKK_BATON, Juniper = CKK_JUNIPER, Cdmf = CKK_CDMF, Aes = CKK_AES, Blowfish = CKK_BLOWFISH, Twofish = CKK_TWOFISH, Securid = CKK_SECURID, Hotp = CKK_HOTP, Acti = CKK_ACTI, Camellia = CKK_CAMELLIA, Aria = CKK_ARIA, Md5Hmac = CKK_MD5_HMAC, Sha1Hmac = CKK_SHA_1_HMAC, Ripemd128Hmac = CKK_RIPEMD128_HMAC, Ripemd160Hmac = CKK_RIPEMD160_HMAC, Sha256Hmac = CKK_SHA256_HMAC, Sha384Hmac = CKK_SHA384_HMAC, Sha512Hmac = CKK_SHA512_HMAC, Sha224Hmac = CKK_SHA224_HMAC, Seed = CKK_SEED, Gostr3410 = CKK_GOSTR3410, Gostr3411 = CKK_GOSTR3411, Gost28147 = CKK_GOST28147, VendorDefined = CKK_VENDOR_DEFINED, }; enum class MechanismType : CK_MECHANISM_TYPE { RsaPkcsKeyPairGen = CKM_RSA_PKCS_KEY_PAIR_GEN, RsaPkcs = CKM_RSA_PKCS, Rsa9796 = CKM_RSA_9796, RsaX509 = CKM_RSA_X_509, Md2RsaPkcs = CKM_MD2_RSA_PKCS, Md5RsaPkcs = CKM_MD5_RSA_PKCS, Sha1RsaPkcs = CKM_SHA1_RSA_PKCS, Ripemd128RsaPkcs = CKM_RIPEMD128_RSA_PKCS, Ripemd160RsaPkcs = CKM_RIPEMD160_RSA_PKCS, RsaPkcsOaep = CKM_RSA_PKCS_OAEP, RsaX931KeyPairGen = CKM_RSA_X9_31_KEY_PAIR_GEN, RsaX931 = CKM_RSA_X9_31, Sha1RsaX931 = CKM_SHA1_RSA_X9_31, RsaPkcsPss = CKM_RSA_PKCS_PSS, Sha1RsaPkcsPss = CKM_SHA1_RSA_PKCS_PSS, DsaKeyPairGen = CKM_DSA_KEY_PAIR_GEN, Dsa = CKM_DSA, DsaSha1 = CKM_DSA_SHA1, DsaSha224 = CKM_DSA_SHA224, DsaSha256 = CKM_DSA_SHA256, DsaSha384 = CKM_DSA_SHA384, DsaSha512 = CKM_DSA_SHA512, DhPkcsKeyPairGen = CKM_DH_PKCS_KEY_PAIR_GEN, DhPkcsDerive = CKM_DH_PKCS_DERIVE, X942DhKeyPairGen = CKM_X9_42_DH_KEY_PAIR_GEN, X942DhDerive = CKM_X9_42_DH_DERIVE, X942DhHybridDerive = CKM_X9_42_DH_HYBRID_DERIVE, X942MqvDerive = CKM_X9_42_MQV_DERIVE, Sha256RsaPkcs = CKM_SHA256_RSA_PKCS, Sha384RsaPkcs = CKM_SHA384_RSA_PKCS, Sha512RsaPkcs = CKM_SHA512_RSA_PKCS, Sha256RsaPkcsPss = CKM_SHA256_RSA_PKCS_PSS, Sha384RsaPkcsPss = CKM_SHA384_RSA_PKCS_PSS, Sha512RsaPkcsPss = CKM_SHA512_RSA_PKCS_PSS, Sha224RsaPkcs = CKM_SHA224_RSA_PKCS, Sha224RsaPkcsPss = CKM_SHA224_RSA_PKCS_PSS, Sha512224 = CKM_SHA512_224, Sha512224Hmac = CKM_SHA512_224_HMAC, Sha512224HmacGeneral = CKM_SHA512_224_HMAC_GENERAL, Sha512224KeyDerivation = CKM_SHA512_224_KEY_DERIVATION, Sha512256 = CKM_SHA512_256, Sha512256Hmac = CKM_SHA512_256_HMAC, Sha512256HmacGeneral = CKM_SHA512_256_HMAC_GENERAL, Sha512256KeyDerivation = CKM_SHA512_256_KEY_DERIVATION, Sha512T = CKM_SHA512_T, Sha512THmac = CKM_SHA512_T_HMAC, Sha512THmacGeneral = CKM_SHA512_T_HMAC_GENERAL, Sha512TKeyDerivation = CKM_SHA512_T_KEY_DERIVATION, Rc2KeyGen = CKM_RC2_KEY_GEN, Rc2Ecb = CKM_RC2_ECB, Rc2Cbc = CKM_RC2_CBC, Rc2Mac = CKM_RC2_MAC, Rc2MacGeneral = CKM_RC2_MAC_GENERAL, Rc2CbcPad = CKM_RC2_CBC_PAD, Rc4KeyGen = CKM_RC4_KEY_GEN, Rc4 = CKM_RC4, DesKeyGen = CKM_DES_KEY_GEN, DesEcb = CKM_DES_ECB, DesCbc = CKM_DES_CBC, DesMac = CKM_DES_MAC, DesMacGeneral = CKM_DES_MAC_GENERAL, DesCbcPad = CKM_DES_CBC_PAD, Des2KeyGen = CKM_DES2_KEY_GEN, Des3KeyGen = CKM_DES3_KEY_GEN, Des3Ecb = CKM_DES3_ECB, Des3Cbc = CKM_DES3_CBC, Des3Mac = CKM_DES3_MAC, Des3MacGeneral = CKM_DES3_MAC_GENERAL, Des3CbcPad = CKM_DES3_CBC_PAD, Des3CmacGeneral = CKM_DES3_CMAC_GENERAL, Des3Cmac = CKM_DES3_CMAC, CdmfKeyGen = CKM_CDMF_KEY_GEN, CdmfEcb = CKM_CDMF_ECB, CdmfCbc = CKM_CDMF_CBC, CdmfMac = CKM_CDMF_MAC, CdmfMacGeneral = CKM_CDMF_MAC_GENERAL, CdmfCbcPad = CKM_CDMF_CBC_PAD, DesOfb64 = CKM_DES_OFB64, DesOfb8 = CKM_DES_OFB8, DesCfb64 = CKM_DES_CFB64, DesCfb8 = CKM_DES_CFB8, Md2 = CKM_MD2, Md2Hmac = CKM_MD2_HMAC, Md2HmacGeneral = CKM_MD2_HMAC_GENERAL, Md5 = CKM_MD5, Md5Hmac = CKM_MD5_HMAC, Md5HmacGeneral = CKM_MD5_HMAC_GENERAL, Sha1 = CKM_SHA_1, Sha1Hmac = CKM_SHA_1_HMAC, Sha1HmacGeneral = CKM_SHA_1_HMAC_GENERAL, Ripemd128 = CKM_RIPEMD128, Ripemd128Hmac = CKM_RIPEMD128_HMAC, Ripemd128HmacGeneral = CKM_RIPEMD128_HMAC_GENERAL, Ripemd160 = CKM_RIPEMD160, Ripemd160Hmac = CKM_RIPEMD160_HMAC, Ripemd160HmacGeneral = CKM_RIPEMD160_HMAC_GENERAL, Sha256 = CKM_SHA256, Sha256Hmac = CKM_SHA256_HMAC, Sha256HmacGeneral = CKM_SHA256_HMAC_GENERAL, Sha224 = CKM_SHA224, Sha224Hmac = CKM_SHA224_HMAC, Sha224HmacGeneral = CKM_SHA224_HMAC_GENERAL, Sha384 = CKM_SHA384, Sha384Hmac = CKM_SHA384_HMAC, Sha384HmacGeneral = CKM_SHA384_HMAC_GENERAL, Sha512 = CKM_SHA512, Sha512Hmac = CKM_SHA512_HMAC, Sha512HmacGeneral = CKM_SHA512_HMAC_GENERAL, SecuridKeyGen = CKM_SECURID_KEY_GEN, Securid = CKM_SECURID, HotpKeyGen = CKM_HOTP_KEY_GEN, Hotp = CKM_HOTP, Acti = CKM_ACTI, ActiKeyGen = CKM_ACTI_KEY_GEN, CastKeyGen = CKM_CAST_KEY_GEN, CastEcb = CKM_CAST_ECB, CastCbc = CKM_CAST_CBC, CastMac = CKM_CAST_MAC, CastMacGeneral = CKM_CAST_MAC_GENERAL, CastCbcPad = CKM_CAST_CBC_PAD, Cast3KeyGen = CKM_CAST3_KEY_GEN, Cast3Ecb = CKM_CAST3_ECB, Cast3Cbc = CKM_CAST3_CBC, Cast3Mac = CKM_CAST3_MAC, Cast3MacGeneral = CKM_CAST3_MAC_GENERAL, Cast3CbcPad = CKM_CAST3_CBC_PAD, Cast5KeyGen = CKM_CAST5_KEY_GEN, Cast128KeyGen = CKM_CAST128_KEY_GEN, Cast5Ecb = CKM_CAST5_ECB, Cast128Ecb = CKM_CAST128_ECB, Cast5Cbc = CKM_CAST5_CBC, Cast128Cbc = CKM_CAST128_CBC, Cast5Mac = CKM_CAST5_MAC, Cast128Mac = CKM_CAST128_MAC, Cast5MacGeneral = CKM_CAST5_MAC_GENERAL, Cast128MacGeneral = CKM_CAST128_MAC_GENERAL, Cast5CbcPad = CKM_CAST5_CBC_PAD, Cast128CbcPad = CKM_CAST128_CBC_PAD, Rc5KeyGen = CKM_RC5_KEY_GEN, Rc5Ecb = CKM_RC5_ECB, Rc5Cbc = CKM_RC5_CBC, Rc5Mac = CKM_RC5_MAC, Rc5MacGeneral = CKM_RC5_MAC_GENERAL, Rc5CbcPad = CKM_RC5_CBC_PAD, IdeaKeyGen = CKM_IDEA_KEY_GEN, IdeaEcb = CKM_IDEA_ECB, IdeaCbc = CKM_IDEA_CBC, IdeaMac = CKM_IDEA_MAC, IdeaMacGeneral = CKM_IDEA_MAC_GENERAL, IdeaCbcPad = CKM_IDEA_CBC_PAD, GenericSecretKeyGen = CKM_GENERIC_SECRET_KEY_GEN, ConcatenateBaseAndKey = CKM_CONCATENATE_BASE_AND_KEY, ConcatenateBaseAndData = CKM_CONCATENATE_BASE_AND_DATA, ConcatenateDataAndBase = CKM_CONCATENATE_DATA_AND_BASE, XorBaseAndData = CKM_XOR_BASE_AND_DATA, ExtractKeyFromKey = CKM_EXTRACT_KEY_FROM_KEY, Ssl3PreMasterKeyGen = CKM_SSL3_PRE_MASTER_KEY_GEN, Ssl3MasterKeyDerive = CKM_SSL3_MASTER_KEY_DERIVE, Ssl3KeyAndMacDerive = CKM_SSL3_KEY_AND_MAC_DERIVE, Ssl3MasterKeyDeriveDh = CKM_SSL3_MASTER_KEY_DERIVE_DH, TlsPreMasterKeyGen = CKM_TLS_PRE_MASTER_KEY_GEN, TlsMasterKeyDerive = CKM_TLS_MASTER_KEY_DERIVE, TlsKeyAndMacDerive = CKM_TLS_KEY_AND_MAC_DERIVE, TlsMasterKeyDeriveDh = CKM_TLS_MASTER_KEY_DERIVE_DH, TlsPrf = CKM_TLS_PRF, Ssl3Md5Mac = CKM_SSL3_MD5_MAC, Ssl3Sha1Mac = CKM_SSL3_SHA1_MAC, Md5KeyDerivation = CKM_MD5_KEY_DERIVATION, Md2KeyDerivation = CKM_MD2_KEY_DERIVATION, Sha1KeyDerivation = CKM_SHA1_KEY_DERIVATION, Sha256KeyDerivation = CKM_SHA256_KEY_DERIVATION, Sha384KeyDerivation = CKM_SHA384_KEY_DERIVATION, Sha512KeyDerivation = CKM_SHA512_KEY_DERIVATION, Sha224KeyDerivation = CKM_SHA224_KEY_DERIVATION, PbeMd2DesCbc = CKM_PBE_MD2_DES_CBC, PbeMd5DesCbc = CKM_PBE_MD5_DES_CBC, PbeMd5CastCbc = CKM_PBE_MD5_CAST_CBC, PbeMd5Cast3Cbc = CKM_PBE_MD5_CAST3_CBC, PbeMd5Cast5Cbc = CKM_PBE_MD5_CAST5_CBC, PbeMd5Cast128Cbc = CKM_PBE_MD5_CAST128_CBC, PbeSha1Cast5Cbc = CKM_PBE_SHA1_CAST5_CBC, PbeSha1Cast128Cbc = CKM_PBE_SHA1_CAST128_CBC, PbeSha1Rc4128 = CKM_PBE_SHA1_RC4_128, PbeSha1Rc440 = CKM_PBE_SHA1_RC4_40, PbeSha1Des3EdeCbc = CKM_PBE_SHA1_DES3_EDE_CBC, PbeSha1Des2EdeCbc = CKM_PBE_SHA1_DES2_EDE_CBC, PbeSha1Rc2128Cbc = CKM_PBE_SHA1_RC2_128_CBC, PbeSha1Rc240Cbc = CKM_PBE_SHA1_RC2_40_CBC, Pkcs5Pbkd2 = CKM_PKCS5_PBKD2, PbaSha1WithSha1Hmac = CKM_PBA_SHA1_WITH_SHA1_HMAC, WtlsPreMasterKeyGen = CKM_WTLS_PRE_MASTER_KEY_GEN, WtlsMasterKeyDerive = CKM_WTLS_MASTER_KEY_DERIVE, WtlsMasterKeyDeriveDhEcc = CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC, WtlsPrf = CKM_WTLS_PRF, WtlsServerKeyAndMacDerive = CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE, WtlsClientKeyAndMacDerive = CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE, Tls10MacServer = CKM_TLS10_MAC_SERVER, Tls10MacClient = CKM_TLS10_MAC_CLIENT, Tls12Mac = CKM_TLS12_MAC, Tls12Kdf = CKM_TLS12_KDF, Tls12MasterKeyDerive = CKM_TLS12_MASTER_KEY_DERIVE, Tls12KeyAndMacDerive = CKM_TLS12_KEY_AND_MAC_DERIVE, Tls12MasterKeyDeriveDh = CKM_TLS12_MASTER_KEY_DERIVE_DH, Tls12KeySafeDerive = CKM_TLS12_KEY_SAFE_DERIVE, TlsMac = CKM_TLS_MAC, TlsKdf = CKM_TLS_KDF, KeyWrapLynks = CKM_KEY_WRAP_LYNKS, KeyWrapSetOaep = CKM_KEY_WRAP_SET_OAEP, CmsSig = CKM_CMS_SIG, KipDerive = CKM_KIP_DERIVE, KipWrap = CKM_KIP_WRAP, KipMac = CKM_KIP_MAC, CamelliaKeyGen = CKM_CAMELLIA_KEY_GEN, CamelliaEcb = CKM_CAMELLIA_ECB, CamelliaCbc = CKM_CAMELLIA_CBC, CamelliaMac = CKM_CAMELLIA_MAC, CamelliaMacGeneral = CKM_CAMELLIA_MAC_GENERAL, CamelliaCbcPad = CKM_CAMELLIA_CBC_PAD, CamelliaEcbEncryptData = CKM_CAMELLIA_ECB_ENCRYPT_DATA, CamelliaCbcEncryptData = CKM_CAMELLIA_CBC_ENCRYPT_DATA, CamelliaCtr = CKM_CAMELLIA_CTR, AriaKeyGen = CKM_ARIA_KEY_GEN, AriaEcb = CKM_ARIA_ECB, AriaCbc = CKM_ARIA_CBC, AriaMac = CKM_ARIA_MAC, AriaMacGeneral = CKM_ARIA_MAC_GENERAL, AriaCbcPad = CKM_ARIA_CBC_PAD, AriaEcbEncryptData = CKM_ARIA_ECB_ENCRYPT_DATA, AriaCbcEncryptData = CKM_ARIA_CBC_ENCRYPT_DATA, SeedKeyGen = CKM_SEED_KEY_GEN, SeedEcb = CKM_SEED_ECB, SeedCbc = CKM_SEED_CBC, SeedMac = CKM_SEED_MAC, SeedMacGeneral = CKM_SEED_MAC_GENERAL, SeedCbcPad = CKM_SEED_CBC_PAD, SeedEcbEncryptData = CKM_SEED_ECB_ENCRYPT_DATA, SeedCbcEncryptData = CKM_SEED_CBC_ENCRYPT_DATA, SkipjackKeyGen = CKM_SKIPJACK_KEY_GEN, SkipjackEcb64 = CKM_SKIPJACK_ECB64, SkipjackCbc64 = CKM_SKIPJACK_CBC64, SkipjackOfb64 = CKM_SKIPJACK_OFB64, SkipjackCfb64 = CKM_SKIPJACK_CFB64, SkipjackCfb32 = CKM_SKIPJACK_CFB32, SkipjackCfb16 = CKM_SKIPJACK_CFB16, SkipjackCfb8 = CKM_SKIPJACK_CFB8, SkipjackWrap = CKM_SKIPJACK_WRAP, SkipjackPrivateWrap = CKM_SKIPJACK_PRIVATE_WRAP, SkipjackRelayx = CKM_SKIPJACK_RELAYX, KeaKeyPairGen = CKM_KEA_KEY_PAIR_GEN, KeaKeyDerive = CKM_KEA_KEY_DERIVE, KeaDerive = CKM_KEA_DERIVE, FortezzaTimestamp = CKM_FORTEZZA_TIMESTAMP, BatonKeyGen = CKM_BATON_KEY_GEN, BatonEcb128 = CKM_BATON_ECB128, BatonEcb96 = CKM_BATON_ECB96, BatonCbc128 = CKM_BATON_CBC128, BatonCounter = CKM_BATON_COUNTER, BatonShuffle = CKM_BATON_SHUFFLE, BatonWrap = CKM_BATON_WRAP, EcdsaKeyPairGen = CKM_ECDSA_KEY_PAIR_GEN, EcKeyPairGen = CKM_EC_KEY_PAIR_GEN, Ecdsa = CKM_ECDSA, EcdsaSha1 = CKM_ECDSA_SHA1, EcdsaSha224 = CKM_ECDSA_SHA224, EcdsaSha256 = CKM_ECDSA_SHA256, EcdsaSha384 = CKM_ECDSA_SHA384, EcdsaSha512 = CKM_ECDSA_SHA512, Ecdh1Derive = CKM_ECDH1_DERIVE, Ecdh1CofactorDerive = CKM_ECDH1_COFACTOR_DERIVE, EcmqvDerive = CKM_ECMQV_DERIVE, EcdhAesKeyWrap = CKM_ECDH_AES_KEY_WRAP, RsaAesKeyWrap = CKM_RSA_AES_KEY_WRAP, JuniperKeyGen = CKM_JUNIPER_KEY_GEN, JuniperEcb128 = CKM_JUNIPER_ECB128, JuniperCbc128 = CKM_JUNIPER_CBC128, JuniperCounter = CKM_JUNIPER_COUNTER, JuniperShuffle = CKM_JUNIPER_SHUFFLE, JuniperWrap = CKM_JUNIPER_WRAP, Fasthash = CKM_FASTHASH, AesKeyGen = CKM_AES_KEY_GEN, AesEcb = CKM_AES_ECB, AesCbc = CKM_AES_CBC, AesMac = CKM_AES_MAC, AesMacGeneral = CKM_AES_MAC_GENERAL, AesCbcPad = CKM_AES_CBC_PAD, AesCtr = CKM_AES_CTR, AesGcm = CKM_AES_GCM, AesCcm = CKM_AES_CCM, AesCts = CKM_AES_CTS, AesCmac = CKM_AES_CMAC, AesCmacGeneral = CKM_AES_CMAC_GENERAL, AesXcbcMac = CKM_AES_XCBC_MAC, AesXcbcMac96 = CKM_AES_XCBC_MAC_96, AesGmac = CKM_AES_GMAC, BlowfishKeyGen = CKM_BLOWFISH_KEY_GEN, BlowfishCbc = CKM_BLOWFISH_CBC, TwofishKeyGen = CKM_TWOFISH_KEY_GEN, TwofishCbc = CKM_TWOFISH_CBC, BlowfishCbcPad = CKM_BLOWFISH_CBC_PAD, TwofishCbcPad = CKM_TWOFISH_CBC_PAD, DesEcbEncryptData = CKM_DES_ECB_ENCRYPT_DATA, DesCbcEncryptData = CKM_DES_CBC_ENCRYPT_DATA, Des3EcbEncryptData = CKM_DES3_ECB_ENCRYPT_DATA, Des3CbcEncryptData = CKM_DES3_CBC_ENCRYPT_DATA, AesEcbEncryptData = CKM_AES_ECB_ENCRYPT_DATA, AesCbcEncryptData = CKM_AES_CBC_ENCRYPT_DATA, Gostr3410KeyPairGen = CKM_GOSTR3410_KEY_PAIR_GEN, Gostr3410 = CKM_GOSTR3410, Gostr3410WithGostr3411 = CKM_GOSTR3410_WITH_GOSTR3411, Gostr3410KeyWrap = CKM_GOSTR3410_KEY_WRAP, Gostr3410Derive = CKM_GOSTR3410_DERIVE, Gostr3411 = CKM_GOSTR3411, Gostr3411Hmac = CKM_GOSTR3411_HMAC, Gost28147KeyGen = CKM_GOST28147_KEY_GEN, Gost28147Ecb = CKM_GOST28147_ECB, Gost28147 = CKM_GOST28147, Gost28147Mac = CKM_GOST28147_MAC, Gost28147KeyWrap = CKM_GOST28147_KEY_WRAP, DsaParameterGen = CKM_DSA_PARAMETER_GEN, DhPkcsParameterGen = CKM_DH_PKCS_PARAMETER_GEN, X942DhParameterGen = CKM_X9_42_DH_PARAMETER_GEN, DsaProbablisticParameterGen = CKM_DSA_PROBABLISTIC_PARAMETER_GEN, DsaShaweTaylorParameterGen = CKM_DSA_SHAWE_TAYLOR_PARAMETER_GEN, AesOfb = CKM_AES_OFB, AesCfb64 = CKM_AES_CFB64, AesCfb8 = CKM_AES_CFB8, AesCfb128 = CKM_AES_CFB128, AesCfb1 = CKM_AES_CFB1, AesKeyWrap = CKM_AES_KEY_WRAP, AesKeyWrapPad = CKM_AES_KEY_WRAP_PAD, RsaPkcsTpm11 = CKM_RSA_PKCS_TPM_1_1, RsaPkcsOaepTpm11 = CKM_RSA_PKCS_OAEP_TPM_1_1, VendorDefined = CKM_VENDOR_DEFINED, }; enum class Notification : CK_NOTIFICATION { Surrender = CKN_SURRENDER, OtpChanged = CKN_OTP_CHANGED, }; enum class ObjectClass : CK_OBJECT_CLASS { Data = CKO_DATA, Certificate = CKO_CERTIFICATE, PublicKey = CKO_PUBLIC_KEY, PrivateKey = CKO_PRIVATE_KEY, SecretKey = CKO_SECRET_KEY, HwFeature = CKO_HW_FEATURE, DomainParameters = CKO_DOMAIN_PARAMETERS, Mechanism = CKO_MECHANISM, OtpKey = CKO_OTP_KEY, VendorDefined = CKO_VENDOR_DEFINED, }; enum class PseudoRandom : CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE { Pkcs5Pbkd2HmacSha1 = CKP_PKCS5_PBKD2_HMAC_SHA1, Pkcs5Pbkd2HmacGostr3411 = CKP_PKCS5_PBKD2_HMAC_GOSTR3411, Pkcs5Pbkd2HmacSha224 = CKP_PKCS5_PBKD2_HMAC_SHA224, Pkcs5Pbkd2HmacSha256 = CKP_PKCS5_PBKD2_HMAC_SHA256, Pkcs5Pbkd2HmacSha384 = CKP_PKCS5_PBKD2_HMAC_SHA384, Pkcs5Pbkd2HmacSha512 = CKP_PKCS5_PBKD2_HMAC_SHA512, Pkcs5Pbkd2HmacSha512224 = CKP_PKCS5_PBKD2_HMAC_SHA512_224, Pkcs5Pbkd2HmacSha512256 = CKP_PKCS5_PBKD2_HMAC_SHA512_256, }; enum class SessionState : CK_STATE { RoPublicSession = CKS_RO_PUBLIC_SESSION, RoUserFunctions = CKS_RO_USER_FUNCTIONS, RwPublicSession = CKS_RW_PUBLIC_SESSION, RwUserFunctions = CKS_RW_USER_FUNCTIONS, RwSoFunctions = CKS_RW_SO_FUNCTIONS, }; enum class ReturnValue : CK_RV { OK = CKR_OK, Cancel = CKR_CANCEL, HostMemory = CKR_HOST_MEMORY, SlotIdInvalid = CKR_SLOT_ID_INVALID, GeneralError = CKR_GENERAL_ERROR, FunctionFailed = CKR_FUNCTION_FAILED, ArgumentsBad = CKR_ARGUMENTS_BAD, NoEvent = CKR_NO_EVENT, NeedToCreateThreads = CKR_NEED_TO_CREATE_THREADS, CantLock = CKR_CANT_LOCK, AttributeReadOnly = CKR_ATTRIBUTE_READ_ONLY, AttributeSensitive = CKR_ATTRIBUTE_SENSITIVE, AttributeTypeInvalid = CKR_ATTRIBUTE_TYPE_INVALID, AttributeValueInvalid = CKR_ATTRIBUTE_VALUE_INVALID, ActionProhibited = CKR_ACTION_PROHIBITED, DataInvalid = CKR_DATA_INVALID, DataLenRange = CKR_DATA_LEN_RANGE, DeviceError = CKR_DEVICE_ERROR, DeviceMemory = CKR_DEVICE_MEMORY, DeviceRemoved = CKR_DEVICE_REMOVED, EncryptedDataInvalid = CKR_ENCRYPTED_DATA_INVALID, EncryptedDataLenRange = CKR_ENCRYPTED_DATA_LEN_RANGE, FunctionCanceled = CKR_FUNCTION_CANCELED, FunctionNotParallel = CKR_FUNCTION_NOT_PARALLEL, FunctionNotSupported = CKR_FUNCTION_NOT_SUPPORTED, KeyHandleInvalid = CKR_KEY_HANDLE_INVALID, KeySizeRange = CKR_KEY_SIZE_RANGE, KeyTypeInconsistent = CKR_KEY_TYPE_INCONSISTENT, KeyNotNeeded = CKR_KEY_NOT_NEEDED, KeyChanged = CKR_KEY_CHANGED, KeyNeeded = CKR_KEY_NEEDED, KeyIndigestible = CKR_KEY_INDIGESTIBLE, KeyFunctionNotPermitted = CKR_KEY_FUNCTION_NOT_PERMITTED, KeyNotWrappable = CKR_KEY_NOT_WRAPPABLE, KeyUnextractable = CKR_KEY_UNEXTRACTABLE, MechanismInvalid = CKR_MECHANISM_INVALID, MechanismParamInvalid = CKR_MECHANISM_PARAM_INVALID, ObjectHandleInvalid = CKR_OBJECT_HANDLE_INVALID, OperationActive = CKR_OPERATION_ACTIVE, OperationNotInitialized = CKR_OPERATION_NOT_INITIALIZED, PinIncorrect = CKR_PIN_INCORRECT, PinInvalid = CKR_PIN_INVALID, PinLenRange = CKR_PIN_LEN_RANGE, PinExpired = CKR_PIN_EXPIRED, PinLocked = CKR_PIN_LOCKED, SessionClosed = CKR_SESSION_CLOSED, SessionCount = CKR_SESSION_COUNT, SessionHandleInvalid = CKR_SESSION_HANDLE_INVALID, SessionParallelNotSupported = CKR_SESSION_PARALLEL_NOT_SUPPORTED, SessionReadOnly = CKR_SESSION_READ_ONLY, SessionExists = CKR_SESSION_EXISTS, SessionReadOnlyExists = CKR_SESSION_READ_ONLY_EXISTS, SessionReadWriteSoExists = CKR_SESSION_READ_WRITE_SO_EXISTS, SignatureInvalid = CKR_SIGNATURE_INVALID, SignatureLenRange = CKR_SIGNATURE_LEN_RANGE, TemplateIncomplete = CKR_TEMPLATE_INCOMPLETE, TemplateInconsistent = CKR_TEMPLATE_INCONSISTENT, TokenNotPresent = CKR_TOKEN_NOT_PRESENT, TokenNotRecognized = CKR_TOKEN_NOT_RECOGNIZED, TokenWriteProtected = CKR_TOKEN_WRITE_PROTECTED, UnwrappingKeyHandleInvalid = CKR_UNWRAPPING_KEY_HANDLE_INVALID, UnwrappingKeySizeRange = CKR_UNWRAPPING_KEY_SIZE_RANGE, UnwrappingKeyTypeInconsistent = CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, UserAlreadyLoggedIn = CKR_USER_ALREADY_LOGGED_IN, UserNotLoggedIn = CKR_USER_NOT_LOGGED_IN, UserPinNotInitialized = CKR_USER_PIN_NOT_INITIALIZED, UserTypeInvalid = CKR_USER_TYPE_INVALID, UserAnotherAlreadyLoggedIn = CKR_USER_ANOTHER_ALREADY_LOGGED_IN, UserTooManyTypes = CKR_USER_TOO_MANY_TYPES, WrappedKeyInvalid = CKR_WRAPPED_KEY_INVALID, WrappedKeyLenRange = CKR_WRAPPED_KEY_LEN_RANGE, WrappingKeyHandleInvalid = CKR_WRAPPING_KEY_HANDLE_INVALID, WrappingKeySizeRange = CKR_WRAPPING_KEY_SIZE_RANGE, WrappingKeyTypeInconsistent = CKR_WRAPPING_KEY_TYPE_INCONSISTENT, RandomSeedNotSupported = CKR_RANDOM_SEED_NOT_SUPPORTED, RandomNoRng = CKR_RANDOM_NO_RNG, DomainParamsInvalid = CKR_DOMAIN_PARAMS_INVALID, CurveNotSupported = CKR_CURVE_NOT_SUPPORTED, BufferTooSmall = CKR_BUFFER_TOO_SMALL, SavedStateInvalid = CKR_SAVED_STATE_INVALID, InformationSensitive = CKR_INFORMATION_SENSITIVE, StateUnsaveable = CKR_STATE_UNSAVEABLE, CryptokiNotInitialized = CKR_CRYPTOKI_NOT_INITIALIZED, CryptokiAlreadyInitialized = CKR_CRYPTOKI_ALREADY_INITIALIZED, MutexBad = CKR_MUTEX_BAD, MutexNotLocked = CKR_MUTEX_NOT_LOCKED, NewPinMode = CKR_NEW_PIN_MODE, NextOtp = CKR_NEXT_OTP, ExceededMaxIterations = CKR_EXCEEDED_MAX_ITERATIONS, FipsSelfTestFailed = CKR_FIPS_SELF_TEST_FAILED, LibraryLoadFailed = CKR_LIBRARY_LOAD_FAILED, PinTooWeak = CKR_PIN_TOO_WEAK, PublicKeyInvalid = CKR_PUBLIC_KEY_INVALID, FunctionRejected = CKR_FUNCTION_REJECTED, VendorDefined = CKR_VENDOR_DEFINED, }; enum class UserType : CK_USER_TYPE { SO = CKU_SO, User = CKU_USER, ContextSpecific = CKU_CONTEXT_SPECIFIC, }; enum class PublicPointEncoding : uint32_t { Raw, Der }; using FunctionListPtr = CK_FUNCTION_LIST_PTR; using VoidPtr = CK_VOID_PTR; using C_InitializeArgs = CK_C_INITIALIZE_ARGS; using CreateMutex = CK_CREATEMUTEX; using DestroyMutex = CK_DESTROYMUTEX; using LockMutex = CK_LOCKMUTEX; using UnlockMutex = CK_UNLOCKMUTEX; using Flags = CK_FLAGS; using Info = CK_INFO; using Bbool = CK_BBOOL; using SlotId = CK_SLOT_ID; using Ulong = CK_ULONG; using SlotInfo = CK_SLOT_INFO; using TokenInfo = CK_TOKEN_INFO; using Mechanism = CK_MECHANISM; using MechanismInfo = CK_MECHANISM_INFO; using Utf8Char = CK_UTF8CHAR; using Notify = CK_NOTIFY; using SessionHandle = CK_SESSION_HANDLE; using SessionInfo = CK_SESSION_INFO; using Attribute = CK_ATTRIBUTE; using ObjectHandle = CK_OBJECT_HANDLE; using Byte = CK_BYTE; using RsaPkcsOaepParams = CK_RSA_PKCS_OAEP_PARAMS; using RsaPkcsPssParams = CK_RSA_PKCS_PSS_PARAMS; using Ecdh1DeriveParams = CK_ECDH1_DERIVE_PARAMS; using Date = CK_DATE; BOTAN_PUBLIC_API(2,0) extern ReturnValue* ThrowException; const Bbool True = CK_TRUE; const Bbool False = CK_FALSE; inline Flags flags(Flag flags) { return static_cast(flags); } class Slot; /** * Initializes a token * @param slot The slot with the attached token that should be initialized * @param label The token label * @param so_pin PIN of the security officer. Will be set if the token is uninitialized other this has to be the current SO_PIN * @param pin The user PIN that will be set */ BOTAN_PUBLIC_API(2,0) void initialize_token(Slot& slot, const std::string& label, const secure_string& so_pin, const secure_string& pin); /** * Change PIN with old PIN to new PIN * @param slot The slot with the attached token * @param old_pin The old user PIN * @param new_pin The new user PIN */ BOTAN_PUBLIC_API(2,0) void change_pin(Slot& slot, const secure_string& old_pin, const secure_string& new_pin); /** * Change SO_PIN with old SO_PIN to new SO_PIN * @param slot The slot with the attached token * @param old_so_pin The old SO_PIN * @param new_so_pin The new SO_PIN */ BOTAN_PUBLIC_API(2,0) void change_so_pin(Slot& slot, const secure_string& old_so_pin, const secure_string& new_so_pin); /** * Sets user PIN with SO_PIN * @param slot The slot with the attached token * @param so_pin PIN of the security officer * @param pin The user PIN that should be set */ BOTAN_PUBLIC_API(2,0) void set_pin(Slot& slot, const secure_string& so_pin, const secure_string& pin); /// Provides access to all PKCS#11 functions class BOTAN_PUBLIC_API(2,0) LowLevel { public: /// @param ptr the functon list pointer to use. Can be retrieved via `LowLevel::C_GetFunctionList` explicit LowLevel(FunctionListPtr ptr); /****************************** General purpose functions ******************************/ /** * C_Initialize initializes the Cryptoki library. * @param init_args if this is not nullptr, it gets cast to (`C_InitializeArgs`) and dereferenced * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CantLock \li CryptokiAlreadyInitialized * \li FunctionFailed \li GeneralError \li HostMemory * \li NeedToCreateThreads \li OK * @return true on success, false otherwise */ bool C_Initialize(VoidPtr init_args, ReturnValue* return_value = ThrowException) const; /** * C_Finalize indicates that an application is done with the Cryptoki library. * @param reserved reserved. Should be nullptr * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li FunctionFailed * \li GeneralError \li HostMemory \li OK * @return true on success, false otherwise */ bool C_Finalize(VoidPtr reserved, ReturnValue* return_value = ThrowException) const; /** * C_GetInfo returns general information about Cryptoki. * @param info_ptr location that receives information * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li FunctionFailed * \li GeneralError \li HostMemory \li OK * @return true on success, false otherwise */ bool C_GetInfo(Info* info_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GetFunctionList returns the function list. * @param pkcs11_module The PKCS#11 module * @param function_list_ptr_ptr receives pointer to function list * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li FunctionFailed \li GeneralError * \li HostMemory \li OK * @return true on success, false otherwise */ static bool C_GetFunctionList(Dynamically_Loaded_Library& pkcs11_module, FunctionListPtr* function_list_ptr_ptr, ReturnValue* return_value = ThrowException); /****************************** Slot and token management functions ******************************/ /** * C_GetSlotList obtains a list of slots in the system. * @param token_present only slots with tokens * @param slot_list_ptr receives array of slot IDs * @param count_ptr receives number of slots * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li FunctionFailed \li GeneralError \li HostMemory * \li OK * @return true on success, false otherwise */ bool C_GetSlotList(Bbool token_present, SlotId* slot_list_ptr, Ulong* count_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GetSlotList obtains a list of slots in the system. * @param token_present only slots with tokens * @param slot_ids receives vector of slot IDs * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li FunctionFailed \li GeneralError \li HostMemory * \li OK * @return true on success, false otherwise */ bool C_GetSlotList(bool token_present, std::vector& slot_ids, ReturnValue* return_value = ThrowException) const; /** * C_GetSlotInfo obtains information about a particular slot in the system. * @param slot_id the ID of the slot * @param info_ptr receives the slot information * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li SlotIdInvalid * @return true on success, false otherwise */ bool C_GetSlotInfo(SlotId slot_id, SlotInfo* info_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GetTokenInfo obtains information about a particular token in the system. * @param slot_id ID of the token's slot * @param info_ptr receives the token information * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li SlotIdInvalid * \li TokenNotPresent \li TokenNotRecognized \li ArgumentsBad * @return true on success, false otherwise */ bool C_GetTokenInfo(SlotId slot_id, TokenInfo* info_ptr, ReturnValue* return_value = ThrowException) const; /** * C_WaitForSlotEvent waits for a slot event (token insertion, removal, etc.) to occur. * @param flags blocking/nonblocking flag * @param slot_ptr location that receives the slot ID * @param reserved reserved. Should be NULL_PTR * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li FunctionFailed * \li GeneralError \li HostMemory \li NoEvent * \li OK * @return true on success, false otherwise */ bool C_WaitForSlotEvent(Flags flags, SlotId* slot_ptr, VoidPtr reserved, ReturnValue* return_value = ThrowException) const; /** * C_GetMechanismList obtains a list of mechanism types supported by a token. * @param slot_id ID of token's slot * @param mechanism_list_ptr gets mech. array * @param count_ptr gets # of mechs. * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li BufferTooSmall \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li SlotIdInvalid \li TokenNotPresent \li TokenNotRecognized * \li ArgumentsBad * @return true on success, false otherwise */ bool C_GetMechanismList(SlotId slot_id, MechanismType* mechanism_list_ptr, Ulong* count_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GetMechanismList obtains a list of mechanism types supported by a token. * @param slot_id ID of token's slot * @param mechanisms receives vector of supported mechanisms * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li BufferTooSmall \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li SlotIdInvalid \li TokenNotPresent \li TokenNotRecognized * \li ArgumentsBad * @return true on success, false otherwise */ bool C_GetMechanismList(SlotId slot_id, std::vector& mechanisms, ReturnValue* return_value = ThrowException) const; /** * C_GetMechanismInfo obtains information about a particular mechanism possibly supported by a token. * @param slot_id ID of the token's slot * @param type type of mechanism * @param info_ptr receives mechanism info * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li MechanismInvalid \li OK * \li SlotIdInvalid \li TokenNotPresent \li TokenNotRecognized * \li ArgumentsBad * @return true on success, false otherwise */ bool C_GetMechanismInfo(SlotId slot_id, MechanismType type, MechanismInfo* info_ptr, ReturnValue* return_value = ThrowException) const; /** * C_InitToken initializes a token. * @param slot_id ID of the token's slot * @param so_pin_ptr the SO's initial PIN * @param so_pin_len length in bytes of the SO_PIN * @param label_ptr 32-byte token label (blank padded) * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li PinIncorrect \li PinLocked \li SessionExists * \li SlotIdInvalid \li TokenNotPresent \li TokenNotRecognized * \li TokenWriteProtected \li ArgumentsBad * @return true on success, false otherwise */ bool C_InitToken(SlotId slot_id, Utf8Char* so_pin_ptr, Ulong so_pin_len, Utf8Char* label_ptr, ReturnValue* return_value = ThrowException) const; /** * C_InitToken initializes a token. * @param slot_id ID of the token's slot * @param so_pin the SO's initial PIN * @param label token label (at max 32 bytes long) * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li PinIncorrect \li PinLocked \li SessionExists * \li SlotIdInvalid \li TokenNotPresent \li TokenNotRecognized * \li TokenWriteProtected \li ArgumentsBad * @return true on success, false otherwise */ template bool C_InitToken(SlotId slot_id, const std::vector& so_pin, const std::string& label, ReturnValue* return_value = ThrowException) const { std::string padded_label = label; if(label.size() < 32) { padded_label.insert(padded_label.end(), 32 - label.size(), ' '); } return C_InitToken(slot_id, reinterpret_cast< Utf8Char* >(const_cast< uint8_t* >(so_pin.data())), so_pin.size(), reinterpret_cast< Utf8Char* >(const_cast< char* >(padded_label.c_str())), return_value); } /** * C_InitPIN initializes the normal user's PIN. * @param session the session's handle * @param pin_ptr the normal user's PIN * @param pin_len length in bytes of the PIN * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li PinInvalid \li PinLenRange \li SessionClosed * \li SessionReadOnly \li SessionHandleInvalid \li TokenWriteProtected * \li UserNotLoggedIn \li ArgumentsBad * @return true on success, false otherwise */ bool C_InitPIN(SessionHandle session, Utf8Char* pin_ptr, Ulong pin_len, ReturnValue* return_value = ThrowException) const; /** * C_InitPIN initializes the normal user's PIN. * @param session the session's handle * @param pin the normal user's PIN * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li PinInvalid \li PinLenRange \li SessionClosed * \li SessionReadOnly \li SessionHandleInvalid \li TokenWriteProtected * \li UserNotLoggedIn \li ArgumentsBad * @return true on success, false otherwise */ template bool C_InitPIN(SessionHandle session, const std::vector& pin, ReturnValue* return_value = ThrowException) const { return C_InitPIN(session, reinterpret_cast< Utf8Char* >(const_cast< uint8_t* >(pin.data())), pin.size(), return_value); } /** * C_SetPIN modifies the PIN of the user who is logged in. * @param session the session's handle * @param old_pin_ptr the old PIN * @param old_len length of the old PIN * @param new_pin_ptr the new PIN * @param new_len length of the new PIN * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li PinIncorrect \li PinInvalid \li PinLenRange * \li PinLocked \li SessionClosed \li SessionHandleInvalid * \li SessionReadOnly \li TokenWriteProtected \li ArgumentsBad * @return true on success, false otherwise */ bool C_SetPIN(SessionHandle session, Utf8Char* old_pin_ptr, Ulong old_len, Utf8Char* new_pin_ptr, Ulong new_len, ReturnValue* return_value = ThrowException) const; /** * C_SetPIN modifies the PIN of the user who is logged in. * @param session the session's handle * @param old_pin the old PIN * @param new_pin the new PIN * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li PinIncorrect \li PinInvalid \li PinLenRange * \li PinLocked \li SessionClosed \li SessionHandleInvalid * \li SessionReadOnly \li TokenWriteProtected \li ArgumentsBad * @return true on success, false otherwise */ template bool C_SetPIN(SessionHandle session, const std::vector& old_pin, const std::vector& new_pin, ReturnValue* return_value = ThrowException) const { return C_SetPIN(session, reinterpret_cast< Utf8Char* >(const_cast< uint8_t* >(old_pin.data())), old_pin.size(), reinterpret_cast< Utf8Char* >(const_cast< uint8_t* >(new_pin.data())), new_pin.size(), return_value); } /****************************** Session management ******************************/ /** * C_OpenSession opens a session between an application and a token. * @param slot_id the slot's ID * @param flags from CK_SESSION_INFO * @param application passed to callback * @param notify callback function * @param session_ptr gets session handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li SessionCount * \li SessionParallelNotSupported \li SessionReadWriteSoExists \li SlotIdInvalid * \li TokenNotPresent \li TokenNotRecognized \li TokenWriteProtected * \li ArgumentsBad * @return true on success, false otherwise */ bool C_OpenSession(SlotId slot_id, Flags flags, VoidPtr application, Notify notify, SessionHandle* session_ptr, ReturnValue* return_value = ThrowException) const; /** * C_CloseSession closes a session between an application and a token. * @param session the session's handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li SessionClosed * \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_CloseSession(SessionHandle session, ReturnValue* return_value = ThrowException) const; /** * C_CloseAllSessions closes all sessions with a token. * @param slot_id the token's slot * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li SlotIdInvalid * \li TokenNotPresent * @return true on success, false otherwise */ bool C_CloseAllSessions(SlotId slot_id, ReturnValue* return_value = ThrowException) const; /** * C_GetSessionInfo obtains information about the session. * @param session the session's handle * @param info_ptr receives session info * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li SessionClosed * \li SessionHandleInvalid \li ArgumentsBad * @return true on success, false otherwise */ bool C_GetSessionInfo(SessionHandle session, SessionInfo* info_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GetOperationState obtains the state of the cryptographic operation in a session. * @param session session's handle * @param operation_state_ptr gets state * @param operation_state_len_ptr gets state length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li BufferTooSmall \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * \li StateUnsaveable \li ArgumentsBad * @return true on success, false otherwise */ bool C_GetOperationState(SessionHandle session, Byte* operation_state_ptr, Ulong* operation_state_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_SetOperationState restores the state of the cryptographic operation in a session. * @param session session's handle * @param operation_state_ptr holds state * @param operation_state_len holds state length * @param encryption_key en/decryption key * @param authentication_key sign/verify key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li KeyChanged \li KeyNeeded * \li KeyNotNeeded \li OK \li SavedStateInvalid * \li SessionClosed \li SessionHandleInvalid \li ArgumentsBad * @return true on success, false otherwise */ bool C_SetOperationState(SessionHandle session, Byte* operation_state_ptr, Ulong operation_state_len, ObjectHandle encryption_key, ObjectHandle authentication_key, ReturnValue* return_value = ThrowException) const; /** * C_Login logs a user into a token. * @param session the session's handle * @param user_type the user type * @param pin_ptr the user's PIN * @param pin_len the length of the PIN * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li PinIncorrect * \li PinLocked \li SessionClosed \li SessionHandleInvalid * \li SessionReadOnlyExists \li UserAlreadyLoggedIn \li UserAnotherAlreadyLoggedIn * \li UserPinNotInitialized \li UserTooManyTypes \li UserTypeInvalid * @return true on success, false otherwise */ bool C_Login(SessionHandle session, UserType user_type, Utf8Char* pin_ptr, Ulong pin_len, ReturnValue* return_value = ThrowException) const; /** * C_Login logs a user into a token. * @param session the session's handle * @param user_type the user type * @param pin the user or security officer's PIN * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li PinIncorrect * \li PinLocked \li SessionClosed \li SessionHandleInvalid * \li SessionReadOnlyExists \li UserAlreadyLoggedIn \li UserAnotherAlreadyLoggedIn * \li UserPinNotInitialized \li UserTooManyTypes \li UserTypeInvalid * @return true on success, false otherwise */ template bool C_Login(SessionHandle session, UserType user_type, const std::vector& pin, ReturnValue* return_value = ThrowException) const { return C_Login(session, user_type, reinterpret_cast< Utf8Char* >(const_cast< uint8_t* >(pin.data())), pin.size(), return_value); } /** * C_Logout logs a user out from a token. * @param session the session's handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_Logout(SessionHandle session, ReturnValue* return_value = ThrowException) const; /****************************** Object management functions ******************************/ /** * C_CreateObject creates a new object. * @param session the session's handle * @param attribute_template_ptr the object's template * @param count attributes in template * @param object_ptr gets new object's handle. * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeReadOnly \li AttributeTypeInvalid * \li AttributeValueInvalid \li CryptokiNotInitialized \li CurveNotSupported * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li DomainParamsInvalid \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li SessionReadOnly * \li TemplateIncomplete \li TemplateInconsistent \li TokenWriteProtected * \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_CreateObject(SessionHandle session, Attribute* attribute_template_ptr, Ulong count, ObjectHandle* object_ptr, ReturnValue* return_value = ThrowException) const; /** * C_CopyObject copies an object, creating a new object for the copy. * @param session the session's handle * @param object the object's handle * @param attribute_template_ptr template for new object * @param count attributes in template * @param new_object_ptr receives handle of copy * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ActionProhibited \li ArgumentsBad \li AttributeReadOnly * \li AttributeTypeInvalid \li AttributeValueInvalid \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionFailed \li GeneralError \li HostMemory * \li ObjectHandleInvalid \li OK \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li SessionReadOnly * \li TemplateInconsistent \li TokenWriteProtected \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_CopyObject(SessionHandle session, ObjectHandle object, Attribute* attribute_template_ptr, Ulong count, ObjectHandle* new_object_ptr, ReturnValue* return_value = ThrowException) const; /** * C_DestroyObject destroys an object. * @param session the session's handle * @param object the object's handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ActionProhibited \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li ObjectHandleInvalid * \li OK \li PinExpired \li SessionClosed * \li SessionHandleInvalid \li SessionReadOnly \li TokenWriteProtected * @return true on success, false otherwise */ bool C_DestroyObject(SessionHandle session, ObjectHandle object, ReturnValue* return_value = ThrowException) const; /** * C_GetObjectSize gets the size of an object in bytes. * @param session the session's handle * @param object the object's handle * @param size_ptr receives size of object * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li InformationSensitive * \li ObjectHandleInvalid \li OK \li SessionClosed * \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_GetObjectSize(SessionHandle session, ObjectHandle object, Ulong* size_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GetAttributeValue obtains the value of one or more object attributes. * @param session the session's handle * @param object the object's handle * @param attribute_template_ptr specifies attrs; gets vals * @param count attributes in template * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeSensitive \li AttributeTypeInvalid * \li BufferTooSmall \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li ObjectHandleInvalid * \li OK \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_GetAttributeValue(SessionHandle session, ObjectHandle object, Attribute* attribute_template_ptr, Ulong count, ReturnValue* return_value = ThrowException) const; /** * C_GetAttributeValue obtains the value of one or more object attributes. * @param session the session's handle * @param object the object's handle * @param attribute_values specifies attrs; gets vals * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeSensitive \li AttributeTypeInvalid * \li BufferTooSmall \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li ObjectHandleInvalid * \li OK \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ template bool C_GetAttributeValue(SessionHandle session, ObjectHandle object, std::map>& attribute_values, ReturnValue* return_value = ThrowException) const { std::vector getter_template; for(const auto& entry : attribute_values) { getter_template.emplace_back(Attribute{ static_cast< CK_ATTRIBUTE_TYPE >(entry.first), nullptr, 0 }); } bool success = C_GetAttributeValue(session, object, const_cast< Attribute* >(getter_template.data()), getter_template.size(), return_value); if(!success) { return success; } size_t i = 0; for(auto& entry : attribute_values) { entry.second.clear(); entry.second.resize(getter_template.at(i).ulValueLen); getter_template.at(i).pValue = const_cast< uint8_t* >(entry.second.data()); i++; } return C_GetAttributeValue(session, object, const_cast< Attribute* >(getter_template.data()), getter_template.size(), return_value); } /** * C_SetAttributeValue modifies the value of one or more object attributes. * @param session the session's handle * @param object the object's handle * @param attribute_template_ptr specifies attrs and values * @param count attributes in template * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ActionProhibited \li ArgumentsBad \li AttributeReadOnly * \li AttributeTypeInvalid \li AttributeValueInvalid \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionFailed \li GeneralError \li HostMemory * \li ObjectHandleInvalid \li OK \li SessionClosed * \li SessionHandleInvalid \li SessionReadOnly \li TemplateInconsistent * \li TokenWriteProtected \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SetAttributeValue(SessionHandle session, ObjectHandle object, Attribute* attribute_template_ptr, Ulong count, ReturnValue* return_value = ThrowException) const; /** * C_SetAttributeValue modifies the value of one or more object attributes. * @param session the session's handle * @param object the object's handle * @param attribute_values specifies attrs and values * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ActionProhibited \li ArgumentsBad \li AttributeReadOnly * \li AttributeTypeInvalid \li AttributeValueInvalid \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionFailed \li GeneralError \li HostMemory * \li ObjectHandleInvalid \li OK \li SessionClosed * \li SessionHandleInvalid \li SessionReadOnly \li TemplateInconsistent * \li TokenWriteProtected \li UserNotLoggedIn * @return true on success, false otherwise */ template bool C_SetAttributeValue(SessionHandle session, ObjectHandle object, std::map>& attribute_values, ReturnValue* return_value = ThrowException) const { std::vector setter_template; for(auto& entry : attribute_values) { setter_template.emplace_back(Attribute{ static_cast< CK_ATTRIBUTE_TYPE >(entry.first), entry.second.data(), static_cast(entry.second.size()) }); } return C_SetAttributeValue(session, object, const_cast< Attribute* >(setter_template.data()), setter_template.size(), return_value); } /** * C_FindObjectsInit initializes a search for token and session objects that match a template. * @param session the session's handle * @param attribute_template_ptr attribute values to match * @param count attrs in search template * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeTypeInvalid \li AttributeValueInvalid * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationActive * \li PinExpired \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_FindObjectsInit(SessionHandle session, Attribute* attribute_template_ptr, Ulong count, ReturnValue* return_value = ThrowException) const; /** * C_FindObjects continues a search for token and session objects that match a template, obtaining additional object handles. * @param session session's handle * @param object_ptr gets obj. handles * @param max_object_count max handles to get * @param object_count_ptr actual # returned * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_FindObjects(SessionHandle session, ObjectHandle* object_ptr, Ulong max_object_count, Ulong* object_count_ptr, ReturnValue* return_value = ThrowException) const; /** * C_FindObjectsFinal finishes a search for token and session objects. * @param session the session's handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_FindObjectsFinal(SessionHandle session, ReturnValue* return_value = ThrowException) const; /****************************** Encryption functions ******************************/ /** * C_EncryptInit initializes an encryption operation. * @param session the session's handle * @param mechanism_ptr the encryption mechanism * @param key handle of encryption key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li KeyFunctionNotPermitted * \li KeyHandleInvalid \li KeySizeRange \li KeyTypeInconsistent * \li MechanismInvalid \li MechanismParamInvalid \li OK * \li OperationActive \li PinExpired \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_EncryptInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_Encrypt encrypts single-part data. * @param session session's handle * @param data_ptr the plaintext data * @param data_len size of plaintext data in bytes * @param encrypted_data gets ciphertext * @param encrypted_data_len_ptr gets c-text size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataInvalid \li DataLenRange \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_Encrypt(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* encrypted_data, Ulong* encrypted_data_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_Encrypt encrypts single-part data. * @param session session's handle * @param plaintext_data the plaintext data * @param encrypted_data gets ciphertext * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataInvalid \li DataLenRange \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid * @return true on success, false otherwise */ template bool C_Encrypt(SessionHandle session, const std::vector& plaintext_data, std::vector& encrypted_data, ReturnValue* return_value = ThrowException) const { Ulong encrypted_size = 0; if(!C_Encrypt(session, const_cast((plaintext_data.data())), plaintext_data.size(), nullptr, &encrypted_size, return_value)) { return false; } encrypted_data.resize(encrypted_size); return C_Encrypt(session, const_cast(plaintext_data.data()), plaintext_data.size(), encrypted_data.data(), &encrypted_size, return_value); } /** * C_EncryptUpdate continues a multiple-part encryption operation. * @param session session's handle * @param part_ptr the plaintext data * @param part_len plaintext data len * @param encrypted_part_ptr gets ciphertext * @param encrypted_part_len_ptr gets c-text size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_EncryptUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, Byte* encrypted_part_ptr, Ulong* encrypted_part_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_EncryptFinal finishes a multiple-part encryption operation. * @param session session handle * @param last_encrypted_part_ptr last c-text * @param last_encrypted_part_len_ptr gets last size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_EncryptFinal(SessionHandle session, Byte* last_encrypted_part_ptr, Ulong* last_encrypted_part_len_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Decryption functions ******************************/ /** * C_DecryptInit initializes a decryption operation. * @param session the session's handle * @param mechanism_ptr the decryption mechanism * @param key handle of decryption key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li KeyFunctionNotPermitted \li KeyHandleInvalid \li KeySizeRange * \li KeyTypeInconsistent \li MechanismInvalid \li MechanismParamInvalid * \li OK \li OperationActive \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_DecryptInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_Decrypt decrypts encrypted data in a single part. * @param session session's handle * @param encrypted_data_ptr ciphertext * @param encrypted_data_len ciphertext length * @param data_ptr gets plaintext * @param data_len_ptr gets p-text size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li EncryptedDataInvalid \li EncryptedDataLenRange \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_Decrypt(SessionHandle session, Byte* encrypted_data_ptr, Ulong encrypted_data_len, Byte* data_ptr, Ulong* data_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_Decrypt decrypts encrypted data in a single part. * @param session session's handle * @param encrypted_data ciphertext * @param decrypted_data gets plaintext * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li EncryptedDataInvalid \li EncryptedDataLenRange \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ template bool C_Decrypt(SessionHandle session, const std::vector& encrypted_data, std::vector& decrypted_data, ReturnValue* return_value = ThrowException) const { Ulong decrypted_size = 0; if(!C_Decrypt(session, const_cast((encrypted_data.data())), encrypted_data.size(), nullptr, &decrypted_size, return_value)) { return false; } decrypted_data.resize(decrypted_size); return C_Decrypt(session, const_cast(encrypted_data.data()), encrypted_data.size(), decrypted_data.data(), &decrypted_size, return_value); } /** * C_DecryptUpdate continues a multiple-part decryption operation. * @param session session's handle * @param encrypted_part_ptr encrypted data * @param encrypted_part_len input length * @param part_ptr gets plaintext * @param part_len_ptr p-text size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li EncryptedDataInvalid \li EncryptedDataLenRange \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_DecryptUpdate(SessionHandle session, Byte* encrypted_part_ptr, Ulong encrypted_part_len, Byte* part_ptr, Ulong* part_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_DecryptFinal finishes a multiple-part decryption operation. * @param session the session's handle * @param last_part_ptr gets plaintext * @param last_part_len_ptr p-text size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li EncryptedDataInvalid \li EncryptedDataLenRange \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_DecryptFinal(SessionHandle session, Byte* last_part_ptr, Ulong* last_part_len_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Message digesting functions ******************************/ /** * C_DigestInit initializes a message-digesting operation. * @param session the session's handle * @param mechanism_ptr the digesting mechanism * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li MechanismInvalid \li MechanismParamInvalid \li OK * \li OperationActive \li PinExpired \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_DigestInit(SessionHandle session, Mechanism* mechanism_ptr, ReturnValue* return_value = ThrowException) const; /** * C_Digest digests data in a single part. * @param session the session's handle * @param data_ptr data to be digested * @param data_len bytes of data to digest * @param digest_ptr gets the message digest * @param digest_len_ptr gets digest length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_Digest(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* digest_ptr, Ulong* digest_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_DigestUpdate continues a multiple-part message-digesting operation. * @param session the session's handle * @param part_ptr data to be digested * @param part_len bytes of data to be digested * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_DigestUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, ReturnValue* return_value = ThrowException) const; /** * C_DigestKey continues a multi-part message-digesting operation, by digesting the value of a secret key as part of the data already digested. * @param session the session's handle * @param key secret key to digest * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li KeyHandleInvalid * \li KeyIndigestible \li KeySizeRange \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_DigestKey(SessionHandle session, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_DigestFinal finishes a multiple-part message-digesting operation. * @param session the session's handle * @param digest_ptr gets the message digest * @param digest_len_ptr gets uint8_t count of digest * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_DigestFinal(SessionHandle session, Byte* digest_ptr, Ulong* digest_len_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Signing and MACing functions ******************************/ /** * C_SignInit initializes a signature (private key encryption) operation, where the signature is (will be) an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param mechanism_ptr the signature mechanism * @param key handle of signature key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li KeyFunctionNotPermitted \li KeyHandleInvalid \li KeySizeRange * \li KeyTypeInconsistent \li MechanismInvalid \li MechanismParamInvalid * \li OK \li OperationActive \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SignInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_Sign signs (encrypts with private key) data in a single part, where the signature is (will be) an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param data_ptr the data to sign * @param data_len count of bytes to sign * @param signature_ptr gets the signature * @param signature_len_ptr gets signature length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataInvalid \li DataLenRange \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn \li FunctionRejected * @return true on success, false otherwise */ bool C_Sign(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* signature_ptr, Ulong* signature_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_Sign signs (encrypts with private key) data in a single part, where the signature is (will be) an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param data the data to sign * @param signature gets the signature * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataInvalid \li DataLenRange \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn \li FunctionRejected * @return true on success, false otherwise */ template bool C_Sign(SessionHandle session, const std::vector& data, std::vector& signature, ReturnValue* return_value = ThrowException) const { Ulong signature_size = 0; if(!C_Sign(session, const_cast((data.data())), data.size(), nullptr, &signature_size, return_value)) { return false; } signature.resize(signature_size); return C_Sign(session, const_cast(data.data()), data.size(), signature.data(), &signature_size, return_value); } /** * C_SignUpdate continues a multiple-part signature operation, where the signature is (will be) an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param part_ptr the data to sign * @param part_len count of bytes to sign * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataLenRange * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SignUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, ReturnValue* return_value = ThrowException) const; /** * C_SignUpdate continues a multiple-part signature operation, where the signature is (will be) an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param part the data to sign * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataLenRange * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ template bool C_SignUpdate(SessionHandle session, const std::vector& part, ReturnValue* return_value = ThrowException) const { return C_SignUpdate(session, const_cast(part.data()), part.size(), return_value); } /** * C_SignFinal finishes a multiple-part signature operation, returning the signature. * @param session the session's handle * @param signature_ptr gets the signature * @param signature_len_ptr gets signature length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * \li UserNotLoggedIn \li FunctionRejected * @return true on success, false otherwise */ bool C_SignFinal(SessionHandle session, Byte* signature_ptr, Ulong* signature_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_SignFinal finishes a multiple-part signature operation, returning the signature. * @param session the session's handle * @param signature gets the signature * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * \li UserNotLoggedIn \li FunctionRejected * @return true on success, false otherwise */ template bool C_SignFinal(SessionHandle session, std::vector& signature, ReturnValue* return_value = ThrowException) const { Ulong signature_size = 0; if(!C_SignFinal(session, nullptr, &signature_size, return_value)) { return false; } signature.resize(signature_size); return C_SignFinal(session, signature.data(), &signature_size, return_value); } /** * C_SignRecoverInit initializes a signature operation, where the data can be recovered from the signature. * @param session the session's handle * @param mechanism_ptr the signature mechanism * @param key handle of the signature key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li KeyFunctionNotPermitted \li KeyHandleInvalid \li KeySizeRange * \li KeyTypeInconsistent \li MechanismInvalid \li MechanismParamInvalid * \li OK \li OperationActive \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SignRecoverInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_SignRecover signs data in a single operation, where the data can be recovered from the signature. * @param session the session's handle * @param data_ptr the data to sign * @param data_len count of bytes to sign * @param signature_ptr gets the signature * @param signature_len_ptr gets signature length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataInvalid \li DataLenRange \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SignRecover(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* signature_ptr, Ulong* signature_len_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Functions for verifying signatures and MACs ******************************/ /** * C_VerifyInit initializes a verification operation, where the signature is an appendix to the data, and plaintext cannot be recovered from the signature (e.g. DSA). * @param session the session's handle * @param mechanism_ptr the verification mechanism * @param key verification key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li KeyFunctionNotPermitted \li KeyHandleInvalid \li KeySizeRange * \li KeyTypeInconsistent \li MechanismInvalid \li MechanismParamInvalid * \li OK \li OperationActive \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_VerifyInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_Verify verifies a signature in a single-part operation, where the signature is an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param data_ptr signed data * @param data_len length of signed data * @param signature_ptr signature * @param signature_len signature length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataInvalid * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * \li SignatureInvalid \li SignatureLenRange * @return true on success, false otherwise */ bool C_Verify(SessionHandle session, Byte* data_ptr, Ulong data_len, Byte* signature_ptr, Ulong signature_len, ReturnValue* return_value = ThrowException) const; /** * C_Verify verifies a signature in a single-part operation, where the signature is an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param data signed data * @param signature signature * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataInvalid * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * \li SignatureInvalid \li SignatureLenRange * @return true on success, false otherwise */ template bool C_Verify(SessionHandle session, const std::vector& data, std::vector& signature, ReturnValue* return_value = ThrowException) const { return C_Verify(session, const_cast(data.data()), data.size(), signature.data(), signature.size(), return_value); } /** * C_VerifyUpdate continues a multiple-part verification operation, where the signature is an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param part_ptr signed data * @param part_len length of signed data * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataLenRange * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_VerifyUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, ReturnValue* return_value = ThrowException) const; /** * C_VerifyUpdate continues a multiple-part verification operation, where the signature is an appendix to the data, and plaintext cannot be recovered from the signature. * @param session the session's handle * @param part signed data * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataLenRange * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ template bool C_VerifyUpdate(SessionHandle session, std::vector part, ReturnValue* return_value = ThrowException) const { return C_VerifyUpdate(session, part.data(), part.size(), return_value); } /** * C_VerifyFinal finishes a multiple-part verification operation, checking the signature. * @param session the session's handle * @param signature_ptr signature to verify * @param signature_len signature length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DataLenRange * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid \li SignatureInvalid * \li SignatureLenRange * @return true on success, false otherwise */ bool C_VerifyFinal(SessionHandle session, Byte* signature_ptr, Ulong signature_len, ReturnValue* return_value = ThrowException) const; /** * C_VerifyRecoverInit initializes a signature verification operation, where the data is recovered from the signature. * @param session the session's handle * @param mechanism_ptr the verification mechanism * @param key verification key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li KeyFunctionNotPermitted \li KeyHandleInvalid \li KeySizeRange * \li KeyTypeInconsistent \li MechanismInvalid \li MechanismParamInvalid * \li OK \li OperationActive \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_VerifyRecoverInit(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle key, ReturnValue* return_value = ThrowException) const; /** * C_VerifyRecover verifies a signature in a single-part operation, where the data is recovered from the signature. * @param session the session's handle * @param signature_ptr signature to verify * @param signature_len signature length * @param data_ptr gets signed data * @param data_len_ptr gets signed data len * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataInvalid \li DataLenRange \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid \li SignatureLenRange \li SignatureInvalid * @return true on success, false otherwise */ bool C_VerifyRecover(SessionHandle session, Byte* signature_ptr, Ulong signature_len, Byte* data_ptr, Ulong* data_len_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Dual-purpose cryptographic functions ******************************/ /** * C_DigestEncryptUpdate continues a multiple-part digesting and encryption operation. * @param session session's handle * @param part_ptr the plaintext data * @param part_len plaintext length * @param encrypted_part_ptr gets ciphertext * @param encrypted_part_len_ptr gets c-text length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_DigestEncryptUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, Byte* encrypted_part_ptr, Ulong* encrypted_part_len_ptr, ReturnValue* return_value = ThrowException) const ; /** * C_DecryptDigestUpdate continues a multiple-part decryption and digesting operation. * @param session session's handle * @param encrypted_part_ptr ciphertext * @param encrypted_part_len ciphertext length * @param part_ptr gets plaintext * @param part_len_ptr gets plaintext len * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li EncryptedDataInvalid \li EncryptedDataLenRange \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationNotInitialized \li SessionClosed * \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_DecryptDigestUpdate(SessionHandle session, Byte* encrypted_part_ptr, Ulong encrypted_part_len, Byte* part_ptr, Ulong* part_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_SignEncryptUpdate continues a multiple-part signing and encryption operation. * @param session session's handle * @param part_ptr the plaintext data * @param part_len plaintext length * @param encrypted_part_ptr gets ciphertext * @param encrypted_part_len_ptr gets c-text length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li OK * \li OperationNotInitialized \li SessionClosed \li SessionHandleInvalid * \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SignEncryptUpdate(SessionHandle session, Byte* part_ptr, Ulong part_len, Byte* encrypted_part_ptr, Ulong* encrypted_part_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_DecryptVerifyUpdate continues a multiple-part decryption and verify operation. * @param session session's handle * @param encrypted_part_ptr ciphertext * @param encrypted_part_len ciphertext length * @param part_ptr gets plaintext * @param part_len_ptr gets p-text length * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DataLenRange \li DeviceError \li DeviceMemory * \li DeviceRemoved \li EncryptedDataInvalid \li EncryptedDataLenRange * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li OK \li OperationNotInitialized * \li SessionClosed \li SessionHandleInvalid * @return true on success, false otherwise */ bool C_DecryptVerifyUpdate(SessionHandle session, Byte* encrypted_part_ptr, Ulong encrypted_part_len, Byte* part_ptr, Ulong* part_len_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Key management functions ******************************/ /** * C_GenerateKey generates a secret key, creating a new key object. * @param session the session's handle * @param mechanism_ptr key generation mech. * @param attribute_template_ptr template for new key * @param count # of attrs in template * @param key_ptr gets handle of new key * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeReadOnly \li AttributeTypeInvalid * \li AttributeValueInvalid \li CryptokiNotInitialized \li CurveNotSupported * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li MechanismInvalid \li MechanismParamInvalid * \li OK \li OperationActive \li PinExpired * \li SessionClosed \li SessionHandleInvalid \li SessionReadOnly * \li TemplateIncomplete \li TemplateInconsistent \li TokenWriteProtected * \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_GenerateKey(SessionHandle session, Mechanism* mechanism_ptr, Attribute* attribute_template_ptr, Ulong count, ObjectHandle* key_ptr, ReturnValue* return_value = ThrowException) const; /** * C_GenerateKeyPair generates a public-key/private-key pair, creating new key objects. * @param session session handle * @param mechanism_ptr key-gen mech. * @param public_key_template_ptr template for pub. key * @param public_key_attribute_count # pub. attrs. * @param private_key_template_ptr template for priv. key * @param private_key_attribute_count # priv. attrs. * @param public_key_ptr gets pub. key handle * @param private_key_ptr gets priv. key handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeReadOnly \li AttributeTypeInvalid * \li AttributeValueInvalid \li CryptokiNotInitialized \li CurveNotSupported * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li DomainParamsInvalid \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li MechanismInvalid * \li MechanismParamInvalid \li OK \li OperationActive * \li PinExpired \li SessionClosed \li SessionHandleInvalid * \li SessionReadOnly \li TemplateIncomplete \li TemplateInconsistent * \li TokenWriteProtected \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_GenerateKeyPair(SessionHandle session, Mechanism* mechanism_ptr, Attribute* public_key_template_ptr, Ulong public_key_attribute_count, Attribute* private_key_template_ptr, Ulong private_key_attribute_count, ObjectHandle* public_key_ptr, ObjectHandle* private_key_ptr, ReturnValue* return_value = ThrowException) const; /** * C_WrapKey wraps (i.e., encrypts) a key. * @param session the session's handle * @param mechanism_ptr the wrapping mechanism * @param wrapping_key wrapping key * @param key key to be wrapped * @param wrapped_key_ptr gets wrapped key * @param wrapped_key_len_ptr gets wrapped key size * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li BufferTooSmall \li CryptokiNotInitialized * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li FunctionCanceled \li FunctionFailed \li GeneralError * \li HostMemory \li KeyHandleInvalid \li KeyNotWrappable * \li KeySizeRange \li KeyUnextractable \li MechanismInvalid * \li MechanismParamInvalid \li OK \li OperationActive * \li PinExpired \li SessionClosed \li SessionHandleInvalid * \li UserNotLoggedIn \li WrappingKeyHandleInvalid \li WrappingKeySizeRange * \li WrappingKeyTypeInconsistent * @return true on success, false otherwise */ bool C_WrapKey(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle wrapping_key, ObjectHandle key, Byte* wrapped_key_ptr, Ulong* wrapped_key_len_ptr, ReturnValue* return_value = ThrowException) const; /** * C_UnwrapKey unwraps (decrypts) a wrapped key, creating a new key object. * @param session session's handle * @param mechanism_ptr unwrapping mech. * @param unwrapping_key unwrapping key * @param wrapped_key_ptr the wrapped key * @param wrapped_key_len wrapped key len * @param attribute_template_ptr new key template * @param attribute_count template length * @param key_ptr gets new handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeReadOnly \li AttributeTypeInvalid * \li AttributeValueInvalid \li BufferTooSmall \li CryptokiNotInitialized * \li CurveNotSupported \li DeviceError \li DeviceMemory * \li DeviceRemoved \li DomainParamsInvalid \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li MechanismInvalid \li MechanismParamInvalid \li OK * \li OperationActive \li PinExpired \li SessionClosed * \li SessionHandleInvalid \li SessionReadOnly \li TemplateIncomplete * \li TemplateInconsistent \li TokenWriteProtected \li UnwrappingKeyHandleInvalid * \li UnwrappingKeySizeRange \li UnwrappingKeyTypeInconsistent \li UserNotLoggedIn * \li WrappedKeyInvalid \li WrappedKeyLenRange * @return true on success, false otherwise */ bool C_UnwrapKey(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle unwrapping_key, Byte* wrapped_key_ptr, Ulong wrapped_key_len, Attribute* attribute_template_ptr, Ulong attribute_count, ObjectHandle* key_ptr, ReturnValue* return_value = ThrowException) const; /** * C_DeriveKey derives a key from a base key, creating a new key object. * @param session session's handle * @param mechanism_ptr key deriv. mech. * @param base_key base key * @param attribute_template_ptr new key template * @param attribute_count template length * @param key_ptr gets new handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li AttributeReadOnly \li AttributeTypeInvalid * \li AttributeValueInvalid \li CryptokiNotInitialized \li CurveNotSupported * \li DeviceError \li DeviceMemory \li DeviceRemoved * \li DomainParamsInvalid \li FunctionCanceled \li FunctionFailed * \li GeneralError \li HostMemory \li KeyHandleInvalid * \li KeySizeRange \li KeyTypeInconsistent \li MechanismInvalid * \li MechanismParamInvalid \li OK \li OperationActive * \li PinExpired \li SessionClosed \li SessionHandleInvalid * \li SessionReadOnly \li TemplateIncomplete \li TemplateInconsistent * \li TokenWriteProtected \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_DeriveKey(SessionHandle session, Mechanism* mechanism_ptr, ObjectHandle base_key, Attribute* attribute_template_ptr, Ulong attribute_count, ObjectHandle* key_ptr, ReturnValue* return_value = ThrowException) const; /****************************** Random number generation functions ******************************/ /** * C_SeedRandom mixes additional seed material into the token's random number generator. * @param session the session's handle * @param seed_ptr the seed material * @param seed_len length of seed material * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationActive \li RandomSeedNotSupported * \li RandomNoRng \li SessionClosed \li SessionHandleInvalid * \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_SeedRandom(SessionHandle session, Byte* seed_ptr, Ulong seed_len, ReturnValue* return_value = ThrowException) const; /** * C_GenerateRandom generates random data. * @param session the session's handle * @param random_data_ptr receives the random data * @param random_len # of bytes to generate * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li ArgumentsBad \li CryptokiNotInitialized \li DeviceError * \li DeviceMemory \li DeviceRemoved \li FunctionCanceled * \li FunctionFailed \li GeneralError \li HostMemory * \li OK \li OperationActive \li RandomNoRng * \li SessionClosed \li SessionHandleInvalid \li UserNotLoggedIn * @return true on success, false otherwise */ bool C_GenerateRandom(SessionHandle session, Byte* random_data_ptr, Ulong random_len, ReturnValue* return_value = ThrowException) const; /****************************** Parallel function management functions ******************************/ /** * C_GetFunctionStatus is a legacy function; it obtains an updated status of a function running in parallel with an application. * @param session the session's handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li FunctionFailed \li FunctionNotParallel * \li GeneralError \li HostMemory \li SessionHandleInvalid * \li SessionClosed * @return true on success, false otherwise */ bool C_GetFunctionStatus(SessionHandle session, ReturnValue* return_value = ThrowException) const; /** * C_CancelFunction is a legacy function; it cancels a function running in parallel. * @param session the session's handle * @param return_value default value (`ThrowException`): throw exception on error. * if a non-NULL pointer is passed: return_value receives the return value of the PKCS#11 function and no exception is thrown. * At least the following PKCS#11 return values may be returned: * \li CryptokiNotInitialized \li FunctionFailed \li FunctionNotParallel * \li GeneralError \li HostMemory \li SessionHandleInvalid * \li SessionClosed * @return true on success, false otherwise */ bool C_CancelFunction(SessionHandle session, ReturnValue* return_value = ThrowException) const; private: const FunctionListPtr m_func_list_ptr; }; class PKCS11_Error : public Exception { public: explicit PKCS11_Error(const std::string& what) : Exception("PKCS11 error", what) { } }; class PKCS11_ReturnError final : public PKCS11_Error { public: explicit PKCS11_ReturnError(ReturnValue return_val) : PKCS11_Error(std::to_string(static_cast< uint32_t >(return_val))), m_return_val(return_val) {} inline ReturnValue get_return_value() const { return m_return_val; } private: const ReturnValue m_return_val; }; } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_ecc_key.cpp000066400000000000000000000110031322470703100210260ustar00rootroot00000000000000/* * PKCS#11 ECC * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) #include #include namespace Botan { namespace PKCS11 { namespace { /// Converts a DER-encoded ANSI X9.62 ECPoint to PointGFp PointGFp decode_public_point(const secure_vector& ec_point_data, const CurveGFp& curve) { secure_vector ec_point; BER_Decoder(ec_point_data).decode(ec_point, OCTET_STRING); return OS2ECP(ec_point, curve); } } EC_PublicKeyGenerationProperties::EC_PublicKeyGenerationProperties(const std::vector& ec_params) : PublicKeyProperties(KeyType::Ec), m_ec_params(ec_params) { add_binary(AttributeType::EcParams, m_ec_params); } EC_PublicKeyImportProperties::EC_PublicKeyImportProperties(const std::vector& ec_params, const std::vector& ec_point) : PublicKeyProperties(KeyType::Ec), m_ec_params(ec_params), m_ec_point(ec_point) { add_binary(AttributeType::EcParams, m_ec_params); add_binary(AttributeType::EcPoint, m_ec_point); } PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session, ObjectHandle handle) : Object(session, handle) { secure_vector ec_parameters = get_attribute_value(AttributeType::EcParams); m_domain_params = EC_Group(unlock(ec_parameters)); m_public_key = decode_public_point(get_attribute_value(AttributeType::EcPoint), m_domain_params.get_curve()); m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; } PKCS11_EC_PublicKey::PKCS11_EC_PublicKey(Session& session, const EC_PublicKeyImportProperties& props) : Object(session, props) { m_domain_params = EC_Group(props.ec_params()); secure_vector ec_point; BER_Decoder(props.ec_point()).decode(ec_point, OCTET_STRING); m_public_key = OS2ECP(ec_point, m_domain_params.get_curve()); m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; } EC_PrivateKeyImportProperties::EC_PrivateKeyImportProperties(const std::vector& ec_params, const BigInt& value) : PrivateKeyProperties(KeyType::Ec), m_ec_params(ec_params), m_value(value) { add_binary(AttributeType::EcParams, m_ec_params); add_binary(AttributeType::Value, BigInt::encode(m_value)); } PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session, ObjectHandle handle) : Object(session, handle), m_domain_params(), m_public_key() { secure_vector ec_parameters = get_attribute_value(AttributeType::EcParams); m_domain_params = EC_Group(unlock(ec_parameters)); } PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session, const EC_PrivateKeyImportProperties& props) : Object(session, props) { m_domain_params = EC_Group(props.ec_params()); } PKCS11_EC_PrivateKey::PKCS11_EC_PrivateKey(Session& session, const std::vector& ec_params, const EC_PrivateKeyGenerationProperties& props) : Object(session) { m_domain_params = EC_Group(ec_params); EC_PublicKeyGenerationProperties pub_key_props(ec_params); pub_key_props.set_verify(true); pub_key_props.set_private(false); pub_key_props.set_token(false); // don't create a persistent public key object ObjectHandle pub_key_handle = CK_INVALID_HANDLE; ObjectHandle priv_key_handle = CK_INVALID_HANDLE; Mechanism mechanism = { CKM_EC_KEY_PAIR_GEN, nullptr, 0 }; session.module()->C_GenerateKeyPair(session.handle(), &mechanism, pub_key_props.data(), pub_key_props.count(), props.data(), props.count(), &pub_key_handle, &priv_key_handle); this->reset_handle(priv_key_handle); Object public_key(session, pub_key_handle); m_public_key = decode_public_point(public_key.get_attribute_value(AttributeType::EcPoint), m_domain_params.get_curve()); } size_t PKCS11_EC_PrivateKey::key_length() const { return m_domain_params.get_order().bits(); } std::vector PKCS11_EC_PrivateKey::public_key_bits() const { return unlock(EC2OSP(public_point(), PointGFp::COMPRESSED)); } size_t PKCS11_EC_PrivateKey::estimated_strength() const { return ecp_work_factor(key_length()); } bool PKCS11_EC_PrivateKey::check_key(RandomNumberGenerator&, bool) const { return m_public_key.on_the_curve(); } AlgorithmIdentifier PKCS11_EC_PrivateKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), domain().DER_encode(EC_DOMPAR_ENC_EXPLICIT)); } } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_ecc_key.h000066400000000000000000000160221322470703100205010ustar00rootroot00000000000000/* * PKCS#11 ECC * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_ECC_H_ #define BOTAN_P11_ECC_H_ #include #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) #include #include #include #include #include namespace Botan { namespace PKCS11 { class Session; /// Properties for generating a PKCS#11 EC public key class BOTAN_PUBLIC_API(2,0) EC_PublicKeyGenerationProperties final : public PublicKeyProperties { public: /// @param ec_params DER-encoding of an ANSI X9.62 Parameters value EC_PublicKeyGenerationProperties(const std::vector& ec_params); /// @return the DER-encoding of the ec parameters according to ANSI X9.62 inline const std::vector& ec_params() const { return m_ec_params; } private: const std::vector m_ec_params; }; /// Properties for importing a PKCS#11 EC public key class BOTAN_PUBLIC_API(2,0) EC_PublicKeyImportProperties final : public PublicKeyProperties { public: /** * @param ec_params DER-encoding of an ANSI X9.62 Parameters value * @param ec_point DER-encoding of ANSI X9.62 ECPoint value Q */ EC_PublicKeyImportProperties(const std::vector& ec_params, const std::vector& ec_point); /// @return the DER-encoding of the ec parameters according to ANSI X9.62 inline const std::vector& ec_params() const { return m_ec_params; } /// @return the DER-encoding of the ec public point according to ANSI X9.62 inline const std::vector& ec_point() const { return m_ec_point; } private: const std::vector m_ec_params; const std::vector m_ec_point; }; /// Represents a PKCS#11 EC public key class BOTAN_PUBLIC_API(2,0) PKCS11_EC_PublicKey : public virtual EC_PublicKey, public Object { public: static const ObjectClass Class = ObjectClass::PublicKey; /** * Creates a PKCS11_EC_PublicKey object from an existing PKCS#11 EC public key * @param session the session to use * @param handle the handle of the ecc public key */ PKCS11_EC_PublicKey(Session& session, ObjectHandle handle); /** * Imports an EC public key * @param session the session to use * @param props the attributes of the public key */ PKCS11_EC_PublicKey(Session& session, const EC_PublicKeyImportProperties& props); }; /// Properties for generating a PKCS#11 EC private key class BOTAN_PUBLIC_API(2,0) EC_PrivateKeyGenerationProperties final : public PrivateKeyProperties { public: EC_PrivateKeyGenerationProperties() : PrivateKeyProperties(KeyType::Ec) {} }; /// Properties for importing a PKCS#11 EC private key class BOTAN_PUBLIC_API(2,0) EC_PrivateKeyImportProperties final : public PrivateKeyProperties { public: /** * @param ec_params DER-encoding of an ANSI X9.62 Parameters value * @param value ANSI X9.62 private value d */ EC_PrivateKeyImportProperties(const std::vector& ec_params, const BigInt& value); /// @return the DER-encoding of the ec parameters according to ANSI X9.62 inline const std::vector& ec_params() const { return m_ec_params; } /// @return the value of the ec private key inline const BigInt& value() const { return m_value; } private: const std::vector m_ec_params; const BigInt m_value; }; // note: don't inherit from PKCS11_EC_PublicKey: a private key object IS NOT A public key object on a smartcard (-> two different objects) // note: don't inherit from EC_PublicKey: the public key can not be extracted from a PKCS11-EC-PrivateKey (its only attributes are CKA_EC_PARAMS and CKA_VALUE) /// Represents a PKCS#11 EC private key class BOTAN_PUBLIC_API(2,0) PKCS11_EC_PrivateKey : public virtual Private_Key, public Object { public: static const ObjectClass Class = ObjectClass::PrivateKey; /** * Creates a PKCS11_EC_PrivateKey object from an existing PKCS#11 EC private key * @param session the session to use * @param handle the handle of the EC private key */ PKCS11_EC_PrivateKey(Session& session, ObjectHandle handle); /** * Imports an EC private key * @param session the session to use * @param props the attributes of the private key */ PKCS11_EC_PrivateKey(Session& session, const EC_PrivateKeyImportProperties& props); /** * Generates a PKCS#11 EC private key * @param session the session to use * @param ec_params DER-encoding of an ANSI X9.62 Parameters value * @param props the attributes of the private key * @note no persistent public key object will be created */ PKCS11_EC_PrivateKey(Session& session, const std::vector& ec_params, const EC_PrivateKeyGenerationProperties& props); /// @returns the domain of the EC private key inline const EC_Group& domain() const { return m_domain_params; } /** * Sets the associated public point of this private key * @param point the public point * @param point_encoding encoding of the point (default DER-encoded) */ void set_public_point(const PointGFp& point, PublicPointEncoding point_encoding = PublicPointEncoding::Der) { m_public_key = point; m_point_encoding = point_encoding; } /** * Gets the public_point * @note the public key must be set using `set_public_point` * because it is not possible to infer the public key from a PKCS#11 EC private key * @return the public point of the private key * @throws Exception if the public point was not set using set_public_point() */ const PointGFp& public_point() const { if(m_public_key.is_zero()) { throw Exception("Public point not set. Inferring the public key from a PKCS#11 ec private key is not possible."); } return m_public_key; } /// @return the encoding format for the public point when it is passed to cryptoki functions as an argument PublicPointEncoding point_encoding() const { return m_point_encoding; } // Private_Key methods std::vector public_key_bits() const override; std::size_t key_length() const override; std::size_t estimated_strength() const override; bool check_key(RandomNumberGenerator&, bool) const override; AlgorithmIdentifier algorithm_identifier() const override; private: EC_Group m_domain_params; PointGFp m_public_key; PublicPointEncoding m_point_encoding = PublicPointEncoding::Der; }; } } #endif #endif botan-2.4.0/src/lib/prov/pkcs11/p11_ecdh.cpp000066400000000000000000000107001322470703100203320ustar00rootroot00000000000000/* * PKCS#11 ECDH * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_ECDH) #include #include #include #include namespace Botan { namespace PKCS11 { ECDH_PublicKey PKCS11_ECDH_PublicKey::export_key() const { return ECDH_PublicKey(domain(), public_point()); } ECDH_PrivateKey PKCS11_ECDH_PrivateKey::export_key() const { auto priv_key = get_attribute_value(AttributeType::Value); Null_RNG rng; return ECDH_PrivateKey(rng, domain(), BigInt::decode(priv_key)); } secure_vector PKCS11_ECDH_PrivateKey::private_key_bits() const { return export_key().private_key_bits(); } namespace { class PKCS11_ECDH_KA_Operation final : public PK_Ops::Key_Agreement { public: PKCS11_ECDH_KA_Operation(const PKCS11_EC_PrivateKey& key, const std::string& params) : PK_Ops::Key_Agreement(), m_key(key), m_mechanism(MechanismWrapper::create_ecdh_mechanism(params)) {} /// The encoding in V2.20 was not specified and resulted in different implementations choosing different encodings. /// Applications relying only on a V2.20 encoding (e.g. the DER variant) other than the one specified now (raw) may not work with all V2.30 compliant tokens. secure_vector agree(size_t key_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len) override { std::vector der_encoded_other_key; if(m_key.point_encoding() == PublicPointEncoding::Der) { der_encoded_other_key = DER_Encoder().encode(other_key, other_key_len, OCTET_STRING).get_contents_unlocked(); m_mechanism.set_ecdh_other_key(der_encoded_other_key.data(), der_encoded_other_key.size()); } else { m_mechanism.set_ecdh_other_key(other_key, other_key_len); } if(salt != nullptr && salt_len > 0) { m_mechanism.set_ecdh_salt(salt, salt_len); } ObjectHandle secret_handle = 0; AttributeContainer attributes; attributes.add_bool(AttributeType::Sensitive, false); attributes.add_bool(AttributeType::Extractable, true); attributes.add_numeric(AttributeType::Class, static_cast< CK_OBJECT_CLASS >(ObjectClass::SecretKey)); attributes.add_numeric(AttributeType::KeyType, static_cast< CK_KEY_TYPE >(KeyType::GenericSecret)); attributes.add_numeric(AttributeType::ValueLen, key_len); m_key.module()->C_DeriveKey(m_key.session().handle(), m_mechanism.data(), m_key.handle(), attributes.data(), attributes.count(), &secret_handle); Object secret_object(m_key.session(), secret_handle); secure_vector secret = secret_object.get_attribute_value(AttributeType::Value); if(secret.size() < key_len) { throw PKCS11_Error("ECDH key derivation secret length is too short"); } secret.resize(key_len); return secret; } private: const PKCS11_EC_PrivateKey& m_key; MechanismWrapper m_mechanism; }; } std::unique_ptr PKCS11_ECDH_PrivateKey::create_key_agreement_op(RandomNumberGenerator&, const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_ECDH_KA_Operation(*this, params)); } PKCS11_ECDH_KeyPair generate_ecdh_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props) { ObjectHandle pub_key_handle = 0; ObjectHandle priv_key_handle = 0; Mechanism mechanism = { static_cast< CK_MECHANISM_TYPE >(MechanismType::EcKeyPairGen), nullptr, 0 }; session.module()->C_GenerateKeyPair(session.handle(), &mechanism, pub_props.data(), pub_props.count(), priv_props.data(), priv_props.count(), &pub_key_handle, &priv_key_handle); return std::make_pair(PKCS11_ECDH_PublicKey(session, pub_key_handle), PKCS11_ECDH_PrivateKey(session, priv_key_handle)); } } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_ecdh.h000066400000000000000000000075641322470703100200150ustar00rootroot00000000000000/* * PKCS#11 ECDH * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_ECDH_H_ #define BOTAN_P11_ECDH_H_ #include #if defined(BOTAN_HAS_ECDH) #include #include #include #include namespace Botan { namespace PKCS11 { class Session; /// Represents a PKCS#11 ECDH public key class BOTAN_PUBLIC_API(2,0) PKCS11_ECDH_PublicKey : public PKCS11_EC_PublicKey { public: /** * Create a PKCS11_ECDH_PublicKey object from an existing PKCS#11 ECDH public key * @param session the session to use * @param handle the handle of the ECDH public key */ PKCS11_ECDH_PublicKey(Session& session, ObjectHandle handle) : EC_PublicKey(), PKCS11_EC_PublicKey(session, handle) {} /** * Imports a ECDH public key * @param session the session to use * @param props the attributes of the public key */ PKCS11_ECDH_PublicKey(Session& session, const EC_PublicKeyImportProperties& props) : EC_PublicKey(), PKCS11_EC_PublicKey(session, props) {} inline std::string algo_name() const override { return "ECDH"; } /// @return the exported ECDH public key ECDH_PublicKey export_key() const; }; /// Represents a PKCS#11 ECDH private key class BOTAN_PUBLIC_API(2,0) PKCS11_ECDH_PrivateKey final : public virtual PKCS11_EC_PrivateKey, public virtual PK_Key_Agreement_Key { public: /** * Creates a PKCS11_ECDH_PrivateKey object from an existing PKCS#11 ECDH private key * @param session the session to use * @param handle the handle of the ECDH private key */ PKCS11_ECDH_PrivateKey(Session& session, ObjectHandle handle) : PKCS11_EC_PrivateKey(session, handle) {} /** * Imports an ECDH private key * @param session the session to use * @param props the attributes of the private key */ PKCS11_ECDH_PrivateKey(Session& session, const EC_PrivateKeyImportProperties& props) : PKCS11_EC_PrivateKey(session, props) {} /** * Generates a PKCS#11 ECDH private key * @param session the session to use * @param ec_params DER-encoding of an ANSI X9.62 Parameters value * @param props the attributes of the private key * @note no persistent public key object will be created */ PKCS11_ECDH_PrivateKey(Session& session, const std::vector& ec_params, const EC_PrivateKeyGenerationProperties& props) : PKCS11_EC_PrivateKey(session, ec_params, props) {} inline std::string algo_name() const override { return "ECDH"; } inline std::vector public_value() const override { return unlock(EC2OSP(public_point(), PointGFp::UNCOMPRESSED)); } /// @return the exported ECDH private key ECDH_PrivateKey export_key() const; secure_vector private_key_bits() const override; std::unique_ptr create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; using PKCS11_ECDH_KeyPair = std::pair; /** * PKCS#11 ECDH key pair generation * @param session the session that should be used for the key generation * @param pub_props the properties of the public key * @param priv_props the properties of the private key */ BOTAN_PUBLIC_API(2,0) PKCS11_ECDH_KeyPair generate_ecdh_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props); } } #endif #endif botan-2.4.0/src/lib/prov/pkcs11/p11_ecdsa.cpp000066400000000000000000000161551322470703100205200ustar00rootroot00000000000000/* * PKCS#11 ECDSA * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_ECDSA) #include #include #include #include namespace Botan { namespace PKCS11 { ECDSA_PublicKey PKCS11_ECDSA_PublicKey::export_key() const { return ECDSA_PublicKey(domain(), public_point()); } bool PKCS11_ECDSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) { return false; } if(!strong) { return true; } ECDSA_PublicKey pubkey(domain(), public_point()); return KeyPair::signature_consistency_check(rng, *this, pubkey, "EMSA1(SHA-256)"); } ECDSA_PrivateKey PKCS11_ECDSA_PrivateKey::export_key() const { auto priv_key = get_attribute_value(AttributeType::Value); Null_RNG rng; return ECDSA_PrivateKey(rng, domain(), BigInt::decode(priv_key)); } secure_vector PKCS11_ECDSA_PrivateKey::private_key_bits() const { return export_key().private_key_bits(); } namespace { class PKCS11_ECDSA_Signature_Operation final : public PK_Ops::Signature { public: PKCS11_ECDSA_Signature_Operation(const PKCS11_EC_PrivateKey& key, const std::string& emsa) : PK_Ops::Signature(), m_key(key), m_order(key.domain().get_order()), m_mechanism(MechanismWrapper::create_ecdsa_mechanism(emsa)) {} void update(const uint8_t msg[], size_t msg_len) override { if(!m_initialized) { // first call to update: initialize and cache message because we can not determine yet whether a single- or multiple-part operation will be performed m_key.module()->C_SignInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); m_initialized = true; m_first_message = secure_vector(msg, msg + msg_len); return; } if(!m_first_message.empty()) { // second call to update: start multiple-part operation m_key.module()->C_SignUpdate(m_key.session().handle(), m_first_message); m_first_message.clear(); } m_key.module()->C_SignUpdate(m_key.session().handle(), const_cast(msg), msg_len); } secure_vector sign(RandomNumberGenerator&) override { secure_vector signature; if(!m_first_message.empty()) { // single call to update: perform single-part operation m_key.module()->C_Sign(m_key.session().handle(), m_first_message, signature); m_first_message.clear(); } else { // multiple calls to update (or none): finish multiple-part operation m_key.module()->C_SignFinal(m_key.session().handle(), signature); } m_initialized = false; return signature; } private: const PKCS11_EC_PrivateKey& m_key; const BigInt& m_order; MechanismWrapper m_mechanism; secure_vector m_first_message; bool m_initialized = false; }; class PKCS11_ECDSA_Verification_Operation final : public PK_Ops::Verification { public: PKCS11_ECDSA_Verification_Operation(const PKCS11_EC_PublicKey& key, const std::string& emsa) : PK_Ops::Verification(), m_key(key), m_order(key.domain().get_order()), m_mechanism(MechanismWrapper::create_ecdsa_mechanism(emsa)) {} void update(const uint8_t msg[], size_t msg_len) override { if(!m_initialized) { // first call to update: initialize and cache message because we can not determine yet whether a single- or multiple-part operation will be performed m_key.module()->C_VerifyInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); m_initialized = true; m_first_message = secure_vector(msg, msg + msg_len); return; } if(!m_first_message.empty()) { // second call to update: start multiple-part operation m_key.module()->C_VerifyUpdate(m_key.session().handle(), m_first_message); m_first_message.clear(); } m_key.module()->C_VerifyUpdate(m_key.session().handle(), const_cast(msg), msg_len); } bool is_valid_signature(const uint8_t sig[], size_t sig_len) override { ReturnValue return_value = ReturnValue::SignatureInvalid; if(!m_first_message.empty()) { // single call to update: perform single-part operation m_key.module()->C_Verify(m_key.session().handle(), m_first_message.data(), m_first_message.size(), const_cast(sig), sig_len, &return_value); m_first_message.clear(); } else { // multiple calls to update (or none): finish multiple-part operation m_key.module()->C_VerifyFinal(m_key.session().handle(), const_cast(sig), sig_len, &return_value); } m_initialized = false; if(return_value != ReturnValue::OK && return_value != ReturnValue::SignatureInvalid) { throw PKCS11_ReturnError(return_value); } return return_value == ReturnValue::OK; } private: const PKCS11_EC_PublicKey& m_key; const BigInt& m_order; MechanismWrapper m_mechanism; secure_vector m_first_message; bool m_initialized = false; }; } std::unique_ptr PKCS11_ECDSA_PublicKey::create_verification_op(const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_ECDSA_Verification_Operation(*this, params)); } std::unique_ptr PKCS11_ECDSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_ECDSA_Signature_Operation(*this, params)); } PKCS11_ECDSA_KeyPair generate_ecdsa_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props) { ObjectHandle pub_key_handle = 0; ObjectHandle priv_key_handle = 0; Mechanism mechanism = { static_cast(MechanismType::EcKeyPairGen), nullptr, 0 }; session.module()->C_GenerateKeyPair(session.handle(), &mechanism, pub_props.data(), pub_props.count(), priv_props.data(), priv_props.count(), &pub_key_handle, &priv_key_handle); return std::make_pair(PKCS11_ECDSA_PublicKey(session, pub_key_handle), PKCS11_ECDSA_PrivateKey(session, priv_key_handle)); } } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_ecdsa.h000066400000000000000000000077021322470703100201630ustar00rootroot00000000000000/* * PKCS#11 ECDSA * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_ECDSA_H_ #define BOTAN_P11_ECDSA_H_ #include #if defined(BOTAN_HAS_ECDSA) #include #include #include namespace Botan { namespace PKCS11 { class Session; /// Represents a PKCS#11 ECDSA public key class BOTAN_PUBLIC_API(2,0) PKCS11_ECDSA_PublicKey final : public PKCS11_EC_PublicKey, public virtual ECDSA_PublicKey { public: /** * Creates a PKCS11_ECDSA_PublicKey object from an existing PKCS#11 ECDSA public key * @param session the session to use * @param handle the handle of the ECDSA public key */ PKCS11_ECDSA_PublicKey(Session& session, ObjectHandle handle) : EC_PublicKey(), PKCS11_EC_PublicKey(session, handle) {} /** * Imports an ECDSA public key * @param session the session to use * @param props the attributes of the public key */ PKCS11_ECDSA_PublicKey(Session& session, const EC_PublicKeyImportProperties& props) : EC_PublicKey(), PKCS11_EC_PublicKey(session, props) {} inline std::string algo_name() const override { return "ECDSA"; } /// @return the exported ECDSA public key ECDSA_PublicKey export_key() const; std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; }; /// Represents a PKCS#11 ECDSA private key class BOTAN_PUBLIC_API(2,0) PKCS11_ECDSA_PrivateKey final : public PKCS11_EC_PrivateKey { public: /** * Creates a PKCS11_ECDSA_PrivateKey object from an existing PKCS#11 ECDSA private key * @param session the session to use * @param handle the handle of the ECDSA private key */ PKCS11_ECDSA_PrivateKey(Session& session, ObjectHandle handle) : PKCS11_EC_PrivateKey(session, handle) {} /** * Imports a ECDSA private key * @param session the session to use * @param props the attributes of the private key */ PKCS11_ECDSA_PrivateKey(Session& session, const EC_PrivateKeyImportProperties& props) : PKCS11_EC_PrivateKey(session, props) {} /** * Generates a PKCS#11 ECDSA private key * @param session the session to use * @param ec_params DER-encoding of an ANSI X9.62 Parameters value * @param props the attributes of the private key * @note no persistent public key object will be created */ PKCS11_ECDSA_PrivateKey(Session& session, const std::vector& ec_params, const EC_PrivateKeyGenerationProperties& props) : PKCS11_EC_PrivateKey(session, ec_params, props) {} inline std::string algo_name() const override { return "ECDSA"; } /// @return the exported ECDSA private key ECDSA_PrivateKey export_key() const; secure_vector private_key_bits() const override; bool check_key(RandomNumberGenerator&, bool) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; using PKCS11_ECDSA_KeyPair = std::pair; /** * ECDSA key pair generation * @param session the session that should be used for the key generation * @param pub_props the properties of the public key * @param priv_props the properties of the private key */ BOTAN_PUBLIC_API(2,0) PKCS11_ECDSA_KeyPair generate_ecdsa_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props); } } #endif #endif botan-2.4.0/src/lib/prov/pkcs11/p11_mechanism.cpp000066400000000000000000000252231322470703100214010ustar00rootroot00000000000000/* * PKCS#11 Mechanism * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace PKCS11 { namespace { using PSS_Params = std::tuple; // maps a PSS mechanism type to the number of bytes used for the salt, the mechanism type of the underlying hash algorithm and the MGF static const std::map PssOptions = { { MechanismType::RsaPkcsPss, PSS_Params(0, MechanismType::Sha1, MGF::Mgf1Sha1) }, { MechanismType::Sha1RsaPkcsPss, PSS_Params(20, MechanismType::Sha1, MGF::Mgf1Sha1) }, { MechanismType::Sha224RsaPkcsPss, PSS_Params(28, MechanismType::Sha224, MGF::Mgf1Sha224) }, { MechanismType::Sha256RsaPkcsPss, PSS_Params(32, MechanismType::Sha256, MGF::Mgf1Sha256) }, { MechanismType::Sha384RsaPkcsPss, PSS_Params(48, MechanismType::Sha384, MGF::Mgf1Sha384) }, { MechanismType::Sha512RsaPkcsPss, PSS_Params(64, MechanismType::Sha512, MGF::Mgf1Sha512) } }; struct MechanismData { explicit MechanismData(MechanismType _type) : type(_type) {} MechanismData(MechanismData const&) = default; MechanismData& operator=(MechanismData const&) = default; virtual ~MechanismData() = default; // the mechanism to perform MechanismType type; }; struct RSA_SignMechanism final : public MechanismData { explicit RSA_SignMechanism(MechanismType _type) : MechanismData(_type), hash(static_cast(0)), mgf(static_cast(0)), salt_size(0) { auto pss_option = PssOptions.find(type); if(pss_option != PssOptions.end()) { hash = std::get<1>(pss_option->second); mgf = std::get<2>(pss_option->second); salt_size = std::get<0>(pss_option->second); } } // hash algorithm used in the PSS encoding; if the signature mechanism does not include message hashing, // then this value must be the mechanism used by the application to generate the message hash; // if the signature mechanism includes hashing, then this value must match the hash algorithm indicated by the signature mechanism MechanismType hash; // mask generation function to use on the encoded block MGF mgf; // length, in bytes, of the salt value used in the PSS encoding; typical values are the length of the message hash and zero size_t salt_size; }; // note: when updating this map, update the documentation for `MechanismWrapper::create_rsa_sign_mechanism` static std::map SignMechanisms = { { "Raw", RSA_SignMechanism(MechanismType::RsaX509) }, { "EMSA2(Raw)", RSA_SignMechanism(MechanismType::RsaX931) }, { "EMSA2(SHA-1)", RSA_SignMechanism(MechanismType::Sha1RsaX931) }, // RSASSA PKCS#1 v1.5 { "EMSA3(Raw)", RSA_SignMechanism(MechanismType::RsaPkcs) }, { "EMSA3(SHA-1)", RSA_SignMechanism(MechanismType::Sha1RsaPkcs) }, { "EMSA3(SHA-224)", RSA_SignMechanism(MechanismType::Sha224RsaPkcs) }, { "EMSA3(SHA-256)", RSA_SignMechanism(MechanismType::Sha256RsaPkcs) }, { "EMSA3(SHA-384)", RSA_SignMechanism(MechanismType::Sha384RsaPkcs) }, { "EMSA3(SHA-512)", RSA_SignMechanism(MechanismType::Sha512RsaPkcs) }, // RSASSA PKCS#1 PSS { "EMSA4(Raw)", RSA_SignMechanism(MechanismType::RsaPkcsPss) }, { "EMSA4(SHA-1)", RSA_SignMechanism(MechanismType::Sha1RsaPkcsPss) }, { "EMSA4(SHA-224)", RSA_SignMechanism(MechanismType::Sha224RsaPkcsPss) }, { "EMSA4(SHA-256)", RSA_SignMechanism(MechanismType::Sha256RsaPkcsPss) }, { "EMSA4(SHA-384)", RSA_SignMechanism(MechanismType::Sha384RsaPkcsPss) }, { "EMSA4(SHA-512)", RSA_SignMechanism(MechanismType::Sha512RsaPkcsPss) }, { "ISO9796", RSA_SignMechanism(MechanismType::Rsa9796) } }; struct RSA_CryptMechanism final : public MechanismData { RSA_CryptMechanism(MechanismType _type, size_t _padding_size, MechanismType _hash, MGF _mgf) : MechanismData(_type), hash(_hash), mgf(_mgf), padding_size(_padding_size) {} RSA_CryptMechanism(MechanismType _type, size_t _padding_size) : RSA_CryptMechanism(_type, _padding_size, static_cast(0), static_cast(0)) {} // mechanism ID of the message digest algorithm used to calculate the digest of the encoding parameter MechanismType hash; // mask generation function to use on the encoded block MGF mgf; // number of bytes required for the padding size_t padding_size; }; // note: when updating this map, update the documentation for `MechanismWrapper::create_rsa_crypt_mechanism` static const std::map CryptMechanisms = { { "Raw", RSA_CryptMechanism(MechanismType::RsaX509, 0) }, { "EME-PKCS1-v1_5", RSA_CryptMechanism(MechanismType::RsaPkcs, 11) }, { "OAEP(SHA-1)", RSA_CryptMechanism(MechanismType::RsaPkcsOaep, 2 + 2 * 20, MechanismType::Sha1, MGF::Mgf1Sha1) }, { "OAEP(SHA-224)", RSA_CryptMechanism(MechanismType::RsaPkcsOaep, 2 + 2 * 28, MechanismType::Sha224, MGF::Mgf1Sha224) }, { "OAEP(SHA-256)", RSA_CryptMechanism(MechanismType::RsaPkcsOaep, 2 + 2 * 32, MechanismType::Sha256, MGF::Mgf1Sha256) }, { "OAEP(SHA-384)", RSA_CryptMechanism(MechanismType::RsaPkcsOaep, 2 + 2 * 48, MechanismType::Sha384, MGF::Mgf1Sha384) }, { "OAEP(SHA-512)", RSA_CryptMechanism(MechanismType::RsaPkcsOaep, 2 + 2 * 64, MechanismType::Sha512, MGF::Mgf1Sha512) } }; // note: when updating this map, update the documentation for `MechanismWrapper::create_ecdsa_mechanism` static std::map EcdsaHash = { { "Raw", MechanismType::Ecdsa }, { "SHA-160", MechanismType::EcdsaSha1 }, { "SHA-224", MechanismType::EcdsaSha224 }, { "SHA-256", MechanismType::EcdsaSha256 }, { "SHA-384", MechanismType::EcdsaSha384 }, { "SHA-512", MechanismType::EcdsaSha512 } }; // note: when updating this map, update the documentation for `MechanismWrapper::create_ecdh_mechanism` static std::map EcdhHash = { { "Raw", KeyDerivation::Null }, { "SHA-160", KeyDerivation::Sha1Kdf }, { "SHA-224", KeyDerivation::Sha224Kdf }, { "SHA-256", KeyDerivation::Sha256Kdf }, { "SHA-384", KeyDerivation::Sha384Kdf }, { "SHA-512", KeyDerivation::Sha512Kdf } }; } MechanismWrapper::MechanismWrapper(MechanismType mechanism_type) : m_mechanism( { static_cast(mechanism_type), nullptr, 0 }), m_parameters(nullptr) {} MechanismWrapper MechanismWrapper::create_rsa_crypt_mechanism(const std::string& padding) { auto mechanism_info_it = CryptMechanisms.find(padding); if(mechanism_info_it == CryptMechanisms.end()) { // at this point it would be possible to support additional configurations that are not predefined above by parsing `padding` throw Lookup_Error("PKCS#11 RSA encrypt/decrypt does not support EME " + padding); } RSA_CryptMechanism mechanism_info = mechanism_info_it->second; MechanismWrapper mech(mechanism_info.type); if(mechanism_info.type == MechanismType::RsaPkcsOaep) { mech.m_parameters = std::make_shared(); mech.m_parameters->oaep_params.hashAlg = static_cast(mechanism_info.hash); mech.m_parameters->oaep_params.mgf = static_cast(mechanism_info.mgf); mech.m_parameters->oaep_params.source = CKZ_DATA_SPECIFIED; mech.m_parameters->oaep_params.pSourceData = nullptr; mech.m_parameters->oaep_params.ulSourceDataLen = 0; mech.m_mechanism.pParameter = mech.m_parameters.get(); mech.m_mechanism.ulParameterLen = sizeof(RsaPkcsOaepParams); } mech.m_padding_size = mechanism_info.padding_size; return mech; } MechanismWrapper MechanismWrapper::create_rsa_sign_mechanism(const std::string& padding) { auto mechanism_info_it = SignMechanisms.find(padding); if(mechanism_info_it == SignMechanisms.end()) { // at this point it would be possible to support additional configurations that are not predefined above by parsing `padding` throw Lookup_Error("PKCS#11 RSA sign/verify does not support EMSA " + padding); } RSA_SignMechanism mechanism_info = mechanism_info_it->second; MechanismWrapper mech(mechanism_info.type); if(PssOptions.find(mechanism_info.type) != PssOptions.end()) { mech.m_parameters = std::make_shared(); mech.m_parameters->pss_params.hashAlg = static_cast(mechanism_info.hash); mech.m_parameters->pss_params.mgf = static_cast(mechanism_info.mgf); mech.m_parameters->pss_params.sLen = mechanism_info.salt_size; mech.m_mechanism.pParameter = mech.m_parameters.get(); mech.m_mechanism.ulParameterLen = sizeof(RsaPkcsPssParams); } return mech; } MechanismWrapper MechanismWrapper::create_ecdsa_mechanism(const std::string& hash) { std::string hash_name = hash; if(hash_name != "Raw") { hash_name = hash_for_emsa(hash); } auto mechanism_type = EcdsaHash.find(hash_name); if(mechanism_type == EcdsaHash.end()) { throw Lookup_Error("PKCS#11 ECDSA sign/verify does not support " + hash); } return MechanismWrapper(mechanism_type->second); } MechanismWrapper MechanismWrapper::create_ecdh_mechanism(const std::string& params) { std::vector param_parts = split_on(params, ','); if(param_parts.empty() || param_parts.size() > 2) throw Invalid_Argument("PKCS #11 ECDH key derivation bad params " + params); const bool use_cofactor = (param_parts[0] == "Cofactor") || (param_parts.size() == 2 && param_parts[1] == "Cofactor"); std::string kdf_name = (param_parts[0] == "Cofactor" ? param_parts[1] : param_parts[0]); std::string hash = kdf_name; if(kdf_name != "Raw") { SCAN_Name kdf_hash(kdf_name); if(kdf_hash.arg_count() > 0) { hash = kdf_hash.arg(0); } } auto kdf = EcdhHash.find(hash); if(kdf == EcdhHash.end()) { throw Lookup_Error("PKCS#11 ECDH key derivation does not support KDF " + kdf_name); } MechanismWrapper mech(use_cofactor ? MechanismType::Ecdh1CofactorDerive : MechanismType::Ecdh1Derive); mech.m_parameters = std::make_shared(); mech.m_parameters->ecdh_params.kdf = static_cast(kdf->second); mech.m_mechanism.pParameter = mech.m_parameters.get(); mech.m_mechanism.ulParameterLen = sizeof(Ecdh1DeriveParams); return mech; } } } botan-2.4.0/src/lib/prov/pkcs11/p11_mechanism.h000066400000000000000000000075351322470703100210540ustar00rootroot00000000000000/* * PKCS#11 Mechanism * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_MECHANISM_H_ #define BOTAN_P11_MECHANISM_H_ #include #include #include #include namespace Botan { namespace PKCS11 { /** * Simple class to build and hold the data for a CK_MECHANISM struct * for RSA (encryption/decryption, signature/verification) * and EC (ECDSA signature/verification, ECDH key derivation). */ class MechanismWrapper final { public: /// @param mechanism_type the CK_MECHANISM_TYPE for the `mechanism` field of the CK_MECHANISM struct explicit MechanismWrapper(MechanismType mechanism_type); /** * Creates the CK_MECHANISM data for RSA encryption/decryption * @param padding supported paddings are Raw (X.509), EME-PKCS1-v1_5 (PKCS#1 v1.5) and OAEP (PKCS#1 OAEP) */ static MechanismWrapper create_rsa_crypt_mechanism(const std::string& padding); /** * Creates the CK_MECHANISM data for RSA signature/verification * @param padding supported paddings are Raw (X.509), EMSA3 (PKCS#1 v1.5), EMSA4 (PKCS#1 PSS), * EMSA2 (ANSI X9.31) and ISO9796 (ISO/IEC 9796) */ static MechanismWrapper create_rsa_sign_mechanism(const std::string& padding); /** * Creates the CK_MECHANISM data for ECDSA signature/verification * @param hash the hash algorithm used to hash the data to sign. * supported hash functions are Raw and SHA-160 to SHA-512 */ static MechanismWrapper create_ecdsa_mechanism(const std::string& hash); /** * Creates the CK_MECHANISM data for ECDH key derivation (CKM_ECDH1_DERIVE or CKM_ECDH1_COFACTOR_DERIVE) * @param params specifies the key derivation function to use. * Supported KDFs are Raw and SHA-160 to SHA-512. * Params can also include the string "Cofactor" if the cofactor * key derivation mechanism should be used, for example "SHA-512,Cofactor" */ static MechanismWrapper create_ecdh_mechanism(const std::string& params); /** * Sets the salt for the ECDH mechanism parameters. * @param salt the salt * @param salt_len size of the salt in bytes */ inline void set_ecdh_salt(const uint8_t salt[], size_t salt_len) { m_parameters->ecdh_params.pSharedData = const_cast(salt); m_parameters->ecdh_params.ulSharedDataLen = salt_len; } /** * Sets the public key of the other party for the ECDH mechanism parameters. * @param other_key key of the other party * @param other_key_len size of the key of the other party in bytes */ inline void set_ecdh_other_key(const uint8_t other_key[], size_t other_key_len) { m_parameters->ecdh_params.pPublicData = const_cast(other_key); m_parameters->ecdh_params.ulPublicDataLen = other_key_len; } /// @return a pointer to the CK_MECHANISM struct that can be passed to the cryptoki functions inline Mechanism* data() const { return const_cast(&m_mechanism); } /// @return the size of the padding in bytes (for encryption/decryption) inline size_t padding_size() const { return m_padding_size; } /// Holds the mechanism parameters for OEAP, PSS and ECDH union MechanismParameters { MechanismParameters() { std::memset(this, 0, sizeof(MechanismParameters)); } RsaPkcsOaepParams oaep_params; RsaPkcsPssParams pss_params; Ecdh1DeriveParams ecdh_params; }; private: Mechanism m_mechanism; std::shared_ptr m_parameters; size_t m_padding_size = 0; }; } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_module.cpp000066400000000000000000000016441322470703100207230ustar00rootroot00000000000000/* * PKCS#11 Module * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace PKCS11 { Module::Module(const std::string& file_path, C_InitializeArgs init_args) : m_file_path(file_path) { reload(init_args); } Module::~Module() BOTAN_NOEXCEPT { try { m_low_level->C_Finalize(nullptr, nullptr); } catch(...) { // we are noexcept and must swallow any exception here } } void Module::reload(C_InitializeArgs init_args) { if(m_low_level) { m_low_level->C_Finalize(nullptr); } m_library.reset(new Dynamically_Loaded_Library(m_file_path)); LowLevel::C_GetFunctionList(*m_library, &m_func_list); m_low_level.reset(new LowLevel(m_func_list)); m_low_level->C_Initialize(&init_args); } } } botan-2.4.0/src/lib/prov/pkcs11/p11_module.h000066400000000000000000000043471322470703100203730ustar00rootroot00000000000000/* * PKCS#11 Module * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_MODULE_H_ #define BOTAN_P11_MODULE_H_ #include #include #include #include namespace Botan { namespace PKCS11 { /** * Loads the PKCS#11 shared library * Calls C_Initialize on load and C_Finalize on destruction */ class BOTAN_PUBLIC_API(2,0) Module final { public: /** * Loads the shared library and calls C_Initialize * @param file_path the path to the PKCS#11 shared library * @param init_args flags to use for `C_Initialize` */ Module(const std::string& file_path, C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast< CK_FLAGS >(Flag::OsLockingOk), nullptr }); /* Microsoft Visual Studio <= 2013 does not support default generated move special member functions. Everything else we target should support it */ #if !defined( _MSC_VER ) || ( _MSC_VER >= 1900 ) Module(Module&& other) = default; Module& operator=(Module&& other) = default; #endif // Dtor calls C_Finalize(). A copy could be deleted while the origin still exists // Furthermore std::unique_ptr member -> not copyable Module(const Module& other) = delete; Module& operator=(const Module& other) = delete; /// Calls C_Finalize() ~Module() BOTAN_NOEXCEPT; /** * Reloads the module and reinitializes it * @param init_args flags to use for `C_Initialize` */ void reload(C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast< CK_FLAGS >(Flag::OsLockingOk), nullptr }); inline LowLevel* operator->() const { return m_low_level.get(); } /// @return general information about Cryptoki inline Info get_info() const { Info info; m_low_level->C_GetInfo(&info); return info; } private: const std::string m_file_path; FunctionListPtr m_func_list = nullptr; std::unique_ptr m_library = nullptr; std::unique_ptr m_low_level = nullptr; }; } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_object.cpp000066400000000000000000000172431322470703100207060ustar00rootroot00000000000000/* * PKCS#11 Object * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace PKCS11 { AttributeContainer::AttributeContainer(ObjectClass object_class) { add_class(object_class); } void AttributeContainer::add_class(ObjectClass object_class) { m_numerics.push_back(static_cast< uint64_t >(object_class)); add_attribute(AttributeType::Class, reinterpret_cast< uint8_t* >(&m_numerics.back()), sizeof(ObjectClass)); } void AttributeContainer::add_string(AttributeType attribute, const std::string& value) { m_strings.push_back(value); add_attribute(attribute, reinterpret_cast< const uint8_t* >(m_strings.back().data()), value.size()); } void AttributeContainer::add_binary(AttributeType attribute, const uint8_t* value, size_t length) { m_vectors.push_back(secure_vector(value, value + length)); add_attribute(attribute, reinterpret_cast< const uint8_t* >(m_vectors.back().data()), length); } void AttributeContainer::add_bool(AttributeType attribute, bool value) { m_numerics.push_back(value ? True : False); add_attribute(attribute, reinterpret_cast< uint8_t* >(&m_numerics.back()), sizeof(Bbool)); } void AttributeContainer::add_attribute(AttributeType attribute, const uint8_t* value, uint32_t size) { bool exists = false; // check if the attribute has been added already for(auto& existing_attribute : m_attributes) { if(existing_attribute.type == static_cast< CK_ATTRIBUTE_TYPE >(attribute)) { // remove old entries m_strings.erase(std::remove_if(m_strings.begin(), m_strings.end(), [ &existing_attribute ](const std::string& data) { return data.data() == existing_attribute.pValue; }), m_strings.end()); m_numerics.erase(std::remove_if(m_numerics.begin(), m_numerics.end(), [ &existing_attribute ](const uint64_t& data) { return &data == existing_attribute.pValue; }), m_numerics.end()); m_vectors.erase(std::remove_if(m_vectors.begin(), m_vectors.end(), [ &existing_attribute ](const secure_vector& data) { return data.data() == existing_attribute.pValue; }), m_vectors.end()); existing_attribute.pValue = const_cast< uint8_t* >(value); existing_attribute.ulValueLen = size; exists = true; break; } } if(!exists) { m_attributes.push_back(Attribute{ static_cast< CK_ATTRIBUTE_TYPE >(attribute), const_cast< uint8_t* >(value), size }); } } // ==================================================================================================== ObjectFinder::ObjectFinder(Session& session, const std::vector& search_template) : m_session(session), m_search_terminated(false) { module()->C_FindObjectsInit(m_session.get().handle(), const_cast< Attribute* >(search_template.data()), search_template.size()); } ObjectFinder::~ObjectFinder() BOTAN_NOEXCEPT { try { if(m_search_terminated == false) { module()->C_FindObjectsFinal(m_session.get().handle(), nullptr); } } catch(...) { // ignore error during noexcept function } } std::vector ObjectFinder::find(uint32_t max_count) const { std::vector result(max_count); Ulong objectCount = 0; module()->C_FindObjects(m_session.get().handle(), result.data(), max_count, &objectCount); if(objectCount < max_count) { result.resize(objectCount); } return result; } void ObjectFinder::finish() { module()->C_FindObjectsFinal(m_session.get().handle()); m_search_terminated = true; } // ==================================================================================================== ObjectProperties::ObjectProperties(ObjectClass object_class) : AttributeContainer(object_class), m_object_class(object_class) {} // ==================================================================================================== StorageObjectProperties::StorageObjectProperties(ObjectClass object_class) : ObjectProperties(object_class) {} // ==================================================================================================== DataObjectProperties::DataObjectProperties() : StorageObjectProperties(ObjectClass::Data) {} // ==================================================================================================== CertificateProperties::CertificateProperties(CertificateType cert_type) : StorageObjectProperties(ObjectClass::Certificate), m_cert_type(cert_type) { add_numeric(AttributeType::CertificateType, static_cast< CK_CERTIFICATE_TYPE >(m_cert_type)); } // ==================================================================================================== KeyProperties::KeyProperties(ObjectClass object_class, KeyType key_type) : StorageObjectProperties(object_class), m_key_type(key_type) { add_numeric(AttributeType::KeyType, static_cast< CK_ULONG >(m_key_type)); } // ==================================================================================================== PublicKeyProperties::PublicKeyProperties(KeyType key_type) : KeyProperties(ObjectClass::PublicKey, key_type) {} // ==================================================================================================== PrivateKeyProperties::PrivateKeyProperties(KeyType key_type) : KeyProperties(ObjectClass::PrivateKey, key_type) {} // ==================================================================================================== SecretKeyProperties::SecretKeyProperties(KeyType key_type) : KeyProperties(ObjectClass::SecretKey, key_type) {} // ==================================================================================================== DomainParameterProperties::DomainParameterProperties(KeyType key_type) : StorageObjectProperties(ObjectClass::DomainParameters), m_key_type(key_type) { add_numeric(AttributeType::KeyType, static_cast< CK_ULONG >(m_key_type)); } // ==================================================================================================== Object::Object(Session& session, ObjectHandle handle) : m_session(session), m_handle(handle) {} Object::Object(Session& session, const ObjectProperties& obj_props) : m_session(session), m_handle(0) { m_session.get().module()->C_CreateObject(m_session.get().handle(), obj_props.data(), obj_props.count(), &m_handle); } secure_vector Object::get_attribute_value(AttributeType attribute) const { std::map> attribute_map = { { attribute, secure_vector() } }; module()->C_GetAttributeValue(m_session.get().handle(), m_handle, attribute_map); return attribute_map.at(attribute); } void Object::set_attribute_value(AttributeType attribute, const secure_vector& value) const { std::map> attribute_map = { { attribute, value } }; module()->C_SetAttributeValue(m_session.get().handle(), m_handle, attribute_map); } void Object::destroy() const { module()->C_DestroyObject(m_session.get().handle(), m_handle); } ObjectHandle Object::copy(const AttributeContainer& modified_attributes) const { ObjectHandle copied_handle; module()->C_CopyObject(m_session.get().handle(), m_handle, modified_attributes.data(), modified_attributes.count(), &copied_handle); return copied_handle; } } } botan-2.4.0/src/lib/prov/pkcs11/p11_object.h000066400000000000000000000634551322470703100203610ustar00rootroot00000000000000/* * PKCS#11 Object * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_OBJECT_H_ #define BOTAN_P11_OBJECT_H_ #include #include #include #include #include #include #include #include namespace Botan { namespace PKCS11 { class Module; /// Helper class to build the Attribute / CK_ATTRIBUTE structures class BOTAN_PUBLIC_API(2,0) AttributeContainer { public: AttributeContainer() = default; /// @param object_class the class type of this container AttributeContainer(ObjectClass object_class); virtual ~AttributeContainer() = default; /* Microsoft Visual Studio <= 2013 does not support default generated move special member functions. Everything else we target should support it */ #if !defined( _MSC_VER ) || ( _MSC_VER >= 1900 ) AttributeContainer(AttributeContainer&& other) = default; AttributeContainer& operator=(AttributeContainer&& other) = default; #endif // Warning when implementing copy/assignment: m_attributes contains pointers to the other members which must be updated after a copy AttributeContainer(const AttributeContainer& other) = delete; AttributeContainer& operator=(const AttributeContainer& other) = delete; /// @return the attributes this container contains inline const std::vector& attributes() const { return m_attributes; } /// @return raw attribute data inline Attribute* data() const { return const_cast< Attribute* >(m_attributes.data()); } /// @return the number of attributes in this container inline size_t count() const { return m_attributes.size(); } /** * Add a class attribute (CKA_CLASS / AttributeType::Class). * @param object_class class attribute to add */ void add_class(ObjectClass object_class); /** * Add a string attribute (e.g. CKA_LABEL / AttributeType::Label). * @param attribute attribute type * @param value string value to add */ void add_string(AttributeType attribute, const std::string& value); /** * Add a binary attribute (e.g. CKA_ID / AttributeType::Id). * @param attribute attribute type * @param value binary attribute value to add * @param length size of the binary attribute value in bytes */ void add_binary(AttributeType attribute, const uint8_t* value, size_t length); /** * Add a binary attribute (e.g. CKA_ID / AttributeType::Id). * @param attribute attribute type * @param binary binary attribute value to add */ template void add_binary(AttributeType attribute, const std::vector& binary) { add_binary(attribute, binary.data(), binary.size()); } /** * Add a bool attribute (e.g. CKA_SENSITIVE / AttributeType::Sensitive). * @param attribute attribute type * @param value boolean value to add */ void add_bool(AttributeType attribute, bool value); /** * Add a numeric attribute (e.g. CKA_MODULUS_BITS / AttributeType::ModulusBits). * @param attribute attribute type * @param value numeric value to add */ template void add_numeric(AttributeType attribute, T value) { static_assert(std::is_integral::value, "Numeric value required."); m_numerics.push_back(static_cast< uint64_t >(value)); add_attribute(attribute, reinterpret_cast< uint8_t* >(&m_numerics.back()), sizeof(T)); } protected: /// Add an attribute with the given value and size to the attribute collection `m_attributes` void add_attribute(AttributeType attribute, const uint8_t* value, uint32_t size); private: std::vector m_attributes; std::list m_numerics; std::list m_strings; std::list> m_vectors; }; /// Manages calls to C_FindObjects* functions (C_FindObjectsInit -> C_FindObjects -> C_FindObjectsFinal) class BOTAN_PUBLIC_API(2,0) ObjectFinder final { public: /** * Initializes a search for token and session objects that match a template (calls C_FindObjectsInit) * @param session the session to use for the search * @param search_template the search_template as a vector of `Attribute` */ ObjectFinder(Session& session, const std::vector& search_template); ObjectFinder(const ObjectFinder& other) = default; ObjectFinder& operator=(const ObjectFinder& other) = default; /* Microsoft Visual Studio <= 2013 does not support default generated move special member functions. Everything else we target should support it */ #if !defined( _MSC_VER ) || ( _MSC_VER >= 1900 ) ObjectFinder(ObjectFinder&& other) = default; ObjectFinder& operator=(ObjectFinder&& other) = default; #endif /// Terminates a search for token and session objects (calls C_FindObjectsFinal) ~ObjectFinder() BOTAN_NOEXCEPT; /** * Starts or continues a search for token and session objects that match a template, obtaining additional object handles (calls C_FindObjects) * @param max_count maximum amount of object handles to retrieve. Default = 100 * @return the result of the search as a vector of `ObjectHandle` */ std::vector find(std::uint32_t max_count = 100) const; /// Finishes the search operation manually to allow a new ObjectFinder to exist void finish(); /// @return the module this `ObjectFinder` belongs to inline Module& module() const { return m_session.get().module(); } private: const std::reference_wrapper m_session; bool m_search_terminated; }; /// Common attributes of all objects class BOTAN_PUBLIC_API(2,0) ObjectProperties : public AttributeContainer { public: /// @param object_class the object class of the object ObjectProperties(ObjectClass object_class); /// @return the object class of this object inline ObjectClass object_class() const { return m_object_class; } private: const ObjectClass m_object_class; }; /// Common attributes of all storage objects class BOTAN_PUBLIC_API(2,0) StorageObjectProperties : public ObjectProperties { public: /// @param object_class the CK_OBJECT_CLASS this storage object belongs to StorageObjectProperties(ObjectClass object_class); /// @param label description of the object (RFC2279 string) inline void set_label(const std::string& label) { add_string(AttributeType::Label, label); } /// @param value if true the object is a token object; otherwise the object is a session object inline void set_token(bool value) { add_bool(AttributeType::Token, value); } /** * @param value if true the object is a private object; otherwise the object is a public object * When private, a user may not access the object until the user has been authenticated to the token */ inline void set_private(bool value) { add_bool(AttributeType::Private, value); } /// @param value if true the object can be modified, otherwise it is read-only void set_modifiable(bool value) { add_bool(AttributeType::Modifiable, value); } /// @param value if true the object can be copied using C_CopyObject void set_copyable(bool value) { add_bool(AttributeType::Copyable, value); } /// @param value if true the object can be destroyed using C_DestroyObject void set_destroyable(bool value) { add_bool(AttributeType::Destroyable, value); } }; /// Common attributes of all data objects class BOTAN_PUBLIC_API(2,0) DataObjectProperties final : public StorageObjectProperties { public: DataObjectProperties(); /// @param value description of the application that manages the object (RFC2279 string) inline void set_application(const std::string& value) { add_string(AttributeType::Application, value); } /// @param object_id DER-encoding of the object identifier indicating the data object type inline void set_object_id(const std::vector& object_id) { add_binary(AttributeType::ObjectId, object_id); } /// @param value value of the object inline void set_value(const secure_vector& value) { add_binary(AttributeType::Value, value); } }; /// Common attributes of all certificate objects class BOTAN_PUBLIC_API(2,0) CertificateProperties : public StorageObjectProperties { public: /// @param cert_type type of certificate CertificateProperties(CertificateType cert_type); /// @param value the certificate can be trusted for the application that it was created (can only be set to true by SO user) inline void set_trusted(bool value) { add_bool(AttributeType::Trusted, value); } /// @param category one of `CertificateCategory` inline void set_category(CertificateCategory category) { add_numeric(AttributeType::CertificateCategory, static_cast< CK_CERTIFICATE_CATEGORY >(category)); } /** * @param checksum the value of this attribute is derived from the certificate by taking the * first three bytes of the SHA - 1 hash of the certificate object's `CKA_VALUE` attribute */ inline void set_check_value(const std::vector& checksum) { add_binary(AttributeType::CheckValue, checksum); } /// @param date start date for the certificate inline void set_start_date(Date date) { add_binary(AttributeType::StartDate, reinterpret_cast(&date), sizeof(Date)); } /// @param date end date for the certificate inline void set_end_date(Date date) { add_binary(AttributeType::EndDate, reinterpret_cast(&date), sizeof(Date)); } /// @param pubkey_info DER-encoding of the SubjectPublicKeyInfo for the public key contained in this certificate inline void set_public_key_info(const std::vector& pubkey_info) { add_binary(AttributeType::PublicKeyInfo, pubkey_info); } /// @return the certificate type of this certificate object inline CertificateType cert_type() const { return m_cert_type; } private: const CertificateType m_cert_type; }; /// Common attributes of all key objects class BOTAN_PUBLIC_API(2,0) KeyProperties : public StorageObjectProperties { public: /** * @param object_class the `CK_OBJECT_CLASS` this key object belongs to * @param key_type type of key */ KeyProperties(ObjectClass object_class, KeyType key_type); /// @param id key identifier for key inline void set_id(const std::vector& id) { add_binary(AttributeType::Id, id); } /// @param date start date for the key inline void set_start_date(Date date) { add_binary(AttributeType::StartDate, reinterpret_cast(&date), sizeof(Date)); } /// @param date end date for the key inline void set_end_date(Date date) { add_binary(AttributeType::EndDate, reinterpret_cast(&date), sizeof(Date)); } /// @param value true if key supports key derivation (i.e., if other keys can be derived from this one) inline void set_derive(bool value) { add_bool(AttributeType::Derive, value); } /** * Sets a list of mechanisms allowed to be used with this key * Not implemented */ inline void set_allowed_mechanisms(const std::vector&) { throw Exception("Not implemented (KeyProperties::set_allowed_mechanisms)"); } /// @return the key type of this key object inline KeyType key_type() const { return m_key_type; } private: const KeyType m_key_type; }; /// Common attributes of all public key objects class BOTAN_PUBLIC_API(2,0) PublicKeyProperties : public KeyProperties { public: /// @param key_type type of key PublicKeyProperties(KeyType key_type); /// @param subject DER-encoding of the key subject name inline void set_subject(const std::vector& subject) { add_binary(AttributeType::Subject, subject); } /// @param value true if the key supports encryption inline void set_encrypt(bool value) { add_bool(AttributeType::Encrypt, value); } /// @param value true if the key supports verification where the signature is an appendix to the data inline void set_verify(bool value) { add_bool(AttributeType::Verify, value); } /// @param value true if the key supports verification where the data is recovered from the signature inline void set_verify_recover(bool value) { add_bool(AttributeType::VerifyRecover, value); } /// @param value true if the key supports wrapping (i.e., can be used to wrap other keys) inline void set_wrap(bool value) { add_bool(AttributeType::Wrap, value); } /** * @param value true if the key can be trusted for the application that it was created. * The wrapping key can be used to wrap keys with `CKA_WRAP_WITH_TRUSTED` set to `CK_TRUE` */ inline void set_trusted(bool value) { add_bool(AttributeType::Trusted, value); } /** * For wrapping keys * The attribute template to match against any keys wrapped using this wrapping key. * Keys that do not match cannot be wrapped * Not implemented */ inline void set_wrap_template(const AttributeContainer&) { throw Exception("Not implemented (PublicKeyProperties::set_wrap_template)"); } /// @param pubkey_info DER-encoding of the SubjectPublicKeyInfo for this public key inline void set_public_key_info(const std::vector& pubkey_info) { add_binary(AttributeType::PublicKeyInfo, pubkey_info); } }; /// Common attributes of all private keys class BOTAN_PUBLIC_API(2,0) PrivateKeyProperties : public KeyProperties { public: /// @param key_type type of key PrivateKeyProperties(KeyType key_type); /// @param subject DER-encoding of the key subject name inline void set_subject(const std::vector& subject) { add_binary(AttributeType::Subject, subject); } /// @param value true if the key is sensitive inline void set_sensitive(bool value) { add_bool(AttributeType::Sensitive, value); } /// @param value true if the key supports decryption inline void set_decrypt(bool value) { add_bool(AttributeType::Decrypt, value); } /// @param value true if the key supports signatures where the signature is an appendix to the data inline void set_sign(bool value) { add_bool(AttributeType::Sign, value); } /// @param value true if the key supports signatures where the data can be recovered from the signature inline void set_sign_recover(bool value) { add_bool(AttributeType::SignRecover, value); } /// @param value true if the key supports unwrapping (i.e., can be used to unwrap other keys) inline void set_unwrap(bool value) { add_bool(AttributeType::Unwrap, value); } /// @param value true if the key is extractable and can be wrapped inline void set_extractable(bool value) { add_bool(AttributeType::Extractable, value); } /// @param value true if the key can only be wrapped with a wrapping key that has `CKA_TRUSTED` set to `CK_TRUE` inline void set_wrap_with_trusted(bool value) { add_bool(AttributeType::WrapWithTrusted, value); } /// @param value If true, the user has to supply the PIN for each use (sign or decrypt) with the key inline void set_always_authenticate(bool value) { add_bool(AttributeType::AlwaysAuthenticate, value); } /** * For wrapping keys * The attribute template to apply to any keys unwrapped using this wrapping key. * Any user supplied template is applied after this template as if the object has already been created * Not implemented */ inline void set_unwrap_template(const AttributeContainer&) { throw Exception("Not implemented (PrivateKeyProperties::set_unwrap_template)"); } /// @param pubkey_info DER-encoding of the SubjectPublicKeyInfo for this public key inline void set_public_key_info(const std::vector& pubkey_info) { add_binary(AttributeType::PublicKeyInfo, pubkey_info); } }; /// Common attributes of all secret (symmetric) keys class BOTAN_PUBLIC_API(2,0) SecretKeyProperties final : public KeyProperties { public: /// @param key_type type of key SecretKeyProperties(KeyType key_type); /// @param value true if the key is sensitive inline void set_sensitive(bool value) { add_bool(AttributeType::Sensitive, value); } /// @param value true if the key supports encryption inline void set_encrypt(bool value) { add_bool(AttributeType::Encrypt, value); } /// @param value true if the key supports decryption inline void set_decrypt(bool value) { add_bool(AttributeType::Decrypt, value); } /// @param value true if the key supports signatures where the signature is an appendix to the data inline void set_sign(bool value) { add_bool(AttributeType::Sign, value); } /// @param value true if the key supports verification where the signature is an appendix to the data inline void set_verify(bool value) { add_bool(AttributeType::Verify, value); } /// @param value true if the key supports unwrapping (i.e., can be used to unwrap other keys) inline void set_unwrap(bool value) { add_bool(AttributeType::Unwrap, value); } /// @param value true if the key is extractable and can be wrapped inline void set_extractable(bool value) { add_bool(AttributeType::Extractable, value); } /// @param value true if the key can only be wrapped with a wrapping key that has `CKA_TRUSTED` set to `CK_TRUE` inline void set_wrap_with_trusted(bool value) { add_bool(AttributeType::WrapWithTrusted, value); } /// @param value if true, the user has to supply the PIN for each use (sign or decrypt) with the key inline void set_always_authenticate(bool value) { add_bool(AttributeType::AlwaysAuthenticate, value); } /// @param value true if the key supports wrapping (i.e., can be used to wrap other keys) inline void set_wrap(bool value) { add_bool(AttributeType::Wrap, value); } /** * @param value the key can be trusted for the application that it was created. * The wrapping key can be used to wrap keys with `CKA_WRAP_WITH_TRUSTED` set to `CK_TRUE` */ inline void set_trusted(bool value) { add_bool(AttributeType::Trusted, value); } /// @param checksum the key check value of this key inline void set_check_value(const std::vector& checksum) { add_binary(AttributeType::CheckValue, checksum); } /** * For wrapping keys * The attribute template to match against any keys wrapped using this wrapping key. * Keys that do not match cannot be wrapped * Not implemented */ inline void set_wrap_template(const AttributeContainer&) { throw Exception("Not implemented (SecretKeyProperties::set_wrap_template)"); } /** * For wrapping keys * The attribute template to apply to any keys unwrapped using this wrapping key * Any user supplied template is applied after this template as if the object has already been created * Not Implemented */ inline void set_unwrap_template(const AttributeContainer&) { throw Exception("Not implemented (SecretKeyProperties::set_unwrap_template)"); } }; /// Common attributes of domain parameter class BOTAN_PUBLIC_API(2,0) DomainParameterProperties final : public StorageObjectProperties { public: /// @param key_type type of key the domain parameters can be used to generate DomainParameterProperties(KeyType key_type); /// @return the key type inline KeyType key_type() const { return m_key_type; } private: const KeyType m_key_type; }; /** * Represents a PKCS#11 object. */ class BOTAN_PUBLIC_API(2,0) Object { public: /** * Creates an `Object` from an existing PKCS#11 object * @param session the session the object belongs to * @param handle handle of the object */ Object(Session& session, ObjectHandle handle); /** * Creates the object * @param session the session in which the object should be created * @param obj_props properties of this object */ Object(Session& session, const ObjectProperties& obj_props); Object(const Object&) = default; Object& operator=(const Object&) = default; virtual ~Object() = default; /// Searches for all objects of the given type that match `search_template` template static std::vector search(Session& session, const std::vector& search_template); /// Searches for all objects of the given type using the label (`CKA_LABEL`) template static std::vector search(Session& session, const std::string& label); /// Searches for all objects of the given type using the id (`CKA_ID`) template static std::vector search(Session& session, const std::vector& id); /// Searches for all objects of the given type using the label (`CKA_LABEL`) and id (`CKA_ID`) template static std::vector search(Session& session, const std::string& label, const std::vector& id); /// Searches for all objects of the given type template static std::vector search(Session& session); /// @returns the value of the given attribute (using `C_GetAttributeValue`) secure_vector get_attribute_value(AttributeType attribute) const; /// Sets the given value for the attribute (using `C_SetAttributeValue`) void set_attribute_value(AttributeType attribute, const secure_vector& value) const; /// Destroys the object void destroy() const; /** * Copies the object * @param modified_attributes the attributes of the copied object */ ObjectHandle copy(const AttributeContainer& modified_attributes) const; /// @return the handle of this object. inline ObjectHandle handle() const { return m_handle; } /// @return the session this objects belongs to inline Session& session() const { return m_session; } /// @return the module this object belongs to inline Module& module() const { return m_session.get().module(); } protected: Object(Session& session) : m_session(session) {} void reset_handle(ObjectHandle handle) { if(m_handle != CK_INVALID_HANDLE) throw Invalid_Argument("Cannot reset handle on already valid PKCS11 object"); m_handle = handle; } private: const std::reference_wrapper m_session; ObjectHandle m_handle = CK_INVALID_HANDLE; }; template std::vector Object::search(Session& session, const std::vector& search_template) { ObjectFinder finder(session, search_template); std::vector handles = finder.find(); std::vector result; result.reserve(handles.size()); for(const auto& handle : handles) { result.emplace_back(T(session, handle)); } return result; } template std::vector Object::search(Session& session, const std::string& label) { AttributeContainer search_template(T::Class); search_template.add_string(AttributeType::Label, label); return search(session, search_template.attributes()); } template std::vector Object::search(Session& session, const std::vector& id) { AttributeContainer search_template(T::Class); search_template.add_binary(AttributeType::Id, id); return search(session, search_template.attributes()); } template std::vector Object::search(Session& session, const std::string& label, const std::vector& id) { AttributeContainer search_template(T::Class); search_template.add_string(AttributeType::Label, label); search_template.add_binary(AttributeType::Id, id); return search(session, search_template.attributes()); } template std::vector Object::search(Session& session) { return search(session, AttributeContainer(T::Class).attributes()); } } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_randomgenerator.cpp000066400000000000000000000012111322470703100226130ustar00rootroot00000000000000/* * PKCS#11 Random Generator * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace PKCS11 { PKCS11_RNG::PKCS11_RNG(Session& session) : m_session(session) {} void PKCS11_RNG::randomize(uint8_t output[], std::size_t length) { module()->C_GenerateRandom(m_session.get().handle(), output, length); } void PKCS11_RNG::add_entropy(const uint8_t in[], std::size_t length) { module()->C_SeedRandom(m_session.get().handle(), const_cast(in), length); } } } botan-2.4.0/src/lib/prov/pkcs11/p11_randomgenerator.h000066400000000000000000000031231322470703100222640ustar00rootroot00000000000000/* * PKCS#11 Random Generator * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_RNG_H_ #define BOTAN_P11_RNG_H_ #include #include #include #include #include namespace Botan { namespace PKCS11 { class Module; /// A random generator that only fetches random from the PKCS#11 RNG class BOTAN_PUBLIC_API(2,0) PKCS11_RNG final : public Hardware_RNG { public: /// Initialize the RNG with the PKCS#11 session that provides access to the cryptoki functions explicit PKCS11_RNG(Session& session); std::string name() const override { return "PKCS11_RNG"; } /// Always returns true bool is_seeded() const override { return true; } /// No operation - always returns 0 size_t reseed(Entropy_Sources&, size_t, std::chrono::milliseconds) override { return 0; } /// @return the module used by this RNG inline Module& module() const { return m_session.get().module(); } /// Calls `C_GenerateRandom` to generate random data void randomize(uint8_t output[], std::size_t length) override; /// Calls `C_SeedRandom` to add entropy to the random generation function of the token/middleware void add_entropy(const uint8_t in[], std::size_t length) override; private: const std::reference_wrapper m_session; }; } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_rsa.cpp000066400000000000000000000333731322470703100202270ustar00rootroot00000000000000/* * PKCS#11 RSA * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_RSA) #include #include #include #include #include namespace Botan { namespace PKCS11 { RSA_PublicKeyImportProperties::RSA_PublicKeyImportProperties(const BigInt& modulus, const BigInt& pub_exponent) : PublicKeyProperties(KeyType::Rsa), m_modulus(modulus), m_pub_exponent(pub_exponent) { add_binary(AttributeType::Modulus, BigInt::encode(m_modulus)); add_binary(AttributeType::PublicExponent, BigInt::encode(m_pub_exponent)); } RSA_PublicKeyGenerationProperties::RSA_PublicKeyGenerationProperties(Ulong bits) : PublicKeyProperties(KeyType::Rsa) { add_numeric(AttributeType::ModulusBits, bits); } PKCS11_RSA_PublicKey::PKCS11_RSA_PublicKey(Session& session, ObjectHandle handle) : Object(session, handle) { m_n = BigInt::decode(get_attribute_value(AttributeType::Modulus)); m_e = BigInt::decode(get_attribute_value(AttributeType::PublicExponent)); } PKCS11_RSA_PublicKey::PKCS11_RSA_PublicKey(Session& session, const RSA_PublicKeyImportProperties& pubkey_props) : RSA_PublicKey(pubkey_props.modulus(), pubkey_props.pub_exponent()), Object(session, pubkey_props) {} RSA_PrivateKeyImportProperties::RSA_PrivateKeyImportProperties(const BigInt& modulus, const BigInt& priv_exponent) : PrivateKeyProperties(KeyType::Rsa), m_modulus(modulus), m_priv_exponent(priv_exponent) { add_binary(AttributeType::Modulus, BigInt::encode(m_modulus)); add_binary(AttributeType::PrivateExponent, BigInt::encode(m_priv_exponent)); } PKCS11_RSA_PrivateKey::PKCS11_RSA_PrivateKey(Session& session, ObjectHandle handle) : Object(session, handle) { m_n = BigInt::decode(get_attribute_value(AttributeType::Modulus)); m_e = BigInt::decode(get_attribute_value(AttributeType::PublicExponent)); } PKCS11_RSA_PrivateKey::PKCS11_RSA_PrivateKey(Session& session, const RSA_PrivateKeyImportProperties& priv_key_props) : Object(session, priv_key_props) { m_n = priv_key_props.modulus(); m_e = BigInt::decode(get_attribute_value(AttributeType::PublicExponent)); } PKCS11_RSA_PrivateKey::PKCS11_RSA_PrivateKey(Session& session, uint32_t bits, const RSA_PrivateKeyGenerationProperties& priv_key_props) : RSA_PublicKey(), Object(session) { RSA_PublicKeyGenerationProperties pub_key_props(bits); pub_key_props.set_encrypt(true); pub_key_props.set_verify(true); pub_key_props.set_token(false); // don't create a persistent public key object ObjectHandle pub_key_handle = CK_INVALID_HANDLE; ObjectHandle priv_key_handle = CK_INVALID_HANDLE; Mechanism mechanism = { static_cast< CK_MECHANISM_TYPE >(MechanismType::RsaPkcsKeyPairGen), nullptr, 0 }; session.module()->C_GenerateKeyPair(session.handle(), &mechanism, pub_key_props.data(), pub_key_props.count(), priv_key_props.data(), priv_key_props.count(), &pub_key_handle, &priv_key_handle); this->reset_handle(priv_key_handle); m_n = BigInt::decode(get_attribute_value(AttributeType::Modulus)); m_e = BigInt::decode(get_attribute_value(AttributeType::PublicExponent)); } RSA_PrivateKey PKCS11_RSA_PrivateKey::export_key() const { auto p = get_attribute_value(AttributeType::Prime1); auto q = get_attribute_value(AttributeType::Prime2); auto e = get_attribute_value(AttributeType::PublicExponent); auto d = get_attribute_value(AttributeType::PrivateExponent); auto n = get_attribute_value(AttributeType::Modulus); return RSA_PrivateKey( BigInt::decode(p) , BigInt::decode(q) , BigInt::decode(e) , BigInt::decode(d) , BigInt::decode(n)); } secure_vector PKCS11_RSA_PrivateKey::private_key_bits() const { return export_key().private_key_bits(); } namespace { // note: multiple-part decryption operations (with C_DecryptUpdate/C_DecryptFinal) // are not supported (PK_Ops::Decryption does not provide an `update` method) class PKCS11_RSA_Decryption_Operation final : public PK_Ops::Decryption { public: PKCS11_RSA_Decryption_Operation(const PKCS11_RSA_PrivateKey& key, const std::string& padding, RandomNumberGenerator& rng) : m_key(key), m_mechanism(MechanismWrapper::create_rsa_crypt_mechanism(padding)), m_powermod(m_key.get_e(), m_key.get_n()), m_blinder(m_key.get_n(), rng, [ this ](const BigInt& k) { return m_powermod(k); }, [ this ](const BigInt& k) { return inverse_mod(k, m_key.get_n()); }) { m_bits = m_key.get_n().bits() - 1; } secure_vector decrypt(uint8_t& valid_mask, const uint8_t ciphertext[], size_t ciphertext_len) override { valid_mask = 0; m_key.module()->C_DecryptInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); std::vector encrypted_data(ciphertext, ciphertext + ciphertext_len); // blind for RSA/RAW decryption if(! m_mechanism.padding_size()) { encrypted_data = BigInt::encode(m_blinder.blind(BigInt::decode(encrypted_data))); } secure_vector decrypted_data; m_key.module()->C_Decrypt(m_key.session().handle(), encrypted_data, decrypted_data); // Unblind for RSA/RAW decryption if(!m_mechanism.padding_size()) { decrypted_data = BigInt::encode_1363(m_blinder.unblind(BigInt::decode(decrypted_data)), m_key.get_n().bits() / 8 ); } valid_mask = 0xFF; return decrypted_data; } private: const PKCS11_RSA_PrivateKey& m_key; MechanismWrapper m_mechanism; size_t m_bits = 0; Fixed_Exponent_Power_Mod m_powermod; Blinder m_blinder; }; // note: multiple-part encryption operations (with C_EncryptUpdate/C_EncryptFinal) // are not supported (PK_Ops::Encryption does not provide an `update` method) class PKCS11_RSA_Encryption_Operation final : public PK_Ops::Encryption { public: PKCS11_RSA_Encryption_Operation(const PKCS11_RSA_PublicKey& key, const std::string& padding) : m_key(key), m_mechanism(MechanismWrapper::create_rsa_crypt_mechanism(padding)) { m_bits = 8 * (key.get_n().bytes() - m_mechanism.padding_size()) - 1; } size_t max_input_bits() const override { return m_bits; } secure_vector encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator&) override { m_key.module()->C_EncryptInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); secure_vector encrytped_data; m_key.module()->C_Encrypt(m_key.session().handle(), secure_vector(msg, msg + msg_len), encrytped_data); return encrytped_data; } private: const PKCS11_RSA_PublicKey& m_key; MechanismWrapper m_mechanism; size_t m_bits = 0; }; class PKCS11_RSA_Signature_Operation final : public PK_Ops::Signature { public: PKCS11_RSA_Signature_Operation(const PKCS11_RSA_PrivateKey& key, const std::string& padding) : m_key(key), m_mechanism(MechanismWrapper::create_rsa_sign_mechanism(padding)) {} void update(const uint8_t msg[], size_t msg_len) override { if(!m_initialized) { // first call to update: initialize and cache message because we can not determine yet whether a single- or multiple-part operation will be performed m_key.module()->C_SignInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); m_initialized = true; m_first_message = secure_vector(msg, msg + msg_len); return; } if(!m_first_message.empty()) { // second call to update: start multiple-part operation m_key.module()->C_SignUpdate(m_key.session().handle(), m_first_message); m_first_message.clear(); } m_key.module()->C_SignUpdate(m_key.session().handle(), const_cast< Byte* >(msg), msg_len); } secure_vector sign(RandomNumberGenerator&) override { secure_vector signature; if(!m_first_message.empty()) { // single call to update: perform single-part operation m_key.module()->C_Sign(m_key.session().handle(), m_first_message, signature); m_first_message.clear(); } else { // multiple calls to update (or none): finish multiple-part operation m_key.module()->C_SignFinal(m_key.session().handle(), signature); } m_initialized = false; return signature; } private: const PKCS11_RSA_PrivateKey& m_key; bool m_initialized = false; secure_vector m_first_message; MechanismWrapper m_mechanism; }; class PKCS11_RSA_Verification_Operation final : public PK_Ops::Verification { public: PKCS11_RSA_Verification_Operation(const PKCS11_RSA_PublicKey& key, const std::string& padding) : m_key(key), m_mechanism(MechanismWrapper::create_rsa_sign_mechanism(padding)) {} void update(const uint8_t msg[], size_t msg_len) override { if(!m_initialized) { // first call to update: initialize and cache message because we can not determine yet whether a single- or multiple-part operation will be performed m_key.module()->C_VerifyInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); m_initialized = true; m_first_message = secure_vector(msg, msg + msg_len); return; } if(!m_first_message.empty()) { // second call to update: start multiple-part operation m_key.module()->C_VerifyUpdate(m_key.session().handle(), m_first_message); m_first_message.clear(); } m_key.module()->C_VerifyUpdate(m_key.session().handle(), const_cast< Byte* >(msg), msg_len); } bool is_valid_signature(const uint8_t sig[], size_t sig_len) override { ReturnValue return_value = ReturnValue::SignatureInvalid; if(!m_first_message.empty()) { // single call to update: perform single-part operation m_key.module()->C_Verify(m_key.session().handle(), m_first_message.data(), m_first_message.size(), const_cast< Byte* >(sig), sig_len, &return_value); m_first_message.clear(); } else { // multiple calls to update (or none): finish multiple-part operation m_key.module()->C_VerifyFinal(m_key.session().handle(), const_cast< Byte* >(sig), sig_len, &return_value); } m_initialized = false; if(return_value != ReturnValue::OK && return_value != ReturnValue::SignatureInvalid) { throw PKCS11_ReturnError(return_value); } return return_value == ReturnValue::OK; } private: const PKCS11_RSA_PublicKey& m_key; bool m_initialized = false; secure_vector m_first_message; MechanismWrapper m_mechanism; }; } std::unique_ptr PKCS11_RSA_PublicKey::create_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_RSA_Encryption_Operation(*this, params)); } std::unique_ptr PKCS11_RSA_PublicKey::create_verification_op(const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_RSA_Verification_Operation(*this, params)); } std::unique_ptr PKCS11_RSA_PrivateKey::create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_RSA_Decryption_Operation(*this, params, rng)); } std::unique_ptr PKCS11_RSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new PKCS11_RSA_Signature_Operation(*this, params)); } PKCS11_RSA_KeyPair generate_rsa_keypair(Session& session, const RSA_PublicKeyGenerationProperties& pub_props, const RSA_PrivateKeyGenerationProperties& priv_props) { ObjectHandle pub_key_handle = 0; ObjectHandle priv_key_handle = 0; Mechanism mechanism = { static_cast< CK_MECHANISM_TYPE >(MechanismType::RsaPkcsKeyPairGen), nullptr, 0 }; session.module()->C_GenerateKeyPair(session.handle(), &mechanism, pub_props.data(), pub_props.count(), priv_props.data(), priv_props.count(), &pub_key_handle, &priv_key_handle); return std::make_pair(PKCS11_RSA_PublicKey(session, pub_key_handle), PKCS11_RSA_PrivateKey(session, priv_key_handle)); } } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_rsa.h000066400000000000000000000162371322470703100176740ustar00rootroot00000000000000/* * PKCS#11 RSA * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_RSA_H_ #define BOTAN_P11_RSA_H_ #include #include #if defined(BOTAN_HAS_RSA) #include #include namespace Botan { namespace PKCS11 { /// Properties for generating a PKCS#11 RSA public key class BOTAN_PUBLIC_API(2,0) RSA_PublicKeyGenerationProperties final : public PublicKeyProperties { public: /// @param bits length in bits of modulus n explicit RSA_PublicKeyGenerationProperties(Ulong bits); /// @param pub_exponent public exponent e inline void set_pub_exponent(const BigInt& pub_exponent = BigInt(0x10001)) { add_binary(AttributeType::PublicExponent, BigInt::encode(pub_exponent)); } virtual ~RSA_PublicKeyGenerationProperties() = default; }; /// Properties for importing a PKCS#11 RSA public key class BOTAN_PUBLIC_API(2,0) RSA_PublicKeyImportProperties final : public PublicKeyProperties { public: /// @param modulus modulus n /// @param pub_exponent public exponent e RSA_PublicKeyImportProperties(const BigInt& modulus, const BigInt& pub_exponent); /// @return the modulus inline const BigInt& modulus() const { return m_modulus; } /// @return the public exponent inline const BigInt& pub_exponent() const { return m_pub_exponent; } virtual ~RSA_PublicKeyImportProperties() = default; private: const BigInt m_modulus; const BigInt m_pub_exponent; }; /// Represents a PKCS#11 RSA public key class BOTAN_PUBLIC_API(2,0) PKCS11_RSA_PublicKey : public RSA_PublicKey, public Object { public: static const ObjectClass Class = ObjectClass::PublicKey; /** * Creates a PKCS11_RSA_PublicKey object from an existing PKCS#11 RSA public key * @param session the session to use * @param handle the handle of the RSA public key */ PKCS11_RSA_PublicKey(Session& session, ObjectHandle handle); /** * Imports a RSA public key * @param session the session to use * @param pubkey_props the attributes of the public key */ PKCS11_RSA_PublicKey(Session& session, const RSA_PublicKeyImportProperties& pubkey_props); std::unique_ptr create_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; }; /// Properties for importing a PKCS#11 RSA private key class BOTAN_PUBLIC_API(2,0) RSA_PrivateKeyImportProperties final : public PrivateKeyProperties { public: /** * @param modulus modulus n * @param priv_exponent private exponent d */ RSA_PrivateKeyImportProperties(const BigInt& modulus, const BigInt& priv_exponent); /// @param pub_exponent public exponent e inline void set_pub_exponent(const BigInt& pub_exponent) { add_binary(AttributeType::PublicExponent, BigInt::encode(pub_exponent)); } /// @param prime1 prime p inline void set_prime_1(const BigInt& prime1) { add_binary(AttributeType::Prime1, BigInt::encode(prime1)); } /// @param prime2 prime q inline void set_prime_2(const BigInt& prime2) { add_binary(AttributeType::Prime2, BigInt::encode(prime2)); } /// @param exp1 private exponent d modulo p-1 inline void set_exponent_1(const BigInt& exp1) { add_binary(AttributeType::Exponent1, BigInt::encode(exp1)); } /// @param exp2 private exponent d modulo q-1 inline void set_exponent_2(const BigInt& exp2) { add_binary(AttributeType::Exponent2, BigInt::encode(exp2)); } /// @param coeff CRT coefficient q^-1 mod p inline void set_coefficient(const BigInt& coeff) { add_binary(AttributeType::Coefficient, BigInt::encode(coeff)); } /// @return the modulus inline const BigInt& modulus() const { return m_modulus; } /// @return the private exponent inline const BigInt& priv_exponent() const { return m_priv_exponent; } virtual ~RSA_PrivateKeyImportProperties() = default; private: const BigInt m_modulus; const BigInt m_priv_exponent; }; /// Properties for generating a PKCS#11 RSA private key class BOTAN_PUBLIC_API(2,0) RSA_PrivateKeyGenerationProperties final : public PrivateKeyProperties { public: RSA_PrivateKeyGenerationProperties() : PrivateKeyProperties(KeyType::Rsa) {} virtual ~RSA_PrivateKeyGenerationProperties() = default; }; /// Represents a PKCS#11 RSA private key class BOTAN_PUBLIC_API(2,0) PKCS11_RSA_PrivateKey final : public Private_Key, public RSA_PublicKey, public Object { public: static const ObjectClass Class = ObjectClass::PrivateKey; /// Creates a PKCS11_RSA_PrivateKey object from an existing PKCS#11 RSA private key PKCS11_RSA_PrivateKey(Session& session, ObjectHandle handle); /** * Imports a RSA private key * @param session the session to use * @param priv_key_props the properties of the RSA private key */ PKCS11_RSA_PrivateKey(Session& session, const RSA_PrivateKeyImportProperties& priv_key_props); /** * Generates a PKCS#11 RSA private key * @param session the session to use * @param bits length in bits of modulus n * @param priv_key_props the properties of the RSA private key * @note no persistent public key object will be created */ PKCS11_RSA_PrivateKey(Session& session, uint32_t bits, const RSA_PrivateKeyGenerationProperties& priv_key_props); /// @return the exported RSA private key RSA_PrivateKey export_key() const; secure_vector private_key_bits() const override; std::unique_ptr create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; using PKCS11_RSA_KeyPair = std::pair; /** * RSA key pair generation * @param session the session that should be used for the key generation * @param pub_props properties of the public key * @param priv_props properties of the private key */ BOTAN_PUBLIC_API(2,0) PKCS11_RSA_KeyPair generate_rsa_keypair(Session& session, const RSA_PublicKeyGenerationProperties& pub_props, const RSA_PrivateKeyGenerationProperties& priv_props); } } #endif #endif botan-2.4.0/src/lib/prov/pkcs11/p11_session.cpp000066400000000000000000000041701322470703100211160ustar00rootroot00000000000000/* * PKCS#11 Session * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace PKCS11 { Session::Session(Slot& slot, bool read_only) : Session(slot, PKCS11::flags(Flag::SerialSession | (read_only ? Flag::None : Flag::RwSession)), nullptr, nullptr) {} Session::Session(Slot& slot, Flags flags, VoidPtr callback_data, Notify notify_callback) : m_slot(slot), m_handle(0), m_logged_in(false) { module()->C_OpenSession(m_slot.slot_id(), flags, callback_data, notify_callback, &m_handle); } Session::Session(Slot& slot, SessionHandle handle) : m_slot(slot), m_handle(handle) { SessionInfo info = get_info(); if(info.state == static_cast(SessionState::RoPublicSession) || info.state == static_cast(SessionState::RwPublicSession)) { m_logged_in = false; } else { m_logged_in = true; } } Session::~Session() BOTAN_NOEXCEPT { try { if(m_handle) { if(m_logged_in) { module()->C_Logout(m_handle, nullptr); } module()->C_CloseSession(m_handle, nullptr); m_handle = 0; } } catch(...) { // exception during noexcept destructor is ignored } } SessionHandle Session::release() { SessionHandle handle = 0; std::swap(handle, m_handle); return handle; } void Session::login(UserType user_type, const secure_string& pin) { module()->C_Login(m_handle, user_type, pin); m_logged_in = true; } void Session::logoff() { module()->C_Logout(m_handle); m_logged_in = false; } SessionInfo Session::get_info() const { SessionInfo info; module()->C_GetSessionInfo(m_handle, &info); return info; } void Session::set_pin(const secure_string& old_pin, const secure_string& new_pin) const { module()->C_SetPIN(m_handle, old_pin, new_pin); } void Session::init_pin(const secure_string& new_pin) { module()->C_InitPIN(m_handle, new_pin); } } } botan-2.4.0/src/lib/prov/pkcs11/p11_session.h000066400000000000000000000057441322470703100205730ustar00rootroot00000000000000/* * PKCS#11 Session * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_SESSION_H_ #define BOTAN_P11_SESSION_H_ #include #include namespace Botan { namespace PKCS11 { class Module; /// Represents a PKCS#11 session class BOTAN_PUBLIC_API(2,0) Session final { public: /** * @param slot the slot to use * @param read_only true if the session should be read only, false to create a read-write session */ Session(Slot& slot, bool read_only); /** * @param slot the slot to use * @param flags the flags to use for the session. Remark: Flag::SerialSession is mandatory * @param callback_data application-defined pointer to be passed to the notification callback * @param notify_callback address of the notification callback function */ Session(Slot& slot, Flags flags, VoidPtr callback_data, Notify notify_callback); /// Takes ownership of a session Session(Slot& slot, SessionHandle handle); /* Microsoft Visual Studio <= 2013 does not support default generated move special member functions. Everything else we target should support it */ #if !defined( _MSC_VER ) || ( _MSC_VER >= 1900 ) Session(Session&& other) = default; Session& operator=(Session&& other) = default; #endif // Dtor calls C_CloseSession() and eventually C_Logout. A copy could close the session while the origin still exists Session(const Session& other) = delete; Session& operator=(const Session& other) = delete; /// Logout user and close the session on destruction ~Session() BOTAN_NOEXCEPT; /// @return a reference to the slot inline const Slot& slot() const { return m_slot; } /// @return the session handle of this session inline SessionHandle handle() const { return m_handle; } /// @return a reference to the used module inline Module& module() const { return m_slot.module(); } /// @return the released session handle SessionHandle release(); /** * Login to this session * @param userType the user type to use for the login * @param pin the PIN of the user */ void login(UserType userType, const secure_string& pin); /// Logout from this session void logoff(); /// @return information about this session SessionInfo get_info() const; /// Calls `C_SetPIN` to change the PIN using the old PIN (requires a logged in session) void set_pin(const secure_string& old_pin, const secure_string& new_pin) const; /// Calls `C_InitPIN` to change or initialize the PIN using the SO_PIN (requires a logged in session) void init_pin(const secure_string& new_pin); private: const Slot& m_slot; SessionHandle m_handle; bool m_logged_in; }; } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_slot.cpp000066400000000000000000000026261322470703100204200ustar00rootroot00000000000000/* * PKCS#11 Slot * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace PKCS11 { Slot::Slot(Module& module, SlotId slot_id) : m_module(module), m_slot_id(slot_id) {} SlotInfo Slot::get_slot_info() const { SlotInfo slot_info = {}; m_module.get()->C_GetSlotInfo(m_slot_id, &slot_info); return slot_info; } std::vector Slot::get_mechanism_list() const { std::vector mechanism_list; m_module.get()->C_GetMechanismList(m_slot_id, mechanism_list); return mechanism_list; } MechanismInfo Slot::get_mechanism_info(MechanismType mechanism_type) const { MechanismInfo mechanism_info = {}; m_module.get()->C_GetMechanismInfo(m_slot_id, mechanism_type, &mechanism_info); return mechanism_info; } std::vector Slot::get_available_slots(Module& module, bool token_present) { std::vector slot_vec; module->C_GetSlotList(token_present, slot_vec); return slot_vec; } TokenInfo Slot::get_token_info() const { TokenInfo token_info; m_module.get()->C_GetTokenInfo(m_slot_id, &token_info); return token_info; } void Slot::initialize(const std::string& label, const secure_string& so_pin) const { m_module.get()->C_InitToken(m_slot_id, so_pin, label); } } } botan-2.4.0/src/lib/prov/pkcs11/p11_slot.h000066400000000000000000000042041322470703100200570ustar00rootroot00000000000000/* * PKCS#11 Slot * (C) 2016 Daniel Neus * (C) 2016 Philipp Weber * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_SLOT_H_ #define BOTAN_P11_SLOT_H_ #include #include #include #include namespace Botan { namespace PKCS11 { /// Represents a PKCS#11 Slot, i.e., a card reader class BOTAN_PUBLIC_API(2,0) Slot final { public: /** * @param module the PKCS#11 module to use * @param slot_id the slot id to use */ Slot(Module& module, SlotId slot_id); /// @return a reference to the module that is used inline Module& module() const { return m_module; } /// @return the slot id inline SlotId slot_id() const { return m_slot_id; } /** * Get available slots * @param module the module to use * @param token_present true if only slots with attached tokens should be returned, false for all slots * @return a list of available slots (calls C_GetSlotList) */ static std::vector get_available_slots(Module& module, bool token_present); /// @return information about the slot (`C_GetSlotInfo`) SlotInfo get_slot_info() const; /// Obtains a list of mechanism types supported by the slot (`C_GetMechanismList`) std::vector get_mechanism_list() const; /// Obtains information about a particular mechanism possibly supported by a slot (`C_GetMechanismInfo`) MechanismInfo get_mechanism_info(MechanismType mechanism_type) const; /// Obtains information about a particular token in the system (`C_GetTokenInfo`) TokenInfo get_token_info() const; /** * Calls `C_InitToken` to initialize the token * @param label the label for the token (must not exceed 32 bytes according to PKCS#11) * @param so_pin the PIN of the security officer */ void initialize(const std::string& label, const secure_string& so_pin) const; private: const std::reference_wrapper m_module; const SlotId m_slot_id; }; } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_x509.cpp000066400000000000000000000017311322470703100201400ustar00rootroot00000000000000/* * PKCS#11 X.509 * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_HAS_X509_CERTIFICATES) namespace Botan { namespace PKCS11 { X509_CertificateProperties::X509_CertificateProperties(const std::vector& subject, const std::vector& value) : CertificateProperties(CertificateType::X509), m_subject(subject), m_value(value) { add_binary(AttributeType::Subject, m_subject); add_binary(AttributeType::Value, m_value); } PKCS11_X509_Certificate::PKCS11_X509_Certificate(Session& session, ObjectHandle handle) : Object(session, handle), X509_Certificate(unlock(get_attribute_value(AttributeType::Value))) { } PKCS11_X509_Certificate::PKCS11_X509_Certificate(Session& session, const X509_CertificateProperties& props) : Object(session, props), X509_Certificate(props.value()) { } } } #endif botan-2.4.0/src/lib/prov/pkcs11/p11_x509.h000066400000000000000000000063611322470703100176110ustar00rootroot00000000000000/* * PKCS#11 X.509 * (C) 2016 Daniel Neus, Sirrix AG * (C) 2016 Philipp Weber, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_P11_X509_H_ #define BOTAN_P11_X509_H_ #include #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #include namespace Botan { namespace PKCS11 { class Session; /// Common attributes of all PKCS#11 X509 certificates class BOTAN_PUBLIC_API(2,0) X509_CertificateProperties final : public CertificateProperties { public: /** * @param subject DER-encoding of the certificate subject name * @param value BER-encoding of the certificate */ X509_CertificateProperties(const std::vector& subject, const std::vector& value); /// @param id key identifier for public/private key pair inline void set_id(const std::vector& id) { add_binary(AttributeType::Id, id); } /// @param issuer DER-encoding of the certificate issuer name inline void set_issuer(const std::vector& issuer) { add_binary(AttributeType::Issuer, issuer); } /// @param serial DER-encoding of the certificate serial number inline void set_serial(const std::vector& serial) { add_binary(AttributeType::SerialNumber, serial); } /// @param hash hash value of the subject public key inline void set_subject_pubkey_hash(const std::vector& hash) { add_binary(AttributeType::HashOfSubjectPublicKey, hash); } /// @param hash hash value of the issuer public key inline void set_issuer_pubkey_hash(const std::vector& hash) { add_binary(AttributeType::HashOfIssuerPublicKey, hash); } /// @param alg defines the mechanism used to calculate `CKA_HASH_OF_SUBJECT_PUBLIC_KEY` and `CKA_HASH_OF_ISSUER_PUBLIC_KEY` inline void set_hash_alg(MechanismType alg) { add_numeric(AttributeType::NameHashAlgorithm, static_cast(alg)); } /// @return the subject inline const std::vector& subject() const { return m_subject; } /// @return the BER-encoding of the certificate inline const std::vector& value() const { return m_value; } private: const std::vector m_subject; const std::vector m_value; }; /// Represents a PKCS#11 X509 certificate class BOTAN_PUBLIC_API(2,0) PKCS11_X509_Certificate final : public Object, public X509_Certificate { public: static const ObjectClass Class = ObjectClass::Certificate; /** * Create a PKCS11_X509_Certificate object from an existing PKCS#11 X509 cert * @param session the session to use * @param handle the handle of the X.509 certificate */ PKCS11_X509_Certificate(Session& session, ObjectHandle handle); /** * Imports a X.509 certificate * @param session the session to use * @param props the attributes of the X.509 certificate */ PKCS11_X509_Certificate(Session& session, const X509_CertificateProperties& props); }; } } #endif #endif botan-2.4.0/src/lib/prov/pkcs11/pkcs11.h000066400000000000000000000175301322470703100175250ustar00rootroot00000000000000/* * PKCS #11 Cryptographic Token Interface Base Specification Version 2.40 Errata 01 * Committee Specification Draft 01 / Public Review Draft 01 * 09 December 2015 * Copyright (c) OASIS Open 2015. All Rights Reserved. * Source: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/errata01/csprd01/include/pkcs11-v2.40/ * Latest version of the specification: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.html * https://www.oasis-open.org/policies-guidelines/ipr */ #ifndef _PKCS11_H_ #define _PKCS11_H_ 1 #ifdef __cplusplus extern "C" { #endif /* Before including this file (pkcs11.h) (or pkcs11t.h by * itself), 5 platform-specific macros must be defined. These * macros are described below, and typical definitions for them * are also given. Be advised that these definitions can depend * on both the platform and the compiler used (and possibly also * on whether a Cryptoki library is linked statically or * dynamically). * * In addition to defining these 5 macros, the packing convention * for Cryptoki structures should be set. The Cryptoki * convention on packing is that structures should be 1-byte * aligned. * * If you're using Microsoft Developer Studio 5.0 to produce * Win32 stuff, this might be done by using the following * preprocessor directive before including pkcs11.h or pkcs11t.h: * * #pragma pack(push, cryptoki, 1) * * and using the following preprocessor directive after including * pkcs11.h or pkcs11t.h: * * #pragma pack(pop, cryptoki) * * If you're using an earlier version of Microsoft Developer * Studio to produce Win16 stuff, this might be done by using * the following preprocessor directive before including * pkcs11.h or pkcs11t.h: * * #pragma pack(1) * * In a UNIX environment, you're on your own for this. You might * not need to do (or be able to do!) anything. * * * Now for the macros: * * * 1. CK_PTR: The indirection string for making a pointer to an * object. It can be used like this: * * typedef CK_BYTE CK_PTR CK_BYTE_PTR; * * If you're using Microsoft Developer Studio 5.0 to produce * Win32 stuff, it might be defined by: * * #define CK_PTR * * * If you're using an earlier version of Microsoft Developer * Studio to produce Win16 stuff, it might be defined by: * * #define CK_PTR far * * * In a typical UNIX environment, it might be defined by: * * #define CK_PTR * * * * 2. CK_DECLARE_FUNCTION(returnType, name): A macro which makes * an importable Cryptoki library function declaration out of a * return type and a function name. It should be used in the * following fashion: * * extern CK_DECLARE_FUNCTION(CK_RV, C_Initialize)( * CK_VOID_PTR pReserved * ); * * If you're using Microsoft Developer Studio 5.0 to declare a * function in a Win32 Cryptoki .dll, it might be defined by: * * #define CK_DECLARE_FUNCTION(returnType, name) \ * returnType __declspec(dllimport) name * * If you're using an earlier version of Microsoft Developer * Studio to declare a function in a Win16 Cryptoki .dll, it * might be defined by: * * #define CK_DECLARE_FUNCTION(returnType, name) \ * returnType __export _far _pascal name * * In a UNIX environment, it might be defined by: * * #define CK_DECLARE_FUNCTION(returnType, name) \ * returnType name * * * 3. CK_DECLARE_FUNCTION_POINTER(returnType, name): A macro * which makes a Cryptoki API function pointer declaration or * function pointer type declaration out of a return type and a * function name. It should be used in the following fashion: * * // Define funcPtr to be a pointer to a Cryptoki API function * // taking arguments args and returning CK_RV. * CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtr)(args); * * or * * // Define funcPtrType to be the type of a pointer to a * // Cryptoki API function taking arguments args and returning * // CK_RV, and then define funcPtr to be a variable of type * // funcPtrType. * typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, funcPtrType)(args); * funcPtrType funcPtr; * * If you're using Microsoft Developer Studio 5.0 to access * functions in a Win32 Cryptoki .dll, in might be defined by: * * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ * returnType __declspec(dllimport) (* name) * * If you're using an earlier version of Microsoft Developer * Studio to access functions in a Win16 Cryptoki .dll, it might * be defined by: * * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ * returnType __export _far _pascal (* name) * * In a UNIX environment, it might be defined by: * * #define CK_DECLARE_FUNCTION_POINTER(returnType, name) \ * returnType (* name) * * * 4. CK_CALLBACK_FUNCTION(returnType, name): A macro which makes * a function pointer type for an application callback out of * a return type for the callback and a name for the callback. * It should be used in the following fashion: * * CK_CALLBACK_FUNCTION(CK_RV, myCallback)(args); * * to declare a function pointer, myCallback, to a callback * which takes arguments args and returns a CK_RV. It can also * be used like this: * * typedef CK_CALLBACK_FUNCTION(CK_RV, myCallbackType)(args); * myCallbackType myCallback; * * If you're using Microsoft Developer Studio 5.0 to do Win32 * Cryptoki development, it might be defined by: * * #define CK_CALLBACK_FUNCTION(returnType, name) \ * returnType (* name) * * If you're using an earlier version of Microsoft Developer * Studio to do Win16 development, it might be defined by: * * #define CK_CALLBACK_FUNCTION(returnType, name) \ * returnType _far _pascal (* name) * * In a UNIX environment, it might be defined by: * * #define CK_CALLBACK_FUNCTION(returnType, name) \ * returnType (* name) * * * 5. NULL_PTR: This macro is the value of a NULL pointer. * * In any ANSI/ISO C environment (and in many others as well), * this should best be defined by * * #ifndef NULL_PTR * #define NULL_PTR 0 * #endif */ /* All the various Cryptoki types and #define'd values are in the * file pkcs11t.h. */ #include "pkcs11t.h" #define __PASTE(x,y) x##y /* ============================================================== * Define the "extern" form of all the entry points. * ============================================================== */ #define CK_NEED_ARG_LIST 1 #define CK_PKCS11_FUNCTION_INFO(name) \ extern CK_DECLARE_FUNCTION(CK_RV, name) /* pkcs11f.h has all the information about the Cryptoki * function prototypes. */ #include "pkcs11f.h" #undef CK_NEED_ARG_LIST #undef CK_PKCS11_FUNCTION_INFO /* ============================================================== * Define the typedef form of all the entry points. That is, for * each Cryptoki function C_XXX, define a type CK_C_XXX which is * a pointer to that kind of function. * ============================================================== */ #define CK_NEED_ARG_LIST 1 #define CK_PKCS11_FUNCTION_INFO(name) \ typedef CK_DECLARE_FUNCTION_POINTER(CK_RV, __PASTE(CK_,name)) /* pkcs11f.h has all the information about the Cryptoki * function prototypes. */ #include "pkcs11f.h" #undef CK_NEED_ARG_LIST #undef CK_PKCS11_FUNCTION_INFO /* ============================================================== * Define structed vector of entry points. A CK_FUNCTION_LIST * contains a CK_VERSION indicating a library's Cryptoki version * and then a whole slew of function pointers to the routines in * the library. This type was declared, but not defined, in * pkcs11t.h. * ============================================================== */ #define CK_PKCS11_FUNCTION_INFO(name) \ __PASTE(CK_,name) name; struct CK_FUNCTION_LIST { CK_VERSION version; /* Cryptoki version */ /* Pile all the function pointers into the CK_FUNCTION_LIST. */ /* pkcs11f.h has all the information about the Cryptoki * function prototypes. */ #include "pkcs11f.h" }; #undef CK_PKCS11_FUNCTION_INFO #undef __PASTE #ifdef __cplusplus } #endif #endif /* _PKCS11_H_ */ botan-2.4.0/src/lib/prov/pkcs11/pkcs11f.h000066400000000000000000000653371322470703100177030ustar00rootroot00000000000000/* * PKCS #11 Cryptographic Token Interface Base Specification Version 2.40 Errata 01 * Committee Specification Draft 01 / Public Review Draft 01 * 09 December 2015 * Copyright (c) OASIS Open 2015. All Rights Reserved. * Source: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/errata01/csprd01/include/pkcs11-v2.40/ * Latest version of the specification: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.html * https://www.oasis-open.org/policies-guidelines/ipr */ /* This header file contains pretty much everything about all the * Cryptoki function prototypes. Because this information is * used for more than just declaring function prototypes, the * order of the functions appearing herein is important, and * should not be altered. */ /* General-purpose */ /* C_Initialize initializes the Cryptoki library. */ CK_PKCS11_FUNCTION_INFO(C_Initialize) #ifdef CK_NEED_ARG_LIST ( CK_VOID_PTR pInitArgs /* if this is not NULL_PTR, it gets * cast to CK_C_INITIALIZE_ARGS_PTR * and dereferenced */ ); #endif /* C_Finalize indicates that an application is done with the * Cryptoki library. */ CK_PKCS11_FUNCTION_INFO(C_Finalize) #ifdef CK_NEED_ARG_LIST ( CK_VOID_PTR pReserved /* reserved. Should be NULL_PTR */ ); #endif /* C_GetInfo returns general information about Cryptoki. */ CK_PKCS11_FUNCTION_INFO(C_GetInfo) #ifdef CK_NEED_ARG_LIST ( CK_INFO_PTR pInfo /* location that receives information */ ); #endif /* C_GetFunctionList returns the function list. */ CK_PKCS11_FUNCTION_INFO(C_GetFunctionList) #ifdef CK_NEED_ARG_LIST ( CK_FUNCTION_LIST_PTR_PTR ppFunctionList /* receives pointer to * function list */ ); #endif /* Slot and token management */ /* C_GetSlotList obtains a list of slots in the system. */ CK_PKCS11_FUNCTION_INFO(C_GetSlotList) #ifdef CK_NEED_ARG_LIST ( CK_BBOOL tokenPresent, /* only slots with tokens */ CK_SLOT_ID_PTR pSlotList, /* receives array of slot IDs */ CK_ULONG_PTR pulCount /* receives number of slots */ ); #endif /* C_GetSlotInfo obtains information about a particular slot in * the system. */ CK_PKCS11_FUNCTION_INFO(C_GetSlotInfo) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID, /* the ID of the slot */ CK_SLOT_INFO_PTR pInfo /* receives the slot information */ ); #endif /* C_GetTokenInfo obtains information about a particular token * in the system. */ CK_PKCS11_FUNCTION_INFO(C_GetTokenInfo) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID, /* ID of the token's slot */ CK_TOKEN_INFO_PTR pInfo /* receives the token information */ ); #endif /* C_GetMechanismList obtains a list of mechanism types * supported by a token. */ CK_PKCS11_FUNCTION_INFO(C_GetMechanismList) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID, /* ID of token's slot */ CK_MECHANISM_TYPE_PTR pMechanismList, /* gets mech. array */ CK_ULONG_PTR pulCount /* gets # of mechs. */ ); #endif /* C_GetMechanismInfo obtains information about a particular * mechanism possibly supported by a token. */ CK_PKCS11_FUNCTION_INFO(C_GetMechanismInfo) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID, /* ID of the token's slot */ CK_MECHANISM_TYPE type, /* type of mechanism */ CK_MECHANISM_INFO_PTR pInfo /* receives mechanism info */ ); #endif /* C_InitToken initializes a token. */ CK_PKCS11_FUNCTION_INFO(C_InitToken) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID, /* ID of the token's slot */ CK_UTF8CHAR_PTR pPin, /* the SO's initial PIN */ CK_ULONG ulPinLen, /* length in bytes of the PIN */ CK_UTF8CHAR_PTR pLabel /* 32-byte token label (blank padded) */ ); #endif /* C_InitPIN initializes the normal user's PIN. */ CK_PKCS11_FUNCTION_INFO(C_InitPIN) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_UTF8CHAR_PTR pPin, /* the normal user's PIN */ CK_ULONG ulPinLen /* length in bytes of the PIN */ ); #endif /* C_SetPIN modifies the PIN of the user who is logged in. */ CK_PKCS11_FUNCTION_INFO(C_SetPIN) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_UTF8CHAR_PTR pOldPin, /* the old PIN */ CK_ULONG ulOldLen, /* length of the old PIN */ CK_UTF8CHAR_PTR pNewPin, /* the new PIN */ CK_ULONG ulNewLen /* length of the new PIN */ ); #endif /* Session management */ /* C_OpenSession opens a session between an application and a * token. */ CK_PKCS11_FUNCTION_INFO(C_OpenSession) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID, /* the slot's ID */ CK_FLAGS flags, /* from CK_SESSION_INFO */ CK_VOID_PTR pApplication, /* passed to callback */ CK_NOTIFY Notify, /* callback function */ CK_SESSION_HANDLE_PTR phSession /* gets session handle */ ); #endif /* C_CloseSession closes a session between an application and a * token. */ CK_PKCS11_FUNCTION_INFO(C_CloseSession) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession /* the session's handle */ ); #endif /* C_CloseAllSessions closes all sessions with a token. */ CK_PKCS11_FUNCTION_INFO(C_CloseAllSessions) #ifdef CK_NEED_ARG_LIST ( CK_SLOT_ID slotID /* the token's slot */ ); #endif /* C_GetSessionInfo obtains information about the session. */ CK_PKCS11_FUNCTION_INFO(C_GetSessionInfo) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_SESSION_INFO_PTR pInfo /* receives session info */ ); #endif /* C_GetOperationState obtains the state of the cryptographic operation * in a session. */ CK_PKCS11_FUNCTION_INFO(C_GetOperationState) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pOperationState, /* gets state */ CK_ULONG_PTR pulOperationStateLen /* gets state length */ ); #endif /* C_SetOperationState restores the state of the cryptographic * operation in a session. */ CK_PKCS11_FUNCTION_INFO(C_SetOperationState) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pOperationState, /* holds state */ CK_ULONG ulOperationStateLen, /* holds state length */ CK_OBJECT_HANDLE hEncryptionKey, /* en/decryption key */ CK_OBJECT_HANDLE hAuthenticationKey /* sign/verify key */ ); #endif /* C_Login logs a user into a token. */ CK_PKCS11_FUNCTION_INFO(C_Login) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_USER_TYPE userType, /* the user type */ CK_UTF8CHAR_PTR pPin, /* the user's PIN */ CK_ULONG ulPinLen /* the length of the PIN */ ); #endif /* C_Logout logs a user out from a token. */ CK_PKCS11_FUNCTION_INFO(C_Logout) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession /* the session's handle */ ); #endif /* Object management */ /* C_CreateObject creates a new object. */ CK_PKCS11_FUNCTION_INFO(C_CreateObject) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_ATTRIBUTE_PTR pTemplate, /* the object's template */ CK_ULONG ulCount, /* attributes in template */ CK_OBJECT_HANDLE_PTR phObject /* gets new object's handle. */ ); #endif /* C_CopyObject copies an object, creating a new object for the * copy. */ CK_PKCS11_FUNCTION_INFO(C_CopyObject) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_OBJECT_HANDLE hObject, /* the object's handle */ CK_ATTRIBUTE_PTR pTemplate, /* template for new object */ CK_ULONG ulCount, /* attributes in template */ CK_OBJECT_HANDLE_PTR phNewObject /* receives handle of copy */ ); #endif /* C_DestroyObject destroys an object. */ CK_PKCS11_FUNCTION_INFO(C_DestroyObject) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_OBJECT_HANDLE hObject /* the object's handle */ ); #endif /* C_GetObjectSize gets the size of an object in bytes. */ CK_PKCS11_FUNCTION_INFO(C_GetObjectSize) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_OBJECT_HANDLE hObject, /* the object's handle */ CK_ULONG_PTR pulSize /* receives size of object */ ); #endif /* C_GetAttributeValue obtains the value of one or more object * attributes. */ CK_PKCS11_FUNCTION_INFO(C_GetAttributeValue) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_OBJECT_HANDLE hObject, /* the object's handle */ CK_ATTRIBUTE_PTR pTemplate, /* specifies attrs; gets vals */ CK_ULONG ulCount /* attributes in template */ ); #endif /* C_SetAttributeValue modifies the value of one or more object * attributes. */ CK_PKCS11_FUNCTION_INFO(C_SetAttributeValue) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_OBJECT_HANDLE hObject, /* the object's handle */ CK_ATTRIBUTE_PTR pTemplate, /* specifies attrs and values */ CK_ULONG ulCount /* attributes in template */ ); #endif /* C_FindObjectsInit initializes a search for token and session * objects that match a template. */ CK_PKCS11_FUNCTION_INFO(C_FindObjectsInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_ATTRIBUTE_PTR pTemplate, /* attribute values to match */ CK_ULONG ulCount /* attrs in search template */ ); #endif /* C_FindObjects continues a search for token and session * objects that match a template, obtaining additional object * handles. */ CK_PKCS11_FUNCTION_INFO(C_FindObjects) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_OBJECT_HANDLE_PTR phObject, /* gets obj. handles */ CK_ULONG ulMaxObjectCount, /* max handles to get */ CK_ULONG_PTR pulObjectCount /* actual # returned */ ); #endif /* C_FindObjectsFinal finishes a search for token and session * objects. */ CK_PKCS11_FUNCTION_INFO(C_FindObjectsFinal) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession /* the session's handle */ ); #endif /* Encryption and decryption */ /* C_EncryptInit initializes an encryption operation. */ CK_PKCS11_FUNCTION_INFO(C_EncryptInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the encryption mechanism */ CK_OBJECT_HANDLE hKey /* handle of encryption key */ ); #endif /* C_Encrypt encrypts single-part data. */ CK_PKCS11_FUNCTION_INFO(C_Encrypt) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pData, /* the plaintext data */ CK_ULONG ulDataLen, /* bytes of plaintext */ CK_BYTE_PTR pEncryptedData, /* gets ciphertext */ CK_ULONG_PTR pulEncryptedDataLen /* gets c-text size */ ); #endif /* C_EncryptUpdate continues a multiple-part encryption * operation. */ CK_PKCS11_FUNCTION_INFO(C_EncryptUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pPart, /* the plaintext data */ CK_ULONG ulPartLen, /* plaintext data len */ CK_BYTE_PTR pEncryptedPart, /* gets ciphertext */ CK_ULONG_PTR pulEncryptedPartLen /* gets c-text size */ ); #endif /* C_EncryptFinal finishes a multiple-part encryption * operation. */ CK_PKCS11_FUNCTION_INFO(C_EncryptFinal) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session handle */ CK_BYTE_PTR pLastEncryptedPart, /* last c-text */ CK_ULONG_PTR pulLastEncryptedPartLen /* gets last size */ ); #endif /* C_DecryptInit initializes a decryption operation. */ CK_PKCS11_FUNCTION_INFO(C_DecryptInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the decryption mechanism */ CK_OBJECT_HANDLE hKey /* handle of decryption key */ ); #endif /* C_Decrypt decrypts encrypted data in a single part. */ CK_PKCS11_FUNCTION_INFO(C_Decrypt) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pEncryptedData, /* ciphertext */ CK_ULONG ulEncryptedDataLen, /* ciphertext length */ CK_BYTE_PTR pData, /* gets plaintext */ CK_ULONG_PTR pulDataLen /* gets p-text size */ ); #endif /* C_DecryptUpdate continues a multiple-part decryption * operation. */ CK_PKCS11_FUNCTION_INFO(C_DecryptUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pEncryptedPart, /* encrypted data */ CK_ULONG ulEncryptedPartLen, /* input length */ CK_BYTE_PTR pPart, /* gets plaintext */ CK_ULONG_PTR pulPartLen /* p-text size */ ); #endif /* C_DecryptFinal finishes a multiple-part decryption * operation. */ CK_PKCS11_FUNCTION_INFO(C_DecryptFinal) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pLastPart, /* gets plaintext */ CK_ULONG_PTR pulLastPartLen /* p-text size */ ); #endif /* Message digesting */ /* C_DigestInit initializes a message-digesting operation. */ CK_PKCS11_FUNCTION_INFO(C_DigestInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism /* the digesting mechanism */ ); #endif /* C_Digest digests data in a single part. */ CK_PKCS11_FUNCTION_INFO(C_Digest) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pData, /* data to be digested */ CK_ULONG ulDataLen, /* bytes of data to digest */ CK_BYTE_PTR pDigest, /* gets the message digest */ CK_ULONG_PTR pulDigestLen /* gets digest length */ ); #endif /* C_DigestUpdate continues a multiple-part message-digesting * operation. */ CK_PKCS11_FUNCTION_INFO(C_DigestUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pPart, /* data to be digested */ CK_ULONG ulPartLen /* bytes of data to be digested */ ); #endif /* C_DigestKey continues a multi-part message-digesting * operation, by digesting the value of a secret key as part of * the data already digested. */ CK_PKCS11_FUNCTION_INFO(C_DigestKey) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_OBJECT_HANDLE hKey /* secret key to digest */ ); #endif /* C_DigestFinal finishes a multiple-part message-digesting * operation. */ CK_PKCS11_FUNCTION_INFO(C_DigestFinal) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pDigest, /* gets the message digest */ CK_ULONG_PTR pulDigestLen /* gets byte count of digest */ ); #endif /* Signing and MACing */ /* C_SignInit initializes a signature (private key encryption) * operation, where the signature is (will be) an appendix to * the data, and plaintext cannot be recovered from the * signature. */ CK_PKCS11_FUNCTION_INFO(C_SignInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the signature mechanism */ CK_OBJECT_HANDLE hKey /* handle of signature key */ ); #endif /* C_Sign signs (encrypts with private key) data in a single * part, where the signature is (will be) an appendix to the * data, and plaintext cannot be recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_Sign) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pData, /* the data to sign */ CK_ULONG ulDataLen, /* count of bytes to sign */ CK_BYTE_PTR pSignature, /* gets the signature */ CK_ULONG_PTR pulSignatureLen /* gets signature length */ ); #endif /* C_SignUpdate continues a multiple-part signature operation, * where the signature is (will be) an appendix to the data, * and plaintext cannot be recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_SignUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pPart, /* the data to sign */ CK_ULONG ulPartLen /* count of bytes to sign */ ); #endif /* C_SignFinal finishes a multiple-part signature operation, * returning the signature. */ CK_PKCS11_FUNCTION_INFO(C_SignFinal) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pSignature, /* gets the signature */ CK_ULONG_PTR pulSignatureLen /* gets signature length */ ); #endif /* C_SignRecoverInit initializes a signature operation, where * the data can be recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_SignRecoverInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the signature mechanism */ CK_OBJECT_HANDLE hKey /* handle of the signature key */ ); #endif /* C_SignRecover signs data in a single operation, where the * data can be recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_SignRecover) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pData, /* the data to sign */ CK_ULONG ulDataLen, /* count of bytes to sign */ CK_BYTE_PTR pSignature, /* gets the signature */ CK_ULONG_PTR pulSignatureLen /* gets signature length */ ); #endif /* Verifying signatures and MACs */ /* C_VerifyInit initializes a verification operation, where the * signature is an appendix to the data, and plaintext cannot * cannot be recovered from the signature (e.g. DSA). */ CK_PKCS11_FUNCTION_INFO(C_VerifyInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the verification mechanism */ CK_OBJECT_HANDLE hKey /* verification key */ ); #endif /* C_Verify verifies a signature in a single-part operation, * where the signature is an appendix to the data, and plaintext * cannot be recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_Verify) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pData, /* signed data */ CK_ULONG ulDataLen, /* length of signed data */ CK_BYTE_PTR pSignature, /* signature */ CK_ULONG ulSignatureLen /* signature length*/ ); #endif /* C_VerifyUpdate continues a multiple-part verification * operation, where the signature is an appendix to the data, * and plaintext cannot be recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_VerifyUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pPart, /* signed data */ CK_ULONG ulPartLen /* length of signed data */ ); #endif /* C_VerifyFinal finishes a multiple-part verification * operation, checking the signature. */ CK_PKCS11_FUNCTION_INFO(C_VerifyFinal) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pSignature, /* signature to verify */ CK_ULONG ulSignatureLen /* signature length */ ); #endif /* C_VerifyRecoverInit initializes a signature verification * operation, where the data is recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_VerifyRecoverInit) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the verification mechanism */ CK_OBJECT_HANDLE hKey /* verification key */ ); #endif /* C_VerifyRecover verifies a signature in a single-part * operation, where the data is recovered from the signature. */ CK_PKCS11_FUNCTION_INFO(C_VerifyRecover) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pSignature, /* signature to verify */ CK_ULONG ulSignatureLen, /* signature length */ CK_BYTE_PTR pData, /* gets signed data */ CK_ULONG_PTR pulDataLen /* gets signed data len */ ); #endif /* Dual-function cryptographic operations */ /* C_DigestEncryptUpdate continues a multiple-part digesting * and encryption operation. */ CK_PKCS11_FUNCTION_INFO(C_DigestEncryptUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pPart, /* the plaintext data */ CK_ULONG ulPartLen, /* plaintext length */ CK_BYTE_PTR pEncryptedPart, /* gets ciphertext */ CK_ULONG_PTR pulEncryptedPartLen /* gets c-text length */ ); #endif /* C_DecryptDigestUpdate continues a multiple-part decryption and * digesting operation. */ CK_PKCS11_FUNCTION_INFO(C_DecryptDigestUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pEncryptedPart, /* ciphertext */ CK_ULONG ulEncryptedPartLen, /* ciphertext length */ CK_BYTE_PTR pPart, /* gets plaintext */ CK_ULONG_PTR pulPartLen /* gets plaintext len */ ); #endif /* C_SignEncryptUpdate continues a multiple-part signing and * encryption operation. */ CK_PKCS11_FUNCTION_INFO(C_SignEncryptUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pPart, /* the plaintext data */ CK_ULONG ulPartLen, /* plaintext length */ CK_BYTE_PTR pEncryptedPart, /* gets ciphertext */ CK_ULONG_PTR pulEncryptedPartLen /* gets c-text length */ ); #endif /* C_DecryptVerifyUpdate continues a multiple-part decryption and * verify operation. */ CK_PKCS11_FUNCTION_INFO(C_DecryptVerifyUpdate) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_BYTE_PTR pEncryptedPart, /* ciphertext */ CK_ULONG ulEncryptedPartLen, /* ciphertext length */ CK_BYTE_PTR pPart, /* gets plaintext */ CK_ULONG_PTR pulPartLen /* gets p-text length */ ); #endif /* Key management */ /* C_GenerateKey generates a secret key, creating a new key * object. */ CK_PKCS11_FUNCTION_INFO(C_GenerateKey) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* key generation mech. */ CK_ATTRIBUTE_PTR pTemplate, /* template for new key */ CK_ULONG ulCount, /* # of attrs in template */ CK_OBJECT_HANDLE_PTR phKey /* gets handle of new key */ ); #endif /* C_GenerateKeyPair generates a public-key/private-key pair, * creating new key objects. */ CK_PKCS11_FUNCTION_INFO(C_GenerateKeyPair) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session handle */ CK_MECHANISM_PTR pMechanism, /* key-gen mech. */ CK_ATTRIBUTE_PTR pPublicKeyTemplate, /* template for pub. key */ CK_ULONG ulPublicKeyAttributeCount, /* # pub. attrs. */ CK_ATTRIBUTE_PTR pPrivateKeyTemplate, /* template for priv. key */ CK_ULONG ulPrivateKeyAttributeCount, /* # priv. attrs. */ CK_OBJECT_HANDLE_PTR phPublicKey, /* gets pub. key handle */ CK_OBJECT_HANDLE_PTR phPrivateKey /* gets priv. key handle */ ); #endif /* C_WrapKey wraps (i.e., encrypts) a key. */ CK_PKCS11_FUNCTION_INFO(C_WrapKey) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_MECHANISM_PTR pMechanism, /* the wrapping mechanism */ CK_OBJECT_HANDLE hWrappingKey, /* wrapping key */ CK_OBJECT_HANDLE hKey, /* key to be wrapped */ CK_BYTE_PTR pWrappedKey, /* gets wrapped key */ CK_ULONG_PTR pulWrappedKeyLen /* gets wrapped key size */ ); #endif /* C_UnwrapKey unwraps (decrypts) a wrapped key, creating a new * key object. */ CK_PKCS11_FUNCTION_INFO(C_UnwrapKey) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_MECHANISM_PTR pMechanism, /* unwrapping mech. */ CK_OBJECT_HANDLE hUnwrappingKey, /* unwrapping key */ CK_BYTE_PTR pWrappedKey, /* the wrapped key */ CK_ULONG ulWrappedKeyLen, /* wrapped key len */ CK_ATTRIBUTE_PTR pTemplate, /* new key template */ CK_ULONG ulAttributeCount, /* template length */ CK_OBJECT_HANDLE_PTR phKey /* gets new handle */ ); #endif /* C_DeriveKey derives a key from a base key, creating a new key * object. */ CK_PKCS11_FUNCTION_INFO(C_DeriveKey) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* session's handle */ CK_MECHANISM_PTR pMechanism, /* key deriv. mech. */ CK_OBJECT_HANDLE hBaseKey, /* base key */ CK_ATTRIBUTE_PTR pTemplate, /* new key template */ CK_ULONG ulAttributeCount, /* template length */ CK_OBJECT_HANDLE_PTR phKey /* gets new handle */ ); #endif /* Random number generation */ /* C_SeedRandom mixes additional seed material into the token's * random number generator. */ CK_PKCS11_FUNCTION_INFO(C_SeedRandom) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR pSeed, /* the seed material */ CK_ULONG ulSeedLen /* length of seed material */ ); #endif /* C_GenerateRandom generates random data. */ CK_PKCS11_FUNCTION_INFO(C_GenerateRandom) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_BYTE_PTR RandomData, /* receives the random data */ CK_ULONG ulRandomLen /* # of bytes to generate */ ); #endif /* Parallel function management */ /* C_GetFunctionStatus is a legacy function; it obtains an * updated status of a function running in parallel with an * application. */ CK_PKCS11_FUNCTION_INFO(C_GetFunctionStatus) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession /* the session's handle */ ); #endif /* C_CancelFunction is a legacy function; it cancels a function * running in parallel. */ CK_PKCS11_FUNCTION_INFO(C_CancelFunction) #ifdef CK_NEED_ARG_LIST ( CK_SESSION_HANDLE hSession /* the session's handle */ ); #endif /* C_WaitForSlotEvent waits for a slot event (token insertion, * removal, etc.) to occur. */ CK_PKCS11_FUNCTION_INFO(C_WaitForSlotEvent) #ifdef CK_NEED_ARG_LIST ( CK_FLAGS flags, /* blocking/nonblocking flag */ CK_SLOT_ID_PTR pSlot, /* location that receives the slot ID */ CK_VOID_PTR pRserved /* reserved. Should be NULL_PTR */ ); #endif botan-2.4.0/src/lib/prov/pkcs11/pkcs11t.h000066400000000000000000002146461322470703100177200ustar00rootroot00000000000000/* * PKCS #11 Cryptographic Token Interface Base Specification Version 2.40 Errata 01 * Committee Specification Draft 01 / Public Review Draft 01 * 09 December 2015 * Copyright (c) OASIS Open 2015. All Rights Reserved. * Source: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/errata01/csprd01/include/pkcs11-v2.40/ * Latest version of the specification: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.html * https://www.oasis-open.org/policies-guidelines/ipr */ /* See top of pkcs11.h for information about the macros that * must be defined and the structure-packing conventions that * must be set before including this file. */ #ifndef _PKCS11T_H_ #define _PKCS11T_H_ 1 #define CRYPTOKI_VERSION_MAJOR 2 #define CRYPTOKI_VERSION_MINOR 40 #define CRYPTOKI_VERSION_AMENDMENT 0 #define CK_TRUE 1 #define CK_FALSE 0 #ifndef CK_DISABLE_TRUE_FALSE #ifndef FALSE #define FALSE CK_FALSE #endif #ifndef TRUE #define TRUE CK_TRUE #endif #endif /* an unsigned 8-bit value */ typedef unsigned char CK_BYTE; /* an unsigned 8-bit character */ typedef CK_BYTE CK_CHAR; /* an 8-bit UTF-8 character */ typedef CK_BYTE CK_UTF8CHAR; /* a BYTE-sized Boolean flag */ typedef CK_BYTE CK_BBOOL; /* an unsigned value, at least 32 bits long */ typedef unsigned long int CK_ULONG; /* a signed value, the same size as a CK_ULONG */ typedef long int CK_LONG; /* at least 32 bits; each bit is a Boolean flag */ typedef CK_ULONG CK_FLAGS; /* some special values for certain CK_ULONG variables */ #define CK_UNAVAILABLE_INFORMATION (~0UL) #define CK_EFFECTIVELY_INFINITE 0UL typedef CK_BYTE CK_PTR CK_BYTE_PTR; typedef CK_CHAR CK_PTR CK_CHAR_PTR; typedef CK_UTF8CHAR CK_PTR CK_UTF8CHAR_PTR; typedef CK_ULONG CK_PTR CK_ULONG_PTR; typedef void CK_PTR CK_VOID_PTR; /* Pointer to a CK_VOID_PTR-- i.e., pointer to pointer to void */ typedef CK_VOID_PTR CK_PTR CK_VOID_PTR_PTR; /* The following value is always invalid if used as a session * handle or object handle */ #define CK_INVALID_HANDLE 0UL typedef struct CK_VERSION { CK_BYTE major; /* integer portion of version number */ CK_BYTE minor; /* 1/100ths portion of version number */ } CK_VERSION; typedef CK_VERSION CK_PTR CK_VERSION_PTR; typedef struct CK_INFO { CK_VERSION cryptokiVersion; /* Cryptoki interface ver */ CK_UTF8CHAR manufacturerID[32]; /* blank padded */ CK_FLAGS flags; /* must be zero */ CK_UTF8CHAR libraryDescription[32]; /* blank padded */ CK_VERSION libraryVersion; /* version of library */ } CK_INFO; typedef CK_INFO CK_PTR CK_INFO_PTR; /* CK_NOTIFICATION enumerates the types of notifications that * Cryptoki provides to an application */ typedef CK_ULONG CK_NOTIFICATION; #define CKN_SURRENDER 0UL #define CKN_OTP_CHANGED 1UL typedef CK_ULONG CK_SLOT_ID; typedef CK_SLOT_ID CK_PTR CK_SLOT_ID_PTR; /* CK_SLOT_INFO provides information about a slot */ typedef struct CK_SLOT_INFO { CK_UTF8CHAR slotDescription[64]; /* blank padded */ CK_UTF8CHAR manufacturerID[32]; /* blank padded */ CK_FLAGS flags; CK_VERSION hardwareVersion; /* version of hardware */ CK_VERSION firmwareVersion; /* version of firmware */ } CK_SLOT_INFO; /* flags: bit flags that provide capabilities of the slot * Bit Flag Mask Meaning */ #define CKF_TOKEN_PRESENT 0x00000001UL /* a token is there */ #define CKF_REMOVABLE_DEVICE 0x00000002UL /* removable devices*/ #define CKF_HW_SLOT 0x00000004UL /* hardware slot */ typedef CK_SLOT_INFO CK_PTR CK_SLOT_INFO_PTR; /* CK_TOKEN_INFO provides information about a token */ typedef struct CK_TOKEN_INFO { CK_UTF8CHAR label[32]; /* blank padded */ CK_UTF8CHAR manufacturerID[32]; /* blank padded */ CK_UTF8CHAR model[16]; /* blank padded */ CK_CHAR serialNumber[16]; /* blank padded */ CK_FLAGS flags; /* see below */ CK_ULONG ulMaxSessionCount; /* max open sessions */ CK_ULONG ulSessionCount; /* sess. now open */ CK_ULONG ulMaxRwSessionCount; /* max R/W sessions */ CK_ULONG ulRwSessionCount; /* R/W sess. now open */ CK_ULONG ulMaxPinLen; /* in bytes */ CK_ULONG ulMinPinLen; /* in bytes */ CK_ULONG ulTotalPublicMemory; /* in bytes */ CK_ULONG ulFreePublicMemory; /* in bytes */ CK_ULONG ulTotalPrivateMemory; /* in bytes */ CK_ULONG ulFreePrivateMemory; /* in bytes */ CK_VERSION hardwareVersion; /* version of hardware */ CK_VERSION firmwareVersion; /* version of firmware */ CK_CHAR utcTime[16]; /* time */ } CK_TOKEN_INFO; /* The flags parameter is defined as follows: * Bit Flag Mask Meaning */ #define CKF_RNG 0x00000001UL /* has random # generator */ #define CKF_WRITE_PROTECTED 0x00000002UL /* token is write-protected */ #define CKF_LOGIN_REQUIRED 0x00000004UL /* user must login */ #define CKF_USER_PIN_INITIALIZED 0x00000008UL /* normal user's PIN is set */ /* CKF_RESTORE_KEY_NOT_NEEDED. If it is set, * that means that *every* time the state of cryptographic * operations of a session is successfully saved, all keys * needed to continue those operations are stored in the state */ #define CKF_RESTORE_KEY_NOT_NEEDED 0x00000020UL /* CKF_CLOCK_ON_TOKEN. If it is set, that means * that the token has some sort of clock. The time on that * clock is returned in the token info structure */ #define CKF_CLOCK_ON_TOKEN 0x00000040UL /* CKF_PROTECTED_AUTHENTICATION_PATH. If it is * set, that means that there is some way for the user to login * without sending a PIN through the Cryptoki library itself */ #define CKF_PROTECTED_AUTHENTICATION_PATH 0x00000100UL /* CKF_DUAL_CRYPTO_OPERATIONS. If it is true, * that means that a single session with the token can perform * dual simultaneous cryptographic operations (digest and * encrypt; decrypt and digest; sign and encrypt; and decrypt * and sign) */ #define CKF_DUAL_CRYPTO_OPERATIONS 0x00000200UL /* CKF_TOKEN_INITIALIZED. If it is true, the * token has been initialized using C_InitializeToken or an * equivalent mechanism outside the scope of PKCS #11. * Calling C_InitializeToken when this flag is set will cause * the token to be reinitialized. */ #define CKF_TOKEN_INITIALIZED 0x00000400UL /* CKF_SECONDARY_AUTHENTICATION. If it is * true, the token supports secondary authentication for * private key objects. */ #define CKF_SECONDARY_AUTHENTICATION 0x00000800UL /* CKF_USER_PIN_COUNT_LOW. If it is true, an * incorrect user login PIN has been entered at least once * since the last successful authentication. */ #define CKF_USER_PIN_COUNT_LOW 0x00010000UL /* CKF_USER_PIN_FINAL_TRY. If it is true, * supplying an incorrect user PIN will it to become locked. */ #define CKF_USER_PIN_FINAL_TRY 0x00020000UL /* CKF_USER_PIN_LOCKED. If it is true, the * user PIN has been locked. User login to the token is not * possible. */ #define CKF_USER_PIN_LOCKED 0x00040000UL /* CKF_USER_PIN_TO_BE_CHANGED. If it is true, * the user PIN value is the default value set by token * initialization or manufacturing, or the PIN has been * expired by the card. */ #define CKF_USER_PIN_TO_BE_CHANGED 0x00080000UL /* CKF_SO_PIN_COUNT_LOW. If it is true, an * incorrect SO login PIN has been entered at least once since * the last successful authentication. */ #define CKF_SO_PIN_COUNT_LOW 0x00100000UL /* CKF_SO_PIN_FINAL_TRY. If it is true, * supplying an incorrect SO PIN will it to become locked. */ #define CKF_SO_PIN_FINAL_TRY 0x00200000UL /* CKF_SO_PIN_LOCKED. If it is true, the SO * PIN has been locked. SO login to the token is not possible. */ #define CKF_SO_PIN_LOCKED 0x00400000UL /* CKF_SO_PIN_TO_BE_CHANGED. If it is true, * the SO PIN value is the default value set by token * initialization or manufacturing, or the PIN has been * expired by the card. */ #define CKF_SO_PIN_TO_BE_CHANGED 0x00800000UL #define CKF_ERROR_STATE 0x01000000UL typedef CK_TOKEN_INFO CK_PTR CK_TOKEN_INFO_PTR; /* CK_SESSION_HANDLE is a Cryptoki-assigned value that * identifies a session */ typedef CK_ULONG CK_SESSION_HANDLE; typedef CK_SESSION_HANDLE CK_PTR CK_SESSION_HANDLE_PTR; /* CK_USER_TYPE enumerates the types of Cryptoki users */ typedef CK_ULONG CK_USER_TYPE; /* Security Officer */ #define CKU_SO 0UL /* Normal user */ #define CKU_USER 1UL /* Context specific */ #define CKU_CONTEXT_SPECIFIC 2UL /* CK_STATE enumerates the session states */ typedef CK_ULONG CK_STATE; #define CKS_RO_PUBLIC_SESSION 0UL #define CKS_RO_USER_FUNCTIONS 1UL #define CKS_RW_PUBLIC_SESSION 2UL #define CKS_RW_USER_FUNCTIONS 3UL #define CKS_RW_SO_FUNCTIONS 4UL /* CK_SESSION_INFO provides information about a session */ typedef struct CK_SESSION_INFO { CK_SLOT_ID slotID; CK_STATE state; CK_FLAGS flags; /* see below */ CK_ULONG ulDeviceError; /* device-dependent error code */ } CK_SESSION_INFO; /* The flags are defined in the following table: * Bit Flag Mask Meaning */ #define CKF_RW_SESSION 0x00000002UL /* session is r/w */ #define CKF_SERIAL_SESSION 0x00000004UL /* no parallel */ typedef CK_SESSION_INFO CK_PTR CK_SESSION_INFO_PTR; /* CK_OBJECT_HANDLE is a token-specific identifier for an * object */ typedef CK_ULONG CK_OBJECT_HANDLE; typedef CK_OBJECT_HANDLE CK_PTR CK_OBJECT_HANDLE_PTR; /* CK_OBJECT_CLASS is a value that identifies the classes (or * types) of objects that Cryptoki recognizes. It is defined * as follows: */ typedef CK_ULONG CK_OBJECT_CLASS; /* The following classes of objects are defined: */ #define CKO_DATA 0x00000000UL #define CKO_CERTIFICATE 0x00000001UL #define CKO_PUBLIC_KEY 0x00000002UL #define CKO_PRIVATE_KEY 0x00000003UL #define CKO_SECRET_KEY 0x00000004UL #define CKO_HW_FEATURE 0x00000005UL #define CKO_DOMAIN_PARAMETERS 0x00000006UL #define CKO_MECHANISM 0x00000007UL #define CKO_OTP_KEY 0x00000008UL #define CKO_VENDOR_DEFINED 0x80000000UL typedef CK_OBJECT_CLASS CK_PTR CK_OBJECT_CLASS_PTR; /* CK_HW_FEATURE_TYPE is a value that identifies the hardware feature type * of an object with CK_OBJECT_CLASS equal to CKO_HW_FEATURE. */ typedef CK_ULONG CK_HW_FEATURE_TYPE; /* The following hardware feature types are defined */ #define CKH_MONOTONIC_COUNTER 0x00000001UL #define CKH_CLOCK 0x00000002UL #define CKH_USER_INTERFACE 0x00000003UL #define CKH_VENDOR_DEFINED 0x80000000UL /* CK_KEY_TYPE is a value that identifies a key type */ typedef CK_ULONG CK_KEY_TYPE; /* the following key types are defined: */ #define CKK_RSA 0x00000000UL #define CKK_DSA 0x00000001UL #define CKK_DH 0x00000002UL #define CKK_ECDSA 0x00000003UL /* Deprecated */ #define CKK_EC 0x00000003UL #define CKK_X9_42_DH 0x00000004UL #define CKK_KEA 0x00000005UL #define CKK_GENERIC_SECRET 0x00000010UL #define CKK_RC2 0x00000011UL #define CKK_RC4 0x00000012UL #define CKK_DES 0x00000013UL #define CKK_DES2 0x00000014UL #define CKK_DES3 0x00000015UL #define CKK_CAST 0x00000016UL #define CKK_CAST3 0x00000017UL #define CKK_CAST5 0x00000018UL /* Deprecated */ #define CKK_CAST128 0x00000018UL #define CKK_RC5 0x00000019UL #define CKK_IDEA 0x0000001AUL #define CKK_SKIPJACK 0x0000001BUL #define CKK_BATON 0x0000001CUL #define CKK_JUNIPER 0x0000001DUL #define CKK_CDMF 0x0000001EUL #define CKK_AES 0x0000001FUL #define CKK_BLOWFISH 0x00000020UL #define CKK_TWOFISH 0x00000021UL #define CKK_SECURID 0x00000022UL #define CKK_HOTP 0x00000023UL #define CKK_ACTI 0x00000024UL #define CKK_CAMELLIA 0x00000025UL #define CKK_ARIA 0x00000026UL #define CKK_MD5_HMAC 0x00000027UL #define CKK_SHA_1_HMAC 0x00000028UL #define CKK_RIPEMD128_HMAC 0x00000029UL #define CKK_RIPEMD160_HMAC 0x0000002AUL #define CKK_SHA256_HMAC 0x0000002BUL #define CKK_SHA384_HMAC 0x0000002CUL #define CKK_SHA512_HMAC 0x0000002DUL #define CKK_SHA224_HMAC 0x0000002EUL #define CKK_SEED 0x0000002FUL #define CKK_GOSTR3410 0x00000030UL #define CKK_GOSTR3411 0x00000031UL #define CKK_GOST28147 0x00000032UL #define CKK_VENDOR_DEFINED 0x80000000UL /* CK_CERTIFICATE_TYPE is a value that identifies a certificate * type */ typedef CK_ULONG CK_CERTIFICATE_TYPE; #define CK_CERTIFICATE_CATEGORY_UNSPECIFIED 0UL #define CK_CERTIFICATE_CATEGORY_TOKEN_USER 1UL #define CK_CERTIFICATE_CATEGORY_AUTHORITY 2UL #define CK_CERTIFICATE_CATEGORY_OTHER_ENTITY 3UL #define CK_SECURITY_DOMAIN_UNSPECIFIED 0UL #define CK_SECURITY_DOMAIN_MANUFACTURER 1UL #define CK_SECURITY_DOMAIN_OPERATOR 2UL #define CK_SECURITY_DOMAIN_THIRD_PARTY 3UL /* The following certificate types are defined: */ #define CKC_X_509 0x00000000UL #define CKC_X_509_ATTR_CERT 0x00000001UL #define CKC_WTLS 0x00000002UL #define CKC_VENDOR_DEFINED 0x80000000UL /* CK_ATTRIBUTE_TYPE is a value that identifies an attribute * type */ typedef CK_ULONG CK_ATTRIBUTE_TYPE; /* The CKF_ARRAY_ATTRIBUTE flag identifies an attribute which * consists of an array of values. */ #define CKF_ARRAY_ATTRIBUTE 0x40000000UL /* The following OTP-related defines relate to the CKA_OTP_FORMAT attribute */ #define CK_OTP_FORMAT_DECIMAL 0UL #define CK_OTP_FORMAT_HEXADECIMAL 1UL #define CK_OTP_FORMAT_ALPHANUMERIC 2UL #define CK_OTP_FORMAT_BINARY 3UL /* The following OTP-related defines relate to the CKA_OTP_..._REQUIREMENT * attributes */ #define CK_OTP_PARAM_IGNORED 0UL #define CK_OTP_PARAM_OPTIONAL 1UL #define CK_OTP_PARAM_MANDATORY 2UL /* The following attribute types are defined: */ #define CKA_CLASS 0x00000000UL #define CKA_TOKEN 0x00000001UL #define CKA_PRIVATE 0x00000002UL #define CKA_LABEL 0x00000003UL #define CKA_APPLICATION 0x00000010UL #define CKA_VALUE 0x00000011UL #define CKA_OBJECT_ID 0x00000012UL #define CKA_CERTIFICATE_TYPE 0x00000080UL #define CKA_ISSUER 0x00000081UL #define CKA_SERIAL_NUMBER 0x00000082UL #define CKA_AC_ISSUER 0x00000083UL #define CKA_OWNER 0x00000084UL #define CKA_ATTR_TYPES 0x00000085UL #define CKA_TRUSTED 0x00000086UL #define CKA_CERTIFICATE_CATEGORY 0x00000087UL #define CKA_JAVA_MIDP_SECURITY_DOMAIN 0x00000088UL #define CKA_URL 0x00000089UL #define CKA_HASH_OF_SUBJECT_PUBLIC_KEY 0x0000008AUL #define CKA_HASH_OF_ISSUER_PUBLIC_KEY 0x0000008BUL #define CKA_NAME_HASH_ALGORITHM 0x0000008CUL #define CKA_CHECK_VALUE 0x00000090UL #define CKA_KEY_TYPE 0x00000100UL #define CKA_SUBJECT 0x00000101UL #define CKA_ID 0x00000102UL #define CKA_SENSITIVE 0x00000103UL #define CKA_ENCRYPT 0x00000104UL #define CKA_DECRYPT 0x00000105UL #define CKA_WRAP 0x00000106UL #define CKA_UNWRAP 0x00000107UL #define CKA_SIGN 0x00000108UL #define CKA_SIGN_RECOVER 0x00000109UL #define CKA_VERIFY 0x0000010AUL #define CKA_VERIFY_RECOVER 0x0000010BUL #define CKA_DERIVE 0x0000010CUL #define CKA_START_DATE 0x00000110UL #define CKA_END_DATE 0x00000111UL #define CKA_MODULUS 0x00000120UL #define CKA_MODULUS_BITS 0x00000121UL #define CKA_PUBLIC_EXPONENT 0x00000122UL #define CKA_PRIVATE_EXPONENT 0x00000123UL #define CKA_PRIME_1 0x00000124UL #define CKA_PRIME_2 0x00000125UL #define CKA_EXPONENT_1 0x00000126UL #define CKA_EXPONENT_2 0x00000127UL #define CKA_COEFFICIENT 0x00000128UL #define CKA_PUBLIC_KEY_INFO 0x00000129UL #define CKA_PRIME 0x00000130UL #define CKA_SUBPRIME 0x00000131UL #define CKA_BASE 0x00000132UL #define CKA_PRIME_BITS 0x00000133UL #define CKA_SUBPRIME_BITS 0x00000134UL #define CKA_SUB_PRIME_BITS CKA_SUBPRIME_BITS #define CKA_VALUE_BITS 0x00000160UL #define CKA_VALUE_LEN 0x00000161UL #define CKA_EXTRACTABLE 0x00000162UL #define CKA_LOCAL 0x00000163UL #define CKA_NEVER_EXTRACTABLE 0x00000164UL #define CKA_ALWAYS_SENSITIVE 0x00000165UL #define CKA_KEY_GEN_MECHANISM 0x00000166UL #define CKA_MODIFIABLE 0x00000170UL #define CKA_COPYABLE 0x00000171UL #define CKA_DESTROYABLE 0x00000172UL #define CKA_ECDSA_PARAMS 0x00000180UL /* Deprecated */ #define CKA_EC_PARAMS 0x00000180UL #define CKA_EC_POINT 0x00000181UL #define CKA_SECONDARY_AUTH 0x00000200UL /* Deprecated */ #define CKA_AUTH_PIN_FLAGS 0x00000201UL /* Deprecated */ #define CKA_ALWAYS_AUTHENTICATE 0x00000202UL #define CKA_WRAP_WITH_TRUSTED 0x00000210UL #define CKA_WRAP_TEMPLATE (CKF_ARRAY_ATTRIBUTE|0x00000211UL) #define CKA_UNWRAP_TEMPLATE (CKF_ARRAY_ATTRIBUTE|0x00000212UL) #define CKA_DERIVE_TEMPLATE (CKF_ARRAY_ATTRIBUTE|0x00000213UL) #define CKA_OTP_FORMAT 0x00000220UL #define CKA_OTP_LENGTH 0x00000221UL #define CKA_OTP_TIME_INTERVAL 0x00000222UL #define CKA_OTP_USER_FRIENDLY_MODE 0x00000223UL #define CKA_OTP_CHALLENGE_REQUIREMENT 0x00000224UL #define CKA_OTP_TIME_REQUIREMENT 0x00000225UL #define CKA_OTP_COUNTER_REQUIREMENT 0x00000226UL #define CKA_OTP_PIN_REQUIREMENT 0x00000227UL #define CKA_OTP_COUNTER 0x0000022EUL #define CKA_OTP_TIME 0x0000022FUL #define CKA_OTP_USER_IDENTIFIER 0x0000022AUL #define CKA_OTP_SERVICE_IDENTIFIER 0x0000022BUL #define CKA_OTP_SERVICE_LOGO 0x0000022CUL #define CKA_OTP_SERVICE_LOGO_TYPE 0x0000022DUL #define CKA_GOSTR3410_PARAMS 0x00000250UL #define CKA_GOSTR3411_PARAMS 0x00000251UL #define CKA_GOST28147_PARAMS 0x00000252UL #define CKA_HW_FEATURE_TYPE 0x00000300UL #define CKA_RESET_ON_INIT 0x00000301UL #define CKA_HAS_RESET 0x00000302UL #define CKA_PIXEL_X 0x00000400UL #define CKA_PIXEL_Y 0x00000401UL #define CKA_RESOLUTION 0x00000402UL #define CKA_CHAR_ROWS 0x00000403UL #define CKA_CHAR_COLUMNS 0x00000404UL #define CKA_COLOR 0x00000405UL #define CKA_BITS_PER_PIXEL 0x00000406UL #define CKA_CHAR_SETS 0x00000480UL #define CKA_ENCODING_METHODS 0x00000481UL #define CKA_MIME_TYPES 0x00000482UL #define CKA_MECHANISM_TYPE 0x00000500UL #define CKA_REQUIRED_CMS_ATTRIBUTES 0x00000501UL #define CKA_DEFAULT_CMS_ATTRIBUTES 0x00000502UL #define CKA_SUPPORTED_CMS_ATTRIBUTES 0x00000503UL #define CKA_ALLOWED_MECHANISMS (CKF_ARRAY_ATTRIBUTE|0x00000600UL) #define CKA_VENDOR_DEFINED 0x80000000UL /* CK_ATTRIBUTE is a structure that includes the type, length * and value of an attribute */ typedef struct CK_ATTRIBUTE { CK_ATTRIBUTE_TYPE type; CK_VOID_PTR pValue; CK_ULONG ulValueLen; /* in bytes */ } CK_ATTRIBUTE; typedef CK_ATTRIBUTE CK_PTR CK_ATTRIBUTE_PTR; /* CK_DATE is a structure that defines a date */ typedef struct CK_DATE{ CK_CHAR year[4]; /* the year ("1900" - "9999") */ CK_CHAR month[2]; /* the month ("01" - "12") */ CK_CHAR day[2]; /* the day ("01" - "31") */ } CK_DATE; /* CK_MECHANISM_TYPE is a value that identifies a mechanism * type */ typedef CK_ULONG CK_MECHANISM_TYPE; /* the following mechanism types are defined: */ #define CKM_RSA_PKCS_KEY_PAIR_GEN 0x00000000UL #define CKM_RSA_PKCS 0x00000001UL #define CKM_RSA_9796 0x00000002UL #define CKM_RSA_X_509 0x00000003UL #define CKM_MD2_RSA_PKCS 0x00000004UL #define CKM_MD5_RSA_PKCS 0x00000005UL #define CKM_SHA1_RSA_PKCS 0x00000006UL #define CKM_RIPEMD128_RSA_PKCS 0x00000007UL #define CKM_RIPEMD160_RSA_PKCS 0x00000008UL #define CKM_RSA_PKCS_OAEP 0x00000009UL #define CKM_RSA_X9_31_KEY_PAIR_GEN 0x0000000AUL #define CKM_RSA_X9_31 0x0000000BUL #define CKM_SHA1_RSA_X9_31 0x0000000CUL #define CKM_RSA_PKCS_PSS 0x0000000DUL #define CKM_SHA1_RSA_PKCS_PSS 0x0000000EUL #define CKM_DSA_KEY_PAIR_GEN 0x00000010UL #define CKM_DSA 0x00000011UL #define CKM_DSA_SHA1 0x00000012UL #define CKM_DSA_SHA224 0x00000013UL #define CKM_DSA_SHA256 0x00000014UL #define CKM_DSA_SHA384 0x00000015UL #define CKM_DSA_SHA512 0x00000016UL #define CKM_DH_PKCS_KEY_PAIR_GEN 0x00000020UL #define CKM_DH_PKCS_DERIVE 0x00000021UL #define CKM_X9_42_DH_KEY_PAIR_GEN 0x00000030UL #define CKM_X9_42_DH_DERIVE 0x00000031UL #define CKM_X9_42_DH_HYBRID_DERIVE 0x00000032UL #define CKM_X9_42_MQV_DERIVE 0x00000033UL #define CKM_SHA256_RSA_PKCS 0x00000040UL #define CKM_SHA384_RSA_PKCS 0x00000041UL #define CKM_SHA512_RSA_PKCS 0x00000042UL #define CKM_SHA256_RSA_PKCS_PSS 0x00000043UL #define CKM_SHA384_RSA_PKCS_PSS 0x00000044UL #define CKM_SHA512_RSA_PKCS_PSS 0x00000045UL #define CKM_SHA224_RSA_PKCS 0x00000046UL #define CKM_SHA224_RSA_PKCS_PSS 0x00000047UL #define CKM_SHA512_224 0x00000048UL #define CKM_SHA512_224_HMAC 0x00000049UL #define CKM_SHA512_224_HMAC_GENERAL 0x0000004AUL #define CKM_SHA512_224_KEY_DERIVATION 0x0000004BUL #define CKM_SHA512_256 0x0000004CUL #define CKM_SHA512_256_HMAC 0x0000004DUL #define CKM_SHA512_256_HMAC_GENERAL 0x0000004EUL #define CKM_SHA512_256_KEY_DERIVATION 0x0000004FUL #define CKM_SHA512_T 0x00000050UL #define CKM_SHA512_T_HMAC 0x00000051UL #define CKM_SHA512_T_HMAC_GENERAL 0x00000052UL #define CKM_SHA512_T_KEY_DERIVATION 0x00000053UL #define CKM_RC2_KEY_GEN 0x00000100UL #define CKM_RC2_ECB 0x00000101UL #define CKM_RC2_CBC 0x00000102UL #define CKM_RC2_MAC 0x00000103UL #define CKM_RC2_MAC_GENERAL 0x00000104UL #define CKM_RC2_CBC_PAD 0x00000105UL #define CKM_RC4_KEY_GEN 0x00000110UL #define CKM_RC4 0x00000111UL #define CKM_DES_KEY_GEN 0x00000120UL #define CKM_DES_ECB 0x00000121UL #define CKM_DES_CBC 0x00000122UL #define CKM_DES_MAC 0x00000123UL #define CKM_DES_MAC_GENERAL 0x00000124UL #define CKM_DES_CBC_PAD 0x00000125UL #define CKM_DES2_KEY_GEN 0x00000130UL #define CKM_DES3_KEY_GEN 0x00000131UL #define CKM_DES3_ECB 0x00000132UL #define CKM_DES3_CBC 0x00000133UL #define CKM_DES3_MAC 0x00000134UL #define CKM_DES3_MAC_GENERAL 0x00000135UL #define CKM_DES3_CBC_PAD 0x00000136UL #define CKM_DES3_CMAC_GENERAL 0x00000137UL #define CKM_DES3_CMAC 0x00000138UL #define CKM_CDMF_KEY_GEN 0x00000140UL #define CKM_CDMF_ECB 0x00000141UL #define CKM_CDMF_CBC 0x00000142UL #define CKM_CDMF_MAC 0x00000143UL #define CKM_CDMF_MAC_GENERAL 0x00000144UL #define CKM_CDMF_CBC_PAD 0x00000145UL #define CKM_DES_OFB64 0x00000150UL #define CKM_DES_OFB8 0x00000151UL #define CKM_DES_CFB64 0x00000152UL #define CKM_DES_CFB8 0x00000153UL #define CKM_MD2 0x00000200UL #define CKM_MD2_HMAC 0x00000201UL #define CKM_MD2_HMAC_GENERAL 0x00000202UL #define CKM_MD5 0x00000210UL #define CKM_MD5_HMAC 0x00000211UL #define CKM_MD5_HMAC_GENERAL 0x00000212UL #define CKM_SHA_1 0x00000220UL #define CKM_SHA_1_HMAC 0x00000221UL #define CKM_SHA_1_HMAC_GENERAL 0x00000222UL #define CKM_RIPEMD128 0x00000230UL #define CKM_RIPEMD128_HMAC 0x00000231UL #define CKM_RIPEMD128_HMAC_GENERAL 0x00000232UL #define CKM_RIPEMD160 0x00000240UL #define CKM_RIPEMD160_HMAC 0x00000241UL #define CKM_RIPEMD160_HMAC_GENERAL 0x00000242UL #define CKM_SHA256 0x00000250UL #define CKM_SHA256_HMAC 0x00000251UL #define CKM_SHA256_HMAC_GENERAL 0x00000252UL #define CKM_SHA224 0x00000255UL #define CKM_SHA224_HMAC 0x00000256UL #define CKM_SHA224_HMAC_GENERAL 0x00000257UL #define CKM_SHA384 0x00000260UL #define CKM_SHA384_HMAC 0x00000261UL #define CKM_SHA384_HMAC_GENERAL 0x00000262UL #define CKM_SHA512 0x00000270UL #define CKM_SHA512_HMAC 0x00000271UL #define CKM_SHA512_HMAC_GENERAL 0x00000272UL #define CKM_SECURID_KEY_GEN 0x00000280UL #define CKM_SECURID 0x00000282UL #define CKM_HOTP_KEY_GEN 0x00000290UL #define CKM_HOTP 0x00000291UL #define CKM_ACTI 0x000002A0UL #define CKM_ACTI_KEY_GEN 0x000002A1UL #define CKM_CAST_KEY_GEN 0x00000300UL #define CKM_CAST_ECB 0x00000301UL #define CKM_CAST_CBC 0x00000302UL #define CKM_CAST_MAC 0x00000303UL #define CKM_CAST_MAC_GENERAL 0x00000304UL #define CKM_CAST_CBC_PAD 0x00000305UL #define CKM_CAST3_KEY_GEN 0x00000310UL #define CKM_CAST3_ECB 0x00000311UL #define CKM_CAST3_CBC 0x00000312UL #define CKM_CAST3_MAC 0x00000313UL #define CKM_CAST3_MAC_GENERAL 0x00000314UL #define CKM_CAST3_CBC_PAD 0x00000315UL /* Note that CAST128 and CAST5 are the same algorithm */ #define CKM_CAST5_KEY_GEN 0x00000320UL #define CKM_CAST128_KEY_GEN 0x00000320UL #define CKM_CAST5_ECB 0x00000321UL #define CKM_CAST128_ECB 0x00000321UL #define CKM_CAST5_CBC 0x00000322UL /* Deprecated */ #define CKM_CAST128_CBC 0x00000322UL #define CKM_CAST5_MAC 0x00000323UL /* Deprecated */ #define CKM_CAST128_MAC 0x00000323UL #define CKM_CAST5_MAC_GENERAL 0x00000324UL /* Deprecated */ #define CKM_CAST128_MAC_GENERAL 0x00000324UL #define CKM_CAST5_CBC_PAD 0x00000325UL /* Deprecated */ #define CKM_CAST128_CBC_PAD 0x00000325UL #define CKM_RC5_KEY_GEN 0x00000330UL #define CKM_RC5_ECB 0x00000331UL #define CKM_RC5_CBC 0x00000332UL #define CKM_RC5_MAC 0x00000333UL #define CKM_RC5_MAC_GENERAL 0x00000334UL #define CKM_RC5_CBC_PAD 0x00000335UL #define CKM_IDEA_KEY_GEN 0x00000340UL #define CKM_IDEA_ECB 0x00000341UL #define CKM_IDEA_CBC 0x00000342UL #define CKM_IDEA_MAC 0x00000343UL #define CKM_IDEA_MAC_GENERAL 0x00000344UL #define CKM_IDEA_CBC_PAD 0x00000345UL #define CKM_GENERIC_SECRET_KEY_GEN 0x00000350UL #define CKM_CONCATENATE_BASE_AND_KEY 0x00000360UL #define CKM_CONCATENATE_BASE_AND_DATA 0x00000362UL #define CKM_CONCATENATE_DATA_AND_BASE 0x00000363UL #define CKM_XOR_BASE_AND_DATA 0x00000364UL #define CKM_EXTRACT_KEY_FROM_KEY 0x00000365UL #define CKM_SSL3_PRE_MASTER_KEY_GEN 0x00000370UL #define CKM_SSL3_MASTER_KEY_DERIVE 0x00000371UL #define CKM_SSL3_KEY_AND_MAC_DERIVE 0x00000372UL #define CKM_SSL3_MASTER_KEY_DERIVE_DH 0x00000373UL #define CKM_TLS_PRE_MASTER_KEY_GEN 0x00000374UL #define CKM_TLS_MASTER_KEY_DERIVE 0x00000375UL #define CKM_TLS_KEY_AND_MAC_DERIVE 0x00000376UL #define CKM_TLS_MASTER_KEY_DERIVE_DH 0x00000377UL #define CKM_TLS_PRF 0x00000378UL #define CKM_SSL3_MD5_MAC 0x00000380UL #define CKM_SSL3_SHA1_MAC 0x00000381UL #define CKM_MD5_KEY_DERIVATION 0x00000390UL #define CKM_MD2_KEY_DERIVATION 0x00000391UL #define CKM_SHA1_KEY_DERIVATION 0x00000392UL #define CKM_SHA256_KEY_DERIVATION 0x00000393UL #define CKM_SHA384_KEY_DERIVATION 0x00000394UL #define CKM_SHA512_KEY_DERIVATION 0x00000395UL #define CKM_SHA224_KEY_DERIVATION 0x00000396UL #define CKM_PBE_MD2_DES_CBC 0x000003A0UL #define CKM_PBE_MD5_DES_CBC 0x000003A1UL #define CKM_PBE_MD5_CAST_CBC 0x000003A2UL #define CKM_PBE_MD5_CAST3_CBC 0x000003A3UL #define CKM_PBE_MD5_CAST5_CBC 0x000003A4UL /* Deprecated */ #define CKM_PBE_MD5_CAST128_CBC 0x000003A4UL #define CKM_PBE_SHA1_CAST5_CBC 0x000003A5UL /* Deprecated */ #define CKM_PBE_SHA1_CAST128_CBC 0x000003A5UL #define CKM_PBE_SHA1_RC4_128 0x000003A6UL #define CKM_PBE_SHA1_RC4_40 0x000003A7UL #define CKM_PBE_SHA1_DES3_EDE_CBC 0x000003A8UL #define CKM_PBE_SHA1_DES2_EDE_CBC 0x000003A9UL #define CKM_PBE_SHA1_RC2_128_CBC 0x000003AAUL #define CKM_PBE_SHA1_RC2_40_CBC 0x000003ABUL #define CKM_PKCS5_PBKD2 0x000003B0UL #define CKM_PBA_SHA1_WITH_SHA1_HMAC 0x000003C0UL #define CKM_WTLS_PRE_MASTER_KEY_GEN 0x000003D0UL #define CKM_WTLS_MASTER_KEY_DERIVE 0x000003D1UL #define CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC 0x000003D2UL #define CKM_WTLS_PRF 0x000003D3UL #define CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE 0x000003D4UL #define CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE 0x000003D5UL #define CKM_TLS10_MAC_SERVER 0x000003D6UL #define CKM_TLS10_MAC_CLIENT 0x000003D7UL #define CKM_TLS12_MAC 0x000003D8UL #define CKM_TLS12_KDF 0x000003D9UL #define CKM_TLS12_MASTER_KEY_DERIVE 0x000003E0UL #define CKM_TLS12_KEY_AND_MAC_DERIVE 0x000003E1UL #define CKM_TLS12_MASTER_KEY_DERIVE_DH 0x000003E2UL #define CKM_TLS12_KEY_SAFE_DERIVE 0x000003E3UL #define CKM_TLS_MAC 0x000003E4UL #define CKM_TLS_KDF 0x000003E5UL #define CKM_KEY_WRAP_LYNKS 0x00000400UL #define CKM_KEY_WRAP_SET_OAEP 0x00000401UL #define CKM_CMS_SIG 0x00000500UL #define CKM_KIP_DERIVE 0x00000510UL #define CKM_KIP_WRAP 0x00000511UL #define CKM_KIP_MAC 0x00000512UL #define CKM_CAMELLIA_KEY_GEN 0x00000550UL #define CKM_CAMELLIA_ECB 0x00000551UL #define CKM_CAMELLIA_CBC 0x00000552UL #define CKM_CAMELLIA_MAC 0x00000553UL #define CKM_CAMELLIA_MAC_GENERAL 0x00000554UL #define CKM_CAMELLIA_CBC_PAD 0x00000555UL #define CKM_CAMELLIA_ECB_ENCRYPT_DATA 0x00000556UL #define CKM_CAMELLIA_CBC_ENCRYPT_DATA 0x00000557UL #define CKM_CAMELLIA_CTR 0x00000558UL #define CKM_ARIA_KEY_GEN 0x00000560UL #define CKM_ARIA_ECB 0x00000561UL #define CKM_ARIA_CBC 0x00000562UL #define CKM_ARIA_MAC 0x00000563UL #define CKM_ARIA_MAC_GENERAL 0x00000564UL #define CKM_ARIA_CBC_PAD 0x00000565UL #define CKM_ARIA_ECB_ENCRYPT_DATA 0x00000566UL #define CKM_ARIA_CBC_ENCRYPT_DATA 0x00000567UL #define CKM_SEED_KEY_GEN 0x00000650UL #define CKM_SEED_ECB 0x00000651UL #define CKM_SEED_CBC 0x00000652UL #define CKM_SEED_MAC 0x00000653UL #define CKM_SEED_MAC_GENERAL 0x00000654UL #define CKM_SEED_CBC_PAD 0x00000655UL #define CKM_SEED_ECB_ENCRYPT_DATA 0x00000656UL #define CKM_SEED_CBC_ENCRYPT_DATA 0x00000657UL #define CKM_SKIPJACK_KEY_GEN 0x00001000UL #define CKM_SKIPJACK_ECB64 0x00001001UL #define CKM_SKIPJACK_CBC64 0x00001002UL #define CKM_SKIPJACK_OFB64 0x00001003UL #define CKM_SKIPJACK_CFB64 0x00001004UL #define CKM_SKIPJACK_CFB32 0x00001005UL #define CKM_SKIPJACK_CFB16 0x00001006UL #define CKM_SKIPJACK_CFB8 0x00001007UL #define CKM_SKIPJACK_WRAP 0x00001008UL #define CKM_SKIPJACK_PRIVATE_WRAP 0x00001009UL #define CKM_SKIPJACK_RELAYX 0x0000100aUL #define CKM_KEA_KEY_PAIR_GEN 0x00001010UL #define CKM_KEA_KEY_DERIVE 0x00001011UL #define CKM_KEA_DERIVE 0x00001012UL #define CKM_FORTEZZA_TIMESTAMP 0x00001020UL #define CKM_BATON_KEY_GEN 0x00001030UL #define CKM_BATON_ECB128 0x00001031UL #define CKM_BATON_ECB96 0x00001032UL #define CKM_BATON_CBC128 0x00001033UL #define CKM_BATON_COUNTER 0x00001034UL #define CKM_BATON_SHUFFLE 0x00001035UL #define CKM_BATON_WRAP 0x00001036UL #define CKM_ECDSA_KEY_PAIR_GEN 0x00001040UL /* Deprecated */ #define CKM_EC_KEY_PAIR_GEN 0x00001040UL #define CKM_ECDSA 0x00001041UL #define CKM_ECDSA_SHA1 0x00001042UL #define CKM_ECDSA_SHA224 0x00001043UL #define CKM_ECDSA_SHA256 0x00001044UL #define CKM_ECDSA_SHA384 0x00001045UL #define CKM_ECDSA_SHA512 0x00001046UL #define CKM_ECDH1_DERIVE 0x00001050UL #define CKM_ECDH1_COFACTOR_DERIVE 0x00001051UL #define CKM_ECMQV_DERIVE 0x00001052UL #define CKM_ECDH_AES_KEY_WRAP 0x00001053UL #define CKM_RSA_AES_KEY_WRAP 0x00001054UL #define CKM_JUNIPER_KEY_GEN 0x00001060UL #define CKM_JUNIPER_ECB128 0x00001061UL #define CKM_JUNIPER_CBC128 0x00001062UL #define CKM_JUNIPER_COUNTER 0x00001063UL #define CKM_JUNIPER_SHUFFLE 0x00001064UL #define CKM_JUNIPER_WRAP 0x00001065UL #define CKM_FASTHASH 0x00001070UL #define CKM_AES_KEY_GEN 0x00001080UL #define CKM_AES_ECB 0x00001081UL #define CKM_AES_CBC 0x00001082UL #define CKM_AES_MAC 0x00001083UL #define CKM_AES_MAC_GENERAL 0x00001084UL #define CKM_AES_CBC_PAD 0x00001085UL #define CKM_AES_CTR 0x00001086UL #define CKM_AES_GCM 0x00001087UL #define CKM_AES_CCM 0x00001088UL #define CKM_AES_CTS 0x00001089UL #define CKM_AES_CMAC 0x0000108AUL #define CKM_AES_CMAC_GENERAL 0x0000108BUL #define CKM_AES_XCBC_MAC 0x0000108CUL #define CKM_AES_XCBC_MAC_96 0x0000108DUL #define CKM_AES_GMAC 0x0000108EUL #define CKM_BLOWFISH_KEY_GEN 0x00001090UL #define CKM_BLOWFISH_CBC 0x00001091UL #define CKM_TWOFISH_KEY_GEN 0x00001092UL #define CKM_TWOFISH_CBC 0x00001093UL #define CKM_BLOWFISH_CBC_PAD 0x00001094UL #define CKM_TWOFISH_CBC_PAD 0x00001095UL #define CKM_DES_ECB_ENCRYPT_DATA 0x00001100UL #define CKM_DES_CBC_ENCRYPT_DATA 0x00001101UL #define CKM_DES3_ECB_ENCRYPT_DATA 0x00001102UL #define CKM_DES3_CBC_ENCRYPT_DATA 0x00001103UL #define CKM_AES_ECB_ENCRYPT_DATA 0x00001104UL #define CKM_AES_CBC_ENCRYPT_DATA 0x00001105UL #define CKM_GOSTR3410_KEY_PAIR_GEN 0x00001200UL #define CKM_GOSTR3410 0x00001201UL #define CKM_GOSTR3410_WITH_GOSTR3411 0x00001202UL #define CKM_GOSTR3410_KEY_WRAP 0x00001203UL #define CKM_GOSTR3410_DERIVE 0x00001204UL #define CKM_GOSTR3411 0x00001210UL #define CKM_GOSTR3411_HMAC 0x00001211UL #define CKM_GOST28147_KEY_GEN 0x00001220UL #define CKM_GOST28147_ECB 0x00001221UL #define CKM_GOST28147 0x00001222UL #define CKM_GOST28147_MAC 0x00001223UL #define CKM_GOST28147_KEY_WRAP 0x00001224UL #define CKM_DSA_PARAMETER_GEN 0x00002000UL #define CKM_DH_PKCS_PARAMETER_GEN 0x00002001UL #define CKM_X9_42_DH_PARAMETER_GEN 0x00002002UL #define CKM_DSA_PROBABLISTIC_PARAMETER_GEN 0x00002003UL #define CKM_DSA_SHAWE_TAYLOR_PARAMETER_GEN 0x00002004UL #define CKM_AES_OFB 0x00002104UL #define CKM_AES_CFB64 0x00002105UL #define CKM_AES_CFB8 0x00002106UL #define CKM_AES_CFB128 0x00002107UL #define CKM_AES_CFB1 0x00002108UL #define CKM_AES_KEY_WRAP 0x00002109UL /* WAS: 0x00001090 */ #define CKM_AES_KEY_WRAP_PAD 0x0000210AUL /* WAS: 0x00001091 */ #define CKM_RSA_PKCS_TPM_1_1 0x00004001UL #define CKM_RSA_PKCS_OAEP_TPM_1_1 0x00004002UL #define CKM_VENDOR_DEFINED 0x80000000UL typedef CK_MECHANISM_TYPE CK_PTR CK_MECHANISM_TYPE_PTR; /* CK_MECHANISM is a structure that specifies a particular * mechanism */ typedef struct CK_MECHANISM { CK_MECHANISM_TYPE mechanism; CK_VOID_PTR pParameter; CK_ULONG ulParameterLen; /* in bytes */ } CK_MECHANISM; typedef CK_MECHANISM CK_PTR CK_MECHANISM_PTR; /* CK_MECHANISM_INFO provides information about a particular * mechanism */ typedef struct CK_MECHANISM_INFO { CK_ULONG ulMinKeySize; CK_ULONG ulMaxKeySize; CK_FLAGS flags; } CK_MECHANISM_INFO; /* The flags are defined as follows: * Bit Flag Mask Meaning */ #define CKF_HW 0x00000001UL /* performed by HW */ /* Specify whether or not a mechanism can be used for a particular task */ #define CKF_ENCRYPT 0x00000100UL #define CKF_DECRYPT 0x00000200UL #define CKF_DIGEST 0x00000400UL #define CKF_SIGN 0x00000800UL #define CKF_SIGN_RECOVER 0x00001000UL #define CKF_VERIFY 0x00002000UL #define CKF_VERIFY_RECOVER 0x00004000UL #define CKF_GENERATE 0x00008000UL #define CKF_GENERATE_KEY_PAIR 0x00010000UL #define CKF_WRAP 0x00020000UL #define CKF_UNWRAP 0x00040000UL #define CKF_DERIVE 0x00080000UL /* Describe a token's EC capabilities not available in mechanism * information. */ #define CKF_EC_F_P 0x00100000UL #define CKF_EC_F_2M 0x00200000UL #define CKF_EC_ECPARAMETERS 0x00400000UL #define CKF_EC_NAMEDCURVE 0x00800000UL #define CKF_EC_UNCOMPRESS 0x01000000UL #define CKF_EC_COMPRESS 0x02000000UL #define CKF_EXTENSION 0x80000000UL typedef CK_MECHANISM_INFO CK_PTR CK_MECHANISM_INFO_PTR; /* CK_RV is a value that identifies the return value of a * Cryptoki function */ typedef CK_ULONG CK_RV; #define CKR_OK 0x00000000UL #define CKR_CANCEL 0x00000001UL #define CKR_HOST_MEMORY 0x00000002UL #define CKR_SLOT_ID_INVALID 0x00000003UL #define CKR_GENERAL_ERROR 0x00000005UL #define CKR_FUNCTION_FAILED 0x00000006UL #define CKR_ARGUMENTS_BAD 0x00000007UL #define CKR_NO_EVENT 0x00000008UL #define CKR_NEED_TO_CREATE_THREADS 0x00000009UL #define CKR_CANT_LOCK 0x0000000AUL #define CKR_ATTRIBUTE_READ_ONLY 0x00000010UL #define CKR_ATTRIBUTE_SENSITIVE 0x00000011UL #define CKR_ATTRIBUTE_TYPE_INVALID 0x00000012UL #define CKR_ATTRIBUTE_VALUE_INVALID 0x00000013UL #define CKR_ACTION_PROHIBITED 0x0000001BUL #define CKR_DATA_INVALID 0x00000020UL #define CKR_DATA_LEN_RANGE 0x00000021UL #define CKR_DEVICE_ERROR 0x00000030UL #define CKR_DEVICE_MEMORY 0x00000031UL #define CKR_DEVICE_REMOVED 0x00000032UL #define CKR_ENCRYPTED_DATA_INVALID 0x00000040UL #define CKR_ENCRYPTED_DATA_LEN_RANGE 0x00000041UL #define CKR_FUNCTION_CANCELED 0x00000050UL #define CKR_FUNCTION_NOT_PARALLEL 0x00000051UL #define CKR_FUNCTION_NOT_SUPPORTED 0x00000054UL #define CKR_KEY_HANDLE_INVALID 0x00000060UL #define CKR_KEY_SIZE_RANGE 0x00000062UL #define CKR_KEY_TYPE_INCONSISTENT 0x00000063UL #define CKR_KEY_NOT_NEEDED 0x00000064UL #define CKR_KEY_CHANGED 0x00000065UL #define CKR_KEY_NEEDED 0x00000066UL #define CKR_KEY_INDIGESTIBLE 0x00000067UL #define CKR_KEY_FUNCTION_NOT_PERMITTED 0x00000068UL #define CKR_KEY_NOT_WRAPPABLE 0x00000069UL #define CKR_KEY_UNEXTRACTABLE 0x0000006AUL #define CKR_MECHANISM_INVALID 0x00000070UL #define CKR_MECHANISM_PARAM_INVALID 0x00000071UL #define CKR_OBJECT_HANDLE_INVALID 0x00000082UL #define CKR_OPERATION_ACTIVE 0x00000090UL #define CKR_OPERATION_NOT_INITIALIZED 0x00000091UL #define CKR_PIN_INCORRECT 0x000000A0UL #define CKR_PIN_INVALID 0x000000A1UL #define CKR_PIN_LEN_RANGE 0x000000A2UL #define CKR_PIN_EXPIRED 0x000000A3UL #define CKR_PIN_LOCKED 0x000000A4UL #define CKR_SESSION_CLOSED 0x000000B0UL #define CKR_SESSION_COUNT 0x000000B1UL #define CKR_SESSION_HANDLE_INVALID 0x000000B3UL #define CKR_SESSION_PARALLEL_NOT_SUPPORTED 0x000000B4UL #define CKR_SESSION_READ_ONLY 0x000000B5UL #define CKR_SESSION_EXISTS 0x000000B6UL #define CKR_SESSION_READ_ONLY_EXISTS 0x000000B7UL #define CKR_SESSION_READ_WRITE_SO_EXISTS 0x000000B8UL #define CKR_SIGNATURE_INVALID 0x000000C0UL #define CKR_SIGNATURE_LEN_RANGE 0x000000C1UL #define CKR_TEMPLATE_INCOMPLETE 0x000000D0UL #define CKR_TEMPLATE_INCONSISTENT 0x000000D1UL #define CKR_TOKEN_NOT_PRESENT 0x000000E0UL #define CKR_TOKEN_NOT_RECOGNIZED 0x000000E1UL #define CKR_TOKEN_WRITE_PROTECTED 0x000000E2UL #define CKR_UNWRAPPING_KEY_HANDLE_INVALID 0x000000F0UL #define CKR_UNWRAPPING_KEY_SIZE_RANGE 0x000000F1UL #define CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT 0x000000F2UL #define CKR_USER_ALREADY_LOGGED_IN 0x00000100UL #define CKR_USER_NOT_LOGGED_IN 0x00000101UL #define CKR_USER_PIN_NOT_INITIALIZED 0x00000102UL #define CKR_USER_TYPE_INVALID 0x00000103UL #define CKR_USER_ANOTHER_ALREADY_LOGGED_IN 0x00000104UL #define CKR_USER_TOO_MANY_TYPES 0x00000105UL #define CKR_WRAPPED_KEY_INVALID 0x00000110UL #define CKR_WRAPPED_KEY_LEN_RANGE 0x00000112UL #define CKR_WRAPPING_KEY_HANDLE_INVALID 0x00000113UL #define CKR_WRAPPING_KEY_SIZE_RANGE 0x00000114UL #define CKR_WRAPPING_KEY_TYPE_INCONSISTENT 0x00000115UL #define CKR_RANDOM_SEED_NOT_SUPPORTED 0x00000120UL #define CKR_RANDOM_NO_RNG 0x00000121UL #define CKR_DOMAIN_PARAMS_INVALID 0x00000130UL #define CKR_CURVE_NOT_SUPPORTED 0x00000140UL #define CKR_BUFFER_TOO_SMALL 0x00000150UL #define CKR_SAVED_STATE_INVALID 0x00000160UL #define CKR_INFORMATION_SENSITIVE 0x00000170UL #define CKR_STATE_UNSAVEABLE 0x00000180UL #define CKR_CRYPTOKI_NOT_INITIALIZED 0x00000190UL #define CKR_CRYPTOKI_ALREADY_INITIALIZED 0x00000191UL #define CKR_MUTEX_BAD 0x000001A0UL #define CKR_MUTEX_NOT_LOCKED 0x000001A1UL #define CKR_NEW_PIN_MODE 0x000001B0UL #define CKR_NEXT_OTP 0x000001B1UL #define CKR_EXCEEDED_MAX_ITERATIONS 0x000001B5UL #define CKR_FIPS_SELF_TEST_FAILED 0x000001B6UL #define CKR_LIBRARY_LOAD_FAILED 0x000001B7UL #define CKR_PIN_TOO_WEAK 0x000001B8UL #define CKR_PUBLIC_KEY_INVALID 0x000001B9UL #define CKR_FUNCTION_REJECTED 0x00000200UL #define CKR_VENDOR_DEFINED 0x80000000UL /* CK_NOTIFY is an application callback that processes events */ typedef CK_CALLBACK_FUNCTION(CK_RV, CK_NOTIFY)( CK_SESSION_HANDLE hSession, /* the session's handle */ CK_NOTIFICATION event, CK_VOID_PTR pApplication /* passed to C_OpenSession */ ); /* CK_FUNCTION_LIST is a structure holding a Cryptoki spec * version and pointers of appropriate types to all the * Cryptoki functions */ typedef struct CK_FUNCTION_LIST CK_FUNCTION_LIST; typedef CK_FUNCTION_LIST CK_PTR CK_FUNCTION_LIST_PTR; typedef CK_FUNCTION_LIST_PTR CK_PTR CK_FUNCTION_LIST_PTR_PTR; /* CK_CREATEMUTEX is an application callback for creating a * mutex object */ typedef CK_CALLBACK_FUNCTION(CK_RV, CK_CREATEMUTEX)( CK_VOID_PTR_PTR ppMutex /* location to receive ptr to mutex */ ); /* CK_DESTROYMUTEX is an application callback for destroying a * mutex object */ typedef CK_CALLBACK_FUNCTION(CK_RV, CK_DESTROYMUTEX)( CK_VOID_PTR pMutex /* pointer to mutex */ ); /* CK_LOCKMUTEX is an application callback for locking a mutex */ typedef CK_CALLBACK_FUNCTION(CK_RV, CK_LOCKMUTEX)( CK_VOID_PTR pMutex /* pointer to mutex */ ); /* CK_UNLOCKMUTEX is an application callback for unlocking a * mutex */ typedef CK_CALLBACK_FUNCTION(CK_RV, CK_UNLOCKMUTEX)( CK_VOID_PTR pMutex /* pointer to mutex */ ); /* CK_C_INITIALIZE_ARGS provides the optional arguments to * C_Initialize */ typedef struct CK_C_INITIALIZE_ARGS { CK_CREATEMUTEX CreateMutex; CK_DESTROYMUTEX DestroyMutex; CK_LOCKMUTEX LockMutex; CK_UNLOCKMUTEX UnlockMutex; CK_FLAGS flags; CK_VOID_PTR pReserved; } CK_C_INITIALIZE_ARGS; /* flags: bit flags that provide capabilities of the slot * Bit Flag Mask Meaning */ #define CKF_LIBRARY_CANT_CREATE_OS_THREADS 0x00000001UL #define CKF_OS_LOCKING_OK 0x00000002UL typedef CK_C_INITIALIZE_ARGS CK_PTR CK_C_INITIALIZE_ARGS_PTR; /* additional flags for parameters to functions */ /* CKF_DONT_BLOCK is for the function C_WaitForSlotEvent */ #define CKF_DONT_BLOCK 1 /* CK_RSA_PKCS_MGF_TYPE is used to indicate the Message * Generation Function (MGF) applied to a message block when * formatting a message block for the PKCS #1 OAEP encryption * scheme. */ typedef CK_ULONG CK_RSA_PKCS_MGF_TYPE; typedef CK_RSA_PKCS_MGF_TYPE CK_PTR CK_RSA_PKCS_MGF_TYPE_PTR; /* The following MGFs are defined */ #define CKG_MGF1_SHA1 0x00000001UL #define CKG_MGF1_SHA256 0x00000002UL #define CKG_MGF1_SHA384 0x00000003UL #define CKG_MGF1_SHA512 0x00000004UL #define CKG_MGF1_SHA224 0x00000005UL /* CK_RSA_PKCS_OAEP_SOURCE_TYPE is used to indicate the source * of the encoding parameter when formatting a message block * for the PKCS #1 OAEP encryption scheme. */ typedef CK_ULONG CK_RSA_PKCS_OAEP_SOURCE_TYPE; typedef CK_RSA_PKCS_OAEP_SOURCE_TYPE CK_PTR CK_RSA_PKCS_OAEP_SOURCE_TYPE_PTR; /* The following encoding parameter sources are defined */ #define CKZ_DATA_SPECIFIED 0x00000001UL /* CK_RSA_PKCS_OAEP_PARAMS provides the parameters to the * CKM_RSA_PKCS_OAEP mechanism. */ typedef struct CK_RSA_PKCS_OAEP_PARAMS { CK_MECHANISM_TYPE hashAlg; CK_RSA_PKCS_MGF_TYPE mgf; CK_RSA_PKCS_OAEP_SOURCE_TYPE source; CK_VOID_PTR pSourceData; CK_ULONG ulSourceDataLen; } CK_RSA_PKCS_OAEP_PARAMS; typedef CK_RSA_PKCS_OAEP_PARAMS CK_PTR CK_RSA_PKCS_OAEP_PARAMS_PTR; /* CK_RSA_PKCS_PSS_PARAMS provides the parameters to the * CKM_RSA_PKCS_PSS mechanism(s). */ typedef struct CK_RSA_PKCS_PSS_PARAMS { CK_MECHANISM_TYPE hashAlg; CK_RSA_PKCS_MGF_TYPE mgf; CK_ULONG sLen; } CK_RSA_PKCS_PSS_PARAMS; typedef CK_RSA_PKCS_PSS_PARAMS CK_PTR CK_RSA_PKCS_PSS_PARAMS_PTR; typedef CK_ULONG CK_EC_KDF_TYPE; /* The following EC Key Derivation Functions are defined */ #define CKD_NULL 0x00000001UL #define CKD_SHA1_KDF 0x00000002UL /* The following X9.42 DH key derivation functions are defined */ #define CKD_SHA1_KDF_ASN1 0x00000003UL #define CKD_SHA1_KDF_CONCATENATE 0x00000004UL #define CKD_SHA224_KDF 0x00000005UL #define CKD_SHA256_KDF 0x00000006UL #define CKD_SHA384_KDF 0x00000007UL #define CKD_SHA512_KDF 0x00000008UL #define CKD_CPDIVERSIFY_KDF 0x00000009UL /* CK_ECDH1_DERIVE_PARAMS provides the parameters to the * CKM_ECDH1_DERIVE and CKM_ECDH1_COFACTOR_DERIVE mechanisms, * where each party contributes one key pair. */ typedef struct CK_ECDH1_DERIVE_PARAMS { CK_EC_KDF_TYPE kdf; CK_ULONG ulSharedDataLen; CK_BYTE_PTR pSharedData; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; } CK_ECDH1_DERIVE_PARAMS; typedef CK_ECDH1_DERIVE_PARAMS CK_PTR CK_ECDH1_DERIVE_PARAMS_PTR; /* * CK_ECDH2_DERIVE_PARAMS provides the parameters to the * CKM_ECMQV_DERIVE mechanism, where each party contributes two key pairs. */ typedef struct CK_ECDH2_DERIVE_PARAMS { CK_EC_KDF_TYPE kdf; CK_ULONG ulSharedDataLen; CK_BYTE_PTR pSharedData; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; CK_ULONG ulPrivateDataLen; CK_OBJECT_HANDLE hPrivateData; CK_ULONG ulPublicDataLen2; CK_BYTE_PTR pPublicData2; } CK_ECDH2_DERIVE_PARAMS; typedef CK_ECDH2_DERIVE_PARAMS CK_PTR CK_ECDH2_DERIVE_PARAMS_PTR; typedef struct CK_ECMQV_DERIVE_PARAMS { CK_EC_KDF_TYPE kdf; CK_ULONG ulSharedDataLen; CK_BYTE_PTR pSharedData; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; CK_ULONG ulPrivateDataLen; CK_OBJECT_HANDLE hPrivateData; CK_ULONG ulPublicDataLen2; CK_BYTE_PTR pPublicData2; CK_OBJECT_HANDLE publicKey; } CK_ECMQV_DERIVE_PARAMS; typedef CK_ECMQV_DERIVE_PARAMS CK_PTR CK_ECMQV_DERIVE_PARAMS_PTR; /* Typedefs and defines for the CKM_X9_42_DH_KEY_PAIR_GEN and the * CKM_X9_42_DH_PARAMETER_GEN mechanisms */ typedef CK_ULONG CK_X9_42_DH_KDF_TYPE; typedef CK_X9_42_DH_KDF_TYPE CK_PTR CK_X9_42_DH_KDF_TYPE_PTR; /* CK_X9_42_DH1_DERIVE_PARAMS provides the parameters to the * CKM_X9_42_DH_DERIVE key derivation mechanism, where each party * contributes one key pair */ typedef struct CK_X9_42_DH1_DERIVE_PARAMS { CK_X9_42_DH_KDF_TYPE kdf; CK_ULONG ulOtherInfoLen; CK_BYTE_PTR pOtherInfo; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; } CK_X9_42_DH1_DERIVE_PARAMS; typedef struct CK_X9_42_DH1_DERIVE_PARAMS CK_PTR CK_X9_42_DH1_DERIVE_PARAMS_PTR; /* CK_X9_42_DH2_DERIVE_PARAMS provides the parameters to the * CKM_X9_42_DH_HYBRID_DERIVE and CKM_X9_42_MQV_DERIVE key derivation * mechanisms, where each party contributes two key pairs */ typedef struct CK_X9_42_DH2_DERIVE_PARAMS { CK_X9_42_DH_KDF_TYPE kdf; CK_ULONG ulOtherInfoLen; CK_BYTE_PTR pOtherInfo; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; CK_ULONG ulPrivateDataLen; CK_OBJECT_HANDLE hPrivateData; CK_ULONG ulPublicDataLen2; CK_BYTE_PTR pPublicData2; } CK_X9_42_DH2_DERIVE_PARAMS; typedef CK_X9_42_DH2_DERIVE_PARAMS CK_PTR CK_X9_42_DH2_DERIVE_PARAMS_PTR; typedef struct CK_X9_42_MQV_DERIVE_PARAMS { CK_X9_42_DH_KDF_TYPE kdf; CK_ULONG ulOtherInfoLen; CK_BYTE_PTR pOtherInfo; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; CK_ULONG ulPrivateDataLen; CK_OBJECT_HANDLE hPrivateData; CK_ULONG ulPublicDataLen2; CK_BYTE_PTR pPublicData2; CK_OBJECT_HANDLE publicKey; } CK_X9_42_MQV_DERIVE_PARAMS; typedef CK_X9_42_MQV_DERIVE_PARAMS CK_PTR CK_X9_42_MQV_DERIVE_PARAMS_PTR; /* CK_KEA_DERIVE_PARAMS provides the parameters to the * CKM_KEA_DERIVE mechanism */ typedef struct CK_KEA_DERIVE_PARAMS { CK_BBOOL isSender; CK_ULONG ulRandomLen; CK_BYTE_PTR pRandomA; CK_BYTE_PTR pRandomB; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; } CK_KEA_DERIVE_PARAMS; typedef CK_KEA_DERIVE_PARAMS CK_PTR CK_KEA_DERIVE_PARAMS_PTR; /* CK_RC2_PARAMS provides the parameters to the CKM_RC2_ECB and * CKM_RC2_MAC mechanisms. An instance of CK_RC2_PARAMS just * holds the effective keysize */ typedef CK_ULONG CK_RC2_PARAMS; typedef CK_RC2_PARAMS CK_PTR CK_RC2_PARAMS_PTR; /* CK_RC2_CBC_PARAMS provides the parameters to the CKM_RC2_CBC * mechanism */ typedef struct CK_RC2_CBC_PARAMS { CK_ULONG ulEffectiveBits; /* effective bits (1-1024) */ CK_BYTE iv[8]; /* IV for CBC mode */ } CK_RC2_CBC_PARAMS; typedef CK_RC2_CBC_PARAMS CK_PTR CK_RC2_CBC_PARAMS_PTR; /* CK_RC2_MAC_GENERAL_PARAMS provides the parameters for the * CKM_RC2_MAC_GENERAL mechanism */ typedef struct CK_RC2_MAC_GENERAL_PARAMS { CK_ULONG ulEffectiveBits; /* effective bits (1-1024) */ CK_ULONG ulMacLength; /* Length of MAC in bytes */ } CK_RC2_MAC_GENERAL_PARAMS; typedef CK_RC2_MAC_GENERAL_PARAMS CK_PTR \ CK_RC2_MAC_GENERAL_PARAMS_PTR; /* CK_RC5_PARAMS provides the parameters to the CKM_RC5_ECB and * CKM_RC5_MAC mechanisms */ typedef struct CK_RC5_PARAMS { CK_ULONG ulWordsize; /* wordsize in bits */ CK_ULONG ulRounds; /* number of rounds */ } CK_RC5_PARAMS; typedef CK_RC5_PARAMS CK_PTR CK_RC5_PARAMS_PTR; /* CK_RC5_CBC_PARAMS provides the parameters to the CKM_RC5_CBC * mechanism */ typedef struct CK_RC5_CBC_PARAMS { CK_ULONG ulWordsize; /* wordsize in bits */ CK_ULONG ulRounds; /* number of rounds */ CK_BYTE_PTR pIv; /* pointer to IV */ CK_ULONG ulIvLen; /* length of IV in bytes */ } CK_RC5_CBC_PARAMS; typedef CK_RC5_CBC_PARAMS CK_PTR CK_RC5_CBC_PARAMS_PTR; /* CK_RC5_MAC_GENERAL_PARAMS provides the parameters for the * CKM_RC5_MAC_GENERAL mechanism */ typedef struct CK_RC5_MAC_GENERAL_PARAMS { CK_ULONG ulWordsize; /* wordsize in bits */ CK_ULONG ulRounds; /* number of rounds */ CK_ULONG ulMacLength; /* Length of MAC in bytes */ } CK_RC5_MAC_GENERAL_PARAMS; typedef CK_RC5_MAC_GENERAL_PARAMS CK_PTR \ CK_RC5_MAC_GENERAL_PARAMS_PTR; /* CK_MAC_GENERAL_PARAMS provides the parameters to most block * ciphers' MAC_GENERAL mechanisms. Its value is the length of * the MAC */ typedef CK_ULONG CK_MAC_GENERAL_PARAMS; typedef CK_MAC_GENERAL_PARAMS CK_PTR CK_MAC_GENERAL_PARAMS_PTR; typedef struct CK_DES_CBC_ENCRYPT_DATA_PARAMS { CK_BYTE iv[8]; CK_BYTE_PTR pData; CK_ULONG length; } CK_DES_CBC_ENCRYPT_DATA_PARAMS; typedef CK_DES_CBC_ENCRYPT_DATA_PARAMS CK_PTR CK_DES_CBC_ENCRYPT_DATA_PARAMS_PTR; typedef struct CK_AES_CBC_ENCRYPT_DATA_PARAMS { CK_BYTE iv[16]; CK_BYTE_PTR pData; CK_ULONG length; } CK_AES_CBC_ENCRYPT_DATA_PARAMS; typedef CK_AES_CBC_ENCRYPT_DATA_PARAMS CK_PTR CK_AES_CBC_ENCRYPT_DATA_PARAMS_PTR; /* CK_SKIPJACK_PRIVATE_WRAP_PARAMS provides the parameters to the * CKM_SKIPJACK_PRIVATE_WRAP mechanism */ typedef struct CK_SKIPJACK_PRIVATE_WRAP_PARAMS { CK_ULONG ulPasswordLen; CK_BYTE_PTR pPassword; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pPublicData; CK_ULONG ulPAndGLen; CK_ULONG ulQLen; CK_ULONG ulRandomLen; CK_BYTE_PTR pRandomA; CK_BYTE_PTR pPrimeP; CK_BYTE_PTR pBaseG; CK_BYTE_PTR pSubprimeQ; } CK_SKIPJACK_PRIVATE_WRAP_PARAMS; typedef CK_SKIPJACK_PRIVATE_WRAP_PARAMS CK_PTR \ CK_SKIPJACK_PRIVATE_WRAP_PARAMS_PTR; /* CK_SKIPJACK_RELAYX_PARAMS provides the parameters to the * CKM_SKIPJACK_RELAYX mechanism */ typedef struct CK_SKIPJACK_RELAYX_PARAMS { CK_ULONG ulOldWrappedXLen; CK_BYTE_PTR pOldWrappedX; CK_ULONG ulOldPasswordLen; CK_BYTE_PTR pOldPassword; CK_ULONG ulOldPublicDataLen; CK_BYTE_PTR pOldPublicData; CK_ULONG ulOldRandomLen; CK_BYTE_PTR pOldRandomA; CK_ULONG ulNewPasswordLen; CK_BYTE_PTR pNewPassword; CK_ULONG ulNewPublicDataLen; CK_BYTE_PTR pNewPublicData; CK_ULONG ulNewRandomLen; CK_BYTE_PTR pNewRandomA; } CK_SKIPJACK_RELAYX_PARAMS; typedef CK_SKIPJACK_RELAYX_PARAMS CK_PTR \ CK_SKIPJACK_RELAYX_PARAMS_PTR; typedef struct CK_PBE_PARAMS { CK_BYTE_PTR pInitVector; CK_UTF8CHAR_PTR pPassword; CK_ULONG ulPasswordLen; CK_BYTE_PTR pSalt; CK_ULONG ulSaltLen; CK_ULONG ulIteration; } CK_PBE_PARAMS; typedef CK_PBE_PARAMS CK_PTR CK_PBE_PARAMS_PTR; /* CK_KEY_WRAP_SET_OAEP_PARAMS provides the parameters to the * CKM_KEY_WRAP_SET_OAEP mechanism */ typedef struct CK_KEY_WRAP_SET_OAEP_PARAMS { CK_BYTE bBC; /* block contents byte */ CK_BYTE_PTR pX; /* extra data */ CK_ULONG ulXLen; /* length of extra data in bytes */ } CK_KEY_WRAP_SET_OAEP_PARAMS; typedef CK_KEY_WRAP_SET_OAEP_PARAMS CK_PTR CK_KEY_WRAP_SET_OAEP_PARAMS_PTR; typedef struct CK_SSL3_RANDOM_DATA { CK_BYTE_PTR pClientRandom; CK_ULONG ulClientRandomLen; CK_BYTE_PTR pServerRandom; CK_ULONG ulServerRandomLen; } CK_SSL3_RANDOM_DATA; typedef struct CK_SSL3_MASTER_KEY_DERIVE_PARAMS { CK_SSL3_RANDOM_DATA RandomInfo; CK_VERSION_PTR pVersion; } CK_SSL3_MASTER_KEY_DERIVE_PARAMS; typedef struct CK_SSL3_MASTER_KEY_DERIVE_PARAMS CK_PTR \ CK_SSL3_MASTER_KEY_DERIVE_PARAMS_PTR; typedef struct CK_SSL3_KEY_MAT_OUT { CK_OBJECT_HANDLE hClientMacSecret; CK_OBJECT_HANDLE hServerMacSecret; CK_OBJECT_HANDLE hClientKey; CK_OBJECT_HANDLE hServerKey; CK_BYTE_PTR pIVClient; CK_BYTE_PTR pIVServer; } CK_SSL3_KEY_MAT_OUT; typedef CK_SSL3_KEY_MAT_OUT CK_PTR CK_SSL3_KEY_MAT_OUT_PTR; typedef struct CK_SSL3_KEY_MAT_PARAMS { CK_ULONG ulMacSizeInBits; CK_ULONG ulKeySizeInBits; CK_ULONG ulIVSizeInBits; CK_BBOOL bIsExport; CK_SSL3_RANDOM_DATA RandomInfo; CK_SSL3_KEY_MAT_OUT_PTR pReturnedKeyMaterial; } CK_SSL3_KEY_MAT_PARAMS; typedef CK_SSL3_KEY_MAT_PARAMS CK_PTR CK_SSL3_KEY_MAT_PARAMS_PTR; typedef struct CK_TLS_PRF_PARAMS { CK_BYTE_PTR pSeed; CK_ULONG ulSeedLen; CK_BYTE_PTR pLabel; CK_ULONG ulLabelLen; CK_BYTE_PTR pOutput; CK_ULONG_PTR pulOutputLen; } CK_TLS_PRF_PARAMS; typedef CK_TLS_PRF_PARAMS CK_PTR CK_TLS_PRF_PARAMS_PTR; typedef struct CK_WTLS_RANDOM_DATA { CK_BYTE_PTR pClientRandom; CK_ULONG ulClientRandomLen; CK_BYTE_PTR pServerRandom; CK_ULONG ulServerRandomLen; } CK_WTLS_RANDOM_DATA; typedef CK_WTLS_RANDOM_DATA CK_PTR CK_WTLS_RANDOM_DATA_PTR; typedef struct CK_WTLS_MASTER_KEY_DERIVE_PARAMS { CK_MECHANISM_TYPE DigestMechanism; CK_WTLS_RANDOM_DATA RandomInfo; CK_BYTE_PTR pVersion; } CK_WTLS_MASTER_KEY_DERIVE_PARAMS; typedef CK_WTLS_MASTER_KEY_DERIVE_PARAMS CK_PTR \ CK_WTLS_MASTER_KEY_DERIVE_PARAMS_PTR; typedef struct CK_WTLS_PRF_PARAMS { CK_MECHANISM_TYPE DigestMechanism; CK_BYTE_PTR pSeed; CK_ULONG ulSeedLen; CK_BYTE_PTR pLabel; CK_ULONG ulLabelLen; CK_BYTE_PTR pOutput; CK_ULONG_PTR pulOutputLen; } CK_WTLS_PRF_PARAMS; typedef CK_WTLS_PRF_PARAMS CK_PTR CK_WTLS_PRF_PARAMS_PTR; typedef struct CK_WTLS_KEY_MAT_OUT { CK_OBJECT_HANDLE hMacSecret; CK_OBJECT_HANDLE hKey; CK_BYTE_PTR pIV; } CK_WTLS_KEY_MAT_OUT; typedef CK_WTLS_KEY_MAT_OUT CK_PTR CK_WTLS_KEY_MAT_OUT_PTR; typedef struct CK_WTLS_KEY_MAT_PARAMS { CK_MECHANISM_TYPE DigestMechanism; CK_ULONG ulMacSizeInBits; CK_ULONG ulKeySizeInBits; CK_ULONG ulIVSizeInBits; CK_ULONG ulSequenceNumber; CK_BBOOL bIsExport; CK_WTLS_RANDOM_DATA RandomInfo; CK_WTLS_KEY_MAT_OUT_PTR pReturnedKeyMaterial; } CK_WTLS_KEY_MAT_PARAMS; typedef CK_WTLS_KEY_MAT_PARAMS CK_PTR CK_WTLS_KEY_MAT_PARAMS_PTR; typedef struct CK_CMS_SIG_PARAMS { CK_OBJECT_HANDLE certificateHandle; CK_MECHANISM_PTR pSigningMechanism; CK_MECHANISM_PTR pDigestMechanism; CK_UTF8CHAR_PTR pContentType; CK_BYTE_PTR pRequestedAttributes; CK_ULONG ulRequestedAttributesLen; CK_BYTE_PTR pRequiredAttributes; CK_ULONG ulRequiredAttributesLen; } CK_CMS_SIG_PARAMS; typedef CK_CMS_SIG_PARAMS CK_PTR CK_CMS_SIG_PARAMS_PTR; typedef struct CK_KEY_DERIVATION_STRING_DATA { CK_BYTE_PTR pData; CK_ULONG ulLen; } CK_KEY_DERIVATION_STRING_DATA; typedef CK_KEY_DERIVATION_STRING_DATA CK_PTR \ CK_KEY_DERIVATION_STRING_DATA_PTR; /* The CK_EXTRACT_PARAMS is used for the * CKM_EXTRACT_KEY_FROM_KEY mechanism. It specifies which bit * of the base key should be used as the first bit of the * derived key */ typedef CK_ULONG CK_EXTRACT_PARAMS; typedef CK_EXTRACT_PARAMS CK_PTR CK_EXTRACT_PARAMS_PTR; /* CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE is used to * indicate the Pseudo-Random Function (PRF) used to generate * key bits using PKCS #5 PBKDF2. */ typedef CK_ULONG CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE; typedef CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE CK_PTR \ CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE_PTR; #define CKP_PKCS5_PBKD2_HMAC_SHA1 0x00000001UL #define CKP_PKCS5_PBKD2_HMAC_GOSTR3411 0x00000002UL #define CKP_PKCS5_PBKD2_HMAC_SHA224 0x00000003UL #define CKP_PKCS5_PBKD2_HMAC_SHA256 0x00000004UL #define CKP_PKCS5_PBKD2_HMAC_SHA384 0x00000005UL #define CKP_PKCS5_PBKD2_HMAC_SHA512 0x00000006UL #define CKP_PKCS5_PBKD2_HMAC_SHA512_224 0x00000007UL #define CKP_PKCS5_PBKD2_HMAC_SHA512_256 0x00000008UL /* CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE is used to indicate the * source of the salt value when deriving a key using PKCS #5 * PBKDF2. */ typedef CK_ULONG CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE; typedef CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE CK_PTR \ CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE_PTR; /* The following salt value sources are defined in PKCS #5 v2.0. */ #define CKZ_SALT_SPECIFIED 0x00000001UL /* CK_PKCS5_PBKD2_PARAMS is a structure that provides the * parameters to the CKM_PKCS5_PBKD2 mechanism. */ typedef struct CK_PKCS5_PBKD2_PARAMS { CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE saltSource; CK_VOID_PTR pSaltSourceData; CK_ULONG ulSaltSourceDataLen; CK_ULONG iterations; CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE prf; CK_VOID_PTR pPrfData; CK_ULONG ulPrfDataLen; CK_UTF8CHAR_PTR pPassword; CK_ULONG_PTR ulPasswordLen; } CK_PKCS5_PBKD2_PARAMS; typedef CK_PKCS5_PBKD2_PARAMS CK_PTR CK_PKCS5_PBKD2_PARAMS_PTR; /* CK_PKCS5_PBKD2_PARAMS2 is a corrected version of the CK_PKCS5_PBKD2_PARAMS * structure that provides the parameters to the CKM_PKCS5_PBKD2 mechanism * noting that the ulPasswordLen field is a CK_ULONG and not a CK_ULONG_PTR. */ typedef struct CK_PKCS5_PBKD2_PARAMS2 { CK_PKCS5_PBKDF2_SALT_SOURCE_TYPE saltSource; CK_VOID_PTR pSaltSourceData; CK_ULONG ulSaltSourceDataLen; CK_ULONG iterations; CK_PKCS5_PBKD2_PSEUDO_RANDOM_FUNCTION_TYPE prf; CK_VOID_PTR pPrfData; CK_ULONG ulPrfDataLen; CK_UTF8CHAR_PTR pPassword; CK_ULONG ulPasswordLen; } CK_PKCS5_PBKD2_PARAMS2; typedef CK_PKCS5_PBKD2_PARAMS2 CK_PTR CK_PKCS5_PBKD2_PARAMS2_PTR; typedef CK_ULONG CK_OTP_PARAM_TYPE; typedef CK_OTP_PARAM_TYPE CK_PARAM_TYPE; /* backward compatibility */ typedef struct CK_OTP_PARAM { CK_OTP_PARAM_TYPE type; CK_VOID_PTR pValue; CK_ULONG ulValueLen; } CK_OTP_PARAM; typedef CK_OTP_PARAM CK_PTR CK_OTP_PARAM_PTR; typedef struct CK_OTP_PARAMS { CK_OTP_PARAM_PTR pParams; CK_ULONG ulCount; } CK_OTP_PARAMS; typedef CK_OTP_PARAMS CK_PTR CK_OTP_PARAMS_PTR; typedef struct CK_OTP_SIGNATURE_INFO { CK_OTP_PARAM_PTR pParams; CK_ULONG ulCount; } CK_OTP_SIGNATURE_INFO; typedef CK_OTP_SIGNATURE_INFO CK_PTR CK_OTP_SIGNATURE_INFO_PTR; #define CK_OTP_VALUE 0UL #define CK_OTP_PIN 1UL #define CK_OTP_CHALLENGE 2UL #define CK_OTP_TIME 3UL #define CK_OTP_COUNTER 4UL #define CK_OTP_FLAGS 5UL #define CK_OTP_OUTPUT_LENGTH 6UL #define CK_OTP_OUTPUT_FORMAT 7UL #define CKF_NEXT_OTP 0x00000001UL #define CKF_EXCLUDE_TIME 0x00000002UL #define CKF_EXCLUDE_COUNTER 0x00000004UL #define CKF_EXCLUDE_CHALLENGE 0x00000008UL #define CKF_EXCLUDE_PIN 0x00000010UL #define CKF_USER_FRIENDLY_OTP 0x00000020UL typedef struct CK_KIP_PARAMS { CK_MECHANISM_PTR pMechanism; CK_OBJECT_HANDLE hKey; CK_BYTE_PTR pSeed; CK_ULONG ulSeedLen; } CK_KIP_PARAMS; typedef CK_KIP_PARAMS CK_PTR CK_KIP_PARAMS_PTR; typedef struct CK_AES_CTR_PARAMS { CK_ULONG ulCounterBits; CK_BYTE cb[16]; } CK_AES_CTR_PARAMS; typedef CK_AES_CTR_PARAMS CK_PTR CK_AES_CTR_PARAMS_PTR; typedef struct CK_GCM_PARAMS { CK_BYTE_PTR pIv; CK_ULONG ulIvLen; CK_ULONG ulIvBits; CK_BYTE_PTR pAAD; CK_ULONG ulAADLen; CK_ULONG ulTagBits; } CK_GCM_PARAMS; typedef CK_GCM_PARAMS CK_PTR CK_GCM_PARAMS_PTR; typedef struct CK_CCM_PARAMS { CK_ULONG ulDataLen; CK_BYTE_PTR pNonce; CK_ULONG ulNonceLen; CK_BYTE_PTR pAAD; CK_ULONG ulAADLen; CK_ULONG ulMACLen; } CK_CCM_PARAMS; typedef CK_CCM_PARAMS CK_PTR CK_CCM_PARAMS_PTR; /* Deprecated. Use CK_GCM_PARAMS */ typedef struct CK_AES_GCM_PARAMS { CK_BYTE_PTR pIv; CK_ULONG ulIvLen; CK_ULONG ulIvBits; CK_BYTE_PTR pAAD; CK_ULONG ulAADLen; CK_ULONG ulTagBits; } CK_AES_GCM_PARAMS; typedef CK_AES_GCM_PARAMS CK_PTR CK_AES_GCM_PARAMS_PTR; /* Deprecated. Use CK_CCM_PARAMS */ typedef struct CK_AES_CCM_PARAMS { CK_ULONG ulDataLen; CK_BYTE_PTR pNonce; CK_ULONG ulNonceLen; CK_BYTE_PTR pAAD; CK_ULONG ulAADLen; CK_ULONG ulMACLen; } CK_AES_CCM_PARAMS; typedef CK_AES_CCM_PARAMS CK_PTR CK_AES_CCM_PARAMS_PTR; typedef struct CK_CAMELLIA_CTR_PARAMS { CK_ULONG ulCounterBits; CK_BYTE cb[16]; } CK_CAMELLIA_CTR_PARAMS; typedef CK_CAMELLIA_CTR_PARAMS CK_PTR CK_CAMELLIA_CTR_PARAMS_PTR; typedef struct CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS { CK_BYTE iv[16]; CK_BYTE_PTR pData; CK_ULONG length; } CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS; typedef CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS CK_PTR \ CK_CAMELLIA_CBC_ENCRYPT_DATA_PARAMS_PTR; typedef struct CK_ARIA_CBC_ENCRYPT_DATA_PARAMS { CK_BYTE iv[16]; CK_BYTE_PTR pData; CK_ULONG length; } CK_ARIA_CBC_ENCRYPT_DATA_PARAMS; typedef CK_ARIA_CBC_ENCRYPT_DATA_PARAMS CK_PTR \ CK_ARIA_CBC_ENCRYPT_DATA_PARAMS_PTR; typedef struct CK_DSA_PARAMETER_GEN_PARAM { CK_MECHANISM_TYPE hash; CK_BYTE_PTR pSeed; CK_ULONG ulSeedLen; CK_ULONG ulIndex; } CK_DSA_PARAMETER_GEN_PARAM; typedef CK_DSA_PARAMETER_GEN_PARAM CK_PTR CK_DSA_PARAMETER_GEN_PARAM_PTR; typedef struct CK_ECDH_AES_KEY_WRAP_PARAMS { CK_ULONG ulAESKeyBits; CK_EC_KDF_TYPE kdf; CK_ULONG ulSharedDataLen; CK_BYTE_PTR pSharedData; } CK_ECDH_AES_KEY_WRAP_PARAMS; typedef CK_ECDH_AES_KEY_WRAP_PARAMS CK_PTR CK_ECDH_AES_KEY_WRAP_PARAMS_PTR; typedef CK_ULONG CK_JAVA_MIDP_SECURITY_DOMAIN; typedef CK_ULONG CK_CERTIFICATE_CATEGORY; typedef struct CK_RSA_AES_KEY_WRAP_PARAMS { CK_ULONG ulAESKeyBits; CK_RSA_PKCS_OAEP_PARAMS_PTR pOAEPParams; } CK_RSA_AES_KEY_WRAP_PARAMS; typedef CK_RSA_AES_KEY_WRAP_PARAMS CK_PTR CK_RSA_AES_KEY_WRAP_PARAMS_PTR; typedef struct CK_TLS12_MASTER_KEY_DERIVE_PARAMS { CK_SSL3_RANDOM_DATA RandomInfo; CK_VERSION_PTR pVersion; CK_MECHANISM_TYPE prfHashMechanism; } CK_TLS12_MASTER_KEY_DERIVE_PARAMS; typedef CK_TLS12_MASTER_KEY_DERIVE_PARAMS CK_PTR \ CK_TLS12_MASTER_KEY_DERIVE_PARAMS_PTR; typedef struct CK_TLS12_KEY_MAT_PARAMS { CK_ULONG ulMacSizeInBits; CK_ULONG ulKeySizeInBits; CK_ULONG ulIVSizeInBits; CK_BBOOL bIsExport; CK_SSL3_RANDOM_DATA RandomInfo; CK_SSL3_KEY_MAT_OUT_PTR pReturnedKeyMaterial; CK_MECHANISM_TYPE prfHashMechanism; } CK_TLS12_KEY_MAT_PARAMS; typedef CK_TLS12_KEY_MAT_PARAMS CK_PTR CK_TLS12_KEY_MAT_PARAMS_PTR; typedef struct CK_TLS_KDF_PARAMS { CK_MECHANISM_TYPE prfMechanism; CK_BYTE_PTR pLabel; CK_ULONG ulLabelLength; CK_SSL3_RANDOM_DATA RandomInfo; CK_BYTE_PTR pContextData; CK_ULONG ulContextDataLength; } CK_TLS_KDF_PARAMS; typedef CK_TLS_KDF_PARAMS CK_PTR CK_TLS_KDF_PARAMS_PTR; typedef struct CK_TLS_MAC_PARAMS { CK_MECHANISM_TYPE prfHashMechanism; CK_ULONG ulMacLength; CK_ULONG ulServerOrClient; } CK_TLS_MAC_PARAMS; typedef CK_TLS_MAC_PARAMS CK_PTR CK_TLS_MAC_PARAMS_PTR; typedef struct CK_GOSTR3410_DERIVE_PARAMS { CK_EC_KDF_TYPE kdf; CK_BYTE_PTR pPublicData; CK_ULONG ulPublicDataLen; CK_BYTE_PTR pUKM; CK_ULONG ulUKMLen; } CK_GOSTR3410_DERIVE_PARAMS; typedef CK_GOSTR3410_DERIVE_PARAMS CK_PTR CK_GOSTR3410_DERIVE_PARAMS_PTR; typedef struct CK_GOSTR3410_KEY_WRAP_PARAMS { CK_BYTE_PTR pWrapOID; CK_ULONG ulWrapOIDLen; CK_BYTE_PTR pUKM; CK_ULONG ulUKMLen; CK_OBJECT_HANDLE hKey; } CK_GOSTR3410_KEY_WRAP_PARAMS; typedef CK_GOSTR3410_KEY_WRAP_PARAMS CK_PTR CK_GOSTR3410_KEY_WRAP_PARAMS_PTR; typedef struct CK_SEED_CBC_ENCRYPT_DATA_PARAMS { CK_BYTE iv[16]; CK_BYTE_PTR pData; CK_ULONG length; } CK_SEED_CBC_ENCRYPT_DATA_PARAMS; typedef CK_SEED_CBC_ENCRYPT_DATA_PARAMS CK_PTR \ CK_SEED_CBC_ENCRYPT_DATA_PARAMS_PTR; #endif /* _PKCS11T_H_ */ botan-2.4.0/src/lib/prov/tpm/000077500000000000000000000000001322470703100157425ustar00rootroot00000000000000botan-2.4.0/src/lib/prov/tpm/info.txt000066400000000000000000000001711322470703100174350ustar00rootroot00000000000000 TPM -> 20151126 load_on vendor all -> tspi hash_id rsa rng botan-2.4.0/src/lib/prov/tpm/tpm.cpp000066400000000000000000000340631322470703100172540ustar00rootroot00000000000000/* * TPM 1.2 interface * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include // TODO: dynamically load the TPM libraries? namespace Botan { namespace { void tss_error(TSS_RESULT res, const char* expr, const char* file, int line) { std::ostringstream err; err << "TPM error " << Trspi_Error_String(res) << " layer " << Trspi_Error_Layer(res) << " in " << expr << " at " << file << ":" << line; throw TPM_Error(err.str()); } TSS_FLAG bit_flag(size_t bits) { switch(bits) { // 512 supported, but ignored and rejected here case 1024: return TSS_KEY_SIZE_1024; case 2048: return TSS_KEY_SIZE_2048; // Most? v1.2 TPMs only support 1024 and 2048 bit keys ... case 4096: return TSS_KEY_SIZE_4096; case 8192: return TSS_KEY_SIZE_8192; case 16384: return TSS_KEY_SIZE_16384; default: throw Invalid_Argument("Unsupported TPM key size " + std::to_string(bits)); } } #if 0 bool is_srk_uuid(const UUID& uuid) { static const uint8_t srk[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; const std::vector& b = uuid.binary_value(); return (b.size() == 16 && same_mem(b.data(), srk, 16)); } #endif #define TSPI_CHECK_SUCCESS(expr) do { \ TSS_RESULT res = expr; \ if(res != TSS_SUCCESS) \ tss_error(res, #expr, __FILE__, __LINE__); \ } while(0) std::vector get_obj_attr(TSS_HCONTEXT ctx, TSS_HOBJECT obj, TSS_FLAG flag, TSS_FLAG sub_flag) { BYTE *data = nullptr; UINT32 data_len = 0; TSPI_CHECK_SUCCESS(::Tspi_GetAttribData(obj, flag, sub_flag, &data_len, &data)); std::vector r(data, data + data_len); TSPI_CHECK_SUCCESS(::Tspi_Context_FreeMemory(ctx, data)); return r; } void set_policy_secret(TSS_HPOLICY policy, const char* secret) { if(secret) { BYTE* as_b = const_cast(reinterpret_cast(secret)); TSPI_CHECK_SUCCESS(::Tspi_Policy_SetSecret(policy, TSS_SECRET_MODE_PLAIN, std::strlen(secret), as_b)); } else { static const uint8_t nullpass[20] = { 0 }; TSPI_CHECK_SUCCESS(::Tspi_Policy_SetSecret(policy, TSS_SECRET_MODE_SHA1, sizeof(nullpass), const_cast(nullpass))); } } TSS_UUID to_tss_uuid(const UUID& uuid) { static_assert(sizeof(TSS_UUID) == 16, "Expected size of packed UUID"); TSS_UUID tss_uuid; std::memcpy(&tss_uuid, uuid.binary_value().data(), 16); return tss_uuid; } UUID from_tss_uuid(const TSS_UUID& tss_uuid) { static_assert(sizeof(TSS_UUID) == 16, "Expected size of packed UUID"); std::vector mem(16); std::memcpy(mem.data(), &tss_uuid, 16); UUID uuid(std::move(mem)); return uuid; } TPM_Storage_Type storage_type_from_tss_flag(TSS_FLAG flag) { if(flag == TSS_PS_TYPE_USER) return TPM_Storage_Type::User; else if(flag == TSS_PS_TYPE_SYSTEM) return TPM_Storage_Type::System; else throw TPM_Error("Invalid storage flag " + std::to_string(flag)); } std::string format_url(const UUID& uuid, TPM_Storage_Type storage) { std::string storage_str = (storage == TPM_Storage_Type::User) ? "user" : "system"; return "tpmkey:uuid=" + uuid.to_string() + ";storage=" + storage_str; } std::string format_url(const TSS_UUID& tss_uuid, TSS_FLAG store_type) { UUID uuid = from_tss_uuid(tss_uuid); return format_url(from_tss_uuid(tss_uuid), storage_type_from_tss_flag(store_type)); } } TPM_Context::TPM_Context(pin_cb cb, const char* srk_password) : m_pin_cb(cb) { TSPI_CHECK_SUCCESS(::Tspi_Context_Create(&m_ctx)); TSPI_CHECK_SUCCESS(::Tspi_Context_Connect(m_ctx, nullptr)); TSPI_CHECK_SUCCESS(::Tspi_Context_GetTpmObject(m_ctx, &m_tpm)); const TSS_UUID SRK_UUID = TSS_UUID_SRK; TSPI_CHECK_SUCCESS(::Tspi_Context_LoadKeyByUUID(m_ctx, TSS_PS_TYPE_SYSTEM, SRK_UUID, &m_srk)); TSS_HPOLICY srk_policy; TSPI_CHECK_SUCCESS(::Tspi_GetPolicyObject(m_srk, TSS_POLICY_USAGE, &srk_policy)); set_policy_secret(srk_policy, srk_password); // TODO: leaking policy object here? // TODO: do we have to cache it? // TODO: try to use SRK with null, if it fails call the pin cb? } TPM_Context::~TPM_Context() { TSPI_CHECK_SUCCESS(::Tspi_Context_CloseObject(m_ctx, m_srk)); //TSPI_CHECK_SUCCESS(::Tspi_Context_CloseObject(m_ctx, m_tpm)); TSPI_CHECK_SUCCESS(::Tspi_Context_Close(m_ctx)); } uint32_t TPM_Context::current_counter() { uint32_t r = 0; TSPI_CHECK_SUCCESS(::Tspi_TPM_ReadCounter(m_tpm, &r)); return r; } void TPM_Context::gen_random(uint8_t out[], size_t out_len) { BYTE* mem; TSPI_CHECK_SUCCESS(::Tspi_TPM_GetRandom(m_tpm, out_len, &mem)); std::memcpy(out, mem, out_len); TSPI_CHECK_SUCCESS(::Tspi_Context_FreeMemory(m_ctx, mem)); } void TPM_Context::stir_random(const uint8_t in[], size_t in_len) { TSPI_CHECK_SUCCESS(::Tspi_TPM_StirRandom(m_tpm, in_len, const_cast(in))); } TPM_PrivateKey::TPM_PrivateKey(TPM_Context& ctx, size_t bits, const char* key_password) : m_ctx(ctx) { // TODO: can also do OAEP decryption via binding keys // TODO: offer signing, binding (decrypt), or legacy (sign + decrypt) keys? TSS_FLAG key_flags = bit_flag(bits) | TSS_KEY_VOLATILE | TSS_KEY_TYPE_SIGNING; TSS_HKEY key; TSPI_CHECK_SUCCESS(::Tspi_Context_CreateObject(m_ctx.handle(), TSS_OBJECT_TYPE_RSAKEY, key_flags, &key)); TSPI_CHECK_SUCCESS(::Tspi_SetAttribUint32(key, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_SIGSCHEME, TSS_SS_RSASSAPKCS1V15_DER)); TSS_HPOLICY policy; TSPI_CHECK_SUCCESS(::Tspi_Context_CreateObject(m_ctx.handle(), TSS_OBJECT_TYPE_POLICY, TSS_POLICY_USAGE, &policy)); set_policy_secret(policy, key_password); TSPI_CHECK_SUCCESS(::Tspi_Policy_AssignToObject(policy, key)); TSPI_CHECK_SUCCESS(::Tspi_Key_CreateKey(key, ctx.srk(), 0)); m_key = key; } // reference a registered TPM key TPM_PrivateKey::TPM_PrivateKey(TPM_Context& ctx, const std::string& uuid_str, TPM_Storage_Type storage_type) : m_ctx(ctx), m_uuid(uuid_str), m_storage(storage_type) { const TSS_FLAG key_ps_type = (m_storage == TPM_Storage_Type::User) ? TSS_PS_TYPE_USER : TSS_PS_TYPE_SYSTEM; TSPI_CHECK_SUCCESS(::Tspi_Context_LoadKeyByUUID(m_ctx.handle(), key_ps_type, to_tss_uuid(m_uuid), &m_key)); } TPM_PrivateKey::TPM_PrivateKey(TPM_Context& ctx, const std::vector& blob) : m_ctx(ctx) { TSPI_CHECK_SUCCESS(::Tspi_Context_LoadKeyByBlob(m_ctx.handle(), m_ctx.srk(), blob.size(), const_cast(blob.data()), &m_key)); //TSPI_CHECK_SUCCESS(::Tspi_Key_LoadKey(m_key, m_ctx.srk())); } std::string TPM_PrivateKey::register_key(TPM_Storage_Type storage_type) { if(!m_uuid.is_valid()) { TPM_RNG rng(ctx()); // use system_rng or arg RNG& instead? m_uuid = UUID(rng); m_storage = storage_type; const TSS_UUID key_uuid = to_tss_uuid(m_uuid); const TSS_FLAG key_ps_type = (storage_type == TPM_Storage_Type::User) ? TSS_PS_TYPE_USER : TSS_PS_TYPE_SYSTEM; const TSS_UUID srk_uuid = TSS_UUID_SRK; TSPI_CHECK_SUCCESS(::Tspi_Context_RegisterKey(m_ctx.handle(), m_key, key_ps_type, key_uuid, TSS_PS_TYPE_SYSTEM, srk_uuid)); } // Presumably we could re-register in the other store and same UUID // Doesn't seem like what is desired most of the time here if(storage_type != m_storage) { throw TPM_Error("TPM key " + m_uuid.to_string() + " already registered with different storage type"); } return format_url(m_uuid, m_storage); } std::vector TPM_PrivateKey::registered_keys(TPM_Context& ctx) { TSS_KM_KEYINFO2* key_info; UINT32 key_info_size; // TODO: does the PS type matter here at all? TSPI_CHECK_SUCCESS(::Tspi_Context_GetRegisteredKeysByUUID2(ctx.handle(), TSS_PS_TYPE_SYSTEM, nullptr, &key_info_size, &key_info)); std::vector r(key_info_size); for(size_t i = 0; i != key_info_size; ++i) { r[i] = format_url(key_info[i].keyUUID, key_info[i].persistentStorageType); } // TODO: are we supposed to free this memory and if so how? //TSPI_CHECK_SUCCESS(::Tspi_Context_FreeMemory(ctx.handle(), key_info)); return r; } BigInt TPM_PrivateKey::get_n() const { if(m_n == 0) { m_n = BigInt::decode(get_obj_attr(m_ctx.handle(), m_key, TSS_TSPATTRIB_RSAKEY_INFO, TSS_TSPATTRIB_KEYINFO_RSA_MODULUS)); } return m_n; } BigInt TPM_PrivateKey::get_e() const { if(m_e == 0) { m_e = BigInt::decode(get_obj_attr(m_ctx.handle(), m_key, TSS_TSPATTRIB_RSAKEY_INFO, TSS_TSPATTRIB_KEYINFO_RSA_EXPONENT)); } return m_e; } size_t TPM_PrivateKey::estimated_strength() const { return if_work_factor(key_length()); } size_t TPM_PrivateKey::key_length() const { return get_n().bits(); } AlgorithmIdentifier TPM_PrivateKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), AlgorithmIdentifier::USE_NULL_PARAM); } std::vector TPM_PrivateKey::public_key_bits() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(get_n()) .encode(get_e()) .end_cons() .get_contents_unlocked(); } secure_vector TPM_PrivateKey::private_key_bits() const { throw TPM_Error("Private key export not supported for TPM keys"); } std::vector TPM_PrivateKey::export_blob() const { return get_obj_attr(m_ctx.handle(), m_key, TSS_TSPATTRIB_KEY_BLOB, TSS_TSPATTRIB_KEYBLOB_BLOB); } std::unique_ptr TPM_PrivateKey::public_key() const { return std::unique_ptr(new RSA_PublicKey(get_n(), get_e())); } bool TPM_PrivateKey::check_key(RandomNumberGenerator&, bool) const { return true; // TODO do a kat or pairwise check } namespace { class TPM_Signing_Operation final : public PK_Ops::Signature { public: TPM_Signing_Operation(const TPM_PrivateKey& key, const std::string& hash_name) : m_key(key), m_hash(HashFunction::create(hash_name)), m_hash_id(pkcs_hash_id(hash_name)) { } void update(const uint8_t msg[], size_t msg_len) override { m_hash->update(msg, msg_len); } secure_vector sign(RandomNumberGenerator&) override { /* * v1.2 TPMs will only sign with PKCS #1 v1.5 padding. SHA-1 is built * in, all other hash inputs (TSS_HASH_OTHER) are treated as the * concatenation of the hash OID and hash value and signed with just the * 01FFFF... prefix. Even when using SHA-1 we compute the hash locally * since it is going to be much faster than pushing data over the LPC bus. */ secure_vector msg_hash = m_hash->final(); std::vector id_and_msg; id_and_msg.reserve(m_hash_id.size() + msg_hash.size()); id_and_msg.insert(id_and_msg.end(), m_hash_id.begin(), m_hash_id.end()); id_and_msg.insert(id_and_msg.end(), msg_hash.begin(), msg_hash.end()); TSS_HCONTEXT ctx = m_key.ctx().handle(); TSS_HHASH tpm_hash; TSPI_CHECK_SUCCESS(::Tspi_Context_CreateObject(ctx, TSS_OBJECT_TYPE_HASH, TSS_HASH_OTHER, &tpm_hash)); TSPI_CHECK_SUCCESS(::Tspi_Hash_SetHashValue(tpm_hash, id_and_msg.size(), id_and_msg.data())); BYTE* sig_bytes = nullptr; UINT32 sig_len = 0; TSPI_CHECK_SUCCESS(::Tspi_Hash_Sign(tpm_hash, m_key.handle(), &sig_len, &sig_bytes)); secure_vector sig(sig_bytes, sig_bytes + sig_len); // TODO: RAII for Context_FreeMemory TSPI_CHECK_SUCCESS(::Tspi_Context_FreeMemory(ctx, sig_bytes)); // TODO: RAII for Context_CloseObject TSPI_CHECK_SUCCESS(::Tspi_Context_CloseObject(ctx, tpm_hash)); return sig; } private: const TPM_PrivateKey& m_key; std::unique_ptr m_hash; std::vector m_hash_id; }; } std::unique_ptr TPM_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& /*provider*/) const { return std::unique_ptr(new TPM_Signing_Operation(*this, params)); } } botan-2.4.0/src/lib/prov/tpm/tpm.h000066400000000000000000000115711322470703100167200ustar00rootroot00000000000000 /* * TPM 1.2 interface * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TPM_H_ #define BOTAN_TPM_H_ #include #include #include #include #include #include //TODO remove this #include namespace Botan { class TPM_Error final : public Exception { public: TPM_Error(const std::string& err) : Exception(err) {} }; /** * Creates a connection to the TPM. All other TPM types take and hold * a TPM_Context reference, so all other objects must be deallocated * before ~TPM_Context runs. * * Use nullptr for the srk_password to indicate the well known secret * (ie, an unencrypted SRK). This is usually what you want. * * TODO: handling owner password? */ class BOTAN_PUBLIC_API(2,0) TPM_Context final { public: /** * User callback for getting the PIN. Will be passed the best available * description of what we are attempting to load. */ typedef std::function pin_cb; TPM_Context(pin_cb cb, const char* srk_password); ~TPM_Context(); // Get data from the TPM's RNG, whatever that is void gen_random(uint8_t out[], size_t out_len); // Uses Tspi_TPM_StirRandom to add data to TPM's internal pool void stir_random(const uint8_t in[], size_t in_len); std::string get_user_pin(const std::string& who) { return m_pin_cb(who); } uint32_t current_counter(); TSS_HCONTEXT handle() const { return m_ctx; } TSS_HKEY srk() const { return m_srk; } private: std::function m_pin_cb; TSS_HCONTEXT m_ctx; TSS_HKEY m_srk; TSS_HTPM m_tpm; }; class BOTAN_PUBLIC_API(2,0) TPM_RNG final : public Hardware_RNG { public: TPM_RNG(TPM_Context& ctx) : m_ctx(ctx) {} void add_entropy(const uint8_t in[], size_t in_len) override { m_ctx.stir_random(in, in_len); } void randomize(uint8_t out[], size_t out_len) override { m_ctx.gen_random(out, out_len); } std::string name() const override { return "TPM_RNG"; } bool is_seeded() const override { return true; } private: TPM_Context& m_ctx; }; enum class TPM_Storage_Type { User, System }; /* * Also implements the public interface, but does not have usable * TODO: derive from RSA_PublicKey??? */ class BOTAN_PUBLIC_API(2,0) TPM_PrivateKey final : public Private_Key { public: // TODO: key import? /* * Create a new key on the TPM parented to the SRK * @param bits must be 1024 or 2048 */ TPM_PrivateKey(TPM_Context& ctx, size_t bits, const char* key_password); // reference an existing TPM key using URL syntax from GnuTLS // "tpmkey:uuid=79f07ca9-73ac-478a-9093-11ca6702e774;storage=user" //TPM_PrivateKey(TPM_Context& ctx, const std::string& tpm_url); TPM_PrivateKey(TPM_Context& ctx, const std::string& uuid, TPM_Storage_Type storage_type); TPM_PrivateKey(TPM_Context& ctx, const std::vector& blob); /** * If the key is not currently registered under a known UUID, * generates a new random UUID and registers the key. * Returns the access URL. */ std::string register_key(TPM_Storage_Type storage_type); /** * Returns a copy of the public key */ std::unique_ptr public_key() const; std::vector export_blob() const; TPM_Context& ctx() const { return m_ctx; } TSS_HKEY handle() const { return m_key; } /* * Returns the list of all keys (in URL format) registered with the system */ static std::vector registered_keys(TPM_Context& ctx); size_t estimated_strength() const override; size_t key_length() const override; AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; secure_vector private_key_bits() const override; bool check_key(RandomNumberGenerator& rng, bool) const override; std::string algo_name() const override { return "RSA"; } // ??? std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; private: BigInt get_n() const; BigInt get_e() const; TPM_Context& m_ctx; TSS_HKEY m_key; // Only set for registered keys UUID m_uuid; TPM_Storage_Type m_storage; // Lazily computed in get_n, get_e mutable BigInt m_n, m_e; }; // TODO: NVRAM interface // TODO: PCR measurement, writing, key locking } #endif botan-2.4.0/src/lib/prov/tpm/uuid.h000066400000000000000000000043561322470703100170710ustar00rootroot00000000000000/* * UUID type * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UUID_H_ #define BOTAN_UUID_H_ #include #include #include namespace Botan { // TODO: move to util? class UUID final { public: // Represents an unassigned UUID object UUID() : m_uuid(0) {} UUID(RandomNumberGenerator& rng) { m_uuid.resize(16); rng.randomize(m_uuid.data(), m_uuid.size()); // Mark as a random UUID (RFC 4122 sec 4.4) m_uuid[6] = 0x40 | (m_uuid[6] & 0x0F); // Set two reserved bits m_uuid[8] = 0xC0 | (m_uuid[8] & 0x3F); } UUID(const std::vector& blob) { if(blob.size() != 16) { throw Invalid_Argument("Bad UUID blob " + hex_encode(blob)); } m_uuid = blob; } UUID(const std::string& uuid_str) { if(uuid_str.size() != 36 || uuid_str[8] != '-' || uuid_str[14] != '-' || uuid_str[19] != '-' || uuid_str[24] != '-') { throw Invalid_Argument("Bad UUID '" + uuid_str + "'"); } std::string just_hex; for(size_t i = 0; i != uuid_str.size(); ++i) { char c = uuid_str[i]; if(c == '-') continue; just_hex += c; } m_uuid = hex_decode(just_hex); if(m_uuid.size() != 16) { throw Invalid_Argument("Bad UUID '" + uuid_str + "'"); } } std::string to_string() const { std::string h = hex_encode(m_uuid); h.insert(8, "-"); h.insert(14, "-"); h.insert(19, "-"); h.insert(24, "-"); return h; } const std::vector& binary_value() const { return m_uuid; } bool operator==(const UUID& other) const { return m_uuid == other.m_uuid; } bool operator!=(const UUID& other) const { return !(*this == other); } bool is_valid() const { return m_uuid.size() == 16; } private: std::vector m_uuid; }; } #endif botan-2.4.0/src/lib/psk_db/000077500000000000000000000000001322470703100154165ustar00rootroot00000000000000botan-2.4.0/src/lib/psk_db/info.txt000066400000000000000000000001451322470703100171120ustar00rootroot00000000000000 PSK_DB -> 20171119 aes hmac base64 sha2_32 nist_keywrap botan-2.4.0/src/lib/psk_db/psk_db.cpp000066400000000000000000000061711322470703100173710ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { Encrypted_PSK_Database::Encrypted_PSK_Database(const secure_vector& master_key) { m_cipher = BlockCipher::create_or_throw("AES-256"); m_hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_hmac->set_key(master_key); m_cipher->set_key(m_hmac->process("wrap")); m_hmac->set_key(m_hmac->process("hmac")); } Encrypted_PSK_Database::~Encrypted_PSK_Database() { // for ~unique_ptr } std::set Encrypted_PSK_Database::list_names() const { const std::set encrypted_names = kv_get_all(); std::set names; for(std::string enc_name : encrypted_names) { try { const secure_vector raw_name = base64_decode(enc_name); const secure_vector name_bits = nist_key_unwrap_padded(raw_name.data(), raw_name.size(), *m_cipher); std::string pt_name(cast_uint8_ptr_to_char(name_bits.data()), name_bits.size()); names.insert(pt_name); } catch(Integrity_Failure&) { } } return names; } void Encrypted_PSK_Database::remove(const std::string& name) { const std::vector wrapped_name = nist_key_wrap_padded(cast_char_ptr_to_uint8(name.data()), name.size(), *m_cipher); this->kv_del(base64_encode(wrapped_name)); } secure_vector Encrypted_PSK_Database::get(const std::string& name) const { const std::vector wrapped_name = nist_key_wrap_padded(cast_char_ptr_to_uint8(name.data()), name.size(), *m_cipher); const std::string val_base64 = kv_get(base64_encode(wrapped_name)); if(val_base64.empty()) throw Invalid_Argument("Named PSK not located"); const secure_vector val = base64_decode(val_base64); std::unique_ptr wrap_cipher(m_cipher->clone()); wrap_cipher->set_key(m_hmac->process(wrapped_name)); return nist_key_unwrap_padded(val.data(), val.size(), *wrap_cipher); } void Encrypted_PSK_Database::set(const std::string& name, const uint8_t val[], size_t len) { /* * Both as a basic precaution wrt key seperation, and specifically to prevent * cut-and-paste attacks against the database, each PSK is encrypted with a * distinct key which is derived by hashing the wrapped key name with HMAC. */ const std::vector wrapped_name = nist_key_wrap_padded(cast_char_ptr_to_uint8(name.data()), name.size(), *m_cipher); std::unique_ptr wrap_cipher(m_cipher->clone()); wrap_cipher->set_key(m_hmac->process(wrapped_name)); const std::vector wrapped_key = nist_key_wrap_padded(val, len, *wrap_cipher); this->kv_set(base64_encode(wrapped_name), base64_encode(wrapped_key)); } } botan-2.4.0/src/lib/psk_db/psk_db.h000066400000000000000000000102711322470703100170320ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PSK_DB_H_ #define BOTAN_PSK_DB_H_ #include #include #include #include namespace Botan { class BlockCipher; class MessageAuthenticationCode; /** * This is an interface to a generic PSK (pre-shared key) database. * It might be implemented as a plaintext storage or via some mechanism * that encrypts the keys and/or values. */ class BOTAN_PUBLIC_API(2,4) PSK_Database { public: /** * Return the set of names for which get() will return a value. */ virtual std::set list_names() const = 0; /** * Return the value associated with the specified @param name or otherwise * throw an exception. */ virtual secure_vector get(const std::string& name) const = 0; /** * Set a value that can later be accessed with get(). * If name already exists in the database, the old value will be overwritten. */ virtual void set(const std::string& name, const uint8_t psk[], size_t psk_len) = 0; /** * Remove a PSK from the database */ virtual void remove(const std::string& name) = 0; /** * Returns if the values in the PSK database are encrypted. If * false, saved values are being stored in plaintext. */ virtual bool is_encrypted() const = 0; /** * Get a PSK in the form of a string (eg if the PSK is a password) */ std::string get_str(const std::string& name) const { secure_vector psk = get(name); return std::string(cast_uint8_ptr_to_char(psk.data()), psk.size()); } void set_str(const std::string& name, const std::string& psk) { set(name, cast_char_ptr_to_uint8(psk.data()), psk.size()); } template void set_vec(const std::string& name, const std::vector& psk) { set(name, psk.data(), psk.size()); } virtual ~PSK_Database() = default; }; /** * A mixin for an encrypted PSK database. * Both keys and values are encrypted with NIST AES-256 key wrapping. * Values are padded to obscure their length before encryption, allowing * it to be used as a password vault. * * Subclasses must implement the virtual calls to handle storing and * getting raw (base64 encoded) values. */ class BOTAN_PUBLIC_API(2,4) Encrypted_PSK_Database : public PSK_Database { public: /** * @param master_key specifies the master key used to encrypt all * keys and value. It can be of any length, but should be at least 256 bits. * * Subkeys for the cryptographic algorithms used are derived from this * master key. No key stretching is performed; if encrypting a PSK database * using a password, it is recommended to use PBKDF2 to derive the database * master key. */ Encrypted_PSK_Database(const secure_vector& master_key); ~Encrypted_PSK_Database(); std::set list_names() const override; secure_vector get(const std::string& name) const override; void set(const std::string& name, const uint8_t psk[], size_t psk_len) override; void remove(const std::string& name) override; bool is_encrypted() const override { return true; } protected: /** * Save a encrypted (name.value) pair to the database. Both will be base64 encoded strings. */ virtual void kv_set(const std::string& index, const std::string& value) = 0; /** * Get a value previously saved with set_raw_value. Should return an empty * string if index is not found. */ virtual std::string kv_get(const std::string& index) const = 0; /** * Remove an index */ virtual void kv_del(const std::string& index) = 0; /** * Return all indexes in the table. */ virtual std::set kv_get_all() const = 0; private: std::unique_ptr m_cipher; std::unique_ptr m_hmac; secure_vector m_wrap_key; }; } #endif botan-2.4.0/src/lib/psk_db/psk_db_sql.cpp000066400000000000000000000033221322470703100202430ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { Encrypted_PSK_Database_SQL::Encrypted_PSK_Database_SQL(const secure_vector& master_key, std::shared_ptr db, const std::string& table_name) : Encrypted_PSK_Database(master_key), m_db(db), m_table_name(table_name) { m_db->create_table( "create table if not exists " + m_table_name + "(psk_name TEXT PRIMARY KEY, psk_value TEXT)"); } void Encrypted_PSK_Database_SQL::kv_del(const std::string& name) { auto stmt = m_db->new_statement("delete from " + m_table_name + " where psk_name=?1"); stmt->bind(1, name); stmt->spin(); } void Encrypted_PSK_Database_SQL::kv_set(const std::string& name, const std::string& value) { auto stmt = m_db->new_statement("insert or replace into " + m_table_name + " values(?1, ?2)"); stmt->bind(1, name); stmt->bind(2, value); stmt->spin(); } std::string Encrypted_PSK_Database_SQL::kv_get(const std::string& name) const { auto stmt = m_db->new_statement("select psk_value from " + m_table_name + " where psk_name = ?1"); stmt->bind(1, name); while(stmt->step()) { return stmt->get_str(0); } return ""; } std::set Encrypted_PSK_Database_SQL::kv_get_all() const { std::set names; auto stmt = m_db->new_statement("select psk_name from " + m_table_name); while(stmt->step()) { names.insert(stmt->get_str(0)); } return names; } } botan-2.4.0/src/lib/psk_db/psk_db_sql.h000066400000000000000000000016201322470703100177070ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PSK_DB_SQL_H_ #define BOTAN_PSK_DB_SQL_H_ #include #include namespace Botan { class BOTAN_PUBLIC_API(2,4) Encrypted_PSK_Database_SQL : public Encrypted_PSK_Database { public: Encrypted_PSK_Database_SQL(const secure_vector& master_key, std::shared_ptr db, const std::string& table_name); private: void kv_set(const std::string& index, const std::string& value) override; std::string kv_get(const std::string& index) const override; void kv_del(const std::string& index) override; std::set kv_get_all() const override; std::shared_ptr m_db; const std::string m_table_name; }; } #endif botan-2.4.0/src/lib/pubkey/000077500000000000000000000000001322470703100154535ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/blinding.cpp000066400000000000000000000027101322470703100177450ustar00rootroot00000000000000/* * Blinding for public key operations * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { Blinder::Blinder(const BigInt& modulus, RandomNumberGenerator& rng, std::function fwd, std::function inv) : m_reducer(modulus), m_rng(rng), m_fwd_fn(fwd), m_inv_fn(inv), m_modulus_bits(modulus.bits()), m_e{}, m_d{}, m_counter{} { const BigInt k = blinding_nonce(); m_e = m_fwd_fn(k); m_d = m_inv_fn(k); } BigInt Blinder::blinding_nonce() const { return BigInt(m_rng, m_modulus_bits - 1); } BigInt Blinder::blind(const BigInt& i) const { if(!m_reducer.initialized()) throw Exception("Blinder not initialized, cannot blind"); ++m_counter; if((BOTAN_BLINDING_REINIT_INTERVAL > 0) && (m_counter > BOTAN_BLINDING_REINIT_INTERVAL)) { const BigInt k = blinding_nonce(); m_e = m_fwd_fn(k); m_d = m_inv_fn(k); m_counter = 0; } else { m_e = m_reducer.square(m_e); m_d = m_reducer.square(m_d); } return m_reducer.multiply(i, m_e); } BigInt Blinder::unblind(const BigInt& i) const { if(!m_reducer.initialized()) throw Exception("Blinder not initialized, cannot unblind"); return m_reducer.multiply(i, m_d); } } botan-2.4.0/src/lib/pubkey/blinding.h000066400000000000000000000037451322470703100174230ustar00rootroot00000000000000/* * Blinding for public key operations * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BLINDER_H_ #define BOTAN_BLINDER_H_ #include #include #include namespace Botan { class RandomNumberGenerator; /** * Blinding Function Object. */ class BOTAN_PUBLIC_API(2,0) Blinder final { public: /** * Blind a value. * The blinding nonce k is freshly generated after * BOTAN_BLINDING_REINIT_INTERVAL calls to blind(). * BOTAN_BLINDING_REINIT_INTERVAL = 0 means a fresh * nonce is only generated once. On every other call, * an updated nonce is used for blinding: k' = k*k mod n. * @param x value to blind * @return blinded value */ BigInt blind(const BigInt& x) const; /** * Unblind a value. * @param x value to unblind * @return unblinded value */ BigInt unblind(const BigInt& x) const; /** * @param modulus the modulus * @param rng the RNG to use for generating the nonce * @param fwd_func a function that calculates the modular * exponentiation of the public exponent and the given value (the nonce) * @param inv_func a function that calculates the modular inverse * of the given value (the nonce) */ Blinder(const BigInt& modulus, RandomNumberGenerator& rng, std::function fwd_func, std::function inv_func); Blinder(const Blinder&) = delete; Blinder& operator=(const Blinder&) = delete; private: BigInt blinding_nonce() const; Modular_Reducer m_reducer; RandomNumberGenerator& m_rng; std::function m_fwd_fn; std::function m_inv_fn; size_t m_modulus_bits = 0; mutable BigInt m_e, m_d; mutable size_t m_counter = 0; }; } #endif botan-2.4.0/src/lib/pubkey/cecpq1/000077500000000000000000000000001322470703100166275ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/cecpq1/cecpq1.cpp000066400000000000000000000030071322470703100205070ustar00rootroot00000000000000/* * CECPQ1 (x25519 + NewHope) * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { void CECPQ1_offer(uint8_t send[CECPQ1_OFFER_BYTES], CECPQ1_key* offer_key_output, RandomNumberGenerator& rng) { offer_key_output->m_x25519 = rng.random_vec(32); curve25519_basepoint(send, offer_key_output->m_x25519.data()); newhope_keygen(send + 32, &offer_key_output->m_newhope, rng, Newhope_Mode::BoringSSL); } void CECPQ1_accept(uint8_t shared_key[CECPQ1_SHARED_KEY_BYTES], uint8_t send[CECPQ1_ACCEPT_BYTES], const uint8_t received[CECPQ1_OFFER_BYTES], RandomNumberGenerator& rng) { secure_vector x25519_key = rng.random_vec(32); curve25519_basepoint(send, x25519_key.data()); curve25519_donna(shared_key, x25519_key.data(), received); newhope_sharedb(shared_key + 32, send + 32, received + 32, rng, Newhope_Mode::BoringSSL); } void CECPQ1_finish(uint8_t shared_key[CECPQ1_SHARED_KEY_BYTES], const CECPQ1_key& offer_key, const uint8_t received[CECPQ1_ACCEPT_BYTES]) { curve25519_donna(shared_key, offer_key.m_x25519.data(), received); newhope_shareda(shared_key + 32, &offer_key.m_newhope, received + 32, Newhope_Mode::BoringSSL); } } botan-2.4.0/src/lib/pubkey/cecpq1/cecpq1.h000066400000000000000000000017151322470703100201600ustar00rootroot00000000000000/* * CECPQ1 (x25519 + NewHope) * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CECPQ1_H_ #define BOTAN_CECPQ1_H_ #include #include namespace Botan { class CECPQ1_key final { public: secure_vector m_x25519; newhope_poly m_newhope; }; void BOTAN_PUBLIC_API(2,0) CECPQ1_offer(uint8_t* offer_message, CECPQ1_key* offer_key_output, RandomNumberGenerator& rng); void BOTAN_PUBLIC_API(2,0) CECPQ1_accept(uint8_t* shared_key, uint8_t* accept_message, const uint8_t* offer_message, RandomNumberGenerator& rng); void BOTAN_PUBLIC_API(2,0) CECPQ1_finish(uint8_t* shared_key, const CECPQ1_key& offer_key, const uint8_t* accept_message); } #endif botan-2.4.0/src/lib/pubkey/cecpq1/info.txt000066400000000000000000000001241322470703100203200ustar00rootroot00000000000000 CECPQ1 -> 20161116 newhope curve25519 botan-2.4.0/src/lib/pubkey/curve25519/000077500000000000000000000000001322470703100172055ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/curve25519/curve25519.cpp000066400000000000000000000077051322470703100214540ustar00rootroot00000000000000/* * Curve25519 * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32]) { const uint8_t basepoint[32] = { 9 }; curve25519_donna(mypublic, secret, basepoint); } namespace { void size_check(size_t size, const char* thing) { if(size != 32) throw Decoding_Error("Invalid size " + std::to_string(size) + " for Curve25519 " + thing); } secure_vector curve25519(const secure_vector& secret, const uint8_t pubval[32]) { secure_vector out(32); curve25519_donna(out.data(), secret.data(), pubval); return out; } } AlgorithmIdentifier Curve25519_PublicKey::algorithm_identifier() const { // AlgorithmIdentifier::USE_NULL_PARAM puts 0x05 0x00 in parameters // We want nothing std::vector empty; return AlgorithmIdentifier(get_oid(), empty); } bool Curve25519_PublicKey::check_key(RandomNumberGenerator&, bool) const { return true; // no tests possible? } Curve25519_PublicKey::Curve25519_PublicKey(const AlgorithmIdentifier&, const std::vector& key_bits) { m_public = key_bits; size_check(m_public.size(), "public key"); } std::vector Curve25519_PublicKey::public_key_bits() const { return m_public; } Curve25519_PrivateKey::Curve25519_PrivateKey(const secure_vector& secret_key) { if(secret_key.size() != 32) throw Decoding_Error("Invalid size for Curve25519 private key"); m_public.resize(32); m_private = secret_key; curve25519_basepoint(m_public.data(), m_private.data()); } Curve25519_PrivateKey::Curve25519_PrivateKey(RandomNumberGenerator& rng) { m_private = rng.random_vec(32); m_public.resize(32); curve25519_basepoint(m_public.data(), m_private.data()); } Curve25519_PrivateKey::Curve25519_PrivateKey(const AlgorithmIdentifier&, const secure_vector& key_bits) { BER_Decoder(key_bits).decode(m_private, OCTET_STRING).discard_remaining(); size_check(m_private.size(), "private key"); m_public.resize(32); curve25519_basepoint(m_public.data(), m_private.data()); } secure_vector Curve25519_PrivateKey::private_key_bits() const { return DER_Encoder().encode(m_private, OCTET_STRING).get_contents(); } bool Curve25519_PrivateKey::check_key(RandomNumberGenerator&, bool) const { std::vector public_point(32); curve25519_basepoint(public_point.data(), m_private.data()); return public_point == m_public; } secure_vector Curve25519_PrivateKey::agree(const uint8_t w[], size_t w_len) const { size_check(w_len, "public value"); return curve25519(m_private, w); } namespace { /** * Curve25519 operation */ class Curve25519_KA_Operation final : public PK_Ops::Key_Agreement_with_KDF { public: Curve25519_KA_Operation(const Curve25519_PrivateKey& key, const std::string& kdf) : PK_Ops::Key_Agreement_with_KDF(kdf), m_key(key) {} secure_vector raw_agree(const uint8_t w[], size_t w_len) override { return m_key.agree(w, w_len); } private: const Curve25519_PrivateKey& m_key; }; } std::unique_ptr Curve25519_PrivateKey::create_key_agreement_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new Curve25519_KA_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/curve25519/curve25519.h000066400000000000000000000072631322470703100211200ustar00rootroot00000000000000/* * Curve25519 * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CURVE_25519_H_ #define BOTAN_CURVE_25519_H_ #include namespace Botan { class BOTAN_PUBLIC_API(2,0) Curve25519_PublicKey : public virtual Public_Key { public: std::string algo_name() const override { return "Curve25519"; } size_t estimated_strength() const override { return 128; } size_t key_length() const override { return 255; } bool check_key(RandomNumberGenerator& rng, bool strong) const override; AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; std::vector public_value() const { return m_public; } /** * Create a Curve25519 Public Key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ Curve25519_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits); /** * Create a Curve25519 Public Key. * @param pub 32-byte raw public key */ explicit Curve25519_PublicKey(const std::vector& pub) : m_public(pub) {} /** * Create a Curve25519 Public Key. * @param pub 32-byte raw public key */ explicit Curve25519_PublicKey(const secure_vector& pub) : m_public(pub.begin(), pub.end()) {} protected: Curve25519_PublicKey() = default; std::vector m_public; }; class BOTAN_PUBLIC_API(2,0) Curve25519_PrivateKey final : public Curve25519_PublicKey, public virtual Private_Key, public virtual PK_Key_Agreement_Key { public: /** * Construct a private key from the specified parameters. * @param alg_id the X.509 algorithm identifier * @param key_bits PKCS #8 structure */ Curve25519_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Generate a private key. * @param rng the RNG to use */ explicit Curve25519_PrivateKey(RandomNumberGenerator& rng); /** * Construct a private key from the specified parameters. * @param secret_key the private key */ explicit Curve25519_PrivateKey(const secure_vector& secret_key); std::vector public_value() const override { return Curve25519_PublicKey::public_value(); } secure_vector agree(const uint8_t w[], size_t w_len) const; const secure_vector& get_x() const { return m_private; } secure_vector private_key_bits() const override; bool check_key(RandomNumberGenerator& rng, bool strong) const override; std::unique_ptr create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; private: secure_vector m_private; }; /* * The types above are just wrappers for curve25519_donna, plus defining * encodings for public and private keys. */ void BOTAN_PUBLIC_API(2,0) curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32]); /** * Exponentiate by the x25519 base point * @param mypublic output value * @param secret random scalar */ void BOTAN_PUBLIC_API(2,0) curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32]); } #endif botan-2.4.0/src/lib/pubkey/curve25519/donna.cpp000066400000000000000000000321431322470703100210130ustar00rootroot00000000000000/* * curve25519-donna-c64.c from github.com/agl/curve25519-donna * revision 80ad9b9930c9baef5829dd2a235b6b7646d32a8e */ /* Copyright 2008, Google Inc. * All rights reserved. * * Code released into the public domain. * * curve25519-donna: Curve25519 elliptic curve, public key function * * https://code.google.com/p/curve25519-donna/ * * Adam Langley * * Derived from public domain C code by Daniel J. Bernstein * * More information about curve25519 can be found here * https://cr.yp.to/ecdh.html * * djb's sample implementation of curve25519 is written in a special assembly * language called qhasm and uses the floating point registers. * * This is, almost, a clean room reimplementation from the curve25519 paper. It * uses many of the tricks described therein. Only the crecip function is taken * from the sample implementation. */ #include #include #include #include #include namespace Botan { typedef uint8_t u8; typedef uint64_t limb; typedef limb felem[5]; typedef struct { limb* x; limb* z; } fmonty_pair_t; typedef struct { fmonty_pair_t q; fmonty_pair_t q_dash; const limb* q_minus_q_dash; } fmonty_in_t; typedef struct { fmonty_pair_t two_q; fmonty_pair_t q_plus_q_dash; } fmonty_out_t; #if !defined(BOTAN_TARGET_HAS_NATIVE_UINT128) typedef donna128 uint128_t; #endif /* Sum two numbers: output += in */ static inline void fsum(limb *output, const limb *in) { output[0] += in[0]; output[1] += in[1]; output[2] += in[2]; output[3] += in[3]; output[4] += in[4]; } /* Find the difference of two numbers: output = in - output * (note the order of the arguments!) * * Assumes that out[i] < 2**52 * On return, out[i] < 2**55 */ static inline void fdifference_backwards(felem out, const felem in) { /* 152 is 19 << 3 */ static const limb two54m152 = (static_cast(1) << 54) - 152; static const limb two54m8 = (static_cast(1) << 54) - 8; out[0] = in[0] + two54m152 - out[0]; out[1] = in[1] + two54m8 - out[1]; out[2] = in[2] + two54m8 - out[2]; out[3] = in[3] + two54m8 - out[3]; out[4] = in[4] + two54m8 - out[4]; } /* Multiply a number by a scalar: output = in * scalar */ static inline void fscalar_product(felem output, const felem in, const limb scalar) { uint128_t a = uint128_t(in[0]) * scalar; output[0] = a & 0x7ffffffffffff; a = uint128_t(in[1]) * scalar + carry_shift(a, 51); output[1] = a & 0x7ffffffffffff; a = uint128_t(in[2]) * scalar + carry_shift(a, 51); output[2] = a & 0x7ffffffffffff; a = uint128_t(in[3]) * scalar + carry_shift(a, 51); output[3] = a & 0x7ffffffffffff; a = uint128_t(in[4]) * scalar + carry_shift(a, 51); output[4] = a & 0x7ffffffffffff; output[0] += carry_shift(a, 51) * 19; } /* Multiply two numbers: output = in2 * in * * output must be distinct to both inputs. The inputs are reduced coefficient * form, the output is not. * * Assumes that in[i] < 2**55 and likewise for in2. * On return, output[i] < 2**52 */ static inline void fmul(felem output, const felem in2, const felem in) { uint128_t t[5]; limb r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c; r0 = in[0]; r1 = in[1]; r2 = in[2]; r3 = in[3]; r4 = in[4]; s0 = in2[0]; s1 = in2[1]; s2 = in2[2]; s3 = in2[3]; s4 = in2[4]; t[0] = uint128_t(r0) * s0; t[1] = uint128_t(r0) * s1 + uint128_t(r1) * s0; t[2] = uint128_t(r0) * s2 + uint128_t(r2) * s0 + uint128_t(r1) * s1; t[3] = uint128_t(r0) * s3 + uint128_t(r3) * s0 + uint128_t(r1) * s2 + uint128_t(r2) * s1; t[4] = uint128_t(r0) * s4 + uint128_t(r4) * s0 + uint128_t(r3) * s1 + uint128_t(r1) * s3 + uint128_t(r2) * s2; r4 *= 19; r1 *= 19; r2 *= 19; r3 *= 19; t[0] += uint128_t(r4) * s1 + uint128_t(r1) * s4 + uint128_t(r2) * s3 + uint128_t(r3) * s2; t[1] += uint128_t(r4) * s2 + uint128_t(r2) * s4 + uint128_t(r3) * s3; t[2] += uint128_t(r4) * s3 + uint128_t(r3) * s4; t[3] += uint128_t(r4) * s4; r0 = t[0] & 0x7ffffffffffff; c = carry_shift(t[0], 51); t[1] += c; r1 = t[1] & 0x7ffffffffffff; c = carry_shift(t[1], 51); t[2] += c; r2 = t[2] & 0x7ffffffffffff; c = carry_shift(t[2], 51); t[3] += c; r3 = t[3] & 0x7ffffffffffff; c = carry_shift(t[3], 51); t[4] += c; r4 = t[4] & 0x7ffffffffffff; c = carry_shift(t[4], 51); r0 += c * 19; c = carry_shift(r0, 51); r0 = r0 & 0x7ffffffffffff; r1 += c; c = carry_shift(r1, 51); r1 = r1 & 0x7ffffffffffff; r2 += c; output[0] = r0; output[1] = r1; output[2] = r2; output[3] = r3; output[4] = r4; } static inline void fsquare_times(felem output, const felem in, limb count) { uint128_t t[5]; limb r0,r1,r2,r3,r4,c; limb d0,d1,d2,d4,d419; r0 = in[0]; r1 = in[1]; r2 = in[2]; r3 = in[3]; r4 = in[4]; do { d0 = r0 * 2; d1 = r1 * 2; d2 = r2 * 2 * 19; d419 = r4 * 19; d4 = d419 * 2; t[0] = uint128_t(r0) * r0 + uint128_t(d4) * r1 + uint128_t(d2) * (r3 ); t[1] = uint128_t(d0) * r1 + uint128_t(d4) * r2 + uint128_t(r3) * (r3 * 19); t[2] = uint128_t(d0) * r2 + uint128_t(r1) * r1 + uint128_t(d4) * (r3 ); t[3] = uint128_t(d0) * r3 + uint128_t(d1) * r2 + uint128_t(r4) * (d419 ); t[4] = uint128_t(d0) * r4 + uint128_t(d1) * r3 + uint128_t(r2) * (r2 ); r0 = t[0] & 0x7ffffffffffff; c = carry_shift(t[0], 51); t[1] += c; r1 = t[1] & 0x7ffffffffffff; c = carry_shift(t[1], 51); t[2] += c; r2 = t[2] & 0x7ffffffffffff; c = carry_shift(t[2], 51); t[3] += c; r3 = t[3] & 0x7ffffffffffff; c = carry_shift(t[3], 51); t[4] += c; r4 = t[4] & 0x7ffffffffffff; c = carry_shift(t[4], 51); r0 += c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff; r1 += c; c = r1 >> 51; r1 = r1 & 0x7ffffffffffff; r2 += c; } while(--count); output[0] = r0; output[1] = r1; output[2] = r2; output[3] = r3; output[4] = r4; } /* Load a little-endian 64-bit number */ static limb load_limb(const u8 *in) { return load_le(in, 0); } static void store_limb(u8 *out, limb in) { store_le(in, out); } /* Take a little-endian, 32-byte number and expand it into polynomial form */ static void fexpand(limb *output, const u8 *in) { output[0] = load_limb(in) & 0x7ffffffffffff; output[1] = (load_limb(in+6) >> 3) & 0x7ffffffffffff; output[2] = (load_limb(in+12) >> 6) & 0x7ffffffffffff; output[3] = (load_limb(in+19) >> 1) & 0x7ffffffffffff; output[4] = (load_limb(in+24) >> 12) & 0x7ffffffffffff; } /* Take a fully reduced polynomial form number and contract it into a * little-endian, 32-byte array */ static void fcontract(u8 *output, const felem input) { uint128_t t[5]; t[0] = input[0]; t[1] = input[1]; t[2] = input[2]; t[3] = input[3]; t[4] = input[4]; t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; t[0] += (t[4] >> 51) * 19; t[4] &= 0x7ffffffffffff; t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; t[0] += (t[4] >> 51) * 19; t[4] &= 0x7ffffffffffff; /* now t is between 0 and 2^255-1, properly carried. */ /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */ t[0] += 19; t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; t[0] += (t[4] >> 51) * 19; t[4] &= 0x7ffffffffffff; /* now between 19 and 2^255-1 in both cases, and offset by 19. */ t[0] += 0x8000000000000 - 19; t[1] += 0x8000000000000 - 1; t[2] += 0x8000000000000 - 1; t[3] += 0x8000000000000 - 1; t[4] += 0x8000000000000 - 1; /* now between 2^255 and 2^256-20, and offset by 2^255. */ t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff; t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff; t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff; t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff; t[4] &= 0x7ffffffffffff; store_limb(output, combine_lower(t[0], 0, t[1], 51)); store_limb(output+8, combine_lower(t[1], 13, t[2], 38)); store_limb(output+16, combine_lower(t[2], 26, t[3], 25)); store_limb(output+24, combine_lower(t[3], 39, t[4], 12)); } /* Input: Q, Q', Q-Q' * Output: 2Q, Q+Q' * * result.two_q (2*Q): long form * result.q_plus_q_dash (Q + Q): long form * in.q: short form, destroyed * in.q_dash: short form, destroyed * in.q_minus_q_dash: short form, preserved */ static void fmonty(fmonty_out_t& result, fmonty_in_t& in) { limb origx[5], origxprime[5], zzz[5], xx[5], zz[5], xxprime[5], zzprime[5], zzzprime[5]; copy_mem(origx, in.q.x, 5); fsum(in.q.x, in.q.z); fdifference_backwards(in.q.z, origx); // does x - z copy_mem(origxprime, in.q_dash.x, 5); fsum(in.q_dash.x, in.q_dash.z); fdifference_backwards(in.q_dash.z, origxprime); fmul(xxprime, in.q_dash.x, in.q.z); fmul(zzprime, in.q.x, in.q_dash.z); copy_mem(origxprime, xxprime, 5); fsum(xxprime, zzprime); fdifference_backwards(zzprime, origxprime); fsquare_times(result.q_plus_q_dash.x, xxprime, 1); fsquare_times(zzzprime, zzprime, 1); fmul(result.q_plus_q_dash.z, zzzprime, in.q_minus_q_dash); fsquare_times(xx, in.q.x, 1); fsquare_times(zz, in.q.z, 1); fmul(result.two_q.x, xx, zz); fdifference_backwards(zz, xx); // does zz = xx - zz fscalar_product(zzz, zz, 121665); fsum(zzz, xx); fmul(result.two_q.z, zz, zzz); } // ----------------------------------------------------------------------------- // Maybe swap the contents of two limb arrays (@a and @b), each @len elements // long. Perform the swap iff @swap is non-zero. // // This function performs the swap without leaking any side-channel // information. // ----------------------------------------------------------------------------- static void swap_conditional(limb a[5], limb b[5], limb iswap) { unsigned i; const limb swap = static_cast(-iswap); for (i = 0; i < 5; ++i) { const limb x = swap & (a[i] ^ b[i]); a[i] ^= x; b[i] ^= x; } } /* Calculates nQ where Q is the x-coordinate of a point on the curve * * resultx/resultz: the x coordinate of the resulting curve point (short form) * n: a little endian, 32-byte number * q: a point of the curve (short form) */ static void cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { limb a[5] = {0}, b[5] = {1}, c[5] = {1}, d[5] = {0}; limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t; limb e[5] = {0}, f[5] = {1}, g[5] = {0}, h[5] = {1}; limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h; unsigned i, j; copy_mem(nqpqx, q, 5); for (i = 0; i < 32; ++i) { u8 byteval = n[31 - i]; for (j = 0; j < 8; ++j) { const limb bit = byteval >> 7; swap_conditional(nqx, nqpqx, bit); swap_conditional(nqz, nqpqz, bit); fmonty_out_t result { {nqx2, nqz2}, {nqpqx2, nqpqz2} }; fmonty_in_t in { { nqx, nqz }, { nqpqx, nqpqz }, q }; fmonty(result, in); swap_conditional(nqx2, nqpqx2, bit); swap_conditional(nqz2, nqpqz2, bit); t = nqx; nqx = nqx2; nqx2 = t; t = nqz; nqz = nqz2; nqz2 = t; t = nqpqx; nqpqx = nqpqx2; nqpqx2 = t; t = nqpqz; nqpqz = nqpqz2; nqpqz2 = t; byteval <<= 1; } } copy_mem(resultx, nqx, 5); copy_mem(resultz, nqz, 5); } // ----------------------------------------------------------------------------- // Shamelessly copied from djb's code, tightened a little // ----------------------------------------------------------------------------- static void crecip(felem out, const felem z) { felem a,t0,b,c; /* 2 */ fsquare_times(a, z, 1); // a = 2 /* 8 */ fsquare_times(t0, a, 2); /* 9 */ fmul(b, t0, z); // b = 9 /* 11 */ fmul(a, b, a); // a = 11 /* 22 */ fsquare_times(t0, a, 1); /* 2^5 - 2^0 = 31 */ fmul(b, t0, b); /* 2^10 - 2^5 */ fsquare_times(t0, b, 5); /* 2^10 - 2^0 */ fmul(b, t0, b); /* 2^20 - 2^10 */ fsquare_times(t0, b, 10); /* 2^20 - 2^0 */ fmul(c, t0, b); /* 2^40 - 2^20 */ fsquare_times(t0, c, 20); /* 2^40 - 2^0 */ fmul(t0, t0, c); /* 2^50 - 2^10 */ fsquare_times(t0, t0, 10); /* 2^50 - 2^0 */ fmul(b, t0, b); /* 2^100 - 2^50 */ fsquare_times(t0, b, 50); /* 2^100 - 2^0 */ fmul(c, t0, b); /* 2^200 - 2^100 */ fsquare_times(t0, c, 100); /* 2^200 - 2^0 */ fmul(t0, t0, c); /* 2^250 - 2^50 */ fsquare_times(t0, t0, 50); /* 2^250 - 2^0 */ fmul(t0, t0, b); /* 2^255 - 2^5 */ fsquare_times(t0, t0, 5); /* 2^255 - 21 */ fmul(out, t0, a); } void curve25519_donna(u8 *mypublic, const u8 *secret, const u8 *basepoint) { CT::poison(secret, 32); CT::poison(basepoint, 32); limb bp[5], x[5], z[5], zmone[5]; uint8_t e[32]; int i; for (i = 0;i < 32;++i) e[i] = secret[i]; e[0] &= 248; e[31] &= 127; e[31] |= 64; fexpand(bp, basepoint); cmult(x, z, e, bp); crecip(zmone, z); fmul(z, x, zmone); fcontract(mypublic, z); CT::unpoison(secret, 32); CT::unpoison(basepoint, 32); CT::unpoison(mypublic, 32); } } botan-2.4.0/src/lib/pubkey/curve25519/info.txt000066400000000000000000000001341322470703100206770ustar00rootroot00000000000000 CURVE_25519 -> 20170621 curve25519.h botan-2.4.0/src/lib/pubkey/dh/000077500000000000000000000000001322470703100160465ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/dh/dh.cpp000066400000000000000000000060551322470703100171530ustar00rootroot00000000000000/* * Diffie-Hellman * (C) 1999-2007,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * DH_PublicKey Constructor */ DH_PublicKey::DH_PublicKey(const DL_Group& grp, const BigInt& y1) { m_group = grp; m_y = y1; } /* * Return the public value for key agreement */ std::vector DH_PublicKey::public_value() const { return unlock(BigInt::encode_1363(m_y, group_p().bytes())); } /* * Create a DH private key */ DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { m_group = grp; if(x_arg == 0) { const BigInt& p = group_p(); m_x.randomize(rng, dl_exponent_size(p.bits())); } else { m_x = x_arg; } if(m_y == 0) { m_y = power_mod(group_g(), m_x, group_p()); } } /* * Load a DH private key */ DH_PrivateKey::DH_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_42) { if(m_y == 0) m_y = power_mod(group_g(), m_x, group_p()); } /* * Return the public value for key agreement */ std::vector DH_PrivateKey::public_value() const { return DH_PublicKey::public_value(); } namespace { /** * DH operation */ class DH_KA_Operation final : public PK_Ops::Key_Agreement_with_KDF { public: DH_KA_Operation(const DH_PrivateKey& key, const std::string& kdf, RandomNumberGenerator& rng) : PK_Ops::Key_Agreement_with_KDF(kdf), m_p(key.group_p()), m_powermod_x_p(key.get_x(), m_p), m_blinder(m_p, rng, [](const BigInt& k) { return k; }, [this](const BigInt& k) { return m_powermod_x_p(inverse_mod(k, m_p)); }) {} secure_vector raw_agree(const uint8_t w[], size_t w_len) override; private: const BigInt& m_p; Fixed_Exponent_Power_Mod m_powermod_x_p; Blinder m_blinder; }; secure_vector DH_KA_Operation::raw_agree(const uint8_t w[], size_t w_len) { BigInt input = BigInt::decode(w, w_len); if(input <= 1 || input >= m_p - 1) throw Invalid_Argument("DH agreement - invalid key provided"); BigInt r = m_blinder.unblind(m_powermod_x_p(m_blinder.blind(input))); return BigInt::encode_1363(r, m_p.bytes()); } } std::unique_ptr DH_PrivateKey::create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new DH_KA_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/dh/dh.h000066400000000000000000000045341322470703100166200ustar00rootroot00000000000000/* * Diffie-Hellman * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DIFFIE_HELLMAN_H_ #define BOTAN_DIFFIE_HELLMAN_H_ #include namespace Botan { /** * This class represents Diffie-Hellman public keys. */ class BOTAN_PUBLIC_API(2,0) DH_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const override { return "DH"; } std::vector public_value() const; DL_Group::Format group_format() const override { return DL_Group::ANSI_X9_42; } /** * Create a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ DH_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_42) {} /** * Construct a public key with the specified parameters. * @param grp the DL group to use in the key * @param y the public value y */ DH_PublicKey(const DL_Group& grp, const BigInt& y); protected: DH_PublicKey() = default; }; /** * This class represents Diffie-Hellman private keys. */ class BOTAN_PUBLIC_API(2,0) DH_PrivateKey final : public DH_PublicKey, public PK_Key_Agreement_Key, public virtual DL_Scheme_PrivateKey { public: std::vector public_value() const override; /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits PKCS #8 structure */ DH_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Create a private key. * @param rng random number generator to use * @param grp the group to be used in the key * @param x the key's secret value (or if zero, generate a new key) */ DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x = 0); std::unique_ptr create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/dh/info.txt000066400000000000000000000002151322470703100175400ustar00rootroot00000000000000 DIFFIE_HELLMAN -> 20131128 dh.h dl_algo dl_group numbertheory botan-2.4.0/src/lib/pubkey/dl_algo/000077500000000000000000000000001322470703100170545ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/dl_algo/dl_algo.cpp000066400000000000000000000050331322470703100211620ustar00rootroot00000000000000/* * DL Scheme * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { size_t DL_Scheme_PublicKey::key_length() const { return m_group.get_p().bits(); } size_t DL_Scheme_PublicKey::estimated_strength() const { return dl_work_factor(key_length()); } AlgorithmIdentifier DL_Scheme_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), m_group.DER_encode(group_format())); } std::vector DL_Scheme_PublicKey::public_key_bits() const { return DER_Encoder().encode(m_y).get_contents_unlocked(); } DL_Scheme_PublicKey::DL_Scheme_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits, DL_Group::Format format) { m_group.BER_decode(alg_id.get_parameters(), format); BER_Decoder(key_bits).decode(m_y); } secure_vector DL_Scheme_PrivateKey::private_key_bits() const { return DER_Encoder().encode(m_x).get_contents(); } DL_Scheme_PrivateKey::DL_Scheme_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits, DL_Group::Format format) { m_group.BER_decode(alg_id.get_parameters(), format); BER_Decoder(key_bits).decode(m_x); } /* * Check Public DL Parameters */ bool DL_Scheme_PublicKey::check_key(RandomNumberGenerator& rng, bool strong) const { const BigInt& p = group_p(); if(m_y < 2 || m_y >= p) return false; if(!m_group.verify_group(rng, strong)) return false; try { const BigInt& q = group_q(); if(power_mod(m_y, q, p) != 1) return false; } catch(const Invalid_State&) { return true; } return true; } /* * Check DL Scheme Private Parameters */ bool DL_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { const BigInt& p = group_p(); const BigInt& g = group_g(); if(m_y < 2 || m_y >= p || m_x < 2 || m_x >= p) return false; if(!m_group.verify_group(rng, strong)) return false; if(!strong) return true; if(m_y != power_mod(g, m_x, p)) return false; return true; } } botan-2.4.0/src/lib/pubkey/dl_algo/dl_algo.h000066400000000000000000000066311322470703100206340ustar00rootroot00000000000000/* * DL Scheme * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DL_ALGO_H_ #define BOTAN_DL_ALGO_H_ #include #include namespace Botan { /** * This class represents discrete logarithm (DL) public keys. */ class BOTAN_PUBLIC_API(2,0) DL_Scheme_PublicKey : public virtual Public_Key { public: bool check_key(RandomNumberGenerator& rng, bool) const override; AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; /** * Get the DL domain parameters of this key. * @return DL domain parameters of this key */ const DL_Group& get_domain() const { return m_group; } /** * Get the public value y with y = g^x mod p where x is the secret key. */ const BigInt& get_y() const { return m_y; } /** * Get the prime p of the underlying DL group. * @return prime p */ const BigInt& group_p() const { return m_group.get_p(); } /** * Get the prime q of the underlying DL group. * @return prime q */ const BigInt& group_q() const { return m_group.get_q(); } /** * Get the generator g of the underlying DL group. * @return generator g */ const BigInt& group_g() const { return m_group.get_g(); } /** * Get the underlying groups encoding format. * @return encoding format */ virtual DL_Group::Format group_format() const = 0; size_t key_length() const override; size_t estimated_strength() const override; /** * Create a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits * @param group_format the underlying groups encoding format */ DL_Scheme_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits, DL_Group::Format group_format); DL_Scheme_PublicKey& operator=(const DL_Scheme_PublicKey& other) = default; protected: DL_Scheme_PublicKey() = default; /** * The DL public key */ BigInt m_y; /** * The DL group */ DL_Group m_group; }; /** * This class represents discrete logarithm (DL) private keys. */ class BOTAN_PUBLIC_API(2,0) DL_Scheme_PrivateKey : public virtual DL_Scheme_PublicKey, public virtual Private_Key { public: bool check_key(RandomNumberGenerator& rng, bool) const override; /** * Get the secret key x. * @return secret key */ const BigInt& get_x() const { return m_x; } secure_vector private_key_bits() const override; /** * Create a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded private key bits * @param group_format the underlying groups encoding format */ DL_Scheme_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits, DL_Group::Format group_format); DL_Scheme_PrivateKey& operator=(const DL_Scheme_PrivateKey& other) = default; protected: DL_Scheme_PrivateKey() = default; /** * The DL private key */ BigInt m_x; }; } #endif botan-2.4.0/src/lib/pubkey/dl_algo/info.txt000066400000000000000000000001551322470703100205510ustar00rootroot00000000000000 DL_PUBLIC_KEY_FAMILY -> 20131128 asn1 dl_group numbertheory rng botan-2.4.0/src/lib/pubkey/dl_group/000077500000000000000000000000001322470703100172665ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/dl_group/dl_group.cpp000066400000000000000000000171361322470703100216150ustar00rootroot00000000000000/* * Discrete Logarithm Parameters * (C) 1999-2008,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { /* * DL_Group Constructor */ DL_Group::DL_Group() { m_initialized = false; } /* * DL_Group Constructor */ DL_Group::DL_Group(const std::string& name) { const std::string pem = PEM_for_named_group(name); if(pem == "") throw Invalid_Argument("DL_Group: Unknown group " + name); PEM_decode(pem); } /* * DL_Group Constructor */ DL_Group::DL_Group(RandomNumberGenerator& rng, PrimeType type, size_t pbits, size_t qbits) { if(pbits < 1024) throw Invalid_Argument("DL_Group: prime size " + std::to_string(pbits) + " is too small"); if(type == Strong) { m_p = random_safe_prime(rng, pbits); m_q = (m_p - 1) / 2; m_g = 2; /* Always choose a generator that is quadratic reside mod p, this forces g to be a generator of the subgroup of size q. */ if(jacobi(m_g, m_p) != 1) { // prime table does not contain 2 for(size_t i = 0; i < PRIME_TABLE_SIZE; ++i) { m_g = PRIMES[i]; if(jacobi(m_g, m_p) == 1) break; } } } else if(type == Prime_Subgroup) { if(!qbits) qbits = dl_exponent_size(pbits); m_q = random_prime(rng, qbits); BigInt X; while(m_p.bits() != pbits || !is_prime(m_p, rng)) { X.randomize(rng, pbits); m_p = X - (X % (2*m_q) - 1); } m_g = make_dsa_generator(m_p, m_q); } else if(type == DSA_Kosherizer) { qbits = qbits ? qbits : ((pbits <= 1024) ? 160 : 256); generate_dsa_primes(rng, m_p, m_q, pbits, qbits); m_g = make_dsa_generator(m_p, m_q); } m_initialized = true; } /* * DL_Group Constructor */ DL_Group::DL_Group(RandomNumberGenerator& rng, const std::vector& seed, size_t pbits, size_t qbits) { if(!generate_dsa_primes(rng, m_p, m_q, pbits, qbits, seed)) throw Invalid_Argument("DL_Group: The seed given does not " "generate a DSA group"); m_g = make_dsa_generator(m_p, m_q); m_initialized = true; } /* * DL_Group Constructor */ DL_Group::DL_Group(const BigInt& p1, const BigInt& g1) { initialize(p1, 0, g1); } /* * DL_Group Constructor */ DL_Group::DL_Group(const BigInt& p1, const BigInt& q1, const BigInt& g1) { initialize(p1, q1, g1); } /* * DL_Group Initializer */ void DL_Group::initialize(const BigInt& p1, const BigInt& q1, const BigInt& g1) { if(p1 < 3) throw Invalid_Argument("DL_Group: Prime invalid"); if(g1 < 2 || g1 >= p1) throw Invalid_Argument("DL_Group: Generator invalid"); if(q1 < 0 || q1 >= p1) throw Invalid_Argument("DL_Group: Subgroup invalid"); m_p = p1; m_g = g1; m_q = q1; m_initialized = true; } /* * Verify that the group has been set */ void DL_Group::init_check() const { if(!m_initialized) throw Invalid_State("DLP group cannot be used uninitialized"); } /* * Verify the parameters */ bool DL_Group::verify_group(RandomNumberGenerator& rng, bool strong) const { init_check(); if(m_g < 2 || m_p < 3 || m_q < 0) return false; const size_t prob = (strong) ? 128 : 10; if(m_q != 0) { if((m_p - 1) % m_q != 0) { return false; } if(power_mod(m_g, m_q, m_p) != 1) { return false; } if(!is_prime(m_q, rng, prob)) { return false; } } if(!is_prime(m_p, rng, prob)) { return false; } return true; } /* * Return the prime */ const BigInt& DL_Group::get_p() const { init_check(); return m_p; } /* * Return the generator */ const BigInt& DL_Group::get_g() const { init_check(); return m_g; } /* * Return the subgroup */ const BigInt& DL_Group::get_q() const { init_check(); if(m_q == 0) throw Invalid_State("DLP group has no q prime specified"); return m_q; } /* * DER encode the parameters */ std::vector DL_Group::DER_encode(Format format) const { init_check(); if((m_q == 0) && (format != PKCS_3)) throw Encoding_Error("The ANSI DL parameter formats require a subgroup"); if(format == ANSI_X9_57) { return DER_Encoder() .start_cons(SEQUENCE) .encode(m_p) .encode(m_q) .encode(m_g) .end_cons() .get_contents_unlocked(); } else if(format == ANSI_X9_42) { return DER_Encoder() .start_cons(SEQUENCE) .encode(m_p) .encode(m_g) .encode(m_q) .end_cons() .get_contents_unlocked(); } else if(format == PKCS_3) { return DER_Encoder() .start_cons(SEQUENCE) .encode(m_p) .encode(m_g) .end_cons() .get_contents_unlocked(); } throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); } /* * PEM encode the parameters */ std::string DL_Group::PEM_encode(Format format) const { const std::vector encoding = DER_encode(format); if(format == PKCS_3) return PEM_Code::encode(encoding, "DH PARAMETERS"); else if(format == ANSI_X9_57) return PEM_Code::encode(encoding, "DSA PARAMETERS"); else if(format == ANSI_X9_42) return PEM_Code::encode(encoding, "X9.42 DH PARAMETERS"); else throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); } /* * Decode BER encoded parameters */ void DL_Group::BER_decode(const std::vector& data, Format format) { BigInt new_p, new_q, new_g; BER_Decoder decoder(data); BER_Decoder ber = decoder.start_cons(SEQUENCE); if(format == ANSI_X9_57) { ber.decode(new_p) .decode(new_q) .decode(new_g) .verify_end(); } else if(format == ANSI_X9_42) { ber.decode(new_p) .decode(new_g) .decode(new_q) .discard_remaining(); } else if(format == PKCS_3) { ber.decode(new_p) .decode(new_g) .discard_remaining(); } else throw Invalid_Argument("Unknown DL_Group encoding " + std::to_string(format)); initialize(new_p, new_q, new_g); } /* * Decode PEM encoded parameters */ void DL_Group::PEM_decode(const std::string& pem) { std::string label; auto ber = unlock(PEM_Code::decode(pem, label)); if(label == "DH PARAMETERS") BER_decode(ber, PKCS_3); else if(label == "DSA PARAMETERS") BER_decode(ber, ANSI_X9_57); else if(label == "X942 DH PARAMETERS" || label == "X9.42 DH PARAMETERS") BER_decode(ber, ANSI_X9_42); else throw Decoding_Error("DL_Group: Invalid PEM label " + label); } /* * Create generator of the q-sized subgroup (DSA style generator) */ BigInt DL_Group::make_dsa_generator(const BigInt& p, const BigInt& q) { const BigInt e = (p - 1) / q; if(e == 0 || (p - 1) % q > 0) throw Invalid_Argument("make_dsa_generator q does not divide p-1"); for(size_t i = 0; i != PRIME_TABLE_SIZE; ++i) { BigInt g = power_mod(PRIMES[i], e, p); if(g > 1) return g; } throw Internal_Error("DL_Group: Couldn't create a suitable generator"); } } botan-2.4.0/src/lib/pubkey/dl_group/dl_group.h000066400000000000000000000116521322470703100212570ustar00rootroot00000000000000/* * Discrete Logarithm Group * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DL_PARAM_H_ #define BOTAN_DL_PARAM_H_ #include namespace Botan { /** * This class represents discrete logarithm groups. It holds a prime p, * a prime q = (p-1)/2 and g = x^((p-1)/q) mod p. */ class BOTAN_PUBLIC_API(2,0) DL_Group final { public: /** * Get the prime p. * @return prime p */ const BigInt& get_p() const; /** * Get the prime q. * @return prime q */ const BigInt& get_q() const; /** * Get the base g. * @return base g */ const BigInt& get_g() const; /** * The DL group encoding format variants. */ enum Format { ANSI_X9_42, ANSI_X9_57, PKCS_3, DSA_PARAMETERS = ANSI_X9_57, DH_PARAMETERS = ANSI_X9_42, ANSI_X9_42_DH_PARAMETERS = ANSI_X9_42, PKCS3_DH_PARAMETERS = PKCS_3 }; /** * Determine the prime creation for DL groups. */ enum PrimeType { Strong, Prime_Subgroup, DSA_Kosherizer }; /** * Perform validity checks on the group. * @param rng the rng to use * @param strong whether to perform stronger by lengthier tests * @return true if the object is consistent, false otherwise */ bool verify_group(RandomNumberGenerator& rng, bool strong) const; /** * Encode this group into a string using PEM encoding. * @param format the encoding format * @return string holding the PEM encoded group */ std::string PEM_encode(Format format) const; /** * Encode this group into a string using DER encoding. * @param format the encoding format * @return string holding the DER encoded group */ std::vector DER_encode(Format format) const; /** * Decode a DER/BER encoded group into this instance. * @param ber a vector containing the DER/BER encoded group * @param format the format of the encoded group */ void BER_decode(const std::vector& ber, Format format); /** * Decode a PEM encoded group into this instance. * @param pem the PEM encoding of the group */ void PEM_decode(const std::string& pem); /** * Construct a DL group with uninitialized internal value. * Use this constructor is you wish to set the groups values * from a DER or PEM encoded group. */ DL_Group(); /** * Construct a DL group that is registered in the configuration. * @param name the name that is configured in the global configuration * for the desired group. If no configuration file is specified, * the default values from the file policy.cpp will be used. For instance, * use "modp/ietf/3072". */ DL_Group(const std::string& name); /** * Create a new group randomly. * @param rng the random number generator to use * @param type specifies how the creation of primes p and q shall * be performed. If type=Strong, then p will be determined as a * safe prime, and q will be chosen as (p-1)/2. If * type=Prime_Subgroup and qbits = 0, then the size of q will be * determined according to the estimated difficulty of the DL * problem. If type=DSA_Kosherizer, DSA primes will be created. * @param pbits the number of bits of p * @param qbits the number of bits of q. Leave it as 0 to have * the value determined according to pbits. */ DL_Group(RandomNumberGenerator& rng, PrimeType type, size_t pbits, size_t qbits = 0); /** * Create a DSA group with a given seed. * @param rng the random number generator to use * @param seed the seed to use to create the random primes * @param pbits the desired bit size of the prime p * @param qbits the desired bit size of the prime q. */ DL_Group(RandomNumberGenerator& rng, const std::vector& seed, size_t pbits = 1024, size_t qbits = 0); /** * Create a DL group. The prime q will be determined according to p. * @param p the prime p * @param g the base g */ DL_Group(const BigInt& p, const BigInt& g); /** * Create a DL group. * @param p the prime p * @param q the prime q * @param g the base g */ DL_Group(const BigInt& p, const BigInt& q, const BigInt& g); /** * Return PEM representation of named DL group */ static std::string PEM_for_named_group(const std::string& name); private: static BigInt make_dsa_generator(const BigInt&, const BigInt&); void init_check() const; void initialize(const BigInt&, const BigInt&, const BigInt&); bool m_initialized; BigInt m_p, m_q, m_g; }; } #endif botan-2.4.0/src/lib/pubkey/dl_group/dl_named.cpp000066400000000000000000000760621322470703100215500ustar00rootroot00000000000000/* * List of discrete log groups * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::string DL_Group::PEM_for_named_group(const std::string& name) { if(name == "modp/ietf/1024") return "-----BEGIN X942 DH PARAMETERS-----" "MIIBCgKBgQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezmU4H//////////wIBAgKBgH//" "////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXfUx2JzZEopQQ8xxoCbvfK" "jNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYhdNMb9rWF/65begNb9vcc" "Nf2tRM/S10+SCL4lj/MklDMo9nMpwP//////////" "-----END X942 DH PARAMETERS-----"; if(name == "modp/srp/1024") return "-----BEGIN X942 DH PARAMETERS-----" "MIIBCgKBgQDurwq5rbON1pwz+Ar6j8XoYHJhh3X/PAueojFMnCVldtZ033SW6oHT" "ODtIE9aSxuDg1djiULmL5I5JXB1gidrRXcfXtGFU1rbOjvStabFdSYJVmyl7zxiF" "xSn1ZmYOV+xo7bw8BXJswC/Uy/SXbqqa/VE4/oN2Q1ufxh0vwOsG4wIBAgKBgHdX" "hVzW2cbrThn8BX1H4vQwOTDDuv+eBc9RGKZOErK7azpvukt1QOmcHaQJ60ljcHBq" "7HEoXMXyRySuDrBE7Wiu4+vaMKprW2dHela02K6kwSrNlL3njELilPqzMwcr9jR2" "3h4CuTZgF+pl+ku3VU1+qJx/Qbshrc/jDpfgdYNx" "-----END X942 DH PARAMETERS-----"; if(name == "modp/ietf/1536") return "-----BEGIN X942 DH PARAMETERS-----" "MIIBigKBwQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezkWz3CAHy4oWO/BZjaSDYcVdOa" "aRY/qP0kz1+DZV0j3KOtlhxi81YghVK7ntUpB3CWlm1nDDVOSryYBPF0bAjKI3Mn" "//////////8CAQICgcB//////////+SH7VEQtGEaYmMxRcBuDmiUgScERTPmOgEF" "31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Catrao4SLyQtq7MS8/Y3om" "IXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQzKPZyLZ7hAD5cULHfgsxt" "JBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qUg7hLSzazhhqnJV5MAni6" "NgRlEbmT//////////8=" "-----END X942 DH PARAMETERS-----"; if(name == "modp/srp/1536") return "-----BEGIN DH PARAMETERS-----" "MIHHAoHBAJ3vPK+5OSd6sfEqhheke7vbpR30maxMgL7uqWFLGcxNX09fVW4ny95R" "xqlL5GB6KRVYkDug0PhDgLZVu5oi6NzfAop87Gfw0IE0sci5eYkUm2CeC+O6tj1H" "VIOB28Wx/HZOP0tT3Z2hFYv9PiucjPVu3wGVOTSWJ9sv1T0kt8SGZXcuQ31sf4zk" "QnNK98y3roN8Jkrjqb64f4ov6bi1KS5aAh//XpFHnoznoowkQsbzFRgPk0maI03P" "duP+0TX5uwIBAg==" "-----END DH PARAMETERS-----"; if(name == "modp/ietf/2048") return "-----BEGIN X942 DH PARAMETERS-----" "MIICDAKCAQEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqsqmj//////////wIBAgKCAQB//////////+SH7VEQtGEa" "YmMxRcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4ob" "p/Catrao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/z" "JJQzKPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqld" "z2qUg7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH" "2uKu+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVZVNH//////////" "-----END X942 DH PARAMETERS-----"; if(name == "modp/srp/2048") return "-----BEGIN X942 DH PARAMETERS-----" "MIICDAKCAQEArGvbQTJKmpvxZt5eE4lYL69ytmUZh+4H/DGSlD21YFCjcynLtKCZ" "7YGT4HV3Z6E91SMSq0sDMQ3Nf0ip2gT9UOgIOWntt2ewz2CVF5oWOrNmGgX71fqq" "6CkYqZYvC5O4Vfl5k+yXXuqoDXQK2/T/dHNZ0EHVwz6nHSgeRGsUdzvKl7Q6I/uA" "Fna9IHpDbGSB8dK5B4cXRhpbnTLmiPh3SFRFI7UksNV9Xqd6J3XS7PoDLPvb9S+z" "eGFgJ5AE5Xrmr4dOcwPOUymczAQce8MI2CpWmPOo0MOCca41+Onb+7aUtcgD2J96" "5DXeI21SX1R1m2XjcvzWjvIPpxEfnkr/cwIBAgKCAQBWNe2gmSVNTfizby8JxKwX" "17lbMozD9wP+GMlKHtqwKFG5lOXaUEz2wMnwOruz0J7qkYlVpYGYhua/pFTtAn6o" "dAQctPbbs9hnsEqLzQsdWbMNAv3q/VV0FIxUyxeFydwq/LzJ9kuvdVQGugVt+n+6" "OazoIOrhn1OOlA8iNYo7neVL2h0R/cALO16QPSG2MkD46VyDw4ujDS3OmXNEfDuk" "KiKR2pJYar6vU70Tuul2fQGWfe36l9m8MLATyAJyvXNXw6c5gecplM5mAg494YRs" "FStMedRoYcE41xr8dO3920pa5AHsT71yGu8RtqkvqjrNsvG5fmtHeQfTiI/PJX+5" "-----END X942 DH PARAMETERS-----"; if(name == "modp/ietf/3072") return "-----BEGIN X942 DH PARAMETERS-----" "MIIDDAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" "yv//////////AgECAoIBgH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6" "AQXfUx2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9j" "eiYhdNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+C" "zG0kGw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwC" "eLo2BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuM" "HMqkvnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeF" "RXU4q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQy" "bDsBOZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohH" "JcFokFSdaWV//////////w==" "-----END X942 DH PARAMETERS-----"; if(name == "modp/srp/3072") return "-----BEGIN DH PARAMETERS-----" "MIIBiAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" "yv//////////AgEF" "-----END DH PARAMETERS-----"; if(name == "modp/ietf/4096") return "-----BEGIN X942 DH PARAMETERS-----" "MIIEDAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQICggIA" "f//////////kh+1RELRhGmJjMUXAbg5olIEnBEUz5joBBd9THYnNkSilBDzHGgJu" "98qM2eadIY2YFYU2+S+KG6fwmra2qOEi8kLauzEvP2N6JiF00xv2tYX/rlt6A1v2" "9xw1/a1Ez9LXT5IIviWP8ySUMyj2ci2e4QA+XFCx34LMbSQbDirpzTSLH9R+kmev" "wbKuke5R1ssOMXmrEEKpXc9qlIO4S0s2s4YapyVeTAJ4ujYEZQwQvhlILyMXG2cd" "8c87lgwHQwHNk8HRdgPRR9rirvg3pilk7xXl+0qsC4wcyqS+dUq1corpEwxMfQKI" "CrlHLUVVYhbWmYuGgig9GdQqkNXvjl0ydn3Cgixt94VFdTirroMGPtnLh8LTcPJj" "1frXRm2EmeuPRkpwJRKwzudx6RMNaXc1+Jf9A2zFBDJsOwE5n2Q1MikPlYwLvZAG" "XfCLq70wrrY7hMRgXWyjcQRxJ9A6ctWYoe2t/nB+iEclwWiQVJCEAI05HglTw/Nr" "xDjNCF7dLZNM4ZOMNXpxHg1KNBpbCoXtEsH05RVqJnRt3eFtgm9HfJdHfgoP32VT" "FD4so6c14C7M2Usn0Ehh0RGd0MMorfP2j7CUuGdxa9fcDe67ELgkDmgDSJPq2C1U" "ydp1TEbH7uDDf9vuSFNgR6b6GuSaAxjM//////////8=" "-----END X942 DH PARAMETERS-----"; if(name == "modp/srp/4096") return "-----BEGIN DH PARAMETERS-----" "MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQU=" "-----END DH PARAMETERS-----"; if(name == "modp/ietf/6144") return "-----BEGIN DSA PARAMETERS-----" "MIIGDAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA" "JP//////////AoIDAH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXf" "Ux2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYh" "dNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+CzG0k" "Gw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwCeLo2" "BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuMHMqk" "vnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeFRXU4" "q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQybDsB" "OZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohHJcFo" "kFSQhACNOR4JU8Pza8Q4zQhe3S2TTOGTjDV6cR4NSjQaWwqF7RLB9OUVaiZ0bd3h" "bYJvR3yXR34KD99lUxQ+LKOnNeAuzNlLJ9BIYdERndDDKK3z9o+wlLhncWvX3A3u" "uxC4JA5oA0iT6tgtVMnadUxGx+7gw3/b7khTYEem+hrkmgFCSRth/VppPjgTYOpu" "WTATI29kuo87Ht0b3vx/ygNWzymHcu2cF6CYANdYNSn2yBPsGIvLk9hDLUSMbR9t" "9efNinaiZzZdZ2pdje2/iiPzZhKlmZAoqJXr16E33HoAm8ZpX6zB5QDjJcl2eBl1" "Cui5DoH6QWvnNzp/e2qvOBejTAZBWtQgGMgFjk8s8+S/32P0eZHUvT8bZkRfB46i" "2/+sLWKl6gPZFaCqVWZHtr9fpHDsCmYvaQfAG/BTy4r3eU3xlANQ6sXb4u07eqhV" "HsUP3/h1jOZY0Ynqrm0rZPYXeUsZHD/0a7ceAjQCH0ezH6Qwdwlflq2Fujprc0p8" "jzbmIBJ//////////wIBAg==" "-----END DSA PARAMETERS-----"; if(name == "modp/srp/6144") return "-----BEGIN DH PARAMETERS-----" "MIIDCAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA" "JP//////////AgEF" "-----END DH PARAMETERS-----"; if(name == "modp/ietf/8192") return "-----BEGIN DSA PARAMETERS-----" "MIIIDAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" "38gfVuiAuW5xYMmA3Zjt09///////////wKCBAB//////////+SH7VEQtGEaYmMx" "RcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Ca" "trao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQz" "KPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qU" "g7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH2uKu" "+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVViFtaZi4aCKD0Z1CqQ" "1e+OXTJ2fcKCLG33hUV1OKuugwY+2cuHwtNw8mPV+tdGbYSZ649GSnAlErDO53Hp" "Ew1pdzX4l/0DbMUEMmw7ATmfZDUyKQ+VjAu9kAZd8IurvTCutjuExGBdbKNxBHEn" "0Dpy1Zih7a3+cH6IRyXBaJBUkIQAjTkeCVPD82vEOM0IXt0tk0zhk4w1enEeDUo0" "GlsKhe0SwfTlFWomdG3d4W2Cb0d8l0d+Cg/fZVMUPiyjpzXgLszZSyfQSGHREZ3Q" "wyit8/aPsJS4Z3Fr19wN7rsQuCQOaANIk+rYLVTJ2nVMRsfu4MN/2+5IU2BHpvoa" "5JoBQkkbYf1aaT44E2DqblkwEyNvZLqPOx7dG978f8oDVs8ph3LtnBegmADXWDUp" "9sgT7BiLy5PYQy1EjG0fbfXnzYp2omc2XWdqXY3tv4oj82YSpZmQKKiV69ehN9x6" "AJvGaV+sweUA4yXJdngZdQrouQ6B+kFr5zc6f3tqrzgXo0wGQVrUIBjIBY5PLPPk" "v99j9HmR1L0/G2ZEXweOotv/rC1ipeoD2RWgqlVmR7a/X6Rw7ApmL2kHwBvwU8uK" "93lN8ZQDUOrF2+LtO3qoVR7FD9/4dYzmWNGJ6q5tK2T2F3lLGRw/9Gu3HgI0Ah9H" "sx+kMHcJX5athbo6a3NKfI823wisulHJN4l/cvIcO75bVJlvxmxfYmg53JjdHeQZ" "W0bO6YA6D9PfxX4j9pK7e0m10hIzHVWxzi1yerQaEdo6FfjkvBHHi2XxzrKW8f7c" "X35CRWyRERcCUgG+A4n1q9QNEfhjmjn+MjZ1GDWl5eRDF8HC7v1Opb/RYEP0PLQZ" "gfat7p0DFZ562dE8UzaVCfwfonwW75iHcDpVtRsiy/RM0BKu4LJ5jmKEI0KO/NWk" "DK72v1DY6ohev3Omuf15teGPZ9E0GsgjenXDz8kgBKHFpA42a8RNABdq9xwV5IyG" "034BNyPKrHIjqzv01U8YKHE7K0pv5A+rdEBctziwZMBuzHbp7///////////AgEC" "-----END DSA PARAMETERS-----"; if(name == "modp/srp/8192") return "-----BEGIN DH PARAMETERS-----" "MIIECAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" "38gfVuiAuW5xYMmA3Zjt09///////////wIBEw==" "-----END DH PARAMETERS-----"; if(name == "dsa/jce/1024") return "-----BEGIN DSA PARAMETERS-----" "MIIBHgKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9" "jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX" "58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8V" "IwvMspK5gqLrhAvwWBz1AoGARpYDUS4wJ4zTlHWV2yLuyYJqYyKtyXNE9B10DDJX" "JMj577qn1NgD/4xgnc0QDrxb38+tfGpCX66nhuogUOvpg1HqH9of3yTWlHqmuaoj" "dmlTgC9NfUqOy6BtGXaKJJH/sW0O+cQ6mbX3FnL/bwoktETQc20E04oaEyLa9s3Y" "jJ0=" "-----END DSA PARAMETERS-----"; if(name == "dsa/botan/2048") return "-----BEGIN DSA PARAMETERS-----" "MIICLAKCAQEAkcSKT9+898Aq6V59oSYSK13Shk9Vm4fo50oobVL1m9HeaN/WRdDg" "DGDAgAMYkZgDdO61lKUyv9Z7mgnqxLhmOgeRDmjzlGX7cEDSXfE5MuusQ0elMOy6" "YchU+biA08DDZgCAWHxFVm2t4mvVo5S+CTtMDyS1r/747GxbPlf7iQJam8FnaZMh" "MeFtPJTvyrGNDfBhIDzFPmEDvHLVWUv9QMplOA9EqahR3LB1SV/AM6ilgHGhvXj+" "BS9mVVZI60txnSr+i0iA+NrW8VgYuhePiSdMhwvpuW6wjEbEAEDMLv4d+xsYaN0x" "nePDSjKmOrbrEiQgmkGWgMx5AtFyjU354QIhAIzX1FD4bwrZTu5M5GmodW0evRBY" "JBlD6v+ws1RYXpJNAoIBAA2fXgdhtNvRgz1qsalhoJlsXyIwP3LYTBQPZ8Qx2Uq1" "cVvqgaDJjTnOS8941rnryJXTT+idlAkdWEhhXvFfXobxHZb2yWniA936WDVkIKSc" "tES1lbkBqTPP4HZ7WU8YoHt/kd7NukRriJkPePL/kfL+fNQ/0uRtGOraH3u2YCxh" "f27zpLKE8v2boQo2BC3o+oeiyjZZf+yBFXoUheRAQd8CgwERy4gLvm7UlIFIhvll" "zcMTX1zPE4Nyi/ZbgG+WksCxDWxMCcdabKO0ATyxarLBBfa+I66pAA6rIXiYX5cs" "mAV+HIbkTnIYaI6krg82NtzKdFydzU5q/7Z8y8E9YTE=" "-----END DSA PARAMETERS-----"; if(name == "dsa/botan/3072") return "-----BEGIN DSA PARAMETERS-----" "MIIDLAKCAYEA5LUIgHWWY1heFCRgyi2d/xMviuTIQN2jomZoiRJP5WOLhOiim3rz" "+hIJvmv8S1By7Tsrc4e68/hX9HioAijvNgC3az3Pth0g00RlslBtLK+H3259wM6R" "vS0Wekb2rcwxxTHk+cervbkq3fNbCoBsZikqX14X6WTdCZkDczrEKKs12A6m9oW/" "uovkBo5UGK5eytno/wc94rY+Tn6tNciptwtb1Hz7iNNztm83kxk5sKtxvVWVgJCG" "2gFVM30YWg5Ps2pRmxtiArhZHmACRJzxzTpmOE9tIHOxzXO+ypO68eGmEX0COPIi" "rh7X/tGFqJDn9n+rj+uXU8wTSlGD3+h64llfe1wtn7tCJJ/dWVE+HTOWs+sv2GaE" "8oWoRI/nV6ApiBxAdguU75Gb35dAw4OJWZ7FGm6btRmo4GhJHpzgovz+PLYNZs8N" "+tIKjsaEBIaEphREV1vRck1zUrRKdgB3s71r04XOWwpyUMwL92jagpI4Buuc+7E4" "hDcxthggjHWbAiEAs+vTZOxp74zzuvZDt1c0sWM5suSeXN4bWcHp+0DuDFsCggGA" "K+0h7vg5ZKIwrom7px2ffDnFL8gim047x+WUTTKdoQ8BDqyee69sAJ/E6ylgcj4r" "Vt9GY+TDrIAOkljeL3ZJ0gZ4KJP4Ze/KSY0u7zAHTqXop6smJxKk2UovOwuaku5A" "D7OKPMWaXcfkNtXABLIuNQKDgbUck0B+sy1K4P1Cy0XhLQ7O6KJiOO3iCCp7FSIR" "PGbO+NdFxs88uUX4TS9N4W1Epx3hmCcOE/A1U8iLjTI60LlIob8hA6lJl5tu0W+1" "88lT2Vt8jojKZ9z1pjb7nKOdkkIV96iE7Wx+48ltjZcVQnl0t8Q1EoLhPTdz99KL" "RS8QiSoTx1hzKN6kgntrNpsqjcFyrcWD9R8qZZjFSD5bxGewL5HQWcQC0Y4sJoD3" "dqoG9JKAoscsF8xC1bbnQMXEsas8UcLtCSviotiwU65Xc9FCXtKwjwbi3VBZLfGk" "eMFVkc39EVZP+I/zi3IdQjkv2kcyEtz9jS2IqXagCv/m//tDCjWeZMorNRyiQSOU" "-----END DSA PARAMETERS-----"; if(name == "ffdhe/ietf/2048") return "-----BEGIN DSA PARAMETERS-----" "MIICDAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD" "ssbzSibBsu/6iGtCOGEoXJf//////////wKCAQB//////////9b8KixRXaVNV+4r" "EBOennjsXOLB5xabStTwmyCKMhn95knO5xJNn3y+l/GxsYY67HtA2QFXYjC9ae+P" "aur+srCSGfqPr4M3aEKxsqqe9o152quJrz+r5JrMJ4Y4cHNFu/FTRO159/Q5Dvis" "UJtW85qYVmUnpB08vV4FWMFZkn2w6IRUpdlkcf3ctW1bsGv6NA6noVHvHKb6Vyt2" "87G5XYyFg9PkdwU2uE8BfnDm+/F2YBoCZpQaF7DIuX9OdMLB/8cniRl3eUDB4f8d" "jaY31rmd2v5eF2EQAuLHeMG+i0HZY3mlE2DZd/1ENaEcMJQuS///////////AgEC" "-----END DSA PARAMETERS-----"; if(name == "ffdhe/ietf/3072") return "-----BEGIN DSA PARAMETERS-----" "MIIDDAKCAYEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZsYu" "N///////////AoIBgH//////////1vwqLFFdpU1X7isQE56eeOxc4sHnFptK1PCb" "IIoyGf3mSc7nEk2ffL6X8bGxhjrse0DZAVdiML1p749q6v6ysJIZ+o+vgzdoQrGy" "qp72jXnaq4mvP6vkmswnhjhwc0W78VNE7Xn39DkO+KxQm1bzmphWZSekHTy9XgVY" "wVmSfbDohFSl2WRx/dy1bVuwa/o0DqehUe8cpvpXK3bzsbldjIWD0+R3BTa4TwF+" "cOb78XZgGgJmlBoXsMi5f050wsH/xyeJGXd5QMHh/x2NpjfWuZ3a/l4XYRAC4sd4" "wb6LQdljeaUTYNl3/UQ1oRwwj+fubxqtnbKMga3eGnpvfM4BHDDaN+Trc2SDvWyO" "k0j7+/csxlh9YMNsjld/CYTCick4WgmGSd4hvKJ6fqIpcWum6bJ5cQ84+qX/rldB" "Vc5O+090NpXikRsdBtXikMvNhvVtDt/NIWriJCcFXmg1/Snu954NkHcf6s6+EvIO" "lbNjFxv//////////wIBAg==" "-----END DSA PARAMETERS-----"; if(name == "ffdhe/ietf/4096") return "-----BEGIN DSA PARAMETERS-----" "MIIEDAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e" "8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx" "iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K" "zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CggIAf///" "///////W/CosUV2lTVfuKxATnp547FziwecWm0rU8JsgijIZ/eZJzucSTZ98vpfx" "sbGGOux7QNkBV2IwvWnvj2rq/rKwkhn6j6+DN2hCsbKqnvaNedqria8/q+SazCeG" "OHBzRbvxU0Tteff0OQ74rFCbVvOamFZlJ6QdPL1eBVjBWZJ9sOiEVKXZZHH93LVt" "W7Br+jQOp6FR7xym+lcrdvOxuV2MhYPT5HcFNrhPAX5w5vvxdmAaAmaUGhewyLl/" "TnTCwf/HJ4kZd3lAweH/HY2mN9a5ndr+XhdhEALix3jBvotB2WN5pRNg2Xf9RDWh" "HDCP5+5vGq2dsoyBrd4aem98zgEcMNo35OtzZIO9bI6TSPv79yzGWH1gw2yOV38J" "hMKJyThaCYZJ3iG8onp+oilxa6bpsnlxDzj6pf+uV0FVzk77T3Q2leKRGx0G1eKQ" "y82G9W0O380hauIkJwVeaDX9Ke73ng2Qdx/qzr4S8g6Vs08PeLc3qWGLJvp9vJh0" "8nLEK9tWPq+ha0+2jDux546qgaACQ/qt0r8Y5j04muRDd9oYxXa1DwCWzzQZVIOw" "BUjAmGI247x8uNaAHASUzNGZ5cW9DQ7cnrigAB4VJ2dU/MaFZgVBSObnZL7nx2Ta" "rT/EUjWm2tQo+iDBcONFAD8vMq+1f/////////8CAQI=" "-----END DSA PARAMETERS-----"; if(name == "ffdhe/ietf/6144") return "-----BEGIN DSA PARAMETERS-----" "MIIGDAKCAwEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e" "8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx" "iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K" "zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eDdkCC/1ktkUDbHpOZ30sOFMq" "OiO6RELK9T6mO7RUMpt2JMiRe91kscD9TLOOjDNMcBw6za0GV/zP7HGbH1w+TkYE" "HziBR/tM/bR3pSRx96mpaRC4VTIu22NA2KAO8JI1BRHjCr7B//njom5/sp+MGDAj" "w1h+ONoAd9m0dj5OS5Syu8GUxmUed8r5ku6qwCMqKBv2s6c5wSJhFoIK6NtYR6Z8" "vvnJCRtGLVOM1ysDdGrnf15iKSwxFWKoRlBdyC24VDOK5J9SNclbkReMzy3Vys70" "A+ydGBDGJysEWztx+dxrgNY/3UqOmtseaWKmlSbUMWHBpB1XDXk42tSkDjKc0OQO" "Zf//////////AoIDAH//////////1vwqLFFdpU1X7isQE56eeOxc4sHnFptK1PCb" "IIoyGf3mSc7nEk2ffL6X8bGxhjrse0DZAVdiML1p749q6v6ysJIZ+o+vgzdoQrGy" "qp72jXnaq4mvP6vkmswnhjhwc0W78VNE7Xn39DkO+KxQm1bzmphWZSekHTy9XgVY" "wVmSfbDohFSl2WRx/dy1bVuwa/o0DqehUe8cpvpXK3bzsbldjIWD0+R3BTa4TwF+" "cOb78XZgGgJmlBoXsMi5f050wsH/xyeJGXd5QMHh/x2NpjfWuZ3a/l4XYRAC4sd4" "wb6LQdljeaUTYNl3/UQ1oRwwj+fubxqtnbKMga3eGnpvfM4BHDDaN+Trc2SDvWyO" "k0j7+/csxlh9YMNsjld/CYTCick4WgmGSd4hvKJ6fqIpcWum6bJ5cQ84+qX/rldB" "Vc5O+090NpXikRsdBtXikMvNhvVtDt/NIWriJCcFXmg1/Snu954NkHcf6s6+EvIO" "lbNPD3i3N6lhiyb6fbyYdPJyxCvbVj6voWtPtow7seeOqoGgAkP6rdK/GOY9OJrk" "Q3faGMV2tQ8Als80GVSDsAVIwJhiNuO8fLjWgBwElMzRmeXFvQ0O3J64oAAeFSdn" "VPzGhWYFQUjm52S+58dk2q0/xFI1ptrUKPogwXDjRQA/LwbsgQX+slsigbY9JzO+" "lhwplR0R3SIhZXqfUx3aKhlNuxJkSL3usljgfqZZx0YZpjgOHWbWgyv+Z/Y4zY+u" "HycjAg+cQKP9pn7aO9KSOPvU1LSIXCqZF22xoGxQB3hJGoKI8YVfYP/88dE3P9lP" "xgwYEeGsPxxtADvs2jsfJyXKWV3gymMyjzvlfMl3VWARlRQN+1nTnOCRMItBBXRt" "rCPTPl985ISNoxapxmuVgbo1c7+vMRSWGIqxVCMoLuQW3CoZxXJPqRrkrciLxmeW" "6uVnegH2TowIYxOVgi2duPzuNcBrH+6lR01tjzSxU0qTahiw4NIOq4a8nG1qUgcZ" "TmhyBzL//////////wIBAg==" "-----END DSA PARAMETERS-----"; if(name == "ffdhe/ietf/8192") return "-----BEGIN DSA PARAMETERS-----" "MIIIDAKCBAEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz" "+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a" "87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7" "YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi" "7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD" "ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3" "7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32" "nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e" "8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx" "iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K" "zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eDdkCC/1ktkUDbHpOZ30sOFMq" "OiO6RELK9T6mO7RUMpt2JMiRe91kscD9TLOOjDNMcBw6za0GV/zP7HGbH1w+TkYE" "HziBR/tM/bR3pSRx96mpaRC4VTIu22NA2KAO8JI1BRHjCr7B//njom5/sp+MGDAj" "w1h+ONoAd9m0dj5OS5Syu8GUxmUed8r5ku6qwCMqKBv2s6c5wSJhFoIK6NtYR6Z8" "vvnJCRtGLVOM1ysDdGrnf15iKSwxFWKoRlBdyC24VDOK5J9SNclbkReMzy3Vys70" "A+ydGBDGJysEWztx+dxrgNY/3UqOmtseaWKmlSbUMWHBpB1XDXk42tSkDjKcz/Rq" "qjatAEz2AMg4HkJaMdlRrmT9sj/OyVCdQ2h/62nt0cxeC4zDvfZLEO+GtjFCo6uI" "KVVbL3R8kyZlyywPHMAb1wIpOIg50q8F5FRQSseLdYKCKEbAujXDX1xZFgzARv2C" "UVQfxoychrAiu3CZh2pGDnRRqKkxCXA/7hwhfmw4JuUsUappHg5CPPyZ6eMWUMEh" "e2JIFs2tmpX51bgBlIjZwKCh/jB1pXfiMYP4HUo/L6RXHvyM4LqKT+i2hV3+crCm" "bt7S+6v75Yow+vq+HF1xqH4vdB74wf6G/qa7/eUwZ38Nl9EdSfeoRD0IIuUGqfRh" "TgEeKpSDj/iM1oyLt8XGQkz//////////wKCBAB//////////9b8KixRXaVNV+4r" "EBOennjsXOLB5xabStTwmyCKMhn95knO5xJNn3y+l/GxsYY67HtA2QFXYjC9ae+P" "aur+srCSGfqPr4M3aEKxsqqe9o152quJrz+r5JrMJ4Y4cHNFu/FTRO159/Q5Dvis" "UJtW85qYVmUnpB08vV4FWMFZkn2w6IRUpdlkcf3ctW1bsGv6NA6noVHvHKb6Vyt2" "87G5XYyFg9PkdwU2uE8BfnDm+/F2YBoCZpQaF7DIuX9OdMLB/8cniRl3eUDB4f8d" "jaY31rmd2v5eF2EQAuLHeMG+i0HZY3mlE2DZd/1ENaEcMI/n7m8arZ2yjIGt3hp6" "b3zOARww2jfk63Nkg71sjpNI+/v3LMZYfWDDbI5XfwmEwonJOFoJhkneIbyien6i" "KXFrpumyeXEPOPql/65XQVXOTvtPdDaV4pEbHQbV4pDLzYb1bQ7fzSFq4iQnBV5o" "Nf0p7veeDZB3H+rOvhLyDpWzTw94tzepYYsm+n28mHTycsQr21Y+r6FrT7aMO7Hn" "jqqBoAJD+q3SvxjmPTia5EN32hjFdrUPAJbPNBlUg7AFSMCYYjbjvHy41oAcBJTM" "0Znlxb0NDtyeuKAAHhUnZ1T8xoVmBUFI5udkvufHZNqtP8RSNaba1Cj6IMFw40UA" "Py8G7IEF/rJbIoG2PSczvpYcKZUdEd0iIWV6n1Md2ioZTbsSZEi97rJY4H6mWcdG" "GaY4Dh1m1oMr/mf2OM2Prh8nIwIPnECj/aZ+2jvSkjj71NS0iFwqmRdtsaBsUAd4" "SRqCiPGFX2D//PHRNz/ZT8YMGBHhrD8cbQA77No7Hyclylld4MpjMo875XzJd1Vg" "EZUUDftZ05zgkTCLQQV0bawj0z5ffOSEjaMWqcZrlYG6NXO/rzEUlhiKsVQjKC7k" "FtwqGcVyT6ka5K3Ii8ZnlurlZ3oB9k6MCGMTlYItnbj87jXAax/upUdNbY80sVNK" "k2oYsODSDquGvJxtalIHGU5n+jVVG1aAJnsAZBwPIS0Y7KjXMn7ZH+dkqE6htD/1" "tPbo5i8FxmHe+yWId8NbGKFR1cQUqq2Xuj5JkzLllgeOYA3rgRScRBzpV4LyKigl" "Y8W6wUEUI2BdGuGvriyLBmAjfsEoqg/jRk5DWBFduEzDtSMHOijUVJiEuB/3DhC/" "NhwTcpYo1TSPByEefkz08YsoYJC9sSQLZtbNSvzq3ADKRGzgUFD/GDrSu/EYwfwO" "pR+X0iuPfkZwXUUn9FtCrv85WFM3b2l91f3yxRh9fV8OLrjUPxe6D3xg/0N/U13+" "8pgzv4bL6I6k+9QiHoQRcoNU+jCnAI8VSkHH/EZrRkXb4uMhJn//////////AgEC" "-----END DSA PARAMETERS-----"; return ""; } } botan-2.4.0/src/lib/pubkey/dl_group/info.txt000066400000000000000000000001371322470703100207630ustar00rootroot00000000000000 DL_GROUP -> 20131128 asn1 bigint numbertheory pem botan-2.4.0/src/lib/pubkey/dlies/000077500000000000000000000000001322470703100165535ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/dlies/dlies.cpp000066400000000000000000000155101322470703100203610ustar00rootroot00000000000000/* * DLIES * (C) 1999-2007 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { DLIES_Encryptor::DLIES_Encryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_length) : DLIES_Encryptor(own_priv_key, rng, kdf, nullptr, 0, mac, mac_key_length) { } DLIES_Encryptor::DLIES_Encryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, Cipher_Mode* cipher, size_t cipher_key_len, MessageAuthenticationCode* mac, size_t mac_key_length) : m_other_pub_key(), m_own_pub_key(own_priv_key.public_value()), m_ka(own_priv_key, rng, "Raw"), m_kdf(kdf), m_cipher(cipher), m_cipher_key_len(cipher_key_len), m_mac(mac), m_mac_keylen(mac_key_length), m_iv() { BOTAN_ASSERT_NONNULL(kdf); BOTAN_ASSERT_NONNULL(mac); } std::vector DLIES_Encryptor::enc(const uint8_t in[], size_t length, RandomNumberGenerator&) const { if(m_other_pub_key.empty()) { throw Invalid_State("DLIES: The other key was never set"); } // calculate secret value const SymmetricKey secret_value = m_ka.derive_key(0, m_other_pub_key); // derive secret key from secret value const size_t required_key_length = m_cipher ? m_cipher_key_len + m_mac_keylen : length + m_mac_keylen; const secure_vector secret_keys = m_kdf->derive_key(required_key_length, secret_value.bits_of()); if(secret_keys.size() != required_key_length) { throw Encoding_Error("DLIES: KDF did not provide sufficient output"); } secure_vector ciphertext(in, in + length); const size_t cipher_key_len = m_cipher ? m_cipher_key_len : length; if(m_cipher) { SymmetricKey enc_key(secret_keys.data(), cipher_key_len); m_cipher->set_key(enc_key); if(m_iv.size()) { m_cipher->start(m_iv.bits_of()); } m_cipher->finish(ciphertext); } else { xor_buf(ciphertext, secret_keys, cipher_key_len); } // calculate MAC m_mac->set_key(secret_keys.data() + cipher_key_len, m_mac_keylen); secure_vector tag = m_mac->process(ciphertext); // out = (ephemeral) public key + ciphertext + tag secure_vector out(m_own_pub_key.size() + ciphertext.size() + tag.size()); buffer_insert(out, 0, m_own_pub_key); buffer_insert(out, 0 + m_own_pub_key.size(), ciphertext); buffer_insert(out, 0 + m_own_pub_key.size() + ciphertext.size(), tag); return unlock(out); } /** * Return the max size, in bytes, of a message * Not_Implemented if DLIES is used in XOR encryption mode */ size_t DLIES_Encryptor::maximum_input_size() const { if(m_cipher) { // no limit in block cipher mode return std::numeric_limits::max(); } else { // No way to determine if the KDF will output enough bits for XORing with the plaintext?! throw Not_Implemented("Not implemented for XOR encryption mode"); } } DLIES_Decryptor::DLIES_Decryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, Cipher_Mode* cipher, size_t cipher_key_len, MessageAuthenticationCode* mac, size_t mac_key_length) : m_pub_key_size(own_priv_key.public_value().size()), m_ka(own_priv_key, rng, "Raw"), m_kdf(kdf), m_cipher(cipher), m_cipher_key_len(cipher_key_len), m_mac(mac), m_mac_keylen(mac_key_length), m_iv() { BOTAN_ASSERT_NONNULL(kdf); BOTAN_ASSERT_NONNULL(mac); } DLIES_Decryptor::DLIES_Decryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_length) : DLIES_Decryptor(own_priv_key, rng, kdf, nullptr, 0, mac, mac_key_length) {} secure_vector DLIES_Decryptor::do_decrypt(uint8_t& valid_mask, const uint8_t msg[], size_t length) const { if(length < m_pub_key_size + m_mac->output_length()) { throw Decoding_Error("DLIES decryption: ciphertext is too short"); } // calculate secret value std::vector other_pub_key(msg, msg + m_pub_key_size); const SymmetricKey secret_value = m_ka.derive_key(0, other_pub_key); const size_t ciphertext_len = length - m_pub_key_size - m_mac->output_length(); size_t cipher_key_len = m_cipher ? m_cipher_key_len : ciphertext_len; // derive secret key from secret value const size_t required_key_length = cipher_key_len + m_mac_keylen; secure_vector secret_keys = m_kdf->derive_key(required_key_length, secret_value.bits_of()); if(secret_keys.size() != required_key_length) { throw Encoding_Error("DLIES: KDF did not provide sufficient output"); } secure_vector ciphertext(msg + m_pub_key_size, msg + m_pub_key_size + ciphertext_len); // calculate MAC m_mac->set_key(secret_keys.data() + cipher_key_len, m_mac_keylen); secure_vector calculated_tag = m_mac->process(ciphertext); // calculated tag == received tag ? secure_vector tag(msg + m_pub_key_size + ciphertext_len, msg + m_pub_key_size + ciphertext_len + m_mac->output_length()); valid_mask = CT::expand_mask(constant_time_compare(tag.data(), calculated_tag.data(), tag.size())); // decrypt if(m_cipher) { if(valid_mask) { SymmetricKey dec_key(secret_keys.data(), cipher_key_len); m_cipher->set_key(dec_key); try { // the decryption can fail: // e.g. Integrity_Failure is thrown if GCM is used and the message does not have a valid tag if(m_iv.size()) { m_cipher->start(m_iv.bits_of()); } m_cipher->finish(ciphertext); } catch(...) { valid_mask = 0; } } else { return secure_vector(); } } else { xor_buf(ciphertext, secret_keys.data(), cipher_key_len); } return ciphertext; } } botan-2.4.0/src/lib/pubkey/dlies/dlies.h000066400000000000000000000122121322470703100200220ustar00rootroot00000000000000/* * DLIES * (C) 1999-2007 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DLIES_H_ #define BOTAN_DLIES_H_ #include #include #include #include #include namespace Botan { /** * DLIES Encryption */ class BOTAN_PUBLIC_API(2,0) DLIES_Encryptor final : public PK_Encryptor { public: /** * Stream mode: use KDF to provide a stream of bytes to xor with the message * * @param own_priv_key own (ephemeral) DH private key * @param rng the RNG to use * @param kdf the KDF that should be used * @param mac the MAC function that should be used * @param mac_key_len key length of the MAC function. Default = 20 bytes * * output = (ephemeral) public key + ciphertext + tag */ DLIES_Encryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20); /** * Block cipher mode * * @param own_priv_key own (ephemeral) DH private key * @param rng the RNG to use * @param kdf the KDF that should be used * @param cipher the block cipher that should be used * @param cipher_key_len the key length of the block cipher * @param mac the MAC function that should be used * @param mac_key_len key length of the MAC function. Default = 20 bytes * * output = (ephemeral) public key + ciphertext + tag */ DLIES_Encryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, Cipher_Mode* cipher, size_t cipher_key_len, MessageAuthenticationCode* mac, size_t mac_key_len = 20); // Set the other parties public key inline void set_other_key(const std::vector& other_pub_key) { m_other_pub_key = other_pub_key; } /// Set the initialization vector for the data encryption method inline void set_initialization_vector(const InitializationVector& iv) { m_iv = iv; } private: std::vector enc(const uint8_t[], size_t, RandomNumberGenerator&) const override; size_t maximum_input_size() const override; std::vector m_other_pub_key; std::vector m_own_pub_key; PK_Key_Agreement m_ka; std::unique_ptr m_kdf; std::unique_ptr m_cipher; const size_t m_cipher_key_len; std::unique_ptr m_mac; const size_t m_mac_keylen; InitializationVector m_iv; }; /** * DLIES Decryption */ class BOTAN_PUBLIC_API(2,0) DLIES_Decryptor final : public PK_Decryptor { public: /** * Stream mode: use KDF to provide a stream of bytes to xor with the message * * @param own_priv_key own (ephemeral) DH private key * @param rng the RNG to use * @param kdf the KDF that should be used * @param mac the MAC function that should be used * @param mac_key_len key length of the MAC function. Default = 20 bytes * * input = (ephemeral) public key + ciphertext + tag */ DLIES_Decryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20); /** * Block cipher mode * * @param own_priv_key own (ephemeral) DH private key * @param rng the RNG to use * @param kdf the KDF that should be used * @param cipher the block cipher that should be used * @param cipher_key_len the key length of the block cipher * @param mac the MAC function that should be used * @param mac_key_len key length of the MAC function. Default = 20 bytes * * input = (ephemeral) public key + ciphertext + tag */ DLIES_Decryptor(const DH_PrivateKey& own_priv_key, RandomNumberGenerator& rng, KDF* kdf, Cipher_Mode* cipher, size_t cipher_key_len, MessageAuthenticationCode* mac, size_t mac_key_len = 20); /// Set the initialization vector for the data decryption method inline void set_initialization_vector(const InitializationVector& iv) { m_iv = iv; } private: secure_vector do_decrypt(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const override; const size_t m_pub_key_size; PK_Key_Agreement m_ka; std::unique_ptr m_kdf; std::unique_ptr m_cipher; const size_t m_cipher_key_len; std::unique_ptr m_mac; const size_t m_mac_keylen; InitializationVector m_iv; }; } #endif botan-2.4.0/src/lib/pubkey/dlies/info.txt000066400000000000000000000001201322470703100202400ustar00rootroot00000000000000 DLIES -> 20160713 dh kdf mac block botan-2.4.0/src/lib/pubkey/dsa/000077500000000000000000000000001322470703100162225ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/dsa/dsa.cpp000066400000000000000000000143701322470703100175020ustar00rootroot00000000000000/* * DSA * (C) 1999-2010,2014,2016 Jack Lloyd * (C) 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #if defined(BOTAN_HAS_RFC6979_GENERATOR) #include #include #endif #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #endif namespace Botan { /* * DSA_PublicKey Constructor */ DSA_PublicKey::DSA_PublicKey(const DL_Group& grp, const BigInt& y1) { m_group = grp; m_y = y1; } /* * Create a DSA private key */ DSA_PrivateKey::DSA_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { m_group = grp; if(x_arg == 0) m_x = BigInt::random_integer(rng, 2, group_q() - 1); else m_x = x_arg; m_y = power_mod(group_g(), m_x, group_p()); } DSA_PrivateKey::DSA_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_57) { m_y = power_mod(group_g(), m_x, group_p()); } /* * Check Private DSA Parameters */ bool DSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!DL_Scheme_PrivateKey::check_key(rng, strong) || m_x >= group_q()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { /** * Object that can create a DSA signature */ class DSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA { public: DSA_Signature_Operation(const DSA_PrivateKey& dsa, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_q(dsa.group_q()), m_x(dsa.get_x()), m_powermod_g_p(dsa.group_g(), dsa.group_p()), m_mod_q(dsa.group_q()) { #if defined(BOTAN_HAS_RFC6979_GENERATOR) m_rfc6979_hash = hash_for_emsa(emsa); #endif } size_t max_input_bits() const override { return m_q.bits(); } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; private: const BigInt& m_q; const BigInt& m_x; Fixed_Base_Power_Mod m_powermod_g_p; Modular_Reducer m_mod_q; #if defined(BOTAN_HAS_RFC6979_GENERATOR) std::string m_rfc6979_hash; #endif }; secure_vector DSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) { BigInt i(msg, msg_len); while(i >= m_q) i -= m_q; #if defined(BOTAN_HAS_RFC6979_GENERATOR) BOTAN_UNUSED(rng); const BigInt k = generate_rfc6979_nonce(m_x, m_q, i, m_rfc6979_hash); #else const BigInt k = BigInt::random_integer(rng, 1, m_q); #endif #if defined(BOTAN_TARGET_OS_HAS_THREADS) auto future_r = std::async(std::launch::async, [&]() { return m_mod_q.reduce(m_powermod_g_p(k)); }); BigInt s = inverse_mod(k, m_q); const BigInt r = future_r.get(); #else BigInt s = inverse_mod(k, m_q); const BigInt r = m_mod_q.reduce(m_powermod_g_p(k)); #endif s = m_mod_q.multiply(s, mul_add(m_x, r, i)); // With overwhelming probability, a bug rather than actual zero r/s BOTAN_ASSERT(s != 0, "invalid s"); BOTAN_ASSERT(r != 0, "invalid r"); return BigInt::encode_fixed_length_int_pair(r, s, m_q.bytes()); } /** * Object that can verify a DSA signature */ class DSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: DSA_Verification_Operation(const DSA_PublicKey& dsa, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_q(dsa.group_q()), m_y(dsa.get_y()), m_powermod_g_p{Fixed_Base_Power_Mod(dsa.group_g(), dsa.group_p())}, m_powermod_y_p{Fixed_Base_Power_Mod(m_y, dsa.group_p())}, m_mod_p{Modular_Reducer(dsa.group_p())}, m_mod_q{Modular_Reducer(dsa.group_q())} {} size_t max_input_bits() const override { return m_q.bits(); } bool with_recovery() const override { return false; } bool verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) override; private: const BigInt& m_q; const BigInt& m_y; Fixed_Base_Power_Mod m_powermod_g_p, m_powermod_y_p; Modular_Reducer m_mod_p, m_mod_q; }; bool DSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) { if(sig_len != 2*m_q.bytes() || msg_len > m_q.bytes()) return false; BigInt r(sig, m_q.bytes()); BigInt s(sig + m_q.bytes(), m_q.bytes()); BigInt i(msg, msg_len); if(r <= 0 || r >= m_q || s <= 0 || s >= m_q) return false; s = inverse_mod(s, m_q); #if defined(BOTAN_TARGET_OS_HAS_THREADS) auto future_s_i = std::async(std::launch::async, [&]() { return m_powermod_g_p(m_mod_q.multiply(s, i)); }); BigInt s_r = m_powermod_y_p(m_mod_q.multiply(s, r)); BigInt s_i = future_s_i.get(); #else BigInt s_r = m_powermod_y_p(m_mod_q.multiply(s, r)); BigInt s_i = m_powermod_g_p(m_mod_q.multiply(s, i)); #endif s = m_mod_p.multiply(s_i, s_r); return (m_mod_q.reduce(s) == r); } } std::unique_ptr DSA_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new DSA_Verification_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr DSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new DSA_Signature_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/dsa/dsa.h000066400000000000000000000047731322470703100171550ustar00rootroot00000000000000/* * DSA * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DSA_H_ #define BOTAN_DSA_H_ #include namespace Botan { /** * DSA Public Key */ class BOTAN_PUBLIC_API(2,0) DSA_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const override { return "DSA"; } DL_Group::Format group_format() const override { return DL_Group::ANSI_X9_57; } size_t message_parts() const override { return 2; } size_t message_part_size() const override { return group_q().bytes(); } /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ DSA_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_57) { } /** * Create a public key. * @param group the underlying DL group * @param y the public value y = g^x mod p */ DSA_PublicKey(const DL_Group& group, const BigInt& y); std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: DSA_PublicKey() = default; }; /** * DSA Private Key */ class BOTAN_PUBLIC_API(2,0) DSA_PrivateKey final : public DSA_PublicKey, public virtual DL_Scheme_PrivateKey { public: /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded key bits in ANSI X9.57 format */ DSA_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Create a private key. * @param rng the RNG to use * @param group the underlying DL group * @param private_key the private key (if zero, a new random key is generated) */ DSA_PrivateKey(RandomNumberGenerator& rng, const DL_Group& group, const BigInt& private_key = 0); bool check_key(RandomNumberGenerator& rng, bool strong) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/dsa/info.txt000066400000000000000000000001611322470703100177140ustar00rootroot00000000000000 DSA -> 20131128 dl_algo dl_group keypair numbertheory emsa1 sha2_32 botan-2.4.0/src/lib/pubkey/ec_group/000077500000000000000000000000001322470703100172565ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ec_group/ec_group.cpp000066400000000000000000000114461322470703100215730ustar00rootroot00000000000000/* * ECC Domain Parameters * * (C) 2007 Falko Strenzke, FlexSecure GmbH * 2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { EC_Group::EC_Group(const OID& domain_oid) { const std::string pem = PEM_for_named_group(OIDS::lookup(domain_oid)); if(pem == "") { throw Lookup_Error("No ECC domain data for '" + domain_oid.as_string() + "'"); } *this = EC_Group(pem); m_oid = domain_oid.as_string(); } EC_Group::EC_Group(const std::string& str) { if(str == "") return; // no initialization / uninitialized try { std::vector ber = unlock(PEM_Code::decode_check_label(str, "EC PARAMETERS")); *this = EC_Group(ber); } catch(Decoding_Error) // hmm, not PEM? { *this = EC_Group(OIDS::lookup(str)); } } EC_Group::EC_Group(const std::vector& ber_data) { BER_Decoder ber(ber_data); BER_Object obj = ber.get_next_object(); if(obj.type_tag == NULL_TAG) throw Decoding_Error("Cannot handle ImplicitCA ECDSA parameters"); else if(obj.type_tag == OBJECT_ID) { OID dom_par_oid; BER_Decoder(ber_data).decode(dom_par_oid); *this = EC_Group(dom_par_oid); } else if(obj.type_tag == SEQUENCE) { BigInt p, a, b; std::vector sv_base_point; BER_Decoder(ber_data) .start_cons(SEQUENCE) .decode_and_check(1, "Unknown ECC param version code") .start_cons(SEQUENCE) .decode_and_check(OID("1.2.840.10045.1.1"), "Only prime ECC fields supported") .decode(p) .end_cons() .start_cons(SEQUENCE) .decode_octet_string_bigint(a) .decode_octet_string_bigint(b) .end_cons() .decode(sv_base_point, OCTET_STRING) .decode(m_order) .decode(m_cofactor) .end_cons() .verify_end(); m_curve = CurveGFp(p, a, b); m_base_point = OS2ECP(sv_base_point, m_curve); } else throw Decoding_Error("Unexpected tag while decoding ECC domain params"); } std::vector EC_Group::DER_encode(EC_Group_Encoding form) const { if(form == EC_DOMPAR_ENC_EXPLICIT) { const size_t ecpVers1 = 1; OID curve_type("1.2.840.10045.1.1"); const size_t p_bytes = m_curve.get_p().bytes(); return DER_Encoder() .start_cons(SEQUENCE) .encode(ecpVers1) .start_cons(SEQUENCE) .encode(curve_type) .encode(m_curve.get_p()) .end_cons() .start_cons(SEQUENCE) .encode(BigInt::encode_1363(m_curve.get_a(), p_bytes), OCTET_STRING) .encode(BigInt::encode_1363(m_curve.get_b(), p_bytes), OCTET_STRING) .end_cons() .encode(EC2OSP(m_base_point, PointGFp::UNCOMPRESSED), OCTET_STRING) .encode(m_order) .encode(m_cofactor) .end_cons() .get_contents_unlocked(); } else if(form == EC_DOMPAR_ENC_OID) { if(get_oid().empty()) { throw Encoding_Error("Cannot encode EC_Group as OID because OID not set"); } return DER_Encoder().encode(OID(get_oid())).get_contents_unlocked(); } else if(form == EC_DOMPAR_ENC_IMPLICITCA) return DER_Encoder().encode_null().get_contents_unlocked(); else throw Internal_Error("EC_Group::DER_encode: Unknown encoding"); } std::string EC_Group::PEM_encode() const { const std::vector der = DER_encode(EC_DOMPAR_ENC_EXPLICIT); return PEM_Code::encode(der, "EC PARAMETERS"); } bool EC_Group::verify_group(RandomNumberGenerator& rng, bool) const { //compute the discriminant Modular_Reducer p(m_curve.get_p()); BigInt discriminant = p.multiply(4, m_curve.get_a()); discriminant += p.multiply(27, m_curve.get_b()); discriminant = p.reduce(discriminant); //check the discriminant if(discriminant == 0) { return false; } //check for valid cofactor if(m_cofactor < 1) { return false; } //check if the base point is on the curve if(!m_base_point.on_the_curve()) { return false; } if((m_base_point * m_cofactor).is_zero()) { return false; } //check if order is prime if(!is_prime(m_order, rng, 128)) { return false; } //check if order of the base point is correct if(!(m_base_point * m_order).is_zero()) { return false; } return true; } } botan-2.4.0/src/lib/pubkey/ec_group/ec_group.h000066400000000000000000000101321322470703100212270ustar00rootroot00000000000000/* * ECC Domain Parameters * * (C) 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECC_DOMAIN_PARAMETERS_H_ #define BOTAN_ECC_DOMAIN_PARAMETERS_H_ #include #include #include #include namespace Botan { /** * This class represents elliptic curce domain parameters */ enum EC_Group_Encoding { EC_DOMPAR_ENC_EXPLICIT = 0, EC_DOMPAR_ENC_IMPLICITCA = 1, EC_DOMPAR_ENC_OID = 2 }; /** * Class representing an elliptic curve */ class BOTAN_PUBLIC_API(2,0) EC_Group final { public: /** * Construct Domain paramers from specified parameters * @param curve elliptic curve * @param base_point a base point * @param order the order of the base point * @param cofactor the cofactor */ EC_Group(const CurveGFp& curve, const PointGFp& base_point, const BigInt& order, const BigInt& cofactor) : m_curve(curve), m_base_point(base_point), m_order(order), m_cofactor(cofactor), m_oid("") {} /** * Decode a BER encoded ECC domain parameter set * @param ber_encoding the bytes of the BER encoding */ explicit EC_Group(const std::vector& ber_encoding); /** * Create an EC domain by OID (or throw if unknown) * @param oid the OID of the EC domain to create */ explicit EC_Group(const OID& oid); /** * Create an EC domain from PEM encoding (as from PEM_encode), or * from an OID name (eg "secp256r1", or "1.2.840.10045.3.1.7") * @param pem_or_oid PEM-encoded data, or an OID */ EC_Group(const std::string& pem_or_oid = ""); /** * Create the DER encoding of this domain * @param form of encoding to use * @returns bytes encododed as DER */ std::vector DER_encode(EC_Group_Encoding form) const; /** * Return the PEM encoding (always in explicit form) * @return string containing PEM data */ std::string PEM_encode() const; /** * Return domain parameter curve * @result domain parameter curve */ const CurveGFp& get_curve() const { return m_curve; } /** * Return group base point * @result base point */ const PointGFp& get_base_point() const { return m_base_point; } /** * Return the order of the base point * @result order of the base point */ const BigInt& get_order() const { return m_order; } /** * Return the cofactor * @result the cofactor */ const BigInt& get_cofactor() const { return m_cofactor; } bool initialized() const { return !m_base_point.is_zero(); } /** * Return the OID of these domain parameters * @result the OID */ std::string get_oid() const { return m_oid; } /** * Verify EC_Group domain * @returns true if group is valid. false otherwise */ bool verify_group(RandomNumberGenerator& rng, bool strong = false) const; bool operator==(const EC_Group& other) const { return ((get_curve() == other.get_curve()) && (get_base_point() == other.get_base_point()) && (get_order() == other.get_order()) && (get_cofactor() == other.get_cofactor())); } /** * Return PEM representation of named EC group */ static std::string PEM_for_named_group(const std::string& name); /** * Return a set of known named EC groups */ static const std::set& known_named_groups(); private: CurveGFp m_curve; PointGFp m_base_point; BigInt m_order, m_cofactor; std::string m_oid; }; inline bool operator!=(const EC_Group& lhs, const EC_Group& rhs) { return !(lhs == rhs); } // For compatibility with 1.8 typedef EC_Group EC_Domain_Params; } #endif botan-2.4.0/src/lib/pubkey/ec_group/ec_named.cpp000066400000000000000000000331171322470703100215220ustar00rootroot00000000000000/* * List of ECC groups * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { //static std::string EC_Group::PEM_for_named_group(const std::string& name) { if(name == "secp160k1") return "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQD////////////////////+//+sczAsBBQAAAAA" "AAAAAAAAAAAAAAAAAAAAAAQUAAAAAAAAAAAAAAAAAAAAAAAAAAcEKQQ7TDgs43qh" "kqQBnnYwNvT13U1+u5OM+TUxj9zta8KChlMXM8PwPE/uAhUBAAAAAAAAAAAAAbj6" "Ft+rmsoWtrMCAQE=" "-----END EC PARAMETERS-----"; if(name == "secp160r1") return "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQD/////////////////////f////zAsBBT/////" "////////////////f////AQUHJe+/FS9eotlrPifgdTUrcVl+kUEKQRKlrVojvVz" "KEZkaYlow4u5E8v8giOmKFUxaJR9WdzJEgQjUTd6xfsyAhUBAAAAAAAAAAAAAfTI" "+Seu08p1IlcCAQE=" "-----END EC PARAMETERS-----"; if(name == "secp160r2") return "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQD////////////////////+//+sczAsBBT/////" "///////////////+//+scAQUtOE00/tZ64urVydJBGZNWvUDiLoEKQRS3LA0KToR" "fh9P8Rsw9xmdMUTObf6v/vLjMfKW4HH6DfmYLP6n1D8uAhUBAAAAAAAAAAAAADUe" "54aoGPOhoWsCAQE=" "-----END EC PARAMETERS-----"; if(name == "secp192k1") return "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD//////////////////////////v//7jcwNAQY" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAMEMQTbT/EOwFfpriawfQKAt/Q0HaXRsergbH2bLy9tnFYop4RBY9AVvoY0QIKq" "iNleL50CGQD///////////////4m8vwXD2lGanTe/Y0CAQE=" "-----END EC PARAMETERS-----"; if(name == "secp192r1") return "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD////////////////////+//////////8wNAQY" "/////////////////////v/////////8BBhkIQUZ5ZyA5w+n6atyJDBJ/rje7MFG" "ubEEMQQYjagOsDCQ9ny/IOtDoYgA9P8K/YL/EBIHGSuV/8jaeGMQEe1rJM3Vc/l3" "oR55SBECGQD///////////////+Z3vg2FGvJsbTSKDECAQE=" "-----END EC PARAMETERS-----"; if(name == "secp224k1") return "-----BEGIN EC PARAMETERS-----" "MIHIAgEBMCgGByqGSM49AQECHQD///////////////////////////////7//+Vt" "MDwEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAUEOQShRVszTfCZ3zD8KKFppGfp5HB1qQ9+ZQ62t6Rcfgif" "7X+6NEKCyvvW9+MZ98CwvVniykvbVW1hpQIdAQAAAAAAAAAAAAAAAAAB3OjS7GGE" "yvCpcXafsfcCAQE=" "-----END EC PARAMETERS-----"; if(name == "secp224r1") return "-----BEGIN EC PARAMETERS-----" "MIHIAgEBMCgGByqGSM49AQECHQD/////////////////////AAAAAAAAAAAAAAAB" "MDwEHP////////////////////7///////////////4EHLQFCoUMBLOr9UEyVlBE" "sLfXv9i6Jws5QyNV/7QEOQS3Dgy9a7S/fzITkLlKA8HTVsIRIjQygNYRXB0hvTdj" "iLX3I/tMIt/mzUN1oFoHR2RE1YGZhQB+NAIdAP//////////////////FqLguPA+" "E90pRVxcKj0CAQE=" "-----END EC PARAMETERS-----"; if(name == "secp256k1") return "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD////////////////////////////////////+" "///8LzBEBCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcEQQR5vmZ++dy7rFWgYpXOhwsHApv8" "2y3OKNlZ8oFbFvgXmEg62ncmo8RlXaT7/A4RCKj9F7RIpoVUGZxH0I/7ENS4AiEA" "/////////////////////rqu3OavSKA7v9JejNA2QUECAQE=" "-----END EC PARAMETERS-----"; if(name == "secp256r1") return "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD/////AAAAAQAAAAAAAAAAAAAAAP//////////" "/////zBEBCD/////AAAAAQAAAAAAAAAAAAAAAP///////////////AQgWsY12Ko6" "k+ez671VdpiGvGUdBrDMU7D2O848PifSYEsEQQRrF9Hy4SxCR/i85uVjpEDydwN9" "gS3rM6D0oTlF2JjClk/jQuL+Gn+bjufrSnwPnhYrzjNXazFezsu2QGg3v1H1AiEA" "/////wAAAAD//////////7zm+q2nF56E87nKwvxjJVECAQE=" "-----END EC PARAMETERS-----"; if(name == "secp384r1") return "-----BEGIN EC PARAMETERS-----" "MIIBQAIBATA8BgcqhkjOPQEBAjEA////////////////////////////////////" "//////7/////AAAAAAAAAAD/////MGQEMP//////////////////////////////" "///////////+/////wAAAAAAAAAA/////AQwszEvp+I+5+SYjgVr4/gtGRgdnG7+" "gUESAxQIj1ATh1rGVjmNii7RnSqFyO3T7CrvBGEEqofKIr6LBTeOscce8yCtdG4d" "O2KLp5uYWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3NhfeSpYmLG9dnpi/kpLcKfj0" "Hb0omhR86doxE7XwuMAKYLHOHX6BnXpDHXyQ6g5fAjEA////////////////////" "////////////x2NNgfQ3Ld9YGg2ySLCneuzsGWrMxSlzAgEB" "-----END EC PARAMETERS-----"; if(name == "secp521r1") return "-----BEGIN EC PARAMETERS-----" "MIIBrAIBATBNBgcqhkjOPQEBAkIB////////////////////////////////////" "//////////////////////////////////////////////////8wgYgEQgH/////" "////////////////////////////////////////////////////////////////" "/////////////////ARCAFGVPrlhjhyaH5KaIaC2hUDuotpyW5mzFfO4tImRjvEJ" "4VYZOVHsfpN7FlLAvTuxvwc1c9+IPSw08e9FH9RrUD8ABIGFBADGhY4GtwQE6c2e" "PstmI5W0QpxkgTkFP7Uh+CivYGtNPbqhS1537+dZKP4dwSei/6jeM0izwYVqQpv5" "fn4xwuW9ZgEYOSlqeJo7wARcil+0LH0b2Zj1RElXm0RoF6+9Fyc+ZiyX7nKZXvQm" "QMVQuQE/rQdhNTxwhqJywkCIvpR2n9FmUAJCAf//////////////////////////" "////////////////+lGGh4O/L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQJAgEB" "-----END EC PARAMETERS-----"; if(name == "brainpool160r1") return "-----BEGIN EC PARAMETERS-----" "MIGYAgEBMCAGByqGSM49AQECFQDpXkpfc3BZ3GDfx62Vs9gTlRViDzAsBBQ0Dnvi" "ooDrdOK+YbradF2X6PfDAAQUHliahZVCNBITT6otveyVyNhnXlgEKQS+1a8W6j9q" "T2KTjEYx61r3vbzbwxZny0d6Go7DOPlHQWacl2MW2mMhAhUA6V5KX3NwWdxg31mR" "1FApQJ5g/AkCAQE=" "-----END EC PARAMETERS-----"; if(name == "brainpool192r1") return "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQDDAvQdkyo2zaejRjCT0Y23j85HbeGoYpcwNAQY" "apEXQHax4OGcOcAx/oaFwcrgQOXGmijvBBhGmijvfCjMo9xyHQRPRJa8yn70FG+/" "JckEMQTAoGR+qrakh1OwM8VssPCQCi9cSFM3X9YUtpCGar1buItfSCjBSQAC5nc/" "ovopm48CGQDDAvQdkyo2zaejRi+enpFrW+jxAprErMECAQE=" "-----END EC PARAMETERS-----"; if(name == "brainpool224r1") return "-----BEGIN EC PARAMETERS-----" "MIHIAgEBMCgGByqGSM49AQECHQDXwTSqJkNmhioYMCV10deHsJ8HV5faifV+yMD/" "MDwEHGil5iypzmwcKZgDpsFTC1FOGCrYsAQqWcrSn0MEHCWA9jzP5EE4hwcTsakj" "aeM+ITXSZtuzcjhsQAsEOQQNkCmtLH5c9DQII7KofcaMnkzjF0webv3uEsB9WKpW" "93LAcm8kxrieTs2sJDVLnpnKo/bTdhQCzQIdANfBNKomQ2aGKhgwJXXQ+5jRFrxL" "bd68o6Wnk58CAQE=" "-----END EC PARAMETERS-----"; if(name == "brainpool256r1") return "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQCp+1fboe6pvD5mCpCdg41ybjv2I9UmICggE0gd" "H25TdzBEBCB9Wgl1/CwwV+72dTBBev/n+4BVwSbcXGzpSktE8zC12QQgJtxcbOlK" "S0TzMLXZu9d8v5WEFilc9+HOa8zcGP+MB7YEQQSL0q65y35XyyxLSC/8gbevud4n" "4eO9I8I6RFO9ms4yYlR++DXD2sT9l/hGGhRhHcnCd0UTLe2OVFwdVMcvBGmXAiEA" "qftX26Huqbw+ZgqQnYONcYw5eqO1Yab3kB4OgpdIVqcCAQE=" "-----END EC PARAMETERS-----"; if(name == "brainpool320r1") return "-----BEGIN EC PARAMETERS-----" "MIIBEAIBATA0BgcqhkjOPQEBAikA015HIDa8T7fhPHhe0gHgZfmPz6b29A3vT5K5" "7HiT7Cj81BKx8bMuJzBUBCg+4wtWj7qw+IPM69RtPzu4oqc1E/XredpmGQ6whf+p" "9JLzdal9hg60BChSCIOUnf28QtOtGYZAaIpv4T9BNJVUtJrMMdzNiEU5gW9etKyP" "sfGmBFEEQ71+mvtT2LhSibzEjuW/5vIBN9EKCH6254ceKhClmccQr40NOeIGERT9" "0FVF7BzIq0CTJH93J14HQ//tEXGC6qnHeHeqrGrH01JF0WkujuECKQDTXkcgNrxP" "t+E8eF7SAeBl+Y/PpbaPEqMtSC7H7oZY6YaRVVtExZMRAgEB" "-----END EC PARAMETERS-----"; if(name == "brainpool384r1") return "-----BEGIN EC PARAMETERS-----" "MIIBQAIBATA8BgcqhkjOPQEBAjEAjLkegqM4bSgPXW9+UOZB3xUvcQntVFa0ErHa" "GX+3ESOs06cpkB0acYdHABMxB+xTMGQEMHvDgsY9jBUMPHIICs4Fr6DCvqKOT7In" "hxORZe+6kfkPiqWBSlA61OsEqMfdIs4oJgQwBKjH3SLOKCaLObVUFvBEfC+3feEH" "3NKmLogOpT7rYtV8tDkCldvJlDq3hpb6UEwRBGEEHRxk8GjPRf+ipjqBt8E/a4hH" "o+d+8U/j23/K/gy9EOjoJuA0NtZGqu+HsuJH1K8eir4ddSD5wqRcseuOlc/VUmK3" "Cyn+7Fhk4ZwFT/mRKSgORkYhd5GBEUKCA0EmPFMVAjEAjLkegqM4bSgPXW9+UOZB" "3xUvcQntVFazHxZubKwEJafPOrava3/DEDuIMgLpBGVlAgEB" "-----END EC PARAMETERS-----"; if(name == "brainpool512r1") return "-----BEGIN EC PARAMETERS-----" "MIIBogIBATBMBgcqhkjOPQEBAkEAqt2duNvpxIs/1OauM8n8B8swjbOzydIO1mOc" "ynAzCHF9TZsAm8ZoQq7NoSrmo4DmKIH/Ly2CxoUoqmBWWDpI8zCBhARAeDCjMYtg" "O4niMnFFrCNMxZTL3Y09+RYQqDRByuqYY7wt7V1aqCU6oQou8cmLmsi1fxEXpyvy" "x7nnwaxNd/yUygRAPfkWEKg0QcrqmGO8Le1dWqglOqEKLvHJi5rItX8RF6cr8se5" "58GsTXf8lMrcCD5nmEBQt1665d0oCb1jgBb3IwSBgQSBruS92C7ZZFohMi6cTGqT" "he2fcLXZFsG0O2Lu9NAJjv87H3ji0NSNUNFoe5O5fV98bVBHQGpeaIs1Igm8ufgi" "fd44XVZjMuzA6r+pz3gi/fIJ9wAkpXsaoADFW4gfgRGy3N5JSl9IXlvKS9iKJ2Ou" "0corL6jwVAZ4zR4POtgIkgJBAKrdnbjb6cSLP9TmrjPJ/AfLMI2zs8nSDtZjnMpw" "MwhwVT5cQUypJhlBhmEZf6wQRx2x04EIXdrdtYeWgpypAGkCAQE=" "-----END EC PARAMETERS-----"; if(name == "x962_p192v2") return "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD////////////////////+//////////8wNAQY" "/////////////////////v/////////8BBjMItbfuVxrJeScDWNkpOWYDDk6ohZo" "2VMEMQTuorrn4Ul4QvLed2nP6cmJwHKtaW9IA0pldNEdabbsemcruCoIPfLysIR9" "6XCy3hUCGQD///////////////5fsack3IBBhkjY3TECAQE=" "-----END EC PARAMETERS-----"; if(name == "x962_p192v3") return "-----BEGIN EC PARAMETERS-----" "MIGwAgEBMCQGByqGSM49AQECGQD////////////////////+//////////8wNAQY" "/////////////////////v/////////8BBgiEj3COVoFyqdCPa7MyUdgp9RiJWvV" "aRYEMQR9KXeBAMZaHaF4NxZYjc4ri0rujiKPGJY4qQ8iY3M3M0tJ3LZqbcj5l4rK" "dkipQ7ACGQD///////////////96YtAxyD9ClPZA7BMCAQE=" "-----END EC PARAMETERS-----"; if(name == "x962_p239v1") return "-----BEGIN EC PARAMETERS-----" "MIHSAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAAAAAH//////" "/zBABB5///////////////9///////+AAAAAAAB///////wEHmsBbDvc8YlB0NZU" "khR1ynGp2y+yfR03eWGFwpQsCgQ9BA/6ljzcqIFszDO4ZCvt+QXD01hXPT8n+707" "PLmqr33r6OTpCl2ubkBUylMLoEZUs2gYziJrOfzLewLxrgIef///////////////" "f///nl6an12QcfvRUiaIkJ0LAgEB" "-----END EC PARAMETERS-----"; if(name == "x962_p239v2") return "-----BEGIN EC PARAMETERS-----" "MIHSAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAAAAAH//////" "/zBABB5///////////////9///////+AAAAAAAB///////wEHmF/q2gyV2y7/tUN" "mfAknD/uWLlLoAOMeuhMjIMvLAQ9BDivCdmHJ3BRIMkhu16eJilqPNzy81dXoOr9" "h7gw51sBJeTb6g7HIG2g/AHZsIEyn7VV3m70YCN9/4vkugIef///////////////" "gAAAz6foWUN31BTAOCG8WCBjAgEB" "-----END EC PARAMETERS-----"; if(name == "x962_p239v3") return "-----BEGIN EC PARAMETERS-----" "MIHSAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAAAAAH//////" "/zBABB5///////////////9///////+AAAAAAAB///////wEHiVXBfoqMGZUsfTL" "A9anUKMMJQEC1JiHF9m6FattPgQ9BGdoro4Yu5LPzwBclJqixtlIU9DmYLv4VLHJ" "UF/pWhYH5omPOQwGvB1VK60ibztvz+SLboGEma8Y4+1s8wIef///////////////" "f///l13rQbOmBXw8QyFGUmVRAgEB" "-----END EC PARAMETERS-----"; if(name == "gost_256A") return "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD/////////////////////////////////////" "///9lzBEBCD////////////////////////////////////////9lAQgAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKYEQQQAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAY2R5HHgmJzaJ99QWkU/K3Y1KU8t3yPjsSKsyZyenx4UAiEA" "/////////////////////2xhEHCZWtEARYQbCbdhuJMCAQE=" "-----END EC PARAMETERS-----"; if(name == "frp256v1") return "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQDx/ReMCzrVjxASbejOQkNbOWGtvKvIym3o/PNT" "2G6cAzBEBCDx/ReMCzrVjxASbejOQkNbOWGtvKvIym3o/PNT2G6cAAQg7jU/ylQo" "qTANSrp1SkTAD9/sDJrksaGAMHXtlnt7tz8EQQS2s9TDVsE56zEYPUdJ1COVjCfS" "3K+YtwFkyXot2Y9c/2FC4PfIsgSRH5Jx8PPs74wnAcMH6OTJ4YMRWhVUBiz7AiEA" "8f0XjAs61Y8QEm3ozkJDW1PcZ+FA0r+UH/3UWcbWVeECAQE=" "-----END EC PARAMETERS-----"; if(name == "sm2p256v1") return "-----BEGIN EC PARAMETERS-----" "MIHgAgEBMCwGByqGSM49AQECIQD////+/////////////////////wAAAAD/////" "/////zBEBCD////+/////////////////////wAAAAD//////////AQgKOn6np2f" "XjRNWp5Lz2UJp/OXifUVq4+S3by9QU2UDpMEQQQyxK4sHxmBGV+ZBEZqOcmUj+ML" "v/JmC+FxWkWJM0x0x7w3NqL09necWb3O42tpIVPQqYd8xipHQALfMuUhOfCgAiEA" "/////v///////////////3ID32shxgUrU7v0CTnVQSMCAQE=" "-----END EC PARAMETERS-----"; #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) if(name == BOTAN_HOUSE_ECC_CURVE_NAME) return BOTAN_HOUSE_ECC_CURVE_PEM; #endif return ""; } const std::set& EC_Group::known_named_groups() { static const std::set named_groups = { "secp160k1", "secp160r1", "secp160r2", "secp192k1", "secp192r1", "secp224k1", "secp224r1", "secp256k1", "secp256r1", "secp384r1", "secp521r1", "brainpool160r1", "brainpool192r1", "brainpool224r1", "brainpool256r1", "brainpool320r1", "brainpool384r1", "brainpool512r1", "x962_p192v2", "x962_p192v3", "x962_p239v1", "x962_p239v2", "x962_p239v3", "gost_256A", "frp256v1", "sm2p256v1" #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) ,BOTAN_HOUSE_ECC_CURVE_NAME #endif }; return named_groups; } } botan-2.4.0/src/lib/pubkey/ec_group/info.txt000066400000000000000000000001401322470703100207450ustar00rootroot00000000000000 ECC_GROUP -> 20131128 asn1 ec_gfp numbertheory pem botan-2.4.0/src/lib/pubkey/ecc_key/000077500000000000000000000000001322470703100170555ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ecc_key/ecc_key.cpp000066400000000000000000000132651322470703100211720ustar00rootroot00000000000000/* * ECC Key implemenation * (C) 2007 Manuel Hartl, FlexSecure GmbH * Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { size_t EC_PublicKey::key_length() const { return domain().get_curve().get_p().bits(); } size_t EC_PublicKey::estimated_strength() const { return ecp_work_factor(key_length()); } EC_PublicKey::EC_PublicKey(const EC_Group& dom_par, const PointGFp& pub_point) : m_domain_params(dom_par), m_public_key(pub_point) { if (!dom_par.get_oid().empty()) m_domain_encoding = EC_DOMPAR_ENC_OID; else m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; if(domain().get_curve() != public_point().get_curve()) throw Invalid_Argument("EC_PublicKey: curve mismatch in constructor"); } EC_PublicKey::EC_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : m_domain_params{EC_Group(alg_id.get_parameters())}, m_public_key{OS2ECP(key_bits, domain().get_curve())} { if (!domain().get_oid().empty()) m_domain_encoding = EC_DOMPAR_ENC_OID; else m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; } bool EC_PublicKey::check_key(RandomNumberGenerator& rng, bool) const { //verify domain parameters if(!m_domain_params.verify_group(rng)) { return false; } //check that public point is not at infinity if(public_point().is_zero()) { return false; } //check that public point is on the curve if(!public_point().on_the_curve()) { return false; } if(m_domain_params.get_cofactor() > 1) { if((public_point() * m_domain_params.get_cofactor()).is_zero()) { return false; } //check that public point has order q if(!(public_point() * m_domain_params.get_order()).is_zero()) { return false; } } return true; } AlgorithmIdentifier EC_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), DER_domain()); } std::vector EC_PublicKey::public_key_bits() const { return unlock(EC2OSP(public_point(), PointGFp::COMPRESSED)); } void EC_PublicKey::set_parameter_encoding(EC_Group_Encoding form) { if(form != EC_DOMPAR_ENC_EXPLICIT && form != EC_DOMPAR_ENC_IMPLICITCA && form != EC_DOMPAR_ENC_OID) throw Invalid_Argument("Invalid encoding form for EC-key object specified"); if((form == EC_DOMPAR_ENC_OID) && (m_domain_params.get_oid() == "")) throw Invalid_Argument("Invalid encoding form OID specified for " "EC-key object whose corresponding domain " "parameters are without oid"); m_domain_encoding = form; } const BigInt& EC_PrivateKey::private_value() const { if(m_private_key == 0) throw Invalid_State("EC_PrivateKey::private_value - uninitialized"); return m_private_key; } /** * EC_PrivateKey constructor */ EC_PrivateKey::EC_PrivateKey(RandomNumberGenerator& rng, const EC_Group& ec_group, const BigInt& x, bool with_modular_inverse) { m_domain_params = ec_group; if (!ec_group.get_oid().empty()) m_domain_encoding = EC_DOMPAR_ENC_OID; else m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; if(x == 0) { m_private_key = BigInt::random_integer(rng, 1, domain().get_order()); } else { m_private_key = x; } m_public_key = domain().get_base_point() * ((with_modular_inverse) ? inverse_mod(m_private_key, m_domain_params.get_order()) : m_private_key); BOTAN_ASSERT(m_public_key.on_the_curve(), "Generated public key point was on the curve"); } secure_vector EC_PrivateKey::private_key_bits() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(static_cast(1)) .encode(BigInt::encode_1363(m_private_key, m_private_key.bytes()), OCTET_STRING) .end_cons() .get_contents(); } EC_PrivateKey::EC_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits, bool with_modular_inverse) { m_domain_params = EC_Group(alg_id.get_parameters()); m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; if (!domain().get_oid().empty()) m_domain_encoding = EC_DOMPAR_ENC_OID; else m_domain_encoding = EC_DOMPAR_ENC_EXPLICIT; OID key_parameters; secure_vector public_key_bits; BER_Decoder(key_bits) .start_cons(SEQUENCE) .decode_and_check(1, "Unknown version code for ECC key") .decode_octet_string_bigint(m_private_key) .decode_optional(key_parameters, ASN1_Tag(0), PRIVATE) .decode_optional_string(public_key_bits, BIT_STRING, 1, PRIVATE) .end_cons(); if(public_key_bits.empty()) { m_public_key = domain().get_base_point() * ((with_modular_inverse) ? inverse_mod(m_private_key, m_domain_params.get_order()) : m_private_key); BOTAN_ASSERT(m_public_key.on_the_curve(), "Public point derived from loaded key was on the curve"); } else { m_public_key = OS2ECP(public_key_bits, domain().get_curve()); // OS2ECP verifies that the point is on the curve } } } botan-2.4.0/src/lib/pubkey/ecc_key/ecc_key.h000066400000000000000000000120421322470703100206270ustar00rootroot00000000000000/* * ECDSA * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECC_PUBLIC_KEY_BASE_H_ #define BOTAN_ECC_PUBLIC_KEY_BASE_H_ #include #include namespace Botan { /** * This class represents abstract ECC public keys. When encoding a key * via an encoder that can be accessed via the corresponding member * functions, the key will decide upon its internally stored encoding * information whether to encode itself with or without domain * parameters, or using the domain parameter oid. Furthermore, a public * key without domain parameters can be decoded. In that case, it * cannot be used for verification until its domain parameters are set * by calling the corresponding member function. */ class BOTAN_PUBLIC_API(2,0) EC_PublicKey : public virtual Public_Key { public: /** * Create a public key. * @param dom_par EC domain parameters * @param pub_point public point on the curve */ EC_PublicKey(const EC_Group& dom_par, const PointGFp& pub_point); /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ EC_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits); EC_PublicKey(const EC_PublicKey& other) = default; EC_PublicKey& operator=(const EC_PublicKey& other) = default; virtual ~EC_PublicKey() = default; /** * Get the public point of this key. * @throw Invalid_State is thrown if the * domain parameters of this point are not set * @result the public point of this key */ const PointGFp& public_point() const { return m_public_key; } AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; bool check_key(RandomNumberGenerator& rng, bool strong) const override; /** * Get the domain parameters of this key. * @throw Invalid_State is thrown if the * domain parameters of this point are not set * @result the domain parameters of this key */ const EC_Group& domain() const { return m_domain_params; } /** * Set the domain parameter encoding to be used when encoding this key. * @param enc the encoding to use */ void set_parameter_encoding(EC_Group_Encoding enc); /** * Return the DER encoding of this keys domain in whatever format * is preset for this particular key */ std::vector DER_domain() const { return domain().DER_encode(domain_format()); } /** * Get the domain parameter encoding to be used when encoding this key. * @result the encoding to use */ EC_Group_Encoding domain_format() const { return m_domain_encoding; } size_t key_length() const override; size_t estimated_strength() const override; protected: EC_PublicKey() : m_domain_params{}, m_public_key{}, m_domain_encoding(EC_DOMPAR_ENC_EXPLICIT) {} EC_Group m_domain_params; PointGFp m_public_key; EC_Group_Encoding m_domain_encoding; }; /** * This abstract class represents ECC private keys */ class BOTAN_PUBLIC_API(2,0) EC_PrivateKey : public virtual EC_PublicKey, public virtual Private_Key { public: /* * If x=0, creates a new private key in the domain * using the given rng. If with_modular_inverse is set, * the public key will be calculated by multiplying * the base point with the modular inverse of * x (as in ECGDSA and ECKCDSA), otherwise by * multiplying directly with x (as in ECDSA). */ EC_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x, bool with_modular_inverse=false); /* * Creates a new private key object from the * ECPrivateKey structure given in key_bits. * If with_modular_inverse is set, * the public key will be calculated by multiplying * the base point with the modular inverse of * x (as in ECGDSA and ECKCDSA), otherwise by * multiplying directly with x (as in ECDSA). */ EC_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits, bool with_modular_inverse=false); secure_vector private_key_bits() const override; /** * Get the private key value of this key object. * @result the private key value of this key object */ const BigInt& private_value() const; EC_PrivateKey(const EC_PrivateKey& other) = default; EC_PrivateKey& operator=(const EC_PrivateKey& other) = default; ~EC_PrivateKey() = default; protected: EC_PrivateKey() = default; BigInt m_private_key; }; } #endif botan-2.4.0/src/lib/pubkey/ecc_key/info.txt000066400000000000000000000001701322470703100205470ustar00rootroot00000000000000 ECC_PUBLIC_KEY_CRYPTO -> 20131128 asn1 bigint ec_gfp ec_group numbertheory botan-2.4.0/src/lib/pubkey/ecdh/000077500000000000000000000000001322470703100163565ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ecdh/ecdh.cpp000066400000000000000000000044531322470703100177730ustar00rootroot00000000000000/* * ECDH implemenation * (C) 2007 Manuel Hartl, FlexSecure GmbH * 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { namespace { /** * ECDH operation */ class ECDH_KA_Operation final : public PK_Ops::Key_Agreement_with_KDF { public: ECDH_KA_Operation(const ECDH_PrivateKey& key, const std::string& kdf, RandomNumberGenerator& rng) : PK_Ops::Key_Agreement_with_KDF(kdf), m_curve(key.domain().get_curve()), m_cofactor(key.domain().get_cofactor()), m_order(key.domain().get_order()), m_rng(rng) { m_l_times_priv = inverse_mod(m_cofactor, m_order) * key.private_value(); } secure_vector raw_agree(const uint8_t w[], size_t w_len) override { PointGFp point = OS2ECP(w, w_len, m_curve); PointGFp S = m_cofactor * point; Blinded_Point_Multiply blinder(S, m_order); S = blinder.blinded_multiply(m_l_times_priv, m_rng); BOTAN_ASSERT(S.on_the_curve(), "ECDH agreed value was on the curve"); return BigInt::encode_1363(S.get_affine_x(), m_curve.get_p().bytes()); } private: const CurveGFp& m_curve; const BigInt& m_cofactor; const BigInt& m_order; BigInt m_l_times_priv; RandomNumberGenerator& m_rng; }; } std::unique_ptr ECDH_PrivateKey::create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { try { return make_openssl_ecdh_ka_op(*this, params); } catch(Lookup_Error&) { if(provider == "openssl") throw; } } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new ECDH_KA_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/ecdh/ecdh.h000066400000000000000000000062261322470703100174400ustar00rootroot00000000000000/* * ECDH * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECDH_KEY_H_ #define BOTAN_ECDH_KEY_H_ #include namespace Botan { /** * This class represents ECDH Public Keys. */ class BOTAN_PUBLIC_API(2,0) ECDH_PublicKey : public virtual EC_PublicKey { public: /** * Create an ECDH public key. * @param alg_id algorithm identifier * @param key_bits DER encoded public key bits */ ECDH_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ ECDH_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Get this keys algorithm name. * @return this keys algorithm name */ std::string algo_name() const override { return "ECDH"; } /** * @return public point value */ std::vector public_value() const { return unlock(EC2OSP(public_point(), PointGFp::UNCOMPRESSED)); } /** * @return public point value */ std::vector public_value(PointGFp::Compression_Type type) const { return unlock(EC2OSP(public_point(), static_cast(type))); } protected: ECDH_PublicKey() = default; }; /** * This class represents ECDH Private Keys. */ class BOTAN_PUBLIC_API(2,0) ECDH_PrivateKey final : public ECDH_PublicKey, public EC_PrivateKey, public PK_Key_Agreement_Key { public: /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ ECDH_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits) {} /** * Generate a new private key * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key; if zero, a new random key is generated */ ECDH_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x) {} std::vector public_value() const override { return ECDH_PublicKey::public_value(PointGFp::UNCOMPRESSED); } std::vector public_value(PointGFp::Compression_Type type) const { return ECDH_PublicKey::public_value(type); } std::unique_ptr create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/ecdh/info.txt000066400000000000000000000001411322470703100200460ustar00rootroot00000000000000 ECDH -> 20131128 asn1 ec_group ecc_key numbertheory botan-2.4.0/src/lib/pubkey/ecdsa/000077500000000000000000000000001322470703100165325ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ecdsa/ecdsa.cpp000066400000000000000000000147531322470703100203270ustar00rootroot00000000000000/* * ECDSA implemenation * (C) 2007 Manuel Hartl, FlexSecure GmbH * 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010,2015,2016 Jack Lloyd * 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #if defined(BOTAN_HAS_RFC6979_GENERATOR) #include #endif #if defined(BOTAN_HAS_BEARSSL) #include #endif #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { bool ECDSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { /** * ECDSA signature operation */ class ECDSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA { public: ECDSA_Signature_Operation(const ECDSA_PrivateKey& ecdsa, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_order(ecdsa.domain().get_order()), m_base_point(ecdsa.domain().get_base_point(), m_order), m_x(ecdsa.private_value()), m_mod_order(m_order) { #if defined(BOTAN_HAS_RFC6979_GENERATOR) m_rfc6979_hash = hash_for_emsa(emsa); #endif } size_t max_input_bits() const override { return m_order.bits(); } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; private: const BigInt& m_order; Blinded_Point_Multiply m_base_point; const BigInt& m_x; Modular_Reducer m_mod_order; #if defined(BOTAN_HAS_RFC6979_GENERATOR) std::string m_rfc6979_hash; #endif }; secure_vector ECDSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) { const BigInt m(msg, msg_len); #if defined(BOTAN_HAS_RFC6979_GENERATOR) const BigInt k = generate_rfc6979_nonce(m_x, m_order, m, m_rfc6979_hash); #else const BigInt k = BigInt::random_integer(rng, 1, m_order); #endif const PointGFp k_times_P = m_base_point.blinded_multiply(k, rng); const BigInt r = m_mod_order.reduce(k_times_P.get_affine_x()); const BigInt s = m_mod_order.multiply(inverse_mod(k, m_order), mul_add(m_x, r, m)); // With overwhelming probability, a bug rather than actual zero r/s BOTAN_ASSERT(s != 0, "invalid s"); BOTAN_ASSERT(r != 0, "invalid r"); return BigInt::encode_fixed_length_int_pair(r, s, m_order.bytes()); } /** * ECDSA verification operation */ class ECDSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: ECDSA_Verification_Operation(const ECDSA_PublicKey& ecdsa, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_base_point(ecdsa.domain().get_base_point()), m_public_point(ecdsa.public_point()), m_order(ecdsa.domain().get_order()), m_mod_order(m_order) { //m_public_point.precompute_multiples(); } size_t max_input_bits() const override { return m_order.bits(); } bool with_recovery() const override { return false; } bool verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) override; private: const PointGFp& m_base_point; const PointGFp& m_public_point; const BigInt& m_order; // FIXME: should be offered by curve Modular_Reducer m_mod_order; }; bool ECDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) { if(sig_len != m_order.bytes()*2) return false; BigInt e(msg, msg_len); BigInt r(sig, sig_len / 2); BigInt s(sig + sig_len / 2, sig_len / 2); if(r <= 0 || r >= m_order || s <= 0 || s >= m_order) return false; BigInt w = inverse_mod(s, m_order); const BigInt u1 = m_mod_order.reduce(e * w); const BigInt u2 = m_mod_order.reduce(r * w); const PointGFp R = multi_exponentiate(m_base_point, u1, m_public_point, u2); if(R.is_zero()) return false; const BigInt v = m_mod_order.reduce(R.get_affine_x()); return (v == r); } } std::unique_ptr ECDSA_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_BEARSSL) if(provider == "bearssl" || provider.empty()) { try { return make_bearssl_ecdsa_ver_op(*this, params); } catch(Lookup_Error& e) { if(provider == "bearssl") throw; } } #endif #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { try { return make_openssl_ecdsa_ver_op(*this, params); } catch(Lookup_Error& e) { if(provider == "openssl") throw; } } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new ECDSA_Verification_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr ECDSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_BEARSSL) if(provider == "bearssl" || provider.empty()) { try { return make_bearssl_ecdsa_sig_op(*this, params); } catch(Lookup_Error& e) { if(provider == "bearssl") throw; } } #endif #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { try { return make_openssl_ecdsa_sig_op(*this, params); } catch(Lookup_Error& e) { if(provider == "openssl") throw; } } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new ECDSA_Signature_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/ecdsa/ecdsa.h000066400000000000000000000055401322470703100177660ustar00rootroot00000000000000/* * ECDSA * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECDSA_KEY_H_ #define BOTAN_ECDSA_KEY_H_ #include namespace Botan { /** * This class represents ECDSA Public Keys. */ class BOTAN_PUBLIC_API(2,0) ECDSA_PublicKey : public virtual EC_PublicKey { public: /** * Create a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ ECDSA_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ ECDSA_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Get this keys algorithm name. * @result this keys algorithm name ("ECDSA") */ std::string algo_name() const override { return "ECDSA"; } size_t message_parts() const override { return 2; } size_t message_part_size() const override { return domain().get_order().bytes(); } std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: ECDSA_PublicKey() = default; }; /** * This class represents ECDSA Private Keys */ class BOTAN_PUBLIC_API(2,0) ECDSA_PrivateKey final : public ECDSA_PublicKey, public EC_PrivateKey { public: /** * Load a private key * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ ECDSA_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits) {} /** * Create a private key. * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key (if zero, generate a new random key) */ ECDSA_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x) {} bool check_key(RandomNumberGenerator& rng, bool) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/ecdsa/info.txt000066400000000000000000000001741322470703100202300ustar00rootroot00000000000000 ECDSA -> 20131128 asn1 ec_group ecc_key keypair numbertheory rng emsa1 sha2_32 botan-2.4.0/src/lib/pubkey/ecgdsa/000077500000000000000000000000001322470703100167015ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ecgdsa/ecgdsa.cpp000066400000000000000000000111571322470703100206400ustar00rootroot00000000000000/* * ECGDSA (BSI-TR-03111, version 2.0) * (C) 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { bool ECGDSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { /** * ECGDSA signature operation */ class ECGDSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA { public: ECGDSA_Signature_Operation(const ECGDSA_PrivateKey& ecgdsa, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_order(ecgdsa.domain().get_order()), m_base_point(ecgdsa.domain().get_base_point(), m_order), m_x(ecgdsa.private_value()), m_mod_order(m_order) { } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; size_t max_input_bits() const override { return m_order.bits(); } private: const BigInt& m_order; Blinded_Point_Multiply m_base_point; const BigInt& m_x; Modular_Reducer m_mod_order; }; secure_vector ECGDSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) { const BigInt m(msg, msg_len); BigInt k = BigInt::random_integer(rng, 1, m_order); const PointGFp k_times_P = m_base_point.blinded_multiply(k, rng); const BigInt r = m_mod_order.reduce(k_times_P.get_affine_x()); const BigInt s = m_mod_order.multiply(m_x, mul_sub(k, r, m)); // With overwhelming probability, a bug rather than actual zero r/s BOTAN_ASSERT(s != 0, "invalid s"); BOTAN_ASSERT(r != 0, "invalid r"); return BigInt::encode_fixed_length_int_pair(r, s, m_order.bytes()); } /** * ECGDSA verification operation */ class ECGDSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: ECGDSA_Verification_Operation(const ECGDSA_PublicKey& ecgdsa, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_base_point(ecgdsa.domain().get_base_point()), m_public_point(ecgdsa.public_point()), m_order(ecgdsa.domain().get_order()), m_mod_order(m_order) { } size_t max_input_bits() const override { return m_order.bits(); } bool with_recovery() const override { return false; } bool verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) override; private: const PointGFp& m_base_point; const PointGFp& m_public_point; const BigInt& m_order; // FIXME: should be offered by curve Modular_Reducer m_mod_order; }; bool ECGDSA_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) { if(sig_len != m_order.bytes()*2) return false; BigInt e(msg, msg_len); BigInt r(sig, sig_len / 2); BigInt s(sig + sig_len / 2, sig_len / 2); if(r <= 0 || r >= m_order || s <= 0 || s >= m_order) return false; BigInt w = inverse_mod(r, m_order); const BigInt u1 = m_mod_order.reduce(e * w); const BigInt u2 = m_mod_order.reduce(s * w); const PointGFp R = multi_exponentiate(m_base_point, u1, m_public_point, u2); if(R.is_zero()) return false; const BigInt v = m_mod_order.reduce(R.get_affine_x()); return (v == r); } } std::unique_ptr ECGDSA_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new ECGDSA_Verification_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr ECGDSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new ECGDSA_Signature_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/ecgdsa/ecgdsa.h000066400000000000000000000055161322470703100203070ustar00rootroot00000000000000/* * ECGDSA (BSI-TR-03111, version 2.0) * (C) 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECGDSA_KEY_H_ #define BOTAN_ECGDSA_KEY_H_ #include namespace Botan { /** * This class represents ECGDSA public keys. */ class BOTAN_PUBLIC_API(2,0) ECGDSA_PublicKey : public virtual EC_PublicKey { public: /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ ECGDSA_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ ECGDSA_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Get this keys algorithm name. * @result this keys algorithm name ("ECGDSA") */ std::string algo_name() const override { return "ECGDSA"; } size_t message_parts() const override { return 2; } size_t message_part_size() const override { return domain().get_order().bytes(); } std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: ECGDSA_PublicKey() = default; }; /** * This class represents ECGDSA private keys. */ class BOTAN_PUBLIC_API(2,0) ECGDSA_PrivateKey final : public ECGDSA_PublicKey, public EC_PrivateKey { public: /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ ECGDSA_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits, true) {} /** * Generate a new private key. * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key (if zero, generate a new random key) */ ECGDSA_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x, true) {} bool check_key(RandomNumberGenerator& rng, bool) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/ecgdsa/info.txt000066400000000000000000000002041322470703100203710ustar00rootroot00000000000000 ECGDSA -> 20160301 asn1 bigint ec_group ecc_key keypair numbertheory rng emsa1 sha2_32 botan-2.4.0/src/lib/pubkey/ecies/000077500000000000000000000000001322470703100165435ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ecies/ecies.cpp000066400000000000000000000345571322470703100203550ustar00rootroot00000000000000/* * ECIES * (C) 2016 Philipp Weber * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { /** * Private key type for ECIES_ECDH_KA_Operation */ class ECIES_PrivateKey final : public EC_PrivateKey, public PK_Key_Agreement_Key { public: explicit ECIES_PrivateKey(const ECDH_PrivateKey& private_key) : EC_PublicKey(private_key), EC_PrivateKey(private_key), PK_Key_Agreement_Key(), m_key(private_key) { } std::vector public_value() const override { return m_key.public_value(); } std::string algo_name() const override { return "ECIES"; } std::unique_ptr create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; private: ECDH_PrivateKey m_key; }; /** * Implements ECDH key agreement without using the cofactor mode */ class ECIES_ECDH_KA_Operation final : public PK_Ops::Key_Agreement_with_KDF { public: ECIES_ECDH_KA_Operation(const ECIES_PrivateKey& private_key, RandomNumberGenerator& rng) : PK_Ops::Key_Agreement_with_KDF("Raw"), m_key(private_key), m_rng(rng) { } secure_vector raw_agree(const uint8_t w[], size_t w_len) override { const CurveGFp& curve = m_key.domain().get_curve(); PointGFp point = OS2ECP(w, w_len, curve); Blinded_Point_Multiply blinder(point, m_key.domain().get_order()); PointGFp S = blinder.blinded_multiply(m_key.private_value(), m_rng); BOTAN_ASSERT(S.on_the_curve(), "ECDH agreed value was on the curve"); return BigInt::encode_1363(S.get_affine_x(), curve.get_p().bytes()); } private: ECIES_PrivateKey m_key; RandomNumberGenerator& m_rng; }; std::unique_ptr ECIES_PrivateKey::create_key_agreement_op(RandomNumberGenerator& rng, const std::string& /*params*/, const std::string& /*provider*/) const { return std::unique_ptr(new ECIES_ECDH_KA_Operation(*this, rng)); } /** * Creates a PK_Key_Agreement instance for the given key and ecies_params * Returns either ECIES_ECDH_KA_Operation or the default implementation for the given key, * depending on the key and ecies_params * @param private_key the private key used for the key agreement * @param ecies_params settings for ecies * @param for_encryption disable cofactor mode if the secret will be used for encryption * (according to ISO 18033 cofactor mode is only used during decryption) */ PK_Key_Agreement create_key_agreement(const PK_Key_Agreement_Key& private_key, const ECIES_KA_Params& ecies_params, bool for_encryption, RandomNumberGenerator& rng) { const ECDH_PrivateKey* ecdh_key = dynamic_cast(&private_key); if(ecdh_key == nullptr && (ecies_params.cofactor_mode() || ecies_params.old_cofactor_mode() || ecies_params.check_mode())) { // assume we have a private key from an external provider (e.g. pkcs#11): // there is no way to determine or control whether the provider uses cofactor mode or not. // ISO 18033 does not allow cofactor mode in combination with old cofactor mode or check mode // => disable cofactor mode, old cofactor mode and check mode for unknown keys/providers (as a precaution). throw Invalid_Argument("ECIES: cofactor, old cofactor and check mode are only supported for ECDH_PrivateKey"); } if(ecdh_key && (for_encryption || !ecies_params.cofactor_mode())) { // ECDH_KA_Operation uses cofactor mode: use own key agreement method if cofactor should not be used. return PK_Key_Agreement(ECIES_PrivateKey(*ecdh_key), rng, "Raw"); } return PK_Key_Agreement(private_key, rng, "Raw"); // use default implementation } } ECIES_KA_Operation::ECIES_KA_Operation(const PK_Key_Agreement_Key& private_key, const ECIES_KA_Params& ecies_params, bool for_encryption, RandomNumberGenerator& rng) : m_ka(create_key_agreement(private_key, ecies_params, for_encryption, rng)), m_params(ecies_params) { } /** * ECIES secret derivation according to ISO 18033-2 */ SymmetricKey ECIES_KA_Operation::derive_secret(const std::vector& eph_public_key_bin, const PointGFp& other_public_key_point) const { if(other_public_key_point.is_zero()) { throw Invalid_Argument("ECIES: other public key point is zero"); } std::unique_ptr kdf = Botan::KDF::create_or_throw(m_params.kdf_spec()); PointGFp other_point = other_public_key_point; // ISO 18033: step b if(m_params.old_cofactor_mode()) { other_point *= m_params.domain().get_cofactor(); } secure_vector derivation_input; // ISO 18033: encryption step e / decryption step g if(!m_params.single_hash_mode()) { derivation_input += eph_public_key_bin; } // ISO 18033: encryption step f / decryption step h secure_vector other_public_key_bin = EC2OSP(other_point, static_cast(m_params.compression_type())); // Note: the argument `m_params.secret_length()` passed for `key_len` will only be used by providers because // "Raw" is passed to the `PK_Key_Agreement` if the implementation of botan is used. const SymmetricKey peh = m_ka.derive_key(m_params.domain().get_order().bytes(), other_public_key_bin.data(), other_public_key_bin.size()); derivation_input.insert(derivation_input.end(), peh.begin(), peh.end()); // ISO 18033: encryption step g / decryption step i return kdf->derive_key(m_params.secret_length(), derivation_input); } ECIES_KA_Params::ECIES_KA_Params(const EC_Group& domain, const std::string& kdf_spec, size_t length, PointGFp::Compression_Type compression_type, ECIES_Flags flags) : m_domain(domain), m_kdf_spec(kdf_spec), m_length(length), m_compression_mode(compression_type), m_flags(flags) { } ECIES_System_Params::ECIES_System_Params(const EC_Group& domain, const std::string& kdf_spec, const std::string& dem_algo_spec, size_t dem_key_len, const std::string& mac_spec, size_t mac_key_len, PointGFp::Compression_Type compression_type, ECIES_Flags flags) : ECIES_KA_Params(domain, kdf_spec, dem_key_len + mac_key_len, compression_type, flags), m_dem_spec(dem_algo_spec), m_dem_keylen(dem_key_len), m_mac_spec(mac_spec), m_mac_keylen(mac_key_len) { // ISO 18033: "At most one of CofactorMode, OldCofactorMode, and CheckMode may be 1." if(size_t(cofactor_mode()) + size_t(old_cofactor_mode()) + size_t(check_mode()) > 1) { throw Invalid_Argument("ECIES: only one of cofactor_mode, old_cofactor_mode and check_mode can be set"); } } ECIES_System_Params::ECIES_System_Params(const EC_Group& domain, const std::string& kdf_spec, const std::string& dem_algo_spec, size_t dem_key_len, const std::string& mac_spec, size_t mac_key_len) : ECIES_System_Params(domain, kdf_spec, dem_algo_spec, dem_key_len, mac_spec, mac_key_len, PointGFp::UNCOMPRESSED, ECIES_Flags::NONE) { } std::unique_ptr ECIES_System_Params::create_mac() const { return Botan::MessageAuthenticationCode::create_or_throw(m_mac_spec); } std::unique_ptr ECIES_System_Params::create_cipher(Botan::Cipher_Dir direction) const { Cipher_Mode* cipher = get_cipher_mode(m_dem_spec, direction); if(cipher == nullptr) { throw Algorithm_Not_Found(m_dem_spec); } return std::unique_ptr(cipher); } /* * ECIES_Encryptor Constructor */ ECIES_Encryptor::ECIES_Encryptor(const PK_Key_Agreement_Key& private_key, const ECIES_System_Params& ecies_params, RandomNumberGenerator& rng) : m_ka(private_key, ecies_params, true, rng), m_params(ecies_params), m_eph_public_key_bin(private_key.public_value()), // returns the uncompressed public key, see conversion below m_iv(), m_other_point(), m_label() { if(ecies_params.compression_type() != PointGFp::UNCOMPRESSED) { // ISO 18033: step d // convert only if necessary; m_eph_public_key_bin has been initialized with the uncompressed format m_eph_public_key_bin = unlock(EC2OSP(OS2ECP(m_eph_public_key_bin, m_params.domain().get_curve()), static_cast(ecies_params.compression_type()))); } } /* * ECIES_Encryptor Constructor */ ECIES_Encryptor::ECIES_Encryptor(RandomNumberGenerator& rng, const ECIES_System_Params& ecies_params) : ECIES_Encryptor(ECDH_PrivateKey(rng, ecies_params.domain()), ecies_params, rng) { } /* * ECIES Encryption according to ISO 18033-2 */ std::vector ECIES_Encryptor::enc(const uint8_t data[], size_t length, RandomNumberGenerator&) const { if(m_other_point.is_zero()) { throw Invalid_State("ECIES: the other key is zero"); } const SymmetricKey secret_key = m_ka.derive_secret(m_eph_public_key_bin, m_other_point); // encryption std::unique_ptr cipher = m_params.create_cipher(ENCRYPTION); BOTAN_ASSERT(cipher != nullptr, "Cipher is found"); cipher->set_key(SymmetricKey(secret_key.begin(), m_params.dem_keylen())); if(m_iv.size() != 0) { cipher->start(m_iv.bits_of()); } secure_vector encrypted_data(data, data + length); cipher->finish(encrypted_data); // concat elements std::unique_ptr mac = m_params.create_mac(); BOTAN_ASSERT(mac != nullptr, "MAC is found"); secure_vector out(m_eph_public_key_bin.size() + encrypted_data.size() + mac->output_length()); buffer_insert(out, 0, m_eph_public_key_bin); buffer_insert(out, m_eph_public_key_bin.size(), encrypted_data); // mac mac->set_key(secret_key.begin() + m_params.dem_keylen(), m_params.mac_keylen()); mac->update(encrypted_data); if(!m_label.empty()) { mac->update(m_label); } mac->final(out.data() + m_eph_public_key_bin.size() + encrypted_data.size()); return unlock(out); } ECIES_Decryptor::ECIES_Decryptor(const PK_Key_Agreement_Key& key, const ECIES_System_Params& ecies_params, RandomNumberGenerator& rng) : m_ka(key, ecies_params, false, rng), m_params(ecies_params), m_iv(), m_label() { // ISO 18033: "If v > 1 and CheckMode = 0, then we must have gcd(u, v) = 1." (v = index, u= order) if(!ecies_params.check_mode()) { Botan::BigInt cofactor = m_params.domain().get_cofactor(); if(cofactor > 1 && Botan::gcd(cofactor, m_params.domain().get_order()) != 1) { throw Invalid_Argument("ECIES: gcd of cofactor and order must be 1 if check_mode is 0"); } } } /** * ECIES Decryption according to ISO 18033-2 */ secure_vector ECIES_Decryptor::do_decrypt(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const { size_t point_size = m_params.domain().get_curve().get_p().bytes(); if(m_params.compression_type() != PointGFp::COMPRESSED) { point_size *= 2; // uncompressed and hybrid contains x AND y } point_size += 1; // format byte std::unique_ptr mac = m_params.create_mac(); BOTAN_ASSERT(mac != nullptr, "MAC is found"); if(in_len < point_size + mac->output_length()) { throw Decoding_Error("ECIES decryption: ciphertext is too short"); } // extract data const std::vector other_public_key_bin(in, in + point_size); // the received (ephemeral) public key const std::vector encrypted_data(in + point_size, in + in_len - mac->output_length()); const std::vector mac_data(in + in_len - mac->output_length(), in + in_len); // ISO 18033: step a PointGFp other_public_key = OS2ECP(other_public_key_bin, m_params.domain().get_curve()); // ISO 18033: step b if(m_params.check_mode() && !other_public_key.on_the_curve()) { throw Decoding_Error("ECIES decryption: received public key is not on the curve"); } // ISO 18033: step e (and step f because get_affine_x (called by ECDH_KA_Operation::raw_agree) // throws Illegal_Transformation if the point is zero) const SymmetricKey secret_key = m_ka.derive_secret(other_public_key_bin, other_public_key); // validate mac mac->set_key(secret_key.begin() + m_params.dem_keylen(), m_params.mac_keylen()); mac->update(encrypted_data); if(!m_label.empty()) { mac->update(m_label); } const secure_vector calculated_mac = mac->final(); valid_mask = CT::expand_mask(constant_time_compare(mac_data.data(), calculated_mac.data(), mac_data.size())); if(valid_mask) { // decrypt data std::unique_ptr cipher = m_params.create_cipher(DECRYPTION); BOTAN_ASSERT(cipher != nullptr, "Cipher is found"); cipher->set_key(SymmetricKey(secret_key.begin(), m_params.dem_keylen())); if(m_iv.size() != 0) { cipher->start(m_iv.bits_of()); } try { // the decryption can fail: // e.g. Integrity_Failure is thrown if GCM is used and the message does not have a valid tag secure_vector decrypted_data(encrypted_data.begin(), encrypted_data.end()); cipher->finish(decrypted_data); return decrypted_data; } catch(...) { valid_mask = 0; } } return secure_vector(); } } botan-2.4.0/src/lib/pubkey/ecies/ecies.h000066400000000000000000000242351322470703100200120ustar00rootroot00000000000000/* * ECIES * (C) 2016 Philipp Weber * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECIES_H_ #define BOTAN_ECIES_H_ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { class MessageAuthenticationCode; class RandomNumberGenerator; enum class ECIES_Flags : uint32_t { NONE = 0, /// if set: prefix the input of the (ecdh) key agreement with the encoded (ephemeral) public key SINGLE_HASH_MODE = 1, /// (decryption only) if set: use cofactor multiplication during (ecdh) key agreement COFACTOR_MODE = 2, /// if set: use ecdhc instead of ecdh OLD_COFACTOR_MODE = 4, /// (decryption only) if set: test if the (ephemeral) public key is on the curve CHECK_MODE = 8 }; inline ECIES_Flags operator |(ECIES_Flags a, ECIES_Flags b) { return static_cast(static_cast(a) | static_cast(b)); } inline ECIES_Flags operator &(ECIES_Flags a, ECIES_Flags b) { return static_cast(static_cast(a) & static_cast(b)); } /** * Parameters for ECIES secret derivation */ class BOTAN_PUBLIC_API(2,0) ECIES_KA_Params { public: /** * @param domain ec domain parameters of the involved ec keys * @param kdf_spec name of the key derivation function * @param length length of the secret to be derived * @param compression_type format of encoded keys (affects the secret derivation if single_hash_mode is used) * @param flags options, see documentation of ECIES_Flags */ ECIES_KA_Params(const EC_Group& domain, const std::string& kdf_spec, size_t length, PointGFp::Compression_Type compression_type, ECIES_Flags flags); ECIES_KA_Params(const ECIES_KA_Params&) = default; ECIES_KA_Params& operator=(const ECIES_KA_Params&) = default; virtual ~ECIES_KA_Params() = default; inline const EC_Group& domain() const { return m_domain; } inline size_t secret_length() const { return m_length; } inline bool single_hash_mode() const { return (m_flags & ECIES_Flags::SINGLE_HASH_MODE) == ECIES_Flags::SINGLE_HASH_MODE; } inline bool cofactor_mode() const { return (m_flags & ECIES_Flags::COFACTOR_MODE) == ECIES_Flags::COFACTOR_MODE; } inline bool old_cofactor_mode() const { return (m_flags & ECIES_Flags::OLD_COFACTOR_MODE) == ECIES_Flags::OLD_COFACTOR_MODE; } inline bool check_mode() const { return (m_flags & ECIES_Flags::CHECK_MODE) == ECIES_Flags::CHECK_MODE; } inline PointGFp::Compression_Type compression_type() const { return m_compression_mode; } const std::string& kdf_spec() const { return m_kdf_spec; } private: const EC_Group m_domain; const std::string m_kdf_spec; const size_t m_length; const PointGFp::Compression_Type m_compression_mode; const ECIES_Flags m_flags; }; class BOTAN_PUBLIC_API(2,0) ECIES_System_Params final : public ECIES_KA_Params { public: /** * @param domain ec domain parameters of the involved ec keys * @param kdf_spec name of the key derivation function * @param dem_algo_spec name of the data encryption method * @param dem_key_len length of the key used for the data encryption method * @param mac_spec name of the message authentication code * @param mac_key_len length of the key used for the message authentication code */ ECIES_System_Params(const EC_Group& domain, const std::string& kdf_spec, const std::string& dem_algo_spec, size_t dem_key_len, const std::string& mac_spec, size_t mac_key_len); /** * @param domain ec domain parameters of the involved ec keys * @param kdf_spec name of the key derivation function * @param dem_algo_spec name of the data encryption method * @param dem_key_len length of the key used for the data encryption method * @param mac_spec name of the message authentication code * @param mac_key_len length of the key used for the message authentication code * @param compression_type format of encoded keys (affects the secret derivation if single_hash_mode is used) * @param flags options, see documentation of ECIES_Flags */ ECIES_System_Params(const EC_Group& domain, const std::string& kdf_spec, const std::string& dem_algo_spec, size_t dem_key_len, const std::string& mac_spec, size_t mac_key_len, PointGFp::Compression_Type compression_type, ECIES_Flags flags); ECIES_System_Params(const ECIES_System_Params&) = default; ECIES_System_Params& operator=(const ECIES_System_Params&) = default; virtual ~ECIES_System_Params() = default; /// creates an instance of the message authentication code std::unique_ptr create_mac() const; /// creates an instance of the data encryption method std::unique_ptr create_cipher(Botan::Cipher_Dir direction) const; /// returns the length of the key used by the data encryption method inline size_t dem_keylen() const { return m_dem_keylen; } /// returns the length of the key used by the message authentication code inline size_t mac_keylen() const { return m_mac_keylen; } private: const std::string m_dem_spec; const size_t m_dem_keylen; const std::string m_mac_spec; const size_t m_mac_keylen; }; /** * ECIES secret derivation according to ISO 18033-2 */ class BOTAN_PUBLIC_API(2,0) ECIES_KA_Operation { public: /** * @param private_key the (ephemeral) private key which is used to derive the secret * @param ecies_params settings for ecies * @param for_encryption disable cofactor mode if the secret will be used for encryption * (according to ISO 18033 cofactor mode is only used during decryption) * @param rng the RNG to use */ ECIES_KA_Operation(const PK_Key_Agreement_Key& private_key, const ECIES_KA_Params& ecies_params, bool for_encryption, RandomNumberGenerator& rng); /** * Performs a key agreement with the provided keys and derives the secret from the result * @param eph_public_key_bin the encoded (ephemeral) public key which belongs to the used (ephemeral) private key * @param other_public_key_point public key point of the other party */ SymmetricKey derive_secret(const std::vector& eph_public_key_bin, const PointGFp& other_public_key_point) const; private: const PK_Key_Agreement m_ka; const ECIES_KA_Params m_params; }; /** * ECIES Encryption according to ISO 18033-2 */ class BOTAN_PUBLIC_API(2,0) ECIES_Encryptor final : public PK_Encryptor { public: /** * @param private_key the (ephemeral) private key which is used for the key agreement * @param ecies_params settings for ecies * @param rng random generator to use */ ECIES_Encryptor(const PK_Key_Agreement_Key& private_key, const ECIES_System_Params& ecies_params, RandomNumberGenerator& rng); /** * Creates an ephemeral private key which is used for the key agreement * @param rng random generator used during private key generation * @param ecies_params settings for ecies */ ECIES_Encryptor(RandomNumberGenerator& rng, const ECIES_System_Params& ecies_params); /// Set the public key of the other party inline void set_other_key(const Botan::PointGFp& public_point) { m_other_point = public_point; } /// Set the initialization vector for the data encryption method inline void set_initialization_vector(const InitializationVector& iv) { m_iv = iv; } /// Set the label which is appended to the input for the message authentication code inline void set_label(const std::string& label) { m_label = std::vector(label.begin(), label.end()); } private: std::vector enc(const uint8_t data[], size_t length, RandomNumberGenerator&) const override; inline size_t maximum_input_size() const override { return std::numeric_limits::max(); } const ECIES_KA_Operation m_ka; const ECIES_System_Params m_params; std::vector m_eph_public_key_bin; InitializationVector m_iv; PointGFp m_other_point; std::vector m_label; }; /** * ECIES Decryption according to ISO 18033-2 */ class BOTAN_PUBLIC_API(2,0) ECIES_Decryptor final : public PK_Decryptor { public: /** * @param private_key the private key which is used for the key agreement * @param ecies_params settings for ecies * @param rng the random generator to use */ ECIES_Decryptor(const PK_Key_Agreement_Key& private_key, const ECIES_System_Params& ecies_params, RandomNumberGenerator& rng); /// Set the initialization vector for the data encryption method inline void set_initialization_vector(const InitializationVector& iv) { m_iv = iv; } /// Set the label which is appended to the input for the message authentication code inline void set_label(const std::string& label) { m_label = std::vector(label.begin(), label.end()); } private: secure_vector do_decrypt(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const override; const ECIES_KA_Operation m_ka; const ECIES_System_Params m_params; InitializationVector m_iv; std::vector m_label; }; } #endif botan-2.4.0/src/lib/pubkey/ecies/info.txt000066400000000000000000000001221322470703100202320ustar00rootroot00000000000000 ECIES -> 20160128 kdf mac ecdh modes botan-2.4.0/src/lib/pubkey/eckcdsa/000077500000000000000000000000001322470703100170505ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/eckcdsa/eckcdsa.cpp000066400000000000000000000156151322470703100211610ustar00rootroot00000000000000/* * ECKCDSA (ISO/IEC 14888-3:2006/Cor.2:2009) * (C) 2016 René Korthaus, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { bool ECKCDSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) { return false; } if(!strong) { return true; } return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { /** * ECKCDSA signature operation */ class ECKCDSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA { public: ECKCDSA_Signature_Operation(const ECKCDSA_PrivateKey& eckcdsa, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_order(eckcdsa.domain().get_order()), m_base_point(eckcdsa.domain().get_base_point(), m_order), m_x(eckcdsa.private_value()), m_mod_order(m_order), m_prefix() { const BigInt public_point_x = eckcdsa.public_point().get_affine_x(); const BigInt public_point_y = eckcdsa.public_point().get_affine_y(); m_prefix.resize(public_point_x.bytes() + public_point_y.bytes()); public_point_x.binary_encode(m_prefix.data()); public_point_y.binary_encode(&m_prefix[public_point_x.bytes()]); m_prefix.resize(HashFunction::create(hash_for_signature())->hash_block_size()); // use only the "hash input block size" leftmost bits } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; size_t max_input_bits() const override { return m_order.bits(); } bool has_prefix() override { return true; } secure_vector message_prefix() const override { return m_prefix; } private: const BigInt& m_order; Blinded_Point_Multiply m_base_point; const BigInt& m_x; Modular_Reducer m_mod_order; secure_vector m_prefix; }; secure_vector ECKCDSA_Signature_Operation::raw_sign(const uint8_t msg[], size_t, RandomNumberGenerator& rng) { const BigInt k = BigInt::random_integer(rng, 1, m_order); const PointGFp k_times_P = m_base_point.blinded_multiply(k, rng); const BigInt k_times_P_x = k_times_P.get_affine_x(); secure_vector to_be_hashed(k_times_P_x.bytes()); k_times_P_x.binary_encode(to_be_hashed.data()); std::unique_ptr emsa = this->clone_emsa(); emsa->update(to_be_hashed.data(), to_be_hashed.size()); secure_vector c = emsa->raw_data(); c = emsa->encoding_of(c, max_input_bits(), rng); const BigInt r(c.data(), c.size()); xor_buf(c, msg, c.size()); BigInt w(c.data(), c.size()); w = m_mod_order.reduce(w); const BigInt s = m_mod_order.multiply(m_x, k - w); BOTAN_ASSERT(s != 0, "invalid s"); secure_vector output = BigInt::encode_1363(r, c.size()); output += BigInt::encode_1363(s, m_order.bytes()); return output; } /** * ECKCDSA verification operation */ class ECKCDSA_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: ECKCDSA_Verification_Operation(const ECKCDSA_PublicKey& eckcdsa, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_base_point(eckcdsa.domain().get_base_point()), m_public_point(eckcdsa.public_point()), m_order(eckcdsa.domain().get_order()), m_mod_order(m_order), m_prefix() { const BigInt public_point_x = m_public_point.get_affine_x(); const BigInt public_point_y = m_public_point.get_affine_y(); m_prefix.resize(public_point_x.bytes() + public_point_y.bytes()); public_point_x.binary_encode(&m_prefix[0]); public_point_y.binary_encode(&m_prefix[public_point_x.bytes()]); m_prefix.resize(HashFunction::create(hash_for_signature())->hash_block_size()); // use only the "hash input block size" leftmost bits } bool has_prefix() override { return true; } secure_vector message_prefix() const override { return m_prefix; } size_t max_input_bits() const override { return m_order.bits(); } bool with_recovery() const override { return false; } bool verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) override; private: const PointGFp& m_base_point; const PointGFp& m_public_point; const BigInt& m_order; // FIXME: should be offered by curve Modular_Reducer m_mod_order; secure_vector m_prefix; }; bool ECKCDSA_Verification_Operation::verify(const uint8_t msg[], size_t, const uint8_t sig[], size_t sig_len) { const std::unique_ptr hash = HashFunction::create(hash_for_signature()); //calculate size of r size_t size_r = std::min(hash -> output_length(), m_order.bytes()); if(sig_len != size_r+m_order.bytes()) { return false; } secure_vector r(sig, sig + size_r); // check that 0 < s < q const BigInt s(sig + size_r, m_order.bytes()); if(s <= 0 || s >= m_order) { return false; } secure_vector r_xor_e(r); xor_buf(r_xor_e, msg, r.size()); BigInt w(r_xor_e.data(), r_xor_e.size()); w = m_mod_order.reduce(w); const PointGFp q = multi_exponentiate(m_base_point, w, m_public_point, s); const BigInt q_x = q.get_affine_x(); secure_vector c(q_x.bytes()); q_x.binary_encode(c.data()); std::unique_ptr emsa = this->clone_emsa(); emsa->update(c.data(), c.size()); secure_vector v = emsa->raw_data(); Null_RNG rng; v = emsa->encoding_of(v, max_input_bits(), rng); return (v == r); } } std::unique_ptr ECKCDSA_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new ECKCDSA_Verification_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr ECKCDSA_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new ECKCDSA_Signature_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/eckcdsa/eckcdsa.h000066400000000000000000000055471322470703100206310ustar00rootroot00000000000000/* * ECKCDSA (ISO/IEC 14888-3:2006/Cor.2:2009) * (C) 2016 René Korthaus, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ECKCDSA_KEY_H_ #define BOTAN_ECKCDSA_KEY_H_ #include namespace Botan { /** * This class represents ECKCDSA public keys. */ class BOTAN_PUBLIC_API(2,0) ECKCDSA_PublicKey : public virtual EC_PublicKey { public: /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ ECKCDSA_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ ECKCDSA_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Get this keys algorithm name. * @result this keys algorithm name ("ECGDSA") */ std::string algo_name() const override { return "ECKCDSA"; } size_t message_parts() const override { return 2; } size_t message_part_size() const override { return domain().get_order().bytes(); } std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: ECKCDSA_PublicKey() = default; }; /** * This class represents ECKCDSA private keys. */ class BOTAN_PUBLIC_API(2,0) ECKCDSA_PrivateKey final : public ECKCDSA_PublicKey, public EC_PrivateKey { public: /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ ECKCDSA_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits, true) {} /** * Create a private key. * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key (if zero, generate a new random key) */ ECKCDSA_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x, true) {} bool check_key(RandomNumberGenerator& rng, bool) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/eckcdsa/info.txt000066400000000000000000000002211322470703100205370ustar00rootroot00000000000000 ECKCDSA -> 20160413 asn1 bigint ec_group ecc_key emsa1 hash keypair numbertheory pk_pad rng sha2_32 botan-2.4.0/src/lib/pubkey/ed25519/000077500000000000000000000000001322470703100164515ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/ed25519/ed25519.cpp000066400000000000000000000035271322470703100201620ustar00rootroot00000000000000/* * Ed25519 * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { void ed25519_gen_keypair(uint8_t* pk, uint8_t* sk, const uint8_t seed[32]) { uint8_t az[64]; SHA_512 sha; sha.update(seed, 32); sha.final(az); az[0] &= 248; az[31] &= 63; az[31] |= 64; ge_scalarmult_base(pk, az); // todo copy_mem memmove(sk, seed, 32); memmove(sk + 32, pk, 32); } void ed25519_sign(uint8_t sig[64], const uint8_t* m, size_t mlen, const uint8_t* sk) { uint8_t az[64]; uint8_t nonce[64]; uint8_t hram[64]; SHA_512 sha; sha.update(sk, 32); sha.final(az); az[0] &= 248; az[31] &= 63; az[31] |= 64; sha.update(az + 32, 32); sha.update(m, mlen); sha.final(nonce); sc_reduce(nonce); ge_scalarmult_base(sig, nonce); sha.update(sig, 32); sha.update(sk + 32, 32); sha.update(m, mlen); sha.final(hram); sc_reduce(hram); sc_muladd(sig + 32, hram, az, nonce); } bool ed25519_verify(const uint8_t* m, size_t mlen, const uint8_t sig[64], const uint8_t* pk) { uint8_t h[64]; uint8_t rcheck[32]; ge_p3 A; SHA_512 sha; if(sig[63] & 224) { return false; } if(ge_frombytes_negate_vartime(&A, pk) != 0) { return false; } sha.update(sig, 32); sha.update(pk, 32); sha.update(m, mlen); sha.final(h); sc_reduce(h); ge_double_scalarmult_vartime(rcheck, h, &A, sig + 32); return constant_time_compare(rcheck, sig, 32); } } botan-2.4.0/src/lib/pubkey/ed25519/ed25519.h000066400000000000000000000070301322470703100176200ustar00rootroot00000000000000/* * Ed25519 * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ED25519_H_ #define BOTAN_ED25519_H_ #include namespace Botan { class BOTAN_PUBLIC_API(2,2) Ed25519_PublicKey : public virtual Public_Key { public: std::string algo_name() const override { return "Ed25519"; } size_t estimated_strength() const override { return 128; } size_t key_length() const override { return 255; } bool check_key(RandomNumberGenerator& rng, bool strong) const override; AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; /** * Create a Ed25519 Public Key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ Ed25519_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits); /** * Create a Ed25519 Public Key. * @param pub 32-byte raw public key */ explicit Ed25519_PublicKey(const std::vector& pub) : m_public(pub) {} /** * Create a Ed25519 Public Key. * @param pub 32-byte raw public key */ explicit Ed25519_PublicKey(const secure_vector& pub) : m_public(pub.begin(), pub.end()) {} std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; const std::vector& get_public_key() const { return m_public; } protected: Ed25519_PublicKey() = default; std::vector m_public; }; class BOTAN_PUBLIC_API(2,2) Ed25519_PrivateKey final : public Ed25519_PublicKey, public virtual Private_Key { public: /** * Construct a private key from the specified parameters. * @param alg_id the X.509 algorithm identifier * @param key_bits PKCS #8 structure */ Ed25519_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Generate a private key. * @param rng the RNG to use */ explicit Ed25519_PrivateKey(RandomNumberGenerator& rng); /** * Construct a private key from the specified parameters. * @param secret_key the private key */ explicit Ed25519_PrivateKey(const secure_vector& secret_key); const secure_vector& get_private_key() const { return m_private; } secure_vector private_key_bits() const override; bool check_key(RandomNumberGenerator& rng, bool strong) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; private: secure_vector m_private; }; void ed25519_gen_keypair(uint8_t pk[32], uint8_t sk[64], const uint8_t seed[32]); void ed25519_sign(uint8_t sig[64], const uint8_t msg[], size_t msg_len, const uint8_t sk[64]); bool ed25519_verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[64], const uint8_t pk[32]); } #endif botan-2.4.0/src/lib/pubkey/ed25519/ed25519_fe.cpp000066400000000000000000000725261322470703100206410ustar00rootroot00000000000000/* * Ed25519 field element * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { //static FE_25519 FE_25519::invert(const FE_25519& z) { fe t0; fe t1; fe t2; fe t3; fe_sq(t0, z); fe_sq_iter(t1, t0, 2); fe_mul(t1, z, t1); fe_mul(t0, t0, t1); fe_sq(t2, t0); fe_mul(t1, t1, t2); fe_sq_iter(t2, t1, 5); fe_mul(t1, t2, t1); fe_sq_iter(t2, t1, 10); fe_mul(t2, t2, t1); fe_sq_iter(t3, t2, 20); fe_mul(t2, t3, t2); fe_sq_iter(t2, t2, 10); fe_mul(t1, t2, t1); fe_sq_iter(t2, t1, 50); fe_mul(t2, t2, t1); fe_sq_iter(t3, t2, 100); fe_mul(t2, t3, t2); fe_sq_iter(t2, t2, 50); fe_mul(t1, t2, t1); fe_sq_iter(t1, t1, 5); fe_mul(t0, t1, t0); return t0; } FE_25519 FE_25519::pow_22523(const fe& z) { fe t0; fe t1; fe t2; fe_sq(t0, z); fe_sq_iter(t1, t0, 2); fe_mul(t1, z, t1); fe_mul(t0, t0, t1); fe_sq(t0, t0); fe_mul(t0, t1, t0); fe_sq_iter(t1, t0, 5); fe_mul(t0, t1, t0); fe_sq_iter(t1, t0, 10); fe_mul(t1, t1, t0); fe_sq_iter(t2, t1, 20); fe_mul(t1, t2, t1); fe_sq_iter(t1, t1, 10); fe_mul(t0, t1, t0); fe_sq_iter(t1, t0, 50); fe_mul(t1, t1, t0); fe_sq_iter(t2, t1, 100); fe_mul(t1, t2, t1); fe_sq_iter(t1, t1, 50); fe_mul(t0, t1, t0); fe_sq_iter(t0, t0, 2); fe_mul(t0, t0, z); return t0; } /* h = f * g Can overlap h with f or g. Preconditions: |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. Postconditions: |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. */ /* Notes on implementation strategy: Using schoolbook multiplication. Karatsuba would save a little in some cost models. Most multiplications by 2 and 19 are 32-bit precomputations; cheaper than 64-bit postcomputations. There is one remaining multiplication by 19 in the carry chain; one *19 precomputation can be merged into this, but the resulting data flow is considerably less clean. There are 12 carries below. 10 of them are 2-way parallelizable and vectorizable. Can get away with 11 carries, but then data flow is much deeper. With tighter constraints on inputs can squeeze carries into int32. */ //static FE_25519 FE_25519::mul(const FE_25519& f, const FE_25519& g) { int32_t f0 = f[0]; int32_t f1 = f[1]; int32_t f2 = f[2]; int32_t f3 = f[3]; int32_t f4 = f[4]; int32_t f5 = f[5]; int32_t f6 = f[6]; int32_t f7 = f[7]; int32_t f8 = f[8]; int32_t f9 = f[9]; int32_t g0 = g[0]; int32_t g1 = g[1]; int32_t g2 = g[2]; int32_t g3 = g[3]; int32_t g4 = g[4]; int32_t g5 = g[5]; int32_t g6 = g[6]; int32_t g7 = g[7]; int32_t g8 = g[8]; int32_t g9 = g[9]; int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */ int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ int32_t g3_19 = 19 * g3; int32_t g4_19 = 19 * g4; int32_t g5_19 = 19 * g5; int32_t g6_19 = 19 * g6; int32_t g7_19 = 19 * g7; int32_t g8_19 = 19 * g8; int32_t g9_19 = 19 * g9; int32_t f1_2 = 2 * f1; int32_t f3_2 = 2 * f3; int32_t f5_2 = 2 * f5; int32_t f7_2 = 2 * f7; int32_t f9_2 = 2 * f9; int64_t f0g0 = f0 * static_cast(g0); int64_t f0g1 = f0 * static_cast(g1); int64_t f0g2 = f0 * static_cast(g2); int64_t f0g3 = f0 * static_cast(g3); int64_t f0g4 = f0 * static_cast(g4); int64_t f0g5 = f0 * static_cast(g5); int64_t f0g6 = f0 * static_cast(g6); int64_t f0g7 = f0 * static_cast(g7); int64_t f0g8 = f0 * static_cast(g8); int64_t f0g9 = f0 * static_cast(g9); int64_t f1g0 = f1 * static_cast(g0); int64_t f1g1_2 = f1_2 * static_cast(g1); int64_t f1g2 = f1 * static_cast(g2); int64_t f1g3_2 = f1_2 * static_cast(g3); int64_t f1g4 = f1 * static_cast(g4); int64_t f1g5_2 = f1_2 * static_cast(g5); int64_t f1g6 = f1 * static_cast(g6); int64_t f1g7_2 = f1_2 * static_cast(g7); int64_t f1g8 = f1 * static_cast(g8); int64_t f1g9_38 = f1_2 * static_cast(g9_19); int64_t f2g0 = f2 * static_cast(g0); int64_t f2g1 = f2 * static_cast(g1); int64_t f2g2 = f2 * static_cast(g2); int64_t f2g3 = f2 * static_cast(g3); int64_t f2g4 = f2 * static_cast(g4); int64_t f2g5 = f2 * static_cast(g5); int64_t f2g6 = f2 * static_cast(g6); int64_t f2g7 = f2 * static_cast(g7); int64_t f2g8_19 = f2 * static_cast(g8_19); int64_t f2g9_19 = f2 * static_cast(g9_19); int64_t f3g0 = f3 * static_cast(g0); int64_t f3g1_2 = f3_2 * static_cast(g1); int64_t f3g2 = f3 * static_cast(g2); int64_t f3g3_2 = f3_2 * static_cast(g3); int64_t f3g4 = f3 * static_cast(g4); int64_t f3g5_2 = f3_2 * static_cast(g5); int64_t f3g6 = f3 * static_cast(g6); int64_t f3g7_38 = f3_2 * static_cast(g7_19); int64_t f3g8_19 = f3 * static_cast(g8_19); int64_t f3g9_38 = f3_2 * static_cast(g9_19); int64_t f4g0 = f4 * static_cast(g0); int64_t f4g1 = f4 * static_cast(g1); int64_t f4g2 = f4 * static_cast(g2); int64_t f4g3 = f4 * static_cast(g3); int64_t f4g4 = f4 * static_cast(g4); int64_t f4g5 = f4 * static_cast(g5); int64_t f4g6_19 = f4 * static_cast(g6_19); int64_t f4g7_19 = f4 * static_cast(g7_19); int64_t f4g8_19 = f4 * static_cast(g8_19); int64_t f4g9_19 = f4 * static_cast(g9_19); int64_t f5g0 = f5 * static_cast(g0); int64_t f5g1_2 = f5_2 * static_cast(g1); int64_t f5g2 = f5 * static_cast(g2); int64_t f5g3_2 = f5_2 * static_cast(g3); int64_t f5g4 = f5 * static_cast(g4); int64_t f5g5_38 = f5_2 * static_cast(g5_19); int64_t f5g6_19 = f5 * static_cast(g6_19); int64_t f5g7_38 = f5_2 * static_cast(g7_19); int64_t f5g8_19 = f5 * static_cast(g8_19); int64_t f5g9_38 = f5_2 * static_cast(g9_19); int64_t f6g0 = f6 * static_cast(g0); int64_t f6g1 = f6 * static_cast(g1); int64_t f6g2 = f6 * static_cast(g2); int64_t f6g3 = f6 * static_cast(g3); int64_t f6g4_19 = f6 * static_cast(g4_19); int64_t f6g5_19 = f6 * static_cast(g5_19); int64_t f6g6_19 = f6 * static_cast(g6_19); int64_t f6g7_19 = f6 * static_cast(g7_19); int64_t f6g8_19 = f6 * static_cast(g8_19); int64_t f6g9_19 = f6 * static_cast(g9_19); int64_t f7g0 = f7 * static_cast(g0); int64_t f7g1_2 = f7_2 * static_cast(g1); int64_t f7g2 = f7 * static_cast(g2); int64_t f7g3_38 = f7_2 * static_cast(g3_19); int64_t f7g4_19 = f7 * static_cast(g4_19); int64_t f7g5_38 = f7_2 * static_cast(g5_19); int64_t f7g6_19 = f7 * static_cast(g6_19); int64_t f7g7_38 = f7_2 * static_cast(g7_19); int64_t f7g8_19 = f7 * static_cast(g8_19); int64_t f7g9_38 = f7_2 * static_cast(g9_19); int64_t f8g0 = f8 * static_cast(g0); int64_t f8g1 = f8 * static_cast(g1); int64_t f8g2_19 = f8 * static_cast(g2_19); int64_t f8g3_19 = f8 * static_cast(g3_19); int64_t f8g4_19 = f8 * static_cast(g4_19); int64_t f8g5_19 = f8 * static_cast(g5_19); int64_t f8g6_19 = f8 * static_cast(g6_19); int64_t f8g7_19 = f8 * static_cast(g7_19); int64_t f8g8_19 = f8 * static_cast(g8_19); int64_t f8g9_19 = f8 * static_cast(g9_19); int64_t f9g0 = f9 * static_cast(g0); int64_t f9g1_38 = f9_2 * static_cast(g1_19); int64_t f9g2_19 = f9 * static_cast(g2_19); int64_t f9g3_38 = f9_2 * static_cast(g3_19); int64_t f9g4_19 = f9 * static_cast(g4_19); int64_t f9g5_38 = f9_2 * static_cast(g5_19); int64_t f9g6_19 = f9 * static_cast(g6_19); int64_t f9g7_38 = f9_2 * static_cast(g7_19); int64_t f9g8_19 = f9 * static_cast(g8_19); int64_t f9g9_38 = f9_2 * static_cast(g9_19); int64_t h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38; int64_t h1 = f0g1+f1g0 +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19; int64_t h2 = f0g2+f1g1_2 +f2g0 +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38; int64_t h3 = f0g3+f1g2 +f2g1 +f3g0 +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19; int64_t h4 = f0g4+f1g3_2 +f2g2 +f3g1_2 +f4g0 +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38; int64_t h5 = f0g5+f1g4 +f2g3 +f3g2 +f4g1 +f5g0 +f6g9_19+f7g8_19+f8g7_19+f9g6_19; int64_t h6 = f0g6+f1g5_2 +f2g4 +f3g3_2 +f4g2 +f5g1_2 +f6g0 +f7g9_38+f8g8_19+f9g7_38; int64_t h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; int64_t h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; int64_t h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; /* |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8 |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19)) i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9 */ const int64_t X24 = (1 << 24); const int64_t X25 = (1 << 25); const int64_t X26 = (1 << 26); carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; /* |h0| <= 2^25 */ /* |h4| <= 2^25 */ /* |h1| <= 1.71*2^59 */ /* |h5| <= 1.71*2^59 */ carry1 = (h1 + X24) >> 25; h2 += carry1; h1 -= carry1 * X25; carry5 = (h5 + X24) >> 25; h6 += carry5; h5 -= carry5 * X25; /* |h1| <= 2^24; from now on fits into int32 */ /* |h5| <= 2^24; from now on fits into int32 */ /* |h2| <= 1.41*2^60 */ /* |h6| <= 1.41*2^60 */ carry2 = (h2 + X25) >> 26; h3 += carry2; h2 -= carry2 * X26; carry6 = (h6 + X25) >> 26; h7 += carry6; h6 -= carry6 * X26; /* |h2| <= 2^25; from now on fits into int32 unchanged */ /* |h6| <= 2^25; from now on fits into int32 unchanged */ /* |h3| <= 1.71*2^59 */ /* |h7| <= 1.71*2^59 */ carry3 = (h3 + X24) >> 25; h4 += carry3; h3 -= carry3 * X25; carry7 = (h7 + X24) >> 25; h8 += carry7; h7 -= carry7 * X25; /* |h3| <= 2^24; from now on fits into int32 unchanged */ /* |h7| <= 2^24; from now on fits into int32 unchanged */ /* |h4| <= 1.72*2^34 */ /* |h8| <= 1.41*2^60 */ carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; carry8 = (h8 + X25) >> 26; h9 += carry8; h8 -= carry8 * X26; /* |h4| <= 2^25; from now on fits into int32 unchanged */ /* |h8| <= 2^25; from now on fits into int32 unchanged */ /* |h5| <= 1.01*2^24 */ /* |h9| <= 1.71*2^59 */ carry9 = (h9 + X24) >> 25; h0 += carry9 * 19; h9 -= carry9 * X25; /* |h9| <= 2^24; from now on fits into int32 unchanged */ /* |h0| <= 1.1*2^39 */ carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; /* |h0| <= 2^25; from now on fits into int32 unchanged */ /* |h1| <= 1.01*2^24 */ return FE_25519(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9); } /* h = f * f Can overlap h with f. Preconditions: |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. Postconditions: |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. */ /* See fe_mul.c for discussion of implementation strategy. */ //static FE_25519 FE_25519::sqr_iter(const FE_25519& f, size_t iter) { const int64_t X24 = (1 << 24); const int64_t X25 = (1 << 25); const int64_t X26 = (1 << 26); int32_t f0 = f[0]; int32_t f1 = f[1]; int32_t f2 = f[2]; int32_t f3 = f[3]; int32_t f4 = f[4]; int32_t f5 = f[5]; int32_t f6 = f[6]; int32_t f7 = f[7]; int32_t f8 = f[8]; int32_t f9 = f[9]; for(size_t i = 0; i != iter; ++i) { const int32_t f0_2 = 2 * f0; const int32_t f1_2 = 2 * f1; const int32_t f2_2 = 2 * f2; const int32_t f3_2 = 2 * f3; const int32_t f4_2 = 2 * f4; const int32_t f5_2 = 2 * f5; const int32_t f6_2 = 2 * f6; const int32_t f7_2 = 2 * f7; const int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ const int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ const int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ const int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ const int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ const int64_t f0f0 = f0 * static_cast(f0); const int64_t f0f1_2 = f0_2 * static_cast(f1); const int64_t f0f2_2 = f0_2 * static_cast(f2); const int64_t f0f3_2 = f0_2 * static_cast(f3); const int64_t f0f4_2 = f0_2 * static_cast(f4); const int64_t f0f5_2 = f0_2 * static_cast(f5); const int64_t f0f6_2 = f0_2 * static_cast(f6); const int64_t f0f7_2 = f0_2 * static_cast(f7); const int64_t f0f8_2 = f0_2 * static_cast(f8); const int64_t f0f9_2 = f0_2 * static_cast(f9); const int64_t f1f1_2 = f1_2 * static_cast(f1); const int64_t f1f2_2 = f1_2 * static_cast(f2); const int64_t f1f3_4 = f1_2 * static_cast(f3_2); const int64_t f1f4_2 = f1_2 * static_cast(f4); const int64_t f1f5_4 = f1_2 * static_cast(f5_2); const int64_t f1f6_2 = f1_2 * static_cast(f6); const int64_t f1f7_4 = f1_2 * static_cast(f7_2); const int64_t f1f8_2 = f1_2 * static_cast(f8); const int64_t f1f9_76 = f1_2 * static_cast(f9_38); const int64_t f2f2 = f2 * static_cast(f2); const int64_t f2f3_2 = f2_2 * static_cast(f3); const int64_t f2f4_2 = f2_2 * static_cast(f4); const int64_t f2f5_2 = f2_2 * static_cast(f5); const int64_t f2f6_2 = f2_2 * static_cast(f6); const int64_t f2f7_2 = f2_2 * static_cast(f7); const int64_t f2f8_38 = f2_2 * static_cast(f8_19); const int64_t f2f9_38 = f2 * static_cast(f9_38); const int64_t f3f3_2 = f3_2 * static_cast(f3); const int64_t f3f4_2 = f3_2 * static_cast(f4); const int64_t f3f5_4 = f3_2 * static_cast(f5_2); const int64_t f3f6_2 = f3_2 * static_cast(f6); const int64_t f3f7_76 = f3_2 * static_cast(f7_38); const int64_t f3f8_38 = f3_2 * static_cast(f8_19); const int64_t f3f9_76 = f3_2 * static_cast(f9_38); const int64_t f4f4 = f4 * static_cast(f4); const int64_t f4f5_2 = f4_2 * static_cast(f5); const int64_t f4f6_38 = f4_2 * static_cast(f6_19); const int64_t f4f7_38 = f4 * static_cast(f7_38); const int64_t f4f8_38 = f4_2 * static_cast(f8_19); const int64_t f4f9_38 = f4 * static_cast(f9_38); const int64_t f5f5_38 = f5 * static_cast(f5_38); const int64_t f5f6_38 = f5_2 * static_cast(f6_19); const int64_t f5f7_76 = f5_2 * static_cast(f7_38); const int64_t f5f8_38 = f5_2 * static_cast(f8_19); const int64_t f5f9_76 = f5_2 * static_cast(f9_38); const int64_t f6f6_19 = f6 * static_cast(f6_19); const int64_t f6f7_38 = f6 * static_cast(f7_38); const int64_t f6f8_38 = f6_2 * static_cast(f8_19); const int64_t f6f9_38 = f6 * static_cast(f9_38); const int64_t f7f7_38 = f7 * static_cast(f7_38); const int64_t f7f8_38 = f7_2 * static_cast(f8_19); const int64_t f7f9_76 = f7_2 * static_cast(f9_38); const int64_t f8f8_19 = f8 * static_cast(f8_19); const int64_t f8f9_38 = f8 * static_cast(f9_38); const int64_t f9f9_38 = f9 * static_cast(f9_38); int64_t h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; int64_t h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; carry1 = (h1 + X24) >> 25; h2 += carry1; h1 -= carry1 * X25; carry5 = (h5 + X24) >> 25; h6 += carry5; h5 -= carry5 * X25; carry2 = (h2 + X25) >> 26; h3 += carry2; h2 -= carry2 * X26; carry6 = (h6 + X25) >> 26; h7 += carry6; h6 -= carry6 * X26; carry3 = (h3 + X24) >> 25; h4 += carry3; h3 -= carry3 * X25; carry7 = (h7 + X24) >> 25; h8 += carry7; h7 -= carry7 * X25; carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; carry8 = (h8 + X25) >> 26; h9 += carry8; h8 -= carry8 * X26; carry9 = (h9 + X24) >> 25; h0 += carry9 * 19; h9 -= carry9 * X25; carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; f0 = h0; f1 = h1; f2 = h2; f3 = h3; f4 = h4; f5 = h5; f6 = h6; f7 = h7; f8 = h8; f9 = h9; } return FE_25519(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); } /* h = 2 * f * f Can overlap h with f. Preconditions: |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. Postconditions: |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. */ /* See fe_mul.c for discussion of implementation strategy. */ //static FE_25519 FE_25519::sqr2(const FE_25519& f) { const int64_t X24 = (1 << 24); const int64_t X25 = (1 << 25); const int64_t X26 = (1 << 26); int32_t f0 = f[0]; int32_t f1 = f[1]; int32_t f2 = f[2]; int32_t f3 = f[3]; int32_t f4 = f[4]; int32_t f5 = f[5]; int32_t f6 = f[6]; int32_t f7 = f[7]; int32_t f8 = f[8]; int32_t f9 = f[9]; int32_t f0_2 = 2 * f0; int32_t f1_2 = 2 * f1; int32_t f2_2 = 2 * f2; int32_t f3_2 = 2 * f3; int32_t f4_2 = 2 * f4; int32_t f5_2 = 2 * f5; int32_t f6_2 = 2 * f6; int32_t f7_2 = 2 * f7; int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ int64_t f0f0 = f0 * static_cast(f0); int64_t f0f1_2 = f0_2 * static_cast(f1); int64_t f0f2_2 = f0_2 * static_cast(f2); int64_t f0f3_2 = f0_2 * static_cast(f3); int64_t f0f4_2 = f0_2 * static_cast(f4); int64_t f0f5_2 = f0_2 * static_cast(f5); int64_t f0f6_2 = f0_2 * static_cast(f6); int64_t f0f7_2 = f0_2 * static_cast(f7); int64_t f0f8_2 = f0_2 * static_cast(f8); int64_t f0f9_2 = f0_2 * static_cast(f9); int64_t f1f1_2 = f1_2 * static_cast(f1); int64_t f1f2_2 = f1_2 * static_cast(f2); int64_t f1f3_4 = f1_2 * static_cast(f3_2); int64_t f1f4_2 = f1_2 * static_cast(f4); int64_t f1f5_4 = f1_2 * static_cast(f5_2); int64_t f1f6_2 = f1_2 * static_cast(f6); int64_t f1f7_4 = f1_2 * static_cast(f7_2); int64_t f1f8_2 = f1_2 * static_cast(f8); int64_t f1f9_76 = f1_2 * static_cast(f9_38); int64_t f2f2 = f2 * static_cast(f2); int64_t f2f3_2 = f2_2 * static_cast(f3); int64_t f2f4_2 = f2_2 * static_cast(f4); int64_t f2f5_2 = f2_2 * static_cast(f5); int64_t f2f6_2 = f2_2 * static_cast(f6); int64_t f2f7_2 = f2_2 * static_cast(f7); int64_t f2f8_38 = f2_2 * static_cast(f8_19); int64_t f2f9_38 = f2 * static_cast(f9_38); int64_t f3f3_2 = f3_2 * static_cast(f3); int64_t f3f4_2 = f3_2 * static_cast(f4); int64_t f3f5_4 = f3_2 * static_cast(f5_2); int64_t f3f6_2 = f3_2 * static_cast(f6); int64_t f3f7_76 = f3_2 * static_cast(f7_38); int64_t f3f8_38 = f3_2 * static_cast(f8_19); int64_t f3f9_76 = f3_2 * static_cast(f9_38); int64_t f4f4 = f4 * static_cast(f4); int64_t f4f5_2 = f4_2 * static_cast(f5); int64_t f4f6_38 = f4_2 * static_cast(f6_19); int64_t f4f7_38 = f4 * static_cast(f7_38); int64_t f4f8_38 = f4_2 * static_cast(f8_19); int64_t f4f9_38 = f4 * static_cast(f9_38); int64_t f5f5_38 = f5 * static_cast(f5_38); int64_t f5f6_38 = f5_2 * static_cast(f6_19); int64_t f5f7_76 = f5_2 * static_cast(f7_38); int64_t f5f8_38 = f5_2 * static_cast(f8_19); int64_t f5f9_76 = f5_2 * static_cast(f9_38); int64_t f6f6_19 = f6 * static_cast(f6_19); int64_t f6f7_38 = f6 * static_cast(f7_38); int64_t f6f8_38 = f6_2 * static_cast(f8_19); int64_t f6f9_38 = f6 * static_cast(f9_38); int64_t f7f7_38 = f7 * static_cast(f7_38); int64_t f7f8_38 = f7_2 * static_cast(f8_19); int64_t f7f9_76 = f7_2 * static_cast(f9_38); int64_t f8f8_19 = f8 * static_cast(f8_19); int64_t f8f9_38 = f8 * static_cast(f9_38); int64_t f9f9_38 = f9 * static_cast(f9_38); int64_t h0 = f0f0 +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38; int64_t h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38; int64_t h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19; int64_t h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38; int64_t h4 = f0f4_2+f1f3_4 +f2f2 +f5f9_76+f6f8_38+f7f7_38; int64_t h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38; int64_t h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19; int64_t h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; int64_t h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; int64_t h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; h0 += h0; h1 += h1; h2 += h2; h3 += h3; h4 += h4; h5 += h5; h6 += h6; h7 += h7; h8 += h8; h9 += h9; carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; carry1 = (h1 + X24) >> 25; h2 += carry1; h1 -= carry1 * X25; carry5 = (h5 + X24) >> 25; h6 += carry5; h5 -= carry5 * X25; carry2 = (h2 + X25) >> 26; h3 += carry2; h2 -= carry2 * X26; carry6 = (h6 + X25) >> 26; h7 += carry6; h6 -= carry6 * X26; carry3 = (h3 + X24) >> 25; h4 += carry3; h3 -= carry3 * X25; carry7 = (h7 + X24) >> 25; h8 += carry7; h7 -= carry7 * X25; carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; carry8 = (h8 + X25) >> 26; h9 += carry8; h8 -= carry8 * X26; carry9 = (h9 + X24) >> 25; h0 += carry9 * 19; h9 -= carry9 * X25; carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; return FE_25519(h0, h1, h2, h3, h4, h5, h6, h7, h8, h9); } /* Ignores top bit of h. */ void FE_25519::from_bytes(const uint8_t s[32]) { const int64_t X24 = (1 << 24); const int64_t X25 = (1 << 25); const int64_t X26 = (1 << 26); int64_t h0 = load_4(s); int64_t h1 = load_3(s + 4) << 6; int64_t h2 = load_3(s + 7) << 5; int64_t h3 = load_3(s + 10) << 3; int64_t h4 = load_3(s + 13) << 2; int64_t h5 = load_4(s + 16); int64_t h6 = load_3(s + 20) << 7; int64_t h7 = load_3(s + 23) << 5; int64_t h8 = load_3(s + 26) << 4; int64_t h9 = (load_3(s + 29) & 0x7fffff) << 2; const int64_t carry9 = (h9 + X24) >> 25; h0 += carry9 * 19; h9 -= carry9 * X25; const int64_t carry1 = (h1 + X24) >> 25; h2 += carry1; h1 -= carry1 * X25; const int64_t carry3 = (h3 + X24) >> 25; h4 += carry3; h3 -= carry3 * X25; const int64_t carry5 = (h5 + X24) >> 25; h6 += carry5; h5 -= carry5 * X25; const int64_t carry7 = (h7 + X24) >> 25; h8 += carry7; h7 -= carry7 * X25; const int64_t carry0 = (h0 + X25) >> 26; h1 += carry0; h0 -= carry0 * X26; const int64_t carry2 = (h2 + X25) >> 26; h3 += carry2; h2 -= carry2 * X26; const int64_t carry4 = (h4 + X25) >> 26; h5 += carry4; h4 -= carry4 * X26; const int64_t carry6 = (h6 + X25) >> 26; h7 += carry6; h6 -= carry6 * X26; const int64_t carry8 = (h8 + X25) >> 26; h9 += carry8; h8 -= carry8 * X26; m_fe[0] = h0; m_fe[1] = h1; m_fe[2] = h2; m_fe[3] = h3; m_fe[4] = h4; m_fe[5] = h5; m_fe[6] = h6; m_fe[7] = h7; m_fe[8] = h8; m_fe[9] = h9; } /* Preconditions: |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. Write p=2^255-19; q=floor(h/p). Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). Proof: Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). Then 0(1) << 24))) >> 25; q = (h0 + q) >> 26; q = (h1 + q) >> 25; q = (h2 + q) >> 26; q = (h3 + q) >> 25; q = (h4 + q) >> 26; q = (h5 + q) >> 25; q = (h6 + q) >> 26; q = (h7 + q) >> 25; q = (h8 + q) >> 26; q = (h9 + q) >> 25; /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ h0 += 19 * q; /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 * X26; carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 * X25; carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 * X26; carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 * X25; carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 * X26; carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 * X25; carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 * X26; carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 * X25; carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 * X26; carry9 = h9 >> 25; h9 -= carry9 * X25; /* h10 = carry9 */ /* Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. Have h0+...+2^230 h9 between 0 and 2^255-1; evidently 2^255 h10-2^255 q = 0. Goal: Output h0+...+2^230 h9. */ s[0] = h0 >> 0; s[1] = h0 >> 8; s[2] = h0 >> 16; s[3] = (h0 >> 24) | (h1 << 2); s[4] = h1 >> 6; s[5] = h1 >> 14; s[6] = (h1 >> 22) | (h2 << 3); s[7] = h2 >> 5; s[8] = h2 >> 13; s[9] = (h2 >> 21) | (h3 << 5); s[10] = h3 >> 3; s[11] = h3 >> 11; s[12] = (h3 >> 19) | (h4 << 6); s[13] = h4 >> 2; s[14] = h4 >> 10; s[15] = h4 >> 18; s[16] = h5 >> 0; s[17] = h5 >> 8; s[18] = h5 >> 16; s[19] = (h5 >> 24) | (h6 << 1); s[20] = h6 >> 7; s[21] = h6 >> 15; s[22] = (h6 >> 23) | (h7 << 3); s[23] = h7 >> 5; s[24] = h7 >> 13; s[25] = (h7 >> 21) | (h8 << 4); s[26] = h8 >> 4; s[27] = h8 >> 12; s[28] = (h8 >> 20) | (h9 << 6); s[29] = h9 >> 2; s[30] = h9 >> 10; s[31] = h9 >> 18; } } botan-2.4.0/src/lib/pubkey/ed25519/ed25519_fe.h000066400000000000000000000121031322470703100202670ustar00rootroot00000000000000/* * Ed25519 field element * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ED25519_FE_H_ #define BOTAN_ED25519_FE_H_ #include namespace Botan { /** * An element of the field \\Z/(2^255-19) */ class FE_25519 { public: ~FE_25519() { secure_scrub_memory(m_fe, sizeof(m_fe)); } /** * Zero element */ FE_25519(int init = 0) { if(init != 0 && init != 1) { throw std::invalid_argument("Invalid FE_25519 initial value"); } memset(m_fe, 0, 10 * sizeof(int32_t)); m_fe[0] = init; } FE_25519(std::initializer_list x) { if(x.size() != 10) { throw std::invalid_argument("Invalid FE_25519 initializer list"); } memcpy(m_fe, x.begin(), 10 * sizeof(int32_t)); } FE_25519(int64_t h0, int64_t h1, int64_t h2, int64_t h3, int64_t h4, int64_t h5, int64_t h6, int64_t h7, int64_t h8, int64_t h9) { m_fe[0] = static_cast(h0); m_fe[1] = static_cast(h1); m_fe[2] = static_cast(h2); m_fe[3] = static_cast(h3); m_fe[4] = static_cast(h4); m_fe[5] = static_cast(h5); m_fe[6] = static_cast(h6); m_fe[7] = static_cast(h7); m_fe[8] = static_cast(h8); m_fe[9] = static_cast(h9); } FE_25519(const FE_25519& other) = default; FE_25519& operator=(const FE_25519& other) = default; #if !defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) FE_25519(FE_25519&& other) = default; FE_25519& operator=(FE_25519&& other) = default; #endif void from_bytes(const uint8_t b[32]); void to_bytes(uint8_t b[32]) const; bool is_zero() const { uint8_t s[32]; to_bytes(s); uint8_t sum = 0; for(size_t i = 0; i != 32; ++i) { sum |= s[i]; } // TODO avoid ternary here return (sum == 0) ? 1 : 0; } /* return 1 if f is in {1,3,5,...,q-2} return 0 if f is in {0,2,4,...,q-1} */ bool is_negative() const { // TODO could avoid most of the to_bytes computation here uint8_t s[32]; to_bytes(s); return s[0] & 1; } static FE_25519 add(const FE_25519& a, const FE_25519& b) { FE_25519 z; for(size_t i = 0; i != 10; ++i) { z[i] = a[i] + b[i]; } return z; } static FE_25519 sub(const FE_25519& a, const FE_25519& b) { FE_25519 z; for(size_t i = 0; i != 10; ++i) { z[i] = a[i] - b[i]; } return z; } static FE_25519 negate(const FE_25519& a) { FE_25519 z; for(size_t i = 0; i != 10; ++i) { z[i] = -a[i]; } return z; } static FE_25519 mul(const FE_25519& a, const FE_25519& b); static FE_25519 sqr_iter(const FE_25519& a, size_t iter); static FE_25519 sqr(const FE_25519& a) { return sqr_iter(a, 1); } static FE_25519 sqr2(const FE_25519& a); static FE_25519 pow_22523(const FE_25519& a); static FE_25519 invert(const FE_25519& a); // TODO remove int32_t operator[](size_t i) const { return m_fe[i]; } int32_t& operator[](size_t i) { return m_fe[i]; } private: int32_t m_fe[10]; }; typedef FE_25519 fe; /* fe means field element. Here the field is An element t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on context. */ inline void fe_frombytes(fe& x, const uint8_t* b) { x.from_bytes(b); } inline void fe_tobytes(uint8_t* b, const fe& x) { x.to_bytes(b); } inline void fe_copy(fe& a, const fe& b) { a = b; } inline int fe_isnonzero(const fe& x) { return x.is_zero() ? 0 : 1; } inline int fe_isnegative(const fe& x) { return x.is_negative(); } inline void fe_0(fe& x) { x = FE_25519(); } inline void fe_1(fe& x) { x = FE_25519(1); } inline void fe_add(fe& x, const fe& a, const fe& b) { x = FE_25519::add(a, b); } inline void fe_sub(fe& x, const fe& a, const fe& b) { x = FE_25519::sub(a, b); } inline void fe_neg(fe& x, const fe& z) { x = FE_25519::negate(z); } inline void fe_mul(fe& x, const fe& a, const fe& b) { x = FE_25519::mul(a, b); } inline void fe_sq(fe& x, const fe& z) { x = FE_25519::sqr(z); } inline void fe_sq_iter(fe& x, const fe& z, size_t iter) { x = FE_25519::sqr_iter(z, iter); } inline void fe_sq2(fe& x, const fe& z) { x = FE_25519::sqr2(z); } inline void fe_invert(fe& x, const fe& z) { x = FE_25519::invert(z); } inline void fe_pow22523(fe& x, const fe& y) { x = FE_25519::pow_22523(y); } } #endif botan-2.4.0/src/lib/pubkey/ed25519/ed25519_internal.h000066400000000000000000000027501322470703100215200ustar00rootroot00000000000000/* * Ed25519 * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ED25519_INT_H_ #define BOTAN_ED25519_INT_H_ #include #include namespace Botan { inline uint64_t load_3(const uint8_t in[3]) { return static_cast(in[0]) | (static_cast(in[1]) << 8) | (static_cast(in[2]) << 16); } inline uint64_t load_4(const uint8_t* in) { return load_le(in, 0); } /* ge means group element. Here the group is the set of pairs (x,y) of field elements (see fe.h) satisfying -x^2 + y^2 = 1 + d x^2y^2 where d = -121665/121666. Representations: ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT */ typedef struct { fe X; fe Y; fe Z; fe T; } ge_p3; int ge_frombytes_negate_vartime(ge_p3*, const uint8_t*); void ge_scalarmult_base(uint8_t out[32], const uint8_t in[32]); void ge_double_scalarmult_vartime(uint8_t out[32], const uint8_t a[], const ge_p3* A, const uint8_t b[]); /* The set of scalars is \Z/l where l = 2^252 + 27742317777372353535851937790883648493. */ void sc_reduce(uint8_t*); void sc_muladd(uint8_t*, const uint8_t*, const uint8_t*, const uint8_t*); } #endif botan-2.4.0/src/lib/pubkey/ed25519/ed25519_key.cpp000066400000000000000000000162431322470703100210310ustar00rootroot00000000000000/* * Ed25519 * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { AlgorithmIdentifier Ed25519_PublicKey::algorithm_identifier() const { // AlgorithmIdentifier::USE_NULL_PARAM puts 0x05 0x00 in parameters // We want nothing std::vector empty; return AlgorithmIdentifier(get_oid(), empty); } bool Ed25519_PublicKey::check_key(RandomNumberGenerator&, bool) const { return true; // no tests possible? // TODO could check cofactor } Ed25519_PublicKey::Ed25519_PublicKey(const AlgorithmIdentifier&, const std::vector& key_bits) { m_public = key_bits; if(m_public.size() != 32) throw Decoding_Error("Invalid size for Ed25519 public key"); } std::vector Ed25519_PublicKey::public_key_bits() const { return m_public; } Ed25519_PrivateKey::Ed25519_PrivateKey(const secure_vector& secret_key) { if(secret_key.size() == 64) { m_private = secret_key; m_public.assign(&m_private[32], &m_private[64]); } else if(secret_key.size() == 32) { m_public.resize(32); m_private.resize(64); ed25519_gen_keypair(m_public.data(), m_private.data(), secret_key.data()); } else throw Decoding_Error("Invalid size for Ed25519 private key"); } Ed25519_PrivateKey::Ed25519_PrivateKey(RandomNumberGenerator& rng) { const secure_vector seed = rng.random_vec(32); m_public.resize(32); m_private.resize(64); ed25519_gen_keypair(m_public.data(), m_private.data(), seed.data()); } Ed25519_PrivateKey::Ed25519_PrivateKey(const AlgorithmIdentifier&, const secure_vector& key_bits) { secure_vector bits; BER_Decoder(key_bits).decode(bits, OCTET_STRING).discard_remaining(); if(bits.size() != 32) throw Decoding_Error("Invalid size for Ed25519 private key"); m_public.resize(32); m_private.resize(64); ed25519_gen_keypair(m_public.data(), m_private.data(), bits.data()); } secure_vector Ed25519_PrivateKey::private_key_bits() const { secure_vector bits(&m_private[0], &m_private[32]); return DER_Encoder().encode(bits, OCTET_STRING).get_contents(); } bool Ed25519_PrivateKey::check_key(RandomNumberGenerator&, bool) const { return true; // ??? } namespace { /** * Ed25519 verifying operation */ class Ed25519_Pure_Verify_Operation final : public PK_Ops::Verification { public: Ed25519_Pure_Verify_Operation(const Ed25519_PublicKey& key) : m_key(key) { } void update(const uint8_t msg[], size_t msg_len) override { m_msg.insert(m_msg.end(), msg, msg + msg_len); } bool is_valid_signature(const uint8_t sig[], size_t sig_len) override { if(sig_len != 64) return false; const bool ok = ed25519_verify(m_msg.data(), m_msg.size(), sig, m_key.get_public_key().data()); m_msg.clear(); return ok; } private: std::vector m_msg; const Ed25519_PublicKey& m_key; }; /** * Ed25519 verifying operation with pre-hash */ class Ed25519_Hashed_Verify_Operation final : public PK_Ops::Verification { public: Ed25519_Hashed_Verify_Operation(const Ed25519_PublicKey& key, const std::string& hash) : m_key(key) { m_hash = HashFunction::create_or_throw(hash); } void update(const uint8_t msg[], size_t msg_len) override { m_hash->update(msg, msg_len); } bool is_valid_signature(const uint8_t sig[], size_t sig_len) override { if(sig_len != 64) return false; std::vector msg_hash(m_hash->output_length()); m_hash->final(msg_hash.data()); return ed25519_verify(msg_hash.data(), msg_hash.size(), sig, m_key.get_public_key().data()); } private: std::unique_ptr m_hash; const Ed25519_PublicKey& m_key; }; /** * Ed25519 signing operation ('pure' - signs message directly) */ class Ed25519_Pure_Sign_Operation final : public PK_Ops::Signature { public: Ed25519_Pure_Sign_Operation(const Ed25519_PrivateKey& key) : m_key(key) { } void update(const uint8_t msg[], size_t msg_len) override { m_msg.insert(m_msg.end(), msg, msg + msg_len); } secure_vector sign(RandomNumberGenerator&) override { secure_vector sig(64); ed25519_sign(sig.data(), m_msg.data(), m_msg.size(), m_key.get_private_key().data()); m_msg.clear(); return sig; } private: std::vector m_msg; const Ed25519_PrivateKey& m_key; }; /** * Ed25519 signing operation with pre-hash */ class Ed25519_Hashed_Sign_Operation final : public PK_Ops::Signature { public: Ed25519_Hashed_Sign_Operation(const Ed25519_PrivateKey& key, const std::string& hash) : m_key(key) { m_hash = HashFunction::create_or_throw(hash); } void update(const uint8_t msg[], size_t msg_len) override { m_hash->update(msg, msg_len); } secure_vector sign(RandomNumberGenerator&) override { secure_vector sig(64); std::vector msg_hash(m_hash->output_length()); m_hash->final(msg_hash.data()); ed25519_sign(sig.data(), msg_hash.data(), msg_hash.size(), m_key.get_private_key().data()); return sig; } private: std::unique_ptr m_hash; const Ed25519_PrivateKey& m_key; }; } std::unique_ptr Ed25519_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) { if(params == "" || params == "Identity" || params == "Pure") return std::unique_ptr(new Ed25519_Pure_Verify_Operation(*this)); else return std::unique_ptr(new Ed25519_Hashed_Verify_Operation(*this, params)); } throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr Ed25519_PrivateKey::create_signature_op(RandomNumberGenerator&, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) { if(params == "" || params == "Identity" || params == "Pure") return std::unique_ptr(new Ed25519_Pure_Sign_Operation(*this)); else return std::unique_ptr(new Ed25519_Hashed_Sign_Operation(*this, params)); } throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/ed25519/ge.cpp000066400000000000000000003456001322470703100175600ustar00rootroot00000000000000/* * Ed25519 group operations * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { /* Representations: ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T ge_precomp (Duif): (y+x,y-x,2dxy) */ typedef struct { fe X; fe Y; fe Z; } ge_p2; typedef struct { fe X; fe Y; fe Z; fe T; } ge_p1p1; typedef struct { fe yplusx; fe yminusx; fe xy2d; } ge_precomp; typedef struct { fe YplusX; fe YminusX; fe Z; fe T2d; } ge_cached; /* r = p + q */ void ge_add(ge_p1p1* r, const ge_p3* p, const ge_cached* q) { fe t0; /* qhasm: YpX1 = Y1+X1 */ /* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ fe_add(r->X, p->Y, p->X); /* qhasm: YmX1 = Y1-X1 */ /* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ fe_sub(r->Y, p->Y, p->X); /* qhasm: A = YpX1*YpX2 */ /* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YplusX); */ fe_mul(r->Z, r->X, q->YplusX); /* qhasm: B = YmX1*YmX2 */ /* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YminusX); */ fe_mul(r->Y, r->Y, q->YminusX); /* qhasm: C = T2d2*T1 */ /* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ fe_mul(r->T, q->T2d, p->T); /* qhasm: ZZ = Z1*Z2 */ /* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ fe_mul(r->X, p->Z, q->Z); /* qhasm: D = 2*ZZ */ /* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ fe_add(t0, r->X, r->X); /* qhasm: X3 = A-B */ /* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ fe_sub(r->X, r->Z, r->Y); /* qhasm: Y3 = A+B */ /* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ fe_add(r->Y, r->Z, r->Y); /* qhasm: Z3 = D+C */ /* asm 1: fe_add(>Z3=fe#3,Z3=r->Z,T); */ fe_add(r->Z, t0, r->T); /* qhasm: T3 = D-C */ /* asm 1: fe_sub(>T3=fe#4,T3=r->T,T); */ fe_sub(r->T, t0, r->T); } /* r = p + q */ void ge_madd(ge_p1p1* r, const ge_p3* p, const ge_precomp* q) { fe t0; /* qhasm: YpX1 = Y1+X1 */ fe_add(r->X, p->Y, p->X); /* qhasm: YmX1 = Y1-X1 */ fe_sub(r->Y, p->Y, p->X); /* qhasm: A = YpX1*ypx2 */ fe_mul(r->Z, r->X, q->yplusx); /* qhasm: B = YmX1*ymx2 */ fe_mul(r->Y, r->Y, q->yminusx); /* qhasm: C = xy2d2*T1 */ fe_mul(r->T, q->xy2d, p->T); /* qhasm: D = 2*Z1 */ fe_add(t0, p->Z, p->Z); /* qhasm: X3 = A-B */ fe_sub(r->X, r->Z, r->Y); /* qhasm: Y3 = A+B */ fe_add(r->Y, r->Z, r->Y); /* qhasm: Z3 = D+C */ fe_add(r->Z, t0, r->T); /* qhasm: T3 = D-C */ fe_sub(r->T, t0, r->T); } /* r = p - q */ void ge_msub(ge_p1p1* r, const ge_p3* p, const ge_precomp* q) { fe t0; /* qhasm: YpX1 = Y1+X1 */ /* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ fe_add(r->X, p->Y, p->X); /* qhasm: YmX1 = Y1-X1 */ /* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ fe_sub(r->Y, p->Y, p->X); /* qhasm: A = YpX1*ymx2 */ /* asm 1: fe_mul(>A=fe#3,A=r->Z,X,yminusx); */ fe_mul(r->Z, r->X, q->yminusx); /* qhasm: B = YmX1*ypx2 */ /* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,yplusx); */ fe_mul(r->Y, r->Y, q->yplusx); /* qhasm: C = xy2d2*T1 */ /* asm 1: fe_mul(>C=fe#4,C=r->T,xy2d,T); */ fe_mul(r->T, q->xy2d, p->T); /* qhasm: D = 2*Z1 */ /* asm 1: fe_add(>D=fe#5,D=t0,Z,Z); */ fe_add(t0, p->Z, p->Z); /* qhasm: X3 = A-B */ /* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ fe_sub(r->X, r->Z, r->Y); /* qhasm: Y3 = A+B */ /* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ fe_add(r->Y, r->Z, r->Y); /* qhasm: Z3 = D-C */ /* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ fe_sub(r->Z, t0, r->T); /* qhasm: T3 = D+C */ /* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ fe_add(r->T, t0, r->T); } /* r = p */ void ge_p1p1_to_p2(ge_p2* r, const ge_p1p1* p) { fe_mul(r->X, p->X, p->T); fe_mul(r->Y, p->Y, p->Z); fe_mul(r->Z, p->Z, p->T); } /* r = p */ void ge_p1p1_to_p3(ge_p3* r, const ge_p1p1* p) { fe_mul(r->X, p->X, p->T); fe_mul(r->Y, p->Y, p->Z); fe_mul(r->Z, p->Z, p->T); fe_mul(r->T, p->X, p->Y); } /* r = 2 * p */ void ge_p2_dbl(ge_p1p1* r, const ge_p2* p) { fe t0; /* qhasm: XX=X1^2 */ /* asm 1: fe_sq(>XX=fe#1,XX=r->X,X); */ fe_sq(r->X, p->X); /* qhasm: YY=Y1^2 */ /* asm 1: fe_sq(>YY=fe#3,YY=r->Z,Y); */ fe_sq(r->Z, p->Y); /* qhasm: B=2*Z1^2 */ /* asm 1: fe_sq2(>B=fe#4,B=r->T,Z); */ fe_sq2(r->T, p->Z); /* qhasm: A=X1+Y1 */ /* asm 1: fe_add(>A=fe#2,A=r->Y,X,Y); */ fe_add(r->Y, p->X, p->Y); /* qhasm: AA=A^2 */ /* asm 1: fe_sq(>AA=fe#5,AA=t0,Y); */ fe_sq(t0, r->Y); /* qhasm: Y3=YY+XX */ /* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,X); */ fe_add(r->Y, r->Z, r->X); /* qhasm: Z3=YY-XX */ /* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,Z,X); */ fe_sub(r->Z, r->Z, r->X); /* qhasm: X3=AA-Y3 */ /* asm 1: fe_sub(>X3=fe#1,X3=r->X,Y); */ fe_sub(r->X, t0, r->Y); /* qhasm: T3=B-Z3 */ /* asm 1: fe_sub(>T3=fe#4,T3=r->T,T,Z); */ fe_sub(r->T, r->T, r->Z); } void ge_p3_0(ge_p3* h) { fe_0(h->X); fe_1(h->Y); fe_1(h->Z); fe_0(h->T); } /* r = 2 * p */ void ge_p3_dbl(ge_p1p1* r, const ge_p3* p) { ge_p2 q; // Convert to p2 rep q.X = p->X; q.Y = p->Y; q.Z = p->Z; ge_p2_dbl(r, &q); } /* r = p */ void ge_p3_to_cached(ge_cached* r, const ge_p3* p) { static const fe d2 = { -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 } ; fe_add(r->YplusX, p->Y, p->X); fe_sub(r->YminusX, p->Y, p->X); fe_copy(r->Z, p->Z); fe_mul(r->T2d, p->T, d2); } /* r = p - q */ void ge_sub(ge_p1p1* r, const ge_p3* p, const ge_cached* q) { fe t0; /* qhasm: YpX1 = Y1+X1 */ /* asm 1: fe_add(>YpX1=fe#1,YpX1=r->X,Y,X); */ fe_add(r->X, p->Y, p->X); /* qhasm: YmX1 = Y1-X1 */ /* asm 1: fe_sub(>YmX1=fe#2,YmX1=r->Y,Y,X); */ fe_sub(r->Y, p->Y, p->X); /* qhasm: A = YpX1*YmX2 */ /* asm 1: fe_mul(>A=fe#3,A=r->Z,X,YminusX); */ fe_mul(r->Z, r->X, q->YminusX); /* qhasm: B = YmX1*YpX2 */ /* asm 1: fe_mul(>B=fe#2,B=r->Y,Y,YplusX); */ fe_mul(r->Y, r->Y, q->YplusX); /* qhasm: C = T2d2*T1 */ /* asm 1: fe_mul(>C=fe#4,C=r->T,T2d,T); */ fe_mul(r->T, q->T2d, p->T); /* qhasm: ZZ = Z1*Z2 */ /* asm 1: fe_mul(>ZZ=fe#1,ZZ=r->X,Z,Z); */ fe_mul(r->X, p->Z, q->Z); /* qhasm: D = 2*ZZ */ /* asm 1: fe_add(>D=fe#5,D=t0,X,X); */ fe_add(t0, r->X, r->X); /* qhasm: X3 = A-B */ /* asm 1: fe_sub(>X3=fe#1,X3=r->X,Z,Y); */ fe_sub(r->X, r->Z, r->Y); /* qhasm: Y3 = A+B */ /* asm 1: fe_add(>Y3=fe#2,Y3=r->Y,Z,Y); */ fe_add(r->Y, r->Z, r->Y); /* qhasm: Z3 = D-C */ /* asm 1: fe_sub(>Z3=fe#3,Z3=r->Z,T); */ fe_sub(r->Z, t0, r->T); /* qhasm: T3 = D+C */ /* asm 1: fe_add(>T3=fe#4,T3=r->T,T); */ fe_add(r->T, t0, r->T); } void slide(int8_t* r, const uint8_t* a) { for(size_t i = 0; i < 256; ++i) { r[i] = 1 & (a[i >> 3] >> (i & 7)); } for(size_t i = 0; i < 256; ++i) { if(r[i]) { for(size_t b = 1; b <= 6 && i + b < 256; ++b) { if(r[i + b]) { if(r[i] + (r[i + b] << b) <= 15) { r[i] += r[i + b] << b; r[i + b] = 0; } else if(r[i] - (r[i + b] << b) >= -15) { r[i] -= r[i + b] << b; for(size_t k = i + b; k < 256; ++k) { if(!r[k]) { r[k] = 1; break; } r[k] = 0; } } else { break; } } } } } } void ge_tobytes(uint8_t* s, const ge_p2* h) { fe recip; fe x; fe y; fe_invert(recip, h->Z); fe_mul(x, h->X, recip); fe_mul(y, h->Y, recip); fe_tobytes(s, y); s[31] ^= fe_isnegative(x) << 7; } void ge_p2_0(ge_p2* h) { fe_0(h->X); fe_1(h->Y); fe_1(h->Z); } } int ge_frombytes_negate_vartime(ge_p3* h, const uint8_t* s) { static const fe d = { -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 } ; static const fe sqrtm1 = { -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 } ; fe u; fe v; fe v3; fe vxx; fe check; fe_frombytes(h->Y, s); fe_1(h->Z); fe_sq(u, h->Y); fe_mul(v, u, d); fe_sub(u, u, h->Z); /* u = y^2-1 */ fe_add(v, v, h->Z); /* v = dy^2+1 */ fe_sq(v3, v); fe_mul(v3, v3, v); /* v3 = v^3 */ fe_sq(h->X, v3); fe_mul(h->X, h->X, v); fe_mul(h->X, h->X, u); /* x = uv^7 */ fe_pow22523(h->X, h->X); /* x = (uv^7)^((q-5)/8) */ fe_mul(h->X, h->X, v3); fe_mul(h->X, h->X, u); /* x = uv^3(uv^7)^((q-5)/8) */ fe_sq(vxx, h->X); fe_mul(vxx, vxx, v); fe_sub(check, vxx, u); /* vx^2-u */ if(fe_isnonzero(check)) { fe_add(check, vxx, u); /* vx^2+u */ if(fe_isnonzero(check)) { return -1; } fe_mul(h->X, h->X, sqrtm1); } if(fe_isnegative(h->X) == (s[31] >> 7)) { fe_neg(h->X, h->X); } fe_mul(h->T, h->X, h->Y); return 0; } /* r = a * A + b * B where a = a[0]+256*a[1]+...+256^31 a[31]. and b = b[0]+256*b[1]+...+256^31 b[31]. B is the Ed25519 base point (x,4/5) with x positive. */ void ge_double_scalarmult_vartime( uint8_t out[32], const uint8_t* a, const ge_p3* A, const uint8_t* b) { static const ge_precomp Bi[8] = { { { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, }, { { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, }, { { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, }, { { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, }, { { -22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877 }, { -6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951 }, { 4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784 }, }, { { -25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436 }, { 25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918 }, { 23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877 }, }, { { -33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800 }, { -25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305 }, { -13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300 }, }, { { -3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876 }, { -24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619 }, { -3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683 }, }, } ; int8_t aslide[256]; int8_t bslide[256]; ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ ge_p1p1 t; ge_p3 u; ge_p3 A2; ge_p2 r; int i; slide(aslide, a); slide(bslide, b); ge_p3_to_cached(&Ai[0], A); ge_p3_dbl(&t, A); ge_p1p1_to_p3(&A2, &t); ge_add(&t, &A2, &Ai[0]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[1], &u); ge_add(&t, &A2, &Ai[1]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[2], &u); ge_add(&t, &A2, &Ai[2]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[3], &u); ge_add(&t, &A2, &Ai[3]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[4], &u); ge_add(&t, &A2, &Ai[4]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[5], &u); ge_add(&t, &A2, &Ai[5]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[6], &u); ge_add(&t, &A2, &Ai[6]); ge_p1p1_to_p3(&u, &t); ge_p3_to_cached(&Ai[7], &u); ge_p2_0(&r); for(i = 255; i >= 0; --i) { if(aslide[i] || bslide[i]) { break; } } for(; i >= 0; --i) { ge_p2_dbl(&t, &r); if(aslide[i] > 0) { ge_p1p1_to_p3(&u, &t); ge_add(&t, &u, &Ai[aslide[i] >> 1]); } else if(aslide[i] < 0) { ge_p1p1_to_p3(&u, &t); ge_sub(&t, &u, &Ai[(-aslide[i]) >> 1]); } if(bslide[i] > 0) { ge_p1p1_to_p3(&u, &t); ge_madd(&t, &u, &Bi[bslide[i] >> 1]); } else if(bslide[i] < 0) { ge_p1p1_to_p3(&u, &t); ge_msub(&t, &u, &Bi[(-bslide[i]) >> 1]); } ge_p1p1_to_p2(&r, &t); } ge_tobytes(out, &r); } /* base[i][j] = (j+1)*256^i*B */ static const ge_precomp B_precomp[32][8] = { { { { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, }, { { -12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303 }, { -21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081 }, { 26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697 }, }, { { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, }, { { -17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540 }, { 23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397 }, { 7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325 }, }, { { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, }, { { -15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777 }, { -8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737 }, { -18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652 }, }, { { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, }, { { 14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726 }, { -7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955 }, { 27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425 }, }, }, { { { -13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171 }, { 27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510 }, { 17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660 }, }, { { -10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639 }, { 29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963 }, { 5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950 }, }, { { -27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568 }, { 12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335 }, { 25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628 }, }, { { -26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007 }, { -2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772 }, { -22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653 }, }, { { 2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567 }, { 13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686 }, { 21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372 }, }, { { -13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887 }, { -23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954 }, { -29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953 }, }, { { 24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833 }, { -16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532 }, { -22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876 }, }, { { 2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268 }, { 33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214 }, { 1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038 }, }, }, { { { 6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800 }, { 4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645 }, { -4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664 }, }, { { 1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933 }, { -25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182 }, { -17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222 }, }, { { -18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991 }, { 20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880 }, { 9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092 }, }, { { -16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295 }, { 19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788 }, { 8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553 }, }, { { -15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026 }, { 11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347 }, { -18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033 }, }, { { -23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395 }, { -27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278 }, { 1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890 }, }, { { 32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995 }, { -30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596 }, { -11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891 }, }, { { 31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060 }, { 11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608 }, { -20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606 }, }, }, { { { 7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389 }, { -19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016 }, { -11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341 }, }, { { -22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505 }, { 14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553 }, { -28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655 }, }, { { 15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220 }, { 12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631 }, { -4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099 }, }, { { 26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556 }, { 14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749 }, { 236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930 }, }, { { 1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391 }, { 5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253 }, { 20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066 }, }, { { 24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958 }, { -11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082 }, { -28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383 }, }, { { -30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521 }, { -11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807 }, { 23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948 }, }, { { 9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134 }, { -32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455 }, { 27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629 }, }, }, { { { -8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069 }, { -32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746 }, { 24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919 }, }, { { 11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837 }, { 8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906 }, { -28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771 }, }, { { -25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817 }, { 10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098 }, { 10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409 }, }, { { -12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504 }, { -26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727 }, { 28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420 }, }, { { -32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003 }, { -1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605 }, { -30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384 }, }, { { -26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701 }, { -23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683 }, { 29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708 }, }, { { -3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563 }, { -19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260 }, { -5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387 }, }, { { -19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672 }, { 23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686 }, { -24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665 }, }, }, { { { 11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182 }, { -31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277 }, { 14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628 }, }, { { -4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474 }, { -26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539 }, { -25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822 }, }, { { -10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970 }, { 19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756 }, { -24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508 }, }, { { -26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683 }, { -10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655 }, { -20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158 }, }, { { -4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125 }, { -15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839 }, { -20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664 }, }, { { 27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294 }, { -18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899 }, { -11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070 }, }, { { 3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294 }, { -15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949 }, { -21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083 }, }, { { 31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420 }, { -5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940 }, { 29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396 }, }, }, { { { -12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567 }, { 20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127 }, { -16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294 }, }, { { -12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887 }, { 22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964 }, { 16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195 }, }, { { 9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244 }, { 24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999 }, { -1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762 }, }, { { -18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274 }, { -33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236 }, { -16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605 }, }, { { -13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761 }, { -22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884 }, { -6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482 }, }, { { -24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638 }, { -11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490 }, { -32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170 }, }, { { 5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736 }, { 10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124 }, { -17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392 }, }, { { 8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029 }, { 6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048 }, { 28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958 }, }, }, { { { 24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593 }, { 26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071 }, { -11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692 }, }, { { 11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687 }, { -160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441 }, { -20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001 }, }, { { -938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460 }, { -19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007 }, { -21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762 }, }, { { 15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005 }, { -9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674 }, { 4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035 }, }, { { 7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590 }, { -2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957 }, { -30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812 }, }, { { 33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740 }, { -18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122 }, { -27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158 }, }, { { 8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885 }, { 26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140 }, { 19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857 }, }, { { 801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155 }, { 19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260 }, { 19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483 }, }, }, { { { -3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677 }, { 32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815 }, { 22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751 }, }, { { -16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203 }, { -11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208 }, { 1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230 }, }, { { 16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850 }, { -21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389 }, { -9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968 }, }, { { -11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689 }, { 14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880 }, { 5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304 }, }, { { 30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632 }, { -3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412 }, { 20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566 }, }, { { -20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038 }, { -26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232 }, { -1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943 }, }, { { 17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856 }, { 23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738 }, { 15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971 }, }, { { -27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718 }, { -13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697 }, { -11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883 }, }, }, { { { 5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912 }, { -26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358 }, { 3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849 }, }, { { 29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307 }, { -14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977 }, { -6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335 }, }, { { -29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644 }, { -22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616 }, { -27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735 }, }, { { -21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099 }, { 29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341 }, { -936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336 }, }, { { -23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646 }, { 31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425 }, { -17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388 }, }, { { -31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743 }, { -16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822 }, { -8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462 }, }, { { 18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985 }, { 9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702 }, { -22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797 }, }, { { 21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293 }, { 27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100 }, { 19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688 }, }, }, { { { 12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186 }, { 2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610 }, { -2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707 }, }, { { 7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220 }, { 915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025 }, { 32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044 }, }, { { 32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992 }, { -4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027 }, { 21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197 }, }, { { 8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901 }, { 31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952 }, { 19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878 }, }, { { -28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390 }, { 32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730 }, { 2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730 }, }, { { -19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180 }, { -30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272 }, { -15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715 }, }, { { -22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970 }, { -31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772 }, { -17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865 }, }, { { 15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750 }, { 20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373 }, { 32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348 }, }, }, { { { 9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144 }, { -22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195 }, { 5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086 }, }, { { -13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684 }, { -8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518 }, { -2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233 }, }, { { -5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793 }, { -2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794 }, { 580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435 }, }, { { 23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921 }, { 13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518 }, { 2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563 }, }, { { 14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278 }, { -27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024 }, { 4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030 }, }, { { 10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783 }, { 27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717 }, { 6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844 }, }, { { 14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333 }, { 16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048 }, { 22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760 }, }, { { -4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760 }, { -15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757 }, { -2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112 }, }, }, { { { -19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468 }, { 3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184 }, { 10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289 }, }, { { 15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066 }, { 24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882 }, { 13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226 }, }, { { 16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101 }, { 29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279 }, { -6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811 }, }, { { 27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709 }, { 20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714 }, { -2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121 }, }, { { 9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464 }, { 12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847 }, { 13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400 }, }, { { 4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414 }, { -15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158 }, { 17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045 }, }, { { -461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415 }, { -5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459 }, { -31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079 }, }, { { 21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412 }, { -20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743 }, { -14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836 }, }, }, { { { 12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022 }, { 18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429 }, { -6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065 }, }, { { 30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861 }, { 10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000 }, { -33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101 }, }, { { 32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815 }, { 29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642 }, { 10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966 }, }, { { 25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574 }, { -21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742 }, { -18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689 }, }, { { 12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020 }, { -10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772 }, { 3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982 }, }, { { -14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953 }, { -16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218 }, { -17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265 }, }, { { 29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073 }, { -3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325 }, { -11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798 }, }, { { -4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870 }, { -7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863 }, { -13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927 }, }, }, { { { -2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267 }, { -9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663 }, { 22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862 }, }, { { -25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673 }, { 15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943 }, { 15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020 }, }, { { -4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238 }, { 11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064 }, { 14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795 }, }, { { 15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052 }, { -10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904 }, { 29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531 }, }, { { -13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979 }, { -5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841 }, { 10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431 }, }, { { 10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324 }, { -31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940 }, { 10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320 }, }, { { -15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184 }, { 14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114 }, { 30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878 }, }, { { 12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784 }, { -2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091 }, { -16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585 }, }, }, { { { -8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208 }, { 10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864 }, { 17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661 }, }, { { 7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233 }, { 26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212 }, { -12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525 }, }, { { -24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068 }, { 9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397 }, { -8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988 }, }, { { 5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889 }, { 32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038 }, { 14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697 }, }, { { 20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875 }, { -25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905 }, { -25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656 }, }, { { 11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818 }, { 27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714 }, { 10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203 }, }, { { 20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931 }, { -30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024 }, { -23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084 }, }, { { -1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204 }, { 20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817 }, { 27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667 }, }, }, { { { 11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504 }, { -12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768 }, { -19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255 }, }, { { 6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790 }, { 1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438 }, { -22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333 }, }, { { 17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971 }, { 31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905 }, { 29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409 }, }, { { 12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409 }, { 6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499 }, { -8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363 }, }, { { 28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664 }, { -11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324 }, { -21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940 }, }, { { 13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990 }, { -17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914 }, { -25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290 }, }, { { 24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257 }, { -6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433 }, { -16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236 }, }, { { -12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045 }, { 11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093 }, { -1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347 }, }, }, { { { -28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191 }, { -15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507 }, { -12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906 }, }, { { 3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018 }, { -16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109 }, { -23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926 }, }, { { -24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528 }, { 8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625 }, { -32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286 }, }, { { 2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033 }, { 27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866 }, { 21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896 }, }, { { 30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075 }, { 26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347 }, { -22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437 }, }, { { -5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165 }, { -18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588 }, { -32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193 }, }, { { -19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017 }, { -28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883 }, { 21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961 }, }, { { 8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043 }, { 29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663 }, { -20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362 }, }, }, { { { -33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860 }, { 2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466 }, { -24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063 }, }, { { -26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997 }, { -1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295 }, { -13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369 }, }, { { 9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385 }, { 18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109 }, { 2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906 }, }, { { 4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424 }, { -19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185 }, { 7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962 }, }, { { -7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325 }, { 10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593 }, { 696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404 }, }, { { -11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644 }, { 17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801 }, { 26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804 }, }, { { -31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884 }, { -586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577 }, { -9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849 }, }, { { 32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473 }, { -8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644 }, { -2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319 }, }, }, { { { -11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599 }, { -9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768 }, { -27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084 }, }, { { -27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328 }, { -15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369 }, { 20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920 }, }, { { 12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815 }, { -32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025 }, { -21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397 }, }, { { -20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448 }, { 6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981 }, { 30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165 }, }, { { 32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501 }, { 17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073 }, { -1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861 }, }, { { 14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845 }, { -1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211 }, { 18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870 }, }, { { 10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096 }, { 33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803 }, { -32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168 }, }, { { 30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965 }, { -14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505 }, { 18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598 }, }, }, { { { 5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782 }, { 5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900 }, { -31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479 }, }, { { -12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208 }, { 8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232 }, { 17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719 }, }, { { 16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271 }, { -4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326 }, { -8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132 }, }, { { 14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300 }, { 8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570 }, { 15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670 }, }, { { -2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994 }, { -12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913 }, { 31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317 }, }, { { -25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730 }, { 842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096 }, { -4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078 }, }, { { -15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411 }, { -19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905 }, { -9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654 }, }, { { -28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870 }, { -23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498 }, { 12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579 }, }, }, { { { 14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677 }, { 10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647 }, { -2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743 }, }, { { -25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468 }, { 21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375 }, { -25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155 }, }, { { 6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725 }, { -12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612 }, { -10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943 }, }, { { -30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944 }, { 30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928 }, { 9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406 }, }, { { 22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139 }, { -8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963 }, { -31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693 }, }, { { 1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734 }, { -448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680 }, { -24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410 }, }, { { -9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931 }, { -16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654 }, { 22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710 }, }, { { 29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180 }, { -26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684 }, { -10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895 }, }, }, { { { 22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501 }, { -11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413 }, { 6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880 }, }, { { -8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874 }, { 22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962 }, { -7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899 }, }, { { 21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152 }, { 9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063 }, { 7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080 }, }, { { -9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146 }, { -17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183 }, { -19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133 }, }, { { -32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421 }, { -3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622 }, { -4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197 }, }, { { 2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663 }, { 31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753 }, { 4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755 }, }, { { -9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862 }, { -26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118 }, { 26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171 }, }, { { 15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380 }, { 16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824 }, { 28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270 }, }, }, { { { -817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438 }, { -31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584 }, { -594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562 }, }, { { 30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471 }, { 18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610 }, { 19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269 }, }, { { -30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650 }, { 14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369 }, { 19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461 }, }, { { 30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462 }, { -5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793 }, { -2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218 }, }, { { -24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226 }, { 18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019 }, { -15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037 }, }, { { 31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171 }, { -17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132 }, { -28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841 }, }, { { 21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181 }, { -33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210 }, { -1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040 }, }, { { 3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935 }, { 24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105 }, { -28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814 }, }, }, { { { 793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852 }, { 5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581 }, { -4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646 }, }, { { 10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844 }, { 10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025 }, { 27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453 }, }, { { -23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068 }, { 4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192 }, { -17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921 }, }, { { -9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259 }, { -12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426 }, { -5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072 }, }, { { -17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305 }, { 13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832 }, { 28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943 }, }, { { -16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011 }, { 24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447 }, { 17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494 }, }, { { -28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245 }, { -20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859 }, { 28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915 }, }, { { 16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707 }, { 10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848 }, { -11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224 }, }, }, { { { -25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391 }, { 15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215 }, { -23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101 }, }, { { 23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713 }, { 21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849 }, { -7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930 }, }, { { -29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940 }, { -21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031 }, { -17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404 }, }, { { -25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243 }, { -23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116 }, { -24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525 }, }, { { -23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509 }, { -10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883 }, { 15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865 }, }, { { -3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660 }, { 4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273 }, { -28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138 }, }, { { -25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560 }, { -10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135 }, { 2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941 }, }, { { -4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739 }, { 18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756 }, { -30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819 }, }, }, { { { -6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347 }, { -27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028 }, { 21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075 }, }, { { 16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799 }, { -2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609 }, { -25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817 }, }, { { -23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989 }, { -30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523 }, { 4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278 }, }, { { 31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045 }, { 19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377 }, { 24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480 }, }, { { 17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016 }, { 510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426 }, { 18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525 }, }, { { 13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396 }, { 9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080 }, { 12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892 }, }, { { 15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275 }, { 11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074 }, { 20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140 }, }, { { -16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717 }, { -1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101 }, { 24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127 }, }, }, { { { -12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632 }, { -26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415 }, { -31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160 }, }, { { 31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876 }, { 22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625 }, { -15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478 }, }, { { 27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164 }, { 26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595 }, { -7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248 }, }, { { -16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858 }, { 15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193 }, { 8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184 }, }, { { -18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942 }, { -1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635 }, { 21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948 }, }, { { 11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935 }, { -25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415 }, { -15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416 }, }, { { -7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018 }, { 4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778 }, { 366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659 }, }, { { -24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385 }, { 18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503 }, { 476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329 }, }, }, { { { 20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056 }, { -13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838 }, { 24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948 }, }, { { -3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691 }, { -15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118 }, { -23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517 }, }, { { -20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269 }, { -6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904 }, { -23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589 }, }, { { -28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193 }, { -7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910 }, { -30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930 }, }, { { -7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667 }, { 25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481 }, { -9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876 }, }, { { 22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640 }, { -8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278 }, { -21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112 }, }, { { 26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272 }, { 17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012 }, { -10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221 }, }, { { 30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046 }, { 13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345 }, { -19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310 }, }, }, { { { 19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937 }, { 31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636 }, { -9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008 }, }, { { -2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429 }, { -15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576 }, { 31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066 }, }, { { -9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490 }, { -12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104 }, { 33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053 }, }, { { 31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275 }, { -20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511 }, { 22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095 }, }, { { -28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439 }, { 23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939 }, { -23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424 }, }, { { 2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310 }, { 3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608 }, { -32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079 }, }, { { -23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101 }, { 21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418 }, { 18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576 }, }, { { 30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356 }, { 9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996 }, { -26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099 }, }, }, { { { -26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728 }, { -13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658 }, { -10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242 }, }, { { -21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001 }, { -4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766 }, { 18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373 }, }, { { 26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458 }, { -17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628 }, { -13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657 }, }, { { -23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062 }, { 25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616 }, { 31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014 }, }, { { 24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383 }, { -25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814 }, { -20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718 }, }, { { 30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417 }, { 2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222 }, { 33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444 }, }, { { -20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597 }, { 23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970 }, { 1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799 }, }, { { -5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647 }, { 13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511 }, { -29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032 }, }, }, { { { 9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834 }, { -23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461 }, { 29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062 }, }, { { -25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516 }, { -20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547 }, { -24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240 }, }, { { -17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038 }, { -33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741 }, { 16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103 }, }, { { -19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747 }, { -1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323 }, { 31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016 }, }, { { -14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373 }, { 15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228 }, { -2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141 }, }, { { 16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399 }, { 11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831 }, { -185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376 }, }, { { -32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313 }, { -18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958 }, { -6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577 }, }, { { -22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743 }, { 29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684 }, { -20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476 }, }, }, } ; namespace { inline uint8_t equal(int8_t b, int8_t c) { uint8_t ub = b; uint8_t uc = c; uint8_t x = ub ^ uc; /* 0: yes; 1..255: no */ uint32_t y = x; /* 0: yes; 1..255: no */ y -= 1; /* 4294967295: yes; 0..254: no */ y >>= 31; /* 1: yes; 0: no */ return y; } inline int32_t equal32(int8_t b, int8_t c) { return -static_cast(equal(b, c)); } inline uint8_t negative(int8_t b) { uint64_t x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ x >>= 63; /* 1: yes; 0: no */ return x; } inline void ge_precomp_0(ge_precomp* h) { fe_1(h->yplusx); fe_1(h->yminusx); fe_0(h->xy2d); } inline void select(ge_precomp* t, const ge_precomp* base, int8_t b) { const uint8_t bnegative = negative(b); const uint8_t babs = b - ((-static_cast(bnegative) & b) * 2); const int32_t neg_mask = equal32(bnegative, 1); const int32_t mask1 = equal32(babs, 1); const int32_t mask2 = equal32(babs, 2); const int32_t mask3 = equal32(babs, 3); const int32_t mask4 = equal32(babs, 4); const int32_t mask5 = equal32(babs, 5); const int32_t mask6 = equal32(babs, 6); const int32_t mask7 = equal32(babs, 7); const int32_t mask8 = equal32(babs, 8); ge_precomp_0(t); for(size_t i = 0; i != 10; ++i) { t->yplusx[i] = t->yplusx[i] ^ ((t->yplusx[i] ^ base[0].yplusx[i]) & mask1) ^ ((t->yplusx[i] ^ base[1].yplusx[i]) & mask2) ^ ((t->yplusx[i] ^ base[2].yplusx[i]) & mask3) ^ ((t->yplusx[i] ^ base[3].yplusx[i]) & mask4) ^ ((t->yplusx[i] ^ base[4].yplusx[i]) & mask5) ^ ((t->yplusx[i] ^ base[5].yplusx[i]) & mask6) ^ ((t->yplusx[i] ^ base[6].yplusx[i]) & mask7) ^ ((t->yplusx[i] ^ base[7].yplusx[i]) & mask8); t->yminusx[i] = t->yminusx[i] ^ ((t->yminusx[i] ^ base[0].yminusx[i]) & mask1) ^ ((t->yminusx[i] ^ base[1].yminusx[i]) & mask2) ^ ((t->yminusx[i] ^ base[2].yminusx[i]) & mask3) ^ ((t->yminusx[i] ^ base[3].yminusx[i]) & mask4) ^ ((t->yminusx[i] ^ base[4].yminusx[i]) & mask5) ^ ((t->yminusx[i] ^ base[5].yminusx[i]) & mask6) ^ ((t->yminusx[i] ^ base[6].yminusx[i]) & mask7) ^ ((t->yminusx[i] ^ base[7].yminusx[i]) & mask8); t->xy2d[i] = t->xy2d[i] ^ ((t->xy2d[i] ^ base[0].xy2d[i]) & mask1) ^ ((t->xy2d[i] ^ base[1].xy2d[i]) & mask2) ^ ((t->xy2d[i] ^ base[2].xy2d[i]) & mask3) ^ ((t->xy2d[i] ^ base[3].xy2d[i]) & mask4) ^ ((t->xy2d[i] ^ base[4].xy2d[i]) & mask5) ^ ((t->xy2d[i] ^ base[5].xy2d[i]) & mask6) ^ ((t->xy2d[i] ^ base[6].xy2d[i]) & mask7) ^ ((t->xy2d[i] ^ base[7].xy2d[i]) & mask8); } fe minus_xy2d; fe_neg(minus_xy2d, t->xy2d); // If negative have to swap yminusx and yplusx for(size_t i = 0; i != 10; ++i) { int32_t t_yplusx = t->yplusx[i] ^ ((t->yplusx[i] ^ t->yminusx[i]) & neg_mask); int32_t t_yminusx = t->yminusx[i] ^ ((t->yminusx[i] ^ t->yplusx[i]) & neg_mask); t->yplusx[i] = t_yplusx; t->yminusx[i] = t_yminusx; t->xy2d[i] = t->xy2d[i] ^ ((t->xy2d[i] ^ minus_xy2d[i]) & neg_mask); } } void ge_p3_tobytes(uint8_t* s, const ge_p3* h) { fe recip; fe x; fe y; fe_invert(recip, h->Z); fe_mul(x, h->X, recip); fe_mul(y, h->Y, recip); fe_tobytes(s, y); s[31] ^= fe_isnegative(x) << 7; } } /* h = a * B where a = a[0]+256*a[1]+...+256^31 a[31] B is the Ed25519 base point (x,4/5) with x positive. Preconditions: a[31] <= 127 */ void ge_scalarmult_base(uint8_t out[32], const uint8_t a[32]) { int8_t e[64]; int8_t carry; ge_p1p1 r; ge_p2 s; ge_p3 h; ge_precomp t; int i; for(i = 0; i < 32; ++i) { e[2 * i + 0] = (a[i] >> 0) & 15; e[2 * i + 1] = (a[i] >> 4) & 15; } /* each e[i] is between 0 and 15 */ /* e[63] is between 0 and 7 */ carry = 0; for(i = 0; i < 63; ++i) { e[i] += carry; carry = e[i] + 8; carry >>= 4; e[i] -= carry << 4; } e[63] += carry; /* each e[i] is between -8 and 8 */ ge_p3_0(&h); for(i = 1; i < 64; i += 2) { select(&t, B_precomp[i / 2], e[i]); ge_madd(&r, &h, &t); ge_p1p1_to_p3(&h, &r); } ge_p3_dbl(&r, &h); ge_p1p1_to_p2(&s, &r); ge_p2_dbl(&r, &s); ge_p1p1_to_p2(&s, &r); ge_p2_dbl(&r, &s); ge_p1p1_to_p2(&s, &r); ge_p2_dbl(&r, &s); ge_p1p1_to_p3(&h, &r); for(i = 0; i < 64; i += 2) { select(&t, B_precomp[i / 2], e[i]); ge_madd(&r, &h, &t); ge_p1p1_to_p3(&h, &r); } ge_p3_tobytes(out, &h); } } botan-2.4.0/src/lib/pubkey/ed25519/info.txt000066400000000000000000000002741322470703100201500ustar00rootroot00000000000000 ED25519 -> 20170607 sha2_64 ed25519.h ed25519_fe.h ed25519_internal.h botan-2.4.0/src/lib/pubkey/ed25519/sc_muladd.cpp000066400000000000000000000301671322470703100211170ustar00rootroot00000000000000/* * Ed25519 * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* Input: a[0]+256*a[1]+...+256^31*a[31] = a b[0]+256*b[1]+...+256^31*b[31] = b c[0]+256*c[1]+...+256^31*c[31] = c Output: s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l where l = 2^252 + 27742317777372353535851937790883648493. */ void sc_muladd(uint8_t* s, const uint8_t* a, const uint8_t* b, const uint8_t* c) { const int64_t X20 = (1 << 20); const int64_t X21 = (1 << 21); int64_t a0 = 2097151 & load_3(a); int64_t a1 = 2097151 & (load_4(a + 2) >> 5); int64_t a2 = 2097151 & (load_3(a + 5) >> 2); int64_t a3 = 2097151 & (load_4(a + 7) >> 7); int64_t a4 = 2097151 & (load_4(a + 10) >> 4); int64_t a5 = 2097151 & (load_3(a + 13) >> 1); int64_t a6 = 2097151 & (load_4(a + 15) >> 6); int64_t a7 = 2097151 & (load_3(a + 18) >> 3); int64_t a8 = 2097151 & load_3(a + 21); int64_t a9 = 2097151 & (load_4(a + 23) >> 5); int64_t a10 = 2097151 & (load_3(a + 26) >> 2); int64_t a11 = (load_4(a + 28) >> 7); int64_t b0 = 2097151 & load_3(b); int64_t b1 = 2097151 & (load_4(b + 2) >> 5); int64_t b2 = 2097151 & (load_3(b + 5) >> 2); int64_t b3 = 2097151 & (load_4(b + 7) >> 7); int64_t b4 = 2097151 & (load_4(b + 10) >> 4); int64_t b5 = 2097151 & (load_3(b + 13) >> 1); int64_t b6 = 2097151 & (load_4(b + 15) >> 6); int64_t b7 = 2097151 & (load_3(b + 18) >> 3); int64_t b8 = 2097151 & load_3(b + 21); int64_t b9 = 2097151 & (load_4(b + 23) >> 5); int64_t b10 = 2097151 & (load_3(b + 26) >> 2); int64_t b11 = (load_4(b + 28) >> 7); int64_t c0 = 2097151 & load_3(c); int64_t c1 = 2097151 & (load_4(c + 2) >> 5); int64_t c2 = 2097151 & (load_3(c + 5) >> 2); int64_t c3 = 2097151 & (load_4(c + 7) >> 7); int64_t c4 = 2097151 & (load_4(c + 10) >> 4); int64_t c5 = 2097151 & (load_3(c + 13) >> 1); int64_t c6 = 2097151 & (load_4(c + 15) >> 6); int64_t c7 = 2097151 & (load_3(c + 18) >> 3); int64_t c8 = 2097151 & load_3(c + 21); int64_t c9 = 2097151 & (load_4(c + 23) >> 5); int64_t c10 = 2097151 & (load_3(c + 26) >> 2); int64_t c11 = (load_4(c + 28) >> 7); int64_t s0; int64_t s1; int64_t s2; int64_t s3; int64_t s4; int64_t s5; int64_t s6; int64_t s7; int64_t s8; int64_t s9; int64_t s10; int64_t s11; int64_t s12; int64_t s13; int64_t s14; int64_t s15; int64_t s16; int64_t s17; int64_t s18; int64_t s19; int64_t s20; int64_t s21; int64_t s22; int64_t s23; int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; int64_t carry10; int64_t carry11; int64_t carry12; int64_t carry13; int64_t carry14; int64_t carry15; int64_t carry16; int64_t carry17; int64_t carry18; int64_t carry19; int64_t carry20; int64_t carry21; int64_t carry22; s0 = c0 + a0*b0; s1 = c1 + a0*b1 + a1*b0; s2 = c2 + a0*b2 + a1*b1 + a2*b0; s3 = c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0; s4 = c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0; s5 = c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0; s6 = c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0; s7 = c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0; s8 = c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0; s9 = c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0; s10 = c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0; s11 = c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0; s12 = a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1; s13 = a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2; s14 = a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3; s15 = a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4; s16 = a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5; s17 = a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6; s18 = a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7; s19 = a8*b11 + a9*b10 + a10*b9 + a11*b8; s20 = a9*b11 + a10*b10 + a11*b9; s21 = a10*b11 + a11*b10; s22 = a11*b11; s23 = 0; carry0 = (s0 + X20) >> 21; s1 += carry0; s0 -= carry0 * X21; carry2 = (s2 + X20) >> 21; s3 += carry2; s2 -= carry2 * X21; carry4 = (s4 + X20) >> 21; s5 += carry4; s4 -= carry4 * X21; carry6 = (s6 + X20) >> 21; s7 += carry6; s6 -= carry6 * X21; carry8 = (s8 + X20) >> 21; s9 += carry8; s8 -= carry8 * X21; carry10 = (s10 + X20) >> 21; s11 += carry10; s10 -= carry10 * X21; carry12 = (s12 + X20) >> 21; s13 += carry12; s12 -= carry12 * X21; carry14 = (s14 + X20) >> 21; s15 += carry14; s14 -= carry14 * X21; carry16 = (s16 + X20) >> 21; s17 += carry16; s16 -= carry16 * X21; carry18 = (s18 + X20) >> 21; s19 += carry18; s18 -= carry18 * X21; carry20 = (s20 + X20) >> 21; s21 += carry20; s20 -= carry20 * X21; carry22 = (s22 + X20) >> 21; s23 += carry22; s22 -= carry22 * X21; carry1 = (s1 + X20) >> 21; s2 += carry1; s1 -= carry1 * X21; carry3 = (s3 + X20) >> 21; s4 += carry3; s3 -= carry3 * X21; carry5 = (s5 + X20) >> 21; s6 += carry5; s5 -= carry5 * X21; carry7 = (s7 + X20) >> 21; s8 += carry7; s7 -= carry7 * X21; carry9 = (s9 + X20) >> 21; s10 += carry9; s9 -= carry9 * X21; carry11 = (s11 + X20) >> 21; s12 += carry11; s11 -= carry11 * X21; carry13 = (s13 + X20) >> 21; s14 += carry13; s13 -= carry13 * X21; carry15 = (s15 + X20) >> 21; s16 += carry15; s15 -= carry15 * X21; carry17 = (s17 + X20) >> 21; s18 += carry17; s17 -= carry17 * X21; carry19 = (s19 + X20) >> 21; s20 += carry19; s19 -= carry19 * X21; carry21 = (s21 + X20) >> 21; s22 += carry21; s21 -= carry21 * X21; s11 += s23 * 666643; s12 += s23 * 470296; s13 += s23 * 654183; s14 -= s23 * 997805; s15 += s23 * 136657; s16 -= s23 * 683901; s23 = 0; s10 += s22 * 666643; s11 += s22 * 470296; s12 += s22 * 654183; s13 -= s22 * 997805; s14 += s22 * 136657; s15 -= s22 * 683901; s22 = 0; s9 += s21 * 666643; s10 += s21 * 470296; s11 += s21 * 654183; s12 -= s21 * 997805; s13 += s21 * 136657; s14 -= s21 * 683901; s21 = 0; s8 += s20 * 666643; s9 += s20 * 470296; s10 += s20 * 654183; s11 -= s20 * 997805; s12 += s20 * 136657; s13 -= s20 * 683901; s20 = 0; s7 += s19 * 666643; s8 += s19 * 470296; s9 += s19 * 654183; s10 -= s19 * 997805; s11 += s19 * 136657; s12 -= s19 * 683901; s19 = 0; s6 += s18 * 666643; s7 += s18 * 470296; s8 += s18 * 654183; s9 -= s18 * 997805; s10 += s18 * 136657; s11 -= s18 * 683901; s18 = 0; carry6 = (s6 + X20) >> 21; s7 += carry6; s6 -= carry6 * X21; carry8 = (s8 + X20) >> 21; s9 += carry8; s8 -= carry8 * X21; carry10 = (s10 + X20) >> 21; s11 += carry10; s10 -= carry10 * X21; carry12 = (s12 + X20) >> 21; s13 += carry12; s12 -= carry12 * X21; carry14 = (s14 + X20) >> 21; s15 += carry14; s14 -= carry14 * X21; carry16 = (s16 + X20) >> 21; s17 += carry16; s16 -= carry16 * X21; carry7 = (s7 + X20) >> 21; s8 += carry7; s7 -= carry7 * X21; carry9 = (s9 + X20) >> 21; s10 += carry9; s9 -= carry9 * X21; carry11 = (s11 + X20) >> 21; s12 += carry11; s11 -= carry11 * X21; carry13 = (s13 + X20) >> 21; s14 += carry13; s13 -= carry13 * X21; carry15 = (s15 + X20) >> 21; s16 += carry15; s15 -= carry15 * X21; s5 += s17 * 666643; s6 += s17 * 470296; s7 += s17 * 654183; s8 -= s17 * 997805; s9 += s17 * 136657; s10 -= s17 * 683901; s17 = 0; s4 += s16 * 666643; s5 += s16 * 470296; s6 += s16 * 654183; s7 -= s16 * 997805; s8 += s16 * 136657; s9 -= s16 * 683901; s16 = 0; s3 += s15 * 666643; s4 += s15 * 470296; s5 += s15 * 654183; s6 -= s15 * 997805; s7 += s15 * 136657; s8 -= s15 * 683901; s15 = 0; s2 += s14 * 666643; s3 += s14 * 470296; s4 += s14 * 654183; s5 -= s14 * 997805; s6 += s14 * 136657; s7 -= s14 * 683901; s14 = 0; s1 += s13 * 666643; s2 += s13 * 470296; s3 += s13 * 654183; s4 -= s13 * 997805; s5 += s13 * 136657; s6 -= s13 * 683901; s13 = 0; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = (s0 + X20) >> 21; s1 += carry0; s0 -= carry0 * X21; carry2 = (s2 + X20) >> 21; s3 += carry2; s2 -= carry2 * X21; carry4 = (s4 + X20) >> 21; s5 += carry4; s4 -= carry4 * X21; carry6 = (s6 + X20) >> 21; s7 += carry6; s6 -= carry6 * X21; carry8 = (s8 + X20) >> 21; s9 += carry8; s8 -= carry8 * X21; carry10 = (s10 + X20) >> 21; s11 += carry10; s10 -= carry10 * X21; carry1 = (s1 + X20) >> 21; s2 += carry1; s1 -= carry1 * X21; carry3 = (s3 + X20) >> 21; s4 += carry3; s3 -= carry3 * X21; carry5 = (s5 + X20) >> 21; s6 += carry5; s5 -= carry5 * X21; carry7 = (s7 + X20) >> 21; s8 += carry7; s7 -= carry7 * X21; carry9 = (s9 + X20) >> 21; s10 += carry9; s9 -= carry9 * X21; carry11 = (s11 + X20) >> 21; s12 += carry11; s11 -= carry11 * X21; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * X21; carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * X21; carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * X21; carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * X21; carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * X21; carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * X21; carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * X21; carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * X21; carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * X21; carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * X21; carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * X21; carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 * X21; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * X21; carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * X21; carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * X21; carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * X21; carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * X21; carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * X21; carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * X21; carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * X21; carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * X21; carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * X21; carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * X21; s[0] = s0 >> 0; s[1] = s0 >> 8; s[2] = (s0 >> 16) | (s1 << 5); s[3] = s1 >> 3; s[4] = s1 >> 11; s[5] = (s1 >> 19) | (s2 << 2); s[6] = s2 >> 6; s[7] = (s2 >> 14) | (s3 << 7); s[8] = s3 >> 1; s[9] = s3 >> 9; s[10] = (s3 >> 17) | (s4 << 4); s[11] = s4 >> 4; s[12] = s4 >> 12; s[13] = (s4 >> 20) | (s5 << 1); s[14] = s5 >> 7; s[15] = (s5 >> 15) | (s6 << 6); s[16] = s6 >> 2; s[17] = s6 >> 10; s[18] = (s6 >> 18) | (s7 << 3); s[19] = s7 >> 5; s[20] = s7 >> 13; s[21] = s8 >> 0; s[22] = s8 >> 8; s[23] = (s8 >> 16) | (s9 << 5); s[24] = s9 >> 3; s[25] = s9 >> 11; s[26] = (s9 >> 19) | (s10 << 2); s[27] = s10 >> 6; s[28] = (s10 >> 14) | (s11 << 7); s[29] = s11 >> 1; s[30] = s11 >> 9; s[31] = s11 >> 17; } } botan-2.4.0/src/lib/pubkey/ed25519/sc_reduce.cpp000066400000000000000000000177171322470703100211260ustar00rootroot00000000000000/* * Ed25519 * (C) 2017 Ribose Inc * * Based on the public domain code from SUPERCOP ref10 by * Peter Schwabe, Daniel J. Bernstein, Niels Duif, Tanja Lange, Bo-Yin Yang * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { /* Input: s[0]+256*s[1]+...+256^63*s[63] = s Output: s[0]+256*s[1]+...+256^31*s[31] = s mod l where l = 2^252 + 27742317777372353535851937790883648493. Overwrites s in place. */ void sc_reduce(uint8_t* s) { const int64_t X20 = (1 << 20); const int64_t X21 = (1 << 21); int64_t s0 = 2097151 & load_3(s); int64_t s1 = 2097151 & (load_4(s + 2) >> 5); int64_t s2 = 2097151 & (load_3(s + 5) >> 2); int64_t s3 = 2097151 & (load_4(s + 7) >> 7); int64_t s4 = 2097151 & (load_4(s + 10) >> 4); int64_t s5 = 2097151 & (load_3(s + 13) >> 1); int64_t s6 = 2097151 & (load_4(s + 15) >> 6); int64_t s7 = 2097151 & (load_3(s + 18) >> 3); int64_t s8 = 2097151 & load_3(s + 21); int64_t s9 = 2097151 & (load_4(s + 23) >> 5); int64_t s10 = 2097151 & (load_3(s + 26) >> 2); int64_t s11 = 2097151 & (load_4(s + 28) >> 7); int64_t s12 = 2097151 & (load_4(s + 31) >> 4); int64_t s13 = 2097151 & (load_3(s + 34) >> 1); int64_t s14 = 2097151 & (load_4(s + 36) >> 6); int64_t s15 = 2097151 & (load_3(s + 39) >> 3); int64_t s16 = 2097151 & load_3(s + 42); int64_t s17 = 2097151 & (load_4(s + 44) >> 5); int64_t s18 = 2097151 & (load_3(s + 47) >> 2); int64_t s19 = 2097151 & (load_4(s + 49) >> 7); int64_t s20 = 2097151 & (load_4(s + 52) >> 4); int64_t s21 = 2097151 & (load_3(s + 55) >> 1); int64_t s22 = 2097151 & (load_4(s + 57) >> 6); int64_t s23 = (load_4(s + 60) >> 3); int64_t carry0; int64_t carry1; int64_t carry2; int64_t carry3; int64_t carry4; int64_t carry5; int64_t carry6; int64_t carry7; int64_t carry8; int64_t carry9; int64_t carry10; int64_t carry11; int64_t carry12; int64_t carry13; int64_t carry14; int64_t carry15; int64_t carry16; s11 += s23 * 666643; s12 += s23 * 470296; s13 += s23 * 654183; s14 -= s23 * 997805; s15 += s23 * 136657; s16 -= s23 * 683901; s23 = 0; s10 += s22 * 666643; s11 += s22 * 470296; s12 += s22 * 654183; s13 -= s22 * 997805; s14 += s22 * 136657; s15 -= s22 * 683901; s22 = 0; s9 += s21 * 666643; s10 += s21 * 470296; s11 += s21 * 654183; s12 -= s21 * 997805; s13 += s21 * 136657; s14 -= s21 * 683901; s21 = 0; s8 += s20 * 666643; s9 += s20 * 470296; s10 += s20 * 654183; s11 -= s20 * 997805; s12 += s20 * 136657; s13 -= s20 * 683901; s20 = 0; s7 += s19 * 666643; s8 += s19 * 470296; s9 += s19 * 654183; s10 -= s19 * 997805; s11 += s19 * 136657; s12 -= s19 * 683901; s19 = 0; s6 += s18 * 666643; s7 += s18 * 470296; s8 += s18 * 654183; s9 -= s18 * 997805; s10 += s18 * 136657; s11 -= s18 * 683901; s18 = 0; carry6 = (s6 + X20) >> 21; s7 += carry6; s6 -= carry6 * X21; carry8 = (s8 + X20) >> 21; s9 += carry8; s8 -= carry8 * X21; carry10 = (s10 + X20) >> 21; s11 += carry10; s10 -= carry10 * X21; carry12 = (s12 + X20) >> 21; s13 += carry12; s12 -= carry12 * X21; carry14 = (s14 + X20) >> 21; s15 += carry14; s14 -= carry14 * X21; carry16 = (s16 + X20) >> 21; s17 += carry16; s16 -= carry16 * X21; carry7 = (s7 + X20) >> 21; s8 += carry7; s7 -= carry7 * X21; carry9 = (s9 + X20) >> 21; s10 += carry9; s9 -= carry9 * X21; carry11 = (s11 + X20) >> 21; s12 += carry11; s11 -= carry11 * X21; carry13 = (s13 + X20) >> 21; s14 += carry13; s13 -= carry13 * X21; carry15 = (s15 + X20) >> 21; s16 += carry15; s15 -= carry15 * X21; s5 += s17 * 666643; s6 += s17 * 470296; s7 += s17 * 654183; s8 -= s17 * 997805; s9 += s17 * 136657; s10 -= s17 * 683901; s17 = 0; s4 += s16 * 666643; s5 += s16 * 470296; s6 += s16 * 654183; s7 -= s16 * 997805; s8 += s16 * 136657; s9 -= s16 * 683901; s16 = 0; s3 += s15 * 666643; s4 += s15 * 470296; s5 += s15 * 654183; s6 -= s15 * 997805; s7 += s15 * 136657; s8 -= s15 * 683901; s15 = 0; s2 += s14 * 666643; s3 += s14 * 470296; s4 += s14 * 654183; s5 -= s14 * 997805; s6 += s14 * 136657; s7 -= s14 * 683901; s14 = 0; s1 += s13 * 666643; s2 += s13 * 470296; s3 += s13 * 654183; s4 -= s13 * 997805; s5 += s13 * 136657; s6 -= s13 * 683901; s13 = 0; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = (s0 + X20) >> 21; s1 += carry0; s0 -= carry0 * X21; carry2 = (s2 + X20) >> 21; s3 += carry2; s2 -= carry2 * X21; carry4 = (s4 + X20) >> 21; s5 += carry4; s4 -= carry4 * X21; carry6 = (s6 + X20) >> 21; s7 += carry6; s6 -= carry6 * X21; carry8 = (s8 + X20) >> 21; s9 += carry8; s8 -= carry8 * X21; carry10 = (s10 + X20) >> 21; s11 += carry10; s10 -= carry10 * X21; carry1 = (s1 + X20) >> 21; s2 += carry1; s1 -= carry1 * X21; carry3 = (s3 + X20) >> 21; s4 += carry3; s3 -= carry3 * X21; carry5 = (s5 + X20) >> 21; s6 += carry5; s5 -= carry5 * X21; carry7 = (s7 + X20) >> 21; s8 += carry7; s7 -= carry7 * X21; carry9 = (s9 + X20) >> 21; s10 += carry9; s9 -= carry9 * X21; carry11 = (s11 + X20) >> 21; s12 += carry11; s11 -= carry11 * X21; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * X21; carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * X21; carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * X21; carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * X21; carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * X21; carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * X21; carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * X21; carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * X21; carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * X21; carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * X21; carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * X21; carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 * X21; s0 += s12 * 666643; s1 += s12 * 470296; s2 += s12 * 654183; s3 -= s12 * 997805; s4 += s12 * 136657; s5 -= s12 * 683901; s12 = 0; carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * X21; carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * X21; carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * X21; carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * X21; carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * X21; carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * X21; carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * X21; carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * X21; carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * X21; carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * X21; carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * X21; s[0] = s0 >> 0; s[1] = s0 >> 8; s[2] = (s0 >> 16) | (s1 << 5); s[3] = s1 >> 3; s[4] = s1 >> 11; s[5] = (s1 >> 19) | (s2 << 2); s[6] = s2 >> 6; s[7] = (s2 >> 14) | (s3 << 7); s[8] = s3 >> 1; s[9] = s3 >> 9; s[10] = (s3 >> 17) | (s4 << 4); s[11] = s4 >> 4; s[12] = s4 >> 12; s[13] = (s4 >> 20) | (s5 << 1); s[14] = s5 >> 7; s[15] = (s5 >> 15) | (s6 << 6); s[16] = s6 >> 2; s[17] = s6 >> 10; s[18] = (s6 >> 18) | (s7 << 3); s[19] = s7 >> 5; s[20] = s7 >> 13; s[21] = s8 >> 0; s[22] = s8 >> 8; s[23] = (s8 >> 16) | (s9 << 5); s[24] = s9 >> 3; s[25] = s9 >> 11; s[26] = (s9 >> 19) | (s10 << 2); s[27] = s10 >> 6; s[28] = (s10 >> 14) | (s11 << 7); s[29] = s11 >> 1; s[30] = s11 >> 9; s[31] = s11 >> 17; } } botan-2.4.0/src/lib/pubkey/elgamal/000077500000000000000000000000001322470703100170555ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/elgamal/elgamal.cpp000066400000000000000000000135231322470703100211670ustar00rootroot00000000000000/* * ElGamal * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { /* * ElGamal_PublicKey Constructor */ ElGamal_PublicKey::ElGamal_PublicKey(const DL_Group& grp, const BigInt& y1) { m_group = grp; m_y = y1; } /* * ElGamal_PrivateKey Constructor */ ElGamal_PrivateKey::ElGamal_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { m_group = grp; m_x = x_arg; if(m_x == 0) m_x.randomize(rng, dl_exponent_size(group_p().bits())); m_y = power_mod(group_g(), m_x, group_p()); } ElGamal_PrivateKey::ElGamal_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : DL_Scheme_PrivateKey(alg_id, key_bits, DL_Group::ANSI_X9_42) { m_y = power_mod(group_g(), m_x, group_p()); } /* * Check Private ElGamal Parameters */ bool ElGamal_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!DL_Scheme_PrivateKey::check_key(rng, strong)) return false; if(!strong) return true; return KeyPair::encryption_consistency_check(rng, *this, "EME1(SHA-256)"); } namespace { /** * ElGamal encryption operation */ class ElGamal_Encryption_Operation final : public PK_Ops::Encryption_with_EME { public: size_t max_raw_input_bits() const override { return m_mod_p.get_modulus().bits() - 1; } ElGamal_Encryption_Operation(const ElGamal_PublicKey& key, const std::string& eme); secure_vector raw_encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; private: Fixed_Base_Power_Mod m_powermod_g_p, m_powermod_y_p; Modular_Reducer m_mod_p; }; ElGamal_Encryption_Operation::ElGamal_Encryption_Operation(const ElGamal_PublicKey& key, const std::string& eme) : PK_Ops::Encryption_with_EME(eme) { const BigInt& p = key.group_p(); m_powermod_g_p = Fixed_Base_Power_Mod(key.group_g(), p); m_powermod_y_p = Fixed_Base_Power_Mod(key.get_y(), p); m_mod_p = Modular_Reducer(p); } secure_vector ElGamal_Encryption_Operation::raw_encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) { const BigInt& p = m_mod_p.get_modulus(); BigInt m(msg, msg_len); if(m >= p) throw Invalid_Argument("ElGamal encryption: Input is too large"); BigInt k(rng, dl_exponent_size(p.bits())); BigInt a = m_powermod_g_p(k); BigInt b = m_mod_p.multiply(m, m_powermod_y_p(k)); secure_vector output(2*p.bytes()); a.binary_encode(&output[p.bytes() - a.bytes()]); b.binary_encode(&output[output.size() / 2 + (p.bytes() - b.bytes())]); return output; } /** * ElGamal decryption operation */ class ElGamal_Decryption_Operation final : public PK_Ops::Decryption_with_EME { public: size_t max_raw_input_bits() const override { return m_mod_p.get_modulus().bits() - 1; } ElGamal_Decryption_Operation(const ElGamal_PrivateKey& key, const std::string& eme, RandomNumberGenerator& rng); secure_vector raw_decrypt(const uint8_t msg[], size_t msg_len) override; private: Fixed_Exponent_Power_Mod m_powermod_x_p; Modular_Reducer m_mod_p; Blinder m_blinder; }; ElGamal_Decryption_Operation::ElGamal_Decryption_Operation(const ElGamal_PrivateKey& key, const std::string& eme, RandomNumberGenerator& rng) : PK_Ops::Decryption_with_EME(eme), m_powermod_x_p(Fixed_Exponent_Power_Mod(key.get_x(), key.group_p())), m_mod_p(Modular_Reducer(key.group_p())), m_blinder(key.group_p(), rng, [](const BigInt& k) { return k; }, [this](const BigInt& k) { return m_powermod_x_p(k); }) { } secure_vector ElGamal_Decryption_Operation::raw_decrypt(const uint8_t msg[], size_t msg_len) { const BigInt& p = m_mod_p.get_modulus(); const size_t p_bytes = p.bytes(); if(msg_len != 2 * p_bytes) throw Invalid_Argument("ElGamal decryption: Invalid message"); BigInt a(msg, p_bytes); BigInt b(msg + p_bytes, p_bytes); if(a >= p || b >= p) throw Invalid_Argument("ElGamal decryption: Invalid message"); a = m_blinder.blind(a); BigInt r = m_mod_p.multiply(b, inverse_mod(m_powermod_x_p(a), p)); return BigInt::encode_1363(m_blinder.unblind(r), p_bytes); } } std::unique_ptr ElGamal_PublicKey::create_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new ElGamal_Encryption_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr ElGamal_PrivateKey::create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new ElGamal_Decryption_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/elgamal/elgamal.h000066400000000000000000000047671322470703100206460ustar00rootroot00000000000000/* * ElGamal * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ELGAMAL_H_ #define BOTAN_ELGAMAL_H_ #include namespace Botan { /** * ElGamal Public Key */ class BOTAN_PUBLIC_API(2,0) ElGamal_PublicKey : public virtual DL_Scheme_PublicKey { public: std::string algo_name() const override { return "ElGamal"; } DL_Group::Format group_format() const override { return DL_Group::ANSI_X9_42; } /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ ElGamal_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : DL_Scheme_PublicKey(alg_id, key_bits, DL_Group::ANSI_X9_42) {} /** * Create a public key. * @param group the underlying DL group * @param y the public value y = g^x mod p */ ElGamal_PublicKey(const DL_Group& group, const BigInt& y); std::unique_ptr create_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; protected: ElGamal_PublicKey() = default; }; /** * ElGamal Private Key */ class BOTAN_PUBLIC_API(2,0) ElGamal_PrivateKey final : public ElGamal_PublicKey, public virtual DL_Scheme_PrivateKey { public: bool check_key(RandomNumberGenerator& rng, bool) const override; /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded key bits in ANSI X9.42 format */ ElGamal_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Create a private key. * @param rng random number generator to use * @param group the group to be used in the key * @param priv_key the key's secret value (or if zero, generate a new key) */ ElGamal_PrivateKey(RandomNumberGenerator& rng, const DL_Group& group, const BigInt& priv_key = 0); std::unique_ptr create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/elgamal/info.txt000066400000000000000000000001471322470703100205530ustar00rootroot00000000000000 ELGAMAL -> 20131128 dl_algo dl_group keypair numbertheory botan-2.4.0/src/lib/pubkey/gost_3410/000077500000000000000000000000001322470703100170765ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/gost_3410/gost_3410.cpp000066400000000000000000000154001322470703100212250ustar00rootroot00000000000000/* * GOST 34.10-2001 implemenation * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { std::vector GOST_3410_PublicKey::public_key_bits() const { const BigInt x = public_point().get_affine_x(); const BigInt y = public_point().get_affine_y(); size_t part_size = std::max(x.bytes(), y.bytes()); std::vector bits(2*part_size); x.binary_encode(&bits[part_size - x.bytes()]); y.binary_encode(&bits[2*part_size - y.bytes()]); // Keys are stored in little endian format (WTF) for(size_t i = 0; i != part_size / 2; ++i) { std::swap(bits[i], bits[part_size-1-i]); std::swap(bits[part_size+i], bits[2*part_size-1-i]); } return DER_Encoder().encode(bits, OCTET_STRING).get_contents_unlocked(); } AlgorithmIdentifier GOST_3410_PublicKey::algorithm_identifier() const { std::vector params = DER_Encoder().start_cons(SEQUENCE) .encode(OID(domain().get_oid())) .end_cons() .get_contents_unlocked(); return AlgorithmIdentifier(get_oid(), params); } GOST_3410_PublicKey::GOST_3410_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) { OID ecc_param_id; // The parameters also includes hash and cipher OIDs BER_Decoder(alg_id.get_parameters()).start_cons(SEQUENCE).decode(ecc_param_id); m_domain_params = EC_Group(ecc_param_id); secure_vector bits; BER_Decoder(key_bits).decode(bits, OCTET_STRING); const size_t part_size = bits.size() / 2; // Keys are stored in little endian format (WTF) for(size_t i = 0; i != part_size / 2; ++i) { std::swap(bits[i], bits[part_size-1-i]); std::swap(bits[part_size+i], bits[2*part_size-1-i]); } BigInt x(bits.data(), part_size); BigInt y(&bits[part_size], part_size); m_public_key = PointGFp(domain().get_curve(), x, y); BOTAN_ASSERT(m_public_key.on_the_curve(), "Loaded GOST 34.10 public key is on the curve"); } namespace { BigInt decode_le(const uint8_t msg[], size_t msg_len) { secure_vector msg_le(msg, msg + msg_len); for(size_t i = 0; i != msg_le.size() / 2; ++i) std::swap(msg_le[i], msg_le[msg_le.size()-1-i]); return BigInt(msg_le.data(), msg_le.size()); } /** * GOST-34.10 signature operation */ class GOST_3410_Signature_Operation final : public PK_Ops::Signature_with_EMSA { public: GOST_3410_Signature_Operation(const GOST_3410_PrivateKey& gost_3410, const std::string& emsa) : PK_Ops::Signature_with_EMSA(emsa), m_order(gost_3410.domain().get_order()), m_mod_order(m_order), m_base_point(gost_3410.domain().get_base_point(), m_order), m_x(gost_3410.private_value()) {} size_t max_input_bits() const override { return m_order.bits(); } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; private: const BigInt& m_order; Modular_Reducer m_mod_order; Blinded_Point_Multiply m_base_point; const BigInt& m_x; }; secure_vector GOST_3410_Signature_Operation::raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) { BigInt k; do k.randomize(rng, m_order.bits()-1); while(k >= m_order); BigInt e = decode_le(msg, msg_len); e = m_mod_order.reduce(e); if(e == 0) e = 1; const PointGFp k_times_P = m_base_point.blinded_multiply(k, rng); BOTAN_ASSERT(k_times_P.on_the_curve(), "GOST 34.10 k*g is on the curve"); const BigInt r = m_mod_order.reduce(k_times_P.get_affine_x()); const BigInt s = m_mod_order.reduce(r*m_x + k*e); if(r == 0 || s == 0) throw Invalid_State("GOST 34.10: r == 0 || s == 0"); secure_vector output(2*m_order.bytes()); s.binary_encode(&output[output.size() / 2 - s.bytes()]); r.binary_encode(&output[output.size() - r.bytes()]); return output; } /** * GOST-34.10 verification operation */ class GOST_3410_Verification_Operation final : public PK_Ops::Verification_with_EMSA { public: GOST_3410_Verification_Operation(const GOST_3410_PublicKey& gost, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), m_base_point(gost.domain().get_base_point()), m_public_point(gost.public_point()), m_order(gost.domain().get_order()) {} size_t max_input_bits() const override { return m_order.bits(); } bool with_recovery() const override { return false; } bool verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) override; private: const PointGFp& m_base_point; const PointGFp& m_public_point; const BigInt& m_order; }; bool GOST_3410_Verification_Operation::verify(const uint8_t msg[], size_t msg_len, const uint8_t sig[], size_t sig_len) { if(sig_len != m_order.bytes()*2) return false; BigInt e = decode_le(msg, msg_len); BigInt s(sig, sig_len / 2); BigInt r(sig + sig_len / 2, sig_len / 2); if(r <= 0 || r >= m_order || s <= 0 || s >= m_order) return false; e %= m_order; if(e == 0) e = 1; BigInt v = inverse_mod(e, m_order); BigInt z1 = (s*v) % m_order; BigInt z2 = (-r*v) % m_order; PointGFp R = multi_exponentiate(m_base_point, z1, m_public_point, z2); if(R.is_zero()) return false; return (R.get_affine_x() == r); } } std::unique_ptr GOST_3410_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new GOST_3410_Verification_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr GOST_3410_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new GOST_3410_Signature_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/gost_3410/gost_3410.h000066400000000000000000000060311322470703100206720ustar00rootroot00000000000000/* * GOST 34.10-2001 * (C) 2007 Falko Strenzke, FlexSecure GmbH * Manuel Hartl, FlexSecure GmbH * (C) 2008-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_GOST_3410_KEY_H_ #define BOTAN_GOST_3410_KEY_H_ #include namespace Botan { /** * GOST-34.10 Public Key */ class BOTAN_PUBLIC_API(2,0) GOST_3410_PublicKey : public virtual EC_PublicKey { public: /** * Construct a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ GOST_3410_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ GOST_3410_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits); /** * Get this keys algorithm name. * @result this keys algorithm name */ std::string algo_name() const override { return "GOST-34.10"; } AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; size_t message_parts() const override { return 2; } size_t message_part_size() const override { return domain().get_order().bytes(); } std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: GOST_3410_PublicKey() = default; }; /** * GOST-34.10 Private Key */ class BOTAN_PUBLIC_API(2,0) GOST_3410_PrivateKey final : public GOST_3410_PublicKey, public EC_PrivateKey { public: /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ GOST_3410_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits) {} /** * Generate a new private key * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key; if zero, a new random key is generated */ GOST_3410_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0) : EC_PrivateKey(rng, domain, x) {} AlgorithmIdentifier pkcs8_algorithm_identifier() const override { return EC_PublicKey::algorithm_identifier(); } std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/gost_3410/info.txt000066400000000000000000000001761322470703100205760ustar00rootroot00000000000000 GOST_34_10_2001 -> 20131128 load_on auto asn1 ec_group ecc_key numbertheory rng botan-2.4.0/src/lib/pubkey/info.txt000066400000000000000000000004721322470703100171520ustar00rootroot00000000000000 PUBLIC_KEY_CRYPTO -> 20131128 blinding.h pk_algs.h pk_keys.h pk_ops.h pk_ops_fwd.h pkcs8.h pubkey.h workfactor.h x509_key.h pk_ops_impl.h asn1 bigint kdf pbes2 pem pk_pad numbertheory rng hash hex botan-2.4.0/src/lib/pubkey/keypair/000077500000000000000000000000001322470703100171175ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/keypair/info.txt000066400000000000000000000001111322470703100206040ustar00rootroot00000000000000 KEYPAIR_TESTING -> 20131128 botan-2.4.0/src/lib/pubkey/keypair/keypair.cpp000066400000000000000000000041371322470703100212740ustar00rootroot00000000000000/* * Keypair Checks * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace KeyPair { /* * Check an encryption key pair for consistency */ bool encryption_consistency_check(RandomNumberGenerator& rng, const Private_Key& private_key, const Public_Key& public_key, const std::string& padding) { PK_Encryptor_EME encryptor(public_key, rng, padding); PK_Decryptor_EME decryptor(private_key, rng, padding); /* Weird corner case, if the key is too small to encrypt anything at all. This can happen with very small RSA keys with PSS */ if(encryptor.maximum_input_size() == 0) return true; std::vector plaintext = unlock(rng.random_vec(encryptor.maximum_input_size() - 1)); std::vector ciphertext = encryptor.encrypt(plaintext, rng); if(ciphertext == plaintext) return false; std::vector decrypted = unlock(decryptor.decrypt(ciphertext)); return (plaintext == decrypted); } /* * Check a signature key pair for consistency */ bool signature_consistency_check(RandomNumberGenerator& rng, const Private_Key& private_key, const Public_Key& public_key, const std::string& padding) { PK_Signer signer(private_key, rng, padding); PK_Verifier verifier(public_key, padding); std::vector message(32); rng.randomize(message.data(), message.size()); std::vector signature; try { signature = signer.sign_message(message, rng); } catch(Encoding_Error&) { return false; } if(!verifier.verify_message(message, signature)) return false; // Now try to check a corrupt signature, ensure it does not succeed ++signature[0]; if(verifier.verify_message(message, signature)) return false; return true; } } } botan-2.4.0/src/lib/pubkey/keypair/keypair.h000066400000000000000000000047141322470703100207420ustar00rootroot00000000000000/* * Keypair Checks * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_KEYPAIR_CHECKS_H_ #define BOTAN_KEYPAIR_CHECKS_H_ #include namespace Botan { namespace KeyPair { /** * Tests whether the key is consistent for encryption; whether * encrypting and then decrypting gives to the original plaintext. * @param rng the rng to use * @param private_key the key to test * @param public_key the key to test * @param padding the encryption padding method to use * @return true if consistent otherwise false */ BOTAN_PUBLIC_API(2,0) bool encryption_consistency_check(RandomNumberGenerator& rng, const Private_Key& private_key, const Public_Key& public_key, const std::string& padding); /** * Tests whether the key is consistent for signatures; whether a * signature can be created and then verified * @param rng the rng to use * @param private_key the key to test * @param public_key the key to test * @param padding the signature padding method to use * @return true if consistent otherwise false */ BOTAN_PUBLIC_API(2,0) bool signature_consistency_check(RandomNumberGenerator& rng, const Private_Key& private_key, const Public_Key& public_key, const std::string& padding); /** * Tests whether the key is consistent for encryption; whether * encrypting and then decrypting gives to the original plaintext. * @param rng the rng to use * @param key the key to test * @param padding the encryption padding method to use * @return true if consistent otherwise false */ inline bool encryption_consistency_check(RandomNumberGenerator& rng, const Private_Key& key, const std::string& padding) { return encryption_consistency_check(rng, key, key, padding); } /** * Tests whether the key is consistent for signatures; whether a * signature can be created and then verified * @param rng the rng to use * @param key the key to test * @param padding the signature padding method to use * @return true if consistent otherwise false */ inline bool signature_consistency_check(RandomNumberGenerator& rng, const Private_Key& key, const std::string& padding) { return signature_consistency_check(rng, key, key, padding); } } } #endif botan-2.4.0/src/lib/pubkey/mce/000077500000000000000000000000001322470703100162175ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/mce/code_based_key_gen.cpp000066400000000000000000000167651322470703100225130ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include #include #include namespace Botan { namespace { class binary_matrix final { public: binary_matrix(uint32_t m_rown, uint32_t m_coln); void row_xor(uint32_t a, uint32_t b); secure_vector row_reduced_echelon_form(); /** * return the coefficient out of F_2 */ uint32_t coef(uint32_t i, uint32_t j) { return (m_elem[(i) * m_rwdcnt + (j) / 32] >> (j % 32)) & 1; } void set_coef_to_one(uint32_t i, uint32_t j) { m_elem[(i) * m_rwdcnt + (j) / 32] |= (static_cast(1) << ((j) % 32)) ; } void toggle_coeff(uint32_t i, uint32_t j) { m_elem[(i) * m_rwdcnt + (j) / 32] ^= (static_cast(1) << ((j) % 32)) ; } //private: uint32_t m_rown; // number of rows. uint32_t m_coln; // number of columns. uint32_t m_rwdcnt; // number of words in a row std::vector m_elem; }; binary_matrix::binary_matrix (uint32_t rown, uint32_t coln) { m_coln = coln; m_rown = rown; m_rwdcnt = 1 + ((m_coln - 1) / 32); m_elem = std::vector(m_rown * m_rwdcnt); } void binary_matrix::row_xor(uint32_t a, uint32_t b) { uint32_t i; for(i=0;i binary_matrix::row_reduced_echelon_form() { uint32_t i, failcnt, findrow, max=m_coln - 1; secure_vector perm(m_coln); for(i=0;i=0;j--)//fill the column with 0's upwards too. { if(coef(j,(max))) { row_xor(j,i); } } } }//end for(i) return perm; } void randomize_support(std::vector& L, RandomNumberGenerator& rng) { for(uint32_t i = 0; i != L.size(); ++i) { gf2m rnd = random_gf2m(rng); // no rejection sampling, but for useful code-based parameters with n <= 13 this seem tolerable std::swap(L[i], L[rnd % L.size()]); } } std::unique_ptr generate_R(std::vector &L, polyn_gf2m* g, std::shared_ptr sp_field, uint32_t code_length, uint32_t t ) { //L- Support //t- Number of errors //n- Length of the Goppa code //m- The extension degree of the GF //g- The generator polynomial. gf2m x,y; uint32_t i,j,k,r,n; std::vector Laux(code_length); n=code_length; r=t*sp_field->get_extension_degree(); binary_matrix H(r, n) ; for(i=0;i< n;i++) { x = g->eval(lex_to_gray(L[i]));//evaluate the polynomial at the point L[i]. x = sp_field->gf_inv(x); y = x; for(j=0;jget_extension_degree();k++) { if(y & (1<get_extension_degree()+ k,i); } } y = sp_field->gf_mul(y,lex_to_gray(L[i])); } }//The H matrix is fed. secure_vector perm = H.row_reduced_echelon_form(); if (perm.size() == 0) { // result still is NULL throw Invalid_State("could not bring matrix in row reduced echelon form"); } std::unique_ptr result(new binary_matrix(n-r,r)) ; for (i = 0; i < (*result).m_rown; ++i) { for (j = 0; j < (*result).m_coln; ++j) { if (H.coef(j,perm[i])) { result->toggle_coeff(i,j); } } } for (i = 0; i < code_length; ++i) { Laux[i] = L[perm[i]]; } for (i = 0; i < code_length; ++i) { L[i] = Laux[i]; } return result; } } McEliece_PrivateKey generate_mceliece_key( RandomNumberGenerator & rng, uint32_t ext_deg, uint32_t code_length, uint32_t t) { uint32_t i, j, k, l; std::unique_ptr R; uint32_t codimension = t * ext_deg; if(code_length <= codimension) { throw Invalid_Argument("invalid McEliece parameters"); } std::shared_ptr sp_field ( new GF2m_Field(ext_deg )); //pick the support......... std::vector L(code_length); for(i=0;i sqrtmod = polyn_gf2m::sqrt_mod_init( g); std::vector F = syndrome_init(g, L, code_length); // Each F[i] is the (precomputed) syndrome of the error vector with // a single '1' in i-th position. // We do not store the F[i] as polynomials of degree t , but // as binary vectors of length ext_deg * t (this will // speed up the syndrome computation) // // std::vector H(bit_size_to_32bit_size(codimension) * code_length ); uint32_t* sk = H.data(); for (i = 0; i < code_length; ++i) { for (l = 0; l < t; ++l) { k = (l * ext_deg) / 32; j = (l * ext_deg) % 32; sk[k] ^= static_cast(F[i].get_coef(l)) << j; if (j + ext_deg > 32) { sk[k + 1] ^= F[i].get_coef( l) >> (32 - j); } } sk += bit_size_to_32bit_size(codimension); } // We need the support L for decoding (decryption). In fact the // inverse is needed std::vector Linv(code_length) ; for (i = 0; i < code_length; ++i) { Linv[L[i]] = i; } std::vector pubmat (R->m_elem.size() * 4); for(i = 0; i < R->m_elem.size(); i++) { store_le(R->m_elem[i], &pubmat[i*4]); } return McEliece_PrivateKey(g, H, sqrtmod, Linv, pubmat); } } botan-2.4.0/src/lib/pubkey/mce/code_based_util.h000066400000000000000000000022071322470703100214760ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #ifndef BOTAN_CODE_BASED_UTIL_H_ #define BOTAN_CODE_BASED_UTIL_H_ #include namespace Botan { /** * Expand an input to a bit mask depending on it being being zero or non-zero * @param tst the input * @return the mask 0xFFFF if tst is non-zero and 0 otherwise */ template uint16_t expand_mask_16bit(T tst) { const uint16_t result = (tst != 0); return ~(result - 1); } inline gf2m gray_to_lex(gf2m gray) { gf2m result = gray ^ (gray >> 8); result ^= (result >> 4); result ^= (result >> 2); result ^= (result >> 1); return result; } inline gf2m lex_to_gray(gf2m lex) { return (lex >> 1) ^ lex; } inline uint32_t bit_size_to_byte_size(uint32_t bit_size) { return (bit_size - 1) / 8 + 1; } inline uint32_t bit_size_to_32bit_size(uint32_t bit_size) { return (bit_size - 1) / 32 + 1; } } #endif botan-2.4.0/src/lib/pubkey/mce/gf2m_rootfind_dcmp.cpp000066400000000000000000000211251322470703100224660ustar00rootroot00000000000000/* * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include #include #include namespace Botan { namespace { uint32_t patch_root_array(gf2m* res_root_arr, uint32_t res_root_arr_len, uint32_t root_pos) { volatile uint32_t i; volatile gf2m patch_elem = 0x01; volatile gf2m cond_mask = (root_pos == res_root_arr_len); cond_mask = expand_mask_16bit(cond_mask); cond_mask = ~cond_mask; /* now cond = 1 if not enough roots */ patch_elem &= cond_mask; for(i = 0; i < res_root_arr_len; i++) { gf2m masked_patch_elem = (patch_elem++) & cond_mask; res_root_arr[i] ^= masked_patch_elem++; } return res_root_arr_len; } class gf2m_decomp_rootfind_state { public: gf2m_decomp_rootfind_state(const polyn_gf2m & p_polyn, uint32_t code_length); void calc_LiK(const polyn_gf2m & sigma); gf2m calc_Fxj_j_neq_0( const polyn_gf2m & sigma, gf2m j_gray); void calc_next_Aij(); void calc_Ai_zero(const polyn_gf2m & sigma); secure_vector find_roots(const polyn_gf2m & sigma); uint32_t get_code_length() const { return code_length; } uint32_t code_length; secure_vector m_Lik; // size is outer_summands * m secure_vector m_Aij; // ... uint32_t m_outer_summands; gf2m m_j; gf2m m_j_gray; gf2m m_sigma_3_l; gf2m m_sigma_3_neq_0_mask; }; /* * !! Attention: assumes gf2m is 16bit !! */ #if 0 gf2m brootf_decomp_gray_to_lex(gf2m gray) { static_assert(sizeof(gf2m) == 2, "Expected size"); gf2m result = gray ^ (gray>>8); result ^= (result >> 4); result ^= (result >> 2); result ^= (result >> 1); return result; } #endif /** * calculates ceil((t-4)/5) = outer_summands - 1 */ uint32_t brootf_decomp_calc_sum_limit(uint32_t t) { uint32_t result; if(t < 4) { return 0; } result = t - 4; result += 4; result /= 5; return result; } gf2m_decomp_rootfind_state::gf2m_decomp_rootfind_state(const polyn_gf2m & polyn, uint32_t the_code_length) : code_length(the_code_length), m_j(0), m_j_gray(0) { gf2m coeff_3; gf2m coeff_head; std::shared_ptr sp_field = polyn.get_sp_field(); int deg_sigma = polyn.get_degree(); if(deg_sigma <= 3) { throw Internal_Error("Unexpected degree in gf2m_decomp_rootfind_state"); } coeff_3 = polyn.get_coef( 3); coeff_head = polyn.get_coef( deg_sigma); /* dummy value for SCA CM */ if(coeff_3 != 0) { this->m_sigma_3_l = sp_field->gf_l_from_n(coeff_3); this->m_sigma_3_neq_0_mask = 0xFFFF; } else { // dummy value needed for timing countermeasure this->m_sigma_3_l = sp_field->gf_l_from_n(coeff_head); this->m_sigma_3_neq_0_mask = 0 ; } this->m_outer_summands = 1 + brootf_decomp_calc_sum_limit(deg_sigma); this->m_Lik.resize(this->m_outer_summands * sp_field->get_extension_degree()); this->m_Aij.resize(this->m_outer_summands); } void gf2m_decomp_rootfind_state::calc_Ai_zero(const polyn_gf2m & sigma) { uint32_t i; /* * this function assumes this the first gray code element is zero */ for(i = 0; i < this->m_outer_summands; i++) { this->m_Aij[i] = sigma.get_coef(5*i); } this->m_j = 0; this->m_j_gray = 0; } void gf2m_decomp_rootfind_state::calc_next_Aij() { /* * upon function entry, we have in the state j, Aij. * first thing, we declare Aij Aij_minusone and increase j. * Case j=0 upon function entry also included, then Aij contains A_{i,j=0}. */ uint32_t i; gf2m diff, new_j_gray; uint32_t Lik_pos_base; this->m_j++; new_j_gray = lex_to_gray(this->m_j); if(this->m_j & 1) /* half of the times */ { Lik_pos_base = 0; } else if(this->m_j & 2) /* one quarter of the times */ { Lik_pos_base = this->m_outer_summands; } else if( this->m_j & 4) /* one eighth of the times */ { Lik_pos_base = this->m_outer_summands * 2; } else if( this->m_j & 8) /* one sixteenth of the times */ { Lik_pos_base = this->m_outer_summands * 3; } else if( this->m_j & 16) /* ... */ { Lik_pos_base = this->m_outer_summands * 4; } else { gf2m delta_offs = 5; diff = this->m_j_gray ^ new_j_gray; while(((static_cast(1) << delta_offs) & diff) == 0) { delta_offs++; } Lik_pos_base = delta_offs * this->m_outer_summands; } this->m_j_gray = new_j_gray; i = 0; for(; i < this->m_outer_summands; i++) { this->m_Aij[i] ^= this->m_Lik[Lik_pos_base + i]; } } void gf2m_decomp_rootfind_state::calc_LiK(const polyn_gf2m & sigma) { std::shared_ptr sp_field = sigma.get_sp_field(); uint32_t i, k, d; d = sigma.get_degree(); for(k = 0; k < sp_field->get_extension_degree(); k++) { uint32_t Lik_pos_base = k * this->m_outer_summands; gf2m alpha_l_k_tt2_ttj[4]; alpha_l_k_tt2_ttj[0] = sp_field->gf_l_from_n(static_cast(1) << k); alpha_l_k_tt2_ttj[1] = sp_field->gf_mul_rrr(alpha_l_k_tt2_ttj[0], alpha_l_k_tt2_ttj[0]); alpha_l_k_tt2_ttj[2] = sp_field->gf_mul_rrr(alpha_l_k_tt2_ttj[1],alpha_l_k_tt2_ttj[1] ); alpha_l_k_tt2_ttj[3] = sp_field->gf_mul_rrr(alpha_l_k_tt2_ttj[2], alpha_l_k_tt2_ttj[2]); for(i = 0; i < this->m_outer_summands; i++) { uint32_t j; uint32_t five_i = 5*i; uint32_t Lik_pos = Lik_pos_base + i; this->m_Lik[Lik_pos] = 0; for(j = 0; j <= 3; j++) { gf2m f, x; uint32_t f_ind = five_i + (static_cast(1) << j); if(f_ind > d) { break; } f = sigma.get_coef( f_ind); x = sp_field->gf_mul_zrz(alpha_l_k_tt2_ttj[j], f); this->m_Lik[Lik_pos] ^= x; } } } } gf2m gf2m_decomp_rootfind_state::calc_Fxj_j_neq_0( const polyn_gf2m & sigma, gf2m j_gray) { //needs the A_{ij} to compute F(x)_j gf2m sum = 0; uint32_t i; std::shared_ptr sp_field = sigma.get_sp_field(); const gf2m jl_gray = sp_field->gf_l_from_n(j_gray); gf2m xl_j_tt_5 = sp_field->gf_square_rr(jl_gray); gf2m xl_gray_tt_3 = sp_field->gf_mul_rrr(xl_j_tt_5, jl_gray); xl_j_tt_5 = sp_field->gf_mul_rrr(xl_j_tt_5, xl_gray_tt_3); sum = sp_field->gf_mul_nrr(xl_gray_tt_3, this->m_sigma_3_l); sum &= this->m_sigma_3_neq_0_mask; /* here, we rely on compiler to be unable to optimize * for the state->sigma_3_neq_0_mask value */ /* treat i = 0 special: */ sum ^= this->m_Aij[0]; /* treat i = 1 special also */ if(this->m_outer_summands > 1) { gf2m x; x = sp_field->gf_mul_zrz(xl_j_tt_5, this->m_Aij[1]); /* x_j^{5i} A_i^j */ sum ^= x; } gf2m xl_j_tt_5i = xl_j_tt_5; for(i = 2; i < this->m_outer_summands; i++) { gf2m x; xl_j_tt_5i = sp_field->gf_mul_rrr(xl_j_tt_5i, xl_j_tt_5); // now x_j_tt_5i lives up to its name x = sp_field->gf_mul_zrz(xl_j_tt_5i, this->m_Aij[i]); /* x_j^{5i} A_i^(j) */ sum ^= x; } return sum; } secure_vector gf2m_decomp_rootfind_state::find_roots(const polyn_gf2m & sigma) { const int sigma_degree = sigma.get_degree(); BOTAN_ASSERT(sigma_degree > 0, "Valid sigma"); secure_vector result(sigma_degree); uint32_t root_pos = 0; this->calc_Ai_zero(sigma); this->calc_LiK(sigma); do { gf2m eval_result; if(this->m_j_gray == 0) { eval_result = sigma.get_coef( 0); } else { eval_result = this->calc_Fxj_j_neq_0(sigma, this->m_j_gray); } if(eval_result == 0) { result[root_pos] = this->m_j_gray; root_pos++; } if(this->m_j + static_cast(1) == this->get_code_length()) { break; } this->calc_next_Aij(); }while(1); // side channel / fault attack countermeasure: root_pos = patch_root_array(result.data(), result.size(), root_pos); result.resize(root_pos); return result; } } // end anonymous namespace secure_vector find_roots_gf2m_decomp(const polyn_gf2m & polyn, uint32_t code_length) { gf2m_decomp_rootfind_state state(polyn, code_length); return state.find_roots(polyn); } } // end namespace Botan botan-2.4.0/src/lib/pubkey/mce/gf2m_small_m.cpp000066400000000000000000000073751322470703100212760ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { #define MAX_EXT_DEG 16 namespace { unsigned int prim_poly[MAX_EXT_DEG + 1] = { 01, /* extension degree 0 (!) never used */ 03, /* extension degree 1 (!) never used */ 07, /* extension degree 2 */ 013, /* extension degree 3 */ 023, /* extension degree 4 */ 045, /* extension degree 5 */ 0103, /* extension degree 6 */ 0203, /* extension degree 7 */ 0435, /* extension degree 8 */ 01041, /* extension degree 9 */ 02011, /* extension degree 10 */ 04005, /* extension degree 11 */ 010123, /* extension degree 12 */ 020033, /* extension degree 13 */ 042103, /* extension degree 14 */ 0100003, /* extension degree 15 */ 0210013 /* extension degree 16 */ }; std::vector gf_exp_table(size_t deg, gf2m prime_poly) { // construct the table gf_exp[i]=alpha^i std::vector tab((1 << deg) + 1); tab[0] = 1; for(size_t i = 1; i < tab.size(); ++i) { const bool overflow = tab[i - 1] >> (deg - 1); tab[i] = (tab[i-1] << 1) ^ (overflow ? prime_poly : 0); } return tab; } const std::vector& exp_table(size_t deg) { static std::vector tabs[MAX_EXT_DEG + 1]; if(deg < 2 || deg > MAX_EXT_DEG) throw Exception("GF2m_Field does not support degree " + std::to_string(deg)); if(tabs[deg].empty()) tabs[deg] = gf_exp_table(deg, prim_poly[deg]); return tabs[deg]; } std::vector gf_log_table(size_t deg, const std::vector& exp) { std::vector tab(1 << deg); tab[0] = (1 << deg) - 1; // log of 0 is the order by convention for (size_t i = 0; i < tab.size(); ++i) { tab[exp[i]] = i; } return tab; } const std::vector& log_table(size_t deg) { static std::vector tabs[MAX_EXT_DEG + 1]; if(deg < 2 || deg > MAX_EXT_DEG) throw Exception("GF2m_Field does not support degree " + std::to_string(deg)); if(tabs[deg].empty()) tabs[deg] = gf_log_table(deg, exp_table(deg)); return tabs[deg]; } } uint32_t encode_gf2m(gf2m to_enc, uint8_t* mem) { mem[0] = to_enc >> 8; mem[1] = to_enc & 0xFF; return sizeof(to_enc); } gf2m decode_gf2m(const uint8_t* mem) { gf2m result; result = mem[0] << 8; result |= mem[1]; return result; } GF2m_Field::GF2m_Field(size_t extdeg) : m_gf_extension_degree(extdeg), m_gf_multiplicative_order((1 << extdeg) - 1), m_gf_log_table(log_table(m_gf_extension_degree)), m_gf_exp_table(exp_table(m_gf_extension_degree)) { } gf2m GF2m_Field::gf_div(gf2m x, gf2m y) const { const int32_t sub_res = static_cast(gf_log(x) - static_cast(gf_log(y))); const int32_t modq_res = static_cast(_gf_modq_1(sub_res)); const int32_t div_res = static_cast(x) ? static_cast(gf_exp(modq_res)) : 0; return static_cast(div_res); } // we suppose i >= 0. Par convention 0^0 = 1 gf2m GF2m_Field::gf_pow(gf2m x, int i) const { if (i == 0) return 1; else if (x == 0) return 0; else { // i mod (q-1) while (i >> get_extension_degree()) i = (i & (gf_ord())) + (i >> get_extension_degree()); i *= gf_log(x); while (i >> get_extension_degree()) i = (i & (gf_ord())) + (i >> get_extension_degree()); return gf_exp(i); } } } botan-2.4.0/src/lib/pubkey/mce/gf2m_small_m.h000066400000000000000000000113031322470703100207250ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #ifndef BOTAN_GF2M_SMALL_M_H_ #define BOTAN_GF2M_SMALL_M_H_ #include #include namespace Botan { typedef uint16_t gf2m; /** * GF(2^m) field for m = [2...16] */ class BOTAN_PUBLIC_API(2,0) GF2m_Field { public: explicit GF2m_Field(size_t extdeg); gf2m gf_mul(gf2m x, gf2m y) const { return ((x) ? gf_mul_fast(x, y) : 0); } gf2m gf_square(gf2m x) const { return ((x) ? gf_exp(_gf_modq_1(gf_log(x) << 1)) : 0); } gf2m square_rr(gf2m x) const { return _gf_modq_1(x << 1); } gf2m gf_mul_fast(gf2m x, gf2m y) const { return ((y) ? gf_exp(_gf_modq_1(gf_log(x) + gf_log(y))) : 0); } /* naming convention of GF(2^m) field operations: l logarithmic, unreduced r logarithmic, reduced n normal, non-zero z normal, might be zero */ gf2m gf_mul_lll(gf2m a, gf2m b) const { return (a + b); } gf2m gf_mul_rrr(gf2m a, gf2m b) const { return (_gf_modq_1(gf_mul_lll(a, b))); } gf2m gf_mul_nrr(gf2m a, gf2m b) const { return (gf_exp(gf_mul_rrr(a, b))); } gf2m gf_mul_rrn(gf2m a, gf2m y) const { return _gf_modq_1(gf_mul_lll(a, gf_log(y))); } gf2m gf_mul_rnr(gf2m y, gf2m a) const { return gf_mul_rrn(a, y); } gf2m gf_mul_lnn(gf2m x, gf2m y) const { return (gf_log(x) + gf_log(y)); } gf2m gf_mul_rnn(gf2m x, gf2m y) const { return _gf_modq_1(gf_mul_lnn(x, y)); } gf2m gf_mul_nrn(gf2m a, gf2m y) const { return gf_exp(_gf_modq_1((a) + gf_log(y))); } /** * zero operand allowed */ gf2m gf_mul_zrz(gf2m a, gf2m y) const { return ( (y == 0) ? 0 : gf_mul_nrn(a, y) ); } gf2m gf_mul_zzr(gf2m a, gf2m y) const { return gf_mul_zrz(y, a); } /** * non-zero operand */ gf2m gf_mul_nnr(gf2m y, gf2m a) const { return gf_mul_nrn(a, y); } gf2m gf_sqrt(gf2m x) const { return ((x) ? gf_exp(_gf_modq_1(gf_log(x) << (get_extension_degree()-1))) : 0); } gf2m gf_div_rnn(gf2m x, gf2m y) const { return _gf_modq_1(gf_log(x) - gf_log(y)); } gf2m gf_div_rnr(gf2m x, gf2m b) const { return _gf_modq_1(gf_log(x) - b); } gf2m gf_div_nrr(gf2m a, gf2m b) const { return gf_exp(_gf_modq_1(a - b)); } gf2m gf_div_zzr(gf2m x, gf2m b) const { return ((x) ? gf_exp(_gf_modq_1(gf_log(x) - b)) : 0); } gf2m gf_inv(gf2m x) const { return gf_exp(gf_ord() - gf_log(x)); } gf2m gf_inv_rn(gf2m x) const { return (gf_ord() - gf_log(x)); } gf2m gf_square_ln(gf2m x) const { return gf_log(x) << 1; } gf2m gf_square_rr(gf2m a) const { return a << 1; } gf2m gf_l_from_n(gf2m x) const { return gf_log(x); } gf2m gf_div(gf2m x, gf2m y) const; gf2m gf_pow(gf2m x, int i) const; gf2m gf_exp(gf2m i) const { return m_gf_exp_table.at(i); /* alpha^i */ } gf2m gf_log(gf2m i) const { return m_gf_log_table.at(i); /* return i when x=alpha^i */ } gf2m gf_ord() const { return m_gf_multiplicative_order; } gf2m get_extension_degree() const { return m_gf_extension_degree; } gf2m get_cardinality() const { return static_cast(1 << get_extension_degree()); } private: gf2m _gf_modq_1(int32_t d) const { /* residual modulo q-1 when -q < d < 0, we get (q-1+d) when 0 <= d < q, we get (d) when q <= d < 2q-1, we get (d-q+1) */ return static_cast(((d) & gf_ord()) + ((d) >> get_extension_degree())); } gf2m m_gf_extension_degree, m_gf_multiplicative_order; const std::vector& m_gf_log_table; const std::vector& m_gf_exp_table; }; uint32_t encode_gf2m(gf2m to_enc, uint8_t* mem); gf2m decode_gf2m(const uint8_t* mem); } #endif botan-2.4.0/src/lib/pubkey/mce/goppa_code.cpp000066400000000000000000000151511322470703100210260ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include namespace Botan { namespace { void matrix_arr_mul(std::vector matrix, uint32_t numo_rows, uint32_t words_per_row, const uint8_t* input_vec, uint32_t* output_vec, uint32_t output_vec_len) { for(size_t j = 0; j < numo_rows; j++) { if((input_vec[j / 8] >> (j % 8)) & 1) { for(size_t i = 0; i < output_vec_len; i ++) { output_vec[i] ^= matrix[ j * (words_per_row) + i]; } } } } /** * returns the error vector to the syndrome */ secure_vector goppa_decode(const polyn_gf2m & syndrom_polyn, const polyn_gf2m & g, const std::vector & sqrtmod, const std::vector & Linv) { gf2m a; uint32_t code_length = Linv.size(); uint32_t t = g.get_degree(); std::shared_ptr sp_field = g.get_sp_field(); std::pair h_aux = polyn_gf2m::eea_with_coefficients( syndrom_polyn, g, 1); polyn_gf2m & h = h_aux.first; polyn_gf2m & aux = h_aux.second; a = sp_field->gf_inv(aux.get_coef(0)); gf2m log_a = sp_field->gf_log(a); for(int i = 0; i <= h.get_degree(); ++i) { h.set_coef(i,sp_field->gf_mul_zrz(log_a,h.get_coef(i))); } // compute h(z) += z h.add_to_coef( 1, 1); // compute S square root of h (using sqrtmod) polyn_gf2m S(t - 1, g.get_sp_field()); for(uint32_t i=0;igf_sqrt(h.get_coef(i)); if(i & 1) { for(uint32_t j=0;jgf_mul(a, sqrtmod[i/2].get_coef(j))); } } else { S.add_to_coef( i/2, a); } } /* end for loop (i) */ S.get_degree(); std::pair v_u = polyn_gf2m::eea_with_coefficients(S, g, t/2+1); polyn_gf2m & u = v_u.second; polyn_gf2m & v = v_u.first; // sigma = u^2+z*v^2 polyn_gf2m sigma ( t , g.get_sp_field()); const size_t u_deg = u.get_degree(); for(size_t i = 0; i <= u_deg; ++i) { sigma.set_coef(2*i, sp_field->gf_square(u.get_coef(i))); } const int v_deg = v.get_degree(); BOTAN_ASSERT(v_deg > 0, "Valid degree"); for(int i = 0; i <= v_deg; ++i) { sigma.set_coef(2*i+1, sp_field->gf_square(v.get_coef(i))); } secure_vector res = find_roots_gf2m_decomp(sigma, code_length); size_t d = res.size(); secure_vector result(d); for(uint32_t i = 0; i < d; ++i) { gf2m current = res[i]; gf2m tmp; tmp = gray_to_lex(current); if(tmp >= code_length) /* invalid root */ { result[i] = i; } result[i] = Linv[tmp]; } return result; } } void mceliece_decrypt(secure_vector& plaintext_out, secure_vector& error_mask_out, const secure_vector& ciphertext, const McEliece_PrivateKey& key) { mceliece_decrypt(plaintext_out, error_mask_out, ciphertext.data(), ciphertext.size(), key); } void mceliece_decrypt( secure_vector& plaintext, secure_vector & error_mask, const uint8_t ciphertext[], size_t ciphertext_len, const McEliece_PrivateKey & key) { secure_vector error_pos; plaintext = mceliece_decrypt(error_pos, ciphertext, ciphertext_len, key); const size_t code_length = key.get_code_length(); secure_vector result((code_length+7)/8); for(auto&& pos : error_pos) { if(pos > code_length) { throw Invalid_Argument("error position larger than code size"); } result[pos / 8] |= (1 << (pos % 8)); } error_mask = result; } /** * @p p_err_pos_len must point to the available length of @p error_pos on input, the * function will set it to the actual number of errors returned in the @p error_pos * array */ secure_vector mceliece_decrypt( secure_vector & error_pos, const uint8_t *ciphertext, uint32_t ciphertext_len, const McEliece_PrivateKey & key) { uint32_t dimension = key.get_dimension(); uint32_t codimension = key.get_codimension(); uint32_t t = key.get_goppa_polyn().get_degree(); polyn_gf2m syndrome_polyn(key.get_goppa_polyn().get_sp_field()); // init as zero polyn const unsigned unused_pt_bits = dimension % 8; const uint8_t unused_pt_bits_mask = (1 << unused_pt_bits) - 1; if(ciphertext_len != (key.get_code_length()+7)/8) { throw Invalid_Argument("wrong size of McEliece ciphertext"); } uint32_t cleartext_len = (key.get_message_word_bit_length()+7)/8; if(cleartext_len != bit_size_to_byte_size(dimension)) { throw Invalid_Argument("mce-decryption: wrong length of cleartext buffer"); } secure_vector syndrome_vec(bit_size_to_32bit_size(codimension)); matrix_arr_mul(key.get_H_coeffs(), key.get_code_length(), bit_size_to_32bit_size(codimension), ciphertext, syndrome_vec.data(), syndrome_vec.size()); secure_vector syndrome_byte_vec(bit_size_to_byte_size(codimension)); uint32_t syndrome_byte_vec_size = syndrome_byte_vec.size(); for(uint32_t i = 0; i < syndrome_byte_vec_size; i++) { syndrome_byte_vec[i] = syndrome_vec[i/4] >> (8* (i % 4)); } syndrome_polyn = polyn_gf2m(t-1, syndrome_byte_vec.data(), bit_size_to_byte_size(codimension), key.get_goppa_polyn().get_sp_field()); syndrome_polyn.get_degree(); error_pos = goppa_decode(syndrome_polyn, key.get_goppa_polyn(), key.get_sqrtmod(), key.get_Linv()); uint32_t nb_err = error_pos.size(); secure_vector cleartext(cleartext_len); copy_mem(cleartext.data(), ciphertext, cleartext_len); for(uint32_t i = 0; i < nb_err; i++) { gf2m current = error_pos[i]; if(current >= cleartext_len * 8) { // an invalid position, this shouldn't happen continue; } cleartext[current / 8] ^= (1 << (current % 8)); } if(unused_pt_bits) { cleartext[cleartext_len - 1] &= unused_pt_bits_mask; } return cleartext; } } botan-2.4.0/src/lib/pubkey/mce/info.txt000066400000000000000000000003321322470703100177110ustar00rootroot00000000000000 MCELIECE -> 20150922 mceliece.h polyn_gf2m.h gf2m_small_m.h code_based_util.h mce_internal.h sha2_64 botan-2.4.0/src/lib/pubkey/mce/mce_internal.h000066400000000000000000000032501322470703100210300ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #ifndef BOTAN_MCELIECE_INTERNAL_H_ #define BOTAN_MCELIECE_INTERNAL_H_ #include #include #include #include namespace Botan { void mceliece_decrypt(secure_vector& plaintext_out, secure_vector& error_mask_out, const uint8_t ciphertext[], size_t ciphertext_len, const McEliece_PrivateKey& key); void mceliece_decrypt(secure_vector& plaintext_out, secure_vector& error_mask_out, const secure_vector& ciphertext, const McEliece_PrivateKey& key); secure_vector mceliece_decrypt( secure_vector & error_pos, const uint8_t *ciphertext, uint32_t ciphertext_len, const McEliece_PrivateKey & key); void mceliece_encrypt(secure_vector& ciphertext_out, secure_vector& error_mask_out, const secure_vector& plaintext, const McEliece_PublicKey& key, RandomNumberGenerator& rng); McEliece_PrivateKey generate_mceliece_key(RandomNumberGenerator &rng, uint32_t ext_deg, uint32_t code_length, uint32_t t); } #endif botan-2.4.0/src/lib/pubkey/mce/mce_workfactor.cpp000066400000000000000000000043541322470703100217360ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include #include namespace Botan { namespace { double binomial(size_t n, size_t k) { double x = 1; for(size_t i = 0; i != k; ++i) { x *= n - i; x /= k -i; } return x; } double log_binomial(size_t n, size_t k) { double x = 0; for(size_t i = 0; i != k; ++i) { x += std::log(n - i); x -= std::log(k - i); } return x / std::log(2); } double nb_iter(size_t n, size_t k, size_t w, size_t p, size_t l) { double x = 2 * log_binomial(k / 2, p); x += log_binomial(n - k - l, w - 2 * p); x = log_binomial(n, w) - x; return x; } double cout_iter(size_t n, size_t k, size_t p, size_t l) { double x = binomial(k / 2, p); const size_t i = static_cast(std::log(x) / std::log(2)); double res = 2 * p * (n - k - l) * std::ldexp(x * x, -static_cast(l)); // x <- binomial(k/2,p)*2*(2*l+log[2](binomial(k/2,p))) x *= 2 * (2 * l + i); // res <- k*(n-k)/2 + // binomial(k/2,p)*2*(2*l+log[2](binomial(k/2,p))) + // 2*p*(n-k-l)*binomial(k/2,p)^2/2^l res += x + k * ((n - k) / 2.0); return std::log(res) / std::log(2); // convert to bits } double cout_total(size_t n, size_t k, size_t w, size_t p, size_t l) { return nb_iter(n, k, w, p, l) + cout_iter(n, k, p, l); } double best_wf(size_t n, size_t k, size_t w, size_t p) { if(p >= k / 2) return -1; double min = cout_total(n, k, w, p, 0); for(size_t l = 1; l < n - k; ++l) { const double lwf = cout_total(n, k, w, p, l); if(lwf < min) min = lwf; else break; } return min; } } size_t mceliece_work_factor(size_t n, size_t t) { const size_t k = n - ceil_log2(n) * t; double min = cout_total(n, k, t, 0, 0); // correspond a p=1 for(size_t p = 0; p != t / 2; ++p) { double lwf = best_wf(n, k + 1, t, p); if(lwf < 0) break; min = std::min(min, lwf); } return static_cast(min); } } botan-2.4.0/src/lib/pubkey/mce/mceliece.cpp000066400000000000000000000076031322470703100204770ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include #include #include namespace Botan { namespace { secure_vector concat_vectors(const secure_vector& a, const secure_vector& b, uint32_t dimension, uint32_t codimension) { secure_vector x(bit_size_to_byte_size(dimension) + bit_size_to_byte_size(codimension)); const size_t final_bits = dimension % 8; if(final_bits == 0) { const size_t dim_bytes = bit_size_to_byte_size(dimension); copy_mem(&x[0], a.data(), dim_bytes); copy_mem(&x[dim_bytes], b.data(), bit_size_to_byte_size(codimension)); } else { copy_mem(&x[0], a.data(), (dimension / 8)); uint32_t l = dimension / 8; x[l] = static_cast(a[l] & ((1 << final_bits) - 1)); for(uint32_t k = 0; k < codimension / 8; ++k) { x[l] ^= static_cast(b[k] << final_bits); ++l; x[l] = static_cast(b[k] >> (8 - final_bits)); } x[l] ^= static_cast(b[codimension/8] << final_bits); } return x; } secure_vector mult_by_pubkey(const secure_vector& cleartext, std::vector const& public_matrix, uint32_t code_length, uint32_t t) { const uint32_t ext_deg = ceil_log2(code_length); const uint32_t codimension = ext_deg * t; const uint32_t dimension = code_length - codimension; secure_vector cR(bit_size_to_32bit_size(codimension) * sizeof(uint32_t)); const uint8_t* pt = public_matrix.data(); for(size_t i = 0; i < dimension / 8; ++i) { for(size_t j = 0; j < 8; ++j) { if(cleartext[i] & (1 << j)) { xor_buf(cR.data(), pt, cR.size()); } pt += cR.size(); } } for(size_t i = 0; i < dimension % 8 ; ++i) { if(cleartext[dimension/8] & (1 << i)) { xor_buf(cR.data(), pt, cR.size()); } pt += cR.size(); } secure_vector ciphertext = concat_vectors(cleartext, cR, dimension, codimension); ciphertext.resize((code_length+7)/8); return ciphertext; } secure_vector create_random_error_vector(unsigned code_length, unsigned error_weight, RandomNumberGenerator& rng) { secure_vector result((code_length+7)/8); size_t bits_set = 0; while(bits_set < error_weight) { gf2m x = random_code_element(code_length, rng); const size_t byte_pos = x / 8, bit_pos = x % 8; const uint8_t mask = (1 << bit_pos); if(result[byte_pos] & mask) continue; // already set this bit result[byte_pos] |= mask; bits_set++; } return result; } } void mceliece_encrypt(secure_vector& ciphertext_out, secure_vector& error_mask_out, const secure_vector& plaintext, const McEliece_PublicKey& key, RandomNumberGenerator& rng) { secure_vector error_mask = create_random_error_vector(key.get_code_length(), key.get_t(), rng); secure_vector ciphertext = mult_by_pubkey(plaintext, key.get_public_matrix(), key.get_code_length(), key.get_t()); ciphertext ^= error_mask; ciphertext_out.swap(ciphertext); error_mask_out.swap(error_mask); } } botan-2.4.0/src/lib/pubkey/mce/mceliece.h000066400000000000000000000113421322470703100201370ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #ifndef BOTAN_MCELIECE_KEY_H_ #define BOTAN_MCELIECE_KEY_H_ #include #include #include namespace Botan { class BOTAN_PUBLIC_API(2,0) McEliece_PublicKey : public virtual Public_Key { public: explicit McEliece_PublicKey(const std::vector& key_bits); McEliece_PublicKey(const std::vector& pub_matrix, uint32_t the_t, uint32_t the_code_length) : m_public_matrix(pub_matrix), m_t(the_t), m_code_length(the_code_length){} McEliece_PublicKey(const McEliece_PublicKey& other) = default; McEliece_PublicKey& operator=(const McEliece_PublicKey& other) = default; virtual ~McEliece_PublicKey()= default; secure_vector random_plaintext_element(RandomNumberGenerator& rng) const; std::string algo_name() const override { return "McEliece"; } AlgorithmIdentifier algorithm_identifier() const override; size_t key_length() const override; size_t estimated_strength() const override; std::vector public_key_bits() const override; bool check_key(RandomNumberGenerator&, bool) const override { return true; } uint32_t get_t() const { return m_t; } uint32_t get_code_length() const { return m_code_length; } uint32_t get_message_word_bit_length() const; const std::vector& get_public_matrix() const { return m_public_matrix; } bool operator==(const McEliece_PublicKey& other) const; bool operator!=(const McEliece_PublicKey& other) const { return !(*this == other); } std::unique_ptr create_kem_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; protected: McEliece_PublicKey() : m_t(0), m_code_length(0) {} std::vector m_public_matrix; uint32_t m_t; uint32_t m_code_length; }; class BOTAN_PUBLIC_API(2,0) McEliece_PrivateKey final : public virtual McEliece_PublicKey, public virtual Private_Key { public: /** Generate a McEliece key pair Suggested parameters for a given security level (SL) SL=80 n=1632 t=33 - 59 KB pubkey 140 KB privkey SL=107 n=2480 t=45 - 128 KB pubkey 300 KB privkey SL=128 n=2960 t=57 - 195 KB pubkey 459 KB privkey SL=147 n=3408 t=67 - 265 KB pubkey 622 KB privkey SL=191 n=4624 t=95 - 516 KB pubkey 1234 KB privkey SL=256 n=6624 t=115 - 942 KB pubkey 2184 KB privkey */ McEliece_PrivateKey(RandomNumberGenerator& rng, size_t code_length, size_t t); explicit McEliece_PrivateKey(const secure_vector& key_bits); McEliece_PrivateKey(polyn_gf2m const& goppa_polyn, std::vector const& parity_check_matrix_coeffs, std::vector const& square_root_matrix, std::vector const& inverse_support, std::vector const& public_matrix ); bool check_key(RandomNumberGenerator& rng, bool strong) const override; polyn_gf2m const& get_goppa_polyn() const { return m_g; } std::vector const& get_H_coeffs() const { return m_coeffs; } std::vector const& get_Linv() const { return m_Linv; } std::vector const& get_sqrtmod() const { return m_sqrtmod; } inline uint32_t get_dimension() const { return m_dimension; } inline uint32_t get_codimension() const { return m_codimension; } secure_vector private_key_bits() const override; bool operator==(const McEliece_PrivateKey & other) const; bool operator!=(const McEliece_PrivateKey& other) const { return !(*this == other); } std::unique_ptr create_kem_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; private: polyn_gf2m m_g; std::vector m_sqrtmod; std::vector m_Linv; std::vector m_coeffs; uint32_t m_codimension; uint32_t m_dimension; }; /** * Estimate work factor for McEliece * @return estimated security level for these key parameters */ BOTAN_PUBLIC_API(2,0) size_t mceliece_work_factor(size_t code_size, size_t t); } #endif botan-2.4.0/src/lib/pubkey/mce/mceliece_key.cpp000066400000000000000000000256461322470703100213560ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include #include #include #include #include #include #include namespace Botan { McEliece_PrivateKey::McEliece_PrivateKey(polyn_gf2m const& goppa_polyn, std::vector const& parity_check_matrix_coeffs, std::vector const& square_root_matrix, std::vector const& inverse_support, std::vector const& public_matrix) : McEliece_PublicKey(public_matrix, goppa_polyn.get_degree(), inverse_support.size()), m_g(goppa_polyn), m_sqrtmod(square_root_matrix), m_Linv(inverse_support), m_coeffs(parity_check_matrix_coeffs), m_codimension(ceil_log2(inverse_support.size()) * goppa_polyn.get_degree()), m_dimension(inverse_support.size() - m_codimension) { } McEliece_PrivateKey::McEliece_PrivateKey(RandomNumberGenerator& rng, size_t code_length, size_t t) { uint32_t ext_deg = ceil_log2(code_length); *this = generate_mceliece_key(rng, ext_deg, code_length, t); } uint32_t McEliece_PublicKey::get_message_word_bit_length() const { uint32_t codimension = ceil_log2(m_code_length) * m_t; return m_code_length - codimension; } secure_vector McEliece_PublicKey::random_plaintext_element(RandomNumberGenerator& rng) const { const size_t bits = get_message_word_bit_length(); secure_vector plaintext((bits+7)/8); rng.randomize(plaintext.data(), plaintext.size()); // unset unused bits in the last plaintext byte if(uint32_t used = bits % 8) { const uint8_t mask = (1 << used) - 1; plaintext[plaintext.size() - 1] &= mask; } return plaintext; } AlgorithmIdentifier McEliece_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), std::vector()); } std::vector McEliece_PublicKey::public_key_bits() const { return DER_Encoder() .start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(static_cast(get_code_length())) .encode(static_cast(get_t())) .end_cons() .encode(m_public_matrix, OCTET_STRING) .end_cons() .get_contents_unlocked(); } size_t McEliece_PublicKey::key_length() const { return m_code_length; } size_t McEliece_PublicKey::estimated_strength() const { return mceliece_work_factor(m_code_length, m_t); } McEliece_PublicKey::McEliece_PublicKey(const std::vector& key_bits) { BER_Decoder dec(key_bits); size_t n; size_t t; dec.start_cons(SEQUENCE) .start_cons(SEQUENCE) .decode(n) .decode(t) .end_cons() .decode(m_public_matrix, OCTET_STRING) .end_cons(); m_t = t; m_code_length = n; } secure_vector McEliece_PrivateKey::private_key_bits() const { DER_Encoder enc; enc.start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(static_cast(get_code_length())) .encode(static_cast(get_t())) .end_cons() .encode(m_public_matrix, OCTET_STRING) .encode(m_g.encode(), OCTET_STRING); // g as octet string enc.start_cons(SEQUENCE); for(uint32_t i = 0; i < m_sqrtmod.size(); i++) { enc.encode(m_sqrtmod[i].encode(), OCTET_STRING); } enc.end_cons(); secure_vector enc_support; for(uint32_t i = 0; i < m_Linv.size(); i++) { enc_support.push_back(m_Linv[i] >> 8); enc_support.push_back(m_Linv[i]); } enc.encode(enc_support, OCTET_STRING); secure_vector enc_H; for(uint32_t i = 0; i < m_coeffs.size(); i++) { enc_H.push_back(m_coeffs[i] >> 24); enc_H.push_back(m_coeffs[i] >> 16); enc_H.push_back(m_coeffs[i] >> 8); enc_H.push_back(m_coeffs[i]); } enc.encode(enc_H, OCTET_STRING); enc.end_cons(); return enc.get_contents(); } bool McEliece_PrivateKey::check_key(RandomNumberGenerator& rng, bool) const { const secure_vector plaintext = this->random_plaintext_element(rng); secure_vector ciphertext; secure_vector errors; mceliece_encrypt(ciphertext, errors, plaintext, *this, rng); secure_vector plaintext_out; secure_vector errors_out; mceliece_decrypt(plaintext_out, errors_out, ciphertext, *this); if(errors != errors_out || plaintext != plaintext_out) return false; return true; } McEliece_PrivateKey::McEliece_PrivateKey(const secure_vector& key_bits) { size_t n, t; secure_vector enc_g; BER_Decoder dec_base(key_bits); BER_Decoder dec = dec_base.start_cons(SEQUENCE) .start_cons(SEQUENCE) .decode(n) .decode(t) .end_cons() .decode(m_public_matrix, OCTET_STRING) .decode(enc_g, OCTET_STRING); if(t == 0 || n == 0) throw Decoding_Error("invalid McEliece parameters"); uint32_t ext_deg = ceil_log2(n); m_code_length = n; m_t = t; m_codimension = (ext_deg * t); m_dimension = (n - m_codimension); std::shared_ptr sp_field(new GF2m_Field(ext_deg)); m_g = polyn_gf2m(enc_g, sp_field); if(m_g.get_degree() != static_cast(t)) { throw Decoding_Error("degree of decoded Goppa polynomial is incorrect"); } BER_Decoder dec2 = dec.start_cons(SEQUENCE); for(uint32_t i = 0; i < t/2; i++) { secure_vector sqrt_enc; dec2.decode(sqrt_enc, OCTET_STRING); while(sqrt_enc.size() < (t*2)) { // ensure that the length is always t sqrt_enc.push_back(0); sqrt_enc.push_back(0); } if(sqrt_enc.size() != t*2) { throw Decoding_Error("length of square root polynomial entry is too large"); } m_sqrtmod.push_back(polyn_gf2m(sqrt_enc, sp_field)); } secure_vector enc_support; BER_Decoder dec3 = dec2.end_cons() .decode(enc_support, OCTET_STRING); if(enc_support.size() % 2) { throw Decoding_Error("encoded support has odd length"); } if(enc_support.size() / 2 != n) { throw Decoding_Error("encoded support has length different from code length"); } for(uint32_t i = 0; i < n*2; i+=2) { gf2m el = (enc_support[i] << 8) | enc_support[i+1]; m_Linv.push_back(el); } secure_vector enc_H; dec3.decode(enc_H, OCTET_STRING) .end_cons(); if(enc_H.size() % 4) { throw Decoding_Error("encoded parity check matrix has length which is not a multiple of four"); } if(enc_H.size()/4 != bit_size_to_32bit_size(m_codimension) * m_code_length ) { throw Decoding_Error("encoded parity check matrix has wrong length"); } for(uint32_t i = 0; i < enc_H.size(); i+=4) { uint32_t coeff = (enc_H[i] << 24) | (enc_H[i+1] << 16) | (enc_H[i+2] << 8) | enc_H[i+3]; m_coeffs.push_back(coeff); } } bool McEliece_PrivateKey::operator==(const McEliece_PrivateKey & other) const { if(*static_cast(this) != *static_cast(&other)) { return false; } if(m_g != other.m_g) { return false; } if( m_sqrtmod != other.m_sqrtmod) { return false; } if( m_Linv != other.m_Linv) { return false; } if( m_coeffs != other.m_coeffs) { return false; } if(m_codimension != other.m_codimension || m_dimension != other.m_dimension) { return false; } return true; } bool McEliece_PublicKey::operator==(const McEliece_PublicKey& other) const { if(m_public_matrix != other.m_public_matrix) { return false; } if(m_t != other.m_t ) { return false; } if( m_code_length != other.m_code_length) { return false; } return true; } namespace { class MCE_KEM_Encryptor final : public PK_Ops::KEM_Encryption_with_KDF { public: MCE_KEM_Encryptor(const McEliece_PublicKey& key, const std::string& kdf) : KEM_Encryption_with_KDF(kdf), m_key(key) {} private: void raw_kem_encrypt(secure_vector& out_encapsulated_key, secure_vector& raw_shared_key, Botan::RandomNumberGenerator& rng) override { secure_vector plaintext = m_key.random_plaintext_element(rng); secure_vector ciphertext, error_mask; mceliece_encrypt(ciphertext, error_mask, plaintext, m_key, rng); raw_shared_key.clear(); raw_shared_key += plaintext; raw_shared_key += error_mask; out_encapsulated_key.swap(ciphertext); } const McEliece_PublicKey& m_key; }; class MCE_KEM_Decryptor final : public PK_Ops::KEM_Decryption_with_KDF { public: MCE_KEM_Decryptor(const McEliece_PrivateKey& key, const std::string& kdf) : KEM_Decryption_with_KDF(kdf), m_key(key) {} private: secure_vector raw_kem_decrypt(const uint8_t encap_key[], size_t len) override { secure_vector plaintext, error_mask; mceliece_decrypt(plaintext, error_mask, encap_key, len, m_key); secure_vector output; output.reserve(plaintext.size() + error_mask.size()); output.insert(output.end(), plaintext.begin(), plaintext.end()); output.insert(output.end(), error_mask.begin(), error_mask.end()); return output; } const McEliece_PrivateKey& m_key; }; } std::unique_ptr McEliece_PublicKey::create_kem_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new MCE_KEM_Encryptor(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr McEliece_PrivateKey::create_kem_decryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new MCE_KEM_Decryptor(*this, params)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/mce/polyn_gf2m.cpp000066400000000000000000000514411322470703100210040ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) * */ #include #include #include #include #include #include namespace Botan { namespace { gf2m generate_gf2m_mask(gf2m a) { gf2m result = (a != 0); return ~(result - 1); } /** * number of leading zeros */ unsigned nlz_16bit(uint16_t x) { unsigned n; if(x == 0) return 16; n = 0; if(x <= 0x00FF) {n = n + 8; x = x << 8;} if(x <= 0x0FFF) {n = n + 4; x = x << 4;} if(x <= 0x3FFF) {n = n + 2; x = x << 2;} if(x <= 0x7FFF) {n = n + 1;} return n; } } int polyn_gf2m::calc_degree_secure() const { int i = this->coeff.size() - 1; int result = 0; uint32_t found_mask = 0; uint32_t tracker_mask = 0xffff; for( ; i >= 0; i--) { found_mask = expand_mask_16bit(this->coeff[i]); result |= i & found_mask & tracker_mask; // tracker mask shall become zero once found mask is set // it shall remain zero from then on tracker_mask = tracker_mask & ~found_mask; } const_cast(this)->m_deg = result; return result; } gf2m random_gf2m(RandomNumberGenerator& rng) { uint8_t b[2]; rng.randomize(b, sizeof(b)); return make_uint16(b[1], b[0]); } gf2m random_code_element(unsigned code_length, RandomNumberGenerator& rng) { if(code_length == 0) { throw Invalid_Argument("random_code_element() was supplied a code length of zero"); } const unsigned nlz = nlz_16bit(code_length-1); const gf2m mask = (1 << (16-nlz)) -1; gf2m result; do { result = random_gf2m(rng); result &= mask; } while(result >= code_length); // rejection sampling return result; } polyn_gf2m::polyn_gf2m(polyn_gf2m const& other) :m_deg(other.m_deg), coeff(other.coeff), msp_field(other.msp_field) { } polyn_gf2m::polyn_gf2m( int d, std::shared_ptr sp_field) :m_deg(-1), coeff(d+1), msp_field(sp_field) { } std::string polyn_gf2m::to_string() const { int d = get_degree(); std::string result; for(int i = 0; i <= d; i ++) { result += std::to_string(this->coeff[i]); if(i != d) { result += ", "; } } return result; } /** * doesn't save coefficients: */ void polyn_gf2m::realloc(uint32_t new_size) { this->coeff = secure_vector(new_size); } polyn_gf2m::polyn_gf2m(const uint8_t* mem, uint32_t mem_len, std::shared_ptr sp_field) :msp_field(sp_field) { if(mem_len % sizeof(gf2m)) { throw Botan::Decoding_Error("illegal length of memory to decode "); } uint32_t size = (mem_len / sizeof(this->coeff[0])) ; this->coeff = secure_vector(size); this->m_deg = -1; for(uint32_t i = 0; i < size; i++) { this->coeff[i] = decode_gf2m(mem); mem += sizeof(this->coeff[0]); } for(uint32_t i = 0; i < size; i++) { if(this->coeff[i] >= (1 << sp_field->get_extension_degree())) { throw Botan::Decoding_Error("error decoding polynomial"); } } this->get_degree(); } polyn_gf2m::polyn_gf2m( std::shared_ptr sp_field ) : m_deg(-1), coeff(1), msp_field(sp_field) {} polyn_gf2m::polyn_gf2m(int degree, const unsigned char* mem, uint32_t mem_byte_len, std::shared_ptr sp_field) :msp_field(sp_field) { uint32_t j, k, l; gf2m a; uint32_t polyn_size; polyn_size = degree + 1; if(polyn_size * sp_field->get_extension_degree() > 8 * mem_byte_len) { throw Botan::Decoding_Error("memory vector for polynomial has wrong size"); } this->coeff = secure_vector(degree+1); gf2m ext_deg = this->msp_field->get_extension_degree(); for (l = 0; l < polyn_size; l++) { k = (l * ext_deg) / 8; j = (l * ext_deg) % 8; a = mem[k] >> j; if (j + ext_deg > 8) { a ^= mem[k + 1] << (8- j); } if(j + ext_deg > 16) { a ^= mem[k + 2] << (16- j); } a &= ((1 << ext_deg) - 1); (*this).set_coef( l, a); } this->get_degree(); } #if 0 void polyn_gf2m::encode(uint32_t min_numo_coeffs, uint8_t* mem, uint32_t mem_len) const { uint32_t i; uint32_t numo_coeffs, needed_size; this->get_degree(); numo_coeffs = (min_numo_coeffs > static_cast(this->m_deg+1)) ? min_numo_coeffs : this->m_deg+1; needed_size = sizeof(this->coeff[0]) * numo_coeffs; if(mem_len < needed_size) { Invalid_Argument("provided memory too small to encode polynomial"); } for(i = 0; i < numo_coeffs; i++) { gf2m to_enc; if(i >= static_cast(this->m_deg+1)) { /* encode a zero */ to_enc = 0; } else { to_enc = this->coeff[i]; } mem += encode_gf2m(to_enc, mem); } } #endif void polyn_gf2m::set_to_zero() { clear_mem(&this->coeff[0], this->coeff.size()); this->m_deg = -1; } int polyn_gf2m::get_degree() const { int d = this->coeff.size() - 1; while ((d >= 0) && (this->coeff[d] == 0)) --d; const_cast(this)->m_deg = d; return d; } static gf2m eval_aux(const gf2m * /*restrict*/ coeff, gf2m a, int d, std::shared_ptr sp_field) { gf2m b; b = coeff[d--]; for (; d >= 0; --d) if (b != 0) { b = sp_field->gf_mul(b, a) ^ coeff[d]; } else { b = coeff[d]; } return b; } gf2m polyn_gf2m::eval(gf2m a) { return eval_aux(&this->coeff[0], a, this->m_deg, this->msp_field); } // p will contain it's remainder modulo g void polyn_gf2m::remainder(polyn_gf2m &p, const polyn_gf2m & g) { int i, j, d; std::shared_ptr msp_field = g.msp_field; d = p.get_degree() - g.get_degree(); if (d >= 0) { gf2m la = msp_field->gf_inv_rn(g.get_lead_coef()); const int p_degree = p.get_degree(); BOTAN_ASSERT(p_degree > 0, "Valid polynomial"); for (i = p_degree; d >= 0; --i, --d) { if (p[i] != 0) { gf2m lb = msp_field->gf_mul_rrn(la, p[i]); for (j = 0; j < g.get_degree(); ++j) { p[j+d] ^= msp_field->gf_mul_zrz(lb, g[j]); } (*&p).set_coef( i, 0); } } p.set_degree( g.get_degree() - 1); while ((p.get_degree() >= 0) && (p[p.get_degree()] == 0)) p.set_degree( p.get_degree() - 1); } } std::vector polyn_gf2m::sqmod_init(const polyn_gf2m & g) { std::vector sq; const int signed_deg = g.get_degree(); if(signed_deg <= 0) throw Invalid_Argument("cannot compute sqmod for such low degree"); const uint32_t d = static_cast(signed_deg); uint32_t t = g.m_deg; // create t zero polynomials uint32_t i; for (i = 0; i < t; ++i) { sq.push_back(polyn_gf2m(t+1, g.get_sp_field())); } for (i = 0; i < d / 2; ++i) { sq[i].set_degree( 2 * i); (*&sq[i]).set_coef( 2 * i, 1); } for (; i < d; ++i) { clear_mem(&sq[i].coeff[0], 2); copy_mem(&sq[i].coeff[0] + 2, &sq[i - 1].coeff[0], d); sq[i].set_degree( sq[i - 1].get_degree() + 2); polyn_gf2m::remainder(sq[i], g); } return sq; } /*Modulo p square of a certain polynomial g, sq[] contains the square Modulo g of the base canonical polynomials of degree < d, where d is the degree of G. The table sq[] will be calculated by polyn_gf2m_sqmod_init*/ polyn_gf2m polyn_gf2m::sqmod( const std::vector & sq, int d) { int i, j; gf2m la; std::shared_ptr sp_field = this->msp_field; polyn_gf2m result(d - 1, sp_field); // terms of low degree for (i = 0; i < d / 2; ++i) { (*&result).set_coef( i * 2, sp_field->gf_square((*this)[i])); } // terms of high degree for (; i < d; ++i) { gf2m lpi = (*this)[i]; if (lpi != 0) { lpi = sp_field->gf_log(lpi); la = sp_field->gf_mul_rrr(lpi, lpi); for (j = 0; j < d; ++j) { result[j] ^= sp_field->gf_mul_zrz(la, sq[i][j]); } } } // Update degre result.set_degree( d - 1); while ((result.get_degree() >= 0) && (result[result.get_degree()] == 0)) result.set_degree( result.get_degree() - 1); return result; } // destructive polyn_gf2m polyn_gf2m::gcd_aux(polyn_gf2m& p1, polyn_gf2m& p2) { if (p2.get_degree() == -1) return p1; else { polyn_gf2m::remainder(p1, p2); return polyn_gf2m::gcd_aux(p2, p1); } } polyn_gf2m polyn_gf2m::gcd(polyn_gf2m const& p1, polyn_gf2m const& p2) { polyn_gf2m a(p1); polyn_gf2m b(p2); if (a.get_degree() < b.get_degree()) { return polyn_gf2m(polyn_gf2m::gcd_aux(b, a)); } else { return polyn_gf2m(polyn_gf2m::gcd_aux(a, b)); } } // Returns the degree of the smallest factor void polyn_gf2m::degppf(const polyn_gf2m & g, int* p_result) { int i, d; polyn_gf2m s(g.get_sp_field()); d = g.get_degree(); std::vector u = polyn_gf2m::sqmod_init(g); polyn_gf2m p( d - 1, g.msp_field); p.set_degree( 1); (*&p).set_coef( 1, 1); (*p_result) = d; for (i = 1; i <= (d / 2) * g.msp_field->get_extension_degree(); ++i) { polyn_gf2m r = p.sqmod(u, d); if ((i % g.msp_field->get_extension_degree()) == 0) { r[1] ^= 1; r.get_degree(); // The degree may change s = polyn_gf2m::gcd( g, r); if (s.get_degree() > 0) { (*p_result) = i / g.msp_field->get_extension_degree(); break; } r[1] ^= 1; r.get_degree(); // The degree may change } // No need for the exchange s s = p; p = r; r = s; } } void polyn_gf2m::patchup_deg_secure( uint32_t trgt_deg, volatile gf2m patch_elem) { uint32_t i; if(this->coeff.size() < trgt_deg) { return; } for(i = 0; i < this->coeff.size(); i++) { uint32_t equal, equal_mask; this->coeff[i] |= patch_elem; equal = (i == trgt_deg); equal_mask = expand_mask_16bit(equal); patch_elem &= ~equal_mask; } this->calc_degree_secure(); } // We suppose m_deg(g) >= m_deg(p) // v is the problem std::pair polyn_gf2m::eea_with_coefficients( const polyn_gf2m & p, const polyn_gf2m & g, int break_deg) { std::shared_ptr msp_field = g.msp_field; int i, j, dr, du, delta; gf2m a; polyn_gf2m aux; // initialisation of the local variables // r0 <- g, r1 <- p, u0 <- 0, u1 <- 1 dr = g.get_degree(); BOTAN_ASSERT(dr > 3, "Valid polynomial"); polyn_gf2m r0(dr, g.msp_field); polyn_gf2m r1(dr - 1, g.msp_field); polyn_gf2m u0(dr - 1, g.msp_field); polyn_gf2m u1(dr - 1, g.msp_field); r0 = g; r1 = p; u0.set_to_zero(); u1.set_to_zero(); (*&u1).set_coef( 0, 1); u1.set_degree( 0); // invariants: // r1 = u1 * p + v1 * g // r0 = u0 * p + v0 * g // and m_deg(u1) = m_deg(g) - m_deg(r0) // It stops when m_deg (r1) = t) // And therefore m_deg (u1) = m_deg (g) - m_deg (r0) = break_deg) { for (j = delta; j >= 0; --j) { a = msp_field->gf_div(r0[dr + j], r1[dr]); if (a != 0) { gf2m la = msp_field->gf_log(a); // u0(z) <- u0(z) + a * u1(z) * z^j for (i = 0; i <= du; ++i) { u0[i + j] ^= msp_field->gf_mul_zrz(la, u1[i]); } // r0(z) <- r0(z) + a * r1(z) * z^j for (i = 0; i <= dr; ++i) { r0[i + j] ^= msp_field->gf_mul_zrz(la, r1[i]); } } } // end loop over j if(break_deg != 1) /* key eq. solving */ { /* [ssms_icisc09] Countermeasure * d_break from paper equals break_deg - 1 * */ volatile gf2m fake_elem = 0x01; volatile gf2m cond1, cond2; int trgt_deg = r1.get_degree() - 1; r0.calc_degree_secure(); u0.calc_degree_secure(); if(!(g.get_degree() % 2)) { /* t even */ cond1 = r0.get_degree() < break_deg - 1; } else { /* t odd */ cond1 = r0.get_degree() < break_deg; cond2 = u0.get_degree() < break_deg - 1; cond1 &= cond2; } /* expand cond1 to a full mask */ gf2m mask = generate_gf2m_mask(cond1); fake_elem &= mask; r0.patchup_deg_secure(trgt_deg, fake_elem); } if(break_deg == 1) /* syndrome inversion */ { volatile gf2m fake_elem = 0x00; volatile uint32_t trgt_deg = 0; r0.calc_degree_secure(); u0.calc_degree_secure(); /** * countermeasure against the low weight attacks for w=4, w=6 and w=8. * Higher values are not covered since for w=8 we already have a * probability for a positive of 1/n^3 from random ciphertexts with the * given weight. For w = 10 it would be 1/n^4 and so on. Thus attacks * based on such high values of w are considered impractical. * * The outer test for the degree of u ( Omega in the paper ) needs not to * be disguised. Each of the three is performed at most once per EEA * (syndrome inversion) execution, the attacker knows this already when * preparing the ciphertext with the given weight. Inside these three * cases however, we must use timing neutral (branch free) operations to * implement the condition detection and the counteractions. * */ if(u0.get_degree() == 4) { uint32_t mask = 0; /** * Condition that the EEA would break now */ int cond_r = r0.get_degree() == 0; /** * Now come the conditions for all odd coefficients of this sigma * candiate. If they are all fulfilled, then we know that we have a low * weight error vector, since the key-equation solving EEA is skipped if * the degree of tau^2 is low (=m_deg(u0)) and all its odd cofficients are * zero (they would cause "full-length" contributions from the square * root computation). */ // Condition for the coefficient to Y to be cancelled out by the // addition of Y before the square root computation: int cond_u1 = msp_field->gf_mul(u0.coeff[1], msp_field->gf_inv(r0.coeff[0])) == 1; // Condition sigma_3 = 0: int cond_u3 = u0.coeff[3] == 0; // combine the conditions: cond_r &= (cond_u1 & cond_u3); // mask generation: mask = expand_mask_16bit(cond_r); trgt_deg = 2 & mask; fake_elem = 1 & mask; } else if(u0.get_degree() == 6) { uint32_t mask = 0; int cond_r= r0.get_degree() == 0; int cond_u1 = msp_field->gf_mul(u0.coeff[1], msp_field->gf_inv(r0.coeff[0])) == 1; int cond_u3 = u0.coeff[3] == 0; int cond_u5 = u0.coeff[5] == 0; cond_r &= (cond_u1 & cond_u3 & cond_u5); mask = expand_mask_16bit(cond_r); trgt_deg = 4 & mask; fake_elem = 1 & mask; } else if(u0.get_degree() == 8) { uint32_t mask = 0; int cond_r= r0.get_degree() == 0; int cond_u1 = msp_field->gf_mul(u0[1], msp_field->gf_inv(r0[0])) == 1; int cond_u3 = u0.coeff[3] == 0; int cond_u5 = u0.coeff[5] == 0; int cond_u7 = u0.coeff[7] == 0; cond_r &= (cond_u1 & cond_u3 & cond_u5 & cond_u7); mask = expand_mask_16bit(cond_r); trgt_deg = 6 & mask; fake_elem = 1 & mask; } r0.patchup_deg_secure(trgt_deg, fake_elem); } // exchange aux = r0; r0 = r1; r1 = aux; aux = u0; u0 = u1; u1 = aux; du = du + delta; delta = 1; while (r1[dr - delta] == 0) { delta++; } dr -= delta; } /* end while loop (dr >= break_deg) */ u1.set_degree( du); r1.set_degree( dr); //return u1 and r1; return std::make_pair(u1,r1); // coefficients u,v } polyn_gf2m::polyn_gf2m(int t, Botan::RandomNumberGenerator& rng, std::shared_ptr sp_field) :m_deg(t), coeff(t+1), msp_field(sp_field) { (*this).set_coef( t, 1); int degree = 0; do { for (int i = 0; i < t; ++i) { (*this).set_coef( i, random_code_element(sp_field->get_cardinality(), rng)); } polyn_gf2m::degppf(*this, °ree); } while (degree < t); } void polyn_gf2m::poly_shiftmod( const polyn_gf2m & g) { if(g.get_degree() <= 1) { throw Invalid_Argument("shiftmod cannot be called on polynomials of degree 1 or less"); } std::shared_ptr field = g.msp_field; int t = g.get_degree(); gf2m a = field->gf_div(this->coeff[t-1], g.coeff[t]); for (int i = t - 1; i > 0; --i) { this->coeff[i] = this->coeff[i - 1] ^ this->msp_field->gf_mul(a, g.coeff[i]); } this->coeff[0] = field->gf_mul(a, g.coeff[0]); } std::vector polyn_gf2m::sqrt_mod_init(const polyn_gf2m & g) { uint32_t i, t; uint32_t nb_polyn_sqrt_mat; std::shared_ptr msp_field = g.msp_field; std::vector result; t = g.get_degree(); nb_polyn_sqrt_mat = t/2; std::vector sq_aux = polyn_gf2m::sqmod_init(g); polyn_gf2m p( t - 1, g.get_sp_field()); p.set_degree( 1); (*&p).set_coef( 1, 1); // q(z) = 0, p(z) = z for (i = 0; i < t * msp_field->get_extension_degree() - 1; ++i) { // q(z) <- p(z)^2 mod g(z) polyn_gf2m q = p.sqmod(sq_aux, t); // q(z) <-> p(z) polyn_gf2m aux = q; q = p; p = aux; } // p(z) = z^(2^(tm-1)) mod g(z) = sqrt(z) mod g(z) for (i = 0; i < nb_polyn_sqrt_mat; ++i) { result.push_back(polyn_gf2m(t - 1, g.get_sp_field())); } result[0] = p; result[0].get_degree(); for(i = 1; i < nb_polyn_sqrt_mat; i++) { result[i] = result[i - 1]; result[i].poly_shiftmod(g), result[i].get_degree(); } return result; } std::vector syndrome_init(polyn_gf2m const& generator, std::vector const& support, int n) { int i,j,t; gf2m a; std::shared_ptr msp_field = generator.msp_field; std::vector result; t = generator.get_degree(); //g(z)=g_t+g_(t-1).z^(t-1)+......+g_1.z+g_0 //f(z)=f_(t-1).z^(t-1)+......+f_1.z+f_0 for(j=0;j=0;i--) { (*&result[j]).set_coef(i, (generator)[i+1] ^ msp_field->gf_mul(lex_to_gray(support[j]),result[j][i+1])); } a = ((generator)[0] ^ msp_field->gf_mul(lex_to_gray(support[j]),result[j][0])); for(i=0;igf_div(result[j][i],a)); } } return result; } polyn_gf2m::polyn_gf2m(const secure_vector& encoded, std::shared_ptr sp_field ) :msp_field(sp_field) { if(encoded.size() % 2) { throw Decoding_Error("encoded polynomial has odd length"); } for(uint32_t i = 0; i < encoded.size(); i += 2) { gf2m el = (encoded[i] << 8) | encoded[i + 1]; coeff.push_back(el); } get_degree(); } secure_vector polyn_gf2m::encode() const { secure_vector result; if(m_deg < 1) { result.push_back(0); result.push_back(0); return result; } uint32_t len = m_deg+1; for(unsigned i = 0; i < len; i++) { // "big endian" encoding of the GF(2^m) elements result.push_back(coeff[i] >> 8); result.push_back(coeff[i]); } return result; } void polyn_gf2m::swap(polyn_gf2m& other) { std::swap(this->m_deg, other.m_deg); std::swap(this->msp_field, other.msp_field); std::swap(this->coeff, other.coeff); } bool polyn_gf2m::operator==(const polyn_gf2m & other) const { if(m_deg != other.m_deg || coeff != other.coeff) { return false; } return true; } } botan-2.4.0/src/lib/pubkey/mce/polyn_gf2m.h000066400000000000000000000112161322470703100204450ustar00rootroot00000000000000/* * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) * */ #ifndef BOTAN_POLYN_GF2M_H_ #define BOTAN_POLYN_GF2M_H_ #include #include #include namespace Botan { class RandomNumberGenerator; class polyn_gf2m { public: /** * create a zero polynomial: */ explicit polyn_gf2m( std::shared_ptr sp_field ); polyn_gf2m() :m_deg(-1) {} polyn_gf2m(const secure_vector& encoded, std::shared_ptr sp_field ); polyn_gf2m& operator=(const polyn_gf2m&) = default; bool operator==(const polyn_gf2m & other) const ; bool operator!=(const polyn_gf2m & other) const { return !(*this == other); } polyn_gf2m(polyn_gf2m&& other) { this->swap(other); } polyn_gf2m & operator=(polyn_gf2m&& other) { if(this != &other) { this->swap(other); } return *this; } void swap(polyn_gf2m& other); secure_vector encode() const; /** * create zero polynomial with reservation of space for a degree d polynomial */ polyn_gf2m(int d, std::shared_ptr sp_field); polyn_gf2m(polyn_gf2m const& other); /** * create zero polynomial with allocated size determined by specified degree d: */ /** * random irreducible polynomial of degree t */ polyn_gf2m(int t, RandomNumberGenerator& rng, std::shared_ptr sp_field); std::shared_ptr get_sp_field() const { return msp_field; } gf2m& operator[](size_t i) { return coeff[i]; } gf2m operator[](size_t i) const { return coeff[i]; } gf2m get_lead_coef() const { return coeff[m_deg]; } gf2m get_coef(uint32_t i) const { return coeff[i]; } inline void set_coef(uint32_t i, gf2m v) { coeff[i] = v; } inline void add_to_coef(uint32_t i, gf2m v) { coeff[i] = coeff[i] ^ v; } std::string to_string() const; /** decode a polynomial from memory: **/ polyn_gf2m(const uint8_t* mem, uint32_t mem_len, std::shared_ptr sp_field); // remove one! ^v! /** * create a polynomial from memory area (encoded) */ polyn_gf2m(int degree, const unsigned char* mem, uint32_t mem_byte_len, std::shared_ptr sp_field); void encode(uint32_t min_numo_coeffs, uint8_t* mem, uint32_t mem_len) const; int get_degree() const; /** * determine the degree in a timing secure manner. the timing of this function * only depends on the number of allocated coefficients, not on the actual * degree */ int calc_degree_secure() const; void degppf(const polyn_gf2m & g, int* p_result); static std::vector sqmod_init(const polyn_gf2m & g); static std::vector sqrt_mod_init(const polyn_gf2m & g); polyn_gf2m sqmod(const std::vector & sq, int d); void set_to_zero(); gf2m eval(gf2m a); static std::pair eea_with_coefficients(const polyn_gf2m & p, const polyn_gf2m & g, int break_deg); void patchup_deg_secure( uint32_t trgt_deg, volatile gf2m patch_elem); private: void set_degree(int d) { m_deg = d; } void poly_shiftmod( const polyn_gf2m & g); void realloc(uint32_t new_size); static polyn_gf2m gcd(polyn_gf2m const& p1, polyn_gf2m const& p2); /** * destructive: */ static void remainder(polyn_gf2m & p, const polyn_gf2m & g); static polyn_gf2m gcd_aux(polyn_gf2m& p1, polyn_gf2m& p2); public: // public member variable: int m_deg; // public member variable: secure_vector coeff; // public member variable: std::shared_ptr msp_field; }; gf2m random_gf2m(RandomNumberGenerator& rng); gf2m random_code_element(unsigned code_length, RandomNumberGenerator& rng); std::vector syndrome_init(polyn_gf2m const& generator, std::vector const& support, int n); /** * Find the roots of a polynomial over GF(2^m) using the method by Federenko * et al. */ secure_vector find_roots_gf2m_decomp(const polyn_gf2m & polyn, uint32_t code_length); } #endif botan-2.4.0/src/lib/pubkey/mceies/000077500000000000000000000000001322470703100167205ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/mceies/info.txt000066400000000000000000000001211322470703100204060ustar00rootroot00000000000000 MCEIES -> 20150706 aes mce ocb kdf1 botan-2.4.0/src/lib/pubkey/mceies/mceies.cpp000066400000000000000000000064341322470703100207000ustar00rootroot00000000000000/* * McEliece Integrated Encryption System * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace { secure_vector aead_key(const secure_vector& mk, const AEAD_Mode& aead) { // Fold the key as required for the AEAD mode in use if(aead.valid_keylength(mk.size())) return mk; secure_vector r(aead.key_spec().maximum_keylength()); for(size_t i = 0; i != mk.size(); ++i) r[i % r.size()] ^= mk[i]; return r; } } secure_vector mceies_encrypt(const McEliece_PublicKey& pubkey, const uint8_t pt[], size_t pt_len, const uint8_t ad[], size_t ad_len, RandomNumberGenerator& rng, const std::string& algo) { PK_KEM_Encryptor kem_op(pubkey, rng, "KDF1(SHA-512)"); secure_vector mce_ciphertext, mce_key; kem_op.encrypt(mce_ciphertext, mce_key, 64, rng); const size_t mce_code_bytes = (pubkey.get_code_length() + 7) / 8; BOTAN_ASSERT(mce_ciphertext.size() == mce_code_bytes, "Unexpected size"); std::unique_ptr aead(get_aead(algo, ENCRYPTION)); if(!aead) throw Exception("mce_encrypt unable to create AEAD instance '" + algo + "'"); const size_t nonce_len = aead->default_nonce_length(); aead->set_key(aead_key(mce_key, *aead)); aead->set_associated_data(ad, ad_len); const secure_vector nonce = rng.random_vec(nonce_len); secure_vector msg(mce_ciphertext.size() + nonce.size() + pt_len); copy_mem(msg.data(), mce_ciphertext.data(), mce_ciphertext.size()); copy_mem(msg.data() + mce_ciphertext.size(), nonce.data(), nonce.size()); copy_mem(msg.data() + mce_ciphertext.size() + nonce.size(), pt, pt_len); aead->start(nonce); aead->finish(msg, mce_ciphertext.size() + nonce.size()); return msg; } secure_vector mceies_decrypt(const McEliece_PrivateKey& privkey, const uint8_t ct[], size_t ct_len, const uint8_t ad[], size_t ad_len, const std::string& algo) { try { Null_RNG null_rng; PK_KEM_Decryptor kem_op(privkey, null_rng, "KDF1(SHA-512)"); const size_t mce_code_bytes = (privkey.get_code_length() + 7) / 8; std::unique_ptr aead(get_aead(algo, DECRYPTION)); if(!aead) throw Exception("Unable to create AEAD instance '" + algo + "'"); const size_t nonce_len = aead->default_nonce_length(); if(ct_len < mce_code_bytes + nonce_len + aead->tag_size()) throw Exception("Input message too small to be valid"); const secure_vector mce_key = kem_op.decrypt(ct, mce_code_bytes, 64); aead->set_key(aead_key(mce_key, *aead)); aead->set_associated_data(ad, ad_len); secure_vector pt(ct + mce_code_bytes + nonce_len, ct + ct_len); aead->start(&ct[mce_code_bytes], nonce_len); aead->finish(pt, 0); return pt; } catch(Integrity_Failure&) { throw; } catch(std::exception& e) { throw Exception("mce_decrypt failed: " + std::string(e.what())); } } } botan-2.4.0/src/lib/pubkey/mceies/mceies.h000066400000000000000000000024121322470703100203350ustar00rootroot00000000000000/* * McEliece Integrated Encryption System * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MCEIES_H_ #define BOTAN_MCEIES_H_ #include #include namespace Botan { class RandomNumberGenerator; class McEliece_PublicKey; class McEliece_PrivateKey; /** * McEliece Integrated Encryption System * Derive a shared key using MCE KEM and encrypt/authenticate the * plaintext and AD using AES-256 in OCB mode. */ secure_vector BOTAN_PUBLIC_API(2,0) mceies_encrypt(const McEliece_PublicKey& pubkey, const uint8_t pt[], size_t pt_len, const uint8_t ad[], size_t ad_len, RandomNumberGenerator& rng, const std::string& aead = "AES-256/OCB"); /** * McEliece Integrated Encryption System * Derive a shared key using MCE KEM and decrypt/authenticate the * ciphertext and AD using AES-256 in OCB mode. */ secure_vector BOTAN_PUBLIC_API(2,0) mceies_decrypt(const McEliece_PrivateKey& privkey, const uint8_t ct[], size_t ct_len, const uint8_t ad[], size_t ad_len, const std::string& aead = "AES-256/OCB"); } #endif botan-2.4.0/src/lib/pubkey/newhope/000077500000000000000000000000001322470703100171205ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/newhope/info.txt000066400000000000000000000001441322470703100206130ustar00rootroot00000000000000 NEWHOPE -> 20161018 sha3 shake_cipher sha2_32 ctr aes botan-2.4.0/src/lib/pubkey/newhope/newhope.cpp000066400000000000000000001127421322470703100213000ustar00rootroot00000000000000/* * NEWHOPE Ring-LWE scheme * Based on the public domain reference implementation by the * designers (https://github.com/tpoeppelmann/newhope) * * Further changes * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { typedef newhope_poly poly; namespace { static const uint16_t PARAM_Q = 12289; static const size_t PARAM_N = 1024; /* Incomplete-reduction routines; for details on allowed input ranges * and produced output ranges, see the description in the paper: * https://cryptojedi.org/papers/#newhope */ inline uint16_t montgomery_reduce(uint32_t a) { const uint32_t qinv = 12287; // -inverse_mod(p,2^18) const uint32_t rlog = 18; const uint32_t rlog_mask = ((1 << rlog) - 1); uint32_t u = (a * qinv); u &= rlog_mask; u *= PARAM_Q; u += a; return (u >> rlog); } inline uint16_t barrett_reduce(uint16_t a) { uint32_t u = (static_cast(a) * 5) >> 16; u *= PARAM_Q; a -= u; return a; } inline void mul_coefficients(uint16_t* poly, const uint16_t* factors) { for(size_t i = 0; i < PARAM_N; i++) { poly[i] = montgomery_reduce(poly[i] * factors[i]); } } /* GS_bo_to_no; omegas need to be in Montgomery domain */ inline void ntt(uint16_t* a, const uint16_t* omega) { for(size_t i = 0; i < 10; i+=2) { // Even level size_t distance = (1<(temp) + 3*PARAM_Q - a[j + distance]))); } } // Odd level distance <<= 1; for(size_t start = 0; start < distance; start++) { size_t jTwiddle = 0; for(size_t j = start; j < PARAM_N-1; j += 2*distance) { uint16_t W = omega[jTwiddle++]; uint16_t temp = a[j]; a[j] = barrett_reduce((temp + a[j + distance])); a[j + distance] = montgomery_reduce((W * (static_cast(temp) + 3*PARAM_Q - a[j + distance]))); } } } } inline void poly_frombytes(poly* r, const uint8_t* a) { for(size_t i = 0; i < PARAM_N/4; i++) { r->coeffs[4*i+0] = a[7*i+0] | ((static_cast(a[7*i+1]) & 0x3f) << 8); r->coeffs[4*i+1] = (a[7*i+1] >> 6) | (static_cast(a[7*i+2]) << 2) | (static_cast (a[7*i+3] & 0x0f) << 10); r->coeffs[4*i+2] = (a[7*i+3] >> 4) | (static_cast(a[7*i+4]) << 4) | (static_cast (a[7*i+5] & 0x03) << 12); r->coeffs[4*i+3] = (a[7*i+5] >> 2) | (static_cast(a[7*i+6]) << 6); } } inline void poly_tobytes(uint8_t* r, const poly* p) { for(size_t i = 0; i < PARAM_N/4; i++) { uint16_t t0 = barrett_reduce(p->coeffs[4*i+0]); //Make sure that coefficients have only 14 bits uint16_t t1 = barrett_reduce(p->coeffs[4*i+1]); uint16_t t2 = barrett_reduce(p->coeffs[4*i+2]); uint16_t t3 = barrett_reduce(p->coeffs[4*i+3]); uint16_t m; int16_t c; m = t0 - PARAM_Q; c = m; c >>= 15; t0 = m ^ ((t0^m)&c); // >= 15; t1 = m ^ ((t1^m)&c); // >= 15; t2 = m ^ ((t2^m)&c); // >= 15; t3 = m ^ ((t3^m)&c); // > 8) | (t1 << 6); r[7*i+2] = (t1 >> 2); r[7*i+3] = (t1 >> 10) | (t2 << 4); r[7*i+4] = (t2 >> 4); r[7*i+5] = (t2 >> 12) | (t3 << 2); r[7*i+6] = (t3 >> 6); } } inline void poly_getnoise(Botan::RandomNumberGenerator& rng, poly* r) { uint8_t buf[4*PARAM_N]; rng.randomize(buf, 4*PARAM_N); for(size_t i = 0; i < PARAM_N; i++) { const uint32_t t = load_le(buf, i); uint32_t d = 0; for(size_t j = 0; j < 8; j++) { d += (t >> j) & 0x01010101; } const uint32_t a = ((d >> 8) & 0xff) + (d & 0xff); const uint32_t b = (d >> 24) + ((d >> 16) & 0xff); r->coeffs[i] = a + PARAM_Q - b; } } inline void poly_pointwise(poly* r, const poly* a, const poly* b) { for(size_t i = 0; i < PARAM_N; i++) { const uint16_t t = montgomery_reduce(3186*b->coeffs[i]); /* t is now in Montgomery domain */ r->coeffs[i] = montgomery_reduce(a->coeffs[i] * t); /* r->coeffs[i] is back in normal domain */ } } inline void poly_add(poly* r, const poly* a, const poly* b) { for(size_t i = 0; i < PARAM_N; i++) { r->coeffs[i] = barrett_reduce(a->coeffs[i] + b->coeffs[i]); } } inline void poly_ntt(poly* r) { static const uint16_t omegas_montgomery[PARAM_N/2] = { 4075, 6974, 7373, 7965, 3262, 5079, 522, 2169, 6364, 1018, 1041, 8775, 2344, 11011, 5574, 1973, 4536, 1050, 6844, 3860, 3818, 6118, 2683, 1190, 4789, 7822, 7540, 6752, 5456, 4449, 3789, 12142, 11973, 382, 3988, 468, 6843, 5339, 6196, 3710, 11316, 1254, 5435, 10930, 3998, 10256, 10367, 3879, 11889, 1728, 6137, 4948, 5862, 6136, 3643, 6874, 8724, 654, 10302, 1702, 7083, 6760, 56, 3199, 9987, 605, 11785, 8076, 5594, 9260, 6403, 4782, 6212, 4624, 9026, 8689, 4080, 11868, 6221, 3602, 975, 8077, 8851, 9445, 5681, 3477, 1105, 142, 241, 12231, 1003, 3532, 5009, 1956, 6008, 11404, 7377, 2049, 10968, 12097, 7591, 5057, 3445, 4780, 2920, 7048, 3127, 8120, 11279, 6821, 11502, 8807, 12138, 2127, 2839, 3957, 431, 1579, 6383, 9784, 5874, 677, 3336, 6234, 2766, 1323, 9115, 12237, 2031, 6956, 6413, 2281, 3969, 3991, 12133, 9522, 4737, 10996, 4774, 5429, 11871, 3772, 453, 5908, 2882, 1805, 2051, 1954, 11713, 3963, 2447, 6142, 8174, 3030, 1843, 2361, 12071, 2908, 3529, 3434, 3202, 7796, 2057, 5369, 11939, 1512, 6906, 10474, 11026, 49, 10806, 5915, 1489, 9789, 5942, 10706, 10431, 7535, 426, 8974, 3757, 10314, 9364, 347, 5868, 9551, 9634, 6554, 10596, 9280, 11566, 174, 2948, 2503, 6507, 10723, 11606, 2459, 64, 3656, 8455, 5257, 5919, 7856, 1747, 9166, 5486, 9235, 6065, 835, 3570, 4240, 11580, 4046, 10970, 9139, 1058, 8210, 11848, 922, 7967, 1958, 10211, 1112, 3728, 4049, 11130, 5990, 1404, 325, 948, 11143, 6190, 295, 11637, 5766, 8212, 8273, 2919, 8527, 6119, 6992, 8333, 1360, 2555, 6167, 1200, 7105, 7991, 3329, 9597, 12121, 5106, 5961, 10695, 10327, 3051, 9923, 4896, 9326, 81, 3091, 1000, 7969, 4611, 726, 1853, 12149, 4255, 11112, 2768, 10654, 1062, 2294, 3553, 4805, 2747, 4846, 8577, 9154, 1170, 2319, 790, 11334, 9275, 9088, 1326, 5086, 9094, 6429, 11077, 10643, 3504, 3542, 8668, 9744, 1479, 1, 8246, 7143, 11567, 10984, 4134, 5736, 4978, 10938, 5777, 8961, 4591, 5728, 6461, 5023, 9650, 7468, 949, 9664, 2975, 11726, 2744, 9283, 10092, 5067, 12171, 2476, 3748, 11336, 6522, 827, 9452, 5374, 12159, 7935, 3296, 3949, 9893, 4452, 10908, 2525, 3584, 8112, 8011, 10616, 4989, 6958, 11809, 9447, 12280, 1022, 11950, 9821, 11745, 5791, 5092, 2089, 9005, 2881, 3289, 2013, 9048, 729, 7901, 1260, 5755, 4632, 11955, 2426, 10593, 1428, 4890, 5911, 3932, 9558, 8830, 3637, 5542, 145, 5179, 8595, 3707, 10530, 355, 3382, 4231, 9741, 1207, 9041, 7012, 1168, 10146, 11224, 4645, 11885, 10911, 10377, 435, 7952, 4096, 493, 9908, 6845, 6039, 2422, 2187, 9723, 8643, 9852, 9302, 6022, 7278, 1002, 4284, 5088, 1607, 7313, 875, 8509, 9430, 1045, 2481, 5012, 7428, 354, 6591, 9377, 11847, 2401, 1067, 7188, 11516, 390, 8511, 8456, 7270, 545, 8585, 9611, 12047, 1537, 4143, 4714, 4885, 1017, 5084, 1632, 3066, 27, 1440, 8526, 9273, 12046, 11618, 9289, 3400, 9890, 3136, 7098, 8758, 11813, 7384, 3985, 11869, 6730, 10745, 10111, 2249, 4048, 2884, 11136, 2126, 1630, 9103, 5407, 2686, 9042, 2969, 8311, 9424, 9919, 8779, 5332, 10626, 1777, 4654, 10863, 7351, 3636, 9585, 5291, 8374, 2166, 4919, 12176, 9140, 12129, 7852, 12286, 4895, 10805, 2780, 5195, 2305, 7247, 9644, 4053, 10600, 3364, 3271, 4057, 4414, 9442, 7917, 2174 }; static const uint16_t psis_bitrev_montgomery[PARAM_N] = { 4075, 6974, 7373, 7965, 3262, 5079, 522, 2169, 6364, 1018, 1041, 8775, 2344, 11011, 5574, 1973, 4536, 1050, 6844, 3860, 3818, 6118, 2683, 1190, 4789, 7822, 7540, 6752, 5456, 4449, 3789, 12142, 11973, 382, 3988, 468, 6843, 5339, 6196, 3710, 11316, 1254, 5435, 10930, 3998, 10256, 10367, 3879, 11889, 1728, 6137, 4948, 5862, 6136, 3643, 6874, 8724, 654, 10302, 1702, 7083, 6760, 56, 3199, 9987, 605, 11785, 8076, 5594, 9260, 6403, 4782, 6212, 4624, 9026, 8689, 4080, 11868, 6221, 3602, 975, 8077, 8851, 9445, 5681, 3477, 1105, 142, 241, 12231, 1003, 3532, 5009, 1956, 6008, 11404, 7377, 2049, 10968, 12097, 7591, 5057, 3445, 4780, 2920, 7048, 3127, 8120, 11279, 6821, 11502, 8807, 12138, 2127, 2839, 3957, 431, 1579, 6383, 9784, 5874, 677, 3336, 6234, 2766, 1323, 9115, 12237, 2031, 6956, 6413, 2281, 3969, 3991, 12133, 9522, 4737, 10996, 4774, 5429, 11871, 3772, 453, 5908, 2882, 1805, 2051, 1954, 11713, 3963, 2447, 6142, 8174, 3030, 1843, 2361, 12071, 2908, 3529, 3434, 3202, 7796, 2057, 5369, 11939, 1512, 6906, 10474, 11026, 49, 10806, 5915, 1489, 9789, 5942, 10706, 10431, 7535, 426, 8974, 3757, 10314, 9364, 347, 5868, 9551, 9634, 6554, 10596, 9280, 11566, 174, 2948, 2503, 6507, 10723, 11606, 2459, 64, 3656, 8455, 5257, 5919, 7856, 1747, 9166, 5486, 9235, 6065, 835, 3570, 4240, 11580, 4046, 10970, 9139, 1058, 8210, 11848, 922, 7967, 1958, 10211, 1112, 3728, 4049, 11130, 5990, 1404, 325, 948, 11143, 6190, 295, 11637, 5766, 8212, 8273, 2919, 8527, 6119, 6992, 8333, 1360, 2555, 6167, 1200, 7105, 7991, 3329, 9597, 12121, 5106, 5961, 10695, 10327, 3051, 9923, 4896, 9326, 81, 3091, 1000, 7969, 4611, 726, 1853, 12149, 4255, 11112, 2768, 10654, 1062, 2294, 3553, 4805, 2747, 4846, 8577, 9154, 1170, 2319, 790, 11334, 9275, 9088, 1326, 5086, 9094, 6429, 11077, 10643, 3504, 3542, 8668, 9744, 1479, 1, 8246, 7143, 11567, 10984, 4134, 5736, 4978, 10938, 5777, 8961, 4591, 5728, 6461, 5023, 9650, 7468, 949, 9664, 2975, 11726, 2744, 9283, 10092, 5067, 12171, 2476, 3748, 11336, 6522, 827, 9452, 5374, 12159, 7935, 3296, 3949, 9893, 4452, 10908, 2525, 3584, 8112, 8011, 10616, 4989, 6958, 11809, 9447, 12280, 1022, 11950, 9821, 11745, 5791, 5092, 2089, 9005, 2881, 3289, 2013, 9048, 729, 7901, 1260, 5755, 4632, 11955, 2426, 10593, 1428, 4890, 5911, 3932, 9558, 8830, 3637, 5542, 145, 5179, 8595, 3707, 10530, 355, 3382, 4231, 9741, 1207, 9041, 7012, 1168, 10146, 11224, 4645, 11885, 10911, 10377, 435, 7952, 4096, 493, 9908, 6845, 6039, 2422, 2187, 9723, 8643, 9852, 9302, 6022, 7278, 1002, 4284, 5088, 1607, 7313, 875, 8509, 9430, 1045, 2481, 5012, 7428, 354, 6591, 9377, 11847, 2401, 1067, 7188, 11516, 390, 8511, 8456, 7270, 545, 8585, 9611, 12047, 1537, 4143, 4714, 4885, 1017, 5084, 1632, 3066, 27, 1440, 8526, 9273, 12046, 11618, 9289, 3400, 9890, 3136, 7098, 8758, 11813, 7384, 3985, 11869, 6730, 10745, 10111, 2249, 4048, 2884, 11136, 2126, 1630, 9103, 5407, 2686, 9042, 2969, 8311, 9424, 9919, 8779, 5332, 10626, 1777, 4654, 10863, 7351, 3636, 9585, 5291, 8374, 2166, 4919, 12176, 9140, 12129, 7852, 12286, 4895, 10805, 2780, 5195, 2305, 7247, 9644, 4053, 10600, 3364, 3271, 4057, 4414, 9442, 7917, 2174, 3947, 11951, 2455, 6599, 10545, 10975, 3654, 2894, 7681, 7126, 7287, 12269, 4119, 3343, 2151, 1522, 7174, 7350, 11041, 2442, 2148, 5959, 6492, 8330, 8945, 5598, 3624, 10397, 1325, 6565, 1945, 11260, 10077, 2674, 3338, 3276, 11034, 506, 6505, 1392, 5478, 8778, 1178, 2776, 3408, 10347, 11124, 2575, 9489, 12096, 6092, 10058, 4167, 6085, 923, 11251, 11912, 4578, 10669, 11914, 425, 10453, 392, 10104, 8464, 4235, 8761, 7376, 2291, 3375, 7954, 8896, 6617, 7790, 1737, 11667, 3982, 9342, 6680, 636, 6825, 7383, 512, 4670, 2900, 12050, 7735, 994, 1687, 11883, 7021, 146, 10485, 1403, 5189, 6094, 2483, 2054, 3042, 10945, 3981, 10821, 11826, 8882, 8151, 180, 9600, 7684, 5219, 10880, 6780, 204, 11232, 2600, 7584, 3121, 3017, 11053, 7814, 7043, 4251, 4739, 11063, 6771, 7073, 9261, 2360, 11925, 1928, 11825, 8024, 3678, 3205, 3359, 11197, 5209, 8581, 3238, 8840, 1136, 9363, 1826, 3171, 4489, 7885, 346, 2068, 1389, 8257, 3163, 4840, 6127, 8062, 8921, 612, 4238, 10763, 8067, 125, 11749, 10125, 5416, 2110, 716, 9839, 10584, 11475, 11873, 3448, 343, 1908, 4538, 10423, 7078, 4727, 1208, 11572, 3589, 2982, 1373, 1721, 10753, 4103, 2429, 4209, 5412, 5993, 9011, 438, 3515, 7228, 1218, 8347, 5232, 8682, 1327, 7508, 4924, 448, 1014, 10029, 12221, 4566, 5836, 12229, 2717, 1535, 3200, 5588, 5845, 412, 5102, 7326, 3744, 3056, 2528, 7406, 8314, 9202, 6454, 6613, 1417, 10032, 7784, 1518, 3765, 4176, 5063, 9828, 2275, 6636, 4267, 6463, 2065, 7725, 3495, 8328, 8755, 8144, 10533, 5966, 12077, 9175, 9520, 5596, 6302, 8400, 579, 6781, 11014, 5734, 11113, 11164, 4860, 1131, 10844, 9068, 8016, 9694, 3837, 567, 9348, 7000, 6627, 7699, 5082, 682, 11309, 5207, 4050, 7087, 844, 7434, 3769, 293, 9057, 6940, 9344, 10883, 2633, 8190, 3944, 5530, 5604, 3480, 2171, 9282, 11024, 2213, 8136, 3805, 767, 12239, 216, 11520, 6763, 10353, 7, 8566, 845, 7235, 3154, 4360, 3285, 10268, 2832, 3572, 1282, 7559, 3229, 8360, 10583, 6105, 3120, 6643, 6203, 8536, 8348, 6919, 3536, 9199, 10891, 11463, 5043, 1658, 5618, 8787, 5789, 4719, 751, 11379, 6389, 10783, 3065, 7806, 6586, 2622, 5386, 510, 7628, 6921, 578, 10345, 11839, 8929, 4684, 12226, 7154, 9916, 7302, 8481, 3670, 11066, 2334, 1590, 7878, 10734, 1802, 1891, 5103, 6151, 8820, 3418, 7846, 9951, 4693, 417, 9996, 9652, 4510, 2946, 5461, 365, 881, 1927, 1015, 11675, 11009, 1371, 12265, 2485, 11385, 5039, 6742, 8449, 1842, 12217, 8176, 9577, 4834, 7937, 9461, 2643, 11194, 3045, 6508, 4094, 3451, 7911, 11048, 5406, 4665, 3020, 6616, 11345, 7519, 3669, 5287, 1790, 7014, 5410, 11038, 11249, 2035, 6125, 10407, 4565, 7315, 5078, 10506, 2840, 2478, 9270, 4194, 9195, 4518, 7469, 1160, 6878, 2730, 10421, 10036, 1734, 3815, 10939, 5832, 10595, 10759, 4423, 8420, 9617, 7119, 11010, 11424, 9173, 189, 10080, 10526, 3466, 10588, 7592, 3578, 11511, 7785, 9663, 530, 12150, 8957, 2532, 3317, 9349, 10243, 1481, 9332, 3454, 3758, 7899, 4218, 2593, 11410, 2276, 982, 6513, 1849, 8494, 9021, 4523, 7988, 8, 457, 648, 150, 8000, 2307, 2301, 874, 5650, 170, 9462, 2873, 9855, 11498, 2535, 11169, 5808, 12268, 9687, 1901, 7171, 11787, 3846, 1573, 6063, 3793, 466, 11259, 10608, 3821, 6320, 4649, 6263, 2929 }; mul_coefficients(r->coeffs, psis_bitrev_montgomery); ntt(r->coeffs, omegas_montgomery); } inline void bitrev_vector(uint16_t* poly) { static const uint16_t bitrev_table[1024] = { 0, 512, 256, 768, 128, 640, 384, 896, 64, 576, 320, 832, 192, 704, 448, 960, 32, 544, 288, 800, 160, 672, 416, 928, 96, 608, 352, 864, 224, 736, 480, 992, 16, 528, 272, 784, 144, 656, 400, 912, 80, 592, 336, 848, 208, 720, 464, 976, 48, 560, 304, 816, 176, 688, 432, 944, 112, 624, 368, 880, 240, 752, 496, 1008, 8, 520, 264, 776, 136, 648, 392, 904, 72, 584, 328, 840, 200, 712, 456, 968, 40, 552, 296, 808, 168, 680, 424, 936, 104, 616, 360, 872, 232, 744, 488, 1000, 24, 536, 280, 792, 152, 664, 408, 920, 88, 600, 344, 856, 216, 728, 472, 984, 56, 568, 312, 824, 184, 696, 440, 952, 120, 632, 376, 888, 248, 760, 504, 1016, 4, 516, 260, 772, 132, 644, 388, 900, 68, 580, 324, 836, 196, 708, 452, 964, 36, 548, 292, 804, 164, 676, 420, 932, 100, 612, 356, 868, 228, 740, 484, 996, 20, 532, 276, 788, 148, 660, 404, 916, 84, 596, 340, 852, 212, 724, 468, 980, 52, 564, 308, 820, 180, 692, 436, 948, 116, 628, 372, 884, 244, 756, 500, 1012, 12, 524, 268, 780, 140, 652, 396, 908, 76, 588, 332, 844, 204, 716, 460, 972, 44, 556, 300, 812, 172, 684, 428, 940, 108, 620, 364, 876, 236, 748, 492, 1004, 28, 540, 284, 796, 156, 668, 412, 924, 92, 604, 348, 860, 220, 732, 476, 988, 60, 572, 316, 828, 188, 700, 444, 956, 124, 636, 380, 892, 252, 764, 508, 1020, 2, 514, 258, 770, 130, 642, 386, 898, 66, 578, 322, 834, 194, 706, 450, 962, 34, 546, 290, 802, 162, 674, 418, 930, 98, 610, 354, 866, 226, 738, 482, 994, 18, 530, 274, 786, 146, 658, 402, 914, 82, 594, 338, 850, 210, 722, 466, 978, 50, 562, 306, 818, 178, 690, 434, 946, 114, 626, 370, 882, 242, 754, 498, 1010, 10, 522, 266, 778, 138, 650, 394, 906, 74, 586, 330, 842, 202, 714, 458, 970, 42, 554, 298, 810, 170, 682, 426, 938, 106, 618, 362, 874, 234, 746, 490, 1002, 26, 538, 282, 794, 154, 666, 410, 922, 90, 602, 346, 858, 218, 730, 474, 986, 58, 570, 314, 826, 186, 698, 442, 954, 122, 634, 378, 890, 250, 762, 506, 1018, 6, 518, 262, 774, 134, 646, 390, 902, 70, 582, 326, 838, 198, 710, 454, 966, 38, 550, 294, 806, 166, 678, 422, 934, 102, 614, 358, 870, 230, 742, 486, 998, 22, 534, 278, 790, 150, 662, 406, 918, 86, 598, 342, 854, 214, 726, 470, 982, 54, 566, 310, 822, 182, 694, 438, 950, 118, 630, 374, 886, 246, 758, 502, 1014, 14, 526, 270, 782, 142, 654, 398, 910, 78, 590, 334, 846, 206, 718, 462, 974, 46, 558, 302, 814, 174, 686, 430, 942, 110, 622, 366, 878, 238, 750, 494, 1006, 30, 542, 286, 798, 158, 670, 414, 926, 94, 606, 350, 862, 222, 734, 478, 990, 62, 574, 318, 830, 190, 702, 446, 958, 126, 638, 382, 894, 254, 766, 510, 1022, 1, 513, 257, 769, 129, 641, 385, 897, 65, 577, 321, 833, 193, 705, 449, 961, 33, 545, 289, 801, 161, 673, 417, 929, 97, 609, 353, 865, 225, 737, 481, 993, 17, 529, 273, 785, 145, 657, 401, 913, 81, 593, 337, 849, 209, 721, 465, 977, 49, 561, 305, 817, 177, 689, 433, 945, 113, 625, 369, 881, 241, 753, 497, 1009, 9, 521, 265, 777, 137, 649, 393, 905, 73, 585, 329, 841, 201, 713, 457, 969, 41, 553, 297, 809, 169, 681, 425, 937, 105, 617, 361, 873, 233, 745, 489, 1001, 25, 537, 281, 793, 153, 665, 409, 921, 89, 601, 345, 857, 217, 729, 473, 985, 57, 569, 313, 825, 185, 697, 441, 953, 121, 633, 377, 889, 249, 761, 505, 1017, 5, 517, 261, 773, 133, 645, 389, 901, 69, 581, 325, 837, 197, 709, 453, 965, 37, 549, 293, 805, 165, 677, 421, 933, 101, 613, 357, 869, 229, 741, 485, 997, 21, 533, 277, 789, 149, 661, 405, 917, 85, 597, 341, 853, 213, 725, 469, 981, 53, 565, 309, 821, 181, 693, 437, 949, 117, 629, 373, 885, 245, 757, 501, 1013, 13, 525, 269, 781, 141, 653, 397, 909, 77, 589, 333, 845, 205, 717, 461, 973, 45, 557, 301, 813, 173, 685, 429, 941, 109, 621, 365, 877, 237, 749, 493, 1005, 29, 541, 285, 797, 157, 669, 413, 925, 93, 605, 349, 861, 221, 733, 477, 989, 61, 573, 317, 829, 189, 701, 445, 957, 125, 637, 381, 893, 253, 765, 509, 1021, 3, 515, 259, 771, 131, 643, 387, 899, 67, 579, 323, 835, 195, 707, 451, 963, 35, 547, 291, 803, 163, 675, 419, 931, 99, 611, 355, 867, 227, 739, 483, 995, 19, 531, 275, 787, 147, 659, 403, 915, 83, 595, 339, 851, 211, 723, 467, 979, 51, 563, 307, 819, 179, 691, 435, 947, 115, 627, 371, 883, 243, 755, 499, 1011, 11, 523, 267, 779, 139, 651, 395, 907, 75, 587, 331, 843, 203, 715, 459, 971, 43, 555, 299, 811, 171, 683, 427, 939, 107, 619, 363, 875, 235, 747, 491, 1003, 27, 539, 283, 795, 155, 667, 411, 923, 91, 603, 347, 859, 219, 731, 475, 987, 59, 571, 315, 827, 187, 699, 443, 955, 123, 635, 379, 891, 251, 763, 507, 1019, 7, 519, 263, 775, 135, 647, 391, 903, 71, 583, 327, 839, 199, 711, 455, 967, 39, 551, 295, 807, 167, 679, 423, 935, 103, 615, 359, 871, 231, 743, 487, 999, 23, 535, 279, 791, 151, 663, 407, 919, 87, 599, 343, 855, 215, 727, 471, 983, 55, 567, 311, 823, 183, 695, 439, 951, 119, 631, 375, 887, 247, 759, 503, 1015, 15, 527, 271, 783, 143, 655, 399, 911, 79, 591, 335, 847, 207, 719, 463, 975, 47, 559, 303, 815, 175, 687, 431, 943, 111, 623, 367, 879, 239, 751, 495, 1007, 31, 543, 287, 799, 159, 671, 415, 927, 95, 607, 351, 863, 223, 735, 479, 991, 63, 575, 319, 831, 191, 703, 447, 959, 127, 639, 383, 895, 255, 767, 511, 1023 }; for(size_t i = 0; i < PARAM_N; i++) { const uint16_t r = bitrev_table[i]; if(i < r) { const uint16_t tmp = poly[i]; poly[i] = poly[r]; poly[r] = tmp; } } } inline void poly_invntt(poly* r) { static const uint16_t omegas_inv_montgomery[PARAM_N/2] = { 4075, 5315, 4324, 4916, 10120, 11767, 7210, 9027, 10316, 6715, 1278, 9945, 3514, 11248, 11271, 5925, 147, 8500, 7840, 6833, 5537, 4749, 4467, 7500, 11099, 9606, 6171, 8471, 8429, 5445, 11239, 7753, 9090, 12233, 5529, 5206, 10587, 1987, 11635, 3565, 5415, 8646, 6153, 6427, 7341, 6152, 10561, 400, 8410, 1922, 2033, 8291, 1359, 6854, 11035, 973, 8579, 6093, 6950, 5446, 11821, 8301, 11907, 316, 52, 3174, 10966, 9523, 6055, 8953, 11612, 6415, 2505, 5906, 10710, 11858, 8332, 9450, 10162, 151, 3482, 787, 5468, 1010, 4169, 9162, 5241, 9369, 7509, 8844, 7232, 4698, 192, 1321, 10240, 4912, 885, 6281, 10333, 7280, 8757, 11286, 58, 12048, 12147, 11184, 8812, 6608, 2844, 3438, 4212, 11314, 8687, 6068, 421, 8209, 3600, 3263, 7665, 6077, 7507, 5886, 3029, 6695, 4213, 504, 11684, 2302, 1962, 1594, 6328, 7183, 168, 2692, 8960, 4298, 5184, 11089, 6122, 9734, 10929, 3956, 5297, 6170, 3762, 9370, 4016, 4077, 6523, 652, 11994, 6099, 1146, 11341, 11964, 10885, 6299, 1159, 8240, 8561, 11177, 2078, 10331, 4322, 11367, 441, 4079, 11231, 3150, 1319, 8243, 709, 8049, 8719, 11454, 6224, 3054, 6803, 3123, 10542, 4433, 6370, 7032, 3834, 8633, 12225, 9830, 683, 1566, 5782, 9786, 9341, 12115, 723, 3009, 1693, 5735, 2655, 2738, 6421, 11942, 2925, 1975, 8532, 3315, 11863, 4754, 1858, 1583, 6347, 2500, 10800, 6374, 1483, 12240, 1263, 1815, 5383, 10777, 350, 6920, 10232, 4493, 9087, 8855, 8760, 9381, 218, 9928, 10446, 9259, 4115, 6147, 9842, 8326, 576, 10335, 10238, 10484, 9407, 6381, 11836, 8517, 418, 6860, 7515, 1293, 7552, 2767, 156, 8298, 8320, 10008, 5876, 5333, 10258, 10115, 4372, 2847, 7875, 8232, 9018, 8925, 1689, 8236, 2645, 5042, 9984, 7094, 9509, 1484, 7394, 3, 4437, 160, 3149, 113, 7370, 10123, 3915, 6998, 2704, 8653, 4938, 1426, 7635, 10512, 1663, 6957, 3510, 2370, 2865, 3978, 9320, 3247, 9603, 6882, 3186, 10659, 10163, 1153, 9405, 8241, 10040, 2178, 1544, 5559, 420, 8304, 4905, 476, 3531, 5191, 9153, 2399, 8889, 3000, 671, 243, 3016, 3763, 10849, 12262, 9223, 10657, 7205, 11272, 7404, 7575, 8146, 10752, 242, 2678, 3704, 11744, 5019, 3833, 3778, 11899, 773, 5101, 11222, 9888, 442, 2912, 5698, 11935, 4861, 7277, 9808, 11244, 2859, 3780, 11414, 4976, 10682, 7201, 8005, 11287, 5011, 6267, 2987, 2437, 3646, 2566, 10102, 9867, 6250, 5444, 2381, 11796, 8193, 4337, 11854, 1912, 1378, 404, 7644, 1065, 2143, 11121, 5277, 3248, 11082, 2548, 8058, 8907, 11934, 1759, 8582, 3694, 7110, 12144, 6747, 8652, 3459, 2731, 8357, 6378, 7399, 10861, 1696, 9863, 334, 7657, 6534, 11029, 4388, 11560, 3241, 10276, 9000, 9408, 3284, 10200, 7197, 6498, 544, 2468, 339, 11267, 9, 2842, 480, 5331, 7300, 1673, 4278, 4177, 8705, 9764, 1381, 7837, 2396, 8340, 8993, 4354, 130, 6915, 2837, 11462, 5767, 953, 8541, 9813, 118, 7222, 2197, 3006, 9545, 563, 9314, 2625, 11340, 4821, 2639, 7266, 5828, 6561, 7698, 3328, 6512, 1351, 7311, 6553, 8155, 1305, 722, 5146, 4043, 12288, 10810, 2545, 3621, 8747, 8785, 1646, 1212, 5860, 3195, 7203, 10963, 3201, 3014, 955, 11499, 9970, 11119, 3135, 3712, 7443, 9542, 7484, 8736, 9995, 11227, 1635, 9521, 1177, 8034, 140, 10436, 11563, 7678, 4320, 11289, 9198, 12208, 2963, 7393, 2366, 9238 }; static const uint16_t psis_inv_montgomery[PARAM_N] = { 256, 10570, 1510, 7238, 1034, 7170, 6291, 7921, 11665, 3422, 4000, 2327, 2088, 5565, 795, 10647, 1521, 5484, 2539, 7385, 1055, 7173, 8047, 11683, 1669, 1994, 3796, 5809, 4341, 9398, 11876, 12230, 10525, 12037, 12253, 3506, 4012, 9351, 4847, 2448, 7372, 9831, 3160, 2207, 5582, 2553, 7387, 6322, 9681, 1383, 10731, 1533, 219, 5298, 4268, 7632, 6357, 9686, 8406, 4712, 9451, 10128, 4958, 5975, 11387, 8649, 11769, 6948, 11526, 12180, 1740, 10782, 6807, 2728, 7412, 4570, 4164, 4106, 11120, 12122, 8754, 11784, 3439, 5758, 11356, 6889, 9762, 11928, 1704, 1999, 10819, 12079, 12259, 7018, 11536, 1648, 1991, 2040, 2047, 2048, 10826, 12080, 8748, 8272, 8204, 1172, 1923, 7297, 2798, 7422, 6327, 4415, 7653, 6360, 11442, 12168, 7005, 8023, 9924, 8440, 8228, 2931, 7441, 1063, 3663, 5790, 9605, 10150, 1450, 8985, 11817, 10466, 10273, 12001, 3470, 7518, 1074, 1909, 7295, 9820, 4914, 702, 5367, 7789, 8135, 9940, 1420, 3714, 11064, 12114, 12264, 1752, 5517, 9566, 11900, 1700, 3754, 5803, 829, 1874, 7290, 2797, 10933, 5073, 7747, 8129, 6428, 6185, 11417, 1631, 233, 5300, 9535, 10140, 11982, 8734, 8270, 2937, 10953, 8587, 8249, 2934, 9197, 4825, 5956, 4362, 9401, 1343, 3703, 529, 10609, 12049, 6988, 6265, 895, 3639, 4031, 4087, 4095, 585, 10617, 8539, 4731, 4187, 9376, 3095, 9220, 10095, 10220, 1460, 10742, 12068, 1724, 5513, 11321, 6884, 2739, 5658, 6075, 4379, 11159, 10372, 8504, 4726, 9453, 3106, 7466, 11600, 10435, 8513, 9994, 8450, 9985, 3182, 10988, 8592, 2983, 9204, 4826, 2445, 5616, 6069, 867, 3635, 5786, 11360, 5134, 2489, 10889, 12089, 1727, 7269, 2794, 9177, 1311, 5454, 9557, 6632, 2703, 9164, 10087, 1441, 3717, 531, 3587, 2268, 324, 5313, 759, 1864, 5533, 2546, 7386, 9833, 8427, 4715, 11207, 1601, 7251, 4547, 11183, 12131, 1733, 10781, 10318, 1474, 10744, 5046, 4232, 11138, 10369, 6748, 964, 7160, 4534, 7670, 8118, 8182, 4680, 11202, 6867, 981, 8918, 1274, 182, 26, 7026, 8026, 11680, 12202, 10521, 1503, 7237, 4545, 5916, 9623, 8397, 11733, 10454, 3249, 9242, 6587, 941, 1890, 270, 10572, 6777, 9746, 6659, 6218, 6155, 6146, 878, 1881, 7291, 11575, 12187, 1741, 7271, 8061, 11685, 6936, 4502, 9421, 4857, 4205, 7623, 1089, 10689, 1527, 8996, 10063, 11971, 10488, 6765, 2722, 3900, 9335, 11867, 6962, 11528, 5158, 4248, 4118, 5855, 2592, 5637, 6072, 2623, 7397, 8079, 9932, 4930, 5971, 853, 3633, 519, 8852, 11798, 3441, 11025, 1575, 225, 8810, 11792, 12218, 3501, 9278, 3081, 9218, 4828, 7712, 8124, 11694, 12204, 3499, 4011, 573, 3593, 5780, 7848, 9899, 10192, 1456, 208, 7052, 2763, 7417, 11593, 10434, 12024, 8740, 11782, 10461, 3250, 5731, 7841, 9898, 1414, 202, 3540, 7528, 2831, 2160, 10842, 5060, 4234, 4116, 588, 84, 12, 7024, 2759, 9172, 6577, 11473, 1639, 9012, 3043, 7457, 6332, 11438, 1634, 1989, 9062, 11828, 8712, 11778, 12216, 10523, 6770, 9745, 10170, 4964, 9487, 6622, 946, 8913, 6540, 6201, 4397, 9406, 8366, 9973, 8447, 8229, 11709, 8695, 10020, 3187, 5722, 2573, 10901, 6824, 4486, 4152, 9371, 8361, 2950, 2177, 311, 1800, 9035, 8313, 11721, 3430, 490, 70, 10, 1757, 251, 3547, 7529, 11609, 3414, 7510, 4584, 4166, 9373, 1339, 5458, 7802, 11648, 1664, 7260, 9815, 10180, 6721, 9738, 10169, 8475, 8233, 9954, 1422, 8981, 1283, 5450, 11312, 1616, 3742, 11068, 10359, 4991, 713, 3613, 9294, 8350, 4704, 672, 96, 7036, 9783, 11931, 3460, 5761, 823, 10651, 12055, 10500, 1500, 5481, 783, 3623, 11051, 8601, 8251, 8201, 11705, 10450, 5004, 4226, 7626, 2845, 2162, 3820, 7568, 9859, 3164, 452, 10598, 1514, 5483, 6050, 6131, 4387, 7649, 8115, 6426, 918, 8909, 8295, 1185, 5436, 11310, 8638, 1234, 5443, 11311, 5127, 2488, 2111, 10835, 5059, 7745, 2862, 3920, 560, 80, 1767, 2008, 3798, 11076, 6849, 2734, 10924, 12094, 8750, 1250, 10712, 6797, 971, 7161, 1023, 8924, 4786, 7706, 4612, 4170, 7618, 6355, 4419, 5898, 11376, 10403, 10264, 6733, 4473, 639, 5358, 2521, 9138, 3061, 5704, 4326, 618, 5355, 765, 5376, 768, 7132, 4530, 9425, 3102, 9221, 6584, 11474, 10417, 10266, 12000, 6981, 6264, 4406, 2385, 7363, 4563, 4163, 7617, 9866, 3165, 9230, 11852, 10471, 5007, 5982, 11388, 5138, 734, 3616, 11050, 12112, 6997, 11533, 12181, 10518, 12036, 3475, 2252, 7344, 9827, 4915, 9480, 6621, 4457, 7659, 9872, 6677, 4465, 4149, 7615, 4599, 657, 3605, 515, 10607, 6782, 4480, 640, 1847, 3775, 5806, 2585, 5636, 9583, 1369, 10729, 8555, 10000, 11962, 5220, 7768, 8132, 8184, 9947, 1421, 203, 29, 8782, 11788, 1684, 10774, 10317, 4985, 9490, 8378, 4708, 11206, 5112, 5997, 7879, 11659, 12199, 8765, 10030, 4944, 5973, 6120, 6141, 6144, 7900, 11662, 1666, 238, 34, 3516, 5769, 9602, 8394, 9977, 6692, 956, 10670, 6791, 9748, 11926, 8726, 11780, 5194, 742, 106, 8793, 10034, 3189, 10989, 5081, 4237, 5872, 4350, 2377, 10873, 6820, 6241, 11425, 10410, 10265, 3222, 5727, 9596, 4882, 2453, 2106, 3812, 11078, 12116, 5242, 4260, 11142, 8614, 11764, 12214, 5256, 4262, 4120, 11122, 5100, 11262, 5120, 2487, 5622, 9581, 8391, 8221, 2930, 10952, 12098, 6995, 6266, 9673, 4893, 699, 3611, 4027, 5842, 11368, 1624, 232, 8811, 8281, 1183, 169, 8802, 3013, 2186, 5579, 797, 3625, 4029, 11109, 1587, 7249, 11569, 8675, 6506, 2685, 10917, 12093, 12261, 12285, 1755, 7273, 1039, 1904, 272, 3550, 9285, 3082, 5707, 6082, 4380, 7648, 11626, 5172, 4250, 9385, 8363, 8217, 4685, 5936, 848, 8899, 6538, 934, 1889, 3781, 9318, 10109, 10222, 6727, 961, 5404, 772, 5377, 9546, 8386, 1198, 8949, 3034, 2189, 7335, 4559, 5918, 2601, 10905, 5069, 9502, 3113, 7467, 8089, 11689, 5181, 9518, 8382, 2953, 3933, 4073, 4093, 7607, 8109, 2914, 5683, 4323, 11151, 1593, 10761, 6804, 972, 3650, 2277, 5592, 4310, 7638, 9869, 4921, 703, 1856, 9043, 4803, 9464, 1352, 8971, 11815, 5199, 7765, 6376, 4422, 7654, 2849, 407, 8836, 6529, 7955, 2892, 9191, 1313, 10721, 12065, 12257, 1751, 9028, 8312, 2943, 2176, 3822, 546, 78, 8789, 11789, 10462, 12028, 6985, 4509, 9422, 1346, 5459, 4291, 613, 10621, 6784, 9747, 3148, 7472, 2823, 5670, 810, 7138, 8042, 4660, 7688, 6365, 6176, 6149, 2634, 5643, 9584, 10147, 11983, 5223, 9524, 11894, 10477, 8519, 1217, 3685, 2282, 326, 10580, 3267, 7489, 4581, 2410, 5611, 11335, 6886, 8006, 8166, 11700, 3427, 11023, 8597, 10006, 3185, 455, 65, 5276, 7776, 4622, 5927, 7869, 9902, 11948, 5218, 2501, 5624, 2559, 10899, 1557, 1978, 10816, 10323, 8497, 4725, 675, 1852, 10798, 12076, 10503, 3256, 9243, 3076, 2195, 10847, 12083, 10504, 12034, 10497 }; bitrev_vector(r->coeffs); ntt(r->coeffs, omegas_inv_montgomery); mul_coefficients(r->coeffs, psis_inv_montgomery); } inline void encode_a(uint8_t* r, const poly* pk, const uint8_t* seed) { poly_tobytes(r, pk); for(size_t i = 0; i < NEWHOPE_SEED_BYTES; i++) { r[NEWHOPE_POLY_BYTES+i] = seed[i]; } } inline void decode_a(poly* pk, uint8_t* seed, const uint8_t* r) { poly_frombytes(pk, r); for(size_t i = 0; i < NEWHOPE_SEED_BYTES; i++) { seed[i] = r[NEWHOPE_POLY_BYTES+i]; } } inline void encode_b(uint8_t* r, const poly* b, const poly* c) { poly_tobytes(r, b); for(size_t i = 0; i < PARAM_N/4; i++) { r[NEWHOPE_POLY_BYTES+i] = c->coeffs[4*i] | (c->coeffs[4*i+1] << 2) | (c->coeffs[4*i+2] << 4) | (c->coeffs[4*i+3] << 6); } } inline void decode_b(poly* b, poly* c, const uint8_t* r) { poly_frombytes(b, r); for(size_t i = 0; i < PARAM_N/4; i++) { c->coeffs[4*i+0] = r[NEWHOPE_POLY_BYTES+i] & 0x03; c->coeffs[4*i+1] = (r[NEWHOPE_POLY_BYTES+i] >> 2) & 0x03; c->coeffs[4*i+2] = (r[NEWHOPE_POLY_BYTES+i] >> 4) & 0x03; c->coeffs[4*i+3] = (r[NEWHOPE_POLY_BYTES+i] >> 6); } } inline int32_t ct_abs(int32_t v) { int32_t mask = v >> 31; return (v ^ mask) - mask; } inline int32_t f(int32_t* v0, int32_t* v1, int32_t x) { int32_t xit, t, r, b; // Next 6 lines compute t = x/PARAM_Q; b = x*2730; t = b >> 25; b = x - t*12289; b = 12288 - b; b >>= 31; t -= b; r = t & 1; xit = (t>>1); *v0 = xit+r; // v0 = round(x/(2*PARAM_Q)) t -= 1; r = t & 1; *v1 = (t>>1)+r; return ct_abs(x-((*v0)*2*PARAM_Q)); } inline void helprec(poly* c, const poly* v, RandomNumberGenerator& rng) { uint8_t rand[32]; rng.randomize(rand, 32); for(size_t i = 0; i < 256; i++) { int32_t v0[4], v1[4]; uint8_t rbit = (rand[i>>3] >> (i&7)) & 1; int32_t k; k = f(v0+0, v1+0, 8*v->coeffs[ 0+i] + 4*rbit); k += f(v0+1, v1+1, 8*v->coeffs[256+i] + 4*rbit); k += f(v0+2, v1+2, 8*v->coeffs[512+i] + 4*rbit); k += f(v0+3, v1+3, 8*v->coeffs[768+i] + 4*rbit); k = (2*PARAM_Q-1-k) >> 31; int32_t v_tmp[4]; v_tmp[0] = ((~k) & v0[0]) ^ (k & v1[0]); v_tmp[1] = ((~k) & v0[1]) ^ (k & v1[1]); v_tmp[2] = ((~k) & v0[2]) ^ (k & v1[2]); v_tmp[3] = ((~k) & v0[3]) ^ (k & v1[3]); c->coeffs[ 0+i] = (v_tmp[0] - v_tmp[3]) & 3; c->coeffs[256+i] = (v_tmp[1] - v_tmp[3]) & 3; c->coeffs[512+i] = (v_tmp[2] - v_tmp[3]) & 3; c->coeffs[768+i] = (- k + 2*v_tmp[3]) & 3; } } inline int32_t g(int32_t x) { int32_t t, c, b; // Next 6 lines compute t = x/(4*PARAM_Q); b = x*2730; t = b >> 27; b = x - t*49156; b = 49155 - b; b >>= 31; t -= b; c = t & 1; t = (t >> 1) + c; // t = round(x/(8*PARAM_Q)) t *= 8*PARAM_Q; return ct_abs(t - x); } inline int16_t LDDecode(int32_t xi0, int32_t xi1, int32_t xi2, int32_t xi3) { int32_t t; t = g(xi0); t += g(xi1); t += g(xi2); t += g(xi3); t -= 8*PARAM_Q; t >>= 31; return t&1; } inline void rec(uint8_t* key, const poly* v, const poly* c) { clear_mem(key, 32); for(size_t i = 0; i < 256; i++) { const int32_t tmp0 = 16*PARAM_Q + 8*static_cast(v->coeffs[ 0+i]) - PARAM_Q * (2*c->coeffs[ 0+i]+c->coeffs[768+i]); const int32_t tmp1 = 16*PARAM_Q + 8*static_cast(v->coeffs[256+i]) - PARAM_Q * (2*c->coeffs[256+i]+c->coeffs[768+i]); const int32_t tmp2 = 16*PARAM_Q + 8*static_cast(v->coeffs[512+i]) - PARAM_Q * (2*c->coeffs[512+i]+c->coeffs[768+i]); const int32_t tmp3 = 16*PARAM_Q + 8*static_cast(v->coeffs[768+i]) - PARAM_Q * (c->coeffs[768+i]); key[i>>3] |= LDDecode(tmp0, tmp1, tmp2, tmp3) << (i & 7); } } void gen_a(poly* a, const uint8_t* seed, Newhope_Mode mode) { std::vector buf(168*16); std::unique_ptr xof; if(mode == Newhope_Mode::BoringSSL) { xof = StreamCipher::create_or_throw("CTR-BE(AES-128)"); xof->set_key(seed, 16); xof->set_iv(seed + 16, 16); } else { xof = StreamCipher::create_or_throw("SHAKE-128"); xof->set_key(seed, NEWHOPE_SEED_BYTES); } zeroise(buf); xof->encrypt(buf); size_t pos = 0, ctr = 0; while(ctr < PARAM_N) { // Specialized for q = 12889 const uint16_t val = (buf[pos] | (static_cast(buf[pos+1]) << 8)) & 0x3fff; if(val < PARAM_Q) { a->coeffs[ctr++] = val; } pos += 2; if(pos >= buf.size()) { zeroise(buf); xof->encrypt(buf); pos = 0; } } } } // API FUNCTIONS void newhope_keygen(uint8_t* send, poly* sk, RandomNumberGenerator& rng, Newhope_Mode mode) { poly a, e, r, pk; uint8_t seed[NEWHOPE_SEED_BYTES]; rng.randomize(seed, NEWHOPE_SEED_BYTES); gen_a(&a, seed, mode); poly_getnoise(rng, sk); poly_ntt(sk); poly_getnoise(rng, &e); poly_ntt(&e); poly_pointwise(&r, sk, &a); poly_add(&pk, &e, &r); encode_a(send, &pk, seed); } void newhope_sharedb(uint8_t* sharedkey, uint8_t* send, const uint8_t* received, RandomNumberGenerator& rng, Newhope_Mode mode) { poly sp, ep, v, a, pka, c, epp, bp; uint8_t seed[NEWHOPE_SEED_BYTES]; decode_a(&pka, seed, received); gen_a(&a, seed, mode); poly_getnoise(rng, &sp); poly_ntt(&sp); poly_getnoise(rng, &ep); poly_ntt(&ep); poly_pointwise(&bp, &a, &sp); poly_add(&bp, &bp, &ep); poly_pointwise(&v, &pka, &sp); poly_invntt(&v); poly_getnoise(rng, &epp); poly_add(&v, &v, &epp); helprec(&c, &v, rng); encode_b(send, &bp, &c); rec(sharedkey, &v, &c); const std::string kdf_hash = (mode == Newhope_Mode::SHA3) ? "SHA-3(256)" : "SHA-256"; std::unique_ptr hash = HashFunction::create_or_throw(kdf_hash); hash->update(sharedkey, 32); hash->final(sharedkey); } void newhope_shareda(uint8_t sharedkey[], const poly* sk, const uint8_t received[], Newhope_Mode mode) { poly v, bp, c; decode_b(&bp, &c, received); poly_pointwise(&v, sk, &bp); poly_invntt(&v); rec(sharedkey, &v, &c); const std::string kdf_hash = (mode == Newhope_Mode::SHA3) ? "SHA-3(256)" : "SHA-256"; std::unique_ptr hash = HashFunction::create_or_throw(kdf_hash); hash->update(sharedkey, 32); hash->final(sharedkey); } } botan-2.4.0/src/lib/pubkey/newhope/newhope.h000066400000000000000000000044411322470703100207410ustar00rootroot00000000000000/* * NEWHOPE Ring-LWE scheme * Based on the public domain reference implementation by the * designers (https://github.com/tpoeppelmann/newhope) * * Further changes * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_NEWHOPE_H_ #define BOTAN_NEWHOPE_H_ #include namespace Botan { class RandomNumberGenerator; /* * WARNING: This API is preliminary and will change * Currently pubkey.h does not support a 2-phase KEM scheme of * the sort NEWHOPE exports. */ // TODO: change to just a secure_vector class newhope_poly final { public: uint16_t coeffs[1024]; ~newhope_poly() { secure_scrub_memory(coeffs, sizeof(coeffs)); } }; enum Newhope_Params { NEWHOPE_SENDABYTES = 1824, NEWHOPE_SENDBBYTES = 2048, NEWHOPE_OFFER_BYTES = 1824, NEWHOPE_ACCEPT_BYTES = 2048, NEWHOPE_SHARED_KEY_BYTES = 32, NEWHOPE_SEED_BYTES = 32, NEWHOPE_POLY_BYTES = 1792, CECPQ1_OFFER_BYTES = NEWHOPE_OFFER_BYTES + 32, CECPQ1_ACCEPT_BYTES = NEWHOPE_ACCEPT_BYTES + 32, CECPQ1_SHARED_KEY_BYTES = NEWHOPE_SHARED_KEY_BYTES + 32 }; /** * This chooses the XOF + hash for NewHope * The official NewHope specification and reference implementation use * SHA-3 and SHAKE-128. BoringSSL instead uses SHA-256 and AES-128 in * CTR mode. CECPQ1 (x25519+NewHope) always uses BoringSSL's mode */ enum class Newhope_Mode { SHA3, BoringSSL }; // offer void BOTAN_PUBLIC_API(2,0) newhope_keygen(uint8_t send[NEWHOPE_SENDABYTES], newhope_poly* sk, RandomNumberGenerator& rng, Newhope_Mode = Newhope_Mode::SHA3); // accept void BOTAN_PUBLIC_API(2,0) newhope_sharedb(uint8_t sharedkey[NEWHOPE_SHARED_KEY_BYTES], uint8_t send[], const uint8_t* received, RandomNumberGenerator& rng, Newhope_Mode mode = Newhope_Mode::SHA3); // finish void BOTAN_PUBLIC_API(2,0) newhope_shareda(uint8_t sharedkey[NEWHOPE_SHARED_KEY_BYTES], const newhope_poly* ska, const uint8_t* received, Newhope_Mode mode = Newhope_Mode::SHA3); } #endif botan-2.4.0/src/lib/pubkey/pbes2/000077500000000000000000000000001322470703100164665ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/pbes2/info.txt000066400000000000000000000001321322470703100201560ustar00rootroot00000000000000 PKCS5_PBES2 -> 20141119 asn1 cbc hmac pbkdf2 botan-2.4.0/src/lib/pubkey/pbes2/pbes2.cpp000066400000000000000000000165541322470703100202200ustar00rootroot00000000000000/* * PKCS #5 PBES2 * (C) 1999-2008,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include namespace Botan { namespace { /* * Encode PKCS#5 PBES2 parameters */ std::vector encode_pbes2_params(const std::string& cipher, const std::string& prf, const secure_vector& salt, const secure_vector& iv, size_t iterations, size_t key_length) { return DER_Encoder() .start_cons(SEQUENCE) .encode( AlgorithmIdentifier("PKCS5.PBKDF2", DER_Encoder() .start_cons(SEQUENCE) .encode(salt, OCTET_STRING) .encode(iterations) .encode(key_length) .encode_if( prf != "HMAC(SHA-160)", AlgorithmIdentifier(prf, AlgorithmIdentifier::USE_NULL_PARAM)) .end_cons() .get_contents_unlocked() ) ) .encode( AlgorithmIdentifier(cipher, DER_Encoder().encode(iv, OCTET_STRING).get_contents_unlocked() ) ) .end_cons() .get_contents_unlocked(); } /* * PKCS#5 v2.0 PBE Encryption */ std::pair> pbes2_encrypt_shared(const secure_vector& key_bits, const std::string& passphrase, size_t* msec_in_iterations_out, size_t iterations_if_msec_null, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng) { const std::string prf = "HMAC(" + digest + ")"; const std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) throw Decoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); const secure_vector salt = rng.random_vec(12); if(cipher_spec[1] != "CBC" && cipher_spec[1] != "GCM") throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); std::unique_ptr enc(get_cipher_mode(cipher, ENCRYPTION)); if(!enc) throw Decoding_Error("PBE-PKCS5 cannot encrypt no cipher " + cipher); std::unique_ptr pbkdf(get_pbkdf("PBKDF2(" + prf + ")")); const size_t key_length = enc->key_spec().maximum_keylength(); secure_vector iv = rng.random_vec(enc->default_nonce_length()); size_t iterations = iterations_if_msec_null; if(msec_in_iterations_out) { std::chrono::milliseconds msec(*msec_in_iterations_out); enc->set_key(pbkdf->derive_key(key_length, passphrase, salt.data(), salt.size(), msec, iterations).bits_of()); *msec_in_iterations_out = iterations; } else { enc->set_key(pbkdf->pbkdf_iterations(key_length, passphrase, salt.data(), salt.size(), iterations)); } enc->start(iv); secure_vector buf = key_bits; enc->finish(buf); AlgorithmIdentifier id( OIDS::lookup("PBE-PKCS5v20"), encode_pbes2_params(cipher, prf, salt, iv, iterations, key_length)); return std::make_pair(id, unlock(buf)); } } std::pair> pbes2_encrypt(const secure_vector& key_bits, const std::string& passphrase, std::chrono::milliseconds msec, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng) { size_t msec_in_iterations_out = static_cast(msec.count()); return pbes2_encrypt_shared(key_bits, passphrase, &msec_in_iterations_out, 0, cipher, digest, rng); // return value msec_in_iterations_out discarded } std::pair> pbes2_encrypt_msec(const secure_vector& key_bits, const std::string& passphrase, std::chrono::milliseconds msec, size_t* out_iterations_if_nonnull, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng) { size_t msec_in_iterations_out = static_cast(msec.count()); auto ret = pbes2_encrypt_shared(key_bits, passphrase, &msec_in_iterations_out, 0, cipher, digest, rng); if(out_iterations_if_nonnull) *out_iterations_if_nonnull = msec_in_iterations_out; return ret; } std::pair> pbes2_encrypt_iter(const secure_vector& key_bits, const std::string& passphrase, size_t pbkdf_iter, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng) { return pbes2_encrypt_shared(key_bits, passphrase, nullptr, pbkdf_iter, cipher, digest, rng); } secure_vector pbes2_decrypt(const secure_vector& key_bits, const std::string& passphrase, const std::vector& params) { AlgorithmIdentifier kdf_algo, enc_algo; BER_Decoder(params) .start_cons(SEQUENCE) .decode(kdf_algo) .decode(enc_algo) .end_cons(); AlgorithmIdentifier prf_algo; if(kdf_algo.get_oid() != OIDS::lookup("PKCS5.PBKDF2")) throw Decoding_Error("PBE-PKCS5 v2.0: Unknown KDF algorithm " + kdf_algo.get_oid().as_string()); secure_vector salt; size_t iterations = 0, key_length = 0; BER_Decoder(kdf_algo.get_parameters()) .start_cons(SEQUENCE) .decode(salt, OCTET_STRING) .decode(iterations) .decode_optional(key_length, INTEGER, UNIVERSAL) .decode_optional(prf_algo, SEQUENCE, CONSTRUCTED, AlgorithmIdentifier("HMAC(SHA-160)", AlgorithmIdentifier::USE_NULL_PARAM)) .end_cons(); const std::string cipher = OIDS::lookup(enc_algo.get_oid()); const std::vector cipher_spec = split_on(cipher, '/'); if(cipher_spec.size() != 2) throw Decoding_Error("PBE-PKCS5 v2.0: Invalid cipher spec " + cipher); if(cipher_spec[1] != "CBC" && cipher_spec[1] != "GCM") throw Decoding_Error("PBE-PKCS5 v2.0: Don't know param format for " + cipher); if(salt.size() < 8) throw Decoding_Error("PBE-PKCS5 v2.0: Encoded salt is too small"); secure_vector iv; BER_Decoder(enc_algo.get_parameters()).decode(iv, OCTET_STRING).verify_end(); const std::string prf = OIDS::lookup(prf_algo.get_oid()); std::unique_ptr pbkdf(get_pbkdf("PBKDF2(" + prf + ")")); std::unique_ptr dec(get_cipher_mode(cipher, DECRYPTION)); if(!dec) throw Decoding_Error("PBE-PKCS5 cannot decrypt no cipher " + cipher); if(key_length == 0) key_length = dec->key_spec().maximum_keylength(); dec->set_key(pbkdf->pbkdf_iterations(key_length, passphrase, salt.data(), salt.size(), iterations)); dec->start(iv); secure_vector buf = key_bits; dec->finish(buf); return buf; } } botan-2.4.0/src/lib/pubkey/pbes2/pbes2.h000066400000000000000000000061021322470703100176510ustar00rootroot00000000000000/* * PKCS #5 v2.0 PBE * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PBE_PKCS_v20_H_ #define BOTAN_PBE_PKCS_v20_H_ #include #include namespace Botan { class RandomNumberGenerator; /** * Encrypt with PBES2 from PKCS #5 v2.0 * @param key_bits the input * @param passphrase the passphrase to use for encryption * @param msec how many milliseconds to run PBKDF2 * @param cipher specifies the block cipher to use to encrypt * @param digest specifies the PRF to use with PBKDF2 (eg "HMAC(SHA-1)") * @param rng a random number generator */ std::pair> BOTAN_PUBLIC_API(2,0) pbes2_encrypt(const secure_vector& key_bits, const std::string& passphrase, std::chrono::milliseconds msec, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng); /** * Encrypt with PBES2 from PKCS #5 v2.0 * @param key_bits the input * @param passphrase the passphrase to use for encryption * @param msec how many milliseconds to run PBKDF2 * @param out_iterations_if_nonnull if not null, set to the number * of PBKDF iterations used * @param cipher specifies the block cipher to use to encrypt * @param digest specifies the PRF to use with PBKDF2 (eg "HMAC(SHA-1)") * @param rng a random number generator */ std::pair> BOTAN_PUBLIC_API(2,1) pbes2_encrypt_msec(const secure_vector& key_bits, const std::string& passphrase, std::chrono::milliseconds msec, size_t* out_iterations_if_nonnull, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng); /** * Encrypt with PBES2 from PKCS #5 v2.0 * @param key_bits the input * @param passphrase the passphrase to use for encryption * @param iterations how many iterations to run PBKDF2 * @param cipher specifies the block cipher to use to encrypt * @param digest specifies the PRF to use with PBKDF2 (eg "HMAC(SHA-1)") * @param rng a random number generator */ std::pair> BOTAN_PUBLIC_API(2,1) pbes2_encrypt_iter(const secure_vector& key_bits, const std::string& passphrase, size_t iterations, const std::string& cipher, const std::string& digest, RandomNumberGenerator& rng); /** * Decrypt a PKCS #5 v2.0 encrypted stream * @param key_bits the input * @param passphrase the passphrase to use for decryption * @param params the PBES2 parameters */ secure_vector BOTAN_PUBLIC_API(2,0) pbes2_decrypt(const secure_vector& key_bits, const std::string& passphrase, const std::vector& params); } #endif botan-2.4.0/src/lib/pubkey/pem/000077500000000000000000000000001322470703100162345ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/pem/info.txt000066400000000000000000000001121322470703100177220ustar00rootroot00000000000000 PEM_CODEC -> 20131128 base64 botan-2.4.0/src/lib/pubkey/pem/pem.cpp000066400000000000000000000077151322470703100175330ustar00rootroot00000000000000/* * PEM Encoding/Decoding * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace PEM_Code { namespace { std::string linewrap(size_t width, const std::string& in) { std::string out; for(size_t i = 0; i != in.size(); ++i) { if(i > 0 && i % width == 0) { out.push_back('\n'); } out.push_back(in[i]); } if(out.size() > 0 && out[out.size()-1] != '\n') { out.push_back('\n'); } return out; } } /* * PEM encode BER/DER-encoded objects */ std::string encode(const uint8_t der[], size_t length, const std::string& label, size_t width) { const std::string PEM_HEADER = "-----BEGIN " + label + "-----\n"; const std::string PEM_TRAILER = "-----END " + label + "-----\n"; return (PEM_HEADER + linewrap(width, base64_encode(der, length)) + PEM_TRAILER); } /* * Decode PEM down to raw BER/DER */ secure_vector decode_check_label(DataSource& source, const std::string& label_want) { std::string label_got; secure_vector ber = decode(source, label_got); if(label_got != label_want) throw Decoding_Error("PEM: Label mismatch, wanted " + label_want + ", got " + label_got); return ber; } /* * Decode PEM down to raw BER/DER */ secure_vector decode(DataSource& source, std::string& label) { const size_t RANDOM_CHAR_LIMIT = 8; label.clear(); const std::string PEM_HEADER1 = "-----BEGIN "; const std::string PEM_HEADER2 = "-----"; size_t position = 0; while(position != PEM_HEADER1.length()) { uint8_t b; if(!source.read_byte(b)) throw Decoding_Error("PEM: No PEM header found"); if(b == PEM_HEADER1[position]) ++position; else if(position >= RANDOM_CHAR_LIMIT) throw Decoding_Error("PEM: Malformed PEM header"); else position = 0; } position = 0; while(position != PEM_HEADER2.length()) { uint8_t b; if(!source.read_byte(b)) throw Decoding_Error("PEM: No PEM header found"); if(b == PEM_HEADER2[position]) ++position; else if(position) throw Decoding_Error("PEM: Malformed PEM header"); if(position == 0) label += static_cast(b); } std::vector b64; const std::string PEM_TRAILER = "-----END " + label + "-----"; position = 0; while(position != PEM_TRAILER.length()) { uint8_t b; if(!source.read_byte(b)) throw Decoding_Error("PEM: No PEM trailer found"); if(b == PEM_TRAILER[position]) ++position; else if(position) throw Decoding_Error("PEM: Malformed PEM trailer"); if(position == 0) b64.push_back(b); } return base64_decode(b64.data(), b64.size()); } secure_vector decode_check_label(const std::string& pem, const std::string& label_want) { DataSource_Memory src(pem); return decode_check_label(src, label_want); } secure_vector decode(const std::string& pem, std::string& label) { DataSource_Memory src(pem); return decode(src, label); } /* * Search for a PEM signature */ bool matches(DataSource& source, const std::string& extra, size_t search_range) { const std::string PEM_HEADER = "-----BEGIN " + extra; secure_vector search_buf(search_range); size_t got = source.peek(search_buf.data(), search_buf.size(), 0); if(got < PEM_HEADER.length()) return false; size_t index = 0; for(size_t j = 0; j != got; ++j) { if(search_buf[j] == PEM_HEADER[index]) ++index; else index = 0; if(index == PEM_HEADER.size()) return true; } return false; } } } botan-2.4.0/src/lib/pubkey/pem/pem.h000066400000000000000000000050351322470703100171710ustar00rootroot00000000000000/* * PEM Encoding/Decoding * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PEM_H_ #define BOTAN_PEM_H_ #include #include namespace Botan { class DataSource; namespace PEM_Code { /** * Encode some binary data in PEM format * @param data binary data to encode * @param data_len length of binary data in bytes * @param label PEM label put after BEGIN and END * @param line_width after this many characters, a new line is inserted */ BOTAN_PUBLIC_API(2,0) std::string encode(const uint8_t data[], size_t data_len, const std::string& label, size_t line_width = 64); /** * Encode some binary data in PEM format * @param data binary data to encode * @param label PEM label * @param line_width after this many characters, a new line is inserted */ template std::string encode(const std::vector& data, const std::string& label, size_t line_width = 64) { return encode(data.data(), data.size(), label, line_width); } /** * Decode PEM data * @param pem a datasource containing PEM encoded data * @param label is set to the PEM label found for later inspection */ BOTAN_PUBLIC_API(2,0) secure_vector decode(DataSource& pem, std::string& label); /** * Decode PEM data * @param pem a string containing PEM encoded data * @param label is set to the PEM label found for later inspection */ BOTAN_PUBLIC_API(2,0) secure_vector decode(const std::string& pem, std::string& label); /** * Decode PEM data * @param pem a datasource containing PEM encoded data * @param label is what we expect the label to be */ BOTAN_PUBLIC_API(2,0) secure_vector decode_check_label(DataSource& pem, const std::string& label); /** * Decode PEM data * @param pem a string containing PEM encoded data * @param label is what we expect the label to be */ BOTAN_PUBLIC_API(2,0) secure_vector decode_check_label(const std::string& pem, const std::string& label); /** * Heuristic test for PEM data. */ BOTAN_PUBLIC_API(2,0) bool matches(DataSource& source, const std::string& extra = "", size_t search_range = 4096); } } #endif botan-2.4.0/src/lib/pubkey/pk_algs.cpp000066400000000000000000000267231322470703100176110ustar00rootroot00000000000000/* * PK Key * (C) 1999-2010,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_DL_GROUP) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_ECGDSA) #include #endif #if defined(BOTAN_HAS_ECKCDSA) #include #endif #if defined(BOTAN_HAS_ED25519) #include #endif #if defined(BOTAN_HAS_GOST_34_10_2001) #include #endif #if defined(BOTAN_HAS_ELGAMAL) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif #if defined(BOTAN_HAS_CURVE_25519) #include #endif #if defined(BOTAN_HAS_MCELIECE) #include #endif #if defined(BOTAN_HAS_XMSS) #include #endif #if defined(BOTAN_HAS_SM2) #include #include #endif #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { std::unique_ptr load_public_key(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) { const std::vector alg_info = split_on(OIDS::lookup(alg_id.get_oid()), '/'); if(alg_info.empty()) throw Decoding_Error("Unknown algorithm OID: " + alg_id.get_oid().as_string()); const std::string alg_name = alg_info[0]; #if defined(BOTAN_HAS_RSA) if(alg_name == "RSA") return std::unique_ptr(new RSA_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_CURVE_25519) if(alg_name == "Curve25519") return std::unique_ptr(new Curve25519_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_MCELIECE) if(alg_name == "McEliece") return std::unique_ptr(new McEliece_PublicKey(key_bits)); #endif #if defined(BOTAN_HAS_ECDSA) if(alg_name == "ECDSA") return std::unique_ptr(new ECDSA_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ECDH) if(alg_name == "ECDH") return std::unique_ptr(new ECDH_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(alg_name == "DH") return std::unique_ptr(new DH_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_DSA) if(alg_name == "DSA") return std::unique_ptr(new DSA_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ELGAMAL) if(alg_name == "ElGamal") return std::unique_ptr(new ElGamal_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ECGDSA) if(alg_name == "ECGDSA") return std::unique_ptr(new ECGDSA_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ECKCDSA) if(alg_name == "ECKCDSA") return std::unique_ptr(new ECKCDSA_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ED25519) if(alg_name == "Ed25519") return std::unique_ptr(new Ed25519_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return std::unique_ptr(new GOST_3410_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_SM2) if(alg_name == "SM2_Sig") return std::unique_ptr(new SM2_Signature_PublicKey(alg_id, key_bits)); if(alg_name == "SM2_Enc") return std::unique_ptr(new SM2_Encryption_PublicKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_XMSS) if(alg_name == "XMSS") return std::unique_ptr(new XMSS_PublicKey(key_bits)); #endif throw Decoding_Error("Unhandled PK algorithm " + alg_name); } std::unique_ptr load_private_key(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) { const std::string alg_name = OIDS::lookup(alg_id.get_oid()); if(alg_name == "") throw Decoding_Error("Unknown algorithm OID: " + alg_id.get_oid().as_string()); #if defined(BOTAN_HAS_RSA) if(alg_name == "RSA") return std::unique_ptr(new RSA_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_CURVE_25519) if(alg_name == "Curve25519") return std::unique_ptr(new Curve25519_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ECDSA) if(alg_name == "ECDSA") return std::unique_ptr(new ECDSA_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ECDH) if(alg_name == "ECDH") return std::unique_ptr(new ECDH_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(alg_name == "DH") return std::unique_ptr(new DH_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_DSA) if(alg_name == "DSA") return std::unique_ptr(new DSA_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_MCELIECE) if(alg_name == "McEliece") return std::unique_ptr(new McEliece_PrivateKey(key_bits)); #endif #if defined(BOTAN_HAS_ECGDSA) if(alg_name == "ECGDSA") return std::unique_ptr(new ECGDSA_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ECKCDSA) if(alg_name == "ECKCDSA") return std::unique_ptr(new ECKCDSA_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ED25519) if(alg_name == "Ed25519") return std::unique_ptr(new Ed25519_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return std::unique_ptr(new GOST_3410_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_SM2) if(alg_name == "SM2_Sig") return std::unique_ptr(new SM2_Signature_PrivateKey(alg_id, key_bits)); if(alg_name == "SM2_Enc") return std::unique_ptr(new SM2_Encryption_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_ELGAMAL) if(alg_name == "ElGamal") return std::unique_ptr(new ElGamal_PrivateKey(alg_id, key_bits)); #endif #if defined(BOTAN_HAS_XMSS) if(alg_name == "XMSS") return std::unique_ptr(new XMSS_PrivateKey(key_bits)); #endif throw Decoding_Error("Unhandled PK algorithm " + alg_name); } #if defined(BOTAN_HAS_ECC_GROUP) namespace { std::string default_ec_group_for(const std::string& alg_name) { if(alg_name == "SM2_Enc" || alg_name == "SM2_Sig") return "sm2p256v1"; if(alg_name == "GOST-34.10") return "gost_256A"; if(alg_name == "ECGDSA") return "brainpool256r1"; return "secp256r1"; } } #endif std::unique_ptr create_private_key(const std::string& alg_name, RandomNumberGenerator& rng, const std::string& params, const std::string& provider) { /* * Default paramaters are chosen for work factor > 2**128 where possible */ #if defined(BOTAN_HAS_CURVE_25519) if(alg_name == "Curve25519") return std::unique_ptr(new Curve25519_PrivateKey(rng)); #endif #if defined(BOTAN_HAS_RSA) if(alg_name == "RSA") { const size_t rsa_bits = (params.empty() ? 3072 : to_u32bit(params)); #if defined(BOTAN_HAS_OPENSSL) if(provider.empty() || provider == "openssl") { std::unique_ptr pk; if((pk = make_openssl_rsa_private_key(rng, rsa_bits))) return pk; if(!provider.empty()) return nullptr; } #endif return std::unique_ptr(new RSA_PrivateKey(rng, rsa_bits)); } #endif #if defined(BOTAN_HAS_MCELIECE) if(alg_name == "McEliece") { std::vector mce_param = Botan::split_on(params.empty() ? "2960,57" : params, ','); if(mce_param.size() != 2) throw Invalid_Argument("create_private_key bad McEliece parameters " + params); size_t mce_n = Botan::to_u32bit(mce_param[0]); size_t mce_t = Botan::to_u32bit(mce_param[1]); return std::unique_ptr(new Botan::McEliece_PrivateKey(rng, mce_n, mce_t)); } #endif #if defined(BOTAN_HAS_XMSS) if(alg_name == "XMSS") { return std::unique_ptr( new XMSS_PrivateKey(XMSS_Parameters(params.empty() ? "XMSS_SHA2-512_W16_H10" : params).oid(), rng)); } #endif #if defined(BOTAN_HAS_ED25519) if(alg_name == "Ed25519") { return std::unique_ptr(new Ed25519_PrivateKey(rng)); } #endif // ECC crypto #if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) if(alg_name == "ECDSA" || alg_name == "ECDH" || alg_name == "ECKCDSA" || alg_name == "ECGDSA" || alg_name == "SM2_Sig" || alg_name == "SM2_Enc" || alg_name == "GOST-34.10") { const EC_Group ec_group(params.empty() ? default_ec_group_for(alg_name) : params); #if defined(BOTAN_HAS_ECDSA) if(alg_name == "ECDSA") return std::unique_ptr(new ECDSA_PrivateKey(rng, ec_group)); #endif #if defined(BOTAN_HAS_ECDH) if(alg_name == "ECDH") return std::unique_ptr(new ECDH_PrivateKey(rng, ec_group)); #endif #if defined(BOTAN_HAS_ECKCDSA) if(alg_name == "ECKCDSA") return std::unique_ptr(new ECKCDSA_PrivateKey(rng, ec_group)); #endif #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return std::unique_ptr(new GOST_3410_PrivateKey(rng, ec_group)); #endif #if defined(BOTAN_HAS_SM2) if(alg_name == "SM2_Sig") return std::unique_ptr(new SM2_Signature_PrivateKey(rng, ec_group)); if(alg_name == "SM2_Enc") return std::unique_ptr(new SM2_Encryption_PrivateKey(rng, ec_group)); #endif #if defined(BOTAN_HAS_ECGDSA) if(alg_name == "ECGDSA") return std::unique_ptr(new ECGDSA_PrivateKey(rng, ec_group)); #endif } #endif // DL crypto #if defined(BOTAN_HAS_DL_GROUP) if(alg_name == "DH" || alg_name == "DSA" || alg_name == "ElGamal") { std::string default_group = (alg_name == "DSA") ? "dsa/botan/2048" : "modp/ietf/2048"; DL_Group modp_group(params.empty() ? default_group : params); #if defined(BOTAN_HAS_DIFFIE_HELLMAN) if(alg_name == "DH") return std::unique_ptr(new DH_PrivateKey(rng, modp_group)); #endif #if defined(BOTAN_HAS_DSA) if(alg_name == "DSA") return std::unique_ptr(new DSA_PrivateKey(rng, modp_group)); #endif #if defined(BOTAN_HAS_ELGAMAL) if(alg_name == "ElGamal") return std::unique_ptr(new ElGamal_PrivateKey(rng, modp_group)); #endif } #endif BOTAN_UNUSED(alg_name, rng, params, provider); return std::unique_ptr(); } std::vector probe_provider_private_key(const std::string& alg_name, const std::vector possible) { std::vector providers; for(auto&& prov : possible) { if(prov == "base" || #if defined(BOTAN_HAS_OPENSSL) (prov == "openssl" && alg_name == "RSA") || #endif 0) { providers.push_back(prov); // available } } BOTAN_UNUSED(alg_name); return providers; } } botan-2.4.0/src/lib/pubkey/pk_algs.h000066400000000000000000000025221322470703100172450ustar00rootroot00000000000000/* * PK Key Factory * (C) 1999-2010,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PK_KEY_FACTORY_H_ #define BOTAN_PK_KEY_FACTORY_H_ #include #include #include namespace Botan { BOTAN_PUBLIC_API(2,0) std::unique_ptr load_public_key(const AlgorithmIdentifier& alg_id, const std::vector& key_bits); BOTAN_PUBLIC_API(2,0) std::unique_ptr load_private_key(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Create a new key * For ECC keys, algo_params specifies EC group (eg, "secp256r1") * For DH/DSA/ElGamal keys, algo_params is DL group (eg, "modp/ietf/2048") * For RSA, algo_params is integer keylength * For McEliece, algo_params is n,t * If algo_params is left empty, suitable default parameters are chosen. */ BOTAN_PUBLIC_API(2,0) std::unique_ptr create_private_key(const std::string& algo_name, RandomNumberGenerator& rng, const std::string& algo_params = "", const std::string& provider = ""); BOTAN_PUBLIC_API(2,2) std::vector probe_provider_private_key(const std::string& algo_name, const std::vector possible); } #endif botan-2.4.0/src/lib/pubkey/pk_keys.cpp000066400000000000000000000104471322470703100176320ustar00rootroot00000000000000/* * PK Key Types * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { std::string create_hex_fingerprint(const uint8_t bits[], size_t bits_len, const std::string& hash_name) { std::unique_ptr hash_fn(HashFunction::create_or_throw(hash_name)); const std::string hex_hash = hex_encode(hash_fn->process(bits, bits_len)); std::string fprint; for(size_t i = 0; i != hex_hash.size(); i += 2) { if(i != 0) fprint.push_back(':'); fprint.push_back(hex_hash[i]); fprint.push_back(hex_hash[i+1]); } return fprint; } std::vector Public_Key::subject_public_key() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(algorithm_identifier()) .encode(public_key_bits(), BIT_STRING) .end_cons() .get_contents_unlocked(); } /* * Default OID access */ OID Public_Key::get_oid() const { try { return OIDS::lookup(algo_name()); } catch(Lookup_Error&) { throw Lookup_Error("PK algo " + algo_name() + " has no defined OIDs"); } } secure_vector Private_Key::private_key_info() const { const size_t PKCS8_VERSION = 0; return DER_Encoder() .start_cons(SEQUENCE) .encode(PKCS8_VERSION) .encode(pkcs8_algorithm_identifier()) .encode(private_key_bits(), OCTET_STRING) .end_cons() .get_contents(); } /* * Hash of the X.509 subjectPublicKey encoding */ std::string Public_Key::fingerprint_public(const std::string& hash_algo) const { return create_hex_fingerprint(subject_public_key(), hash_algo); } /* * Hash of the PKCS #8 encoding for this key object */ std::string Private_Key::fingerprint_private(const std::string& hash_algo) const { return create_hex_fingerprint(private_key_bits(), hash_algo); } std::unique_ptr Public_Key::create_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support encryption"); } std::unique_ptr Public_Key::create_kem_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support KEM encryption"); } std::unique_ptr Public_Key::create_verification_op(const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support verification"); } std::unique_ptr Private_Key::create_decryption_op(RandomNumberGenerator& /*rng*/, const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support decryption"); } std::unique_ptr Private_Key::create_kem_decryption_op(RandomNumberGenerator& /*rng*/, const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support KEM decryption"); } std::unique_ptr Private_Key::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support signatures"); } std::unique_ptr Private_Key::create_key_agreement_op(RandomNumberGenerator& /*rng*/, const std::string& /*params*/, const std::string& /*provider*/) const { throw Lookup_Error(algo_name() + " does not support key agreement"); } } botan-2.4.0/src/lib/pubkey/pk_keys.h000066400000000000000000000254521322470703100173010ustar00rootroot00000000000000/* * PK Key Types * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PK_KEYS_H_ #define BOTAN_PK_KEYS_H_ #include #include #include #include namespace Botan { class RandomNumberGenerator; /** * Public Key Base Class. */ class BOTAN_PUBLIC_API(2,0) Public_Key { public: Public_Key() =default; Public_Key(const Public_Key& other) = default; Public_Key& operator=(const Public_Key& other) = default; virtual ~Public_Key() = default; /** * Get the name of the underlying public key scheme. * @return name of the public key scheme */ virtual std::string algo_name() const = 0; /** * Return the estimated strength of the underlying key against * the best currently known attack. Note that this ignores anything * but pure attacks against the key itself and do not take into * account padding schemes, usage mistakes, etc which might reduce * the strength. However it does suffice to provide an upper bound. * * @return estimated strength in bits */ virtual size_t estimated_strength() const = 0; /** * Return an integer value best approximating the length of the * primary security parameter. For example for RSA this will be * the size of the modulus, for ECDSA the size of the ECC group, * and for McEliece the size of the code will be returned. */ virtual size_t key_length() const = 0; /** * Get the OID of the underlying public key scheme. * @return OID of the public key scheme */ virtual OID get_oid() const; /** * Test the key values for consistency. * @param rng rng to use * @param strong whether to perform strong and lengthy version * of the test * @return true if the test is passed */ virtual bool check_key(RandomNumberGenerator& rng, bool strong) const = 0; /** * @return X.509 AlgorithmIdentifier for this key */ virtual AlgorithmIdentifier algorithm_identifier() const = 0; /** * @return BER encoded public key bits */ virtual std::vector public_key_bits() const = 0; /** * @return X.509 subject key encoding for this key object */ std::vector subject_public_key() const; /** * @return Hash of the subject public key */ std::string fingerprint_public(const std::string& alg = "SHA-256") const; // Internal or non-public declarations follow /** * Returns more than 1 if the output of this algorithm * (ciphertext, signature) should be treated as more than one * value. This is used for algorithms like DSA and ECDSA, where * the (r,s) output pair can be encoded as either a plain binary * list or a TLV tagged DER encoding depending on the protocol. * * This function is public but applications should have few * reasons to ever call this. * * @return number of message parts */ virtual size_t message_parts() const { return 1; } /** * Returns how large each of the message parts refered to * by message_parts() is * * This function is public but applications should have few * reasons to ever call this. * * @return size of the message parts in bits */ virtual size_t message_part_size() const { return 0; } /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return an encryption operation for this key/params or throw * * @param rng a random number generator. The PK_Op may maintain a * reference to the RNG and use it many times. The rng must outlive * any operations which reference it. * @param params additional parameters * @param provider the provider to use */ virtual std::unique_ptr create_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const; /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return a KEM encryption operation for this key/params or throw * * @param rng a random number generator. The PK_Op may maintain a * reference to the RNG and use it many times. The rng must outlive * any operations which reference it. * @param params additional parameters * @param provider the provider to use */ virtual std::unique_ptr create_kem_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const; /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return a verification operation for this key/params or throw * @param params additional parameters * @param provider the provider to use */ virtual std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const; }; /** * Private Key Base Class */ class BOTAN_PUBLIC_API(2,0) Private_Key : public virtual Public_Key { public: Private_Key() = default; Private_Key(const Private_Key& other) = default; Private_Key& operator=(const Private_Key& other) = default; virtual ~Private_Key() = default; /** * @return BER encoded private key bits */ virtual secure_vector private_key_bits() const = 0; /** * @return PKCS #8 private key encoding for this key object */ secure_vector private_key_info() const; /** * @return PKCS #8 AlgorithmIdentifier for this key * Might be different from the X.509 identifier, but normally is not */ virtual AlgorithmIdentifier pkcs8_algorithm_identifier() const { return algorithm_identifier(); } // Internal or non-public declarations follow /** * @return Hash of the PKCS #8 encoding for this key object */ std::string fingerprint_private(const std::string& alg) const; BOTAN_DEPRECATED("Use fingerprint_private or fingerprint_public") inline std::string fingerprint(const std::string& alg) const { return fingerprint_private(alg); // match behavior in previous versions } /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return an decryption operation for this key/params or throw * * @param rng a random number generator. The PK_Op may maintain a * reference to the RNG and use it many times. The rng must outlive * any operations which reference it. * @param params additional parameters * @param provider the provider to use * */ virtual std::unique_ptr create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const; /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return a KEM decryption operation for this key/params or throw * * @param rng a random number generator. The PK_Op may maintain a * reference to the RNG and use it many times. The rng must outlive * any operations which reference it. * @param params additional parameters * @param provider the provider to use */ virtual std::unique_ptr create_kem_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const; /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return a signature operation for this key/params or throw * * @param rng a random number generator. The PK_Op may maintain a * reference to the RNG and use it many times. The rng must outlive * any operations which reference it. * @param params additional parameters * @param provider the provider to use */ virtual std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const; /** * This is an internal library function exposed on key types. * In almost all cases applications should use wrappers in pubkey.h * * Return a key agreement operation for this key/params or throw * * @param rng a random number generator. The PK_Op may maintain a * reference to the RNG and use it many times. The rng must outlive * any operations which reference it. * @param params additional parameters * @param provider the provider to use */ virtual std::unique_ptr create_key_agreement_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const; }; /** * PK Secret Value Derivation Key */ class BOTAN_PUBLIC_API(2,0) PK_Key_Agreement_Key : public virtual Private_Key { public: /* * @return public component of this key */ virtual std::vector public_value() const = 0; PK_Key_Agreement_Key() = default; PK_Key_Agreement_Key(const PK_Key_Agreement_Key&) = default; PK_Key_Agreement_Key& operator=(const PK_Key_Agreement_Key&) = default; virtual ~PK_Key_Agreement_Key() = default; }; /* * Old compat typedefs * TODO: remove these? */ typedef PK_Key_Agreement_Key PK_KA_Key; typedef Public_Key X509_PublicKey; typedef Private_Key PKCS8_PrivateKey; std::string BOTAN_PUBLIC_API(2,4) create_hex_fingerprint(const uint8_t bits[], size_t len, const std::string& hash_name); template std::string create_hex_fingerprint(const std::vector& vec, const std::string& hash_name) { return create_hex_fingerprint(vec.data(), vec.size(), hash_name); } } #endif botan-2.4.0/src/lib/pubkey/pk_ops.cpp000066400000000000000000000130471322470703100174570ustar00rootroot00000000000000/* * PK Operation Types * (C) 2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { PK_Ops::Encryption_with_EME::Encryption_with_EME(const std::string& eme) { m_eme.reset(get_eme(eme)); if(!m_eme.get()) throw Algorithm_Not_Found(eme); } size_t PK_Ops::Encryption_with_EME::max_input_bits() const { return m_eme->maximum_input_size(max_raw_input_bits()); } secure_vector PK_Ops::Encryption_with_EME::encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) { const size_t max_raw = max_raw_input_bits(); const std::vector encoded = unlock(m_eme->encode(msg, msg_len, max_raw, rng)); return raw_encrypt(encoded.data(), encoded.size(), rng); } PK_Ops::Decryption_with_EME::Decryption_with_EME(const std::string& eme) { m_eme.reset(get_eme(eme)); if(!m_eme.get()) throw Algorithm_Not_Found(eme); } secure_vector PK_Ops::Decryption_with_EME::decrypt(uint8_t& valid_mask, const uint8_t ciphertext[], size_t ciphertext_len) { const secure_vector raw = raw_decrypt(ciphertext, ciphertext_len); return m_eme->unpad(valid_mask, raw.data(), raw.size()); } PK_Ops::Key_Agreement_with_KDF::Key_Agreement_with_KDF(const std::string& kdf) { if(kdf != "Raw") m_kdf.reset(get_kdf(kdf)); } secure_vector PK_Ops::Key_Agreement_with_KDF::agree(size_t key_len, const uint8_t w[], size_t w_len, const uint8_t salt[], size_t salt_len) { secure_vector z = raw_agree(w, w_len); if(m_kdf) return m_kdf->derive_key(key_len, z, salt, salt_len); return z; } PK_Ops::Signature_with_EMSA::Signature_with_EMSA(const std::string& emsa) : Signature(), m_emsa(get_emsa(emsa)), m_hash(hash_for_emsa(emsa)), m_prefix_used(false) { if(!m_emsa) throw Algorithm_Not_Found(emsa); } void PK_Ops::Signature_with_EMSA::update(const uint8_t msg[], size_t msg_len) { if(has_prefix() && !m_prefix_used) { m_prefix_used = true; secure_vector prefix = message_prefix(); m_emsa->update(prefix.data(), prefix.size()); } m_emsa->update(msg, msg_len); } secure_vector PK_Ops::Signature_with_EMSA::sign(RandomNumberGenerator& rng) { m_prefix_used = false; const secure_vector msg = m_emsa->raw_data(); const auto padded = m_emsa->encoding_of(msg, this->max_input_bits(), rng); return raw_sign(padded.data(), padded.size(), rng); } PK_Ops::Verification_with_EMSA::Verification_with_EMSA(const std::string& emsa) : Verification(), m_emsa(get_emsa(emsa)), m_hash(hash_for_emsa(emsa)), m_prefix_used(false) { if(!m_emsa) throw Algorithm_Not_Found(emsa); } void PK_Ops::Verification_with_EMSA::update(const uint8_t msg[], size_t msg_len) { if(has_prefix() && !m_prefix_used) { m_prefix_used = true; secure_vector prefix = message_prefix(); m_emsa->update(prefix.data(), prefix.size()); } m_emsa->update(msg, msg_len); } bool PK_Ops::Verification_with_EMSA::is_valid_signature(const uint8_t sig[], size_t sig_len) { m_prefix_used = false; const secure_vector msg = m_emsa->raw_data(); if(with_recovery()) { secure_vector output_of_key = verify_mr(sig, sig_len); return m_emsa->verify(output_of_key, msg, max_input_bits()); } else { Null_RNG rng; secure_vector encoded = m_emsa->encoding_of(msg, max_input_bits(), rng); return verify(encoded.data(), encoded.size(), sig, sig_len); } } void PK_Ops::KEM_Encryption_with_KDF::kem_encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng, const uint8_t salt[], size_t salt_len) { secure_vector raw_shared; this->raw_kem_encrypt(out_encapsulated_key, raw_shared, rng); out_shared_key = m_kdf->derive_key(desired_shared_key_len, raw_shared.data(), raw_shared.size(), salt, salt_len); } PK_Ops::KEM_Encryption_with_KDF::KEM_Encryption_with_KDF(const std::string& kdf) { m_kdf.reset(get_kdf(kdf)); } secure_vector PK_Ops::KEM_Decryption_with_KDF::kem_decrypt(const uint8_t encap_key[], size_t len, size_t desired_shared_key_len, const uint8_t salt[], size_t salt_len) { secure_vector raw_shared = this->raw_kem_decrypt(encap_key, len); return m_kdf->derive_key(desired_shared_key_len, raw_shared.data(), raw_shared.size(), salt, salt_len); } PK_Ops::KEM_Decryption_with_KDF::KEM_Decryption_with_KDF(const std::string& kdf) { m_kdf.reset(get_kdf(kdf)); } } botan-2.4.0/src/lib/pubkey/pk_ops.h000066400000000000000000000100221322470703100171120ustar00rootroot00000000000000/* * (C) 2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PK_OPERATIONS_H_ #define BOTAN_PK_OPERATIONS_H_ /** * Ordinary applications should never need to include or use this * header. It is exposed only for specialized applications which want * to implement new versions of public key crypto without merging them * as changes to the library. One actual example of such usage is an * application which creates RSA signatures using a custom TPM library. * Unless you're doing something like that, you don't need anything * here. Instead use pubkey.h which wraps these types safely and * provides a stable application-oriented API. */ #include #include namespace Botan { class RandomNumberGenerator; class EME; class KDF; class EMSA; namespace PK_Ops { /** * Public key encryption interface */ class BOTAN_PUBLIC_API(2,0) Encryption { public: virtual secure_vector encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) = 0; virtual size_t max_input_bits() const = 0; virtual ~Encryption() = default; }; /** * Public key decryption interface */ class BOTAN_PUBLIC_API(2,0) Decryption { public: virtual secure_vector decrypt(uint8_t& valid_mask, const uint8_t ciphertext[], size_t ciphertext_len) = 0; virtual ~Decryption() = default; }; /** * Public key signature verification interface */ class BOTAN_PUBLIC_API(2,0) Verification { public: /* * Add more data to the message currently being signed * @param msg the message * @param msg_len the length of msg in bytes */ virtual void update(const uint8_t msg[], size_t msg_len) = 0; /* * Perform a verification operation * @param rng a random number generator */ virtual bool is_valid_signature(const uint8_t sig[], size_t sig_len) = 0; virtual ~Verification() = default; }; /** * Public key signature creation interface */ class BOTAN_PUBLIC_API(2,0) Signature { public: /* * Add more data to the message currently being signed * @param msg the message * @param msg_len the length of msg in bytes */ virtual void update(const uint8_t msg[], size_t msg_len) = 0; /* * Perform a signature operation * @param rng a random number generator */ virtual secure_vector sign(RandomNumberGenerator& rng) = 0; virtual ~Signature() = default; }; /** * A generic key agreement operation (eg DH or ECDH) */ class BOTAN_PUBLIC_API(2,0) Key_Agreement { public: virtual secure_vector agree(size_t key_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len) = 0; virtual ~Key_Agreement() = default; }; /** * KEM (key encapsulation) */ class BOTAN_PUBLIC_API(2,0) KEM_Encryption { public: virtual void kem_encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng, const uint8_t salt[], size_t salt_len) = 0; virtual ~KEM_Encryption() = default; }; class BOTAN_PUBLIC_API(2,0) KEM_Decryption { public: virtual secure_vector kem_decrypt(const uint8_t encap_key[], size_t len, size_t desired_shared_key_len, const uint8_t salt[], size_t salt_len) = 0; virtual ~KEM_Decryption() = default; }; } } #endif botan-2.4.0/src/lib/pubkey/pk_ops_fwd.h000066400000000000000000000006171322470703100177630ustar00rootroot00000000000000/* * PK Operation Types Forward Decls * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PK_OPERATIONS_FWD_H_ #define BOTAN_PK_OPERATIONS_FWD_H_ namespace Botan { namespace PK_Ops { class Encryption; class Decryption; class Verification; class Signature; class Key_Agreement; class KEM_Encryption; class KEM_Decryption; } } #endif botan-2.4.0/src/lib/pubkey/pk_ops_impl.h000066400000000000000000000163301322470703100201430ustar00rootroot00000000000000 /* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PK_OPERATION_IMPL_H_ #define BOTAN_PK_OPERATION_IMPL_H_ #include #include #include #include namespace Botan { namespace PK_Ops { class Encryption_with_EME : public Encryption { public: size_t max_input_bits() const override; secure_vector encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override; ~Encryption_with_EME() = default; protected: explicit Encryption_with_EME(const std::string& eme); private: virtual size_t max_raw_input_bits() const = 0; virtual secure_vector raw_encrypt(const uint8_t msg[], size_t len, RandomNumberGenerator& rng) = 0; std::unique_ptr m_eme; }; class Decryption_with_EME : public Decryption { public: secure_vector decrypt(uint8_t& valid_mask, const uint8_t msg[], size_t msg_len) override; ~Decryption_with_EME() = default; protected: explicit Decryption_with_EME(const std::string& eme); private: virtual size_t max_raw_input_bits() const = 0; virtual secure_vector raw_decrypt(const uint8_t msg[], size_t len) = 0; std::unique_ptr m_eme; }; class Verification_with_EMSA : public Verification { public: ~Verification_with_EMSA() = default; void update(const uint8_t msg[], size_t msg_len) override; bool is_valid_signature(const uint8_t sig[], size_t sig_len) override; bool do_check(const secure_vector& msg, const uint8_t sig[], size_t sig_len); std::string hash_for_signature() { return m_hash; } protected: explicit Verification_with_EMSA(const std::string& emsa); /** * Get the maximum message size in bits supported by this public key. * @return maximum message in bits */ virtual size_t max_input_bits() const = 0; /** * @return boolean specifying if this signature scheme uses * a message prefix returned by message_prefix() */ virtual bool has_prefix() { return false; } /** * @return the message prefix if this signature scheme uses * a message prefix, signaled via has_prefix() */ virtual secure_vector message_prefix() const { throw Exception( "No prefix" ); } /** * @return boolean specifying if this key type supports message * recovery and thus if you need to call verify() or verify_mr() */ virtual bool with_recovery() const = 0; /* * Perform a signature check operation * @param msg the message * @param msg_len the length of msg in bytes * @param sig the signature * @param sig_len the length of sig in bytes * @returns if signature is a valid one for message */ virtual bool verify(const uint8_t[], size_t, const uint8_t[], size_t) { throw Invalid_State("Message recovery required"); } /* * Perform a signature operation (with message recovery) * Only call this if with_recovery() returns true * @param msg the message * @param msg_len the length of msg in bytes * @returns recovered message */ virtual secure_vector verify_mr(const uint8_t[], size_t) { throw Invalid_State("Message recovery not supported"); } std::unique_ptr clone_emsa() const { return std::unique_ptr(m_emsa->clone()); } private: std::unique_ptr m_emsa; const std::string m_hash; bool m_prefix_used; }; class Signature_with_EMSA : public Signature { public: void update(const uint8_t msg[], size_t msg_len) override; secure_vector sign(RandomNumberGenerator& rng) override; protected: explicit Signature_with_EMSA(const std::string& emsa); ~Signature_with_EMSA() = default; std::string hash_for_signature() { return m_hash; } /** * @return boolean specifying if this signature scheme uses * a message prefix returned by message_prefix() */ virtual bool has_prefix() { return false; } /** * @return the message prefix if this signature scheme uses * a message prefix, signaled via has_prefix() */ virtual secure_vector message_prefix() const { throw Exception( "No prefix" ); } std::unique_ptr clone_emsa() const { return std::unique_ptr(m_emsa->clone()); } private: /** * Get the maximum message size in bits supported by this public key. * @return maximum message in bits */ virtual size_t max_input_bits() const = 0; bool self_test_signature(const std::vector& msg, const std::vector& sig) const; virtual secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) = 0; std::unique_ptr m_emsa; const std::string m_hash; bool m_prefix_used; }; class Key_Agreement_with_KDF : public Key_Agreement { public: secure_vector agree(size_t key_len, const uint8_t other_key[], size_t other_key_len, const uint8_t salt[], size_t salt_len) override; protected: explicit Key_Agreement_with_KDF(const std::string& kdf); ~Key_Agreement_with_KDF() = default; private: virtual secure_vector raw_agree(const uint8_t w[], size_t w_len) = 0; std::unique_ptr m_kdf; }; class KEM_Encryption_with_KDF : public KEM_Encryption { public: void kem_encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng, const uint8_t salt[], size_t salt_len) override; protected: virtual void raw_kem_encrypt(secure_vector& out_encapsulated_key, secure_vector& raw_shared_key, Botan::RandomNumberGenerator& rng) = 0; explicit KEM_Encryption_with_KDF(const std::string& kdf); ~KEM_Encryption_with_KDF() = default; private: std::unique_ptr m_kdf; }; class KEM_Decryption_with_KDF : public KEM_Decryption { public: secure_vector kem_decrypt(const uint8_t encap_key[], size_t len, size_t desired_shared_key_len, const uint8_t salt[], size_t salt_len) override; protected: virtual secure_vector raw_kem_decrypt(const uint8_t encap_key[], size_t len) = 0; explicit KEM_Decryption_with_KDF(const std::string& kdf); ~KEM_Decryption_with_KDF() = default; private: std::unique_ptr m_kdf; }; } } #endif botan-2.4.0/src/lib/pubkey/pkcs8.cpp000066400000000000000000000307461322470703100172210ustar00rootroot00000000000000/* * PKCS #8 * (C) 1999-2010,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace PKCS8 { namespace { /* * Get info from an EncryptedPrivateKeyInfo */ secure_vector PKCS8_extract(DataSource& source, AlgorithmIdentifier& pbe_alg_id) { secure_vector key_data; BER_Decoder(source) .start_cons(SEQUENCE) .decode(pbe_alg_id) .decode(key_data, OCTET_STRING) .verify_end(); return key_data; } /* * PEM decode and/or decrypt a private key */ secure_vector PKCS8_decode( DataSource& source, std::function get_passphrase, AlgorithmIdentifier& pk_alg_id, bool is_encrypted) { AlgorithmIdentifier pbe_alg_id; secure_vector key_data, key; try { if(ASN1::maybe_BER(source) && !PEM_Code::matches(source)) { if ( is_encrypted ) { key_data = PKCS8_extract(source, pbe_alg_id); } else { // todo read more efficiently while ( !source.end_of_data() ) { uint8_t b; size_t read = source.read_byte( b ); if ( read ) { key_data.push_back( b ); } } } } else { std::string label; key_data = PEM_Code::decode(source, label); // todo remove autodetect for pem as well? if(label == "PRIVATE KEY") is_encrypted = false; else if(label == "ENCRYPTED PRIVATE KEY") { DataSource_Memory key_source(key_data); key_data = PKCS8_extract(key_source, pbe_alg_id); } else throw PKCS8_Exception("Unknown PEM label " + label); } if(key_data.empty()) throw PKCS8_Exception("No key data found"); } catch(Decoding_Error& e) { throw Decoding_Error("PKCS #8 private key decoding failed: " + std::string(e.what())); } try { if(is_encrypted) { if(OIDS::lookup(pbe_alg_id.get_oid()) != "PBE-PKCS5v20") throw Exception("Unknown PBE type " + pbe_alg_id.get_oid().as_string()); key = pbes2_decrypt(key_data, get_passphrase(), pbe_alg_id.get_parameters()); } else key = key_data; BER_Decoder(key) .start_cons(SEQUENCE) .decode_and_check(0, "Unknown PKCS #8 version number") .decode(pk_alg_id) .decode(key, OCTET_STRING) .discard_remaining() .end_cons(); } catch(std::exception& e) { throw Decoding_Error("PKCS #8 private key decoding failed: " + std::string(e.what())); } return key; } } /* * BER encode a PKCS #8 private key, unencrypted */ secure_vector BER_encode(const Private_Key& key) { // keeping around for compat return key.private_key_info(); } /* * PEM encode a PKCS #8 private key, unencrypted */ std::string PEM_encode(const Private_Key& key) { return PEM_Code::encode(PKCS8::BER_encode(key), "PRIVATE KEY"); } namespace { std::pair choose_pbe_params(const std::string& pbe_algo, const std::string& key_algo) { if(pbe_algo.empty()) { // Defaults: if(key_algo == "Curve25519" || key_algo == "McEliece") return std::make_pair("AES-256/GCM", "SHA-512"); else // for everything else (RSA, DSA, ECDSA, GOST, ...) return std::make_pair("AES-256/CBC", "SHA-256"); } SCAN_Name request(pbe_algo); if(request.algo_name() != "PBE-PKCS5v20" || request.arg_count() != 2) throw Exception("Unsupported PBE " + pbe_algo); return std::make_pair(request.arg(1), request.arg(0)); } } /* * BER encode a PKCS #8 private key, encrypted */ std::vector BER_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds msec, const std::string& pbe_algo) { const auto pbe_params = choose_pbe_params(pbe_algo, key.algo_name()); const std::pair> pbe_info = pbes2_encrypt_msec(PKCS8::BER_encode(key), pass, msec, nullptr, pbe_params.first, pbe_params.second, rng); return DER_Encoder() .start_cons(SEQUENCE) .encode(pbe_info.first) .encode(pbe_info.second, OCTET_STRING) .end_cons() .get_contents_unlocked(); } /* * PEM encode a PKCS #8 private key, encrypted */ std::string PEM_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds msec, const std::string& pbe_algo) { if(pass.empty()) return PEM_encode(key); return PEM_Code::encode(PKCS8::BER_encode(key, rng, pass, msec, pbe_algo), "ENCRYPTED PRIVATE KEY"); } /* * BER encode a PKCS #8 private key, encrypted */ std::vector BER_encode_encrypted_pbkdf_iter(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, size_t pbkdf_iterations, const std::string& cipher, const std::string& pbkdf_hash) { const std::pair> pbe_info = pbes2_encrypt_iter(key.private_key_info(), pass, pbkdf_iterations, cipher.empty() ? "AES-256/CBC" : cipher, pbkdf_hash.empty() ? "SHA-256" : pbkdf_hash, rng); return DER_Encoder() .start_cons(SEQUENCE) .encode(pbe_info.first) .encode(pbe_info.second, OCTET_STRING) .end_cons() .get_contents_unlocked(); } /* * PEM encode a PKCS #8 private key, encrypted */ std::string PEM_encode_encrypted_pbkdf_iter(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, size_t pbkdf_iterations, const std::string& cipher, const std::string& pbkdf_hash) { return PEM_Code::encode( PKCS8::BER_encode_encrypted_pbkdf_iter(key, rng, pass, pbkdf_iterations, cipher, pbkdf_hash), "ENCRYPTED PRIVATE KEY"); } /* * BER encode a PKCS #8 private key, encrypted */ std::vector BER_encode_encrypted_pbkdf_msec(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds pbkdf_msec, size_t* pbkdf_iterations, const std::string& cipher, const std::string& pbkdf_hash) { const std::pair> pbe_info = pbes2_encrypt_msec(key.private_key_info(), pass, pbkdf_msec, pbkdf_iterations, cipher.empty() ? "AES-256/CBC" : cipher, pbkdf_hash.empty() ? "SHA-256" : pbkdf_hash, rng); return DER_Encoder() .start_cons(SEQUENCE) .encode(pbe_info.first) .encode(pbe_info.second, OCTET_STRING) .end_cons() .get_contents_unlocked(); } /* * PEM encode a PKCS #8 private key, encrypted */ std::string PEM_encode_encrypted_pbkdf_msec(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds pbkdf_msec, size_t* pbkdf_iterations, const std::string& cipher, const std::string& pbkdf_hash) { return PEM_Code::encode( PKCS8::BER_encode_encrypted_pbkdf_msec(key, rng, pass, pbkdf_msec, pbkdf_iterations, cipher, pbkdf_hash), "ENCRYPTED PRIVATE KEY"); } namespace { /* * Extract a private key (encrypted/unencrypted) and return it */ std::unique_ptr load_key(DataSource& source, std::function get_pass, bool is_encrypted) { AlgorithmIdentifier alg_id; secure_vector pkcs8_key = PKCS8_decode(source, get_pass, alg_id, is_encrypted); const std::string alg_name = OIDS::lookup(alg_id.get_oid()); if(alg_name.empty() || alg_name == alg_id.get_oid().as_string()) throw PKCS8_Exception("Unknown algorithm OID: " + alg_id.get_oid().as_string()); return load_private_key(alg_id, pkcs8_key); } } /* * Extract an encrypted private key and return it */ std::unique_ptr load_key(DataSource& source, std::function get_pass) { return load_key(source, get_pass, true); } /* * Extract an encrypted private key and return it */ std::unique_ptr load_key(DataSource& source, const std::string& pass) { return load_key(source, [pass]() { return pass; }, true); } /* * Extract an unencrypted private key and return it */ std::unique_ptr load_key(DataSource& source) { auto fail_fn = []() -> std::string { throw PKCS8_Exception("Internal error: Attempt to read password for unencrypted key"); }; return load_key(source, fail_fn, false); } /* * Make a copy of this private key */ std::unique_ptr copy_key(const Private_Key& key) { DataSource_Memory source(PEM_encode(key)); return PKCS8::load_key(source); } /* * Extract an encrypted private key and return it */ Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, std::function get_pass) { BOTAN_UNUSED(rng); return PKCS8::load_key(source, get_pass).release(); } /* * Extract an encrypted private key and return it */ Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, const std::string& pass) { BOTAN_UNUSED(rng); return PKCS8::load_key(source, pass).release(); } /* * Extract an unencrypted private key and return it */ Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng) { BOTAN_UNUSED(rng); return PKCS8::load_key(source).release(); } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /* * Extract an encrypted private key and return it */ Private_Key* load_key(const std::string& fsname, RandomNumberGenerator& rng, std::function get_pass) { BOTAN_UNUSED(rng); DataSource_Stream in(fsname); return PKCS8::load_key(in, get_pass).release(); } /* * Extract an encrypted private key and return it */ Private_Key* load_key(const std::string& fsname, RandomNumberGenerator& rng, const std::string& pass) { BOTAN_UNUSED(rng); DataSource_Stream in(fsname); return PKCS8::load_key(in, [pass]() { return pass; }).release(); } /* * Extract an unencrypted private key and return it */ Private_Key* load_key(const std::string& fsname, RandomNumberGenerator& rng) { BOTAN_UNUSED(rng); DataSource_Stream in(fsname); return PKCS8::load_key(in).release(); } #endif /* * Make a copy of this private key */ Private_Key* copy_key(const Private_Key& key, RandomNumberGenerator& rng) { BOTAN_UNUSED(rng); return PKCS8::copy_key(key).release(); } } } botan-2.4.0/src/lib/pubkey/pkcs8.h000066400000000000000000000252761322470703100166700ustar00rootroot00000000000000/* * PKCS #8 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PKCS8_H_ #define BOTAN_PKCS8_H_ #include #include #include #include #include #include namespace Botan { class DataSource; class RandomNumberGenerator; /** * PKCS #8 General Exception */ class BOTAN_PUBLIC_API(2,0) PKCS8_Exception final : public Decoding_Error { public: explicit PKCS8_Exception(const std::string& error) : Decoding_Error("PKCS #8: " + error) {} }; /** * This namespace contains functions for handling PKCS #8 private keys */ namespace PKCS8 { /** * BER encode a private key * @param key the private key to encode * @return BER encoded key */ BOTAN_PUBLIC_API(2,0) secure_vector BER_encode(const Private_Key& key); /** * Get a string containing a PEM encoded private key. * @param key the key to encode * @return encoded key */ BOTAN_PUBLIC_API(2,0) std::string PEM_encode(const Private_Key& key); /** * Encrypt a key using PKCS #8 encryption * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param msec number of milliseconds to run the password derivation * @param pbe_algo the name of the desired password-based encryption * algorithm; if empty ("") a reasonable (portable/secure) * default will be chosen. * @return encrypted key in binary BER form */ BOTAN_PUBLIC_API(2,0) std::vector BER_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds msec = std::chrono::milliseconds(300), const std::string& pbe_algo = ""); /** * Get a string containing a PEM encoded private key, encrypting it with a * password. * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param msec number of milliseconds to run the password derivation * @param pbe_algo the name of the desired password-based encryption * algorithm; if empty ("") a reasonable (portable/secure) * default will be chosen. * @return encrypted key in PEM form */ BOTAN_PUBLIC_API(2,0) std::string PEM_encode(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds msec = std::chrono::milliseconds(300), const std::string& pbe_algo = ""); /** * Encrypt a key using PKCS #8 encryption and a fixed iteration count * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param pbkdf_iter number of interations to run PBKDF2 * @param cipher if non-empty specifies the cipher to use. CBC and GCM modes * are supported, for example "AES-128/CBC", "AES-256/GCM", "Serpent/CBC". * If empty a suitable default is chosen. * @param pbkdf_hash if non-empty specifies the PBKDF hash function to use. * For example "SHA-256" or "SHA-384". If empty a suitable default is chosen. * @return encrypted key in binary BER form */ BOTAN_PUBLIC_API(2,1) std::vector BER_encode_encrypted_pbkdf_iter(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, size_t pbkdf_iter, const std::string& cipher = "", const std::string& pbkdf_hash = ""); /** * Get a string containing a PEM encoded private key, encrypting it with a * password. * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param pbkdf_iter number of iterations to run PBKDF * @param cipher if non-empty specifies the cipher to use. CBC and GCM modes * are supported, for example "AES-128/CBC", "AES-256/GCM", "Serpent/CBC". * If empty a suitable default is chosen. * @param pbkdf_hash if non-empty specifies the PBKDF hash function to use. * For example "SHA-256" or "SHA-384". If empty a suitable default is chosen. * @return encrypted key in PEM form */ BOTAN_PUBLIC_API(2,1) std::string PEM_encode_encrypted_pbkdf_iter(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, size_t pbkdf_iter, const std::string& cipher = "", const std::string& pbkdf_hash = ""); /** * Encrypt a key using PKCS #8 encryption and a variable iteration count * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param pbkdf_msec how long to run PBKDF2 * @param pbkdf_iterations if non-null, set to the number of iterations used * @param cipher if non-empty specifies the cipher to use. CBC and GCM modes * are supported, for example "AES-128/CBC", "AES-256/GCM", "Serpent/CBC". * If empty a suitable default is chosen. * @param pbkdf_hash if non-empty specifies the PBKDF hash function to use. * For example "SHA-256" or "SHA-384". If empty a suitable default is chosen. * @return encrypted key in binary BER form */ BOTAN_PUBLIC_API(2,1) std::vector BER_encode_encrypted_pbkdf_msec(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds pbkdf_msec, size_t* pbkdf_iterations, const std::string& cipher = "", const std::string& pbkdf_hash = ""); /** * Get a string containing a PEM encoded private key, encrypting it with a * password. * @param key the key to encode * @param rng the rng to use * @param pass the password to use for encryption * @param pbkdf_msec how long in milliseconds to run PBKDF2 * @param pbkdf_iterations (output argument) number of iterations of PBKDF * that ended up being used * @param cipher if non-empty specifies the cipher to use. CBC and GCM modes * are supported, for example "AES-128/CBC", "AES-256/GCM", "Serpent/CBC". * If empty a suitable default is chosen. * @param pbkdf_hash if non-empty specifies the PBKDF hash function to use. * For example "SHA-256" or "SHA-384". If empty a suitable default is chosen. * @return encrypted key in PEM form */ BOTAN_PUBLIC_API(2,1) std::string PEM_encode_encrypted_pbkdf_msec(const Private_Key& key, RandomNumberGenerator& rng, const std::string& pass, std::chrono::milliseconds pbkdf_msec, size_t* pbkdf_iterations, const std::string& cipher = "", const std::string& pbkdf_hash = ""); /** * Load an encrypted key from a data source. * @param source the data source providing the encoded key * @param rng ignored for compatability * @param get_passphrase a function that returns passphrases * @return loaded private key object */ BOTAN_PUBLIC_API(2,0) Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, std::function get_passphrase); /** Load an encrypted key from a data source. * @param source the data source providing the encoded key * @param rng ignored for compatability * @param pass the passphrase to decrypt the key * @return loaded private key object */ BOTAN_PUBLIC_API(2,0) Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng, const std::string& pass); /** Load an unencrypted key from a data source. * @param source the data source providing the encoded key * @param rng ignored for compatability * @return loaded private key object */ BOTAN_PUBLIC_API(2,0) Private_Key* load_key(DataSource& source, RandomNumberGenerator& rng); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Load an encrypted key from a file. * @param filename the path to the file containing the encoded key * @param rng ignored for compatability * @param get_passphrase a function that returns passphrases * @return loaded private key object */ BOTAN_PUBLIC_API(2,0) Private_Key* load_key(const std::string& filename, RandomNumberGenerator& rng, std::function get_passphrase); /** Load an encrypted key from a file. * @param filename the path to the file containing the encoded key * @param rng ignored for compatability * @param pass the passphrase to decrypt the key * @return loaded private key object */ BOTAN_PUBLIC_API(2,0) Private_Key* load_key(const std::string& filename, RandomNumberGenerator& rng, const std::string& pass); /** Load an unencrypted key from a file. * @param filename the path to the file containing the encoded key * @param rng ignored for compatability * @return loaded private key object */ BOTAN_PUBLIC_API(2,0) Private_Key* load_key(const std::string& filename, RandomNumberGenerator& rng); #endif /** * Copy an existing encoded key object. * @param key the key to copy * @param rng ignored for compatability * @return new copy of the key */ BOTAN_PUBLIC_API(2,0) Private_Key* copy_key(const Private_Key& key, RandomNumberGenerator& rng); /** * Load an encrypted key from a data source. * @param source the data source providing the encoded key * @param get_passphrase a function that returns passphrases * @return loaded private key object */ BOTAN_PUBLIC_API(2,3) std::unique_ptr load_key(DataSource& source, std::function get_passphrase); /** Load an encrypted key from a data source. * @param source the data source providing the encoded key * @param pass the passphrase to decrypt the key * @return loaded private key object */ BOTAN_PUBLIC_API(2,3) std::unique_ptr load_key(DataSource& source, const std::string& pass); /** Load an unencrypted key from a data source. * @param source the data source providing the encoded key * @return loaded private key object */ BOTAN_PUBLIC_API(2,3) std::unique_ptr load_key(DataSource& source); /** * Copy an existing encoded key object. * @param key the key to copy * @return new copy of the key */ BOTAN_PUBLIC_API(2,3) std::unique_ptr copy_key(const Private_Key& key); } } #endif botan-2.4.0/src/lib/pubkey/pubkey.cpp000066400000000000000000000253651322470703100174710ustar00rootroot00000000000000/* * (C) 1999-2010,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { secure_vector PK_Decryptor::decrypt(const uint8_t in[], size_t length) const { uint8_t valid_mask = 0; secure_vector decoded = do_decrypt(valid_mask, in, length); if(valid_mask == 0) throw Decoding_Error("Invalid public key ciphertext, cannot decrypt"); return decoded; } secure_vector PK_Decryptor::decrypt_or_random(const uint8_t in[], size_t length, size_t expected_pt_len, RandomNumberGenerator& rng, const uint8_t required_content_bytes[], const uint8_t required_content_offsets[], size_t required_contents_length) const { const secure_vector fake_pms = rng.random_vec(expected_pt_len); uint8_t valid_mask = 0; secure_vector decoded = do_decrypt(valid_mask, in, length); valid_mask &= CT::is_equal(decoded.size(), expected_pt_len); decoded.resize(expected_pt_len); for(size_t i = 0; i != required_contents_length; ++i) { /* These values are chosen by the application and for TLS are constants, so this early failure via assert is fine since we know 0,1 < 48 If there is a protocol that has content checks on the key where the expected offsets are controllable by the attacker this could still leak. Alternately could always reduce the offset modulo the length? */ const uint8_t exp = required_content_bytes[i]; const uint8_t off = required_content_offsets[i]; BOTAN_ASSERT(off < expected_pt_len, "Offset in range of plaintext"); valid_mask &= CT::is_equal(decoded[off], exp); } CT::conditional_copy_mem(valid_mask, /*output*/decoded.data(), /*from0*/decoded.data(), /*from1*/fake_pms.data(), expected_pt_len); return decoded; } secure_vector PK_Decryptor::decrypt_or_random(const uint8_t in[], size_t length, size_t expected_pt_len, RandomNumberGenerator& rng) const { return decrypt_or_random(in, length, expected_pt_len, rng, nullptr, nullptr, 0); } PK_Encryptor_EME::PK_Encryptor_EME(const Public_Key& key, RandomNumberGenerator& rng, const std::string& padding, const std::string& provider) { m_op = key.create_encryption_op(rng, padding, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support encryption"); } PK_Encryptor_EME::~PK_Encryptor_EME() { /* for unique_ptr */ } std::vector PK_Encryptor_EME::enc(const uint8_t in[], size_t length, RandomNumberGenerator& rng) const { return unlock(m_op->encrypt(in, length, rng)); } size_t PK_Encryptor_EME::maximum_input_size() const { return m_op->max_input_bits() / 8; } PK_Decryptor_EME::PK_Decryptor_EME(const Private_Key& key, RandomNumberGenerator& rng, const std::string& padding, const std::string& provider) { m_op = key.create_decryption_op(rng, padding, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support decryption"); } PK_Decryptor_EME::~PK_Decryptor_EME() { /* for unique_ptr */ } secure_vector PK_Decryptor_EME::do_decrypt(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const { return m_op->decrypt(valid_mask, in, in_len); } PK_KEM_Encryptor::PK_KEM_Encryptor(const Public_Key& key, RandomNumberGenerator& rng, const std::string& param, const std::string& provider) { m_op = key.create_kem_encryption_op(rng, param, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support KEM encryption"); } PK_KEM_Encryptor::~PK_KEM_Encryptor() { /* for unique_ptr */ } void PK_KEM_Encryptor::encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng, const uint8_t salt[], size_t salt_len) { m_op->kem_encrypt(out_encapsulated_key, out_shared_key, desired_shared_key_len, rng, salt, salt_len); } PK_KEM_Decryptor::PK_KEM_Decryptor(const Private_Key& key, RandomNumberGenerator& rng, const std::string& param, const std::string& provider) { m_op = key.create_kem_decryption_op(rng, param, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support KEM decryption"); } PK_KEM_Decryptor::~PK_KEM_Decryptor() { /* for unique_ptr */ } secure_vector PK_KEM_Decryptor::decrypt(const uint8_t encap_key[], size_t encap_key_len, size_t desired_shared_key_len, const uint8_t salt[], size_t salt_len) { return m_op->kem_decrypt(encap_key, encap_key_len, desired_shared_key_len, salt, salt_len); } PK_Key_Agreement::PK_Key_Agreement(const Private_Key& key, RandomNumberGenerator& rng, const std::string& kdf, const std::string& provider) { m_op = key.create_key_agreement_op(rng, kdf, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support key agreement"); } PK_Key_Agreement::~PK_Key_Agreement() { /* for unique_ptr */ } PK_Key_Agreement& PK_Key_Agreement::operator=(PK_Key_Agreement&& other) { if(this != &other) { m_op = std::move(other.m_op); } return (*this); } PK_Key_Agreement::PK_Key_Agreement(PK_Key_Agreement&& other) : m_op(std::move(other.m_op)) {} SymmetricKey PK_Key_Agreement::derive_key(size_t key_len, const uint8_t in[], size_t in_len, const uint8_t salt[], size_t salt_len) const { return m_op->agree(key_len, in, in_len, salt, salt_len); } PK_Signer::PK_Signer(const Private_Key& key, RandomNumberGenerator& rng, const std::string& emsa, Signature_Format format, const std::string& provider) { m_op = key.create_signature_op(rng, emsa, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support signature generation"); m_sig_format = format; m_parts = key.message_parts(); m_part_size = key.message_part_size(); } PK_Signer::~PK_Signer() { /* for unique_ptr */ } void PK_Signer::update(const uint8_t in[], size_t length) { m_op->update(in, length); } std::vector PK_Signer::signature(RandomNumberGenerator& rng) { const std::vector sig = unlock(m_op->sign(rng)); if(m_sig_format == IEEE_1363) { return sig; } else if(m_sig_format == DER_SEQUENCE) { if(sig.size() % m_parts != 0 || sig.size() != m_parts * m_part_size) throw Internal_Error("PK_Signer: DER signature sizes unexpected, cannot encode"); std::vector sig_parts(m_parts); for(size_t i = 0; i != sig_parts.size(); ++i) sig_parts[i].binary_decode(&sig[m_part_size*i], m_part_size); return DER_Encoder() .start_cons(SEQUENCE) .encode_list(sig_parts) .end_cons() .get_contents_unlocked(); } else throw Internal_Error("PK_Signer: Invalid signature format enum"); } PK_Verifier::PK_Verifier(const Public_Key& key, const std::string& emsa, Signature_Format format, const std::string& provider) { m_op = key.create_verification_op(emsa, provider); if(!m_op) throw Invalid_Argument("Key type " + key.algo_name() + " does not support signature verification"); m_sig_format = format; m_parts = key.message_parts(); m_part_size = key.message_part_size(); } PK_Verifier::~PK_Verifier() { /* for unique_ptr */ } void PK_Verifier::set_input_format(Signature_Format format) { if(format != IEEE_1363 && m_parts == 1) throw Invalid_Argument("PK_Verifier: This algorithm does not support DER encoding"); m_sig_format = format; } bool PK_Verifier::verify_message(const uint8_t msg[], size_t msg_length, const uint8_t sig[], size_t sig_length) { update(msg, msg_length); return check_signature(sig, sig_length); } void PK_Verifier::update(const uint8_t in[], size_t length) { m_op->update(in, length); } bool PK_Verifier::check_signature(const uint8_t sig[], size_t length) { try { if(m_sig_format == IEEE_1363) { return m_op->is_valid_signature(sig, length); } else if(m_sig_format == DER_SEQUENCE) { std::vector real_sig; BER_Decoder decoder(sig, length); BER_Decoder ber_sig = decoder.start_cons(SEQUENCE); size_t count = 0; while(ber_sig.more_items()) { BigInt sig_part; ber_sig.decode(sig_part); real_sig += BigInt::encode_1363(sig_part, m_part_size); ++count; } if(count != m_parts) throw Decoding_Error("PK_Verifier: signature size invalid"); return m_op->is_valid_signature(real_sig.data(), real_sig.size()); } else throw Internal_Error("PK_Verifier: Invalid signature format enum"); } catch(Invalid_Argument&) { return false; } } } botan-2.4.0/src/lib/pubkey/pubkey.h000066400000000000000000000642131322470703100171310ustar00rootroot00000000000000/* * Public Key Interface * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PUBKEY_H_ #define BOTAN_PUBKEY_H_ #include #include #include #if defined(BOTAN_HAS_SYSTEM_RNG) #include #define BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS #endif namespace Botan { class RandomNumberGenerator; /** * The two types of signature format supported by Botan. */ enum Signature_Format { IEEE_1363, DER_SEQUENCE }; /** * Public Key Encryptor * This is the primary interface for public key encryption */ class BOTAN_PUBLIC_API(2,0) PK_Encryptor { public: /** * Encrypt a message. * @param in the message as a byte array * @param length the length of the above byte array * @param rng the random number source to use * @return encrypted message */ std::vector encrypt(const uint8_t in[], size_t length, RandomNumberGenerator& rng) const { return enc(in, length, rng); } /** * Encrypt a message. * @param in the message * @param rng the random number source to use * @return encrypted message */ template std::vector encrypt(const std::vector& in, RandomNumberGenerator& rng) const { return enc(in.data(), in.size(), rng); } /** * Return the maximum allowed message size in bytes. * @return maximum message size in bytes */ virtual size_t maximum_input_size() const = 0; PK_Encryptor() = default; virtual ~PK_Encryptor() = default; PK_Encryptor(const PK_Encryptor&) = delete; PK_Encryptor& operator=(const PK_Encryptor&) = delete; private: virtual std::vector enc(const uint8_t[], size_t, RandomNumberGenerator&) const = 0; }; /** * Public Key Decryptor */ class BOTAN_PUBLIC_API(2,0) PK_Decryptor { public: /** * Decrypt a ciphertext, throwing an exception if the input * seems to be invalid (eg due to an accidental or malicious * error in the ciphertext). * * @param in the ciphertext as a byte array * @param length the length of the above byte array * @return decrypted message */ secure_vector decrypt(const uint8_t in[], size_t length) const; /** * Same as above, but taking a vector * @param in the ciphertext * @return decrypted message */ template secure_vector decrypt(const std::vector& in) const { return decrypt(in.data(), in.size()); } /** * Decrypt a ciphertext. If the ciphertext is invalid (eg due to * invalid padding) or is not the expected length, instead * returns a random string of the expected length. Use to avoid * oracle attacks, especially against PKCS #1 v1.5 decryption. */ secure_vector decrypt_or_random(const uint8_t in[], size_t length, size_t expected_pt_len, RandomNumberGenerator& rng) const; /** * Decrypt a ciphertext. If the ciphertext is invalid (eg due to * invalid padding) or is not the expected length, instead * returns a random string of the expected length. Use to avoid * oracle attacks, especially against PKCS #1 v1.5 decryption. * * Additionally checks (also in const time) that: * contents[required_content_offsets[i]] == required_content_bytes[i] * for 0 <= i < required_contents * * Used for example in TLS, which encodes the client version in * the content bytes: if there is any timing variation the version * check can be used as an oracle to recover the key. */ secure_vector decrypt_or_random(const uint8_t in[], size_t length, size_t expected_pt_len, RandomNumberGenerator& rng, const uint8_t required_content_bytes[], const uint8_t required_content_offsets[], size_t required_contents) const; PK_Decryptor() = default; virtual ~PK_Decryptor() = default; PK_Decryptor(const PK_Decryptor&) = delete; PK_Decryptor& operator=(const PK_Decryptor&) = delete; private: virtual secure_vector do_decrypt(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const = 0; }; /** * Public Key Signer. Use the sign_message() functions for small * messages. Use multiple calls update() to process large messages and * generate the signature by finally calling signature(). */ class BOTAN_PUBLIC_API(2,0) PK_Signer final { public: /** * Construct a PK Signer. * @param key the key to use inside this signer * @param rng the random generator to use * @param emsa the EMSA to use * An example would be "EMSA1(SHA-224)". * @param format the signature format to use * @param provider the provider to use */ PK_Signer(const Private_Key& key, RandomNumberGenerator& rng, const std::string& emsa, Signature_Format format = IEEE_1363, const std::string& provider = ""); #if defined(BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS) /** * Construct a PK Signer. * @param key the key to use inside this signer * @param emsa the EMSA to use * An example would be "EMSA1(SHA-224)". * @param format the signature format to use */ BOTAN_DEPRECATED("Use constructor taking a RNG object") PK_Signer(const Private_Key& key, const std::string& emsa, Signature_Format format = IEEE_1363, const std::string& provider = "") : PK_Signer(key, system_rng(), emsa, format, provider) {} #endif ~PK_Signer(); PK_Signer(const PK_Signer&) = delete; PK_Signer& operator=(const PK_Signer&) = delete; /** * Sign a message all in one go * @param in the message to sign as a byte array * @param length the length of the above byte array * @param rng the rng to use * @return signature */ std::vector sign_message(const uint8_t in[], size_t length, RandomNumberGenerator& rng) { this->update(in, length); return this->signature(rng); } /** * Sign a message. * @param in the message to sign * @param rng the rng to use * @return signature */ std::vector sign_message(const std::vector& in, RandomNumberGenerator& rng) { return sign_message(in.data(), in.size(), rng); } /** * Sign a message. * @param in the message to sign * @param rng the rng to use * @return signature */ std::vector sign_message(const secure_vector& in, RandomNumberGenerator& rng) { return sign_message(in.data(), in.size(), rng); } /** * Add a message part (single byte). * @param in the byte to add */ void update(uint8_t in) { update(&in, 1); } /** * Add a message part. * @param in the message part to add as a byte array * @param length the length of the above byte array */ void update(const uint8_t in[], size_t length); /** * Add a message part. * @param in the message part to add */ void update(const std::vector& in) { update(in.data(), in.size()); } /** * Add a message part. * @param in the message part to add */ void update(const std::string& in) { update(cast_char_ptr_to_uint8(in.data()), in.size()); } /** * Get the signature of the so far processed message (provided by the * calls to update()). * @param rng the rng to use * @return signature of the total message */ std::vector signature(RandomNumberGenerator& rng); /** * Set the output format of the signature. * @param format the signature format to use */ void set_output_format(Signature_Format format) { m_sig_format = format; } private: std::unique_ptr m_op; Signature_Format m_sig_format; size_t m_parts, m_part_size; }; /** * Public Key Verifier. Use the verify_message() functions for small * messages. Use multiple calls update() to process large messages and * verify the signature by finally calling check_signature(). */ class BOTAN_PUBLIC_API(2,0) PK_Verifier final { public: /** * Construct a PK Verifier. * @param pub_key the public key to verify against * @param emsa the EMSA to use (eg "EMSA3(SHA-1)") * @param format the signature format to use * @param provider the provider to use */ PK_Verifier(const Public_Key& pub_key, const std::string& emsa, Signature_Format format = IEEE_1363, const std::string& provider = ""); ~PK_Verifier(); PK_Verifier& operator=(const PK_Verifier&) = delete; PK_Verifier(const PK_Verifier&) = delete; /** * Verify a signature. * @param msg the message that the signature belongs to, as a byte array * @param msg_length the length of the above byte array msg * @param sig the signature as a byte array * @param sig_length the length of the above byte array sig * @return true if the signature is valid */ bool verify_message(const uint8_t msg[], size_t msg_length, const uint8_t sig[], size_t sig_length); /** * Verify a signature. * @param msg the message that the signature belongs to * @param sig the signature * @return true if the signature is valid */ template bool verify_message(const std::vector& msg, const std::vector& sig) { return verify_message(msg.data(), msg.size(), sig.data(), sig.size()); } /** * Add a message part (single byte) of the message corresponding to the * signature to be verified. * @param in the byte to add */ void update(uint8_t in) { update(&in, 1); } /** * Add a message part of the message corresponding to the * signature to be verified. * @param msg_part the new message part as a byte array * @param length the length of the above byte array */ void update(const uint8_t msg_part[], size_t length); /** * Add a message part of the message corresponding to the * signature to be verified. * @param in the new message part */ void update(const std::vector& in) { update(in.data(), in.size()); } /** * Add a message part of the message corresponding to the * signature to be verified. */ void update(const std::string& in) { update(cast_char_ptr_to_uint8(in.data()), in.size()); } /** * Check the signature of the buffered message, i.e. the one build * by successive calls to update. * @param sig the signature to be verified as a byte array * @param length the length of the above byte array * @return true if the signature is valid, false otherwise */ bool check_signature(const uint8_t sig[], size_t length); /** * Check the signature of the buffered message, i.e. the one build * by successive calls to update. * @param sig the signature to be verified * @return true if the signature is valid, false otherwise */ template bool check_signature(const std::vector& sig) { return check_signature(sig.data(), sig.size()); } /** * Set the format of the signatures fed to this verifier. * @param format the signature format to use */ void set_input_format(Signature_Format format); private: std::unique_ptr m_op; Signature_Format m_sig_format; size_t m_parts, m_part_size; }; /** * Key used for key agreement */ class BOTAN_PUBLIC_API(2,0) PK_Key_Agreement final { public: /** * Construct a PK Key Agreement. * @param key the key to use * @param rng the random generator to use * @param kdf name of the KDF to use (or 'Raw' for no KDF) * @param provider the algo provider to use (or empty for default) */ PK_Key_Agreement(const Private_Key& key, RandomNumberGenerator& rng, const std::string& kdf, const std::string& provider = ""); #if defined(BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS) /** * Construct a PK Key Agreement. * @param key the key to use * @param kdf name of the KDF to use (or 'Raw' for no KDF) * @param provider the algo provider to use (or empty for default) */ BOTAN_DEPRECATED("Use constructor taking a RNG object") PK_Key_Agreement(const Private_Key& key, const std::string& kdf, const std::string& provider = "") : PK_Key_Agreement(key, system_rng(), kdf, provider) {} #endif ~PK_Key_Agreement(); // For ECIES PK_Key_Agreement& operator=(PK_Key_Agreement&&); PK_Key_Agreement(PK_Key_Agreement&&); PK_Key_Agreement& operator=(const PK_Key_Agreement&) = delete; PK_Key_Agreement(const PK_Key_Agreement&) = delete; /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param in_len the length of in in bytes * @param params extra derivation params * @param params_len the length of params in bytes */ SymmetricKey derive_key(size_t key_len, const uint8_t in[], size_t in_len, const uint8_t params[], size_t params_len) const; /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param in_len the length of in in bytes * @param params extra derivation params * @param params_len the length of params in bytes */ SymmetricKey derive_key(size_t key_len, const std::vector& in, const uint8_t params[], size_t params_len) const { return derive_key(key_len, in.data(), in.size(), params, params_len); } /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param in_len the length of in in bytes * @param params extra derivation params */ SymmetricKey derive_key(size_t key_len, const uint8_t in[], size_t in_len, const std::string& params = "") const { return derive_key(key_len, in, in_len, cast_char_ptr_to_uint8(params.data()), params.length()); } /* * Perform Key Agreement Operation * @param key_len the desired key output size * @param in the other parties key * @param params extra derivation params */ SymmetricKey derive_key(size_t key_len, const std::vector& in, const std::string& params = "") const { return derive_key(key_len, in.data(), in.size(), cast_char_ptr_to_uint8(params.data()), params.length()); } private: std::unique_ptr m_op; }; /** * Encryption using a standard message recovery algorithm like RSA or * ElGamal, paired with an encoding scheme like OAEP. */ class BOTAN_PUBLIC_API(2,0) PK_Encryptor_EME final : public PK_Encryptor { public: size_t maximum_input_size() const override; /** * Construct an instance. * @param key the key to use inside the encryptor * @param rng the RNG to use * @param padding the message encoding scheme to use (eg "OAEP(SHA-256)") * @param provider the provider to use */ PK_Encryptor_EME(const Public_Key& key, RandomNumberGenerator& rng, const std::string& padding, const std::string& provider = ""); #if defined(BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS) /** * Construct an instance. * @param key the key to use inside the encryptor * @param padding the message encoding scheme to use (eg "OAEP(SHA-256)") */ BOTAN_DEPRECATED("Use constructor taking a RNG object") PK_Encryptor_EME(const Public_Key& key, const std::string& padding, const std::string& provider = "") : PK_Encryptor_EME(key, system_rng(), padding, provider) {} #endif ~PK_Encryptor_EME(); PK_Encryptor_EME& operator=(const PK_Encryptor_EME&) = delete; PK_Encryptor_EME(const PK_Encryptor_EME&) = delete; private: std::vector enc(const uint8_t[], size_t, RandomNumberGenerator& rng) const override; std::unique_ptr m_op; }; /** * Decryption with an MR algorithm and an EME. */ class BOTAN_PUBLIC_API(2,0) PK_Decryptor_EME final : public PK_Decryptor { public: /** * Construct an instance. * @param key the key to use inside the decryptor * @param rng the random generator to use * @param eme the EME to use * @param provider the provider to use */ PK_Decryptor_EME(const Private_Key& key, RandomNumberGenerator& rng, const std::string& eme, const std::string& provider = ""); #if defined(BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS) /** * Construct an instance. * @param key the key to use inside the decryptor * @param eme the message encoding scheme to use (eg "OAEP(SHA-256)") */ BOTAN_DEPRECATED("Use constructor taking a RNG object") PK_Decryptor_EME(const Private_Key& key, const std::string& eme, const std::string& provider = "") : PK_Decryptor_EME(key, system_rng(), eme, provider) {} #endif ~PK_Decryptor_EME(); PK_Decryptor_EME& operator=(const PK_Decryptor_EME&) = delete; PK_Decryptor_EME(const PK_Decryptor_EME&) = delete; private: secure_vector do_decrypt(uint8_t& valid_mask, const uint8_t in[], size_t in_len) const override; std::unique_ptr m_op; }; /** * Public Key Key Encapsulation Mechanism Encryption. */ class BOTAN_PUBLIC_API(2,0) PK_KEM_Encryptor final { public: /** * Construct an instance. * @param key the key to use inside the encryptor * @param rng the RNG to use * @param kem_param additional KEM parameters * @param provider the provider to use */ PK_KEM_Encryptor(const Public_Key& key, RandomNumberGenerator& rng, const std::string& kem_param = "", const std::string& provider = ""); #if defined(BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS) BOTAN_DEPRECATED("Use constructor taking a RNG object") PK_KEM_Encryptor(const Public_Key& key, const std::string& kem_param = "", const std::string& provider = "") : PK_KEM_Encryptor(key, system_rng(), kem_param, provider) {} #endif ~PK_KEM_Encryptor(); PK_KEM_Encryptor& operator=(const PK_KEM_Encryptor&) = delete; PK_KEM_Encryptor(const PK_KEM_Encryptor&) = delete; /** * Generate a shared key for data encryption. * @param out_encapsulated_key the generated encapsulated key * @param out_shared_key the generated shared key * @param desired_shared_key_len desired size of the shared key in bytes * @param rng the RNG to use * @param salt a salt value used in the KDF * @param salt_len size of the salt value in bytes */ void encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng, const uint8_t salt[], size_t salt_len); /** * Generate a shared key for data encryption. * @param out_encapsulated_key the generated encapsulated key * @param out_shared_key the generated shared key * @param desired_shared_key_len desired size of the shared key in bytes * @param rng the RNG to use * @param salt a salt value used in the KDF */ template void encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng, const std::vector& salt) { this->encrypt(out_encapsulated_key, out_shared_key, desired_shared_key_len, rng, salt.data(), salt.size()); } /** * Generate a shared key for data encryption. * @param out_encapsulated_key the generated encapsulated key * @param out_shared_key the generated shared key * @param desired_shared_key_len desired size of the shared key in bytes * @param rng the RNG to use */ void encrypt(secure_vector& out_encapsulated_key, secure_vector& out_shared_key, size_t desired_shared_key_len, Botan::RandomNumberGenerator& rng) { this->encrypt(out_encapsulated_key, out_shared_key, desired_shared_key_len, rng, nullptr, 0); } private: std::unique_ptr m_op; }; /** * Public Key Key Encapsulation Mechanism Decryption. */ class BOTAN_PUBLIC_API(2,0) PK_KEM_Decryptor final { public: /** * Construct an instance. * @param key the key to use inside the decryptor * @param rng the RNG to use * @param kem_param additional KEM parameters * @param provider the provider to use */ PK_KEM_Decryptor(const Private_Key& key, RandomNumberGenerator& rng, const std::string& kem_param = "", const std::string& provider = ""); #if defined(BOTAN_PUBKEY_INCLUDE_DEPRECATED_CONSTRUCTORS) BOTAN_DEPRECATED("Use constructor taking a RNG object") PK_KEM_Decryptor(const Private_Key& key, const std::string& kem_param = "", const std::string& provider = "") : PK_KEM_Decryptor(key, system_rng(), kem_param, provider) {} #endif ~PK_KEM_Decryptor(); PK_KEM_Decryptor& operator=(const PK_KEM_Decryptor&) = delete; PK_KEM_Decryptor(const PK_KEM_Decryptor&) = delete; /** * Decrypts the shared key for data encryption. * @param encap_key the encapsulated key * @param encap_key_len size of the encapsulated key in bytes * @param desired_shared_key_len desired size of the shared key in bytes * @param salt a salt value used in the KDF * @param salt_len size of the salt value in bytes * @return the shared data encryption key */ secure_vector decrypt(const uint8_t encap_key[], size_t encap_key_len, size_t desired_shared_key_len, const uint8_t salt[], size_t salt_len); /** * Decrypts the shared key for data encryption. * @param encap_key the encapsulated key * @param encap_key_len size of the encapsulated key in bytes * @param desired_shared_key_len desired size of the shared key in bytes * @return the shared data encryption key */ secure_vector decrypt(const uint8_t encap_key[], size_t encap_key_len, size_t desired_shared_key_len) { return this->decrypt(encap_key, encap_key_len, desired_shared_key_len, nullptr, 0); } /** * Decrypts the shared key for data encryption. * @param encap_key the encapsulated key * @param desired_shared_key_len desired size of the shared key in bytes * @param salt a salt value used in the KDF * @return the shared data encryption key */ template secure_vector decrypt(const std::vector& encap_key, size_t desired_shared_key_len, const std::vector& salt) { return this->decrypt(encap_key.data(), encap_key.size(), desired_shared_key_len, salt.data(), salt.size()); } private: std::unique_ptr m_op; }; } #endif botan-2.4.0/src/lib/pubkey/rfc6979/000077500000000000000000000000001322470703100165645ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/rfc6979/info.txt000066400000000000000000000001341322470703100202560ustar00rootroot00000000000000 RFC6979_GENERATOR -> 20140321 bigint hmac_drbg botan-2.4.0/src/lib/pubkey/rfc6979/rfc6979.cpp000066400000000000000000000030771322470703100204100ustar00rootroot00000000000000/* * RFC 6979 Deterministic Nonce Generator * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { RFC6979_Nonce_Generator::RFC6979_Nonce_Generator(const std::string& hash, const BigInt& order, const BigInt& x) : m_order(order), m_qlen(m_order.bits()), m_rlen(m_qlen / 8 + (m_qlen % 8 ? 1 : 0)), m_rng_in(m_rlen * 2), m_rng_out(m_rlen) { m_hmac_drbg.reset(new HMAC_DRBG(MessageAuthenticationCode::create("HMAC(" + hash + ")"))); BigInt::encode_1363(m_rng_in.data(), m_rlen, x); } RFC6979_Nonce_Generator::~RFC6979_Nonce_Generator() { // for ~unique_ptr } const BigInt& RFC6979_Nonce_Generator::nonce_for(const BigInt& m) { BigInt::encode_1363(&m_rng_in[m_rlen], m_rlen, m); m_hmac_drbg->clear(); m_hmac_drbg->initialize_with(m_rng_in.data(), m_rng_in.size()); do { m_hmac_drbg->randomize(m_rng_out.data(), m_rng_out.size()); m_k.binary_decode(m_rng_out.data(), m_rng_out.size()); m_k >>= (8*m_rlen - m_qlen); } while(m_k == 0 || m_k >= m_order); return m_k; } BigInt generate_rfc6979_nonce(const BigInt& x, const BigInt& q, const BigInt& h, const std::string& hash) { RFC6979_Nonce_Generator gen(hash, q, x); BigInt k = gen.nonce_for(h); return k; } } botan-2.4.0/src/lib/pubkey/rfc6979/rfc6979.h000066400000000000000000000024501322470703100200470ustar00rootroot00000000000000/* * RFC 6979 Deterministic Nonce Generator * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RFC6979_GENERATOR_H_ #define BOTAN_RFC6979_GENERATOR_H_ #include #include #include namespace Botan { class HMAC_DRBG; class BOTAN_PUBLIC_API(2,0) RFC6979_Nonce_Generator final { public: /** * Note: keeps persistent reference to order */ RFC6979_Nonce_Generator(const std::string& hash, const BigInt& order, const BigInt& x); ~RFC6979_Nonce_Generator(); const BigInt& nonce_for(const BigInt& m); private: const BigInt& m_order; BigInt m_k; size_t m_qlen, m_rlen; std::unique_ptr m_hmac_drbg; secure_vector m_rng_in, m_rng_out; }; /** * @param x the secret (EC)DSA key * @param q the group order * @param h the message hash already reduced mod q * @param hash the hash function used to generate h */ BigInt BOTAN_PUBLIC_API(2,0) generate_rfc6979_nonce(const BigInt& x, const BigInt& q, const BigInt& h, const std::string& hash); } #endif botan-2.4.0/src/lib/pubkey/rsa/000077500000000000000000000000001322470703100162405ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/rsa/info.txt000066400000000000000000000001441322470703100177330ustar00rootroot00000000000000 RSA -> 20160730 keypair numbertheory emsa_pssr sha2_32 botan-2.4.0/src/lib/pubkey/rsa/rsa.cpp000066400000000000000000000363761322470703100175500ustar00rootroot00000000000000/* * RSA * (C) 1999-2010,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_OPENSSL) #include #endif #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #endif namespace Botan { size_t RSA_PublicKey::key_length() const { return m_n.bits(); } size_t RSA_PublicKey::estimated_strength() const { return if_work_factor(key_length()); } AlgorithmIdentifier RSA_PublicKey::algorithm_identifier() const { return AlgorithmIdentifier(get_oid(), AlgorithmIdentifier::USE_NULL_PARAM); } std::vector RSA_PublicKey::public_key_bits() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(m_n) .encode(m_e) .end_cons() .get_contents_unlocked(); } RSA_PublicKey::RSA_PublicKey(const AlgorithmIdentifier&, const std::vector& key_bits) { BER_Decoder(key_bits) .start_cons(SEQUENCE) .decode(m_n) .decode(m_e) .end_cons(); } /* * Check RSA Public Parameters */ bool RSA_PublicKey::check_key(RandomNumberGenerator&, bool) const { if(m_n < 35 || m_n.is_even() || m_e < 2) return false; return true; } secure_vector RSA_PrivateKey::private_key_bits() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(static_cast(0)) .encode(m_n) .encode(m_e) .encode(m_d) .encode(m_p) .encode(m_q) .encode(m_d1) .encode(m_d2) .encode(m_c) .end_cons() .get_contents(); } RSA_PrivateKey::RSA_PrivateKey(const AlgorithmIdentifier&, const secure_vector& key_bits) { BER_Decoder(key_bits) .start_cons(SEQUENCE) .decode_and_check(0, "Unknown PKCS #1 key format version") .decode(m_n) .decode(m_e) .decode(m_d) .decode(m_p) .decode(m_q) .decode(m_d1) .decode(m_d2) .decode(m_c) .end_cons(); } RSA_PrivateKey::RSA_PrivateKey(const BigInt& prime1, const BigInt& prime2, const BigInt& exp, const BigInt& d_exp, const BigInt& mod) : m_d{ d_exp }, m_p{ prime1 }, m_q{ prime2 }, m_d1{}, m_d2{}, m_c{ inverse_mod( m_q, m_p ) } { m_n = mod.is_nonzero() ? mod : m_p * m_q; m_e = exp; if(m_d == 0) { BigInt inv_for_d = lcm(m_p - 1, m_q - 1); if(m_e.is_even()) inv_for_d >>= 1; m_d = inverse_mod(m_e, inv_for_d); } m_d1 = m_d % (m_p - 1); m_d2 = m_d % (m_q - 1); } /* * Create a RSA private key */ RSA_PrivateKey::RSA_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t exp) { if(bits < 1024) throw Invalid_Argument(algo_name() + ": Can't make a key that is only " + std::to_string(bits) + " bits long"); if(exp < 3 || exp % 2 == 0) throw Invalid_Argument(algo_name() + ": Invalid encryption exponent"); m_e = exp; do { m_p = random_prime(rng, (bits + 1) / 2, m_e); m_q = random_prime(rng, bits - m_p.bits(), m_e); m_n = m_p * m_q; } while(m_n.bits() != bits); m_d = inverse_mod(m_e, lcm(m_p - 1, m_q - 1)); m_d1 = m_d % (m_p - 1); m_d2 = m_d % (m_q - 1); m_c = inverse_mod(m_q, m_p); } /* * Check Private RSA Parameters */ bool RSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(m_n < 35 || m_n.is_even() || m_e < 2 || m_d < 2 || m_p < 3 || m_q < 3 || m_p*m_q != m_n) return false; if(m_d1 != m_d % (m_p - 1) || m_d2 != m_d % (m_q - 1) || m_c != inverse_mod(m_q, m_p)) return false; const size_t prob = (strong) ? 128 : 12; if(!is_prime(m_p, rng, prob) || !is_prime(m_q, rng, prob)) return false; if(strong) { if((m_e * m_d) % lcm(m_p - 1, m_q - 1) != 1) return false; return KeyPair::signature_consistency_check(rng, *this, "EMSA4(SHA-256)"); } return true; } namespace { /** * RSA private (decrypt/sign) operation */ class RSA_Private_Operation { protected: size_t get_max_input_bits() const { return (m_n.bits() - 1); } explicit RSA_Private_Operation(const RSA_PrivateKey& rsa, RandomNumberGenerator& rng) : m_n(rsa.get_n()), m_q(rsa.get_q()), m_c(rsa.get_c()), m_powermod_e_n(rsa.get_e(), rsa.get_n()), m_powermod_d1_p(rsa.get_d1(), rsa.get_p()), m_powermod_d2_q(rsa.get_d2(), rsa.get_q()), m_mod_p(rsa.get_p()), m_blinder(m_n, rng, [this](const BigInt& k) { return m_powermod_e_n(k); }, [this](const BigInt& k) { return inverse_mod(k, m_n); }) { } BigInt blinded_private_op(const BigInt& m) const { if(m >= m_n) throw Invalid_Argument("RSA private op - input is too large"); return m_blinder.unblind(private_op(m_blinder.blind(m))); } BigInt private_op(const BigInt& m) const { #if defined(BOTAN_TARGET_OS_HAS_THREADS) auto future_j1 = std::async(std::launch::async, m_powermod_d1_p, m); BigInt j2 = m_powermod_d2_q(m); BigInt j1 = future_j1.get(); #else BigInt j1 = m_powermod_d1_p(m); BigInt j2 = m_powermod_d2_q(m); #endif j1 = m_mod_p.reduce(sub_mul(j1, j2, m_c)); return mul_add(j1, m_q, j2); } const BigInt& m_n; const BigInt& m_q; const BigInt& m_c; Fixed_Exponent_Power_Mod m_powermod_e_n, m_powermod_d1_p, m_powermod_d2_q; Modular_Reducer m_mod_p; Blinder m_blinder; }; class RSA_Signature_Operation final : public PK_Ops::Signature_with_EMSA, private RSA_Private_Operation { public: size_t max_input_bits() const override { return get_max_input_bits(); } RSA_Signature_Operation(const RSA_PrivateKey& rsa, const std::string& emsa, RandomNumberGenerator& rng) : PK_Ops::Signature_with_EMSA(emsa), RSA_Private_Operation(rsa, rng) { } secure_vector raw_sign(const uint8_t msg[], size_t msg_len, RandomNumberGenerator&) override { const BigInt m(msg, msg_len); const BigInt x = blinded_private_op(m); const BigInt c = m_powermod_e_n(x); BOTAN_ASSERT(m == c, "RSA sign consistency check"); return BigInt::encode_1363(x, m_n.bytes()); } }; class RSA_Decryption_Operation final : public PK_Ops::Decryption_with_EME, private RSA_Private_Operation { public: size_t max_raw_input_bits() const override { return get_max_input_bits(); } RSA_Decryption_Operation(const RSA_PrivateKey& rsa, const std::string& eme, RandomNumberGenerator& rng) : PK_Ops::Decryption_with_EME(eme), RSA_Private_Operation(rsa, rng) { } secure_vector raw_decrypt(const uint8_t msg[], size_t msg_len) override { const BigInt m(msg, msg_len); const BigInt x = blinded_private_op(m); const BigInt c = m_powermod_e_n(x); BOTAN_ASSERT(m == c, "RSA decrypt consistency check"); return BigInt::encode_1363(x, m_n.bytes()); } }; class RSA_KEM_Decryption_Operation final : public PK_Ops::KEM_Decryption_with_KDF, private RSA_Private_Operation { public: RSA_KEM_Decryption_Operation(const RSA_PrivateKey& key, const std::string& kdf, RandomNumberGenerator& rng) : PK_Ops::KEM_Decryption_with_KDF(kdf), RSA_Private_Operation(key, rng) {} secure_vector raw_kem_decrypt(const uint8_t encap_key[], size_t len) override { const BigInt m(encap_key, len); const BigInt x = blinded_private_op(m); const BigInt c = m_powermod_e_n(x); BOTAN_ASSERT(m == c, "RSA KEM consistency check"); return BigInt::encode_1363(x, m_n.bytes()); } }; /** * RSA public (encrypt/verify) operation */ class RSA_Public_Operation { public: explicit RSA_Public_Operation(const RSA_PublicKey& rsa) : m_n(rsa.get_n()), m_powermod_e_n(rsa.get_e(), rsa.get_n()) {} size_t get_max_input_bits() const { return (m_n.bits() - 1); } protected: BigInt public_op(const BigInt& m) const { if(m >= m_n) throw Invalid_Argument("RSA public op - input is too large"); return m_powermod_e_n(m); } const BigInt& get_n() const { return m_n; } const BigInt& m_n; Fixed_Exponent_Power_Mod m_powermod_e_n; }; class RSA_Encryption_Operation final : public PK_Ops::Encryption_with_EME, private RSA_Public_Operation { public: RSA_Encryption_Operation(const RSA_PublicKey& rsa, const std::string& eme) : PK_Ops::Encryption_with_EME(eme), RSA_Public_Operation(rsa) { } size_t max_raw_input_bits() const override { return get_max_input_bits(); } secure_vector raw_encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator&) override { BigInt m(msg, msg_len); return BigInt::encode_1363(public_op(m), m_n.bytes()); } }; class RSA_Verify_Operation final : public PK_Ops::Verification_with_EMSA, private RSA_Public_Operation { public: size_t max_input_bits() const override { return get_max_input_bits(); } RSA_Verify_Operation(const RSA_PublicKey& rsa, const std::string& emsa) : PK_Ops::Verification_with_EMSA(emsa), RSA_Public_Operation(rsa) { } bool with_recovery() const override { return true; } secure_vector verify_mr(const uint8_t msg[], size_t msg_len) override { BigInt m(msg, msg_len); return BigInt::encode_locked(public_op(m)); } }; class RSA_KEM_Encryption_Operation final : public PK_Ops::KEM_Encryption_with_KDF, private RSA_Public_Operation { public: RSA_KEM_Encryption_Operation(const RSA_PublicKey& key, const std::string& kdf) : PK_Ops::KEM_Encryption_with_KDF(kdf), RSA_Public_Operation(key) {} private: void raw_kem_encrypt(secure_vector& out_encapsulated_key, secure_vector& raw_shared_key, Botan::RandomNumberGenerator& rng) override { const BigInt r = BigInt::random_integer(rng, 1, get_n()); const BigInt c = public_op(r); out_encapsulated_key = BigInt::encode_locked(c); raw_shared_key = BigInt::encode_locked(r); } }; } std::unique_ptr RSA_PublicKey::create_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { try { return make_openssl_rsa_enc_op(*this, params); } catch(Exception& e) { /* * If OpenSSL for some reason could not handle this (eg due to OAEP params), * throw if openssl was specifically requested but otherwise just fall back * to the normal version. */ if(provider == "openssl") throw Exception("OpenSSL RSA provider rejected key:", e.what()); } } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new RSA_Encryption_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr RSA_PublicKey::create_kem_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new RSA_KEM_Encryption_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr RSA_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { std::unique_ptr res = make_openssl_rsa_ver_op(*this, params); if(res) return res; } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new RSA_Verify_Operation(*this, params)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr RSA_PrivateKey::create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { try { return make_openssl_rsa_dec_op(*this, params); } catch(Exception& e) { if(provider == "openssl") throw Exception("OpenSSL RSA provider rejected key:", e.what()); } } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new RSA_Decryption_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr RSA_PrivateKey::create_kem_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr(new RSA_KEM_Decryption_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr RSA_PrivateKey::create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { #if defined(BOTAN_HAS_OPENSSL) if(provider == "openssl" || provider.empty()) { std::unique_ptr res = make_openssl_rsa_sig_op(*this, params); if(res) return res; } #endif if(provider == "base" || provider.empty()) return std::unique_ptr(new RSA_Signature_Operation(*this, params, rng)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/rsa/rsa.h000066400000000000000000000115211322470703100171760ustar00rootroot00000000000000/* * RSA * (C) 1999-2008,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RSA_H_ #define BOTAN_RSA_H_ #include #include namespace Botan { /** * RSA Public Key */ class BOTAN_PUBLIC_API(2,0) RSA_PublicKey : public virtual Public_Key { public: /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ RSA_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits); /** * Create a public key. * @arg n the modulus * @arg e the exponent */ RSA_PublicKey(const BigInt& n, const BigInt& e) : m_n(n), m_e(e) {} std::string algo_name() const override { return "RSA"; } bool check_key(RandomNumberGenerator& rng, bool) const override; AlgorithmIdentifier algorithm_identifier() const override; std::vector public_key_bits() const override; /** * @return public modulus */ const BigInt& get_n() const { return m_n; } /** * @return public exponent */ const BigInt& get_e() const { return m_e; } size_t key_length() const override; size_t estimated_strength() const override; std::unique_ptr create_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; std::unique_ptr create_kem_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: RSA_PublicKey() = default; BigInt m_n, m_e; }; /** * RSA Private Key */ class BOTAN_PUBLIC_API(2,0) RSA_PrivateKey final : public Private_Key, public RSA_PublicKey { public: /** * Load a private key. * @param alg_id the X.509 algorithm identifier * @param key_bits PKCS#1 RSAPrivateKey bits */ RSA_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Construct a private key from the specified parameters. * @param p the first prime * @param q the second prime * @param e the exponent * @param d if specified, this has to be d with * exp * d = 1 mod (p - 1, q - 1). Leave it as 0 if you wish to * the constructor to calculate it. * @param n if specified, this must be n = p * q. Leave it as 0 * if you wish to the constructor to calculate it. */ RSA_PrivateKey(const BigInt& p, const BigInt& q, const BigInt& e, const BigInt& d = 0, const BigInt& n = 0); /** * Create a new private key with the specified bit length * @param rng the random number generator to use * @param bits the desired bit length of the private key * @param exp the public exponent to be used */ RSA_PrivateKey(RandomNumberGenerator& rng, size_t bits, size_t exp = 65537); bool check_key(RandomNumberGenerator& rng, bool) const override; /** * Get the first prime p. * @return prime p */ const BigInt& get_p() const { return m_p; } /** * Get the second prime q. * @return prime q */ const BigInt& get_q() const { return m_q; } /** * Get d with exp * d = 1 mod (p - 1, q - 1). * @return d */ const BigInt& get_d() const { return m_d; } const BigInt& get_c() const { return m_c; } const BigInt& get_d1() const { return m_d1; } const BigInt& get_d2() const { return m_d2; } secure_vector private_key_bits() const override; std::unique_ptr create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; std::unique_ptr create_kem_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; private: BigInt m_d, m_p, m_q, m_d1, m_d2, m_c; }; } #endif botan-2.4.0/src/lib/pubkey/sm2/000077500000000000000000000000001322470703100161545ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/sm2/info.txt000066400000000000000000000001651322470703100176520ustar00rootroot00000000000000 SM2 -> 20170907 asn1 ec_group ecc_key keypair numbertheory rng sm3 kdf2 botan-2.4.0/src/lib/pubkey/sm2/sm2.cpp000066400000000000000000000173131322470703100173660ustar00rootroot00000000000000/* * SM2 Signatures * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { bool SM2_Signature_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) return false; if(!strong) return true; return KeyPair::signature_consistency_check(rng, *this, "SM3"); } SM2_Signature_PrivateKey::SM2_Signature_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits) { m_da_inv = inverse_mod(m_private_key + 1, domain().get_order()); } SM2_Signature_PrivateKey::SM2_Signature_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x) : EC_PrivateKey(rng, domain, x) { m_da_inv = inverse_mod(m_private_key + 1, domain.get_order()); } std::vector sm2_compute_za(HashFunction& hash, const std::string& user_id, const EC_Group& domain, const PointGFp& pubkey) { if(user_id.size() >= 8192) throw Invalid_Argument("SM2 user id too long to represent"); const uint16_t uid_len = static_cast(8 * user_id.size()); hash.update(get_byte(0, uid_len)); hash.update(get_byte(1, uid_len)); hash.update(user_id); const size_t p_bytes = domain.get_curve().get_p().bytes(); hash.update(BigInt::encode_1363(domain.get_curve().get_a(), p_bytes)); hash.update(BigInt::encode_1363(domain.get_curve().get_b(), p_bytes)); hash.update(BigInt::encode_1363(domain.get_base_point().get_affine_x(), p_bytes)); hash.update(BigInt::encode_1363(domain.get_base_point().get_affine_y(), p_bytes)); hash.update(BigInt::encode_1363(pubkey.get_affine_x(), p_bytes)); hash.update(BigInt::encode_1363(pubkey.get_affine_y(), p_bytes)); std::vector za(hash.output_length()); hash.final(za.data()); return za; } namespace { /** * SM2 signature operation */ class SM2_Signature_Operation final : public PK_Ops::Signature { public: SM2_Signature_Operation(const SM2_Signature_PrivateKey& sm2, const std::string& ident, const std::string& hash) : m_order(sm2.domain().get_order()), m_base_point(sm2.domain().get_base_point(), m_order), m_x(sm2.private_value()), m_da_inv(sm2.get_da_inv()), m_mod_order(m_order), m_hash(HashFunction::create_or_throw(hash)) { // ZA=H256(ENTLA || IDA || a || b || xG || yG || xA || yA) m_za = sm2_compute_za(*m_hash, ident, sm2.domain(), sm2.public_point()); m_hash->update(m_za); } void update(const uint8_t msg[], size_t msg_len) override { m_hash->update(msg, msg_len); } secure_vector sign(RandomNumberGenerator& rng) override; private: const BigInt& m_order; Blinded_Point_Multiply m_base_point; const BigInt& m_x; const BigInt& m_da_inv; Modular_Reducer m_mod_order; std::vector m_za; std::unique_ptr m_hash; }; secure_vector SM2_Signature_Operation::sign(RandomNumberGenerator& rng) { const BigInt k = BigInt::random_integer(rng, 1, m_order); const PointGFp k_times_P = m_base_point.blinded_multiply(k, rng); const BigInt e = BigInt::decode(m_hash->final()); const BigInt r = m_mod_order.reduce(k_times_P.get_affine_x() + e); const BigInt s = m_mod_order.multiply(m_da_inv, (k - r*m_x)); // prepend ZA for next signature if any m_hash->update(m_za); return BigInt::encode_fixed_length_int_pair(r, s, m_order.bytes()); } /** * SM2 verification operation */ class SM2_Verification_Operation final : public PK_Ops::Verification { public: SM2_Verification_Operation(const SM2_Signature_PublicKey& sm2, const std::string& ident, const std::string& hash) : m_base_point(sm2.domain().get_base_point()), m_public_point(sm2.public_point()), m_order(sm2.domain().get_order()), m_mod_order(m_order), m_hash(HashFunction::create_or_throw(hash)) { // ZA=H256(ENTLA || IDA || a || b || xG || yG || xA || yA) m_za = sm2_compute_za(*m_hash, ident, sm2.domain(), sm2.public_point()); m_hash->update(m_za); } void update(const uint8_t msg[], size_t msg_len) override { m_hash->update(msg, msg_len); } bool is_valid_signature(const uint8_t sig[], size_t sig_len) override; private: const PointGFp& m_base_point; const PointGFp& m_public_point; const BigInt& m_order; // FIXME: should be offered by curve Modular_Reducer m_mod_order; std::vector m_za; std::unique_ptr m_hash; }; bool SM2_Verification_Operation::is_valid_signature(const uint8_t sig[], size_t sig_len) { const BigInt e = BigInt::decode(m_hash->final()); // Update for next verification m_hash->update(m_za); if(sig_len != m_order.bytes()*2) return false; const BigInt r(sig, sig_len / 2); const BigInt s(sig + sig_len / 2, sig_len / 2); if(r <= 0 || r >= m_order || s <= 0 || s >= m_order) return false; const BigInt t = m_mod_order.reduce(r + s); if(t == 0) return false; const PointGFp R = multi_exponentiate(m_base_point, s, m_public_point, t); // ??? if(R.is_zero()) return false; return (m_mod_order.reduce(R.get_affine_x() + e) == r); } } std::unique_ptr SM2_Signature_PublicKey::create_verification_op(const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) { std::string userid = ""; std::string hash = "SM3"; auto comma = params.find(','); if(comma == std::string::npos) userid = params; else { userid = params.substr(0, comma); hash = params.substr(comma+1, std::string::npos); } if (userid.empty()) { // GM/T 0009-2012 specifies this as the default userid userid = "1234567812345678"; } return std::unique_ptr(new SM2_Verification_Operation(*this, userid, hash)); } throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr SM2_Signature_PrivateKey::create_signature_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) { std::string userid = ""; std::string hash = "SM3"; auto comma = params.find(','); if(comma == std::string::npos) userid = params; else { userid = params.substr(0, comma); hash = params.substr(comma+1, std::string::npos); } if (userid.empty()) { // GM/T 0009-2012 specifies this as the default userid userid = "1234567812345678"; } return std::unique_ptr(new SM2_Signature_Operation(*this, userid, hash)); } throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/sm2/sm2.h000066400000000000000000000062071322470703100170330ustar00rootroot00000000000000/* * SM2 * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SM2_KEY_H_ #define BOTAN_SM2_KEY_H_ #include namespace Botan { /** * This class represents SM2 Signature public keys */ class BOTAN_PUBLIC_API(2,2) SM2_Signature_PublicKey : public virtual EC_PublicKey { public: /** * Create a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ SM2_Signature_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ SM2_Signature_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Get this keys algorithm name. * @result this keys algorithm name */ std::string algo_name() const override { return "SM2_Sig"; } size_t message_parts() const override { return 2; } size_t message_part_size() const override { return domain().get_order().bytes(); } std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override; protected: SM2_Signature_PublicKey() = default; }; /** * This class represents SM2 Signature private keys */ class BOTAN_PUBLIC_API(2,2) SM2_Signature_PrivateKey final : public SM2_Signature_PublicKey, public EC_PrivateKey { public: /** * Load a private key * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ SM2_Signature_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Create a private key. * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key (if zero, generate a new random key) */ SM2_Signature_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0); bool check_key(RandomNumberGenerator& rng, bool) const override; std::unique_ptr create_signature_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; const BigInt& get_da_inv() const { return m_da_inv; } private: BigInt m_da_inv; }; class HashFunction; std::vector sm2_compute_za(HashFunction& hash, const std::string& user_id, const EC_Group& domain, const PointGFp& pubkey); } #endif botan-2.4.0/src/lib/pubkey/sm2/sm2_enc.cpp000066400000000000000000000200111322470703100202000ustar00rootroot00000000000000/* * SM2 Encryption * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { bool SM2_Encryption_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const { if(!public_point().on_the_curve()) return false; if(!strong) return true; return KeyPair::encryption_consistency_check(rng, *this, "SM3"); } SM2_Encryption_PrivateKey::SM2_Encryption_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits) : EC_PrivateKey(alg_id, key_bits) { } SM2_Encryption_PrivateKey::SM2_Encryption_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x) : EC_PrivateKey(rng, domain, x) { } namespace { class SM2_Encryption_Operation final : public PK_Ops::Encryption { public: SM2_Encryption_Operation(const SM2_Encryption_PublicKey& key, const std::string& kdf_hash) : m_p_bytes(key.domain().get_curve().get_p().bytes()), m_order(key.domain().get_order()), m_base_point(key.domain().get_base_point(), m_order), m_public_point(key.public_point(), m_order), m_kdf_hash(kdf_hash) {} size_t max_input_bits() const override { // This is arbitrary, but assumes SM2 is used for key encapsulation return 512; } secure_vector encrypt(const uint8_t msg[], size_t msg_len, RandomNumberGenerator& rng) override { std::unique_ptr hash = HashFunction::create_or_throw(m_kdf_hash); std::unique_ptr kdf = KDF::create_or_throw("KDF2(" + m_kdf_hash + ")"); const BigInt k = BigInt::random_integer(rng, 1, m_order); const PointGFp C1 = m_base_point.blinded_multiply(k, rng); const BigInt x1 = C1.get_affine_x(); const BigInt y1 = C1.get_affine_y(); std::vector x1_bytes(m_p_bytes); std::vector y1_bytes(m_p_bytes); BigInt::encode_1363(x1_bytes.data(), x1_bytes.size(), x1); BigInt::encode_1363(y1_bytes.data(), y1_bytes.size(), y1); const PointGFp kPB = m_public_point.blinded_multiply(k, rng); const BigInt x2 = kPB.get_affine_x(); const BigInt y2 = kPB.get_affine_y(); std::vector x2_bytes(m_p_bytes); std::vector y2_bytes(m_p_bytes); BigInt::encode_1363(x2_bytes.data(), x2_bytes.size(), x2); BigInt::encode_1363(y2_bytes.data(), y2_bytes.size(), y2); secure_vector kdf_input; kdf_input += x2_bytes; kdf_input += y2_bytes; const secure_vector kdf_output = kdf->derive_key(msg_len, kdf_input.data(), kdf_input.size()); secure_vector masked_msg(msg_len); xor_buf(masked_msg.data(), msg, kdf_output.data(), msg_len); hash->update(x2_bytes); hash->update(msg, msg_len); hash->update(y2_bytes); std::vector C3(hash->output_length()); hash->final(C3.data()); return DER_Encoder() .start_cons(SEQUENCE) .encode(x1) .encode(y1) .encode(C3, OCTET_STRING) .encode(masked_msg, OCTET_STRING) .end_cons() .get_contents(); } private: size_t m_p_bytes; const BigInt& m_order; Blinded_Point_Multiply m_base_point; Blinded_Point_Multiply m_public_point; const std::string m_kdf_hash; }; class SM2_Decryption_Operation final : public PK_Ops::Decryption { public: SM2_Decryption_Operation(const SM2_Encryption_PrivateKey& key, RandomNumberGenerator& rng, const std::string& kdf_hash) : m_key(key), m_rng(rng), m_kdf_hash(kdf_hash) {} secure_vector decrypt(uint8_t& valid_mask, const uint8_t ciphertext[], size_t ciphertext_len) override { const BigInt& cofactor = m_key.domain().get_cofactor(); const size_t p_bytes = m_key.domain().get_curve().get_p().bytes(); valid_mask = 0x00; std::unique_ptr hash = HashFunction::create_or_throw(m_kdf_hash); std::unique_ptr kdf = KDF::create_or_throw("KDF2(" + m_kdf_hash + ")"); // Too short to be valid - no timing problem from early return if(ciphertext_len < 1 + p_bytes*2 + hash->output_length()) { return secure_vector(); } BigInt x1, y1; secure_vector C3, masked_msg; BER_Decoder(ciphertext, ciphertext_len) .start_cons(SEQUENCE) .decode(x1) .decode(y1) .decode(C3, OCTET_STRING) .decode(masked_msg, OCTET_STRING) .end_cons() .verify_end(); const PointGFp C1(m_key.domain().get_curve(), x1, y1); if(!C1.on_the_curve()) return secure_vector(); Blinded_Point_Multiply C1_mul(C1, m_key.domain().get_order()); if(cofactor > 1 && C1_mul.blinded_multiply(cofactor, m_rng).is_zero()) { return secure_vector(); } const PointGFp dbC1 = C1_mul.blinded_multiply(m_key.private_value(), m_rng); const BigInt x2 = dbC1.get_affine_x(); const BigInt y2 = dbC1.get_affine_y(); std::vector x2_bytes(p_bytes); std::vector y2_bytes(p_bytes); BigInt::encode_1363(x2_bytes.data(), x2_bytes.size(), x2); BigInt::encode_1363(y2_bytes.data(), y2_bytes.size(), y2); secure_vector kdf_input; kdf_input += x2_bytes; kdf_input += y2_bytes; const secure_vector kdf_output = kdf->derive_key(masked_msg.size(), kdf_input.data(), kdf_input.size()); xor_buf(masked_msg.data(), kdf_output.data(), kdf_output.size()); hash->update(x2_bytes); hash->update(masked_msg); hash->update(y2_bytes); secure_vector u = hash->final(); if(constant_time_compare(u.data(), C3.data(), hash->output_length()) == false) return secure_vector(); valid_mask = 0xFF; return masked_msg; } private: const SM2_Encryption_PrivateKey& m_key; RandomNumberGenerator& m_rng; const std::string m_kdf_hash; }; } std::unique_ptr SM2_Encryption_PublicKey::create_encryption_op(RandomNumberGenerator& /*rng*/, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) { const std::string kdf_hash = (params.empty() ? "SM3" : params); return std::unique_ptr(new SM2_Encryption_Operation(*this, kdf_hash)); } throw Provider_Not_Found(algo_name(), provider); } std::unique_ptr SM2_Encryption_PrivateKey::create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const { if(provider == "base" || provider.empty()) { const std::string kdf_hash = (params.empty() ? "SM3" : params); return std::unique_ptr(new SM2_Decryption_Operation(*this, rng, kdf_hash)); } throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/sm2/sm2_enc.h000066400000000000000000000053071322470703100176600ustar00rootroot00000000000000/* * SM2 Encryption * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SM2_ENC_KEY_H_ #define BOTAN_SM2_ENC_KEY_H_ #include namespace Botan { /** * This class represents a public key used for SM2 encryption */ class BOTAN_PUBLIC_API(2,2) SM2_Encryption_PublicKey : public virtual EC_PublicKey { public: /** * Create a public key from a given public point. * @param dom_par the domain parameters associated with this key * @param public_point the public point defining this key */ SM2_Encryption_PublicKey(const EC_Group& dom_par, const PointGFp& public_point) : EC_PublicKey(dom_par, public_point) {} /** * Load a public key. * @param alg_id the X.509 algorithm identifier * @param key_bits DER encoded public key bits */ SM2_Encryption_PublicKey(const AlgorithmIdentifier& alg_id, const std::vector& key_bits) : EC_PublicKey(alg_id, key_bits) {} /** * Get this keys algorithm name. * @result this keys algorithm name */ std::string algo_name() const override { return "SM2_Enc"; } std::unique_ptr create_encryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; protected: SM2_Encryption_PublicKey() = default; }; /** * This class represents a private key used for SM2 encryption */ class BOTAN_PUBLIC_API(2,2) SM2_Encryption_PrivateKey final : public SM2_Encryption_PublicKey, public EC_PrivateKey { public: /** * Load a private key * @param alg_id the X.509 algorithm identifier * @param key_bits ECPrivateKey bits */ SM2_Encryption_PrivateKey(const AlgorithmIdentifier& alg_id, const secure_vector& key_bits); /** * Create a private key. * @param rng a random number generator * @param domain parameters to used for this key * @param x the private key (if zero, generate a new random key) */ SM2_Encryption_PrivateKey(RandomNumberGenerator& rng, const EC_Group& domain, const BigInt& x = 0); bool check_key(RandomNumberGenerator& rng, bool) const override; std::unique_ptr create_decryption_op(RandomNumberGenerator& rng, const std::string& params, const std::string& provider) const override; }; } #endif botan-2.4.0/src/lib/pubkey/workfactor.cpp000066400000000000000000000030201322470703100203330ustar00rootroot00000000000000/* * Public Key Work Factor Functions * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { size_t ecp_work_factor(size_t bits) { return bits / 2; } size_t if_work_factor(size_t bits) { // RFC 3766: k * e^((1.92 + o(1)) * cubrt(ln(n) * (ln(ln(n)))^2)) // It estimates k at .02 and o(1) to be effectively zero for sizes of interest const double k = .02; // approximates natural logarithm of p const double log2_e = std::log2(std::exp(1)); const double log_p = bits / log2_e; const double est = 1.92 * std::pow(log_p * std::log(log_p) * std::log(log_p), 1.0/3.0); return static_cast(std::log2(k) + log2_e * est); } size_t dl_work_factor(size_t bits) { // Lacking better estimates... return if_work_factor(bits); } size_t dl_exponent_size(size_t bits) { /* This uses a slightly tweaked version of the standard work factor function above. It assumes k is 1 (thus overestimating the strength of the prime group by 5-6 bits), and always returns at least 128 bits (this only matters for very small primes). */ const size_t MIN_WORKFACTOR = 64; const double log2_e = std::log2(std::exp(1)); const double log_p = bits / log2_e; const double strength = 1.92 * std::pow(log_p, 1.0/3.0) * std::pow(std::log(log_p), 2.0/3.0); return 2 * std::max(MIN_WORKFACTOR, static_cast(log2_e * strength)); } } botan-2.4.0/src/lib/pubkey/workfactor.h000066400000000000000000000027661322470703100200200ustar00rootroot00000000000000/* * Public Key Work Factor Functions * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_WORKFACTOR_H_ #define BOTAN_WORKFACTOR_H_ #include namespace Botan { /** * Estimate work factor for discrete logarithm * @param prime_group_size size of the group in bits * @return estimated security level for this group */ BOTAN_PUBLIC_API(2,0) size_t dl_work_factor(size_t prime_group_size); /** * Return the appropriate exponent size to use for a particular prime * group. This is twice the size of the estimated cost of breaking the * key using an index calculus attack; the assumption is that if an * arbitrary discrete log on a group of size bits would take about 2^n * effort, and thus using an exponent of size 2^(2*n) implies that all * available attacks are about as easy (as e.g Pollard's kangaroo * algorithm can compute the DL in sqrt(x) operations) while minimizing * the exponent size for performance reasons. */ BOTAN_PUBLIC_API(2,0) size_t dl_exponent_size(size_t prime_group_size); /** * Estimate work factor for integer factorization * @param n_bits size of modulus in bits * @return estimated security level for this modulus */ BOTAN_PUBLIC_API(2,0) size_t if_work_factor(size_t n_bits); /** * Estimate work factor for EC discrete logarithm * @param prime_group_size size of the group in bits * @return estimated security level for this group */ BOTAN_PUBLIC_API(2,0) size_t ecp_work_factor(size_t prime_group_size); } #endif botan-2.4.0/src/lib/pubkey/x509_key.cpp000066400000000000000000000043041322470703100175350ustar00rootroot00000000000000/* * X.509 Public Key * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace X509 { std::vector BER_encode(const Public_Key& key) { // keeping it around for compat return key.subject_public_key(); } /* * PEM encode a X.509 public key */ std::string PEM_encode(const Public_Key& key) { return PEM_Code::encode(key.subject_public_key(), "PUBLIC KEY"); } /* * Extract a public key and return it */ Public_Key* load_key(DataSource& source) { try { AlgorithmIdentifier alg_id; std::vector key_bits; if(ASN1::maybe_BER(source) && !PEM_Code::matches(source)) { BER_Decoder(source) .start_cons(SEQUENCE) .decode(alg_id) .decode(key_bits, BIT_STRING) .end_cons(); } else { DataSource_Memory ber( PEM_Code::decode_check_label(source, "PUBLIC KEY") ); BER_Decoder(ber) .start_cons(SEQUENCE) .decode(alg_id) .decode(key_bits, BIT_STRING) .end_cons(); } if(key_bits.empty()) throw Decoding_Error("X.509 public key decoding failed"); return load_public_key(alg_id, key_bits).release(); } catch(Decoding_Error& e) { throw Decoding_Error("X.509 public key decoding failed: " + std::string(e.what())); } } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /* * Extract a public key and return it */ Public_Key* load_key(const std::string& fsname) { DataSource_Stream source(fsname, true); return X509::load_key(source); } #endif /* * Extract a public key and return it */ Public_Key* load_key(const std::vector& mem) { DataSource_Memory source(mem); return X509::load_key(source); } /* * Make a copy of this public key */ Public_Key* copy_key(const Public_Key& key) { DataSource_Memory source(PEM_encode(key)); return X509::load_key(source); } } } botan-2.4.0/src/lib/pubkey/x509_key.h000066400000000000000000000034431322470703100172050ustar00rootroot00000000000000/* * X.509 Public Key * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_PUBLIC_KEY_H_ #define BOTAN_X509_PUBLIC_KEY_H_ #include #include #include #include namespace Botan { class RandomNumberGenerator; class DataSource; /** * The two types of X509 encoding supported by Botan. * This enum is not used anymore, and will be removed in a future major release. */ enum X509_Encoding { RAW_BER, PEM }; /** * This namespace contains functions for handling X.509 public keys */ namespace X509 { /** * BER encode a key * @param key the public key to encode * @return BER encoding of this key */ BOTAN_PUBLIC_API(2,0) std::vector BER_encode(const Public_Key& key); /** * PEM encode a public key into a string. * @param key the key to encode * @return PEM encoded key */ BOTAN_PUBLIC_API(2,0) std::string PEM_encode(const Public_Key& key); /** * Create a public key from a data source. * @param source the source providing the DER or PEM encoded key * @return new public key object */ BOTAN_PUBLIC_API(2,0) Public_Key* load_key(DataSource& source); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Create a public key from a file * @param filename pathname to the file to load * @return new public key object */ BOTAN_PUBLIC_API(2,0) Public_Key* load_key(const std::string& filename); #endif /** * Create a public key from a memory region. * @param enc the memory region containing the DER or PEM encoded key * @return new public key object */ BOTAN_PUBLIC_API(2,0) Public_Key* load_key(const std::vector& enc); /** * Copy a key. * @param key the public key to copy * @return new public key object */ BOTAN_PUBLIC_API(2,0) Public_Key* copy_key(const Public_Key& key); } } #endif botan-2.4.0/src/lib/pubkey/xmss/000077500000000000000000000000001322470703100164455ustar00rootroot00000000000000botan-2.4.0/src/lib/pubkey/xmss/atomic.h000066400000000000000000000021761322470703100201000ustar00rootroot00000000000000/* * Atomic * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_ATOMIC_H_ #define BOTAN_ATOMIC_H_ #include #include namespace Botan { template /** * Simple helper class to expand std::atomic with copy constructor and copy * assignment operator, i.e. for use as element in a container like * std::vector. The construction of instances of this wrapper is NOT atomic * and needs to be properly guarded. **/ class Atomic final { public: Atomic() = default; Atomic(const Atomic& data) : m_data(data.m_data.load()) {} Atomic(const std::atomic& data) : m_data(data.load()) {} ~Atomic() = default; Atomic& operator=(const Atomic& a) { m_data.store(a.m_data.load()); return *this; } Atomic& operator=(const std::atomic& a) { m_data.store(a.load()); return *this; } operator std::atomic& () { return m_data; } operator T() { return m_data.load(); } private: std::atomic m_data; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/info.txt000066400000000000000000000010201322470703100201320ustar00rootroot00000000000000 XMSS -> 20161008 atomic.h xmss.h xmss_hash.h xmss_index_registry.h xmss_address.h xmss_common_ops.h xmss_parameters.h xmss_key_pair.h xmss_privatekey.h xmss_publickey.h xmss_tools.h xmss_wots_parameters.h xmss_wots_privatekey.h xmss_wots_publickey.h xmss_wots_addressed_privatekey.h xmss_wots_addressed_publickey.h xmss_signature.h xmss_signature_operation.h xmss_verification_operation.h asn1 rng hash sha2_32 botan-2.4.0/src/lib/pubkey/xmss/xmss.h000066400000000000000000000012611322470703100176100ustar00rootroot00000000000000/** * @file xmss.h * Includes headers required for Extended Hash-Based Signatures (XMSS) * as described in [1]. @see Botan::XMSS_PublicKey and @see * Botan::XMSS_PrivateKey for further * details. * *
 * [1] XMSS: Extended Hash-Based Signatures,
 *     draft-itrf-cfrg-xmss-hash-based-signatures-06
 *     Release: July 2016.
 *     https://datatracker.ietf.org/doc/draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1
 * 
* * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_H_ #define BOTAN_XMSS_H_ #include #include #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_address.h000066400000000000000000000323621322470703100213230ustar00rootroot00000000000000/* * XMSS Address * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_ADDRESS_H_ #define BOTAN_XMSS_ADDRESS_H_ #include namespace Botan { /** * Generic XMSS Address type holding 256 Bits of data. Properties * of all three address formats L-Tree-Address, Hash-Tree-Address, * OTS-Hash-Address can be called depending on the type currently * assigned to the XMSS address using set_type(). **/ class XMSS_Address final { public: /** * Distinct types an XMSS_Address can represent. The available types * are specified in [1] - 2.5 Hash Function Address Scheme. **/ enum class Type : uint8_t { None = 255, OTS_Hash_Address = 0, LTree_Address = 1, Hash_Tree_Address = 2 }; /** * The available modes for an XMSS Address: * - Key_Mode: Used to generate the key. * - Mask_Mode: Sets the n-byte bitmask (OTS-Hash-Address) * - Mask_MSB_Mode: Used to generate the b most significant bytes of * the 2n-byte bitmask (LTree Address and Hash Tree Address). * - Mask_LSB_Mode: Used to generated the b least significant bytes * of the 2n-byte bitmask. (LTree Address and Hash Tree Address). **/ enum class Key_Mask : uint8_t { Key_Mode = 0, Mask_Mode = 1, Mask_MSB_Mode = 1, Mask_LSB_Mode = 2 }; /** * Layer Address for XMSS is constantly zero and can not be changed this * property is only of relevance to XMSS_MT. * * @return Layer address, which is constant 0 for XMSS. **/ uint8_t get_layer_addr() const { return 0; } /** * Layer Address for XMSS is constantly zero and can not be changed this * property is only of relevance to XMSS_MT. Calling this method for * XMSS will result in an error. **/ void set_layer_addr() { BOTAN_ASSERT(false, "Only available in XMSS_MT."); } /** * Tree Address for XMSS is constantly zero and can not be changed this * property is only of relevance to XMSS_MT. * * @return Tree address, which is constant 0 for XMSS. **/ uint64_t get_tree_addr() const { return 0; } /** * Tree Address for XMSS is constantly zero and can not be changed this * property is only of relevance to XMSS_MT. Calling this method for * XMSS will result in an error. **/ void set_tree_addr() { BOTAN_ASSERT(false, "Only available in XMSS_MT."); } /** * retrieves the logical type currently assigned to the XMSS Address * instance. * * @return Type of the address (OTS_Hash_Address, LTree_Address or * Hash_Tree_Address) **/ Type get_type() const { return static_cast(m_data[15]); } /** * Changes the logical type currently assigned to the XMSS Address * instance. Please note that changing the type will automatically * reset the 128 LSBs of the Address to zero. This affects the * key_mask_mode property as well as all properties identified by * XMSS_Address::Property. * * @param type Type that shall be assigned to the address * (OTS_Hash_Address, LTree_Address or Hash_Tree_Address) **/ void set_type(Type type) { m_data[15] = static_cast(type); std::fill(m_data.begin() + 16, m_data.end(), static_cast(0)); } /** * Retrieves the mode the address os currently set to. (See * XMSS_Address::Key_Mask for details.) * * @return currently active mode **/ Key_Mask get_key_mask_mode() const { return Key_Mask(m_data[31]); } /** * Changes the mode the address currently used address mode. * (XMSS_Address::Key_Mask for details.) * * @param value Target mode. **/ void set_key_mask_mode(Key_Mask value) { BOTAN_ASSERT(value != Key_Mask::Mask_LSB_Mode || get_type() != Type::OTS_Hash_Address, "Invalid Key_Mask for current XMSS_Address::Type."); m_data[31] = static_cast(value); } /** * Retrieve the index of the OTS key pair within the tree. A call to * this method is only valid, if the address type is set to * Type::OTS_Hash_Address. * * @return index of OTS key pair. **/ uint32_t get_ots_address() const { BOTAN_ASSERT(get_type() == Type::OTS_Hash_Address, "get_ots_address() requires XMSS_Address::Type::" "OTS_Hash_Address."); return get_hi32(2); } /** * Sets the index of the OTS key pair within the tree. A call to this * method is only valid, if the address type is set to * Type::OTS_Hash_Address. * * @param value index of OTS key pair. **/ void set_ots_address(uint32_t value) { BOTAN_ASSERT(get_type() == Type::OTS_Hash_Address, "set_ots_address() requires XMSS_Address::Type::" "OTS_Hash_Address."); set_hi32(2, value); } /** * Retrieves the index of the leaf computed with this LTree. A call to * this method is only valid, if the address type is set to * Type::LTree_Address. * * @return index of the leaf. **/ uint32_t get_ltree_address() const { BOTAN_ASSERT(get_type() == Type::LTree_Address, "set_ltree_address() requires XMSS_Address::Type::" "LTree_Address."); return get_hi32(2); } /** * Sets the index of the leaf computed with this LTree. A call to this * method is only valid, if the address type is set to * Type::LTree_Address. * * @param value index of the leaf. **/ void set_ltree_address(uint32_t value) { BOTAN_ASSERT(get_type() == Type::LTree_Address, "set_ltree_address() requires XMSS_Address::Type::" "LTree_Address."); set_hi32(2, value); } /** * Retrieve the chain address. A call to this method is only valid, if * the address type is set to Type::OTS_Hash_Address. * * @return chain address. **/ uint32_t get_chain_address() const { BOTAN_ASSERT(get_type() == Type::OTS_Hash_Address, "get_chain_address() requires XMSS_Address::Type::" "OTS_Hash_Address."); return get_lo32(2); } /** * Set the chain address. A call to this method is only valid, if * the address type is set to Type::OTS_Hash_Address. **/ void set_chain_address(uint32_t value) { BOTAN_ASSERT(get_type() == Type::OTS_Hash_Address, "set_chain_address() requires XMSS_Address::Type::" "OTS_Hash_Address."); set_lo32(2, value); } /** * Retrieves the height of the tree node to be computed within the * tree. A call to this method is only valid, if the address type is * set to Type::LTree_Address or Type::Hash_Tree_Address. * * @return height of the tree node. **/ uint32_t get_tree_height() const { BOTAN_ASSERT(get_type() == Type::LTree_Address || get_type() == Type::Hash_Tree_Address, "get_tree_height() requires XMSS_Address::Type::" "LTree_Address or XMSS_Address::Type::Hash_Tree_Address."); return get_lo32(2); } /** * Sets the height of the tree node to be computed within the * tree. A call to this method is only valid, if the address type is * set to Type::LTree_Address or Type::Hash_Tree_Address. * * @param value height of the tree node. **/ void set_tree_height(uint32_t value) { BOTAN_ASSERT(get_type() == Type::LTree_Address || get_type() == Type::Hash_Tree_Address, "set_tree_height() requires XMSS_Address::Type::" "LTree_Address or XMSS_Address::Type::Hash_Tree_Address."); set_lo32(2, value); } /** * Retrieves the address of the hash function call within the chain. * A call to this method is only valid, if the address type is * set to Type::OTS_Hash_Address. * * @return address of the hash function call within chain. **/ uint32_t get_hash_address() const { BOTAN_ASSERT(get_type() == Type::OTS_Hash_Address, "get_hash_address() requires XMSS_Address::Type::" "OTS_Hash_Address."); return get_hi32(3); } /** * Sets the address of the hash function call within the chain. * A call to this method is only valid, if the address type is * set to Type::OTS_Hash_Address. * * @param value address of the hash function call within chain. **/ void set_hash_address(uint32_t value) { BOTAN_ASSERT(get_type() == Type::OTS_Hash_Address, "set_hash_address() requires XMSS_Address::Type::" "OTS_Hash_Address."); set_hi32(3, value); } /** * Retrieves the index of the tree node at current tree height in the * tree. A call to this method is only valid, if the address type is * set to Type::LTree_Address or Type::Hash_Tree_Address. * * @return index of the tree node at current height. **/ uint32_t get_tree_index() const { BOTAN_ASSERT(get_type() == Type::LTree_Address || get_type() == Type::Hash_Tree_Address, "get_tree_index() requires XMSS_Address::Type::" "LTree_Address or XMSS_Address::Type::Hash_Tree_Address."); return get_hi32(3); } /** * Sets the index of the tree node at current tree height in the * tree. A call to this method is only valid, if the address type is * set to Type::LTree_Address or Type::Hash_Tree_Address. * * @param value index of the tree node at current height. **/ void set_tree_index(uint32_t value) { BOTAN_ASSERT(get_type() == Type::LTree_Address || get_type() == Type::Hash_Tree_Address, "set_tree_index() requires XMSS_Address::Type::" "LTree_Address or XMSS_Address::Type::Hash_Tree_Address."); set_hi32(3, value); } const secure_vector& bytes() const { return m_data; } secure_vector& bytes() { return m_data; } /** * @return the size of an XMSS_Address **/ size_t size() const { return m_data.size(); } XMSS_Address() : m_data(m_address_size) { set_type(Type::None); } XMSS_Address(Type type) : m_data(m_address_size) { set_type(type); } XMSS_Address(const secure_vector& data) : m_data(data) { BOTAN_ASSERT(m_data.size() == m_address_size, "XMSS_Address must be of 256 bits size."); } XMSS_Address(secure_vector&& data) : m_data(std::move(data)) { BOTAN_ASSERT(m_data.size() == m_address_size, "XMSS_Address must be of 256 bits size."); } protected: secure_vector m_data; private: static const size_t m_address_size = 32; inline uint32_t get_hi32(size_t offset) const { return ((0x000000FF & m_data[8 * offset + 3]) | (0x000000FF & m_data[8 * offset + 2]) << 8 | (0x000000FF & m_data[8 * offset + 1]) << 16 | (0x000000FF & m_data[8 * offset ]) << 24); } inline void set_hi32(size_t offset, uint32_t value) { m_data[offset * 8 ] = ((value >> 24) & 0xFF); m_data[offset * 8 + 1] = ((value >> 16) & 0xFF); m_data[offset * 8 + 2] = ((value >> 8) & 0xFF); m_data[offset * 8 + 3] = ((value ) & 0xFF); } inline uint32_t get_lo32(size_t offset) const { return ((0x000000FF & m_data[8 * offset + 7]) | (0x000000FF & m_data[8 * offset + 6]) << 8 | (0x000000FF & m_data[8 * offset + 5]) << 16 | (0x000000FF & m_data[8 * offset + 4]) << 24); } inline void set_lo32(size_t offset, uint32_t value) { m_data[offset * 8 + 4] = ((value >> 24) & 0xFF); m_data[offset * 8 + 5] = ((value >> 16) & 0xFF); m_data[offset * 8 + 6] = ((value >> 8) & 0xFF); m_data[offset * 8 + 7] = ((value ) & 0xFF); } }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_common_ops.cpp000066400000000000000000000043441322470703100224010ustar00rootroot00000000000000/* * XMSS Common Ops * Operations shared by XMSS signature generation and verification operations. * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include namespace Botan { void XMSS_Common_Ops::randomize_tree_hash(secure_vector& result, const secure_vector& left, const secure_vector& right, XMSS_Address& adrs, const secure_vector& seed, XMSS_Hash& hash) { adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Key_Mode); secure_vector key { hash.prf(seed, adrs.bytes()) }; adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Mask_MSB_Mode); secure_vector bitmask_l { hash.prf(seed, adrs.bytes()) }; adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Mask_LSB_Mode); secure_vector bitmask_r { hash.prf(seed, adrs.bytes()) }; BOTAN_ASSERT(bitmask_l.size() == left.size() && bitmask_r.size() == right.size(), "Bitmask size doesn't match node size."); secure_vector concat_xor(m_xmss_params.element_size() * 2); for(size_t i = 0; i < left.size(); i++) { concat_xor[i] = left[i] ^ bitmask_l[i]; concat_xor[i + left.size()] = right[i] ^ bitmask_r[i]; } hash.h(result, key, concat_xor); } void XMSS_Common_Ops::create_l_tree(secure_vector& result, wots_keysig_t pk, XMSS_Address& adrs, const secure_vector& seed, XMSS_Hash& hash) { size_t l = m_xmss_params.len(); adrs.set_tree_height(0); while(l > 1) { for(size_t i = 0; i < l >> 1; i++) { adrs.set_tree_index(i); randomize_tree_hash(pk[i], pk[2 * i], pk[2 * i + 1], adrs, seed, hash); } if(l & 0x01) { pk[l >> 1] = pk[l - 1]; } l = (l >> 1) + (l & 0x01); adrs.set_tree_height(adrs.get_tree_height() + 1); } result = pk[0]; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_common_ops.h000066400000000000000000000105141322470703100220420ustar00rootroot00000000000000/* * XMSS Common Ops * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_COMMON_OPS_H_ #define BOTAN_XMSS_COMMON_OPS_H_ #include #include #include #include #include namespace Botan { typedef std::vector> wots_keysig_t; /** * Operations shared by XMSS signature generation and verification operations. **/ class XMSS_Common_Ops { public: XMSS_Common_Ops(XMSS_Parameters::xmss_algorithm_t oid) : m_xmss_params(oid), m_hash(m_xmss_params.hash_function_name()) {} protected: /** * Algorithm 7: "RAND_HASH" * * Generates a randomized hash. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each * thread. * * @param[out] result The resulting randomized hash. * @param[in] left Left half of the hash function input. * @param[in] right Right half of the hash function input. * @param[in] adrs Adress of the hash function call. * @param[in] seed The seed for G. * @param[in] hash Instance of XMSS_Hash, that may only by the thead * executing generate_public_key. **/ void randomize_tree_hash( secure_vector& result, const secure_vector& left, const secure_vector& right, XMSS_Address& adrs, const secure_vector& seed, XMSS_Hash& hash); /** * Algorithm 7: "RAND_HASH" * * Generates a randomized hash. * * @param[out] result The resulting randomized hash. * @param[in] left Left half of the hash function input. * @param[in] right Right half of the hash function input. * @param[in] adrs Adress of the hash function call. * @param[in] seed The seed for G. **/ inline void randomize_tree_hash( secure_vector& result, const secure_vector& left, const secure_vector& right, XMSS_Address& adrs, const secure_vector& seed) { randomize_tree_hash(result, left, right, adrs, seed, m_hash); } /** * Algorithm 8: "ltree" * Create an L-tree used to compute the leaves of the binary hash tree. * Takes a WOTS+ public key and compresses it to a single n-byte value. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each thread. * * @param[out] result Public key compressed to a single n-byte value * pk[0]. * @param[in] pk Winternitz One Time Signatures+ public key. * @param[in] adrs Address encoding the address of the L-Tree * @param[in] seed The seed generated during the public key generation. * @param[in] hash Instance of XMSS_Hash, that may only be used by the * thead executing create_l_tree. **/ void create_l_tree(secure_vector& result, wots_keysig_t pk, XMSS_Address& adrs, const secure_vector& seed, XMSS_Hash& hash); /** * Algorithm 8: "ltree" * Create an L-tree used to compute the leaves of the binary hash tree. * Takes a WOTS+ public key and compresses it to a single n-byte value. * * @param[out] result Public key compressed to a single n-byte value * pk[0]. * @param[in] pk Winternitz One Time Signatures+ public key. * @param[in] adrs Address encoding the address of the L-Tree * @param[in] seed The seed generated during the public key generation. **/ inline void create_l_tree(secure_vector& result, wots_keysig_t pk, XMSS_Address& adrs, const secure_vector& seed) { create_l_tree(result, pk, adrs, seed, m_hash); } protected: XMSS_Parameters m_xmss_params; XMSS_Hash m_hash; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_hash.cpp000066400000000000000000000043301322470703100211460ustar00rootroot00000000000000/* * XMSS Hash * A collection of pseudorandom hash functions required for XMSS and WOTS * computations. * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include namespace Botan { XMSS_Hash::XMSS_Hash(const XMSS_Hash& hash) : XMSS_Hash(hash.m_hash_func_name) { } XMSS_Hash::XMSS_Hash(const std::string& h_func_name) : m_hash(HashFunction::create(h_func_name)), m_hash_func_name(h_func_name) { if(!m_hash) throw Lookup_Error("XMSS cannot use hash " + h_func_name + " because it is unavailable"); m_output_length = m_hash->output_length(); BOTAN_ASSERT(m_output_length > 0, "Hash output length of zero is invalid."); m_zero_padding.resize(m_output_length - 1); m_msg_hash.reset(m_hash->clone()); } void XMSS_Hash::h(secure_vector& result, const secure_vector& key, const secure_vector& data) { m_hash->update(m_zero_padding); m_hash->update(m_id_h); m_hash->update(key); m_hash->update(data); m_hash->final(result); } void XMSS_Hash::h_msg_init(const secure_vector& randomness, const secure_vector& root, const secure_vector& index_bytes) { m_msg_hash->clear(); m_msg_hash->update(m_zero_padding); m_msg_hash->update(m_id_hmsg); m_msg_hash->update(randomness); m_msg_hash->update(root); m_msg_hash->update(index_bytes); } void XMSS_Hash::h_msg_update(const secure_vector& data) { m_msg_hash->update(data); } void XMSS_Hash::h_msg_update(const uint8_t data[], size_t size) { m_msg_hash->update(data, size); } secure_vector XMSS_Hash::h_msg_final() { return m_msg_hash->final(); } secure_vector XMSS_Hash::h_msg(const secure_vector& randomness, const secure_vector& root, const secure_vector& index_bytes, const secure_vector& data) { h_msg_init(randomness, root, index_bytes); m_msg_hash->update(data); return m_msg_hash->final(); } } botan-2.4.0/src/lib/pubkey/xmss/xmss_hash.h000066400000000000000000000121641322470703100206170ustar00rootroot00000000000000/* * XMSS Hash * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_HASH_H_ #define BOTAN_XMSS_HASH_H_ #include namespace Botan { /** * A collection of pseudorandom hash functions required for XMSS and WOTS * computations. **/ class XMSS_Hash final { public: XMSS_Hash(const std::string& h_func_name); XMSS_Hash(const XMSS_Hash& hash); /** * Pseudoranom function creating a hash out of a key and data using * a cryptographic hash function. * * @param[out] result The hash calculated using key and data. * @param[in] key An n-byte key value. * @param[in] data A 32-byte XMSS_Address data value **/ inline void prf(secure_vector& result, const secure_vector& key, const secure_vector& data) { m_hash->update(m_zero_padding); m_hash->update(m_id_prf); m_hash->update(key); m_hash->update(data); m_hash->final(result); } /** * Pseudoranom function creating a hash out of a key and data using * a cryptographic hash function. * * @param[in] key An n-byte key value. * @param[in] data A 32-byte XMSS_Address data value * @return result The hash calculated using key and data. **/ inline secure_vector prf(const secure_vector& key, const secure_vector& data) { m_hash->update(m_zero_padding); m_hash->update(m_id_prf); m_hash->update(key); m_hash->update(data); return m_hash->final(); } /** * F is a keyed cryptographic hash function used by the WOTS+ algorithm. * * @param[out] result The hash calculated using key and data. * @param[in] key key of length n bytes. * @param[in] data string of arbitrary length. **/ void f(secure_vector& result, const secure_vector& key, const secure_vector& data) { m_hash->update(m_zero_padding); m_hash->update(m_id_f); m_hash->update(key); m_hash->update(data); m_hash->final(result); } /** * Cryptographic hash function h accepting n byte keys and 2n byte * strings of data. * * @param[out] result The hash calculated using key and data. * @param[in] key key of length n bytes. * @param[in] data string of 2n bytes length. **/ void h(secure_vector& result, const secure_vector& key, const secure_vector& data); /** * Cryptographic hash function h accepting 3n byte keys and data * strings of arbitrary length. * * @param randomness n-byte value. * @param root n-byte root node. * @param index_bytes Index value padded with leading zeros. * @param data string of arbitrary length. * * @return hash value of n-bytes length. **/ secure_vector h_msg(const secure_vector& randomness, const secure_vector& root, const secure_vector& index_bytes, const secure_vector& data); /** * Initializes buffered h_msg computation with prefix data. * * @param randomness random n-byte value. * @param root n-byte root node. * @param index_bytes Index value padded with leading zeros. **/ void h_msg_init(const secure_vector& randomness, const secure_vector& root, const secure_vector& index_bytes); /** * Adds a message block to buffered h_msg computation. * * @param data A message block **/ void h_msg_update(const secure_vector& data); /** * Adds a message block to buffered h_msg computation. * * @param data A message block * @param size Length of the message block in bytes. **/ void h_msg_update(const uint8_t data[], size_t size); /** * Finalizes buffered h_msg computation and retrieves the result. * * @return Hash calculated using the prefix set by h_msg_init() and * message blocks provided through calls to h_msg_update(). **/ secure_vector h_msg_final(); size_t output_length() const { return m_output_length; } private: static const uint8_t m_id_f = 0x00; static const uint8_t m_id_h = 0x01; static const uint8_t m_id_hmsg = 0x02; static const uint8_t m_id_prf = 0x03; std::unique_ptr m_hash; std::unique_ptr m_msg_hash; //32 byte id prefixes prepended to the hash input. std::vector m_zero_padding; size_t m_output_length; const std::string m_hash_func_name; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_index_registry.cpp000066400000000000000000000041341322470703100232640ustar00rootroot00000000000000/* * XMSS Index Registry * A registry for XMSS private keys, keeps track of the leaf index for * independend copies of the same key. * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include #include namespace Botan { const std::string XMSS_Index_Registry::m_index_hash_function = "SHA-256"; uint64_t XMSS_Index_Registry::make_key_id( const secure_vector& private_seed, const secure_vector& prf) const { std::unique_ptr hash = HashFunction::create(m_index_hash_function); BOTAN_ASSERT(hash != nullptr, "XMSS_Index_Registry requires SHA-256"); hash->update(private_seed); hash->update(prf); secure_vector result = hash->final(); uint64_t key_id = 0; for(size_t i = 0; i < sizeof(key_id); i++) { key_id = ((key_id << 8) | result[i]); } return key_id; } std::shared_ptr> XMSS_Index_Registry::get(const secure_vector& private_seed, const secure_vector& prf) { size_t pos = get(make_key_id(private_seed, prf)); if(pos < std::numeric_limits::max()) { return m_leaf_indices[pos]; } else { return m_leaf_indices[add(make_key_id(private_seed, prf))]; } } size_t XMSS_Index_Registry::get(uint64_t id) const { for(size_t i = 0; i < m_key_ids.size(); i++) { if(m_key_ids[i] == id) { return i; } } return std::numeric_limits::max(); } size_t XMSS_Index_Registry::add(uint64_t id, size_t last_unused) { lock_guard_type lock(m_mutex); size_t pos = get(id); if(pos < m_key_ids.size()) { if(last_unused > *(m_leaf_indices[pos])) { m_leaf_indices[pos] = std::make_shared>(last_unused); } return pos; } m_key_ids.push_back(id); m_leaf_indices.push_back(std::make_shared>(last_unused)); return m_key_ids.size() - 1; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_index_registry.h000066400000000000000000000064371322470703100227410ustar00rootroot00000000000000/* * XMSS Index Registry * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_INDEX_REGISTRY_H_ #define BOTAN_XMSS_INDEX_REGISTRY_H_ #include #include #include namespace Botan { /** * A registry for XMSS private keys, keeps track of the leaf index for * independend copies of the same key. **/ class XMSS_Index_Registry final { public: XMSS_Index_Registry(const XMSS_Index_Registry&) = delete; XMSS_Index_Registry& operator=(const XMSS_Index_Registry&) = delete; /** * Retrieves a handle to the process-wide unique XMSS index registry. * * @return Reference to unique XMSS index registry. **/ static XMSS_Index_Registry& get_instance() { static XMSS_Index_Registry self; return self; } /** * Retrieves the last unused leaf index for the private key identified * by private_seed and prf. The leaf index will be updated properly * across independent copies of private_key. * * @param private_seed Part of the unique identifier for an * XMSS_PrivateKey. * @param prf Part of the unique identifier for an XMSS_PrivateKey. * * @return last unused leaf index for private_key. **/ std::shared_ptr> get(const secure_vector& private_seed, const secure_vector& prf); private: XMSS_Index_Registry() = default; static const std::string m_index_hash_function; /** * Creates a unique 64-bit id for an XMSS_Private key, by interpreting * the first 64-bit of HASH(PRIVATE_SEED || PRF) as 64 bit integer * value. * * @return unique integral identifier for an XMSS private key. **/ uint64_t make_key_id(const secure_vector& private_seed, const secure_vector& prf) const; /** * Retrieves the index position of a key within the registry or * max(size_t) if key has not been found. * * @param id unique id of the XMSS private key (see make_key_id()). * * @return index position of key or max(size_t) if key not found. **/ size_t get(uint64_t id) const; /** * If XMSS_PrivateKey identified by id is already registered, the * position of the according registry entry is returned. If last_unused * is bigger than the last unused index stored for the key identified by * id the unused leaf index for this key is set to last_unused. If no key * matching id is registed yet, an entry of id is added, with the last * unused leaf index initialized to the value of last_unused. * * @last_unused Initial value for the last unused leaf index of the * registered key. * * @return positon of leaf index registry entry for key identified * by id. **/ size_t add(uint64_t id, size_t last_unused = 0); std::vector m_key_ids; std::vector>> m_leaf_indices; mutex_type m_mutex; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_key_pair.h000066400000000000000000000025251322470703100214770ustar00rootroot00000000000000/* * XMSS Key Pair * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_KEY_PAIR_H_ #define BOTAN_XMSS_KEY_PAIR_H_ #include #include #include #include #include namespace Botan { /** * A pair of XMSS public and private key. **/ class BOTAN_PUBLIC_API(2,0) XMSS_Key_Pair { public: XMSS_Key_Pair(XMSS_Parameters::xmss_algorithm_t xmss_oid, RandomNumberGenerator& rng) : m_priv_key(xmss_oid, rng), m_pub_key(m_priv_key) {} XMSS_Key_Pair(const XMSS_PublicKey& pub_key, const XMSS_PrivateKey& priv_key) : m_priv_key(priv_key), m_pub_key(pub_key) {} XMSS_Key_Pair(XMSS_PublicKey&& pub_key, XMSS_PrivateKey&& priv_key) : m_priv_key(std::move(priv_key)), m_pub_key(std::move(pub_key)) {} const XMSS_PublicKey& public_key() const { return m_pub_key; } XMSS_PublicKey& public_key() { return m_pub_key; } const XMSS_PrivateKey& private_key() const { return m_priv_key; } XMSS_PrivateKey& private_key() { return m_priv_key; } private: XMSS_PrivateKey m_priv_key; XMSS_PublicKey m_pub_key; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_parameters.cpp000066400000000000000000000140151322470703100223670ustar00rootroot00000000000000/* * XMSS Parameters * Descibes a signature method for XMSS, as defined in: * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include namespace Botan { XMSS_Parameters::xmss_algorithm_t XMSS_Parameters::xmss_id_from_string(const std::string& param_set) { if(param_set == "XMSS_SHA2-256_W16_H10") { return XMSS_SHA2_256_W16_H10; } if(param_set == "XMSS_SHA2-256_W16_H16") { return XMSS_SHA2_256_W16_H16; } if(param_set == "XMSS_SHA2-256_W16_H20") { return XMSS_SHA2_256_W16_H20; } if(param_set == "XMSS_SHA2-512_W16_H10") { return XMSS_SHA2_512_W16_H10; } if(param_set == "XMSS_SHA2-512_W16_H16") { return XMSS_SHA2_512_W16_H16; } if(param_set == "XMSS_SHA2-512_W16_H20") { return XMSS_SHA2_512_W16_H20; } if(param_set == "XMSS_SHAKE128_W16_H10") { return XMSS_SHAKE128_W16_H10; } if(param_set == "XMSS_SHAKE128_W16_H16") { return XMSS_SHAKE128_W16_H16; } if(param_set == "XMSS_SHAKE128_W16_H20") { return XMSS_SHAKE128_W16_H20; } if(param_set == "XMSS_SHAKE256_W16_H10") { return XMSS_SHAKE256_W16_H10; } if(param_set == "XMSS_SHAKE256_W16_H16") { return XMSS_SHAKE256_W16_H16; } if(param_set == "XMSS_SHAKE256_W16_H20") { return XMSS_SHAKE256_W16_H20; } throw Lookup_Error("Unknown XMSS algorithm param '" + param_set + "'"); } XMSS_Parameters::XMSS_Parameters(const std::string& param_set) : XMSS_Parameters(XMSS_Parameters::xmss_id_from_string(param_set)) { } XMSS_Parameters::XMSS_Parameters(xmss_algorithm_t oid) : m_oid(oid) { switch(oid) { case XMSS_SHA2_256_W16_H10: m_element_size = 32; m_w = 16; m_len = 67; m_tree_height = 10; m_name = "XMSS_SHA2-256_W16_H10"; m_hash_name = "SHA-256"; m_strength = 256; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256_W16; break; case XMSS_SHA2_256_W16_H16: m_element_size = 32; m_w = 16; m_len = 67; m_tree_height = 16; m_name = "XMSS_SHA2-256_W16_H16"; m_hash_name = "SHA-256"; m_strength = 256; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256_W16; break; case XMSS_SHA2_256_W16_H20: m_element_size = 32; m_w = 16; m_len = 67; m_tree_height = 20; m_name = "XMSS_SHA2-256_W16_H20"; m_hash_name = "SHA-256"; m_strength = 256; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_256_W16; break; case XMSS_SHA2_512_W16_H10: m_element_size = 64; m_w = 16; m_len = 131; m_tree_height = 10; m_name = "XMSS_SHA2-512_W16_H10"; m_hash_name = "SHA-512"; m_strength = 512; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512_W16; break; case XMSS_SHA2_512_W16_H16: m_element_size = 64; m_w = 16; m_len = 131; m_tree_height = 16; m_name = "XMSS_SHA2-512_W16_H16"; m_hash_name = "SHA-512"; m_strength = 512; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512_W16; break; case XMSS_SHA2_512_W16_H20: m_element_size = 64; m_w = 16; m_len = 131; m_tree_height = 20; m_name = "XMSS_SHA2-512_W16_H20"; m_hash_name = "SHA-512"; m_strength = 512; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHA2_512_W16; break; case XMSS_SHAKE128_W16_H10: m_element_size = 32; m_w = 16; m_len = 67; m_tree_height = 10; m_name = "XMSS_SHAKE128_W16_H10"; m_hash_name = "SHAKE-128(256)"; m_strength = 256; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE128_W16; break; case XMSS_SHAKE128_W16_H16: m_element_size = 32; m_w = 16; m_len = 67; m_tree_height = 16; m_name = "XMSS_SHAKE128_W16_H16"; m_hash_name = "SHAKE-128(256)"; m_strength = 256; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE128_W16; break; case XMSS_SHAKE128_W16_H20: m_element_size = 32; m_w = 16; m_len = 67; m_tree_height = 20; m_name = "XMSS_SHAKE128_W16_H20"; m_hash_name = "SHAKE-128(256)"; m_strength = 256; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE128_W16; break; case XMSS_SHAKE256_W16_H10: m_element_size = 64; m_w = 16; m_len = 131; m_tree_height = 10; m_name = "XMSS_SHAKE256_W16_H10"; m_hash_name = "SHAKE-256(512)"; m_strength = 512; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE256_W16; break; case XMSS_SHAKE256_W16_H16: m_element_size = 64; m_w = 16; m_len = 131; m_tree_height = 16; m_name = "XMSS_SHAKE256_W16_H16"; m_hash_name = "SHAKE-256(512)"; m_strength = 512; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE256_W16; break; case XMSS_SHAKE256_W16_H20: m_element_size = 64; m_w = 16; m_len = 131; m_tree_height = 20; m_name = "XMSS_SHAKE256_W16_H20"; m_hash_name = "SHAKE-256(512)"; m_strength = 512; m_wots_oid = XMSS_WOTS_Parameters::ots_algorithm_t::WOTSP_SHAKE256_W16; break; default: throw Unsupported_Argument( "Algorithm id does not match any XMSS algorithm id."); break; } } } botan-2.4.0/src/lib/pubkey/xmss/xmss_parameters.h000066400000000000000000000061011322470703100220310ustar00rootroot00000000000000/* * XMSS Parameters * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_PARAMETERS_H_ #define BOTAN_XMSS_PARAMETERS_H_ #include #include namespace Botan { /** * Descibes a signature method for XMSS, as defined in: * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 **/ class BOTAN_PUBLIC_API(2,0) XMSS_Parameters { public: enum xmss_algorithm_t { XMSS_SHA2_256_W16_H10 = 0x01000001, XMSS_SHA2_256_W16_H16 = 0x02000002, XMSS_SHA2_256_W16_H20 = 0x03000003, XMSS_SHA2_512_W16_H10 = 0x04000004, XMSS_SHA2_512_W16_H16 = 0x05000005, XMSS_SHA2_512_W16_H20 = 0x06000006, XMSS_SHAKE128_W16_H10 = 0x07000007, XMSS_SHAKE128_W16_H16 = 0x08000008, XMSS_SHAKE128_W16_H20 = 0x09000009, XMSS_SHAKE256_W16_H10 = 0x0a00000a, XMSS_SHAKE256_W16_H16 = 0x0b00000b, XMSS_SHAKE256_W16_H20 = 0x0c00000c }; static xmss_algorithm_t xmss_id_from_string(const std::string& algo_name); XMSS_Parameters(const std::string& algo_name); XMSS_Parameters(xmss_algorithm_t oid); /** * @return XMSS registry name for the chosen parameter set. **/ const std::string& name() const { return m_name; } const std::string& hash_function_name() const { return m_hash_name; } /** * Retrieves the uniform length of a message, and the size of * each node. This correlates to XMSS parameter "n" defined * in [1]. * * @return element length in bytes. **/ size_t element_size() const { return m_element_size; } /** * @returns The height (number of levels - 1) of the tree **/ size_t tree_height() const { return m_tree_height; } /** * The Winternitz parameter. * * @return numeric base used for internal representation of * data. **/ size_t wots_parameter() const { return m_w; } size_t len() const { return m_len; } xmss_algorithm_t oid() const { return m_oid; } XMSS_WOTS_Parameters::ots_algorithm_t ots_oid() const { return m_wots_oid; } /** * Returns the estimated pre-quantum security level of * the chosen algorithm. **/ size_t estimated_strength() const { return m_strength; } bool operator==(const XMSS_Parameters& p) const { return m_oid == p.m_oid; } private: xmss_algorithm_t m_oid; XMSS_WOTS_Parameters::ots_algorithm_t m_wots_oid; std::string m_name; std::string m_hash_name; size_t m_element_size; size_t m_tree_height; size_t m_w; size_t m_len; size_t m_strength; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_privatekey.cpp000066400000000000000000000255761322470703100224250ustar00rootroot00000000000000/* * XMSS Private Key * An XMSS: Extended Hash-Based Siganture private key. * The XMSS private key does not support the X509 and PKCS7 standard. Instead * the raw format described in [1] is used. * * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #endif namespace Botan { XMSS_PrivateKey::XMSS_PrivateKey(const secure_vector& raw_key) : XMSS_PublicKey(unlock(raw_key)), XMSS_Common_Ops(XMSS_PublicKey::m_xmss_params.oid()), m_wots_priv_key(m_wots_params.oid(), m_public_seed), m_index_reg(XMSS_Index_Registry::get_instance()) { BOTAN_ASSERT(sizeof(size_t) >= std::ceil( static_cast(XMSS_PublicKey::m_xmss_params.tree_height()) / 8.f), "System type \"size_t\" not big enough to support" " leaf index."); if(raw_key.size() != size()) { throw Integrity_Failure("Invalid XMSS private key size detected."); } // extract & copy unused leaf index from raw_key. uint64_t unused_leaf = 0; auto begin = (raw_key.begin() + XMSS_PublicKey::size()); auto end = raw_key.begin() + XMSS_PublicKey::size() + sizeof(uint64_t); for(auto& i = begin; i != end; i++) { unused_leaf = ((unused_leaf << 8) | *i); } if(unused_leaf >= (1ull << (XMSS_PublicKey::m_xmss_params.tree_height() - 1))) { throw Integrity_Failure("XMSS private key leaf index out of " "bounds."); } begin = end; end = begin + XMSS_PublicKey::m_xmss_params.element_size(); m_prf.clear(); m_prf.reserve(XMSS_PublicKey::m_xmss_params.element_size()); std::copy(begin, end, std::back_inserter(m_prf)); begin = end; end = begin + m_wots_params.element_size(); m_wots_priv_key.set_private_seed(secure_vector(begin, end)); set_unused_leaf_index(static_cast(unused_leaf)); } XMSS_PrivateKey::XMSS_PrivateKey( XMSS_Parameters::xmss_algorithm_t xmss_algo_id, RandomNumberGenerator& rng) : XMSS_PublicKey(xmss_algo_id, rng), XMSS_Common_Ops(xmss_algo_id), m_wots_priv_key(XMSS_PublicKey::m_xmss_params.ots_oid(), public_seed(), rng), m_prf(rng.random_vec(XMSS_PublicKey::m_xmss_params.element_size())), m_index_reg(XMSS_Index_Registry::get_instance()) { XMSS_Address adrs; set_root(tree_hash(0, XMSS_PublicKey::m_xmss_params.tree_height(), adrs)); } secure_vector XMSS_PrivateKey::tree_hash(size_t start_idx, size_t target_node_height, XMSS_Address& adrs) { BOTAN_ASSERT((start_idx % (1 << target_node_height)) == 0, "Start index must be divisible by 2^{target node height}."); #if defined(BOTAN_TARGET_OS_HAS_THREADS) // dertermine number of parallel tasks to split the tree_hashing into. size_t split_level = std::min( { target_node_height, static_cast( std::ceil(std::log2(XMSS_Tools::max_threads()))) }); // skip parallelization overhead for leaf nodes. if(split_level == 0) { #endif secure_vector result; tree_hash_subtree(result, start_idx, target_node_height, adrs); return result; #if defined(BOTAN_TARGET_OS_HAS_THREADS) } size_t subtrees = 1 << split_level; size_t last_idx = static_cast(1 << (target_node_height)) + start_idx; size_t offs = (last_idx - start_idx) / subtrees; uint8_t level = split_level; // current level in the tree BOTAN_ASSERT((last_idx - start_idx) % subtrees == 0, "Number of worker threads in tree_hash need to divide range " "of calculated nodes."); std::vector> nodes( subtrees, secure_vector(XMSS_PublicKey::m_xmss_params.element_size())); std::vector node_addresses(subtrees, adrs); std::vector xmss_hash(subtrees, m_hash); std::vector threads; threads.reserve(subtrees); // Calculate multiple subtrees in parallel. for(size_t i = 0; i < subtrees; i++) { using tree_hash_subtree_fn_t = void (XMSS_PrivateKey::*)(secure_vector&, size_t, size_t, XMSS_Address&, XMSS_Hash&); threads.emplace_back( std::thread( static_cast( &XMSS_PrivateKey::tree_hash_subtree), this, std::ref(nodes[i]), start_idx + i * offs, target_node_height - split_level, std::ref(node_addresses[i]), std::ref(xmss_hash[i]))); } for(auto& t : threads) { t.join(); } threads.clear(); // Parallelize the top tree levels horizontally while(level-- > 1) { std::vector> ro_nodes( nodes.begin(), nodes.begin() + (1 << (level+1))); for(size_t i = 0; i < (1U << level); i++) { node_addresses[i].set_tree_height(target_node_height - (level + 1)); node_addresses[i].set_tree_index( (node_addresses[2 * i + 1].get_tree_index() - 1) >> 1); using rnd_tree_hash_fn_t = void (XMSS_PrivateKey::*)(secure_vector&, const secure_vector&, const secure_vector&, XMSS_Address& adrs, const secure_vector&, XMSS_Hash&); threads.emplace_back( std::thread( static_cast( &XMSS_PrivateKey::randomize_tree_hash), this, std::ref(nodes[i]), std::ref(ro_nodes[2 * i]), std::ref(ro_nodes[2 * i + 1]), std::ref(node_addresses[i]), std::ref(this->public_seed()), std::ref(xmss_hash[i]))); } for(auto &t : threads) { t.join(); } threads.clear(); } // Avoid creation an extra thread to calculate root node. node_addresses[0].set_tree_height(target_node_height - 1); node_addresses[0].set_tree_index( (node_addresses[1].get_tree_index() - 1) >> 1); randomize_tree_hash(nodes[0], nodes[0], nodes[1], node_addresses[0], this->public_seed()); return nodes[0]; #endif } void XMSS_PrivateKey::tree_hash_subtree(secure_vector& result, size_t start_idx, size_t target_node_height, XMSS_Address& adrs, XMSS_Hash& hash) { const secure_vector& seed = this->public_seed(); std::vector> nodes( target_node_height + 1, secure_vector(XMSS_PublicKey::m_xmss_params.element_size())); // node stack, holds all nodes on stack and one extra "pending" node. This // temporary node referred to as "node" in the XMSS standard document stays // a pending element, meaning it is not regarded as element on the stack // until level is increased. std::vector node_levels(target_node_height + 1); uint8_t level = 0; // current level on the node stack. XMSS_WOTS_PublicKey pk(m_wots_priv_key.wots_parameters().oid(), seed); size_t last_idx = static_cast(1 << target_node_height) + start_idx; for(size_t i = start_idx; i < last_idx; i++) { adrs.set_type(XMSS_Address::Type::OTS_Hash_Address); adrs.set_ots_address(i); this->wots_private_key().generate_public_key( pk, // getWOTS_SK(SK, s + i), reference implementation uses adrs // instead of zero padded index s + i. this->wots_private_key().at(adrs, hash), adrs, hash); adrs.set_type(XMSS_Address::Type::LTree_Address); adrs.set_ltree_address(i); create_l_tree(nodes[level], pk, adrs, seed, hash); node_levels[level] = 0; adrs.set_type(XMSS_Address::Type::Hash_Tree_Address); adrs.set_tree_height(0); adrs.set_tree_index(i); while(level > 0 && node_levels[level] == node_levels[level - 1]) { adrs.set_tree_index(((adrs.get_tree_index() - 1) >> 1)); randomize_tree_hash(nodes[level - 1], nodes[level - 1], nodes[level], adrs, seed, hash); node_levels[level - 1]++; level--; //Pop stack top element adrs.set_tree_height(adrs.get_tree_height() + 1); } level++; //push temporary node to stack } result = nodes[level - 1]; } std::shared_ptr> XMSS_PrivateKey::recover_global_leaf_index() const { BOTAN_ASSERT(m_wots_priv_key.private_seed().size() == XMSS_PublicKey::m_xmss_params.element_size() && m_prf.size() == XMSS_PublicKey::m_xmss_params.element_size(), "Trying to retrieve index for partially initialized " "key."); return m_index_reg.get(m_wots_priv_key.private_seed(), m_prf); } secure_vector XMSS_PrivateKey::raw_private_key() const { std::vector pk { raw_public_key() }; secure_vector result(pk.begin(), pk.end()); result.reserve(size()); for(int i = 7; i >= 0; i--) { result.push_back( static_cast( static_cast(unused_leaf_index()) >> 8 * i)); } std::copy(m_prf.begin(), m_prf.end(), std::back_inserter(result)); std::copy(m_wots_priv_key.private_seed().begin(), m_wots_priv_key.private_seed().end(), std::back_inserter(result)); return result; } std::unique_ptr XMSS_PrivateKey::create_signature_op(RandomNumberGenerator&, const std::string&, const std::string& provider) const { if(provider == "base" || provider.empty()) return std::unique_ptr( new XMSS_Signature_Operation(*this)); throw Provider_Not_Found(algo_name(), provider); } } botan-2.4.0/src/lib/pubkey/xmss/xmss_privatekey.h000066400000000000000000000220071322470703100220540ustar00rootroot00000000000000/* * XMSS_PrivateKey.h * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_PRIVATEKEY_H_ #define BOTAN_XMSS_PRIVATEKEY_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /** * An XMSS: Extended Hash-Based Signature private key. * The XMSS private key does not support the X509 and PKCS7 standard. Instead * the raw format described in [1] is used. * * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 **/ class BOTAN_PUBLIC_API(2,0) XMSS_PrivateKey final : public virtual XMSS_PublicKey, public XMSS_Common_Ops, public virtual Private_Key { public: /** * Creates a new XMSS private key for the chosen XMSS signature method. * New seeds for public/private key and pseudo random function input are * generated using the provided RNG. The appropriate WOTS signature method * will be automatically set based on the chosen XMSS signature method. * * @param xmss_algo_id Identifier for the selected XMSS signature method. * @param rng A random number generator to use for key generation. **/ XMSS_PrivateKey(XMSS_Parameters::xmss_algorithm_t xmss_algo_id, RandomNumberGenerator& rng); /** * Creates an XMSS_PrivateKey from a byte sequence produced by * raw_private_key(). * * @param raw_key An XMSS private key serialized using raw_private_key(). **/ XMSS_PrivateKey(const secure_vector& raw_key); /** * Creates a new XMSS private key for the chosen XMSS signature method * using precomputed seeds for public/private keys and pseudo random * function input. The appropriate WOTS signature method will be * automatically set, based on the chosen XMSS signature method. * * @param xmss_algo_id Identifier for the selected XMSS signature method. * @param idx_leaf Index of the next unused leaf. * @param wots_priv_seed A seed to generate a Winternitz-One-Time- * Signature private key from. * @param prf a secret n-byte key sourced from a secure source * of uniformly random data. * @param root Root node of the binary hash tree. * @param public_seed The public seed. **/ XMSS_PrivateKey(XMSS_Parameters::xmss_algorithm_t xmss_algo_id, size_t idx_leaf, const secure_vector& wots_priv_seed, const secure_vector& prf, const secure_vector& root, const secure_vector& public_seed) : XMSS_PublicKey(xmss_algo_id, root, public_seed), XMSS_Common_Ops(xmss_algo_id), m_wots_priv_key(XMSS_PublicKey::m_xmss_params.ots_oid(), public_seed, wots_priv_seed), m_prf(prf), m_index_reg(XMSS_Index_Registry::get_instance()) { set_unused_leaf_index(idx_leaf); } /** * Retrieves the last unused leaf index of the private key. Reusing a leaf * by utilizing leaf indices lower than the last unused leaf index will * compromise security. * * @return Index of the last unused leaf. **/ size_t unused_leaf_index() const { return *recover_global_leaf_index(); } /** * Sets the last unused leaf index of the private key. The leaf index * will be updated automatically during every signing operation, and * should not be set manually. * * @param idx Index of the last unused leaf. **/ void set_unused_leaf_index(size_t idx) { if(idx >= (1ull << (XMSS_PublicKey::m_xmss_params.tree_height() - 1))) { throw Integrity_Failure("XMSS private key leaf index out of " "bounds."); } else { std::atomic& index = static_cast&>(*recover_global_leaf_index()); size_t current = 0; do { current = index.load(); if(current > idx) { return; } } while(!index.compare_exchange_strong(current, idx)); } } size_t reserve_unused_leaf_index() { size_t idx = (static_cast&>( *recover_global_leaf_index())).fetch_add(1); if(idx >= (1ull << (XMSS_PublicKey::m_xmss_params.tree_height() - 1))) { throw Integrity_Failure("XMSS private key, one time signatures " "exhausted."); } return idx; } /** * Winternitz One Time Signature Scheme key utilized for signing * operations. * * @return WOTS+ private key. **/ const XMSS_WOTS_PrivateKey& wots_private_key() const { return m_wots_priv_key; } /** * Winternitz One Time Signature Scheme key utilized for signing * operations. * * @return WOTS+ private key. **/ XMSS_WOTS_PrivateKey& wots_private_key() { return m_wots_priv_key; } const secure_vector& prf() const { return m_prf; } secure_vector& prf() { return m_prf; } void set_public_seed( const secure_vector& public_seed) override { m_public_seed = public_seed; m_wots_priv_key.set_public_seed(public_seed); } void set_public_seed(secure_vector&& public_seed) override { m_public_seed = std::move(public_seed); m_wots_priv_key.set_public_seed(m_public_seed); } const secure_vector& public_seed() const override { return m_public_seed; } std::unique_ptr create_signature_op(RandomNumberGenerator&, const std::string&, const std::string& provider) const override; secure_vector private_key_bits() const override { return raw_private_key(); } size_t size() const override { return XMSS_PublicKey::size() + sizeof(uint64_t) + 2 * XMSS_PublicKey::m_xmss_params.element_size(); } /** * Generates a non standartized byte sequence representing the XMSS * private key. * * @return byte sequence consisting of the following elements in order: * 4-byte OID, n-byte root node, n-byte public seed, * 8-byte unused leaf index, n-byte prf seed, n-byte private seed. **/ secure_vector raw_private_key() const; /** * Algorithm 9: "treeHash" * Computes the internal n-byte nodes of a Merkle tree. * * @param start_idx The start index. * @param target_node_height Height of the target node. * @param adrs Address of the tree containing the target node. * * @return The root node of a tree of height target_node height with the * leftmost leaf being the hash of the WOTS+ pk with index * start_idx. **/ secure_vector tree_hash( size_t start_idx, size_t target_node_height, XMSS_Address& adrs); private: /** * Fetches shared unused leaf index from the index registry **/ std::shared_ptr> recover_global_leaf_index() const; inline void tree_hash_subtree(secure_vector& result, size_t start_idx, size_t target_node_height, XMSS_Address& adrs) { return tree_hash_subtree(result, start_idx, target_node_height, adrs, m_hash); } /** * Helper for multithreaded tree hashing. */ void tree_hash_subtree(secure_vector& result, size_t start_idx, size_t target_node_height, XMSS_Address& adrs, XMSS_Hash& hash); XMSS_WOTS_PrivateKey m_wots_priv_key; secure_vector m_prf; XMSS_Index_Registry& m_index_reg; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_publickey.cpp000066400000000000000000000055051322470703100222170ustar00rootroot00000000000000/* * XMSS Public Key * An XMSS: Extended Hash-Based Siganture public key. * The XMSS public key does not support the X509 standard. Instead the * raw format described in [1] is used. * * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include namespace Botan { XMSS_PublicKey::XMSS_PublicKey(const std::vector& raw_key) : m_xmss_params(XMSS_PublicKey::deserialize_xmss_oid(raw_key)), m_wots_params(m_xmss_params.ots_oid()) { if(raw_key.size() < size()) { throw Integrity_Failure("Invalid XMSS public key size detected."); } // extract & copy root from raw key. m_root.clear(); m_root.reserve(m_xmss_params.element_size()); auto begin = raw_key.begin() + sizeof(uint32_t); auto end = begin + m_xmss_params.element_size(); std::copy(begin, end, std::back_inserter(m_root)); // extract & copy public seed from raw key. begin = end; end = begin + m_xmss_params.element_size(); m_public_seed.clear(); m_public_seed.reserve(m_xmss_params.element_size()); std::copy(begin, end, std::back_inserter(m_public_seed)); } XMSS_Parameters::xmss_algorithm_t XMSS_PublicKey::deserialize_xmss_oid(const std::vector& raw_key) { if(raw_key.size() < 4) { throw Integrity_Failure("XMSS signature OID missing."); } // extract and convert algorithm id to enum type uint32_t raw_id = 0; for(size_t i = 0; i < 4; i++) { raw_id = ((raw_id << 8) | raw_key[i]); } return static_cast(raw_id); } std::unique_ptr XMSS_PublicKey::create_verification_op(const std::string&, const std::string& provider) const { if(provider == "base" || provider.empty()) { return std::unique_ptr( new XMSS_Verification_Operation(*this)); } throw Provider_Not_Found(algo_name(), provider); } std::vector XMSS_PublicKey::raw_public_key() const { std::vector result { static_cast(m_xmss_params.oid() >> 24), static_cast(m_xmss_params.oid() >> 16), static_cast(m_xmss_params.oid() >> 8), static_cast(m_xmss_params.oid()) }; std::copy(m_root.begin(), m_root.end(), std::back_inserter(result)); std::copy(m_public_seed.begin(), m_public_seed.end(), std::back_inserter(result)); return result; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_publickey.h000066400000000000000000000171331322470703100216640ustar00rootroot00000000000000/* * XMSS Public Key * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_PUBLICKEY_H_ #define BOTAN_XMSS_PUBLICKEY_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { class XMSS_Verification_Operation; /** * An XMSS: Extended Hash-Based Signature public key. * The XMSS public key does not support the X509 standard. Instead the * raw format described in [1] is used. * * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 **/ class BOTAN_PUBLIC_API(2,0) XMSS_PublicKey : public virtual Public_Key { public: /** * Creates a new XMSS public key for the chosen XMSS signature method. * New public and prf seeds are generated using rng. The appropriate WOTS * signature method will be automatically set based on the chosen XMSS * signature method. * * @param xmss_oid Identifier for the selected XMSS signature method. * @param rng A random number generator to use for key generation. **/ XMSS_PublicKey(XMSS_Parameters::xmss_algorithm_t xmss_oid, RandomNumberGenerator& rng) : m_xmss_params(xmss_oid), m_wots_params(m_xmss_params.ots_oid()), m_root(m_xmss_params.element_size()), m_public_seed(rng.random_vec(m_xmss_params.element_size())) {} /** * Creates an XMSS public key from a byte sequence produced by * raw_private_key(). **/ XMSS_PublicKey(const std::vector& raw_key); /** * Creates a new XMSS public key for a chosen XMSS signature method as * well as pre-computed root node and public_seed values. * * @param xmss_oid Identifier for the selected XMSS signature method. * @param root Root node value. * @param public_seed Public seed value. **/ XMSS_PublicKey(XMSS_Parameters::xmss_algorithm_t xmss_oid, const secure_vector& root, const secure_vector& public_seed) : m_xmss_params(xmss_oid), m_wots_params(m_xmss_params.ots_oid()), m_root(root), m_public_seed(public_seed) {} /** * Creates a new XMSS public key for a chosen XMSS signature method as * well as pre-computed root node and public_seed values. * * @param xmss_oid Identifier for the selected XMSS signature method. * @param root Root node value. * @param public_seed Public seed value. **/ XMSS_PublicKey(XMSS_Parameters::xmss_algorithm_t xmss_oid, secure_vector&& root, secure_vector&& public_seed) : m_xmss_params(xmss_oid), m_wots_params(m_xmss_params.ots_oid()), m_root(std::move(root)), m_public_seed(std::move(public_seed)) {} /** * Retrieves the chosen XMSS signature method. * * @return XMSS signature method identifier. **/ XMSS_Parameters::xmss_algorithm_t xmss_oid() const { return m_xmss_params.oid(); } /** * Sets the chosen XMSS signature method **/ void set_xmss_oid(XMSS_Parameters::xmss_algorithm_t xmss_oid) { m_xmss_params = XMSS_Parameters(xmss_oid); m_wots_params = XMSS_WOTS_Parameters(m_xmss_params.ots_oid()); } /** * Retrieves the XMSS parameters determined by the chosen XMSS Signature * method. * * @return XMSS parameters. **/ const XMSS_Parameters& xmss_parameters() const { return m_xmss_params; } /** * Retrieves the Winternitz One Time Signature (WOTS) method, * corrseponding to the chosen XMSS signature method. * * @return XMSS WOTS signature method identifier. **/ XMSS_WOTS_Parameters::ots_algorithm_t wots_oid() const { return m_wots_params.oid(); } /** * Retrieves the Winternitz One Time Signature (WOTS) parameters * corresponding to the chosen XMSS signature method. * * @return XMSS WOTS signature method parameters. **/ const XMSS_WOTS_Parameters& wots_parameters() const { return m_wots_params; } secure_vector& root() { return m_root; } void set_root(const secure_vector& root) { m_root = root; } void set_root(secure_vector&& root) { m_root = std::move(root); } const secure_vector& root() const { return m_root; } virtual secure_vector& public_seed() { return m_public_seed; } virtual void set_public_seed(const secure_vector& public_seed) { m_public_seed = public_seed; } virtual void set_public_seed(secure_vector&& public_seed) { m_public_seed = std::move(public_seed); } virtual const secure_vector& public_seed() const { return m_public_seed; } std::string algo_name() const override { return "XMSS"; } AlgorithmIdentifier algorithm_identifier() const override { return AlgorithmIdentifier(get_oid(), AlgorithmIdentifier::USE_NULL_PARAM); } bool check_key(RandomNumberGenerator&, bool) const override { return true; } std::unique_ptr create_verification_op(const std::string&, const std::string& provider) const override; size_t estimated_strength() const override { return m_xmss_params.estimated_strength(); } size_t key_length() const override { return m_xmss_params.estimated_strength(); } /** * Returns a raw byte sequence as defined in [1]. * This method acts as an alias for raw_public_key(). * * @return raw public key bits. **/ std::vector public_key_bits() const override { return raw_public_key(); } /** * Size in bytes of the serialized XMSS public key produced by * raw_public_key(). * * @return size in bytes of serialized Public Key. **/ virtual size_t size() const { return sizeof(uint32_t) + 2 * m_xmss_params.element_size(); } /** * Generates a non standardized byte sequence representing the XMSS * public key, as defined in [1] (p. 23, "XMSS Public Key") * * @return 4-byte OID, followed by n-byte root node, followed by * public seed. **/ virtual std::vector raw_public_key() const; protected: XMSS_Parameters m_xmss_params; XMSS_WOTS_Parameters m_wots_params; secure_vector m_root; secure_vector m_public_seed; private: XMSS_Parameters::xmss_algorithm_t deserialize_xmss_oid( const std::vector& raw_key); }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_signature.cpp000066400000000000000000000061541322470703100222320ustar00rootroot00000000000000/* * XMSS Signature * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include namespace Botan { XMSS_Signature::XMSS_Signature(XMSS_Parameters::xmss_algorithm_t oid, const secure_vector& raw_sig) : m_leaf_idx(0), m_randomness(0, 0x00), m_tree_sig() { BOTAN_ASSERT(sizeof(size_t) >= std::ceil(static_cast( (XMSS_Parameters(oid)).tree_height()) / 8.f), "System type \"size_t\" not big enough to support" " leaf index."); XMSS_Parameters xmss_params(oid); uint64_t leaf_idx = 0; for(size_t i = 0; i < 8; i++) { leaf_idx = ((leaf_idx << 8) | raw_sig[i]); } if(leaf_idx >= (1ull << (xmss_params.tree_height() - 1))) { throw Integrity_Failure("XMSS signature leaf index out of " "bounds."); } m_leaf_idx = static_cast(leaf_idx); auto begin = raw_sig.begin() + sizeof(uint64_t); auto end = begin + xmss_params.element_size(); std::copy(begin, end, std::back_inserter(m_randomness)); for(size_t i = 0; i < xmss_params.len(); i++) { begin = end; end = begin + xmss_params.element_size(); m_tree_sig.ots_signature().push_back(secure_vector(0)); m_tree_sig.ots_signature().back().reserve( xmss_params.element_size()); std::copy(begin, end, std::back_inserter(m_tree_sig.ots_signature().back())); } for(size_t i = 0; i < xmss_params.tree_height(); i++) { begin = end; end = begin + xmss_params.element_size(); m_tree_sig.authentication_path().push_back(secure_vector(0)); m_tree_sig.authentication_path().back().reserve( xmss_params.element_size()); std::copy(begin, end, std::back_inserter(m_tree_sig.authentication_path().back())); } } secure_vector XMSS_Signature::bytes() const { secure_vector result { static_cast(static_cast(m_leaf_idx) >> 56U), static_cast(static_cast(m_leaf_idx) >> 48U), static_cast(static_cast(m_leaf_idx) >> 40U), static_cast(static_cast(m_leaf_idx) >> 32U), static_cast(static_cast(m_leaf_idx) >> 24U), static_cast(static_cast(m_leaf_idx) >> 16U), static_cast(static_cast(m_leaf_idx) >> 8U), static_cast(static_cast(m_leaf_idx)) }; std::copy(m_randomness.begin(), m_randomness.end(), std::back_inserter(result)); for(const auto& sig : tree().ots_signature()) { std::copy(sig.begin(), sig.end(), std::back_inserter(result)); } for(const auto& auth : tree().authentication_path()) { std::copy(auth.begin(), auth.end(), std::back_inserter(result)); } return result; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_signature.h000066400000000000000000000072651322470703100217030ustar00rootroot00000000000000/* * XMSS Signature * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_SIGNATURE_H_ #define BOTAN_XMSS_SIGNATURE_H_ #include #include #include #include #include #include namespace Botan { class XMSS_Signature final { public: /** * Creates a signature from an XMSS signature method and a uint8_t sequence * representing a raw signature. * * @param oid XMSS signature method * @param raw_sig An XMSS signature serialized using * XMSS_Signature::bytes(). **/ XMSS_Signature(XMSS_Parameters::xmss_algorithm_t oid, const secure_vector& raw_sig); /** * Creates an XMSS Signature from a leaf index used for signature * generation, a random value and a tree signature. * * @param leaf_idx Leaf index used to generate the signature. * @param randomness A random value. * @param tree_sig A tree signature. **/ XMSS_Signature(size_t leaf_idx, const secure_vector& randomness, const XMSS_WOTS_PublicKey::TreeSignature& tree_sig) : m_leaf_idx(leaf_idx), m_randomness(randomness), m_tree_sig(tree_sig) {} /** * Creates an XMSS Signature from a leaf index used for signature * generation, a random value and a tree signature. * * @param leaf_idx Leaf index used to generate the signature. * @param randomness A random value. * @param tree_sig A tree signature. **/ XMSS_Signature(size_t leaf_idx, secure_vector&& randomness, XMSS_WOTS_PublicKey::TreeSignature&& tree_sig) : m_leaf_idx(leaf_idx), m_randomness(std::move(randomness)), m_tree_sig(std::move(tree_sig)) {} size_t unused_leaf_index() const { return m_leaf_idx; } void set_unused_leaf_idx(size_t idx) { m_leaf_idx = idx; } const secure_vector randomness() const { return m_randomness; } secure_vector& randomness() { return m_randomness; } void set_randomness(const secure_vector& randomness) { m_randomness = randomness; } void set_randomness(secure_vector&& randomness) { m_randomness = std::move(randomness); } const XMSS_WOTS_PublicKey::TreeSignature& tree() const { return m_tree_sig; } XMSS_WOTS_PublicKey::TreeSignature& tree() { return m_tree_sig; } void set_tree(const XMSS_WOTS_PublicKey::TreeSignature& tree_sig) { m_tree_sig = tree_sig; } void set_tree(XMSS_WOTS_PublicKey::TreeSignature&& tree_sig) { m_tree_sig = std::move(tree_sig); } /** * Generates a serialized representation of XMSS Signature by * concatenating the following elements in order: * 8-byte leaf index, n-bytes randomness, ots_signature, * authentication path. * * n is the element_size(), len equal to len(), h the tree height * defined by the chosen XMSS signature method. * * @return serialized signature, a sequence of * (len + h + 1)n bytes. **/ secure_vector bytes() const; private: size_t m_leaf_idx; secure_vector m_randomness; XMSS_WOTS_PublicKey::TreeSignature m_tree_sig; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_signature_operation.cpp000066400000000000000000000064211322470703100243070ustar00rootroot00000000000000/* * XMSS Signature Operation * Signature generation operation for Extended Hash-Based Signatures (XMSS) as * defined in: * * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include namespace Botan { XMSS_Signature_Operation::XMSS_Signature_Operation( const XMSS_PrivateKey& private_key) : XMSS_Common_Ops(private_key.xmss_oid()), m_priv_key(private_key), m_randomness(0), m_leaf_idx(0), m_is_initialized(false) {} XMSS_WOTS_PublicKey::TreeSignature XMSS_Signature_Operation::generate_tree_signature(const secure_vector& msg, XMSS_PrivateKey& xmss_priv_key, XMSS_Address& adrs) { wots_keysig_t auth_path = build_auth_path(xmss_priv_key, adrs); adrs.set_type(XMSS_Address::Type::OTS_Hash_Address); adrs.set_ots_address(m_leaf_idx); wots_keysig_t sig_ots = xmss_priv_key.wots_private_key().sign(msg, adrs); return XMSS_WOTS_PublicKey::TreeSignature(sig_ots, auth_path); } XMSS_Signature XMSS_Signature_Operation::sign(const secure_vector& msg_hash, XMSS_PrivateKey& xmss_priv_key) { XMSS_Address adrs; XMSS_Signature sig(m_leaf_idx, m_randomness, generate_tree_signature(msg_hash, xmss_priv_key,adrs)); return sig; } wots_keysig_t XMSS_Signature_Operation::build_auth_path(XMSS_PrivateKey& priv_key, XMSS_Address& adrs) { wots_keysig_t auth_path(m_xmss_params.tree_height()); adrs.set_type(XMSS_Address::Type::Hash_Tree_Address); for(size_t j = 0; j < m_xmss_params.tree_height(); j++) { size_t k = (m_leaf_idx / (1 << j)) ^ 0x01; auth_path[j] = priv_key.tree_hash(k * (1 << j), j, adrs); } return auth_path; } void XMSS_Signature_Operation::update(const uint8_t msg[], size_t msg_len) { initialize(); m_hash.h_msg_update(msg, msg_len); } secure_vector XMSS_Signature_Operation::sign(RandomNumberGenerator&) { initialize(); secure_vector signature(sign(m_hash.h_msg_final(), m_priv_key).bytes()); m_is_initialized = false; return signature; } void XMSS_Signature_Operation::initialize() { // return if we already initialized and reserved a leaf index for signing. if(m_is_initialized) { return; } secure_vector index_bytes; // reserve leaf index so it can not be reused in by another signature // operation using the same private key. m_leaf_idx = m_priv_key.reserve_unused_leaf_index(); // write prefix for message hashing into buffer. XMSS_Tools::concat(index_bytes, m_leaf_idx, 32); m_randomness = m_hash.prf(m_priv_key.prf(), index_bytes); index_bytes.clear(); XMSS_Tools::concat(index_bytes, m_leaf_idx, m_priv_key.xmss_parameters().element_size()); m_hash.h_msg_init(m_randomness, m_priv_key.root(), index_bytes); m_is_initialized = true; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_signature_operation.h000066400000000000000000000052341322470703100237550ustar00rootroot00000000000000/* * XMSS Signature Operation * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_SIGNATURE_OPERATION_H_ #define BOTAN_XMSS_SIGNATURE_OPERATION_H_ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /** * Signature generation operation for Extended Hash-Based Signatures (XMSS) as * defined in: * * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 **/ class XMSS_Signature_Operation final : public virtual PK_Ops::Signature, public XMSS_Common_Ops { public: XMSS_Signature_Operation(const XMSS_PrivateKey& private_key); /** * Creates an XMSS signature for the message provided through call to * update(). * * @return serialized XMSS signature. **/ secure_vector sign(RandomNumberGenerator&) override; void update(const uint8_t msg[], size_t msg_len) override; private: /** * Algorithm 11: "treeSig" * Generate a WOTS+ signature on a message with corresponding auth path. * * @param msg A message. * @param xmss_priv_key A XMSS private key. * @param adrs A XMSS Address. **/ XMSS_WOTS_PublicKey::TreeSignature generate_tree_signature( const secure_vector& msg, XMSS_PrivateKey& xmss_priv_key, XMSS_Address& adrs); /** * Algorithm 12: "XMSS_sign" * Generate an XMSS signature and update the XMSS secret key * * @param msg A message to sign of arbitrary length. * @param [out] xmss_priv_key A XMSS private key. The private key will be * updated during the signing process. * * @return The signature of msg signed using xmss_priv_key. **/ XMSS_Signature sign( const secure_vector& msg, XMSS_PrivateKey& xmss_priv_key); wots_keysig_t build_auth_path(XMSS_PrivateKey& priv_key, XMSS_Address& adrs); void initialize(); XMSS_PrivateKey m_priv_key; secure_vector m_randomness; size_t m_leaf_idx; bool m_is_initialized; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_tools.cpp000066400000000000000000000041231322470703100213630ustar00rootroot00000000000000/* * XMSS Tools * (C) 2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include namespace Botan { #if defined(BOTAN_TARGET_OS_HAS_THREADS) size_t XMSS_Tools::max_threads() { static const size_t threads { bench_threads() }; return threads; } size_t XMSS_Tools::bench_threads() { if(std::thread::hardware_concurrency() <= 1) { return 1; } const size_t BENCH_ITERATIONS = 1000; std::vector threads; threads.reserve(std::thread::hardware_concurrency()); std::vector durations; std::vector concurrency { std::thread::hardware_concurrency(), std::thread::hardware_concurrency() / 2 }; for(const auto& cc : concurrency) { std::vector hash(std::thread::hardware_concurrency(), XMSS_Hash("SHA-256")); const std::vector buffer(hash[0].output_length()); std::vector> data( std::thread::hardware_concurrency(), secure_vector(hash[0].output_length())); auto start = std::chrono::high_resolution_clock::now(); for(size_t i = 0; i < cc; ++i) { auto& hs = hash[i]; auto& d = data[i]; const size_t n_iters = BENCH_ITERATIONS * (std::thread::hardware_concurrency() / cc); threads.emplace_back(std::thread([n_iters, &hs, &d]() { for(size_t n = 0; n < n_iters; n++) { hs.h(d, d, d); } } )); } durations.emplace_back(std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start)); for(auto& t : threads) { t.join(); } threads.clear(); } if(durations[0].count() < durations[1].count()) { return concurrency[0]; } else { return concurrency[1]; } } #endif } botan-2.4.0/src/lib/pubkey/xmss/xmss_tools.h000066400000000000000000000121071322470703100210310ustar00rootroot00000000000000/* * XMSS Tools * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_TOOLS_H_ #define BOTAN_XMSS_TOOLS_H_ #include #include #include #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #include #include #endif namespace Botan { /** * Helper tools for low level byte operations required * for the XMSS implementation. **/ class XMSS_Tools final { public: XMSS_Tools(const XMSS_Tools&) = delete; void operator=(const XMSS_Tools&) = delete; /** * Concatenates the byte representation in big-endian order of any * integral value to a secure_vector. * * @param target Vector to concatenate the byte representation of the * integral value to. * @param src integral value to concatenate. **/ template::value, void>::type> static void concat(secure_vector& target, const T& src); /** * Concatenates the last n bytes of the byte representation in big-endian * order of any integral value to a to a secure_vector. * * @param target Vector to concatenate the byte representation of the * integral value to. * @param src Integral value to concatenate. * @param len number of bytes to concatenate. This value must be smaller * or equal to the size of type T. **/ template ::value, void>::type> static void concat(secure_vector& target, const T& src, size_t len); /** * Not a public API function - will be removed in a future release. * * Determines the maximum number of threads to be used * efficiently, based on runtime timining measurements. Ideally the * result will correspond to the physical number of cores. On systems * supporting simultaneous multi threading (SMT) * std::thread::hardware_concurrency() usually reports a supported * number of threads which is bigger (typically by a factor of 2) than * the number of physical cores available. Using more threads than * physically available cores for computationally intesive tasks * resulted in slowdowns compared to using a number of threads equal to * the number of physical cores on test systems. This function is a * temporary workaround to prevent performance degradation due to * overstressing the CPU with too many threads. * * @return Presumed number of physical cores based on timing measurements. **/ static size_t max_threads(); // TODO: Remove max_threads() and use // Botan::CPUID once proper plattform // independent detection of physical cores is // available. private: XMSS_Tools(); /** * Measures the time t1 it takes to calculate hashes using * std::thread::hardware_concurrency() many threads and the time t2 * calculating the same number of hashes using * std::thread::hardware_concurrency() / 2 threads. * * @return std::thread::hardware_concurrency() if t1 < t2 * std::thread::hardware_concurrency() / 2 otherwise. **/ static size_t bench_threads(); // TODO: Remove bench_threads() and use // Botan::CPUID once proper plattform // independent detection of physical cores // is //available. }; template void XMSS_Tools::concat(secure_vector& target, const T& src) { const uint8_t* src_bytes = reinterpret_cast(&src); if(CPUID::is_little_endian()) { std::reverse_copy(src_bytes, src_bytes + sizeof(src), std::back_inserter(target)); } else { std::copy(src_bytes, src_bytes + sizeof(src), std::back_inserter(target)); } } template void XMSS_Tools::concat(secure_vector& target, const T& src, size_t len) { size_t c = static_cast(std::min(len, sizeof(src))); if(len > sizeof(src)) { target.resize(target.size() + len - sizeof(src), 0); } const uint8_t* src_bytes = reinterpret_cast(&src); if(CPUID::is_little_endian()) { std::reverse_copy(src_bytes, src_bytes + c, std::back_inserter(target)); } else { std::copy(src_bytes + sizeof(src) - c, src_bytes + sizeof(src), std::back_inserter(target)); } } } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_verification_operation.cpp000066400000000000000000000100741322470703100247670ustar00rootroot00000000000000/* * XMSS Verification Operation * Provides signature verification capabilities for Extended Hash-Based * Signatures (XMSS). * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include namespace Botan { XMSS_Verification_Operation::XMSS_Verification_Operation( const XMSS_PublicKey& public_key) : XMSS_Common_Ops(public_key.xmss_oid()), m_pub_key(public_key), m_msg_buf(0) { } secure_vector XMSS_Verification_Operation::root_from_signature(const XMSS_Signature& sig, const secure_vector& msg, XMSS_Address& adrs, const secure_vector& seed) { adrs.set_type(XMSS_Address::Type::OTS_Hash_Address); adrs.set_ots_address(sig.unused_leaf_index()); XMSS_WOTS_PublicKey pub_key_ots(m_pub_key.wots_parameters().oid(), msg, sig.tree().ots_signature(), adrs, seed); adrs.set_type(XMSS_Address::Type::LTree_Address); adrs.set_ltree_address(sig.unused_leaf_index()); std::array, 2> node; create_l_tree(node[0], pub_key_ots, adrs, seed); adrs.set_type(XMSS_Address::Type::Hash_Tree_Address); adrs.set_tree_index(sig.unused_leaf_index()); for(size_t k = 0; k < m_xmss_params.tree_height(); k++) { adrs.set_tree_height(k); if(((sig.unused_leaf_index() / (1 << k)) & 0x01) == 0) { adrs.set_tree_index(adrs.get_tree_index() >> 1); randomize_tree_hash(node[1], node[0], sig.tree().authentication_path()[k], adrs, seed); } else { adrs.set_tree_index((adrs.get_tree_index() - 1) >> 1); randomize_tree_hash(node[1], sig.tree().authentication_path()[k], node[0], adrs, seed); } node[0] = node[1]; } return node[0]; } bool XMSS_Verification_Operation::verify(const XMSS_Signature& sig, const secure_vector& msg, const XMSS_PublicKey& public_key) { XMSS_Address adrs; secure_vector index_bytes; XMSS_Tools::concat(index_bytes, sig.unused_leaf_index(), m_xmss_params.element_size()); secure_vector msg_digest = m_hash.h_msg(sig.randomness(), public_key.root(), index_bytes, msg); secure_vector node = root_from_signature(sig, msg_digest, adrs, public_key.public_seed()); return (node == public_key.root()); } // FIXME: XMSS signature verification requires the "randomness" parameter out // of the XMSS signature, which is part of the prefix that is hashed before // msg. Since the signature is unknown till sign() is called all message // content has to be buffered. For large messages this can be inconvenient or // impossible. // Possible solution: Change PK_Ops::Verification interface to take the // signature as constructor argument, make sign a parameterless member call. void XMSS_Verification_Operation::update(const uint8_t msg[], size_t msg_len) { std::copy(msg, msg + msg_len, std::back_inserter(m_msg_buf)); } bool XMSS_Verification_Operation::is_valid_signature(const uint8_t sig[], size_t sig_len) { try { XMSS_Signature signature(m_pub_key.xmss_parameters().oid(), secure_vector(sig, sig + sig_len)); bool result = verify(signature, m_msg_buf, m_pub_key); m_msg_buf.clear(); return result; } catch(Integrity_Failure&) { m_msg_buf.clear(); return false; } } } botan-2.4.0/src/lib/pubkey/xmss/xmss_verification_operation.h000066400000000000000000000042571322470703100244420ustar00rootroot00000000000000/* * XMSS Verification Operation * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_VERIFICATION_OPERATION_H_ #define BOTAN_XMSS_VERIFICATION_OPERATION_H_ #include #include #include #include #include #include #include #include #include namespace Botan { /** * Provides signature verification capabilities for Extended Hash-Based * Signatures (XMSS). **/ class XMSS_Verification_Operation final : public virtual PK_Ops::Verification, public XMSS_Common_Ops { public: XMSS_Verification_Operation( const XMSS_PublicKey& public_key); bool is_valid_signature(const uint8_t sig[], size_t sig_len) override; void update(const uint8_t msg[], size_t msg_len) override; private: /** * Algorithm 13: "XMSS_rootFromSig" * Computes a root node using an XMSS signature, a message and a seed. * * @param msg A message. * @param sig The XMSS signature for msg. * @param ards A XMSS tree address. * @param seed A seed. * * @return An n-byte string holding the value of the root of a tree * defined by the input parameters. **/ secure_vector root_from_signature( const XMSS_Signature& sig, const secure_vector& msg, XMSS_Address& ards, const secure_vector& seed); /** * Algorithm 14: "XMSS_verify" * Verifies a XMSS signature using the corresponding XMSS public key. * * @param sig A XMSS signature. * @param msg The message signed with sig. * @param pub_key the public key * * @return true if signature sig is valid for msg, false otherwise. **/ bool verify(const XMSS_Signature& sig, const secure_vector& msg, const XMSS_PublicKey& pub_key); XMSS_PublicKey m_pub_key; secure_vector m_msg_buf; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_addressed_privatekey.h000066400000000000000000000044051322470703100251500ustar00rootroot00000000000000/** * XMSS WOTS Addressed Private Key * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_WOTS_ADDRESSED_PRIVATEKEY_H_ #define BOTAN_XMSS_WOTS_ADDRESSED_PRIVATEKEY_H_ #include #include #include namespace Botan { /** * Wrapper class to pair an XMSS_WOTS_PrivateKey with an XMSS Address. Since * the PK_Ops::Signature interface does not allow an extra address * parameter to be passed to the sign(RandomNumberGenerator&), the address * needs to be stored together with the key and passed to the * XMSS_WOTS_Signature_Operation() on creation. **/ class XMSS_WOTS_Addressed_PrivateKey final : public virtual XMSS_WOTS_Addressed_PublicKey, public virtual Private_Key { public: XMSS_WOTS_Addressed_PrivateKey(const XMSS_WOTS_PrivateKey& private_key) : XMSS_WOTS_Addressed_PublicKey(private_key), m_priv_key(private_key) {} XMSS_WOTS_Addressed_PrivateKey(const XMSS_WOTS_PrivateKey& private_key, const XMSS_Address& adrs) : XMSS_WOTS_Addressed_PublicKey(private_key, adrs), m_priv_key(private_key) {} XMSS_WOTS_Addressed_PrivateKey(XMSS_WOTS_PrivateKey&& private_key) : XMSS_WOTS_Addressed_PublicKey(XMSS_WOTS_PublicKey(private_key)), m_priv_key(std::move(private_key)) {} XMSS_WOTS_Addressed_PrivateKey(XMSS_WOTS_PrivateKey&& private_key, XMSS_Address&& adrs) : XMSS_WOTS_Addressed_PublicKey(XMSS_WOTS_PublicKey(private_key), std::move(adrs)), m_priv_key(std::move(private_key)) {} const XMSS_WOTS_PrivateKey& private_key() const { return m_priv_key; } XMSS_WOTS_PrivateKey& private_key() { return m_priv_key; } AlgorithmIdentifier pkcs8_algorithm_identifier() const override { return m_priv_key.pkcs8_algorithm_identifier(); } secure_vector private_key_bits() const override { return m_priv_key.private_key_bits(); } private: XMSS_WOTS_PrivateKey m_priv_key; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_addressed_publickey.h000066400000000000000000000054531322470703100247600ustar00rootroot00000000000000/** * XMSS WOTS Addressed Public Key * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_WOTS_ADDRESSED_PUBLICKEY_H_ #define BOTAN_XMSS_WOTS_ADDRESSED_PUBLICKEY_H_ #include #include namespace Botan { /** * Wrapper class to pair a XMSS_WOTS_PublicKey with an XMSS Address. Since * the PK_Ops::Verification interface does not allow an extra address * parameter to be passed to the sign(RandomNumberGenerator&), the address * needs to be stored together with the key and passed to the * XMSS_WOTS_Verification_Operation() on creation. **/ class XMSS_WOTS_Addressed_PublicKey : public virtual Public_Key { public: XMSS_WOTS_Addressed_PublicKey(const XMSS_WOTS_PublicKey& public_key) : m_pub_key(public_key), m_adrs() {} XMSS_WOTS_Addressed_PublicKey(const XMSS_WOTS_PublicKey& public_key, const XMSS_Address& adrs) : m_pub_key(public_key), m_adrs(adrs) {} XMSS_WOTS_Addressed_PublicKey(XMSS_WOTS_PublicKey&& public_key) : m_pub_key(std::move(public_key)), m_adrs() {} XMSS_WOTS_Addressed_PublicKey(XMSS_WOTS_PublicKey&& public_key, XMSS_Address&& adrs) : m_pub_key(std::move(public_key)), m_adrs(std::move(adrs)) {} const XMSS_WOTS_PublicKey& public_key() const { return m_pub_key; } XMSS_WOTS_PublicKey& public_key() { return m_pub_key; } const XMSS_Address& address() const { return m_adrs; } XMSS_Address& address() { return m_adrs; } std::string algo_name() const override { return m_pub_key.algo_name(); } AlgorithmIdentifier algorithm_identifier() const override { return m_pub_key.algorithm_identifier(); } bool check_key(RandomNumberGenerator& rng, bool strong) const override { return m_pub_key.check_key(rng, strong); } std::unique_ptr create_verification_op(const std::string& params, const std::string& provider) const override { return m_pub_key.create_verification_op(params, provider); } OID get_oid() const override { return m_pub_key.get_oid(); } size_t estimated_strength() const override { return m_pub_key.estimated_strength(); } size_t key_length() const override { return m_pub_key.estimated_strength(); } std::vector public_key_bits() const override { return m_pub_key.public_key_bits(); } protected: XMSS_WOTS_PublicKey m_pub_key; XMSS_Address m_adrs; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_parameters.cpp000066400000000000000000000075421322470703100234520ustar00rootroot00000000000000/* * XMSS WOTS Parameters * Descibes a signature method for XMSS Winternitz One Time Signatures, * as defined in: * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include #include #include namespace Botan { XMSS_WOTS_Parameters::ots_algorithm_t XMSS_WOTS_Parameters::xmss_wots_id_from_string(const std::string& param_set) { if(param_set == "WOTSP_SHA2-256_W16") { return WOTSP_SHA2_256_W16; } if(param_set == "WOTSP_SHA2-512_W16") { return WOTSP_SHA2_512_W16; } if(param_set == "WOTSP_SHAKE128_W16") { return WOTSP_SHAKE128_W16; } if(param_set == "WOTSP_SHAKE256_W16") { return WOTSP_SHAKE256_W16; } throw Invalid_Argument("Unknown XMSS-WOTS algorithm param '" + param_set + "'"); } XMSS_WOTS_Parameters::XMSS_WOTS_Parameters(const std::string& param_set) : XMSS_WOTS_Parameters(xmss_wots_id_from_string(param_set)) {} XMSS_WOTS_Parameters::XMSS_WOTS_Parameters(ots_algorithm_t oid) : m_oid(oid) { switch(oid) { case WOTSP_SHA2_256_W16: m_element_size = 32; m_w = 16; m_len = 67; m_name = "WOTSP_SHA2-256_W16"; m_hash_name = "SHA-256"; m_strength = 256; break; case WOTSP_SHA2_512_W16: m_element_size = 64; m_w = 16; m_len = 131; m_name = "WOTSP_SHA2-512_W16"; m_hash_name = "SHA-512"; m_strength = 512; break; case WOTSP_SHAKE128_W16: m_element_size = 32; m_w = 16; m_len = 67; m_name = "WOTSP_SHAKE128_W16"; m_hash_name = "SHAKE-128(256)"; m_strength = 256; break; case WOTSP_SHAKE256_W16: m_element_size = 64; m_w = 16; m_len = 131; m_name = "WOTSP_SHAKE256_W16"; m_hash_name = "SHAKE-256(512)"; m_strength = 512; break; default: throw Unsupported_Argument( "Algorithm id does not match any XMSS WOTS algorithm id."); break; } m_w == 16 ? m_lg_w = 4 : m_lg_w = 2; m_len_1 = static_cast(std::ceil((8 * element_size()) / m_lg_w)); m_len_2 = static_cast( floor(log2(m_len_1 * (wots_parameter() - 1)) / m_lg_w) + 1); BOTAN_ASSERT(m_len == m_len_1 + m_len_2, "Invalid XMSS WOTS parameter " "\"len\" detedted."); } secure_vector XMSS_WOTS_Parameters::base_w(const secure_vector& msg, size_t out_size) const { secure_vector result; size_t in = 0; size_t total = 0; size_t bits = 0; for(size_t i = 0; i < out_size; i++) { if(bits == 0) { total = msg[in]; in++; bits += 8; } bits -= m_lg_w; result.push_back(static_cast((total >> bits) & (m_w - 1))); } return result; } secure_vector XMSS_WOTS_Parameters::base_w(size_t value) const { value <<= (8 - ((m_len_2 * m_lg_w) % 8)); size_t len_2_bytes = static_cast( std::ceil(static_cast(m_len_2 * m_lg_w) / 8.f)); secure_vector result; XMSS_Tools::concat(result, value, len_2_bytes); return base_w(result, m_len_2); } void XMSS_WOTS_Parameters::append_checksum(secure_vector& data) { size_t csum = 0; for(size_t i = 0; i < data.size(); i++) { csum += wots_parameter() - 1 - data[i]; } secure_vector csum_bytes = base_w(csum); std::move(csum_bytes.begin(), csum_bytes.end(), std::back_inserter(data)); } } botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_parameters.h000066400000000000000000000062151322470703100231130ustar00rootroot00000000000000/* * XMSS WOTS Parameters * (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_WOTS_PARAMETERS_H_ #define BOTAN_XMSS_WOTS_PARAMETERS_H_ #include #include #include #include namespace Botan { /** * Descibes a signature method for XMSS Winternitz One Time Signatures, * as defined in: * [1] XMSS: Extended Hash-Based Signatures, * draft-itrf-cfrg-xmss-hash-based-signatures-06 * Release: July 2016. * https://datatracker.ietf.org/doc/ * draft-irtf-cfrg-xmss-hash-based-signatures/?include_text=1 **/ class XMSS_WOTS_Parameters final { public: enum ots_algorithm_t { WOTSP_SHA2_256_W16 = 0x01000001, WOTSP_SHA2_512_W16 = 0x02000002, WOTSP_SHAKE128_W16 = 0x03000003, WOTSP_SHAKE256_W16 = 0x04000004 }; XMSS_WOTS_Parameters(const std::string& algo_name); XMSS_WOTS_Parameters(ots_algorithm_t ots_spec); static ots_algorithm_t xmss_wots_id_from_string(const std::string& param_set); /** * Algorithm 1: convert input string to base. * * @param msg Input string (referred to as X in [1]). * @param out_size size of message in base w. * * @return Input string converted to the given base. **/ secure_vector base_w(const secure_vector& msg, size_t out_size) const; secure_vector base_w(size_t value) const; void append_checksum(secure_vector& data); /** * @return XMSS WOTS registry name for the chosen parameter set. **/ const std::string& name() const { return m_name; } /** * @return Botan name for the hash function used. **/ const std::string& hash_function_name() const { return m_hash_name; } /** * Retrieves the uniform length of a message, and the size of * each node. This correlates to XMSS parameter "n" defined * in [1]. * * @return element length in bytes. **/ size_t element_size() const { return m_element_size; } /** * The Winternitz parameter. * * @return numeric base used for internal representation of * data. **/ size_t wots_parameter() const { return m_w; } size_t len() const { return m_len; } size_t len_1() const { return m_len_1; } size_t len_2() const { return m_len_2; } size_t lg_w() const { return m_lg_w; } ots_algorithm_t oid() const { return m_oid; } size_t estimated_strength() const { return m_strength; } bool operator==(const XMSS_WOTS_Parameters& p) const { return m_oid == p.m_oid; } private: static const std::map m_oid_name_lut; ots_algorithm_t m_oid; std::string m_name; std::string m_hash_name; size_t m_element_size; size_t m_w; size_t m_len_1; size_t m_len_2; size_t m_len; size_t m_strength; uint8_t m_lg_w; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_privatekey.cpp000066400000000000000000000043661322470703100234730ustar00rootroot00000000000000/* * XMSS WOTS Private Key * A Winternitz One Time Signature private key for use with Extended Hash-Based * Signatures. * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include namespace Botan { wots_keysig_t XMSS_WOTS_PrivateKey::generate(const secure_vector& priv_seed, XMSS_Hash& hash) { wots_keysig_t priv_key(m_wots_params.len(), secure_vector(0)); for(size_t i = 0; i < m_wots_params.len(); i++) { XMSS_Tools::concat(priv_key[i], i, 32); hash.prf(priv_key[i], priv_seed, priv_key[i]); } return priv_key; } XMSS_WOTS_PublicKey XMSS_WOTS_PrivateKey::generate_public_key(XMSS_Address& adrs) { XMSS_WOTS_PublicKey pub_key(m_wots_params.oid(), public_seed()); generate_public_key(pub_key, wots_keysig_t((*this)[adrs]), adrs); return pub_key; } void XMSS_WOTS_PrivateKey::generate_public_key(XMSS_WOTS_PublicKey& pub_key, wots_keysig_t&& in_key_data, XMSS_Address& adrs, XMSS_Hash& hash) { BOTAN_ASSERT(wots_parameters() == pub_key.wots_parameters() && public_seed() == pub_key.public_seed(), "Conflicting public key data."); pub_key.set_key_data(std::move(in_key_data)); for(size_t i = 0; i < m_wots_params.len(); i++) { adrs.set_chain_address(i); chain(pub_key[i], 0, m_wots_params.wots_parameter() - 1, adrs, public_seed(), hash); } } wots_keysig_t XMSS_WOTS_PrivateKey::sign(const secure_vector& msg, XMSS_Address& adrs, XMSS_Hash& hash) { secure_vector msg_digest { m_wots_params.base_w(msg, m_wots_params.len_1()) }; m_wots_params.append_checksum(msg_digest); wots_keysig_t sig(this->at(adrs, hash)); for(size_t i = 0; i < m_wots_params.len(); i++) { adrs.set_chain_address(i); chain(sig[i], 0 , msg_digest[i], adrs, m_public_seed, hash); } return sig; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_privatekey.h000066400000000000000000000277511322470703100231430ustar00rootroot00000000000000/* * XMSS WOTS Private Key * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_WOTS_PRIVATEKEY_H_ #define BOTAN_XMSS_WOTS_PRIVATEKEY_H_ #include #include #include #include #include #include #include #include #include namespace Botan { /** A Winternitz One Time Signature private key for use with Extended Hash-Based * Signatures. **/ class XMSS_WOTS_PrivateKey final : public virtual XMSS_WOTS_PublicKey, public virtual Private_Key { public: /** * Creates a WOTS private key for the chosen XMSS WOTS signature method. * Members need to be initialized manually. * * @param oid Identifier for the selected signature method. **/ XMSS_WOTS_PrivateKey(XMSS_WOTS_Parameters::ots_algorithm_t oid) : XMSS_WOTS_PublicKey(oid) {} /** * Creates a WOTS private key for the chosen XMSS WOTS signature method. * * @param oid Identifier for the selected signature method. * @param rng A random number generator to use for key generation. **/ XMSS_WOTS_PrivateKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, RandomNumberGenerator& rng) : XMSS_WOTS_PublicKey(oid, rng), m_private_seed(rng.random_vec(m_wots_params.element_size())) { set_key_data(generate(m_private_seed)); } /** * Constructs a WOTS private key. Chains will be generated on demand * applying a hash function to a unique value generated from a secret * seed and a counter. The secret seed of length n, will be * automatically generated using AutoSeeded_RNG(). "n" equals * the element size of the chosen WOTS security parameter set. * * @param oid Identifier for the selected signature method. * @param public_seed A public seed used for the pseudo random generation * of public keys derived from this private key. * @param rng A random number generator to use for key generation. **/ XMSS_WOTS_PrivateKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, const secure_vector& public_seed, RandomNumberGenerator& rng) : XMSS_WOTS_PublicKey(oid, public_seed), m_private_seed(rng.random_vec(m_wots_params.element_size())) { set_key_data(generate(m_private_seed)); } /** * Constructs a WOTS private key. Chains will be generated on demand * applying a hash function to a unique value generated from a secret * seed and a counter. The secret seed of length n, will be * automatically generated using AutoSeeded_RNG(). "n" equals * the element size of the chosen WOTS security parameter set. * * @param oid Identifier for the selected signature method. * @param public_seed A public seed used for the pseudo random generation * of public keys derived from this private key. **/ XMSS_WOTS_PrivateKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, const secure_vector& public_seed) : XMSS_WOTS_PublicKey(oid, public_seed) {} /** * Constructs a WOTS private key. Chains will be generated on demand * applying a hash function to a unique value generated from the * secret seed and a counter. * * @param oid Identifier for the selected signature method. * @param public_seed A public seed used for the pseudo random generation * of public keys derived from this private key. * @param private_seed A secret uniformly random n-byte value. **/ XMSS_WOTS_PrivateKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, const secure_vector& public_seed, const secure_vector& private_seed) : XMSS_WOTS_PublicKey(oid, public_seed), m_private_seed(private_seed) { set_key_data(generate(private_seed)); } /** * Retrieves the i-th WOTS private key using pseudo random key * (re-)generation. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each * thread. * * @param i Index of the key to retrieve. * @param hash Instance of XMSS_Hash, that may only be used by the * thead executing at. * * @return WOTS secret key. **/ wots_keysig_t at(size_t i, XMSS_Hash& hash) { secure_vector idx_bytes; XMSS_Tools::concat(idx_bytes, i, m_wots_params.element_size()); hash.h(idx_bytes, m_private_seed, idx_bytes); return generate(idx_bytes, hash); } /** * Retrieves the i-th WOTS private key using pseudo random key * (re-)generation. * * @param i Index of the key to retrieve. * * @return WOTS secret key. **/ inline wots_keysig_t operator[](size_t i) { return this->at(i, m_hash); } /** * Retrieves the i-th WOTS private key using pseudo random key * (re-)generation. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each * thread. * * @param adrs The address of the key to retrieve. * @param hash Instance of XMSS_Hash, that may only be used by the * thead executing at. * * @return WOTS secret key. **/ wots_keysig_t at(const XMSS_Address& adrs, XMSS_Hash& hash) { secure_vector result; hash.prf(result, m_private_seed, adrs.bytes()); return generate(result, hash); } inline wots_keysig_t operator[](const XMSS_Address& adrs) { return this->at(adrs, m_hash); } wots_keysig_t generate_private_key(const secure_vector& priv_seed); /** * Algorithm 4: "WOTS_genPK" * Generates a Winternitz One Time Signature+ (WOTS+) Public Key from a * given private key. * * @param adrs Hash function address encoding the address of the WOTS+ * key pair within a greater structure. * * @return A XMSS_WOTS_PublicKey. **/ XMSS_WOTS_PublicKey generate_public_key(XMSS_Address& adrs); /** * Algorithm 4: "WOTS_genPK" * Initializes a Winternitz One Time Signature+ (WOTS+) Public Key's * key_data() member, with data derived from in_key_data using the * WOTS chaining function. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each * thread. * * @param[out] pub_key Public key to initialize key_data() member on. * @param in_key_data Input key material from private key used for * public key generation. * @param adrs Hash function address encoding the address of * the WOTS+ key pair within a greater structure. * @param hash Instance of XMSS_Hash, that may only by the thead * executing generate_public_key. **/ void generate_public_key(XMSS_WOTS_PublicKey& pub_key, wots_keysig_t&& in_key_data, XMSS_Address& adrs, XMSS_Hash& hash); /** * Algorithm 4: "WOTS_genPK" * Initializes a Winternitz One Time Signature+ (WOTS+) Public Key's * key_data() member, with data derived from in_key_data using the * WOTS chaining function. * * @param[out] pub_key Public key to initialize key_data() member on. * @param in_key_data Input key material from private key used for * public key generation. * @param adrs Hash function address encoding the address of * the WOTS+ key pair within a greater structure. **/ inline void generate_public_key(XMSS_WOTS_PublicKey& pub_key, wots_keysig_t&& in_key_data, XMSS_Address& adrs) { generate_public_key(pub_key, std::forward(in_key_data), adrs, m_hash); } /** * Algorithm 5: "WOTS_sign" * Generates a signature from a private key and a message. * * @param msg A message to sign. * @param adrs An OTS hash address identifying the WOTS+ key pair * used for signing. * * @return signature for msg. **/ inline wots_keysig_t sign(const secure_vector& msg, XMSS_Address& adrs) { return sign(msg, adrs, m_hash); } /** * Algorithm 5: "WOTS_sign" * Generates a signature from a private key and a message. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each * thread. * * @param msg A message to sign. * @param adrs An OTS hash address identifying the WOTS+ key pair * used for signing. * @param hash Instance of XMSS_Hash, that may only be used by the * thead executing sign. * * @return signature for msg. **/ wots_keysig_t sign(const secure_vector& msg, XMSS_Address& adrs, XMSS_Hash& hash); /** * Retrieves the secret seed used to generate WOTS+ chains. The seed * should be a uniformly random n-byte value. * * @return secret seed. **/ const secure_vector& private_seed() const { return m_private_seed; } /** * Sets the secret seed used to generate WOTS+ chains. The seed * should be a uniformly random n-byte value. * * @param private_seed Uniformly random n-byte value. **/ void set_private_seed(const secure_vector& private_seed) { m_private_seed = private_seed; } /** * Sets the secret seed used to generate WOTS+ chains. The seed * should be a uniformly random n-byte value. * * @param private_seed Uniformly random n-byte value. **/ void set_private_seed(secure_vector&& private_seed) { m_private_seed = std::move(private_seed); } AlgorithmIdentifier pkcs8_algorithm_identifier() const override { throw Not_Implemented("No AlgorithmIdentifier available for XMSS-WOTS."); } secure_vector private_key_bits() const override { throw Not_Implemented("No PKCS8 key format defined for XMSS-WOTS."); } private: /** * Algorithm 3: "Generating a WOTS+ Private Key". * Generates a private key. * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each thread. * * @param private_seed Uniformly random n-byte value. * @param[in] hash Instance of XMSS_Hash, that may only be used by the * thead executing generate. * * @returns a vector of length key_size() of vectors of n bytes length * containing uniformly random data. **/ wots_keysig_t generate(const secure_vector& private_seed, XMSS_Hash& hash); inline wots_keysig_t generate(const secure_vector& private_seed) { return generate(private_seed, m_hash); } secure_vector m_private_seed; }; } #endif botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_publickey.cpp000066400000000000000000000035711322470703100232740ustar00rootroot00000000000000/* * XMSS WOTS Public Key * A Winternitz One Time Signature public key for use with Extended Hash-Based * Signatures. * * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #include namespace Botan { void XMSS_WOTS_PublicKey::chain(secure_vector& result, size_t start_idx, size_t steps, XMSS_Address& adrs, const secure_vector& seed, XMSS_Hash& hash) { for(size_t i = start_idx; i < (start_idx + steps) && i < m_wots_params.wots_parameter(); i++) { adrs.set_hash_address(i); //Calculate tmp XOR bitmask adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Mask_Mode); xor_buf(result, hash.prf(seed, adrs.bytes()), result.size()); // Calculate key adrs.set_key_mask_mode(XMSS_Address::Key_Mask::Key_Mode); //Calculate f(key, tmp XOR bitmask) hash.f(result, hash.prf(seed, adrs.bytes()), result); } } wots_keysig_t XMSS_WOTS_PublicKey::pub_key_from_signature(const secure_vector& msg, const wots_keysig_t& sig, XMSS_Address& adrs, const secure_vector& seed) { secure_vector msg_digest { m_wots_params.base_w(msg, m_wots_params.len_1()) }; m_wots_params.append_checksum(msg_digest); wots_keysig_t result(sig); for(size_t i = 0; i < m_wots_params.len(); i++) { adrs.set_chain_address(i); chain(result[i], msg_digest[i], m_wots_params.wots_parameter() - 1 - msg_digest[i], adrs, seed); } return result; } } botan-2.4.0/src/lib/pubkey/xmss/xmss_wots_publickey.h000066400000000000000000000271671322470703100227500ustar00rootroot00000000000000/* * XMSS WOTS Public Key * (C) 2016,2017 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) **/ #ifndef BOTAN_XMSS_WOTS_PUBLICKEY_H_ #define BOTAN_XMSS_WOTS_PUBLICKEY_H_ #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { typedef std::vector> wots_keysig_t; /** * A Winternitz One Time Signature public key for use with Extended Hash-Based * Signatures. **/ class XMSS_WOTS_PublicKey : virtual public Public_Key { public: class TreeSignature final { public: TreeSignature() = default; TreeSignature(const wots_keysig_t& ots_sig, const wots_keysig_t& auth_path) : m_ots_sig(ots_sig), m_auth_path(auth_path) {} TreeSignature(wots_keysig_t&& ots_sig, wots_keysig_t&& auth_path) : m_ots_sig(std::move(ots_sig)), m_auth_path(std::move(auth_path)) {} const wots_keysig_t& ots_signature() const { return m_ots_sig; } wots_keysig_t& ots_signature() { return m_ots_sig; } const wots_keysig_t& authentication_path() const { return m_auth_path; } wots_keysig_t& authentication_path() { return m_auth_path; } private: wots_keysig_t m_ots_sig; wots_keysig_t m_auth_path; }; /** * Creates a XMSS_WOTS_PublicKey for the signature method identified by * oid. The public seed for this key will be initialized with a * uniformly random n-byte value, where "n" is the element size of the * selected signature method. * * @param oid Identifier for the selected signature method. **/ XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters::ots_algorithm_t oid) : m_wots_params(oid), m_hash(m_wots_params.hash_function_name()) {} /** * Creates a XMSS_WOTS_PublicKey for the signature method identified by * oid. The public seed for this key will be initialized with a * uniformly random n-byte value, where "n" is the element size of the * selected signature method. * * @param oid Identifier for the selected signature method. * @param rng A random number generate used to generate the public seed. **/ XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, RandomNumberGenerator& rng) : m_wots_params(oid), m_hash(m_wots_params.hash_function_name()), m_public_seed(rng.random_vec(m_wots_params.element_size())) {} /** * Creates a XMSS_WOTS_PrivateKey for the signature method identified by * oid, with a precomputed public seed. * * @param oid Identifier for the selected signature method. * @param public_seed A precomputed public seed of n-bytes length. **/ XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, secure_vector public_seed) : m_wots_params(oid), m_hash(m_wots_params.hash_function_name()), m_public_seed(public_seed) {} /** * Creates a XMSS_WOTS_PublicKey for the signature method identified by * oid. The public seed will be initialized with a precomputed seed and * and precomputed key data which should be derived from a * XMSS_WOTS_PrivateKey. * * @param oid Ident:s/ifier for the selected signature methods. * @param public_seed A precomputed public seed of n-bytes length. * @param key Precomputed raw key data of the XMSS_WOTS_PublicKey. **/ XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, secure_vector&& public_seed, wots_keysig_t&& key) : m_wots_params(oid), m_hash(m_wots_params.hash_function_name()), m_key(std::move(key)), m_public_seed(std::move(public_seed)) {} /** * Creates a XMSS_WOTS_PublicKey for the signature method identified by * oid. The public seed will be initialized with a precomputed seed and * and precomputed key data which should be derived from a * XMSS_WOTS_PrivateKey. * * @param oid Identifier for the selected signature methods. * @param public_seed A precomputed public seed of n-bytes length. * @param key Precomputed raw key data of the XMSS_WOTS_PublicKey. **/ XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, const secure_vector& public_seed, const wots_keysig_t& key) : m_wots_params(oid), m_hash(m_wots_params.hash_function_name()), m_key(key), m_public_seed(public_seed) {} /** * Creates a XMSS_WOTS_PublicKey form a message and signature using * Algorithm 6 WOTS_pkFromSig defined in the XMSS standard. This * overload is used to verify a message using a public key. * * @param oid WOTSP algorithm identifier. * @param msg A message. * @param sig A WOTS signature for msg. * @param adrs An XMSS_Address. * @param public_seed The public public_seed. **/ XMSS_WOTS_PublicKey(XMSS_WOTS_Parameters::ots_algorithm_t oid, const secure_vector& msg, const wots_keysig_t& sig, XMSS_Address& adrs, const secure_vector& public_seed) : m_wots_params(oid), m_hash(m_wots_params.hash_function_name()), m_key(pub_key_from_signature(msg, sig, adrs, public_seed)), m_public_seed(public_seed) {} /** * Retrieves the i-th element out of the length len chain of * n-byte elements contained in the public key. * * @param i index of the element. * @returns n-byte element addressed by i. **/ const secure_vector& operator[](size_t i) const { return m_key[i]; } secure_vector& operator[](size_t i) { return m_key[i]; } /** * Convert the key into the raw key data. The key becomes a length * len vector of n-byte elements. **/ operator const wots_keysig_t& () const { return m_key; } /** * Convert the key into the raw key data. The key becomes a length * len vector of n-byte elements. **/ operator wots_keysig_t& () { return m_key; } const secure_vector& public_seed() const { return m_public_seed; } secure_vector& public_seed() { return m_public_seed; } void set_public_seed(const secure_vector& public_seed) { m_public_seed = public_seed; } void set_public_seed(secure_vector&& public_seed) { m_public_seed = std::move(public_seed); } const wots_keysig_t& key_data() const { return m_key; } wots_keysig_t& key_data() { return m_key; } void set_key_data(const wots_keysig_t& key_data) { m_key = key_data; } void set_key_data(wots_keysig_t&& key_data) { m_key = std::move(key_data); } const XMSS_WOTS_Parameters& wots_parameters() const { return m_wots_params; } std::string algo_name() const override { return m_wots_params.name(); } AlgorithmIdentifier algorithm_identifier() const override { throw Not_Implemented("No AlgorithmIdentifier available for XMSS-WOTS."); } bool check_key(RandomNumberGenerator&, bool) const override { return true; } size_t estimated_strength() const override { return m_wots_params.estimated_strength(); } size_t key_length() const override { return m_wots_params.estimated_strength(); } std::vector public_key_bits() const override { throw Not_Implemented("No key format defined for XMSS-WOTS"); } bool operator==(const XMSS_WOTS_PublicKey& key) { return m_key == key.m_key; } bool operator!=(const XMSS_WOTS_PublicKey& key) { return !(*this == key); } protected: /** * Algorithm 2: Chaining Function. * * Takes an n-byte input string and transforms it into a the function * result iterating the cryptographic hash function "F" steps times on * the input x using the outputs of the PRNG "G". * * This overload is used in multithreaded scenarios, where it is * required to provide seperate instances of XMSS_Hash to each * thread. * * @param[out] x An n-byte input string, that will be transformed into * the chaining function result. * @param start_idx The start index. * @param steps A number of steps. * @param adrs An OTS Hash Address. * @param public_seed A public seed. * @param hash Instance of XMSS_Hash, that may only by the thead * executing chain. **/ void chain(secure_vector& x, size_t start_idx, size_t steps, XMSS_Address& adrs, const secure_vector& public_seed, XMSS_Hash& hash); /** * Algorithm 2: Chaining Function. * * Takes an n-byte input string and transforms it into a the function * result iterating the cryptographic hash function "F" steps times on * the input x using the outputs of the PRNG "G". * * @param[out] x An n-byte input string, that will be transformed into * the chaining function result. * @param start_idx The start index. * @param steps A number of steps. * @param adrs An OTS Hash Address. * @param public_seed A public seed. **/ inline void chain(secure_vector& x, size_t start_idx, size_t steps, XMSS_Address& adrs, const secure_vector& public_seed) { chain(x, start_idx, steps, adrs, public_seed, m_hash); } XMSS_WOTS_Parameters m_wots_params; XMSS_Hash m_hash; wots_keysig_t m_key; secure_vector m_public_seed; private: /** * Algorithm 6: "WOTS_pkFromSig" * Computes a Winternitz One Time Signature+ public key from a message and * its signature. * * @param msg A message. * @param sig The signature for msg. * @param adrs An address. * @param public_seed A public_seed. * * @return Temporary WOTS+ public key. **/ wots_keysig_t pub_key_from_signature( const secure_vector& msg, const wots_keysig_t& sig, XMSS_Address& adrs, const secure_vector& public_seed); }; } #endif botan-2.4.0/src/lib/rng/000077500000000000000000000000001322470703100147425ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/auto_rng/000077500000000000000000000000001322470703100165605ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/auto_rng/auto_rng.cpp000066400000000000000000000055441322470703100211120ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif #if !defined(BOTAN_AUTO_RNG_HMAC) #error "No hash function defined for AutoSeeded_RNG in build.h (try enabling sha2_32)" #endif namespace Botan { AutoSeeded_RNG::~AutoSeeded_RNG() { // for unique_ptr } AutoSeeded_RNG::AutoSeeded_RNG(RandomNumberGenerator& underlying_rng, size_t reseed_interval) { m_rng.reset(new HMAC_DRBG(MessageAuthenticationCode::create_or_throw(BOTAN_AUTO_RNG_HMAC), underlying_rng, reseed_interval)); force_reseed(); } AutoSeeded_RNG::AutoSeeded_RNG(Entropy_Sources& entropy_sources, size_t reseed_interval) { m_rng.reset(new HMAC_DRBG(MessageAuthenticationCode::create_or_throw(BOTAN_AUTO_RNG_HMAC), entropy_sources, reseed_interval)); force_reseed(); } AutoSeeded_RNG::AutoSeeded_RNG(RandomNumberGenerator& underlying_rng, Entropy_Sources& entropy_sources, size_t reseed_interval) { m_rng.reset(new HMAC_DRBG( MessageAuthenticationCode::create_or_throw(BOTAN_AUTO_RNG_HMAC), underlying_rng, entropy_sources, reseed_interval)); force_reseed(); } AutoSeeded_RNG::AutoSeeded_RNG(size_t reseed_interval) : #if defined(BOTAN_HAS_SYSTEM_RNG) AutoSeeded_RNG(system_rng(), reseed_interval) #else AutoSeeded_RNG(Entropy_Sources::global_sources(), reseed_interval) #endif { } void AutoSeeded_RNG::force_reseed() { m_rng->force_reseed(); m_rng->next_byte(); if(!m_rng->is_seeded()) { throw Exception("AutoSeeded_RNG reseeding failed"); } } bool AutoSeeded_RNG::is_seeded() const { return m_rng->is_seeded(); } void AutoSeeded_RNG::clear() { m_rng->clear(); } std::string AutoSeeded_RNG::name() const { return m_rng->name(); } void AutoSeeded_RNG::add_entropy(const uint8_t in[], size_t len) { m_rng->add_entropy(in, len); } size_t AutoSeeded_RNG::reseed(Entropy_Sources& srcs, size_t poll_bits, std::chrono::milliseconds poll_timeout) { return m_rng->reseed(srcs, poll_bits, poll_timeout); } void AutoSeeded_RNG::randomize(uint8_t output[], size_t output_len) { randomize_with_ts_input(output, output_len); } void AutoSeeded_RNG::randomize_with_input(uint8_t output[], size_t output_len, const uint8_t ad[], size_t ad_len) { m_rng->randomize_with_input(output, output_len, ad, ad_len); } } botan-2.4.0/src/lib/rng/auto_rng/auto_rng.h000066400000000000000000000061031322470703100205470ustar00rootroot00000000000000/* * Auto Seeded RNG * (C) 2008,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_AUTO_SEEDING_RNG_H_ #define BOTAN_AUTO_SEEDING_RNG_H_ #include namespace Botan { class Stateful_RNG; /** * A userspace PRNG */ class BOTAN_PUBLIC_API(2,0) AutoSeeded_RNG final : public RandomNumberGenerator { public: void randomize(uint8_t out[], size_t len) override; void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) override; bool is_seeded() const override; /** * Mark state as requiring a reseed on next use */ void force_reseed(); size_t reseed(Entropy_Sources& srcs, size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS, std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT) override; void add_entropy(const uint8_t in[], size_t len) override; std::string name() const override; void clear() override; /** * Uses the system RNG (if available) or else a default group of * entropy sources (all other systems) to gather seed material. * * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ AutoSeeded_RNG(size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); /** * Uses the BOTAN_AUTO_RNG_DRBG RNG to gather seed material. * * @param underlying_rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ AutoSeeded_RNG(RandomNumberGenerator& underlying_rng, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); /** * Uses the BOTAN_AUTO_RNG_DRBG RNG to gather seed material. * * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ AutoSeeded_RNG(Entropy_Sources& entropy_sources, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); /** * Uses the BOTAN_AUTO_RNG_DRBG RNG to gather seed material. * * @param underlying_rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ AutoSeeded_RNG(RandomNumberGenerator& underlying_rng, Entropy_Sources& entropy_sources, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); ~AutoSeeded_RNG(); private: std::unique_ptr m_rng; }; } #endif botan-2.4.0/src/lib/rng/auto_rng/info.txt000066400000000000000000000001511322470703100202510ustar00rootroot00000000000000 AUTO_SEEDING_RNG -> 20160821 AUTO_RNG -> 20161126 hmac_drbg botan-2.4.0/src/lib/rng/chacha_rng/000077500000000000000000000000001322470703100170175ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/chacha_rng/chacha_rng.cpp000066400000000000000000000054421322470703100216050ustar00rootroot00000000000000/* * ChaCha_RNG * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { ChaCha_RNG::ChaCha_RNG() : Stateful_RNG() { m_hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_chacha = StreamCipher::create_or_throw("ChaCha(20)"); clear(); } ChaCha_RNG::ChaCha_RNG(const secure_vector& seed) : Stateful_RNG() { m_hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_chacha = StreamCipher::create_or_throw("ChaCha(20)"); clear(); add_entropy(seed.data(), seed.size()); } ChaCha_RNG::ChaCha_RNG(RandomNumberGenerator& underlying_rng, size_t reseed_interval) : Stateful_RNG(underlying_rng, reseed_interval) { m_hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_chacha = StreamCipher::create_or_throw("ChaCha(20)"); clear(); } ChaCha_RNG::ChaCha_RNG(RandomNumberGenerator& underlying_rng, Entropy_Sources& entropy_sources, size_t reseed_interval) : Stateful_RNG(underlying_rng, entropy_sources, reseed_interval) { m_hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_chacha = StreamCipher::create_or_throw("ChaCha(20)"); clear(); } ChaCha_RNG::ChaCha_RNG(Entropy_Sources& entropy_sources, size_t reseed_interval) : Stateful_RNG(entropy_sources, reseed_interval) { m_hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)"); m_chacha = StreamCipher::create_or_throw("ChaCha(20)"); clear(); } void ChaCha_RNG::clear() { Stateful_RNG::clear(); m_hmac->set_key(std::vector(m_hmac->output_length(), 0x00)); m_chacha->set_key(m_hmac->final()); } void ChaCha_RNG::randomize(uint8_t output[], size_t output_len) { randomize_with_input(output, output_len, nullptr, 0); } void ChaCha_RNG::randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) { reseed_check(); if(input_len > 0) { update(input, input_len); } clear_mem(output, output_len); m_chacha->cipher1(output, output_len); } void ChaCha_RNG::update(const uint8_t input[], size_t input_len) { m_hmac->update(input, input_len); m_chacha->set_key(m_hmac->final()); secure_vector mac_key(m_hmac->output_length()); m_chacha->cipher1(mac_key.data(), mac_key.size()); m_hmac->set_key(mac_key); } void ChaCha_RNG::add_entropy(const uint8_t input[], size_t input_len) { update(input, input_len); if(8*input_len >= security_level()) { reset_reseed_counter(); } } size_t ChaCha_RNG::security_level() const { return 256; } } botan-2.4.0/src/lib/rng/chacha_rng/chacha_rng.h000066400000000000000000000110231322470703100212420ustar00rootroot00000000000000/* * ChaCha_RNG * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CHACHA_RNG_H_ #define BOTAN_CHACHA_RNG_H_ #include #include #include namespace Botan { class Entropy_Sources; /** * ChaCha_RNG is a very fast but completely ad-hoc RNG created by * creating a 256-bit random value and using it as a key for ChaCha20. * * The RNG maintains two 256-bit keys, one for HMAC_SHA256 (HK) and the * other for ChaCha20 (CK). To compute a new key in response to * reseeding request or add_entropy calls, ChaCha_RNG computes * CK' = HMAC_SHA256(HK, input_material) * Then a new HK' is computed by running ChaCha20 with the new key to * output 32 bytes: * HK' = ChaCha20(CK') * * Now output can be produced by continuing to produce output with ChaCha20 * under CK' * * The first HK (before seeding occurs) is taken as the all zero value. * * @warning This RNG construction is probably fine but is non-standard. * The primary reason to use it is in cases where the other RNGs are * not fast enough. */ class BOTAN_PUBLIC_API(2,3) ChaCha_RNG final : public Stateful_RNG { public: /** * Automatic reseeding is disabled completely, as it has no access to * any source for seed material. * * If a fork is detected, the RNG will be unable to reseed itself * in response. In this case, an exception will be thrown rather * than generating duplicated output. */ ChaCha_RNG(); /** * Provide an initial seed to the RNG, without providing an * underlying RNG or entropy source. Automatic reseeding is * disabled completely, as it has no access to any source for * seed material. * * If a fork is detected, the RNG will be unable to reseed itself * in response. In this case, an exception will be thrown rather * than generating duplicated output. * * @param seed the seed material, should be at least 256 bits */ ChaCha_RNG(const secure_vector& seed); /** * Automatic reseeding from @p underlying_rng will take place after * @p reseed_interval many requests or after a fork was detected. * * @param underlying_rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ ChaCha_RNG(RandomNumberGenerator& underlying_rng, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); /** * Automatic reseeding from @p entropy_sources will take place after * @p reseed_interval many requests or after a fork was detected. * * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed. */ ChaCha_RNG(Entropy_Sources& entropy_sources, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); /** * Automatic reseeding from @p underlying_rng and @p entropy_sources * will take place after @p reseed_interval many requests or after * a fork was detected. * * @param underlying_rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed. */ ChaCha_RNG(RandomNumberGenerator& underlying_rng, Entropy_Sources& entropy_sources, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); std::string name() const override { return "ChaCha_RNG"; } void clear() override; void randomize(uint8_t output[], size_t output_len) override; void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) override; void add_entropy(const uint8_t input[], size_t input_len) override; size_t security_level() const override; size_t max_number_of_bytes_per_request() const override { return 0; } private: void update(const uint8_t input[], size_t input_len); std::unique_ptr m_hmac; std::unique_ptr m_chacha; }; } #endif botan-2.4.0/src/lib/rng/chacha_rng/info.txt000066400000000000000000000001451322470703100205130ustar00rootroot00000000000000 CHACHA_RNG -> 20170728 hmac sha2_32 chacha stateful_rng botan-2.4.0/src/lib/rng/hmac_drbg/000077500000000000000000000000001322470703100166505ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/hmac_drbg/hmac_drbg.cpp000066400000000000000000000114701322470703100212650ustar00rootroot00000000000000/* * HMAC_DRBG * (C) 2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { HMAC_DRBG::HMAC_DRBG(std::unique_ptr prf, RandomNumberGenerator& underlying_rng, size_t reseed_interval, size_t max_number_of_bytes_per_request) : Stateful_RNG(underlying_rng, reseed_interval), m_mac(std::move(prf)), m_max_number_of_bytes_per_request(max_number_of_bytes_per_request) { BOTAN_ASSERT_NONNULL(m_mac); if(m_max_number_of_bytes_per_request == 0 || m_max_number_of_bytes_per_request > 64 * 1024) { throw Invalid_Argument("Invalid value for max_number_of_bytes_per_request"); } clear(); } HMAC_DRBG::HMAC_DRBG(std::unique_ptr prf, RandomNumberGenerator& underlying_rng, Entropy_Sources& entropy_sources, size_t reseed_interval, size_t max_number_of_bytes_per_request ) : Stateful_RNG(underlying_rng, entropy_sources, reseed_interval), m_mac(std::move(prf)), m_max_number_of_bytes_per_request(max_number_of_bytes_per_request) { BOTAN_ASSERT_NONNULL(m_mac); if(m_max_number_of_bytes_per_request == 0 || m_max_number_of_bytes_per_request > 64 * 1024) { throw Invalid_Argument("Invalid value for max_number_of_bytes_per_request"); } clear(); } HMAC_DRBG::HMAC_DRBG(std::unique_ptr prf, Entropy_Sources& entropy_sources, size_t reseed_interval, size_t max_number_of_bytes_per_request) : Stateful_RNG(entropy_sources, reseed_interval), m_mac(std::move(prf)), m_max_number_of_bytes_per_request(max_number_of_bytes_per_request) { BOTAN_ASSERT_NONNULL(m_mac); if(m_max_number_of_bytes_per_request == 0 || m_max_number_of_bytes_per_request > 64 * 1024) { throw Invalid_Argument("Invalid value for max_number_of_bytes_per_request"); } clear(); } HMAC_DRBG::HMAC_DRBG(std::unique_ptr prf) : Stateful_RNG(), m_mac(std::move(prf)), m_max_number_of_bytes_per_request(64*1024) { BOTAN_ASSERT_NONNULL(m_mac); clear(); } void HMAC_DRBG::clear() { Stateful_RNG::clear(); m_V.resize(m_mac->output_length()); for(size_t i = 0; i != m_V.size(); ++i) m_V[i] = 0x01; m_mac->set_key(std::vector(m_mac->output_length(), 0x00)); } std::string HMAC_DRBG::name() const { return "HMAC_DRBG(" + m_mac->name() + ")"; } void HMAC_DRBG::randomize(uint8_t output[], size_t output_len) { randomize_with_input(output, output_len, nullptr, 0); } /* * HMAC_DRBG generation * See NIST SP800-90A section 10.1.2.5 */ void HMAC_DRBG::randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) { while(output_len > 0) { size_t this_req = std::min(m_max_number_of_bytes_per_request, output_len); output_len -= this_req; reseed_check(); if(input_len > 0) { update(input, input_len); } while(this_req) { const size_t to_copy = std::min(this_req, m_V.size()); m_mac->update(m_V.data(), m_V.size()); m_mac->final(m_V.data()); copy_mem(output, m_V.data(), to_copy); output += to_copy; this_req -= to_copy; } update(input, input_len); } } /* * Reset V and the mac key with new values * See NIST SP800-90A section 10.1.2.2 */ void HMAC_DRBG::update(const uint8_t input[], size_t input_len) { m_mac->update(m_V); m_mac->update(0x00); m_mac->update(input, input_len); m_mac->set_key(m_mac->final()); m_mac->update(m_V.data(), m_V.size()); m_mac->final(m_V.data()); if(input_len > 0) { m_mac->update(m_V); m_mac->update(0x01); m_mac->update(input, input_len); m_mac->set_key(m_mac->final()); m_mac->update(m_V.data(), m_V.size()); m_mac->final(m_V.data()); } } void HMAC_DRBG::add_entropy(const uint8_t input[], size_t input_len) { update(input, input_len); if(8*input_len >= security_level()) { reset_reseed_counter(); } } size_t HMAC_DRBG::security_level() const { // security strength of the hash function // for pre-image resistance (see NIST SP 800-57) // SHA-160: 128 bits, SHA-224, SHA-512/224: 192 bits, // SHA-256, SHA-512/256, SHA-384, SHA-512: >= 256 bits // NIST SP 800-90A only supports up to 256 bits though if(m_mac->output_length() < 32) { return (m_mac->output_length() - 4) * 8; } else { return 32 * 8; } } } botan-2.4.0/src/lib/rng/hmac_drbg/hmac_drbg.h000066400000000000000000000157261322470703100207420ustar00rootroot00000000000000/* * HMAC_DRBG (SP800-90A) * (C) 2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_HMAC_DRBG_H_ #define BOTAN_HMAC_DRBG_H_ #include #include namespace Botan { class Entropy_Sources; /** * HMAC_DRBG from NIST SP800-90A */ class BOTAN_PUBLIC_API(2,0) HMAC_DRBG final : public Stateful_RNG { public: /** * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) * * Automatic reseeding is disabled completely, as it has no access to * any source for seed material. * * If a fork is detected, the RNG will be unable to reseed itself * in response. In this case, an exception will be thrown rather * than generating duplicated output. */ explicit HMAC_DRBG(std::unique_ptr prf); /** * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) * * Automatic reseeding from @p underlying_rng will take place after * @p reseed_interval many requests or after a fork was detected. * * @param prf MAC to use as a PRF * @param underlying_rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed * @param max_number_of_bytes_per_request requests that are in size higher * than max_number_of_bytes_per_request are treated as if multiple single * requests of max_number_of_bytes_per_request size had been made. * In theory SP 800-90A requires that we reject any request for a DRBG * output longer than max_number_of_bytes_per_request. To avoid inconveniencing * the caller who wants an output larger than max_number_of_bytes_per_request, * instead treat these requests as if multiple requests of * max_number_of_bytes_per_request size had been made. NIST requires for * HMAC_DRBG that every implementation set a value no more than 2**19 bits * (or 64 KiB). Together with @p reseed_interval = 1 you can enforce that for * example every 512 bit automatic reseeding occurs. */ HMAC_DRBG(std::unique_ptr prf, RandomNumberGenerator& underlying_rng, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL, size_t max_number_of_bytes_per_request = 64 * 1024); /** * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) * * Automatic reseeding from @p entropy_sources will take place after * @p reseed_interval many requests or after a fork was detected. * * @param prf MAC to use as a PRF * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed. * @param max_number_of_bytes_per_request requests that are in size higher * than max_number_of_bytes_per_request are treated as if multiple single * requests of max_number_of_bytes_per_request size had been made. * In theory SP 800-90A requires that we reject any request for a DRBG * output longer than max_number_of_bytes_per_request. To avoid inconveniencing * the caller who wants an output larger than max_number_of_bytes_per_request, * instead treat these requests as if multiple requests of * max_number_of_bytes_per_request size had been made. NIST requires for * HMAC_DRBG that every implementation set a value no more than 2**19 bits * (or 64 KiB). Together with @p reseed_interval = 1 you can enforce that for * example every 512 bit automatic reseeding occurs. */ HMAC_DRBG(std::unique_ptr prf, Entropy_Sources& entropy_sources, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL, size_t max_number_of_bytes_per_request = 64 * 1024); /** * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) * * Automatic reseeding from @p underlying_rng and @p entropy_sources * will take place after @p reseed_interval many requests or after * a fork was detected. * * @param prf MAC to use as a PRF * @param underlying_rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed. * @param max_number_of_bytes_per_request requests that are in size higher * than max_number_of_bytes_per_request are treated as if multiple single * requests of max_number_of_bytes_per_request size had been made. * In theory SP 800-90A requires that we reject any request for a DRBG * output longer than max_number_of_bytes_per_request. To avoid inconveniencing * the caller who wants an output larger than max_number_of_bytes_per_request, * instead treat these requests as if multiple requests of * max_number_of_bytes_per_request size had been made. NIST requires for * HMAC_DRBG that every implementation set a value no more than 2**19 bits * (or 64 KiB). Together with @p reseed_interval = 1 you can enforce that for * example every 512 bit automatic reseeding occurs. */ HMAC_DRBG(std::unique_ptr prf, RandomNumberGenerator& underlying_rng, Entropy_Sources& entropy_sources, size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL, size_t max_number_of_bytes_per_request = 64 * 1024); /** * Constructor taking a string for the hash */ explicit HMAC_DRBG(const std::string& hmac_hash) : Stateful_RNG(), m_mac(MessageAuthenticationCode::create_or_throw("HMAC(" + hmac_hash + ")")), m_max_number_of_bytes_per_request(64 * 1024) { clear(); } std::string name() const override; void clear() override; void randomize(uint8_t output[], size_t output_len) override; void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) override; void add_entropy(const uint8_t input[], size_t input_len) override; size_t security_level() const override; size_t max_number_of_bytes_per_request() const override { return m_max_number_of_bytes_per_request; } private: void update(const uint8_t input[], size_t input_len); std::unique_ptr m_mac; secure_vector m_V; const size_t m_max_number_of_bytes_per_request; }; } #endif botan-2.4.0/src/lib/rng/hmac_drbg/info.txt000066400000000000000000000001251322470703100203420ustar00rootroot00000000000000 HMAC_DRBG -> 20140319 hmac stateful_rng botan-2.4.0/src/lib/rng/info.txt000066400000000000000000000000371322470703100164360ustar00rootroot00000000000000 entropy botan-2.4.0/src/lib/rng/rdrand_rng/000077500000000000000000000000001322470703100170625ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/rdrand_rng/info.txt000066400000000000000000000001351322470703100205550ustar00rootroot00000000000000 RDRAND_RNG -> 20160619 need_isa rdrand gcc clang icc msvc botan-2.4.0/src/lib/rng/rdrand_rng/rdrand_rng.cpp000066400000000000000000000027731322470703100217170ustar00rootroot00000000000000/* * RDRAND RNG * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if !defined(BOTAN_USE_GCC_INLINE_ASM) #include #endif namespace Botan { RDRAND_RNG::RDRAND_RNG() { if(!CPUID::has_rdrand()) throw Exception("Current CPU does not support RDRAND instruction"); } //static uint32_t RDRAND_RNG::rdrand() { for(;;) { bool ok = false; uint32_t r = rdrand_status(ok); if(ok) return r; } } //static BOTAN_FUNC_ISA("rdrnd") uint32_t RDRAND_RNG::rdrand_status(bool& ok) { ok = false; uint32_t r = 0; for(size_t i = 0; i != BOTAN_ENTROPY_RDRAND_RETRIES; ++i) { #if defined(BOTAN_USE_GCC_INLINE_ASM) int cf = 0; // Encoding of rdrand %eax asm(".byte 0x0F, 0xC7, 0xF0; adcl $0,%1" : "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc"); #else int cf = _rdrand32_step(&r); #endif if(1 == cf) { ok = true; break; } } return r; } void RDRAND_RNG::randomize(uint8_t out[], size_t out_len) { while(out_len >= 4) { uint32_t r = RDRAND_RNG::rdrand(); store_le(r, out); out += 4; out_len -= 4; } if(out_len) // between 1 and 3 trailing bytes { uint32_t r = RDRAND_RNG::rdrand(); for(size_t i = 0; i != out_len; ++i) out[i] = get_byte(i, r); } } } botan-2.4.0/src/lib/rng/rdrand_rng/rdrand_rng.h000066400000000000000000000027171322470703100213620ustar00rootroot00000000000000/* * RDRAND RNG * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RNG_RDRAND_H_ #define BOTAN_RNG_RDRAND_H_ #include namespace Botan { class BOTAN_PUBLIC_API(2,0) RDRAND_RNG final : public Hardware_RNG { public: /** * On correctly working hardware, RDRAND is always supposed to * succeed within a set number of retries. If after that many * retries RDRAND has still not suceeded, sets ok = false and * returns 0. */ static uint32_t rdrand_status(bool& ok); /* * Calls RDRAND until it succeeds, this could hypothetically * loop forever on broken hardware. */ static uint32_t rdrand(); /** * Constructor will throw if CPU does not have RDRAND bit set */ RDRAND_RNG(); /** * Uses RDRAND to produce output */ void randomize(uint8_t out[], size_t out_len) override; /* * No way to provide entropy to RDRAND generator, so add_entropy is ignored */ void add_entropy(const uint8_t[], size_t) override { /* no op */ } /* * No way to reseed RDRAND generator, so reseed is ignored */ size_t reseed(Entropy_Sources&, size_t, std::chrono::milliseconds) override { return 0; /* no op */ } std::string name() const override { return "RDRAND"; } bool is_seeded() const override { return true; } }; } #endif botan-2.4.0/src/lib/rng/rng.cpp000066400000000000000000000040521322470703100162350ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) #include #endif namespace Botan { void RandomNumberGenerator::randomize_with_ts_input(uint8_t output[], size_t output_len) { /* Form additional input which is provided to the PRNG implementation to paramaterize the KDF output. */ uint8_t additional_input[16] = { 0 }; store_le(OS::get_system_timestamp_ns(), additional_input); store_le(OS::get_high_resolution_clock(), additional_input + 8); randomize_with_input(output, output_len, additional_input, sizeof(additional_input)); } void RandomNumberGenerator::randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) { this->add_entropy(input, input_len); this->randomize(output, output_len); } size_t RandomNumberGenerator::reseed(Entropy_Sources& srcs, size_t poll_bits, std::chrono::milliseconds poll_timeout) { return srcs.poll(*this, poll_bits, poll_timeout); } void RandomNumberGenerator::reseed_from_rng(RandomNumberGenerator& rng, size_t poll_bits) { secure_vector buf(poll_bits / 8); rng.randomize(buf.data(), buf.size()); this->add_entropy(buf.data(), buf.size()); } RandomNumberGenerator* RandomNumberGenerator::make_rng() { #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) return new AutoSeeded_RNG; #else throw Exception("make_rng failed, no AutoSeeded_RNG in this build"); #endif } #if defined(BOTAN_TARGET_OS_HAS_THREADS) #if defined(BOTAN_HAS_AUTO_SEEDING_RNG) Serialized_RNG::Serialized_RNG() : m_rng(new AutoSeeded_RNG) {} #else Serialized_RNG::Serialized_RNG() { throw Exception("Serialized_RNG default constructor failed: AutoSeeded_RNG disabled in build"); } #endif #endif } botan-2.4.0/src/lib/rng/rng.h000066400000000000000000000176451322470703100157160ustar00rootroot00000000000000/* * Random Number Generator base classes * (C) 1999-2009,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H_ #define BOTAN_RANDOM_NUMBER_GENERATOR_H_ #include #include #include #include #include namespace Botan { class Entropy_Sources; /** * An interface to a cryptographic random number generator */ class BOTAN_PUBLIC_API(2,0) RandomNumberGenerator { public: virtual ~RandomNumberGenerator() = default; RandomNumberGenerator() = default; /* * Never copy a RNG, create a new one */ RandomNumberGenerator(const RandomNumberGenerator& rng) = delete; RandomNumberGenerator& operator=(const RandomNumberGenerator& rng) = delete; /** * Randomize a byte array. * @param output the byte array to hold the random output. * @param length the length of the byte array output in bytes. */ virtual void randomize(uint8_t output[], size_t length) = 0; /** * Incorporate some additional data into the RNG state. For * example adding nonces or timestamps from a peer's protocol * message can help hedge against VM state rollback attacks. * A few RNG types do not accept any externally provided input, * in which case this function is a no-op. * * @param input a byte array containg the entropy to be added * @param length the length of the byte array in */ virtual void add_entropy(const uint8_t input[], size_t length) = 0; /** * Incorporate some additional data into the RNG state. */ template void add_entropy_T(const T& t) { this->add_entropy(reinterpret_cast(&t), sizeof(T)); } /** * Incorporate entropy into the RNG state then produce output. * Some RNG types implement this using a single operation, default * calls add_entropy + randomize in sequence. * * Use this to further bind the outputs to your current * process/protocol state. For instance if generating a new key * for use in a session, include a session ID or other such * value. See NIST SP 800-90 A, B, C series for more ideas. * * @param output buffer to hold the random output * @param output_len size of the output buffer in bytes * @param input entropy buffer to incorporate * @param input_len size of the input buffer in bytes */ virtual void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len); /** * This calls `randomize_with_input` using some timestamps as extra input. * * For a stateful RNG using non-random but potentially unique data the * extra input can help protect against problems with fork, VM state * rollback, or other cases where somehow an RNG state is duplicated. If * both of the duplicated RNG states later incorporate a timestamp (and the * timestamps don't themselves repeat), their outputs will diverge. */ virtual void randomize_with_ts_input(uint8_t output[], size_t output_len); /** * @return the name of this RNG type */ virtual std::string name() const = 0; /** * Clear all internally held values of this RNG * @post is_seeded() == false */ virtual void clear() = 0; /** * Check whether this RNG is seeded. * @return true if this RNG was already seeded, false otherwise. */ virtual bool is_seeded() const = 0; /** * Poll provided sources for up to poll_bits bits of entropy * or until the timeout expires. Returns estimate of the number * of bits collected. */ virtual size_t reseed(Entropy_Sources& srcs, size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS, std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT); /** * Reseed by reading specified bits from the RNG */ virtual void reseed_from_rng(RandomNumberGenerator& rng, size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS); // Some utility functions built on the interface above: /** * Return a random vector * @param bytes number of bytes in the result * @return randomized vector of length bytes */ secure_vector random_vec(size_t bytes) { secure_vector output(bytes); this->randomize(output.data(), output.size()); return output; } /** * Return a random byte * @return random byte */ uint8_t next_byte() { uint8_t b; this->randomize(&b, 1); return b; } /** * @return a random byte that is greater than zero */ uint8_t next_nonzero_byte() { uint8_t b = this->next_byte(); while(b == 0) b = this->next_byte(); return b; } /** * Create a seeded and active RNG object for general application use * Added in 1.8.0 * Use AutoSeeded_RNG instead */ BOTAN_DEPRECATED("Use AutoSeeded_RNG") static RandomNumberGenerator* make_rng(); }; /** * Convenience typedef */ typedef RandomNumberGenerator RNG; /** * Hardware_RNG has no members but exists to tag hardware RNG types * (PKCS11_RNG, TPM_RNG, RDRAND_RNG) */ class BOTAN_PUBLIC_API(2,0) Hardware_RNG : public RandomNumberGenerator { public: virtual void clear() final override { /* no way to clear state of hardware RNG */ } }; /** * Null/stub RNG - fails if you try to use it for anything * This is not generally useful except for in certain tests */ class BOTAN_PUBLIC_API(2,0) Null_RNG final : public RandomNumberGenerator { public: bool is_seeded() const override { return false; } void clear() override {} void randomize(uint8_t[], size_t) override { throw PRNG_Unseeded("Null_RNG called"); } void add_entropy(const uint8_t[], size_t) override {} std::string name() const override { return "Null_RNG"; } }; #if defined(BOTAN_TARGET_OS_HAS_THREADS) /** * Wraps access to a RNG in a mutex * Note that most of the time it's much better to use a RNG per thread * otherwise the RNG will act as an unnecessary contention point */ class BOTAN_PUBLIC_API(2,0) Serialized_RNG final : public RandomNumberGenerator { public: void randomize(uint8_t out[], size_t len) override { lock_guard_type lock(m_mutex); m_rng->randomize(out, len); } bool is_seeded() const override { lock_guard_type lock(m_mutex); return m_rng->is_seeded(); } void clear() override { lock_guard_type lock(m_mutex); m_rng->clear(); } std::string name() const override { lock_guard_type lock(m_mutex); return m_rng->name(); } size_t reseed(Entropy_Sources& src, size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS, std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT) override { lock_guard_type lock(m_mutex); return m_rng->reseed(src, poll_bits, poll_timeout); } void add_entropy(const uint8_t in[], size_t len) override { lock_guard_type lock(m_mutex); m_rng->add_entropy(in, len); } BOTAN_DEPRECATED("Use Serialized_RNG(new AutoSeeded_RNG)") Serialized_RNG(); explicit Serialized_RNG(RandomNumberGenerator* rng) : m_rng(rng) {} private: mutable mutex_type m_mutex; std::unique_ptr m_rng; }; #endif } #endif botan-2.4.0/src/lib/rng/stateful_rng/000077500000000000000000000000001322470703100174375ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/stateful_rng/info.txt000066400000000000000000000000561322470703100211340ustar00rootroot00000000000000 STATEFUL_RNG -> 20160819 botan-2.4.0/src/lib/rng/stateful_rng/stateful_rng.cpp000066400000000000000000000051201322470703100226360ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { void Stateful_RNG::clear() { m_reseed_counter = 0; m_last_pid = 0; } void Stateful_RNG::force_reseed() { m_reseed_counter = 0; } bool Stateful_RNG::is_seeded() const { return m_reseed_counter > 0; } void Stateful_RNG::initialize_with(const uint8_t input[], size_t len) { add_entropy(input, len); if(8*len >= security_level()) { reset_reseed_counter(); } } void Stateful_RNG::randomize_with_ts_input(uint8_t output[], size_t output_len) { uint8_t additional_input[24] = { 0 }; store_le(OS::get_system_timestamp_ns(), additional_input); store_le(OS::get_high_resolution_clock(), additional_input + 8); store_le(m_last_pid, additional_input + 16); store_le(static_cast(m_reseed_counter), additional_input + 20); randomize_with_input(output, output_len, additional_input, sizeof(additional_input)); } size_t Stateful_RNG::reseed(Entropy_Sources& srcs, size_t poll_bits, std::chrono::milliseconds poll_timeout) { size_t bits_collected = RandomNumberGenerator::reseed(srcs, poll_bits, poll_timeout); if(bits_collected >= security_level()) { reset_reseed_counter(); } return bits_collected; } void Stateful_RNG::reseed_from_rng(RandomNumberGenerator& rng, size_t poll_bits) { RandomNumberGenerator::reseed_from_rng(rng, poll_bits); if(poll_bits >= security_level()) { reset_reseed_counter(); } } void Stateful_RNG::reseed_check() { const uint32_t cur_pid = OS::get_process_id(); const bool fork_detected = (m_last_pid > 0) && (cur_pid != m_last_pid); if(is_seeded() == false || fork_detected || (m_reseed_interval > 0 && m_reseed_counter >= m_reseed_interval)) { m_reseed_counter = 0; m_last_pid = cur_pid; if(m_underlying_rng) { reseed_from_rng(*m_underlying_rng, security_level()); } if(m_entropy_sources) { reseed(*m_entropy_sources, security_level()); } if(!is_seeded()) { if(fork_detected) throw Exception("Detected use of fork but cannot reseed DRBG"); else throw PRNG_Unseeded(name()); } } else { BOTAN_ASSERT(m_reseed_counter != 0, "RNG is seeded"); m_reseed_counter += 1; } } } botan-2.4.0/src/lib/rng/stateful_rng/stateful_rng.h000066400000000000000000000117511322470703100223120ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STATEFUL_RNG_H_ #define BOTAN_STATEFUL_RNG_H_ #include namespace Botan { /** * Inherited by RNGs which maintain in-process state, like HMAC_DRBG. * On Unix these RNGs are vulnerable to problems with fork, where the * RNG state is duplicated, and the parent and child process RNGs will * produce identical output until one of them reseeds. Stateful_RNG * reseeds itself whenever a fork is detected, or after a set number of * bytes have been output. * * Not implemented by RNGs which access an external RNG, such as the * system PRNG or a hardware RNG. */ class BOTAN_PUBLIC_API(2,0) Stateful_RNG : public RandomNumberGenerator { public: /** * @param rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ Stateful_RNG(RandomNumberGenerator& rng, Entropy_Sources& entropy_sources, size_t reseed_interval) : m_underlying_rng(&rng), m_entropy_sources(&entropy_sources), m_reseed_interval(reseed_interval) {} /** * @param rng is a reference to some RNG which will be used * to perform the periodic reseeding * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ Stateful_RNG(RandomNumberGenerator& rng, size_t reseed_interval) : m_underlying_rng(&rng), m_reseed_interval(reseed_interval) {} /** * @param entropy_sources will be polled to perform reseeding periodically * @param reseed_interval specifies a limit of how many times * the RNG will be called before automatic reseeding is performed */ Stateful_RNG(Entropy_Sources& entropy_sources, size_t reseed_interval) : m_entropy_sources(&entropy_sources), m_reseed_interval(reseed_interval) {} /** * In this case, automatic reseeding is impossible */ Stateful_RNG() : m_reseed_interval(0) {} /** * Consume this input and mark the RNG as initialized regardless * of the length of the input or the current seeded state of * the RNG. */ void initialize_with(const uint8_t input[], size_t length); bool is_seeded() const override final; /** * Mark state as requiring a reseed on next use */ void force_reseed(); void reseed_from_rng(RandomNumberGenerator& rng, size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS) override final; /** * Overrides default implementation and also includes the current * process ID and the reseed counter. */ void randomize_with_ts_input(uint8_t output[], size_t output_len) override final; /** * Poll provided sources for up to poll_bits bits of entropy * or until the timeout expires. Returns estimate of the number * of bits collected. */ size_t reseed(Entropy_Sources& srcs, size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS, std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT) override; /** * @return intended security level of this DRBG */ virtual size_t security_level() const = 0; /** * Some DRBGs have a notion of the maximum number of bytes per * request. Longer requests (to randomize) will be treated as * multiple requests, and may initiate reseeding multiple times, * depending on the values of max_number_of_bytes_per_request and * reseed_interval(). This function returns zero if the RNG in * question does not have such a notion. * * @return max number of bytes per request (or zero) */ virtual size_t max_number_of_bytes_per_request() const = 0; size_t reseed_interval() const { return m_reseed_interval; } void clear() override; protected: void reseed_check(); /** * Called by a subclass to notify that a reseed has been * successfully performed. */ void reset_reseed_counter() { m_reseed_counter = 1; } private: // A non-owned and possibly null pointer to shared RNG RandomNumberGenerator* m_underlying_rng = nullptr; // A non-owned and possibly null pointer to a shared Entropy_Source Entropy_Sources* m_entropy_sources = nullptr; const size_t m_reseed_interval; uint32_t m_last_pid = 0; /* * Set to 1 after a successful seeding, then incremented. Reset * to 0 by clear() or a fork. This logic is used even if * automatic reseeding is disabled (via m_reseed_interval = 0) */ size_t m_reseed_counter = 0; }; } #endif botan-2.4.0/src/lib/rng/system_rng/000077500000000000000000000000001322470703100171345ustar00rootroot00000000000000botan-2.4.0/src/lib/rng/system_rng/info.txt000066400000000000000000000004131322470703100206260ustar00rootroot00000000000000 SYSTEM_RNG -> 20141202 aix android cygwin darwin dragonfly freebsd haiku hpux hurd includeos ios linux mingw netbsd openbsd qnx solaris windows winphone windows -> advapi32.lib winphone -> bcrypt.lib mingw -> advapi32 botan-2.4.0/src/lib/rng/system_rng/system_rng.cpp000066400000000000000000000143571322470703100220440ustar00rootroot00000000000000/* * System RNG * (C) 2014,2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) #define NOMINMAX 1 #define _WINSOCKAPI_ // stop windows.h including winsock.h #include #include #elif defined(BOTAN_TARGET_OS_HAS_CRYPTO_NG) #include #elif defined(BOTAN_TARGET_OS_HAS_ARC4RANDOM) #include #else #include #include #include #include #include #endif namespace Botan { namespace { #if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) class System_RNG_Impl final : public RandomNumberGenerator { public: System_RNG_Impl() { if(!CryptAcquireContext(&m_prov, nullptr, nullptr, BOTAN_SYSTEM_RNG_CRYPTOAPI_PROV_TYPE, CRYPT_VERIFYCONTEXT)) throw Exception("System_RNG failed to acquire crypto provider"); } ~System_RNG_Impl() { ::CryptReleaseContext(m_prov, 0); } void randomize(uint8_t buf[], size_t len) override { ::CryptGenRandom(m_prov, static_cast(len), buf); } void add_entropy(const uint8_t in[], size_t length) override { /* There is no explicit ConsumeRandom, but all values provided in the call are incorporated into the state. */ std::vector buf(in, in + length); ::CryptGenRandom(m_prov, static_cast(buf.size()), buf.data()); } bool is_seeded() const override { return true; } void clear() override { /* not possible */ } std::string name() const override { return "cryptoapi"; } private: HCRYPTPROV m_prov; }; #elif defined(BOTAN_TARGET_OS_HAS_CRYPTO_NG) class System_RNG_Impl final : public RandomNumberGenerator { public: System_RNG_Impl() { NTSTATUS ret = ::BCryptOpenAlgorithmProvider(&m_prov, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0); if(ret != STATUS_SUCCESS) throw Exception("System_RNG failed to acquire crypto provider"); } ~System_RNG_Impl() { ::BCryptCloseAlgorithmProvider(m_prov, 0); } void randomize(uint8_t buf[], size_t len) override { ::BCryptGenRandom(m_prov, static_cast(buf), static_cast(len), 0); } void add_entropy(const uint8_t in[], size_t length) override { /* There is a flag BCRYPT_RNG_USE_ENTROPY_IN_BUFFER to provide entropy inputs, but it is ignored in Windows 8 and later. */ } bool is_seeded() const override { return true; } void clear() override { /* not possible */ } std::string name() const override { return "crypto_ng"; } private: BCRYPT_ALG_HANDLE m_handle; }; #elif defined(BOTAN_TARGET_OS_HAS_ARC4RANDOM) class System_RNG_Impl final : public RandomNumberGenerator { public: // No constructor or destructor needed as no userland state maintained void randomize(uint8_t buf[], size_t len) override { ::arc4random_buf(buf, len); } void add_entropy(const uint8_t[], size_t) override { /* ignored */ } bool is_seeded() const override { return true; } void clear() override { /* not possible */ } std::string name() const override { return "arc4random"; } }; #else // Read a random device class System_RNG_Impl final : public RandomNumberGenerator { public: System_RNG_Impl() { #ifndef O_NOCTTY #define O_NOCTTY 0 #endif m_fd = ::open(BOTAN_SYSTEM_RNG_DEVICE, O_RDWR | O_NOCTTY); /* Cannot open in read-write mode. Fall back to read-only, calls to add_entropy will fail, but randomize will work */ if(m_fd < 0) m_fd = ::open(BOTAN_SYSTEM_RNG_DEVICE, O_RDONLY | O_NOCTTY); if(m_fd < 0) throw Exception("System_RNG failed to open RNG device"); } ~System_RNG_Impl() { ::close(m_fd); m_fd = -1; } void randomize(uint8_t buf[], size_t len) override; void add_entropy(const uint8_t in[], size_t length) override; bool is_seeded() const override { return true; } void clear() override { /* not possible */ } std::string name() const override { return BOTAN_SYSTEM_RNG_DEVICE; } private: int m_fd; }; void System_RNG_Impl::randomize(uint8_t buf[], size_t len) { while(len) { ssize_t got = ::read(m_fd, buf, len); if(got < 0) { if(errno == EINTR) continue; throw Exception("System_RNG read failed error " + std::to_string(errno)); } if(got == 0) throw Exception("System_RNG EOF on device"); // ?!? buf += got; len -= got; } } void System_RNG_Impl::add_entropy(const uint8_t input[], size_t len) { while(len) { ssize_t got = ::write(m_fd, input, len); if(got < 0) { if(errno == EINTR) continue; /* * This is seen on OS X CI, despite the fact that the man page * for Darwin urandom explicitly states that writing to it is * supported, and write(2) does not document EPERM at all. * But in any case EPERM seems indicative of a policy decision * by the OS or sysadmin that additional entropy is not wanted * in the system pool, so we accept that and return here, * since there is no corrective action possible. * * In Linux EBADF or EPERM is returned if m_fd is not opened for * writing. */ if(errno == EPERM || errno == EBADF) return; // maybe just ignore any failure here and return? throw Exception("System_RNG write failed error " + std::to_string(errno)); } input += got; len -= got; } } #endif } RandomNumberGenerator& system_rng() { static System_RNG_Impl g_system_rng; return g_system_rng; } } botan-2.4.0/src/lib/rng/system_rng/system_rng.h000066400000000000000000000020031322470703100214720ustar00rootroot00000000000000/* * System RNG interface * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SYSTEM_RNG_H_ #define BOTAN_SYSTEM_RNG_H_ #include namespace Botan { /** * Return a shared reference to a global PRNG instance provided by the * operating system. For instance might be instantiated by /dev/urandom * or CryptGenRandom. */ BOTAN_PUBLIC_API(2,0) RandomNumberGenerator& system_rng(); /* * Instantiable reference to the system RNG. */ class BOTAN_PUBLIC_API(2,0) System_RNG final : public RandomNumberGenerator { public: std::string name() const override { return system_rng().name(); } void randomize(uint8_t out[], size_t len) override { system_rng().randomize(out, len); } void add_entropy(const uint8_t in[], size_t length) override { system_rng().add_entropy(in, length); } bool is_seeded() const override { return system_rng().is_seeded(); } void clear() override { system_rng().clear(); } }; } #endif botan-2.4.0/src/lib/stream/000077500000000000000000000000001322470703100154475ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/chacha/000077500000000000000000000000001322470703100166565ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/chacha/chacha.cpp000066400000000000000000000142611322470703100205750ustar00rootroot00000000000000/* * ChaCha * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { ChaCha::ChaCha(size_t rounds) : m_rounds(rounds) { if(m_rounds != 8 && m_rounds != 12 && m_rounds != 20) throw Invalid_Argument("ChaCha only supports 8, 12 or 20 rounds"); } std::string ChaCha::provider() const { #if defined(BOTAN_HAS_CHACHA_SSE2) if(CPUID::has_sse2()) { return "sse2"; } #endif return "base"; } //static void ChaCha::chacha_x4(uint8_t output[64*4], uint32_t input[16], size_t rounds) { BOTAN_ASSERT(rounds % 2 == 0, "Valid rounds"); #if defined(BOTAN_HAS_CHACHA_SSE2) if(CPUID::has_sse2()) { return ChaCha::chacha_sse2_x4(output, input, rounds); } #endif // TODO interleave rounds for(size_t i = 0; i != 4; ++i) { uint32_t x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3], x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7], x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11], x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15]; #define CHACHA_QUARTER_ROUND(a, b, c, d) \ do { \ a += b; d ^= a; d = rotl<16>(d); \ c += d; b ^= c; b = rotl<12>(b); \ a += b; d ^= a; d = rotl<8>(d); \ c += d; b ^= c; b = rotl<7>(b); \ } while(0) for(size_t r = 0; r != rounds / 2; ++r) { CHACHA_QUARTER_ROUND(x00, x04, x08, x12); CHACHA_QUARTER_ROUND(x01, x05, x09, x13); CHACHA_QUARTER_ROUND(x02, x06, x10, x14); CHACHA_QUARTER_ROUND(x03, x07, x11, x15); CHACHA_QUARTER_ROUND(x00, x05, x10, x15); CHACHA_QUARTER_ROUND(x01, x06, x11, x12); CHACHA_QUARTER_ROUND(x02, x07, x08, x13); CHACHA_QUARTER_ROUND(x03, x04, x09, x14); } #undef CHACHA_QUARTER_ROUND x00 += input[0]; x01 += input[1]; x02 += input[2]; x03 += input[3]; x04 += input[4]; x05 += input[5]; x06 += input[6]; x07 += input[7]; x08 += input[8]; x09 += input[9]; x10 += input[10]; x11 += input[11]; x12 += input[12]; x13 += input[13]; x14 += input[14]; x15 += input[15]; store_le(x00, output + 64 * i + 4 * 0); store_le(x01, output + 64 * i + 4 * 1); store_le(x02, output + 64 * i + 4 * 2); store_le(x03, output + 64 * i + 4 * 3); store_le(x04, output + 64 * i + 4 * 4); store_le(x05, output + 64 * i + 4 * 5); store_le(x06, output + 64 * i + 4 * 6); store_le(x07, output + 64 * i + 4 * 7); store_le(x08, output + 64 * i + 4 * 8); store_le(x09, output + 64 * i + 4 * 9); store_le(x10, output + 64 * i + 4 * 10); store_le(x11, output + 64 * i + 4 * 11); store_le(x12, output + 64 * i + 4 * 12); store_le(x13, output + 64 * i + 4 * 13); store_le(x14, output + 64 * i + 4 * 14); store_le(x15, output + 64 * i + 4 * 15); input[12]++; input[13] += input[12] < i; // carry? } } /* * Combine cipher stream with message */ void ChaCha::cipher(const uint8_t in[], uint8_t out[], size_t length) { verify_key_set(m_state.empty() == false); while(length >= m_buffer.size() - m_position) { xor_buf(out, in, &m_buffer[m_position], m_buffer.size() - m_position); length -= (m_buffer.size() - m_position); in += (m_buffer.size() - m_position); out += (m_buffer.size() - m_position); chacha_x4(m_buffer.data(), m_state.data(), m_rounds); m_position = 0; } xor_buf(out, in, &m_buffer[m_position], length); m_position += length; } /* * ChaCha Key Schedule */ void ChaCha::key_schedule(const uint8_t key[], size_t length) { static const uint32_t TAU[] = { 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 }; static const uint32_t SIGMA[] = { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 }; const uint32_t* CONSTANTS = (length == 16) ? TAU : SIGMA; // Repeat the key if 128 bits const uint8_t* key2 = (length == 32) ? key + 16 : key; m_position = 0; m_state.resize(16); m_buffer.resize(4*64); m_state[0] = CONSTANTS[0]; m_state[1] = CONSTANTS[1]; m_state[2] = CONSTANTS[2]; m_state[3] = CONSTANTS[3]; m_state[4] = load_le(key, 0); m_state[5] = load_le(key, 1); m_state[6] = load_le(key, 2); m_state[7] = load_le(key, 3); m_state[8] = load_le(key2, 0); m_state[9] = load_le(key2, 1); m_state[10] = load_le(key2, 2); m_state[11] = load_le(key2, 3); // Default all-zero IV const uint8_t ZERO[8] = { 0 }; set_iv(ZERO, sizeof(ZERO)); } bool ChaCha::valid_iv_length(size_t iv_len) const { return (iv_len == 0 || iv_len == 8 || iv_len == 12); } void ChaCha::set_iv(const uint8_t iv[], size_t length) { if(!valid_iv_length(length)) throw Invalid_IV_Length(name(), length); m_state[12] = 0; m_state[13] = 0; if(length == 0) { // Treat zero length IV same as an all-zero IV m_state[14] = 0; m_state[15] = 0; } else if(length == 8) { m_state[14] = load_le(iv, 0); m_state[15] = load_le(iv, 1); } else if(length == 12) { m_state[13] = load_le(iv, 0); m_state[14] = load_le(iv, 1); m_state[15] = load_le(iv, 2); } chacha_x4(m_buffer.data(), m_state.data(), m_rounds); m_position = 0; } void ChaCha::clear() { zap(m_state); zap(m_buffer); m_position = 0; } std::string ChaCha::name() const { return "ChaCha(" + std::to_string(m_rounds) + ")"; } void ChaCha::seek(uint64_t offset) { verify_key_set(m_state.empty() == false); // Find the block offset uint64_t counter = offset / 64; uint8_t out[8]; store_le(counter, out); m_state[12] = load_le(out, 0); m_state[13] += load_le(out, 1); chacha_x4(m_buffer.data(), m_state.data(), m_rounds); m_position = offset % 64; } } botan-2.4.0/src/lib/stream/chacha/chacha.h000066400000000000000000000033071322470703100202410ustar00rootroot00000000000000/* * ChaCha20 * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CHACHA_H_ #define BOTAN_CHACHA_H_ #include namespace Botan { /** * DJB's ChaCha (https://cr.yp.to/chacha.html) */ class BOTAN_PUBLIC_API(2,0) ChaCha final : public StreamCipher { public: StreamCipher* clone() const override { return new ChaCha(m_rounds); } /** * @param rounds number of rounds * @note Currently only 8, 12 or 20 rounds are supported, all others * will throw an exception */ explicit ChaCha(size_t rounds = 20); std::string provider() const override; void cipher(const uint8_t in[], uint8_t out[], size_t length) override; void set_iv(const uint8_t iv[], size_t iv_len) override; /* * ChaCha accepts 0, 8, or 12 byte IVs. The default IV is a 8 zero bytes. * An IV of length 0 is treated the same as the default zero IV. */ bool valid_iv_length(size_t iv_len) const override; Key_Length_Specification key_spec() const override { return Key_Length_Specification(16, 32, 16); } void clear() override; std::string name() const override; void seek(uint64_t offset) override; private: void key_schedule(const uint8_t key[], size_t key_len) override; void chacha_x4(uint8_t output[64*4], uint32_t state[16], size_t rounds); #if defined(BOTAN_HAS_CHACHA_SSE2) void chacha_sse2_x4(uint8_t output[64*4], uint32_t state[16], size_t rounds); #endif size_t m_rounds; secure_vector m_state; secure_vector m_buffer; size_t m_position = 0; }; } #endif botan-2.4.0/src/lib/stream/chacha/chacha_sse2/000077500000000000000000000000001322470703100210215ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/chacha/chacha_sse2/chacha_sse2.cpp000066400000000000000000000177041322470703100237010ustar00rootroot00000000000000/* * SSE2 ChaCha * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { //static BOTAN_FUNC_ISA("sse2") void ChaCha::chacha_sse2_x4(uint8_t output[64*4], uint32_t input[16], size_t rounds) { BOTAN_ASSERT(rounds % 2 == 0, "Valid rounds"); const __m128i* input_mm = reinterpret_cast(input); __m128i* output_mm = reinterpret_cast<__m128i*>(output); __m128i input0 = _mm_loadu_si128(input_mm); __m128i input1 = _mm_loadu_si128(input_mm + 1); __m128i input2 = _mm_loadu_si128(input_mm + 2); __m128i input3 = _mm_loadu_si128(input_mm + 3); // TODO: try transposing, which would avoid the permutations each round #define mm_rotl(r, n) \ _mm_or_si128(_mm_slli_epi32(r, n), _mm_srli_epi32(r, 32-n)) __m128i r0_0 = input0; __m128i r0_1 = input1; __m128i r0_2 = input2; __m128i r0_3 = input3; __m128i r1_0 = input0; __m128i r1_1 = input1; __m128i r1_2 = input2; __m128i r1_3 = _mm_add_epi64(r0_3, _mm_set_epi32(0, 0, 0, 1)); __m128i r2_0 = input0; __m128i r2_1 = input1; __m128i r2_2 = input2; __m128i r2_3 = _mm_add_epi64(r0_3, _mm_set_epi32(0, 0, 0, 2)); __m128i r3_0 = input0; __m128i r3_1 = input1; __m128i r3_2 = input2; __m128i r3_3 = _mm_add_epi64(r0_3, _mm_set_epi32(0, 0, 0, 3)); for(size_t r = 0; r != rounds / 2; ++r) { r0_0 = _mm_add_epi32(r0_0, r0_1); r1_0 = _mm_add_epi32(r1_0, r1_1); r2_0 = _mm_add_epi32(r2_0, r2_1); r3_0 = _mm_add_epi32(r3_0, r3_1); r0_3 = _mm_xor_si128(r0_3, r0_0); r1_3 = _mm_xor_si128(r1_3, r1_0); r2_3 = _mm_xor_si128(r2_3, r2_0); r3_3 = _mm_xor_si128(r3_3, r3_0); r0_3 = mm_rotl(r0_3, 16); r1_3 = mm_rotl(r1_3, 16); r2_3 = mm_rotl(r2_3, 16); r3_3 = mm_rotl(r3_3, 16); r0_2 = _mm_add_epi32(r0_2, r0_3); r1_2 = _mm_add_epi32(r1_2, r1_3); r2_2 = _mm_add_epi32(r2_2, r2_3); r3_2 = _mm_add_epi32(r3_2, r3_3); r0_1 = _mm_xor_si128(r0_1, r0_2); r1_1 = _mm_xor_si128(r1_1, r1_2); r2_1 = _mm_xor_si128(r2_1, r2_2); r3_1 = _mm_xor_si128(r3_1, r3_2); r0_1 = mm_rotl(r0_1, 12); r1_1 = mm_rotl(r1_1, 12); r2_1 = mm_rotl(r2_1, 12); r3_1 = mm_rotl(r3_1, 12); r0_0 = _mm_add_epi32(r0_0, r0_1); r1_0 = _mm_add_epi32(r1_0, r1_1); r2_0 = _mm_add_epi32(r2_0, r2_1); r3_0 = _mm_add_epi32(r3_0, r3_1); r0_3 = _mm_xor_si128(r0_3, r0_0); r1_3 = _mm_xor_si128(r1_3, r1_0); r2_3 = _mm_xor_si128(r2_3, r2_0); r3_3 = _mm_xor_si128(r3_3, r3_0); r0_3 = mm_rotl(r0_3, 8); r1_3 = mm_rotl(r1_3, 8); r2_3 = mm_rotl(r2_3, 8); r3_3 = mm_rotl(r3_3, 8); r0_2 = _mm_add_epi32(r0_2, r0_3); r1_2 = _mm_add_epi32(r1_2, r1_3); r2_2 = _mm_add_epi32(r2_2, r2_3); r3_2 = _mm_add_epi32(r3_2, r3_3); r0_1 = _mm_xor_si128(r0_1, r0_2); r1_1 = _mm_xor_si128(r1_1, r1_2); r2_1 = _mm_xor_si128(r2_1, r2_2); r3_1 = _mm_xor_si128(r3_1, r3_2); r0_1 = mm_rotl(r0_1, 7); r1_1 = mm_rotl(r1_1, 7); r2_1 = mm_rotl(r2_1, 7); r3_1 = mm_rotl(r3_1, 7); r0_1 = _mm_shuffle_epi32(r0_1, _MM_SHUFFLE(0, 3, 2, 1)); r0_2 = _mm_shuffle_epi32(r0_2, _MM_SHUFFLE(1, 0, 3, 2)); r0_3 = _mm_shuffle_epi32(r0_3, _MM_SHUFFLE(2, 1, 0, 3)); r1_1 = _mm_shuffle_epi32(r1_1, _MM_SHUFFLE(0, 3, 2, 1)); r1_2 = _mm_shuffle_epi32(r1_2, _MM_SHUFFLE(1, 0, 3, 2)); r1_3 = _mm_shuffle_epi32(r1_3, _MM_SHUFFLE(2, 1, 0, 3)); r2_1 = _mm_shuffle_epi32(r2_1, _MM_SHUFFLE(0, 3, 2, 1)); r2_2 = _mm_shuffle_epi32(r2_2, _MM_SHUFFLE(1, 0, 3, 2)); r2_3 = _mm_shuffle_epi32(r2_3, _MM_SHUFFLE(2, 1, 0, 3)); r3_1 = _mm_shuffle_epi32(r3_1, _MM_SHUFFLE(0, 3, 2, 1)); r3_2 = _mm_shuffle_epi32(r3_2, _MM_SHUFFLE(1, 0, 3, 2)); r3_3 = _mm_shuffle_epi32(r3_3, _MM_SHUFFLE(2, 1, 0, 3)); r0_0 = _mm_add_epi32(r0_0, r0_1); r1_0 = _mm_add_epi32(r1_0, r1_1); r2_0 = _mm_add_epi32(r2_0, r2_1); r3_0 = _mm_add_epi32(r3_0, r3_1); r0_3 = _mm_xor_si128(r0_3, r0_0); r1_3 = _mm_xor_si128(r1_3, r1_0); r2_3 = _mm_xor_si128(r2_3, r2_0); r3_3 = _mm_xor_si128(r3_3, r3_0); r0_3 = mm_rotl(r0_3, 16); r1_3 = mm_rotl(r1_3, 16); r2_3 = mm_rotl(r2_3, 16); r3_3 = mm_rotl(r3_3, 16); r0_2 = _mm_add_epi32(r0_2, r0_3); r1_2 = _mm_add_epi32(r1_2, r1_3); r2_2 = _mm_add_epi32(r2_2, r2_3); r3_2 = _mm_add_epi32(r3_2, r3_3); r0_1 = _mm_xor_si128(r0_1, r0_2); r1_1 = _mm_xor_si128(r1_1, r1_2); r2_1 = _mm_xor_si128(r2_1, r2_2); r3_1 = _mm_xor_si128(r3_1, r3_2); r0_1 = mm_rotl(r0_1, 12); r1_1 = mm_rotl(r1_1, 12); r2_1 = mm_rotl(r2_1, 12); r3_1 = mm_rotl(r3_1, 12); r0_0 = _mm_add_epi32(r0_0, r0_1); r1_0 = _mm_add_epi32(r1_0, r1_1); r2_0 = _mm_add_epi32(r2_0, r2_1); r3_0 = _mm_add_epi32(r3_0, r3_1); r0_3 = _mm_xor_si128(r0_3, r0_0); r1_3 = _mm_xor_si128(r1_3, r1_0); r2_3 = _mm_xor_si128(r2_3, r2_0); r3_3 = _mm_xor_si128(r3_3, r3_0); r0_3 = mm_rotl(r0_3, 8); r1_3 = mm_rotl(r1_3, 8); r2_3 = mm_rotl(r2_3, 8); r3_3 = mm_rotl(r3_3, 8); r0_2 = _mm_add_epi32(r0_2, r0_3); r1_2 = _mm_add_epi32(r1_2, r1_3); r2_2 = _mm_add_epi32(r2_2, r2_3); r3_2 = _mm_add_epi32(r3_2, r3_3); r0_1 = _mm_xor_si128(r0_1, r0_2); r1_1 = _mm_xor_si128(r1_1, r1_2); r2_1 = _mm_xor_si128(r2_1, r2_2); r3_1 = _mm_xor_si128(r3_1, r3_2); r0_1 = mm_rotl(r0_1, 7); r1_1 = mm_rotl(r1_1, 7); r2_1 = mm_rotl(r2_1, 7); r3_1 = mm_rotl(r3_1, 7); r0_1 = _mm_shuffle_epi32(r0_1, _MM_SHUFFLE(2, 1, 0, 3)); r0_2 = _mm_shuffle_epi32(r0_2, _MM_SHUFFLE(1, 0, 3, 2)); r0_3 = _mm_shuffle_epi32(r0_3, _MM_SHUFFLE(0, 3, 2, 1)); r1_1 = _mm_shuffle_epi32(r1_1, _MM_SHUFFLE(2, 1, 0, 3)); r1_2 = _mm_shuffle_epi32(r1_2, _MM_SHUFFLE(1, 0, 3, 2)); r1_3 = _mm_shuffle_epi32(r1_3, _MM_SHUFFLE(0, 3, 2, 1)); r2_1 = _mm_shuffle_epi32(r2_1, _MM_SHUFFLE(2, 1, 0, 3)); r2_2 = _mm_shuffle_epi32(r2_2, _MM_SHUFFLE(1, 0, 3, 2)); r2_3 = _mm_shuffle_epi32(r2_3, _MM_SHUFFLE(0, 3, 2, 1)); r3_1 = _mm_shuffle_epi32(r3_1, _MM_SHUFFLE(2, 1, 0, 3)); r3_2 = _mm_shuffle_epi32(r3_2, _MM_SHUFFLE(1, 0, 3, 2)); r3_3 = _mm_shuffle_epi32(r3_3, _MM_SHUFFLE(0, 3, 2, 1)); } r0_0 = _mm_add_epi32(r0_0, input0); r0_1 = _mm_add_epi32(r0_1, input1); r0_2 = _mm_add_epi32(r0_2, input2); r0_3 = _mm_add_epi32(r0_3, input3); r1_0 = _mm_add_epi32(r1_0, input0); r1_1 = _mm_add_epi32(r1_1, input1); r1_2 = _mm_add_epi32(r1_2, input2); r1_3 = _mm_add_epi32(r1_3, input3); r1_3 = _mm_add_epi64(r1_3, _mm_set_epi32(0, 0, 0, 1)); r2_0 = _mm_add_epi32(r2_0, input0); r2_1 = _mm_add_epi32(r2_1, input1); r2_2 = _mm_add_epi32(r2_2, input2); r2_3 = _mm_add_epi32(r2_3, input3); r2_3 = _mm_add_epi64(r2_3, _mm_set_epi32(0, 0, 0, 2)); r3_0 = _mm_add_epi32(r3_0, input0); r3_1 = _mm_add_epi32(r3_1, input1); r3_2 = _mm_add_epi32(r3_2, input2); r3_3 = _mm_add_epi32(r3_3, input3); r3_3 = _mm_add_epi64(r3_3, _mm_set_epi32(0, 0, 0, 3)); _mm_storeu_si128(output_mm + 0, r0_0); _mm_storeu_si128(output_mm + 1, r0_1); _mm_storeu_si128(output_mm + 2, r0_2); _mm_storeu_si128(output_mm + 3, r0_3); _mm_storeu_si128(output_mm + 4, r1_0); _mm_storeu_si128(output_mm + 5, r1_1); _mm_storeu_si128(output_mm + 6, r1_2); _mm_storeu_si128(output_mm + 7, r1_3); _mm_storeu_si128(output_mm + 8, r2_0); _mm_storeu_si128(output_mm + 9, r2_1); _mm_storeu_si128(output_mm + 10, r2_2); _mm_storeu_si128(output_mm + 11, r2_3); _mm_storeu_si128(output_mm + 12, r3_0); _mm_storeu_si128(output_mm + 13, r3_1); _mm_storeu_si128(output_mm + 14, r3_2); _mm_storeu_si128(output_mm + 15, r3_3); #undef mm_rotl input[12] += 4; if(input[12] < 4) input[13]++; } } botan-2.4.0/src/lib/stream/chacha/chacha_sse2/info.txt000066400000000000000000000000741322470703100225160ustar00rootroot00000000000000 CHACHA_SSE2 -> 20160831 need_isa sse2 botan-2.4.0/src/lib/stream/chacha/info.txt000066400000000000000000000000501322470703100203450ustar00rootroot00000000000000 CHACHA -> 20140103 botan-2.4.0/src/lib/stream/ctr/000077500000000000000000000000001322470703100162375ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/ctr/ctr.cpp000066400000000000000000000121101322470703100175260ustar00rootroot00000000000000/* * Counter mode * (C) 1999-2011,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { CTR_BE::CTR_BE(BlockCipher* ciph) : m_cipher(ciph), m_block_size(m_cipher->block_size()), m_ctr_size(m_block_size), m_ctr_blocks(m_cipher->parallel_bytes() / m_block_size), m_counter(m_cipher->parallel_bytes()), m_pad(m_counter.size()), m_pad_pos(0) { } CTR_BE::CTR_BE(BlockCipher* cipher, size_t ctr_size) : m_cipher(cipher), m_block_size(m_cipher->block_size()), m_ctr_size(ctr_size), m_ctr_blocks(m_cipher->parallel_bytes() / m_block_size), m_counter(m_cipher->parallel_bytes()), m_pad(m_counter.size()), m_pad_pos(0) { if(m_ctr_size < 4 || m_ctr_size > m_block_size) throw Invalid_Argument("Invalid CTR-BE counter size"); } void CTR_BE::clear() { m_cipher->clear(); zeroise(m_pad); zeroise(m_counter); zap(m_iv); m_pad_pos = 0; } void CTR_BE::key_schedule(const uint8_t key[], size_t key_len) { m_cipher->set_key(key, key_len); // Set a default all-zeros IV set_iv(nullptr, 0); } std::string CTR_BE::name() const { if(m_ctr_size == m_block_size) return ("CTR-BE(" + m_cipher->name() + ")"); else return ("CTR-BE(" + m_cipher->name() + "," + std::to_string(m_ctr_size) + ")"); } void CTR_BE::cipher(const uint8_t in[], uint8_t out[], size_t length) { verify_key_set(m_iv.empty() == false); const uint8_t* pad_bits = &m_pad[0]; const size_t pad_size = m_pad.size(); if(m_pad_pos > 0) { const size_t avail = pad_size - m_pad_pos; const size_t take = std::min(length, avail); xor_buf(out, in, pad_bits + m_pad_pos, take); length -= take; in += take; out += take; m_pad_pos += take; if(take == avail) { add_counter(m_ctr_blocks); m_cipher->encrypt_n(m_counter.data(), m_pad.data(), m_ctr_blocks); m_pad_pos = 0; } } while(length >= pad_size) { xor_buf(out, in, pad_bits, pad_size); length -= pad_size; in += pad_size; out += pad_size; add_counter(m_ctr_blocks); m_cipher->encrypt_n(m_counter.data(), m_pad.data(), m_ctr_blocks); } xor_buf(out, in, pad_bits, length); m_pad_pos += length; } void CTR_BE::set_iv(const uint8_t iv[], size_t iv_len) { if(!valid_iv_length(iv_len)) throw Invalid_IV_Length(name(), iv_len); m_iv.resize(m_cipher->block_size()); zeroise(m_iv); buffer_insert(m_iv, 0, iv, iv_len); seek(0); } void CTR_BE::add_counter(const uint64_t counter) { const size_t ctr_size = m_ctr_size; const size_t ctr_blocks = m_ctr_blocks; const size_t BS = m_block_size; if(ctr_size == 4) { size_t off = (BS - 4); for(size_t i = 0; i != ctr_blocks; ++i) { uint32_t low32 = load_be(&m_counter[off], 0); low32 += counter; store_be(low32, &m_counter[off]); off += BS; } } else if(ctr_size == 8) { size_t off = (BS - 8); for(size_t i = 0; i != ctr_blocks; ++i) { uint64_t low64 = load_be(&m_counter[off], 0); low64 += counter; store_be(low64, &m_counter[off]); off += BS; } } else if(ctr_size == 16) { size_t off = (BS - 16); for(size_t i = 0; i != ctr_blocks; ++i) { uint64_t b0 = load_be(&m_counter[off], 0); uint64_t b1 = load_be(&m_counter[off], 1); b1 += counter; b0 += (b1 < counter) ? 1 : 0; // carry store_be(b0, &m_counter[off]); store_be(b1, &m_counter[off+8]); off += BS; } } else { for(size_t i = 0; i != ctr_blocks; ++i) { uint64_t local_counter = counter; uint16_t carry = static_cast(local_counter); for(size_t j = 0; (carry || local_counter) && j != ctr_size; ++j) { const size_t off = i*BS + (BS-1-j); const uint16_t cnt = static_cast(m_counter[off]) + carry; m_counter[off] = static_cast(cnt); local_counter = (local_counter >> 8); carry = (cnt >> 8) + static_cast(local_counter); } } } } void CTR_BE::seek(uint64_t offset) { verify_key_set(m_iv.empty() == false); const uint64_t base_counter = m_ctr_blocks * (offset / m_counter.size()); zeroise(m_counter); buffer_insert(m_counter, 0, m_iv); const size_t BS = m_block_size; // Set m_counter blocks to IV, IV + 1, ... IV + n for(size_t i = 1; i != m_ctr_blocks; ++i) { buffer_insert(m_counter, i*BS, &m_counter[(i-1)*BS], BS); for(size_t j = 0; j != m_ctr_size; ++j) if(++m_counter[i*BS + (BS - 1 - j)]) break; } if(base_counter > 0) add_counter(base_counter); m_cipher->encrypt_n(m_counter.data(), m_pad.data(), m_ctr_blocks); m_pad_pos = offset % m_counter.size(); } } botan-2.4.0/src/lib/stream/ctr/ctr.h000066400000000000000000000027701322470703100172060ustar00rootroot00000000000000/* * CTR-BE Mode * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CTR_BE_H_ #define BOTAN_CTR_BE_H_ #include #include namespace Botan { /** * CTR-BE (Counter mode, big-endian) */ class BOTAN_PUBLIC_API(2,0) CTR_BE final : public StreamCipher { public: void cipher(const uint8_t in[], uint8_t out[], size_t length) override; void set_iv(const uint8_t iv[], size_t iv_len) override; bool valid_iv_length(size_t iv_len) const override { return (iv_len <= m_cipher->block_size()); } Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } std::string name() const override; CTR_BE* clone() const override { return new CTR_BE(m_cipher->clone(), m_ctr_size); } void clear() override; /** * @param cipher the block cipher to use */ explicit CTR_BE(BlockCipher* cipher); CTR_BE(BlockCipher* cipher, size_t ctr_size); void seek(uint64_t offset) override; private: void key_schedule(const uint8_t key[], size_t key_len) override; void add_counter(const uint64_t counter); std::unique_ptr m_cipher; const size_t m_block_size; const size_t m_ctr_size; const size_t m_ctr_blocks; secure_vector m_counter, m_pad; std::vector m_iv; size_t m_pad_pos; }; } #endif botan-2.4.0/src/lib/stream/ctr/info.txt000066400000000000000000000000501322470703100177260ustar00rootroot00000000000000 CTR_BE -> 20131128 botan-2.4.0/src/lib/stream/info.txt000066400000000000000000000001411322470703100171370ustar00rootroot00000000000000 STREAM_CIPHER -> 20131128 stream_cipher.h botan-2.4.0/src/lib/stream/ofb/000077500000000000000000000000001322470703100162155ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/ofb/info.txt000066400000000000000000000000451322470703100177100ustar00rootroot00000000000000 OFB -> 20131128 botan-2.4.0/src/lib/stream/ofb/ofb.cpp000066400000000000000000000026631322470703100174760ustar00rootroot00000000000000/* * OFB Mode * (C) 1999-2007,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { OFB::OFB(BlockCipher* cipher) : m_cipher(cipher), m_buffer(m_cipher->block_size()), m_buf_pos(0) { } void OFB::clear() { m_cipher->clear(); zeroise(m_buffer); m_buf_pos = 0; } void OFB::key_schedule(const uint8_t key[], size_t key_len) { m_cipher->set_key(key, key_len); // Set a default all-zeros IV set_iv(nullptr, 0); } std::string OFB::name() const { return "OFB(" + m_cipher->name() + ")"; } void OFB::cipher(const uint8_t in[], uint8_t out[], size_t length) { while(length >= m_buffer.size() - m_buf_pos) { xor_buf(out, in, &m_buffer[m_buf_pos], m_buffer.size() - m_buf_pos); length -= (m_buffer.size() - m_buf_pos); in += (m_buffer.size() - m_buf_pos); out += (m_buffer.size() - m_buf_pos); m_cipher->encrypt(m_buffer); m_buf_pos = 0; } xor_buf(out, in, &m_buffer[m_buf_pos], length); m_buf_pos += length; } void OFB::set_iv(const uint8_t iv[], size_t iv_len) { if(!valid_iv_length(iv_len)) throw Invalid_IV_Length(name(), iv_len); zeroise(m_buffer); buffer_insert(m_buffer, 0, iv, iv_len); m_cipher->encrypt(m_buffer); m_buf_pos = 0; } void OFB::seek(uint64_t) { throw Not_Implemented("OFB does not support seeking"); } } botan-2.4.0/src/lib/stream/ofb/ofb.h000066400000000000000000000023731322470703100171410ustar00rootroot00000000000000/* * OFB Mode * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OUTPUT_FEEDBACK_MODE_H_ #define BOTAN_OUTPUT_FEEDBACK_MODE_H_ #include #include namespace Botan { /** * Output Feedback Mode */ class BOTAN_PUBLIC_API(2,0) OFB final : public StreamCipher { public: void cipher(const uint8_t in[], uint8_t out[], size_t length) override; void set_iv(const uint8_t iv[], size_t iv_len) override; bool valid_iv_length(size_t iv_len) const override { return (iv_len <= m_cipher->block_size()); } Key_Length_Specification key_spec() const override { return m_cipher->key_spec(); } std::string name() const override; OFB* clone() const override { return new OFB(m_cipher->clone()); } void clear() override; /** * @param cipher the block cipher to use */ explicit OFB(BlockCipher* cipher); void seek(uint64_t offset) override; private: void key_schedule(const uint8_t key[], size_t key_len) override; std::unique_ptr m_cipher; secure_vector m_buffer; size_t m_buf_pos; }; } #endif botan-2.4.0/src/lib/stream/rc4/000077500000000000000000000000001322470703100161375ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/rc4/info.txt000066400000000000000000000000451322470703100176320ustar00rootroot00000000000000 RC4 -> 20131128 botan-2.4.0/src/lib/stream/rc4/rc4.cpp000066400000000000000000000053451322470703100173420ustar00rootroot00000000000000/* * RC4 * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* * Combine cipher stream with message */ void RC4::cipher(const uint8_t in[], uint8_t out[], size_t length) { verify_key_set(m_state.empty() == false); while(length >= m_buffer.size() - m_position) { xor_buf(out, in, &m_buffer[m_position], m_buffer.size() - m_position); length -= (m_buffer.size() - m_position); in += (m_buffer.size() - m_position); out += (m_buffer.size() - m_position); generate(); } xor_buf(out, in, &m_buffer[m_position], length); m_position += length; } void RC4::set_iv(const uint8_t*, size_t length) { if(length > 0) throw Exception("RC4 does not support an IV"); } /* * Generate cipher stream */ void RC4::generate() { uint8_t SX, SY; for(size_t i = 0; i != m_buffer.size(); i += 4) { SX = m_state[m_X+1]; m_Y = (m_Y + SX) % 256; SY = m_state[m_Y]; m_state[m_X+1] = SY; m_state[m_Y] = SX; m_buffer[i] = m_state[(SX + SY) % 256]; SX = m_state[m_X+2]; m_Y = (m_Y + SX) % 256; SY = m_state[m_Y]; m_state[m_X+2] = SY; m_state[m_Y] = SX; m_buffer[i+1] = m_state[(SX + SY) % 256]; SX = m_state[m_X+3]; m_Y = (m_Y + SX) % 256; SY = m_state[m_Y]; m_state[m_X+3] = SY; m_state[m_Y] = SX; m_buffer[i+2] = m_state[(SX + SY) % 256]; m_X = (m_X + 4) % 256; SX = m_state[m_X]; m_Y = (m_Y + SX) % 256; SY = m_state[m_Y]; m_state[m_X] = SY; m_state[m_Y] = SX; m_buffer[i+3] = m_state[(SX + SY) % 256]; } m_position = 0; } /* * RC4 Key Schedule */ void RC4::key_schedule(const uint8_t key[], size_t length) { m_state.resize(256); m_buffer.resize(256); m_position = m_X = m_Y = 0; for(size_t i = 0; i != 256; ++i) m_state[i] = static_cast(i); for(size_t i = 0, state_index = 0; i != 256; ++i) { state_index = (state_index + key[i % length] + m_state[i]) % 256; std::swap(m_state[i], m_state[state_index]); } for(size_t i = 0; i <= m_SKIP; i += m_buffer.size()) generate(); m_position += (m_SKIP % m_buffer.size()); } /* * Return the name of this type */ std::string RC4::name() const { if(m_SKIP == 0) return "RC4"; else if(m_SKIP == 256) return "MARK-4"; else return "RC4(" + std::to_string(m_SKIP) + ")"; } /* * Clear memory of sensitive data */ void RC4::clear() { zap(m_state); zap(m_buffer); m_position = m_X = m_Y = 0; } /* * RC4 Constructor */ RC4::RC4(size_t s) : m_SKIP(s) {} void RC4::seek(uint64_t) { throw Not_Implemented("RC4 does not support seeking"); } } botan-2.4.0/src/lib/stream/rc4/rc4.h000066400000000000000000000023251322470703100170020ustar00rootroot00000000000000/* * RC4 * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_RC4_H_ #define BOTAN_RC4_H_ #include #include namespace Botan { /** * RC4 stream cipher */ class BOTAN_PUBLIC_API(2,0) RC4 final : public StreamCipher { public: void cipher(const uint8_t in[], uint8_t out[], size_t length) override; void set_iv(const uint8_t iv[], size_t iv_len) override; void clear() override; std::string name() const override; StreamCipher* clone() const override { return new RC4(m_SKIP); } Key_Length_Specification key_spec() const override { return Key_Length_Specification(1, 256); } /** * @param skip skip this many initial bytes in the keystream */ explicit RC4(size_t skip = 0); ~RC4() { clear(); } void seek(uint64_t offset) override; private: void key_schedule(const uint8_t[], size_t) override; void generate(); const size_t m_SKIP; uint8_t m_X = 0; uint8_t m_Y = 0; secure_vector m_state; secure_vector m_buffer; size_t m_position = 0; }; } #endif botan-2.4.0/src/lib/stream/salsa20/000077500000000000000000000000001322470703100167145ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/salsa20/info.txt000066400000000000000000000000511322470703100204040ustar00rootroot00000000000000 SALSA20 -> 20171114 botan-2.4.0/src/lib/stream/salsa20/salsa20.cpp000066400000000000000000000152211322470703100206660ustar00rootroot00000000000000/* * Salsa20 / XSalsa20 * (C) 1999-2010,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace { #define SALSA20_QUARTER_ROUND(x1, x2, x3, x4) \ do { \ x2 ^= rotl<7>(x1 + x4); \ x3 ^= rotl<9>(x2 + x1); \ x4 ^= rotl<13>(x3 + x2); \ x1 ^= rotl<18>(x4 + x3); \ } while(0) /* * Generate HSalsa20 cipher stream (for XSalsa20 IV setup) */ void hsalsa20(uint32_t output[8], const uint32_t input[16]) { uint32_t x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3], x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7], x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11], x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15]; for(size_t i = 0; i != 10; ++i) { SALSA20_QUARTER_ROUND(x00, x04, x08, x12); SALSA20_QUARTER_ROUND(x05, x09, x13, x01); SALSA20_QUARTER_ROUND(x10, x14, x02, x06); SALSA20_QUARTER_ROUND(x15, x03, x07, x11); SALSA20_QUARTER_ROUND(x00, x01, x02, x03); SALSA20_QUARTER_ROUND(x05, x06, x07, x04); SALSA20_QUARTER_ROUND(x10, x11, x08, x09); SALSA20_QUARTER_ROUND(x15, x12, x13, x14); } output[0] = x00; output[1] = x05; output[2] = x10; output[3] = x15; output[4] = x06; output[5] = x07; output[6] = x08; output[7] = x09; } /* * Generate Salsa20 cipher stream */ void salsa20(uint8_t output[64], const uint32_t input[16]) { uint32_t x00 = input[ 0], x01 = input[ 1], x02 = input[ 2], x03 = input[ 3], x04 = input[ 4], x05 = input[ 5], x06 = input[ 6], x07 = input[ 7], x08 = input[ 8], x09 = input[ 9], x10 = input[10], x11 = input[11], x12 = input[12], x13 = input[13], x14 = input[14], x15 = input[15]; for(size_t i = 0; i != 10; ++i) { SALSA20_QUARTER_ROUND(x00, x04, x08, x12); SALSA20_QUARTER_ROUND(x05, x09, x13, x01); SALSA20_QUARTER_ROUND(x10, x14, x02, x06); SALSA20_QUARTER_ROUND(x15, x03, x07, x11); SALSA20_QUARTER_ROUND(x00, x01, x02, x03); SALSA20_QUARTER_ROUND(x05, x06, x07, x04); SALSA20_QUARTER_ROUND(x10, x11, x08, x09); SALSA20_QUARTER_ROUND(x15, x12, x13, x14); } store_le(x00 + input[ 0], output + 4 * 0); store_le(x01 + input[ 1], output + 4 * 1); store_le(x02 + input[ 2], output + 4 * 2); store_le(x03 + input[ 3], output + 4 * 3); store_le(x04 + input[ 4], output + 4 * 4); store_le(x05 + input[ 5], output + 4 * 5); store_le(x06 + input[ 6], output + 4 * 6); store_le(x07 + input[ 7], output + 4 * 7); store_le(x08 + input[ 8], output + 4 * 8); store_le(x09 + input[ 9], output + 4 * 9); store_le(x10 + input[10], output + 4 * 10); store_le(x11 + input[11], output + 4 * 11); store_le(x12 + input[12], output + 4 * 12); store_le(x13 + input[13], output + 4 * 13); store_le(x14 + input[14], output + 4 * 14); store_le(x15 + input[15], output + 4 * 15); } } #undef SALSA20_QUARTER_ROUND /* * Combine cipher stream with message */ void Salsa20::cipher(const uint8_t in[], uint8_t out[], size_t length) { verify_key_set(m_state.empty() == false); while(length >= m_buffer.size() - m_position) { xor_buf(out, in, &m_buffer[m_position], m_buffer.size() - m_position); length -= (m_buffer.size() - m_position); in += (m_buffer.size() - m_position); out += (m_buffer.size() - m_position); salsa20(m_buffer.data(), m_state.data()); ++m_state[8]; m_state[9] += (m_state[8] == 0); m_position = 0; } xor_buf(out, in, &m_buffer[m_position], length); m_position += length; } /* * Salsa20 Key Schedule */ void Salsa20::key_schedule(const uint8_t key[], size_t length) { static const uint32_t TAU[] = { 0x61707865, 0x3120646e, 0x79622d36, 0x6b206574 }; static const uint32_t SIGMA[] = { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 }; const uint32_t* CONSTANTS = (length == 16) ? TAU : SIGMA; m_state.resize(16); m_buffer.resize(64); m_state[0] = CONSTANTS[0]; m_state[5] = CONSTANTS[1]; m_state[10] = CONSTANTS[2]; m_state[15] = CONSTANTS[3]; m_state[1] = load_le(key, 0); m_state[2] = load_le(key, 1); m_state[3] = load_le(key, 2); m_state[4] = load_le(key, 3); if(length == 32) key += 16; m_state[11] = load_le(key, 0); m_state[12] = load_le(key, 1); m_state[13] = load_le(key, 2); m_state[14] = load_le(key, 3); m_position = 0; set_iv(nullptr, 0); // all-zero IV } /* * Set the Salsa IV */ void Salsa20::set_iv(const uint8_t iv[], size_t length) { if(!valid_iv_length(length)) throw Invalid_IV_Length(name(), length); if(length == 0) { // Salsa20 null IV m_state[6] = 0; m_state[7] = 0; } else if(length == 8) { // Salsa20 m_state[6] = load_le(iv, 0); m_state[7] = load_le(iv, 1); } else { // XSalsa20 m_state[6] = load_le(iv, 0); m_state[7] = load_le(iv, 1); m_state[8] = load_le(iv, 2); m_state[9] = load_le(iv, 3); secure_vector hsalsa(8); hsalsa20(hsalsa.data(), m_state.data()); m_state[ 1] = hsalsa[0]; m_state[ 2] = hsalsa[1]; m_state[ 3] = hsalsa[2]; m_state[ 4] = hsalsa[3]; m_state[ 6] = load_le(iv, 4); m_state[ 7] = load_le(iv, 5); m_state[11] = hsalsa[4]; m_state[12] = hsalsa[5]; m_state[13] = hsalsa[6]; m_state[14] = hsalsa[7]; } m_state[8] = 0; m_state[9] = 0; salsa20(m_buffer.data(), m_state.data()); ++m_state[8]; m_state[9] += (m_state[8] == 0); m_position = 0; } /* * Return the name of this type */ std::string Salsa20::name() const { return "Salsa20"; } /* * Clear memory of sensitive data */ void Salsa20::clear() { zap(m_state); zap(m_buffer); m_position = 0; } void Salsa20::seek(uint64_t offset) { verify_key_set(m_state.empty() == false); // Find the block offset const uint64_t counter = offset / 64; uint8_t counter8[8]; store_le(counter, counter8); m_state[8] = load_le(counter8, 0); m_state[9] += load_le(counter8, 1); salsa20(m_buffer.data(), m_state.data()); ++m_state[8]; m_state[9] += (m_state[8] == 0); m_position = offset % 64; } } botan-2.4.0/src/lib/stream/salsa20/salsa20.h000066400000000000000000000021641322470703100203350ustar00rootroot00000000000000/* * Salsa20 / XSalsa20 * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SALSA20_H_ #define BOTAN_SALSA20_H_ #include namespace Botan { /** * DJB's Salsa20 (and XSalsa20) */ class BOTAN_PUBLIC_API(2,0) Salsa20 final : public StreamCipher { public: void cipher(const uint8_t in[], uint8_t out[], size_t length) override; void set_iv(const uint8_t iv[], size_t iv_len) override; bool valid_iv_length(size_t iv_len) const override { return (iv_len == 0 || iv_len == 8 || iv_len == 24); } Key_Length_Specification key_spec() const override { return Key_Length_Specification(16, 32, 16); } void clear() override; std::string name() const override; StreamCipher* clone() const override { return new Salsa20; } void seek(uint64_t offset) override; private: void key_schedule(const uint8_t key[], size_t key_len) override; secure_vector m_state; secure_vector m_buffer; size_t m_position = 0; }; } #endif botan-2.4.0/src/lib/stream/shake_cipher/000077500000000000000000000000001322470703100200745ustar00rootroot00000000000000botan-2.4.0/src/lib/stream/shake_cipher/info.txt000066400000000000000000000001131322470703100215630ustar00rootroot00000000000000 SHAKE_CIPHER -> 20161018 sha3 botan-2.4.0/src/lib/stream/shake_cipher/shake_cipher.cpp000066400000000000000000000034151322470703100232300ustar00rootroot00000000000000/* * SHAKE-128 * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { SHAKE_128_Cipher::SHAKE_128_Cipher() : m_buf_pos(0) {} void SHAKE_128_Cipher::cipher(const uint8_t in[], uint8_t out[], size_t length) { verify_key_set(m_state.empty() == false); while(length >= m_buffer.size() - m_buf_pos) { xor_buf(out, in, &m_buffer[m_buf_pos], m_buffer.size() - m_buf_pos); length -= (m_buffer.size() - m_buf_pos); in += (m_buffer.size() - m_buf_pos); out += (m_buffer.size() - m_buf_pos); SHA_3::permute(m_state.data()); copy_out_le(m_buffer.data(), m_buffer.size(), m_state.data()); m_buf_pos = 0; } xor_buf(out, in, &m_buffer[m_buf_pos], length); m_buf_pos += length; } void SHAKE_128_Cipher::key_schedule(const uint8_t key[], size_t length) { m_state.resize(25); m_buffer.resize((1600 - 256) / 8); zeroise(m_state); for(size_t i = 0; i < length/8; ++i) { m_state[i] ^= load_le(key, i); } m_state[length/8] ^= 0x000000000000001F; m_state[20] ^= 0x8000000000000000; SHA_3::permute(m_state.data()); copy_out_le(m_buffer.data(), m_buffer.size(), m_state.data()); } void SHAKE_128_Cipher::clear() { zap(m_state); zap(m_buffer); m_buf_pos = 0; } void SHAKE_128_Cipher::set_iv(const uint8_t[], size_t length) { /* * This could be supported in some way (say, by treating iv as * a prefix or suffix of the key). */ if(length != 0) throw Invalid_IV_Length(name(), length); } void SHAKE_128_Cipher::seek(uint64_t) { throw Not_Implemented("SHAKE_128_Cipher::seek"); } } botan-2.4.0/src/lib/stream/shake_cipher/shake_cipher.h000066400000000000000000000031611322470703100226730ustar00rootroot00000000000000/* * SHAKE-128 as a stream cipher * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SHAKE128_CIPHER_H_ #define BOTAN_SHAKE128_CIPHER_H_ #include #include namespace Botan { /** * SHAKE-128 XOF presented as a stream cipher */ class BOTAN_PUBLIC_API(2,0) SHAKE_128_Cipher final : public StreamCipher { public: SHAKE_128_Cipher(); /** * Produce more XOF output */ void cipher(const uint8_t in[], uint8_t out[], size_t length) override; /** * Seeking is not supported, this function will throw */ void seek(uint64_t offset) override; /** * IV not supported, this function will throw unless iv_len == 0 */ void set_iv(const uint8_t iv[], size_t iv_len) override; bool valid_iv_length(size_t iv_len) const override { return (iv_len == 0); } /** * In principle SHAKE can accept arbitrary length inputs, but this * does not seem required for a stream cipher. */ Key_Length_Specification key_spec() const override { return Key_Length_Specification(16, 160, 8); } void clear() override; std::string name() const override { return "SHAKE-128"; } StreamCipher* clone() const override { return new SHAKE_128_Cipher; } private: void key_schedule(const uint8_t key[], size_t key_len) override; secure_vector m_state; // internal state secure_vector m_buffer; // ciphertext buffer size_t m_buf_pos; // position in m_buffer }; } #endif botan-2.4.0/src/lib/stream/stream_cipher.cpp000066400000000000000000000070111322470703100207770ustar00rootroot00000000000000/* * Stream Ciphers * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_CHACHA) #include #endif #if defined(BOTAN_HAS_SALSA20) #include #endif #if defined(BOTAN_HAS_SHAKE_CIPHER) #include #endif #if defined(BOTAN_HAS_CTR_BE) #include #endif #if defined(BOTAN_HAS_OFB) #include #endif #if defined(BOTAN_HAS_RC4) #include #endif #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace Botan { std::unique_ptr StreamCipher::create(const std::string& algo_spec, const std::string& provider) { const SCAN_Name req(algo_spec); #if defined(BOTAN_HAS_CTR_BE) if((req.algo_name() == "CTR-BE" || req.algo_name() == "CTR") && req.arg_count_between(1,2)) { if(provider.empty() || provider == "base") { auto cipher = BlockCipher::create(req.arg(0)); if(cipher) { size_t ctr_size = req.arg_as_integer(1, cipher->block_size()); return std::unique_ptr(new CTR_BE(cipher.release(), ctr_size)); } } } #endif #if defined(BOTAN_HAS_CHACHA) if(req.algo_name() == "ChaCha") { if(provider.empty() || provider == "base") return std::unique_ptr(new ChaCha(req.arg_as_integer(0, 20))); } if(req.algo_name() == "ChaCha20") { if(provider.empty() || provider == "base") return std::unique_ptr(new ChaCha(20)); } #endif #if defined(BOTAN_HAS_SALSA20) if(req.algo_name() == "Salsa20") { if(provider.empty() || provider == "base") return std::unique_ptr(new Salsa20); } #endif #if defined(BOTAN_HAS_SHAKE_CIPHER) if(req.algo_name() == "SHAKE-128") { if(provider.empty() || provider == "base") return std::unique_ptr(new SHAKE_128_Cipher); } #endif #if defined(BOTAN_HAS_OFB) if(req.algo_name() == "OFB" && req.arg_count() == 1) { if(provider.empty() || provider == "base") { if(auto c = BlockCipher::create(req.arg(0))) return std::unique_ptr(new OFB(c.release())); } } #endif #if defined(BOTAN_HAS_RC4) if(req.algo_name() == "RC4" || req.algo_name() == "ARC4" || req.algo_name() == "MARK-4") { const size_t skip = (req.algo_name() == "MARK-4") ? 256 : req.arg_as_integer(0, 0); #if defined(BOTAN_HAS_OPENSSL) if(provider.empty() || provider == "openssl") { return std::unique_ptr(make_openssl_rc4(skip)); } #endif if(provider.empty() || provider == "base") { return std::unique_ptr(new RC4(skip)); } } #endif BOTAN_UNUSED(req); BOTAN_UNUSED(provider); return nullptr; } //static std::unique_ptr StreamCipher::create_or_throw(const std::string& algo, const std::string& provider) { if(auto sc = StreamCipher::create(algo, provider)) { return sc; } throw Lookup_Error("Stream cipher", algo, provider); } std::vector StreamCipher::providers(const std::string& algo_spec) { return probe_providers_of(algo_spec, {"base", "openssl"}); } } botan-2.4.0/src/lib/stream/stream_cipher.h000066400000000000000000000077071322470703100204600ustar00rootroot00000000000000/* * Stream Cipher * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STREAM_CIPHER_H_ #define BOTAN_STREAM_CIPHER_H_ #include #include #include namespace Botan { /** * Base class for all stream ciphers */ class BOTAN_PUBLIC_API(2,0) StreamCipher : public SymmetricAlgorithm { public: virtual ~StreamCipher() = default; /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to use * @return a null pointer if the algo/provider combination cannot be found */ static std::unique_ptr create(const std::string& algo_spec, const std::string& provider = ""); /** * Create an instance based on a name * If provider is empty then best available is chosen. * @param algo_spec algorithm name * @param provider provider implementation to use * Throws a Lookup_Error if the algo/provider combination cannot be found */ static std::unique_ptr create_or_throw(const std::string& algo_spec, const std::string& provider = ""); /** * @return list of available providers for this algorithm, empty if not available */ static std::vector providers(const std::string& algo_spec); /** * Encrypt or decrypt a message * @param in the plaintext * @param out the byte array to hold the output, i.e. the ciphertext * @param len the length of both in and out in bytes */ virtual void cipher(const uint8_t in[], uint8_t out[], size_t len) = 0; /** * Encrypt or decrypt a message * The message is encrypted/decrypted in place. * @param buf the plaintext / ciphertext * @param len the length of buf in bytes */ void cipher1(uint8_t buf[], size_t len) { cipher(buf, buf, len); } /** * Encrypt a message * The message is encrypted/decrypted in place. * @param inout the plaintext / ciphertext */ template void encipher(std::vector& inout) { cipher(inout.data(), inout.data(), inout.size()); } /** * Encrypt a message * The message is encrypted in place. * @param inout the plaintext / ciphertext */ template void encrypt(std::vector& inout) { cipher(inout.data(), inout.data(), inout.size()); } /** * Decrypt a message in place * The message is decrypted in place. * @param inout the plaintext / ciphertext */ template void decrypt(std::vector& inout) { cipher(inout.data(), inout.data(), inout.size()); } /** * Resync the cipher using the IV * @param iv the initialization vector * @param iv_len the length of the IV in bytes */ virtual void set_iv(const uint8_t iv[], size_t iv_len) = 0; /** * @param iv_len the length of the IV in bytes * @return if the length is valid for this algorithm */ virtual bool valid_iv_length(size_t iv_len) const { return (iv_len == 0); } /** * @return a new object representing the same algorithm as *this */ virtual StreamCipher* clone() const = 0; /** * Set the offset and the state used later to generate the keystream * @param offset the offset where we begin to generate the keystream */ virtual void seek(uint64_t offset) = 0; /** * @return provider information about this implementation. Default is "base", * might also return "sse2", "avx2", "openssl", or some other arbitrary string. */ virtual std::string provider() const { return "base"; } }; } #endif botan-2.4.0/src/lib/tls/000077500000000000000000000000001322470703100147565ustar00rootroot00000000000000botan-2.4.0/src/lib/tls/credentials_manager.cpp000066400000000000000000000052421322470703100214540ustar00rootroot00000000000000/* * Credentials Manager * (C) 2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { std::string Credentials_Manager::psk_identity_hint(const std::string&, const std::string&) { return ""; } std::string Credentials_Manager::psk_identity(const std::string&, const std::string&, const std::string&) { return ""; } SymmetricKey Credentials_Manager::psk(const std::string&, const std::string&, const std::string& identity) { throw Internal_Error("No PSK set for identity " + identity); } bool Credentials_Manager::attempt_srp(const std::string&, const std::string&) { return false; } std::string Credentials_Manager::srp_identifier(const std::string&, const std::string&) { return ""; } std::string Credentials_Manager::srp_password(const std::string&, const std::string&, const std::string&) { return ""; } bool Credentials_Manager::srp_verifier(const std::string&, const std::string&, const std::string&, std::string&, BigInt&, std::vector&, bool) { return false; } std::vector Credentials_Manager::cert_chain( const std::vector&, const std::string&, const std::string&) { return std::vector(); } std::vector Credentials_Manager::cert_chain_single_type( const std::string& cert_key_type, const std::string& type, const std::string& context) { std::vector cert_types; cert_types.push_back(cert_key_type); return cert_chain(cert_types, type, context); } Private_Key* Credentials_Manager::private_key_for(const X509_Certificate&, const std::string&, const std::string&) { return nullptr; } std::vector Credentials_Manager::trusted_certificate_authorities( const std::string&, const std::string&) { return std::vector(); } } botan-2.4.0/src/lib/tls/credentials_manager.h000066400000000000000000000144641322470703100211270ustar00rootroot00000000000000/* * Credentials Manager * (C) 2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CREDENTIALS_MANAGER_H_ #define BOTAN_CREDENTIALS_MANAGER_H_ #include #include #include #include #include namespace Botan { class BigInt; /** * Interface for a credentials manager. * * A type is a fairly static value that represents the general nature * of the transaction occurring. Currently used values are "tls-client" * and "tls-server". Context represents a hostname, email address, * username, or other identifier. */ class BOTAN_PUBLIC_API(2,0) Credentials_Manager { public: virtual ~Credentials_Manager() = default; /** * Return a list of the certificates of CAs that we trust in this * type/context. * * @param type specifies the type of operation occurring * * @param context specifies a context relative to type. For instance * for type "tls-client", context specifies the servers name. */ virtual std::vector trusted_certificate_authorities( const std::string& type, const std::string& context); /** * Return a cert chain we can use, ordered from leaf to root, * or else an empty vector. * * It is assumed that the caller can get the private key of the * leaf with private_key_for * * @param cert_key_types specifies the key types desired ("RSA", * "DSA", "ECDSA", etc), or empty if there * is no preference by the caller. * * @param type specifies the type of operation occurring * * @param context specifies a context relative to type. */ virtual std::vector cert_chain( const std::vector& cert_key_types, const std::string& type, const std::string& context); /** * Return a cert chain we can use, ordered from leaf to root, * or else an empty vector. * * It is assumed that the caller can get the private key of the * leaf with private_key_for * * @param cert_key_type specifies the type of key requested * ("RSA", "DSA", "ECDSA", etc) * * @param type specifies the type of operation occurring * * @param context specifies a context relative to type. */ std::vector cert_chain_single_type( const std::string& cert_key_type, const std::string& type, const std::string& context); /** * @return private key associated with this certificate if we should * use it with this context. cert was returned by cert_chain * @note this object should retain ownership of the returned key; * it should not be deleted by the caller. */ virtual Private_Key* private_key_for(const X509_Certificate& cert, const std::string& type, const std::string& context); /** * @param type specifies the type of operation occurring * @param context specifies a context relative to type. * @return true if we should attempt SRP authentication */ virtual bool attempt_srp(const std::string& type, const std::string& context); /** * @param type specifies the type of operation occurring * @param context specifies a context relative to type. * @return identifier for client-side SRP auth, if available for this type/context. Should return empty string if password auth not desired/available. */ virtual std::string srp_identifier(const std::string& type, const std::string& context); /** * @param type specifies the type of operation occurring * @param context specifies a context relative to type. * @param identifier specifies what identifier we want the * password for. This will be a value previously returned * by srp_identifier. * @return password for client-side SRP auth, if available for this identifier/type/context. */ virtual std::string srp_password(const std::string& type, const std::string& context, const std::string& identifier); /** * Retrieve SRP verifier parameters */ virtual bool srp_verifier(const std::string& type, const std::string& context, const std::string& identifier, std::string& group_name, BigInt& verifier, std::vector& salt, bool generate_fake_on_unknown); /** * @param type specifies the type of operation occurring * @param context specifies a context relative to type. * @return the PSK identity hint for this type/context */ virtual std::string psk_identity_hint(const std::string& type, const std::string& context); /** * @param type specifies the type of operation occurring * @param context specifies a context relative to type. * @param identity_hint was passed by the server (but may be empty) * @return the PSK identity we want to use */ virtual std::string psk_identity(const std::string& type, const std::string& context, const std::string& identity_hint); /** * @param type specifies the type of operation occurring * @param context specifies a context relative to type. * @param identity is a PSK identity previously returned by psk_identity for the same type and context. * @return the PSK used for identity, or throw an exception if no * key exists */ virtual SymmetricKey psk(const std::string& type, const std::string& context, const std::string& identity); }; } #endif botan-2.4.0/src/lib/tls/info.txt000066400000000000000000000012321322470703100164500ustar00rootroot00000000000000 TLS -> 20150319 load_on auto credentials_manager.h tls_alert.h tls_blocking.h tls_callbacks.h tls_channel.h tls_ciphersuite.h tls_client.h tls_exceptn.h tls_extensions.h tls_handshake_msg.h tls_magic.h tls_messages.h tls_server_info.h tls_policy.h tls_server.h tls_session.h tls_session_manager.h tls_version.h tls_handshake_hash.h tls_handshake_io.h tls_handshake_state.h tls_reader.h tls_record.h tls_seq_numbers.h tls_session_key.h aead aes asn1 dh ecdh ecdsa eme_pkcs1 emsa_pkcs1 gcm hmac md5 par_hash prf_tls rng rsa sha1 sha2_32 sha2_64 x509 botan-2.4.0/src/lib/tls/msg_cert_req.cpp000066400000000000000000000104111322470703100201310ustar00rootroot00000000000000/* * Certificate Request Message * (C) 2004-2006,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace TLS { namespace { std::string cert_type_code_to_name(uint8_t code) { switch(code) { case 1: return "RSA"; case 2: return "DSA"; case 64: return "ECDSA"; default: return ""; // DH or something else } } uint8_t cert_type_name_to_code(const std::string& name) { if(name == "RSA") return 1; if(name == "DSA") return 2; if(name == "ECDSA") return 64; throw Invalid_Argument("Unknown cert type " + name); } } /** * Create a new Certificate Request message */ Certificate_Req::Certificate_Req(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, const std::vector& ca_certs, Protocol_Version version) : m_names(ca_certs), m_cert_key_types({ "RSA", "DSA", "ECDSA" }) { if(version.supports_negotiable_signature_algorithms()) { std::vector hashes = policy.allowed_signature_hashes(); std::vector sigs = policy.allowed_signature_methods(); for(size_t i = 0; i != hashes.size(); ++i) for(size_t j = 0; j != sigs.size(); ++j) m_supported_algos.push_back(std::make_pair(hashes[i], sigs[j])); } hash.update(io.send(*this)); } /** * Deserialize a Certificate Request message */ Certificate_Req::Certificate_Req(const std::vector& buf, Protocol_Version version) { if(buf.size() < 4) throw Decoding_Error("Certificate_Req: Bad certificate request"); TLS_Data_Reader reader("CertificateRequest", buf); std::vector cert_type_codes = reader.get_range_vector(1, 1, 255); for(size_t i = 0; i != cert_type_codes.size(); ++i) { const std::string cert_type_name = cert_type_code_to_name(cert_type_codes[i]); if(cert_type_name.empty()) // something we don't know continue; m_cert_key_types.push_back(cert_type_name); } if(version.supports_negotiable_signature_algorithms()) { std::vector sig_hash_algs = reader.get_range_vector(2, 2, 65534); if(sig_hash_algs.size() % 2 != 0) throw Decoding_Error("Bad length for signature IDs in certificate request"); for(size_t i = 0; i != sig_hash_algs.size(); i += 2) { std::string hash = Signature_Algorithms::hash_algo_name(sig_hash_algs[i]); std::string sig = Signature_Algorithms::sig_algo_name(sig_hash_algs[i+1]); m_supported_algos.push_back(std::make_pair(hash, sig)); } } const uint16_t purported_size = reader.get_uint16_t(); if(reader.remaining_bytes() != purported_size) throw Decoding_Error("Inconsistent length in certificate request"); while(reader.has_remaining()) { std::vector name_bits = reader.get_range_vector(2, 0, 65535); BER_Decoder decoder(name_bits.data(), name_bits.size()); X509_DN name; decoder.decode(name); m_names.push_back(name); } } /** * Serialize a Certificate Request message */ std::vector Certificate_Req::serialize() const { std::vector buf; std::vector cert_types; for(size_t i = 0; i != m_cert_key_types.size(); ++i) cert_types.push_back(cert_type_name_to_code(m_cert_key_types[i])); append_tls_length_value(buf, cert_types, 1); if(!m_supported_algos.empty()) buf += Signature_Algorithms(m_supported_algos).serialize(); std::vector encoded_names; for(size_t i = 0; i != m_names.size(); ++i) { DER_Encoder encoder; encoder.encode(m_names[i]); append_tls_length_value(encoded_names, encoder.get_contents(), 2); } append_tls_length_value(buf, encoded_names, 2); return buf; } } } botan-2.4.0/src/lib/tls/msg_cert_status.cpp000066400000000000000000000034451322470703100206760ustar00rootroot00000000000000/* * Certificate Status * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace TLS { Certificate_Status::Certificate_Status(const std::vector& buf) { if(buf.size() < 5) throw Decoding_Error("Invalid Certificate_Status message: too small"); if(buf[0] != 1) throw Decoding_Error("Unexpected Certificate_Status message: unexpected message type"); size_t len = make_uint32(0, buf[1], buf[2], buf[3]); // Verify the redundant length field... if(buf.size() != len + 4) throw Decoding_Error("Invalid Certificate_Status: invalid length field"); m_response = std::make_shared(buf.data() + 4, buf.size() - 4); } Certificate_Status::Certificate_Status(Handshake_IO& io, Handshake_Hash& hash, std::shared_ptr ocsp) : m_response(ocsp) { hash.update(io.send(*this)); } std::vector Certificate_Status::serialize() const { BOTAN_ASSERT_NONNULL(m_response); const std::vector& m_resp_bits = m_response->raw_bits(); if(m_resp_bits.size() > 0xFFFFFF) // unlikely throw Encoding_Error("OCSP response too long to encode in TLS"); const uint32_t m_resp_bits_len = static_cast(m_resp_bits.size()); std::vector buf; buf.push_back(1); // type OCSP for(size_t i = 1; i < 4; ++i) buf[i] = get_byte(i, m_resp_bits_len); buf += m_resp_bits; return buf; } } } botan-2.4.0/src/lib/tls/msg_cert_verify.cpp000066400000000000000000000060171322470703100206550ustar00rootroot00000000000000/* * Certificate Verify Message * (C) 2004,2006,2011,2012 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace TLS { /* * Create a new Certificate Verify message */ Certificate_Verify::Certificate_Verify(Handshake_IO& io, Handshake_State& state, const Policy& policy, RandomNumberGenerator& rng, const Private_Key* priv_key) { BOTAN_ASSERT_NONNULL(priv_key); std::pair format = state.choose_sig_format(*priv_key, m_hash_algo, m_sig_algo, true, policy); m_signature = state.callbacks().tls_sign_message(*priv_key, rng, format.first, format.second, state.hash().get_contents()); state.hash().update(io.send(*this)); } /* * Deserialize a Certificate Verify message */ Certificate_Verify::Certificate_Verify(const std::vector& buf, Protocol_Version version) { TLS_Data_Reader reader("CertificateVerify", buf); if(version.supports_negotiable_signature_algorithms()) { m_hash_algo = Signature_Algorithms::hash_algo_name(reader.get_byte()); m_sig_algo = Signature_Algorithms::sig_algo_name(reader.get_byte()); } m_signature = reader.get_range(2, 0, 65535); } /* * Serialize a Certificate Verify message */ std::vector Certificate_Verify::serialize() const { std::vector buf; if(!m_hash_algo.empty() && !m_sig_algo.empty()) { buf.push_back(Signature_Algorithms::hash_algo_code(m_hash_algo)); buf.push_back(Signature_Algorithms::sig_algo_code(m_sig_algo)); } const uint16_t sig_len = static_cast(m_signature.size()); buf.push_back(get_byte(0, sig_len)); buf.push_back(get_byte(1, sig_len)); buf += m_signature; return buf; } /* * Verify a Certificate Verify message */ bool Certificate_Verify::verify(const X509_Certificate& cert, const Handshake_State& state, const Policy& policy) const { std::unique_ptr key(cert.subject_public_key()); policy.check_peer_key_acceptable(*key); std::pair format = state.parse_sig_format(*key.get(), m_hash_algo, m_sig_algo, true, policy); const bool signature_valid = state.callbacks().tls_verify_message(*key, format.first, format.second, state.hash().get_contents(), m_signature); #if defined(BOTAN_UNSAFE_FUZZER_MODE) return true; #else return signature_valid; #endif } } } botan-2.4.0/src/lib/tls/msg_certificate.cpp000066400000000000000000000043531322470703100206170ustar00rootroot00000000000000/* * Certificate Message * (C) 2004-2006,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace TLS { /** * Create a new Certificate message */ Certificate::Certificate(Handshake_IO& io, Handshake_Hash& hash, const std::vector& cert_list) : m_certs(cert_list) { hash.update(io.send(*this)); } /** * Deserialize a Certificate message */ Certificate::Certificate(const std::vector& buf, const Policy& /*policy_currently_unused*/) { if(buf.size() < 3) throw Decoding_Error("Certificate: Message malformed"); const size_t total_size = make_uint32(0, buf[0], buf[1], buf[2]); if(total_size != buf.size() - 3) throw Decoding_Error("Certificate: Message malformed"); const uint8_t* certs = buf.data() + 3; while(size_t remaining_bytes = buf.data() + buf.size() - certs) { if(remaining_bytes < 3) throw Decoding_Error("Certificate: Message malformed"); const size_t cert_size = make_uint32(0, certs[0], certs[1], certs[2]); if(remaining_bytes < (3 + cert_size)) throw Decoding_Error("Certificate: Message malformed"); DataSource_Memory cert_buf(&certs[3], cert_size); m_certs.push_back(X509_Certificate(cert_buf)); certs += cert_size + 3; } } /** * Serialize a Certificate message */ std::vector Certificate::serialize() const { std::vector buf(3); for(size_t i = 0; i != m_certs.size(); ++i) { std::vector raw_cert = m_certs[i].BER_encode(); const size_t cert_size = raw_cert.size(); for(size_t j = 0; j != 3; ++j) { buf.push_back(get_byte(j+1, static_cast(cert_size))); } buf += raw_cert; } const size_t buf_size = buf.size() - 3; for(size_t i = 0; i != 3; ++i) buf[i] = get_byte(i+1, static_cast(buf_size)); return buf; } } } botan-2.4.0/src/lib/tls/msg_client_hello.cpp000066400000000000000000000321441322470703100207750ustar00rootroot00000000000000/* * TLS Hello Request and Client Hello Messages * (C) 2004-2011,2015,2016 Jack Lloyd * 2016 Matthias Gierlings * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { enum { TLS_EMPTY_RENEGOTIATION_INFO_SCSV = 0x00FF, TLS_FALLBACK_SCSV = 0x5600 }; std::vector make_hello_random(RandomNumberGenerator& rng, const Policy& policy) { std::vector buf(32); rng.randomize(buf.data(), buf.size()); std::unique_ptr sha256 = HashFunction::create_or_throw("SHA-256"); sha256->update(buf); sha256->final(buf); if(policy.include_time_in_hello_random()) { const uint32_t time32 = static_cast( std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())); store_be(time32, buf.data()); } return buf; } /* * Create a new Hello Request message */ Hello_Request::Hello_Request(Handshake_IO& io) { io.send(*this); } /* * Deserialize a Hello Request message */ Hello_Request::Hello_Request(const std::vector& buf) { if(buf.size()) throw Decoding_Error("Bad Hello_Request, has non-zero size"); } /* * Serialize a Hello Request message */ std::vector Hello_Request::serialize() const { return std::vector(); } /* * Create a new Client Hello message */ Client_Hello::Client_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& reneg_info, const Client_Hello::Settings& client_settings, const std::vector& next_protocols) : m_version(client_settings.protocol_version()), m_random(make_hello_random(rng, policy)), m_suites(policy.ciphersuite_list(m_version, !client_settings.srp_identifier().empty())), m_comp_methods(policy.compression()) { BOTAN_ASSERT(policy.acceptable_protocol_version(client_settings.protocol_version()), "Our policy accepts the version we are offering"); /* * Place all empty extensions in front to avoid a bug in some systems * which reject hellos when the last extension in the list is empty. */ m_extensions.add(new Extended_Master_Secret); m_extensions.add(new Session_Ticket()); if(policy.negotiate_encrypt_then_mac()) m_extensions.add(new Encrypt_then_MAC); m_extensions.add(new Renegotiation_Extension(reneg_info)); m_extensions.add(new Server_Name_Indicator(client_settings.hostname())); if(policy.support_cert_status_message()) m_extensions.add(new Certificate_Status_Request({}, {})); if(reneg_info.empty() && !next_protocols.empty()) m_extensions.add(new Application_Layer_Protocol_Notification(next_protocols)); if(m_version.supports_negotiable_signature_algorithms()) m_extensions.add(new Signature_Algorithms(policy.allowed_signature_hashes(), policy.allowed_signature_methods())); if(m_version.is_datagram_protocol()) m_extensions.add(new SRTP_Protection_Profiles(policy.srtp_profiles())); #if defined(BOTAN_HAS_SRP6) m_extensions.add(new SRP_Identifier(client_settings.srp_identifier())); #else if(!client_settings.srp_identifier().empty()) { throw Invalid_State("Attempting to initiate SRP session but TLS-SRP support disabled"); } #endif Supported_Groups* supported_groups = new Supported_Groups(policy.allowed_groups()); m_extensions.add(supported_groups); if(!supported_groups->curves().empty()) { m_extensions.add(new Supported_Point_Formats(policy.use_ecc_point_compression())); } if(m_version.supports_negotiable_signature_algorithms()) m_extensions.add(new Signature_Algorithms(policy.allowed_signature_hashes(), policy.allowed_signature_methods())); if(policy.send_fallback_scsv(client_settings.protocol_version())) m_suites.push_back(TLS_FALLBACK_SCSV); hash.update(io.send(*this)); } /* * Create a new Client Hello message (session resumption case) */ Client_Hello::Client_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& reneg_info, const Session& session, const std::vector& next_protocols) : m_version(session.version()), m_session_id(session.session_id()), m_random(make_hello_random(rng, policy)), m_suites(policy.ciphersuite_list(m_version, (session.srp_identifier() != ""))), m_comp_methods(policy.compression()) { if(!value_exists(m_suites, session.ciphersuite_code())) m_suites.push_back(session.ciphersuite_code()); if(!value_exists(m_comp_methods, session.compression_method())) m_comp_methods.push_back(session.compression_method()); /* We always add the EMS extension, even if not used in the original session. If the server understands it and follows the RFC it should reject our resume attempt and upgrade us to a new session with the EMS protection. */ m_extensions.add(new Extended_Master_Secret); m_extensions.add(new Renegotiation_Extension(reneg_info)); m_extensions.add(new Server_Name_Indicator(session.server_info().hostname())); m_extensions.add(new Session_Ticket(session.session_ticket())); m_extensions.add(new Supported_Elliptic_Curves(policy.allowed_ecc_curves())); if(!policy.allowed_ecc_curves().empty()) { m_extensions.add(new Supported_Point_Formats(policy.use_ecc_point_compression())); } if(session.supports_encrypt_then_mac()) m_extensions.add(new Encrypt_then_MAC); #if defined(BOTAN_HAS_SRP6) m_extensions.add(new SRP_Identifier(session.srp_identifier())); #else if(!session.srp_identifier().empty()) { throw Invalid_State("Attempting to resume SRP session but TLS-SRP support disabled"); } #endif if(m_version.supports_negotiable_signature_algorithms()) m_extensions.add(new Signature_Algorithms(policy.allowed_signature_hashes(), policy.allowed_signature_methods())); if(reneg_info.empty() && !next_protocols.empty()) m_extensions.add(new Application_Layer_Protocol_Notification(next_protocols)); hash.update(io.send(*this)); } void Client_Hello::update_hello_cookie(const Hello_Verify_Request& hello_verify) { if(!m_version.is_datagram_protocol()) throw Exception("Cannot use hello cookie with stream protocol"); m_hello_cookie = hello_verify.cookie(); } /* * Serialize a Client Hello message */ std::vector Client_Hello::serialize() const { std::vector buf; buf.push_back(m_version.major_version()); buf.push_back(m_version.minor_version()); buf += m_random; append_tls_length_value(buf, m_session_id, 1); if(m_version.is_datagram_protocol()) append_tls_length_value(buf, m_hello_cookie, 1); append_tls_length_value(buf, m_suites, 2); append_tls_length_value(buf, m_comp_methods, 1); /* * May not want to send extensions at all in some cases. If so, * should include SCSV value (if reneg info is empty, if not we are * renegotiating with a modern server) */ buf += m_extensions.serialize(); return buf; } /* * Read a counterparty client hello */ Client_Hello::Client_Hello(const std::vector& buf) { if(buf.size() < 41) throw Decoding_Error("Client_Hello: Packet corrupted"); TLS_Data_Reader reader("ClientHello", buf); const uint8_t major_version = reader.get_byte(); const uint8_t minor_version = reader.get_byte(); m_version = Protocol_Version(major_version, minor_version); m_random = reader.get_fixed(32); m_session_id = reader.get_range(1, 0, 32); if(m_version.is_datagram_protocol()) m_hello_cookie = reader.get_range(1, 0, 255); m_suites = reader.get_range_vector(2, 1, 32767); m_comp_methods = reader.get_range_vector(1, 1, 255); m_extensions.deserialize(reader); if(offered_suite(static_cast(TLS_EMPTY_RENEGOTIATION_INFO_SCSV))) { if(Renegotiation_Extension* reneg = m_extensions.get()) { if(!reneg->renegotiation_info().empty()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client sent renegotiation SCSV and non-empty extension"); } else { // add fake extension m_extensions.add(new Renegotiation_Extension()); } } // Parsing complete, now any additional decoding checks if(m_version.supports_negotiable_signature_algorithms() == false) { if(m_extensions.has()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client sent signature_algorithms extension in version that doesn't support it"); } } bool Client_Hello::sent_fallback_scsv() const { return offered_suite(static_cast(TLS_FALLBACK_SCSV)); } /* * Check if we offered this ciphersuite */ bool Client_Hello::offered_suite(uint16_t ciphersuite) const { for(size_t i = 0; i != m_suites.size(); ++i) if(m_suites[i] == ciphersuite) return true; return false; } std::vector> Client_Hello::supported_algos() const { if(Signature_Algorithms* sigs = m_extensions.get()) return sigs->supported_signature_algorthms(); return std::vector>(); } std::set Client_Hello::supported_sig_algos() const { std::set sig; for(auto&& hash_and_sig : supported_algos()) sig.insert(hash_and_sig.second); return sig; } std::vector Client_Hello::supported_ecc_curves() const { if(Supported_Groups* groups = m_extensions.get()) return groups->curves(); return std::vector(); } std::vector Client_Hello::supported_dh_groups() const { if(Supported_Groups* groups = m_extensions.get()) return groups->dh_groups(); return std::vector(); } bool Client_Hello::prefers_compressed_ec_points() const { if(Supported_Point_Formats* ecc_formats = m_extensions.get()) { return ecc_formats->prefers_compressed(); } return false; } std::string Client_Hello::sni_hostname() const { if(Server_Name_Indicator* sni = m_extensions.get()) return sni->host_name(); return ""; } #if defined(BOTAN_HAS_SRP6) std::string Client_Hello::srp_identifier() const { if(SRP_Identifier* srp = m_extensions.get()) return srp->identifier(); return ""; } #endif bool Client_Hello::secure_renegotiation() const { return m_extensions.has(); } std::vector Client_Hello::renegotiation_info() const { if(Renegotiation_Extension* reneg = m_extensions.get()) return reneg->renegotiation_info(); return std::vector(); } bool Client_Hello::supports_session_ticket() const { return m_extensions.has(); } std::vector Client_Hello::session_ticket() const { if(Session_Ticket* ticket = m_extensions.get()) return ticket->contents(); return std::vector(); } bool Client_Hello::supports_alpn() const { return m_extensions.has(); } bool Client_Hello::supports_extended_master_secret() const { return m_extensions.has(); } bool Client_Hello::supports_cert_status_message() const { return m_extensions.has(); } bool Client_Hello::supports_encrypt_then_mac() const { return m_extensions.has(); } bool Client_Hello::sent_signature_algorithms() const { return m_extensions.has(); } std::vector Client_Hello::next_protocols() const { if(auto alpn = m_extensions.get()) return alpn->protocols(); return std::vector(); } std::vector Client_Hello::srtp_profiles() const { if(SRTP_Protection_Profiles* srtp = m_extensions.get()) return srtp->profiles(); return std::vector(); } } } botan-2.4.0/src/lib/tls/msg_client_kex.cpp000066400000000000000000000335201322470703100204600ustar00rootroot00000000000000/* * Client Key Exchange Message * (C) 2004-2010,2016 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_CECPQ1) #include #endif #if defined(BOTAN_HAS_SRP6) #include #endif namespace Botan { namespace TLS { /* * Create a new Client Key Exchange message */ Client_Key_Exchange::Client_Key_Exchange(Handshake_IO& io, Handshake_State& state, const Policy& policy, Credentials_Manager& creds, const Public_Key* server_public_key, const std::string& hostname, RandomNumberGenerator& rng) { const std::string kex_algo = state.ciphersuite().kex_algo(); if(kex_algo == "PSK") { std::string identity_hint = ""; if(state.server_kex()) { TLS_Data_Reader reader("ClientKeyExchange", state.server_kex()->params()); identity_hint = reader.get_string(2, 0, 65535); } const std::string psk_identity = creds.psk_identity("tls-client", hostname, identity_hint); append_tls_length_value(m_key_material, psk_identity, 2); SymmetricKey psk = creds.psk("tls-client", hostname, psk_identity); std::vector zeros(psk.length()); append_tls_length_value(m_pre_master, zeros, 2); append_tls_length_value(m_pre_master, psk.bits_of(), 2); } else if(state.server_kex()) { TLS_Data_Reader reader("ClientKeyExchange", state.server_kex()->params()); SymmetricKey psk; if(kex_algo == "DHE_PSK" || kex_algo == "ECDHE_PSK") { std::string identity_hint = reader.get_string(2, 0, 65535); const std::string psk_identity = creds.psk_identity("tls-client", hostname, identity_hint); append_tls_length_value(m_key_material, psk_identity, 2); psk = creds.psk("tls-client", hostname, psk_identity); } if(kex_algo == "DH" || kex_algo == "DHE_PSK") { const std::vector modulus = reader.get_range(2, 1, 65535); const std::vector generator = reader.get_range(2, 1, 65535); const std::vector peer_public_value = reader.get_range(2, 1, 65535); if(reader.remaining_bytes()) throw Decoding_Error("Bad params size for DH key exchange"); const std::pair, std::vector> dh_result = state.callbacks().tls_dh_agree(modulus, generator, peer_public_value, policy, rng); if(kex_algo == "DH") m_pre_master = dh_result.first; else { append_tls_length_value(m_pre_master, dh_result.first, 2); append_tls_length_value(m_pre_master, psk.bits_of(), 2); } append_tls_length_value(m_key_material, dh_result.second, 2); } else if(kex_algo == "ECDH" || kex_algo == "ECDHE_PSK") { const uint8_t curve_type = reader.get_byte(); if(curve_type != 3) throw Decoding_Error("Server sent non-named ECC curve"); const uint16_t curve_id = reader.get_uint16_t(); const std::string curve_name = Supported_Elliptic_Curves::curve_id_to_name(curve_id); if(curve_name == "") throw Decoding_Error("Server sent unknown named curve " + std::to_string(curve_id)); if(!policy.allowed_ecc_curve(curve_name)) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server sent ECC curve prohibited by policy"); } const std::vector peer_public_value = reader.get_range(1, 1, 255); const std::pair, std::vector> ecdh_result = state.callbacks().tls_ecdh_agree(curve_name, peer_public_value, policy, rng, state.server_hello()->prefers_compressed_ec_points()); if(kex_algo == "ECDH") m_pre_master = ecdh_result.first; else { append_tls_length_value(m_pre_master, ecdh_result.first, 2); append_tls_length_value(m_pre_master, psk.bits_of(), 2); } append_tls_length_value(m_key_material, ecdh_result.second, 1); } #if defined(BOTAN_HAS_SRP6) else if(kex_algo == "SRP_SHA") { const BigInt N = BigInt::decode(reader.get_range(2, 1, 65535)); const BigInt g = BigInt::decode(reader.get_range(2, 1, 65535)); std::vector salt = reader.get_range(1, 1, 255); const BigInt B = BigInt::decode(reader.get_range(2, 1, 65535)); const std::string srp_group = srp6_group_identifier(N, g); const std::string srp_identifier = creds.srp_identifier("tls-client", hostname); const std::string srp_password = creds.srp_password("tls-client", hostname, srp_identifier); std::pair srp_vals = srp6_client_agree(srp_identifier, srp_password, srp_group, "SHA-1", salt, B, rng); append_tls_length_value(m_key_material, BigInt::encode(srp_vals.first), 2); m_pre_master = srp_vals.second.bits_of(); } #endif #if defined(BOTAN_HAS_CECPQ1) else if(kex_algo == "CECPQ1") { const std::vector cecpq1_offer = reader.get_range(2, 1, 65535); if(cecpq1_offer.size() != CECPQ1_OFFER_BYTES) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Invalid CECPQ1 key size"); std::vector newhope_accept(CECPQ1_ACCEPT_BYTES); secure_vector shared_secret(CECPQ1_SHARED_KEY_BYTES); CECPQ1_accept(shared_secret.data(), newhope_accept.data(), cecpq1_offer.data(), rng); append_tls_length_value(m_key_material, newhope_accept, 2); m_pre_master = shared_secret; } #endif else { throw Internal_Error("Client_Key_Exchange: Unknown kex " + kex_algo); } reader.assert_done(); } else { // No server key exchange msg better mean RSA kex + RSA key in cert if(kex_algo != "RSA") throw Unexpected_Message("No server kex but negotiated kex " + kex_algo); if(!server_public_key) throw Internal_Error("No server public key for RSA exchange"); if(auto rsa_pub = dynamic_cast(server_public_key)) { const Protocol_Version offered_version = state.client_hello()->version(); m_pre_master = rng.random_vec(48); m_pre_master[0] = offered_version.major_version(); m_pre_master[1] = offered_version.minor_version(); PK_Encryptor_EME encryptor(*rsa_pub, rng, "PKCS1v15"); const std::vector encrypted_key = encryptor.encrypt(m_pre_master, rng); append_tls_length_value(m_key_material, encrypted_key, 2); } else throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Expected a RSA key in server cert but got " + server_public_key->algo_name()); } state.hash().update(io.send(*this)); } /* * Read a Client Key Exchange message */ Client_Key_Exchange::Client_Key_Exchange(const std::vector& contents, const Handshake_State& state, const Private_Key* server_rsa_kex_key, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng) { const std::string kex_algo = state.ciphersuite().kex_algo(); if(kex_algo == "RSA") { BOTAN_ASSERT(state.server_certs() && !state.server_certs()->cert_chain().empty(), "RSA key exchange negotiated so server sent a certificate"); if(!server_rsa_kex_key) throw Internal_Error("Expected RSA kex but no server kex key set"); if(!dynamic_cast(server_rsa_kex_key)) throw Internal_Error("Expected RSA key but got " + server_rsa_kex_key->algo_name()); TLS_Data_Reader reader("ClientKeyExchange", contents); const std::vector encrypted_pre_master = reader.get_range(2, 0, 65535); PK_Decryptor_EME decryptor(*server_rsa_kex_key, rng, "PKCS1v15"); const uint8_t client_major = state.client_hello()->version().major_version(); const uint8_t client_minor = state.client_hello()->version().minor_version(); /* * PK_Decryptor::decrypt_or_random will return a random value if * either the length does not match the expected value or if the * version number embedded in the PMS does not match the one sent * in the client hello. */ const size_t expected_plaintext_size = 48; const size_t expected_content_size = 2; const uint8_t expected_content_bytes[expected_content_size] = { client_major, client_minor }; const uint8_t expected_content_pos[expected_content_size] = { 0, 1 }; m_pre_master = decryptor.decrypt_or_random(encrypted_pre_master.data(), encrypted_pre_master.size(), expected_plaintext_size, rng, expected_content_bytes, expected_content_pos, expected_content_size); } else { TLS_Data_Reader reader("ClientKeyExchange", contents); SymmetricKey psk; if(kex_algo == "PSK" || kex_algo == "DHE_PSK" || kex_algo == "ECDHE_PSK") { const std::string psk_identity = reader.get_string(2, 0, 65535); psk = creds.psk("tls-server", state.client_hello()->sni_hostname(), psk_identity); if(psk.length() == 0) { if(policy.hide_unknown_users()) psk = SymmetricKey(rng, 16); else throw TLS_Exception(Alert::UNKNOWN_PSK_IDENTITY, "No PSK for identifier " + psk_identity); } } if(kex_algo == "PSK") { std::vector zeros(psk.length()); append_tls_length_value(m_pre_master, zeros, 2); append_tls_length_value(m_pre_master, psk.bits_of(), 2); } #if defined(BOTAN_HAS_SRP6) else if(kex_algo == "SRP_SHA") { SRP6_Server_Session& srp = state.server_kex()->server_srp_params(); m_pre_master = srp.step2(BigInt::decode(reader.get_range(2, 0, 65535))).bits_of(); } #endif #if defined(BOTAN_HAS_CECPQ1) else if(kex_algo == "CECPQ1") { const CECPQ1_key& cecpq1_offer = state.server_kex()->cecpq1_key(); const std::vector cecpq1_accept = reader.get_range(2, 0, 65535); if(cecpq1_accept.size() != CECPQ1_ACCEPT_BYTES) throw Decoding_Error("Invalid size for CECPQ1 accept message"); m_pre_master.resize(CECPQ1_SHARED_KEY_BYTES); CECPQ1_finish(m_pre_master.data(), cecpq1_offer, cecpq1_accept.data()); } #endif else if(kex_algo == "DH" || kex_algo == "DHE_PSK" || kex_algo == "ECDH" || kex_algo == "ECDHE_PSK") { const Private_Key& private_key = state.server_kex()->server_kex_key(); const PK_Key_Agreement_Key* ka_key = dynamic_cast(&private_key); if(!ka_key) throw Internal_Error("Expected key agreement key type but got " + private_key.algo_name()); std::vector client_pubkey; if(ka_key->algo_name() == "DH") { client_pubkey = reader.get_range(2, 0, 65535); } else { client_pubkey = reader.get_range(1, 1, 255); } try { PK_Key_Agreement ka(*ka_key, rng, "Raw"); secure_vector shared_secret = ka.derive_key(0, client_pubkey).bits_of(); if(ka_key->algo_name() == "DH") shared_secret = CT::strip_leading_zeros(shared_secret); if(kex_algo == "DHE_PSK" || kex_algo == "ECDHE_PSK") { append_tls_length_value(m_pre_master, shared_secret, 2); append_tls_length_value(m_pre_master, psk.bits_of(), 2); } else m_pre_master = shared_secret; } catch(std::exception &) { /* * Something failed in the DH computation. To avoid possible * timing attacks, randomize the pre-master output and carry * on, allowing the protocol to fail later in the finished * checks. */ m_pre_master = rng.random_vec(ka_key->public_value().size()); } } else throw Internal_Error("Client_Key_Exchange: Unknown kex type " + kex_algo); } } } } botan-2.4.0/src/lib/tls/msg_finished.cpp000066400000000000000000000043441322470703100201260ustar00rootroot00000000000000/* * Finished Message * (C) 2004-2006,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace TLS { namespace { /* * Compute the verify_data */ std::vector finished_compute_verify(const Handshake_State& state, Connection_Side side) { const uint8_t TLS_CLIENT_LABEL[] = { 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x20, 0x66, 0x69, 0x6E, 0x69, 0x73, 0x68, 0x65, 0x64 }; const uint8_t TLS_SERVER_LABEL[] = { 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6E, 0x69, 0x73, 0x68, 0x65, 0x64 }; std::unique_ptr prf(state.protocol_specific_prf()); std::vector input; std::vector label; if(side == CLIENT) label += std::make_pair(TLS_CLIENT_LABEL, sizeof(TLS_CLIENT_LABEL)); else label += std::make_pair(TLS_SERVER_LABEL, sizeof(TLS_SERVER_LABEL)); input += state.hash().final(state.version(), state.ciphersuite().prf_algo()); return unlock(prf->derive_key(12, state.session_keys().master_secret(), input, label)); } } /* * Create a new Finished message */ Finished::Finished(Handshake_IO& io, Handshake_State& state, Connection_Side side) : m_verification_data(finished_compute_verify( state, side )) { state.hash().update(io.send(*this)); } /* * Serialize a Finished message */ std::vector Finished::serialize() const { return m_verification_data; } /* * Deserialize a Finished message */ Finished::Finished(const std::vector& buf) : m_verification_data(buf) {} /* * Verify a Finished message */ bool Finished::verify(const Handshake_State& state, Connection_Side side) const { std::vector computed_verify = finished_compute_verify(state, side); #if defined(BOTAN_UNSAFE_FUZZER_MODE) return true; #else return (m_verification_data.size() == computed_verify.size()) && constant_time_compare(m_verification_data.data(), computed_verify.data(), computed_verify.size()); #endif } } } botan-2.4.0/src/lib/tls/msg_hello_verify.cpp000066400000000000000000000036171322470703100210260ustar00rootroot00000000000000/* * DTLS Hello Verify Request * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace TLS { Hello_Verify_Request::Hello_Verify_Request(const std::vector& buf) { if(buf.size() < 3) throw Decoding_Error("Hello verify request too small"); Protocol_Version version(buf[0], buf[1]); if(version != Protocol_Version::DTLS_V10 && version != Protocol_Version::DTLS_V12) { throw Decoding_Error("Unknown version from server in hello verify request"); } if(static_cast(buf[2]) + 3 != buf.size()) throw Decoding_Error("Bad length in hello verify request"); m_cookie.assign(buf.begin() + 3, buf.end()); } Hello_Verify_Request::Hello_Verify_Request(const std::vector& client_hello_bits, const std::string& client_identity, const SymmetricKey& secret_key) { std::unique_ptr hmac(MessageAuthenticationCode::create("HMAC(SHA-256)")); hmac->set_key(secret_key); hmac->update_be(client_hello_bits.size()); hmac->update(client_hello_bits); hmac->update_be(client_identity.size()); hmac->update(client_identity); m_cookie = unlock(hmac->final()); } std::vector Hello_Verify_Request::serialize() const { /* DTLS 1.2 server implementations SHOULD use DTLS version 1.0 regardless of the version of TLS that is expected to be negotiated (RFC 6347, section 4.2.1) */ Protocol_Version format_version(Protocol_Version::DTLS_V10); std::vector bits; bits.push_back(format_version.major_version()); bits.push_back(format_version.minor_version()); bits.push_back(static_cast(m_cookie.size())); bits += m_cookie; return bits; } } } botan-2.4.0/src/lib/tls/msg_server_hello.cpp000066400000000000000000000151101322470703100210170ustar00rootroot00000000000000/* * TLS Server Hello and Server Hello Done * (C) 2004-2011,2015,2016 Jack Lloyd * 2016 Matthias Gierlings * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace TLS { // New session case Server_Hello::Server_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& reneg_info, const Client_Hello& client_hello, const Server_Hello::Settings& server_settings, const std::string next_protocol) : m_version(server_settings.protocol_version()), m_session_id(server_settings.session_id()), m_random(make_hello_random(rng, policy)), m_ciphersuite(server_settings.ciphersuite()), m_comp_method(server_settings.compression()) { if(client_hello.supports_extended_master_secret()) m_extensions.add(new Extended_Master_Secret); // Sending the extension back does not commit us to sending a stapled response if(client_hello.supports_cert_status_message() && policy.support_cert_status_message()) m_extensions.add(new Certificate_Status_Request); Ciphersuite c = Ciphersuite::by_id(m_ciphersuite); if(c.cbc_ciphersuite() && client_hello.supports_encrypt_then_mac() && policy.negotiate_encrypt_then_mac()) { m_extensions.add(new Encrypt_then_MAC); } if(c.ecc_ciphersuite() && client_hello.extension_types().count(TLSEXT_EC_POINT_FORMATS)) { m_extensions.add(new Supported_Point_Formats(policy.use_ecc_point_compression())); } if(client_hello.secure_renegotiation()) m_extensions.add(new Renegotiation_Extension(reneg_info)); if(client_hello.supports_session_ticket() && server_settings.offer_session_ticket()) m_extensions.add(new Session_Ticket()); if(!next_protocol.empty() && client_hello.supports_alpn()) m_extensions.add(new Application_Layer_Protocol_Notification(next_protocol)); if(m_version.is_datagram_protocol()) { const std::vector server_srtp = policy.srtp_profiles(); const std::vector client_srtp = client_hello.srtp_profiles(); if(!server_srtp.empty() && !client_srtp.empty()) { uint16_t shared = 0; // always using server preferences for now for(auto s_srtp : server_srtp) for(auto c_srtp : client_srtp) { if(shared == 0 && s_srtp == c_srtp) shared = s_srtp; } if(shared) m_extensions.add(new SRTP_Protection_Profiles(shared)); } } hash.update(io.send(*this)); } // Resuming Server_Hello::Server_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& reneg_info, const Client_Hello& client_hello, Session& resumed_session, bool offer_session_ticket, const std::string& next_protocol) : m_version(resumed_session.version()), m_session_id(client_hello.session_id()), m_random(make_hello_random(rng, policy)), m_ciphersuite(resumed_session.ciphersuite_code()), m_comp_method(resumed_session.compression_method()) { if(client_hello.supports_extended_master_secret()) m_extensions.add(new Extended_Master_Secret); // Sending the extension back does not commit us to sending a stapled response if(client_hello.supports_cert_status_message() && policy.support_cert_status_message()) m_extensions.add(new Certificate_Status_Request); if(client_hello.supports_encrypt_then_mac() && policy.negotiate_encrypt_then_mac()) { Ciphersuite c = resumed_session.ciphersuite(); if(c.cbc_ciphersuite()) m_extensions.add(new Encrypt_then_MAC); } if(resumed_session.ciphersuite().ecc_ciphersuite()) { m_extensions.add(new Supported_Point_Formats(policy.use_ecc_point_compression())); } if(client_hello.secure_renegotiation()) m_extensions.add(new Renegotiation_Extension(reneg_info)); if(client_hello.supports_session_ticket() && offer_session_ticket) m_extensions.add(new Session_Ticket()); if(!next_protocol.empty() && client_hello.supports_alpn()) m_extensions.add(new Application_Layer_Protocol_Notification(next_protocol)); hash.update(io.send(*this)); } /* * Deserialize a Server Hello message */ Server_Hello::Server_Hello(const std::vector& buf) { if(buf.size() < 38) throw Decoding_Error("Server_Hello: Packet corrupted"); TLS_Data_Reader reader("ServerHello", buf); const uint8_t major_version = reader.get_byte(); const uint8_t minor_version = reader.get_byte(); m_version = Protocol_Version(major_version, minor_version); m_random = reader.get_fixed(32); m_session_id = reader.get_range(1, 0, 32); m_ciphersuite = reader.get_uint16_t(); m_comp_method = reader.get_byte(); m_extensions.deserialize(reader); } /* * Serialize a Server Hello message */ std::vector Server_Hello::serialize() const { std::vector buf; buf.push_back(m_version.major_version()); buf.push_back(m_version.minor_version()); buf += m_random; append_tls_length_value(buf, m_session_id, 1); buf.push_back(get_byte(0, m_ciphersuite)); buf.push_back(get_byte(1, m_ciphersuite)); buf.push_back(m_comp_method); buf += m_extensions.serialize(); return buf; } /* * Create a new Server Hello Done message */ Server_Hello_Done::Server_Hello_Done(Handshake_IO& io, Handshake_Hash& hash) { hash.update(io.send(*this)); } /* * Deserialize a Server Hello Done message */ Server_Hello_Done::Server_Hello_Done(const std::vector& buf) { if(buf.size()) throw Decoding_Error("Server_Hello_Done: Must be empty, and is not"); } /* * Serialize a Server Hello Done message */ std::vector Server_Hello_Done::serialize() const { return std::vector(); } } } botan-2.4.0/src/lib/tls/msg_server_kex.cpp000066400000000000000000000240041322470703100205050ustar00rootroot00000000000000/* * Server Key Exchange Message * (C) 2004-2010,2012,2015,2016 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_CURVE_25519) #include #endif #if defined(BOTAN_HAS_CECPQ1) #include #endif #if defined(BOTAN_HAS_SRP6) #include #endif namespace Botan { namespace TLS { /** * Create a new Server Key Exchange message */ Server_Key_Exchange::Server_Key_Exchange(Handshake_IO& io, Handshake_State& state, const Policy& policy, Credentials_Manager& creds, RandomNumberGenerator& rng, const Private_Key* signing_key) { const std::string hostname = state.client_hello()->sni_hostname(); const std::string kex_algo = state.ciphersuite().kex_algo(); if(kex_algo == "PSK" || kex_algo == "DHE_PSK" || kex_algo == "ECDHE_PSK") { std::string identity_hint = creds.psk_identity_hint("tls-server", hostname); append_tls_length_value(m_params, identity_hint, 2); } if(kex_algo == "DH" || kex_algo == "DHE_PSK") { const std::vector& dh_groups = state.client_hello()->supported_dh_groups(); std::string group_name; // if the client does not send any DH groups in // the supported groups extension, but does offer DH ciphersuites, // we select a group arbitrarily if (dh_groups.empty()) { group_name = policy.dh_group(); } else { group_name = policy.choose_dh_group(dh_groups); } if (group_name.empty()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Could not agree on a DH group with the client"); std::unique_ptr dh(new DH_PrivateKey(rng, DL_Group(group_name))); append_tls_length_value(m_params, BigInt::encode(dh->get_domain().get_p()), 2); append_tls_length_value(m_params, BigInt::encode(dh->get_domain().get_g()), 2); append_tls_length_value(m_params, dh->public_value(), 2); m_kex_key.reset(dh.release()); } else if(kex_algo == "ECDH" || kex_algo == "ECDHE_PSK") { const std::vector& curves = state.client_hello()->supported_ecc_curves(); if(curves.empty()) throw Internal_Error("Client sent no ECC extension but we negotiated ECDH"); const std::string curve_name = policy.choose_curve(curves); if(curve_name == "") throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Could not agree on an ECC curve with the client"); const uint16_t named_curve_id = Supported_Elliptic_Curves::name_to_curve_id(curve_name); if(named_curve_id == 0) throw Internal_Error("TLS does not support ECC with " + curve_name); std::vector ecdh_public_val; if(curve_name == "x25519") { #if defined(BOTAN_HAS_CURVE_25519) std::unique_ptr x25519(new Curve25519_PrivateKey(rng)); ecdh_public_val = x25519->public_value(); m_kex_key.reset(x25519.release()); #else throw Internal_Error("Negotiated X25519 somehow, but it is disabled"); #endif } else { EC_Group ec_group(curve_name); std::unique_ptr ecdh(new ECDH_PrivateKey(rng, ec_group)); // follow client's preference for point compression ecdh_public_val = ecdh->public_value( state.client_hello()->prefers_compressed_ec_points() ? PointGFp::COMPRESSED : PointGFp::UNCOMPRESSED); m_kex_key.reset(ecdh.release()); } m_params.push_back(3); // named curve m_params.push_back(get_byte(0, named_curve_id)); m_params.push_back(get_byte(1, named_curve_id)); append_tls_length_value(m_params, ecdh_public_val, 1); } #if defined(BOTAN_HAS_SRP6) else if(kex_algo == "SRP_SHA") { const std::string srp_identifier = state.client_hello()->srp_identifier(); std::string group_id; BigInt v; std::vector salt; const bool found = creds.srp_verifier("tls-server", hostname, srp_identifier, group_id, v, salt, policy.hide_unknown_users()); if(!found) throw TLS_Exception(Alert::UNKNOWN_PSK_IDENTITY, "Unknown SRP user " + srp_identifier); m_srp_params.reset(new SRP6_Server_Session); BigInt B = m_srp_params->step1(v, group_id, "SHA-1", rng); DL_Group group(group_id); append_tls_length_value(m_params, BigInt::encode(group.get_p()), 2); append_tls_length_value(m_params, BigInt::encode(group.get_g()), 2); append_tls_length_value(m_params, salt, 1); append_tls_length_value(m_params, BigInt::encode(B), 2); } #endif #if defined(BOTAN_HAS_CECPQ1) else if(kex_algo == "CECPQ1") { std::vector cecpq1_offer(CECPQ1_OFFER_BYTES); m_cecpq1_key.reset(new CECPQ1_key); CECPQ1_offer(cecpq1_offer.data(), m_cecpq1_key.get(), rng); append_tls_length_value(m_params, cecpq1_offer, 2); } #endif else if(kex_algo != "PSK") { throw Internal_Error("Server_Key_Exchange: Unknown kex type " + kex_algo); } if(state.ciphersuite().sig_algo() != "") { BOTAN_ASSERT(signing_key, "Signing key was set"); std::pair format = state.choose_sig_format(*signing_key, m_hash_algo, m_sig_algo, false, policy); std::vector buf = state.client_hello()->random(); buf += state.server_hello()->random(); buf += params(); m_signature = state.callbacks().tls_sign_message(*signing_key, rng, format.first, format.second, buf); } state.hash().update(io.send(*this)); } /** * Deserialize a Server Key Exchange message */ Server_Key_Exchange::Server_Key_Exchange(const std::vector& buf, const std::string& kex_algo, const std::string& sig_algo, Protocol_Version version) { TLS_Data_Reader reader("ServerKeyExchange", buf); /* * Here we are deserializing enough to find out what offset the * signature is at. All processing is done when the Client Key Exchange * is prepared. */ if(kex_algo == "PSK" || kex_algo == "DHE_PSK" || kex_algo == "ECDHE_PSK") { reader.get_string(2, 0, 65535); // identity hint } if(kex_algo == "DH" || kex_algo == "DHE_PSK") { // 3 bigints, DH p, g, Y for(size_t i = 0; i != 3; ++i) { reader.get_range(2, 1, 65535); } } else if(kex_algo == "ECDH" || kex_algo == "ECDHE_PSK") { reader.get_byte(); // curve type reader.get_uint16_t(); // curve id reader.get_range(1, 1, 255); // public key } else if(kex_algo == "SRP_SHA") { // 2 bigints (N,g) then salt, then server B reader.get_range(2, 1, 65535); reader.get_range(2, 1, 65535); reader.get_range(1, 1, 255); reader.get_range(2, 1, 65535); } else if(kex_algo == "CECPQ1") { // u16 blob reader.get_range(2, 1, 65535); } else if(kex_algo != "PSK") throw Decoding_Error("Server_Key_Exchange: Unsupported kex type " + kex_algo); m_params.assign(buf.data(), buf.data() + reader.read_so_far()); if(sig_algo != "") { if(version.supports_negotiable_signature_algorithms()) { m_hash_algo = Signature_Algorithms::hash_algo_name(reader.get_byte()); m_sig_algo = Signature_Algorithms::sig_algo_name(reader.get_byte()); } m_signature = reader.get_range(2, 0, 65535); } reader.assert_done(); } /** * Serialize a Server Key Exchange message */ std::vector Server_Key_Exchange::serialize() const { std::vector buf = params(); if(m_signature.size()) { // This should be an explicit version check if(m_hash_algo != "" && m_sig_algo != "") { buf.push_back(Signature_Algorithms::hash_algo_code(m_hash_algo)); buf.push_back(Signature_Algorithms::sig_algo_code(m_sig_algo)); } append_tls_length_value(buf, m_signature, 2); } return buf; } /** * Verify a Server Key Exchange message */ bool Server_Key_Exchange::verify(const Public_Key& server_key, const Handshake_State& state, const Policy& policy) const { policy.check_peer_key_acceptable(server_key); std::pair format = state.parse_sig_format(server_key, m_hash_algo, m_sig_algo, false, policy); std::vector buf = state.client_hello()->random(); buf += state.server_hello()->random(); buf += params(); const bool signature_valid = state.callbacks().tls_verify_message(server_key, format.first, format.second, buf, m_signature); #if defined(BOTAN_UNSAFE_FUZZER_MODE) return true; #else return signature_valid; #endif } const Private_Key& Server_Key_Exchange::server_kex_key() const { BOTAN_ASSERT_NONNULL(m_kex_key); return *m_kex_key; } } } botan-2.4.0/src/lib/tls/msg_session_ticket.cpp000066400000000000000000000026101322470703100213550ustar00rootroot00000000000000/* * Session Tickets * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace TLS { New_Session_Ticket::New_Session_Ticket(Handshake_IO& io, Handshake_Hash& hash, const std::vector& ticket, uint32_t lifetime) : m_ticket_lifetime_hint(lifetime), m_ticket(ticket) { hash.update(io.send(*this)); } New_Session_Ticket::New_Session_Ticket(Handshake_IO& io, Handshake_Hash& hash) { hash.update(io.send(*this)); } New_Session_Ticket::New_Session_Ticket(const std::vector& buf) { if(buf.size() < 6) throw Decoding_Error("Session ticket message too short to be valid"); TLS_Data_Reader reader("SessionTicket", buf); m_ticket_lifetime_hint = reader.get_uint32_t(); m_ticket = reader.get_range(2, 0, 65535); } std::vector New_Session_Ticket::serialize() const { std::vector buf(4); store_be(m_ticket_lifetime_hint, buf.data()); append_tls_length_value(buf, m_ticket, 2); return buf; } } } botan-2.4.0/src/lib/tls/sessions_sql/000077500000000000000000000000001322470703100175035ustar00rootroot00000000000000botan-2.4.0/src/lib/tls/sessions_sql/info.txt000066400000000000000000000001331322470703100211740ustar00rootroot00000000000000 TLS_SESSION_MANAGER_SQL_DB -> 20141219 pbkdf2 botan-2.4.0/src/lib/tls/sessions_sql/tls_session_manager_sql.cpp000066400000000000000000000142131322470703100251260ustar00rootroot00000000000000/* * SQL TLS Session Manager * (C) 2012,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace TLS { Session_Manager_SQL::Session_Manager_SQL(std::shared_ptr db, const std::string& passphrase, RandomNumberGenerator& rng, size_t max_sessions, std::chrono::seconds session_lifetime) : m_db(db), m_rng(rng), m_max_sessions(max_sessions), m_session_lifetime(session_lifetime) { m_db->create_table( "create table if not exists tls_sessions " "(" "session_id TEXT PRIMARY KEY, " "session_start INTEGER, " "hostname TEXT, " "hostport INTEGER, " "session BLOB" ")"); m_db->create_table( "create table if not exists tls_sessions_metadata " "(" "passphrase_salt BLOB, " "passphrase_iterations INTEGER, " "passphrase_check INTEGER " ")"); const size_t salts = m_db->row_count("tls_sessions_metadata"); std::unique_ptr pbkdf(get_pbkdf("PBKDF2(SHA-512)")); if(salts == 1) { // existing db auto stmt = m_db->new_statement("select * from tls_sessions_metadata"); if(stmt->step()) { std::pair salt = stmt->get_blob(0); const size_t iterations = stmt->get_size_t(1); const size_t check_val_db = stmt->get_size_t(2); secure_vector x = pbkdf->pbkdf_iterations(32 + 2, passphrase, salt.first, salt.second, iterations); const size_t check_val_created = make_uint16(x[0], x[1]); m_session_key.assign(x.begin() + 2, x.end()); if(check_val_created != check_val_db) throw Exception("Session database password not valid"); } } else { // maybe just zap the salts + sessions tables in this case? if(salts != 0) throw Exception("Seemingly corrupted database, multiple salts found"); // new database case std::vector salt = unlock(rng.random_vec(16)); size_t iterations = 0; secure_vector x = pbkdf->pbkdf_timed(32 + 2, passphrase, salt.data(), salt.size(), std::chrono::milliseconds(100), iterations); size_t check_val = make_uint16(x[0], x[1]); m_session_key.assign(x.begin() + 2, x.end()); auto stmt = m_db->new_statement("insert into tls_sessions_metadata values(?1, ?2, ?3)"); stmt->bind(1, salt); stmt->bind(2, iterations); stmt->bind(3, check_val); stmt->spin(); } } bool Session_Manager_SQL::load_from_session_id(const std::vector& session_id, Session& session) { auto stmt = m_db->new_statement("select session from tls_sessions where session_id = ?1"); stmt->bind(1, hex_encode(session_id)); while(stmt->step()) { std::pair blob = stmt->get_blob(0); try { session = Session::decrypt(blob.first, blob.second, m_session_key); return true; } catch(...) { } } return false; } bool Session_Manager_SQL::load_from_server_info(const Server_Information& server, Session& session) { auto stmt = m_db->new_statement("select session from tls_sessions" " where hostname = ?1 and hostport = ?2" " order by session_start desc"); stmt->bind(1, server.hostname()); stmt->bind(2, server.port()); while(stmt->step()) { std::pair blob = stmt->get_blob(0); try { session = Session::decrypt(blob.first, blob.second, m_session_key); return true; } catch(...) { } } return false; } void Session_Manager_SQL::remove_entry(const std::vector& session_id) { auto stmt = m_db->new_statement("delete from tls_sessions where session_id = ?1"); stmt->bind(1, hex_encode(session_id)); stmt->spin(); } size_t Session_Manager_SQL::remove_all() { auto stmt = m_db->new_statement("delete from tls_sessions"); return stmt->spin(); } void Session_Manager_SQL::save(const Session& session) { if(session.server_info().hostname().empty()) return; auto stmt = m_db->new_statement("insert or replace into tls_sessions" " values(?1, ?2, ?3, ?4, ?5)"); stmt->bind(1, hex_encode(session.session_id())); stmt->bind(2, session.start_time()); stmt->bind(3, session.server_info().hostname()); stmt->bind(4, session.server_info().port()); stmt->bind(5, session.encrypt(m_session_key, m_rng)); stmt->spin(); prune_session_cache(); } void Session_Manager_SQL::prune_session_cache() { // First expire old sessions auto remove_expired = m_db->new_statement("delete from tls_sessions where session_start <= ?1"); remove_expired->bind(1, std::chrono::system_clock::now() - m_session_lifetime); remove_expired->spin(); const size_t sessions = m_db->row_count("tls_sessions"); // Then if needed expire some more sessions at random if(sessions > m_max_sessions) { auto remove_some = m_db->new_statement("delete from tls_sessions where session_id in " "(select session_id from tls_sessions limit ?1)"); remove_some->bind(1, sessions - m_max_sessions); remove_some->spin(); } } } } botan-2.4.0/src/lib/tls/sessions_sql/tls_session_manager_sql.h000066400000000000000000000050471322470703100246000ustar00rootroot00000000000000/* * TLS Session Manager storing to encrypted SQL db table * (C) 2012,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SQL_SESSION_MANAGER_H_ #define BOTAN_TLS_SQL_SESSION_MANAGER_H_ #include #include namespace Botan { class RandomNumberGenerator; namespace TLS { /** * An implementation of Session_Manager that saves values in a SQL * database file, with the session data encrypted using a passphrase. * * @warning For clients, the hostnames associated with the saved * sessions are stored in the database in plaintext. This may be a * serious privacy risk in some situations. */ class BOTAN_PUBLIC_API(2,0) Session_Manager_SQL : public Session_Manager { public: /** * @param db A connection to the database to use The table names botan_tls_sessions and botan_tls_sessions_metadata will be used * @param passphrase used to encrypt the session data * @param rng a random number generator * @param max_sessions a hint on the maximum number of sessions * to keep in memory at any one time. (If zero, don't cap) * @param session_lifetime sessions are expired after this many * seconds have elapsed from initial handshake. */ Session_Manager_SQL(std::shared_ptr db, const std::string& passphrase, RandomNumberGenerator& rng, size_t max_sessions = 1000, std::chrono::seconds session_lifetime = std::chrono::seconds(7200)); Session_Manager_SQL(const Session_Manager_SQL&) = delete; Session_Manager_SQL& operator=(const Session_Manager_SQL&) = delete; bool load_from_session_id(const std::vector& session_id, Session& session) override; bool load_from_server_info(const Server_Information& info, Session& session) override; void remove_entry(const std::vector& session_id) override; size_t remove_all() override; void save(const Session& session_data) override; std::chrono::seconds session_lifetime() const override { return m_session_lifetime; } private: void prune_session_cache(); std::shared_ptr m_db; secure_vector m_session_key; RandomNumberGenerator& m_rng; size_t m_max_sessions; std::chrono::seconds m_session_lifetime; }; } } #endif botan-2.4.0/src/lib/tls/sessions_sqlite3/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/lib/tls/sessions_sqlite3/info.txt000066400000000000000000000001521322470703100217620ustar00rootroot00000000000000 TLS_SQLITE3_SESSION_MANAGER -> 20131128 sessions_sql sqlite3 botan-2.4.0/src/lib/tls/sessions_sqlite3/tls_session_manager_sqlite.cpp000066400000000000000000000015261322470703100264200ustar00rootroot00000000000000/* * SQLite TLS Session Manager * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace TLS { Session_Manager_SQLite::Session_Manager_SQLite(const std::string& passphrase, RandomNumberGenerator& rng, const std::string& db_filename, size_t max_sessions, std::chrono::seconds session_lifetime) : Session_Manager_SQL(std::make_shared(db_filename), passphrase, rng, max_sessions, session_lifetime) {} } } botan-2.4.0/src/lib/tls/sessions_sqlite3/tls_session_manager_sqlite.h000066400000000000000000000031751322470703100260670ustar00rootroot00000000000000/* * SQLite3 TLS Session Manager * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SQLITE3_SESSION_MANAGER_H_ #define BOTAN_TLS_SQLITE3_SESSION_MANAGER_H_ #include namespace Botan { class RandomNumberGenerator; namespace TLS { /** * An implementation of Session_Manager that saves values in a SQLite3 * database file, with the session data encrypted using a passphrase. * * @warning For clients, the hostnames associated with the saved * sessions are stored in the database in plaintext. This may be a * serious privacy risk in some situations. */ class BOTAN_PUBLIC_API(2,0) Session_Manager_SQLite final : public Session_Manager_SQL { public: /** * @param passphrase used to encrypt the session data * @param rng a random number generator * @param db_filename filename of the SQLite database file. The table names tls_sessions and tls_sessions_metadata will be used * @param max_sessions a hint on the maximum number of sessions * to keep in memory at any one time. (If zero, don't cap) * @param session_lifetime sessions are expired after this many * seconds have elapsed from initial handshake. */ Session_Manager_SQLite(const std::string& passphrase, RandomNumberGenerator& rng, const std::string& db_filename, size_t max_sessions = 1000, std::chrono::seconds session_lifetime = std::chrono::seconds(7200)); }; } } #endif botan-2.4.0/src/lib/tls/tls_alert.cpp000066400000000000000000000066101322470703100174560ustar00rootroot00000000000000/* * Alert Message * (C) 2004-2006,2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace TLS { Alert::Alert(const secure_vector& buf) { if(buf.size() != 2) throw Decoding_Error("Alert: Bad size " + std::to_string(buf.size()) + " for alert message"); if(buf[0] == 1) m_fatal = false; else if(buf[0] == 2) m_fatal = true; else throw Decoding_Error("Alert: Bad code for alert level"); const uint8_t dc = buf[1]; m_type_code = static_cast(dc); } std::vector Alert::serialize() const { return std::vector({ static_cast(is_fatal() ? 2 : 1), static_cast(type()) }); } std::string Alert::type_string() const { switch(type()) { case CLOSE_NOTIFY: return "close_notify"; case UNEXPECTED_MESSAGE: return "unexpected_message"; case BAD_RECORD_MAC: return "bad_record_mac"; case DECRYPTION_FAILED: return "decryption_failed"; case RECORD_OVERFLOW: return "record_overflow"; case DECOMPRESSION_FAILURE: return "decompression_failure"; case HANDSHAKE_FAILURE: return "handshake_failure"; case NO_CERTIFICATE: return "no_certificate"; case BAD_CERTIFICATE: return "bad_certificate"; case UNSUPPORTED_CERTIFICATE: return "unsupported_certificate"; case CERTIFICATE_REVOKED: return "certificate_revoked"; case CERTIFICATE_EXPIRED: return "certificate_expired"; case CERTIFICATE_UNKNOWN: return "certificate_unknown"; case ILLEGAL_PARAMETER: return "illegal_parameter"; case UNKNOWN_CA: return "unknown_ca"; case ACCESS_DENIED: return "access_denied"; case DECODE_ERROR: return "decode_error"; case DECRYPT_ERROR: return "decrypt_error"; case EXPORT_RESTRICTION: return "export_restriction"; case PROTOCOL_VERSION: return "protocol_version"; case INSUFFICIENT_SECURITY: return "insufficient_security"; case INTERNAL_ERROR: return "internal_error"; case INAPPROPRIATE_FALLBACK: return "inappropriate_fallback"; case USER_CANCELED: return "user_canceled"; case NO_RENEGOTIATION: return "no_renegotiation"; case UNSUPPORTED_EXTENSION: return "unsupported_extension"; case CERTIFICATE_UNOBTAINABLE: return "certificate_unobtainable"; case UNRECOGNIZED_NAME: return "unrecognized_name"; case BAD_CERTIFICATE_STATUS_RESPONSE: return "bad_certificate_status_response"; case BAD_CERTIFICATE_HASH_VALUE: return "bad_certificate_hash_value"; case UNKNOWN_PSK_IDENTITY: return "unknown_psk_identity"; case NO_APPLICATION_PROTOCOL: return "no_application_protocol"; case NULL_ALERT: return "none"; } /* * This is effectively the default case for the switch above, but we * leave it out so that when an alert type is added to the enum the * compiler can warn us that it is not included in the switch * statement. */ return "unrecognized_alert_" + std::to_string(type()); } } } botan-2.4.0/src/lib/tls/tls_alert.h000066400000000000000000000060701322470703100171230ustar00rootroot00000000000000/* * Alert Message * (C) 2004-2006,2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_ALERT_H_ #define BOTAN_TLS_ALERT_H_ #include #include namespace Botan { namespace TLS { /** * SSL/TLS Alert Message */ class BOTAN_PUBLIC_API(2,0) Alert final { public: /** * Type codes for TLS alerts */ enum Type { CLOSE_NOTIFY = 0, UNEXPECTED_MESSAGE = 10, BAD_RECORD_MAC = 20, DECRYPTION_FAILED = 21, RECORD_OVERFLOW = 22, DECOMPRESSION_FAILURE = 30, HANDSHAKE_FAILURE = 40, NO_CERTIFICATE = 41, // SSLv3 only BAD_CERTIFICATE = 42, UNSUPPORTED_CERTIFICATE = 43, CERTIFICATE_REVOKED = 44, CERTIFICATE_EXPIRED = 45, CERTIFICATE_UNKNOWN = 46, ILLEGAL_PARAMETER = 47, UNKNOWN_CA = 48, ACCESS_DENIED = 49, DECODE_ERROR = 50, DECRYPT_ERROR = 51, EXPORT_RESTRICTION = 60, PROTOCOL_VERSION = 70, INSUFFICIENT_SECURITY = 71, INTERNAL_ERROR = 80, INAPPROPRIATE_FALLBACK = 86, USER_CANCELED = 90, NO_RENEGOTIATION = 100, UNSUPPORTED_EXTENSION = 110, CERTIFICATE_UNOBTAINABLE = 111, UNRECOGNIZED_NAME = 112, BAD_CERTIFICATE_STATUS_RESPONSE = 113, BAD_CERTIFICATE_HASH_VALUE = 114, UNKNOWN_PSK_IDENTITY = 115, NO_APPLICATION_PROTOCOL = 120, // RFC 7301 // pseudo alert values NULL_ALERT = 256 }; /** * @return true iff this alert is non-empty */ bool is_valid() const { return (m_type_code != NULL_ALERT); } /** * @return if this alert is a fatal one or not */ bool is_fatal() const { return m_fatal; } /** * @return type of alert */ Type type() const { return m_type_code; } /** * @return type of alert */ std::string type_string() const; /** * Serialize an alert */ std::vector serialize() const; /** * Deserialize an Alert message * @param buf the serialized alert */ explicit Alert(const secure_vector& buf); /** * Create a new Alert * @param type_code the type of alert * @param fatal specifies if this is a fatal alert */ Alert(Type type_code, bool fatal = false) : m_fatal(fatal), m_type_code(type_code) {} Alert() : m_fatal(false), m_type_code(NULL_ALERT) {} private: bool m_fatal; Type m_type_code; }; } } #endif botan-2.4.0/src/lib/tls/tls_blocking.cpp000066400000000000000000000056451322470703100201460ustar00rootroot00000000000000/* * TLS Blocking API * (C) 2013 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace TLS { using namespace std::placeholders; Blocking_Client::Blocking_Client(read_fn reader, write_fn writer, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& server_info, const Protocol_Version& offer_version, const std::vector& next) : m_read(reader), m_callbacks(new TLS::Compat_Callbacks( /* we are ok using deprecated features here because the whole Blocking_Client class is also deprecated, so just silence the warning. */ TLS::Compat_Callbacks::SILENCE_DEPRECATION_WARNING::PLEASE, writer, std::bind(&Blocking_Client::data_cb, this, _1, _2), std::function(std::bind(&Blocking_Client::alert_cb, this, _1)), std::bind(&Blocking_Client::handshake_cb, this, _1) )), m_channel(*m_callbacks.get(), session_manager, creds, policy, rng, server_info, offer_version, next) { } bool Blocking_Client::handshake_cb(const Session& session) { return this->handshake_complete(session); } void Blocking_Client::alert_cb(const Alert& alert) { this->alert_notification(alert); } void Blocking_Client::data_cb(const uint8_t data[], size_t data_len) { m_plaintext.insert(m_plaintext.end(), data, data + data_len); } void Blocking_Client::do_handshake() { std::vector readbuf(4096); while(!m_channel.is_closed() && !m_channel.is_active()) { const size_t from_socket = m_read(readbuf.data(), readbuf.size()); m_channel.received_data(readbuf.data(), from_socket); } } size_t Blocking_Client::read(uint8_t buf[], size_t buf_len) { std::vector readbuf(4096); while(m_plaintext.empty() && !m_channel.is_closed()) { const size_t from_socket = m_read(readbuf.data(), readbuf.size()); m_channel.received_data(readbuf.data(), from_socket); } const size_t returned = std::min(buf_len, m_plaintext.size()); for(size_t i = 0; i != returned; ++i) buf[i] = m_plaintext[i]; m_plaintext.erase(m_plaintext.begin(), m_plaintext.begin() + returned); BOTAN_ASSERT_IMPLICATION(returned == 0, m_channel.is_closed(), "Only return zero if channel is closed"); return returned; } } } botan-2.4.0/src/lib/tls/tls_blocking.h000066400000000000000000000055521322470703100176100ustar00rootroot00000000000000/* * TLS Blocking API * (C) 2013 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_BLOCKING_CHANNELS_H_ #define BOTAN_TLS_BLOCKING_CHANNELS_H_ #include namespace Botan { namespace TLS { /** * Blocking TLS Client * Can be used directly, or subclass to get handshake and alert notifications */ class BOTAN_PUBLIC_API(2,0) Blocking_Client { public: /* * These functions are expected to block until completing entirely, or * fail by throwing an exception. */ typedef std::function read_fn; typedef std::function write_fn; BOTAN_DEPRECATED("Use the regular TLS::Client interface") Blocking_Client(read_fn reader, write_fn writer, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& server_info = Server_Information(), const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(), const std::vector& next_protos = {}); /** * Completes full handshake then returns */ void do_handshake(); /** * Number of bytes pending read in the plaintext buffer (bytes * readable without blocking) */ size_t pending() const { return m_plaintext.size(); } /** * Blocking read, will return at least 1 byte (eventually) or else 0 if the connection * is closed. */ size_t read(uint8_t buf[], size_t buf_len); void write(const uint8_t buf[], size_t buf_len) { m_channel.send(buf, buf_len); } const TLS::Channel& underlying_channel() const { return m_channel; } TLS::Channel& underlying_channel() { return m_channel; } void close() { m_channel.close(); } bool is_closed() const { return m_channel.is_closed(); } std::vector peer_cert_chain() const { return m_channel.peer_cert_chain(); } virtual ~Blocking_Client() = default; protected: /** * Application can override to get the handshake complete notification */ virtual bool handshake_complete(const Session&) { return true; } /** * Application can override to get notification of alerts */ virtual void alert_notification(const Alert&) {} private: bool handshake_cb(const Session&); void data_cb(const uint8_t data[], size_t data_len); void alert_cb(const Alert& alert); read_fn m_read; std::unique_ptr m_callbacks; TLS::Client m_channel; secure_vector m_plaintext; }; } } #endif botan-2.4.0/src/lib/tls/tls_callbacks.cpp000066400000000000000000000124461322470703100202720ustar00rootroot00000000000000/* * TLS Callbacks * (C) 2016 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_CURVE_25519) #include #endif namespace Botan { void TLS::Callbacks::tls_inspect_handshake_msg(const Handshake_Message&) { // default is no op } std::string TLS::Callbacks::tls_server_choose_app_protocol(const std::vector&) { return ""; } void TLS::Callbacks::tls_verify_cert_chain( const std::vector& cert_chain, const std::vector>& ocsp_responses, const std::vector& trusted_roots, Usage_Type usage, const std::string& hostname, const TLS::Policy& policy) { if(cert_chain.empty()) throw Invalid_Argument("Certificate chain was empty"); Path_Validation_Restrictions restrictions(policy.require_cert_revocation_info(), policy.minimum_signature_strength()); Path_Validation_Result result = x509_path_validate(cert_chain, restrictions, trusted_roots, (usage == Usage_Type::TLS_SERVER_AUTH ? hostname : ""), usage, std::chrono::system_clock::now(), tls_verify_cert_chain_ocsp_timeout(), ocsp_responses); if(!result.successful_validation()) throw Exception("Certificate validation failure: " + result.result_string()); } std::vector TLS::Callbacks::tls_sign_message( const Private_Key& key, RandomNumberGenerator& rng, const std::string& emsa, Signature_Format format, const std::vector& msg) { PK_Signer signer(key, rng, emsa, format); return signer.sign_message(msg, rng); } bool TLS::Callbacks::tls_verify_message( const Public_Key& key, const std::string& emsa, Signature_Format format, const std::vector& msg, const std::vector& sig) { PK_Verifier verifier(key, emsa, format); return verifier.verify_message(msg, sig); } std::pair, std::vector> TLS::Callbacks::tls_dh_agree( const std::vector& modulus, const std::vector& generator, const std::vector& peer_public_value, const Policy& policy, RandomNumberGenerator& rng) { BigInt p = BigInt::decode(modulus); BigInt g = BigInt::decode(generator); BigInt Y = BigInt::decode(peer_public_value); /* * A basic check for key validity. As we do not know q here we * cannot check that Y is in the right subgroup. However since * our key is ephemeral there does not seem to be any * advantage to bogus keys anyway. */ if(Y <= 1 || Y >= p - 1) throw TLS_Exception(Alert::INSUFFICIENT_SECURITY, "Server sent bad DH key for DHE exchange"); DL_Group group(p, g); if(!group.verify_group(rng, false)) throw TLS_Exception(Alert::INSUFFICIENT_SECURITY, "DH group validation failed"); DH_PublicKey peer_key(group, Y); policy.check_peer_key_acceptable(peer_key); DH_PrivateKey priv_key(rng, group); PK_Key_Agreement ka(priv_key, rng, "Raw"); secure_vector dh_secret = CT::strip_leading_zeros( ka.derive_key(0, peer_key.public_value()).bits_of()); return std::make_pair(dh_secret, priv_key.public_value()); } std::pair, std::vector> TLS::Callbacks::tls_ecdh_agree( const std::string& curve_name, const std::vector& peer_public_value, const Policy& policy, RandomNumberGenerator& rng, bool compressed) { secure_vector ecdh_secret; std::vector our_public_value; if(curve_name == "x25519") { #if defined(BOTAN_HAS_CURVE_25519) if(peer_public_value.size() != 32) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Invalid X25519 key size"); } Curve25519_PublicKey peer_key(peer_public_value); policy.check_peer_key_acceptable(peer_key); Curve25519_PrivateKey priv_key(rng); PK_Key_Agreement ka(priv_key, rng, "Raw"); ecdh_secret = ka.derive_key(0, peer_key.public_value()).bits_of(); // X25519 is always compressed but sent as "uncompressed" in TLS our_public_value = priv_key.public_value(); #else throw Internal_Error("Negotiated X25519 somehow, but it is disabled"); #endif } else { EC_Group group(OIDS::lookup(curve_name)); ECDH_PublicKey peer_key(group, OS2ECP(peer_public_value, group.get_curve())); policy.check_peer_key_acceptable(peer_key); ECDH_PrivateKey priv_key(rng, group); PK_Key_Agreement ka(priv_key, rng, "Raw"); ecdh_secret = ka.derive_key(0, peer_key.public_value()).bits_of(); our_public_value = priv_key.public_value(compressed ? PointGFp::COMPRESSED : PointGFp::UNCOMPRESSED); } return std::make_pair(ecdh_secret, our_public_value); } } botan-2.4.0/src/lib/tls/tls_callbacks.h000066400000000000000000000366751322470703100177510ustar00rootroot00000000000000/* * TLS Callbacks * (C) 2016 Matthias Gierlings * 2016 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_CALLBACKS_H_ #define BOTAN_TLS_CALLBACKS_H_ #include #include #include #include namespace Botan { class Certificate_Store; class X509_Certificate; namespace OCSP { class Response; } namespace TLS { class Handshake_Message; class Policy; /** * Encapsulates the callbacks that a TLS channel will make which are due to * channel specific operations. */ class BOTAN_PUBLIC_API(2,0) Callbacks { public: virtual ~Callbacks() = default; /** * Mandatory callback: output function * The channel will call this with data which needs to be sent to the peer * (eg, over a socket or some other form of IPC). The array will be overwritten * when the function returns so a copy must be made if the data cannot be * sent immediately. * * @param data the vector of data to send * * @param size the number of bytes to send */ virtual void tls_emit_data(const uint8_t data[], size_t size) = 0; /** * Mandatory callback: process application data * Called when application data record is received from the peer. * Again the array is overwritten immediately after the function returns. * * @param seq_no the underlying TLS/DTLS record sequence number * * @param data the vector containing the received record * * @param size the length of the received record, in bytes */ virtual void tls_record_received(uint64_t seq_no, const uint8_t data[], size_t size) = 0; /** * Mandatory callback: alert received * Called when an alert is received from the peer * If fatal, the connection is closing. If not fatal, the connection may * still be closing (depending on the error and the peer). * * @param alert the source of the alert */ virtual void tls_alert(Alert alert) = 0; /** * Mandatory callback: session established * Called when a session is established. Throw an exception to abort * the connection. * * @param session the session descriptor * * @return return false to prevent the session from being cached, * return true to cache the session in the configured session manager */ virtual bool tls_session_established(const Session& session) = 0; /** * Optional callback: session activated * Called when a session is active and can be written to */ virtual void tls_session_activated() {} /** * Optional callback with default impl: verify cert chain * * Default implementation performs a standard PKIX validation * and initiates network OCSP request for end-entity cert. * Override to provide different behavior. * * Check the certificate chain is valid up to a trusted root, and * optionally (if hostname != "") that the hostname given is * consistent with the leaf certificate. * * This function should throw an exception derived from * std::exception with an informative what() result if the * certificate chain cannot be verified. * * @param cert_chain specifies a certificate chain leading to a * trusted root CA certificate. * @param ocsp_responses the server may have provided some * @param trusted_roots the list of trusted certificates * @param usage what this cert chain is being used for * Usage_Type::TLS_SERVER_AUTH for server chains, * Usage_Type::TLS_CLIENT_AUTH for client chains, * Usage_Type::UNSPECIFIED for other uses * @param hostname when authenticating a server, this is the hostname * the client requested (eg via SNI). When authenticating a client, * this is the server name the client is authenticating *to*. * Empty in other cases or if no hostname was used. * @param policy the TLS policy associated with the session being authenticated * using the certificate chain */ virtual void tls_verify_cert_chain( const std::vector& cert_chain, const std::vector>& ocsp_responses, const std::vector& trusted_roots, Usage_Type usage, const std::string& hostname, const TLS::Policy& policy); /** * Called by default `tls_verify_cert_chain` to get the timeout to use for OCSP * requests. Return 0 to disable online OCSP checks. */ virtual std::chrono::milliseconds tls_verify_cert_chain_ocsp_timeout() const { return std::chrono::milliseconds(0); } /** * Optional callback with default impl: sign a message * * Default implementation uses PK_Signer::sign_message(). * Override to provide a different approach, e.g. using an external device. * * @param key the private key of the signer * @param rng a random number generator * @param emsa the encoding method to be applied to the message * @param format the signature format * @param msg the input data for the signature * * @return the signature */ virtual std::vector tls_sign_message( const Private_Key& key, RandomNumberGenerator& rng, const std::string& emsa, Signature_Format format, const std::vector& msg); /** * Optional callback with default impl: verify a message signature * * Default implementation uses PK_Verifier::verify_message(). * Override to provide a different approach, e.g. using an external device. * * @param key the public key of the signer * @param emsa the encoding method to be applied to the message * @param format the signature format * @param msg the input data for the signature * @param sig the signature to be checked * * @return true if the signature is valid, false otherwise */ virtual bool tls_verify_message( const Public_Key& key, const std::string& emsa, Signature_Format format, const std::vector& msg, const std::vector& sig); /** * Optional callback with default impl: client side DH agreement * * Default implementation uses PK_Key_Agreement::derive_key(). * Override to provide a different approach, e.g. using an external device. * * @param modulus the modulus p of the discrete logarithm group * @param generator the generator of the DH subgroup * @param peer_public_value the public value of the peer * @param policy the TLS policy associated with the session being established * @param rng a random number generator * * @return a pair consisting of the agreed raw secret and our public value */ virtual std::pair, std::vector> tls_dh_agree( const std::vector& modulus, const std::vector& generator, const std::vector& peer_public_value, const Policy& policy, RandomNumberGenerator& rng); /** * Optional callback with default impl: client side ECDH agreement * * Default implementation uses PK_Key_Agreement::derive_key(). * Override to provide a different approach, e.g. using an external device. * * @param curve_name the name of the elliptic curve * @param peer_public_value the public value of the peer * @param policy the TLS policy associated with the session being established * @param rng a random number generator * @param compressed the compression preference for our public value * * @return a pair consisting of the agreed raw secret and our public value */ virtual std::pair, std::vector> tls_ecdh_agree( const std::string& curve_name, const std::vector& peer_public_value, const Policy& policy, RandomNumberGenerator& rng, bool compressed); /** * Optional callback: inspect handshake message * Throw an exception to abort the handshake. * Default simply ignores the message. * * @param message the handshake message */ virtual void tls_inspect_handshake_msg(const Handshake_Message& message); /** * Optional callback for server: choose ALPN protocol * ALPN (RFC 7301) works by the client sending a list of application * protocols it is willing to negotiate. The server then selects which * protocol to use, which is not necessarily even on the list that * the client sent. * * @param client_protos the vector of protocols the client is willing to negotiate * * @return the protocol selected by the server, which need not be on the * list that the client sent; if this is the empty string, the server ignores the * client ALPN extension. Default return value is empty string. */ virtual std::string tls_server_choose_app_protocol(const std::vector& client_protos); /** * Optional callback: error logging. (not currently called) * @param err An error message related to this connection. */ virtual void tls_log_error(const char* err) { BOTAN_UNUSED(err); } /** * Optional callback: debug logging. (not currently called) * @param what Some hopefully informative string */ virtual void tls_log_debug(const char* what) { BOTAN_UNUSED(what); } /** * Optional callback: debug logging taking a buffer. (not currently called) * @param descr What this buffer is * @param val the bytes * @param val_len length of val */ virtual void tls_log_debug_bin(const char* descr, const uint8_t val[], size_t val_len) { BOTAN_UNUSED(descr, val, val_len); } }; /** * TLS::Callbacks using std::function for compatability with the old API signatures. * This type is only provided for backward compatibility. * New implementations should derive from TLS::Callbacks instead. */ class BOTAN_PUBLIC_API(2,0) Compat_Callbacks final : public Callbacks { public: typedef std::function output_fn; typedef std::function data_cb; typedef std::function alert_cb; typedef std::function handshake_cb; typedef std::function handshake_msg_cb; typedef std::function)> next_protocol_fn; /** * @param output_fn is called with data for the outbound socket * * @param app_data_cb is called when new application data is received * * @param alert_cb is called when a TLS alert is received * * @param hs_cb is called when a handshake is completed * * @param hs_msg_cb is called for each handshake message received * * @param next_proto is called with ALPN protocol data sent by the client */ BOTAN_DEPRECATED("Use TLS::Callbacks (virtual interface).") Compat_Callbacks(output_fn output_fn, data_cb app_data_cb, alert_cb alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) : m_output_function(output_fn), m_app_data_cb(app_data_cb), m_alert_cb(std::bind(alert_cb, std::placeholders::_1, nullptr, 0)), m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {} BOTAN_DEPRECATED("Use TLS::Callbacks (virtual interface).") Compat_Callbacks(output_fn output_fn, data_cb app_data_cb, std::function alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) : m_output_function(output_fn), m_app_data_cb(app_data_cb), m_alert_cb(alert_cb), m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {} enum class SILENCE_DEPRECATION_WARNING { PLEASE = 0 }; Compat_Callbacks(SILENCE_DEPRECATION_WARNING, output_fn output_fn, data_cb app_data_cb, std::function alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) : m_output_function(output_fn), m_app_data_cb(app_data_cb), m_alert_cb(alert_cb), m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {} Compat_Callbacks(SILENCE_DEPRECATION_WARNING, output_fn output_fn, data_cb app_data_cb, alert_cb alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb = nullptr, next_protocol_fn next_proto = nullptr) : m_output_function(output_fn), m_app_data_cb(app_data_cb), m_alert_cb(std::bind(alert_cb, std::placeholders::_1, nullptr, 0)), m_hs_cb(hs_cb), m_hs_msg_cb(hs_msg_cb), m_next_proto(next_proto) {} void tls_emit_data(const uint8_t data[], size_t size) override { BOTAN_ASSERT(m_output_function != nullptr, "Invalid TLS output function callback."); m_output_function(data, size); } void tls_record_received(uint64_t /*seq_no*/, const uint8_t data[], size_t size) override { BOTAN_ASSERT(m_app_data_cb != nullptr, "Invalid TLS app data callback."); m_app_data_cb(data, size); } void tls_alert(Alert alert) override { BOTAN_ASSERT(m_alert_cb != nullptr, "Invalid TLS alert callback."); m_alert_cb(alert); } bool tls_session_established(const Session& session) override { BOTAN_ASSERT(m_hs_cb != nullptr, "Invalid TLS handshake callback."); return m_hs_cb(session); } std::string tls_server_choose_app_protocol(const std::vector& client_protos) override { if(m_next_proto != nullptr) { return m_next_proto(client_protos); } return ""; } void tls_inspect_handshake_msg(const Handshake_Message& hmsg) override { // The handshake message callback is optional so we can // not assume it has been set. if(m_hs_msg_cb != nullptr) { m_hs_msg_cb(hmsg); } } private: const output_fn m_output_function; const data_cb m_app_data_cb; const std::function m_alert_cb; const handshake_cb m_hs_cb; const handshake_msg_cb m_hs_msg_cb; const next_protocol_fn m_next_proto; }; } } #endif botan-2.4.0/src/lib/tls/tls_cbc/000077500000000000000000000000001322470703100163675ustar00rootroot00000000000000botan-2.4.0/src/lib/tls/tls_cbc/info.txt000066400000000000000000000001721322470703100200630ustar00rootroot00000000000000 TLS_CBC -> 20161008 tls_cbc.h cbc hmac botan-2.4.0/src/lib/tls/tls_cbc/tls_cbc.cpp000066400000000000000000000370661322470703100205200ustar00rootroot00000000000000/* * TLS CBC Record Handling * (C) 2012,2013,2014,2015,2016 Jack Lloyd * (C) 2016 Juraj Somorovsky * (C) 2016 Matthias Gierlings * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace TLS { /* * TLS_CBC_HMAC_AEAD_Mode Constructor */ TLS_CBC_HMAC_AEAD_Mode::TLS_CBC_HMAC_AEAD_Mode(Cipher_Dir dir, const std::string& cipher_name, size_t cipher_keylen, const std::string& mac_name, size_t mac_keylen, bool use_explicit_iv, bool use_encrypt_then_mac) : m_cipher_name(cipher_name), m_mac_name(mac_name), m_cipher_keylen(cipher_keylen), m_mac_keylen(mac_keylen), m_use_encrypt_then_mac(use_encrypt_then_mac) { m_mac = MessageAuthenticationCode::create_or_throw("HMAC(" + m_mac_name + ")"); std::unique_ptr cipher = BlockCipher::create_or_throw(m_cipher_name); m_tag_size = m_mac->output_length(); m_block_size = cipher->block_size(); m_iv_size = use_explicit_iv ? m_block_size : 0; if(dir == ENCRYPTION) m_cbc.reset(new CBC_Encryption(cipher.release(), new Null_Padding)); else m_cbc.reset(new CBC_Decryption(cipher.release(), new Null_Padding)); } void TLS_CBC_HMAC_AEAD_Mode::clear() { cbc().clear(); mac().clear(); reset(); } void TLS_CBC_HMAC_AEAD_Mode::reset() { cbc_state().clear(); m_ad.clear(); m_msg.clear(); } std::string TLS_CBC_HMAC_AEAD_Mode::name() const { return "TLS_CBC(" + m_cipher_name + "," + m_mac_name + ")"; } size_t TLS_CBC_HMAC_AEAD_Mode::update_granularity() const { return 1; // just buffers anyway } bool TLS_CBC_HMAC_AEAD_Mode::valid_nonce_length(size_t nl) const { if(m_cbc_state.empty()) return nl == block_size(); return nl == iv_size(); } Key_Length_Specification TLS_CBC_HMAC_AEAD_Mode::key_spec() const { return Key_Length_Specification(m_cipher_keylen + m_mac_keylen); } void TLS_CBC_HMAC_AEAD_Mode::key_schedule(const uint8_t key[], size_t keylen) { // Both keys are of fixed length specified by the ciphersuite if(keylen != m_cipher_keylen + m_mac_keylen) throw Invalid_Key_Length(name(), keylen); cbc().set_key(&key[0], m_cipher_keylen); mac().set_key(&key[m_cipher_keylen], m_mac_keylen); } void TLS_CBC_HMAC_AEAD_Mode::start_msg(const uint8_t nonce[], size_t nonce_len) { if(!valid_nonce_length(nonce_len)) { throw Invalid_IV_Length(name(), nonce_len); } m_msg.clear(); if(nonce_len > 0) { m_cbc_state.assign(nonce, nonce + nonce_len); } } size_t TLS_CBC_HMAC_AEAD_Mode::process(uint8_t buf[], size_t sz) { m_msg.insert(m_msg.end(), buf, buf + sz); return 0; } std::vector TLS_CBC_HMAC_AEAD_Mode::assoc_data_with_len(uint16_t len) { std::vector ad = m_ad; BOTAN_ASSERT(ad.size() == 13, "Expected AAD size"); ad[11] = get_byte(0, len); ad[12] = get_byte(1, len); return ad; } void TLS_CBC_HMAC_AEAD_Mode::set_associated_data(const uint8_t ad[], size_t ad_len) { if(ad_len != 13) throw Exception("Invalid TLS AEAD associated data length"); m_ad.assign(ad, ad + ad_len); } void TLS_CBC_HMAC_AEAD_Encryption::set_associated_data(const uint8_t ad[], size_t ad_len) { TLS_CBC_HMAC_AEAD_Mode::set_associated_data(ad, ad_len); if(use_encrypt_then_mac()) { // AAD hack for EtM const uint16_t pt_size = make_uint16(assoc_data()[11], assoc_data()[12]); const uint16_t enc_size = round_up(iv_size() + pt_size + 1, block_size()); assoc_data()[11] = get_byte(0, enc_size); assoc_data()[12] = get_byte(1, enc_size); } } void TLS_CBC_HMAC_AEAD_Encryption::cbc_encrypt_record(uint8_t buf[], size_t buf_size) { cbc().start(cbc_state()); cbc().process(buf, buf_size); cbc_state().assign(buf + buf_size - block_size(), buf + buf_size); } size_t TLS_CBC_HMAC_AEAD_Encryption::output_length(size_t input_length) const { return round_up(input_length + 1 + (use_encrypt_then_mac() ? 0 : tag_size()), block_size()) + (use_encrypt_then_mac() ? tag_size() : 0); } void TLS_CBC_HMAC_AEAD_Encryption::finish(secure_vector& buffer, size_t offset) { update(buffer, offset); buffer.resize(offset); // truncate, leaving just header const size_t header_size = offset; buffer.insert(buffer.end(), msg().begin(), msg().end()); const size_t input_size = msg().size() + 1 + (use_encrypt_then_mac() ? 0 : tag_size()); const size_t enc_size = round_up(input_size, block_size()); const size_t pad_val = enc_size - input_size; const size_t buf_size = enc_size + (use_encrypt_then_mac() ? tag_size() : 0); BOTAN_ASSERT(enc_size % block_size() == 0, "Buffer is an even multiple of block size"); mac().update(assoc_data()); if(use_encrypt_then_mac()) { if(iv_size() > 0) { mac().update(cbc_state()); } for(size_t i = 0; i != pad_val + 1; ++i) buffer.push_back(static_cast(pad_val)); cbc_encrypt_record(&buffer[header_size], enc_size); } // EtM also uses ciphertext size instead of plaintext size for AEAD input const uint8_t* mac_input = (use_encrypt_then_mac() ? &buffer[header_size] : msg().data()); const size_t mac_input_len = (use_encrypt_then_mac() ? enc_size : msg().size()); mac().update(mac_input, mac_input_len); buffer.resize(buffer.size() + tag_size()); mac().final(&buffer[buffer.size() - tag_size()]); if(use_encrypt_then_mac() == false) { for(size_t i = 0; i != pad_val + 1; ++i) buffer.push_back(static_cast(pad_val)); cbc_encrypt_record(&buffer[header_size], buf_size); } } /* * Checks the TLS padding. Returns 0 if the padding is invalid (we * count the padding_length field as part of the padding size so a * valid padding will always be at least one byte long), or the length * of the padding otherwise. This is actually padding_length + 1 * because both the padding and padding_length fields are padding from * our perspective. * * Returning 0 in the error case should ensure the MAC check will fail. * This approach is suggested in section 6.2.3.2 of RFC 5246. */ uint16_t check_tls_cbc_padding(const uint8_t record[], size_t record_len) { if(record_len == 0 || record_len > 0xFFFF) return 0; const uint16_t rec16 = static_cast(record_len); /* * TLS v1.0 and up require all the padding bytes be the same value * and allows up to 255 bytes. */ const uint16_t to_check = std::min(256, record_len); const uint8_t pad_byte = record[record_len-1]; const uint16_t pad_bytes = 1 + pad_byte; uint16_t pad_invalid = CT::is_less(rec16, pad_bytes); for(uint16_t i = rec16 - to_check; i != rec16; ++i) { const uint16_t offset = rec16 - i; const uint16_t in_pad_range = CT::is_lte(offset, pad_bytes); pad_invalid |= (in_pad_range & (record[i] ^ pad_byte)); } const uint16_t pad_invalid_mask = CT::expand_mask(pad_invalid); return CT::select(pad_invalid_mask, 0, pad_byte + 1); } void TLS_CBC_HMAC_AEAD_Decryption::cbc_decrypt_record(uint8_t record_contents[], size_t record_len) { if(record_len == 0 || record_len % block_size() != 0) throw Decoding_Error("Received TLS CBC ciphertext with invalid length"); cbc().start(cbc_state()); cbc_state().assign(record_contents + record_len - block_size(), record_contents + record_len); cbc().process(record_contents, record_len); } size_t TLS_CBC_HMAC_AEAD_Decryption::output_length(size_t) const { /* * We don't know this because the padding is arbitrary */ return 0; } /* * This function performs additional compression calls in order * to protect from the Lucky 13 attack. It adds new compression * function calls over dummy data, by computing additional HMAC updates. * * The countermeasure was described (in a similar way) in the Lucky 13 paper. * * Background: * - One SHA-1/SHA-256 compression is performed with 64 bytes of data. * - HMAC adds 8 byte length field and padding (at least 1 byte) so that we have: * - 0 - 55 bytes: 1 compression * - 56 - 55+64 bytes: 2 compressions * - 56+64 - 55+2*64 bytes: 3 compressions ... * - For SHA-384, this works similarly, but we have 128 byte blocks and 16 byte * long length field. This results in: * - 0 - 111 bytes: 1 compression * - 112 - 111+128 bytes: 2 compressions ... * * The implemented countermeasure works as follows: * 1) It computes max_compressions: number of maximum compressions performed on * the decrypted data * 2) It computes current_compressions: number of compressions performed on the * decrypted data, after padding has been removed * 3) If current_compressions != max_compressions: It invokes an HMAC update * over dummy data so that (max_compressions - current_compressions) * compressions are performed. Otherwise, it invokes an HMAC update so that * no compressions are performed. * * Note that the padding validation in Botan is always performed over * min(plen,256) bytes, see the function check_tls_cbc_padding. This differs * from the countermeasure described in the paper. * * Note that the padding length padlen does also count the last byte * of the decrypted plaintext. This is different from the Lucky 13 paper. * * This countermeasure leaves a difference of about 100 clock cycles (in * comparison to >1000 clock cycles observed without it). * * plen represents the length of the decrypted plaintext message P * padlen represents the padding length * */ void TLS_CBC_HMAC_AEAD_Decryption::perform_additional_compressions(size_t plen, size_t padlen) { uint16_t block_size; uint16_t max_bytes_in_first_block; if(mac().name() == "HMAC(SHA-384)") { block_size = 128; max_bytes_in_first_block = 111; } else { block_size = 64; max_bytes_in_first_block = 55; } // number of maximum MACed bytes const uint16_t L1 = static_cast(13 + plen - tag_size()); // number of current MACed bytes (L1 - padlen) // Here the Lucky 13 paper is different because the padlen length in the paper // does not count the last message byte. const uint16_t L2 = static_cast(13 + plen - padlen - tag_size()); // From the paper, for SHA-256/SHA-1 compute: ceil((L1-55)/64) and ceil((L2-55)/64) // ceil((L1-55)/64) = floor((L1+64-1-55)/64) // Here we compute number of compressions for SHA-* in general const uint16_t max_compresssions = ( (L1 + block_size - 1 - max_bytes_in_first_block) / block_size); const uint16_t current_compressions = ((L2 + block_size - 1 - max_bytes_in_first_block) / block_size); // number of additional compressions we have to perform const uint16_t add_compressions = max_compresssions - current_compressions; const uint8_t equal = CT::is_equal(max_compresssions, current_compressions) & 0x01; // We compute the data length we need to achieve the number of compressions. // If there are no compressions, we just add 55/111 dummy bytes so that no // compression is performed. const uint16_t data_len = block_size * add_compressions + equal * max_bytes_in_first_block; secure_vector data(data_len); mac().update(unlock(data)); // we do not need to clear the MAC since the connection is broken anyway } void TLS_CBC_HMAC_AEAD_Decryption::finish(secure_vector& buffer, size_t offset) { update(buffer, offset); buffer.resize(offset); const size_t record_len = msg().size(); uint8_t* record_contents = msg().data(); // This early exit does not leak info because all the values compared are public if(record_len < tag_size() || (record_len - (use_encrypt_then_mac() ? tag_size() : 0)) % block_size() != 0) { throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure"); } if(use_encrypt_then_mac()) { const size_t enc_size = record_len - tag_size(); mac().update(assoc_data_with_len(iv_size() + enc_size)); if(iv_size() > 0) { mac().update(cbc_state()); } mac().update(record_contents, enc_size); std::vector mac_buf(tag_size()); mac().final(mac_buf.data()); const size_t mac_offset = enc_size; const bool mac_ok = constant_time_compare(&record_contents[mac_offset], mac_buf.data(), tag_size()); if(!mac_ok) { throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure"); } cbc_decrypt_record(record_contents, enc_size); // 0 if padding was invalid, otherwise 1 + padding_bytes uint16_t pad_size = check_tls_cbc_padding(record_contents, enc_size); // No oracle here, whoever sent us this had the key since MAC check passed if(pad_size == 0) { throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure"); } const uint8_t* plaintext_block = &record_contents[0]; const size_t plaintext_length = enc_size - pad_size; buffer.insert(buffer.end(), plaintext_block, plaintext_block + plaintext_length); } else { cbc_decrypt_record(record_contents, record_len); CT::poison(record_contents, record_len); // 0 if padding was invalid, otherwise 1 + padding_bytes uint16_t pad_size = check_tls_cbc_padding(record_contents, record_len); /* This mask is zero if there is not enough room in the packet to get a valid MAC. We have to accept empty packets, since otherwise we are not compatible with how OpenSSL's countermeasure for fixing BEAST in TLS 1.0 CBC works (sending empty records, instead of 1/(n-1) splitting) */ const uint16_t size_ok_mask = CT::is_lte(static_cast(tag_size() + pad_size), static_cast(record_len + 1)); pad_size &= size_ok_mask; CT::unpoison(record_contents, record_len); /* This is unpoisoned sooner than it should. The pad_size leaks to plaintext_length and then to the timing channel in the MAC computation described in the Lucky 13 paper. */ CT::unpoison(pad_size); const uint8_t* plaintext_block = &record_contents[0]; const uint16_t plaintext_length = static_cast(record_len - tag_size() - pad_size); mac().update(assoc_data_with_len(plaintext_length)); mac().update(plaintext_block, plaintext_length); std::vector mac_buf(tag_size()); mac().final(mac_buf.data()); const size_t mac_offset = record_len - (tag_size() + pad_size); const bool mac_ok = constant_time_compare(&record_contents[mac_offset], mac_buf.data(), tag_size()); const uint16_t ok_mask = size_ok_mask & CT::expand_mask(mac_ok) & CT::expand_mask(pad_size); CT::unpoison(ok_mask); if(ok_mask) { buffer.insert(buffer.end(), plaintext_block, plaintext_block + plaintext_length); } else { perform_additional_compressions(record_len, pad_size); throw TLS_Exception(Alert::BAD_RECORD_MAC, "Message authentication failure"); } } } } } botan-2.4.0/src/lib/tls/tls_cbc/tls_cbc.h000066400000000000000000000131411322470703100201510ustar00rootroot00000000000000/* * TLS CBC+HMAC AEAD * (C) 2016 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_CBC_HMAC_AEAD_H_ #define BOTAN_TLS_CBC_HMAC_AEAD_H_ #include #include #include namespace Botan { namespace TLS { /** * TLS CBC+HMAC AEAD base class (GenericBlockCipher in TLS spec) * This is the weird TLS-specific mode, not for general consumption. */ class BOTAN_TEST_API TLS_CBC_HMAC_AEAD_Mode : public AEAD_Mode { public: size_t process(uint8_t buf[], size_t sz) override final; std::string name() const override final; void set_associated_data(const uint8_t ad[], size_t ad_len) override; size_t update_granularity() const override final; Key_Length_Specification key_spec() const override final; bool valid_nonce_length(size_t nl) const override final; size_t tag_size() const override final { return m_tag_size; } size_t default_nonce_length() const override final { return m_iv_size; } void clear() override final; void reset() override final; protected: TLS_CBC_HMAC_AEAD_Mode(Cipher_Dir direction, const std::string& cipher_name, size_t cipher_keylen, const std::string& mac_name, size_t mac_keylen, bool use_explicit_iv, bool use_encrypt_then_mac); size_t cipher_keylen() const { return m_cipher_keylen; } size_t mac_keylen() const { return m_mac_keylen; } size_t iv_size() const { return m_iv_size; } size_t block_size() const { return m_block_size; } bool use_encrypt_then_mac() const { return m_use_encrypt_then_mac; } Cipher_Mode& cbc() const { return *m_cbc; } MessageAuthenticationCode& mac() const { BOTAN_ASSERT_NONNULL(m_mac); return *m_mac; } secure_vector& cbc_state() { return m_cbc_state; } std::vector& assoc_data() { return m_ad; } secure_vector& msg() { return m_msg; } std::vector assoc_data_with_len(uint16_t len); private: void start_msg(const uint8_t nonce[], size_t nonce_len) override final; void key_schedule(const uint8_t key[], size_t length) override final; const std::string m_cipher_name; const std::string m_mac_name; size_t m_cipher_keylen; size_t m_mac_keylen; size_t m_iv_size; size_t m_tag_size; size_t m_block_size; bool m_use_encrypt_then_mac; std::unique_ptr m_cbc; std::unique_ptr m_mac; secure_vector m_cbc_state; std::vector m_ad; secure_vector m_msg; }; /** * TLS_CBC_HMAC_AEAD Encryption */ class BOTAN_TEST_API TLS_CBC_HMAC_AEAD_Encryption final : public TLS_CBC_HMAC_AEAD_Mode { public: /** */ TLS_CBC_HMAC_AEAD_Encryption(const std::string& cipher_algo, const size_t cipher_keylen, const std::string& mac_algo, const size_t mac_keylen, bool use_explicit_iv, bool use_encrypt_then_mac) : TLS_CBC_HMAC_AEAD_Mode(ENCRYPTION, cipher_algo, cipher_keylen, mac_algo, mac_keylen, use_explicit_iv, use_encrypt_then_mac) {} void set_associated_data(const uint8_t ad[], size_t ad_len) override; size_t output_length(size_t input_length) const override; size_t minimum_final_size() const override { return 0; } void finish(secure_vector& final_block, size_t offset = 0) override; private: void cbc_encrypt_record(uint8_t record_contents[], size_t record_len); }; /** * TLS_CBC_HMAC_AEAD Decryption */ class BOTAN_TEST_API TLS_CBC_HMAC_AEAD_Decryption final : public TLS_CBC_HMAC_AEAD_Mode { public: /** */ TLS_CBC_HMAC_AEAD_Decryption(const std::string& cipher_algo, const size_t cipher_keylen, const std::string& mac_algo, const size_t mac_keylen, bool use_explicit_iv, bool use_encrypt_then_mac) : TLS_CBC_HMAC_AEAD_Mode(DECRYPTION, cipher_algo, cipher_keylen, mac_algo, mac_keylen, use_explicit_iv, use_encrypt_then_mac) {} size_t output_length(size_t input_length) const override; size_t minimum_final_size() const override { return tag_size(); } void finish(secure_vector& final_block, size_t offset = 0) override; private: void cbc_decrypt_record(uint8_t record_contents[], size_t record_len); void perform_additional_compressions(size_t plen, size_t padlen); }; /** * Check the TLS padding of a record * @param record the record bits * @param record_len length of record * @return 0 if padding is invalid, otherwise padding_bytes + 1 */ BOTAN_TEST_API uint16_t check_tls_cbc_padding(const uint8_t record[], size_t record_len); } } #endif botan-2.4.0/src/lib/tls/tls_channel.cpp000066400000000000000000000527301322470703100177630ustar00rootroot00000000000000/* * TLS Channels * (C) 2011,2012,2014,2015,2016 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { size_t TLS::Channel::IO_BUF_DEFAULT_SIZE = 10*1024; Channel::Channel(Callbacks& callbacks, Session_Manager& session_manager, RandomNumberGenerator& rng, const Policy& policy, bool is_datagram, size_t reserved_io_buffer_size) : m_is_datagram(is_datagram), m_callbacks(callbacks), m_session_manager(session_manager), m_policy(policy), m_rng(rng) { init(reserved_io_buffer_size); } Channel::Channel(output_fn out, data_cb app_data_cb, alert_cb alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, RandomNumberGenerator& rng, const Policy& policy, bool is_datagram, size_t io_buf_sz) : m_is_datagram(is_datagram), m_compat_callbacks(new Compat_Callbacks( /* this Channel constructor is also deprecated so its ok that it relies on a deprecated API */ Compat_Callbacks::SILENCE_DEPRECATION_WARNING::PLEASE, out, app_data_cb, alert_cb, hs_cb, hs_msg_cb)), m_callbacks(*m_compat_callbacks.get()), m_session_manager(session_manager), m_policy(policy), m_rng(rng) { init(io_buf_sz); } void Channel::init(size_t io_buf_sz) { /* epoch 0 is plaintext, thus null cipher state */ m_write_cipher_states[0] = nullptr; m_read_cipher_states[0] = nullptr; m_writebuf.reserve(io_buf_sz); m_readbuf.reserve(io_buf_sz); } void Channel::reset_state() { m_active_state.reset(); m_pending_state.reset(); m_readbuf.clear(); m_write_cipher_states.clear(); m_read_cipher_states.clear(); } Channel::~Channel() { // So unique_ptr destructors run correctly } Connection_Sequence_Numbers& Channel::sequence_numbers() const { BOTAN_ASSERT(m_sequence_numbers, "Have a sequence numbers object"); return *m_sequence_numbers; } std::shared_ptr Channel::read_cipher_state_epoch(uint16_t epoch) const { auto i = m_read_cipher_states.find(epoch); if(i == m_read_cipher_states.end()) throw Internal_Error("TLS::Channel No read cipherstate for epoch " + std::to_string(epoch)); return i->second; } std::shared_ptr Channel::write_cipher_state_epoch(uint16_t epoch) const { auto i = m_write_cipher_states.find(epoch); if(i == m_write_cipher_states.end()) throw Internal_Error("TLS::Channel No write cipherstate for epoch " + std::to_string(epoch)); return i->second; } std::vector Channel::peer_cert_chain() const { if(auto active = active_state()) return get_peer_cert_chain(*active); return std::vector(); } bool Channel::save_session(const Session& session) { return callbacks().tls_session_established(session); } Handshake_State& Channel::create_handshake_state(Protocol_Version version) { if(pending_state()) throw Internal_Error("create_handshake_state called during handshake"); if(auto active = active_state()) { Protocol_Version active_version = active->version(); if(active_version.is_datagram_protocol() != version.is_datagram_protocol()) throw Exception("Active state using version " + active_version.to_string() + " cannot change to " + version.to_string() + " in pending"); } if(!m_sequence_numbers) { if(version.is_datagram_protocol()) m_sequence_numbers.reset(new Datagram_Sequence_Numbers); else m_sequence_numbers.reset(new Stream_Sequence_Numbers); } using namespace std::placeholders; std::unique_ptr io; if(version.is_datagram_protocol()) { io.reset(new Datagram_Handshake_IO( std::bind(&Channel::send_record_under_epoch, this, _1, _2, _3), sequence_numbers(), static_cast(m_policy.dtls_default_mtu()), m_policy.dtls_initial_timeout(), m_policy.dtls_maximum_timeout())); } else { io.reset(new Stream_Handshake_IO(std::bind(&Channel::send_record, this, _1, _2))); } m_pending_state.reset(new_handshake_state(io.release())); if(auto active = active_state()) m_pending_state->set_version(active->version()); return *m_pending_state.get(); } bool Channel::timeout_check() { if(m_pending_state) return m_pending_state->handshake_io().timeout_check(); //FIXME: scan cipher suites and remove epochs older than 2*MSL return false; } void Channel::renegotiate(bool force_full_renegotiation) { if(pending_state()) // currently in handshake? return; if(auto active = active_state()) initiate_handshake(create_handshake_state(active->version()), force_full_renegotiation); else throw Exception("Cannot renegotiate on inactive connection"); } void Channel::change_cipher_spec_reader(Connection_Side side) { auto pending = pending_state(); BOTAN_ASSERT(pending && pending->server_hello(), "Have received server hello"); if(pending->server_hello()->compression_method() != NO_COMPRESSION) throw Internal_Error("Negotiated unknown compression algorithm"); sequence_numbers().new_read_cipher_state(); const uint16_t epoch = sequence_numbers().current_read_epoch(); BOTAN_ASSERT(m_read_cipher_states.count(epoch) == 0, "No read cipher state currently set for next epoch"); // flip side as we are reading std::shared_ptr read_state( new Connection_Cipher_State(pending->version(), (side == CLIENT) ? SERVER : CLIENT, false, pending->ciphersuite(), pending->session_keys(), pending->server_hello()->supports_encrypt_then_mac())); m_read_cipher_states[epoch] = read_state; } void Channel::change_cipher_spec_writer(Connection_Side side) { auto pending = pending_state(); BOTAN_ASSERT(pending && pending->server_hello(), "Have received server hello"); if(pending->server_hello()->compression_method() != NO_COMPRESSION) throw Internal_Error("Negotiated unknown compression algorithm"); sequence_numbers().new_write_cipher_state(); const uint16_t epoch = sequence_numbers().current_write_epoch(); BOTAN_ASSERT(m_write_cipher_states.count(epoch) == 0, "No write cipher state currently set for next epoch"); std::shared_ptr write_state( new Connection_Cipher_State(pending->version(), side, true, pending->ciphersuite(), pending->session_keys(), pending->server_hello()->supports_encrypt_then_mac())); m_write_cipher_states[epoch] = write_state; } bool Channel::is_active() const { return (active_state() != nullptr); } bool Channel::is_closed() const { if(active_state() || pending_state()) return false; /* * If no active or pending state, then either we had a connection * and it has been closed, or we are a server which has never * received a connection. This case is detectable by also lacking * m_sequence_numbers */ return (m_sequence_numbers != nullptr); } void Channel::activate_session() { std::swap(m_active_state, m_pending_state); m_pending_state.reset(); if(!m_active_state->version().is_datagram_protocol()) { // TLS is easy just remove all but the current state const uint16_t current_epoch = sequence_numbers().current_write_epoch(); const auto not_current_epoch = [current_epoch](uint16_t epoch) { return (epoch != current_epoch); }; map_remove_if(not_current_epoch, m_write_cipher_states); map_remove_if(not_current_epoch, m_read_cipher_states); } callbacks().tls_session_activated(); } size_t Channel::received_data(const std::vector& buf) { return this->received_data(buf.data(), buf.size()); } size_t Channel::received_data(const uint8_t input[], size_t input_size) { try { while(!is_closed() && input_size) { secure_vector record_data; uint64_t record_sequence = 0; Record_Type record_type = NO_RECORD; Protocol_Version record_version; size_t consumed = 0; Record_Raw_Input raw_input(input, input_size, consumed, m_is_datagram); Record record(record_data, &record_sequence, &record_version, &record_type); const size_t needed = read_record(m_readbuf, raw_input, record, m_sequence_numbers.get(), std::bind(&TLS::Channel::read_cipher_state_epoch, this, std::placeholders::_1)); BOTAN_ASSERT(consumed > 0, "Got to eat something"); BOTAN_ASSERT(consumed <= input_size, "Record reader consumed sane amount"); input += consumed; input_size -= consumed; BOTAN_ASSERT(input_size == 0 || needed == 0, "Got a full record or consumed all input"); if(input_size == 0 && needed != 0) return needed; // need more data to complete record if(record_data.size() > MAX_PLAINTEXT_SIZE) throw TLS_Exception(Alert::RECORD_OVERFLOW, "TLS plaintext record is larger than allowed maximum"); if(record_type == HANDSHAKE || record_type == CHANGE_CIPHER_SPEC) { process_handshake_ccs(record_data, record_sequence, record_type, record_version); } else if(record_type == APPLICATION_DATA) { process_application_data(record_sequence, record_data); } else if(record_type == ALERT) { process_alert(record_data); } else if(record_type != NO_RECORD) throw Unexpected_Message("Unexpected record type " + std::to_string(record_type) + " from counterparty"); } return 0; // on a record boundary } catch(TLS_Exception& e) { send_fatal_alert(e.type()); throw; } catch(Integrity_Failure&) { send_fatal_alert(Alert::BAD_RECORD_MAC); throw; } catch(Decoding_Error&) { send_fatal_alert(Alert::DECODE_ERROR); throw; } catch(...) { send_fatal_alert(Alert::INTERNAL_ERROR); throw; } } void Channel::process_handshake_ccs(const secure_vector& record, uint64_t record_sequence, Record_Type record_type, Protocol_Version record_version) { if(!m_pending_state) { // No pending handshake, possibly new: if(record_version.is_datagram_protocol()) { if(m_sequence_numbers) { /* * Might be a peer retransmit under epoch - 1 in which * case we must retransmit last flight */ sequence_numbers().read_accept(record_sequence); const uint16_t epoch = record_sequence >> 48; if(epoch == sequence_numbers().current_read_epoch()) { create_handshake_state(record_version); } else if(epoch == sequence_numbers().current_read_epoch() - 1) { BOTAN_ASSERT(m_active_state, "Have active state here"); m_active_state->handshake_io().add_record(unlock(record), record_type, record_sequence); } } else if(record_sequence == 0) { create_handshake_state(record_version); } } else { create_handshake_state(record_version); } } // May have been created in above conditional if(m_pending_state) { m_pending_state->handshake_io().add_record(unlock(record), record_type, record_sequence); while(auto pending = m_pending_state.get()) { auto msg = pending->get_next_handshake_msg(); if(msg.first == HANDSHAKE_NONE) // no full handshake yet break; process_handshake_msg(active_state(), *pending, msg.first, msg.second); } } } void Channel::process_application_data(uint64_t seq_no, const secure_vector& record) { if(!active_state()) throw Unexpected_Message("Application data before handshake done"); /* * OpenSSL among others sends empty records in versions * before TLS v1.1 in order to randomize the IV of the * following record. Avoid spurious callbacks. */ if(record.size() > 0) callbacks().tls_record_received(seq_no, record.data(), record.size()); } void Channel::process_alert(const secure_vector& record) { Alert alert_msg(record); if(alert_msg.type() == Alert::NO_RENEGOTIATION) m_pending_state.reset(); callbacks().tls_alert(alert_msg); if(alert_msg.is_fatal()) { if(auto active = active_state()) m_session_manager.remove_entry(active->server_hello()->session_id()); } if(alert_msg.type() == Alert::CLOSE_NOTIFY) send_warning_alert(Alert::CLOSE_NOTIFY); // reply in kind if(alert_msg.type() == Alert::CLOSE_NOTIFY || alert_msg.is_fatal()) { reset_state(); } } void Channel::write_record(Connection_Cipher_State* cipher_state, uint16_t epoch, uint8_t record_type, const uint8_t input[], size_t length) { BOTAN_ASSERT(m_pending_state || m_active_state, "Some connection state exists"); Protocol_Version record_version = (m_pending_state) ? (m_pending_state->version()) : (m_active_state->version()); Record_Message record_message(record_type, 0, input, length); TLS::write_record(m_writebuf, record_message, record_version, sequence_numbers().next_write_sequence(epoch), cipher_state, m_rng); callbacks().tls_emit_data(m_writebuf.data(), m_writebuf.size()); } void Channel::send_record_array(uint16_t epoch, uint8_t type, const uint8_t input[], size_t length) { if(length == 0) return; /* * In versions without an explicit IV field (only TLS v1.0 now that * SSLv3 has been removed) send a single byte record first to randomize * the following (implicit) IV of the following record. * * This isn't needed in TLS v1.1 or higher. * * An empty record also works but apparently some implementations do * not like this (https://bugzilla.mozilla.org/show_bug.cgi?id=665814) * * See https://www.openssl.org/~bodo/tls-cbc.txt for background. */ auto cipher_state = write_cipher_state_epoch(epoch); if(type == APPLICATION_DATA && m_active_state->version().supports_explicit_cbc_ivs() == false) { write_record(cipher_state.get(), epoch, type, input, 1); input += 1; length -= 1; } while(length) { const size_t sending = std::min(length, MAX_PLAINTEXT_SIZE); write_record(cipher_state.get(), epoch, type, input, sending); input += sending; length -= sending; } } void Channel::send_record(uint8_t record_type, const std::vector& record) { send_record_array(sequence_numbers().current_write_epoch(), record_type, record.data(), record.size()); } void Channel::send_record_under_epoch(uint16_t epoch, uint8_t record_type, const std::vector& record) { send_record_array(epoch, record_type, record.data(), record.size()); } void Channel::send(const uint8_t buf[], size_t buf_size) { if(!is_active()) throw Exception("Data cannot be sent on inactive TLS connection"); send_record_array(sequence_numbers().current_write_epoch(), APPLICATION_DATA, buf, buf_size); } void Channel::send(const std::string& string) { this->send(cast_char_ptr_to_uint8(string.data()), string.size()); } void Channel::send_alert(const Alert& alert) { if(alert.is_valid() && !is_closed()) { try { send_record(ALERT, alert.serialize()); } catch(...) { /* swallow it */ } } if(alert.type() == Alert::NO_RENEGOTIATION) m_pending_state.reset(); if(alert.is_fatal()) if(auto active = active_state()) m_session_manager.remove_entry(active->server_hello()->session_id()); if(alert.type() == Alert::CLOSE_NOTIFY || alert.is_fatal()) reset_state(); } void Channel::secure_renegotiation_check(const Client_Hello* client_hello) { const bool secure_renegotiation = client_hello->secure_renegotiation(); if(auto active = active_state()) { const bool active_sr = active->client_hello()->secure_renegotiation(); if(active_sr != secure_renegotiation) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client changed its mind about secure renegotiation"); } if(secure_renegotiation) { const std::vector& data = client_hello->renegotiation_info(); if(data != secure_renegotiation_data_for_client_hello()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client sent bad values for secure renegotiation"); } } void Channel::secure_renegotiation_check(const Server_Hello* server_hello) { const bool secure_renegotiation = server_hello->secure_renegotiation(); if(auto active = active_state()) { const bool active_sr = active->server_hello()->secure_renegotiation(); if(active_sr != secure_renegotiation) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server changed its mind about secure renegotiation"); } if(secure_renegotiation) { const std::vector& data = server_hello->renegotiation_info(); if(data != secure_renegotiation_data_for_server_hello()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server sent bad values for secure renegotiation"); } } std::vector Channel::secure_renegotiation_data_for_client_hello() const { if(auto active = active_state()) return active->client_finished()->verify_data(); return std::vector(); } std::vector Channel::secure_renegotiation_data_for_server_hello() const { if(auto active = active_state()) { std::vector buf = active->client_finished()->verify_data(); buf += active->server_finished()->verify_data(); return buf; } return std::vector(); } bool Channel::secure_renegotiation_supported() const { if(auto active = active_state()) return active->server_hello()->secure_renegotiation(); if(auto pending = pending_state()) if(auto hello = pending->server_hello()) return hello->secure_renegotiation(); return false; } SymmetricKey Channel::key_material_export(const std::string& label, const std::string& context, size_t length) const { if(auto active = active_state()) { std::unique_ptr prf(active->protocol_specific_prf()); const secure_vector& master_secret = active->session_keys().master_secret(); std::vector salt; salt += active->client_hello()->random(); salt += active->server_hello()->random(); if(context != "") { size_t context_size = context.length(); if(context_size > 0xFFFF) throw Exception("key_material_export context is too long"); salt.push_back(get_byte(0, static_cast(context_size))); salt.push_back(get_byte(1, static_cast(context_size))); salt += to_byte_vector(context); } return prf->derive_key(length, master_secret, salt, to_byte_vector(label)); } else throw Exception("Channel::key_material_export connection not active"); } } } botan-2.4.0/src/lib/tls/tls_channel.h000066400000000000000000000236171322470703100174320ustar00rootroot00000000000000/* * TLS Channel * (C) 2011,2012,2014,2015 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_CHANNEL_H_ #define BOTAN_TLS_CHANNEL_H_ #include #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { class Connection_Cipher_State; class Connection_Sequence_Numbers; class Handshake_State; class Handshake_Message; class Client_Hello; class Server_Hello; class Policy; /** * Generic interface for TLS endpoint */ class BOTAN_PUBLIC_API(2,0) Channel { public: typedef std::function output_fn; typedef std::function data_cb; typedef std::function alert_cb; typedef std::function handshake_cb; typedef std::function handshake_msg_cb; static size_t IO_BUF_DEFAULT_SIZE; /** * Set up a new TLS session * * @param callbacks contains a set of callback function references * required by the TLS endpoint. * * @param session_manager manages session state * * @param rng a random number generator * * @param policy specifies other connection policy information * * @param is_datagram whether this is a DTLS session * * @param io_buf_sz This many bytes of memory will * be preallocated for the read and write buffers. Smaller * values just mean reallocations and copies are more likely. */ Channel(Callbacks& callbacks, Session_Manager& session_manager, RandomNumberGenerator& rng, const Policy& policy, bool is_datagram, size_t io_buf_sz = IO_BUF_DEFAULT_SIZE); /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new implementations. * (Not marked deprecated since it is only called internally, by * other deprecated constructors) */ Channel(output_fn out, data_cb app_data_cb, alert_cb alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, RandomNumberGenerator& rng, const Policy& policy, bool is_datagram, size_t io_buf_sz = IO_BUF_DEFAULT_SIZE); Channel(const Channel&) = delete; Channel& operator=(const Channel&) = delete; virtual ~Channel(); /** * Inject TLS traffic received from counterparty * @return a hint as the how many more bytes we need to process the * current record (this may be 0 if on a record boundary) */ size_t received_data(const uint8_t buf[], size_t buf_size); /** * Inject TLS traffic received from counterparty * @return a hint as the how many more bytes we need to process the * current record (this may be 0 if on a record boundary) */ size_t received_data(const std::vector& buf); /** * Inject plaintext intended for counterparty * Throws an exception if is_active() is false */ void send(const uint8_t buf[], size_t buf_size); /** * Inject plaintext intended for counterparty * Throws an exception if is_active() is false */ void send(const std::string& val); /** * Inject plaintext intended for counterparty * Throws an exception if is_active() is false */ template void send(const std::vector& val) { send(val.data(), val.size()); } /** * Send a TLS alert message. If the alert is fatal, the internal * state (keys, etc) will be reset. * @param alert the Alert to send */ void send_alert(const Alert& alert); /** * Send a warning alert */ void send_warning_alert(Alert::Type type) { send_alert(Alert(type, false)); } /** * Send a fatal alert */ void send_fatal_alert(Alert::Type type) { send_alert(Alert(type, true)); } /** * Send a close notification alert */ void close() { send_warning_alert(Alert::CLOSE_NOTIFY); } /** * @return true iff the connection is active for sending application data */ bool is_active() const; /** * @return true iff the connection has been definitely closed */ bool is_closed() const; /** * @return certificate chain of the peer (may be empty) */ std::vector peer_cert_chain() const; /** * Key material export (RFC 5705) * @param label a disambiguating label string * @param context a per-association context value * @param length the length of the desired key in bytes * @return key of length bytes */ SymmetricKey key_material_export(const std::string& label, const std::string& context, size_t length) const; /** * Attempt to renegotiate the session * @param force_full_renegotiation if true, require a full renegotiation, * otherwise allow session resumption */ void renegotiate(bool force_full_renegotiation = false); /** * @return true iff the counterparty supports the secure * renegotiation extensions. */ bool secure_renegotiation_supported() const; /** * Perform a handshake timeout check. This does nothing unless * this is a DTLS channel with a pending handshake state, in * which case we check for timeout and potentially retransmit * handshake packets. */ bool timeout_check(); protected: virtual void process_handshake_msg(const Handshake_State* active_state, Handshake_State& pending_state, Handshake_Type type, const std::vector& contents) = 0; virtual void initiate_handshake(Handshake_State& state, bool force_full_renegotiation) = 0; virtual std::vector get_peer_cert_chain(const Handshake_State& state) const = 0; virtual Handshake_State* new_handshake_state(class Handshake_IO* io) = 0; Handshake_State& create_handshake_state(Protocol_Version version); void inspect_handshake_message(const Handshake_Message& msg); void activate_session(); void change_cipher_spec_reader(Connection_Side side); void change_cipher_spec_writer(Connection_Side side); /* secure renegotiation handling */ void secure_renegotiation_check(const Client_Hello* client_hello); void secure_renegotiation_check(const Server_Hello* server_hello); std::vector secure_renegotiation_data_for_client_hello() const; std::vector secure_renegotiation_data_for_server_hello() const; RandomNumberGenerator& rng() { return m_rng; } Session_Manager& session_manager() { return m_session_manager; } const Policy& policy() const { return m_policy; } bool save_session(const Session& session); Callbacks& callbacks() const { return m_callbacks; } private: void init(size_t io_buf_sze); void send_record(uint8_t record_type, const std::vector& record); void send_record_under_epoch(uint16_t epoch, uint8_t record_type, const std::vector& record); void send_record_array(uint16_t epoch, uint8_t record_type, const uint8_t input[], size_t length); void write_record(Connection_Cipher_State* cipher_state, uint16_t epoch, uint8_t type, const uint8_t input[], size_t length); Connection_Sequence_Numbers& sequence_numbers() const; std::shared_ptr read_cipher_state_epoch(uint16_t epoch) const; std::shared_ptr write_cipher_state_epoch(uint16_t epoch) const; void reset_state(); const Handshake_State* active_state() const { return m_active_state.get(); } const Handshake_State* pending_state() const { return m_pending_state.get(); } /* methods to handle incoming traffic through Channel::receive_data. */ void process_handshake_ccs(const secure_vector& record, uint64_t record_sequence, Record_Type record_type, Protocol_Version record_version); void process_application_data(uint64_t req_no, const secure_vector& record); void process_alert(const secure_vector& record); bool m_is_datagram; /* callbacks */ std::unique_ptr m_compat_callbacks; Callbacks& m_callbacks; /* external state */ Session_Manager& m_session_manager; const Policy& m_policy; RandomNumberGenerator& m_rng; /* sequence number state */ std::unique_ptr m_sequence_numbers; /* pending and active connection states */ std::unique_ptr m_active_state; std::unique_ptr m_pending_state; /* cipher states for each epoch */ std::map> m_write_cipher_states; std::map> m_read_cipher_states; /* I/O buffers */ secure_vector m_writebuf; secure_vector m_readbuf; }; } } #endif botan-2.4.0/src/lib/tls/tls_ciphersuite.cpp000066400000000000000000000070001322470703100206650ustar00rootroot00000000000000/* * TLS Cipher Suite * (C) 2004-2010,2012,2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace TLS { bool Ciphersuite::is_scsv(uint16_t suite) { // TODO: derive from IANA file in script return (suite == 0x00FF || suite == 0x5600); } bool Ciphersuite::psk_ciphersuite() const { return (kex_algo() == "PSK" || kex_algo() == "DHE_PSK" || kex_algo() == "ECDHE_PSK"); } bool Ciphersuite::ecc_ciphersuite() const { return (sig_algo() == "ECDSA" || kex_algo() == "ECDH" || kex_algo() == "ECDHE_PSK"); } bool Ciphersuite::cbc_ciphersuite() const { return (mac_algo() != "AEAD"); } Ciphersuite Ciphersuite::by_id(uint16_t suite) { const std::vector& all_suites = all_known_ciphersuites(); auto s = std::lower_bound(all_suites.begin(), all_suites.end(), suite); if(s != all_suites.end() && s->ciphersuite_code() == suite) { return *s; } return Ciphersuite(); // some unknown ciphersuite } namespace { bool have_hash(const std::string& prf) { return (HashFunction::providers(prf).size() > 0); } bool have_cipher(const std::string& cipher) { return (BlockCipher::providers(cipher).size() > 0) || (StreamCipher::providers(cipher).size() > 0); } } bool Ciphersuite::is_usable() const { if(!m_cipher_keylen) // uninitialized object return false; if(!have_hash(prf_algo())) return false; #if !defined(BOTAN_HAS_TLS_CBC) if(cbc_ciphersuite()) return false; #endif if(mac_algo() == "AEAD") { if(cipher_algo() == "ChaCha20Poly1305") { #if !defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305) return false; #endif } else { auto cipher_and_mode = split_on(cipher_algo(), '/'); BOTAN_ASSERT(cipher_and_mode.size() == 2, "Expected format for AEAD algo"); if(!have_cipher(cipher_and_mode[0])) return false; const auto mode = cipher_and_mode[1]; #if !defined(BOTAN_HAS_AEAD_CCM) if(mode == "CCM" || mode == "CCM-8") return false; #endif #if !defined(BOTAN_HAS_AEAD_GCM) if(mode == "GCM") return false; #endif #if !defined(BOTAN_HAS_AEAD_OCB) if(mode == "OCB(12)" || mode == "OCB") return false; #endif } } else { // Old non-AEAD schemes if(!have_cipher(cipher_algo())) return false; if(!have_hash(mac_algo())) // HMAC return false; } if(kex_algo() == "SRP_SHA") { #if !defined(BOTAN_HAS_SRP6) return false; #endif } else if(kex_algo() == "ECDH" || kex_algo() == "ECDHE_PSK") { #if !defined(BOTAN_HAS_ECDH) return false; #endif } else if(kex_algo() == "DH" || kex_algo() == "DHE_PSK") { #if !defined(BOTAN_HAS_DIFFIE_HELLMAN) return false; #endif } else if(kex_algo() == "CECPQ1") { #if !defined(BOTAN_HAS_CECPQ1) return false; #endif } if(sig_algo() == "DSA") { #if !defined(BOTAN_HAS_DSA) return false; #endif } else if(sig_algo() == "ECDSA") { #if !defined(BOTAN_HAS_ECDSA) return false; #endif } else if(sig_algo() == "RSA") { #if !defined(BOTAN_HAS_RSA) return false; #endif } return true; } } } botan-2.4.0/src/lib/tls/tls_ciphersuite.h000066400000000000000000000110771322470703100203430ustar00rootroot00000000000000/* * TLS Cipher Suites * (C) 2004-2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_CIPHER_SUITES_H_ #define BOTAN_TLS_CIPHER_SUITES_H_ #include #include #include namespace Botan { namespace TLS { /** * Ciphersuite Information */ class BOTAN_PUBLIC_API(2,0) Ciphersuite final { public: /** * Convert an SSL/TLS ciphersuite to algorithm fields * @param suite the ciphersuite code number * @return ciphersuite object */ static Ciphersuite by_id(uint16_t suite); /** * Returns true iff this suite is a known SCSV */ static bool is_scsv(uint16_t suite); /** * Generate a static list of all known ciphersuites and return it. * * @return list of all known ciphersuites */ static const std::vector& all_known_ciphersuites(); /** * Formats the ciphersuite back to an RFC-style ciphersuite string * @return RFC ciphersuite string identifier */ std::string to_string() const { return m_iana_id; } /** * @return ciphersuite number */ uint16_t ciphersuite_code() const { return m_ciphersuite_code; } /** * @return true if this is a PSK ciphersuite */ bool psk_ciphersuite() const; /** * @return true if this is an ECC ciphersuite */ bool ecc_ciphersuite() const; /** * @return true if this suite uses a CBC cipher */ bool cbc_ciphersuite() const; /** * @return key exchange algorithm used by this ciphersuite */ std::string kex_algo() const { return m_kex_algo; } /** * @return signature algorithm used by this ciphersuite */ std::string sig_algo() const { return m_sig_algo; } /** * @return symmetric cipher algorithm used by this ciphersuite */ std::string cipher_algo() const { return m_cipher_algo; } /** * @return message authentication algorithm used by this ciphersuite */ std::string mac_algo() const { return m_mac_algo; } std::string prf_algo() const { if(m_prf_algo && *m_prf_algo) return m_prf_algo; return m_mac_algo; } /** * @return cipher key length used by this ciphersuite */ size_t cipher_keylen() const { return m_cipher_keylen; } size_t nonce_bytes_from_record() const { return m_nonce_bytes_from_record; } size_t nonce_bytes_from_handshake() const { return m_nonce_bytes_from_handshake; } size_t mac_keylen() const { return m_mac_keylen; } /** * @return true if this is a valid/known ciphersuite */ bool valid() const { return m_usable; } bool operator<(const Ciphersuite& o) const { return ciphersuite_code() < o.ciphersuite_code(); } bool operator<(const uint16_t c) const { return ciphersuite_code() < c; } Ciphersuite() = default; private: bool is_usable() const; Ciphersuite(uint16_t ciphersuite_code, const char* iana_id, const char* sig_algo, const char* kex_algo, const char* cipher_algo, size_t cipher_keylen, size_t nonce_bytes_from_handshake, size_t nonce_bytes_from_record, const char* mac_algo, size_t mac_keylen, const char* prf_algo) : m_ciphersuite_code(ciphersuite_code), m_iana_id(iana_id), m_sig_algo(sig_algo), m_kex_algo(kex_algo), m_prf_algo(prf_algo), m_cipher_algo(cipher_algo), m_mac_algo(mac_algo), m_cipher_keylen(cipher_keylen), m_nonce_bytes_from_handshake(nonce_bytes_from_handshake), m_nonce_bytes_from_record(nonce_bytes_from_record), m_mac_keylen(mac_keylen) { m_usable = is_usable(); } uint16_t m_ciphersuite_code = 0; /* All of these const char* strings are references to compile time constants in tls_suite_info.cpp */ const char* m_iana_id = nullptr; const char* m_sig_algo = nullptr; const char* m_kex_algo = nullptr; const char* m_prf_algo = nullptr; const char* m_cipher_algo = nullptr; const char* m_mac_algo = nullptr; size_t m_cipher_keylen = 0; size_t m_nonce_bytes_from_handshake = 0; size_t m_nonce_bytes_from_record = 0; size_t m_mac_keylen = 0; bool m_usable = false; }; } } #endif botan-2.4.0/src/lib/tls/tls_client.cpp000066400000000000000000000527731322470703100176400ustar00rootroot00000000000000/* * TLS Client * (C) 2004-2011,2012,2015,2016 Jack Lloyd * 2016 Matthias Gierlings * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace TLS { namespace { class Client_Handshake_State final : public Handshake_State { public: // using Handshake_State::Handshake_State; Client_Handshake_State(Handshake_IO* io, Callbacks& cb) : Handshake_State(io, cb) {} const Public_Key& get_server_public_key() const { BOTAN_ASSERT(server_public_key, "Server sent us a certificate"); return *server_public_key.get(); } bool is_a_resumption() const { return (resume_master_secret.empty() == false); } std::unique_ptr server_public_key; // Used during session resumption secure_vector resume_master_secret; std::vector resume_peer_certs; }; } /* * TLS Client Constructor */ Client::Client(Callbacks& callbacks, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& info, const Protocol_Version& offer_version, const std::vector& next_protos, size_t io_buf_sz) : Channel(callbacks, session_manager, rng, policy, offer_version.is_datagram_protocol(), io_buf_sz), m_creds(creds), m_info(info) { init(offer_version, next_protos); } Client::Client(output_fn output_fn, data_cb proc_cb, alert_cb alert_cb, handshake_cb handshake_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& info, const Protocol_Version& offer_version, const std::vector& next_protos, size_t io_buf_sz) : Channel(output_fn, proc_cb, alert_cb, handshake_cb, Channel::handshake_msg_cb(), session_manager, rng, policy, offer_version.is_datagram_protocol(), io_buf_sz), m_creds(creds), m_info(info) { init(offer_version, next_protos); } Client::Client(output_fn output_fn, data_cb proc_cb, alert_cb alert_cb, handshake_cb handshake_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& info, const Protocol_Version& offer_version, const std::vector& next_protos) : Channel(output_fn, proc_cb, alert_cb, handshake_cb, hs_msg_cb, session_manager, rng, policy, offer_version.is_datagram_protocol()), m_creds(creds), m_info(info) { init(offer_version, next_protos); } void Client::init(const Protocol_Version& protocol_version, const std::vector& next_protocols) { const std::string srp_identifier = m_creds.srp_identifier("tls-client", m_info.hostname()); Handshake_State& state = create_handshake_state(protocol_version); send_client_hello(state, false, protocol_version, srp_identifier, next_protocols); } Handshake_State* Client::new_handshake_state(Handshake_IO* io) { return new Client_Handshake_State(io, callbacks()); } std::vector Client::get_peer_cert_chain(const Handshake_State& state) const { const Client_Handshake_State& cstate = dynamic_cast(state); if(cstate.resume_peer_certs.size() > 0) return cstate.resume_peer_certs; if(state.server_certs()) return state.server_certs()->cert_chain(); return std::vector(); } /* * Send a new client hello to renegotiate */ void Client::initiate_handshake(Handshake_State& state, bool force_full_renegotiation) { send_client_hello(state, force_full_renegotiation, state.version()); } void Client::send_client_hello(Handshake_State& state_base, bool force_full_renegotiation, Protocol_Version version, const std::string& srp_identifier, const std::vector& next_protocols) { Client_Handshake_State& state = dynamic_cast(state_base); if(state.version().is_datagram_protocol()) state.set_expected_next(HELLO_VERIFY_REQUEST); // optional state.set_expected_next(SERVER_HELLO); if(!force_full_renegotiation && !m_info.empty()) { Session session_info; if(session_manager().load_from_server_info(m_info, session_info)) { /* Ensure that the session protocol type matches what we want to use If not skip the resume and establish a new session */ if(version == session_info.version()) { if(srp_identifier == "" || session_info.srp_identifier() == srp_identifier) { state.client_hello( new Client_Hello(state.handshake_io(), state.hash(), policy(), rng(), secure_renegotiation_data_for_client_hello(), session_info, next_protocols)); state.resume_master_secret = session_info.master_secret(); state.resume_peer_certs = session_info.peer_certs(); } } } } if(!state.client_hello()) // not resuming { Client_Hello::Settings client_settings(version, m_info.hostname(), srp_identifier); state.client_hello(new Client_Hello( state.handshake_io(), state.hash(), policy(), rng(), secure_renegotiation_data_for_client_hello(), client_settings, next_protocols)); } secure_renegotiation_check(state.client_hello()); } /* * Process a handshake message */ void Client::process_handshake_msg(const Handshake_State* active_state, Handshake_State& state_base, Handshake_Type type, const std::vector& contents) { Client_Handshake_State& state = dynamic_cast(state_base); if(type == HELLO_REQUEST && active_state) { Hello_Request hello_request(contents); // Ignore request entirely if we are currently negotiating a handshake if(state.client_hello()) return; if(policy().allow_server_initiated_renegotiation()) { if(!secure_renegotiation_supported() && policy().allow_insecure_renegotiation() == false) send_warning_alert(Alert::NO_RENEGOTIATION); else this->initiate_handshake(state, false); } else { // RFC 5746 section 4.2 send_warning_alert(Alert::NO_RENEGOTIATION); } return; } state.confirm_transition_to(type); if(type != HANDSHAKE_CCS && type != FINISHED && type != HELLO_VERIFY_REQUEST) state.hash().update(state.handshake_io().format(contents, type)); if(type == HELLO_VERIFY_REQUEST) { state.set_expected_next(SERVER_HELLO); state.set_expected_next(HELLO_VERIFY_REQUEST); // might get it again Hello_Verify_Request hello_verify_request(contents); state.hello_verify_request(hello_verify_request); } else if(type == SERVER_HELLO) { state.server_hello(new Server_Hello(contents)); if(!state.client_hello()->offered_suite(state.server_hello()->ciphersuite())) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server replied with ciphersuite we didn't send"); } if(Ciphersuite::is_scsv(state.server_hello()->ciphersuite())) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server replied with a signaling ciphersuite"); } if(!value_exists(state.client_hello()->compression_methods(), state.server_hello()->compression_method())) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server replied with compression method we didn't send"); } auto client_extn = state.client_hello()->extension_types(); auto server_extn = state.server_hello()->extension_types(); std::vector diff; std::set_difference(server_extn.begin(), server_extn.end(), client_extn.begin(), client_extn.end(), std::back_inserter(diff)); if(!diff.empty()) { // Server sent us back an extension we did not send! std::ostringstream msg; msg << "Server replied with " << diff.size() << " unsupported extensions:"; for(auto&& d : diff) msg << " " << static_cast(d); throw TLS_Exception(Alert::HANDSHAKE_FAILURE, msg.str()); } if(uint16_t srtp = state.server_hello()->srtp_profile()) { if(!value_exists(state.client_hello()->srtp_profiles(), srtp)) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server replied with DTLS-SRTP alg we did not send"); } state.set_version(state.server_hello()->version()); m_application_protocol = state.server_hello()->next_protocol(); secure_renegotiation_check(state.server_hello()); const bool server_returned_same_session_id = !state.server_hello()->session_id().empty() && (state.server_hello()->session_id() == state.client_hello()->session_id()); if(server_returned_same_session_id) { // successful resumption /* * In this case, we offered the version used in the original * session, and the server must resume with the same version. */ if(state.server_hello()->version() != state.client_hello()->version()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server resumed session but with wrong version"); state.compute_session_keys(state.resume_master_secret); if(state.server_hello()->supports_session_ticket()) state.set_expected_next(NEW_SESSION_TICKET); else { state.set_expected_next(HANDSHAKE_CCS); } } else { // new session state.resume_master_secret.clear(); state.resume_peer_certs.clear(); if(state.client_hello()->version().is_datagram_protocol() != state.server_hello()->version().is_datagram_protocol()) { throw TLS_Exception(Alert::PROTOCOL_VERSION, "Server replied with different protocol type than we offered"); } if(state.version() > state.client_hello()->version()) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server replied with later version than client offered"); } if(state.version().major_version() == 3 && state.version().minor_version() == 0) { throw TLS_Exception(Alert::PROTOCOL_VERSION, "Server attempting to negotiate SSLv3 which is not supported"); } if(!policy().acceptable_protocol_version(state.version())) { throw TLS_Exception(Alert::PROTOCOL_VERSION, "Server version " + state.version().to_string() + " is unacceptable by policy"); } if(state.ciphersuite().sig_algo() != "") { state.set_expected_next(CERTIFICATE); } else if(state.ciphersuite().kex_algo() == "PSK") { /* PSK is anonymous so no certificate/cert req message is ever sent. The server may or may not send a server kex, depending on if it has an identity hint for us. (EC)DHE_PSK always sends a server key exchange for the DH exchange portion. */ state.set_expected_next(SERVER_KEX); state.set_expected_next(SERVER_HELLO_DONE); } else if(state.ciphersuite().kex_algo() != "RSA") { state.set_expected_next(SERVER_KEX); } else { state.set_expected_next(CERTIFICATE_REQUEST); // optional state.set_expected_next(SERVER_HELLO_DONE); } } } else if(type == CERTIFICATE) { state.server_certs(new Certificate(contents, policy())); const std::vector& server_certs = state.server_certs()->cert_chain(); if(server_certs.empty()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client: No certificates sent by server"); /* If the server supports certificate status messages, certificate verification happens after we receive the server hello done, in case an OCSP response was also available */ std::unique_ptr peer_key(server_certs[0].subject_public_key()); if(peer_key->algo_name() != state.ciphersuite().sig_algo()) throw TLS_Exception(Alert::ILLEGAL_PARAMETER, "Certificate key type did not match ciphersuite"); state.server_public_key.reset(peer_key.release()); if(state.ciphersuite().kex_algo() != "RSA") { state.set_expected_next(SERVER_KEX); } else { state.set_expected_next(CERTIFICATE_REQUEST); // optional state.set_expected_next(SERVER_HELLO_DONE); } if(state.server_hello()->supports_certificate_status_message()) { state.set_expected_next(CERTIFICATE_STATUS); // optional } else { try { auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-client", m_info.hostname()); callbacks().tls_verify_cert_chain(server_certs, {}, trusted_CAs, Usage_Type::TLS_SERVER_AUTH, m_info.hostname(), policy()); } catch(std::exception& e) { throw TLS_Exception(Alert::BAD_CERTIFICATE, e.what()); } } } else if(type == CERTIFICATE_STATUS) { state.server_cert_status(new Certificate_Status(contents)); if(state.ciphersuite().kex_algo() != "RSA") { state.set_expected_next(SERVER_KEX); } else { state.set_expected_next(CERTIFICATE_REQUEST); // optional state.set_expected_next(SERVER_HELLO_DONE); } } else if(type == SERVER_KEX) { state.set_expected_next(CERTIFICATE_REQUEST); // optional state.set_expected_next(SERVER_HELLO_DONE); state.server_kex( new Server_Key_Exchange(contents, state.ciphersuite().kex_algo(), state.ciphersuite().sig_algo(), state.version()) ); if(state.ciphersuite().sig_algo() != "") { const Public_Key& server_key = state.get_server_public_key(); if(!state.server_kex()->verify(server_key, state, policy())) { throw TLS_Exception(Alert::DECRYPT_ERROR, "Bad signature on server key exchange"); } } } else if(type == CERTIFICATE_REQUEST) { state.set_expected_next(SERVER_HELLO_DONE); state.cert_req(new Certificate_Req(contents, state.version())); } else if(type == SERVER_HELLO_DONE) { state.server_hello_done(new Server_Hello_Done(contents)); if(state.server_certs() != nullptr && state.server_hello()->supports_certificate_status_message()) { try { auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-client", m_info.hostname()); std::vector> ocsp; if(state.server_cert_status() != nullptr) ocsp.push_back(state.server_cert_status()->response()); callbacks().tls_verify_cert_chain(state.server_certs()->cert_chain(), ocsp, trusted_CAs, Usage_Type::TLS_SERVER_AUTH, m_info.hostname(), policy()); } catch(std::exception& e) { throw TLS_Exception(Alert::BAD_CERTIFICATE, e.what()); } } if(state.received_handshake_msg(CERTIFICATE_REQUEST)) { const auto& types = state.cert_req()->acceptable_cert_types(); std::vector client_certs = m_creds.cert_chain(types, "tls-client", m_info.hostname()); state.client_certs(new Certificate(state.handshake_io(), state.hash(), client_certs)); } state.client_kex( new Client_Key_Exchange(state.handshake_io(), state, policy(), m_creds, state.server_public_key.get(), m_info.hostname(), rng()) ); state.compute_session_keys(); if(state.received_handshake_msg(CERTIFICATE_REQUEST) && !state.client_certs()->empty()) { Private_Key* private_key = m_creds.private_key_for(state.client_certs()->cert_chain()[0], "tls-client", m_info.hostname()); state.client_verify( new Certificate_Verify(state.handshake_io(), state, policy(), rng(), private_key) ); } state.handshake_io().send(Change_Cipher_Spec()); change_cipher_spec_writer(CLIENT); state.client_finished(new Finished(state.handshake_io(), state, CLIENT)); if(state.server_hello()->supports_session_ticket()) state.set_expected_next(NEW_SESSION_TICKET); else state.set_expected_next(HANDSHAKE_CCS); } else if(type == NEW_SESSION_TICKET) { state.new_session_ticket(new New_Session_Ticket(contents)); state.set_expected_next(HANDSHAKE_CCS); } else if(type == HANDSHAKE_CCS) { state.set_expected_next(FINISHED); change_cipher_spec_reader(CLIENT); } else if(type == FINISHED) { state.server_finished(new Finished(contents)); if(!state.server_finished()->verify(state, SERVER)) throw TLS_Exception(Alert::DECRYPT_ERROR, "Finished message didn't verify"); state.hash().update(state.handshake_io().format(contents, type)); if(!state.client_finished()) // session resume case { state.handshake_io().send(Change_Cipher_Spec()); change_cipher_spec_writer(CLIENT); state.client_finished(new Finished(state.handshake_io(), state, CLIENT)); } std::vector session_id = state.server_hello()->session_id(); const std::vector& session_ticket = state.session_ticket(); if(session_id.empty() && !session_ticket.empty()) session_id = make_hello_random(rng(), policy()); Session session_info( session_id, state.session_keys().master_secret(), state.server_hello()->version(), state.server_hello()->ciphersuite(), state.server_hello()->compression_method(), CLIENT, state.server_hello()->supports_extended_master_secret(), state.server_hello()->supports_encrypt_then_mac(), get_peer_cert_chain(state), session_ticket, m_info, "", state.server_hello()->srtp_profile() ); const bool should_save = save_session(session_info); if(session_id.size() > 0 && state.is_a_resumption() == false) { if(should_save) session_manager().save(session_info); else session_manager().remove_entry(session_info.session_id()); } activate_session(); } else throw Unexpected_Message("Unknown handshake message received"); } } } botan-2.4.0/src/lib/tls/tls_client.h000066400000000000000000000136061322470703100172750ustar00rootroot00000000000000/* * TLS Client * (C) 2004-2011 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_CLIENT_H_ #define BOTAN_TLS_CLIENT_H_ #include #include #include #include namespace Botan { namespace TLS { /** * SSL/TLS Client */ class BOTAN_PUBLIC_API(2,0) Client final : public Channel { public: /** * Set up a new TLS client session * * @param callbacks contains a set of callback function references * required by the TLS client. * * @param session_manager manages session state * * @param creds manages application/user credentials * * @param policy specifies other connection policy information * * @param rng a random number generator * * @param server_info is identifying information about the TLS server * * @param offer_version specifies which version we will offer * to the TLS server. * * @param next_protocols specifies protocols to advertise with ALPN * * @param reserved_io_buffer_size This many bytes of memory will * be preallocated for the read and write buffers. Smaller * values just mean reallocations and copies are more likely. */ Client(Callbacks& callbacks, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& server_info = Server_Information(), const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(), const std::vector& next_protocols = {}, size_t reserved_io_buffer_size = TLS::Client::IO_BUF_DEFAULT_SIZE ); /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new code. * * Set up a new TLS client session * * @param output_fn is called with data for the outbound socket * * @param app_data_cb is called when new application data is received * * @param alert_cb is called when a TLS alert is received * * @param hs_cb is called when a handshake is completed * * @param session_manager manages session state * * @param creds manages application/user credentials * * @param policy specifies other connection policy information * * @param rng a random number generator * * @param server_info is identifying information about the TLS server * * @param offer_version specifies which version we will offer * to the TLS server. * * @param next_protocols specifies protocols to advertise with ALPN * * @param reserved_io_buffer_size This many bytes of memory will * be preallocated for the read and write buffers. Smaller * values just mean reallocations and copies are more likely. */ BOTAN_DEPRECATED("Use TLS::Client(TLS::Callbacks ...)") Client(output_fn output_fn, data_cb app_data_cb, alert_cb alert_cb, handshake_cb hs_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& server_info = Server_Information(), const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(), const std::vector& next_protocols = {}, size_t reserved_io_buffer_size = TLS::Client::IO_BUF_DEFAULT_SIZE ); /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new implementations. */ BOTAN_DEPRECATED("Use TLS::Client(TLS::Callbacks ...)") Client(output_fn out, data_cb app_data_cb, alert_cb alert_cb, handshake_cb hs_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, const Server_Information& server_info = Server_Information(), const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(), const std::vector& next_protocols = {} ); /** * @return network protocol as advertised by the TLS server, if server sent the ALPN extension */ const std::string& application_protocol() const { return m_application_protocol; } private: void init(const Protocol_Version& protocol_version, const std::vector& next_protocols); std::vector get_peer_cert_chain(const Handshake_State& state) const override; void initiate_handshake(Handshake_State& state, bool force_full_renegotiation) override; void send_client_hello(Handshake_State& state, bool force_full_renegotiation, Protocol_Version version, const std::string& srp_identifier = "", const std::vector& next_protocols = {}); void process_handshake_msg(const Handshake_State* active_state, Handshake_State& pending_state, Handshake_Type type, const std::vector& contents) override; Handshake_State* new_handshake_state(Handshake_IO* io) override; Credentials_Manager& m_creds; const Server_Information m_info; std::string m_application_protocol; }; } } #endif botan-2.4.0/src/lib/tls/tls_exceptn.h000066400000000000000000000016251322470703100174630ustar00rootroot00000000000000/* * Exceptions * (C) 2004-2006 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_EXCEPTION_H_ #define BOTAN_TLS_EXCEPTION_H_ #include #include namespace Botan { namespace TLS { /** * Exception Base Class */ class BOTAN_PUBLIC_API(2,0) TLS_Exception : public Exception { public: Alert::Type type() const { return m_alert_type; } TLS_Exception(Alert::Type type, const std::string& err_msg = "Unknown error") : Exception(err_msg), m_alert_type(type) {} private: Alert::Type m_alert_type; }; /** * Unexpected_Message Exception */ class BOTAN_PUBLIC_API(2,0) Unexpected_Message final : public TLS_Exception { public: explicit Unexpected_Message(const std::string& err) : TLS_Exception(Alert::UNEXPECTED_MESSAGE, err) {} }; } } #endif botan-2.4.0/src/lib/tls/tls_extensions.cpp000066400000000000000000000456051322470703100205550ustar00rootroot00000000000000/* * TLS Extensions * (C) 2011,2012,2015,2016 Jack Lloyd * 2016 Juraj Somorovsky * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace TLS { namespace { Extension* make_extension(TLS_Data_Reader& reader, uint16_t code, uint16_t size) { switch(code) { case TLSEXT_SERVER_NAME_INDICATION: return new Server_Name_Indicator(reader, size); #if defined(BOTAN_HAS_SRP6) case TLSEXT_SRP_IDENTIFIER: return new SRP_Identifier(reader, size); #endif case TLSEXT_USABLE_ELLIPTIC_CURVES: return new Supported_Elliptic_Curves(reader, size); case TLSEXT_CERT_STATUS_REQUEST: return new Certificate_Status_Request(reader, size); case TLSEXT_EC_POINT_FORMATS: return new Supported_Point_Formats(reader, size); case TLSEXT_SAFE_RENEGOTIATION: return new Renegotiation_Extension(reader, size); case TLSEXT_SIGNATURE_ALGORITHMS: return new Signature_Algorithms(reader, size); case TLSEXT_USE_SRTP: return new SRTP_Protection_Profiles(reader, size); case TLSEXT_ALPN: return new Application_Layer_Protocol_Notification(reader, size); case TLSEXT_EXTENDED_MASTER_SECRET: return new Extended_Master_Secret(reader, size); case TLSEXT_ENCRYPT_THEN_MAC: return new Encrypt_then_MAC(reader, size); case TLSEXT_SESSION_TICKET: return new Session_Ticket(reader, size); } return nullptr; // not known } } void Extensions::deserialize(TLS_Data_Reader& reader) { if(reader.has_remaining()) { const uint16_t all_extn_size = reader.get_uint16_t(); if(reader.remaining_bytes() != all_extn_size) throw Decoding_Error("Bad extension size"); while(reader.has_remaining()) { const uint16_t extension_code = reader.get_uint16_t(); const uint16_t extension_size = reader.get_uint16_t(); Extension* extn = make_extension(reader, extension_code, extension_size); if(extn) this->add(extn); else // unknown/unhandled extension reader.discard_next(extension_size); } } } std::vector Extensions::serialize() const { std::vector buf(2); // 2 bytes for length field for(auto& extn : m_extensions) { if(extn.second->empty()) continue; const uint16_t extn_code = extn.second->type(); std::vector extn_val = extn.second->serialize(); buf.push_back(get_byte(0, extn_code)); buf.push_back(get_byte(1, extn_code)); buf.push_back(get_byte(0, static_cast(extn_val.size()))); buf.push_back(get_byte(1, static_cast(extn_val.size()))); buf += extn_val; } const uint16_t extn_size = static_cast(buf.size() - 2); buf[0] = get_byte(0, extn_size); buf[1] = get_byte(1, extn_size); // avoid sending a completely empty extensions block if(buf.size() == 2) return std::vector(); return buf; } std::set Extensions::extension_types() const { std::set offers; for(auto i = m_extensions.begin(); i != m_extensions.end(); ++i) offers.insert(i->first); return offers; } Server_Name_Indicator::Server_Name_Indicator(TLS_Data_Reader& reader, uint16_t extension_size) { /* * This is used by the server to confirm that it knew the name */ if(extension_size == 0) return; uint16_t name_bytes = reader.get_uint16_t(); if(name_bytes + 2 != extension_size) throw Decoding_Error("Bad encoding of SNI extension"); while(name_bytes) { uint8_t name_type = reader.get_byte(); name_bytes--; if(name_type == 0) // DNS { m_sni_host_name = reader.get_string(2, 1, 65535); name_bytes -= static_cast(2 + m_sni_host_name.size()); } else // some other unknown name type { reader.discard_next(name_bytes); name_bytes = 0; } } } std::vector Server_Name_Indicator::serialize() const { std::vector buf; size_t name_len = m_sni_host_name.size(); buf.push_back(get_byte(0, static_cast(name_len+3))); buf.push_back(get_byte(1, static_cast(name_len+3))); buf.push_back(0); // DNS buf.push_back(get_byte(0, static_cast(name_len))); buf.push_back(get_byte(1, static_cast(name_len))); buf += std::make_pair( cast_char_ptr_to_uint8(m_sni_host_name.data()), m_sni_host_name.size()); return buf; } #if defined(BOTAN_HAS_SRP6) SRP_Identifier::SRP_Identifier(TLS_Data_Reader& reader, uint16_t extension_size) : m_srp_identifier(reader.get_string(1, 1, 255)) { if(m_srp_identifier.size() + 1 != extension_size) throw Decoding_Error("Bad encoding for SRP identifier extension"); } std::vector SRP_Identifier::serialize() const { std::vector buf; const uint8_t* srp_bytes = cast_char_ptr_to_uint8(m_srp_identifier.data()); append_tls_length_value(buf, srp_bytes, m_srp_identifier.size(), 1); return buf; } #endif Renegotiation_Extension::Renegotiation_Extension(TLS_Data_Reader& reader, uint16_t extension_size) : m_reneg_data(reader.get_range(1, 0, 255)) { if(m_reneg_data.size() + 1 != extension_size) throw Decoding_Error("Bad encoding for secure renegotiation extn"); } std::vector Renegotiation_Extension::serialize() const { std::vector buf; append_tls_length_value(buf, m_reneg_data, 1); return buf; } Application_Layer_Protocol_Notification::Application_Layer_Protocol_Notification(TLS_Data_Reader& reader, uint16_t extension_size) { if(extension_size == 0) return; // empty extension const uint16_t name_bytes = reader.get_uint16_t(); size_t bytes_remaining = extension_size - 2; if(name_bytes != bytes_remaining) throw Decoding_Error("Bad encoding of ALPN extension, bad length field"); while(bytes_remaining) { const std::string p = reader.get_string(1, 0, 255); if(bytes_remaining < p.size() + 1) throw Decoding_Error("Bad encoding of ALPN, length field too long"); bytes_remaining -= (p.size() + 1); m_protocols.push_back(p); } } const std::string& Application_Layer_Protocol_Notification::single_protocol() const { if(m_protocols.size() != 1) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Server sent " + std::to_string(m_protocols.size()) + " protocols in ALPN extension response"); return m_protocols[0]; } std::vector Application_Layer_Protocol_Notification::serialize() const { std::vector buf(2); for(auto&& p: m_protocols) { if(p.length() >= 256) throw TLS_Exception(Alert::INTERNAL_ERROR, "ALPN name too long"); if(p != "") append_tls_length_value(buf, cast_char_ptr_to_uint8(p.data()), p.size(), 1); } buf[0] = get_byte(0, static_cast(buf.size()-2)); buf[1] = get_byte(1, static_cast(buf.size()-2)); return buf; } Supported_Groups::Supported_Groups(const std::vector& groups) : m_groups(groups) { for(const auto& group : m_groups) { if(is_dh_group(group)) { m_dh_groups.push_back(group); } else { m_curves.push_back(group); } } } std::string Supported_Groups::curve_id_to_name(uint16_t id) { switch(id) { case 23: return "secp256r1"; case 24: return "secp384r1"; case 25: return "secp521r1"; case 26: return "brainpool256r1"; case 27: return "brainpool384r1"; case 28: return "brainpool512r1"; #if defined(BOTAN_HAS_CURVE_25519) case 29: return "x25519"; #endif #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) case BOTAN_HOUSE_ECC_CURVE_TLS_ID: return BOTAN_HOUSE_ECC_CURVE_NAME; #endif case 256: return "ffdhe/ietf/2048"; case 257: return "ffdhe/ietf/3072"; case 258: return "ffdhe/ietf/4096"; case 259: return "ffdhe/ietf/6144"; case 260: return "ffdhe/ietf/8192"; default: return ""; // something we don't know or support } } uint16_t Supported_Groups::name_to_curve_id(const std::string& name) { if(name == "secp256r1") return 23; if(name == "secp384r1") return 24; if(name == "secp521r1") return 25; if(name == "brainpool256r1") return 26; if(name == "brainpool384r1") return 27; if(name == "brainpool512r1") return 28; #if defined(BOTAN_HAS_CURVE_25519) if(name == "x25519") return 29; #endif #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) if(name == BOTAN_HOUSE_ECC_CURVE_NAME) return BOTAN_HOUSE_ECC_CURVE_TLS_ID; #endif if(name == "ffdhe/ietf/2048") return 256; if(name == "ffdhe/ietf/3072") return 257; if(name == "ffdhe/ietf/4096") return 258; if(name == "ffdhe/ietf/6144") return 259; if(name == "ffdhe/ietf/8192") return 260; // Unknown/unavailable DH groups/EC curves are ignored return 0; } bool Supported_Groups::is_dh_group( const std::string& group_name ) { if(group_name == "ffdhe/ietf/2048" || group_name == "ffdhe/ietf/3072" || group_name == "ffdhe/ietf/4096" || group_name == "ffdhe/ietf/6144" || group_name == "ffdhe/ietf/8192") { return true; } return false; } std::vector Supported_Groups::serialize() const { std::vector buf(2); for(size_t i = 0; i != m_groups.size(); ++i) { const uint16_t id = name_to_curve_id(m_groups[i]); if(id > 0) { buf.push_back(get_byte(0, id)); buf.push_back(get_byte(1, id)); } } buf[0] = get_byte(0, static_cast(buf.size()-2)); buf[1] = get_byte(1, static_cast(buf.size()-2)); return buf; } Supported_Groups::Supported_Groups(TLS_Data_Reader& reader, uint16_t extension_size) { uint16_t len = reader.get_uint16_t(); if(len + 2 != extension_size) throw Decoding_Error("Inconsistent length field in supported groups list"); if(len % 2 == 1) throw Decoding_Error("Supported groups list of strange size"); len /= 2; for(size_t i = 0; i != len; ++i) { const uint16_t id = reader.get_uint16_t(); const std::string name = curve_id_to_name(id); if(!name.empty()) { m_groups.push_back(name); if(is_dh_group(name)) { m_dh_groups.push_back(name); } else { m_curves.push_back(name); } } } } std::vector Supported_Point_Formats::serialize() const { // if this extension is sent, it MUST include uncompressed (RFC 4492, section 5.1) if(m_prefers_compressed) { return std::vector{2, ANSIX962_COMPRESSED_PRIME, UNCOMPRESSED}; } else { return std::vector{1, UNCOMPRESSED}; } } Supported_Point_Formats::Supported_Point_Formats(TLS_Data_Reader& reader, uint16_t extension_size) { uint8_t len = reader.get_byte(); if(len + 1 != extension_size) throw Decoding_Error("Inconsistent length field in supported point formats list"); for(size_t i = 0; i != len; ++i) { uint8_t format = reader.get_byte(); if(static_cast(format) == UNCOMPRESSED) { m_prefers_compressed = false; reader.discard_next(len-i-1); return; } else if(static_cast(format) == ANSIX962_COMPRESSED_PRIME) { m_prefers_compressed = true; reader.discard_next(len-i-1); return; } // ignore ANSIX962_COMPRESSED_CHAR2, we don't support these curves } } std::string Signature_Algorithms::hash_algo_name(uint8_t code) { switch(code) { // code 1 is MD5 - ignore it case 2: return "SHA-1"; // code 3 is SHA-224 case 4: return "SHA-256"; case 5: return "SHA-384"; case 6: return "SHA-512"; default: return ""; } } uint8_t Signature_Algorithms::hash_algo_code(const std::string& name) { if(name == "SHA-1") return 2; if(name == "SHA-256") return 4; if(name == "SHA-384") return 5; if(name == "SHA-512") return 6; throw Internal_Error("Unknown hash ID " + name + " for signature_algorithms"); } std::string Signature_Algorithms::sig_algo_name(uint8_t code) { switch(code) { case 1: return "RSA"; case 2: return "DSA"; case 3: return "ECDSA"; default: return ""; } } uint8_t Signature_Algorithms::sig_algo_code(const std::string& name) { if(name == "RSA") return 1; if(name == "DSA") return 2; if(name == "ECDSA") return 3; throw Internal_Error("Unknown sig ID " + name + " for signature_algorithms"); } std::vector Signature_Algorithms::serialize() const { std::vector buf(2); for(size_t i = 0; i != m_supported_algos.size(); ++i) { try { const uint8_t hash_code = hash_algo_code(m_supported_algos[i].first); const uint8_t sig_code = sig_algo_code(m_supported_algos[i].second); buf.push_back(hash_code); buf.push_back(sig_code); } catch(...) {} } buf[0] = get_byte(0, static_cast(buf.size()-2)); buf[1] = get_byte(1, static_cast(buf.size()-2)); return buf; } Signature_Algorithms::Signature_Algorithms(const std::vector& hashes, const std::vector& sigs) { for(size_t i = 0; i != hashes.size(); ++i) for(size_t j = 0; j != sigs.size(); ++j) m_supported_algos.push_back(std::make_pair(hashes[i], sigs[j])); } Signature_Algorithms::Signature_Algorithms(TLS_Data_Reader& reader, uint16_t extension_size) { uint16_t len = reader.get_uint16_t(); if(len + 2 != extension_size || len % 2 == 1 || len == 0) throw Decoding_Error("Bad encoding on signature algorithms extension"); while(len) { const uint8_t hash_code = reader.get_byte(); const uint8_t sig_code = reader.get_byte(); len -= 2; if(sig_code == 0) { /* RFC 5247 7.4.1.4.1 explicitly prohibits anonymous (0) signature code in the client hello. ("It MUST NOT appear in this extension.") */ throw TLS_Exception(Alert::DECODE_ERROR, "Client sent ANON signature"); } const std::string hash_name = hash_algo_name(hash_code); const std::string sig_name = sig_algo_name(sig_code); // If not something we know, ignore it completely if(hash_name.empty() || sig_name.empty()) continue; m_supported_algos.push_back(std::make_pair(hash_name, sig_name)); } } Session_Ticket::Session_Ticket(TLS_Data_Reader& reader, uint16_t extension_size) : m_ticket(reader.get_elem>(extension_size)) {} SRTP_Protection_Profiles::SRTP_Protection_Profiles(TLS_Data_Reader& reader, uint16_t extension_size) : m_pp(reader.get_range(2, 0, 65535)) { const std::vector mki = reader.get_range(1, 0, 255); if(m_pp.size() * 2 + mki.size() + 3 != extension_size) throw Decoding_Error("Bad encoding for SRTP protection extension"); if(!mki.empty()) throw Decoding_Error("Unhandled non-empty MKI for SRTP protection extension"); } std::vector SRTP_Protection_Profiles::serialize() const { std::vector buf; const uint16_t pp_len = static_cast(m_pp.size() * 2); buf.push_back(get_byte(0, pp_len)); buf.push_back(get_byte(1, pp_len)); for(uint16_t pp : m_pp) { buf.push_back(get_byte(0, pp)); buf.push_back(get_byte(1, pp)); } buf.push_back(0); // srtp_mki, always empty here return buf; } Extended_Master_Secret::Extended_Master_Secret(TLS_Data_Reader&, uint16_t extension_size) { if(extension_size != 0) throw Decoding_Error("Invalid extended_master_secret extension"); } std::vector Extended_Master_Secret::serialize() const { return std::vector(); } Encrypt_then_MAC::Encrypt_then_MAC(TLS_Data_Reader&, uint16_t extension_size) { if(extension_size != 0) throw Decoding_Error("Invalid encrypt_then_mac extension"); } std::vector Encrypt_then_MAC::serialize() const { return std::vector(); } std::vector Certificate_Status_Request::serialize() const { std::vector buf; if(m_server_side) return buf; // server reply is empty /* opaque ResponderID<1..2^16-1>; opaque Extensions<0..2^16-1>; CertificateStatusType status_type = ocsp(1) ResponderID responder_id_list<0..2^16-1> Extensions request_extensions; */ buf.push_back(1); // CertificateStatusType ocsp buf.push_back(0); buf.push_back(0); buf.push_back(0); buf.push_back(0); return buf; } Certificate_Status_Request::Certificate_Status_Request(TLS_Data_Reader& reader, uint16_t extension_size) : m_server_side(false) { if(extension_size > 0) { const uint8_t type = reader.get_byte(); if(type == 1) { reader.discard_next(extension_size - 1); // fixme } else { reader.discard_next(extension_size - 1); } } } Certificate_Status_Request::Certificate_Status_Request(const std::vector& ocsp_responder_ids, const std::vector>& ocsp_key_ids) : m_ocsp_names(ocsp_responder_ids), m_ocsp_keys(ocsp_key_ids), m_server_side(false) { } Certificate_Status_Request::Certificate_Status_Request() : m_server_side(true) { } } } botan-2.4.0/src/lib/tls/tls_extensions.h000066400000000000000000000321661322470703100202200ustar00rootroot00000000000000/* * TLS Extensions * (C) 2011,2012,2016 Jack Lloyd * 2016 Juraj Somorovsky * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_EXTENSIONS_H_ #define BOTAN_TLS_EXTENSIONS_H_ #include #include #include #include #include #include namespace Botan { namespace TLS { class TLS_Data_Reader; enum Handshake_Extension_Type { TLSEXT_SERVER_NAME_INDICATION = 0, TLSEXT_CERT_STATUS_REQUEST = 5, TLSEXT_CERTIFICATE_TYPES = 9, TLSEXT_USABLE_ELLIPTIC_CURVES = 10, TLSEXT_EC_POINT_FORMATS = 11, TLSEXT_SRP_IDENTIFIER = 12, TLSEXT_SIGNATURE_ALGORITHMS = 13, TLSEXT_USE_SRTP = 14, TLSEXT_ALPN = 16, TLSEXT_ENCRYPT_THEN_MAC = 22, TLSEXT_EXTENDED_MASTER_SECRET = 23, TLSEXT_SESSION_TICKET = 35, TLSEXT_SAFE_RENEGOTIATION = 65281, }; /** * Base class representing a TLS extension of some kind */ class Extension { public: /** * @return code number of the extension */ virtual Handshake_Extension_Type type() const = 0; /** * @return serialized binary for the extension */ virtual std::vector serialize() const = 0; /** * @return if we should encode this extension or not */ virtual bool empty() const = 0; virtual ~Extension() = default; }; /** * Server Name Indicator extension (RFC 3546) */ class Server_Name_Indicator final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_SERVER_NAME_INDICATION; } Handshake_Extension_Type type() const override { return static_type(); } explicit Server_Name_Indicator(const std::string& host_name) : m_sni_host_name(host_name) {} Server_Name_Indicator(TLS_Data_Reader& reader, uint16_t extension_size); std::string host_name() const { return m_sni_host_name; } std::vector serialize() const override; bool empty() const override { return m_sni_host_name.empty(); } private: std::string m_sni_host_name; }; #if defined(BOTAN_HAS_SRP6) /** * SRP identifier extension (RFC 5054) */ class SRP_Identifier final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_SRP_IDENTIFIER; } Handshake_Extension_Type type() const override { return static_type(); } explicit SRP_Identifier(const std::string& identifier) : m_srp_identifier(identifier) {} SRP_Identifier(TLS_Data_Reader& reader, uint16_t extension_size); std::string identifier() const { return m_srp_identifier; } std::vector serialize() const override; bool empty() const override { return m_srp_identifier.empty(); } private: std::string m_srp_identifier; }; #endif /** * Renegotiation Indication Extension (RFC 5746) */ class Renegotiation_Extension final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_SAFE_RENEGOTIATION; } Handshake_Extension_Type type() const override { return static_type(); } Renegotiation_Extension() = default; explicit Renegotiation_Extension(const std::vector& bits) : m_reneg_data(bits) {} Renegotiation_Extension(TLS_Data_Reader& reader, uint16_t extension_size); const std::vector& renegotiation_info() const { return m_reneg_data; } std::vector serialize() const override; bool empty() const override { return false; } // always send this private: std::vector m_reneg_data; }; /** * ALPN (RFC 7301) */ class Application_Layer_Protocol_Notification final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_ALPN; } Handshake_Extension_Type type() const override { return static_type(); } const std::vector& protocols() const { return m_protocols; } const std::string& single_protocol() const; /** * Single protocol, used by server */ explicit Application_Layer_Protocol_Notification(const std::string& protocol) : m_protocols(1, protocol) {} /** * List of protocols, used by client */ explicit Application_Layer_Protocol_Notification(const std::vector& protocols) : m_protocols(protocols) {} Application_Layer_Protocol_Notification(TLS_Data_Reader& reader, uint16_t extension_size); std::vector serialize() const override; bool empty() const override { return m_protocols.empty(); } private: std::vector m_protocols; }; /** * Session Ticket Extension (RFC 5077) */ class Session_Ticket final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_SESSION_TICKET; } Handshake_Extension_Type type() const override { return static_type(); } /** * @return contents of the session ticket */ const std::vector& contents() const { return m_ticket; } /** * Create empty extension, used by both client and server */ Session_Ticket() = default; /** * Extension with ticket, used by client */ explicit Session_Ticket(const std::vector& session_ticket) : m_ticket(session_ticket) {} /** * Deserialize a session ticket */ Session_Ticket(TLS_Data_Reader& reader, uint16_t extension_size); std::vector serialize() const override { return m_ticket; } bool empty() const override { return false; } private: std::vector m_ticket; }; /** * Supported Groups Extension (RFC 7919) */ class Supported_Groups final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_USABLE_ELLIPTIC_CURVES; } Handshake_Extension_Type type() const override { return static_type(); } static std::string curve_id_to_name(uint16_t id); static uint16_t name_to_curve_id(const std::string& name); static bool is_dh_group( const std::string& group_name ); const std::vector& curves() const { return m_curves; } const std::vector& dh_groups() const { return m_dh_groups; } std::vector serialize() const override; explicit Supported_Groups(const std::vector& groups); Supported_Groups(TLS_Data_Reader& reader, uint16_t extension_size); bool empty() const override { return m_groups.empty(); } private: std::vector m_groups; std::vector m_curves; std::vector m_dh_groups; }; // previously Supported Elliptic Curves Extension (RFC 4492) using Supported_Elliptic_Curves = Supported_Groups; /** * Supported Point Formats Extension (RFC 4492) */ class Supported_Point_Formats final : public Extension { public: enum ECPointFormat : uint8_t { UNCOMPRESSED = 0, ANSIX962_COMPRESSED_PRIME = 1, ANSIX962_COMPRESSED_CHAR2 = 2, // don't support these curves }; static Handshake_Extension_Type static_type() { return TLSEXT_EC_POINT_FORMATS; } Handshake_Extension_Type type() const override { return static_type(); } std::vector serialize() const override; explicit Supported_Point_Formats(bool prefer_compressed) : m_prefers_compressed(prefer_compressed) {} Supported_Point_Formats(TLS_Data_Reader& reader, uint16_t extension_size); bool empty() const override { return false; } bool prefers_compressed() { return m_prefers_compressed; } private: bool m_prefers_compressed = false; }; /** * Signature Algorithms Extension for TLS 1.2 (RFC 5246) */ class Signature_Algorithms final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_SIGNATURE_ALGORITHMS; } Handshake_Extension_Type type() const override { return static_type(); } static std::string hash_algo_name(uint8_t code); static uint8_t hash_algo_code(const std::string& name); static std::string sig_algo_name(uint8_t code); static uint8_t sig_algo_code(const std::string& name); // [(hash,sig),(hash,sig),...] const std::vector>& supported_signature_algorthms() const { return m_supported_algos; } std::vector serialize() const override; bool empty() const override { return false; } Signature_Algorithms(const std::vector& hashes, const std::vector& sig_algos); explicit Signature_Algorithms(const std::vector>& algos) : m_supported_algos(algos) {} Signature_Algorithms(TLS_Data_Reader& reader, uint16_t extension_size); private: std::vector> m_supported_algos; }; /** * Used to indicate SRTP algorithms for DTLS (RFC 5764) */ class SRTP_Protection_Profiles final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_USE_SRTP; } Handshake_Extension_Type type() const override { return static_type(); } const std::vector& profiles() const { return m_pp; } std::vector serialize() const override; bool empty() const override { return m_pp.empty(); } explicit SRTP_Protection_Profiles(const std::vector& pp) : m_pp(pp) {} explicit SRTP_Protection_Profiles(uint16_t pp) : m_pp(1, pp) {} SRTP_Protection_Profiles(TLS_Data_Reader& reader, uint16_t extension_size); private: std::vector m_pp; }; /** * Extended Master Secret Extension (RFC 7627) */ class Extended_Master_Secret final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_EXTENDED_MASTER_SECRET; } Handshake_Extension_Type type() const override { return static_type(); } std::vector serialize() const override; bool empty() const override { return false; } Extended_Master_Secret() = default; Extended_Master_Secret(TLS_Data_Reader& reader, uint16_t extension_size); }; /** * Encrypt-then-MAC Extension (RFC 7366) */ class Encrypt_then_MAC final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_ENCRYPT_THEN_MAC; } Handshake_Extension_Type type() const override { return static_type(); } std::vector serialize() const override; bool empty() const override { return false; } Encrypt_then_MAC() = default; Encrypt_then_MAC(TLS_Data_Reader& reader, uint16_t extension_size); }; /** * Certificate Status Request (RFC 6066) */ class Certificate_Status_Request final : public Extension { public: static Handshake_Extension_Type static_type() { return TLSEXT_CERT_STATUS_REQUEST; } Handshake_Extension_Type type() const override { return static_type(); } std::vector serialize() const override; bool empty() const override { return false; } // Server generated version: empty Certificate_Status_Request(); // Client version, both lists can be empty Certificate_Status_Request(const std::vector& ocsp_responder_ids, const std::vector>& ocsp_key_ids); Certificate_Status_Request(TLS_Data_Reader& reader, uint16_t extension_size); private: std::vector m_ocsp_names; std::vector> m_ocsp_keys; std::vector m_extension_bytes; bool m_server_side; }; /** * Represents a block of extensions in a hello message */ class BOTAN_UNSTABLE_API Extensions final { public: std::set extension_types() const; template T* get() const { Handshake_Extension_Type type = T::static_type(); auto i = m_extensions.find(type); if(i != m_extensions.end()) return dynamic_cast(i->second.get()); return nullptr; } template bool has() const { return get() != nullptr; } void add(Extension* extn) { m_extensions[extn->type()].reset(extn); } std::vector serialize() const; void deserialize(TLS_Data_Reader& reader); Extensions() = default; explicit Extensions(TLS_Data_Reader& reader) { deserialize(reader); } private: Extensions(const Extensions&) = delete; Extensions& operator=(const Extensions&) = delete; std::map> m_extensions; }; } } #endif botan-2.4.0/src/lib/tls/tls_handshake_hash.cpp000066400000000000000000000014311322470703100212740ustar00rootroot00000000000000/* * TLS Handshake Hash * (C) 2004-2006,2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace TLS { /** * Return a TLS Handshake Hash */ secure_vector Handshake_Hash::final(Protocol_Version version, const std::string& mac_algo) const { std::string hash_algo = mac_algo; if(!version.supports_ciphersuite_specific_prf()) hash_algo = "Parallel(MD5,SHA-160)"; else if(mac_algo == "MD5" || mac_algo == "SHA-1") hash_algo = "SHA-256"; std::unique_ptr hash(HashFunction::create_or_throw(hash_algo)); hash->update(m_data); return hash->final(); } } } botan-2.4.0/src/lib/tls/tls_handshake_hash.h000066400000000000000000000015461322470703100207500ustar00rootroot00000000000000/* * TLS Handshake Hash * (C) 2004-2006,2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_HANDSHAKE_HASH_H_ #define BOTAN_TLS_HANDSHAKE_HASH_H_ #include #include namespace Botan { namespace TLS { /** * TLS Handshake Hash */ class Handshake_Hash final { public: void update(const uint8_t in[], size_t length) { m_data += std::make_pair(in, length); } void update(const std::vector& in) { m_data += in; } secure_vector final(Protocol_Version version, const std::string& mac_algo) const; const std::vector& get_contents() const { return m_data; } void reset() { m_data.clear(); } private: std::vector m_data; }; } } #endif botan-2.4.0/src/lib/tls/tls_handshake_io.cpp000066400000000000000000000320721322470703100207650ustar00rootroot00000000000000/* * TLS Handshake IO * (C) 2012,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace TLS { namespace { inline size_t load_be24(const uint8_t q[3]) { return make_uint32(0, q[0], q[1], q[2]); } void store_be24(uint8_t out[3], size_t val) { out[0] = get_byte(1, static_cast(val)); out[1] = get_byte(2, static_cast(val)); out[2] = get_byte(3, static_cast(val)); } uint64_t steady_clock_ms() { return std::chrono::duration_cast( std::chrono::steady_clock::now().time_since_epoch()).count(); } size_t split_for_mtu(size_t mtu, size_t msg_size) { const size_t DTLS_HEADERS_SIZE = 25; // DTLS record+handshake headers const size_t parts = (msg_size + mtu) / mtu; if(parts + DTLS_HEADERS_SIZE > mtu) return parts + 1; return parts; } } Protocol_Version Stream_Handshake_IO::initial_record_version() const { return Protocol_Version::TLS_V10; } void Stream_Handshake_IO::add_record(const std::vector& record, Record_Type record_type, uint64_t) { if(record_type == HANDSHAKE) { m_queue.insert(m_queue.end(), record.begin(), record.end()); } else if(record_type == CHANGE_CIPHER_SPEC) { if(record.size() != 1 || record[0] != 1) throw Decoding_Error("Invalid ChangeCipherSpec"); // Pretend it's a regular handshake message of zero length const uint8_t ccs_hs[] = { HANDSHAKE_CCS, 0, 0, 0 }; m_queue.insert(m_queue.end(), ccs_hs, ccs_hs + sizeof(ccs_hs)); } else throw Decoding_Error("Unknown message type " + std::to_string(record_type) + " in handshake processing"); } std::pair> Stream_Handshake_IO::get_next_record(bool) { if(m_queue.size() >= 4) { const size_t length = make_uint32(0, m_queue[1], m_queue[2], m_queue[3]); if(m_queue.size() >= length + 4) { Handshake_Type type = static_cast(m_queue[0]); std::vector contents(m_queue.begin() + 4, m_queue.begin() + 4 + length); m_queue.erase(m_queue.begin(), m_queue.begin() + 4 + length); return std::make_pair(type, contents); } } return std::make_pair(HANDSHAKE_NONE, std::vector()); } std::vector Stream_Handshake_IO::format(const std::vector& msg, Handshake_Type type) const { std::vector send_buf(4 + msg.size()); const size_t buf_size = msg.size(); send_buf[0] = type; store_be24(&send_buf[1], buf_size); if (msg.size() > 0) { copy_mem(&send_buf[4], msg.data(), msg.size()); } return send_buf; } std::vector Stream_Handshake_IO::send(const Handshake_Message& msg) { const std::vector msg_bits = msg.serialize(); if(msg.type() == HANDSHAKE_CCS) { m_send_hs(CHANGE_CIPHER_SPEC, msg_bits); return std::vector(); // not included in handshake hashes } const std::vector buf = format(msg_bits, msg.type()); m_send_hs(HANDSHAKE, buf); return buf; } Protocol_Version Datagram_Handshake_IO::initial_record_version() const { return Protocol_Version::DTLS_V10; } void Datagram_Handshake_IO::retransmit_last_flight() { const size_t flight_idx = (m_flights.size() == 1) ? 0 : (m_flights.size() - 2); retransmit_flight(flight_idx); } void Datagram_Handshake_IO::retransmit_flight(size_t flight_idx) { const std::vector& flight = m_flights.at(flight_idx); BOTAN_ASSERT(flight.size() > 0, "Nonempty flight to retransmit"); uint16_t epoch = m_flight_data[flight[0]].epoch; for(auto msg_seq : flight) { auto& msg = m_flight_data[msg_seq]; if(msg.epoch != epoch) { // Epoch gap: insert the CCS std::vector ccs(1, 1); m_send_hs(epoch, CHANGE_CIPHER_SPEC, ccs); } send_message(msg_seq, msg.epoch, msg.msg_type, msg.msg_bits); epoch = msg.epoch; } } bool Datagram_Handshake_IO::timeout_check() { if(m_last_write == 0 || (m_flights.size() > 1 && !m_flights.rbegin()->empty())) { /* If we haven't written anything yet obviously no timeout. Also no timeout possible if we are mid-flight, */ return false; } const uint64_t ms_since_write = steady_clock_ms() - m_last_write; if(ms_since_write < m_next_timeout) return false; retransmit_last_flight(); m_next_timeout = std::min(2 * m_next_timeout, m_max_timeout); return true; } void Datagram_Handshake_IO::add_record(const std::vector& record, Record_Type record_type, uint64_t record_sequence) { const uint16_t epoch = static_cast(record_sequence >> 48); if(record_type == CHANGE_CIPHER_SPEC) { // TODO: check this is otherwise empty m_ccs_epochs.insert(epoch); return; } const size_t DTLS_HANDSHAKE_HEADER_LEN = 12; const uint8_t* record_bits = record.data(); size_t record_size = record.size(); while(record_size) { if(record_size < DTLS_HANDSHAKE_HEADER_LEN) return; // completely bogus? at least degenerate/weird const uint8_t msg_type = record_bits[0]; const size_t msg_len = load_be24(&record_bits[1]); const uint16_t message_seq = load_be(&record_bits[4], 0); const size_t fragment_offset = load_be24(&record_bits[6]); const size_t fragment_length = load_be24(&record_bits[9]); const size_t total_size = DTLS_HANDSHAKE_HEADER_LEN + fragment_length; if(record_size < total_size) throw Decoding_Error("Bad lengths in DTLS header"); if(message_seq >= m_in_message_seq) { m_messages[message_seq].add_fragment(&record_bits[DTLS_HANDSHAKE_HEADER_LEN], fragment_length, fragment_offset, epoch, msg_type, msg_len); } else { // TODO: detect retransmitted flight } record_bits += total_size; record_size -= total_size; } } std::pair> Datagram_Handshake_IO::get_next_record(bool expecting_ccs) { // Expecting a message means the last flight is concluded if(!m_flights.rbegin()->empty()) m_flights.push_back(std::vector()); if(expecting_ccs) { if(!m_messages.empty()) { const uint16_t current_epoch = m_messages.begin()->second.epoch(); if(m_ccs_epochs.count(current_epoch)) return std::make_pair(HANDSHAKE_CCS, std::vector()); } return std::make_pair(HANDSHAKE_NONE, std::vector()); } auto i = m_messages.find(m_in_message_seq); if(i == m_messages.end() || !i->second.complete()) return std::make_pair(HANDSHAKE_NONE, std::vector()); m_in_message_seq += 1; return i->second.message(); } void Datagram_Handshake_IO::Handshake_Reassembly::add_fragment( const uint8_t fragment[], size_t fragment_length, size_t fragment_offset, uint16_t epoch, uint8_t msg_type, size_t msg_length) { if(complete()) return; // already have entire message, ignore this if(m_msg_type == HANDSHAKE_NONE) { m_epoch = epoch; m_msg_type = msg_type; m_msg_length = msg_length; } if(msg_type != m_msg_type || msg_length != m_msg_length || epoch != m_epoch) throw Decoding_Error("Inconsistent values in fragmented DTLS handshake header"); if(fragment_offset > m_msg_length) throw Decoding_Error("Fragment offset past end of message"); if(fragment_offset + fragment_length > m_msg_length) throw Decoding_Error("Fragment overlaps past end of message"); if(fragment_offset == 0 && fragment_length == m_msg_length) { m_fragments.clear(); m_message.assign(fragment, fragment+fragment_length); } else { /* * FIXME. This is a pretty lame way to do defragmentation, huge * overhead with a tree node per byte. * * Also should confirm that all overlaps have no changes, * otherwise we expose ourselves to the classic fingerprinting * and IDS evasion attacks on IP fragmentation. */ for(size_t i = 0; i != fragment_length; ++i) m_fragments[fragment_offset+i] = fragment[i]; if(m_fragments.size() == m_msg_length) { m_message.resize(m_msg_length); for(size_t i = 0; i != m_msg_length; ++i) m_message[i] = m_fragments[i]; m_fragments.clear(); } } } bool Datagram_Handshake_IO::Handshake_Reassembly::complete() const { return (m_msg_type != HANDSHAKE_NONE && m_message.size() == m_msg_length); } std::pair> Datagram_Handshake_IO::Handshake_Reassembly::message() const { if(!complete()) throw Internal_Error("Datagram_Handshake_IO - message not complete"); return std::make_pair(static_cast(m_msg_type), m_message); } std::vector Datagram_Handshake_IO::format_fragment(const uint8_t fragment[], size_t frag_len, uint16_t frag_offset, uint16_t msg_len, Handshake_Type type, uint16_t msg_sequence) const { std::vector send_buf(12 + frag_len); send_buf[0] = type; store_be24(&send_buf[1], msg_len); store_be(msg_sequence, &send_buf[4]); store_be24(&send_buf[6], frag_offset); store_be24(&send_buf[9], frag_len); if (frag_len > 0) { copy_mem(&send_buf[12], fragment, frag_len); } return send_buf; } std::vector Datagram_Handshake_IO::format_w_seq(const std::vector& msg, Handshake_Type type, uint16_t msg_sequence) const { return format_fragment(msg.data(), msg.size(), 0, static_cast(msg.size()), type, msg_sequence); } std::vector Datagram_Handshake_IO::format(const std::vector& msg, Handshake_Type type) const { return format_w_seq(msg, type, m_in_message_seq - 1); } std::vector Datagram_Handshake_IO::send(const Handshake_Message& msg) { const std::vector msg_bits = msg.serialize(); const uint16_t epoch = m_seqs.current_write_epoch(); const Handshake_Type msg_type = msg.type(); if(msg_type == HANDSHAKE_CCS) { m_send_hs(epoch, CHANGE_CIPHER_SPEC, msg_bits); return std::vector(); // not included in handshake hashes } // Note: not saving CCS, instead we know it was there due to change in epoch m_flights.rbegin()->push_back(m_out_message_seq); m_flight_data[m_out_message_seq] = Message_Info(epoch, msg_type, msg_bits); m_out_message_seq += 1; m_last_write = steady_clock_ms(); m_next_timeout = m_initial_timeout; return send_message(m_out_message_seq - 1, epoch, msg_type, msg_bits); } std::vector Datagram_Handshake_IO::send_message(uint16_t msg_seq, uint16_t epoch, Handshake_Type msg_type, const std::vector& msg_bits) { const std::vector no_fragment = format_w_seq(msg_bits, msg_type, msg_seq); if(no_fragment.size() + DTLS_HEADER_SIZE <= m_mtu) { m_send_hs(epoch, HANDSHAKE, no_fragment); } else { const size_t parts = split_for_mtu(m_mtu, msg_bits.size()); const size_t parts_size = (msg_bits.size() + parts) / parts; size_t frag_offset = 0; while(frag_offset != msg_bits.size()) { const size_t frag_len = std::min(msg_bits.size() - frag_offset, parts_size); m_send_hs(epoch, HANDSHAKE, format_fragment(&msg_bits[frag_offset], frag_len, static_cast(frag_offset), static_cast(msg_bits.size()), msg_type, msg_seq)); frag_offset += frag_len; } } return no_fragment; } } } botan-2.4.0/src/lib/tls/tls_handshake_io.h000066400000000000000000000137111322470703100204310ustar00rootroot00000000000000/* * TLS Handshake Serialization * (C) 2012,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_HANDSHAKE_IO_H_ #define BOTAN_TLS_HANDSHAKE_IO_H_ #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { class Handshake_Message; /** * Handshake IO Interface */ class Handshake_IO { public: virtual Protocol_Version initial_record_version() const = 0; virtual std::vector send(const Handshake_Message& msg) = 0; virtual bool timeout_check() = 0; virtual std::vector format( const std::vector& handshake_msg, Handshake_Type handshake_type) const = 0; virtual void add_record(const std::vector& record, Record_Type type, uint64_t sequence_number) = 0; /** * Returns (HANDSHAKE_NONE, std::vector<>()) if no message currently available */ virtual std::pair> get_next_record(bool expecting_ccs) = 0; Handshake_IO() = default; Handshake_IO(const Handshake_IO&) = delete; Handshake_IO& operator=(const Handshake_IO&) = delete; virtual ~Handshake_IO() = default; }; /** * Handshake IO for stream-based handshakes */ class Stream_Handshake_IO final : public Handshake_IO { public: typedef std::function&)> writer_fn; explicit Stream_Handshake_IO(writer_fn writer) : m_send_hs(writer) {} Protocol_Version initial_record_version() const override; bool timeout_check() override { return false; } std::vector send(const Handshake_Message& msg) override; std::vector format( const std::vector& handshake_msg, Handshake_Type handshake_type) const override; void add_record(const std::vector& record, Record_Type type, uint64_t sequence_number) override; std::pair> get_next_record(bool expecting_ccs) override; private: std::deque m_queue; writer_fn m_send_hs; }; /** * Handshake IO for datagram-based handshakes */ class Datagram_Handshake_IO final : public Handshake_IO { public: typedef std::function&)> writer_fn; Datagram_Handshake_IO(writer_fn writer, class Connection_Sequence_Numbers& seq, uint16_t mtu, uint64_t initial_timeout_ms, uint64_t max_timeout_ms) : m_seqs(seq), m_flights(1), m_initial_timeout(initial_timeout_ms), m_max_timeout(max_timeout_ms), m_send_hs(writer), m_mtu(mtu) {} Protocol_Version initial_record_version() const override; bool timeout_check() override; std::vector send(const Handshake_Message& msg) override; std::vector format( const std::vector& handshake_msg, Handshake_Type handshake_type) const override; void add_record(const std::vector& record, Record_Type type, uint64_t sequence_number) override; std::pair> get_next_record(bool expecting_ccs) override; private: void retransmit_flight(size_t flight); void retransmit_last_flight(); std::vector format_fragment( const uint8_t fragment[], size_t fragment_len, uint16_t frag_offset, uint16_t msg_len, Handshake_Type type, uint16_t msg_sequence) const; std::vector format_w_seq( const std::vector& handshake_msg, Handshake_Type handshake_type, uint16_t msg_sequence) const; std::vector send_message(uint16_t msg_seq, uint16_t epoch, Handshake_Type msg_type, const std::vector& msg); class Handshake_Reassembly final { public: void add_fragment(const uint8_t fragment[], size_t fragment_length, size_t fragment_offset, uint16_t epoch, uint8_t msg_type, size_t msg_length); bool complete() const; uint16_t epoch() const { return m_epoch; } std::pair> message() const; private: uint8_t m_msg_type = HANDSHAKE_NONE; size_t m_msg_length = 0; uint16_t m_epoch = 0; // vector m_seen; // vector m_fragments std::map m_fragments; std::vector m_message; }; struct Message_Info final { Message_Info(uint16_t e, Handshake_Type mt, const std::vector& msg) : epoch(e), msg_type(mt), msg_bits(msg) {} Message_Info() : epoch(0xFFFF), msg_type(HANDSHAKE_NONE) {} uint16_t epoch; Handshake_Type msg_type; std::vector msg_bits; }; class Connection_Sequence_Numbers& m_seqs; std::map m_messages; std::set m_ccs_epochs; std::vector> m_flights; std::map m_flight_data; uint64_t m_initial_timeout = 0; uint64_t m_max_timeout = 0; uint64_t m_last_write = 0; uint64_t m_next_timeout = 0; uint16_t m_in_message_seq = 0; uint16_t m_out_message_seq = 0; writer_fn m_send_hs; uint16_t m_mtu; }; } } #endif botan-2.4.0/src/lib/tls/tls_handshake_msg.h000066400000000000000000000015711322470703100206110ustar00rootroot00000000000000/* * TLS Handshake Message * (C) 2012 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_HANDSHAKE_MSG_H_ #define BOTAN_TLS_HANDSHAKE_MSG_H_ #include #include #include namespace Botan { namespace TLS { class Handshake_IO; class Handshake_Hash; /** * TLS Handshake Message Base Class */ class BOTAN_PUBLIC_API(2,0) Handshake_Message { public: /** * @return string representation of this message type */ std::string type_string() const; /** * @return the message type */ virtual Handshake_Type type() const = 0; /** * @return DER representation of this message */ virtual std::vector serialize() const = 0; virtual ~Handshake_Message() = default; }; } } #endif botan-2.4.0/src/lib/tls/tls_handshake_state.cpp000066400000000000000000000355431322470703100215040ustar00rootroot00000000000000/* * TLS Handshaking * (C) 2004-2006,2011,2012,2015,2016 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace TLS { std::string Handshake_Message::type_string() const { return handshake_type_to_string(type()); } const char* handshake_type_to_string(Handshake_Type type) { switch(type) { case HELLO_VERIFY_REQUEST: return "hello_verify_request"; case HELLO_REQUEST: return "hello_request"; case CLIENT_HELLO: return "client_hello"; case SERVER_HELLO: return "server_hello"; case CERTIFICATE: return "certificate"; case CERTIFICATE_URL: return "certificate_url"; case CERTIFICATE_STATUS: return "certificate_status"; case SERVER_KEX: return "server_key_exchange"; case CERTIFICATE_REQUEST: return "certificate_request"; case SERVER_HELLO_DONE: return "server_hello_done"; case CERTIFICATE_VERIFY: return "certificate_verify"; case CLIENT_KEX: return "client_key_exchange"; case NEW_SESSION_TICKET: return "new_session_ticket"; case HANDSHAKE_CCS: return "change_cipher_spec"; case FINISHED: return "finished"; case HANDSHAKE_NONE: return "invalid"; } throw TLS_Exception(Alert::UNEXPECTED_MESSAGE, "Unknown TLS handshake message type " + std::to_string(type)); } namespace { uint32_t bitmask_for_handshake_type(Handshake_Type type) { switch(type) { case HELLO_VERIFY_REQUEST: return (1 << 0); case HELLO_REQUEST: return (1 << 1); case CLIENT_HELLO: return (1 << 2); case SERVER_HELLO: return (1 << 3); case CERTIFICATE: return (1 << 4); case CERTIFICATE_URL: return (1 << 5); case CERTIFICATE_STATUS: return (1 << 6); case SERVER_KEX: return (1 << 7); case CERTIFICATE_REQUEST: return (1 << 8); case SERVER_HELLO_DONE: return (1 << 9); case CERTIFICATE_VERIFY: return (1 << 10); case CLIENT_KEX: return (1 << 11); case NEW_SESSION_TICKET: return (1 << 12); case HANDSHAKE_CCS: return (1 << 13); case FINISHED: return (1 << 14); // allow explicitly disabling new handshakes case HANDSHAKE_NONE: return 0; } throw TLS_Exception(Alert::UNEXPECTED_MESSAGE, "Unknown TLS handshake message type " + std::to_string(type)); } std::string handshake_mask_to_string(uint32_t mask) { const Handshake_Type types[] = { HELLO_VERIFY_REQUEST, HELLO_REQUEST, CLIENT_HELLO, CERTIFICATE, CERTIFICATE_URL, CERTIFICATE_STATUS, SERVER_KEX, CERTIFICATE_REQUEST, SERVER_HELLO_DONE, CERTIFICATE_VERIFY, CLIENT_KEX, NEW_SESSION_TICKET, HANDSHAKE_CCS, FINISHED }; std::ostringstream o; bool empty = true; for(auto&& t : types) { if(mask & bitmask_for_handshake_type(t)) { if(!empty) o << ","; o << handshake_type_to_string(t); empty = false; } } return o.str(); } } /* * Initialize the SSL/TLS Handshake State */ Handshake_State::Handshake_State(Handshake_IO* io, Callbacks& cb) : m_callbacks(cb), m_handshake_io(io), m_version(m_handshake_io->initial_record_version()) { } void Handshake_State::note_message(const Handshake_Message& msg) { m_callbacks.tls_inspect_handshake_msg(msg); } void Handshake_State::hello_verify_request(const Hello_Verify_Request& hello_verify) { note_message(hello_verify); m_client_hello->update_hello_cookie(hello_verify); hash().reset(); hash().update(handshake_io().send(*m_client_hello)); note_message(*m_client_hello); } void Handshake_State::client_hello(Client_Hello* client_hello) { m_client_hello.reset(client_hello); note_message(*m_client_hello); } void Handshake_State::server_hello(Server_Hello* server_hello) { m_server_hello.reset(server_hello); m_ciphersuite = Ciphersuite::by_id(m_server_hello->ciphersuite()); note_message(*m_server_hello); } void Handshake_State::server_certs(Certificate* server_certs) { m_server_certs.reset(server_certs); note_message(*m_server_certs); } void Handshake_State::server_cert_status(Certificate_Status* server_cert_status) { m_server_cert_status.reset(server_cert_status); note_message(*m_server_cert_status); } void Handshake_State::server_kex(Server_Key_Exchange* server_kex) { m_server_kex.reset(server_kex); note_message(*m_server_kex); } void Handshake_State::cert_req(Certificate_Req* cert_req) { m_cert_req.reset(cert_req); note_message(*m_cert_req); } void Handshake_State::server_hello_done(Server_Hello_Done* server_hello_done) { m_server_hello_done.reset(server_hello_done); note_message(*m_server_hello_done); } void Handshake_State::client_certs(Certificate* client_certs) { m_client_certs.reset(client_certs); note_message(*m_client_certs); } void Handshake_State::client_kex(Client_Key_Exchange* client_kex) { m_client_kex.reset(client_kex); note_message(*m_client_kex); } void Handshake_State::client_verify(Certificate_Verify* client_verify) { m_client_verify.reset(client_verify); note_message(*m_client_verify); } void Handshake_State::new_session_ticket(New_Session_Ticket* new_session_ticket) { m_new_session_ticket.reset(new_session_ticket); note_message(*m_new_session_ticket); } void Handshake_State::server_finished(Finished* server_finished) { m_server_finished.reset(server_finished); note_message(*m_server_finished); } void Handshake_State::client_finished(Finished* client_finished) { m_client_finished.reset(client_finished); note_message(*m_client_finished); } void Handshake_State::set_version(const Protocol_Version& version) { m_version = version; } void Handshake_State::compute_session_keys() { m_session_keys = Session_Keys(this, client_kex()->pre_master_secret(), false); } void Handshake_State::compute_session_keys(const secure_vector& resume_master_secret) { m_session_keys = Session_Keys(this, resume_master_secret, true); } void Handshake_State::confirm_transition_to(Handshake_Type handshake_msg) { const uint32_t mask = bitmask_for_handshake_type(handshake_msg); m_hand_received_mask |= mask; const bool ok = (m_hand_expecting_mask & mask) != 0; // overlap? if(!ok) throw Unexpected_Message("Unexpected state transition in handshake, got type " + std::to_string(handshake_msg) + " expected " + handshake_mask_to_string(m_hand_expecting_mask) + " received " + handshake_mask_to_string(m_hand_received_mask)); /* We don't know what to expect next, so force a call to set_expected_next; if it doesn't happen, the next transition check will always fail which is what we want. */ m_hand_expecting_mask = 0; } void Handshake_State::set_expected_next(Handshake_Type handshake_msg) { m_hand_expecting_mask |= bitmask_for_handshake_type(handshake_msg); } bool Handshake_State::received_handshake_msg(Handshake_Type handshake_msg) const { const uint32_t mask = bitmask_for_handshake_type(handshake_msg); return (m_hand_received_mask & mask) != 0; } std::pair> Handshake_State::get_next_handshake_msg() { const bool expecting_ccs = (bitmask_for_handshake_type(HANDSHAKE_CCS) & m_hand_expecting_mask) != 0; return m_handshake_io->get_next_record(expecting_ccs); } std::string Handshake_State::srp_identifier() const { #if defined(BOTAN_HAS_SRP6) // Authenticated via the successful key exchange if(ciphersuite().valid() && ciphersuite().kex_algo() == "SRP_SHA") return client_hello()->srp_identifier(); #endif return ""; } std::vector Handshake_State::session_ticket() const { if(new_session_ticket() && !new_session_ticket()->ticket().empty()) return new_session_ticket()->ticket(); return client_hello()->session_ticket(); } KDF* Handshake_State::protocol_specific_prf() const { if(version().supports_ciphersuite_specific_prf()) { const std::string prf_algo = ciphersuite().prf_algo(); if(prf_algo == "MD5" || prf_algo == "SHA-1") return get_kdf("TLS-12-PRF(SHA-256)"); return get_kdf("TLS-12-PRF(" + prf_algo + ")"); } // Old PRF used in TLS v1.0, v1.1 and DTLS v1.0 return get_kdf("TLS-PRF"); } namespace { std::string choose_hash(const std::string& sig_algo, std::vector>& supported_algos, Protocol_Version negotiated_version, const Policy& policy) { if(!negotiated_version.supports_negotiable_signature_algorithms()) { if(sig_algo == "RSA") return "Parallel(MD5,SHA-160)"; if(sig_algo == "DSA") return "SHA-1"; if(sig_algo == "ECDSA") return "SHA-1"; throw Internal_Error("Unknown TLS signature algo " + sig_algo); } if(!supported_algos.empty()) { const std::vector hashes = policy.allowed_signature_hashes(); /* * Choose our most preferred hash that the counterparty supports * in pairing with the signature algorithm we want to use. */ for(std::string hash : hashes) { for(auto algo : supported_algos) { if(algo.first == hash && algo.second == sig_algo) return hash; } } } // TLS v1.2 default hash if the counterparty sent nothing return "SHA-1"; } } std::pair Handshake_State::choose_sig_format(const Private_Key& key, std::string& hash_algo_out, std::string& sig_algo_out, bool for_client_auth, const Policy& policy) const { const std::string sig_algo = key.algo_name(); std::vector> supported_algos = (for_client_auth) ? cert_req()->supported_algos() : client_hello()->supported_algos(); const std::string hash_algo = choose_hash(sig_algo, supported_algos, this->version(), policy); if(this->version().supports_negotiable_signature_algorithms()) { // We skip this check for v1.0 since you're stuck with SHA-1 regardless if(!policy.allowed_signature_hash(hash_algo)) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Policy refuses to accept signing with any hash supported by peer"); } hash_algo_out = hash_algo; sig_algo_out = sig_algo; } if(sig_algo == "RSA") { const std::string padding = "EMSA3(" + hash_algo + ")"; return std::make_pair(padding, IEEE_1363); } else if(sig_algo == "DSA" || sig_algo == "ECDSA") { const std::string padding = "EMSA1(" + hash_algo + ")"; return std::make_pair(padding, DER_SEQUENCE); } throw Invalid_Argument(sig_algo + " is invalid/unknown for TLS signatures"); } namespace { bool supported_algos_include( const std::vector>& algos, const std::string& key_type, const std::string& hash_type) { for(auto&& algo : algos) { if(algo.first == hash_type && algo.second == key_type) { return true; } } return false; } } std::pair Handshake_State::parse_sig_format(const Public_Key& key, const std::string& input_hash_algo, const std::string& input_sig_algo, bool for_client_auth, const Policy& policy) const { const std::string key_type = key.algo_name(); if(!policy.allowed_signature_method(key_type)) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Rejecting " + key_type + " signature"); } std::string hash_algo; if(this->version().supports_negotiable_signature_algorithms()) { if(input_sig_algo != key_type) throw Decoding_Error("Counterparty sent inconsistent key and sig types"); if(input_hash_algo == "") throw Decoding_Error("Counterparty did not send hash/sig IDS"); hash_algo = input_hash_algo; if(for_client_auth && !cert_req()) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "No certificate verify set"); } /* Confirm the signature type we just received against the supported_algos list that we sent; it better be there. */ const auto supported_algos = for_client_auth ? cert_req()->supported_algos() : client_hello()->supported_algos(); if(!supported_algos_include(supported_algos, key_type, hash_algo)) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "TLS signature extension did not allow for " + key_type + "/" + hash_algo + " signature"); } } else { if(input_hash_algo != "" || input_sig_algo != "") throw Decoding_Error("Counterparty sent hash/sig IDs with old version"); if(key_type == "RSA") { hash_algo = "Parallel(MD5,SHA-160)"; } else if(key_type == "DSA" || key_type == "ECDSA") { hash_algo = "SHA-1"; } else { throw Invalid_Argument(key_type + " is invalid/unknown for TLS signatures"); } /* There is no check on the acceptability of a v1.0/v1.1 hash type, since it's implicit with use of the protocol */ } if(key_type == "RSA") { const std::string padding = "EMSA3(" + hash_algo + ")"; return std::make_pair(padding, IEEE_1363); } else if(key_type == "DSA" || key_type == "ECDSA") { const std::string padding = "EMSA1(" + hash_algo + ")"; return std::make_pair(padding, DER_SEQUENCE); } throw Invalid_Argument(key_type + " is invalid/unknown for TLS signatures"); } } } botan-2.4.0/src/lib/tls/tls_handshake_state.h000066400000000000000000000146011322470703100211410ustar00rootroot00000000000000/* * TLS Handshake State * (C) 2004-2006,2011,2012 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_HANDSHAKE_STATE_H_ #define BOTAN_TLS_HANDSHAKE_STATE_H_ #include #include #include #include #include #include #include #include #include #include namespace Botan { class KDF; namespace TLS { class Callbacks; class Policy; class Hello_Verify_Request; class Client_Hello; class Server_Hello; class Certificate; class Certificate_Status; class Server_Key_Exchange; class Certificate_Req; class Server_Hello_Done; class Certificate; class Client_Key_Exchange; class Certificate_Verify; class New_Session_Ticket; class Finished; /** * SSL/TLS Handshake State */ class Handshake_State { public: Handshake_State(Handshake_IO* io, Callbacks& callbacks); virtual ~Handshake_State() = default; Handshake_State(const Handshake_State&) = delete; Handshake_State& operator=(const Handshake_State&) = delete; Handshake_IO& handshake_io() { return *m_handshake_io; } /** * Return true iff we have received a particular message already * @param msg_type the message type */ bool received_handshake_msg(Handshake_Type msg_type) const; /** * Confirm that we were expecting this message type * @param msg_type the message type */ void confirm_transition_to(Handshake_Type msg_type); /** * Record that we are expecting a particular message type next * @param msg_type the message type */ void set_expected_next(Handshake_Type msg_type); std::pair> get_next_handshake_msg(); std::vector session_ticket() const; std::pair parse_sig_format(const Public_Key& key, const std::string& hash_algo, const std::string& sig_algo, bool for_client_auth, const Policy& policy) const; std::pair choose_sig_format(const Private_Key& key, std::string& hash_algo, std::string& sig_algo, bool for_client_auth, const Policy& policy) const; std::string srp_identifier() const; KDF* protocol_specific_prf() const; Protocol_Version version() const { return m_version; } void set_version(const Protocol_Version& version); void hello_verify_request(const Hello_Verify_Request& hello_verify); void client_hello(Client_Hello* client_hello); void server_hello(Server_Hello* server_hello); void server_certs(Certificate* server_certs); void server_cert_status(Certificate_Status* server_cert_status); void server_kex(Server_Key_Exchange* server_kex); void cert_req(Certificate_Req* cert_req); void server_hello_done(Server_Hello_Done* server_hello_done); void client_certs(Certificate* client_certs); void client_kex(Client_Key_Exchange* client_kex); void client_verify(Certificate_Verify* client_verify); void new_session_ticket(New_Session_Ticket* new_session_ticket); void server_finished(Finished* server_finished); void client_finished(Finished* client_finished); const Client_Hello* client_hello() const { return m_client_hello.get(); } const Server_Hello* server_hello() const { return m_server_hello.get(); } const Certificate* server_certs() const { return m_server_certs.get(); } const Server_Key_Exchange* server_kex() const { return m_server_kex.get(); } const Certificate_Req* cert_req() const { return m_cert_req.get(); } const Server_Hello_Done* server_hello_done() const { return m_server_hello_done.get(); } const Certificate* client_certs() const { return m_client_certs.get(); } const Client_Key_Exchange* client_kex() const { return m_client_kex.get(); } const Certificate_Verify* client_verify() const { return m_client_verify.get(); } const Certificate_Status* server_cert_status() const { return m_server_cert_status.get(); } const New_Session_Ticket* new_session_ticket() const { return m_new_session_ticket.get(); } const Finished* server_finished() const { return m_server_finished.get(); } const Finished* client_finished() const { return m_client_finished.get(); } const Ciphersuite& ciphersuite() const { return m_ciphersuite; } const Session_Keys& session_keys() const { return m_session_keys; } Callbacks& callbacks() const { return m_callbacks; } void compute_session_keys(); void compute_session_keys(const secure_vector& resume_master_secret); Handshake_Hash& hash() { return m_handshake_hash; } const Handshake_Hash& hash() const { return m_handshake_hash; } void note_message(const Handshake_Message& msg); private: Callbacks& m_callbacks; std::unique_ptr m_handshake_io; uint32_t m_hand_expecting_mask = 0; uint32_t m_hand_received_mask = 0; Protocol_Version m_version; Ciphersuite m_ciphersuite; Session_Keys m_session_keys; Handshake_Hash m_handshake_hash; std::unique_ptr m_client_hello; std::unique_ptr m_server_hello; std::unique_ptr m_server_certs; std::unique_ptr m_server_cert_status; std::unique_ptr m_server_kex; std::unique_ptr m_cert_req; std::unique_ptr m_server_hello_done; std::unique_ptr m_client_certs; std::unique_ptr m_client_kex; std::unique_ptr m_client_verify; std::unique_ptr m_new_session_ticket; std::unique_ptr m_server_finished; std::unique_ptr m_client_finished; }; } } #endif botan-2.4.0/src/lib/tls/tls_magic.h000066400000000000000000000026471322470703100171020ustar00rootroot00000000000000/* * SSL/TLS Protocol Constants * (C) 2004-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_PROTOCOL_MAGIC_H_ #define BOTAN_TLS_PROTOCOL_MAGIC_H_ namespace Botan { namespace TLS { /** * Protocol Constants for SSL/TLS */ enum Size_Limits { TLS_HEADER_SIZE = 5, DTLS_HEADER_SIZE = TLS_HEADER_SIZE + 8, MAX_PLAINTEXT_SIZE = 16*1024, MAX_COMPRESSED_SIZE = MAX_PLAINTEXT_SIZE + 1024, MAX_CIPHERTEXT_SIZE = MAX_COMPRESSED_SIZE + 1024, }; enum Connection_Side { CLIENT = 1, SERVER = 2 }; enum Record_Type { CHANGE_CIPHER_SPEC = 20, ALERT = 21, HANDSHAKE = 22, APPLICATION_DATA = 23, NO_RECORD = 256 }; enum Handshake_Type { HELLO_REQUEST = 0, CLIENT_HELLO = 1, SERVER_HELLO = 2, HELLO_VERIFY_REQUEST = 3, NEW_SESSION_TICKET = 4, // RFC 5077 CERTIFICATE = 11, SERVER_KEX = 12, CERTIFICATE_REQUEST = 13, SERVER_HELLO_DONE = 14, CERTIFICATE_VERIFY = 15, CLIENT_KEX = 16, FINISHED = 20, CERTIFICATE_URL = 21, CERTIFICATE_STATUS = 22, HANDSHAKE_CCS = 254, // Not a wire value HANDSHAKE_NONE = 255 // Null value }; const char* handshake_type_to_string(Handshake_Type t); enum Compression_Method { NO_COMPRESSION = 0x00, DEFLATE_COMPRESSION = 0x01 }; } } #endif botan-2.4.0/src/lib/tls/tls_messages.h000066400000000000000000000461221322470703100176250ustar00rootroot00000000000000/* * TLS Messages * (C) 2004-2011,2015 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_MESSAGES_H_ #define BOTAN_TLS_MESSAGES_H_ #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_CECPQ1) #include #endif #if defined(BOTAN_HAS_SRP6) #include #endif namespace Botan { class Public_Key; class Credentials_Manager; namespace TLS { class Session; class Handshake_IO; class Handshake_State; std::vector make_hello_random(RandomNumberGenerator& rng, const Policy& policy); /** * DTLS Hello Verify Request */ class BOTAN_UNSTABLE_API Hello_Verify_Request final : public Handshake_Message { public: std::vector serialize() const override; Handshake_Type type() const override { return HELLO_VERIFY_REQUEST; } std::vector cookie() const { return m_cookie; } explicit Hello_Verify_Request(const std::vector& buf); Hello_Verify_Request(const std::vector& client_hello_bits, const std::string& client_identity, const SymmetricKey& secret_key); private: std::vector m_cookie; }; /** * Client Hello Message */ class BOTAN_UNSTABLE_API Client_Hello final : public Handshake_Message { public: class Settings final { public: Settings(const Protocol_Version version, const std::string& hostname = "", const std::string& srp_identifier = "") : m_new_session_version(version), m_hostname(hostname), m_srp_identifier(srp_identifier) {} const Protocol_Version protocol_version() const { return m_new_session_version; } const std::string& hostname() const { return m_hostname; } const std::string& srp_identifier() const { return m_srp_identifier; } private: const Protocol_Version m_new_session_version; const std::string m_hostname; const std::string m_srp_identifier; }; Handshake_Type type() const override { return CLIENT_HELLO; } Protocol_Version version() const { return m_version; } const std::vector& random() const { return m_random; } const std::vector& session_id() const { return m_session_id; } const std::vector& ciphersuites() const { return m_suites; } const std::vector& compression_methods() const { return m_comp_methods; } bool offered_suite(uint16_t ciphersuite) const; bool sent_fallback_scsv() const; std::vector> supported_algos() const; std::set supported_sig_algos() const; std::vector supported_ecc_curves() const; std::vector supported_dh_groups() const; bool prefers_compressed_ec_points() const; std::string sni_hostname() const; #if defined(BOTAN_HAS_SRP6) std::string srp_identifier() const; #endif bool secure_renegotiation() const; std::vector renegotiation_info() const; bool supports_session_ticket() const; std::vector session_ticket() const; bool supports_alpn() const; bool supports_extended_master_secret() const; bool supports_cert_status_message() const; bool supports_encrypt_then_mac() const; bool sent_signature_algorithms() const; std::vector next_protocols() const; std::vector srtp_profiles() const; void update_hello_cookie(const Hello_Verify_Request& hello_verify); std::set extension_types() const { return m_extensions.extension_types(); } Client_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& reneg_info, const Client_Hello::Settings& client_settings, const std::vector& next_protocols); Client_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& reneg_info, const Session& resumed_session, const std::vector& next_protocols); explicit Client_Hello(const std::vector& buf); private: std::vector serialize() const override; Protocol_Version m_version; std::vector m_session_id; std::vector m_random; std::vector m_suites; std::vector m_comp_methods; std::vector m_hello_cookie; // DTLS only Extensions m_extensions; }; /** * Server Hello Message */ class BOTAN_UNSTABLE_API Server_Hello final : public Handshake_Message { public: class Settings final { public: Settings(const std::vector new_session_id, Protocol_Version new_session_version, uint16_t ciphersuite, uint8_t compression, bool offer_session_ticket) : m_new_session_id(new_session_id), m_new_session_version(new_session_version), m_ciphersuite(ciphersuite), m_compression(compression), m_offer_session_ticket(offer_session_ticket) {} const std::vector& session_id() const { return m_new_session_id; } Protocol_Version protocol_version() const { return m_new_session_version; } uint16_t ciphersuite() const { return m_ciphersuite; } uint8_t compression() const { return m_compression; } bool offer_session_ticket() const { return m_offer_session_ticket; } private: const std::vector m_new_session_id; Protocol_Version m_new_session_version; uint16_t m_ciphersuite; uint8_t m_compression; bool m_offer_session_ticket; }; Handshake_Type type() const override { return SERVER_HELLO; } Protocol_Version version() const { return m_version; } const std::vector& random() const { return m_random; } const std::vector& session_id() const { return m_session_id; } uint16_t ciphersuite() const { return m_ciphersuite; } uint8_t compression_method() const { return m_comp_method; } bool secure_renegotiation() const { return m_extensions.has(); } std::vector renegotiation_info() const { if(Renegotiation_Extension* reneg = m_extensions.get()) return reneg->renegotiation_info(); return std::vector(); } bool supports_extended_master_secret() const { return m_extensions.has(); } bool supports_encrypt_then_mac() const { return m_extensions.has(); } bool supports_certificate_status_message() const { return m_extensions.has(); } bool supports_session_ticket() const { return m_extensions.has(); } uint16_t srtp_profile() const { if(auto srtp = m_extensions.get()) { auto prof = srtp->profiles(); if(prof.size() != 1 || prof[0] == 0) throw Decoding_Error("Server sent malformed DTLS-SRTP extension"); return prof[0]; } return 0; } std::string next_protocol() const { if(auto alpn = m_extensions.get()) return alpn->single_protocol(); return ""; } std::set extension_types() const { return m_extensions.extension_types(); } bool prefers_compressed_ec_points() const { if(auto ecc_formats = m_extensions.get()) { return ecc_formats->prefers_compressed(); } return false; } Server_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& secure_reneg_info, const Client_Hello& client_hello, const Server_Hello::Settings& settings, const std::string next_protocol); Server_Hello(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, RandomNumberGenerator& rng, const std::vector& secure_reneg_info, const Client_Hello& client_hello, Session& resumed_session, bool offer_session_ticket, const std::string& next_protocol); explicit Server_Hello(const std::vector& buf); private: std::vector serialize() const override; Protocol_Version m_version; std::vector m_session_id, m_random; uint16_t m_ciphersuite; uint8_t m_comp_method; Extensions m_extensions; }; /** * Client Key Exchange Message */ class BOTAN_UNSTABLE_API Client_Key_Exchange final : public Handshake_Message { public: Handshake_Type type() const override { return CLIENT_KEX; } const secure_vector& pre_master_secret() const { return m_pre_master; } Client_Key_Exchange(Handshake_IO& io, Handshake_State& state, const Policy& policy, Credentials_Manager& creds, const Public_Key* server_public_key, const std::string& hostname, RandomNumberGenerator& rng); Client_Key_Exchange(const std::vector& buf, const Handshake_State& state, const Private_Key* server_rsa_kex_key, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng); private: std::vector serialize() const override { return m_key_material; } std::vector m_key_material; secure_vector m_pre_master; }; /** * Certificate Message */ class BOTAN_UNSTABLE_API Certificate final : public Handshake_Message { public: Handshake_Type type() const override { return CERTIFICATE; } const std::vector& cert_chain() const { return m_certs; } size_t count() const { return m_certs.size(); } bool empty() const { return m_certs.empty(); } Certificate(Handshake_IO& io, Handshake_Hash& hash, const std::vector& certs); explicit Certificate(const std::vector& buf, const Policy &policy); private: std::vector serialize() const override; std::vector m_certs; }; /** * Certificate Status (RFC 6066) */ class BOTAN_UNSTABLE_API Certificate_Status final : public Handshake_Message { public: Handshake_Type type() const override { return CERTIFICATE_STATUS; } std::shared_ptr response() const { return m_response; } Certificate_Status(const std::vector& buf); Certificate_Status(Handshake_IO& io, Handshake_Hash& hash, std::shared_ptr response); private: std::vector serialize() const override; std::shared_ptr m_response; }; /** * Certificate Request Message */ class BOTAN_UNSTABLE_API Certificate_Req final : public Handshake_Message { public: Handshake_Type type() const override { return CERTIFICATE_REQUEST; } const std::vector& acceptable_cert_types() const { return m_cert_key_types; } std::vector acceptable_CAs() const { return m_names; } std::vector > supported_algos() const { return m_supported_algos; } Certificate_Req(Handshake_IO& io, Handshake_Hash& hash, const Policy& policy, const std::vector& allowed_cas, Protocol_Version version); Certificate_Req(const std::vector& buf, Protocol_Version version); private: std::vector serialize() const override; std::vector m_names; std::vector m_cert_key_types; std::vector > m_supported_algos; }; /** * Certificate Verify Message */ class BOTAN_UNSTABLE_API Certificate_Verify final : public Handshake_Message { public: Handshake_Type type() const override { return CERTIFICATE_VERIFY; } /** * Check the signature on a certificate verify message * @param cert the purported certificate * @param state the handshake state * @param policy the TLS policy */ bool verify(const X509_Certificate& cert, const Handshake_State& state, const Policy& policy) const; Certificate_Verify(Handshake_IO& io, Handshake_State& state, const Policy& policy, RandomNumberGenerator& rng, const Private_Key* key); Certificate_Verify(const std::vector& buf, Protocol_Version version); private: std::vector serialize() const override; std::string m_sig_algo; // sig algo used to create signature std::string m_hash_algo; // hash used to create signature std::vector m_signature; }; /** * Finished Message */ class BOTAN_UNSTABLE_API Finished final : public Handshake_Message { public: Handshake_Type type() const override { return FINISHED; } std::vector verify_data() const { return m_verification_data; } bool verify(const Handshake_State& state, Connection_Side side) const; Finished(Handshake_IO& io, Handshake_State& state, Connection_Side side); explicit Finished(const std::vector& buf); private: std::vector serialize() const override; std::vector m_verification_data; }; /** * Hello Request Message */ class BOTAN_UNSTABLE_API Hello_Request final : public Handshake_Message { public: Handshake_Type type() const override { return HELLO_REQUEST; } explicit Hello_Request(Handshake_IO& io); explicit Hello_Request(const std::vector& buf); private: std::vector serialize() const override; }; /** * Server Key Exchange Message */ class BOTAN_UNSTABLE_API Server_Key_Exchange final : public Handshake_Message { public: Handshake_Type type() const override { return SERVER_KEX; } const std::vector& params() const { return m_params; } bool verify(const Public_Key& server_key, const Handshake_State& state, const Policy& policy) const; // Only valid for certain kex types const Private_Key& server_kex_key() const; #if defined(BOTAN_HAS_SRP6) // Only valid for SRP negotiation SRP6_Server_Session& server_srp_params() const { BOTAN_ASSERT_NONNULL(m_srp_params); return *m_srp_params; } #endif #if defined(BOTAN_HAS_CECPQ1) // Only valid for CECPQ1 negotiation const CECPQ1_key& cecpq1_key() const { BOTAN_ASSERT_NONNULL(m_cecpq1_key); return *m_cecpq1_key; } #endif Server_Key_Exchange(Handshake_IO& io, Handshake_State& state, const Policy& policy, Credentials_Manager& creds, RandomNumberGenerator& rng, const Private_Key* signing_key = nullptr); Server_Key_Exchange(const std::vector& buf, const std::string& kex_alg, const std::string& sig_alg, Protocol_Version version); ~Server_Key_Exchange() = default; private: std::vector serialize() const override; #if defined(BOTAN_HAS_SRP6) std::unique_ptr m_srp_params; #endif #if defined(BOTAN_HAS_CECPQ1) std::unique_ptr m_cecpq1_key; #endif std::unique_ptr m_kex_key; std::vector m_params; std::string m_sig_algo; // sig algo used to create signature std::string m_hash_algo; // hash used to create signature std::vector m_signature; }; /** * Server Hello Done Message */ class BOTAN_UNSTABLE_API Server_Hello_Done final : public Handshake_Message { public: Handshake_Type type() const override { return SERVER_HELLO_DONE; } Server_Hello_Done(Handshake_IO& io, Handshake_Hash& hash); explicit Server_Hello_Done(const std::vector& buf); private: std::vector serialize() const override; }; /** * New Session Ticket Message */ class BOTAN_UNSTABLE_API New_Session_Ticket final : public Handshake_Message { public: Handshake_Type type() const override { return NEW_SESSION_TICKET; } uint32_t ticket_lifetime_hint() const { return m_ticket_lifetime_hint; } const std::vector& ticket() const { return m_ticket; } New_Session_Ticket(Handshake_IO& io, Handshake_Hash& hash, const std::vector& ticket, uint32_t lifetime); New_Session_Ticket(Handshake_IO& io, Handshake_Hash& hash); explicit New_Session_Ticket(const std::vector& buf); private: std::vector serialize() const override; uint32_t m_ticket_lifetime_hint = 0; std::vector m_ticket; }; /** * Change Cipher Spec */ class BOTAN_UNSTABLE_API Change_Cipher_Spec final : public Handshake_Message { public: Handshake_Type type() const override { return HANDSHAKE_CCS; } std::vector serialize() const override { return std::vector(1, 1); } }; } } #endif botan-2.4.0/src/lib/tls/tls_policy.cpp000066400000000000000000000411031322470703100176420ustar00rootroot00000000000000/* * Policies for TLS * (C) 2004-2010,2012,2015,2016 Jack Lloyd * 2016 Christian Mainka * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { std::vector Policy::allowed_ciphers() const { return { //"AES-256/OCB(12)", //"AES-128/OCB(12)", "ChaCha20Poly1305", "AES-256/GCM", "AES-128/GCM", "AES-256/CCM", "AES-128/CCM", //"AES-256/CCM(8)", //"AES-128/CCM(8)", //"Camellia-256/GCM", //"Camellia-128/GCM", //"ARIA-256/GCM", //"ARIA-128/GCM", "AES-256", "AES-128", //"Camellia-256", //"Camellia-128", //"SEED" //"3DES", }; } std::vector Policy::allowed_signature_hashes() const { return { "SHA-512", "SHA-384", "SHA-256", //"SHA-1", }; } std::vector Policy::allowed_macs() const { /* SHA-256 is preferred because the Lucky13 countermeasure works somewhat better for SHA-256 vs SHA-384: https://github.com/randombit/botan/pull/675 */ return { "AEAD", "SHA-256", "SHA-384", "SHA-1", }; } std::vector Policy::allowed_key_exchange_methods() const { return { //"SRP_SHA", //"ECDHE_PSK", //"DHE_PSK", //"PSK", "CECPQ1", "ECDH", "DH", //"RSA", }; } std::vector Policy::allowed_signature_methods() const { return { "ECDSA", "RSA", //"DSA", //"" (anon) }; } bool Policy::allowed_signature_method(const std::string& sig_method) const { return value_exists(allowed_signature_methods(), sig_method); } bool Policy::allowed_signature_hash(const std::string& sig_hash) const { return value_exists(allowed_signature_hashes(), sig_hash); } std::vector Policy::allowed_ecc_curves() const { // Default list is ordered by performance return { "x25519", "secp256r1", "secp521r1", "secp384r1", "brainpool256r1", "brainpool384r1", "brainpool512r1", }; } bool Policy::allowed_ecc_curve(const std::string& curve) const { if(!allowed_ecc_curves().empty()) { return value_exists(allowed_ecc_curves(), curve); } return value_exists(allowed_groups(), curve); } bool Policy::use_ecc_point_compression() const { return false; } /* * Choose an ECC curve to use */ std::string Policy::choose_curve(const std::vector& curve_names) const { const std::vector our_groups = allowed_groups(); for(size_t i = 0; i != our_groups.size(); ++i) if(!Supported_Groups::is_dh_group(our_groups[i]) && value_exists(curve_names, our_groups[i])) return our_groups[i]; return ""; // no shared curve } /* * Choose an FFDHE group to use */ std::string Policy::choose_dh_group(const std::vector& dh_groups) const { const std::vector our_groups = allowed_groups(); for(size_t i = 0; i != our_groups.size(); ++i) if(Supported_Groups::is_dh_group(our_groups[i]) && value_exists(dh_groups, our_groups[i])) return our_groups[i]; return ""; // no shared ffdhe group } std::string Policy::dh_group() const { // We offer 2048 bit DH because we can return "modp/ietf/2048"; } std::vector Policy::allowed_groups() const { // Default list is ordered by performance return { "x25519", "secp256r1", "secp521r1", "secp384r1", "brainpool256r1", "brainpool384r1", "brainpool512r1", "ffdhe/ietf/2048", "ffdhe/ietf/3072", "ffdhe/ietf/4096", "ffdhe/ietf/6144", "ffdhe/ietf/8192" }; } size_t Policy::minimum_dh_group_size() const { return 2048; } size_t Policy::minimum_ecdsa_group_size() const { // Here we are at the mercy of whatever the CA signed, but most certs should be 256 bit by now return 256; } size_t Policy::minimum_ecdh_group_size() const { // x25519 is smallest curve currently supported for TLS key exchange return 255; } size_t Policy::minimum_signature_strength() const { return 110; } bool Policy::require_cert_revocation_info() const { return true; } size_t Policy::minimum_rsa_bits() const { /* Default assumption is all end-entity certificates should be at least 2048 bits these days. If you are connecting to arbitrary servers on the Internet (ie as a web browser or SMTP client) you'll probably have to reduce this to 1024 bits, or perhaps even lower. */ return 2048; } size_t Policy::minimum_dsa_group_size() const { // FIPS 186-3 return 2048; } void Policy::check_peer_key_acceptable(const Public_Key& public_key) const { const std::string algo_name = public_key.algo_name(); const size_t keylength = public_key.key_length(); size_t expected_keylength = 0; if(algo_name == "RSA") { expected_keylength = minimum_rsa_bits(); } else if(algo_name == "DH") { expected_keylength = minimum_dh_group_size(); } else if(algo_name == "DSA") { expected_keylength = minimum_dsa_group_size(); } else if(algo_name == "ECDH" || algo_name == "Curve25519") { expected_keylength = minimum_ecdh_group_size(); } else if(algo_name == "ECDSA") { expected_keylength = minimum_ecdsa_group_size(); } // else some other algo, so leave expected_keylength as zero and the check is a no-op if(keylength < expected_keylength) throw TLS_Exception(Alert::INSUFFICIENT_SECURITY, "Peer sent " + std::to_string(keylength) + " bit " + algo_name + " key" ", policy requires at least " + std::to_string(expected_keylength)); } /* * Return allowed compression algorithms */ std::vector Policy::compression() const { return std::vector{ NO_COMPRESSION }; } uint32_t Policy::session_ticket_lifetime() const { return 86400; // ~1 day } bool Policy::send_fallback_scsv(Protocol_Version version) const { return version != latest_supported_version(version.is_datagram_protocol()); } bool Policy::acceptable_protocol_version(Protocol_Version version) const { // Uses boolean optimization: // First check the current version (left part), then if it is allowed // (right part) // checks are ordered according to their probability return ( ( ( version == Protocol_Version::TLS_V12) && allow_tls12() ) || ( ( version == Protocol_Version::TLS_V10) && allow_tls10() ) || ( ( version == Protocol_Version::TLS_V11) && allow_tls11() ) || ( ( version == Protocol_Version::DTLS_V12) && allow_dtls12() ) || ( ( version == Protocol_Version::DTLS_V10) && allow_dtls10() ) ); } Protocol_Version Policy::latest_supported_version(bool datagram) const { if(datagram) { if(allow_dtls12()) return Protocol_Version::DTLS_V12; if(allow_dtls10()) return Protocol_Version::DTLS_V10; throw Invalid_State("Policy forbids all available DTLS version"); } else { if(allow_tls12()) return Protocol_Version::TLS_V12; if(allow_tls11()) return Protocol_Version::TLS_V11; if(allow_tls10()) return Protocol_Version::TLS_V10; throw Invalid_State("Policy forbids all available TLS version"); } } bool Policy::acceptable_ciphersuite(const Ciphersuite&) const { return true; } bool Policy::allow_client_initiated_renegotiation() const { return false; } bool Policy::allow_server_initiated_renegotiation() const { return false; } bool Policy::allow_insecure_renegotiation() const { return false; } bool Policy::allow_tls10() const { return true; } bool Policy::allow_tls11() const { return true; } bool Policy::allow_tls12() const { return true; } bool Policy::allow_dtls10() const { return false; } bool Policy::allow_dtls12() const { return true; } bool Policy::include_time_in_hello_random() const { return true; } bool Policy::hide_unknown_users() const { return false; } bool Policy::server_uses_own_ciphersuite_preferences() const { return true; } bool Policy::negotiate_encrypt_then_mac() const { return true; } bool Policy::support_cert_status_message() const { return true; } // 1 second initial timeout, 60 second max - see RFC 6347 sec 4.2.4.1 size_t Policy::dtls_initial_timeout() const { return 1*1000; } size_t Policy::dtls_maximum_timeout() const { return 60*1000; } size_t Policy::dtls_default_mtu() const { // default MTU is IPv6 min MTU minus UDP/IP headers return 1280 - 40 - 8; } std::vector Policy::srtp_profiles() const { return std::vector(); } namespace { class Ciphersuite_Preference_Ordering final { public: Ciphersuite_Preference_Ordering(const std::vector& ciphers, const std::vector& macs, const std::vector& kex, const std::vector& sigs) : m_ciphers(ciphers), m_macs(macs), m_kex(kex), m_sigs(sigs) {} bool operator()(const Ciphersuite& a, const Ciphersuite& b) const { if(a.kex_algo() != b.kex_algo()) { for(size_t i = 0; i != m_kex.size(); ++i) { if(a.kex_algo() == m_kex[i]) return true; if(b.kex_algo() == m_kex[i]) return false; } } if(a.cipher_algo() != b.cipher_algo()) { for(size_t i = 0; i != m_ciphers.size(); ++i) { if(a.cipher_algo() == m_ciphers[i]) return true; if(b.cipher_algo() == m_ciphers[i]) return false; } } if(a.cipher_keylen() != b.cipher_keylen()) { if(a.cipher_keylen() < b.cipher_keylen()) return false; if(a.cipher_keylen() > b.cipher_keylen()) return true; } if(a.sig_algo() != b.sig_algo()) { for(size_t i = 0; i != m_sigs.size(); ++i) { if(a.sig_algo() == m_sigs[i]) return true; if(b.sig_algo() == m_sigs[i]) return false; } } if(a.mac_algo() != b.mac_algo()) { for(size_t i = 0; i != m_macs.size(); ++i) { if(a.mac_algo() == m_macs[i]) return true; if(b.mac_algo() == m_macs[i]) return false; } } return false; // equal (?!?) } private: std::vector m_ciphers, m_macs, m_kex, m_sigs; }; } std::vector Policy::ciphersuite_list(Protocol_Version version, bool have_srp) const { const std::vector ciphers = allowed_ciphers(); const std::vector macs = allowed_macs(); const std::vector kex = allowed_key_exchange_methods(); const std::vector sigs = allowed_signature_methods(); std::vector ciphersuites; for(auto&& suite : Ciphersuite::all_known_ciphersuites()) { // Can we use it? if(suite.valid() == false) continue; // Is it acceptable to the policy? if(!this->acceptable_ciphersuite(suite)) continue; // Are we doing SRP? if(!have_srp && suite.kex_algo() == "SRP_SHA") continue; if(!version.supports_aead_modes()) { // Are we doing AEAD in a non-AEAD version? if(suite.mac_algo() == "AEAD") continue; // Older (v1.0/v1.1) versions also do not support any hash but SHA-1 if(suite.mac_algo() != "SHA-1") continue; } if(!value_exists(kex, suite.kex_algo())) continue; // unsupported key exchange if(!value_exists(ciphers, suite.cipher_algo())) continue; // unsupported cipher if(!value_exists(macs, suite.mac_algo())) continue; // unsupported MAC algo if(!value_exists(sigs, suite.sig_algo())) { // allow if it's an empty sig algo and we want to use PSK if(suite.sig_algo() != "" || !suite.psk_ciphersuite()) continue; } /* CECPQ1 always uses x25519 for ECDH, so treat the applications removal of x25519 from the ECC curve list as equivalent to saying they do not trust CECPQ1 */ if(suite.kex_algo() == "CECPQ1" && allowed_ecc_curve("x25519") == false) continue; // OK, consider it ciphersuites.push_back(suite); } if(ciphersuites.empty()) { throw Exception("Policy does not allow any available cipher suite"); } Ciphersuite_Preference_Ordering order(ciphers, macs, kex, sigs); std::sort(ciphersuites.begin(), ciphersuites.end(), order); std::vector ciphersuite_codes; for(auto i : ciphersuites) ciphersuite_codes.push_back(i.ciphersuite_code()); return ciphersuite_codes; } namespace { void print_vec(std::ostream& o, const char* key, const std::vector& v) { o << key << " = "; for(size_t i = 0; i != v.size(); ++i) { o << v[i]; if(i != v.size() - 1) o << ' '; } o << '\n'; } void print_bool(std::ostream& o, const char* key, bool b) { o << key << " = " << (b ? "true" : "false") << '\n'; } } void Policy::print(std::ostream& o) const { print_bool(o, "allow_tls10", allow_tls10()); print_bool(o, "allow_tls11", allow_tls11()); print_bool(o, "allow_tls12", allow_tls12()); print_bool(o, "allow_dtls10", allow_dtls10()); print_bool(o, "allow_dtls12", allow_dtls12()); print_vec(o, "ciphers", allowed_ciphers()); print_vec(o, "macs", allowed_macs()); print_vec(o, "signature_hashes", allowed_signature_hashes()); print_vec(o, "signature_methods", allowed_signature_methods()); print_vec(o, "key_exchange_methods", allowed_key_exchange_methods()); print_vec(o, "ecc_curves", allowed_ecc_curves()); print_vec(o, "groups", allowed_groups()); print_bool(o, "allow_insecure_renegotiation", allow_insecure_renegotiation()); print_bool(o, "include_time_in_hello_random", include_time_in_hello_random()); print_bool(o, "allow_server_initiated_renegotiation", allow_server_initiated_renegotiation()); print_bool(o, "hide_unknown_users", hide_unknown_users()); print_bool(o, "server_uses_own_ciphersuite_preferences", server_uses_own_ciphersuite_preferences()); print_bool(o, "negotiate_encrypt_then_mac", negotiate_encrypt_then_mac()); print_bool(o, "support_cert_status_message", support_cert_status_message()); o << "session_ticket_lifetime = " << session_ticket_lifetime() << '\n'; o << "dh_group = " << dh_group() << '\n'; o << "minimum_dh_group_size = " << minimum_dh_group_size() << '\n'; o << "minimum_ecdh_group_size = " << minimum_ecdh_group_size() << '\n'; o << "minimum_rsa_bits = " << minimum_rsa_bits() << '\n'; o << "minimum_signature_strength = " << minimum_signature_strength() << '\n'; } std::string Policy::to_string() const { std::ostringstream oss; this->print(oss); return oss.str(); } std::vector Strict_Policy::allowed_ciphers() const { return { "ChaCha20Poly1305", "AES-256/GCM", "AES-128/GCM" }; } std::vector Strict_Policy::allowed_signature_hashes() const { return { "SHA-512", "SHA-384"}; } std::vector Strict_Policy::allowed_macs() const { return { "AEAD" }; } std::vector Strict_Policy::allowed_key_exchange_methods() const { return { "CECPQ1", "ECDH" }; } bool Strict_Policy::allow_tls10() const { return false; } bool Strict_Policy::allow_tls11() const { return false; } bool Strict_Policy::allow_tls12() const { return true; } bool Strict_Policy::allow_dtls10() const { return false; } bool Strict_Policy::allow_dtls12() const { return true; } } } botan-2.4.0/src/lib/tls/tls_policy.h000066400000000000000000000450771322470703100173250ustar00rootroot00000000000000/* * Hooks for application level policies on TLS connections * (C) 2004-2006,2013 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_POLICY_H_ #define BOTAN_TLS_POLICY_H_ #include #include #include #include namespace Botan { class Public_Key; namespace TLS { /** * TLS Policy Base Class * Inherit and overload as desired to suit local policy concerns */ class BOTAN_PUBLIC_API(2,0) Policy { public: /** * Returns a list of ciphers we are willing to negotiate, in * order of preference. */ virtual std::vector allowed_ciphers() const; /** * Returns a list of hash algorithms we are willing to use for * signatures, in order of preference. */ virtual std::vector allowed_signature_hashes() const; /** * Returns a list of MAC algorithms we are willing to use. */ virtual std::vector allowed_macs() const; /** * Returns a list of key exchange algorithms we are willing to * use, in order of preference. Allowed values: DH, empty string * (representing RSA using server certificate key) */ virtual std::vector allowed_key_exchange_methods() const; /** * Returns a list of signature algorithms we are willing to * use, in order of preference. Allowed values RSA and DSA. */ virtual std::vector allowed_signature_methods() const; /** * The minimum signature strength we will accept * Returning 80 allows RSA 1024 and SHA-1. Values larger than 80 disable SHA-1 support. * Returning 110 allows RSA 2048. * Return 128 to force ECC (P-256) or large (~3000 bit) RSA keys. * Default is 110 */ virtual size_t minimum_signature_strength() const; /** * Return if cert revocation info (CRL/OCSP) is required * If true, validation will fail unless a valid CRL or OCSP response * was examined. */ virtual bool require_cert_revocation_info() const; bool allowed_signature_method(const std::string& sig_method) const; bool allowed_signature_hash(const std::string& hash) const; /** * Return list of ECC curves we are willing to use in order of preference. * Allowed values: x25519, secp256r1, secp384r1, secp521r1, * brainpool256r1, brainpool384r1, brainpool512r1 */ virtual std::vector allowed_ecc_curves() const; bool allowed_ecc_curve(const std::string& curve) const; /** * Return list of ECC curves and FFDHE groups * we are willing to use in order of preference. * Allowed values: x25519, secp256r1, secp384r1, secp521r1, * brainpool256r1, brainpool384r1, brainpool512r1, * ffdhe/ietf/2048, ffdhe/ietf/3072, ffdhe/ietf/4096, * ffdhe/ietf/6144, ffdhe/ietf/8192 */ virtual std::vector allowed_groups() const; /** * Request that ECC curve points are sent compressed */ virtual bool use_ecc_point_compression() const; /** * Returns a list of compression algorithms we are willing to use, * in order of preference. Allowed values any value of * Compression_Method. * * @note Compression is not currently supported */ virtual std::vector compression() const; /** * Choose an elliptic curve to use */ virtual std::string choose_curve(const std::vector& curve_names) const; /** * Choose an FFHDE group to use */ virtual std::string choose_dh_group(const std::vector& dh_group_names) const; /** * Allow renegotiation even if the counterparty doesn't * support the secure renegotiation extension. * * @warning Changing this to true exposes you to injected * plaintext attacks. Read RFC 5746 for background. */ virtual bool allow_insecure_renegotiation() const; /** * The protocol dictates that the first 32 bits of the random * field are the current time in seconds. However this allows * client fingerprinting attacks. Set to false to disable, in * which case random bytes will be used instead. */ virtual bool include_time_in_hello_random() const; /** * Consulted by server side. If true, allows clients to initiate a new handshake */ virtual bool allow_client_initiated_renegotiation() const; /** * Consulted by client side. If true, allows servers to initiate a new handshake */ virtual bool allow_server_initiated_renegotiation() const; /** * Allow TLS v1.0 */ virtual bool allow_tls10() const; /** * Allow TLS v1.1 */ virtual bool allow_tls11() const; /** * Allow TLS v1.2 */ virtual bool allow_tls12() const; /** * Allow DTLS v1.0 */ virtual bool allow_dtls10() const; /** * Allow DTLS v1.2 */ virtual bool allow_dtls12() const; virtual std::string dh_group() const; /** * Return the minimum DH group size we're willing to use * Default is currently 1024 (insecure), should be 2048 */ virtual size_t minimum_dh_group_size() const; /** * For ECDSA authenticated ciphersuites, the smallest key size the * client will accept. * This policy is currently only enforced on the server by the client. */ virtual size_t minimum_ecdsa_group_size() const; /** * Return the minimum ECDH group size we're willing to use * for key exchange * * Default 255, allowing x25519 and larger * x25519 is the smallest curve we will negotiate * P-521 is the largest */ virtual size_t minimum_ecdh_group_size() const; /** * Return the minimum bit size we're willing to accept for RSA * key exchange or server signatures. * * It does not place any requirements on the size of any RSA signature(s) * which were used to check the server certificate. This is only * concerned with the server's public key. * * Default is 2048 which is smallest RSA key size still secure * for medium term security. */ virtual size_t minimum_rsa_bits() const; /** * Minimum DSA group size, default 2048 bits */ virtual size_t minimum_dsa_group_size() const; /** * Throw an exception if you don't like the peer's key. * Default impl checks the key size against minimum_rsa_bits, minimum_ecdsa_group_size, * or minimum_ecdh_group_size depending on the key's type. * Override if you'd like to perform some other kind of test on * (or logging of) the peer's keys. */ virtual void check_peer_key_acceptable(const Public_Key& public_key) const; /** * If this function returns false, unknown SRP/PSK identifiers * will be rejected with an unknown_psk_identifier alert as soon * as the non-existence is identified. Otherwise, a false * identifier value will be used and the protocol allowed to * proceed, causing the handshake to eventually fail without * revealing that the username does not exist on this system. */ virtual bool hide_unknown_users() const; /** * Return the allowed lifetime of a session ticket. If 0, session * tickets do not expire until the session ticket key rolls over. * Expired session tickets cannot be used to resume a session. */ virtual uint32_t session_ticket_lifetime() const; /** * If this returns a non-empty vector, and DTLS is negotiated, * then we will also attempt to negotiate the SRTP extension from * RFC 5764 using the returned values as the profile ids. */ virtual std::vector srtp_profiles() const; /** * @return true if and only if we are willing to accept this version * Default accepts TLS v1.0 and later or DTLS v1.2 or later. */ virtual bool acceptable_protocol_version(Protocol_Version version) const; /** * Returns the more recent protocol version we are willing to * use, for either TLS or DTLS depending on datagram param. * Shouldn't ever need to override this unless you want to allow * a user to disable use of TLS v1.2 (which is *not recommended*) */ virtual Protocol_Version latest_supported_version(bool datagram) const; /** * When offering this version, should we send a fallback SCSV? * Default returns true iff version is not the latest version the * policy allows, exists to allow override in case of interop problems. */ virtual bool send_fallback_scsv(Protocol_Version version) const; /** * Allows policy to reject any ciphersuites which are undesirable * for whatever reason without having to reimplement ciphersuite_list */ virtual bool acceptable_ciphersuite(const Ciphersuite& suite) const; /** * @return true if servers should choose the ciphersuite matching * their highest preference, rather than the clients. * Has no effect on client side. */ virtual bool server_uses_own_ciphersuite_preferences() const; /** * Indicates whether the encrypt-then-MAC extension should be negotiated * (RFC 7366) */ virtual bool negotiate_encrypt_then_mac() const; /** * Indicates whether certificate status messages should be supported */ virtual bool support_cert_status_message() const; /** * Return allowed ciphersuites, in order of preference */ virtual std::vector ciphersuite_list(Protocol_Version version, bool have_srp) const; /** * @return the default MTU for DTLS */ virtual size_t dtls_default_mtu() const; /** * @return the initial timeout for DTLS */ virtual size_t dtls_initial_timeout() const; /** * @return the maximum timeout for DTLS */ virtual size_t dtls_maximum_timeout() const; /** * Convert this policy to a printable format. * @param o stream to be printed to */ virtual void print(std::ostream& o) const; /** * Convert this policy to a printable format. * Same as calling `print` on a ostringstream and reading o.str() */ std::string to_string() const; virtual ~Policy() = default; }; /** * NSA Suite B 128-bit security level (RFC 6460) */ class BOTAN_PUBLIC_API(2,0) NSA_Suite_B_128 : public Policy { public: std::vector allowed_ciphers() const override { return std::vector({"AES-128/GCM"}); } std::vector allowed_signature_hashes() const override { return std::vector({"SHA-256"}); } std::vector allowed_macs() const override { return std::vector({"AEAD"}); } std::vector allowed_key_exchange_methods() const override { return std::vector({"ECDH"}); } std::vector allowed_signature_methods() const override { return std::vector({"ECDSA"}); } std::vector allowed_ecc_curves() const override { return std::vector({"secp256r1"}); } std::vector allowed_groups() const override { return allowed_ecc_curves(); } size_t minimum_signature_strength() const override { return 128; } bool allow_tls10() const override { return false; } bool allow_tls11() const override { return false; } bool allow_tls12() const override { return true; } bool allow_dtls10() const override { return false; } bool allow_dtls12() const override { return false; } }; /** * BSI TR-02102-2 Policy */ class BOTAN_PUBLIC_API(2,0) BSI_TR_02102_2 : public Policy { public: std::vector allowed_ciphers() const override { return std::vector({"AES-256/GCM", "AES-128/GCM", "AES-256", "AES-128" }); } std::vector allowed_signature_hashes() const override { return std::vector({"SHA-384", "SHA-256"}); } std::vector allowed_macs() const override { return std::vector({"AEAD", "SHA-384", "SHA-256"}); } std::vector allowed_key_exchange_methods() const override { return std::vector({"ECDH", "DH", "PSK", "ECDHE_PSK", "DHE_PSK"}); } std::vector allowed_signature_methods() const override { return std::vector({"ECDSA", "RSA", "DSA"}); } std::vector allowed_ecc_curves() const override { return std::vector({"brainpool512r1", "brainpool384r1", "brainpool256r1", "secp384r1", "secp256r1"}); } std::vector allowed_groups() const override { return std::vector({"brainpool512r1", "brainpool384r1", "brainpool256r1", "secp384r1", "secp256r1", "ffdhe/ietf/8192", "ffdhe/ietf/6144", "ffdhe/ietf/4096", "ffdhe/ietf/3072", "ffdhe/ietf/2048"}); } bool allow_insecure_renegotiation() const override { return false; } bool allow_server_initiated_renegotiation() const override { return true; } bool server_uses_own_ciphersuite_preferences() const override { return true; } bool negotiate_encrypt_then_mac() const override { return true; } size_t minimum_rsa_bits() const override { return 2000; } size_t minimum_dh_group_size() const override { return 2000; } size_t minimum_dsa_group_size() const override { return 2000; } size_t minimum_ecdh_group_size() const override { return 250; } size_t minimum_ecdsa_group_size() const override { return 250; } bool allow_tls10() const override { return false; } bool allow_tls11() const override { return false; } bool allow_tls12() const override { return true; } bool allow_dtls10() const override { return false; } bool allow_dtls12() const override { return false; } }; /** * Policy for DTLS. We require DTLS v1.2 and an AEAD mode. */ class BOTAN_PUBLIC_API(2,0) Datagram_Policy : public Policy { public: std::vector allowed_macs() const override { return std::vector({"AEAD"}); } bool allow_tls10() const override { return false; } bool allow_tls11() const override { return false; } bool allow_tls12() const override { return false; } bool allow_dtls10() const override { return false; } bool allow_dtls12() const override { return true; } }; /* * This policy requires a secure version of TLS and disables all insecure * algorithms. It is compatible with other botan TLSes (including those using the * default policy) and with many other recent implementations. It is a great idea * to use if you control both sides of the protocol and don't have to worry * about ancient and/or bizarre TLS implementations. */ class BOTAN_PUBLIC_API(2,0) Strict_Policy : public Policy { public: std::vector allowed_ciphers() const override; std::vector allowed_signature_hashes() const override; std::vector allowed_macs() const override; std::vector allowed_key_exchange_methods() const override; bool allow_tls10() const override; bool allow_tls11() const override; bool allow_tls12() const override; bool allow_dtls10() const override; bool allow_dtls12() const override; }; class BOTAN_PUBLIC_API(2,0) Text_Policy : public Policy { public: std::vector allowed_ciphers() const override; std::vector allowed_signature_hashes() const override; std::vector allowed_macs() const override; std::vector allowed_key_exchange_methods() const override; std::vector allowed_signature_methods() const override; std::vector allowed_ecc_curves() const override; std::vector allowed_groups() const override; bool use_ecc_point_compression() const override; bool allow_tls10() const override; bool allow_tls11() const override; bool allow_tls12() const override; bool allow_dtls10() const override; bool allow_dtls12() const override; bool allow_insecure_renegotiation() const override; bool include_time_in_hello_random() const override; bool allow_client_initiated_renegotiation() const override; bool allow_server_initiated_renegotiation() const override; bool server_uses_own_ciphersuite_preferences() const override; bool negotiate_encrypt_then_mac() const override; bool support_cert_status_message() const override; std::string dh_group() const override; size_t minimum_ecdh_group_size() const override; size_t minimum_ecdsa_group_size() const override; size_t minimum_dh_group_size() const override; size_t minimum_rsa_bits() const override; size_t minimum_signature_strength() const override; size_t dtls_default_mtu() const override; size_t dtls_initial_timeout() const override; size_t dtls_maximum_timeout() const override; bool require_cert_revocation_info() const override; bool hide_unknown_users() const override; uint32_t session_ticket_lifetime() const override; bool send_fallback_scsv(Protocol_Version version) const override; std::vector srtp_profiles() const override; void set(const std::string& k, const std::string& v); explicit Text_Policy(const std::string& s); explicit Text_Policy(std::istream& in); protected: std::vector get_list(const std::string& key, const std::vector& def) const; size_t get_len(const std::string& key, size_t def) const; bool get_bool(const std::string& key, bool def) const; std::string get_str(const std::string& key, const std::string& def = "") const; bool set_value(const std::string& key, const std::string& val, bool overwrite); private: std::map m_kv; }; } } #endif botan-2.4.0/src/lib/tls/tls_reader.h000066400000000000000000000146251322470703100172630ustar00rootroot00000000000000/* * TLS Data Reader * (C) 2010-2011,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_READER_H_ #define BOTAN_TLS_READER_H_ #include #include #include #include #include namespace Botan { namespace TLS { /** * Helper class for decoding TLS protocol messages */ class TLS_Data_Reader final { public: TLS_Data_Reader(const char* type, const std::vector& buf_in) : m_typename(type), m_buf(buf_in), m_offset(0) {} void assert_done() const { if(has_remaining()) throw decode_error("Extra bytes at end of message"); } size_t read_so_far() const { return m_offset; } size_t remaining_bytes() const { return m_buf.size() - m_offset; } bool has_remaining() const { return (remaining_bytes() > 0); } std::vector get_remaining() { return std::vector(m_buf.begin() + m_offset, m_buf.end()); } void discard_next(size_t bytes) { assert_at_least(bytes); m_offset += bytes; } uint32_t get_uint32_t() { assert_at_least(4); uint32_t result = make_uint32(m_buf[m_offset ], m_buf[m_offset+1], m_buf[m_offset+2], m_buf[m_offset+3]); m_offset += 4; return result; } uint16_t get_uint16_t() { assert_at_least(2); uint16_t result = make_uint16(m_buf[m_offset], m_buf[m_offset+1]); m_offset += 2; return result; } uint8_t get_byte() { assert_at_least(1); uint8_t result = m_buf[m_offset]; m_offset += 1; return result; } template Container get_elem(size_t num_elems) { assert_at_least(num_elems * sizeof(T)); Container result(num_elems); for(size_t i = 0; i != num_elems; ++i) result[i] = load_be(&m_buf[m_offset], i); m_offset += num_elems * sizeof(T); return result; } template std::vector get_range(size_t len_bytes, size_t min_elems, size_t max_elems) { const size_t num_elems = get_num_elems(len_bytes, sizeof(T), min_elems, max_elems); return get_elem >(num_elems); } template std::vector get_range_vector(size_t len_bytes, size_t min_elems, size_t max_elems) { const size_t num_elems = get_num_elems(len_bytes, sizeof(T), min_elems, max_elems); return get_elem >(num_elems); } std::string get_string(size_t len_bytes, size_t min_bytes, size_t max_bytes) { std::vector v = get_range_vector(len_bytes, min_bytes, max_bytes); return std::string(cast_uint8_ptr_to_char(v.data()), v.size()); } template std::vector get_fixed(size_t size) { return get_elem >(size); } private: size_t get_length_field(size_t len_bytes) { assert_at_least(len_bytes); if(len_bytes == 1) return get_byte(); else if(len_bytes == 2) return get_uint16_t(); throw decode_error("Bad length size"); } size_t get_num_elems(size_t len_bytes, size_t T_size, size_t min_elems, size_t max_elems) { const size_t byte_length = get_length_field(len_bytes); if(byte_length % T_size != 0) throw decode_error("Size isn't multiple of T"); const size_t num_elems = byte_length / T_size; if(num_elems < min_elems || num_elems > max_elems) throw decode_error("Length field outside parameters"); return num_elems; } void assert_at_least(size_t n) const { if(m_buf.size() - m_offset < n) throw decode_error("Expected " + std::to_string(n) + " bytes remaining, only " + std::to_string(m_buf.size()-m_offset) + " left"); } Decoding_Error decode_error(const std::string& why) const { return Decoding_Error("Invalid " + std::string(m_typename) + ": " + why); } const char* m_typename; const std::vector& m_buf; size_t m_offset; }; /** * Helper function for encoding length-tagged vectors */ template void append_tls_length_value(std::vector& buf, const T* vals, size_t vals_size, size_t tag_size) { const size_t T_size = sizeof(T); const size_t val_bytes = T_size * vals_size; if(tag_size != 1 && tag_size != 2) throw Invalid_Argument("append_tls_length_value: invalid tag size"); if((tag_size == 1 && val_bytes > 255) || (tag_size == 2 && val_bytes > 65535)) throw Invalid_Argument("append_tls_length_value: value too large"); for(size_t i = 0; i != tag_size; ++i) buf.push_back(get_byte(sizeof(val_bytes)-tag_size+i, val_bytes)); for(size_t i = 0; i != vals_size; ++i) for(size_t j = 0; j != T_size; ++j) buf.push_back(get_byte(j, vals[i])); } template void append_tls_length_value(std::vector& buf, const std::vector& vals, size_t tag_size) { append_tls_length_value(buf, vals.data(), vals.size(), tag_size); } template void append_tls_length_value(std::vector& buf, const std::string& str, size_t tag_size) { append_tls_length_value(buf, cast_char_ptr_to_uint8(str.data()), str.size(), tag_size); } } } #endif botan-2.4.0/src/lib/tls/tls_record.cpp000066400000000000000000000373541322470703100176360ustar00rootroot00000000000000/* * TLS Record Handling * (C) 2012,2013,2014,2015,2016 Jack Lloyd * 2016 Juraj Somorovsky * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_TLS_CBC) #include #endif namespace Botan { namespace TLS { Connection_Cipher_State::Connection_Cipher_State(Protocol_Version version, Connection_Side side, bool our_side, const Ciphersuite& suite, const Session_Keys& keys, bool uses_encrypt_then_mac) : m_start_time(std::chrono::system_clock::now()), m_nonce_bytes_from_handshake(suite.nonce_bytes_from_handshake()), m_nonce_bytes_from_record(suite.nonce_bytes_from_record()) { SymmetricKey mac_key, cipher_key; InitializationVector iv; if(side == CLIENT) { cipher_key = keys.client_cipher_key(); iv = keys.client_iv(); mac_key = keys.client_mac_key(); } else { cipher_key = keys.server_cipher_key(); iv = keys.server_iv(); mac_key = keys.server_mac_key(); } BOTAN_ASSERT_EQUAL(iv.length(), nonce_bytes_from_handshake(), "Matching nonce sizes"); m_nonce = unlock(iv.bits_of()); if(suite.mac_algo() == "AEAD") { m_aead.reset(get_aead(suite.cipher_algo(), our_side ? ENCRYPTION : DECRYPTION)); BOTAN_ASSERT(m_aead, "Have AEAD"); m_aead->set_key(cipher_key + mac_key); BOTAN_ASSERT(nonce_bytes_from_record() == 0 || nonce_bytes_from_record() == 8, "Ciphersuite uses implemented IV length"); m_cbc_nonce = false; if(m_nonce.size() != 12) { m_nonce.resize(m_nonce.size() + 8); } } else { #if defined(BOTAN_HAS_TLS_CBC) // legacy CBC+HMAC mode if(our_side) { m_aead.reset(new TLS_CBC_HMAC_AEAD_Encryption( suite.cipher_algo(), suite.cipher_keylen(), suite.mac_algo(), suite.mac_keylen(), version.supports_explicit_cbc_ivs(), uses_encrypt_then_mac)); } else { m_aead.reset(new TLS_CBC_HMAC_AEAD_Decryption( suite.cipher_algo(), suite.cipher_keylen(), suite.mac_algo(), suite.mac_keylen(), version.supports_explicit_cbc_ivs(), uses_encrypt_then_mac)); } m_aead->set_key(cipher_key + mac_key); m_cbc_nonce = true; if(version.supports_explicit_cbc_ivs()) m_nonce_bytes_from_record = m_nonce_bytes_from_handshake; else if(our_side == false) m_aead->start(iv.bits_of()); #else throw Exception("Negotiated disabled TLS CBC+HMAC ciphersuite"); #endif } } std::vector Connection_Cipher_State::aead_nonce(uint64_t seq, RandomNumberGenerator& rng) { if(m_cbc_nonce) { if(m_nonce.size()) { std::vector nonce; nonce.swap(m_nonce); return nonce; } std::vector nonce(nonce_bytes_from_record()); rng.randomize(nonce.data(), nonce.size()); return nonce; } else if(nonce_bytes_from_handshake() == 12) { std::vector nonce(12); store_be(seq, nonce.data() + 4); xor_buf(nonce, m_nonce.data(), m_nonce.size()); return nonce; } else { std::vector nonce = m_nonce; store_be(seq, &nonce[nonce_bytes_from_handshake()]); return nonce; } } std::vector Connection_Cipher_State::aead_nonce(const uint8_t record[], size_t record_len, uint64_t seq) { if(m_cbc_nonce) { if(record_len < nonce_bytes_from_record()) throw Decoding_Error("Invalid CBC packet too short to be valid"); std::vector nonce(record, record + nonce_bytes_from_record()); return nonce; } else if(nonce_bytes_from_handshake() == 12) { /* Assumes if the suite specifies 12 bytes come from the handshake then use the XOR nonce construction from draft-ietf-tls-chacha20-poly1305 */ std::vector nonce(12); store_be(seq, nonce.data() + 4); xor_buf(nonce, m_nonce.data(), m_nonce.size()); return nonce; } else if(nonce_bytes_from_record() > 0) { if(record_len < nonce_bytes_from_record()) throw Decoding_Error("Invalid AEAD packet too short to be valid"); std::vector nonce = m_nonce; copy_mem(&nonce[nonce_bytes_from_handshake()], record, nonce_bytes_from_record()); return nonce; } else { /* nonce_len == 0 is assumed to mean no nonce in the message but instead the AEAD uses the seq number in network order. */ std::vector nonce = m_nonce; store_be(seq, &nonce[nonce_bytes_from_handshake()]); return nonce; } } std::vector Connection_Cipher_State::format_ad(uint64_t msg_sequence, uint8_t msg_type, Protocol_Version version, uint16_t msg_length) { std::vector ad(13); store_be(msg_sequence, &ad[0]); ad[8] = msg_type; ad[9] = version.major_version(); ad[10] = version.minor_version(); ad[11] = get_byte(0, msg_length); ad[12] = get_byte(1, msg_length); return ad; } namespace { inline void append_u16_len(secure_vector& output, size_t len_field) { const uint16_t len16 = static_cast(len_field); BOTAN_ASSERT_EQUAL(len_field, len16, "No truncation"); output.push_back(get_byte(0, len16)); output.push_back(get_byte(1, len16)); } } void write_record(secure_vector& output, Record_Message msg, Protocol_Version version, uint64_t seq, Connection_Cipher_State* cs, RandomNumberGenerator& rng) { output.clear(); output.push_back(msg.get_type()); output.push_back(version.major_version()); output.push_back(version.minor_version()); if(version.is_datagram_protocol()) { for(size_t i = 0; i != 8; ++i) output.push_back(get_byte(i, seq)); } if(!cs) // initial unencrypted handshake records { append_u16_len(output, msg.get_size()); output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size()); return; } AEAD_Mode* aead = cs->aead(); std::vector aad = cs->format_ad(seq, msg.get_type(), version, static_cast(msg.get_size())); const size_t ctext_size = aead->output_length(msg.get_size()); const size_t rec_size = ctext_size + cs->nonce_bytes_from_record(); aead->set_ad(aad); const std::vector nonce = cs->aead_nonce(seq, rng); append_u16_len(output, rec_size); if(cs->nonce_bytes_from_record() > 0) { if(cs->cbc_nonce()) output += nonce; else output += std::make_pair(&nonce[cs->nonce_bytes_from_handshake()], cs->nonce_bytes_from_record()); } const size_t header_size = output.size(); output += std::make_pair(msg.get_data(), msg.get_size()); aead->start(nonce); aead->finish(output, header_size); BOTAN_ASSERT(output.size() < MAX_CIPHERTEXT_SIZE, "Produced ciphertext larger than protocol allows"); } namespace { size_t fill_buffer_to(secure_vector& readbuf, const uint8_t*& input, size_t& input_size, size_t& input_consumed, size_t desired) { if(readbuf.size() >= desired) return 0; // already have it const size_t taken = std::min(input_size, desired - readbuf.size()); readbuf.insert(readbuf.end(), input, input + taken); input_consumed += taken; input_size -= taken; input += taken; return (desired - readbuf.size()); // how many bytes do we still need? } void decrypt_record(secure_vector& output, uint8_t record_contents[], size_t record_len, uint64_t record_sequence, Protocol_Version record_version, Record_Type record_type, Connection_Cipher_State& cs) { AEAD_Mode* aead = cs.aead(); BOTAN_ASSERT(aead, "Cannot decrypt without cipher"); const std::vector nonce = cs.aead_nonce(record_contents, record_len, record_sequence); const uint8_t* msg = &record_contents[cs.nonce_bytes_from_record()]; const size_t msg_length = record_len - cs.nonce_bytes_from_record(); if(msg_length < aead->minimum_final_size()) throw Decoding_Error("AEAD packet is shorter than the tag"); const size_t ptext_size = aead->output_length(msg_length); aead->set_associated_data_vec( cs.format_ad(record_sequence, static_cast(record_type), record_version, static_cast(ptext_size)) ); aead->start(nonce); const size_t offset = output.size(); output += std::make_pair(msg, msg_length); aead->finish(output, offset); } size_t read_tls_record(secure_vector& readbuf, Record_Raw_Input& raw_input, Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate) { if(readbuf.size() < TLS_HEADER_SIZE) // header incomplete? { if(size_t needed = fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), TLS_HEADER_SIZE)) return needed; BOTAN_ASSERT_EQUAL(readbuf.size(), TLS_HEADER_SIZE, "Have an entire header"); } *rec.get_protocol_version() = Protocol_Version(readbuf[1], readbuf[2]); BOTAN_ASSERT(!rec.get_protocol_version()->is_datagram_protocol(), "Expected TLS"); const size_t record_size = make_uint16(readbuf[TLS_HEADER_SIZE-2], readbuf[TLS_HEADER_SIZE-1]); if(record_size > MAX_CIPHERTEXT_SIZE) throw TLS_Exception(Alert::RECORD_OVERFLOW, "Received a record that exceeds maximum size"); if(record_size == 0) throw TLS_Exception(Alert::DECODE_ERROR, "Received a completely empty record"); if(size_t needed = fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), TLS_HEADER_SIZE + record_size)) return needed; BOTAN_ASSERT_EQUAL(static_cast(TLS_HEADER_SIZE) + record_size, readbuf.size(), "Have the full record"); *rec.get_type() = static_cast(readbuf[0]); uint16_t epoch = 0; if(sequence_numbers) { *rec.get_sequence() = sequence_numbers->next_read_sequence(); epoch = sequence_numbers->current_read_epoch(); } else { // server initial handshake case *rec.get_sequence() = 0; epoch = 0; } uint8_t* record_contents = &readbuf[TLS_HEADER_SIZE]; if(epoch == 0) // Unencrypted initial handshake { rec.get_data().assign(readbuf.begin() + TLS_HEADER_SIZE, readbuf.begin() + TLS_HEADER_SIZE + record_size); readbuf.clear(); return 0; // got a full record } // Otherwise, decrypt, check MAC, return plaintext auto cs = get_cipherstate(epoch); BOTAN_ASSERT(cs, "Have cipherstate for this epoch"); decrypt_record(rec.get_data(), record_contents, record_size, *rec.get_sequence(), *rec.get_protocol_version(), *rec.get_type(), *cs); if(sequence_numbers) sequence_numbers->read_accept(*rec.get_sequence()); readbuf.clear(); return 0; } size_t read_dtls_record(secure_vector& readbuf, Record_Raw_Input& raw_input, Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate) { if(readbuf.size() < DTLS_HEADER_SIZE) // header incomplete? { if(fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), DTLS_HEADER_SIZE)) { readbuf.clear(); return 0; } BOTAN_ASSERT_EQUAL(readbuf.size(), DTLS_HEADER_SIZE, "Have an entire header"); } *rec.get_protocol_version() = Protocol_Version(readbuf[1], readbuf[2]); BOTAN_ASSERT(rec.get_protocol_version()->is_datagram_protocol(), "Expected DTLS"); const size_t record_size = make_uint16(readbuf[DTLS_HEADER_SIZE-2], readbuf[DTLS_HEADER_SIZE-1]); if(record_size > MAX_CIPHERTEXT_SIZE) throw TLS_Exception(Alert::RECORD_OVERFLOW, "Got message that exceeds maximum size"); if(fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), DTLS_HEADER_SIZE + record_size)) { // Truncated packet? readbuf.clear(); return 0; } BOTAN_ASSERT_EQUAL(static_cast(DTLS_HEADER_SIZE) + record_size, readbuf.size(), "Have the full record"); *rec.get_type() = static_cast(readbuf[0]); uint16_t epoch = 0; *rec.get_sequence() = load_be(&readbuf[3], 0); epoch = (*rec.get_sequence() >> 48); if(sequence_numbers && sequence_numbers->already_seen(*rec.get_sequence())) { readbuf.clear(); return 0; } uint8_t* record_contents = &readbuf[DTLS_HEADER_SIZE]; if(epoch == 0) // Unencrypted initial handshake { rec.get_data().assign(readbuf.begin() + DTLS_HEADER_SIZE, readbuf.begin() + DTLS_HEADER_SIZE + record_size); readbuf.clear(); return 0; // got a full record } try { // Otherwise, decrypt, check MAC, return plaintext auto cs = get_cipherstate(epoch); BOTAN_ASSERT(cs, "Have cipherstate for this epoch"); decrypt_record(rec.get_data(), record_contents, record_size, *rec.get_sequence(), *rec.get_protocol_version(), *rec.get_type(), *cs); } catch(std::exception) { readbuf.clear(); *rec.get_type() = NO_RECORD; return 0; } if(sequence_numbers) sequence_numbers->read_accept(*rec.get_sequence()); readbuf.clear(); return 0; } } size_t read_record(secure_vector& readbuf, Record_Raw_Input& raw_input, Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate) { if(raw_input.is_datagram()) return read_dtls_record(readbuf, raw_input, rec, sequence_numbers, get_cipherstate); else return read_tls_record(readbuf, raw_input, rec, sequence_numbers, get_cipherstate); } } } botan-2.4.0/src/lib/tls/tls_record.h000066400000000000000000000121351322470703100172710ustar00rootroot00000000000000/* * TLS Record Handling * (C) 2004-2012 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_RECORDS_H_ #define BOTAN_TLS_RECORDS_H_ #include #include #include #include #include #include namespace Botan { namespace TLS { class Ciphersuite; class Session_Keys; class Connection_Sequence_Numbers; /** * TLS Cipher State */ class Connection_Cipher_State final { public: /** * Initialize a new cipher state */ Connection_Cipher_State(Protocol_Version version, Connection_Side which_side, bool is_our_side, const Ciphersuite& suite, const Session_Keys& keys, bool uses_encrypt_then_mac); AEAD_Mode* aead() { return m_aead.get(); } std::vector aead_nonce(uint64_t seq, RandomNumberGenerator& rng); std::vector aead_nonce(const uint8_t record[], size_t record_len, uint64_t seq); std::vector format_ad(uint64_t seq, uint8_t type, Protocol_Version version, uint16_t ptext_length); size_t nonce_bytes_from_handshake() const { return m_nonce_bytes_from_handshake; } size_t nonce_bytes_from_record() const { return m_nonce_bytes_from_record; } bool cbc_nonce() const { return m_cbc_nonce; } std::chrono::seconds age() const { return std::chrono::duration_cast( std::chrono::system_clock::now() - m_start_time); } private: std::chrono::system_clock::time_point m_start_time; std::unique_ptr m_aead; std::vector m_nonce; size_t m_nonce_bytes_from_handshake; size_t m_nonce_bytes_from_record; bool m_cbc_nonce; }; class Record final { public: Record(secure_vector& data, uint64_t* sequence, Protocol_Version* protocol_version, Record_Type* type) : m_data(data), m_sequence(sequence), m_protocol_version(protocol_version), m_type(type), m_size(data.size()) {} secure_vector& get_data() { return m_data; } Protocol_Version* get_protocol_version() { return m_protocol_version; } uint64_t* get_sequence() { return m_sequence; } Record_Type* get_type() { return m_type; } size_t& get_size() { return m_size; } private: secure_vector& m_data; uint64_t* m_sequence; Protocol_Version* m_protocol_version; Record_Type* m_type; size_t m_size; }; class Record_Message final { public: Record_Message(const uint8_t* data, size_t size) : m_type(0), m_sequence(0), m_data(data), m_size(size) {} Record_Message(uint8_t type, uint64_t sequence, const uint8_t* data, size_t size) : m_type(type), m_sequence(sequence), m_data(data), m_size(size) {} uint8_t& get_type() { return m_type; } uint64_t& get_sequence() { return m_sequence; } const uint8_t* get_data() { return m_data; } size_t& get_size() { return m_size; } private: uint8_t m_type; uint64_t m_sequence; const uint8_t* m_data; size_t m_size; }; class Record_Raw_Input final { public: Record_Raw_Input(const uint8_t* data, size_t size, size_t& consumed, bool is_datagram) : m_data(data), m_size(size), m_consumed(consumed), m_is_datagram(is_datagram) {} const uint8_t*& get_data() { return m_data; } size_t& get_size() { return m_size; } size_t& get_consumed() { return m_consumed; } void set_consumed(size_t consumed) { m_consumed = consumed; } bool is_datagram() { return m_is_datagram; } private: const uint8_t* m_data; size_t m_size; size_t& m_consumed; bool m_is_datagram; }; /** * Create a TLS record * @param write_buffer the output record is placed here * @param rec_msg is the plaintext message * @param version is the protocol version * @param msg_sequence is the sequence number * @param cipherstate is the writing cipher state * @param rng is a random number generator */ void write_record(secure_vector& write_buffer, Record_Message rec_msg, Protocol_Version version, uint64_t msg_sequence, Connection_Cipher_State* cipherstate, RandomNumberGenerator& rng); // epoch -> cipher state typedef std::function (uint16_t)> get_cipherstate_fn; /** * Decode a TLS record * @return zero if full message, else number of bytes still needed */ size_t read_record(secure_vector& read_buffer, Record_Raw_Input& raw_input, Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate); } } #endif botan-2.4.0/src/lib/tls/tls_seq_numbers.h000066400000000000000000000074101322470703100203360ustar00rootroot00000000000000/* * TLS Sequence Number Handling * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SEQ_NUMBERS_H_ #define BOTAN_TLS_SEQ_NUMBERS_H_ #include #include namespace Botan { namespace TLS { class Connection_Sequence_Numbers { public: virtual ~Connection_Sequence_Numbers() = default; virtual void new_read_cipher_state() = 0; virtual void new_write_cipher_state() = 0; virtual uint16_t current_read_epoch() const = 0; virtual uint16_t current_write_epoch() const = 0; virtual uint64_t next_write_sequence(uint16_t) = 0; virtual uint64_t next_read_sequence() = 0; virtual bool already_seen(uint64_t seq) const = 0; virtual void read_accept(uint64_t seq) = 0; }; class Stream_Sequence_Numbers final : public Connection_Sequence_Numbers { public: void new_read_cipher_state() override { m_read_seq_no = 0; m_read_epoch++; } void new_write_cipher_state() override { m_write_seq_no = 0; m_write_epoch++; } uint16_t current_read_epoch() const override { return m_read_epoch; } uint16_t current_write_epoch() const override { return m_write_epoch; } uint64_t next_write_sequence(uint16_t) override { return m_write_seq_no++; } uint64_t next_read_sequence() override { return m_read_seq_no; } bool already_seen(uint64_t) const override { return false; } void read_accept(uint64_t) override { m_read_seq_no++; } private: uint64_t m_write_seq_no = 0; uint64_t m_read_seq_no = 0; uint16_t m_read_epoch = 0; uint16_t m_write_epoch = 0; }; class Datagram_Sequence_Numbers final : public Connection_Sequence_Numbers { public: Datagram_Sequence_Numbers() { m_write_seqs[0] = 0; } void new_read_cipher_state() override { m_read_epoch++; } void new_write_cipher_state() override { m_write_epoch++; m_write_seqs[m_write_epoch] = 0; } uint16_t current_read_epoch() const override { return m_read_epoch; } uint16_t current_write_epoch() const override { return m_write_epoch; } uint64_t next_write_sequence(uint16_t epoch) override { auto i = m_write_seqs.find(epoch); BOTAN_ASSERT(i != m_write_seqs.end(), "Found epoch"); return (static_cast(epoch) << 48) | i->second++; } uint64_t next_read_sequence() override { throw Exception("DTLS uses explicit sequence numbers"); } bool already_seen(uint64_t sequence) const override { const size_t window_size = sizeof(m_window_bits) * 8; if(sequence > m_window_highest) return false; const uint64_t offset = m_window_highest - sequence; if(offset >= window_size) return true; // really old? return (((m_window_bits >> offset) & 1) == 1); } void read_accept(uint64_t sequence) override { const size_t window_size = sizeof(m_window_bits) * 8; if(sequence > m_window_highest) { const uint64_t offset = sequence - m_window_highest; m_window_highest += offset; if(offset >= window_size) m_window_bits = 0; else m_window_bits <<= offset; m_window_bits |= 0x01; } else { const uint64_t offset = m_window_highest - sequence; m_window_bits |= (static_cast(1) << offset); } } private: std::map m_write_seqs; uint16_t m_write_epoch = 0; uint16_t m_read_epoch = 0; uint64_t m_window_highest = 0; uint64_t m_window_bits = 0; }; } } #endif botan-2.4.0/src/lib/tls/tls_server.cpp000066400000000000000000000747311322470703100176660ustar00rootroot00000000000000/* * TLS Server * (C) 2004-2011,2012,2016 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { namespace TLS { class Server_Handshake_State final : public Handshake_State { public: Server_Handshake_State(Handshake_IO* io, Callbacks& cb) : Handshake_State(io, cb) {} Private_Key* server_rsa_kex_key() { return m_server_rsa_kex_key; } void set_server_rsa_kex_key(Private_Key* key) { m_server_rsa_kex_key = key; } bool allow_session_resumption() const { return m_allow_session_resumption; } void set_allow_session_resumption(bool allow_session_resumption) { m_allow_session_resumption = allow_session_resumption; } const std::vector& resume_peer_certs() const { return m_resume_peer_certs; } void set_resume_certs(const std::vector& certs) { m_resume_peer_certs = certs; } private: // Used by the server only, in case of RSA key exchange. Not owned Private_Key* m_server_rsa_kex_key = nullptr; /* * Used by the server to know if resumption should be allowed on * a server-initiated renegotiation */ bool m_allow_session_resumption = true; std::vector m_resume_peer_certs; }; namespace { bool check_for_resume(Session& session_info, Session_Manager& session_manager, Credentials_Manager& credentials, const Client_Hello* client_hello, std::chrono::seconds session_ticket_lifetime) { const std::vector& client_session_id = client_hello->session_id(); const std::vector& session_ticket = client_hello->session_ticket(); if(session_ticket.empty()) { if(client_session_id.empty()) // not resuming return false; // not found if(!session_manager.load_from_session_id(client_session_id, session_info)) return false; } else { // If a session ticket was sent, ignore client session ID try { session_info = Session::decrypt( session_ticket, credentials.psk("tls-server", "session-ticket", "")); if(session_ticket_lifetime != std::chrono::seconds(0) && session_info.session_age() > session_ticket_lifetime) return false; // ticket has expired } catch(...) { return false; } } // wrong version if(client_hello->version() != session_info.version()) return false; // client didn't send original ciphersuite if(!value_exists(client_hello->ciphersuites(), session_info.ciphersuite_code())) return false; // client didn't send original compression method if(!value_exists(client_hello->compression_methods(), session_info.compression_method())) return false; #if defined(BOTAN_HAS_SRP6) // client sent a different SRP identity if(client_hello->srp_identifier() != "") { if(client_hello->srp_identifier() != session_info.srp_identifier()) return false; } #endif // client sent a different SNI hostname if(client_hello->sni_hostname() != "") { if(client_hello->sni_hostname() != session_info.server_info().hostname()) return false; } // Checking extended_master_secret on resume (RFC 7627 section 5.3) if(client_hello->supports_extended_master_secret() != session_info.supports_extended_master_secret()) { if(!session_info.supports_extended_master_secret()) { return false; // force new handshake with extended master secret } else { /* Client previously negotiated session with extended master secret, but has now attempted to resume without the extension: abort */ throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client resumed extended ms session without sending extension"); } } // Checking encrypt_then_mac on resume (RFC 7366 section 3.1) if(!client_hello->supports_encrypt_then_mac() && session_info.supports_encrypt_then_mac()) { /* Client previously negotiated session with Encrypt-then-MAC, but has now attempted to resume without the extension: abort */ throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client resumed Encrypt-then-MAC session without sending extension"); } return true; } /* * Choose which ciphersuite to use */ uint16_t choose_ciphersuite( const Policy& policy, Protocol_Version version, Credentials_Manager& creds, const std::map >& cert_chains, const Client_Hello& client_hello) { const bool our_choice = policy.server_uses_own_ciphersuite_preferences(); const bool have_srp = creds.attempt_srp("tls-server", client_hello.sni_hostname()); const std::vector client_suites = client_hello.ciphersuites(); const std::vector server_suites = policy.ciphersuite_list(version, have_srp); if(server_suites.empty()) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Policy forbids us from negotiating any ciphersuite"); const bool have_shared_ecc_curve = (policy.choose_curve(client_hello.supported_ecc_curves()) != ""); /* Walk down one list in preference order */ std::vector pref_list = server_suites; std::vector other_list = client_suites; if(!our_choice) std::swap(pref_list, other_list); const std::set client_sig_algos = client_hello.supported_sig_algos(); for(auto suite_id : pref_list) { if(!value_exists(other_list, suite_id)) continue; const Ciphersuite suite = Ciphersuite::by_id(suite_id); if(suite.valid() == false) continue; if(suite.ecc_ciphersuite() && have_shared_ecc_curve == false) continue; // For non-anon ciphersuites if(suite.sig_algo() != "") { // Do we have any certificates for this sig? if(cert_chains.count(suite.sig_algo()) == 0) continue; // Client reques if(!client_sig_algos.empty() && client_sig_algos.count(suite.sig_algo()) == 0) continue; } if(version.supports_negotiable_signature_algorithms() && suite.sig_algo() != "") { const std::vector> client_sig_hash_pairs = client_hello.supported_algos(); if(client_hello.supported_algos().empty() == false) { bool we_support_some_hash_by_client = false; for(auto&& hash_and_sig : client_hello.supported_algos()) { if(hash_and_sig.second == suite.sig_algo() && policy.allowed_signature_hash(hash_and_sig.first)) { we_support_some_hash_by_client = true; break; } } if(we_support_some_hash_by_client == false) { throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Policy does not accept any hash function supported by client"); } } else { if(policy.allowed_signature_hash("SHA-1") == false) throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Client did not send signature_algorithms extension " "and policy prohibits SHA-1 fallback"); } } #if defined(BOTAN_HAS_SRP6) /* The client may offer SRP cipher suites in the hello message but omit the SRP extension. If the server would like to select an SRP cipher suite in this case, the server SHOULD return a fatal "unknown_psk_identity" alert immediately after processing the client hello message. - RFC 5054 section 2.5.1.2 */ if(suite.kex_algo() == "SRP_SHA" && client_hello.srp_identifier() == "") throw TLS_Exception(Alert::UNKNOWN_PSK_IDENTITY, "Client wanted SRP but did not send username"); #endif return suite_id; } throw TLS_Exception(Alert::HANDSHAKE_FAILURE, "Can't agree on a ciphersuite with client"); } /* * Choose which compression algorithm to use */ uint8_t choose_compression(const Policy& policy, const std::vector& c_comp) { std::vector s_comp = policy.compression(); for(size_t i = 0; i != s_comp.size(); ++i) for(size_t j = 0; j != c_comp.size(); ++j) if(s_comp[i] == c_comp[j]) return s_comp[i]; return NO_COMPRESSION; } std::map > get_server_certs(const std::string& hostname, Credentials_Manager& creds) { const char* cert_types[] = { "RSA", "DSA", "ECDSA", nullptr }; std::map > cert_chains; for(size_t i = 0; cert_types[i]; ++i) { std::vector certs = creds.cert_chain_single_type(cert_types[i], "tls-server", hostname); if(!certs.empty()) cert_chains[cert_types[i]] = certs; } return cert_chains; } } /* * TLS Server Constructor */ Server::Server(Callbacks& callbacks, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, bool is_datagram, size_t io_buf_sz) : Channel(callbacks, session_manager, rng, policy, is_datagram, io_buf_sz), m_creds(creds) { } Server::Server(output_fn output, data_cb data_cb, alert_cb alert_cb, handshake_cb handshake_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, next_protocol_fn next_proto, bool is_datagram, size_t io_buf_sz) : Channel(output, data_cb, alert_cb, handshake_cb, Channel::handshake_msg_cb(), session_manager, rng, policy, is_datagram, io_buf_sz), m_creds(creds), m_choose_next_protocol(next_proto) { } Server::Server(output_fn output, data_cb data_cb, alert_cb alert_cb, handshake_cb handshake_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, next_protocol_fn next_proto, bool is_datagram) : Channel(output, data_cb, alert_cb, handshake_cb, hs_msg_cb, session_manager, rng, policy, is_datagram), m_creds(creds), m_choose_next_protocol(next_proto) { } Handshake_State* Server::new_handshake_state(Handshake_IO* io) { std::unique_ptr state(new Server_Handshake_State(io, callbacks())); state->set_expected_next(CLIENT_HELLO); return state.release(); } std::vector Server::get_peer_cert_chain(const Handshake_State& state_base) const { const Server_Handshake_State& state = dynamic_cast(state_base); if(state.resume_peer_certs().size() > 0) return state.resume_peer_certs(); if(state.client_certs()) return state.client_certs()->cert_chain(); return std::vector(); } /* * Send a hello request to the client */ void Server::initiate_handshake(Handshake_State& state, bool force_full_renegotiation) { dynamic_cast(state). set_allow_session_resumption(!force_full_renegotiation); Hello_Request hello_req(state.handshake_io()); } /* * Process a CLIENT HELLO Message */ void Server::process_client_hello_msg(const Handshake_State* active_state, Server_Handshake_State& pending_state, const std::vector& contents) { const bool initial_handshake = !active_state; if(initial_handshake == false && policy().allow_client_initiated_renegotiation() == false) { send_warning_alert(Alert::NO_RENEGOTIATION); return; } if(!policy().allow_insecure_renegotiation() && !(initial_handshake || secure_renegotiation_supported())) { send_warning_alert(Alert::NO_RENEGOTIATION); return; } pending_state.client_hello(new Client_Hello(contents)); const Protocol_Version client_version = pending_state.client_hello()->version(); if(client_version.major_version() < 3) throw TLS_Exception(Alert::PROTOCOL_VERSION, "Client offered version with major version under 3"); if(client_version.major_version() == 3 && client_version.minor_version() == 0) throw TLS_Exception(Alert::PROTOCOL_VERSION, "SSLv3 is not supported"); Protocol_Version negotiated_version; const Protocol_Version latest_supported = policy().latest_supported_version(client_version.is_datagram_protocol()); if((initial_handshake && client_version.known_version()) || (!initial_handshake && client_version == active_state->version())) { /* Common cases: new client hello with some known version, or a renegotiation using the same version as previously negotiated. */ negotiated_version = client_version; } else if(!initial_handshake && (client_version != active_state->version())) { /* * If this is a renegotiation, and the client has offered a * later version than what it initially negotiated, negotiate * the old version. This matches OpenSSL's behavior. If the * client is offering a version earlier than what it initially * negotiated, reject as a probable attack. */ if(active_state->version() > client_version) { throw TLS_Exception(Alert::PROTOCOL_VERSION, "Client negotiated " + active_state->version().to_string() + " then renegotiated with " + client_version.to_string()); } else negotiated_version = active_state->version(); } else { /* New negotiation using a version we don't know. Offer them the best we currently know and support */ negotiated_version = latest_supported; } if(!policy().acceptable_protocol_version(negotiated_version)) { throw TLS_Exception(Alert::PROTOCOL_VERSION, "Client version " + negotiated_version.to_string() + " is unacceptable by policy"); } if(pending_state.client_hello()->sent_fallback_scsv()) { if(latest_supported > client_version) throw TLS_Exception(Alert::INAPPROPRIATE_FALLBACK, "Client signalled fallback SCSV, possible attack"); } secure_renegotiation_check(pending_state.client_hello()); pending_state.set_version(negotiated_version); Session session_info; const bool resuming = pending_state.allow_session_resumption() && check_for_resume(session_info, session_manager(), m_creds, pending_state.client_hello(), std::chrono::seconds(policy().session_ticket_lifetime())); bool have_session_ticket_key = false; try { have_session_ticket_key = m_creds.psk("tls-server", "session-ticket", "").length() > 0; } catch(...) {} m_next_protocol = ""; if(pending_state.client_hello()->supports_alpn()) { m_next_protocol = callbacks().tls_server_choose_app_protocol(pending_state.client_hello()->next_protocols()); // if the callback return was empty, fall back to the (deprecated) std::function if(m_next_protocol.empty() && m_choose_next_protocol) { m_next_protocol = m_choose_next_protocol(pending_state.client_hello()->next_protocols()); } } if(resuming) { this->session_resume(pending_state, have_session_ticket_key, session_info); } else // new session { this->session_create(pending_state, have_session_ticket_key); } } void Server::process_certificate_msg(Server_Handshake_State& pending_state, const std::vector& contents) { pending_state.client_certs(new Certificate(contents, policy())); pending_state.set_expected_next(CLIENT_KEX); } void Server::process_client_key_exchange_msg(Server_Handshake_State& pending_state, const std::vector& contents) { if(pending_state.received_handshake_msg(CERTIFICATE) && !pending_state.client_certs()->empty()) pending_state.set_expected_next(CERTIFICATE_VERIFY); else pending_state.set_expected_next(HANDSHAKE_CCS); pending_state.client_kex(new Client_Key_Exchange(contents, pending_state, pending_state.server_rsa_kex_key(), m_creds, policy(), rng())); pending_state.compute_session_keys(); } void Server::process_change_cipher_spec_msg(Server_Handshake_State& pending_state) { pending_state.set_expected_next(FINISHED); change_cipher_spec_reader(SERVER); } void Server::process_certificate_verify_msg(Server_Handshake_State& pending_state, Handshake_Type type, const std::vector& contents) { pending_state.client_verify(new Certificate_Verify(contents, pending_state.version())); const std::vector& client_certs = pending_state.client_certs()->cert_chain(); const bool sig_valid = pending_state.client_verify()->verify(client_certs[0], pending_state, policy()); pending_state.hash().update(pending_state.handshake_io().format(contents, type)); /* * Using DECRYPT_ERROR looks weird here, but per RFC 4346 is for * "A handshake cryptographic operation failed, including being * unable to correctly verify a signature, ..." */ if(!sig_valid) throw TLS_Exception(Alert::DECRYPT_ERROR, "Client cert verify failed"); try { const std::string sni_hostname = pending_state.client_hello()->sni_hostname(); auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-server", sni_hostname); callbacks().tls_verify_cert_chain(client_certs, {}, // ocsp trusted_CAs, Usage_Type::TLS_CLIENT_AUTH, sni_hostname, policy()); } catch(std::exception& e) { throw TLS_Exception(Alert::BAD_CERTIFICATE, e.what()); } pending_state.set_expected_next(HANDSHAKE_CCS); } void Server::process_finished_msg(Server_Handshake_State& pending_state, Handshake_Type type, const std::vector& contents) { pending_state.set_expected_next(HANDSHAKE_NONE); pending_state.client_finished(new Finished(contents)); if(!pending_state.client_finished()->verify(pending_state, CLIENT)) throw TLS_Exception(Alert::DECRYPT_ERROR, "Finished message didn't verify"); if(!pending_state.server_finished()) { // already sent finished if resuming, so this is a new session pending_state.hash().update(pending_state.handshake_io().format(contents, type)); Session session_info( pending_state.server_hello()->session_id(), pending_state.session_keys().master_secret(), pending_state.server_hello()->version(), pending_state.server_hello()->ciphersuite(), pending_state.server_hello()->compression_method(), SERVER, pending_state.server_hello()->supports_extended_master_secret(), pending_state.server_hello()->supports_encrypt_then_mac(), get_peer_cert_chain(pending_state), std::vector(), Server_Information(pending_state.client_hello()->sni_hostname()), pending_state.srp_identifier(), pending_state.server_hello()->srtp_profile()); if(save_session(session_info)) { if(pending_state.server_hello()->supports_session_ticket()) { try { const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", ""); pending_state.new_session_ticket( new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash(), session_info.encrypt(ticket_key, rng()), policy().session_ticket_lifetime())); } catch(...) {} } else session_manager().save(session_info); } if(!pending_state.new_session_ticket() && pending_state.server_hello()->supports_session_ticket()) { pending_state.new_session_ticket( new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash())); } pending_state.handshake_io().send(Change_Cipher_Spec()); change_cipher_spec_writer(SERVER); pending_state.server_finished(new Finished(pending_state.handshake_io(), pending_state, SERVER)); } activate_session(); } /* * Process a handshake message */ void Server::process_handshake_msg(const Handshake_State* active_state, Handshake_State& state_base, Handshake_Type type, const std::vector& contents) { Server_Handshake_State& state = dynamic_cast(state_base); state.confirm_transition_to(type); /* * The change cipher spec message isn't technically a handshake * message so it's not included in the hash. The finished and * certificate verify messages are verified based on the current * state of the hash *before* this message so we delay adding them * to the hash computation until we've processed them below. */ if(type != HANDSHAKE_CCS && type != FINISHED && type != CERTIFICATE_VERIFY) { state.hash().update(state.handshake_io().format(contents, type)); } switch(type) { case CLIENT_HELLO: return this->process_client_hello_msg(active_state, state, contents); case CERTIFICATE: return this->process_certificate_msg(state, contents); case CLIENT_KEX: return this->process_client_key_exchange_msg(state, contents); case CERTIFICATE_VERIFY: return this->process_certificate_verify_msg(state, type, contents); case HANDSHAKE_CCS: return this->process_change_cipher_spec_msg(state); case FINISHED: return this->process_finished_msg(state, type, contents); default: throw Unexpected_Message("Unknown handshake message received"); } } void Server::session_resume(Server_Handshake_State& pending_state, bool have_session_ticket_key, Session& session_info) { // Only offer a resuming client a new ticket if they didn't send one this time, // ie, resumed via server-side resumption. TODO: also send one if expiring soon? const bool offer_new_session_ticket = (pending_state.client_hello()->supports_session_ticket() && pending_state.client_hello()->session_ticket().empty() && have_session_ticket_key); pending_state.server_hello(new Server_Hello( pending_state.handshake_io(), pending_state.hash(), policy(), rng(), secure_renegotiation_data_for_server_hello(), *pending_state.client_hello(), session_info, offer_new_session_ticket, m_next_protocol)); secure_renegotiation_check(pending_state.server_hello()); pending_state.compute_session_keys(session_info.master_secret()); pending_state.set_resume_certs(session_info.peer_certs()); if(!save_session(session_info)) { session_manager().remove_entry(session_info.session_id()); if(pending_state.server_hello()->supports_session_ticket()) // send an empty ticket { pending_state.new_session_ticket( new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash())); } } if(pending_state.server_hello()->supports_session_ticket() && !pending_state.new_session_ticket()) { try { const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", ""); pending_state.new_session_ticket( new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash(), session_info.encrypt(ticket_key, rng()), policy().session_ticket_lifetime())); } catch(...) {} if(!pending_state.new_session_ticket()) { pending_state.new_session_ticket( new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash())); } } pending_state.handshake_io().send(Change_Cipher_Spec()); change_cipher_spec_writer(SERVER); pending_state.server_finished(new Finished(pending_state.handshake_io(), pending_state, SERVER)); pending_state.set_expected_next(HANDSHAKE_CCS); } void Server::session_create(Server_Handshake_State& pending_state, bool have_session_ticket_key) { std::map > cert_chains; const std::string sni_hostname = pending_state.client_hello()->sni_hostname(); cert_chains = get_server_certs(sni_hostname, m_creds); if(sni_hostname != "" && cert_chains.empty()) { cert_chains = get_server_certs("", m_creds); /* * Only send the unrecognized_name alert if we couldn't * find any certs for the requested name but did find at * least one cert to use in general. That avoids sending an * unrecognized_name when a server is configured for purely * anonymous operation. */ if(!cert_chains.empty()) send_alert(Alert(Alert::UNRECOGNIZED_NAME)); } const uint16_t ciphersuite = choose_ciphersuite(policy(), pending_state.version(), m_creds, cert_chains, *pending_state.client_hello()); Server_Hello::Settings srv_settings( make_hello_random(rng(), policy()), // new session ID pending_state.version(), ciphersuite, choose_compression(policy(), pending_state.client_hello()->compression_methods()), have_session_ticket_key); pending_state.server_hello(new Server_Hello( pending_state.handshake_io(), pending_state.hash(), policy(), rng(), secure_renegotiation_data_for_server_hello(), *pending_state.client_hello(), srv_settings, m_next_protocol)); secure_renegotiation_check(pending_state.server_hello()); const std::string sig_algo = pending_state.ciphersuite().sig_algo(); const std::string kex_algo = pending_state.ciphersuite().kex_algo(); if(sig_algo != "") { BOTAN_ASSERT(!cert_chains[sig_algo].empty(), "Attempting to send empty certificate chain"); pending_state.server_certs(new Certificate(pending_state.handshake_io(), pending_state.hash(), cert_chains[sig_algo])); } Private_Key* private_key = nullptr; if(kex_algo == "RSA" || sig_algo != "") { private_key = m_creds.private_key_for( pending_state.server_certs()->cert_chain()[0], "tls-server", sni_hostname); if(!private_key) throw Internal_Error("No private key located for associated server cert"); } if(kex_algo == "RSA") { pending_state.set_server_rsa_kex_key(private_key); } else { pending_state.server_kex(new Server_Key_Exchange(pending_state.handshake_io(), pending_state, policy(), m_creds, rng(), private_key)); } auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-server", sni_hostname); std::vector client_auth_CAs; for(auto store : trusted_CAs) { auto subjects = store->all_subjects(); client_auth_CAs.insert(client_auth_CAs.end(), subjects.begin(), subjects.end()); } if(!client_auth_CAs.empty() && pending_state.ciphersuite().sig_algo() != "") { pending_state.cert_req( new Certificate_Req(pending_state.handshake_io(), pending_state.hash(), policy(), client_auth_CAs, pending_state.version())); /* SSLv3 allowed clients to skip the Certificate message entirely if they wanted. In TLS v1.0 and later clients must send a (possibly empty) Certificate message */ pending_state.set_expected_next(CERTIFICATE); } else { pending_state.set_expected_next(CLIENT_KEX); } pending_state.server_hello_done(new Server_Hello_Done(pending_state.handshake_io(), pending_state.hash())); } } } botan-2.4.0/src/lib/tls/tls_server.h000066400000000000000000000127161322470703100173260ustar00rootroot00000000000000/* * TLS Server * (C) 2004-2011 Jack Lloyd * 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SERVER_H_ #define BOTAN_TLS_SERVER_H_ #include #include #include #include namespace Botan { namespace TLS { class Server_Handshake_State; /** * TLS Server */ class BOTAN_PUBLIC_API(2,0) Server final : public Channel { public: typedef std::function)> next_protocol_fn; /** * Server initialization * * @param callbacks contains a set of callback function references * required by the TLS client. * * @param session_manager manages session state * * @param creds manages application/user credentials * * @param policy specifies other connection policy information * * @param rng a random number generator * * @param is_datagram set to true if this server should expect DTLS * connections. Otherwise TLS connections are expected. * * @param reserved_io_buffer_size This many bytes of memory will * be preallocated for the read and write buffers. Smaller * values just mean reallocations and copies are more likely. */ Server(Callbacks& callbacks, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, bool is_datagram = false, size_t reserved_io_buffer_size = TLS::Server::IO_BUF_DEFAULT_SIZE ); /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new implementations. */ BOTAN_DEPRECATED("Use TLS::Server(TLS::Callbacks ...)") Server(output_fn output, data_cb data_cb, alert_cb alert_cb, handshake_cb handshake_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, next_protocol_fn next_proto = next_protocol_fn(), bool is_datagram = false, size_t reserved_io_buffer_size = TLS::Server::IO_BUF_DEFAULT_SIZE ); /** * DEPRECATED. This constructor is only provided for backward * compatibility and should not be used in new implementations. */ BOTAN_DEPRECATED("Use TLS::Server(TLS::Callbacks ...)") Server(output_fn output, data_cb data_cb, alert_cb alert_cb, handshake_cb handshake_cb, handshake_msg_cb hs_msg_cb, Session_Manager& session_manager, Credentials_Manager& creds, const Policy& policy, RandomNumberGenerator& rng, next_protocol_fn next_proto = next_protocol_fn(), bool is_datagram = false ); /** * Return the protocol notification set by the client (using the * NPN extension) for this connection, if any. This value is not * tied to the session and a later renegotiation of the same * session can choose a new protocol. */ std::string next_protocol() const { return m_next_protocol; } private: std::vector get_peer_cert_chain(const Handshake_State& state) const override; void initiate_handshake(Handshake_State& state, bool force_full_renegotiation) override; void process_handshake_msg(const Handshake_State* active_state, Handshake_State& pending_state, Handshake_Type type, const std::vector& contents) override; void process_client_hello_msg(const Handshake_State* active_state, Server_Handshake_State& pending_state, const std::vector& contents); void process_certificate_msg(Server_Handshake_State& pending_state, const std::vector& contents); void process_client_key_exchange_msg(Server_Handshake_State& pending_state, const std::vector& contents); void process_change_cipher_spec_msg(Server_Handshake_State& pending_state); void process_certificate_verify_msg(Server_Handshake_State& pending_state, Handshake_Type type, const std::vector& contents); void process_finished_msg(Server_Handshake_State& pending_state, Handshake_Type type, const std::vector& contents); void session_resume(Server_Handshake_State& pending_state, bool have_session_ticket_key, Session& session_info); void session_create(Server_Handshake_State& pending_state, bool have_session_ticket_key); Handshake_State* new_handshake_state(Handshake_IO* io) override; Credentials_Manager& m_creds; std::string m_next_protocol; // Set by deprecated constructor, Server calls both this fn and Callbacks version next_protocol_fn m_choose_next_protocol; }; } } #endif botan-2.4.0/src/lib/tls/tls_server_info.h000066400000000000000000000052331322470703100203350ustar00rootroot00000000000000/* * TLS Server Information * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SERVER_INFO_H_ #define BOTAN_TLS_SERVER_INFO_H_ #include #include namespace Botan { namespace TLS { /** * Represents information known about a TLS server. */ class BOTAN_PUBLIC_API(2,0) Server_Information final { public: /** * An empty server info - nothing known */ Server_Information() : m_hostname(""), m_service(""), m_port(0) {} /** * @param hostname the host's DNS name, if known * @param port specifies the protocol port of the server (eg for * TCP/UDP). Zero represents unknown. */ Server_Information(const std::string& hostname, uint16_t port = 0) : m_hostname(hostname), m_service(""), m_port(port) {} /** * @param hostname the host's DNS name, if known * @param service is a text string of the service type * (eg "https", "tor", or "git") * @param port specifies the protocol port of the server (eg for * TCP/UDP). Zero represents unknown. */ Server_Information(const std::string& hostname, const std::string& service, uint16_t port = 0) : m_hostname(hostname), m_service(service), m_port(port) {} /** * @return the host's DNS name, if known */ std::string hostname() const { return m_hostname; } /** * @return text string of the service type, e.g., * "https", "tor", or "git" */ std::string service() const { return m_service; } /** * @return the protocol port of the server, or zero if unknown */ uint16_t port() const { return m_port; } /** * @return whether the hostname is known */ bool empty() const { return m_hostname.empty(); } private: std::string m_hostname, m_service; uint16_t m_port; }; inline bool operator==(const Server_Information& a, const Server_Information& b) { return (a.hostname() == b.hostname()) && (a.service() == b.service()) && (a.port() == b.port()); } inline bool operator!=(const Server_Information& a, const Server_Information& b) { return !(a == b); } inline bool operator<(const Server_Information& a, const Server_Information& b) { if(a.hostname() != b.hostname()) return (a.hostname() < b.hostname()); if(a.service() != b.service()) return (a.service() < b.service()); if(a.port() != b.port()) return (a.port() < b.port()); return false; // equal } } } #endif botan-2.4.0/src/lib/tls/tls_session.cpp000066400000000000000000000165341322470703100200400ustar00rootroot00000000000000/* * TLS Session State * (C) 2011-2012,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { Session::Session(const std::vector& session_identifier, const secure_vector& master_secret, Protocol_Version version, uint16_t ciphersuite, uint8_t compression_method, Connection_Side side, bool extended_master_secret, bool encrypt_then_mac, const std::vector& certs, const std::vector& ticket, const Server_Information& server_info, const std::string& srp_identifier, uint16_t srtp_profile) : m_start_time(std::chrono::system_clock::now()), m_identifier(session_identifier), m_session_ticket(ticket), m_master_secret(master_secret), m_version(version), m_ciphersuite(ciphersuite), m_compression_method(compression_method), m_connection_side(side), m_srtp_profile(srtp_profile), m_extended_master_secret(extended_master_secret), m_encrypt_then_mac(encrypt_then_mac), m_peer_certs(certs), m_server_info(server_info), m_srp_identifier(srp_identifier) { } Session::Session(const std::string& pem) { secure_vector der = PEM_Code::decode_check_label(pem, "TLS SESSION"); *this = Session(der.data(), der.size()); } Session::Session(const uint8_t ber[], size_t ber_len) { uint8_t side_code = 0; ASN1_String server_hostname; ASN1_String server_service; size_t server_port; ASN1_String srp_identifier_str; uint8_t major_version = 0, minor_version = 0; std::vector peer_cert_bits; size_t start_time = 0; size_t srtp_profile = 0; size_t fragment_size = 0; BER_Decoder(ber, ber_len) .start_cons(SEQUENCE) .decode_and_check(static_cast(TLS_SESSION_PARAM_STRUCT_VERSION), "Unknown version in serialized TLS session") .decode_integer_type(start_time) .decode_integer_type(major_version) .decode_integer_type(minor_version) .decode(m_identifier, OCTET_STRING) .decode(m_session_ticket, OCTET_STRING) .decode_integer_type(m_ciphersuite) .decode_integer_type(m_compression_method) .decode_integer_type(side_code) .decode_integer_type(fragment_size) .decode(m_extended_master_secret) .decode(m_encrypt_then_mac) .decode(m_master_secret, OCTET_STRING) .decode(peer_cert_bits, OCTET_STRING) .decode(server_hostname) .decode(server_service) .decode(server_port) .decode(srp_identifier_str) .decode(srtp_profile) .end_cons() .verify_end(); /* Fragment size is not supported anymore, but the field is still set in the session object. */ if(fragment_size != 0) { throw Decoding_Error("Serialized TLS session used maximum fragment length which is " " no longer supported"); } m_version = Protocol_Version(major_version, minor_version); m_start_time = std::chrono::system_clock::from_time_t(start_time); m_connection_side = static_cast(side_code); m_srtp_profile = static_cast(srtp_profile); m_server_info = Server_Information(server_hostname.value(), server_service.value(), static_cast(server_port)); m_srp_identifier = srp_identifier_str.value(); if(!peer_cert_bits.empty()) { DataSource_Memory certs(peer_cert_bits.data(), peer_cert_bits.size()); while(!certs.end_of_data()) m_peer_certs.push_back(X509_Certificate(certs)); } } secure_vector Session::DER_encode() const { std::vector peer_cert_bits; for(size_t i = 0; i != m_peer_certs.size(); ++i) peer_cert_bits += m_peer_certs[i].BER_encode(); return DER_Encoder() .start_cons(SEQUENCE) .encode(static_cast(TLS_SESSION_PARAM_STRUCT_VERSION)) .encode(static_cast(std::chrono::system_clock::to_time_t(m_start_time))) .encode(static_cast(m_version.major_version())) .encode(static_cast(m_version.minor_version())) .encode(m_identifier, OCTET_STRING) .encode(m_session_ticket, OCTET_STRING) .encode(static_cast(m_ciphersuite)) .encode(static_cast(m_compression_method)) .encode(static_cast(m_connection_side)) .encode(static_cast(/*old fragment size*/0)) .encode(m_extended_master_secret) .encode(m_encrypt_then_mac) .encode(m_master_secret, OCTET_STRING) .encode(peer_cert_bits, OCTET_STRING) .encode(ASN1_String(m_server_info.hostname(), UTF8_STRING)) .encode(ASN1_String(m_server_info.service(), UTF8_STRING)) .encode(static_cast(m_server_info.port())) .encode(ASN1_String(m_srp_identifier, UTF8_STRING)) .encode(static_cast(m_srtp_profile)) .end_cons() .get_contents(); } std::string Session::PEM_encode() const { return PEM_Code::encode(this->DER_encode(), "TLS SESSION"); } std::chrono::seconds Session::session_age() const { return std::chrono::duration_cast( std::chrono::system_clock::now() - m_start_time); } std::vector Session::encrypt(const SymmetricKey& key, RandomNumberGenerator& rng) const { std::unique_ptr aead(get_aead("AES-256/GCM", ENCRYPTION)); const size_t nonce_len = aead->default_nonce_length(); const secure_vector nonce = rng.random_vec(nonce_len); const secure_vector bits = this->DER_encode(); // Support any length key for input std::unique_ptr hmac(MessageAuthenticationCode::create("HMAC(SHA-256)")); hmac->set_key(key); hmac->update(nonce); aead->set_key(hmac->final()); secure_vector buf = nonce; buf += bits; aead->start(buf.data(), nonce_len); aead->finish(buf, nonce_len); return unlock(buf); } Session Session::decrypt(const uint8_t in[], size_t in_len, const SymmetricKey& key) { try { std::unique_ptr aead(get_aead("AES-256/GCM", DECRYPTION)); const size_t nonce_len = aead->default_nonce_length(); if(in_len < nonce_len + aead->tag_size()) throw Decoding_Error("Encrypted session too short to be valid"); // Support any length key for input std::unique_ptr hmac(MessageAuthenticationCode::create("HMAC(SHA-256)")); hmac->set_key(key); hmac->update(in, nonce_len); // nonce bytes aead->set_key(hmac->final()); aead->start(in, nonce_len); secure_vector buf(in + nonce_len, in + in_len); aead->finish(buf, 0); return Session(buf.data(), buf.size()); } catch(std::exception& e) { throw Decoding_Error("Failed to decrypt serialized TLS session: " + std::string(e.what())); } } } } botan-2.4.0/src/lib/tls/tls_session.h000066400000000000000000000145011322470703100174750ustar00rootroot00000000000000/* * TLS Session * (C) 2011-2012,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SESSION_STATE_H_ #define BOTAN_TLS_SESSION_STATE_H_ #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { /** * Class representing a TLS session state */ class BOTAN_PUBLIC_API(2,0) Session final { public: /** * Uninitialized session */ Session() : m_start_time(std::chrono::system_clock::time_point::min()), m_version(), m_ciphersuite(0), m_compression_method(0), m_connection_side(static_cast(0)), m_srtp_profile(0), m_extended_master_secret(false), m_encrypt_then_mac(false) {} /** * New session (sets session start time) */ Session(const std::vector& session_id, const secure_vector& master_secret, Protocol_Version version, uint16_t ciphersuite, uint8_t compression_method, Connection_Side side, bool supports_extended_master_secret, bool supports_encrypt_then_mac, const std::vector& peer_certs, const std::vector& session_ticket, const Server_Information& server_info, const std::string& srp_identifier, uint16_t srtp_profile); /** * Load a session from DER representation (created by DER_encode) * @param ber DER representation buffer * @param ber_len size of buffer in bytes */ Session(const uint8_t ber[], size_t ber_len); /** * Load a session from PEM representation (created by PEM_encode) * @param pem PEM representation */ explicit Session(const std::string& pem); /** * Encode this session data for storage * @warning if the master secret is compromised so is the * session traffic */ secure_vector DER_encode() const; /** * Encrypt a session (useful for serialization or session tickets) */ std::vector encrypt(const SymmetricKey& key, RandomNumberGenerator& rng) const; /** * Decrypt a session created by encrypt * @param ctext the ciphertext returned by encrypt * @param ctext_size the size of ctext in bytes * @param key the same key used by the encrypting side */ static Session decrypt(const uint8_t ctext[], size_t ctext_size, const SymmetricKey& key); /** * Decrypt a session created by encrypt * @param ctext the ciphertext returned by encrypt * @param key the same key used by the encrypting side */ static inline Session decrypt(const std::vector& ctext, const SymmetricKey& key) { return Session::decrypt(ctext.data(), ctext.size(), key); } /** * Encode this session data for storage * @warning if the master secret is compromised so is the * session traffic */ std::string PEM_encode() const; /** * Get the version of the saved session */ Protocol_Version version() const { return m_version; } /** * Get the ciphersuite code of the saved session */ uint16_t ciphersuite_code() const { return m_ciphersuite; } /** * Get the ciphersuite info of the saved session */ Ciphersuite ciphersuite() const { return Ciphersuite::by_id(m_ciphersuite); } /** * Get the compression method used in the saved session */ uint8_t compression_method() const { return m_compression_method; } /** * Get which side of the connection the resumed session we are/were * acting as. */ Connection_Side side() const { return m_connection_side; } /** * Get the SRP identity (if sent by the client in the initial handshake) */ const std::string& srp_identifier() const { return m_srp_identifier; } /** * Get the saved master secret */ const secure_vector& master_secret() const { return m_master_secret; } /** * Get the session identifier */ const std::vector& session_id() const { return m_identifier; } /** * Get the negotiated DTLS-SRTP algorithm (RFC 5764) */ uint16_t dtls_srtp_profile() const { return m_srtp_profile; } bool supports_extended_master_secret() const { return m_extended_master_secret; } bool supports_encrypt_then_mac() const { return m_encrypt_then_mac; } /** * Return the certificate chain of the peer (possibly empty) */ const std::vector& peer_certs() const { return m_peer_certs; } /** * Get the wall clock time this session began */ std::chrono::system_clock::time_point start_time() const { return m_start_time; } /** * Return how long this session has existed (in seconds) */ std::chrono::seconds session_age() const; /** * Return the session ticket the server gave us */ const std::vector& session_ticket() const { return m_session_ticket; } /** * @return information about the TLS server */ const Server_Information& server_info() const { return m_server_info; } private: enum { TLS_SESSION_PARAM_STRUCT_VERSION = 20160812}; std::chrono::system_clock::time_point m_start_time; std::vector m_identifier; std::vector m_session_ticket; // only used by client side secure_vector m_master_secret; Protocol_Version m_version; uint16_t m_ciphersuite; uint8_t m_compression_method; Connection_Side m_connection_side; uint16_t m_srtp_profile; bool m_extended_master_secret; bool m_encrypt_then_mac; std::vector m_peer_certs; Server_Information m_server_info; // optional std::string m_srp_identifier; // optional }; } } #endif botan-2.4.0/src/lib/tls/tls_session_key.cpp000066400000000000000000000060361322470703100207040ustar00rootroot00000000000000/* * TLS Session Key * (C) 2004-2006,2011,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace TLS { /** * Session_Keys Constructor */ Session_Keys::Session_Keys(const Handshake_State* state, const secure_vector& pre_master_secret, bool resuming) { const size_t cipher_keylen = state->ciphersuite().cipher_keylen(); const size_t mac_keylen = state->ciphersuite().mac_keylen(); const size_t cipher_nonce_bytes = state->ciphersuite().nonce_bytes_from_handshake(); const bool extended_master_secret = state->server_hello()->supports_extended_master_secret(); const size_t prf_gen = 2 * (mac_keylen + cipher_keylen + cipher_nonce_bytes); const uint8_t MASTER_SECRET_MAGIC[] = { 0x6D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74 }; const uint8_t EXT_MASTER_SECRET_MAGIC[] = { 0x65, 0x78, 0x74, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x20, 0x6D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74 }; const uint8_t KEY_GEN_MAGIC[] = { 0x6B, 0x65, 0x79, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6E, 0x73, 0x69, 0x6F, 0x6E }; std::unique_ptr prf(state->protocol_specific_prf()); if(resuming) { // This is actually the master secret saved as part of the session m_master_sec = pre_master_secret; } else { secure_vector salt; secure_vector label; if(extended_master_secret) { label += std::make_pair(EXT_MASTER_SECRET_MAGIC, sizeof(EXT_MASTER_SECRET_MAGIC)); salt += state->hash().final(state->version(), state->ciphersuite().prf_algo()); } else { label += std::make_pair(MASTER_SECRET_MAGIC, sizeof(MASTER_SECRET_MAGIC)); salt += state->client_hello()->random(); salt += state->server_hello()->random(); } m_master_sec = prf->derive_key(48, pre_master_secret, salt, label); } secure_vector salt; secure_vector label; label += std::make_pair(KEY_GEN_MAGIC, sizeof(KEY_GEN_MAGIC)); salt += state->server_hello()->random(); salt += state->client_hello()->random(); SymmetricKey keyblock = prf->derive_key(prf_gen, m_master_sec, salt, label); const uint8_t* key_data = keyblock.begin(); m_c_mac = SymmetricKey(key_data, mac_keylen); key_data += mac_keylen; m_s_mac = SymmetricKey(key_data, mac_keylen); key_data += mac_keylen; m_c_cipher = SymmetricKey(key_data, cipher_keylen); key_data += cipher_keylen; m_s_cipher = SymmetricKey(key_data, cipher_keylen); key_data += cipher_keylen; m_c_iv = InitializationVector(key_data, cipher_nonce_bytes); key_data += cipher_nonce_bytes; m_s_iv = InitializationVector(key_data, cipher_nonce_bytes); } } } botan-2.4.0/src/lib/tls/tls_session_key.h000066400000000000000000000033641322470703100203520ustar00rootroot00000000000000/* * TLS Session Key * (C) 2004-2006,2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SESSION_KEYS_H_ #define BOTAN_TLS_SESSION_KEYS_H_ #include namespace Botan { namespace TLS { class Handshake_State; /** * TLS Session Keys */ class Session_Keys final { public: /** * @return client encipherment key */ const SymmetricKey& client_cipher_key() const { return m_c_cipher; } /** * @return client encipherment key */ const SymmetricKey& server_cipher_key() const { return m_s_cipher; } /** * @return client MAC key */ const SymmetricKey& client_mac_key() const { return m_c_mac; } /** * @return server MAC key */ const SymmetricKey& server_mac_key() const { return m_s_mac; } /** * @return client IV */ const InitializationVector& client_iv() const { return m_c_iv; } /** * @return server IV */ const InitializationVector& server_iv() const { return m_s_iv; } /** * @return TLS master secret */ const secure_vector& master_secret() const { return m_master_sec; } Session_Keys() = default; /** * @param state state the handshake state * @param pre_master_secret the pre-master secret * @param resuming whether this TLS session is resumed */ Session_Keys(const Handshake_State* state, const secure_vector& pre_master_secret, bool resuming); private: secure_vector m_master_sec; SymmetricKey m_c_cipher, m_s_cipher, m_c_mac, m_s_mac; InitializationVector m_c_iv, m_s_iv; }; } } #endif botan-2.4.0/src/lib/tls/tls_session_manager.h000066400000000000000000000117551322470703100211770ustar00rootroot00000000000000/* * TLS Session Manager * (C) 2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_SESSION_MANAGER_H_ #define BOTAN_TLS_SESSION_MANAGER_H_ #include #include #include #include namespace Botan { namespace TLS { /** * Session_Manager is an interface to systems which can save * session parameters for supporting session resumption. * * Saving sessions is done on a best-effort basis; an implementation is * allowed to drop sessions due to space constraints. * * Implementations should strive to be thread safe */ class BOTAN_PUBLIC_API(2,0) Session_Manager { public: /** * Try to load a saved session (using session ID) * @param session_id the session identifier we are trying to resume * @param session will be set to the saved session data (if found), or not modified if not found * @return true if session was modified */ virtual bool load_from_session_id(const std::vector& session_id, Session& session) = 0; /** * Try to load a saved session (using info about server) * @param info the information about the server * @param session will be set to the saved session data (if found), or not modified if not found * @return true if session was modified */ virtual bool load_from_server_info(const Server_Information& info, Session& session) = 0; /** * Remove this session id from the cache, if it exists */ virtual void remove_entry(const std::vector& session_id) = 0; /** * Remove all sessions from the cache, return number of sessions deleted */ virtual size_t remove_all() = 0; /** * Save a session on a best effort basis; the manager may not in * fact be able to save the session for whatever reason; this is * not an error. Caller cannot assume that calling save followed * immediately by load_from_* will result in a successful lookup. * * @param session to save */ virtual void save(const Session& session) = 0; /** * Return the allowed lifetime of a session; beyond this time, * sessions are not resumed. Returns 0 if unknown/no explicit * expiration policy. */ virtual std::chrono::seconds session_lifetime() const = 0; virtual ~Session_Manager() = default; }; /** * An implementation of Session_Manager that does not save sessions at * all, preventing session resumption. */ class BOTAN_PUBLIC_API(2,0) Session_Manager_Noop final : public Session_Manager { public: bool load_from_session_id(const std::vector&, Session&) override { return false; } bool load_from_server_info(const Server_Information&, Session&) override { return false; } void remove_entry(const std::vector&) override {} size_t remove_all() override { return 0; } void save(const Session&) override {} std::chrono::seconds session_lifetime() const override { return std::chrono::seconds(0); } }; /** * An implementation of Session_Manager that saves values in memory. */ class BOTAN_PUBLIC_API(2,0) Session_Manager_In_Memory final : public Session_Manager { public: /** * @param rng a RNG used for generating session key and for * session encryption * @param max_sessions a hint on the maximum number of sessions * to keep in memory at any one time. (If zero, don't cap) * @param session_lifetime sessions are expired after this many * seconds have elapsed from initial handshake. */ Session_Manager_In_Memory(RandomNumberGenerator& rng, size_t max_sessions = 1000, std::chrono::seconds session_lifetime = std::chrono::seconds(7200)); bool load_from_session_id(const std::vector& session_id, Session& session) override; bool load_from_server_info(const Server_Information& info, Session& session) override; void remove_entry(const std::vector& session_id) override; size_t remove_all() override; void save(const Session& session_data) override; std::chrono::seconds session_lifetime() const override { return m_session_lifetime; } private: bool load_from_session_str(const std::string& session_str, Session& session); mutex_type m_mutex; size_t m_max_sessions; std::chrono::seconds m_session_lifetime; RandomNumberGenerator& m_rng; secure_vector m_session_key; std::map> m_sessions; // hex(session_id) -> session std::map m_info_sessions; }; } } #endif botan-2.4.0/src/lib/tls/tls_session_manager_memory.cpp000066400000000000000000000057701322470703100231220ustar00rootroot00000000000000/* * TLS Session Management * (C) 2011,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace TLS { Session_Manager_In_Memory::Session_Manager_In_Memory( RandomNumberGenerator& rng, size_t max_sessions, std::chrono::seconds session_lifetime) : m_max_sessions(max_sessions), m_session_lifetime(session_lifetime), m_rng(rng), m_session_key(m_rng.random_vec(32)) {} bool Session_Manager_In_Memory::load_from_session_str( const std::string& session_str, Session& session) { // assert(lock is held) auto i = m_sessions.find(session_str); if(i == m_sessions.end()) return false; try { session = Session::decrypt(i->second, m_session_key); } catch(...) { return false; } // if session has expired, remove it const auto now = std::chrono::system_clock::now(); if(session.start_time() + session_lifetime() < now) { m_sessions.erase(i); return false; } return true; } bool Session_Manager_In_Memory::load_from_session_id( const std::vector& session_id, Session& session) { lock_guard_type lock(m_mutex); return load_from_session_str(hex_encode(session_id), session); } bool Session_Manager_In_Memory::load_from_server_info( const Server_Information& info, Session& session) { lock_guard_type lock(m_mutex); auto i = m_info_sessions.find(info); if(i == m_info_sessions.end()) return false; if(load_from_session_str(i->second, session)) return true; /* * It existed at one point but was removed from the sessions map, * remove m_info_sessions entry as well */ m_info_sessions.erase(i); return false; } void Session_Manager_In_Memory::remove_entry( const std::vector& session_id) { lock_guard_type lock(m_mutex); auto i = m_sessions.find(hex_encode(session_id)); if(i != m_sessions.end()) m_sessions.erase(i); } size_t Session_Manager_In_Memory::remove_all() { const size_t removed = m_sessions.size(); m_info_sessions.clear(); m_sessions.clear(); m_session_key = m_rng.random_vec(32); return removed; } void Session_Manager_In_Memory::save(const Session& session) { lock_guard_type lock(m_mutex); if(m_max_sessions != 0) { /* We generate new session IDs with the first 4 bytes being a timestamp, so this actually removes the oldest sessions first. */ while(m_sessions.size() >= m_max_sessions) m_sessions.erase(m_sessions.begin()); } const std::string session_id_str = hex_encode(session.session_id()); m_sessions[session_id_str] = session.encrypt(m_session_key, m_rng); if(session.side() == CLIENT && !session.server_info().empty()) m_info_sessions[session.server_info()] = session_id_str; } } } botan-2.4.0/src/lib/tls/tls_suite_info.cpp000066400000000000000000000554011322470703100205150ustar00rootroot00000000000000/* * TLS cipher suite information * * This file was automatically generated from the IANA assignments * (tls-parameters.txt hash ac96406c0080f669ca9442b0f5efcb31549ecb2e) * by ./src/scripts/tls_suite_info.py on 2017-11-03 * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace TLS { //static const std::vector& Ciphersuite::all_known_ciphersuites() { // Note that this list of ciphersuites is ordered by id! static const std::vector g_ciphersuite_list = { Ciphersuite(0x000A, "RSA_WITH_3DES_EDE_CBC_SHA", "RSA", "RSA", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0x0013, "DHE_DSS_WITH_3DES_EDE_CBC_SHA", "DSA", "DH", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0x0016, "DHE_RSA_WITH_3DES_EDE_CBC_SHA", "RSA", "DH", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0x001B, "DH_anon_WITH_3DES_EDE_CBC_SHA", "", "DH", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0x002F, "RSA_WITH_AES_128_CBC_SHA", "RSA", "RSA", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0032, "DHE_DSS_WITH_AES_128_CBC_SHA", "DSA", "DH", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0033, "DHE_RSA_WITH_AES_128_CBC_SHA", "RSA", "DH", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0034, "DH_anon_WITH_AES_128_CBC_SHA", "", "DH", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0035, "RSA_WITH_AES_256_CBC_SHA", "RSA", "RSA", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0038, "DHE_DSS_WITH_AES_256_CBC_SHA", "DSA", "DH", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0039, "DHE_RSA_WITH_AES_256_CBC_SHA", "RSA", "DH", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x003A, "DH_anon_WITH_AES_256_CBC_SHA", "", "DH", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x003C, "RSA_WITH_AES_128_CBC_SHA256", "RSA", "RSA", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x003D, "RSA_WITH_AES_256_CBC_SHA256", "RSA", "RSA", "AES-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x0040, "DHE_DSS_WITH_AES_128_CBC_SHA256", "DSA", "DH", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x0041, "RSA_WITH_CAMELLIA_128_CBC_SHA", "RSA", "RSA", "Camellia-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0044, "DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", "DSA", "DH", "Camellia-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0045, "DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", "RSA", "DH", "Camellia-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0046, "DH_anon_WITH_CAMELLIA_128_CBC_SHA", "", "DH", "Camellia-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0067, "DHE_RSA_WITH_AES_128_CBC_SHA256", "RSA", "DH", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x006A, "DHE_DSS_WITH_AES_256_CBC_SHA256", "DSA", "DH", "AES-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x006B, "DHE_RSA_WITH_AES_256_CBC_SHA256", "RSA", "DH", "AES-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x006C, "DH_anon_WITH_AES_128_CBC_SHA256", "", "DH", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x006D, "DH_anon_WITH_AES_256_CBC_SHA256", "", "DH", "AES-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x0084, "RSA_WITH_CAMELLIA_256_CBC_SHA", "RSA", "RSA", "Camellia-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0087, "DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", "DSA", "DH", "Camellia-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0088, "DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", "RSA", "DH", "Camellia-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0089, "DH_anon_WITH_CAMELLIA_256_CBC_SHA", "", "DH", "Camellia-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x008B, "PSK_WITH_3DES_EDE_CBC_SHA", "", "PSK", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0x008C, "PSK_WITH_AES_128_CBC_SHA", "", "PSK", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x008D, "PSK_WITH_AES_256_CBC_SHA", "", "PSK", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x008F, "DHE_PSK_WITH_3DES_EDE_CBC_SHA", "", "DHE_PSK", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0x0090, "DHE_PSK_WITH_AES_128_CBC_SHA", "", "DHE_PSK", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0091, "DHE_PSK_WITH_AES_256_CBC_SHA", "", "DHE_PSK", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0096, "RSA_WITH_SEED_CBC_SHA", "RSA", "RSA", "SEED", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x0099, "DHE_DSS_WITH_SEED_CBC_SHA", "DSA", "DH", "SEED", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x009A, "DHE_RSA_WITH_SEED_CBC_SHA", "RSA", "DH", "SEED", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x009B, "DH_anon_WITH_SEED_CBC_SHA", "", "DH", "SEED", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0x009C, "RSA_WITH_AES_128_GCM_SHA256", "RSA", "RSA", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0x009D, "RSA_WITH_AES_256_GCM_SHA384", "RSA", "RSA", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x009E, "DHE_RSA_WITH_AES_128_GCM_SHA256", "RSA", "DH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0x009F, "DHE_RSA_WITH_AES_256_GCM_SHA384", "RSA", "DH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x00A2, "DHE_DSS_WITH_AES_128_GCM_SHA256", "DSA", "DH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0x00A3, "DHE_DSS_WITH_AES_256_GCM_SHA384", "DSA", "DH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x00A6, "DH_anon_WITH_AES_128_GCM_SHA256", "", "DH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0x00A7, "DH_anon_WITH_AES_256_GCM_SHA384", "", "DH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x00A8, "PSK_WITH_AES_128_GCM_SHA256", "", "PSK", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0x00A9, "PSK_WITH_AES_256_GCM_SHA384", "", "PSK", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x00AA, "DHE_PSK_WITH_AES_128_GCM_SHA256", "", "DHE_PSK", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0x00AB, "DHE_PSK_WITH_AES_256_GCM_SHA384", "", "DHE_PSK", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x00AE, "PSK_WITH_AES_128_CBC_SHA256", "", "PSK", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00AF, "PSK_WITH_AES_256_CBC_SHA384", "", "PSK", "AES-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0x00B2, "DHE_PSK_WITH_AES_128_CBC_SHA256", "", "DHE_PSK", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00B3, "DHE_PSK_WITH_AES_256_CBC_SHA384", "", "DHE_PSK", "AES-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0x00BA, "RSA_WITH_CAMELLIA_128_CBC_SHA256", "RSA", "RSA", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00BD, "DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256", "DSA", "DH", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00BE, "DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", "RSA", "DH", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00BF, "DH_anon_WITH_CAMELLIA_128_CBC_SHA256", "", "DH", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00C0, "RSA_WITH_CAMELLIA_256_CBC_SHA256", "RSA", "RSA", "Camellia-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00C3, "DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256", "DSA", "DH", "Camellia-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00C4, "DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256", "RSA", "DH", "Camellia-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x00C5, "DH_anon_WITH_CAMELLIA_256_CBC_SHA256", "", "DH", "Camellia-256", 32, 16, 0, "SHA-256", 32, ""), Ciphersuite(0x16B7, "CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256", "RSA", "CECPQ1", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0x16B8, "CECPQ1_ECDSA_WITH_CHACHA20_POLY1305_SHA256", "ECDSA", "CECPQ1", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0x16B9, "CECPQ1_RSA_WITH_AES_256_GCM_SHA384", "RSA", "CECPQ1", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0x16BA, "CECPQ1_ECDSA_WITH_AES_256_GCM_SHA384", "ECDSA", "CECPQ1", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC008, "ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", "ECDSA", "ECDH", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC009, "ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "ECDSA", "ECDH", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC00A, "ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "ECDSA", "ECDH", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC012, "ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "RSA", "ECDH", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC013, "ECDHE_RSA_WITH_AES_128_CBC_SHA", "RSA", "ECDH", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC014, "ECDHE_RSA_WITH_AES_256_CBC_SHA", "RSA", "ECDH", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC017, "ECDH_anon_WITH_3DES_EDE_CBC_SHA", "", "ECDH", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC018, "ECDH_anon_WITH_AES_128_CBC_SHA", "", "ECDH", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC019, "ECDH_anon_WITH_AES_256_CBC_SHA", "", "ECDH", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC01A, "SRP_SHA_WITH_3DES_EDE_CBC_SHA", "", "SRP_SHA", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC01B, "SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA", "RSA", "SRP_SHA", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC01C, "SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA", "DSA", "SRP_SHA", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC01D, "SRP_SHA_WITH_AES_128_CBC_SHA", "", "SRP_SHA", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC01E, "SRP_SHA_RSA_WITH_AES_128_CBC_SHA", "RSA", "SRP_SHA", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC01F, "SRP_SHA_DSS_WITH_AES_128_CBC_SHA", "DSA", "SRP_SHA", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC020, "SRP_SHA_WITH_AES_256_CBC_SHA", "", "SRP_SHA", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC021, "SRP_SHA_RSA_WITH_AES_256_CBC_SHA", "RSA", "SRP_SHA", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC022, "SRP_SHA_DSS_WITH_AES_256_CBC_SHA", "DSA", "SRP_SHA", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC023, "ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "ECDSA", "ECDH", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC024, "ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", "ECDSA", "ECDH", "AES-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC027, "ECDHE_RSA_WITH_AES_128_CBC_SHA256", "RSA", "ECDH", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC028, "ECDHE_RSA_WITH_AES_256_CBC_SHA384", "RSA", "ECDH", "AES-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC02B, "ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "ECDSA", "ECDH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC02C, "ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "ECDSA", "ECDH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC02F, "ECDHE_RSA_WITH_AES_128_GCM_SHA256", "RSA", "ECDH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC030, "ECDHE_RSA_WITH_AES_256_GCM_SHA384", "RSA", "ECDH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC034, "ECDHE_PSK_WITH_3DES_EDE_CBC_SHA", "", "ECDHE_PSK", "3DES", 24, 8, 0, "SHA-1", 20, ""), Ciphersuite(0xC035, "ECDHE_PSK_WITH_AES_128_CBC_SHA", "", "ECDHE_PSK", "AES-128", 16, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC036, "ECDHE_PSK_WITH_AES_256_CBC_SHA", "", "ECDHE_PSK", "AES-256", 32, 16, 0, "SHA-1", 20, ""), Ciphersuite(0xC037, "ECDHE_PSK_WITH_AES_128_CBC_SHA256", "", "ECDHE_PSK", "AES-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC038, "ECDHE_PSK_WITH_AES_256_CBC_SHA384", "", "ECDHE_PSK", "AES-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC050, "RSA_WITH_ARIA_128_GCM_SHA256", "RSA", "RSA", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC051, "RSA_WITH_ARIA_256_GCM_SHA384", "RSA", "RSA", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC052, "DHE_RSA_WITH_ARIA_128_GCM_SHA256", "RSA", "DH", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC053, "DHE_RSA_WITH_ARIA_256_GCM_SHA384", "RSA", "DH", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC056, "DHE_DSS_WITH_ARIA_128_GCM_SHA256", "DSA", "DH", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC057, "DHE_DSS_WITH_ARIA_256_GCM_SHA384", "DSA", "DH", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC05A, "DH_anon_WITH_ARIA_128_GCM_SHA256", "", "DH", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC05B, "DH_anon_WITH_ARIA_256_GCM_SHA384", "", "DH", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC05C, "ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256", "ECDSA", "ECDH", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC05D, "ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384", "ECDSA", "ECDH", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC060, "ECDHE_RSA_WITH_ARIA_128_GCM_SHA256", "RSA", "ECDH", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC061, "ECDHE_RSA_WITH_ARIA_256_GCM_SHA384", "RSA", "ECDH", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC06A, "PSK_WITH_ARIA_128_GCM_SHA256", "", "PSK", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC06B, "PSK_WITH_ARIA_256_GCM_SHA384", "", "PSK", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC06C, "DHE_PSK_WITH_ARIA_128_GCM_SHA256", "", "DHE_PSK", "ARIA-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC06D, "DHE_PSK_WITH_ARIA_256_GCM_SHA384", "", "DHE_PSK", "ARIA-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC072, "ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256", "ECDSA", "ECDH", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC073, "ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384", "ECDSA", "ECDH", "Camellia-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC076, "ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", "RSA", "ECDH", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC077, "ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384", "RSA", "ECDH", "Camellia-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC07A, "RSA_WITH_CAMELLIA_128_GCM_SHA256", "RSA", "RSA", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC07B, "RSA_WITH_CAMELLIA_256_GCM_SHA384", "RSA", "RSA", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC07C, "DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256", "RSA", "DH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC07D, "DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384", "RSA", "DH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC080, "DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256", "DSA", "DH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC081, "DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384", "DSA", "DH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC084, "DH_anon_WITH_CAMELLIA_128_GCM_SHA256", "", "DH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC085, "DH_anon_WITH_CAMELLIA_256_GCM_SHA384", "", "DH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC086, "ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256", "ECDSA", "ECDH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC087, "ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384", "ECDSA", "ECDH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC08A, "ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256", "RSA", "ECDH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC08B, "ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384", "RSA", "ECDH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC08E, "PSK_WITH_CAMELLIA_128_GCM_SHA256", "", "PSK", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC08F, "PSK_WITH_CAMELLIA_256_GCM_SHA384", "", "PSK", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC090, "DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256", "", "DHE_PSK", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC091, "DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384", "", "DHE_PSK", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xC094, "PSK_WITH_CAMELLIA_128_CBC_SHA256", "", "PSK", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC095, "PSK_WITH_CAMELLIA_256_CBC_SHA384", "", "PSK", "Camellia-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC096, "DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256", "", "DHE_PSK", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC097, "DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384", "", "DHE_PSK", "Camellia-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC09A, "ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256", "", "ECDHE_PSK", "Camellia-128", 16, 16, 0, "SHA-256", 32, ""), Ciphersuite(0xC09B, "ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384", "", "ECDHE_PSK", "Camellia-256", 32, 16, 0, "SHA-384", 48, ""), Ciphersuite(0xC09C, "RSA_WITH_AES_128_CCM", "RSA", "RSA", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC09D, "RSA_WITH_AES_256_CCM", "RSA", "RSA", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC09E, "DHE_RSA_WITH_AES_128_CCM", "RSA", "DH", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC09F, "DHE_RSA_WITH_AES_256_CCM", "RSA", "DH", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A0, "RSA_WITH_AES_128_CCM_8", "RSA", "RSA", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A1, "RSA_WITH_AES_256_CCM_8", "RSA", "RSA", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A2, "DHE_RSA_WITH_AES_128_CCM_8", "RSA", "DH", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A3, "DHE_RSA_WITH_AES_256_CCM_8", "RSA", "DH", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A4, "PSK_WITH_AES_128_CCM", "", "PSK", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A5, "PSK_WITH_AES_256_CCM", "", "PSK", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A6, "DHE_PSK_WITH_AES_128_CCM", "", "DHE_PSK", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A7, "DHE_PSK_WITH_AES_256_CCM", "", "DHE_PSK", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A8, "PSK_WITH_AES_128_CCM_8", "", "PSK", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0A9, "PSK_WITH_AES_256_CCM_8", "", "PSK", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0AA, "PSK_DHE_WITH_AES_128_CCM_8", "", "DHE_PSK", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0AB, "PSK_DHE_WITH_AES_256_CCM_8", "", "DHE_PSK", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0AC, "ECDHE_ECDSA_WITH_AES_128_CCM", "ECDSA", "ECDH", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0AD, "ECDHE_ECDSA_WITH_AES_256_CCM", "ECDSA", "ECDH", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0AE, "ECDHE_ECDSA_WITH_AES_128_CCM_8", "ECDSA", "ECDH", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xC0AF, "ECDHE_ECDSA_WITH_AES_256_CCM_8", "ECDSA", "ECDH", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xCC13, "ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "RSA", "ECDH", "ChaCha20Poly1305", 32, 0, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCC14, "ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", "ECDSA", "ECDH", "ChaCha20Poly1305", 32, 0, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCC15, "DHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "RSA", "DH", "ChaCha20Poly1305", 32, 0, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCCA8, "ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "RSA", "ECDH", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCCA9, "ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", "ECDSA", "ECDH", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCCAA, "DHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "RSA", "DH", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCCAB, "PSK_WITH_CHACHA20_POLY1305_SHA256", "", "PSK", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCCAC, "ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256", "", "ECDHE_PSK", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xCCAD, "DHE_PSK_WITH_CHACHA20_POLY1305_SHA256", "", "DHE_PSK", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xD001, "ECDHE_PSK_WITH_AES_128_GCM_SHA256", "", "ECDHE_PSK", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xD002, "ECDHE_PSK_WITH_AES_256_GCM_SHA384", "", "ECDHE_PSK", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"), Ciphersuite(0xD003, "ECDHE_PSK_WITH_AES_128_CCM_8_SHA256", "", "ECDHE_PSK", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xD005, "ECDHE_PSK_WITH_AES_128_CCM_SHA256", "", "ECDHE_PSK", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC0, "DHE_RSA_WITH_AES_128_OCB_SHA256", "RSA", "DH", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC1, "DHE_RSA_WITH_AES_256_OCB_SHA256", "RSA", "DH", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC2, "ECDHE_RSA_WITH_AES_128_OCB_SHA256", "RSA", "ECDH", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC3, "ECDHE_RSA_WITH_AES_256_OCB_SHA256", "RSA", "ECDH", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC4, "ECDHE_ECDSA_WITH_AES_128_OCB_SHA256", "ECDSA", "ECDH", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC5, "ECDHE_ECDSA_WITH_AES_256_OCB_SHA256", "ECDSA", "ECDH", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC6, "PSK_WITH_AES_128_OCB_SHA256", "", "PSK", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC7, "PSK_WITH_AES_256_OCB_SHA256", "", "PSK", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC8, "DHE_PSK_WITH_AES_128_OCB_SHA256", "", "DHE_PSK", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFC9, "DHE_PSK_WITH_AES_256_OCB_SHA256", "", "DHE_PSK", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFCA, "ECDHE_PSK_WITH_AES_128_OCB_SHA256", "", "ECDHE_PSK", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFCB, "ECDHE_PSK_WITH_AES_256_OCB_SHA256", "", "ECDHE_PSK", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFCC, "CECPQ1_RSA_WITH_AES_256_OCB_SHA256", "RSA", "CECPQ1", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), Ciphersuite(0xFFCD, "CECPQ1_ECDSA_WITH_AES_256_OCB_SHA256", "ECDSA", "CECPQ1", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"), }; return g_ciphersuite_list; } } } botan-2.4.0/src/lib/tls/tls_text_policy.cpp000066400000000000000000000153341322470703100207150ustar00rootroot00000000000000/* * Text-Based TLS Policy * (C) 2016,2017 Jack Lloyd * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace TLS { std::vector Text_Policy::allowed_ciphers() const { return get_list("ciphers", Policy::allowed_ciphers()); } std::vector Text_Policy::allowed_signature_hashes() const { return get_list("signature_hashes", Policy::allowed_signature_hashes()); } std::vector Text_Policy::allowed_macs() const { return get_list("macs", Policy::allowed_macs()); } std::vector Text_Policy::allowed_key_exchange_methods() const { return get_list("key_exchange_methods", Policy::allowed_key_exchange_methods()); } std::vector Text_Policy::allowed_signature_methods() const { return get_list("signature_methods", Policy::allowed_signature_methods()); } std::vector Text_Policy::allowed_ecc_curves() const { return get_list("ecc_curves", Policy::allowed_ecc_curves()); } bool Text_Policy::use_ecc_point_compression() const { return get_bool("use_ecc_point_compression", Policy::use_ecc_point_compression()); } bool Text_Policy::allow_tls10() const { return get_bool("allow_tls10", Policy::allow_tls10()); } bool Text_Policy::allow_tls11() const { return get_bool("allow_tls11", Policy::allow_tls11()); } bool Text_Policy::allow_tls12() const { return get_bool("allow_tls12", Policy::allow_tls12()); } bool Text_Policy::allow_dtls10() const { return get_bool("allow_dtls10", Policy::allow_dtls10()); } bool Text_Policy::allow_dtls12() const { return get_bool("allow_dtls12", Policy::allow_dtls12()); } bool Text_Policy::allow_insecure_renegotiation() const { return get_bool("allow_insecure_renegotiation", Policy::allow_insecure_renegotiation()); } bool Text_Policy::include_time_in_hello_random() const { return get_bool("include_time_in_hello_random", Policy::include_time_in_hello_random()); } bool Text_Policy::allow_client_initiated_renegotiation() const { return get_bool("allow_client_initiated_renegotiation", Policy::allow_client_initiated_renegotiation()); } bool Text_Policy::allow_server_initiated_renegotiation() const { return get_bool("allow_server_initiated_renegotiation", Policy::allow_server_initiated_renegotiation()); } bool Text_Policy::server_uses_own_ciphersuite_preferences() const { return get_bool("server_uses_own_ciphersuite_preferences", Policy::server_uses_own_ciphersuite_preferences()); } bool Text_Policy::negotiate_encrypt_then_mac() const { return get_bool("negotiate_encrypt_then_mac", Policy::negotiate_encrypt_then_mac()); } bool Text_Policy::support_cert_status_message() const { return get_bool("support_cert_status_message", Policy::support_cert_status_message()); } std::string Text_Policy::dh_group() const { return get_str("dh_group", Policy::dh_group()); } std::vector Text_Policy::allowed_groups() const { return get_list("groups", Policy::allowed_groups()); } size_t Text_Policy::minimum_ecdh_group_size() const { return get_len("minimum_ecdh_group_size", Policy::minimum_ecdh_group_size()); } size_t Text_Policy::minimum_ecdsa_group_size() const { return get_len("minimum_ecdsa_group_size", Policy::minimum_ecdsa_group_size()); } size_t Text_Policy::minimum_dh_group_size() const { return get_len("minimum_dh_group_size", Policy::minimum_dh_group_size()); } size_t Text_Policy::minimum_rsa_bits() const { return get_len("minimum_rsa_bits", Policy::minimum_rsa_bits()); } size_t Text_Policy::minimum_signature_strength() const { return get_len("minimum_signature_strength", Policy::minimum_signature_strength()); } size_t Text_Policy::dtls_default_mtu() const { return get_len("dtls_default_mtu", Policy::dtls_default_mtu()); } size_t Text_Policy::dtls_initial_timeout() const { return get_len("dtls_initial_timeout", Policy::dtls_initial_timeout()); } size_t Text_Policy::dtls_maximum_timeout() const { return get_len("dtls_maximum_timeout", Policy::dtls_maximum_timeout()); } bool Text_Policy::require_cert_revocation_info() const { return get_bool("require_cert_revocation_info", Policy::require_cert_revocation_info()); } bool Text_Policy::hide_unknown_users() const { return get_bool("hide_unknown_users", Policy::hide_unknown_users()); } uint32_t Text_Policy::session_ticket_lifetime() const { return static_cast(get_len("session_ticket_lifetime", Policy::session_ticket_lifetime())); } bool Text_Policy::send_fallback_scsv(Protocol_Version version) const { return get_bool("send_fallback_scsv", false) ? Policy::send_fallback_scsv(version) : false; } std::vector Text_Policy::srtp_profiles() const { std::vector r; for(std::string p : get_list("srtp_profiles", std::vector())) { r.push_back(to_uint16(p)); } return r; } void Text_Policy::set(const std::string& k, const std::string& v) { m_kv[k] = v; } Text_Policy::Text_Policy(const std::string& s) { std::istringstream iss(s); m_kv = read_cfg(iss); } Text_Policy::Text_Policy(std::istream& in) : m_kv(read_cfg(in)) {} std::vector Text_Policy::get_list(const std::string& key, const std::vector& def) const { const std::string v = get_str(key); if(v.empty()) { return def; } return split_on(v, ' '); } size_t Text_Policy::get_len(const std::string& key, size_t def) const { const std::string v = get_str(key); if(v.empty()) { return def; } return to_u32bit(v); } bool Text_Policy::get_bool(const std::string& key, bool def) const { const std::string v = get_str(key); if(v.empty()) { return def; } if(v == "true" || v == "True") { return true; } else if(v == "false" || v == "False") { return false; } else { throw Exception("Invalid boolean '" + v + "'"); } } std::string Text_Policy::get_str(const std::string& key, const std::string& def) const { auto i = m_kv.find(key); if(i == m_kv.end()) { return def; } return i->second; } bool Text_Policy::set_value(const std::string& key, const std::string& val, bool overwrite) { auto i = m_kv.find(key); if(overwrite == false && i != m_kv.end()) return false; m_kv.insert(i, std::make_pair(key, val)); return true; } } } botan-2.4.0/src/lib/tls/tls_version.cpp000066400000000000000000000045761322470703100200450ustar00rootroot00000000000000/* * TLS Protocol Version Management * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { namespace TLS { std::string Protocol_Version::to_string() const { const uint8_t maj = major_version(); const uint8_t min = minor_version(); if(maj == 3 && min == 0) return "SSL v3"; if(maj == 3 && min >= 1) // TLS v1.x return "TLS v1." + std::to_string(min-1); if(maj == 254) // DTLS 1.x return "DTLS v1." + std::to_string(255 - min); // Some very new or very old protocol (or bogus data) return "Unknown " + std::to_string(maj) + "." + std::to_string(min); } bool Protocol_Version::is_datagram_protocol() const { return major_version() == 254; } bool Protocol_Version::operator>(const Protocol_Version& other) const { if(this->is_datagram_protocol() != other.is_datagram_protocol()) throw TLS_Exception(Alert::PROTOCOL_VERSION, "Version comparing " + to_string() + " with " + other.to_string()); if(this->is_datagram_protocol()) return m_version < other.m_version; // goes backwards return m_version > other.m_version; } bool Protocol_Version::known_version() const { return (m_version == Protocol_Version::TLS_V10 || m_version == Protocol_Version::TLS_V11 || m_version == Protocol_Version::TLS_V12 || m_version == Protocol_Version::DTLS_V10 || m_version == Protocol_Version::DTLS_V12); } bool Protocol_Version::supports_negotiable_signature_algorithms() const { return (m_version == Protocol_Version::TLS_V12 || m_version == Protocol_Version::DTLS_V12); } bool Protocol_Version::supports_explicit_cbc_ivs() const { return (m_version == Protocol_Version::TLS_V11 || m_version == Protocol_Version::TLS_V12 || m_version == Protocol_Version::DTLS_V10 || m_version == Protocol_Version::DTLS_V12); } bool Protocol_Version::supports_ciphersuite_specific_prf() const { return (m_version == Protocol_Version::TLS_V12 || m_version == Protocol_Version::DTLS_V12); } bool Protocol_Version::supports_aead_modes() const { return (m_version == Protocol_Version::TLS_V12 || m_version == Protocol_Version::DTLS_V12); } } } botan-2.4.0/src/lib/tls/tls_version.h000066400000000000000000000067011322470703100175020ustar00rootroot00000000000000/* * TLS Protocol Version Management * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TLS_PROTOCOL_VERSION_H_ #define BOTAN_TLS_PROTOCOL_VERSION_H_ #include #include namespace Botan { namespace TLS { /** * TLS Protocol Version */ class BOTAN_PUBLIC_API(2,0) Protocol_Version final { public: enum Version_Code { TLS_V10 = 0x0301, TLS_V11 = 0x0302, TLS_V12 = 0x0303, DTLS_V10 = 0xFEFF, DTLS_V12 = 0xFEFD }; /** * @return latest known TLS version */ static Protocol_Version latest_tls_version() { return Protocol_Version(TLS_V12); } /** * @return latest known DTLS version */ static Protocol_Version latest_dtls_version() { return Protocol_Version(DTLS_V12); } Protocol_Version() : m_version(0) {} /** * @param named_version a specific named version of the protocol */ Protocol_Version(Version_Code named_version) : m_version(static_cast(named_version)) {} /** * @param major the major version * @param minor the minor version */ Protocol_Version(uint8_t major, uint8_t minor) : m_version(static_cast((static_cast(major) << 8) | minor)) {} /** * @return true if this is a valid protocol version */ bool valid() const { return (m_version != 0); } /** * @return true if this is a protocol version we know about */ bool known_version() const; /** * @return major version of the protocol version */ uint8_t major_version() const { return get_byte(0, m_version); } /** * @return minor version of the protocol version */ uint8_t minor_version() const { return get_byte(1, m_version); } /** * @return human-readable description of this version */ std::string to_string() const; /** * @return true iff this is a DTLS version */ bool is_datagram_protocol() const; /** * @return true if this version supports negotiable signature algorithms */ bool supports_negotiable_signature_algorithms() const; /** * @return true if this version uses explicit IVs for block ciphers */ bool supports_explicit_cbc_ivs() const; /** * @return true if this version uses a ciphersuite specific PRF */ bool supports_ciphersuite_specific_prf() const; bool supports_aead_modes() const; /** * @return if this version is equal to other */ bool operator==(const Protocol_Version& other) const { return (m_version == other.m_version); } /** * @return if this version is not equal to other */ bool operator!=(const Protocol_Version& other) const { return (m_version != other.m_version); } /** * @return if this version is later than other */ bool operator>(const Protocol_Version& other) const; /** * @return if this version is later than or equal to other */ bool operator>=(const Protocol_Version& other) const { return (*this == other || *this > other); } private: uint16_t m_version; }; } } #endif botan-2.4.0/src/lib/utils/000077500000000000000000000000001322470703100153145ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/assert.cpp000066400000000000000000000014231322470703100173210ustar00rootroot00000000000000/* * Runtime assertion checking * (C) 2010,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { void assertion_failure(const char* expr_str, const char* assertion_made, const char* func, const char* file, int line) { std::ostringstream format; format << "False assertion "; if(assertion_made && assertion_made[0] != 0) format << "'" << assertion_made << "' (expression " << expr_str << ") "; else format << expr_str << " "; if(func) format << "in " << func << " "; format << "@" << file << ":" << line; throw Exception(format.str()); } } botan-2.4.0/src/lib/utils/assert.h000066400000000000000000000127141322470703100167730ustar00rootroot00000000000000/* * Runtime assertion checking * (C) 2010 Jack Lloyd * 2017 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ASSERTION_CHECKING_H_ #define BOTAN_ASSERTION_CHECKING_H_ #include #include namespace Botan { /** * Called when an assertion fails */ BOTAN_NORETURN void BOTAN_PUBLIC_API(2,0) assertion_failure(const char* expr_str, const char* assertion_made, const char* func, const char* file, int line); /** * Make an assertion */ #define BOTAN_ASSERT(expr, assertion_made) \ do { \ if(!(expr)) \ Botan::assertion_failure(#expr, \ assertion_made, \ BOTAN_CURRENT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) /** * Make an assertion */ #define BOTAN_ASSERT_NOMSG(expr) \ do { \ if(!(expr)) \ Botan::assertion_failure(#expr, \ "", \ BOTAN_CURRENT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) /** * Assert that value1 == value2 */ #define BOTAN_ASSERT_EQUAL(expr1, expr2, assertion_made) \ do { \ if((expr1) != (expr2)) \ Botan::assertion_failure(#expr1 " == " #expr2, \ assertion_made, \ BOTAN_CURRENT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) /** * Assert that expr1 (if true) implies expr2 is also true */ #define BOTAN_ASSERT_IMPLICATION(expr1, expr2, msg) \ do { \ if((expr1) && !(expr2)) \ Botan::assertion_failure(#expr1 " implies " #expr2, \ msg, \ BOTAN_CURRENT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) /** * Assert that a pointer is not null */ #define BOTAN_ASSERT_NONNULL(ptr) \ do { \ if((ptr) == nullptr) \ Botan::assertion_failure(#ptr " is not null", \ "", \ BOTAN_CURRENT_FUNCTION, \ __FILE__, \ __LINE__); \ } while(0) /** * Mark variable as unused. Takes between 1 and 9 arguments and marks all as unused, * e.g. BOTAN_UNUSED(a); or BOTAN_UNUSED(x, y, z); */ #define _BOTAN_UNUSED_IMPL1(a) static_cast(a) #define _BOTAN_UNUSED_IMPL2(a, b) static_cast(a); _BOTAN_UNUSED_IMPL1(b) #define _BOTAN_UNUSED_IMPL3(a, b, c) static_cast(a); _BOTAN_UNUSED_IMPL2(b, c) #define _BOTAN_UNUSED_IMPL4(a, b, c, d) static_cast(a); _BOTAN_UNUSED_IMPL3(b, c, d) #define _BOTAN_UNUSED_IMPL5(a, b, c, d, e) static_cast(a); _BOTAN_UNUSED_IMPL4(b, c, d, e) #define _BOTAN_UNUSED_IMPL6(a, b, c, d, e, f) static_cast(a); _BOTAN_UNUSED_IMPL5(b, c, d, e, f) #define _BOTAN_UNUSED_IMPL7(a, b, c, d, e, f, g) static_cast(a); _BOTAN_UNUSED_IMPL6(b, c, d, e, f, g) #define _BOTAN_UNUSED_IMPL8(a, b, c, d, e, f, g, h) static_cast(a); _BOTAN_UNUSED_IMPL7(b, c, d, e, f, g, h) #define _BOTAN_UNUSED_IMPL9(a, b, c, d, e, f, g, h, i) static_cast(a); _BOTAN_UNUSED_IMPL8(b, c, d, e, f, g, h, i) #define _BOTAN_UNUSED_GET_IMPL(_1, _2, _3, _4, _5, _6, _7, _8, _9, IMPL_NAME, ...) IMPL_NAME #define BOTAN_UNUSED(...) _BOTAN_UNUSED_GET_IMPL(__VA_ARGS__, \ _BOTAN_UNUSED_IMPL9, \ _BOTAN_UNUSED_IMPL8, \ _BOTAN_UNUSED_IMPL7, \ _BOTAN_UNUSED_IMPL6, \ _BOTAN_UNUSED_IMPL5, \ _BOTAN_UNUSED_IMPL4, \ _BOTAN_UNUSED_IMPL3, \ _BOTAN_UNUSED_IMPL2, \ _BOTAN_UNUSED_IMPL1, \ unused dummy rest value \ ) /* we got an one of _BOTAN_UNUSED_IMPL*, now call it */ (__VA_ARGS__) } #endif botan-2.4.0/src/lib/utils/barrier.cpp000066400000000000000000000013071322470703100174470ustar00rootroot00000000000000/* * Barrier * (C) 2016 Joel Low * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) namespace Botan { void Barrier::wait(size_t delta) { lock_guard_type lock(m_mutex); m_value += delta; } void Barrier::sync() { std::unique_lock lock(m_mutex); if(m_value > 1) { --m_value; const size_t current_syncs = m_syncs; m_cond.wait(lock, [this, ¤t_syncs] { return m_syncs != current_syncs; }); } else { m_value = 0; ++m_syncs; m_cond.notify_all(); } } } #endif botan-2.4.0/src/lib/utils/barrier.h000066400000000000000000000020131322470703100171070ustar00rootroot00000000000000/* * Barrier * (C) 2016 Joel Low * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTIL_BARRIER_H_ #define BOTAN_UTIL_BARRIER_H_ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #endif namespace Botan { #if defined(BOTAN_TARGET_OS_HAS_THREADS) /** Barrier implements a barrier synchronization primitive. wait() will indicate how many threads to synchronize; each thread needing synchronization should call sync(). When sync() returns, the barrier is reset to zero, and the m_syncs counter is incremented. m_syncs is a counter to ensure that wait() can be called after a sync() even if the previously sleeping threads have not awoken.) */ class Barrier final { public: explicit Barrier(int value = 0) : m_value(value), m_syncs(0) {} void wait(size_t delta); void sync(); private: int m_value; size_t m_syncs; mutex_type m_mutex; std::condition_variable m_cond; }; #endif } #endif botan-2.4.0/src/lib/utils/bit_ops.h000066400000000000000000000052211322470703100171240ustar00rootroot00000000000000/* * Bit/Word Operations * (C) 1999-2008 Jack Lloyd * (C) Copyright Projet SECRET, INRIA, Rocquencourt * (C) Bhaskar Biswas and Nicolas Sendrier * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BIT_OPS_H_ #define BOTAN_BIT_OPS_H_ #include namespace Botan { /** * Power of 2 test. T should be an unsigned integer type * @param arg an integer value * @return true iff arg is 2^n for some n > 0 */ template inline bool is_power_of_2(T arg) { return ((arg != 0 && arg != 1) && ((arg & (arg-1)) == 0)); } /** * Return the index of the highest set bit * T is an unsigned integer type * @param n an integer value * @return index of the highest set bit in n */ template inline size_t high_bit(T n) { for(size_t i = 8*sizeof(T); i > 0; --i) if((n >> (i - 1)) & 0x01) return i; return 0; } /** * Return the index of the lowest set bit * T is an unsigned integer type * @param n an integer value * @return index of the lowest set bit in n */ template inline size_t low_bit(T n) { for(size_t i = 0; i != 8*sizeof(T); ++i) if((n >> i) & 0x01) return (i + 1); return 0; } /** * Return the number of significant bytes in n * @param n an integer value * @return number of significant bytes in n */ template inline size_t significant_bytes(T n) { for(size_t i = 0; i != sizeof(T); ++i) if(get_byte(i, n)) return sizeof(T)-i; return 0; } /** * Compute Hamming weights * @param n an integer value * @return number of bits in n set to 1 */ template inline size_t hamming_weight(T n) { const uint8_t NIBBLE_WEIGHTS[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; size_t weight = 0; for(size_t i = 0; i != 2*sizeof(T); ++i) weight += NIBBLE_WEIGHTS[(n >> (4*i)) & 0x0F]; return weight; } /** * Count the trailing zero bits in n * @param n an integer value * @return maximum x st 2^x divides n */ template inline size_t ctz(T n) { for(size_t i = 0; i != 8*sizeof(T); ++i) if((n >> i) & 0x01) return i; return 8*sizeof(T); } #if defined(BOTAN_BUILD_COMPILER_IS_GCC) || defined(BOTAN_BUILD_COMPILER_IS_CLANG) template<> inline size_t ctz(uint32_t n) { return __builtin_ctz(n); } #endif template size_t ceil_log2(T x) { if(x >> (sizeof(T)*8-1)) return sizeof(T)*8; size_t result = 0; T compare = 1; while(compare < x) { compare <<= 1; result++; } return result; } } #endif botan-2.4.0/src/lib/utils/boost/000077500000000000000000000000001322470703100164425ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/boost/info.txt000066400000000000000000000002161322470703100201350ustar00rootroot00000000000000 BOOST_FILESYSTEM -> 20131228 BOOST_ASIO -> 20131228 load_on vendor all -> boost_system,boost_filesystem botan-2.4.0/src/lib/utils/bswap.h000066400000000000000000000040501322470703100166000ustar00rootroot00000000000000/* * Byte Swapping Operations * (C) 1999-2011 Jack Lloyd * (C) 2007 Yves Jerschow * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_BYTE_SWAP_H_ #define BOTAN_BYTE_SWAP_H_ #include #include #if defined(BOTAN_BUILD_COMPILER_IS_MSVC) #include #endif namespace Botan { /** * Swap a 16 bit integer */ inline uint16_t reverse_bytes(uint16_t val) { return rotl<8>(val); } /** * Swap a 32 bit integer */ inline uint32_t reverse_bytes(uint32_t val) { #if defined(BOTAN_BUILD_COMPILER_IS_GCC) || defined(BOTAN_BUILD_COMPILER_IS_CLANG) return __builtin_bswap32(val); #elif defined(BOTAN_BUILD_COMPILER_IS_MSVC) return _byteswap_ulong(val); #elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) // GCC-style inline assembly for x86 or x86-64 asm("bswapl %0" : "=r" (val) : "0" (val)); return val; #else // Generic implementation return (rotr<8>(val) & 0xFF00FF00) | (rotl<8>(val) & 0x00FF00FF); #endif } /** * Swap a 64 bit integer */ inline uint64_t reverse_bytes(uint64_t val) { #if defined(BOTAN_BUILD_COMPILER_IS_GCC) || defined(BOTAN_BUILD_COMPILER_IS_CLANG) return __builtin_bswap64(val); #elif defined(BOTAN_BUILD_COMPILER_IS_MSVC) return _byteswap_uint64(val); #elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_X86_64) // GCC-style inline assembly for x86-64 asm("bswapq %0" : "=r" (val) : "0" (val)); return val; #else /* Generic implementation. Defined in terms of 32-bit bswap so any * optimizations in that version can help. */ uint32_t hi = static_cast(val >> 32); uint32_t lo = static_cast(val); hi = reverse_bytes(hi); lo = reverse_bytes(lo); return (static_cast(lo) << 32) | hi; #endif } /** * Swap 4 Ts in an array */ template inline void bswap_4(T x[4]) { x[0] = reverse_bytes(x[0]); x[1] = reverse_bytes(x[1]); x[2] = reverse_bytes(x[2]); x[3] = reverse_bytes(x[3]); } } #endif botan-2.4.0/src/lib/utils/calendar.cpp000066400000000000000000000070061322470703100175740ustar00rootroot00000000000000/* * Calendar Functions * (C) 1999-2010,2017 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { std::tm do_gmtime(std::time_t time_val) { std::tm tm; #if defined(BOTAN_TARGET_OS_HAS_GMTIME_S) ::gmtime_s(&tm, &time_val); // Windows #elif defined(BOTAN_TARGET_OS_HAS_GMTIME_R) ::gmtime_r(&time_val, &tm); // Unix/SUSv2 #else std::tm* tm_p = std::gmtime(&time_val); if (tm_p == nullptr) throw Encoding_Error("time_t_to_tm could not convert"); tm = *tm_p; #endif return tm; } /* Portable replacement for timegm, _mkgmtime, etc Algorithm due to Howard Hinnant See https://howardhinnant.github.io/date_algorithms.html#days_from_civil for details and explaination. The code is slightly simplified by our assumption that the date is at least 1970, which is sufficient for our purposes. */ size_t days_since_epoch(uint32_t year, uint32_t month, uint32_t day) { if(month <= 2) year -= 1; const uint32_t era = year / 400; const uint32_t yoe = year - era * 400; // [0, 399] const uint32_t doy = (153*(month + (month > 2 ? -3 : 9)) + 2)/5 + day-1; // [0, 365] const uint32_t doe = yoe * 365 + yoe/4 - yoe/100 + doy; // [0, 146096] return era * 146097 + doe - 719468; } } std::chrono::system_clock::time_point calendar_point::to_std_timepoint() const { if(get_year() < 1970) throw Invalid_Argument("calendar_point::to_std_timepoint() does not support years before 1970"); // 32 bit time_t ends at January 19, 2038 // https://msdn.microsoft.com/en-us/library/2093ets1.aspx // Throw after 2037 if 32 bit time_t is used if(get_year() > 2037 && sizeof(std::time_t) == 4) { throw Invalid_Argument("calendar_point::to_std_timepoint() does not support years after 2037 on this system"); } else if(get_year() >= 2400) { // This upper bound is somewhat arbitrary throw Invalid_Argument("calendar_point::to_std_timepoint() does not support years after 2400"); } const uint64_t seconds_64 = (days_since_epoch(get_year(), get_month(), get_day()) * 86400) + (get_hour() * 60 * 60) + (get_minutes() * 60) + get_seconds(); const time_t seconds_time_t = static_cast(seconds_64); if(seconds_64 - seconds_time_t != 0) { throw Invalid_Argument("calendar_point::to_std_timepoint time_t overflow"); } return std::chrono::system_clock::from_time_t(seconds_time_t); } std::string calendar_point::to_string() const { // desired format: --
T:: std::stringstream output; output << std::setfill('0') << std::setw(4) << get_year() << "-" << std::setw(2) << get_month() << "-" << std::setw(2) << get_day() << "T" << std::setw(2) << get_hour() << ":" << std::setw(2) << get_minutes() << ":" << std::setw(2) << get_seconds(); return output.str(); } calendar_point calendar_value( const std::chrono::system_clock::time_point& time_point) { std::tm tm = do_gmtime(std::chrono::system_clock::to_time_t(time_point)); return calendar_point(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } } botan-2.4.0/src/lib/utils/calendar.h000066400000000000000000000046251322470703100172450ustar00rootroot00000000000000/* * Calendar Functions * (C) 1999-2009,2015 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CALENDAR_H_ #define BOTAN_CALENDAR_H_ #include #include #include namespace Botan { /** * Struct representing a particular date and time */ class BOTAN_PUBLIC_API(2,0) calendar_point { public: /** The year */ uint32_t get_year() const { return year; } /** The month, 1 through 12 for Jan to Dec */ uint32_t get_month() const { return month; } /** The day of the month, 1 through 31 (or 28 or 30 based on month */ uint32_t get_day() const { return day; } /** Hour in 24-hour form, 0 to 23 */ uint32_t get_hour() const { return hour; } /** Minutes in the hour, 0 to 60 */ uint32_t get_minutes() const { return minutes; } /** Seconds in the minute, 0 to 60, but might be slightly larger to deal with leap seconds on some systems */ uint32_t get_seconds() const { return seconds; } /** * Initialize a calendar_point * @param y the year * @param mon the month * @param d the day * @param h the hour * @param min the minute * @param sec the second */ calendar_point(uint32_t y, uint32_t mon, uint32_t d, uint32_t h, uint32_t min, uint32_t sec) : year(y), month(mon), day(d), hour(h), minutes(min), seconds(sec) {} /** * Returns an STL timepoint object */ std::chrono::system_clock::time_point to_std_timepoint() const; /** * Returns a human readable string of the struct's components. * Formatting might change over time. Currently it is RFC339 'iso-date-time'. */ std::string to_string() const; /* The member variables are public for historical reasons. Use the get_xxx() functions defined above. These members will be made private in a future major release. */ uint32_t year; uint32_t month; uint32_t day; uint32_t hour; uint32_t minutes; uint32_t seconds; }; /** * Convert a time_point to a calendar_point * @param time_point a time point from the system clock * @return calendar_point object representing this time point */ BOTAN_PUBLIC_API(2,0) calendar_point calendar_value( const std::chrono::system_clock::time_point& time_point); } #endif botan-2.4.0/src/lib/utils/charset.cpp000066400000000000000000000146331322470703100174600ustar00rootroot00000000000000/* * Character Set Handling * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { namespace { void append_utf8_for(std::string& s, uint32_t c) { if(c >= 0xD800 && c < 0xE000) throw Decoding_Error("Invalid Unicode character"); if(c <= 0x7F) { const uint8_t b0 = static_cast(c); s.push_back(static_cast(b0)); } else if(c <= 0x7FF) { const uint8_t b0 = 0xC0 | static_cast(c >> 6); const uint8_t b1 = 0x80 | static_cast(c & 0x3F); s.push_back(static_cast(b0)); s.push_back(static_cast(b1)); } else if(c <= 0xFFFF) { const uint8_t b0 = 0xE0 | static_cast(c >> 12); const uint8_t b1 = 0x80 | static_cast((c >> 6) & 0x3F); const uint8_t b2 = 0x80 | static_cast(c & 0x3F); s.push_back(static_cast(b0)); s.push_back(static_cast(b1)); s.push_back(static_cast(b2)); } else if(c <= 0x10FFFF) { const uint8_t b0 = 0xF0 | static_cast(c >> 18); const uint8_t b1 = 0x80 | static_cast((c >> 12) & 0x3F); const uint8_t b2 = 0x80 | static_cast((c >> 6) & 0x3F); const uint8_t b3 = 0x80 | static_cast(c & 0x3F); s.push_back(static_cast(b0)); s.push_back(static_cast(b1)); s.push_back(static_cast(b2)); s.push_back(static_cast(b3)); } else throw Decoding_Error("Invalid Unicode character"); } } std::string ucs2_to_utf8(const uint8_t ucs2[], size_t len) { if(len % 2 != 0) throw Decoding_Error("Invalid length for UCS-2 string"); const size_t chars = len / 2; std::string s; for(size_t i = 0; i != chars; ++i) { const uint16_t c = load_be(ucs2, i); append_utf8_for(s, c); } return s; } std::string ucs4_to_utf8(const uint8_t ucs4[], size_t len) { if(len % 4 != 0) throw Decoding_Error("Invalid length for UCS-4 string"); const size_t chars = len / 4; std::string s; for(size_t i = 0; i != chars; ++i) { const uint32_t c = load_be(ucs4, i); append_utf8_for(s, c); } return s; } /* * Convert from UTF-8 to ISO 8859-1 */ std::string utf8_to_latin1(const std::string& utf8) { std::string iso8859; size_t position = 0; while(position != utf8.size()) { const uint8_t c1 = static_cast(utf8[position++]); if(c1 <= 0x7F) { iso8859 += static_cast(c1); } else if(c1 >= 0xC0 && c1 <= 0xC7) { if(position == utf8.size()) throw Decoding_Error("UTF-8: sequence truncated"); const uint8_t c2 = static_cast(utf8[position++]); const uint8_t iso_char = ((c1 & 0x07) << 6) | (c2 & 0x3F); if(iso_char <= 0x7F) throw Decoding_Error("UTF-8: sequence longer than needed"); iso8859 += static_cast(iso_char); } else throw Decoding_Error("UTF-8: Unicode chars not in Latin1 used"); } return iso8859; } namespace Charset { namespace { /* * Convert from UCS-2 to ISO 8859-1 */ std::string ucs2_to_latin1(const std::string& ucs2) { if(ucs2.size() % 2 == 1) throw Decoding_Error("UCS-2 string has an odd number of bytes"); std::string latin1; for(size_t i = 0; i != ucs2.size(); i += 2) { const uint8_t c1 = ucs2[i]; const uint8_t c2 = ucs2[i+1]; if(c1 != 0) throw Decoding_Error("UCS-2 has non-Latin1 characters"); latin1 += static_cast(c2); } return latin1; } /* * Convert from ISO 8859-1 to UTF-8 */ std::string latin1_to_utf8(const std::string& iso8859) { std::string utf8; for(size_t i = 0; i != iso8859.size(); ++i) { const uint8_t c = static_cast(iso8859[i]); if(c <= 0x7F) utf8 += static_cast(c); else { utf8 += static_cast((0xC0 | (c >> 6))); utf8 += static_cast((0x80 | (c & 0x3F))); } } return utf8; } } /* * Perform character set transcoding */ std::string transcode(const std::string& str, Character_Set to, Character_Set from) { if(to == LOCAL_CHARSET) to = LATIN1_CHARSET; if(from == LOCAL_CHARSET) from = LATIN1_CHARSET; if(to == from) return str; if(from == LATIN1_CHARSET && to == UTF8_CHARSET) return latin1_to_utf8(str); if(from == UTF8_CHARSET && to == LATIN1_CHARSET) return utf8_to_latin1(str); if(from == UCS2_CHARSET && to == LATIN1_CHARSET) return ucs2_to_latin1(str); throw Invalid_Argument("Unknown transcoding operation from " + std::to_string(from) + " to " + std::to_string(to)); } /* * Check if a character represents a digit */ bool is_digit(char c) { if(c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9') return true; return false; } /* * Check if a character represents whitespace */ bool is_space(char c) { if(c == ' ' || c == '\t' || c == '\n' || c == '\r') return true; return false; } /* * Convert a character to a digit */ uint8_t char2digit(char c) { switch(c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; } throw Invalid_Argument("char2digit: Input is not a digit character"); } /* * Convert a digit to a character */ char digit2char(uint8_t b) { switch(b) { case 0: return '0'; case 1: return '1'; case 2: return '2'; case 3: return '3'; case 4: return '4'; case 5: return '5'; case 6: return '6'; case 7: return '7'; case 8: return '8'; case 9: return '9'; } throw Invalid_Argument("digit2char: Input is not a digit"); } /* * Case-insensitive character comparison */ bool caseless_cmp(char a, char b) { return (std::tolower(static_cast(a)) == std::tolower(static_cast(b))); } } } botan-2.4.0/src/lib/utils/charset.h000066400000000000000000000037061322470703100171240ustar00rootroot00000000000000/* * Character Set Handling * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CHARSET_H_ #define BOTAN_CHARSET_H_ #include #include namespace Botan { /** * Convert a sequence of UCS-2 (big endian) characters to a UTF-8 string * This is used for ASN.1 BMPString type * @param ucs2 the sequence of UCS-2 characters * @param len length of ucs2 in bytes, must be a multiple of 2 */ std::string BOTAN_UNSTABLE_API ucs2_to_utf8(const uint8_t ucs2[], size_t len); /** * Convert a sequence of UCS-4 (big endian) characters to a UTF-8 string * This is used for ASN.1 UniversalString type * @param ucs4 the sequence of UCS-4 characters * @param len length of ucs4 in bytes, must be a multiple of 4 */ std::string BOTAN_UNSTABLE_API ucs4_to_utf8(const uint8_t ucs4[], size_t len); /** * Convert a UTF-8 string to Latin-1 * If a character outside the Latin-1 range is encountered, an exception is thrown. */ std::string BOTAN_UNSTABLE_API utf8_to_latin1(const std::string& utf8); /** * The different charsets (nominally) supported by Botan. */ enum Character_Set { LOCAL_CHARSET, UCS2_CHARSET, UTF8_CHARSET, LATIN1_CHARSET }; namespace Charset { /* * Character set conversion - avoid this. * For specific conversions, use the functions above like * ucs2_to_utf8 and utf8_to_latin1 * * If you need something more complex than that, use a real library * such as iconv, Boost.Locale, or ICU */ std::string BOTAN_PUBLIC_API(2,0) BOTAN_DEPRECATED("Avoid. See comment in header.") transcode(const std::string& str, Character_Set to, Character_Set from); /* * Simple character classifier functions */ bool BOTAN_PUBLIC_API(2,0) is_digit(char c); bool BOTAN_PUBLIC_API(2,0) is_space(char c); bool BOTAN_PUBLIC_API(2,0) caseless_cmp(char x, char y); uint8_t BOTAN_PUBLIC_API(2,0) char2digit(char c); char BOTAN_PUBLIC_API(2,0) digit2char(uint8_t b); } } #endif botan-2.4.0/src/lib/utils/compiler.h000066400000000000000000000107121322470703100173000ustar00rootroot00000000000000/* * Define useful compiler-specific macros * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ /* This header is included in both C++ and C (via ffi.h) and should only contain macro definitions. */ #ifndef BOTAN_UTIL_COMPILER_FLAGS_H_ #define BOTAN_UTIL_COMPILER_FLAGS_H_ /* Should we use GCC-style inline assembler? */ #if !defined(BOTAN_USE_GCC_INLINE_ASM) && (defined(__GNUC__) || defined(__xlc__) || defined(__SUNPRO_CC)) #define BOTAN_USE_GCC_INLINE_ASM 1 #endif /** * Used to annotate API exports which are public and supported. * These APIs will not be broken/removed unless strictly required for * functionality or security, and only in new major versions. * @param maj The major version this public API was released in * @param min The minor version this public API was released in */ #define BOTAN_PUBLIC_API(maj,min) BOTAN_DLL /** * Used to annotate API exports which are public and can be used by * applications if needed, but which are intentionally not documented, * and which may change incompatibly in a future major version. */ #define BOTAN_UNSTABLE_API BOTAN_DLL /** * Used to annotate API exports which are exported but only for the * purposes of testing. They should not be used by applications and * may be removed or changed without notice. */ #define BOTAN_TEST_API BOTAN_DLL /* * Define BOTAN_GCC_VERSION */ #ifdef __GNUC__ #define BOTAN_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__) #else #define BOTAN_GCC_VERSION 0 #endif /* * Define BOTAN_CLANG_VERSION */ #ifdef __clang__ #define BOTAN_CLANG_VERSION (__clang_major__ * 10 + __clang_minor__) #else #define BOTAN_CLANG_VERSION 0 #endif /* * Define special macro when building under MSVC 2013 since there are * many compiler workarounds required for that version. */ #if defined(_MSC_VER) && (_MSC_VER < 1900) #define BOTAN_BUILD_COMPILER_IS_MSVC_2013 #endif /* * Define BOTAN_FUNC_ISA */ #if (defined(__GNUG__) && !defined(__clang__)) || (BOTAN_CLANG_VERSION > 38) #define BOTAN_FUNC_ISA(isa) __attribute__ ((target(isa))) #else #define BOTAN_FUNC_ISA(isa) #endif /* * Define BOTAN_WARN_UNUSED_RESULT */ #if defined(__GNUG__) || defined(__clang__) #define BOTAN_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #else #define BOTAN_WARN_UNUSED_RESULT #endif /* * Define BOTAN_MALLOC_FN */ #if defined(__GNUG__) || defined(__clang__) #define BOTAN_MALLOC_FN __attribute__ ((malloc)) #elif defined(_MSC_VER) #define BOTAN_MALLOC_FN __declspec(restrict) #else #define BOTAN_MALLOC_FN #endif /* * Define BOTAN_DEPRECATED */ #if !defined(BOTAN_NO_DEPRECATED_WARNINGS) #if defined(__clang__) #define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated)) #elif defined(_MSC_VER) #define BOTAN_DEPRECATED(msg) __declspec(deprecated(msg)) #elif defined(__GNUG__) // msg supported since GCC 4.5, earliest we support is 4.8 #define BOTAN_DEPRECATED(msg) __attribute__ ((deprecated(msg))) #endif #endif #if !defined(BOTAN_DEPRECATED) #define BOTAN_DEPRECATED(msg) #endif /* * Define BOTAN_NORETURN */ #if !defined(BOTAN_NORETURN) #if defined (__clang__) || defined (__GNUG__) #define BOTAN_NORETURN __attribute__ ((__noreturn__)) #elif defined (_MSC_VER) #define BOTAN_NORETURN __declspec(noreturn) #else #define BOTAN_NORETURN #endif #endif /* * Define BOTAN_CURRENT_FUNCTION */ #if defined(_MSC_VER) #define BOTAN_CURRENT_FUNCTION __FUNCTION__ #else #define BOTAN_CURRENT_FUNCTION __func__ #endif /* * Define BOTAN_NOEXCEPT (for MSVC 2013) */ #if defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) // noexcept is not supported in VS 2013 #include #define BOTAN_NOEXCEPT _NOEXCEPT #else #define BOTAN_NOEXCEPT noexcept #endif /* * Define BOTAN_ALIGNAS (for MSVC 2013) */ #if defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) #define BOTAN_ALIGNAS(n) /**/ #else #define BOTAN_ALIGNAS(n) alignas(n) #endif /* * Define BOTAN_PARALLEL_FOR */ #if !defined(BOTAN_PARALLEL_FOR) #if defined(BOTAN_TARGET_HAS_OPENMP) #define BOTAN_PARALLEL_FOR _Pragma("omp parallel for") for #else #define BOTAN_PARALLEL_FOR for #endif #endif /* * Define BOTAN_PARALLEL_SIMD_FOR */ #if !defined(BOTAN_PARALLEL_SIMD_FOR) #if defined(BOTAN_TARGET_HAS_OPENMP) #define BOTAN_PARALLEL_SIMD_FOR _Pragma("omp simd") for #elif defined(BOTAN_BUILD_COMPILER_IS_GCC) && (BOTAN_GCC_VERSION >= 490) #define BOTAN_PARALLEL_SIMD_FOR _Pragma("GCC ivdep") for #else #define BOTAN_PARALLEL_SIMD_FOR for #endif #endif #endif botan-2.4.0/src/lib/utils/cpuid/000077500000000000000000000000001322470703100164205ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/cpuid/cpuid.cpp000066400000000000000000000101531322470703100202300ustar00rootroot00000000000000/* * Runtime CPU detection * (C) 2009,2010,2013,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { uint64_t CPUID::g_processor_features = 0; size_t CPUID::g_cache_line_size = BOTAN_TARGET_CPU_DEFAULT_CACHE_LINE_SIZE; CPUID::Endian_status CPUID::g_endian_status = ENDIAN_UNKNOWN; bool CPUID::has_simd_32() { #if defined(BOTAN_TARGET_SUPPORTS_SSE2) return CPUID::has_sse2(); #elif defined(BOTAN_TARGET_SUPPORTS_ALTIVEC) return CPUID::has_altivec(); #elif defined(BOTAN_TARGET_SUPPORTS_NEON) return CPUID::has_neon(); #else return true; #endif } //static std::string CPUID::to_string() { std::vector flags; #define CPUID_PRINT(flag) do { if(has_##flag()) { flags.push_back(#flag); } } while(0) #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) CPUID_PRINT(sse2); CPUID_PRINT(ssse3); CPUID_PRINT(sse41); CPUID_PRINT(sse42); CPUID_PRINT(avx2); CPUID_PRINT(avx512f); CPUID_PRINT(rdtsc); CPUID_PRINT(bmi2); CPUID_PRINT(adx); CPUID_PRINT(aes_ni); CPUID_PRINT(clmul); CPUID_PRINT(rdrand); CPUID_PRINT(rdseed); CPUID_PRINT(intel_sha); #endif #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) CPUID_PRINT(altivec); #endif #if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) CPUID_PRINT(neon); CPUID_PRINT(arm_sha1); CPUID_PRINT(arm_sha2); CPUID_PRINT(arm_aes); CPUID_PRINT(arm_pmull); #endif #undef CPUID_PRINT return string_join(flags, ' '); } //static void CPUID::print(std::ostream& o) { o << "CPUID flags: " << CPUID::to_string() << "\n"; } //static void CPUID::initialize() { g_processor_features = 0; #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) || \ defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) || \ defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) g_processor_features = CPUID::detect_cpu_features(&g_cache_line_size); #endif g_processor_features |= CPUID::CPUID_INITIALIZED_BIT; } //static CPUID::Endian_status CPUID::runtime_check_endian() { // Check runtime endian const uint32_t endian32 = 0x01234567; const uint8_t* e8 = reinterpret_cast(&endian32); Endian_status endian = ENDIAN_UNKNOWN; if(e8[0] == 0x01 && e8[1] == 0x23 && e8[2] == 0x45 && e8[3] == 0x67) { endian = ENDIAN_BIG; } else if(e8[0] == 0x67 && e8[1] == 0x45 && e8[2] == 0x23 && e8[3] == 0x01) { endian = ENDIAN_LITTLE; } else { throw Internal_Error("Unexpected endian at runtime, neither big nor little"); } // If we were compiled with a known endian, verify it matches at runtime #if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) BOTAN_ASSERT(endian == ENDIAN_LITTLE, "Build and runtime endian match"); #elif defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) BOTAN_ASSERT(endian == ENDIAN_BIG, "Build and runtime endian match"); #endif return endian; } std::vector CPUID::bit_from_string(const std::string& tok) { #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) if(tok == "sse2" || tok == "simd") return {Botan::CPUID::CPUID_SSE2_BIT}; if(tok == "ssse3") return {Botan::CPUID::CPUID_SSSE3_BIT}; if(tok == "aesni") return {Botan::CPUID::CPUID_AESNI_BIT}; if(tok == "clmul") return {Botan::CPUID::CPUID_CLMUL_BIT}; if(tok == "avx2") return {Botan::CPUID::CPUID_AVX2_BIT}; if(tok == "sha") return {Botan::CPUID::CPUID_SHA_BIT}; #elif defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) if(tok == "altivec" || tok == "simd") return {Botan::CPUID::CPUID_ALTIVEC_BIT}; #elif defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) if(tok == "neon" || tok == "simd") return {Botan::CPUID::CPUID_ARM_NEON_BIT}; if(tok == "armv8sha1") return {Botan::CPUID::CPUID_ARM_SHA1_BIT}; if(tok == "armv8sha2") return {Botan::CPUID::CPUID_ARM_SHA2_BIT}; if(tok == "armv8aes") return {Botan::CPUID::CPUID_ARM_AES_BIT}; if(tok == "armv8pmull") return {Botan::CPUID::CPUID_ARM_PMULL_BIT}; #else BOTAN_UNUSED(tok); #endif return {}; } } botan-2.4.0/src/lib/utils/cpuid/cpuid.h000066400000000000000000000202611322470703100176760ustar00rootroot00000000000000/* * Runtime CPU detection * (C) 2009,2010,2013,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CPUID_H_ #define BOTAN_CPUID_H_ #include #include #include #include namespace Botan { /** * A class handling runtime CPU feature detection. It is limited to * just the features necessary to implement CPU specific code in Botan, * rather than being a general purpose utility. * * This class supports: * * - x86 features using CPUID. x86 is also the only processor with * accurate cache line detection currently. * * - PowerPC AltiVec detection on Linux, NetBSD, OpenBSD, and Darwin * * - ARM NEON and crypto extensions detection. On Linux and Android * systems which support getauxval, that is used to access CPU * feature information. Otherwise a relatively portable but * thread-unsafe mechanism involving executing probe functions which * catching SIGILL signal is used. */ class BOTAN_PUBLIC_API(2,1) CPUID final { public: /** * Probe the CPU and see what extensions are supported */ static void initialize(); static bool has_simd_32(); /** * Deprecated equivalent to * o << "CPUID flags: " << CPUID::to_string() << "\n"; */ BOTAN_DEPRECATED("Use CPUID::to_string") static void print(std::ostream& o); /** * Return a possibly empty string containing list of known CPU * extensions. Each name will be seperated by a space, and the ordering * will be arbitrary. This list only contains values that are useful to * Botan (for example FMA instructions are not checked). * * Example outputs "sse2 ssse3 rdtsc", "neon arm_aes", "altivec" */ static std::string to_string(); /** * Return a best guess of the cache line size */ static size_t cache_line_size() { if(g_processor_features == 0) { initialize(); } return g_cache_line_size; } static bool is_little_endian() { return endian_status() == ENDIAN_LITTLE; } static bool is_big_endian() { return endian_status() == ENDIAN_BIG; } enum CPUID_bits : uint64_t { #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) // These values have no relation to cpuid bitfields // SIMD instruction sets CPUID_SSE2_BIT = (1ULL << 0), CPUID_SSSE3_BIT = (1ULL << 1), CPUID_SSE41_BIT = (1ULL << 2), CPUID_SSE42_BIT = (1ULL << 3), CPUID_AVX2_BIT = (1ULL << 4), CPUID_AVX512F_BIT = (1ULL << 5), // Misc useful instructions CPUID_RDTSC_BIT = (1ULL << 10), CPUID_BMI2_BIT = (1ULL << 11), CPUID_ADX_BIT = (1ULL << 12), // Crypto-specific ISAs CPUID_AESNI_BIT = (1ULL << 16), CPUID_CLMUL_BIT = (1ULL << 17), CPUID_RDRAND_BIT = (1ULL << 18), CPUID_RDSEED_BIT = (1ULL << 19), CPUID_SHA_BIT = (1ULL << 20), #endif #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) CPUID_ALTIVEC_BIT = (1ULL << 0), #endif #if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) CPUID_ARM_NEON_BIT = (1ULL << 0), CPUID_ARM_AES_BIT = (1ULL << 16), CPUID_ARM_PMULL_BIT = (1ULL << 17), CPUID_ARM_SHA1_BIT = (1ULL << 18), CPUID_ARM_SHA2_BIT = (1ULL << 19), #endif CPUID_INITIALIZED_BIT = (1ULL << 63) }; #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) /** * Check if the processor supports AltiVec/VMX */ static bool has_altivec() { return has_cpuid_bit(CPUID_ALTIVEC_BIT); } #endif #if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) /** * Check if the processor supports NEON SIMD */ static bool has_neon() { return has_cpuid_bit(CPUID_ARM_NEON_BIT); } /** * Check if the processor supports ARMv8 SHA1 */ static bool has_arm_sha1() { return has_cpuid_bit(CPUID_ARM_SHA1_BIT); } /** * Check if the processor supports ARMv8 SHA2 */ static bool has_arm_sha2() { return has_cpuid_bit(CPUID_ARM_SHA2_BIT); } /** * Check if the processor supports ARMv8 AES */ static bool has_arm_aes() { return has_cpuid_bit(CPUID_ARM_AES_BIT); } /** * Check if the processor supports ARMv8 PMULL */ static bool has_arm_pmull() { return has_cpuid_bit(CPUID_ARM_PMULL_BIT); } #endif #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) /** * Check if the processor supports RDTSC */ static bool has_rdtsc() { return has_cpuid_bit(CPUID_RDTSC_BIT); } /** * Check if the processor supports SSE2 */ static bool has_sse2() { return has_cpuid_bit(CPUID_SSE2_BIT); } /** * Check if the processor supports SSSE3 */ static bool has_ssse3() { return has_cpuid_bit(CPUID_SSSE3_BIT); } /** * Check if the processor supports SSE4.1 */ static bool has_sse41() { return has_cpuid_bit(CPUID_SSE41_BIT); } /** * Check if the processor supports SSE4.2 */ static bool has_sse42() { return has_cpuid_bit(CPUID_SSE42_BIT); } /** * Check if the processor supports AVX2 */ static bool has_avx2() { return has_cpuid_bit(CPUID_AVX2_BIT); } /** * Check if the processor supports AVX-512F */ static bool has_avx512f() { return has_cpuid_bit(CPUID_AVX512F_BIT); } /** * Check if the processor supports BMI2 */ static bool has_bmi2() { return has_cpuid_bit(CPUID_BMI2_BIT); } /** * Check if the processor supports AES-NI */ static bool has_aes_ni() { return has_cpuid_bit(CPUID_AESNI_BIT); } /** * Check if the processor supports CLMUL */ static bool has_clmul() { return has_cpuid_bit(CPUID_CLMUL_BIT); } /** * Check if the processor supports Intel SHA extension */ static bool has_intel_sha() { return has_cpuid_bit(CPUID_SHA_BIT); } /** * Check if the processor supports ADX extension */ static bool has_adx() { return has_cpuid_bit(CPUID_ADX_BIT); } /** * Check if the processor supports RDRAND */ static bool has_rdrand() { return has_cpuid_bit(CPUID_RDRAND_BIT); } /** * Check if the processor supports RDSEED */ static bool has_rdseed() { return has_cpuid_bit(CPUID_RDSEED_BIT); } #endif /* * Clear a CPUID bit * Call CPUID::initialize to reset * * This is only exposed for testing, don't use unless you know * what you are doing. */ static void clear_cpuid_bit(CPUID_bits bit) { const uint64_t mask = ~(static_cast(bit)); g_processor_features &= mask; } /* * Don't call this function, use CPUID::has_xxx above * It is only exposed for the tests. */ static bool has_cpuid_bit(CPUID_bits elem) { if(g_processor_features == 0) initialize(); return ((g_processor_features & static_cast(elem)) != 0); } static std::vector bit_from_string(const std::string& tok); private: enum Endian_status : uint32_t { ENDIAN_UNKNOWN = 0x00000000, ENDIAN_BIG = 0x01234567, ENDIAN_LITTLE = 0x67452301, }; #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) || \ defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) || \ defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) static uint64_t detect_cpu_features(size_t* cache_line_size); #endif static Endian_status runtime_check_endian(); static Endian_status endian_status() { if(g_endian_status == ENDIAN_UNKNOWN) { g_endian_status = runtime_check_endian(); } return g_endian_status; } static uint64_t g_processor_features; static size_t g_cache_line_size; static Endian_status g_endian_status; }; } #endif botan-2.4.0/src/lib/utils/cpuid/cpuid_arm.cpp000066400000000000000000000135361322470703100210770ustar00rootroot00000000000000/* * Runtime CPU detection for ARM * (C) 2009,2010,2013,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) #if defined(BOTAN_TARGET_OS_HAS_GETAUXVAL) #include #elif defined(BOTAN_TARGET_OS_IS_IOS) #include #include #else #include #endif #endif namespace Botan { #if defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) #if defined(BOTAN_TARGET_OS_IS_IOS) namespace { uint64_t flags_by_ios_machine_type(const std::string& machine) { /* * This relies on a map of known machine names to features. This * will quickly grow out of date as new products are introduced, but * is apparently the best we can do for iOS. */ struct version_info { std::string name; size_t min_version_neon; size_t min_version_armv8; }; static const version_info min_versions[] = { { "iPhone", 2, 6 }, { "iPad", 1, 4 }, { "iPod", 4, 7 }, { "AppleTV", 2, 5 }, }; if(machine.size() < 3) return 0; auto comma = machine.find(','); // Simulator, or something we don't know about if(comma == std::string::npos) return 0; std::string product = machine.substr(0, comma); size_t version = 0; size_t place = 1; while(product.size() > 1 && ::isdigit(product.back())) { const size_t digit = product.back() - '0'; version += digit * place; place *= 10; product.pop_back(); } if(version == 0) return 0; for(const version_info& info : min_versions) { if(info.name != product) continue; if(version >= info.min_version_armv8) { return CPUID::CPUID_ARM_AES_BIT | CPUID::CPUID_ARM_PMULL_BIT | CPUID::CPUID_ARM_SHA1_BIT | CPUID::CPUID_ARM_SHA2_BIT | CPUID::CPUID_ARM_NEON_BIT; } if(version >= info.min_version_neon) return CPUID::CPUID_ARM_NEON_BIT; } // Some other product we don't know about return 0; } } #endif uint64_t CPUID::detect_cpu_features(size_t* cache_line_size) { uint64_t detected_features = 0; #if defined(BOTAN_TARGET_OS_HAS_GETAUXVAL) /* * On systems with getauxval these bits should normally be defined * in bits/auxv.h but some buggy? glibc installs seem to miss them. * These following values are all fixed, for the Linux ELF format, * so we just hardcode them in ARM_hwcap_bit enum. */ enum ARM_hwcap_bit { #if defined(BOTAN_TARGET_ARCH_IS_ARM32) NEON_bit = (1 << 12), AES_bit = (1 << 0), PMULL_bit = (1 << 1), SHA1_bit = (1 << 2), SHA2_bit = (1 << 3), ARCH_hwcap_neon = 16, // AT_HWCAP ARCH_hwcap_crypto = 26, // AT_HWCAP2 #elif defined(BOTAN_TARGET_ARCH_IS_ARM64) NEON_bit = (1 << 1), AES_bit = (1 << 3), PMULL_bit = (1 << 4), SHA1_bit = (1 << 5), SHA2_bit = (1 << 6), ARCH_hwcap_neon = 16, // AT_HWCAP ARCH_hwcap_crypto = 16, // AT_HWCAP #endif }; #if defined(AT_DCACHEBSIZE) const unsigned long dcache_line = ::getauxval(AT_DCACHEBSIZE); // plausibility check if(dcache_line == 32 || dcache_line == 64 || dcache_line == 128) *cache_line_size = static_cast(dcache_line); #endif const unsigned long hwcap_neon = ::getauxval(ARM_hwcap_bit::ARCH_hwcap_neon); if(hwcap_neon & ARM_hwcap_bit::NEON_bit) detected_features |= CPUID::CPUID_ARM_NEON_BIT; /* On aarch64 this ends up calling getauxval twice with AT_HWCAP It doesn't seem worth optimizing this out, since getauxval is just reading a field in the ELF header. */ const unsigned long hwcap_crypto = ::getauxval(ARM_hwcap_bit::ARCH_hwcap_crypto); if(hwcap_crypto & ARM_hwcap_bit::AES_bit) detected_features |= CPUID::CPUID_ARM_AES_BIT; if(hwcap_crypto & ARM_hwcap_bit::PMULL_bit) detected_features |= CPUID::CPUID_ARM_PMULL_BIT; if(hwcap_crypto & ARM_hwcap_bit::SHA1_bit) detected_features |= CPUID::CPUID_ARM_SHA1_BIT; if(hwcap_crypto & ARM_hwcap_bit::SHA2_bit) detected_features |= CPUID::CPUID_ARM_SHA2_BIT; #elif defined(BOTAN_TARGET_OS_IS_IOS) char machine[64] = { 0 }; size_t size = sizeof(machine) - 1; ::sysctlbyname("hw.machine", machine, &size, nullptr, 0); detected_features = flags_by_ios_machine_type(machine); #elif defined(BOTAN_USE_GCC_INLINE_ASM) && defined(BOTAN_TARGET_ARCH_IS_ARM64) /* No getauxval API available, fall back on probe functions. We only bother with Aarch64 here to simplify the code and because going to extreme contortions to support detect NEON on devices that probably don't support it doesn't seem worthwhile. NEON registers v0-v7 are caller saved in Aarch64 */ auto neon_probe = []() -> int { asm("and v0.16b, v0.16b, v0.16b"); return 1; }; auto aes_probe = []() -> int { asm(".word 0x4e284800"); return 1; }; auto pmull_probe = []() -> int { asm(".word 0x0ee0e000"); return 1; }; auto sha1_probe = []() -> int { asm(".word 0x5e280800"); return 1; }; auto sha2_probe = []() -> int { asm(".word 0x5e282800"); return 1; }; // Only bother running the crypto detection if we found NEON if(OS::run_cpu_instruction_probe(neon_probe) == 1) { detected_features |= CPUID::CPUID_ARM_NEON_BIT; if(OS::run_cpu_instruction_probe(aes_probe) == 1) detected_features |= CPUID::CPUID_ARM_AES_BIT; if(OS::run_cpu_instruction_probe(pmull_probe) == 1) detected_features |= CPUID::CPUID_ARM_PMULL_BIT; if(OS::run_cpu_instruction_probe(sha1_probe) == 1) detected_features |= CPUID::CPUID_ARM_SHA1_BIT; if(OS::run_cpu_instruction_probe(sha2_probe) == 1) detected_features |= CPUID::CPUID_ARM_SHA2_BIT; } #endif return detected_features; } #endif } botan-2.4.0/src/lib/utils/cpuid/cpuid_ppc.cpp000066400000000000000000000044371322470703100211020ustar00rootroot00000000000000/* * Runtime CPU detection for POWER/PowerPC * (C) 2009,2010,2013,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) /* * On Darwin and OpenBSD ppc, use sysctl to detect AltiVec */ #if defined(BOTAN_TARGET_OS_IS_DARWIN) #include #elif defined(BOTAN_TARGET_OS_IS_OPENBSD) #include #include #include #endif #endif namespace Botan { #if defined(BOTAN_TARGET_CPU_IS_PPC_FAMILY) /* * PowerPC specific block: check for AltiVec using either * sysctl or by reading processor version number register. */ uint64_t CPUID::detect_cpu_features(size_t* cache_line_size) { #if defined(BOTAN_TARGET_OS_IS_DARWIN) || defined(BOTAN_TARGET_OS_IS_OPENBSD) // On Darwin/OS X and OpenBSD, use sysctl int sels[2] = { #if defined(BOTAN_TARGET_OS_IS_OPENBSD) CTL_MACHDEP, CPU_ALTIVEC #else CTL_HW, HW_VECTORUNIT #endif }; int vector_type = 0; size_t length = sizeof(vector_type); int error = ::sysctl(sels, 2, &vector_type, &length, NULL, 0); if(error == 0 && vector_type > 0) return CPUID::CPUID_ALTIVEC_BIT; #else /* On PowerPC, MSR 287 is PVR, the Processor Version Number Normally it is only accessible to ring 0, but Linux and NetBSD (others, too, maybe?) will trap and emulate it for us. */ int pvr = OS::run_cpu_instruction_probe([]() -> int { uint32_t pvr = 0; asm volatile("mfspr %0, 287" : "=r" (pvr)); // Top 16 bits suffice to identify the model return static_cast(pvr >> 16); }); if(pvr > 0) { const uint16_t ALTIVEC_PVR[] = { 0x003E, // IBM POWER6 0x003F, // IBM POWER7 0x004A, // IBM POWER7p 0x004D, // IBM POWER8 0x004B, // IBM POWER8E 0x000C, // G4-7400 0x0039, // G5 970 0x003C, // G5 970FX 0x0044, // G5 970MP 0x0070, // Cell PPU 0, // end }; for(size_t i = 0; ALTIVEC_PVR[i]; ++i) { if(pvr == ALTIVEC_PVR[i]) return CPUID::CPUID_ALTIVEC_BIT; } return 0; } // TODO try direct instruction probing #endif return 0; } #endif } botan-2.4.0/src/lib/utils/cpuid/cpuid_x86.cpp000066400000000000000000000126511322470703100207420ustar00rootroot00000000000000/* * Runtime CPU detection for x86 * (C) 2009,2010,2013,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) #if defined(BOTAN_BUILD_COMPILER_IS_MSVC) #include #elif defined(BOTAN_BUILD_COMPILER_IS_INTEL) #include #elif defined(BOTAN_BUILD_COMPILER_IS_GCC) || defined(BOTAN_BUILD_COMPILER_IS_CLANG) #include #endif #endif namespace Botan { #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) uint64_t CPUID::detect_cpu_features(size_t* cache_line_size) { #if defined(BOTAN_BUILD_COMPILER_IS_MSVC) #define X86_CPUID(type, out) do { __cpuid((int*)out, type); } while(0) #define X86_CPUID_SUBLEVEL(type, level, out) do { __cpuidex((int*)out, type, level); } while(0) #elif defined(BOTAN_BUILD_COMPILER_IS_INTEL) #define X86_CPUID(type, out) do { __cpuid(out, type); } while(0) #define X86_CPUID_SUBLEVEL(type, level, out) do { __cpuidex((int*)out, type, level); } while(0) #elif defined(BOTAN_TARGET_ARCH_IS_X86_64) && defined(BOTAN_USE_GCC_INLINE_ASM) #define X86_CPUID(type, out) \ asm("cpuid\n\t" : "=a" (out[0]), "=b" (out[1]), "=c" (out[2]), "=d" (out[3]) \ : "0" (type)) #define X86_CPUID_SUBLEVEL(type, level, out) \ asm("cpuid\n\t" : "=a" (out[0]), "=b" (out[1]), "=c" (out[2]), "=d" (out[3]) \ : "0" (type), "2" (level)) #elif defined(BOTAN_BUILD_COMPILER_IS_GCC) || defined(BOTAN_BUILD_COMPILER_IS_CLANG) #define X86_CPUID(type, out) do { __get_cpuid(type, out, out+1, out+2, out+3); } while(0) #define X86_CPUID_SUBLEVEL(type, level, out) \ do { __cpuid_count(type, level, out[0], out[1], out[2], out[3]); } while(0) #else #warning "No way of calling x86 cpuid instruction for this compiler" #define X86_CPUID(type, out) do { clear_mem(out, 4); } while(0) #define X86_CPUID_SUBLEVEL(type, level, out) do { clear_mem(out, 4); } while(0) #endif uint64_t features_detected = 0; uint32_t cpuid[4] = { 0 }; // CPUID 0: vendor identification, max sublevel X86_CPUID(0, cpuid); const uint32_t max_supported_sublevel = cpuid[0]; const uint32_t INTEL_CPUID[3] = { 0x756E6547, 0x6C65746E, 0x49656E69 }; const uint32_t AMD_CPUID[3] = { 0x68747541, 0x444D4163, 0x69746E65 }; const bool is_intel = same_mem(cpuid + 1, INTEL_CPUID, 3); const bool is_amd = same_mem(cpuid + 1, AMD_CPUID, 3); if(max_supported_sublevel >= 1) { // CPUID 1: feature bits X86_CPUID(1, cpuid); const uint64_t flags0 = (static_cast(cpuid[2]) << 32) | cpuid[3]; enum x86_CPUID_1_bits : uint64_t { RDTSC = (1ULL << 4), SSE2 = (1ULL << 26), CLMUL = (1ULL << 33), SSSE3 = (1ULL << 41), SSE41 = (1ULL << 51), SSE42 = (1ULL << 52), AESNI = (1ULL << 57), RDRAND = (1ULL << 62) }; if(flags0 & x86_CPUID_1_bits::RDTSC) features_detected |= CPUID::CPUID_RDTSC_BIT; if(flags0 & x86_CPUID_1_bits::SSE2) features_detected |= CPUID::CPUID_SSE2_BIT; if(flags0 & x86_CPUID_1_bits::CLMUL) features_detected |= CPUID::CPUID_CLMUL_BIT; if(flags0 & x86_CPUID_1_bits::SSSE3) features_detected |= CPUID::CPUID_SSSE3_BIT; if(flags0 & x86_CPUID_1_bits::SSE41) features_detected |= CPUID::CPUID_SSE41_BIT; if(flags0 & x86_CPUID_1_bits::SSE42) features_detected |= CPUID::CPUID_SSE42_BIT; if(flags0 & x86_CPUID_1_bits::AESNI) features_detected |= CPUID::CPUID_AESNI_BIT; if(flags0 & x86_CPUID_1_bits::RDRAND) features_detected |= CPUID::CPUID_RDRAND_BIT; } if(is_intel) { // Intel cache line size is in cpuid(1) output *cache_line_size = 8 * get_byte(2, cpuid[1]); } else if(is_amd) { // AMD puts it in vendor zone X86_CPUID(0x80000005, cpuid); *cache_line_size = get_byte(3, cpuid[2]); } if(max_supported_sublevel >= 7) { clear_mem(cpuid, 4); X86_CPUID_SUBLEVEL(7, 0, cpuid); enum x86_CPUID_7_bits : uint64_t { AVX2 = (1ULL << 5), BMI2 = (1ULL << 8), AVX512F = (1ULL << 16), RDSEED = (1ULL << 18), ADX = (1ULL << 19), SHA = (1ULL << 29), }; uint64_t flags7 = (static_cast(cpuid[2]) << 32) | cpuid[1]; if(flags7 & x86_CPUID_7_bits::AVX2) features_detected |= CPUID::CPUID_AVX2_BIT; if(flags7 & x86_CPUID_7_bits::BMI2) features_detected |= CPUID::CPUID_BMI2_BIT; if(flags7 & x86_CPUID_7_bits::AVX512F) features_detected |= CPUID::CPUID_AVX512F_BIT; if(flags7 & x86_CPUID_7_bits::RDSEED) features_detected |= CPUID::CPUID_RDSEED_BIT; if(flags7 & x86_CPUID_7_bits::ADX) features_detected |= CPUID::CPUID_ADX_BIT; if(flags7 & x86_CPUID_7_bits::SHA) features_detected |= CPUID::CPUID_SHA_BIT; } #undef X86_CPUID #undef X86_CPUID_SUBLEVEL /* * If we don't have access to CPUID, we can still safely assume that * any x86-64 processor has SSE2 and RDTSC */ #if defined(BOTAN_TARGET_ARCH_IS_X86_64) if(features_detected == 0) { features_detected |= CPUID::CPUID_SSE2_BIT; features_detected |= CPUID::CPUID_RDTSC_BIT; } #endif return features_detected; } #endif } botan-2.4.0/src/lib/utils/cpuid/info.txt000066400000000000000000000001211322470703100201060ustar00rootroot00000000000000 CPUID -> 20170917 cpuid.h botan-2.4.0/src/lib/utils/ct_utils.h000066400000000000000000000110201322470703100173050ustar00rootroot00000000000000/* * Functions for constant time operations on data and testing of * constant time annotations using valgrind. * * For more information about constant time programming see * Wagner, Molnar, et al "The Program Counter Security Model" * * (C) 2010 Falko Strenzke * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TIMING_ATTACK_CM_H_ #define BOTAN_TIMING_ATTACK_CM_H_ #include #include #if defined(BOTAN_HAS_VALGRIND) #include #endif namespace Botan { namespace CT { /** * Use valgrind to mark the contents of memory as being undefined. * Valgrind will accept operations which manipulate undefined values, * but will warn if an undefined value is used to decided a conditional * jump or a load/store address. So if we poison all of our inputs we * can confirm that the operations in question are truly const time * when compiled by whatever compiler is in use. * * Even better, the VALGRIND_MAKE_MEM_* macros work even when the * program is not run under valgrind (though with a few cycles of * overhead, which is unfortunate in final binaries as these * annotations tend to be used in fairly important loops). * * This approach was first used in ctgrind (https://github.com/agl/ctgrind) * but calling the valgrind mecheck API directly works just as well and * doesn't require a custom patched valgrind. */ template inline void poison(const T* p, size_t n) { #if defined(BOTAN_HAS_VALGRIND) VALGRIND_MAKE_MEM_UNDEFINED(p, n * sizeof(T)); #else BOTAN_UNUSED(p); BOTAN_UNUSED(n); #endif } template inline void unpoison(const T* p, size_t n) { #if defined(BOTAN_HAS_VALGRIND) VALGRIND_MAKE_MEM_DEFINED(p, n * sizeof(T)); #else BOTAN_UNUSED(p); BOTAN_UNUSED(n); #endif } template inline void unpoison(T& p) { #if defined(BOTAN_HAS_VALGRIND) VALGRIND_MAKE_MEM_DEFINED(&p, sizeof(T)); #else BOTAN_UNUSED(p); #endif } /* * T should be an unsigned machine integer type * Expand to a mask used for other operations * @param in an integer * @return If n is zero, returns zero. Otherwise * returns a T with all bits set for use as a mask with * select. */ template inline T expand_mask(T x) { T r = x; // First fold r down to a single bit for(size_t i = 1; i != sizeof(T)*8; i *= 2) { r = r | static_cast(r >> i); } r &= 1; r = static_cast(~(r - 1)); return r; } template inline T expand_top_bit(T a) { return expand_mask(a >> (sizeof(T)*8-1)); } template inline T select(T mask, T from0, T from1) { return static_cast((from0 & mask) | (from1 & ~mask)); } template inline ValT val_or_zero(PredT pred_val, ValT val) { return select(CT::expand_mask(pred_val), val, static_cast(0)); } template inline T is_zero(T x) { return static_cast(~expand_mask(x)); } template inline T is_equal(T x, T y) { return is_zero(x ^ y); } template inline T is_less(T a, T b) { return expand_top_bit(a ^ ((a^b) | ((a-b)^a))); } template inline T is_lte(T a, T b) { return CT::is_less(a, b) | CT::is_equal(a, b); } template inline void conditional_copy_mem(T value, T* to, const T* from0, const T* from1, size_t elems) { const T mask = CT::expand_mask(value); for(size_t i = 0; i != elems; ++i) { to[i] = CT::select(mask, from0[i], from1[i]); } } template inline void cond_zero_mem(T cond, T* array, size_t elems) { const T mask = CT::expand_mask(cond); const T zero(0); for(size_t i = 0; i != elems; ++i) { array[i] = CT::select(mask, zero, array[i]); } } inline secure_vector strip_leading_zeros(const uint8_t in[], size_t length) { size_t leading_zeros = 0; uint8_t only_zeros = 0xFF; for(size_t i = 0; i != length; ++i) { only_zeros = only_zeros & CT::is_zero(in[i]); leading_zeros += CT::select(only_zeros, 1, 0); } return secure_vector(in + leading_zeros, in + length); } inline secure_vector strip_leading_zeros(const secure_vector& in) { return strip_leading_zeros(in.data(), in.size()); } } } #endif botan-2.4.0/src/lib/utils/data_src.cpp000066400000000000000000000110701322470703100175770ustar00rootroot00000000000000/* * DataSource * (C) 1999-2007 Jack Lloyd * 2005 Matthew Gregan * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) #include #endif namespace Botan { /* * Read a single byte from the DataSource */ size_t DataSource::read_byte(uint8_t& out) { return read(&out, 1); } /* * Peek a single byte from the DataSource */ size_t DataSource::peek_byte(uint8_t& out) const { return peek(&out, 1, 0); } /* * Discard the next N bytes of the data */ size_t DataSource::discard_next(size_t n) { uint8_t buf[64] = { 0 }; size_t discarded = 0; while(n) { const size_t got = this->read(buf, std::min(n, sizeof(buf))); discarded += got; n -= got; if(got == 0) break; } return discarded; } /* * Read from a memory buffer */ size_t DataSource_Memory::read(uint8_t out[], size_t length) { size_t got = std::min(m_source.size() - m_offset, length); copy_mem(out, m_source.data() + m_offset, got); m_offset += got; return got; } bool DataSource_Memory::check_available(size_t n) { return (n <= (m_source.size() - m_offset)); } /* * Peek into a memory buffer */ size_t DataSource_Memory::peek(uint8_t out[], size_t length, size_t peek_offset) const { const size_t bytes_left = m_source.size() - m_offset; if(peek_offset >= bytes_left) return 0; size_t got = std::min(bytes_left - peek_offset, length); copy_mem(out, &m_source[m_offset + peek_offset], got); return got; } /* * Check if the memory buffer is empty */ bool DataSource_Memory::end_of_data() const { return (m_offset == m_source.size()); } /* * DataSource_Memory Constructor */ DataSource_Memory::DataSource_Memory(const std::string& in) : m_source(cast_char_ptr_to_uint8(in.data()), cast_char_ptr_to_uint8(in.data()) + in.length()), m_offset(0) { } /* * Read from a stream */ size_t DataSource_Stream::read(uint8_t out[], size_t length) { m_source.read(cast_uint8_ptr_to_char(out), length); if(m_source.bad()) throw Stream_IO_Error("DataSource_Stream::read: Source failure"); const size_t got = static_cast(m_source.gcount()); m_total_read += got; return got; } bool DataSource_Stream::check_available(size_t n) { const std::streampos orig_pos = m_source.tellg(); m_source.seekg(0, std::ios::end); const size_t avail = static_cast(m_source.tellg() - orig_pos); m_source.seekg(orig_pos); return (avail >= n); } /* * Peek into a stream */ size_t DataSource_Stream::peek(uint8_t out[], size_t length, size_t offset) const { if(end_of_data()) throw Invalid_State("DataSource_Stream: Cannot peek when out of data"); size_t got = 0; if(offset) { secure_vector buf(offset); m_source.read(cast_uint8_ptr_to_char(buf.data()), buf.size()); if(m_source.bad()) throw Stream_IO_Error("DataSource_Stream::peek: Source failure"); got = static_cast(m_source.gcount()); } if(got == offset) { m_source.read(cast_uint8_ptr_to_char(out), length); if(m_source.bad()) throw Stream_IO_Error("DataSource_Stream::peek: Source failure"); got = static_cast(m_source.gcount()); } if(m_source.eof()) m_source.clear(); m_source.seekg(m_total_read, std::ios::beg); return got; } /* * Check if the stream is empty or in error */ bool DataSource_Stream::end_of_data() const { return (!m_source.good()); } /* * Return a human-readable ID for this stream */ std::string DataSource_Stream::id() const { return m_identifier; } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /* * DataSource_Stream Constructor */ DataSource_Stream::DataSource_Stream(const std::string& path, bool use_binary) : m_identifier(path), m_source_memory(new std::ifstream(path, use_binary ? std::ios::binary : std::ios::in)), m_source(*m_source_memory), m_total_read(0) { if(!m_source.good()) { throw Stream_IO_Error("DataSource: Failure opening file " + path); } } #endif /* * DataSource_Stream Constructor */ DataSource_Stream::DataSource_Stream(std::istream& in, const std::string& name) : m_identifier(name), m_source(in), m_total_read(0) { } DataSource_Stream::~DataSource_Stream() { // for ~unique_ptr } } botan-2.4.0/src/lib/utils/data_src.h000066400000000000000000000124461322470703100172540ustar00rootroot00000000000000/* * DataSource * (C) 1999-2007 Jack Lloyd * 2012 Markus Wanner * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DATA_SRC_H_ #define BOTAN_DATA_SRC_H_ #include #include #include namespace Botan { /** * This class represents an abstract data source object. */ class BOTAN_PUBLIC_API(2,0) DataSource { public: /** * Read from the source. Moves the internal offset so that every * call to read will return a new portion of the source. * * @param out the byte array to write the result to * @param length the length of the byte array out * @return length in bytes that was actually read and put * into out */ virtual size_t read(uint8_t out[], size_t length) BOTAN_WARN_UNUSED_RESULT = 0; virtual bool check_available(size_t n) = 0; /** * Read from the source but do not modify the internal * offset. Consecutive calls to peek() will return portions of * the source starting at the same position. * * @param out the byte array to write the output to * @param length the length of the byte array out * @param peek_offset the offset into the stream to read at * @return length in bytes that was actually read and put * into out */ virtual size_t peek(uint8_t out[], size_t length, size_t peek_offset) const BOTAN_WARN_UNUSED_RESULT = 0; /** * Test whether the source still has data that can be read. * @return true if there is still data to read, false otherwise */ virtual bool end_of_data() const = 0; /** * return the id of this data source * @return std::string representing the id of this data source */ virtual std::string id() const { return ""; } /** * Read one byte. * @param out the byte to read to * @return length in bytes that was actually read and put * into out */ size_t read_byte(uint8_t& out); /** * Peek at one byte. * @param out an output byte * @return length in bytes that was actually read and put * into out */ size_t peek_byte(uint8_t& out) const; /** * Discard the next N bytes of the data * @param N the number of bytes to discard * @return number of bytes actually discarded */ size_t discard_next(size_t N); /** * @return number of bytes read so far. */ virtual size_t get_bytes_read() const = 0; DataSource() = default; virtual ~DataSource() = default; DataSource& operator=(const DataSource&) = delete; DataSource(const DataSource&) = delete; }; /** * This class represents a Memory-Based DataSource */ class BOTAN_PUBLIC_API(2,0) DataSource_Memory final : public DataSource { public: size_t read(uint8_t[], size_t) override; size_t peek(uint8_t[], size_t, size_t) const override; bool check_available(size_t n) override; bool end_of_data() const override; /** * Construct a memory source that reads from a string * @param in the string to read from */ explicit DataSource_Memory(const std::string& in); /** * Construct a memory source that reads from a byte array * @param in the byte array to read from * @param length the length of the byte array */ DataSource_Memory(const uint8_t in[], size_t length) : m_source(in, in + length), m_offset(0) {} /** * Construct a memory source that reads from a secure_vector * @param in the MemoryRegion to read from */ explicit DataSource_Memory(const secure_vector& in) : m_source(in), m_offset(0) {} /** * Construct a memory source that reads from a std::vector * @param in the MemoryRegion to read from */ explicit DataSource_Memory(const std::vector& in) : m_source(in.begin(), in.end()), m_offset(0) {} size_t get_bytes_read() const override { return m_offset; } private: secure_vector m_source; size_t m_offset; }; /** * This class represents a Stream-Based DataSource. */ class BOTAN_PUBLIC_API(2,0) DataSource_Stream final : public DataSource { public: size_t read(uint8_t[], size_t) override; size_t peek(uint8_t[], size_t, size_t) const override; bool check_available(size_t n) override; bool end_of_data() const override; std::string id() const override; DataSource_Stream(std::istream&, const std::string& id = ""); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Construct a Stream-Based DataSource from filesystem path * @param file the path to the file * @param use_binary whether to treat the file as binary or not */ DataSource_Stream(const std::string& file, bool use_binary = false); #endif DataSource_Stream(const DataSource_Stream&) = delete; DataSource_Stream& operator=(const DataSource_Stream&) = delete; ~DataSource_Stream(); size_t get_bytes_read() const override { return m_total_read; } private: const std::string m_identifier; std::unique_ptr m_source_memory; std::istream& m_source; size_t m_total_read; }; } #endif botan-2.4.0/src/lib/utils/database.h000066400000000000000000000036101322470703100172310ustar00rootroot00000000000000/* * SQL database interface * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SQL_DATABASE_H_ #define BOTAN_SQL_DATABASE_H_ #include #include #include #include #include namespace Botan { class BOTAN_PUBLIC_API(2,0) SQL_Database { public: class BOTAN_PUBLIC_API(2,0) SQL_DB_Error final : public Exception { public: explicit SQL_DB_Error(const std::string& what) : Exception("SQL database", what) {} }; class BOTAN_PUBLIC_API(2,0) Statement { public: /* Bind statement parameters */ virtual void bind(int column, const std::string& str) = 0; virtual void bind(int column, size_t i) = 0; virtual void bind(int column, std::chrono::system_clock::time_point time) = 0; virtual void bind(int column, const std::vector& blob) = 0; virtual void bind(int column, const uint8_t* data, size_t len) = 0; /* Get output */ virtual std::pair get_blob(int column) = 0; virtual std::string get_str(int column) = 0; virtual size_t get_size_t(int column) = 0; /* Run to completion */ virtual size_t spin() = 0; /* Maybe update */ virtual bool step() = 0; virtual ~Statement() = default; }; /* * Create a new statement for execution. * Use ?1, ?2, ?3, etc for parameters to set later with bind */ virtual std::shared_ptr new_statement(const std::string& base_sql) const = 0; virtual size_t row_count(const std::string& table_name) = 0; virtual void create_table(const std::string& table_schema) = 0; virtual ~SQL_Database() = default; }; } #endif botan-2.4.0/src/lib/utils/donna128.h000066400000000000000000000060271322470703100170240ustar00rootroot00000000000000/* * A minimal 128-bit integer type for curve25519-donna * (C) 2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CURVE25519_DONNA128_H_ #define BOTAN_CURVE25519_DONNA128_H_ #include namespace Botan { class donna128 final { public: donna128(uint64_t ll = 0, uint64_t hh = 0) { l = ll; h = hh; } donna128(const donna128&) = default; donna128& operator=(const donna128&) = default; friend donna128 operator>>(const donna128& x, size_t shift) { donna128 z = x; if(shift > 0) { const uint64_t carry = z.h << (64 - shift); z.h = (z.h >> shift); z.l = (z.l >> shift) | carry; } return z; } friend donna128 operator<<(const donna128& x, size_t shift) { donna128 z = x; if(shift > 0) { const uint64_t carry = z.l >> (64 - shift); z.l = (z.l << shift); z.h = (z.h << shift) | carry; } return z; } friend uint64_t operator&(const donna128& x, uint64_t mask) { return x.l & mask; } uint64_t operator&=(uint64_t mask) { h = 0; l &= mask; return l; } donna128& operator+=(const donna128& x) { l += x.l; h += x.h; const uint64_t carry = (l < x.l); h += carry; return *this; } donna128& operator+=(uint64_t x) { l += x; const uint64_t carry = (l < x); h += carry; return *this; } uint64_t lo() const { return l; } uint64_t hi() const { return h; } private: uint64_t h = 0, l = 0; }; inline donna128 operator*(const donna128& x, uint64_t y) { BOTAN_ASSERT(x.hi() == 0, "High 64 bits of donna128 set to zero during multiply"); uint64_t lo = 0, hi = 0; mul64x64_128(x.lo(), y, &lo, &hi); return donna128(lo, hi); } inline donna128 operator+(const donna128& x, const donna128& y) { donna128 z = x; z += y; return z; } inline donna128 operator+(const donna128& x, uint64_t y) { donna128 z = x; z += y; return z; } inline donna128 operator|(const donna128& x, const donna128& y) { return donna128(x.lo() | y.lo(), x.hi() | y.hi()); } inline uint64_t carry_shift(const donna128& a, size_t shift) { return (a >> shift).lo(); } inline uint64_t combine_lower(const donna128& a, size_t s1, const donna128& b, size_t s2) { donna128 z = (a >> s1) | (b << s2); return z.lo(); } #if defined(BOTAN_TARGET_HAS_NATIVE_UINT128) inline uint64_t carry_shift(const uint128_t a, size_t shift) { return static_cast(a >> shift); } inline uint64_t combine_lower(const uint128_t a, size_t s1, const uint128_t b, size_t s2) { return static_cast((a >> s1) | (b << s2)); } #endif } #endif botan-2.4.0/src/lib/utils/dyn_load/000077500000000000000000000000001322470703100171055ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/dyn_load/dyn_load.cpp000066400000000000000000000037571322470703100214160ustar00rootroot00000000000000/* * Dynamically Loaded Object * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) #include #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) #define NOMINMAX 1 #define _WINSOCKAPI_ // stop windows.h including winsock.h #include #endif namespace Botan { namespace { void raise_runtime_loader_exception(const std::string& lib_name, const char* msg) { throw Exception("Failed to load " + lib_name + ": " + (msg ? msg : "Unknown error")); } } Dynamically_Loaded_Library::Dynamically_Loaded_Library( const std::string& library) : m_lib_name(library), m_lib(nullptr) { #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) m_lib = ::dlopen(m_lib_name.c_str(), RTLD_LAZY); if(!m_lib) raise_runtime_loader_exception(m_lib_name, ::dlerror()); #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) m_lib = ::LoadLibraryA(m_lib_name.c_str()); if(!m_lib) raise_runtime_loader_exception(m_lib_name, "LoadLibrary failed"); #endif if(!m_lib) raise_runtime_loader_exception(m_lib_name, "Dynamic load not supported"); } Dynamically_Loaded_Library::~Dynamically_Loaded_Library() { #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) ::dlclose(m_lib); #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) ::FreeLibrary((HMODULE)m_lib); #endif } void* Dynamically_Loaded_Library::resolve_symbol(const std::string& symbol) { void* addr = nullptr; #if defined(BOTAN_TARGET_OS_HAS_DLOPEN) addr = ::dlsym(m_lib, symbol.c_str()); #elif defined(BOTAN_TARGET_OS_HAS_LOADLIBRARY) addr = reinterpret_cast(::GetProcAddress((HMODULE)m_lib, symbol.c_str())); #endif if(!addr) throw Exception("Failed to resolve symbol " + symbol + " in " + m_lib_name); return addr; } } botan-2.4.0/src/lib/utils/dyn_load/dyn_load.h000066400000000000000000000034311322470703100210500ustar00rootroot00000000000000/* * Dynamically Loaded Object * (C) 2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DYNAMIC_LOADER_H_ #define BOTAN_DYNAMIC_LOADER_H_ #include #include namespace Botan { /** * Represents a DLL or shared object */ class BOTAN_PUBLIC_API(2,0) Dynamically_Loaded_Library final { public: /** * Load a DLL (or fail with an exception) * @param lib_name name or path to a library * * If you don't use a full path, the search order will be defined * by whatever the system linker does by default. Always using fully * qualified pathnames can help prevent code injection attacks (eg * via manipulation of LD_LIBRARY_PATH on Linux) */ Dynamically_Loaded_Library(const std::string& lib_name); /** * Unload the DLL * @warning Any pointers returned by resolve()/resolve_symbol() * should not be used after this destructor runs. */ ~Dynamically_Loaded_Library(); /** * Load a symbol (or fail with an exception) * @param symbol names the symbol to load * @return address of the loaded symbol */ void* resolve_symbol(const std::string& symbol); /** * Convenience function for casting symbol to the right type * @param symbol names the symbol to load * @return address of the loaded symbol */ template T resolve(const std::string& symbol) { return reinterpret_cast(resolve_symbol(symbol)); } private: Dynamically_Loaded_Library(const Dynamically_Loaded_Library&); Dynamically_Loaded_Library& operator=(const Dynamically_Loaded_Library&); std::string m_lib_name; void* m_lib; }; } #endif botan-2.4.0/src/lib/utils/dyn_load/info.txt000066400000000000000000000003161322470703100206010ustar00rootroot00000000000000 DYNAMIC_LOADER -> 20160310 load_on dep android freebsd linux netbsd openbsd qnx solaris windows darwin android -> dl linux -> dl solaris -> dl darwin -> dl botan-2.4.0/src/lib/utils/exceptn.cpp000066400000000000000000000062731322470703100174760ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { Exception::Exception(const std::string& msg) : m_msg(msg) {} Exception::Exception(const char* prefix, const std::string& msg) : m_msg(std::string(prefix) + " " + msg) {} Invalid_Argument::Invalid_Argument(const std::string& msg) : Exception("Invalid argument", msg) {} Invalid_Argument::Invalid_Argument(const std::string& msg, const std::string& where) : Exception("Invalid argument", msg + " in " + where) {} Lookup_Error::Lookup_Error(const std::string& type, const std::string& algo, const std::string& provider) : Exception("Unavailable " + type + " " + algo + (provider.empty() ? std::string("") : (" for provider " + provider))) {} Internal_Error::Internal_Error(const std::string& err) : Exception("Internal error: " + err) {} Invalid_Key_Length::Invalid_Key_Length(const std::string& name, size_t length) : Invalid_Argument(name + " cannot accept a key of length " + std::to_string(length)) {} Invalid_IV_Length::Invalid_IV_Length(const std::string& mode, size_t bad_len) : Invalid_Argument("IV length " + std::to_string(bad_len) + " is invalid for " + mode) {} Key_Not_Set::Key_Not_Set(const std::string& algo) : Invalid_State("Key not set in " + algo) {} Policy_Violation::Policy_Violation(const std::string& err) : Invalid_State("Policy violation: " + err) {} PRNG_Unseeded::PRNG_Unseeded(const std::string& algo) : Invalid_State("PRNG not seeded: " + algo) {} Algorithm_Not_Found::Algorithm_Not_Found(const std::string& name) : Lookup_Error("Could not find any algorithm named \"" + name + "\"") {} No_Provider_Found::No_Provider_Found(const std::string& name) : Exception("Could not find any provider for algorithm named \"" + name + "\"") {} Provider_Not_Found::Provider_Not_Found(const std::string& algo, const std::string& provider) : Lookup_Error("Could not find provider '" + provider + "' for " + algo) {} Invalid_Algorithm_Name::Invalid_Algorithm_Name(const std::string& name): Invalid_Argument("Invalid algorithm name: " + name) {} Encoding_Error::Encoding_Error(const std::string& name) : Invalid_Argument("Encoding error: " + name) {} Decoding_Error::Decoding_Error(const std::string& name) : Invalid_Argument("Decoding error: " + name) {} Decoding_Error::Decoding_Error(const std::string& name, const char* exception_message) : Invalid_Argument("Decoding error: " + name + " failed with exception " + exception_message) {} Integrity_Failure::Integrity_Failure(const std::string& msg) : Exception("Integrity failure: " + msg) {} Invalid_OID::Invalid_OID(const std::string& oid) : Decoding_Error("Invalid ASN.1 OID: " + oid) {} Stream_IO_Error::Stream_IO_Error(const std::string& err) : Exception("I/O error: " + err) {} Self_Test_Failure::Self_Test_Failure(const std::string& err) : Internal_Error("Self test failed: " + err) {} Not_Implemented::Not_Implemented(const std::string& err) : Exception("Not implemented", err) {} } botan-2.4.0/src/lib/utils/exceptn.h000066400000000000000000000123561322470703100171420ustar00rootroot00000000000000/* * Exceptions * (C) 1999-2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_EXCEPTION_H_ #define BOTAN_EXCEPTION_H_ #include #include #include namespace Botan { /** * Base class for all exceptions thrown by the library */ class BOTAN_PUBLIC_API(2,0) Exception : public std::exception { public: Exception(const char* prefix, const std::string& msg); explicit Exception(const std::string& msg); const char* what() const BOTAN_NOEXCEPT override { return m_msg.c_str(); } private: std::string m_msg; }; /** * An invalid argument */ class BOTAN_PUBLIC_API(2,0) Invalid_Argument : public Exception { public: explicit Invalid_Argument(const std::string& msg); explicit Invalid_Argument(const std::string& msg, const std::string& where); }; #define BOTAN_ARG_CHECK(expr) \ do { if(!(expr)) throw Invalid_Argument(#expr, BOTAN_CURRENT_FUNCTION); } while(0) /** * Unsupported_Argument Exception * * An argument that is invalid because it is not supported by Botan. * It might or might not be valid in another context like a standard. */ class BOTAN_PUBLIC_API(2,0) Unsupported_Argument final : public Invalid_Argument { public: explicit Unsupported_Argument(const std::string& msg) : Invalid_Argument(msg) {} }; /** * Invalid_State Exception */ class BOTAN_PUBLIC_API(2,0) Invalid_State : public Exception { public: explicit Invalid_State(const std::string& err) : Exception(err) {} }; class BOTAN_PUBLIC_API(2,4) Key_Not_Set : public Invalid_State { public: explicit Key_Not_Set(const std::string& algo); }; /** * Lookup_Error Exception */ class BOTAN_PUBLIC_API(2,0) Lookup_Error : public Exception { public: explicit Lookup_Error(const std::string& err) : Exception(err) {} Lookup_Error(const std::string& type, const std::string& algo, const std::string& provider); }; /** * Internal_Error Exception */ class BOTAN_PUBLIC_API(2,0) Internal_Error : public Exception { public: explicit Internal_Error(const std::string& err); }; /** * Invalid_Key_Length Exception */ class BOTAN_PUBLIC_API(2,0) Invalid_Key_Length final : public Invalid_Argument { public: Invalid_Key_Length(const std::string& name, size_t length); }; /** * Invalid_IV_Length Exception */ class BOTAN_PUBLIC_API(2,0) Invalid_IV_Length final : public Invalid_Argument { public: Invalid_IV_Length(const std::string& mode, size_t bad_len); }; /** * PRNG_Unseeded Exception */ class BOTAN_PUBLIC_API(2,0) PRNG_Unseeded final : public Invalid_State { public: explicit PRNG_Unseeded(const std::string& algo); }; /** * Policy_Violation Exception */ class BOTAN_PUBLIC_API(2,0) Policy_Violation final : public Invalid_State { public: BOTAN_DEPRECATED("deprecated") explicit Policy_Violation(const std::string& err); }; /** * Algorithm_Not_Found Exception */ class BOTAN_PUBLIC_API(2,0) Algorithm_Not_Found final : public Lookup_Error { public: explicit Algorithm_Not_Found(const std::string& name); }; /** * No_Provider_Found Exception */ class BOTAN_PUBLIC_API(2,0) No_Provider_Found final : public Exception { public: BOTAN_DEPRECATED("deprecated") explicit No_Provider_Found(const std::string& name); }; /** * Provider_Not_Found is thrown when a specific provider was requested * but that provider is not available. */ class BOTAN_PUBLIC_API(2,0) Provider_Not_Found final : public Lookup_Error { public: Provider_Not_Found(const std::string& algo, const std::string& provider); }; /** * Invalid_Algorithm_Name Exception */ class BOTAN_PUBLIC_API(2,0) Invalid_Algorithm_Name final : public Invalid_Argument { public: explicit Invalid_Algorithm_Name(const std::string& name); }; /** * Encoding_Error Exception */ class BOTAN_PUBLIC_API(2,0) Encoding_Error final : public Invalid_Argument { public: explicit Encoding_Error(const std::string& name); }; /** * Decoding_Error Exception */ class BOTAN_PUBLIC_API(2,0) Decoding_Error : public Invalid_Argument { public: explicit Decoding_Error(const std::string& name); Decoding_Error(const std::string& name, const char* exception_message); }; /** * Integrity_Failure Exception */ class BOTAN_PUBLIC_API(2,0) Integrity_Failure final : public Exception { public: explicit Integrity_Failure(const std::string& msg); }; /** * Invalid_OID Exception */ class BOTAN_PUBLIC_API(2,0) Invalid_OID final : public Decoding_Error { public: explicit Invalid_OID(const std::string& oid); }; /** * Stream_IO_Error Exception */ class BOTAN_PUBLIC_API(2,0) Stream_IO_Error final : public Exception { public: explicit Stream_IO_Error(const std::string& err); }; /** * Self Test Failure Exception */ class BOTAN_PUBLIC_API(2,0) Self_Test_Failure final : public Internal_Error { public: BOTAN_DEPRECATED("deprecated") explicit Self_Test_Failure(const std::string& err); }; /** * Not Implemented Exception */ class BOTAN_PUBLIC_API(2,0) Not_Implemented final : public Exception { public: explicit Not_Implemented(const std::string& err); }; } #endif botan-2.4.0/src/lib/utils/filesystem.cpp000066400000000000000000000107461322470703100202140ustar00rootroot00000000000000/* * (C) 2015,2017 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC) #include #elif defined(BOTAN_HAS_BOOST_FILESYSTEM) #include #elif defined(BOTAN_TARGET_OS_HAS_READDIR) #include #include #include #include #include #include #elif defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) #define NOMINMAX 1 #define _WINSOCKAPI_ // stop windows.h including winsock.h #include #include #include #endif namespace Botan { namespace { #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC) std::vector impl_stl_filesystem(const std::string& dir) { using namespace std::tr2::sys; std::vector out; path p(dir); if (is_directory(p)) { for (recursive_directory_iterator itr(p), end; itr != end; ++itr) { if (is_regular_file(itr->path())) { out.push_back(itr->path().string()); } } } return out; } #elif defined(BOTAN_HAS_BOOST_FILESYSTEM) std::vector impl_boost_filesystem(const std::string& dir_path) { namespace fs = boost::filesystem; std::vector out; for(fs::recursive_directory_iterator dir(dir_path), end; dir != end; ++dir) { if(fs::is_regular_file(dir->path())) { out.push_back(dir->path().string()); } } return out; } #elif defined(BOTAN_TARGET_OS_HAS_READDIR) std::vector impl_readdir(const std::string& dir_path) { std::vector out; std::deque dir_list; dir_list.push_back(dir_path); while(!dir_list.empty()) { const std::string cur_path = dir_list[0]; dir_list.pop_front(); std::unique_ptr> dir(::opendir(cur_path.c_str()), ::closedir); if(dir) { while(struct dirent* dirent = ::readdir(dir.get())) { const std::string filename = dirent->d_name; if(filename == "." || filename == "..") continue; const std::string full_path = cur_path + "/" + filename; struct stat stat_buf; if(::stat(full_path.c_str(), &stat_buf) == -1) continue; if(S_ISDIR(stat_buf.st_mode)) dir_list.push_back(full_path); else if(S_ISREG(stat_buf.st_mode)) out.push_back(full_path); } } } return out; } #elif defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) std::vector impl_win32(const std::string& dir_path) { std::vector out; std::deque dir_list; dir_list.push_back(dir_path); while(!dir_list.empty()) { const std::string cur_path = dir_list[0]; dir_list.pop_front(); WIN32_FIND_DATA find_data; HANDLE dir = ::FindFirstFile((cur_path + "/*").c_str(), &find_data); if(dir != INVALID_HANDLE_VALUE) { do { const std::string filename = find_data.cFileName; if(filename == "." || filename == "..") continue; const std::string full_path = cur_path + "/" + filename; if(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { dir_list.push_back(full_path); } else { out.push_back(full_path); } } while(::FindNextFile(dir, &find_data)); } ::FindClose(dir); } return out; } #endif } std::vector get_files_recursive(const std::string& dir) { std::vector files; #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC) files = impl_stl_filesystem(dir); #elif defined(BOTAN_HAS_BOOST_FILESYSTEM) files = impl_boost_filesystem(dir); #elif defined(BOTAN_TARGET_OS_HAS_READDIR) files = impl_readdir(dir); #elif defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) files = impl_win32(dir); #else BOTAN_UNUSED(dir); throw No_Filesystem_Access(); #endif std::sort(files.begin(), files.end()); return files; } } botan-2.4.0/src/lib/utils/filesystem.h000066400000000000000000000011351322470703100176510ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTIL_FILESYSTEM_H_ #define BOTAN_UTIL_FILESYSTEM_H_ #include #include #include namespace Botan { /** * No_Filesystem_Access Exception */ class BOTAN_PUBLIC_API(2,0) No_Filesystem_Access final : public Exception { public: No_Filesystem_Access() : Exception("No filesystem access enabled.") {} }; BOTAN_TEST_API std::vector get_files_recursive(const std::string& dir); } #endif botan-2.4.0/src/lib/utils/http_util/000077500000000000000000000000001322470703100173305ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/http_util/http_util.cpp000066400000000000000000000164131322470703100220550ustar00rootroot00000000000000/* * Sketchy HTTP client * (C) 2013,2016 Jack Lloyd * 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace HTTP { namespace { /* * Connect to a host, write some bytes, then read until the server * closes the socket. */ std::string http_transact(const std::string& hostname, const std::string& message, std::chrono::milliseconds timeout) { std::unique_ptr socket; const std::chrono::system_clock::time_point start_time = std::chrono::system_clock::now(); try { socket = OS::open_socket(hostname, "http", timeout); if(!socket) throw Exception("No socket support enabled in build"); } catch(std::exception& e) { throw HTTP_Error("HTTP connection to " + hostname + " failed: " + e.what()); } // Blocks until entire message has been written socket->write(cast_char_ptr_to_uint8(message.data()), message.size()); if(std::chrono::system_clock::now() - start_time > timeout) throw HTTP_Error("Timeout during writing message body"); std::ostringstream oss; std::vector buf(BOTAN_DEFAULT_BUFFER_SIZE); while(true) { const size_t got = socket->read(buf.data(), buf.size()); if(got == 0) // EOF break; if(std::chrono::system_clock::now() - start_time > timeout) throw HTTP_Error("Timeout while reading message body"); oss.write(cast_uint8_ptr_to_char(buf.data()), static_cast(got)); } return oss.str(); } } std::string url_encode(const std::string& in) { std::ostringstream out; for(auto c : in) { if(c >= 'A' && c <= 'Z') out << c; else if(c >= 'a' && c <= 'z') out << c; else if(c >= '0' && c <= '9') out << c; else if(c == '-' || c == '_' || c == '.' || c == '~') out << c; else out << '%' << hex_encode(cast_char_ptr_to_uint8(&c), 1); } return out.str(); } std::ostream& operator<<(std::ostream& o, const Response& resp) { o << "HTTP " << resp.status_code() << " " << resp.status_message() << "\n"; for(auto h : resp.headers()) o << "Header '" << h.first << "' = '" << h.second << "'\n"; o << "Body " << std::to_string(resp.body().size()) << " bytes:\n"; o.write(cast_uint8_ptr_to_char(resp.body().data()), resp.body().size()); return o; } Response http_sync(http_exch_fn http_transact, const std::string& verb, const std::string& url, const std::string& content_type, const std::vector& body, size_t allowable_redirects) { if(url.empty()) throw HTTP_Error("URL empty"); const auto protocol_host_sep = url.find("://"); if(protocol_host_sep == std::string::npos) throw HTTP_Error("Invalid URL '" + url + "'"); const auto host_loc_sep = url.find('/', protocol_host_sep + 3); std::string hostname, loc; if(host_loc_sep == std::string::npos) { hostname = url.substr(protocol_host_sep + 3, std::string::npos); loc = "/"; } else { hostname = url.substr(protocol_host_sep + 3, host_loc_sep-protocol_host_sep-3); loc = url.substr(host_loc_sep, std::string::npos); } std::ostringstream outbuf; outbuf << verb << " " << loc << " HTTP/1.0\r\n"; outbuf << "Host: " << hostname << "\r\n"; if(verb == "GET") { outbuf << "Accept: */*\r\n"; outbuf << "Cache-Control: no-cache\r\n"; } else if(verb == "POST") outbuf << "Content-Length: " << body.size() << "\r\n"; if(!content_type.empty()) outbuf << "Content-Type: " << content_type << "\r\n"; outbuf << "Connection: close\r\n\r\n"; outbuf.write(cast_uint8_ptr_to_char(body.data()), body.size()); std::istringstream io(http_transact(hostname, outbuf.str())); std::string line1; std::getline(io, line1); if(!io || line1.empty()) throw HTTP_Error("No response"); std::stringstream response_stream(line1); std::string http_version; unsigned int status_code; std::string status_message; response_stream >> http_version >> status_code; std::getline(response_stream, status_message); if(!response_stream || http_version.substr(0,5) != "HTTP/") throw HTTP_Error("Not an HTTP response"); std::map headers; std::string header_line; while (std::getline(io, header_line) && header_line != "\r") { auto sep = header_line.find(": "); if(sep == std::string::npos || sep > header_line.size() - 2) throw HTTP_Error("Invalid HTTP header " + header_line); const std::string key = header_line.substr(0, sep); if(sep + 2 < header_line.size() - 1) { const std::string val = header_line.substr(sep + 2, (header_line.size() - 1) - (sep + 2)); headers[key] = val; } } if(status_code == 301 && headers.count("Location")) { if(allowable_redirects == 0) throw HTTP_Error("HTTP redirection count exceeded"); return GET_sync(headers["Location"], allowable_redirects - 1); } std::vector resp_body; std::vector buf(4096); while(io.good()) { io.read(cast_uint8_ptr_to_char(buf.data()), buf.size()); resp_body.insert(resp_body.end(), buf.data(), &buf[io.gcount()]); } const std::string header_size = search_map(headers, std::string("Content-Length")); if(!header_size.empty()) { if(resp_body.size() != to_u32bit(header_size)) throw HTTP_Error("Content-Length disagreement, header says " + header_size + " got " + std::to_string(resp_body.size())); } return Response(status_code, status_message, resp_body, headers); } Response http_sync(const std::string& verb, const std::string& url, const std::string& content_type, const std::vector& body, size_t allowable_redirects, std::chrono::milliseconds timeout) { auto transact_with_timeout = [timeout](const std::string& hostname, const std::string& service) { return http_transact(hostname, service, timeout); }; return http_sync( transact_with_timeout, verb, url, content_type, body, allowable_redirects); } Response GET_sync(const std::string& url, size_t allowable_redirects, std::chrono::milliseconds timeout) { return http_sync("GET", url, "", std::vector(), allowable_redirects, timeout); } Response POST_sync(const std::string& url, const std::string& content_type, const std::vector& body, size_t allowable_redirects, std::chrono::milliseconds timeout) { return http_sync("POST", url, content_type, body, allowable_redirects, timeout); } } } botan-2.4.0/src/lib/utils/http_util/http_util.h000066400000000000000000000065321322470703100215230ustar00rootroot00000000000000/* * HTTP utilities * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTILS_URLGET_H_ #define BOTAN_UTILS_URLGET_H_ #include #include #include #include #include #include #include namespace Botan { namespace HTTP { class Response final { public: Response() : m_status_code(0), m_status_message("Uninitialized") {} Response(unsigned int status_code, const std::string& status_message, const std::vector& body, const std::map& headers) : m_status_code(status_code), m_status_message(status_message), m_body(body), m_headers(headers) {} unsigned int status_code() const { return m_status_code; } const std::vector& body() const { return m_body; } const std::map& headers() const { return m_headers; } std::string status_message() const { return m_status_message; } void throw_unless_ok() { if(status_code() != 200) throw Exception("HTTP error: " + status_message()); } private: unsigned int m_status_code; std::string m_status_message; std::vector m_body; std::map m_headers; }; /** * HTTP_Error Exception */ class BOTAN_PUBLIC_API(2,0) HTTP_Error final : public Exception { public: explicit HTTP_Error(const std::string& msg) : Exception("HTTP error " + msg) {} }; BOTAN_PUBLIC_API(2,0) std::ostream& operator<<(std::ostream& o, const Response& resp); typedef std::function http_exch_fn; BOTAN_PUBLIC_API(2,0) Response http_sync(http_exch_fn fn, const std::string& verb, const std::string& url, const std::string& content_type, const std::vector& body, size_t allowable_redirects); BOTAN_PUBLIC_API(2,0) Response http_sync(const std::string& verb, const std::string& url, const std::string& content_type, const std::vector& body, size_t allowable_redirects, std::chrono::milliseconds timeout = std::chrono::milliseconds(3000)); BOTAN_PUBLIC_API(2,0) Response GET_sync(const std::string& url, size_t allowable_redirects = 1, std::chrono::milliseconds timeout = std::chrono::milliseconds(3000)); BOTAN_PUBLIC_API(2,0) Response POST_sync(const std::string& url, const std::string& content_type, const std::vector& body, size_t allowable_redirects = 1, std::chrono::milliseconds timeout = std::chrono::milliseconds(3000)); BOTAN_PUBLIC_API(2,0) std::string url_encode(const std::string& url); } } #endif botan-2.4.0/src/lib/utils/http_util/info.txt000066400000000000000000000001701322470703100210220ustar00rootroot00000000000000 HTTP_UTIL -> 20171003 http_util.h socket botan-2.4.0/src/lib/utils/info.txt000066400000000000000000000007171322470703100170150ustar00rootroot00000000000000 UTIL_FUNCTIONS -> 20171003 load_on always assert.h bswap.h calendar.h charset.h compiler.h data_src.h database.h exceptn.h loadstor.h mem_ops.h mul128.h mutex.h parsing.h rotate.h types.h version.h stl_compatibility.h barrier.h bit_ops.h ct_utils.h donna128.h filesystem.h os_utils.h prefetch.h rounding.h safeint.h semaphore.h stl_util.h cpuid botan-2.4.0/src/lib/utils/loadstor.h000066400000000000000000000427361322470703100173300ustar00rootroot00000000000000/* * Load/Store Operators * (C) 1999-2007,2015,2017 Jack Lloyd * 2007 Yves Jerschow * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_LOAD_STORE_H_ #define BOTAN_LOAD_STORE_H_ #include #include #include #include #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) #define BOTAN_ENDIAN_N2L(x) reverse_bytes(x) #define BOTAN_ENDIAN_L2N(x) reverse_bytes(x) #define BOTAN_ENDIAN_N2B(x) (x) #define BOTAN_ENDIAN_B2N(x) (x) #elif defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) #define BOTAN_ENDIAN_N2L(x) (x) #define BOTAN_ENDIAN_L2N(x) (x) #define BOTAN_ENDIAN_N2B(x) reverse_bytes(x) #define BOTAN_ENDIAN_B2N(x) reverse_bytes(x) #endif namespace Botan { /** * Byte extraction * @param byte_num which byte to extract, 0 == highest byte * @param input the value to extract from * @return byte byte_num of input */ template inline uint8_t get_byte(size_t byte_num, T input) { return static_cast( input >> (((~byte_num)&(sizeof(T)-1)) << 3) ); } /** * Make a uint16_t from two bytes * @param i0 the first byte * @param i1 the second byte * @return i0 || i1 */ inline uint16_t make_uint16(uint8_t i0, uint8_t i1) { return static_cast((static_cast(i0) << 8) | i1); } /** * Make a uint32_t from four bytes * @param i0 the first byte * @param i1 the second byte * @param i2 the third byte * @param i3 the fourth byte * @return i0 || i1 || i2 || i3 */ inline uint32_t make_uint32(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3) { return ((static_cast(i0) << 24) | (static_cast(i1) << 16) | (static_cast(i2) << 8) | (static_cast(i3))); } /** * Make a uint32_t from eight bytes * @param i0 the first byte * @param i1 the second byte * @param i2 the third byte * @param i3 the fourth byte * @param i4 the fifth byte * @param i5 the sixth byte * @param i6 the seventh byte * @param i7 the eighth byte * @return i0 || i1 || i2 || i3 || i4 || i5 || i6 || i7 */ inline uint64_t make_uint64(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3, uint8_t i4, uint8_t i5, uint8_t i6, uint8_t i7) { return ((static_cast(i0) << 56) | (static_cast(i1) << 48) | (static_cast(i2) << 40) | (static_cast(i3) << 32) | (static_cast(i4) << 24) | (static_cast(i5) << 16) | (static_cast(i6) << 8) | (static_cast(i7))); } /** * Load a big-endian word * @param in a pointer to some bytes * @param off an offset into the array * @return off'th T of in, as a big-endian value */ template inline T load_be(const uint8_t in[], size_t off) { in += off * sizeof(T); T out = 0; for(size_t i = 0; i != sizeof(T); ++i) out = static_cast((out << 8) | in[i]); return out; } /** * Load a little-endian word * @param in a pointer to some bytes * @param off an offset into the array * @return off'th T of in, as a litte-endian value */ template inline T load_le(const uint8_t in[], size_t off) { in += off * sizeof(T); T out = 0; for(size_t i = 0; i != sizeof(T); ++i) out = (out << 8) | in[sizeof(T)-1-i]; return out; } /** * Load a big-endian uint16_t * @param in a pointer to some bytes * @param off an offset into the array * @return off'th uint16_t of in, as a big-endian value */ template<> inline uint16_t load_be(const uint8_t in[], size_t off) { in += off * sizeof(uint16_t); #if defined(BOTAN_ENDIAN_N2B) uint16_t x; std::memcpy(&x, in, sizeof(x)); return BOTAN_ENDIAN_N2B(x); #else return make_uint16(in[0], in[1]); #endif } /** * Load a little-endian uint16_t * @param in a pointer to some bytes * @param off an offset into the array * @return off'th uint16_t of in, as a little-endian value */ template<> inline uint16_t load_le(const uint8_t in[], size_t off) { in += off * sizeof(uint16_t); #if defined(BOTAN_ENDIAN_N2L) uint16_t x; std::memcpy(&x, in, sizeof(x)); return BOTAN_ENDIAN_N2L(x); #else return make_uint16(in[1], in[0]); #endif } /** * Load a big-endian uint32_t * @param in a pointer to some bytes * @param off an offset into the array * @return off'th uint32_t of in, as a big-endian value */ template<> inline uint32_t load_be(const uint8_t in[], size_t off) { in += off * sizeof(uint32_t); #if defined(BOTAN_ENDIAN_N2B) uint32_t x; std::memcpy(&x, in, sizeof(x)); return BOTAN_ENDIAN_N2B(x); #else return make_uint32(in[0], in[1], in[2], in[3]); #endif } /** * Load a little-endian uint32_t * @param in a pointer to some bytes * @param off an offset into the array * @return off'th uint32_t of in, as a little-endian value */ template<> inline uint32_t load_le(const uint8_t in[], size_t off) { in += off * sizeof(uint32_t); #if defined(BOTAN_ENDIAN_N2L) uint32_t x; std::memcpy(&x, in, sizeof(x)); return BOTAN_ENDIAN_N2L(x); #else return make_uint32(in[3], in[2], in[1], in[0]); #endif } /** * Load a big-endian uint64_t * @param in a pointer to some bytes * @param off an offset into the array * @return off'th uint64_t of in, as a big-endian value */ template<> inline uint64_t load_be(const uint8_t in[], size_t off) { in += off * sizeof(uint64_t); #if defined(BOTAN_ENDIAN_N2B) uint64_t x; std::memcpy(&x, in, sizeof(x)); return BOTAN_ENDIAN_N2B(x); #else return make_uint64(in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]); #endif } /** * Load a little-endian uint64_t * @param in a pointer to some bytes * @param off an offset into the array * @return off'th uint64_t of in, as a little-endian value */ template<> inline uint64_t load_le(const uint8_t in[], size_t off) { in += off * sizeof(uint64_t); #if defined(BOTAN_ENDIAN_N2L) uint64_t x; std::memcpy(&x, in, sizeof(x)); return BOTAN_ENDIAN_N2L(x); #else return make_uint64(in[7], in[6], in[5], in[4], in[3], in[2], in[1], in[0]); #endif } /** * Load two little-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written */ template inline void load_le(const uint8_t in[], T& x0, T& x1) { x0 = load_le(in, 0); x1 = load_le(in, 1); } /** * Load four little-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written */ template inline void load_le(const uint8_t in[], T& x0, T& x1, T& x2, T& x3) { x0 = load_le(in, 0); x1 = load_le(in, 1); x2 = load_le(in, 2); x3 = load_le(in, 3); } /** * Load eight little-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written * @param x4 where the fifth word will be written * @param x5 where the sixth word will be written * @param x6 where the seventh word will be written * @param x7 where the eighth word will be written */ template inline void load_le(const uint8_t in[], T& x0, T& x1, T& x2, T& x3, T& x4, T& x5, T& x6, T& x7) { x0 = load_le(in, 0); x1 = load_le(in, 1); x2 = load_le(in, 2); x3 = load_le(in, 3); x4 = load_le(in, 4); x5 = load_le(in, 5); x6 = load_le(in, 6); x7 = load_le(in, 7); } /** * Load a variable number of little-endian words * @param out the output array of words * @param in the input array of bytes * @param count how many words are in in */ template inline void load_le(T out[], const uint8_t in[], size_t count) { if(count > 0) { #if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) std::memcpy(out, in, sizeof(T)*count); #elif defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) std::memcpy(out, in, sizeof(T)*count); const size_t blocks = count - (count % 4); const size_t left = count - blocks; for(size_t i = 0; i != blocks; i += 4) bswap_4(out + i); for(size_t i = 0; i != left; ++i) out[blocks+i] = reverse_bytes(out[blocks+i]); #else for(size_t i = 0; i != count; ++i) out[i] = load_le(in, i); #endif } } /** * Load two big-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written */ template inline void load_be(const uint8_t in[], T& x0, T& x1) { x0 = load_be(in, 0); x1 = load_be(in, 1); } /** * Load four big-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written */ template inline void load_be(const uint8_t in[], T& x0, T& x1, T& x2, T& x3) { x0 = load_be(in, 0); x1 = load_be(in, 1); x2 = load_be(in, 2); x3 = load_be(in, 3); } /** * Load eight big-endian words * @param in a pointer to some bytes * @param x0 where the first word will be written * @param x1 where the second word will be written * @param x2 where the third word will be written * @param x3 where the fourth word will be written * @param x4 where the fifth word will be written * @param x5 where the sixth word will be written * @param x6 where the seventh word will be written * @param x7 where the eighth word will be written */ template inline void load_be(const uint8_t in[], T& x0, T& x1, T& x2, T& x3, T& x4, T& x5, T& x6, T& x7) { x0 = load_be(in, 0); x1 = load_be(in, 1); x2 = load_be(in, 2); x3 = load_be(in, 3); x4 = load_be(in, 4); x5 = load_be(in, 5); x6 = load_be(in, 6); x7 = load_be(in, 7); } /** * Load a variable number of big-endian words * @param out the output array of words * @param in the input array of bytes * @param count how many words are in in */ template inline void load_be(T out[], const uint8_t in[], size_t count) { if(count > 0) { #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) std::memcpy(out, in, sizeof(T)*count); #elif defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) std::memcpy(out, in, sizeof(T)*count); const size_t blocks = count - (count % 4); const size_t left = count - blocks; for(size_t i = 0; i != blocks; i += 4) bswap_4(out + i); for(size_t i = 0; i != left; ++i) out[blocks+i] = reverse_bytes(out[blocks+i]); #else for(size_t i = 0; i != count; ++i) out[i] = load_be(in, i); #endif } } /** * Store a big-endian uint16_t * @param in the input uint16_t * @param out the byte array to write to */ inline void store_be(uint16_t in, uint8_t out[2]) { #if defined(BOTAN_ENDIAN_N2B) uint16_t o = BOTAN_ENDIAN_N2B(in); std::memcpy(out, &o, sizeof(o)); #else out[0] = get_byte(0, in); out[1] = get_byte(1, in); #endif } /** * Store a little-endian uint16_t * @param in the input uint16_t * @param out the byte array to write to */ inline void store_le(uint16_t in, uint8_t out[2]) { #if defined(BOTAN_ENDIAN_N2L) uint16_t o = BOTAN_ENDIAN_N2L(in); std::memcpy(out, &o, sizeof(o)); #else out[0] = get_byte(1, in); out[1] = get_byte(0, in); #endif } /** * Store a big-endian uint32_t * @param in the input uint32_t * @param out the byte array to write to */ inline void store_be(uint32_t in, uint8_t out[4]) { #if defined(BOTAN_ENDIAN_B2N) uint32_t o = BOTAN_ENDIAN_B2N(in); std::memcpy(out, &o, sizeof(o)); #else out[0] = get_byte(0, in); out[1] = get_byte(1, in); out[2] = get_byte(2, in); out[3] = get_byte(3, in); #endif } /** * Store a little-endian uint32_t * @param in the input uint32_t * @param out the byte array to write to */ inline void store_le(uint32_t in, uint8_t out[4]) { #if defined(BOTAN_ENDIAN_L2N) uint32_t o = BOTAN_ENDIAN_L2N(in); std::memcpy(out, &o, sizeof(o)); #else out[0] = get_byte(3, in); out[1] = get_byte(2, in); out[2] = get_byte(1, in); out[3] = get_byte(0, in); #endif } /** * Store a big-endian uint64_t * @param in the input uint64_t * @param out the byte array to write to */ inline void store_be(uint64_t in, uint8_t out[8]) { #if defined(BOTAN_ENDIAN_B2N) uint64_t o = BOTAN_ENDIAN_B2N(in); std::memcpy(out, &o, sizeof(o)); #else out[0] = get_byte(0, in); out[1] = get_byte(1, in); out[2] = get_byte(2, in); out[3] = get_byte(3, in); out[4] = get_byte(4, in); out[5] = get_byte(5, in); out[6] = get_byte(6, in); out[7] = get_byte(7, in); #endif } /** * Store a little-endian uint64_t * @param in the input uint64_t * @param out the byte array to write to */ inline void store_le(uint64_t in, uint8_t out[8]) { #if defined(BOTAN_ENDIAN_L2N) uint64_t o = BOTAN_ENDIAN_L2N(in); std::memcpy(out, &o, sizeof(o)); #else out[0] = get_byte(7, in); out[1] = get_byte(6, in); out[2] = get_byte(5, in); out[3] = get_byte(4, in); out[4] = get_byte(3, in); out[5] = get_byte(2, in); out[6] = get_byte(1, in); out[7] = get_byte(0, in); #endif } /** * Store two little-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word */ template inline void store_le(uint8_t out[], T x0, T x1) { store_le(x0, out + (0 * sizeof(T))); store_le(x1, out + (1 * sizeof(T))); } /** * Store two big-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word */ template inline void store_be(uint8_t out[], T x0, T x1) { store_be(x0, out + (0 * sizeof(T))); store_be(x1, out + (1 * sizeof(T))); } /** * Store four little-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word */ template inline void store_le(uint8_t out[], T x0, T x1, T x2, T x3) { store_le(x0, out + (0 * sizeof(T))); store_le(x1, out + (1 * sizeof(T))); store_le(x2, out + (2 * sizeof(T))); store_le(x3, out + (3 * sizeof(T))); } /** * Store four big-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word */ template inline void store_be(uint8_t out[], T x0, T x1, T x2, T x3) { store_be(x0, out + (0 * sizeof(T))); store_be(x1, out + (1 * sizeof(T))); store_be(x2, out + (2 * sizeof(T))); store_be(x3, out + (3 * sizeof(T))); } /** * Store eight little-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word * @param x4 the fifth word * @param x5 the sixth word * @param x6 the seventh word * @param x7 the eighth word */ template inline void store_le(uint8_t out[], T x0, T x1, T x2, T x3, T x4, T x5, T x6, T x7) { store_le(x0, out + (0 * sizeof(T))); store_le(x1, out + (1 * sizeof(T))); store_le(x2, out + (2 * sizeof(T))); store_le(x3, out + (3 * sizeof(T))); store_le(x4, out + (4 * sizeof(T))); store_le(x5, out + (5 * sizeof(T))); store_le(x6, out + (6 * sizeof(T))); store_le(x7, out + (7 * sizeof(T))); } /** * Store eight big-endian words * @param out the output byte array * @param x0 the first word * @param x1 the second word * @param x2 the third word * @param x3 the fourth word * @param x4 the fifth word * @param x5 the sixth word * @param x6 the seventh word * @param x7 the eighth word */ template inline void store_be(uint8_t out[], T x0, T x1, T x2, T x3, T x4, T x5, T x6, T x7) { store_be(x0, out + (0 * sizeof(T))); store_be(x1, out + (1 * sizeof(T))); store_be(x2, out + (2 * sizeof(T))); store_be(x3, out + (3 * sizeof(T))); store_be(x4, out + (4 * sizeof(T))); store_be(x5, out + (5 * sizeof(T))); store_be(x6, out + (6 * sizeof(T))); store_be(x7, out + (7 * sizeof(T))); } template void copy_out_be(uint8_t out[], size_t out_bytes, const T in[]) { while(out_bytes >= sizeof(T)) { store_be(in[0], out); out += sizeof(T); out_bytes -= sizeof(T); in += 1; } for(size_t i = 0; i != out_bytes; ++i) out[i] = get_byte(i%8, in[0]); } template void copy_out_vec_be(uint8_t out[], size_t out_bytes, const std::vector& in) { copy_out_be(out, out_bytes, in.data()); } template void copy_out_le(uint8_t out[], size_t out_bytes, const T in[]) { while(out_bytes >= sizeof(T)) { store_le(in[0], out); out += sizeof(T); out_bytes -= sizeof(T); in += 1; } for(size_t i = 0; i != out_bytes; ++i) out[i] = get_byte(sizeof(T) - 1 - (i % 8), in[0]); } template void copy_out_vec_le(uint8_t out[], size_t out_bytes, const std::vector& in) { copy_out_le(out, out_bytes, in.data()); } } #endif botan-2.4.0/src/lib/utils/locking_allocator/000077500000000000000000000000001322470703100210025ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/locking_allocator/info.txt000066400000000000000000000001441322470703100224750ustar00rootroot00000000000000 LOCKING_ALLOCATOR -> 20131128 linux freebsd openbsd netbsd windows botan-2.4.0/src/lib/utils/locking_allocator/locking_allocator.cpp000066400000000000000000000130751322470703100252020ustar00rootroot00000000000000/* * Mlock Allocator * (C) 2012,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include namespace Botan { namespace { bool ptr_in_pool(const void* pool_ptr, size_t poolsize, const void* buf_ptr, size_t bufsize) { const uintptr_t pool = reinterpret_cast(pool_ptr); const uintptr_t buf = reinterpret_cast(buf_ptr); return (buf >= pool) && (buf + bufsize <= pool + poolsize); } size_t padding_for_alignment(size_t offset, size_t desired_alignment) { size_t mod = offset % desired_alignment; if(mod == 0) return 0; // already right on return desired_alignment - mod; } } void* mlock_allocator::allocate(size_t num_elems, size_t elem_size) { if(!m_pool) return nullptr; const size_t n = num_elems * elem_size; const size_t alignment = 16; if(n / elem_size != num_elems) return nullptr; // overflow! if(n > m_poolsize) return nullptr; if(n < BOTAN_MLOCK_ALLOCATOR_MIN_ALLOCATION || n > BOTAN_MLOCK_ALLOCATOR_MAX_ALLOCATION) return nullptr; lock_guard_type lock(m_mutex); auto best_fit = m_freelist.end(); for(auto i = m_freelist.begin(); i != m_freelist.end(); ++i) { // If we have a perfect fit, use it immediately if(i->second == n && (i->first % alignment) == 0) { const size_t offset = i->first; m_freelist.erase(i); clear_mem(m_pool + offset, n); BOTAN_ASSERT((reinterpret_cast(m_pool) + offset) % alignment == 0, "Returning correctly aligned pointer"); return m_pool + offset; } if((i->second >= (n + padding_for_alignment(i->first, alignment)) && ((best_fit == m_freelist.end()) || (best_fit->second > i->second)))) { best_fit = i; } } if(best_fit != m_freelist.end()) { const size_t offset = best_fit->first; const size_t alignment_padding = padding_for_alignment(offset, alignment); best_fit->first += n + alignment_padding; best_fit->second -= n + alignment_padding; // Need to realign, split the block if(alignment_padding) { /* If we used the entire block except for small piece used for alignment at the beginning, so just update the entry already in place (as it is in the correct location), rather than deleting the empty range and inserting the new one in the same location. */ if(best_fit->second == 0) { best_fit->first = offset; best_fit->second = alignment_padding; } else m_freelist.insert(best_fit, std::make_pair(offset, alignment_padding)); } clear_mem(m_pool + offset + alignment_padding, n); BOTAN_ASSERT((reinterpret_cast(m_pool) + offset + alignment_padding) % alignment == 0, "Returning correctly aligned pointer"); return m_pool + offset + alignment_padding; } return nullptr; } bool mlock_allocator::deallocate(void* p, size_t num_elems, size_t elem_size) BOTAN_NOEXCEPT { if(!m_pool) return false; size_t n = num_elems * elem_size; /* We return nullptr in allocate if there was an overflow, so if an overflow occurs here we know the pointer was not allocated by this pool. */ if(n / elem_size != num_elems) return false; if(!ptr_in_pool(m_pool, m_poolsize, p, n)) return false; std::memset(p, 0, n); lock_guard_type lock(m_mutex); const size_t start = static_cast(p) - m_pool; auto comp = [](std::pair x, std::pair y){ return x.first < y.first; }; auto i = std::lower_bound(m_freelist.begin(), m_freelist.end(), std::make_pair(start, 0), comp); // try to merge with later block if(i != m_freelist.end() && start + n == i->first) { i->first = start; i->second += n; n = 0; } // try to merge with previous block if(i != m_freelist.begin()) { auto prev = std::prev(i); if(prev->first + prev->second == start) { if(n) { prev->second += n; n = 0; } else { // merge adjoining prev->second += i->second; m_freelist.erase(i); } } } if(n != 0) // no merge possible? m_freelist.insert(i, std::make_pair(start, n)); return true; } mlock_allocator::mlock_allocator() { const size_t mem_to_lock = OS::get_memory_locking_limit(); /* TODO: split into multiple single page allocations to help ASLR and guard pages to help reduce the damage of a wild reads or write by the application. */ if(mem_to_lock) { m_pool = static_cast(OS::allocate_locked_pages(mem_to_lock)); if(m_pool != nullptr) { m_poolsize = mem_to_lock; m_freelist.push_back(std::make_pair(0, m_poolsize)); } } } mlock_allocator::~mlock_allocator() { if(m_pool) { secure_scrub_memory(m_pool, m_poolsize); OS::free_locked_pages(m_pool, m_poolsize); m_pool = nullptr; } } mlock_allocator& mlock_allocator::instance() { static mlock_allocator mlock; return mlock; } } botan-2.4.0/src/lib/utils/locking_allocator/locking_allocator.h000066400000000000000000000015571322470703100246510ustar00rootroot00000000000000/* * Mlock Allocator * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MLOCK_ALLOCATOR_H_ #define BOTAN_MLOCK_ALLOCATOR_H_ #include #include #include namespace Botan { class BOTAN_PUBLIC_API(2,0) mlock_allocator final { public: static mlock_allocator& instance(); void* allocate(size_t num_elems, size_t elem_size); bool deallocate(void* p, size_t num_elems, size_t elem_size) BOTAN_NOEXCEPT; mlock_allocator(const mlock_allocator&) = delete; mlock_allocator& operator=(const mlock_allocator&) = delete; private: mlock_allocator(); ~mlock_allocator(); mutex_type m_mutex; std::vector> m_freelist; uint8_t* m_pool = nullptr; size_t m_poolsize = 0; }; } #endif botan-2.4.0/src/lib/utils/mem_ops.cpp000066400000000000000000000022111322470703100174530ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if defined(BOTAN_HAS_LOCKING_ALLOCATOR) #include #endif namespace Botan { BOTAN_MALLOC_FN void* allocate_memory(size_t elems, size_t elem_size) { #if defined(BOTAN_HAS_LOCKING_ALLOCATOR) if(void* p = mlock_allocator::instance().allocate(elems, elem_size)) return p; #endif void* ptr = std::calloc(elems, elem_size); if(!ptr) throw std::bad_alloc(); return ptr; } void deallocate_memory(void* p, size_t elems, size_t elem_size) { if(p == nullptr) return; secure_scrub_memory(p, elems * elem_size); #if defined(BOTAN_HAS_LOCKING_ALLOCATOR) if(mlock_allocator::instance().deallocate(p, elems, elem_size)) return; #endif std::free(p); } bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len) { volatile uint8_t difference = 0; for(size_t i = 0; i != len; ++i) difference |= (x[i] ^ y[i]); return difference == 0; } } botan-2.4.0/src/lib/utils/mem_ops.h000066400000000000000000000153261322470703100171330ustar00rootroot00000000000000/* * Memory Operations * (C) 1999-2009,2012,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_MEMORY_OPS_H_ #define BOTAN_MEMORY_OPS_H_ #include #include #include namespace Botan { /** * Allocate a memory buffer by some method. This should only be used for * primitive types (uint8_t, uint32_t, etc). * * @param elems the number of elements * @param elem_size the size of each element * @return pointer to allocated and zeroed memory, or throw std::bad_alloc on failure */ BOTAN_PUBLIC_API(2,3) BOTAN_MALLOC_FN void* allocate_memory(size_t elems, size_t elem_size); /** * Free a pointer returned by allocate_memory * @param p the pointer returned by allocate_memory * @param elems the number of elements, as passed to allocate_memory * @param elem_size the size of each element, as passed to allocate_memory */ BOTAN_PUBLIC_API(2,3) void deallocate_memory(void* p, size_t elems, size_t elem_size); /** * Scrub memory contents in a way that a compiler should not elide, * using some system specific technique. Note that this function might * not zero the memory (for example, in some hypothetical * implementation it might combine the memory contents with the output * of a system PRNG), but if you can detect any difference in behavior * at runtime then the clearing is side-effecting and you can just * use `clear_mem`. * * Use this function to scrub memory just before deallocating it, or on * a stack buffer before returning from the function. * * @param ptr a pointer to memory to scrub * @param n the number of bytes pointed to by ptr */ BOTAN_PUBLIC_API(2,0) void secure_scrub_memory(void* ptr, size_t n); /** * Memory comparison, input insensitive * @param x a pointer to an array * @param y a pointer to another array * @param len the number of Ts in x and y * @return true iff x[i] == y[i] forall i in [0...n) */ BOTAN_PUBLIC_API(2,3) bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len); /** * Zero out some bytes * @param ptr a pointer to memory to zero * @param bytes the number of bytes to zero in ptr */ inline void clear_bytes(void* ptr, size_t bytes) { if(bytes > 0) { std::memset(ptr, 0, bytes); } } /** * Zero memory before use. This simply calls memset and should not be * used in cases where the compiler cannot see the call as a * side-effecting operation (for example, if calling clear_mem before * deallocating memory, the compiler would be allowed to omit the call * to memset entirely under the as-if rule.) * * @param ptr a pointer to an array of Ts to zero * @param n the number of Ts pointed to by ptr */ template inline void clear_mem(T* ptr, size_t n) { clear_bytes(ptr, sizeof(T)*n); } /** * Copy memory * @param out the destination array * @param in the source array * @param n the number of elements of in/out */ template inline void copy_mem(T* out, const T* in, size_t n) { if(n > 0) { std::memmove(out, in, sizeof(T)*n); } } /** * Set memory to a fixed value * @param ptr a pointer to an array * @param n the number of Ts pointed to by ptr * @param val the value to set each byte to */ template inline void set_mem(T* ptr, size_t n, uint8_t val) { if(n > 0) { std::memset(ptr, val, sizeof(T)*n); } } inline const uint8_t* cast_char_ptr_to_uint8(const char* s) { return reinterpret_cast(s); } inline const char* cast_uint8_ptr_to_char(const uint8_t* b) { return reinterpret_cast(b); } inline uint8_t* cast_char_ptr_to_uint8(char* s) { return reinterpret_cast(s); } inline char* cast_uint8_ptr_to_char(uint8_t* b) { return reinterpret_cast(b); } /** * Memory comparison, input insensitive * @param p1 a pointer to an array * @param p2 a pointer to another array * @param n the number of Ts in p1 and p2 * @return true iff p1[i] == p2[i] forall i in [0...n) */ template inline bool same_mem(const T* p1, const T* p2, size_t n) { volatile T difference = 0; for(size_t i = 0; i != n; ++i) difference |= (p1[i] ^ p2[i]); return difference == 0; } /** * XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length * @param out the input/output buffer * @param in the read-only input buffer * @param length the length of the buffers */ inline void xor_buf(uint8_t out[], const uint8_t in[], size_t length) { while(length >= 16) { uint64_t x0, x1, y0, y1; std::memcpy(&x0, in, 8); std::memcpy(&x1, in + 8, 8); std::memcpy(&y0, out, 8); std::memcpy(&y1, out + 8, 8); y0 ^= x0; y1 ^= x1; std::memcpy(out, &y0, 8); std::memcpy(out + 8, &y1, 8); out += 16; in += 16; length -= 16; } while(length > 0) { out[0] ^= in[0]; out += 1; in += 1; length -= 1; } } /** * XOR arrays. Postcondition out[i] = in[i] ^ in2[i] forall i = 0...length * @param out the output buffer * @param in the first input buffer * @param in2 the second output buffer * @param length the length of the three buffers */ inline void xor_buf(uint8_t out[], const uint8_t in[], const uint8_t in2[], size_t length) { while(length >= 16) { uint64_t x0, x1, y0, y1; std::memcpy(&x0, in, 8); std::memcpy(&x1, in + 8, 8); std::memcpy(&y0, in2, 8); std::memcpy(&y1, in2 + 8, 8); x0 ^= y0; x1 ^= y1; std::memcpy(out, &x0, 8); std::memcpy(out + 8, &x1, 8); out += 16; in += 16; in2 += 16; length -= 16; } for(size_t i = 0; i != length; ++i) out[i] = in[i] ^ in2[i]; } template void xor_buf(std::vector& out, const std::vector& in, size_t n) { xor_buf(out.data(), in.data(), n); } template void xor_buf(std::vector& out, const uint8_t* in, size_t n) { xor_buf(out.data(), in, n); } template void xor_buf(std::vector& out, const uint8_t* in, const std::vector& in2, size_t n) { xor_buf(out.data(), in, in2.data(), n); } template std::vector& operator^=(std::vector& out, const std::vector& in) { if(out.size() < in.size()) out.resize(in.size()); xor_buf(out.data(), in.data(), in.size()); return out; } } #endif botan-2.4.0/src/lib/utils/mul128.h000066400000000000000000000065541322470703100165270ustar00rootroot00000000000000/* * 64x64->128 bit multiply operation * (C) 2013,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTIL_MUL128_H_ #define BOTAN_UTIL_MUL128_H_ #include namespace Botan { #if defined(__SIZEOF_INT128__) && defined(BOTAN_TARGET_CPU_HAS_NATIVE_64BIT) && !defined(__xlc__) #define BOTAN_TARGET_HAS_NATIVE_UINT128 // Prefer TI mode over __int128 as GCC rejects the latter in pendantic mode #if defined(__GNUG__) typedef unsigned int uint128_t __attribute__((mode(TI))); #else typedef unsigned __int128 uint128_t; #endif #endif } #if defined(BOTAN_TARGET_HAS_NATIVE_UINT128) #define BOTAN_FAST_64X64_MUL(a,b,lo,hi) \ do { \ const uint128_t r = static_cast(a) * b; \ *hi = (r >> 64) & 0xFFFFFFFFFFFFFFFF; \ *lo = (r ) & 0xFFFFFFFFFFFFFFFF; \ } while(0) #elif defined(BOTAN_BUILD_COMPILER_IS_MSVC) && defined(BOTAN_TARGET_CPU_HAS_NATIVE_64BIT) #include #pragma intrinsic(_umul128) #define BOTAN_FAST_64X64_MUL(a,b,lo,hi) \ do { *lo = _umul128(a, b, hi); } while(0) #elif defined(BOTAN_USE_GCC_INLINE_ASM) #if defined(BOTAN_TARGET_ARCH_IS_X86_64) #define BOTAN_FAST_64X64_MUL(a,b,lo,hi) do { \ asm("mulq %3" : "=d" (*hi), "=a" (*lo) : "a" (a), "rm" (b) : "cc"); \ } while(0) #elif defined(BOTAN_TARGET_ARCH_IS_ALPHA) #define BOTAN_FAST_64X64_MUL(a,b,lo,hi) do { \ asm("umulh %1,%2,%0" : "=r" (*hi) : "r" (a), "r" (b)); \ *lo = a * b; \ } while(0) #elif defined(BOTAN_TARGET_ARCH_IS_IA64) #define BOTAN_FAST_64X64_MUL(a,b,lo,hi) do { \ asm("xmpy.hu %0=%1,%2" : "=f" (*hi) : "f" (a), "f" (b)); \ *lo = a * b; \ } while(0) #elif defined(BOTAN_TARGET_ARCH_IS_PPC64) #define BOTAN_FAST_64X64_MUL(a,b,lo,hi) do { \ asm("mulhdu %0,%1,%2" : "=r" (*hi) : "r" (a), "r" (b) : "cc"); \ *lo = a * b; \ } while(0) #endif #endif namespace Botan { /** * Perform a 64x64->128 bit multiplication */ inline void mul64x64_128(uint64_t a, uint64_t b, uint64_t* lo, uint64_t* hi) { #if defined(BOTAN_FAST_64X64_MUL) BOTAN_FAST_64X64_MUL(a, b, lo, hi); #else /* * Do a 64x64->128 multiply using four 32x32->64 multiplies plus * some adds and shifts. Last resort for CPUs like UltraSPARC (with * 64-bit registers/ALU, but no 64x64->128 multiply) or 32-bit CPUs. */ const size_t HWORD_BITS = 32; const uint32_t HWORD_MASK = 0xFFFFFFFF; const uint32_t a_hi = (a >> HWORD_BITS); const uint32_t a_lo = (a & HWORD_MASK); const uint32_t b_hi = (b >> HWORD_BITS); const uint32_t b_lo = (b & HWORD_MASK); uint64_t x0 = static_cast(a_hi) * b_hi; uint64_t x1 = static_cast(a_lo) * b_hi; uint64_t x2 = static_cast(a_hi) * b_lo; uint64_t x3 = static_cast(a_lo) * b_lo; // this cannot overflow as (2^32-1)^2 + 2^32-1 < 2^64-1 x2 += x3 >> HWORD_BITS; // this one can overflow x2 += x1; // propagate the carry if any x0 += static_cast(static_cast(x2 < x1)) << HWORD_BITS; *hi = x0 + (x2 >> HWORD_BITS); *lo = ((x2 & HWORD_MASK) << HWORD_BITS) + (x3 & HWORD_MASK); #endif } } #endif botan-2.4.0/src/lib/utils/mutex.h000066400000000000000000000021101322470703100166210ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTIL_MUTEX_H_ #define BOTAN_UTIL_MUTEX_H_ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include namespace Botan { template using lock_guard_type = std::lock_guard; typedef std::mutex mutex_type; } #elif defined(BOTAN_TARGET_OS_TYPE_IS_UNIKERNEL) || defined(BOTAN_TARGET_OS_IS_LLVM) // No threads namespace Botan { template class lock_guard final { public: explicit lock_guard(Mutex& m) : m_mutex(m) { m_mutex.lock(); } ~lock_guard() { m_mutex.unlock(); } lock_guard(const lock_guard& other) = delete; lock_guard& operator=(const lock_guard& other) = delete; private: Mutex& m_mutex; }; class noop_mutex final { public: void lock() {} void unlock() {} }; typedef noop_mutex mutex_type; template using lock_guard_type = lock_guard; } #else #error "Threads unexpectedly disabled in non unikernel build" #endif #endif botan-2.4.0/src/lib/utils/os_utils.cpp000066400000000000000000000263101322470703100176630ustar00rootroot00000000000000/* * OS and machine specific utility functions * (C) 2015,2016,2017 Jack Lloyd * (C) 2016 Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #if defined(BOTAN_TARGET_OS_HAS_EXPLICIT_BZERO) #include #endif #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) #include #include #include #include #include #include #include #elif defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) #define NOMINMAX 1 #include #endif namespace Botan { // Not defined in OS namespace for historical reasons void secure_scrub_memory(void* ptr, size_t n) { #if defined(BOTAN_TARGET_OS_HAS_RTLSECUREZEROMEMORY) ::RtlSecureZeroMemory(ptr, n); #elif defined(BOTAN_TARGET_OS_HAS_EXPLICIT_BZERO) ::explicit_bzero(ptr, n); #elif defined(BOTAN_USE_VOLATILE_MEMSET_FOR_ZERO) && (BOTAN_USE_VOLATILE_MEMSET_FOR_ZERO == 1) /* Call memset through a static volatile pointer, which the compiler should not elide. This construct should be safe in conforming compilers, but who knows. I did confirm that on x86-64 GCC 6.1 and Clang 3.8 both create code that saves the memset address in the data segment and uncondtionally loads and jumps to that address. */ static void* (*const volatile memset_ptr)(void*, int, size_t) = std::memset; (memset_ptr)(ptr, 0, n); #else volatile uint8_t* p = reinterpret_cast(ptr); for(size_t i = 0; i != n; ++i) p[i] = 0; #endif } uint32_t OS::get_process_id() { #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) return ::getpid(); #elif defined(BOTAN_TARGET_OS_IS_WINDOWS) || defined(BOTAN_TARGET_OS_IS_MINGW) return ::GetCurrentProcessId(); #elif defined(BOTAN_TARGET_OS_TYPE_IS_UNIKERNEL) || defined(BOTAN_TARGET_OS_IS_LLVM) return 0; // truly no meaningful value #else #error "Missing get_process_id" #endif } uint64_t OS::get_processor_timestamp() { uint64_t rtc = 0; #if defined(BOTAN_TARGET_OS_HAS_QUERY_PERF_COUNTER) LARGE_INTEGER tv; ::QueryPerformanceCounter(&tv); rtc = tv.QuadPart; #elif defined(BOTAN_USE_GCC_INLINE_ASM) #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) if(CPUID::has_rdtsc()) { uint32_t rtc_low = 0, rtc_high = 0; asm volatile("rdtsc" : "=d" (rtc_high), "=a" (rtc_low)); rtc = (static_cast(rtc_high) << 32) | rtc_low; } #elif defined(BOTAN_TARGET_ARCH_IS_PPC64) uint32_t rtc_low = 0, rtc_high = 0; asm volatile("mftbu %0; mftb %1" : "=r" (rtc_high), "=r" (rtc_low)); /* qemu-ppc seems to not support mftb instr, it always returns zero. If both time bases are 0, assume broken and return another clock. */ if(rtc_high > 0 || rtc_low > 0) { rtc = (static_cast(rtc_high) << 32) | rtc_low; } #elif defined(BOTAN_TARGET_ARCH_IS_ALPHA) asm volatile("rpcc %0" : "=r" (rtc)); // OpenBSD does not trap access to the %tick register #elif defined(BOTAN_TARGET_ARCH_IS_SPARC64) && !defined(BOTAN_TARGET_OS_IS_OPENBSD) asm volatile("rd %%tick, %0" : "=r" (rtc)); #elif defined(BOTAN_TARGET_ARCH_IS_IA64) asm volatile("mov %0=ar.itc" : "=r" (rtc)); #elif defined(BOTAN_TARGET_ARCH_IS_S390X) asm volatile("stck 0(%0)" : : "a" (&rtc) : "memory", "cc"); #elif defined(BOTAN_TARGET_ARCH_IS_HPPA) asm volatile("mfctl 16,%0" : "=r" (rtc)); // 64-bit only? #else //#warning "OS::get_processor_timestamp not implemented" #endif #endif return rtc; } uint64_t OS::get_high_resolution_clock() { if(uint64_t cpu_clock = OS::get_processor_timestamp()) return cpu_clock; /* If we got here either we either don't have an asm instruction above, or (for x86) RDTSC is not available at runtime. Try some clock_gettimes and return the first one that works, or otherwise fall back to std::chrono. */ #if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) // The ordering here is somewhat arbitrary... const clockid_t clock_types[] = { #if defined(CLOCK_MONOTONIC_HR) CLOCK_MONOTONIC_HR, #endif #if defined(CLOCK_MONOTONIC_RAW) CLOCK_MONOTONIC_RAW, #endif #if defined(CLOCK_MONOTONIC) CLOCK_MONOTONIC, #endif #if defined(CLOCK_PROCESS_CPUTIME_ID) CLOCK_PROCESS_CPUTIME_ID, #endif #if defined(CLOCK_THREAD_CPUTIME_ID) CLOCK_THREAD_CPUTIME_ID, #endif }; for(clockid_t clock : clock_types) { struct timespec ts; if(::clock_gettime(clock, &ts) == 0) { return (static_cast(ts.tv_sec) * 1000000000) + static_cast(ts.tv_nsec); } } #endif // Plain C++11 fallback auto now = std::chrono::high_resolution_clock::now().time_since_epoch(); return std::chrono::duration_cast(now).count(); } uint64_t OS::get_system_timestamp_ns() { #if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) struct timespec ts; if(::clock_gettime(CLOCK_REALTIME, &ts) == 0) { return (static_cast(ts.tv_sec) * 1000000000) + static_cast(ts.tv_nsec); } #endif auto now = std::chrono::system_clock::now().time_since_epoch(); return std::chrono::duration_cast(now).count(); } size_t OS::get_memory_locking_limit() { #if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) /* * Linux defaults to only 64 KiB of mlockable memory per process * (too small) but BSDs offer a small fraction of total RAM (more * than we need). Bound the total mlock size to 512 KiB which is * enough to run the entire test suite without spilling to non-mlock * memory (and thus presumably also enough for many useful * programs), but small enough that we should not cause problems * even if many processes are mlocking on the same machine. */ size_t mlock_requested = BOTAN_MLOCK_ALLOCATOR_MAX_LOCKED_KB; /* * Allow override via env variable */ if(const char* env = std::getenv("BOTAN_MLOCK_POOL_SIZE")) { try { const size_t user_req = std::stoul(env, nullptr); mlock_requested = std::min(user_req, mlock_requested); } catch(std::exception&) { /* ignore it */ } } #if defined(RLIMIT_MEMLOCK) if(mlock_requested > 0) { struct ::rlimit limits; ::getrlimit(RLIMIT_MEMLOCK, &limits); if(limits.rlim_cur < limits.rlim_max) { limits.rlim_cur = limits.rlim_max; ::setrlimit(RLIMIT_MEMLOCK, &limits); ::getrlimit(RLIMIT_MEMLOCK, &limits); } return std::min(limits.rlim_cur, mlock_requested * 1024); } #else /* * If RLIMIT_MEMLOCK is not defined, likely the OS does not support * unprivileged mlock calls. */ return 0; #endif #elif defined(BOTAN_TARGET_OS_HAS_VIRTUAL_LOCK) && defined(BOTAN_BUILD_COMPILER_IS_MSVC) SIZE_T working_min = 0, working_max = 0; DWORD working_flags = 0; if(!::GetProcessWorkingSetSizeEx(::GetCurrentProcess(), &working_min, &working_max, &working_flags)) { return 0; } SYSTEM_INFO sSysInfo; ::GetSystemInfo(&sSysInfo); // According to Microsoft MSDN: // The maximum number of pages that a process can lock is equal to the number of pages in its minimum working set minus a small overhead // In the book "Windows Internals Part 2": the maximum lockable pages are minimum working set size - 8 pages // But the information in the book seems to be inaccurate/outdated // I've tested this on Windows 8.1 x64, Windows 10 x64 and Windows 7 x86 // On all three OS the value is 11 instead of 8 size_t overhead = sSysInfo.dwPageSize * 11ULL; if(working_min > overhead) { size_t lockable_bytes = working_min - overhead; if(lockable_bytes < (BOTAN_MLOCK_ALLOCATOR_MAX_LOCKED_KB * 1024ULL)) { return lockable_bytes; } else { return BOTAN_MLOCK_ALLOCATOR_MAX_LOCKED_KB * 1024ULL; } } #endif return 0; } void* OS::allocate_locked_pages(size_t length) { #if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) #if !defined(MAP_NOCORE) #define MAP_NOCORE 0 #endif #if !defined(MAP_ANONYMOUS) #define MAP_ANONYMOUS MAP_ANON #endif void* ptr = ::mmap(nullptr, length, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED | MAP_NOCORE, /*fd*/-1, /*offset*/0); if(ptr == MAP_FAILED) { return nullptr; } #if defined(MADV_DONTDUMP) ::madvise(ptr, length, MADV_DONTDUMP); #endif if(::mlock(ptr, length) != 0) { ::munmap(ptr, length); return nullptr; // failed to lock } ::memset(ptr, 0, length); return ptr; #elif defined BOTAN_TARGET_OS_HAS_VIRTUAL_LOCK LPVOID ptr = ::VirtualAlloc(nullptr, length, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if(!ptr) { return nullptr; } if(::VirtualLock(ptr, length) == 0) { ::VirtualFree(ptr, 0, MEM_RELEASE); return nullptr; // failed to lock } return ptr; #else BOTAN_UNUSED(length); return nullptr; /* not implemented */ #endif } void OS::free_locked_pages(void* ptr, size_t length) { if(ptr == nullptr || length == 0) return; #if defined(BOTAN_TARGET_OS_HAS_POSIX_MLOCK) secure_scrub_memory(ptr, length); ::munlock(ptr, length); ::munmap(ptr, length); #elif defined BOTAN_TARGET_OS_HAS_VIRTUAL_LOCK secure_scrub_memory(ptr, length); ::VirtualUnlock(ptr, length); ::VirtualFree(ptr, 0, MEM_RELEASE); #else // Invalid argument because no way this pointer was allocated by us throw Invalid_Argument("Invalid ptr to free_locked_pages"); #endif } #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) namespace { static ::sigjmp_buf g_sigill_jmp_buf; void botan_sigill_handler(int) { siglongjmp(g_sigill_jmp_buf, /*non-zero return value*/1); } } #endif int OS::run_cpu_instruction_probe(std::function probe_fn) { volatile int probe_result = -3; #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) struct sigaction old_sigaction; struct sigaction sigaction; sigaction.sa_handler = botan_sigill_handler; sigemptyset(&sigaction.sa_mask); sigaction.sa_flags = 0; int rc = ::sigaction(SIGILL, &sigaction, &old_sigaction); if(rc != 0) throw Exception("run_cpu_instruction_probe sigaction failed"); rc = sigsetjmp(g_sigill_jmp_buf, /*save sigs*/1); if(rc == 0) { // first call to sigsetjmp probe_result = probe_fn(); } else if(rc == 1) { // non-local return from siglongjmp in signal handler: return error probe_result = -1; } // Restore old SIGILL handler, if any rc = ::sigaction(SIGILL, &old_sigaction, nullptr); if(rc != 0) throw Exception("run_cpu_instruction_probe sigaction restore failed"); #elif defined(BOTAN_TARGET_OS_IS_WINDOWS) && defined(BOTAN_TARGET_COMPILER_IS_MSVC) // Windows SEH __try { probe_result = probe_fn(); } __except(::GetExceptionCode() == EXCEPTION_ILLEGAL_INSTRUCTION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { probe_result = -1; } #endif return probe_result; } } botan-2.4.0/src/lib/utils/os_utils.h000066400000000000000000000067531322470703100173410ustar00rootroot00000000000000/* * OS specific utility functions * (C) 2015,2016,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OS_UTILS_H_ #define BOTAN_OS_UTILS_H_ #include #include namespace Botan { namespace OS { /* * This header is internal (not installed) and these functions are not * intended to be called by applications. However they are given public * visibility (using BOTAN_TEST_API macro) for the tests. This also probably * allows them to be overridden by the application on ELF systems, but * this hasn't been tested. */ /** * @return process ID assigned by the operating system. * On Unix and Windows systems, this always returns a result * On IncludeOS it returns 0 since there is no process ID to speak of * in a unikernel. */ uint32_t BOTAN_TEST_API get_process_id(); /** * @return CPU processor clock, if available * * On Windows, calls QueryPerformanceCounter. * * Under GCC or Clang on supported platforms the hardware cycle counter is queried. * Currently supported processors are x86, PPC, Alpha, SPARC, IA-64, S/390x, and HP-PA. * If no CPU cycle counter is available on this system, returns zero. */ uint64_t BOTAN_TEST_API get_processor_timestamp(); /* * @return best resolution timestamp available * * The epoch and update rate of this clock is arbitrary and depending * on the hardware it may not tick at a constant rate. * * Uses hardware cycle counter, if available. * On POSIX platforms clock_gettime is used with a monotonic timer * As a final fallback std::chrono::high_resolution_clock is used. */ uint64_t BOTAN_TEST_API get_high_resolution_clock(); /** * @return system clock (reflecting wall clock) with best resolution * available, normalized to nanoseconds resolution. */ uint64_t BOTAN_TEST_API get_system_timestamp_ns(); /** * @return maximum amount of memory (in bytes) Botan could/should * hyptothetically allocate for the memory poool. Reads environment * variable "BOTAN_MLOCK_POOL_SIZE", set to "0" to disable pool. */ size_t get_memory_locking_limit(); /** * Request so many bytes of page-aligned RAM locked into memory using * mlock, VirtualLock, or similar. Returns null on failure. The memory * returned is zeroed. Free it with free_locked_pages. * @param length requested allocation in bytes */ void* allocate_locked_pages(size_t length); /** * Free memory allocated by allocate_locked_pages * @param ptr a pointer returned by allocate_locked_pages * @param length length passed to allocate_locked_pages */ void free_locked_pages(void* ptr, size_t length); /** * Run a probe instruction to test for support for a CPU instruction. * Runs in system-specific env that catches illegal instructions; this * function always fails if the OS doesn't provide this. * Returns value of probe_fn, if it could run. * If error occurs, returns negative number. * This allows probe_fn to indicate errors of its own, if it wants. * For example the instruction might not only be only available on some * CPUs, but also buggy on some subset of these - the probe function * can test to make sure the instruction works properly before * indicating that the instruction is available. * * @warning on Unix systems uses signal handling in a way that is not * thread safe. It should only be called in a single-threaded context * (ie, at static init time). * * If probe_fn throws an exception the result is undefined. * * Return codes: * -1 illegal instruction detected */ int BOTAN_TEST_API run_cpu_instruction_probe(std::function probe_fn); } } #endif botan-2.4.0/src/lib/utils/parsing.cpp000066400000000000000000000240141322470703100174640ustar00rootroot00000000000000/* * Various string utils and parsing functions * (C) 1999-2007,2013,2014,2015 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * (C) 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { uint16_t to_uint16(const std::string& str) { const uint32_t x = to_u32bit(str); if(x >> 16) throw Invalid_Argument("Integer value exceeds 16 bit range"); return static_cast(x); } uint32_t to_u32bit(const std::string& str) { // std::stoul is not strict enough. Ensure that str is digit only [0-9]* for(const char chr : str) { if(chr < '0' || chr > '9') { std::string chrAsString(1, chr); throw Invalid_Argument("String contains non-digit char: " + chrAsString); } } const unsigned long int x = std::stoul(str); if(sizeof(unsigned long int) > 4) { // x might be uint64 if (x > std::numeric_limits::max()) { throw Invalid_Argument("Integer value of " + str + " exceeds 32 bit range"); } } return static_cast(x); } /* * Convert a string into a time duration */ uint32_t timespec_to_u32bit(const std::string& timespec) { if(timespec.empty()) return 0; const char suffix = timespec[timespec.size()-1]; std::string value = timespec.substr(0, timespec.size()-1); uint32_t scale = 1; if(Charset::is_digit(suffix)) value += suffix; else if(suffix == 's') scale = 1; else if(suffix == 'm') scale = 60; else if(suffix == 'h') scale = 60 * 60; else if(suffix == 'd') scale = 24 * 60 * 60; else if(suffix == 'y') scale = 365 * 24 * 60 * 60; else throw Decoding_Error("timespec_to_u32bit: Bad input " + timespec); return scale * to_u32bit(value); } /* * Parse a SCAN-style algorithm name */ std::vector parse_algorithm_name(const std::string& namex) { if(namex.find('(') == std::string::npos && namex.find(')') == std::string::npos) return std::vector(1, namex); std::string name = namex, substring; std::vector elems; size_t level = 0; elems.push_back(name.substr(0, name.find('('))); name = name.substr(name.find('(')); for(auto i = name.begin(); i != name.end(); ++i) { char c = *i; if(c == '(') ++level; if(c == ')') { if(level == 1 && i == name.end() - 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); return elems; } if(level == 0 || (level == 1 && i != name.end() - 1)) throw Invalid_Algorithm_Name(namex); --level; } if(c == ',' && level == 1) { if(elems.size() == 1) elems.push_back(substring.substr(1)); else elems.push_back(substring); substring.clear(); } else substring += c; } if(!substring.empty()) throw Invalid_Algorithm_Name(namex); return elems; } std::vector split_on(const std::string& str, char delim) { return split_on_pred(str, [delim](char c) { return c == delim; }); } std::vector split_on_pred(const std::string& str, std::function pred) { std::vector elems; if(str.empty()) return elems; std::string substr; for(auto i = str.begin(); i != str.end(); ++i) { if(pred(*i)) { if(!substr.empty()) elems.push_back(substr); substr.clear(); } else substr += *i; } if(substr.empty()) throw Invalid_Argument("Unable to split string: " + str); elems.push_back(substr); return elems; } /* * Join a string */ std::string string_join(const std::vector& strs, char delim) { std::string out = ""; for(size_t i = 0; i != strs.size(); ++i) { if(i != 0) out += delim; out += strs[i]; } return out; } /* * Parse an ASN.1 OID string */ std::vector parse_asn1_oid(const std::string& oid) { std::string substring; std::vector oid_elems; for(auto i = oid.begin(); i != oid.end(); ++i) { char c = *i; if(c == '.') { if(substring.empty()) throw Invalid_OID(oid); oid_elems.push_back(to_u32bit(substring)); substring.clear(); } else substring += c; } if(substring.empty()) throw Invalid_OID(oid); oid_elems.push_back(to_u32bit(substring)); if(oid_elems.size() < 2) throw Invalid_OID(oid); return oid_elems; } /* * X.500 String Comparison */ bool x500_name_cmp(const std::string& name1, const std::string& name2) { auto p1 = name1.begin(); auto p2 = name2.begin(); while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; while(p1 != name1.end() && p2 != name2.end()) { if(Charset::is_space(*p1)) { if(!Charset::is_space(*p2)) return false; while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; if(p1 == name1.end() && p2 == name2.end()) return true; if(p1 == name1.end() || p2 == name2.end()) return false; } if(!Charset::caseless_cmp(*p1, *p2)) return false; ++p1; ++p2; } while((p1 != name1.end()) && Charset::is_space(*p1)) ++p1; while((p2 != name2.end()) && Charset::is_space(*p2)) ++p2; if((p1 != name1.end()) || (p2 != name2.end())) return false; return true; } /* * Convert a decimal-dotted string to binary IP */ uint32_t string_to_ipv4(const std::string& str) { std::vector parts = split_on(str, '.'); if(parts.size() != 4) throw Decoding_Error("Invalid IP string " + str); uint32_t ip = 0; for(auto part = parts.begin(); part != parts.end(); ++part) { uint32_t octet = to_u32bit(*part); if(octet > 255) throw Decoding_Error("Invalid IP string " + str); ip = (ip << 8) | (octet & 0xFF); } return ip; } /* * Convert an IP address to decimal-dotted string */ std::string ipv4_to_string(uint32_t ip) { std::string str; for(size_t i = 0; i != sizeof(ip); ++i) { if(i) str += "."; str += std::to_string(get_byte(i, ip)); } return str; } std::string erase_chars(const std::string& str, const std::set& chars) { std::string out; for(auto c: str) if(chars.count(c) == 0) out += c; return out; } std::string replace_chars(const std::string& str, const std::set& chars, char to_char) { std::string out = str; for(size_t i = 0; i != out.size(); ++i) if(chars.count(out[i])) out[i] = to_char; return out; } std::string replace_char(const std::string& str, char from_char, char to_char) { std::string out = str; for(size_t i = 0; i != out.size(); ++i) if(out[i] == from_char) out[i] = to_char; return out; } bool host_wildcard_match(const std::string& issued, const std::string& host) { if(issued == host) { return true; } size_t stars = 0; for(char c : issued) { if(c == '*') stars += 1; } if(stars > 1) { return false; } // first try to match the base, then the left-most label // which can contain exactly one wildcard at any position if(issued.size() > 2) { size_t host_i = host.find('.'); if(host_i == std::string::npos || host_i == host.size() - 1) { return false; } size_t issued_i = issued.find('.'); if(issued_i == std::string::npos || issued_i == issued.size() - 1) { return false; } const std::string host_base = host.substr(host_i + 1); const std::string issued_base = issued.substr(issued_i + 1); // if anything but the left-most label doesn't equal, // we are already out here if(host_base != issued_base) { return false; } // compare the left-most labels std::string host_prefix = host.substr(0, host_i); if(host_prefix.empty()) { return false; } const std::string issued_prefix = issued.substr(0, issued_i); // if split_on would work on strings with less than 2 items, // the if/else block would not be necessary if(issued_prefix == "*") { return true; } std::vector p; if(issued_prefix[0] == '*') { p = std::vector{"", issued_prefix.substr(1, issued_prefix.size())}; } else if(issued_prefix[issued_prefix.size()-1] == '*') { p = std::vector{issued_prefix.substr(0, issued_prefix.size() - 1), ""}; } else { p = split_on(issued_prefix, '*'); } if(p.size() != 2) { return false; } // match anything before and after the wildcard character const std::string first = p[0]; const std::string last = p[1]; if(host_prefix.substr(0, first.size()) == first) { host_prefix.erase(0, first.size()); } // nothing to match anymore if(last.empty()) { return true; } if(host_prefix.size() >= last.size() && host_prefix.substr(host_prefix.size() - last.size(), last.size()) == last) { return true; } } return false; } } botan-2.4.0/src/lib/utils/parsing.h000066400000000000000000000077421322470703100171420ustar00rootroot00000000000000/* * Various string utils and parsing functions * (C) 1999-2007,2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PARSER_H_ #define BOTAN_PARSER_H_ #include #include #include #include #include #include #include namespace Botan { /** * Parse a SCAN-style algorithm name * @param scan_name the name * @return the name components */ BOTAN_PUBLIC_API(2,0) std::vector parse_algorithm_name(const std::string& scan_name); /** * Split a string * @param str the input string * @param delim the delimitor * @return string split by delim */ BOTAN_PUBLIC_API(2,0) std::vector split_on( const std::string& str, char delim); /** * Split a string on a character predicate * @param str the input string * @param pred the predicate */ BOTAN_PUBLIC_API(2,0) std::vector split_on_pred(const std::string& str, std::function pred); /** * Erase characters from a string */ BOTAN_PUBLIC_API(2,0) BOTAN_DEPRECATED("Unused") std::string erase_chars(const std::string& str, const std::set& chars); /** * Replace a character in a string * @param str the input string * @param from_char the character to replace * @param to_char the character to replace it with * @return str with all instances of from_char replaced by to_char */ BOTAN_PUBLIC_API(2,0) BOTAN_DEPRECATED("Unused") std::string replace_char(const std::string& str, char from_char, char to_char); /** * Replace a character in a string * @param str the input string * @param from_chars the characters to replace * @param to_char the character to replace it with * @return str with all instances of from_chars replaced by to_char */ BOTAN_PUBLIC_API(2,0) BOTAN_DEPRECATED("Unused") std::string replace_chars(const std::string& str, const std::set& from_chars, char to_char); /** * Join a string * @param strs strings to join * @param delim the delimitor * @return string joined by delim */ BOTAN_PUBLIC_API(2,0) std::string string_join(const std::vector& strs, char delim); /** * Parse an ASN.1 OID * @param oid the OID in string form * @return OID components */ BOTAN_PUBLIC_API(2,0) std::vector parse_asn1_oid(const std::string& oid); /** * Compare two names using the X.509 comparison algorithm * @param name1 the first name * @param name2 the second name * @return true if name1 is the same as name2 by the X.509 comparison rules */ BOTAN_PUBLIC_API(2,0) bool x500_name_cmp(const std::string& name1, const std::string& name2); /** * Convert a string to a number * @param str the string to convert * @return number value of the string */ BOTAN_PUBLIC_API(2,0) uint32_t to_u32bit(const std::string& str); /** * Convert a string to a number * @param str the string to convert * @return number value of the string */ BOTAN_PUBLIC_API(2,3) uint16_t to_uint16(const std::string& str); /** * Convert a time specification to a number * @param timespec the time specification * @return number of seconds represented by timespec */ BOTAN_PUBLIC_API(2,0) uint32_t BOTAN_DEPRECATED("Not used anymore") timespec_to_u32bit(const std::string& timespec); /** * Convert a string representation of an IPv4 address to a number * @param ip_str the string representation * @return integer IPv4 address */ BOTAN_PUBLIC_API(2,0) uint32_t string_to_ipv4(const std::string& ip_str); /** * Convert an IPv4 address to a string * @param ip_addr the IPv4 address to convert * @return string representation of the IPv4 address */ BOTAN_PUBLIC_API(2,0) std::string ipv4_to_string(uint32_t ip_addr); std::map BOTAN_PUBLIC_API(2,0) read_cfg(std::istream& is); std::string BOTAN_PUBLIC_API(2,0) clean_ws(const std::string& s); bool BOTAN_PUBLIC_API(2,0) host_wildcard_match(const std::string& wildcard, const std::string& host); } #endif botan-2.4.0/src/lib/utils/poly_dbl/000077500000000000000000000000001322470703100171205ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/poly_dbl/info.txt000066400000000000000000000001331322470703100206110ustar00rootroot00000000000000 POLY_DBL -> 20170927 poly_dbl.h botan-2.4.0/src/lib/utils/poly_dbl/poly_dbl.cpp000066400000000000000000000037101322470703100214310ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { namespace { template void poly_double(uint8_t out[], const uint8_t in[]) { uint64_t W[LIMBS]; load_be(W, in, LIMBS); const uint64_t carry = POLY * (W[0] >> 63); for(size_t i = 0; i != LIMBS - 1; ++i) W[i] = (W[i] << 1) ^ (W[i+1] >> 63); W[LIMBS-1] = (W[LIMBS-1] << 1) ^ carry; copy_out_be(out, LIMBS*8, W); } template void poly_double_le(uint8_t out[], const uint8_t in[]) { uint64_t W[LIMBS]; load_le(W, in, LIMBS); const uint64_t carry = POLY * (W[LIMBS-1] >> 63); for(size_t i = 0; i != LIMBS - 1; ++i) W[LIMBS-1-i] = (W[LIMBS-1-i] << 1) ^ (W[LIMBS-2-i] >> 63); W[0] = (W[0] << 1) ^ carry; copy_out_le(out, LIMBS*8, W); } } void poly_double_n(uint8_t out[], const uint8_t in[], size_t n) { switch(n) { case 8: return poly_double<1, 0x1B>(out, in); case 16: return poly_double<2, 0x87>(out, in); case 24: return poly_double<3, 0x87>(out, in); case 32: return poly_double<4, 0x425>(out, in); case 64: return poly_double<8, 0x125>(out, in); default: throw Invalid_Argument("Unsupported size for poly_double_n"); } } void poly_double_n_le(uint8_t out[], const uint8_t in[], size_t n) { switch(n) { case 8: return poly_double_le<1, 0x1B>(out, in); case 16: return poly_double_le<2, 0x87>(out, in); case 24: return poly_double_le<3, 0x87>(out, in); case 32: return poly_double_le<4, 0x425>(out, in); case 64: return poly_double_le<8, 0x125>(out, in); default: throw Invalid_Argument("Unsupported size for poly_double_n_le"); } } } botan-2.4.0/src/lib/utils/poly_dbl/poly_dbl.h000066400000000000000000000013551322470703100211010ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_POLY_DBL_H_ #define BOTAN_POLY_DBL_H_ #include namespace Botan { /** * Polynomial doubling in GF(2^n) */ void BOTAN_PUBLIC_API(2,3) poly_double_n(uint8_t out[], const uint8_t in[], size_t n); /** * Returns true iff poly_double_n is implemented for this size. */ inline bool poly_double_supported_size(size_t n) { return (n == 8 || n == 16 || n == 24 || n == 32 || n == 64); } inline void poly_double_n(uint8_t buf[], size_t n) { return poly_double_n(buf, buf, n); } /* * Little endian convention - used for XTS */ void poly_double_n_le(uint8_t out[], const uint8_t in[], size_t n); } #endif botan-2.4.0/src/lib/utils/prefetch.h000066400000000000000000000014661322470703100172740ustar00rootroot00000000000000/* * Prefetching Operations * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PREFETCH_H_ #define BOTAN_PREFETCH_H_ #include namespace Botan { template inline void prefetch_readonly(const T* addr, size_t length) { #if defined(__GNUG__) const size_t Ts_per_cache_line = CPUID::cache_line_size() / sizeof(T); for(size_t i = 0; i <= length; i += Ts_per_cache_line) __builtin_prefetch(addr + i, 0); #endif } template inline void prefetch_readwrite(const T* addr, size_t length) { #if defined(__GNUG__) const size_t Ts_per_cache_line = CPUID::cache_line_size() / sizeof(T); for(size_t i = 0; i <= length; i += Ts_per_cache_line) __builtin_prefetch(addr + i, 1); #endif } } #endif botan-2.4.0/src/lib/utils/read_cfg.cpp000066400000000000000000000024221322470703100175520ustar00rootroot00000000000000/* * Simple config/test file reader * (C) 2013,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::string clean_ws(const std::string& s) { const char* ws = " \t\n"; auto start = s.find_first_not_of(ws); auto end = s.find_last_not_of(ws); if(start == std::string::npos) return ""; if(end == std::string::npos) return s.substr(start, end); else return s.substr(start, start + end + 1); } std::map read_cfg(std::istream& is) { std::map kv; size_t line = 0; while(is.good()) { std::string s; std::getline(is, s); ++line; if(s.empty() || s[0] == '#') continue; s = clean_ws(s.substr(0, s.find('#'))); if(s.empty()) continue; auto eq = s.find("="); if(eq == std::string::npos || eq == 0 || eq == s.size() - 1) throw Exception("Bad read_cfg input '" + s + "' on line " + std::to_string(line)); const std::string key = clean_ws(s.substr(0, eq)); const std::string val = clean_ws(s.substr(eq + 1, std::string::npos)); kv[key] = val; } return kv; } } botan-2.4.0/src/lib/utils/rotate.h000066400000000000000000000047531322470703100167740ustar00rootroot00000000000000/* * Word Rotation Operations * (C) 1999-2008,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_WORD_ROTATE_H_ #define BOTAN_WORD_ROTATE_H_ #include namespace Botan { /** * Bit rotation left by a compile-time constant amount * @param input the input word * @return input rotated left by ROT bits */ template inline T rotl(T input) { static_assert(ROT > 0 && ROT < 8*sizeof(T), "Invalid rotation constant"); return static_cast((input << ROT) | (input >> (8*sizeof(T) - ROT))); } /** * Bit rotation right by a compile-time constant amount * @param input the input word * @return input rotated right by ROT bits */ template inline T rotr(T input) { static_assert(ROT > 0 && ROT < 8*sizeof(T), "Invalid rotation constant"); return static_cast((input >> ROT) | (input << (8*sizeof(T) - ROT))); } /** * Bit rotation left, variable rotation amount * @param input the input word * @param rot the number of bits to rotate, must be between 0 and sizeof(T)*8-1 * @return input rotated left by rot bits */ template inline T rotl_var(T input, size_t rot) { return rot ? static_cast((input << rot) | (input >> (sizeof(T)*8 - rot))) : input; } /** * Bit rotation right, variable rotation amount * @param input the input word * @param rot the number of bits to rotate, must be between 0 and sizeof(T)*8-1 * @return input rotated right by rot bits */ template inline T rotr_var(T input, size_t rot) { return rot ? static_cast((input >> rot) | (input << (sizeof(T)*8 - rot))) : input; } #if BOTAN_USE_GCC_INLINE_ASM #if defined(BOTAN_TARGET_ARCH_IS_X86_64) || defined(BOTAN_TARGET_ARCH_IS_X86_32) template<> inline uint32_t rotl_var(uint32_t input, size_t rot) { asm("roll %1,%0" : "+r" (input) : "c" (static_cast(rot))); return input; } template<> inline uint32_t rotr_var(uint32_t input, size_t rot) { asm("rorl %1,%0" : "+r" (input) : "c" (static_cast(rot))); return input; } #endif #endif template BOTAN_DEPRECATED("Use rotl or rotl_var") inline T rotate_left(T input, size_t rot) { // rotl_var does not reduce return rotl_var(input, rot % (8 * sizeof(T))); } template BOTAN_DEPRECATED("Use rotr or rotr_var") inline T rotate_right(T input, size_t rot) { // rotr_var does not reduce return rotr_var(input, rot % (8 * sizeof(T))); } } #endif botan-2.4.0/src/lib/utils/rounding.h000066400000000000000000000020411322470703100173070ustar00rootroot00000000000000/* * Integer Rounding Functions * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ROUNDING_H_ #define BOTAN_ROUNDING_H_ #include namespace Botan { /** * Round up * @param n a non-negative integer * @param align_to the alignment boundary * @return n rounded up to a multiple of align_to */ inline size_t round_up(size_t n, size_t align_to) { BOTAN_ASSERT(align_to != 0, "align_to must not be 0"); if(n % align_to) n += align_to - (n % align_to); return n; } /** * Round down * @param n an integer * @param align_to the alignment boundary * @return n rounded down to a multiple of align_to */ template inline T round_down(T n, T align_to) { if(align_to == 0) return n; return (n - (n % align_to)); } /** * Clamp */ inline size_t clamp(size_t n, size_t lower_bound, size_t upper_bound) { if(n < lower_bound) return lower_bound; if(n > upper_bound) return upper_bound; return n; } } #endif botan-2.4.0/src/lib/utils/safeint.h000066400000000000000000000015061322470703100171200ustar00rootroot00000000000000/* * Safe(r) Integer Handling * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTILS_SAFE_INT_H_ #define BOTAN_UTILS_SAFE_INT_H_ #include #include namespace Botan { class Integer_Overflow_Detected final : public Exception { public: Integer_Overflow_Detected(const std::string& file, int line) : Exception("Integer overflow detected at " + file + ":" + std::to_string(line)) {} }; inline size_t checked_add(size_t x, size_t y, const char* file, int line) { // TODO: use __builtin_x_overflow on GCC and Clang size_t z = x + y; if(z < x) { throw Integer_Overflow_Detected(file, line); } return z; } #define BOTAN_CHECKED_ADD(x,y) checked_add(x,y,__FILE__,__LINE__) } #endif botan-2.4.0/src/lib/utils/semaphore.cpp000066400000000000000000000013671322470703100200120ustar00rootroot00000000000000/* * Semaphore * (C) 2013 Joel Low * * Botan is released under the Simplified BSD License (see license.txt) */ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) // Based on code by Pierre Gaston (http://p9as.blogspot.com/2012/06/c11-semaphores.html) namespace Botan { void Semaphore::release(size_t n) { for(size_t i = 0; i != n; ++i) { lock_guard_type lock(m_mutex); if(m_value++ < 0) { ++m_wakeups; m_cond.notify_one(); } } } void Semaphore::acquire() { std::unique_lock lock(m_mutex); if(m_value-- <= 0) { m_cond.wait(lock, [this] { return m_wakeups > 0; }); --m_wakeups; } } } #endif botan-2.4.0/src/lib/utils/semaphore.h000066400000000000000000000012051322470703100174460ustar00rootroot00000000000000/* * Semaphore * (C) 2013 Joel Low * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SEMAPHORE_H_ #define BOTAN_SEMAPHORE_H_ #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) #include #endif namespace Botan { #if defined(BOTAN_TARGET_OS_HAS_THREADS) class Semaphore final { public: explicit Semaphore(int value = 0) : m_value(value), m_wakeups(0) {} void acquire(); void release(size_t n = 1); private: int m_value; int m_wakeups; mutex_type m_mutex; std::condition_variable m_cond; }; #endif } #endif botan-2.4.0/src/lib/utils/simd/000077500000000000000000000000001322470703100162505ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/simd/info.txt000066400000000000000000000001311322470703100177370ustar00rootroot00000000000000 SIMD_32 -> 20131128 simd_32.h botan-2.4.0/src/lib/utils/simd/simd_32.h000066400000000000000000000514131322470703100176650ustar00rootroot00000000000000/* * Lightweight wrappers for SIMD operations * (C) 2009,2011,2016,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SIMD_32_H_ #define BOTAN_SIMD_32_H_ #include #include #include #include #if defined(BOTAN_TARGET_SUPPORTS_SSE2) #include #define BOTAN_SIMD_USE_SSE2 #elif defined(BOTAN_TARGET_SUPPORTS_ALTIVEC) #include #undef vector #undef bool #define BOTAN_SIMD_USE_ALTIVEC #elif defined(BOTAN_TARGET_SUPPORTS_NEON) #include #define BOTAN_SIMD_USE_NEON #endif namespace Botan { /** * 4x32 bit SIMD register * * This class is not a general purpose SIMD type, and only offers * instructions needed for evaluation of specific crypto primitives. * For example it does not currently have equality operators of any * kind. * * Implemented for SSE2, VMX (Altivec), and NEON. */ class SIMD_4x32 final { public: SIMD_4x32& operator=(const SIMD_4x32& other) = default; SIMD_4x32(const SIMD_4x32& other) = default; #if !defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) SIMD_4x32& operator=(SIMD_4x32&& other) = default; SIMD_4x32(SIMD_4x32&& other) = default; #endif /** * Zero initialize SIMD register with 4 32-bit elements */ SIMD_4x32() // zero initialized { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_setzero_si128(); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = vec_splat_u32(0); #elif defined(BOTAN_SIMD_USE_NEON) m_neon = vdupq_n_u32(0); #else m_scalar[0] = 0; m_scalar[1] = 0; m_scalar[2] = 0; m_scalar[3] = 0; #endif } /** * Load SIMD register with 4 32-bit elements */ explicit SIMD_4x32(const uint32_t B[4]) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_loadu_si128(reinterpret_cast(B)); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = (__vector unsigned int){B[0], B[1], B[2], B[3]}; #elif defined(BOTAN_SIMD_USE_NEON) m_neon = vld1q_u32(B); #else m_scalar[0] = B[0]; m_scalar[1] = B[1]; m_scalar[2] = B[2]; m_scalar[3] = B[3]; #endif } /** * Load SIMD register with 4 32-bit elements */ SIMD_4x32(uint32_t B0, uint32_t B1, uint32_t B2, uint32_t B3) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_set_epi32(B3, B2, B1, B0); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = (__vector unsigned int){B0, B1, B2, B3}; #elif defined(BOTAN_SIMD_USE_NEON) // Better way to do this? const uint32_t B[4] = { B0, B1, B2, B3 }; m_neon = vld1q_u32(B); #else m_scalar[0] = B0; m_scalar[1] = B1; m_scalar[2] = B2; m_scalar[3] = B3; #endif } /** * Load SIMD register with one 32-bit element repeated */ static SIMD_4x32 splat(uint32_t B) { #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_set1_epi32(B)); #elif defined(BOTAN_SIMD_USE_ARM) return SIMD_4x32(vdupq_n_u32(B)); #else return SIMD_4x32(B, B, B, B); #endif } /** * Load a SIMD register with little-endian convention */ static SIMD_4x32 load_le(const void* in) { #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_loadu_si128(reinterpret_cast(in))); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const uint32_t* in_32 = static_cast(in); __vector unsigned int R0 = vec_ld(0, in_32); __vector unsigned int R1 = vec_ld(12, in_32); __vector unsigned char perm = vec_lvsl(0, in_32); if(CPUID::is_big_endian()) { perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector } R0 = vec_perm(R0, R1, perm); return SIMD_4x32(R0); #elif defined(BOTAN_SIMD_USE_NEON) uint32_t in32[4]; std::memcpy(in32, in, 16); if(CPUID::is_big_endian()) { bswap_4(in32); } return SIMD_4x32(vld1q_u32(in32)); #else SIMD_4x32 out; Botan::load_le(out.m_scalar, static_cast(in), 4); return out; #endif } /** * Load a SIMD register with big-endian convention */ static SIMD_4x32 load_be(const void* in) { #if defined(BOTAN_SIMD_USE_SSE2) return load_le(in).bswap(); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const uint32_t* in_32 = static_cast(in); __vector unsigned int R0 = vec_ld(0, in_32); __vector unsigned int R1 = vec_ld(12, in_32); __vector unsigned char perm = vec_lvsl(0, in_32); if(CPUID::is_little_endian()) { perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector } R0 = vec_perm(R0, R1, perm); return SIMD_4x32(R0); #elif defined(BOTAN_SIMD_USE_NEON) uint32_t in32[4]; std::memcpy(in32, in, 16); if(CPUID::is_little_endian()) { bswap_4(in32); } return SIMD_4x32(vld1q_u32(in32)); #else SIMD_4x32 out; Botan::load_be(out.m_scalar, static_cast(in), 4); return out; #endif } /** * Load a SIMD register with little-endian convention */ void store_le(uint8_t out[]) const { #if defined(BOTAN_SIMD_USE_SSE2) _mm_storeu_si128(reinterpret_cast<__m128i*>(out), m_sse); #elif defined(BOTAN_SIMD_USE_ALTIVEC) union { __vector unsigned int V; uint32_t R[4]; } vec; vec.V = m_vmx; Botan::store_le(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); #elif defined(BOTAN_SIMD_USE_NEON) if(CPUID::is_big_endian()) { SIMD_4x32 swap = bswap(); swap.store_be(out); } else { uint32_t out32[4] = { 0 }; vst1q_u32(out32, m_neon); copy_out_le(out, 16, out32); } #else Botan::store_le(out, m_scalar[0], m_scalar[1], m_scalar[2], m_scalar[3]); #endif } /** * Load a SIMD register with big-endian convention */ void store_be(uint8_t out[]) const { #if defined(BOTAN_SIMD_USE_SSE2) bswap().store_le(out); #elif defined(BOTAN_SIMD_USE_ALTIVEC) union { __vector unsigned int V; uint32_t R[4]; } vec; vec.V = m_vmx; Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); #elif defined(BOTAN_SIMD_USE_NEON) if(CPUID::is_little_endian()) { SIMD_4x32 swap = bswap(); swap.store_le(out); } else { uint32_t out32[4] = { 0 }; vst1q_u32(out32, m_neon); copy_out_be(out, 16, out32); } #else Botan::store_be(out, m_scalar[0], m_scalar[1], m_scalar[2], m_scalar[3]); #endif } /* * This is used for SHA-2/SHACAL2 * Return rotr(ROT1) ^ rotr(ROT2) ^ rotr(ROT3) */ template SIMD_4x32 rho() const { SIMD_4x32 res; #if defined(BOTAN_SIMD_USE_SSE2) res.m_sse = _mm_or_si128(_mm_slli_epi32(m_sse, static_cast(32-ROT1)), _mm_srli_epi32(m_sse, static_cast(ROT1))); res.m_sse = _mm_xor_si128( res.m_sse, _mm_or_si128(_mm_slli_epi32(m_sse, static_cast(32-ROT2)), _mm_srli_epi32(m_sse, static_cast(ROT2)))); res.m_sse = _mm_xor_si128( res.m_sse, _mm_or_si128(_mm_slli_epi32(m_sse, static_cast(32-ROT3)), _mm_srli_epi32(m_sse, static_cast(ROT3)))); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const unsigned int r1 = static_cast(32-ROT1); const unsigned int r2 = static_cast(32-ROT2); const unsigned int r3 = static_cast(32-ROT3); res.m_vmx = vec_rl(m_vmx, (__vector unsigned int){r1, r1, r1, r1}); res.m_vmx = vec_xor(res.m_vmx, vec_rl(m_vmx, (__vector unsigned int){r2, r2, r2, r2})); res.m_vmx = vec_xor(res.m_vmx, vec_rl(m_vmx, (__vector unsigned int){r3, r3, r3, r3})); #elif defined(BOTAN_SIMD_USE_NEON) res.m_neon = vorrq_u32(vshlq_n_u32(m_neon, static_cast(32-ROT1)), vshrq_n_u32(m_neon, static_cast(ROT1))); res.m_neon = veorq_u32( res.m_neon, vorrq_u32(vshlq_n_u32(m_neon, static_cast(32-ROT2)), vshrq_n_u32(m_neon, static_cast(ROT2)))); res.m_neon = veorq_u32( res.m_neon, vorrq_u32(vshlq_n_u32(m_neon, static_cast(32-ROT3)), vshrq_n_u32(m_neon, static_cast(ROT3)))); #else for(size_t i = 0; i != 4; ++i) { res.m_scalar[i] = Botan::rotr(m_scalar[i]) ^ Botan::rotr(m_scalar[i]) ^ Botan::rotr(m_scalar[i]); } #endif return res; } /** * Left rotation by a compile time constant */ template SIMD_4x32 rotl() const { static_assert(ROT > 0 && ROT < 32, "Invalid rotation constant"); #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_or_si128(_mm_slli_epi32(m_sse, static_cast(ROT)), _mm_srli_epi32(m_sse, static_cast(32-ROT)))); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const unsigned int r = static_cast(ROT); return SIMD_4x32(vec_rl(m_vmx, (__vector unsigned int){r, r, r, r})); #elif defined(BOTAN_SIMD_USE_NEON) return SIMD_4x32(vorrq_u32(vshlq_n_u32(m_neon, static_cast(ROT)), vshrq_n_u32(m_neon, static_cast(32-ROT)))); #else return SIMD_4x32(Botan::rotl(m_scalar[0]), Botan::rotl(m_scalar[1]), Botan::rotl(m_scalar[2]), Botan::rotl(m_scalar[3])); #endif } /** * Right rotation by a compile time constant */ template SIMD_4x32 rotr() const { return this->rotl<32-ROT>(); } /** * Add elements of a SIMD vector */ SIMD_4x32 operator+(const SIMD_4x32& other) const { SIMD_4x32 retval(*this); retval += other; return retval; } /** * Subtract elements of a SIMD vector */ SIMD_4x32 operator-(const SIMD_4x32& other) const { SIMD_4x32 retval(*this); retval -= other; return retval; } /** * XOR elements of a SIMD vector */ SIMD_4x32 operator^(const SIMD_4x32& other) const { SIMD_4x32 retval(*this); retval ^= other; return retval; } /** * Binary OR elements of a SIMD vector */ SIMD_4x32 operator|(const SIMD_4x32& other) const { SIMD_4x32 retval(*this); retval |= other; return retval; } /** * Binary AND elements of a SIMD vector */ SIMD_4x32 operator&(const SIMD_4x32& other) const { SIMD_4x32 retval(*this); retval &= other; return retval; } void operator+=(const SIMD_4x32& other) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_add_epi32(m_sse, other.m_sse); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = vec_add(m_vmx, other.m_vmx); #elif defined(BOTAN_SIMD_USE_NEON) m_neon = vaddq_u32(m_neon, other.m_neon); #else m_scalar[0] += other.m_scalar[0]; m_scalar[1] += other.m_scalar[1]; m_scalar[2] += other.m_scalar[2]; m_scalar[3] += other.m_scalar[3]; #endif } void operator-=(const SIMD_4x32& other) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_sub_epi32(m_sse, other.m_sse); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = vec_sub(m_vmx, other.m_vmx); #elif defined(BOTAN_SIMD_USE_NEON) m_neon = vsubq_u32(m_neon, other.m_neon); #else m_scalar[0] -= other.m_scalar[0]; m_scalar[1] -= other.m_scalar[1]; m_scalar[2] -= other.m_scalar[2]; m_scalar[3] -= other.m_scalar[3]; #endif } void operator^=(const SIMD_4x32& other) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_xor_si128(m_sse, other.m_sse); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = vec_xor(m_vmx, other.m_vmx); #elif defined(BOTAN_SIMD_USE_NEON) m_neon = veorq_u32(m_neon, other.m_neon); #else m_scalar[0] ^= other.m_scalar[0]; m_scalar[1] ^= other.m_scalar[1]; m_scalar[2] ^= other.m_scalar[2]; m_scalar[3] ^= other.m_scalar[3]; #endif } void operator|=(const SIMD_4x32& other) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_or_si128(m_sse, other.m_sse); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = vec_or(m_vmx, other.m_vmx); #elif defined(BOTAN_SIMD_USE_NEON) m_neon = vorrq_u32(m_neon, other.m_neon); #else m_scalar[0] |= other.m_scalar[0]; m_scalar[1] |= other.m_scalar[1]; m_scalar[2] |= other.m_scalar[2]; m_scalar[3] |= other.m_scalar[3]; #endif } void operator&=(const SIMD_4x32& other) { #if defined(BOTAN_SIMD_USE_SSE2) m_sse = _mm_and_si128(m_sse, other.m_sse); #elif defined(BOTAN_SIMD_USE_ALTIVEC) m_vmx = vec_and(m_vmx, other.m_vmx); #elif defined(BOTAN_SIMD_USE_NEON) m_neon = vandq_u32(m_neon, other.m_neon); #else m_scalar[0] &= other.m_scalar[0]; m_scalar[1] &= other.m_scalar[1]; m_scalar[2] &= other.m_scalar[2]; m_scalar[3] &= other.m_scalar[3]; #endif } template SIMD_4x32 shl() const { #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_slli_epi32(m_sse, SHIFT)); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const unsigned int s = static_cast(SHIFT); return SIMD_4x32(vec_sl(m_vmx, (__vector unsigned int){s, s, s, s})); #elif defined(BOTAN_SIMD_USE_NEON) return SIMD_4x32(vshlq_n_u32(m_neon, SHIFT)); #else return SIMD_4x32(m_scalar[0] << SHIFT, m_scalar[1] << SHIFT, m_scalar[2] << SHIFT, m_scalar[3] << SHIFT); #endif } template SIMD_4x32 shr() const { #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_srli_epi32(m_sse, SHIFT)); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const unsigned int s = static_cast(SHIFT); return SIMD_4x32(vec_sr(m_vmx, (__vector unsigned int){s, s, s, s})); #elif defined(BOTAN_SIMD_USE_NEON) return SIMD_4x32(vshrq_n_u32(m_neon, SHIFT)); #else return SIMD_4x32(m_scalar[0] >> SHIFT, m_scalar[1] >> SHIFT, m_scalar[2] >> SHIFT, m_scalar[3] >> SHIFT); #endif } SIMD_4x32 operator~() const { #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_xor_si128(m_sse, _mm_set1_epi32(0xFFFFFFFF))); #elif defined(BOTAN_SIMD_USE_ALTIVEC) return SIMD_4x32(vec_nor(m_vmx, m_vmx)); #elif defined(BOTAN_SIMD_USE_NEON) return SIMD_4x32(vmvnq_u32(m_neon)); #else return SIMD_4x32(~m_scalar[0], ~m_scalar[1], ~m_scalar[2], ~m_scalar[3]); #endif } // (~reg) & other SIMD_4x32 andc(const SIMD_4x32& other) const { #if defined(BOTAN_SIMD_USE_SSE2) return SIMD_4x32(_mm_andnot_si128(m_sse, other.m_sse)); #elif defined(BOTAN_SIMD_USE_ALTIVEC) /* AltiVec does arg1 & ~arg2 rather than SSE's ~arg1 & arg2 so swap the arguments */ return SIMD_4x32(vec_andc(other.m_vmx, m_vmx)); #elif defined(BOTAN_SIMD_USE_NEON) // NEON is also a & ~b return SIMD_4x32(vbicq_u32(other.m_neon, m_neon)); #else return SIMD_4x32((~m_scalar[0]) & other.m_scalar[0], (~m_scalar[1]) & other.m_scalar[1], (~m_scalar[2]) & other.m_scalar[2], (~m_scalar[3]) & other.m_scalar[3]); #endif } /** * Return copy *this with each word byte swapped */ SIMD_4x32 bswap() const { #if defined(BOTAN_SIMD_USE_SSE2) __m128i T = m_sse; T = _mm_shufflehi_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); T = _mm_shufflelo_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); return SIMD_4x32(_mm_or_si128(_mm_srli_epi16(T, 8), _mm_slli_epi16(T, 8))); #elif defined(BOTAN_SIMD_USE_ALTIVEC) __vector unsigned char perm = vec_lvsl(0, static_cast(nullptr)); perm = vec_xor(perm, vec_splat_u8(3)); return SIMD_4x32(vec_perm(m_vmx, m_vmx, perm)); #elif defined(BOTAN_SIMD_USE_NEON) //return SIMD_4x32(vrev64q_u32(m_neon)); // FIXME this is really slow SIMD_4x32 ror8 = this->rotr<8>(); SIMD_4x32 rol8 = this->rotl<8>(); const SIMD_4x32 mask1 = SIMD_4x32::splat(0xFF00FF00); const SIMD_4x32 mask2 = SIMD_4x32::splat(0x00FF00FF); return (ror8 & mask1) | (rol8 & mask2); #else // scalar return SIMD_4x32(reverse_bytes(m_scalar[0]), reverse_bytes(m_scalar[1]), reverse_bytes(m_scalar[2]), reverse_bytes(m_scalar[3])); #endif } /** * 4x4 Transposition on SIMD registers */ static void transpose(SIMD_4x32& B0, SIMD_4x32& B1, SIMD_4x32& B2, SIMD_4x32& B3) { #if defined(BOTAN_SIMD_USE_SSE2) const __m128i T0 = _mm_unpacklo_epi32(B0.m_sse, B1.m_sse); const __m128i T1 = _mm_unpacklo_epi32(B2.m_sse, B3.m_sse); const __m128i T2 = _mm_unpackhi_epi32(B0.m_sse, B1.m_sse); const __m128i T3 = _mm_unpackhi_epi32(B2.m_sse, B3.m_sse); B0.m_sse = _mm_unpacklo_epi64(T0, T1); B1.m_sse = _mm_unpackhi_epi64(T0, T1); B2.m_sse = _mm_unpacklo_epi64(T2, T3); B3.m_sse = _mm_unpackhi_epi64(T2, T3); #elif defined(BOTAN_SIMD_USE_ALTIVEC) const __vector unsigned int T0 = vec_mergeh(B0.m_vmx, B2.m_vmx); const __vector unsigned int T1 = vec_mergeh(B1.m_vmx, B3.m_vmx); const __vector unsigned int T2 = vec_mergel(B0.m_vmx, B2.m_vmx); const __vector unsigned int T3 = vec_mergel(B1.m_vmx, B3.m_vmx); B0.m_vmx = vec_mergeh(T0, T1); B1.m_vmx = vec_mergel(T0, T1); B2.m_vmx = vec_mergeh(T2, T3); B3.m_vmx = vec_mergel(T2, T3); #elif defined(BOTAN_SIMD_USE_NEON) #if defined(BOTAN_TARGET_ARCH_IS_ARM32) const uint32x4x2_t T0 = vzipq_u32(B0.m_neon, B2.m_neon); const uint32x4x2_t T1 = vzipq_u32(B1.m_neon, B3.m_neon); const uint32x4x2_t O0 = vzipq_u32(T0.val[0], T1.val[0]); const uint32x4x2_t O1 = vzipq_u32(T0.val[1], T1.val[1]); B0.m_neon = O0.val[0]; B1.m_neon = O0.val[1]; B2.m_neon = O1.val[0]; B3.m_neon = O1.val[1]; #elif defined(BOTAN_TARGET_ARCH_IS_ARM64) const uint32x4_t T0 = vzip1q_u32(B0.m_neon, B2.m_neon); const uint32x4_t T2 = vzip2q_u32(B0.m_neon, B2.m_neon); const uint32x4_t T1 = vzip1q_u32(B1.m_neon, B3.m_neon); const uint32x4_t T3 = vzip2q_u32(B1.m_neon, B3.m_neon); B0.m_neon = vzip1q_u32(T0, T1); B1.m_neon = vzip2q_u32(T0, T1); B2.m_neon = vzip1q_u32(T2, T3); B3.m_neon = vzip2q_u32(T2, T3); #endif #else // scalar SIMD_4x32 T0(B0.m_scalar[0], B1.m_scalar[0], B2.m_scalar[0], B3.m_scalar[0]); SIMD_4x32 T1(B0.m_scalar[1], B1.m_scalar[1], B2.m_scalar[1], B3.m_scalar[1]); SIMD_4x32 T2(B0.m_scalar[2], B1.m_scalar[2], B2.m_scalar[2], B3.m_scalar[2]); SIMD_4x32 T3(B0.m_scalar[3], B1.m_scalar[3], B2.m_scalar[3], B3.m_scalar[3]); B0 = T0; B1 = T1; B2 = T2; B3 = T3; #endif } private: #if defined(BOTAN_SIMD_USE_SSE2) explicit SIMD_4x32(__m128i in) : m_sse(in) {} #elif defined(BOTAN_SIMD_USE_ALTIVEC) explicit SIMD_4x32(__vector unsigned int in) : m_vmx(in) {} #elif defined(BOTAN_SIMD_USE_NEON) explicit SIMD_4x32(uint32x4_t in) : m_neon(in) {} #endif #if defined(BOTAN_SIMD_USE_SSE2) __m128i m_sse; #elif defined(BOTAN_SIMD_USE_ALTIVEC) __vector unsigned int m_vmx; #elif defined(BOTAN_SIMD_USE_NEON) uint32x4_t m_neon; #else uint32_t m_scalar[4]; #endif }; typedef SIMD_4x32 SIMD_32; } #endif botan-2.4.0/src/lib/utils/socket/000077500000000000000000000000001322470703100166045ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/socket/info.txt000066400000000000000000000003011322470703100202720ustar00rootroot00000000000000 SOCKETS -> 20171216 socket.h linux -> rt mingw -> ws2_32 windows -> ws2_32.lib haiku -> network solaris -> socket,nsl botan-2.4.0/src/lib/utils/socket/socket.cpp000066400000000000000000000260241322470703100206040ustar00rootroot00000000000000/* * (C) 2015,2016,2017 Jack Lloyd * (C) 2016 Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #if defined(BOTAN_HAS_BOOST_ASIO) /* * We don't need serial port support anyway, and asking for it * causes macro conflicts with Darwin's termios.h when this * file is included in the amalgamation. GH #350 */ #define BOOST_ASIO_DISABLE_SERIAL_PORT #include #include #elif defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) #include #include #include #include #include #include #include #include #elif defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) && !defined(BOTAN_TARGET_OS_IS_MINGW) #define NOMINMAX 1 #include #include #include #endif namespace Botan { namespace { #if defined(BOTAN_HAS_BOOST_ASIO) class Asio_Socket final : public OS::Socket { public: Asio_Socket(const std::string& hostname, const std::string& service, std::chrono::milliseconds timeout) : m_timeout(timeout), m_timer(m_io), m_tcp(m_io) { m_timer.expires_from_now(m_timeout); check_timeout(); boost::asio::ip::tcp::resolver resolver(m_io); boost::asio::ip::tcp::resolver::query query(hostname, service); boost::asio::ip::tcp::resolver::iterator dns_iter = resolver.resolve(query); boost::system::error_code ec = boost::asio::error::would_block; auto connect_cb = [&ec](const boost::system::error_code& e, boost::asio::ip::tcp::resolver::iterator) { ec = e; }; boost::asio::async_connect(m_tcp, dns_iter, connect_cb); while(ec == boost::asio::error::would_block) { m_io.run_one(); } if(ec) throw boost::system::system_error(ec); if(ec || m_tcp.is_open() == false) throw Exception("Connection to host " + hostname + " failed"); } void write(const uint8_t buf[], size_t len) override { m_timer.expires_from_now(m_timeout); boost::system::error_code ec = boost::asio::error::would_block; boost::asio::async_write(m_tcp, boost::asio::buffer(buf, len), [&ec](boost::system::error_code e, size_t got) { printf("wrote %d\n", got); ec = e; }); while(ec == boost::asio::error::would_block) { m_io.run_one(); } if(ec) { throw boost::system::system_error(ec); } } size_t read(uint8_t buf[], size_t len) override { m_timer.expires_from_now(m_timeout); boost::system::error_code ec = boost::asio::error::would_block; size_t got = 0; auto read_cb = [&](const boost::system::error_code cb_ec, size_t cb_got) { ec = cb_ec; got = cb_got; }; m_tcp.async_read_some(boost::asio::buffer(buf, len), read_cb); while(ec == boost::asio::error::would_block) { m_io.run_one(); } if(ec) { if(ec == boost::asio::error::eof) return 0; throw boost::system::system_error(ec); // Some other error. } return got; } private: void check_timeout() { if(m_tcp.is_open() && m_timer.expires_at() < std::chrono::system_clock::now()) { boost::system::error_code err; m_tcp.close(err); } m_timer.async_wait(std::bind(&Asio_Socket::check_timeout, this)); } const std::chrono::milliseconds m_timeout; boost::asio::io_service m_io; boost::asio::system_timer m_timer; boost::asio::ip::tcp::socket m_tcp; }; #elif defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) || (defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) && !defined(BOTAN_TARGET_OS_IS_MINGW)) class BSD_Socket final : public OS::Socket { private: #if defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) typedef SOCKET socket_type; typedef int socket_op_ret_type; static socket_type invalid_socket() { return INVALID_SOCKET; } static void close_socket(socket_type s) { ::closesocket(s); } static std::string get_last_socket_error() { return std::to_string(::WSAGetLastError()); } static bool nonblocking_connect_in_progress() { return (::WSAGetLastError() == WSAEWOULDBLOCK); } static void set_nonblocking(socket_type s) { u_long nonblocking = 1; ::ioctlsocket(s, FIONBIO, &nonblocking); } static void socket_init() { WSAData wsa_data; WORD wsa_version = MAKEWORD(2, 2); if (::WSAStartup(wsa_version, &wsa_data) != 0) { throw Exception("WSAStartup() failed: " + std::to_string(WSAGetLastError())); } if (LOBYTE(wsa_data.wVersion) != 2 || HIBYTE(wsa_data.wVersion) != 2) { ::WSACleanup(); throw Exception("Could not find a usable version of Winsock.dll"); } } static void socket_fini() { ::WSACleanup(); } #else typedef int socket_type; typedef ssize_t socket_op_ret_type; static socket_type invalid_socket() { return -1; } static void close_socket(socket_type s) { ::close(s); } static std::string get_last_socket_error() { return ::strerror(errno); } static bool nonblocking_connect_in_progress() { return (errno == EINPROGRESS); } static void set_nonblocking(socket_type s) { if(::fcntl(s, F_SETFL, O_NONBLOCK) < 0) throw Exception("Setting socket to non-blocking state failed"); } static void socket_init() {} static void socket_fini() {} #endif public: BSD_Socket(const std::string& hostname, const std::string& service, std::chrono::microseconds timeout) : m_timeout(timeout) { socket_init(); m_socket = invalid_socket(); addrinfo hints; ::memset(&hints, 0, sizeof(addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; addrinfo* res; if(::getaddrinfo(hostname.c_str(), service.c_str(), &hints, &res) != 0) { throw Exception("Name resolution failed for " + hostname); } for(addrinfo* rp = res; (m_socket == invalid_socket()) && (rp != nullptr); rp = rp->ai_next) { if(rp->ai_family != AF_INET && rp->ai_family != AF_INET6) continue; m_socket = ::socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if(m_socket == invalid_socket()) { // unsupported socket type? continue; } set_nonblocking(m_socket); int err = ::connect(m_socket, rp->ai_addr, rp->ai_addrlen); if(err == -1) { int active = 0; if(nonblocking_connect_in_progress()) { struct timeval timeout_tv = make_timeout_tv(); fd_set write_set; FD_ZERO(&write_set); FD_SET(m_socket, &write_set); active = ::select(m_socket + 1, nullptr, &write_set, nullptr, &timeout_tv); if(active) { int socket_error = 0; socklen_t len = sizeof(socket_error); if(::getsockopt(m_socket, SOL_SOCKET, SO_ERROR, reinterpret_cast(&socket_error), &len) < 0) throw Exception("Error calling getsockopt"); if(socket_error != 0) { active = 0; } } } if(active == 0) { close_socket(m_socket); m_socket = invalid_socket(); continue; } } } ::freeaddrinfo(res); if(m_socket == invalid_socket()) { throw Exception("Connecting to " + hostname + " for service " + service + " failed"); } } ~BSD_Socket() { close_socket(m_socket); m_socket = invalid_socket(); socket_fini(); } void write(const uint8_t buf[], size_t len) override { fd_set write_set; FD_ZERO(&write_set); FD_SET(m_socket, &write_set); size_t sent_so_far = 0; while(sent_so_far != len) { struct timeval timeout = make_timeout_tv(); int active = ::select(m_socket + 1, nullptr, &write_set, nullptr, &timeout); if(active == 0) throw Exception("Timeout during socket write"); const size_t left = len - sent_so_far; socket_op_ret_type sent = ::send(m_socket, cast_uint8_ptr_to_char(&buf[sent_so_far]), left, 0); if(sent < 0) throw Exception("Socket write failed with error '" + std::string(::strerror(errno)) + "'"); else sent_so_far += static_cast(sent); } } size_t read(uint8_t buf[], size_t len) override { fd_set read_set; FD_ZERO(&read_set); FD_SET(m_socket, &read_set); struct timeval timeout = make_timeout_tv(); int active = ::select(m_socket + 1, &read_set, nullptr, nullptr, &timeout); if(active == 0) throw Exception("Timeout during socket read"); socket_op_ret_type got = ::recv(m_socket, cast_uint8_ptr_to_char(buf), len, 0); if(got < 0) throw Exception("Socket read failed with error '" + std::string(::strerror(errno)) + "'"); return static_cast(got); } private: struct timeval make_timeout_tv() const { struct timeval tv; tv.tv_sec = m_timeout.count() / 1000000; tv.tv_usec = m_timeout.count() % 1000000; return tv; } const std::chrono::microseconds m_timeout; socket_type m_socket; }; #endif } std::unique_ptr OS::open_socket(const std::string& hostname, const std::string& service, std::chrono::milliseconds timeout) { #if defined(BOTAN_HAS_BOOST_ASIO) return std::unique_ptr(new Asio_Socket(hostname, service, timeout)); #elif defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) || (defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) && !defined(BOTAN_TARGET_OS_IS_MINGW)) return std::unique_ptr(new BSD_Socket(hostname, service, timeout)); #else // No sockets for you return std::unique_ptr(); #endif } } botan-2.4.0/src/lib/utils/socket/socket.h000066400000000000000000000027431322470703100202530ustar00rootroot00000000000000/* * OS specific utility functions * (C) 2015,2016,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_SOCKET_H_ #define BOTAN_SOCKET_H_ #include #include #include namespace Botan { namespace OS { /* * This header is internal (not installed) and these functions are not * intended to be called by applications. However they are given public * visibility (using BOTAN_TEST_API macro) for the tests. This also probably * allows them to be overridden by the application on ELF systems, but * this hasn't been tested. */ /** * A wrapper around a simple blocking TCP socket */ class BOTAN_TEST_API Socket { public: /** * The socket will be closed upon destruction */ virtual ~Socket() = default; /** * Write to the socket. Blocks until all bytes sent. * Throws on error. */ virtual void write(const uint8_t buf[], size_t len) = 0; /** * Reads up to len bytes, returns bytes written to buf. * Returns 0 on EOF. Throws on error. */ virtual size_t read(uint8_t buf[], size_t len) = 0; }; /** * Open up a socket. Will throw on error. Returns null if sockets are * not available on this platform. */ std::unique_ptr BOTAN_TEST_API open_socket(const std::string& hostname, const std::string& service, std::chrono::milliseconds timeout); } // OS } // Botan #endif botan-2.4.0/src/lib/utils/sqlite3/000077500000000000000000000000001322470703100167005ustar00rootroot00000000000000botan-2.4.0/src/lib/utils/sqlite3/info.txt000066400000000000000000000002041322470703100203700ustar00rootroot00000000000000 SQLITE3 -> 20171118 load_on vendor all -> sqlite3 sqlite3.h botan-2.4.0/src/lib/utils/sqlite3/sqlite3.cpp000066400000000000000000000116711322470703100207760ustar00rootroot00000000000000/* * SQLite wrapper * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { Sqlite3_Database::Sqlite3_Database(const std::string& db_filename) { int rc = ::sqlite3_open(db_filename.c_str(), &m_db); if(rc) { const std::string err_msg = ::sqlite3_errmsg(m_db); ::sqlite3_close(m_db); m_db = nullptr; throw SQL_DB_Error("sqlite3_open failed - " + err_msg); } } Sqlite3_Database::~Sqlite3_Database() { if(m_db) ::sqlite3_close(m_db); m_db = nullptr; } std::shared_ptr Sqlite3_Database::new_statement(const std::string& base_sql) const { return std::make_shared(m_db, base_sql); } size_t Sqlite3_Database::row_count(const std::string& table_name) { auto stmt = new_statement("select count(*) from " + table_name); if(stmt->step()) return stmt->get_size_t(0); else throw SQL_DB_Error("Querying size of table " + table_name + " failed"); } void Sqlite3_Database::create_table(const std::string& table_schema) { char* errmsg = nullptr; int rc = ::sqlite3_exec(m_db, table_schema.c_str(), nullptr, nullptr, &errmsg); if(rc != SQLITE_OK) { const std::string err_msg = errmsg; ::sqlite3_free(errmsg); ::sqlite3_close(m_db); m_db = nullptr; throw SQL_DB_Error("sqlite3_exec for table failed - " + err_msg); } } Sqlite3_Database::Sqlite3_Statement::Sqlite3_Statement(sqlite3* db, const std::string& base_sql) { int rc = ::sqlite3_prepare_v2(db, base_sql.c_str(), -1, &m_stmt, nullptr); if(rc != SQLITE_OK) throw SQL_DB_Error("sqlite3_prepare failed " + base_sql + ", code " + std::to_string(rc)); } void Sqlite3_Database::Sqlite3_Statement::bind(int column, const std::string& val) { int rc = ::sqlite3_bind_text(m_stmt, column, val.c_str(), -1, SQLITE_TRANSIENT); if(rc != SQLITE_OK) throw SQL_DB_Error("sqlite3_bind_text failed, code " + std::to_string(rc)); } void Sqlite3_Database::Sqlite3_Statement::bind(int column, size_t val) { if(val != static_cast(static_cast(val))) // is this legit? throw SQL_DB_Error("sqlite3 cannot store " + std::to_string(val) + " without truncation"); int rc = ::sqlite3_bind_int(m_stmt, column, val); if(rc != SQLITE_OK) throw SQL_DB_Error("sqlite3_bind_int failed, code " + std::to_string(rc)); } void Sqlite3_Database::Sqlite3_Statement::bind(int column, std::chrono::system_clock::time_point time) { const int timeval = std::chrono::duration_cast(time.time_since_epoch()).count(); bind(column, timeval); } void Sqlite3_Database::Sqlite3_Statement::bind(int column, const std::vector& val) { int rc = ::sqlite3_bind_blob(m_stmt, column, val.data(), val.size(), SQLITE_TRANSIENT); if(rc != SQLITE_OK) throw SQL_DB_Error("sqlite3_bind_text failed, code " + std::to_string(rc)); } void Sqlite3_Database::Sqlite3_Statement::bind(int column, const uint8_t* p, size_t len) { int rc = ::sqlite3_bind_blob(m_stmt, column, p, len, SQLITE_TRANSIENT); if(rc != SQLITE_OK) throw SQL_DB_Error("sqlite3_bind_text failed, code " + std::to_string(rc)); } std::pair Sqlite3_Database::Sqlite3_Statement::get_blob(int column) { BOTAN_ASSERT(::sqlite3_column_type(m_stmt, column) == SQLITE_BLOB, "Return value is a blob"); const void* session_blob = ::sqlite3_column_blob(m_stmt, column); const int session_blob_size = ::sqlite3_column_bytes(m_stmt, column); BOTAN_ASSERT(session_blob_size >= 0, "Blob size is non-negative"); return std::make_pair(static_cast(session_blob), static_cast(session_blob_size)); } std::string Sqlite3_Database::Sqlite3_Statement::get_str(int column) { BOTAN_ASSERT(::sqlite3_column_type(m_stmt, column) == SQLITE_TEXT, "Return value is text"); const unsigned char* str = ::sqlite3_column_text(m_stmt, column); return std::string(cast_uint8_ptr_to_char(str)); } size_t Sqlite3_Database::Sqlite3_Statement::get_size_t(int column) { BOTAN_ASSERT(::sqlite3_column_type(m_stmt, column) == SQLITE_INTEGER, "Return count is an integer"); const int sessions_int = ::sqlite3_column_int(m_stmt, column); BOTAN_ASSERT(sessions_int >= 0, "Expected size_t is non-negative"); return static_cast(sessions_int); } size_t Sqlite3_Database::Sqlite3_Statement::spin() { size_t steps = 0; while(step()) { ++steps; } return steps; } bool Sqlite3_Database::Sqlite3_Statement::step() { return (::sqlite3_step(m_stmt) == SQLITE_ROW); } Sqlite3_Database::Sqlite3_Statement::~Sqlite3_Statement() { ::sqlite3_finalize(m_stmt); } } botan-2.4.0/src/lib/utils/sqlite3/sqlite3.h000066400000000000000000000030621322470703100204360ustar00rootroot00000000000000/* * SQLite3 wrapper * (C) 2012,2014 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_UTILS_SQLITE3_H_ #define BOTAN_UTILS_SQLITE3_H_ #include class sqlite3; class sqlite3_stmt; namespace Botan { class BOTAN_PUBLIC_API(2,0) Sqlite3_Database final : public SQL_Database { public: Sqlite3_Database(const std::string& file); ~Sqlite3_Database(); size_t row_count(const std::string& table_name) override; void create_table(const std::string& table_schema) override; std::shared_ptr new_statement(const std::string& sql) const override; private: class Sqlite3_Statement final : public Statement { public: void bind(int column, const std::string& val) override; void bind(int column, size_t val) override; void bind(int column, std::chrono::system_clock::time_point time) override; void bind(int column, const std::vector& val) override; void bind(int column, const uint8_t* data, size_t len) override; std::pair get_blob(int column) override; std::string get_str(int column) override; size_t get_size_t(int column) override; size_t spin() override; bool step() override; Sqlite3_Statement(sqlite3* db, const std::string& base_sql); ~Sqlite3_Statement(); private: sqlite3_stmt* m_stmt; }; sqlite3* m_db; }; } #endif botan-2.4.0/src/lib/utils/stl_compatibility.h000066400000000000000000000034001322470703100212150ustar00rootroot00000000000000/* * STL standards compatibility functions * (C) 2017 Tomasz Frydrych * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STL_COMPATIBILITY_H_ #define BOTAN_STL_COMPATIBILITY_H_ #include #if __cplusplus < 201402L #include #include #include #endif namespace Botan { /* * std::make_unique functionality similar as we have in C++14. * C++11 version based on proposal for C++14 implemenatation by Stephan T. Lavavej * source: https://isocpp.org/files/papers/N3656.txt */ #if __cplusplus >= 201402L template constexpr auto make_unique(Args&&... args) { return std::make_unique(std::forward(args)...); } template constexpr auto make_unique(std::size_t size) { return std::make_unique(size); } #else namespace stlCompatibilityDetails { template struct _Unique_if { typedef std::unique_ptr _Single_object; }; template struct _Unique_if { typedef std::unique_ptr _Unknown_bound; }; template struct _Unique_if { typedef void _Known_bound; }; } // namespace stlCompatibilityDetails template typename stlCompatibilityDetails::_Unique_if::_Single_object make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } template typename stlCompatibilityDetails::_Unique_if::_Unknown_bound make_unique(size_t n) { typedef typename std::remove_extent::type U; return std::unique_ptr(new U[n]()); } template typename stlCompatibilityDetails::_Unique_if::_Known_bound make_unique(Args&&...) = delete; #endif } // namespace Botan #endif botan-2.4.0/src/lib/utils/stl_util.h000066400000000000000000000044641322470703100173340ustar00rootroot00000000000000/* * STL Utility Functions * (C) 1999-2007 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STL_UTIL_H_ #define BOTAN_STL_UTIL_H_ #include #include #include #include #include namespace Botan { inline std::vector to_byte_vector(const std::string& s) { return std::vector(s.cbegin(), s.cend()); } inline std::string to_string(const secure_vector &bytes) { return std::string(bytes.cbegin(), bytes.cend()); } /** * Return the keys of a map as a std::set */ template std::set map_keys_as_set(const std::map& kv) { std::set s; for(auto&& i : kv) { s.insert(i.first); } return s; } /* * Searching through a std::map * @param mapping the map to search * @param key is what to look for * @param null_result is the value to return if key is not in mapping * @return mapping[key] or null_result */ template inline V search_map(const std::map& mapping, const K& key, const V& null_result = V()) { auto i = mapping.find(key); if(i == mapping.end()) return null_result; return i->second; } template inline R search_map(const std::map& mapping, const K& key, const R& null_result, const R& found_result) { auto i = mapping.find(key); if(i == mapping.end()) return null_result; return found_result; } /* * Insert a key/value pair into a multimap */ template void multimap_insert(std::multimap& multimap, const K& key, const V& value) { multimap.insert(std::make_pair(key, value)); } /** * Existence check for values */ template bool value_exists(const std::vector& vec, const T& val) { for(size_t i = 0; i != vec.size(); ++i) if(vec[i] == val) return true; return false; } template void map_remove_if(Pred pred, T& assoc) { auto i = assoc.begin(); while(i != assoc.end()) { if(pred(i->first)) assoc.erase(i++); else i++; } } } #endif botan-2.4.0/src/lib/utils/types.h000066400000000000000000000101411322470703100166260ustar00rootroot00000000000000/* * Low Level Types * (C) 1999-2007 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TYPES_H_ #define BOTAN_TYPES_H_ #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export namespace Botan { /** * @mainpage Botan Crypto Library API Reference * *
*
Abstract Base Classes
* BlockCipher, HashFunction, KDF, MessageAuthenticationCode, RandomNumberGenerator, * StreamCipher, SymmetricAlgorithm, AEAD_Mode, Cipher_Mode *
Public Key Interface Classes
* PK_Key_Agreement, PK_Signer, PK_Verifier, PK_Encryptor, PK_Decryptor *
Authenticated Encryption Modes
* @ref CCM_Mode "CCM", @ref ChaCha20Poly1305_Mode "ChaCha20Poly1305", @ref EAX_Mode "EAX", * @ref GCM_Mode "GCM", @ref OCB_Mode "OCB", @ref SIV_Mode "SIV" *
Block Ciphers
* @ref aria.h "ARIA", @ref aes.h "AES", @ref Blowfish, @ref camellia.h "Camellia", @ref Cascade_Cipher "Cascade", * @ref CAST_128 "CAST-128", @ref CAST_128 "CAST-256", DES, @ref DESX "DES-X", @ref TripleDES "3DES", * @ref GOST_28147_89 "GOST 28147-89", IDEA, KASUMI, Lion, MISTY1, Noekeon, SEED, Serpent, SHACAL2, SM4, * @ref Threefish_512 "Threefish", Twofish, XTEA *
Stream Ciphers
* ChaCha, @ref CTR_BE "CTR", OFB, RC4, Salsa20 *
Hash Functions
* Blake2b, @ref GOST_34_11 "GOST 34.11", @ref Keccak_1600 "Keccak", MD4, MD5, @ref RIPEMD_160 "RIPEMD-160", * @ref SHA_160 "SHA-1", @ref SHA_224 "SHA-224", @ref SHA_256 "SHA-256", @ref SHA_384 "SHA-384", * @ref SHA_512 "SHA-512", @ref Skein_512 "Skein-512", SM3, Streebog, Tiger, Whirlpool *
Non-Cryptographic Checksums
* Adler32, CRC24, CRC32 *
Message Authentication Codes
* @ref CBC_MAC "CBC-MAC", CMAC, HMAC, Poly1305, SipHash, ANSI_X919_MAC *
Random Number Generators
* AutoSeeded_RNG, HMAC_DRBG, RDRAND_RNG, System_RNG *
Key Derivation
* HKDF, @ref KDF1 "KDF1 (IEEE 1363)", @ref KDF1_18033 "KDF1 (ISO 18033-2)", @ref KDF2 "KDF2 (IEEE 1363)", * @ref sp800_108.h "SP800-108", @ref SP800_56C "SP800-56C", @ref PKCS5_PBKDF1 "PBKDF1 (PKCS#5), * @ref PKCS5_PBKDF2 "PBKDF2 (PKCS#5)" *
Password Hashing
* @ref bcrypt.h "bcrypt", @ref passhash9.h "passhash9" *
Public Key Cryptosystems
* @ref dlies.h "DLIES", @ref ecies.h "ECIES", @ref elgamal.h "ElGamal" * @ref rsa.h "RSA", @ref newhope.h "NewHope", @ref mceliece.h "McEliece" and @ref mceies.h "MCEIES", * @ref sm2_enc.h "SM2" *
Public Key Signature Schemes
* @ref dsa.h "DSA", @ref ecdsa.h "ECDSA", @ref ecgdsa.h "ECGDSA", @ref eckcdsa.h "ECKCDSA", * @ref gost_3410.h "GOST 34.10-2001", @ref sm2.h "SM2", @ref xmss.h "XMSS" *
Key Agreement
* @ref dh.h "DH", @ref ecdh.h "ECDH" *
Compression
* @ref bzip2.h "bzip2", @ref lzma.h "lzma", @ref zlib.h "zlib" *
TLS
* TLS::Client, TLS::Server, TLS::Policy, TLS::Protocol_Version, TLS::Callbacks, TLS::Ciphersuite, * TLS::Session, TLS::Session_Manager, Credentials_Manager *
X.509
* X509_Certificate, X509_CRL, X509_CA, Certificate_Extension, PKCS10_Request, X509_Cert_Options, * Certificate_Store, Certificate_Store_In_SQL, Certificate_Store_In_SQLite *
*/ using std::uint8_t; using std::uint16_t; using std::uint32_t; using std::uint64_t; using std::int32_t; using std::int64_t; using std::size_t; /* * These typedefs are no longer used within the library headers * or code. They are kept only for compatability with software * written against older versions. */ using byte = std::uint8_t; using u16bit = std::uint16_t; using u32bit = std::uint32_t; using u64bit = std::uint64_t; using s32bit = std::int32_t; /** * A default buffer size; typically a memory page */ static const size_t DEFAULT_BUFFERSIZE = BOTAN_DEFAULT_BUFFER_SIZE; } #endif botan-2.4.0/src/lib/utils/version.cpp000066400000000000000000000043671322470703100175170ustar00rootroot00000000000000/* * Version Information * (C) 1999-2013,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { /* These are intentionally compiled rather than inlined, so an application running against a shared library can test the true version they are running against. */ #define QUOTE(name) #name #define STR(macro) QUOTE(macro) const char* short_version_cstr() { return STR(BOTAN_VERSION_MAJOR) "." STR(BOTAN_VERSION_MINOR) "." STR(BOTAN_VERSION_PATCH); } const char* version_cstr() { /* It is intentional that this string is a compile-time constant; it makes it much easier to find in binaries. */ return "Botan " STR(BOTAN_VERSION_MAJOR) "." STR(BOTAN_VERSION_MINOR) "." STR(BOTAN_VERSION_PATCH) " (" #if defined(BOTAN_UNSAFE_FUZZER_MODE) "UNSAFE FUZZER MODE BUILD " #endif BOTAN_VERSION_RELEASE_TYPE #if (BOTAN_VERSION_DATESTAMP != 0) ", dated " STR(BOTAN_VERSION_DATESTAMP) #endif ", revision " BOTAN_VERSION_VC_REVISION ", distribution " BOTAN_DISTRIBUTION_INFO ")"; } #undef STR #undef QUOTE /* * Return the version as a string */ std::string version_string() { return std::string(version_cstr()); } std::string short_version_string() { return std::string(short_version_cstr()); } uint32_t version_datestamp() { return BOTAN_VERSION_DATESTAMP; } /* * Return parts of the version as integers */ uint32_t version_major() { return BOTAN_VERSION_MAJOR; } uint32_t version_minor() { return BOTAN_VERSION_MINOR; } uint32_t version_patch() { return BOTAN_VERSION_PATCH; } std::string runtime_version_check(uint32_t major, uint32_t minor, uint32_t patch) { std::ostringstream oss; if(major != version_major() || minor != version_minor() || patch != version_patch()) { oss << "Warning: linked version (" << short_version_string() << ")" << " does not match version built against " << "(" << major << '.' << minor << '.' << patch << ")\n"; } return oss.str(); } } botan-2.4.0/src/lib/utils/version.h000066400000000000000000000050461322470703100171570ustar00rootroot00000000000000/* * Version Information * (C) 1999-2011,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_VERSION_H_ #define BOTAN_VERSION_H_ #include #include namespace Botan { /* * Get information describing the version */ /** * Get a human-readable string identifying the version of Botan. * No particular format should be assumed. * @return version string */ BOTAN_PUBLIC_API(2,0) std::string version_string(); /** * Same as version_string() except returning a pointer to a statically * allocated string. * @return version string */ BOTAN_PUBLIC_API(2,0) const char* version_cstr(); /** * Return a version string of the form "MAJOR.MINOR.PATCH" where * each of the values is an integer. */ BOTAN_PUBLIC_API(2,4) std::string short_version_string(); /** * Same as version_short_string except returning a pointer to the string. */ BOTAN_PUBLIC_API(2,4) const char* short_version_cstr(); /** * Return the date this version of botan was released, in an integer of * the form YYYYMMDD. For instance a version released on May 21, 2013 * would return the integer 20130521. If the currently running version * is not an official release, this function will return 0 instead. * * @return release date, or zero if unreleased */ BOTAN_PUBLIC_API(2,0) uint32_t version_datestamp(); /** * Get the major version number. * @return major version number */ BOTAN_PUBLIC_API(2,0) uint32_t version_major(); /** * Get the minor version number. * @return minor version number */ BOTAN_PUBLIC_API(2,0) uint32_t version_minor(); /** * Get the patch number. * @return patch number */ BOTAN_PUBLIC_API(2,0) uint32_t version_patch(); /** * Usable for checking that the DLL version loaded at runtime exactly * matches the compile-time version. Call using BOTAN_VERSION_* macro * values. Returns the empty string if an exact match, otherwise an * appropriate message. Added with 1.11.26. */ BOTAN_PUBLIC_API(2,0) std::string runtime_version_check(uint32_t major, uint32_t minor, uint32_t patch); /* * Macros for compile-time version checks */ #define BOTAN_VERSION_CODE_FOR(a,b,c) ((a << 16) | (b << 8) | (c)) /** * Compare using BOTAN_VERSION_CODE_FOR, as in * # if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,8,0) * # error "Botan version too old" * # endif */ #define BOTAN_VERSION_CODE BOTAN_VERSION_CODE_FOR(BOTAN_VERSION_MAJOR, \ BOTAN_VERSION_MINOR, \ BOTAN_VERSION_PATCH) } #endif botan-2.4.0/src/lib/x509/000077500000000000000000000000001322470703100146615ustar00rootroot00000000000000botan-2.4.0/src/lib/x509/asn1_alt_name.cpp000066400000000000000000000150001322470703100200630ustar00rootroot00000000000000/* * AlternativeName * (C) 1999-2007 Jack Lloyd * 2007 Yves Jerschow * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include namespace Botan { /* * Create an AlternativeName */ AlternativeName::AlternativeName(const std::string& email_addr, const std::string& uri, const std::string& dns, const std::string& ip) { add_attribute("RFC822", email_addr); add_attribute("DNS", dns); add_attribute("URI", uri); add_attribute("IP", ip); } /* * Add an attribute to an alternative name */ void AlternativeName::add_attribute(const std::string& type, const std::string& value) { if(type.empty() || value.empty()) return; auto range = m_alt_info.equal_range(type); for(auto j = range.first; j != range.second; ++j) if(j->second == value) return; multimap_insert(m_alt_info, type, value); } /* * Add an OtherName field */ void AlternativeName::add_othername(const OID& oid, const std::string& value, ASN1_Tag type) { if(value.empty()) return; multimap_insert(m_othernames, oid, ASN1_String(value, type)); } /* * Return all of the alternative names */ std::multimap AlternativeName::contents() const { std::multimap names; for(auto i = m_alt_info.begin(); i != m_alt_info.end(); ++i) multimap_insert(names, i->first, i->second); for(auto i = m_othernames.begin(); i != m_othernames.end(); ++i) multimap_insert(names, OIDS::lookup(i->first), i->second.value()); return names; } bool AlternativeName::has_field(const std::string& attr) const { auto range = m_alt_info.equal_range(attr); return (range.first != range.second); } std::string AlternativeName::get_first_attribute(const std::string& attr) const { auto i = m_alt_info.lower_bound(attr); if(i != m_alt_info.end() && i->first == attr) return i->second; return ""; } std::vector AlternativeName::get_attribute(const std::string& attr) const { std::vector results; auto range = m_alt_info.equal_range(attr); for(auto i = range.first; i != range.second; ++i) results.push_back(i->second); return results; } /* * Return if this object has anything useful */ bool AlternativeName::has_items() const { return (m_alt_info.size() > 0 || m_othernames.size() > 0); } namespace { /* * DER encode an AlternativeName entry */ void encode_entries(DER_Encoder& encoder, const std::multimap& attr, const std::string& type, ASN1_Tag tagging) { auto range = attr.equal_range(type); for(auto i = range.first; i != range.second; ++i) { if(type == "RFC822" || type == "DNS" || type == "URI") { ASN1_String asn1_string(i->second, IA5_STRING); encoder.add_object(tagging, CONTEXT_SPECIFIC, asn1_string.value()); } else if(type == "IP") { const uint32_t ip = string_to_ipv4(i->second); uint8_t ip_buf[4] = { 0 }; store_be(ip, ip_buf); encoder.add_object(tagging, CONTEXT_SPECIFIC, ip_buf, 4); } else if (type == "DN") { std::stringstream ss(i->second); X509_DN dn; ss >> dn; encoder.encode(dn); } } } } /* * DER encode an AlternativeName extension */ void AlternativeName::encode_into(DER_Encoder& der) const { der.start_cons(SEQUENCE); encode_entries(der, m_alt_info, "RFC822", ASN1_Tag(1)); encode_entries(der, m_alt_info, "DNS", ASN1_Tag(2)); encode_entries(der, m_alt_info, "DN", ASN1_Tag(4)); encode_entries(der, m_alt_info, "URI", ASN1_Tag(6)); encode_entries(der, m_alt_info, "IP", ASN1_Tag(7)); for(auto i = m_othernames.begin(); i != m_othernames.end(); ++i) { der.start_explicit(0) .encode(i->first) .start_explicit(0) .encode(i->second) .end_explicit() .end_explicit(); } der.end_cons(); } /* * Decode a BER encoded AlternativeName */ void AlternativeName::decode_from(BER_Decoder& source) { BER_Decoder names = source.start_cons(SEQUENCE); while(names.more_items()) { BER_Object obj = names.get_next_object(); if((obj.class_tag != CONTEXT_SPECIFIC) && (obj.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED))) continue; const ASN1_Tag tag = obj.type_tag; if(tag == 0) { BER_Decoder othername(obj.value); OID oid; othername.decode(oid); if(othername.more_items()) { BER_Object othername_value_outer = othername.get_next_object(); othername.verify_end(); if(othername_value_outer.type_tag != ASN1_Tag(0) || othername_value_outer.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED) ) throw Decoding_Error("Invalid tags on otherName value"); BER_Decoder othername_value_inner(othername_value_outer.value); BER_Object value = othername_value_inner.get_next_object(); othername_value_inner.verify_end(); const ASN1_Tag value_type = value.type_tag; if(ASN1_String::is_string_type(value_type) && value.class_tag == UNIVERSAL) { add_othername(oid, ASN1::to_string(value), value_type); } } } else if(tag == 1 || tag == 2 || tag == 6) { if(tag == 1) add_attribute("RFC822", ASN1::to_string(obj)); if(tag == 2) add_attribute("DNS", ASN1::to_string(obj)); if(tag == 6) add_attribute("URI", ASN1::to_string(obj)); } else if(tag == 4) { BER_Decoder dec(obj.value); X509_DN dn; std::stringstream ss; dec.decode(dn); ss << dn; add_attribute("DN", ss.str()); } else if(tag == 7) { if(obj.value.size() == 4) { const uint32_t ip = load_be(&obj.value[0], 0); add_attribute("IP", ipv4_to_string(ip)); } } } } } botan-2.4.0/src/lib/x509/asn1_alt_name.h000066400000000000000000000031051322470703100175330ustar00rootroot00000000000000/* * (C) 1999-2007 Jack Lloyd * 2007 Yves Jerschow * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_ALT_NAME_H_ #define BOTAN_X509_ALT_NAME_H_ #include #include #include #include namespace Botan { /** * Alternative Name */ class BOTAN_PUBLIC_API(2,0) AlternativeName final : public ASN1_Object { public: void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; std::multimap contents() const; bool has_field(const std::string& attr) const; std::vector get_attribute(const std::string& attr) const; std::string get_first_attribute(const std::string& attr) const; void add_attribute(const std::string& type, const std::string& value); void add_othername(const OID& oid, const std::string& value, ASN1_Tag type); const std::multimap& get_attributes() const { return m_alt_info; } const std::multimap& get_othernames() const { return m_othernames; } bool has_items() const; AlternativeName(const std::string& email_addr = "", const std::string& uri = "", const std::string& dns = "", const std::string& ip_address = ""); private: std::multimap m_alt_info; std::multimap m_othernames; }; } #endif botan-2.4.0/src/lib/x509/cert_status.cpp000066400000000000000000000123021322470703100177230ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { //static const char* to_string(Certificate_Status_Code code) { switch(code) { case Certificate_Status_Code::VERIFIED: return "Verified"; case Certificate_Status_Code::OCSP_RESPONSE_GOOD: return "OCSP response accepted as affirming unrevoked status for certificate"; case Certificate_Status_Code::OCSP_SIGNATURE_OK: return "Signature on OCSP response was found valid"; case Certificate_Status_Code::VALID_CRL_CHECKED: return "Valid CRL examined"; case Certificate_Status_Code::CERT_SERIAL_NEGATIVE: return "Certificate serial number is negative"; case Certificate_Status_Code::DN_TOO_LONG: return "Distinguished name too long"; case Certificate_Status_Code::NO_REVOCATION_DATA: return "No revocation data"; case Certificate_Status_Code::SIGNATURE_METHOD_TOO_WEAK: return "Signature method too weak"; case Certificate_Status_Code::UNTRUSTED_HASH: return "Hash function used is considered too weak for security"; case Certificate_Status_Code::CERT_NOT_YET_VALID: return "Certificate is not yet valid"; case Certificate_Status_Code::CERT_HAS_EXPIRED: return "Certificate has expired"; case Certificate_Status_Code::OCSP_NOT_YET_VALID: return "OCSP is not yet valid"; case Certificate_Status_Code::OCSP_HAS_EXPIRED: return "OCSP response has expired"; case Certificate_Status_Code::CRL_NOT_YET_VALID: return "CRL response is not yet valid"; case Certificate_Status_Code::CRL_HAS_EXPIRED: return "CRL has expired"; case Certificate_Status_Code::CERT_ISSUER_NOT_FOUND: return "Certificate issuer not found"; case Certificate_Status_Code::CANNOT_ESTABLISH_TRUST: return "Cannot establish trust"; case Certificate_Status_Code::CERT_CHAIN_LOOP: return "Loop in certificate chain"; case Certificate_Status_Code::CHAIN_LACKS_TRUST_ROOT: return "Certificate chain does not end in a CA certificate"; case Certificate_Status_Code::CHAIN_NAME_MISMATCH: return "Certificate issuer does not match subject of issuing cert"; case Certificate_Status_Code::POLICY_ERROR: return "Certificate policy error"; case Certificate_Status_Code::DUPLICATE_CERT_POLICY: return "Certificate contains duplicate policy"; case Certificate_Status_Code::INVALID_USAGE: return "Certificate does not allow the requested usage"; case Certificate_Status_Code::CERT_CHAIN_TOO_LONG: return "Certificate chain too long"; case Certificate_Status_Code::CA_CERT_NOT_FOR_CERT_ISSUER: return "CA certificate not allowed to issue certs"; case Certificate_Status_Code::CA_CERT_NOT_FOR_CRL_ISSUER: return "CA certificate not allowed to issue CRLs"; case Certificate_Status_Code::NO_MATCHING_CRLDP: return "No CRL with matching distribution point for certificate"; case Certificate_Status_Code::OCSP_CERT_NOT_LISTED: return "OCSP cert not listed"; case Certificate_Status_Code::OCSP_BAD_STATUS: return "OCSP bad status"; case Certificate_Status_Code::CERT_NAME_NOMATCH: return "Certificate does not match provided name"; case Certificate_Status_Code::NAME_CONSTRAINT_ERROR: return "Certificate does not pass name constraint"; case Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION: return "Unknown critical extension encountered"; case Certificate_Status_Code::DUPLICATE_CERT_EXTENSION: return "Duplicate certificate extension encountered"; case Certificate_Status_Code::EXT_IN_V1_V2_CERT: return "Encountered extension in certificate with version < 3"; case Certificate_Status_Code::OCSP_SIGNATURE_ERROR: return "OCSP signature error"; case Certificate_Status_Code::OCSP_ISSUER_NOT_FOUND: return "Unable to find certificate issusing OCSP response"; case Certificate_Status_Code::OCSP_RESPONSE_MISSING_KEYUSAGE: return "OCSP issuer's keyusage prohibits OCSP"; case Certificate_Status_Code::OCSP_RESPONSE_INVALID: return "OCSP parsing valid"; case Certificate_Status_Code::OCSP_NO_HTTP: return "OCSP requests not available, no HTTP support compiled in"; case Certificate_Status_Code::CERT_IS_REVOKED: return "Certificate is revoked"; case Certificate_Status_Code::CRL_BAD_SIGNATURE: return "CRL bad signature"; case Certificate_Status_Code::SIGNATURE_ERROR: return "Signature error"; case Certificate_Status_Code::CERT_PUBKEY_INVALID: return "Certificate public key invalid"; case Certificate_Status_Code::SIGNATURE_ALGO_UNKNOWN: return "Certificate signed with unknown/unavailable algorithm"; case Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS: return "Certificate signature has invalid parameters"; // intentionally no default so we are warned if new enum values are added } return nullptr; } } botan-2.4.0/src/lib/x509/cert_status.h000066400000000000000000000042561322470703100174010ustar00rootroot00000000000000/* * Path validation result enums * (C) 2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_PATH_RESULT_H_ #define BOTAN_X509_PATH_RESULT_H_ #include namespace Botan { /** * Certificate validation status code */ enum class Certificate_Status_Code { OK = 0, VERIFIED = 0, // Revocation status OCSP_RESPONSE_GOOD = 1, OCSP_SIGNATURE_OK = 2, VALID_CRL_CHECKED = 3, OCSP_NO_HTTP = 4, // Warnings FIRST_WARNING_STATUS = 500, CERT_SERIAL_NEGATIVE = 500, DN_TOO_LONG = 501, // Errors FIRST_ERROR_STATUS = 1000, SIGNATURE_METHOD_TOO_WEAK = 1000, UNTRUSTED_HASH = 1001, NO_REVOCATION_DATA = 1002, NO_MATCHING_CRLDP = 1003, // Time problems CERT_NOT_YET_VALID = 2000, CERT_HAS_EXPIRED = 2001, OCSP_NOT_YET_VALID = 2002, OCSP_HAS_EXPIRED = 2003, CRL_NOT_YET_VALID = 2004, CRL_HAS_EXPIRED = 2005, // Chain generation problems CERT_ISSUER_NOT_FOUND = 3000, CANNOT_ESTABLISH_TRUST = 3001, CERT_CHAIN_LOOP = 3002, CHAIN_LACKS_TRUST_ROOT = 3003, CHAIN_NAME_MISMATCH = 3004, // Validation errors POLICY_ERROR = 4000, INVALID_USAGE = 4001, CERT_CHAIN_TOO_LONG = 4002, CA_CERT_NOT_FOR_CERT_ISSUER = 4003, NAME_CONSTRAINT_ERROR = 4004, // Revocation errors CA_CERT_NOT_FOR_CRL_ISSUER = 4005, OCSP_CERT_NOT_LISTED = 4006, OCSP_BAD_STATUS = 4007, // Other problems CERT_NAME_NOMATCH = 4008, UNKNOWN_CRITICAL_EXTENSION = 4009, DUPLICATE_CERT_EXTENSION = 4010, OCSP_SIGNATURE_ERROR = 4501, OCSP_ISSUER_NOT_FOUND = 4502, OCSP_RESPONSE_MISSING_KEYUSAGE = 4503, OCSP_RESPONSE_INVALID = 4504, EXT_IN_V1_V2_CERT = 4505, DUPLICATE_CERT_POLICY = 4506, // Hard failures CERT_IS_REVOKED = 5000, CRL_BAD_SIGNATURE = 5001, SIGNATURE_ERROR = 5002, CERT_PUBKEY_INVALID = 5003, SIGNATURE_ALGO_UNKNOWN = 5004, SIGNATURE_ALGO_BAD_PARAMS = 5005 }; /** * Convert a status code to a human readable diagnostic message * @param code the certifcate status * @return string literal constant, or nullptr if code unknown */ BOTAN_PUBLIC_API(2,0) const char* to_string(Certificate_Status_Code code); } #endif botan-2.4.0/src/lib/x509/certstor.cpp000066400000000000000000000121731322470703100172360ustar00rootroot00000000000000/* * Certificate Store * (C) 1999-2010,2013 Jack Lloyd * (C) 2017 Fabian Weissberg, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { std::shared_ptr Certificate_Store::find_crl_for(const X509_Certificate&) const { return {}; } void Certificate_Store_In_Memory::add_certificate(const X509_Certificate& cert) { for(const auto& c : m_certs) if(*c == cert) return; m_certs.push_back(std::make_shared(cert)); } void Certificate_Store_In_Memory::add_certificate(std::shared_ptr cert) { for(const auto& c : m_certs) if(*c == *cert) return; m_certs.push_back(cert); } std::vector Certificate_Store_In_Memory::all_subjects() const { std::vector subjects; for(const auto& cert : m_certs) subjects.push_back(cert->subject_dn()); return subjects; } std::shared_ptr Certificate_Store_In_Memory::find_cert(const X509_DN& subject_dn, const std::vector& key_id) const { for(const auto& cert : m_certs) { // Only compare key ids if set in both call and in the cert if(key_id.size()) { std::vector skid = cert->subject_key_id(); if(skid.size() && skid != key_id) // no match continue; } if(cert->subject_dn() == subject_dn) return cert; } return nullptr; } std::vector> Certificate_Store_In_Memory::find_all_certs( const X509_DN& subject_dn, const std::vector& key_id) const { std::vector> matches; for(const auto& cert : m_certs) { if(key_id.size()) { std::vector skid = cert->subject_key_id(); if(skid.size() && skid != key_id) // no match continue; } if(cert->subject_dn() == subject_dn) matches.push_back(cert); } return matches; } std::shared_ptr Certificate_Store_In_Memory::find_cert_by_pubkey_sha1(const std::vector& key_hash) const { if(key_hash.size() != 20) throw Invalid_Argument("Certificate_Store_In_Memory::find_cert_by_pubkey_sha1 invalid hash"); std::unique_ptr hash(HashFunction::create("SHA-1")); for(const auto& cert : m_certs){ hash->update(cert->subject_public_key_bitstring()); if(key_hash == hash->final_stdvec()) //final_stdvec also clears the hash to initial state return cert; } return nullptr; } std::shared_ptr Certificate_Store_In_Memory::find_cert_by_raw_subject_dn_sha256(const std::vector& subject_hash) const { if(subject_hash.size() != 32) throw Invalid_Argument("Certificate_Store_In_Memory::find_cert_by_raw_subject_dn_sha256 invalid hash"); std::unique_ptr hash(HashFunction::create("SHA-256")); for(const auto& cert : m_certs){ hash->update(cert->raw_subject_dn()); if(subject_hash == hash->final_stdvec()) //final_stdvec also clears the hash to initial state return cert; } return nullptr; } void Certificate_Store_In_Memory::add_crl(const X509_CRL& crl) { std::shared_ptr crl_s = std::make_shared(crl); return add_crl(crl_s); } void Certificate_Store_In_Memory::add_crl(std::shared_ptr crl) { X509_DN crl_issuer = crl->issuer_dn(); for(auto& c : m_crls) { // Found an update of a previously existing one; replace it if(c->issuer_dn() == crl_issuer) { if(c->this_update() <= crl->this_update()) c = crl; return; } } // Totally new CRL, add to the list m_crls.push_back(crl); } std::shared_ptr Certificate_Store_In_Memory::find_crl_for(const X509_Certificate& subject) const { const std::vector& key_id = subject.authority_key_id(); for(const auto& c : m_crls) { // Only compare key ids if set in both call and in the CRL if(key_id.size()) { std::vector akid = c->authority_key_id(); if(akid.size() && akid != key_id) // no match continue; } if(c->issuer_dn() == subject.issuer_dn()) return c; } return {}; } Certificate_Store_In_Memory::Certificate_Store_In_Memory(const X509_Certificate& cert) { add_certificate(cert); } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) Certificate_Store_In_Memory::Certificate_Store_In_Memory(const std::string& dir) { if(dir.empty()) return; std::vector maybe_certs = get_files_recursive(dir); for(auto&& cert_file : maybe_certs) { try { m_certs.push_back(std::make_shared(cert_file)); } catch(std::exception&) { } } } #endif } botan-2.4.0/src/lib/x509/certstor.h000066400000000000000000000122701322470703100167010ustar00rootroot00000000000000/* * Certificate Store * (C) 1999-2010,2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CERT_STORE_H_ #define BOTAN_CERT_STORE_H_ #include #include namespace Botan { /** * Certificate Store Interface */ class BOTAN_PUBLIC_API(2,0) Certificate_Store { public: virtual ~Certificate_Store() = default; /** * Find a certificate by Subject DN and (optionally) key identifier * @param subject_dn the subject's distinguished name * @param key_id an optional key id * @return a matching certificate or nullptr otherwise */ virtual std::shared_ptr find_cert(const X509_DN& subject_dn, const std::vector& key_id) const = 0; /** * Find all certificates with a given Subject DN. * Subject DN and even the key identifier might not be unique. */ virtual std::vector> find_all_certs( const X509_DN& subject_dn, const std::vector& key_id) const = 0; /** * Find a certificate by searching for one with a matching SHA-1 hash of * public key. Used for OCSP. * @param key_hash SHA-1 hash of the subject's public key * @return a matching certificate or nullptr otherwise */ virtual std::shared_ptr find_cert_by_pubkey_sha1(const std::vector& key_hash) const = 0; /** * Find a certificate by searching for one with a matching SHA-256 hash of * raw subject name. Used for OCSP. * @param subject_hash SHA-256 hash of the subject's raw name * @return a matching certificate or nullptr otherwise */ virtual std::shared_ptr find_cert_by_raw_subject_dn_sha256(const std::vector& subject_hash) const = 0; /** * Finds a CRL for the given certificate * @param subject the subject certificate * @return the CRL for subject or nullptr otherwise */ virtual std::shared_ptr find_crl_for(const X509_Certificate& subject) const; /** * @return whether the certificate is known * @param cert certififcate to be searched */ bool certificate_known(const X509_Certificate& cert) const { return find_cert(cert.subject_dn(), cert.subject_key_id()) != nullptr; } // remove this (used by TLS::Server) virtual std::vector all_subjects() const = 0; }; /** * In Memory Certificate Store */ class BOTAN_PUBLIC_API(2,0) Certificate_Store_In_Memory final : public Certificate_Store { public: /** * Attempt to parse all files in dir (including subdirectories) * as certificates. Ignores errors. */ explicit Certificate_Store_In_Memory(const std::string& dir); /** * Adds given certificate to the store. */ explicit Certificate_Store_In_Memory(const X509_Certificate& cert); /** * Create an empty store. */ Certificate_Store_In_Memory() = default; /** * Add a certificate to the store. * @param cert certificate to be added */ void add_certificate(const X509_Certificate& cert); /** * Add a certificate already in a shared_ptr to the store. * @param cert certificate to be added */ void add_certificate(std::shared_ptr cert); /** * Add a certificate revocation list (CRL) to the store. * @param crl CRL to be added */ void add_crl(const X509_CRL& crl); /** * Add a certificate revocation list (CRL) to the store as a shared_ptr * @param crl CRL to be added */ void add_crl(std::shared_ptr crl); /** * @return DNs for all certificates managed by the store */ std::vector all_subjects() const override; /* * Find a certificate by Subject DN and (optionally) key identifier * @return the first certificate that matches */ std::shared_ptr find_cert( const X509_DN& subject_dn, const std::vector& key_id) const override; /* * Find all certificates with a given Subject DN. * Subject DN and even the key identifier might not be unique. */ std::vector> find_all_certs( const X509_DN& subject_dn, const std::vector& key_id) const override; std::shared_ptr find_cert_by_pubkey_sha1(const std::vector& key_hash) const override; std::shared_ptr find_cert_by_raw_subject_dn_sha256(const std::vector& subject_hash) const override; /** * Finds a CRL for the given certificate */ std::shared_ptr find_crl_for(const X509_Certificate& subject) const override; private: // TODO: Add indexing on the DN and key id to avoid linear search std::vector> m_certs; std::vector> m_crls; }; } #endif botan-2.4.0/src/lib/x509/certstor_sql/000077500000000000000000000000001322470703100174055ustar00rootroot00000000000000botan-2.4.0/src/lib/x509/certstor_sql/certstor_sql.cpp000066400000000000000000000253171322470703100226450ustar00rootroot00000000000000/* * Certificate Store in SQL * (C) 2016 Kai Michaelis, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { Certificate_Store_In_SQL::Certificate_Store_In_SQL(std::shared_ptr db, const std::string& passwd, RandomNumberGenerator& rng, const std::string& table_prefix) : m_rng(rng), m_database(db), m_prefix(table_prefix), m_password(passwd) { m_database->create_table("CREATE TABLE IF NOT EXISTS " + m_prefix + "certificates ( \ fingerprint BLOB PRIMARY KEY, \ subject_dn BLOB, \ key_id BLOB, \ priv_fingerprint BLOB, \ certificate BLOB UNIQUE NOT NULL\ )"); m_database->create_table("CREATE TABLE IF NOT EXISTS " + m_prefix + "keys (\ fingerprint BLOB PRIMARY KEY, \ key BLOB UNIQUE NOT NULL \ )"); m_database->create_table("CREATE TABLE IF NOT EXISTS " + m_prefix + "revoked (\ fingerprint BLOB PRIMARY KEY, \ reason BLOB NOT NULL, \ time BLOB NOT NULL \ )"); } // Certificate handling std::shared_ptr Certificate_Store_In_SQL::find_cert(const X509_DN& subject_dn, const std::vector& key_id) const { DER_Encoder enc; std::shared_ptr stmt; subject_dn.encode_into(enc); if(key_id.empty()) { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE subject_dn == ?1"); stmt->bind(1,enc.get_contents_unlocked()); } else { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE\ subject_dn == ?1 AND (key_id == NULL OR key_id == ?2)"); stmt->bind(1,enc.get_contents_unlocked()); stmt->bind(2,key_id); } std::shared_ptr cert; while(stmt->step()) { auto blob = stmt->get_blob(0); cert = std::make_shared( std::vector(blob.first,blob.first + blob.second)); } return cert; } std::vector> Certificate_Store_In_SQL::find_all_certs(const X509_DN& subject_dn, const std::vector& key_id) const { std::vector> certs; DER_Encoder enc; std::shared_ptr stmt; subject_dn.encode_into(enc); if(key_id.empty()) { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE subject_dn == ?1"); stmt->bind(1,enc.get_contents_unlocked()); } else { stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE\ subject_dn == ?1 AND (key_id == NULL OR key_id == ?2)"); stmt->bind(1,enc.get_contents_unlocked()); stmt->bind(2,key_id); } std::shared_ptr cert; while(stmt->step()) { auto blob = stmt->get_blob(0); certs.push_back(std::make_shared( std::vector(blob.first,blob.first + blob.second))); } return certs; } std::shared_ptr Certificate_Store_In_SQL::find_cert_by_pubkey_sha1(const std::vector& /*key_hash*/) const { throw Not_Implemented("TODO!"); } std::shared_ptr Certificate_Store_In_SQL::find_cert_by_raw_subject_dn_sha256(const std::vector& /*subject_hash*/) const { throw Not_Implemented("TODO!"); } std::shared_ptr Certificate_Store_In_SQL::find_crl_for(const X509_Certificate& subject) const { auto all_crls = generate_crls(); for(auto crl: all_crls) { if(!crl.get_revoked().empty() && crl.issuer_dn() == subject.issuer_dn()) return std::shared_ptr(new X509_CRL(crl)); } return std::shared_ptr(); } std::vector Certificate_Store_In_SQL::all_subjects() const { std::vector ret; auto stmt = m_database->new_statement("SELECT subject_dn FROM " + m_prefix + "certificates"); while(stmt->step()) { auto blob = stmt->get_blob(0); BER_Decoder dec(blob.first,blob.second); X509_DN dn; dn.decode_from(dec); ret.push_back(dn); } return ret; } bool Certificate_Store_In_SQL::insert_cert(const X509_Certificate& cert) { DER_Encoder enc; auto stmt = m_database->new_statement("INSERT OR REPLACE INTO " + m_prefix + "certificates (\ fingerprint, \ subject_dn, \ key_id, \ priv_fingerprint, \ certificate \ ) VALUES ( ?1, ?2, ?3, ?4, ?5 )"); stmt->bind(1,cert.fingerprint("SHA-256")); cert.subject_dn().encode_into(enc); stmt->bind(2,enc.get_contents_unlocked()); stmt->bind(3,cert.subject_key_id()); stmt->bind(4,std::vector()); enc = DER_Encoder(); cert.encode_into(enc); stmt->bind(5,enc.get_contents_unlocked()); stmt->spin(); return true; } bool Certificate_Store_In_SQL::remove_cert(const X509_Certificate& cert) { if(!find_cert(cert.subject_dn(),cert.subject_key_id())) return false; auto stmt = m_database->new_statement("DELETE FROM " + m_prefix + "certificates WHERE fingerprint == ?1"); stmt->bind(1,cert.fingerprint("SHA-256")); stmt->spin(); return true; } // Private key handling std::shared_ptr Certificate_Store_In_SQL::find_key(const X509_Certificate& cert) const { auto stmt = m_database->new_statement("SELECT key FROM " + m_prefix + "keys " "JOIN " + m_prefix + "certificates ON " + m_prefix + "keys.fingerprint == " + m_prefix + "certificates.priv_fingerprint " "WHERE " + m_prefix + "certificates.fingerprint == ?1"); stmt->bind(1,cert.fingerprint("SHA-256")); std::shared_ptr key; while(stmt->step()) { auto blob = stmt->get_blob(0); DataSource_Memory src(blob.first,blob.second); key.reset(PKCS8::load_key(src, m_rng, m_password)); } return key; } std::vector> Certificate_Store_In_SQL::find_certs_for_key(const Private_Key& key) const { auto fpr = key.fingerprint_private("SHA-256"); auto stmt = m_database->new_statement("SELECT certificate FROM " + m_prefix + "certificates WHERE priv_fingerprint == ?1"); stmt->bind(1,fpr); std::vector> certs; while(stmt->step()) { auto blob = stmt->get_blob(0); certs.push_back(std::make_shared( std::vector(blob.first,blob.first + blob.second))); } return certs; } bool Certificate_Store_In_SQL::insert_key(const X509_Certificate& cert, const Private_Key& key) { insert_cert(cert); if(find_key(cert)) return false; auto pkcs8 = PKCS8::BER_encode(key, m_rng, m_password); auto fpr = key.fingerprint_private("SHA-256"); auto stmt1 = m_database->new_statement( "INSERT OR REPLACE INTO " + m_prefix + "keys ( fingerprint, key ) VALUES ( ?1, ?2 )"); stmt1->bind(1,fpr); stmt1->bind(2,pkcs8.data(),pkcs8.size()); stmt1->spin(); auto stmt2 = m_database->new_statement( "UPDATE " + m_prefix + "certificates SET priv_fingerprint = ?1 WHERE fingerprint == ?2"); stmt2->bind(1,fpr); stmt2->bind(2,cert.fingerprint("SHA-256")); stmt2->spin(); return true; } void Certificate_Store_In_SQL::remove_key(const Private_Key& key) { auto fpr = key.fingerprint_private("SHA-256"); auto stmt = m_database->new_statement("DELETE FROM " + m_prefix + "keys WHERE fingerprint == ?1"); stmt->bind(1,fpr); stmt->spin(); } // Revocation void Certificate_Store_In_SQL::revoke_cert(const X509_Certificate& cert, CRL_Code code, const X509_Time& time) { insert_cert(cert); auto stmt1 = m_database->new_statement( "INSERT OR REPLACE INTO " + m_prefix + "revoked ( fingerprint, reason, time ) VALUES ( ?1, ?2, ?3 )"); stmt1->bind(1,cert.fingerprint("SHA-256")); stmt1->bind(2,code); if(time.time_is_set()) { DER_Encoder der; time.encode_into(der); stmt1->bind(3,der.get_contents_unlocked()); } else { stmt1->bind(3,-1); } stmt1->spin(); } void Certificate_Store_In_SQL::affirm_cert(const X509_Certificate& cert) { auto stmt = m_database->new_statement("DELETE FROM " + m_prefix + "revoked WHERE fingerprint == ?1"); stmt->bind(1,cert.fingerprint("SHA-256")); stmt->spin(); } std::vector Certificate_Store_In_SQL::generate_crls() const { auto stmt = m_database->new_statement( "SELECT certificate,reason,time FROM " + m_prefix + "revoked " "JOIN " + m_prefix + "certificates ON " + m_prefix + "certificates.fingerprint == " + m_prefix + "revoked.fingerprint"); std::map> crls; while(stmt->step()) { auto blob = stmt->get_blob(0); auto cert = X509_Certificate( std::vector(blob.first,blob.first + blob.second)); auto code = static_cast(stmt->get_size_t(1)); auto ent = CRL_Entry(cert,code); auto i = crls.find(cert.issuer_dn()); if(i == crls.end()) { crls.insert(std::make_pair(cert.issuer_dn(),std::vector({ent}))); } else { i->second.push_back(ent); } } std::vector ret; X509_Time t(std::chrono::system_clock::now()); for(auto p: crls) { ret.push_back(X509_CRL(p.first,t,t,p.second)); } return ret; } } botan-2.4.0/src/lib/x509/certstor_sql/certstor_sql.h000066400000000000000000000100051322470703100222760ustar00rootroot00000000000000/* * Certificate Store in SQL * (C) 2016 Kai Michaelis, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CERT_STORE_SQL_H_ #define BOTAN_CERT_STORE_SQL_H_ #include #include #include #include #include namespace Botan { class Private_Key; class RandomNumberGenerator; /** * Certificate and private key store backed by an SQL database. */ class BOTAN_PUBLIC_API(2,0) Certificate_Store_In_SQL : public Certificate_Store { public: /** * Create/open a certificate store. * @param db underlying database storage * @param passwd password to encrypt private keys in the database * @param rng used for encrypting keys * @param table_prefix optional prefix for db table names */ explicit Certificate_Store_In_SQL(const std::shared_ptr db, const std::string& passwd, RandomNumberGenerator& rng, const std::string& table_prefix = ""); /** * Returns the first certificate with matching subject DN and optional key ID. */ std::shared_ptr find_cert(const X509_DN& subject_dn, const std::vector& key_id) const override; /* * Find all certificates with a given Subject DN. * Subject DN and even the key identifier might not be unique. */ std::vector> find_all_certs( const X509_DN& subject_dn, const std::vector& key_id) const override; std::shared_ptr find_cert_by_pubkey_sha1(const std::vector& key_hash) const override; std::shared_ptr find_cert_by_raw_subject_dn_sha256(const std::vector& subject_hash) const override; /** * Returns all subject DNs known to the store instance. */ std::vector all_subjects() const override; /** * Inserts "cert" into the store, returns false if the certificate is * already known and true if insertion was successful. */ bool insert_cert(const X509_Certificate& cert); /** * Removes "cert" from the store. Returns false if the certificate could not * be found and true if removal was successful. */ bool remove_cert(const X509_Certificate& cert); /// Returns the private key for "cert" or an empty shared_ptr if none was found. std::shared_ptr find_key(const X509_Certificate&) const; /// Returns all certificates for private key "key". std::vector> find_certs_for_key(const Private_Key& key) const; /** * Inserts "key" for "cert" into the store, returns false if the key is * already known and true if insertion was successful. */ bool insert_key(const X509_Certificate& cert, const Private_Key& key); /// Removes "key" from the store. void remove_key(const Private_Key& key); /// Marks "cert" as revoked starting from "time". void revoke_cert(const X509_Certificate&, CRL_Code, const X509_Time& time = X509_Time()); /// Reverses the revokation for "cert". void affirm_cert(const X509_Certificate&); /** * Generates Certificate Revocation Lists for all certificates marked as revoked. * A CRL is returned for each unique issuer DN. */ std::vector generate_crls() const; /** * Generates a CRL for all certificates issued by the given issuer. */ std::shared_ptr find_crl_for(const X509_Certificate& issuer) const override; private: RandomNumberGenerator& m_rng; std::shared_ptr m_database; std::string m_prefix; std::string m_password; mutex_type m_mutex; }; } #endif botan-2.4.0/src/lib/x509/certstor_sql/info.txt000066400000000000000000000000561322470703100211020ustar00rootroot00000000000000 CERTSTOR_SQL -> 20160818 botan-2.4.0/src/lib/x509/certstor_sqlite3/000077500000000000000000000000001322470703100201725ustar00rootroot00000000000000botan-2.4.0/src/lib/x509/certstor_sqlite3/certstor_sqlite.cpp000066400000000000000000000012731322470703100241270ustar00rootroot00000000000000/* * Certificate Store in SQL * (C) 2016 Kai Michaelis, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { Certificate_Store_In_SQLite::Certificate_Store_In_SQLite(const std::string& db_path, const std::string& passwd, RandomNumberGenerator& rng, const std::string& table_prefix) : Certificate_Store_In_SQL(std::make_shared(db_path), passwd, rng, table_prefix) {} } botan-2.4.0/src/lib/x509/certstor_sqlite3/certstor_sqlite.h000066400000000000000000000020341322470703100235700ustar00rootroot00000000000000/* * Certificate Store in SQL * (C) 2016 Kai Michaelis, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CERT_STORE_SQLITE_H_ #define BOTAN_CERT_STORE_SQLITE_H_ #include namespace Botan { /** * Certificate and private key store backed by an sqlite (https://sqlite.org) database. */ class BOTAN_PUBLIC_API(2,0) Certificate_Store_In_SQLite final : public Certificate_Store_In_SQL { public: /** * Create/open a certificate store. * @param db_path path to the database file * @param passwd password to encrypt private keys in the database * @param rng used for encrypting keys * @param table_prefix optional prefix for db table names */ Certificate_Store_In_SQLite(const std::string& db_path, const std::string& passwd, RandomNumberGenerator& rng, const std::string& table_prefix = ""); }; } #endif botan-2.4.0/src/lib/x509/certstor_sqlite3/info.txt000066400000000000000000000001371322470703100216670ustar00rootroot00000000000000 CERTSTOR_SQLITE3 -> 20160818 certstor_sql sqlite3 botan-2.4.0/src/lib/x509/crl_ent.cpp000066400000000000000000000054511322470703100170200ustar00rootroot00000000000000/* * CRL Entry * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { struct CRL_Entry_Data { std::vector m_serial; X509_Time m_time; CRL_Code m_reason = UNSPECIFIED; Extensions m_extensions; }; /* * Create a CRL_Entry */ CRL_Entry::CRL_Entry(const X509_Certificate& cert, CRL_Code why) { m_data.reset(new CRL_Entry_Data); m_data->m_serial = cert.serial_number(); m_data->m_time = X509_Time(std::chrono::system_clock::now()); m_data->m_reason = why; if(why != UNSPECIFIED) { m_data->m_extensions.add(new Cert_Extension::CRL_ReasonCode(why)); } } /* * Compare two CRL_Entrys for equality */ bool operator==(const CRL_Entry& a1, const CRL_Entry& a2) { if(a1.serial_number() != a2.serial_number()) return false; if(a1.expire_time() != a2.expire_time()) return false; if(a1.reason_code() != a2.reason_code()) return false; return true; } /* * Compare two CRL_Entrys for inequality */ bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2) { return !(a1 == a2); } /* * DER encode a CRL_Entry */ void CRL_Entry::encode_into(DER_Encoder& der) const { der.start_cons(SEQUENCE) .encode(BigInt::decode(serial_number())) .encode(expire_time()) .start_cons(SEQUENCE) .encode(extensions()) .end_cons() .end_cons(); } /* * Decode a BER encoded CRL_Entry */ void CRL_Entry::decode_from(BER_Decoder& source) { BigInt serial_number_bn; std::unique_ptr data(new CRL_Entry_Data); BER_Decoder entry = source.start_cons(SEQUENCE); entry.decode(serial_number_bn).decode(data->m_time); data->m_serial = BigInt::encode(serial_number_bn); if(entry.more_items()) { entry.decode(data->m_extensions); if(auto ext = data->m_extensions.get_extension_object_as()) { data->m_reason = ext->get_reason(); } else { data->m_reason = UNSPECIFIED; } } entry.end_cons(); m_data.reset(data.release()); } const CRL_Entry_Data& CRL_Entry::data() const { if(!m_data) { throw Invalid_State("CRL_Entry_Data uninitialized"); } return *m_data.get(); } const std::vector& CRL_Entry::serial_number() const { return data().m_serial; } const X509_Time& CRL_Entry::expire_time() const { return data().m_time; } CRL_Code CRL_Entry::reason_code() const { return data().m_reason; } const Extensions& CRL_Entry::extensions() const { return data().m_extensions; } } botan-2.4.0/src/lib/x509/crl_ent.h000066400000000000000000000045341322470703100164660ustar00rootroot00000000000000/* * CRL Entry * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_CRL_ENTRY_H_ #define BOTAN_CRL_ENTRY_H_ #include namespace Botan { class Extensions; class X509_Certificate; struct CRL_Entry_Data; /** * X.509v2 CRL Reason Code. */ enum CRL_Code : uint32_t { UNSPECIFIED = 0, KEY_COMPROMISE = 1, CA_COMPROMISE = 2, AFFILIATION_CHANGED = 3, SUPERSEDED = 4, CESSATION_OF_OPERATION = 5, CERTIFICATE_HOLD = 6, REMOVE_FROM_CRL = 8, PRIVLEDGE_WITHDRAWN = 9, AA_COMPROMISE = 10, DELETE_CRL_ENTRY = 0xFF00, OCSP_GOOD = 0xFF01, OCSP_UNKNOWN = 0xFF02 }; /** * This class represents CRL entries */ class BOTAN_PUBLIC_API(2,0) CRL_Entry final : public ASN1_Object { public: void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; /** * Get the serial number of the certificate associated with this entry. * @return certificate's serial number */ const std::vector& serial_number() const; /** * Get the revocation date of the certificate associated with this entry * @return certificate's revocation date */ const X509_Time& expire_time() const; /** * Get the entries reason code * @return reason code */ CRL_Code reason_code() const; /** * Get the extensions on this CRL entry */ const Extensions& extensions() const; /** * Create uninitialized CRL_Entry object */ CRL_Entry() = default; /** * Construct an CRL entry. * @param cert the certificate to revoke * @param reason the reason code to set in the entry */ CRL_Entry(const X509_Certificate& cert, CRL_Code reason = UNSPECIFIED); private: friend class X509_CRL; const CRL_Entry_Data& data() const; std::shared_ptr m_data; }; /** * Test two CRL entries for equality in all fields. */ BOTAN_PUBLIC_API(2,0) bool operator==(const CRL_Entry&, const CRL_Entry&); /** * Test two CRL entries for inequality in at least one field. */ BOTAN_PUBLIC_API(2,0) bool operator!=(const CRL_Entry&, const CRL_Entry&); } #endif botan-2.4.0/src/lib/x509/datastor.cpp000066400000000000000000000110301322470703100172010ustar00rootroot00000000000000/* * Data Store * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { /* * Data_Store Equality Comparison */ bool Data_Store::operator==(const Data_Store& other) const { return (m_contents == other.m_contents); } /* * Check if this key has at least one value */ bool Data_Store::has_value(const std::string& key) const { return (m_contents.lower_bound(key) != m_contents.end()); } /* * Search based on an arbitrary predicate */ std::multimap Data_Store::search_for( std::function predicate) const { std::multimap out; for(auto i = m_contents.begin(); i != m_contents.end(); ++i) if(predicate(i->first, i->second)) out.insert(std::make_pair(i->first, i->second)); return out; } /* * Search based on key equality */ std::vector Data_Store::get(const std::string& looking_for) const { std::vector out; auto range = m_contents.equal_range(looking_for); for(auto i = range.first; i != range.second; ++i) out.push_back(i->second); return out; } /* * Get a single atom */ std::string Data_Store::get1(const std::string& key) const { std::vector vals = get(key); if(vals.empty()) throw Invalid_State("Data_Store::get1: No values set for " + key); if(vals.size() > 1) throw Invalid_State("Data_Store::get1: More than one value for " + key); return vals[0]; } std::string Data_Store::get1(const std::string& key, const std::string& default_value) const { std::vector vals = get(key); if(vals.size() > 1) throw Invalid_State("Data_Store::get1: More than one value for " + key); if(vals.empty()) return default_value; return vals[0]; } /* * Get a single std::vector atom */ std::vector Data_Store::get1_memvec(const std::string& key) const { std::vector vals = get(key); if(vals.empty()) return std::vector(); if(vals.size() > 1) throw Invalid_State("Data_Store::get1_memvec: Multiple values for " + key); return hex_decode(vals[0]); } /* * Get a single uint32_t atom */ uint32_t Data_Store::get1_uint32(const std::string& key, uint32_t default_val) const { std::vector vals = get(key); if(vals.empty()) return default_val; else if(vals.size() > 1) throw Invalid_State("Data_Store::get1_uint32: Multiple values for " + key); return to_u32bit(vals[0]); } /* * Insert a single key and value */ void Data_Store::add(const std::string& key, const std::string& val) { multimap_insert(m_contents, key, val); } /* * Insert a single key and value */ void Data_Store::add(const std::string& key, uint32_t val) { add(key, std::to_string(val)); } /* * Insert a single key and value */ void Data_Store::add(const std::string& key, const secure_vector& val) { add(key, hex_encode(val.data(), val.size())); } void Data_Store::add(const std::string& key, const std::vector& val) { add(key, hex_encode(val.data(), val.size())); } /* * Insert a mapping of key/value pairs */ void Data_Store::add(const std::multimap& in) { std::multimap::const_iterator i = in.begin(); while(i != in.end()) { m_contents.insert(*i); ++i; } } /* * Create and populate a X509_DN */ X509_DN create_dn(const Data_Store& info) { auto names = info.search_for( [](const std::string& key, const std::string&) { return (key.find("X520.") != std::string::npos); }); X509_DN dn; for(auto i = names.begin(); i != names.end(); ++i) dn.add_attribute(i->first, i->second); return dn; } /* * Create and populate an AlternativeName */ AlternativeName create_alt_name(const Data_Store& info) { auto names = info.search_for( [](const std::string& key, const std::string&) { return (key == "RFC822" || key == "DNS" || key == "URI" || key == "IP"); }); AlternativeName alt_name; for(auto i = names.begin(); i != names.end(); ++i) alt_name.add_attribute(i->first, i->second); return alt_name; } } botan-2.4.0/src/lib/x509/datastor.h000066400000000000000000000043241322470703100166560ustar00rootroot00000000000000/* * Data Store * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_DATA_STORE_H_ #define BOTAN_DATA_STORE_H_ #include #include #include #include #include #include namespace Botan { /** * Data Store * * This class is used internally by the library, and exposed for ABI * reasons. There is no reason for applications to use this type directly. * It will be removed in a future major release. */ class BOTAN_UNSTABLE_API Data_Store final { public: /** * A search function */ bool operator==(const Data_Store&) const; std::multimap search_for( std::function predicate) const; std::vector get(const std::string&) const; std::string get1(const std::string& key) const; std::string get1(const std::string& key, const std::string& default_value) const; std::vector get1_memvec(const std::string&) const; uint32_t get1_uint32(const std::string&, uint32_t = 0) const; bool has_value(const std::string&) const; void add(const std::multimap&); void add(const std::string&, const std::string&); void add(const std::string&, uint32_t); void add(const std::string&, const secure_vector&); void add(const std::string&, const std::vector&); private: std::multimap m_contents; }; /* * Data Store Extraction Operations */ /* * Create and populate a X509_DN * @param info data store containing DN information * @return DN containing attributes from data store */ BOTAN_PUBLIC_API(2,0) X509_DN BOTAN_DEPRECATED("Avoid roundtripping names through Data_Store") create_dn(const Data_Store& info); /* * Create and populate an AlternativeName * @param info data store containing AlternativeName information * @return AlternativeName containing attributes from data store */ BOTAN_PUBLIC_API(2,0) AlternativeName BOTAN_DEPRECATED("Avoid roundtripping names through Data_Store") create_alt_name(const Data_Store& info); } #endif botan-2.4.0/src/lib/x509/info.txt000066400000000000000000000001651322470703100163570ustar00rootroot00000000000000 X509_CERTIFICATES -> 20151023 OCSP -> 20161118 asn1 pubkey sha1 sha2_32 botan-2.4.0/src/lib/x509/key_constraint.cpp000066400000000000000000000045731322470703100204320ustar00rootroot00000000000000/* * KeyUsage * (C) 1999-2007,2016 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace Botan { std::string key_constraints_to_string(Key_Constraints constraints) { std::vector str; if(constraints == NO_CONSTRAINTS) return "no_constraints"; if(constraints & DIGITAL_SIGNATURE) str.push_back("digital_signature"); if(constraints & NON_REPUDIATION) str.push_back("non_repudiation"); if(constraints & KEY_ENCIPHERMENT) str.push_back("key_encipherment"); if(constraints & DATA_ENCIPHERMENT) str.push_back("data_encipherment"); if(constraints & KEY_AGREEMENT) str.push_back("key_agreement"); if(constraints & KEY_CERT_SIGN) str.push_back("key_cert_sign"); if(constraints & CRL_SIGN) str.push_back("crl_sign"); if(constraints & ENCIPHER_ONLY) str.push_back("encipher_only"); if(constraints & DECIPHER_ONLY) str.push_back("decipher_only"); // Not 0 (checked at start) but nothing matched above! if(str.empty()) return "other_unknown_constraints"; if(str.size() == 1) return str[0]; std::string out; for(size_t i = 0; i < str.size() - 1; ++i) { out += str[i]; out += ','; } out += str[str.size() - 1]; return out; } /* * Make sure the given key constraints are permitted for the given key type */ void verify_cert_constraints_valid_for_key_type(const Public_Key& pub_key, Key_Constraints constraints) { const std::string name = pub_key.algo_name(); size_t permitted = 0; if(name == "DH" || name == "ECDH") { permitted |= KEY_AGREEMENT | ENCIPHER_ONLY | DECIPHER_ONLY; } if(name == "RSA" || name == "ElGamal") { permitted |= KEY_ENCIPHERMENT | DATA_ENCIPHERMENT; } if(name == "RSA" || name == "DSA" || name == "ECDSA" || name == "ECGDSA" || name == "ECKCDSA" || name == "GOST-34.10") { permitted |= DIGITAL_SIGNATURE | NON_REPUDIATION | KEY_CERT_SIGN | CRL_SIGN; } if((constraints & permitted) != constraints) { throw Exception("Invalid " + name + " constraints " + key_constraints_to_string(constraints)); } } } botan-2.4.0/src/lib/x509/key_constraint.h000066400000000000000000000024321322470703100200670ustar00rootroot00000000000000/* * Enumerations * (C) 1999-2007 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_ENUMS_H_ #define BOTAN_ENUMS_H_ #include #include namespace Botan { /** * X.509v3 Key Constraints. * If updating update copy in ffi.h */ enum Key_Constraints { NO_CONSTRAINTS = 0, DIGITAL_SIGNATURE = 1 << 15, NON_REPUDIATION = 1 << 14, KEY_ENCIPHERMENT = 1 << 13, DATA_ENCIPHERMENT = 1 << 12, KEY_AGREEMENT = 1 << 11, KEY_CERT_SIGN = 1 << 10, CRL_SIGN = 1 << 9, ENCIPHER_ONLY = 1 << 8, DECIPHER_ONLY = 1 << 7 }; class Public_Key; /** * Check that key constraints are permitted for a specific public key. * @param pub_key the public key on which the constraints shall be enforced on * @param constraints the constraints that shall be enforced on the key * @throw Exception if the given constraints are not permitted for this key */ BOTAN_PUBLIC_API(2,0) void verify_cert_constraints_valid_for_key_type(const Public_Key& pub_key, Key_Constraints constraints); std::string BOTAN_PUBLIC_API(2,0) key_constraints_to_string(Key_Constraints); } #endif botan-2.4.0/src/lib/x509/name_constraint.cpp000066400000000000000000000143311322470703100205530ustar00rootroot00000000000000/* * X.509 Name Constraint * (C) 2015 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include namespace Botan { class DER_Encoder; GeneralName::GeneralName(const std::string& str) : GeneralName() { size_t p = str.find(':'); if(p != std::string::npos) { m_type = str.substr(0, p); m_name = str.substr(p + 1, std::string::npos); } else { throw Invalid_Argument("Failed to decode Name Constraint"); } } void GeneralName::encode_into(DER_Encoder&) const { throw Not_Implemented("GeneralName encoding"); } void GeneralName::decode_from(class BER_Decoder& ber) { BER_Object obj = ber.get_next_object(); if((obj.class_tag != CONTEXT_SPECIFIC) && (obj.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED))) throw Decoding_Error("Invalid class tag while decoding GeneralName"); const ASN1_Tag tag = obj.type_tag; if(tag == 1 || tag == 2 || tag == 6) { m_name = ASN1::to_string(obj); if(tag == 1) { m_type = "RFC822"; } else if(tag == 2) { m_type = "DNS"; } else if(tag == 6) { m_type = "URI"; } } else if(tag == 4) { X509_DN dn; BER_Decoder dec(obj.value); std::stringstream ss; dn.decode_from(dec); ss << dn; m_name = ss.str(); m_type = "DN"; } else if(tag == 7) { if(obj.value.size() == 8) { const std::vector ip(obj.value.begin(), obj.value.begin() + 4); const std::vector net(obj.value.begin() + 4, obj.value.end()); m_type = "IP"; m_name = ipv4_to_string(load_be(ip.data(), 0)) + "/" + ipv4_to_string(load_be(net.data(), 0)); } else if(obj.value.size() == 32) { throw Decoding_Error("Unsupported IPv6 name constraint"); } else { throw Decoding_Error("Invalid IP name constraint size " + std::to_string(obj.value.size())); } } else { throw Decoding_Error("Found unknown GeneralName type"); } } GeneralName::MatchResult GeneralName::matches(const X509_Certificate& cert) const { std::vector nam; std::function match_fn; const X509_DN& dn = cert.subject_dn(); const AlternativeName& alt_name = cert.subject_alt_name(); if(type() == "DNS") { match_fn = std::mem_fn(&GeneralName::matches_dns); nam = alt_name.get_attribute("DNS"); if(nam.empty()) { nam = dn.get_attribute("CN"); } } else if(type() == "DN") { match_fn = std::mem_fn(&GeneralName::matches_dn); std::stringstream ss; ss << dn; nam.push_back(ss.str()); } else if(type() == "IP") { match_fn = std::mem_fn(&GeneralName::matches_ip); nam = alt_name.get_attribute("IP"); } else { return MatchResult::UnknownType; } if(nam.empty()) { return MatchResult::NotFound; } bool some = false; bool all = true; for(const std::string& n: nam) { bool m = match_fn(this, n); some |= m; all &= m; } if(all) { return MatchResult::All; } else if(some) { return MatchResult::Some; } else { return MatchResult::None; } } bool GeneralName::matches_dns(const std::string& nam) const { if(nam.size() == name().size()) { return nam == name(); } else if(name().size() > nam.size()) { return false; } else // name.size() < nam.size() { std::string constr = name().front() == '.' ? name() : "." + name(); // constr is suffix of nam return constr == nam.substr(nam.size() - constr.size(), constr.size()); } } bool GeneralName::matches_dn(const std::string& nam) const { std::stringstream ss(nam); std::stringstream tt(name()); X509_DN nam_dn, my_dn; ss >> nam_dn; tt >> my_dn; auto attr = nam_dn.get_attributes(); bool ret = true; size_t trys = 0; for(const std::pair& c: my_dn.get_attributes()) { auto i = attr.equal_range(c.first); if(i.first != i.second) { trys += 1; ret = ret && (i.first->second == c.second); } } return trys > 0 && ret; } bool GeneralName::matches_ip(const std::string& nam) const { uint32_t ip = string_to_ipv4(nam); std::vector p = split_on(name(), '/'); if(p.size() != 2) throw Decoding_Error("failed to parse IPv4 address"); uint32_t net = string_to_ipv4(p.at(0)); uint32_t mask = string_to_ipv4(p.at(1)); return (ip & mask) == net; } std::ostream& operator<<(std::ostream& os, const GeneralName& gn) { os << gn.type() << ":" << gn.name(); return os; } GeneralSubtree::GeneralSubtree(const std::string& str) : GeneralSubtree() { size_t p0, p1; size_t min = std::stoull(str, &p0, 10); size_t max = std::stoull(str.substr(p0 + 1), &p1, 10); GeneralName gn(str.substr(p0 + p1 + 2)); if(p0 > 0 && p1 > 0) { m_minimum = min; m_maximum = max; m_base = gn; } else { throw Invalid_Argument("Failed to decode Name Constraint"); } } void GeneralSubtree::encode_into(DER_Encoder&) const { throw Not_Implemented("General Subtree encoding"); } void GeneralSubtree::decode_from(class BER_Decoder& ber) { ber.start_cons(SEQUENCE) .decode(m_base) .decode_optional(m_minimum,ASN1_Tag(0), CONTEXT_SPECIFIC,size_t(0)) .end_cons(); if(m_minimum != 0) throw Decoding_Error("GeneralSubtree minimum must be 0"); m_maximum = std::numeric_limits::max(); } std::ostream& operator<<(std::ostream& os, const GeneralSubtree& gs) { os << gs.minimum() << "," << gs.maximum() << "," << gs.base(); return os; } } botan-2.4.0/src/lib/x509/name_constraint.h000066400000000000000000000111661322470703100202230ustar00rootroot00000000000000/* * X.509 Name Constraint * (C) 2015 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_NAME_CONSTRAINT_H_ #define BOTAN_NAME_CONSTRAINT_H_ #include #include #include namespace Botan { class BER_Encoder; class DER_Encoder; class X509_Certificate; /** * @brief X.509 GeneralName Type * * Handles parsing GeneralName types in their BER and canonical string * encoding. Allows matching GeneralNames against each other using * the rules laid out in the RFC 5280, sec. 4.2.1.10 (Name Contraints). */ class BOTAN_PUBLIC_API(2,0) GeneralName final : public ASN1_Object { public: enum MatchResult : int { All, Some, None, NotFound, UnknownType, }; /** * Creates an empty GeneralName. */ GeneralName() = default; /** * Creates a new GeneralName for its string format. * @param str type and name, colon-separated, e.g., "DNS:google.com" */ GeneralName(const std::string& str); void encode_into(DER_Encoder&) const override; void decode_from(BER_Decoder&) override; /** * @return Type of the name. Can be DN, DNS, IP, RFC822 or URI. */ const std::string& type() const { return m_type; } /** * @return The name as string. Format depends on type. */ const std::string& name() const { return m_name; } /** * Checks whether a given certificate (partially) matches this name. * @param cert certificate to be matched * @return the match result */ MatchResult matches(const X509_Certificate& cert) const; private: std::string m_type; std::string m_name; bool matches_dns(const std::string&) const; bool matches_dn(const std::string&) const; bool matches_ip(const std::string&) const; }; std::ostream& operator<<(std::ostream& os, const GeneralName& gn); /** * @brief A single Name Constraint * * The Name Constraint extension adds a minimum and maximum path * length to a GeneralName to form a constraint. The length limits * are currently unused. */ class BOTAN_PUBLIC_API(2,0) GeneralSubtree final : public ASN1_Object { public: /** * Creates an empty name constraint. */ GeneralSubtree() : m_base(), m_minimum(0), m_maximum(std::numeric_limits::max()) {} /*** * Creates a new name constraint. * @param base name * @param min minimum path length * @param max maximum path length */ GeneralSubtree(GeneralName base, size_t min, size_t max) : m_base(base), m_minimum(min), m_maximum(max) {} /** * Creates a new name constraint for its string format. * @param str name constraint */ GeneralSubtree(const std::string& str); void encode_into(DER_Encoder&) const override; void decode_from(BER_Decoder&) override; /** * @return name */ GeneralName base() const { return m_base; } /** * @return minimum path length */ size_t minimum() const { return m_minimum; } /** * @return maximum path length */ size_t maximum() const { return m_maximum; } private: GeneralName m_base; size_t m_minimum; size_t m_maximum; }; std::ostream& operator<<(std::ostream& os, const GeneralSubtree& gs); /** * @brief Name Constraints * * Wraps the Name Constraints associated with a certificate. */ class BOTAN_PUBLIC_API(2,0) NameConstraints final { public: /** * Creates an empty name NameConstraints. */ NameConstraints() : m_permitted_subtrees(), m_excluded_subtrees() {} /** * Creates NameConstraints from a list of permitted and excluded subtrees. * @param permitted_subtrees names for which the certificate is permitted * @param excluded_subtrees names for which the certificate is not permitted */ NameConstraints(std::vector&& permitted_subtrees, std::vector&& excluded_subtrees) : m_permitted_subtrees(permitted_subtrees), m_excluded_subtrees(excluded_subtrees) {} /** * @return permitted names */ const std::vector& permitted() const { return m_permitted_subtrees; } /** * @return excluded names */ const std::vector& excluded() const { return m_excluded_subtrees; } private: std::vector m_permitted_subtrees; std::vector m_excluded_subtrees; }; } #endif botan-2.4.0/src/lib/x509/ocsp.cpp000066400000000000000000000237321322470703100163400ustar00rootroot00000000000000/* * OCSP * (C) 2012,2013 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_HTTP_UTIL) #include #endif namespace Botan { namespace OCSP { namespace { // TODO: should this be in a header somewhere? void decode_optional_list(BER_Decoder& ber, ASN1_Tag tag, std::vector& output) { BER_Object obj = ber.get_next_object(); if(obj.type_tag != tag || obj.class_tag != (CONTEXT_SPECIFIC | CONSTRUCTED)) { ber.push_back(obj); return; } BER_Decoder list(obj.value); while(list.more_items()) { BER_Object certbits = list.get_next_object(); X509_Certificate cert(unlock(certbits.value)); output.push_back(std::move(cert)); } } } Request::Request(const X509_Certificate& issuer_cert, const X509_Certificate& subject_cert) : m_issuer(issuer_cert), m_certid(m_issuer, BigInt::decode(subject_cert.serial_number())) { if(subject_cert.issuer_dn() != issuer_cert.subject_dn()) throw Invalid_Argument("Invalid cert pair to OCSP::Request (mismatched issuer,subject args?)"); } Request::Request(const X509_Certificate& issuer_cert, const BigInt& subject_serial) : m_issuer(issuer_cert), m_certid(m_issuer, subject_serial) { } std::vector Request::BER_encode() const { return DER_Encoder().start_cons(SEQUENCE) .start_cons(SEQUENCE) .start_explicit(0) .encode(static_cast(0)) // version # .end_explicit() .start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(m_certid) .end_cons() .end_cons() .end_cons() .end_cons().get_contents_unlocked(); } std::string Request::base64_encode() const { return Botan::base64_encode(BER_encode()); } Response::Response(const uint8_t response_bits[], size_t response_bits_len) : m_response_bits(response_bits, response_bits + response_bits_len) { BER_Decoder response_outer = BER_Decoder(m_response_bits).start_cons(SEQUENCE); size_t resp_status = 0; response_outer.decode(resp_status, ENUMERATED, UNIVERSAL); if(resp_status != 0) throw Exception("OCSP response status " + std::to_string(resp_status)); if(response_outer.more_items()) { BER_Decoder response_bytes = response_outer.start_cons(ASN1_Tag(0), CONTEXT_SPECIFIC).start_cons(SEQUENCE); response_bytes.decode_and_check(OID("1.3.6.1.5.5.7.48.1.1"), "Unknown response type in OCSP response"); BER_Decoder basicresponse = BER_Decoder(response_bytes.get_next_octet_string()).start_cons(SEQUENCE); basicresponse.start_cons(SEQUENCE) .raw_bytes(m_tbs_bits) .end_cons() .decode(m_sig_algo) .decode(m_signature, BIT_STRING); decode_optional_list(basicresponse, ASN1_Tag(0), m_certs); size_t responsedata_version = 0; Extensions extensions; BER_Decoder(m_tbs_bits) .decode_optional(responsedata_version, ASN1_Tag(0), ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) .decode_optional(m_signer_name, ASN1_Tag(1), ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) .decode_optional_string(m_key_hash, OCTET_STRING, 2, ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) .decode(m_produced_at) .decode_list(m_responses) .decode_optional(extensions, ASN1_Tag(1), ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)); } response_outer.end_cons(); } Certificate_Status_Code Response::verify_signature(const X509_Certificate& issuer) const { try { std::unique_ptr pub_key(issuer.subject_public_key()); const std::vector sig_info = split_on(OIDS::lookup(m_sig_algo.get_oid()), '/'); if(sig_info.size() != 2 || sig_info[0] != pub_key->algo_name()) return Certificate_Status_Code::OCSP_RESPONSE_INVALID; std::string padding = sig_info[1]; Signature_Format format = (pub_key->message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; PK_Verifier verifier(*pub_key, padding, format); if(verifier.verify_message(ASN1::put_in_sequence(m_tbs_bits), m_signature)) return Certificate_Status_Code::OCSP_SIGNATURE_OK; else return Certificate_Status_Code::OCSP_SIGNATURE_ERROR; } catch(Exception&) { return Certificate_Status_Code::OCSP_SIGNATURE_ERROR; } } Certificate_Status_Code Response::check_signature(const std::vector& trusted_roots, const std::vector>& ee_cert_path) const { std::shared_ptr signing_cert; for(size_t i = 0; i != trusted_roots.size(); ++i) { if(m_signer_name.empty() && m_key_hash.empty()) return Certificate_Status_Code::OCSP_RESPONSE_INVALID; if(!m_signer_name.empty()) { signing_cert = trusted_roots[i]->find_cert(m_signer_name, std::vector()); if(signing_cert) { break; } } if(m_key_hash.size() > 0) { signing_cert = trusted_roots[i]->find_cert_by_pubkey_sha1(m_key_hash); if(signing_cert) { break; } } } if(!signing_cert && ee_cert_path.size() > 1) { // End entity cert is not allowed to sign their own OCSP request :) for(size_t i = 1; i < ee_cert_path.size(); ++i) { // Check all CA certificates in the (assumed validated) EE cert path if(!m_signer_name.empty() && ee_cert_path[i]->subject_dn() == m_signer_name) { signing_cert = ee_cert_path[i]; break; } if(m_key_hash.size() > 0 && ee_cert_path[i]->subject_public_key_bitstring_sha1() == m_key_hash) { signing_cert = ee_cert_path[i]; break; } } } if(!signing_cert && m_certs.size() > 0) { for(size_t i = 0; i < m_certs.size(); ++i) { // Check all CA certificates in the (assumed validated) EE cert path if(!m_signer_name.empty() && m_certs[i].subject_dn() == m_signer_name) { signing_cert = std::make_shared(m_certs[i]); break; } if(m_key_hash.size() > 0 && m_certs[i].subject_public_key_bitstring_sha1() == m_key_hash) { signing_cert = std::make_shared(m_certs[i]); break; } } } if(!signing_cert) return Certificate_Status_Code::OCSP_ISSUER_NOT_FOUND; if(!signing_cert->allowed_usage(CRL_SIGN) && !signing_cert->allowed_extended_usage("PKIX.OCSPSigning")) { return Certificate_Status_Code::OCSP_RESPONSE_MISSING_KEYUSAGE; } return this->verify_signature(*signing_cert); } Certificate_Status_Code Response::status_for(const X509_Certificate& issuer, const X509_Certificate& subject, std::chrono::system_clock::time_point ref_time) const { for(const auto& response : m_responses) { if(response.certid().is_id_for(issuer, subject)) { X509_Time x509_ref_time(ref_time); if(response.cert_status() == 1) return Certificate_Status_Code::CERT_IS_REVOKED; if(response.this_update() > x509_ref_time) return Certificate_Status_Code::OCSP_NOT_YET_VALID; if(response.next_update().time_is_set() && x509_ref_time > response.next_update()) return Certificate_Status_Code::OCSP_HAS_EXPIRED; if(response.cert_status() == 0) return Certificate_Status_Code::OCSP_RESPONSE_GOOD; else return Certificate_Status_Code::OCSP_BAD_STATUS; } } return Certificate_Status_Code::OCSP_CERT_NOT_LISTED; } #if defined(BOTAN_HAS_HTTP_UTIL) Response online_check(const X509_Certificate& issuer, const BigInt& subject_serial, const std::string& ocsp_responder, Certificate_Store* trusted_roots, std::chrono::milliseconds timeout) { if(ocsp_responder.empty()) throw Invalid_Argument("No OCSP responder specified"); OCSP::Request req(issuer, subject_serial); auto http = HTTP::POST_sync(ocsp_responder, "application/ocsp-request", req.BER_encode(), 1, timeout); http.throw_unless_ok(); // Check the MIME type? OCSP::Response response(http.body()); std::vector trusted_roots_vec; trusted_roots_vec.push_back(trusted_roots); if(trusted_roots) response.check_signature(trusted_roots_vec); return response; } Response online_check(const X509_Certificate& issuer, const X509_Certificate& subject, Certificate_Store* trusted_roots, std::chrono::milliseconds timeout) { if(subject.issuer_dn() != issuer.subject_dn()) throw Invalid_Argument("Invalid cert pair to OCSP::online_check (mismatched issuer,subject args?)"); return online_check(issuer, BigInt::decode(subject.serial_number()), subject.ocsp_responder(), trusted_roots, timeout); } #endif } } botan-2.4.0/src/lib/x509/ocsp.h000066400000000000000000000142301322470703100157760ustar00rootroot00000000000000/* * OCSP * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OCSP_H_ #define BOTAN_OCSP_H_ #include #include #include #include namespace Botan { class Certificate_Store; namespace OCSP { /** * An OCSP request. */ class BOTAN_PUBLIC_API(2,0) Request final { public: /** * Create an OCSP request. * @param issuer_cert issuer certificate * @param subject_cert subject certificate */ Request(const X509_Certificate& issuer_cert, const X509_Certificate& subject_cert); Request(const X509_Certificate& issuer_cert, const BigInt& subject_serial); /** * @return BER-encoded OCSP request */ std::vector BER_encode() const; /** * @return Base64-encoded OCSP request */ std::string base64_encode() const; /** * @return issuer certificate */ const X509_Certificate& issuer() const { return m_issuer; } /** * @return subject certificate */ const X509_Certificate& subject() const { throw Not_Implemented("Method have been deprecated"); } const std::vector& issuer_key_hash() const { return m_certid.issuer_key_hash(); } private: X509_Certificate m_issuer; CertID m_certid; }; /** * OCSP response. * * Note this class is only usable as an OCSP client */ class BOTAN_PUBLIC_API(2,0) Response final { public: /** * Creates an empty OCSP response. */ Response() = default; /** * Parses an OCSP response. * @param response_bits response bits received */ Response(const std::vector& response_bits) : Response(response_bits.data(), response_bits.size()) {} /** * Parses an OCSP response. * @param response_bits response bits received * @param response_bits_len length of response in bytes */ Response(const uint8_t response_bits[], size_t response_bits_len); /** * Check signature and return status * The optional cert_path is the (already validated!) certificate path of * the end entity which is being inquired about * @param trust_roots list of certstores containing trusted roots * @param cert_path optionally, the (already verified!) certificate path for the certificate * this is an OCSP response for. This is necessary to find the correct intermediate CA in * some cases. */ Certificate_Status_Code check_signature(const std::vector& trust_roots, const std::vector>& cert_path = {}) const; /** * Verify that issuer's key signed this response * @param issuer certificate of issuer * @return if signature valid OCSP_SIGNATURE_OK else an error code */ Certificate_Status_Code verify_signature(const X509_Certificate& issuer) const; /** * @return the time this OCSP response was supposedly produced at */ const X509_Time& produced_at() const { return m_produced_at; } /** * @return DN of signer, if provided in response (may be empty) */ const X509_DN& signer_name() const { return m_signer_name; } /** * @return key hash, if provided in response (may be empty) */ const std::vector& signer_key_hash() const { return m_key_hash; } const std::vector& raw_bits() const { return m_response_bits; } /** * Searches the OCSP response for issuer and subject certificate. * @param issuer issuer certificate * @param subject subject certificate * @param ref_time the reference time * @return OCSP status code, possible values: * CERT_IS_REVOKED, * OCSP_NOT_YET_VALID, * OCSP_HAS_EXPIRED, * OCSP_RESPONSE_GOOD, * OCSP_BAD_STATUS, * OCSP_CERT_NOT_LISTED */ Certificate_Status_Code status_for(const X509_Certificate& issuer, const X509_Certificate& subject, std::chrono::system_clock::time_point ref_time = std::chrono::system_clock::now()) const; /** * @return the certificate chain, if provided in response */ const std::vector &certificates() const { return m_certs; } private: std::vector m_response_bits; X509_Time m_produced_at; X509_DN m_signer_name; std::vector m_key_hash; std::vector m_tbs_bits; AlgorithmIdentifier m_sig_algo; std::vector m_signature; std::vector m_certs; std::vector m_responses; }; #if defined(BOTAN_HAS_HTTP_UTIL) /** * Makes an online OCSP request via HTTP and returns the OCSP response. * @param issuer issuer certificate * @param subject_serial the subject's serial number * @param ocsp_responder the OCSP responder to query * @param trusted_roots trusted roots for the OCSP response * @param timeout a timeout on the HTTP request * @return OCSP response */ BOTAN_PUBLIC_API(2,1) Response online_check(const X509_Certificate& issuer, const BigInt& subject_serial, const std::string& ocsp_responder, Certificate_Store* trusted_roots, std::chrono::milliseconds timeout = std::chrono::milliseconds(3000)); /** * Makes an online OCSP request via HTTP and returns the OCSP response. * @param issuer issuer certificate * @param subject subject certificate * @param trusted_roots trusted roots for the OCSP response * @param timeout a timeout on the HTTP request * @return OCSP response */ BOTAN_PUBLIC_API(2,0) Response online_check(const X509_Certificate& issuer, const X509_Certificate& subject, Certificate_Store* trusted_roots, std::chrono::milliseconds timeout = std::chrono::milliseconds(3000)); #endif } } #endif botan-2.4.0/src/lib/x509/ocsp_types.cpp000066400000000000000000000052621322470703100175620ustar00rootroot00000000000000/* * OCSP subtypes * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace OCSP { CertID::CertID(const X509_Certificate& issuer, const BigInt& subject_serial) { /* In practice it seems some responders, including, notably, ocsp.verisign.com, will reject anything but SHA-1 here */ std::unique_ptr hash(HashFunction::create_or_throw("SHA-160")); m_hash_id = AlgorithmIdentifier(hash->name(), AlgorithmIdentifier::USE_NULL_PARAM); m_issuer_key_hash = unlock(hash->process(issuer.subject_public_key_bitstring())); m_issuer_dn_hash = unlock(hash->process(issuer.raw_subject_dn())); m_subject_serial = subject_serial; } bool CertID::is_id_for(const X509_Certificate& issuer, const X509_Certificate& subject) const { try { if(BigInt::decode(subject.serial_number()) != m_subject_serial) return false; std::unique_ptr hash(HashFunction::create(OIDS::lookup(m_hash_id.get_oid()))); if(m_issuer_dn_hash != unlock(hash->process(subject.raw_issuer_dn()))) return false; if(m_issuer_key_hash != unlock(hash->process(issuer.subject_public_key_bitstring()))) return false; } catch(...) { return false; } return true; } void CertID::encode_into(class DER_Encoder& to) const { to.start_cons(SEQUENCE) .encode(m_hash_id) .encode(m_issuer_dn_hash, OCTET_STRING) .encode(m_issuer_key_hash, OCTET_STRING) .encode(m_subject_serial) .end_cons(); } void CertID::decode_from(class BER_Decoder& from) { from.start_cons(SEQUENCE) .decode(m_hash_id) .decode(m_issuer_dn_hash, OCTET_STRING) .decode(m_issuer_key_hash, OCTET_STRING) .decode(m_subject_serial) .end_cons(); } void SingleResponse::encode_into(class DER_Encoder&) const { throw Not_Implemented("SingleResponse::encode_into"); } void SingleResponse::decode_from(class BER_Decoder& from) { BER_Object cert_status; Extensions extensions; from.start_cons(SEQUENCE) .decode(m_certid) .get_next(cert_status) .decode(m_thisupdate) .decode_optional(m_nextupdate, ASN1_Tag(0), ASN1_Tag(CONTEXT_SPECIFIC | CONSTRUCTED)) .decode_optional(extensions, ASN1_Tag(1), ASN1_Tag(CONTEXT_SPECIFIC | CONSTRUCTED)) .end_cons(); m_cert_status = cert_status.type_tag; } } } botan-2.4.0/src/lib/x509/ocsp_types.h000066400000000000000000000031011322470703100172150ustar00rootroot00000000000000/* * OCSP subtypes * (C) 2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_OCSP_TYPES_H_ #define BOTAN_OCSP_TYPES_H_ #include #include #include namespace Botan { namespace OCSP { class BOTAN_PUBLIC_API(2,0) CertID final : public ASN1_Object { public: CertID() = default; CertID(const X509_Certificate& issuer, const BigInt& subject_serial); bool is_id_for(const X509_Certificate& issuer, const X509_Certificate& subject) const; void encode_into(class DER_Encoder& to) const override; void decode_from(class BER_Decoder& from) override; const std::vector& issuer_key_hash() const { return m_issuer_key_hash; } private: AlgorithmIdentifier m_hash_id; std::vector m_issuer_dn_hash; std::vector m_issuer_key_hash; BigInt m_subject_serial; }; class BOTAN_PUBLIC_API(2,0) SingleResponse final : public ASN1_Object { public: const CertID& certid() const { return m_certid; } size_t cert_status() const { return m_cert_status; } X509_Time this_update() const { return m_thisupdate; } X509_Time next_update() const { return m_nextupdate; } void encode_into(class DER_Encoder& to) const override; void decode_from(class BER_Decoder& from) override; private: CertID m_certid; size_t m_cert_status = 2; // unknown X509_Time m_thisupdate; X509_Time m_nextupdate; }; } } #endif botan-2.4.0/src/lib/x509/pkcs10.cpp000066400000000000000000000141761322470703100164770ustar00rootroot00000000000000/* * PKCS #10 * (C) 1999-2007,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { struct PKCS10_Data { X509_DN m_subject_dn; std::vector m_public_key_bits; AlternativeName m_alt_name; std::string m_challenge; Extensions m_extensions; }; std::string PKCS10_Request::PEM_label() const { return "CERTIFICATE REQUEST"; } std::vector PKCS10_Request::alternate_PEM_labels() const { return { "NEW CERTIFICATE REQUEST" }; } PKCS10_Request::PKCS10_Request(DataSource& src) { load_data(src); } PKCS10_Request::PKCS10_Request(const std::vector& vec) { DataSource_Memory src(vec.data(), vec.size()); load_data(src); } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) PKCS10_Request::PKCS10_Request(const std::string& fsname) { DataSource_Stream src(fsname, true); load_data(src); } #endif /* * Decode the CertificateRequestInfo */ namespace { std::unique_ptr decode_pkcs10(const std::vector& body) { std::unique_ptr data(new PKCS10_Data); BER_Decoder cert_req_info(body); size_t version; cert_req_info.decode(version); if(version != 0) throw Decoding_Error("Unknown version code in PKCS #10 request: " + std::to_string(version)); cert_req_info.decode(data->m_subject_dn); BER_Object public_key = cert_req_info.get_next_object(); if(public_key.type_tag != SEQUENCE || public_key.class_tag != CONSTRUCTED) throw BER_Bad_Tag("PKCS10_Request: Unexpected tag for public key", public_key.type_tag, public_key.class_tag); data->m_public_key_bits = ASN1::put_in_sequence(unlock(public_key.value)); BER_Object attr_bits = cert_req_info.get_next_object(); std::set pkcs9_email; if(attr_bits.type_tag == 0 && attr_bits.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { BER_Decoder attributes(attr_bits.value); while(attributes.more_items()) { Attribute attr; attributes.decode(attr); const OID& oid = attr.get_oid(); BER_Decoder value(attr.get_parameters()); if(oid == OIDS::lookup("PKCS9.EmailAddress")) { ASN1_String email; value.decode(email); pkcs9_email.insert(email.value()); } else if(oid == OIDS::lookup("PKCS9.ChallengePassword")) { ASN1_String challenge_password; value.decode(challenge_password); data->m_challenge = challenge_password.value(); } else if(oid == OIDS::lookup("PKCS9.ExtensionRequest")) { value.decode(data->m_extensions).verify_end(); } } attributes.verify_end(); } else if(attr_bits.type_tag != NO_OBJECT) throw BER_Bad_Tag("PKCS10_Request: Unexpected tag for attributes", attr_bits.type_tag, attr_bits.class_tag); cert_req_info.verify_end(); if(auto ext = data->m_extensions.get_extension_object_as()) { data->m_alt_name = ext->get_alt_name(); } for(std::string email : pkcs9_email) { data->m_alt_name.add_attribute("RFC882", email); } return data; } } void PKCS10_Request::force_decode() { m_data.reset(); std::unique_ptr data = decode_pkcs10(signed_body()); m_data.reset(data.release()); if(!this->check_signature(subject_public_key())) throw Decoding_Error("PKCS #10 request: Bad signature detected"); } const PKCS10_Data& PKCS10_Request::data() const { if(m_data == nullptr) throw Decoding_Error("PKCS10_Request decoding failed"); return *m_data.get(); } /* * Return the challenge password (if any) */ std::string PKCS10_Request::challenge_password() const { return data().m_challenge; } /* * Return the name of the requestor */ const X509_DN& PKCS10_Request::subject_dn() const { return data().m_subject_dn; } /* * Return the public key of the requestor */ const std::vector& PKCS10_Request::raw_public_key() const { return data().m_public_key_bits; } /* * Return the public key of the requestor */ Public_Key* PKCS10_Request::subject_public_key() const { DataSource_Memory source(raw_public_key()); return X509::load_key(source); } /* * Return the alternative names of the requestor */ const AlternativeName& PKCS10_Request::subject_alt_name() const { return data().m_alt_name; } /* * Return the X509v3 extensions */ const Extensions& PKCS10_Request::extensions() const { return data().m_extensions; } /* * Return the key constraints (if any) */ Key_Constraints PKCS10_Request::constraints() const { if(auto ext = extensions().get(OIDS::lookup("X509v3.KeyUsage"))) { return dynamic_cast(*ext).get_constraints(); } return NO_CONSTRAINTS; } /* * Return the extendend key constraints (if any) */ std::vector PKCS10_Request::ex_constraints() const { if(auto ext = extensions().get(OIDS::lookup("X509v3.ExtendedKeyUsage"))) { return dynamic_cast(*ext).get_oids(); } return {}; } /* * Return is a CA certificate is requested */ bool PKCS10_Request::is_CA() const { if(auto ext = extensions().get(OIDS::lookup("X509v3.BasicConstraints"))) { return dynamic_cast(*ext).get_is_ca(); } return false; } /* * Return the desired path limit (if any) */ size_t PKCS10_Request::path_limit() const { if(auto ext = extensions().get(OIDS::lookup("X509v3.BasicConstraints"))) { Cert_Extension::Basic_Constraints& basic_constraints = dynamic_cast(*ext); if(basic_constraints.get_is_ca()) { return basic_constraints.get_path_limit(); } } return 0; } } botan-2.4.0/src/lib/x509/pkcs10.h000066400000000000000000000060001322470703100161270ustar00rootroot00000000000000/* * PKCS #10 * (C) 1999-2007 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_PKCS10_H_ #define BOTAN_PKCS10_H_ #include #include #include #include #include #include namespace Botan { class Extensions; struct PKCS10_Data; /** * PKCS #10 Certificate Request. */ class BOTAN_PUBLIC_API(2,0) PKCS10_Request final : public X509_Object { public: /** * Get the subject public key. * @return subject public key */ Public_Key* subject_public_key() const; /** * Get the raw DER encoded public key. * @return raw DER encoded public key */ const std::vector& raw_public_key() const; /** * Get the subject DN. * @return subject DN */ const X509_DN& subject_dn() const; /** * Get the subject alternative name. * @return subject alternative name. */ const AlternativeName& subject_alt_name() const; /** * Get the key constraints for the key associated with this * PKCS#10 object. * @return key constraints */ Key_Constraints constraints() const; /** * Get the extendend key constraints (if any). * @return extended key constraints */ std::vector ex_constraints() const; /** * Find out whether this is a CA request. * @result true if it is a CA request, false otherwise. */ bool is_CA() const; /** * Return the constraint on the path length defined * in the BasicConstraints extension. * @return path limit */ size_t path_limit() const; /** * Get the challenge password for this request * @return challenge password for this request */ std::string challenge_password() const; /** * Get the X509v3 extensions. * @return X509v3 extensions */ const Extensions& extensions() const; /** * Create a PKCS#10 Request from a data source. * @param source the data source providing the DER encoded request */ explicit PKCS10_Request(DataSource& source); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Create a PKCS#10 Request from a file. * @param filename the name of the file containing the DER or PEM * encoded request file */ explicit PKCS10_Request(const std::string& filename); #endif /** * Create a PKCS#10 Request from binary data. * @param vec a std::vector containing the DER value */ explicit PKCS10_Request(const std::vector& vec); private: std::string PEM_label() const override; std::vector alternate_PEM_labels() const override; void force_decode() override; const PKCS10_Data& data() const; std::shared_ptr m_data; }; } #endif botan-2.4.0/src/lib/x509/x509_ca.cpp000066400000000000000000000250261322470703100165420ustar00rootroot00000000000000/* * X.509 Certificate Authority * (C) 1999-2010 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * Load the certificate and private key */ X509_CA::X509_CA(const X509_Certificate& c, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng) : m_ca_cert(c), m_hash_fn(hash_fn) { if(!m_ca_cert.is_CA_cert()) throw Invalid_Argument("X509_CA: This certificate is not for a CA"); std::map opts; // constructor without additional options: use the padding used in the CA certificate // sig_oid_str = /, so padding with all its options will look // like a cipher mode to the scanner std::string sig_oid_str = OIDS::lookup(c.signature_algorithm().oid); SCAN_Name scanner(sig_oid_str); std::string pad = scanner.cipher_mode(); if(!pad.empty()) opts.insert({"padding",pad}); m_signer.reset(choose_sig_format(key, opts, rng, hash_fn, m_ca_sig_algo)); } /* * Load the certificate and private key, and additional options */ X509_CA::X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key, const std::map& opts, const std::string& hash_fn, RandomNumberGenerator& rng) : m_ca_cert(ca_certificate), m_hash_fn(hash_fn) { if(!m_ca_cert.is_CA_cert()) throw Invalid_Argument("X509_CA: This certificate is not for a CA"); m_signer.reset(choose_sig_format(key, opts, rng, hash_fn, m_ca_sig_algo)); } /* * X509_CA Destructor */ X509_CA::~X509_CA() { /* for unique_ptr */ } /* * Sign a PKCS #10 certificate request */ X509_Certificate X509_CA::sign_request(const PKCS10_Request& req, RandomNumberGenerator& rng, const X509_Time& not_before, const X509_Time& not_after) const { Key_Constraints constraints; if(req.is_CA()) { constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); } else { std::unique_ptr key(req.subject_public_key()); verify_cert_constraints_valid_for_key_type(*key, req.constraints()); constraints = req.constraints(); } Extensions extensions = req.extensions(); extensions.replace( new Cert_Extension::Basic_Constraints(req.is_CA(), req.path_limit()), true); if(constraints != NO_CONSTRAINTS) { extensions.replace(new Cert_Extension::Key_Usage(constraints), true); } extensions.replace(new Cert_Extension::Authority_Key_ID(m_ca_cert.subject_key_id())); extensions.replace(new Cert_Extension::Subject_Key_ID(req.raw_public_key(), m_hash_fn)); extensions.replace( new Cert_Extension::Subject_Alternative_Name(req.subject_alt_name())); extensions.replace( new Cert_Extension::Extended_Key_Usage(req.ex_constraints())); return make_cert(m_signer.get(), rng, m_ca_sig_algo, req.raw_public_key(), not_before, not_after, m_ca_cert.subject_dn(), req.subject_dn(), extensions); } /* * Create a new certificate */ X509_Certificate X509_CA::make_cert(PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& sig_algo, const std::vector& pub_key, const X509_Time& not_before, const X509_Time& not_after, const X509_DN& issuer_dn, const X509_DN& subject_dn, const Extensions& extensions) { const size_t X509_CERT_VERSION = 3; const size_t SERIAL_BITS = 128; BigInt serial_no(rng, SERIAL_BITS); // clang-format off return X509_Certificate(X509_Object::make_signed( signer, rng, sig_algo, DER_Encoder().start_cons(SEQUENCE) .start_explicit(0) .encode(X509_CERT_VERSION-1) .end_explicit() .encode(serial_no) .encode(sig_algo) .encode(issuer_dn) .start_cons(SEQUENCE) .encode(not_before) .encode(not_after) .end_cons() .encode(subject_dn) .raw_bytes(pub_key) .start_explicit(3) .start_cons(SEQUENCE) .encode(extensions) .end_cons() .end_explicit() .end_cons() .get_contents() ));; // clang-format on } /* * Create a new, empty CRL */ X509_CRL X509_CA::new_crl(RandomNumberGenerator& rng, uint32_t next_update) const { return new_crl(rng, std::chrono::system_clock::now(), std::chrono::seconds(next_update)); } /* * Update a CRL with new entries */ X509_CRL X509_CA::update_crl(const X509_CRL& crl, const std::vector& new_revoked, RandomNumberGenerator& rng, uint32_t next_update) const { return update_crl(crl, new_revoked, rng, std::chrono::system_clock::now(), std::chrono::seconds(next_update)); } X509_CRL X509_CA::new_crl(RandomNumberGenerator& rng, std::chrono::system_clock::time_point issue_time, std::chrono::seconds next_update) const { std::vector empty; return make_crl(empty, 1, rng, issue_time, next_update); } X509_CRL X509_CA::update_crl(const X509_CRL& last_crl, const std::vector& new_revoked, RandomNumberGenerator& rng, std::chrono::system_clock::time_point issue_time, std::chrono::seconds next_update) const { std::vector revoked = last_crl.get_revoked(); std::copy(new_revoked.begin(), new_revoked.end(), std::back_inserter(revoked)); return make_crl(revoked, last_crl.crl_number() + 1, rng, issue_time, next_update); } /* * Create a CRL */ X509_CRL X509_CA::make_crl(const std::vector& revoked, uint32_t crl_number, RandomNumberGenerator& rng, std::chrono::system_clock::time_point issue_time, std::chrono::seconds next_update) const { const size_t X509_CRL_VERSION = 2; auto expire_time = issue_time + next_update; Extensions extensions; extensions.add(new Cert_Extension::Authority_Key_ID(m_ca_cert.subject_key_id())); extensions.add(new Cert_Extension::CRL_Number(crl_number)); // clang-format off const std::vector crl = X509_Object::make_signed( m_signer.get(), rng, m_ca_sig_algo, DER_Encoder().start_cons(SEQUENCE) .encode(X509_CRL_VERSION-1) .encode(m_ca_sig_algo) .encode(m_ca_cert.subject_dn()) .encode(X509_Time(issue_time)) .encode(X509_Time(expire_time)) .encode_if(revoked.size() > 0, DER_Encoder() .start_cons(SEQUENCE) .encode_list(revoked) .end_cons() ) .start_explicit(0) .start_cons(SEQUENCE) .encode(extensions) .end_cons() .end_explicit() .end_cons() .get_contents()); // clang-format on return X509_CRL(crl); } /* * Return the CA's certificate */ X509_Certificate X509_CA::ca_certificate() const { return m_ca_cert; } /* * Choose a signing format for the key */ PK_Signer* choose_sig_format(const Private_Key& key, RandomNumberGenerator& rng, const std::string& hash_fn, AlgorithmIdentifier& sig_algo) { return choose_sig_format(key, std::map(), rng, hash_fn, sig_algo); } /* * Choose a signing format for the key */ PK_Signer* choose_sig_format(const Private_Key& key, const std::map& opts, RandomNumberGenerator& rng, const std::string& hash_fn, AlgorithmIdentifier& sig_algo) { const std::string algo_name = key.algo_name(); std::unique_ptr hash(HashFunction::create_or_throw(hash_fn)); std::string hash_name = hash->name(); // check algo_name and set default std::string padding; if(algo_name == "RSA") { // set to EMSA3 for compatibility reasons, originally it was the only option padding = "EMSA3(" + hash_name + ")"; } else if(algo_name == "DSA" || algo_name == "ECDSA" || algo_name == "ECGDSA" || algo_name == "ECKCDSA" || algo_name == "GOST-34.10") { padding = "EMSA1(" + hash_name + ")"; } else { throw Invalid_Argument("Unknown X.509 signing key type: " + algo_name); } if(opts.count("padding") > 0 && !opts.at("padding").empty()) { padding = opts.at("padding"); } // try to construct an EMSA object from the padding options or default std::unique_ptr emsa = nullptr; try { emsa.reset(get_emsa(padding)); } /* * get_emsa will throw if opts contains {"padding",} but * does not specify a hash function. * Omitting it is valid since it needs to be identical to hash_fn. * If it still throws, something happened that we cannot repair here, * e.g. the algorithm/padding combination is not supported. */ catch(...) { emsa.reset(get_emsa(padding + "(" + hash_fn + ")")); } if(emsa == nullptr) { throw Invalid_Argument("Could not parse padding scheme " + padding); } const Signature_Format format = (key.message_parts() > 1) ? DER_SEQUENCE : IEEE_1363; sig_algo = emsa->config_for_x509(key, hash_name); return new PK_Signer(key, rng, emsa->name(), format); } } botan-2.4.0/src/lib/x509/x509_ca.h000066400000000000000000000203051322470703100162020ustar00rootroot00000000000000/* * X.509 Certificate Authority * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_CA_H_ #define BOTAN_X509_CA_H_ #include #include #include #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif namespace Botan { class Private_Key; class PKCS10_Request; class PK_Signer; /** * This class represents X.509 Certificate Authorities (CAs). */ class BOTAN_PUBLIC_API(2,0) X509_CA final { public: /** * Sign a PKCS#10 Request. * @param req the request to sign * @param rng the rng to use * @param not_before the starting time for the certificate * @param not_after the expiration time for the certificate * @return resulting certificate */ X509_Certificate sign_request(const PKCS10_Request& req, RandomNumberGenerator& rng, const X509_Time& not_before, const X509_Time& not_after) const; /** * Get the certificate of this CA. * @return CA certificate */ X509_Certificate ca_certificate() const; /** * Create a new and empty CRL for this CA. * @param rng the random number generator to use * @param issue_time the issue time (typically system_clock::now) * @param next_update the time interval after issue_data within which * a new CRL will be produced. * @return new CRL */ X509_CRL new_crl(RandomNumberGenerator& rng, std::chrono::system_clock::time_point issue_time, std::chrono::seconds next_update) const; /** * Create a new CRL by with additional entries. * @param last_crl the last CRL of this CA to add the new entries to * @param new_entries contains the new CRL entries to be added to the CRL * @param rng the random number generator to use * @param issue_time the issue time (typically system_clock::now) * @param next_update the time interval after issue_data within which * a new CRL will be produced. */ X509_CRL update_crl(const X509_CRL& last_crl, const std::vector& new_entries, RandomNumberGenerator& rng, std::chrono::system_clock::time_point issue_time, std::chrono::seconds next_update) const; /** * Create a new and empty CRL for this CA. * @param rng the random number generator to use * @param next_update the time to set in next update in seconds * as the offset from the current time * @return new CRL */ X509_CRL new_crl(RandomNumberGenerator& rng, uint32_t next_update = 604800) const; /** * Create a new CRL by with additional entries. * @param last_crl the last CRL of this CA to add the new entries to * @param new_entries contains the new CRL entries to be added to the CRL * @param rng the random number generator to use * @param next_update the time to set in next update in seconds * as the offset from the current time */ X509_CRL update_crl(const X509_CRL& last_crl, const std::vector& new_entries, RandomNumberGenerator& rng, uint32_t next_update = 604800) const; /** * Interface for creating new certificates * @param signer a signing object * @param rng a random number generator * @param sig_algo the signature algorithm identifier * @param pub_key the serialized public key * @param not_before the start time of the certificate * @param not_after the end time of the certificate * @param issuer_dn the DN of the issuer * @param subject_dn the DN of the subject * @param extensions an optional list of certificate extensions * @returns newly minted certificate */ static X509_Certificate make_cert(PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& sig_algo, const std::vector& pub_key, const X509_Time& not_before, const X509_Time& not_after, const X509_DN& issuer_dn, const X509_DN& subject_dn, const Extensions& extensions); /** * Create a new CA object. * @param ca_certificate the certificate of the CA * @param key the private key of the CA * @param hash_fn name of a hash function to use for signing * @param rng the random generator to use */ X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng); /** * Create a new CA object. * @param ca_certificate the certificate of the CA * @param key the private key of the CA * @param opts additional options, e.g. padding, as key value pairs * @param hash_fn name of a hash function to use for signing * @param rng the random generator to use */ X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key, const std::map& opts, const std::string& hash_fn, RandomNumberGenerator& rng); #if defined(BOTAN_HAS_SYSTEM_RNG) BOTAN_DEPRECATED("Use version taking RNG object") X509_CA(const X509_Certificate& ca_certificate, const Private_Key& key, const std::string& hash_fn) : X509_CA(ca_certificate, key, hash_fn, system_rng()) {} #endif X509_CA(const X509_CA&) = delete; X509_CA& operator=(const X509_CA&) = delete; #if !defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) X509_CA(X509_CA&&) = default; X509_CA& operator=(X509_CA&&) = default; #endif ~X509_CA(); private: X509_CRL make_crl(const std::vector& entries, uint32_t crl_number, RandomNumberGenerator& rng, std::chrono::system_clock::time_point issue_time, std::chrono::seconds next_update) const; AlgorithmIdentifier m_ca_sig_algo; X509_Certificate m_ca_cert; std::string m_hash_fn; std::unique_ptr m_signer; }; /** * Choose the default signature format for a certain public key signature * scheme. * @param key will be the key to choose a padding scheme for * @param rng the random generator to use * @param hash_fn is the desired hash function * @param alg_id will be set to the chosen scheme * @return A PK_Signer object for generating signatures */ BOTAN_PUBLIC_API(2,0) PK_Signer* choose_sig_format(const Private_Key& key, RandomNumberGenerator& rng, const std::string& hash_fn, AlgorithmIdentifier& alg_id); /** * @verbatim * Choose the default signature format for a certain public key signature * scheme. * * The only option recognized by opts at this moment is "padding" * Find an entry from src/build-data/oids.txt under [signature] of the form * /[()] and add {"padding",} * to opts. * @endverbatim * * @param key will be the key to choose a padding scheme for * @param opts contains additional options for building the certificate * @param rng the random generator to use * @param hash_fn is the desired hash function * @param alg_id will be set to the chosen scheme * @return A PK_Signer object for generating signatures */ PK_Signer* choose_sig_format(const Private_Key& key, const std::map& opts, RandomNumberGenerator& rng, const std::string& hash_fn, AlgorithmIdentifier& alg_id); } #endif botan-2.4.0/src/lib/x509/x509_crl.cpp000066400000000000000000000141311322470703100167320ustar00rootroot00000000000000/* * X.509 CRL * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { struct CRL_Data { X509_DN m_issuer; X509_Time m_this_update; X509_Time m_next_update; std::vector m_entries; Extensions m_extensions; // cached values from extensions size_t m_crl_number = 0; std::vector m_auth_key_id; std::string m_issuing_distribution_point; }; std::string X509_CRL::PEM_label() const { return "X509 CRL"; } std::vector X509_CRL::alternate_PEM_labels() const { return { "CRL" }; } X509_CRL::X509_CRL(DataSource& src) { load_data(src); } X509_CRL::X509_CRL(const std::vector& vec) { DataSource_Memory src(vec.data(), vec.size()); load_data(src); } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) X509_CRL::X509_CRL(const std::string& fsname) { DataSource_Stream src(fsname, true); load_data(src); } #endif X509_CRL::X509_CRL(const X509_DN& issuer, const X509_Time& this_update, const X509_Time& next_update, const std::vector& revoked) : X509_Object() { m_data.reset(new CRL_Data); m_data->m_issuer = issuer; m_data->m_this_update = this_update; m_data->m_next_update = next_update; m_data->m_entries = revoked; } /** * Check if this particular certificate is listed in the CRL */ bool X509_CRL::is_revoked(const X509_Certificate& cert) const { /* If the cert wasn't issued by the CRL issuer, it's possible the cert is revoked, but not by this CRL. Maybe throw an exception instead? */ if(cert.issuer_dn() != issuer_dn()) return false; std::vector crl_akid = authority_key_id(); std::vector cert_akid = cert.authority_key_id(); if(!crl_akid.empty() && !cert_akid.empty()) { if(crl_akid != cert_akid) return false; } std::vector cert_serial = cert.serial_number(); bool is_revoked = false; // FIXME would be nice to avoid a linear scan here - maybe sort the entries? for(const CRL_Entry& entry : get_revoked()) { if(cert_serial == entry.serial_number()) { if(entry.reason_code() == REMOVE_FROM_CRL) is_revoked = false; else is_revoked = true; } } return is_revoked; } /* * Decode the TBSCertList data */ namespace { std::unique_ptr decode_crl_body(const std::vector& body, const AlgorithmIdentifier& sig_algo) { std::unique_ptr data(new CRL_Data); BER_Decoder tbs_crl(body); size_t version; tbs_crl.decode_optional(version, INTEGER, UNIVERSAL); if(version != 0 && version != 1) throw X509_CRL::X509_CRL_Error("Unknown X.509 CRL version " + std::to_string(version+1)); AlgorithmIdentifier sig_algo_inner; tbs_crl.decode(sig_algo_inner); if(sig_algo != sig_algo_inner) throw X509_CRL::X509_CRL_Error("Algorithm identifier mismatch"); tbs_crl.decode(data->m_issuer) .decode(data->m_this_update) .decode(data->m_next_update); BER_Object next = tbs_crl.get_next_object(); if(next.type_tag == SEQUENCE && next.class_tag == CONSTRUCTED) { BER_Decoder cert_list(next.value); while(cert_list.more_items()) { CRL_Entry entry; cert_list.decode(entry); data->m_entries.push_back(entry); } next = tbs_crl.get_next_object(); } if(next.type_tag == 0 && next.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { BER_Decoder crl_options(next.value); crl_options.decode(data->m_extensions).verify_end(); next = tbs_crl.get_next_object(); } if(next.type_tag != NO_OBJECT) throw X509_CRL::X509_CRL_Error("Unknown tag in CRL"); tbs_crl.verify_end(); // Now cache some fields from the extensions if(auto ext = data->m_extensions.get_extension_object_as()) { data->m_crl_number = ext->get_crl_number(); } if(auto ext = data->m_extensions.get_extension_object_as()) { data->m_auth_key_id = ext->get_key_id(); } if(auto ext = data->m_extensions.get_extension_object_as()) { std::stringstream ss; for(const auto& pair : ext->get_point().contents()) { ss << pair.first << ": " << pair.second << " "; } data->m_issuing_distribution_point = ss.str(); } return data; } } void X509_CRL::force_decode() { m_data.reset(decode_crl_body(signed_body(), signature_algorithm()).release()); } const CRL_Data& X509_CRL::data() const { if(!m_data) { throw Invalid_State("X509_CRL uninitialized"); } return *m_data.get(); } const Extensions& X509_CRL::extensions() const { return data().m_extensions; } /* * Return the list of revoked certificates */ const std::vector& X509_CRL::get_revoked() const { return data().m_entries; } /* * Return the distinguished name of the issuer */ const X509_DN& X509_CRL::issuer_dn() const { return data().m_issuer; } /* * Return the key identifier of the issuer */ const std::vector& X509_CRL::authority_key_id() const { return data().m_auth_key_id; } /* * Return the CRL number of this CRL */ uint32_t X509_CRL::crl_number() const { return data().m_crl_number; } /* * Return the issue data of the CRL */ const X509_Time& X509_CRL::this_update() const { return data().m_this_update; } /* * Return the date when a new CRL will be issued */ const X509_Time& X509_CRL::next_update() const { return data().m_next_update; } /* * Return the CRL's distribution point */ std::string X509_CRL::crl_issuing_distribution_point() const { return data().m_issuing_distribution_point; } } botan-2.4.0/src/lib/x509/x509_crl.h000066400000000000000000000067271322470703100164130ustar00rootroot00000000000000/* * X.509 CRL * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_CRL_H_ #define BOTAN_X509_CRL_H_ #include #include #include #include namespace Botan { class Extensions; class X509_Certificate; struct CRL_Data; /** * This class represents X.509 Certificate Revocation Lists (CRLs). */ class BOTAN_PUBLIC_API(2,0) X509_CRL final : public X509_Object { public: /** * This class represents CRL related errors. */ class BOTAN_PUBLIC_API(2,0) X509_CRL_Error final : public Exception { public: explicit X509_CRL_Error(const std::string& error) : Exception("X509_CRL: " + error) {} }; /** * Check if this particular certificate is listed in the CRL */ bool is_revoked(const X509_Certificate& cert) const; /** * Get the entries of this CRL in the form of a vector. * @return vector containing the entries of this CRL. */ const std::vector& get_revoked() const; /** * Get the issuer DN of this CRL. * @return CRLs issuer DN */ const X509_DN& issuer_dn() const; /** * @return extension data for this CRL */ const Extensions& extensions() const; /** * Get the AuthorityKeyIdentifier of this CRL. * @return this CRLs AuthorityKeyIdentifier */ const std::vector& authority_key_id() const; /** * Get the serial number of this CRL. * @return CRLs serial number */ uint32_t crl_number() const; /** * Get the CRL's thisUpdate value. * @return CRLs thisUpdate */ const X509_Time& this_update() const; /** * Get the CRL's nextUpdate value. * @return CRLs nextdUpdate */ const X509_Time& next_update() const; /** * Get the CRL's distribution point * @return CRL.IssuingDistributionPoint from the CRL's Data_Store */ std::string crl_issuing_distribution_point() const; /** * Create an uninitialized CRL object. Any attempts to access * this object will throw an exception. */ X509_CRL() = default; /** * Construct a CRL from a data source. * @param source the data source providing the DER or PEM encoded CRL. */ X509_CRL(DataSource& source); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Construct a CRL from a file containing the DER or PEM encoded CRL. * @param filename the name of the CRL file */ X509_CRL(const std::string& filename); #endif /** * Construct a CRL from a binary vector * @param vec the binary (DER) representation of the CRL */ X509_CRL(const std::vector& vec); /** * Construct a CRL * @param issuer issuer of this CRL * @param thisUpdate valid from * @param nextUpdate valid until * @param revoked entries to be included in the CRL */ X509_CRL(const X509_DN& issuer, const X509_Time& thisUpdate, const X509_Time& nextUpdate, const std::vector& revoked); private: std::string PEM_label() const override; std::vector alternate_PEM_labels() const override; void force_decode() override; const CRL_Data& data() const; std::shared_ptr m_data; }; } #endif botan-2.4.0/src/lib/x509/x509_dn.cpp000066400000000000000000000230231322470703100165530ustar00rootroot00000000000000/* * X509_DN * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include namespace Botan { /* * Create an X509_DN */ X509_DN::X509_DN(const std::multimap& args) { for(auto i = args.begin(); i != args.end(); ++i) add_attribute(i->first, i->second); } /* * Create an X509_DN */ X509_DN::X509_DN(const std::multimap& args) { for(auto i = args.begin(); i != args.end(); ++i) add_attribute(OIDS::lookup(i->first), i->second); } /* * Add an attribute to a X509_DN */ void X509_DN::add_attribute(const std::string& type, const std::string& str) { OID oid = OIDS::lookup(type); add_attribute(oid, str); } /* * Add an attribute to a X509_DN */ void X509_DN::add_attribute(const OID& oid, const std::string& str) { if(str.empty()) return; auto range = m_dn_info.equal_range(oid); for(auto i = range.first; i != range.second; ++i) if(i->second.value() == str) return; multimap_insert(m_dn_info, oid, ASN1_String(str)); m_dn_bits.clear(); } /* * Get the attributes of this X509_DN */ std::multimap X509_DN::get_attributes() const { std::multimap retval; for(auto i = m_dn_info.begin(); i != m_dn_info.end(); ++i) multimap_insert(retval, i->first, i->second.value()); return retval; } /* * Get the contents of this X.500 Name */ std::multimap X509_DN::contents() const { std::multimap retval; for(auto i = m_dn_info.begin(); i != m_dn_info.end(); ++i) { std::string str_value = OIDS::oid2str(i->first); if(str_value.empty()) str_value = i->first.as_string(); multimap_insert(retval, str_value, i->second.value()); } return retval; } bool X509_DN::has_field(const std::string& attr) const { const OID oid = OIDS::lookup(deref_info_field(attr)); auto range = m_dn_info.equal_range(oid); return (range.first != range.second); } std::string X509_DN::get_first_attribute(const std::string& attr) const { const OID oid = OIDS::lookup(deref_info_field(attr)); auto i = m_dn_info.lower_bound(oid); if(i != m_dn_info.end() && i->first == oid) return i->second.value(); return ""; } /* * Get a single attribute type */ std::vector X509_DN::get_attribute(const std::string& attr) const { const OID oid = OIDS::lookup(deref_info_field(attr)); auto range = m_dn_info.equal_range(oid); std::vector values; for(auto i = range.first; i != range.second; ++i) values.push_back(i->second.value()); return values; } const std::vector& X509_DN::get_bits() const { return m_dn_bits; } /* * Deref aliases in a subject/issuer info request */ std::string X509_DN::deref_info_field(const std::string& info) { if(info == "Name" || info == "CommonName" || info == "CN") return "X520.CommonName"; if(info == "SerialNumber" || info == "SN") return "X520.SerialNumber"; if(info == "Country" || info == "C") return "X520.Country"; if(info == "Organization" || info == "O") return "X520.Organization"; if(info == "Organizational Unit" || info == "OrgUnit" || info == "OU") return "X520.OrganizationalUnit"; if(info == "Locality" || info == "L") return "X520.Locality"; if(info == "State" || info == "Province" || info == "ST") return "X520.State"; if(info == "Email") return "RFC822"; return info; } /* * Compare two X509_DNs for equality */ bool operator==(const X509_DN& dn1, const X509_DN& dn2) { auto attr1 = dn1.get_attributes(); auto attr2 = dn2.get_attributes(); if(attr1.size() != attr2.size()) return false; auto p1 = attr1.begin(); auto p2 = attr2.begin(); while(true) { if(p1 == attr1.end() && p2 == attr2.end()) break; if(p1 == attr1.end()) return false; if(p2 == attr2.end()) return false; if(p1->first != p2->first) return false; if(!x500_name_cmp(p1->second, p2->second)) return false; ++p1; ++p2; } return true; } /* * Compare two X509_DNs for inequality */ bool operator!=(const X509_DN& dn1, const X509_DN& dn2) { return !(dn1 == dn2); } /* * Induce an arbitrary ordering on DNs */ bool operator<(const X509_DN& dn1, const X509_DN& dn2) { auto attr1 = dn1.get_attributes(); auto attr2 = dn2.get_attributes(); if(attr1.size() < attr2.size()) return true; if(attr1.size() > attr2.size()) return false; for(auto p1 = attr1.begin(); p1 != attr1.end(); ++p1) { auto p2 = attr2.find(p1->first); if(p2 == attr2.end()) return false; if(p1->second > p2->second) return false; if(p1->second < p2->second) return true; } return false; } namespace { /* * DER encode a RelativeDistinguishedName */ void do_ava(DER_Encoder& encoder, const std::multimap& dn_info, ASN1_Tag string_type, const std::string& oid_str, bool must_exist = false) { const OID oid = OIDS::lookup(oid_str); const bool exists = (dn_info.find(oid) != dn_info.end()); if(!exists && must_exist) throw Encoding_Error("X509_DN: No entry for " + oid_str); if(!exists) return; auto range = dn_info.equal_range(oid); for(auto i = range.first; i != range.second; ++i) { encoder.start_cons(SET) .start_cons(SEQUENCE) .encode(oid) .encode(ASN1_String(i->second, string_type)) .end_cons() .end_cons(); } } } /* * DER encode a DistinguishedName */ void X509_DN::encode_into(DER_Encoder& der) const { auto dn_info = get_attributes(); der.start_cons(SEQUENCE); if(!m_dn_bits.empty()) der.raw_bytes(m_dn_bits); else { do_ava(der, dn_info, PRINTABLE_STRING, "X520.Country"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.State"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.Locality"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.Organization"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.OrganizationalUnit"); do_ava(der, dn_info, DIRECTORY_STRING, "X520.CommonName"); do_ava(der, dn_info, PRINTABLE_STRING, "X520.SerialNumber"); } der.end_cons(); } /* * Decode a BER encoded DistinguishedName */ void X509_DN::decode_from(BER_Decoder& source) { std::vector bits; source.start_cons(SEQUENCE) .raw_bytes(bits) .end_cons(); BER_Decoder sequence(bits); while(sequence.more_items()) { BER_Decoder rdn = sequence.start_cons(SET); while(rdn.more_items()) { OID oid; ASN1_String str; rdn.start_cons(SEQUENCE) .decode(oid) .decode(str) .end_cons(); add_attribute(oid, str.value()); } } m_dn_bits = bits; } namespace { std::string to_short_form(const std::string& long_id) { if(long_id == "X520.CommonName") return "CN"; if(long_id == "X520.Country") return "C"; if(long_id == "X520.Organization") return "O"; if(long_id == "X520.OrganizationalUnit") return "OU"; return long_id; } } std::ostream& operator<<(std::ostream& out, const X509_DN& dn) { std::multimap contents = dn.contents(); for(std::multimap::const_iterator i = contents.begin(); i != contents.end(); ++i) { out << to_short_form(i->first) << "=\""; for(char c: i->second) { if(c == '\\' || c == '\"') { out << "\\"; } out << c; } out << "\""; if(std::next(i) != contents.end()) { out << ","; } } return out; } std::istream& operator>>(std::istream& in, X509_DN& dn) { in >> std::noskipws; do { std::string key; std::string val; char c; while(in.good()) { in >> c; if(std::isspace(c) && key.empty()) continue; else if(!std::isspace(c)) { key.push_back(c); break; } else break; } while(in.good()) { in >> c; if(!std::isspace(c) && c != '=') key.push_back(c); else if(c == '=') break; else throw Invalid_Argument("Ill-formed X.509 DN"); } bool in_quotes = false; while(in.good()) { in >> c; if(std::isspace(c)) { if(!in_quotes && !val.empty()) break; else if(in_quotes) val.push_back(' '); } else if(c == '"') in_quotes = !in_quotes; else if(c == '\\') { if(in.good()) in >> c; val.push_back(c); } else if(c == ',' && !in_quotes) break; else val.push_back(c); } if(!key.empty() && !val.empty()) dn.add_attribute(X509_DN::deref_info_field(key),val); else break; } while(in.good()); return in; } } botan-2.4.0/src/lib/x509/x509_dn.h000066400000000000000000000043701322470703100162240ustar00rootroot00000000000000/* * X.509 Distinguished Name * (C) 1999-2010 Jack Lloyd * (C) 2017 Fabian Weissberg, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_DN_H_ #define BOTAN_X509_DN_H_ #include #include #include #include #include namespace Botan { /** * Distinguished Name */ class BOTAN_PUBLIC_API(2,0) X509_DN final : public ASN1_Object { public: void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; bool has_field(const std::string& attr) const; std::vector get_attribute(const std::string& attr) const; std::string get_first_attribute(const std::string& attr) const; std::multimap get_attributes() const; std::multimap contents() const; void add_attribute(const std::string& key, const std::string& val); void add_attribute(const OID& oid, const std::string& val); static std::string deref_info_field(const std::string& key); /** * Lookup upper bounds in characters for the length of distinguished name fields * as given in RFC 5280, Appendix A. * * @param oid the oid of the DN to lookup * @return the upper bound, or zero if no ub is known to Botan */ static size_t lookup_ub(const OID& oid); /* * Return the BER encoded data, if any */ const std::vector& get_bits() const; bool empty() const { return m_dn_info.empty(); } X509_DN() = default; explicit X509_DN(const std::multimap& vals); explicit X509_DN(const std::multimap& vals); private: std::multimap m_dn_info; std::vector m_dn_bits; }; bool BOTAN_PUBLIC_API(2,0) operator==(const X509_DN&, const X509_DN&); bool BOTAN_PUBLIC_API(2,0) operator!=(const X509_DN&, const X509_DN&); bool BOTAN_PUBLIC_API(2,0) operator<(const X509_DN&, const X509_DN&); BOTAN_PUBLIC_API(2,0) std::ostream& operator<<(std::ostream& out, const X509_DN& dn); BOTAN_PUBLIC_API(2,0) std::istream& operator>>(std::istream& in, X509_DN& dn); } #endif botan-2.4.0/src/lib/x509/x509_dn_ub.cpp000066400000000000000000000033051322470703100172420ustar00rootroot00000000000000/* * DN_UB maps: Upper bounds on the length of DN strings * * This file was automatically generated by ./src/scripts/oids.py on 2017-12-23 * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace { /** * Upper bounds for the length of distinguished name fields as given in RFC 5280, Appendix A. * Only OIDS recognized by botan are considered, so far. * Maps OID string representations instead of human readable strings in order * to avoid an additional lookup. */ static const std::map DN_UB = { { Botan::OID("2.5.4.10"), 64 }, // X520.Organization { Botan::OID("2.5.4.11"), 64 }, // X520.OrganizationalUnit { Botan::OID("2.5.4.12"), 64 }, // X520.Title { Botan::OID("2.5.4.3"), 64 }, // X520.CommonName { Botan::OID("2.5.4.4"), 40 }, // X520.Surname { Botan::OID("2.5.4.42"), 32768 }, // X520.GivenName { Botan::OID("2.5.4.43"), 32768 }, // X520.Initials { Botan::OID("2.5.4.44"), 32768 }, // X520.GenerationalQualifier { Botan::OID("2.5.4.46"), 64 }, // X520.DNQualifier { Botan::OID("2.5.4.5"), 64 }, // X520.SerialNumber { Botan::OID("2.5.4.6"), 3 }, // X520.Country { Botan::OID("2.5.4.65"), 128 }, // X520.Pseudonym { Botan::OID("2.5.4.7"), 128 }, // X520.Locality { Botan::OID("2.5.4.8"), 128 } // X520.State }; } namespace Botan { //static size_t X509_DN::lookup_ub(const OID& oid) { auto ub_entry = DN_UB.find(oid); if(ub_entry != DN_UB.end()) { return ub_entry->second; } else { return 0; } } } botan-2.4.0/src/lib/x509/x509_ext.cpp000066400000000000000000000620021322470703100167520ustar00rootroot00000000000000/* * X.509 Certificate Extensions * (C) 1999-2010,2012 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * (C) 2017 Fabian Weissberg, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include namespace Botan { /* * Create a Certificate_Extension object of some kind to handle */ std::unique_ptr Extensions::create_extn_obj(const OID& oid, bool critical, const std::vector& body) { const std::string oid_str = oid.as_string(); std::unique_ptr extn; if(oid == Cert_Extension::Subject_Key_ID::static_oid()) { extn.reset(new Cert_Extension::Subject_Key_ID); } else if(oid == Cert_Extension::Key_Usage::static_oid()) { extn.reset(new Cert_Extension::Key_Usage); } else if(oid == Cert_Extension::Subject_Alternative_Name::static_oid()) { extn.reset(new Cert_Extension::Subject_Alternative_Name); } else if(oid == Cert_Extension::Issuer_Alternative_Name::static_oid()) { extn.reset(new Cert_Extension::Issuer_Alternative_Name); } else if(oid == Cert_Extension::Basic_Constraints::static_oid()) { extn.reset(new Cert_Extension::Basic_Constraints); } else if(oid == Cert_Extension::CRL_Number::static_oid()) { extn.reset(new Cert_Extension::CRL_Number); } else if(oid == Cert_Extension::CRL_ReasonCode::static_oid()) { extn.reset(new Cert_Extension::CRL_ReasonCode); } else if(oid == Cert_Extension::Authority_Key_ID::static_oid()) { extn.reset(new Cert_Extension::Authority_Key_ID); } else if(oid == Cert_Extension::Name_Constraints::static_oid()) { extn.reset(new Cert_Extension::Name_Constraints); } else if(oid == Cert_Extension::CRL_Distribution_Points::static_oid()) { extn.reset(new Cert_Extension::CRL_Distribution_Points); } else if(oid == Cert_Extension::CRL_Issuing_Distribution_Point::static_oid()) { extn.reset(new Cert_Extension::CRL_Issuing_Distribution_Point); } else if(oid == Cert_Extension::Certificate_Policies::static_oid()) { extn.reset(new Cert_Extension::Certificate_Policies); } else if(oid == Cert_Extension::Extended_Key_Usage::static_oid()) { extn.reset(new Cert_Extension::Extended_Key_Usage); } else if(oid == Cert_Extension::Authority_Information_Access::static_oid()) { extn.reset(new Cert_Extension::Authority_Information_Access); } else { // some other unknown extension type extn.reset(new Cert_Extension::Unknown_Extension(oid, critical)); } try { extn->decode_inner(body); } catch(Decoding_Error& e) { throw Decoding_Error("Decoding X.509 extension " + oid.as_string() + " failed", e.what()); } return extn; } /* * Validate the extension (the default implementation is a NOP) */ void Certificate_Extension::validate(const X509_Certificate&, const X509_Certificate&, const std::vector>&, std::vector>&, size_t) { } /* * Add a new cert */ void Extensions::add(Certificate_Extension* extn, bool critical) { // sanity check: we don't want to have the same extension more than once if(m_extension_info.count(extn->oid_of()) > 0) throw Invalid_Argument(extn->oid_name() + " extension already present in Extensions::add"); const OID oid = extn->oid_of(); Extensions_Info info(critical, extn); m_extension_oids.push_back(oid); m_extension_info.emplace(oid, info); } void Extensions::replace(Certificate_Extension* extn, bool critical) { // Remove it if it existed m_extension_info.erase(extn->oid_of()); const OID oid = extn->oid_of(); Extensions_Info info(critical, extn); m_extension_oids.push_back(oid); m_extension_info.emplace(oid, info); } bool Extensions::extension_set(const OID& oid) const { return (m_extension_info.find(oid) != m_extension_info.end()); } bool Extensions::critical_extension_set(const OID& oid) const { auto i = m_extension_info.find(oid); if(i != m_extension_info.end()) return i->second.is_critical(); return false; } const Certificate_Extension* Extensions::get_extension_object(const OID& oid) const { auto extn = m_extension_info.find(oid); if(extn == m_extension_info.end()) return nullptr; return &extn->second.obj(); } std::unique_ptr Extensions::get(const OID& oid) const { if(const Certificate_Extension* ext = this->get_extension_object(oid)) { return std::unique_ptr(ext->copy()); } return nullptr; } std::vector, bool>> Extensions::extensions() const { std::vector, bool>> exts; for(auto&& ext : m_extension_info) { exts.push_back( std::make_pair( std::unique_ptr(ext.second.obj().copy()), ext.second.is_critical()) ); } return exts; } std::map, bool>> Extensions::extensions_raw() const { std::map, bool>> out; for(auto&& ext : m_extension_info) { out.emplace(ext.first, std::make_pair(ext.second.bits(), ext.second.is_critical())); } return out; } /* * Encode an Extensions list */ void Extensions::encode_into(DER_Encoder& to_object) const { for(auto ext_info : m_extension_info) { const OID& oid = ext_info.first; const bool should_encode = ext_info.second.obj().should_encode(); if(should_encode) { const bool is_critical = ext_info.second.is_critical(); const std::vector& ext_value = ext_info.second.bits(); to_object.start_cons(SEQUENCE) .encode(oid) .encode_optional(is_critical, false) .encode(ext_value, OCTET_STRING) .end_cons(); } } } /* * Decode a list of Extensions */ void Extensions::decode_from(BER_Decoder& from_source) { m_extension_oids.clear(); m_extension_info.clear(); BER_Decoder sequence = from_source.start_cons(SEQUENCE); while(sequence.more_items()) { OID oid; bool critical; std::vector bits; sequence.start_cons(SEQUENCE) .decode(oid) .decode_optional(critical, BOOLEAN, UNIVERSAL, false) .decode(bits, OCTET_STRING) .end_cons(); std::unique_ptr obj = create_extn_obj(oid, critical, bits); Extensions_Info info(critical, bits, obj.release()); m_extension_oids.push_back(oid); m_extension_info.emplace(oid, info); } sequence.verify_end(); } /* * Write the extensions to an info store */ void Extensions::contents_to(Data_Store& subject_info, Data_Store& issuer_info) const { for(auto&& m_extn_info : m_extension_info) { m_extn_info.second.obj().contents_to(subject_info, issuer_info); subject_info.add(m_extn_info.second.obj().oid_name() + ".is_critical", m_extn_info.second.is_critical()); } } namespace Cert_Extension { /* * Checked accessor for the path_limit member */ size_t Basic_Constraints::get_path_limit() const { if(!m_is_ca) throw Invalid_State("Basic_Constraints::get_path_limit: Not a CA"); return m_path_limit; } /* * Encode the extension */ std::vector Basic_Constraints::encode_inner() const { return DER_Encoder() .start_cons(SEQUENCE) .encode_if(m_is_ca, DER_Encoder() .encode(m_is_ca) .encode_optional(m_path_limit, NO_CERT_PATH_LIMIT) ) .end_cons() .get_contents_unlocked(); } /* * Decode the extension */ void Basic_Constraints::decode_inner(const std::vector& in) { BER_Decoder(in) .start_cons(SEQUENCE) .decode_optional(m_is_ca, BOOLEAN, UNIVERSAL, false) .decode_optional(m_path_limit, INTEGER, UNIVERSAL, NO_CERT_PATH_LIMIT) .end_cons(); if(m_is_ca == false) m_path_limit = 0; } /* * Return a textual representation */ void Basic_Constraints::contents_to(Data_Store& subject, Data_Store&) const { subject.add("X509v3.BasicConstraints.is_ca", (m_is_ca ? 1 : 0)); subject.add("X509v3.BasicConstraints.path_constraint", static_cast(m_path_limit)); } /* * Encode the extension */ std::vector Key_Usage::encode_inner() const { if(m_constraints == NO_CONSTRAINTS) throw Encoding_Error("Cannot encode zero usage constraints"); const size_t unused_bits = low_bit(m_constraints) - 1; std::vector der; der.push_back(BIT_STRING); der.push_back(2 + ((unused_bits < 8) ? 1 : 0)); der.push_back(unused_bits % 8); der.push_back((m_constraints >> 8) & 0xFF); if(m_constraints & 0xFF) der.push_back(m_constraints & 0xFF); return der; } /* * Decode the extension */ void Key_Usage::decode_inner(const std::vector& in) { BER_Decoder ber(in); BER_Object obj = ber.get_next_object(); if(obj.type_tag != BIT_STRING || obj.class_tag != UNIVERSAL) throw BER_Bad_Tag("Bad tag for usage constraint", obj.type_tag, obj.class_tag); if(obj.value.size() != 2 && obj.value.size() != 3) throw BER_Decoding_Error("Bad size for BITSTRING in usage constraint"); if(obj.value[0] >= 8) throw BER_Decoding_Error("Invalid unused bits in usage constraint"); obj.value[obj.value.size()-1] &= (0xFF << obj.value[0]); uint16_t usage = 0; for(size_t i = 1; i != obj.value.size(); ++i) { usage = (obj.value[i] << 8*(sizeof(usage)-i)) | usage; } m_constraints = Key_Constraints(usage); } /* * Return a textual representation */ void Key_Usage::contents_to(Data_Store& subject, Data_Store&) const { subject.add("X509v3.KeyUsage", m_constraints); } /* * Encode the extension */ std::vector Subject_Key_ID::encode_inner() const { return DER_Encoder().encode(m_key_id, OCTET_STRING).get_contents_unlocked(); } /* * Decode the extension */ void Subject_Key_ID::decode_inner(const std::vector& in) { BER_Decoder(in).decode(m_key_id, OCTET_STRING).verify_end(); } /* * Return a textual representation */ void Subject_Key_ID::contents_to(Data_Store& subject, Data_Store&) const { subject.add("X509v3.SubjectKeyIdentifier", m_key_id); } /* * Subject_Key_ID Constructor */ Subject_Key_ID::Subject_Key_ID(const std::vector& pub_key, const std::string& hash_name) { std::unique_ptr hash(HashFunction::create_or_throw(hash_name)); m_key_id.resize(hash->output_length()); hash->update(pub_key); hash->final(m_key_id.data()); } /* * Encode the extension */ std::vector Authority_Key_ID::encode_inner() const { return DER_Encoder() .start_cons(SEQUENCE) .encode(m_key_id, OCTET_STRING, ASN1_Tag(0), CONTEXT_SPECIFIC) .end_cons() .get_contents_unlocked(); } /* * Decode the extension */ void Authority_Key_ID::decode_inner(const std::vector& in) { BER_Decoder(in) .start_cons(SEQUENCE) .decode_optional_string(m_key_id, OCTET_STRING, 0); } /* * Return a textual representation */ void Authority_Key_ID::contents_to(Data_Store&, Data_Store& issuer) const { if(m_key_id.size()) issuer.add("X509v3.AuthorityKeyIdentifier", m_key_id); } /* * Encode the extension */ std::vector Subject_Alternative_Name::encode_inner() const { return DER_Encoder().encode(m_alt_name).get_contents_unlocked(); } /* * Encode the extension */ std::vector Issuer_Alternative_Name::encode_inner() const { return DER_Encoder().encode(m_alt_name).get_contents_unlocked(); } /* * Decode the extension */ void Subject_Alternative_Name::decode_inner(const std::vector& in) { BER_Decoder(in).decode(m_alt_name); } /* * Decode the extension */ void Issuer_Alternative_Name::decode_inner(const std::vector& in) { BER_Decoder(in).decode(m_alt_name); } /* * Return a textual representation */ void Subject_Alternative_Name::contents_to(Data_Store& subject_info, Data_Store&) const { subject_info.add(get_alt_name().contents()); } /* * Return a textual representation */ void Issuer_Alternative_Name::contents_to(Data_Store&, Data_Store& issuer_info) const { issuer_info.add(get_alt_name().contents()); } /* * Encode the extension */ std::vector Extended_Key_Usage::encode_inner() const { return DER_Encoder() .start_cons(SEQUENCE) .encode_list(m_oids) .end_cons() .get_contents_unlocked(); } /* * Decode the extension */ void Extended_Key_Usage::decode_inner(const std::vector& in) { BER_Decoder(in).decode_list(m_oids); } /* * Return a textual representation */ void Extended_Key_Usage::contents_to(Data_Store& subject, Data_Store&) const { for(size_t i = 0; i != m_oids.size(); ++i) subject.add("X509v3.ExtendedKeyUsage", m_oids[i].as_string()); } /* * Encode the extension */ std::vector Name_Constraints::encode_inner() const { throw Not_Implemented("Name_Constraints encoding"); } /* * Decode the extension */ void Name_Constraints::decode_inner(const std::vector& in) { std::vector permit, exclude; BER_Decoder ber(in); BER_Decoder ext = ber.start_cons(SEQUENCE); BER_Object per = ext.get_next_object(); ext.push_back(per); if(per.type_tag == 0 && per.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { ext.decode_list(permit,ASN1_Tag(0),ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)); if(permit.empty()) throw Encoding_Error("Empty Name Contraint list"); } BER_Object exc = ext.get_next_object(); ext.push_back(exc); if(per.type_tag == 1 && per.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { ext.decode_list(exclude,ASN1_Tag(1),ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)); if(exclude.empty()) throw Encoding_Error("Empty Name Contraint list"); } ext.end_cons(); if(permit.empty() && exclude.empty()) throw Encoding_Error("Empty Name Contraint extension"); m_name_constraints = NameConstraints(std::move(permit),std::move(exclude)); } /* * Return a textual representation */ void Name_Constraints::contents_to(Data_Store& subject, Data_Store&) const { std::stringstream ss; for(const GeneralSubtree& gs: m_name_constraints.permitted()) { ss << gs; subject.add("X509v3.NameConstraints.permitted", ss.str()); ss.str(std::string()); } for(const GeneralSubtree& gs: m_name_constraints.excluded()) { ss << gs; subject.add("X509v3.NameConstraints.excluded", ss.str()); ss.str(std::string()); } } void Name_Constraints::validate(const X509_Certificate& subject, const X509_Certificate& issuer, const std::vector>& cert_path, std::vector>& cert_status, size_t pos) { if(!m_name_constraints.permitted().empty() || !m_name_constraints.excluded().empty()) { if(!subject.is_CA_cert() || !subject.is_critical("X509v3.NameConstraints")) cert_status.at(pos).insert(Certificate_Status_Code::NAME_CONSTRAINT_ERROR); const bool issuer_name_constraint_critical = issuer.is_critical("X509v3.NameConstraints"); const bool at_self_signed_root = (pos == cert_path.size() - 1); // Check that all subordinate certs pass the name constraint for(size_t j = 0; j <= pos; ++j) { if(pos == j && at_self_signed_root) continue; bool permitted = m_name_constraints.permitted().empty(); bool failed = false; for(auto c: m_name_constraints.permitted()) { switch(c.base().matches(*cert_path.at(j))) { case GeneralName::MatchResult::NotFound: case GeneralName::MatchResult::All: permitted = true; break; case GeneralName::MatchResult::UnknownType: failed = issuer_name_constraint_critical; permitted = true; break; default: break; } } for(auto c: m_name_constraints.excluded()) { switch(c.base().matches(*cert_path.at(j))) { case GeneralName::MatchResult::All: case GeneralName::MatchResult::Some: failed = true; break; case GeneralName::MatchResult::UnknownType: failed = issuer_name_constraint_critical; break; default: break; } } if(failed || !permitted) { cert_status.at(j).insert(Certificate_Status_Code::NAME_CONSTRAINT_ERROR); } } } } namespace { /* * A policy specifier */ class Policy_Information final : public ASN1_Object { public: Policy_Information() = default; explicit Policy_Information(const OID& oid) : m_oid(oid) {} const OID& oid() const { return m_oid; } void encode_into(DER_Encoder& codec) const override { codec.start_cons(SEQUENCE) .encode(m_oid) .end_cons(); } void decode_from(BER_Decoder& codec) override { codec.start_cons(SEQUENCE) .decode(m_oid) .discard_remaining() .end_cons(); } private: OID m_oid; }; } /* * Encode the extension */ std::vector Certificate_Policies::encode_inner() const { std::vector policies; for(size_t i = 0; i != m_oids.size(); ++i) policies.push_back(Policy_Information(m_oids[i])); return DER_Encoder() .start_cons(SEQUENCE) .encode_list(policies) .end_cons() .get_contents_unlocked(); } /* * Decode the extension */ void Certificate_Policies::decode_inner(const std::vector& in) { std::vector policies; BER_Decoder(in).decode_list(policies); m_oids.clear(); for(size_t i = 0; i != policies.size(); ++i) m_oids.push_back(policies[i].oid()); } /* * Return a textual representation */ void Certificate_Policies::contents_to(Data_Store& info, Data_Store&) const { for(size_t i = 0; i != m_oids.size(); ++i) info.add("X509v3.CertificatePolicies", m_oids[i].as_string()); } void Certificate_Policies::validate( const X509_Certificate& /*subject*/, const X509_Certificate& /*issuer*/, const std::vector>& /*cert_path*/, std::vector>& cert_status, size_t pos) { std::set oid_set(m_oids.begin(), m_oids.end()); if(oid_set.size() != m_oids.size()) { cert_status.at(pos).insert(Certificate_Status_Code::DUPLICATE_CERT_POLICY); } } std::vector Authority_Information_Access::encode_inner() const { ASN1_String url(m_ocsp_responder, IA5_STRING); return DER_Encoder() .start_cons(SEQUENCE) .start_cons(SEQUENCE) .encode(OIDS::lookup("PKIX.OCSP")) .add_object(ASN1_Tag(6), CONTEXT_SPECIFIC, url.value()) .end_cons() .end_cons().get_contents_unlocked(); } void Authority_Information_Access::decode_inner(const std::vector& in) { BER_Decoder ber = BER_Decoder(in).start_cons(SEQUENCE); while(ber.more_items()) { OID oid; BER_Decoder info = ber.start_cons(SEQUENCE); info.decode(oid); if(oid == OIDS::lookup("PKIX.OCSP")) { BER_Object name = info.get_next_object(); if(name.type_tag == 6 && name.class_tag == CONTEXT_SPECIFIC) { m_ocsp_responder = ASN1::to_string(name); } } if(oid == OIDS::lookup("PKIX.CertificateAuthorityIssuers")) { BER_Object name = info.get_next_object(); if(name.type_tag == 6 && name.class_tag == CONTEXT_SPECIFIC) { m_ca_issuers.push_back(ASN1::to_string(name)); } } } } void Authority_Information_Access::contents_to(Data_Store& subject, Data_Store&) const { if(!m_ocsp_responder.empty()) subject.add("OCSP.responder", m_ocsp_responder); for(const std::string& ca_issuer : m_ca_issuers) subject.add("PKIX.CertificateAuthorityIssuers", ca_issuer); } /* * Checked accessor for the crl_number member */ size_t CRL_Number::get_crl_number() const { if(!m_has_value) throw Invalid_State("CRL_Number::get_crl_number: Not set"); return m_crl_number; } /* * Copy a CRL_Number extension */ CRL_Number* CRL_Number::copy() const { if(!m_has_value) throw Invalid_State("CRL_Number::copy: Not set"); return new CRL_Number(m_crl_number); } /* * Encode the extension */ std::vector CRL_Number::encode_inner() const { return DER_Encoder().encode(m_crl_number).get_contents_unlocked(); } /* * Decode the extension */ void CRL_Number::decode_inner(const std::vector& in) { BER_Decoder(in).decode(m_crl_number); m_has_value = true; } /* * Return a textual representation */ void CRL_Number::contents_to(Data_Store& info, Data_Store&) const { info.add("X509v3.CRLNumber", static_cast(m_crl_number)); } /* * Encode the extension */ std::vector CRL_ReasonCode::encode_inner() const { return DER_Encoder() .encode(static_cast(m_reason), ENUMERATED, UNIVERSAL) .get_contents_unlocked(); } /* * Decode the extension */ void CRL_ReasonCode::decode_inner(const std::vector& in) { size_t reason_code = 0; BER_Decoder(in).decode(reason_code, ENUMERATED, UNIVERSAL); m_reason = static_cast(reason_code); } /* * Return a textual representation */ void CRL_ReasonCode::contents_to(Data_Store& info, Data_Store&) const { info.add("X509v3.CRLReasonCode", m_reason); } std::vector CRL_Distribution_Points::encode_inner() const { throw Not_Implemented("CRL_Distribution_Points encoding"); } void CRL_Distribution_Points::decode_inner(const std::vector& buf) { BER_Decoder(buf) .decode_list(m_distribution_points) .verify_end(); std::stringstream ss; for(size_t i = 0; i != m_distribution_points.size(); ++i) { auto contents = m_distribution_points[i].point().contents(); for(const auto& pair : contents) { ss << pair.first << ": " << pair.second << " "; } } m_crl_distribution_urls.push_back(ss.str()); } void CRL_Distribution_Points::contents_to(Data_Store& subject, Data_Store&) const { for(const std::string& crl_url : m_crl_distribution_urls) subject.add("CRL.DistributionPoint", crl_url); } void CRL_Distribution_Points::Distribution_Point::encode_into(class DER_Encoder&) const { throw Not_Implemented("CRL_Distribution_Points encoding"); } void CRL_Distribution_Points::Distribution_Point::decode_from(class BER_Decoder& ber) { ber.start_cons(SEQUENCE) .start_cons(ASN1_Tag(0), CONTEXT_SPECIFIC) .decode_optional_implicit(m_point, ASN1_Tag(0), ASN1_Tag(CONTEXT_SPECIFIC | CONSTRUCTED), SEQUENCE, CONSTRUCTED) .end_cons().end_cons(); } std::vector CRL_Issuing_Distribution_Point::encode_inner() const { throw Not_Implemented("CRL_Issuing_Distribution_Point encoding"); } void CRL_Issuing_Distribution_Point::decode_inner(const std::vector& buf) { BER_Decoder(buf).decode(m_distribution_point).verify_end(); } void CRL_Issuing_Distribution_Point::contents_to(Data_Store& info, Data_Store&) const { auto contents = m_distribution_point.point().contents(); std::stringstream ss; for(const auto& pair : contents) { ss << pair.first << ": " << pair.second << " "; } info.add("X509v3.CRLIssuingDistributionPoint", ss.str()); } std::vector Unknown_Extension::encode_inner() const { return m_bytes; } void Unknown_Extension::decode_inner(const std::vector& bytes) { // Just treat as an opaque blob at this level m_bytes = bytes; } void Unknown_Extension::contents_to(Data_Store&, Data_Store&) const { // No information store } } } botan-2.4.0/src/lib/x509/x509_ext.h000066400000000000000000000626571322470703100164370ustar00rootroot00000000000000/* * X.509 Certificate Extensions * (C) 1999-2007,2012 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_EXTENSIONS_H_ #define BOTAN_X509_EXTENSIONS_H_ #include #include #include #include #include #include #include #include namespace Botan { class Data_Store; class X509_Certificate; /** * X.509 Certificate Extension */ class BOTAN_PUBLIC_API(2,0) Certificate_Extension { public: /** * @return OID representing this extension */ virtual OID oid_of() const = 0; /* * @return specific OID name * If possible OIDS table should match oid_name to OIDS, ie * OIDS::lookup(ext->oid_name()) == ext->oid_of() * Should return empty string if OID is not known */ virtual std::string oid_name() const = 0; /** * Make a copy of this extension * @return copy of this */ virtual Certificate_Extension* copy() const = 0; /* * Add the contents of this extension into the information * for the subject and/or issuer, as necessary. * @param subject the subject info * @param issuer the issuer info */ virtual void contents_to(Data_Store& subject, Data_Store& issuer) const = 0; /* * Callback visited during path validation. * * An extension can implement this callback to inspect * the path during path validation. * * If an error occurs during validation of this extension, * an appropriate status code shall be added to cert_status. * * @param subject Subject certificate that contains this extension * @param issuer Issuer certificate * @param status Certificate validation status codes for subject certificate * @param cert_path Certificate path which is currently validated * @param pos Position of subject certificate in cert_path */ virtual void validate(const X509_Certificate& subject, const X509_Certificate& issuer, const std::vector>& cert_path, std::vector>& cert_status, size_t pos); virtual ~Certificate_Extension() = default; protected: friend class Extensions; virtual bool should_encode() const { return true; } virtual std::vector encode_inner() const = 0; virtual void decode_inner(const std::vector&) = 0; }; /** * X.509 Certificate Extension List */ class BOTAN_PUBLIC_API(2,0) Extensions final : public ASN1_Object { public: /** * Look up an object in the extensions, based on OID Returns * nullptr if not set, if the extension was either absent or not * handled. The pointer returned is owned by the Extensions * object. * This would be better with an optional return value */ const Certificate_Extension* get_extension_object(const OID& oid) const; template const T* get_extension_object_as(const OID& oid = T::static_oid()) const { if(const Certificate_Extension* extn = get_extension_object(oid)) { if(const T* extn_as_T = dynamic_cast(extn)) { return extn_as_T; } else { throw Exception("Exception::get_extension_object_as dynamic_cast failed"); } } return nullptr; } /** * Return the set of extensions in the order they appeared in the certificate * (or as they were added, if constructed) */ const std::vector& get_extension_oids() const { return m_extension_oids; } /** * Return true if an extension was set */ bool extension_set(const OID& oid) const; /** * Return true if an extesion was set and marked critical */ bool critical_extension_set(const OID& oid) const; /** * Return the raw bytes of the extension * Will throw if OID was not set as an extension. */ std::vector get_extension_bits(const OID& oid) const; void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; void contents_to(Data_Store&, Data_Store&) const; /** * Adds a new extension to the list. * @param extn pointer to the certificate extension (Extensions takes ownership) * @param critical whether this extension should be marked as critical * @throw Invalid_Argument if the extension is already present in the list */ void add(Certificate_Extension* extn, bool critical = false); /** * Adds an extension to the list or replaces it. * @param extn the certificate extension * @param critical whether this extension should be marked as critical */ void replace(Certificate_Extension* extn, bool critical = false); /** * Searches for an extension by OID and returns the result. * Only the known extensions types declared in this header * are searched for by this function. * @return Copy of extension with oid, nullptr if not found. * Can avoid creating a copy by using get_extension_object function */ std::unique_ptr get(const OID& oid) const; /** * Searches for an extension by OID and returns the result decoding * it to some arbitrary extension type chosen by the application. * * Only the unknown extensions, that is, extensions types that * are not declared in this header, are searched for by this * function. * * @return Pointer to new extension with oid, nullptr if not found. */ template std::unique_ptr get_raw(const OID& oid) const { auto extn_info = m_extension_info.find(oid); if(extn_info != m_extension_info.end()) { // Unknown_Extension oid_name is empty if(extn_info->second.obj().oid_name() == "") { std::unique_ptr ext(new T); ext->decode_inner(extn_info->second.bits()); return std::move(ext); } } return nullptr; } /** * Returns a copy of the list of extensions together with the corresponding * criticality flag. All extensions are encoded as some object, falling back * to Unknown_Extension class which simply allows reading the bytes as well * as the criticality flag. */ std::vector, bool>> extensions() const; /** * Returns the list of extensions as raw, encoded bytes * together with the corresponding criticality flag. * Contains all extensions, including any extensions encoded as Unknown_Extension */ std::map, bool>> extensions_raw() const; Extensions() {} Extensions(const Extensions&) = default; Extensions& operator=(const Extensions&) = default; #if !defined(BOTAN_BUILD_COMPILER_IS_MSVC_2013) Extensions(Extensions&&) = default; Extensions& operator=(Extensions&&) = default; #endif private: static std::unique_ptr create_extn_obj(const OID& oid, bool critical, const std::vector& body); class Extensions_Info { public: Extensions_Info(bool critical, Certificate_Extension* ext) : m_obj(ext), m_bits(m_obj->encode_inner()), m_critical(critical) { } Extensions_Info(bool critical, const std::vector& encoding, Certificate_Extension* ext) : m_obj(ext), m_bits(encoding), m_critical(critical) { } bool is_critical() const { return m_critical; } const std::vector& bits() const { return m_bits; } const Certificate_Extension& obj() const { BOTAN_ASSERT_NONNULL(m_obj.get()); return *m_obj.get(); } private: std::shared_ptr m_obj; std::vector m_bits; bool m_critical = false; }; std::vector m_extension_oids; std::map m_extension_info; }; namespace Cert_Extension { static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0; /** * Basic Constraints Extension */ class BOTAN_PUBLIC_API(2,0) Basic_Constraints final : public Certificate_Extension { public: Basic_Constraints* copy() const override { return new Basic_Constraints(m_is_ca, m_path_limit); } Basic_Constraints(bool ca = false, size_t limit = 0) : m_is_ca(ca), m_path_limit(limit) {} bool get_is_ca() const { return m_is_ca; } size_t get_path_limit() const; static OID static_oid() { return OID("2.5.29.19"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.BasicConstraints"; } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; bool m_is_ca; size_t m_path_limit; }; /** * Key Usage Constraints Extension */ class BOTAN_PUBLIC_API(2,0) Key_Usage final : public Certificate_Extension { public: Key_Usage* copy() const override { return new Key_Usage(m_constraints); } explicit Key_Usage(Key_Constraints c = NO_CONSTRAINTS) : m_constraints(c) {} Key_Constraints get_constraints() const { return m_constraints; } static OID static_oid() { return OID("2.5.29.15"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.KeyUsage"; } bool should_encode() const override { return (m_constraints != NO_CONSTRAINTS); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; Key_Constraints m_constraints; }; /** * Subject Key Identifier Extension */ class BOTAN_PUBLIC_API(2,0) Subject_Key_ID final : public Certificate_Extension { public: Subject_Key_ID() = default; Subject_Key_ID(const std::vector& public_key, const std::string& hash_fn); Subject_Key_ID* copy() const override { return new Subject_Key_ID(m_key_id); } const std::vector& get_key_id() const { return m_key_id; } static OID static_oid() { return OID("2.5.29.14"); } OID oid_of() const override { return static_oid(); } private: explicit Subject_Key_ID(const std::vector& k) : m_key_id(k) {} std::string oid_name() const override { return "X509v3.SubjectKeyIdentifier"; } bool should_encode() const override { return (m_key_id.size() > 0); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; std::vector m_key_id; }; /** * Authority Key Identifier Extension */ class BOTAN_PUBLIC_API(2,0) Authority_Key_ID final : public Certificate_Extension { public: Authority_Key_ID* copy() const override { return new Authority_Key_ID(m_key_id); } Authority_Key_ID() = default; explicit Authority_Key_ID(const std::vector& k) : m_key_id(k) {} const std::vector& get_key_id() const { return m_key_id; } static OID static_oid() { return OID("2.5.29.35"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.AuthorityKeyIdentifier"; } bool should_encode() const override { return (m_key_id.size() > 0); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; std::vector m_key_id; }; /** * Subject Alternative Name Extension */ class BOTAN_PUBLIC_API(2,4) Subject_Alternative_Name final : public Certificate_Extension { public: const AlternativeName& get_alt_name() const { return m_alt_name; } static OID static_oid() { return OID("2.5.29.17"); } OID oid_of() const override { return static_oid(); } Subject_Alternative_Name* copy() const override { return new Subject_Alternative_Name(get_alt_name()); } explicit Subject_Alternative_Name(const AlternativeName& name = AlternativeName()) : m_alt_name(name) {} private: std::string oid_name() const override { return "X509v3.SubjectAlternativeName"; } bool should_encode() const override { return m_alt_name.has_items(); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; AlternativeName m_alt_name; }; /** * Issuer Alternative Name Extension */ class BOTAN_PUBLIC_API(2,0) Issuer_Alternative_Name final : public Certificate_Extension { public: const AlternativeName& get_alt_name() const { return m_alt_name; } static OID static_oid() { return OID("2.5.29.18"); } OID oid_of() const override { return static_oid(); } Issuer_Alternative_Name* copy() const override { return new Issuer_Alternative_Name(get_alt_name()); } explicit Issuer_Alternative_Name(const AlternativeName& name = AlternativeName()) : m_alt_name(name) {} private: std::string oid_name() const override { return "X509v3.IssuerAlternativeName"; } bool should_encode() const override { return m_alt_name.has_items(); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; AlternativeName m_alt_name; }; /** * Extended Key Usage Extension */ class BOTAN_PUBLIC_API(2,0) Extended_Key_Usage final : public Certificate_Extension { public: Extended_Key_Usage* copy() const override { return new Extended_Key_Usage(m_oids); } Extended_Key_Usage() = default; explicit Extended_Key_Usage(const std::vector& o) : m_oids(o) {} const std::vector& get_oids() const { return m_oids; } static OID static_oid() { return OID("2.5.29.37"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.ExtendedKeyUsage"; } bool should_encode() const override { return (m_oids.size() > 0); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; std::vector m_oids; }; /** * Name Constraints */ class BOTAN_PUBLIC_API(2,0) Name_Constraints final : public Certificate_Extension { public: Name_Constraints* copy() const override { return new Name_Constraints(m_name_constraints); } Name_Constraints() = default; Name_Constraints(const NameConstraints &nc) : m_name_constraints(nc) {} void validate(const X509_Certificate& subject, const X509_Certificate& issuer, const std::vector>& cert_path, std::vector>& cert_status, size_t pos) override; const NameConstraints& get_name_constraints() const { return m_name_constraints; } static OID static_oid() { return OID("2.5.29.30"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.NameConstraints"; } bool should_encode() const override { return true; } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; NameConstraints m_name_constraints; }; /** * Certificate Policies Extension */ class BOTAN_PUBLIC_API(2,0) Certificate_Policies final : public Certificate_Extension { public: Certificate_Policies* copy() const override { return new Certificate_Policies(m_oids); } Certificate_Policies() = default; explicit Certificate_Policies(const std::vector& o) : m_oids(o) {} BOTAN_DEPRECATED("Use get_policy_oids") std::vector get_oids() const { return m_oids; } const std::vector& get_policy_oids() const { return m_oids; } static OID static_oid() { return OID("2.5.29.32"); } OID oid_of() const override { return static_oid(); } void validate(const X509_Certificate& subject, const X509_Certificate& issuer, const std::vector>& cert_path, std::vector>& cert_status, size_t pos) override; private: std::string oid_name() const override { return "X509v3.CertificatePolicies"; } bool should_encode() const override { return (m_oids.size() > 0); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; std::vector m_oids; }; /** * Authority Information Access Extension */ class BOTAN_PUBLIC_API(2,0) Authority_Information_Access final : public Certificate_Extension { public: Authority_Information_Access* copy() const override { return new Authority_Information_Access(m_ocsp_responder, m_ca_issuers); } Authority_Information_Access() = default; explicit Authority_Information_Access(const std::string& ocsp, const std::vector& ca_issuers = std::vector()) : m_ocsp_responder(ocsp), m_ca_issuers(ca_issuers) {} std::string ocsp_responder() const { return m_ocsp_responder; } static OID static_oid() { return OID("1.3.6.1.5.5.7.1.1"); } OID oid_of() const override { return static_oid(); } const std::vector ca_issuers() const { return m_ca_issuers; } private: std::string oid_name() const override { return "PKIX.AuthorityInformationAccess"; } bool should_encode() const override { return (!m_ocsp_responder.empty()); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; std::string m_ocsp_responder; std::vector m_ca_issuers; }; /** * CRL Number Extension */ class BOTAN_PUBLIC_API(2,0) CRL_Number final : public Certificate_Extension { public: CRL_Number* copy() const override; CRL_Number() : m_has_value(false), m_crl_number(0) {} CRL_Number(size_t n) : m_has_value(true), m_crl_number(n) {} size_t get_crl_number() const; static OID static_oid() { return OID("2.5.29.20"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.CRLNumber"; } bool should_encode() const override { return m_has_value; } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; bool m_has_value; size_t m_crl_number; }; /** * CRL Entry Reason Code Extension */ class BOTAN_PUBLIC_API(2,0) CRL_ReasonCode final : public Certificate_Extension { public: CRL_ReasonCode* copy() const override { return new CRL_ReasonCode(m_reason); } explicit CRL_ReasonCode(CRL_Code r = UNSPECIFIED) : m_reason(r) {} CRL_Code get_reason() const { return m_reason; } static OID static_oid() { return OID("2.5.29.21"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.ReasonCode"; } bool should_encode() const override { return (m_reason != UNSPECIFIED); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; CRL_Code m_reason; }; /** * CRL Distribution Points Extension * todo enforce restrictions from RFC 5280 4.2.1.13 */ class BOTAN_PUBLIC_API(2,0) CRL_Distribution_Points final : public Certificate_Extension { public: class BOTAN_PUBLIC_API(2,0) Distribution_Point final : public ASN1_Object { public: void encode_into(class DER_Encoder&) const override; void decode_from(class BER_Decoder&) override; const AlternativeName& point() const { return m_point; } private: AlternativeName m_point; }; CRL_Distribution_Points* copy() const override { return new CRL_Distribution_Points(m_distribution_points); } CRL_Distribution_Points() = default; explicit CRL_Distribution_Points(const std::vector& points) : m_distribution_points(points) {} const std::vector& distribution_points() const { return m_distribution_points; } const std::vector& crl_distribution_urls() const { return m_crl_distribution_urls; } static OID static_oid() { return OID("2.5.29.31"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.CRLDistributionPoints"; } bool should_encode() const override { return !m_distribution_points.empty(); } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; std::vector m_distribution_points; std::vector m_crl_distribution_urls; }; /** * CRL Issuing Distribution Point Extension * todo enforce restrictions from RFC 5280 5.2.5 */ class CRL_Issuing_Distribution_Point final : public Certificate_Extension { public: CRL_Issuing_Distribution_Point() = default; explicit CRL_Issuing_Distribution_Point(const CRL_Distribution_Points::Distribution_Point& distribution_point) : m_distribution_point(distribution_point) {} CRL_Issuing_Distribution_Point* copy() const override { return new CRL_Issuing_Distribution_Point(m_distribution_point); } const AlternativeName& get_point() const { return m_distribution_point.point(); } static OID static_oid() { return OID("2.5.29.28"); } OID oid_of() const override { return static_oid(); } private: std::string oid_name() const override { return "X509v3.CRLIssuingDistributionPoint"; } bool should_encode() const override { return true; } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; CRL_Distribution_Points::Distribution_Point m_distribution_point; }; /** * An unknown X.509 extension * Will add a failure to the path validation result, if critical */ class BOTAN_PUBLIC_API(2,4) Unknown_Extension final : public Certificate_Extension { public: Unknown_Extension(const OID& oid, bool critical) : m_oid(oid), m_critical(critical) {} Unknown_Extension* copy() const override { return new Unknown_Extension(m_oid, m_critical); } /** * Return the OID of this unknown extension */ OID oid_of() const override { return m_oid; } //static_oid not defined for Unknown_Extension /** * Return the extension contents */ const std::vector& extension_contents() const { return m_bytes; } /** * Return if this extension was marked critical */ bool is_critical_extension() const { return m_critical; } void validate(const X509_Certificate&, const X509_Certificate&, const std::vector>&, std::vector>& cert_status, size_t pos) override { if(m_critical) { cert_status.at(pos).insert(Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION); } } private: std::string oid_name() const override { return ""; } bool should_encode() const override { return true; } std::vector encode_inner() const override; void decode_inner(const std::vector&) override; void contents_to(Data_Store&, Data_Store&) const override; OID m_oid; bool m_critical; std::vector m_bytes; }; } } #endif botan-2.4.0/src/lib/x509/x509_obj.cpp000066400000000000000000000200211322470703100167170ustar00rootroot00000000000000/* * X.509 SIGNED Object * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include namespace Botan { namespace { struct Pss_params { AlgorithmIdentifier hash_algo; AlgorithmIdentifier mask_gen_algo; AlgorithmIdentifier mask_gen_hash; // redundant: decoded mask_gen_algo.parameters size_t salt_len; size_t trailer_field; }; Pss_params decode_pss_params(const std::vector& encoded_pss_params) { Pss_params pss_parameter; BER_Decoder(encoded_pss_params) .start_cons(SEQUENCE) .decode_optional(pss_parameter.hash_algo, ASN1_Tag(0), PRIVATE, AlgorithmIdentifier("SHA-160", AlgorithmIdentifier::USE_NULL_PARAM)) .decode_optional(pss_parameter.mask_gen_algo, ASN1_Tag(1), PRIVATE, AlgorithmIdentifier("MGF1", DER_Encoder().encode(AlgorithmIdentifier("SHA-160", AlgorithmIdentifier::USE_NULL_PARAM)).get_contents_unlocked())) .decode_optional(pss_parameter.salt_len, ASN1_Tag(2), PRIVATE, size_t(20)) .decode_optional(pss_parameter.trailer_field, ASN1_Tag(3), PRIVATE, size_t(1)) .end_cons(); BER_Decoder(pss_parameter.mask_gen_algo.get_parameters()).decode(pss_parameter.mask_gen_hash); return pss_parameter; } } /* * Read a PEM or BER X.509 object */ void X509_Object::load_data(DataSource& in) { try { if(ASN1::maybe_BER(in) && !PEM_Code::matches(in)) { BER_Decoder dec(in); decode_from(dec); } else { std::string got_label; DataSource_Memory ber(PEM_Code::decode(in, got_label)); if(got_label != PEM_label()) { bool is_alternate = false; for(std::string alt_label : alternate_PEM_labels()) { if(got_label == alt_label) { is_alternate = true; break; } } if(!is_alternate) throw Decoding_Error("Unexpected PEM label for " + PEM_label() + " of " + got_label); } BER_Decoder dec(ber); decode_from(dec); } } catch(Decoding_Error& e) { throw Decoding_Error(PEM_label() + " decoding failed: " + e.what()); } } void X509_Object::encode_into(DER_Encoder& to) const { to.start_cons(SEQUENCE) .start_cons(SEQUENCE) .raw_bytes(signed_body()) .end_cons() .encode(signature_algorithm()) .encode(signature(), BIT_STRING) .end_cons(); } /* * Read a BER encoded X.509 object */ void X509_Object::decode_from(BER_Decoder& from) { from.start_cons(SEQUENCE) .start_cons(SEQUENCE) .raw_bytes(m_tbs_bits) .end_cons() .decode(m_sig_algo) .decode(m_sig, BIT_STRING) .end_cons(); force_decode(); } /* * Return a BER encoded X.509 object */ std::vector X509_Object::BER_encode() const { DER_Encoder der; encode_into(der); return der.get_contents_unlocked(); } /* * Return a PEM encoded X.509 object */ std::string X509_Object::PEM_encode() const { return PEM_Code::encode(BER_encode(), PEM_label()); } /* * Return the TBS data */ std::vector X509_Object::tbs_data() const { return ASN1::put_in_sequence(m_tbs_bits); } /* * Return the hash used in generating the signature */ std::string X509_Object::hash_used_for_signature() const { const OID& oid = m_sig_algo.get_oid(); std::vector sig_info = split_on(OIDS::lookup(oid), '/'); if(sig_info.size() != 2) throw Internal_Error("Invalid name format found for " + oid.as_string()); if(sig_info[1] == "EMSA4") { return OIDS::lookup(decode_pss_params(signature_algorithm().get_parameters()).hash_algo.get_oid()); } else { std::vector pad_and_hash = parse_algorithm_name(sig_info[1]); if(pad_and_hash.size() != 2) { throw Internal_Error("Invalid name format " + sig_info[1]); } return pad_and_hash[1]; } } /* * Check the signature on an object */ bool X509_Object::check_signature(const Public_Key* pub_key) const { if(!pub_key) throw Exception("No key provided for " + PEM_label() + " signature check"); std::unique_ptr key(pub_key); return check_signature(*key); } bool X509_Object::check_signature(const Public_Key& pub_key) const { const Certificate_Status_Code code = verify_signature(pub_key); return (code == Certificate_Status_Code::VERIFIED); } Certificate_Status_Code X509_Object::verify_signature(const Public_Key& pub_key) const { const std::vector sig_info = split_on(OIDS::lookup(m_sig_algo.get_oid()), '/'); if(sig_info.size() != 2 || sig_info[0] != pub_key.algo_name()) return Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS; std::string padding = sig_info[1]; const Signature_Format format = (pub_key.message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; if(padding == "EMSA4") { // "MUST contain RSASSA-PSS-params" if(signature_algorithm().parameters.empty()) { return Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS; } Pss_params pss_parameter = decode_pss_params(signature_algorithm().parameters); // hash_algo must be SHA1, SHA2-224, SHA2-256, SHA2-384 or SHA2-512 const std::string hash_algo = OIDS::lookup(pss_parameter.hash_algo.oid); if(hash_algo != "SHA-160" && hash_algo != "SHA-224" && hash_algo != "SHA-256" && hash_algo != "SHA-384" && hash_algo != "SHA-512") { return Certificate_Status_Code::UNTRUSTED_HASH; } const std::string mgf_algo = OIDS::lookup(pss_parameter.mask_gen_algo.oid); if(mgf_algo != "MGF1") { return Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS; } // For MGF1, it is strongly RECOMMENDED that the underlying hash function be the same as the one identified by hashAlgorithm // Must be SHA1, SHA2-224, SHA2-256, SHA2-384 or SHA2-512 if(pss_parameter.mask_gen_hash.oid != pss_parameter.hash_algo.oid) { return Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS; } if(pss_parameter.trailer_field != 1) { return Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS; } // salt_len is actually not used for verification. Length is inferred from the signature padding += "(" + hash_algo + "," + mgf_algo + "," + std::to_string(pss_parameter.salt_len) + ")"; } try { PK_Verifier verifier(pub_key, padding, format); const bool valid = verifier.verify_message(tbs_data(), signature()); if(valid) return Certificate_Status_Code::VERIFIED; else return Certificate_Status_Code::SIGNATURE_ERROR; } catch(Algorithm_Not_Found&) { return Certificate_Status_Code::SIGNATURE_ALGO_UNKNOWN; } catch(...) { // This shouldn't happen, fallback to generic signature error return Certificate_Status_Code::SIGNATURE_ERROR; } } /* * Apply the X.509 SIGNED macro */ std::vector X509_Object::make_signed(PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& algo, const secure_vector& tbs_bits) { const std::vector signature = signer->sign_message(tbs_bits, rng); return DER_Encoder() .start_cons(SEQUENCE) .raw_bytes(tbs_bits) .encode(algo) .encode(signature, BIT_STRING) .end_cons() .get_contents_unlocked(); } } botan-2.4.0/src/lib/x509/x509_obj.h000066400000000000000000000077341322470703100164040ustar00rootroot00000000000000/* * X.509 SIGNED Object * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_OBJECT_H_ #define BOTAN_X509_OBJECT_H_ #include #include #include #include namespace Botan { class Public_Key; class RandomNumberGenerator; /** * This class represents abstract X.509 signed objects as in the X.500 * SIGNED macro */ class BOTAN_PUBLIC_API(2,0) X509_Object : public ASN1_Object { public: /** * The underlying data that is to be or was signed * @return data that is or was signed */ std::vector tbs_data() const; /** * @return signature on tbs_data() */ const std::vector& signature() const { return m_sig; } /** * @return signed body */ const std::vector& signed_body() const { return m_tbs_bits; } /** * @return signature algorithm that was used to generate signature */ const AlgorithmIdentifier& signature_algorithm() const { return m_sig_algo; } /** * @return hash algorithm that was used to generate signature */ std::string hash_used_for_signature() const; /** * Create a signed X509 object. * @param signer the signer used to sign the object * @param rng the random number generator to use * @param alg_id the algorithm identifier of the signature scheme * @param tbs the tbs bits to be signed * @return signed X509 object */ static std::vector make_signed(class PK_Signer* signer, RandomNumberGenerator& rng, const AlgorithmIdentifier& alg_id, const secure_vector& tbs); /** * Check the signature on this data * @param key the public key purportedly used to sign this data * @return status of the signature - OK if verified or otherwise an indicator of * the problem preventing verification. */ Certificate_Status_Code verify_signature(const Public_Key& key) const; /** * Check the signature on this data * @param key the public key purportedly used to sign this data * @return true if the signature is valid, otherwise false */ bool check_signature(const Public_Key& key) const; /** * Check the signature on this data * @param key the public key purportedly used to sign this data * the object will be deleted after use (this should have * been a std::unique_ptr) * @return true if the signature is valid, otherwise false */ bool check_signature(const Public_Key* key) const; /** * DER encode an X509_Object * See @ref ASN1_Object::encode_into() */ void encode_into(class DER_Encoder& to) const override; /** * Decode a BER encoded X509_Object * See @ref ASN1_Object::decode_from() */ void decode_from(class BER_Decoder& from) override; /** * @return BER encoding of this */ std::vector BER_encode() const; /** * @return PEM encoding of this */ std::string PEM_encode() const; X509_Object(const X509_Object&) = default; X509_Object& operator=(const X509_Object&) = default; virtual std::string PEM_label() const = 0; virtual std::vector alternate_PEM_labels() const { return std::vector(); } virtual ~X509_Object() = default; protected: X509_Object() = default; /** * Decodes from src as either DER or PEM data, then calls force_decode() */ void load_data(DataSource& src); private: virtual void force_decode() = 0; AlgorithmIdentifier m_sig_algo; std::vector m_tbs_bits; std::vector m_sig; }; } #endif botan-2.4.0/src/lib/x509/x509cert.cpp000066400000000000000000000613501322470703100167550ustar00rootroot00000000000000/* * X.509 Certificates * (C) 1999-2010,2015,2017 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { struct X509_Certificate_Data { std::vector m_serial; AlgorithmIdentifier m_sig_algo_inner; X509_DN m_issuer_dn; X509_DN m_subject_dn; std::vector m_issuer_dn_bits; std::vector m_subject_dn_bits; X509_Time m_not_before; X509_Time m_not_after; std::vector m_subject_public_key_bits; std::vector m_subject_public_key_bitstring; std::vector m_subject_public_key_bitstring_sha1; AlgorithmIdentifier m_subject_public_key_algid; std::vector m_v2_issuer_key_id; std::vector m_v2_subject_key_id; Extensions m_v3_extensions; std::vector m_extended_key_usage; std::vector m_authority_key_id; std::vector m_subject_key_id; std::vector m_cert_policies; std::vector m_crl_distribution_points; std::string m_ocsp_responder; std::vector m_ca_issuers; AlternativeName m_subject_alt_name; AlternativeName m_issuer_alt_name; NameConstraints m_name_constraints; Data_Store m_subject_ds; Data_Store m_issuer_ds; size_t m_version = 0; size_t m_path_len_constraint = 0; Key_Constraints m_key_constraints = NO_CONSTRAINTS; bool m_self_signed = false; bool m_is_ca_certificate = false; bool m_serial_negative = false; }; std::string X509_Certificate::PEM_label() const { return "CERTIFICATE"; } std::vector X509_Certificate::alternate_PEM_labels() const { return { "X509 CERTIFICATE" }; } X509_Certificate::X509_Certificate(DataSource& src) { load_data(src); } X509_Certificate::X509_Certificate(const std::vector& vec) { DataSource_Memory src(vec.data(), vec.size()); load_data(src); } #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) X509_Certificate::X509_Certificate(const std::string& fsname) { DataSource_Stream src(fsname, true); load_data(src); } #endif namespace { std::unique_ptr parse_x509_cert_body(const X509_Object& obj) { std::unique_ptr data(new X509_Certificate_Data); BER_Decoder tbs_cert(obj.signed_body()); BigInt serial_bn; tbs_cert.decode_optional(data->m_version, ASN1_Tag(0), ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) .decode(serial_bn) .decode(data->m_sig_algo_inner) .decode(data->m_issuer_dn) .start_cons(SEQUENCE) .decode(data->m_not_before) .decode(data->m_not_after) .end_cons() .decode(data->m_subject_dn); if(data->m_version > 2) throw Decoding_Error("Unknown X.509 cert version " + std::to_string(data->m_version)); if(obj.signature_algorithm() != data->m_sig_algo_inner) throw Decoding_Error("X.509 Certificate had differing algorithm identifers in inner and outer ID fields"); // crude method to save the serial's sign; will get lost during decoding, otherwise data->m_serial_negative = serial_bn.is_negative(); // for general sanity convert wire version (0 based) to standards version (v1 .. v3) data->m_version += 1; data->m_serial = BigInt::encode(serial_bn); data->m_subject_dn_bits = ASN1::put_in_sequence(data->m_subject_dn.get_bits()); data->m_issuer_dn_bits = ASN1::put_in_sequence(data->m_issuer_dn.get_bits()); BER_Object public_key = tbs_cert.get_next_object(); if(public_key.type_tag != SEQUENCE || public_key.class_tag != CONSTRUCTED) throw BER_Bad_Tag("X509_Certificate: Unexpected tag for public key", public_key.type_tag, public_key.class_tag); // validate_public_key_params(public_key.value); AlgorithmIdentifier public_key_alg_id; BER_Decoder(public_key.value).decode(public_key_alg_id).discard_remaining(); std::vector public_key_info = split_on(OIDS::oid2str(public_key_alg_id.get_oid()), '/'); if(!public_key_info.empty() && public_key_info[0] == "RSA") { // RFC4055: If PublicKeyAlgo = PSS or OAEP: limit the use of the public key exclusively to either RSASSA - PSS or RSAES - OAEP if(public_key_info.size() >= 2) { if(public_key_info[1] == "EMSA4") { /* When the RSA private key owner wishes to limit the use of the public key exclusively to RSASSA-PSS, then the id-RSASSA-PSS object identifier MUST be used in the algorithm field within the subject public key information, and, if present, the parameters field MUST contain RSASSA-PSS-params. All parameters in the signature structure algorithm identifier MUST match the parameters in the key structure algorithm identifier except the saltLength field. The saltLength field in the signature parameters MUST be greater or equal to that in the key parameters field. ToDo: Allow salt length to be greater */ if(public_key_alg_id != obj.signature_algorithm()) { throw Decoding_Error("Algorithm identifier mismatch"); } } if(public_key_info[1] == "OAEP") { throw Decoding_Error("Decoding subject public keys of type RSAES-OAEP is currently not supported"); } } else { // oid = rsaEncryption -> parameters field MUST contain NULL if(public_key_alg_id != AlgorithmIdentifier(public_key_alg_id.get_oid(), AlgorithmIdentifier::USE_NULL_PARAM)) { throw Decoding_Error("Parameters field MUST contain NULL"); } } } data->m_subject_public_key_bits = unlock(public_key.value); BER_Decoder(data->m_subject_public_key_bits) .decode(data->m_subject_public_key_algid) .decode(data->m_subject_public_key_bitstring, BIT_STRING); tbs_cert.decode_optional_string(data->m_v2_issuer_key_id, BIT_STRING, 1); tbs_cert.decode_optional_string(data->m_v2_subject_key_id, BIT_STRING, 2); BER_Object v3_exts_data = tbs_cert.get_next_object(); if(v3_exts_data.type_tag == 3 && v3_exts_data.class_tag == ASN1_Tag(CONSTRUCTED | CONTEXT_SPECIFIC)) { BER_Decoder(v3_exts_data.value).decode(data->m_v3_extensions).verify_end(); } else if(v3_exts_data.type_tag != NO_OBJECT) throw BER_Bad_Tag("Unknown tag in X.509 cert", v3_exts_data.type_tag, v3_exts_data.class_tag); if(tbs_cert.more_items()) throw Decoding_Error("TBSCertificate has extra data after extensions block"); // Now cache some fields from the extensions if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_key_constraints = ext->get_constraints(); } else { data->m_key_constraints = NO_CONSTRAINTS; } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_subject_key_id = ext->get_key_id(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_authority_key_id = ext->get_key_id(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_name_constraints = ext->get_name_constraints(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { if(ext->get_is_ca() == true) { if(data->m_key_constraints == NO_CONSTRAINTS || (data->m_key_constraints & KEY_CERT_SIGN)) { data->m_is_ca_certificate = true; data->m_path_len_constraint = ext->get_path_limit(); } } } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_issuer_alt_name = ext->get_alt_name(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_subject_alt_name = ext->get_alt_name(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_extended_key_usage = ext->get_oids(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_cert_policies = ext->get_policy_oids(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_ocsp_responder = ext->ocsp_responder(); data->m_ca_issuers = ext->ca_issuers(); } if(auto ext = data->m_v3_extensions.get_extension_object_as()) { data->m_crl_distribution_points = ext->crl_distribution_urls(); } // Check for self-signed vs self-issued certificates if(data->m_subject_dn == data->m_issuer_dn) { data->m_self_signed = false; try { std::unique_ptr pub_key( X509::load_key(ASN1::put_in_sequence(data->m_subject_public_key_bits))); Certificate_Status_Code sig_status = obj.verify_signature(*pub_key); if(sig_status == Certificate_Status_Code::OK || sig_status == Certificate_Status_Code::SIGNATURE_ALGO_UNKNOWN) { data->m_self_signed = true; } } catch(...) { // ignore errors here to allow parsing to continue } } std::unique_ptr sha1(HashFunction::create("SHA-1")); if(sha1) { sha1->update(data->m_subject_public_key_bitstring); data->m_subject_public_key_bitstring_sha1 = sha1->final_stdvec(); // otherwise left as empty, and we will throw if subject_public_key_bitstring_sha1 is called } data->m_subject_ds.add(data->m_subject_dn.contents()); data->m_issuer_ds.add(data->m_issuer_dn.contents()); data->m_v3_extensions.contents_to(data->m_subject_ds, data->m_issuer_ds); return data; } } /* * Decode the TBSCertificate data */ void X509_Certificate::force_decode() { m_data.reset(); std::unique_ptr data = parse_x509_cert_body(*this); m_data.reset(data.release()); } const X509_Certificate_Data& X509_Certificate::data() const { if(m_data == nullptr) { throw Invalid_State("X509_Certificate uninitialized"); } return *m_data.get(); } uint32_t X509_Certificate::x509_version() const { return data().m_version; } bool X509_Certificate::is_self_signed() const { return data().m_self_signed; } const X509_Time& X509_Certificate::not_before() const { return data().m_not_before; } const X509_Time& X509_Certificate::not_after() const { return data().m_not_after; } const AlgorithmIdentifier& X509_Certificate::subject_public_key_algo() const { return data().m_subject_public_key_algid; } const std::vector& X509_Certificate::v2_issuer_key_id() const { return data().m_v2_issuer_key_id; } const std::vector& X509_Certificate::v2_subject_key_id() const { return data().m_v2_subject_key_id; } const std::vector& X509_Certificate::subject_public_key_bits() const { return data().m_subject_public_key_bits; } const std::vector& X509_Certificate::subject_public_key_bitstring() const { return data().m_subject_public_key_bitstring; } const std::vector& X509_Certificate::subject_public_key_bitstring_sha1() const { if(data().m_subject_public_key_bitstring_sha1.empty()) throw Encoding_Error("X509_Certificate::subject_public_key_bitstring_sha1 called but SHA-1 disabled in build"); return data().m_subject_public_key_bitstring_sha1; } const std::vector& X509_Certificate::authority_key_id() const { return data().m_authority_key_id; } const std::vector& X509_Certificate::subject_key_id() const { return data().m_subject_key_id; } const std::vector& X509_Certificate::serial_number() const { return data().m_serial; } bool X509_Certificate::is_serial_negative() const { return data().m_serial_negative; } const X509_DN& X509_Certificate::issuer_dn() const { return data().m_issuer_dn; } const X509_DN& X509_Certificate::subject_dn() const { return data().m_subject_dn; } const std::vector& X509_Certificate::raw_issuer_dn() const { return data().m_issuer_dn_bits; } const std::vector& X509_Certificate::raw_subject_dn() const { return data().m_subject_dn_bits; } bool X509_Certificate::is_CA_cert() const { return data().m_is_ca_certificate; } uint32_t X509_Certificate::path_limit() const { return data().m_path_len_constraint; } Key_Constraints X509_Certificate::constraints() const { return data().m_key_constraints; } const std::vector& X509_Certificate::extended_key_usage() const { return data().m_extended_key_usage; } const std::vector& X509_Certificate::certificate_policy_oids() const { return data().m_cert_policies; } const NameConstraints& X509_Certificate::name_constraints() const { return data().m_name_constraints; } const Extensions& X509_Certificate::v3_extensions() const { return data().m_v3_extensions; } bool X509_Certificate::allowed_usage(Key_Constraints usage) const { if(constraints() == NO_CONSTRAINTS) return true; return ((constraints() & usage) == usage); } bool X509_Certificate::allowed_extended_usage(const std::string& usage) const { return allowed_extended_usage(OIDS::str2oid(usage)); } bool X509_Certificate::allowed_extended_usage(const OID& usage) const { const std::vector& ex = extended_key_usage(); if(ex.empty()) return true; if(std::find(ex.begin(), ex.end(), usage) != ex.end()) return true; return false; } bool X509_Certificate::allowed_usage(Usage_Type usage) const { // These follow suggestions in RFC 5280 4.2.1.12 switch(usage) { case Usage_Type::UNSPECIFIED: return true; case Usage_Type::TLS_SERVER_AUTH: return (allowed_usage(KEY_AGREEMENT) || allowed_usage(KEY_ENCIPHERMENT) || allowed_usage(DIGITAL_SIGNATURE)) && allowed_extended_usage("PKIX.ServerAuth"); case Usage_Type::TLS_CLIENT_AUTH: return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(KEY_AGREEMENT)) && allowed_extended_usage("PKIX.ClientAuth"); case Usage_Type::OCSP_RESPONDER: return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(NON_REPUDIATION)) && allowed_extended_usage("PKIX.OCSPSigning"); case Usage_Type::CERTIFICATE_AUTHORITY: return is_CA_cert(); } return false; } bool X509_Certificate::has_constraints(Key_Constraints constraints) const { if(this->constraints() == NO_CONSTRAINTS) { return false; } return ((this->constraints() & constraints) != 0); } bool X509_Certificate::has_ex_constraint(const std::string& ex_constraint) const { return has_ex_constraint(OIDS::str2oid(ex_constraint)); } bool X509_Certificate::has_ex_constraint(const OID& usage) const { const std::vector& ex = extended_key_usage(); return (std::find(ex.begin(), ex.end(), usage) != ex.end()); } /* * Return if a certificate extension is marked critical */ bool X509_Certificate::is_critical(const std::string& ex_name) const { return v3_extensions().critical_extension_set(OIDS::str2oid(ex_name)); } std::string X509_Certificate::ocsp_responder() const { return data().m_ocsp_responder; } std::vector X509_Certificate::ca_issuers() const { return data().m_ca_issuers; } std::string X509_Certificate::crl_distribution_point() const { // just returns the first (arbitrarily) if(data().m_crl_distribution_points.size() > 0) return data().m_crl_distribution_points[0]; return ""; } const AlternativeName& X509_Certificate::subject_alt_name() const { return data().m_subject_alt_name; } const AlternativeName& X509_Certificate::issuer_alt_name() const { return data().m_issuer_alt_name; } /* * Return information about the subject */ std::vector X509_Certificate::subject_info(const std::string& req) const { if(subject_dn().has_field(req)) return subject_dn().get_attribute(req); if(subject_alt_name().has_field(req)) return subject_alt_name().get_attribute(req); // These will be removed later: if(req == "X509.Certificate.v2.key_id") return {hex_encode(this->v2_subject_key_id())}; if(req == "X509v3.SubjectKeyIdentifier") return {hex_encode(this->subject_key_id())}; if(req == "X509.Certificate.dn_bits") return {hex_encode(this->raw_subject_dn())}; if(req == "X509.Certificate.start") return {not_before().to_string()}; if(req == "X509.Certificate.end") return {not_after().to_string()}; if(req == "X509.Certificate.version") return {std::to_string(x509_version())}; if(req == "X509.Certificate.serial") return {hex_encode(serial_number())}; return data().m_subject_ds.get(req); } /* * Return information about the issuer */ std::vector X509_Certificate::issuer_info(const std::string& req) const { if(issuer_dn().has_field(req)) return issuer_dn().get_attribute(req); if(issuer_alt_name().has_field(req)) return issuer_alt_name().get_attribute(req); // These will be removed later: if(req == "X509.Certificate.v2.key_id") return {hex_encode(this->v2_issuer_key_id())}; if(req == "X509v3.AuthorityKeyIdentifier") return {hex_encode(this->authority_key_id())}; if(req == "X509.Certificate.dn_bits") return {hex_encode(this->raw_issuer_dn())}; return data().m_issuer_ds.get(req); } /* * Return the public key in this certificate */ std::unique_ptr X509_Certificate::load_subject_public_key() const { try { return std::unique_ptr(X509::load_key(ASN1::put_in_sequence(this->subject_public_key_bits()))); } catch(std::exception& e) { throw Decoding_Error("X509_Certificate::load_subject_public_key", e.what()); } } std::vector X509_Certificate::raw_issuer_dn_sha256() const { std::unique_ptr hash(HashFunction::create_or_throw("SHA-256")); hash->update(raw_issuer_dn()); return hash->final_stdvec(); } std::vector X509_Certificate::raw_subject_dn_sha256() const { std::unique_ptr hash(HashFunction::create("SHA-256")); hash->update(raw_subject_dn()); return hash->final_stdvec(); } namespace { /* * Lookup each OID in the vector */ std::vector lookup_oids(const std::vector& oids) { std::vector out; for(const OID& oid : oids) { out.push_back(OIDS::oid2str(oid)); } return out; } } /* * Return the list of extended key usage OIDs */ std::vector X509_Certificate::ex_constraints() const { return lookup_oids(extended_key_usage()); } /* * Return the list of certificate policies */ std::vector X509_Certificate::policies() const { return lookup_oids(certificate_policy_oids()); } std::string X509_Certificate::fingerprint(const std::string& hash_name) const { return create_hex_fingerprint(this->BER_encode(), hash_name); } bool X509_Certificate::matches_dns_name(const std::string& name) const { if(name.empty()) return false; std::vector issued_names = subject_info("DNS"); // Fall back to CN only if no DNS names are set (RFC 6125 sec 6.4.4) if(issued_names.empty()) issued_names = subject_info("Name"); for(size_t i = 0; i != issued_names.size(); ++i) { if(host_wildcard_match(issued_names[i], name)) return true; } return false; } /* * Compare two certificates for equality */ bool X509_Certificate::operator==(const X509_Certificate& other) const { return (this->signature() == other.signature() && this->signature_algorithm() == other.signature_algorithm() && this->signed_body() == other.signed_body()); } bool X509_Certificate::operator<(const X509_Certificate& other) const { /* If signature values are not equal, sort by lexicographic ordering of that */ if(this->signature() != other.signature()) { return (this->signature() < other.signature()); } // Then compare the signed contents return this->signed_body() < other.signed_body(); } /* * X.509 Certificate Comparison */ bool operator!=(const X509_Certificate& cert1, const X509_Certificate& cert2) { return !(cert1 == cert2); } std::string X509_Certificate::to_string() const { std::ostringstream out; out << "Version: " << this->x509_version() << "\n"; out << "Subject: " << subject_dn() << "\n"; out << "Issuer: " << issuer_dn() << "\n"; out << "Issued: " << this->not_before().readable_string() << "\n"; out << "Expires: " << this->not_after().readable_string() << "\n"; out << "Constraints:\n"; Key_Constraints constraints = this->constraints(); if(constraints == NO_CONSTRAINTS) out << " None\n"; else { if(constraints & DIGITAL_SIGNATURE) out << " Digital Signature\n"; if(constraints & NON_REPUDIATION) out << " Non-Repudiation\n"; if(constraints & KEY_ENCIPHERMENT) out << " Key Encipherment\n"; if(constraints & DATA_ENCIPHERMENT) out << " Data Encipherment\n"; if(constraints & KEY_AGREEMENT) out << " Key Agreement\n"; if(constraints & KEY_CERT_SIGN) out << " Cert Sign\n"; if(constraints & CRL_SIGN) out << " CRL Sign\n"; if(constraints & ENCIPHER_ONLY) out << " Encipher Only\n"; if(constraints & DECIPHER_ONLY) out << " Decipher Only\n"; } const std::vector policies = this->certificate_policy_oids(); if(!policies.empty()) { out << "Policies: " << "\n"; for(auto oid : policies) out << " " << oid.as_string() << "\n"; } std::vector ex_constraints = this->extended_key_usage(); if(!ex_constraints.empty()) { out << "Extended Constraints:\n"; for(size_t i = 0; i != ex_constraints.size(); i++) out << " " << OIDS::oid2str(ex_constraints[i]) << "\n"; } const NameConstraints& name_constraints = this->name_constraints(); if(!name_constraints.permitted().empty() || !name_constraints.excluded().empty()) { out << "Name Constraints:\n"; if(!name_constraints.permitted().empty()) { out << " Permit"; for(auto st: name_constraints.permitted()) { out << " " << st.base(); } out << "\n"; } if(!name_constraints.excluded().empty()) { out << " Exclude"; for(auto st: name_constraints.excluded()) { out << " " << st.base(); } out << "\n"; } } if(!ocsp_responder().empty()) out << "OCSP responder " << ocsp_responder() << "\n"; std::vector ca_issuers = this->ca_issuers(); if(!ca_issuers.empty()) { out << "CA Issuers:\n"; for(size_t i = 0; i != ca_issuers.size(); i++) out << " URI: " << ca_issuers[i] << "\n"; } if(!crl_distribution_point().empty()) out << "CRL " << crl_distribution_point() << "\n"; out << "Signature algorithm: " << OIDS::oid2str(this->signature_algorithm().get_oid()) << "\n"; out << "Serial number: " << hex_encode(this->serial_number()) << "\n"; if(this->authority_key_id().size()) out << "Authority keyid: " << hex_encode(this->authority_key_id()) << "\n"; if(this->subject_key_id().size()) out << "Subject keyid: " << hex_encode(this->subject_key_id()) << "\n"; try { std::unique_ptr pubkey(this->subject_public_key()); out << "Public Key [" << pubkey->algo_name() << "-" << pubkey->key_length() << "]\n\n"; out << X509::PEM_encode(*pubkey); } catch(Decoding_Error&) { const AlgorithmIdentifier& alg_id = this->subject_public_key_algo(); out << "Failed to decode key with oid " << alg_id.get_oid().as_string() << "\n"; } return out.str(); } } botan-2.4.0/src/lib/x509/x509cert.h000066400000000000000000000331541322470703100164230ustar00rootroot00000000000000/* * X.509 Certificates * (C) 1999-2007,2015,2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_CERTS_H_ #define BOTAN_X509_CERTS_H_ #include #include #include #include #include #include namespace Botan { class Public_Key; class X509_DN; class AlternativeName; class Extensions; enum class Usage_Type { UNSPECIFIED, // no restrictions TLS_SERVER_AUTH, TLS_CLIENT_AUTH, CERTIFICATE_AUTHORITY, OCSP_RESPONDER }; struct X509_Certificate_Data; /** * This class represents an X.509 Certificate */ class BOTAN_PUBLIC_API(2,0) X509_Certificate : public X509_Object { public: /** * Return a newly allocated copy of the public key associated * with the subject of this certificate. This object is owned * by the caller. * * @return public key */ Public_Key* subject_public_key() const { return load_subject_public_key().release(); } /** * Create a public key object associated with the public key bits in this * certificate. If the public key bits was valid for X.509 encoding * purposes but invalid algorithmically (for example, RSA with an even * modulus) that will be detected at this point, and an exception will be * thrown. * * @return subject public key of this certificate */ std::unique_ptr load_subject_public_key() const; /** * Get the public key associated with this certificate. This includes the * outer AlgorithmIdentifier * @return subject public key of this certificate */ const std::vector& subject_public_key_bits() const; /** * Return the algorithm identifier of the public key */ const AlgorithmIdentifier& subject_public_key_algo() const; /** * Get the bit string of the public key associated with this certificate * @return public key bits */ const std::vector& subject_public_key_bitstring() const; /** * Get the SHA-1 bit string of the public key associated with this certificate. * This is used for OCSP among other protocols. * This function will throw if SHA-1 is not available. * @return hash of subject public key of this certificate */ const std::vector& subject_public_key_bitstring_sha1() const; /** * Get the certificate's issuer distinguished name (DN). * @return issuer DN of this certificate */ const X509_DN& issuer_dn() const; /** * Get the certificate's subject distinguished name (DN). * @return subject DN of this certificate */ const X509_DN& subject_dn() const; /** * Get a value for a specific subject_info parameter name. * @param name the name of the parameter to look up. Possible names include * "X509.Certificate.version", "X509.Certificate.serial", * "X509.Certificate.start", "X509.Certificate.end", * "X509.Certificate.v2.key_id", "X509.Certificate.public_key", * "X509v3.BasicConstraints.path_constraint", * "X509v3.BasicConstraints.is_ca", "X509v3.NameConstraints", * "X509v3.ExtendedKeyUsage", "X509v3.CertificatePolicies", * "X509v3.SubjectKeyIdentifier", "X509.Certificate.serial", * "X520.CommonName", "X520.Organization", "X520.Country", * "RFC822" (Email in SAN) or "PKCS9.EmailAddress" (Email in DN). * @return value(s) of the specified parameter */ std::vector subject_info(const std::string& name) const; /** * Get a value for a specific subject_info parameter name. * @param name the name of the parameter to look up. Possible names are * "X509.Certificate.v2.key_id" or "X509v3.AuthorityKeyIdentifier". * @return value(s) of the specified parameter */ std::vector issuer_info(const std::string& name) const; /** * Raw issuer DN bits */ const std::vector& raw_issuer_dn() const; /** * SHA-256 of Raw issuer DN */ std::vector raw_issuer_dn_sha256() const; /** * Raw subject DN */ const std::vector& raw_subject_dn() const; /** * SHA-256 of Raw subject DN */ std::vector raw_subject_dn_sha256() const; /** * Get the notBefore of the certificate as a string * @return notBefore of the certificate */ std::string BOTAN_DEPRECATED("Use not_before().to_string()") start_time() const { return not_before().to_string(); } /** * Get the notAfter of the certificate as a string * @return notAfter of the certificate */ std::string BOTAN_DEPRECATED("Use not_after().to_string()") end_time() const { return not_after().to_string(); } /** * Get the notBefore of the certificate as X509_Time * @return notBefore of the certificate */ const X509_Time& not_before() const; /** * Get the notAfter of the certificate as X509_Time * @return notAfter of the certificate */ const X509_Time& not_after() const; /** * Get the X509 version of this certificate object. * @return X509 version */ uint32_t x509_version() const; /** * Get the serial number of this certificate. * @return certificates serial number */ const std::vector& serial_number() const; /** * Get the serial number's sign * @return 1 iff the serial is negative. */ bool is_serial_negative() const; /** * Get the DER encoded AuthorityKeyIdentifier of this certificate. * @return DER encoded AuthorityKeyIdentifier */ const std::vector& authority_key_id() const; /** * Get the DER encoded SubjectKeyIdentifier of this certificate. * @return DER encoded SubjectKeyIdentifier */ const std::vector& subject_key_id() const; /** * Check whether this certificate is self signed. * If the DN issuer and subject agree, * @return true if this certificate is self signed */ bool is_self_signed() const; /** * Check whether this certificate is a CA certificate. * @return true if this certificate is a CA certificate */ bool is_CA_cert() const; /** * Returns true if the specified @param usage is set in the key usage extension * or if no key usage constraints are set at all. * To check if a certain key constraint is set in the certificate * use @see X509_Certificate#has_constraints. */ bool allowed_usage(Key_Constraints usage) const; /** * Returns true if the specified @param usage is set in the extended key usage extension * or if no extended key usage constraints are set at all. * To check if a certain extended key constraint is set in the certificate * use @see X509_Certificate#has_ex_constraint. */ bool allowed_extended_usage(const std::string& usage) const; /** * Returns true if the specified usage is set in the extended key usage extension, * or if no extended key usage constraints are set at all. * To check if a certain extended key constraint is set in the certificate * use @see X509_Certificate#has_ex_constraint. */ bool allowed_extended_usage(const OID& usage) const; /** * Returns true if the required key and extended key constraints are set in the certificate * for the specified @param usage or if no key constraints are set in both the key usage * and extended key usage extension. */ bool allowed_usage(Usage_Type usage) const; /** * Returns true if the specified @param constraints are included in the key * usage extension. */ bool has_constraints(Key_Constraints constraints) const; /** * Returns true if and only if @param ex_constraint (referring to an * extended key constraint, eg "PKIX.ServerAuth") is included in the * extended key extension. */ bool BOTAN_DEPRECATED("Use version taking an OID") has_ex_constraint(const std::string& ex_constraint) const; /** * Returns true if and only if OID @param ex_constraint is * included in the extended key extension. */ bool has_ex_constraint(const OID& ex_constraint) const; /** * Get the path limit as defined in the BasicConstraints extension of * this certificate. * @return path limit */ uint32_t path_limit() const; /** * Check whenever a given X509 Extension is marked critical in this * certificate. */ bool is_critical(const std::string& ex_name) const; /** * Get the key constraints as defined in the KeyUsage extension of this * certificate. * @return key constraints */ Key_Constraints constraints() const; /** * Get the key constraints as defined in the ExtendedKeyUsage * extension of this certificate. * @return key constraints */ std::vector BOTAN_DEPRECATED("Use extended_key_usage") ex_constraints() const; /** * Get the key usage as defined in the ExtendedKeyUsage extension * of this certificate, or else an empty vector. * @return key usage */ const std::vector& extended_key_usage() const; /** * Get the name constraints as defined in the NameConstraints * extension of this certificate. * @return name constraints */ const NameConstraints& name_constraints() const; /** * Get the policies as defined in the CertificatePolicies extension * of this certificate. * @return certificate policies */ std::vector BOTAN_DEPRECATED("Use certificate_policy_oids") policies() const; const std::vector& certificate_policy_oids() const; /** * Get all extensions of this certificate. * @return certificate extensions */ const Extensions& v3_extensions() const; /** * Return the v2 issuer key ID. v2 key IDs are almost never used, * instead see v3_subject_key_id. */ const std::vector& v2_issuer_key_id() const; /** * Return the v2 subject key ID. v2 key IDs are almost never used, * instead see v3_subject_key_id. */ const std::vector& v2_subject_key_id() const; const AlternativeName& subject_alt_name() const; const AlternativeName& issuer_alt_name() const; /** * Return the listed address of an OCSP responder, or empty if not set */ std::string ocsp_responder() const; /** * Return the listed addresses of ca issuers, or empty if not set */ std::vector ca_issuers() const; /** * Return the CRL distribution point, or empty if not set */ std::string crl_distribution_point() const; /** * @return a free-form string describing the certificate */ std::string to_string() const; /** * @return a fingerprint of the certificate * @param hash_name hash function used to calculate the fingerprint */ std::string fingerprint(const std::string& hash_name = "SHA-1") const; /** * Check if a certain DNS name matches up with the information in * the cert * @param name DNS name to match */ bool matches_dns_name(const std::string& name) const; /** * Check to certificates for equality. * @return true both certificates are (binary) equal */ bool operator==(const X509_Certificate& other) const; /** * Impose an arbitrary (but consistent) ordering * @return true if this is less than other by some unspecified criteria */ bool operator<(const X509_Certificate& other) const; /** * Create a certificate from a data source providing the DER or * PEM encoded certificate. * @param source the data source */ explicit X509_Certificate(DataSource& source); #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) /** * Create a certificate from a file containing the DER or PEM * encoded certificate. * @param filename the name of the certificate file */ explicit X509_Certificate(const std::string& filename); #endif /** * Create a certificate from a buffer * @param in the buffer containing the DER-encoded certificate */ explicit X509_Certificate(const std::vector& in); /** * Create an uninitialized certificate object. Any attempts to * access this object will throw an exception. */ X509_Certificate() = default; X509_Certificate(const X509_Certificate& other) = default; X509_Certificate& operator=(const X509_Certificate& other) = default; private: std::string PEM_label() const override; std::vector alternate_PEM_labels() const override; void force_decode() override; const X509_Certificate_Data& data() const; std::shared_ptr m_data; }; /** * Check two certificates for inequality * @param cert1 The first certificate * @param cert2 The second certificate * @return true if the arguments represent different certificates, * false if they are binary identical */ BOTAN_PUBLIC_API(2,0) bool operator!=(const X509_Certificate& cert1, const X509_Certificate& cert2); } #endif botan-2.4.0/src/lib/x509/x509opt.cpp000066400000000000000000000043361322470703100166230ustar00rootroot00000000000000/* * X.509 Certificate Options * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include namespace Botan { /* * Set when the certificate should become valid */ void X509_Cert_Options::not_before(const std::string& time_string) { start = X509_Time(time_string, ASN1_Tag::UTC_OR_GENERALIZED_TIME); } /* * Set when the certificate should expire */ void X509_Cert_Options::not_after(const std::string& time_string) { end = X509_Time(time_string, ASN1_Tag::UTC_OR_GENERALIZED_TIME); } /* * Set key constraint information */ void X509_Cert_Options::add_constraints(Key_Constraints usage) { constraints = usage; } /* * Set key constraint information */ void X509_Cert_Options::add_ex_constraint(const OID& oid) { ex_constraints.push_back(oid); } /* * Set key constraint information */ void X509_Cert_Options::add_ex_constraint(const std::string& oid_str) { ex_constraints.push_back(OIDS::lookup(oid_str)); } /* * Mark this certificate for CA usage */ void X509_Cert_Options::CA_key(size_t limit) { is_CA = true; path_limit = limit; } void X509_Cert_Options::set_padding_scheme(const std::string& scheme) { padding_scheme = scheme; } /* * Initialize the certificate options */ X509_Cert_Options::X509_Cert_Options(const std::string& initial_opts, uint32_t expiration_time) { is_CA = false; path_limit = 0; constraints = NO_CONSTRAINTS; // use default for chosen algorithm padding_scheme = ""; auto now = std::chrono::system_clock::now(); start = X509_Time(now); end = X509_Time(now + std::chrono::seconds(expiration_time)); if(initial_opts.empty()) return; std::vector parsed = split_on(initial_opts, '/'); if(parsed.size() > 4) throw Invalid_Argument("X.509 cert options: Too many names: " + initial_opts); if(parsed.size() >= 1) common_name = parsed[0]; if(parsed.size() >= 2) country = parsed[1]; if(parsed.size() >= 3) organization = parsed[2]; if(parsed.size() == 4) org_unit = parsed[3]; } } botan-2.4.0/src/lib/x509/x509path.cpp000066400000000000000000001065641322470703100167630ustar00rootroot00000000000000/* * X.509 Certificate Path Validation * (C) 2010,2011,2012,2014,2016 Jack Lloyd * (C) 2017 Fabian Weissberg, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_ONLINE_REVOCATION_CHECKS) #include #include #endif namespace Botan { /* * PKIX path validation */ CertificatePathStatusCodes PKIX::check_chain(const std::vector>& cert_path, std::chrono::system_clock::time_point ref_time, const std::string& hostname, Usage_Type usage, size_t min_signature_algo_strength, const std::set& trusted_hashes) { if(cert_path.empty()) throw Invalid_Argument("PKIX::check_chain cert_path empty"); const bool self_signed_ee_cert = (cert_path.size() == 1); X509_Time validation_time(ref_time); CertificatePathStatusCodes cert_status(cert_path.size()); if(!hostname.empty() && !cert_path[0]->matches_dns_name(hostname)) cert_status[0].insert(Certificate_Status_Code::CERT_NAME_NOMATCH); if(!cert_path[0]->allowed_usage(usage)) cert_status[0].insert(Certificate_Status_Code::INVALID_USAGE); if(cert_path[0]->is_CA_cert() == false && cert_path[0]->has_constraints(KEY_CERT_SIGN)) { /* "If the keyCertSign bit is asserted, then the cA bit in the basic constraints extension (Section 4.2.1.9) MUST also be asserted." - RFC 5280 We don't bother doing this check on the rest of the path since they must have the cA bit asserted or the validation will fail anyway. */ cert_status[0].insert(Certificate_Status_Code::INVALID_USAGE); } for(size_t i = 0; i != cert_path.size(); ++i) { std::set& status = cert_status.at(i); const bool at_self_signed_root = (i == cert_path.size() - 1); const std::shared_ptr& subject = cert_path[i]; const std::shared_ptr& issuer = cert_path[at_self_signed_root ? (i) : (i + 1)]; if(at_self_signed_root && (issuer->is_self_signed() == false)) { status.insert(Certificate_Status_Code::CHAIN_LACKS_TRUST_ROOT); } if(subject->issuer_dn() != issuer->subject_dn()) { status.insert(Certificate_Status_Code::CHAIN_NAME_MISMATCH); } // Check the serial number if(subject->is_serial_negative()) { status.insert(Certificate_Status_Code::CERT_SERIAL_NEGATIVE); } // Check the subject's DN components' length for(const auto& dn_pair : subject->subject_dn().get_attributes()) { const size_t dn_ub = X509_DN::lookup_ub(dn_pair.first); // dn_pair = if(dn_ub > 0 && dn_pair.second.size() > dn_ub) { status.insert(Certificate_Status_Code::DN_TOO_LONG); } } // Check all certs for valid time range if(validation_time < subject->not_before()) status.insert(Certificate_Status_Code::CERT_NOT_YET_VALID); if(validation_time > subject->not_after()) status.insert(Certificate_Status_Code::CERT_HAS_EXPIRED); // Check issuer constraints if(!issuer->is_CA_cert() && !self_signed_ee_cert) status.insert(Certificate_Status_Code::CA_CERT_NOT_FOR_CERT_ISSUER); std::unique_ptr issuer_key(issuer->subject_public_key()); // Check the signature algorithm if(OIDS::lookup(subject->signature_algorithm().oid).empty()) { status.insert(Certificate_Status_Code::SIGNATURE_ALGO_UNKNOWN); } // only perform the following checks if the signature algorithm is known else { if(!issuer_key) { status.insert(Certificate_Status_Code::CERT_PUBKEY_INVALID); } else { const Certificate_Status_Code sig_status = subject->verify_signature(*issuer_key); if(sig_status != Certificate_Status_Code::VERIFIED) status.insert(sig_status); if(issuer_key->estimated_strength() < min_signature_algo_strength) status.insert(Certificate_Status_Code::SIGNATURE_METHOD_TOO_WEAK); } // Ignore untrusted hashes on self-signed roots if(trusted_hashes.size() > 0 && !at_self_signed_root) { if(trusted_hashes.count(subject->hash_used_for_signature()) == 0) status.insert(Certificate_Status_Code::UNTRUSTED_HASH); } } // Check cert extensions Extensions extensions = subject->v3_extensions(); const auto& extensions_vec = extensions.extensions(); if(subject->x509_version() < 3 && !extensions_vec.empty()) { status.insert(Certificate_Status_Code::EXT_IN_V1_V2_CERT); } for(auto& extension : extensions_vec) { extension.first->validate(*subject, *issuer, cert_path, cert_status, i); } if(extensions.extensions().size() != extensions.get_extension_oids().size()) { status.insert(Certificate_Status_Code::DUPLICATE_CERT_EXTENSION); } } // path len check size_t max_path_length = cert_path.size(); for(size_t i = cert_path.size() - 1; i > 0 ; --i) { std::set& status = cert_status.at(i); const std::shared_ptr& subject = cert_path[i]; /* * If the certificate was not self-issued, verify that max_path_length is * greater than zero and decrement max_path_length by 1. */ if(subject->subject_dn() != subject->issuer_dn()) { if(max_path_length > 0) { --max_path_length; } else { status.insert(Certificate_Status_Code::CERT_CHAIN_TOO_LONG); } } /* * If pathLenConstraint is present in the certificate and is less than max_path_length, * set max_path_length to the value of pathLenConstraint. */ if(subject->path_limit() != Cert_Extension::NO_CERT_PATH_LIMIT && subject->path_limit() < max_path_length) { max_path_length = subject->path_limit(); } } return cert_status; } CertificatePathStatusCodes PKIX::check_ocsp(const std::vector>& cert_path, const std::vector>& ocsp_responses, const std::vector& trusted_certstores, std::chrono::system_clock::time_point ref_time) { if(cert_path.empty()) throw Invalid_Argument("PKIX::check_ocsp cert_path empty"); CertificatePathStatusCodes cert_status(cert_path.size() - 1); for(size_t i = 0; i != cert_path.size() - 1; ++i) { std::set& status = cert_status.at(i); std::shared_ptr subject = cert_path.at(i); std::shared_ptr ca = cert_path.at(i+1); if(i < ocsp_responses.size() && (ocsp_responses.at(i) != nullptr)) { try { Certificate_Status_Code ocsp_signature_status = ocsp_responses.at(i)->check_signature(trusted_certstores, cert_path); if(ocsp_signature_status == Certificate_Status_Code::OCSP_SIGNATURE_OK) { // Signature ok, so check the claimed status Certificate_Status_Code ocsp_status = ocsp_responses.at(i)->status_for(*ca, *subject, ref_time); status.insert(ocsp_status); } else { // Some signature problem status.insert(ocsp_signature_status); } } catch(Exception&) { status.insert(Certificate_Status_Code::OCSP_RESPONSE_INVALID); } } } while(cert_status.size() > 0 && cert_status.back().empty()) cert_status.pop_back(); return cert_status; } CertificatePathStatusCodes PKIX::check_crl(const std::vector>& cert_path, const std::vector>& crls, std::chrono::system_clock::time_point ref_time) { if(cert_path.empty()) throw Invalid_Argument("PKIX::check_crl cert_path empty"); CertificatePathStatusCodes cert_status(cert_path.size()); const X509_Time validation_time(ref_time); for(size_t i = 0; i != cert_path.size() - 1; ++i) { std::set& status = cert_status.at(i); if(i < crls.size() && crls.at(i)) { std::shared_ptr subject = cert_path.at(i); std::shared_ptr ca = cert_path.at(i+1); if(!ca->allowed_usage(CRL_SIGN)) status.insert(Certificate_Status_Code::CA_CERT_NOT_FOR_CRL_ISSUER); if(validation_time < crls[i]->this_update()) status.insert(Certificate_Status_Code::CRL_NOT_YET_VALID); if(validation_time > crls[i]->next_update()) status.insert(Certificate_Status_Code::CRL_HAS_EXPIRED); if(crls[i]->check_signature(ca->subject_public_key()) == false) status.insert(Certificate_Status_Code::CRL_BAD_SIGNATURE); status.insert(Certificate_Status_Code::VALID_CRL_CHECKED); if(crls[i]->is_revoked(*subject)) status.insert(Certificate_Status_Code::CERT_IS_REVOKED); std::string dp = subject->crl_distribution_point(); if(!dp.empty()) { if(dp != crls[i]->crl_issuing_distribution_point()) { status.insert(Certificate_Status_Code::NO_MATCHING_CRLDP); } } for(const auto& extension : crls[i]->extensions().extensions()) { // is the extension critical and unknown? if(extension.second && OIDS::lookup(extension.first->oid_of()) == "") { /* NIST Certificate Path Valiadation Testing document: "When an implementation does not recognize a critical extension in the * crlExtensions field, it shall assume that identified certificates have been revoked and are no longer valid" */ status.insert(Certificate_Status_Code::CERT_IS_REVOKED); } } } } while(cert_status.size() > 0 && cert_status.back().empty()) cert_status.pop_back(); return cert_status; } CertificatePathStatusCodes PKIX::check_crl(const std::vector>& cert_path, const std::vector& certstores, std::chrono::system_clock::time_point ref_time) { if(cert_path.empty()) throw Invalid_Argument("PKIX::check_crl cert_path empty"); if(certstores.empty()) throw Invalid_Argument("PKIX::check_crl certstores empty"); std::vector> crls(cert_path.size()); for(size_t i = 0; i != cert_path.size(); ++i) { BOTAN_ASSERT_NONNULL(cert_path[i]); for(size_t c = 0; c != certstores.size(); ++c) { crls[i] = certstores[c]->find_crl_for(*cert_path[i]); if(crls[i]) break; } } return PKIX::check_crl(cert_path, crls, ref_time); } #if defined(BOTAN_HAS_ONLINE_REVOCATION_CHECKS) CertificatePathStatusCodes PKIX::check_ocsp_online(const std::vector>& cert_path, const std::vector& trusted_certstores, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds timeout, bool ocsp_check_intermediate_CAs) { if(cert_path.empty()) throw Invalid_Argument("PKIX::check_ocsp_online cert_path empty"); std::vector>> ocsp_response_futures; size_t to_ocsp = 1; if(ocsp_check_intermediate_CAs) to_ocsp = cert_path.size() - 1; if(cert_path.size() == 1) to_ocsp = 0; for(size_t i = 0; i < to_ocsp; ++i) { const std::shared_ptr& subject = cert_path.at(i); const std::shared_ptr& issuer = cert_path.at(i+1); if(subject->ocsp_responder() == "") { ocsp_response_futures.emplace_back(std::async(std::launch::deferred, [&]() -> std::shared_ptr { throw Exception("No OCSP responder URL set for this certificate"); })); } else { ocsp_response_futures.emplace_back(std::async(std::launch::async, [&]() -> std::shared_ptr { OCSP::Request req(*issuer, BigInt::decode(subject->serial_number())); auto http = HTTP::POST_sync(subject->ocsp_responder(), "application/ocsp-request", req.BER_encode(), /*redirects*/1, timeout); http.throw_unless_ok(); // Check the MIME type? return std::make_shared(http.body()); })); } } std::vector> ocsp_responses; for(size_t i = 0; i < ocsp_response_futures.size(); ++i) { ocsp_responses.push_back(ocsp_response_futures[i].get()); } return PKIX::check_ocsp(cert_path, ocsp_responses, trusted_certstores, ref_time); } CertificatePathStatusCodes PKIX::check_crl_online(const std::vector>& cert_path, const std::vector& certstores, Certificate_Store_In_Memory* crl_store, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds timeout) { if(cert_path.empty()) throw Invalid_Argument("PKIX::check_crl_online cert_path empty"); if(certstores.empty()) throw Invalid_Argument("PKIX::check_crl_online certstores empty"); std::vector>> future_crls; std::vector> crls(cert_path.size()); for(size_t i = 0; i != cert_path.size(); ++i) { for(size_t c = 0; c != certstores.size(); ++i) { crls[i] = certstores[i]->find_crl_for(*cert_path[i]); if(crls[i]) break; } // TODO: check if CRL is expired and re-request? // Only request if we don't already have a CRL if(crls[i]) { /* We already have a CRL, so just insert this empty one to hold a place in the vector so that indexes match up */ future_crls.emplace_back(std::future>()); } else if(cert_path[i]->crl_distribution_point() == "") { // Avoid creating a thread for this case future_crls.emplace_back(std::async(std::launch::deferred, [&]() -> std::shared_ptr { throw Exception("No CRL distribution point for this certificate"); })); } else { future_crls.emplace_back(std::async(std::launch::async, [&]() -> std::shared_ptr { auto http = HTTP::GET_sync(cert_path[i]->crl_distribution_point()); http.throw_unless_ok(); // check the mime type? return std::make_shared(http.body()); })); } } for(size_t i = 0; i != future_crls.size(); ++i) { if(future_crls[i].valid()) { try { std::future_status status = future_crls[i].wait_for(timeout); if(status == std::future_status::ready) { crls[i] = future_crls[i].get(); } } catch(std::exception&) { // crls[i] left null } } } const CertificatePathStatusCodes crl_status = PKIX::check_crl(cert_path, crls, ref_time); if(crl_store) { for(size_t i = 0; i != crl_status.size(); ++i) { if(crl_status[i].count(Certificate_Status_Code::VALID_CRL_CHECKED)) { // better be non-null, we supposedly validated it BOTAN_ASSERT_NONNULL(crls[i]); crl_store->add_crl(crls[i]); } } } return crl_status; } #endif Certificate_Status_Code PKIX::build_certificate_path(std::vector>& cert_path, const std::vector& trusted_certstores, const std::shared_ptr& end_entity, const std::vector>& end_entity_extra) { if(end_entity->is_self_signed()) { return Certificate_Status_Code::CANNOT_ESTABLISH_TRUST; } /* * This is an inelegant but functional way of preventing path loops * (where C1 -> C2 -> C3 -> C1). We store a set of all the certificate * fingerprints in the path. If there is a duplicate, we error out. * TODO: save fingerprints in result struct? Maybe useful for blacklists, etc. */ std::set certs_seen; cert_path.push_back(end_entity); certs_seen.insert(end_entity->fingerprint("SHA-256")); Certificate_Store_In_Memory ee_extras; for(size_t i = 0; i != end_entity_extra.size(); ++i) ee_extras.add_certificate(end_entity_extra[i]); // iterate until we reach a root or cannot find the issuer for(;;) { const X509_Certificate& last = *cert_path.back(); const X509_DN issuer_dn = last.issuer_dn(); const std::vector auth_key_id = last.authority_key_id(); std::shared_ptr issuer; bool trusted_issuer = false; for(Certificate_Store* store : trusted_certstores) { issuer = store->find_cert(issuer_dn, auth_key_id); if(issuer) { trusted_issuer = true; break; } } if(!issuer) { // fall back to searching supplemental certs issuer = ee_extras.find_cert(issuer_dn, auth_key_id); } if(!issuer) return Certificate_Status_Code::CERT_ISSUER_NOT_FOUND; const std::string fprint = issuer->fingerprint("SHA-256"); if(certs_seen.count(fprint) > 0) // already seen? { return Certificate_Status_Code::CERT_CHAIN_LOOP; } certs_seen.insert(fprint); cert_path.push_back(issuer); if(issuer->is_self_signed()) { if(trusted_issuer) { return Certificate_Status_Code::OK; } else { return Certificate_Status_Code::CANNOT_ESTABLISH_TRUST; } } } } /** * utilities for PKIX::build_all_certificate_paths */ namespace { // using cert_maybe_trusted = std::pair,bool>; } /** * Build all possible certificate paths from the end certificate to self-signed trusted roots. * * All potentially valid paths are put into the cert_paths vector. If no potentially valid paths are found, * one of the encountered errors is returned arbitrarily. * * todo add a path building function that returns detailed information on errors encountered while building * the potentially numerous path candidates. * * Basically, a DFS is performed starting from the end certificate. A stack (vector) serves to control the DFS. * At the beginning of each iteration, a pair is popped from the stack that contains (1) the next certificate * to add to the path (2) a bool that indicates if the certificate is part of a trusted certstore. Ideally, we * follow the unique issuer of the current certificate until a trusted root is reached. However, the issuer DN + * authority key id need not be unique among the certificates used for building the path. In such a case, * we consider all the matching issuers by pushing on the stack for each of them. * */ Certificate_Status_Code PKIX::build_all_certificate_paths(std::vector>>& cert_paths_out, const std::vector& trusted_certstores, const std::shared_ptr& end_entity, const std::vector>& end_entity_extra) { if(!cert_paths_out.empty()) { throw Invalid_Argument("PKIX::build_all_certificate_paths: cert_paths_out must be empty"); } if(end_entity->is_self_signed()) { return Certificate_Status_Code::CANNOT_ESTABLISH_TRUST; } /* * Pile up error messages */ std::vector stats; Certificate_Store_In_Memory ee_extras; for(size_t i = 0; i != end_entity_extra.size(); ++i) { ee_extras.add_certificate(end_entity_extra[i]); } /* * This is an inelegant but functional way of preventing path loops * (where C1 -> C2 -> C3 -> C1). We store a set of all the certificate * fingerprints in the path. If there is a duplicate, we error out. * TODO: save fingerprints in result struct? Maybe useful for blacklists, etc. */ std::set certs_seen; // new certs are added and removed from the path during the DFS // it is copied into cert_paths_out when we encounter a trusted root std::vector> path_so_far; // todo can we assume that the end certificate is not trusted? std::vector stack = { {end_entity, false} }; while(!stack.empty()) { // found a deletion marker that guides the DFS, backtracing if(stack.back().first == nullptr) { stack.pop_back(); std::string fprint = path_so_far.back()->fingerprint("SHA-256"); certs_seen.erase(fprint); path_so_far.pop_back(); } // process next cert on the path else { std::shared_ptr last = stack.back().first; bool trusted = stack.back().second; stack.pop_back(); // certificate already seen? const std::string fprint = last->fingerprint("SHA-256"); if(certs_seen.count(fprint) == 1) { stats.push_back(Certificate_Status_Code::CERT_CHAIN_LOOP); // the current path ended in a loop continue; } // the current path ends here if(last->is_self_signed()) { // found a trust anchor if(trusted) { cert_paths_out.push_back(path_so_far); cert_paths_out.back().push_back(last); continue; } // found an untrustworthy root else { stats.push_back(Certificate_Status_Code::CANNOT_ESTABLISH_TRUST); continue; } } const X509_DN issuer_dn = last->issuer_dn(); const std::vector auth_key_id = last->authority_key_id(); // search for trusted issuers std::vector> trusted_issuers; for(Certificate_Store* store : trusted_certstores) { auto new_issuers = store->find_all_certs(issuer_dn, auth_key_id); trusted_issuers.insert(trusted_issuers.end(), new_issuers.begin(), new_issuers.end()); } // search the supplemental certs std::vector> misc_issuers = ee_extras.find_all_certs(issuer_dn, auth_key_id); // if we could not find any issuers, the current path ends here if(trusted_issuers.size() + misc_issuers.size() == 0) { stats.push_back(Certificate_Status_Code::CERT_ISSUER_NOT_FOUND); continue; } // push the latest certificate onto the path_so_far path_so_far.push_back(last); certs_seen.emplace(fprint); // push a deletion marker on the stack for backtracing later stack.push_back({std::shared_ptr(nullptr),false}); for(const auto trusted_cert : trusted_issuers) { stack.push_back({trusted_cert,true}); } for(const auto misc : misc_issuers) { stack.push_back({misc,false}); } } } // could not construct any potentially valid path if(cert_paths_out.empty()) { if(stats.empty()) throw Exception("X509 path building failed for unknown reasons"); else // arbitrarily return the first error return stats[0]; } else { return Certificate_Status_Code::OK; } } void PKIX::merge_revocation_status(CertificatePathStatusCodes& chain_status, const CertificatePathStatusCodes& crl, const CertificatePathStatusCodes& ocsp, bool require_rev_on_end_entity, bool require_rev_on_intermediates) { if(chain_status.empty()) throw Invalid_Argument("PKIX::merge_revocation_status chain_status was empty"); for(size_t i = 0; i != chain_status.size() - 1; ++i) { bool had_crl = false, had_ocsp = false; if(i < crl.size() && crl[i].size() > 0) { for(auto&& code : crl[i]) { if(code == Certificate_Status_Code::VALID_CRL_CHECKED) { had_crl = true; } chain_status[i].insert(code); } } if(i < ocsp.size() && ocsp[i].size() > 0) { for(auto&& code : ocsp[i]) { if(code == Certificate_Status_Code::OCSP_RESPONSE_GOOD) { had_ocsp = true; } chain_status[i].insert(code); } } if(had_crl == false && had_ocsp == false) { if((require_rev_on_end_entity && i == 0) || (require_rev_on_intermediates && i > 0)) { chain_status[i].insert(Certificate_Status_Code::NO_REVOCATION_DATA); } } } } Certificate_Status_Code PKIX::overall_status(const CertificatePathStatusCodes& cert_status) { if(cert_status.empty()) throw Invalid_Argument("PKIX::overall_status empty cert status"); Certificate_Status_Code overall_status = Certificate_Status_Code::OK; // take the "worst" error as overall for(const std::set& s : cert_status) { if(!s.empty()) { auto worst = *s.rbegin(); // Leave informative OCSP/CRL confirmations on cert-level status only if(worst >= Certificate_Status_Code::FIRST_ERROR_STATUS && worst > overall_status) { overall_status = worst; } } } return overall_status; } Path_Validation_Result x509_path_validate( const std::vector& end_certs, const Path_Validation_Restrictions& restrictions, const std::vector& trusted_roots, const std::string& hostname, Usage_Type usage, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds ocsp_timeout, const std::vector>& ocsp_resp) { if(end_certs.empty()) { throw Invalid_Argument("x509_path_validate called with no subjects"); } std::shared_ptr end_entity(std::make_shared(end_certs[0])); std::vector> end_entity_extra; for(size_t i = 1; i < end_certs.size(); ++i) { end_entity_extra.push_back(std::make_shared(end_certs[i])); } std::vector>> cert_paths; Certificate_Status_Code path_building_result = PKIX::build_all_certificate_paths(cert_paths, trusted_roots, end_entity, end_entity_extra); // If we cannot successfully build a chain to a trusted self-signed root, stop now if(path_building_result != Certificate_Status_Code::OK) { return Path_Validation_Result(path_building_result); } std::vector error_results; // Try validating all the potentially valid paths and return the first one to validate properly for(auto cert_path : cert_paths) { CertificatePathStatusCodes status = PKIX::check_chain(cert_path, ref_time, hostname, usage, restrictions.minimum_key_strength(), restrictions.trusted_hashes()); CertificatePathStatusCodes crl_status = PKIX::check_crl(cert_path, trusted_roots, ref_time); CertificatePathStatusCodes ocsp_status; if(ocsp_resp.size() > 0) { ocsp_status = PKIX::check_ocsp(cert_path, ocsp_resp, trusted_roots, ref_time); } if(ocsp_status.empty() && ocsp_timeout != std::chrono::milliseconds(0)) { #if defined(BOTAN_TARGET_OS_HAS_THREADS) && defined(BOTAN_HAS_HTTP_UTIL) ocsp_status = PKIX::check_ocsp_online(cert_path, trusted_roots, ref_time, ocsp_timeout, restrictions.ocsp_all_intermediates()); #else ocsp_status.resize(1); ocsp_status[0].insert(Certificate_Status_Code::OCSP_NO_HTTP); #endif } PKIX::merge_revocation_status(status, crl_status, ocsp_status, restrictions.require_revocation_information(), restrictions.ocsp_all_intermediates()); Path_Validation_Result pvd(status, std::move(cert_path)); if(pvd.successful_validation()) { return pvd; } else { error_results.push_back(std::move(pvd)); } } return error_results[0]; } Path_Validation_Result x509_path_validate( const X509_Certificate& end_cert, const Path_Validation_Restrictions& restrictions, const std::vector& trusted_roots, const std::string& hostname, Usage_Type usage, std::chrono::system_clock::time_point when, std::chrono::milliseconds ocsp_timeout, const std::vector>& ocsp_resp) { std::vector certs; certs.push_back(end_cert); return x509_path_validate(certs, restrictions, trusted_roots, hostname, usage, when, ocsp_timeout, ocsp_resp); } Path_Validation_Result x509_path_validate( const std::vector& end_certs, const Path_Validation_Restrictions& restrictions, const Certificate_Store& store, const std::string& hostname, Usage_Type usage, std::chrono::system_clock::time_point when, std::chrono::milliseconds ocsp_timeout, const std::vector>& ocsp_resp) { std::vector trusted_roots; trusted_roots.push_back(const_cast(&store)); return x509_path_validate(end_certs, restrictions, trusted_roots, hostname, usage, when, ocsp_timeout, ocsp_resp); } Path_Validation_Result x509_path_validate( const X509_Certificate& end_cert, const Path_Validation_Restrictions& restrictions, const Certificate_Store& store, const std::string& hostname, Usage_Type usage, std::chrono::system_clock::time_point when, std::chrono::milliseconds ocsp_timeout, const std::vector>& ocsp_resp) { std::vector certs; certs.push_back(end_cert); std::vector trusted_roots; trusted_roots.push_back(const_cast(&store)); return x509_path_validate(certs, restrictions, trusted_roots, hostname, usage, when, ocsp_timeout, ocsp_resp); } Path_Validation_Restrictions::Path_Validation_Restrictions(bool require_rev, size_t key_strength, bool ocsp_intermediates) : m_require_revocation_information(require_rev), m_ocsp_all_intermediates(ocsp_intermediates), m_minimum_key_strength(key_strength) { if(key_strength <= 80) m_trusted_hashes.insert("SHA-160"); m_trusted_hashes.insert("SHA-224"); m_trusted_hashes.insert("SHA-256"); m_trusted_hashes.insert("SHA-384"); m_trusted_hashes.insert("SHA-512"); } namespace { CertificatePathStatusCodes find_warnings(const CertificatePathStatusCodes& all_statuses) { CertificatePathStatusCodes warnings; for(const auto& status_set_i : all_statuses) { std::set warning_set_i; for(const auto& code : status_set_i) { if(code >= Certificate_Status_Code::FIRST_WARNING_STATUS && code < Certificate_Status_Code::FIRST_ERROR_STATUS) { warning_set_i.insert(code); } } warnings.push_back(warning_set_i); } return warnings; } } Path_Validation_Result::Path_Validation_Result(CertificatePathStatusCodes status, std::vector>&& cert_chain) : m_all_status(status), m_warnings(find_warnings(m_all_status)), m_cert_path(cert_chain), m_overall(PKIX::overall_status(m_all_status)) { } const X509_Certificate& Path_Validation_Result::trust_root() const { if(m_cert_path.empty()) throw Exception("Path_Validation_Result::trust_root no path set"); if(result() != Certificate_Status_Code::VERIFIED) throw Exception("Path_Validation_Result::trust_root meaningless with invalid status"); return *m_cert_path[m_cert_path.size()-1]; } std::set Path_Validation_Result::trusted_hashes() const { std::set hashes; for(size_t i = 0; i != m_cert_path.size(); ++i) hashes.insert(m_cert_path[i]->hash_used_for_signature()); return hashes; } bool Path_Validation_Result::successful_validation() const { return (result() == Certificate_Status_Code::VERIFIED || result() == Certificate_Status_Code::OCSP_RESPONSE_GOOD || result() == Certificate_Status_Code::VALID_CRL_CHECKED); } bool Path_Validation_Result::no_warnings() const { return m_warnings.empty(); } CertificatePathStatusCodes Path_Validation_Result::warnings() const { return m_warnings; } std::string Path_Validation_Result::result_string() const { return status_string(result()); } const char* Path_Validation_Result::status_string(Certificate_Status_Code code) { if(const char* s = to_string(code)) return s; return "Unknown error"; } } botan-2.4.0/src/lib/x509/x509path.h000066400000000000000000000451521322470703100164230ustar00rootroot00000000000000/* * X.509 Cert Path Validation * (C) 2010-2011 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_CERT_PATH_VALIDATION_H_ #define BOTAN_X509_CERT_PATH_VALIDATION_H_ #include #include #include #include #include #include #include #if defined(BOTAN_TARGET_OS_HAS_THREADS) && defined(BOTAN_HAS_HTTP_UTIL) #define BOTAN_HAS_ONLINE_REVOCATION_CHECKS #endif namespace Botan { /** * This type represents the validation status of an entire certificate path. * There is one set of status codes for each certificate in the path. */ typedef std::vector> CertificatePathStatusCodes; /** * Specifies restrictions on the PKIX path validation */ class BOTAN_PUBLIC_API(2,0) Path_Validation_Restrictions final { public: /** * @param require_rev if true, revocation information is required * @param minimum_key_strength is the minimum strength (in terms of * operations, eg 80 means 2^80) of a signature. Signatures weaker than * this are rejected. If more than 80, SHA-1 signatures are also * rejected. If possible use at least setting 110. * * 80 bit strength requires 1024 bit RSA * 110 bit strength requires 2k bit RSA * 128 bit strength requires ~3k bit RSA or P-256 * @param ocsp_all_intermediates Make OCSP requests for all CAs as * well as end entity (if OCSP enabled in path validation request) */ Path_Validation_Restrictions(bool require_rev = false, size_t minimum_key_strength = 110, bool ocsp_all_intermediates = false); /** * @param require_rev if true, revocation information is required * @param minimum_key_strength is the minimum strength (in terms of * operations, eg 80 means 2^80) of a signature. Signatures * weaker than this are rejected. * @param ocsp_all_intermediates Make OCSP requests for all CAs as * well as end entity (if OCSP enabled in path validation request) * @param trusted_hashes a set of trusted hashes. Any signatures * created using a hash other than one of these will be * rejected. */ Path_Validation_Restrictions(bool require_rev, size_t minimum_key_strength, bool ocsp_all_intermediates, const std::set& trusted_hashes) : m_require_revocation_information(require_rev), m_ocsp_all_intermediates(ocsp_all_intermediates), m_trusted_hashes(trusted_hashes), m_minimum_key_strength(minimum_key_strength) {} /** * @return whether revocation information is required */ bool require_revocation_information() const { return m_require_revocation_information; } /** * @return whether all intermediate CAs should also be OCSPed. If false * then only end entity OCSP is required/requested. */ bool ocsp_all_intermediates() const { return m_ocsp_all_intermediates; } /** * @return trusted signature hash functions */ const std::set& trusted_hashes() const { return m_trusted_hashes; } /** * @return minimum required key strength */ size_t minimum_key_strength() const { return m_minimum_key_strength; } private: bool m_require_revocation_information; bool m_ocsp_all_intermediates; std::set m_trusted_hashes; size_t m_minimum_key_strength; }; /** * Represents the result of a PKIX path validation */ class BOTAN_PUBLIC_API(2,0) Path_Validation_Result final { public: typedef Certificate_Status_Code Code; /** * @return the set of hash functions you are implicitly * trusting by trusting this result. */ std::set trusted_hashes() const; /** * @return the trust root of the validation if successful * throws an exception if the validation failed */ const X509_Certificate& trust_root() const; /** * @return the full path from subject to trust root * This path may be empty */ const std::vector>& cert_path() const { return m_cert_path; } /** * @return true iff the validation was successful */ bool successful_validation() const; /** * @return true iff no warnings occured during validation */ bool no_warnings() const; /** * @return overall validation result code */ Certificate_Status_Code result() const { return m_overall; } /** * @return a set of status codes for each certificate in the chain */ const CertificatePathStatusCodes& all_statuses() const { return m_all_status; } /** * @return the subset of status codes that are warnings */ CertificatePathStatusCodes warnings() const; /** * @return string representation of the validation result */ std::string result_string() const; /** * @param code validation status code * @return corresponding validation status message */ static const char* status_string(Certificate_Status_Code code); /** * Create a Path_Validation_Result * @param status list of validation status codes * @param cert_chain the certificate chain that was validated */ Path_Validation_Result(CertificatePathStatusCodes status, std::vector>&& cert_chain); /** * Create a Path_Validation_Result * @param status validation status code */ explicit Path_Validation_Result(Certificate_Status_Code status) : m_overall(status) {} private: CertificatePathStatusCodes m_all_status; CertificatePathStatusCodes m_warnings; std::vector> m_cert_path; Certificate_Status_Code m_overall; }; /** * PKIX Path Validation * @param end_certs certificate chain to validate (with end entity certificate in end_certs[0]) * @param restrictions path validation restrictions * @param trusted_roots list of certificate stores that contain trusted certificates * @param hostname if not empty, compared against the DNS name in end_certs[0] * @param usage if not set to UNSPECIFIED, compared against the key usage in end_certs[0] * @param validation_time what reference time to use for validation * @param ocsp_timeout timeout for OCSP operations, 0 disables OCSP check * @param ocsp_resp additional OCSP responses to consider (eg from peer) * @return result of the path validation */ Path_Validation_Result BOTAN_PUBLIC_API(2,0) x509_path_validate( const std::vector& end_certs, const Path_Validation_Restrictions& restrictions, const std::vector& trusted_roots, const std::string& hostname = "", Usage_Type usage = Usage_Type::UNSPECIFIED, std::chrono::system_clock::time_point validation_time = std::chrono::system_clock::now(), std::chrono::milliseconds ocsp_timeout = std::chrono::milliseconds(0), const std::vector>& ocsp_resp = {}); /** * PKIX Path Validation * @param end_cert certificate to validate * @param restrictions path validation restrictions * @param trusted_roots list of stores that contain trusted certificates * @param hostname if not empty, compared against the DNS name in end_cert * @param usage if not set to UNSPECIFIED, compared against the key usage in end_cert * @param validation_time what reference time to use for validation * @param ocsp_timeout timeout for OCSP operations, 0 disables OCSP check * @param ocsp_resp additional OCSP responses to consider (eg from peer) * @return result of the path validation */ Path_Validation_Result BOTAN_PUBLIC_API(2,0) x509_path_validate( const X509_Certificate& end_cert, const Path_Validation_Restrictions& restrictions, const std::vector& trusted_roots, const std::string& hostname = "", Usage_Type usage = Usage_Type::UNSPECIFIED, std::chrono::system_clock::time_point validation_time = std::chrono::system_clock::now(), std::chrono::milliseconds ocsp_timeout = std::chrono::milliseconds(0), const std::vector>& ocsp_resp = {}); /** * PKIX Path Validation * @param end_cert certificate to validate * @param restrictions path validation restrictions * @param store store that contains trusted certificates * @param hostname if not empty, compared against the DNS name in end_cert * @param usage if not set to UNSPECIFIED, compared against the key usage in end_cert * @param validation_time what reference time to use for validation * @param ocsp_timeout timeout for OCSP operations, 0 disables OCSP check * @param ocsp_resp additional OCSP responses to consider (eg from peer) * @return result of the path validation */ Path_Validation_Result BOTAN_PUBLIC_API(2,0) x509_path_validate( const X509_Certificate& end_cert, const Path_Validation_Restrictions& restrictions, const Certificate_Store& store, const std::string& hostname = "", Usage_Type usage = Usage_Type::UNSPECIFIED, std::chrono::system_clock::time_point validation_time = std::chrono::system_clock::now(), std::chrono::milliseconds ocsp_timeout = std::chrono::milliseconds(0), const std::vector>& ocsp_resp = {}); /** * PKIX Path Validation * @param end_certs certificate chain to validate * @param restrictions path validation restrictions * @param store store that contains trusted certificates * @param hostname if not empty, compared against the DNS name in end_certs[0] * @param usage if not set to UNSPECIFIED, compared against the key usage in end_certs[0] * @param validation_time what reference time to use for validation * @param ocsp_timeout timeout for OCSP operations, 0 disables OCSP check * @param ocsp_resp additional OCSP responses to consider (eg from peer) * @return result of the path validation */ Path_Validation_Result BOTAN_PUBLIC_API(2,0) x509_path_validate( const std::vector& end_certs, const Path_Validation_Restrictions& restrictions, const Certificate_Store& store, const std::string& hostname = "", Usage_Type usage = Usage_Type::UNSPECIFIED, std::chrono::system_clock::time_point validation_time = std::chrono::system_clock::now(), std::chrono::milliseconds ocsp_timeout = std::chrono::milliseconds(0), const std::vector>& ocsp_resp = {}); /** * namespace PKIX holds the building blocks that are called by x509_path_validate. * This allows custom validation logic to be written by applications and makes * for easier testing, but unless you're positive you know what you're doing you * probably want to just call x509_path_validate instead. */ namespace PKIX { Certificate_Status_Code build_all_certificate_paths(std::vector>>& cert_paths, const std::vector& trusted_certstores, const std::shared_ptr& end_entity, const std::vector>& end_entity_extra); /** * Build certificate path * @param cert_path_out output parameter, cert_path will be appended to this vector * @param trusted_certstores list of certificate stores that contain trusted certificates * @param end_entity the cert to be validated * @param end_entity_extra optional list of additional untrusted certs for path building * @return result of the path building operation (OK or error) */ Certificate_Status_Code BOTAN_PUBLIC_API(2,0) build_certificate_path(std::vector>& cert_path_out, const std::vector& trusted_certstores, const std::shared_ptr& end_entity, const std::vector>& end_entity_extra); /** * Check the certificate chain, but not any revocation data * * @param cert_path path built by build_certificate_path with OK result * @param ref_time whatever time you want to perform the validation * against (normally current system clock) * @param hostname the hostname * @param usage end entity usage checks * @param min_signature_algo_strength 80 or 110 typically * Note 80 allows 1024 bit RSA and SHA-1. 110 allows 2048 bit RSA and SHA-2. * Using 128 requires ECC (P-256) or ~3000 bit RSA keys. * @param trusted_hashes set of trusted hash functions, empty means accept any * hash we have an OID for * @return vector of results on per certificate in the path, each containing a set of * results. If all codes in the set are < Certificate_Status_Code::FIRST_ERROR_STATUS, * then the result for that certificate is successful. If all results are */ CertificatePathStatusCodes BOTAN_PUBLIC_API(2,0) check_chain(const std::vector>& cert_path, std::chrono::system_clock::time_point ref_time, const std::string& hostname, Usage_Type usage, size_t min_signature_algo_strength, const std::set& trusted_hashes); /** * Check OCSP responses for revocation information * @param cert_path path already validated by check_chain * @param ocsp_responses the OCSP responses to consider * @param certstores trusted roots * @param ref_time whatever time you want to perform the validation against * (normally current system clock) * @return revocation status */ CertificatePathStatusCodes BOTAN_PUBLIC_API(2,0) check_ocsp(const std::vector>& cert_path, const std::vector>& ocsp_responses, const std::vector& certstores, std::chrono::system_clock::time_point ref_time); /** * Check CRLs for revocation information * @param cert_path path already validated by check_chain * @param crls the list of CRLs to check, it is assumed that crls[i] (if not null) * is the associated CRL for the subject in cert_path[i]. * @param ref_time whatever time you want to perform the validation against * (normally current system clock) * @return revocation status */ CertificatePathStatusCodes BOTAN_PUBLIC_API(2,0) check_crl(const std::vector>& cert_path, const std::vector>& crls, std::chrono::system_clock::time_point ref_time); /** * Check CRLs for revocation information * @param cert_path path already validated by check_chain * @param certstores a list of certificate stores to query for the CRL * @param ref_time whatever time you want to perform the validation against * (normally current system clock) * @return revocation status */ CertificatePathStatusCodes BOTAN_PUBLIC_API(2,0) check_crl(const std::vector>& cert_path, const std::vector& certstores, std::chrono::system_clock::time_point ref_time); #if defined(BOTAN_HAS_ONLINE_REVOCATION_CHECKS) /** * Check OCSP using online (HTTP) access. Current version creates a thread and * network connection per OCSP request made. * * @param cert_path path already validated by check_chain * @param trusted_certstores a list of certstores with trusted certs * @param ref_time whatever time you want to perform the validation against * (normally current system clock) * @param timeout for timing out the responses, though actually this function * may block for up to timeout*cert_path.size()*C for some small C. * @param ocsp_check_intermediate_CAs if true also performs OCSP on any intermediate * CA certificates. If false, only does OCSP on the end entity cert. * @return revocation status */ CertificatePathStatusCodes BOTAN_PUBLIC_API(2,0) check_ocsp_online(const std::vector>& cert_path, const std::vector& trusted_certstores, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds timeout, bool ocsp_check_intermediate_CAs); /** * Check CRL using online (HTTP) access. Current version creates a thread and * network connection per CRL access. * @param cert_path path already validated by check_chain * @param trusted_certstores a list of certstores with trusted certs * @param certstore_to_recv_crls optional (nullptr to disable), all CRLs * retreived will be saved to this cert store. * @param ref_time whatever time you want to perform the validation against * (normally current system clock) * @param timeout for timing out the responses, though actually this function * may block for up to timeout*cert_path.size()*C for some small C. * @return revocation status */ CertificatePathStatusCodes BOTAN_PUBLIC_API(2,0) check_crl_online(const std::vector>& cert_path, const std::vector& trusted_certstores, Certificate_Store_In_Memory* certstore_to_recv_crls, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds timeout); #endif /** * Find overall status (OK, error) of a validation * @param cert_status result of merge_revocation_status or check_chain */ Certificate_Status_Code BOTAN_PUBLIC_API(2,0) overall_status(const CertificatePathStatusCodes& cert_status); /** * Merge the results from CRL and/or OCSP checks into chain_status * @param chain_status the certificate status * @param crl_status results from check_crl * @param ocsp_status results from check_ocsp * @param require_rev_on_end_entity require valid CRL or OCSP on end-entity cert * @param require_rev_on_intermediates require valid CRL or OCSP on all intermediate certificates */ void BOTAN_PUBLIC_API(2,0) merge_revocation_status(CertificatePathStatusCodes& chain_status, const CertificatePathStatusCodes& crl_status, const CertificatePathStatusCodes& ocsp_status, bool require_rev_on_end_entity, bool require_rev_on_intermediates); } } #endif botan-2.4.0/src/lib/x509/x509self.cpp000066400000000000000000000123251322470703100167470ustar00rootroot00000000000000/* * PKCS #10/Self Signed Cert Creation * (C) 1999-2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include #include namespace Botan { namespace { /* * Load information from the X509_Cert_Options */ void load_info(const X509_Cert_Options& opts, X509_DN& subject_dn, AlternativeName& subject_alt) { subject_dn.add_attribute("X520.CommonName", opts.common_name); subject_dn.add_attribute("X520.Country", opts.country); subject_dn.add_attribute("X520.State", opts.state); subject_dn.add_attribute("X520.Locality", opts.locality); subject_dn.add_attribute("X520.Organization", opts.organization); subject_dn.add_attribute("X520.OrganizationalUnit", opts.org_unit); subject_dn.add_attribute("X520.SerialNumber", opts.serial_number); subject_alt = AlternativeName(opts.email, opts.uri, opts.dns, opts.ip); subject_alt.add_othername(OIDS::lookup("PKIX.XMPPAddr"), opts.xmpp, UTF8_STRING); } } namespace X509 { /* * Create a new self-signed X.509 certificate */ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng) { AlgorithmIdentifier sig_algo; X509_DN subject_dn; AlternativeName subject_alt; // for now, only the padding option is used std::map sig_opts = { {"padding",opts.padding_scheme} }; std::vector pub_key = X509::BER_encode(key); std::unique_ptr signer(choose_sig_format(key, sig_opts, rng, hash_fn, sig_algo)); load_info(opts, subject_dn, subject_alt); Key_Constraints constraints; if(opts.is_CA) { constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); } else { verify_cert_constraints_valid_for_key_type(key, opts.constraints); constraints = opts.constraints; } Extensions extensions = opts.extensions; extensions.add( new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit), true); if(constraints != NO_CONSTRAINTS) { extensions.add(new Cert_Extension::Key_Usage(constraints), true); } extensions.add(new Cert_Extension::Subject_Key_ID(pub_key, hash_fn)); extensions.add( new Cert_Extension::Subject_Alternative_Name(subject_alt)); extensions.add( new Cert_Extension::Extended_Key_Usage(opts.ex_constraints)); return X509_CA::make_cert(signer.get(), rng, sig_algo, pub_key, opts.start, opts.end, subject_dn, subject_dn, extensions); } /* * Create a PKCS #10 certificate request */ PKCS10_Request create_cert_req(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng) { AlgorithmIdentifier sig_algo; X509_DN subject_dn; AlternativeName subject_alt; // for now, only the padding option is used std::map sig_opts = { {"padding",opts.padding_scheme} }; std::vector pub_key = X509::BER_encode(key); std::unique_ptr signer(choose_sig_format(key, sig_opts, rng, hash_fn, sig_algo)); load_info(opts, subject_dn, subject_alt); const size_t PKCS10_VERSION = 0; Key_Constraints constraints; if(opts.is_CA) { constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); } else { verify_cert_constraints_valid_for_key_type(key, opts.constraints); constraints = opts.constraints; } Extensions extensions = opts.extensions; extensions.add( new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit)); if(constraints != NO_CONSTRAINTS) { extensions.add( new Cert_Extension::Key_Usage(constraints)); } extensions.add( new Cert_Extension::Extended_Key_Usage(opts.ex_constraints)); extensions.add( new Cert_Extension::Subject_Alternative_Name(subject_alt)); DER_Encoder tbs_req; tbs_req.start_cons(SEQUENCE) .encode(PKCS10_VERSION) .encode(subject_dn) .raw_bytes(pub_key) .start_explicit(0); if(!opts.challenge.empty()) { ASN1_String challenge(opts.challenge, DIRECTORY_STRING); tbs_req.encode( Attribute("PKCS9.ChallengePassword", DER_Encoder().encode(challenge).get_contents_unlocked() ) ); } tbs_req.encode( Attribute("PKCS9.ExtensionRequest", DER_Encoder() .start_cons(SEQUENCE) .encode(extensions) .end_cons() .get_contents_unlocked() ) ) .end_explicit() .end_cons(); const std::vector req = X509_Object::make_signed(signer.get(), rng, sig_algo, tbs_req.get_contents()); return PKCS10_Request(req); } } } botan-2.4.0/src/lib/x509/x509self.h000066400000000000000000000116071322470703100164160ustar00rootroot00000000000000/* * X.509 Self-Signed Certificate * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_X509_SELF_H_ #define BOTAN_X509_SELF_H_ #include #include #include #include namespace Botan { class RandomNumberGenerator; class Private_Key; /** * Options for X.509 certificates. */ class BOTAN_PUBLIC_API(2,0) X509_Cert_Options final { public: /** * the subject common name */ std::string common_name; /** * the subject counry */ std::string country; /** * the subject organization */ std::string organization; /** * the subject organizational unit */ std::string org_unit; /** * the subject locality */ std::string locality; /** * the subject state */ std::string state; /** * the subject serial number */ std::string serial_number; /** * the subject email adress */ std::string email; /** * the subject URI */ std::string uri; /** * the subject IPv4 address */ std::string ip; /** * the subject DNS */ std::string dns; /** * the subject XMPP */ std::string xmpp; /** * the subject challenge password */ std::string challenge; /** * the subject notBefore */ X509_Time start; /** * the subject notAfter */ X509_Time end; /** * Indicates whether the certificate request */ bool is_CA; /** * Indicates the BasicConstraints path limit */ size_t path_limit; std::string padding_scheme; /** * The key constraints for the subject public key */ Key_Constraints constraints; /** * The key extended constraints for the subject public key */ std::vector ex_constraints; /** * Additional X.509 extensions */ Extensions extensions; /** * Mark the certificate as a CA certificate and set the path limit. * @param limit the path limit to be set in the BasicConstraints extension. */ void CA_key(size_t limit = 1); /** * Choose a padding scheme different from the default for the key used. */ void set_padding_scheme(const std::string& scheme); /** * Set the notBefore of the certificate. * @param time the notBefore value of the certificate */ void not_before(const std::string& time); /** * Set the notAfter of the certificate. * @param time the notAfter value of the certificate */ void not_after(const std::string& time); /** * Add the key constraints of the KeyUsage extension. * @param constr the constraints to set */ void add_constraints(Key_Constraints constr); /** * Add constraints to the ExtendedKeyUsage extension. * @param oid the oid to add */ void add_ex_constraint(const OID& oid); /** * Add constraints to the ExtendedKeyUsage extension. * @param name the name to look up the oid to add */ void add_ex_constraint(const std::string& name); /** * Construct a new options object * @param opts define the common name of this object. An example for this * parameter would be "common_name/country/organization/organizational_unit". * @param expire_time the expiration time (from the current clock in seconds) */ X509_Cert_Options(const std::string& opts = "", uint32_t expire_time = 365 * 24 * 60 * 60); }; namespace X509 { /** * Create a self-signed X.509 certificate. * @param opts the options defining the certificate to create * @param key the private key used for signing, i.e. the key * associated with this self-signed certificate * @param hash_fn the hash function to use * @param rng the rng to use * @return newly created self-signed certificate */ BOTAN_PUBLIC_API(2,0) X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng); /** * Create a PKCS#10 certificate request. * @param opts the options defining the request to create * @param key the key used to sign this request * @param rng the rng to use * @param hash_fn the hash function to use * @return newly created PKCS#10 request */ BOTAN_PUBLIC_API(2,0) PKCS10_Request create_cert_req(const X509_Cert_Options& opts, const Private_Key& key, const std::string& hash_fn, RandomNumberGenerator& rng); } } #endif botan-2.4.0/src/python/000077500000000000000000000000001322470703100147275ustar00rootroot00000000000000botan-2.4.0/src/python/botan2.py000077500000000000000000001125501322470703100164750ustar00rootroot00000000000000#!/usr/bin/env python """ Python wrapper of the botan crypto library https://botan.randombit.net (C) 2015,2017 Jack Lloyd (C) 2015 Uri Blumenthal (extensions and patches) Botan is released under the Simplified BSD License (see license.txt) This module uses the ctypes module and is usable by programs running under at least CPython 2.7, CPython 3.4 and 3.5, or PyPy. It uses botan's ffi module, which exposes a C API. It suppports all versions of Botan >= 2.0 """ import sys from ctypes import CDLL, POINTER, byref, c_void_p, c_size_t, c_uint32, c_char, c_char_p, create_string_buffer from binascii import hexlify, unhexlify, b2a_base64 from datetime import datetime import time # # Base exception for all exceptions raised from this module # class BotanException(Exception): pass # # Module initialization # if sys.platform == 'darwin': botan = CDLL('libbotan-2.dylib') # pylint: disable=invalid-name else: botan = CDLL('libbotan-2.so') # pylint: disable=invalid-name if botan.botan_ffi_supports_api(20151015) is False: raise BotanException("The Botan library does not support the FFI API expected by this version of the Python module") # # Internal utilities # def _call_fn_returning_vec(guess, fn): buf = create_string_buffer(guess) buf_len = c_size_t(len(buf)) rc = fn(buf, byref(buf_len)) if rc < 0: if buf_len.value > len(buf): #print("Calling again with %d" % (buf_len.value)) return _call_fn_returning_vec(buf_len.value, fn) else: raise BotanException("Call failed: %d" % (rc)) assert buf_len.value <= len(buf) return buf.raw[0:buf_len.value] def _call_fn_returning_string(guess, fn): # Assumes that anything called with this is returning plain ASCII strings # (base64 data, algorithm names, etc) v = _call_fn_returning_vec(guess, fn) return v.decode('ascii')[:-1] def _ctype_str(s): assert isinstance(s, str) if sys.version_info[0] < 3: return s else: return s.encode('utf-8') def _ctype_bits(s): if sys.version_info[0] < 3: if isinstance(s, str): return s else: raise Exception("Internal error - unexpected type provided to _ctype_bits") else: if isinstance(s, bytes): return s elif isinstance(s, str): return s.encode('utf-8') else: raise Exception("Internal error - unexpected type provided to _ctype_bits") def _ctype_bufout(buf): if sys.version_info[0] < 3: return str(buf.raw) else: return buf.raw def hex_encode(buf): return hexlify(buf).decode('ascii') def hex_decode(buf): return unhexlify(buf.encode('ascii')) # # Versions # def version_major(): return botan.botan_version_major() def version_minor(): return botan.botan_version_minor() def version_patch(): return botan.botan_version_patch() def version_string(): botan.botan_version_string.restype = c_char_p return botan.botan_version_string().decode('ascii') # # RNG # class rng(object): # pylint: disable=invalid-name # Can also use type "system" def __init__(self, rng_type='system'): botan.botan_rng_init.argtypes = [c_void_p, c_char_p] self.rng = c_void_p(0) rc = botan.botan_rng_init(byref(self.rng), _ctype_str(rng_type)) if rc != 0 or self.rng is None: raise BotanException("No rng " + rng_type + " available") def __del__(self): botan.botan_rng_destroy.argtypes = [c_void_p] botan.botan_rng_destroy(self.rng) def reseed(self, bits=256): botan.botan_rng_reseed.argtypes = [c_void_p, c_size_t] botan.botan_rng_reseed(self.rng, bits) def get(self, length): botan.botan_rng_get.argtypes = [c_void_p, POINTER(c_char), c_size_t] out = create_string_buffer(length) l = c_size_t(length) rc = botan.botan_rng_get(self.rng, out, l) if rc == 0: return _ctype_bufout(out) else: return None # # Hash function # class hash_function(object): # pylint: disable=invalid-name def __init__(self, algo): botan.botan_hash_init.argtypes = [c_void_p, c_char_p, c_uint32] flags = c_uint32(0) # always zero in this API version self.hash = c_void_p(0) rc = botan.botan_hash_init(byref(self.hash), _ctype_str(algo), flags) if rc != 0 or self.hash is None: raise BotanException("No hash " + algo + " for you!") def __del__(self): botan.botan_hash_destroy.argtypes = [c_void_p] botan.botan_hash_destroy(self.hash) def clear(self): botan.botan_hash_clear.argtypes = [c_void_p] return botan.botan_hash_clear(self.hash) def output_length(self): botan.botan_hash_output_length.argtypes = [c_void_p, POINTER(c_size_t)] l = c_size_t(0) rc = botan.botan_hash_output_length(self.hash, byref(l)) if rc == 0: return l.value raise BotanException("botan_hash_output_length failed") def update(self, x): botan.botan_hash_update.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_hash_update(self.hash, _ctype_bits(x), len(x)) def final(self): botan.botan_hash_final.argtypes = [c_void_p, POINTER(c_char)] out = create_string_buffer(self.output_length()) botan.botan_hash_final(self.hash, out) return _ctype_bufout(out) # # Message authentication codes # class message_authentication_code(object): # pylint: disable=invalid-name def __init__(self, algo): botan.botan_mac_init.argtypes = [c_void_p, c_char_p, c_uint32] flags = c_uint32(0) # always zero in this API version self.mac = c_void_p(0) rc = botan.botan_mac_init(byref(self.mac), _ctype_str(algo), flags) if rc != 0 or self.mac is None: raise BotanException("No mac " + algo + " for you!") def __del__(self): botan.botan_mac_destroy.argtypes = [c_void_p] botan.botan_mac_destroy(self.mac) def clear(self): botan.botan_mac_clear.argtypes = [c_void_p] return botan.botan_mac_clear(self.mac) def output_length(self): botan.botan_mac_output_length.argtypes = [c_void_p, POINTER(c_size_t)] l = c_size_t(0) rc = botan.botan_mac_output_length(self.mac, byref(l)) if rc == 0: return l.value raise BotanException("botan_mac_output_length failed") def set_key(self, key): botan.botan_mac_set_key.argtypes = [c_void_p, POINTER(c_char), c_size_t] return botan.botan_mac_set_key(self.mac, key, len(key)) def update(self, x): botan.botan_mac_update.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_mac_update(self.mac, x, len(x)) def final(self): botan.botan_mac_final.argtypes = [c_void_p, POINTER(c_char)] out = create_string_buffer(self.output_length()) botan.botan_mac_final(self.mac, out) return _ctype_bufout(out) class cipher(object): # pylint: disable=invalid-name def __init__(self, algo, encrypt=True): botan.botan_cipher_init.argtypes = [c_void_p, c_char_p, c_uint32] flags = 0 if encrypt else 1 self.cipher = c_void_p(0) rc = botan.botan_cipher_init(byref(self.cipher), _ctype_str(algo), flags) if rc != 0 or self.cipher is None: raise BotanException("No cipher " + algo + " for you!") def __del__(self): botan.botan_cipher_destroy.argtypes = [c_void_p] botan.botan_cipher_destroy(self.cipher) def default_nonce_length(self): botan.botan_cipher_get_default_nonce_length.argtypes = [c_void_p, POINTER(c_size_t)] l = c_size_t(0) botan.botan_cipher_get_default_nonce_length(self.cipher, byref(l)) return l.value def update_granularity(self): botan.botan_cipher_get_update_granularity.argtypes = [c_void_p, POINTER(c_size_t)] l = c_size_t(0) botan.botan_cipher_get_update_granularity(self.cipher, byref(l)) return l.value def key_length(self): kmin = c_size_t(0) kmax = c_size_t(0) botan.botan_cipher_query_keylen(self.cipher, byref(kmin), byref(kmax)) return kmin.value, kmax.value def tag_length(self): botan.botan_cipher_get_tag_length.argtypes = [c_void_p, POINTER(c_size_t)] l = c_size_t(0) botan.botan_cipher_get_tag_length(self.cipher, byref(l)) return l.value def is_authenticated(self): return self.tag_length() > 0 def valid_nonce_length(self, nonce_len): botan.botan_cipher_valid_nonce_length.argtypes = [c_void_p, c_size_t] rc = botan.botan_cipher_valid_nonce_length(self.cipher, nonce_len) if rc < 0: raise BotanException('Error calling valid_nonce_length') return True if rc == 1 else False def clear(self): botan.botan_cipher_clear.argtypes = [c_void_p] botan.botan_cipher_clear(self.cipher) def set_key(self, key): botan.botan_cipher_set_key.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_cipher_set_key(self.cipher, key, len(key)) def set_assoc_data(self, ad): botan.botan_cipher_set_associated_data.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_cipher_set_associated_data(self.cipher, ad, len(ad)) def start(self, nonce): botan.botan_cipher_start.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_cipher_start(self.cipher, nonce, len(nonce)) def _update(self, txt, final): botan.botan_cipher_update.argtypes = [c_void_p, c_uint32, POINTER(c_char), c_size_t, POINTER(c_size_t), POINTER(c_char), c_size_t, POINTER(c_size_t)] inp = txt if txt else '' inp_sz = c_size_t(len(inp)) inp_consumed = c_size_t(0) out = create_string_buffer(inp_sz.value + (self.tag_length() if final else 0)) out_sz = c_size_t(len(out)) out_written = c_size_t(0) flags = c_uint32(1 if final else 0) botan.botan_cipher_update(self.cipher, flags, out, out_sz, byref(out_written), _ctype_bits(inp), inp_sz, byref(inp_consumed)) # buffering not supported yet assert inp_consumed.value == inp_sz.value return out.raw[0:out_written.value] def update(self, txt): return self._update(txt, False) def finish(self, txt=None): return self._update(txt, True) def bcrypt(passwd, rng_instance, work_factor=10): """ Bcrypt password hashing """ botan.botan_bcrypt_generate.argtypes = [POINTER(c_char), POINTER(c_size_t), c_char_p, c_void_p, c_size_t, c_uint32] out_len = c_size_t(64) out = create_string_buffer(out_len.value) flags = c_uint32(0) rc = botan.botan_bcrypt_generate(out, byref(out_len), _ctype_str(passwd), rng_instance.rng, c_size_t(work_factor), flags) if rc != 0: raise BotanException('botan bcrypt failed, error %s' % (rc)) b = out.raw[0:out_len.value-1] if b[-1] == '\x00': b = b[:-1] return b def check_bcrypt(passwd, passwd_hash): rc = botan.botan_bcrypt_is_valid(_ctype_str(passwd), passwd_hash) return rc == 0 # # PBKDF # def pbkdf(algo, password, out_len, iterations=10000, salt=rng().get(12)): botan.botan_pbkdf.argtypes = [c_char_p, POINTER(c_char), c_size_t, c_char_p, c_void_p, c_size_t, c_size_t] out_buf = create_string_buffer(out_len) botan.botan_pbkdf(_ctype_str(algo), out_buf, out_len, _ctype_str(password), salt, len(salt), iterations) return (salt, iterations, out_buf.raw) def pbkdf_timed(algo, password, out_len, ms_to_run=300, salt=rng().get(12)): botan.botan_pbkdf_timed.argtypes = [c_char_p, POINTER(c_char), c_size_t, c_char_p, c_void_p, c_size_t, c_size_t, POINTER(c_size_t)] out_buf = create_string_buffer(out_len) iterations = c_size_t(0) botan.botan_pbkdf_timed( _ctype_str(algo), out_buf, out_len, _ctype_str(password), salt, len(salt), ms_to_run, byref(iterations)) return (salt, iterations.value, out_buf.raw) # # KDF # def kdf(algo, secret, out_len, salt, label): botan.botan_kdf.argtypes = [c_char_p, POINTER(c_char), c_size_t, POINTER(c_char), c_size_t, POINTER(c_char), c_size_t, POINTER(c_char), c_size_t] out_buf = create_string_buffer(out_len) out_sz = c_size_t(out_len) botan.botan_kdf(_ctype_str(algo), out_buf, out_sz, secret, len(secret), salt, len(salt), label, len(label)) return out_buf.raw[0:out_sz.value] # # Public and private keys # class public_key(object): # pylint: disable=invalid-name def __init__(self, obj=c_void_p(0)): self.pubkey = obj def __del__(self): botan.botan_pubkey_destroy.argtypes = [c_void_p] botan.botan_pubkey_destroy(self.pubkey) def estimated_strength(self): botan.botan_pubkey_estimated_strength.argtypes = [c_void_p, POINTER(c_size_t)] r = c_size_t(0) botan.botan_pubkey_estimated_strength(self.pubkey, byref(r)) return r.value def algo_name(self): botan.botan_pubkey_algo_name.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_string(32, lambda b, bl: botan.botan_pubkey_algo_name(self.pubkey, b, bl)) def encoding(self, pem=False): botan.botan_pubkey_export.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t), c_uint32] flag = 1 if pem else 0 return _call_fn_returning_vec(0, lambda b, bl: botan.botan_pubkey_export(self.pubkey, b, bl, flag)) def fingerprint(self, hash_algorithm='SHA-256'): botan.botan_pubkey_fingerprint.argtypes = [c_void_p, c_char_p, POINTER(c_char), POINTER(c_size_t)] n = hash_function(hash_algorithm).output_length() buf = create_string_buffer(n) buf_len = c_size_t(n) botan.botan_pubkey_fingerprint(self.pubkey, _ctype_str(hash_algorithm), buf, byref(buf_len)) return hex_encode(buf[0:buf_len.value]) class private_key(object): # pylint: disable=invalid-name def __init__(self, alg, param, rng_instance): botan.botan_privkey_create_rsa.argtypes = [c_void_p, c_void_p, c_size_t] botan.botan_privkey_create_ecdsa.argtypes = [c_void_p, c_void_p, c_char_p] botan.botan_privkey_create_ecdh.argtypes = [c_void_p, c_void_p, c_char_p] botan.botan_privkey_create_mceliece.argtypes = [c_void_p, c_void_p, c_size_t, c_size_t] self.privkey = c_void_p(0) if alg == 'rsa': botan.botan_privkey_create_rsa(byref(self.privkey), rng_instance.rng, param) elif alg == 'ecdsa': botan.botan_privkey_create_ecdsa(byref(self.privkey), rng_instance.rng, _ctype_str(param)) elif alg == 'ecdh': botan.botan_privkey_create_ecdh(byref(self.privkey), rng_instance.rng, _ctype_str(param)) elif alg in ['mce', 'mceliece']: botan.botan_privkey_create_mceliece(byref(self.privkey), rng_instance.rng, param[0], param[1]) else: raise BotanException('Unknown public key algo ' + alg) if self.privkey is None: raise BotanException('Error creating ' + alg + ' key') def __del__(self): botan.botan_privkey_destroy.argtypes = [c_void_p] botan.botan_privkey_destroy(self.privkey) def get_public_key(self): botan.botan_privkey_export_pubkey.argtypes = [c_void_p, c_void_p] pub = c_void_p(0) botan.botan_privkey_export_pubkey(byref(pub), self.privkey) return public_key(pub) def export(self): botan.botan_privkey_export.argtypes = [c_void_p, POINTER(c_char), c_void_p] n = 4096 buf = create_string_buffer(n) buf_len = c_size_t(n) rc = botan.botan_privkey_export(self.privkey, buf, byref(buf_len)) if rc != 0: buf = create_string_buffer(buf_len.value) botan.botan_privkey_export(self.privkey, buf, byref(buf_len)) return buf[0:buf_len.value] class pk_op_encrypt(object): # pylint: disable=invalid-name def __init__(self, key, padding): botan.botan_pk_op_encrypt_create.argtypes = [c_void_p, c_void_p, c_char_p, c_uint32] self.op = c_void_p(0) flags = c_uint32(0) # always zero in this ABI print("Padding is ", padding) botan.botan_pk_op_encrypt_create(byref(self.op), key.pubkey, _ctype_str(padding), flags) if not self.op: raise BotanException("No pk op for you") def __del__(self): botan.botan_pk_op_encrypt_destroy.argtypes = [c_void_p] botan.botan_pk_op_encrypt_destroy(self.op) def encrypt(self, msg, rng_instance): botan.botan_pk_op_encrypt.argtypes = [c_void_p, c_void_p, POINTER(c_char), POINTER(c_size_t), POINTER(c_char), c_size_t] outbuf_sz = c_size_t(4096) #?!?! outbuf = create_string_buffer(outbuf_sz.value) ll = len(msg) #print("encrypt: len=%d" % ll) #if sys.version_info[0] > 2: # msg = cast(msg, c_char_p) # ll = c_size_t(ll) botan.botan_pk_op_encrypt(self.op, rng_instance.rng, outbuf, byref(outbuf_sz), msg, ll) #print("encrypt: outbuf_sz.value=%d" % outbuf_sz.value) return outbuf.raw[0:outbuf_sz.value] class pk_op_decrypt(object): # pylint: disable=invalid-name def __init__(self, key, padding): botan.botan_pk_op_decrypt_create.argtypes = [c_void_p, c_void_p, c_char_p, c_uint32] self.op = c_void_p(0) flags = c_uint32(0) # always zero in this ABI botan.botan_pk_op_decrypt_create(byref(self.op), key.privkey, _ctype_str(padding), flags) if not self.op: raise BotanException("No pk op for you") def __del__(self): botan.botan_pk_op_decrypt_destroy.argtypes = [c_void_p] botan.botan_pk_op_decrypt_destroy(self.op) def decrypt(self, msg): botan.botan_pk_op_decrypt.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t), POINTER(c_char), c_size_t] outbuf_sz = c_size_t(4096) #?!?! outbuf = create_string_buffer(outbuf_sz.value) ll = len(msg) botan.botan_pk_op_decrypt(self.op, outbuf, byref(outbuf_sz), _ctype_bits(msg), ll) return outbuf.raw[0:outbuf_sz.value] class pk_op_sign(object): # pylint: disable=invalid-name def __init__(self, key, padding): botan.botan_pk_op_sign_create.argtypes = [c_void_p, c_void_p, c_char_p, c_uint32] self.op = c_void_p(0) flags = c_uint32(0) # always zero in this ABI botan.botan_pk_op_sign_create(byref(self.op), key.privkey, _ctype_str(padding), flags) if not self.op: raise BotanException("No pk op for you") def __del__(self): botan.botan_pk_op_sign_destroy.argtypes = [c_void_p] botan.botan_pk_op_sign_destroy(self.op) def update(self, msg): botan.botan_pk_op_sign_update.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_pk_op_sign_update(self.op, _ctype_str(msg), len(msg)) def finish(self, rng_instance): botan.botan_pk_op_sign_finish.argtypes = [c_void_p, c_void_p, POINTER(c_char), POINTER(c_size_t)] outbuf_sz = c_size_t(4096) #?!?! outbuf = create_string_buffer(outbuf_sz.value) botan.botan_pk_op_sign_finish(self.op, rng_instance.rng, outbuf, byref(outbuf_sz)) return outbuf.raw[0:outbuf_sz.value] class pk_op_verify(object): # pylint: disable=invalid-name def __init__(self, key, padding): botan.botan_pk_op_verify_create.argtypes = [c_void_p, c_void_p, c_char_p, c_uint32] self.op = c_void_p(0) flags = c_uint32(0) # always zero in this ABI botan.botan_pk_op_verify_create(byref(self.op), key.pubkey, _ctype_str(padding), flags) if not self.op: raise BotanException("No pk op for you") def __del__(self): botan.botan_pk_op_verify_destroy.argtypes = [c_void_p] botan.botan_pk_op_verify_destroy(self.op) def update(self, msg): botan.botan_pk_op_verify_update.argtypes = [c_void_p, POINTER(c_char), c_size_t] botan.botan_pk_op_verify_update(self.op, _ctype_bits(msg), len(msg)) def check_signature(self, signature): botan.botan_pk_op_verify_finish.argtypes = [c_void_p, POINTER(c_char), c_size_t] rc = botan.botan_pk_op_verify_finish(self.op, _ctype_bits(signature), len(signature)) if rc == 0: return True return False # # MCEIES encryption # Must be used with McEliece keys # def mceies_encrypt(mce, rng_instance, aead, pt, ad): botan.botan_mceies_encrypt.argtypes = [c_void_p, c_void_p, c_char_p, POINTER(c_char), c_size_t, POINTER(c_char), c_size_t, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_vec(0, lambda b, bl: botan.botan_mceies_encrypt(mce.pubkey, rng_instance.rng, _ctype_str(aead), _ctype_bits(pt), len(pt), _ctype_bits(ad), len(ad), b, bl)) def mceies_decrypt(mce, aead, pt, ad): botan.botan_mceies_decrypt.argtypes = [c_void_p, c_char_p, POINTER(c_char), c_size_t, POINTER(c_char), c_size_t, POINTER(c_char), POINTER(c_size_t)] #msg = cast(msg, c_char_p) #ll = c_size_t(ll) return _call_fn_returning_vec(0, lambda b, bl: botan.botan_mceies_decrypt(mce.privkey, _ctype_str(aead), _ctype_bits(pt), len(pt), _ctype_bits(ad), len(ad), b, bl)) class pk_op_key_agreement(object): # pylint: disable=invalid-name def __init__(self, key, kdf_name): botan.botan_pk_op_key_agreement_create.argtypes = [c_void_p, c_void_p, c_char_p, c_uint32] botan.botan_pk_op_key_agreement_export_public.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] self.op = c_void_p(0) flags = c_uint32(0) # always zero in this ABI botan.botan_pk_op_key_agreement_create(byref(self.op), key.privkey, kdf_name, flags) if not self.op: raise BotanException("No key agreement for you") self.m_public_value = _call_fn_returning_vec( 0, lambda b, bl: botan.botan_pk_op_key_agreement_export_public(key.privkey, b, bl)) def __del__(self): botan.botan_pk_op_key_agreement_destroy.argtypes = [c_void_p] botan.botan_pk_op_key_agreement_destroy(self.op) def public_value(self): return self.m_public_value def agree(self, other, key_len, salt): botan.botan_pk_op_key_agreement.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t), POINTER(c_char), c_size_t, POINTER(c_char), c_size_t] return _call_fn_returning_vec(key_len, lambda b, bl: botan.botan_pk_op_key_agreement(self.op, b, bl, other, len(other), salt, len(salt))) # # X.509 certificates # class x509_cert(object): # pylint: disable=invalid-name def __init__(self, filename=None, buf=None): if filename is None and buf is None: raise BotanException("No filename or buf given") if filename is not None and buf is not None: raise BotanException("Both filename and buf given") elif filename is not None: botan.botan_x509_cert_load_file.argtypes = [POINTER(c_void_p), c_char_p] self.x509_cert = c_void_p(0) botan.botan_x509_cert_load_file(byref(self.x509_cert), _ctype_str(filename)) elif buf is not None: botan.botan_x509_cert_load.argtypes = [POINTER(c_void_p), POINTER(c_char), c_size_t] self.x509_cert = c_void_p(0) botan.botan_x509_cert_load(byref(self.x509_cert), _ctype_bits(buf), len(buf)) def __del__(self): botan.botan_x509_cert_destroy.argtypes = [c_void_p] botan.botan_x509_cert_destroy(self.x509_cert) def time_starts(self): botan.botan_x509_cert_get_time_starts.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] starts = _call_fn_returning_string( 16, lambda b, bl: botan.botan_x509_cert_get_time_starts(self.x509_cert, b, bl)) if len(starts) == 13: # UTC time struct_time = time.strptime(starts, "%y%m%d%H%M%SZ") elif len(starts) == 15: # Generalized time struct_time = time.strptime(starts, "%Y%m%d%H%M%SZ") else: raise BotanException("Wrong date/time format") return datetime.fromtimestamp(time.mktime(struct_time)) def time_expires(self): botan.botan_x509_cert_get_time_expires.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] expires = _call_fn_returning_string( 16, lambda b, bl: botan.botan_x509_cert_get_time_expires(self.x509_cert, b, bl)) if len(expires) == 13: # UTC time struct_time = time.strptime(expires, "%y%m%d%H%M%SZ") elif len(expires) == 15: # Generalized time struct_time = time.strptime(expires, "%Y%m%d%H%M%SZ") else: raise BotanException("Wrong date/time format") return datetime.fromtimestamp(time.mktime(struct_time)) def to_string(self): botan.botan_x509_cert_to_string.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_string( 0, lambda b, bl: botan.botan_x509_cert_to_string(self.x509_cert, b, bl)) def fingerprint(self, hash_algo='SHA-256'): botan.botan_x509_cert_get_fingerprint.argtypes = [c_void_p, c_char_p, POINTER(c_char), POINTER(c_size_t)] n = hash_function(hash_algo).output_length() * 3 return _call_fn_returning_string( n, lambda b, bl: botan.botan_x509_cert_get_fingerprint(self.x509_cert, _ctype_str(hash_algo), b, bl)) def serial_number(self): botan.botan_x509_cert_get_serial_number.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_vec( 0, lambda b, bl: botan.botan_x509_cert_get_serial_number(self.x509_cert, b, bl)) def authority_key_id(self): botan.botan_x509_cert_get_authority_key_id.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_vec( 0, lambda b, bl: botan.botan_x509_cert_get_authority_key_id(self.x509_cert, b, bl)) def subject_key_id(self): botan.botan_x509_cert_get_subject_key_id.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_vec( 0, lambda b, bl: botan.botan_x509_cert_get_subject_key_id(self.x509_cert, b, bl)) def subject_public_key_bits(self): botan.botan_x509_cert_get_public_key_bits.argtypes = [c_void_p, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_vec( 0, lambda b, bl: botan.botan_x509_cert_get_public_key_bits(self.x509_cert, b, bl)) def subject_public_key(self): botan.botan_x509_cert_get_public_key.argtypes = [c_void_p, c_void_p] pub = c_void_p(0) botan.botan_x509_cert_get_public_key(self.x509_cert, byref(pub)) return public_key(pub) def subject_dn(self, key, index): botan.botan_x509_cert_get_subject_dn.argtypes = [ c_void_p, c_char_p, c_size_t, POINTER(c_char), POINTER(c_size_t)] return _call_fn_returning_string( 0, lambda b, bl: botan.botan_x509_cert_get_subject_dn(self.x509_cert, _ctype_str(key), index, b, bl)) # # Tests and examples # def test(): def test_version(): print("\n%s" % version_string()) print("v%d.%d.%d\n" % (version_major(), version_minor(), version_patch())) print("\nPython %s\n" % sys.version.replace('\n', ' ')) def test_kdf(): print("KDF2(SHA-1) %s" % hex_encode(kdf('KDF2(SHA-1)', hex_decode('701F3480DFE95F57941F804B1B2413EF'), 7, hex_decode('55A4E9DD5F4CA2EF82'), hex_decode('')))) def test_pbkdf(): print("PBKDF2(SHA-1) %s" % hex_encode(pbkdf('PBKDF2(SHA-1)', '', 32, 10000, hex_decode('0001020304050607'))[2])) print("good output %s\n" % '59B2B1143B4CB1059EC58D9722FB1C72471E0D85C6F7543BA5228526375B0127') (salt, iterations, psk) = pbkdf_timed('PBKDF2(SHA-256)', 'xyz', 32, 200) print("PBKDF2(SHA-256) x=timed, y=iterated; salt = %s (len=%d) #iterations = %d\n" % (hex_encode(salt), len(salt), iterations)) print('x %s' % hex_encode(psk)) print('y %s\n' % (hex_encode(pbkdf('PBKDF2(SHA-256)', 'xyz', 32, iterations, salt)[2]))) def test_bcrypt(): print("Testing Bcrypt...") r = rng() phash = bcrypt('testing', r) print("bcrypt returned %s (%d bytes)" % (hex_encode(phash), len(phash))) print("validating the hash produced: %r" % (check_bcrypt('testing', phash))) print("\n") def test_hmac(): hmac = message_authentication_code('HMAC(SHA-256)') hmac.set_key(hex_decode('0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20')) hmac.update(hex_decode('616263')) hmac_vec = hex_decode('A21B1F5D4CF4F73A4DD939750F7A066A7F98CC131CB16A6692759021CFAB8181') hmac_output = hmac.final() if hmac_output != hmac_vec: print("Bad HMAC:\t%s" % hex_encode(hmac_output)) print("vs good: \t%s" % hex_encode(hmac_vec)) else: print("HMAC output correct: %s\n" % hex_encode(hmac_output)) def test_rng(): user_rng = rng("user") print("rng output:\n\t%s\n\t%s\n\t%s\n" % (hex_encode(user_rng.get(42)), hex_encode(user_rng.get(13)), hex_encode(user_rng.get(9)))) def test_hash(): md5 = hash_function('MD5') assert md5.output_length() == 16 md5.update('h') md5.update('i') h1 = md5.final() print("md5 hash: %s (%s)\n" % (hex_encode(h1), '49f68a5c8493ec2c0bf489821c21fc3b')) md5.update(hex_decode('f468025b')) h2 = md5.final() print("md5 hash: %s (%s)\n" % (hex_encode(h2), '47efd2be302a937775e93dea281b6751')) def test_cipher(): for mode in ['AES-128/CTR-BE', 'Serpent/GCM', 'ChaCha20Poly1305']: enc = cipher(mode, encrypt=True) (kmin, kmax) = enc.key_length() print("%s: default nonce=%d update_size=%d key_min=%d key_max=%d" % (mode, enc.default_nonce_length(), enc.update_granularity(), kmin, kmax)) iv = rng().get(enc.default_nonce_length()) key = rng().get(kmax) pt = rng().get(21) print(" plaintext %s (%d)" % (hex_encode(pt), len(pt))) enc.set_key(key) enc.start(iv) update_result = enc.update('') assert not update_result ct = enc.finish(pt) print(" ciphertext %s (%d)" % (hex_encode(ct), len(ct))) dec = cipher(mode, encrypt=False) dec.set_key(key) dec.start(iv) decrypted = dec.finish(ct) print(" decrypted %s (%d)\n" % (hex_encode(decrypted), len(decrypted))) def test_mceliece(): mce_priv = private_key('mce', [2960, 57], rng()) mce_pub = mce_priv.get_public_key() mce_plaintext = 'mce plaintext' mce_ad = 'mce AD' mce_ciphertext = mceies_encrypt(mce_pub, rng(), 'ChaCha20Poly1305', mce_plaintext, mce_ad) print("mceies len(pt)=%d len(ct)=%d" % (len(mce_plaintext), len(mce_ciphertext))) mce_decrypt = mceies_decrypt(mce_priv, 'ChaCha20Poly1305', mce_ciphertext, mce_ad) print(" mceies plaintext \'%s\' (%d)" % (mce_plaintext, len(mce_plaintext))) # Since mceies_decrypt() returns bytes in Python3, the following line # needs .decode('utf-8') to convert mce_decrypt from bytes to a # text string (Unicode). # You don't need to add .decode() if # (a) your expected output is bytes rather than a text string, or # (b) you are using Python2 rather than Python3. print(" mceies decrypted \'%s\' (%d)" % (mce_decrypt.decode('utf-8'), len(mce_decrypt))) print("mce_pub %s/SHA-1 fingerprint: %s\nEstimated strength %s bits (len %d)\n" % ( mce_pub.algo_name(), mce_pub.fingerprint("SHA-1"), mce_pub.estimated_strength(), len(mce_pub.encoding()) )) def test_rsa(): rsapriv = private_key('rsa', 1536, rng()) rsapub = rsapriv.get_public_key() print("rsapub %s SHA-1 fingerprint: %s estimated strength %d (len %d)" % ( rsapub.algo_name(), rsapub.fingerprint("SHA-1"), rsapub.estimated_strength(), len(rsapub.encoding()) )) dec = pk_op_decrypt(rsapriv, "EME1(SHA-256)") enc = pk_op_encrypt(rsapub, "EME1(SHA-256)") sys_rng = rng() symkey = sys_rng.get(32) ctext = enc.encrypt(symkey, sys_rng) print("ptext \'%s\' (%d)" % (hex_encode(symkey), len(symkey))) print("ctext \'%s\' (%d)" % (hex_encode(ctext), len(ctext))) print("decrypt \'%s\' (%d)\n" % (hex_encode(dec.decrypt(ctext)), len(dec.decrypt(ctext)))) signer = pk_op_sign(rsapriv, 'EMSA4(SHA-384)') signer.update('messa') signer.update('ge') sig = signer.finish(rng()) print("EMSA4(SHA-384) signature: %s" % hex_encode(sig)) verify = pk_op_verify(rsapub, 'EMSA4(SHA-384)') verify.update('mess') verify.update('age') print("good sig accepted? %s" % verify.check_signature(sig)) verify.update('mess of things') verify.update('age') print("bad sig accepted? %s" % verify.check_signature(sig)) verify.update('message') print("good sig accepted? %s\n" % verify.check_signature(sig)) def test_dh(): a_rng = rng('user') b_rng = rng('user') for dh_grp in ['secp256r1', 'curve25519']: dh_kdf = 'KDF2(SHA-384)'.encode('utf-8') a_dh_priv = private_key('ecdh', dh_grp, rng()) b_dh_priv = private_key('ecdh', dh_grp, rng()) a_dh = pk_op_key_agreement(a_dh_priv, dh_kdf) b_dh = pk_op_key_agreement(b_dh_priv, dh_kdf) a_dh_pub = a_dh.public_value() b_dh_pub = b_dh.public_value() a_salt = a_rng.get(8) b_salt = b_rng.get(8) print("ecdh %s pubs:\n %s (salt %s)\n %s (salt %s)\n" % (dh_grp, hex_encode(a_dh_pub), hex_encode(a_salt), hex_encode(b_dh_pub), hex_encode(b_salt))) a_key = a_dh.agree(b_dh_pub, 32, a_salt + b_salt) b_key = b_dh.agree(a_dh_pub, 32, a_salt + b_salt) print("ecdh %s shared:\n %s\n %s\n" % (dh_grp, hex_encode(a_key), hex_encode(b_key))) def test_certs(): cert = x509_cert(filename="src/tests/data/x509/ecc/CSCA.CSCA.csca-germany.1.crt") print("CSCA (Germany) Certificate\nDetails:") print("SHA-1 fingerprint: %s" % cert.fingerprint("SHA-1")) print("Expected: 32:42:1C:C3:EC:54:D7:E9:43:EC:51:F0:19:23:BD:85:1D:F2:1B:B9") print("Not before: %s" % cert.time_starts()) print("Not after: %s" % cert.time_expires()) print("Serial number: %s" % hex_encode(cert.serial_number())) print("Authority Key ID: %s" % hex_encode(cert.authority_key_id())) print("Subject Key ID: %s" % hex_encode(cert.subject_key_id())) print("Public key bits:\n%s\n" % b2a_base64(cert.subject_public_key_bits())) pubkey = cert.subject_public_key() print("Public key algo: %s" % pubkey.algo_name()) print("Public key strength: %s" % pubkey.estimated_strength() + " bits") dn_fields = ("Name", "Email", "Organization", "Organizational Unit", "Country") for field in dn_fields: try: print("%s: %s" % (field, cert.subject_dn(field, 0))) except BotanException: print("Field: %s not found in certificate" % field) print(cert.to_string()) test_version() test_kdf() test_pbkdf() test_bcrypt() test_hmac() test_rng() test_hash() test_cipher() test_mceliece() test_rsa() test_dh() test_certs() def main(args=None): if args is None: args = sys.argv test() if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/000077500000000000000000000000001322470703100150755ustar00rootroot00000000000000botan-2.4.0/src/scripts/bench.py000077500000000000000000000142101322470703100165270ustar00rootroot00000000000000#!/usr/bin/python """ Compare Botan with OpenSSL using their respective benchmark utils (C) 2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) TODO - Also compare RSA, ECDSA, ECDH - Output pretty graphs with matplotlib """ import logging import os import sys import optparse # pylint: disable=deprecated-module import subprocess import re import json def setup_logging(options): if options.verbose: log_level = logging.DEBUG elif options.quiet: log_level = logging.WARNING else: log_level = logging.INFO class LogOnErrorHandler(logging.StreamHandler, object): def emit(self, record): super(LogOnErrorHandler, self).emit(record) if record.levelno >= logging.ERROR: sys.exit(1) lh = LogOnErrorHandler(sys.stdout) lh.setFormatter(logging.Formatter('%(levelname) 7s: %(message)s')) logging.getLogger().addHandler(lh) logging.getLogger().setLevel(log_level) def run_command(cmd): logging.debug("Running '%s'", ' '.join(cmd)) proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) stdout, stderr = proc.communicate() if proc.returncode != 0: logging.error("Running command %s failed ret %d", ' '.join(cmd), proc.returncode) return stdout + stderr def get_openssl_version(openssl): output = run_command([openssl, 'version']) openssl_version_re = re.compile(r'OpenSSL ([0-9a-z\.]+) .*') match = openssl_version_re.match(output) if match: return match.group(1) else: logging.warning("Unable to parse OpenSSL version output %s", output) return output def get_botan_version(botan): return run_command([botan, 'version']).strip() EVP_MAP = { 'Blowfish': 'bf-ecb', 'AES-128/GCM': 'aes-128-gcm', 'AES-256/GCM': 'aes-256-gcm', 'ChaCha20': 'chacha20', 'MD5': 'md5', 'SHA-1': 'sha1', 'RIPEMD-160': 'ripemd160', 'SHA-256': 'sha256', 'SHA-384': 'sha384', 'SHA-512': 'sha512' } def run_openssl_bench(openssl, algo): logging.info('Running OpenSSL benchmark for %s', algo) cmd = [openssl, 'speed', '-mr'] if algo in EVP_MAP: cmd += ['-evp', EVP_MAP[algo]] else: cmd += [algo] output = run_command(cmd) buf_header = re.compile(r'\+DT:([a-z0-9-]+):([0-9]+):([0-9]+)$') res_header = re.compile(r'\+R:([0-9]+):[a-z0-9-]+:([0-9]+\.[0-9]+)$') ignored = re.compile(r'\+(H|F):.*') results = [] result = None for l in output.splitlines(): if ignored.match(l): continue if result is None: match = buf_header.match(l) if match is None: logging.error("Unexpected output from OpenSSL %s", l) result = {'algo': algo, 'buf_size': int(match.group(3))} else: match = res_header.match(l) result['bytes'] = int(match.group(1)) * result['buf_size'] result['runtime'] = float(match.group(2)) result['bps'] = int(result['bytes'] / result['runtime']) results.append(result) result = None return results def run_botan_bench(botan, runtime, buf_sizes, algo): runtime = .05 cmd = [botan, 'speed', '--format=json', '--msec=%d' % int(runtime * 1000), '--buf-size=%s' % (','.join(map(str, buf_sizes))), algo] output = run_command(cmd) output = json.loads(output) return output class BenchmarkResult(object): def __init__(self, algo, buf_sizes, openssl_results, botan_results): self.algo = algo self.results = {} def find_result(results, sz): for r in results: if 'buf_size' in r and r['buf_size'] == sz: return r['bps'] raise Exception("Could not find expected result in data") for buf_size in buf_sizes: self.results[buf_size] = { 'openssl': find_result(openssl_results, buf_size), 'botan': find_result(botan_results, buf_size) } def result_string(self): out = "" for (k, v) in self.results.items(): out += "algo %s buf_size % 6d botan % 12d bps openssl % 12d bps adv %.02f\n" % ( self.algo, k, v['botan'], v['openssl'], float(v['botan']) / v['openssl']) return out def bench_algo(openssl, botan, algo): openssl_results = run_openssl_bench(openssl, algo) buf_sizes = sorted([x['buf_size'] for x in openssl_results]) runtime = sum(x['runtime'] for x in openssl_results) / len(openssl_results) botan_results = run_botan_bench(botan, runtime, buf_sizes, algo) return BenchmarkResult(algo, buf_sizes, openssl_results, botan_results) def main(args=None): if args is None: args = sys.argv parser = optparse.OptionParser() parser.add_option('--verbose', action='store_true', default=False, help="be noisy") parser.add_option('--quiet', action='store_true', default=False, help="be very quiet") parser.add_option('--openssl-cli', metavar='PATH', default='/usr/bin/openssl', help='Path to openssl binary (default %default)') parser.add_option('--botan-cli', metavar='PATH', default='/usr/bin/botan', help='Path to botan binary (default %default)') (options, args) = parser.parse_args(args) setup_logging(options) openssl = options.openssl_cli botan = options.botan_cli if os.access(openssl, os.X_OK) is False: logging.error("Unable to access openssl binary at %s", openssl) if os.access(botan, os.X_OK) is False: logging.error("Unable to access botan binary at %s", botan) openssl_version = get_openssl_version(openssl) botan_version = get_botan_version(botan) logging.info("Comparing Botan %s with OpenSSL %s", botan_version, openssl_version) for algo in sorted(EVP_MAP.keys()): result = bench_algo(openssl, botan, algo) print(result.result_string()) return 0 if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/build_docs.py000077500000000000000000000116571322470703100175730ustar00rootroot00000000000000#!/usr/bin/env python """ Botan doc generation script (C) 2014,2015,2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import sys import optparse # pylint: disable=deprecated-module import subprocess import shutil import logging import json import tempfile import os import stat def get_concurrency(): """ Get default concurrency level of build """ def_concurrency = 2 try: import multiprocessing return max(def_concurrency, multiprocessing.cpu_count()) except ImportError: return def_concurrency def touch(fname): try: os.utime(fname, None) except OSError: open(fname, 'a').close() def copy_files(src_path, dest_dir): file_mode = os.stat(src_path).st_mode if stat.S_ISREG(file_mode): logging.debug("Copying file %s to %s", src_path, dest_dir) shutil.copy(src_path, dest_dir) else: for f in os.listdir(src_path): src_file = os.path.join(src_path, f) dest_file = os.path.join(dest_dir, f) logging.debug("Copying dir %s to %s", src_file, dest_file) shutil.copyfile(src_file, dest_file) def run_and_check(cmd_line, cwd=None): logging.debug("Executing %s", ' '.join(cmd_line)) proc = subprocess.Popen(cmd_line, close_fds=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd) (stdout, stderr) = proc.communicate() if stdout: logging.debug(stdout.decode()) if stderr: logging.debug(stderr.decode()) if proc.returncode != 0: logging.error("Error running %s", ' '.join(cmd_line)) sys.exit(1) def parse_options(args): parser = optparse.OptionParser() parser.add_option('--verbose', action='store_true', default=False, help='Show debug messages') parser.add_option('--quiet', action='store_true', default=False, help='Show only warnings and errors') parser.add_option('--build-dir', metavar='DIR', default='build', help='Location of build output (default \'%default\')') parser.add_option('--dry-run', default=False, action='store_true', help='Just display what would be done') (options, args) = parser.parse_args(args) if len(args) > 1: logging.error("Unknown arguments") return None def log_level(): if options.verbose: return logging.DEBUG if options.quiet: return logging.WARNING return logging.INFO logging.getLogger().setLevel(log_level()) return options def main(args=None): # pylint: disable=too-many-branches,too-many-locals if args is None: args = sys.argv logging.basicConfig(stream=sys.stdout, format='%(levelname) 7s: %(message)s') options = parse_options(args) if options is None: return 1 with open(os.path.join(options.build_dir, 'build_config.json')) as f: cfg = json.load(f) with_docs = bool(cfg['with_documentation']) with_sphinx = bool(cfg['with_sphinx']) with_pdf = bool(cfg['with_pdf']) with_rst2man = bool(cfg['with_rst2man']) with_doxygen = bool(cfg['with_doxygen']) doc_stamp_file = cfg['doc_stamp_file'] manual_src = os.path.join(cfg['doc_dir'], 'manual') manual_output = os.path.join(cfg['doc_output_dir'], 'manual') if with_docs is False: logging.debug('Documentation build disabled') return 0 cmds = [] if with_doxygen: cmds.append(['doxygen', os.path.join(cfg['build_dir'], 'botan.doxy')]) if with_sphinx: sphinx_build = ['sphinx-build', '-c', cfg['sphinx_config_dir'], '-j', str(get_concurrency())] cmds.append(sphinx_build + ['-b', 'html', manual_src, manual_output]) if with_pdf: latex_output = tempfile.mkdtemp(prefix='botan_latex_') cmds.append(sphinx_build + ['-b', 'latex', manual_src, latex_output]) cmds.append(['make', '-C', latex_output]) cmds.append(['cp', os.path.join(latex_output, 'botan.pdf'), manual_output]) else: # otherwise just copy it cmds.append(['cp', manual_src, manual_output]) if with_rst2man: cmds.append(['rst2man', os.path.join(manual_src, 'cli.rst'), os.path.join(cfg['build_dir'], 'botan.1')]) cmds.append(['touch', doc_stamp_file]) for cmd in cmds: if options.dry_run: print(' '.join(cmd)) else: if cmd[0] == 'cp': assert len(cmd) == 3 copy_files(cmd[1], cmd[2]) elif cmd[0] == 'touch': assert len(cmd) == 2 touch(cmd[1]) else: run_and_check(cmd) return 0 if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/build_tests.py000077500000000000000000000063601322470703100200000ustar00rootroot00000000000000#!/usr/bin/python """ This configures and builds with many different sub-configurations in an attempt to flush out missing feature macro checks, etc. There is probably no reason for you to run this. Unless you want to. (C) 2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import optparse # pylint: disable=deprecated-module import sys import subprocess def get_module_list(configure_py): configure = subprocess.Popen([configure_py, '--list-modules'], stdout=subprocess.PIPE) (stdout, _) = configure.communicate() if configure.returncode != 0: raise Exception("Running configure.py --list-modules failed") modules = [s.decode('ascii') for s in stdout.split()] modules.remove('bearssl') # can't test modules.remove('tpm') # can't test modules.remove('base') # can't remove return modules def get_concurrency(): def_concurrency = 2 try: import multiprocessing return max(def_concurrency, multiprocessing.cpu_count()) except ImportError: return def_concurrency def try_to_run(cmdline): print("Running %s ... " % (' '.join(cmdline))) sys.stdout.flush() cmd = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = cmd.communicate() failed = (cmd.returncode != 0) if failed: print("FAILURE") print(stdout.decode('ascii')) print(stderr.decode('ascii')) sys.stdout.flush() return not failed def run_test_build(configure_py, modules, include, run_tests=False): config = [configure_py] if include: config.append('--minimized') if modules: config.append('--enable-modules=' + ','.join(modules)) else: config.append('--disable-modules=' + ','.join(modules)) if try_to_run(config) is False: return False if try_to_run(['make', '-j', str(get_concurrency())]) is False: return False if run_tests is False: return True return try_to_run(['./botan-test']) def main(args): # TODO take configure.py and botan-test paths via options parser = optparse.OptionParser() parser.add_option('--run-tests', default=False, action='store_true') (options, args) = parser.parse_args(args) run_tests = options.run_tests configure_py = './configure.py' modules = get_module_list(configure_py) cant_disable = ['block', 'hash', 'hex', 'mac', 'modes', 'rng', 'stream', 'utils', 'cpuid', 'entropy'] always_include = ['sha2_32', 'sha2_64', 'aes'] failed = [] for module in sorted(modules): if (module in always_include) or (module in cant_disable): continue # already testing it extra = [] if module == 'auto_rng': extra.append('dev_random') if run_test_build(configure_py, [module] + always_include + extra, True, run_tests) is False: failed.append(module) for module in sorted(modules): if module in cant_disable or module in always_include: continue if run_test_build(configure_py, [module], False, run_tests) is False: failed.append(module) print("Failed building with %s", ' '.join(failed)) if __name__ == '__main__': sys.exit(main(sys.argv)) botan-2.4.0/src/scripts/ci/000077500000000000000000000000001322470703100154705ustar00rootroot00000000000000botan-2.4.0/src/scripts/ci/appveyor.yml000066400000000000000000000023171322470703100200630ustar00rootroot00000000000000 clone_depth: 5 environment: matrix: # MSVC 2013 DLL x86-64 - MSVS: 2013 PLATFORM: x86_amd64 TARGET: shared APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 # MSVC 2015 DLL x86-64 - MSVS: 2015 PLATFORM: x86_amd64 TARGET: shared APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 # MSVC 2017 DLL x86-32 + x86-64 - MSVS: 2017 PLATFORM: x86 TARGET: shared APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - MSVS: 2017 PLATFORM: x86_amd64 TARGET: shared APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 # MSVC 2017 static x86-64 - MSVS: 2017 PLATFORM: x86_amd64 TARGET: static APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 # MSVC 2017 w/debug iterators - MSVS: 2017 PLATFORM: x86_amd64 TARGET: sanitizer APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 install: - call src\scripts\ci\setup_appveyor.bat build_script: - python src\scripts\ci_build.py --os=windows --cc=msvc --without-python3 --make-tool=jom --cpu=%PLATFORM% %TARGET% # whitelist branches to avoid testing feature branches twice (as branch and as pull request) branches: only: - master - release-2 botan-2.4.0/src/scripts/ci/codecov.yml000066400000000000000000000005531322470703100176400ustar00rootroot00000000000000--- # Documentation # https://github.com/codecov/support/wiki/Codecov-Yaml#full-yaml # # Validate this file # curl --data-binary @codecov.yml https://codecov.io/validate coverage: status: project: default: # Random seeds in tests lead to a +/-0.05% coverage span even for PRs # that do not change source code threshold: 0.05 botan-2.4.0/src/scripts/ci/setup_appveyor.bat000066400000000000000000000010371322470703100212460ustar00rootroot00000000000000 echo Current build setup MSVS="%MSVS%" PLATFORM="%PLATFORM%" TARGET="%TARGET%" if %MSVS% == 2013 call "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" %PLATFORM% if %MSVS% == 2015 call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %PLATFORM% if %MSVS% == 2017 call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" %PLATFORM% rem check compiler version cl git clone --depth 1 https://github.com/randombit/botan-ci-tools 7z e botan-ci-tools/jom_1_1_2.zip botan-2.4.0/src/scripts/ci/setup_travis.sh000077500000000000000000000067361322470703100205730ustar00rootroot00000000000000#!/bin/bash set -ev which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if available git clone --depth 1 https://github.com/randombit/botan-ci-tools if [ "$TRAVIS_OS_NAME" = "linux" ]; then # ccache in Trusty is too old, use version from Xenial sudo dpkg -i botan-ci-tools/ubuntu/ccache_3.2.4-1_amd64.deb if [ "$BUILD_MODE" = "valgrind" ]; then sudo apt-get -qq update sudo apt-get install valgrind elif [ "$BUILD_MODE" = "cross-win32" ]; then # See https://github.com/travis-ci/travis-ci/issues/6460 sudo dpkg --add-architecture i386 sudo apt-get -qq update # have to run this after --add-architecture sudo apt-get install wine g++-mingw-w64-i686 mingw-w64-i686-dev elif [ "${BUILD_MODE:0:5}" = "cross" ]; then # Need updated qemu sudo add-apt-repository -y ppa:ubuntu-cloud-archive/kilo-staging sudo apt-get -qq update sudo apt-get install qemu-user if [ "$BUILD_MODE" = "cross-arm32" ]; then sudo apt-get install g++-arm-linux-gnueabihf libc6-dev-armhf-cross elif [ "$BUILD_MODE" = "cross-arm64" ]; then sudo apt-get install g++-aarch64-linux-gnu libc6-dev-arm64-cross elif [ "$BUILD_MODE" = "cross-ppc32" ]; then sudo apt-get install g++-powerpc-linux-gnu libc6-dev-powerpc-cross elif [ "$BUILD_MODE" = "cross-ppc64" ]; then sudo apt-get install g++-powerpc64le-linux-gnu libc6-dev-ppc64el-cross fi elif [ "$BUILD_MODE" = "lint" ]; then pip install --user pylint sudo apt-get install python3-pip pip3 install --user pylint elif [ "$BUILD_MODE" = "coverage" ]; then sudo apt-get -qq update sudo apt-get install trousers libtspi-dev # SoftHSMv1 in 14.04 does not work # Installs prebuilt SoftHSMv2 binaries into /tmp tar -C / -xvjf botan-ci-tools/softhsm2-trusty-bin.tar.bz2 /tmp/softhsm/bin/softhsm2-util --init-token --free --label test --pin 123456 --so-pin 12345678 # need updated lcov for gcc 4.8 coverage format sudo dpkg -i botan-ci-tools/ubuntu/lcov_1.12-2_all.deb (cd /home/travis/bin && ln -s gcov-4.8 gcov) pip install --user coverage pip install --user codecov==2.0.10 elif [ "$BUILD_MODE" = "sonar" ]; then sudo apt-get -qq update sudo apt-get install trousers libtspi-dev # installed llvm-3.4 conflicts with clang-3.9 in /usr/local # we need a more recent llvm-cov for coverage reports sudo apt-get remove llvm tar -C / -xvjf botan-ci-tools/softhsm2-trusty-bin.tar.bz2 /tmp/softhsm/bin/softhsm2-util --init-token --free --label test --pin 123456 --so-pin 12345678 wget https://sonarqube.com/static/cpp/build-wrapper-linux-x86.zip unzip build-wrapper-linux-x86.zip elif [ "$BUILD_MODE" = "docs" ]; then sudo apt-get -qq update sudo apt-get install doxygen python-docutils # The version of Sphinx in 14.04 is too old (1.2.2) and does not support # all C++ features used in the manual. Install python-requests to avoid # problem in Ubuntu packaged version, see # http://stackoverflow.com/questions/32779919/no-module-named-for-requests sudo apt-get remove python-requests python-openssl sudo pip install requests sphinx pyopenssl fi elif [ "$TRAVIS_OS_NAME" = "osx" ]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install ccache fi botan-2.4.0/src/scripts/ci/travis.yml000066400000000000000000000056101322470703100175250ustar00rootroot00000000000000language: cpp os: - linux - osx dist: trusty sudo: required compiler: - clang - gcc env: global: - CCACHE_MAXSIZE=250M - CCACHE_MAXFILES=2000 - CCACHE_COMPRESS=1 matrix: - BUILD_MODE="shared" - BUILD_MODE="fuzzers" - BUILD_MODE="coverage" - BUILD_MODE="cross-ppc32" - BUILD_MODE="cross-ppc64" - BUILD_MODE="cross-arm32" - BUILD_MODE="cross-arm64" - BUILD_MODE="cross-win32" - BUILD_MODE="valgrind" - BUILD_MODE="sonar" - BUILD_MODE="static" - BUILD_MODE="mini-shared" - BUILD_MODE="bsi" - BUILD_MODE="nist" - BUILD_MODE="docs" - BUILD_MODE="lint" matrix: exclude: # Skip GCC on OS X entirely - os: osx compiler: gcc - os: osx env: BUILD_MODE="sonar" # Run static, docs, lint, bsi, nist, fuzzers, coverage, valgrind, # sonar, sanitizer, minimized and non-ARM cross builds only on Linux/gcc. # The sanitizer builds under Clang run the tests very slowly and # cause CI timeouts. - compiler: clang env: BUILD_MODE="static" - compiler: clang env: BUILD_MODE="bsi" - compiler: clang env: BUILD_MODE="nist" - compiler: clang env: BUILD_MODE="lint" - compiler: clang env: BUILD_MODE="docs" - compiler: clang env: BUILD_MODE="coverage" - compiler: clang env: BUILD_MODE="fuzzers" - compiler: clang env: BUILD_MODE="valgrind" - compiler: clang env: BUILD_MODE="mini-shared" - compiler: clang env: BUILD_MODE="cross-win32" - compiler: clang env: BUILD_MODE="cross-ppc32" - compiler: clang env: BUILD_MODE="cross-ppc64" # Use clang coverage for Sonar - compiler: gcc env: BUILD_MODE="sonar" # No ARM Clang compiler on Linux - os: linux compiler: clang env: BUILD_MODE="cross-arm32" - os: linux compiler: clang env: BUILD_MODE="cross-arm64" install: - ./src/scripts/ci/setup_travis.sh script: - ./src/scripts/ci_build.py --os=$TRAVIS_OS_NAME --cc=$CC --cc-bin=$CXX --pkcs11-lib=/tmp/softhsm/lib/softhsm/libsofthsm2.so $BUILD_MODE # whitelist branches to avoid testing feature branches twice (as branch and as pull request) branches: only: - master - release-2 - coverity_scan notifications: email: botan-commits@lists.randombit.net git: depth: 5 cache: ccache: true directories: - $HOME/.sonar/cache addons: sonarcloud: organization: "randombit-github" token: secure: "JYwDxEZyCJ1aKLjAYB9YlyyIRkjeaY48iYqcMhmidx6/ploWXMbUzVpv5plLFbMGgeMy9sqa2I7Pbo7u3OdcBbbsogGtk/jomnjiauuNS6KcCHEEcVjBILfadxGJPL9F8/0KbcS2vnPpz/jVlRp18Uemud0yGGXXcDaY471sA50=" coverity_scan: project: name: "randombit/botan" notification_email: jack@randombit.net build_command_prepend: "./configure.py --no-optimizations --with-zlib --with-openssl" build_command: "make -j2" branch_pattern: coverity_scan botan-2.4.0/src/scripts/ci_build.py000077500000000000000000000442661322470703100172400ustar00rootroot00000000000000#!/usr/bin/env python """ CI build script (C) 2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import os import platform import subprocess import sys import time import tempfile import optparse # pylint: disable=deprecated-module def get_concurrency(): """ Get default concurrency level of build """ def_concurrency = 2 try: import multiprocessing return max(def_concurrency, multiprocessing.cpu_count()) except ImportError: return def_concurrency def determine_flags(target, target_os, target_cpu, target_cc, cc_bin, ccache, root_dir, pkcs11_lib): # pylint: disable=too-many-branches,too-many-statements,too-many-arguments,too-many-locals """ Return the configure.py flags as well as make/test running prefixes """ is_cross_target = target.startswith('cross-') if target_os not in ['linux', 'osx', 'windows']: print('Error unknown OS %s' % (target_os)) return (None, None, None) if is_cross_target: if target_os == 'osx': target_os = 'ios' elif target == 'cross-win32': target_os = 'mingw' make_prefix = [] test_prefix = [] test_cmd = [os.path.join(root_dir, 'botan-test')] fast_tests = ['block', 'aead', 'hash', 'stream', 'mac', 'modes', 'hmac_drbg', 'hmac_drbg_unit', 'tls', 'ffi', 'rsa_sign', 'rsa_verify', 'dh_kat', 'ecdsa_sign', 'curve25519_scalar', 'simd_32', 'os_utils', 'util', 'util_dates'] install_prefix = os.path.join(tempfile.gettempdir(), 'botan-install') flags = ['--prefix=%s' % (install_prefix), '--cc=%s' % (target_cc), '--os=%s' % (target_os)] if target_cpu != None: flags += ['--cpu=%s' % (target_cpu)] if target in ['shared', 'mini-shared']: flags += ['--disable-static'] if target in ['static', 'mini-static', 'fuzzers'] or target_os in ['ios', 'mingw']: flags += ['--disable-shared'] if target in ['mini-static', 'mini-shared']: flags += ['--minimized-build', '--enable-modules=system_rng,sha2_32,sha2_64,aes'] if target == 'shared' and target_os != 'osx': # Enabling amalgamation build for shared is somewhat arbitrary, but we want to test it # somewhere. In addition the majority of the Windows builds are shared, and MSVC is # much faster compiling via the amalgamation than individual files. flags += ['--amalgamation'] if target in ['bsi', 'nist']: # Arbitrarily test disable static on module policy builds flags += ['--module-policy=%s' % (target), '--disable-static'] if target == 'docs': flags += ['--with-doxygen', '--with-sphinx', '--with-rst2man'] test_cmd = None if target == 'coverage': flags += ['--with-coverage-info'] if target == 'valgrind': flags += ['--with-valgrind'] test_prefix = ['valgrind', '--error-exitcode=9', '-v', '--leak-check=full', '--show-reachable=yes'] test_cmd += fast_tests if target == 'fuzzers': flags += ['--unsafe-fuzzer-mode'] if target in ['fuzzers', 'coverage', 'valgrind']: flags += ['--with-debug-info'] if target in ['fuzzers', 'coverage']: flags += ['--build-fuzzers=test'] if target in ['fuzzers', 'sanitizer']: # On VC iterator debugging comes from generic debug mode if target_cc == 'msvc': flags += ['--with-debug-info'] else: flags += ['--with-sanitizers'] if target in ['valgrind', 'sanitizer', 'fuzzers']: flags += ['--disable-modules=locking_allocator'] if target == 'parallel': flags += ['--with-openmp'] if target == 'sonar': if target_os != 'linux' or target_cc != 'clang': raise Exception('Only Linux/clang supported in Sonar target currently') flags += ['--cc-abi-flags=-fprofile-instr-generate -fcoverage-mapping', '--disable-shared'] make_prefix = [os.path.join(root_dir, 'build-wrapper-linux-x86/build-wrapper-linux-x86-64'), '--out-dir', 'bw-outputs'] if is_cross_target: if target_os == 'ios': make_prefix = ['xcrun', '--sdk', 'iphoneos'] test_cmd = None if target == 'cross-arm32': flags += ['--cpu=armv7', '--cc-abi-flags=-arch armv7 -arch armv7s -stdlib=libc++'] elif target == 'cross-arm64': flags += ['--cpu=armv8-a', '--cc-abi-flags=-arch arm64 -stdlib=libc++'] else: raise Exception("Unknown cross target '%s' for iOS" % (target)) elif target == 'cross-win32': cc_bin = 'i686-w64-mingw32-g++' flags += ['--cpu=x86_32', '--cc-abi-flags=-static', '--ar-command=i686-w64-mingw32-ar'] test_cmd = [os.path.join(root_dir, 'botan-test.exe')] # No runtime prefix required for Wine else: # Build everything but restrict what is run test_cmd += fast_tests if target == 'cross-arm32': flags += ['--cpu=armv7'] cc_bin = 'arm-linux-gnueabihf-g++' test_prefix = ['qemu-arm', '-L', '/usr/arm-linux-gnueabihf/'] elif target == 'cross-arm64': flags += ['--cpu=armv8-a'] cc_bin = 'aarch64-linux-gnu-g++' test_prefix = ['qemu-aarch64', '-L', '/usr/aarch64-linux-gnu/'] elif target == 'cross-ppc32': flags += ['--cpu=ppc32'] cc_bin = 'powerpc-linux-gnu-g++' test_prefix = ['qemu-ppc', '-L', '/usr/powerpc-linux-gnu/'] elif target == 'cross-ppc64': flags += ['--cpu=ppc64', '--with-endian=little'] cc_bin = 'powerpc64le-linux-gnu-g++' test_prefix = ['qemu-ppc64le', '-L', '/usr/powerpc64le-linux-gnu/'] else: raise Exception("Unknown cross target '%s' for Linux" % (target)) else: # Flags specific to native targets if target_os in ['osx', 'linux']: flags += ['--with-bzip2', '--with-sqlite', '--with-zlib'] if target_os == 'osx': # Test Boost on OS X flags += ['--with-boost'] elif target_os == 'linux': flags += ['--with-lzma'] if target_os == 'linux': if target not in ['sanitizer', 'valgrind', 'mini-shared', 'mini-static']: # Avoid OpenSSL when using dynamic checkers, or on OS X where it sporadically # is not installed on the CI image flags += ['--with-openssl'] if target in ['sonar', 'coverage']: flags += ['--with-tpm'] test_cmd += ['--run-long-tests', '--run-online-tests'] if pkcs11_lib and os.access(pkcs11_lib, os.R_OK): test_cmd += ['--pkcs11-lib=%s' % (pkcs11_lib)] if ccache is None: flags += ['--cc-bin=%s' % (cc_bin)] elif ccache == 'clcache': flags += ['--cc-bin=%s' % (ccache)] else: flags += ['--cc-bin=%s %s' % (ccache, cc_bin)] if test_cmd is None: run_test_command = None else: run_test_command = test_prefix + test_cmd return flags, run_test_command, make_prefix def run_cmd(cmd, root_dir): """ Execute a command, die if it failed """ print("Running '%s' ..." % (' '.join(cmd))) sys.stdout.flush() start = time.time() cmd = [os.path.expandvars(elem) for elem in cmd] sub_env = os.environ.copy() sub_env['LD_LIBRARY_PATH'] = root_dir redirect_stdout = None if len(cmd) > 3 and cmd[-2] == '>': redirect_stdout = open(cmd[-1], 'w') cmd = cmd[:-2] proc = subprocess.Popen(cmd, close_fds=True, env=sub_env, stdout=redirect_stdout) proc.communicate() time_taken = int(time.time() - start) if time_taken > 10: print("Ran for %d seconds" % (time_taken)) if proc.returncode != 0: print("Command failed with error code %d" % (proc.returncode)) sys.exit(proc.returncode) def parse_args(args): """ Parse arguments """ parser = optparse.OptionParser() parser.add_option('--os', default=platform.system().lower(), help='Set the target os (default %default)') parser.add_option('--cc', default='gcc', help='Set the target compiler type (default %default)') parser.add_option('--cc-bin', default=None, help='Set path to compiler') parser.add_option('--root-dir', metavar='D', default='.', help='Set directory to execute from (default %default)') parser.add_option('--make-tool', metavar='TOOL', default='make', help='Specify tool to run to build source (default %default)') parser.add_option('--cpu', default=None, help='Specify a target CPU platform') parser.add_option('--with-debug', action='store_true', default=False, help='Include debug information') parser.add_option('--amalgamation', action='store_true', default=False, help='Build via amalgamation') parser.add_option('--disable-shared', action='store_true', default=False, help='Disable building shared libraries') parser.add_option('--branch', metavar='B', default=None, help='Specify branch being built') parser.add_option('--add-travis-folds', action='store_true', default=False, help='Add fold markers for Travis UI') parser.add_option('--dry-run', action='store_true', default=False, help='Just show commands to be executed') parser.add_option('--build-jobs', metavar='J', default=get_concurrency(), help='Set number of jobs to run in parallel (default %default)') parser.add_option('--compiler-cache', default=None, help='Set a compiler cache to use (ccache, clcache)') parser.add_option('--pkcs11-lib', default=None, help='Set PKCS11 lib to use for testing') parser.add_option('--with-python3', dest='use_python3', action='store_true', default=None, help='Enable using python3') parser.add_option('--without-python3', dest='use_python3', action='store_false', help='Disable using python3') return parser.parse_args(args) def have_prog(prog): """ Check if some named program exists in the path """ for path in os.environ['PATH'].split(os.pathsep): exe_file = os.path.join(path, prog) if os.path.exists(exe_file) and os.access(exe_file, os.X_OK): return True return False def main(args=None): # pylint: disable=too-many-branches,too-many-statements,too-many-locals,too-many-return-statements """ Parse options, do the things """ if os.getenv('COVERITY_SCAN_BRANCH') == '1': print('Skipping build COVERITY_SCAN_BRANCH set in environment') return 0 (options, args) = parse_args(args or sys.argv) if len(args) != 2: print('Usage: %s [options] target' % (args[0])) return 1 target = args[1] py_interp = 'python' use_python2 = have_prog('python2') if options.use_python3 is None: use_python3 = have_prog('python3') else: use_python3 = options.use_python3 if use_python3: py_interp = 'python3' if options.cc_bin is None: if options.cc == 'gcc': options.cc_bin = 'g++' elif options.cc == 'clang': options.cc_bin = 'clang++' elif options.cc == 'msvc': options.cc_bin = 'cl' else: print('Error unknown compiler %s' % (options.cc)) return 1 if options.compiler_cache is None and options.cc != 'msvc': # Autodetect ccache, unless using clang profiling - ccache seems to misbehave there if have_prog('ccache') and target not in ['sonar']: options.compiler_cache = 'ccache' if options.compiler_cache == 'clcache' and target in ['sanitizer']: # clcache doesn't support /Zi so using it just adds overhead with # no benefit options.compiler_cache = None if target == 'sonar' and os.getenv('SONAR_TOKEN') is None: print('Skipping Sonar scan due to missing SONAR_TOKEN env variable') return 0 root_dir = options.root_dir if os.access(root_dir, os.R_OK) != True: raise Exception('Bad root dir setting, dir %s not readable' % (root_dir)) cmds = [] if target == 'lint': if not use_python2 and not use_python3: raise Exception('No python interpreters found cannot lint') pylint_rc = '--rcfile=%s' % (os.path.join(root_dir, 'src/configs/pylint.rc')) pylint_flags = [pylint_rc, '--reports=no', '--score=no'] # Some disabled rules specific to Python2 # superfluous-parens: needed for Python3 compatible print statements # too-many-locals: variable counting differs from pylint3 py2_flags = '--disable=superfluous-parens,too-many-locals' py_scripts = [ 'configure.py', 'src/python/botan2.py', 'src/scripts/ci_build.py', 'src/scripts/install.py', 'src/scripts/dist.py', 'src/scripts/cleanup.py', 'src/scripts/build_docs.py', 'src/scripts/website.py', 'src/scripts/bench.py', 'src/scripts/python_unittests.py', 'src/scripts/python_unittests_unix.py'] for target in py_scripts: target_path = os.path.join(root_dir, target) if use_python2: cmds.append(['python2', '-m', 'pylint'] + pylint_flags + [py2_flags, target_path]) if use_python3: cmds.append(['python3', '-m', 'pylint'] + pylint_flags + [target_path]) else: config_flags, run_test_command, make_prefix = determine_flags( target, options.os, options.cpu, options.cc, options.cc_bin, options.compiler_cache, root_dir, options.pkcs11_lib) cmds.append([py_interp, os.path.join(root_dir, 'configure.py')] + config_flags) make_cmd = [options.make_tool] if root_dir != '.': make_cmd += ['-C', root_dir] if options.build_jobs > 1: make_cmd += ['-j%d' % (options.build_jobs)] make_cmd += ['-k'] if target == 'docs': cmds.append(make_cmd + ['docs']) else: if options.compiler_cache == 'ccache': cmds.append(['ccache', '--show-stats']) elif options.compiler_cache == 'clcache': cmds.append(['clcache', '-s']) make_targets = ['libs', 'cli', 'tests'] if target in ['coverage', 'fuzzers']: make_targets += ['fuzzers', 'fuzzer_corpus_zip'] cmds.append(make_prefix + make_cmd + make_targets) if options.compiler_cache == 'ccache': cmds.append(['ccache', '--show-stats']) elif options.compiler_cache == 'clcache': cmds.append(['clcache', '-s']) if run_test_command != None: cmds.append(run_test_command) if target in ['coverage', 'fuzzers']: cmds.append([py_interp, os.path.join(root_dir, 'src/scripts/test_fuzzers.py'), os.path.join(root_dir, 'fuzzer_corpus'), os.path.join(root_dir, 'build/fuzzer')]) if target in ['static', 'shared'] and options.os != 'windows': botan_exe = os.path.join(root_dir, 'botan-cli.exe' if options.os == 'windows' else 'botan') cmds.append([py_interp, os.path.join(root_dir, 'src/scripts/cli_tests.py'), botan_exe]) botan_py = os.path.join(root_dir, 'src/python/botan2.py') if target in ['shared', 'coverage']: if use_python2: cmds.append(['python2', botan_py]) if use_python3: cmds.append(['python3', botan_py]) if target in ['shared', 'static', 'bsi', 'nist']: cmds.append(make_cmd + ['install']) if target in ['sonar']: cmds.append(['llvm-profdata', 'merge', '-sparse', 'default.profraw', '-o', 'botan.profdata']) cmds.append(['llvm-cov', 'show', './botan-test', '-instr-profile=botan.profdata', '>', 'build/cov_report.txt']) sonar_config = os.path.join(root_dir, os.path.join(root_dir, 'src/build-data/sonar-project.properties')) cmds.append(['sonar-scanner', '-Dproject.settings=%s' % (sonar_config), '-Dsonar.login=$SONAR_TOKEN']) if target in ['coverage']: if not have_prog('lcov'): print('Error: lcov not found in PATH (%s)' % (os.getenv('PATH'))) return 1 if not have_prog('gcov'): print('Error: gcov not found in PATH (%s)' % (os.getenv('PATH'))) return 1 cov_file = 'coverage.info' raw_cov_file = 'coverage.info.raw' cmds.append(['lcov', '--capture', '--directory', options.root_dir, '--output-file', raw_cov_file]) cmds.append(['lcov', '--remove', raw_cov_file, '/usr/*', '--output-file', cov_file]) cmds.append(['lcov', '--list', cov_file]) if have_prog('coverage'): cmds.append(['coverage', 'run', '--branch', '--rcfile', os.path.join(root_dir, 'src/configs/coverage.rc'), botan_py]) if have_prog('codecov'): # If codecov exists assume we are on Travis and report to codecov.io cmds.append(['codecov']) else: # Otherwise generate a local HTML report cmds.append(['genhtml', cov_file, '--output-directory', 'lcov-out']) cmds.append(make_cmd + ['clean']) cmds.append(make_cmd + ['distclean']) for cmd in cmds: if options.dry_run: print('$ ' + ' '.join(cmd)) else: run_cmd(cmd, root_dir) return 0 if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/cleanup.py000077500000000000000000000076721322470703100171150ustar00rootroot00000000000000#!/usr/bin/env python """ Implements the "make clean" target (C) 2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import os import sys import stat import re import optparse # pylint: disable=deprecated-module import logging import json import shutil import errno def remove_dir(d): try: if os.access(d, os.X_OK): logging.debug('Removing directory "%s"', d) shutil.rmtree(d) else: logging.debug('Directory %s was missing', d) except Exception as e: # pylint: disable=broad-except logging.error('Failed removing directory "%s": %s', d, e) def remove_file(f): try: logging.debug('Removing file "%s"', f) os.unlink(f) except OSError as e: if e.errno != errno.ENOENT: logging.error('Failed removing file "%s": %s', f, e) def remove_all_in_dir(d): if os.access(d, os.X_OK): logging.debug('Removing all files in directory "%s"', d) for f in os.listdir(d): full_path = os.path.join(d, f) mode = os.lstat(full_path).st_mode if stat.S_ISDIR(mode): remove_dir(full_path) else: remove_file(full_path) def parse_options(args): parser = optparse.OptionParser() parser.add_option('--build-dir', default='build', metavar='DIR', help='specify build dir to clean (default %default)') parser.add_option('--distclean', action='store_true', default=False, help='clean everything') parser.add_option('--verbose', action='store_true', default=False, help='noisy logging') (options, args) = parser.parse_args(args) if len(args) > 1: raise Exception("Unknown arguments") return options def main(args=None): if args is None: args = sys.argv options = parse_options(args) logging.basicConfig(stream=sys.stderr, format='%(levelname) 7s: %(message)s', level=logging.DEBUG if options.verbose else logging.INFO) build_dir = options.build_dir if os.access(build_dir, os.X_OK) != True: logging.debug('No build directory found') # No build dir: clean enough! return 0 build_config_path = os.path.join(build_dir, 'build_config.json') build_config_str = None try: build_config_file = open(build_config_path) build_config_str = build_config_file.read() build_config_file.close() except Exception: # pylint: disable=broad-except # Ugh have to do generic catch as different exception type thrown in Python2 logging.error("Unable to access build_config.json in build dir") return 1 build_config = json.loads(build_config_str) if options.distclean: build_dir = build_config['build_dir'] remove_file(build_config['makefile_path']) remove_dir(build_dir) else: for dir_type in ['libobj_dir', 'cliobj_dir', 'testobj_dir', 'doc_output_dir_manual', 'doc_output_dir_doxygen']: dir_path = build_config[dir_type] if dir_path: remove_all_in_dir(dir_path) remove_file(build_config['doc_stamp_file']) remove_file(build_config['cli_exe']) remove_file(build_config['test_exe']) lib_basename = build_config['lib_prefix'] + build_config['libname'] matches_libname = re.compile('^' + lib_basename + '.([a-z]+)((\\.[0-9\\.]+)|$)') known_suffix = ['a', 'so', 'dll', 'manifest', 'exp'] for f in os.listdir(build_config['out_dir']): match = matches_libname.match(f) if match and match.group(1) in known_suffix: remove_file(os.path.join(build_config['out_dir'], f)) if options.distclean: if 'generated_files' in build_config: for f in build_config['generated_files'].split(' '): remove_file(f) return 0 if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/cli_tests.py000077500000000000000000000121201322470703100174370ustar00rootroot00000000000000#!/usr/bin/env python import binascii from collections import OrderedDict import unittest import argparse import re import subprocess import sys import os.path import vecparser cli_binary = "" SUPPORTED_ALGORITHMS = [ 'AES-128/CFB', 'AES-192/CFB', 'AES-256/CFB', 'AES-128/GCM', 'AES-192/GCM', 'AES-256/GCM', 'AES-128/OCB', 'AES-128/XTS', 'AES-256/XTS' ] def append_ordered(base, additional_elements): for key in additional_elements: value = additional_elements[key] base[key] = value class TestSequence(unittest.TestCase): pass def create_test(data): def do_test_expected(self): iv = data['Nonce'] key = data['Key'] ad = data['AD'] if 'AD' in data else "" plaintext = data['In'].lower() ciphertext = data['Out'].lower() algorithm = data['Algorithm'] direction = data['Direction'] # CFB if algorithm == "AES-128/CFB": mode = "aes-128-cfb" elif algorithm == "AES-192/CFB": mode = "aes-192-cfb" elif algorithm == "AES-256/CFB": mode = "aes-256-cfb" # GCM elif algorithm == "AES-128/GCM": mode = "aes-128-gcm" elif algorithm == "AES-192/GCM": mode = "aes-192-gcm" elif algorithm == "AES-256/GCM": mode = "aes-256-gcm" # OCB elif algorithm == "AES-128/OCB": mode = "aes-128-ocb" # XTS elif algorithm == "AES-128/XTS": mode = "aes-128-xts" elif algorithm == "AES-256/XTS": mode = "aes-256-xts" else: raise Exception("Unknown algorithm: '" + algorithm + "'") cmd = [ cli_binary, "encryption", "--mode=%s" % mode, "--iv=%s" % iv, "--ad=%s" % ad, "--key=%s" % key] if direction == "decrypt": cmd += ['--decrypt'] # out_raw = subprocess.check_output(cmd) if direction == "decrypt": invalue = ciphertext else: invalue = plaintext #print(cmd) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) out_raw = p.communicate(input=binascii.unhexlify(invalue))[0] out = binascii.hexlify(out_raw).decode("UTF-8").lower() # Renamings if direction == "decrypt": expected = plaintext else: expected = ciphertext actual = out self.assertEqual(expected, actual) return do_test_expected def get_testdata(document): out = OrderedDict() for algorithm in document: if algorithm in SUPPORTED_ALGORITHMS: testcase_number = 0 for testcase in document[algorithm]: testcase_number += 1 for direction in ['encrypt', 'decrypt']: testname = "{} no {:0>3} ({})".format( algorithm.lower(), testcase_number, direction) testname = re.sub("[^-a-z0-9-]", "_", testname) testname = re.sub("_+", "_", testname) testname = testname.strip("_") out[testname] = {} for key in testcase: value = testcase[key] out[testname][key] = value out[testname]['Algorithm'] = algorithm out[testname]['Direction'] = direction return out if __name__ == '__main__': parser = argparse.ArgumentParser(description="") parser.add_argument('cli_binary', help='path to the botan cli binary') parser.add_argument('unittest_args', nargs="*") args = parser.parse_args() cli_binary = args.cli_binary vecfile_cfb = vecparser.VecDocument(os.path.join('src', 'tests', 'data', 'modes', 'cfb.vec')) vecfile_gcm = vecparser.VecDocument(os.path.join('src', 'tests', 'data', 'aead', 'gcm.vec')) vecfile_ocb = vecparser.VecDocument(os.path.join('src', 'tests', 'data', 'aead', 'ocb.vec')) vecfile_xts = vecparser.VecDocument(os.path.join('src', 'tests', 'data', 'modes', 'xts.vec')) #data = vecfile.get_data() #for algo in data: # print(algo) # i = 0 # for testcase in data[algo]: # i += 1 # print(str(i) + ":", testcase) testdata = OrderedDict() append_ordered(testdata, get_testdata(vecfile_cfb.get_data())) append_ordered(testdata, get_testdata(vecfile_gcm.get_data())) append_ordered(testdata, get_testdata(vecfile_ocb.get_data())) append_ordered(testdata, get_testdata(vecfile_xts.get_data())) #for testname in testdata: # print(testname) # for key in testdata[testname]: # print(" " + key + ": " + testdata[testname][key]) for testname in testdata: test_method = create_test(testdata[testname]) test_method.__name__ = 'test_%s' % testname setattr(TestSequence, test_method.__name__, test_method) # Hand over sys.argv[0] and unittest_args to the testing framework sys.argv[1:] = args.unittest_args unittest.main() botan-2.4.0/src/scripts/comba.py000077500000000000000000000056511322470703100165420ustar00rootroot00000000000000#!/usr/bin/python2 import sys import datetime # (C) 2011,2014,2015,2016 Jack Lloyd # Botan is released under the Simplified BSD License (see license.txt) # Used to generate src/lib/math/mp/mp_comba.cpp def comba_indexes(N): indexes = [] for i in xrange(0, 2*N): x = [] for j in xrange(max(0, i-N+1), min(N, i+1)): x += [(j,i-j)] indexes += [sorted(x)] return indexes def comba_sqr_indexes(N): indexes = [] for i in xrange(0, 2*N): x = [] for j in xrange(max(0, i-N+1), min(N, i+1)): if j < i-j: x += [(j,i-j)] else: x += [(i-j,j)] indexes += [sorted(x)] return indexes def comba_multiply_code(N): indexes = comba_indexes(N) w2 = 'w2' w1 = 'w1' w0 = 'w0' for (i,idx) in zip(range(0, len(indexes)), indexes): for pair in idx: print " word3_muladd(&%s, &%s, &%s, x[%2d], y[%2d]);" % (w2, w1, w0, pair[0], pair[1]) if i < 2*N-2: print " z[%2d] = %s; %s = 0;\n" % (i, w0, w0) else: print " z[%2d] = %s;" % (i, w0) (w0,w1,w2) = (w1,w2,w0) #print "z[%2d] = w0; w0 = w1; w1 = w2; w2 = 0;" % (i) def comba_square_code(N): indexes = comba_sqr_indexes(N) w2 = 'w2' w1 = 'w1' w0 = 'w0' for (rnd,idx) in zip(range(0, len(indexes)), indexes): for (i,pair) in zip(range(0, len(idx)), idx): if pair[0] == pair[1]: print " word3_muladd (&%s, &%s, &%s, x[%2d], x[%2d]);" % (w2, w1, w0, pair[0], pair[1]) elif i % 2 == 0: print " word3_muladd_2(&%s, &%s, &%s, x[%2d], x[%2d]);" % (w2, w1, w0, pair[0], pair[1]) if rnd < 2*N-2: print " z[%2d] = %s; %s = 0;\n" % (rnd, w0, w0) else: print " z[%2d] = %s;" % (rnd, w0) (w0,w1,w2) = (w1,w2,w0) def main(args = None): if args is None: args = sys.argv print """/* * Comba Multiplication and Squaring * * This file was automatically generated by %s on %s * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { """ % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d")) for n in [4,6,8,9,16]: print "/*\n* Comba %dx%d Squaring\n*/" % (n, n) print "void bigint_comba_sqr%d(word z[%d], const word x[%d])" % (n, 2*n, n) print " {" print " word w2 = 0, w1 = 0, w0 = 0;\n" comba_square_code(n) print " }\n" print "/*\n* Comba %dx%d Multiplication\n*/" % (n, n) print "void bigint_comba_mul%d(word z[%d], const word x[%d], const word y[%d])" % (n, 2*n, n, n) print " {" print " word w2 = 0, w1 = 0, w0 = 0;\n" comba_multiply_code(n) print " }\n" print "}" if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/create_corpus_zip.py000077500000000000000000000023011322470703100211660ustar00rootroot00000000000000#!/usr/bin/python # These is used to create fuzzer corpus zip files # This is primarily used by OSS-Fuzz but might be useful if you were # deploying the binaries in a custom fuzzer deployment system. import sys import os import zipfile import stat def main(args=None): if args is None: args = sys.argv if len(args) != 2 and len(args) != 3: print("Usage: %s corpus_dir " % (args[0])) return 1 root_dir = args[1] if len(args) == 3: output_dir = args[2] else: output_dir = '' if not os.access(root_dir, os.R_OK): print("Error could not access directory '%s'" % (root_dir)) return 1 for corpus_dir in os.listdir(root_dir): if corpus_dir == '.git': continue subdir = os.path.join(root_dir, corpus_dir) if not stat.S_ISDIR(os.stat(subdir).st_mode): continue zipfile_path = os.path.join(output_dir, '%s.zip' % (corpus_dir)) zf = zipfile.ZipFile(zipfile_path, 'w', zipfile.ZIP_DEFLATED) for f in os.listdir(subdir): zf.write(os.path.join(subdir, f), f) zf.close() return 0 if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/dist.py000077500000000000000000000333531322470703100164240ustar00rootroot00000000000000#!/usr/bin/env python """ Release script for botan (https://botan.randombit.net/) This script requires Python 2.7 or 3.6 (C) 2011,2012,2013,2015,2016,2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import datetime import errno import hashlib import io import logging import optparse # pylint: disable=deprecated-module import os import re import shutil import subprocess import sys import tarfile import time import traceback # This is horrible, but there is no way to override tarfile's use of time.time # in setting the gzip header timestamp, which breaks deterministic archives GZIP_HEADER_TIME = 0 def fake_time(): return GZIP_HEADER_TIME time.time = fake_time def check_subprocess_results(subproc, name): (raw_stdout, raw_stderr) = subproc.communicate() stderr = raw_stderr.decode('utf-8') if subproc.returncode != 0: stdout = raw_stdout.decode('utf-8') if stdout != '': logging.error(stdout) if stderr != '': logging.error(stderr) raise Exception('Running %s failed' % (name)) else: if stderr != '': logging.warning(stderr) return raw_stdout def run_git(args): cmd = ['git'] + args logging.debug('Running %s' % (' '.join(cmd))) proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return check_subprocess_results(proc, 'git') def maybe_gpg(val): val = val.decode('ascii') if 'BEGIN PGP SIGNATURE' in val: return val.split('\n')[-2] else: return val.strip() def rel_time_to_epoch(year, month, day, hour, minute, second): dt = datetime.datetime(year, month, day, hour, minute, second) return (dt - datetime.datetime(1970, 1, 1)).total_seconds() def datestamp(tag): ts = maybe_gpg(run_git(['show', '--no-patch', '--format=%ai', tag])) ts_matcher = re.compile(r'^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}) .*') logging.debug('Git returned timestamp of %s for tag %s' % (ts, tag)) match = ts_matcher.match(ts) if match is None: logging.error('Failed parsing timestamp "%s" of tag %s' % (ts, tag)) return 0 rel_date = int(match.group(1) + match.group(2) + match.group(3)) rel_epoch = rel_time_to_epoch(*[int(match.group(i)) for i in range(1, 7)]) return rel_date, rel_epoch def revision_of(tag): return maybe_gpg(run_git(['show', '--no-patch', '--format=%H', tag])) def extract_revision(revision, to): tar_val = run_git(['archive', '--format=tar', '--prefix=%s/' % (to), revision]) tar_f = tarfile.open(fileobj=io.BytesIO(tar_val)) tar_f.extractall() def gpg_sign(keyid, passphrase_file, files, detached=True): options = ['--armor', '--detach-sign'] if detached else ['--clearsign'] gpg_cmd = ['gpg', '--batch'] + options + ['--local-user', keyid] if passphrase_file != None: gpg_cmd[1:1] = ['--passphrase-file', passphrase_file] for filename in files: logging.info('Signing %s using PGP id %s' % (filename, keyid)) cmd = gpg_cmd + [filename] logging.debug('Running %s' % (' '.join(cmd))) gpg = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) check_subprocess_results(gpg, 'gpg') return [filename + '.asc' for filename in files] def parse_args(args): parser = optparse.OptionParser( "usage: %prog [options] \n" + " %prog [options] snapshot " ) parser.add_option('--verbose', action='store_true', default=False, help='Extra debug output') parser.add_option('--quiet', action='store_true', default=False, help='Only show errors') parser.add_option('--output-dir', metavar='DIR', default='.', help='Where to place output (default %default)') parser.add_option('--print-output-names', action='store_true', help='Print output archive filenames to stdout') parser.add_option('--archive-types', metavar='LIST', default='tgz', help='Set archive types to generate (default %default)') parser.add_option('--pgp-key-id', metavar='KEYID', default='EFBADFBC', help='PGP signing key (default %default, "none" to disable)') parser.add_option('--pgp-passphrase-file', metavar='FILE', default=None, help='PGP signing key passphrase file') parser.add_option('--write-hash-file', metavar='FILE', default=None, help='Write a file with checksums') return parser.parse_args(args) def remove_file_if_exists(fspath): try: os.unlink(fspath) except OSError as e: if e.errno != errno.ENOENT: raise def rewrite_version_file(version_file, target_version, snapshot_branch, rev_id, rel_date): if snapshot_branch: assert target_version == snapshot_branch version_file_name = os.path.basename(version_file) contents = open(version_file).readlines() version_re = re.compile('release_(major|minor|patch) = ([0-9]+)') def content_rewriter(): for line in contents: if not snapshot_branch: # Verify the version set in the source matches the tag match = version_re.match(line) if match: name_to_idx = { 'major': 0, 'minor': 1, 'patch': 2 } version_parts = target_version.split('.') assert len(version_parts) == 3 in_tag = int(version_parts[name_to_idx[match.group(1)]]) in_file = int(match.group(2)) if in_tag != in_file: raise Exception('Version number part "%s" in %s does not match tag %s' % (match.group(1), version_file_name, target_version)) if line == 'release_vc_rev = None\n': yield 'release_vc_rev = \'git:%s\'\n' % (rev_id) elif line == 'release_datestamp = 0\n': yield 'release_datestamp = %d\n' % (rel_date) elif line == "release_type = \'unreleased\'\n": if target_version == snapshot_branch: yield "release_type = 'snapshot:%s'\n" % (snapshot_branch) else: yield "release_type = 'release'\n" else: yield line open(version_file, 'w').write(''.join(list(content_rewriter()))) def write_archive(output_basename, archive_type, rel_epoch, all_files, hash_file): output_archive = output_basename + '.' + archive_type logging.info('Writing archive "%s"' % (output_archive)) remove_file_if_exists(output_archive) remove_file_if_exists(output_archive + '.asc') def write_mode(archive_type): if archive_type == 'tgz': return 'w:gz' elif archive_type == 'tbz': return 'w:bz2' elif archive_type == 'tar': return 'w' else: raise Exception("Unknown archive type '%s'" % (archive_type)) # gzip format embeds the original filename, tarfile.py does the wrong # thing unless the output name ends in .gz. So pass an explicit # fileobj in that case, and supply a name in the form tarfile expects. if archive_type == 'tgz': archive = tarfile.open(output_basename + '.tar.gz', write_mode(archive_type), fileobj=open(output_archive, 'wb')) else: archive = tarfile.open(output_basename + '.tar', write_mode(archive_type)) for f in all_files: tarinfo = archive.gettarinfo(f) tarinfo.uid = 500 tarinfo.gid = 500 tarinfo.uname = "botan" tarinfo.gname = "botan" tarinfo.mtime = rel_epoch archive.addfile(tarinfo, open(f, 'rb')) archive.close() sha256 = hashlib.new('sha256') sha256.update(open(output_archive, 'rb').read()) archive_hash = sha256.hexdigest().upper() logging.info('SHA-256(%s) = %s' % (output_archive, archive_hash)) if hash_file != None: hash_file.write("%s %s\n" % (archive_hash, output_archive)) return output_archive def configure_logging(options): class ExitOnErrorLogHandler(logging.StreamHandler, object): def emit(self, record): super(ExitOnErrorLogHandler, self).emit(record) # Exit script if and ERROR or worse occurred if record.levelno >= logging.ERROR: if sys.exc_info()[2] != None: logging.info(traceback.format_exc()) sys.exit(1) def log_level(): if options.verbose: return logging.DEBUG if options.quiet: return logging.ERROR return logging.INFO lh = ExitOnErrorLogHandler(sys.stderr) lh.setFormatter(logging.Formatter('%(levelname) 7s: %(message)s')) logging.getLogger().addHandler(lh) logging.getLogger().setLevel(log_level()) def main(args=None): # pylint: disable=too-many-branches,too-many-locals if args is None: args = sys.argv[1:] (options, args) = parse_args(args) configure_logging(options) if len(args) != 1 and len(args) != 2: logging.error('Usage: %s [options] ' % (sys.argv[0])) snapshot_branch = None target_version = None archives = options.archive_types.split(',') if options.archive_types != '' else [] for archive_type in archives: if archive_type not in ['tar', 'tgz', 'tbz']: logging.error('Unknown archive type "%s"' % (archive_type)) if args[0] == 'snapshot': if len(args) != 2: logging.error('Missing branch name for snapshot command') snapshot_branch = args[1] else: if len(args) != 1: logging.error('Usage error, try --help') target_version = args[0] if snapshot_branch: logging.info('Creating snapshot release from branch %s', snapshot_branch) target_version = snapshot_branch elif len(args) == 1: try: logging.info('Creating release for version %s' % (target_version)) (major, minor, patch) = map(int, target_version.split('.')) assert target_version == '%d.%d.%d' % (major, minor, patch) target_version = target_version except ValueError as e: logging.error('Invalid version number %s' % (target_version)) rev_id = revision_of(target_version) if rev_id == '': logging.error('No tag matching %s found' % (target_version)) rel_date, rel_epoch = datestamp(target_version) if rel_date == 0 or rel_epoch == 0: logging.error('No date found for version, git error?') logging.info('Found %s at revision id %s released %d' % (target_version, rev_id, rel_date)) global GZIP_HEADER_TIME # pylint: disable=global-statement GZIP_HEADER_TIME = rel_epoch def output_name(): if snapshot_branch: if snapshot_branch == 'master': return 'Botan-snapshot-%s' % (rel_date) else: return 'Botan-snapshot-%s-%s' % (snapshot_branch, rel_date) else: return 'Botan-' + target_version output_basename = output_name() logging.debug('Output basename %s' % (output_basename)) if os.access(output_basename, os.X_OK): logging.info('Removing existing output dir %s' % (output_basename)) shutil.rmtree(output_basename) extract_revision(rev_id, output_basename) all_files = [] for (curdir, _, files) in os.walk(output_basename): all_files += [os.path.join(curdir, f) for f in files] all_files.sort(key=lambda f: (os.path.dirname(f), os.path.basename(f))) version_file = None for possible_version_file in ['version.txt', 'botan_version.py']: full_path = os.path.join(output_basename, possible_version_file) if os.access(full_path, os.R_OK): version_file = full_path break if not os.access(version_file, os.R_OK): logging.error('Cannot read %s' % (version_file)) rewrite_version_file(version_file, target_version, snapshot_branch, rev_id, rel_date) try: os.makedirs(options.output_dir) except OSError as e: if e.errno != errno.EEXIST: logging.error('Creating dir %s failed %s' % (options.output_dir, e)) output_files = [] hash_file = None if options.write_hash_file != None: hash_file = open(options.write_hash_file, 'w') for archive_type in archives: output_files.append(write_archive(output_basename, archive_type, rel_epoch, all_files, hash_file)) if hash_file != None: hash_file.close() shutil.rmtree(output_basename) if options.pgp_key_id != 'none': if options.write_hash_file != None: output_files += gpg_sign(options.pgp_key_id, options.pgp_passphrase_file, [options.write_hash_file], False) else: output_files += gpg_sign(options.pgp_key_id, options.pgp_passphrase_file, output_files, True) if options.output_dir != '.': for output_file in output_files: logging.debug('Moving %s to %s' % (output_file, options.output_dir)) shutil.move(output_file, os.path.join(options.output_dir, output_file)) if options.print_output_names: for output_file in output_files: print(output_file) return 0 if __name__ == '__main__': try: sys.exit(main()) except Exception as e: # pylint: disable=broad-except logging.info(traceback.format_exc()) logging.error(e) sys.exit(1) botan-2.4.0/src/scripts/fuzzer.xml000066400000000000000000000016271322470703100171520ustar00rootroot00000000000000 $botan_cli $tls_port $workflow_dir TLS_CONSTANT,LENGTH,COUNT,PUBLIC_KEY,PADDING,SIGNATURE,PLAIN_PROTOCOL_MESSAGE /tmp/ simple_fuzzer -connect localhost:$PORT tls_server $rsa_cert $rsa_key --port=$PORT --policy=$fuzz_policy --dump-traces=/tmp/tls/ --output=/tmp/botan_output.log --error-output=/tmp/botan_error_output.log botan-rsa botan-2.4.0/src/scripts/install.py000077500000000000000000000245451322470703100171320ustar00rootroot00000000000000#!/usr/bin/env python """ Botan install script (C) 2014,2015,2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import errno import json import logging import optparse # pylint: disable=deprecated-module import os import shutil import sys import subprocess def parse_command_line(args): parser = optparse.OptionParser() parser.add_option('--verbose', action='store_true', default=False, help='Show debug messages') parser.add_option('--quiet', action='store_true', default=False, help='Show only warnings and errors') build_group = optparse.OptionGroup(parser, 'Source options') build_group.add_option('--build-dir', metavar='DIR', default='build', help='Location of build output (default \'%default\')') parser.add_option_group(build_group) install_group = optparse.OptionGroup(parser, 'Installation options') install_group.add_option('--prefix', default='/usr/local', help='Set output directory (default %default)') install_group.add_option('--bindir', default='bin', metavar='DIR', help='Set binary subdir (default %default)') install_group.add_option('--libdir', default='lib', metavar='DIR', help='Set library subdir (default %default)') install_group.add_option('--includedir', default='include', metavar='DIR', help='Set include subdir (default %default)') install_group.add_option('--docdir', default='share/doc', metavar='DIR', help='Set documentation subdir (default %default)') install_group.add_option('--pkgconfigdir', default='pkgconfig', metavar='DIR', help='Set pkgconfig subdir (default %default)') install_group.add_option('--umask', metavar='MASK', default='022', help='Umask to set (default %default)') parser.add_option_group(install_group) (options, args) = parser.parse_args(args) def log_level(): if options.verbose: return logging.DEBUG if options.quiet: return logging.WARNING return logging.INFO logging.getLogger().setLevel(log_level()) return (options, args) class PrependDestdirError(Exception): pass def is_subdir(path, subpath): return os.path.relpath(path, start=subpath).startswith("..") def prepend_destdir(path): """ Needed because os.path.join() discards the first path if the second one is absolute, which is usually the case here. Still, we want relative paths to work and leverage the os awareness of os.path.join(). """ destdir = os.environ.get('DESTDIR', "") if destdir: # DESTDIR is non-empty, but we only join absolute paths on UNIX-like file systems if os.path.sep != "/": raise PrependDestdirError("Only UNIX-like file systems using forward slash " \ "separator supported when DESTDIR is set.") if not os.path.isabs(path): raise PrependDestdirError("--prefix must be an absolute path when DESTDIR is set.") path = os.path.normpath(path) # Remove / or \ prefixes if existent to accomodate for os.path.join() path = path.lstrip(os.path.sep) path = os.path.join(destdir, path) if not is_subdir(destdir, path): raise PrependDestdirError("path escapes DESTDIR (path='%s', destdir='%s')" % (path, destdir)) return path def makedirs(dirname, exist_ok=True): try: logging.debug('Creating directory %s' % (dirname)) os.makedirs(dirname) except OSError as e: if e.errno != errno.EEXIST or not exist_ok: raise e # Clear link and create new one def force_symlink(target, linkname): try: os.unlink(linkname) except OSError as e: if e.errno != errno.ENOENT: raise e os.symlink(target, linkname) def calculate_exec_mode(options): out = 0o777 if 'umask' in os.__dict__: umask = int(options.umask, 8) logging.debug('Setting umask to %s' % oct(umask)) os.umask(int(options.umask, 8)) out &= (umask ^ 0o777) return out def main(args): # pylint: disable=too-many-locals,too-many-branches,too-many-statements logging.basicConfig(stream=sys.stdout, format='%(levelname) 7s: %(message)s') (options, args) = parse_command_line(args) exe_mode = calculate_exec_mode(options) def copy_file(src, dst): logging.debug('Copying %s to %s' % (src, dst)) shutil.copyfile(src, dst) def copy_executable(src, dst): copy_file(src, dst) logging.debug('Make %s executable' % dst) os.chmod(dst, exe_mode) with open(os.path.join(options.build_dir, 'build_config.json')) as f: cfg = json.load(f) ver_major = int(cfg['version_major']) ver_minor = int(cfg['version_minor']) ver_patch = int(cfg['version_patch']) target_os = cfg['os'] build_shared_lib = bool(cfg['build_shared_lib']) build_static_lib = bool(cfg['build_static_lib']) out_dir = cfg['out_dir'] bin_dir = os.path.join(options.prefix, options.bindir) lib_dir = os.path.join(options.prefix, options.libdir) target_include_dir = os.path.join(options.prefix, options.includedir, 'botan-%d' % (ver_major), 'botan') for d in [options.prefix, lib_dir, bin_dir, target_include_dir]: makedirs(prepend_destdir(d)) build_include_dir = os.path.join(options.build_dir, 'include', 'botan') for include in sorted(os.listdir(build_include_dir)): if include == 'internal': continue copy_file(os.path.join(build_include_dir, include), prepend_destdir(os.path.join(target_include_dir, include))) build_external_include_dir = os.path.join(options.build_dir, 'include', 'external') for include in sorted(os.listdir(build_external_include_dir)): copy_file(os.path.join(build_external_include_dir, include), prepend_destdir(os.path.join(target_include_dir, include))) if build_static_lib or target_os == 'windows': static_lib = cfg['static_lib_name'] copy_file(os.path.join(out_dir, static_lib), prepend_destdir(os.path.join(lib_dir, os.path.basename(static_lib)))) if build_shared_lib: if target_os == "windows": libname = cfg['libname'] soname_base = libname + '.dll' copy_executable(os.path.join(out_dir, soname_base), prepend_destdir(os.path.join(lib_dir, soname_base))) else: soname_patch = cfg['soname_patch'] soname_abi = cfg['soname_abi'] soname_base = cfg['soname_base'] copy_executable(os.path.join(out_dir, soname_patch), prepend_destdir(os.path.join(lib_dir, soname_patch))) if target_os != "openbsd": prev_cwd = os.getcwd() try: os.chdir(prepend_destdir(lib_dir)) force_symlink(soname_patch, soname_abi) force_symlink(soname_patch, soname_base) finally: os.chdir(prev_cwd) copy_executable(cfg['cli_exe'], prepend_destdir(os.path.join(bin_dir, cfg['cli_exe_name']))) # On Darwin, if we are using shared libraries and we install, we should fix # up the library name, otherwise the botan command won't work; ironically # we only need to do this because we previously changed it from a setting # that would be correct for installation to one that lets us run it from # the build directory if target_os == 'darwin' and build_shared_lib: soname_abi = cfg['soname_abi'] subprocess.check_call(['install_name_tool', '-change', os.path.join('@executable_path', soname_abi), os.path.join(lib_dir, soname_abi), os.path.join(bin_dir, cfg['cli_exe_name'])]) if 'botan_pkgconfig' in cfg: pkgconfig_dir = os.path.join(options.prefix, options.libdir, options.pkgconfigdir) makedirs(prepend_destdir(pkgconfig_dir)) copy_file(cfg['botan_pkgconfig'], prepend_destdir(os.path.join(pkgconfig_dir, os.path.basename(cfg['botan_pkgconfig'])))) if 'ffi' in cfg['mod_list']: for ver in cfg['python_version'].split(','): py_lib_path = os.path.join(lib_dir, 'python%s' % (ver), 'site-packages') logging.debug('Installing python module to %s' % (py_lib_path)) makedirs(prepend_destdir(py_lib_path)) py_dir = cfg['python_dir'] for py in os.listdir(py_dir): copy_file(os.path.join(py_dir, py), prepend_destdir(os.path.join(py_lib_path, py))) if cfg['with_documentation']: target_doc_dir = os.path.join(options.prefix, options.docdir, 'botan-%d.%d.%d' % (ver_major, ver_minor, ver_patch)) shutil.rmtree(prepend_destdir(target_doc_dir), True) shutil.copytree(cfg['doc_output_dir'], prepend_destdir(target_doc_dir)) copy_file(os.path.join(cfg['base_dir'], 'license.txt'), prepend_destdir(os.path.join(target_doc_dir, 'license.txt'))) copy_file(os.path.join(cfg['base_dir'], 'news.rst'), prepend_destdir(os.path.join(target_doc_dir, 'news.txt'))) for f in [f for f in os.listdir(cfg['doc_dir']) if f.endswith('.txt')]: copy_file(os.path.join(cfg['doc_dir'], f), prepend_destdir(os.path.join(target_doc_dir, f))) if cfg['with_rst2man']: man1_dir = prepend_destdir(os.path.join(options.prefix, os.path.join(cfg['mandir'], 'man1'))) makedirs(man1_dir) copy_file(os.path.join(cfg['build_dir'], 'botan.1'), os.path.join(man1_dir, 'botan.1')) logging.info('Botan %s installation complete', cfg['version']) return 0 if __name__ == '__main__': try: sys.exit(main(sys.argv)) except Exception as e: # pylint: disable=broad-except logging.error('Failure: %s' % (e)) import traceback logging.info(traceback.format_exc()) sys.exit(1) botan-2.4.0/src/scripts/oids.py000077500000000000000000000173631322470703100164220ustar00rootroot00000000000000#!/usr/bin/python2 """ (C) 2016 Jack Lloyd (C) 2017 Fabian Weissberg, Rohde & Schwarz Cybersecurity Botan is released under the Simplified BSD License (see license.txt) """ import sys import datetime import re from collections import defaultdict def format_map(m, for_oid = False): s = '' for k in sorted(m.keys()): v = m[k] if len(s) > 0: s += ' ' if for_oid: s += '{ "%s", OID("%s") },\n' % (k,v) else: s += '{ "%s", "%s" },\n' % (k,v) s = s[:-2] # chomp last two chars return s def format_as_map(oid2str, str2oid): return """/* * OID maps * * This file was automatically generated by %s on %s * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include namespace Botan { std::unordered_map OIDS::load_oid2str_map() { return std::unordered_map{ %s }; } std::unordered_map OIDS::load_str2oid_map() { return std::unordered_map{ %s }; } } """ % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"), format_map(oid2str), format_map(str2oid, True)) def format_if(m, nm,t=False): s = '' for k in sorted(m.keys()): v = m[k] if t: s += ' if(%s == "%s") return OID("%s");\n' % (nm,k, v) else: s += ' if(%s == "%s") return "%s";\n' % (nm,k, v) s = s[:-1] return s def format_as_ifs(oid2str, str2oid): return """/* * OID maps * * This file was automatically generated by %s on %s * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include namespace Botan { namespace OIDS { std::string lookup(const OID& oid) { const std::string oid_str = oid.as_string(); %s #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) if(oid_str == BOTAN_HOUSE_ECC_CURVE_OID) return BOTAN_HOUSE_ECC_CURVE_NAME; #endif return std::string(); } OID lookup(const std::string& name) { %s #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) if(name == BOTAN_HOUSE_ECC_CURVE_NAME) return OID(BOTAN_HOUSE_ECC_CURVE_OID); #endif return OID(); } } } """ % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"), format_if(oid2str,"oid_str"), format_if(str2oid, "name", True)) def format_dn_ub_map(dn_ub, oid2str): s = '' for k in sorted(dn_ub.keys()): v = dn_ub[k] s += ' { Botan::OID("%s"), %s }, // %s\n' % (k,v,oid2str[k]) # delete last ',' and \n idx = s.rfind(',') if idx != -1: s = s[:idx] + s[idx+1:-1] return s def format_dn_ub_as_map(dn_ub, oid2str): return """/* * DN_UB maps: Upper bounds on the length of DN strings * * This file was automatically generated by %s on %s * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include namespace { /** * Upper bounds for the length of distinguished name fields as given in RFC 5280, Appendix A. * Only OIDS recognized by botan are considered, so far. * Maps OID string representations instead of human readable strings in order * to avoid an additional lookup. */ static const std::map DN_UB = { %s }; } namespace Botan { //static size_t X509_DN::lookup_ub(const OID& oid) { auto ub_entry = DN_UB.find(oid); if(ub_entry != DN_UB.end()) { return ub_entry->second; } else { return 0; } } } """ % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"), format_dn_ub_map(dn_ub,oid2str)) def format_set_map(m): s = '' for k in sorted(m.keys()): v = m[k] if len(s) > 0: s += ' ' s += '{ "%s", {' % k for pad in v: s += '"%s", ' % pad if len(v) is not 0: s = s[:-2] s += '} },\n' s = s[:-1] return s def format_pads_as_map(sig_dict): return """/* * Sets of allowed padding schemes for public key types * * This file was automatically generated by %s on %s * * All manual edits to this file will be lost. Edit the script * then regenerate this source file. * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #include #include #include namespace Botan { const std::map> allowed_signature_paddings = { %s }; __attribute__((visibility("default"))) const std::vector get_sig_paddings(const std::string algo) { if(allowed_signature_paddings.count(algo) > 0) return allowed_signature_paddings.at(algo); return {}; } bool sig_algo_and_pad_ok(const std::string algo, std::string padding) { std::vector pads = get_sig_paddings(algo); return std::find(pads.begin(), pads.end(), padding) != pads.end(); } } """ % (sys.argv[0], datetime.date.today().strftime("%Y-%m-%d"), format_set_map(sig_dict)) def main(args = None): """ Print header files (oids.cpp, dn_ub.cpp) depending on the first argument and on srs/build-data/oids.txt Choose 'oids' to print oids.cpp, needs to be written to src/lib/asn1/oids.cpp Choose 'dn_ub' to print dn_ub.cpp, needs to be written to src/lib/x509/X509_dn_ub.cpp Choose 'pads' to print padding.cpp, needs to be written to src/lib/pk_pad/padding.cpp """ if args is None: args = sys.argv if len(args) < 2: raise Exception("Use either 'oids', 'dn_ub', 'pads' as first argument") oid_lines = open('./src/build-data/oids.txt').readlines() oid_re = re.compile("^([1-9][0-9.]+) = ([A-Za-z0-9_\./\(\), -]+)(?: = )?([0-9]+)?$") hdr_re = re.compile("^\[([a-z0-9_]+)\]$") pad_re = re.compile("^([A-Za-z0-9_\., -]+)/([A-Za-z0-9_-]+)[A-Za-z0-9_\.\(\), -]*$") oid2str = {} str2oid = {} dn_ub = {} sig2pads = defaultdict(set) enc2pads = defaultdict(set) cur_hdr = None for line in oid_lines: line = line.strip() if len(line) == 0: continue if line[0] == '#': continue match = hdr_re.match(line) if match is not None: cur_hdr = match.group(1) continue match = oid_re.match(line) if match is None: raise Exception(line) oid = match.group(1) nam = match.group(2) if oid in str2oid: print "Duplicated OID", oid, name, oid2str[oid] sys.exit() # hard error else: oid2str[oid] = nam # parse upper bounds for DNs if cur_hdr == "dn": if match.lastindex < 3: raise Exception("Could not find an upper bound for DN " + match.group(1)) dn_ub[oid] = match.group(3) # parse signature paddings elif cur_hdr == "signature": pad_match = pad_re.search(nam) if pad_match is not None: sig2pads[pad_match.group(1)].add(pad_match.group(2)) if nam in str2oid: #print "Duplicated name", nam, oid, str2oid[nam] #str2oid[nam] = oid pass else: str2oid[nam] = oid if args[1] == "oids": print format_as_ifs(oid2str, str2oid) elif args[1] == "dn_ub": print format_dn_ub_as_map(dn_ub,oid2str) elif args[1] == "pads": print format_pads_as_map(sig2pads) if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/python_unittests.py000077500000000000000000000207221322470703100211200ustar00rootroot00000000000000#!/usr/bin/env python3 """ Unittests for Botan Python scripts. Requires Python 3. (C) 2017 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) """ import sys import unittest sys.path.append("../..") # Botan repo root from configure import AmalgamationHelper # pylint: disable=wrong-import-position from configure import ModulesChooser # pylint: disable=wrong-import-position class AmalgamationHelperTests(unittest.TestCase): def test_matcher_std_includes(self): self.assertEqual(AmalgamationHelper.is_unconditional_std_include("#include "), "string") self.assertEqual(AmalgamationHelper.is_unconditional_std_include("#include // comment"), "string") self.assertEqual(AmalgamationHelper.is_unconditional_std_include("#include "), None) self.assertEqual(AmalgamationHelper.is_unconditional_std_include("#include "), None) self.assertEqual(AmalgamationHelper.is_unconditional_std_include(" #include "), None) def test_matcher_botan_include(self): self.assertEqual(AmalgamationHelper.is_botan_include("#include "), "oids.h") self.assertEqual(AmalgamationHelper.is_botan_include("#include "), "internal/socket.h") self.assertEqual(AmalgamationHelper.is_botan_include("#include // comment"), "oids.h") self.assertEqual(AmalgamationHelper.is_botan_include("#include // comment"), "internal/socket.h") self.assertEqual(AmalgamationHelper.is_botan_include(" #include "), "oids.h") self.assertEqual(AmalgamationHelper.is_botan_include(" #include "), "internal/socket.h") self.assertEqual(AmalgamationHelper.is_botan_include("#include "), None) self.assertEqual(AmalgamationHelper.is_botan_include("#include "), None) self.assertEqual(AmalgamationHelper.is_botan_include("#include "), None) def test_matcher_any_includes(self): self.assertEqual(AmalgamationHelper.is_any_include("#include "), "string") self.assertEqual(AmalgamationHelper.is_any_include("#include "), "myfile.h") self.assertEqual(AmalgamationHelper.is_any_include("#include "), "unistd.h") self.assertEqual(AmalgamationHelper.is_any_include("#include "), "botan/oids.h") self.assertEqual(AmalgamationHelper.is_any_include(" #include "), "string") self.assertEqual(AmalgamationHelper.is_any_include(" #include "), "myfile.h") self.assertEqual(AmalgamationHelper.is_any_include(" #include "), "unistd.h") self.assertEqual(AmalgamationHelper.is_any_include(" #include "), "botan/oids.h") self.assertEqual(AmalgamationHelper.is_any_include("#include // comment"), "string") self.assertEqual(AmalgamationHelper.is_any_include("#include // comment"), "myfile.h") self.assertEqual(AmalgamationHelper.is_any_include("#include // comment"), "unistd.h") self.assertEqual(AmalgamationHelper.is_any_include("#include // comment"), "botan/oids.h") class ModulesChooserResolveDependencies(unittest.TestCase): def test_base(self): available_modules = set(["A", "B"]) table = { "A": [], } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A"])) def test_no_dependencies_defined(self): available_modules = set(["A", "B"]) table = { "A": [], } with self.assertRaises(KeyError): ModulesChooser.resolve_dependencies(available_modules, table, "B") available_modules = set(["A", "B"]) table = { "A": ["B"], } with self.assertRaises(KeyError): ModulesChooser.resolve_dependencies(available_modules, table, "A") def test_add_dependency(self): available_modules = set(["A", "B"]) table = { "A": ["B"], "B": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "B"])) def test_add_dependencies_two_levels(self): available_modules = set(["A", "B", "C"]) table = { "A": ["B"], "B": ["C"], "C": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "B", "C"])) def test_circular(self): available_modules = set(["A", "B", "C"]) table = { "A": ["B"], "B": ["C"], "C": ["A"] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "B", "C"])) def test_not_available(self): available_modules = set(["A", "C"]) table = { "A": ["B"], "B": ["C"], "C": ["A"] } ok, _ = ModulesChooser.resolve_dependencies(available_modules, table, "B") self.assertFalse(ok) def test_dependency_not_available(self): available_modules = set(["A", "C"]) table = { "A": ["B"], "B": ["C"], "C": ["A"] } ok, _ = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertFalse(ok) def test_dependency2_not_available(self): available_modules = set(["A", "B"]) table = { "A": ["B"], "B": ["C"], "C": ["A"] } ok, _ = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertFalse(ok) def test_dependency_choices(self): available_modules = set(["A", "B", "C"]) table = { "A": ["B|C"], "B": [], "C": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertTrue(modules == set(["A", "B"]) or modules == set(["A", "C"])) def test_dependency_prefer_existing(self): available_modules = set(["A", "B", "C"]) table = { "A": ["C", "B|C"], "B": [], "C": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "C"])) def test_dependency_prefer_existing2(self): available_modules = set(["A", "B", "C"]) table = { "A": ["B", "B|C"], "B": [], "C": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "B"])) def test_dependency_choices_impossible(self): available_modules = set(["A", "C"]) table = { "A": ["B|C"], "B": [], "C": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "C"])) def test_dependency_choices_impossible2(self): available_modules = set(["A", "B"]) table = { "A": ["B|C"], "B": [], "C": [] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "A") self.assertTrue(ok) self.assertEqual(modules, set(["A", "B"])) def test_deep(self): available_modules = set(["A", "B", "C", "E", "G"]) table = { "A": ["B|C"], "B": ["D"], "C": ["E"], "D": [], "E": ["F|G"], "F": ["A", "B"], "G": ["A", "G"] } ok, modules = ModulesChooser.resolve_dependencies(available_modules, table, "G") self.assertTrue(ok) self.assertEqual(modules, set(["G", "A", "C", "E"])) if __name__ == '__main__': unittest.TestCase.longMessage = True unittest.main() botan-2.4.0/src/scripts/python_unittests_unix.py000077500000000000000000000044151322470703100221640ustar00rootroot00000000000000#!/usr/bin/env python3 """ Unittests for Botan Python scripts. Those tests only need to pass un UNIX-like operating systems. Requires Python 3. (C) 2017 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) """ import os import sys import unittest sys.path.append("../..") # Botan repo root from install import prepend_destdir # pylint: disable=wrong-import-position from install import PrependDestdirError # pylint: disable=wrong-import-position class PrependDestdir(unittest.TestCase): def test_absolute_destdir(self): os.environ["DESTDIR"] = "/" self.assertEqual(prepend_destdir("/home/me"), "/home/me") self.assertEqual(prepend_destdir("/home/me/"), "/home/me") self.assertEqual(prepend_destdir("/home/me/../me2"), "/home/me2") os.environ["DESTDIR"] = "/opt" self.assertEqual(prepend_destdir("/home/me"), "/opt/home/me") self.assertEqual(prepend_destdir("/home/me/"), "/opt/home/me") self.assertEqual(prepend_destdir("/home/me/../me2"), "/opt/home/me2") def test_relative_destdir(self): os.environ["DESTDIR"] = "." self.assertEqual(prepend_destdir("/home/me"), "./home/me") self.assertEqual(prepend_destdir("/home/me/"), "./home/me") self.assertEqual(prepend_destdir("/home/me/../me2"), "./home/me2") os.environ["DESTDIR"] = "bar" self.assertEqual(prepend_destdir("/home/me"), "bar/home/me") self.assertEqual(prepend_destdir("/home/me/"), "bar/home/me") self.assertEqual(prepend_destdir("/home/me/../me2"), "bar/home/me2") def test_relative(self): # No destdir set os.environ["DESTDIR"] = "" self.assertEqual(prepend_destdir("foo"), "foo") self.assertEqual(prepend_destdir("../foo"), "../foo") # Destdir set os.environ["DESTDIR"] = "/opt" with self.assertRaises(PrependDestdirError): prepend_destdir("foo") with self.assertRaises(PrependDestdirError): prepend_destdir("../foo") def test_escaping(self): os.environ["DESTDIR"] = "/opt" with self.assertRaises(PrependDestdirError): prepend_destdir("/foo/../..") if __name__ == '__main__': unittest.TestCase.longMessage = True unittest.main() botan-2.4.0/src/scripts/run_tls_attacker.py000077500000000000000000000116051322470703100210210ustar00rootroot00000000000000#!/usr/bin/python import os import sys import subprocess import tempfile import time import random import optparse import string def run_subprocess(cmd): print("Running '%s'" % (' '.join(cmd))) proc = subprocess.Popen(cmd, bufsize=-1) proc.communicate() if proc.returncode != 0: print('Running "%s" failed rc %d' % (' '.join(cmd), proc.returncode)) sys.exit(proc.returncode) def spawn_server(cmd): print("Spawning '%s'" % (' '.join(cmd))) return subprocess.Popen(cmd, bufsize=-1)#,stdout=subprocess.PIPE,stderr=subprocess.PIPE) def main(args=None): if args is None: args = sys.argv parser = optparse.OptionParser() parser.add_option('--type', default='tests', help='Which TLS-Attacker tests to run (tests, policy, fuzzer)') parser.add_option('--src-dir', metavar='DIR', default='./src', help='Specify path to botan sources (default "%default")') parser.add_option('--verbose', action='store_true', help='Be noisy') (options, args) = parser.parse_args(args) if len(args) != 3: print("Usage: %s botan_cli_exe botan_ci_tools" % (args[0])) return 1 cli_exe = args[1] ci_tools = args[2] test_type = options.type src_dir = options.src_dir if test_type not in ['tests', 'policy', 'fuzzer']: print("Unknown --type %s" % (options.test_type)) return 1 if os.access(cli_exe, os.X_OK) != True: print("Unable to find CLI tool at %s" % (cli_exe)) return 1 if os.access(src_dir, os.X_OK) != True: print("Unable to find src dir at %s" % (src_dir)) return 1 test_data_dir = os.path.join(src_dir, 'tests/data') lax_policy_txt = os.path.join(test_data_dir, 'tls-policy/compat.txt') bsi_policy_txt = os.path.join(test_data_dir, 'tls-policy/bsi.txt') tls_attacker_dir = os.path.join(ci_tools, 'TLS-Attacker') tls_attacker_jar = os.path.join(tls_attacker_dir, 'TLS-Attacker-1.2.jar') tls_attacker_testsuites = os.path.join(tls_attacker_dir, 'resources/testsuite') tls_fuzzer_workflows = os.path.join(tls_attacker_dir, 'resources/fuzzing/workflows') if os.access(tls_attacker_jar, os.R_OK) != True: print("Unable to find TLS-Attacker jar at %s" % (tls_attacker_jar)) return 1 rsa_key = tempfile.NamedTemporaryFile(prefix='rsa_key_') rsa_crt = tempfile.NamedTemporaryFile(prefix='rsa_crt_') run_subprocess([cli_exe, 'keygen', '--algo=RSA', '--params=2048', '--output=%s' % (rsa_key.name)]) run_subprocess([cli_exe, 'gen_self_signed', rsa_key.name, 'localhost', '--output=%s' % (rsa_crt.name)]) server_log = 'botan_log.txt' server_err_log = 'botan_err_log.txt' tls_port = random.randint(50000, 60000) botan_server_cmd = [cli_exe, 'tls_server', rsa_crt.name, rsa_key.name, '--port=%d' % (tls_port), '--output='+server_log, '--error-output='+server_err_log] java_tls_attacker = ['java', '-jar', tls_attacker_jar, '-loglevel', 'DEBUG' if options.verbose else 'ERROR'] tls_attacker_opts = ['-tls_timeout', '300', '-connect', 'localhost:%d' % (tls_port)] if test_type == 'tests': try: server_process = spawn_server(botan_server_cmd + ['--policy=%s' % (lax_policy_txt)]) time.sleep(1) run_subprocess(java_tls_attacker + ['testsuite_server'] + tls_attacker_opts + ['-folder', tls_attacker_testsuites]) finally: server_process.terminate() elif test_type == 'policy': try: server_process = spawn_server(botan_server_cmd + ['--policy=%s' % (bsi_policy_txt)]) time.sleep(1) run_subprocess(java_tls_attacker + ['testtls_server'] + tls_attacker_opts + ['-policy', bsi_policy_txt]) finally: server_process.terminate() elif test_type == 'fuzzer': template_mapping = { 'rsa_key': rsa_key.name, 'rsa_cert': rsa_crt.name, 'botan_cli': cli_exe, 'workflow_dir': tls_fuzzer_workflows, 'fuzz_policy': lax_policy_txt, 'tls_port': str(tls_port), 'PORT': '$PORT' # this is a var for TLS-Attacker don't touch it } template_txt = open(os.path.join(src_dir, 'scripts/fuzzer.xml')).read() config = string.Template(template_txt).substitute(template_mapping) fuzzer_config = tempfile.NamedTemporaryFile(prefix='fuzzer_cfg_', delete=False) fuzzer_config.write(config.encode('ascii')) fuzzer_config.close() run_subprocess(java_tls_attacker + ['multi_fuzzer'] + ['-startup_command_file', fuzzer_config.name]) if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/show_dependencies.py000077500000000000000000000142411322470703100211420ustar00rootroot00000000000000#!/usr/bin/env python """ Show Botan module dependencies as a list or graph. Requires graphviz from pip when graphical output is selected: https://pypi.python.org/pypi/graphviz (C) 2015 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) """ # global import argparse import copy import sys import subprocess from collections import OrderedDict import glob import os # Assume this script is in botan/src/scripts botan_root = os.path.join(os.path.dirname(sys.argv[0]), "..", "..") # locale sys.path.append(botan_root) from configure import ModuleInfo parser = argparse.ArgumentParser(description= 'Show Botan module dependencies. ' 'The output is reduced by indirect dependencies, ' 'i.e. you must look at the result recursively to get all dependencies.') parser.add_argument('mode', choices=["list", "draw"], help='The output mode') parser.add_argument('--format', nargs='?', choices=["pdf", "png"], default="pdf", help='The file format (drawing mode only)') parser.add_argument('--engine', nargs='?', choices=["fdp", "dot"], default="fdp", help='The graph engine (drawing mode only)') parser.add_argument('--all', dest='all', action='store_const', const=True, default=False, help='Show all dependencies. Default: direct dependencies only. (list mode only)') parser.add_argument('--verbose', dest='verbose', action='store_const', const=True, default=False, help='Verbose output (default: false)') args = parser.parse_args() files = [] files += glob.glob(botan_root + '/src/lib/*/*/*/*/*/*/info.txt') files += glob.glob(botan_root + '/src/lib/*/*/*/*/*/info.txt') files += glob.glob(botan_root + '/src/lib/*/*/*/*/info.txt') files += glob.glob(botan_root + '/src/lib/*/*/*/info.txt') files += glob.glob(botan_root + '/src/lib/*/*/info.txt') files += glob.glob(botan_root + '/src/lib/*/info.txt') files += glob.glob(botan_root + '/src/lib/info.txt') files.sort() if len(files) == 0: print("No info.txt files found.") sys.exit(1) modules = [] def dicts(t): return {k: dicts(t[k]) for k in t} def paths(t, path = [], level=0): ret = [] for key in t: ret.append(path + [key]) ret += paths(t[key], path + [key], level+1) return ret if args.verbose: print("Getting dependencies from into.txt files ...") for filename in files: (rest, info_txt) = os.path.split(filename) (rest, modname) = os.path.split(rest) module = ModuleInfo(filename) modules.append(module) if args.verbose: print(module.basename) print("\t" + str(set(module.dependencies()))) if args.verbose: print(str(len(modules)) + " modules:") names=[m.basename for m in modules] names.sort() print(names) print("") if args.verbose: print("resolving dependencies ...") def cartinality(depdict): return sum([len(depdict[k]) for k in depdict]) registered_dependencies = dict() all_dependencies = dict() direct_dependencies = dict() for module in modules: lst = module.dependencies() registered_dependencies[module.basename] = set(lst) - set([module.basename]) # Get all_dependencies from registered_dependencies def add_dependency(): for key in all_dependencies: potentially_new_modules_for_key = None new_modules_for_key = None for currently_in in all_dependencies[key]: if currently_in in all_dependencies: potentially_new_modules_for_key = all_dependencies[currently_in] - set([key]) if not potentially_new_modules_for_key <= all_dependencies[key]: new_modules_for_key = potentially_new_modules_for_key.copy() break if new_modules_for_key: all_dependencies[key] |= new_modules_for_key return all_dependencies = copy.deepcopy(registered_dependencies) direct_dependencies = copy.deepcopy(registered_dependencies) # Sort all_dependencies = OrderedDict(sorted(all_dependencies.items())) direct_dependencies = OrderedDict(sorted(direct_dependencies.items())) #print(direct_dependencies) last_card = -1 while True: card = cartinality(all_dependencies) # print(card) if card == last_card: break; last_card = card add_dependency() # Return true iff a depends on b, # i.e. b is in the dependencies of a def depends_on(a, b): if not a in direct_dependencies: return False else: return b in direct_dependencies[a] def remove_indirect_dependencies(): for mod in direct_dependencies: for one in direct_dependencies[mod]: others = direct_dependencies[mod] - set([one]) for other in others: if depends_on(other, one): direct_dependencies[mod].remove(one) return # Go to next mod last_card = -1 while True: card = cartinality(direct_dependencies) # print(card) if card == last_card: break; last_card = card remove_indirect_dependencies() def openfile(f): if sys.platform.startswith('linux'): subprocess.call(["xdg-open", f]) else: os.startfile(f) if args.verbose: print("Done resolving dependencies.") if args.mode == "list": if args.all: for key in all_dependencies: print(key.ljust(17) + " : " + ", ".join(sorted(all_dependencies[key]))) else: for key in direct_dependencies: print(key.ljust(17) + " : " + ", ".join(sorted(direct_dependencies[key]))) if args.mode == "draw": import graphviz as gv import tempfile tmpdir = tempfile.mkdtemp(prefix="botan-") g2 = gv.Digraph(format=args.format, engine=args.engine) for key in direct_dependencies: g2.node(key) for dep in direct_dependencies[key]: g2.edge(key, dep) if args.verbose: print("Rendering graph ...") filename = g2.render(filename='graph', directory=tmpdir) if args.verbose: print("Opening " + filename + " ...") openfile(filename) botan-2.4.0/src/scripts/test_fuzzers.py000077500000000000000000000106141322470703100202230ustar00rootroot00000000000000#!/usr/bin/python # (C) 2017 Jack Lloyd import sys import os import subprocess import optparse import stat import multiprocessing def run_fuzzer_gdb(args): (fuzzer_bin, corpus_file) = args gdb_proc = subprocess.Popen(['gdb', '--quiet', '--return-child-result', fuzzer_bin], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) gdb_commands = ('run < %s\nbt\nquit\n' % (corpus_file)).encode('ascii') (stdout, stderr) = gdb_proc.communicate(gdb_commands) if gdb_proc.returncode == 0: return (0, '', '') return (corpus_file, gdb_proc.returncode, stdout.decode('ascii'), stderr.decode('ascii')) def run_fuzzer(args): (fuzzer_bin, corpus_file) = args corpus_fd = open(corpus_file, 'r') fuzzer_proc = subprocess.Popen([fuzzer_bin], stdin=corpus_fd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) (stdout, stderr) = fuzzer_proc.communicate() corpus_fd.close() return (corpus_file, fuzzer_proc.returncode, stdout.decode('ascii'), stderr.decode('ascii')) def main(args=None): if args is None: args = sys.argv parser = optparse.OptionParser( usage='Usage: %prog [options] corpus_dir fuzzers_dir', ) parser.add_option('--gdb', action='store_true', help='Run under GDB and capture backtraces') (options, args) = parser.parse_args(args) if len(args) != 3: parser.print_usage() return 1 corpus_dir = args[1] fuzzer_dir = args[2] if not os.access(corpus_dir, os.R_OK): print("Error could not access corpus directory '%s'" % (corpus_dir)) return 1 if not os.access(fuzzer_dir, os.R_OK): print("Error could not access fuzzers directory '%s'" % (fuzzer_dir)) return 1 fuzzers = set([]) for fuzzer in os.listdir(fuzzer_dir): if fuzzer.endswith('.zip'): continue fuzzers.add(fuzzer) corpii = set([]) for corpus in os.listdir(corpus_dir): # Ignore regular files in toplevel dir if not stat.S_ISDIR(os.stat(os.path.join(corpus_dir, corpus)).st_mode): continue if corpus == '.git': continue corpii.add(corpus) fuzzers_without_corpus = fuzzers - corpii corpus_without_fuzzers = corpii - fuzzers for f in sorted(list(fuzzers_without_corpus)): print("Warning: Fuzzer %s has no corpus" % (f)) for c in sorted(list(corpus_without_fuzzers)): print("Warning: Corpus %s has no fuzzer" % (c)) fuzzers_with_corpus = fuzzers & corpii crash_count = 0 stderr_count = 0 stdout_count = 0 gdb_commands = None pool = multiprocessing.Pool(None) chunk_size = 32 # arbitrary run_fuzzer_func = run_fuzzer_gdb if options.gdb else run_fuzzer for fuzzer in sorted(list(fuzzers_with_corpus)): fuzzer_bin = os.path.join(fuzzer_dir, fuzzer) corpus_subdir = os.path.join(corpus_dir, fuzzer) corpus_files = [os.path.join(corpus_subdir, l) for l in sorted(list(os.listdir(corpus_subdir)))] # We have to do this hack because multiprocessing's Pool.map doesn't support # passing any initial arguments, just the single iteratable map_args = [(fuzzer_bin, f) for f in corpus_files] for result in pool.map(run_fuzzer_func, map_args, chunk_size): (corpus_file, retcode, stdout, stderr) = result if retcode != 0: print("Fuzzer %s crashed with input %s returncode %d" % (fuzzer, corpus_file, retcode)) crash_count += 1 if len(stdout) != 0: print("Fuzzer %s produced stdout on input %s:\n%s" % (fuzzer, corpus_file, stdout)) stdout_count += 1 if len(stderr) != 0: print("Fuzzer %s produced stderr on input %s:\n%s" % (fuzzer, corpus_file, stderr)) stderr_count += 1 print("Tested fuzzer %s with %d test cases, %d crashes" % (fuzzer, len(corpus_files), crash_count)) sys.stdout.flush() if crash_count > 0 or stderr_count > 0 or stdout_count > 0: print("Ran fuzzer tests, %d crashes %d stdout %d stderr" % (crash_count, stdout_count, stderr_count)) return 2 return 0 if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/tls_scanner/000077500000000000000000000000001322470703100174105ustar00rootroot00000000000000botan-2.4.0/src/scripts/tls_scanner/policy.txt000066400000000000000000000012001322470703100214410ustar00rootroot00000000000000allow_tls10=true allow_tls11=true allow_tls12=true allow_dtls10=false allow_dtls12=false # Camellia first just to see if there is anyone out there who will negotiate it with us ciphers=Camellia-128 Camellia-256 Camellia-128/GCM Camellia-256/GCM ChaCha20Poly1305 AES-256/GCM AES-128/GCM AES-256 AES-128 signature_hashes=SHA-384 SHA-256 SHA-1 macs=AEAD SHA-384 SHA-256 SHA-1 key_exchange_methods=CECPQ1 ECDH DH RSA signature_methods=ECDSA RSA DSA ecc_curves=x25519 secp256r1 secp384r1 minimum_dh_group_size=1024 minimum_ecdh_group_size=255 minimum_rsa_bits=2048 allow_insecure_renegotiation=false allow_server_initiated_renegotiation=false botan-2.4.0/src/scripts/tls_scanner/readme.txt000066400000000000000000000002371322470703100214100ustar00rootroot00000000000000 Simple script to scan hosts to check basic TLS client compatability. URL list chosen mostly from large tech/software vendors, feel free to send suggestions. botan-2.4.0/src/scripts/tls_scanner/tls_scanner.py000077500000000000000000000030471322470703100223040ustar00rootroot00000000000000#!/usr/bin/python2 import sys import time import subprocess import re def format_report(client_output): version_re = re.compile('TLS (v1\.[0-2]) using ([A-Z0-9_]+)') version_match = version_re.search(client_output) #print client_output if version_match: return "Established %s %s" % (version_match.group(1), version_match.group(2)) else: return client_output def scanner(args = None): if args is None: args = sys.argv if len(args) != 2: print "Error: Usage tls_scanner.py host_file" return 2 scanners = {} for url in [s.strip() for s in open(args[1]).readlines()]: scanners[url] = subprocess.Popen(['../../../botan', 'tls_client', '--policy=policy.txt', url], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) for url in scanners.keys(): scanners[url].stdin.close() report = {} timeout = 10 for url in scanners.keys(): print "waiting for", url for i in range(timeout): scanners[url].poll() if scanners[url].returncode != None: break #print "Waiting %d more seconds for %s" % (timeout-i, url) time.sleep(1) if scanners[url].returncode != None: output = scanners[url].stdout.read() + scanners[url].stderr.read() report[url] = format_report(output) for url in report.keys(): print url, ":", report[url] return 0 if __name__ == '__main__': sys.exit(scanner()) botan-2.4.0/src/scripts/tls_scanner/urls.txt000066400000000000000000000012471322470703100211420ustar00rootroot00000000000000adobe.com adp.com airbnb.com akamai.com amazon.com apache.org apple.com bbc.co.uk bing.com ca.com cisco.com citrix.com cloudflare.com craigslist.org dell.com ebay.com facebook.com github.com gmail.com google.com hp.com huawei.com ibm.com ietf.org intuit.com linkedin.com medium.com microsoft.com mikestoolbox.org nec.com netflix.com openssl.org oracle.com sgi.com chase.com bankofamerica.com citibank.com wellsfargo.com ebay.com paypal.com pwc.com randombit.net reddit.com redhat.com salesforce.com sas.com siemens.com sony.com stripe.com symantec.com tls.mbed.org twitter.com uber.com vmware.com whatsapp.com wikipedia.org www.iso.org www.lg.com yahoo.com yandex.ru youtube.com botan-2.4.0/src/scripts/tls_suite_info.py000077500000000000000000000263431322470703100205100ustar00rootroot00000000000000#!/usr/bin/env python2 """ Used to generate lib/tls/tls_suite_info.cpp from IANA params (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017 Jack Lloyd Botan is released under the Simplified BSD License (see license.txt) """ import sys import re import datetime import hashlib import optparse def to_ciphersuite_info(code, name): (sig_and_kex,cipher_and_mac) = name.split('_WITH_') if sig_and_kex == 'RSA': sig_algo = 'RSA' kex_algo = 'RSA' elif 'PSK' in sig_and_kex: sig_algo = '' kex_algo = sig_and_kex elif 'SRP' in sig_and_kex: srp_info = sig_and_kex.split('_') if len(srp_info) == 2: # 'SRP_' + hash kex_algo = sig_and_kex sig_algo = '' else: kex_algo = '_'.join(srp_info[0:-1]) sig_algo = srp_info[-1] else: (kex_algo, sig_algo) = sig_and_kex.split('_') cipher_and_mac = cipher_and_mac.split('_') mac_algo = cipher_and_mac[-1] cipher = cipher_and_mac[:-1] if mac_algo == '8' and cipher[-1] == 'CCM': cipher = cipher[:-1] mac_algo = 'CCM_8' elif cipher[-2] == 'CCM' and cipher[-1] == '8': cipher = cipher[:-1] mac_algo = 'CCM_8' if mac_algo == 'CCM': cipher += ['CCM'] mac_algo = 'SHA256' elif mac_algo == 'CCM_8': cipher += ['CCM(8)'] mac_algo = 'SHA256' cipher_info = { 'CHACHA20': ('ChaCha',32), 'IDEA': ('IDEA',16), 'DES': ('DES',8), '3DES': ('3DES',24), 'CAMELLIA': ('Camellia',None), 'AES': ('AES',None), 'SEED': ('SEED',16), 'ARIA': ('ARIA',None), } tls_to_botan_names = { 'anon': '', 'MD5': 'MD5', 'SHA': 'SHA-1', 'SHA256': 'SHA-256', 'SHA384': 'SHA-384', 'SHA512': 'SHA-512', 'CHACHA': 'ChaCha', '3DES': 'TripleDES', 'DSS': 'DSA', 'ECDSA': 'ECDSA', 'RSA': 'RSA', 'SRP_SHA': 'SRP_SHA', 'DHE': 'DH', 'DH': 'DH', 'ECDHE': 'ECDH', 'ECDH': 'ECDH', '': '', 'PSK': 'PSK', 'DHE_PSK': 'DHE_PSK', 'PSK_DHE': 'DHE_PSK', 'ECDHE_PSK': 'ECDHE_PSK', 'CECPQ1': 'CECPQ1', 'CECPQ1_PSK': 'CECPQ1_PSK', } mac_keylen = { 'MD5': 16, 'SHA-1': 20, 'SHA-256': 32, 'SHA-384': 48, 'SHA-512': 64, } mac_algo = tls_to_botan_names[mac_algo] sig_algo = tls_to_botan_names[sig_algo] kex_algo = tls_to_botan_names[kex_algo] (cipher_algo, cipher_keylen) = cipher_info[cipher[0]] if cipher_keylen is None: cipher_keylen = int(cipher[1]) / 8 if cipher_algo in ['AES', 'Camellia', 'ARIA']: cipher_algo += '-%d' % (cipher_keylen*8) modestr = '' mode = '' ivlen = 0 if cipher[0] == 'CHACHA20' and cipher[1] == 'POLY1305': iv_len = 12 if code in ['CC13', 'CC14', 'CC15']: iv_len = 0 # Google variant record_iv_len = 0 return (name, code, sig_algo, kex_algo, "ChaCha20Poly1305", cipher_keylen, iv_len, record_iv_len, "AEAD", 0, mac_algo) mode = cipher[-1] if mode not in ['CBC', 'GCM', 'CCM(8)', 'CCM', 'OCB']: print "#warning Unknown mode '%s' for ciphersuite %s (0x%d)" % (' '.join(cipher), name, code) ivlen = 8 if cipher_algo == '3DES' else 16 if mode != 'CBC': if mode == 'OCB': cipher_algo += '/OCB(12)' else: cipher_algo += '/' + mode if mode == 'CBC': return (name, code, sig_algo, kex_algo, cipher_algo, cipher_keylen, ivlen, 0, mac_algo, mac_keylen[mac_algo], "") elif mode == 'OCB': return (name, code, sig_algo, kex_algo, cipher_algo, cipher_keylen, 12, 0, "AEAD", 0, mac_algo) else: iv_bytes_from_hs = 4 iv_bytes_from_rec = 8 return (name, code, sig_algo, kex_algo, cipher_algo, cipher_keylen, iv_bytes_from_hs, iv_bytes_from_rec, "AEAD", 0, mac_algo) def open_input(args): iana_url = 'https://www.iana.org/assignments/tls-parameters/tls-parameters.txt' if len(args) == 1: try: return open('tls-parameters.txt') except: pass import urllib2 return urllib2.urlopen(iana_url) else: return open(args[1]) """ Handle command line options """ def process_command_line(args): parser = optparse.OptionParser() parser.add_option('--with-ocb', action='store_true', default=True, help='enable OCB AEAD suites') parser.add_option('--without-ocb', action='store_false', dest='with_ocb', help='disable OCB AEAD suites') parser.add_option('--with-aria-cbc', action='store_true', default=False, help='enable ARIA CBC suites') parser.add_option('--without-aria-cbc', action='store_false', dest='with_aria_cbc', help='disable ARIA CBC suites') parser.add_option('--with-cecpq1', action='store_true', default=True, help='enable CECPQ1 suites') parser.add_option('--without-cecpq1', action='store_false', dest='with_cecpq1', help='disable CECPQ1 suites') parser.add_option('--with-srp-aead', action='store_true', default=False, help='add SRP AEAD suites') parser.add_option('--without-srp-aead', action='store_false', dest='with_srp_aead', help='disable SRP AEAD suites') parser.add_option('--save-download', action='store_true', default=False, help='save downloaded tls-parameters.txt to cwd') parser.add_option('--output', '-o', help='file to write output to (default %default)', default='src/lib/tls/tls_suite_info.cpp') return parser.parse_args(args) def main(args = None): if args is None: args = sys.argv weak_crypto = ['EXPORT', 'RC2', 'IDEA', 'RC4', '_DES_', 'WITH_NULL'] static_dh = ['ECDH_ECDSA', 'ECDH_RSA', 'DH_DSS', 'DH_RSA'] # not supported protocol_goop = ['SCSV', 'KRB5'] maybe_someday = ['RSA_PSK'] not_supported = weak_crypto + static_dh + protocol_goop + maybe_someday (options, args) = process_command_line(args) if not options.with_aria_cbc: not_supported += ['ARIA_128_CBC', 'ARIA_256_CBC'] ciphersuite_re = re.compile(' +0x([0-9a-fA-F][0-9a-fA-F]),0x([0-9a-fA-F][0-9a-fA-F]) + TLS_([A-Za-z_0-9]+) ') suites = {} suite_codes = {} contents = '' for line in open_input(args): contents += line match = ciphersuite_re.match(line) if match: code = match.group(1) + match.group(2) name = match.group(3) should_use = True for ns in not_supported: if ns in name: should_use = False if should_use: suites[code] = to_ciphersuite_info(code, name) sha1 = hashlib.sha1() sha1.update(contents) contents_hash = sha1.hexdigest() if options.save_download: out = open('tls-parameters.txt', 'w') out.write(contents) out.close() def define_custom_ciphersuite(name, code): suites[code] = to_ciphersuite_info(code, name) # Google servers - draft-agl-tls-chacha20poly1305-04 define_custom_ciphersuite('ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256', 'CC13') define_custom_ciphersuite('ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256', 'CC14') define_custom_ciphersuite('DHE_RSA_WITH_CHACHA20_POLY1305_SHA256', 'CC15') if options.with_cecpq1: # CECPQ1 key exchange define_custom_ciphersuite('CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256', '16B7') define_custom_ciphersuite('CECPQ1_ECDSA_WITH_CHACHA20_POLY1305_SHA256', '16B8') define_custom_ciphersuite('CECPQ1_RSA_WITH_AES_256_GCM_SHA384', '16B9') define_custom_ciphersuite('CECPQ1_ECDSA_WITH_AES_256_GCM_SHA384', '16BA') if options.with_ocb: # OCB ciphersuites draft-zauner-tls-aes-ocb-04 define_custom_ciphersuite('DHE_RSA_WITH_AES_128_OCB_SHA256', 'FFC0') define_custom_ciphersuite('DHE_RSA_WITH_AES_256_OCB_SHA256', 'FFC1') define_custom_ciphersuite('ECDHE_RSA_WITH_AES_128_OCB_SHA256', 'FFC2') define_custom_ciphersuite('ECDHE_RSA_WITH_AES_256_OCB_SHA256', 'FFC3') define_custom_ciphersuite('ECDHE_ECDSA_WITH_AES_128_OCB_SHA256', 'FFC4') define_custom_ciphersuite('ECDHE_ECDSA_WITH_AES_256_OCB_SHA256', 'FFC5') define_custom_ciphersuite('PSK_WITH_AES_128_OCB_SHA256', 'FFC6') define_custom_ciphersuite('PSK_WITH_AES_256_OCB_SHA256', 'FFC7') define_custom_ciphersuite('DHE_PSK_WITH_AES_128_OCB_SHA256', 'FFC8') define_custom_ciphersuite('DHE_PSK_WITH_AES_256_OCB_SHA256', 'FFC9') define_custom_ciphersuite('ECDHE_PSK_WITH_AES_128_OCB_SHA256', 'FFCA') define_custom_ciphersuite('ECDHE_PSK_WITH_AES_256_OCB_SHA256', 'FFCB') if options.with_cecpq1 and options.with_ocb: # CECPQ1 OCB ciphersuites - Botan extension define_custom_ciphersuite('CECPQ1_RSA_WITH_AES_256_OCB_SHA256', 'FFCC') define_custom_ciphersuite('CECPQ1_ECDSA_WITH_AES_256_OCB_SHA256', 'FFCD') #define_custom_ciphersuite('CECPQ1_PSK_WITH_AES_256_OCB_SHA256', 'FFCE') if options.with_srp_aead: # SRP using GCM or OCB - Botan extension define_custom_ciphersuite('SRP_SHA_WITH_AES_256_GCM_SHA384', 'FFA0') define_custom_ciphersuite('SRP_SHA_RSA_WITH_AES_256_GCM_SHA384', 'FFA1') define_custom_ciphersuite('SRP_SHA_DSS_WITH_AES_256_GCM_SHA384', 'FFA2') define_custom_ciphersuite('SRP_SHA_ECDSA_WITH_AES_256_GCM_SHA384', 'FFA3') if options.with_ocb: define_custom_ciphersuite('SRP_SHA_WITH_AES_256_OCB_SHA256', 'FFA4') define_custom_ciphersuite('SRP_SHA_RSA_WITH_AES_256_OCB_SHA256', 'FFA5') define_custom_ciphersuite('SRP_SHA_DSS_WITH_AES_256_OCB_SHA256', 'FFA6') define_custom_ciphersuite('SRP_SHA_ECDSA_WITH_AES_256_OCB_SHA256', 'FFA7') suite_info = '' def header(): return """/* * TLS cipher suite information * * This file was automatically generated from the IANA assignments * (tls-parameters.txt hash %s) * by %s on %s * * Botan is released under the Simplified BSD License (see license.txt) */ """ % (contents_hash, sys.argv[0], datetime.date.today().strftime("%Y-%m-%d")) suite_info += header() suite_info += """#include namespace Botan { namespace TLS { //static const std::vector& Ciphersuite::all_known_ciphersuites() { // Note that this list of ciphersuites is ordered by id! static const std::vector g_ciphersuite_list = { """ for code in sorted(suites.keys()): info = suites[code] assert len(info) == 11 suite_expr = 'Ciphersuite(0x%s, "%s", "%s", "%s", "%s", %d, %d, %d, "%s", %d, "%s")' % ( code, info[0], info[2], info[3], info[4], info[5], info[6], info[7], info[8], info[9], info[10]) suite_info += " " + suite_expr + ",\n" suite_info += """ }; return g_ciphersuite_list; } } } """ if options.output == '-': print suite_info, else: out = open(options.output, 'w') out.write(suite_info) out.close() if __name__ == '__main__': sys.exit(main()) botan-2.4.0/src/scripts/update_docs.py000077500000000000000000000051211322470703100177430ustar00rootroot00000000000000#!/usr/bin/env python3 """ A script to automatically write docs to /docs. Currently it generates os.rst, a feature table of OS features. Requires Python 3. (C) 2015 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) """ # global import argparse import glob import os import sys # Assume this script is in botan/src/scripts botan_root = os.path.join(os.path.dirname(sys.argv[0]), "..", "..") # locale sys.path.append(botan_root) from configure import OsInfo parser = argparse.ArgumentParser(description="") parser.add_argument('--verbose', dest='verbose', action='store_const', const=True, default=False, help='Verbose output (default: false)') args = parser.parse_args() def update_os(): PAGE_TITLE="Botan OS information" TABLE_TITLE="OS Features" files = [] files += glob.glob(botan_root + '/src/build-data/os/*.txt') files.sort() if len(files) == 0: print("No info.txt files found.") sys.exit(1) f1 = open(os.path.join(botan_root, 'doc', 'os.rst'), 'w+') all_features = set() oss = {} for filename in files: o = OsInfo(filename) oss[o.basename] = o all_features |= set(o.target_features) if args.verbose: print(o.basename) print(o.target_features) featurelist = list(all_features) featurelist.sort() oslist = list(oss.keys()) oslist.sort() if args.verbose: print(featurelist) print(PAGE_TITLE, file=f1) print("========================================", file=f1) print("", file=f1) print(TABLE_TITLE, file=f1) print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", file=f1) print("", file=f1) print("A summary of OS features as defined in ``src/build-data/os``.", file=f1) print("", file=f1) print("::", file=f1) print("", file=f1) for o in oslist: print(" %s: %s" % (o[0:1], o), file=f1) print("", file=f1) print('.. csv-table::', file=f1) print(' :header: "Feature", "' + '", "'.join([o[0:1] for o in oslist]) + '"', file=f1) print('', file=f1) for f in featurelist: line = ' "' + f + '"' for o in oslist: line += ', "' line += 'X' if f in oss[o].target_features else ' ' line += '"' print(line, file=f1) print("", file=f1) print(".. note::", file=f1) print(" This file is auto generated by ``src/scripts/%s``. Dont modify it manually." % os.path.basename(sys.argv[0]), file=f1) if __name__ == '__main__': update_os() botan-2.4.0/src/scripts/vecparser.py000066400000000000000000000036101322470703100174410ustar00rootroot00000000000000from collections import OrderedDict import re class VecDocument: def __init__(self, filepath): self.data = OrderedDict() last_testcase_number = 1 current_testcase_number = 1 current_group_name = "" last_group_name = "" current_testcase = {} PATTERN_GROUPHEADER = "^\[(.+)\]$" PATTERN_KEYVALUE = "^\s*([a-zA-Z]+)\s*=(.*)$" with open(filepath, 'r') as f: # Append one empty line to simplify parsing lines = f.read().splitlines() + ["\n"] for line in lines: line = line.strip() if line.startswith("#"): pass # Skip elif line == "": current_testcase_number += 1 elif re.match(PATTERN_GROUPHEADER, line): match = re.match(PATTERN_GROUPHEADER, line) current_group_name = match.group(1) elif re.match(PATTERN_KEYVALUE, line): match = re.match(PATTERN_KEYVALUE, line) key = match.group(1) value = match.group(2).strip() current_testcase[key] = value if current_testcase_number != last_testcase_number: if not current_group_name in self.data: self.data[current_group_name] = [] if len(current_testcase) != 0: self.data[current_group_name].append(current_testcase) current_testcase = {} last_testcase_number = current_testcase_number if current_group_name != last_group_name: last_group_name = current_group_name # Reset testcase number last_testcase_number = 1 current_testcase_number = 1 def get_data(self): return self.data botan-2.4.0/src/scripts/website.py000077500000000000000000000111761322470703100171220ustar00rootroot00000000000000#!/usr/bin/python """ Generate the Botan website (C) 2017 Jack Lloyd """ import optparse # pylint: disable=deprecated-module import subprocess import sys import errno import shutil import tempfile import os def run_and_check(cmd_line, cwd=None): print("Executing %s ..." % (' '.join(cmd_line))) proc = subprocess.Popen(cmd_line, cwd=cwd, close_fds=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = proc.communicate() if proc.returncode != 0: print("Error running %s" % (' '.join(cmd_line))) print(stdout) print(stderr) sys.exit(1) def configure_build(botan_dir, build_dir): run_and_check([os.path.join(botan_dir, 'configure.py'), '--with-doxygen', '--with-sphinx', '--with-build-dir=%s' % (build_dir)]) def run_doxygen(tmp_dir, output_dir): run_and_check(['doxygen', os.path.join(tmp_dir, 'build/botan.doxy')]) shutil.move(os.path.join(tmp_dir, 'build/docs/doxygen'), output_dir) def run_sphinx(botan_dir, tmp_dir, output_dir): sphinx_config = os.path.join(botan_dir, 'src/configs/sphinx') sphinx_dir = os.path.join(tmp_dir, 'sphinx') os.mkdir(sphinx_dir) shutil.copyfile(os.path.join(botan_dir, 'readme.rst'), os.path.join(sphinx_dir, 'index.rst')) for f in ['news.rst', os.path.join('doc', 'security.rst')]: shutil.copy(os.path.join(botan_dir, f), sphinx_dir) toc = """.. toctree:: index news security Users Manual API Reference """ contents_rst = open(os.path.join(sphinx_dir, 'contents.rst'), 'w') contents_rst.write(toc) contents_rst.close() sphinx_invoke = ['sphinx-build', '-t', 'website', '-c', sphinx_config, '-b', 'html'] manual_dir = os.path.join(botan_dir, 'doc/manual') run_and_check(sphinx_invoke + [sphinx_dir, output_dir]) run_and_check(sphinx_invoke + [manual_dir, os.path.join(output_dir, 'manual')]) shutil.rmtree(os.path.join(output_dir, '.doctrees')) shutil.rmtree(os.path.join(output_dir, 'manual', '.doctrees')) os.remove(os.path.join(output_dir, '.buildinfo')) os.remove(os.path.join(output_dir, 'manual', '.buildinfo')) # share _static subdirs shutil.rmtree(os.path.join(output_dir, 'manual', '_static')) os.symlink('../_static', os.path.join(output_dir, 'manual', '_static')) # Build PDF latex_output = os.path.join(tmp_dir, 'latex') run_and_check(['sphinx-build', '-c', sphinx_config, '-b', 'latex', manual_dir, latex_output]) # Have to run twice because TeX run_and_check(['pdflatex', 'botan.tex'], cwd=latex_output) run_and_check(['pdflatex', 'botan.tex'], cwd=latex_output) shutil.copy(os.path.join(latex_output, 'botan.pdf'), os.path.join(output_dir, 'manual')) def main(args): parser = optparse.OptionParser() parser.add_option('-o', '--output-dir', default=None, help="Where to write output") (options, args) = parser.parse_args(args) output_dir = options.output_dir tmp_dir = tempfile.mkdtemp(prefix='botan_website_') # assumes we live in src/scripts botan_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), "..", "..")) if os.access(os.path.join(botan_dir, 'configure.py'), os.X_OK) is False: print("Can't find configure.py in %s", botan_dir) sys.exit(1) if output_dir is None: cwd = os.getcwd() if os.path.basename(cwd) == 'botan-website': output_dir = '.' else: output_dir = os.path.join(cwd, 'botan-website') try: os.mkdir(output_dir) except OSError as e: if e.errno == errno.EEXIST: pass else: raise e for subdir in ['_static', '_sources', 'doxygen', 'manual']: try: shutil.rmtree(os.path.join(output_dir, subdir)) except OSError as e: if e.errno == errno.ENOENT: pass else: print("Error removing dir", e) sys.exit(1) configure_build(botan_dir, tmp_dir) run_doxygen(tmp_dir, output_dir) run_sphinx(botan_dir, tmp_dir, output_dir) for f in ['doc/pgpkey.txt', 'license.txt']: shutil.copy(os.path.join(botan_dir, f), output_dir) shutil.rmtree(tmp_dir) if __name__ == '__main__': sys.exit(main(sys.argv)) botan-2.4.0/src/tests/000077500000000000000000000000001322470703100145505ustar00rootroot00000000000000botan-2.4.0/src/tests/data/000077500000000000000000000000001322470703100154615ustar00rootroot00000000000000botan-2.4.0/src/tests/data/aead/000077500000000000000000000000001322470703100163535ustar00rootroot00000000000000botan-2.4.0/src/tests/data/aead/ccm.vec000066400000000000000000000034671322470703100176260ustar00rootroot00000000000000[AES-128/CCM(8,2)] # RFC 3610 Key = C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF Nonce = 00000003020100A0A1A2A3A4A5 In = 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E AD = 0001020304050607 Out = 588C979A61C663D2F066D0C2C0F989806D5F6B61DAC38417E8D12CFDF926E0 Key = C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF Nonce = 00000004030201A0A1A2A3A4A5 In = 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F AD = 0001020304050607 Out = 72C91A36E135F8CF291CA894085C87E3CC15C439C9E43A3BA091D56E10400916 # Crypto++ Key = 40CFB7A62E88013BD6D3AFFCC191041E Nonce = 00B6A88ADF36912FDCA0F3A5AE AD = 88C0D9577DF763C8B6A88ADF3691DC4A8BCA94DD00000000 In = 2C1BD036831C95496C5F4DBF3D559E72DE802A18 Out = 89D8580340B626A0B6D4D013BF18F291B89646C8FD1F1F61A9FB4BB3 [AES-128/CCM(10,2)] # RFC 3610 Key = C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF Nonce = 0000000E0D0C0BA0A1A2A3A4A5 In = 0C0D0E0F101112131415161718191A1B1C1D1E1F20 AD = 000102030405060708090A0B Out = C0FFA0D6F05BDB67F24D43A4338D2AA4BED7B20E43CD1AA31662E7AD65D6DB [AES-128/CCM(16,2)] # NIST Key = 2EBF60F0969013A54A3DEDB19D20F6C8 Nonce = 1DE8C5E21F9DB33123FF870ADD In = AD = E1DE6C6119D7DB471136285D10B47A450221B16978569190EF6A22B055295603 Out = 0EAD29EF205FBB86D11ABE5ED704B880 Key = 43C1142877D9F450E12D7B6DB47A85BA Nonce = 76BECD9D27CA8A026215F32712 In = B506A6BA900C1147C806775324B36EB376AA01D4C3EEF6F5 AD = 6A59AACADD416E465264C15E1A1E9BFA084687492710F9BDA832E2571E468224 Out = 14B14FE5B317411392861638EC383AE40BA95FEFE34255DC2EC067887114BC370281DE6F00836CE4 [AES-128/CCM(16,3)] # NIST CAVS 11.0, "CCM-VNT" information, AES Keylen: 128, Count = 50 Key = 005E8F4D8E0CBF4E1CEEB5D87A275848 Nonce = 0EC3AC452B547B9062AAC8FA In = B6F345204526439DAF84998F380DCFB4B4167C959C04FF65 AD = 2F1821AA57E5278FFD33C17D46615B77363149DBC98470413F6543A6B749F2CA Out = 9575E16F35DA3C88A19C26A7B762044F4D7BBBAFEFF05D754829E2A7752FA3A14890972884B511D8 botan-2.4.0/src/tests/data/aead/chacha20poly1305.vec000066400000000000000000000072721322470703100216500ustar00rootroot00000000000000[ChaCha20Poly1305] # From draft-agl-tls-chacha20poly1305-04 Key = 4290bcb154173531f314af57f3be3b5006da371ece272afa1b5dbdd1100a1007 In = 86d09974840bded2a5ca Nonce = cd7cf67be39c794a AD = 87e229d4500845a079c0 Out = e3e446f7ede9a19b62a4677dabf4e3d24b876bb284753896e1d6 # From draft-irtf-cfrg-chacha20-poly1305-03 In = 4C616469657320616E642047656E746C656D656E206F662074686520636C617373206F66202739393A204966204920636F756C64206F6666657220796F75206F6E6C79206F6E652074697020666F7220746865206675747572652C2073756E73637265656E20776F756C642062652069742E AD = 50515253C0C1C2C3C4C5C6C7 Key = 808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9F Nonce = 070000004041424344454647 Out = D31A8D34648E60DB7B86AFBC53EF7EC2A4ADED51296E08FEA9E2B5A736EE62D63DBEA45E8CA9671282FAFB69DA92728B1A71DE0A9E060B2905D6A5B67ECD3B3692DDBD7F2D778B8C9803AEE328091B58FAB324E4FAD675945585808B4831D7BC3FF4DEF08E4B7A9DE576D26586CEC64B61161AE10B594F09E26A7E902ECBD0600691 Key = 1C9240A5EB55D38AF333888604F6B5F0473917C1402B80099DCA5CBC207075C0 Nonce = 000000000102030405060708 AD = F33388860000000000004E91 In = 496E7465726E65742D4472616674732061726520647261667420646F63756D656E74732076616C696420666F722061206D6178696D756D206F6620736978206D6F6E74687320616E64206D617920626520757064617465642C207265706C616365642C206F72206F62736F6C65746564206279206F7468657220646F63756D656E747320617420616E792074696D652E20497420697320696E617070726F70726961746520746F2075736520496E7465726E65742D447261667473206173207265666572656E6365206D6174657269616C206F7220746F2063697465207468656D206F74686572207468616E206173202FE2809C776F726B20696E2070726F67726573732E2FE2809D Out = 64A0861575861AF460F062C79BE643BD5E805CFD345CF389F108670AC76C8CB24C6CFC18755D43EEA09EE94E382D26B0BDB7B73C321B0100D4F03B7F355894CF332F830E710B97CE98C8A84ABD0B948114AD176E008D33BD60F982B1FF37C8559797A06EF4F0EF61C186324E2B3506383606907B6A7C02B0F9F6157B53C867E4B9166C767B804D46A59B5216CDE7A4E99040C5A40433225EE282A1B0A06C523EAF4534D7F83FA1155B0047718CBC546A0D072B04B3564EEA1B422273F548271A0BB2316053FA76991955EBD63159434ECEBB4E466DAE5A1073A6727627097A1049E617D91D361094FA68F0FF77987130305BEABA2EDA04DF997B714D6C6F2C29A6AD5CB4022B02709BEEAD9D67890CBB22392336FEA1851F38 # From RFC 7539 Key = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f Nonce = 070000004041424344454647 AD = 50515253c0c1c2c3c4c5c6c7 In = 4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e Out = d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691 # Generated by OpenSSL; exposes bug handling plaintexts or AD params # with exact multiple of 16 bytes Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = BBBBBBBBBBBBBBBBBBBBBBBB AD = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Out = A0C9391216A037370BDFF40626C5DD137E93A01836AF9B8A5C1F929EF18C9350 Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = BBBBBBBBBBBBBBBBBBBBBBBB AD = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Out = A0C9391216A037370BDFF40626C5DD13422D6D1564BCE2074D98279498CE4C86 Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = BBBBBBBBBBBBBBBBBBBBBBBB AD = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Out = A0C9391216A037370BDFF40626C5DD13D45447FBEBA3C985BF65FBCBE51663F9214F9C6757F9FC0CFF3135E68DC7251F botan-2.4.0/src/tests/data/aead/eax.vec000066400000000000000000001300421322470703100176270ustar00rootroot00000000000000[AES-128/EAX(8)] Key = C61A0851AB4E515D11525B92E2B9D850 Nonce = C825FC7C4D539DC74887CECC70884F37 In = Out = 32E55CE0C3FAEA48 Key = F956B879EC7F807F1FCB482B53623671 Nonce = E64F90B4619D93137E6237929EABF297 In = 60 Out = 710DABD24D400F3B6B [AES-128/EAX] Key = C61A0851AB4E515D11525B92E2B9D850 Nonce = C825FC7C4D539DC74887CECC70884F37 In = Out = 32E55CE0C3FAEA48164B122C1BE22D85 Key = F956B879EC7F807F1FCB482B53623671 Nonce = E64F90B4619D93137E6237929EABF297 In = 60 Out = 710DABD24D400F3B6B284EA47F81EBBD26 Key = 8A554F339FC29E76EAC079676463722F Nonce = 86B95FEDD6827A6EF8B17E6C4B2498D5 In = A62B Out = C91C09BDD89CFC81AA4427FE8CD841B5BCAC Key = A3EADDED8E4A7476DC783312CC70F878 Nonce = 8559F44BACCAE49D39DB6A77C1DCB065 In = E67238 Out = B0DC7388ADF2785A4B898443655C356695BACE Key = C1F38AD3298EA3DE3204BEC244866534 Nonce = 43D1D9EF0769CE901A7F0943556D1B16 In = 29D564D8 Out = A11BF86AB2881AFBAAD85D2B8313203262BB0ADB Key = E9C35F70B9D294E9D78D904AEC528E99 Nonce = EE28B45B0F136E06B7CD3D3D0D002EF6 In = 37863FC2F1 Out = 89296DEB6C1C3CEFD643926F474568D71C4D52305C Key = 84298DDF4FAB1B8C2608453F0FEB0BAD Nonce = 3035DB091BE6C0C3E3563B87DD5F8761 In = 9678A48724FF Out = 2013CC564BF1077B300341089DCC23F4B20CA9B1B24F Key = C3D1651AB7A5DDB1E815FA3B91A2EF14 Nonce = C49440F324F5F31DBBC46ABC96624B5A In = C6D04D01D2F78F Out = 67BF2D417058C7A26F446E13BA65171CA34AFEC3F842B1 Key = A342F5559FB3E861BBB3DAD8CBC14964 Nonce = 489EB99930FF1057C54AF33CE7A7238A In = 26C63A9C769DB4E7 Out = 7A1BC9EEC765B7525AF601B682DF05B681818F6637A64EAA Key = D88CD2104394ECBE9AAA9F101B578DC6 Nonce = 0CB244FA0D43A0CD101D5266C98EAFA1 In = A6C0CD7D8555AC3C49 Out = 1A75242A16FE656C43CE8F737F60FA78F95AD18BDCDD2B0E9C Key = 773704610639CFEFA6E1B30F589D7F14 Nonce = 92BCF960D83B76F958E2E5AA616ECFD9 In = 4215211D6CEC517F8925 Out = FB8E6E2DFB3C7FD71DA2CE7041FA36E4357D81471DFB8754FBED Key = 33C0B5F4D5355A351E0C3D835E468705 Nonce = D481CAAE6DED8823021919E31463D848 In = EC23DAB61590F6E1FB49F4 Out = 80F5426BE96A6F7076BFB5A24F080D1FCD687FB4CE1E911A532DAE Key = D7DF4487FAA7AA9FD485E16F25AA27EE Nonce = 266C313CF766C74CB289EA78C735289E In = 168A348A554CC29EC53D4AB0 Out = 65397D2E8EA7E82E954EB36E0E3495781189FF5D2567EC7D3CA57225 Key = 5DE8E05E68E4C3E8DDAFB5A2E0A6A92F Nonce = 400DFEA369E0B09935355A4B6C1B32CA In = CF635CE20D305584C11537C1E7 Out = 023D683A14128FD01704F6A97ABE231B77C30D1209EA139EC60F0FAC6E Key = 19B889E617FADA6EBB6E264FFD6AF0D1 Nonce = 1B72FA92A94F2C6B3F5D6812DF3D04F9 In = 82287737559AC1EF31FDD382D4F2 Out = D0B1B5C3C2339BAB6C4FE1E899613C70460E825515A4C12259D9ACAFAD0C Key = 2B488ECF950B2A8716FED085EA768A22 Nonce = 7F4A7C9CB42F32CE2A388B6DC99D18F4 In = 09C05A1D6AB2961AFB06BD429012AB Out = 14FC9EA106FC2B59595D02C746B59819D3A914D532402389CC4FD9D0573926 Key = B5A870393560724B10918A377F7C28A0 Nonce = E5F26301C19BDE0C99BC8DA8A052DA56 In = 2168CAC31CCF37DD4BFEDD800FE4C532 Out = 4F5777260F776D716DDF5BD445BF330E55B840842EEE4838D7057EC3E95F59E4 Key = 485BAFDED6CFE581B4BDEC8ECE072F74 Nonce = 48FE4CDC23B58E19B0C472F2099EC251 In = A1A540CED8942569B2F5FA365942442CCF Out = DB409FE74B6CB54A7FCB00ECC6926D3CF8599767451E634D425C9C7C253CBD8DEA Key = 38704FDF0CF20334F749860D1F07F13F Nonce = 3E2B4E746157040C97757425E15B5419 In = 81E320373A0E35360990AB4070678E6CE72F Out = 97659AC60D8B8EE21B98F954E9C56B72C088AE5F4CA39721797D1C053E8D69E21C4F Key = 93C41CA3886983F5C6F8FDF18FD5C0B3 Nonce = E248A9343658F34C84E3CF537F650012 In = 97D8CF240D88F651EEAFBF162BF082CF9B96AD Out = 0EAC8A7289E6B9E5C345BCBFC5A3084D0AE6CF14C9D6B0760A1DFFF31F71AB6C3CC88C Key = 3779FE6CCC7B03D2F7FDE0A37E5DE146 Nonce = BA9F029AA2D995ECA82F2DDC3CBC7A73 In = AC817C3EC75DBDBCDF03D6FB4ACF9A40340D8F9E Out = E26112BE7A99FECC557C3D53674E6E670F824FE7784EFCCFA40BC88D4F88B5A29902171D Key = 05E2FE7CE92A97444451D3C101C1406E Nonce = D333040B9C4D5BBCB8B7A6FA0593020A In = 8F7DB0EE7F6D12F29637694950206B5CE9424EED07 Out = 70EA3A6F5DFA46723E4ED47BA1EE5E784DA0971146F0B532D28630453AC7CA713F1BE92923 Key = 30B6CF4FA2DDAE8CD2FC6ACAA5302B77 Nonce = EEF619A392FEAC7DB491E4591088C041 In = 4EDEF8A9C660D2BECBA2B49CE509EBB6E567A47FA367 Out = FB18B846F801571026BD501FFFE67E8D51D6AE9B8379A8676F65E2C7EE0D02E9FF9BBB23482C Key = 6EF35F1EDB02E4C384314A481487C28E Nonce = 1A690BCB595164BFB80580C57D93FFEC In = 814C87C4E33C797A93A77DB1F045996667A1C10D78123A Out = F5526447A82E275E9CAC44EDB940171F9123C3FDA7F55D8586CB574A00AFC12381F40964D096CD Key = D89BD6AD540771D3DD537431D18A59C8 Nonce = C13544BF30DEC01564A03F0E2FE2A208 In = 7FD5E1A1547E1628F736DC7CFEFA9A00E586E02AA98FA394 Out = 2EF4299CF27B80976CE57AE89DD2FE554EB7F00D38345C60DB67CB9C88E078D581FB5A9F66D30688 Key = 960065D92C1A8B61DDCC51B2218127C2 Nonce = 41F0DAF7338AEF1317188EA9D6BF946C In = B234C341F0D5552F75A1C0C917B642B0F8E08C297B92BD31EA Out = 26B7CA59E71E9B7F866C2F04A0A3829E879E59E9232073E3201C3BFAE519F23654B17F07EDC8A20344 Key = F982385DE22ED1592B1B697E262E81D5 Nonce = 807E739C22372D98220E2CD58175A07A In = F67477FC490F530BC502AF52FD9D1BA4C49176EBE194B37249CB Out = 36B043B8C7B08E5B16A73F60C09EF517C14373919C028FE3B430FB61CCCDE8CC4B3266FA1AAA00B25D19 Key = FFE4B7162C45A6EE3E0B1DA0257FFB5C Nonce = AE6247CF1E1B65506D3A02C22C341E2B In = 488E90C2F8642F621A615B362F67EB21BCD4963151D4B255F2325B Out = 39157652A4D31EF499708E065889FD3FAF9BB5C1D8CE98CAA4F62905D7070962979F403E1514CCE6BA8FB2 Key = 739B15D6279FC651A4BC344C108E21C7 Nonce = 3D4E26F58C06A10C93928E9F1BE0D08E In = 638B8AF02A05F6E3A8535AD5B7AF2C5FB83EDFAC7F8DF0820C895131 Out = ACBA840ABC4086D65C676AD70F19532035DD4A724454518391BAF2CD1330BF920BCD19D470C5578D5004F9D1 Key = D3396BA942CCD4B481B6A5CF23DC4E67 Nonce = 491D4BA46EAEECDC998080AE07617ADA In = 9ED609612B72B5E2F04E6D377F436DCFE45B5163486EEB94A31487E1CC Out = A0C71029D7DC4FDA90B823AB12085ECE8592CD27B61743D5C6AF02663DCB3CB27958E4819DE2BEF9893EC06B7F Key = 586DF8D45569F007AB52BB204F2C5051 Nonce = 7DCBBB5D0C934C483C378613EFD31F47 In = 20EC7BE8711CB24261B375FD713002517B6ADF41D8EF3BA8EA3ED7B84C0B Out = 8F969FA4F9FBF293A6FDD11906DC4296EFB87EAD619CE701CBF60487F2C66BA6C281D2A8598E3AB405D1C5D0D725 Key = 28D38A778749BE8DC41996BB847DB497 Nonce = 805F380C9AF0D12FB9D94F9C433FE56B In = BDE3424FB4BF46067A5B09F76BE6F91203ABA18B3BB8C595C9071FE36AF048 Out = D9F1D76E17891B94CACADD217C9D37F58EDC782CC5FB539F59F965A5C443F3965DB7E399467CEB05FB59AB1AD01804 Key = 30B4BA7DEE8315E5D258AAFC8533960F Nonce = 7C23EC1F738DC912BF682164336B8D63 In = 836569924C3AC998F64F43C5292C899A8A498CDDA350A1AA9F329E0EA5CB4A28 Out = 869B404A038ECF556D4251C871EDA3F157983BA4D40974921D44D58AF951F007A5119534C399DA8593FBEABE60BD074F Key = D375C2513D2F96C69B0101ED7991A336 Nonce = 26EA74FC47F422F5BA765FE1283591FC In = 6C89219F127DC76D45896C6A3B527890B5BD95473ED55D8026ADC6546A26B2D6B0 Out = 392E84D3857017287A0A62701D45C2FB9A9949A1292A9C159443297A562CB89A364F85F422EAA7BF0C046D60B5F02B675A Key = 04886B4DA138C35117EAE18F96A82CDF Nonce = F96E9898BCD745FE810EF44A1181BD15 In = 3997AA01FBF84919CD76B0DF279077ACC79D495042B89F4E3FAD42AAC9F6C9028D73 Out = 6621F16BA0DAA99B85C34080B73A09B81A64DBC6EB9E237FDC3C773D41BBD2514CADE62633D626881F8685331B5A0A656711 Key = 5406C6AD9840420F75B75FE6FECBCAE3 Nonce = D78C863B545A82AD6A01A50F4BDD6E9F In = 50B5DA3F355434BE51D36199C8834F4193CAAAED89103664ED20A9A4F481F24436CC836B20B829728B8A0B530E5A94A1243E8EAD4FC4123CE4BBE0D83CD21C729EA0DDBE580630E3913B379F95CB40BA0ACE67599279957735754F71476CE4E50CC1A364C8D447590F7EF8A54A385F Out = B08CEE141F8B1822F2C1EE4E0651F8CDBCFC095768EAF76A5EF2F7F012DAA30EF7176B74264A92FBDD0E4E9CB475DBA651E1B51992716F059005C3F75022DC92093ADE8A275A796D387C13C11328F1F0031A36757CF5986002F27E537367A290365C026D58CA21413390E58B312F264D25E87B6CD94D13E048B694A19F8416 Key = 8935B9BC21A19E542C16B0D8F8AE2D7F Nonce = 78D5A132853E1C1175ECE02AFBD1D084 In = AF47A39628206AA2A9A4CC539AEF077B31DC9AE5437D4021F279441333ECE8E2338B785BABE2FE5587CAA821B9AF9DEA8C37CFCFB40FF0A6 Out = 5E967714597273C7A8AA4F69314D2A1F75054F1110847DD421674F07FEA712BBB67BB45DFF9EE7264354D750D73E3C6A773DC7AFC2B88737CE4C215EC87FD4AB064707DD9B624436 Key = DB82D133768464CB2D873E54FA2C8EF8 Nonce = BBE7581AE1BF49DC010FA69E0546EAE0 In = 2ED861F5F11D7D517C138AA01F61D0A007D000DB97CF5B2FD6AFE5E18558F4B33155A922722673EE3AFE8E595F5FFA672FFA42C6CA9DF6A04C Out = 147FDA2A8847B0265EF27976DF944F11BD0272021BB0269B787B6C8BE6782B214DF59BD16F569142460EE80B9B6F38C980F81098D5A4C018EF6A5CD84E4DBF931E623D74D3DDD8737B Key = 87D663970DBFC792C78915C3C4757899 Nonce = 66A7C881A043BE46D7DDDB421A2A2CA1 In = AFE2204DAC92FEF378DDB89A917B5A2AC94C22AD19E1EFD71EB97E4A877910375C308408C283FC3B60B4D5F12F2F1BF87B3DA6941F956B3D4FE9 Out = 7AB5CAEC2D40209B3E4302BEA036D8536DC8D7E9D8FD23607421D122914B4E13E1658B9924916C3D0C6B39F4B0822A98A7A7789A4E59CDDD350BFE3E3193EBAC56303350B1D061910A9B Key = 2805F50D0582B00A28BD99650A3804E2 Nonce = A15DA66012662AC6E94BC0B93DFA8865 In = 638BC9B9EB565BFD0BFFC256464CD23F0035CC25E5FF8DA305A60C8E3C4D9F9FD86959C3BFB4C0CAB48320FACFF239CF Out = 22EC2594915889C9910FF444008035D42E90F31624F6D6790B1399FCED092BCBA4C68CB9F648D816A9391D8A292E4AFE20096D856F36A23D9F18D732E1645BDC Key = 656AFF6B9A28680BEF2658F7A88BCB5F Nonce = 6A43B623FE368BA438AEFE376699D9CB In = E6CB34ACA3A0D94429AFEA82BAB4FD9541A2ADCF5D053029FD70C7BE4D088233D4B6DF7757B9BB8068A502225AFFB89BA2 Out = 824E5010A54C9DD6E08E0DB38A1B1DE2DD2197A00D094A0AD1F49A8D9ED6A01FD1DEDC021D595FC87B54CC74665FE75A2D873241D81F1163E6EBB948DE7A18438E Key = E2C905428F0608F292C3FE4BED132B78 Nonce = 4C02F8A1754CE2CC8865037ED8E264BB In = 273DD7B96BB7A1CC9552E0EFAC43E5E58707BDF5D3CA309F7B313132F838E91F75C0D8E17779AD0CCC8DFB78D1E15D58E81A4EBBE47E5B60AF8C92A8C47BC7393BA01AB219C7BEE555BA5E269BBB7E83D6CC3FBA4B9A1AFA26ACA2EA276A23620A3E142305D3095A8D67802822FFABF8CBEAB31684CD11AA7AB394A11DB80427F6184BFBEB545678BBD6A0DDD54CD6A13689B7BB56C865D07CFA7299B276C1A88E0CA37A60F9F21BD093F8A5DFCE461557FED0AEC6367E4230F0DCE2669D8AF5A92D6F09276124F7F41C9CD3EBE3E942E1B9F0A7EF6FEA1F5FC601C6638BBB0CB92A15E08B39D78055735340563C8337F673DFE5 Out = 4A0F85EDD82B4E39F9185ED4E585187B51D3326DBA5FCB83CB3ACD36327109F8CCE17CF5CD152DB941E3480AA22AFDC51562246CD99DE0423F6E9505349D547BC39343B06025EF76F4C6C301FE1917F391433BC8A7F67A007BB7E8A238D59F5A29C6B5519165B2E05E3D04493F5342E9E917C65088EF56E7C0A0A0703E3AB949F86D3ACDFF9EE70815CBBFB1ADBED7F2A2C565DECA76D99FA3941719236D7B572248D8A4B2FE8DEA33C7E909C132E3D107A625FCB2E088201F3AD33A37FB44114316FD7FF1B161777FEA4391E51D102D1884671B0AB994B8BDFA91AEE09105FB6BFE881FC4A67B8CEFE2E7E4DBAF844E896DFD1C4164243CB888765C58C1961117A6F062 Key = 87A268D1650E08650328692CBC9930E9 Nonce = 61EFA5A996D93EA8F7C68AF6BA653841 In = 956B7E15A1BF4DC6A9CE6DE460513D43F45191E0D1997ECA88327B01487291DDDE10F27FCF3F45780EB35C6E0499B1F9EA43D9BBDC5785648A0066D273F7B05107A2D0D6E2154EF0C8AA5ECD430FC62E529FE92EF76F93816FF953E2F00333F8A603CE88191D78E1C7D6AE0BE57439381422660B91F98C01F2DFE3E3E317DB891AA91133C689158E5FC3994438D27C4CF4E35786DCE387CFC26AB2A5818D2E9C363FCFFDC8E48B27A8246CE0F6E82CEACB8370A866F777286229CEE3B6FC7FEC3C4FE90433742CDB9898BB8E80E7794C6AE9F4D0E16BF94394C7264AC3A636FFF52004289430042DC8BFBB48A73494111E88E2FFF3DB42 Out = 308B1A08871C3FF57397A79639FD87A99EC36711A83FD2B3250247FD3125C7FC1681F6AD15B0230ADB4ACB9B3C735C287A2C530532BA1BF62DCC369D110B31C2DB627A75B5419B5177956E64FFCAD6C83A391B0C2023F11FB13066E6D49BFFE2FF12EE0FC05706C001401204FE70C739F0836F0175DD77AA37BC308737F7FD3396FF25C6D5E6BBC9487D79D4C3F69817940A9EFC4FDB3FF3BA85BD36B4F5788818B29530D3F0BE533FBFB9F175DAFBC920D5B5EEB62BA02F339A7501404E52BC9DE4BBF27702189731CBBB49BE2FBAFA43F3A79BF2DE147AF3C12CCBF2FC15CFA135F5EB4603A9C8158B78E600658C102EE637F77471E0F621F2EF8BDE7BB1131164DBFACB1C23 Key = DC851BF2DD4E3963CF3ED171404FBD08 Nonce = E4CD8527D23393DAEAD16133854B1661 In = 169C8E816CAB0C159AEBF19C954B87089D29C5386B761D27A028DBBC2518F33BB481BC202DC836C7B327634872EB500F1415477F8B64A72B8D82E8B29BDBED4F5CAA708972A65026CDB46E3F9FBF4FB3D4963360FBDA8B885C733AF74E2747ABD1B734445D856A2A39D869D897B88B6C4FBECC4A9857D2F5CB0CEC193333C405EAF949477EB371B78BDB8F23931A8FE2D95B2C71B2FE667D0A53973E865B4371548CB8D23F2A89CA0518ED98337C7B0CD7A77D8AA6E407B0379EEEBDFA312E4EBDE721FC11AAC716C3B4AEF631290208D17F9277639A279A38165832478681056DA2017E4CC8940F7D4305AE6C07B63D8749B4EAE3 Out = 93550CACF92B81F03129D4DA45D0B6A217202517FF34CACFF291D9FA51793F06D020E63F9E54042D0E1180E131C805D3C392603316D8B990006379C54F51506F8238D4EBF4F78AE95753D852AB7F0D974A16F374E20424B4E79EF83D3BF78A83DE23F50078CCEEB7C8CFD887AA6EF3ED004C4F1048A608C0EDFB8FE56862E533FB0BC90BB19175BA99CD747050F6DCBB229C3B11F89054B9A78A80FAECFF68211F1BDE2EEFFB2D690602478184E5C51B902C246DE285E15FEBD6AC0B7ECADFA9153F982434397AD0FB4DBE4DD5A1803234F00B0894C8019741F89665D3D51587792F5BD7142C739221A1C2D4A2C86BB8782F1CF7912C32C8D3A10BECB4C7AAF01DF64C2F90 Key = 251AD494D64DAB08B66A96CB8C7876A6 Nonce = F87A825C39326949EB19EE5BD30CCBF9 In = E4BF7D594228D3CB4D7E9EC6397DB3325B61D7C1437D0634C62FC33D9B932B7F52A8D894D0AB601E29FEE4637B9795D7F96D983CEA9E70B0CD33EE68C619E718C1C0AD916B0DAF950B93F8872B8D5E24FAF660E494D095610483CACA9CB1E35D7190EEDD9D9E72A8316A2F5CF78D80F283E0D617B16B79B5EE437F8AF462E766F2D6438F74B538A51F670216F582087863DF90144A09C9394C48C340ABABA69D81E92DF59E659ABDCC9CD4C11FDC3A82BBCA9606D35F3F1FA7025F52AD06F02EEF1D238E82BE4B4E5A1F1079FC4AFBB71491BDE7F0FC0698FF65EAAC6BDADB5BF7FEE979BC34C81754D89050228C07361DC51D0EC123A6C088906DF46B484F624638DC036CA41AC07CAA109E3618D454DDF1629E14085F9C98CC900314DF665A17425D84E6774462225500586DD4AC4AC50EE8D9164775AF1306B227E51882FD5ADF814057C5A2791AA2D187767ED13B8CBA14A3018A521590043C751DBE72779EF3B8F5B95A6ED3FD3F5B73BD2CAF4AE6C3EDE84D3FFDDD43395360F8C5D896B9908B72EAF945E738A05BF6CD0A40B3CD2D9B1B6C98F8AFD24B10CA11E860CA78EB3C62E4814A1C22A512EFAF52A27C7F3E97EBD6909BA8DBAB72EC93D2B60BBDF26DA174B7BE965CD0850B232788A2651F8E3CAF29E48BD4577767292E72E720DF889497462AF317AFFF3AD787DC3CA66A7856935DE167B458CEDD8640C4A7204D3BB79366AAAA15A9E4EC30C129D72BA12DBFFE0E26B266F590ED35549455A1CF0C3535B7DF4B60C43791856068B002956F00A396B3098B43F6C0978A16395A226E8FD94DDA3A1112CB9672334774C8B6756B4C2874D76B6B9802F5AE3B4FD0A9DFAAF7B9E408CBAF9F3EE2E6B2AA9C2715E94F89C0BAF458BDEA06F839D7A2188199D265A19D1440DBF6268EA0C3B5B5AC053E6CBF33C57C1DCB7556A2176F23B0418851DE9C92BA92B848327BFDE727022694C259593E7624B3CCC7CA3BEA7A7C73CC5B0F5E15A2165DD4925ABCB95DE24D1F3BA65DB1CB117D92DBB97C5635EF2290FF80A5A1960275285D31E2BA132FD94ED636FFA1477D332336AF796B9F9BFC9E1BA13FB1A4B4DA01E6BCBBF9EB9448C1CA476212C49535FA45AE66E44962826403C115A775EFA85BAB635597F79D58C2E4BBD4A95009A395B70979006BFB646FBC79163269BF8D1422E2AB1A7F04DC64BFB00D0FB9B0A570BA1E70 Out = C437723C80E3B32AEEBD6DDE08D614312CD3176E8BFA8650EAF3A34DAE3B72769F823BC48F88F42AFCBBBDDA0534E8D2C9BAB65A83939668C982A1CBC1B826B259D83FD6505381BA99B1C850D5EFB5D0DBB077F4AB021246366292971BE121C265BCAB722A6AB5B7CB7D55C91F9FD5B3BD59A8436250F17D110B5B2588F2DACC98EE60884436810570A61AF2D7A424D4D597004D175B650F9EDE8D254497490905E5AFFD31DBC4FAE7EEF180B07B7D9D2579C1A140F63F31B0A2847043FE6F98556A3F90DE4C28F858581F699ED3B6E3E554DD0FE91954FC067BABC6AC62E31457B299B9CF5E061A9B6ED628DFBDC164AFB6560847389EE0257A7CDE811292BC761E4D66D2CDEDD2C6DE0333CF8ED6682185AD5B6B1B05526338C6EF72D02A0346C4527CCB3B1E3484B83FC7AFC7BFA69B111980FDC53C70BE72F3BA7F8B51A363CD590A988AEECA67265C9BB813142F34D0B2FD20B06F39C4DE7A00D763E2B201D90A8FFCD199EDE60EFFFC0CABB648C1D7F15323F0E9BC13EABD1EBE99BCBF970D0AF2501826E37D222EF4D9AFAB22EE99972F2A97C84175AAA49ED2CEAF340213E29C7A88AF38F2CAD42C2AF49937262F3281B806E343AF3ED0C7535725A5AD0CACBEDF519F69CF820980169FD6DB67A165F3883216E227B07E3FACB1E27954FD1D08A2EC6472B0B1F7B0D6AFA2C616F6207E7A2C4444C6F952268BF73EDBEB4657AF472D08BAEAFB237F118EED6CACD80E24ABEAED97D1634367000778C0E095994798006D874999E542F5F479E08AD481D211A7A4D51D58CFDC374414F6810A5AE08573A34D914BE3176CE7C3699D83A06FB9D8585A03854CC38B8CFDF5CDD7C888790A04D2E7F2D22099A9120CE0C37390B9AD918AD0B41C4239D2BBBAB82B98E59920B173BCCDE0D48FF860F91216C4A7E68E05DAF7F53EB7641171D183C976C6B9CF1F57B2E48F88BD5E8F5558934245CBFBEE365A2D457B2EA5E6CD0F39AAA154692EB604B2A366B53C5893C04568BA98B4A0AFA8B6DB80C6D66E9C93DFFB1BE584ED1CC111D315823F25D6BFF9367EA584A3A0FC62788D7D385D0814E984E6EE556F83D01584C8DE0656DC2A89A08BBD268F0644C63B80A5BE57DEF71566B677596557D4C218DEC8A7D2611FE6FA07633C558FF372308F5D680C0F9858362C2B2B8C2989F19FD8411C10B6E37A647A07D0B1D5E681E25902C36231E9E5E812B623D9E72C23518F082EA48C # Following EAX tests from Wycheproof In = Key = acf877a5aa71e794efd6dc82d5b1a155 Nonce = 4e301710ae15b2f0ee6335d774741f7e AD = c0e0f00a919b7652 Out = eb3dae1fc33be95848da9fd24e7dbae3 In = c3 Key = 95d8e3675bbc3b96befdc5efb7433a68 Nonce = 0d40fdefd9289e3a49114454b3c4a5f4 AD = f2 Out = c5814dfc2f4ee1719bd5f1d5a649174c1a In = 5810842d Key = 2eed51af91b178b26e9b53c8877a7af6 Nonce = e78747ca46cb9f2068e07717d5226e8a Out = 24245c5bb54aa8bfaceca3665867fa2d7de1653d In = 5ae11bb3b7d60e55 Key = cb782da180e97023530d1612e2287f0d Nonce = ba641ebe03057b387dd3132e0c7a3853 Out = f6f64fa858708b8f445812fd75a9639f635045fd5972b820 In = 54332ed26cd966761710ea58a8f248 Key = 8b4457d52e5c04b38d306f8f38480e97 Nonce = 3f9d6faca5dd97eb1bc74e1954304cca Out = 3ebbf1fe11e2f454e0ef587fb42a7588e1e32ea788cae20d1700584f448814 In = 82ce1f2934dcafe9dee7e0e7cbfdfcd0 Key = 2892cf62d2cc0e8e9c796624e05920f5 Nonce = 8a0da6d1c4b7a4f426ad62f6829cc310 AD = c3ed66484eb367c8 Out = c374afaa42d9497326af332f42d2dee8fb478c82a2b2567b0ab9597c93f137cf In = e0c993ff5d1d00b4cbee523a1df01db011794d54ab7a504c Key = 463d89aadfa7d8158dcff9b9c3fc32aa Nonce = 356ab4709b32fc85ff82f40561e9f08b AD = 5ab01a3bfa141f8d33720bd1 Out = d34bc706a9d7a2be6c2d8805cec2fac270ec6d17844b0911accb612cbb3b373438c74c1280445359 In = e9dfb2897e44236880baf166fa62fa5b8a4713aa981dbc3fe6cf65d9f0c30f47 Key = 54617abbeb90fff7095b26af0e596064 Nonce = 2621c97c4fe379d9d42f04c479ae1bac AD = b6b29c2fbe29dcd2 Out = 212263116062443db28d6abd2c3bca880ea4d178282247fffbc10532d40e9cea6f580fdaca33d446dd6f38a4425be844 In = 0000000000000000000000000000000011111111111111111111111111111111 Key = 000102030405060708090a0b0c0d0e0f Nonce = 3c8cc2970a008f75cc5beae2847258c2 Out = 3c441f32ce07822364d7a2990e50bb13d7b02a26969e4a937e5e9073b0d9c968db90bdb3da3d00afd0fc6a83551da95e In = 0000000000000000000000000000000011111111111111111111111111111111 Key = 000102030405060708090a0b0c0d0e0f Nonce = aef03d00598494e9fb03cd7d8b590866 Out = d19ac59849026a91aa1b9aec29b11a202a4d739fd86c28e3ae3d588ea21d70c6c30f6cd9202074ed6e2a2a360eac8c47 In = 0000000000000000000000000000000011111111111111111111111111111111 Key = 000102030405060708090a0b0c0d0e0f Nonce = 55d12511c696a80d0514d1ffba49cada Out = 2108558ac4b2c2d5cc66cea51d6210e046177a67631cd2dd8f09469733acb517fc355e87a267be3ae3e44c0bf3f99b2b In = 0000000000000000000000000000000011111111111111111111111111111111 Key = 000102030405060708090a0b0c0d0e0f Nonce = 79422ddd91c4eee2deaef1f968305304 Out = 4d2c1524ca4baa4eefcce6b91b227ee83abaff8105dcafa2ab191f5df2575035e2c865ce2d7abdac024c6f991a848390 In = 0000000000000000000000000000000011111111111111111111111111111111 Key = 000102030405060708090a0b0c0d0e0f Nonce = 0af5aa7a7676e28306306bcd9bf2003a Out = 8eb01e62185d782eb9287a341a6862ac5257d6f9adc99ee0a24d9c22b3e9b38a39c339bc8a74c75e2c65c6119544d61e In = 0000000000000000000000000000000011111111111111111111111111111111 Key = 000102030405060708090a0b0c0d0e0f Nonce = af5a03ae7edd73471bdcdfac5e194a60 Out = 94c5d2aca6dbbce8c24513a25e095c0e54a942860d327a222a815cc713b163b4f50b30304e45c9d411e8df4508a98612 In = 00000000000000000000000000000000111111111111111111111111111111112222222222222222222222222222222233333333333333333333333333333333 Key = 000102030405060708090a0b0c0d0e0f Nonce = b37087680f0edd5a52228b8c7aaea664 Out = 3bb6173e3772d4b62eef37f9ef0781f360b6c74be3bf6b371067bc1b090d9d6622a1fbec6ac471b3349cd4277a101d40890fbf27dfdcd0b4e3781f9806daabb6a0498745e59999ddc32d5b140241124e [AES-192/EAX] In = 7537f3e4cbe228468a7837c66aec8a9b6033cba4f1b3d8 Key = 7c74da83b1f292b869c891c80850e85f8237412e13a0bf3f Nonce = cfab2c573a0e723613e6e5b58787af60 Out = 98a55f7db58fde8ed8bc00c01c97a6e5bda137b03e56e0dddfbe396c44a14646cbc89979f38736 In = Key = 03dd258601c1d4872a52b27892db0356911b2df1436dc7f4 Nonce = 723cb2022102113018dcd2d204022114 AD = Out = c472b1c6c22b4f2b7e02409499aa2ade In = Key = d33dda72649575e42d6eb1f3255e686084b8a9cf4480803c Nonce = ad2a1d2ef236dfaeb109ab29b1084d63 AD = fb9c0938a5d317fad5f43edc Out = 6edc358f22358e1d328c4c1cd98184c6 In = abcdef Key = 03dd258601c1d4872a52b27892db0356911b2df1436dc7f4 Nonce = 025f3d2286c143976412022102696708231208 AD = 8917328de211 Out = 520f4f2cf1b893ae3ba8ecbac3a08ea57de2cd In = 4e43dbebe316b7d684b56236fdd928dd Key = a36eed1cb54130f547664c184c249e777a3d8ba2e2251b58 Nonce = e9587847b1e81511e0643f7dda5b725c AD = 80c7cb954463b6067b081ff66b1d40cc Out = e2645cd32a6e8c1e7cd1991d879b335756f848aba8e51f0b56712bb2889c4783 [AES-256/EAX] In = 1111111111111111111111111111111122222222222222222222222222222222 Key = 0172acf299142c001d0c231287c1182784554ca3a21908276ac2c92af1294612 Nonce = 000102030405060708090a0b0c0d0e0f1a1b1c1d AD = 77922d34e452e0a40962873d22901dd22ad1c303 Out = 5917879b9fa85f4007b7bd0cd46f067d5a7bf287f19dfcc5475c95a4acce520a4c5df804bc091a3b5d6c838b7e494571 In = Key = 0172acf299142c001d0c231287c1182784554ca3a21908276ac2c92af1294612 Nonce = 696708231208 Out = 7c8f86f837a4f72c574678d92f637f07 In = abcdef Key = 0172acf299142c001d0c231287c1182784554ca3a21908276ac2c92af1294612 Nonce = 696708231208 AD = 8917328de211 Out = 12486c87bf9a7f22fa65a9493ec0f57f8070f5 In = 13d106d7be0890093f44a457d4cc5309 Key = db50934278a8d8101d1c538acfbfaa13aba9fe53408b6205a0c996d53cf04e8d Nonce = eaef04607a36b2e1b1c539bc335aee9a AD = d50e7dbdcc7cf92822dd9dd762a0fc12 Out = 2202165697a2d21316c5f65d2aedb3c52b5567b3f8a25e247cfda1f02bc6cf6f In = 17672288fff3e93a45b3b951bbcfa8a4cb Key = 1cd28aca6542a4df7316b2c6e9232a4e2cc88cf7aaece33eec7da32ab514051f Nonce = d219298abb115ccbb473cf8e2da9671a AD = 9c504ab2e5ce0f46844833aba6a11c9186e500239460bb26 Out = aa518b62c5422e56ce393951aa0441e99df8cafb1555d5a30c90391bb9272c32b9 In = 1111111111111111111111111111111122222222222222222222222222222222 Key = 0172acf299142c001d0c231287c1182784554ca3a21908276ac2c92af1294612 Nonce = 000102030405060708090a0b0c0d0e0f1a1b1c1d AD = 92d3e42e0409273291d2dc034450 Out = 5917879b9fa85f4007b7bd0cd46f067d5a7bf287f19dfcc5475c95a4acce520ae632946e4999be20159977431bef0454 # Following EAX tests from libTomCrypt [AES-128/EAX] Key = 000102030405060708090A0B0C0D0E0F Nonce = AD = In = Out = 9AD07E7DBFF301F505DE596B9615DFFF Key = 9AD07E7DBFF301F505DE596B9615DFFF Nonce = 00 AD = 00 In = 00 Out = 4757C4AC75A42D05260AFA093ACD4499ED Key = 57C4AC75A42D05260AFA093ACD4499ED Nonce = 0001 AD = 0001 In = 0001 Out = C4E226C5AB00325306772E6F6E4C8093F3D2 Key = 26C5AB00325306772E6F6E4C8093F3D2 Nonce = 000102 AD = 000102 In = 000102 Out = 16177B852260F91F27898D4FC176E311F6E1D1 Key = 852260F91F27898D4FC176E311F6E1D1 Nonce = 00010203 AD = 00010203 In = 00010203 Out = F09F68BE700766CA231643B5D60C3B91B1B700C1 Key = 700766CA231643B5D60C3B91B1B700C1 Nonce = 0001020304 AD = 0001020304 In = 0001020304 Out = 8472705EDFAC4C3359326EEA4CF71FC03E0E0292F2 Key = AC4C3359326EEA4CF71FC03E0E0292F2 Nonce = 000102030405 AD = 000102030405 In = 000102030405 Out = 14C25EB5FD0D8DBD749CA79CCF11C1B370F8C975858C Key = 8DBD749CA79CCF11C1B370F8C975858C Nonce = 00010203040506 AD = 00010203040506 In = 00010203040506 Out = F6A37F60670A85AFBD1D5921557187504ADE61014C9622 Key = AFBD1D5921557187504ADE61014C9622 Nonce = 0001020304050607 AD = 0001020304050607 In = 0001020304050607 Out = 1AACFEAE8FBAD83382F477325D6F76BB81940AE25F9801C2 Key = 82F477325D6F76BB81940AE25F9801C2 Nonce = 000102030405060708 AD = 000102030405060708 In = 000102030405060708 Out = 069414324EC293697CB980E21C09CA129B69E9032D980A9DC5 Key = B980E21C09CA129B69E9032D980A9DC5 Nonce = 00010203040506070809 AD = 00010203040506070809 In = 00010203040506070809 Out = D8174DE9A2FC92B7DA9C1E42CC58BA2C8BFD83806444EA29DB61 Key = 1E42CC58BA2C8BFD83806444EA29DB61 Nonce = 000102030405060708090A AD = 000102030405060708090A In = 000102030405060708090A Out = 2C087DEA30F8B7EE51099083DB400A080C4D43CAA6EC3F1085A923 Key = 83DB400A080C4D43CAA6EC3F1085A923 Nonce = 000102030405060708090A0B AD = 000102030405060708090A0B In = 000102030405060708090A0B Out = F36B93C272A703D3422C6A111370C3AF2F3392916364BBBCC2C62EC1 Key = 1370C3AF2F3392916364BBBCC2C62EC1 Nonce = 000102030405060708090A0B0C AD = 000102030405060708090A0B0C In = 000102030405060708090A0B0C Out = A0F33477BAE2E28E6747AA3193B626DC719528CAC65DB0EF94E35422CE Key = B626DC719528CAC65DB0EF94E35422CE Nonce = 000102030405060708090A0B0C0D AD = 000102030405060708090A0B0C0D In = 000102030405060708090A0B0C0D Out = FCF5193506052E8BFA095C1A5205F5BD02E0B3C91CC7D6FAAA8A9A76CE6A Key = F5BD02E0B3C91CC7D6FAAA8A9A76CE6A Nonce = 000102030405060708090A0B0C0D0E AD = 000102030405060708090A0B0C0D0E In = 000102030405060708090A0B0C0D0E Out = 3797D7F8599B8EEAB39C56241880DC0B70003E77146B903F06EF294FECD517 Key = 0B70003E77146B903F06EF294FECD517 Nonce = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = C4BAD0E0356FFD369110C048D45D81BEDE7C2B1D83BE2CC8EA402ABE1038BB79 Key = DE7C2B1D83BE2CC8EA402ABE1038BB79 Nonce = 000102030405060708090A0B0C0D0E0F10 AD = 000102030405060708090A0B0C0D0E0F10 In = 000102030405060708090A0B0C0D0E0F10 Out = AF5C358BD31CDCAC2F0EA5252F1C3BE1E42D700986F93B22DFE6695C2A243B4E42 Key = 2D700986F93B22DFE6695C2A243B4E42 Nonce = 000102030405060708090A0B0C0D0E0F1011 AD = 000102030405060708090A0B0C0D0E0F1011 In = 000102030405060708090A0B0C0D0E0F1011 Out = 7DEF9056FBDAF491D7206B26B19DEF617AA1E71A7D00BE972D85C77931D7591B2151 Key = E71A7D00BE972D85C77931D7591B2151 Nonce = 000102030405060708090A0B0C0D0E0F101112 AD = 000102030405060708090A0B0C0D0E0F101112 In = 000102030405060708090A0B0C0D0E0F101112 Out = 6E9B2C0A90BF9D38A6EA3B5D2B9B2D97F938EB5B483D7F15C39602C2918181E57DA341 Key = 5B483D7F15C39602C2918181E57DA341 Nonce = 000102030405060708090A0B0C0D0E0F10111213 AD = 000102030405060708090A0B0C0D0E0F10111213 In = 000102030405060708090A0B0C0D0E0F10111213 Out = 7C5F68DEE9BBA3B04F11D5FC7C9C7FE6E8B5025C0AE6A12D37A9C10BB1A494E16705DC05 Key = 0AE6A12D37A9C10BB1A494E16705DC05 Nonce = 000102030405060708090A0B0C0D0E0F1011121314 AD = 000102030405060708090A0B0C0D0E0F1011121314 In = 000102030405060708090A0B0C0D0E0F1011121314 Out = AF0A886BF673BC72045FC074F06A0176C96105E2E606B2DC9A2868C23F86D710E01E37E07B Key = 06B2DC9A2868C23F86D710E01E37E07B Nonce = 000102030405060708090A0B0C0D0E0F101112131415 AD = 000102030405060708090A0B0C0D0E0F101112131415 In = 000102030405060708090A0B0C0D0E0F101112131415 Out = 5F228A986DFE4301EDBAF07A02E114F1B30932995CD174EBF68627C78B1FD024A59B56B2A8FA Key = 74EBF68627C78B1FD024A59B56B2A8FA Nonce = 000102030405060708090A0B0C0D0E0F10111213141516 AD = 000102030405060708090A0B0C0D0E0F10111213141516 In = 000102030405060708090A0B0C0D0E0F10111213141516 Out = 911322F60555118CBECD8DD82F186AC19514316E8D48BAB6A8BAF2F175CD0C71B63B1EF37E185E Key = B6A8BAF2F175CD0C71B63B1EF37E185E Nonce = 000102030405060708090A0B0C0D0E0F1011121314151617 AD = 000102030405060708090A0B0C0D0E0F1011121314151617 In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = E7F52730CFB808EFDB376A5D5DF31A7EF8292DC5FC37E9BCBA2AD158A2D2E5CE01296402B592E1DB Key = BA2AD158A2D2E5CE01296402B592E1DB Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718 AD = 000102030405060708090A0B0C0D0E0F101112131415161718 In = 000102030405060708090A0B0C0D0E0F101112131415161718 Out = B3F8D7CA47D8D86E94D670AFBAFA3B8D9E186C97DC029D4705709D2D2B9975D4729C19D4EAC430E65E Key = 709D2D2B9975D4729C19D4EAC430E65E Nonce = 000102030405060708090A0B0C0D0E0F10111213141516171819 AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 In = 000102030405060708090A0B0C0D0E0F10111213141516171819 Out = 7178FEC027AFADDC2C03518E75CF34D207CAC2EB1537A0DBA520A315F034CE5E66601444402520F55DE2 Key = A315F034CE5E66601444402520F55DE2 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A In = 000102030405060708090A0B0C0D0E0F101112131415161718191A Out = FC230B2B8522F53459D0B968421469BBA7E683ACB0190393B2870F48679A78E470E175CF3D3E9B46CEDFCE Key = 48679A78E470E175CF3D3E9B46CEDFCE Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B Out = 35A641127C78C721ECDC50866C21637FDC9515E41CE60F09015EA7130062987222F6412B7AAF8A9ABF6FBF98 Key = 0062987222F6412B7AAF8A9ABF6FBF98 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Out = 3D42D6C113421743C08A6F682CFA0E517D5531BB66241C02EC4DCC26F7B1AAFE11FA2D6E0C870177DDD7F98FF0 Key = B1AAFE11FA2D6E0C870177DDD7F98FF0 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D Out = DAD065B4669B7C59C8392D8E7BD7E64BC01CEFFF27E335B25A328D356F0E8973B9B9ECF26DAB58CCF0787EE928E5 Key = 8973B9B9ECF26DAB58CCF0787EE928E5 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E Out = EBE626F9E241FD233D9781C359430C982667AA26921B62E98FAEC502C01B0B2AC0D7052A2CDCCE8E26FEA7595198AA Key = 2AC0D7052A2CDCCE8E26FEA7595198AA Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = 64D842B66796A797C2B4C6905742FDF2148FFC445E192F9E03B53810C082F7889778B345EC12D222DCC6DBABD2651750 [Blowfish/EAX] Key = 0001020304050607 Nonce = AD = In = Out = D8C4C23A6AC0B7B7 Key = D8C4C23A6AC0B7B7 Nonce = 00 AD = 00 In = 00 Out = 2A5E0E4BDDB60772FB Key = 5E0E4BDDB60772FB Nonce = 0001 AD = 0001 In = 0001 Out = 76957581B16CCC9C45F1 Key = 7581B16CCC9C45F1 Nonce = 000102 AD = 000102 In = 000102 Out = EB14C86223A121CFA216C7 Key = 6223A121CFA216C7 Nonce = 00010203 AD = 00010203 In = 00010203 Out = 5A5C809C4A47658796337D6A Key = 4A47658796337D6A Nonce = 0001020304 AD = 0001020304 In = 0001020304 Out = 8BC2041181E1FBA8DBA00571FC Key = E1FBA8DBA00571FC Nonce = 000102030405 AD = 000102030405 In = 000102030405 Out = 89C666F015FA2B4A76A0E699FCFE Key = 2B4A76A0E699FCFE Nonce = 00010203040506 AD = 00010203040506 In = 00010203040506 Out = 86C1FA92484AF631B3B738A261D6F5 Key = 31B3B738A261D6F5 Nonce = 0001020304050607 AD = 0001020304050607 In = 0001020304050607 Out = D1F401C145C9328B4C4A045EB489F59C Key = 4C4A045EB489F59C Nonce = 000102030405060708 AD = 000102030405060708 In = 000102030405060708 Out = 70C9C7753698324A73AB298B5B20567EB4 Key = AB298B5B20567EB4 Nonce = 00010203040506070809 AD = 00010203040506070809 In = 00010203040506070809 Out = A50D9D88DC101B6DC8D2529DFCBFD13B8E6C Key = 529DFCBFD13B8E6C Nonce = 000102030405060708090A AD = 000102030405060708090A In = 000102030405060708090A Out = 7CC2885C2BE79C44F28FF2566255022B40C81C Key = 566255022B40C81C Nonce = 000102030405060708090A0B AD = 000102030405060708090A0B In = 000102030405060708090A0B Out = 6902D58347C29250EE07981C34619AF18E14C690 Key = 34619AF18E14C690 Nonce = 000102030405060708090A0B0C AD = 000102030405060708090A0B0C In = 000102030405060708090A0B0C Out = AB6C3C4AD3EC45143392B642DAE6D2DD323DA175BB Key = E6D2DD323DA175BB Nonce = 000102030405060708090A0B0C0D AD = 000102030405060708090A0B0C0D In = 000102030405060708090A0B0C0D Out = 7065B28BA8AB67B2FB7B6D5E3FAFAEDCAA54F4B0772F Key = AEDCAA54F4B0772F Nonce = 000102030405060708090A0B0C0D0E AD = 000102030405060708090A0B0C0D0E In = 000102030405060708090A0B0C0D0E Out = CBBA14A74AD4ADC0EF036EDAE42D51F2BFFA4D81BAC034 Key = F2BFFA4D81BAC034 Nonce = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 60A315193F58144F5701D547C79FEEED912FDBDB05467DF5 [Twofish/EAX] Key = 000102030405060708090A0B0C0D0E0F Nonce = AD = In = Out = DB0C02CB069E3773296D3BD4A87A381B Key = DB0C02CB069E3773296D3BD4A87A381B Nonce = 00 AD = 00 In = 00 Out = 997D21D19E9C440F68E99F1F2EA2668694 Key = 7D21D19E9C440F68E99F1F2EA2668694 Nonce = 0001 AD = 0001 In = 0001 Out = 0696EA590EC417C88E23FD23917F9ECFB0C6 Key = EA590EC417C88E23FD23917F9ECFB0C6 Nonce = 000102 AD = 000102 In = 000102 Out = B9B08282D4C9B68DDB02C906496413E13A2D68 Key = 82D4C9B68DDB02C906496413E13A2D68 Nonce = 00010203 AD = 00010203 In = 00010203 Out = D6B29D745BCE5CA4F662E883BF7FCAAE5FB2CE01 Key = 5BCE5CA4F662E883BF7FCAAE5FB2CE01 Nonce = 0001020304 AD = 0001020304 In = 0001020304 Out = A59C9CB009CBFB04226D1029A7EC9D64A48A6729BE Key = CBFB04226D1029A7EC9D64A48A6729BE Nonce = 000102030405 AD = 000102030405 In = 000102030405 Out = F4924FE3E3553D85B3900DECA0528C815F1447A1F209 Key = 3D85B3900DECA0528C815F1447A1F209 Nonce = 00010203040506 AD = 00010203040506 In = 00010203040506 Out = 679C88D52FB519931C7A863C3701D8015FDBD8696C6C30 Key = 931C7A863C3701D8015FDBD8696C6C30 Nonce = 0001020304050607 AD = 0001020304050607 In = 0001020304050607 Out = 26DA41C0D115375E7627E23E791A4DCB0FA5ED71B1ED2288 Key = 7627E23E791A4DCB0FA5ED71B1ED2288 Nonce = 000102030405060708 AD = 000102030405060708 In = 000102030405060708 Out = 8FEC6EB7016AD2B178F65ED0286A724F0CB2EA317D5022B0D8 Key = F65ED0286A724F0CB2EA317D5022B0D8 Nonce = 00010203040506070809 AD = 00010203040506070809 In = 00010203040506070809 Out = B5F22415B1334133C53187C4F3A8991BBB85984BC4D3305A5CF1 Key = 87C4F3A8991BBB85984BC4D3305A5CF1 Nonce = 000102030405060708090A AD = 000102030405060708090A In = 000102030405060708090A Out = 23E1D0ED2E820AFE7DA2FE100499F1093FAB2ECF73B643594E98E3 Key = 100499F1093FAB2ECF73B643594E98E3 Nonce = 000102030405060708090A0B AD = 000102030405060708090A0B In = 000102030405060708090A0B Out = 79519ABA91F46B8DAD6D5335FBDCD1FCDB20AB99135F28A714C6992F Key = FBDCD1FCDB20AB99135F28A714C6992F Nonce = 000102030405060708090A0B0C AD = 000102030405060708090A0B0C In = 000102030405060708090A0B0C Out = 5968D0B4198A0AAD3D0395018F781F22E2DA98F83398FCF911B2010057 Key = 781F22E2DA98F83398FCF911B2010057 Nonce = 000102030405060708090A0B0C0D AD = 000102030405060708090A0B0C0D In = 000102030405060708090A0B0C0D Out = 4E55B14432B601E3EF2EF567CB158BF6E53D7657E56EA3DA1BFD9C9EC06E Key = 8BF6E53D7657E56EA3DA1BFD9C9EC06E Nonce = 000102030405060708090A0B0C0D0E AD = 000102030405060708090A0B0C0D0E In = 000102030405060708090A0B0C0D0E Out = 6ED89651CE19B3DD1EE5C8780B5015131CFD657D32D4E1B35140ADDCA0E13A Key = 131CFD657D32D4E1B35140ADDCA0E13A Nonce = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 2295A968B4D072D12757756247554850F35FAC95C2AA4155450EAAA6E2E789B5 Key = F35FAC95C2AA4155450EAAA6E2E789B5 Nonce = 000102030405060708090A0B0C0D0E0F10 AD = 000102030405060708090A0B0C0D0E0F10 In = 000102030405060708090A0B0C0D0E0F10 Out = F9B2AA2AA502EA79BBA0C5EAD932B8E1EE0ED81AA40B9BF39A9AAEDDDB7A04BEA6 Key = 0ED81AA40B9BF39A9AAEDDDB7A04BEA6 Nonce = 000102030405060708090A0B0C0D0E0F1011 AD = 000102030405060708090A0B0C0D0E0F1011 In = 000102030405060708090A0B0C0D0E0F1011 Out = 385055F1C1C26C0472A504B4CD225DCA55FE24831680B56368231AC54227D737F582 Key = 24831680B56368231AC54227D737F582 Nonce = 000102030405060708090A0B0C0D0E0F101112 AD = 000102030405060708090A0B0C0D0E0F101112 In = 000102030405060708090A0B0C0D0E0F101112 Out = 771529585C741A3F8B1C973709892F255A99EE2A132B4BF96FD5109DB04459103F5E84 Key = 2A132B4BF96FD5109DB04459103F5E84 Nonce = 000102030405060708090A0B0C0D0E0F10111213 AD = 000102030405060708090A0B0C0D0E0F10111213 In = 000102030405060708090A0B0C0D0E0F10111213 Out = E7A2197D9FAA8AB8B303B5EC71AE34AD5EC5DD66CCAB6518371EC8E0A9E9EE4F7CA5878B Key = CCAB6518371EC8E0A9E9EE4F7CA5878B Nonce = 000102030405060708090A0B0C0D0E0F1011121314 AD = 000102030405060708090A0B0C0D0E0F1011121314 In = 000102030405060708090A0B0C0D0E0F1011121314 Out = 279E54F755EAC6B57375B9EC4406E43DB3139D740C7B6F26F2C0ECC9F2DF4EDD7513E6E0B7 Key = 7B6F26F2C0ECC9F2DF4EDD7513E6E0B7 Nonce = 000102030405060708090A0B0C0D0E0F101112131415 AD = 000102030405060708090A0B0C0D0E0F101112131415 In = 000102030405060708090A0B0C0D0E0F101112131415 Out = 27816AA94CBA2BF98E49E595AF5B3FAD12BF1D6F1AC6D04876C5492D275F15C834E3CF794F0E Key = D04876C5492D275F15C834E3CF794F0E Nonce = 000102030405060708090A0B0C0D0E0F10111213141516 AD = 000102030405060708090A0B0C0D0E0F10111213141516 In = 000102030405060708090A0B0C0D0E0F10111213141516 Out = B5658DC148855F68B282211D879F688F3C142FE555CF814539CDA8A65DB9047AAD76B421B81120 Key = 4539CDA8A65DB9047AAD76B421B81120 Nonce = 000102030405060708090A0B0C0D0E0F1011121314151617 AD = 000102030405060708090A0B0C0D0E0F1011121314151617 In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = 72F0BD4F939C2C9B4FA734DCB0AE4FB9BD342BC8459ED2FECEA8469BC0457EBF3418C1114288C904 Key = CEA8469BC0457EBF3418C1114288C904 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718 AD = 000102030405060708090A0B0C0D0E0F101112131415161718 In = 000102030405060708090A0B0C0D0E0F101112131415161718 Out = 70568245E6E6BD5D11AD0C74030D7AE08BA05057DEA0FBF4AD71554FDE6B87477A51EE4499D78783D2 Key = 71554FDE6B87477A51EE4499D78783D2 Nonce = 000102030405060708090A0B0C0D0E0F10111213141516171819 AD = 000102030405060708090A0B0C0D0E0F10111213141516171819 In = 000102030405060708090A0B0C0D0E0F10111213141516171819 Out = 8702D35BE07D7ADF70684046CC6C72FBBBF821E0BBCCBC97360133CC6FBFDA15E306919E0C3BB2E22BB6 Key = 33CC6FBFDA15E306919E0C3BB2E22BB6 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A In = 000102030405060708090A0B0C0D0E0F101112131415161718191A Out = 0BA23F4A6174165D4A8BA80B7C875340B0F8B2A6967D34E106BC2200E6679496714236EECEC84B9AF3072E Key = 00E6679496714236EECEC84B9AF3072E Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B Out = B9E25ABA84C6BD95B5149E7616FE2E1D6FAACEAAD77A636C602791768D8AD0B9D4C709E1DA370EE01611482A Key = 8D8AD0B9D4C709E1DA370EE01611482A Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Out = 74759711F6D542581F9F83498FB616638D092732BA07109BF4B5BE045C71A40DC777BD09F75362F7B20E0B7576 Key = 71A40DC777BD09F75362F7B20E0B7576 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D Out = ADBF7E98926484BA2C7F6CD7CD9734FC19265F68AF3BFCAEB025F6296E378DF15B5F69B67F7DABE44E3666B55047 Key = 8DF15B5F69B67F7DABE44E3666B55047 Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E Out = 2DC26D449379997D110309B2A0DC2760FCE8CADB4B14ED580F86C70F69C9BAEFCB60EB2B25737E256BC76700B198EF Key = EFCB60EB2B25737E256BC76700B198EF Nonce = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = 2B1890EB9FC0B8293E45D42D2126F4072754AA54E220C853C5F20FBA86BE07951A1B15BBC287372FB9AF035FB124B6A1 [DES/EAX] Key = 0001020304050607 Nonce = AD = In = Out = 44048B7F240B6F5F Key = 44048B7F240B6F5F Nonce = 00 AD = 00 In = 00 Out = 0A37009B7D4E09953A Key = 37009B7D4E09953A Nonce = 0001 AD = 0001 In = 0001 Out = 03BABFD2FD7758961728 Key = BFD2FD7758961728 Nonce = 000102 AD = 000102 In = 000102 Out = 37EE1016A6AF96DE888A19 Key = 16A6AF96DE888A19 Nonce = 00010203 AD = 00010203 In = 00010203 Out = 07F44290100CA84AA0EDAA1D Key = 100CA84AA0EDAA1D Nonce = 0001020304 AD = 0001020304 In = 0001020304 Out = 389EF0023B9614FB800A533268 Key = 9614FB800A533268 Nonce = 000102030405 AD = 000102030405 In = 000102030405 Out = 3F4DBA8AA01CEFA6B55B7ED5E40F Key = EFA6B55B7ED5E40F Nonce = 00010203040506 AD = 00010203040506 In = 00010203040506 Out = 8C7B837896EAE7C113CE8F664CE3D4 Key = C113CE8F664CE3D4 Nonce = 0001020304050607 AD = 0001020304050607 In = 0001020304050607 Out = 7011D993D8EDB0C7B4C370A919F60497 Key = B4C370A919F60497 Nonce = 000102030405060708 AD = 000102030405060708 In = 000102030405060708 Out = 0DEB30A31351B13D7B00ABC82DC5F3A1AF Key = 00ABC82DC5F3A1AF Nonce = 00010203040506070809 AD = 00010203040506070809 In = 00010203040506070809 Out = 8D3897B2CBE323D6EE1C7A2D15627CA1441B Key = 7A2D15627CA1441B Nonce = 000102030405060708090A AD = 000102030405060708090A In = 000102030405060708090A Out = DBC002C817DEBFB419F94BD8EB87F86D6ACDEF Key = D8EB87F86D6ACDEF Nonce = 000102030405060708090A0B AD = 000102030405060708090A0B In = 000102030405060708090A0B Out = 17048E2976FA85AA849E9A80229FCD1C9D1E3B9C Key = 229FCD1C9D1E3B9C Nonce = 000102030405060708090A0B0C AD = 000102030405060708090A0B0C In = 000102030405060708090A0B0C Out = 30B989EF646544885A478AC198C1B7EB4F799105C8 Key = C1B7EB4F799105C8 Nonce = 000102030405060708090A0B0C0D AD = 000102030405060708090A0B0C0D In = 000102030405060708090A0B0C0D Out = 5C2E12A7F118A08D6FD585F9C839C358679FEE6FE7D7 Key = C358679FEE6FE7D7 Nonce = 000102030405060708090A0B0C0D0E AD = 000102030405060708090A0B0C0D0E In = 000102030405060708090A0B0C0D0E Out = 8D1A1E888BBB8648E638C4E74E11B8685E006C441448B8 Key = 685E006C441448B8 Nonce = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 93AE906B8BE4EAC8ED6D8F48F04A7AFF71DD7AF752FE28FB [TripleDES/EAX] Key = 000102030405060708090A0B0C0D0E0F1011121314151617 Nonce = AD = In = Out = 8914311BB990B725 Key = 8914311BB990B7258914311BB990B7258914311BB990B725 Nonce = 00 AD = 00 In = 00 Out = D82094EDC5D03E54B1 Key = 2094EDC5D03E54B12094EDC5D03E54B12094EDC5D03E54B1 Nonce = 0001 AD = 0001 In = 0001 Out = FEE5781CFB0EBE3895CA Key = 781CFB0EBE3895CA781CFB0EBE3895CA781CFB0EBE3895CA Nonce = 000102 AD = 000102 In = 000102 Out = DECF5E59918E8A5C4B459B Key = 59918E8A5C4B459B59918E8A5C4B459B59918E8A5C4B459B Nonce = 00010203 AD = 00010203 In = 00010203 Out = BD583AAD2013BEEBEEA795A1 Key = 2013BEEBEEA795A12013BEEBEEA795A12013BEEBEEA795A1 Nonce = 0001020304 AD = 0001020304 In = 0001020304 Out = 2BC01C6C780B1134DBBEAB5D3F Key = 0B1134DBBEAB5D3F0B1134DBBEAB5D3F0B1134DBBEAB5D3F Nonce = 000102030405 AD = 000102030405 In = 000102030405 Out = 4D5EAF01A895AB4D17516ECBA50A Key = AB4D17516ECBA50AAB4D17516ECBA50AAB4D17516ECBA50A Nonce = 00010203040506 AD = 00010203040506 In = 00010203040506 Out = AF229F90614480D3113C0A9D133CD4 Key = D3113C0A9D133CD4D3113C0A9D133CD4D3113C0A9D133CD4 Nonce = 0001020304050607 AD = 0001020304050607 In = 0001020304050607 Out = BCA6F375DF4568E08E9EAEC8E77786BC Key = 8E9EAEC8E77786BC8E9EAEC8E77786BC8E9EAEC8E77786BC Nonce = 000102030405060708 AD = 000102030405060708 In = 000102030405060708 Out = 575F34219E6DD8DB4CB40C75139E5D1860 Key = B40C75139E5D1860B40C75139E5D1860B40C75139E5D1860 Nonce = 00010203040506070809 AD = 00010203040506070809 In = 00010203040506070809 Out = A199B8AC433B615EC96F774AF803698ADE3D Key = 774AF803698ADE3D774AF803698ADE3D774AF803698ADE3D Nonce = 000102030405060708090A AD = 000102030405060708090A In = 000102030405060708090A Out = 718A2975DD9A872A68AE103B9460F849CBA7FB Key = 3B9460F849CBA7FB3B9460F849CBA7FB3B9460F849CBA7FB Nonce = 000102030405060708090A0B AD = 000102030405060708090A0B In = 000102030405060708090A0B Out = AB38E148180F6E2FFBB96F91E3EE3B8FC50DADBC Key = E3EE3B8FC50DADBCE3EE3B8FC50DADBCE3EE3B8FC50DADBC Nonce = 000102030405060708090A0B0C AD = 000102030405060708090A0B0C In = 000102030405060708090A0B0C Out = EB10E0233507459D4A6C29EE808D90B46BB1EAB27E Key = 8D90B46BB1EAB27E8D90B46BB1EAB27E8D90B46BB1EAB27E Nonce = 000102030405060708090A0B0C0D AD = 000102030405060708090A0B0C0D In = 000102030405060708090A0B0C0D Out = EB48559C320DFB056C37458E19B59315F0C4AF8500EB Key = 9315F0C4AF8500EB9315F0C4AF8500EB9315F0C4AF8500EB Nonce = 000102030405060708090A0B0C0D0E AD = 000102030405060708090A0B0C0D0E In = 000102030405060708090A0B0C0D0E Out = 9E8C73EADA105749B5D8D97392EDC32E749EE66C1E6A16 Key = 2E749EE66C1E6A162E749EE66C1E6A162E749EE66C1E6A16 Nonce = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 600FA4149AF252C87B828C780AEFF8BC33D7D11DCDC19936 # Threefish vectors generated by us [Threefish-512/EAX] Key = 2E749EE66C1E6A162E749EE66C1E6A162E749EE66C1E6A169315F0C4AF8500EB9315F0C4AF8500EB9315F0C4AF8500EBDADBCE3EE3B8FC50DADB3F8050DAEBDC Nonce = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 5E8EEADAB182F96CC0144B722F3383FBFC9F462072B9D82FE49F9AD148DA83F23CE248546FC580FAB0A01E21BCE063FF54FFB5038A3FEDD2296B535936EFDE77E51125C9F4EFC4AE073F5A98921C601F botan-2.4.0/src/tests/data/aead/gcm.vec000066400000000000000000000421561322470703100176300ustar00rootroot00000000000000 #test cpuid aesni clmul pmull ssse3 [AES-128/GCM] # Nist | Test Case 1 Key = 00000000000000000000000000000000 Nonce = 000000000000000000000000 In = Out = 58E2FCCEFA7E3061367F1D57A4E7455A # Nist | Test Case 2 Key = 00000000000000000000000000000000 Nonce = 000000000000000000000000 In = 00000000000000000000000000000000 Out = 0388DACE60B6A392F328C2B971B2FE78AB6E47D42CEC13BDF53A67B21257BDDF # Nist | Test Case 3 Key = FEFFE9928665731C6D6A8F9467308308 Nonce = CAFEBABEFACEDBADDECAF888 In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B391AAFD255 Out = 42831EC2217774244B7221B784D0D49CE3AA212F2C02A4E035C17E2329ACA12E21D514B25466931C7D8F6A5AAC84AA051BA30B396A0AAC973D58E091473F59854D5C2AF327CD64A62CF35ABD2BA6FAB4 # Nist | Test Case 4 Key = FEFFE9928665731C6D6A8F9467308308 Nonce = CAFEBABEFACEDBADDECAF888 In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39 AD = FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2 Out = 42831EC2217774244B7221B784D0D49CE3AA212F2C02A4E035C17E2329ACA12E21D514B25466931C7D8F6A5AAC84AA051BA30B396A0AAC973D58E0915BC94FBC3221A5DB94FAE95AE7121A47 # Nist | Test Case 5 Key = FEFFE9928665731C6D6A8F9467308308 Nonce = CAFEBABEFACEDBAD In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39 AD = FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2 Out = 61353B4C2806934A777FF51FA22A4755699B2A714FCDC6F83766E5F97B6C742373806900E49F24B22B097544D4896B424989B5E1EBAC0F07C23F45983612D2E79E3B0785561BE14AACA2FCCB # Nist | Test Case 6 Key = FEFFE9928665731C6D6A8F9467308308 Nonce = 9313225DF88406E555909C5AFF5269AA6A7A9538534F7DA1E4C303D2A318A728C3C0C95156809539FCF0E2429A6B525416AEDBF5A0DE6A57A637B39B In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39 AD = FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2 Out = 8CE24998625615B603A033ACA13FB894BE9112A5C3A211A8BA262A3CCA7E2CA701E4A9A4FBA43C90CCDCB281D48C7C6FD62875D2ACA417034C34AEE5619CC5AEFFFE0BFA462AF43C1699D050 # GCM vectors generated by OpenSSL via Python cryptography # # These GCM nonces are not 96 bits and so are hashed with GHASH to # produce the counter value. For these inputs the CTR value is # very near 2^32, which exposed a bug in GCM when the counter overflowed Key = 00000000000000000000000000000000 Nonce = 0AAC82F3E53C2756034F7BD5827C9EDD In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = 38C21B6430D9A3E4BC6749405765653AE91051E96CE0D076141DD7B515EC150FDB8A65EE988D206C9F64874664CDBF61257FFAE521B9A5EB5B35E3745F4232025B269A6CD7DCFE19153ECF7341CE2C6A6A87F95F2109841350DA3D24EEED4E4E32D2BED880737670FFE8ED76DB890FD72A0076300E50914984A777C9F2BC843977396C602B24E7A045F04D15CD2EAC01AD8808064CFE5A2DC1AE9FFFA4BF0A6F0C07668097DEEB9C5CA5EC1F9A52F96A403B73FEA2DBBF44473D355553EE7FB1B4D6630777DAF67804BE213089B9F78652CE970C582FD813F87FF0ECBACCE1CA46247E20D09F3E0B4EF6BFCD13244C6877F25E6646252CAD6EB7DBBA3476AAAC83BC3285FF70B50D6CDEDC8E5921944A Key = 00000000000000000000000000000000 Nonce = 63ADFF969337DB7AAA3D862A8A827558 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = E7813D2279516D5EE54E03371B0192FE2B66EF4BF3C7F741D2B8E1809CA5C1805908ADEFE6C5884736DF98B7EBCB08110B58C384E4A2FF25644CDFEAA2104FA3B33F00B689319EF7F09B2F066AEC96DC Key = 00000000000000000000000000000000 Nonce = E60108DFED8198FB286E0A77E699DA7B In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = A833DCC2EC04BEF5ED9E7E7FB08D61244CD795C21FEE194E7AAF7D9BD66B324F39FFC46DB5A7B9E1D6703F95290027DE6AC274CAE11C632F16261B71CE97EEA6CBE8A82B4F55F5A8B5CE1B268A7B35D8 [AES-128/GCM(12)] # Nist | Test Case 5 with 12 byte tag Key = FEFFE9928665731C6D6A8F9467308308 Nonce = CAFEBABEFACEDBAD In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39 AD = FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2 Out = 61353B4C2806934A777FF51FA22A4755699B2A714FCDC6F83766E5F97B6C742373806900E49F24B22B097544D4896B424989B5E1EBAC0F07C23F45983612D2E79E3B0785561BE14A # Nist | Test Case 6 with 12 byte tag Key = FEFFE9928665731C6D6A8F9467308308 Nonce = 9313225DF88406E555909C5AFF5269AA6A7A9538534F7DA1E4C303D2A318A728C3C0C95156809539FCF0E2429A6B525416AEDBF5A0DE6A57A637B39B In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39 AD = FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2 Out = 8CE24998625615B603A033ACA13FB894BE9112A5C3A211A8BA262A3CCA7E2CA701E4A9A4FBA43C90CCDCB281D48C7C6FD62875D2ACA417034C34AEE5619CC5AEFFFE0BFA462AF43C [AES-192/GCM] # Nist | Test Case 7 Key = 000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000000 In = Out = cd33b28ac773f74ba00ed1f312572435 # Nist | Test Case 8 Key = 000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000000 In = 00000000000000000000000000000000 Out = 98e7247c07f0fe411c267e4384b0f6002ff58d80033927ab8ef4d4587514f0fb # Nist | Test Case 9 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 Out = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade2569924a7c8587336bfb118024db8674a14 # Nist | Test Case 10 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda27102519498e80f1478f37ba55bd6d27618c # Nist | Test Case 11 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f765dcc57fcf623a24094fcca40d3533f8 # Nist | Test Case 12 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c Nonce = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373bdcf566ff291c25bbb8568fc3d376a6d9 [AES-192/GCM(12)] # Nist | Test Case 10 with 12 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda27102519498e80f1478f37ba55bd # Nist | Test Case 11 with 12 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f765dcc57fcf623a24094fcca4 [AES-256/GCM] # Nist | Test Case 13 Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000000 In = Out = 530f8afbc74536b9a963b4f1c4cb738b # Nist | Test Case 14 Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000000 In = 00000000000000000000000000000000 Out = cea7403d4d606b6e074ec5d3baf39d18d0d1c8a799996bf0265b98b5d48ab919 # Nist | Test Case 15 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 Out = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015adb094dac5d93471bdec1a502270e3cc6c # Nist | Test Case 16 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853bb2d551b # Nist | Test Case 17 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913fe2ea8f2 # Nist | Test Case 18 Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3fa44a8266ee1c8eb0c8b5d4cf5ae9f19a [AES-256/GCM(12)] # Nist | Test Case 16 with 12 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853 # Nist | Test Case 17 with 12 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913 [AES-256/GCM(13)] # Nist | Test Case 16 with 13 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853bb # Nist | Test Case 17 with 13 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913fe [AES-256/GCM(14)] # Nist | Test Case 16 with 14 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853bb2d # Nist | Test Case 17 with 14 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913fe2e [AES-256/GCM(15)] # Nist | Test Case 16 with 15 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbaddecaf888 In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f66276fc6ece0f4e1768cddf8853bb2d55 # Nist | Test Case 17 with 15 byte tag Key = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 Nonce = cafebabefacedbad In = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 Out = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f3a337dbf46a792c45e454913fe2ea8 # Wycheproof GCM tests [AES-128/GCM(8)] Key = 5b9604fe14eadba931b0ccf34843dab9 Nonce = 921d2507fa8007b7bd067d34 AD = 00112233445566778899aabbccddeeff In = 001d0c231287c1182784554ca3a21908 Out = 49d8b9783e911913d87094d1f63cc7651e348ba07cca2cf0 [AES-128/GCM(12)] Key = 5b9604fe14eadba931b0ccf34843dab9 Nonce = 921d2507fa8007b7bd067d34 AD = 00112233445566778899aabbccddeeff In = 001d0c231287c1182784554ca3a21908 Out = 49d8b9783e911913d87094d1f63cc7651e348ba07cca2cf04c618cb4 [AES-128/GCM] Key = 5b9604fe14eadba931b0ccf34843dab9 Nonce = 028318abc1824029138141a2 AD = In = 001d0c231287c1182784554ca3a21908 Out = 26073cc1d851beff176384dc9896d5ff0a3ea7a5487cb5f7d70fb6c58d038554 Key = aa023d0478dcb2b2312498293d9a9129 Nonce = 0432bc49ac34412081288127 AD = aac39231129872a2 In = 2035af313d1346ab00154fea78322105 Out = eea945f3d0f98cc0fbab472a0cf24e874bb9b4812519dadf9e1232016d068133 Key = aa023d0478dcb2b2312498293d9a9129 Nonce = 0432bc49ac344120 AD = aac39231129872a2 In = 2035af313d1346ab00154fea78322105 Out = 64c36bb3b732034e3a7d04efc5197785b7d0dd70b00d65b97cfd080ff4b819d1 Key = 2034a82547276c83dd3212a813572bce Nonce = 3254202d854734812398127a3d134421 AD = 1a0293d8f90219058902139013908190bc490890d3ff12a3 In = 02efd2e5782312827ed5d230189a2a342b277ce048462193 Out = 64069c2d58690561f27ee199e6b479b6369eec688672bde99b7abadd6e69c1d9ec925786534f5075 Key = 00112233445566778899aabbccddeeff Nonce = 7b95b8c356810a84711d68150a1b7750 AD = In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = 84d4c9c08b4f482861e3a9c6c35bc4d91df927374513bfd49f436bd73f325285daef4ff7e13d46a6213a3cb93855d18e69337eee66aeec07 Key = 00112233445566778899aabbccddeeff Nonce = 1a552e67cdc4dc1a33b824874ebf0bed AD = In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = 948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc3c60ad5a949886de968cf53ea6462aed99b381bfa2af9751c39d1b6e86d1be6a Key = 00112233445566778899aabbccddeeff Nonce = 99821c2dd5daecded07300f577f7aff1 AD = In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = 127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4af37d0fe9af033052bd537c4ae978f6007eb2fe4a958f8434d40684899507c7c Key = 00112233445566778899aabbccddeeff Nonce = 5e4a3900142358d1c774d8d124d8d27d AD = In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = 0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4f145c2dcaf339eede427be934357eac0 botan-2.4.0/src/tests/data/aead/ocb.vec000066400000000000000000000705241322470703100176250ustar00rootroot00000000000000[AES-128/OCB] # From RFC 7253 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221100 In = Out = 785407BFFFC8AD9EDCC5520AC9111EE6 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221101 AD = 0001020304050607 In = 0001020304050607 Out = 6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221102 AD = 0001020304050607 In = Out = 81017F8203F081277152FADE694A0A00 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221103 AD = In = 0001020304050607 Out = 45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221104 AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221105 AD = 000102030405060708090A0B0C0D0E0F In = Out = 8CF761B6902EF764462AD86498CA6B97 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221106 AD = In = 000102030405060708090A0B0C0D0E0F Out = 5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221107 AD = 000102030405060708090A0B0C0D0E0F1011121314151617 In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = 1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221108 AD = 000102030405060708090A0B0C0D0E0F1011121314151617 In = Out = 6DC225A071FC1B9F7C69F93B0F1E10DE Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA99887766554433221109 AD = In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = 221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA9988776655443322110A AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA9988776655443322110B AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = Out = FE80690BEE8A485D11F32965BC9D2A32 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA9988776655443322110C AD = In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = 2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA9988776655443322110D AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Out = D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA9988776655443322110E AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 In = Out = C5CD9D1850C141E358649994EE701B68 Key = 000102030405060708090A0B0C0D0E0F Nonce = BBAA9988776655443322110F AD = In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Out = 4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479 # From CFRG i-d 03 Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = Out = 197B9C3C441D3C83EAFB2BEF633B9182 Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = 0001020304050607 Out = 92B657130A74B85A971EFFCAE19AD4716F88E87B871FBEED Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = 000102030405060708090A0B0C0D0E0F Out = BEA5E8798DBE7110031C144DA0B2612213CC8B747807121A4CBB3E4BD6B456AF Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = BEA5E8798DBE7110031C144DA0B26122FCFCEE7A2A8D4D486EF2F52587FDA0ED97DC7EEDE241DF68 Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = BEA5E8798DBE7110031C144DA0B26122CEAAB9B05DF771A657149D53773463CB4A3BAE824465CFDAF8C41FC50C7DF9D9 Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Out = BEA5E8798DBE7110031C144DA0B26122CEAAB9B05DF771A657149D53773463CB68C65778B058A635060C8467F4ABAB5E8B3C2067A2E115DC Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B In = 7595C3E6114A09780C4AD452338E1FFD9A1BE9498F813D76533449B6778DCAD8C78A8D2BA9AC66085D0E53D59C26C2D1C490C1EBBE0CE66D1B6B1B13B6B919B847C25A91447A95E75E4EF16779CDE8BF0A95850E32AF9689444FD377108F98FDCBD4E726567500990BCC7E0CA3C4AAA304A387D20F3B8FBBCD42A1BD311D7A4303DDA5AB078896AE80C18B0AF66DFF319616EB784E495AD2CE90D7F772A81747B65F62093B1E0DB9E5BA532FAFEC47508323E671327DF9444432CB7367CEC82F5D44C0D00B67D650A075CD4B70DEDD77EB9B10231B6B5B741347396D62897421D43DF9B42E446E358E9C11A9B2184ECBEF0CD8E7A877EF968F1390EC9B3D35A5585CB009290E2FCDE7B5EC66D9084BE44055A619D9DD7FC3166F9487F7CB272912426445998514C15D53A18C864CE3A2B7555793988126520EACF2E3066E230C91BEE4DD5304F5FD0405B35BD99C73135D3D9BC335EE049EF69B3867BF2D7BD1EAA595D8BFC0066FF8D31509EB0C6CAA006C807A623EF84C3D33C195D23EE320C40DE0558157C822D4B8C569D849AED59D4E0FD7F379586B4B7FF684ED6A189F7486D49B9C4BAD9BA24B96ABF924372C8A8FFFB10D55354900A77A3DB5F205E1B99FCD8660863A159AD4ABE40FA48934163DDDE542A6585540FD683CBFD8C00F12129A284DEACC4CDEFE58BE7137541C047126C8D49E2755AB181A Out = C158F1AD36220722AA1D767801D21465135F6AFEDE74C837B53AE2EE0DD9A82340B199244ACB0DEC8B125ECFE3E0EBC172DCBD12193AEC9A914BCA7A3406CC95AC601E12388287EC5F350DD4D039AAA7826047F5D8B8A626DF3E5801050B18A8938FBD24D3E4E45E210C8CB54DEE88340937D16021D4B8565C9DA7F8FEACAF7B3DC8031D799687215B94E53B0DCA833813D987E29BB88AB58F5B1599B8CB043EC5FE5F572CA3B436AEA5E97D82CA6982204E64810699D736ECBF2775F7A132C231CA2DEE177AC7826B6DD1D122CE4C883730C1AC75C71F361A51BCCC1A9B543B05C6C2AE7A63253DAECB065A3E7268B6FF895CA4D5197E27D9720FF00E2FB14A5DB4FDC245BDF6EFEBB174801FFCC440BA92BBA0E0CE42C97C8B3CC5DB4309CE60C9482453701BD83CCACCD3FD89F0B755E0A47A2D145115F774172E9CAFC6E6AAF2DE5FEE9D934CC05B2E662E5D3C86A7AFEDF6768BDAAA4B29F7F98E5BB96BFC193D7BE412E8C62C69AC8F47A8CCAEBD18F1116A664C767765682AF9EF9B0515D76F06503DDA96488C1C2464D530EDA78B72A24A0A07CF2DD99CBF2836F77DAA19CE0F1590C0E5829A84D28210025A18C80925B15EA57ECA2836E84B22DA28946CEDFB72AC1BA004E2E752D67BF82667A2BAE60F70A4488D23EF356110E8864D4435871C084034CCA14F357EC3C7084B3F3FE8EB20F953D04ADDC6C398B972E584D3D8F203D9706A996B Key = 100102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0C In = B581F5641873E3F04C13F2771860655E2901CE985553F90C2A08D509B3575556C5E95690CB6AA3C0FFC479B4D2975DC443D1FE947B88065AB29E2CFC4403B790A0C1BA6A33B8C7B29DE1124FC064D401FE8C7A66F7E65A91BBDE5686AB65213000846524A57D85B4E317ED3AB76FB40B0BAF15AE5A8FF20C2F27F409D8D296B771F2C5994D7E7F757789308B59DBA2B2A0F319392BC57E3F4FD9D356289744DCC08B7724D952E7C5AFF67D59B244051DB1B011A50FEC33E16D1B4E1FFF5791B45B9A96C553BCAE203CBB14E2E82233C15E769E4699F62A15C69702A06643D1A631A69FFBF4D369E5CD7695B87A827F2145FF3FCE55F6951008771043C6F309E568E73CAD0052450DFE2DC6C2948C121DE625AE98128E199C8168B111F669DAE36208187A254928ACBA71120BE4A2E5C75D8EEC494021BF5A98F3026855037F8AE5940C325C078263AF6F9140848E5225D0B0295305E2507A34EBC94620A83DDE7F165F36C52EDCD11547C750406D91C5E793951AD357BC5233EE1419225289A74A2556774BCACF0AE1F53585307E594ABD145BDFE346CBAC1F6C960EF481D199CA88633D02586BA9E59FB300B254C6741CBF46AB97CCF85404070852E6C0DA93747D93995D7868A62E6BD36A69CC126BD4C7A5C6E7F603045DCD615E1740DCD15CF508DF5C9085A4AFF678BB0DF1F4A45426729E61FA86CFE89EA1E0C74823AE5A90AE750A74188905B192B27FD01BA662072501C7C24FF9E8FE63958007B426CCD126B6C43F9ECB8E3B2E4416D3109A9508EBC8CBEBBF6F0BCD1FC8CA86AAEC33E669F44525863A22944F00236A44C2499733AB36140A7024C3BE043B79A0F9B8E776292283D7F294F44149BA5F7B07B5FBDB031A9FB64CC22E374049C33816E24F7782B0684C711D57619CD94E5499471328733CBB0090F34DC90EFDE7B171D31579BFCC262FBDAD6C50696C3E6D809AEA78AF19B20D4DAD0407AE22904A93320E369B1B46BA3BB4ACC6D1A231533B2A3D45FE036110851769A678CC6C874953F98010DE80A2416AC33202AD6D3C5600715106A7BDFBEF3CB59FFC487D537C66B04923C447100EE56C7413E6C53FAADEFF0744DD561BAD0977FB5B12B80D381737357B9BBCFED47E8BDA7E5B04A722A731A12086C71B99DBD189F494A353698DE7E874118D74D60737919FFD67503AC9E1F436D5A047D1F9E539A331AC073623F866181428340FB8D0E729B3044B550141B2758DCB96853AFBAB2B9EFA5820441FC014227561E8AA19CFF18256F4D7787B3D5FB39E0B8A5750DB1741654DA302C99C9C53FB39399B1D7224DAB739BE133BFA29DA9E54646EBAD8A1CBB336FACB4785E96138BCBEC500382A54F7C4B9B3D37BA0A0F8727F8C8E820EC61C759DCA8E6187DEAD80D2F5F980EF1575AFF580FBFF6D1E25B740616A395A6AB531AB978A19894440C0A6B44E30327B13E767A98B5704C201A6F42899AD2C76A378C24AE6CA5C506AC1B0624B108E7C1743B317661C3E8D69F05A71F597DCD145DD28F35DDF537B11E5BC4CDB1B516BE9FB3DC1C32CB971F5B6B21336798053E8D3A60AAFFD5697F7408E45CEF8B09E5C3382B04456FC0509E92AAC2680141DC83A354C8297FD76B7A90A3558798E0F66EAAF516C09A96E9BCB9A3147A02F7C71B44A11AA8C66C564E63A54DA246AC441654682A00A0F5FFB25D02C91A7EEC4810786755E336997E42CA89D9F0B6ABEAD98DA6D9441DA2C1E89C4C2AF1E00050B8360BD43EA15237FB9ACEE4F2CAF2AF3DFD0F31931BB4A74841752322C7D61E4CBEB80381552CB6FEAE5739CD92469C6953221C811E4DC36D7933866FBB27F3AB9AF31DD9375788A2C94871A58EC9E7D4DBAE1E54DFCBCA42A14EFCCA7ECAB430918D3AB68D107994447D683853B30EAA96B63EAC407FB432FA4AAB0AB0389CE3F8C027C8654BC88AF75D2DC6317D326F696A93CF1618C1118CCD6EA5BE2CDF0F1B2E535901F854C765B66CE44A4329FE67B716E9F5815677287648E3A4445D476FAC2F6EF8505187A9BBA4154ACF0FC59123FDFA0E58A65FD3A628D832C03BE05762E5349979433AE408115DB6EADAAF54BE39870DFE07CCDDB02D47D2FC1E6B4F3D70D7AD9239E872DCE87ADCC72050029DC737F64C1150EC2DFA75FEB41A1CDEF5C50792A5656718CACC0795069CA593265F254E4523876D15EDE269EFB752E11B510F41773F589C74F435C8E7CB90552244099FE9B850B6C223E8BAE86A1D27905686BABE34149ED15A18D402D61DF1A59C9268BEF304C884B10F88DA6929F4BF3C4530B895D2892CF78B2C05DED7EFCC012235F5A7886436E27F75AA76AED1904F0B312D1BD0E896EBC96A8D849399F7E67F02E3E01A9BAEC8B628ECB4A7043C7C2C4CA820373E911DFCF54EAC9B09551C0133D9205FAF4A934C8CE6C3D54CCC4AFF1DC114426A2AFF185757D0361684E78C6927D867D77DC7172DBC6AEA1CB709A0B19BE4A6C2AE2BA6C649A1328DF8575E643F68708686EBA6E799F04BC2350F6335C1F2425BE3347804556A3A7D77AB1340B903C9CAD445F9E0E9DD4BD935EFA3CE0B0D9EDF3D62EFF24D8716CEDAF55EB22AC936832055B47DDC64ACBC710E13C921AF323782BA1D280F412B1208FFF2635DDFBC74E78F12D501277A8607C0FF5162F63702AC096804E0AB493355D1D3F56F72FBB9011168FA2EC47BEAC56012656B18CB210F91ACAF5D1B7392063F169204F13121F5B65FC98F7C47ABEF7264D2B847B42ADD87A0AB4D874BFC1F06EB429A3BBCA4667706A2DCE0EA28AA987BF05C4C104A3ABD445438CB602B041C8FC443D59AA2E44212A8D889D57F4A00277B8A6A0E6755C82653E035C298F3855AB3326EF9F4352FD68AF36B4BB9A5809091BC36546461DA7941823502CCA2C551997019D933B6386F2036745D27228526CF4E31CB51113F1EB21C7D956822B8239BD6954ED62C3E2DE73D46A12AE13217F4B5BFCBFE82BBE56BA688B9AB16EFABF7E5A4BF1AC986585D19353D37B09DD4B106D84B01365BDCF5209C485E284741565B7F751AF55ADA4D122547094A01C9041FD99D75A31EFAA25D07F4FEA1D5542E549B0D046623643B282157550A472EB54271F8AE47DE966C5F153A4D10CEBB8F8BCD4E2E7E1F84BCBA9A1AF1583CB72D03379002D9FD7F12E1E10E445C0753A39EA68F75D1B738FE98E0F7247AE350A317A144D4A6F47F77E916E748B2647F9C3F9DE70F561ABA9279F82E49C89913F2E6AFDB549E9FD59143649406D32D88542F3A5DF0CA827D754E2632FF27E8B8BE7F19A953543DC3AE4B6F4D0DF9CCB94F321A07750E2C6C4C65F09645B9290D8E1D1ED4B42D737AF653D1139B6248A60AED61EBF0E0DD7DC960E65754E29069DA4513A10638F1707D58E3CF428005A5B0519D8C06CE515E49C9D719D5E94291AA780FA0E3303DDB73E9AA9261837A964084D945A88CA35CE8102E31F1B891A7785E3416D324219237DC873EE25850DF83125791B6F7925D2D8D423FDF782366A0C462215E9FF724191917D3AB7DD659970F68D84F867152011D6B2557BDB87EEEF55892A592B078F438A593C018B6554A166D538BDC630A9CC49B6A81BB8C00EE34528E2FF419F7E7CD1AE9E253F4C7C7CF4A8264D5CFD4B2718F9617648BA0C6BA94DFCF53B357E2F4AA9C29AAEAB860989C9C240392C81B3B81767C20D324A3A6781D71A3452C5DB0AF56339EA1FE17CA19EC135E3B1184567F9223895D9343486C6419415F95B41A6878BF8D5E11BE25BF38610FFE6AE6976BC0DB409900CA2650CAD74F5D7FFDAC1CE85BE00A7FF4D2F65D38C862D05E8ED3E6B8B0F3D838CF11D5B962EB19CC298E170B9BA5C8A43D634A72DC992AEF2A57B0549A7333486CAE49623765BF2C6F15128427BCC768FFAA2AD31D4D67A6D252554E43F5059E15C05B72748BF07EC1B13BE2BA1572BD5ABD7D04C1ECB719BC59085D3DE59EC71EB89BBD00950E1163FFD1C34C31CA110775398EFF2FDA50159C29B26C742D949DA582B6E9F5319767ED9C90E68C87F512242EF49A455B636AC09C73188154B2E8F3A08F7D8F7A8C5A933A645E4C49476F30D8F7EC8F6BC230AB64CD36ACD36C2905C5C3C657BC2D6CCE60D87732E7179160663280915D88938383DB5421C0824F72AD29DC8CAEFF927D80786F7430B55153F9F83EFDC499D2AC15462BD9B66559FB712F31B4D9D2A5CED87758726EC612CB40F89B0FB2E685D15C78D2EC0D9ECAF4FD22529E8D2262B67E9FC2BA86796121F5B96C61453AF44EAD6E29498E412934C92E018A58D2DE4713C474CF7E6479EC068DFD4F55A74B12B29031907AF90625C6898481611029DEEB49BE5427F08FD16320BD0B3FA2BB799F929CD20459FB31A5DA2AF4DE0BD420DBC74999C8E531AB43EBDA29A2DF7F8390F6763FC6BC0AFB34B4F55C4CFA7C804113E1432BB1B3877D67F544CDF75F3072D339BA820E17B12B5F3EF2FCE72E52460C130E2ABA18E1109A8213344FE7F35329339A7AD8B7906B2CB4EA95FC7BA7429EC93A04E5493C0BC5564F048E55799EE75D6790F66B7C65776F7B7F39CC560E87F8376D60EAAE690391DA6326A34E355F858A0587D33E02239446487865A2FA77E0F38EAB030CC61A56A32AE1EF7E9D0A90C324BB54928AB852F8E01363852D0BAD60278F80E3E9C8B6B45993F5CFE58F15C9404E1F5186D51B25D1820B6C29A421DB3AB3CB63A1303B246824FFC64BC4FCAFA9CC0D5A7BD11B7E45AF66F4D4D54EAA49866D4223BD38F3447D97CF4723B4D0277F6D6DD080A81E186893E56103CBAD7818C08BC8BE253ECA789EEC856B5362CB203BA99DD7C48A0B0BC9133E9A8CBCDCF595F1F15E256F54E013527457747C8BCCB7E39C19728D384FC2C3EC8AD9CF88A619C28AAC5992043859DA5E28BB8AEEBD0320D527809563FC7D87E26FC37FB6F04FCFA9210ACF83E21DC8C21167D676EF6CDDAB69823AB233CB210A0535A569FC5D0FFBBE4983C691EDB388F7E0FD29888818B4567EA33F1EBE997552ED9AAEB5AECDAE168A89D3C847C053D62878F032128950C8925224AB093A950A22F576E184219540C5567C61149F45CD2E93DDD8B48712100C39A6C857428834A1B3105E10692E7DA85737845207FAE137C330622F483F9353F6C71A84E48BE9BCE8ABADABE2808F7E2148C71EA72F933F2883FD7BB696C2919DC84CE1F124FC8AFA504BA5AABB0D9141F6C689839897AD9D82FDFA8474A25E2FB33F45978E16885CFFE5920D4051D8099AEBCCAAE0F2F6543348E7EACD3932FAC6D143D0207709DA4F31B5C36FC017334850C6CD6F1BD3FDFEEF5D9BA56EFF49B6BEE9F5A786D3219F4F7F84C690B4BBCBBB7F285AF7075246C54A70E4D1D01BF08ACCF7F2CE314895E705A9992CD0184C8D2ABE54F58E70F2F0EFF68EAFD15B317E6B0E785D8232E05C7C9C4461FE19E492023244D7E2965FFF4B6FD1A85C416ECFCEA7BD62C43F8B7BF79C085CDEFE198D3A5F7908CE97F806BD2AC4C30A7C6616CD2F92CFF30BC22817D9312E40ACDAFDDE8AB0A1E13A427C35FF74BBB37094B916F924FAF52EEDFEF096FF75C6E1217726357C7BA3B6B3832731B9C80C17AC6CFCD35C06B311A6BE9D82C293F96FBB6CD13913BC2D2A3318DA4CD57CD133D64FD06CEE6DC0C2443314057F17217E33A636D35CF5D974059DDF73C02F71C7E05BBA90D01B18EC030A95324C989846DAAD0CD91C24D91B089E2BF8344AA287223A0C2ADAD1CFC3F097A0BDCC51B8713C65B598DF2C8 Out = 315ABEDF75BC4AC1F853304078E9A481AC5A1117F62C3C00B087D02DBE948EE28E7B84E94F966449732FA2239818552E9CE3D9D5118DF07E2733D673C7B6492F2D2B4DDA9DF3E42F8180F0674EEDB9C625D319E597906552B598D691F32B46412DDE010577F0E8F59B97BC9562BCC63F9FF1AE5FB05FE852B22BD074640EA536646D9B9D1AF80DFA1B892A3B1BBBE6AEC4E2EB2EC5A224086FB8F195D248DD65B9686F839AAE421EC62FCD947EA10177158700ED89D5DD5B3EAD915525AF4920B68D3C3775BF6AE7D9B77CF1D53DCA1769A5BBB975BEE2CAE2ABF960749138462A8EB232F338742BA69C2F0542A17168080402B7B6F371E8B5D564014C33A6A92D7636742DDD2391E3F8951D26FBF05B7236A177749DC4C2CCA4FB24BB6C7B2F9C4CEBCA01BF3511C1C557DC64167F53C3659A7D3BE38432F7391EE6DD37B1331E1CF5373CF138C8612A7FE432E8B0790774D6FE6ED6EE768B00C13204D84D7250409BA285F11E5FFA5E251CA2C79811F988215570E5D69708252FED38D150F160D696C69384B62B82A0353156701B570D47DAED2E79F531414A77F06D2F6205A2F0C05856A0E4193F4B17CD7FC07EDC496E802D95BBEA1E313176CF167187C77C9BEDDEF901A19A5580E5EE53B61B0C56617464AEDC89A1D078E5200DFECDEDD813AE7C08EA181AE07DE2215C2F739FD446C8EB02A3E0B636658B78AE76A31FD0D5D75F437061E550BA8CF9E9C39A33F172C3CF22C1C99FAB96F70F0D826237AC6A13C4512AD2F93DCCD23D1A86F70BC4B307534DDDCD176FA754F31B26546ABA8D1A13122ED6E8E36F4FDEC12FCE523C9ECE18964EB9831B877BAFC8C22D82CC3F428262F14E047E8BB0C2C5919A10FEB8E0D639F7B2F5A185E2E4498CBFEAFC5EE702FD2B17C7CABBC53BDE22F681C84893E2DAD462B4D91AD508041F34A7B53E2FEAB7316F3DA504756E4FCA583F37F12BC4919BB0FE2EB4D47147DF1FE3FABF7F4B732D231C217F68DFDB1637FFF437A93312FC3436B4D1A63F20E6B4B6B78BB7EE89CEB79CBD37F7FCE8055BC4999D22805AEF975D261B94230B6BA84C4BEBAC1E877219B90A4CAC9E7B469AEB08D05E32B463FFB049CD55590416FE90C3162FC5DD3EAF7ABA74332655A1445F866A603A527025546468E41A8FD84F68A713B463734633828441A64E6559B828F60425D9CF3D3D29CE99BA44AB429702B5B51777E99CA0ED52899D5CEB44223056F8CBCA85BAA8AAAC68A6C5BB01C94FB04D8CB8C16F44B85358C1A5227AD776ABEF78416EFF53F3D4FC2051F34E52F9CD345E4DAAAE45352B30547A0727D9690E8A1A9F27220C3D686F32325CD33CD478773F91B18E3E0570DD0F5BF45D56089468A6C6619B4400886A3B91C8EA708F9976DAFA9C0E26C5DC58B453B7A4075B9669CB213A8EFF525CCC05AD4BC829D42F9C66E0D638FA591921414FD6487ECD4FEED996E36E6097F1785960053FF2C90691A9B19DEA15340695405BB6B72B066428D8F5FFB731372B9BE295DE75C5B8CF0F2B63EB28AB77B0C5888898090879D4C0702CB158C4C5D84CA351CB3C4DD4F70C1AB3AAB470245EDB69B17BFCA1500E86B77D2F22E3C7EB08EEE7C97A9C8734FDCD8898FBD0864B04BF462335E783325D30999775D639240E98FE60C9C5284A64393B364B177CB131CA31F944D9CB3C5BE51B9358AFB5E52EE5890088FA832C8BD643D0871484BA0A39D9B447FC12A3B3A51860AD6E49AC21A6AE8E13C3AF94ED9A53AFB5A1A99FADD7498E15E45D4D34775B791A72D779A4B9F1FF141BB38C5A1CB2240350131D463CB79FE4D2D829F8727E079CD85AFBF67B9B1BF74A9386194E72131BCC6161F5E0867EE142C62571850B4BEE914D84343308E81BE96F78F1FEC0696680AD10D27718C34F255BCAF47CAB08951C1A351C100989DF3148B927D6FAFA07B0DB146B71283565333DACC8072DA949F368B28CC9398B05E71803DECD2351470E1018FA7D055E4021952970F94B720EACA4284E43B2DE78D7F0C568A8B8CBA13B9A27323F8D5A336E0581A5B3613591E65504A6F9DB5BFED691505762E2EA5FF75F651F4F5E53F63087A1E9C03EB662CFEB96C30BEB4F4C5EEB05A65A6C1CBD8C3316D832027A61F97B790DE7A53BB0BD13D12040BB5A3D39A9CD3085E9FAD213F30892BF53CD0F74E2D9E892995360653678CC83F96780986AC3C6A96339E69BFE59255EDC3E7F44E7A3223DB1EE45146F300F1146BFF32468401617691AD552343C07F28F266E4E7D44E42C3DB3D7D8738322D4D54536BAC3D3E0AA6FBA5267EC9DE09B2E618EBE125F5E121CE9490C9B8D09A07D200250ADD876A2683F3650D4B779ABFA07C14E4D789B60AEE4AD19111208414D494415A02D82709BFC4C2DDB0639B7910DF5F05705BCDEC7C9B14E181B6CE27326B2CD6D59B6F23F15E2C2B26664D6C3065225E797A82523AC18A2B19813B952218F16F3FB603CEEDCF7C79B3D5E7735D414A49AE3F53EB842D653D410E3CF407F014D983BDB27FE636CBE74F7A9522A15A24E52D2ACEAD070436D73A1025F01EC0153807D3E69DA4FBA4FBF63BA09F75B499354FB1FED70B942D25A061BEEEC4F6A75396282C334AF51656C1CBD729BA2894ECCEB73FF2CB301CDCE670BB2E621E534294881291D3856409E3D166ED70F395F3713A480FEAFC4BDEA63DAEB19707626FCFADF44A9576889767A8DF710A2A16D20B24D4AB9CB24B41AD789137C1E8D06FDC6804F12AE5011C399487014F43FA8A28B768D896EE12E68F934EA4B3D7EC553499E01FEFEBD70C3B1E28FF50F53C046A39BC4A14479A75184116F87AC46A6F4F29E6D438D99914CFDE57D8CB4D46623A2C2CA711415C1331FB11B841323679A4776F08F24EDEA03EE3C0279F1B28547A5039311F9F60D97202DBC511A6FF96ECD663436D8B4602901910FFFE9E48C4BCC92777C6BCFF42743F4AD108F10E71F00D31D1E1B76661FDA1A80B60E95C8C698CF1209C25191C73CBE8B4F06D0C66AC2AAC079EE14179DEFD81D2DA5B0465F02DAB7781135F7E1C313CAC78438164812103083F3142F5DB90218873F7CCBD0EAF2B1B231331D5966530D9B63F540A495397F51B35B1FAF5EB52E7E5714EDF4FBB36F911CF44BFC92DFD8A1C9F85443CEDAB507C88E1D7AB1622595BFBA1EDB622BD3B461033F36868B4074DB443D7E013A37A99E285C510759F0DD5F977D914B28FF47B6BFA196FB5A16D38BD5F115DC35F5006666BDE926E842EA2406D345B9F7DD10C441138F1A370ABE16AA9F58C8AD6EEEEE472E82680129005B5BEEBD50924BC6299099CE037EE8FCB7E1EC6181BDE28F5BDB42D2A7B62BC0DCE7A9E8BA1FC27A7ED4938D5CE3533812443C468DB1A7CF496F6BC106FC773BE11E0F042348097066FD233BD80C42BA26BD1567D6F2EC17B09477FCA366352E69F281687419375C13AAC5C16405D8BDDD90A8AFF444B940AC9DC152CF161864149581BDBF01583F67C14E9480BD9D75E22FED8906252270FBF2DBBC5F3AF93D1C970658893B395A4A8483E0AB939B98EC4029B7C3108084834AB9572B8833A99DD2C6197F196EE60CC869C0D83C5E85EFAD15F2AB221D5F219FD695A9F2F255B520DC400E8D4E886B88F36803C196A2FBC7196E394AE0669F8FF4AFB2B826A98AF6AB3626A9AFD0092C8771CEFD8D97EC55B6BCA8D9D79F884D014EA747EC94B6E6556EBBA32FB2729EA2C6A5CC0639C9B21063230D8AB0F472BFA4BAC4F8E2468A8D1E5AE2DFD32D02EAD93BB7B6C1FCA9670A429072F6933D8FEEE3710DC5B5144F0209972654B7AA12A896890CC78AB767E556526A608CB9629E9962F57E9B830223740A50BBF8B8336D07851A54DD74406B038D95EE783180B80F1136E6D63C2CF5AF74240A5324C81663CE77F3E8F3CEEE0C743C6FC17637C21D823608AC5D3495DC45762BF2BCE98498B7362CB533D5D5D27ADDFFD48038FDC7638B38C253D10E6CA8155DACCF9A1FDDE75F80CFD6C67BFA55628EA7B44BBD9BA12D4E30F073216ABE9CEDF0869D39BFEC334ED666578810A283E32FD2875B7B4390A402E32BD15ACCB16B8EB078F0AF92467D94DDC9BB1CF88C108B6D17491B9D35F71094686CC082B7476296EFAC7E2BFDF936ECE7C673FCE9507259172D939EC3A165B9D3BF317D5E7513EDE5C24F0628445893B9679555C241D1B116C3E72A927F1CCEF01C34129B170CA96AFFA4BDA87E1883A365406DBC32BB581314D3F0E8FC2B0ED3BDBAF169F3E136EE8DA2CFBB247245E1A4371D1EE9F16A4387706201FC926A371DF49026C7028FC3D16A23AE539FB731BE5C46DCFA59583AB422B2A1A61BF9E3F6EA3EFD9E135C2CDB8DDAD962E443F8CB761EEF84840C1B1A063B14838EDB11398D47228481646291D417A2718D81B80B20D87F385C7C4B2A26D748B1F9158FA6F43B81F1EC2A24BC473F7EA4507CE719729B3160FB591494D0A7DDC7F5F01706939334AC33CA423635C7BF282DDD196968736E049E804B8C10BEAC7AC014DAFB880D983820C3152480FA41821DD31E3266D70A80E8B56891A037386E7CFF1DDBBB732D85C793D9F75B5BB8E7631B370E4556FD8652733CD46CD502D7D903D9EA7E6CE64AD13B78B105AD5DF10DF8C18BCCD910A922088B41B3A7EEC0DF987D8A109DEECCBEA5B7235375C701300C3007B7EB26CA9866AC13D72A037045A486725C5A57E8B7E32E42F9F9C6D5F548B521CEEDA89A991159413897CFA217629A3612681A92B185BE3C7C64D2D1FAFB09BE747AFF16A60E8B952D275CE23B0D5EA7122A051195C8CE49578D310111B860879D6336558EF3F9F62E459CA2D6339550E528AE05163C48DB89009FC3CA32C772BB78361A66201B84AC689F817A277307DE71A6A13356FFAFF3A4F9380C12F1E83B1DFC7B200C131651421C1227596B9941B3C819248740BE3C77F129F9BF635F4E104C3AD95356EC3D59A110E92BB2667B3502A6757C2AE31BC683661E1638C1194F6543256FEB41D2435D56250A28C7D665078E00923C89895BC2077305457D1C9BDA43347132784B08085B6D8C59356E72F944BA7E5ED2D5D80EE723DB295C139F80F9EAA39D957EE598FB9A748457177B7B38ED6F251FC3D1CC39B87DE88FA6D8182BF87327187362C52F74E5A90213D1C28208AE8F7274E950092A34CE15E7D3C3E9F5B2404A560122C6D02726BAF405223F83CFDBFE5A5F7FA3CDF6079BA1E40E6A5F3A8616C4107D3A9BD668D3D0C5A1D6A8CA760A14168D09207C7A37FE16E668DE215838A63D80681E24658FA127FB8C31F6E02D57C779CC60AD01060C851021BCAD61E3B3EEB30403EE68BBEF573965FED799E135E6F1259D397577379182891719C857D185539A67B4B3A54C44457064C64A0BF9745A3E4873A55386B219FDE1F3872B8F58EF4A20E9913A152A2105D8CA6CEDAB8232F2E89AFE97ED43F5DBCE17F4C5BA3F0D0CEE889980A8925DA1A3A0C00639D41B538966DE00E2B68F9AC9B13EC9D59A3789AEB8CEAB0768831AD7FE361B2C917EB90791E6A4BB94AB2CB29E626726F8D39512B79477B303FA30383741ED0BB893B7F11BC331C8B85D5F526D17B0AD6C9C93ECEE78461753CE2258F9F820ECB13A7D17F1E0E88391B112639C9CDC3EB734CD444D6E81B6A0667D94F0375127CA240995A841BC66B0D4DEFDBDFC6B93DD3D22D8F9DC348C142628CB45544858526C1D83A5BBF80F6EAD5CC8AEE5EC155BA8E248695D5505211D7D8505F9556FA73938511E4CF8974F73AD99BA9AE6CBF4015ACB31B4DF In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Nonce = 000102030405060708090A0B Key = 000102030405060708090A0B0C0D0E0F Out = BEA5E8798DBE7110031C144DA0B26122CEAAB9B05DF771A657149D53773463CB68C65778B058A635659C623211DEEA0DE30D2C381879F4C8 # From RFC 7253 Nonce = BBAA99887766554433221100 Key = 000102030405060708090A0B0C0D0E0F AD = In = Out = 785407BFFFC8AD9EDCC5520AC9111EE6 Nonce = BBAA99887766554433221101 Key = 000102030405060708090A0B0C0D0E0F AD = 0001020304050607 In = 0001020304050607 Out = 6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009 Nonce = BBAA99887766554433221102 Key = 000102030405060708090A0B0C0D0E0F AD = 0001020304050607 In = Out = 81017F8203F081277152FADE694A0A00 Nonce = BBAA99887766554433221103 Key = 000102030405060708090A0B0C0D0E0F AD = In = 0001020304050607 Out = 45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9 Nonce = BBAA99887766554433221104 Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E0F Out = 571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358 Nonce = BBAA99887766554433221105 Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F In = Out = 8CF761B6902EF764462AD86498CA6B97 Nonce = BBAA99887766554433221106 Key = 000102030405060708090A0B0C0D0E0F AD = In = 000102030405060708090A0B0C0D0E0F Out = 5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D Nonce = BBAA99887766554433221107 Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F1011121314151617 In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = 1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F Nonce = BBAA99887766554433221108 Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F1011121314151617 In = Out = 6DC225A071FC1B9F7C69F93B0F1E10DE Nonce = BBAA99887766554433221109 Key = 000102030405060708090A0B0C0D0E0F AD = In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = 221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF Nonce = BBAA9988776655443322110A Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240 Nonce = BBAA9988776655443322110B Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = Out = FE80690BEE8A485D11F32965BC9D2A32 Nonce = BBAA9988776655443322110C Key = 000102030405060708090A0B0C0D0E0F AD = In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Out = 2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF Nonce = BBAA9988776655443322110D Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Out = D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60 Nonce = BBAA9988776655443322110E Key = 000102030405060708090A0B0C0D0E0F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 In = Out = C5CD9D1850C141E358649994EE701B68 Nonce = BBAA9988776655443322110F Key = 000102030405060708090A0B0C0D0E0F AD = In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Out = 4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479 [AES-128/OCB(12)] Key = 0F0E0D0C0B0A09080706050403020100 Nonce = BBAA9988776655443322110D AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Out = 1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FDAC4F02AA # Generated by Botan, unconfirmed result [Threefish-512/OCB(32)] Key = 1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE8841792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1A0124B0A55BAE884 Nonce = D5CA91748410C1751FF8A2F61825 AD = C5CD9D1850C141E358649994EE701B68 In = 2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973 Out = 45EEFFF01CDA61695EA24B036074491FE61B96C94337F0F947FB4E10E679A9F2A825DF8CEA530A2784E5640A768DE536C76A79157E [SHACAL2/OCB(32)] # Generated by Botan, unconfirmed result Key = 4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5 Nonce = BBAA9988776655443322110D AD = C5CD9D1850C141E358649994EE701B68 In = FE80690BEE8A485D11F32965BC9D2A328CF761B6902EF764462AD86498CA6B97 Out = 0407C5404170DB1A74B7AB712A8FC7D459B3E4412C7ADF632545C05E50FB0C2FE97A92A81371E7F7C04AFA10C68375A31923EDAB327DB776DBBB99ED3318424E # Generated by OCB reference code calling OpenSSL SHA256_Transform Key = 6F98263502C983D78BC3F7B5208D488DC036F7BC1438AB55620CF8FB98767D070FA43C116DBFE9F883E0ADA36DF5302E2C27EA405F9595C1A18DBC3A043A4113 Nonce = BE3FA1AB2F040615988F275402796F0A614BB4D6E4974FB7BCDB685F8B64 AD = 1B08E7DCA97599E379D3258CB1A3B0FCE0 In = DE7E244B3D0D43C0EDF0635BE6948912BB7352 Out = 2FACBA6F0A62331845ACAB0F60EBA59BD2E4F4BC83A79FC73D2A0B5191C7492798BBDE2476B9D249247D1BD4B8F167333852B3 Key = 8182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0 Nonce = F0F1 AD = In = Out = 13EAF2583F2E24339182D3423D56759F0E05ABDD4682DBF9B1901CCCEC4FD639 botan-2.4.0/src/tests/data/aead/siv.vec000066400000000000000000003346061322470703100176670ustar00rootroot00000000000000 [AES-128/SIV] In = 112233445566778899AABBCCDDEE Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF AD = 101112131415161718191A1B1C1D1E1F2021222324252627 Out = 85632D07C6E8F37F950ACD320A2ECC9340C02B9690C4DC04DAEF7F6AFE5C In = 7468697320697320736F6D6520706C61696E7465787420746F20656E6372797074207573696E67205349562D414553 Key = 7F7E7D7C7B7A79787776757473727170404142434445464748494A4B4C4D4E4F AD = 00112233445566778899AABBCCDDEEFFDEADDADADEADDADAFFEEDDCCBBAA99887766554433221100 Nonce = 09F911029D74E35BD84156C5635688C1 Out = E21A9D0FE3BD3ED189C71F29B24C39E1E40B9BAB82D428D0A9B392F13EA14C9B4433F393595A8E031F032350F50D2B21825B3EE64958103BD8445C3F48E5CF # From https://github.com/cryptomator/siv-mode Key = 077840b2b53b2a15e284e6cbf1b8b0eeb0aa55951c34cf252e7f9f55194270a4 In = AD = b52b167e9be05ee0197d7ab0ca6b2f6f0d1fad747db4f39822652ec26947a92d480437aaa6cbebf5f9f1006afeb13ee820f6df2b80196cd8f091b11ccdb097ae25a23f8c3293c7fb8dbfdf080881a41871e9f61ad7ef4060fc65c2ba5147 Out = 8ce27d70831bfecf17fb82e39f88ade7 Key = 2a83f610a1d177ec2e008980dc02a66eeb75af6cba44a4e09f3d93ea1fa28867 In = AD = Out = 6bc5ca863229667518a9abbd5ae6c1d5 Key = f6de9819311bd3de0bd198709dea9fdfb82e8044e400132a90ffe9a9de814475 In = AD = 7bd36f2409fcd00f5ccd9af2e3f57645f7c53f39f7adcbf07a0e43307e55a2534749482020276c8a204422cd26bf7e8988380d94ff12c518fd202c2a1b00b3 Out = 4c0ec2cc6159b117db986d9aa5b4a011 Key = 3ed3da92fe8355679addb974419e1289bdd4f0ddc3b95d17c9a9adf9cab54d4f In = AD = Out = 348e2f4f8ffb946e05db7c3b5c72ccd0 Key = 90e590aeca1970edd19fe50fa691ae12342c497a22c24faa9e87192e3400fbce In = 44 AD = 2ddf87ac975d0c Out = 7b0ddd88743943c644c1d1a218a31edf2e Key = 668c74965b2f699d9b7f86cf13fe6db832ab907530a426e67e780312898a3b2f In = 05 AD = Out = df6c2c988b4e2f83a849e8b7b8fa2fdf46 Key = b42b6f969e9f73142da7cc1143d3854b991a74492f7c0e7eb1a53cd74b26c0b8 In = 00 AD = 83f9ae87b265edfcaf24ff9a560941070b49d315f174eee47344678455d62abac4170eb213ef05463d9645f4dbdf52741d497b587ca9bbf1fd0174eae980fba94c Out = 3f1d60e9b114093b2da1a8bba50a62746b Key = b1df5c321f8628e05fa1a450f39a485997afdb90fc497b0cdf5c25979413392f In = 00 AD = Out = 554230a62e6605ceec9774210c3f5af5d5 Key = f5a7423c21928efb878fcc87786a5554f0ec314d94096be6bac6e56dfe496510 In = cc59 AD = 491453bd8efdb5fd83147b64af0821fd9debe9956505ec0e6c3b10a710e70ab20d2cd121557480f59ff73f5d4d1b04e6a18f49c7840b2bfb70cb567b7ce330897c0c861722e584764d84dd93c420da3b Out = 1ad8a93cc79cebd8f661d71f20b45daf6181 Key = 07ff843948e8470a0022dd26aa2184bdfed07836ebcc019b3cb9a5d9e8eb482a In = 88e2 AD = Out = 58c97cfdd7def06e43cdb568af8c7057c8f1 Key = c5a907b45c33c2072e62f6d8104689f8701474b4eb42e0a2c04f65c761fd06bf In = 0000 AD = a94163cf131a4da611091ce5b521d3016f846e33608df1ab07bfb00d9fa80eb12801933cbf463c66b8a13c7dac1912858b7c070e516346ed48bd3f01b273460ee85da529d3eb1e81b293a37710d0e303a7461d30479aa27dd7d044f1edc0 Out = d6286dac2dd70e54846fd38680e77221a1be Key = f3c0bcfcc397a9beb07df81e970480409809d6f7580a3d85ae4485768c6de7e9 In = 0000 AD = Out = bd7755e9b5f4b83a36ab6936d6377cb88125 Key = adb49b3c2d525b6f822c0d4434c595b5502846aa9da58f1d293f81e7357ded99 In = 1646f8 AD = 719cc011f3f1b641cc Out = b203bffeaa99474de66e07c85ee3ed2337b86b Key = de92a0d3dc2906a7a486c224b28507f69a11a211da12e74a2c2153da6a378a3c In = f58bc0 AD = Out = 21775a807524f4fb96cae236b93e3a70e6fe2c Key = 84c5a03d8ef3cb07574f0bbd6fd75556a7f4d4c9d8a41d4e2ec4dcaadee27e6a In = 000000 AD = f0fd345e1b7161b76ae168c9b2c84ca7a067dcf9da1e524a9bfd888103a18e6df20de3e575fdbaf97e0701f5a3485a9ae4f9d577086dbf39139e73ab3a4c11bfa6d93e5f13ffdaaf3d64e4d28d0f2eeef4c973b42d68b277ffe6a8a922d312116a2c02a444d2baca2d169f4a1f501fb9972d3a2df900656626 Out = 107364cb3ad60732793e0ea4c74088b268b7d9 Key = d380b4fe512c6d283623e1459d598ac7a67e1cae82c98aa2ff570468cf448161 In = 000000 AD = Out = ad5f1eaef6cd62254150c636746b8039a97ce8 Key = c5525bea46dbbbe0874b2fe7b17e64fbba6cd933a07e069e0cf2c9a100e571ea In = db529bec AD = 4e209733ff39680099f638f3e830eb660efd93aa2cfc048cfa1bdf4f34cfcaad0514ca330e1214c143203b4d44da411e963660efb527657573eed82ede2f26d0ab116e267504642410fbd513ca3465b7c6c020602279e8cdea Out = a6be9795b564883f3600dcfe1dd2bc3f65a23aef Key = 1bfeb4db0fe5fd4d4b0f334589bf6573c2803573df3c2c8a6c4088a862b733b7 In = 756a798c AD = Out = 0cf6be7b226426148e9f0b7cf8dcf436e8837f35 Key = aee94dbe6a43581a14595d6a030873dd29146caf451b9f75aaeef6d2f9f61b49 In = 00000000 AD = ced111f8cd63042e632707a72be66c01c1b856e4c368837d962158bb954ca92d2593762dc6fdbc7dc8b40eec7323a84edd15a958d8ede4a63c89da2d889c6b9a3e8b6c0ed9e47fa2add5010deac690c47e4f83dc9d971c Out = 6ff63fd1cf82e323e29f0d584afba33cc7d7521a Key = c377e79039d83f65d050e7f76f27d8dead996cac60c9ba696f358ec0633436a5 In = 00000000 AD = Out = 6878a2399e5fa6c932dc7a3e813449ae06107462 Key = 8a750bc6ceb9b89af01052e400adb97bed540e2975054429ee945cc7a2189b16 In = 659989efb5 AD = 4c5908d71bd6482c23238c2eeb9cab255d4940018b92ba10236d78033bc19d1f0f6e4f6c9c2d32e7cab57f9aaadddc92b3f78467a989361c446bd3464b06dbff1ec8f56c1700a1e988633d4dbf927496 Out = ca50eccf7041f6522b30f4dca8551335975770a29e Key = 53dd5718694f878691d09cbe7ee4c3472745c84bc24ace61ad04f1173dedbf5a In = ac19873de0 AD = Out = 8bcccfc5dbbae3e77eb12503722034654e91673611 Key = de26f1fe80600ecb5a7de8e6d6bb82ed8bdf01127b0116f80b7b7e96b35a4574 In = 0000000000 AD = ae1ebcbfe6391535f96064a5b9e69aedc9a5d01c5a2e36072210974d6ab6e10df1167db228a6d04a30b657481e1bbe85de4e119bdf21b78fb67ba74c366077434c5ef2c647ca9815a6eec52ac20881aeb135bcc7cdee7d9cbd013f7dbc5f36f7dd71c582767bb1 Out = 022cec55f38a1f69f1f43e24c41401cef4758697f1 Key = 7aa08f0e3807c6bdc7a784d8380f8a9fcc76ae381a5582114c1de68a1d35ea61 In = 0000000000 AD = Out = dc75cbd0bc637f0a210acca882466f6569cc996f94 Key = ad3e4b638a543b3a870304808494c4ae6fe4925dc1287dd55eeb097ec713c2a1 In = 300e34e28e09 AD = 6a6300d4f03398313b8fffd4f79ee8 Out = 2da060f68f5c06823c7cf7a513f706892c7e55dcebac Key = 805efe50b125df39c01cdac30a2b9ba7e10fb376d5bbd6a729cf9df17e613bcb In = 2b244129fdcc AD = Out = 8c8ae391ca7bf493403916778eefd28e2a6901425530 Key = cdc7805e78839a94d5e4b823dfd0909953ccf9ada875e3cc97d230b1c29da7e9 In = 000000000000 AD = a9a381fce743501fb7b3f9eee7b54a92fb47f0835c2030c5ba60063de085a966cf9911125bd75e8ab5 Out = f7d538abd6cef62e28d8b0761d646e703356ac71634a Key = 0f222933406d2139fa732d31c9cfaffdeece34962b252b8e6c1c89d4142adab6 In = 000000000000 AD = Out = 5c429bd4fb488b176c7ffe8875eee0666cc87130482d Key = 0ff4e31c704fcdb6c959d2b4868e24eeb54eab20cf36d849a2918e50e66d23b7 In = ddd1bb20e38b99 AD = bf030625b8da742c2496e22c85a957cc838fbd8b8a663efd784fe49a0c4080ead7c8cb12e1853e9aa2642ce671f709e80bd5d9dc7681a81437e3bd010f50ba54b3d80c81c547b1e9a2235d0a28764296119550e17ecbb06336779671515ef2973f8e80dbd2feef64a1c47041aaf068 Out = f346e974cdfedc5c01252e8b350e8201cb8db6cfccd17a Key = 98c10d72f213d26de01962a653ad5cc11253d093ed92d5d1451008b4777914b0 In = caae3fd4102744 AD = Out = 11ecf3ba9325da04a600d0150b8651eced70558e2c3f23 Key = fff38d3970b02cdd15ae316c10db6a64873b54d6c21cbf5a10e1f2d262e85cd3 In = 00000000000000 AD = c338b78304897beb106773f9abd3dc2c7e64fd8b6c0246e5d4a62753011f7472548c04c198a40bf1c8d246edbb6afb4a3632199363f7a144faecaf9536 Out = 49cab926a87de9b6f23cf6e70e6621f15e6b1d5830f01e Key = ef0668f115f1ee9bbd33c3c134401118563e71b714d9b339b0a64b799ad6887b In = 00000000000000 AD = Out = e1a146e8cc5e1f6dda4efd60d81ebdde045591c15b0fdd Key = 8e6ebacaf43a20126289ce28f79ee39fafab5093c0afd6ec2a1e266049551d84 In = 9d5420248e4f77fb AD = ee9da13d2453edca0398ee1708a5a34f431f3a325cb1907ba92e72 Out = 6bfa01832815976fdd98584284b07941e2bdd90100c05c0f Key = b275e224f4fdd4bcf3d7443e3aed0a2485a29f2451805b89154d321cc28efa69 In = a99cbaf35421d347 AD = Out = 18d21616e7e711a4b7d2f728ea02a5ad8764e6d83b0fabf0 Key = c1eafe8cdd7e42b2c075efef05dab5d3cc9714fda3daf0510c09e0dfa478dfd9 In = 0000000000000000 AD = 89dfb83a9a71bd9f65c2ba61ebf674467c9dd52fdedda8c1342a1eb6d31a33ed7a61723ca1ec231ef9e73bd5bfdd6d9037ed25c63c576641f957cf74a29dcbfa82c5bfdc28906e339b0416097c68f367039495eb2407ccd7067b5ccfb7208a9f088b19b6f1aedb15a554acc170a0fa96b6 Out = a3d4e366b05d628d481dea81cc09dde32606fab8a9b89b3b Key = f2495a67f2584bebf4444519641778b592f9f8fcafbc3c89655dc47987e0d713 In = 0000000000000000 AD = Out = e2f5ccacb39f2a67c60d8586620e9780f28bf96eed10dd93 Key = e68a4fb89d0bb2f173eb04a24c5aac5ee442b942f979453c5d25e4366c3c3063 In = 762fe3f634ed787506 AD = bbc508dbc040ff7a8e507ca46e383bc16267522fdeb74fcbc4335e9b8295a9f2f2ede228d71b939dac62709d639cc881047212d1a5db308b6015cd80cff1ce Out = 55a4e519157e2bc7da5e969d1e93b77e97f5c228d772d2b1ef Key = 5701c2553891cac4483b04201fd55b6a07e93a3428102bfbead26a48e3952a6f In = 63b6167a55f4ed19c9 AD = Out = 022e1a22550c5a0162afdb4070a379d951452fdca846643162 Key = f0616e02dcde0ffa7c607bfaedfe4ed894789a4faa60b761e73a45baaacb7bfa In = 000000000000000000 AD = 4e76b2d3761386572c65c596e8bbc696c754f63d377fd157ff6d0c4d677f7c543ee47040830ffd60d6bfa4ba641bb04bf81303306bcc4dc79654b1abe579f759dc417482 Out = 8de138226a301abfef9e84f756d9625a453b0aefec2f66d079 Key = 958817f13af78f02b5361b1a2a8dfa67134394141fcfdd479dbe29b4dcbe15ba In = 000000000000000000 AD = Out = 5d09835294927a348488bc9f456e64b94663c8c63815dce026 Key = ea90bcf27772d6bb9badd8a454d8ecd516c92112cc020c5db3e9ea253e3157a8 In = c28abe57a422e442763c AD = 4a6a667d76f13fd3470e61c8c78cc72ff7e970208467584b74f40c03286f8023f481abecab5e6c5fea3512f37dfa769660fc47536e9f72796b0fb6e2d8e3c550171cc8413c97839341ed83fdf8a6098045210aedee2c0f0594256b Out = 33f119a20a115706c8437e186fd3167126d0290e4255c5810c84 Key = e5487555cbf18aea4c647c643414b2b343a9269e42b4ae97a7cfbb35848f2967 In = 53e73d5024b09ca6d668 AD = Out = 568baf261c4f80c438c8cb0b21a3fd6d87a46107ddc945dca1de Key = 0e846753100c81465f9f88931560feac7a93ab36812cab41351597ec1c203767 In = 00000000000000000000 AD = 7e54c85f25f8c0c359c62984a64e3fc84726fdf7b0d9342cbe6f60996d095b48193eecb7ad Out = bb4c40db761fde5063459462d571a41beb52b4068001afc6ba28 Key = 772a7312fd59375b8770bc8019e60e6825bc7cba1229d6527dc6a59de422d645 In = 00000000000000000000 AD = Out = 7222d2338b9fa86d501e819691b3ca9bc0aff931a0d20deb907e Key = 9cc5c48a3e40f0cd85ace3728db4af9423a7b19ed1fc4bc11d6fcd8a9202fad6 In = 9e0cc57c9018b4f6f07a14 AD = 455fd8764aafa3cab20c006996f0967af32a827cb06970aba55c0ae76a Out = 6b5811a28cea70b80987044297a4e5e36e1aeb142c03ba70a6f2c9 Key = 4c09acdb4f66a876a31927a60b6954d8d55faa5276486bf12c26350dd6a3e238 In = 71fd2b4536991ced2bb4c6 AD = Out = 3ac42a83168ea129012cb77ca407a203584f2a03e28d882e03102f Key = a53b9935be5cf9ae17bea2f639c4367a96b1d041ed10c9223f7295d438aae68d In = 0000000000000000000000 AD = f0e2ba0b8a3333fb9ff16795949e4d914d8dab3a56d70931e7265125363fceb9b254343c5f260fb52507f17fac130a9ca8029fd61d872d700223dca640dd43369c3c239a36922d1ecb772a585fcc40081c47907a5bdeb13040ffe82755c40b86d60606e24f4212ac8522fce822 Out = 0e3cd88184ecdff997ebf61cfce574c2b00fc5bd28d8705e172ba3 Key = 91da30b613b7b318af729239ab2cfab93b3f05227a479e99b141b0ec6151a311 In = 0000000000000000000000 AD = Out = 10a715668301a4bb7ca65daba7c3098231c284b26bbdd43b342ef3 Key = f8dc379eb99238083678117b47228e489e3e66c272e8f6b40a5463b7d46eb5d7 In = 6038a1b269118025d2b6f8b3 AD = 13733e7928d33e7574d63ea60fab052637329a333c65f51670771d4af82009f8c7f7df14834512cd6cf8ebb8 Out = f383b639ab86d83e7c4c22735eabace9d1831a87674aa3f9eb051444 Key = 80aa88f87aee22acb67cdc7879668e8940d542ad73f0686360ddb2bd85e43324 In = 11a85a4fe22000e6afc53ec6 AD = Out = 5cf457434ae0693c932fe89585b20bcb57e2821a4e241a69d57ad22b Key = f7363511fee916eabcaac70da3e6e6b8ecefcf12dc451d9767b99644a8fdab58 In = 000000000000000000000000 AD = c2eda7f937f5f77308b9003e54e748856119c26c85bbe358b0457ef6997145e0d3e201c15157a728ad26a49f9b64e476b0274f0769bbcb22d862a1747f1212249edeaaddaab56c0bd2f90d53 Out = bbaa569b8a9119eedc9a1cd0070dc730fcb7702a473bdf47884f19b3 Key = bf6ec75e73ff7cc5cc27a274c9bd32651efbe02cfcebbadbb0d4ab47745e8d8b In = 000000000000000000000000 AD = Out = ff4247a9b083e6b16f7861783f4729bcc03a5a030f69e47a6084a409 Key = 0c4a18c514baca5076ce6192425b5c093bc9607e69fd3a9c0af51e668266dc28 In = cfe11509f58c6b0dcc35b02027 AD = e0e96b09951a0be2b09307e6125dbc53 Out = 31548c2b246c5fb429d281a7503bbb99bfb9060451d8f5c67710326063 Key = d519e6a2668ddcb229825545d9f0888046a6792096e8485002946aca37947f34 In = b48167a3ee604ffb7178fdf428 AD = Out = 1b2a65f4846f2b4510f5a99af7992112ce61ed26fb580879cf8dbfba59 Key = e2571898fa9c97c4b8983438baa15c5e700c8828bf4a084ed0feeddb8b4a15dc In = 00000000000000000000000000 AD = 5561ea83100d34ee Out = d9cd7f6fe8ae45a369bb222c1e74c718b4a9a5a0e54d357875ceeb93f9 Key = d48d0b202c012fef715812c706d31df0b4c1840a296a33316ad5fa7283d5327f In = 00000000000000000000000000 AD = Out = 4d58b82d5b83c449e7300460df6ea43e6c90eeea5b2aec2b3e718a6fea Key = 8eb2f6bb5eb93bdd79a6ee1829c59fe96c99694933a3ac7c0d04280a48e8a92c In = fb0dc347d2202462abd4e202eb2f AD = 7f48b7458d43b88b18a2628377ed79b4e487b42911e7403f77e3134643d61c816d41141f6f5519bd60e80712d661613afb1e1c3427ca15c5f83eade49c74af6773199082cd7465f36ba5 Out = 0584af8bc8a0143dcb8cfbd7309b106bbb30f8ac7dc10b32c8d48db8fb08 Key = eca020f8487aa4a9b0917f28e3d95cdf2b7efeab3259958c647a5e9a4887f724 In = d2e5e04b54b2cbb2cea36b432fa8 AD = Out = a706df116f6d8bb9e3d11fbc04799d607277516da6d82ef3562079ca92ec Key = d0311453221a0e741afba7bce64364f54a7416613db23637d8850b9ba2625977 In = 0000000000000000000000000000 AD = feeca874054aabcde323d98197839fb7e18914274d305067a26a1996f3ab1b048791078324a97d020354fae3e43e4cbbc149323e19f6a19fc237 Out = 1dccd7cab6f1e938cda649ed049650a56ac16a808284c22c1f8d1b030e8d Key = 6be26f217018c2595cdb443a0d9f01a6558277bd97bf0760cf610ec23b06a548 In = 0000000000000000000000000000 AD = Out = ed0cb9c444fd821b7806b2d7c119d1a1e33f16708ab4246898b0d1b9de71 Key = 7beef734c23ed81b70f5e5c086d70888e66cc37f37f09268c4db84a588228d90 In = c602c53c841b2b91d3a9876cc2ebe9 AD = b903ab9ef3e96daf4f4dde5d94a2123b20d1952f27ee1be665a2f4a5823fa6bb6e91eecc72961e8e307baec5de85cc63090c49b7dc6da7f6e2f6d74969a5eb7475 Out = 5ff6ce10e48606e7ca2e2ef7c8d40650e05f96367fe25677ff97363018d297 Key = 865c6b7ee544992e3bf3137c61a0ecc396c9f65e4f87c69cb89ebc1c69a12d42 In = 9cd1b59510f43bb0cb9dff4cb209f6 AD = Out = 450505f87def1f5692de72c2810215f0a6c9eaca0c93e1619b15ee0b2adbab Key = 2c41cb78a17e8ad22a16969bb1b464fe5c2db1f6c80f669d8f3e3a6da08b5b88 In = 000000000000000000000000000000 AD = 8ba874c08d11390c6b42251c3b4c76128e9580f584aea5eed9aa9cf3f1e3b4c641b94b1eda5d3bb81d8058daab20e8c5dce85b33e5363e78fbeccdb1784749a7c1027825a8746b0944b114b28762a517cdedb9b6caf35c Out = 03e565e319330f0a8aa86188e857d37cfc3c34af4ae47d6466753aa299f046 Key = cd9b2d07f7660fba31e500bccefaa6eb79e2afdae80c32e20c0635d49a25c23e In = 000000000000000000000000000000 AD = Out = ccf2fa5d0b62ab9e3f0404d07b8547a526cdb6206a3250a35dd4fd475a7ec0 Key = 1332e570e504718b31e9a66db815dbcc3e4e40d459b268afe29036c8c22e705d In = 0b0ebdbad90c49f269a6416e52d80e99 AD = 2c7b04f503ea8e8b1cf0f4f8a07fb1cab41449a65808434ff318b7f8e48c828fd8db59edef534cae21e55c0f5216adfddbf6c3d3e73acb21efc21b9ae36418554f949911715f4d855feccadd2333db1bf1b0c18030d63375ac59de3457bcfbdf460a60dfd86a36aa Out = 7bce44b86bd000c8af1d2ed7bf237a3093c5ec5536fee79b874ad5b38f868b36 Key = 97ef57d4e2e92f14df7331fba3d9f35887dde7ad8691fb80176858d659201427 In = 7573974d6fa765bcd0e6232c240e827e AD = Out = 6860a9c7bf4a6b219244d7a8eaa1f50c6f979382cde68de60ab2ad0953606485 Key = 041f906d92f669c31ad0dc76992a5a579092d00cf0736ba56c58291dd93c7abe In = 00000000000000000000000000000000 AD = 91fbbc94ca09f0a232f6eacbb6eee0021bb35e6ac13cfa32043132e21b55a15db7806894a03c27c8983de163aa24208a56c0906ff6311eed5f99c85c27673a9ba5672e Out = 983285752cffc22e4002bb937e36f2e664bedc5850d11490fe6484bde94c52a9 Key = 3dc9801c56c83dfd66c856d6ee0a5fdf3ebb579e72d1d4bcf0bf57edd2554526 In = 00000000000000000000000000000000 AD = Out = cf5c840022deee6c38191765e41934db58b3f401813587dbe663b7cd83315822 Key = 11512beac4cb2ad793807a5f5229db434091cf78060134f489e13186b3ca4c26 In = 98a6b95f5d4361b920c934875180337f49 AD = f35d228923bc3d223c2f557f647c302b41cc5ae658bcf748efad4ab3b0ad1ef3c2e3d8546fb9d0fb43748472517f468fc9d911553946124853cf26d8faff9d603efdaf05dc7c412088eb37045cc992e104e509935653aaa0fb2dc6645ccb7fb75d53c34be9cfc30f59c184a3706298f057eb5d10898268 Out = 3b3e570962870292533712fdc3261ef90a422b55b51a165935d85bfe59498f8300 Key = 6416b2fa44bad38695c3f70099c11c154742b10792b73578da67dda0845159c0 In = b0a1a3680f00f6cf421cf20923a5c3ff6b AD = Out = 66731536386ae49bdf7c6ec44e3719efd044ada662f9511cbf4d3a1fc893366a51 Key = 93ed0067b392727f39909ff0626774da345a8a801797f1b492230940729da5dc In = 0000000000000000000000000000000000 AD = c6df4df0d1ff63d5712f24071ce42d8c623de2843e54ab6f87dfbbd3693cf1d7a10d1b4bdb6910b7529640e2e64cc044fb7d4cb852e71940d8336842ae87b47fe098a78bb30bacaf Out = 398f4897850eaaace7b55782fc7ccd7427d2778a73a6f0abf7f86c06200b776eee Key = a4f8f515a97c2211729c4c21ec3d8f106339b5abb2e4fefe54a312fea0a2a2ca In = 0000000000000000000000000000000000 AD = Out = f2b1d9a72b6eae5394c7b3f5b1147a25e00a86bee14e5d858367d5493b4289cc96 Key = 5a7d9f4b26c3a18aab8744a2825073d1cf167e71ab87be43fe352de455d24866 In = f286f9d4c797addc73968e5c898e9d34374b AD = aa60eabf1f161e78f11c621168ec5b59f50cc007e270179e5ad426f632687a388eecb734672539fa174c310dda17b1f4fe23b02a885754500e17b4aed24f461e2f362b3da5d0a599d1f872a846cc6014fb78a4ef704d9f9e68cd520a060f85ba0396abcb93c888b0 Out = 1d28dd76d975803f0366f89f390602304905d6baf7f46aed6136268dea4339491718 Key = 8a69175ee846c5f60584bccdaa5c82e61d3294b296c40a342244b7faaf94144a In = f9e409d8f1916c1483db1b426b1b17ceab43 AD = Out = 214a668650943d5cde1667dce674b4cde29a51f203c197b106583e289ace27abd5ae Key = 33f04dd077783410a157a4939733c4168553f91adc419517111da3ee77ee4fb1 In = 000000000000000000000000000000000000 AD = 67878e8002e0198a7a8bdc182e64e2de41b928ecfaa14c003c19c7d8e3a2e1c4104ce7037bb4d5532ac0585b4876f8b977398a8e26242c114c993fac79ed9d064aa7e8e84194ff9e759a7fd5f07fcf8be78364ea254d4ff8 Out = 32635e0e5003e7ac2832b9d2da720fe11a5aac1fca184fae7421c2ec4897ae61c5aa Key = ef5058a402e5a7032c464c4c43554fe7b58f3929a5564819744aae68072c3075 In = 000000000000000000000000000000000000 AD = Out = f33b064a85e9afca3e70b8705a83d55634c8bd36095ebc7723cf0149de1c8fa9a4d9 Key = f28cf68dd75717a4c81df586da9cceadc57375d5ce6dba7e599b474e67f44c48 In = b65e0483cb1334d5b413bb35d84c3f5642b8d3 AD = 3d64e1db3d82c9bb75d60ca4e4aa70272a31249be14cee10213fd30808a114216bdd0f6ca18e17f1427c5e292c372e0339bfd585a744581ee90d967adb8f3f7c4d Out = c8f8d6d25a652c405191ccd017cec230caabbcd2a84abf6c96204ce166cb934182d42b Key = f58c7cbf65083fdace237be03e592bcdf0ad1c8ce2f3f125e76348f25edac759 In = 6a7cbe09cd0c6727d65be9f1734b41bb85a8a2 AD = Out = a8b4d670a13f53dba6c8ea739f3cfc407118f0096ced91d173fdc04561cfce975250f5 Key = c5cc8a2498340c923bb83fe663aeb808b5bb7ca1bb4ee29f13183d3e479d9b9b In = 00000000000000000000000000000000000000 AD = 8a Out = fb20c5519b3badc3223846777fa0ce7e7c367e21ff9e6f5263107601e35fa4bedef988 Key = 71b0bf051f81731a580af78c7a383091eb35691dac7e54192fd1a625b4405429 In = 00000000000000000000000000000000000000 AD = Out = 566798a46bb4f765461407e33b6170cce397b1bd8a3ff192f03245f2f38f1cf25bcb43 Key = e6d96b545e4cfcb0e75a7194ad5c385cbb7a0fbee58af02f0291b858ec3d84c4 In = e1c2fd6449f6672b723d1ba9742a946f1ecee114 AD = 078be68a9bfd74ba Out = e6aa5800986e8fcc7d072af79e42e08d19220951dc8fcfcc17ef05a89f8fc59b7484874b Key = 3c1e4fb7f589e59cf288ad50276fe30ce818694145b87af76afd76ae5a7e9fa8 In = 4a4eac5bd893fed6add39927b0654a62a937f8c7 AD = Out = bc560ce312a801452ce320879b652d61391ca8ca2e39fc48841d6508607d0846b53cfbb5 Key = c28ee2dc5368ecd33e83e1e5af771e79176e00400e1d43ec8884529c54d75bf3 In = 0000000000000000000000000000000000000000 AD = 30ad64ebedc802ab3d89567b2b7724d8736d0cbd4dcd69c41dc7be26647448f4e32ae84f8bce281b7a867059b8848dad3a7e57d2a1a2384fc74eff94622c91f07b3370efb8ab09dcb6503ce857bc18d1b7711aa74ecfe92e7683a41836873d6d3b46a0df46f3e06c881fd7f4 Out = c22a2175ef3f7d9c482403f713917884b8adb08bc25ac521401e317367243960de28b0e6 Key = b658317f129504032b1e8b80c1d19c9b957574c3ab4dbd89aca603090883f742 In = 0000000000000000000000000000000000000000 AD = Out = f5debf80fa92f562a1fea908907b6d5fef77ee9397e3eba2ea7fd35272e8b06fa8e02864 Key = 6f772452487f44da8afe3ccf8482c078a2dae540a5159f7f7ceb6d98b24510f2 In = 7c64b221a291bcff3c7ddf2e2cd84cf688adde78d1 AD = 9a6cbf2658fbac9b77b81c3bc1d5736d09430d47bbe3278ad50e3b12e58bb14f38f32d983667adb3 Out = e599694eac218a477378a3a38b10227502fe5e3a1a53ee228810713b195a2d0d65e9ae9fcc Key = 2ee6d8415b5f53bf070809d42c3a949bdf0be625db034d20b17999047f75305e In = 191aa532d7d49345a9394d769e3a943e22a4201fd7 AD = Out = e763392b4c4f1c691ba92014106635a666b4c36bb9c85dded87a00718992ded044f06f3ca5 Key = e5a1e5240704c6bc9695a13e07b5069e0f4977cd30414cac375713439ecd6704 In = 000000000000000000000000000000000000000000 AD = f6b5afbc99b3e1b82da0a2aa7df31d74072431cc03cdd88ada9a82b9c21a4bc875dace122bfce60cf54efa5c8addba7b47b0e704ee766d4b8f4254ce38de358248ea6244e2 Out = 97d69eeb15fbcd4ce6732c5f7da6671f2090e774703c38d6d0dd46ef1fcc48d5eb72346707 Key = 660b5a0ffb0616b526540682df68916f29a648a05559a60cd263b3ea7d7a0426 In = 000000000000000000000000000000000000000000 AD = Out = f3f99d7c16457229d9a3fed57a906ce6697b3ee6c2dd3c4bce669e4143af6b2aadbf67c23a Key = fdf3f7da61767354c050727e816eb6a34535339bc4c54f8c279b4e85f082304f In = 7f4b0c3b1de3fa347e11418d33ab85dbac4c5eab9a5a AD = c7beebb3d70dc6035525418581f8915697a7fd3222363881b86c0d47815f445970d4b1590e99c15c72fc376695e0a3cba1031b3c10d3625b3ea2a819ddee43dfb3c00bc21c3e4950bd124bb19c7a8e0d9d76cebf98a1c4ce49883ee486 Out = 75a92553cf435213e25ae4e9fd5d9e578681f0e59708bc4b31b26c3093dc9e8e02321d5d551b Key = 7721bedd07c7d12a6354a9576970bb9d334dca98dfa88785ab2665230916f62a In = 329acc7dcc41371593cddaa15ee342e94987995cd7be AD = Out = a18aa3b7aa22303a118616939f7e642914e0f9feda14b7d178dd32fe6a3b4551cbd14432cc2f Key = e628d931a1a359ac35bf88a2b9548ea228a7ea2466d784eee8d4e8f36b3aada1 In = 00000000000000000000000000000000000000000000 AD = 2ed2b3342d4ccff0113ab84a26c6f03aacdf978fb9f4fe6d47c7e5fa5bc04ca74b6e96e69a4a7d441ff260a6bdd7c7e77f86f7a83c4989 Out = 24f08f3b76bd5f57daffeb62ed05eb854542ea8f1426cb30e502db5eb13e60e917850b24ee03 Key = 1bd96e93a58ebc718f4c700d59c28620bacda1a9a68655957ac6b83f583eb878 In = 00000000000000000000000000000000000000000000 AD = Out = 03b8bee3553b1bdf2b8f400924b6e8713ac583b55da81a593e075702941f57b52c87c9043f5c Key = ed9468b2a3a19dafa9234968c8872ddcfe1486bde74e5b00b990774c10c60597 In = e8b46274555696946ef14c297a9f0a63c8dc2c9322abde AD = 098e77a0f74989dd26416e8986fd62f406407fb5c330a4f3b361c050eab4892bf8681dfb57 Out = fe5f2b3e91dbee72ccb5ab096efa2df7aeb31939bd0b5dd41bd3b0fe24bedda8feb670a88d28d4 Key = 451eacb363f2e94263103dc209c602616110a31e97655e7d81553f36f980afd0 In = ae369989fed5024871cd1593687a9294157beb6c4add25 AD = Out = 7c7df53823f708f10c3e5f0ef5423f2cd754ac456276ab2cd64f7bfdd5835abad3ba48b087b59b Key = 98afcbdb4deee55425861446956bf79cf59ceff2ae8851de4bb76266b3c34350 In = 0000000000000000000000000000000000000000000000 AD = b0c98ee2f1621ba4ae6bf268d2be1e00a9c6ccfdf7cd9ab8c903e813 Out = 2191a595d2f4ede7762834cf46912e3710ffbd4423ad5ca1bee1d2ecc6f185e8c921cdfdae23c6 Key = 94fccd80afc2ffc31fec33db42d9052e5cf4a2d27bc61725faac15dd57622432 In = 0000000000000000000000000000000000000000000000 AD = Out = 7d9ebf99f2cd371c5b5977c2fe03a6138ee55d801505b090a6118c70a3e6bd892b9c10e6df14a5 Key = 0c6ce6f783826608745a0960b71d96a2d234fa8d0f8eed7b63e2be3ceb74b735 In = 0c81291f224273a2781199ab0c27f089dc0bb523cf3693c0 AD = 7f65a4d2d2b051 Out = 79a5a08b9eff8d9219ab06174ad1004c03ce29df2f11ca69f76a0e8d8f0239c49130a28920e7e51c Key = f71410a45a128a19fc34301dcd310d50638d3c3c18ff1dbc217b84d25fc5edd1 In = eaddf7cb85eec008651474d2b8d9c3a1e06c8087dba51712 AD = Out = fd7a9d4768b6079ece4196286c1aea4cc6f426559e92b6b9ea88df09e4d4a820105feee4e7f776dc Key = 0efcc476fec062a956cea1e3fad45ff241e8378801f7035ca61d81dd6034ee7c In = 000000000000000000000000000000000000000000000000 AD = e5c04fc80d8b99a2358d2eb32c3bda69b381aa75 Out = d3c1f05742765a42b098f1f6a3b4562dc8acb23c265c6c40ee575c7fa41ef9f6e738b313452ad03f Key = 918f4e48f8721e2ad7bb9e3f53bb85d537457467af9c02e16bf652e70b0db6a6 In = 000000000000000000000000000000000000000000000000 AD = Out = 51ed8a7bae16b68f6d9ffe744e05ff0146d769bd7d74c302f3cb715265081369749f7c35927efbe4 Key = dd7cea110f3b0d0409e2d7654930f38ad8535924d13ccf664e7f73670a83b78a In = 9ae84f00c0d6a646abda8c23b8da3ea66f5f53bba5b796b281 AD = 96e48a9bdeadd27d697609d024b88f5daedf750f247902d5e4efb3ec4b9832f3ba6fc1ebe82db14f3afe2c464ec8237da7a5a0dabcf5c3bead3d7b3b4f6a720b41994ea5b1c470ce307822a0366271e43294533f89531d41f7 Out = 928b481f2fa372fd53df3b0e89c0fd1194f936c8b2bd01e95619ca64e47d5c81b60f7841d7dd763d4d Key = b7e3c65765b04cf027a8095b4a4544a82781783b4042bc5518f488aa3c4b20a9 In = 862b5bc3d1acc35fd66b5db4b2be1cc02f1ab63891bdbc66a3 AD = Out = 217798451aba67c4c45a4e71f834c52efa807f0ca9fe3f0c602ecb83e2ce9a1e8fa3313b3cfa0ad04f Key = 76619109ed42ef8f76e790b59ab23509536e4a4762de274296b18d85efd70f84 In = 00000000000000000000000000000000000000000000000000 AD = c2486941760e86e86c4790b78013da8720c38e301d2eb0283d67bc343934988d2c552534f5246089429c23f4eb3b400375610cc4ef53be499406e2ca945fab484c8daad61e734f347cfeb685ada9ac43e0a608 Out = 6209d29854b0c441c433075f903d344e1aded94f75dd832a0e7b02fa66e714e0ce421c200b38876513 Key = d58a6ebc766571a792f0c7b6859b3ace10b87b20db911f3fee10ca4da427137f In = 00000000000000000000000000000000000000000000000000 AD = Out = c3040641906bb4958c5cfeb8366921d0a4efc3f206c910a3dce8e37652e437f7cc49d58367e614d886 Key = 686b0b3153ed53513a36d1a6130ebbdef1da694d0aec50204fc22fe134c03e6c In = e59d7b15d39ec6aefb8405951c5a49c388357397f1cca83fa89e AD = ccf35570f4f8b2029abefc6125c3017b090929d98c629f4498c636aed3ef76afb0fe978807a911bc30130637b19962cd754734d587d9d26701b0bfb7d9ab3cdf7e9512fb2860bff0ba8caa909cfc4674f2d8d1fec7eaa96ad1340426df13c4777fd12aa6108bef225ef5b1710d4e14f17e9584c43a44094f3e82f368b83f1c73 Out = 7ce309f64264a27fa2742ef0a8eb8cf2c8848f5e495770e4681340e47d60831009ea0d431cadaccd5439 Key = a5902c1fb4eeab2d9b58f2a2a4283d48a9a9c611f8bd21c991af90e4b9ea4992 In = 3a86d8eb2ed0de830e5013e5c5a06ff5306fc41f45fc4565ec36 AD = Out = 773c0a1310bd0ed1c1ec8dd71a749e08bf2c3c149ed4b58a4e016f5477d57c87532cded8b6c7574ae49c Key = be6df50aebfffabce4a14fbb7b164de00c3fc4f2abf3d000be7421d36c66a102 In = 0000000000000000000000000000000000000000000000000000 AD = 84e9fec2e90826c111c2c4fdf42d7bbf718e25c5edcdbdd965f5432fe5b82d93f7b198f8f86bd99421ad796e9c9fa27b910660d70d50c5d5cef5b7990954fd2a2bf9163abd55434ae58f02bfaebba72debb8d9a793f44d994cab53dbe56a32e1564b443a7294011ca4bbf4 Out = 311875ae9e294980b550fd00e9b1533cf40abbdcabc45f49027f1b0f2cf2b1b6fee22e5c1e8d69b6ef6a Key = 3208f38da325845aabbb4a6d7fd5248e1ac5647ca12aa2477e1669b99bce2d86 In = 0000000000000000000000000000000000000000000000000000 AD = Out = e549dbc72ecb7076643710d536b46d3dbdff9936224489a0a9b56813c761179b7d72292a3b07d2c93334 Key = 8d62430aa04ae93cdd433ce89b770ca7b8dffb2b035e7eb71dbc23ab650bb4b8 In = 81184d57081e0fdd0c73ba83ec0020a53e687b56ecc472a932a429 AD = d7c28da6a6 Out = 50afb028a6ea650faf0cc0581e1a9dafcaa0b0214944b22be8741103a318abbd78fa21a4382ee9b83b5a65 Key = bc5395d0001b35317c3a87a8c5a0136062012ffaf9aad93168cdbef57e546a8d In = 63f72319b3b860e29b3bea0783d6dedb0cb6cbf31f6771e78ca81b AD = Out = 4a56cbe93ddb9dd899cb527e9bc9487ca2745de6661445239657a7d5e22c667fe63c5671214944faa258f4 Key = 8d2790d82d82701427df0a28926815c6aef3f3d4a3bb2e08b00e166f0f26f370 In = 000000000000000000000000000000000000000000000000000000 AD = d7d0f3e450ea534c87f9dd1e09ad90ec6de17c77a66e0e785fe5df0819e9f8972f1f886dabee9a0ff5640e146b09d8f47bae929941543193b04f7516b70f2bd2088f5179abb8add2270b0fc5ef Out = 2c841a5b52198ea29ff9e07ae700198592e5cb08f495c37f3aa0f936f01c89be112f44f265cdb4dde17b84 Key = dac39e41330b14740b57e55b5773c6ebcac4799f91c2a8a401bd5171c6db1b46 In = 000000000000000000000000000000000000000000000000000000 AD = Out = 2fe37b2230c315183056bb76fcc23e47f24e326dfa7f6fecdbca90b1700462dcb83d08b75037ea52ab24f0 Key = fa8bdf49c812242bbb6c2683b580c85c6e68b55d2d36f3895a305e49f0b37527 In = 83fe22121d9a2e6ee6f8c394e61820fa0628643b3b6d41c98befca43 AD = 56f4642982b0337edca5e8bcca483ed63b798c843559b2b35fe6fa65e95c9de0b953734e202836cea6d0509e42a58fdd65df60e53ad2b8afbeb4e29793f9dbed19faaf9af4e0fef4b173558e21d30431f15552263036a0f8dc Out = 7e51778c06ca9cf3cd5e8cc87873da6b21d6d18324537f53d1540524ff291b5e17890072cb0f6a4d0229f3eb Key = e051434de9a7b6f17460f87bd7019363555c07b59380877fc4aba280088b7eba In = 6be9ebc2ca6a7369076238468ff15e9282fc8524bc8eaef0831d417e AD = Out = 8617c93f7eaf3c6f5e43b2cc84f34d627551342ea40536d0c71647ec59386bc49da3435c160b53983fd234c4 Key = 649fbede450f010c0cf6761aa28f75237c41fe86d9baac8443a9aef66e7b6516 In = 00000000000000000000000000000000000000000000000000000000 AD = 0f520241daf5bfc7696cd3c654a7fac30c3430b85ec3f9dfe209c612251d21dc18f4bc61109968360f8bfd784b86dc0acb3a997756abaf7249fa77d964087eabb9f9da670b65b9739a9a387477b33f8dce6c01238e40c043e366f24524456ac635 Out = fa3d045b4af7f6d256d5c2bf41c91dcadedf270a0abffed6ec202d2c8013c5c060bce90a24128f1c69455555 Key = fd9a71ebeb5fcc583458893d08ec568774e292eb9c1c629b6cee7be0d77bc576 In = 00000000000000000000000000000000000000000000000000000000 AD = Out = 0ec4378b62c67c4dd43057a6153b0caf23f3beb16ae86cf1254f1f3528f0e01f8b6a42da5662254d25204a3e Key = 80d960ff623917305b38f3a579befdb18118ae3830d94233118ec8587bf93469 In = 10a91eb2c1998dd908dbe564dbc885c710e2c84d6d38a4910c7df84b5b AD = 289db332ec471a06de30fd731cf8346f7dc0bce5b60c6301e2aeafcb43829a9337929cee3565f80256dabb86b006e7433f9ac36f5d3bbdc6879f92d5ae27bb2a0fede6bd57bd3f47a4eec22c1bc294ceb9cecf1e0e08f7609c01d249fed8fecf6a67bc8ca989de064d44b754646114e2f548ce546a9e19 Out = 02f1266302cdb39d845857325a4b2ab58689df39ff3cd08c1c070d5aa27ed04de5bff73ad90ff4285a29375361 Key = e6ee858a2cb66a0bcd215a9e0777a79b785cfc72747354798a6f190426ff4b6d In = 372d1727afb651c8ae29d64c402e5573a77ea70eb814f15fa9c0fa489d AD = Out = 1c756f7fcdaa8d065e21d372d746b79ae2ab97322d7bb05bf42950ce3f377654e4d76b6a795ba698f6f0cafc42 Key = 40938baaf70b242555cf21f73ed0160e52800545ce65cdfb3b054cb1868d554a In = 0000000000000000000000000000000000000000000000000000000000 AD = ee2edf39810115a3fc78f5d8c82453843ea5f9257c31d4141dc0e9f7ccf02b12b6dbc16178fe07396e8b1fa6fa134e2b6375c8b2acee2faa5de038c56729fe48fbe1b0851345f626fd6c38b19cb77e0c58e6f9ead4cc981c50f13d67d9e67281a1 Out = 8937a547469c0156fbee4292cb65f96c838159ff01b612ce36ba62acddae9338fdbcd860352ca0b9d8a6c743e7 Key = 5f27fecf6b9280be6dc841cb07a6dd19d006498b69e0e7f14ff40d7fa3ef8209 In = 0000000000000000000000000000000000000000000000000000000000 AD = Out = f772ce7826c1efc063f3d0243e7b322516dc58b4458ba8e8a50c7df381351f8fde19d7983410eae215ba236a9f Key = ecd5a478ad0632dde11902b5e59d9322f0cecee23c0aca9b82b4a88b9b0b3169 In = 359e686366c4acaf1bf2352fe34243018135f946201c7f2722677ea2f381 AD = 554e1940d032c428f19c311aaeca9113e098c6b4c1b8cc4d487eeff7129002cd82e6230b8873be19fd4a07b54a38f7b68d0421b95ca65112bb1d3c50944872f006 Out = 3364fefedbbad4f29cd296e3b02a7de6372c67eb1bb4e45d6f60890ea575072cf157e04937b94f8227d4cef0423a Key = 35c83b377ce0eb7108a1c4bec7ae8b4212127e0c5f093adf90123a058ba599bd In = 2f4696ddd30c720919cfd28a669b6e25a2e0bfe0cd8ef6dace62cc19dc3b AD = Out = d110dc379184b6194bb7a856fff76da0c001758a89c37e96ddccb3166d523a00b687a06eafb8bd7e192387a1c68b Key = 8a2b8b90e3a1213d2727cee663e6c1c8bda76718868ba6c72b9043b439557fe8 In = 000000000000000000000000000000000000000000000000000000000000 AD = 64620b35f42e1f3a9d5eb6766f85895a93a468a3370d34116909e55a158734530b27a39d89b40078df3ec5dbce25ca72408d965a0c8e54a0a8d1d3dcc88ce05e06e5738c5471d9c076d55747a9e4687558f1a2b35d707cc11c96cdc7892686f66d5ca293a70489972fcb1f9d429daf410089ab6f44c6db08276811e5ed0d Out = 3e0e9d890c68ad67e855b75046c95bbe82fcbd89211deb945526061f04bfe4886a65b48619e35d2f040198f177e8 Key = 38420325b0e7a28223455afa86da8838bf4feabf882879296ebb5ceefdb529e2 In = 000000000000000000000000000000000000000000000000000000000000 AD = Out = d8fb79a60076f667ff4300eb8e176c91e9f33a9e25a0f4d7dc2da8bfd44fe6c74dd87a43ab171b81af33bd365c88 Key = 86ba8a0080debf869b6ac3d9fb7cc77f4c1bf46df5e03ac63dccd80ac0025548 In = 1a7e15382b881598407226f0f542af82bafd974aa8ad0cfd34d680c6a22956 AD = 0f70754dd550c4fc6db17e0a60ae8ea943d103645b3090826894cb41e701a936304815a1ac6d43a36f3defb86c8657b0c0e5e143a29054047bee115504f29cbb8c85899894d39b3273045f95776242e50d0dce77707de7217b00f23150075a1121414a68bb5fbceaa10855d194a58a978c Out = 4d0d71daace5dad243dff1f5153b3784b704c45d730ca47b13bab64de63ec369d2257d75ceaf63586a22149c442841 Key = 7dc4d7766da60a4c0ff0b8de134d69b57173e1d2c7900556c4b079cc744dcf9f In = 0500bd905f99c2a3128b8fe79d83633a0712668e6095b61fbdb0fd091ed560 AD = Out = 30627b9c43ca7aa2f481138020d1d3cbb4feed98b3aef476b3960bec5fed9398e32872f377c55dd541194c699374cc Key = cfedca9d9e0abab2203c4fdfaa5485281a175d7e142985742b48bf8d187b371b In = 00000000000000000000000000000000000000000000000000000000000000 AD = 1bb536bd6cb9065730ac2ed9b1362bc23da318ae689a15f4713ddf81f240e96ab1edf5555d1b66ab083815c1c3435a2ad93e8a293c783f7f1b45a788d8247984faef9217e9b39aef9141ba8479c7edfbe02c83b22ac3ed4caa215991214b3023847539f60999d84870b76833f66e03e6e7eff7475718fc25b62d Out = ac512b2d4b167060d66f58157cc4f56a2af643f968392658f54dd56e8605ba294ee6e4f443297a309bb3d06d0cb040 Key = 32a29981cd5edc2c18a2a9bea02e3c867a39330e40e12ae239c3ed46bf4ec9ee In = 00000000000000000000000000000000000000000000000000000000000000 AD = Out = 8f67ad486836c24196b2e594fc5df01cdd8e6bffed934439b5b4443149348491f53e5f895fd01dfaa8e3447e6156e3 Key = 174ab86e3788aa8a5c165f9f1ab9da3358fe408e711d84ed010804ba231a9eac In = e1f1e5e2b17120b361ff5d3ad405872c08ed7fb0fb941279ff315747244caf2e AD = 3c332780d08449682822eecdcb2f72fadccc124441521874cbc034538f3b9bdcb915a14233050ef44befbbc8287f62e2a3670af418bf89fb0cc8ef1496917ecae72d47ce0a8e1691dd7c5b12c79b0ca55abc251f0c85978e8957148e833a67b456fbb0116d209db1faa0e063f8d6beb7485b85c00a5da24bc83f Out = a4c127e5e01ab509190bc65ca50ec19c831205dfd8a6508d63374c0afd8b7cbf81e64885f5a47d118f763aec58434465 Key = 084d81c092ff274295cdf3ee342e49423db91ef5c1ea775896bcaa21bd196a67 In = c1c698d6f52dcd31424650d75dbdea3bc3b4f5da0d6d202cc2b7f2f0cf496883 AD = Out = c5b1db16d5ca683b0bef0960f0bdeb986677940d0d74d52ad0a69336ae99e0bc0a0a287066d0d65e5b532a8f7032bbed Key = d4e0aeaa5b28d34034961b6d5fbb752f6b2beecda15245c1f144d0ab34b2728e In = 0000000000000000000000000000000000000000000000000000000000000000 AD = 487fb1ed5758f56eaf8454926decc7af752ea7942b78284944335024fbff5c9305c8e86dceac093bb37a4fd7bd976c2baba0a8971d51bcbbbd98468c65946babceef397d129a08576a381cb22d39b3f5a371e6086e97f7da90c6d21d45fbf97e493193ba4399150eea0d27cbf02ae899f5f2a78dd617d9684a0461e05e Out = da52333334d4c3b639f663506eaf98a7085385359f5376826ab2e7695c19ef034150ccef0ff77fe4f08684f81833fc95 Key = df5de3c85d4e4da5b2def73ae0e02a9fd5b1396501a1e8eb3c490805445f0840 In = 0000000000000000000000000000000000000000000000000000000000000000 AD = Out = 1a604a88162912179b50eb845fb1fcc11b2b585973b8bcafc7f0b8b68afe37c313e4e1e9335b475d30896684ce827d6b Key = 889642e685982c689adbf0765b418cb94043995c0abea9427f23f75bc2e8b018 In = 0ad2606258f81ba90ec0c3ed63a41b258f4c92c07ec007b2f140e42a85214ac849847dab815a7be983 AD = 9c1ba744ae4e04b7fcdbf7125d026b57264694ef891d602c454ce559fb81eac295a9f6b58244be9de5788e73f1b2fef60c088698e351fba2745a8210a8adf8bcacbb404f42bef27791e725ec8cb00345431965168b3a2bc6b6 Out = 7b07945433ea7a03a7898321c55e39466c62854c4ebe14b1a0c23e6314c95b3f327dfcff58197d68ff4f122119695dee5a1ae163f5ae1b1f64 Key = a68d2908f1d8f21da5f216f2d3c940e4f49b4f3f3b3f60a6464a06b4100b3309 In = 082410ef8ac43c3e1b03e9e4403bafab909578d689a74b9d0bb667b0303c31f985782442accd2ee13e AD = Out = 8bcf121f875c8518bfb740593f400534d8ac3832541148c3fa14bae55597fc136f16acb6998e1dfae7bc2e6e0443187321bd37ab9dc694bfc9 Key = ea7a344c67ea52ce97fe72331f9efa472c371b1fa5f9e188a5ad30d93538931c In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 31d27b8d77964320fdc22f20f6816e67b23e48fa2ccd3ad7bab6dca44e96684128e450d95547a1862d6f991dcad5d7fa785ec98701407dc551bd64b348c65f162cf798bb8ad2eb54f86fb7e282970d69fae61667e686 Out = 3522318a55fa0e723b6481f31a6d82b58dc7b048de2fc9d472c81b7d06d0fd2b954a9563c232bf794099c80f3845830bab62d2ceb7e7f88cf1 Key = 046bc3100a4c5d6a3cc4bb1a11d5b6c9aced967f2c8f5be0507b22c3a9c3fda3 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 363eea87c5abffe0edfcb6fc640acc5c55d52352b56d61913d117be94a37fd9b332d45070dd78e365ec437c531eb3b7210d8f70984b45d6c3a Key = 405256c0ce8b8e48bd6d06e5965fd412fd2b94dbdf7a8f143018c50cf0ca73d2 In = 200ce690e867e396917fa51561356ff1a1fa010e020d3d728ddf294994c204631290d334f7e4327c6bdc757125f290ae6cde52717cf24a99c157 AD = c914df3be84b473ec04bdb11abc9e72ab1c6128a3a945fa22d9871c36ec5dbafeaf3497afbca623b2ce146e37d33b513d529e35dca544053dbfde13e47030da94168edcf098f45f7436d623ecbaa Out = 54579439f0b97e2f5bb4a9d4e7cc136a3fd1ff599859354f4a1da6cf9cd119bed268ada554c9ed98c08f0ee35343e2c4aa288c5fb83d15c6933ef270acaa03173f9322071098f238ed03 Key = d1c9acdfee471802cdffb954f5d319274aebb1302d46f4c0d337a53a9f13ae7f In = ac42ae0a5e604c9970b3085c7b40396720ba8f8f8a6c30bf0443302c0ad8020a795b9163159672c958f99210344fcdcdadca27797d7ae9a05c20 AD = Out = 6ba8d1ca7f6728429033701a3d334e51a089a62992dc79eb1531e8795a56d3af7deb864a7a23030ff82cdb328c599ce7efc077fdcfaf8d0d2d6d4fb640d2c4aff3441a06ac6972b9f229 Key = 8293df5f80053d71236c9c175564fd8d9323a2269697d00636fb01f0d6ec3c70 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 12fb3edabf9369575535e0f045d06ab834876dea5f3c38057b Out = 977eeb750e904dc9f7a9f71d45afbbbf8db8b5e3a97571d330ddc183038e88570f4602bf8c1b484985f7ce67244d5b0b701886463f7a7d623d645eb99c3411db6bccf9d9e823286d40d5 Key = 180f20e72e61f970a51e2d39c7a12c4de0544d64961540b0893ab0e58108581f In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 2d127f83066613713df6d42e3ecc091385a41c8c73b280ed687ed7c41f586ae6388aed2461c8fa73496bd3aaa79a6abb49b67beed7a231624d4fe65f99a02f2437ab0adbe36037097ac7 Key = 3cd197347e7bfc9b9593a4dcef96b0e2961ee45f4d8dfe3e88bfdbb7f7b31184 In = 025d2afc6cbd4f12f6fe93872330e6a108bab538932bcf0620288a04c93805fb24c77dd3fa3f356285be19528f164bd978d70f1912dbbedff9f5025825a8960321dcd8 AD = 8e69b7cf1dd9a0483eda3e09748d0214c60415da856a541c4292ae9cdf28e28e1055bce444595416ec4ac1590ebf48da922651f4048ce872742b211c6ce1b44c98ea85957987c100f4cd8d53232510612040a412aaf8 Out = 4df0749e5b5f585c4e66931567d1cbe6d65ded512a8cfa46e51aa29f6b38157970c56da8583ec41b73313e082feea4549501dae9010bdddfc590ecbc1b7f48d22fda13a6bd03e0e63ac92e65b4b6a7dbc1402a Key = 43d50650889f04f0153001453f2357ad4f4e26dd20b6e1ce6164868f8552992d In = 45e8e85db0b3def4a3c25d4e196635db0256c40552b7d411582834e03fcba7dbafa9dc389ea7dc1db297ac90e198cfc7158bb21f9f0849cc3f4687f8df752509bd2669 AD = Out = 273dac227d733585a792074a2c2bb7fcc672f1200d0693b93d27c087d6209b07a42981fa61534bb222e4393a55785590a1d0e625dea1e8aadb45068be9eea263dc2dbd25a877dc5e749ba393a919ad5324c899 Key = db801143c9b6842a0ff67317b02a0adf829b7e83a7d6942ab4c8213ca19c98ed In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 1e7287392dbad162a8f63def1f5d21562e6d591882ca44ae96206c7e30d6496c4d83954e63beb2b34de78e6cd72dabe4224588017a4a719b68893ef988210778d726c19256d0b0b8346f866f064a7f170748bdab Out = 9e6610f4604b40abcbe3119fbeedcd22a256c0feedc179cd573a96b8d5402cd432f6ffa20d22e14256f3e5823ba2f74c788bf20c4e33a74f2cd1dcc99e4a03906570fea574464f0682114d0c7bd507697ae9cc Key = 81515ed397503948464f6bb72d5223d5e3131efc1169f602433012b6bf2fbafb In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 104d859207075c8e7b3690c5b583f58c9db3e9ac0153fc9a4c062cd5189bea26cc9c91a9825adef4330171a83920b4e38ee3105fda1037a7a305a59c1f6b5011774a1f705d0a6dfb3049d24b5319a0103c66de Key = c7e4ee9ad1b66fbeb2019fa4f5cab7dd41e6bf1d03204c641a601c1649054c95 In = 0d3576d4881733dadea4716a7e751746df91c85ff0fde43dfbb0fae8a8c0af02fc82c558830f2ba0b8718bf1f2309f8a5e65505c92100c26688315f0a2dbe96c814abf8c37ce5024d317648d761899b65e77e3b7ebce63dd23e195e2cb13ae281eff90a76092540da72fa2418c6d6b55e4170bfa4ec644a1a020a68332099e AD = 36a0ec9a9b4e952dce62d191 Out = 225a64712e4de5488190b3c87fc26f6b6d50ce2cf6de86016733f47f0260c6efe12e743f73b68af3be5f42379622d97f346504b273c16c9f12ffb6a76b60870ce8dbfe1f04bafbffd444e3162d8436efcf5473912d8d181a1ab7039cc9cd2944a2749807930a686ed02385ef095b82d9517b61c171da85d152f03a66edcacc80a16f4ea21e7931418ebbc67b9eb05a Key = 156c09e93e69c63d6be43b7d1d6924e6a9343f06861f6e007594cf172ad0c8ba In = ecf12d0e20d1597e58904cba452d9a5f5d6b53d2921432920894a728ae607dc2e0e8ee9254bf8ebfabb5f2ffc44fb1f2e2688bb0c9a70bc9292c45976bcb598df548fc4fccba27b10e25095348fff8ea8c6e135f27f3f2a642211deb6d2c93f68c33de5ec95ca6fcca8a81a79984ca5608652eb2472afcfbeab8de2463ceab AD = Out = c9abaec08eb2b1e0076285c32f50148a5910750e4d99e7c40b82ce41af5a7d8ab6788699eb6e26293d99caff04a36818ebc983a495064e4425ca301dbd9027253bdb6d59933309412ecac92f3ea81fa220046035bf1970c085c8e592814545aeda8c620b2e62109dd4828c83e7c85b6f5bad4c32cbb7d07b7d3c4869200854bbd9e012aaabc2f25ae52baec905f79c Key = fa3a8036617c6a5329f9fa884b5ffd3bf989f9f42a93cc9515af1dee50436d9f In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 21c0393a0f51ea82eaa6ff1f43f814920d27616643424d723e3dd61da1e09bfd73449bcdecaf2080e59b6b60c84cfd23cb6ed5c3e98f25a6789c62f3cab0664eda10715dde3af6a4 Out = c3661e79268650b4a367dc21911764b8bf174a55b47c51a965bb367388e61c2da7b47999e4c1f86aef067799cc4840e84d7817a31284692c6373a3e9a1d1674f934259ee639885c38ddedfc3193316d286099557c881d049f3175264c37e6f29ae4ac2ebea9fcbe719750d67bdda7582fa8e41d71f224c2470e8ef9a5efad7d28874f7d4f0ee9daf62633f5c3a3e7b Key = fbd8043b98ed1807eafc689f7357cd4b060eccdb2a22d631d058c8f9dadc7357 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 3e9537b0ad349d0a321a5cdd4fb0dae7e1a075dc1567930e0125370d94b971cd2e0943e630d4dc070ca22aa537c920aa160cba3a1b549e056b2a3b9a280a999baac26d3a4e7a08288cfd3c1c3d9c9bdd766fced4f8b25e3c88761bc3b8f56bdc7eee79c6ac68a1e2a1fd1191e289d78830e8c06357a179e35342605996d6aa527a658d8d5119958157b02396601d74 Key = 434c85555be8ceda389ed5556e81d24323efaa23d17ab75fa16eb353697d994f In = 89d29e7c6d108d76ca429289110c97e9d943af2ce9ddce0632f71bcfc1a3d208fc6c5c0fbb616a013d08ef90b46aa943169c7b39b01d7e0fc6e435c009e0543c562c619c5c0032c2831bf0b5c1b262c6def58d6311d5b44acef5a9d0a1d08dcc7dc4c7622883f22eb45884e59a325763822364f849d445a931a2b8fb85df151c AD = 4d7fe42839f2024f30573f25acfd2d0937ea73d23bf7df7612ba5761811a796fc3 Out = 81cc795631d620b994451309020237424e4c287a366d1004610a86b9e59c124af6c40b14c06004bdb244e9261d060006505da4c386ecea4559013c0daaf5d95b96713ae61e7d2fc2e7ae8708c55e655423301dcd4619380949732845ce7f9dc0c4201fcdd7492995746974c52f31bd910c41f5b5de247dd579c6f3374d7257dcb8791a7f1d55f65ae6017edef830b7c5 Key = 833c0aa14ea306e3ddeedf53458e1930e3de15888ad97d86340468024b50a17f In = 8a402c1c60eb513405f2db261dcd14ddedceb4b293baf421736744684e6719b7debfd79bb5ccb4788309e23ed7d04caf3b33e414dce42f8f78638d98ab0c079e3084641465639868e9e72b0695c2386f6dfe912c312e150a637fc76605e7591e7b6a05bbf2e97abc4cab8673c7582402ba6808264398ee42a38526c3a450ef40 AD = Out = 41d9e89f0412395ea8106214c7bc289d72a4b0c4eb4a4c6970457e2b1c323d3755705b9403e4999270f88e78bb93f59ed72967d90d900e9e215b4ac6b3a9189edd3f27e8db65de0efc63f5382ced2ed117b527138f9fcaed60228174185a0d7591680d6eeeba419fc01f9536372b809c681ffe47a617acdfdef6fa0b09512acb04afd4471ccb6db74e3bd7810c007898 Key = 3af760f5faead996b0aee156ee31190d7ac7c44bceaf28cb5f76f7a9f25f7da3 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 8990484d014445bb0e2dd46fe1a22f49f1c7277ce21979eae3f214e43d613e533761d620245449f6ff9a533405f741965079297a825b83a2647962cde09e7129ea8526e9c1604a40944707dac495f3e4bb5ca1fee3ed08e4 Out = 047a33c362413c408f304577147d8b4ec730d345401b0eee98ed801b7f21ab1ac47c78a9b5234b6c5d73ebf430b52b5307d61dfc83fa191c3a98d847bdf4d3c194aa499897dba94f3d98eb8c7ac6b0895affa2b58363728e637c27247322bcf2d94aa8668c80f2562e7602fc12bc7e5408ef13a362422ab2c75ecd38d17c6b8d70d4157d348c411ac4eda744c7dd81c7 Key = df2ebfe892af268cf8297731d0f3a871b47d99bbd223e56f7d43ab77e53bfc70 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = bca4a13771dc08e860362826a1fe04bae8738788a036d5299cb1c7e0cdb506cf946aea82028cdd69bdb52d8bff22034d8c1da1f2089c1434f3dd13ae69cb14afbf5cecc6cca877b4fedc232cfa16f9aeae770369659ac42063e11953d7f1720198079e9c073f3510211f7f52968bd3b8cbdd9b04d50a4c09fa7e6390217343383b27e08d1b2f761514c7f48372c56ddb Key = 1ad4bc6fdc6cd17bae301ae6248f082546cadfb2fb0572c235b32e3758b15d63 In = 0138bec5913107428dfc583820dd554e7905852f863fbfd89cac5fbc1a7c3044f3757e5b395706a04242306db184897fc7736cb5237991bad1a511f3d0e7b30f7bd898ff73f6d6bbfe1b2ee81b27e64077dceef28b7f82f5baaf1b9e6f6074bbfd0c4912714b5daf837a00654d2fdca52f5e9a005351e585ecff3714ee511820c6 AD = cd6e3a4ae9be0616 Out = b7a5e19e50092c6272bb31dad0edebe56e3018888519da1e6e4075f9b24ea0af3351dc8208e4006fd6a2f984737b863309581f4f625cf678e59bbab62fee8fdcceb368d57b1e1adea28e740b14c5bfc01efa6271b2b40d86d4d5eaba0d82a2b991ff9b6d10cc997ce4a7cfa65def527cf00af14859454c2985e157666f9adebeac4d9649042b2e525c2ed10322d5c2a6b1 Key = c6ce04d95a0912184c921a04299b49da6db105611e323751de08456a35cab10f In = bfb465b4a7a5e6e5eadff12bc70b872236f859a4cd24a9c71c0d60ae33e263d4d74554fabcfeffc8cf8e2e6d6371a74bba35f49e6d451098e7c1ff1ac5f26c3abcf3a2c71d36f60f7ddad5c171c22630c7851015001e2f57fba8a9d6133a45b8f3657d67a61d07f83f9eb9276191847f2198053c67859d2d85acaf7408a18de6f3 AD = Out = 133777378e8f32f2f92f0d5d1feec6971aad1a6394984c8462e884b9f46087451c3c9caf6bf0c45945215499d734cbe5de83ca5ef31b5e56df3c693878efaf0c0b71fd3a5cd1ac871c2a89972772da941ccb989b6bfa8e0b19c1e909e6ea1afb146e5b87150573d10457270aeff5c791edb21458d615d58d9c628d5dbacb0c2dbb1ee44064be2f95017f54021f3f908399 Key = 9c604940b90a7ced55156e3e4e56e89ce6875ab5d2fd2fddd3e1fcc67ea9b7ec In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 116c4094a028e15001fb6bb58aa6d597044b345e16cd67dc7d1717d7ee1ef76a8039b0ec96e7e63357dbc9 Out = 365f4ca0e9250a2d034aa09406a4d8a0e17fd7411a7a69e67be11403f0e5be3e249046dc24c4b3c4b7ca7f293d40cc7741678dee8fe558826c5b99512a65fb51fa73ce77588c65bfe94146ceb5988fb1c30bf867160050d33933ed12954762c9e9067c154e20837b2a3675f66759b8ba076a58e0ec13449256e1a49037d6f07bbc06288413f47898ab68cbb70ce1cc44ab Key = 4f010f246e8c8cdb94d47cb18c9a2979b98b7c633baa1879a07b9c74659d14d0 In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 42024a641c8ddf270ffc946c5b3777dfe11a4499979e95b48d3c685e12fba4f25d1a2923258d660c880ff872bd400b0aec66a0c8ac05db3cfb1bd4321e9e04dffaa4d0c24de7094d320a7b3327dc0732d71e45459930abbbb9f9c5d0272ab6e767afd6c0e046470a14a13801f0cf549d485a1a763403b8cdde6876eb200d2b2d73ff9d361d8966ae750af35d98ad68dd91 Key = 7725251c9398f4ba564b0b7968abbb58594acae53153cd8b7ec5f93118da5c80 In = 4998cdfe80f5bf1db4a74c91dbff699841101528a614b34c2227a10298b4dc24db83e513bdd73729a14fa8075cac637e1a726c066e4335b51bf6241f438a92e89d8e055deb441f0c1e81cd2a2a819cbac050a3ea53f7d0630ba0b3895928d4bf951a8f3227a69b650b8fcf5f054f8f7e50aff9ddc1ebe857b4000bf47aa00ec117074587bd9fea467d46e5524bf5bc1459dac65a979784f2fec1e441ba30f1129d1b26c5c14618ee83bc5eb67d0eeda6c9c097e56b344c89da8ceac1a0f5a120ce4d340abb078153486828ac8587be432a0fef02a49987e117cb16d90e7501db913795788a15744ea80dcf019a91bf8835014fa46fa53d39760504e99cc98ab616c55023de144deedee060a6e4909cbb367dd1098746b48cfecb3cb54458b16bf9cb6a6fc05c01545b7036d00fd5ece327ac45e55d4a4a3564cda939cbf757880b197aca2843fe5f5c25c36067cb415ca000be01bd8c707b31327854fb12c4d55eaa07793849f4d3e77460f79bc2bbfdda1e95fdce47f7cf05ef634cf965b18ce10f704f40aa8133f684bd0513382f855bd666af3484a0fc128332f33843b33760339eb7680f3e51639e13ab97feab967c2da75025449764bffc2fa6182410a95bfe9a49a692b469738a2a90f79a393e5ef6e6eca05a55ed709c5b9715e3a42dc692b9841f344e098699ada8127e5cec9a168a37 AD = 273d6e9e8ba30cc0326b26fa446c03f368d7ef41d1efa8c949693e63da76 Out = e5de1700c062194724e454c98361d70b05efea469c0eecbb2c6c3b7c94f5c28e39da5c0688c7f0199b39d1e68b60eb8a96216cc0547972164880098b07e6daf532376bab67db3f92dd1cfdef76320e607d4149a7cdfc5b5c6915baba0e91a6a2c838c047ec85c6568f2df3f460cbcd4dddf0e84d5d14163f593bd46f237cb86e8fb9a6662ae889312f25dd00097eab16eac1f601a2b3a34a190d3c43b8f2b29f86797e462983f146b9f1a7eecfe333c55f597ea5653fc4364dfa6841368b36d8f5ca55990f82f5a7dfe37b79fef5e012798ec78427c615aef1e4bd59bd88a34a5776d3c919a9aac697ac27c789728046558dcc15f88b90e684a54c428f008038f0dba5f5e688593445dd5a4d97b7b532f62659ad441a448a6806fd9abdd8954d1f345f9698826fff7a8a9cbc4783014d91c787d8d0c8cc3fa54726afc3aa6a4b6f23fdeefaac4cf2ab32ee29d7477db0eff5cdce6069a2c80fbbba130004c579109a40dce31aa1387404b1e1286be5f76d2d5fa9d9812f7e70b7a6bf7e8f7582b2977a14cd8f75e0eedee630e8ffc7e1afbef1b9098a7c69adca41ad59c86fe3e8a71174bd4f6cd5f8fdc0ed168d3b6ee803e4c092da572c97635036479448c7f8e6fb5cdd0f44ac1c3dcc64f568a27e345d5eb985bd981527616f2a53f828388ba1085eb28f44d4fe81482c74a3511d3e962152b80d06e8256d8b0bf5e52f1f8a65b375 Key = 9ef28c781455554f1a5ab62206ad79d8e35880fa06c6c0c646467cde3769c7e3 In = 3405fb827096c3ec2e8489bf3365146c6446e38e41a7b0798ee2b790713c399bfeeddb97d02769fc972cb05e5b8bb5e5dced9fc1861aec3b516b877c894b293ebd2a7558254ad2e467b27457894bb54758b44351b20e2707b5cbe6498306e8f2255e01954567affe562dbee94c07ac9b31c7989dcf622bc3b01ea0c3289f2135967ad65a7f5fd3dc45003b528ef4e1e2198696390698d06bacbfba698877b501ac843fe7a02ec1889a560940a5ad777acec65e551c487dedb2abe10a29c7120c95a8258b23856322cf4ab31a99ff9d9782de9fa64131e847b3303f5bfd1ebb08b06f8604d4499e81f31a723b9364c7d3dfa418c65bf89dfcab87ff56a5b48a68858c88fa7382e9cb856a5b898586dcf329b042751b6914789f3b139c4a3368d4afd1c46000bba9e2d0e22ee740b1254b0ab50e44afb98f00473c4b0f5390b28d61fd73e36e2b8d8052e986ed56f243654b0a9a10420e20d6c0a0efc8dd0d1f53f8176380efbedb81f17038261532356220d0ab4e69090733c456c6dd5f2cfb5ac84969db669c47d983ab4200cbd0f00496ea05213c03ecfa28fbd76d068d4e69b3234ff467c89ecd70ee1daff0a9928a0a91da0c1392492780d69865ccea439c006b460320465f9c6f91b3ce6b5fed749626a157f501d28c5b7b668c1e51b7f1ef52339310e51e3253b7c495bf41d2303385d9be AD = Out = 31b0a9c77bef65be47d34eb2ab365504e5b27ac2962aa960c327018b4dbfac25855c0c53c76070bf0e7e0f12827b40840cb782182a3ffee098e130ab73286b5788e47fb638d249ba60ee16be847f81590577ce95250e284b7850f3b146e88c510a83fb7da7f2648fa6f5d2de9b36abb9725b5ef2cb0178218f5ccf26ca21df8406920705588d8809d6cf0fc5eebab90cebef9f658f2366ed4c0d7a15821f93830e92a1ca07c09e021b27664ab885b338f39a1eb5f6892381b87b59b6a8504df30fad8bfb0bfc64a8ac199a32a6a54fb4392663be05d0adc44e8e981f1e27853af334ef2d741c5d924e4b14812f7e21c27334cfaa10ddbf020729c3a87939cd0d996ab29ec40d01376e0be436d3d33618a5b40efe28147e618c20cf432eb29d2c559dca0e9c9f559a69752dd38a78e9b20ca40e63faa306d19a64841b99c0a35c4524eb90e385df6e99f2d15d1257bf64cbf176ce55eec833a49541693abfcc083a6312b9767d3098f1680e2165fa244ad48347c4f35c2871fa2ccfccc3538a9d2c29912f4a4f9557445dce0d50e6e8a565f73ecd0fe831f6b513374fe7ae07c8cd9af5bd36575ef8faf69fd1fa17c73fa995ca92353cfe458051982a2a54f550326b8d625b05a5f44a0ba5408ea812c2352174afae4d5a4a3c83cb79e53eedcae34bab5e6eee7dca609d19922be759d3032c3dad813eeab027a5474e38cd5f5def38a7a8 Key = af5e5f0dcbacc81c9012d87a5e76911d7199196af14932e9f4c196760f667a38 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 7e4dcafad811e55e8cd60631140bd0827de6fe570ee4937e9d6a57cfa33db56c661341dd62e886077fd6baf4abc2629370c44ef28d7bb25dd992f0929bf0fd7e89d9627575bf73a01e3beac5279b6940d38a122a4e5c6ca86db17fa80f7aebc1d6d365 Out = bf74515fcaa2495b2d28f7bf167e3e6c0874e1a17c5abda17aa92a81ca4c76666e47c6236e84d2d4c385b4c44316f9a78fb6d04e1bb261b4907bf2ad188e3e240309957a928d712a631f217633f95b05eb01e1ceb97aa94d858338eadd45aa229f4157ec04f14bd55067f4c7fd96cf1b0c21f195340ecfec886b3e90d09b723daa85f87d64ffee6944be9050859080d39cc662e9686aceda2852c6a07b5056c27e6c29aa7be3ded681b01cf5bf65672f10128981dd219d41fcc2a6d13eb2539d7e8eb12837e6e81d056d7c31923fce59ecc7c4314f5bf9b36fee800782d39dd25efb166eb558249838881769b481e3a223bb0cae47764f43d426311e36debcfba0fec5f158e2d30dc44bb571b19bb1cb483ff7bfc235985350f5343427270b0236d3e626db84b4ea1f823e85f3efdae0d00e4d472a5d398adaf1ba315b8fda8d51e780a1413d8667792c302f42ff4cf735d76878616765f88f4613ce1664efcdd95039a6207b27ca8672b8f0031dd29a5036134889cf2a23a985f95ad1367f98362112794352c87badf7b355ef54c793c487379d6d859045190c5e1493a8f4298e4e38952d1c4bddc51e15f95c4ca884a0882f67bd1ef89e61e22bb8dc25e6bd792d8644c5f82c0eab59cda10085ccbdcac60e217ef464498fab2c4384a7cef4208ab1fb3461d9f7fb486a4b722d0d391e07a29d6333749949995460d17e8cc056fb4284 Key = f2f28e0c9fe3df1bebcf3279fa5fdf191451adb6ec8443910399dc86293b1abe In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 52cf38f618a54180802fc03935196b97aa3aa09c90acc6155fe8c68aec9a7b2bb8b5eb5d334f2efc82840a29178008b80dc07a9fff386cf87cbef5ffec0aa3d0bcbb20a6b5d2bca861f28d6a9afff941fad51c59d12400f2d46e7c359b482a58b452a93fdfc7176357373230c7256575ba25e249c9c4b49b1d9f4b81156094cfddca3c1ecdf0c84715d5d128bec78e5bb3295ec6a37bce2973939c39a83aa7908bfcfafe2a755647ab2b4103afb0fe03f619aa9098aa146817d59197b1e545835b0bd8c7ee7035ed5e7284325bc794dfa51e87cf0c7a60f88c8112ed8131fb29f9779f1e38afc3d8788febf1010212c2feffa64dba4e0e91975cfef56b903e945e604c4aff07be49dd0fdfe0f8ef6203df7b43b673d6a4d0917ed41386555858445208d1697f6b123215dd309a33e4c18c1a41302ef4c0a7f2baf18f6a8c43b7aa65bba7a65f4df3c57db31fed822e60fd3e1023e74471887c631246599a33290420413c826f7e640497eae3d2fe82fcd4d1f755af712cb6b6c4f1bfec7899c17870d01de083d1175427fcc41d8734a7bece4ae5d8ef4e3817d7943579b8d41f0361e9f04e94fe45d81cf500e7fdb6069b766fe07fbc9e108c84b6cc725173f732ec2cc873bcbd2883b498852b751dd760ee117fed8ef3dfd3ac90269e2e06d52a7a745facbf2794dae71326dcf93f970daccb636e18a73cf32e3eb89181c45d7c88bfb0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AD = 2e5a70a6a8ecb71d0800ef2cf71dcaf578392fd231112a9157d69dcca3308799b76fd6774bb66e7c3c72356cf04dca502c138a80c27033e8cbf69bf7ec10c1fc13668d1a3da85f6afaa460d3d0c97a510deeb10f11d8ad28 Out = 17b27289e28df81853929c3bc392b409 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AD = Out = ee1b98fdad31f877c8542eb56cf30fe5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AD = daa9ced777c3b7da11244067ab556c1df0a3e8738ded04becec78a37336f6128210f57261080649b1c688a3350d7f8c29ab87650b960da5d7d781199de Out = d7b205e17d5de42a49528d40b61dbf7b Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AD = Out = ee1b98fdad31f877c8542eb56cf30fe5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 90 AD = 461d68956cd1d2b2f02e3288e81fef24cecd7ecbef8c432215ee64e55480bd41feb5e3fd850a487f4a3ece09ab4b282f29902870ce8bd30a56f2fe9e35ee22b06196ba484e88c612ee9c32a91712056b607e2b022891265b9dc9af3279b4ad Out = 750dc9eced5b04bb933c30f106c20c839a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = bb AD = Out = c1aac99e9fbbdff8fbd2d8374a287fcdf1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00 AD = 7c53aca36855625c8aeb92ab91414d0c6700d7de46f21dc342f8a40e34066153eb501286f79eb00120a53117ed3cc3863aea5f765c302fe8f28db1c877 Out = 25e938f4f1f43c08f1c17d8ac36a454584 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00 AD = Out = f519ba1df2eb36d3b01f7634d185e39e2a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7cc3 AD = 95899da598cbc1bebeb906c222b6dd91063f4f357cec435a6d0bb1d5376bebd291501cc34f29599b5f99aeb7e51c576bd8 Out = b3fb35990c09c50ae9aa9b1574209d977ed9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 99d1 AD = Out = 88250983b6292d4f63566f2f5c350b1def18 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000 AD = be71e0e019b5ba2fc6f7766eda7d27ff91b4d351f7 Out = 10b1c0fb8d0cad950b9d534b344ce0d8a30c Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000 AD = Out = b24924356abeb32c9df1e42b9f727f216985 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 20db8a AD = 526fdc742005fbb916aedbe417cce3b0e4e977e8c868a3a91243a95f089a3aefda22cf005db42031dac732650ca08a Out = d34bfabb3afc6513234630aff7b90facaa8498 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 81357e AD = Out = 49edfdb6c3106a612d46b865b2a9c673874b33 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000 AD = ed9c4044f49ee0b68fd795f87adf1666ccc06d5a2d8030b002b3139a2b75725af48f0b9717205ec6c641f4a6f86b33c2b253723d1d4bfe3900480d3e113f764683e909fd442e16d437811cb9b6419e34c5ddbe48c4df9d1b835ea14bfb446be7c8a5258867a07c7736778b31eb54d98a0b4f8d13a208cd044bcf44 Out = 770268cf8fcfcfb1ff0a82702b064ea3e01c6e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000 AD = Out = b8336acadf0d89f857934ef081b161c5c5855e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = e6ac4758 AD = 0d87c21d4ecd25915155ba33a7374621e9339f76524913aa1a8409209f8f52a95255c67f70a7205ce34e7a06f65091e11f5ba29ed280934c25d916f35df4b8c7be568392f33fbea08d24b86e4cd17d6f93d51d6dc3cfb35e9150e7ec31ac1c3b23e4215194ee80586b089746cc8fe4943e97a3ec47 Out = 41ba14bbdc59001f84d93bf20bd60fac0f5cfcad Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 82eb82c9 AD = Out = 43a437b859e3a1c49bdf2e70513ba99fe0f096ce Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000 AD = 30c43d1301c2d94813479ea81cfc780481cfbcaf7cf4dae7bddf45523a8bab7bb3b160112116c96ad37f03624fde2b71cb6a1bd23611d3b501f6907b20d9bc1dfafd5ea8ebb56b033b2ad1bb0880d9ad508b40602086ce2da7aef3cbb98a930de7cd01fc9a430cf0a25d71783fbafe9741529ba011f336852eea Out = f64dd8a54131e150860afd5b60db6161fc3359b2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000 AD = Out = 565a322bda1b1aa89fff5fdca8a17600c7a83c1a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 8f249b3072 AD = c7512fef2cd7ab23a4d3 Out = ebe8bf22cfe058f558c32a1a234d75981ef2512bbf Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 89c2138a77 AD = Out = e3b2d3f854acad96696b25b4646ad3919d42b513db Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000 AD = 387d8ee4645fe01276a9e1ee11d3dd76694615cf7dc9cccc8c26 Out = 8be5f96be52b3011aefe8ab723999775a46251da24 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000 AD = Out = 33e307650e16183c8bcca11069486e47f1d1be1ba9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = f75275730adc AD = 6fe44b8e2fae0e566b Out = c1cb5b0984bd518862e84692795ad5161b67d12d7b8b Key = 0000000000000000000000000000000000000000000000000000000000000000 In = d8f57d6deaf1 AD = Out = 0fdb0a9526241e71b0746dc80f3ccdb5d0037eb25d05 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000 AD = 7ab362a2b4cfe34c0e193aee6c51238f006c2544442e36807620d8689898126f62be221cc4898af1ff7b8778a0d9224f376a4d3decb44861fcca2ddc363cd2c4da2465c5cca64c35ef6c2f5686a6e2e87b947b8ee23b5e4e3f Out = 3771b12ab8d6ee65d64b4a7ceaeea8b93fd3dc3ec0f7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000 AD = Out = 23ae68a0c153bf48b2b9a81f41ba838c8d197f9a4979 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 07731b850ef9f5 AD = b33d55bc346354cbc6ebf5fa9e3532b84ff1b117e554da9c67de2c8d13fbabeb3ef13b80d14fae6828bb33c074cdc4f2beeb611f426f8f9232bcaca3c55ef69a6052caa38fce567a7090346997609522194da2c2293458192b60d18254b3f3c018 Out = 3277ce8a7d68681c99f79bd0e7977413f2d03f4c2f794d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0bc2d9550abf2a AD = Out = f1a2db230218a253b12f8b43081fdacd685ed7da1b3a8e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000 AD = ecc37490f1eb4b Out = a0c5b2334fc2d70b9c76fd2324b009923ba6e572ec6547 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000 AD = Out = 364ed6e0c46d4066c2167bfb22ba0e9778d0ed8fbae1e6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = ec6fecf19e60c464 AD = 3071bc0d7fdb958b24f7c5048861c4291f035ccd28e0919260dcb302a4e1bd25591723deee824bc0edd005ebce911ae27180f6d47f2fdc230dddbf2e69a2c287e26f4af24b07b3cd0a9bf866e63965a055d16ed4a53f Out = 5ab90833a2359ae556d0ab29e227d92c51e403196ad8178a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = a853e553a55cb004 AD = Out = 156e6d4a703801c05f1e38cb86ebb42994588039e75ae48a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000 AD = 6c3e175e2e31c969abcc85d90240c6d1be85992dc2a09b7310a8ed2072390bdbab66d02905c37d198546e076f9059b0d4611f61d2966 Out = a1c68175460698d5d08b32187889be7971b7a4933d10f4aa Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000 AD = Out = 9f1c3b43b1e626ed72d07f87c965f7c404f1c257cf01cf6b Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 3c104d840fef141099 AD = e14e92becba6ef2d428763072c5ace Out = bb04e3e4889495f11080a86dfdebb717da5539d93caee011fc Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 6395689ab9ce0f6f35 AD = Out = fe8285c1f834d0b98e6d642ace061c1c781c61f0372a2840fb Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000 AD = 5941cada3c0c2da651a2e7dacff68203b8cd4bc0f1871f26d6fa4a2858ec7141760a2614b1715a0491a4e68ef963d46b0cad7936069cc15f0c54 Out = 7c269c81aadf19870e7112e829e20c1b9db60ffc7a6d15afd5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000 AD = Out = 043afce9abe9eb34c111fb8ab888e8d4df9ef9864ab8b08893 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = ab8f64693a65424a46a2 AD = 682b468f4789ba38fe369063dc1462f727fdcb5822fcd9851436516712ec3cf6cea1ae9c Out = 6a4d755071cca9f91ffc5e0a517148e67d766d6ad4cb55159f45 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 467470a349668c2d4413 AD = Out = d6a365a1fba6ec34bb8c83be5adc2d6ce9b69a3f10775dc3228e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000 AD = 2a54351aaea6347c5244342b406ae991f12f62aaec8470e1308cbe85e95e00ba083da2aeaa5d5276f483ed61bdddb0ba8c93890c2f525723d4b6b2b13c2e3b3f06134cf403ba10ff3b08d948ed3fae053fe4741f0ed1df3247744fe29d437450a4546e1f51477dade930f794 Out = 97e826bb5e6b9e0247690ee539373b45a9df0a53548fd3af58e5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000 AD = Out = 4123906131524a843adf7ffca281356635b4d86d71654e647b10 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 1fa855132237b0e2feb97d AD = 3dcf1be149dc2269cbac1834b675113e60c552502ca1a4d4fcdf05cf5b6487cc4885992abab3d14362db8d66a4f4ce92ddd42e0c260e4dc13e44d2976ad080f57e7ca1ef59c49253fc799c54ee38a4563758f541c8fe3617b1efc18133a90e924e86cf74b22ec3f24b2b7e6c71bbb35a Out = 8056cf443f731ca9e1a8e8ef3f00e2fb8b0aeb8237330dfda333ce Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 08db36ce9672437c49c17a AD = Out = 1e069c53ff034611ec8fe9c8dd7c3a4ae53680f9359c4994b9dc48 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000 AD = ad8a2c8e27d4ca78f7ffc8e1969670dfc479edd1554904b642f770198b330c5dbc1f51ea21800c544f14cf43b09637914a3ef771baa67ddd83fc716602a32e3df4b6b2fd07845570cea8cfc731c359155148ab053038e5f418c102fbe10ee1c7efaffdb3a703879cf04944e38b2a6d948f58f2d13d24794e5e Out = d4c19df611054b7f07e9fbd9c2b9fc6889a549a5582b32e5932681 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000 AD = Out = 97d0f09d3b833874c467ac303b9e9eb97145dc98f13908705ac002 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 109ff82aee39518d99ea038b AD = 5a9b79efb4147edb70cbe487ab96d427267aa195cca2747a5daadd9551e7cf766d7825dd5d62438b1667d859b155e8fa65cf1375a43540f5eb62cc5ea9760f6d6ef81fe6e2983748222c813354fef953eb65025d12240f Out = 6a1fae294becb1dca7ebd395a598f26005b675684fd54c57f8debaf4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7b551fa9f64a2126cf290681 AD = Out = eccb5e827b40cd21c57c2f24633e77ef31312331d1cf0c15cda21363 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000 AD = d77b75e22ad63ec52ca5f7a8f11c259ed236f2e5b6604c3a5aebd6ba801e1027fc41a1a18b3b3b8389e60f05e575cb277baf644624bfc2c9b3affc629900f4bced808be3f44c9b5138137bfefb3f31fa7565457adb34c7b271c8b1ba6c8690c5e8167831d2df51878d3c91f82715ace822b49be94b9b875f3f80d3d68b826e Out = 4c7c7f3a2b95d7942299d813b683a5ab25ab8fcee440a439f757a75d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000 AD = Out = ee338cfac02cd0e01a546b1a5d3626b0055e5afe276023970e8e4c3e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0155d3e8d8df3c923daeddb77a AD = ebd0349c80c6a7c9312761bfc5b1a5f59721f627978cfaa8e38dc8ebdb36855318bf2eed8a20799e0d5df1c832c00add568db207b2c177bede142ea05ea222a25c611ac4f35116df5c038977b2f3380b5449af10991c54637cee98157407bb278cde3c8efe3ff776945d794ba728 Out = 8d036f6a79d52924fe9732abddcaa94764a4187774ce3d145e52e024ec Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7a9d8c29ecdda11cd04dc9f0a2 AD = Out = d1ec6207cf2fa4750166343b4ea4a86a2217d290591fa234bd1de2c51d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000 AD = 31c1c2f6c88e666dd86aafd18a646016ec828126c2c68b7e Out = 47fb9bf3cce64bcb61f1fd38d3c29798bdd7961b74c2e50936db2112f3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000 AD = Out = b033db4414155c2b9c7559e95cb5334b5b6c04f439528cb2c569e045db Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 542c57c51f94aecc4fe1144f6eaf AD = ef31c72da9705760d143ed3322f3588f12ed2bd35186b57d413d71ba86a406650e4ca36031d6 Out = 0d5f9392276343641c1383e3094a0822d101eda1c7a5a07a0351d7e75cbc Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 1c313de2e4034f8502314e0cff99 AD = Out = aaca1199633b118445364e5f64598e081a1ba256b3ef403291a691c8eb60 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000 AD = 5e44a5295f06341d8a181a9f68b0a32f672218728e43a7e5724b1bf19d31b50a8f16a4 Out = 32f2777a406778303b64621a3f5f0a32c494da63df87f7f14efb9cedac7e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000 AD = Out = 7971d7180d2c46d503aaa45cb50b5b10595aeed9049d1183b89c9796a4b0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 233539c9c0ca3a546679f4bf232857 AD = be57f1bf056e137693d35b4978348816ba3f8bfd92df1e53b0d27dd3f941fb2ddf6f9432e7d2d37ccceebda4ca598440962e2daf843c20750ce502669f0ade6bd10512d2492c005611dde448e13dd31eff6b4339621b7d257d578a8a6ff17ee8c11ba1e6ffaeb3 Out = 04517a4a4b07e7ff6a200aad1a6302ede5296cafd37d0a09be9db5d3b8c902 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = cc20ee3fcc61504b611fa309fb78f5 AD = Out = 9c996cf4b3bc29cd933cd435a3e4a928250fc06b3ae7a94d1566e15e7cfd70 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000 AD = 619eb9c1dbb5b6b52dd12a8e4e0110ebc95561c2a40f2feeddb67c7f8e5a2d007d067d186e8a71ac621e6df7211fb2f0322325a411f6822782b09ee74868fc3ee5a04e1a988406c8683a027233df855826425476f0cf275738f18595a7f9cf3d80db083a6c786e363d608b671d75f051d9fc7366ca412f36306b4741 Out = d1e7b067a1c2188791ef3f999defb7285ce8ea0a350263e84510b295f2625e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000 AD = Out = b02ca6a8deff93be60f6fb52ceb2c1f2265290cbd8cdd13915918ec0038721 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = a590d92075d1909cc3fcf63e4efb2651 AD = 75daf9733097260b277938ae357199c637113868f3f946955be86d14dd2255830279b67cd453a8e012f41929a202b8d8804d73fa499795d0d166a728e5bb1b1985b7646f8093bdaf284e5a2684163f457b8551714c0b44f538 Out = a6198bb5586cab246c4d567c1e404386f00fedc5057326f83bc8dfaa03d5309c Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7628d4142eb29cccbd286f554d193d8c AD = Out = 1424b1f1ff59f1c65c7194e52bc1260e387421748292c010f9aba35d0834d19c Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 AD = 81a17ee4d4 Out = 5916639a8ac9226c1839273920aaddc846f4eae11f2b2927dfd4d444562e837a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 AD = Out = 2a2e03aae454403c077aa1911209c45c7ceaca88a5c316a7ba43e3beb5dce0df Key = 0000000000000000000000000000000000000000000000000000000000000000 In = b736c28145dc632dc13ce972a5b45a2818 AD = 5f11292faaacded8653586d7d5d6d78ca61e7a89159436e535ab2cafce18c8cfd7b68d583d Out = 98a5ba7547c0d4fa1ce54e459110a0cf80c76976730d2b89739501629b5deee217 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0e3b182ceb0712a51853806193f3fc44f7 AD = Out = b3677e7e89f54f3e048e2d14c7a5dacda653dcc08d6c06fe269548649528e95e50 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000 AD = 6afa7cab3f525e9d8667bc79dfe55fb61025a689f47cdeb0d487fe93ddab14c4ba900ec8721fe1016533e71de35ab64ba1558d94fe581b2568bc9b4ed35e0946d85caa778b5ecee4932f0fb619c00488a897873589c4d4bdb3488027503d5e Out = 9118b97a9f8a71c262cc10d3ea988d20ddba7190f7e3423fa0d1f816e81a469b8d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000 AD = Out = c909f2761580bf8aa49324dff16daa2be073e356de24238a2fc756cda4833f9c17 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = ee9101a1f375bd65d5a8bf3d716dacdc9bb3 AD = fe2f9ac991a2394e3761953d554dded796e277f6a03086ab5374b44741297512b47482e156e228064c6d3953fbba61114c51e47f15655d57b90e87d2cef51903ba Out = 033207686a7d32938a11c0eae52c09845a785dec9bd136ba06504bcefd1629fd30a7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 395576db664ff9afc39ca0ecec3f59c4bbe8 AD = Out = e7350af3e2aeb6e22f4176ffa6984586d5a58ae24dce982a8f04bf56551223ab88ce Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000 AD = 34c9a66a Out = ba079f2428d9fbc654c1fad5d16c16bf7e80e7c9428c0a8c6f62445efdcd6ffcbe08 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000 AD = Out = 7a9737f3b6ec0e09c2b6727ffa52174a3f9fb63fcfe6bfe6d4f73a7e9f1c44272b8f Key = 0000000000000000000000000000000000000000000000000000000000000000 In = f5eba7381f628d315949a9db9a528e6d4155a4 AD = 2bf73ff26ed1273015 Out = 96a550d75c9af495714a9644251e8e7dc641c4a08363f7b0367526fdee93ecffec6cf6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2cf39d1aaaaf04adf2fd8b9e046e896cd994e6 AD = Out = d53ff0c83731eafedcc99b0744679d3490420643e9fd8fe107da723743f396f3c12c30 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000 AD = 0c052a2bc4e2de22f221efe052eee21cd8a071ef17805b36f776d7 Out = 4962f5a8d1dc55f01716c20979631ee75e92846cc5cc300f31a1babdccf6dce26e9b5d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000 AD = Out = 7c1f0b9abf452a9713680f7869292578e2f6bb679fca350022fe961cbecd314caa76c7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = d93510cc7d670e31108ae62b09e1e349c711b10f AD = de581b358522ff65aeb1442bead83282754c974a0a2bddf6f61086a3c16a5ac8d6845a58fb6dec84344088b913966ab06dc404a1b5e5a4f7918167c8d6c0b4b0f22608ba6712b0e34b8aed3d0daf6b0d3760cdbe694343d16a8812d23af9194ba35fd067f976f3402529d95e514e74a949a7cb124e8f8e1bb3fd Out = a342b152e31d78e4dba9f9db6258b1388c73f62706af656a2d91b67496056207db089731 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = ed0ac2d939bac78a669f55414ca83a5fbb8e68f1 AD = Out = 86b2d758f8c96285c1814d8017a28b80bc50a134fe22254f63be1c11ad2ed7f57b4dd8bb Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000 AD = 9771b4364480fe968228537d67b9e393a6887d7ee39ecda2e7b229bd1df3c882b7c79d5e5810cf0476903a94c913af0457bbd591e2c6192dd8614062e7c5f0fa437a35f0ce18a63617956315b0e1af1af0a7e926f237f08f327f424a97562290d47f99fcdf Out = 3f8bea955bc638b91cf98a3d4c8ed0d0601c255bfaeede4d3463679a8d0ee3612272eb5f Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000 AD = Out = 827fd06d9024c509b0e76716a1c95c31d8f50e87b367ae8e9e947dbd05a756e53cab0438 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = c89e97610220506aff0e304f64277c361ba6f7642a AD = 56ab3da4279823a2a1bc1b4ce4be6de7a38732edd374b4490dc4eb8a6ff51842838d16363c3628cfc6b36ecdfe47942975384aa98ebac182ec52abcdf8e6b069963c397b7be82674f6c6455b31ebae3e89b388d2c25bba994dba03b9b61511a57b5d22d9017036e258bef4ed25933480befe25bbe260686e Out = 81a5324a31176cafde98785c2fbfd1962e33312145c93599563c79dbfacae683c52a1fc4a6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 84066473e59c2098106e0799992be7e0cabc33f27a AD = Out = c9f0cd003b921d181e26823c96cd9cc9989b75a9536db23f13c3f75a50130b8c8a696abadd Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000 AD = 2120eeb3627a6a28693c05130b8bb1b299dfd5ff07bfc673688d7fd43c27910efe761aa972c1c359958af2448036f6bf09aec7e679b238ce9f7ff69a6fced12ba99caf2e3cbd5a0e2a1ca592b5a286a2a4aa0d974925c31c717d3468b785109e5d6b2b9b436e5571db9c27aebef0ffa24fbee426a700dd99efa96e22 Out = 9cba0fc14449889560fce977ba420215f7547e40ea34aa6d16f35f9934eaacb3175e34d055 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000 AD = Out = a6258b24c81bdec38605185f52f675ee21cf11f1cc590fe9705c3ff40332dd05bed47a72b8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 65b664a27c77417677368c5a6a64c82e6280c192c18a AD = 4a369e36800b359fe7aed86a0b68ffc2a793ffd7ce3d06e0f8351eabe8d4f0ae44561c45e81d1702df558f2fa5d753467247c28cdf07f8f02763efb307d899c84004b547f53bc5f9248d84bdee19945d6576acfbf79bbdcb72 Out = 581586a1199a83a18e2892ec5d120b4aa00b0d0ab0b1e811e02354d1f33c8cbb6de870677465 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 407e4acdb72aede4c3ed2c476ff0162a7f47df123b92 AD = Out = 043c60cf0f66bc43beb8d1e994577b372dcce5cd17db5954f134b54b3021da61f05c053a02e3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000 AD = f0e9f902844026b8f5e012e1888879b0c0fc3e891b19e0cdfe1469eaa7944f77118166f583d126ad458c31599e48b90a0ab1232f96e2d5a848365303a418db61ab9b33687e76c1aa81dc0b3f98386f6b9b1120856cbebc6e93791b67 Out = 8564f6d807f4f1f1e42f78f2984904027ac320141a4a7cac2fa21e00a3cf978df15d10a3e220 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000 AD = Out = 93c6eaa5680d0e138b60a16ce35dd1d9a4daf84499b217ee864967c59c1f08cd54c08a8bbc1f Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 97f68059a51d0f3499134418e6414f66c5013a12cd99d1 AD = 733cf1ae95bfeccdd05efbe586db78f83c0499320ea45c4bde1573f30ef369ab898487677c048c5eb06ff73b6c9fa61d25fa698b41fa9c97d89e808ca2405c741518ef1c38d5b85abb9e360c1dff5030a7b7c645c69a703a289141fc99210c3c50b5a60e Out = d0443df06fb0ce83e780b582bfe57111c6ffa776a40ab71c2052cd5118ed4c5b58dbb015be17a1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 3c5cfe5c557dc2452a7ca6b811df717cd3c69ce55a917b AD = Out = 4492071279f10b09bc184115b210b6e1a95beac5ed1bac619bdeed8e05e09afe972b014a5700f9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000 AD = 673ae78c08450e24a53401a9c9e44d011a2373a52b3f7f9f9bc15a1286fa914e8977d9cb7642220633a6b077107d8c5ff65f68f54aa87195090c335de1de5ed9f9ef2049063a7b6cc00d35d543cfd26c21 Out = b8d86471f2ec54f9fbe9533476d8986d9d2c78fb6a05502d3684c783f907cb2b3a958144e346e9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000 AD = Out = 03893fce373042d5901b1f85d165b7e897a7315750387a9d5743d46fb6e6a127b2c627be044c95 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 78b183164c2d5d730741dc9c9778bb007fe1ced1a07bd75a AD = 5f2ef61db20cbef6df35d0922f1326638d778ffbb8faa74e61 Out = 9a50fcb81bfda4c5f2861d4a49ab6ab68287315486472ceba7a130e9c394116b6adba6aeccb0eb8b Key = 0000000000000000000000000000000000000000000000000000000000000000 In = c2bbb93c6100252f6e3f0135136b945191c622c88ac9c4c3 AD = Out = c0563135b4a4cb08caed32eb1e1b527b509b8c78f8d57344c73c66dfd592acb3f88cea26c6466b8b Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000 AD = 059e75d48508d92f018d2accf9525fbd83fa46fabc6e16e02536e51e34c56aa20ad0846c4bd7504027b7392766873503b4b27ceda22beac8ae1af040c41aecba6820101c9776d81f0dc40f2b1f1afd27f95b5fba1fadd995f5e63e6dd2ebe472e2f1f5079dd64280f92d32947bbb98a0f5 Out = 0c9278674fa87496e596114e0bc3ad6d911b2800a5d0bd1ae2af6b29cf36a8da06361f7e868b038f Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000 AD = Out = 14abdda0a8dec6c8c9275bc5ff959b51b6428d1ac5a4b2a9a369acd40d576ab669c0cf7d06594d16 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = cb8a942c0498078ba0f945f4bc3f75b6193e2d917e38e4638c AD = 60fd29cdfb0d0949b9a25725872e83024dc5935f700cf3b7ec5a43eced958b2fa9a6b9838abb193681fb7a16f0def7aa137a7d215cf522c5091c607671335a48f0007cdd57857261b72ce61acc12f12f7db2e8c882a6ca4716746eec4ebf24384dd1fd36cdfc65d0181c8b0efce42de6bc5a Out = fbe1e45dd0d08cf077ac9d80fb6bf5bb9d62bbfcf352425a26b2d6a82bdee193c4f95341be35f9e044 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = de9f494b71401fd6d5774cc5b293af1f55c0241cca89eec86f AD = Out = 75e0d1e12227a34caeee8603af1b9b442bd6ded60a18f892d15db4ad0dc1ee086f7d2085c24fe8fd69 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000 AD = 23ce5d0e684274eb32d5c3e371 Out = 7f1a5dd82686612da4d44dd82ff1616aa7adbcbc31e24033d9f53853c23af34b3f9ceccf20c890fa37 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000 AD = Out = d1252b1394750132fc04c72fd72920ec674fccc90b06a4833526fb32f56f308029c9edb986499ed3df Key = 0000000000000000000000000000000000000000000000000000000000000000 In = e6b18d44a5c218fe630cd30983caac118759af04c8362c451049 AD = 1d29308b0ba07747ce4f3e0abf19d9c697fb645a Out = 6305c9a24126230b9b3853f6b840883a07c898dcb4534e3e9fb6e348eb5f4b145e0d4a8d3a3186af502a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 1b6883a80446c9341999b37d012b67467100b2dacab7e53b578d AD = Out = 6b15641e90f68da0aa508f0832b5618bd7f1417d84723df5f5efa111b3b03f0f1cbf435468e38ba28fe9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000 AD = 68a21932646476fe44f9a3f03b558b5a969314f0776ce55b5cc7cbc88412079d740480bfe3c12867a10a23dd85a8426084f08f9a01 Out = 78c2d2b1a1565174f1fe045f5f72ddbb735ba576904c7dc603036f19097e1f875f1cf769fd5a90aeff9d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000 AD = Out = 674b05cda8c9a87f3bf955db859d443d1f42d802b6e8a5562309f972088871b917273617c90fc6c0dcc8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 051bd54668d70c3e71ae2012424ef406a8ee0c8f9080de75efbe5a AD = cc52b72477cc5f8c4b2a5b0d284c3f07dfeabb7c71ad9c5390eb1796b00b5a9093ff43ba7639718913c23267a6dc034fb224b7ac7cbe8d3b6edc27422c5e8968432cdf04be652d653072886838018089a8bfd02c2cc8c6373970004dfe6d510dfa9e3e801086cc54c8e4d562e9 Out = 1c48e6848eb1348b8252d0c21b6ce3b4f43afe9138f22c97470dc1782429df8ecef82fe853042313bc15bc Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7985e6b74ab80cfdd72610ed41e3d44a7d31890cd1cab6d62ec812 AD = Out = 732bb56e802c2556192a1375cda5a229b0529fdcc5016f61d58693200deb19830b8182a5fc68f6d2d88265 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000000000 AD = d55230248e31d1e005c11c91 Out = bc2aa63c4e3fd03f9695eab908d7e99f639f3efb823cd45c30333440db56ab4eaa861b0464810b128e4662 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000000000 AD = Out = 1e1cd902885af9124cfcf7c883520dbfa35af121d3ca37d0be9b2484bcd8a2d214657d2b859ce227ed3923 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2b69ed39b768a7fd9924ba88a29cdc93d36558edcb9481b263846863 AD = fac71fe34360f4b399f5559efdde4823420655df721916eedcb4f576184fb9579a41aad362942c5f3623903a11071920533bc84c053630b10af0d55c1fe1795583813521b9a80ba3ef065952b5404254192f1f96b6c93122a47c90334e837815d6d6acf63f87c0cac841c3757ef02465592a9f16dd Out = d630df1da4062ec15a5cb611a30bb1a1fcccc656acc86f1818eee5954a417c26fdbec9a18403b2488c7e2979 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 824f50def6038b743ba90eb3d7d1c0cee31459b1b78a6e02a5ed3886 AD = Out = 55777c533a1d9634168ba3ffad07a475eff4832ee851a065a38913c5b2e58a9acd480efe2d0d00c542b748d0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000 AD = 030323ec Out = 78691927148913c69269bb132432ae3338c5a007b129b9cc055c97aa6abfdb2d1e391ad01e1c0cd7875d5baa Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000 AD = Out = c144c2617a46523c07f28402537cf3a5dcc9aaa67c00370df546207b0c6f8aebc0c40099c203b36488e25bf9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 59949b993e6e994f1c6d97fb3a02de8e50c11c69fab1ac158f9d391632 AD = 7ab7abdca535bb24302ee26bdf5f47373dbfa87933f4e4c1ec86e3764f358cbe849eda054506cb521f3db4ac956d57a2bd54143c7d9044f46f5f33f94478909f412f290b8a2b63ddde546ec7b6c1635b693c1eac6d5590803d07304645253f3441805c Out = 844c9358fcc5f4a6ad67718129eaf7278f12c07baf4597ae7f9792db6ab38603b1090b00d55f92f2fe817ca3a3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 4f877a4ada8c7f8754ef7f0d069fc07d6476f693eb7fe66f6bb2111597 AD = Out = 7363b0dbbc1b0d78ea2703d2889493a89e588a5de86eb2de9d88ba077b7daa6c712eaf1f6962936bca2e62719f Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000 AD = a7146044fdb0b9327db53bacaaa7b3bd6ce0c14f8addec19c83962f73a44092852495dbad404237df3231d4d74e1e6d390f42424d249d3e00ef69095005a172f544cb071b32409f54e077f2a00a3fc Out = 4dd348e79865b718dc4e4c72007aeb5ded09132483e262000739520871a9f16621af4eb73e6f32eacc7e6183d8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000 AD = Out = 5bf3e4d7724bef9bb211a5e4dea1ded847d3b6e6a3be0f7d045948500f7ccadf1778cff6e56f2b2981654764b9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = df5ab290235c1c2daa4672c598f102a3209aad63170762c01d214a8ccd96 AD = 7094007e46c8c4e7db078844e0514ae8dd4c2cc35526c108466949aeeaf39a0d801ad952c84c8451efb8ee8cc6eb5a25731bef409ac6355774d7eb5d55dd92d0f549 Out = 1831eaa4d2a92ba63e8e78203d17726c35bb399cd50510fd9264d712c27a6661e6de5a2fb86d4aa36ea8f00b958d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 1118cbc205f006d681ef35c39f51e170c4152724906d8785161eb9b85af8 AD = Out = 38e6a7ddaf40d20fd5e82c7e1750fd887bb41aa229e313c2ff468af012ae49a5f763c1e9959b2896994832e07820 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000000000000000 AD = c8d3256b6129b336921e781b8272ca9ad98f3418fbddedca386410f029a06a045635cedd12e7e31edd586f7d46b3052a0b165c67109a885ca991d80659fe4fe7d9deb4c2473b481a0b1aaa372caf139f96bc303ab79015fabd0754 Out = 95e340010bdd85c46f47c54fa103ee105679d9abcb771f8e32d1f11a08776f49f61758facee61314b3b7cd851cc9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000000000000000 AD = Out = f680302aff045e6f5644a45e0b1bece2407a9ff3caa73efb8f61f78fe89887ef4606a9305a3dcbce1a7f403dead2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = e9cc97ed7d90e36b4f2ffe6bebc0ce276cd2fdc65159db3e9ee47be193af75 AD = e1cb47300c3953d9871e8076e323195b682d0574056f360778ef40bb678536baf4c4660da51a20f2 Out = 757083b5a89f02b8f20e5f0f37d9dab6a1f4d0d4e671b2b4803ed3a583178e669d6142baf516d915836dc499275ca3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = ff4ef63f4c1c5d0ca8c48f3b14e9b2eee664167fab75e944abffdc5d0dcf02 AD = Out = 8b51df083c4622839ac6abb7504c0614854520ea4ec022363f75444349b46f534f427d7df3235b4b826db2d5d0cb76 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000 AD = 36ad4fdfc48f6f2f8624a3735d684eafbdd7b06f2a66d02ac7cfc6a9a4090cc63636ff3fb6bcee743ba7db12a7644296dd9227dc3f725206388cae62bfd84c39ec627f9bb3e16843f0e1a99901e287e3875414cf263a69b540c78504c0c8199e0c18e78bc1e18656fc03a13a3dc5347e39ac1e8f67d5d97b24f65bf05c Out = 744150e39a35305968a3281d1b057f60eeefe592036aa184fb38906a45411320d24bb8975bac9c9cb4ba75ac741da5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000 AD = Out = 10c1596974402f9b278dcb8b07b958bb24d1ecfc49922e31f9808e08a9f55a5c78bac460657ad6a37a55c646c070ca Key = 0000000000000000000000000000000000000000000000000000000000000000 In = fdaa00a8ca3852e5546e0d75b0f77772c44574a39833cbff9971a49b089895e3 AD = c5728a2151b084946fc5e1ae813b7e3a7314108e501bd9e6c1c1d010cc3c87e0ebd602 Out = fe9ef538e78575cb1fad1654fc7b8a7cc19ca367bfff710134b3a9ebed56d15d3a1d0d3bc2c3ded367d33b6fdbf556b9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2928f557e0cb71887838af23a32bc40695e78587f03cebaef2b91f5dced5bcdd AD = Out = d71792341c72a080c9ad934aa81ceba8db417275f567740065cc446cbd09116e5ab7467f02cd941c97193522a177477d Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 AD = 9df02ef62c5930694f2a41acb9ade6be4b5985b8366cd9293f18251aeb25da398550cee7bea4b5fec54f357bbc5861f82e090346fb5dbcf5a87e6fc52a01f971ceb29a5e82a9a330ff28a61de612e37c906ff986025af770d4e20e05decb89d1 Out = 0de07361a256b0bb985f90bf797694ab34d6dbfab49767ce5fa6ef413c57e90eb72ea2e942622702ca4f6a7ead3a9951 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 AD = Out = 96001b90dd3dfe179101ec6f0af315c6f60b76737e4ef8223ce5fe8b5e2f3927a7f0c2994a59c4a7c8cc52cb2533ca94 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 20095a02679f7c6600bd6b637ec8bb2cf39be19fa4f8b4354bbd1961313bb45701e355f96b50f5175b AD = 183956575f1ecac55c6317f2459dce118d75c09b713ca5f4733e0b082f8f0e23825b36ec Out = abe3b27dc91149089f31f176683ffe9a4acd8ec471f1ab68beda0d5baa8905c496dc2841f784aed141d4bb3a7d2f535339255bc1d6bbfd5a13 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 93c592eb42e9f93deaa5a6eea71563ef614060bacdbcba17c3c07f2f523a8a4bb9c4a298e0d5d36498 AD = Out = cc88df76bec8fc260740dd42bf025ebe60adfefb411dea80ef555d2f65a26579a7f571d5e2c4c99447bf57528de69bdad01c1529e35212201e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 9ebe6da370aaeb3d3f2edbf3670937a675ff2cbc96d38eabb97826a461cc9bac5122662b7b86fcea Out = 2b0a563c48b4b18991d91071546016227888fde93606661c1b0566c15ab3a3dcb9c0ae004a8fb1958a137faf50c1b3a45f8a9c296d0bcdb6f0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = a5b7814b8713407a2fd4b52cfe86f2f576d515d1b41ae1217bea8de784238e4cee2a9183bac61d419a680ca23021cd12f93cf11268685bc1d4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2c07ddcc39467adfa8534f6d0ac72e10464dd2e8f8fda33895cf7b549a24019d5d2dc34a6d7135df9501ae58e1e42bb4f31b64a56f651ccb3bf8 AD = c2a9d256fb47a70c7309a36309e1a7b6cf07641d468d630a54db88a81ce9f4e136cfff8cb845605d445e8fcf45779973cb9d794973624edefc075e4e42c252db85fcf5f19635cd803578c1e6c2c795ca9f929e2d9a4c629b55d24b219786114a22e2a5fa5cad588c174397fb3490f2ae2fd6884e8b93d7690b Out = 486d60b1dea0e54373274b3ee765e23ace961cb1c6f633c7f23460c0fc76d8d9e9472c3d9681449d5eafc5f938641b8d33e3e5d79f0dbae269000e9591868bfb163aab404b3dbbc62f88 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 16e83d690c573e9b2a9d55fd9226cd944b6ca4334a8328645e08a8b961df3725b8b5fb25a408cbf0182f7f085a721fb1a2eabab2f3e039941a4b AD = Out = c993b5c3295b8d22d8a0491a75482f620195e75fd7d2266df9e2b86a0c3f7e93357443c3a0599a9f3cd1bc7b4c636138badbdfe109aba8d5a40b2615df592b0084c7d9709f504423443b Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 944827d218cd1bcf8392b88eada9484ffa19a56d28e7a598882a009bf51a19e1b9806899b4299f186f950b8a888bfae9 Out = 795ae837b976d3b31ec2ee73d28a02bf15485d66b2e364482a452c61e63c4f3ec6f4d65b46a022bb090267f300edf6bc5a3befa99caf49b404a8cf9bd908d0b7a91fd3b19f3c666f7269 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 368f8f148b9a0596cbc77ae68bff43b8feeba808102d512c7cb9256f2cfc685d5b13d859d7c9f358c45173b9e77520ca07c63c6dddd9b2827b582f5ad5dcb60dfcba129622ee031a798e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = a9b123974f61233d4843f83293720174d7ec68c263944d6db04397b08368ad037ee1ee27a9d181660eeb9fecf622c58b2c7280d5caf2114e75e8953a6790a2cc38f88c AD = 9a909bf238625b5b76245b5b01e9e2ff81ac63955d3829e18828850427c30bb3b5e21b7be96ead497e3684144c5cac827b53bae9919eeeb323166fa3d3a70e202c650c3c549ae731ff5e9b395762b098f06db3a9293a292c11e886ecdd7d49f862b258633df47aa6ac8d87977415f7657c30f11941f7d11e609b9c5406 Out = 8bc4e164642ba58398bf7b6d17c0022b9a078478117b32b42a7161a24bbc4f2fc99553b1787948968b2d7a8ae96d69dfa55e83337ec0d9e1112e6f4fb5b7ef1c1ecc2332a03601ceaddec61d75d483aaa9ce94 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0850f4075a1dbd3d7eac2ffa6877c54105592204b6e944b81bd877830c4856a5f1538f56d6f798c556f8c66701faa5ef1a6179621270bed2afc7f18e4a64935524d177 AD = Out = 9c4cc9b7438635f9c9949fca74942f6c404037c016b145d61589d0b1e01d1e3cae3a5fad56ec0072d5c22a5ab611788c47c897cc5d7ee3783edc9b01664a43f3187958afbbaf509e66b88f6db87c72186650b6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 08f59dfc5e970314cc746cb395887639e35e26334b377f96acd856e51a9772c57ea54a348dacd6802259e31b28d965ec1e0f9356d2a15115bb6792c0bd309645e612b9fc0dfa3922 Out = b18fa7573707b8daeb7a7c885335a7312ea8b104344f20b11b390d168114bb93583b505b2c896b4a06c85cdf8d78ed67a8d9fe8b2216a285bec7f34e851d7437464a1cc771564f23a7a20902093ae4ad61c759 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 1a5a3fb0c685132d36ee99efb042e625919b8be7d819815f7c92f8502cdf4224b266114ca417d198c42faa4db02ce5915e488f624cd39e69d7e1ff1dbd0de1a741d152241d59c831c18e39887bb63b8d76d2b9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = c9b440c32f5d8bd7d711143b31feda81c435db8e270f9091529956b95d89425a17943a94a6f51284bc6788df7bd9f0e34b3fbabf666e30003e0fdb1b8fb88b4154ee513831416393cb7ac31a8dda182cc297fd18f423773032b3235d4c0319e4ea2ea642b13b3467209cc2ece0c88228df727ed8fcb9a9658ae575ad24e658 AD = ab0a8d517404ce5d67b5910c3b4dc6550904460dabf0b3b934e57291402a0c7ba03e01a35c7484473f0fcca05e748be817305dbb72bb41b4be8034aa3f9aea4c94ed88fe31a711681bd4e8fafaf097d44cb2e66d04cc2d4855d2d50cc6b1619fe9b72656ebb42de3598c7e3e047082 Out = eef9458a4e9de4ea2314d033b6182e173f7b8b154895ff7443b15074a957caffcd3c9046ef661709621c8c67a18ab9987e3d3f48ed80343c6dce7689028fd4e7eabad6c812f36dbd5bdae0df4434de8dc264fe341ce6f3c1673050d11bd22b9da078cf2d56100584065194aebfc8240bf9fea9523cd80976fc0f301cb36aa3ebf1fc400f543011d627b8d68a516ef4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 02a02d2fdc1c86599bbd1ce6acfc8b7ca01293a04f91290238862dba848303b7c53a3a97d80d70c3c91e17247f5b10ec6cbb27b1a55817e91828bb15e775d0ad491cce284799ff24b1b3abf368ea7c13e014a80025244a14ca63f8faf174bca3749ee3b5446eb8653d59ab5b26a5e406b16fa92a976f96599958b19bfe4c6e AD = Out = 7dfb78f7c411b49b3ea01a1521cd8c1b97ce23b4c84ff5b1bca20848b994af57f22bd611b9c1c4c4af508600f1e239ada7dac77f9fd945c379b229d3e0ef3a899e01b7a553c6a717b4f23b8b2d7c534a89722432a3836d6410bed35430318278fd14e8d2ae03346f234416def23f7920756eb0a241821682fa17261cf9af901df97ab8721f88f5af3d95f8cf4cd06a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 0e28e33835 Out = 52a18edce9756ddfb1336902e6e95fe6174ae5ff608188e73b0bda2469ae4829d71ee80379767efa3b0d41864fcc4222051dbdfe86fdfc85e2db617da85c136f3c6d1141bd212ba2dc99356ca7c6e8a31ad200f4304f217cabe261a755c973ee04d8cbc11977407e221f4baaaffd4d6b3481396ffde26bdb87395527561d0089448cdfcd420b0ca07fa92087588e38 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = f2fc14a55ab0434210f547c5ba813aa02661f1929a05a86389502599d2289afddf25051c7d8de8cbd70643e25af918829c840bcfb650f57976045a54e04cfefccbe3ddd4a6e8f936b548f18d323265fd4e5550f643e4d0f40816872a1fb199eaa872770dd246e5b2d434576a0e0e72e243c5004f5d2a8b22d7f60e77cba7ca512e2c7a8445b00ad13ac28d4cad8896 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = fd88748f21fef131de9c066f0ee295e6b606e09060f0171cc1f78b920fd8f2b30a7f6c85997fb58fa8a2825c575d5ec16a9f8871bc4d3016c4cbc13a06696ffcc30e24a8c6094cd8c54f1ea89708b8916be799712f02bed5e259ec48b30b57ab5ace2bfe08242529eb94a2cb9d765f155b41235244f7c0a737b5c4bc49420615 AD = a0ed6c4b632ae1e37c19d25ffd99 Out = 62c5b4b0d27647dd707b041044079901851a03afd727aa82c59c2c1fc244c0e4c3618f6770a43f29295551534861f00b40260b2383f5f6a0504c69c70aca5d6957b2e2d8e6db3b5251fd7e62307e7cb7499721b73dc1fc881a411ce3fd0b627d2b6becee2c0248b15f50c9a014dddbd6d4ecad5a3881f1743e46b27e3dfe7f209aa12f58f16b75a81c48dd4b240d3805 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = bdea85f8b440ebc3be68e48f8c7dd1d07f87586fce03bb46f3b877f32c9bbc6bfc8e577c80741f8dcfd3a1f880e90281827abe448bf79364139fd2097b61e3ea7e283789132e30446a0c25551a74dcad0bbdb70a65fcd7fde9d168538da31821630004b75ecdff745df187a610c91324d020cf67bdd111d073e0c9d0f0e40994 AD = Out = d3a5d5da10726a1d06b54b6d742ccbfc3fecd1c4da5ab06b70f0adbefe2244d3d6487f0dea913d691725fbe8a5073d0a3c14c6b526cf9dfed7d32f399bc3d1f07e4586ec4e12bb5a787e79884d04d550b582abad788d935fe8b8a92312845a8fe9624328872a4ef63ece44a11a4ae2db6af83def27fa64593f2d9215d1e07503c02381d57ac59c48f9d6289b3f35972a Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 9c7127afe1118a4171078d8a46d0b025226c213c6862ef00c3607daad69d53fb397011a5bdb58f4ec6b4bd36e6a58671936560eef0464ab8ce5ae8251481fc1aee8107dd0974b43810c7e05a6444ad42bbf476fb087125aa59ef60142da3986e47baf7c33404f5080649232a51d01ee9656d72468ba210b561f400eff4 Out = 0e6bd934c3eaa9f28a5a4c2c47055862c4bfc18387918a525ef03746c227e5e87635a364599e8ebba3e3faa409cf7b3794b3791a41c5aca23420ee458014b99b718d31881e648cb978282d621e2ffeb6f93c98ff90bd3c6f4f35dbfce64c89a3a09e4ce871b8959ff0f9f0afb519d2c7a5c35b70f75f768b260ddab75b20cf0559f391020cc26e2596d1268b512f0dc2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = f79f42a9fa03bcc361bf40faa0de0c78a9b3b162df0ce4358d0e53f30ed3f79f44fc465a70956f0dca63a629cb8a46b946a51cae11f7b14e98b9ce64f4e025b160bff6eff7ad0b67c1fdf25b4e4473de499b72780b7c9c23e41ff6969ede7c9815cb953ba2b4871bd4911283b5b65777d3e70e0d7be6dfa1c015fe3ccac425cb37d82f97f9a622bbaaf28b1c7746d795 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2481c77ee75b0f6feec7acfc682ef5511a4a0bcd3759f16e987d18191e668b8827de030a81e54530f1caee7a59c553ffe15bf3bd872149de8edc40960fa22da01a04f07d3f793b25aea437f7a0379368beb47629249a1af8a488200607ba85d14f81d1bff983398873f2d238321ffded24426c23e0bf7736aa8b3d38f458612ca5 AD = 39642807b94d71d6ea8ac15075ef06f693cc559cbbfd25205bc5bc6cd754203c8d459cb181ee6b05d6c524e0b38391800340112101486b0ad5278106d318e248f32e003954206bf57f09e320ba1f92c566b9a292c5c3699f9f875154f890e322f778465bbc4e1ed3b081174f5907359a3963be5a6ea6dc3a81 Out = d1054ceb271e577afba3b3b6ada6c8bce51bc2072ab5afae5b1e5346d24e939b2a933fa19319fb54ebb907942cf04afbb463f62f9db6a8ee09fe7b45383b1f06ee09ed1a5dd443f9405eb76512be543e8c228ca00579887cec286c6eb1a2c53aa662dc90f8ff65bb5929710a01c1220949419bb34c9f4c2039804872e13042b15028fdcdf40f0c45d2d478ac9f1ef5386f Key = 0000000000000000000000000000000000000000000000000000000000000000 In = e42215ab78c73ba5a9d065cc38e4213fbe5db079f8270c1e665b0cd3e0696260866dd6f1aa23ff941c2fb71e2598532e6baddc946856f4c7564d1f7ed6c086bde2fd2e96cf5ad85a0691d995fd39bba03f4b8d28c50a3b4883bf27dda3225600d405a3aacd7c3a1dbb21f61d8dd20421fa1a4cc438323d032fd1c01fe02d5493a7 AD = Out = 927da42b99ba1a58e55e618769046262d5637b63bf5c442a0f8b74b01faf865af1fd3231c933395e00837835ae63e0291d831d97297b42d12d33a30509f6a46d8c78457e60064235aa40aa4f041181fb4360c376b6ef3d4f2dc33b195ee863ff8cca2cc44e9584ab3001e001550ea6cc5dc6adcec6247c5a6e88de99f54466097cc1b7177ad347c28360d53bf0281c585e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 7beced47cdf1b3f60a41b9e02879f458246019849f31471541fb864838b8803859fd5307da7afa0eb68b16d7db75c4e1da25c33dd6fda748af73e8b15bfd343b6af154fd471d8811a92fe5bbf7440eaafc6f759ed19c62 Out = 9562a96b1ce77635288a54460a6c458fb2d7fdf9b7ae5d2d8ecc721e30abb9df458c36dc187d9caa127661d4ad03d6e77774724d72f8dd2ac9991c6cc727ee4722d3b55117307b79d1dcdda14adb8f87a48ed783fb967eb2706a221a6ccdaac9d509712dda504ec757944b8ef39bb52cac813bb1687f6d67991d888bc297559dc7d0039f15f62b1f0b75f8f12b3c531a8e Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = 39bd5e0787359f8ef8f648e745f8fb40ddcb9d4ee834040e250ad02f0194c97d50587b0dd9c2d1eb7afd1a3fbb62e20c1de15d61e8a28274eb3430f13f782d7c1d7f5e562fa36cfa7fcef283b275962446f3e78f5ebcde3cb7dc7a1d3d67ce2d4f514af1c252b650a3f8527d7dbb315c407df6986ca633f6c3e2fc493c4482cc5894e8a114e98ef5466a3cc2776ca93581 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0b8319b9e572fe01fa943fe28c84c7ccdd44bd94a84fe18060803b2a8685c398798893e32a84ca5081e7664f4ca59e590ea76514a706f0f83a55a509d62cdc0008433a7fc242c49c84d551f7f34b4985f1c4643da155e48d9acdfe954206696e90c918f64081471a47f9590c2a33f1463d8e42bbba22e5b726e55556eebef39e77433fa100c59d42d29bf264089a1983b82fc9de246cf6a821382943797bc1bb3bf22b570d4072053bbb4786811b2f7fc11db077b3b135a249d810aaaaed1d8e9ba4a222fac8a5b3804608e2b32a589e7b23c5a18af24b73c9a38a72f87717b3f9f6b5e07501d45f0732e093529f5dd2ee64c324ca9a30746e7d4afda9571eb09acbd920262239954b4279336ea9bda5c3d827793ec1b6c72da590a68a98cafea7d81596a12e3e7ca5dcd58294440da9c041dcc5252706eccf5b36bf5c684530b53257ddde1de98b5f8e43be8d71c18686190fdc8f2ee9f9a912b31000573d701ea09054d1f297daedb80e2471a45a0ae9d901e047a4b200c399c28b1e26aad15b2089cbed4f1e2369bb9e7c452b04fc0b2cd50d9aefb16bbede335ae1a37047b7e1ed9b74270672a613e7a79a2cfae1845e38eb41b3263c6cc8dcb2516d2358ddad0f33f2b549991f90a83843cc5197096db29a9fd9fe39c1e4a0502fb3ca31f6e2b25db27b67de5ed8fc30cec280557afdc25a AD = 512271d122064188c0dfe7275d7e88b3894d4b72a2a605b1c87b4081b2db991dc362 Out = bbce6dc2b57a227c59d869f184f8db82fd6ab9d498c83daf13ccf21b0e36cc76e51cebb02f81f23e45b797d3acb63385f9df34a4e6c7802f67dc08e108678327d8848f274ff87c125fa8b8eafd3c89bcd3321fceaf6679876147b18362042c577de83ca2baeef31cad58067c1a2c881627cdacb365061c156f57ca46e6e32dfef569a37f2694bad21232147d048b5b0bfaf16fdfbca7759ed5fb04ecf23c3ec7e335618d15e25bd23f6933945646c3a31851d1ae8fca9710d78ca8751272987876eb5ef59c156cf3b9eb36019a4fd5c2306f7cc5d81da50b2eed5ce977f342a24476614471049d97cc787a9f924d4a0641a8a21244c12935796a908362985d9195ec78bff45e08948e72d62e6e28b676cc4473bdd3d1a34cbcc6f6a3c0e8bb005fc16ed233af6e8e5e2bab83a78b21c3e1a4eabde7c845b24a8ab94ce03bc0ef039341719745ea8ebb9c0cace4a8c3a7e2370ffd4b0ca71a91531feabddbab60804cecce9d27b08632c72400dfeb34c3c9ce4e7076214be4b1120acd23cd6ce4d7dcc1e516edcd1eba21ca9e1b6812baa8520aca007b685cc10424f4642a9cc35039a6650c8b66e495eb172f49da25dc32d0730649a6030337e8e56d57dbc07ec34226127a716ed5efd2e99bd79ecb60207fd7e2c1afa7750921aef59ea987ba4ea7dfbf5f81c8a3cddc9ce33cc2ad31add6a37e98e8f6f5985233491dfa084de07f9704 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = aa8ae4033331e588f3485a54c45e9974b0b37db047a9323a4aac0e4e6408e46741b6d2c82ca767d49d7c2c67f7054f75b82317cede56db93520fe880f537fc4934329500a85049866cfc4d3ebaca85119359a66036764f8b52f5fbac7ec0118f20e341c90717572867e231951991cae941ac100d98873c71b24f202514f4d8610b2762cfe4e4afc7104b605fd6d750162ca492917b5d378932a7bd997c5c7b1756bac1893efc5b06af9323fa492c920dababe18bdaa5625f4c2b5c80aa35ee97ecf115e0dee31f592618035fcb81a5778bcb799ea35260457d267555f2b48515115b720d2dac10de30681e2579daf4329364bcef3ad026546eb098abf9a8fd44a0bd4531e4267b54838ab087bbc0c408dfce7ae1215bd00e8cff6acde63b5fd3145b996e1adde0904462ce683f784c901903edbc16fb4c5d9d2d95c05b51ebc4ca3036b2861fd9352e3108d093b62f3a09d9947fde33a890ecdd21a9b9517bbc982aa3e2cbe1ff5d21402f91fa56f37a4c9169a6a7511a7996a67b86483df2c51c4a957d3ad112f9750eae33896b389dc38b3f72cf0b00023ad677e9b999281cd3b263b8b1bb1289056e353829c44e3a16c47bf9a3559413b02675c70eb638d38424080c5a601bbcf76b0eae4019255e37ee1437ef12e6ec21626cd112cc81b4e12a1f2c2d1f859c314bcb1b389c911f47287cd2 AD = Out = 487f01cfa3d5f89d931a6fabfa0004a3eb9aa89571218b4f05547bca4975d2ed4e052c68a6be6294576ce3a4daeb7da3dccfd09a25977bb73e58d4f9aaf74ca16806e944a9933b170234cb14650b3a01f912645650e78c967b6638123f32e0677b1a9f8a584f00365629833e4e1aafb39c71018f087fef7845c0929ebc3287154d0de45e367e41aba95af97e0775ae068f3981b127e628b12ba7d2bcfb492a2c4072ca8a096cd82ccb6c382f969fc4b577de8b6b58557b12ae39bca25072b7c3658296066d1682781497ec54e21292fd7bf6782651c7a08cbd1c2240ad49a709bb06691457c3b4a2f4a9c01767bb9dbfad196d49da24af7d90ac123ae729807b2c39b23ac23922db94c29f1ba3c946ec635d362bdc1bb4f2f242e8f8dadbc8d1a0ae7de6bcb41b9572dddd0c456157c7a114b9820f85f6170d6de0253fcfea72f6a2dcfc45ccf672c38797534b935d0cd4140e3bc38185538ff4c279837f5ef133773f50cc18c25d95c435cfa33c5154c544b8c92c4ba07733c3d126d666a24bc70ddd51ba9991cfc6bea0aeea7e16dfe53d4236a8fcaddb1a9d9c96441a606ab4a1de5e5042353eec9c1295e9ae6af95e33905d8b60d0229dab397854829dd08aceae67f852bef9ea9667e8f0cca46d09f570312f5f89b5d039510411e5dc3fa7c21dd83e9f09c6b9fbfde89b4b9ec4689df60640165655d4301b54db6b72f1ac3d6df2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = 71fa2bf044e5137e12b56c15170cafb41474669a312384506ebc168a5ec1e0f7e181e0c32190e28094cb0c31f6c66aa92e894281156c4fe442539e145885a6c7910837c7ae82b81cd321d06e7a1b7518ca3bea4f5b78d3a1f4e2 Out = 0dc601fda3d2134d7aa1e4de99b5abae326abb7a37f869da472b05ce19a7768a6f6d28c6aafae49b83f5211c099427c2c0f62b86408ed48790ca5c76eca3904cbc1ea0d659dbc56b893d512dd26ccc08be669e998c3d651842144b01edd1a863a630237e2289ab87874b61bc3f49acde9fb3c55ae1c01cf7e8173436a09d003a95d5b97eaa6cf84407ac84c991484674dd4b74f0bbadaeb23dd03916c6ef842561f3a9548b5ff4c1cec32fa5c97edae472cd74a1ae9da6de4d5bbf3cfd8d3e65514b3bfcc7ce306d1be59992d7f02c78c51dbc7faff1a8047e1beda14de1437a39139524aae5907491dc617251871ac31421d6b01bd4777c4ca301c701b74497eefa5c2b2f9f5344a40bca8e72ea1cbc31806070b448f1880cdcf7014acaff376bf53fc5e70d23dcaad7a868fcdb1749b9a8c3cd52da78b60a5f95937fb83e02715f8123db5b2ab7d7dd0ab7e40676869ab513ad7f9bb187755496338caf7544f19cd2cc173456a109959180be1088805172676d7c2f12cfeb5abd849600a90cdf2a0e9a3375b71791798f31629c961188b686feb267a9da9f93ebc62acbfad984725abaf7118cff121767a621631782cf4d33829e943a01357c0b81c996e9e5f42598be2cba064014d520b80339eccdb6e4d118103bf2fbdf1741a9da7093a63076c69bd024832438c52dbbd787d3d4ec7135513d5db308e2febe4d2c5034ba2d0d59f7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AD = Out = bfbcd051847e44a333cf11c7442f4d8fb2b8d5404165d1daafb0bb20ebb2b018dd7f18deb8c00b2a71327154618270deaf1ad19c7650006245f23dee23827de5a7969792849cc4479f5173fa1afaa6cdf52daea152896888cf16c5b8d92b3c318cf14f3f24a0d3271bd77af5d23eac9422a2ff9ac29d2036a772ff1753e229c4c380ef4c8408d7691d3d989d5e1b2359524e06cb918f3576d8f05d11b0c6c6039a57d7504265462feb6f9b7f7a2ad75b0f7c0bb7c90d101559ba6d6c3cda1c1400d7ff53f00d3cce4f65d95000580d984ab4f0460578a8727661128feda752227daf7455e3f90d4fefcb61e7124e7a8d3ac985c45f6fead5858402c69cd49bcd1c45300a1eecd1abf4cf428fcc60df11049a663fa7d6e899746ace3ade2ef8d08b083685f00d2d7b752e9d33deb91143deee0d13301fc894a01838c8c5b11ab8ac0713bbfbcdcbb24873a8e02b2872848195cd932da570bc45236410deebdcca7f95ac5d468a9242b89b98a676e177871a3d92fe21845f9a9aa9c3a0ba284f4b8135a8d15cdecdc40756f2d601c8db3a0721ed95b26c30be520ebe6f3063bc2d8fe456c70910fba7f0de240c312f17a085f80cf33e7675fb705e4e88b04399616d22862e8caf42e37e6e8486973fe4898abcc33aeea93f8e666f5931d849abad129c4d5b084ff26e7cf311a01994c5ada270217f3db586f8521ca083b5774e9e67a0b7e9 botan-2.4.0/src/tests/data/asn1_print/000077500000000000000000000000001322470703100175375ustar00rootroot00000000000000botan-2.4.0/src/tests/data/asn1_print/input1.der000066400000000000000000000000421322470703100214470ustar00rootroot000000000000000 string1ÿcÿÿÿbotan-2.4.0/src/tests/data/asn1_print/input2.der000066400000000000000000000000501322470703100214470ustar00rootroot000000000000000&public &00 +botan-2.4.0/src/tests/data/asn1_print/input3.der000066400000000000000000000006221322470703100214550ustar00rootroot00000000000000!‚N‚M_)BDECVCEPASS00001Iý ×Á4ª&Cf†*0%uÑׇ°ŸW—Ú‰õ~ÈÀÿ‚h¥æ,©Îl)˜¦ÁS QN*ذ*YÊÒŸCƒ%€ö<ÏäA8‡±©#iã>!5ÒfÛ³r8l@ „9 )­,~\ô4#²¨}ÆŒžLãLnýîÀ}XªV÷rÀro$ƸžNͬ$5Kž™Ê£öÓvÍ…×Á4ª&Cf†*0%uÐû˜Ñ¼KmÞ¼£¥§“Ÿ†9_ç´& ngã²Vuï»ÙKŸD±r(ñ ðxVÒ…†{rú`ä’ˆÀ¿aZ|>ÏÊ,S#Ç_ DECVCAEPASS00001L SÁ_%_$_78ix˜ ËÒIP­¾Îà:uf ¯½-wÏ¥Ñ(ÏÙ`›[ÐQ(ÔÒÊã7ôôt•íé, }êe}botan-2.4.0/src/tests/data/asn1_print/input4.der000066400000000000000000000003561322470703100214620ustar00rootroot00000000000000gë!šN\_)IG †9NNÅZ.e–ð0çú\Ô+¼H‘ ¨Áï|z€G¶Õ¨ƒÁÕâ¨ü|àŒ÷ð{>¸î>*ñƒkçÚw_ DE1"* #~ÿ ­_78W—¶dù°:ï2åíùÛ\IEÔIÕä®c±Ú¿óÔßѼƒ»X)Ö´ŽÔ‰ðübŒ‰ õBDE1"* #~ÿ ­00010_78B:“ùä 4ˆ¯oqhHS$º³¢a;ÖØ0G )6±ù0a  Kkªœ:r¦‘ý—]³Ïy7 botan-2.4.0/src/tests/data/asn1_print/input5.der000066400000000000000000000033671322470703100214700ustar00rootroot000000000000000‚ó0‚Û ë~›LL{_ö©Îù0  *†H†÷  0~1 0 UUS10U Symantec Corporation10U Symantec Trust Network1/0-U&Symantec Class 3 Secure Server CA - G40 170407000000Z 190408235959Z0€1 0 UUS10U Washington10U Redmond10U Microsoft Corporation10 U MSCOM10U www.microsoft.com0‚"0  *†H†÷ ‚0‚ ‚µªsç½ÿ ljc†¬¹ŒUÂ~ìßdS3Mfî$ÎcU’twb¬(F®òº­óÙà>@…B„o‚ô’çï„4®÷mµãéñzû\àNE•›wÌ›UžÅµ—Ÿ4]ñQ¬Ei&¤ŒÔOÈûÓèéZvÃ\ˆ-Èú•'Z ϙ @¹nUI|±ôj„&CÆAhߨ£Ä¡èßq S6:Úø+_bÉ¢ªîìdˆ •}H½³ý÷$â_gósÒì&·äº+`D*B2 ?ï–d ny\øÄþ²ŽË–‹»ƒ¶_–»Quh •1 åý€Z©'3&÷©è³70ëŽÝ£‚h0‚d0™U‘0Ž‚privacy.microsoft.com‚c.s-microsoft.com‚ microsoft.com‚i.s-microsoft.com‚staticview.microsoft.com‚www.microsoft.com‚wwwqa.microsoft.com0 U00Uÿ 0U%0++0aU Z0X0Vg 0L0#+https://d.symcb.com/cps0%+0 https://d.symcb.com/rpa0U#0€_`ÏaUß„CŠ`*²õzôCï0+U$0"0   †http://ss.symcb.com/ss.crl0W+K0I0+0†http://ss.symcd.com0&+0†http://ss.symcb.com/ss.crt0‚€ +Öy‚p‚ljvÝë+z O¦ ‹­hp~.ŽÕ\ˆ=ÄͶì¾Ì[Iã?0G0E , “©ž*R%¹RÔïN^±nbør§ªÔ*?ì#!É…Õ+é-¹·b¢uò§àô—qê Άt8XªLøÚEw¤¹ ´X‡»¢Ìgp <5˜ù߸ãwÍÈ Ü[Iã?pH0F!‹e€^±Ù{ìT+q£ÙQ‘š“Ÿ&6òû ¶‹Ld!é>ÆÛéË3ì5æHµ{ŽœŸÆ‰´¾£ß.’]†‰ÊWwîK½·uÎ`ºáBi«ážf£~_°r؃Ä{‰z¨ýË[IãA/H0F!Üœ‰#årÚuMðŽŽæK7aQ^G>/¸6GWÅnÖ!È$Á 8%j¾™ìz†*·>Þ¡ïyn¡yÁçUñüÅŸ0  *†H†÷  ‚F'Á•Š`z"o´'ž,ºŒ6=¦ôikˆg~ƒáèºWsh¢êºB\²éàeï-75<{Ó9Æ<²°DŸ ñ¿¼~ÁuÃ5Cz®Ñ  ¡[¶{5~ŽŸ}ÿ,=%¤gÑ(x€žGî¨w]òU•G(º¼^akU&.ÜI@¶è0gm†sÎʯ m“º`Š×÷m@e¨;¶é®Þ2¾Et!=G‡d¯4w;O¥T:£R>וÜüvبªê à²Y«Æ’J‚ÂñÕæ÷ñ‹ì›<áƒ9ú¥$&_16²Eå‹è6ïæ§VqñüÌo[ö¾®'þÑÜ27„botan-2.4.0/src/tests/data/asn1_print/output1.txt000066400000000000000000000006721322470703100217260ustar00rootroot00000000000000 d= 0, l= 32: SEQUENCE d= 1, l= 1: INTEGER 05 d= 1, l= 6: PRINTABLE STRING string d= 1, l= 6: SET d= 2, l= 1: BOOLEAN true d= 2, l= 1: INTEGER 63 d= 1, l= 5: OCTET STRING 0000000000 d= 1, l= 4: BIT STRING FFFFFF botan-2.4.0/src/tests/data/asn1_print/output2.txt000066400000000000000000000006501322470703100217230ustar00rootroot00000000000000 d= 0, l= 38: SEQUENCE d= 1, l= 1: INTEGER d= 1, l= 6: OCTET STRING public d= 1, l= 25: cons [0] context d= 2, l= 1: INTEGER 26 d= 2, l= 1: INTEGER d= 2, l= 1: INTEGER d= 2, l= 14: SEQUENCE d= 3, l= 12: SEQUENCE d= 4, l= 8: OBJECT 1.3.6.1.2.1.1.2.0 d= 4, l= 0: NULL botan-2.4.0/src/tests/data/asn1_print/output3.txt000066400000000000000000000035211322470703100217240ustar00rootroot00000000000000 d= 0, l= 397: cons [33] appl d= 1, l= 333: cons [78] appl d= 2, l= 1: [41] appl 5F290100 d= 2, l= 16: [2] appl 421044454356437F45504153533030303031 d= 2, l= 253: cons [73] appl d= 3, l= 10: OBJECT 0.4.0.127.0.7.2.2.2.2.2 d= 3, l= 28: [1] context 811CD7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF d= 3, l= 28: [2] context 821C68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43 d= 3, l= 28: [3] context 831C2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B d= 3, l= 57: [4] context 8439040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD d= 3, l= 28: [5] context 851CD7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F d= 3, l= 57: [6] context 8639045FE7B42614096E67E3B25675EFBBD94B9F1244B17228F109F07856D285867B1F72FA60E4929D88C0BF61035A7C3ECF17CA2C81532308C390 d= 3, l= 1: [7] context 870101 d= 2, l= 16: [32] appl 5F201044454356434145504153533030303031 d= 2, l= 14: cons [76] appl d= 3, l= 9: OBJECT 0.4.0.127.0.7.3.1.2.1 d= 3, l= 1: [19] appl 5301C1 d= 2, l= 6: [37] appl 5F2506000700080108 d= 2, l= 6: [36] appl 5F2406010000080108 d= 1, l= 56: [55] appl 5F37386978982008CBD24950ADBECEE03A1675660B7FAFBD2D77CF17A5D128CFD9609B5BD0518D28D4D212CAE337F4F47495EDE92C0D7D15EA657D botan-2.4.0/src/tests/data/asn1_print/output4.txt000066400000000000000000000017551322470703100217340ustar00rootroot00000000000000 d= 0, l= 235: cons [7] appl d= 1, l= 154: cons [33] appl d= 2, l= 92: cons [78] appl d= 3, l= 1: [41] appl 5F290100 d= 3, l= 71: cons [73] appl d= 4, l= 10: OBJECT 0.4.0.127.0.7.2.2.2.2.2 d= 4, l= 57: [6] context 8639044E4EC55A2E6596F030E7FA5CD42BBC034891A0A8C1EF7C1A007A8047B6D5A883C1D5E2A8FC7CE08CF7F07B063EB8EE3E2AF1836BE7DA1577 d= 3, l= 11: [32] appl 5F200B444531222A20237EFF20AD d= 2, l= 56: [55] appl 5F3738571A971D19B664F9B03AEF178D32E5EDF9DB5C4945D449D5E4AE63B102DABFF3D4DF00D1BC83BB582981D6B48ED41F89F0FC628C7F89A0F5 d= 1, l= 16: [2] appl 4210444531222A20237EFF20AD3030303130 d= 1, l= 56: [55] appl 5F3738423A93F9E40B0A3488AF6F716848531A24BAB3A2613BD6D830470D2936B1F93061A00A4B6BAA9C3A180272A60F91FD975DB3CF8D8179370C botan-2.4.0/src/tests/data/asn1_print/output5.txt000066400000000000000000000215721322470703100217340ustar00rootroot00000000000000 d= 0, l=1779: SEQUENCE d= 1, l=1499: SEQUENCE d= 2, l= 3: cons [0] context d= 3, l= 1: INTEGER 02 d= 2, l= 16: INTEGER 03EB7E1D9B4C4C7B145FF6A902CE81F9 d= 2, l= 13: SEQUENCE d= 3, l= 9: OBJECT RSA/EMSA3(SHA-256) [1.2.840.113549.1.1.11] d= 3, l= 0: NULL d= 2, l= 126: SEQUENCE d= 3, l= 11: SET d= 4, l= 9: SEQUENCE d= 5, l= 3: OBJECT X520.Country [2.5.4.6] d= 5, l= 2: PRINTABLE STRING US d= 3, l= 29: SET d= 4, l= 27: SEQUENCE d= 5, l= 3: OBJECT X520.Organization [2.5.4.10] d= 5, l= 20: PRINTABLE STRING Symantec Corporation d= 3, l= 31: SET d= 4, l= 29: SEQUENCE d= 5, l= 3: OBJECT X520.OrganizationalUnit [2.5.4.11] d= 5, l= 22: PRINTABLE STRING Symantec Trust Network d= 3, l= 47: SET d= 4, l= 45: SEQUENCE d= 5, l= 3: OBJECT X520.CommonName [2.5.4.3] d= 5, l= 38: PRINTABLE STRING Symantec Class 3 Secure Server CA - G4 d= 2, l= 30: SEQUENCE d= 3, l= 13: UTC TIME 2017/04/07 00:00:00 UTC d= 3, l= 13: UTC TIME 2019/04/08 23:59:59 UTC d= 2, l= 128: SEQUENCE d= 3, l= 11: SET d= 4, l= 9: SEQUENCE d= 5, l= 3: OBJECT X520.Country [2.5.4.6] d= 5, l= 2: PRINTABLE STRING US d= 3, l= 19: SET d= 4, l= 17: SEQUENCE d= 5, l= 3: OBJECT X520.State [2.5.4.8] d= 5, l= 10: UTF8 STRING Washington d= 3, l= 16: SET d= 4, l= 14: SEQUENCE d= 5, l= 3: OBJECT X520.Locality [2.5.4.7] d= 5, l= 7: UTF8 STRING Redmond d= 3, l= 30: SET d= 4, l= 28: SEQUENCE d= 5, l= 3: OBJECT X520.Organization [2.5.4.10] d= 5, l= 21: UTF8 STRING Microsoft Corporation d= 3, l= 14: SET d= 4, l= 12: SEQUENCE d= 5, l= 3: OBJECT X520.OrganizationalUnit [2.5.4.11] d= 5, l= 5: UTF8 STRING MSCOM d= 3, l= 26: SET d= 4, l= 24: SEQUENCE d= 5, l= 3: OBJECT X520.CommonName [2.5.4.3] d= 5, l= 17: UTF8 STRING www.microsoft.com d= 2, l= 290: SEQUENCE d= 3, l= 13: SEQUENCE d= 4, l= 9: OBJECT RSA [1.2.840.113549.1.1.1] d= 4, l= 0: NULL d= 3, l= 271: BIT STRING d= 4, l= 266: SEQUENCE d= 5, l= 257: INTEGER B5AA73E7BDFFA06C6A1D0F0E116386ACB98C55C27EEC1FDF0164539D337F4D66EE0824CE6355927411770262AC284619AE06F2BAADF3D9E03E40850F42846F821AF49219E7EF8434AEF76DB5E3E9F17AFB5CE04E45959B77CC9B55819EC501B5979F345DF10051AC456926A48CD44F0EC8FBD3E8E91D5A76C35C882DC8FA95275AC2150ACF990D4019B96E55497CB1F46A842643C64168DFD8A31AC4A1E808DF710C53363ADAF82B5F62C9A2AAEE1FEC64880D951E7D48BDB3FDF724E25F67F373D2EC1426B7E4BA2B60442A42320D3FEF96640B6E795CF8C4FEB28E1608CB968BBB83B65F96BB5175682095310CE5FD02805AA9273326F7A9E8B33730EB8EDD d= 5, l= 3: INTEGER 010001 d= 2, l= 872: cons [3] context d= 3, l= 868: SEQUENCE d= 4, l= 153: SEQUENCE d= 5, l= 3: OBJECT X509v3.SubjectAlternativeName [2.5.29.17] d= 5, l= 145: OCTET STRING d= 6, l= 142: SEQUENCE d= 7, l= 7: [2] context privacy.microsoft.com d= 7, l= 7: [2] context c.s-microsoft.com d= 7, l= 7: [2] context microsoft.com d= 7, l= 7: [2] context i.s-microsoft.com d= 7, l= 7: [2] context staticview.microsoft.com d= 7, l= 7: [2] context www.microsoft.com d= 7, l= 7: [2] context wwwqa.microsoft.com d= 4, l= 9: SEQUENCE d= 5, l= 3: OBJECT X509v3.BasicConstraints [2.5.29.19] d= 5, l= 2: OCTET STRING d= 6, l= 0: SEQUENCE d= 4, l= 14: SEQUENCE d= 5, l= 3: OBJECT X509v3.KeyUsage [2.5.29.15] d= 5, l= 1: BOOLEAN true d= 5, l= 4: OCTET STRING d= 6, l= 2: BIT STRING A0 d= 4, l= 29: SEQUENCE d= 5, l= 3: OBJECT X509v3.ExtendedKeyUsage [2.5.29.37] d= 5, l= 22: OCTET STRING d= 6, l= 20: SEQUENCE d= 7, l= 8: OBJECT PKIX.ServerAuth [1.3.6.1.5.5.7.3.1] d= 7, l= 8: OBJECT PKIX.ClientAuth [1.3.6.1.5.5.7.3.2] d= 4, l= 97: SEQUENCE d= 5, l= 3: OBJECT X509v3.CertificatePolicies [2.5.29.32] d= 5, l= 90: OCTET STRING d= 6, l= 88: SEQUENCE d= 7, l= 86: SEQUENCE d= 8, l= 6: OBJECT 2.23.140.1.2.2 d= 8, l= 76: SEQUENCE d= 9, l= 35: SEQUENCE d=10, l= 8: OBJECT 1.3.6.1.5.5.7.2.1 d=10, l= 23: IA5 STRING https://d.symcb.com/cps d= 9, l= 37: SEQUENCE d=10, l= 8: OBJECT 1.3.6.1.5.5.7.2.2 d=10, l= 25: SEQUENCE d=11, l= 23: UTF8 STRING https://d.symcb.com/rpa d= 4, l= 31: SEQUENCE d= 5, l= 3: OBJECT X509v3.AuthorityKeyIdentifier [2.5.29.35] d= 5, l= 24: OCTET STRING d= 6, l= 22: SEQUENCE d= 7, l= 20: [0] context 80145F60CF619055DF8443148A602AB2F57AF44318EF d= 4, l= 43: SEQUENCE d= 5, l= 3: OBJECT X509v3.CRLDistributionPoints [2.5.29.31] d= 5, l= 36: OCTET STRING d= 6, l= 34: SEQUENCE d= 7, l= 32: SEQUENCE d= 8, l= 30: cons [0] context d= 9, l= 28: cons [0] context d=10, l= 10: [6] context http://ss.symcb.com/ss.crl d= 4, l= 87: SEQUENCE d= 5, l= 8: OBJECT PKIX.AuthorityInformationAccess [1.3.6.1.5.5.7.1.1] d= 5, l= 75: OCTET STRING d= 6, l= 73: SEQUENCE d= 7, l= 31: SEQUENCE d= 8, l= 8: OBJECT PKIX.OCSP [1.3.6.1.5.5.7.48.1] d= 8, l= 8: [6] context http://ss.symcd.com d= 7, l= 38: SEQUENCE d= 8, l= 8: OBJECT PKIX.CertificateAuthorityIssuers [1.3.6.1.5.5.7.48.2] d= 8, l= 8: [6] context http://ss.symcb.com/ss.crt d= 4, l= 384: SEQUENCE d= 5, l= 10: OBJECT 1.3.6.1.4.1.11129.2.4.2 d= 5, l= 368: OCTET STRING d= 6, l= 364: OCTET STRING 016A007600DDEB1D2B7A0D4FA6208B81AD8168707E2E8E9D01D55C888D3D11C4CDB6ECBECC0000015B49E33F30000004030047304502202C120993A99E062A5225B952D481EF4E5EB16E03621BF872A7AAD42A3F16EC23022100C985D52BE92DB9B762A275F2A7E0F49771EA0ACE86743858AA4CF80290DA8145007700A4B90990B418581487BB13A2CC67700A3C359804F91BDFB8E377CD0EC80DDC100000015B49E33F7000000403004830460221008B6517805EB1D97BEC542B71A306D951919A939F2636F2FB040E0DB6028B4C64022100E93EC6DBE9CB33EC35E648B57B8E9C9FC689B41E7F16BEA3DF2E925D8689CA57007700EE4BBDB775CE60BAE142691FABE19E66A30F7E5FB072D88300C47B897AA8FDCB0000015B49E3412F0000040300483046022100DC119C89231AE57213DA754DF08E0E8EE64B3761515E473E2FB8364757C56ED6022100C824C1810D0338256ABE99EC7A862AB73EDEA1EF796EA10F79C1E755F1FCC59F d= 1, l= 13: SEQUENCE d= 2, l= 9: OBJECT RSA/EMSA3(SHA-256) [1.2.840.113549.1.1.11] d= 2, l= 0: NULL d= 1, l= 257: BIT STRING 462713C195078A607A226FB4279E2CBA8C363DA6F4696B88677E83E1E8BA5773681BA2EABA141A425CB2E9E065EF2D1037353C7BD31F39C63CB2B0449F0AF1BFBC7E90C175C335437AAED10AA0A15BB67B357E8E9F7DFF2C3D25A467D12878809E114717EEA877175DF255954728BABC5E616B55262EDC494019B6E8301D8D8D676D86731FCECAAF040C6D8D93BA608AD7F76D4065A83BB6E9AEDE3208BE4574213D478764AF0634773B4FA5543AA3523ED795DC1AFC76D8A8AAEA09E0B259ABC6924A82C2F1D5E6F7F18B131EEC9B163CE11A8339FAA52426105F053136B245E51B8BE836EFE6A75671F1FC02CC6F5BF6BE19AE00171E27FE157FD1DC323784 botan-2.4.0/src/tests/data/base64.vec000066400000000000000000000022651322470703100172510ustar00rootroot00000000000000 [valid] # empty string Binary = Base64 = Binary = 66 Base64 = Zg== Binary = 666F Base64 = Zm8= Binary = 666F6F Base64 = Zm9v Binary = 68656C6C6F20776F726C64 Base64 = aGVsbG8gd29ybGQ= Binary = 68656C6C6F20776F726C6421 Base64 = aGVsbG8gd29ybGQh Binary = 48656C6C6F2C20776F726C642E Base64 = SGVsbG8sIHdvcmxkLg== Binary = 546865203132206368617273 Base64 = VGhlIDEyIGNoYXJz Binary = 5468652031332063686172732E Base64 = VGhlIDEzIGNoYXJzLg== Binary = 5468652031342063686172732E2E Base64 = VGhlIDE0IGNoYXJzLi4= Binary = 5468652031352063686172732E2E2E Base64 = VGhlIDE1IGNoYXJzLi4u Binary = 416E205554462D382075756D6C3A20C3BC Base64 = QW4gVVRGLTggdXVtbDogw7w= Binary = 5765697264204765726D616E20322062797465207468696E673A20C39F2E Base64 = V2VpcmQgR2VybWFuIDIgYnl0ZSB0aGluZzogw58u Binary = 9B Base64 = mw== Binary = 1C60 Base64 = HGA= Binary = 8134BD Base64 = gTS9 Binary = 5E6CFFDE Base64 = Xmz/3g== Binary = b2cdf0dc7f Base64 = ss3w3H8= Binary = fc562ddad40e Base64 = /FYt2tQO Binary = 29b2322e8841e8 Base64 = KbIyLohB6A== Binary = 0f0fced9497aaf92 Base64 = Dw/O2Ul6r5I= Binary = 270fb18982800da640 Base64 = Jw+xiYKADaZA [invalid] Base64 = ZOOL!isnotvalidbase64 Base64 = Neitheris:this? botan-2.4.0/src/tests/data/block/000077500000000000000000000000001322470703100165535ustar00rootroot00000000000000botan-2.4.0/src/tests/data/block/aes.vec000066400000000000000000005450721322470703100200370ustar00rootroot00000000000000# Test vectors from NIST CAVP AESAVS # http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf #test cpuid aesni ssse3 [AES-128] Key = 000102030405060708090A0B0C0D0E0F In = 00112233445566778899AABBCCDDEEFF Out = 69C4E0D86A7B0430D8CDB78070B4C55A Key = 00010203050607080A0B0C0D0F101112 In = 506812A45F08C889B97F5980038B8359 Out = D8F532538289EF7D06B506A4FD5BE9C9 Key = 14151617191A1B1C1E1F202123242526 In = 5C6D71CA30DE8B8B00549984D2EC7D4B Out = 59AB30F4D4EE6E4FF9907EF65B1FB68C Key = 28292A2B2D2E2F30323334353738393A In = 53F3F4C64F8616E4E7C56199F48F21F6 Out = BF1ED2FCB2AF3FD41443B56D85025CB1 Key = 3C3D3E3F41424344464748494B4C4D4E In = A1EB65A3487165FB0F1C27FF9959F703 Out = 7316632D5C32233EDCB0780560EAE8B2 Key = 50515253555657585A5B5C5D5F606162 In = 3553ECF0B1739558B08E350A98A39BFA Out = 408C073E3E2538072B72625E68B8364B Key = 64656667696A6B6C6E6F707173747576 In = 67429969490B9711AE2B01DC497AFDE8 Out = E1F94DFA776597BEACA262F2F6366FEA Key = 78797A7B7D7E7F80828384858788898A In = 93385C1F2AEC8BED192F5A8E161DD508 Out = F29E986C6A1C27D7B29FFD7EE92B75F1 Key = 8C8D8E8F91929394969798999B9C9D9E In = B5BF946BE19BEB8DB3983B5F4C6E8DDB Out = 131C886A57F8C2E713ABA6955E2B55B5 Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 In = 41321EE10E21BD907227C4450FF42324 Out = D2AB7662DF9B8C740210E5EEB61C199D Key = B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = 00A82F59C91C8486D12C0A80124F6089 Out = 14C10554B2859C484CAB5869BBE7C470 Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA In = 7CE0FD076754691B4BBD9FAF8A1372FE Out = DB4D498F0A49CF55445D502C1F9AB3B5 Key = DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = 23605A8243D07764541BC5AD355B3129 Out = 6D96FEF7D66590A77A77BB2056667F7F Key = F0F1F2F3F5F6F7F8FAFBFCFDFE010002 In = 12A8CFA23EA764FD876232B4E842BC44 Out = 316FB68EDBA736C53E78477BF913725C Key = 04050607090A0B0C0E0F101113141516 In = BCAF32415E8308B3723E5FDD853CCC80 Out = 6936F2B93AF8397FD3A771FC011C8C37 Key = 2C2D2E2F31323334363738393B3C3D3E In = 89AFAE685D801AD747ACE91FC49ADDE0 Out = F3F92F7A9C59179C1FCC2C2BA0B082CD Key = 40414243454647484A4B4C4D4F505152 In = F521D07B484357C4A69E76124A634216 Out = 6A95EA659EE3889158E7A9152FF04EBC Key = 54555657595A5B5C5E5F606163646566 In = 3E23B3BC065BCC152407E23896D77783 Out = 1959338344E945670678A5D432C90B93 Key = 68696A6B6D6E6F70727374757778797A In = 79F0FBA002BE1744670E7E99290D8F52 Out = E49BDDD2369B83EE66E6C75A1161B394 Key = 7C7D7E7F81828384868788898B8C8D8E In = DA23FE9D5BD63E1D72E3DAFBE21A6C2A Out = D3388F19057FF704B70784164A74867D Key = A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = E3F5698BA90B6A022EFD7DB2C7E6C823 Out = 23AA03E2D5E4CD24F3217E596480D1E1 Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 In = BDC2691D4F1B73D2700679C3BCBF9C6E Out = C84113D68B666AB2A50A8BDB222E91B9 Key = 08090A0B0D0E0F10121314151718191A In = BA74E02093217EE1BA1B42BD5624349A Out = AC02403981CD4340B507963DB65CB7B6 Key = 6C6D6E6F71727374767778797B7C7D7E In = B5C593B5851C57FBF8B3F57715E8F680 Out = 8D1299236223359474011F6BF5088414 Key = 80818283858687888A8B8C8D8F909192 In = 3DA9BD9CEC072381788F9387C3BBF4EE Out = 5A1D6AB8605505F7977E55B9A54D9B90 Key = 94959697999A9B9C9E9FA0A1A3A4A5A6 In = 4197F3051121702AB65D316B3C637374 Out = 72E9C2D519CF555E4208805AABE3B258 Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA In = 9F46C62EC4F6EE3F6E8C62554BC48AB7 Out = A8F3E81C4A23A39EF4D745DFFE026E80 Key = BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE In = 0220673FE9E699A4EBC8E0DBEB6979C8 Out = 546F646449D31458F9EB4EF5483AEE6C Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 In = B2B99171337DED9BC8C2C23FF6F18867 Out = 4DBE4BC84AC797C0EE4EFB7F1A07401C Key = E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = A7FACF4E301E984E5EFEEFD645B23505 Out = 25E10BFB411BBD4D625AC8795C8CA3B3 Key = F8F9FAFBFDFEFE00020304050708090A In = F7C762E4A9819160FD7ACFB6C4EEDCDD Out = 315637405054EC803614E43DEF177579 Key = 0C0D0E0F11121314161718191B1C1D1E In = 9B64FC21EA08709F4915436FAA70F1BE Out = 60C5BC8A1410247295C6386C59E572A8 Key = 20212223252627282A2B2C2D2F303132 In = 52AF2C3DE07EE6777F55A4ABFC100B3F Out = 01366FC8CA52DFE055D6A00A76471BA6 Key = 34353637393A3B3C3E3F404143444546 In = 2FCA001224386C57AA3F968CBE2C816F Out = ECC46595516EC612449C3F581E7D42FF Key = 48494A4B4D4E4F50525354555758595A In = 4149C73658A4A9C564342755EE2C132F Out = 6B7FFE4C602A154B06EE9C7DAB5331C9 Key = 5C5D5E5F61626364666768696B6C6D6E In = AF60005A00A1772F7C07A48A923C23D2 Out = 7DA234C14039A240DD02DD0FBF84EB67 Key = 70717273757677787A7B7C7D7F808182 In = 6FCCBC28363759914B6F0280AFAF20C6 Out = C7DC217D9E3604FFE7E91F080ECD5A3A Key = 84858687898A8B8C8E8F909193949596 In = 7D82A43DDF4FEFA2FC5947499884D386 Out = 37785901863F5C81260EA41E7580CDA5 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AA In = 5D5A990EAAB9093AFE4CE254DFA49EF9 Out = A07B9338E92ED105E6AD720FCCCE9FE4 Key = ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = 4CD1E2FD3F4434B553AAE453F0ED1A02 Out = AE0FB9722418CC21A7DA816BBC61322C Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 In = 5A2C9A9641D4299125FA1B9363104B5E Out = C826A193080FF91FFB21F71D3373C877 Key = D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = B517FE34C0FA217D341740BFD4FE8DD4 Out = 1181B11B0E494E8D8B0AA6B1D5AC2C48 Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA In = 014BAF2278A69D331D5180103643E99A Out = 6743C3D1519AB4F2CD9A78AB09A511BD Key = FCFDFEFF01020304060708090B0C0D0E In = B529BD8164F20D0AA443D4932116841C Out = DC55C076D52BACDF2EEFD952946A439D Key = 10111213151617181A1B1C1D1F202122 In = 2E596DCBB2F33D4216A1176D5BD1E456 Out = 711B17B590FFC72B5C8E342B601E8003 Key = 24252627292A2B2C2E2F303133343536 In = 7274A1EA2B7EE2424E9A0E4673689143 Out = 19983BB0950783A537E1339F4AA21C75 Key = 38393A3B3D3E3F40424344454748494A In = AE20020BD4F13E9D90140BEE3B5D26AF Out = 3BA7762E15554169C0F4FA39164C410C Key = 4C4D4E4F51525354565758595B5C5D5E In = BAAC065DA7AC26E855E79C8849D75A02 Out = A0564C41245AFCA7AF8AA2E0E588EA89 Key = 60616263656667686A6B6C6D6F707172 In = 7C917D8D1D45FAB9E2540E28832540CC Out = 5E36A42A2E099F54AE85ECD92E2381ED Key = 74757677797A7B7C7E7F808183848586 In = BDE6F89E16DAADB0E847A2A614566A91 Out = 770036F878CD0F6CA2268172F106F2FE Key = 88898A8B8D8E8F90929394959798999A In = C9DE163725F1F5BE44EBB1DB51D07FBC Out = 7E4E03908B716116443CCF7C94E7C259 Key = 9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = 3AF57A58F0C07DFFA669572B521E2B92 Out = 482735A48C30613A242DD494C7F9185D Key = B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 In = 3D5EBAC306DDE4604F1B4FBBBFCDAE55 Out = B4C0F6C9D4D7079ADDF9369FC081061D Key = C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = C2DFA91BCEB76A1183C995020AC0B556 Out = D5810FE0509AC53EDCD74F89962E6270 Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA In = C70F54305885E9A0746D01EC56C8596B Out = 03F17A16B3F91848269ECDD38EBB2165 Key = ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = C4F81B610E98012CE000182050C0C2B2 Out = DA1248C3180348BAD4A93B4D9856C9DF Key = 00010203050607080A0B0C0D0F101112 In = EAAB86B1D02A95D7404EFF67489F97D4 Out = 3D10D7B63F3452C06CDF6CCE18BE0C2C Key = 14151617191A1B1C1E1F202123242526 In = 7C55BDB40B88870B52BEC3738DE82886 Out = 4AB823E7477DFDDC0E6789018FCB6258 Key = 28292A2B2D2E2F30323334353738393A In = BA6EAA88371FF0A3BD875E3F2A975CE0 Out = E6478BA56A77E70CFDAA5C843ABDE30E Key = 3C3D3E3F41424344464748494B4C4D4E In = 08059130C4C24BD30CF0575E4E0373DC Out = 1673064895FBEAF7F09C5429FF75772D Key = 50515253555657585A5B5C5D5F606162 In = 9A8EAB004EF53093DFCF96F57E7EDA82 Out = 4488033AE9F2EFD0CA9383BFCA1A94E9 Key = 64656667696A6B6C6E6F707173747576 In = 0745B589E2400C25F117B1D796C28129 Out = 978F3B8C8F9D6F46626CAC3C0BCB9217 Key = 78797A7B7D7E7F80828384858788898A In = 2F1777781216CEC3F044F134B1B92BBE Out = E08C8A7E582E15E5527F1D9E2EECB236 Key = 8C8D8E8F91929394969798999B9C9D9E In = 353A779FFC541B3A3805D90CE17580FC Out = CEC155B76AC5FFDA4CF4F9CA91E49A7A Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 In = 1A1EAE4415CEFCF08C4AC1C8F68BEA8F Out = D5AC7165763225DD2A38CDC6862C29AD Key = B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = E6E7E4E5B0B3B2B5D4D5AAAB16111013 Out = 03680FE19F7CE7275452020BE70E8204 Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA In = F8F9FAFBFBF8F9E677767170EFE0E1E2 Out = 461DF740C9781C388E94BB861CEB54F6 Key = DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = 63626160A1A2A3A445444B4A75727370 Out = 451BD60367F96483042742219786A074 Key = F0F1F2F3F5F6F7F8FAFBFCFDFE010002 In = 717073720605040B2D2C2B2A05FAFBF9 Out = E4DFA42671A02E57EF173B85C0EA9F2B Key = 04050607090A0B0C0E0F101113141516 In = 78797A7BEAE9E8EF3736292891969794 Out = ED11B89E76274282227D854700A78B9E Key = 18191A1B1D1E1F20222324252728292A In = 838281803231300FDDDCDBDAA0AFAEAD Out = 433946EAA51EA47AF33895F2B90B3B75 Key = 2C2D2E2F31323334363738393B3C3D3E In = 18191A1BBFBCBDBA75747B7A7F78797A Out = 6BC6D616A5D7D0284A5910AB35022528 Key = 40414243454647484A4B4C4D4F505152 In = 848586879B989996A3A2A5A4849B9A99 Out = D2A920ECFE919D354B5F49EAE9719C98 Key = 54555657595A5B5C5E5F606163646566 In = 0001020322212027CACBF4F551565754 Out = 3A061B17F6A92885EFBD0676985B373D Key = 68696A6B6D6E6F70727374757778797A In = CECFCCCDAFACADB2515057564A454447 Out = FADEEC16E33EA2F4688499D157E20D8F Key = 7C7D7E7F81828384868788898B8C8D8E In = 92939091CDCECFC813121D1C80878685 Out = 5CDEFEDE59601AA3C3CDA36FA6B1FA13 Key = 90919293959697989A9B9C9D9FA0A1A2 In = D2D3D0D16F6C6D6259585F5ED1EEEFEC Out = 9574B00039844D92EBBA7EE8719265F8 Key = A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = ACADAEAF878485820F0E1110D5D2D3D0 Out = 9A9CF33758671787E5006928188643FA Key = B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA In = 9091929364676619E6E7E0E1757A7B78 Out = 2CDDD634C846BA66BB46CBFEA4A674F9 Key = CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE In = BABBB8B98A89888F74757A7B92959497 Out = D28BAE029393C3E7E26E9FAFBBB4B98F Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 In = 8D8C8F8E6E6D6C633B3A3D3CCAD5D4D7 Out = EC27529B1BEE0A9AB6A0D73EBC82E9B7 Key = F4F5F6F7F9FAFBFCFEFE010103040506 In = 86878485010203040808F7F767606162 Out = 3CB25C09472AFF6EE7E2B47CCD7CCB17 Key = 08090A0B0D0E0F10121314151718191A In = 8E8F8C8D656667788A8B8C8D010E0F0C Out = DEE33103A7283370D725E44CA38F8FE5 Key = 1C1D1E1F21222324262728292B2C2D2E In = C8C9CACB858687807A7B7475E7E0E1E2 Out = 27F9BCD1AAC64BFFC11E7815702C1A69 Key = 30313233353637383A3B3C3D3F404142 In = 6D6C6F6E5053525D8C8D8A8BADD2D3D0 Out = 5DF534FFAD4ED0749A9988E9849D0021 Key = 44454647494A4B4C4E4F505153545556 In = 28292A2B393A3B3C0607181903040506 Out = A48BEE75DB04FB60CA2B80F752A8421B Key = 58595A5B5D5E5F60626364656768696A In = A5A4A7A6B0B3B28DDBDADDDCBDB2B3B0 Out = 024C8CF70BC86EE5CE03678CB7AF45F9 Key = 6C6D6E6F71727374767778797B7C7D7E In = 323330316467666130313E3F2C2B2A29 Out = 3C19AC0F8A3A3862CE577831301E166B Key = 80818283858687888A8B8C8D8F909192 In = 27262524080B0A05171611100B141516 Out = C5E355B796A57421D59CA6BE82E73BCA Key = 94959697999A9B9C9E9FA0A1A3A4A5A6 In = 040506074142434435340B0AA3A4A5A6 Out = D94033276417ABFB05A69D15B6E386E2 Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA In = 242526271112130C61606766BDB2B3B0 Out = 24B36559EA3A9B9B958FE6DA3E5B8D85 Key = BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE In = 4B4A4948252627209E9F9091CEC9C8CB Out = 20FD4FEAA0E8BF0CCE7861D74EF4CB72 Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 In = 68696A6B6665646B9F9E9998D9E6E7E4 Out = 350E20D5174277B9EC314C501570A11D Key = E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = 34353637C5C6C7C0F0F1EEEF7C7B7A79 Out = 87A29D61B7C604D238FE73045A7EFD57 Key = F8F9FAFBFDFEFE00020304050708090A In = 32333031C2C1C13F0D0C0B0A050A0B08 Out = 2C3164C1CC7D0064816BDC0FAA362C52 Key = 0C0D0E0F11121314161718191B1C1D1E In = CDCCCFCEBEBDBCBBABAAA5A4181F1E1D Out = 195FE5E8A05A2ED594F6E4400EEE10B3 Key = 20212223252627282A2B2C2D2F303132 In = 212023223635343BA0A1A6A7445B5A59 Out = E4663DF19B9A21A5A284C2BD7F905025 Key = 34353637393A3B3C3E3F404143444546 In = 0E0F0C0DA8ABAAAD2F2E515002050407 Out = 21B88714CFB4E2A933BD281A2C4743FD Key = 48494A4B4D4E4F50525354555758595A In = 070605042A2928378E8F8889BDB2B3B0 Out = CBFC3980D704FD0FC54378AB84E17870 Key = 5C5D5E5F61626364666768696B6C6D6E In = CBCAC9C893909196A9A8A7A6A5A2A3A0 Out = BC5144BAA48BDEB8B63E22E03DA418EF Key = 70717273757677787A7B7C7D7F808182 In = 80818283C1C2C3CC9C9D9A9B0CF3F2F1 Out = 5A1DBAEF1EE2984B8395DA3BDFFA3CCC Key = 84858687898A8B8C8E8F909193949596 In = 1213101125262720FAFBE4E5B1B6B7B4 Out = F0B11CD0729DFCC80CEC903D97159574 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AA In = 7F7E7D7C3033320D97969190222D2C2F Out = 9F95314ACFDDC6D1914B7F19A9CC8209 Key = ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = 4E4F4C4D484B4A4D81808F8E53545556 Out = 595736F6F0F70914A94E9E007F022519 Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 In = DCDDDEDFB0B3B2BD15141312A1BEBFBC Out = 1F19F57892CAE586FCDFB4C694DEB183 Key = D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = 93929190282B2A2DC4C5FAFB92959497 Out = 540700EE1F6F3DAB0B3EDDF6CAEE1EF5 Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA In = F5F4F7F6C4C7C6D9373631307E717073 Out = 14A342A91019A331687A2254E6626CA2 Key = FCFDFEFF01020304060708090B0C0D0E In = 93929190B6B5B4B364656A6B05020300 Out = 7B25F3C3B2EEA18D743EF283140F29FF Key = 10111213151617181A1B1C1D1F202122 In = BABBB8B90D0E0F00A4A5A2A3043B3A39 Out = 46C2587D66E5E6FA7F7CA6411AD28047 Key = 24252627292A2B2C2E2F303133343536 In = D8D9DADB7F7C7D7A10110E0F787F7E7D Out = 09470E72229D954ED5EE73886DFEEBA9 Key = 38393A3B3D3E3F40424344454748494A In = FEFFFCFDEFECED923B3A3D3C6768696A Out = D77C03DE92D4D0D79EF8D4824EF365EB Key = 4C4D4E4F51525354565758595B5C5D5E In = D6D7D4D58A89888F96979899A5A2A3A0 Out = 1D190219F290E0F1715D152D41A23593 Key = 60616263656667686A6B6C6D6F707172 In = 18191A1BA8ABAAA5303136379B848586 Out = A2CD332CE3A0818769616292E87F757B Key = 74757677797A7B7C7E7F808183848586 In = 6B6A6968A4A7A6A1D6D72829B0B7B6B5 Out = D54AFA6CE60FBF9341A3690E21385102 Key = 88898A8B8D8E8F90929394959798999A In = 000102038A89889755545352A6A9A8AB Out = 06E5C364DED628A3F5E05E613E356F46 Key = 9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = 2D2C2F2EB3B0B1B6B6B7B8B9F2F5F4F7 Out = EAE63C0E62556DAC85D221099896355A Key = B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 In = 979695943536373856575051E09F9E9D Out = 1FED060E2C6FC93EE764403A889985A2 Key = C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = A4A5A6A7989B9A9DB1B0AFAE7A7D7C7F Out = C25235C1A30FDEC1C7CB5C5737B2A588 Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA In = C1C0C3C2686B6A55A8A9AEAFEAE5E4E7 Out = 796DBEF95147D4D30873AD8B7B92EFC0 Key = ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = C1C0C3C2141716118C8D828364636261 Out = CBCF0FB34D98D0BD5C22CE37211A46BF Key = 00010203050607080A0B0C0D0F101112 In = 93929190CCCFCEC196979091E0FFFEFD Out = 94B44DA6466126CAFA7C7FD09063FC24 Key = 14151617191A1B1C1E1F202123242526 In = B4B5B6B7F9FAFBFC25241B1A6E69686B Out = D78C5B5EBF9B4DBDA6AE506C5074C8FE Key = 28292A2B2D2E2F30323334353738393A In = 868784850704051AC7C6C1C08788898A Out = 6C27444C27204B043812CF8CF95F9769 Key = 3C3D3E3F41424344464748494B4C4D4E In = F4F5F6F7AAA9A8AFFDFCF3F277707172 Out = BE94524EE5A2AA50BBA8B75F4C0AEBCF Key = 50515253555657585A5B5C5D5F606162 In = D3D2D1D00605040BC3C2C5C43E010003 Out = A0AEAAE91BA9F31F51AEB3588CF3A39E Key = 64656667696A6B6C6E6F707173747576 In = 73727170424140476A6B74750D0A0B08 Out = 275297779C28266EF9FE4C6A13C08488 Key = 78797A7B7D7E7F80828384858788898A In = C2C3C0C10A0908F754555253A1AEAFAC Out = 86523D92BB8672CB01CF4A77FD725882 Key = 8C8D8E8F91929394969798999B9C9D9E In = 6D6C6F6EF8FBFAFD82838C8DF8FFFEFD Out = 4B8327640E9F33322A04DD96FCBF9A36 Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 In = F5F4F7F684878689A6A7A0A1D2CDCCCF Out = CE52AF650D088CA559425223F4D32694 Key = 80000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0EDD33D3C621E546455BD8BA1418BEC8 Key = 40000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C0CC0C5DA5BD63ACD44A80774FAD5222 Key = 20000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2F0B4B71BC77851B9CA56D42EB8FF080 Key = 10000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6B1E2FFFE8A114009D8FE22F6DB5F876 Key = 08000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9AA042C315F94CBB97B62202F83358F5 Key = 04000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DBE01DE67E346A800C4C4B4880311DE4 Key = 02000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C117D2238D53836ACD92DDCDB85D6A21 Key = 01000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DC0ED85DF9611ABB7249CDD168C5467E Key = 00800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 807D678FFF1F56FA92DE3381904842F2 Key = 00400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0E53B3FCAD8E4B130EF73AEB957FB402 Key = 00200000000000000000000000000000 In = 00000000000000000000000000000000 Out = 969FFD3B7C35439417E7BDE923035D65 Key = 00100000000000000000000000000000 In = 00000000000000000000000000000000 Out = A99B512C19CA56070491166A1503BF15 Key = 00080000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6E9985252126EE344D26AE369D2327E3 Key = 00040000000000000000000000000000 In = 00000000000000000000000000000000 Out = B85F4809F904C275491FCDCD1610387E Key = 00020000000000000000000000000000 In = 00000000000000000000000000000000 Out = ED365B8D7D20C1F5D53FB94DD211DF7B Key = 00010000000000000000000000000000 In = 00000000000000000000000000000000 Out = B3A575E86A8DB4A7135D604C43304896 Key = 00008000000000000000000000000000 In = 00000000000000000000000000000000 Out = 89704BCB8E69F846259EB0ACCBC7F8A2 Key = 00004000000000000000000000000000 In = 00000000000000000000000000000000 Out = C56EE7C92197861F10D7A92B90882055 Key = 00002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 92F296F6846E0EAF9422A5A24A08B069 Key = 00001000000000000000000000000000 In = 00000000000000000000000000000000 Out = E67E32BB8F11DEB8699318BEE9E91A60 Key = 00000800000000000000000000000000 In = 00000000000000000000000000000000 Out = B08EEF85EAF626DD91B65C4C3A97D92B Key = 00000400000000000000000000000000 In = 00000000000000000000000000000000 Out = 661083A6ADDCE79BB4E0859AB5538013 Key = 00000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 55DFE2941E0EB10AFC0B333BD34DE1FE Key = 00000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 6BFE5945E715C9662609770F8846087A Key = 00000080000000000000000000000000 In = 00000000000000000000000000000000 Out = 79848E9C30C2F8CDA8B325F7FED2B139 Key = 00000040000000000000000000000000 In = 00000000000000000000000000000000 Out = 7A713A53B99FEF34AC04DEEF80965BD0 Key = 00000020000000000000000000000000 In = 00000000000000000000000000000000 Out = 18144A2B46620D32C3C32CE52D49257F Key = 00000010000000000000000000000000 In = 00000000000000000000000000000000 Out = 872E827C70887C80749F7B8BB1847C7E Key = 00000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 6B86C6A4FE6A60C59B1A3102F8DE49F3 Key = 00000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 9848BB3DFDF6F532F094679A4C231A20 Key = 00000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 925AD528E852E329B2091CD3F1C2BCEE Key = 00000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 80DF436544B0DD596722E46792A40CD8 Key = 00000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 525DAF18F93E83E1E74BBBDDE4263BBA Key = 00000000400000000000000000000000 In = 00000000000000000000000000000000 Out = F65C9D2EE485D24701FFA3313B9D5BE6 Key = 00000000200000000000000000000000 In = 00000000000000000000000000000000 Out = E4FC8D8BCA06425BDF94AFA40FCC14BA Key = 00000000100000000000000000000000 In = 00000000000000000000000000000000 Out = A53F0A5CA1E4E6440BB975FF320DE6F8 Key = 00000000080000000000000000000000 In = 00000000000000000000000000000000 Out = D55313B9394080462E87E02899B553F0 Key = 00000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 34A71D761F71BCD344384C7F97D27906 Key = 00000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 233F3D819599612EBC89580245C996A8 Key = 00000000010000000000000000000000 In = 00000000000000000000000000000000 Out = B4F1374E5268DBCB676E447529E53F89 Key = 00000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 0816BD27861D2BA891D1044E39951E96 Key = 00000000004000000000000000000000 In = 00000000000000000000000000000000 Out = F3BE9EA3F10C73CA64FDE5DB13A951D1 Key = 00000000002000000000000000000000 In = 00000000000000000000000000000000 Out = 2448086A8106FBD03048DDF857D3F1C8 Key = 00000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 670756E65BEC8B68F03D77CDCDCE7B91 Key = 00000000000800000000000000000000 In = 00000000000000000000000000000000 Out = EF968CF0D36FD6C6EFFD225F6FB44CA9 Key = 00000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 2E8767157922E3826DDCEC1B0CC1E105 Key = 00000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 78CE7EEC670E45A967BAB17E26A1AD36 Key = 00000000000100000000000000000000 In = 00000000000000000000000000000000 Out = 3C5CEE825655F098F6E81A2F417DA3FB Key = 00000000000080000000000000000000 In = 00000000000000000000000000000000 Out = 67BFDB431DCE1292200BC6F5207ADB12 Key = 00000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 7540FD38E447C0779228548747843A6F Key = 00000000000020000000000000000000 In = 00000000000000000000000000000000 Out = B85E513301F8A936EA9EC8A21A85B5E6 Key = 00000000000010000000000000000000 In = 00000000000000000000000000000000 Out = 04C67DBF16C11427D507A455DE2C9BC5 Key = 00000000000008000000000000000000 In = 00000000000000000000000000000000 Out = 03F75EB8959E55079CFFB4FF149A37B6 Key = 00000000000004000000000000000000 In = 00000000000000000000000000000000 Out = 74550287F666C63BB9BC7838433434B0 Key = 00000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 7D537200195EBC3AEFD1EAAB1C385221 Key = 00000000000001000000000000000000 In = 00000000000000000000000000000000 Out = CE24E4D40C68A82B535CBD3C8E21652A Key = 00000000000000800000000000000000 In = 00000000000000000000000000000000 Out = AB20072405AA8FC40265C6F1F3DC8BC0 Key = 00000000000000400000000000000000 In = 00000000000000000000000000000000 Out = 6CFD2CF688F566B093F67B9B3839E80A Key = 00000000000000200000000000000000 In = 00000000000000000000000000000000 Out = BD95977E6B7239D407A012C5544BF584 Key = 00000000000000100000000000000000 In = 00000000000000000000000000000000 Out = DF9C0130AC77E7C72C997F587B46DBE0 Key = 00000000000000080000000000000000 In = 00000000000000000000000000000000 Out = E7F1B82CADC53A648798945B34EFEFF2 Key = 00000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 932C6DBF69255CF13EDCDB72233ACEA3 Key = 00000000000000020000000000000000 In = 00000000000000000000000000000000 Out = 5C76002BC7206560EFE550C80B8F12CC Key = 00000000000000010000000000000000 In = 00000000000000000000000000000000 Out = F6B7BDD1CAEEBAB574683893C4475484 Key = 00000000000000008000000000000000 In = 00000000000000000000000000000000 Out = A920E37CC6DC6B31DA8C0169569F5034 Key = 00000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 919380ECD9C778BC513148B0C28D65FD Key = 00000000000000002000000000000000 In = 00000000000000000000000000000000 Out = EE67308DD3F2D9E6C2170755E5784BE1 Key = 00000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 3CC73E53B85609023A05E149B223AE09 Key = 00000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 983E8AF7CF05EBB28D71EB841C9406E6 Key = 00000000000000000400000000000000 In = 00000000000000000000000000000000 Out = 0F3099B2D31FA5299EE5BF43193287FC Key = 00000000000000000200000000000000 In = 00000000000000000000000000000000 Out = B763D84F38C27FE6931DCEB6715D4DB6 Key = 00000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 5AE3C9B0E3CC29C0C61565CD01F8A248 Key = 00000000000000000080000000000000 In = 00000000000000000000000000000000 Out = F58083572CD90981958565D48D2DEE25 Key = 00000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 7E6255EEF8F70C0EF10337AAB1CCCEF8 Key = 00000000000000000020000000000000 In = 00000000000000000000000000000000 Out = AAD4BAC34DB22821841CE2F631961902 Key = 00000000000000000010000000000000 In = 00000000000000000000000000000000 Out = D7431C0409BB1441BA9C6858DC7D4E81 Key = 00000000000000000008000000000000 In = 00000000000000000000000000000000 Out = EF9298C65E339F6E801A59C626456993 Key = 00000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 53FE29F68FF541ABC3F0EF3350B72F7E Key = 00000000000000000002000000000000 In = 00000000000000000000000000000000 Out = F6BBA5C10DB02529E2C2DA3FB582CC14 Key = 00000000000000000001000000000000 In = 00000000000000000000000000000000 Out = E4239AA37FC531A386DAD1126FC0E9CD Key = 00000000000000000000800000000000 In = 00000000000000000000000000000000 Out = 8F7758F857D15BBE7BFD0E416404C365 Key = 00000000000000000000400000000000 In = 00000000000000000000000000000000 Out = D273EB57C687BCD1B4EA7218A509E7B8 Key = 00000000000000000000200000000000 In = 00000000000000000000000000000000 Out = 65D64F8D76E8B3423FA25C4EB58A210A Key = 00000000000000000000100000000000 In = 00000000000000000000000000000000 Out = 623D802B4EC450D66A16625702FCDBE0 Key = 00000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 7496460CB28E5791BAEAF9B68FB00022 Key = 00000000000000000000040000000000 In = 00000000000000000000000000000000 Out = 34EA600F18BB0694B41681A49D510C1D Key = 00000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 5F8FF0D47D5766D29B5D6E8F46423BD8 Key = 00000000000000000000010000000000 In = 00000000000000000000000000000000 Out = 225F9286C5928BF09F84D3F93F541959 Key = 00000000000000000000008000000000 In = 00000000000000000000000000000000 Out = B21E90D25DF383416A5F072CEBEB1FFB Key = 00000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 4AEFCDA089318125453EB9E8EB5E492E Key = 00000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 4D3E75C6CD40EC4869BC85158591ADB8 Key = 00000000000000000000001000000000 In = 00000000000000000000000000000000 Out = 63A8B904405436A1B99D7751866771B7 Key = 00000000000000000000000800000000 In = 00000000000000000000000000000000 Out = 64F0DAAE47529199792EAE172BA53293 Key = 00000000000000000000000400000000 In = 00000000000000000000000000000000 Out = C3EEF84BEA18225D515A8C852A9047EE Key = 00000000000000000000000200000000 In = 00000000000000000000000000000000 Out = A44AC422B47D47B81AF73B3E9AC9596E Key = 00000000000000000000000100000000 In = 00000000000000000000000000000000 Out = D16E04A8FBC435094F8D53ADF25F5084 Key = 00000000000000000000000080000000 In = 00000000000000000000000000000000 Out = EF13DC34BAB03E124EEAD8B6BF44B532 Key = 00000000000000000000000040000000 In = 00000000000000000000000000000000 Out = D94799075C24DCC067AF0D392049250D Key = 00000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 14F431771EDDCE4764C21A2254B5E3C8 Key = 00000000000000000000000010000000 In = 00000000000000000000000000000000 Out = 7039329F36F2ED682B02991F28D64679 Key = 00000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 124EE24EDE5551639DB8B8B941F6141D Key = 00000000000000000000000004000000 In = 00000000000000000000000000000000 Out = C2852879A34D5184E478EC918B993FEE Key = 00000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 86A806A3525B93E432053C9AB5ABBEDF Key = 00000000000000000000000001000000 In = 00000000000000000000000000000000 Out = C1609BF5A4F07E37C17A36366EC23ECC Key = 00000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 7E81E7CB92159A51FFCEA331B1E8EA53 Key = 00000000000000000000000000400000 In = 00000000000000000000000000000000 Out = 37A7BE002856C5A59A6E03EAFCE7729A Key = 00000000000000000000000000200000 In = 00000000000000000000000000000000 Out = BDF98A5A4F91E890C9A1D1E5FAAB138F Key = 00000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 4E96ACB66E051F2BC739CC3D3E34A26B Key = 00000000000000000000000000080000 In = 00000000000000000000000000000000 Out = EE996CDD120EB86E21ECFA49E8E1FCF1 Key = 00000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 61B9E6B579DBF6070C351A1440DD85FF Key = 00000000000000000000000000020000 In = 00000000000000000000000000000000 Out = AC369E484316440B40DFC83AA96E28E7 Key = 00000000000000000000000000010000 In = 00000000000000000000000000000000 Out = 0A2D16DE985C76D45C579C1159413BBE Key = 00000000000000000000000000008000 In = 00000000000000000000000000000000 Out = DA3FDC38DA1D374FA4802CDA1A1C6B0F Key = 00000000000000000000000000004000 In = 00000000000000000000000000000000 Out = B842523D4C41C2211AFE43A5800ADCE3 Key = 00000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 9E2CDA90D8E992DBA6C73D8229567192 Key = 00000000000000000000000000001000 In = 00000000000000000000000000000000 Out = D49583B781D9E20F5BE101415957FC49 Key = 00000000000000000000000000000800 In = 00000000000000000000000000000000 Out = EF09DA5C12B376E458B9B8670032498E Key = 00000000000000000000000000000400 In = 00000000000000000000000000000000 Out = A96BE0463DA774461A5E1D5A9DD1AC10 Key = 00000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 32CEE3341060790D2D4B1362EF397090 Key = 00000000000000000000000000000100 In = 00000000000000000000000000000000 Out = 21CEA416A3D3359D2C4D58FB6A035F06 Key = 00000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 172AEAB3D507678ECAF455C12587ADB7 Key = 00000000000000000000000000000040 In = 00000000000000000000000000000000 Out = B6F897941EF8EBFF9FE80A567EF38478 Key = 00000000000000000000000000000020 In = 00000000000000000000000000000000 Out = A9723259D94A7DC662FB0C782CA3F1DD Key = 00000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 2F91C984B9A4839F30001B9F430493B4 Key = 00000000000000000000000000000008 In = 00000000000000000000000000000000 Out = 0472406345A610B048CB99EE0EF3FA0F Key = 00000000000000000000000000000004 In = 00000000000000000000000000000000 Out = F5F39086646F8C05ED16EFA4B617957C Key = 00000000000000000000000000000002 In = 00000000000000000000000000000000 Out = 26D50F485A30408D5AF47A5736292450 Key = 00000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 0545AAD56DA2A97C3663D1432A3D1C84 Key = 00000000000000000000000000000000 In = 80000000000000000000000000000000 Out = 3AD78E726C1EC02B7EBFE92B23D9EC34 Key = 00000000000000000000000000000000 In = 40000000000000000000000000000000 Out = 45BC707D29E8204D88DFBA2F0B0CAD9B Key = 00000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 161556838018F52805CDBD6202002E3F Key = 00000000000000000000000000000000 In = 10000000000000000000000000000000 Out = F5569B3AB6A6D11EFDE1BF0A64C6854A Key = 00000000000000000000000000000000 In = 08000000000000000000000000000000 Out = 64E82B50E501FBD7DD4116921159B83E Key = 00000000000000000000000000000000 In = 04000000000000000000000000000000 Out = BAAC12FB613A7DE11450375C74034041 Key = 00000000000000000000000000000000 In = 02000000000000000000000000000000 Out = BCF176A7EAAD8085EBACEA362462A281 Key = 00000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 47711816E91D6FF059BBBF2BF58E0FD3 Key = 00000000000000000000000000000000 In = 00800000000000000000000000000000 Out = B970DFBE40698AF1638FE38BD3DF3B2F Key = 00000000000000000000000000000000 In = 00400000000000000000000000000000 Out = F95B59A44F391E14CF20B74BDC32FCFF Key = 00000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 720F74AE04A2A435B9A7256E49378F5B Key = 00000000000000000000000000000000 In = 00100000000000000000000000000000 Out = 2A0445F61D36BFA7E277070730CF76DA Key = 00000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 8D0536B997AEFEC1D94011BAB6699A03 Key = 00000000000000000000000000000000 In = 00040000000000000000000000000000 Out = 674F002E19F6ED47EFF319E51FAD4498 Key = 00000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 292C02C5CB9163C80AC0F6CF1DD8E92D Key = 00000000000000000000000000000000 In = 00010000000000000000000000000000 Out = FA321CF18EF5FE727DD82A5C1E945141 Key = 00000000000000000000000000000000 In = 00008000000000000000000000000000 Out = A5A7AFE1034C39CCCEBE3C584BC0BE05 Key = 00000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 4FF5A52E697E77D081205DBDB21CEA39 Key = 00000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 209E88DC94C9003000CE0769AF7B7166 Key = 00000000000000000000000000000000 In = 00001000000000000000000000000000 Out = 5DEE41AF864CB4B650E5F51551824D38 Key = 00000000000000000000000000000000 In = 00000800000000000000000000000000 Out = A79A63FA7E4503AE6D6E09F5F9053030 Key = 00000000000000000000000000000000 In = 00000400000000000000000000000000 Out = A48316749FAE7FAC7002031A6AFD8BA7 Key = 00000000000000000000000000000000 In = 00000200000000000000000000000000 Out = D6EEE8A7357A0E1D64262CA9C337AC42 Key = 00000000000000000000000000000000 In = 00000100000000000000000000000000 Out = B013CA8A62A858053E9FB667ED39829E Key = 00000000000000000000000000000000 In = 00000080000000000000000000000000 Out = DF6EA9E4538A45A52D5C1A43C88F4B55 Key = 00000000000000000000000000000000 In = 00000040000000000000000000000000 Out = 7D03BA451371591D3FD5547D9165C73B Key = 00000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 0E0426281A6277E186499D365D5F49FF Key = 00000000000000000000000000000000 In = 00000010000000000000000000000000 Out = DBC02169DD2059E6CC4C57C1FEDF5AB4 Key = 00000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 826590E05D167DA6F00DCC75E22788EB Key = 00000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 34A73F21A04421D9786335FAAB49423A Key = 00000000000000000000000000000000 In = 00000002000000000000000000000000 Out = ED347D0E0128EE1A7392A1D36AB78AA9 Key = 00000000000000000000000000000000 In = 00000001000000000000000000000000 Out = EE944B2FE6E9FC888042608DA9615F75 Key = 00000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 9E7C85A909EF7218BA7947CFB4718F46 Key = 00000000000000000000000000000000 In = 00000000400000000000000000000000 Out = 811AE07A0B2B1F816587FA73699AE77D Key = 00000000000000000000000000000000 In = 00000000200000000000000000000000 Out = 68466FBF43C2FE13D4B18F7EC5EA745F Key = 00000000000000000000000000000000 In = 00000000100000000000000000000000 Out = D20B015C7191B219780956E6101F9354 Key = 00000000000000000000000000000000 In = 00000000080000000000000000000000 Out = 5939D5C1BBF54EE1B3E326D757BDDE25 Key = 00000000000000000000000000000000 In = 00000000040000000000000000000000 Out = B1FDAFE9A0240E8FFEA19CE94B5105D3 Key = 00000000000000000000000000000000 In = 00000000020000000000000000000000 Out = D62962ECE02CDD68C06BDFEFB2F9495B Key = 00000000000000000000000000000000 In = 00000000010000000000000000000000 Out = B3BB2DE6F3C26587BA8BAC4F7AD9499A Key = 00000000000000000000000000000000 In = 00000000008000000000000000000000 Out = E0B1072D6D9FF703D6FBEF77852B0A6B Key = 00000000000000000000000000000000 In = 00000000004000000000000000000000 Out = D8DD51C907F478DE0228E83E61FD1758 Key = 00000000000000000000000000000000 In = 00000000002000000000000000000000 Out = A42DFFE6E7C1671C06A25236FDD10017 Key = 00000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 25ACF141550BFAB9EF451B6C6A5B2163 Key = 00000000000000000000000000000000 In = 00000000000800000000000000000000 Out = 4DA7FCA3949B16E821DBC84F19581018 Key = 00000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 7D49B6347CBCC8919C7FA96A37A7A215 Key = 00000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 900024B29A08C6721B95BA3B753DDB4D Key = 00000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 6D2182FB283B6934D90BA7848CAB5E66 Key = 00000000000000000000000000000000 In = 00000000000080000000000000000000 Out = F73EF01B448D23A4D90DE8B2F9666E7A Key = 00000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 4AD9CDA2418643E9A3D926AF5E6B0412 Key = 00000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 7CAEC8E7E5953997D545B033201C8C5B Key = 00000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 3C43CA1F6B6864503E27B48D88230CF5 Key = 00000000000000000000000000000000 In = 00000000000008000000000000000000 Out = 44F779B93108FE9FEEC880D79BA74488 Key = 00000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 9E50E8D9CFD3A682A78E527C9072A1CF Key = 00000000000000000000000000000000 In = 00000000000002000000000000000000 Out = 68D000CBC838BBE3C505D6F814C01F28 Key = 00000000000000000000000000000000 In = 00000000000001000000000000000000 Out = 2CB2A9FEC1ACD1D9B0FA05205E304F57 Key = 00000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 01EB2806606E46444520A5CC6180CD4B Key = 00000000000000000000000000000000 In = 00000000000000400000000000000000 Out = DAA9B25168CC702326F217F1A0C0B162 Key = 00000000000000000000000000000000 In = 00000000000000200000000000000000 Out = 3E07E648975D9578D03555B1755807ED Key = 00000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 0B45F52E802C8B8DE09579425B80B711 Key = 00000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 659595DA0B68F6DF0DD6CA77202986E1 Key = 00000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 05FF42873893536E58C8FA98A45C73C4 Key = 00000000000000000000000000000000 In = 00000000000000020000000000000000 Out = B5B03421DE8BBFFC4EADEC767339A9BD Key = 00000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 788BCD111ECF73D4E78D2E21BEF55460 Key = 00000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 909CD9EC6790359F982DC6F2393D5315 Key = 00000000000000000000000000000000 In = 00000000000000004000000000000000 Out = 332950F361535FF24EFAC8C76293F12C Key = 00000000000000000000000000000000 In = 00000000000000002000000000000000 Out = A68CCD4E330FFDA9D576DA436DB53D75 Key = 00000000000000000000000000000000 In = 00000000000000001000000000000000 Out = 27C8A1CCFDB0B015D1ED5B3E77143791 Key = 00000000000000000000000000000000 In = 00000000000000000800000000000000 Out = D76A4B95887A77DF610DD3E1D3B20325 Key = 00000000000000000000000000000000 In = 00000000000000000400000000000000 Out = C068AB0DE71C66DAE83C361EF4B2D989 Key = 00000000000000000000000000000000 In = 00000000000000000200000000000000 Out = C2120BCD49EDA9A288B3B4BE79AC8158 Key = 00000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 0C546F62BF2773CD0F564FCECA7BA688 Key = 00000000000000000000000000000000 In = 00000000000000000080000000000000 Out = 18F3462BEDE4920213CCB66DAB1640AA Key = 00000000000000000000000000000000 In = 00000000000000000040000000000000 Out = FE42F245EDD0E24B216AEBD8B392D690 Key = 00000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 3D3EEBC8D3D1558A194C2D00C337FF2B Key = 00000000000000000000000000000000 In = 00000000000000000010000000000000 Out = 29AAEDF043E785DB42836F79BE6CBA28 Key = 00000000000000000000000000000000 In = 00000000000000000008000000000000 Out = 215F90C6744E2944358E78619159A611 Key = 00000000000000000000000000000000 In = 00000000000000000004000000000000 Out = 8606B1AA9E1D548E5442B06551E2C6DC Key = 00000000000000000000000000000000 In = 00000000000000000002000000000000 Out = 987BB4B8740EC0EDE7FEA97DF033B5B1 Key = 00000000000000000000000000000000 In = 00000000000000000001000000000000 Out = C0A3500DA5B0AE07D2F450930BEEDF1B Key = 00000000000000000000000000000000 In = 00000000000000000000800000000000 Out = 525FDF8312FE8F32C781481A8DAAAE37 Key = 00000000000000000000000000000000 In = 00000000000000000000400000000000 Out = BFD2C56AE5FB9C9DE33A6944572A6487 Key = 00000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 7975A57A425CDF5AA1FA929101F650B0 Key = 00000000000000000000000000000000 In = 00000000000000000000100000000000 Out = BF174BC49609A8709B2CD8366DAA79FE Key = 00000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 06C50C43222F56C874B1704E9F44BF7D Key = 00000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 0CEC48CD34043EA29CA3B8ED5278721E Key = 00000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 9548EA34A1560197B304D0ACB8A1698D Key = 00000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 22F9E9B1BD73B6B5B7D3062C986272F3 Key = 00000000000000000000000000000000 In = 00000000000000000000008000000000 Out = FEE8E934BD0873295059002230E298D4 Key = 00000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 1B08E2E3EB820D139CB4ABBDBE81D00D Key = 00000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 0021177681E4D90CEAF69DCED0145125 Key = 00000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 4A8E314452CA8A8A3619FC54BC423643 Key = 00000000000000000000000000000000 In = 00000000000000000000000800000000 Out = 65047474F7222C94C6965425FF1BFD0A Key = 00000000000000000000000000000000 In = 00000000000000000000000400000000 Out = E123F551A9C4A8489622B16F961A9AA4 Key = 00000000000000000000000000000000 In = 00000000000000000000000200000000 Out = EF05530948B80915028BB2B6FE429380 Key = 00000000000000000000000000000000 In = 00000000000000000000000100000000 Out = 72535B7FE0F0F777CEDCD55CD77E2DDF Key = 00000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 3423D8EFC31FA2F4C365C77D8F3B5C63 Key = 00000000000000000000000000000000 In = 00000000000000000000000040000000 Out = DE0E51C264663F3C5DBC59580A98D8E4 Key = 00000000000000000000000000000000 In = 00000000000000000000000020000000 Out = B2D9391166680947AB09264156719679 Key = 00000000000000000000000000000000 In = 00000000000000000000000010000000 Out = 10DB79F23B06D263835C424AF749ADB7 Key = 00000000000000000000000000000000 In = 00000000000000000000000008000000 Out = DDF72D27E6B01EC107EA3E005B59563B Key = 00000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 8266B57485A5954A4236751DE07F6694 Key = 00000000000000000000000000000000 In = 00000000000000000000000002000000 Out = 669A501E1F1ADE6E5523DE01D6DBC987 Key = 00000000000000000000000000000000 In = 00000000000000000000000001000000 Out = C20C48F2989725D461D1DB589DC0896E Key = 00000000000000000000000000000000 In = 00000000000000000000000000800000 Out = DE35158E7810ED1191825D2AA98FA97D Key = 00000000000000000000000000000000 In = 00000000000000000000000000400000 Out = 4FE294F2C0F34D0671B693A237EBDDC8 Key = 00000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 087AE74B10CCBFDF6739FEB9559C01A4 Key = 00000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 5DC278970B7DEF77A5536C77AB59C207 Key = 00000000000000000000000000000000 In = 00000000000000000000000000080000 Out = 7607F078C77085184EAA9B060C1FBFFF Key = 00000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 9DB841531BCBE7998DAD19993FB3CC00 Key = 00000000000000000000000000000000 In = 00000000000000000000000000020000 Out = D6A089B654854A94560BAE13298835B8 Key = 00000000000000000000000000000000 In = 00000000000000000000000000010000 Out = E1E223C4CF90CC5D195B370D65114622 Key = 00000000000000000000000000000000 In = 00000000000000000000000000008000 Out = 1CBED73C50D053BDAD372CEEE54836A1 Key = 00000000000000000000000000000000 In = 00000000000000000000000000004000 Out = D309E69376D257ADF2BFDA152B26555F Key = 00000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 740F7649117F0DEE6EAA7789A9994C36 Key = 00000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 76AE64417C297184D668C5FD908B3CE5 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000800 Out = 6095FEA4AA8035591F1787A819C48787 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000400 Out = D1FF4E7ACD1C79967FEBAB0F7465D450 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 5F5AD3C42B9489557BB63BF49ECF5F8A Key = 00000000000000000000000000000000 In = 00000000000000000000000000000100 Out = FB56CC09B680B1D07C5A52149E29F07C Key = 00000000000000000000000000000000 In = 00000000000000000000000000000080 Out = FF49B8DF4A97CBE03833E66197620DAD Key = 00000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 5E070ADE533D2E090ED0F5BE13BC0983 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000020 Out = 3AB4FB1D2B7BA376590A2C241D1F508D Key = 00000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 58B2431BC0BEDE02550F40238969EC78 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000008 Out = 0253786E126504F0DAB90C48A30321DE Key = 00000000000000000000000000000000 In = 00000000000000000000000000000004 Out = 200211214E7394DA2089B6ACD093ABE0 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000002 Out = 0388DACE60B6A392F328C2B971B2FE78 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 58E2FCCEFA7E3061367F1D57A4E7455A Key = 00000000000000000000000000000000 In = 0000000000000000000000000000000400000000000000000000000000000002000000000000000000000000000000018000000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000008000000000000000000000000000000 Out = 200211214E7394DA2089B6ACD093ABE00388DACE60B6A392F328C2B971B2FE7858E2FCCEFA7E3061367F1D57A4E7455A3AD78E726C1EC02B7EBFE92B23D9EC3445BC707D29E8204D88DFBA2F0B0CAD9B161556838018F52805CDBD6202002E3FF5569B3AB6A6D11EFDE1BF0A64C6854A64E82B50E501FBD7DD4116921159B83E [AES-192] Key = 000102030405060708090A0B0C0D0E0F1011121314151617 In = 00112233445566778899AABBCCDDEEFF Out = DDA97CA4864CDFE06EAF70A0EC0D7191 Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C In = 2D33EEF2C0430A8A9EBF45E809C40BB6 Out = DFF4945E0336DF4C1C56BC700EFF837F Key = 1E1F20212324252628292A2B2D2E2F30323334353738393A In = 6AA375D1FA155A61FB72353E0A5A8756 Out = B6FDDEF4752765E347D5D2DC196D1252 Key = 3C3D3E3F41424344464748494B4C4D4E5051525355565758 In = BC3736518B9490DCB8ED60EB26758ED4 Out = D23684E3D963B3AFCF1A114ACA90CBD6 Key = 5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = AA214402B46CFFB9F761EC11263A311E Out = 3A7AC027753E2A18C2CEAB9E17C11FD0 Key = 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 In = 02AEA86E572EEAB66B2C3AF5E9A46FD6 Out = 8F6786BD007528BA26603C1601CDD0D8 Key = 969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 In = E2AEF6ACC33B965C4FA1F91C75FF6F36 Out = D17D073B01E71502E28B47AB551168B3 Key = B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 In = 0659DF46427162B9434865DD9499F91D Out = A469DA517119FAB95876F41D06D40FFA Key = D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = 49A44239C748FEB456F59C276A5658DF Out = 6091AA3B695C11F5C0B6AD26D3D862FF Key = F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C In = 66208F6E9D04525BDEDB2733B6A6BE37 Out = 70F9E67F9F8DF1294131662DC6E69364 Key = 0E0F10111314151618191A1B1D1E1F20222324252728292A In = 3393F8DFC729C97F5480B950BC9666B0 Out = D154DCAFAD8B207FA5CBC95E9996B559 Key = 2C2D2E2F31323334363738393B3C3D3E4041424345464748 In = 606834C8CE063F3234CF1145325DBD71 Out = 4934D541E8B46FA339C805A7AEB9E5DA Key = 4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 In = FEC1C04F529BBD17D8CECFCC4718B17F Out = 62564C738F3EFE186E1A127A0C4D3C61 Key = 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 In = 32DF99B431ED5DC5ACF8CAF6DC6CE475 Out = 07805AA043986EB23693E23BEF8F3438 Key = 868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 In = 7FDC2B746F3F665296943B83710D1F82 Out = DF0B4931038BADE848DEE3B4B85AA44B Key = A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 In = 8FBA1510A3C5B87E2EAA3F7A91455CA2 Out = 592D5FDED76582E4143C65099309477C Key = C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE In = 2C9B468B1C2EED92578D41B0716B223B Out = C9B8D6545580D3DFBCDD09B954ED4E92 Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC In = 0A2BBF0EFC6BC0034F8A03433FCA1B1A Out = 5DCCD5D6EB7C1B42ACB008201DF707A0 Key = FEFE01010304050608090A0B0D0E0F10121314151718191A In = 25260E1F31F4104D387222E70632504B Out = A2A91682FFEB6ED1D34340946829E6F9 Key = 1C1D1E1F21222324262728292B2C2D2E3031323335363738 In = C527D25A49F08A5228D338642AE65137 Out = E45D185B797000348D9267960A68435D Key = 3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 In = 3B49FC081432F5890D0E3D87E884A69E Out = 45E060DAE5901CDA8089E10D4F4C246B Key = 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 In = D173F9ED1E57597E166931DF2754A083 Out = F6951AFACC0079A369C71FDCFF45DF50 Key = 767778797B7C7D7E80818283858687888A8B8C8D8F909192 In = 8C2B7CAFA5AFE7F13562DAEAE1ADEDE0 Out = 9E95E00F351D5B3AC3D0E22E626DDAD6 Key = 94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 In = AAF4EC8C1A815AEB826CAB741339532C Out = 9CB566FF26D92DAD083B51FDC18C173C Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC In = 40BE8C5D9108E663F38F1A2395279ECF Out = C9C82766176A9B228EB9A974A010B4FB Key = 2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 In = 0C8AD9BC32D43E04716753AA4CFBE351 Out = D8E26AA02945881D5137F1C1E1386E88 Key = 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 In = 1407B1D5F87D63357C8DC7EBBAEBBFEE Out = C0E024CCD68FF5FFA4D139C355A77C55 Key = 84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 In = E62734D1AE3378C4549E939E6F123416 Out = 0B18B3D16F491619DA338640DF391D43 Key = A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = 5A752CFF2A176DB1A1DE77F2D2CDEE41 Out = DBE09AC8F66027BF20CB6E434F252EFC Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC In = A9C8C3A4EABEDC80C64730DDD018CD88 Out = 6D04E5E43C5B9CBE05FEB9606B6480FE Key = 1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 In = EE9B3DBBDB86180072130834D305999A Out = DD1D6553B96BE526D9FEE0FBD7176866 Key = 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 In = A7FA8C3586B8EBDE7568EAD6F634A879 Out = 0260CA7E3F979FD015B0DD4690E16D2A Key = 929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = 37E0F4A87F127D45AC936FE7AD88C10A Out = 9893734DE10EDCC8A67C3B110B8B8CC6 Key = 464748494B4C4D4E50515253555657585A5B5C5D5F606162 In = 3F77D8B5D92BAC148E4E46F697A535C5 Out = 93B30B750516B2D18808D710C2EE84EF Key = 828384858788898A8C8D8E8F91929394969798999B9C9D9E In = D25EBB686C40F7E2C4DA1014936571CA Out = 16F65FA47BE3CB5E6DFE7C6C37016C0E Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC In = 4F1C769D1E5B0552C7ECA84DEA26A549 Out = F3847210D5391E2360608E5ACB560581 Key = BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA In = 8548E2F882D7584D0FAFC54372B6633A Out = 8754462CD223366D0753913E6AF2643D Key = DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 In = 87D7A336CB476F177CD2A51AF2A62CDF Out = 1EA20617468D1B806A1FD58145462017 Key = FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 In = 03B1FEAC668C4E485C1065DFC22B44EE Out = 3B155D927355D737C6BE9DDA60136E2E Key = 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 In = BDA15E66819FA72D653A6866AA287962 Out = 26144F7B66DAA91B6333DBD3850502B3 Key = 363738393B3C3D3E40414243454647484A4B4C4D4F505152 In = 4D0C7A0D2505B80BF8B62CEB12467F0A Out = E4F9A4AB52CED8134C649BF319EBCC90 Key = 54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 In = 626D34C9429B37211330986466B94E5F Out = B9DDD29AC6128A6CAB121E34A4C62B36 Key = 727374757778797A7C7D7E7F81828384868788898B8C8D8E In = 333C3E6BF00656B088A17E5FF0E7F60A Out = 6FCDDAD898F2CE4EFF51294F5EAAF5C9 Key = 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC In = 687ED0CDC0D2A2BC8C466D05EF9D2891 Out = C9A6FE2BF4028080BEA6F7FC417BD7E3 Key = AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA In = 487830E78CC56C1693E64B2A6660C7B6 Out = 6A2026846D8609D60F298A9C0673127F Key = CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 In = 7A48D6B7B52B29392AA2072A32B66160 Out = 2CB25C005E26EFEA44336C4C97A4240B Key = EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 In = 907320E64C8C5314D10F8D7A11C8618D Out = 496967AB8680DDD73D09A0E4C7DCC8AA Key = 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 In = B561F2CA2D6E65A4A98341F3ED9FF533 Out = D5AF94DE93487D1F3A8C577CB84A66A4 Key = 262728292B2C2D2E30313233353637383A3B3C3D3F404142 In = DF769380D212792D026F049E2E3E48EF Out = 84BDAC569CAE2828705F267CC8376E90 Key = 44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 In = 79F374BC445BDABF8FCCB8843D6054C6 Out = F7401DDA5AD5AB712B7EB5D10C6F99B6 Key = 626364656768696A6C6D6E6F71727374767778797B7C7D7E In = 4E02F1242FA56B05C68DBAE8FE44C9D6 Out = 1C9D54318539EBD4C3B5B7E37BF119F0 Key = 80818283858687888A8B8C8D8F90919294959697999A9B9C In = CF73C93CBFF57AC635A6F4AD2A4A1545 Out = ACA572D65FB2764CFFD4A6ECA090EA0D Key = 9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA In = 9923548E2875750725B886566784C625 Out = 36D9C627B8C2A886A10CCB36EAE3DFBB Key = BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 In = 4888336B723A022C9545320F836A4207 Out = 010EDBF5981E143A81D646E597A4A568 Key = DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = F84D9A5561B0608B1160DEE000C41BA8 Out = 8DB44D538DC20CC2F40F3067FD298E60 Key = F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 In = C23192A0418E30A19B45AE3E3625BF22 Out = 930EB53BC71E6AC4B82972BDCD5AAFB3 Key = 161718191B1C1D1E20212223252627282A2B2C2D2F303132 In = B84E0690B28B0025381AD82A15E501A7 Out = 6C42A81EDCBC9517CCD89C30C95597B4 Key = 34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 In = ACEF5E5C108876C4F06269F865B8F0B0 Out = DA389847AD06DF19D76EE119C71E1DD3 Key = 525354555758595A5C5D5E5F61626364666768696B6C6D6E In = 0F1B3603E0F5DDEA4548246153A5E064 Out = E018FDAE13D3118F9A5D1A647A3F0462 Key = 70717273757677787A7B7C7D7F80818284858687898A8B8C In = FBB63893450D42B58C6D88CD3C1809E3 Out = 2AA65DB36264239D3846180FABDFAD20 Key = 8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA In = 4BEF736DF150259DAE0C91354E8A5F92 Out = 1472163E9A4F780F1CEB44B07ECF4FDB Key = ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 In = 7D2D46242056EF13D3C3FC93C128F4C7 Out = C8273FDC8F3A9F72E91097614B62397C Key = CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = E9C1BA2DF415657A256EDB33934680FD Out = 66C8427DCD733AAF7B3470CB7D976E3F Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 In = E23EE277B0AA0A1DFB81F7527C3514F1 Out = 146131CB17F1424D4F8DA91E6F80C1D0 Key = 060708090B0C0D0E10111213151617181A1B1C1D1F202122 In = 3E7445B0B63CAAF75E4A911E12106B4C Out = 2610D0AD83659081AE085266A88770DC Key = 24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 In = 767774752023222544455A5BE6E1E0E3 Out = 38A2B5A974B0575C5D733917FB0D4570 Key = 424344454748494A4C4D4E4F51525354565758595B5C5D5E In = 72737475717E7F7CE9E8EBEA696A6B6C Out = E21D401EBC60DE20D6C486E4F39A588B Key = 60616263656667686A6B6C6D6F70717274757677797A7B7C In = DFDEDDDC25262728C9C8CFCEF1EEEFEC Out = E51D5F88C670B079C0CA1F0C2C4405A2 Key = 7E7F80818384858688898A8B8D8E8F90929394959798999A In = FFFE0100707776755F5E5D5C7675746B Out = 246A94788A642FB3D1B823C8762380C8 Key = 9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 In = E0E1E2E3424140479F9E9190292E2F2C Out = B80C391C5C41A4C3B30C68E0E3D7550F Key = BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = 2120272690EFEEED3B3A39384E4D4C4B Out = B77C4754FC64EB9A1154A9AF0BB1F21C Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 In = ECEDEEEF5350516EA1A0A7A6A3ACADAE Out = FB554DE520D159A06BF219FC7F34A02F Key = F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 In = 32333C3D25222320E9E8EBEACECDCCC3 Out = A89FBA152D76B4927BEED160DDB76C57 Key = 14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 In = 40414243626160678A8BB4B511161714 Out = 5676EAB4A98D2E8473B3F3D46424247C Key = 323334353738393A3C3D3E3F41424344464748494B4C4D4E In = 94959293F5FAFBF81F1E1D1C7C7F7E79 Out = 4E8F068BD7EDE52A639036EC86C33568 Key = 50515253555657585A5B5C5D5F60616264656667696A6B6C In = BEBFBCBD191A1B14CFCEC9C8546B6A69 Out = F0193C4D7AFF1791EE4C07EB4A1824FC Key = 6E6F70717374757678797A7B7D7E7F80828384858788898A In = 2C2D3233898E8F8CBBBAB9B8333031CE Out = AC8686EECA9BA761AFE82D67B928C33F Key = 8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 In = 84858687BFBCBDBA37363938FDFAFBF8 Out = 5FAF8573E33B145B6A369CD3606AB2C9 Key = AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = 828384857669686B909192930B08090E Out = 31587E9944AB1C16B844ECAD0DF2E7DA Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 In = BEBFBCBD9695948B707176779E919093 Out = D017FECD91148ABA37F6F3068AA67D8A Key = E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 In = 8B8A85846067666521202322D0D3D2DD Out = 788EF2F021A73CBA2794B616078A8500 Key = 04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 In = 76777475F1F2F3F4F8F9E6E777707172 Out = 5D1EF20DCED6BCBC12131AC7C54788AA Key = 222324252728292A2C2D2E2F31323334363738393B3C3D3E In = A4A5A2A34F404142B4B5B6B727242522 Out = B3C8CF961FAF9EA05FDDE6D1E4D8F663 Key = 40414243454647484A4B4C4D4F50515254555657595A5B5C In = 94959697E1E2E3EC16171011839C9D9E Out = 143075C70605861C7FAC6526199E459F Key = 5E5F60616364656668696A6B6D6E6F70727374757778797A In = 03023D3C06010003DEDFDCDDFFFCFDE2 Out = A5AE12EADE9A87268D898BFC8FC0252A Key = 7C7D7E7F81828384868788898B8C8D8E9091929395969798 In = 10111213F1F2F3F4CECFC0C1DBDCDDDE Out = 0924F7CF2E877A4819F5244A360DCEA9 Key = 9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = 67666160724D4C4F1D1C1F1E73707176 Out = 3D9E9635AFCC3E291CC7AB3F27D1C99A Key = B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 In = E6E7E4E5A8ABAAD584858283909F9E9D Out = 9D80FEEBF87510E2B8FB98BB54FD788C Key = D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 In = 71707F7E565150537D7C7F7E6162636C Out = 5F9D1A082A1A37985F174002ECA01309 Key = F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 In = 64656667212223245555AAAA03040506 Out = A390EBB1D1403930184A44B4876646E4 Key = 121314151718191A1C1D1E1F21222324262728292B2C2D2E In = 9E9F9899ABA4A5A6CFCECDCC2B28292E Out = 700FE918981C3195BB6C4BCB46B74E29 Key = 30313233353637383A3B3C3D3F40414244454647494A4B4C In = C7C6C5C4D1D2D3DC626364653A454447 Out = 907984406F7BF2D17FB1EB15B673D747 Key = 4E4F50515354555658595A5B5D5E5F60626364656768696A In = F6F7E8E9E0E7E6E51D1C1F1E5B585966 Out = C32A956DCFC875C2AC7C7CC8B8CC26E1 Key = 6C6D6E6F71727374767778797B7C7D7E8081828385868788 In = BCBDBEBF5D5E5F5868696667F4F3F2F1 Out = 02646E2EBFA9B820CF8424E9B9B6EB51 Key = 8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 In = 40414647B0AFAEAD9B9A99989B98999E Out = 621FDA3A5BBD54C6D3C685816BD4EAD8 Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 In = 69686B6A0201001F0F0E0908B4BBBAB9 Out = D4E216040426DFAF18B152469BC5AC2F Key = C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 In = C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3 Out = 9D0635B9D33B6CDBD71F5D246EA17CC8 Key = E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 In = DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7 Out = 10ABAD1BD9BAE5448808765583A2CC1A Key = 020304050708090A0C0D0E0F11121314161718191B1C1D1E In = 4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE Out = 6891889E16544E355FF65A793C39C9A8 Key = 20212223252627282A2B2C2D2F30313234353637393A3B3C In = B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC Out = CC735582E68072C163CD9DDF46B91279 Key = 3E3F40414344454648494A4B4D4E4F50525354555758595A In = CECFB0B1F7F0F1F2AEAFACAD3E3D3C23 Out = C5C68B9AEEB7F878DF578EFA562F9574 Key = 5C5D5E5F61626364666768696B6C6D6E7071727375767778 In = CACBC8C9CDCECFC812131C1D494E4F4C Out = 5F4764395A667A47D73452955D0D2CE8 Key = 7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 In = 9D9C9B9AD22D2C2FB1B0B3B20C0F0E09 Out = 701448331F66106CEFDDF1EB8267C357 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 In = 7A7B787964676659959493924F404142 Out = CB3EE56D2E14B4E1941666F13379D657 Key = B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 In = AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6 Out = 9FE16EFD18AB6E1981191851FEDB0764 Key = D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 In = 93929190282B2A2DC4C5FAFB92959497 Out = 3DC9BA24E1B223589B147ADCEB4C8E48 Key = F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E In = EFEEE9E8DED1D0D339383B3A888B8A8D Out = 1C333032682E7D4DE5E5AFC05C3E483C Key = 10111213151617181A1B1C1D1F20212224252627292A2B2C In = 7F7E7D7CA2A1A0AF78797E7F112E2F2C Out = D593CC99A95AFEF7E92038E05A59D00A Key = 2E2F30313334353638393A3B3D3E3F40424344454748494A In = 84859A9B2B2C2D2E868784852625245B Out = 51E7F96F53B4353923452C222134E1EC Key = 4C4D4E4F51525354565758595B5C5D5E6061626365666768 In = B0B1B2B3070405026869666710171615 Out = 4075B357A1A2B473400C3B25F32F81A4 Key = 6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 In = ACADAAABBDA2A3A00D0C0F0E595A5B5C Out = 302E341A3EBCD74F0D55F61714570284 Key = 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 In = 121310115655544B5253545569666764 Out = 57ABDD8231280DA01C5042B78CF76522 Key = A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 In = DEDFD0D166616063EAEBE8E94142434C Out = 17F9EA7EEA17AC1ADF0E190FEF799E92 Key = C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 In = DBDAD9D81417161166677879E0E7E6E5 Out = 2E1BDD563DD87EE5C338DD6D098D0A7A Key = E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = 6A6B6C6DE0EFEEED2B2A2928C0C3C2C5 Out = EB869996E6F8BFB2BFDD9E0C4504DBB2 Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C In = B1B0B3B21714151A1A1B1C1D5649484B Out = C2E01549E9DECF317468B3E018C61BA8 Key = 1E1F20212324252628292A2B2D2E2F30323334353738393A In = 39380706A3A4A5A6C4C5C6C77271706F Out = 8DA875D033C01DD463B244A1770F4A22 Key = 3C3D3E3F41424344464748494B4C4D4E5051525355565758 In = 5C5D5E5F1013121539383736E2E5E4E7 Out = 8BA0DCF3A186844F026D022F8839D696 Key = 5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = 43424544EAD5D4D72E2F2C2D64676661 Out = E9691FF9A6CC6970E51670A0FD5B88C1 Key = 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 In = 55545756989B9A65F8F9FEFF18171615 Out = F2BAEC06FAEED30F88EE63BA081A6E5B Key = 969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 In = 05040B0A525554573C3D3E3F4A494847 Out = 9C39D4C459AE5753394D6094ADC21E78 Key = B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 In = 14151617595A5B5C8584FBFA8E89888B Out = 6345B532A11904502EA43BA99C6BD2B2 Key = D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = 7C7D7A7BFDF2F3F029282B2A51525354 Out = 5FFAE3061A95172E4070CEDCE1E428C8 Key = F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C In = 38393A3B1E1D1C1341404746C23D3C3E Out = 0A4566BE4CDF9ADCE5DEC865B5AB34CD Key = 0E0F10111314151618191A1B1D1E1F20222324252728292A In = 8D8C939240474645818083827C7F7E41 Out = CA17FCCE79B7404F2559B22928F126FB Key = 2C2D2E2F31323334363738393B3C3D3E4041424345464748 In = 3B3A39381A19181F32333C3D45424340 Out = 97CA39B849ED73A6470A97C821D82F58 Key = 4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 In = F0F1F6F738272625828380817F7C7D7A Out = 8198CB06BC684C6D3E9B7989428DCF7A Key = 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 In = 89888B8A0407061966676061141B1A19 Out = F53C464C705EE0F28D9A4C59374928BD Key = 868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 In = D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5 Out = 9ADB3D4CCA559BB98C3E2ED73DBF1154 Key = 800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DE885DC87F5A92594082D02CC1E1B42C Key = 400000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C749194F94673F9DD2AA1932849630C1 Key = 200000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0CEF643313912934D310297B90F56ECC Key = 100000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C4495D39D4A553B225FBA02A7B1B87E1 Key = 080000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 636D10B1A0BCAB541D680A7970ADC830 Key = 040000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 07CF045786BD6AFCC147D99E45A901A7 Key = 020000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6A8E3F425A7599348F95398448827976 Key = 010000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5518276836148A00D91089A20D8BFF57 Key = 008000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F267E07B5E87E3BC20B969C61D4FCB06 Key = 004000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5A1CDE69571D401BFCD20DEBADA2212C Key = 002000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 70A9057263254701D12ADD7D74CD509E Key = 001000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35713A7E108031279388A33A0FE2E190 Key = 000800000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E74EDE82B1254714F0C7B4B243108655 Key = 000400000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 39272E3100FAA37B55B862320D1B3EB3 Key = 000200000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6D6E24C659FC5AEF712F77BCA19C9DD0 Key = 000100000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 76D18212F972370D3CC2C6C372C6CF2F Key = 000080000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B21A1F0BAE39E55C7594ED570A7783EA Key = 000040000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 77DE202111895AC48DD1C974B358B458 Key = 000020000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 67810B311969012AAF7B504FFAF39FD1 Key = 000010000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C22EA2344D3E9417A6BA07843E713AEA Key = 000008000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C79CAF4B97BEE0BD0630AB354539D653 Key = 000004000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 135FD1AF761D9AE23DF4AA6B86760DB4 Key = 000002000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D4659D0B06ACD4D56AB8D11A16FD83B9 Key = 000001000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F7D270028FC188E4E4F35A4AAA25D4D4 Key = 000000800000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 345CAE5A8C9620A9913D5473985852FF Key = 000000400000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4E8980ADDE60B0E42C0B287FEA41E729 Key = 000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F11B6D74E1F15155633DC39743C1A527 Key = 000000100000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9C87916C0180064F9D3179C6F5DD8C35 Key = 000000080000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 71AB186BCAEA518E461D4F7FAD230E6A Key = 000000040000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C4A31BBC3DAAF742F9141C2A5001A49C Key = 000000020000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E7C47B7B1D40F182A8928C8A55671D07 Key = 000000010000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8E17F294B28FA373C6249538868A7EEF Key = 000000008000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 754404096A5CBC08AF09491BE249141A Key = 000000004000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 101CB56E55F05D86369B6D1069204F0A Key = 000000002000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 73F19BB6604205C6EE227B9759791E41 Key = 000000001000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6270C0028F0D136C37A56B2CB64D24D6 Key = 000000000800000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A3BF7C2C38D1114A087ECF212E694346 Key = 000000000400000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 49CABFF2CEF7D9F95F5EFB1F7A1A7DDE Key = 000000000200000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EC7F8A47CC59B849469255AD49F62752 Key = 000000000100000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 68FAE55A13EFAF9B07B3552A8A0DC9D1 Key = 000000000080000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 211E6B19C69FAEF481F64F24099CDA65 Key = 000000000040000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DBB918C75BC5732416F79FB0C8EE4C5C Key = 000000000020000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 98D494E5D963A6C8B92536D3EC35E3FD Key = 000000000010000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C9A873404D403D6F074190851D67781A Key = 000000000008000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 073AEF4A7C77D921928CB0DD9D27CAE7 Key = 000000000004000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 89BDE25CEE36FDE769A10E52298CF90F Key = 000000000002000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 26D0842D37EAD38557C65E0A5E5F122E Key = 000000000001000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F8294BA375AF46B3F22905BBAFFAB107 Key = 000000000000800000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2AD63EB4D0D43813B979CF72B35BDB94 Key = 000000000000400000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7710C171EE0F4EFA39BE4C995180181D Key = 000000000000200000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C0CB2B40DBA7BE8C0698FAE1E4B80FF8 Key = 000000000000100000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97970E505194622FD955CA1B80B784E9 Key = 000000000000080000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7CB1824B29F850900DF2CAD9CF04C1CF Key = 000000000000040000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FDF4F036BB988E42F2F62DE63FE19A64 Key = 000000000000020000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 08908CFE2C82606B2C15DF61B75CF3E2 Key = 000000000000010000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B3AA689EF2D07FF365ACB9ADBA2AF07A Key = 000000000000008000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F2672CD8EAA3B98776660D0263656F5C Key = 000000000000004000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5BDEAC00E986687B9E1D94A0DA7BF452 Key = 000000000000002000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E6D57BD66EA1627363EE0C4B711B0B21 Key = 000000000000001000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 03730DD6ACB4AD9996A63BE7765EC06F Key = 000000000000000800000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A470E361AA5437B2BE8586D2F78DE582 Key = 000000000000000400000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7567FEEFA559911FD479670246B484E3 Key = 000000000000000200000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 29829DEA15A4E7A4C049045E7B106E29 Key = 000000000000000100000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A407834C3D89D48A2CB7A152208FA4ED Key = 000000000000000080000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 68F948053F78FEF0D8F9FE7EF3A89819 Key = 000000000000000040000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B605174CAB13AD8FE3B20DA3AE7B0234 Key = 000000000000000020000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CCAB8F0AEBFF032893996D383CBFDBFA Key = 000000000000000010000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AF14BB8428C9730B7DC17B6C1CBEBCC8 Key = 000000000000000008000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5A41A21332040877EB7B89E8E80D19FE Key = 000000000000000004000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AC1BA52EFCDDE368B1596F2F0AD893A0 Key = 000000000000000002000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 41B890E31B9045E6ECDC1BC3F2DB9BCC Key = 000000000000000001000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4D54A549728E55B19A23660424A0F146 Key = 000000000000000000800000000000000000000000000000 In = 00000000000000000000000000000000 Out = A917581F41C47C7DDCFFD5285E2D6A61 Key = 000000000000000000400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 604DF24BA6099B93A7405A524D764FCB Key = 000000000000000000200000000000000000000000000000 In = 00000000000000000000000000000000 Out = 78D9D156F28B190E232D1B7AE7FC730A Key = 000000000000000000100000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5A12C39E442CD7F27B3CD77F5D029582 Key = 000000000000000000080000000000000000000000000000 In = 00000000000000000000000000000000 Out = FF2BF2F47CF7B0F28EE25AF95DBF790D Key = 000000000000000000040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1863BB7D193BDA39DF090659EB8AE48B Key = 000000000000000000020000000000000000000000000000 In = 00000000000000000000000000000000 Out = 38178F2FB4CFCF31E87E1ABCDC023EB5 Key = 000000000000000000010000000000000000000000000000 In = 00000000000000000000000000000000 Out = F5B13DC690CC0D541C6BA533023DC8C9 Key = 000000000000000000008000000000000000000000000000 In = 00000000000000000000000000000000 Out = 48EC05238D7375D126DC9D08884D4827 Key = 000000000000000000004000000000000000000000000000 In = 00000000000000000000000000000000 Out = ACD0D81139691B310B92A6E377BACC87 Key = 000000000000000000002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9A4AA43578B55CE9CC178F0D2E162C79 Key = 000000000000000000001000000000000000000000000000 In = 00000000000000000000000000000000 Out = 08AD94BC737DB3C87D49B9E01B720D81 Key = 000000000000000000000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 3BCFB2D5D210E8332900C5991D551A2A Key = 000000000000000000000400000000000000000000000000 In = 00000000000000000000000000000000 Out = C5F0C6B9397ACB29635CE1A0DA2D8D96 Key = 000000000000000000000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 844A29EFC693E2FA9900F87FBF5DCD5F Key = 000000000000000000000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 5126A1C41051FEA158BE41200E1EA59D Key = 000000000000000000000080000000000000000000000000 In = 00000000000000000000000000000000 Out = 302123CA7B4F46D667FFFB0EB6AA7703 Key = 000000000000000000000040000000000000000000000000 In = 00000000000000000000000000000000 Out = A9D16BCE7DB5C024277709EE2A88D91A Key = 000000000000000000000020000000000000000000000000 In = 00000000000000000000000000000000 Out = F013C5EC123A26CFC34B598C992A996B Key = 000000000000000000000010000000000000000000000000 In = 00000000000000000000000000000000 Out = E38A825CD971A1D2E56FB1DBA248F2A8 Key = 000000000000000000000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 6E701773C0311E0BD4C5A097406D22B3 Key = 000000000000000000000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 754262CEF0C64BE4C3E67C35ABE439F7 Key = 000000000000000000000002000000000000000000000000 In = 00000000000000000000000000000000 Out = C9C2D4C47DF7D55CFA0EE5F1FE5070F4 Key = 000000000000000000000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 6AB4BEA85B172573D8BD2D5F4329F13D Key = 000000000000000000000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 11F03EF28E2CC9AE5165C587F7396C8C Key = 000000000000000000000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 0682F2EB1A68BAC7949922C630DD27FA Key = 000000000000000000000000200000000000000000000000 In = 00000000000000000000000000000000 Out = ABB0FEC0413D659AFE8E3DCF6BA873BB Key = 000000000000000000000000100000000000000000000000 In = 00000000000000000000000000000000 Out = FE86A32E19F805D6569B2EFADD9C92AA Key = 000000000000000000000000080000000000000000000000 In = 00000000000000000000000000000000 Out = E434E472275D1837D3D717F2EECC88C3 Key = 000000000000000000000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 74E57DCD12A21D26EF8ADAFA5E60469A Key = 000000000000000000000000020000000000000000000000 In = 00000000000000000000000000000000 Out = C275429D6DAD45DDD423FA63C816A9C1 Key = 000000000000000000000000010000000000000000000000 In = 00000000000000000000000000000000 Out = 7F6EC1A9AE729E86F7744AED4B8F4F07 Key = 000000000000000000000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 48B5A71AB9292BD4F9E608EF102636B2 Key = 000000000000000000000000004000000000000000000000 In = 00000000000000000000000000000000 Out = 076FB95D5F536C78CBED3181BCCF3CF1 Key = 000000000000000000000000002000000000000000000000 In = 00000000000000000000000000000000 Out = BFA76BEA1E684FD3BF9256119EE0BC0F Key = 000000000000000000000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 7D395923D56577F3FF8670998F8C4A71 Key = 000000000000000000000000000800000000000000000000 In = 00000000000000000000000000000000 Out = BA02C986E529AC18A882C34BA389625F Key = 000000000000000000000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 3DFCF2D882AFE75D3A191193013A84B5 Key = 000000000000000000000000000200000000000000000000 In = 00000000000000000000000000000000 Out = FAD1FDE1D0241784B63080D2C74D236C Key = 000000000000000000000000000100000000000000000000 In = 00000000000000000000000000000000 Out = 7D6C80D39E41F007A14FB9CD2B2C15CD Key = 000000000000000000000000000080000000000000000000 In = 00000000000000000000000000000000 Out = 7975F401FC10637BB33EA2DB058FF6EC Key = 000000000000000000000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 657983865C55A818F02B7FCD52ED7E99 Key = 000000000000000000000000000020000000000000000000 In = 00000000000000000000000000000000 Out = B32BEB1776F9827FF4C3AC9997E84B20 Key = 000000000000000000000000000010000000000000000000 In = 00000000000000000000000000000000 Out = 2AE2C7C374F0A41E3D46DBC3E66BB59F Key = 000000000000000000000000000008000000000000000000 In = 00000000000000000000000000000000 Out = 4D835E4ABDD4BDC6B88316A6E931A07F Key = 000000000000000000000000000004000000000000000000 In = 00000000000000000000000000000000 Out = E07EFABFF1C353F7384EBB87B435A3F3 Key = 000000000000000000000000000002000000000000000000 In = 00000000000000000000000000000000 Out = ED3088DC3FAF89AD87B4356FF1BB09C2 Key = 000000000000000000000000000001000000000000000000 In = 00000000000000000000000000000000 Out = 4324D01140C156FC898C2E32BA03FB05 Key = 000000000000000000000000000000800000000000000000 In = 00000000000000000000000000000000 Out = BE15D016FACB5BAFBC24FA9289132166 Key = 000000000000000000000000000000400000000000000000 In = 00000000000000000000000000000000 Out = AC9B7048EDB1ACF4D97A5B0B3F50884B Key = 000000000000000000000000000000200000000000000000 In = 00000000000000000000000000000000 Out = 448BECE1F86C7845DFA9A4BB2A016FB3 Key = 000000000000000000000000000000100000000000000000 In = 00000000000000000000000000000000 Out = 10DD445E87686EB46EA9B1ABC49257F0 Key = 000000000000000000000000000000080000000000000000 In = 00000000000000000000000000000000 Out = B7FCCF7659FA756D4B7303EEA6C07458 Key = 000000000000000000000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 289117115CA3513BAA7640B1004872C2 Key = 000000000000000000000000000000020000000000000000 In = 00000000000000000000000000000000 Out = 57CB42F7EE7186051F50B93FFA7B35BF Key = 000000000000000000000000000000010000000000000000 In = 00000000000000000000000000000000 Out = F2741BFBFB81663B9136802FB9C3126A Key = 000000000000000000000000000000008000000000000000 In = 00000000000000000000000000000000 Out = E32DDDC5C7398C096E3BD535B31DB5CE Key = 000000000000000000000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 81D3C204E608AF9CC713EAEBCB72433F Key = 000000000000000000000000000000002000000000000000 In = 00000000000000000000000000000000 Out = D4DEEF4BFC36AAA579496E6935F8F98E Key = 000000000000000000000000000000001000000000000000 In = 00000000000000000000000000000000 Out = C356DB082B97802B038571C392C5C8F6 Key = 000000000000000000000000000000000800000000000000 In = 00000000000000000000000000000000 Out = A3919ECD4861845F2527B77F06AC6A4E Key = 000000000000000000000000000000000400000000000000 In = 00000000000000000000000000000000 Out = A53858E17A2F802A20E40D44494FFDA0 Key = 000000000000000000000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 5D989E122B78C758921EDBEEB827F0C0 Key = 000000000000000000000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 4B1C0C8F9E7830CC3C4BE7BD226FA8DE Key = 000000000000000000000000000000000080000000000000 In = 00000000000000000000000000000000 Out = 82C40C5FD897FBCA7B899C70713573A1 Key = 000000000000000000000000000000000040000000000000 In = 00000000000000000000000000000000 Out = ED13EE2D45E00F75CCDB51EA8E3E36AD Key = 000000000000000000000000000000000020000000000000 In = 00000000000000000000000000000000 Out = F121799EEFE8432423176A3CCF6462BB Key = 000000000000000000000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 4FA0C06F07997E98271DD86F7B355C50 Key = 000000000000000000000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 849EB364B4E81D058649DC5B1BF029B9 Key = 000000000000000000000000000000000004000000000000 In = 00000000000000000000000000000000 Out = F48F9E0DE8DE7AD944A207809335D9B1 Key = 000000000000000000000000000000000002000000000000 In = 00000000000000000000000000000000 Out = E59E9205B5A81A4FD26DFCF308966022 Key = 000000000000000000000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 3A91A1BE14AAE9ED700BDF9D70018804 Key = 000000000000000000000000000000000000800000000000 In = 00000000000000000000000000000000 Out = 8ABAD78DCB79A48D79070E7DA89664EC Key = 000000000000000000000000000000000000400000000000 In = 00000000000000000000000000000000 Out = B68377D98AAE6044938A7457F6C649D9 Key = 000000000000000000000000000000000000200000000000 In = 00000000000000000000000000000000 Out = E4E1275C42F5F1B63D662C099D6CE33D Key = 000000000000000000000000000000000000100000000000 In = 00000000000000000000000000000000 Out = 7DEF32A34C6BE668F17DA1BB193B06EF Key = 000000000000000000000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 78B6000CC3D30CB3A74B68D0EDBD2B53 Key = 000000000000000000000000000000000000040000000000 In = 00000000000000000000000000000000 Out = 0A47531DE88DD8AE5C23EAE4F7D1F2D5 Key = 000000000000000000000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 667B24E8000CF68231EC484581D922E5 Key = 000000000000000000000000000000000000010000000000 In = 00000000000000000000000000000000 Out = 39DAA5EBD4AACAE130E9C33236C52024 Key = 000000000000000000000000000000000000008000000000 In = 00000000000000000000000000000000 Out = E3C88760B3CB21360668A63E55BB45D1 Key = 000000000000000000000000000000000000004000000000 In = 00000000000000000000000000000000 Out = F131EE903C1CDB49D416866FD5D8DE51 Key = 000000000000000000000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 7A1916135B0447CF4033FC13047A583A Key = 000000000000000000000000000000000000001000000000 In = 00000000000000000000000000000000 Out = F7D55FB27991143DCDFA90DDF0424FCB Key = 000000000000000000000000000000000000000800000000 In = 00000000000000000000000000000000 Out = EA93E7D1CA1111DBD8F7EC111A848C0C Key = 000000000000000000000000000000000000000400000000 In = 00000000000000000000000000000000 Out = 2A689E39DFD3CBCBE221326E95888779 Key = 000000000000000000000000000000000000000200000000 In = 00000000000000000000000000000000 Out = C1CE399CA762318AC2C40D1928B4C57D Key = 000000000000000000000000000000000000000100000000 In = 00000000000000000000000000000000 Out = D43FB6F2B2879C8BFAF0092DA2CA63ED Key = 000000000000000000000000000000000000000080000000 In = 00000000000000000000000000000000 Out = 224563E617158DF97650AF5D130E78A5 Key = 000000000000000000000000000000000000000040000000 In = 00000000000000000000000000000000 Out = 6562FDF6833B7C4F7484AE6EBCC243DD Key = 000000000000000000000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 93D58BA7BED22615D661D002885A7457 Key = 000000000000000000000000000000000000000010000000 In = 00000000000000000000000000000000 Out = 9A0EF559003AD9E52D3E09ED3C1D3320 Key = 000000000000000000000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 96BAF5A7DC6F3DD27EB4C717A85D261C Key = 000000000000000000000000000000000000000004000000 In = 00000000000000000000000000000000 Out = B8762E06884900E8452293190E19CCDB Key = 000000000000000000000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 785416A22BD63CBABF4B1789355197D3 Key = 000000000000000000000000000000000000000001000000 In = 00000000000000000000000000000000 Out = A0D20CE1489BAA69A3612DCE90F7ABF6 Key = 000000000000000000000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 700244E93DC94230CC607FFBA0E48F32 Key = 000000000000000000000000000000000000000000400000 In = 00000000000000000000000000000000 Out = 85329E476829F872A2B4A7E59F91FF2D Key = 000000000000000000000000000000000000000000200000 In = 00000000000000000000000000000000 Out = E4219B4935D988DB719B8B8B2B53D247 Key = 000000000000000000000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 6ACDD04FD13D4DB4409FE8DD13FD737B Key = 000000000000000000000000000000000000000000080000 In = 00000000000000000000000000000000 Out = 9EB7A670AB59E15BE582378701C1EC14 Key = 000000000000000000000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 29DF2D6935FE657763BC7A9F22D3D492 Key = 000000000000000000000000000000000000000000020000 In = 00000000000000000000000000000000 Out = 99303359D4A13AFDBE6C784028CE533A Key = 000000000000000000000000000000000000000000010000 In = 00000000000000000000000000000000 Out = FF5C70A6334545F33B9DBF7BEA0417CA Key = 000000000000000000000000000000000000000000008000 In = 00000000000000000000000000000000 Out = 289F58A17E4C50EDA4269EFB3DF55815 Key = 000000000000000000000000000000000000000000004000 In = 00000000000000000000000000000000 Out = EA35DCB416E9E1C2861D1682F062B5EB Key = 000000000000000000000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 3A47BF354BE775383C50B0C0A83E3A58 Key = 000000000000000000000000000000000000000000001000 In = 00000000000000000000000000000000 Out = BF6C1DC069FB95D05D43B01D8206D66B Key = 000000000000000000000000000000000000000000000800 In = 00000000000000000000000000000000 Out = 046D1D580D5898DA6595F32FD1F0C33D Key = 000000000000000000000000000000000000000000000400 In = 00000000000000000000000000000000 Out = 5F57803B7B82A110F7E9855D6A546082 Key = 000000000000000000000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 25336ECF34E7BE97862CDFF715FF05A8 Key = 000000000000000000000000000000000000000000000100 In = 00000000000000000000000000000000 Out = ACBAA2A943D8078022D693890E8C4FEF Key = 000000000000000000000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 3947597879F6B58E4E2F0DF825A83A38 Key = 000000000000000000000000000000000000000000000040 In = 00000000000000000000000000000000 Out = 4EB8CC3335496130655BF3CA570A4FC0 Key = 000000000000000000000000000000000000000000000020 In = 00000000000000000000000000000000 Out = BBDA7769AD1FDA425E18332D97868824 Key = 000000000000000000000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 5E7532D22DDB0829A29C868198397154 Key = 000000000000000000000000000000000000000000000008 In = 00000000000000000000000000000000 Out = E66DA67B630AB7AE3E682855E1A1698E Key = 000000000000000000000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 4D93800F671B48559A64D1EA030A590A Key = 000000000000000000000000000000000000000000000002 In = 00000000000000000000000000000000 Out = F33159FCC7D9AE30C062CD3B322AC764 Key = 000000000000000000000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 8BAE4EFB70D33A9792EEA9BE70889D72 Key = 000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = 6CD02513E8D4DC986B4AFE087A60BD0C Key = 000000000000000000000000000000000000000000000000 In = 40000000000000000000000000000000 Out = 423D2772A0CA56DAABB48D2129062987 Key = 000000000000000000000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 1021F2A8DA70EB2219DC16804445FF98 Key = 000000000000000000000000000000000000000000000000 In = 10000000000000000000000000000000 Out = C636E35B402577F96974D8804295EBB8 Key = 000000000000000000000000000000000000000000000000 In = 08000000000000000000000000000000 Out = 1566D2E57E8393C19E29F892EA28A9A7 Key = 000000000000000000000000000000000000000000000000 In = 04000000000000000000000000000000 Out = 883C878FED70B36CC09D040F9619DD19 Key = 000000000000000000000000000000000000000000000000 In = 02000000000000000000000000000000 Out = 06734593A974965790E715594FC34AA9 Key = 000000000000000000000000000000000000000000000000 In = 01000000000000000000000000000000 Out = F19B389948D9A45534E5BD36C984134A Key = 000000000000000000000000000000000000000000000000 In = 00800000000000000000000000000000 Out = D8410DFC14FA6D175EC968EA8CAC514C Key = 000000000000000000000000000000000000000000000000 In = 00400000000000000000000000000000 Out = 7E6C6EBB4029A177CF7B2FDD9AC6BB7A Key = 000000000000000000000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 4B51DD4850DC0A6C3A46D924003D2C27 Key = 000000000000000000000000000000000000000000000000 In = 00100000000000000000000000000000 Out = 2E510A9D917B15BE32A192B12A668F23 Key = 000000000000000000000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 88F6F79962B0FB77FEA8E7C632D3108E Key = 000000000000000000000000000000000000000000000000 In = 00040000000000000000000000000000 Out = A3A35AB1D88DAF07B52794A0F065383A Key = 000000000000000000000000000000000000000000000000 In = 00020000000000000000000000000000 Out = DC6CC878433E2B3BB193049A4ECBFC53 Key = 000000000000000000000000000000000000000000000000 In = 00010000000000000000000000000000 Out = EFCD3763EB7B1A415938248A9A5B4FD5 Key = 000000000000000000000000000000000000000000000000 In = 00008000000000000000000000000000 Out = AB7E9FB9A66DBE5BB44854F07D9015EE Key = 000000000000000000000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 8B8E9D3365F8F6743ECF7E33E99255A4 Key = 000000000000000000000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 54D37B4F176FF3D8F6AFC866066D8572 Key = 000000000000000000000000000000000000000000000000 In = 00001000000000000000000000000000 Out = E83310889480FBF3C00342E3126D0D02 Key = 000000000000000000000000000000000000000000000000 In = 00000800000000000000000000000000 Out = D321AB2511F92F098174AA2DE6E85DA2 Key = 000000000000000000000000000000000000000000000000 In = 00000400000000000000000000000000 Out = D8E3F40B1112D5149D58C481DFA9983F Key = 000000000000000000000000000000000000000000000000 In = 00000200000000000000000000000000 Out = 2454C4E0806639DDF19854D6C68054AD Key = 000000000000000000000000000000000000000000000000 In = 00000100000000000000000000000000 Out = A5506D410F7CA32F3955DD79D9D09418 Key = 000000000000000000000000000000000000000000000000 In = 00000080000000000000000000000000 Out = 7908EE40677699568A7DC1AA317C7E4E Key = 000000000000000000000000000000000000000000000000 In = 00000040000000000000000000000000 Out = B4B7B29DD43B2F5CF765E25192273982 Key = 000000000000000000000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 92AFE9668159BEFFE2A86F8503260164 Key = 000000000000000000000000000000000000000000000000 In = 00000010000000000000000000000000 Out = 5C36A232FBA6D187A84657AD4028B18F Key = 000000000000000000000000000000000000000000000000 In = 00000008000000000000000000000000 Out = A2E994DFAB3A798DF8F54F6DA87E58E2 Key = 000000000000000000000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 6CDAB10A72ADF77D71D0765BAAE95631 Key = 000000000000000000000000000000000000000000000000 In = 00000002000000000000000000000000 Out = 9FE3C801BCAAF7BB800F2E6BF3278E21 Key = 000000000000000000000000000000000000000000000000 In = 00000001000000000000000000000000 Out = B459D90D9A6C392E5493BC91CF5A0863 Key = 000000000000000000000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 0518A9FA5007F6787E0FB4E5AC27D758 Key = 000000000000000000000000000000000000000000000000 In = 00000000400000000000000000000000 Out = BED9795415D28599700ED7952384A963 Key = 000000000000000000000000000000000000000000000000 In = 00000000200000000000000000000000 Out = F0140421173D60251EF6CAB0229B1B50 Key = 000000000000000000000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 460EB4652B3F6779EA28CB11B37529ED Key = 000000000000000000000000000000000000000000000000 In = 00000000080000000000000000000000 Out = C4283D351C960A6AC13CD19CCF03AE38 Key = 000000000000000000000000000000000000000000000000 In = 00000000040000000000000000000000 Out = 6815A10047B2C834A798EBDCC6786C75 Key = 000000000000000000000000000000000000000000000000 In = 00000000020000000000000000000000 Out = 99BA19F0CDD5990D0386B32CE56C9C4C Key = 000000000000000000000000000000000000000000000000 In = 00000000010000000000000000000000 Out = DE76F62C61E07915162DA13E79679DEC Key = 000000000000000000000000000000000000000000000000 In = 00000000008000000000000000000000 Out = DD0325D6854803D06D1D2277D5FB8D67 Key = 000000000000000000000000000000000000000000000000 In = 00000000004000000000000000000000 Out = 580B71A41DE37D6FAC83CCB0B3BB1C97 Key = 000000000000000000000000000000000000000000000000 In = 00000000002000000000000000000000 Out = E9B1AB470A1B02EF0FF5E6754A092C96 Key = 000000000000000000000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 8590620F5AF5993B7410282F4126BC1F Key = 000000000000000000000000000000000000000000000000 In = 00000000000800000000000000000000 Out = 8D4914D2F1B22B2E268E66E532D29D7C Key = 000000000000000000000000000000000000000000000000 In = 00000000000400000000000000000000 Out = FD826CE48E62C5E30867044B86BA4B56 Key = 000000000000000000000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 100E7B831C9F35FA1271F5F1316C6FCF Key = 000000000000000000000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 0A2DD0C17F68B996AA96C007003D0B31 Key = 000000000000000000000000000000000000000000000000 In = 00000000000080000000000000000000 Out = C95F68C57E06B0A2E1F623C83C5D80BF Key = 000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 571CAFC92C7C8A5EC54C0741E186905C Key = 000000000000000000000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 22514353E95312C112255E1EED0B2DF6 Key = 000000000000000000000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 791A8BF462BD17580BD9152C6D11C6C5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000008000000000000000000 Out = 5882A0178D548F84A165DB809C60DC28 Key = 000000000000000000000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 3CE4A90EED4458CA6039E42DDADB71C3 Key = 000000000000000000000000000000000000000000000000 In = 00000000000002000000000000000000 Out = D3CBAB261207A16BE2751E77044FD7C9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000001000000000000000000 Out = 24E32B698A7B32217093628B01F424AB Key = 000000000000000000000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 9F6AFC0AF27CF565110C77E3C24F4F5B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000400000000000000000 Out = E088AA5CDA20EF267BB039B00C72C45B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000200000000000000000 Out = 5CF1018B7E0BA1775601C2E279900360 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 3B1A7388B89FB9416AD8753CF5AF35D2 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 137FA4ED00AFCD9F5D8BC0D14BD5837A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 806F5C9B663559BB56F234881E4A3E60 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000020000000000000000 Out = 8069A449152292DF2DE8642992C632B6 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 37C6CF2A1ABD1B1F1922B46C7B4A280D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 7A2835260E5A0AA2B5DC301800EC8438 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000004000000000000000 Out = EE81FAF2F9058213FFCACF281CB8509E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 57F22D93C37129BA331FDBA38E005A1E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000001000000000000000 Out = EC798782E87B7D9F780CC3C3A46519B5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 43EA28497F5D40E3A4744FA2EDAA42DE Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000400000000000000 Out = 91F004E7DEBF41B3414DD8C5C317372C Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000200000000000000 Out = C249EAE54E7B4DF43B938C1B4CC28314 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 32C289D7EEFB99D2F17AD7B7D45FE1EC Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000080000000000000 Out = A675FB2E8DDBF810CEF01CF2B728CD2B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000040000000000000 Out = A418AAAB6E6921CC731AA8A349386080 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 2E2B0F44863E67D9B0215C4ABD60417F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000010000000000000 Out = F0AF7CB19E911D481F6426DAEFDD2240 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000008000000000000 Out = CB1304DAAA2DF6878F56AC2E0F887E04 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000004000000000000 Out = B1B70A7E6A0CD1916D9B78BEA19084AE Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000002000000000000 Out = 0CDE9F9BE646A5FCE3436B794A9CFC65 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000001000000000000 Out = 68C7946D476A0A36674B36AFD7E5DF33 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000800000000000 Out = 48770159A07DD8DFFF06C80105F8D57C Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000400000000000 Out = 665E62801B3260E3C45BD3BE34DFDEBE Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 4159C1F686BFBE5B0E50BDB0DA532B69 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000100000000000 Out = 6333100A5A4AD917DC2D4E78A04869A3 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 866A4519AB1D199F25886B89D0539ACC Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000040000000000 Out = EC0CFD37E4CBC7E8BE385283F7AEA75A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000020000000000 Out = CA2F383AACCA0810AA13F3E710621422 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 1D0EEF6870444F950937831EC0A55D98 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000008000000000 Out = 37839B35ED6801E7670496D479A95017 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 02317C8C7098C4F94AB867AC7A49DD8D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000002000000000 Out = FFB4CB4E3F7F8BF3367EBD43236518B4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 36BEDEF1E4AA3E4A40A305741713FCBF Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000800000000 Out = B2DFE3C4870269C1E3FEEC39161540D9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000400000000 Out = 147EF2518AD45DA0026056ECBF6A3DFA Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 027A75E4DE635790E47ACE90D7928804 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000100000000 Out = C4CF3CCB59BF87D0AFBD629F48CFBB7B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 35165C93F564C97E1C32EF97E8151A87 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 449DE37F7D5A1BBD628ABBE7E061701D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000020000000 Out = B1D45EAF218F1799B149BAD677FE129F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000010000000 Out = BE08AC6DB6BD0583AA9D2ABC71C73DCD Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000008000000 Out = BCC835BD3DF1A79E4C7C145B899A5C25 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 3D311EA611FF5AF371301C58A8E9912D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000002000000 Out = A5A1BEA594ACC7CA80F09EA5ADDB5C71 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000001000000 Out = 0F09492429FE7222D6CD8190D9F2FFBF Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 816D2220A16B8AAEE71364FD43636C6F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000400000 Out = D7E8702408419ED73191B107EAF75A0B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 9B170EFB1E235B433C78E276BEA082F0 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 03BBECC5598AE974430F29395522F096 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000080000 Out = DB53517766C0E8CF42059607CBA89380 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 2E2AF4B7931F0AEFFAC5471148A5BB97 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000020000 Out = C872C0408266403B984F635FF5683DE4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 15DCF750B0E3A68AD1F4EFD07E8967B4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000008000 Out = B41092048E9E6A749F6FD8CE515A23A3 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 4DA9267D62507994312BD5C99ADDE730 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 9E2FCA6D1D626E9C6A924EBF7DBF618A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000001000 Out = E092E8D7EF2C2465AEFB2493C3063590 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000800 Out = 1C0E58DA37D1068378A88DBE2EDE4E10 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000400 Out = 19063F854232B8509A6A3A6D46809959 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 447FB09E54EFA285F7530F25C4EA0022 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000100 Out = F6ABE86321BE40E1FBFDAFED37CC1D9B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000080 Out = 4E8506CD006666341D6CF51F98B41F35 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 53995DE0009CA18BECAFB8307C54C14C Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000020 Out = 2006BF99F4C58B6CC2627856593FAEEA Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 2DA697D2737CB30B744A4644FA1CBC6E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000008 Out = 47A22ACDB60C3A986A8F76ECD0EA3433 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000004 Out = FDAA17C2CDE20268FE36E164EA532151 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000002 Out = 98E7247C07F0FE411C267E4384B0F600 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = CD33B28AC773F74BA00ED1F312572435 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000008000000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000001 Out = 53995DE0009CA18BECAFB8307C54C14C2006BF99F4C58B6CC2627856593FAEEA2DA697D2737CB30B744A4644FA1CBC6E47A22ACDB60C3A986A8F76ECD0EA3433FDAA17C2CDE20268FE36E164EA53215198E7247C07F0FE411C267E4384B0F600CD33B28AC773F74BA00ED1F312572435 [AES-256] Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F In = 00112233445566778899AABBCCDDEEFF Out = 8EA2B7CA516745BFEAFC49904B496089 Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 In = 834EADFCCAC7E1B30664B1ABA44815AB Out = 1946DABF6A03A2A2C3D0B05080AED6FC Key = 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E In = D9DC4DBA3021B05D67C0518F72B62BF1 Out = 5ED301D747D3CC715445EBDEC62F2FB4 Key = 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = A291D86301A4A739F7392173AA3C604C Out = 6585C8F43D13A6BEAB6419FC5935B9D0 Key = 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E In = 4264B2696498DE4DF79788A9F83E9390 Out = 2A5B56A596680FCC0E05F5E0F151ECAE Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = EE9932B3721804D5A83EF5949245B6F6 Out = F5D6FF414FD2C6181494D20C37F2B8C4 Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = E6248F55C5FDCBCA9CBBB01C88A2EA77 Out = 85399C01F59FFFB5204F19F8482F00B8 Key = F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 In = B8358E41B9DFF65FD461D55A99266247 Out = 92097B4C88A041DDF98144BC8D22E8E7 Key = 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E In = F0E2D72260AF58E21E015AB3A4C0D906 Out = 89BD5B73B356AB412AEF9F76CEA2D65C Key = 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 In = 475B8B823CE8893DB3C44A9F2A379FF7 Out = 2536969093C55FF9454692F2FAC2F530 Key = 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E In = 688F5281945812862F5F3076CF80412F Out = 07FC76A872843F3F6E0081EE9396D637 Key = 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = 08D1D2BC750AF553365D35E75AFACEAA Out = E38BA8EC2AA741358DCC93E8F141C491 Key = B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE In = 8707121F47CC3EFCECA5F9A8474950A1 Out = D028EE23E4A89075D0B03E868D7D3A42 Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 In = E51AA0B135DBA566939C3B6359A980C5 Out = 8CD9423DFC459E547155C5D1D522E540 Key = 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E In = 069A007FC76A459F98BAF917FEDF9521 Out = 080E9517EB1677719ACF728086040AE3 Key = 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 In = 726165C1723FBCF6C026D7D00B091027 Out = 7C1700211A3991FC0ECDED0AB3E576B0 Key = 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E In = D7C544DE91D55CFCDE1F84CA382200CE Out = DABCBCC855839251DB51E224FBE87435 Key = 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 In = FED3C9A161B9B5B2BD611B41DC9DA357 Out = 68D56FAD0406947A4DD27A7448C10F1D Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE In = 4F634CDC6551043409F30B635832CF82 Out = DA9A11479844D1FFEE24BBF3719A9925 Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = 109CE98DB0DFB36734D9F3394711B4E6 Out = 5E4BA572F8D23E738DA9B05BA24B8D81 Key = 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 In = 4EA6DFABA2D8A02FFDFFA89835987242 Out = A115A2065D667E3F0B883837A6E903F8 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = 5AE094F54AF58E6E3CDBF976DAC6D9EF Out = 3E9E90DC33EAC2437D86AD30B137E66E Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = 764D8E8E0F29926DBE5122E66354FDBE Out = 01CE82D8FBCDAE824CB3C48E495C3692 Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E In = 3F0418F888CDF29A982BF6B75410D6A9 Out = 0C9CFF163CE936FAAF083CFD3DEA3117 Key = 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 In = E4A3E7CB12CDD56AA4A75197A9530220 Out = 5131BA9BD48F2BBA85560680DF504B52 Key = 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E In = 211677684AAC1EC1A160F44C4EBF3F26 Out = 9DC503BBF09823AEC8A977A5AD26CCB2 Key = 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 In = D21E439FF749AC8F18D6D4B105E03895 Out = 9A6DB0C0862E506A9E397225884041D7 Key = 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = D9F6FF44646C4725BD4C0103FF5552A7 Out = 430BF9570804185E1AB6365FC6A6860C Key = B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = 0B1256C2A00B976250CFC5B0C37ED382 Out = 3525EBC02F4886E6A5A3762813E8CE8A Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = B056447FFC6DC4523A36CC2E972A3A79 Out = 07FA265C763779CCE224C7BAD671027B Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 In = 5E25CA78F0DE55802524D38DA3FE4456 Out = E8B72B4E8BE243438C9FFF1F0E205872 Key = 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E In = A5BCF4728FA5EAAD8567C0DC24675F83 Out = 109D4F999A0E11ACE1F05E6B22CBCB50 Key = 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = 814E59F97ED84646B78B2CA022E9CA43 Out = 45A5E8D4C3ED58403FF08D68A0CC4029 Key = 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E In = 15478BEEC58F4775C7A7F5D4395514D7 Out = 196865964DB3D417B6BD4D586BCB7634 Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = 253548FFCA461C67C8CBC78CD59F4756 Out = 60436AD45AC7D30D99195F815D98D2AE Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = FD7AD8D73B9B0F8CC41600640F503D65 Out = BB07A23F0B61014B197620C185E2CD75 Key = F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 In = 06199DE52C6CBF8AF954CD65830BCD56 Out = 5BC0B2850129C854423AFF0751FE343B Key = 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E In = F17C4FFE48E44C61BD891E257E725794 Out = 7541A78F96738E6417D2A24BD2BECA40 Key = 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 In = 9A5B4A402A3E8A59BE6BF5CD8154F029 Out = B0A303054412882E464591F1546C5B9E Key = 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E In = 79BD40B91A7E07DC939D441782AE6B17 Out = 778C06D8A355EEEE214FCEA14B4E0EEF Key = 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = D8CEAAF8976E5FBE1012D8C84F323799 Out = 09614206D15CBACE63227D06DB6BEEBB Key = B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE In = 3316E2751E2E388B083DA23DD6AC3FBE Out = 41B97FB20E427A9FDBBB358D9262255D Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 In = 8B7CFBE37DE7DCA793521819242C5816 Out = C1940F703D845F957652C2D64ABD7ADF Key = 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E In = F23F033C0EEBF8EC55752662FD58CE68 Out = D2D44FCDAE5332343366DB297EFCF21B Key = 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 In = 59EB34F6C8BDBACC5FC6AD73A59A1301 Out = EA8196B79DBE167B6AA9896E287EED2B Key = 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E In = DCDE8B6BD5CF7CC22D9505E3CE81261A Out = D6B0B0C4BA6C7DBE5ED467A1E3F06C2D Key = 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 In = E33CF7E524FED781E7042FF9F4B35DC7 Out = EC51EB295250C22C2FB01816FB72BCAE Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE In = 27963C8FACDF73062867D164DF6D064C Out = ADED6630A07CE9C7408A155D3BD0D36F Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = 77B1CE386B551B995F2F2A1DA994EEF8 Out = 697C9245B9937F32F5D1C82319F0363A Key = F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E In = F083388B013679EFCF0BB9B15D52AE5C Out = AAD5AD50C6262AAEC30541A1B7B5B19C Key = 20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 In = C5009E0DAB55DB0ABDB636F2600290C8 Out = 7D34B893855341EC625BD6875AC18C0D Key = 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E In = 7804881E26CD532D8514D3683F00F1B9 Out = 7EF05105440F83862F5D780E88F02B41 Key = 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 In = 46CDDCD73D1EB53E675CA012870A92A3 Out = C377C06403382061AF2C9C93A8E70DF6 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = A9FB44062BB07FE130A8E8299EACB1AB Out = 1DBDB3FFDC052DACC83318853ABC6DE5 Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = 2B6FF8D7A5CC3A28A22D5A6F221AF26B Out = 69A6EAB00432517D0BF483C91C0963C7 Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E In = 1A9527C29B8ADD4B0E3E656DBB2AF8B4 Out = 0797F41DC217C80446E1D514BD6AB197 Key = 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 In = 7F99CF2C75244DF015EB4B0C1050AEAE Out = 9DFD76575902A637C01343C58E011A03 Key = 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E In = E84FF85B0D9454071909C1381646C4ED Out = ACF4328AE78F34B9FA9B459747CC2658 Key = 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 In = 89AFD40F99521280D5399B12404F6DB4 Out = B0479AEA12BAC4FE2384CF98995150C6 Key = 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = A09EF32DBC5119A35AB7FA38656F0329 Out = 9DD52789EFE3FFB99F33B3DA5030109A Key = B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = 61773457F068C376C7829B93E696E716 Out = ABBB755E4621EF8F1214C19F649FB9FD Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = A34F0CAE726CCE41DD498747D891B967 Out = DA27FB8174357BCE2BED0E7354F380F9 Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 In = 856F59496C7388EE2D2B1A27B7697847 Out = C59A0663F0993838F6E5856593BDC5EF Key = 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E In = CB090C593EF7720BD95908FB93B49DF4 Out = ED60B264B5213E831607A99C0CE5E57E Key = 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = A0AC75CD2F1923D460FC4D457AD95BAF Out = E50548746846F3EB77B8C520640884ED Key = 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E In = 2A2B282974777689E8E9EEEF525D5C5F Out = 28282CC7D21D6A2923641E52D188EF0C Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = 909192939390919E0F0E09089788898A Out = 0DFA5B02ABB18E5A815305216D6D4F8E Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = 777675748D8E8F907170777649464744 Out = 7359635C0EECEFE31D673395FB46FB99 Key = F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 In = 717073720605040B2D2C2B2A05FAFBF9 Out = 73C679F7D5AEF2745C9737BB4C47FB36 Key = 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E In = 64656667FEFDFCC31B1A1D1CA5AAABA8 Out = B192BD472A4D2EAFB786E97458967626 Key = 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 In = DBDAD9D86A696867B5B4B3B2C8D7D6D5 Out = 0EC327F6C8A2B147598CA3FDE61DC6A4 Key = 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E In = 5C5D5E5FE3E0E1FE31303736333C3D3E Out = FC418EB3C41B859B38D4B6F646629729 Key = 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = 545556574B48494673727574546B6A69 Out = 30249E5AC282B1C981EA64B609F3A154 Key = B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE In = ECEDEEEFC6C5C4BB56575051F5FAFBF8 Out = 5E6E08646D12150776BB43C2D78A9703 Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 In = 464744452724252AC9C8CFCED2CDCCCF Out = FAEB3D5DE652CD3447DCEB343F30394A Key = 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E In = E6E7E4E54142435C878681801C131211 Out = A8E88706823F6993EF80D05C1C7B2CF0 Key = 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 In = 72737071CFCCCDC2F9F8FFFE710E0F0C Out = 8CED86677E6E00A1A1B15968F2D3CCE6 Key = 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E In = 505152537370714EC3C2C5C4010E0F0C Out = 9FC7C23858BE03BDEBB84E90DB6786A9 Key = 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 In = A8A9AAAB5C5F5E51AEAFA8A93D222320 Out = B4FBD65B33F70D8CF7F1111AC4649C36 Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE In = DEDFDCDDF6F5F4EB10111617FEF1F0F3 Out = C5C32D5ED03C4B53CC8C1BD0EF0DBBF6 Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7 Out = D1A7F03B773E5C212464B63709C6A891 Key = F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E In = 8A8B8889050606F8F4F5F2F3636C6D6E Out = 6B7161D8745947AC6950438EA138D028 Key = 20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 In = A6A7A4A54D4E4F40B2B3B4B539262724 Out = FD47A9F7E366EE7A09BC508B00460661 Key = 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E In = 9C9D9E9FE9EAEBF40E0F08099B949596 Out = 00D40B003DC3A0D9310B659B98C7E416 Key = 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 In = 2D2C2F2E1013121DCCCDCACBED121310 Out = EEA4C79DCC8E2BDA691F20AC48BE0717 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA Out = E78F43B11C204403E5751F89D05A2509 Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = 3D3C3F3E282B2A2573727574150A0B08 Out = D0F0E3D1F1244BB979931E38DD1786EF Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E In = B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD Out = 042E639DC4E1E4DDE7B75B749EA6F765 Key = 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 In = B7B6B5B4989B9A95878681809BA4A5A6 Out = BC032FDD0EFE29503A980A7D07AB46A8 Key = 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E In = A8A9AAABE5E6E798E9E8EFEE4748494A Out = 0C93AC949C0DA6446EFFB86183B6C910 Key = 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 In = ECEDEEEFD9DADBD4B9B8BFBE657A7B78 Out = E0D343E14DA75C917B4A5CEC4810D7C2 Key = 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = 7F7E7D7C696A6B74CACBCCCD929D9C9F Out = 0EAFB821748408279B937B626792E619 Key = B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = 08090A0B0605040BFFFEF9F8B9C6C7C4 Out = FA1AC6E02D23B106A1FEF18B274A553F Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = 08090A0BF1F2F3CCFCFDFAFB68676665 Out = 0DADFE019CD12368075507DF33C1A1E9 Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 In = CACBC8C93A393837050403020D121310 Out = 3A0879B414465D9FFBAF86B33A63A1B9 Key = 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E In = E9E8EBEA8281809F8F8E8988343B3A39 Out = 62199FADC76D0BE1805D3BA0B7D914BF Key = 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = 515053524645444BD0D1D6D7340B0A09 Out = 1B06D6C5D333E742730130CF78E719B4 Key = 78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E In = 42434041ECEFEE1193929594C6C9C8CB Out = F1F848824C32E9DCDCBF21580F069329 Key = A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 In = EFEEEDECC2C1C0CF76777071455A5B58 Out = 1A09050CBD684F784D8E965E0782F28A Key = C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE In = 5F5E5D5C3F3C3D221D1C1B1A19161714 Out = 79C2969E7DED2BA7D088F3F320692360 Key = F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 In = 000102034142434C1C1D1A1B8D727371 Out = 091A658A2F7444C16ACCB669450C7B63 Key = 18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E In = 8E8F8C8DB1B2B38C56575051050A0B08 Out = 97C1E3A72CCA65FA977D5ED0E8A7BBFC Key = 40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 In = A7A6A5A4E8EBEAE57F7E7978CAD5D4D7 Out = 70C430C6DB9A17828937305A2DF91A2A Key = 68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E In = 8A8B888994979689454443429F909192 Out = 629553457FBE2479098571C7C903FDE8 Key = 90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 In = 8C8D8E8FE0E3E2ED45444342F1CECFCC Out = A25B25A61F612669E7D91265C7D476BA Key = B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE In = FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB Out = EB7E4E49B8AE0F024570DDA293254FED Key = E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 In = FDFCFFFECCCFCEC12F2E29286679787B Out = 38FE15D61CCA84516E924ADCE5014F67 Key = 08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E In = 67666564BAB9B8A77071767719161714 Out = 3AD208492249108C9F3EBEB167AD0583 Key = 30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 In = 9A9B98992D2E2F2084858283245B5A59 Out = 299BA9F9BF5AB05C3580FC26EDD1ED12 Key = 58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E In = A4A5A6A70B0809365C5D5A5B2C232221 Out = 19DC705B857A60FB07717B2EA5717781 Key = 80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 In = 464744455754555AF3F2F5F4AFB0B1B2 Out = FFC8AEB885B5EFCAD06B6DBEBF92E76B Key = A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE In = 323330317675746B7273747549464744 Out = F58900C5E0B385253FF2546250A0142B Key = D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 In = A8A9AAAB181B1A15808186872B141516 Out = 2EE67B56280BC462429CEE6E3370CBC1 Key = F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E In = E7E6E5E4202323DDAAABACAD343B3A39 Out = 20DB650A9C8E9A84AB4D25F7EDC8F03F Key = 20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 In = A8A9AAAB2221202FEDECEBEA1E010003 Out = 3C36DA169525CF818843805F25B78AE5 Key = 48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E In = F9F8FBFA5F5C5D42424344450E010003 Out = 9A781D960DB9E45E37779042FEA51922 Key = 70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 In = 57565554F5F6F7F89697909120DFDEDD Out = 6560395EC269C672A3C288226EFDBA77 Key = 98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE In = F8F9FAFBCCCFCEF1DDDCDBDA0E010003 Out = 8C772B7A189AC544453D5916EBB27B9A Key = C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 In = D9D8DBDA7073727D80818687C2DDDCDF Out = 77CA5468CC48E843D05F78EED9D6578F Key = E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E In = C5C4C7C6080B0A1588898E8F68676665 Out = 72CDCC71DC82C60D4429C9E2D8195BAA Key = 10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 In = 83828180DCDFDED186878081F0CFCECD Out = 8080D68CE60E94B40B5B8B69EEB35AFA Key = 38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E In = 98999A9BDDDEDFA079787F7E0A050407 Out = 44222D3CDE299C04369D58AC0EBA1E8E Key = 60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 In = CECFCCCD4F4C4D429F9E9998DFC0C1C2 Out = 9B8721B0A8DFC691C5BC5885DBFCB27A Key = 88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE In = 404142436665647B29282F2EABA4A5A6 Out = 0DC015CE9A3A3414B5E62EC643384183 Key = B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 In = 33323130E6E5E4EB23222524DEA1A0A3 Out = 705715448A8DA412025CE38345C2A148 Key = D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE In = CFCECDCCF6F5F4CBE6E7E0E199969794 Out = C32B5B0B6FBAE165266C569F4B6ECF0B Key = 00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 In = BABBB8B97271707FDCDDDADB29363734 Out = 4DCA6C75192A01DDCA9476AF2A521E87 Key = 28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E In = C9C8CBCA4447465926272021545B5A59 Out = 058691E627ECBC36AC07B6DB423BD698 Key = 50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 In = 050407067477767956575051221D1C1F Out = 7444527095838FE080FC2BCDD30847EB Key = 8000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E35A6DCB19B201A01EBCFA8AA22B5759 Key = 4000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5075C2405B76F22F553488CAE47CE90B Key = 2000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 49DF95D844A0145A7DE01C91793302D3 Key = 1000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E7396D778E940B8418A86120E5F421FE Key = 0800000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 05F535C36FCEDE4657BE37F4087DB1EF Key = 0400000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D0C1DDDD10DA777C68AB36AF51F2C204 Key = 0200000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1C55FB811B5C6464C4E5DE1535A75514 Key = 0100000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 52917F3AE957D5230D3A2AF57C7B5A71 Key = 0080000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C6E3D5501752DD5E9AEF086D6B45D705 Key = 0040000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A24A9C7AF1D9B1E17E1C9A3E711B3FA7 Key = 0020000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B881ECA724A6D43DBC6B96F6F59A0D20 Key = 0010000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EC524D9A24DFFF2A9639879B83B8E137 Key = 0008000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 34C4F345F5466215A037F443635D6F75 Key = 0004000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5BA5055BEDB8895F672E29F2EB5A355D Key = 0002000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B3F692AA3A435259EBBEF9B51AD1E08D Key = 0001000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 414FEB4376F2C64A5D2FBB2ED531BA7D Key = 0000800000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A20D519E3BCA3303F07E81719F61605E Key = 0000400000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A08D10E520AF811F45BD60A2DC0DC4B1 Key = 0000200000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B06893A8C563C430E6F3858826EFBBE4 Key = 0000100000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0FFEE26AE2D3929C6BD9C6BEDFF84409 Key = 0000080000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4D0F5E906ED77801FC0EF53EDC5F9E2B Key = 0000040000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B6EC00119AD8B026DCE56EA7DEFE930 Key = 0000020000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 69026591D43363EE9D83B5007F0B484E Key = 0000010000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 27135D86950C6A2F86872706279A4761 Key = 0000008000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35E6DB8723F281DA410C3AC8535ED77C Key = 0000004000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 57427CF214B8C28E4BBF487CCB8D0E09 Key = 0000002000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6DF01BF56E5131AC87F96E99CAB86367 Key = 0000001000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3856C5B55790B768BBF7D43031579BCF Key = 0000000800000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1E6ED8FB7C15BC4D2F63BA7037ED44D0 Key = 0000000400000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E1B2ED6CD8D93D455534E401156D4BCF Key = 0000000200000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EFBCCA5BDFDAD10E875F02336212CE36 Key = 0000000100000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0B777F02FD18DCE2646DCFE868DFAFAD Key = 0000000080000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C8A104B5693D1B14F5BF1F10100BF508 Key = 0000000040000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4CCE6615244AFCB38408FECE219962EA Key = 0000000020000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F99E7845D3A255B394C9C050CBA258B1 Key = 0000000010000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B4AFBB787F9BCFB7B55FDF447F611295 Key = 0000000008000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AE1C426A697FAF2808B7EF6ADDB5C020 Key = 0000000004000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7572F92811A85B9BDD38DEAD9945BCAE Key = 0000000002000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 71BC7AA46E43FB95A181527D9F6A360F Key = 0000000001000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5542EF2923066F1EC8F546DD0D8E7CA8 Key = 0000000000800000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6B92317C7D623790B748FDD7EFC42422 Key = 0000000000400000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0FE7C097E899C71EF045360F8D6C25CF Key = 0000000000200000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4ECE7EE107D0264D04693151C25B9DF6 Key = 0000000000100000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FD6AE687CBFCA9E301045888D3BB9605 Key = 0000000000080000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 476B579C8556C7254424902CC1D6D36E Key = 0000000000040000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4133CBCDFDD6B8860A1FC18665D6D71B Key = 0000000000020000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3B36EC2664798C108B816812C65DFDC7 Key = 0000000000010000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 364E20A234FEA385D48DC5A09C9E70CF Key = 0000000000008000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4A4BA25969DE3F5EE5642C71AAD0EFD1 Key = 0000000000004000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E42CBAAE43297F67A76C1C501BB79E36 Key = 0000000000002000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 23CEDEDA4C15B4C037E8C61492217937 Key = 0000000000001000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A1719147A1F4A1A1180BD16E8593DCDE Key = 0000000000000800000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AB82337E9FB0EC60D1F25A1D0014192C Key = 0000000000000400000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 74BF2D8FC5A8388DF1A3A4D7D33FC164 Key = 0000000000000200000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D5B493317E6FBC6FFFD664B3C491368A Key = 0000000000000100000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BA767381586DA56A2A8D503D5F7ADA0B Key = 0000000000000080000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E8E6BC57DFE9CCADB0DECABF4E5CF91F Key = 0000000000000040000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3C8E5A5CDC9CEED90815D1F84BB2998C Key = 0000000000000020000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 283843020BA38F056001B2FD585F7CC9 Key = 0000000000000010000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D8ADC7426F623ECE8741A70621D28870 Key = 0000000000000008000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D7C5C215592D06F00E6A80DA69A28EA9 Key = 0000000000000004000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 52CF6FA433C3C870CAC70190358F7F16 Key = 0000000000000002000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F63D442A584DA71786ADEC9F3346DF75 Key = 0000000000000001000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 549078F4B0CA7079B45F9A5ADAFAFD99 Key = 0000000000000000800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F2A5986EE4E9984BE2BAFB79EA8152FA Key = 0000000000000000400000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8A74535017B4DB2776668A1FAE64384C Key = 0000000000000000200000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E613342F57A97FD95DC088711A5D0ECD Key = 0000000000000000100000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3FFAEBF6B22CF1DC82AE17CD48175B01 Key = 0000000000000000080000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BAFD52EFA15C248CCBF9757735E6B1CE Key = 0000000000000000040000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7AF94BC018D9DDD4539D2DD1C6F4000F Key = 0000000000000000020000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FE177AD61CA0FDB281086FBA8FE76803 Key = 0000000000000000010000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 74DBEA15E2E9285BAD163D7D534251B6 Key = 0000000000000000008000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 23DD21331B3A92F200FE56FF050FFE74 Key = 0000000000000000004000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A69C5AA34AB20A858CAFA766EACED6D8 Key = 0000000000000000002000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3F72BB4DF2A4F941A4A09CB78F04B97A Key = 0000000000000000001000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 72CC43577E1FD5FD14622D24D97FCDCC Key = 0000000000000000000800000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D83AF8EBE93E0B6B99CAFADE224937D1 Key = 0000000000000000000400000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 44042329128D56CAA8D084C8BD769D1E Key = 0000000000000000000200000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 14102D72290DE4F2C430ADD1ED64BA1D Key = 0000000000000000000100000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 449124097B1ECD0AE7065206DF06F03C Key = 0000000000000000000080000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D060A99F8CC153A42E11E5F97BD7584A Key = 0000000000000000000040000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 65605B3EA9261488D53E48602ADEA299 Key = 0000000000000000000020000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C5E5CAD7A208DE8EA6BE049EFE5C7346 Key = 0000000000000000000010000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4C280C46D2181646048DD5BC0C0831A5 Key = 0000000000000000000008000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5DD65CF37F2A0929559AABAFDA08E730 Key = 0000000000000000000004000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 31F2335CAAF264172F69A693225E6D22 Key = 0000000000000000000002000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3E28B35F99A72662590DA96426DD377F Key = 0000000000000000000001000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 570F40F5D7B20441486578ED344343BE Key = 0000000000000000000000800000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C54308AD1C9E3B19F8B7417873045A8C Key = 0000000000000000000000400000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CBF335E39CE13ADE2B696179E8FD0CE1 Key = 0000000000000000000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9C2FBF422355D8293083D51F4A3C18A9 Key = 0000000000000000000000100000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5ED8B5A31ECEFAB16C9AA6986DA67BCE Key = 0000000000000000000000080000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 627815DCFC814ABC75900041B1DD7B59 Key = 0000000000000000000000040000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9EF3E82A50A59F166260494F7A7F2CC3 Key = 0000000000000000000000020000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 878CD0D8D920888B5935D6C351128737 Key = 0000000000000000000000010000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E44429474D6FC3084EB2A6B8B46AF754 Key = 0000000000000000000000008000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EBAACF9641D54E1FB18D0A2BE4F19BE5 Key = 0000000000000000000000004000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 13B3BF497CEE780E123C7E193DEA3A01 Key = 0000000000000000000000002000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6E8F381DE00A41161F0DF03B4155BFD4 Key = 0000000000000000000000001000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35E4F29BBA2BAE01144910783C3FEF49 Key = 0000000000000000000000000800000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 55B17BD66788CEAC366398A31F289FFB Key = 0000000000000000000000000400000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 11341F56C0D6D1008D28741DAA7679CE Key = 0000000000000000000000000200000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4DF7253DF421D83358BDBE924745D98C Key = 0000000000000000000000000100000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BAE2EE651116D93EDC8E83B5F3347BE1 Key = 0000000000000000000000000080000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F9721ABD06709157183AF3965A659D9D Key = 0000000000000000000000000040000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 19A1C252A613FE2860A4AE6D75CE6FA3 Key = 0000000000000000000000000020000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B5DDB2F5D9752C949FBDE3FFF5556C6E Key = 0000000000000000000000000010000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 81B044FCFFC78ECCFCD171AAD0405C66 Key = 0000000000000000000000000008000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C640566D3C06020EB2C42F1D62E56A9B Key = 0000000000000000000000000004000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EA6C4BCF425291679FDFFD26A424FBCC Key = 0000000000000000000000000002000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 57F6901465D9440D9F15EE2CBA5A4090 Key = 0000000000000000000000000001000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FBCFA74CADC7406260F63D96C8AAB6B1 Key = 0000000000000000000000000000800000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DFF4F096CEA211D4BBDACA033D0EC7D1 Key = 0000000000000000000000000000400000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1EE5190D551F0F42F675227A381296A9 Key = 0000000000000000000000000000200000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F98E1905012E580F097623C10B93054F Key = 0000000000000000000000000000100000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E7D43743D21DD3C9F168C86856558B9A Key = 0000000000000000000000000000080000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 632A9DDA730DAB67593C5D08D8AC1059 Key = 0000000000000000000000000000040000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E084317000715B9057BC9DE9F3AB6124 Key = 0000000000000000000000000000020000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 61F9EF33A0BB4E666C2ED99101919FAB Key = 0000000000000000000000000000010000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6DC1D68A11834657D46703C22578D59A Key = 0000000000000000000000000000008000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 53AC1548863D3D16F1D4DC7242E05F2C Key = 0000000000000000000000000000004000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E82CD587A408306AD78CEAE0916B9F8C Key = 0000000000000000000000000000002000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0FD2D40EA6AD17A3A767F0A8600D6295 Key = 0000000000000000000000000000001000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AD84CC8255ADB39DFCA23F92761AE7E9 Key = 0000000000000000000000000000000800000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F4F20CF7D51BEE7DA024A2B11A7ECA0B Key = 0000000000000000000000000000000400000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5057691B85D9CE93A193214DB0A016B6 Key = 0000000000000000000000000000000200000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0F58C960876390BDEF4BB6BE95CAA1EE Key = 0000000000000000000000000000000100000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9A3E66EEBC21BC0BD9430B341EF465FA Key = 0000000000000000000000000000000080000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 20415035F34B8BCBCB28ABF07F78F0D4 Key = 0000000000000000000000000000000040000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AC89FC7BA10479EBF10DE65BCEF89B3C Key = 0000000000000000000000000000000020000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 068FA75A30BE443171AF3F6FEB1A20D2 Key = 0000000000000000000000000000000010000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 50E02F213246C525A8C27700CA34B502 Key = 0000000000000000000000000000000008000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 227DA47D5A0906DB3AB042BB0A695FB6 Key = 0000000000000000000000000000000004000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8663AC30ED12514F1DE46777F4514BFC Key = 0000000000000000000000000000000002000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A987D4BC12E1DE9F4B6DF43567C34A8B Key = 0000000000000000000000000000000001000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6D5A0370F599ACA605F63B04E5143D0C Key = 0000000000000000000000000000000000800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9809266E378B07B7AFDB3BAA97B7E442 Key = 0000000000000000000000000000000000400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8F753252B30CCCACE12D9A301F4D5090 Key = 0000000000000000000000000000000000200000000000000000000000000000 In = 00000000000000000000000000000000 Out = 032465F6C0CE34D41962F561692A1AFF Key = 0000000000000000000000000000000000100000000000000000000000000000 In = 00000000000000000000000000000000 Out = C50E9AD5BEB8F3B00821DD47FF8AC093 Key = 0000000000000000000000000000000000080000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9C6FEA3D46268D54A6829B2AD25BB276 Key = 0000000000000000000000000000000000040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0FD8575E87706F561343D7B3A41E044A Key = 0000000000000000000000000000000000020000000000000000000000000000 In = 00000000000000000000000000000000 Out = BEE9BEB3739540D88CBCE77925F0A114 Key = 0000000000000000000000000000000000010000000000000000000000000000 In = 00000000000000000000000000000000 Out = D24EAEE7FFFBAC3D6F26C2DCE0DCDE28 Key = 0000000000000000000000000000000000008000000000000000000000000000 In = 00000000000000000000000000000000 Out = 47771A90398FF0F7FA821C2F8F5E1398 Key = 0000000000000000000000000000000000004000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4639741B6F84B135AD118C8249B64ED0 Key = 0000000000000000000000000000000000002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8EE5505EC85567697A3306F250A27720 Key = 0000000000000000000000000000000000001000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7C8A19AC1AEFBC5E0119D91A5F05D4C2 Key = 0000000000000000000000000000000000000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 5141B9B672E54773B672E3A6C424887B Key = 0000000000000000000000000000000000000400000000000000000000000000 In = 00000000000000000000000000000000 Out = B5A2D3CD206653C6402F34FB0AE3613D Key = 0000000000000000000000000000000000000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 0F5BD9408738231D114B0A82753279A3 Key = 0000000000000000000000000000000000000100000000000000000000000000 In = 00000000000000000000000000000000 Out = FEF033FF4268EA487FC74C5E43A45338 Key = 0000000000000000000000000000000000000080000000000000000000000000 In = 00000000000000000000000000000000 Out = A3EDC09DCD529B113910D904AD855581 Key = 0000000000000000000000000000000000000040000000000000000000000000 In = 00000000000000000000000000000000 Out = AB8FBB6F27A0AC7C55B59FDD36B72F1C Key = 0000000000000000000000000000000000000020000000000000000000000000 In = 00000000000000000000000000000000 Out = EEA44D5ED4D769CC930CD83D8999EC46 Key = 0000000000000000000000000000000000000010000000000000000000000000 In = 00000000000000000000000000000000 Out = 6972276803AE9AA7C6F431AB10979C34 Key = 0000000000000000000000000000000000000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 86DEAA9F39244101818178474D7DBDE9 Key = 0000000000000000000000000000000000000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 88C6B466EA361D662D8D08CBF181F4FE Key = 0000000000000000000000000000000000000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 91AB2C6B7C63FF59F7CBEEBF91B20B95 Key = 0000000000000000000000000000000000000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 2DFE6C146AD5B3D8C3C1718F13B48E01 Key = 0000000000000000000000000000000000000000800000000000000000000000 In = 00000000000000000000000000000000 Out = C7CFF1623451711391A302EEC3584AAA Key = 0000000000000000000000000000000000000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 089FE845CC05011686C66019D18BE050 Key = 0000000000000000000000000000000000000000200000000000000000000000 In = 00000000000000000000000000000000 Out = 08C8410B9B427211A67124B0DCCEAD48 Key = 0000000000000000000000000000000000000000100000000000000000000000 In = 00000000000000000000000000000000 Out = 8D91592F5566085254784606334D7629 Key = 0000000000000000000000000000000000000000080000000000000000000000 In = 00000000000000000000000000000000 Out = 3298FEAAF2E1201D6299FF8846639C97 Key = 0000000000000000000000000000000000000000040000000000000000000000 In = 00000000000000000000000000000000 Out = C497CB9F0BDFE0EFC8C2F3F90760AA72 Key = 0000000000000000000000000000000000000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 2788AFD046E0309CBE4424690DA2AB89 Key = 0000000000000000000000000000000000000000010000000000000000000000 In = 00000000000000000000000000000000 Out = E9891707F25EF29FEE372890D4258982 Key = 0000000000000000000000000000000000000000008000000000000000000000 In = 00000000000000000000000000000000 Out = DB041D94A23D45D4D4DCED5A030CAF61 Key = 0000000000000000000000000000000000000000004000000000000000000000 In = 00000000000000000000000000000000 Out = FFAFDBF0ECB18DF9EA02C27077448E6D Key = 0000000000000000000000000000000000000000002000000000000000000000 In = 00000000000000000000000000000000 Out = 2DAAA42A7D0A1D3B0E4761D99CF2150A Key = 0000000000000000000000000000000000000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 3B7A54CB7CF30ABE263DD6ED5BFE8D63 Key = 0000000000000000000000000000000000000000000800000000000000000000 In = 00000000000000000000000000000000 Out = EEFA090174C590C448A55D43648F534A Key = 0000000000000000000000000000000000000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 9E15798731ED42F43EA2740A691DA872 Key = 0000000000000000000000000000000000000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 31FBD661540A5DEAAD1017CFD3909EC8 Key = 0000000000000000000000000000000000000000000100000000000000000000 In = 00000000000000000000000000000000 Out = CDA9AE05F224140E28CB951721B44D6A Key = 0000000000000000000000000000000000000000000080000000000000000000 In = 00000000000000000000000000000000 Out = 0C5BC512C60A1EAC3434EFB1A8FBB182 Key = 0000000000000000000000000000000000000000000040000000000000000000 In = 00000000000000000000000000000000 Out = AA863610DEEEEB62D045E87EA30B59B5 Key = 0000000000000000000000000000000000000000000020000000000000000000 In = 00000000000000000000000000000000 Out = 6AC2448DE568D279C7EEBE1DF403920C Key = 0000000000000000000000000000000000000000000010000000000000000000 In = 00000000000000000000000000000000 Out = E2011E3D292B26888AE801215FD0CB40 Key = 0000000000000000000000000000000000000000000008000000000000000000 In = 00000000000000000000000000000000 Out = E06F3E15EE3A61672D1C99BADE5B9DBE Key = 0000000000000000000000000000000000000000000004000000000000000000 In = 00000000000000000000000000000000 Out = BB7027F0548CF6712CEB4C7A4B28E178 Key = 0000000000000000000000000000000000000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 061EC21FB70FADBDF87C3BD2AE23825B Key = 0000000000000000000000000000000000000000000001000000000000000000 In = 00000000000000000000000000000000 Out = 4C21F26FE94ABBAC381352375314C3EB Key = 0000000000000000000000000000000000000000000000800000000000000000 In = 00000000000000000000000000000000 Out = F7CEE6DD99909C2B569EEDA61ED8942E Key = 0000000000000000000000000000000000000000000000400000000000000000 In = 00000000000000000000000000000000 Out = CE98C4A876C65E4CCB261EBB1D9DF7F5 Key = 0000000000000000000000000000000000000000000000200000000000000000 In = 00000000000000000000000000000000 Out = A5491881CF833C3604ABC08044F402AC Key = 0000000000000000000000000000000000000000000000100000000000000000 In = 00000000000000000000000000000000 Out = A1BA16E64CCCB3087D57A768507B0BFC Key = 0000000000000000000000000000000000000000000000080000000000000000 In = 00000000000000000000000000000000 Out = D55951E202D2949EBD3BE43120C738BF Key = 0000000000000000000000000000000000000000000000040000000000000000 In = 00000000000000000000000000000000 Out = EBB8E43069E69F450EFEC65DCD52B7FD Key = 0000000000000000000000000000000000000000000000020000000000000000 In = 00000000000000000000000000000000 Out = 2B292135663B4AA5ABFE9423D57E7EE9 Key = 0000000000000000000000000000000000000000000000010000000000000000 In = 00000000000000000000000000000000 Out = E91BF974B3BE3AD966249D8655292A85 Key = 0000000000000000000000000000000000000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 384365998EAA9562236CC58F6ADF9610 Key = 0000000000000000000000000000000000000000000000004000000000000000 In = 00000000000000000000000000000000 Out = C2E997012AA3D4D8D359C9A947CBE69F Key = 0000000000000000000000000000000000000000000000002000000000000000 In = 00000000000000000000000000000000 Out = F49421204148BA213BE87E2D5C22B0BF Key = 0000000000000000000000000000000000000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 82ED0ED9953AA92E4DF30929CA65C00F Key = 0000000000000000000000000000000000000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 291EB1D11653C8479437C74A977F5106 Key = 0000000000000000000000000000000000000000000000000400000000000000 In = 00000000000000000000000000000000 Out = BCB997B1939B8983ABD550D6025683E3 Key = 0000000000000000000000000000000000000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 1FBA2592C6F489775CAADA71F9B983E9 Key = 0000000000000000000000000000000000000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 969F66F217AF1A3DB9E41C1B29039824 Key = 0000000000000000000000000000000000000000000000000080000000000000 In = 00000000000000000000000000000000 Out = A54BB7D6B17E423AC0A7744C19073CB8 Key = 0000000000000000000000000000000000000000000000000040000000000000 In = 00000000000000000000000000000000 Out = B0AC6E6578D1021F47DCF9748A32EAD5 Key = 0000000000000000000000000000000000000000000000000020000000000000 In = 00000000000000000000000000000000 Out = B87B361C3B7B194C77A4358D4669153E Key = 0000000000000000000000000000000000000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 46A133847F96EAA8282A799DC8899D58 Key = 0000000000000000000000000000000000000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 2265EC3A9F2D5C9547A091CC8CFB18EA Key = 0000000000000000000000000000000000000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 54CBF3A6FC4FE56D426117AA1FFD1DDE Key = 0000000000000000000000000000000000000000000000000002000000000000 In = 00000000000000000000000000000000 Out = 5312877CCEAB6CFB0905394A370A8003 Key = 0000000000000000000000000000000000000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 7190BD6EC613FE38B84ECFE28F702FE4 Key = 0000000000000000000000000000000000000000000000000000800000000000 In = 00000000000000000000000000000000 Out = D1FA5B9CA89A43B04C05F0EF29EF68CD Key = 0000000000000000000000000000000000000000000000000000400000000000 In = 00000000000000000000000000000000 Out = 808285751548ED934FD1056D2D9AE8BA Key = 0000000000000000000000000000000000000000000000000000200000000000 In = 00000000000000000000000000000000 Out = 2758DEF3E7B95A9AE89777BE64D5A6CF Key = 0000000000000000000000000000000000000000000000000000100000000000 In = 00000000000000000000000000000000 Out = 07D81F87DB3E0ACC82B01E08FB22F3C1 Key = 0000000000000000000000000000000000000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 8DA250E5553D650711A75EE1CB4FD1C7 Key = 0000000000000000000000000000000000000000000000000000040000000000 In = 00000000000000000000000000000000 Out = A93D946BD0E87F32719DF5F158CEE669 Key = 0000000000000000000000000000000000000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 03945236EC2A4D4EAF30B8ABEB54330D Key = 0000000000000000000000000000000000000000000000000000010000000000 In = 00000000000000000000000000000000 Out = 11CC35301F24B79DDE31AEA2D1354F88 Key = 0000000000000000000000000000000000000000000000000000008000000000 In = 00000000000000000000000000000000 Out = E73715B3E8D9A290F44AE6FFBF247E5D Key = 0000000000000000000000000000000000000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 7345E07732B71CB158BBF64CCA5C5B96 Key = 0000000000000000000000000000000000000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 6E128F296D24705A1924FD9B70C4ED04 Key = 0000000000000000000000000000000000000000000000000000001000000000 In = 00000000000000000000000000000000 Out = 95A789776F036783FBD330947083F54F Key = 0000000000000000000000000000000000000000000000000000000800000000 In = 00000000000000000000000000000000 Out = 360DEC2533EA4AA2E3E54FD3DE2906EB Key = 0000000000000000000000000000000000000000000000000000000400000000 In = 00000000000000000000000000000000 Out = E68EFD7FECF4D601EA22727BD764965B Key = 0000000000000000000000000000000000000000000000000000000200000000 In = 00000000000000000000000000000000 Out = 9065C64A8BFF44AC33EDBB611CF83D7B Key = 0000000000000000000000000000000000000000000000000000000100000000 In = 00000000000000000000000000000000 Out = 8F33C8DF2A7A51CE8090E8F123BC3723 Key = 0000000000000000000000000000000000000000000000000000000080000000 In = 00000000000000000000000000000000 Out = 807F391FFBA8291BA625623210F99018 Key = 0000000000000000000000000000000000000000000000000000000040000000 In = 00000000000000000000000000000000 Out = 5E8B3F3A701522CE5CAA761C929D6292 Key = 0000000000000000000000000000000000000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 3BA404DC38735A78289E3809E8364835 Key = 0000000000000000000000000000000000000000000000000000000010000000 In = 00000000000000000000000000000000 Out = D23BEDBAD229F8305DC425B6B759DCC9 Key = 0000000000000000000000000000000000000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 44880F21CF5913040AE376AEE2A10AD8 Key = 0000000000000000000000000000000000000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 9BC98E29D057C0E828C3B5CCE69256C1 Key = 0000000000000000000000000000000000000000000000000000000002000000 In = 00000000000000000000000000000000 Out = B293CC7A975DA141A68279368057CC41 Key = 0000000000000000000000000000000000000000000000000000000001000000 In = 00000000000000000000000000000000 Out = 8D60FB87ACD91385B313BE5F1D7BD30F Key = 0000000000000000000000000000000000000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 2C8E56132D70291B303C48FDF75543CD Key = 0000000000000000000000000000000000000000000000000000000000400000 In = 00000000000000000000000000000000 Out = D1F80035B826791F6CE4E59B7DB1BB0D Key = 0000000000000000000000000000000000000000000000000000000000200000 In = 00000000000000000000000000000000 Out = 42CE6224FC36469339A133DD08173BD4 Key = 0000000000000000000000000000000000000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 61817155EA41BCBA2AF7F06AE7CBF585 Key = 0000000000000000000000000000000000000000000000000000000000080000 In = 00000000000000000000000000000000 Out = D1923A9866068D2EF5FB77D57C3315B6 Key = 0000000000000000000000000000000000000000000000000000000000040000 In = 00000000000000000000000000000000 Out = B37CBDB5D719F49691CA968EF2E84140 Key = 0000000000000000000000000000000000000000000000000000000000020000 In = 00000000000000000000000000000000 Out = EC974E653A055D7F8F22171030F68E1D Key = 0000000000000000000000000000000000000000000000000000000000010000 In = 00000000000000000000000000000000 Out = DDE5D3B9AAD9C32213BB3675A822499C Key = 0000000000000000000000000000000000000000000000000000000000008000 In = 00000000000000000000000000000000 Out = D3B6E9216EA1AE57EB1C628A3C38AB78 Key = 0000000000000000000000000000000000000000000000000000000000004000 In = 00000000000000000000000000000000 Out = 82C99ECC69472B7E96324B042AE8B87A Key = 0000000000000000000000000000000000000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 97144DC5338C43600F84439C0AA0D147 Key = 0000000000000000000000000000000000000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 400AC4A0BBADA1DB2121EB144C7E5209 Key = 0000000000000000000000000000000000000000000000000000000000000800 In = 00000000000000000000000000000000 Out = EFD9D550EB419ED278F4885A490AB54C Key = 0000000000000000000000000000000000000000000000000000000000000400 In = 00000000000000000000000000000000 Out = 2AB7816E149B7C0404C88A8857793670 Key = 0000000000000000000000000000000000000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 5B591DFF9E8DEE15BAD24C025DBCA481 Key = 0000000000000000000000000000000000000000000000000000000000000100 In = 00000000000000000000000000000000 Out = 0C06633E30721C3749F49AD8CBF2B754 Key = 0000000000000000000000000000000000000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 96D6D31A41B5123B2035FD91A921D4CA Key = 0000000000000000000000000000000000000000000000000000000000000040 In = 00000000000000000000000000000000 Out = E7F6C34D86668BC2805CA7793C5E86AD Key = 0000000000000000000000000000000000000000000000000000000000000020 In = 00000000000000000000000000000000 Out = F46DFF5FF500D6879C4D3E45CF0CF0F3 Key = 0000000000000000000000000000000000000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 60D842D9C61DA7495C116197B7CECBBE Key = 0000000000000000000000000000000000000000000000000000000000000008 In = 00000000000000000000000000000000 Out = D45B24EDB673353EBDF248B8FA06B67A Key = 0000000000000000000000000000000000000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 119EAEBCC165D0BD02C0D35DC82EF992 Key = 0000000000000000000000000000000000000000000000000000000000000002 In = 00000000000000000000000000000000 Out = E673143680414ADA301D0ED34626B9FE Key = 0000000000000000000000000000000000000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 6B6CFE160A6263631B292F879EEFF926 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = DDC6BF790C15760D8D9AEB6F9A75FD4E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 40000000000000000000000000000000 Out = C7098C217C334D0C9BDF37EA13B0822C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 60F0FB0D4C56A8D4EEFEC5264204042D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 10000000000000000000000000000000 Out = 73376FBBF654D0686E0E84001477106B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 08000000000000000000000000000000 Out = 2F443B52BA5F0C6EA0602C7C4FD259B6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 04000000000000000000000000000000 Out = 75D11B0E3A68C4223D88DBF017977DD7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 02000000000000000000000000000000 Out = 779B38D15BFFB63D8D609D551A5CC98E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 5275F3D86B4FB8684593133EBFA53CD3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 1CEF2074B336CEC62F12DEA2F6AB1481 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00400000000000000000000000000000 Out = 1AEF5ABBAD9D7160874578DCD8BAE172 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 46C525DB17E72F26BF03216846B6F609 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00100000000000000000000000000000 Out = E24411F941BBE08788781E3EC52CBAA4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 83A3DEDD1DD27018F6A6477E40527581 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00040000000000000000000000000000 Out = B68F8A2CDBAB0C923C67FC8F0F1087DE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 649944A70C32BF87A7409E7AE128FDE8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00010000000000000000000000000000 Out = 2846526D67387539C89314DE9E0C2D02 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00008000000000000000000000000000 Out = A9A0B8402E53C70DD1688054BA58DDFD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 4A72E6E1B79C83AC4BE3EBA5699EED48 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00002000000000000000000000000000 Out = B0E36B867BA4FF2B77D0614B0E364E4C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00001000000000000000000000000000 Out = 49B57DE141F6418E3090F24DDD4014B6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000800000000000000000000000000 Out = A6C0D5B9797258E1987AC5F6CD20146D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000400000000000000000000000000 Out = 426CF4BDCAA369175965D26E7C71EEA2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000200000000000000000000000000 Out = E27F484CE54BC99BC1A52BDA3B518A26 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000100000000000000000000000000 Out = D16D186284C7E6EE64B8104E0EF20BA5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000080000000000000000000000000 Out = 6431F8538AD54E1E044A9F71F8EF556B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000040000000000000000000000000 Out = ECD57CEB451D27EB96C55B2042257E8E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 4F0F188DC911B1954AFBC734C9F68872 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000010000000000000000000000000 Out = B54DEF0337626B65614E81EDFDE620F3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 6655D8074CAE0B90B0D3A3FE72D4D9DB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000004000000000000000000000000 Out = C6B74B6B9EB4FC0C9A237DB1B616D09A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000002000000000000000000000000 Out = D7B5D076EA56EC2B20791D7AD51CCF8F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000001000000000000000000000000 Out = FE160C224BF003CE3BDDC90CB52ED22C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 5E00DA9BA94B5EC0D258D8A8002E0F6A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000400000000000000000000000 Out = 09AC6DCFF4DACFF1651E2BA212A292A3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000200000000000000000000000 Out = B283617E318D99AF83A05D9810BA89F7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 0B5F70CCB40B0EF2538AE9B4A9770B35 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000080000000000000000000000 Out = 43282BF180248FB517839B37F4DDAAE4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000040000000000000000000000 Out = DDBD534C8B2E6D30A268F88C55AD765B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000020000000000000000000000 Out = A41A164E50EC2D9F175E752B755E0B5C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000010000000000000000000000 Out = 37BFF99FF2F7AA97779E4ADF6F13FB10 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000008000000000000000000000 Out = 9BA4F7BD298152903A683C4CEC669216 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000004000000000000000000000 Out = 5FB750C7CE10DE7B4504248914D0DA06 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000002000000000000000000000 Out = 3E748BFA108E086F51D56EC74A9E0FB9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 31D4E56B99F5B73C1B8437DF332AFB98 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000800000000000000000000 Out = 9DC6717B84FC55D266E7B1D9B5C52A5F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 8EF8BA007F23C0A50FC120E07041BCCD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000200000000000000000000 Out = C58F38E1839FC1918A12B8C9E88C66B6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000100000000000000000000 Out = B695D72A3FCF508C4050E12E40061C2D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000080000000000000000000 Out = 5D2736AD478A50583BC8C11BEFF16D7A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = DF0EACA8F17847AD41F9578F14C7B56B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000020000000000000000000 Out = E5AA14AD48AD0A3C47CC35D5F8020E51 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 11BE6C8F58EBD8CEF1A53F591A68E8CE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000008000000000000000000 Out = ECFE7BAFCBF42C1FEE015488770B3053 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000004000000000000000000 Out = E552649F8D8EC4A1E1CD6DF50B6E6777 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000002000000000000000000 Out = 521C0629DE93B9119CDB1DDC5809DDEA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000001000000000000000000 Out = CB38A62A0BAB1784156BA038CBA99BF6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 76CCEE8AAACD394DE1EEF3DDA10CB54B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000400000000000000000 Out = 6AFF910FA1D5673140E2DB59B8416049 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000200000000000000000 Out = 064A12C0EF73FB386801BF4F35F3120D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 2240E374929D5B1BB8FF0FFDDDF640EC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000080000000000000000 Out = D4BA15C904C7692185DE85C02052E180 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 1714A315AB0166728A44CD91D4AE9018 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000020000000000000000 Out = 6C970BDD9F0E222722EA31A1D12DD0AD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000010000000000000000 Out = F5956EDF02BD36A401BBB6CE77C3D3FB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 0CA11F122CCD7C259DC597EED3DF9BC4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000004000000000000000 Out = 50109AB4912AD2560B206F331B62EB6C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000002000000000000000 Out = DBE7C91A4175614889A2D4BEFD64845E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000001000000000000000 Out = 0D3322853A571A6B46B79C0228E0DD25 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 96E4EE0BB9A11C6FB8522F285BADDEB6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000400000000000000 Out = 96705C52D2CFCE82E630C93477C79C49 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000200000000000000 Out = C50130AED6A126149D71F3888C83C232 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 4816EFE3DEB380566EBA0C17BF582090 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000080000000000000 Out = 0390857B4C8C98E4CF7A2B6F3394C507 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000040000000000000 Out = 422E73A02025EBE8B8B5D6E0FA24FCB2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 3271AA7F4BF1D7C38050A43076D4FF76 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000010000000000000 Out = D2074946F0D37B8975607BFC2E70234C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000008000000000000 Out = 1A509194C1270AB92E5A42D3A9F8D98B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000004000000000000 Out = 512438946360CCC4A5C6D73F6EED7130 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000002000000000000 Out = 98CFCDEC46EBEA1A286B3004F2746A0D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000001000000000000 Out = A1CF369949677A3AF3D58E3EABF2741B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000800000000000 Out = D84C2E1A0E4A52166FA8FF6889D1E5E2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000400000000000 Out = 4AD91CCEEF60119B5078FD162D2735DE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 2860793D818E97AAFF1D339D7702438D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000100000000000 Out = 6F9068BE73364AE250D89D78A6C9CE6F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 024FC3FEF4883FEB1A8DD005305FECCE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 08A61FE0816D75EA15EB3C9FB9CCDED6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 449C86DFA13F260175CE39797686FFA4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 4FFFFC29A59858E1133F2BFB1A8A4817 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000008000000000 Out = 19425D1F6480B25096561295697DC2B7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 31974727ECDD2C77C3A428FC3A8CB3FC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000002000000000 Out = A57CD704B3C95E744D08DF443458F2F5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 486D8C193DB1ED73ACB17990442FC40B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000800000000 Out = 5E4DBF4E83AB3BC055B9FCC7A6B3A763 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000400000000 Out = ACF2E0A693FBBCBA4D41B861E0D89E37 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 32A7CB2AE066A51D2B78FC4B4CFCB608 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000100000000 Out = 677D494DBB73CAF55C1990158DA12F14 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 082A0D2367512ADF0D75A151BFBE0A17 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 5E5BB7337923C482CE8CBA249E6A8C7D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000020000000 Out = D3001BA7C7026EE3E5003179530AFCFC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000010000000 Out = 46EC44F8931E629FE8FD8961312EDDE1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000008000000 Out = C5F8ECD79C7B30E81D17E32079969310 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 5B8AD6919E24CAEBCC55401AEE0C9802 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000002000000 Out = C2302B7E701B5CC7F8B29E3516DBBFA6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000001000000 Out = A1D04D6A76F9F7A94D49FAA64A87F244 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 7FB6F92D35B5CB6C631600EDB9E860BA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000400000 Out = B2EF7078BCFACE07AEEC3F9B48830EB3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000200000 Out = F475A7493D24C7036E53390374C378B3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000100000 Out = B36802AC987377A37BD8EADC97C57D60 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000080000 Out = ADDCD3D19689C4DDC738CE5F69DC9505 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 0DAF8CA22884915403C0F0BB1F4BD74F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 4AF36BAE2660503B3248E4685059FD05 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 7D5631814DD8E917D97A0D514C743971 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000008000 Out = BC3352500FC0CBB9DB5B5F6B491C1BE8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 6A4A30BA87E87AF65C90AEB7AFEDC76B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 77E6125897668AC8E73E8C79A6FF8336 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 3FA9D39104EBB323C7AAAA248960DD1E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000800 Out = FAD75AD76AB10ADC49036B250E229D39 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000400 Out = 2FACAA5FE35B228A16AC74088D702EC4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 88B6CBCFDFEF8AD91720A1BB69A1F33E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000100 Out = C7E9D250998632D444356242EF04058D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000080 Out = B14DAD8D3D9153F46C0D3A1AD63C7A05 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 60ABA678A506608D0845966D29B5F790 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000020 Out = 482DC43F2388EF25D24144E144BD834E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 1490A05A7CEE43BDE98B56E309DC0126 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000008 Out = ABFA77CD6E85DA245FB0BDC5E52CFC29 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000004 Out = DD4AB1284D4AE17B41E85924470C36F7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000002 Out = CEA7403D4D606B6E074EC5D3BAF39D18 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 530F8AFBC74536B9A963B4F1C4CB738B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000001000000000000000000000000000000008000000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000001 Out = 1490A05A7CEE43BDE98B56E309DC0126ABFA77CD6E85DA245FB0BDC5E52CFC29DD4AB1284D4AE17B41E85924470C36F7CEA7403D4D606B6E074EC5D3BAF39D18530F8AFBC74536B9A963B4F1C4CB738B botan-2.4.0/src/tests/data/block/aria.vec000066400000000000000000000051471322470703100201750ustar00rootroot00000000000000[ARIA-128] # ARIA Test Vector PDF Key = 00112233445566778899aabbccddeeff In = 11111111aaaaaaaa11111111bbbbbbbb11111111cccccccc11111111dddddddd22222222aaaaaaaa22222222bbbbbbbb22222222cccccccc22222222dddddddd33333333aaaaaaaa33333333bbbbbbbb33333333cccccccc33333333dddddddd44444444aaaaaaaa44444444bbbbbbbb44444444cccccccc44444444dddddddd55555555aaaaaaaa55555555bbbbbbbb55555555cccccccc55555555dddddddd Out = c6ecd08e22c30abdb215cf74e2075e6e29ccaac63448708d331b2f816c51b17d9e133d1528dbf0af5787c7f3a3f5c2bf6b6f345907a3055612ce072ff54de7d788424da6e8ccfe8172b391be499354165665ba7864917000a6eeb2ecb4a698edfc7887e7f556377614ab0a282293e6d884dbb84206cdb16ed1754e77a1f243fd086953f752cc1e46c7c794ae85537dcaec8dd721f55c93b6edfe2adea43873e8 # RFC 5794 Key = 000102030405060708090a0b0c0d0e0f In = 00112233445566778899aabbccddeeff Out = d718fbd6ab644c739da95f3be6451778 [ARIA-192] # ARIA Test Vector PDF Key = 00112233445566778899aabbccddeeff0011223344556677 In = 11111111aaaaaaaa11111111bbbbbbbb11111111cccccccc11111111dddddddd22222222aaaaaaaa22222222bbbbbbbb22222222cccccccc22222222dddddddd33333333aaaaaaaa33333333bbbbbbbb33333333cccccccc33333333dddddddd44444444aaaaaaaa44444444bbbbbbbb44444444cccccccc44444444dddddddd55555555aaaaaaaa55555555bbbbbbbb55555555cccccccc55555555dddddddd Out = 8d1470625f59ebacb0e55b534b3e462b5f23d33bff78f46c3c15911f4a21809aaccad80b4bda915aa9dae6bcebe06a6c83f77fd5391acfe61de2f646b5d447edbfd5bb49b12fbb9145b227895a757b2af1f7188734863d7b8b6ede5a5b2f06a0a233c8523d2db778fb31b0e311f32700152f33861e9d040c83b5eb40cd88ea49975709dc629365a189f78a3ec40345fc6a5a307a8f9a4413091e007eca5645a0 # RFC 5794 Key = 000102030405060708090a0b0c0d0e0f1011121314151617 In = 00112233445566778899aabbccddeeff Out = 26449c1805dbe7aa25a468ce263a9e79 [ARIA-256] # ARIA Test Vector PDF Key = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff In = 11111111aaaaaaaa11111111bbbbbbbb11111111cccccccc11111111dddddddd22222222aaaaaaaa22222222bbbbbbbb22222222cccccccc22222222dddddddd33333333aaaaaaaa33333333bbbbbbbb33333333cccccccc33333333dddddddd44444444aaaaaaaa44444444bbbbbbbb44444444cccccccc44444444dddddddd55555555aaaaaaaa55555555bbbbbbbb55555555cccccccc55555555dddddddd Out = 58a875e6044ad7fffa4f58420f7f442d8e191016f28e79aefc01e204773280d7018e5f7a938ec30711719953bae86542cd7ebc752474c1a5f6eaaace2a7e29462ee7dfa5afdb84177ead95ccd4b4bb6e1ed17b9534cff0a5fc2941429cfee2ee49c7adbeb7e9d1b0d2a8531d942079596a27ed79f5b1dd13ecd604b07a48885a3afa0627a0e4e60a3c703af292f1baa77b702f16c54aa74bc727ea95c7468b00 # RFC 5794 Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f In = 00112233445566778899aabbccddeeff Out = f92bd7c79fb72e2f2b8f80c1972d24fc botan-2.4.0/src/tests/data/block/blowfish.vec000066400000000000000000000105451322470703100210740ustar00rootroot00000000000000[Blowfish] Key = 0123456789ABCDEF In = 0000000000000000 Out = 245946885754369A Key = 0000000000000000 In = 0000000000000000 Out = 4EF997456198DD78 Key = FFFFFFFFFFFFFFFF In = 0000000000000000 Out = F21E9A77B71C49BC Key = 584023641ABA6176 In = 004BD6EF09176062 Out = 452031C1E4FADA8E Key = FEDCBA9876543210 In = 0123456789ABCDEF Out = 0ACEAB0FC6A0A28D Key = 1111111111111111 In = 0123456789ABCDEF Out = 7D0CC630AFDA1EC7 Key = 1F1F1F1F0E0E0E0E In = 0123456789ABCDEF Out = A790795108EA3CAE Key = E0FEE0FEF1FEF1FE In = 0123456789ABCDEF Out = C39E072D9FAC631D Key = 0101010101010101 In = 0123456789ABCDEF Out = FA34EC4847B268B2 Key = 7CA110454A1A6E57 In = 01A1D6D039776742 Out = 59C68245EB05282B Key = 07A1133E4A0B2686 In = 0248D43806F67172 Out = 1730E5778BEA1DA4 Key = 49E95D6D4CA229BF In = 02FE55778117F12A Out = CF9C5D7A4986ADB5 Key = 0113B970FD34F2CE In = 059B5E0851CF143A Out = 48F4D0884C379918 Key = 4FB05E1515AB73A7 In = 072D43A077075292 Out = 7A8E7BFA937E89A3 Key = 0170F175468FB5E6 In = 0756D8E0774761D2 Out = 432193B78951FC98 Key = 3000000000000000 In = 1000000000000001 Out = 7D856F9A613063F2 Key = 1111111111111111 In = 1111111111111111 Out = 2466DD878B963C9D Key = 0123456789ABCDEF In = 1111111111111111 Out = 61F9C3802281B096 Key = 37D06BB516CB7546 In = 164D5E404F275232 Out = 5F99D04F5B163969 Key = 018310DC409B26D6 In = 1D9D5C5018F728C2 Out = D1ABB290658BC778 Key = 04689104C2FD3B2F In = 26955F6835AF609A Out = D887E0393C2DA6E3 Key = 1C587F1C13924FEF In = 305532286D6F295A Out = 55CB3774D13EF201 Key = 07A7137045DA2A16 In = 3BDD119049372802 Out = 2EEDDA93FFD39C79 Key = 04B915BA43FEB5B6 In = 42FD443059577FA2 Out = 353882B109CE8F1A Key = 49793EBC79B3258F In = 437540C8698F3CFA Out = 53C55F9CB49FC019 Key = 025816164629B007 In = 480D39006EE762F2 Out = 7555AE39F59B87BD Key = 3849674C2602319E In = 51454B582DDF440A Out = A25E7856CF2651EB Key = 0131D9619DC1376E In = 5CD54CA83DEF57DA Out = B1B8CC0B250F09A0 Key = 1F08260D1AC2465E In = 6B056E18759F5CCA Out = 4A057A3B24D3977B Key = 43297FAD38E373FE In = 762514B829BF486A Out = 13F04154D69D1AE5 Key = 0000000000000000 In = FFFFFFFFFFFFFFFF Out = 014933E0CDAFF6E4 Key = FFFFFFFFFFFFFFFF In = FFFFFFFFFFFFFFFF Out = 51866FD5B85ECB8A Key = FEDCBA9876543210 In = FFFFFFFFFFFFFFFF Out = 6B5C5A9C5D9E0A5A Key = 1111111111111111 In = 0123456789ABCDEF1111111111111111 Out = 7D0CC630AFDA1EC72466DD878B963C9D Key = 57686F206973204A6F686E2047616C743F In = FEDCBA9876543210 Out = CC91732B8022F684 Key = 6162636465666768696A6B6C6D6E6F707172737475767778797A In = 424C4F5746495348 Out = 324ED0FEF413A203 Key = F0 In = FEDCBA9876543210 Out = F9AD597C49DB005E Key = F0E1 In = FEDCBA9876543210 Out = E91D21C1D961A6D6 Key = F0E1D2 In = FEDCBA9876543210 Out = E9C2B70A1BC65CF3 Key = F0E1D2C3 In = FEDCBA9876543210 Out = BE1E639408640F05 Key = F0E1D2C3B4 In = FEDCBA9876543210 Out = B39E44481BDB1E6E Key = F0E1D2C3B4A5 In = FEDCBA9876543210 Out = 9457AA83B1928C0D Key = F0E1D2C3B4A596 In = FEDCBA9876543210 Out = 8BB77032F960629D Key = F0E1D2C3B4A59687 In = FEDCBA9876543210 Out = E87A244E2CC85E82 Key = F0E1D2C3B4A5968778 In = FEDCBA9876543210 Out = 15750E7A4F4EC577 Key = F0E1D2C3B4A596877869 In = FEDCBA9876543210 Out = 122BA70B3AB64AE0 Key = F0E1D2C3B4A5968778695A In = FEDCBA9876543210 Out = 3A833C9AFFC537F6 Key = F0E1D2C3B4A5968778695A4B In = FEDCBA9876543210 Out = 9409DA87A90F6BF2 Key = F0E1D2C3B4A5968778695A4B3C In = FEDCBA9876543210 Out = 884F80625060B8B4 Key = F0E1D2C3B4A5968778695A4B3C2D In = FEDCBA9876543210 Out = 1F85031C19E11968 Key = F0E1D2C3B4A5968778695A4B3C2D1E In = FEDCBA9876543210 Out = 79D9373A714CA34F Key = F0E1D2C3B4A5968778695A4B3C2D1E0F In = FEDCBA9876543210 Out = 93142887EE3BE15C Key = F0E1D2C3B4A5968778695A4B3C2D1E0F00 In = FEDCBA9876543210 Out = 03429E838CE2D14B Key = F0E1D2C3B4A5968778695A4B3C2D1E0F0011 In = FEDCBA9876543210 Out = A4299E27469FF67B Key = F0E1D2C3B4A5968778695A4B3C2D1E0F001122 In = FEDCBA9876543210 Out = AFD5AED1C1BC96A8 Key = F0E1D2C3B4A5968778695A4B3C2D1E0F00112233 In = FEDCBA9876543210 Out = 10851C0E3858DA9F Key = F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344 In = FEDCBA9876543210 Out = E6F51ED79B9DB21F Key = F0E1D2C3B4A5968778695A4B3C2D1E0F001122334455 In = FEDCBA9876543210 Out = 64A6E14AFD36B46F Key = F0E1D2C3B4A5968778695A4B3C2D1E0F00112233445566 In = FEDCBA9876543210 Out = 80C7D7D45A5479AD Key = F0E1D2C3B4A5968778695A4B3C2D1E0F0011223344556677 In = FEDCBA9876543210 Out = 05044B62FA52D080 botan-2.4.0/src/tests/data/block/camellia.vec000066400000000000000000000044431322470703100210260ustar00rootroot00000000000000[Camellia-128] Key = 0123456789ABCDEFFEDCBA9876543210 In = 0123456789ABCDEFFEDCBA9876543210 Out = 67673138549669730857065648EABE43 Key = 80000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6C227F749319A3AA7DA235A9BBA05A2C Key = 40000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F04D51E45E70FB6DEE0D16A204FBBA16 Key = 20000000000000000000000000000000 In = 00000000000000000000000000000000 Out = ED44242E619F8C32EAA2D3641DA47EA4 Key = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF In = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF Out = 5CA8B8A4B8AF15A6184259831B18BBB5 Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 25DD9EB9DD67FBC6E8431F56F4FBE651 [Camellia-192] Key = 0123456789ABCDEFFEDCBA98765432100011223344556677 In = 0123456789ABCDEFFEDCBA9876543210 Out = B4993401B3E996F84EE5CEE7D79B09B9 Key = 800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1B6220D365C2176C1D41A5826520FCA1 Key = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE In = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE Out = A2F5A98929658AF4A9700B9923DAF014 [Camellia-256] Key = 0123456789ABCDEFFEDCBA987654321000112233445566778899AABBCCDDEEFF In = 0123456789ABCDEFFEDCBA9876543210 Out = 9ACC237DFF16D76C20EF7C919E3A7509 Key = 8000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2136FABDA091DFB5171B94B8EFBB5D08 Key = 0000000000000200000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E18B0CB1980124504B46A46A6F4273F3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 9CDB269B5D293BC5DB9C55B057D9B591 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000020000000000000000000000000000000400000000000000000000000000000008000000000000000000000000000000100000000000000000000000000000002000000000000000000000000000000040 Out = 396154111ADEFC500CF6E5C99038BC179CDB269B5D293BC5DB9C55B057D9B5913D4B2CDE666761BA5DFB305178E667FB6A3F25AAB7E92D9CF378E5D9C040F26B7C92854D801A1648F65CA81813DDBF83BA664AC39855518DFDEE10D1B3111FAE7A6985778D3A66E97F23E01F0D0E45E78B1F247802E47C91BEE2AA34ECFD7A01 botan-2.4.0/src/tests/data/block/cascade.vec000066400000000000000000000046571322470703100206510ustar00rootroot00000000000000[Cascade(Serpent,Twofish)] Key = B50638F695AFA16F9378D43374CA8568600135ECD1E513838722366346BC4B2101422291558FAA30A3196CBEB42E67F4C075882482897F72A8A30AE9B3AD426D In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E78516D21D23DA501939C24C48BCC79DE78516D21D23DA501939C24C48BCC79D Key = 9E8F6BC09768AED8F533FA4FC35FF6FEB8020FFBC8350DDFD20ACA7ECF1889CFBFCD78E261B9A3CD825401AFA7ADCDFA88DBA8230FB92D4B942C25EE92F27A02 In = 47CB8147C5290D6F94FBF3351777087FA731610A3F66E3CCFA6D9B18F980E687 Out = F234E056923B3DB26AABC8F604F0CE2C1A7F4C35B0B74958014D791668FF6BF4 Key = 1EF34E47005028F2D95120052855C6001225200A333CA4D7D5A356B5554EE2AE7EBC9BA57BADA0DAFC84C2187C51CB3CCB5EEE40F27C00537FFFCA2851DD8BD8 In = B9A28D32734EF678BACD5539FF9FF951AF81F44AFE223256E5D8898FB862A767B90BD2D95E17E4411D02D49481CCE4191EE2C7AE8EBDF6312BDC66317AD42140 Out = 065E390C4FD10E9929F30D89A67E0D4CFA3AF90BEF46B2B435B53CBE0B7DD1B612D4C5E2D03028B488000C06517434FC70F7B62C273CA5DEBD9CA7034D853087 [Cascade(Serpent,AES-256)] Key = EE426051D1ADCE09AC02E2023331F273BB1B2C4C5905DEDA3E1032CCD0DB56115B011F05688F781E3F790364968E06DC6E7BD5FA38DB068CBD34A85B6B3A9458 In = 06CEB2B4FD2F0A27B3C90D77D2E9BBD3665A8DCAC9187B1EE9F6A60D39042A9D3719883B3E87845B9D4A8BE258379959775969CBF5768A359797B2FA19FC2FCC Out = 05FFBF6E8097FC746FFAD8C3306E6DB668148796180F26CA5DE06AE76DE16D078A0E72B259982423ED96FF95719DEB160CEFE7697752B0CFA984A18DDCEF2EC0 Key = CDCD23F5518DB5DAE8C69B56EB352D4F3C4A64A5FFC8E5BC2511B8310993C48EFA30A0F9E2B98A0FB1FE64173E6A8038047AEBAE22E17392FE32CF1D0DE3BB76 In = FBAF0DE6C09D10EB31F21A7C784BF453F82F51EFFA8B363EE6B33DF15204F43445170DED1E39AB922548ED82AAADED6BF470A5226B69D025FE3D532AADDA069C464D2C8A65E1A18698BD521AFB3053229C1539626392031F8C36229FF3178A7F5C716E30DBEFDDD4AC2113071977B795A8B29DA7F467471A996FB63136387C28 Out = 7ED1F730EED52DFB63E073A40EAE404E443ACEB9A3B55132E740ACE1EEDF99D0F22B3F2326E2E124594E75ED1915C8D155F24269254B22B6E8C53E9F64E70552D5E3004782C6C47341EBF8716B59DAB49B512B6DF7F9D7FB914FFA56F7F89B561B6A5DFE9334B7561144B25FE0F57BEBB4058EC7D9EEA57AB62825A86312BBC3 [Cascade(Serpent,CAST-128)] Key = EFA9CC5F3E245AB463CC60A5015CB0F663676760832CEE6C633A518112E518D45DD4B627E9507CDB03A1ADD870E28362 In = 27EDE4B2A3784A33898FA330167317BF7354072672D49DD03D13D3F0856CF3D9C17C1237565E7320BDD23C03BDE195A4FE58623A983DB9C308D5A976D92CD6A2 Out = 2D7096A03BAB4DBDABEDB9F069FE68C3E12ED65ACCE43ECF7F6D810B5EEC36A522B605715BE12003E324436652BEA06BD289DBE886A5DE9E51CFF6C065A21F2B botan-2.4.0/src/tests/data/block/cast128.vec000066400000000000000000000070351322470703100204440ustar00rootroot00000000000000[CAST-128] Key = 0123456712345678234567893456789A In = 0123456789ABCDEF Out = 238B4FE5847E44B2 Key = 0123456712345678234567893456789A In = 0123456789ABCDEF0123456789ABCDEF Out = 238B4FE5847E44B2238B4FE5847E44B2 Key = 51D35D2CFC978231CC8D404C05F20778 In = 0D5ED4BF2C101A00 Out = 851769123481EEBD Key = 3148F2F7A5EC9832C918B3FCE3A882D4 In = D6AA8EAE1E559AAE Out = C7FAFAFC64204DDE Key = 23CA10AC5007672EAAC2A652A1033051 In = F2504FFBB8970532 Out = 6371C64A362D2A06 Key = 69698114EB6B0C7DA021394E8294BA81 In = 4B1E9D8F450B7342 Out = 9CC2B912173553F3 Key = E29067C7B82F2BB5787A95961C4B145B In = 26D7BA5E58E367FC Out = A2D1FCB23EDBE861 Key = 724096996EA7E796847CC954DDB02F21 In = 960370DF205DF0C9 Out = E1F5DCA58544FE69 Key = C44CD3B7C176A89B849AEC9D1A834D25 In = 3E16104523173535 Out = EF4B1D186287F9E4 Key = F5A1E7B8DF1852E0A12E150665812CE1 In = 6AB0B4F6FBDFE766 Out = 273B54BDF2B5588C Key = 1BCBC553F08BA5AE3DC87E3A08D720A5 In = 76300E213C3F9D73 Out = 6C51876F5EA9CE03 Key = 0265563A752CB548404FEBA1C7231FA7 In = 22A5191C0722F0D8 Out = F1E19892EE7A4E51 Key = 9C553CF85065EC9EFE0A6526070DF766 In = D20430D1B98AE949 Out = 79E576FC40F1DC98 Key = 1895E906311E100D6F189B0622248BC3 In = 1C7401D639A47971 Out = BD2172A2ED5F5C02 Key = 616A2B2C30F26B1386CD8B1E9E15D77E In = B8591CA50C7E763D Out = 573F3DB3C43731FA Key = 14422858FA163B7C5267FF819773CE1D In = CDA3984E06CC637A Out = 2525D6596ACE9CD1 Key = 172E65C14E746EE6203025E94171D520 In = 5B5A603C9C090115 Out = 3729DAB86CB1CCF7 Key = 3E9FB858087C4E937A408EC1352482B1 In = 9F9881CA42D7024C Out = 9C3C573D7B958521 Key = A32E8B1498839F6017802758076B0BFC In = 4A5C46FD61058258 Out = 2A1E5FD727F67F13 Key = E303C6052387C310524721A2E461E89A In = EBBB828350790FDA Out = 78FC70F88D1622ED Key = 3B3DE3DA709304F69F1DD00F00A05064 In = 5097EDFFDFC0CA5B Out = 3ABDD3B9A69C7330 Key = C36EC561C6E005B5FC5F03F2A90B097E In = 8F950AE00DD2F279 Out = 2C62AFD2C641CCE8 Key = 202F39862076420EA9DF9DECCDC507AB In = D23B8A5E996E263D Out = 31A202CC0F9FB2B7 Key = CCD6F6AAEEB788E928CECF99440BBF07 In = 8D953359228A4C76 Out = AA454DE10B7A6863 Key = 017779EA29084F30B867FDDFF56A2158 In = D2E9C19314726F4D Out = B744FAB9846F35E4 Key = CE44271A18D709DCC62648F709C1CBE2 In = F4C032C960A5B463 Out = EDA7B0739A0638EE Key = B9F0598CFA6D4F92294C4BA43ED360F2 In = 81A0FD9AA423ED36 Out = C3CCCC1389F1D712 Key = 5A6C06E02E3D5177D26F0D63DF839057 In = B7E0072AE1CBEE65 Out = AEF33EEDCCC2E47F Key = 547DF75C2FCFF20C1ED3A77AF1AD66E8 In = F5810D9F1D639F82 Out = A7A88EFA33ACF56E Key = 9CC9412E02C03D423E055D340BC74460 In = 984A16BE2CD649AC Out = 444FC61F5CAB5A14 Key = D2E4D28086A37BF2927C9477C8184907 In = 8BC57E1C4D4DB959 Out = 6AAFD5AD02B48AAD Key = AFE83744D296834750A5AEC59C1FA546 In = E79C0E003AE33C71 Out = DCD139EFE59F5B1B Key = B933E959F7D492EACA22E7DF1C179C79 In = 5E8EB11FF48AE593 Out = 947A1A1472AF838E Key = 6DC4F66D0812A820134C3F61E398195E In = FD9072FAB981B8AA Out = 57A9C621EF5BE045 Key = 4FA0C134D50DDCAE2FA8828479149C61 In = 53515B1ABC74C9FB Out = C87A6000F80DADAF Key = 7A6ECA7EAAF393694A32AF561FF7E056 In = 1086DE79B6DC0C18 Out = 102FFA93ECBB99CF Key = 42400F970D5E6E38DE297B365C0704D3 In = 351228904431D12A Out = DC8B4548DA69C92D Key = 50D77ED75F69D9FD89C0B58A5374CC8E In = 889F00F0EC62610F Out = 3AEC2335A78EC8F9 Key = 321E02B40C3F7D9D55A5135620685DC8 In = 05CC553B50019A76 Out = 7A3F48D2954FB957 Key = DA1CA8F596F04697592CE210752FD08D In = D30DBA7A648B2CE9 Out = 242C1509768F5F9E Key = 9C56B69695DB96CEDBF1133386D13768 In = 1917132061B5B572 Out = 28FDDE7607EBE08D Key = 9F79CA83F4FDCCACA166BF18BF1B0CC2 In = 8420D1986EBBABFC Out = EAACBF83A093CB44 botan-2.4.0/src/tests/data/block/cast256.vec000066400000000000000000000033341322470703100204440ustar00rootroot00000000000000[CAST-256] Key = 80000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 66918B620F075819CDE620469D5F39B8 Key = 2342BB9EFA38542C0AF75647F29F615D In = 00000000000000000000000000000000 Out = C842A08972B43D20836C91D1B7530F6B Key = 00000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 4DBF11C2CA26D5A712578A5C18E8487B Key = 2342BB9EFA38542CBED0AC83940AC298BAC77A7717942863 In = 00000000000000000000000000000000 Out = 1B386C0210DCADCBDD0E41AA08A7A7E8 Key = 000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = D64AD4962DCF990CB9EB1BEF19A21B98 Key = 000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 0154FF22D769EB57AE14D7ECDD60C1D8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = D64AD4962DCF990CB9EB1BEF19A21B98 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 4DBF11C2CA26D5A712578A5C18E8487B Key = 0000000000000000000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 41C30E3025A7E66F6AE733DFDC861341 Key = 2342BB9EFA38542CBED0AC83940AC2988D7C47CE264908461CC1B5137AE6B604 In = 00000000000000000000000000000000 Out = 4F6A2038286897B9C9870136553317FA Key = 2342BB9EFA38542C0AF75647F29F615D In = 0000000000000000000000000C9B2807 Out = 963A8A50CEB54D08E0DEE0F1D0413DCF Key = 2342BB9EFA38542CBED0AC83940AC298BAC77A7717942863 In = 000000000000000000000000EE356B0F Out = B25683CD9188DB9307F8A1236B53DE86 Key = 2342BB9EFA38542CBED0AC83940AC2988D7C47CE264908461CC1B5137AE6B604 In = 000000000000000000000000B2E9D805 Out = AAB348855CAC0DC7BDF2FA02757A2154 botan-2.4.0/src/tests/data/block/des.vec000066400000000000000000000700621322470703100200320ustar00rootroot00000000000000[DES] Key = 0113B970FD34F2CE In = 059B5E0851CF143A Out = 86A560F10EC6D85B Key = 0123456789ABCDEF In = 4E6F772069732074 Out = 3FA40E8A984D4815 Key = 0123456789ABCDEF In = 666F7220616C6C20 Out = 893D51EC4B563B53 Key = 0123456789ABCDEF In = 68652074696D6520 Out = 6A271787AB8883F9 Key = 0131D9619DC1376E In = 5CD54CA83DEF57DA Out = 7A389D10354BD271 Key = 0170F175468FB5E6 In = 0756D8E0774761D2 Out = 0CD3DA020021DC09 Key = 018310DC409B26D6 In = 1D9D5C5018F728C2 Out = 5F4C038ED12B2E41 Key = 025816164629B007 In = 480D39006EE762F2 Out = A1F9915541020B56 Key = 04689104C2FD3B2F In = 26955F6835AF609A Out = 5C513C9C4886C088 Key = 04B915BA43FEB5B6 In = 42FD443059577FA2 Out = AF37FB421F8C4095 Key = 07A1133E4A0B2686 In = 0248D43806F67172 Out = 868EBB51CAB4599A Key = 07A7137045DA2A16 In = 3BDD119049372802 Out = DFD64A815CAF1A0F Key = 0A3FDDC8350AFF39 In = 16393BCDD6560506 Out = 9966ADCFC53BF968 Key = 10DD6DCD5C89E151 In = DC7FC6CF0358ECC0 Out = A47A7485661F7085 Key = 1C587F1C13924FEF In = 305532286D6F295A Out = 63FAC0D034D9F793 Key = 1EB00767BDEE584E In = F786D02413C574FC Out = 54C160D369F62AE3 Key = 1F08260D1AC2465E In = 6B056E18759F5CCA Out = EF1BF03E5DFA575A Key = 28EE445D8A21C534 In = 905EA29AEEA26E07 Out = 2292E9AEBEE6A4B6 Key = 37D06BB516CB7546 In = 164D5E404F275232 Out = 0A2AEEAE3FF4AB77 Key = 3849674C2602319E In = 51454B582DDF440A Out = 7178876E01F19B2A Key = 3CDE816EF9EF8EDB In = 68FF9D6068C71513 Out = 84595F5B9D046132 Key = 43297FAD38E373FE In = 762514B829BF486A Out = EA676B2CB7DB2B7A Key = 49793EBC79B3258F In = 437540C8698F3CFA Out = 6FBF1CAFCFFD0556 Key = 49E95D6D4CA229BF In = 02FE55778117F12A Out = 5A6B612CC26CCE4A Key = 4BB53ECFEFB38DDE In = 1F508A50ADB3D6E2 Out = 470204969876604A Key = 4FB05E1515AB73A7 In = 072D43A077075292 Out = 2F22E49BAB7CA1AC Key = 584023641ABA6176 In = 004BD6EF09176062 Out = 88BF0DB6D70DEE56 Key = 5F2B51F59E781D9C In = 5AA1D62806AE0EAD Out = 6DB0F280FEF2B564 Key = 699C920D7CE1E0B1 In = 7E1B1C6776833772 Out = EB11CD3C72F7E90E Key = 7AC2FDEEE4C79746 In = 5DBFB47C5F471136 Out = 9C8B904D4D772BE7 Key = 7CA110454A1A6E57 In = 01A1D6D039776742 Out = 690F5B0D9A26939B Key = 7FC92C3098ECF14A In = 4DE2F0926CF598D7 Out = BA107655991DF529 Key = 9AB645E268430854 In = F45E6819E3108559 Out = F0C76BA556283B2F Key = A6B0AE88F980011A In = 51D4EAAAC6D76553 Out = BF3C6E8FD15BA861 Key = BAFEBAFAFEAEEAFF In = 6A89626EA8038511 Out = 1067B36913CBCC47 Key = BB2420B5FEE5A6A1 In = 7B0313C0D3A866F9 Out = E49E15E4F46F10E9 Key = BEBAFBEABAFFEAAF In = 9D4A44AEFCE79965 Out = 77B2ECC9278E9714 Key = C38C6F20230D9ED5 In = 59BCDFC253424CB5 Out = 0A50ABBBCD07061A Key = C6F974504D954C7E In = D6C059A85EE2B13E Out = 25977533635BEB5B Key = CB959B7FFD94F734 In = F9E4821DFCAA5466 Out = 48EC3A79399E9A00 Key = CFB23034323CD19A In = 35E8554BAD60FB29 Out = 993A3AF0BC0D77A4 Key = D4D861035745F2C8 In = 9F97210D75B7E6DF Out = 4729E3396E57AE4E Key = E36972FC4BEC7587 In = FFFFFFFFFFFFFFFF Out = B5CE4F28FDEB21E8 Key = E91A71A7ED5EB0EF In = 323837024123C918 Out = 7F28BF28ADFA1CF0 Key = EBBBBAEBFBBEFABA In = 37DFE527086AF0A0 Out = 5F53C6C87760256E Key = EBBEEEAEBBBBFFFF In = 20678F45B5B8AC00 Out = 7CC8ECF2638CC808 Key = FBEAFFEEFFEEABAB In = 78481ED0C5A7C93E Out = 4CA3A08300EA6AFC Key = FD8A675C0ED08301 In = E2CCD415AC25412A Out = BD85B3B659AB7276 Key = FFFFFFFFFFFFFFFF In = CCCC5BDFD9029507 Out = DA57553D7D55775F Key = D5D44FF720683D0D In = 0000000000000000 Out = 23083A3CA70DD027 Key = D5D44FF720683D0D In = 0100000000000000 Out = 6F353E3388ABE2EF Key = 0101010101010101 In = 95F8A5E5DD31D900 Out = 8000000000000000 Key = 0000000000000000 In = 95F8A5E5DD31D900 Out = 8000000000000000 Key = 0101010101010101 In = DD7F121CA5015619 Out = 4000000000000000 Key = 0101010101010101 In = 2E8653104F3834EA Out = 2000000000000000 Key = 0101010101010101 In = 4BD388FF6CD81D4F Out = 1000000000000000 Key = 0101010101010101 In = 20B9E767B2FB1456 Out = 0800000000000000 Key = 0001010101010100 In = 20B9E767B2FB1456 Out = 0800000000000000 Key = 0101010101010101 In = 55579380D77138EF Out = 0400000000000000 Key = 0101010101010101 In = 6CC5DEFAAF04512F Out = 0200000000000000 Key = 0101010101010101 In = 0D9F279BA5D87260 Out = 0100000000000000 Key = 0101010101010101 In = D9031B0271BD5A0A Out = 0080000000000000 Key = 0101010101010101 In = 424250B37C3DD951 Out = 0040000000000000 Key = 0101010101010101 In = B8061B7ECD9A21E5 Out = 0020000000000000 Key = 0101010101010101 In = F15D0F286B65BD28 Out = 0010000000000000 Key = 0101010101010101 In = ADD0CC8D6E5DEBA1 Out = 0008000000000000 Key = 0101010101010101 In = E6D5F82752AD63D1 Out = 0004000000000000 Key = 0101010101010101 In = ECBFE3BD3F591A5E Out = 0002000000000000 Key = 0101010101010101 In = F356834379D165CD Out = 0001000000000000 Key = 0101010101010101 In = 2B9F982F20037FA9 Out = 0000800000000000 Key = 0101010101010101 In = 889DE068A16F0BE6 Out = 0000400000000000 Key = 0101010101010101 In = E19E275D846A1298 Out = 0000200000000000 Key = 0101010101010101 In = 329A8ED523D71AEC Out = 0000100000000000 Key = 0101010101010101 In = E7FCE22557D23C97 Out = 0000080000000000 Key = 0101010101010101 In = 12A9F5817FF2D65D Out = 0000040000000000 Key = 0101010101010101 In = A484C3AD38DC9C19 Out = 0000020000000000 Key = 0101010101010101 In = FBE00A8A1EF8AD72 Out = 0000010000000000 Key = 0101010101010101 In = 750D079407521363 Out = 0000008000000000 Key = 0101010101010101 In = 64FEED9C724C2FAF Out = 0000004000000000 Key = 0101010101010101 In = F02B263B328E2B60 Out = 0000002000000000 Key = 0101010101010101 In = 9D64555A9A10B852 Out = 0000001000000000 Key = 0101010101010101 In = D106FF0BED5255D7 Out = 0000000800000000 Key = 0101010101010101 In = E1652C6B138C64A5 Out = 0000000400000000 Key = 0101010101010101 In = E428581186EC8F46 Out = 0000000200000000 Key = 0101010101010101 In = AEB5F5EDE22D1A36 Out = 0000000100000000 Key = 0101010101010101 In = E943D7568AEC0C5C Out = 0000000080000000 Key = 0101010101010101 In = DF98C8276F54B04B Out = 0000000040000000 Key = 0101010101010101 In = B160E4680F6C696F Out = 0000000020000000 Key = 0101010101010101 In = FA0752B07D9C4AB8 Out = 0000000010000000 Key = 0101010101010101 In = CA3A2B036DBC8502 Out = 0000000008000000 Key = 0101010101010101 In = 5E0905517BB59BCF Out = 0000000004000000 Key = 0101010101010101 In = 814EEB3B91D90726 Out = 0000000002000000 Key = 0101010101010101 In = 4D49DB1532919C9F Out = 0000000001000000 Key = 0101010101010101 In = 25EB5FC3F8CF0621 Out = 0000000000800000 Key = 0101010101010101 In = AB6A20C0620D1C6F Out = 0000000000400000 Key = 0101010101010101 In = 79E90DBC98F92CCA Out = 0000000000200000 Key = 0101010101010101 In = 866ECEDD8072BB0E Out = 0000000000100000 Key = 0101010101010101 In = 8B54536F2F3E64A8 Out = 0000000000080000 Key = 0101010101010101 In = EA51D3975595B86B Out = 0000000000040000 Key = 0101010101010101 In = CAFFC6AC4542DE31 Out = 0000000000020000 Key = 0101010101010101 In = 8DD45A2DDF90796C Out = 0000000000010000 Key = 0101010101010101 In = 1029D55E880EC2D0 Out = 0000000000008000 Key = 0101010101010101 In = 5D86CB23639DBEA9 Out = 0000000000004000 Key = 0101010101010101 In = 1D1CA853AE7C0C5F Out = 0000000000002000 Key = 0101010101010101 In = CE332329248F3228 Out = 0000000000001000 Key = 0101010101010101 In = 8405D1ABE24FB942 Out = 0000000000000800 Key = 0101010101010101 In = E643D78090CA4207 Out = 0000000000000400 Key = 0101010101010101 In = 48221B9937748A23 Out = 0000000000000200 Key = 0101010101010101 In = DD7C0BBD61FAFD54 Out = 0000000000000100 Key = 0101010101010101 In = 2FBC291A570DB5C4 Out = 0000000000000080 Key = 0101010101010101 In = E07C30D7E4E26E12 Out = 0000000000000040 Key = 0101010101010101 In = 0953E2258E8E90A1 Out = 0000000000000020 Key = 0101010101010101 In = 5B711BC4CEEBF2EE Out = 0000000000000010 Key = 0101010101010101 In = CC083F1E6D9E85F6 Out = 0000000000000008 Key = 0101010101010101 In = D2FD8867D50D2DFE Out = 0000000000000004 Key = 0101010101010101 In = 06E7EA22CE92708F Out = 0000000000000002 Key = 0101010101010101 In = 166B40B44ABA4BD6 Out = 0000000000000001 Key = 8001010101010101 In = 0000000000000000 Out = 95A8D72813DAA94D Key = 4001010101010101 In = 0000000000000000 Out = 0EEC1487DD8C26D5 Key = 2001010101010101 In = 0000000000000000 Out = 7AD16FFB79C45926 Key = 1001010101010101 In = 0000000000000000 Out = D3746294CA6A6CF3 Key = 0801010101010101 In = 0000000000000000 Out = 809F5F873C1FD761 Key = 0401010101010101 In = 0000000000000000 Out = C02FAFFEC989D1FC Key = 0201010101010101 In = 0000000000000000 Out = 4615AA1D33E72F10 Key = 0180010101010101 In = 0000000000000000 Out = 2055123350C00858 Key = 0140010101010101 In = 0000000000000000 Out = DF3B99D6577397C8 Key = 0120010101010101 In = 0000000000000000 Out = 31FE17369B5288C9 Key = 0110010101010101 In = 0000000000000000 Out = DFDD3CC64DAE1642 Key = 0108010101010101 In = 0000000000000000 Out = 178C83CE2B399D94 Key = 0104010101010101 In = 0000000000000000 Out = 50F636324A9B7F80 Key = 0102010101010101 In = 0000000000000000 Out = A8468EE3BC18F06D Key = 0101800101010101 In = 0000000000000000 Out = A2DC9E92FD3CDE92 Key = 0101400101010101 In = 0000000000000000 Out = CAC09F797D031287 Key = 0101200101010101 In = 0000000000000000 Out = 90BA680B22AEB525 Key = 0101100101010101 In = 0000000000000000 Out = CE7A24F350E280B6 Key = 0101080101010101 In = 0000000000000000 Out = 882BFF0AA01A0B87 Key = 0101040101010101 In = 0000000000000000 Out = 25610288924511C2 Key = 0101020101010101 In = 0000000000000000 Out = C71516C29C75D170 Key = 0101018001010101 In = 0000000000000000 Out = 5199C29A52C9F059 Key = 0101014001010101 In = 0000000000000000 Out = C22F0A294A71F29F Key = 0101012001010101 In = 0000000000000000 Out = EE371483714C02EA Key = 0101011001010101 In = 0000000000000000 Out = A81FBD448F9E522F Key = 0101010801010101 In = 0000000000000000 Out = 4F644C92E192DFED Key = 0101010401010101 In = 0000000000000000 Out = 1AFA9A66A6DF92AE Key = 0101010201010101 In = 0000000000000000 Out = B3C1CC715CB879D8 Key = 0101010180010101 In = 0000000000000000 Out = 19D032E64AB0BD8B Key = 0101010140010101 In = 0000000000000000 Out = 3CFAA7A7DC8720DC Key = 0101010120010101 In = 0000000000000000 Out = B7265F7F447AC6F3 Key = 0101010110010101 In = 0000000000000000 Out = 9DB73B3C0D163F54 Key = 0101010108010101 In = 0000000000000000 Out = 8181B65BABF4A975 Key = 0101010104010101 In = 0000000000000000 Out = 93C9B64042EAA240 Key = 0101010102010101 In = 0000000000000000 Out = 5570530829705592 Key = 0101010101800101 In = 0000000000000000 Out = 8638809E878787A0 Key = 0101010101400101 In = 0000000000000000 Out = 41B9A79AF79AC208 Key = 0101010101200101 In = 0000000000000000 Out = 7A9BE42F2009A892 Key = 0101010101100101 In = 0000000000000000 Out = 29038D56BA6D2745 Key = 0101010101080101 In = 0000000000000000 Out = 5495C6ABF1E5DF51 Key = 0101010101040101 In = 0000000000000000 Out = AE13DBD561488933 Key = 0101010101020101 In = 0000000000000000 Out = 024D1FFA8904E389 Key = 0101010101018001 In = 0000000000000000 Out = D1399712F99BF02E Key = 0101010101014001 In = 0000000000000000 Out = 14C1D7C1CFFEC79E Key = 0101010101012001 In = 0000000000000000 Out = 1DE5279DAE3BED6F Key = 0101010101011001 In = 0000000000000000 Out = E941A33F85501303 Key = 0101010101010801 In = 0000000000000000 Out = DA99DBBC9A03F379 Key = 0101010101010401 In = 0000000000000000 Out = B7FC92F91D8E92E9 Key = 0101010101010201 In = 0000000000000000 Out = AE8E5CAA3CA04E85 Key = 0101010101010180 In = 0000000000000000 Out = 9CC62DF43B6EED74 Key = 0101010101010140 In = 0000000000000000 Out = D863DBB5C59A91A0 Key = 0101010101010120 In = 0000000000000000 Out = A1AB2190545B91D7 Key = 0101010101010110 In = 0000000000000000 Out = 0875041E64C570F7 Key = 0101010101010108 In = 0000000000000000 Out = 5A594528BEBEF1CC Key = 0101010101010104 In = 0000000000000000 Out = FCDB3291DE21F0C0 Key = 0101010101010102 In = 0000000000000000 Out = 869EFD7F9F265A09 Key = 1046913489980131 In = 0000000000000000 Out = 88D55E54F54C97B4 Key = 1007103489988020 In = 0000000000000000 Out = 0C0CC00C83EA48FD Key = 10071034C8980120 In = 0000000000000000 Out = 83BC8EF3A6570183 Key = 1046103489988020 In = 0000000000000000 Out = DF725DCAD94EA2E9 Key = 1086911519190101 In = 0000000000000000 Out = E652B53B550BE8B0 Key = 1086911519580101 In = 0000000000000000 Out = AF527120C485CBB0 Key = 5107B01519580101 In = 0000000000000000 Out = 0F04CE393DB926D5 Key = 1007B01519190101 In = 0000000000000000 Out = C9F00FFC74079067 Key = 3107915498080101 In = 0000000000000000 Out = 7CFD82A593252B4E Key = 3107919498080101 In = 0000000000000000 Out = CB49A2F9E91363E3 Key = 10079115B9080140 In = 0000000000000000 Out = 00B588BE70D23F56 Key = 3107911598090140 In = 0000000000000000 Out = 406A9A6AB43399AE Key = 1007D01589980101 In = 0000000000000000 Out = 6CB773611DCA9ADA Key = 9107911589980101 In = 0000000000000000 Out = 67FD21C17DBB5D70 Key = 9107D01589190101 In = 0000000000000000 Out = 9592CB4110430787 Key = 1007D01598980120 In = 0000000000000000 Out = A6B7FF68A318DDD3 Key = 1007940498190101 In = 0000000000000000 Out = 4D102196C914CA16 Key = 0107910491190401 In = 0000000000000000 Out = 2DFA9F4573594965 Key = 0107910491190101 In = 0000000000000000 Out = B46604816C0E0774 Key = 0107940491190401 In = 0000000000000000 Out = 6E7E6221A4F34E87 Key = 19079210981A0101 In = 0000000000000000 Out = AA85E74643233199 Key = 1007911998190801 In = 0000000000000000 Out = 2E5A19DB4D1962D6 Key = 10079119981A0801 In = 0000000000000000 Out = 23A866A809D30894 Key = 1007921098190101 In = 0000000000000000 Out = D812D961F017D320 Key = 100791159819010B In = 0000000000000000 Out = 055605816E58608F Key = 1004801598190101 In = 0000000000000000 Out = ABD88E8B1B7716F1 Key = 1004801598190102 In = 0000000000000000 Out = 537AC95BE69DA1E1 Key = 1004801598190108 In = 0000000000000000 Out = AED0F6AE3C25CDD8 Key = 1002911598100104 In = 0000000000000000 Out = B3E35A5EE53E7B8D Key = 1002911598190104 In = 0000000000000000 Out = 61C79C71921A2EF8 Key = 1002911598100201 In = 0000000000000000 Out = E2F5728F0995013C Key = 1002911698100101 In = 0000000000000000 Out = 1AEAC39A61F0A464 Key = 7CA110454A1A6E57 In = 01A1D6D039776742 Out = 690F5B0D9A26939B Key = 0131D9619DC1376E In = 5CD54CA83DEF57DA Out = 7A389D10354BD271 Key = 07A1133E4A0B2686 In = 0248D43806F67172 Out = 868EBB51CAB4599A Key = 3849674C2602319E In = 51454B582DDF440A Out = 7178876E01F19B2A Key = 04B915BA43FEB5B6 In = 42FD443059577FA2 Out = AF37FB421F8C4095 Key = 0113B970FD34F2CE In = 059B5E0851CF143A Out = 86A560F10EC6D85B Key = 0170F175468FB5E6 In = 0756D8E0774761D2 Out = 0CD3DA020021DC09 Key = 43297FAD38E373FE In = 762514B829BF486A Out = EA676B2CB7DB2B7A Key = 07A7137045DA2A16 In = 3BDD119049372802 Out = DFD64A815CAF1A0F Key = 04689104C2FD3B2F In = 26955F6835AF609A Out = 5C513C9C4886C088 Key = 37D06BB516CB7546 In = 164D5E404F275232 Out = 0A2AEEAE3FF4AB77 Key = 1F08260D1AC2465E In = 6B056E18759F5CCA Out = EF1BF03E5DFA575A Key = 584023641ABA6176 In = 004BD6EF09176062 Out = 88BF0DB6D70DEE56 Key = 025816164629B007 In = 480D39006EE762F2 Out = A1F9915541020B56 Key = 49793EBC79B3258F In = 437540C8698F3CFA Out = 6FBF1CAFCFFD0556 Key = 4FB05E1515AB73A7 In = 072D43A077075292 Out = 2F22E49BAB7CA1AC Key = 49E95D6D4CA229BF In = 02FE55778117F12A Out = 5A6B612CC26CCE4A Key = 018310DC409B26D6 In = 1D9D5C5018F728C2 Out = 5F4C038ED12B2E41 Key = 1C587F1C13924FEF In = 305532286D6F295A Out = 63FAC0D034D9F793 Key = 1046913489980131 In = 0000000000000000 Out = 88D55E54F54C97B4 Key = 1007103489988020 In = 0000000000000000 Out = 0C0CC00C83EA48FD Key = 10071034C8980120 In = 0000000000000000 Out = 83BC8EF3A6570183 Key = 1046103489988020 In = 0000000000000000 Out = DF725DCAD94EA2E9 Key = 1086911519190101 In = 0000000000000000 Out = E652B53B550BE8B0 Key = 1086911519580101 In = 0000000000000000 Out = AF527120C485CBB0 Key = 5107B01519580101 In = 0000000000000000 Out = 0F04CE393DB926D5 Key = 1007B01519190101 In = 0000000000000000 Out = C9F00FFC74079067 Key = 3107915498080101 In = 0000000000000000 Out = 7CFD82A593252B4E Key = 3107919498080101 In = 0000000000000000 Out = CB49A2F9E91363E3 Key = 10079115B9080140 In = 0000000000000000 Out = 00B588BE70D23F56 Key = 3107911598080140 In = 0000000000000000 Out = 406A9A6AB43399AE Key = 1007D01589980101 In = 0000000000000000 Out = 6CB773611DCA9ADA Key = 9107911589980101 In = 0000000000000000 Out = 67FD21C17DBB5D70 Key = 9107D01589190101 In = 0000000000000000 Out = 9592CB4110430787 Key = 1007D01598980120 In = 0000000000000000 Out = A6B7FF68A318DDD3 Key = 1007940498190101 In = 0000000000000000 Out = 4D102196C914CA16 Key = 0107910491190401 In = 0000000000000000 Out = 2DFA9F4573594965 Key = 0107910491190101 In = 0000000000000000 Out = B46604816C0E0774 Key = 0107940491190401 In = 0000000000000000 Out = 6E7E6221A4F34E87 Key = 19079210981A0101 In = 0000000000000000 Out = AA85E74643233199 Key = 1007911998190801 In = 0000000000000000 Out = 2E5A19DB4D1962D6 Key = 10079119981A0801 In = 0000000000000000 Out = 23A866A809D30894 Key = 1007921098190101 In = 0000000000000000 Out = D812D961F017D320 Key = 100791159819010B In = 0000000000000000 Out = 055605816E58608F Key = 1004801598190101 In = 0000000000000000 Out = ABD88E8B1B7716F1 Key = 1004801598190102 In = 0000000000000000 Out = 537AC95BE69DA1E1 Key = 1004801598190108 In = 0000000000000000 Out = AED0F6AE3C25CDD8 Key = 1002911598100104 In = 0000000000000000 Out = B3E35A5EE53E7B8D Key = 1002911598190104 In = 0000000000000000 Out = 61C79C71921A2EF8 Key = 1002911598100201 In = 0000000000000000 Out = E2F5728F0995013C Key = 1002911698100101 In = 0000000000000000 Out = 1AEAC39A61F0A464 Key = 309A4B21A2067196 In = 0CEB1136A85AD37A Out = 9CE3A1058A483F55 Key = CA61DEF25C51A5A0 In = 9BBBD2F50EC248A8 Out = 7694CA89548B0A3B Key = 054F6AC2C779D51A In = FF82E00A54C33870 Out = ADF2C2D3F57C12EC Key = AB28E5763F23361A In = 3E33A822C3C3573A Out = 91481544C1349FD2 Key = A9C631D31852201F In = 8BB2EC62E042C9BF Out = 62F0E53062A010B9 Key = 3D90CADF843BBA1B In = 4844511C42049973 Out = C7265CA05D9F3253 Key = B6006A2C549DEA94 In = 38F11633A3766D10 Out = 66D55E36CCE18435 Key = 070A848D67D7701C In = 746BC597A7501FF0 Out = 0032D9CA6E094980 Key = A12AE6006E8F8D37 In = FA5F22A6A7DDBB8B Out = 91ECEFD28E217506 Key = 9998A725FB90FDE4 In = 8D3D08E33FBB298D Out = CF132CE973D16AA3 Key = F111F3AFD4602715 In = 397CA570B07AF49E Out = 4C2959260E6C27DC Key = EF97EA242CCBAC00 In = 6ACFBFF2962511A9 Out = 2D325409EF2CD744 Key = 9080E3410BFCDB73 In = EB5167B434A4595A Out = 483EA80264F0DCF6 Key = 8A37156BE5515D5D In = E72EDA1F8AE27EB9 Out = 0E4AF25FBDD5A85E Key = DF09A6387CFE9A6B In = B0F7D48AA74DD638 Out = 7F6747AEF2C9EAC9 Key = B4FCAFFB540653E5 In = 334A69684C8B728A Out = 6717F2AD848DEAF7 Key = 183972A45732379A In = A78C724DA4DC969D Out = AC6A97ECE16A8892 Key = 979D352937F85083 In = 4310191D687F40D6 Out = C9B0C9CA84CFC141 Key = 5CEDCE103F7F73C4 In = F630889FB4B5ED90 Out = 6166F3231EC1EAD9 Key = 4AD1B967A715F5A9 In = C9C7BFE95A2F77FD Out = B6C234EAF4A39B1F Key = F883F548F16E692A In = 43E2B87BB55A3038 Out = B9BE452E0E4EA44D Key = D75198DF25CC1345 In = 42AA788D751F49A5 Out = 5302E3BA833E598A Key = 7033D4C5D9B36096 In = 63E22CDF499763C3 Out = 70E8BD70BCE301CB Key = 76B7EAC1DB819238 In = 665976555719E76F Out = 65769A95FB144DE9 Key = 76FC0A292121B094 In = 12DD07305BC143DE Out = A5E73B90A3E75586 Key = B775628F1EC6520C In = 45A11A91EF86DDA6 Out = 6E2C2CC2A2333C88 Key = 65BF73315A05061C In = 537FEBCB1219673B Out = D578B8AA85351F91 Key = E772317D24F6D307 In = F5F17039BA37C1C0 Out = 3D6A8E5991C3AEBB Key = 461E02D82081CA3A In = D0530A774112DC14 Out = 307AE98F2B6864D0 Key = 08FF3D9BDE9EEA8E In = A46F062CBB7BFC33 Out = A9D2B0940F0A7F58 Key = 4D92A8AE6F9C6A35 In = A47F14BAA946FB7B Out = 4E79EBEFD716D85F Key = FB1C7BB97C7ED50C In = 692A27DA86F2E283 Out = 29961C5FD6744638 Key = C9B0558D7C353C5E In = 74D5CD027725903C Out = B8A8076072E55000 Key = 60D82E111EEEDEA8 In = 2311E3818223DFA9 Out = 17A4E5989E9C9A3D Key = 76DB3E3505FD3A95 In = 984B849763274BD3 Out = 205C2B2AEDB6052D Key = 558EF761EEE52DCF In = 9852C739E74737B7 Out = 525CBAD9C2D50EA0 Key = AC340D97D96CF29E In = 6C4236CFAEFF63EC Out = E1AD916DED6850F4 Key = 50F5C29F83C8F2BF In = 1A95C43E9C7D5339 Out = B60E5C4C76CE51C6 Key = C7BF9EB44254ACA6 In = 7DBE4645B2C169F4 Out = 285276D256091B2E Key = FE80AB20EAC7AD16 In = 841DEAE87A860986 Out = 799A5A58E5CE9D59 Key = B012DE369D9B7436 In = 1529ACE917CA5AB4 Out = AAB07F8FDBDC494E Key = 61896A3271D3E2B2 In = 86462C0AD4003FEC Out = 51310B7C123C64C4 Key = 8514D38254A5A55F In = A67151571BE9AB07 Out = 3024667AFF88ADAB Key = F607C0CD0FAFCC60 In = B314608B183F3329 Out = AA966A7A395FFAE7 Key = 10EEC9E7F07A51D3 In = 84B322B129ABACDF Out = C50F0D6E439E8490 Key = 32F4E03E3B10DB42 In = E296E275356AA9A0 Out = B3963851F7DEB2C3 Key = 52205900EE0836E6 In = 4DF2292E321837F6 Out = 1D017CE1B3C03380 Key = A481D9B2C7FDA435 In = 88A2C60FB19E5983 Out = 77763644264C8FB8 Key = 404025B368276238 In = 06CA0C88A4347E12 Out = F1FCAEAF30C63870 Key = 657486656993AC7B In = FEFD2DF531FE9112 Out = 8F49A08722BB14F0 Key = 9474B8E8C73BCA7D In = 9474B8E8C73BCA7D Out = 8DA744E0C94E5E17 Key = 8DA744E0C94E5E17 In = 0CDB25E3BA3C6D79 Out = 8DA744E0C94E5E17 Key = 0CDB25E3BA3C6D79 In = 0CDB25E3BA3C6D79 Out = 4784C4BA5006081F Key = 4784C4BA5006081F In = 1CF1FC126F2EF842 Out = 4784C4BA5006081F Key = 1CF1FC126F2EF842 In = 1CF1FC126F2EF842 Out = E4BE250042098D13 Key = E4BE250042098D13 In = 7BFC5DC6ADB5797C Out = E4BE250042098D13 Key = 7BFC5DC6ADB5797C In = 7BFC5DC6ADB5797C Out = 1AB3B4D82082FB28 Key = 1AB3B4D82082FB28 In = C1576A14DE707097 Out = 1AB3B4D82082FB28 Key = C1576A14DE707097 In = C1576A14DE707097 Out = 739B68CD2E26782A Key = 739B68CD2E26782A In = 2A59F0C464506EDB Out = 739B68CD2E26782A Key = 2A59F0C464506EDB In = 2A59F0C464506EDB Out = A5C39D4251F0A81E Key = A5C39D4251F0A81E In = 7239AC9A6107DDB1 Out = A5C39D4251F0A81E Key = 7239AC9A6107DDB1 In = 7239AC9A6107DDB1 Out = 070CAC8590241233 Key = 070CAC8590241233 In = 78F87B6E3DFECF61 Out = 070CAC8590241233 Key = 78F87B6E3DFECF61 In = 78F87B6E3DFECF61 Out = 95EC2578C2C433F0 Key = 95EC2578C2C433F0 In = 1B1A2DDB4C642438 Out = 95EC2578C2C433F0 [DESX] Key = 0123456789ABCDEF01010101010101011011121314151617 In = 94DBE082549A14EF Out = 9011121314151617 Key = E874076EF40EDA62908D12ADF2B7B9ECDA474BF3FEDCDA11 In = B83DF91F844FF695 Out = FA942810AC8355C0 Key = 2AF5602DA83F821A69C81B1B83EFA70A3B4E3C1D546BF825 In = 4EF5D7337D420403 Out = B2C3C73B303BE0D7 Key = BEB7DF4A710FACB364183EEBCA3EE934A5B470031CE64A03 In = 8D3C8F07A610FD51 Out = 5712559676CABA44 Key = 46312600F8B5F05AFAA080D26672B9C44AF057D694702AB5 In = B39949A845EF61C1 Out = 3769F87FB393D49F Key = 25A3EAE6D9FB10E86E14032BB652262CD1D7ED74A2BFC75B In = B00E6572A847D27A Out = 6B1C14571BC9EBCE Key = 3D5BEA2C2216E30CE961882A593608CB5BA96FC656AF7487 In = 07608C7CB2B11972 Out = CD627B22E13ECCD4 Key = 5AD28C1D67C65E4D5F4A9DB38C32827BC6C4FE098996F017 In = C2B7BCC1EA18B54A Out = 66EF45BEA20DDAAF Key = 8A94FCBF30415180EF79881D32C8C061E4527DE53BF5915D In = 59004793279BBEFA Out = F0B6AC1318F01331 [TripleDES] Key = 0123456789ABCDEFFEDCBA9876543210 In = 0123456789ABCDE7 Out = 7F1D0A77826B8AFF Key = 0123456789ABCDEF0123456789ABCDEF In = 4E6F772069732074 Out = 3FA40E8A984D4815 Key = 04B915BA43FEB5B604B915BA43FEB5B6 In = 42FD443059577FA2 Out = AF37FB421F8C4095 Key = 4BC59E2C68ACA60767A9A4B623BBBCCC In = AFA4284FCCEAA61A Out = 32527D5701D92B90 Key = B955BB7861FDE77E7DC6418475457FE1 In = 50B503A331D5B5CC Out = E46A59E18B0C41E3 Key = C0557629EAA72ABD4C102C5DC9CE8B47 In = 3404435D5DF2CB47 Out = 644DD68EA73053AE Key = 9EAA94DA916F30092E79DACDCDCC45C0 In = C7D80E955D1B6627 Out = 9FE1C5A12CCE6DD9 Key = A55279671807D9B71FE62A77341249F8 In = BDCBE8929CD0E12F Out = F2B6430450AB348B Key = 672E20826AD49C3DF7579FAB3752479E In = 4B7A96B7051C64FC Out = 1555F08B2DE690A0 Key = 0CE61EDE2659B413AB9F717AE4AFAD3E In = 902F4EDD44EAF3C1 Out = 3CE357EBA0FB3E26 Key = E878020815AE517CD2808B6571EAC2B4 In = 39C0F8E4C85CD70D Out = 882DE9B6D0209A58 Key = D891CA20919F06A054BA3943C7DABA16 In = F77A1947A921B209 Out = E10DBEE5615F312E Key = 4909AED1F94EB77B6CACBCAE2B25689A In = 06D0416E0F0DB7CE Out = 0CEC5D1E59D7E347 Key = 8B9A5C13B0B118A1EE35EB912866FFA6 In = F7BB3A396D73D8A8 Out = F893B6B2A15D3FCE Key = FA7911D664326074B42E2F38E599B288 In = BD35E3134B90CCBC Out = 12A7AF172FD0CA7F Key = 406903B340B8637928FDE8058BDD6710 In = E046B7F5707DA4FC Out = 32B6A3FC72C7C480 Key = 37A2B53E2AF8F6C9A73B39F919D969DE In = 58EB1DC16C482213 Out = A6C6234A8BBAA116 Key = 711F2CECDB92B2E201DFEFA79FA7BA2F In = 4BD0F4854297FBDE Out = F4AB771861457DC6 Key = 04B915BA43FEB5B604B915BA43FEB5B604B915BA43FEB5B6 In = 42FD443059577FA2 Out = AF37FB421F8C4095 Key = 0123456789ABCDEF5555555555555555FEDCBA9876543210 In = 736F6D6564617461 Out = 18D748E563620572 Key = 0352020767208217860287665908219864056ABDFEA93457 In = 7371756967676C65 Out = C07D2A0FA566FA30 Key = 0123456789ABCDEFFEDCBA987654321089ABCDEF01234567 In = 0123456789ABCDE7 Out = DE0B7C06AE5E0ED5 Key = 0123456789ABCDEFFEDCBA98765432100123456789ABCDEF In = 0123456789ABCDE7 Out = 7F1D0A77826B8AFF Key = 1EF743A68D629F68A5E3136C36AD7953A835CF849BB4EC3C In = 4115E551299A5C4B Out = F7A0822FC310686C Key = B7D560BE49C3936728EF0BF57B602D2EB7E5C631DD7F753E In = D5AB44E0FE46E1B5 Out = 02AED9BF72ECA222 Key = D2D98706E9AB867647D244BDCDBCD5EF8B4DBC9CF4F35493 In = B4077DFDB721D88C Out = F76ABA838B1C4372 Key = 153B963004101D12683E8F87116001B8C5526475510B5036 In = 890E98AB385FA1A1 Out = 187087C77790C3B2 Key = 45E4275DCCC5D8B5A27993C16D9960CA939C023E2763216A In = 02D5DA6D5F247CD2 Out = 89FC7DF1E7913163 Key = F6C2474B33934EA76E6C841D9B1E86E37189095A895A3E5A In = 5AF9E5A3525E3F7D Out = 8FCC7A8BC337E484 Key = 5B4F6D3185EFBAE97D58ED9CC75E2BAE655D2CEFB2DD09CD In = 12864DDE8E694BD1 Out = 5B4DDE8F000A5A9B Key = 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF In = 0123456789ABCDE7 Out = C95744256A5ED31D Key = 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF In = 68652074696D6520 Out = 6A271787AB8883F9 Key = 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF In = 4E6F772069732074 Out = 3FA40E8A984D4815 Key = C9B6D82EF93DD4C7AC365AB2D9280EB39DD92C0CE3F72BDE In = 94A8A0655AF71024 Out = A427AA4C6234817E Key = 704A6378B5C72C3F1617B97508777FACF8E2205C66D29279 In = 2881AE1EF7DC8DE2 Out = 5C009647DE419151 Key = 9D5DF5B9222F4E04197A0E194AFBD4BA0225D1472F925076 In = 462EC3631C8C0DA9 Out = 52E8D6E3F54404C3 Key = 8374C4173F715AA127877D3BEFB8C0B2FF5987E12B112FD9 In = 941F85F14CC3E9F8 Out = 3FE08C51BC513AD9 Key = CD5BCCEC928C04E91E4CFC715E10E029E01F870FB98E7B34 In = 99A30F38CE575814 Out = 5C02AECC12404AB6 Key = 59345A37BE821AA78E0BD97259C54BEBB1F644B78B1FD310 In = 69F80C7EAF46CBAD Out = 9FF8BCB5707A0ED9 Key = E3C22C1AAAAF0FBF61A170BC24361F274B404E36C8F1794A In = 62522184CE03EFF7 Out = 0E98911465E30E76 Key = C0E492C873EFE871E534A2A30600418D636C3FC76C4E9EA6 In = DED10258F58DAA03 Out = 2CD2D1F377C13A53 Key = DC80FA652BBB01186C6CFDDF55E109808F6CCEC99DEE3633 In = AFC190AF21D37A39 Out = E7B312CCC287374C Key = 276B5FC5C5255AE2484114EAC33CD228A7BEAA9487D9A729 In = 8A206F645001553B Out = B824E9E801940B83 Key = 70890F38A3A6744162356109589DC20ABF2D3AD8E989A77F In = 2095D9F03C7EC366 Out = 537201E0D3FFCECE Key = 86164AB6C13CA0AD6B35EEDDDE102428C822C22DB1326661 In = D51A8F5310D314DE Out = 7EE4FEA9B78CB899 Key = 98D2D51E2916D25237DAFC6B5CFBB5AED7CCD916BF243004 In = B0317287CC8D536B Out = 118293DE51E43D00 Key = BBA72F7362A8E3BA6EE190C4E0AC25560BB0DF1097F94C13 In = A8BF0F3A57822AFE Out = 9FD4F7B0500C0F53 Key = 6F9DD25B6ACAB7019A548B6B0E1AA35AFEF95D89DB20FB11 In = C16B7EAD2367C87D Out = 9FE31F892EB7E617 Key = 1670F96FC4D670CF3BEC580AE1735FE3DFB3E0377FEC16C8 In = C5E3D11391C7875B Out = 0B5BC8B430785004 Key = 3B55AC7156436FCA1D639BC33541F91AD0BE7525C3D0E823 In = CCCBFFFAB48110DB Out = 08E145136C8112C4 Key = D24A2A7340C974E68265C4DFACE67041852889ADDF1216AF In = 039391950AC5937C Out = 5251FDDBD6E2E70D Key = 777EAD928BFB661003A4E0F0920CD161A2C03963C816F1F3 In = 41BD298935B10395 Out = 228EDD3DA5B00098 Key = 6335EA2F228A811B7B70AE47BF13F8D456A717BC2AC1F301 In = FFC524C0B0F48806 Out = 092D1465E01D9356 Key = EFACE1D2899E742C6A65EB523447B6001E2FE3DB1D6BD904 In = 2E499BC53CFEB666 Out = 87B59F9BD6ADE17C Key = DA0BB6DD13B7707C674C72DD1A7C1B3FD03B13832C8CFC13 In = 8250B551ADAEE699 Out = A286D77E36481FA8 Key = 0F6997BD4AFACC4E2228180FA60A683D13C6E237325BC671 In = F48717AE3466F0F5 Out = 403CB3AFDA050BFB Key = 77790E57117F767476AE9E623A839D1B5B596623CB193C08 In = 8308D7DDC9BE043C Out = 08FF7FB8D322FE1E Key = 1A34BA494ADC8ED74B6AD1EDAF317DA506FBDA7A0D0DD40C In = DA0EDCDC26C81F71 Out = 5E54344C7E8CF8A0 botan-2.4.0/src/tests/data/block/gost_28147.vec000066400000000000000000000064211322470703100207760ustar00rootroot00000000000000[GOST-28147-89(R3411_94_TestParam)] Key = BE5EC2006CFF9DCF52354959F1FF0CBFE95061B5A648C10387069C25997C0672 In = 0DF82802B741A292 Out = 07F9027DF7F7DF89 Key = B385272AC8D72A5A8B344BC80363AC4D09BF58F41F540624CBCB8FDCF55307D7 In = 1354EE9C0A11CD4C Out = 4FB50536F960A7B1 Key = AEE02F609A35660E4097E546FD3026B032CD107C7D459977ADF489BEF2652262 In = 6693D492C4B0CC39 Out = 670034AC0FA811B5 Key = 320E9D8422165D58911DFC7D8BBB1F81B0ECD924023BF94D9DF7DCF7801240E0 In = 99E2D13080928D79 Out = 8118FF9D3B3CFE7D Key = C9F703BBBFC63691BFA3B7B87EA8FD5E8E8EF384EF733F1A61AEF68C8FFA265F In = D1E787749C72814C Out = A083826A790D3E0C Key = 728FEE32F04B4C654AD7F607D71C660C2C2670D7C999713233149A1C0C17A1F0 In = D4C05323A4F7A7B5 Out = 4D1F2E6B0D9DE2CE Key = 35FC96402209500FCFDEF5352D1ABB038FE33FC0D9D58512E56370B22BAA133B In = 8742D9A05F6A3AF6 Out = 2F3BB84879D11E52 Key = D416F630BE65B7FE150656183370E07018234EE5DA3D89C4CE9152A03E5BFB77 In = F86506DA04E41CB8 Out = 96F0A5C77A04F5CE Key = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A In = 66320DB73158A35A Out = 4732FE56B7854AF7 Key = 255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC67 In = 3E017E97EADC6B96 Out = 4CDDBE526625E368 Key = 8F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C94 In = 75D8BE6189F95CBB Out = 4FD8C167F5C05C76 Key = A8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C5 In = 14735AC55E4B7963 Out = DFCD9EFC3FA9BAFB Key = 3B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF5 In = 0BE11A1C7F23F829 Out = E0BB12ECA3001350 Key = FA7F444FD5D2002D294B96C34DC57D297ED55FDA3214D99BD79F7A0EF8972DF2 In = 167241EC4441196D Out = 2361B9315757145A Key = 8DAF30DA74AD04F28263CCB577A6504E45CB5C3D628A2F79FC706540B27EAD3F In = 2EDD19A28A1D950C Out = 0B4CB6EE4CDBC46E Key = 8161C1F80712474CDDA3893F2DB8B829291D69DB9C161ACAF3336C7D51018AD2 In = 634BCA6A5D11B73A Out = 990D426E1415B346 Key = B5407AE2F9320C225075FDEC8C17B67F4A22FD9B24876D87D238F13049A86AFE In = E9E4E1E217ED0467 Out = 83F7B229D74D5068 Key = 620153EE18096E622B6BFE4FF26BD6C4A3C8F4ED705FEB5943CC3B5AB93FC11C In = 40140A581D78BB49 Out = D48ADCE9AE2DF9A7 [GOST-28147-89(R3411_CryptoPro)] Key = FA7F444FD5D2002D294B96C34DC57D297ED55FDA3214D99BD79F7A0EF8972DF2 In = 167241EC4441196D Out = A4BA7733087BF46B Key = 8DAF30DA74AD04F28263CCB577A6504E45CB5C3D628A2F79FC706540B27EAD3F In = 2EDD19A28A1D950C Out = 9F5F0C9271672126 Key = 8161C1F80712474CDDA3893F2DB8B829291D69DB9C161ACAF3336C7D51018AD2 In = 634BCA6A5D11B73A Out = 68E44CBA27E3B0C3 Key = B5407AE2F9320C225075FDEC8C17B67F4A22FD9B24876D87D238F13049A86AFE In = E9E4E1E217ED0467 Out = 0B9B79E1AFE9D61F Key = 620153EE18096E622B6BFE4FF26BD6C4A3C8F4ED705FEB5943CC3B5AB93FC11C In = 40140A581D78BB49 Out = 5C960D01D404702D Key = 3AD1D828517CC8B001F0CA84010B3A0968AF11272336DE5A91A7AD69B49E7EEE In = 705616C1D3DE72D4 Out = C934D4A3CDF6725C Key = CE3C58CF4893D9B042EAD76520B5C0B15C6D1A100B99FF7BEF153DC2F4AF96C2 In = EBEF9233826BE3C4 Out = E29B5234B9903B4B Key = 55BA2A7570EA26CC5741DD62DADCDEC9F11B8CE5CA22A8B5113AE993A5CC58FA In = 87826FF76C95C3C3 Out = ABDC9E8C2A556516 Key = D6A025B07C037A6E1E0653E828FB9E3A3587CDDA5325D4DAA743D113D995D6AF In = 35FC60B2FFDA201E Out = 391DD791413EAF33 Key = E07306086FA442A42B107F7F355359DD972BF070C0C71FF5C37FA7C259C7E039 In = 3BE742AA8B844EB7 Out = 06798A7B621A4F7F botan-2.4.0/src/tests/data/block/idea.vec000066400000000000000000001446201322470703100201630ustar00rootroot00000000000000 #test cpuid sse2 [IDEA] Key = ED1BCC9E9267925F3132BA3A8CF9B764 In = 7409000000000000 Out = E18315C171B83765 Key = 729A27ED8F5C3E8BAF16560D14C90B43 In = D53FABBF94FF8B5F Out = 1D0CB2AF1654820A Key = 729A27ED8F5C3E8BAF16560D14C90B43 In = 848F836780938169 Out = D7E0468226D0FC56 Key = 729A27ED8F5C3E8BAF16560D14C90B43 In = 819440CA2065D112 Out = 264A8BBA66959075 Key = 729A27ED8F5C3E8BAF16560D14C90B43 In = 6C2E3617DA2BAC35 Out = 1569E0627007B12E Key = 9D4075C103BC322AFB03E7BE6AB30006 In = 0808080808080808 Out = F5DB1AC45E5EF9F9 Key = 3A984E2000195DB32EE501C8C47CEA60 In = 0102030405060708 Out = 97BCD8200780DA86 Key = 006400C8012C019001F4025802BC0320 In = 05320A6414C819FA Out = 65BE87E7A2538AED Key = 00010002000300040005000600070008 In = 0000000100020003 Out = 11FBED2B01986DE5 Key = 00010002000300040005000600070008 In = 0102030405060708 Out = 540E5FEA18C2F8B1 Key = 00010002000300040005000600070008 In = 0019324B647D96AF Out = 9F0A0AB6E10CED78 Key = 00010002000300040005000600070008 In = F5202D5B9C671B08 Out = CF18FD7355E2C5C5 Key = 00010002000300040005000600070008 In = FAE6D2BEAA96826E Out = 85DF52005608193D Key = 00010002000300040005000600070008 In = 0A141E28323C4650 Out = 2F7DE750212FB734 Key = 00010002000300040005000600070008 In = 050A0F14191E2328 Out = 7B7314925DE59C09 Key = 0005000A000F00140019001E00230028 In = 0102030405060708 Out = 3EC04780BEFF6E20 Key = 00000000000000000000000000000000 In = 0000000000000000 Out = 0001000100000000 Key = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 In = D5D5D5D5D5D5D5D5 Out = 75F7C7005EA47839 Key = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A In = 4A4A4A4A4A4A4A4A Out = 759A3CB94586706D Key = 00000000000000040000000000000000 In = 0000000000000000 Out = AA553A5DEC50E4A4 Key = 00000000000000000000000000000000 In = 0000000000000001 Out = 0013FFF500120009 Key = 00010002000300040005000600070008 In = 000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328 Out = 11FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C585DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09 Key = F2022315280960F16FD09741D13F693A In = C309000000000000A02A000000000000B03D000000000000C9420000000000002B4C000000000000A04E0000000000009857000000000000C8600000000000000063000000000000F2660000000000008698000000000000729D00000000000034A000000000000023A500000000000010AE00000000000025AE00000000000030D600000000000064DB000000000000BCE1000000000000F6E70000000000004AEC00000000000080F9000000000000E0FE00000000000061FF000000000000 Out = 9C3C4F44BB50DF7367DAD70E6FED04E0AEB0344116C6E41F66A1A304E822132D8AFCC1727259D93DD6E742EAEF2FD8C03EAD7890DC4EFACBB8776F3439A3DB1B55D47DC6BC4A43349BA9E85FE178CD1ADBDD4E9D19CA1E7659341251586E13864A8C4E93A2616A0C18890A622452AD9FD09CB1A9CDC83ABF2FCFA325FA0117319C924852D426132D05DA82EEBC3C261A6036C6477FBE3F65C40B8B02C2F9D8C8B3084034AB3873CF22F20759C145ECCE92CE6B557D6DB959DA0B8AD4E0DFBCEA Key = 00010002000300040005000600070008 In = 000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328000000010002000301020304050607080019324B647D96AFF5202D5B9C671B08FAE6D2BEAA96826E0A141E28323C4650050A0F14191E2328050A0F14191E2328 Out = 11FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C585DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C0911FBED2B01986DE5540E5FEA18C2F8B19F0A0AB6E10CED78CF18FD7355E2C5C585DF52005608193D2F7DE750212FB7347B7314925DE59C097B7314925DE59C09 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD33694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F62023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B34884533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3AFFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8CA99B2C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B0022569AD418D1FEE4D9CD45A391C601FFC92AD91501432FEE150287617C13629E69FC7281CD7165A63EAB49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67BF0DE98C7E4E32BDF97C8C6AC75BA43C02F4B2ED7216ECF3014DF000108B67CF99505B179F8ED4980A6103D1BCA70DBE9BBFAB0ED59801D6E5F2D6F67D3EC5168E212E2DAF02C6B963C98A1F7097DE0C56891A2B211B01070DD8FD8B16C2A1A4E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520C7E2ABDDA44D81881C531AEEEB66244C3B791EA8ACFB6A68F3584606472B260E0DD2EBB21F6C3A3BC0542AABBA4EF8F6C7169E731108DB0460220AA74D31B55B03A00D220D475DCD9B877856D5704C9C86EA0F98F2EB9C530DA7FA5AD8B0B5DB50C2FD5D095A2AA5E2A3FBB71347549A316332234ECE765B7571B64D216B28712E25CF3780F9DC629CD719B01E6D4A4FD17C731F4AE97BC05A310D7B9C36EDCA5BBC02DBB5DE3D52B65702D4C44C2495C897B5128030D2DB61E056FD1643C871FFCA4DB5A88A075EE10933A655573B1DEEF02F6E20024981E2A07FF8E34769E311B698B9419F1822A84BC8FDA2041A90F449FE154B48962DE81525CB5C8FAE6D45462786E53FA98D8A718A2C75A4BC6AEEBA7F39021567EA2B8CB6871B64F561AB1CE7905B901EE5 Out = 9C142A22EDF81444F47272B80A037C169E304393537CECE8003BD80F7B0544063B4A141F9A99D3C6820BAD98BECD914804F389EB2A50E1E2CF22161FC78B93660E07E2686E70AC0715299C4796F3559FDA802E61CB4ABBF42BAE516BD09FA410085A0A92C6F32A3797D19808D3B3D049B605852E970E5A1B8031D3DC34B5A273F54ED35E21D780204F4B3C512596237153BE9FAF74A44E9A9DCBE96D628AA58B1E3363A94DF540230B38A1ACA440432640E5387D92F1CC1A16F8628A4CB6229F513AB926300668CF97B27643C9C9D0C3030D0CDFBBCB69C3DB199E5D392A97A51DE6C9881AE5612A69FA0EA026F2F254B929201AFB3AFC8D977C3ED6E12F011892037D0F49B0144E07A0F0556F0BAC9B3F829C233265439AF711E0B5DD6EC813FD51281E8AA6F031B096C64EE8F03E041FE4DC6B5441141F2D4A308CE8EA77C6483E3CF565EC49CF27A0B13F28D3C63AD7FB6B3A96579D30C9D65F7BA86E56DA6D14AF3C7D170CB5BF5F21C70C1771354DA2850CFF8D9250273828C1FE60C4AC086049404E3D63E04935F03B057B4783B13CF49757A8B5ABB3D2E37E54B881D236F7DF7FE80E4AE33E9125F54AA96D96BFB15607F0800B215CBF9BB0F7E29080D8504E9BC1F78256593B9565E5AA5FA22032A47041B453D1B154A8D24CD59CF9AA6A8E55363F3DF2B6307ABA5134D67B0DF0AE4FE77F23BF7DF8504FE9DC7F32A8562E2DF585E639847DD624E55B0D0DCCDA72D0F1E072D82D4BC135DC5F7F9130956D401FAB1456527FE087A436C1511CDFEA58202D200E1817E360E8400AAE83B073A63596B033D7E83C6CAB7FDD7069C3B1718EAF60B937CD2458255E68FCD9514FD14AA6E27EC76E75F95F0A678A0F64D49C1B9B8F8DA56DDB8CE640FF6E7195F4A679165F9996F3DDF992E3CB4ED9E9084AFC0038E4BEFB467CC8170AF8F004082BBCB137BBD45C124BE8CEDC89DD565A24830889CE4B9781FC18803BDA1A0A4EB70DA35887B02F18CFF9329E2B7C31B0F5F0648E0508379B52C8FF91CEF939A040A8C20F2F27ED65553680729A2181B3B3C4AA02BFF8DF0A9228A87BBF52B48F473D0F9070C76E4DB6F09FFDFEB629BD0E1944B7016AF34187E2985AEAE30D6480A58F649A0C858E1F1458388A9E822A306AC1AA7465882DE78F242EF7B0CB45D68A057F00D8609587922C8FAD6F1A7FFA34BF2175FC516730A61CF82C6F866C978CC292BCC1F91E6AF1785FCDAA9A43A01E6AEE91E222F8AF8C989F2A4C50B7A1D45BC15E11E5E6E6EF720506B8DF564648BEBFE272C0A77D41295865108150CDB3620970A37DB94F1CC35E434DC33434D99871F6141EB57C9E648AD1BF70E2B7FCEB81EA871DD92F19C366EA532CA4A7BEF9242128B7ADDD308B58FFF5594CB4156A03C6A6ED3F27E8DB20FB2F4208422B7E9E0A4E63A0122560CFBC Key = 69E2F555209FCA21ED36E0243F043537 In = A1F4C5FC0AF894FB Out = 1F88AD254A1653CB Key = BC0ED7C4A90FE4760B3D971F0F2589F6 In = 55E31A38B2C91116 Out = 8D57CB7AFB401E55 Key = E0903EB04098B1193779E7837EF374D8 In = 6C63D3EFB9E767E2 Out = 5FECC51182CFA3EA Key = 78A2E29FCFF77C6934B7C0D7F9460D65 In = 07E16715F575C6AD Out = 81EBE19020C63877 Key = 53B644EADCA240EF4FB193A4FEAD3C7E In = AF16AF335D1C53F0 Out = 6E7F0349BA9A2F99 Key = AB33C28DBED80BE30F88F56BAF75F18D In = 4BAF9D1CA9564352 Out = 1BC57C3D253EA065 Key = 1C878288A669E69F656E8B8D4FA60C1D In = 2C03EB635242836C Out = 45568161D2A6B3BC Key = 09F745F9D80E874001C4008995657B20 In = 4645D6FD4B431D49 Out = DA31365F4FE20B03 Key = 5E5A441ADEBB77B5548150D65BA74DC0 In = 65FD887479EF85E9 Out = 590F2F58016B29E0 Key = 21986D04FED8F785438D4A7F0AD67E84 In = 1B7503845C01C69B Out = 0116653D1E4771ED Key = 1D2257B3AC17EF9A823D599097E634A4 In = B192B778DB10F094 Out = FF4E8C609577BF85 Key = 6E7A13AE1390E83C40803CB2D79B0C34 In = 6538A21F7261A796 Out = 7AF53C7D0D2621C5 Key = 21EFC7A3A3201371A48119DBA1C9660D In = 374283BA8FED5710 Out = 20378450E2DDA9E8 Key = 6EF803708E8E6403A994BCB639FF5A53 In = 2CD068FD837909FC Out = EF3FFF871FE5E8CB Key = 772FCA0BE2265EFDE56A1995F458DEB1 In = F19905A6B0C7F1B0 Out = 42C993EADBC0F90D Key = 70BD64087B18BE3EC0559A2CFDA3E192 In = 2FC8EB4404380042 Out = 259EDC1951191AB0 Key = 7ECF0B93035A2DE807F51E5B2E277379 In = 4CA2060D4DE998E4 Out = 73C1905EF950BA3B Key = 798F64226CDBD83728D75A43C7BB1AB0 In = 733BCA91EBB85351 Out = B9F6B1C7F328552B Key = 2DDD0BA7F3F7693679D55B98A22CCC3E In = 2ED93449D2D9AB3A Out = F06B2E9D94997C93 Key = F31BD19412BF7A97DEC264E90DD14E99 In = F1A2FBC4FDAC6F02 Out = DEEFBBD448842BE7 Key = 226D0AD448F8E5079FEAB206179A38EB In = CDAC1D020B9BB4EB Out = 639B4D4EC1E3FC8F Key = B023E8B5627738F655280AB14768569C In = 0FC2061537F6CDB7 Out = DEA26F56AB3D71E4 Key = C6A319DCECC13FB4F22E9B9D60BD0EDD In = 0AD0F7ECB7470F6B Out = 11704E9F8D98D9FB Key = 6FC37F80D03EC7FF1ABB39AD57FEEF34 In = 281A1B2461363A64 Out = DAC5D4E8E380B604 Key = 2E90E4BD3B0BC846CE40BCDA46B99B9F In = A323BFD529B106F2 Out = C8B452EBA3EAC1F7 Key = AC2F2007D0263D4BC6D15CA76094CC1D In = 7F707ED4B2317EFF Out = 2B4FAEF56F09598A Key = A14EEDEBCA1A938997A4E11137D6552F In = 864EA8E4528FDEA6 Out = DE47CD0ECE03A7AC Key = 0075696D1F9554F6B10BABD8A04D90EB In = 4CF5E2391DA8C6BF Out = C44AB604C4DA9CA3 Key = 354B4929963917272B53C79D33558C33 In = 3EC6651C50DDD961 Out = FCE10C5093AFC8FD Key = A5E048C95424FADFC5E5406585273662 In = 06E48DB5ED0894C9 Out = A3D93B6558B290E5 Key = 75A944A0A97A7BDCE371BA0FA1665FAC In = 4A22DAE25C7878DA Out = A920F8208EE65ECE Key = 15227F375BA59F5E69BC2F6C668A98E4 In = D9C0EBA7F6CE3065 Out = 9917CE029BB7A5DA Key = AFE2D0EF5F64861DA13BE5EC6CBCC70C In = 6FA8111B12652436 Out = E605449753A66A1C Key = 8881DD1044ECEDD9D4E7FC97FAD92FD0 In = F4BC17D0578D7507 Out = D22BC6485392A026 Key = A0EA022FEF899E36435DF969F1F3E4B6 In = 4BA7280181F4B3AB Out = 12DD636191A47981 Key = CC287CF7E36F70591D5E67FCD7BF4BC9 In = 9CC6F4CF3EBF7246 Out = 9BBF1E0D107A06F4 Key = A835B2A0502F5AABA3992C063B0E1C30 In = 98839DD58F08952E Out = 9F928A91E928383F Key = 3DEF6557F2C753A5FC87A540F7A2557B In = 6D6A06A129272985 Out = 864667E4DAC671E5 Key = E8409A5C304760EBC6B260C75C9EDEF2 In = 80CBC5085F87A69A Out = 126748837E2FEDF5 Key = 8C736D86BE799E87F1C1CC35E5EEF6AE In = 89F8C4D164BBBD01 Out = AB8A227357D184BC Key = E4A20A94B1E7068974CEE5E2580E15D9 In = 2B96920DD5A6F2C8 Out = 94E03FB08F83296B Key = 81CAC6E859BE54B8CE81ED7B07C271FA In = 11D5722A2E1CF306 Out = FA90183D4CDF8CB7 Key = 7B0B045B44D79CB025DEDB0E85D160BE In = 41B3C351152390FA Out = 3CE8A7D2232F93C6 Key = 1422160720C9BD46404FEFB8EF4E2C4A In = D8F830B019895550 Out = 07DC1606AB5F8F4D Key = 5CCD1802EA48F00211A1EFA909F30538 In = 8D30F965EA9BFCAA Out = CCDC2F07B5DEA3E5 Key = 2FFF4098384EE4546E93238C0F426668 In = C513A5932E08D791 Out = BD668AC3EC4C47CE Key = 4C4F6F82FE2518EE3A99F76E04C8499A In = 4D85463A62844915 Out = 5E2248C33CBFD913 Key = FC3D1A043ECABA559309E64B064B0446 In = 7726B39BD69776A3 Out = 6A8704EB3291EDA6 Key = 56ABF74AA472BF0CB06610D12A018877 In = 97EEA1C90CE93D1C Out = 729BF317F46E2418 Key = 8E5126BD9FE220ECBC2153CDEDA49FD9 In = 1A0CB89B6E03E337 Out = 7702BED5FBAF6E7B Key = 2C18883E1F19A980AD4A58DB9F2D12D9 In = 26B71F27904E140F Out = CDCC5F2849977C1D Key = F6BB19FE9DD4A7719881A38625D1455D In = BEB0D17F512C5730 Out = BFCFA36E02B0B2BB Key = 6A624B6FDC084DA5A509988B14436092 In = F47B9D6A20D7B889 Out = FB73C16CEB58CEB0 Key = 107DC93EC9E886F16FA922A3D82DC9DC In = 31DC5A59C38C6CC9 Out = A1EF35EAFD03DFD9 Key = 6EDB60CBF889596C42DF6655C84B2DD1 In = 9E0D57C76D2BC40D Out = 48B35198E0C58C36 Key = 08327A955B100FF0A7FA52EFE78FDBF8 In = 8A2A1818B39A6122 Out = 7FE7C18658678A8E Key = FA541FD32F11D73934B6E53309DB89FA In = AC0EA182D4D22207 Out = E5377B9CB0EDCEFB Key = 36F11D98390A7EB5AA4C4EFD3AE9BB9E In = F4AA78E30D4375E5 Out = 1D29D101F192843C Key = DA1FF6FA235D6067AF99F3462A16BAD8 In = B337AF7DB5339DA6 Out = E6136A8BC04D20DE Key = B51BF3480873947E698F71D9EF21D75E In = 867BEF1B45DBD114 Out = B78595C1B5CB812A Key = 178BF50C7CE2A00C6AB48CE3569FDA58 In = 18CEA1A2B234320D Out = A6064120EDDC07D5 Key = 28EA779EB6C91650B52102935DE37AAC In = 47F33BBEAF84E34A Out = F575D48B7CCCC578 Key = 766D0648B278DF1C0C41698287162A03 In = 5FFC2BAB521A603F Out = 37CBDE6E69F5AB5F Key = FEDF724C31DB14EB591C156C67EF6750 In = 35B116F3F4481906 Out = D001E3ACD70AF4BA Key = 801481FE995D9E75205D8A6D0D510E90 In = 281F4D0A68E4E87C Out = A54B8A84FDAFDF5C Key = 505E0077E52C5729F73182ACDF34E9BC In = 8A2DE90960587781 Out = F2BD898AFF28D968 Key = 5057B6FF91D6B4C2375B2A6F4A2FBF7E In = 50D31FB5A2F057CA Out = C85C933B348F1008 Key = 964818358CC500A2F781BCDC7AC66916 In = 4EB2A5C16C4706DD Out = 73EEECB5E25EC480 Key = D5765D05E10F5B7AD1FDAA2351AFF84C In = 64F00EA613578183 Out = DC583C63E88943DC Key = 413A2CBED2D4D93C7B46E7AB5A43875C In = 25E266652BEEA0FE Out = 294EF257ACA9A0DB Key = EC2F93A4E069F36926E36FDB584A5637 In = AB3869040AEC6682 Out = 82035F37DBE794AC Key = A82DDD856546FD0634CD8BBF241864B6 In = 6DF6A322B10646EE Out = D0BC320330F3C642 Key = A7BA17A0D592EED086A170100C9918E5 In = 916202B8E932EECF Out = 894C0ADA76AFDD24 Key = D701ED927D25B3A6DE2F017DF630F7EF In = 71CA562E57FDF716 Out = F070CD1AB26DBB0E Key = FE0A9320AEE0B0510D84186EC805CC80 In = D7745FEA5883955E Out = E71065382556D351 Key = BB330B162D990B33CE1E60583EF23225 In = B57ECB0D0AB5BE27 Out = DB84A6443E85C873 Key = FF7E72A5D193A35A2093717DAA3CD4EF In = 82724F9780EDE924 Out = 31D9744D66BFF613 Key = B2BFD1313C129C13A35A4B59F608F930 In = 8307456C3AE8C4E8 Out = 02C4F752D9BEE3AC Key = 8D533208F3316C4CD216D42EB1BC5D0A In = 1A81AC5339D80170 Out = FD6CF5D07C7A9A76 Key = 403F55A1621DDD6F78A33893F0762D8E In = 23F4D1448E8C2302 Out = A6D4756A911311FC Key = 5F319D855168FC8153E29633111794A9 In = 15E5476B963232EA Out = 39474EF9B640AC8B Key = 99C0AE0DEEF10CC2E6673D106DDA6871 In = 331A8615EE6239AE Out = 7DA9F36C7BA77B5F Key = B24AA6EA353F9E7BFFF2DCB8BE9B7A52 In = D2C818116B98D56A Out = 0AAD3489968B1C6A Key = 8BEED6720296F7E9FBF7BD1B07ED9762 In = 3299ED7461B4A3F2 Out = 94453FE1A0A1EDA7 Key = 815ECDF71E3996E437DF4C976B527862 In = 4D042C1E63DA6200 Out = 188E679808DDDD46 Key = A6DD5F374508255677C19FC396E134CD In = 7102E6F388639C00 Out = 269AA83817DB1985 Key = BB6A08BAF6F14C33BBED0F775CDA3020 In = D4CB7FEC03126E6A Out = 9789ED9BE3491CB1 Key = 6221926E9528A75155B2BF6ED12DB1F6 In = DECC7ACF2A42B8EF Out = BC081CF6F5A629C0 Key = 8A5D51CBBF6BE005F9878F3ED6B61729 In = A598473440C9A21F Out = 24B0514DA6EDEA34 Key = FD6286C960579D105AD239774C91368F In = 0A4202140AE807A6 Out = 1728AB88720894DC Key = 20B923BD442044E6A2BBF8F00D079B88 In = F0920407531D711F Out = B41EBF00195D90AF Key = 3E70468A0D26E01832F5A6E35D3FBD99 In = 5BD41996465764CB Out = BCEFFE91A2F6FE87 Key = 7500E220E0A3E58BEF63AA137D307794 In = E33A034F8014AF17 Out = 420C903E06671BA8 Key = 40FB6C1F452CE0611D34E73D73629B78 In = 7B85CBB342D56D2B Out = 147E04274EACF056 Key = 492C60D310221CBBAF3BFCC04E595225 In = 5E74CE033490E610 Out = 4F910CEAB804E971 Key = F057A5BB95F19EED5ED31BA0C3B71121 In = 7ABC6034C9E6B95C Out = 21CF5A0D1A5BA08C Key = C658B4CB59FC9F9794B17DC994790797 In = E7604AA5ACAF6E29 Out = 5A48559ACECEF95E Key = 8FC30F8C24F6C644916C9E3460BA5289 In = DC3B63395657191A Out = 1FF2C84F7F1EF838 Key = BA445EF71240F3AFFD91B79A5FA8AB81 In = 5C51EF1CAE759BA1 Out = 7D0B65F194116C8A Key = 5D753304438FDC2D035BC07820076AD5 In = 285CE845695AA8FE Out = 8E7EC2D0D3A836BC Key = 72A06AAFD85DE66B9293B50E6AE8B28B In = DC977E1613710FA8 Out = 7667822C280FC236 Key = 0306706ABEF3D7225DFB146DE5EFB29B In = 34841A026684E7C7 Out = 529003250F713079 Key = FFDAB83F911295F1F99E684DD9FF0B18 In = F10FB61FE6EB85A0 Out = E4A62E2C4775D5AB Key = DC5D319F729E73ED847FB468EDDCE977 In = D4BA2913B79C5B8F Out = 7886BB8D9FB046D4 Key = C8B0948B2A5ED4812F1FBE21ABB609A1 In = EABD3EB7B477D262 Out = 366D6CC9503798EB Key = 09853AEE4B50B52B3086C3860B8BDF97 In = 8FF4BFD40B22E74E Out = 30C7A64C5C6861A5 Key = F44422594AF65EEEA95CB013E8244A3F In = 0EF4B58DC8DB9AB7 Out = 98254A729AB2957B Key = 6DD7F582664163682678561417A645BC In = 69F168F103621CE2 Out = 6071635D378F7B72 Key = 7746A113E13987DBD18B394F67D1821E In = D16F65826AA18FE6 Out = 2226A7D8D6981F2E Key = 892C8B9C34C5FFBC75E15316F1585D7F In = E652CB782CB22176 Out = 995B99DC17FDC5EC Key = EB2140E309DF68D184A31E5853314488 In = 44EC60577E52EF53 Out = DEADF8476A61ACB2 Key = 1ABD37DF22EFAC175DF941CC0EDD29F0 In = 95C4BA55E48ACB41 Out = 23995FC714AA8A4F Key = D0C38AE628CCA13070A1633150381F91 In = 23EBEF88C86BC886 Out = 56E06DD1032256D9 Key = 48AC07496841116306D48764C1E705F9 In = 493C1E2E04FF04D2 Out = 7E042D9E5AC1F3EC Key = 66566C2E4449EC7A02A7C930F65940B0 In = C2B35E68716744E7 Out = 0B47ADA35271DD5E Key = 7AA0B380E4414CA991E141BD6231CC0C In = FFC6A8AD209956AB Out = 7E64EC4D49B958F5 Key = 70354888F66B6C0AD28E682DE32C39E5 In = 0471B06CA4FCAADB Out = A6F22D9C1E923746 Key = E4CCD004C11D238E3A03EDECEDD65988 In = C05931E79316A4F1 Out = 2998E9FE07ACCC1F Key = DA829DE8347A0778DC215BF2540089D4 In = C8E7076836A52774 Out = 6D5C280418972012 Key = 1E96A8A8BB01AA88FEB15712F0A6DA8D In = C26400002E57C5A4 Out = A08AD2CEB56A4B19 Key = 87F756A77FEDBD8031B0086EA344AE6B In = 5E5ED4AE448BCE09 Out = AC419DC48C0E6E7D Key = 81D79E0EC9D881149AB6D41DE9200F04 In = A755EF02795F7CBF Out = 4E01D7A7B8689D99 Key = 6EEC3E96D32CA0BC967AF758FB6805EF In = C569F03D3FEC14AF Out = 9CCBCE811D222ECB Key = 07B0FC3E6308EB4A5298163E80600120 In = 7AEB6D193C727CCE Out = 981F83863C75A8AD Key = C810A5C61CA63CCB8BE9E0590959CD90 In = 95B563DC5D7A4995 Out = 6F165E831FE132F1 Key = 1E76304D445E8BB18117B1EA3E750EDB In = 79AC1C7EC0745282 Out = 31FE39BCD41067C0 Key = E466F39C4B58269CF854A4221D2A5CEC In = DBED2CD9B003FD2F Out = BF698BF256DFAB35 Key = 59A6E62DB5E1F41DDB228D1CBD60D950 In = 900D341BD28B335B Out = 0858DB68F69BEFD0 Key = 68A0AB43F383E1CA7E9B96B70E010016 In = 6FD7FABEF3F68ADA Out = 20E9497D9A98F12B Key = 939A4D66FD3CABBE37DBE25F404D7FD3 In = 0B16023CA7F3320D Out = 008127A50C977A3E Key = 00A20A1EE48FD2341B1F7F1DCE810755 In = B91AF472920780F9 Out = C5493F95C16A4953 Key = C0808AC11EDFCE49EAC9A05B503C156C In = 2DFBCF72932B1513 Out = 96465C98AE90B56D Key = 840492015802ED28322683A1B4FD3059 In = 8C83A23C871952CE Out = 958433FEEF466F82 Key = ABC74042E5B79998889438020ACDA9FB In = 1A24D2868B8229C2 Out = B2A10B890DC9E641 Key = 4F19664B83FC466B03A936D6C3B6F522 In = 85563E107D1AC98E Out = D4448D4099E6D02A Key = 391AA3DF9ECE4160E0BB9AE663EB326B In = 61AC5FD8DF0FA3DC Out = 58EAFB1779142C2D Key = 505E946D9C6568E6DA133F9615AFC0B3 In = 2AEA3358CA197938 Out = 98EEDF26EFA4C614 Key = 8836B04E34F67B894D28C30DA60328F8 In = 57138F04DCF6AE31 Out = 716AD93EF3236735 Key = 0AD06D65EF01D64C0D8227AF7A7F4295 In = B57776534391612D Out = 5300738AB7F94CE0 Key = 6DBBEC86D97D7FC0DB27BF6423659E4E In = 8625E74BCDBFC00D Out = 98C27F1B9A9ABAE7 Key = FB924FC8A20249EF71C470ADCBB2AE13 In = 14E2DD1CF23B2B0F Out = 1814A2577534D5E8 Key = 467AED141F65682959BFD457939F23EB In = 322E55BB623E0FC4 Out = F219520BAF8B676B Key = 140B0407B8717834F2C0707102D67A41 In = 931320B39312BF72 Out = DC355192DC7B11E7 Key = F4FC422DDB7B0E13DFE5C92E5DB69BC3 In = 04F5E2A164655DB1 Out = 3B9A799A75792D85 Key = 72081E59495031A370FB1CCD08B61743 In = 22B6A63021AE2763 Out = 5F1DC1759615BE32 Key = 3F8253356F0DFFDA9F7E961132D9B2CD In = 729C1EBCB2E563B4 Out = 41CA6A52CAC6A9BC Key = 9036A0142CBD1850E1CC093DB58AE579 In = 252AA0E1EF450353 Out = DC44622F3A805838 Key = 7A01C0B58B936543B8201D9AA9BC3163 In = 10A5F919718785BF Out = B3E6ED4A5C006A75 Key = E0B0427FE2C90210C1603F7C0C9474C5 In = 05C62E7F7FE4CF2C Out = 1C939D9192E83462 Key = B85945DC5F787A3BCDCBABE014B7A573 In = CB12A73FD1165172 Out = 67AA122DAFAC90D5 Key = 2CED2179B30725A0E819AEA55CE68B61 In = 1A686808A77106E4 Out = 9D81B526A87880AA Key = D6F034BD03CE80931D88EA75752EF08B In = 0AE5D2C3A631D879 Out = 020605D916B40B84 Key = F9C00FAF37163FF1FA5B8F433F685836 In = A7AA74C2607781EF Out = 91D215BA6DBC21D5 Key = 1DFF21EDEBC139D7B7CBCDE6F4A34584 In = FC2A91EB756D481E Out = 60DA8ADD7547CBC0 Key = 46A7578EFAD674A224FAC4E2BED579AC In = A6BCDDEE18C6819E Out = 9805E419C2F2BB3E Key = BC31A699CC327FD5E140C9A6C0211028 In = D682589A7FB9AE31 Out = 3439865A758C9678 Key = B527197C6B375AF0EE863BBD0759EB96 In = E83BEA1B7970658A Out = 1662B5047011D310 Key = FD990F2F4439E65D4FFEF0420D18CCB8 In = E20D2FED40630E50 Out = 10F47ABBC320281F Key = 3869A36D42923E94724D1B05BB875AB0 In = 63444C8712811AB2 Out = 994FE928C4321878 Key = E64049A1F719AF0D499135129095C8FD In = 9A558554C9163EEE Out = 555154F50F57CCF1 Key = F36AC6126F70DEB39DA8729D5B22ACA8 In = 42F2A3FE0437BC5C Out = 2BAA4CAD9FC4E082 Key = E1B6991593A5D361C08C3CB0812D6944 In = 862C924495BA12A7 Out = 4C3660678AF3AD0D Key = B2ADD4040673D0FE3ADA0B00E013194A In = 8C67D089B29FA40D Out = 4CDBF023BEEB2916 Key = 6A707425E5BC3011AD82574D5C6EA9F1 In = 256BB416AFB1BB22 Out = 8F730A9BFE8A6D92 Key = D2E59FFE11A6EB98F9AC07AEA56238EC In = AC3D85D4C4E32C77 Out = 65A0A4681E370092 Key = BE2217AA1919BC76A43F575E9C395525 In = ABA6D4DA0781086A Out = 1D2305C43699ECCC Key = B209ECCEBE3C1B39EE99D881213606E6 In = CB39BD9B648C27BC Out = F4BCD97D736E7143 Key = 5062054F6D1C6261C3C1E4EC854BA49E In = 77ABA9017A2F6678 Out = 6881CF5F4B920808 Key = 5ED1E657D8AB1A468B1C5B39A48BE0A5 In = 79740D3FDFA6CDBB Out = AE662AF4D41E106E Key = AA224B767B062DE29709F4E10B777BE5 In = CDEF858FE5E0B0A4 Out = F11AA4D6CC002412 Key = DA32F95EEBB72A127F79122819234BFC In = B9B1EF495E954F66 Out = F8A33058962BA146 Key = 3775682058F6BC094A96C4877A7F9657 In = DB9C0ABFA81C0D80 Out = 9856D1DAF01C992E Key = E366C94CB0971CBA20791BD358EABCBB In = BE447A6EBA16A7A2 Out = 986C7B461B5102FC Key = 07BB49AA8F9A13F2025E9DD758B1E764 In = CA564022587EC839 Out = D3AAFF01F19DB316 Key = 9124A3C9DF4CED607FDCBAB5027B5B93 In = E2929C1DE30E4B15 Out = EB1A484E5C81DEF9 Key = 39A2D8A3047C1DFACBEB37861E8B43D6 In = 35F3D96407C21EF9 Out = C7244325B6DD77F6 Key = FB4502BA2C86D59FBF6FA8C5FAA87183 In = 1BAE4770DE602791 Out = 4E662AC45C3B2119 Key = DD010D18C37746B65AFF34083A4146A5 In = 2B1CEEF376A5E4B0 Out = FBDDEE951ABB0314 Key = 72D53C88260E3566882813053E1AE5ED In = 3CBF8B60D71FB10A Out = 9A8FBD56DC0EA257 Key = C2C97338FBD29E50FD37205751B3C6A6 In = 47C4AC498293BF13 Out = 7E1398E65A69E038 Key = 5F0E47261B6DEE64439879EDCD39E85B In = 120997CB681C2C4F Out = 7968DB51E243F084 Key = 4ADC396F403CF5C12F850BB907A344D0 In = DB1698876385005F Out = 2AA4C93967E4F698 Key = 8822968CE682CEB0DD9E913B77578C49 In = AAA50519795B86B7 Out = 6A1096066173528C Key = 1F42C3C5D30F64964D86FD6F212E3EBC In = 2CA4D5AA24A0064B Out = EF4FF1117DEBB3B3 Key = 3863E37A03F33E5C010B10BD83F3D63A In = 637B3EFDC062ABB5 Out = 9AEC362D13402BF3 Key = 34DE1C4A720E1C519FF9B3B5AF1FC23F In = E0C32EAAF6E27FE3 Out = 03FF41F08C2B4F85 Key = E4B43787664CE36DD85A904AC8437EE3 In = 70DF29326A19F0AA Out = 1EE92ABEC6D87204 Key = 87472BF040EAC616FC3186A071E75472 In = AA2623FEF71A6FF4 Out = 581D8645CF5C04F2 Key = 7A34E8066CCD634F810CE2AA6916E9F5 In = 79397AEA3D9A815A Out = DE4315993AC9D4AB Key = 527D10ED0649948237D77BB836B90312 In = CC3E9F4728AC9653 Out = 5A359381C542D310 Key = 3C89E04C0CFD726FC81158CFB3567C66 In = 12E1E88F656032FB Out = FEDD8EF190D4DCB2 Key = 781AD832234CA52B7DB7EF037CA6840F In = 7199333B8F1726EF Out = 9ED8AA463A0DE876 Key = AF3CDA80C37352B53A00290FFFE66EED In = FEE0782CFABE980B Out = 2DA0DBB1BBB8FED3 Key = A7976FE071BC4C2C4EDC90669970AF6D In = C5C8E3ED1C1B1B16 Out = 6EB4148C4BF47628 Key = 9B8349BBB21480212BBA391113EE4251 In = 545164FC513490D5 Out = 39398B0CB44C30FC Key = AE08A1563F6CB18E5CC29DCFD94F9E50 In = 177992889360D533 Out = C9E1D8EF29C5DD0E Key = F9395E856A8C8712DB0E1D9BCF35F2C0 In = 78CCE5F4022F5F38 Out = 986D99D2B90474F7 Key = F83192CFDFFC02CAC0B109AE5CF28AEF In = 8D89708C4486A4A9 Out = C27F30929D508EA2 Key = ADC0100230B5DAAB8F4C0D5C3A99A220 In = EF0CE502FE9F2E65 Out = A5680B7651E10453 Key = 6642EFA393625B328A6D56806F97B06C In = 43078217088A3B74 Out = C81DAE4CE6588027 Key = 2341CCBCFDBA06C1253111C60BE2EDDF In = 28A2DF1C597A04BE Out = 7444940ED63BB2CA Key = 78BBB2E2171B41352E11F39072B4E758 In = 6C8BBC0168E7D0AE Out = 7A8027A6DA52F0EC Key = CC8EAF044C0F14E0D3E55238E5B4998C In = 30004B05206CDB1D Out = A46A041AFEEDBF40 Key = 4C09C4DF6B6CB3A0518E75A3110C00A6 In = F912DC1D46120017 Out = 8159899680CFB85D Key = 92C6277D7458B8829ABA3694C1E57023 In = 0177139E2A42ECE3 Out = 54329CA36D7BB6A0 Key = 6C220265056BC8669851FA3F4CFDE20C In = F91991F3D9344291 Out = 31CC16538CAD3B09 Key = 07D0B4472B194B6F45235002141B33C9 In = C3111EC8062BEE07 Out = F1F5176541E23DA8 Key = 5BAF6F94066F39A8E17F81A88BCA2796 In = 8EAE7470FD58E40F Out = 73407FEC8B5F9CEC Key = AFB398D08C965498A868DEAC783D8B80 In = 919C2933E680FA63 Out = F9CFFBE679B632AF Key = 44E3E8AC53DA1946F65A48245A971929 In = 5A0C5CF55E5FB1AE Out = FF4FF500A7B1D85A Key = 6F2716CC391B9F0C7549266C68342F17 In = 3B365723C86441BD Out = 4575F4EC34C2003B Key = 21E16892CEFF320DA6ABD1BE4DED257F In = 078E1AF25A6E3789 Out = BE784416E9E60086 Key = 716B9680A132954B598DA6E5A8BB8FE5 In = F5725A15102E12A5 Out = DC5EF80C3DEF85DB Key = F226C53CA0B076A19A11B9AC778EA80B In = 4892E6A118C98D0C Out = 9DB54C62F330CD19 Key = B98400EACDD225EFAA3B29B6F72C022E In = 075A3B54B6AE5238 Out = 9D91D515D7E76D18 Key = 634EA1C85D5961B4064F79852A11895D In = A0FDC39F4644E6FE Out = 7629ADF27EE957A7 Key = 03EE4BCBA4086C212CAF28CD82C1A761 In = 668BFBAE93632D2E Out = 9C047ECD1D88CE54 Key = 34243F927E529230DC4B5AA91D29B9A1 In = 5E29070652D84B8B Out = AFAF619C3C3B3EA9 Key = 3BF57A19C8A578663AA2194B3DFC8D5E In = AB8F3263F732EC68 Out = E196D05DAA04340C Key = 718E5A9042D2002E803E7D8A95FF685B In = BF5B8209F7E51A4C Out = A8E625E6F01A991F Key = 9F791471044D714BE42BF1A8379BFC4E In = 3950FBC2A4D4B08F Out = 54993FCAE1E3A2C9 Key = 1BA3B781AD0C56BC2238657F9E0ECCAF In = 440032587CCAEBBB Out = BAFCF4891F7B36ED Key = 29564761914E2EB3B5C43D445A1FA586 In = BF985E7D8CC0E9F6 Out = 150F02B73459DB7C Key = 1B97452D22DF6133A1065A0D6ACEF22F In = E3A691DBF1AA6542 Out = 8945528C8A6A7C42 Key = F5DA75F1C6D67254F00A1B526C97398B In = 20FCF337280FE0A1 Out = 2BBEE84B85AEE536 Key = F5319B677CEAEF0DC3ED3171A821685B In = 28FDBF9CB423D8C0 Out = FD07C80CCAE8AFDD Key = 5E080A6AE298F8AC3D973F2290C476D0 In = 627E00241301B398 Out = 8B3B0207D07C9E44 Key = 990FB6F8400592914B84894BE4E21A10 In = CD0A751D2A6AE1A3 Out = 02E6D0E6A8D8989F Key = 904BFA4707A8EEE73D4576D5AB8D1A23 In = C4D06F926C611932 Out = C8E6C4A166B0F504 Key = 3BC2F67E113C0DF4FE2C49B09A73E989 In = 96DABE49F56D7565 Out = 2915EDFF6F1517C6 Key = A30C3A933E1730816EF1D34518584B55 In = 9796DF8FF33629A6 Out = C696AC43D47D184B Key = 8475D6C9961A26235244A253FA965A97 In = ACA911063728C943 Out = 0E11408AAD0D31A9 Key = 438DC01CF937135B19F6046872B91E43 In = 0D445D5AD38DD6AF Out = FF6821F5BA54A2EF Key = A62D9F85B36F780D2083C2EF8EF07ACD In = 5C42CE355071C8E1 Out = 74C716E95331967A Key = ACF3AFEF6A098D23C702F057749B8910 In = 2DA11D3A751C0205 Out = FF14E8E0BD5EDA1B Key = 9C5AB450156A1C0128FE670A186ED675 In = DC033BFDED9C70DF Out = E1328AC8450969A6 Key = 657940713BA4A55E8F675814131833A4 In = 1D59C57CE84AEA8A Out = A5885ACE3498599A Key = C842C6F7692D4D35BB450E4E7C25D62B In = CF264D0BD49DF66E Out = 27ABE5E153A4C3D2 Key = 3EB0E4E5092BEBEBAEF96276F47CE468 In = 1893406AE69D2DFC Out = AAD72C276D9E69D3 Key = CD5C440B413C62D84A4C519636B9C0C6 In = 44B5AAF4D5D79A92 Out = B28D5F8AA0A1C8D5 Key = 6AA1376D5ABB85B745D01A6D8A78C493 In = 845D5EF1F9C1BFFA Out = 90B3C70D906525E9 Key = A049D4719E78ED18131B626CB9806840 In = 3494ECC94DDAE854 Out = A98639C5B52E3628 Key = 0B5D4EE79C26227E934F4FD4A369BF73 In = 7915E2553D0581F7 Out = DE0EC36C073CC537 Key = F0F851C1B5575A54A2D542590C492E2A In = 2BB7F7432BEB3411 Out = 530FE0CCFD2A8C4C Key = 76CA1B648BA4C687BBE674BC55E55A9E In = F34831E1A02E5A6A Out = 3833E804F421A8EA Key = 248A15A95F5EF2F53F7712FA6E9762B3 In = F1F2DB3BED1C265D Out = 83D9F9ABFE402754 Key = 39A675C7C8309641E75F42642F98539B In = F668409DEE092798 Out = C0036965EED4C79F Key = 77EDF425AB34448E2D207CFA63A7572B In = D9F33E0E10E47FF3 Out = 07065B582D4F41ED Key = 07988D4DCBDC5856D0B16ECED076FE89 In = 6B21BD7F255183F0 Out = 8556839147C9C697 Key = CFFEE541307F3ABF60965DFB9851F638 In = D92C1326029B5E9C Out = 5F1BF1FC637CFEC4 Key = C03CFEDB59CEB0FCC1C1A9C85B3F2DC1 In = 3417EB62AAA8F79D Out = 15EE04C3C203FA24 Key = F22FC0E8E591A93B781B967E17236F94 In = 020A44BBDBFD626E Out = CDB9F1AF2717197B Key = 7215ADA2904083156A49DFC72EA6B783 In = F8541C9B31FFE235 Out = 116AF4FE8BDACAF7 Key = 7890F2AB2D5337CE85B8D52CC8A039E4 In = 3019034342F842ED Out = 61B1176EC9E01187 Key = 1B97DA37CFD018E4D2C8A619FFC35F50 In = CE00C04C6C8437AC Out = 28525C77AD6FC0B8 Key = 935332BD00F2DFE776C9662C8F4A0CC3 In = 68C4BCDDF19BAA36 Out = A6E0CAF72EE75906 Key = 200E81A5D15A938ECEDD9ABEACBA1EF3 In = 4B323E423FF15160 Out = AD3D825F885DC436 Key = FF9744CA77C270C1753B7BFBD16F2F0C In = 73C78A6B18AA5763 Out = ACF80ADEE2980877 Key = 05CE1F98BAF5BF73A4DE0877DA21BA44 In = 1EC549094DC418BB Out = 0B660CCC9E2FD121 Key = D90C92A972C201D184F0C85CD21B0C96 In = E4B7EC33C430F7BE Out = 109B7807CE1E146D Key = 6E1985A8066D60CFC21FF3A620F9B376 In = 32F022B9930C0D36 Out = F8F4F8A2E16177B9 Key = 0000B3569BE5A91E94BF6684443B1D5A In = 00E7E77150176B72 Out = 63F6FDD518E8D982 Key = 390000E7291B05E590F733F60FE32D6B In = ED0020DB7F893F9E Out = DADB6760EF0C5D45 Key = 4F2A0000F702A704238482F6DDE12624 In = 9E30007B23AE1904 Out = 6F80890BFFAB514E Key = CC301B0000C6E838CAC91B972CD843E8 In = E41E5900820EDC94 Out = 2809809E29782F4F Key = C111A9EF00003832E8388A614D717759 In = 6CDF6488005C518F Out = D2E83193787C1A8B Key = 64BE7002EE0000594EA205424036AC8D In = 45086AD893004084 Out = 8D7DD8F46D2E21D8 Key = B04BA96B0C2B00004414D2523B079870 In = 7610D7883D750033 Out = 6377DF4C959B088E Key = CF87BB9A6AB1CB0000BA666EC4BCC4D7 In = E036C15C24544100 Out = 045EB493788F0157 Key = 7A91ECA485D4A7A80000A7AA40E6C6CC In = 00D5E98F37D74ECB Out = B0B861C2CC285A41 Key = 81956FF834D487A8810000084AEE7D1C In = 09000C87CFFBC0D5 Out = F765ED0254553E8E Key = EFB78A788A0E0C571DD80000E23558B3 In = 475A00BC0B2FF249 Out = 677FD2F453362DF4 Key = 495F198853B2A602FF46B30000F71F2C In = 9851E4006BF265C8 Out = 15058A03573F3A4B Key = DF597069EE83B6E29B0D298E0000ECB0 In = 6353FEB6005C7715 Out = 72195116B5244D9E Key = 5F8334EBD1A4B51387B8BE6D5E000090 In = E62D3D732A00854F Out = A9B997921FE91757 Key = 4B9B76C00E4F2E431CD70A572EE20000 In = D0796D8D7487009C Out = 0A69FE9C2FDB99FE Key = 00FB0FA1A19B42750C43F869251DA800 In = 0F7A885CBDD6B700 Out = 360B140CFE90F66B Key = 00009F0A1C5F738C9A0067FFF353F7D2 In = 0069D3A0691CF423 Out = 57930C18EBF855AC Key = 5B0000794F371B08EB82008CADB108DD In = 1900A63E56603D9A Out = A37093DA9BCAE8D1 Key = 0016000047DACA0F7A1B3E45B2DE2903 In = 8FAF0024EA437E2C Out = 023D8A583DFDEB04 Key = CE24E90000A13DF8ACA26B543552C6CC In = F8956000F44C9363 Out = D8E6AD7DEFF79268 Key = 4E4FC3CC000001A50FEC6AB8E9912502 In = 81E55C21009FE23B Out = 782E42ABEB69CEA4 Key = FB9E06BA2800004F0980DDA5D4505784 In = 2F16443A8000DC47 Out = 5A3EF28BD1AA787F Key = C809C47A6C2A0000BD5AAB3395DE471C In = 2676AC2DFC7900DA Out = 7D181E6251E6A7B3 Key = D80272B7E308F60000D0D45553FA51DC In = 89967E5A8D04F500 Out = F3DE18BF33466F72 Key = 1FC5705EF403560900006741E6AF1C50 In = 00A697D30C1CCFD6 Out = D8BD6BEF7C28D098 Key = 6D40571DFB56841494000011F89FFAAE In = A200462288D91DEE Out = 057F522F2457C7CB Key = 5A11649D78F485A4C70A00009576B4EE In = 083000BB9A0FFFE9 Out = 6A881071A5920D4B Key = AF7A363699FAD5095F50EC0000A47EEC In = 0BCF11006855317D Out = DFE70DEAE707F002 Key = 4ECAF61E5C67E184CC5E70CF0000D5FC In = 9877931D00DA961B Out = 6D44D2CE87076D60 Key = AF81444CC1ECFDB56D1225DF6700007D In = EBC8BB40090003A7 Out = 8E06F01F564B0E3E Key = AF4D154BFE14606A91F96BF529FE0000 In = B5B93F01E2E70047 Out = 5D941B605FA7426E Key = 0096BB79FAF812308F905CC4B52ED800 In = A42551007EDA4C00 Out = F0D12E7B0E7792F1 Key = 0000DCF81BF9E570FCECB62D215A75D4 In = 005D08AA73C9FB8A Out = 43E76E1A3EFEB592 Key = 330000563D5804F2140305F57D6EFE19 In = F8007FF8EDD8AFB9 Out = 9B7AD7CA57EF5DF1 Key = AEB90000A3F2754576F2E81D014AB3B1 In = F9A300633200B23F Out = 487FE441C62B0423 Key = 00BAF10000DAFF62549D46978E84578A In = 0BB04400FE649D25 Out = 9202DD63C1113DE1 Key = 23B1692100001EB81F704895BA6F89CF In = 0E7DCDE700F8523B Out = 05BF95F4AE49BD3C Key = 025B180C1400004DCF61FCC41D77507F In = 418E5BAC2A006BF3 Out = 9357E91A3C3476D7 Key = 88E2B14CF33000000896F148369ACC0A In = 972EBBC6250D0009 Out = 39189DEA6E9D4B5B Key = E77F27457BD13400006BA9C12435B21F In = E6B82D0009772100 Out = F35ED1CE8C15594F Key = 787B47B4BA5C7AE900000E3F96FFECDF In = 00096C31CA9679BD Out = 3D1E54F215E69460 Key = 44F07CDCD86B29F2780000E3908EC0D7 In = CB00931CC816A2E5 Out = 1A7F7AD46F16F9BB Key = 5107A9E297BD6ED07574000055A5F0AF In = B1A1004237BE2C18 Out = A226C2A0F5D69DA7 Key = 7A518CB4D637F7DFD41A5D0000345714 In = EA9BB2009DAD4912 Out = D2EA98B2940FB5E3 Key = 9F331C8575022F9A0DAFE6080000C99A In = F30367A7001B1005 Out = EC80878CB6FE880F Key = D40EBDA6FC5A7FAB29EEAF2AF5000071 In = 854DF822B2006EBB Out = 9B7BB2D159B2F37F Key = F324FAD327E9D959584E3862E13F0000 In = 2A520D5857BB00FB Out = 25F14A7C7E1E02B3 Key = 009C9874395C88CF04C826EED65C4D00 In = 03D2A2E706C6A900 Out = 433725BED51C4F54 Key = 0000C8F8D6BB801FDE22B197F1A6E5B4 In = 00B98EA1D39C6842 Out = 25DFA84D24B46CAA Key = D7000081F51FAC169A6ED69956E456B7 In = DA00E23270D329F5 Out = 719781009013272A Key = 18FC0000E21DA381CDC71C3DD15B97C5 In = 0F39006D63151F90 Out = FF573BA8C9540D7E Key = 844061000076D6202283A9742E0BBD13 In = 53121D00E40F624D Out = 7CC255708A07395B Key = 2E538ED40000A15D3FFFA23A617B347E In = CBF8147800190019 Out = B51D90162BFA3B52 Key = B513E999B3000082DB6F5801E9650D61 In = 977B10EE1D003712 Out = AD84DC81A5EA50A6 Key = 66DEE1483BD3000003917E8882D77BB0 In = F4D0A7BA7DB0000A Out = C5426D2C403ED09D Key = 7AE9F41279784900001B00232FBD1920 In = E544BB76CD2B5100 Out = 6C653919A1E0C084 Key = CA1AB422157D74910000378557D44536 In = 004F3E11A0F560FF Out = FF17EDE487849114 Key = 9425BDC0B2EBF4CDF50000A492AEEE77 In = E200F25C642D4289 Out = 41310F914A105C70 Key = FE310906BEEEDE55DEDE0000A061154F In = A2F2005D26A79D60 Out = 25C7FC5B80757200 Key = EACB3CB4D4A533BB66BE6A0000AB20B3 In = 849D1000A79DC401 Out = DBAFFB54900B99CC Key = F26EF5DB480C4569E0977A3D0000E88C In = EE0A880F00D1CC3C Out = 1D45B4C072EC3893 Key = E0CADEF2B7C8DA97EFC25140DA0000AC In = 01BA9AECDB005371 Out = 35418199AF42D87A Key = D3CF5C2F4C97CCED75BE446ED6270000 In = D75932EE169300D0 Out = F52B8E07CD95D128 Key = 003F188C1904B6B7F6C14EA393599800 In = D183FC38324CDA00 Out = ECBC71EB2E17DC5A Key = 00008F330E389D6D8C759025A73B0F4D In = 00F63B1551CE3FB1 Out = DCCDCE980B8F53FB Key = E80000B995B8B5B7012331DEB18B17E3 In = 73007315B631D42C Out = FEFB6E47E0913958 Key = E9470000D586B0B87E62B9F2AA0CEDCB In = 918A00AC1FE3BEB7 Out = 96E18EBBBC84F820 Key = 0B722500005C3BF867275AE43912CB41 In = 6C4BE70034417166 Out = 2233574BBFB37A47 Key = CBFC29E10000A00051235EDAA9B4E90C In = 579D81C500B37B08 Out = 284761ECA5AE4D8D Key = 47F3F9CEB300008A411860CA30676173 In = B0632CA13B006D91 Out = 77A21967A910E4B0 Key = B49E9FB3667A00008D35B8302A2E3FE5 In = 110AB0B74835001F Out = A0C0B6A90315B41B Key = BBC8596413675B00006897EF67EDD14D In = FB631C5B0D8A6D00 Out = 3C21A854AD831504 Key = 8329212347EA2EB400001CBBD08CF5DE In = 00F05A000352CA7F Out = CB164FEF25E0D62A Key = A055853B4E0843152C00005F452804D4 In = 780070AACA69878C Out = 7F789323A50DDE56 Key = 2BCBC21612DA339F979100007EBAB0E4 In = 1DD700413C203186 Out = CC355BD664B0A9C1 Key = DD6F4817817D8AABF9C3A90000668450 In = 2BB01100705AD581 Out = AE453CCAEEDFABCE Key = 009ED73BC35BF76DD480342600001440 In = 5FB94F850063181F Out = 03833C51E297D936 Key = 762307A655DB2DED925F1AD5D5000090 In = 46C17CAACB00A242 Out = EC6EFF8167F35D74 Key = 5762D3C970C7D7140CF5E1C6DDEE0000 In = 1F9C7CBA044000DB Out = E383EEFA935DCBFE Key = 003121CE9826F685AC5DCBD51FA81C00 In = 6658A1F0D70A2100 Out = 839F662509406DA2 Key = 0000BAFC3B6684E9CAE26E2A51B8D2B7 In = 0084C508986E2762 Out = C45D727344BCA366 Key = 2E00000EAAB656F92F0007965ABA6D6C In = 49005892EA319D10 Out = FB4D505B13FBBAED Key = 92980000CBE225278A7B3C7A7DE69A35 In = A8E7005578C53974 Out = D0D4DD42CA42B8B7 Key = F20D660000A5D7647224CE32F139ADEE In = 97756B00255781BE Out = CDE5C028BB80CEF4 Key = 9102EEEC0000793BFD15C30AA5EAA94A In = 1E57BBF90019301C Out = 6CBE3727B8B0C3A3 Key = FF93238C670000B99C2E91E15939D6B1 In = 249B4EDA62005187 Out = 0E66EDEEC9093E1B Key = D005C51DE6700000D26AAE0442CAB9C4 In = 605BF46181D700F0 Out = 07D0EE1AB4F82F05 Key = 9E3A2695908A89000090E75D1AB81EDD In = 5999811287EFF300 Out = A767C32D85CB0311 Key = C4ABF59B7185DD460000E0EBEAEF136F In = 00B9486C88FA039F Out = 49852C9BF77952A1 Key = 0C235BEC758B4D46DE0000DDAFE816E2 In = 4700605F3130BE76 Out = D04C0BD08DC431A4 Key = 64DADE3DE21483B352F30000173BB8AD In = B17A00CB2A5C5EA0 Out = E990AF9440CAA261 Key = 9D3D66E09D5E5A11F67B940000031BC0 In = 3A75A600BE66B998 Out = F79AAFDDBFB00ED7 Key = 9ABB92CE570A884BF048E7180000B852 In = D7FED4EC00AF9516 Out = 03641077F0CFC0D3 Key = 71E6A68A90875150CB9D110958000066 In = BE22BC11AF002EB2 Out = 8E64899F1DCA1784 Key = 83207306634833B4F7592EC4CA7E0000 In = D3137A569D910073 Out = 3EECE97BB80D548A Key = 00C41B6795275751DB42AF77442F5700 In = 5BF3EE3BF5E7DC00 Out = 15ED3B45209747A8 Key = 00004EF57C7E3A7BA01419C60C080F2D In = 00A709FBF07436DF Out = 3571E5635D0BF407 Key = 5F000045014A6ECF98F421DD289C55E6 In = 06004AEB60290B42 Out = 4F21AFAD884330BB Key = 12CE000033406D9AF884C84CD6DDCD21 In = 7BDA00CD32B3B1FF Out = 520937683AD5675C Key = 35C251000040AAC84B90B889D0A24D8B In = 838374006643B143 Out = 47BB11AF631FFB5D Key = 370567E0000026DF3BB5BAB73207C749 In = 77C34A1500E95667 Out = 88DB931F156F5445 Key = 640455AE31000092B9386D9CFE4ADA20 In = BE620F73AC0068BE Out = ABE4640EABBFE340 Key = 5B13FD6446290000CCA1F2F0D341C718 In = 48CDF31F6C0A009B Out = 084203C1BD3A658C Key = 88B89A7EAD61670000D8C490A0C4FA36 In = 23399EC96B9B4100 Out = BE3E576D35FCA745 Key = 0BB8A5C30B7ADF860000E55F515B2926 In = 00DDACBA7C185AC9 Out = 52BD247982A561E2 Key = 96DCCA0A25EFD962960000AF7DD4254E In = B50045B0FEF1621E Out = 763B83D026874BFE Key = 6601F4C2AC654C1381BA000073447B02 In = B6880059216DB5A9 Out = E665B554ED12D8C6 Key = 5D494C989D3665352EA74B0000CA342F In = 39521B00F3D72E95 Out = 60F3EA47071F5306 Key = 79FBED035100F698DDE99EEC00005DDD In = 953CA28D00AD9898 Out = 0F2C05BA11B2B8F4 Key = EE04B71567F014F7F763F0ADE400005D In = FE4A28C143008952 Out = 6973F45BC603F9BA Key = 63597101B3A8336FE99E8A76875B0000 In = 8890123697F5000C Out = A95049D6AC47E7AE Key = 0012B2CB4F003EF195BC1414D6540400 In = 95533AA66EB7CB00 Out = 391CF1D308C67292 Key = 00002DB7D757486930606F2FC7045F64 In = 003D8F50A0E537A1 Out = 22C19CF341DB7CE1 Key = 2900009BB26F083A61B0026163042AE7 In = 3D00863574901463 Out = E5F948AC91493AD7 Key = C6D60000E4538CF8C0456846DEF4F62D In = 597300AE3E2440A3 Out = 2055962B4045F983 Key = 37DF430000F338B8995333A55F08241D In = 4A4471000EB0F045 Out = 343F5A228725CB59 Key = 21F6AC3200000AC6134F909B262ABF45 In = 95E4A397007E0C98 Out = 9B7A68A66565BF92 Key = 85C5A3A2A5000092B1200B7A21026857 In = 49B954C71700B39B Out = 4ED5370451EFE68F Key = 978A0012E5D70000C4DD7951439D9075 In = F37CCCA968E600A2 Out = 19B7CF5AAA1B3982 Key = 08FEE636F11EE9000023E7C6E6391CE1 In = 66826CD1026EB800 Out = EB43FEF9EF68F5E8 Key = 22FB9C48B908873D0000CC334F8ECAD4 In = 0038F00D37D87617 Out = B5FB0F31785A62E7 Key = A6674F378AEA5615820000158D7F428F In = 3E002551E14202FE Out = E60B4B8827C32C45 Key = 58870F8E541EAA612B5700004E0CCFD3 In = D0FF0072DDBA174E Out = 03FB49171B487274 Key = DD9E8B78F04A65AFCBF1AC0000EEB486 In = 4AFBF200DC1CA63C Out = E86F1ED9B5F2BDE9 Key = C13A59987AEF8C4B4EC3A87700004629 In = C9ECD9EA00FD7324 Out = 3C929A746C599E13 Key = EF39A0BBDDB2F976795853A6A70000A2 In = 03738D499B001F95 Out = A10BAC400EA235D3 Key = EF70882E7E3B1286B1115DCB8B2E0000 In = 5A5BC6AA243C001D Out = ABBF1B2A1B1C7EDB Key = 00268897396591A96671BAE6835CEE00 In = 640598E874440000 Out = FB5B53FFDA4AE2B1 Key = 0000FA74B64B61582897AA5F85A580D0 In = 00F195A06A3A8DEE Out = 21870177D8463B27 Key = 920000751D3E04FC3D70848FEE2C8A4A In = CF0095E2C5BB96A3 Out = 49FC16F142F6B04D Key = 9CF30000A0259B7A8CBCAA62D9326400 In = EC5300EF494C40A0 Out = 53F5E36D9C42526F Key = 3FF4A700001DE8887802A58848039E14 In = A5A6E800A291949F Out = 9C93982278A28B8F Key = 8831C67B0000C629DE8F43A2842DCE45 In = 7505A80B006EC907 Out = CCC97DB1F9700494 Key = 3FABC6EA510000549F6EA0ABED81761A In = BFE978B8C900A7BA Out = 8450C52D333152BC Key = 913F4029C2FD0000A0C526F4ADE6C876 In = 2123D1105B2000C8 Out = 4F1DA3B7848F7A00 Key = A501B4B7AF5BF00000E38350CAE4AF92 In = 9517D1A98BFC6900 Out = 61B272A808305B45 Key = 6ABFBD71ECE9D8120000C6ECB50EBBBF In = 00101D45B3B4F245 Out = 5FA1D7209BAD5FD2 Key = 5B657D628773EBC999000077F8E75435 In = 8C005E7AD75D5D78 Out = 199B787CA91776D8 Key = 2AF96D2E03087B4AF6000000BCF73EDA In = 2EEC00C410CC826F Out = 278A95BF49240E42 Key = 2AFD4E989C9CC10D821FA4000002F95B In = 4904D500D78A9F0E Out = 397E12BE77633D76 Key = 4ED02D605500B6B98D5EC7180000F61F In = 0614FC13005971AB Out = C1CC70E18E244A6A Key = 39685AB8B0B0787B5761F8477F0000E6 In = B928318683002594 Out = 61F26AF133A64689 Key = 156652C914C9CABD835EAC0C02A50000 In = 427F4CBAB9C40023 Out = DAB73E5C3E533D71 Key = 00B52760FF461B21EAD6D68F8B6E6100 In = B5AAF71A1D863200 Out = 4017699A8336070D Key = 00001B2B3DC232FA625F5542C16C59E0 In = 002B3D27CE1DEDEC Out = 9567515235BAD0EC Key = 230000CFA6068E57307ACCDA2B550748 In = FC003F97BA171F07 Out = 273B74F309D5C6AB Key = 8B210000D8C532EE1E016738D7AD1689 In = FFF60003BE4510BD Out = 1EAE8EDC01F5FF11 Key = A4959A00000326639A573B79C5857DA3 In = 1A05730041342D4B Out = B92F6C453B192ADB Key = B28CC4130000F85DC68AE7A87C1DBE97 In = AEB42C6900628B42 Out = A7489C7D07147226 Key = 76DE82835900000820D5DB67DB8E65B0 In = 5DB907497C008FEE Out = 22F54C713A076B1D Key = 23E9FA3F7DFF0000904A028020985348 In = 7C2860EE183600A5 Out = 49892090BC7F0551 Key = DFA73EB8D9A6D9000049FC581CACFF59 In = 0D5222ED6F816100 Out = C1103CC4549AA574 Key = F2CC3E9A54C972AF00001ED95A7136DC In = 00E3F77B95074963 Out = 97D6FEC499DA8B04 Key = 7623606A0EE1F8AFE900004AAFD16505 In = EA0020AE7F1610A8 Out = 8F6589E66FD224CE Key = 28A6BFA833FE45F96C7F00006364D2E8 In = B922006F9152E846 Out = 8A77F6831E030CBB Key = BD24A27EE9F5A9D7C070270000E375B7 In = 124FCF005D4B9516 Out = 5C5497CD35FAD71B Key = 59B26F3A3D381643C6BF305E000017B9 In = 7BE5B07C0019E760 Out = 587AD202A11B3DC0 Key = 6683A3DFD65AE3090DFDF4CC0F0000CF In = 86EE9343E700BF3B Out = 5B1A0B6C08AC87C6 Key = 532B823D801D590FC11588E1E9C00000 In = 849631C57F710077 Out = 656B5C536FB6CC79 Key = 00EF36B04F6A32447C3436594E618B00 In = 4BB2914542E2FB00 Out = CFC0815374FD0C1B Key = 000079E7BDFCB56E6CD2504326F7A05E In = 00E5B6AE4E1F04BC Out = B889980FB94C6B43 Key = 9D000090BBA22501CC3D289620344CFE In = 8000550EE1F4163B Out = F15C9759B51FE740 Key = 9E150000BD4147F02B1774E627B4B629 In = 7B880038C192AF9D Out = 43C2B447D3BA0C59 Key = 6BED1E00007411FEE04065CDFFFA6BCF In = 5B35710020F18DF9 Out = 127D3522FECBA756 Key = 55EAF5DF000000BD649B386531093092 In = 52223B3700E9D842 Out = 03B749CFF1E6C4C5 Key = BCDEB8A0AB0000BC2B61484D72F74261 In = 77D33E252B00796E Out = CD4E93288046C1FE Key = C4E9F884CFF600006B2118DBD4C23172 In = C201377F005800AC Out = 35886B5494D1077F Key = 111B4112EE4B430000EA7572062FE19B In = 4203C3683617C700 Out = AD4E16B645BD381C Key = 9B6AED103D1247820000B4F12B8A6570 In = 00A925E6CDCA8787 Out = C1874B1A18A25AD9 Key = D31D1824E780FA7D1C000072040C4E4D In = 8100027ADFE381CB Out = 9E1E67617BE12123 Key = E766029C528400A81CF000006D4A819A In = 43AC007918BEC51E Out = 8954A8628F6073A0 Key = C755621F8B81EDA16C094C0000340D28 In = F1394C005E54D8C9 Out = CA83AD379209D949 Key = 1A5FACF05ED2356D3A5FD23D00004B8A In = 921F09A5006C9C5D Out = E050650A0EFF64AE Key = 30AFD17D4AB9E6D148EA8A92E40000EF In = 9C2DC2DB4D001297 Out = A4CA5E9D472CFF6C Key = 02322ACAE0B6700E7D82445B7AE60000 In = E79FB1B4A49700F1 Out = F75468D5CC3954BA Key = 000001D4F9600F91B2CD1975EAD58100 In = D400A5AAC4BAB700 Out = 1AC41DA1F48BBEBC Key = 00009E8291898B9E961C3B2BEE43316F In = 00852E54441918B1 Out = 65185050DDE7C809 Key = 57000019D59FB182721C98FA4C8E8159 In = 01007EF2BB26A601 Out = A866E8FE026031F7 Key = 09B90000B8AA6CB18683542EB1E1FF4C In = 77E90016E2D57409 Out = AD476E7180FC80F1 Key = F8031C00007891A8A240FCA992D0B913 In = D73DD20032F3AD08 Out = 28F91CF76FA4DF45 Key = 87BD381600003DE9342FED8F961D979C In = 83DAF01E0006CB29 Out = 69143710EE5A8C73 Key = ACA61121BE000027F1B6D102FD3961A6 In = AE2CF2733B00D3B6 Out = 643546FE48876F41 Key = 79368D955A5B0000541E1EDFD47D6032 In = 1F9A8F74B9B900EC Out = 7C7DE0F4A345D90F Key = 3994D0035AB18E0000E14EBF062253DE In = 8B6248D2FD693F00 Out = 777B184E2D373FD2 Key = CB05F743DDDDBB1800000CDABA6F7082 In = 004383DA5687DD0F Out = 2E33EE3C80B03AA3 Key = 7B8034C0387A15C2890000B8B7EE44AB In = 4700DBB3C47A79D9 Out = A9FEEC660D58F74F Key = A7B9EEF171C2BD96193000002A452412 In = DC8A00992CB890BE Out = 00768BB855022EB8 Key = 4966648D0D24BD8A47137900000FF58F In = CF6F0B00E8BE9CBB Out = 50EF6E3D4C8186FA Key = D313A88DFC9919BC83A5F70C0000CBEE In = 8CEB523F00FEBD62 Out = 47A692CBB77E3094 Key = 2C7334D72D28BD4991B27976F10000A3 In = DFE43077AF0046D2 Out = C49D7ED471A33390 Key = 6F8B3E9B3EE594685B1BAB08E81E0000 In = A80A61EA43ED00FF Out = 71CD051906E9A827 Key = 0087A1D456585893EA218FFAB998F200 In = 3356F9540109D200 Out = 6477D5BF8948F942 Key = 00002BB85339EF5E5D18F0E8008F42FE In = 0015F9BA89E0070E Out = E411797E5ACA7A34 Key = 810000551FA49B6E0257DF16F60120DB In = 7400869928902188 Out = 591CDBE69845DECA Key = 56CF000016BB754C80DCF86B50E0BCE9 In = CA4400FB5B4F3CCD Out = F21BA22C66243D7F Key = 6EAF8800004AE2758A491A45F3A49F60 In = 079CC900CE8D9824 Out = 89D4843D4E496542 Key = 4E7980B70000F3B9625F09D08DC9D536 In = 7CD8815F00823DF1 Out = 294EFEE87CD9F6EA Key = B24B949D0D00005E79CFB4C695CC7682 In = E993C60ABB0036CD Out = ED87467617F4715E Key = 36990D8EB4CF0000A61D7AC92953D590 In = F1116845981A0041 Out = 90D6DDF669F5A4AB Key = 310024F6D3C390000095EE57E871D83D In = 1630B706F44C6B00 Out = 34B15DF951D3114E Key = 69627F5EF0294C160000051D531728BC In = 006352FFEEDFA3E0 Out = ADEDB3A6C0472082 Key = 535549708D93FFFAAE0000C47F66AD22 In = E600F2A11F1D60E9 Out = 546494BF27CF9BAD Key = 87C4B4C31EE8568D6EF40000D66986CF In = 12100060BB5A7C60 Out = BAECA338CCA4A540 Key = D20E0C0EB3DD4C92A18806000028A92C In = 2DADEF00AF8FFD13 Out = 58E3E38C6DFD23CE Key = 7E660BF195FC3D651C927F8E000085BD In = 43263CD0005E45D2 Out = A1CB693BB73C8282 Key = A18B8DF4228195D6273289252A0000C7 In = 915C2A153900C3AE Out = 2C324F7AD676DD01 Key = 89F557F3DCC2478682F9A746B70B0000 In = 16973A764ED700CC Out = 0042D6D810E51234 Key = 004D652ACB1F74CD984174350CC88400 In = 729FCEB1769F2700 Out = 3B8DD866347F3C12 Key = 0000F2708A6D18D1BAEEEF6C618C0EEC In = 00940B86CB15DBCC Out = 91DF44E34428321B Key = 3600005455F0F4BFEBE03E37F1A5D391 In = 1E009CACCE5E4B57 Out = 36A72C67FEA71DD6 Key = EC70000086CA353F3F38784B440E7B2B In = DB630084270EEA71 Out = 5A75F5BCB581F078 Key = D3D8C9000055C5FA0B09530819ECC2D0 In = 48A0C900DCCFFC53 Out = FC779AFD4EE05356 Key = 45F4D2B80000E78E7199F0F0B2E2A67B In = B2D763CB004D729A Out = 39C55AC867CBBD0E Key = EA730C0680000039A13B4069D0718FA1 In = E8C2AE5BE70052A9 Out = 7B842C4E1B4360CF Key = DC340096A4CE000032B772BF3F706A0A In = 38C71268B7150070 Out = AEC3A0ED452221A1 Key = D58DD7A445FC2500007CC749B73823D4 In = 0CF17BC67C288900 Out = 19C197698A765E06 Key = 48EA721821935A9700006EA093FE21AF In = 0054DE83BDFDDEAB Out = 6E01249199FE3322 Key = C6A697FD248B8476B300009DF15FBE5B In = 6700F2050642E50B Out = CBE6CDFB6289FD7A Key = 4E92C17C0552C32915AB00001488853C In = 370F009211C51E13 Out = F80008FCD23823A6 Key = 6E7B7F4D9C6E74297E93C30000AEC95A In = E3D4FB006D7E2048 Out = 8E8F8CF995C71171 Key = 7156D4AFAC1C2716D4C493FF0000E0A3 In = 266CCE370000B7D9 Out = 8392D507AEF1C999 Key = 6BA79216829469E486A15E58BE0000AB In = 89715DD84B00A877 Out = DB319D867BE6F5EA Key = 5ABF097E08456B3D2365C54D7AD80000 In = 4D2DAAD3FA020031 Out = 7497F67FFE71486A Key = 0086298EB766301EC6E64DF9BF3A1800 In = 2A9EC46663F40E00 Out = DC9777DD2553296F Key = 00002F79F90D1DC67F047452CB95E1C4 In = 00F1F54E9A6DC02F Out = DD3780BA7B16263E Key = 7F0000FE37B43BAFC74D392E5FA06975 In = 74000A0E9ACB88AF Out = E77A9B550D731164 Key = BE21000089A1840B71A5C68F4A4A32F1 In = 94360078C737AAD7 Out = 04A17234628802E8 Key = ED65970000BD224C0437DC9F010C44F1 In = 8BF4F800EE7BFF5D Out = F244EAEEC5072D9B Key = 51F7E6350000931538B48D6F0A8270CB In = 826837CD00BB0898 Out = 05DB95245B3B175F Key = 25A16F78BD00003EDEAC10D86E59A0C3 In = E4412B7327002012 Out = 989AF943448FF64D Key = E3701E3714A200000AB226A55C447407 In = D71D7109FECB0072 Out = A1389295EBAF0F72 Key = E4A0AC28EA269700009DAD6CD2E1F0C2 In = 767EF7AEF3CAA900 Out = ECE04FCCBFDA84DB Key = EA46F14603B3F1B3000089DB9A07A212 In = 0085CEC40E37DE72 Out = D506ED9634352AF9 Key = EE042F10350A3F824100004759009A0B In = 7E00B573B2B56DB0 Out = 3C7D916C612D6C6D Key = 6BF869D7953D476E3F7B0000E9A2F766 In = 409900D3F359A7AA Out = 0402B0D166C562FB Key = 948986E810FED4CDC434270000887908 In = 8BEEB6000757F14A Out = 803B9943069DE4CC Key = DF75364489CE5CA5499C1E9900007956 In = 85218E2800777319 Out = 5D4D710B47111D9E Key = 7297F8C7A3E983D47CCA04098A000083 In = D4659B115000E6F5 Out = F1535CDCD422F70F Key = 43A74F8F64AE65BA6915D95EAC620000 In = 2A0D9FBA320D009D Out = A830EC0A0C700181 Key = 00224C24A7D084B77FC18ED3EA2E0B00 In = 0EAFF9E79E22E400 Out = E8C444A639C28AED Key = 0000D712F43ADCFED1A9CBCB22CF4E2B In = 008B322DF1816D52 Out = 0F810DA2BD5E2203 Key = AC000016255D3D8E7F9DC60844C8E5EB In = 21006874A08B7DA9 Out = D2E3EED16501E0F1 Key = 31230000FDCE8D418A2AD59630E3B54A In = 3D600001421332C9 Out = 5ADA46B4E6ED7396 Key = 87AD9B00002C142672046D7D1914832A In = 1925E700BCBE480D Out = DD75CA1376BF4E43 Key = A0D2AE630000E673148BA974CACB74CF In = FE95691300B4B938 Out = 5EAF07F852F1335A Key = C29993616D0000F6B88C40426C971CB0 In = 4A51204D1D00A7BD Out = D369B44DE778C5AC Key = AE011C7A16E8000094130EB7C82CD4B6 In = 010264DC3159009A Out = 6050FFF2D7DE8517 Key = D1918B16DD54970000844052BCC2B288 In = 54C23864C6E67100 Out = C846131ECD974EAF Key = 40C3D98253E2C06F00005628F914678C In = 005CA93A9FA5CEA9 Out = E225EC5890787888 Key = 37B0B3CD389C875BBF000091411E61CA In = BA00792365BE88AE Out = 6A8C12DA66EA9595 Key = 4DA603D49F6830E3B14F000001B18BFD In = DFEE00E54435255E Out = 39CC7776BEC81C90 Key = 5A7CC2861C3989B5F09B9100000E03F2 In = BE9BB6004AFDB5B1 Out = E70AB60E29A55AA4 Key = 9E93015F09085EB4FBFD352400006A3F In = 6C2C99C80044DBBC Out = DD165030CFB74177 Key = 014C89D7790CE632665EB557B600008C In = BAD143510100BBC6 Out = 847E7BAC90EF08A9 Key = 94A2FA1B3BDABE5F4E4B6945AF9A0000 In = 108B4CAD993300BE Out = 949B5376E26551DA Key = 0098EC83BC69794459037F407F240900 In = C779A209E5254E00 Out = 030B0A813E7302E2 botan-2.4.0/src/tests/data/block/kasumi.vec000066400000000000000000000004101322470703100205360ustar00rootroot00000000000000[KASUMI] Key = 2BD6459F82C5B300952C49104881FF48 In = EA024714AD5C4D84 Out = DF1F9B251C0BF45F Key = 8CE33E2CC3C0B5FC1F3DE8A6DC66B1F3 In = D3C5D592327FB11C Out = DE551988CEB2F9B7 Key = 4035C6680AF8C6D1A8FF8667B1714013 In = 62A540981BA6F9B7 Out = 4592B0E78690F71B botan-2.4.0/src/tests/data/block/lion.vec000066400000000000000000000005531322470703100202160ustar00rootroot00000000000000[Lion(SHA-160,RC4,64)] Key = 00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF In = 1112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637382015B3DB2DC49529C2D26B1F1E86C65EC7B946AB2D2E2F30 Out = BCE3BE866EF63AF5AD4CBA8C3CAA2AA9CF9BB3CC2A3D77FF7C05D0EC7E684AD6134ABFD7DF6842B7292071064C9F4DFE4B9D34EAE89201136B7CE70ED4A190DB botan-2.4.0/src/tests/data/block/misty.vec000066400000000000000000000051241322470703100204210ustar00rootroot00000000000000[MISTY1] Key = 00112233445566778899AABBCCDDEEFF In = 0123456789ABCDEF Out = 8B1DA5F56AB3D07C Key = 00112233445566778899AABBCCDDEEFF In = FEDCBA9876543210 Out = 04B68240B13BE95D Key = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A In = 0A0A0A0A0A0A0A0A Out = DAD2CFFB201C00DF Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 0B0B0B0B0B0B0B0B Out = EBCF435B23CFB4C9 Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 0C0C0C0C0C0C0C0C Out = 92E00981E5350015 Key = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D In = 0D0D0D0D0D0D0D0D Out = CD70199048ADB686 Key = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E In = 0E0E0E0E0E0E0E0E Out = ACAD6C19AE66EB41 Key = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F In = 0F0F0F0F0F0F0F0F Out = 4ECFE751E0E6A16F Key = 10101010101010101010101010101010 In = 1010101010101010 Out = C7A91953216F1B61 Key = 11111111111111111111111111111111 In = 1111111111111111 Out = 0227EB3422109682 Key = 12121212121212121212121212121212 In = 1212121212121212 Out = 5B88EB8714B2CE08 Key = 13131313131313131313131313131313 In = 1313131313131313 Out = E325B133AB02C021 Key = 14141414141414141414141414141414 In = 1414141414141414 Out = 93A4074EE9C38AE3 Key = 15151515151515151515151515151515 In = 1515151515151515 Out = 15AB85B70F337868 Key = 16161616161616161616161616161616 In = 1616161616161616 Out = 7EFD6E05D384512F Key = 17171717171717171717171717171717 In = 1717171717171717 Out = C1E46E7B54BAD271 Key = 18181818181818181818181818181818 In = 1818181818181818 Out = 956504E0F372D380 Key = 19191919191919191919191919191919 In = 1919191919191919 Out = 667C8BB548330E81 Key = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A In = 1A1A1A1A1A1A1A1A Out = 1F8787DF7582DCD0 Key = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B In = 1B1B1B1B1B1B1B1B Out = 47F4EAF5BA82C610 Key = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C In = 1C1C1C1C1C1C1C1C Out = 0F772431C6E54F3C Key = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D In = 1D1D1D1D1D1D1D1D Out = 51CF4361B3EF3EAC Key = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E In = 1E1E1E1E1E1E1E1E Out = 7AC52498328C66BE Key = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F In = 1F1F1F1F1F1F1F1F Out = 9C4E0F782BBBD830 Key = 81818181818181818181818181818181 In = 8181818181818181 Out = 2FFAF44121E4F834 Key = 82828282828282828282828282828282 In = 8282828282828282 Out = 4EED79D6916AA112 Key = 83838383838383838383838383838383 In = 8383838383838383 Out = 12B62B3C7FCAA24B Key = 84848484848484848484848484848484 In = 8484848484848484 Out = F7FAF70C7E4ED8B7 Key = 85858585858585858585858585858585 In = 8585858585858585 Out = C58EC8FEE9DD45CF Key = 86868686868686868686868686868686 In = 8686868686868686 Out = A6159BD7C1E24B82 Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = FFFFFFFFFFFFFFFF Out = 651F3092AFA551D0 botan-2.4.0/src/tests/data/block/noekeon.vec000066400000000000000000003547501322470703100207260ustar00rootroot00000000000000#test cpuid simd32 [Noekeon] Key = BA6933819299C71699A99F08F678178B In = 52F88A7B283C1F7BDF7B6FAA5011C7D8 Out = 5096F2BFC82AE6E2D9495515C277FA70 # Multiblock test for SIMD Key = 00000000000000000000000000000000 In = 800000000000000000000000000000004000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000800000000000000000000000000000004000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000800000000000000000000000000000004000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000 Out = A586AB4C616B77E9C6F23F4CF79A6EA45D64A553DD47A7B542174608C8E0D8CC10B34188EFC03149C9FF573CD7A9ABC41AC96A72A040CE6F0379D66DC5C502C32BD1DB3468FC373DEC02ACCAA37BA530DA6E9A8C4C5D98B0BB2F96EB26DC097F2D48240DB2CA47CA4F2F0EF936F9C5AB009E98E448AEFAB5FF688834BB5E9FE71B45CE130A1A6F1DC4214C0A5CE0B9C0DCBF2D355008F07D0D424058AE6AEE38709E43B53348F4D22FBFF76B2D3BF7D3CB4028BAF2E688806CAEB48D40D8800C # Following values from NESSIE test vector file Key = 80000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 98FE359A01CD3F66F8D662B746F825D7 Key = 40000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35D83B466760B35386A63F2AC2C59464 Key = 20000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F0C1EB474DB00DAE3632475D90EABDC1 Key = 10000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 765D3C81207B5961BBE3C01560E29F9F Key = 08000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 43D004D22EA6E3B70CE665962F0453C5 Key = 04000000000000000000000000000000 In = 00000000000000000000000000000000 Out = ED286722CB7583D7BDDB07D22ED904EC Key = 02000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6F10702EDB9E6747075DF8F17731DC76 Key = 01000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 245266AA68AA8AA2F3009FB02951F6B3 Key = 00800000000000000000000000000000 In = 00000000000000000000000000000000 Out = EA747E236C4E2F8EBFAAC1CB0864DC3D Key = 00400000000000000000000000000000 In = 00000000000000000000000000000000 Out = F323584537119FF42FFA46FB7049E725 Key = 00200000000000000000000000000000 In = 00000000000000000000000000000000 Out = 42CE57C47C45BA4C1CE75074BC512AC3 Key = 00100000000000000000000000000000 In = 00000000000000000000000000000000 Out = FEEF2CF8C17EB2C8FF083817189440A0 Key = 00080000000000000000000000000000 In = 00000000000000000000000000000000 Out = 08C0D3E8D5A01D17888D5EA1D5F1F9D3 Key = 00040000000000000000000000000000 In = 00000000000000000000000000000000 Out = D400F486FB5F45C3F7A060D2A816D9B8 Key = 00020000000000000000000000000000 In = 00000000000000000000000000000000 Out = CDCDF00D30481CEE650F7EB7237A6069 Key = 00010000000000000000000000000000 In = 00000000000000000000000000000000 Out = E5D8CA9851862FD55835149CA98F419B Key = 00008000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4E609317EB312CA1444B3017122BD9D9 Key = 00004000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0D04067E798B317F183A872836C3277A Key = 00002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4B83B5467764E3AD0437C1A6B036D4D6 Key = 00001000000000000000000000000000 In = 00000000000000000000000000000000 Out = 67AEB3B9C746FFDD8F87940288C7825E Key = 00000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 936F9D08EDAACD91FEEC764E1C6E6838 Key = 00000400000000000000000000000000 In = 00000000000000000000000000000000 Out = 94D8ABAD708FB11FE94282F7E80288E2 Key = 00000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 9D621A8B0D66052E44F03149A1986F36 Key = 00000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 1231B6F6D4DB5EB53187B77DC018CC41 Key = 00000080000000000000000000000000 In = 00000000000000000000000000000000 Out = DF4E18327CD32ACC1D35997BE0DE5D80 Key = 00000040000000000000000000000000 In = 00000000000000000000000000000000 Out = A5B463711E8CCA4D90261EF039DA0B3A Key = 00000020000000000000000000000000 In = 00000000000000000000000000000000 Out = 52B44E25575B3B3F8161633EC278EDBB Key = 00000010000000000000000000000000 In = 00000000000000000000000000000000 Out = CE39C28C8CA160B0FCF5446A337C461C Key = 00000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 52360364345D2E8E06A9EE338888B6EF Key = 00000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 5DE38D6971C09AC1B69E633D1FEE5337 Key = 00000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 42C5016EE49218201A7CFEB72842D562 Key = 00000001000000000000000000000000 In = 00000000000000000000000000000000 Out = BCE9890216F1F3190FB9671034AD5207 Key = 00000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 680D37DD62BD723122C7EA6BC2F7688B Key = 00000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 0F190B6BBBBEA02D991B1E0218AE14F7 Key = 00000000200000000000000000000000 In = 00000000000000000000000000000000 Out = D38B9E3CC771689B58FBD7828A75E049 Key = 00000000100000000000000000000000 In = 00000000000000000000000000000000 Out = 50DF35F605A08992838946AA10D7A131 Key = 00000000080000000000000000000000 In = 00000000000000000000000000000000 Out = F1C3D8CCC3283E2A1C32545959B928AD Key = 00000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 32F3C3229017AD7EA9CF115074F988F6 Key = 00000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 09E934440DF058FB03891A869960DD82 Key = 00000000010000000000000000000000 In = 00000000000000000000000000000000 Out = 3537ED51932A9EB6F95F8B62DBDC08BC Key = 00000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 46C1835E47E7B9DDBFB2361CBDAC25FE Key = 00000000004000000000000000000000 In = 00000000000000000000000000000000 Out = 16B0404CAD3B8F8B1D691570BF5A7331 Key = 00000000002000000000000000000000 In = 00000000000000000000000000000000 Out = 6FBE336914BF6A3E341668A5AFFC439B Key = 00000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 40557FED8A13518AEB309EEF7BD9D511 Key = 00000000000800000000000000000000 In = 00000000000000000000000000000000 Out = A358F2B746BC285874AEA4B66DFE694C Key = 00000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 98E3A106AECC509618D3954385AE47F0 Key = 00000000000200000000000000000000 In = 00000000000000000000000000000000 Out = A65A2D1B86D66BD01B9F8F09FBE14C2A Key = 00000000000100000000000000000000 In = 00000000000000000000000000000000 Out = 0878B1077BD407432970EC1536879F61 Key = 00000000000080000000000000000000 In = 00000000000000000000000000000000 Out = F78598C5758924EDB919EFF179934FC3 Key = 00000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 7D546DDE43A562222EEB7F3BB2BD98D3 Key = 00000000000020000000000000000000 In = 00000000000000000000000000000000 Out = E050FBF6C7F2A3F96DD870EDBE5AC14E Key = 00000000000010000000000000000000 In = 00000000000000000000000000000000 Out = 8F841BC56D920DDBA899F6F3A59BE8DA Key = 00000000000008000000000000000000 In = 00000000000000000000000000000000 Out = A2EBD7FF7BA628B9220F65117047492A Key = 00000000000004000000000000000000 In = 00000000000000000000000000000000 Out = 982BEAFC79141BFBC51173800D9A9ECC Key = 00000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 5EC79D28154C5CF3DE03E2D2F1F5FFC6 Key = 00000000000001000000000000000000 In = 00000000000000000000000000000000 Out = C056CA52F052BDCE69D5BFB6F361C9AF Key = 00000000000000800000000000000000 In = 00000000000000000000000000000000 Out = 1AEF09051ED5914A95D465A1FCDE721E Key = 00000000000000400000000000000000 In = 00000000000000000000000000000000 Out = 13DFBDA39D7CDD3F6DC494C5FB9EB9AF Key = 00000000000000200000000000000000 In = 00000000000000000000000000000000 Out = F31632340F3B34E64DC7058564505BA8 Key = 00000000000000100000000000000000 In = 00000000000000000000000000000000 Out = D3E846C33400F991FFD8515C08956D19 Key = 00000000000000080000000000000000 In = 00000000000000000000000000000000 Out = A8CAED799ABFEB05CBC8D76519AA2964 Key = 00000000000000040000000000000000 In = 00000000000000000000000000000000 Out = B92F29A69ECA0C8401A1CCF717516479 Key = 00000000000000020000000000000000 In = 00000000000000000000000000000000 Out = 23FED4EBCB07EE010539EC434251BADF Key = 00000000000000010000000000000000 In = 00000000000000000000000000000000 Out = 2A155D2E4EE44A50A552C67E8AFF7705 Key = 00000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 0BCE21352D35CCCB5F813C54C0A6F4C6 Key = 00000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 358DAFE6E0B112B3B18E4EECB337D15D Key = 00000000000000002000000000000000 In = 00000000000000000000000000000000 Out = BE4A182DC291D80CC4388E2C8A1361A4 Key = 00000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 796DB81AEAC67FDCC0374910FE76D805 Key = 00000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 6A2F61355100EB6C621AF1E2E96687CD Key = 00000000000000000400000000000000 In = 00000000000000000000000000000000 Out = 3A02768505F42BC4B754B13A04C077E3 Key = 00000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 10798D0ECF8D98FB29ED47E636467210 Key = 00000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 32C62E0476D8945DED7CC2047DACF38E Key = 00000000000000000080000000000000 In = 00000000000000000000000000000000 Out = 94927FC8AB70F858768B132C03A41062 Key = 00000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 41925E1B3033299CEEB212C67609ACB4 Key = 00000000000000000020000000000000 In = 00000000000000000000000000000000 Out = 52EE89DD4EDC55A0B32A6DA26E6A5CE4 Key = 00000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 21F422F94B62A66EB38D6562DD9986FC Key = 00000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 17038F806644638B83BE18BDCBB6F2F4 Key = 00000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 688FEF9E2D43B5B740B41818746A7DC1 Key = 00000000000000000002000000000000 In = 00000000000000000000000000000000 Out = F68B594E0C2DD8C3B8B83D41259B4C14 Key = 00000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 9D2411603D1D98F46F4C7D3BD476CF6E Key = 00000000000000000000800000000000 In = 00000000000000000000000000000000 Out = 74890ADD29E38622FB0FACC0E642A2DA Key = 00000000000000000000400000000000 In = 00000000000000000000000000000000 Out = B4A646FDF52DBE458B1CBEC2CD687C63 Key = 00000000000000000000200000000000 In = 00000000000000000000000000000000 Out = 439D56862344D0917E0B31844693001F Key = 00000000000000000000100000000000 In = 00000000000000000000000000000000 Out = EBAA24719643A2F05BC5F69C013B241B Key = 00000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 43122E57EFE71FF377AD7DA4CFE4D8FC Key = 00000000000000000000040000000000 In = 00000000000000000000000000000000 Out = 291692D340B73D617AA140E026152046 Key = 00000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 07AD83CE1215497E31D8783E0F2D6E85 Key = 00000000000000000000010000000000 In = 00000000000000000000000000000000 Out = F77B57131029A8F7A9B7F6BE368C160D Key = 00000000000000000000008000000000 In = 00000000000000000000000000000000 Out = B29350EB41EE007BF76F65D466491D1B Key = 00000000000000000000004000000000 In = 00000000000000000000000000000000 Out = B26C52DF4ABDD0D1950B375E15DE7BE0 Key = 00000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 998D9C8AFAA7DB5F320D3A89EA9934D9 Key = 00000000000000000000001000000000 In = 00000000000000000000000000000000 Out = 34FECBF69F3B367C59BC04B9C7E84BE5 Key = 00000000000000000000000800000000 In = 00000000000000000000000000000000 Out = A10370F222E6C14F283F5AFC11EFB520 Key = 00000000000000000000000400000000 In = 00000000000000000000000000000000 Out = DF7E02F50328B307F6B735616BFB1D7E Key = 00000000000000000000000200000000 In = 00000000000000000000000000000000 Out = EBB930108527AD375CB08691C4123922 Key = 00000000000000000000000100000000 In = 00000000000000000000000000000000 Out = 2F0F18323F16314369582473DD30F29B Key = 00000000000000000000000080000000 In = 00000000000000000000000000000000 Out = EC4D94E2820EC7562598840A8DC55511 Key = 00000000000000000000000040000000 In = 00000000000000000000000000000000 Out = 07EF3417D218C555E1A4D53DA6BE0EFE Key = 00000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 403E27ACE7B7F6E71196F4F7D6550D42 Key = 00000000000000000000000010000000 In = 00000000000000000000000000000000 Out = CCC68259754F35D63C839B8AC0092B1B Key = 00000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 6D888F9CF05FAF9BD8C58C6E12D50F58 Key = 00000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 60E847F64775E00E100EE94DCD24DFD6 Key = 00000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 72DD0E82A5915E2635CD978000D0B1A3 Key = 00000000000000000000000001000000 In = 00000000000000000000000000000000 Out = A27368DF98CCD426EFF3122361BB6DAE Key = 00000000000000000000000000800000 In = 00000000000000000000000000000000 Out = EAFD8E2FD4C61E31DF2C58F625C8156C Key = 00000000000000000000000000400000 In = 00000000000000000000000000000000 Out = A1F3D759D575C77676421973282D950C Key = 00000000000000000000000000200000 In = 00000000000000000000000000000000 Out = AA675650665B0BCAA72EE23C2C49CB2F Key = 00000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 667397CEFD34F71249F27A6C59B36DD4 Key = 00000000000000000000000000080000 In = 00000000000000000000000000000000 Out = 691CB07020B44A624DAB7E615B29B283 Key = 00000000000000000000000000040000 In = 00000000000000000000000000000000 Out = D30C3004B5BE041AE2A81695B55C0A95 Key = 00000000000000000000000000020000 In = 00000000000000000000000000000000 Out = F6C64A3A81ED22E10E7DB849E2B96535 Key = 00000000000000000000000000010000 In = 00000000000000000000000000000000 Out = F8EEFA72A712BB5D16DB8F45C4EDA386 Key = 00000000000000000000000000008000 In = 00000000000000000000000000000000 Out = 9B36FC4AC8A51256952D2C9DF65E23CE Key = 00000000000000000000000000004000 In = 00000000000000000000000000000000 Out = BDC99419AA615B094A264C64AE328E27 Key = 00000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 6D7FEEB3BEE820A401A6956E9723709C Key = 00000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 9C5BED65751F2F1BA726519E970FEEE0 Key = 00000000000000000000000000000800 In = 00000000000000000000000000000000 Out = 87920DCED6971585DDD4DD0C5E3D7194 Key = 00000000000000000000000000000400 In = 00000000000000000000000000000000 Out = FA9231124630ABB59D7BE4023769A6CA Key = 00000000000000000000000000000200 In = 00000000000000000000000000000000 Out = ACF0BD7210972819A534275B359BF504 Key = 00000000000000000000000000000100 In = 00000000000000000000000000000000 Out = EBE1055D80025E76356C419C62E13866 Key = 00000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 28E0CDFF52FEB81D991E452C970013A4 Key = 00000000000000000000000000000040 In = 00000000000000000000000000000000 Out = B31969F6E67939ED05073BD30E98E3AD Key = 00000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 76AD68F9B15DA25223491A9D849A2F3F Key = 00000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 0AC69A6B926510D3B426418A27162893 Key = 00000000000000000000000000000008 In = 00000000000000000000000000000000 Out = BDF1F7E60EB70D110E6259EDAA8858EA Key = 00000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 6CC3A4145E9160AB9EF85BF3A5E9CDD6 Key = 00000000000000000000000000000002 In = 00000000000000000000000000000000 Out = B0DD3EA904BADD0D853DC97320E5260B Key = 00000000000000000000000000000001 In = 00000000000000000000000000000000 Out = BB198C4B0DFE290CE7CC3C108D0F0007 Key = 00000000000000000000000000000000 In = 80000000000000000000000000000000 Out = A586AB4C616B77E9C6F23F4CF79A6EA4 Key = 00000000000000000000000000000000 In = 40000000000000000000000000000000 Out = 5D64A553DD47A7B542174608C8E0D8CC Key = 00000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 10B34188EFC03149C9FF573CD7A9ABC4 Key = 00000000000000000000000000000000 In = 10000000000000000000000000000000 Out = 1AC96A72A040CE6F0379D66DC5C502C3 Key = 00000000000000000000000000000000 In = 08000000000000000000000000000000 Out = 2BD1DB3468FC373DEC02ACCAA37BA530 Key = 00000000000000000000000000000000 In = 04000000000000000000000000000000 Out = DA6E9A8C4C5D98B0BB2F96EB26DC097F Key = 00000000000000000000000000000000 In = 02000000000000000000000000000000 Out = 2D48240DB2CA47CA4F2F0EF936F9C5AB Key = 00000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 009E98E448AEFAB5FF688834BB5E9FE7 Key = 00000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 1B45CE130A1A6F1DC4214C0A5CE0B9C0 Key = 00000000000000000000000000000000 In = 00400000000000000000000000000000 Out = DCBF2D355008F07D0D424058AE6AEE38 Key = 00000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 709E43B53348F4D22FBFF76B2D3BF7D3 Key = 00000000000000000000000000000000 In = 00100000000000000000000000000000 Out = CB4028BAF2E688806CAEB48D40D8800C Key = 00000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 394B0B73668D361DE90706205D3ED309 Key = 00000000000000000000000000000000 In = 00040000000000000000000000000000 Out = 83CFA51D8BCAF76B6861E46CEEA2071D Key = 00000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 6627F38B8C716998BE7D71495F3F77E5 Key = 00000000000000000000000000000000 In = 00010000000000000000000000000000 Out = A16EADC5BF215EB260D0EAA4CEC51E13 Key = 00000000000000000000000000000000 In = 00008000000000000000000000000000 Out = 38ECC81DA8B2ECC9E8F612552BB8C5E1 Key = 00000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 57DD317BDE97E3529A73C47077451D2A Key = 00000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 9A96934A48405B0B865D0BF0D302C6B8 Key = 00000000000000000000000000000000 In = 00001000000000000000000000000000 Out = AE53C5838DF3D2756AB21F8BAE9C6458 Key = 00000000000000000000000000000000 In = 00000800000000000000000000000000 Out = 46C848020ACF7364E1C4344694F21BDA Key = 00000000000000000000000000000000 In = 00000400000000000000000000000000 Out = 13ED26216506B13F9E2E7AF5B87D2F47 Key = 00000000000000000000000000000000 In = 00000200000000000000000000000000 Out = 7417E2005C131BCBC75DADA9B097E601 Key = 00000000000000000000000000000000 In = 00000100000000000000000000000000 Out = D985E85BAB0D33B2FCC2F21577F1BADE Key = 00000000000000000000000000000000 In = 00000080000000000000000000000000 Out = F0E46AA80A69404DC87E24362D1D17A3 Key = 00000000000000000000000000000000 In = 00000040000000000000000000000000 Out = 0EF8FE26469D7C304B9F1F8EE99DBE7A Key = 00000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 62EFE66337000D52743688B326DE11C1 Key = 00000000000000000000000000000000 In = 00000010000000000000000000000000 Out = DD44BEA91EA12AB1B2E22B749146C716 Key = 00000000000000000000000000000000 In = 00000008000000000000000000000000 Out = A75E9A9A4F9234EB7503EE94BA9488F8 Key = 00000000000000000000000000000000 In = 00000004000000000000000000000000 Out = ED981F6AE61D6938A10151C443C04D73 Key = 00000000000000000000000000000000 In = 00000002000000000000000000000000 Out = AE54B18AF9272BE7E722E1898D86EBDE Key = 00000000000000000000000000000000 In = 00000001000000000000000000000000 Out = B562F4D0A1F2709CA4E30592D10B49D3 Key = 00000000000000000000000000000000 In = 00000000800000000000000000000000 Out = B637DAA8C9D3B23943DC1E0EB1348930 Key = 00000000000000000000000000000000 In = 00000000400000000000000000000000 Out = 7E554B13A32FF0DC7B1B1C1C3372F1DB Key = 00000000000000000000000000000000 In = 00000000200000000000000000000000 Out = 80E7C644C263B5090243AF4712E48F50 Key = 00000000000000000000000000000000 In = 00000000100000000000000000000000 Out = A7C1AAF65041FE3F8CBADDE90C13ABFD Key = 00000000000000000000000000000000 In = 00000000080000000000000000000000 Out = F6647AD33E64F125AA58292263F0A351 Key = 00000000000000000000000000000000 In = 00000000040000000000000000000000 Out = 1D8CA97F2B28DDA45DC5C9D069CACD97 Key = 00000000000000000000000000000000 In = 00000000020000000000000000000000 Out = 9207C5C8E1AE0A88E97BC8B5A37C3390 Key = 00000000000000000000000000000000 In = 00000000010000000000000000000000 Out = 3958982C16E8447A380372ABC313C299 Key = 00000000000000000000000000000000 In = 00000000008000000000000000000000 Out = C749B21C031C0E2C1936C0FD3AB7FB6C Key = 00000000000000000000000000000000 In = 00000000004000000000000000000000 Out = C6CD1F01238813150036806EF3DF0DFA Key = 00000000000000000000000000000000 In = 00000000002000000000000000000000 Out = CDCD98034D02BF3134763DE5D69C7961 Key = 00000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 5987E04F68A05195617FEE66205354DB Key = 00000000000000000000000000000000 In = 00000000000800000000000000000000 Out = BDBB96E208454B2B54536C00F3C395F3 Key = 00000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 411D63A72A68965C50BF99EA727F45AE Key = 00000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 4238BEE926507A7D1EC803B589CC9517 Key = 00000000000000000000000000000000 In = 00000000000100000000000000000000 Out = A1F9A774E55FB322A9EFD0B1792074C1 Key = 00000000000000000000000000000000 In = 00000000000080000000000000000000 Out = 4A05F2CD8593C00C2A74975317924F72 Key = 00000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 4C9DA34AC292C3F74112E2045E5C4640 Key = 00000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 9B518CFAE01ABEBBAB3C0E3A8ECD39AF Key = 00000000000000000000000000000000 In = 00000000000010000000000000000000 Out = D72A534C8647A70922D2BA474424CFC4 Key = 00000000000000000000000000000000 In = 00000000000008000000000000000000 Out = 32F7208BFA52AA2906F6A40B55ECA8CD Key = 00000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 751E9662FC050CA4FB18E43E73FF85C8 Key = 00000000000000000000000000000000 In = 00000000000002000000000000000000 Out = 85CDCD648F729EF84B4C9CF8034A248E Key = 00000000000000000000000000000000 In = 00000000000001000000000000000000 Out = 148392DDCCF6CE44B3743AE152E21C7E Key = 00000000000000000000000000000000 In = 00000000000000800000000000000000 Out = FD81ECE8BD27C200B205C2C2B631283A Key = 00000000000000000000000000000000 In = 00000000000000400000000000000000 Out = FFF6CF13BC0FF9CD96FF3DDC463FE257 Key = 00000000000000000000000000000000 In = 00000000000000200000000000000000 Out = F01952DCC125A49E0D237CB07379BC87 Key = 00000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 52AF1F9C888CBA7E41612DA3B0D83E1E Key = 00000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 8BA3000471D72D5CDC236705E333BFD7 Key = 00000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 679F28B32317B46F6C6738C12B977C6F Key = 00000000000000000000000000000000 In = 00000000000000020000000000000000 Out = 6F1A5EDF7197107CEEF252115244B10E Key = 00000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 0959F4E08C17C6A75CD66C3BE4C7C5A4 Key = 00000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 0F13FB9078AEB846233B77B45CC86971 Key = 00000000000000000000000000000000 In = 00000000000000004000000000000000 Out = B89A2BF0EF030B63F0D37EB6B9111060 Key = 00000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 4B7B1A8176BC4654FC02D021E9DCB260 Key = 00000000000000000000000000000000 In = 00000000000000001000000000000000 Out = CABABEE26092679215C588AFFCDC7C02 Key = 00000000000000000000000000000000 In = 00000000000000000800000000000000 Out = A5525767F7C27418C9EB81513715F078 Key = 00000000000000000000000000000000 In = 00000000000000000400000000000000 Out = 57799224A0D0EFB11C54A24A39CE984D Key = 00000000000000000000000000000000 In = 00000000000000000200000000000000 Out = C7D5A3D74C62F729EF555420CA466623 Key = 00000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 4A80CBEF1C7F6DE93B9E5ED67AA3245D Key = 00000000000000000000000000000000 In = 00000000000000000080000000000000 Out = AEFBD9C60C9041A9456C8030E55D2862 Key = 00000000000000000000000000000000 In = 00000000000000000040000000000000 Out = 0CA20D6C0DEFF0652972D18351AA8006 Key = 00000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 3628801BFEB369A596FC17E821FFC04F Key = 00000000000000000000000000000000 In = 00000000000000000010000000000000 Out = 92F49817F6DAED57C6FF758DF08F8B75 Key = 00000000000000000000000000000000 In = 00000000000000000008000000000000 Out = 23C562334D36F95CDCDB1EDA904B6A4E Key = 00000000000000000000000000000000 In = 00000000000000000004000000000000 Out = C3445C8FD71A2EF1C05FF82643853922 Key = 00000000000000000000000000000000 In = 00000000000000000002000000000000 Out = 1C5EFB55CDA3ECC543943BD1ED34A5AE Key = 00000000000000000000000000000000 In = 00000000000000000001000000000000 Out = C657D07C66D21E96F7616ACBEFA9C62F Key = 00000000000000000000000000000000 In = 00000000000000000000800000000000 Out = E315B3D9779A1A1F1674D9BD7E8284FE Key = 00000000000000000000000000000000 In = 00000000000000000000400000000000 Out = F98D8B97FB5BBA157969FBF97E6A9D0B Key = 00000000000000000000000000000000 In = 00000000000000000000200000000000 Out = FE8755A9E916A449060010F65C412477 Key = 00000000000000000000000000000000 In = 00000000000000000000100000000000 Out = D7976EA763915DD16EC4FBAAAA3A7496 Key = 00000000000000000000000000000000 In = 00000000000000000000080000000000 Out = ABC35CF97B9B36998FC9B8D58F2315AB Key = 00000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 4B031BE17C3ABB5BE70F8C94798E3837 Key = 00000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 8C1DB6E69EBC0F7FD669441FC1DA8AA8 Key = 00000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 5B22314A107FE45AE1C0F25736F76B03 Key = 00000000000000000000000000000000 In = 00000000000000000000008000000000 Out = BF68959B3A9C95539C8ABBB998ED6816 Key = 00000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 887441791B4C2788C0DBCE171E65B9CF Key = 00000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 4B9802FA6073F634AC22048A5DDBE4BC Key = 00000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 1DC353B4385F24F554EB0368DC2C278F Key = 00000000000000000000000000000000 In = 00000000000000000000000800000000 Out = 6C6B20CF42A994216BD8312C544C0F13 Key = 00000000000000000000000000000000 In = 00000000000000000000000400000000 Out = 2B2037A9BBF8A4678013EF50F35E3C35 Key = 00000000000000000000000000000000 In = 00000000000000000000000200000000 Out = D66580FDB82EE7B437EEEB36B1ACCF7A Key = 00000000000000000000000000000000 In = 00000000000000000000000100000000 Out = C7105B811102A53DB0B673378D6AA7BA Key = 00000000000000000000000000000000 In = 00000000000000000000000080000000 Out = E3852180286ABA0EEB0EEBF5EBE28D64 Key = 00000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 28DEA83A79E5D8D9A5201ECB5CDD238C Key = 00000000000000000000000000000000 In = 00000000000000000000000020000000 Out = BE8F66C23B3712F2ED17D4D71CC20B81 Key = 00000000000000000000000000000000 In = 00000000000000000000000010000000 Out = 0186751B4A7A42850518CD44FC201ACA Key = 00000000000000000000000000000000 In = 00000000000000000000000008000000 Out = 12B520F313D278B54C10741826A7BEE1 Key = 00000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 96591C85EB79BAF82E238F909BDDC20F Key = 00000000000000000000000000000000 In = 00000000000000000000000002000000 Out = 9822BC88F2BD89B44FBB77E24EAF1489 Key = 00000000000000000000000000000000 In = 00000000000000000000000001000000 Out = C4322178D6150511C18EC83D77F963CD Key = 00000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 909221D51454DE4188BD9DEE5A6ED8A1 Key = 00000000000000000000000000000000 In = 00000000000000000000000000400000 Out = B24FED419FF228BAA00C1E54A1287836 Key = 00000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 3435968D6495A4E2686536AF9D40449D Key = 00000000000000000000000000000000 In = 00000000000000000000000000100000 Out = AB76044FE7255560AEAF6CDF44C64A62 Key = 00000000000000000000000000000000 In = 00000000000000000000000000080000 Out = 95FCFABAEF165DC5D49949CAF71F08BF Key = 00000000000000000000000000000000 In = 00000000000000000000000000040000 Out = F9DC53F2DC0BA0971C3B47343D730ED3 Key = 00000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 4D4ACD8269982695615B50DEFB6F73C6 Key = 00000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 6A2E99EF03C08D2E593A6AFFDB4945D7 Key = 00000000000000000000000000000000 In = 00000000000000000000000000008000 Out = B494592668F302F2473E814E2642BC72 Key = 00000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 141484888DF3E3B7369CE29F7BFA9B60 Key = 00000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 4E501744CBCEAED144F55590E8BFE6C8 Key = 00000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 0D564657672CAC2A00489CDBDB5D035D Key = 00000000000000000000000000000000 In = 00000000000000000000000000000800 Out = E07CBE3906C10E960D10F34381CBBABE Key = 00000000000000000000000000000000 In = 00000000000000000000000000000400 Out = 9C18B116915EEBCECF30005976B3FD47 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 2A477BFFEBDA3E971CBE6406D672A3B2 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000100 Out = 8958CEAF54D1377354327572CE78A34B Key = 00000000000000000000000000000000 In = 00000000000000000000000000000080 Out = 52F5DFCA03D6F564DA3164495D23EA87 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000040 Out = C38ADE2E61754978EAEC7DFB307CFF65 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000020 Out = CAE1B8A730C247AF3360ABC75C9BFBEF Key = 00000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 28EF08997E485265446FFFA0E3C7A2A7 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000008 Out = D46E99FA9AFC7775D4CF35F3E64EDF52 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000004 Out = 70F3E6373C288977DB7D0FFBAF62E5CD Key = 00000000000000000000000000000000 In = 00000000000000000000000000000002 Out = E1B31E299871C31D0B70BAA021DC8C1A Key = 00000000000000000000000000000000 In = 00000000000000000000000000000001 Out = BE2EBEC5B54702CFF14BCE9C9FF6EE1A Key = 00000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BA6933819299C71699A99F08F678178B Key = 01010101010101010101010101010101 In = 01010101010101010101010101010101 Out = 471F4980B2ABAF5A0A4826C6BDEA10BE Key = 02020202020202020202020202020202 In = 02020202020202020202020202020202 Out = 0DFB0451CAC4BA0659794E8A3918E45F Key = 03030303030303030303030303030303 In = 03030303030303030303030303030303 Out = 7F81DAFA781BCB05714721893BC18732 Key = 04040404040404040404040404040404 In = 04040404040404040404040404040404 Out = 159C350CDA5F68878FC4F45994F21D10 Key = 05050505050505050505050505050505 In = 05050505050505050505050505050505 Out = E61B3F15E561A854C9DE4573F9D7F8F6 Key = 06060606060606060606060606060606 In = 06060606060606060606060606060606 Out = 3A0A6E1C81606FF3DB483AFD95FBBE66 Key = 07070707070707070707070707070707 In = 07070707070707070707070707070707 Out = 785291AA308136DB96E0534707FD267A Key = 08080808080808080808080808080808 In = 08080808080808080808080808080808 Out = A551EA4D8C187BE3923EA42447DA383E Key = 09090909090909090909090909090909 In = 09090909090909090909090909090909 Out = 9E6D4529138342862729F34C68A81F19 Key = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A In = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A Out = 9C75F230359AA99515940947992C9797 Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Out = C41A6F6B865DDF6043C83236BB50061A Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Out = 53D872F0E6BBBE049A01674BF64656B9 Key = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D In = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D Out = 7EDBCA5F2DBB4CE846C03429B3F2BE61 Key = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E In = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E Out = 0EF5CE3D6DF03DEBA92090F135D125D0 Key = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F In = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F Out = C99300C22407A5C07C82CB542563423E Key = 10101010101010101010101010101010 In = 10101010101010101010101010101010 Out = 436903F2B1A442EA4D93E2A472B29C3F Key = 11111111111111111111111111111111 In = 11111111111111111111111111111111 Out = FE82248C99939FA60E2C9B7C92131990 Key = 12121212121212121212121212121212 In = 12121212121212121212121212121212 Out = 621BBDE6A0FBF5A797A4946273139C51 Key = 13131313131313131313131313131313 In = 13131313131313131313131313131313 Out = F2098F183AE51C682CE0568B1023B1AB Key = 14141414141414141414141414141414 In = 14141414141414141414141414141414 Out = 5A037AAB32933DBD7C03873059E86F1E Key = 15151515151515151515151515151515 In = 15151515151515151515151515151515 Out = F125F0535814F032CDAEF71AC43AFC51 Key = 16161616161616161616161616161616 In = 16161616161616161616161616161616 Out = DDF158A15EEE258AC6001FF9E1861342 Key = 17171717171717171717171717171717 In = 17171717171717171717171717171717 Out = 74EAE95E03BBBFE01F52D5D5D21C7CF2 Key = 18181818181818181818181818181818 In = 18181818181818181818181818181818 Out = 004CB3828C2FCEE70FF5D1AE70281C29 Key = 19191919191919191919191919191919 In = 19191919191919191919191919191919 Out = DD8FDCD5448464CD50394A2FEED4F64F Key = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A In = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A Out = D0C62D6E46B28D3575067EBDBC1119E1 Key = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B In = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B Out = D5D65F5E13AD3A2405005C047A3538E5 Key = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C In = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C Out = 9F28E9D8C3C95379BFEBFFBCED4045B0 Key = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D In = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D Out = 6AF51E7B6B9B030DFF6A6F316353D07A Key = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E In = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E Out = D509F65A1B08E4D0011C0D783B882FC5 Key = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F In = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F Out = 7C0A1D3C1AAD162B4234F97E19AD2CA1 Key = 20202020202020202020202020202020 In = 20202020202020202020202020202020 Out = 1A459AEA3D36ECFF33CF518F285A6808 Key = 21212121212121212121212121212121 In = 21212121212121212121212121212121 Out = 13BC28A41720A9773564EA940744E3DE Key = 22222222222222222222222222222222 In = 22222222222222222222222222222222 Out = FD182ECCA6B75B5ADA1600822ACB8193 Key = 23232323232323232323232323232323 In = 23232323232323232323232323232323 Out = 934FD612708825CC9CC30C87A200C292 Key = 24242424242424242424242424242424 In = 24242424242424242424242424242424 Out = 53D628F0D4C6D04C52FD500140BA8DC6 Key = 25252525252525252525252525252525 In = 25252525252525252525252525252525 Out = 2CCFE63C1A29511888F0719814B63A58 Key = 26262626262626262626262626262626 In = 26262626262626262626262626262626 Out = F19CD91DB261A2BBFB76589DCAC642BD Key = 27272727272727272727272727272727 In = 27272727272727272727272727272727 Out = 821598604ECBA655B1360D62564947A0 Key = 28282828282828282828282828282828 In = 28282828282828282828282828282828 Out = 24F5535577A6DE56430F8274A9B6B72D Key = 29292929292929292929292929292929 In = 29292929292929292929292929292929 Out = 6820AE1AA99F1DB2940C70869BD17879 Key = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A In = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A Out = 2B01980B2462447B59094FA54246AEC8 Key = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B In = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B Out = 80A8FB184799ACD0ABD10A7FC9A65600 Key = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C In = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C Out = 2372FB51118E0772C698B4EDAA528F87 Key = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D In = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D Out = AA11751602218B20FA6766CAD9EA699C Key = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E In = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E Out = 462C9F403A124F9DEEEBA8EAE3BE8818 Key = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F In = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F Out = 3504C3D3A99077BE353FA1F78EDC9E7A Key = 30303030303030303030303030303030 In = 30303030303030303030303030303030 Out = 7CB411D5D67B19F8F6A8815C99599B54 Key = 31313131313131313131313131313131 In = 31313131313131313131313131313131 Out = DE3189A517D1599321BA3763F6C2A6D1 Key = 32323232323232323232323232323232 In = 32323232323232323232323232323232 Out = 39CA0B720883974C7019C77ACC1DD608 Key = 33333333333333333333333333333333 In = 33333333333333333333333333333333 Out = 0ADD3F31B75C1BAF2A2906EA52E3DDCD Key = 34343434343434343434343434343434 In = 34343434343434343434343434343434 Out = 6EBB07E02C8C2F7F9B004D54E41CE5C5 Key = 35353535353535353535353535353535 In = 35353535353535353535353535353535 Out = 8DD1EBFB49445C53E2D5DCF05D5A54F5 Key = 36363636363636363636363636363636 In = 36363636363636363636363636363636 Out = CD301154F9BF3522A2EBBDDA27955854 Key = 37373737373737373737373737373737 In = 37373737373737373737373737373737 Out = 2E9332C60046962705F750DD46169055 Key = 38383838383838383838383838383838 In = 38383838383838383838383838383838 Out = 75C789BCC7CC88597B3D67299BDB39F6 Key = 39393939393939393939393939393939 In = 39393939393939393939393939393939 Out = BABB18476DD6B2042C206AD553D6813B Key = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A In = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A Out = 22C590E0B43E7742D579CBD005095BCD Key = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B In = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B Out = 5DE553095007B3FDD2F589021B50DB61 Key = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C In = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C Out = 41A534017CF588824F01B23ED57335A9 Key = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D In = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D Out = 0682105156A2CA4A574A2202E7A2C945 Key = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E In = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E Out = 99818386D7CB2873B30C4FBE38AFCBEA Key = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F In = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F Out = F1D91CBE980FA3787D24F4F28794FEE2 Key = 40404040404040404040404040404040 In = 40404040404040404040404040404040 Out = 97472A9EB715AADC332BADCF2BB5E26A Key = 41414141414141414141414141414141 In = 41414141414141414141414141414141 Out = 6B9D7DFE1D20EF645A529F070B47E1ED Key = 42424242424242424242424242424242 In = 42424242424242424242424242424242 Out = 650CF501B412594BA04B67D8F5F9F7BF Key = 43434343434343434343434343434343 In = 43434343434343434343434343434343 Out = D71DC3987D4EB97A2849A52EF8F746B9 Key = 44444444444444444444444444444444 In = 44444444444444444444444444444444 Out = F3B1AAB67BF5F84064D9AB64C0746EDB Key = 45454545454545454545454545454545 In = 45454545454545454545454545454545 Out = CF434FF23437B6B319C749FF5A733E45 Key = 46464646464646464646464646464646 In = 46464646464646464646464646464646 Out = 9091F06AEDA874398A68C3379137994F Key = 47474747474747474747474747474747 In = 47474747474747474747474747474747 Out = 6D9D652BB10461D950276777BE16BE25 Key = 48484848484848484848484848484848 In = 48484848484848484848484848484848 Out = 4847A1EF314D7E64CDB3630BF0885966 Key = 49494949494949494949494949494949 In = 49494949494949494949494949494949 Out = 3D25B8D48C2AC59AB20E51823319A939 Key = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A In = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A Out = 3DF29910CDDC0B32335EBDA989C753AE Key = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B In = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B Out = CE6CD5FEA815633FDE493CD8EAD1FA68 Key = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C In = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C Out = 2CFEC1F1BADCA431AF8F8E9C5B5E6636 Key = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D In = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D Out = 8A269F2E48304F123CB8FD665338D04B Key = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E In = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E Out = 11C2405E0C674F4848EAC33477B9FD4A Key = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F In = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F Out = 332F5B5AEB8C74A463DF9E37E9881CBF Key = 50505050505050505050505050505050 In = 50505050505050505050505050505050 Out = 568D5BF0C3C05C779116D35938EB80FD Key = 51515151515151515151515151515151 In = 51515151515151515151515151515151 Out = D96F66F02DB5B6949FD8C4F17E93B776 Key = 52525252525252525252525252525252 In = 52525252525252525252525252525252 Out = 113DCA7FE3505F4ACD9F5CD802102AD8 Key = 53535353535353535353535353535353 In = 53535353535353535353535353535353 Out = 4A8A26F64DF16A2B6A9D7FCDAA5E12D2 Key = 54545454545454545454545454545454 In = 54545454545454545454545454545454 Out = 844F5346063C404C2D6E2DB3AF5F7D23 Key = 55555555555555555555555555555555 In = 55555555555555555555555555555555 Out = 4B9C6A5F2E3E799D953BD3D612126DA5 Key = 56565656565656565656565656565656 In = 56565656565656565656565656565656 Out = 81E333DEA615ABABE4DE178B468D21F6 Key = 57575757575757575757575757575757 In = 57575757575757575757575757575757 Out = A23B4C3A73A4215B0197E5C60EA5FD57 Key = 58585858585858585858585858585858 In = 58585858585858585858585858585858 Out = C9FB0BE6EAFD9E890C41112D43FD6342 Key = 59595959595959595959595959595959 In = 59595959595959595959595959595959 Out = 9C581DED4B06C5D4C16DB75ECB1D3318 Key = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A In = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A Out = 89DA7DF10D4867455AD9D34E3E5204AF Key = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B In = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B Out = 230AB6783FB73B6C1D71478F40B2BC3B Key = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C In = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C Out = 42FDAE1618472FCDFEA4B33B09483069 Key = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D In = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D Out = 0A8875AB18388B4C5111F11ED8706DE0 Key = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E In = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E Out = CB391FE3F4B84076C4F5252918CF2F1D Key = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F In = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F Out = B82CD27C035390F130F2E40BA585D6F5 Key = 60606060606060606060606060606060 In = 60606060606060606060606060606060 Out = AD9C420C09369A6213B36A0ADB3915CA Key = 61616161616161616161616161616161 In = 61616161616161616161616161616161 Out = F6C2DBFBDA9595867296179973C26206 Key = 62626262626262626262626262626262 In = 62626262626262626262626262626262 Out = 209D64FBB1FB59A7C053354B04C0CA1C Key = 63636363636363636363636363636363 In = 63636363636363636363636363636363 Out = B22739553214A923285799E053F7C3F1 Key = 64646464646464646464646464646464 In = 64646464646464646464646464646464 Out = A7D7BF4B488859F0ACB0864543317442 Key = 65656565656565656565656565656565 In = 65656565656565656565656565656565 Out = BC7476BE8D42690C3248BBE0390CC5BA Key = 66666666666666666666666666666666 In = 66666666666666666666666666666666 Out = A2C6E591821FF040004A2EB33831220F Key = 67676767676767676767676767676767 In = 67676767676767676767676767676767 Out = 02EFF58053CF3EE9EAADAFC472685CB9 Key = 68686868686868686868686868686868 In = 68686868686868686868686868686868 Out = EAA5D7849A42692010F61D252B1C238F Key = 69696969696969696969696969696969 In = 69696969696969696969696969696969 Out = 47CFCB7D8C5E2B789C140540BDF43065 Key = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A In = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A Out = 78E7044612270CB80E76DAD3A8FE5B8C Key = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B In = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B Out = 12B3CCEFCD52D7BF251A918ED786ACB1 Key = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C In = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C Out = 3F24F16624B2BD349A10F14CFED02CCA Key = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D In = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D Out = 9F9643F848510D11EFFD2A2C65EC56D2 Key = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E In = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E Out = 62D18BEE2A4CB762F3F05AFFD3D67EFF Key = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F In = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F Out = 55DDFEF97EAE59F7AE323899C4833E57 Key = 70707070707070707070707070707070 In = 70707070707070707070707070707070 Out = D349B05013A3A4B3D0F5DF6257FC1914 Key = 71717171717171717171717171717171 In = 71717171717171717171717171717171 Out = B8952C70CC5C203C9840097B000D212C Key = 72727272727272727272727272727272 In = 72727272727272727272727272727272 Out = 0559063F68C3262E3ED50EBE50EB8587 Key = 73737373737373737373737373737373 In = 73737373737373737373737373737373 Out = 69A0A13C8B49A1C10FFC327BAA289096 Key = 74747474747474747474747474747474 In = 74747474747474747474747474747474 Out = A31D4DF411471E0D2482B3E89A3250BC Key = 75757575757575757575757575757575 In = 75757575757575757575757575757575 Out = 8B495D9B7E1C5170952D5134E9558393 Key = 76767676767676767676767676767676 In = 76767676767676767676767676767676 Out = A41B81A3E581FE799E76C453EE0CD8A9 Key = 77777777777777777777777777777777 In = 77777777777777777777777777777777 Out = FEE4C92302F398E8CB209EB14D305DDD Key = 78787878787878787878787878787878 In = 78787878787878787878787878787878 Out = C08C8202082B3153E3F2FC0889E7E67D Key = 79797979797979797979797979797979 In = 79797979797979797979797979797979 Out = FC940EC3FC102DBC8034D4E875785A3A Key = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A In = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A Out = 2607164E84E62F397451A95F7533F5A6 Key = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B In = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B Out = CD4772CA7B6A6A0C22F57E7D86B03B74 Key = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C In = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C Out = 06C402B4032B13BF91AABC7AA7E71FB8 Key = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D In = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D Out = B032D433E61B9DB203D70CA2B08F7EA2 Key = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E In = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E Out = 5665EDB52FAC523F5763D88068830210 Key = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F In = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F Out = 9F8E2AF02C9A75BE283CA4AFBB88EFE5 Key = 80808080808080808080808080808080 In = 80808080808080808080808080808080 Out = 69481F5F2A2D2F5432226548C7EC7932 Key = 81818181818181818181818181818181 In = 81818181818181818181818181818181 Out = DF38FEB1376286B8292556F96DA4DDA9 Key = 82828282828282828282828282828282 In = 82828282828282828282828282828282 Out = 2728770AC5ABA3D3FC9F4AF6B7A8DB93 Key = 83838383838383838383838383838383 In = 83838383838383838383838383838383 Out = 5C2C0D9036CC14B154C1A700D31D2EE9 Key = 84848484848484848484848484848484 In = 84848484848484848484848484848484 Out = 0FCE9A6E7A2A9918B46BA3031C32B7F4 Key = 85858585858585858585858585858585 In = 85858585858585858585858585858585 Out = A64F1AE7415269A53D8EB4D56D626424 Key = 86868686868686868686868686868686 In = 86868686868686868686868686868686 Out = D0A3E0C547EB5CB0C8B79F5096C787C4 Key = 87878787878787878787878787878787 In = 87878787878787878787878787878787 Out = B8939687868167C763B3A85D2296BF3D Key = 88888888888888888888888888888888 In = 88888888888888888888888888888888 Out = 9624980E83B98D4486AFE4E17007FF7F Key = 89898989898989898989898989898989 In = 89898989898989898989898989898989 Out = FB487F58500B844E5DB238BFDAF99FFA Key = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A In = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A Out = ECBDB7A249FA7A468AFF461C82E2960D Key = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B In = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B Out = F1A3A61BF6AC16C1B5595E30E42F04D4 Key = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C In = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C Out = 5F4348BC3F236C37A5F527C146658C0E Key = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D In = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D Out = A22646A5539544ACE9DD4D34DA821106 Key = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E In = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E Out = BCE8CA15E8E757520D0EC81BEE63E2DB Key = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F In = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F Out = 19703C00E5C770408C04F75961F56BA6 Key = 90909090909090909090909090909090 In = 90909090909090909090909090909090 Out = CF3B9A0C8B8866621F44ED3C15E9BA5A Key = 91919191919191919191919191919191 In = 91919191919191919191919191919191 Out = 26023A44320221B7B10895171B409A1D Key = 92929292929292929292929292929292 In = 92929292929292929292929292929292 Out = 3C762F8554A958E9D02B7FABB38474F8 Key = 93939393939393939393939393939393 In = 93939393939393939393939393939393 Out = 084FBE1EC0A81FA0231887D1A51FF983 Key = 94949494949494949494949494949494 In = 94949494949494949494949494949494 Out = 4C12F66F0E3EB6DE51FD06DB139BC4C2 Key = 95959595959595959595959595959595 In = 95959595959595959595959595959595 Out = 9BB6EB79716667218FABB1E15C18D519 Key = 96969696969696969696969696969696 In = 96969696969696969696969696969696 Out = 2B3F5DDE8DDB42114BEB8FFE1EF00794 Key = 97979797979797979797979797979797 In = 97979797979797979797979797979797 Out = 60D5B0FFB1B48F5FFFB04E8D2E771BD8 Key = 98989898989898989898989898989898 In = 98989898989898989898989898989898 Out = 08F8C31DB4D13BA7C5B31BBC4A8D5D57 Key = 99999999999999999999999999999999 In = 99999999999999999999999999999999 Out = 1BC192151BE1A269ABBE8D4D378F94A2 Key = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A In = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A Out = F92D5EC88E281E742947D08B09627E8F Key = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B In = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B Out = E4DFB2B049D7425F3EF83019B4D8720D Key = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C In = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C Out = 6BF46639E433A0DFF97B14E478F31085 Key = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D In = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D Out = CB1CE3EAFBBECB6890A7050557183BAD Key = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E In = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E Out = CE9BDEF9CBDED9754050E21225582EA9 Key = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F In = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F Out = BB358D55C6E27697662A535D6C4F1183 Key = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 In = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 Out = 7B2CD1E9E3C9060057CE8F791523FFCA Key = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 In = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 Out = 75AB0998C7F59C96DFD589EA965C7B7E Key = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 In = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 Out = AF543D4BF7CDDCE93857542B95BBDA06 Key = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 In = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 Out = 4327EBF0E32CABB5C1FE56307008716D Key = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 In = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 Out = 9E1EC21F0090D6B358DF6677C1EBC863 Key = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 In = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 Out = 1BD3DE229C0E8B2210AC8868E6DEF553 Key = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 In = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 Out = 6DBBCDC592DB306301DAB3D6AF57E5F9 Key = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 In = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 Out = FC5508DE27B35F57E83679370640B567 Key = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 In = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 Out = 4A3110B7587DD16CF9B388FDD92A5113 Key = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 In = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 Out = 248493B7858AF671DC3D7EB85E35233F Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA In = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Out = 7D9A5056B2957C728398B4EF5330FEED Key = ABABABABABABABABABABABABABABABAB In = ABABABABABABABABABABABABABABABAB Out = FBA96266DD88620F1BB75375387826EA Key = ACACACACACACACACACACACACACACACAC In = ACACACACACACACACACACACACACACACAC Out = 07E90DC27C8B0ADA1C2493B73680265E Key = ADADADADADADADADADADADADADADADAD In = ADADADADADADADADADADADADADADADAD Out = CB174E1CA9451BEA8C150BBDF70C5F74 Key = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE In = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE Out = A87DF202E78C757819BBE4A438623EDA Key = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF In = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF Out = 8E43247FAF5D876623479A848166C70E Key = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 In = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 Out = E96AC665DD21008F8B55AE53E0A25656 Key = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 In = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 Out = B003C25AC65F49F4991A4870B384B015 Key = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 In = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 Out = BD6701E3341498ECE03388A2903FDF02 Key = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 In = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 Out = 05311B962D6BB733465142A6DFB2604A Key = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 In = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 Out = 9D5516D83FA1DA57D34C1B87574CECEF Key = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 In = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 Out = D09319092BAEF3CF882C50C3497C91B4 Key = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 In = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 Out = 441EBA6935243392FA0329493A706D11 Key = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 In = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 Out = 5B03D81BAB4565EE4E004367A7A5B1AA Key = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 In = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 Out = D30DE2BC63B6816DCE935929E98775F1 Key = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 In = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 Out = 37F4295C66A3F2B8E40AAA26BC594B28 Key = BABABABABABABABABABABABABABABABA In = BABABABABABABABABABABABABABABABA Out = 7958658FB8B83A3130CC51F397332054 Key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB In = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Out = 81CB2E72EDC30346747FEC825FD5E016 Key = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC In = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC Out = 8E20360F0629A1C845AD5C4A54D86124 Key = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD In = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD Out = 12BEAB1F84E8F2DFD8058C4351489661 Key = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE In = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE Out = B1154E07CFF4104A216C44729FCA382D Key = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF In = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF Out = 3F86FD9C6C678B023734F3D62B81CA4B Key = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 In = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 Out = 1962FC97809B6BD2F4A939D43D66D82A Key = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 In = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 Out = C35A11DF0E4A8D7B6A7383F0BCCDA0E1 Key = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 In = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 Out = 50DC7C0EE92748B3B5B59AAE8081A093 Key = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 In = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 Out = 02CD5A1D92A1D1763FC66957D899D802 Key = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 In = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 Out = DA61260902EDC8C2BD371680BBDB311D Key = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 In = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 Out = E9D0B3EB7C22B3F39FF16AC7D14E870D Key = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 In = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 Out = F8FD33439B5ABF4B3676692DCCA4757F Key = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 In = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 Out = B85203371AEF404CD584E0B437BBBCDA Key = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 In = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 Out = 8F91A2EBA29811B1EE4269E5689C7CF4 Key = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 In = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 Out = 708C98FF3903FAC46C39BDBD293A9A01 Key = CACACACACACACACACACACACACACACACA In = CACACACACACACACACACACACACACACACA Out = 81B78A378F4C31576A7E56C90905EE4D Key = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB In = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB Out = 0D7A242EC0DD0B806E2EB48E18C1BBF4 Key = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC In = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC Out = CB58B273BFEAAF453368491F08F8E840 Key = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD Out = CF7BC44CE6EE9D783FD06BA1F1A3FCE8 Key = CECECECECECECECECECECECECECECECE In = CECECECECECECECECECECECECECECECE Out = 4E79CE9A8CE9DEF73F96B3D4064D4599 Key = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF In = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF Out = 9B4B0965424164843635A2A71F94C80E Key = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 In = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 Out = 1EA752AA15D17EB49FBC30093E55FC72 Key = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 In = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 Out = F5ADEB2C1AA1B9FF96902F7A6BE6221A Key = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 In = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 Out = C8F7434CBB80BABB9D54E1D8F866F545 Key = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 In = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 Out = 0DACC264ED3E2D174836FA5F3BB5F147 Key = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 In = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 Out = 450F5E44818D50FF911ACF1D0E41E9B5 Key = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 In = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 Out = CE9C1C323E890CF776873B160F362373 Key = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 In = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 Out = 034969E086E40F59B129F3D4F077DE57 Key = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 In = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 Out = 72DBCFE89D339AC3A38A8AD7357C5B55 Key = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 In = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 Out = 1272FB2F5B53BEC4AFD40CBC92FAFC61 Key = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 In = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 Out = 89B821B9B34F73E72E8FB1694BE1ED52 Key = DADADADADADADADADADADADADADADADA In = DADADADADADADADADADADADADADADADA Out = 403D2EE33C1C0D8E6E859D5EFAFE8A0A Key = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB In = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB Out = 51398E0F42E80393DD9648BFB91A0946 Key = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC In = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC Out = 2091AB54DED64045A7CE7BAF424CAFAA Key = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Out = 17412BD6ED157BC03BE752E9C3AE9F24 Key = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE In = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE Out = 2778440915F5212F3F6F4E27D24302F3 Key = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF In = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF Out = 19DEC7416DD6231B4C715B0A0B51BA3A Key = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 In = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 Out = BF5489DAC4F1C8BE1929F1E30FE09DF2 Key = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 In = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 Out = 9F7CCFF86D216A53BEC762E208444454 Key = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 In = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 Out = C72562734686F86AE45131E5C6DBC8F4 Key = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 In = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 Out = 767270F8C8285A52DAE1D5781C842B7E Key = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 In = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 Out = A2E8994F8E48DAC3E02BCFC9B73980AA Key = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 In = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Out = BA2C88ABE11C025A8127C7B724616782 Key = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 In = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 Out = FEC4180ED62A74B4439BCA11ECD4619A Key = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 In = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 Out = 4243E3D7944041E958DBF25331019797 Key = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 In = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 Out = 4FD9BD81FEFA8724010C39C4D19EA3E2 Key = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 In = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 Out = 0572B8B764D9915EA465F9E6F932E1B5 Key = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA In = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA Out = 2D029CDC0FC3A1E61D026FD94367763E Key = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB In = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB Out = F1D85C8412C97C1BE937F00FA3BA16A3 Key = ECECECECECECECECECECECECECECECEC In = ECECECECECECECECECECECECECECECEC Out = 4700E8BFED408006D151BFEADC5D3691 Key = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED In = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED Out = 13373BE5E37DC61F122F60164FC5E44D Key = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE In = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Out = AE1F65CA58369FC8056A8674A9522D59 Key = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF In = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF Out = CF190CD06CF1BF30D791C56514205A13 Key = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 In = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 Out = A2E1D6A5B3D144C1969F6A995672B917 Key = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 In = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 Out = 866AFB087061409FE9286DC0621B71FF Key = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 In = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 Out = 417A6F1D152C8775BCEBA17745FC0295 Key = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 In = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 Out = F797AEF1591D9BCF0D8DA0E5EF7485DD Key = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 In = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 Out = 95B9722EA15921E1B3EC152A5D186DD5 Key = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 In = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 Out = D4AD489C30CDE4F17435B050E93CF9C8 Key = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 In = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 Out = B0B01754ADE3CB235C69335E1F7CDB27 Key = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 In = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 Out = E5A6B79EF479652F43F2A4580DFB1856 Key = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 In = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 Out = BCAD2BEEE2CF62A86E8BE67D72FF34FF Key = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 In = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 Out = 3847893E0B38F07E703FA2AB31B3D27F Key = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA In = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA Out = 2380B744645E9F3D4B37EDB2B766C389 Key = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB In = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB Out = A63CDD0E8EC820D009BB848B6A88BC2D Key = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC In = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC Out = 41DFC259F0F6F9CE658365770C6DC311 Key = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD In = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD Out = 6701F71278A1080A67A9E342640A9E03 Key = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE In = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE Out = B64C11057D5770B97049A8D1918EF9FD Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 52F88A7B283C1F7BDF7B6FAA5011C7D8 Key = 000102030405060708090A0B0C0D0E0F In = 00112233445566778899AABBCCDDEEFF Out = 669D6FF7D444AE8034893C00F023C428 Key = 2BD6459F82C5B300952C49104881FF48 In = EA024714AD5C4D84EA024714AD5C4D84 Out = 57C85A0CF5F3EE0CC2CC7A055B22FD9F Key = 80000000000000000000000000000000 In = 7BBAD589FC00BC37531ADEDB1F0C4986 Out = 00000000000000000000000000000000 Key = 40000000000000000000000000000000 In = F3E21A0F7638841CE17ECD292F870F61 Out = 00000000000000000000000000000000 Key = 20000000000000000000000000000000 In = 912625B174516D81C288C2D4E80EE092 Out = 00000000000000000000000000000000 Key = 10000000000000000000000000000000 In = E755399855AE716628564F1E5488EC2F Out = 00000000000000000000000000000000 Key = 08000000000000000000000000000000 In = 37CF3B208B47E1139103226B88633D68 Out = 00000000000000000000000000000000 Key = 04000000000000000000000000000000 In = 54D8C2F36B45F21770082AA8909912F2 Out = 00000000000000000000000000000000 Key = 02000000000000000000000000000000 In = 04BD5F57D0D7F5AEA35C2F188524D7DD Out = 00000000000000000000000000000000 Key = 01000000000000000000000000000000 In = AF92B4C733CA8FB32FA0A1012829CCD0 Out = 00000000000000000000000000000000 Key = 00800000000000000000000000000000 In = ACE98F6EE0B13F22E6197F210D138ADF Out = 00000000000000000000000000000000 Key = 00400000000000000000000000000000 In = E01EF2590CB8C7A209C9F014585C47B9 Out = 00000000000000000000000000000000 Key = 00200000000000000000000000000000 In = D7ED43ADAD9641CFE6D3D764ED440C6D Out = 00000000000000000000000000000000 Key = 00100000000000000000000000000000 In = 5D497C43B21AA2D5B0C657565241DA39 Out = 00000000000000000000000000000000 Key = 00080000000000000000000000000000 In = 21DE671B2B6F1000C064FBC3DD0CEF84 Out = 00000000000000000000000000000000 Key = 00040000000000000000000000000000 In = 51D0481E119055AB39FFB388FDE06749 Out = 00000000000000000000000000000000 Key = 00020000000000000000000000000000 In = 5931B06D4CC11366ECCAF6887C69465A Out = 00000000000000000000000000000000 Key = 00010000000000000000000000000000 In = AEC8127B0CA25C3DACA76C2A813C5832 Out = 00000000000000000000000000000000 Key = 00008000000000000000000000000000 In = D074D3688B50AD6AB5CA601DBE56E1AD Out = 00000000000000000000000000000000 Key = 00004000000000000000000000000000 In = 3F329BF9C96706CEAF3C254F9B93CE25 Out = 00000000000000000000000000000000 Key = 00002000000000000000000000000000 In = E848F22136FAF8BED1156538526565EA Out = 00000000000000000000000000000000 Key = 00001000000000000000000000000000 In = E0DA65933B183F32ED209514E21EAB4E Out = 00000000000000000000000000000000 Key = 00000800000000000000000000000000 In = B5BC16777D9AA869A0DD62B94F8E4465 Out = 00000000000000000000000000000000 Key = 00000400000000000000000000000000 In = E478C0C350C1224C29333486067CF3B1 Out = 00000000000000000000000000000000 Key = 00000200000000000000000000000000 In = F5CF08FE6F588DD1EC482625DABF2525 Out = 00000000000000000000000000000000 Key = 00000100000000000000000000000000 In = 6C023E74EC0C9C86DA1950C4F7CCCA28 Out = 00000000000000000000000000000000 Key = 00000080000000000000000000000000 In = 23A0FE2CECBD775E29F70C3B9307D304 Out = 00000000000000000000000000000000 Key = 00000040000000000000000000000000 In = 7DDC6D519485C251488A13C93D955EBD Out = 00000000000000000000000000000000 Key = 00000020000000000000000000000000 In = 47B2F5AE1AEB484BDADBA513A56F3475 Out = 00000000000000000000000000000000 Key = 00000010000000000000000000000000 In = FD2145BD12206E827E8B10C2BBD55C1B Out = 00000000000000000000000000000000 Key = 00000008000000000000000000000000 In = B8033C914E61092B01757A40A880B832 Out = 00000000000000000000000000000000 Key = 00000004000000000000000000000000 In = 403C4B4A902AA966438FECECAD94DD35 Out = 00000000000000000000000000000000 Key = 00000002000000000000000000000000 In = DD57515CC0F5B9B806D1E8E12CDBD766 Out = 00000000000000000000000000000000 Key = 00000001000000000000000000000000 In = 8B47E903DAB3AE7E86EBC6E83AE57137 Out = 00000000000000000000000000000000 Key = 00000000800000000000000000000000 In = 0903A2F399E36C250ED7E069D5A968C6 Out = 00000000000000000000000000000000 Key = 00000000400000000000000000000000 In = B60945623F8DB4BA2219096F5341A5D2 Out = 00000000000000000000000000000000 Key = 00000000200000000000000000000000 In = 92C0747409BEC67485191ACE5EDE4DD6 Out = 00000000000000000000000000000000 Key = 00000000100000000000000000000000 In = BC9D2B4793BD12C2F1E7E9EAB1E67364 Out = 00000000000000000000000000000000 Key = 00000000080000000000000000000000 In = 7CF7EEC54C277D47CCC4E4914F8B8A52 Out = 00000000000000000000000000000000 Key = 00000000040000000000000000000000 In = 6CA2987F9356032F4079377C14BB83EA Out = 00000000000000000000000000000000 Key = 00000000020000000000000000000000 In = 83296253CA5FCEF1FACEFE1A3A7CC218 Out = 00000000000000000000000000000000 Key = 00000000010000000000000000000000 In = 25E372554840A9E6640D5413D5DC0FE3 Out = 00000000000000000000000000000000 Key = 00000000008000000000000000000000 In = C63C39F13F21C4245169A3C9BEBE4A9A Out = 00000000000000000000000000000000 Key = 00000000004000000000000000000000 In = B09393F999B179BC2186E01787A79F3B Out = 00000000000000000000000000000000 Key = 00000000002000000000000000000000 In = 69FD47456BEB43B963194A5C09B59DF5 Out = 00000000000000000000000000000000 Key = 00000000001000000000000000000000 In = A7FC51515DB3561E52B885018B98FA0B Out = 00000000000000000000000000000000 Key = 00000000000800000000000000000000 In = 607B5A9069AA441FC115DA54F29D6B78 Out = 00000000000000000000000000000000 Key = 00000000000400000000000000000000 In = A78FA0CBAF367C88A27E6B39433F9A43 Out = 00000000000000000000000000000000 Key = 00000000000200000000000000000000 In = 53D676AD8FCCB033366DDF5B339EF729 Out = 00000000000000000000000000000000 Key = 00000000000100000000000000000000 In = 33867FF3E148D44FA52FB7165757B110 Out = 00000000000000000000000000000000 Key = 00000000000080000000000000000000 In = 1AD4276C9AF45BCA61ABF0C0B13EAD77 Out = 00000000000000000000000000000000 Key = 00000000000040000000000000000000 In = B1973AC5FA04DC88771E159AF54CBFD9 Out = 00000000000000000000000000000000 Key = 00000000000020000000000000000000 In = 369706F9F1B7B9AE2CFEC55EEA0938B2 Out = 00000000000000000000000000000000 Key = 00000000000010000000000000000000 In = 330734332E87AD4C63A63F10D26EEA09 Out = 00000000000000000000000000000000 Key = 00000000000008000000000000000000 In = 71FB25609301F6D4E52D2EE9213A2282 Out = 00000000000000000000000000000000 Key = 00000000000004000000000000000000 In = A72689229531517E5BD583103548E341 Out = 00000000000000000000000000000000 Key = 00000000000002000000000000000000 In = 823C8DAE5FBC2314B10F08BD9693E20C Out = 00000000000000000000000000000000 Key = 00000000000001000000000000000000 In = 12F12DD563A56155D9D8E178B235F8FD Out = 00000000000000000000000000000000 Key = 00000000000000800000000000000000 In = 8167567BC7E26E2DBB99F3778B7806E4 Out = 00000000000000000000000000000000 Key = 00000000000000400000000000000000 In = 0F372AF4CCD2D343AE809049D38C5A20 Out = 00000000000000000000000000000000 Key = 00000000000000200000000000000000 In = 8AA2D1E7524893EA5588CCF5A51E1B51 Out = 00000000000000000000000000000000 Key = 00000000000000100000000000000000 In = 6FBBA9388C7EE8DCEFF1E5208AC7F048 Out = 00000000000000000000000000000000 Key = 00000000000000080000000000000000 In = 18D0B967FE2C4792BE86129C133AD0BC Out = 00000000000000000000000000000000 Key = 00000000000000040000000000000000 In = 9D59628E015EC2882C38BE5FBE052307 Out = 00000000000000000000000000000000 Key = 00000000000000020000000000000000 In = C4CFDBEB8BCE8B702737413D37A04948 Out = 00000000000000000000000000000000 Key = 00000000000000010000000000000000 In = 2FAAA6824369C31EE82265BFBCD57BB0 Out = 00000000000000000000000000000000 Key = 00000000000000008000000000000000 In = C47889D2BE5247A4CE285FDCF7465987 Out = 00000000000000000000000000000000 Key = 00000000000000004000000000000000 In = DE62234032067E7DEE8311AAF1891FBD Out = 00000000000000000000000000000000 Key = 00000000000000002000000000000000 In = 825A770B5C2D567DBA6F85C5A4D736E5 Out = 00000000000000000000000000000000 Key = 00000000000000001000000000000000 In = 9C6424BA692CEAB6C60685FC76378AEB Out = 00000000000000000000000000000000 Key = 00000000000000000800000000000000 In = 7E46C71E56E0C56377AEBBBBF00A22A0 Out = 00000000000000000000000000000000 Key = 00000000000000000400000000000000 In = C6744BA7A2D549256BD9F3E23FB9D28D Out = 00000000000000000000000000000000 Key = 00000000000000000200000000000000 In = B0496C64FC70306B8A307872F9AAF487 Out = 00000000000000000000000000000000 Key = 00000000000000000100000000000000 In = 8374DB7319D640C9FB346D8E81F124F0 Out = 00000000000000000000000000000000 Key = 00000000000000000080000000000000 In = F5CD70AAB005F1FADB3397B1BEE5D2A7 Out = 00000000000000000000000000000000 Key = 00000000000000000040000000000000 In = B5CC15640D0A560391BD8C511668D7E5 Out = 00000000000000000000000000000000 Key = 00000000000000000020000000000000 In = B48A346B16174AF1E643A12D760F3E9F Out = 00000000000000000000000000000000 Key = 00000000000000000010000000000000 In = BA831440AF70597AEACE14A0CA1A33B2 Out = 00000000000000000000000000000000 Key = 00000000000000000008000000000000 In = 2491682FE80CE8D06194580096B1A93E Out = 00000000000000000000000000000000 Key = 00000000000000000004000000000000 In = C54E42ABB7D2031A8B6CF0A1DA4FA853 Out = 00000000000000000000000000000000 Key = 00000000000000000002000000000000 In = 5D2DB00CF50CA2CE24136AEBAF74E2C0 Out = 00000000000000000000000000000000 Key = 00000000000000000001000000000000 In = FD6FC6B0716DB262C80CD28135D51B4B Out = 00000000000000000000000000000000 Key = 00000000000000000000800000000000 In = 826EBFBDDFFE03FC4F465654A4B62328 Out = 00000000000000000000000000000000 Key = 00000000000000000000400000000000 In = 9EC4394848E130D2B0C6A735F985DC66 Out = 00000000000000000000000000000000 Key = 00000000000000000000200000000000 In = 1EE786B256AF5BCE574A227F9215BBBB Out = 00000000000000000000000000000000 Key = 00000000000000000000100000000000 In = 4E9CDD57B140411A897F11BB6AE11598 Out = 00000000000000000000000000000000 Key = 00000000000000000000080000000000 In = 1C04E2FA99C7958D111574A6B6D31DF1 Out = 00000000000000000000000000000000 Key = 00000000000000000000040000000000 In = 7257B03E31E5D7DB8673B00FDF927C38 Out = 00000000000000000000000000000000 Key = 00000000000000000000020000000000 In = 7F39D431CDC85D76C4A97C1CD719C3D1 Out = 00000000000000000000000000000000 Key = 00000000000000000000010000000000 In = 1D586AB4BAF6FF33BD78AAEE9454093A Out = 00000000000000000000000000000000 Key = 00000000000000000000008000000000 In = 8CAF499D7DEB978A1C14B22D60069627 Out = 00000000000000000000000000000000 Key = 00000000000000000000004000000000 In = C723EB2B735673759DB6A1782DBE95F1 Out = 00000000000000000000000000000000 Key = 00000000000000000000002000000000 In = 45F638FEFB26C8435C15D6A336AF5F2D Out = 00000000000000000000000000000000 Key = 00000000000000000000001000000000 In = 08545DE36979887DD6D51058A7B7D6B1 Out = 00000000000000000000000000000000 Key = 00000000000000000000000800000000 In = 93B0B2B9409E667B347819911A0D3F3C Out = 00000000000000000000000000000000 Key = 00000000000000000000000400000000 In = D43AA0C32242211BC025E82018C7F91A Out = 00000000000000000000000000000000 Key = 00000000000000000000000200000000 In = 33B2431B1F57A7BB2766C9DD9FE88C27 Out = 00000000000000000000000000000000 Key = 00000000000000000000000100000000 In = 7A3DBD04B3FB1D84E69FC8786F796E15 Out = 00000000000000000000000000000000 Key = 00000000000000000000000080000000 In = ECB8D3F8600522C72BFF64365FAB55A5 Out = 00000000000000000000000000000000 Key = 00000000000000000000000040000000 In = 3575AF1921B8B5F54BFBEF4B1405EAF5 Out = 00000000000000000000000000000000 Key = 00000000000000000000000020000000 In = 1E480A362FF296037ED14B0DC56B0F34 Out = 00000000000000000000000000000000 Key = 00000000000000000000000010000000 In = F3C0D38F038B8723C805DA4C0AE69248 Out = 00000000000000000000000000000000 Key = 00000000000000000000000008000000 In = D825C71C434702A4B27A9666835000A5 Out = 00000000000000000000000000000000 Key = 00000000000000000000000004000000 In = DBBBD68ABAB3B787766B42D2DFFE3CA1 Out = 00000000000000000000000000000000 Key = 00000000000000000000000002000000 In = 11D4F50FAD45D2E55F438E209DC67391 Out = 00000000000000000000000000000000 Key = 00000000000000000000000001000000 In = 34FD79813DBCAB4F92B30E050608968B Out = 00000000000000000000000000000000 Key = 00000000000000000000000000800000 In = 944DDC0D838C10D0484BC3646E5F13C3 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000400000 In = C2DB7EE086C89B34275405198FDF64F7 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000200000 In = 5114AE78062637B069A297F323DD92A6 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000100000 In = DB712FD234A2D4ECA55960913E3E55E2 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000080000 In = 9BC6D96F86381018596FB447D10BA072 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000040000 In = 5CEC215F26661AD87F5A21FE04710A78 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000020000 In = D68F4C997A1932A6E6FCAC67AC1D5B6F Out = 00000000000000000000000000000000 Key = 00000000000000000000000000010000 In = CAB21AE63BD4D612FD985FF8D3EF8E46 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000008000 In = 73B1C25AFE8DF69CA67503C923D53409 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000004000 In = 1C944BB1CF84AB593E247CCAB0F43DC8 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000002000 In = 87DFC9707D3DD06F0156F5C88CC8E5B9 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000001000 In = 980A6D5F951F6585AFD976594F5815A9 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000800 In = 22879DCCFB89C8E25DA886814CBBA8BC Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000400 In = 7B602A3B0966E5479AEA1BB1D7F84F11 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000200 In = FDF0227862B12E4F2A65CC563797E6CB Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000100 In = 4E3754623075990A0053D88D4BF4E628 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000080 In = 9D37F5C38BAAC0BCA3B58B51FF74345F Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000040 In = 8253354D876B1406B44A6F77E616FD0F Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000020 In = CFDFD637A34C9DAC560EAB8BEF7ADEA9 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000010 In = 56951F50C6E979C3422199F2EA097343 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000008 In = 05F5DF775C7BFB0374BE6FA67F0FCF7B Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000004 In = 5655D38CEE478ED99F69C47939C89C65 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000002 In = 0B781ECAA266B2B59DCD7AF6FABA72F3 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000001 In = D5D30B5427D255BFA5731D85D6742538 Out = 00000000000000000000000000000000 Key = 00000000000000000000000000000000 In = 2C6329D312127C8304D19AD310695945 Out = 80000000000000000000000000000000 Key = 00000000000000000000000000000000 In = DC8B1C01284BEC1AEB8F381D7CA976FF Out = 40000000000000000000000000000000 Key = 00000000000000000000000000000000 In = AF8343D4FA9F7183F90F981E56F4B33A Out = 20000000000000000000000000000000 Key = 00000000000000000000000000000000 In = C7CCE6A0AC9223823D28208EF44B290A Out = 10000000000000000000000000000000 Key = 00000000000000000000000000000000 In = 802AA4C6C0C2F41AE7CE153AEB772AB8 Out = 08000000000000000000000000000000 Key = 00000000000000000000000000000000 In = 2026A1618CC828CE2ED49FB5DB03E2B1 Out = 04000000000000000000000000000000 Key = 00000000000000000000000000000000 In = 61B783C9A65D48B03E60E674D3DA88AE Out = 02000000000000000000000000000000 Key = 00000000000000000000000000000000 In = 996704D92A7E07E98906F497D83BD734 Out = 01000000000000000000000000000000 Key = 00000000000000000000000000000000 In = CB16C50885C520C24E428BE1A79A9FD7 Out = 00800000000000000000000000000000 Key = 00000000000000000000000000000000 In = 7F98ED35869D4C1BEF3FE1EBAF9065FD Out = 00400000000000000000000000000000 Key = 00000000000000000000000000000000 In = 2E3DACBE3C427E790436CCF2789D17AB Out = 00200000000000000000000000000000 Key = 00000000000000000000000000000000 In = 1348883BC136D7A2C0B71AA953CEF11F Out = 00100000000000000000000000000000 Key = 00000000000000000000000000000000 In = 0815420B8DE78F9A58210AF5D60D61BF Out = 00080000000000000000000000000000 Key = 00000000000000000000000000000000 In = 95BBE041E3F772F5AF136823C1E044F1 Out = 00040000000000000000000000000000 Key = 00000000000000000000000000000000 In = 12D62F7C1A9800A16F742D35ED26FE43 Out = 00020000000000000000000000000000 Key = 00000000000000000000000000000000 In = 296D46904CE3A151D6B92624FF66AFBB Out = 00010000000000000000000000000000 Key = 00000000000000000000000000000000 In = E6819B744EF8CF6AAA6CDABB44B3C27E Out = 00008000000000000000000000000000 Key = 00000000000000000000000000000000 In = EE7C9BEED87A7EB1BF0C9A620EAA0A14 Out = 00004000000000000000000000000000 Key = 00000000000000000000000000000000 In = DCDA678F3705DB41DA89FEEC61B2A076 Out = 00002000000000000000000000000000 Key = 00000000000000000000000000000000 In = 5CBEAF8CFEDEDFFF9F382F0C18A35AF1 Out = 00001000000000000000000000000000 Key = 00000000000000000000000000000000 In = C6280221EF614AE7763546BA3A56264C Out = 00000800000000000000000000000000 Key = 00000000000000000000000000000000 In = 0575BD2C2769A7927024D82F442E73E1 Out = 00000400000000000000000000000000 Key = 00000000000000000000000000000000 In = E277C08DEE2EA5E05FD026D8075AAFB3 Out = 00000200000000000000000000000000 Key = 00000000000000000000000000000000 In = 0C2807BE024F38B3403862082D34C818 Out = 00000100000000000000000000000000 Key = 00000000000000000000000000000000 In = 112068C791C713F414765ECF28BC1585 Out = 00000080000000000000000000000000 Key = 00000000000000000000000000000000 In = A8987E8F9A495CC396F1CE97ABC8AD03 Out = 00000040000000000000000000000000 Key = 00000000000000000000000000000000 In = C189BF4B932E3C6D4883E29EDAD333D5 Out = 00000020000000000000000000000000 Key = 00000000000000000000000000000000 In = B54CA98DAEB4DE1711ADA160EDB44EF2 Out = 00000010000000000000000000000000 Key = 00000000000000000000000000000000 In = C9063EDA00FCC27743D3926E49072E3F Out = 00000008000000000000000000000000 Key = 00000000000000000000000000000000 In = 89A5F2C324632FF2DD041DDCD7751493 Out = 00000004000000000000000000000000 Key = 00000000000000000000000000000000 In = C4E4E32976926CED0CBB43FBBC480E6F Out = 00000002000000000000000000000000 Key = 00000000000000000000000000000000 In = 5CDB1B982832705663C127DBF20B78E9 Out = 00000001000000000000000000000000 Key = 00000000000000000000000000000000 In = 9A801F26D92510A5A686FC8501887EF6 Out = 00000000800000000000000000000000 Key = 00000000000000000000000000000000 In = E10F2992B6FBB2AB83CEA034500D8815 Out = 00000000400000000000000000000000 Key = 00000000000000000000000000000000 In = 9B32D2193C2522F6FB5610B4E455B4EF Out = 00000000200000000000000000000000 Key = 00000000000000000000000000000000 In = 13D3BB1794882F94735F0FEE2409D33F Out = 00000000100000000000000000000000 Key = 00000000000000000000000000000000 In = 4052275EE07FCA26C1B528F4529ABEAF Out = 00000000080000000000000000000000 Key = 00000000000000000000000000000000 In = DD995AEC1D1634F38882D25567FE1E31 Out = 00000000040000000000000000000000 Key = 00000000000000000000000000000000 In = 7D8B1CE413ADCAD419B287C01B618125 Out = 00000000020000000000000000000000 Key = 00000000000000000000000000000000 In = 6620BED9645DDA683478ACC3893F53E5 Out = 00000000010000000000000000000000 Key = 00000000000000000000000000000000 In = 4C529470CB8E818333E772409E6EA734 Out = 00000000008000000000000000000000 Key = 00000000000000000000000000000000 In = 8545E5BD90CC8C4B08BAA6F5406B0D83 Out = 00000000004000000000000000000000 Key = 00000000000000000000000000000000 In = 2D8634F1FCDA3DA18B8CBA6E7DCB57FA Out = 00000000002000000000000000000000 Key = 00000000000000000000000000000000 In = 4FBE62D6A4A6984F487FA42F549E6AAA Out = 00000000001000000000000000000000 Key = 00000000000000000000000000000000 In = F547D1D53037E0A089153BEB4E5D18ED Out = 00000000000800000000000000000000 Key = 00000000000000000000000000000000 In = 8540A06EC7E4E44AE4452A26BC3A5EA8 Out = 00000000000400000000000000000000 Key = 00000000000000000000000000000000 In = 2465643FD8BFC4E8AC39CE491A0CE78C Out = 00000000000200000000000000000000 Key = 00000000000000000000000000000000 In = 45FF4F6B12DB290C518C5889DD9B6147 Out = 00000000000100000000000000000000 Key = 00000000000000000000000000000000 In = 5DBFAFBE7117202756320533B30A580E Out = 00000000000080000000000000000000 Key = 00000000000000000000000000000000 In = 67D9B46EAA9DD8D16EC437D235405F9D Out = 00000000000040000000000000000000 Key = 00000000000000000000000000000000 In = C5A443006AAEB1FEEACD98FC37A20F7E Out = 00000000000020000000000000000000 Key = 00000000000000000000000000000000 In = 4796683143E7389A6BD283F6932D97E8 Out = 00000000000010000000000000000000 Key = 00000000000000000000000000000000 In = BE24B66BA5CAD8CAD63CEBC645A0A72C Out = 00000000000008000000000000000000 Key = 00000000000000000000000000000000 In = F11FC29EC6B5EE93B1F9EB90D6030F49 Out = 00000000000004000000000000000000 Key = 00000000000000000000000000000000 In = 400AAC59F2AA74293CBFB460F5B5A909 Out = 00000000000002000000000000000000 Key = 00000000000000000000000000000000 In = C94A44F506B11FF529C1B3BABD73C099 Out = 00000000000001000000000000000000 Key = 00000000000000000000000000000000 In = 5DAF1E0F3C8E8F6394FBE0B2AC0DB314 Out = 00000000000000800000000000000000 Key = 00000000000000000000000000000000 In = F53836118380FE1817B0E77A12928DD9 Out = 00000000000000400000000000000000 Key = 00000000000000000000000000000000 In = 33385A253D8B0AF20B0D8CC3309657D4 Out = 00000000000000200000000000000000 Key = 00000000000000000000000000000000 In = E41B825222FBA3A9BAD2AF1CC7923595 Out = 00000000000000100000000000000000 Key = 00000000000000000000000000000000 In = BDA2D0D1DF9A9270C9B0C3EE390C1F36 Out = 00000000000000080000000000000000 Key = 00000000000000000000000000000000 In = 13AFD4E222F76E3189862E0D6DC27C93 Out = 00000000000000040000000000000000 Key = 00000000000000000000000000000000 In = A91E973EADA77B9CE79A6A36836FB414 Out = 00000000000000020000000000000000 Key = 00000000000000000000000000000000 In = 9BFD360D982BDA31224352A6890BBE8B Out = 00000000000000010000000000000000 Key = 00000000000000000000000000000000 In = F8544155CD543E1C69815B939E520D0A Out = 00000000000000008000000000000000 Key = 00000000000000000000000000000000 In = 1A4BB3C6431C51AFD90D182D4B642B94 Out = 00000000000000004000000000000000 Key = 00000000000000000000000000000000 In = 238114FD17F9A3EA3FD2A16F646B51F8 Out = 00000000000000002000000000000000 Key = 00000000000000000000000000000000 In = 45BFD86097FD62FB9D8B8A0180A49BBA Out = 00000000000000001000000000000000 Key = 00000000000000000000000000000000 In = DABAA85DE93E40AFE90BB73A1E6B812F Out = 00000000000000000800000000000000 Key = 00000000000000000000000000000000 In = 70DE45888C95714AB0A89B6BB005D093 Out = 00000000000000000400000000000000 Key = 00000000000000000000000000000000 In = E524EC4DAB2A10342A444002DD044FED Out = 00000000000000000200000000000000 Key = 00000000000000000000000000000000 In = C9233A87D0C06017CAB5D3BCAFCAC7C5 Out = 00000000000000000100000000000000 Key = 00000000000000000000000000000000 In = 38E25057EE7F222F36EDEA0DAD3F9E8E Out = 00000000000000000080000000000000 Key = 00000000000000000000000000000000 In = 2DE81FE96C2D15F5D7ECA268224506FE Out = 00000000000000000040000000000000 Key = 00000000000000000000000000000000 In = 6674527E965C6CB092D75450F5E23A54 Out = 00000000000000000020000000000000 Key = 00000000000000000000000000000000 In = 7B1B8E650AF603B24978A66816B353B5 Out = 00000000000000000010000000000000 Key = 00000000000000000000000000000000 In = C2823C77ADF8BA53B9C0DDD07D160AFA Out = 00000000000000000008000000000000 Key = 00000000000000000000000000000000 In = BAB82DAF6B0875D45467226B7E7178DD Out = 00000000000000000004000000000000 Key = 00000000000000000000000000000000 In = 91B7FC197E32071571EF1FEAE1FB7791 Out = 00000000000000000002000000000000 Key = 00000000000000000000000000000000 In = 560576CF567165FF56B5B5FC06ED4865 Out = 00000000000000000001000000000000 Key = 00000000000000000000000000000000 In = 1F75DABA9196DD4239285C35FCA609F3 Out = 00000000000000000000800000000000 Key = 00000000000000000000000000000000 In = A162BFA3BC45A72CE8A15B1D98446838 Out = 00000000000000000000400000000000 Key = 00000000000000000000000000000000 In = 72C9F43CE5D123944DA83EF2047DC188 Out = 00000000000000000000200000000000 Key = 00000000000000000000000000000000 In = 985BA35F54FCE074B9FFE1B8FF748824 Out = 00000000000000000000100000000000 Key = 00000000000000000000000000000000 In = 1F0DB0B3B5286047FFF669670792D6A1 Out = 00000000000000000000080000000000 Key = 00000000000000000000000000000000 In = 25B60FF36262C17C06AB3E6C15C5F8F5 Out = 00000000000000000000040000000000 Key = 00000000000000000000000000000000 In = 62EEE0646F3607F91749BE8EACABCBA1 Out = 00000000000000000000020000000000 Key = 00000000000000000000000000000000 In = 29BAAD1DE4597D1B5C13D74DC6D4FF4D Out = 00000000000000000000010000000000 Key = 00000000000000000000000000000000 In = 86C70804051D613E56AE30DECF1EA211 Out = 00000000000000000000008000000000 Key = 00000000000000000000000000000000 In = F8259CE24E19EEEDAAADAC35DB91F4C3 Out = 00000000000000000000004000000000 Key = 00000000000000000000000000000000 In = AFA8CA21809FA319E522315111B7525E Out = 00000000000000000000002000000000 Key = 00000000000000000000000000000000 In = 3CD9F75B9D81ABCB78E7D5BD178B04F0 Out = 00000000000000000000001000000000 Key = 00000000000000000000000000000000 In = 79B17E3D3B4A09F860FCC5377218B012 Out = 00000000000000000000000800000000 Key = 00000000000000000000000000000000 In = 1E8A198E1BF78588F96863589ED4A60E Out = 00000000000000000000000400000000 Key = 00000000000000000000000000000000 In = 2EF12A168D6389054A23C80F38FACDE2 Out = 00000000000000000000000200000000 Key = 00000000000000000000000000000000 In = E76A0A7C23D35243EACC04D0EB6FC815 Out = 00000000000000000000000100000000 Key = 00000000000000000000000000000000 In = 423A95F41A24C3BC130998936046E6E6 Out = 00000000000000000000000080000000 Key = 00000000000000000000000000000000 In = 3BACA9A7C50445D3B526FCEAE09CBA19 Out = 00000000000000000000000040000000 Key = 00000000000000000000000000000000 In = 496C1AF09C7CCED83D933806C5AC35DC Out = 00000000000000000000000020000000 Key = 00000000000000000000000000000000 In = B808F3870D43AF69E328C12D752B9C97 Out = 00000000000000000000000010000000 Key = 00000000000000000000000000000000 In = 23F51DE47752DA83CF8F260908170B72 Out = 00000000000000000000000008000000 Key = 00000000000000000000000000000000 In = 696F299599BC617273DDC1D4C096DA5C Out = 00000000000000000000000004000000 Key = 00000000000000000000000000000000 In = DBA0FF16949EC0065FB398673780A35F Out = 00000000000000000000000002000000 Key = 00000000000000000000000000000000 In = 340C8E792F282A30F3158202AA1429AE Out = 00000000000000000000000001000000 Key = 00000000000000000000000000000000 In = 0C1F500F0908A840205CE90E1E3C826E Out = 00000000000000000000000000800000 Key = 00000000000000000000000000000000 In = 814E7F28E56C28B333659BDFCE6074C9 Out = 00000000000000000000000000400000 Key = 00000000000000000000000000000000 In = 1B00231411BA42BE64F3AFC12E278FF2 Out = 00000000000000000000000000200000 Key = 00000000000000000000000000000000 In = F2E8737A70A82B9AF1A62B464C65E48F Out = 00000000000000000000000000100000 Key = 00000000000000000000000000000000 In = 9E581C172751B71D4E650C4FEB8A83B8 Out = 00000000000000000000000000080000 Key = 00000000000000000000000000000000 In = 8EBF31A9911CCC1F72F9622A321FE6E0 Out = 00000000000000000000000000040000 Key = 00000000000000000000000000000000 In = E5DB71AC13C96F8651E1540198D74AA2 Out = 00000000000000000000000000020000 Key = 00000000000000000000000000000000 In = 937E14DFC01DCF8F0B7ED8E95EC5CE00 Out = 00000000000000000000000000010000 Key = 00000000000000000000000000000000 In = 8DC85781D36D30E9E7EE67575B4FCBF9 Out = 00000000000000000000000000008000 Key = 00000000000000000000000000000000 In = B7B618E761ABD58162A642800FA47D85 Out = 00000000000000000000000000004000 Key = 00000000000000000000000000000000 In = DFEC73B0872946ACFF6DA55F649ACBF6 Out = 00000000000000000000000000002000 Key = 00000000000000000000000000000000 In = 6E9762CDF5A1FA50B2A8CA570E41F23D Out = 00000000000000000000000000001000 Key = 00000000000000000000000000000000 In = C983FABEEE94DCF29A433A7C064FC7F9 Out = 00000000000000000000000000000800 Key = 00000000000000000000000000000000 In = 31BC6140A06373BAFA6B4794259518CD Out = 00000000000000000000000000000400 Key = 00000000000000000000000000000000 In = A3AAE2F966B0438E9548B7A4E027342C Out = 00000000000000000000000000000200 Key = 00000000000000000000000000000000 In = 1187CC256F65D14A276974CC6D70342E Out = 00000000000000000000000000000100 Key = 00000000000000000000000000000000 In = EF33235C985CA5B8FC7524E4073B14D4 Out = 00000000000000000000000000000080 Key = 00000000000000000000000000000000 In = FE4C7530E20CEC55E73EAFBC9CCA4788 Out = 00000000000000000000000000000040 Key = 00000000000000000000000000000000 In = 9B1132A2239EDB29FE3B6B62939E58AF Out = 00000000000000000000000000000020 Key = 00000000000000000000000000000000 In = 043812D7F37D7F0A05DCF9F3F1275014 Out = 00000000000000000000000000000010 Key = 00000000000000000000000000000000 In = 64092B311730FBF6A3EE2FF0066023EB Out = 00000000000000000000000000000008 Key = 00000000000000000000000000000000 In = 5D6E566664D802A3B3EDD3C1A5822922 Out = 00000000000000000000000000000004 Key = 00000000000000000000000000000000 In = C93D35A579551E3C37CC5208F43A2D5C Out = 00000000000000000000000000000002 Key = 00000000000000000000000000000000 In = 62D2E25CF3E7ACC8B8F41CA250EFF1BD Out = 00000000000000000000000000000001 Key = 00000000000000000000000000000000 In = 6E0F9832EA2366E8BBC528AA93BF8BDE Out = 00000000000000000000000000000000 Key = 01010101010101010101010101010101 In = BA4974D47643F5CB400F048D5DD11F65 Out = 01010101010101010101010101010101 Key = 02020202020202020202020202020202 In = 60D96DA61330790D8737549CE4EA6BAD Out = 02020202020202020202020202020202 Key = 03030303030303030303030303030303 In = 34C3096BE7D98F14D2509D121F444FDA Out = 03030303030303030303030303030303 Key = 04040404040404040404040404040404 In = 4890E9E2169D2494174D91742D1DA1EA Out = 04040404040404040404040404040404 Key = 05050505050505050505050505050505 In = C929F12414831E0F18697D7E41B7A9B4 Out = 05050505050505050505050505050505 Key = 06060606060606060606060606060606 In = 5A643885F6EB78995B17599060CCBD14 Out = 06060606060606060606060606060606 Key = 07070707070707070707070707070707 In = 2920ABDA759375C73CBD5B58EE7D8DC9 Out = 07070707070707070707070707070707 Key = 08080808080808080808080808080808 In = D989C06B6679513907469E6553016749 Out = 08080808080808080808080808080808 Key = 09090909090909090909090909090909 In = 4A555F426C370FFCC077915FE230155B Out = 09090909090909090909090909090909 Key = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A In = 1DE687988B946700D1D63CABD218AF61 Out = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 31A1BDC16E18D7E52005F72B19B83E8C Out = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 508EB407920F7F6846F54487E5D2EA2C Out = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Key = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D In = 45111FF307A7E74CEA906B60B8BDBE29 Out = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D Key = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E In = B70EAF13F7C2808FEBB675D500DD76D6 Out = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E Key = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F In = 55A7CD7690A7172589264B9836FB8E83 Out = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F Key = 10101010101010101010101010101010 In = E47CC23836533540195652357D660845 Out = 10101010101010101010101010101010 Key = 11111111111111111111111111111111 In = FD1F2F4E88BFB1AC3996FE15BC0AF364 Out = 11111111111111111111111111111111 Key = 12121212121212121212121212121212 In = 7D5E58F2AFBB10E211810A68E81F4449 Out = 12121212121212121212121212121212 Key = 13131313131313131313131313131313 In = E261A0A8E5EBE07C0EC16C78CE139637 Out = 13131313131313131313131313131313 Key = 14141414141414141414141414141414 In = E4678188123DA03AEC3C2FFBF58BC8FC Out = 14141414141414141414141414141414 Key = 15151515151515151515151515151515 In = 2182EADEDFB736F895C0A52445411DEB Out = 15151515151515151515151515151515 Key = 16161616161616161616161616161616 In = 5771AFDA7FD5AF97BDF5A35A757308B4 Out = 16161616161616161616161616161616 Key = 17171717171717171717171717171717 In = ED91DE8EBFCF84A7B04462B24B65F607 Out = 17171717171717171717171717171717 Key = 18181818181818181818181818181818 In = F914BEEA98B3626A244AA8A726B8399F Out = 18181818181818181818181818181818 Key = 19191919191919191919191919191919 In = 72FAEEEE815D94DC001D343E7551504A Out = 19191919191919191919191919191919 Key = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A In = BC48BAC5799006B2FABB9AF4EC0E77CE Out = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A Key = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B In = 1D8CC56C8D33D18C45F9A203ACC7F9B5 Out = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B Key = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C In = 7AFE558A46FE076E356235F59F32E7CC Out = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C Key = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D In = 2C961D7F05CE67D02361416554321FB9 Out = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D Key = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E In = 6877BFAFD4DA86594B93A5A6CD9F6EBA Out = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E Key = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F In = 2988356803C688558E33CDDE40534739 Out = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F Key = 20202020202020202020202020202020 In = BCB517D77D3707501BA0B2DF1B211639 Out = 20202020202020202020202020202020 Key = 21212121212121212121212121212121 In = 1C5174952A8AFD41588B44E9EA4CA690 Out = 21212121212121212121212121212121 Key = 22222222222222222222222222222222 In = 2C385DA37626562950F4003C6D917AAE Out = 22222222222222222222222222222222 Key = 23232323232323232323232323232323 In = 9FE515994F8C83C3526BF1833059A81A Out = 23232323232323232323232323232323 Key = 24242424242424242424242424242424 In = FA107D8ABF622E28C76D8D1CD3585F63 Out = 24242424242424242424242424242424 Key = 25252525252525252525252525252525 In = 06190D204CCD6BAB62834EA7D87B5FEB Out = 25252525252525252525252525252525 Key = 26262626262626262626262626262626 In = 19CFB061BAD43D78E243298DDDA09DD7 Out = 26262626262626262626262626262626 Key = 27272727272727272727272727272727 In = 08427414DB9E55E44D7576361C521507 Out = 27272727272727272727272727272727 Key = 28282828282828282828282828282828 In = 580B96B000799AEC2330794D61F19F58 Out = 28282828282828282828282828282828 Key = 29292929292929292929292929292929 In = 2DE6D0BCDCD5DA4F11DACB9D30302DA7 Out = 29292929292929292929292929292929 Key = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A In = 1F39C90F92959A595CBEFC9AA689644C Out = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A Key = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B In = DFE1C3B3CE7E66BE9EC40169731BDAC5 Out = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B Key = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C In = 4A2A8BCFFC6EE4DCFEEC4DC36737933B Out = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C Key = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D In = AAEF219210465726159D3929155167FF Out = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D Key = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E In = 0BB487099D17C99C3362649730EF36D9 Out = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E Key = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F In = C0C147F26E9DBDBF5E1323F73E192033 Out = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F Key = 30303030303030303030303030303030 In = 0076BB52C05CFBD888C542261B459DE8 Out = 30303030303030303030303030303030 Key = 31313131313131313131313131313131 In = 74BFF730B3C2A4859E0C45D7B58AAA51 Out = 31313131313131313131313131313131 Key = 32323232323232323232323232323232 In = E8B785C458F96E467129D869110D3B25 Out = 32323232323232323232323232323232 Key = 33333333333333333333333333333333 In = 61BAE9E308821F1EBDFBD5BB837458EE Out = 33333333333333333333333333333333 Key = 34343434343434343434343434343434 In = DFFBF9A02299800A0F67363C7DB9723F Out = 34343434343434343434343434343434 Key = 35353535353535353535353535353535 In = 2253D258D238E8869B3BDF49970C1FEA Out = 35353535353535353535353535353535 Key = 36363636363636363636363636363636 In = 0534E9B3A8359316336A57B2F9850E1D Out = 36363636363636363636363636363636 Key = 37373737373737373737373737373737 In = 39042C7801430F674D6D7C063B713505 Out = 37373737373737373737373737373737 Key = 38383838383838383838383838383838 In = 0A3A9D458BC6125F0E42C4C388516D2E Out = 38383838383838383838383838383838 Key = 39393939393939393939393939393939 In = 6E09C4ACA0420A27223EF1DBBF3796FC Out = 39393939393939393939393939393939 Key = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A In = BDE13753DDC88102647FBA9020C01719 Out = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A Key = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B In = EEF8C52452566D763CA3F850EDD0847A Out = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B Key = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C In = BA54B12C110FB1B9683DD3E3A0D66098 Out = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C Key = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D In = 302B1367E61B8384C34798B79BAB078D Out = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D Key = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E In = 27BD13FFF53B5BF32861D907CA0624E9 Out = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E Key = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F In = 84233E03030FBB15CC71EBBCFFC0ABCF Out = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F Key = 40404040404040404040404040404040 In = 09ED80A3F67B774382E72FDAA70C89F3 Out = 40404040404040404040404040404040 Key = 41414141414141414141414141414141 In = B132AC6241C0C53558326A9961BE4DAF Out = 41414141414141414141414141414141 Key = 42424242424242424242424242424242 In = 036CE553C9E98FABDE51416C9C55F12D Out = 42424242424242424242424242424242 Key = 43434343434343434343434343434343 In = 89CF229D2BDB9F122564DD0627F63906 Out = 43434343434343434343434343434343 Key = 44444444444444444444444444444444 In = 634B10A0B59C9AA555C7229A08A7D516 Out = 44444444444444444444444444444444 Key = 45454545454545454545454545454545 In = 2A0DD5C83B6DDB313C8AD576D93DAD12 Out = 45454545454545454545454545454545 Key = 46464646464646464646464646464646 In = 13B316EC90F0DF8634850E1A0E0695AF Out = 46464646464646464646464646464646 Key = 47474747474747474747474747474747 In = 41CAB2C59B0FC103AAA6508F2801F3F3 Out = 47474747474747474747474747474747 Key = 48484848484848484848484848484848 In = 2F84AD7F86A911D8137E2D5DC78A565D Out = 48484848484848484848484848484848 Key = 49494949494949494949494949494949 In = 396F2961441C942B1AF8AFE2F6EB0139 Out = 49494949494949494949494949494949 Key = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A In = 5ED211AFD39BDFF5C1B5224CAE3659D5 Out = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A Key = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B In = 765B73627352A5C5CDF0B65699782868 Out = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B Key = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C In = C2D12AF01C5642849AA827F3DE8103DD Out = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C Key = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D In = 8A0A29A017ABCCDFBF8825E3C1E3A25C Out = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D Key = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E In = A319FD49AC87F3772188E37B2127C83A Out = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E Key = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F In = A24DEA90AA969216C58A4C92453C575D Out = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F Key = 50505050505050505050505050505050 In = 7971853E12CCD6F482A492D49A82A67C Out = 50505050505050505050505050505050 Key = 51515151515151515151515151515151 In = 900B1CD63077CF58E8171C6C9A0F61DA Out = 51515151515151515151515151515151 Key = 52525252525252525252525252525252 In = 0D8AB09C803ACD37CA3A27ED54D83338 Out = 52525252525252525252525252525252 Key = 53535353535353535353535353535353 In = 53CCBD7CDA89EE6FF2D2ED1DA38276E4 Out = 53535353535353535353535353535353 Key = 54545454545454545454545454545454 In = 4C61B5B8FDC2E36083718A85B89A7D05 Out = 54545454545454545454545454545454 Key = 55555555555555555555555555555555 In = 002151C290BFF12A3DE7AF228258B384 Out = 55555555555555555555555555555555 Key = 56565656565656565656565656565656 In = EA60313F4BC8360A2CBDF2011AEB9F60 Out = 56565656565656565656565656565656 Key = 57575757575757575757575757575757 In = 8E767FD95A523840A2E65E1150989EC1 Out = 57575757575757575757575757575757 Key = 58585858585858585858585858585858 In = 714946AA8647B826C82FB665A69CEAF0 Out = 58585858585858585858585858585858 Key = 59595959595959595959595959595959 In = 5A2D5C22CFFE2A60B8FF4164411312F5 Out = 59595959595959595959595959595959 Key = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A In = 51B585D01235F8A298DE426D41689062 Out = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A Key = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B In = B3FC4CF3D58C22618C762D16D7A4D1FC Out = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B Key = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C In = F3EE97517C60F65FF993DDCE3FEB6415 Out = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C Key = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D In = ED54AC63A1B78F19D8AF60DA8F15F608 Out = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D Key = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E In = F9C11EC8611C83C8927A18B73111DD3E Out = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E Key = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F In = D034A716F502FE017752CB7D47B6B4C0 Out = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F Key = 60606060606060606060606060606060 In = CAD6B40BB495ADFBE1C316C8CAA05FE8 Out = 60606060606060606060606060606060 Key = 61616161616161616161616161616161 In = 233E4582BEB3CE0F429A82F667A0AA0A Out = 61616161616161616161616161616161 Key = 62626262626262626262626262626262 In = 98D886CABAD9A56A511BBABC6A74BB36 Out = 62626262626262626262626262626262 Key = 63636363636363636363636363636363 In = 2921BD60071B306332E456EBB90E1598 Out = 63636363636363636363636363636363 Key = 64646464646464646464646464646464 In = 98437FC4F6C226B1F89649AA3414B88C Out = 64646464646464646464646464646464 Key = 65656565656565656565656565656565 In = DFDB5694810D79B8BAB9E9BE89098404 Out = 65656565656565656565656565656565 Key = 66666666666666666666666666666666 In = F933422BE99A659CAD698941EBCAC9C5 Out = 66666666666666666666666666666666 Key = 67676767676767676767676767676767 In = E37F161AD4FD78FE67BB1B07D61A66F8 Out = 67676767676767676767676767676767 Key = 68686868686868686868686868686868 In = 6E1924F2670ED7F3AEF8CF5D16FB8CD9 Out = 68686868686868686868686868686868 Key = 69696969696969696969696969696969 In = 0F6918D55928546FD608E6A4DA686004 Out = 69696969696969696969696969696969 Key = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A In = 1436ECD3559600089B02448E3C275C2D Out = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A Key = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B In = A69192DB7B12511355DEA59FEB229772 Out = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B Key = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C In = 04E05DAF64A1D400B2E357FD77FBEAC1 Out = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C Key = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D In = 8FA93A7BB672C3D82097066BCFDB7A15 Out = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D Key = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E In = 66BD9724FB595E4169276DEF961951C0 Out = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E Key = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F In = DA2ECAFF6041E7EB36616373A21A9FA3 Out = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F Key = 70707070707070707070707070707070 In = 6B78B7E331D7804089D1592BB2C23AA1 Out = 70707070707070707070707070707070 Key = 71717171717171717171717171717171 In = 5C136AEF98D067ACF448B17121522153 Out = 71717171717171717171717171717171 Key = 72727272727272727272727272727272 In = D73799F0009ED09FC0A21C2ABB374377 Out = 72727272727272727272727272727272 Key = 73737373737373737373737373737373 In = FFE91BDD1C5D99437959E974C9711177 Out = 73737373737373737373737373737373 Key = 74747474747474747474747474747474 In = 4F7094F7C313640BC4C731B3CFB3502D Out = 74747474747474747474747474747474 Key = 75757575757575757575757575757575 In = 99219C98E8A172060208851A0E202E3C Out = 75757575757575757575757575757575 Key = 76767676767676767676767676767676 In = 55117DA5FD3BA2D9DE6C6C70250B17F4 Out = 76767676767676767676767676767676 Key = 77777777777777777777777777777777 In = 8691032DA565E6D54F6C2D56E88529EF Out = 77777777777777777777777777777777 Key = 78787878787878787878787878787878 In = C41C99399C2D5C341AA637ABE2F08E47 Out = 78787878787878787878787878787878 Key = 79797979797979797979797979797979 In = 3822CE3DD9DDE77FAF23913BA2DB31DF Out = 79797979797979797979797979797979 Key = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A In = 516DDD6F5F827C2C9E6FE8DB87519F75 Out = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A Key = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B In = 3D2B6DF84973DFB978955BAA4D9AA77E Out = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B Key = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C In = 4F8E17F84CECED5D58B77018FA122E40 Out = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C Key = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D In = 6069C89EB3B6A97DF53336D24F9FD13F Out = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D Key = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E In = 0A99185EF8734BC4E17A1D65A69E3E3D Out = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E Key = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F In = DF3F915FAC8282BF579D033338250758 Out = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F Key = 80808080808080808080808080808080 In = 687FDE3B23E57ABF9F80012F10FA0062 Out = 80808080808080808080808080808080 Key = 81818181818181818181818181818181 In = 8513BA494C371E7E4087AB76A7C449E2 Out = 81818181818181818181818181818181 Key = 82828282828282828282828282828282 In = 0F5D4808CDE63FD211E5CC887238A753 Out = 82828282828282828282828282828282 Key = 83838383838383838383838383838383 In = 7C4AF3E262C149EDC95237665ECE0095 Out = 83838383838383838383838383838383 Key = 84848484848484848484848484848484 In = D78B6AD4CF6A6CECF11255DF83F503FF Out = 84848484848484848484848484848484 Key = 85858585858585858585858585858585 In = D3C38028D0BA714175DD52E5558FC5DE Out = 85858585858585858585858585858585 Key = 86868686868686868686868686868686 In = 924FA5863DA4EE8275D5064C00EF3D0D Out = 86868686868686868686868686868686 Key = 87878787878787878787878787878787 In = A0A10EDCF0A450D97FFC45065EFAC5A1 Out = 87878787878787878787878787878787 Key = 88888888888888888888888888888888 In = 58216DB590957D1BC85C337D838EDAE3 Out = 88888888888888888888888888888888 Key = 89898989898989898989898989898989 In = F807AF982FDD07CC78743F8C0B2B3079 Out = 89898989898989898989898989898989 Key = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A In = BFE132B7D7AAAE92CFD93A5965B1878B Out = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A Key = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B In = BF5351F398237780FD59C47D160BCAE8 Out = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B Key = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C In = ADD86663A550EED392FCE79AB6EAE050 Out = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C Key = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D In = DEE1E2ED10E94E5C31314E933915585C Out = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D Key = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E In = C6961265F70B17F764DF7AF41D7B4678 Out = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E Key = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F In = 3264FC2D3549D1BCC348DCBC338A22FD Out = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F Key = 90909090909090909090909090909090 In = 6FA9D6AAD023E0C63757139994A3526C Out = 90909090909090909090909090909090 Key = 91919191919191919191919191919191 In = E608947C31A517816E80E58DAB34177A Out = 91919191919191919191919191919191 Key = 92929292929292929292929292929292 In = 427E5B288B536447222C50B58EA06790 Out = 92929292929292929292929292929292 Key = 93939393939393939393939393939393 In = C53CE68329A8EB8A64CFAC5AE3675E68 Out = 93939393939393939393939393939393 Key = 94949494949494949494949494949494 In = C13BF8651ECD7197A362DCAED3AE6200 Out = 94949494949494949494949494949494 Key = 95959595959595959595959595959595 In = 143FBD71A732AB0D56EE7340BF693F8C Out = 95959595959595959595959595959595 Key = 96969696969696969696969696969696 In = 0ECB0076716B737F70A4273886F409BB Out = 96969696969696969696969696969696 Key = 97979797979797979797979797979797 In = 0CE8864A68D6D746D1AD723E820B4710 Out = 97979797979797979797979797979797 Key = 98989898989898989898989898989898 In = AF2FD9DCCED7E2D23F915FA22DCE1C2C Out = 98989898989898989898989898989898 Key = 99999999999999999999999999999999 In = 529108259B07A2B1B3906A32F0890F62 Out = 99999999999999999999999999999999 Key = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A In = 5615FF695CEC51F0BC1C95FAB8C58D98 Out = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A Key = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B In = D482DC0134925A6F5DFD129399226ACB Out = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B Key = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C In = 4876D529A816FD6416E6F01378BD7D1F Out = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C Key = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D In = 5C4C5E53BF17CA1B215FDC5D5B15E098 Out = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D Key = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E In = 33C8D53C5E041AE4C4814C4391944F0F Out = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E Key = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F In = 760FDD662B6C42908797F6D37F60FF24 Out = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F Key = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 In = 93367F066DF0A8B050CDDC7421DE7169 Out = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 Key = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 In = 5F79E57F1ADE9760B68BD72E1D6C3E1E Out = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 Key = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 In = 40D5A0CA590A7E171903716BAF965349 Out = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 Key = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 In = 7BB8C9A8B104A4ED302D39ABD2C6C9C1 Out = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 Key = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 In = 5578591561B545E47802865C4C0E8144 Out = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 Key = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 In = B5700EC5499FE7F49BB4C15310311301 Out = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 Key = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 In = 53F7154D7D6F4682A9C7A7E205DE07C6 Out = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 Key = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 In = 85D1BD9C66DAC898472153673204FA51 Out = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 Key = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 In = E03C4B05E5E8809816D159AD1DE008F3 Out = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 Key = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 In = 950ECED0AF1E405979F2D0A68F8076C7 Out = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA In = 7A46AD600D9A03B61248AC56146E5604 Out = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Key = ABABABABABABABABABABABABABABABAB In = 42B05019AD53D82F1DF4DE4846844F92 Out = ABABABABABABABABABABABABABABABAB Key = ACACACACACACACACACACACACACACACAC In = 3BFFDE987CB209652D2DF588CAD29072 Out = ACACACACACACACACACACACACACACACAC Key = ADADADADADADADADADADADADADADADAD In = CAA07A81F0E6F4DFA0CBC2A6372BFDCA Out = ADADADADADADADADADADADADADADADAD Key = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE In = 912EDA20104B6B3F5CD656C762A50E36 Out = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE Key = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF In = E4ACD9F0FC111057003912DCFA78CFF0 Out = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF Key = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 In = AEE15C6C41197F7B816303027A1CC168 Out = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 Key = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 In = 006174E0CC74E7543629D3F3D04ABFF4 Out = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 Key = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 In = 7A748527FCE6E1E0B8EC8EB8DF4B6648 Out = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 Key = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 In = 66AE4B9810131031FFB40CB1E6377D86 Out = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 Key = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 In = 14E432B5C18D8E7E46C0F1F71A5D3F1F Out = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 Key = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 In = D0FFA6059F68C800BEF8574B72EFBF10 Out = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 Key = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 In = A694C8F232EC9E693F610064AB77D5DC Out = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 Key = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 In = BE238CE6514EDFEC0698E7BB47A8A835 Out = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 Key = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 In = F41A5D81986BDA424133709E3A5F4336 Out = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 Key = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 In = 9AFB2632B2F7898231222991AACD42A8 Out = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 Key = BABABABABABABABABABABABABABABABA In = 5996F99AB8F65C6B0CFD42E6B6C713A6 Out = BABABABABABABABABABABABABABABABA Key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB In = 1E67B9FB92AE019C44C403C231CE0C8B Out = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Key = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC In = D341DFC6850B13E9E21D6599D507D874 Out = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC Key = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD In = CC2D01B261AF5AE69672FE3B7858F7C4 Out = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD Key = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE In = FE0EFE695C51EC888A36A1A1B1FAD7EB Out = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE Key = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF In = AB8246B21B61E50911541F21F791FE83 Out = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF Key = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 In = 5E02C8BC58E42C5DFD7EC2A39272DD8A Out = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 Key = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 In = 7363A9BF7DFE8A5652C7C08F608EE4E1 Out = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 Key = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 In = B184893329509721222A4779A17523C8 Out = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 Key = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 In = F0E051CA283EC5582ACDBA816364B8E4 Out = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 Key = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 In = A7AFC2374EF75B30126260D0060C0305 Out = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 Key = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 In = C30C2084280E53F4341C33564C3F757C Out = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 Key = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 In = 4DE423F7BEA48416EA64932046835B92 Out = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 Key = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 In = EA836B09CAD3527A4C908D3668AD21C1 Out = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 Key = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 In = D278A9209F5784E9E6E3426D021CD066 Out = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 Key = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 In = 5B670F0C3B5C04C1F98F5497CE690E37 Out = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 Key = CACACACACACACACACACACACACACACACA In = 2C93FEC0A940335B5B0A4A7205EFE3FA Out = CACACACACACACACACACACACACACACACA Key = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB In = 4C5F4FE60A9708852B4A268460D77CDA Out = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB Key = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC In = E4371752B0957ABF6B373ABC825C568A Out = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC Key = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD In = 27790E9393E255DF6C15E8484ECD517E Out = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD Key = CECECECECECECECECECECECECECECECE In = 639E47072C55E3070D83D4B75BDF193A Out = CECECECECECECECECECECECECECECECE Key = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF In = 50D2B1F1284A8DFE9490EFF186510EA1 Out = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF Key = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 In = A6889EDD9E02A227C014BFA7E5DE70FA Out = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 Key = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 In = 8DF0331E0E9F6BEA1E6A48FFBFB64648 Out = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 Key = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 In = DBBF761E05281AAEDE3E3E1AFC0CBAB6 Out = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 Key = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 In = FD9663E8176719A89F886EB43CE6EC18 Out = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 Key = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 In = 3F7CD39315B0B9F423F33C2CC4D031CB Out = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 Key = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 In = 45B512D89DF156FE396D2CAA51071028 Out = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 Key = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 In = E2B6369F7E6F084D654CEFA81EEE59CD Out = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 Key = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 In = 5C5D4C1191E1F22C9067D0C6F49CA6A2 Out = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 Key = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 In = 43D5EF070D05464CE798F8E4B1DCA4D1 Out = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 Key = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 In = 8D5B33916378AB7E8EDE02F4D2B3500E Out = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 Key = DADADADADADADADADADADADADADADADA In = C22A44F7D523B30C9689D0A0429BCA13 Out = DADADADADADADADADADADADADADADADA Key = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB In = 00BF40FA981A1FE51FB111CA31FB62A7 Out = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB Key = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC In = D800E260CAFEB592D505C0F253E7C31A Out = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC Key = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD In = 07E565EC1B153382C0D27CCD9084ACC0 Out = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Key = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE In = FB29AD35FAFAB526D067F66032785F2D Out = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE Key = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF In = 348A23A9CDBF968BE561C6099AA90D97 Out = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF Key = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 In = 951F70D15505D956115032229C407427 Out = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 Key = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 In = 3CFDE3020EA6F68F96683C779B3A5B4F Out = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 Key = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 In = FF6980B5CA20A09CE689BA978E1BB60E Out = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 Key = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 In = 0C4F2BFEF1CEF2D98B98E48D0F0C6BB2 Out = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 Key = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 In = C19B25C7869DD52340D383679ED5F527 Out = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 Key = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 In = E3506F55813CD60277E899A2FF7AEFFA Out = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Key = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 In = 6FC8ECF653A9113F2DE5EBF42E4E42FF Out = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 Key = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 In = E196098C0588C084D3806864F9CDF27E Out = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 Key = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 In = 1D10E657FC9047365AA7E1B3C6E4A102 Out = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 Key = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 In = FEF379C8928E550840B3BF46FB73C7CD Out = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 Key = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA In = DB527C4F08F0B9C7FD5BD432AAB95F1F Out = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA Key = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB In = 753120766D1C45926E1AD946BB647398 Out = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB Key = ECECECECECECECECECECECECECECECEC In = D0BA826ED798B5DE61E80D763B9E930D Out = ECECECECECECECECECECECECECECECEC Key = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED In = 429B88D7DD24B189F44ADB6599349F12 Out = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED Key = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE In = 05D76AFD25CE3F15F348867AE6BC04A8 Out = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Key = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF In = 4B23BB862553C0D03186759E5C77D13C Out = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF Key = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 In = 54E7B0A0E2CAE5EE69B416518C63C28D Out = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 Key = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 In = 5AE2E59FC93E7AF40F972DE8D2578B5F Out = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 Key = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 In = 0A4512C823FEE26344DA99128FC339E6 Out = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 Key = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 In = BCE1A95A3C328CE315E8C37CBDB4B0FD Out = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 Key = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 In = 8D6A46151F7E466A2C7098576D5AD99F Out = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 Key = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 In = 0614B0BFB997EA5727932B5C3C64751A Out = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 Key = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 In = FB55045D90AB0AC06ACF0D4E456D2F39 Out = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 Key = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 In = 69EEC532B42032C3DD172B1FA48F1EE5 Out = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 Key = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 In = 533F81EF6505569F5D8DDA3FFDE6DF43 Out = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 Key = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 In = F8CDDDA8830D613AB728798B3BC1F5C4 Out = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 Key = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA In = CD244C43EF2AAA3AE116F309B53D169B Out = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA Key = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB In = 873C478C9E663C120CFCE90CED5C1CE1 Out = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB Key = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC In = 3BEC31BECA84D771AAE31C9181C1DE9F Out = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC Key = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD In = 101A8C39C832B859635C6F485FB94AA1 Out = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD Key = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE In = 819ED4A3F176DD38237512DE9C7F7C11 Out = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = 2272E5C9532482523C3166670587BF35 Out = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Key = 000102030405060708090A0B0C0D0E0F In = 2B14999FDF37FFAB265B9B95753280D1 Out = 00112233445566778899AABBCCDDEEFF Key = 2BD6459F82C5B300952C49104881FF48 In = 023F84AD917B6F6C9F9592FDBAE4EB69 Out = EA024714AD5C4D84EA024714AD5C4D84 botan-2.4.0/src/tests/data/block/seed.vec000066400000000000000000000007331322470703100201750ustar00rootroot00000000000000[SEED] Key = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F Out = 5EBAC6E0054E166819AFF1CC6D346CDB Key = 000102030405060708090A0B0C0D0E0F In = 00000000000000000000000000000000 Out = C11F22F20140505084483597E4370F43 Key = 4706480851E61BE85D74BFB3FD956185 In = 83A2F8A288641FB9A4E9A5CC2F131C7D Out = EE54D13EBCAE706D226BC3142CD40D4A Key = 28DBC3BC49FFD87DCFA509B11D422BE7 In = B41E6BE2EBA84A148E2EED84593C5EC7 Out = 9B9B7BFCD1813CB95D0B3618F40F5122 botan-2.4.0/src/tests/data/block/serpent.vec000066400000000000000000004377731322470703100207570ustar00rootroot00000000000000 #test cpuid simd [Serpent] Key = 00000000000000000000000000000000 In = D29D576FCEA3A3A7ED9099F29273D78E2D62A890CEA3A3A7ED9099F29273D78ED29D576F315C5C58ED9099F29273D78E2D62A890315C5C58ED9099F29273D78ED29D576FCEA3A3A7126F660D9273D78E2D62A890CEA3A3A7126F660D9273D78ED29D576F315C5C58126F660D9273D78E2D62A890315C5C58126F660D9273D78ED29D576FCEA3A3A7ED9099F26D8C28712D62A890CEA3A3A7ED9099F26D8C2871D29D576F315C5C58ED9099F26D8C28712D62A890315C5C58ED9099F26D8C2871D29D576FCEA3A3A7126F660D6D8C28712D62A890CEA3A3A7126F660D6D8C2871D29D576F315C5C58126F660D6D8C2871 Out = B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F941BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B756C87EB62A4975356B28DCBF6A64A0BD1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = D095576FCEA3E3A7ED98D9F29073D78E2F6AA890CEA3E3A7ED98D9F29073D78ED095576F315C1C58ED98D9F29073D78E2F6AA890315C1C58ED98D9F29073D78ED095576FCEA3E3A71267260D9073D78E2F6AA890CEA3E3A71267260D9073D78ED095576F315C1C581267260D9073D78E2F6AA890315C1C581267260D9073D78E5718F3B4ED59D02DE5C40E9A826FFF30AC56479B43617B1C7C804629E36E93F520027AB27AB4CCF48F9973CC052E0A35C8DD678E5D5E8F67FAA0CB599C7886BD Out = B90EE5862DE69168F2BDD5125B45472BA3E17E2DF4EA6F41B2017E37023F202AFD2951E466110BC6F4816EBF968CDD01C36EE750C51192B0C85D5BB2584AE06286069E27F65F454C6E3F7E9097DCEFAA00FA885A8854844C970338841CA2E24DA18A399A0AA2FD20EAA740A0CB6145B53D79E39A79CC14D97147F3D172F66BB19263BE9CA3CB9661695C1CCD1041F2E8C35E27B56BAA1AF03542B3DA703BFEF722AAA7F89676ADAA2923903B2A3DB526734448F52EDB9316CAFA7F095C24B0E7 Key = 00000000000000000000000000000000 In = D29D576FCEA3A3A7ED9099F29273D78E2D62A890CEA3A3A7ED9099F29273D78ED29D576F315C5C58ED9099F29273D78E2D62A890315C5C58ED9099F29273D78ED29D576FCEA3A3A7126F660D9273D78E2D62A890CEA3A3A7126F660D9273D78ED29D576F315C5C58126F660D9273D78E2D62A890315C5C58126F660D9273D78ED29D576FCEA3A3A7ED9099F26D8C28712D62A890CEA3A3A7ED9099F26D8C2871D29D576F315C5C58ED9099F26D8C28712D62A890315C5C58ED9099F26D8C2871D29D576FCEA3A3A7126F660D6D8C28712D62A890CEA3A3A7126F660D6D8C2871D29D576F315C5C58126F660D6D8C28712D62A890315C5C58126F660D6D8C2871AA26D561F567520E8AE47528C24C18D731A2193D9A97FED6922B17AAA6372B74BE5DEBD559E303C9C92B174A5107BBFEB626D8F65EDCCDF3AEE475C8A183772241DDE7C1F1631F5FDED4F42746471BD651D238BA86176EFE39E4695AAEB73B52EA5926CADAD8018962E469BA920CB8BF1EA9062E4D9CEDD5FAD4F4C7990367A4B966E5C5D2277288C61B96A559CC84AFB6A6583C5AACFCD6212B0BD8AEF3C6A9A11DDBD175639341052B0B384678D8D9352299B71DD880E29D1B96452DB86540B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F941BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B756C87EB62A4975356B28DCBF6A64A0BD107206D48FE6DBE19D50314B90AC87B8335706F9B26007071AD8105CFAA1C1E2FF7FEAE5CEC4D11477F24E6B2009068703C0E29E2950F2AC2DACD63DEEB5C7EFA9FDB9F3B740563D5518287DC981FC9CB46D4B5A5A86FEC08FE70D18297DCF51072DDBE038DA040EBB12C509F5940A212DDEB59F02132BE4581FC23EABAA960D6341D9352E36DFD6E4EAF0F6F439BC8CE73A9AB3164FF30350F2DC08E939A104D6DF0C2C28F8E2D44468A61278BB6B4294DAE45AE0CAA032FC97CD4D8C57FB83BBA8AFCAE22070BC882D3A42B38A09E65 Out = B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F941BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B756C87EB62A4975356B28DCBF6A64A0BD107206D48FE6DBE19D50314B90AC87B8335706F9B26007071AD8105CFAA1C1E2FF7FEAE5CEC4D11477F24E6B2009068703C0E29E2950F2AC2DACD63DEEB5C7EFA9FDB9F3B740563D5518287DC981FC9CB46D4B5A5A86FEC08FE70D18297DCF51072DDBE038DA040EBB12C509F5940A212DDEB59F02132BE4581FC23EABAA960D6341D9352E36DFD6E4EAF0F6F439BC8CE73A9AB3164FF30350F2DC08E939A104D6DF0C2C28F8E2D44468A61278BB6B4294DAE45AE0CAA032FC97CD4D8C57FB83BBA8AFCAE22070BC882D3A42B38A09E6558A51ED82169DE7027CBE72452626CA3FF6BBF2FB2C574EC9D5656505B51688047AEA89DBBB5C4EBE819C5BDFDAB16033D2FE7D01071373624D99845D90E32C1708C609C4E75BE40D8DE77F8EA78C2CC98852792C22E971F29C2E125247FB43CAD1FD857DE9B8016C5971FFF86AD399ED669FEF7481FD73B9A45B1CFFE9C556DAE9A816916FB1F5822B2CEC8986F6E5B156775D0F6F432D57D351C62A24AFE63AE812270F7416D05E153E5AB703DCD3FF320F6AD3D00647C23F08699E0EE9F5EDDB3C717C2A6D3E58D38269DBA0243926D64CCD92B1101086DD3F0DDB73312A31D5F5EA0FD18AB84E242C96FFCC222F9FE12D5B15F5A3C365E9FF3248FB43B385A0F73507F49A08E68952BEE09DC7D35E7B29A44C8970624CB3A93DA4AE7E49835AE41A5BE2EE591750FF9A7D431B1EE8A69099E689A06324AA0AE431ACAE762FD3B90A8B269090A4CEEA076CF1EB7A580DEDE896BED63917384B1C5E18B7B57A7EB6B127A7A32898989E32CFF9A46BF6A62268500E53AD8A5FBC95226266BD9AAE1BA501274C49A7A7EC67D7577114B7707DAB9D066AF086C09E7DD4116CEA6EE25DA9A65EF05A31ED0BDF56D525EC8968D1D01AF7165C5AEAC76BD367A575A Key = 000000000000000000000000000000000000000000000000 In = D29D576FCEABA3A7ED9899F2927BD78E Out = 130E353E1037C22405E8FAEFB2C3C3E9 Key = 000000000000000000000000000000000000000000000000 In = AC335553D40961A3387BD2D2BFA6EDB3 Out = 167D74C63CEB050B4F14B1CE23DA39BD Key = 000000000000000000000000000000000000000000000000 In = E39AC2845BBBE8EDD743205ED7DF1DB6 Out = 167D74C6C314FAF44F14B1CEDC25C642 Key = 000000000000000000000000000000000000000000000000 In = AA7F44B5D845906C835C65AE12A044D9 Out = 167D74C63CEB050BB0EB4E31DC25C642 Key = 000000000000000000000000000000000000000000000000 In = E3E1B65693171906DB775EC7E4CAE204 Out = E9828B39C314FAF4B0EB4E31DC25C642 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = D095576FCEA3E3A7ED98D9F29073D78E Out = B90EE5862DE69168F2BDD5125B45472B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2F6AA890CEA3E3A7ED98D9F29073D78E Out = A3E17E2DF4EA6F41B2017E37023F202A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = D095576F315C1C58ED98D9F29073D78E Out = FD2951E466110BC6F4816EBF968CDD01 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2F6AA890315C1C58ED98D9F29073D78E Out = C36EE750C51192B0C85D5BB2584AE062 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = D095576FCEA3E3A71267260D9073D78E Out = 86069E27F65F454C6E3F7E9097DCEFAA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2F6AA890CEA3E3A71267260D9073D78E Out = 00FA885A8854844C970338841CA2E24D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = D095576F315C1C581267260D9073D78E Out = A18A399A0AA2FD20EAA740A0CB6145B5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2F6AA890315C1C581267260D9073D78E Out = 3D79E39A79CC14D97147F3D172F66BB1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 5718F3B4ED59D02DE5C40E9A826FFF30 Out = 9263BE9CA3CB9661695C1CCD1041F2E8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AC56479B43617B1C7C804629E36E93F5 Out = C35E27B56BAA1AF03542B3DA703BFEF7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 20027AB27AB4CCF48F9973CC052E0A35 Out = 22AAA7F89676ADAA2923903B2A3DB526 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = C8DD678E5D5E8F67FAA0CB599C7886BD Out = 734448F52EDB9316CAFA7F095C24B0E7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 93DFF0CC56BDBD950A9BAAD3DFF75B2F Out = EBD6A3487FEE478BB0EF8EC783E49C43 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7FEF68F9A691BDDD070DB91DF52798EF Out = 4560A566844F1B2F92B35D762F7A2A82 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 86A06EBDB131546D77A4B81C3BED598E Out = 37B9296307EA211F5D6E249E9753392D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 5C467E141ECCF1B65B6DD86418F35CFD Out = 409732CE286383F332C492E110F136DE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 35E9FAAFD45C1470EF2BE841B7CE9187 Out = 1BDB66804D80D832ABD97BDF145B316E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 72E77AA37ED81CB273582D24FAC4F797 Out = 19EFE53BFE7FAA6BFEFEBD4F79885F0E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 73A8FAD5559EE727CF006CEB0EC60D3D Out = 81E197EF8F5B2AD7F0312B705AFB5F27 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 81B566F5EA6961C9241486A6E526E8A1 Out = 213F181798188378DD97935F019AE7C0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0DA282CB8796A24A161FC55ACFCAEC1F Out = 72BF6ABC3AD01D3B7F5589BAC18499E1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 172482CA04A7549BAA12E55B0A2619FA Out = B40732603C7E9C2D373E12F9516E0426 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0E89B76BB98DF1ABA754504C08106755 Out = 1F38D616E20D3F0C4158517B162ED983 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 44FBD8823D9D06573CC304CCE5AEE6FD Out = A4576BC2CA8B8764B30D2DEDF461E455 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = E6C9D81608C6B4B736913749E0E06FB0 Out = 83756C36B9664E2415D54835CFAA2540 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = B03DEF269B39D69E0EB67B873CF2B80C Out = B226452F5E395B90E46E5CA8F72916DB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 144976F7A2170E86A68359F49C9BF7EF Out = 2183068E0B42CF774DFF0280857F23E2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = F86F15E91A74FCD149AC3B27229949D0 Out = A88E509487D41897D882F8A1160F3465 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 65B8EBE1995C281D80E471F6B447C050 Out = 84EED5FC045BB4817057902699B81109 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 116AE65A8B432F02F95BF339DE5F1427 Out = 4FB98E68E52EDE677698126BFA06BA6F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7EDA6705CD1ED178F051188479BFEC21 Out = 66840CCF17A78DB4748D811B436D0041 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = B3B2780D00D441B0641BF54660BC7624 Out = 6C24B364096089E615A8A657FEACF53E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AEFCBE20965D096F631D7844F69D7D8B Out = 0BB3B124E75FE222CBEFB2EB1BA84C57 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 94C8C0B27E7FA6B0C66EF69529280A10 Out = 7B0C86F6968BE22B3CF6740FA4E7683C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 866CD3970543E3224E756F301705081F Out = A0400EDBE1D6D08CA45419D39DF4E4BB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AADB86BD88CD0B572DE6225896E694DA Out = AD4B42F7356A196EB29EAF62AAAC2DE4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AD22711443BCBDF0DFB1AB96F3217F98 Out = 6B39765526E0D0F8E55606559193D760 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2C63EF91C5BA79AE9ACB9CCC9D0CBDD5 Out = 368BFC2EE7870480A53B887E0E0273D3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7952E98E82ADAE82305291AF31D82B78 Out = 481F3714C9112E522CAB717B00795542 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = E0B61686A1648FC82AC0767A30E969BF Out = CA681F90975354B326F88DA6EE6CBC4A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2AF247328D18F510A4FCB1784979209D Out = C185B82815B15FD96A75FD0309567D09 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 5D2064436576514B4C27365268C6B9BF Out = 267AAC3880B12273AF2B5976AC51C157 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 3D04280E15EB800B1ABD005ECC9A8B3F Out = EBE2628954016D7428DB4477A0641B49 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = A55B35CF84CBDB510C38F24C6BF93B90 Out = 9641A161F9D60D76EF05888FD1E2A280 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = F14320EEA11F6FC7336ADEEAB8E85B9B Out = 7F42B86B1C943E7EB89FD91B439EEC9C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 81D4388A3B919D54311B3327A4643265 Out = 70DFE1A70E74F1A2974C81F073542863 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = D1469D78D3F38BEC7EE57CEAC7F5393D Out = 5DECB5541E8FB7C65CA8DBCB9A25D6CD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0028367D36C6989C053BD51781644393 Out = 28967FC1396040FB4A989A6A19A67930 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 0DF379E3ED7A514D09CA440CD91A7A4B Out = B2405BFE9F872B5DBD87D520CAEF49EC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 2E47CF7B14D03C6D89D950DE7EAD69A4 Out = A6A1AE40FB2DBD1ACB43E9C027E877AC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = BD6F5ABA7C56CD8F7F94D9FD482FAF4B Out = 1ED91FFAF9975638253641D2826A91B1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = BA634341B5A5D226000C04A5189AB13E Out = F5644F442E6D6B52BAFB7FCF020C5E11 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 6E2AC15AFCA7504C209BFC8F9CCA2A2F Out = 73B228B2BFE0B01A24AFE361309E84DA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = CE347B81F4984EEBC8C3EC7CBC5DCC18 Out = 5ECCDE0E778C02545B16916E67CC5E15 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = DCFFF804405504B5EFE75BF9D23480DE Out = 66C04EC78FAFA8462E94A4A4F69D4D7A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 221352648EBA537DB994F93EA3527CC8 Out = 74E0DB0F5A47224A1437B7C519441C08 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = C8458FEC89AF924CF81396E641D7DDBD Out = 5C3BD04D99635363DAF7D281230FD600 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = F47E1F7EF00B42F8F5A1219C42E0CC0A Out = 6DDE19D02A217B2A5DD41A1454DC677D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 24CDF34C5EA6B37CED3B33178FD54C88 Out = 95DDDD7E4CD12EF44FA5CCAF6E093130 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AC8023453190010FADA88C6E71174FCB Out = F123615073CFC4C5DA553F7758CE0937 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 023AE5AF03FD68B6432D84C218DFE0A7 Out = 4B8D617C5728EB7AA6B2D23960F235F0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = CAA35C45DF45601E5935C92B4F5F164F Out = 7155D0E792B5279AD6057C48BC2CAA0D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = ED72D82596C24FCE85E066377C6F23C8 Out = 2343F7BD3ADC05B7F575DBFF8B490EAD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 818834EA9DD46525CED342FD8CDF03D6 Out = F0AA5253E8871BFF04BCAAA9FD2DA3FC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = AE528D030A08F5697611F769864C7863 Out = C40D67EB5D395B65F578B01F7FDD4D36 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 979BE56166651E23CD3156624B51C118 Out = 4D3FADFAEF95C81DB449741D830669FB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 23F2C6298D46CB7B66305B3272F14775 Out = B21F5D9F8CFC630C0C9184B34335C19D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 4C5E6E7EF12BFF242402CC42962DE420 Out = 0764165513CE56DE4BC8FB238CEFCF15 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 93FB53BF2128A23468870BB679B6CD46 Out = 6FEA32419061B0C70A1A098B34F6B008 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = A5EB2A49B07960CCEA5C632640A4B8D3 Out = 148ACECDF96815DE338312D7E505FBA7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 7CE5CA2B71BAD18D4722127C9B28CA20 Out = 65EAE71CF60B516EF15EB3C22958272C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 6B3BD3BE30DEE6B7987FDA806C5C3805 Out = 9C9402BE33FE1EB856AB211CB6F92C3D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = FA36C8904B20DA558430AC1743B31515 Out = 90E562EFC0D04545190DD0142AC39A05 Key = 00000000000000000000000000000080 In = 00000000000000000000000000000000 Out = DDD26B98A5FFD82C05345A9DADBFAF49 Key = 00000000000000000000000000000040 In = 00000000000000000000000000000000 Out = FA735E9BE7961050C202BD794E2E1E0C Key = 00000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 7B2D8D2348DC4CE112AEF4311BE769D7 Key = 00000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 5F35BF3061423D0BC02C07BED67602BD Key = 00000000000000000000000000000008 In = 00000000000000000000000000000000 Out = 8C9A19CEBB5709C38EA1AE1D12E291C1 Key = 00000000000000000000000000000004 In = 00000000000000000000000000000000 Out = D69C8CCF5DEC9EFA90684C7B70FCDFAF Key = 00000000000000000000000000000002 In = 00000000000000000000000000000000 Out = 39B65E77A4D26218E5ED7092AB64D07E Key = 00000000000000000000000000000001 In = 00000000000000000000000000000000 Out = F668C7091F81B2827DA77DD419B708E1 Key = 00000000000000000000000000008000 In = 00000000000000000000000000000000 Out = 7106BED662E6B6AE72FDC726C98AD746 Key = 00000000000000000000000000004000 In = 00000000000000000000000000000000 Out = 043AA312B19B6737C3CEBAF830DB6DB8 Key = 00000000000000000000000000002000 In = 00000000000000000000000000000000 Out = F95E6F00854F17DBB68CC679570D5FD5 Key = 00000000000000000000000000001000 In = 00000000000000000000000000000000 Out = D23FAE81FF497000583F2CFCE54FCE9C Key = 00000000000000000000000000000800 In = 00000000000000000000000000000000 Out = EF5C7DC4DBCE5A51F98011969693DBE8 Key = 00000000000000000000000000000400 In = 00000000000000000000000000000000 Out = 34D2F0546C260EA4002B4BCC2C12CCAB Key = 00000000000000000000000000000200 In = 00000000000000000000000000000000 Out = B3787BE95735A9581817C64D81F07E13 Key = 00000000000000000000000000000100 In = 00000000000000000000000000000000 Out = EB31DC31E4016F7FD8901C5872DCED1A Key = 00000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 43D607D9D0009C01DBFB117126BC4395 Key = 00000000000000000000000000400000 In = 00000000000000000000000000000000 Out = 463B27CF0DA63219ED2CEBDBF5C16922 Key = 00000000000000000000000000200000 In = 00000000000000000000000000000000 Out = 90DF345556AB04CB12D0799B9C5049BB Key = 00000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 05C861F7F71591C8AECF8A26EB020F4D Key = 00000000000000000000000000080000 In = 00000000000000000000000000000000 Out = 11DD97B8ADAF7F6B34EB3BBB9A438892 Key = 00000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 7171E845509F8F4F134BE53EFD8A34DC Key = 00000000000000000000000000020000 In = 00000000000000000000000000000000 Out = 864E7B400A96420A98765AF993AAD852 Key = 00000000000000000000000000010000 In = 00000000000000000000000000000000 Out = B8F75A0553AA33DC30B3F2D0027F97EA Key = 00000000000000000000000080000000 In = 00000000000000000000000000000000 Out = 573FB9B1E047670331D54E87F3BDD48D Key = 00000000000000000000000040000000 In = 00000000000000000000000000000000 Out = 03CF30E2ED5C9311F6BF9964C8A7DBB8 Key = 00000000000000000000000020000000 In = 00000000000000000000000000000000 Out = ED735C651F003ABCAFE1926472E0CC32 Key = 00000000000000000000000010000000 In = 00000000000000000000000000000000 Out = 970CDDD5BCCAE7F7BD0F7B67B6707580 Key = 00000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 6D1C5788F69DC2E1EF928D9C831F3826 Key = 00000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 8367C4564B707B6C0A4A92ECA38C6EDA Key = 00000000000000000000000002000000 In = 00000000000000000000000000000000 Out = F25D50BBA7FD6496CD70ACE570706ECC Key = 00000000000000000000000001000000 In = 00000000000000000000000000000000 Out = 0C43854DF7DD96DC3323DCC311CD418C Key = 00000000000000000000008000000000 In = 00000000000000000000000000000000 Out = 8F8827ED63EAFC702A4C7F855E6806A0 Key = 00000000000000000000004000000000 In = 00000000000000000000000000000000 Out = DD4FF8498D45936888B48EEFD24CE9F6 Key = 00000000000000000000002000000000 In = 00000000000000000000000000000000 Out = DE8BF1BCB7C106D93AA60C744240651F Key = 00000000000000000000001000000000 In = 00000000000000000000000000000000 Out = FC45CB6A1B9267A8B330FC1399BC0F34 Key = 00000000000000000000000800000000 In = 00000000000000000000000000000000 Out = 9EEC294CEBAEFC664DFA9D1C8B48B0B2 Key = 00000000000000000000000400000000 In = 00000000000000000000000000000000 Out = CAFB5B1D66E147006DB2E4CFC8405DA3 Key = 00000000000000000000000200000000 In = 00000000000000000000000000000000 Out = B9F43C559CCB8C1933FD323ED51AF997 Key = 00000000000000000000000100000000 In = 00000000000000000000000000000000 Out = D11D4485EB7AAA6CB1A8F16E24ECDE7A Key = 00000000000000000000800000000000 In = 00000000000000000000000000000000 Out = A4F7B40448470061B7873A62072CE112 Key = 00000000000000000000400000000000 In = 00000000000000000000000000000000 Out = 80DF5AD31BF557F9C75701B1395C4AD2 Key = 00000000000000000000200000000000 In = 00000000000000000000000000000000 Out = 46CE4708ABA4835764EA9C4678335954 Key = 00000000000000000000100000000000 In = 00000000000000000000000000000000 Out = 72BABC19EE59F6F76F17DDFBE2FCC33A Key = 00000000000000000000080000000000 In = 00000000000000000000000000000000 Out = E76340173FDA4B6F1E2703A732C4C482 Key = 00000000000000000000040000000000 In = 00000000000000000000000000000000 Out = 79C577AC301DE5ED03AD6D0AACB1D958 Key = 00000000000000000000020000000000 In = 00000000000000000000000000000000 Out = A2A8D78F3511B65EA03262314F0C8F8A Key = 00000000000000000000010000000000 In = 00000000000000000000000000000000 Out = 6C87E4E87CB3773520F7B3EDB51DAEAF Key = 00000000000000000080000000000000 In = 00000000000000000000000000000000 Out = 8D646E78DC20F616A859074DE82D1107 Key = 00000000000000000040000000000000 In = 00000000000000000000000000000000 Out = E98DE4AAAC62C1E4251054B42D92F4C3 Key = 00000000000000000020000000000000 In = 00000000000000000000000000000000 Out = B0FC458F4759641C6FA64FED926C8347 Key = 00000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 61F381FA99E58E9B3CEBCBADDE6559D2 Key = 00000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 2C7EAF752E2B02734A3C3506CDA4867D Key = 00000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 600F284E1AB1C8194D6FE065DBDF1BBF Key = 00000000000000000002000000000000 In = 00000000000000000000000000000000 Out = DB84C4BA65B89D0CD51BE73605084568 Key = 00000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 4C75C41A4ABC17E0ADC00228394F0037 Key = 00000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 230375EE7B65A2C948809B6DE69D1F50 Key = 00000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 94EF7F345D1FF0DB4494D9DB56ADFFED Key = 00000000000000002000000000000000 In = 00000000000000000000000000000000 Out = CE277A5063C40BA1418A30721A0DE8AF Key = 00000000000000001000000000000000 In = 00000000000000000000000000000000 Out = BF4FE13163EA85E003EF8E9D4BAF48C8 Key = 00000000000000000800000000000000 In = 00000000000000000000000000000000 Out = C8F9F9F1DB54EB0635C227CAE447055C Key = 00000000000000000400000000000000 In = 00000000000000000000000000000000 Out = 6F31A90BCEEA0BC85843086C7258EA9E Key = 00000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 334EFC7C6930BC0B839C845E1B22F8C3 Key = 00000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 1E92F9F2E576C864A24F36402F84107D Key = 00000000000000800000000000000000 In = 00000000000000000000000000000000 Out = A5B8DF0ABDBA5DA09B8D8383F06957E2 Key = 00000000000000400000000000000000 In = 00000000000000000000000000000000 Out = 344B6F348ADA08FF4E97C722463DCB08 Key = 00000000000000200000000000000000 In = 00000000000000000000000000000000 Out = AAB52A0482E0A1B84EF07213F8BCF63F Key = 00000000000000100000000000000000 In = 00000000000000000000000000000000 Out = E477DDE4A88A17339157E4198DC39801 Key = 00000000000000080000000000000000 In = 00000000000000000000000000000000 Out = 33401CDFBECCF499B3226B4C6AD8FDDF Key = 00000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 2C06278683B5759C12B147DE2B0E0BB1 Key = 00000000000000020000000000000000 In = 00000000000000000000000000000000 Out = B2B67CDC8371B5739F5E213FDD8B60EC Key = 00000000000000010000000000000000 In = 00000000000000000000000000000000 Out = 83ACED5FB21035A41B858136D4797BEE Key = 00000000000080000000000000000000 In = 00000000000000000000000000000000 Out = 1F6213DC933AEF4C582AAD041E140619 Key = 00000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 32B7E10E04100FCDA94DC223BBC19075 Key = 00000000000020000000000000000000 In = 00000000000000000000000000000000 Out = 72FA9C8731E45CF575CFFEBD6F3981C5 Key = 00000000000010000000000000000000 In = 00000000000000000000000000000000 Out = AEE9355B2FBD96A06F8F74DC8882E893 Key = 00000000000008000000000000000000 In = 00000000000000000000000000000000 Out = B56126C52D0DD2B8FDC5C4A05091F2B1 Key = 00000000000004000000000000000000 In = 00000000000000000000000000000000 Out = 6FF5B6F133BEB75DDDD0385F9B3AEEE5 Key = 00000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 6541C5BCE4B3F93F4EC1E7DFED0F98DB Key = 00000000000001000000000000000000 In = 00000000000000000000000000000000 Out = BF9ED60D8A243F1E010345537A5C081D Key = 00000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 77679D9E63DB7DF79C0484423FA18A57 Key = 00000000004000000000000000000000 In = 00000000000000000000000000000000 Out = 548091B07326BF829BA56C786053727F Key = 00000000002000000000000000000000 In = 00000000000000000000000000000000 Out = A8FA704EE06EEED6F7F71A598EF921FB Key = 00000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 627F14CA091AC156FB56302D6C3373DC Key = 00000000000800000000000000000000 In = 00000000000000000000000000000000 Out = BC2CAB97EB09919CBC0E6AFEC6581CF5 Key = 00000000000400000000000000000000 In = 00000000000000000000000000000000 Out = CC7F5DF0CF522B2242163112E4421D08 Key = 00000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 084AC3BF07F1E64F0093A014C2690CE5 Key = 00000000000100000000000000000000 In = 00000000000000000000000000000000 Out = D3C6597474B740BA1053090A247AB5C5 Key = 00000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 7435911B23F1DBACA5BF86C91B0D11B1 Key = 00000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 79E59CE5B78A6D8259B2AD1B5F50F523 Key = 00000000200000000000000000000000 In = 00000000000000000000000000000000 Out = 72F3659183D9749128AE6CAFBEAADDE5 Key = 00000000100000000000000000000000 In = 00000000000000000000000000000000 Out = 77DD6EA2D669A36E4C409564A8604EC4 Key = 00000000080000000000000000000000 In = 00000000000000000000000000000000 Out = 27D4EC7E2AE30CBE54B7CE9F764E3D27 Key = 00000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 0D68C4922498D08BFEFA450B85659D23 Key = 00000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 6C4FCEEFF2768549EA590FC20310B95D Key = 00000000010000000000000000000000 In = 00000000000000000000000000000000 Out = FC46909BE47E944F4776956A98E9C43B Key = 00000080000000000000000000000000 In = 00000000000000000000000000000000 Out = 50AA945A945A8BE43E4C137F0D7CA62A Key = 00000040000000000000000000000000 In = 00000000000000000000000000000000 Out = 7511818C4C8408EB0AF22019DDF7F6F6 Key = 00000020000000000000000000000000 In = 00000000000000000000000000000000 Out = D46BA09B00007974C24FC8C0CB13330D Key = 00000010000000000000000000000000 In = 00000000000000000000000000000000 Out = 17E352C6C963F7DA5A1CB163ACCB8573 Key = 00000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 6CED1C994D0F7B2862715D514840A780 Key = 00000004000000000000000000000000 In = 00000000000000000000000000000000 Out = AD351E157AFC89A9C0D8CF15DDBF3A7D Key = 00000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 79AFB080BADC325DA8C5E88200743603 Key = 00000001000000000000000000000000 In = 00000000000000000000000000000000 Out = D326FEA25FE2CA220CEC62DB9574AAFD Key = 00008000000000000000000000000000 In = 00000000000000000000000000000000 Out = A3C980B5DA0B8E3B32818AF08F5310DA Key = 00004000000000000000000000000000 In = 00000000000000000000000000000000 Out = 12651FD76182C532CD03B36DD121A43A Key = 00002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6D91A4600722340B8ECAE1055B8DF790 Key = 00001000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2B1F49C97807430719A958271B5DA303 Key = 00000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 9E29DADC12AA1ED228CDC78D70C829B7 Key = 00000400000000000000000000000000 In = 00000000000000000000000000000000 Out = 5B8FF678F88EB96FE73BCBF14AD9304B Key = 00000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 158B5F6CBB33E547735E45559CEF3E5B Key = 00000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 8EFA3AC040AC5235F2F4AC3A82B7018E Key = 00800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97BACE474E820FDEEB1E66D06139D2F9 Key = 00400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 114CB849EC2735AEECDB2E51A1C45A38 Key = 00200000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1426ABD1FE61695A62B7A55AB5DA6145 Key = 00100000000000000000000000000000 In = 00000000000000000000000000000000 Out = 80C615975140248186BE3CD6FD8D7740 Key = 00080000000000000000000000000000 In = 00000000000000000000000000000000 Out = CFBD333352A34ED7F73D3E569D78C693 Key = 00040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5F04350AB2EFB6075F381EE1DBB8477F Key = 00020000000000000000000000000000 In = 00000000000000000000000000000000 Out = CF5CE38D2033AD6E6891ED24DB39EA66 Key = 00010000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3E63AF44877F258840B165CC3D47424C Key = 80000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 264E5481EFF42A4606ABDA06C0BFDA3D Key = 40000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4A231B3BC727993407AC6EC8350E8524 Key = 20000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E03269F9E9FD853C7D8156DF14B98D56 Key = 10000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A798181C3081AC59D5BA89754DACC48F Key = 08000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 34B355520DF861F3F5C66A2379FBDA15 Key = 04000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5E86BB8F6B1175510C6B244281A0B04A Key = 02000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B9213190C7A9C5F13764D29B6DE843A1 Key = 01000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4ECA55033294D1FF6F0204B2456046C8 Key = 000000000000000000000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 660CF6A3F77836AC685519C702548EE7 Key = 000000000000000000000000000000000000000000000040 In = 00000000000000000000000000000000 Out = 9EA538A95E21B6738B0F4BDD0D5A6423 Key = 000000000000000000000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 19D13A0AC90F83E5B3CA943C6462D295 Key = 000000000000000000000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 1B9DD629B9E11BCD27C4148887AE662A Key = 000000000000000000000000000000000000000000000008 In = 00000000000000000000000000000000 Out = 14EF2BA201698B1185B4F45D3C4BF7C1 Key = 000000000000000000000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 8AF1A83901D7DD153FF8D271B210E3AB Key = 000000000000000000000000000000000000000000000002 In = 00000000000000000000000000000000 Out = 4209B9F47FE46DA7095E093698227280 Key = 000000000000000000000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 5D058517AC7CC5AFD5C33253D4703B46 Key = 000000000000000000000000000000000000000000008000 In = 00000000000000000000000000000000 Out = 40520018C4AC2BBA285AEEB9BCB58755 Key = 000000000000000000000000000000000000000000004000 In = 00000000000000000000000000000000 Out = FB12E82326B5B32A88C73962E6B15A73 Key = 000000000000000000000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 10514AB50FB935D4DF8D36697E9A892C Key = 000000000000000000000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 23BA3FE846E2AE8CD99FC3FE58228A05 Key = 000000000000000000000000000000000000000000000800 In = 00000000000000000000000000000000 Out = 68E7992B17261F9F50693B291B40DE29 Key = 000000000000000000000000000000000000000000000400 In = 00000000000000000000000000000000 Out = 16F61AE21DEF7E6FF252F7A7C0A1FD33 Key = 000000000000000000000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 79386D808CC081C0888E83C047411490 Key = 000000000000000000000000000000000000000000000100 In = 00000000000000000000000000000000 Out = 81421CDE68390C877C025D60D7578959 Key = 000000000000000000000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 8BE4D123F250436A35AC1506BF462E25 Key = 000000000000000000000000000000000000000000400000 In = 00000000000000000000000000000000 Out = FD007EFCBF67C125F8532A7FD54724CC Key = 000000000000000000000000000000000000000000200000 In = 00000000000000000000000000000000 Out = D6661DE82FD241500194134F40C30071 Key = 000000000000000000000000000000000000000000100000 In = 00000000000000000000000000000000 Out = B03A391CCAAE863B0ED315B0CC4FF99D Key = 000000000000000000000000000000000000000000080000 In = 00000000000000000000000000000000 Out = B5142CABF118C8BA5DA8A201E7E04448 Key = 000000000000000000000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 2B078B616E4802ECC0104510E3E7E44C Key = 000000000000000000000000000000000000000000020000 In = 00000000000000000000000000000000 Out = CE8A95407154E3B8DA3979FDA451F288 Key = 000000000000000000000000000000000000000000010000 In = 00000000000000000000000000000000 Out = EF5D9D75A6A31712BAD7D332FCEF52D7 Key = 000000000000000000000000000000000000000080000000 In = 00000000000000000000000000000000 Out = CE6430157E4EAEA967B972C35C78036C Key = 000000000000000000000000000000000000000040000000 In = 00000000000000000000000000000000 Out = 7117137E956133BF65BCDA326A8156F3 Key = 000000000000000000000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 7D0D165BDB56D794FAC1B1C5020270B1 Key = 000000000000000000000000000000000000000010000000 In = 00000000000000000000000000000000 Out = 2AE14DC8A1CD98E1BD20D4E01E32DDD2 Key = 000000000000000000000000000000000000000008000000 In = 00000000000000000000000000000000 Out = AE266BE3BF863707C6AECE963D16530E Key = 000000000000000000000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 3A2612AF977665D4E8D05E3EA9947E60 Key = 000000000000000000000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 95491F2AD7B48986522E3B1EA14DE24F Key = 000000000000000000000000000000000000000001000000 In = 00000000000000000000000000000000 Out = 8A1E5D419E900C9FD046BA1F74C49DC8 Key = 000000000000000000000000000000000000008000000000 In = 00000000000000000000000000000000 Out = E407985AF526A75AB42DB52D64987992 Key = 000000000000000000000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 6C6EAD1E4101F16AD0FC4DE34DA19D8A Key = 000000000000000000000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 84E74236D365A90B6417221C0E5ED058 Key = 000000000000000000000000000000000000001000000000 In = 00000000000000000000000000000000 Out = 7DC0D45689A260233E52B56EE49F326B Key = 000000000000000000000000000000000000000800000000 In = 00000000000000000000000000000000 Out = E69EE6C58AE686AC193F4A118E5C7680 Key = 000000000000000000000000000000000000000400000000 In = 00000000000000000000000000000000 Out = 7FCF4D217B2A37C8D3A822C43B1A119E Key = 000000000000000000000000000000000000000200000000 In = 00000000000000000000000000000000 Out = 6D37043BF5B8D45F1E44A7C0E792A343 Key = 000000000000000000000000000000000000000100000000 In = 00000000000000000000000000000000 Out = ED46DEA31CAC83EE9F812C9006891C32 Key = 000000000000000000000000000000000000800000000000 In = 00000000000000000000000000000000 Out = DABC07C4DFDDA34A8B61D1E1F0461196 Key = 000000000000000000000000000000000000400000000000 In = 00000000000000000000000000000000 Out = E733109E82EEDEFBB02512F1C030FF35 Key = 000000000000000000000000000000000000200000000000 In = 00000000000000000000000000000000 Out = 9F3BF5E17F297B3B3F3D6311B2874FC1 Key = 000000000000000000000000000000000000100000000000 In = 00000000000000000000000000000000 Out = CF2793EDA6299C358F79D0F15853E075 Key = 000000000000000000000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 4CFCD92E08E82B0B3FC7C0CB8A2193CE Key = 000000000000000000000000000000000000040000000000 In = 00000000000000000000000000000000 Out = 409F6D08C56C0129A485A2CD503AA754 Key = 000000000000000000000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 4D80946E2267E0E485CDF4CBEA0BDE73 Key = 000000000000000000000000000000000000010000000000 In = 00000000000000000000000000000000 Out = EAE07676A063EB5F7F99FAED7B065188 Key = 000000000000000000000000000000000080000000000000 In = 00000000000000000000000000000000 Out = A783EB0A14B5212A9BC439F225F33834 Key = 000000000000000000000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 524282FABF8B62D291AAAADA12423AE9 Key = 000000000000000000000000000000000020000000000000 In = 00000000000000000000000000000000 Out = 306D0E55364394631EC18BE972EF0B66 Key = 000000000000000000000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 87D8BA08354745FE85BBB710FCF5EB39 Key = 000000000000000000000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 894D2F50F43BA36B539DE43637927AC9 Key = 000000000000000000000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 479C1979DDB0052BA7DF875314CB2A35 Key = 000000000000000000000000000000000002000000000000 In = 00000000000000000000000000000000 Out = E0E5399FEF15563392741BC333246873 Key = 000000000000000000000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 86F93C8B9552D8971367EAE2A366312F Key = 000000000000000000000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 9F18DF64A519FEC0581C0C27F805F484 Key = 000000000000000000000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 53BD3E8475DB67F72910B945BF8C768E Key = 000000000000000000000000000000002000000000000000 In = 00000000000000000000000000000000 Out = 456C1BE9ACEFA86AFB9742AB867692B1 Key = 000000000000000000000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 89EE6EBDDCB44B7F17157C154BB99221 Key = 000000000000000000000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 51ECA17E2C529F17592F9A117F6F592B Key = 000000000000000000000000000000000400000000000000 In = 00000000000000000000000000000000 Out = A51036D7D90699DDA88ED9A16EE6C556 Key = 000000000000000000000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 07C856A3CE6F131D785BDE2E3DB3D36A Key = 000000000000000000000000000000000100000000000000 In = 00000000000000000000000000000000 Out = A06931BD2C6D9C3701E0286016AB8555 Key = 000000000000000000000000000000800000000000000000 In = 00000000000000000000000000000000 Out = 3A07686652A8F7E35FC9B3333EA97D16 Key = 000000000000000000000000000000400000000000000000 In = 00000000000000000000000000000000 Out = FD008310340BA35239165FCA8F52B3DF Key = 000000000000000000000000000000200000000000000000 In = 00000000000000000000000000000000 Out = FC7E859D16DBF0F92FB8B3286C110315 Key = 000000000000000000000000000000100000000000000000 In = 00000000000000000000000000000000 Out = 86C0CBEB5633EF88ABD436BA54AC4D7B Key = 000000000000000000000000000000080000000000000000 In = 00000000000000000000000000000000 Out = CA66CEA4EAE07B83E1EEB737FE72EADC Key = 000000000000000000000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 019754956B6DC021D25731EF988BDAC9 Key = 000000000000000000000000000000020000000000000000 In = 00000000000000000000000000000000 Out = 786EC65CC6C717A171822F1DD1AB3CE8 Key = 000000000000000000000000000000010000000000000000 In = 00000000000000000000000000000000 Out = DEAB7388A6F1C61D41E25A0D88F062C4 Key = 000000000000000000000000000080000000000000000000 In = 00000000000000000000000000000000 Out = F08DF5D467F41CB7D157C6E6C78900FE Key = 000000000000000000000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 0225B99C3E40C8A5FD0156BD6A2B9349 Key = 000000000000000000000000000020000000000000000000 In = 00000000000000000000000000000000 Out = 6B8D89725A7AEB5AA433011ACF5B72EC Key = 000000000000000000000000000010000000000000000000 In = 00000000000000000000000000000000 Out = 6A8B55F69923153ED6A95BF4B78CCE6E Key = 000000000000000000000000000008000000000000000000 In = 00000000000000000000000000000000 Out = 199B86F903787EE3EDD60F8393F4A89A Key = 000000000000000000000000000004000000000000000000 In = 00000000000000000000000000000000 Out = BFE08316360801D0B929BBE1786A8570 Key = 000000000000000000000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 887B6ECDBF12DEB314C50F07B870EC3B Key = 000000000000000000000000000001000000000000000000 In = 00000000000000000000000000000000 Out = C82FDE13839BD8BD8FC408131F559648 Key = 000000000000000000000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 0482615608212073881C83A90A0B2721 Key = 000000000000000000000000004000000000000000000000 In = 00000000000000000000000000000000 Out = CDFD5AF33A61EA9BA8C6E4DD3E84949D Key = 000000000000000000000000002000000000000000000000 In = 00000000000000000000000000000000 Out = A9EFF0A790FEB09727558C1FFB4247A4 Key = 000000000000000000000000001000000000000000000000 In = 00000000000000000000000000000000 Out = EAF6266AC9F0A0E96ECF6E602DE61B73 Key = 000000000000000000000000000800000000000000000000 In = 00000000000000000000000000000000 Out = 59F44B4178A92AF2CA778BDA351247F1 Key = 000000000000000000000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 87C3730E07C280D110EE11BBDB2C7BF6 Key = 000000000000000000000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 5F6BF404C25C812FF2E814E4FEBAF636 Key = 000000000000000000000000000100000000000000000000 In = 00000000000000000000000000000000 Out = 92B8C78C75EE5BB1C27DAC75EF76D2E0 Key = 000000000000000000000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 1E9F7474C984CC73B7F90F8EC01F547D Key = 000000000000000000000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 9CAAD32B4195E293A792CF2403839879 Key = 000000000000000000000000200000000000000000000000 In = 00000000000000000000000000000000 Out = B384BE1E8CEAD9DE1E209FC92BA6A3D3 Key = 000000000000000000000000100000000000000000000000 In = 00000000000000000000000000000000 Out = 4E512E32F6B60CFE5660D7CFA21E13FC Key = 000000000000000000000000080000000000000000000000 In = 00000000000000000000000000000000 Out = 832615D6654549BB930EC8DBACC5AE92 Key = 000000000000000000000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 27549DC43C2DEEAFFB1C52AC37AD9728 Key = 000000000000000000000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 804E4F4C6FD215D4300704142407020A Key = 000000000000000000000000010000000000000000000000 In = 00000000000000000000000000000000 Out = C52FECB8EDDA2D9BF3E5856231B87F6F Key = 000000000000000000000080000000000000000000000000 In = 00000000000000000000000000000000 Out = 26474A9B6A125DA80A989286F1AADB77 Key = 000000000000000000000040000000000000000000000000 In = 00000000000000000000000000000000 Out = 15955CDA082E2278B2EAB498BAE90A5D Key = 000000000000000000000020000000000000000000000000 In = 00000000000000000000000000000000 Out = 04191E4D8945BA1E9D02098EEFCD65DF Key = 000000000000000000000010000000000000000000000000 In = 00000000000000000000000000000000 Out = C1841B80C1E0E4608F0C261F8FF91199 Key = 000000000000000000000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 7FF3E31C19BB193B4A2CCD488CB44F97 Key = 000000000000000000000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 2FB402BFAAACCC4F55C9EBA37D2AA543 Key = 000000000000000000000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 97289170C25CE1EC2011B27487DC8903 Key = 000000000000000000000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 3BC60DC98B29BA75D7DBA12D78BED74D Key = 000000000000000000008000000000000000000000000000 In = 00000000000000000000000000000000 Out = 21C3E9BDB411A2CF58ACFCDDA07CA06E Key = 000000000000000000004000000000000000000000000000 In = 00000000000000000000000000000000 Out = 174FC71F855D61484B8C05DEB12988BA Key = 000000000000000000002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 337671C8D092C431778655358AE1A622 Key = 000000000000000000001000000000000000000000000000 In = 00000000000000000000000000000000 Out = D671E381AE4CBFBC4D360ACE36538EB6 Key = 000000000000000000000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 9915EB2B534C901AB3E208F0B8274438 Key = 000000000000000000000400000000000000000000000000 In = 00000000000000000000000000000000 Out = CBB867073A139F7A39A5ABFB1F9B7084 Key = 000000000000000000000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 487B9F02DF40531F6B1BD096A8E32377 Key = 000000000000000000000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 871D4D57145444F7858A3A1727FEE068 Key = 000000000000000000800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 56463A7AEB3D1B104868B5F0CB88479B Key = 000000000000000000400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1A00009A7CAE8EF56B167F94F9932585 Key = 000000000000000000200000000000000000000000000000 In = 00000000000000000000000000000000 Out = BA0BDE829631F63E14FE1995C57CBE29 Key = 000000000000000000100000000000000000000000000000 In = 00000000000000000000000000000000 Out = A0625DDE21DF874E27751F460DB24939 Key = 000000000000000000080000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3A850B3917B926B7C1861AA8557548DB Key = 000000000000000000040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 33FB35F2ED3A0F9A9C0D62868890B706 Key = 000000000000000000020000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8EB519BF9B7F9841FC429C21930730AA Key = 000000000000000000010000000000000000000000000000 In = 00000000000000000000000000000000 Out = 973672A4178DA471DB7C2CC9F3349DA4 Key = 000000000000000080000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EBC56A2AB4DC394C8409EBC529103C09 Key = 000000000000000040000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 00300AD85514851A32376A583B99416A Key = 000000000000000020000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 47CB1114753A29FA68E83BF3754F5713 Key = 000000000000000010000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 556424407058A1BF639387032BB4972B Key = 000000000000000008000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C573C69439543B71A1EAF6A38D1DB977 Key = 000000000000000004000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 570D68BC03C1AD3173316BB3484166DB Key = 000000000000000002000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2ABE779A9A42BF593A2D20495C6F5A37 Key = 000000000000000001000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7D648B890DCE86ADAE607B24B17F7ADC Key = 000000000000008000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8AF02339AC04EEDDC5D29B1D8AB85E34 Key = 000000000000004000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D11C7DCD0E9B857DDC1A8D73169BBA2D Key = 000000000000002000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7A960A521E193922ED2275B1FCEB484F Key = 000000000000001000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 357E6FBCA32874FDCE99AD14BD10C4B8 Key = 000000000000000800000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1AC04248825E32B8E71C34875371F307 Key = 000000000000000400000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 038A5BB1246BB8F0460ADC7826211268 Key = 000000000000000200000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EF923294B89B78F017C874FC4472762E Key = 000000000000000100000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 19A8882B0FDB10E143FF9DF9D32DA301 Key = 000000000000800000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 399800963634CD1B96D9FCEFE1D0815E Key = 000000000000400000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9B5B6DFFFCB2201390728372E1259012 Key = 000000000000200000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0DB33144E4EB0FCAC271AB4D26F7B3B3 Key = 000000000000100000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D7987CAA9C1CAB111984C2BA993F95B9 Key = 000000000000080000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7F57B51D6B2E5E8C3DBEDF6B68A3ACDB Key = 000000000000040000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5DE80D7BF3FC0B05ACEB1311BE12E31B Key = 000000000000020000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BE2C16F62E116A472C43D526D582A2F2 Key = 000000000000010000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0D9AED1721E71B09C7CF34650315ADD4 Key = 000000000080000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2B06E5A2CB8E141B6F194E7987D32E14 Key = 000000000040000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FE2893A03D01523DF7BCF0EC76A71E76 Key = 000000000020000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 018056BEED112C1B11C6D58F383E51F3 Key = 000000000010000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 20D29D2A08CAED608CEE792B82E9F900 Key = 000000000008000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FB4786827E61312B24889E8A75BFE0E8 Key = 000000000004000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 81FC9F0C865FC970721180942F0DADDE Key = 000000000002000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 179BA8EFBE611F1358B2D7C8A14F6056 Key = 000000000001000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5509A6F21705DA67E685C1D2515FC40F Key = 000000008000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9EF148F4819E1AD53458FF7B97512719 Key = 000000004000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B992E1FD9026C14545D3B45BA12DD26 Key = 000000002000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2A1A31C9F9EC3F0041E4981C14075C9B Key = 000000001000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 668D25EAB49A68A353170FB9804C49E9 Key = 000000000800000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B0851073E77BEBADB5E4620A5ECAB48F Key = 000000000400000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0D7DD474F2ADD4E616C2BDCB31AE295E Key = 000000000200000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 19E972ACB8159AF2BE06C2CEB13F17CB Key = 000000000100000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D3181CAF92EB933472AB5D7D9A79359F Key = 000000800000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AA8B04CFD3F03D913981888D65F595F4 Key = 000000400000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C972EAE644F542F2D61581105DAA2DE9 Key = 000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 40288DA36DC4A581CFC6BF52768AEAC0 Key = 000000100000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1460BD4CE7589DFC8CA2A341CEDE21A2 Key = 000000080000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 415E3D395E8AF9F0B367B18279EC9D36 Key = 000000040000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 52841B754B398E76A046A808D0254DB1 Key = 000000020000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E28C2E20BF18DAD62ADA7B46D46C51AC Key = 000000010000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EACF9AD4EAC19266F886CB3AE50B2CA8 Key = 000080000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 39057A7055ADC3DF052632BA75845405 Key = 000040000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0637B291488FCBC39EA131C5D0393617 Key = 000020000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 53A6EAA591C754B9AFB8E14B39BFFE79 Key = 000010000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AF9DD24F6FD3C9BAD97466F4E19D008E Key = 000008000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6F6C9FDBB84546B3BD98703730A71292 Key = 000004000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 00DCD917419399ED52E2A528ECAB86C5 Key = 000002000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DC077DA2CBF96509A74980CE12786C41 Key = 000001000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AADD759F77507F990D3856F6EFC91978 Key = 008000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3948D1EF7CE021CEF9C6C1405BB5A6F9 Key = 004000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5B8AC83847FDCD6006F7D59A04BE703C Key = 002000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7F6347B6A370FDBCD26C91E5F1BE4E77 Key = 001000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3D8DC8CEF60F4F0F021BEA3B8A268740 Key = 000800000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C9BA9FC07BD7FAD3CBD56DBF9A7C5B00 Key = 000400000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B660D768B8E32F0C4E15386C5F3450D Key = 000200000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9A15675F3631BD2AF387A7B69DCEB89E Key = 000100000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 893978E492FED5662D13AA2F759DC89A Key = 800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9E274EAD9B737BB21EFCFCA548602689 Key = 400000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 92FC8E510399E46A041BF365E7B3AE82 Key = 200000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5E0DA386C46AD493DEA203FDC6F57D70 Key = 100000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BEC1E37824CF721E5D87F6CB4EBFB9BE Key = 080000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 257A79F891BB8D0C13FEEF1ACC264214 Key = 040000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B3EDD5BA04CB6FF80A3874411C1B8B7 Key = 020000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 73C83EA96AE151230B2DEE7110B15E2C Key = 010000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0ABD62FC8802C9BC86E2544909AC610F Key = 0000000000000000000000000000000000000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 1908EF821AD2EBC0CB28BF66E796EDAB Key = 0000000000000000000000000000000000000000000000000000000000000040 In = 00000000000000000000000000000000 Out = 8D88B1E7BB45E0DD5603D8FCCD589695 Key = 0000000000000000000000000000000000000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 284CDF6476175B6BB414E7FAC09CD404 Key = 0000000000000000000000000000000000000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 66487D053A660BD840D7DE39A3B1F139 Key = 0000000000000000000000000000000000000000000000000000000000000008 In = 00000000000000000000000000000000 Out = 869A570998988F68819CCF301EB015DF Key = 0000000000000000000000000000000000000000000000000000000000000004 In = 00000000000000000000000000000000 Out = F6899D57F734AFD6473278DBDE8FB99D Key = 0000000000000000000000000000000000000000000000000000000000000002 In = 00000000000000000000000000000000 Out = A6726CE53BD62BC873F6C0463A5841FC Key = 0000000000000000000000000000000000000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 9858FD31C9C6B54AC0C99CC52324ED34 Key = 0000000000000000000000000000000000000000000000000000000000008000 In = 00000000000000000000000000000000 Out = 82EDDDC59E207131F1AE2A2A06A83284 Key = 0000000000000000000000000000000000000000000000000000000000004000 In = 00000000000000000000000000000000 Out = 1C17A9F76290FB6C0F0267BB1CE832C6 Key = 0000000000000000000000000000000000000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 6DD6415CC9EFB2323FA78ED28EEE06C7 Key = 0000000000000000000000000000000000000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 48FD01A424E995B0E0840353439B1A4B Key = 0000000000000000000000000000000000000000000000000000000000000800 In = 00000000000000000000000000000000 Out = 2B139C4C4200A8DA4DAF8169F84A4089 Key = 0000000000000000000000000000000000000000000000000000000000000400 In = 00000000000000000000000000000000 Out = 0D7E0A00E181F592C1D75250AC940517 Key = 0000000000000000000000000000000000000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 9250D327F678E8EDBC25CB40EA70391E Key = 0000000000000000000000000000000000000000000000000000000000000100 In = 00000000000000000000000000000000 Out = 4D715D9421FCB51C7B4C94DEF2B5C210 Key = 0000000000000000000000000000000000000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 19DD5DEC75CEE00003995BF2EA643E2F Key = 0000000000000000000000000000000000000000000000000000000000400000 In = 00000000000000000000000000000000 Out = BB75015A768AB1E9BC4AF49D2D156C4F Key = 0000000000000000000000000000000000000000000000000000000000200000 In = 00000000000000000000000000000000 Out = 46EFE1B09EFB606CB11717415511862E Key = 0000000000000000000000000000000000000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 360D02F49944ECAE2EE2050E634904CE Key = 0000000000000000000000000000000000000000000000000000000000080000 In = 00000000000000000000000000000000 Out = 93E207973539B6E2EF7D49C772E32D86 Key = 0000000000000000000000000000000000000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 2E71481D28ED6BD01157F4D054F01961 Key = 0000000000000000000000000000000000000000000000000000000000020000 In = 00000000000000000000000000000000 Out = AC06EB8186A501262CE9B06FC88F9774 Key = 0000000000000000000000000000000000000000000000000000000000010000 In = 00000000000000000000000000000000 Out = A94CC5DCC946C9B4F38D1D46BF1C0335 Key = 0000000000000000000000000000000000000000000000000000000080000000 In = 00000000000000000000000000000000 Out = 17A457DA5304D77BD0BC4B5B8BB02FDD Key = 0000000000000000000000000000000000000000000000000000000040000000 In = 00000000000000000000000000000000 Out = B6DF6B6C45A38ECE7E940C45FE1E847E Key = 0000000000000000000000000000000000000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 83DB5E464D300A76EDA858E108902EBF Key = 0000000000000000000000000000000000000000000000000000000010000000 In = 00000000000000000000000000000000 Out = C7FB67AAA9F7417DC5977B57B723D278 Key = 0000000000000000000000000000000000000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 1DD21FD2291C7419B5593EE8D6712198 Key = 0000000000000000000000000000000000000000000000000000000004000000 In = 00000000000000000000000000000000 Out = A2E337EFDF4B888C2B94B86AE20FF8E8 Key = 0000000000000000000000000000000000000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 61F70FEAB04DB61D959A69E9C1BAAA9D Key = 0000000000000000000000000000000000000000000000000000000001000000 In = 00000000000000000000000000000000 Out = 6FC6C5718FD0B81194A198F873EDE7EA Key = 0000000000000000000000000000000000000000000000000000008000000000 In = 00000000000000000000000000000000 Out = DFDB243581A8D3DA8A3F268AA8E6207E Key = 0000000000000000000000000000000000000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 965A8653210830C831353A28CBBFD16C Key = 0000000000000000000000000000000000000000000000000000002000000000 In = 00000000000000000000000000000000 Out = E3442D2FC126CC50AB364E09A0872B18 Key = 0000000000000000000000000000000000000000000000000000001000000000 In = 00000000000000000000000000000000 Out = B261BC4E7FAE6629FC5F5D588E417CAF Key = 0000000000000000000000000000000000000000000000000000000800000000 In = 00000000000000000000000000000000 Out = 940218AC849FD119D89B0E15376213DD Key = 0000000000000000000000000000000000000000000000000000000400000000 In = 00000000000000000000000000000000 Out = C07DE68CB0ED8C8D398B87D6547BD15B Key = 0000000000000000000000000000000000000000000000000000000200000000 In = 00000000000000000000000000000000 Out = F14145E5DCB1EFA30A5A6CA08EC8F8FE Key = 0000000000000000000000000000000000000000000000000000000100000000 In = 00000000000000000000000000000000 Out = 4D08CD60B971B10854A0912DAF5CC3A8 Key = 0000000000000000000000000000000000000000000000000000800000000000 In = 00000000000000000000000000000000 Out = 73C96C4F08BC5F9725CD2F719402DF4B Key = 0000000000000000000000000000000000000000000000000000400000000000 In = 00000000000000000000000000000000 Out = 488AF3D7E9223041C2C26AB496BBF0E5 Key = 0000000000000000000000000000000000000000000000000000200000000000 In = 00000000000000000000000000000000 Out = CD5038A80ECEC3424E1E9614CD3267DD Key = 0000000000000000000000000000000000000000000000000000100000000000 In = 00000000000000000000000000000000 Out = C38D3776A560BBC5453E96C1587B0E59 Key = 0000000000000000000000000000000000000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 845416D12195B8FC18F299AD41D8F569 Key = 0000000000000000000000000000000000000000000000000000040000000000 In = 00000000000000000000000000000000 Out = 07B3D3BB79520764234D247A7A0036C2 Key = 0000000000000000000000000000000000000000000000000000020000000000 In = 00000000000000000000000000000000 Out = BD6816944B3A1353229B02907CD0E87C Key = 0000000000000000000000000000000000000000000000000000010000000000 In = 00000000000000000000000000000000 Out = CC547CD2016122227D7CE3B4BFBE3EAF Key = 0000000000000000000000000000000000000000000000000080000000000000 In = 00000000000000000000000000000000 Out = 3CF2E1206969ED3A85E28EFA16162E53 Key = 0000000000000000000000000000000000000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 801DB46F97025BB099F7755595C532E3 Key = 0000000000000000000000000000000000000000000000000020000000000000 In = 00000000000000000000000000000000 Out = 4322F95A6D70B9D4F53B733505A11D79 Key = 0000000000000000000000000000000000000000000000000010000000000000 In = 00000000000000000000000000000000 Out = D1A200ED8E473284B70EB16E93B55ECD Key = 0000000000000000000000000000000000000000000000000008000000000000 In = 00000000000000000000000000000000 Out = AAB1879D98592963B8F90C8F06804207 Key = 0000000000000000000000000000000000000000000000000004000000000000 In = 00000000000000000000000000000000 Out = E221625345B6E73DD09235C7A3957CA3 Key = 0000000000000000000000000000000000000000000000000002000000000000 In = 00000000000000000000000000000000 Out = 02B055320E02DA991986BB53A1CC69B9 Key = 0000000000000000000000000000000000000000000000000001000000000000 In = 00000000000000000000000000000000 Out = FCA1B117007B2C06165E3D773CCEB0C9 Key = 0000000000000000000000000000000000000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 853E0E5DD1CA7C9C55388DDBA2F138FD Key = 0000000000000000000000000000000000000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 6991C5D5E1BD766597115C5A213F6CFB Key = 0000000000000000000000000000000000000000000000002000000000000000 In = 00000000000000000000000000000000 Out = 4E0D7A3C6816CC844ABA4BB6AA0F3592 Key = 0000000000000000000000000000000000000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 1A93F22F2E11AFC3CECA1FC17065ECEC Key = 0000000000000000000000000000000000000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 1519F9986E85E5B942A66DFE1D6ECBE7 Key = 0000000000000000000000000000000000000000000000000400000000000000 In = 00000000000000000000000000000000 Out = 2B583F2363F6C1D981BD2D0C3F965F3A Key = 0000000000000000000000000000000000000000000000000200000000000000 In = 00000000000000000000000000000000 Out = E92FEBFA44950BE01CE755EB4607563B Key = 0000000000000000000000000000000000000000000000000100000000000000 In = 00000000000000000000000000000000 Out = A583EF976A292B406BBD5DC8256B0442 Key = 0000000000000000000000000000000000000000000000800000000000000000 In = 00000000000000000000000000000000 Out = 08D8A40BCA6BC1C31BADCC9DDA387D9C Key = 0000000000000000000000000000000000000000000000400000000000000000 In = 00000000000000000000000000000000 Out = F502C9674BEBFAE010527C808CA03F5C Key = 0000000000000000000000000000000000000000000000200000000000000000 In = 00000000000000000000000000000000 Out = E85D57184DA2B982C18C8B13B1348838 Key = 0000000000000000000000000000000000000000000000100000000000000000 In = 00000000000000000000000000000000 Out = 6E71FFAC10EDBF08A6DC42BDA14AE1CE Key = 0000000000000000000000000000000000000000000000080000000000000000 In = 00000000000000000000000000000000 Out = 0F2D7BEE48845D8A17ECF93F52F9036A Key = 0000000000000000000000000000000000000000000000040000000000000000 In = 00000000000000000000000000000000 Out = CBC811575660AF9F7E869631ED779F66 Key = 0000000000000000000000000000000000000000000000020000000000000000 In = 00000000000000000000000000000000 Out = F7E405B065FB1A03EBD539CFCAD08E17 Key = 0000000000000000000000000000000000000000000000010000000000000000 In = 00000000000000000000000000000000 Out = 0872458B2E2C4725CE7DEC3FFFC47F4A Key = 0000000000000000000000000000000000000000000080000000000000000000 In = 00000000000000000000000000000000 Out = 18DF0F25A865A0B6EC844D810D25FD87 Key = 0000000000000000000000000000000000000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 35D6DB5996115E7E8C1BE200823E7C63 Key = 0000000000000000000000000000000000000000000020000000000000000000 In = 00000000000000000000000000000000 Out = CDEA1849DE224D92034BEC826682AD47 Key = 0000000000000000000000000000000000000000000010000000000000000000 In = 00000000000000000000000000000000 Out = 7343B1923DB7C28C195660252857ABA3 Key = 0000000000000000000000000000000000000000000008000000000000000000 In = 00000000000000000000000000000000 Out = F02FA74352855E5FC194F18476DC2916 Key = 0000000000000000000000000000000000000000000004000000000000000000 In = 00000000000000000000000000000000 Out = ADCAFB490DD340784F084779CE182FFE Key = 0000000000000000000000000000000000000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 0CE37E34B01BAF724841EC58A6B90990 Key = 0000000000000000000000000000000000000000000001000000000000000000 In = 00000000000000000000000000000000 Out = A577782DBA6EDE990B2A28FBF52899B0 Key = 0000000000000000000000000000000000000000008000000000000000000000 In = 00000000000000000000000000000000 Out = E5BD5E55A80FE196A2AEBCDB6798614E Key = 0000000000000000000000000000000000000000004000000000000000000000 In = 00000000000000000000000000000000 Out = DAD3F4D3B96EF51C2D4D2869FAEA4C1D Key = 0000000000000000000000000000000000000000002000000000000000000000 In = 00000000000000000000000000000000 Out = 28E64B7DC148055040950974E718B27A Key = 0000000000000000000000000000000000000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 08C9B5E67B8954FDFE74F391B7AFB754 Key = 0000000000000000000000000000000000000000000800000000000000000000 In = 00000000000000000000000000000000 Out = 9CA79528107403A7430CD50578029990 Key = 0000000000000000000000000000000000000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 45A104CAE36E600B6EF91B91FC1C657C Key = 0000000000000000000000000000000000000000000200000000000000000000 In = 00000000000000000000000000000000 Out = D9CF9457265E7ACC57EFE25736A11FBE Key = 0000000000000000000000000000000000000000000100000000000000000000 In = 00000000000000000000000000000000 Out = D1DD8AE84D38D129A5FA0E9D9520ECF8 Key = 0000000000000000000000000000000000000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 43FB732672D6243DDC9C547E46711FBE Key = 0000000000000000000000000000000000000000400000000000000000000000 In = 00000000000000000000000000000000 Out = A2622ED785815C12C949EBED89094FC3 Key = 0000000000000000000000000000000000000000200000000000000000000000 In = 00000000000000000000000000000000 Out = FBB93B64CA5D94692B4E6EED934112D8 Key = 0000000000000000000000000000000000000000100000000000000000000000 In = 00000000000000000000000000000000 Out = CD3681FF583D4BC4886D864CFA94EF97 Key = 0000000000000000000000000000000000000000080000000000000000000000 In = 00000000000000000000000000000000 Out = 37ED3CE092A1AE925264751DFFF6B50E Key = 0000000000000000000000000000000000000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 3CA305833473AC6990A41E37A7BE551A Key = 0000000000000000000000000000000000000000020000000000000000000000 In = 00000000000000000000000000000000 Out = CEF8EC0353A04B3DB1309F88265FDABF Key = 0000000000000000000000000000000000000000010000000000000000000000 In = 00000000000000000000000000000000 Out = 51C23A4293BB9B963AD17E349B8A71C5 Key = 0000000000000000000000000000000000000080000000000000000000000000 In = 00000000000000000000000000000000 Out = B324D96D901DB388CC1DF28092714335 Key = 0000000000000000000000000000000000000040000000000000000000000000 In = 00000000000000000000000000000000 Out = E572F8132305A28A1E09BF5ED8ABAA8D Key = 0000000000000000000000000000000000000020000000000000000000000000 In = 00000000000000000000000000000000 Out = E4CBB63909992197E9654069BF4EE3EE Key = 0000000000000000000000000000000000000010000000000000000000000000 In = 00000000000000000000000000000000 Out = 14B1DF955B3A20EADFF35C3869B0B624 Key = 0000000000000000000000000000000000000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 4D9019A6223F39E2075C95C7724959FC Key = 0000000000000000000000000000000000000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 5352A5E6F316C51F0256B3A0BC283D47 Key = 0000000000000000000000000000000000000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 9F570DD55188193525D0C0244CBA2CFD Key = 0000000000000000000000000000000000000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 1B206FEA626AD786255A3186AC5F5132 Key = 0000000000000000000000000000000000008000000000000000000000000000 In = 00000000000000000000000000000000 Out = D7078E2A1CB16142851F7C5F86FF4E64 Key = 0000000000000000000000000000000000004000000000000000000000000000 In = 00000000000000000000000000000000 Out = FED174EAC6701DAD5DF03DD8A438D99C Key = 0000000000000000000000000000000000002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9112A5FEB40E3134C26303F379F29AF6 Key = 0000000000000000000000000000000000001000000000000000000000000000 In = 00000000000000000000000000000000 Out = B190C3C5AC183F95F71495A93C679BDB Key = 0000000000000000000000000000000000000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 5777C456EEDBB7756AE316517C1072A8 Key = 0000000000000000000000000000000000000400000000000000000000000000 In = 00000000000000000000000000000000 Out = 5550900FAF11F9D2DDC6CF2F1D7AAEDB Key = 0000000000000000000000000000000000000200000000000000000000000000 In = 00000000000000000000000000000000 Out = BDE3013E16AFDF64A0F24991D7EE5752 Key = 0000000000000000000000000000000000000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 71500F21B4145961271727E896C62F24 Key = 0000000000000000000000000000000000800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 801CA8E44FB6BAB5DF7FB96AA5F39F8D Key = 0000000000000000000000000000000000400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9EB5169E8F72673301D0ABF9E85422BF Key = 0000000000000000000000000000000000200000000000000000000000000000 In = 00000000000000000000000000000000 Out = CB377E74144F9E9405355F089CA3918B Key = 0000000000000000000000000000000000100000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1EE82E9E6E525DAEB21DF068DFF7AB09 Key = 0000000000000000000000000000000000080000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6316DDDD174659C16CF3324A770225EB Key = 0000000000000000000000000000000000040000000000000000000000000000 In = 00000000000000000000000000000000 Out = E17C717EC7A1CF3492710D9FE53A26AD Key = 0000000000000000000000000000000000020000000000000000000000000000 In = 00000000000000000000000000000000 Out = 675F1E9F7C895DD0B4E1F8D4EED1D2C9 Key = 0000000000000000000000000000000000010000000000000000000000000000 In = 00000000000000000000000000000000 Out = 446B5ADE1FE91D73511403B34F20FF16 Key = 0000000000000000000000000000000080000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C19171490B5595E8555C61B352935DEB Key = 0000000000000000000000000000000040000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 57159E7BE66463408FAE89C376318FA8 Key = 0000000000000000000000000000000020000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C2441BB36C7B7977B0E6EED5AED1BE09 Key = 0000000000000000000000000000000010000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 63A33251E59FF5A6CE0482EB4B80E70B Key = 0000000000000000000000000000000008000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4459D2EA77E8E8041DA46EB36705B054 Key = 0000000000000000000000000000000004000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E76A69F531CCC2C1A4C56AEE55B63C29 Key = 0000000000000000000000000000000002000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97E97C261C31046F115FEC15820E3822 Key = 0000000000000000000000000000000001000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3620B17AE6A993D09618B8768266BAE9 Key = 0000000000000000000000000000008000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4172B0BEBBEF90672EB0623A709FC734 Key = 0000000000000000000000000000004000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 265829FC78FD18069B3631AE596DC9BF Key = 0000000000000000000000000000002000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E89B25E3E40E28D37BA6E78C55A611F8 Key = 0000000000000000000000000000001000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8EBF95D561DD65F9BC66B82A6905828C Key = 0000000000000000000000000000000800000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8C8F6AF8078C29D23B2958CAE6858A09 Key = 0000000000000000000000000000000400000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 39FA2682ABFABA6A705780E72BDA0128 Key = 0000000000000000000000000000000200000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A812C9D68212B21A14E9CEBCA8960750 Key = 0000000000000000000000000000000100000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 47BFD757C13ADA4001DF9B0989E7CB80 Key = 0000000000000000000000000000800000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A95ADAA6A53D1BF0FA4E46EA5D1EE88C Key = 0000000000000000000000000000400000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D1031805010BBACD8BB316EFA437EC4A Key = 0000000000000000000000000000200000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7B6A4380AF9337C902AA691243F6A2E6 Key = 0000000000000000000000000000100000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BDEF751D35F3B8BC6A9AB61F6B04A94A Key = 0000000000000000000000000000080000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 51CFB9ED07D3628D0854C2E85FC4B866 Key = 0000000000000000000000000000040000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0CDA37833BE087D8B997A54D5CFBDCFD Key = 0000000000000000000000000000020000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 938D2E6F2149D1E0B6F8878D472F0469 Key = 0000000000000000000000000000010000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3857B0C25F235A22F347E0ACCD008FAD Key = 0000000000000000000000000080000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3BAADE8819E09549CDA6AA160F4C626A Key = 0000000000000000000000000040000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0F5E7BF2A2590F7A65D17DAA4E828F7D Key = 0000000000000000000000000020000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 510B105E4809B4115C999AB346D21570 Key = 0000000000000000000000000010000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0FF47C9330A69D2B5C52434394A2D1CA Key = 0000000000000000000000000008000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AB8301BFFFF3B24A3CE63F553443F2C7 Key = 0000000000000000000000000004000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 49A3F4514E983616F55580EA4EA12DBF Key = 0000000000000000000000000002000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C007AEA2279ED965AD5F037359DE24C4 Key = 0000000000000000000000000001000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BE5FCBE21961382305B6EDBC74B6D73E Key = 0000000000000000000000008000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5F3DB2DEE7074DAE2340174109D6BEF0 Key = 0000000000000000000000004000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E530BC0CE5A24E03AD0D215A7E9D9A15 Key = 0000000000000000000000002000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FFF5A17155933F6084EA4C1BE1245769 Key = 0000000000000000000000001000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 64CA3D5422833F7A4AD1FA5331C08A78 Key = 0000000000000000000000000800000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E42C18F2B56A0E536E4908F84DE06419 Key = 0000000000000000000000000400000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97823D74887FBE3E6B412407A256A018 Key = 0000000000000000000000000200000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8A1D4467260F12AB493334133D5928DD Key = 0000000000000000000000000100000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 735E7FB4B1B2D54C6D33E3D0C714BFA0 Key = 0000000000000000000000800000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AD4B018D50E3A28124A0A1259DC667D4 Key = 0000000000000000000000400000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C899A00A2585C1F654694700F1EC1531 Key = 0000000000000000000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BAE53DCFCF6D6E360A27755F9CE81B6D Key = 0000000000000000000000100000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6E181C731459C3360778BEA1BA86164D Key = 0000000000000000000000080000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97FD2DDD6045805A7B34879A6AB55D3C Key = 0000000000000000000000040000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 547D61C02DEF0D9869DF43907D3B8124 Key = 0000000000000000000000020000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9E457544FC14C723884DD15DEBC25157 Key = 0000000000000000000000010000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E0767EC3934ECF169116B485ED0C755B Key = 0000000000000000000080000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B4B30728F0DDBB28402E252DC6DDBA4E Key = 0000000000000000000040000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DDB074D9E22B61FCDCB2323A52046221 Key = 0000000000000000000020000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 91ABBBFECEC752159297B832055E99FE Key = 0000000000000000000010000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 25415EF8615CC222B1EC77046B094C35 Key = 0000000000000000000008000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C11856EE23FA27F2F426844EE9C7B081 Key = 0000000000000000000004000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5E6F28690F31CDC0DAD21D8E3E1BC985 Key = 0000000000000000000002000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 712D271BAB597FF6728C0A55CE6C3CDB Key = 0000000000000000000001000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4A567C948597B47A1ABF5F8CCD77AE4F Key = 0000000000000000008000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6ED568AD50C256B77945E19C04086D98 Key = 0000000000000000004000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F2398F417C685FE664735E29DB29BBA9 Key = 0000000000000000002000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 37D20B991D910044C6BEF068028125D4 Key = 0000000000000000001000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35721318ED63062B43D37C4F14101962 Key = 0000000000000000000800000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 74A004A5D483CCA7219EA12AD4AF5CA4 Key = 0000000000000000000400000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BBCEA8A80619D2AC53037313E71AB56C Key = 0000000000000000000200000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 646E434C0FEF5CD6CD9C7A26BA972BB1 Key = 0000000000000000000100000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8F2AD3F65E9716E611501D5B7AD81127 Key = 0000000000000000800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BCC02339FCFFCAE0536FB5410AF91129 Key = 0000000000000000400000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DD6A02B2DC091212A746C8FC9967B8BE Key = 0000000000000000200000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4BB9FD26E225C913F9BE1B697D31B5B9 Key = 0000000000000000100000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2A3BAC4370DAA0D68CA90939F43E33CC Key = 0000000000000000080000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8576F1070E25B5FD944C366E08CC9102 Key = 0000000000000000040000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E620C37AD1650DCEAEBEAE1F57BD8AD9 Key = 0000000000000000020000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7761ECD209CB564EEACAB4E62DB26BDD Key = 0000000000000000010000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 67D23F0CF1A57BA0E43FE82A3F4FBBB6 Key = 0000000000000080000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D9732CE2055E7F935468A63A170B598C Key = 0000000000000040000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E9F396623AF12ADF24C0378F42F7B4BD Key = 0000000000000020000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 98D5AE45E15A836C141CF7F64DC7D551 Key = 0000000000000010000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EEFBED56D7BD47D088B3AD657A6CB8B8 Key = 0000000000000008000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A99342C96F331950D97AFBFC8C0D4E08 Key = 0000000000000004000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 25C35298C0A1224F2BEE7EE8AAA86E51 Key = 0000000000000002000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 66602FD71F84B2637B2283CD81DE3080 Key = 0000000000000001000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D48E45670FD978FA4DB161C0E5D59FC0 Key = 0000000000008000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = ECE089620BF6866A66FB6070C491C74C Key = 0000000000004000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 36CD300072D4EC94A0FF3595F7A2C1FE Key = 0000000000002000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F939CB3D8316B59600F164234E78D228 Key = 0000000000001000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 17C6258E6009E282661869D525F7D204 Key = 0000000000000800000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 45A32C5EA3E2E548A9E6313BEF957308 Key = 0000000000000400000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C2105CC6264024EBEC6BA0F825FD5163 Key = 0000000000000200000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 85F3D2169883A7CD54A67DA7C4AC613C Key = 0000000000000100000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B5FFC7D92EA2815C0F4DC9182DA160C6 Key = 0000000000800000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C9642C4E3F420CA73E8F1C15C6EB011F Key = 0000000000400000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1BD0EEF566BEFB4D57CE7120B731125E Key = 0000000000200000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CB0705AE3DB537AD1C202DD6635202DA Key = 0000000000100000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D88F55DAC599BEA8440B4BA9E3C50016 Key = 0000000000080000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FF227EC8AF4640198173A79B124CEFDF Key = 0000000000040000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CC55A4F4086043F1E1ABA9CC91E4395A Key = 0000000000020000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8D2BAD986865A229601855B024D9A557 Key = 0000000000010000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 343E1B000FEDAC000376EE138FD8F0F7 Key = 0000000080000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 765DF290B8D90C9169E6884A0D4D4B92 Key = 0000000040000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F9EEBAB9F5CEBF94196FEF3872C46881 Key = 0000000020000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 318B1983222E49F5B57E26E70890A5B6 Key = 0000000010000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D8DF0A98604C987283ACF7F211D906C7 Key = 0000000008000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 92697CF743A72D2D4D7864132A9ADE0B Key = 0000000004000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2C450C8BCDAA9CB59F930DDAE88CBDB3 Key = 0000000002000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4284A05C4A0AF59DFF15604ACBB82743 Key = 0000000001000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 986A05E8447024C8468A1EBF7743F689 Key = 0000008000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4A7E5D441526F7D4D2987AEDF48F0231 Key = 0000004000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F5D9875A70158C9C64136703D231E3F5 Key = 0000002000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3BC82EC5FBE24B5AAF230895BBA9DCD1 Key = 0000001000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EFF062AF33726C788D261FBFDDA15109 Key = 0000000800000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E2A342E2683D3F970983D941656823AA Key = 0000000400000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E16066A35F943A426FE47AD1A1FC69AD Key = 0000000200000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D89F891B578FF6B441E97849DD2F2798 Key = 0000000100000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4A800443B44112493226E08BD9521912 Key = 0000800000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2B504288F018B2A867597EB53EEA6DB1 Key = 0000400000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B3FA8074A573A00B4897DF6CD0D99B5D Key = 0000200000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 38B56FD4C1FEDF5282208EF5F796A2C9 Key = 0000100000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BFE421423C53A9942C78D04CB4B231D8 Key = 0000080000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EF102196C479E513AE8B776D524631B9 Key = 0000040000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AC38F8F6DF320D4409BA6A1CD93A482E Key = 0000020000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FB5D6CD1B6EE155D6744E5BE62A650F6 Key = 0000010000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 23A626E559D0B8E4E4AB3F7C38750D4A Key = 0080000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2CCA19AE45B976236D88E4E1AD3BACEA Key = 0040000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 052D166AA678A987C07256C582283986 Key = 0020000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D30979DDC6C09B1158FA41EEB6F2A21B Key = 0010000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C36705BB2A9BAFCFCB64C4468964D568 Key = 0008000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97905460E140685960B561204ABC09A9 Key = 0004000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B893B8766A12AAAD7691565C46651623 Key = 0002000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7978DBD4794AF35DFB0403423B4E81A9 Key = 0001000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4F990737145AAA9100BFEDCA53B69F6D Key = 8000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A223AA1288463C0E2BE38EBD825616C0 Key = 4000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EAE1D405570174DF7DF2F9966D509159 Key = 2000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 65F37684471E921DC8A30F45B43C4499 Key = 1000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0EE036D0BC32B89C1CEF987F5229E4A9 Key = 0800000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EC9D6557EED58E6CF89A746BBDB6C9B7 Key = 0400000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AD2314BF713CD796E8C7EC6E9C59CB8D Key = 0200000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 33D8944A2D2FACBBA555EC18543AFCF0 Key = 0100000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E0885D4460373469D1FA6C36A6E1C52F Key = 00000000000000000000000000000000 In = 00000000000000000000000000000080 Out = 4AE9A20B2B14A10290CBB820B7FFB510 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 2C6EE9F8F64B5B1B5587CDF17E84A791 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000020 Out = 29141D06A6B42CE22EFB8383CEAE325D Key = 00000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 2AE6E19905D89A8E53A1DF26AD5C89B4 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000008 Out = 1587FF28ABDF9DF5A3F4DAF7405D273B Key = 00000000000000000000000000000000 In = 00000000000000000000000000000004 Out = B598247AA82F5C79F9FF0E7EC61B83C4 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000002 Out = 0C5DABB01245E3A3544E291F3B0F250F Key = 00000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 9BEDCEA16BDE863526A937208CBF0ABC Key = 00000000000000000000000000000000 In = 00000000000000000000000000008000 Out = A174B66C47C53B2C34AA9F06FECBB7B2 Key = 00000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 333827335F88EBB93A0A7436E51398F0 Key = 00000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 03A7D7D70F4F50AE96835F12B73F79D3 Key = 00000000000000000000000000000000 In = 00000000000000000000000000001000 Out = B8B9F2029769952D9664A6FDE9706BBF Key = 00000000000000000000000000000000 In = 00000000000000000000000000000800 Out = A7DCE248EC5A060388CA14598B986454 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000400 Out = 1A21EED739C6C39A56E0B4C6A17D3375 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 9073DBCF760A0B9E0E84A2FD6DF164F9 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000100 Out = CEE83B85568AD8133D8842DC883052CE Key = 00000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 151940BA15A175FCD39CE2D3A0259EFF Key = 00000000000000000000000000000000 In = 00000000000000000000000000400000 Out = 9F997F2AC950E52666207183DB935899 Key = 00000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 015B7DF6BFB9367BF8F690FC0B77DEB0 Key = 00000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 4A7D36598525699F49667AF4B46BB99B Key = 00000000000000000000000000000000 In = 00000000000000000000000000080000 Out = 306248FD603DFC18E41CF0864D2C352C Key = 00000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 1367EC90627601E9C1BD1371454B772F Key = 00000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 85FE597694444D1A8D7F1CE219913F4F Key = 00000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 75BAF3E8194EA04577133509B50FF4C3 Key = 00000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 3EB8325BCA6C583DC04019F01D4BC90D Key = 00000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 240A1E99A51C7EED2E9127DB7D86903E Key = 00000000000000000000000000000000 In = 00000000000000000000000020000000 Out = 81B2AF04CC40E2E3DDFFBE3F6AEF8A33 Key = 00000000000000000000000000000000 In = 00000000000000000000000010000000 Out = 6970437809D0A34E5A76B22F88F5282B Key = 00000000000000000000000000000000 In = 00000000000000000000000008000000 Out = C12E44B3F253295CF742441FFA2712DB Key = 00000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 98E2FBF128A1E2F80CABF2DB3F9E62AF Key = 00000000000000000000000000000000 In = 00000000000000000000000002000000 Out = 3F2B1D74B9D0D84C0B0DDAD31352E67A Key = 00000000000000000000000000000000 In = 00000000000000000000000001000000 Out = E51D907B84D877250D0BCEC17D292DFD Key = 00000000000000000000000000000000 In = 00000000000000000000008000000000 Out = 19E6063C7529E5268E4A45703AFC8AC4 Key = 00000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 6DDCBD01AC098B04AAA084D4C579DAC9 Key = 00000000000000000000000000000000 In = 00000000000000000000002000000000 Out = AFC268DB7CD2A453EA87BA6A0E923DEC Key = 00000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 24B199E30672EF17362468CC8C0F4E46 Key = 00000000000000000000000000000000 In = 00000000000000000000000800000000 Out = B30C571F161EF0DAC78816A4DC1339FF Key = 00000000000000000000000000000000 In = 00000000000000000000000400000000 Out = 214CB9151303EDA5CD14E35E701DE887 Key = 00000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 57A991425DC55325EB159A0274140EFA Key = 00000000000000000000000000000000 In = 00000000000000000000000100000000 Out = 856CD3630F436DACD3FE27AB73F4A956 Key = 00000000000000000000000000000000 In = 00000000000000000000800000000000 Out = E5D5DC0D6834E44697BDD5D8427A054F Key = 00000000000000000000000000000000 In = 00000000000000000000400000000000 Out = CAB879F5684241583F4900B2653D76C9 Key = 00000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 43FE63C8C08E0CE5D1DAB79348F1B64E Key = 00000000000000000000000000000000 In = 00000000000000000000100000000000 Out = 1D7850062F3F8B2415F22BC4D95A1367 Key = 00000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 45D486C0AC551C76AA17E356404726F2 Key = 00000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 900FEDE23DBB68E48BA9D9806E606F19 Key = 00000000000000000000000000000000 In = 00000000000000000000020000000000 Out = F573C581080C5654A6C426DD8971E68B Key = 00000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 07AF806C0B6ECF9DD508C0D108572C37 Key = 00000000000000000000000000000000 In = 00000000000000000080000000000000 Out = 8C30672FF7F1DB4681BA36E48B3374A3 Key = 00000000000000000000000000000000 In = 00000000000000000040000000000000 Out = 0D56FA9193C8A6FBF653D75D3F61407E Key = 00000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 08C0C170A7B0F0C07E1CDEF95AEE8113 Key = 00000000000000000000000000000000 In = 00000000000000000010000000000000 Out = F05F7E94EC7FECF973EF5732B565E016 Key = 00000000000000000000000000000000 In = 00000000000000000008000000000000 Out = EB667F97B9D94B0C41C873C4B56B334C Key = 00000000000000000000000000000000 In = 00000000000000000004000000000000 Out = A065550C6371DEC580E16276E03F13D4 Key = 00000000000000000000000000000000 In = 00000000000000000002000000000000 Out = CDAC7C0A0E363FE8BA16BC11D1F6DC57 Key = 00000000000000000000000000000000 In = 00000000000000000001000000000000 Out = FF792A72BF23CABD13EA587C57D05D3F Key = 00000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 986EFA59113F5C8A66BBAA7EF978A125 Key = 00000000000000000000000000000000 In = 00000000000000004000000000000000 Out = B8CB15A238CA60157C3CB3317021B92C Key = 00000000000000000000000000000000 In = 00000000000000002000000000000000 Out = F262212AC5485BA7D92CBF5A9C58D8AD Key = 00000000000000000000000000000000 In = 00000000000000001000000000000000 Out = DF54C6D917675E73A3659560D5813E56 Key = 00000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 925D0E759AF1EB36CEEB0FB6D51FAB7A Key = 00000000000000000000000000000000 In = 00000000000000000400000000000000 Out = 99BC9E5870190269C4FE5B6FC23C8D8C Key = 00000000000000000000000000000000 In = 00000000000000000200000000000000 Out = C0380B9660722514C1EA4322FE45955C Key = 00000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 66521E5F953F2D2E237A259BDEE9C400 Key = 00000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 1EB43E99040A614F77361601A1806651 Key = 00000000000000000000000000000000 In = 00000000000000400000000000000000 Out = A11495F4358A5FA63024A2DC02E20480 Key = 00000000000000000000000000000000 In = 00000000000000200000000000000000 Out = CF4D5EAD4E69313709EA9399F5ABF8D9 Key = 00000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 6CAC3A5E20E13162FB3A31804CB6C7AE Key = 00000000000000000000000000000000 In = 00000000000000080000000000000000 Out = BFEE053ED49F33F5A388359721FE20FA Key = 00000000000000000000000000000000 In = 00000000000000040000000000000000 Out = B2FFBF55E5E2E0CB0935504430E173F8 Key = 00000000000000000000000000000000 In = 00000000000000020000000000000000 Out = E521E33E82289A176467E24CBAD5D92C Key = 00000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 9609C701F895754A623D3BF3EAC48334 Key = 00000000000000000000000000000000 In = 00000000000080000000000000000000 Out = C80F1E35ED81AC45835129665CA5C0B5 Key = 00000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 27FE1A77E6BF18887DBF7D48FC1EAB65 Key = 00000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 8E2444DDF34F5320A150471E01AC2F85 Key = 00000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 9CB3B00CA62767D7A1D45AF44D74957F Key = 00000000000000000000000000000000 In = 00000000000008000000000000000000 Out = A07252FB0F05EA2264F558BDDF162BBB Key = 00000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 4CCD47A10722175D4018709698E52881 Key = 00000000000000000000000000000000 In = 00000000000002000000000000000000 Out = F9DED80456581D2E6F09BDB09B77C04A Key = 00000000000000000000000000000000 In = 00000000000001000000000000000000 Out = DCA8A545689A58F663B0B7A540F41E24 Key = 00000000000000000000000000000000 In = 00000000008000000000000000000000 Out = 6801BAF0FBAF3352F3950F0940173352 Key = 00000000000000000000000000000000 In = 00000000004000000000000000000000 Out = B969F1B6F56E885025F12E58F87B4099 Key = 00000000000000000000000000000000 In = 00000000002000000000000000000000 Out = AA9F1568B6D0F5AFAC34847E0D7152B2 Key = 00000000000000000000000000000000 In = 00000000001000000000000000000000 Out = A96B20E51FCB48A0C58306086094154B Key = 00000000000000000000000000000000 In = 00000000000800000000000000000000 Out = C9F389C56576B8C74A687BC5AAB8D503 Key = 00000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 3FB63882764779902321A2E594275C6B Key = 00000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 160C3C22EF0B0D3E4F2FDC914138C229 Key = 00000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 265AC0BE8E47750E7CA22BAF01153B4D Key = 00000000000000000000000000000000 In = 00000000800000000000000000000000 Out = C1842F4CA2DDC78E55CD91E07AD23A12 Key = 00000000000000000000000000000000 In = 00000000400000000000000000000000 Out = E47D5889218FF4CE45EA249EDC9B71C7 Key = 00000000000000000000000000000000 In = 00000000200000000000000000000000 Out = FB7566732AB52FE99454CFB07A0F1F0A Key = 00000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 5FBF0927A8B293A04024B187AB1BF6C1 Key = 00000000000000000000000000000000 In = 00000000080000000000000000000000 Out = CFFBC514515878E10E07556988D8E721 Key = 00000000000000000000000000000000 In = 00000000040000000000000000000000 Out = CD3EEEBA162879FF20ABD158C236E3F3 Key = 00000000000000000000000000000000 In = 00000000020000000000000000000000 Out = F96D1082131DAE899EBD32CC562F0BB9 Key = 00000000000000000000000000000000 In = 00000000010000000000000000000000 Out = BDB475694748128D9959141682174CAF Key = 00000000000000000000000000000000 In = 00000080000000000000000000000000 Out = A5E0C2E39B9821F2CD42875B0EC0A65E Key = 00000000000000000000000000000000 In = 00000040000000000000000000000000 Out = A1397FFDA7C2A4E9A60E0AB48947B933 Key = 00000000000000000000000000000000 In = 00000020000000000000000000000000 Out = F20B001C13A0F857FB89C64FFF4CDA83 Key = 00000000000000000000000000000000 In = 00000010000000000000000000000000 Out = F38EE20A32B15A5B9129B67BA1FF3125 Key = 00000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 41ED367E96E013C651AF3FAEA764FE40 Key = 00000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 55C30FBD291D89E50A9DADCB48E52296 Key = 00000000000000000000000000000000 In = 00000002000000000000000000000000 Out = 3FE7F1A404C0E4395FCC985F369735D4 Key = 00000000000000000000000000000000 In = 00000001000000000000000000000000 Out = 6E131502B6A4F30B56AA52EB67989809 Key = 00000000000000000000000000000000 In = 00008000000000000000000000000000 Out = 3EA36D91871DFF568FBE623DC31EBCE5 Key = 00000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 7C6DF10118A3AB6545A504790543C89E Key = 00000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 1DFF6937399E060342348C34E88B5985 Key = 00000000000000000000000000000000 In = 00001000000000000000000000000000 Out = 87DCE0F133442B7D4FAF7082F5489407 Key = 00000000000000000000000000000000 In = 00000800000000000000000000000000 Out = CBEF868AE34C80C542766358534A148B Key = 00000000000000000000000000000000 In = 00000400000000000000000000000000 Out = DF23BC0E0C0B7F502E0210AF8B353165 Key = 00000000000000000000000000000000 In = 00000200000000000000000000000000 Out = E9732D7A112DE03068EC10D10AF8D972 Key = 00000000000000000000000000000000 In = 00000100000000000000000000000000 Out = 1D17312BE6675B0797C5175DDCC1DE7E Key = 00000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 0DB0D17349C89E090C845CBEF963F225 Key = 00000000000000000000000000000000 In = 00400000000000000000000000000000 Out = C7128FD1A5EF5202550873EA885551C5 Key = 00000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 761D7F9855C95AB6148833503958F96E Key = 00000000000000000000000000000000 In = 00100000000000000000000000000000 Out = 1D406059F0E1030FA66C52A46751D092 Key = 00000000000000000000000000000000 In = 00080000000000000000000000000000 Out = DE2FCC081DF9B136EC62922351E18D94 Key = 00000000000000000000000000000000 In = 00040000000000000000000000000000 Out = 5F93FBFB11A527DFDFB5E4713E431E34 Key = 00000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 6C2C4F22E738C56B5246971540E5E3A1 Key = 00000000000000000000000000000000 In = 00010000000000000000000000000000 Out = BFF82E042A92224FBD3D41C22D07B610 Key = 00000000000000000000000000000000 In = 80000000000000000000000000000000 Out = A3B35DE7C358DDD82644678C64B8BCBB Key = 00000000000000000000000000000000 In = 40000000000000000000000000000000 Out = 04ABCFE4E0AF27FF92A2BB10949D7DD2 Key = 00000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 8F773194B78EF2B2740237EF12D08608 Key = 00000000000000000000000000000000 In = 10000000000000000000000000000000 Out = 8B1EA69EE8D7C8D95B1DE4A670EC6997 Key = 00000000000000000000000000000000 In = 08000000000000000000000000000000 Out = CEE3C6CE66A7AC0C1767923B263B2EBD Key = 00000000000000000000000000000000 In = 04000000000000000000000000000000 Out = 88DE61FFC3AD277687626D5F7705DEF3 Key = 00000000000000000000000000000000 In = 02000000000000000000000000000000 Out = 69DD947EFADCD15A06A0D79E078B35AE Key = 00000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 32F1FA100E43561146DCA08D15B90636 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000080 Out = D9D076F0512B4F29E15752A21B270BB1 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 9668F388DD4F122A4D9DD8D6B8A322D5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000020 Out = D3F12A67FABEC165545D25F5E5FEAE6F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 97580203AACE7E6F0DEB71BC631D9E40 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000008 Out = E11B01524EA1F465A2A20043EB9F7E8A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000004 Out = 9BAC7EE501F03D6DEBE0F9EE68FBB3C1 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000002 Out = 444E6201556F1C9D73299183B7ABCA9D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 497EA15A5AAB3CB115C3E0091C2E4047 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000008000 Out = A306CFDAFE5C8C2A955956BB61FFE5CD Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 4815634545F268ED3BF50021AC0265B2 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 3B075AFF8F75956DC4BE7D5121BF07B6 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 8EAA16AEA0535498D21245BAE97ED0D4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000800 Out = AFFA71EA9A2F6C4A018CF2F5F22B9B13 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000400 Out = 93B8DD3F9A59DD9231B0885601A2354C Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000200 Out = EE23DB4E914D12A53BE8428161F3DE24 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000100 Out = E76E230F4BA91426325C16FA168CA44B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 14148C222620E009AC51EE2321641D25 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000400000 Out = 319D430B55E2A2C942B089755D4C6035 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 774D83990DCBAF6B9186DF250DC721A9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 81CA67898765727FFDEDBC7DC25EC8FF Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000080000 Out = BEFC19FD8A41103B6892AD4A3CB08122 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000040000 Out = CC2DE08FA80BE8A13C8860174AF9F55D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 4935E35A180FEC382D3DCFD5ED572AFB Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000010000 Out = D78FE49AB8E11EBA118687045D04A70F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 5DA9109BC3193E5D2ABA0CA577CBBCD4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000040000000 Out = BC46C6FE8F7E549CCC402FC4633C670C Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000020000000 Out = 60A11AFFABBEE4D5D5564A74C7F94C91 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000010000000 Out = 84DD300A8FDE4AC126F41EA0692F3E07 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000008000000 Out = 3734062F8FCF37FBD1C48B5AAEF00C5F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000004000000 Out = EA4491C7F5A9D671DA358C535965E1C3 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000002000000 Out = D46899CC964A2A082C80AB7E0A4B153A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000001000000 Out = 45A5744C068AC6C7BC028C4D40885F20 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000008000000000 Out = 4FF5F65E2089279F1FFF7BF06EC6D527 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000004000000000 Out = B0C818F70672EF5E6F20515214DDDF7A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 2A4D0F00CA19EDCEEF86D7F283221A97 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000001000000000 Out = F9E6A04D60D5C06994E196EEF788ED59 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000800000000 Out = 602BE82E95A1BEF5C2742099A6CB70D9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000400000000 Out = B53F1354FE1291679B6D418AC4A3E26D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 0F68F7C1FFB5FA997D8CC007CF4F5BA8 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000100000000 Out = 3B90014CDF2D614A339B48A6F374D1C4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000800000000000 Out = 3D8075B415AC9DEB6008B51597CE28F4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000400000000000 Out = 675A3322BCCCF4D78F3376ECC2C8A415 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000200000000000 Out = B8CD6C76DAD863B3A2342265A42C7878 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000100000000000 Out = E0F6B38346E3E0AE2C5763C25C01ACB9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 96E295724B3F296016A3F6853B679079 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 305E7A77DC3B62F110688AB334002132 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 324E96A82CE897DAB3850047C38E9B18 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 23EB8F12867D39E24E5A71606E3B5C1E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000080000000000000 Out = EC74DC99FDB377E35EBA6E5C920C9E20 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000040000000000000 Out = 12F92E9FF675FFE132FEC127A61ED1D6 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000020000000000000 Out = F8BFC6819A8F1683DD314AFEDAA80F33 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000010000000000000 Out = 28552459A3EB05AE69463C26F6413B73 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000008000000000000 Out = E018CED8C1FC6FE1849E945550602D46 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000004000000000000 Out = 8A46B1349AE83730266EBFB1D62BA1EB Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000002000000000000 Out = AEA0972033ACDA2FE228A3619511B0CF Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000001000000000000 Out = 6BCD123081CB4DA2197A9204947C4765 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 1CA839C433F49B9CAC257C7CBE38C571 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000004000000000000000 Out = E6D1727A0BC893BBE5A048B73296FF43 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 6B38158548081550B6931773C3348995 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000001000000000000000 Out = 4159191656BAE5F059625051F329E674 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 5684B43817E24580EE373B54B57126C1 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000400000000000000 Out = D31DC022A55A6CB7116D5AA79713EBEF Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000200000000000000 Out = B9B7F96A83494D61C0D476E15CF9FC40 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 9F61E523005A37B71A589C35E2320580 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 2F19CFB18D4B538C688FF0FF73EEF402 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000400000000000000000 Out = 2B2D1598BD1A57A6277D0F1182423E70 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000200000000000000000 Out = FB589E7803F8DEC257644DD8968B3BF9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 4E8F6CD48030ABFB6BFAA8C79DF29132 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 594C7334C5C77F1F311743DBF880A848 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 8B9060A226A976B4D8701B61A0E16E05 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000020000000000000000 Out = 9D5D7F82A45E543A28769767F0B4220B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 7F60DD3212B5FD34A33E95B7CD3C98B4 Key = 000000000000000000000000000000000000000000000000 In = 00000000000080000000000000000000 Out = 67A133B6981D6CFFFB0894B5CD60C384 Key = 000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = B9724EFA90EE77242862C6D107053799 Key = 000000000000000000000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 6CC4B4806D82C681027375553BEEF871 Key = 000000000000000000000000000000000000000000000000 In = 00000000000010000000000000000000 Out = D05EA01E7AE0768FFE5B499D4A0EA833 Key = 000000000000000000000000000000000000000000000000 In = 00000000000008000000000000000000 Out = EB5259D268854E583B02C445F0DBB33D Key = 000000000000000000000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 273792A497CBE6058FB8CE518C05A9A7 Key = 000000000000000000000000000000000000000000000000 In = 00000000000002000000000000000000 Out = 629EE820F46138558FE7AA6D547F971E Key = 000000000000000000000000000000000000000000000000 In = 00000000000001000000000000000000 Out = F04FF6EC27F7412350CA62E6A3BE479F Key = 000000000000000000000000000000000000000000000000 In = 00000000008000000000000000000000 Out = CAF26B388D8A81C408FC3506CA523C72 Key = 000000000000000000000000000000000000000000000000 In = 00000000004000000000000000000000 Out = 79A075A5778E5BED4F0663FC86D92A56 Key = 000000000000000000000000000000000000000000000000 In = 00000000002000000000000000000000 Out = 90E59EE9F97DE1590D4C454169890932 Key = 000000000000000000000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 30DF4AFE05F0D0EC4495C4A7A3D3A1AF Key = 000000000000000000000000000000000000000000000000 In = 00000000000800000000000000000000 Out = BF6D54D156EDE791A177F8A5BA5DC1D0 Key = 000000000000000000000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 2C2286B2537AFDF52A7EF59D620E7E46 Key = 000000000000000000000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 545F83ECF5366475A1867BF81DE59780 Key = 000000000000000000000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 5E7648E3575B7A02BEA8C69A19ED06BC Key = 000000000000000000000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 99B0CC109580893A14B960F78C867DF7 Key = 000000000000000000000000000000000000000000000000 In = 00000000400000000000000000000000 Out = 4FBCBA60C491EFA9C5B8B8CC9471C26A Key = 000000000000000000000000000000000000000000000000 In = 00000000200000000000000000000000 Out = 7A3B3E4FA8DF6DD964161EF9ADB7EC90 Key = 000000000000000000000000000000000000000000000000 In = 00000000100000000000000000000000 Out = DBA5DD3EE2B0F03D402D5BADAE4E34C9 Key = 000000000000000000000000000000000000000000000000 In = 00000000080000000000000000000000 Out = 2334F78508F6259862FAA5842E6B1E7B Key = 000000000000000000000000000000000000000000000000 In = 00000000040000000000000000000000 Out = F15ED8B81B74BD35586E1594AB3B0F73 Key = 000000000000000000000000000000000000000000000000 In = 00000000020000000000000000000000 Out = A654EE4634624A3593DCC272C0AB8566 Key = 000000000000000000000000000000000000000000000000 In = 00000000010000000000000000000000 Out = E71506E96ADACE02580EA035601850C3 Key = 000000000000000000000000000000000000000000000000 In = 00000080000000000000000000000000 Out = 00D43BE69B9387B28A4234D2E5BEF038 Key = 000000000000000000000000000000000000000000000000 In = 00000040000000000000000000000000 Out = BB828D0A587EA543A78A60B6F63CC159 Key = 000000000000000000000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 427338CBFA6B652CDCE9C30F29F6E660 Key = 000000000000000000000000000000000000000000000000 In = 00000010000000000000000000000000 Out = D26286844B1BE4D73B44B77A2C4449DD Key = 000000000000000000000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 28D9BEB7444B7801C510D74C90F3183A Key = 000000000000000000000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 9D8949E7F531F30FFD1C6891154FFB8A Key = 000000000000000000000000000000000000000000000000 In = 00000002000000000000000000000000 Out = B329A557C9BFED767B44CA25F43C0924 Key = 000000000000000000000000000000000000000000000000 In = 00000001000000000000000000000000 Out = 1909B5B407CB28E7050F8889104B73F5 Key = 000000000000000000000000000000000000000000000000 In = 00008000000000000000000000000000 Out = DA51B1E831305D9E6AC7F0CDF49F3AE5 Key = 000000000000000000000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 4A091855C4AA2436F3C61A11FA4B9DA5 Key = 000000000000000000000000000000000000000000000000 In = 00002000000000000000000000000000 Out = DB8350915843684F18B4B358579A9446 Key = 000000000000000000000000000000000000000000000000 In = 00001000000000000000000000000000 Out = 13A1376760534FF5F7D5ED1B62D93D4B Key = 000000000000000000000000000000000000000000000000 In = 00000800000000000000000000000000 Out = C2613B1D8937C2B1C9D7B0249D938E95 Key = 000000000000000000000000000000000000000000000000 In = 00000400000000000000000000000000 Out = 3FB48878619B70DB717F410550B03069 Key = 000000000000000000000000000000000000000000000000 In = 00000200000000000000000000000000 Out = 0589BD5D8ECDAAE7ECABC8816EF3C7EB Key = 000000000000000000000000000000000000000000000000 In = 00000100000000000000000000000000 Out = 5AC9C030789D810698AAB706BA6BCCA8 Key = 000000000000000000000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 4BD66B7E897E76BF51F1F00671092169 Key = 000000000000000000000000000000000000000000000000 In = 00400000000000000000000000000000 Out = 4A72C588A0FA490D521640D1F245E4BC Key = 000000000000000000000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 32205DCCC1D7A129B934C6FABAADEB1C Key = 000000000000000000000000000000000000000000000000 In = 00100000000000000000000000000000 Out = 74F79A4CF6F99359D7EC47DA87104658 Key = 000000000000000000000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 2810428BA5177BB0D91C11683008E68D Key = 000000000000000000000000000000000000000000000000 In = 00040000000000000000000000000000 Out = 3863C205AED373BB3EF9E6D85D0AD08F Key = 000000000000000000000000000000000000000000000000 In = 00020000000000000000000000000000 Out = DD207AA0894DFBEDD7D9802823C04D7B Key = 000000000000000000000000000000000000000000000000 In = 00010000000000000000000000000000 Out = A6EAC9ECAAE9CC8621198BA547E9B74F Key = 000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = 23F5F432AD687E0D4574C16459618ABB Key = 000000000000000000000000000000000000000000000000 In = 40000000000000000000000000000000 Out = 56CD894936F6E9A4A4304CAE06F97CE3 Key = 000000000000000000000000000000000000000000000000 In = 20000000000000000000000000000000 Out = B604D94F461AF9F4771BC53F8E3C227B Key = 000000000000000000000000000000000000000000000000 In = 10000000000000000000000000000000 Out = BB852AC4756880630D6D63951D3D2602 Key = 000000000000000000000000000000000000000000000000 In = 08000000000000000000000000000000 Out = 319C206CD98D2C98993FC2CDAAB3259C Key = 000000000000000000000000000000000000000000000000 In = 04000000000000000000000000000000 Out = D271595956451E3B7D957A3485ADE9F7 Key = 000000000000000000000000000000000000000000000000 In = 02000000000000000000000000000000 Out = D4257D927C7F2A6390DF198B573DD1BA Key = 000000000000000000000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 7610F6DBE8F3F19682DCC01AF57DCD79 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000080 Out = 2055DEA7C84B008C6FAEB4B192795ADA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040 Out = CB98F1C490F33B4F7A3D3E821B3551F3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000020 Out = BB654CB6528C21D78E5CB79D5DA677A4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000010 Out = E0B2836175A6808D61FEA4CB529401F8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000008 Out = 824C5F6FECE3E0FC4293821B987B3BD4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000004 Out = 9D9286D5E97CCDEC47E03CB12C34B339 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000002 Out = BC2C09F0B3FC63CE17F1BE7F267E3E0A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = AD86DE83231C3203A86AE33B721EAA9F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000008000 Out = AE042A69C879D524DC4BCC70B84B1B37 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 6D03E3381991EDC800513D30BE07DE5A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 576807DCB0F1A8D73904DBAA84BE818E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 96DD8A88157832B7E45C639C25170333 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000800 Out = 9C1A7B580B29888F397743E76C4E7A39 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000400 Out = B77FE10336DA7531E1BF2DC41C7E6E95 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 8658E3A6DBAC89EBA6E045881B172E9C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000100 Out = D2FE26FC85AA40C3C6827B0DFF96AB0C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 56C2530D97A43944BE7874E6FA9121FD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000400000 Out = AAECA9394EF359D851CC9F244D4D1E54 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 71BC0D1DEA15FE3BC4AA6DD829C8E957 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 267FCBA295A670CB9EC18AFBB819CE91 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000080000 Out = D18CC92248E209FF8C9AF4AC93588727 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 63E94B466C955B7204285E418A156B29 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 368A8D2610A773A477B924028DAD455F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000010000 Out = B210E51F2C154205DA4A1D1B892DCC63 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000080000000 Out = FFE1B843D7DC5F52852705221ED5EECA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 0E8B9ACE62AA90B258D8090EF2188BC4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000020000000 Out = 96961DBEC1C476AE00972E54DE621F19 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000010000000 Out = A31A56562516BDAE02215CD5F0DF0569 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000008000000 Out = A2316B6B9E6AD55D7013A24BDB1EAEB9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 709F715313E17EFB3ECAE3A5D9ED94AF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000002000000 Out = BCA04C7CAB888EE6950B7696F5899502 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000001000000 Out = 6655B0542BE057664DE9B2733CA0E555 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000008000000000 Out = 7407623C54E38D13B48B84306DD8F244 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000004000000000 Out = B3D6DC13CF612951F9ACB05EAEEDE7E3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 301378F0D3D30AE6613A9E7CF113821F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 9F227635FDAB7D31A7E1F08BBCC34371 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000800000000 Out = F08620D46001C366FD6DCBEBC806C182 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000400000000 Out = CF51A2A45F9CBFDE788D108B1B4D33A5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 3E70F946FB77C6841D9F001104347659 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000100000000 Out = A3EB98B3BE360FAE3B8EC43D5B77FF7C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000800000000000 Out = 4F6E01D8A2437547B50E070498BCD4F9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000400000000000 Out = 4F80F4048084E1150AA6A36A6BB3D7EA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 311471549CCBB1EC27BAA384EC32F30F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000100000000000 Out = 3C4DA8FF90590FB9FC529580DD40E7EF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 60AE8E3F60A099EEF38EFF4ED27DE3EC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000040000000000 Out = B33C4D6DF1259C4E5799D19B375420EA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 4D1BA08EB1E30F2A3B3E5D1DAE9792A9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 3CF54D30E493CDD7439E1F34FBB098F3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000080000000000000 Out = F8958250D6D6772B20051E36666906BD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000040000000000000 Out = B4ED85D72C04A357958D7045BE13C4FF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 294A16831BF660536203030B59DA20F3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000010000000000000 Out = D189C5A12722ABFEBA16F155975068E6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000008000000000000 Out = 9A9248C1FEDF207CE64F68E73B22A77C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000004000000000000 Out = CC668772F50D2ED7DF83FF85A0D76576 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000002000000000000 Out = 685CA45E48D087563E1886DBDD63342F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000001000000000000 Out = FCE8BFBA1BB12F4990C6DF32C6D71EBD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 645D7562E523058E7708FF03F1712BE8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000004000000000000000 Out = FA9CAF3BBC2D52806EF9B3D01F5B8398 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 0D2638505AAE1A5532D74C4F45C136D3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000001000000000000000 Out = 9721099476B1F963EF87DD29E82227F8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 237AE2CDD5D2819EDAE0947AFB9D040F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000400000000000000 Out = 8FA78734E057E8A9486862E00A9886D8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000200000000000000 Out = 983F654090C661264BE8F921063B7DE5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 645F0F938A2898A3869190A1D99A3078 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 4DDBA0F24964591307AB909009BB41EF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000400000000000000000 Out = 5D9333754035534CEF4EEFA73EA3F8C9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000200000000000000000 Out = F51234B609D397B1D6DA8BB625C0993C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 0AF5205E41F184D0989A78BF149DB675 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 0EBC3926D924F37BFD716F404CA8450D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 53CADA57C7855AEB96B48F8C85915DE9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000020000000000000000 Out = FD8E2C7604621D13E64B58315DCC65CD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000010000000000000000 Out = A7126988773129D5F6CC330C1A0EF30B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000080000000000000000000 Out = 72C791409F94CE23F4CD61D714670B39 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 6AD3CCBC31E2ECF88C6B54F84E638AA2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 9FE143250D00E25696B01E0A2ED05DB3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 3ABBF724E6C7B2D05D93A2C6D058E5AC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000008000000000000000000 Out = 59300BA5323CF6D84A9FF12B042A5AFF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 4AE9F03EF61BAA670CE46F3A6C205BD5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000002000000000000000000 Out = E33261C4E54AB7B117C3ABA1C9E11C1E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000001000000000000000000 Out = B84E741AC92A42F37A77F05D6F464E10 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000008000000000000000000000 Out = 0F6D2E73CF929A92BADF0A372FFB31A5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000004000000000000000000000 Out = 2002487C2CFE5A223E3A3C19A6B23670 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000002000000000000000000000 Out = A9E22B14D403C7F0FA9D95C064CBA9D3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000001000000000000000000000 Out = CFD3A8EE62F68692A8917C814290E979 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000800000000000000000000 Out = AECA2C8C0CA8B6F0EF594A13C85E83CF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000400000000000000000000 Out = E74D77BB281F542A0A78C3D8436783F4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000200000000000000000000 Out = B81755986C8B60A935F5D9169A2A7655 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000100000000000000000000 Out = DE964C9FF34F5A79FF43C6AB148DC395 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 0F7CE54A338AB05E2C38F1725DA8B127 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000400000000000000000000000 Out = CAD8158D26EED67D4355BB66D0812ADE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000200000000000000000000000 Out = 5332616A057A657FD2FD6562AF33EFC9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 308CD48EC851D7C1251174228B943B11 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000080000000000000000000000 Out = 29A5D9977C881DB067136B755BB68E54 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000040000000000000000000000 Out = C0F6B4881776765507CF91DB0A32C70F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000020000000000000000000000 Out = 47E518209CB5533F9A7EE02C4F07391B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000010000000000000000000000 Out = 58D7E0D60E315EEBA97F0DFA2D7307B0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000080000000000000000000000000 Out = C02ED6499331AF8C6CF30A63BB5E89CA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000040000000000000000000000000 Out = B5F166B94EC31A17662E24757FBB3FC5 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 17D20FBDA96D4AD0D99DAE64DE5F317B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000010000000000000000000000000 Out = 320FA060BBB901F66A9E4CFF221E6A4A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 3A259B7AEE3155C0C4DF7A32EF40FB19 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 028EFD3B6E686C87B402151F414B13AD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000002000000000000000000000000 Out = D4F61CC61FA1DBD68B8C48541AE77289 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000001000000000000000000000000 Out = DFCCE96C8C244586A3BCF098306C6374 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00008000000000000000000000000000 Out = BD5426FFD3CC9FC735EBAB7C72FD2D9B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00004000000000000000000000000000 Out = EA3C7C9B02AE7297B4BE551C8C551440 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 11BB660CF8431F2625AB9EF603975BB7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00001000000000000000000000000000 Out = B666AA7C5BA5209CBCEDE07EB66064D3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000800000000000000000000000000 Out = CAD843E927DDE8F92DBBB33C1B4E87F9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000400000000000000000000000000 Out = ED29F7805804E2E95F664B2E36C20A67 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000200000000000000000000000000 Out = 980F61BF6EBDE1A30607A1D51FFFB8D6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000100000000000000000000000000 Out = E47A19E8579807B5C44AC62619372673 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 2B451B22A3EBAB1C7A7619551DDF149F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00400000000000000000000000000000 Out = 3ABE3CAEDA54E5583269803BE04CBB2C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00200000000000000000000000000000 Out = DF581405DFBDEFACB35AD3BC510FE895 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00100000000000000000000000000000 Out = 45B3C3DAC439F884447567B282DE329C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 4192DE2B562CDD43EC4358EA730250C3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00040000000000000000000000000000 Out = 27E310D8032E16CF970F635C517E7D2E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 573CAE2A23968DE1D40036C24F9FEFA4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00010000000000000000000000000000 Out = B4AD06B55E31DE8F1F77C2B7AE8B73FD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = 8314675E8AD5C3ECD83D852BCF7F566E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 40000000000000000000000000000000 Out = 893BF67B1A845579C8FADC05BFDC0894 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 302F8325DEB1E1A0955D6273368A0DC4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 10000000000000000000000000000000 Out = 917B2F6A11DDDCEB53FEA01E194A6CC9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 08000000000000000000000000000000 Out = 8229E6539268BB39F3218E2903110C4F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 04000000000000000000000000000000 Out = 935A7835E2FAF9F7F20CE85662EE281F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 02000000000000000000000000000000 Out = DF5E38BE0362C35E8AF472C6327987DA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 07E5E5AD7097B849BADC2D5D803B7F6A Key = FFEEDDCCBBAA99887766554433221100 In = 1032547698BADCFEEFCDAB8967452301 Out = D5BAA00A4BB9D8A7C981C8DC90D89D92 Key = FFEEDDCCBBAA99887766554433221100 In = 145F0B8B663176B95DCAB7E9DCD5CC24 Out = 1032547698BADCFEEFCDAB8967452301 Key = 8899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 In = 1032547698BADCFEEFCDAB8967452301 Out = DA860842B720802BF404A4C71034879A Key = 8899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 In = B2696BD0D98C17953E4239225D27202C Out = 1032547698BADCFEEFCDAB8967452301 Key = 00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 In = 1032547698BADCFEEFCDAB8967452301 Out = 93DF9A3CAFE387BD999EEBE393A17FCA botan-2.4.0/src/tests/data/block/shacal2.vec000066400000000000000000010677141322470703100206070ustar00rootroot00000000000000[SHACAL2] # From Bouncy Castle Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F In = 98BCC10405AB0BFC686BECECAAD01AC19B452511BCEB9CB094F905C51CA45430 Out = 00112233445566778899AABBCCDDEEFF102132435465768798A9BACBDCEDFE0F # Tests for short key handling Key = 80000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 361AB6322FA9E7A7BB23818D839E01BDDAFDF47305426EDD297AEDB9F6202BAE Key = 8000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 361AB6322FA9E7A7BB23818D839E01BDDAFDF47305426EDD297AEDB9F6202BAE # From NESSIE submission package via Crypto++ Key = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 361AB6322FA9E7A7BB23818D839E01BDDAFDF47305426EDD297AEDB9F6202BAE Key = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F3BAF53E5301E08813F8BE6F651BB19E9722151FF15063BA42A6FEF7CF3BF3D7 Key = 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E485005217441B60EE5B48EE8AF924B268B6B952D7F593E6102AC83D7DA72838 Key = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AE70E355CB7E26FF12421F46CDAD5CB98367FE0E86CC234EDF97481765CD1AD9 Key = 08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 00CECD0B01311F881018E7A20BCE169766C089D91FF161346C4E1BD122EA199F Key = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 47A879CB6785AD37119C450CD50E9A36FE318FA8E7B6C6E0FA963430122F33CD Key = 02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CF3D53B9F9F7CA2C66738A4C09CEA9212C056F525BDC26F263FBA1B482EDF503 Key = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A274D404E83E82817389A2CB7B528C792A0E80DE879A5A67DE633B0B7DD57B7B Key = 00800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 09B3AB9332301D4E3C239D192A4221AFD43F6829A705D396FA96BDE1E716BC38 Key = 00400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D3B9AB867A6868C4400D200979055C8F9E3A6BFB40D1F9E376B9EC89223D7050 Key = 00200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4F27041481DCF574586CD6D5B72F2E806B0DBC351FEEA624112897A8A64CDBA9 Key = 00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 77CEC8EA64BB7FAE966D030FE4CF318C318DBEBAEB896F31FAA3C9CBA0AE125D Key = 00080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E6F96E0217B8BDC6BBF30CB91C05325F493EB076E505FC6469AAA2BBB3A8A60B Key = 00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = ED949C1CFC555EC7192464AE86EC0334AD1198C2DBA36DB38CDF7160C950D474 Key = 00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 41EB01CC3875F31A6C8D7008C958BBB164813C59435B01879199979FC4762B26 Key = 00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CCE7C4F96A665DDD23F39A78A3C7898E5F945FE908F1707DBED08BA6BCA3A58E Key = 00008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5FDBD5741AB5BC53E8C75F4497E37D5BE92B89D2424A11BBF189449AE005E2E8 Key = 00004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E6C00B21A5B89F4FE9251E53E7AFE30D6C8721678BF842575EEE185E85632778 Key = 00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FC19871F6E933014D92721D77BDF4E0EF528A325D5DC979536D6C46457CA066F Key = 00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A195202A93364212B989EB2C667EE05881657AD95FB6B3EE62DD21EB73347E56 Key = 00000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A25B4FB9B4F8418514A1A04078DFBDF73B83B936A887AD6B1B672F1C2AF128CF Key = 00000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = ACB2AB0F22068D36C160D668ED300DCF32C66FB8447594878DE1B1A83B414E13 Key = 00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A5AD217E39C9B40A921B4E52B1B47649C72631E7A99FE4897A92CD1A65BF8BFF Key = 00000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1185C198ABA5AD97F5DF7850284CD5E34BBE5E0EEC3CE4ACC4FC0A3CE3FA3BEE Key = 00000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7AC85AA2C5A9A219B8E437C65913738628EE442F56BD57292C8A1B36026B6664 Key = 00000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6140F926FA90F091603D23A4876A3A5598890CB1F2FDE64E43C50630BE4101D2 Key = 00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 365135682290CB40D83228B3F26FD63266EED9C72DAC991510FEFA9B56466E8F Key = 00000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 928EED2E262D9E398ADA06151ADFB35F34018114E97414C75E390C8EDA8D2440 Key = 00000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E362280E66204F47E8FB782D18522AA3E1D527C15EBA88E76DB5AF44E156BB45 Key = 00000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 807E3938AF9C9F0233FDA70B0E26028B390101F238ECFBD53EAE8E2D86552DBF Key = 00000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E7D3FA388C4E07ADD32E188BD09264A2BD19F0F7EC5712AC05C47B49C7FD6651 Key = 00000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 891CFD4A18F35239FD4463DE95FE9CAF4569AC82766E457315C123FB5FE6A397 Key = 00000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5C8E12B2572ED949494B324383806FD61B7CF0479DEB5D62028E83B7091BB039 Key = 00000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6F071D68C107B19B9949A6B7AF2C79EDC40FBA9BD07674AB3B1DB8CDE0A9637D Key = 00000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FD720D4ECFB7B68BA48C52E2F69FE268773D73B41723AA51127895B14C516F34 Key = 00000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0D3D7DEB1F8742BB22C4A3FB88C7C07CDCC8165ECF624C95FD8838D90D465B0D Key = 00000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 06A524998D1FEA6AF6E4015B9A16B7A447F50AE0A8902E6E3308D3B47E98C4F1 Key = 00000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9FBDF43AB1294164BC968E113673BB11195AE39267BF2537F0E429E3C10B5D2F Key = 00000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 81C4C7F2144555C888D876787EE62BC03EBB57093DB3DDE806918707684C8C52 Key = 00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F62E7B237C98C5727D4F267AE17932AAC4DAEF0CAF4C02176B4CBB902ED164D1 Key = 00000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 99CAD86B7E78D9B2ED9DA56F27C9AECB49CBFFC287930CEBC1BF06EA94541E9B Key = 00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = ED1F4429D5C36B2C16D598A2CE52D9C84E9DE7CD0B4899E47ADCB999CAEDB0CA Key = 00000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3FEF41084D9CFF6111C40F9656C46D3892323465630B0C1D082255222847D9D0 Key = 00000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AB7D2B41135ED54EC7AB11C67D20BC35F0C8652D209D675AAB3A33FA264C9380 Key = 00000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1208F63F213F1A55127900FFBFEB0569B693376D9310C9A9E36EA1DE22CB5A59 Key = 00000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 10C38678BC2465923063E41B4339D96F3DC5A64CA77A9C9C132D75BC4EC517F1 Key = 00000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5342519F1181700EDC380133226AE072971AC1AC6DF72440FD817C9ACB862E68 Key = 00000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 09D02729C71C6E5E852272B853E87C1BAB5E522875E5D8063501ECE10315B4D6 Key = 00000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 33D7D4F58BDD14244621A960A076573892ABDDBEF36109289A3E8A4EC536E95F Key = 00000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 81A4590D64E2140414B913AC73BECEC19CAC798C313196007E39EF4F75C7DDB5 Key = 00000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 942ED16EC4A9D72D74ABFB7E79CDE840997DD2AD83C9DDFAD02528A9A7E0AAC3 Key = 00000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8376BF03EAE71EF035E18903AC0CC2CCC93610C48050DB096BE758743234CD63 Key = 00000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B5613234B5F9D1201A9A581D59BD744B8E59728E5E330B74CBF03B9E81C950E0 Key = 00000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4750E864B881A2764EC508D0DD4AF06B7B1B123FDCCCA141A74DEAF28070B408 Key = 00000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B3F29EE6BDF09A16C4EA8C1539CD033B17706436FC40DEBD95DA70BF05BF1856 Key = 00000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3A91B7730E3FE044B75E75B9BB09BC1550AD5AC9F495AFFB524FAD90A51112D5 Key = 00000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D262DF12E3D8DA99A9F7F011D607905DCBE9AB03C317E81E4BCD076F3C55EBB2 Key = 00000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 827BD4A79FD82594F645A02F9546906ADCBFF47E2F2D0D0DAF89A200389A5E00 Key = 00000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E83B866B294780E36058CBCB62BC3C509604F9EB9A44F1CFAFD50F248359A106 Key = 00000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8695B4BC5DC6528183B94D5257DC668DCAA0E5A855B76555B65FCCF941A8CCAC Key = 00000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3B5D549F736D15CFD0F39A42CB1ACBEA370ADAA9EBC7C012AF2E30463DF98E03 Key = 00000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1C29F7919784BDF30E566B75DBA4C911FC48C1CD7F845406B86DA540B71C572E Key = 00000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D530E5B30338589A6AE67E0C1E2C57AF02CCEFF84705BC4AAD0D93375E7F2DAB Key = 00000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AE92CD3DA2022DC9C91E381DA62D8FFA646FD02A1A5A3249AEAD35B729C48329 Key = 00000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 111318C5C6DAE45DF4FAFF404AE2140300DBBF9361E926900F3ED7F731385A52 Key = 00000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AA0DAA9A0025B5B3243367C7FC22F56F65A52B3CEEA060825C1FD2813953BEF8 Key = 00000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 11EA951B966D0B3DF0D6AA00059281E6944CBB9921F84209265938CCE91F4910 Key = 00000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DFDE0D41A657B700DADED5F9CB341481A0183AC1BB51291E8719F77251B478F6 Key = 00000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A8A42F8E3C2BD71D415EF9FBDBB9DA86B32CFC24EBDADC656B7BFF17FC8BE365 Key = 00000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1755CB48D8057669C488DF3A2296651F3FB64AA173DC6FCBD2C1113A084679C1 Key = 00000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CEFD04E10B318145993C0AF4B4A64F623BCE0E04CE04E6D3DDE14EC6DFC0CDEE Key = 00000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D9C83924493AE365C6369317A4393F904D530C1D30B2FD1A2E4126D0A532A743 Key = 00000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9B8FC0A924382EBD28AA3F6871B17E1BA9C94418FC3533B446C2DE8C188EABB6 Key = 00000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F91346BFBC0E05A4076B8CD5640E9DD278D4A7755A6D870565AC2A7E60A7F5AE Key = 00000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 58D205808D4A580FF8111B9EF06BEE613D51E3B2E026B296F5E9F8520C7319FE Key = 00000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 15D0C54FC35621B206A4A50EC3DADCEDFE4CCA17C9C5396A18901099A3389086 Key = 00000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 48DE43EC8F644BCCFF61A52D93BEDEEBA38C71C196203A4A5AD9145416EFF31E Key = 00000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 253057DA247A8D7A1B4A23E87B67D49669ADE1FE5EF32E08058F2DA6E82D1C25 Key = 00000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6494B08A0B0CE628E34EC6D7EFBC436687D242131974789ECF20911C0CF16839 Key = 00000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5088AC91D68173FE292A64D04D9A8083535649D44D7F00F23F389810F5F2528E Key = 00000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FFF5D0D5296B0C3553DD43C429F51AF844EB6100E373A6A7A16B79A73392AC58 Key = 00000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4A805BF70CBBAC2FACF405789FE96C4EF097D36F6982B843246C353E77539863 Key = 00000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5F5F6828D3D2FDF24B4AC2F1F4080F40E9564CD8F9BAFC34E5567F96E2F057BA Key = 00000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5BFAD855773EF036BAE365C18B6C5784E8BD4673514B0499E7ACFA38F7832927 Key = 00000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B38604950FA73165F940D4DB527D09CD0B233276CD3808B5CADCCB9FA859AEEB Key = 00000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B96570996489A74726A70C02CD55FB9D4C3ADE0B69FAE7C37899E3D560A5132F Key = 00000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0B8612F83912A9EF1082E9D08C772738908BCCD20DE47D64ACA1500633163479 Key = 00000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CCC75B4A84D08B14495AA8349B0AF79480FF6D0695561710AA16739A54504E58 Key = 00000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BC3F95A0CB0DCAEDB78E3D6E855267E34F3168C436774E28035D144406E803DA Key = 00000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BD0A34B0509EFA39D9D091577FC4296F563AF5F3AF9E030FCC3661C0BD82738E Key = 00000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = EC82DA0C15A50EB98E97532C509DBAC9C392DB79ADDC139F9ADC6091708CD726 Key = 00000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7F164D165F7585E8306E38D44211325D0C6C177C523F13F69DB39DFEDF5BFD3F Key = 00000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 73F36AF678E74D413BE851E77F5E55DE1DD92D5237DBAE75E3AB6364D1F181DF Key = 00000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BE25140C4E7804B22390822501718BE09E7F494594EBD2BCB35A36AC2F0CA095 Key = 00000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 33171A271100D5CC5CF651ABF60977CD15B718863213DC243CAFA6CA86041094 Key = 00000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 323FF7A80198298E438C833032CE609D4E6C5C107C9069E8B216080DE5C0880D Key = 00000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D8FB3E266B96E48524159A3BE04CC85B3DB70F2FE649A01259E4FCCBCD3E7BAF Key = 00000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 88B2171E37F3E861B6A69397BCC46044EABBC424E3359D11C96A62CB33F6C56C Key = 00000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 96168ED95200986AFF506D3C2F043DFE03356345C52AD205BDC91423C6079824 Key = 00000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4FDE2AD110847B5F4F2BD20CE5047913B12A682D119D9A8C8395B9958771FC22 Key = 00000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F703282E54592A5617E10618027BB67F639E43A90767150D8B7F5E83054B3CBD Key = 00000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6673138D1A64DD26CDD2F62CAB0BAB2318DE17507BAA307A189EC4997F9C3F89 Key = 00000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 328B2F4069F398422D78E359F19938B8BFBC9E073C2162A0829265CFD48B89CA Key = 00000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 02B14A28344C4164DDF0EDB594D581AE847FC0090EE6B933B8B8B91EAE90F5B3 Key = 00000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 506221E93DBCBA6787757CCBBB0D5CDE9D06CFE3A23A8942A13C5B3849B2D2B9 Key = 00000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 53A01AD91AE1C7F0DCBE19CF701A895E03FD866F77ABC7B174B327A0576D7719 Key = 00000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B27AB67ACB784CB231A76D05B2539F0146F5C2F330987DE2C91AEAF8511DB9D1 Key = 00000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 682263AAD3FF0B227983D20CB8A8B572427A2EE1B85A7FBB0961C722A7DE70CE Key = 00000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E8AA0C754FBFB2BAF1025C8C13101552FA32E4031843E3DC56D2D819476CBFA6 Key = 00000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7952391AEB6094458B28B543B9A5AC1DDB0CB18AEB431BE7CC7A4D45CCBEBEB0 Key = 00000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 138599B1B9406E932D6229A4FFD959EE02E626022342FF233269A00DA1F58384 Key = 00000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 87FA25FEBEFB539BFA46F9FAF8D62DB8E3C126D7409813A3B2FFC760FF19D390 Key = 00000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 943B778E6053E3CBC59E9423A6D8AE678D369D5E27AB56D668DAD944D0A238F4 Key = 00000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 00D31AA7620BEE29169C62966C53058F05709CD7C6A6584AFA80D7B2B7D9414C Key = 00000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9A6DD9EAE3286D48A7548C0A8A4CE8FFFB61B362C95C897DCD1CB1D8BBF76DEB Key = 00000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8231E89C8C74641DA6CD862B98B5DE749D6751B44361B763DF888F3D2312FAD5 Key = 00000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AEE13BA9322E1089262CEB199FD96E8A3C1E29142C6542961CA0B70782A4FD65 Key = 00000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 89EEFABFFF030B563CAA5965CFF0372E0518BA1BF9A6E07D279C20AF3D52B9E5 Key = 00000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9EB46332AE8F271D9613A5FD1D6E1B06ED7A553C874A44A6F3A0615D46AA079D Key = 00000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FDB79EB3D755AC9338093917F84742BB1D62197D9730AEFCBAA9B3A4CEEC0B5E Key = 00000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 64D439442C3FB4B580E0C7BC212F5589B395F6D100AA8165E4599A34F288D31D Key = 00000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 09F8A382936078076F496A14B7BFD77CF4E549171FBDD8106AD0C2F87FD9C151 Key = 00000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AEB59849B6291FC1B8917642088608C4B9EE364C8C1FAE502F1ECD5BFACBC96A Key = 00000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 006136B68224BF8BF47C0298FE7E2A4B72964A6C9F36EB709C452F0319B6A104 Key = 00000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 55912F44A9A3493CF0A4DEF2F77978ECE0868ABF30BBAB15A96AFE15575AA90A Key = 00000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 81BA612B664481588AB16246226CC1B59A08A7FE0FD64B0111C67C4BF344D2C7 Key = 00000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6B7930B1609C35095BE581F8F73709A65781DC1D49381411F6474CEBE6D16182 Key = 00000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7308AEC23D25A231B26448AFE78D5047804C5011B9B5F95C16DF2670551F0001 Key = 00000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FBE855BD6540594E2D90566E7A30F57516EE170817B66C2468615D5D3D5DF03B Key = 00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B072D598869D6EFCC8856A2B4686EF05A37DDB3F26DFEDA2F9C406B7250801F5 Key = 00000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0CF58B2665B889C06836E699DC2B4C615106541987229D686D43614D3BFC290B Key = 00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F591E78CE6A8A375CBF821D222A49C862A461DC52C74065BA6349598CC7CB6EC Key = 00000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A32B883113DE96B7AFD4ABE8E1703C8D724397542527E27F0CA32C89332980D9 Key = 00000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9B2C992F4CA0E70E0DDB03400AD24C4F20AD5F32940537B33F375C7979968537 Key = 00000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0DDEEEBC428F117B094FD27B614F6BDFEC0D71D61F8F93F9A09E0443F2FEB659 Key = 00000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D58740E259B1C9A5DADD2FA5FFB768ACECD0DA6FE40D7D59F3CF6FCD4838FEDA Key = 00000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E6F318C17501C28164BE9CA692E92D4CF4835E2778B126E9841CA0F132CCAA61 Key = 00000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3776A0BB5880EB65386F20D11BCF308C2DA3B010F7E2DAF3FB8B55B523E7CBC3 Key = 00000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3926539CFD76BB79E50A571D75AA51B94864A79CA5DCAF6CE451FC068E487625 Key = 00000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A8D9B6254BCD0BC32CA3ECF7A7A80882DDC178F47D8E91F760883D589D94F45C Key = 00000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A2C3810606AD6AAAA571C8A783A686E9F713D0A1238C3E621347622C569C7BB6 Key = 00000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 902FF7C8DA5B1D171603F48C02E72B611C40E4B15F06BF4A7DB914AAA7E63036 Key = 00000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 55AAAB17A700544B1384EA512146F65A2F871C30F8EF7AB84DD96E004E924403 Key = 00000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E9F049D8DD032202BC5E16F061B0449AEFD91845A4786A045E35739826E283AE Key = 00000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6347929B2B5B6634C2674CC4AD3B04B321F7404101E79259A35053E552369548 Key = 00000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3C8D318014177555818122F69A95BED7A175464310A9B53DD4AF3C5887970D39 Key = 00000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A3CE794DEA39A03EB4337395E3713ACA02E15148CC9302083E9F2FD55A921BF5 Key = 00000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2EE444D85842D41D9AEFBB7ECE34EEB71720AFB04498F9B4CFB87C10AC842D3A Key = 00000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0050EF8A2E0EAC79CD1BCC82F52F04410DA08263A320DA47B500DD72FBAA3487 Key = 00000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 51721D61A2032DB004C8B83F7509B045A5190892FBC5AEB9BAA4B27D7969C791 Key = 00000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 016D3D0A0C9B1EA97A12AB7BFA23BD4A973D5F10C06581A6DA92668BF3B4026E Key = 00000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 687DAF7B782EB92EE2F8812ABA81A1F8EC353797544602A8EF2D2D6C1AC7EB48 Key = 00000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 538008D0A4465A705313E0A03DE02BDFF7D9F0F0226F630DAFEA5434D9ADD7EE Key = 00000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2F65E608EF3E4C202C347ADDB9733132350A7AC9E544C5D7D76F9527DB3640AE Key = 00000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1EF33EF878790A6E16E18377C474700E6AF64C0C56F5FE8E7A1A83D990BB7B9B Key = 00000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3369751D8735C5B82164E9FDFAA8B224AA4BD3FC2CD3DC48C60A1C290AE189BD Key = 00000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 428F02228A58756A94871F5DCB37F54AD21345ABEDECB6D12630E51ADF4D6128 Key = 00000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 521221AE0F51055948753BAC7A30394DA0F3DCB485364AB512E62D9CDC24FE48 Key = 00000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7E44783F40C4A3EBB40E5D4E22A9BECAD3008D8B1AE64929B666664D8D8680D9 Key = 00000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 48F54AE18072D2E58922EB0B14E4C32CD72807BF436A01164B0B5027ADCE6121 Key = 00000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 671E9014ABC8FBBA21A307FAFF3FC7C89231ACA932F58C2D79DA323F80B3F87B Key = 00000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4473A8EF3585DDC8AB5858DB58FD87FA42E724D2374D7888FCFA66D82B30145A Key = 00000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A4AD8D6A847FF420E96E1E592852FC7B362F1E0DBBE417B0CFC80C1200C5BB97 Key = 00000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B10D378FB56687BDDE7462A91FD0C42C773097765AC4C332B5007D1D47670EE0 Key = 00000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 788D00A54C0A6FB10067E08B8F2C60B4DBA05B58D3C8CEEABE49C2FD2FD7D6C2 Key = 00000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CC54D8465F9529077237703DF4DC136FCD7A9D2FF3B89FF0D226EA3B234B6113 Key = 00000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A0DAF3D3568FA9134C9C1B6EC5137B72715271DEC644F1268FDFA88A89989371 Key = 00000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0BBCCB3D83D7B6D3AA96AD5687C4895CD990146E293733A649B4D7EC48E9A93C Key = 00000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DDF8388BA3EA8FDC869D54D38D6BFE47FB7C5B6D81B3D80AE8B7DE00F4581EC1 Key = 00000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FF4F175CADFA435B31D5766FE6FE73B88B33BF5A87D79A2B47FCEB6BFE6E39AF Key = 00000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9B28804310814CF3C9782CB23FAB7FE19D5BDA5E9553F23E7876A6426316365C Key = 00000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 94831F56AC794746628AF8A0684ABFE6A1113EB5B95939A8223D5C0C08BF52FD Key = 00000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 689C2CAC1FC6999B8BA48B767A995871D80AB561FADF20D8613274CFFD00BF32 Key = 00000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4CC4412727B69CE43E6B85D89F03DAC6982CF867FB98801DA1F0E8720123699E Key = 00000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8160A24A68E81E4A839E1C16086983BE98652856CC621B3F7612A8B1324FA33E Key = 00000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 024B19F8BE7203D9E5589AB96B86BD68A488D7994813D0231C835637B9E59A64 Key = 00000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 954714BFD736CB391604E77367C2875EF291C02EED35B6DD6A20D58FBADAFB84 Key = 00000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6E95756FEA083B4AB4E624B5CFB00E31CAEA9C03CE4A1F51104BF6E7A86495F3 Key = 00000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 93176B234B0A25F30649FD3172F75F181CD47C75D795FCFD5A537F18B101B24D Key = 00000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 51637CD02F79DA935C5A317C1F8AC79E47E255E4A83F3F04DBA2998DF5118D39 Key = 00000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 15C15F38B0CDEC62A426CF4AED25096DCCF1B2C7CF49A223F4D3ED7E06CAD2D7 Key = 00000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 14520B3D7B8734A8D4E07CAB93744560D60FE7C9122C97F2ADB97D811074D225 Key = 00000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F16ED0E9813C694563BF3557D73085C8761642B6B003291B31C681D3A9421E73 Key = 00000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BD3B03B8DF1994DDD3BE4509BB2B4AED0F7D0F7638102C58B15ED9DC9FAD5261 Key = 00000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 45813D3ABF443D14B8519A10BA667F16C2EC757B309B978E26FFE56EE0BA00B1 Key = 00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A13D32CA09C34BBA16813BE8F4D56AF772B67327C7CDE0756B3D5CECEF2BCD2D Key = 00000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = EC7D07D6F3AD0351131F15816F8044CBB1592324F62903B9DD6180D88E09EF07 Key = 00000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 873F46936C8CC3A23CCA3EA3288CA070CC41F128296FCE6E7AAD2B7381BBAEBB Key = 00000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0AF0BB23EFCF86B273A27D84435F53F9984183E4C0D2F69945E79BAC8674C3A5 Key = 00000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7B9A8CD1942564414FE5C1237B680970A306CCB0CF73F1123D2E823D084F3126 Key = 00000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C21A4ABA37069F7173A704B16C2DB945301BD4B08D3202BCBCA4AF8E5BA8A963 Key = 00000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5B2F725ECF531E569AC6B69408259547B9B054CAAA20B6727FE7654FAE4386D2 Key = 00000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 58E6E58AD73C9DA9A19CBCBCB6E89B44951781A027D5C5CBEAABD95D55BE1CDF Key = 00000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8F076E12AB23D9CABFD006D16E1D554AB367CE88B3FDD44717824387DC9D4B43 Key = 00000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C5A351191F18886099542CE6B3025D6F0F4EF8A9A1C804803166BC2699D4B3C2 Key = 00000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 39BF10576DBE0BA332EF36C38CD96F4F0043B8A0C6CCCCD3521F169821CC4C0E Key = 00000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 12EC53C9420154F7D5334D4BF94BE3B4CCB044FDF56B4A92E245F016BBE9C057 Key = 00000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 569D436AFFBB65451ECFDDDC7BABD5608BC183E9437F30B5058C505158BCE7EE Key = 00000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4E53AA49C4A8E0A00FA51E3DBE4D6BD6ABC1505C2E3FDADAC282BBDF5987E075 Key = 00000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E0BF45509232C9F66517F057FB01C2E0E08906842B59DA4980413F629388C088 Key = 00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CC5A42F9BBCD1A5BE0D8EAC69A184E1693AE5F1C9FDAA05B8CB5330D5D63A2C0 Key = 00000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4247A5AA925AEAF29EA9FCC3C942DC47FB1A13213B302FE0C6F33243C631D2A0 Key = 00000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DAC043890BB61728CFC30E3A860BFF9474DE05CA104C242BAF498344470319B5 Key = 00000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 214703F986092730BDF01020A825628FD06CD22C9F385CE14BBB2738A38A1E94 Key = 00000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AD3EED667396E27E4EF749BE1BC2D222380AA5C070B7246EB3A8249D9003BE1E Key = 00000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 57B33C626E776BAAB8D655DD93125D49BFE92177BB63AA9902A44E4CC6F90666 Key = 00000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3ABEB777D6240D198677B50B14545714D71D2F46885513688406B201F689C3BD Key = 00000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0B9E5A4358BCD0CA1AF306274CA676B515499878D2ACA0AD7865139D36910018 Key = 00000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9EAB0FE92E1B83FAE87EF6369BD0EED91D10DCFC5810FA0188D06929CF927422 Key = 00000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BC205D90F13A69AA6C45979861B1E5737A69C61F726D252F773E528276B9F1B7 Key = 00000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CEB885427DF7C988804E7C2401BD703CBB8F3D3D50AFD6CE9F56D32F802F8219 Key = 00000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C61CE53D0A5E771E6AC98830D496079A34ECE8967D737D0EBE393E7549679BA3 Key = 00000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 842F934F9C3E9690F3AABC753B6C27F7F3EF7B199ABFDA287686F35E2884A2F5 Key = 00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = EE357FEC92355A11FDCE30B089E4F5918A90025832DB3562C762A8421F3B6625 Key = 00000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C9CC50B7CB29557DCDC64C995B24D2E0E8AD8FBB4906A8DF06D67A69B1AAB8A6 Key = 00000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D6DE0F6B51BCBDA8D44D7EEA5F91C85B78F42B6612A35662CE3AB3043E87701D Key = 00000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E3F3E3A5317DCBE044E1A97CAD714449DF0F8E9C319F5C12C19917B2F47F1FD7 Key = 00000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3A1A26993055B3B30BA84236212646D2622680117D2813316223EDFFA1BBB22B Key = 00000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 192EE13F6909D98437E8F424DE7DC873D82330DE64B379F3F8985658B00033DA Key = 00000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DEB92C0159D40548317AEAF996819352F43CB1E487885A0851234A43E4C5CB2F Key = 00000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C671DF68881157258EF58E7C7E712351FC9D743A2C4ECAAC9D3ABE98F9701B3C Key = 00000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7A8BA935035DFE8F1DE34EA373FB60E147E6D5572686212BF95B6E0C115D15B8 Key = 00000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AA95483043360A3CCD5E98C8D5088F9F7154DA3E36F517C459F03B94EA8B5DCF Key = 00000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F716EF1B45585282C50AD6EB1EAD2D19AFBF57235E5D56A015882C55EECC2044 Key = 00000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CECA215484E90CE7AF49BED4B5F84543D05CE120973EE8510E0A410FA391BE3F Key = 00000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5AF45DB110A67D0CC49D1A1BB5765ACDDD6482BD88664A4A511BEB8DCDDC08B3 Key = 00000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E0AFCA91B3CCF0A0C4E332C4F75BC17E5956B0F3A438F0B0ACA0E9B08DA9A1C0 Key = 00000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C559C00EB5C49F2321975A264F855C291DB8FF942FC4617193236318D55DA27A Key = 00000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 88BCDD04989FE085F888A57176463662C57DC70DD3888F427B68BD5A36C3297A Key = 00000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3C6302F9C2C8997C41FA0F0187B9E19D14FC2196A001D39F56BF5200E76D4F66 Key = 00000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 641DA3FF9CC2C5AD625FD131D91E1AE5AD3088DF404384BD885917FD1AFDB9AB Key = 00000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1A05DEF28E631857C796D665FA66F8A4743F9A340904EC1C084AB022E63E3A0A Key = 00000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 04DF8F3469AFEA2F63ECA1FA64FC18F1E42B42F7666BDCBFE6CC1C68614D85A7 Key = 00000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 21AA974CF45CF84383024A8E7D3427BCD9A0A4F4B2AA83FA44911615B2D9A27E Key = 00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 74533E9973B565E0B7F9DB65A63B70BC5840EE4E1B6D927033CC1F733BD78AD1 Key = 00000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E818E22E590974A00FBF40C1A1DD100F5C2E3A76C594D129DDE0C9119CC1A836 Key = 00000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 00BEF3BB9263863455A8736A114E7DF13C903D6D9FE065FED48E6634EE9B9156 Key = 00000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A0D418EAA61D8B6234D8B07D4652F61EDA48B00764E124DE5D7545973E4BFB0D Key = 00000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 21472EDC58EB9D2EDE5D8A24DE18784500420820C388408E2D09C8935D3208CA Key = 00000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 278849105940CFDF61AB8DF9A37427A24BD452C244988E7CE85B8FF94A913F71 Key = 00000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7B35DC73EBA6408C2486D59ADA0A17B89ADC10E405E029E51B8FA7096704DF23 Key = 00000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D81FC2305382B4110925F4EEEE6C93C3356B30F4E083B47C0FFB429DC8A317A5 Key = 00000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B1CC26F822DAA8B4EF2DC5C08792C21A985D285697C9BC49E038331996F2DE35 Key = 00000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 565635B8CF39652AD3F94F9658FBF2310A08DC25975102D9E0A658574E5437C6 Key = 00000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3A9E77725182484E375528415C99C9BB2795A0841FD9F7E7D2DDE20A6CD71C04 Key = 00000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BD3F45893A96EF8C218B3C22079E64BF847F3C41D87F1AC68E62B32E5A59D350 Key = 00000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 44BBB67723B8FC5778D18FFA60F1A7DF16F2A4583BA07E3B2A9A4286765AF743 Key = 00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 06198963CE32DC41A3869CB3893E1602D21EA64DD206C2DEA9FA79F756260BF8 Key = 00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 82EA3EC56648E3152D541EA5EA76F9C1D12A373D5183CFFDBC49C0FCE25AC9BA Key = 00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2D6F44E5104C9A6B28DA5731FE95AD5ED73051B4D405FCB77D2845A3306CD9EA Key = 00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 360DF8BA5BA3F245E4751C6B1D81CCCC7160D6DE8CB12B496DEF04A78B0D3DD6 Key = 00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BE0B2DE97E0528C5A135A81F2DA7431C8BF01A456411CB826F1205A9E57A44D2 Key = 00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4CC729EFC23033F244182FBAE629ABF4386CDB279C6394C7CC914724604D8736 Key = 00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BA44E9372A4EDC847FE6601F0DDBCF40864B2BB5C4EFF9B3038F7EAD6672907B Key = 00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DF3109ACA9E8546F5140E6705EDD69EB5512F0C5B3567D6EE132700820839B77 Key = 00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D909866F49103120A46CD4F2A98B2A2169E3E9AE7BB5AD36CEBD675F62B73018 Key = 00000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 63081A9DE55FA28CFF0089A3D4A52568BFC0D3A172B1750180A91BA12EC3E38A Key = 00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7FBD9ADE476739C69CF906B611639D554ECF25BA26AC87A11EF30856DE890D28 Key = 00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 495FB031327D3AE9CCA3F449E73571539EF9FD88589B5C3142F5A4461CAFF9F1 Key = 00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1E958BF17F89DD463B49BDE9B05D01DC2557DC4CE072C24D0527E45BA1C8026C Key = 00000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 92093F21E7CFDCD81765E71ED960121F84C6FE1CDA50B00592ED0DB9A8808FFA Key = 00000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 122E0C5E19B0636ADE10F1A14FF4CA69EC426B4F311C109F6B137BEE274B1912 Key = 00000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2CE82AD1BF9BDA86355188CF5605CEAB73E98BC617CDC3D5C8598F11BA96F6A5 Key = 00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B14A656DB71E54DF9D443E899417FF4F79E033106AA34D8669EEF0E9918FF4C7 Key = 00000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 47ECD5C02C3D702FC36817981781B1A4593E240773121F763EB788D46E990C5C Key = 00000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 91B74FC5E6FC8C6C30F33CE83BC0055190373FC589C0516F248227531C6B853F Key = 00000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AC8F0393E6D8881EFF753E7CE47EC441106AFE1315E712BB439F2F2DD4318670 Key = 00000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5765316B484E3091FB5135ECD4A5356293BD87512688EF14C719B61857767E1C Key = 00000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FAD76A9798E8DD194095DACF92F83779DEDA70C413033DADEE55B4C94B98B426 Key = 00000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 87F337C9D5763F38C679C5EB9A67F72B4581487ABC5ADCD5BABF4C71B5EB6F7C Key = 00000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 526B4C3E3FE096F47D32A403A7D20EE269A42F68939B2FA8254A1812D9EC6069 Key = 00000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 342C0D2D0A5048DC98F2E8CDBB84CC610E30BEBC12F7572CB416CBFCFA24039D Key = 00000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 47D03635744E2D917F799F77A7E09E6F064CE224A4A1D507090DBE200DBD022A Key = 00000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0DCE2CCCD9628DD4F6552A020B9447D35DEEFCFE5D8CDD8223AB3BA9090D8141 Key = 00000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AC5622C3DDECDB0A46F796596ED595926B2783E6A884D18517F7344CCAB3A2C0 Key = 00000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 80E59C358DC6F0B5749FEAF45A9BE7F884842839EE6B47024083F52A8636C2A6 Key = 00000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8E57504AD8F6DA6D8633D413362E961A6D69B18FA1B501DB846080A5A9C9C700 Key = 00000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4956C679E9B58DDE2185BB018A7D6C61C918FA0AA9D6102E7DEF1183DB768FB1 Key = 00000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2C25F9CD0DB2444EE43D0AD2C3AF0303D1487528F45AFD346617D164F80635B9 Key = 00000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5292E96CB2110AD3FD231C5B2BCD1A8986333787664D1A551B9B750B2AA39A11 Key = 00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D189129077C79106AEACA4E3463FD0650AC493ED981DC252531C072F18E1E292 Key = 00000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F9490DB8BAE36E28E73419D1D57869D760D772DC8752D1DE948262755B4ED503 Key = 00000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 994EB2D9BE7C9FD547426F295F15DE3BC8F4A2B3955C7028ED890B1DE0FBE21C Key = 00000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 464BFD1EB42B595AEF9700C7C4C184A2132B5F1E85625592E48A233FA7840EC3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A097C32D58D5A932AC9DBEE942DCCE547222E37E97DC3B29A63AAF118D5B01CF Key = 00000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D3D13CC4379D2817B8CF8E06312FC727A3BA3C58F96E478E4EC5BC7BAEDDCDE4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 577C709C26BD52547BD7C0D3F9CDEBEC0F266178905C4C067B75A01D799EF910 Key = 00000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 08FCEF6A263916C53AEBB6CCD2623E7BA3C38C871C5A8B64106308B74A7AE1B6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A22F794F4913B2B1CD930FA26EC219081F297DE4EC808771C9B375782F891D67 Key = 00000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 52F2C9714DAD06FCF5FD8962131D33952A6D68C2A90B8C08C3AB86B09A2C77C5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 60BDED5533E692A9F073AAED43A5D5A81378E73A953514ACD5B0997B61848E3E Key = 00000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 38921BE2443A8101FBB44BCB4C5B87AB5026AA34C78B7FCDE07E102E142B6162 Key = 00000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D49C075CC20268EE889A10E27F2D4EAA99A1764F765621FE97687ECB6067E5AA Key = 00000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 50FC6782B3285D35117C0FA81039A7F264FC4EB492F3B86A233D45F2834F153A Key = 00000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1CC0B39D670A88D424F5D40B2F9256AF3736689BD82F0EB315AC9056F7EC63A0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CF66C3CD4B08CB0E4D25186BF84BE3AAAB1C435F07D12593AD001F70894030FE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 352572656D0EB6E0CE604C1A913ED733D465A480504B61B0F9BBA77122FD20D3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 096E9F34E6E277EDB994954C3705F6904452001D3A3E799A1D0230D430E207D7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 277BC612F90A6D0735B86168C021098F134D1627D0FEF38607038415D1BADF84 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2376E2CE884AEC093E22A3C119D573609225FD5DC9B3EB7602C340D1AB51BDF2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3EE2E39ADB49F92D09D55ACC817B5B2F22FB202951AEFB6DE8998D2932145669 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E508313113570BBB5A1E63F46AB52B57ED0676A061936F093961D34409F1B962 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 198A9A0A5B04AE936CB19E02A5B2A254A2DD5A4D71F6C676C0A826CD261CE8C0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = EFEB9C3D34865B89275EFB9DCE1929697FC9E68ED9E9E32E2CF267DE57388E77 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 61016E27DF83D9DE642AE01D7D56C4BFE881C8BDEDD15C503BDC28D3F7107754 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2FB5FDEC05BD94EF5A7F0DEA7A368F7C2B26ABC5789FEAE7B7B6A5E6C364041C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F765AE08A03CF705D4BE6A6AF8A34CDE7A14F599B2CB7E2FCF2770F0CFD4F7AC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D38105C4DE4742F16E6AE7C1C3C85A515DA8BC758456E4B5D64C0539B76D473B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BFE3A705729C82DDE1297DF492A8F8ABAFBF2F436830B3716FC206D6931BBFEF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B81E7CB312AC5FF0A1795FCD4AD8B3D84FE6C8B796584DE794B7E230823E6AF0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 605C8D477420CF7D8218CB8A6B3624700BADE8D1384B04995F3C942DE38ABA6D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 87A3F6DC69A7675F27CD00D7A84251366CCCA92775D680EBEBB48B92A5781D7E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 71625BD75BF6A89C643553D382B325EDACCFB4BF5F1617DED0C44BAB96A9F72D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = ADF64E64C1A8D854C421F5AA8CCBE789F3643B0D769A2CDC68D7C3AC85FDB634 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3C1AB3A3A85B1EEAA057557DBB59FC28479B38BEE67F4CDA0CD49880DC15ED0F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 026071B93A8B85F000539539626BBF664273EA701B63D487208962F8CC14F1DA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 61EC580BC31488BD8993C9B9D6B430BEBAE04F9807F199808CF05B0B4F083F9A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DF9093A33937B0B3ACAEAC1840C8E1358CC90FB0B6C0834D4CE4F442830127B7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5683A2E768F9E105E9ABF7B71DE48833367D19E961D9D95577D2C4E48716EE9E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1D33978B4B75C10ACB850BBD98BB2CCB31F7D6F561E34AABAEB929C2F7762219 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6197C557619E4B791888DFD695B4BF55B7F72258968E26B9B74A6A3814267DD2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9AD5C65433732C4ABF08BAE9015692F509775FC0450677CB1E76A060974B8807 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 44AA2FB88757EA695083CE00105D5B77C2DCE04EE1315D99040A1495E97EEB42 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9C637BA9B011A62B15BE522D6C514092358222CDB01A2A35B895B1E57DF1303B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 21774A71C07FC295C4BF477A512445B2AC9AFD6619DCF0124CBD735BC823F945 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3D74A1E781FEE340DD9D912F6A681F85C0EF78BAE81D3E50A5DB8A311057DCB3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5B851E24E32EEB5BFAB09D26E86BBE4DA23C43C8E88635413516825D1F56DC43 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E79FAFD3076C0F879222F86A0671104F350B115A6AC107F5C66BB673CB047948 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5E8EBDFCEF4F70640695CF76FE7912F5E77F55095F0A3EC15CE692AED2C7312E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 99EC9D6724631EBC582C22B1B002C8F63B386EF1A96A9E4D162F698F3EC13944 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9DCF4937F7E089B09AF8F441538E2577E315212AA56EB20209F040BE602509C3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 063CE595D4EEC463726FDB74E5254B5AFB965D2729D02F1890E70E33C4C7AE49 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 18F5B3F2F2B54FF37C354F3181228FBAA7D337791671988801C19333165EAD35 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 912671C8099032B1C0AE139D8F029B153B22B999DC30170DAAE3904CBDEFF083 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CAE46BA93F81E1AD26A8FACE45566E162B8F4CAE831B4B80F93D2A809D3C557D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 31708CCF07D82433A61053273FBC5543BAA1A73B836624FF092361E55631531D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B5F46BFA7B367DCE7998428525483F775D8F5F1A8DB9F7E3EB848F887283028A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1D1B9489F66B8FDC1902C02CE15E94727352C2F6A302C12A6F9672BC44014F6F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8EDD86FA2225D954B3F9F57A0433ED692E99F7ED55EF0A8D112468AEA58717A2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6F1414CBA350BB5DF73F7B23FCC0859BC2F081374BD4FBA7571DEC9343BD939A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 84535A21BFDE843B9E70AEEC9E5EB915FCEFF57449B7872142AA0669EFF250BF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C4CC653F5CFA6C13C4693967D4CD1398B8808982F0C1D6D9B4CC9A6FCAF41E8B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0949688EEF8CFBB88589CAB3EF58912A2C413E413EF122BB7F4C0E17BF723E71 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AFF2976C45A69940BB88C71381DAEDD767BAF454331FCC5666624EB052CE05CD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A7D73428AA840EFCBFF0C856409C9B19CBDC19BE376EBC75DFC008A6BC9EAB37 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3C59AA18035D96933FB938DE0331DBE42DA57B539A77D660DBFA12B62611760A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1F982024A86CEBEF27F0D19765907131C5EA1385761E92C7432D55A118AF2FD0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5D5CE5B2BCEC679BEE0B894E4E0FD2E5ABD345D8F8061A02BD4B1873C3A9B612 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 54C62940FC9BD4D96A0D19CE92F6880B5F45A422DF0400E868020ED5B42BC287 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6A7B7E894CB7FE3A0153B5CC6E78351A07AEC726CCAF93A2C426C83760974035 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D2DAC7485B1818A7A2976F164C80AB5FE47B7CBDA4048000D09DAC65857A8387 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7C545CC73456F1C1B06C5B5A05A9659F5D30A4D78E9D85C29A38735BEF098E0E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7E3FA28ABB96C7CFAC0DFAFA5BF2E469D75ECF690FA876F3307D851D3CF0AAC4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 46FFBA6995D7D6A2B58AB5F995AE3A305CB0385242428FD092FE777556AB05B5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 052E5126AEDA420CC39EEF255B816BD475DBD36635B090D04C43410F40236BE2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 80BBBFF3EB0CE3976503A85240226D7FE177B4F30C753F081D7E1F3F8F0FC176 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4A748837D0A7950876ABC89127A6D6FE5B646C7FE9DF8005CBBC3832DFE488EF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 84F35DFA249674C24E6DFB3947E3F3475817DF9548B301D4741B79EF9D26629A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BEC48DE878DD3533F3614B3A0A4BDF5FB34DBA96AE94508FC0D3927032CC6E61 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 80DDDED6AF53DB0459359FE311F32C5DFE85F281C45365BEA7A2D6BA8A2D5EA9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 43BA1E833A673FB760B13DA40C509EBB7170CA05E7BD2728A7FDA0EB8E3020B8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 917FDDD2206E751DBAD9BD2EAA3E1FDD7C6CFC7782367B563DE6E116D0E4A3B9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3AD03FD2841A7C8E8BA49100FCA794DAAF29995A9CDCC6D4F868914C890C3BFC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 79A9305A48A10F739B06EBD24DAACBF5289ED6A83415021DB1CAAB542E417DDB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 195DA96825A0F6B94A71E2EDD934FB184F375EEF66411567815A4A6E966CAC0C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 513239A738978DE007138E83F5CD13A0A9BE374CF61B09021767CAE284D5510E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6BC70608C85D884873CDE727CF2B8A4E9563DA58242C907A3E87C2608AC0F1F7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F47D47E5D0013BF10141C7BF92642E4CCCF8020347B59F1FAB145849EEF0A2E1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 879D4097A300F6575BC2021F218E9AE9FED113AF9B4FC9179C621244A9E2A090 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 91EF2BE82D9080A366AC7C4344E457E5F46DA5BD54DD50C97D2910D1478BFA21 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0EED2315EF9B9278CCAD8EE2E33493F5A4FDAE31EC1DA863C017E8AEB77C2867 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FE80FF0F839BE1F911A21C97B36D439ED66F9965293890D98D8A3A98F2CFAE1D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4E241C22B26385E268F868E37873C36B173625048DAAE4ADE3C2E09D856A8AE9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 71DA83DEC321D3160433BD8E2C2345921A6505444C9B1949B4D6CE400F1FBDBB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 21FF7AA748E96269211F129671E4F7A25BC55D92A144B7BEEB75F445FDCCDDB3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 070290F0A10324414DCFD323822ABD2256ADDA0913FEDC70EA53F3F88EEB7AB2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A112192AEDC7824247A9239BE92E45928416D086FEA09D4370DDFE862493AF4E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B0CD1E1BF87C1C63C455C8A285DF739A85706A587CDF0726C4615590DD25BDDE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F5EBFED2EF7706C5DEF09E94641FDA500100F500E431C601C879CC65CE260DF6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 02CA5B7EAA7F906B706DD5B13A6C121927EAE22FB51C7259A781A916C5906E7D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 10569B20052606FEEB9956C2882702477F1D48F82B09C0BE1C97C3150F5F7D1F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 95C649C5B1ADCE59BE93F701C01D815D7A32D151179FC1B6610B3A2A98EE1295 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7E1DD644C151A0C1055E0AEB7A9DBE80BE09CCDE6C69797D00E7B391A6311D1D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 6A82511AEBE5A82B6392CCA180B10F77FF0C14A7CF8CED894E1C8EDF9BAB29DA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AD05B4B2F644469BCCD1BE1D028B1FB26F270088E56D8B73364F958730B0C9D7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8B4110E53906CBD07EC61AC8DC8C97C475085AE6AE6418C45CAD7495B2C2F4A9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FC44F97B9B3791B98D941B460C585BC7A485024F2B15370605FA64BEB36F10F6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 95E1B79F255E9E477D756B0123F22397C723D63F3D6AC710A1647E5D6229AC25 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 523D59EEA567CAE613403BE8C8769E9E375F290D7FA2DFF64C9B41120E96F0C0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DCD843BF9123A86C9938CB833C815217E37325B4ECF9A43E8E878ED2CDB257E3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4D737BB7B6B2EA155FA64CAA9124588594AD9D3239B03A0B5F1A1670EF37C309 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D884858B07B3ADC2AB0067E24CEF443AF6D3CB691C7D3EDDFAF672763DF6991F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 24923E668BA92F02D0545738A1F3A81AD3EACC6F3E65A3C6879FEB3D55C3BEF5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 98006EC6FFEE6DC3FE9D53FC632D1D82E8DC5BCB0BE0BBF1782701F858934432 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1C7CD45E2FDF746F2F6B7FCE3510DD14CAC7420FDA6BC9C6D3287E894D2B9EF5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DF1B2CD5A9A7ADC85A257882E53150F9B3BAD4B5EFEEE8B4B212F8FB08F11194 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5DF3202330B96E2C8D45284BC1D8CC34C076B18600495EC43F847D09B9AB08C2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CEE878EA6317D3B4E2CC695FCCC5EE04B7415B735F2D11B9A8891293D5D5E818 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3753BC3550155B6880CF1AAE6365FA5EA4F277B4E01FD26133A5C69F5620AC9F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8FF623E4246D8B7D14904BFB478256CA55EBD9E383B672A91D512AFD606BA629 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C823B856B5E462FAD71A1D9C8F02CE1FE48650BD53BD620D021ADB1C53C21B84 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 22D0CD94534D8DCC359095D77008069E57851298103A13ACB50BF6FA778CB9A3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 413F7657C9E46D928AE307FE794D1B10FEEB433D7F829C66118E155227F811BD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 12A9E9ABCC1916594307C982852A6750FFD5D9DCFDA261EC54C2D465BBB0FB64 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = EEB4897AEABADA871D368A00748CB437801933D78A14687EDDB3D526BBC2BFF7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2444A95492348F7AB5C8EFE89839C6491833EF227637640F8199262DA70E5406 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CD0F1C806CE40D9901A04A23B52BBCFF51D20E964BA2ADCFE9AEE7CC8FE4A3B5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 30E58CD115B75139A5D2ECC5253F6467FDEF4DFA307D11132570F90E657BC254 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 563FF22D971BDFACD7A90EDE80F076126CB16A759FDE6DB83E0DEE71CA48F33F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D235A2277B7D3A772C3D092D2E3D92248865EFED8C2577D3D087C5BE84891667 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3CD74A025D1C2044875FE1D97351608E0203CE65F2EB283633505AFDC3C6393B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FDAAE4CA8FD698D4330AD8217D40C8368AE9A825BE3359CB881FA74315ADA4DD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A9BBBED3051D1EB40AA806CF6505EBB4A0D3BAE671AFA03BD2586B01ECC6B9AD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 468AC86525069F4A9F1F7036BB2FC3D042296707B9FE8328C9514DA52FCBBCC2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 96498A45E45E26AA2A1DD58E7374BCDA71420627B332F94FE98E045251B432C0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 36FB6B4DAE5EDE9971BC2F5A353A3D5954961D9C8F7D38063A9F8556881F1E1B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4206BEA972707980637FCD2B990F2B8EAE3243C9178487047B1A9BE2C7F6225C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BF2763F46F4EF8CF40E42B6E4F161785D3478BDD1EA0BFAB30763B98BBC64720 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E7B97A297B534B1842528055982B7C382CFFDD161D69725789BF0CC35339D0A8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F8E68E206729EDF06C9379DC6F87891FFB6D5DD75A040D4F0E17BDF28308E6E0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DA69958998715C7517B9864E3A81F5960A48E9071FEB047084683D95A8532751 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 99456A498166535817F3DD3B47696CC74777ADE25DFA5CB5A3DF1A47DBCF0F17 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = D2D061B7FEDCA0663FE8F738042D1CE7D0EFB3BCED73977087FAB06192A361C1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = ABF4E053FD99A777A5C95F057A1D8D3BC433D212220FE2BD5074C7E7B4AAA636 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 335F971AF070B59191F61547DC555F2AD86B263B23AAD53A80D6DA0C8A73C6BB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C2EE398458AD869FCFB5DBAD16CB66F2CDEBE8D9D2C0FC4B258553D7D648E281 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 659BDB67C3BB43D43CF53EF14411F9B5B2B3C8C9B961087622BF1F0412596D81 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 21E2DA7422F753B1B625D95BFE5FD1C52CB5DFEDF0F2662EF17416E44F671525 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C14725058665DCF8D701BB4A3DD5490DDA85E2754D9B233C008B5FC3559837B0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = BF0D7F94DF1C7CA59CAF588BEDB316CB4E31A578B76C1E5213EB663C0E850F97 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C81ABCB56C58DB2D5A329C6777091857DA4A5CBCB9D05AD6B0D4A2D4E915A7F4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F9D7611F502D0CED242909E032173BAF5A43DAF7009F53E25E109D7F4FEF9981 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4EC0E7F808A10BFD4676E5CCA67E1D48806F346B702B2827810487EE56907C71 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 34C183C96FE5D9D2B4ED564EE9726551B27E1AF24848B5D711503E88BECBE458 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3E5EA6B326751B501C91C4A575B0ED6AEA9D60A14908187ACB3FC145B5468131 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DA3904568BC8844CB594F44FE13F5D663B55EE6995D2232A999D591F2FCE7812 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9293ED1C3C5B1A91B54A43BC63603F2EAD345EF9A7D3E69BD955EF1B8D36FD13 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 65C5CE0CC96FA6085A23EF00299B6D8518673DC9B8BF764DB595A8A7F8E940C7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = EF95E25669CF4079F8BA728F41BD115F2913D8CFE0116C86032CD133E4787011 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7860315B44671B93718FEAB94BBCEE6B1006354914A90C3BF2DA1B6FA62F48AB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2AA9968D7011FB1F33B97DAD01C2708A6826C030AFCCA35B222B2E47C89F14E1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CA9DD4F0771447B9AD0664DDA2921192568C2012246CCF5E95CD6CF3FBC44DCA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 38D51B18372FD7E7A617D7BCBCC658CB16014B05ECA242AF52B40AEDF6952DE4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 640D035CFD65FE70D089866A53F21D00F86FDB1CEE2880F9FA7D382D424978A1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B41B62EC90FA9CC037F1BC74AEED25226917DD3B2B2E5C11EC6AE7601CF3F0E2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A4340A36C7E640C83D2401AAE6F9F103BC9B568EF5B7F67663E64B820974B235 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CAEF6FE59B0C05DDFE4F233412A185038077B7138EE9BA5FF4815C63C2BE84D2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F5D76FAAF12F566711DAAAC0E1F71260354FBA7BC0DBC34D7A2B6FE8E19DC672 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DB1B22D80BD5BEA8D3F5F445E296FF3506C98C6FAE617D6C8DD943BC535AF864 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DA02BA2C706095D3EB008EFFEB5E501FFF78B59EC34CBCAF0D7CE82268CCAFBA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F878759262E5C2BA6CBC2091406D4045F876767C475582965B185DC9437ADD1E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CA268715277F1CABC2062D4EDFD667759829782F793715199EE172917DA35C5D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 01BACD8388BF42064C8E927B3629C0DA82A0FEC4883EC068DC48483C43512BC5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3D782388FD4ECBFEBBD49F2FBCF80A687E4CC0B8FEF51F097DEB679F49CB8B06 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 392E11AF1FD4A97ED260B680930C95DF26679260EAE0C025C405CDCDBC8E810D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 10E6AA6CAA90220E6D8963837D9EC3D46F8E9679379345282573753F2093E0F2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E3EF5E9644294206A5707EF83C54E5EF5F4DB9841383C3EB767DEA722E9B7D0E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0EDD01B5FE46475139F14371B548B58C5E33830D6EA6864BFBAB36D25345F8F3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7DB72BFBC00A04E38DD4B9F2EA5C0114D19B2956EB959BEAD3E29DFB9BFC9A2A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7DB561AF481CC8B010BFD18A0216E2554888BBDD4E90B00476809B48601C9306 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 4EAB74E6D12574BCDEF95BC0CAD67C7E04B24472431607EBAD5F915F1116C9CB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5A48DE560FA1ABF0F85BFF9A0A1928020A6C51AD3FE7C1392C2A875401DE62F0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 074956F37AF065DBEDB2D68C602A4B65B7D614F8A0B284539E234B307CFDC495 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9BB4837A582A5CB30579DABEEC41ACCB3786AA9BE52DDC88065BE0FFD33917EC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E1E690D74FC254D1D2A8238096285CC100013E8A8BB55FE92F6DF69DB217773E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = DFE35C2BC6ADFEBE4D9E8F84160AD6315CA43F0F022DDC629106E008F29C81AE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 8106B2FE206F9F8738BEC324B531E6943F00B20EC35DEADCB508197EEEBA5473 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E46E36293B659E73FAA1722AF29651621598FF2E92694C99F7BB0C792B93BAB2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F3CAB9F84AF81A06F9F350C345B44E053C8F1EE36D62159B4993950BB76D0948 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E3381C1644BBBB29290D30F15C96956BF4AEFE443FBDA0DB3EF2CEE7081D1DB3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A4DD97D2710285907527C4FAE5676774D937FEC609F8489A16384568FAAA699F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 43C608E43584C631E620672EB0A92707C396ACC12CBCE0810A28F7EA3491E0A3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A1DC3C2AE54BB2FA291913562F05E021AF361E422D39C89D8CFDBE4B672B63ED Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 890CB43DA15A1D69A10EA9322B8C14D61AD537462439A735472CEF9428C8A2D9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 9119548582EB7EA7F4AA1B224A6825B786F316EAA7AAA18B61B56D64AA4CBA29 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 574DD7CA20662ECBC730FA7CE314094E427FB8250E0F636894B650DA35A7F0CE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 3575DEA861D0F97DA32438DB834020996820BE85EAE5ED15A7983A31C7669C70 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 27EA06CBD196073357F1F790191D14796FE2BEFBE18B8C48D7566528B3DDA4C6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 11B190730F6EDE90C8B3FEE01E722ADDD21BEB4324A358F86F524E4B7F7AF975 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 07E3CDB5130D8FF7A2A31335AD478FEF10805E266C00646CFBBEE81F2B3C1711 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A0ED0FFEEBCBF4066EE550E63065B08569B92BCC938002A5469ABD1C397233A0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 2C9CDE299A4C507EC03C617EACE2358E76BC1AD338FE5A66A9105F18788A8836 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 5163F9C4ECECD047E83BDF1D6EE233487646A96FE43B4B08C41324FD8ECB271B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = AA2AE4BF506AB3D7607A29C3EF90B4C7933EE58ED3AB3720817FE3C611A850AC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B04B4C802D91D9ADE76EBAFCDBA0A96A8A83DAEB7069370D6E901A42291EB8C6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 91A99BC40CF38388B4AA77798D720653492CCED5230382ED587A305A2A1A6BCF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 91FB386F3B9AF82F93836005CBD9ED6727B9BBF1F669EAE6D06DA6D04D1AC082 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 01F8956120BF068AE7241BB96FF086C2D67547B549A8743FC0569978F201678E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A8C562A616F918A669A29C0724B76E3D04B125E0AB5A09E8CE60F54E4816EC90 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B41D3BC188419DC929D611197D17FB4D29B78CD7FBC03B904219DD8A2FEE210C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B119861B67AFE45C0134E2336CAC90BAFD1EB94C557EBA6DFDCBE69367B37981 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = A2317FD4C041AF4D87C46FC684FBEE8DB65E4D43E5EA74237988A7EB67404656 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 641794C292A1A590F909D01F175E012671AEBF1E432295AED662E74C1EEA5DD4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7984AC47362281DF446BE46AEC5D9A94B842F6F5BCCB01FD564318A49F94042C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 74F84174C9E2EBBEE396727DBB1C9CFAE2809D802F7E7CF8F7515FA3A629ED98 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7A9E862E27444A492C91CA2EE5E93369FEB74BB881AAC74F895D97E61500FA99 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 638E347CEC7121A668AF985E56F7F3934D852FCF53283B767BAC213337AAE99A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 45DC398895DA1B415708B4BC8B7EF133849E0E8E99945AE4D9C894FDF6D2815D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 1ACF1203B698FE2E3375E251EBBC05D387FECABDE6A9194DF5195F3FBF1E3502 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = F6A064BDC6EE0777B09CC1A0154F28AD282D4D6E48F9DE11CA083B8A9F454891 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = FE68FB721E181EA8A62CDD3CA0278C6EB1344DF07E73676D3F0DC501D99721C3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 72923AD92EF01BDB90B9639DD411E4540CE0F531A0AE401547FBA03CB850B63A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 0B1D0F485A4DE59658FE61F1F0010D9EF5A2BA97624CC3687D94EE4335777138 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7423264FBF5EA94BA461BD80B2518B1CAF3757CF5BAB4511144637F5DC917168 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 589FADA29BEA438C12CA96241AA492FCFED48C1C1C05C16C88CD7A8B46E16A0D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 319B5D23945A98C9480E6460CBCB86A8B36038A28500A36182B228060713F58B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = B81B723D3E18A074078B7D041E55B9B130953ECF70BF773273A28E11238651A5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E660AC40BC4700D4CE85AA43A2A39A24D0F255E64A9251D7442AEFB6EDFD43A8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C27914CB70EA29C06B321E4F61730CE6679A342733738BE72C97EED40802EC17 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 764B78FA0EC12E017D9F7C69FF53FA8FA00E7185888F36DBC3CA9A10A6122FBA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = E2F9F554823B38D2099DD27E0AD6AD69BE137626840B41B7CF081D7881C47CC7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 403E453BBAF997A75C4517B588431C75BCF01208B378A4F4FBB138217A9CA4A2 # Here we combine multiple values to test parallel operation Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000 Out = 2CAE7C0460EE2FC3200923A1B6C2ABEEA746C8B44F6C3FB941BD3AF02A3E6E3E45FAAFBEE792EA704EE3D08CFA9D9F5CF93FEB3443E0049DE5898A48F5A3D92B720F072E7796310AC1BDDD3714581EB95896723DA3E61E0892B43F65A41539655E6671D1F792673D63940E69D78A3471B3C150707DA72E6C25CBD2C4DA2B97782E96F027C2B62ED2D2EE692A992ACAB827D16FDA71DD98109A645E4094923D3BA38D7F334B21394B28A29FC9CBC68AD9F2AE85E7434D1C2F57AAA4C1A49DB759F67B5037CE9193023095D43DE312523F99E6CBCDF43EC00A947284496E311DD67DC030A91C39EC8558AC10044AF79D4CCA92BBC8093B3A2456E26350E35EEBDA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0080000000000000000000000000000000000000000000000000000000000000 Out = 99260425AA126953E04A3D959F9153404521EC64C3B35E61EEBA67AAD2C1295A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0040000000000000000000000000000000000000000000000000000000000000 Out = 65C380354899581B2B40EDDF40A0695FB608DCDD11C6B0C2CA6BB427DB1D2A9D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0020000000000000000000000000000000000000000000000000000000000000 Out = BBD1C4488D41FB1B096E835AD29FC3DC5B97496BA638625D78B99C5ABBDFA13A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0010000000000000000000000000000000000000000000000000000000000000 Out = 7AFDEE496D690233ED0717E2D92DE3A102FDF902E51E69FFCE244B84A69CA826 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0008000000000000000000000000000000000000000000000000000000000000 Out = 06D8C3E7AAC698D143013B364BD7ABC4E4EB6BA82BBAB2A4A0B486E70E24592C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0004000000000000000000000000000000000000000000000000000000000000 Out = 727A8BF64932039C3409ED31CFC0171651BA69D551E8073A4BD1D35F31F52336 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0002000000000000000000000000000000000000000000000000000000000000 Out = 9EE7CA05C4161860014BEA89FB2DED90B4F0B362AD67789C6045C9C71310A8AA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0001000000000000000000000000000000000000000000000000000000000000 Out = E924224559E43960EC44165CAD471CFED381B279B3EA4AF96BDB071BE987DA0D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000800000000000000000000000000000000000000000000000000000000000 Out = FF189222046B5F4FB491CDC9A98130D772629F3EF44A06894268C507C25061AF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000400000000000000000000000000000000000000000000000000000000000 Out = 6B053BA7765F2A62595A1E83444B52FCF16C8BBBEB21B437E6FC8C5F03B3673F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000200000000000000000000000000000000000000000000000000000000000 Out = 0FB836DC6BCDA1C2955CC7A6F25E72C5FFFDE1075D820217157051FB5BD3D3EF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000100000000000000000000000000000000000000000000000000000000000 Out = 200EBC8B8217D9A6895253F9366543027E5F493DBA1A5AD4FC7AB66FB806308E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000080000000000000000000000000000000000000000000000000000000000 Out = 45B33F2465C674941B7E26C5986E42F6814A71323B420E401DCC8DA200FC3C08 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000040000000000000000000000000000000000000000000000000000000000 Out = D2BF0A074053A01A227DC439311BF8BD696203995285A3A2CD3674A0CC6A65B2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000020000000000000000000000000000000000000000000000000000000000 Out = 5FFFAB58BA2CB27AE92E10F36F99A8EFEDF9DE2446A9C2E82E48F22FB1ED8C5D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000010000000000000000000000000000000000000000000000000000000000 Out = 835A1BD7A3688BA0F7C572417A06FCCBCE0A69C7FCDF10C8BCF4469AE80DF11E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000008000000000000000000000000000000000000000000000000000000000 Out = 559D1BECB3DBBE40A7E31C66D97D292821B934818172553FC1CE68AD8E6A741F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000004000000000000000000000000000000000000000000000000000000000 Out = D962BE9A9C4F8DDA6F0EC42DB8B48FA14A1E91E639BD85FF26A2543D9FDFA9A9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000002000000000000000000000000000000000000000000000000000000000 Out = 588B2319C62ED25ECEAB7C327B212F5FCD5D89DE8A85AA3713BF332CF5F715DF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000001000000000000000000000000000000000000000000000000000000000 Out = 67EDE571C64AFF87D7AE5294E64F1709F920A10D278E1629FC8B2BE7EF5ABE0D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000800000000000000000000000000000000000000000000000000000000 Out = 60D9E58A6828847F9644DC165EB508B5A2BC67219B969B605B3CFAE109C9CE47 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000400000000000000000000000000000000000000000000000000000000 Out = 5A0C538CB78F13404BF8D8AF5C43A17F04AD0D35DAD45F88E26B9D1C204B5AFB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000200000000000000000000000000000000000000000000000000000000 Out = 724EE8B7D7BCAC2587C42D92FFCDF7EDFF91F06AD43ED353F332E1FAC3B70F5F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000100000000000000000000000000000000000000000000000000000000 Out = D50F11DACBF340C1315419D1983028DCED83F8350FE50DA4F9554DFA641E99E1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000080000000000000000000000000000000000000000000000000000000 Out = 9460ACD1B739015ED197B2659353AAC465339FAD9D1AFB845A337630332C1C55 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000040000000000000000000000000000000000000000000000000000000 Out = 7D7A56F8A89463C4CE519B96854200C6E05703651CE3ACD5549B59D0B9788B93 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000020000000000000000000000000000000000000000000000000000000 Out = D07E4F830ADF1DE4886C614CDB6B3D988884293AE65A63B3E9886A8727C022B2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000010000000000000000000000000000000000000000000000000000000 Out = 56CCEC1812B3B83086208DBF0C98119DC1CAE316E91B09F4F6F36BDCF73F8873 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000008000000000000000000000000000000000000000000000000000000 Out = E8C3012B0EEB2D18DEA4C06BAC2906DF858BFB8A4D86D6841C02A9E45B2D0455 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000004000000000000000000000000000000000000000000000000000000 Out = E10FB90CB2F5F830763FCEFA386A8E70052AB8994A55DC95FEDF8B71E11D2636 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000002000000000000000000000000000000000000000000000000000000 Out = 848DFB81A0D4D13A40F9119AB77A3B6D2B96E76396B39984739FDF31ADBC376F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000001000000000000000000000000000000000000000000000000000000 Out = 61068A490E20E07686D8A77B81718A3214508E3FE3DA6A6BBAA8ABD67B98623F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000800000000000000000000000000000000000000000000000000000 Out = 9197E2A5212260324CA6E6FA0BBA56B4E5D9934C8B9E42D9F43E901C0994082C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000400000000000000000000000000000000000000000000000000000 Out = E9DC3C1445CBFF1B863CF3FB6B338B4EC29F2C083E65A4BBCC2F1FAC22CCA8DD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000200000000000000000000000000000000000000000000000000000 Out = 80039358C99E64A255D5E4E334C830FFEC8E0CBF2EB6030DE7DCE1A938821938 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000100000000000000000000000000000000000000000000000000000 Out = E508D93429BBE95EE38672A2F653841701F391C68235391367F16415C2C84ADC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000080000000000000000000000000000000000000000000000000000 Out = 710463874DF68B8930CC5CD6A00ABA2BCE27352997F2582EF472ED5F5AFE75A8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000040000000000000000000000000000000000000000000000000000 Out = E90AD04D26F4FF6D25D193CD2C34A2E1C6A1E570CCC705B873CACC94E61F79A7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000020000000000000000000000000000000000000000000000000000 Out = 8E19B69D55C9A2B2CCEACB50EC8007F39C81A0F261A8568D1298967C132BB790 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000010000000000000000000000000000000000000000000000000000 Out = 4051E2FA9032676DC6E11CE947C64C9A0C0FC262AA41F40FA0C4093D1E4FA924 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000008000000000000000000000000000000000000000000000000000 Out = 5DA6F415CCDF1A2D3335A0BEBB879D88CB9C871744111004C0E5AA6D27EB0311 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000004000000000000000000000000000000000000000000000000000 Out = 684C24EC1DD06F6B565890190BE1F8BC7F4537CF5F9CF038ECB6D1D86164503A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000002000000000000000000000000000000000000000000000000000 Out = 6D259C132726524987D4FD96C1ECD943D6B87BB98C61C4FFE41E282EC82F246A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000001000000000000000000000000000000000000000000000000000 Out = 14707F80CC43E4E6321362B0ACFF84FE57E9D477B56637D01CAA09B232D726C5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000800000000000000000000000000000000000000000000000000 Out = FE98609B71F9CD65CD377C98BC4117EC8708E58D15361F9CAC02C64F0452B80D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000400000000000000000000000000000000000000000000000000 Out = 1B78E77F935EBA86B28C9B37818245E2865AF84A73C9DAA735E42E6009AA07F3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000200000000000000000000000000000000000000000000000000 Out = F354ADD75ED9E121B1BFAD9483C6825AEF57BAA2DF08B519640E022E196B313F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000100000000000000000000000000000000000000000000000000 Out = 7E0D7DCC0642CD5BF0C39460C4C183E5F321BCAB5EEA0AC7021E1AECE423E2A9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000080000000000000000000000000000000000000000000000000 Out = D1CCBD3EEA6ACF918569BEC2C900723B4359CA19C58E32ED65FDCBAA30A41C98 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000040000000000000000000000000000000000000000000000000 Out = 361246D37645483C6D13C6500326694A0D577604CDF7CD36586B6C7F96FBE077 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000020000000000000000000000000000000000000000000000000 Out = 0BC890CF369C233EDB99A51CEC75BFF60FB36BFB3EC15F253054F8865CB16DFF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000010000000000000000000000000000000000000000000000000 Out = B5ED5183A00C882F8D213AFCE35C14E940407B7C2A8C9A5A19F289AED42DFAD7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000008000000000000000000000000000000000000000000000000 Out = 22B4EA3A5718D6CEE4EA78725F5BAC735C539C343D7B45121EDDA22CA39D9413 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000004000000000000000000000000000000000000000000000000 Out = 94ECEC21BC3426C7214F266B6442F85B6AE765BD6206A951B2AA14505D19FBCA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000002000000000000000000000000000000000000000000000000 Out = EF77932A5749126D65BD88330C18D91EDBB7FB53D7B3B675EE148EFC893559B9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000001000000000000000000000000000000000000000000000000 Out = BB9E132DC5DE8035433FBEAC46395E861BDA17A4892FFE6BD1B10D6B4D6AE0F3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000800000000000000000000000000000000000000000000000 Out = 7B536CF871F7FF406AD640683F405F0E14D72E77CDD2AB091D9A8E169155CE24 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000400000000000000000000000000000000000000000000000 Out = 2417835AB4BD0A1D3439310480224C52796F3DB3536419F51A09551DFD4A6799 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000200000000000000000000000000000000000000000000000 Out = 8E49C9819DFF2DEFCD8DF3E9EA910F79A9A932F43E4B763D6988CC0924C20544 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000100000000000000000000000000000000000000000000000 Out = 1D364FDEFCB51560E4408CF25FC05E7698235D271E725590533CE24E3F3EC1EE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000080000000000000000000000000000000000000000000000 Out = F1C0422AC64E4D566E799ADA6CE33B59C31051C55ED2212841460CE330F2763E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000040000000000000000000000000000000000000000000000 Out = FA90883588183011F2748ADBC5217BA38CF6787FFD8BFCBEA06ADE193B1313C5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000020000000000000000000000000000000000000000000000 Out = 84EE69F947AEAAA0F1F2DA8C1508733D31F62FEBCF7085C68DEA5A602A566EBF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000010000000000000000000000000000000000000000000000 Out = 260C06AB73B581E29C34FEE05363F532D4C693B5E8025291FC99C48F9CFCEFF8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000008000000000000000000000000000000000000000000000 Out = 98184C744C6A24B329A7827CE0F5B30AE709493A22F9064D1C3F7FED046D1C2A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000004000000000000000000000000000000000000000000000 Out = 3CCDF1C3103B356E7A460410D91F1F00F749EB96F3E89F91248FB5E0949806EF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000002000000000000000000000000000000000000000000000 Out = 49AB6245E93A6CF84BF66A7451D134535362CB8A8CE2E47012BF8B4EF02894D4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000001000000000000000000000000000000000000000000000 Out = 7A92C7BB97CB99AD15EA9DA3A629031901840D23EA4227C699944882E2E8F3CC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000800000000000000000000000000000000000000000000 Out = 00FC7EBE56FCB696D9606FBBEEA6955871B7A03CDCAAE25DFC47D06145371AD3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000400000000000000000000000000000000000000000000 Out = FFF7327A979B527486052C1B99DECCFCC5E680D39613DE4107E8A04980DDFD70 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000200000000000000000000000000000000000000000000 Out = 1E950B49D7D446867ED48272D220BCCC35B104A76A107880FB37D8AE55E69F58 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000100000000000000000000000000000000000000000000 Out = 3B97EDED4E70497DAE02FD51E10AB26888096D2D182A7BC7EE55B6F3243E0144 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000080000000000000000000000000000000000000000000 Out = 94414A0116665FFD8D1589B050A1663DBA15463206DA4E6A735B58FA7B4AA7ED Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000040000000000000000000000000000000000000000000 Out = D586FFCBBF32561B9659306068DD31C2A1FBC8DDF99CF0BDAB3DCC0664B403C7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000020000000000000000000000000000000000000000000 Out = 061E17DB1EAF9884C940B8C72E884C8D9D46819FDDF6724239168DDBEE170B9B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000010000000000000000000000000000000000000000000 Out = D70F322E45E1D64B3D91249E9DE766DB7EF9084120C13D0215F31A6DE2E791C6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000008000000000000000000000000000000000000000000 Out = 5018967FCA5E67F24DCCE2190D24CD3E24A0B709B70DC38F1A4B4FE39CDCD2E5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000004000000000000000000000000000000000000000000 Out = 9108A0540D8D02658268185F06DFF6F2248681D0D9F9F4C6658942FC27C68246 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000002000000000000000000000000000000000000000000 Out = 6595E74A5943DFE1A3FC19ADEBF190CDEC4C2EA0B7CCC6364E0AF7222CCEAA46 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000001000000000000000000000000000000000000000000 Out = 5F156FB20AFD4BC0E4E4B2BA7700A38FFCAF9229E3CBA8C99915B692A76ACDEA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000800000000000000000000000000000000000000000 Out = F0584D66033584791BED0EB67D2A73AA918E0F88F08683DC1F67DB7DD3375326 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000400000000000000000000000000000000000000000 Out = 5EB0956E3DA8ECFC571D5BD1C4EF430FBB10117C6684B8530B6552B812780EBF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000200000000000000000000000000000000000000000 Out = E8C8CB56ED63B5BA16DD833CC9C7AC77E425C284FFD547E8F9FE10410CA02FF3 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000100000000000000000000000000000000000000000 Out = 68704A278A231ED468C1F0CFF43A4FC61253EACBE2BDCE1ED86D89F43263016D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000080000000000000000000000000000000000000000 Out = CA16F899842EE79CBAC4D7CD67172C7DD537E6EA21D48C15B0B34B29BF87E79B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000040000000000000000000000000000000000000000 Out = 9E6E7B31FF5D4D5C7D1C264273A27DA542BFCC6116B7DFDEF6332690B7304BDD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000020000000000000000000000000000000000000000 Out = FE466983DED41AFB1908DF12A5532054C6DB320F0ECBDCE7610BBE2A07AA7F68 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000010000000000000000000000000000000000000000 Out = D2D93C1B66FD710F8B72564A44ACA93995938FEE7C38DE482C9586E3413EB40C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000008000000000000000000000000000000000000000 Out = 6623F853780833A60B60E6467CFA3D3D000228F2C8334F8B00CFE119133D41C7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000004000000000000000000000000000000000000000 Out = 1CED4727527E1C3107A89E77645241D240F3F113AC2BF8319E5D8EFF68997595 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000002000000000000000000000000000000000000000 Out = FA450B3D8A7C03B643DF6EC70867D0502AE20235335AF5932A7016D71A6059A4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000001000000000000000000000000000000000000000 Out = A6F76AB74CE44538579369F5367B826C4EA72EB6EE08A0CFE1272EB435FDFEFC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000800000000000000000000000000000000000000 Out = 8108B48A62A0E0CD58B066C10613E2B589CFB0BCEF4EB58BBF8C88E84A2CD258 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000400000000000000000000000000000000000000 Out = F335D10835B018414786D30923663B77B2E0CA65423B96BFA885B9797138CF4F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000200000000000000000000000000000000000000 Out = 87D8E75FEDA12025B9517BBF8421E837872E8978E48DA51BB8B8574C04731091 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000100000000000000000000000000000000000000 Out = B8A50E6EDFF9711C6064812423F5DC5D77970BE65B545C042A02BACB30A4CD6F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000080000000000000000000000000000000000000 Out = EB98815E5A9337DF35F98D7CF27183EC8423D5F9D145326638B864E0F994DD7D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000040000000000000000000000000000000000000 Out = 3E5DDB36ABD739986483DE7A9EEF2468461A02B55CAA24100394442F0946F337 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000020000000000000000000000000000000000000 Out = 809F726C3BB19BD09D4412B64777085D968ED4E612286008C4BAC69F671E7E31 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000010000000000000000000000000000000000000 Out = 28F2EE8D382DF1AB0CF82B93C7A09B87180E8D19C35657302EFE1B1C4CA11ED4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000008000000000000000000000000000000000000 Out = 76E6887FC464215C9576BB233F5A3A7D98CA73F9B2D06E3BB81BC34AF02C8CE9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000004000000000000000000000000000000000000 Out = E8CEF712D7AF841C4FE7800CB04C27E25BDB41BECFA894588F73776CAAE2A0FA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000002000000000000000000000000000000000000 Out = 868D3A678A216D01A765046E2991A21F9626493063AFE771E3369E5DA2BA7E9B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000001000000000000000000000000000000000000 Out = D6465061FA1B143E1F6A3FCC1601D2D9FAEEF995C457E9EE301A27E8139D1AFE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000800000000000000000000000000000000000 Out = B42BB57D2F25612AAB33EF3213D6D210D9831502A1C4D51C4E72148CBB9893D1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000400000000000000000000000000000000000 Out = CE0EC3C44BFAABE6E18B3506E01199B0F2E0BCA4EA6C29D367EDDD0E83A1C65F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000200000000000000000000000000000000000 Out = 627101F50E134D6F33EF70AF0E32A3AF7C3237E3A5D99319719F175DD0392383 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000100000000000000000000000000000000000 Out = CBCC83BE624059BD8B950BCF486AFBC342CF3575EBA6950FB39C03DB4822EDD9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000080000000000000000000000000000000000 Out = 5EAD7961798903C315DD89BE57105FEA164CA06A4ECDBB5CB10B76711C3E49A0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000040000000000000000000000000000000000 Out = 69169E6E11EAC935E12E6E30EFCEDD7236EAED9C5E1E3B215CD7167AB88B199D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000020000000000000000000000000000000000 Out = 5B08F07728399920CA30DC57CE94CAE85A44530033B2AE6BB7F8E29D7934C437 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000010000000000000000000000000000000000 Out = 8FAD35B4FBC3BBAB2F4BF00D8A1651BE3FD77085AC5E6C7F6E2EDF5048F86068 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000008000000000000000000000000000000000 Out = 71B22D911D9E754A76EC052CD7DC503CDE9A16E9043A04CFA244D8EB19FC21AA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000004000000000000000000000000000000000 Out = 062A10B7F5E3E8D7F3FC2C14E10EC9CA947A8FDC0EBC01E3A127BAFE689D6577 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000002000000000000000000000000000000000 Out = 0FC375F0F68567F1827C7218132B434E84DA6377DB50AB330E8D9BD2754BD1B8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000001000000000000000000000000000000000 Out = 0E4C1117D462EEBCF5FCD7AC9807AF40C403910421CD19A4634B1C86113EB387 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000800000000000000000000000000000000 Out = A9DB2CD2A23780D8BC5A2567961BCA24A41531157D4A229046B47DE48CAE0FDD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000400000000000000000000000000000000 Out = 7195678F00F98B00706E7C497E5FA2BC648EDA00B4B7DFAC6234C8232DF8E071 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000200000000000000000000000000000000 Out = E5C1970C7C0B8E7E1BF871219486359C2E5037BE6E8E637BDB9F11051FB36A16 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000100000000000000000000000000000000 Out = 2426496DC3B09404B609157E2273D526C3E6909B82F65527B42ABDD6348CF602 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000080000000000000000000000000000000 Out = F9870238947E1575AF11D14D12E593163B98BA12E79F05563CBFFBCFB23FDC38 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000040000000000000000000000000000000 Out = 2B1E410ACE9E8875F965A29D90773B68CAC452AE98CEB5922B7BAD936ACC421B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000020000000000000000000000000000000 Out = 180285A7AD7DD8FFD619970804F0FDB9706D5F5C467F815D0B1A455DED9D9300 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000010000000000000000000000000000000 Out = BAEB5C1C68D72F1AE4735F6B75CDF9265E4F6F55DA934C4F118A3728AA2BC0D5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000008000000000000000000000000000000 Out = 9DEBFCC984F55E97C0064335C8A4B7489B7BDD75560EA51982114FCE4D481032 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000004000000000000000000000000000000 Out = DF3B0B54DF4D1814A6F46B8F8B37E27AE8B9EC54B97BF9C523F1EC713EDDFFEE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000002000000000000000000000000000000 Out = 37AA04C74A1E8ED165BC1B4C97265A32B5579D9B2A7B7C883A98B616D5C24FAE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000001000000000000000000000000000000 Out = 83815356746186AE4CC327AB3A8CE04EF66ABD32D44D7089F1D7E301BFE006D6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000800000000000000000000000000000 Out = 2C6C7878E099F55653CA784A0BE4C9EC6201AFDCF99CDDC1ED862D4FE88CFDC8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000400000000000000000000000000000 Out = 424804513D38537C024955F2CCB29BECFD801FC06CD8EC5DE353872F0B50616F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000200000000000000000000000000000 Out = 48C31A55ED4716825D43FF671C01A86CDD792AABF78703ADC58F5FD65B3C0DE1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000100000000000000000000000000000 Out = BF99E4263F2C512CDE33A91E04FACA55052444E40FF79F09716FC06D24FDDE1D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000080000000000000000000000000000 Out = 1A40488BA16A5D0AE6381018F15ABF95C78FB05867E3D7E213CAD7BA3DC9EA3B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000040000000000000000000000000000 Out = BEAD8979A1A485959C3E9C8BF9CCF7CF850EB205296E1E8FF8BCAFBB011FF21D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000020000000000000000000000000000 Out = A8EDCC85F5A941B4434BD4DAD5E39EEAD102DA25BBB2C3D143572AC7425ED819 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000010000000000000000000000000000 Out = 631126B3A837AA4C999EFE6A687BBA58751464A6395670213C8445CC8409C33F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000008000000000000000000000000000 Out = CA4A5FD3A3D2DA973E16C0A849E374C5A293351A66415B45107BD228CB842B19 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000004000000000000000000000000000 Out = A61FDF733DDEC4C3AE51BE778BDD6E34BED64449ABCA7A718EAA513A2A5A9014 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000002000000000000000000000000000 Out = 2C632530E7FCD550B5F9D14E21409AFD07C7E1FBF04B3B3FEC8C61AC8A1591ED Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000001000000000000000000000000000 Out = B2D97A1D343D3D5E1A7E444BA6E57D2E5ED42E02F719ECA22BA47E796AB37B18 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000800000000000000000000000000 Out = AC515AAC675C2C3E46A8F77578189149327413CF40B48E16BF83D3500C2B1355 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000400000000000000000000000000 Out = C8ADC6079B92459A8E975FFFE2352A90629CF9E8D53630536D9EBC7DAC4C467E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000200000000000000000000000000 Out = 97B2C40964B25AE5CBD092E36B37A3BB4520570A9920034C584C66600D3857D9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000100000000000000000000000000 Out = 99A017D3829CEFE10DDD33D33F53EA470A2A74A35ED3BED8B7E9D6EF3B790153 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000080000000000000000000000000 Out = 6141854199F9E01CFE4A35DF918B805985ACC8F8A7456FFBF91D27D4E85E4C49 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000040000000000000000000000000 Out = 28BC7571E7C921B31BC2D7BF55853C2CC5B815B39471907DAE152F685791378B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000020000000000000000000000000 Out = AD751D4D9D635900C22B6166328ECD85FB4A1610D055793BF04A83CB6F5F02DB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000010000000000000000000000000 Out = 8670009356A0A3BD402CF218664826C05BE1651C6E606C011967F8F9C3835017 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000008000000000000000000000000 Out = 6CE35F565BC4F38D73116267C49D345B7B19D57D5C90136CAF512F76AF47FAAD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000004000000000000000000000000 Out = FD0DF28AFE47414F99219AD120F33DCA6F8756B2264349911041B0AEC9D77A43 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000002000000000000000000000000 Out = 49CE284D7A18A0608E5E3768286E919DE97DD81B369AB0A012AD7BDC491DED1A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000001000000000000000000000000 Out = 12B27FEC757A809C68F670698E5CB40E762855022FC12DE2332DB9814FC6E5E2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000800000000000000000000000 Out = 53074884476D09C729F35C3906046C2DCBA7F12BF59CDD3CE73ABF91847C6369 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000400000000000000000000000 Out = D29E3C55DD3D867D7263D2C961FDB6A97B8D827AB73A20479ACB06DF992AEC24 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000200000000000000000000000 Out = 4BE421463C6F2CC8118A50684EB5FC98323EA27F03D4B98EC05727BA0FFA40E8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000100000000000000000000000 Out = A96EC7F07298F9D86A811D0110D60E65C80F3E913B575831A5E8533932196B24 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000080000000000000000000000 Out = F12B579997BA4203D8A0FF36181E4C1B50C703FE32CF18D9BF84355BC404D135 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000040000000000000000000000 Out = 35EBB3FE5FACC9B9D321E82A73C344CA05D0E73372579349A1F365DEA0105292 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000020000000000000000000000 Out = 0F1F0518D57ADC91D810B5899EB7EE7900D05AD8AD2960FE07893F30859B636F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000010000000000000000000000 Out = A6CAF97EF17BEFDCF3412D7F45F72C1F1726198ED3B5CD905DF9078DCD70F882 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000008000000000000000000000 Out = E287019353E8C71C62178B3AF7A3ECA210D79F803F43C09B6C08F295367A30CA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000004000000000000000000000 Out = CF7A7ECEA347875A7B9191BF9FFDC3FB53512052FA42370E39BF5D906EE82D4E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000002000000000000000000000 Out = 7E362B5B5ED5CAB9A518320E498FDB915BFD72BB5C588495AC49FC2D5CEC2134 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000001000000000000000000000 Out = 69254195C6A9A4D334F8F0558A6C9635EB8A397E5AB672E81DC194AFA5C3A8B7 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000800000000000000000000 Out = 3934A6BA3DE9885771111CBA59D50EC684F8F612AAAE3E511C0A211D972723C4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000400000000000000000000 Out = BCEE40ADD3CFDE924F58786640A56A68FE83615EDD82873DF6908057AF39F74A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000200000000000000000000 Out = 70F4E0381A989C486A45FAE5B108373E950843EE48DC2A43E7AA625BF3AC9838 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000100000000000000000000 Out = FAED24C44DE7F447CD1169F4D8D734E55154B73F79B31AD1CD310C7F5529433A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000080000000000000000000 Out = 887BA60DED98C75DADDC1CD0824E7E6C76D947617A919A3B870B489CD1B7F6B2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000040000000000000000000 Out = 33D833FFDB7BEB6BBAB4DDACA6784B88C4B76A49641AA01BC980AB31084F4351 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000020000000000000000000 Out = 8CDEF08AB44C2CB2AB5EC94437E501A96999B30C045A79DE99E220595B95DA2F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000010000000000000000000 Out = 029247C8EC0610E7F5B49FA4191E99CDECBC1E44DF123270901A57DE8ED64850 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000008000000000000000000 Out = 08487E1E53C677CA34640459BDBF7C53247DD54624B9C2156A59F24A818A258E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000004000000000000000000 Out = 2C7C0444738DB202D9236CF00E1B75F579E18CAD4341093675F66732746F8060 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000002000000000000000000 Out = F493AF90C19A9EA6460AE35418D4857236D678B570352665092854CFF9FB684E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000001000000000000000000 Out = 4575CF8865954F9FDCC9C2F7A41BFD52B1C770E2C7609151E41D9B1D0489500C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000800000000000000000 Out = BA0606FA831D4EF759CF457F88B0EEDFDF13BD3ABF72547456052C877B9E3A3B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000400000000000000000 Out = 10E979D310CAD332AA3DC860EF69B2BBD96E817BFB93393AD4D8B141C0A301E4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000200000000000000000 Out = B46DE2A7729FAF7CEE978353D4392EA23FE1BB36732D101377C603125125FE62 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000100000000000000000 Out = F03E1B911C1EDD769CAD59A744FAD47CB5E19502C1E7F4F0B3197101F3B673C1 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000080000000000000000 Out = A9128F8B0C1809095597110471DD7F10040AE71626E8C694BA529B4C9E1353A2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000040000000000000000 Out = B9EDCD81B2CFB461C1FC554ED71CCC958AF4B2B726C011173F4058C40211C496 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000020000000000000000 Out = 400F0635E34B796116E3752A0EDA47C3ABC19641DDD60427B4CE3AA8700CEA8E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000010000000000000000 Out = 0E526F1012B80F22F946FD51D776187DEFD554B1F5806102E7DD9277FE06B826 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000008000000000000000 Out = 1FC0DA71F72D08CDD0F59120C4A88E793869A2C598BAB97C92D6C63C0FAEADA9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000004000000000000000 Out = C493FDECD4D49D5FC6D8590C70BEAAD97EB7694244201CA4CF1732E03D7A4251 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000002000000000000000 Out = C532BFE04C6CA7E8B4ABFF9E8BD9C676CBC9AA78FEF4A2DC5CC907742B3ED64F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000001000000000000000 Out = 5C8F3ECB07F0264162A9C01A6BB2BC5CF3C7B9ED315803BF86A72406C2655242 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000800000000000000 Out = 8C13C039C13DF9C8D821D33E85AFE93EEAFCFC2A2F06D85B3BDE2743FC37AD3F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000400000000000000 Out = 3D990835001730714D0880420F57041E37A7FAF1FCA991AA38C409C80F2DC61F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000200000000000000 Out = EC44357D4F18EBE148B47AB546D6A5F3E08F8F6C9E2B8B6B99FF303814BF43BA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000100000000000000 Out = 00C3B30C81FBC65B9E12C8D6429104FDF40D322D47A59E637FC8CE749725BDCC Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000080000000000000 Out = 6136C065D96E7F18AB296F86AF04BB264A6DA61DEA7C5413C9131B7EBE551B88 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000040000000000000 Out = 2A363A08CAD79DF6A3F2DF5D842B14935C5D09C9D6C78C4989ADCB018A735A5D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000020000000000000 Out = B25955B31CC449A42502D1AB61D699DE558BA2C7825BA06B17B239851E575880 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000010000000000000 Out = CBE2FD81D74436E167D6A5CF8F7DC07338885146351483E4474CD213D853A6FE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000008000000000000 Out = 66DE9DCBF2B85FF944EDD40B3D81F5F8699DB1982C045667FDE9A499A7777DD6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000004000000000000 Out = D940E3F69C42E847312E473E362FD609BE7780D99DAC30F8F095D58EFDC58D59 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000002000000000000 Out = 60FBA04239A8C312E10C7773673E94678CB1E13B069759AF304C56CCA6F490DD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000001000000000000 Out = D67E081F763F322BA82FA01E184C355A65DE8028E47BF0DB5FCAEDA8C2593F02 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000800000000000 Out = 434868F9A6086D0F9218E02CB9534E9EEE88B90C6174A4306B0D0843A35CFDFD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000400000000000 Out = B6CCB5899745E29FEE7870B22C2F989D84C98C4510DEA892666E187CDEF77E1A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000200000000000 Out = E798F9255A21E0ECDC4BA638F0BF03BAA0AD7810844837582193D7FB3E11B5DF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000100000000000 Out = 9BAE51C5C4DF9E55570EF0FE5F2C6AC0CF9FD953E65CD07ED12378BD5A0F2911 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000080000000000 Out = 95ECC45EEDD4537D6A7D54D60A64CBFB6728982441C7EE10B7A84A80B51EE171 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000040000000000 Out = D8D77750B38E522216DA0A1A9DB7C56788E504708A2048B66946FB83C1981FCB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000020000000000 Out = 0CAA8435D051798DB289708EC6CC4C98F0018AB7F068FA0E40443A1F227002CD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000010000000000 Out = 5410408C0306460E6033543669A26A63F7C7BBDFEF4273C9BAD8AC472EDAFB67 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000008000000000 Out = DD3A0F7B61D056015B54A329882E942ECA3C5C3F64ACFE71E3255A8F53E1AD73 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000004000000000 Out = 80A70BE4CC4C61C0F7F501E8068C75CEA78DC11A224D0C47C09D20361C99CF00 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000002000000000 Out = BEF3417464A46BBD2B7E9FB967F4FBF406C2B5B9C8B076B770C199C003786A40 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000001000000000 Out = C1756ADF6EEF9837B43C4B032B17A79C3A583EE37981CC495CA95893F34218A6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000800000000 Out = 90273FCA31968871BE3D5C76AFCB47D9ECC31A48B87988FD359E93AFF6815F4D Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000400000000 Out = D0A5F666F7A819EF8BA114C1872158179731F6989997E13AFD73DB252E5CD2A2 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000200000000 Out = D4E3DA34C47E5A86A723ED5B9F615B283E4CD54E9F2ED9EAA98A7AB8DE41B14C Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000100000000 Out = 547227D086EBB538F5836B8E1E65601209AEB6DFD1C450C014C559D879D71862 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000080000000 Out = 9E52F033EFE0762ED108095BDF6CD8A89F8E1028F0D3D9B39B601C1084F95F74 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000040000000 Out = A049C5B9BD63EBEB23B34EA2F27813D29EDC044E2486D709AC7D2C731557066B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000020000000 Out = 1A9CDD2A99C5ED7FB2A6A1870230B0BD6890567E0E4439E248548DF25CB6126E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000010000000 Out = 41F2CDA0EFE97BCE8689CF33201B4E57E0600BBB1F274DF3D589915F8EA5C372 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000008000000 Out = 1F4712D7AB6D127ABDA90DA977CFC60B44F84859AE4B705851CF687E01E1E250 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000004000000 Out = DC93D915CBBC140EDB08B34406F71B4CD38274E92DE8FAF355D274AE7929BC28 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000002000000 Out = D2D9A648EDAF9339D7EE52419CC33C42E4CA91AA670D14B78952F41F889122E5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000001000000 Out = F34BA77405D00CAFC3E6786CDB26263C10CDC4D6AFAEDF4C26566A51DB82F5F9 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000800000 Out = 21A7EAD6D95FC7AB788206CEA15A25CC4AEB69BAA96C78D5E2851DDBA25523F0 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000400000 Out = 822BC3900195E6F224805E77B2460A65FA1A11CFD473F1DFA65351CBB4EFDFEB Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000200000 Out = 648A71BE1E77866181F980B37690D5C8A37DF29BB2EBC3A41665CD0CCC2E8EF8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000100000 Out = 808E32C933955FF7C8D6F1A4C6754CB3B7311612CFF846D02C81B712C78EB63E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000080000 Out = E074251CC7C5BFFCE2CA45933206B2EE8864156A4626C03EA030B71F8BD454BE Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000040000 Out = 72EBE213A06F63603B49A750808F348FF7C9E4EC72884FDA7C58968EC5A25EED Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000020000 Out = 20618612C2AF418DE3E185AF7973D508DC31DE1E9D9FB4FDF9E95FD592F567EF Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000010000 Out = F94C66D4884A657BF0A6A6EA31A90A07F193F55465575FF1BF8DE68F3441BF4E Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000008000 Out = 9636DCAB40FB991FC330D8EFD671FF83BAA0C9E33D7A146D5E7ADC53592B605F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000004000 Out = FC21689B5F46A011ECFE1E314E03ED7105BAC620193714B2290087C17FB763B6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000002000 Out = ABD2583E0FCC95122FDC700AF9B1FDA50D91E752E19BE9D2EE4F5E22033D53C6 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000001000 Out = 3501CD56EE5EA39AB32F38371E5C2CF6EEEB9DA82D210A8D88AE8F29917AE9F4 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000800 Out = 7559A2AA6CBFA8A181565EDDDE323DB80CE740545FFEE13B4851980AD2451E24 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000400 Out = CEF6DBFD1FBCCBB587BD748D6CC992F8EF671A829E2D6AD73D1DC1C1B2A9E8DD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000200 Out = 46FBBCD26A1F879746BDF4FF7804A5C105F621837ABCF94F17123B700A58A08A Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000100 Out = 0B10D2DA0E0FB6F067D641FF7F8C9C8FF4E2D689450787B7136ADF38DC1F2948 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000080 Out = 4492E09E73459BF74417FC0D7190DA719A891C9CAE14801944FFB24912E377A8 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000040 Out = 76D72C3D3AF6F2FF6AFBC0C1A553E6F8171D81D6BB1CB3C3A6C43ED826A88FAA Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000020 Out = D912041134584B69AC01938EC88913DBCFF7CDBE93CDF7443BD465F1B2E3F7F5 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000010 Out = F0883EB64A5345CC9A0055D4E882D199EFFC334C05B53BC4132AC1A51BA39A9F Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000008 Out = 276246B0D93A4E6FF05832F51D2BF60641B63594EB90A1E08A7D98C6DDAE1461 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000004 Out = 6AA2B04BF65F4213583CED5347537123DC3BE0703209170D1D34B0B8A66C1C58 Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000002 Out = DC438414927E453DBFD91DC60C635EE4273A9921A134DB513AB2BBDBAE64A9AD Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000001 Out = 45D43E9288738C5AD1A683D8DE59CEDD22D666A2B7078EB1301B532A272D570B Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 7CA51614425C3BA8CE54DD2FC2020AE7B6E574D198136D0FAE7E26CCBF0BE7A6 Key = 01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 In = 0101010101010101010101010101010101010101010101010101010101010101 Out = C4B7C6A9738C77EE28F7E685C8358E0AF88FB6D23955EE6DF49FE3F5DA16F826 Key = 02020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 In = 0202020202020202020202020202020202020202020202020202020202020202 Out = CD108DD9EC1000B79C75AA3DCC88F913E6F52773853035A5C44F3245B134CBFF Key = 03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 In = 0303030303030303030303030303030303030303030303030303030303030303 Out = E8F9DE8F066B675AE90C919FC4981603485BBB92382D8C844CAF707973D5276D Key = 04040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 In = 0404040404040404040404040404040404040404040404040404040404040404 Out = 6AA777340200C1B65AB25193A8BB267C233DAC7E1B3C523D406FC5B567B7B586 Key = 05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 In = 0505050505050505050505050505050505050505050505050505050505050505 Out = 6B14A9C454143376DBDC3C93FB8096B09C01456B0B55412FD9692CD7CB587069 Key = 06060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 In = 0606060606060606060606060606060606060606060606060606060606060606 Out = 3FED53DEF4FBC1D012B36562132AB40049818DA4E62E86716DE5EF70790B0D6A Key = 07070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 In = 0707070707070707070707070707070707070707070707070707070707070707 Out = 7A428F7A6841BC8F0E99335C5021C413D2639321DC8D9F280A2F0EF4B420A212 Key = 08080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808 In = 0808080808080808080808080808080808080808080808080808080808080808 Out = A23BE32D37FA4054EC45D6A9CC643AF9124EDAA4AD9ABC7FAAB449D39D11B128 Key = 09090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909 In = 0909090909090909090909090909090909090909090909090909090909090909 Out = 972195D6756F7D3A4D13BF49BFBCE7D164460355150C297A41CCC6AA9F31C5D6 Key = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A In = 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A Out = 2AA722C58EBDB7701225BA9C3B1F7C946D57DEDC74FEDDB637EB14E27A0F0CC9 Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Out = 1C9A0420B9F6EF013FB3ADB4F20C862B61702BA479276E3187322B33D4B128C2 Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Out = 666CC3862BAACADA4D35A9079D52438FB3B4416C9938397E61D48066B6476068 Key = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D In = 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D Out = DB94504EF884901FAA5778199329A2DCC9AA50A4453172CE8ADE11BFE54234E9 Key = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E In = 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E Out = DF0B4204DB7E0924BD2931C131E6DFEB013A5844F717DF7A2DEF86FBC2125DA6 Key = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F In = 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F Out = D7C2D4257254E7A05657047B43B65AB778C9E6ACDE53F14000FDFC346CEE4BA6 Key = 10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010 In = 1010101010101010101010101010101010101010101010101010101010101010 Out = F64819DFBEBE0A6DB650E7072CE28EA606586418B317785FF0AD44212A84C82C Key = 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 In = 1111111111111111111111111111111111111111111111111111111111111111 Out = 155B7E6FFCC0AA874E22494545374E97C08A3D1B1045A0F35FFC54B2842D02A4 Key = 12121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212 In = 1212121212121212121212121212121212121212121212121212121212121212 Out = FEE12FD9E87DCB4FE5C5249E3EAEDA0514F6A4826C1A5ABC87E22B95D4A84851 Key = 13131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313 In = 1313131313131313131313131313131313131313131313131313131313131313 Out = 1DA785C2A2CEFED459474EE5401F5B795F6ED468DBB924CFFCF65EF465DE9534 Key = 14141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414 In = 1414141414141414141414141414141414141414141414141414141414141414 Out = 4434A4D83273B06B64AF4ED1D70EEAD50DBFC44C5931A7B7B98FF9F514B229E9 Key = 15151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 In = 1515151515151515151515151515151515151515151515151515151515151515 Out = 1AB982A6C64C2C42D05F9FB8ED9BE0EEB5B48CEE8EAB0250D98D43157E999EDC Key = 16161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 In = 1616161616161616161616161616161616161616161616161616161616161616 Out = 83291A3265ACAB71E5CCCF0281A433579F39AE6C2FB7CB7528D7F820158177FF Key = 17171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717 In = 1717171717171717171717171717171717171717171717171717171717171717 Out = 90F1FF9F69854321CFC6D0A4541CCDF73C1A1DC737D96FB76F0DDD0BB0097BBA Key = 18181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818 In = 1818181818181818181818181818181818181818181818181818181818181818 Out = ABF9813765AFBEA9BF26026716294D5C5B309243339ECC9F21CEADE6E7083266 Key = 19191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919 In = 1919191919191919191919191919191919191919191919191919191919191919 Out = 7B5C8222D85392E82E703ADFB0FF02DBD2297791B84E26A3A1ED12309247D064 Key = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A In = 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A Out = 227355246FCC9106FA5572475E8C466F1140CD75A8A84DFCD2B0908392914FD7 Key = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B In = 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B Out = E5E5A887FA888691FF93014C2E368DC10775A447A5EF4B632A089DA82D245BE3 Key = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C In = 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C Out = BA417FC94107761C0969EF6EA7DDC74E5F85CAB61E2271CEB6D9C98B139F4576 Key = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D In = 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D Out = F3B85912DF6950B9AE28CE08E456D494E0C949A36FA102540C51827AEC9168AB Key = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E In = 1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E Out = 1AC0ED993D24366380522B05F97B6FC64B199241A1D556B992632AEE400F0494 Key = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F In = 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F Out = 3550CD591130231B0F01F6860B699715B98B9497B4035C7323000D67C5F0B1B7 Key = 20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020 In = 2020202020202020202020202020202020202020202020202020202020202020 Out = E267D6113C27170A3EE6DF496E801A6131BBD3444365D7C03791E25610F1A0E4 Key = 21212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121 In = 2121212121212121212121212121212121212121212121212121212121212121 Out = 3D71B778381E70BCC1A7B8411208225FC922857E862FC17312E3782CEA289B15 Key = 22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 In = 2222222222222222222222222222222222222222222222222222222222222222 Out = 16B41DE00DBF29B96CC59E246DE3188B786E097394E9EEE2250169AE00306FD8 Key = 23232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323 In = 2323232323232323232323232323232323232323232323232323232323232323 Out = 99DDE88C9F26D270B3C507A25FE49955A0FEA6C8FEBAD133842DA1CE730EEB7F Key = 24242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424 In = 2424242424242424242424242424242424242424242424242424242424242424 Out = 9766D3F9E73987EE10A20605C8338C0759A7024CF2DF549DE5084EC4902C550A Key = 25252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525 In = 2525252525252525252525252525252525252525252525252525252525252525 Out = 0FFD89849C8EC5A46B8F43C799ED305AF602C73E810FC729A8C9BB0F5C55CD54 Key = 26262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626 In = 2626262626262626262626262626262626262626262626262626262626262626 Out = 91956E101CE4546623A5BE49811F167476CB568972CEBF7A59EB27DA524A0C6B Key = 27272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727 In = 2727272727272727272727272727272727272727272727272727272727272727 Out = 7DEC5ECE0D590EE3E099C07F2DD6A6A9C71632D277803FD007275B93369ABED0 Key = 28282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 In = 2828282828282828282828282828282828282828282828282828282828282828 Out = 039C192AFC54EFDE1ED3610B0E9F95AA08D7CDC6AE71A66B5C508E4D14C038CF Key = 29292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929 In = 2929292929292929292929292929292929292929292929292929292929292929 Out = D558F8F4562BD8FE816FABF621556C8416C6FD00209028DF978F8915CC093E16 Key = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A In = 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A Out = 1AE21791ED4B610DD693012518759D6E9C1BBF206482EEA43470F02B493CFFB8 Key = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B In = 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B Out = 34F2112E8FBD1B373BA8400B05321F658FDFE0DC87C1304C36766DE71840A4DF Key = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C In = 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C Out = DBF9B56BBF2E50DF321CA687F8BE0E6222E7DF52B4A142174058CC119D9EC0DA Key = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D In = 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D Out = 8B2757374F778FE0B30D11AD7116CE37E2AB858A4E1C50D1115B6E328F3635F5 Key = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E In = 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E Out = 06588A873366FAA47323C9A098A759718DFB0E310C91A4E38B42CC56A0757811 Key = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F In = 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F Out = 7B861B18E3F322D8000BDDCBCE3B50405AA923375568F16AE84411E91DB879C3 Key = 30303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030 In = 3030303030303030303030303030303030303030303030303030303030303030 Out = 170F74A4D692C302551EE17CD544D65185112D2A5E812D203B36FC39BF1DA9C7 Key = 31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131 In = 3131313131313131313131313131313131313131313131313131313131313131 Out = 0178F59DDAB05A4DFAF66FD406170E08227096EF9712CB481A26EBD82F470D7A Key = 32323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232 In = 3232323232323232323232323232323232323232323232323232323232323232 Out = 8BAC479F3A92DF71F973AA457E19D75FB0F1A0FE68FF440A86154721BCC345D4 Key = 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 In = 3333333333333333333333333333333333333333333333333333333333333333 Out = EB50A10C7A0ED9960CDE0C3EDB899A6B67324B1EE23DE4BB13F60D187C3CBA35 Key = 34343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434 In = 3434343434343434343434343434343434343434343434343434343434343434 Out = 00AA782AC61FD06DC781E3C5662C65BD1043EC28D056C98F07074DA7C11C1E1F Key = 35353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535 In = 3535353535353535353535353535353535353535353535353535353535353535 Out = 23B9F2F26CFC51ECC6DD1AFE614C2DAE8348DA033F9B67AEAA87B71F5377D95D Key = 36363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636 In = 3636363636363636363636363636363636363636363636363636363636363636 Out = 9655D4B1CBEF855401274C3339C16DB9B5A9651F60579CFE8554B6EE25DCCA0E Key = 37373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737 In = 3737373737373737373737373737373737373737373737373737373737373737 Out = E072ED2DAD79B07C48B50ED31E02FD9705562525D49DBF45DACCFDF35D5A6965 Key = 38383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838 In = 3838383838383838383838383838383838383838383838383838383838383838 Out = 287638BAE945B88A95029155BC47D033B5C5C4C191F079C234C6E97683FFABA0 Key = 39393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939 In = 3939393939393939393939393939393939393939393939393939393939393939 Out = 500CD3B02BF6FA8C66D1ADE0CE43B325A759CD3426096084A261F054D798F885 Key = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A In = 3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A Out = 17614BAB583F2DCF809A2AEE973A4875251B571525521B3A8C47303450B6301F Key = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B In = 3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B Out = 978C8DFD9AC74FF670CC8B31EDC8EC15DDBC2854375ED9BA07BB0F7B96C70BB3 Key = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C In = 3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C Out = 994CA36F6230C7DB63CAD61342FAB3F155C361DAD458FC457AD09ACCAB2EB43F Key = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D In = 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D Out = AC06659932208AC1DD5F07448A7407232F1410CDAC92F7C5305C4043C559345F Key = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E In = 3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E Out = B55616F0743A29655FEC468CD30C8C65F7925327665670BA9E41A2E09C05C63B Key = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F In = 3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F Out = 78F4852712C3547547A114E73F52C6128EDD3F29E0B2C938D6F9F69AF2303FD2 Key = 40404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040 In = 4040404040404040404040404040404040404040404040404040404040404040 Out = C97909916EE86FFDCE8A92903046109B53F788A53039434DF1A394DAD6F697A2 Key = 41414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141 In = 4141414141414141414141414141414141414141414141414141414141414141 Out = C3FD3C59D37D44AF9EE6B87AC0939A4A4B2FBAAC23E80E72B1CAC352FE30A8E2 Key = 42424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242 In = 4242424242424242424242424242424242424242424242424242424242424242 Out = 94C70F7654479BC9DA9854129F57F3E69C31B63900A404F577AF1C83CD96E5D6 Key = 43434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343 In = 4343434343434343434343434343434343434343434343434343434343434343 Out = 71DD024E9CE700B373A275AA870A68B5DAD9E47D38BC18F34073319041A1CADF Key = 44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 In = 4444444444444444444444444444444444444444444444444444444444444444 Out = 274D101B2BD0E7CAFC9E5559DC68567DC8975056B84573C4294D78513B7406D8 Key = 45454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545 In = 4545454545454545454545454545454545454545454545454545454545454545 Out = 8DCE5B5C376E42F11A322D8CBCEB8C0AE1EC24F3C65D72B326708FEAF13E3B51 Key = 46464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646 In = 4646464646464646464646464646464646464646464646464646464646464646 Out = D62D3BA9BBD23F4424EB929AE7A4CD83A70FA7EFD2E6CCFED23E1176AFDB69CD Key = 47474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747 In = 4747474747474747474747474747474747474747474747474747474747474747 Out = FE7670925FEA3AAE1F039590EA230C094C3E434BF1350B12D4EA26E48A6EF7F0 Key = 48484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848 In = 4848484848484848484848484848484848484848484848484848484848484848 Out = 3A57E728BFA31AA36C8E4ED38A34B465BA233AD066225F31651C93B870AAFE6D Key = 49494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949 In = 4949494949494949494949494949494949494949494949494949494949494949 Out = 3B56014035A28EA6F2F2B09429FED7FC0F5B76D5458F1EB4F3AAA7E7F6610C65 Key = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A In = 4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A Out = 2D28A28ECABAC61B540CD933BE43AF16F11429EDE8E7B62121CD853054363730 Key = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B In = 4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B Out = D8A892E3C24C6A2EB8446B3737A0E3AA1478811B819FFD3440B5307185906518 Key = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C In = 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C Out = 798AD5E43127299B61247059F508268CDBA78B46D4FD28C200AE1052C52294E7 Key = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D In = 4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D Out = 63F43065BA1F262D950219D71B9CD5FA78D6798BCAA981FE3391FF8EA735E4C7 Key = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E In = 4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E Out = E8E461EB5FD98011A37765ECA336B080D58B35C636AD6F423893EE768913255C Key = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F In = 4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F Out = 7348E30FFC0C4F5569B6490622A34FB015C364944553582355887BC472279E8D Key = 50505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050 In = 5050505050505050505050505050505050505050505050505050505050505050 Out = BE28CB05EEEEDA8FD8971E9970ECBCA25856F66E95AC8B987C69F04BE3276CD7 Key = 51515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151 In = 5151515151515151515151515151515151515151515151515151515151515151 Out = 5D336C5E34D4EB95CFAB87C542C72A748AA45E7F77D841A738017927C7908804 Key = 52525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252 In = 5252525252525252525252525252525252525252525252525252525252525252 Out = 2942A594A7964F41460EB6037DDE2C28FFBFFB3C21F7EFF43F06632DA980ED8B Key = 53535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353 In = 5353535353535353535353535353535353535353535353535353535353535353 Out = 1C0F7A4E3147BC7F8150D8144ED31D0054FF15414E5DBF289BFEC160D22684AC Key = 54545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454 In = 5454545454545454545454545454545454545454545454545454545454545454 Out = 7931C7B9D78CB50610B1BEF596268B94446FCDA44C3EE7CEE53121AC519C4001 Key = 55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 In = 5555555555555555555555555555555555555555555555555555555555555555 Out = F4E331C357C603EE5ED5547D75B54631A68D7CD74C5075198D0FC38E5661F556 Key = 56565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656 In = 5656565656565656565656565656565656565656565656565656565656565656 Out = 378C2887958E31971E8F59C882730E48407E4DA9C26D4C76B672CD53202AB1B8 Key = 57575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757 In = 5757575757575757575757575757575757575757575757575757575757575757 Out = DBE68FE249F4A8D36E1CB49DBE20ED58649CCC502F85895875C1FE82269219DA Key = 58585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858 In = 5858585858585858585858585858585858585858585858585858585858585858 Out = 103BD780F3B382C4B28E6E1CB41CBEE22CC1BB64E4A0147D658EDA96A6E7FEAB Key = 59595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959 In = 5959595959595959595959595959595959595959595959595959595959595959 Out = 382EF838282E0F4BA729083542BB8CB48AB874FF568DFDA56AFC4ED266DD3243 Key = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A In = 5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A Out = 088665DE8F9DC9298DEF4164C12526597F56859AAC2C96A95645A06014BA689A Key = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B In = 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B Out = EC988946646A1B2DCC7EDEC4FCAB11BF29055A226F4C75D28F9DFB8D2EB5C9B6 Key = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C In = 5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C Out = B77221CE7F68292BD4E3A55E8EC7BD1FC68B1B6B02F1008586248833C1089F5C Key = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D In = 5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D Out = B3E4AA5DE6D25A6237FDD97540191D669C64E54A7D3C544E949489355AFC82B5 Key = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E In = 5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E Out = AAA6FA046AC4270B22A742C4C29445EB38511E5048414886EBF39523B7EAF76A Key = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F In = 5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F Out = 4D23440171778573BE7B515C68FA99D0426A32111CA493337E7C55280A90F697 Key = 60606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060 In = 6060606060606060606060606060606060606060606060606060606060606060 Out = 8EE711FB281CBAA99917C85F0623B68E2EDAFEFCC3B1B841883D71BA6683568A Key = 61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161 In = 6161616161616161616161616161616161616161616161616161616161616161 Out = EC29DAE53DB4475F8900311F425FE60CB834A82F2A6A2DB4810F95F4D6991B84 Key = 62626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262 In = 6262626262626262626262626262626262626262626262626262626262626262 Out = 91E58DDE741553572B5D6F3DAD25953906424FF217497226746A25C0CE1C7D0F Key = 63636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363 In = 6363636363636363636363636363636363636363636363636363636363636363 Out = B6EC4D9421AB011D4EEDBC32B289E45AC44CAEB1DC5FAEA752DFFA0137325067 Key = 64646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464 In = 6464646464646464646464646464646464646464646464646464646464646464 Out = D9CB13EA06CADF09AC446F9B09553FFE3BF4F1152997B171C03E609D4BD60ADB Key = 65656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565 In = 6565656565656565656565656565656565656565656565656565656565656565 Out = 2D07CA161326ED154D9E3FF650963557EC369A91ABB0D49FC1F32AEF39A3B12E Key = 66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666 In = 6666666666666666666666666666666666666666666666666666666666666666 Out = 28E8B606EE621D2C5B865B8208C7BD40C3596931CE3FF8FA5AD7EB8EE4480E95 Key = 67676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767 In = 6767676767676767676767676767676767676767676767676767676767676767 Out = 9B9B3A23DA29539DA1E9BAA20449750EC192CE14A5063E1A2FFAF5039A665754 Key = 68686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868 In = 6868686868686868686868686868686868686868686868686868686868686868 Out = D770E305A9C2D257759D8AE9E70C408D1CB090F976BBAFF3A56730A78BA8BF4F Key = 69696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969 In = 6969696969696969696969696969696969696969696969696969696969696969 Out = 453988B10DFD852D1AFD11E96C50024571CCB0F19E7C3C4981F8B8BDCD11F720 Key = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A In = 6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A Out = 17DFD98CB5C24610DD631C4E2749A679D68F854F21AABE8BF67605A256452AD8 Key = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B In = 6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B Out = DA260145EC80E19C18685540AC71FA460DD4427168E37BC6E0F967D90C306FBB Key = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C In = 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C Out = 2AC246E2E384ECCC4BC69CE82EDB51C05DD864642F1E9A572DA6043DD1D56DF0 Key = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D In = 6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D Out = D1A06B820071CC4122F0B0797A294F31922E26703CDEF15A6D8F511CDBD8BD3F Key = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E In = 6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E Out = C8D23274A1FF6AEBDF0BA70FBA7A895277B1CC8040F8FB2814195E3A7E85BD01 Key = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F In = 6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F Out = E0133DC7960953BABC7BFBA52E88DCF86EBD979D6D63EB19466EEADEDEDEEBB3 Key = 70707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070 In = 7070707070707070707070707070707070707070707070707070707070707070 Out = A1A9527766EE54D566D97E7A0763A5AECE86F2816411AC2066439D6BDF02FEA7 Key = 71717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171717171 In = 7171717171717171717171717171717171717171717171717171717171717171 Out = E1833EF5C2BA2EF192642164F0F2C02A7334EF5AEA37E9DD56D17AE6CB031004 Key = 72727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272 In = 7272727272727272727272727272727272727272727272727272727272727272 Out = DD2CC0EECAA7E5364376FA73E12C64A0C42FB9FC7E94EFF0B22A051D6EDFE905 Key = 73737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373 In = 7373737373737373737373737373737373737373737373737373737373737373 Out = 9A72F15B911E6A50A32EEEDF83B62B628E37ED403085180571DEBEA2F37CF49F Key = 74747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474 In = 7474747474747474747474747474747474747474747474747474747474747474 Out = CD83CE7861EE8259A9C29BC3870EA1BF629ECD31F2E18F0BC12221F239207457 Key = 75757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575 In = 7575757575757575757575757575757575757575757575757575757575757575 Out = 7B4218C5AEA4EEFE17E2AB110D8B63A947F21D5210162F6283EDDF00900CEE27 Key = 76767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676 In = 7676767676767676767676767676767676767676767676767676767676767676 Out = 935DE2010B112937A233E7CB1023FB9D3C46D7C688A478A94F86AD3919FD2728 Key = 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 In = 7777777777777777777777777777777777777777777777777777777777777777 Out = 416A91A68A520732E672ACB5A36599D9A99901F013CC460D9C2FB16AAB45996E Key = 78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 In = 7878787878787878787878787878787878787878787878787878787878787878 Out = FD066F9C65CD3D61B43F5DA44F7B94C85541DC5E09D52B044DA963699C39FDA0 Key = 79797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979 In = 7979797979797979797979797979797979797979797979797979797979797979 Out = 63937A7953E453B6E48539FACBD1BC489E03D209DB188837C5A09BA458FFFB92 Key = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A In = 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A Out = 68F9EA0F87112633611052A45BBF32B7069079EDB16A928CD2AA16BE464178E3 Key = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B In = 7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B Out = 874D5ED6C8052C3B4AB830626A195F508DDA15388BA75B3D957B26BC134C9B30 Key = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C In = 7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C Out = EC3EA8DC433E39B85E4C4D68AC6A854A1B943D99EB2E9A018EA27DC1874CA867 Key = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D In = 7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D Out = 9CE2298362F1F234A73BECA011EC31B4BC7E143D87B4F118CDADE6AB8D1ED783 Key = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E In = 7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E Out = 27973D9B510ED9C612CC770FC1AE25EE21B1A9616CB64617EDA477939BE98D04 Key = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F In = 7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F Out = 82A0EB8C058E727EBD6032F0F77EE693342C97BD44E9538032652B1CA10403DE Key = 80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080 In = 8080808080808080808080808080808080808080808080808080808080808080 Out = C3C1CD5F3060B3EC4E6ABC0818B68449E1750FB482368C8F3305270E16F98735 Key = 81818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181 In = 8181818181818181818181818181818181818181818181818181818181818181 Out = 26381852C68B646D80E53C958855293BDC6FAAA85C5F9CAAACABE7B8077E4F7A Key = 82828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282 In = 8282828282828282828282828282828282828282828282828282828282828282 Out = E2EA924898ED40FBD8C633706AD7D698392DF1EF33A10FDFCBE51B58C3AE0668 Key = 83838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383 In = 8383838383838383838383838383838383838383838383838383838383838383 Out = 15CBDDA36707819D0C7694AAD46B2345BDEFC9D4F26F03A4BF860CE46F7BB53A Key = 84848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484 In = 8484848484848484848484848484848484848484848484848484848484848484 Out = F96318A42737AB884FAA82BBB7025063E9A25C5957F52A7342E0C03A1A64273C Key = 85858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585 In = 8585858585858585858585858585858585858585858585858585858585858585 Out = 7813FEB148D103075C80ACDFC95E2437A560D9B2E6C910E3A59805338E498907 Key = 86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686 In = 8686868686868686868686868686868686868686868686868686868686868686 Out = C7E9D5FE3BA11096AB77E715DFF0D2EB67E9136F0393CD004A7E994B3F994FA4 Key = 87878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787 In = 8787878787878787878787878787878787878787878787878787878787878787 Out = F7D2DD8DF86A0E985CF6E83AA5922A548C83856D88C2C9D49EA962C9E6497949 Key = 88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 In = 8888888888888888888888888888888888888888888888888888888888888888 Out = C64887C6573E3D7F286C0353188FC93F05321C0C949ACDCB0237725576BCF77B Key = 89898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989 In = 8989898989898989898989898989898989898989898989898989898989898989 Out = 77FB97C9C953BE6BD58044FB1E095BB5E3F4B3A51DAFE6F2F7ADED0FB707921F Key = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A In = 8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A Out = 22DE5F20955357BA1BF70E4D6DA436CCDE28C228031E4A413882C918EF8082D1 Key = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B In = 8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B Out = 146FF5907A3C58593C3FD3EB7498C4426CCE04DD0DA9138954BB97AAC821D87F Key = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C In = 8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C Out = 474ADC5855C87504A7C859409E25154D94B05A925F1D9989AE653B5511710BD7 Key = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D In = 8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D Out = 959B1090C1FF59998C100814E95E40EF94C6F2B7ED0425C78391192CFFFFA465 Key = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E In = 8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E Out = 9DA473108FFCECB228F8809860CDA316F4E1FAC5ADC39BB0373F01DCEBCBF271 Key = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F In = 8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F Out = 905FD0302F9F3C4296E15F94EDD72A8F9F4E9E4068F068099CAAE7247235847E Key = 90909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090 In = 9090909090909090909090909090909090909090909090909090909090909090 Out = B63B82FB4B4961E4800FD13CAF145BEBF3625822AF7F5D3ACF2A4506471C636D Key = 91919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191 In = 9191919191919191919191919191919191919191919191919191919191919191 Out = 63AA9822C7A5A6777D03F901E3BAF91FD566553C88835EF06DB9A983212288BF Key = 92929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 In = 9292929292929292929292929292929292929292929292929292929292929292 Out = 5417F10E4028BDE0F741114632E2090A1E6C83ACB1D03EA98D18D003838B4F0A Key = 93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393 In = 9393939393939393939393939393939393939393939393939393939393939393 Out = FD2C478FB17EE8520149E8A242BB07E0B32929536B191AC6DBCE05891C5E4BFC Key = 94949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494949494 In = 9494949494949494949494949494949494949494949494949494949494949494 Out = 6A36A092BC0F029B60D40440F141EF0DC21A241547359FB618E9243C39AE3D7C Key = 95959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595 In = 9595959595959595959595959595959595959595959595959595959595959595 Out = 605BC400A0FEE12092D369142E4D20C3A4F3D7623254BF9E242766946FC47ED1 Key = 96969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969696 In = 9696969696969696969696969696969696969696969696969696969696969696 Out = 6A5FA33652F946D7C93A56D15B5D3807401C667A9757495341F78526D58659D2 Key = 97979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797 In = 9797979797979797979797979797979797979797979797979797979797979797 Out = 5C6AC175B74B9F7F7D6371A90B1F35E1276628DF6A82B0ECE38590C88B7B8DCA Key = 98989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898989898 In = 9898989898989898989898989898989898989898989898989898989898989898 Out = 67BB4E7818FBE6CFAB113C1B2EC797E3164432BFF708450312422D5AEC70A8A8 Key = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 In = 9999999999999999999999999999999999999999999999999999999999999999 Out = BFDA13CA82E73FBF62B6F1BB7181916CE7FD7DC7608EB958A8246346DFBB04E9 Key = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A In = 9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A Out = C30F3EF137BF7718F76C7E4D2366A48E7C3CE53735BBF8B56CD51609A23AC06C Key = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B In = 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B Out = D73795A681B4FBE858703C15D60299682F64C800E691D223C4BE51012DA4D3DA Key = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C In = 9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C Out = 885A096C820E01E48E1A5F75DB0A007C2A96B66FCAB38AE80CF92DD8B6A35F6F Key = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D In = 9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D Out = 8FBDD4939C31026305C575F1FDCED3DBAE320C56CF064E9F19B44A43898BFD5C Key = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E In = 9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E Out = 2D9EC00B081BC1512EC11A0B8B898639415AEEA3270C4B49E4B47C601AB85875 Key = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F In = 9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F Out = 59565FB9888519C77E9C4E86D72AD86205AB55488D5ED0B9A388FB2D301C4400 Key = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 In = A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 Out = 32D6CAA3D5E0A5D3CCD0FD8F2105CFF662FC4052FE348C2DFD0BC3EEFF3AB700 Key = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 In = A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1 Out = 7C3276EA6BB6FDDDEC8B901C45978B7D4D34AACE9F2D02F7D7F5826A89809DE9 Key = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 In = A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2 Out = C5ABC33559D828DD1464264F94D46A8519B4CE47EAA0EC9BF0504C876AC85451 Key = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 In = A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3 Out = E63050ADB9F2789F91A192E089883D7346DD42DE4C654E1D4B72C77D6C09FDB0 Key = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 In = A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 Out = E7C58AF118E1DFD2A279DE640EDEF02FB4F3C78D778D145ECC6B2C4CCD065229 Key = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 In = A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5 Out = 278D8C11ACFDB851131432B3E19C409F940F93E0F6CB49D076C62E70B9C27095 Key = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 In = A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6 Out = D4839B5679FCA83189BB8C3681E83BAC871A02F297578855034E915F4EF04C12 Key = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 In = A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7A7 Out = 91AFF6474168F1D113E3DC66E620CF2F7283CE84F5FDDECC7E79CC005859C1BA Key = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 In = A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8 Out = 1374026DD442B1C1E0BA34570240F6A9E99781C8307A1544A9D3C91857C7E6E1 Key = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 In = A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9A9 Out = C95E8163D47755E25E8A4BA1FDFF46E016F080F13A794FD21251CE238F28C52E Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA In = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Out = 5DA751854BEEDB19D767A09E2BD9C12D15E51A4409A1F70574496D0A0DA767F9 Key = ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB In = ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB Out = C1A0ADDB98DA358D8F40CDB8FA427770D6BD5705D81A804A9BA27FFAE8790BD1 Key = ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC In = ACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAC Out = 604830D513CB29E0E89A36EAB97FFDFC0855AE212F9DDAB62ABE7572CBCEBFC5 Key = ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD In = ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD Out = 0DB5075E0B9727D439ED88030D31B532B61556D206220CAE70A7B42EE4C5F72E Key = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE In = AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE Out = A5167DC20ED3B1894B10C6AA754FDCF9FC1418439D9CA80C40974E9CB7630A12 Key = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF In = AFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAF Out = 1A90CCEA061A2FB58E4D1F363B6CEEC26BFB55F4F140A18991C8EF50E8DFB306 Key = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 In = B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0 Out = 5CED17D75543C21AA1E020D4B084DB86A77BC445C7E77DA54DC6D786A0976A09 Key = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 In = B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1 Out = BB28F1F9496ED578276F99F3A2D4657566DC2CDDDCF00AE44555DA614C64E54E Key = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 In = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2 Out = 30C28BF86BEAEBB25F4A667FB2B9C183B85B456527EB49B44AA4EA825A44E026 Key = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 In = B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3B3 Out = C2B0DEB4BC6C28869675FB75D2C2081396601B1FA823185D2D9EDE0730BBEAEA Key = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 In = B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4 Out = B3EDC667C3FD03CE50D05877C8A78C330F809DF5F8F7FB11968A3664C77CA78B Key = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 In = B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5 Out = BC2FCF90C52B883CAC3F0A673FA093EEB48952F4DE50A9288464B84A920A1316 Key = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 In = B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B6 Out = 30BCF4063A59823CE94B14B6B65F1B4DBEED8FB30832765B5186F4B834DBEA89 Key = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 In = B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7B7 Out = 51B4C7E8F697FACC24294A2CEB404C4BEC0CA41C76A6B50A824800EA4464C796 Key = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 In = B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8B8 Out = 2CCFF61604C0881CCC6A69B885878D6D07CEA7DAB31719D89DC4ECB0063DF5D2 Key = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 In = B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9 Out = 87998D9F16DC018B5DBD42A2E0C26D3774C2A41986E2D0A1504CE37B6EE71688 Key = BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA In = BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA Out = D774451BB82A62A4C7708D0194F6C129C483CEFD182BAADF5A35EB77892F317A Key = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB In = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Out = B88CE3DF52572A1A1C8253E05D789BBF204E2CFC7A00389429F4C6B428EF8CD6 Key = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC In = BCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBC Out = B854E538E6674A1831F635AA6650A0A4D0730A9A4B12511509EFD49E34D57D62 Key = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD In = BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD Out = A69EF2348FEEF1EA09A2B29A6D977092ECD522A62EE906FA47624C92A872EB17 Key = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE In = BEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBE Out = A1AE0CBC3B5200F1D8AE165EE42D45F6CE8C4FF448F8127B6D9AB4936FC76CA8 Key = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF In = BFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF Out = 91948E36B83E21FF8A5EEDAA48E50E3A292A3B68D20657FA7E11F50BC7A12205 Key = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 In = C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 Out = 56CD17219224C3103E3E3E5CABAB6C1E78DEA9AD27613E8D62901FFA31500BFF Key = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 In = C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1 Out = 2E8FE5CAB2448B194387B160E9141E7D1B879BA1580B3D393B55436608EA2735 Key = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 In = C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 Out = 5DD74E1155DD90840C702145DF6912754FB74B47625EA4C5382326681DB3390E Key = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 In = C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 Out = 3A9F5962554037DCB1FA2AD04BFC0BF79699941500D5F9841320C6D8601310A2 Key = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 In = C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4 Out = BB0F5B68087BBA51DBB700BA1860CC3D0A587E54D57F4014DE4E48E58E529F87 Key = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 In = C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5 Out = 8384025D801AB8EC4D4416F5B7E862B6D9AC9E4AEE334C35FD0296B1402E4975 Key = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 In = C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6 Out = BE3057511C5D0E51315D89671BB4E57E7B590EC3ECE8A14D728248ED8F5107BB Key = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 In = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 Out = 18882618837D15B0B6BD77E1F37470EC58155A2788BDD9D91AEBD16B29A92A1B Key = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 In = C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8 Out = 8FAFDDC7E04C1AF3BBE8428222DCA59D2EF8C9E0213430492ECAB7B414987FEF Key = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 In = C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9 Out = 4D687992D4F9F515FE451AC967CBF75F906D637C3C261758E263A0DA0DEF69C2 Key = CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA In = CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA Out = 9DDC94BFF87FDBAFDB0AB9DC17D3649231300E5E6270600856722324DC9CA39A Key = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB In = CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB Out = 86E9CCD90D7B902D23D82C085B1F886402DBD2D19C5A81A32F318C98C6E2A98A Key = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC In = CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC Out = 164FCD7D1FFE12FF1FDEE6384145EF546A5CD98C22817A5205FF2C2E18339779 Key = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD Out = 4579935A483BAC6B4CCD8C25BCC9E6DEAF46EA8B53F8B5E37CC436EAB85A1330 Key = CECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECE In = CECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECE Out = E5F810DF5B215F559E76EF925F2B795915A7B03A6F7019FAC8E9127A7CE93F09 Key = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF In = CFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCF Out = 2EA0892E2B2F29A63526B37DECD18E31DC970A60E60A4D8414A5BD0D2D5491EF Key = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 In = D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0 Out = 900F155E80A716199EB062827CDDDC4DA857550BA1C265A46D47BE4024706F40 Key = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 In = D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1 Out = 5B495546838A97D8DF4B9CA95EF8350210A3ECAB81469678EBDE1E5846C1F42D Key = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 In = D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2 Out = 60E7E367347BC3F4091CE34CCA288C8AFC6375ED8F4394D904FD8489280D50F1 Key = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 In = D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3 Out = F215EED91D35B7BA649F05C3D1E2B254CB1215588AB78DF54F3CA221AB4A3F1B Key = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 In = D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4D4 Out = 6441A445D808842C6185B81ACBC5AF86386C54C79026BFC21C1DB5111362AA15 Key = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 In = D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5D5 Out = 4EE459EDAC1FE0CB08E80C8C13FCE8C44CBFECF7A7F9F14C15B5A92BB7F34E71 Key = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 In = D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6 Out = 78826499B0F2F402E6DA3CACA36EA35492B7BD2A4D84575D0432E16368E78808 Key = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 In = D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7 Out = BDFBCAE2761BEF6A411156AE01A63F9321EE969C56043F2A44C5D3D4BB017BC0 Key = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 In = D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8 Out = 926F2CD84035F9070C3506E6D7245FEA9A845F2D355785BB17E1D3C34FA81228 Key = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 In = D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9 Out = 6C5F6B1C746967142D55FA3769A9417D5A44875D364DB4412B4F9EB254D9BB89 Key = DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA In = DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA Out = 8329A1E54D9F45DB4E8CE6F1B481C3EE00D5511B52B3CDADCBD562A9F1B35770 Key = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB In = DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB Out = 7A7FEEDEF1950F1A60529743163406CAF167097358377E0650CF0BB35CD783F6 Key = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC In = DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC Out = C52CFB15D2F53156701AE4951AA46BCFC872252447BB14E1CE19CAC074926984 Key = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Out = 79DFF8DC12ABCEC71E7FAE55ABC8C374135ECE2D52834BC77B860252B756D54A Key = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE In = DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDE Out = 62963B66E680BD5602EC86DB7267E15CB1FF6EA698B54EBA661D125400C7F2DD Key = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF In = DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDF Out = 0C2E76743ACC9CC0525D6E2C519D12C369CFA9E27F13068F98D2F32FAD7220CB Key = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 In = E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0 Out = B464640E72C30DF092A5BB00F34568A7C04B8620265EDA53F19F3A06164AF980 Key = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 In = E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 Out = 3725215E79F1FE3DC64B4316449FF98EB52D03330BFC848CD83A407475AADA3A Key = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 In = E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2 Out = BA273F544C5076D523CC75F90E315A39E465D2B25434E6577FE629F27061BBA4 Key = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 In = E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3 Out = 472161A0F42E64BD0FE6D448996C370E2C3A56BDE16B378EAA31740551121B4E Key = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 In = E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4 Out = EA089A10A597504D057E1F03064C9465C1A707C9472A7C0DBAD6978F5BB83A46 Key = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 In = E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 Out = E91B3433426F88FA31A05E17906E55EA1D803ADFE080C51FBD98290CBF427BEF Key = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 In = E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 Out = 747C4999D0256384349A5FB132DE1AAD4D7FC48507FEC206B80ED429AF7FDBDB Key = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 In = E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7 Out = 3F8058A1A9B7B0A9C31B4670EEAA6988BF2D41E9B3417EF899EF12CBBC9C77DE Key = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 In = E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8 Out = 9DA431EC0DADDEC4A76B3830B20AA03D346AD09691FB98FC0E9A8987F7B70EDF Key = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 In = E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9E9 Out = 63BF528E184A43EF807DC9169BDB9CD7B63EE144478A4735EC2EE3A5A7EE460A Key = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA In = EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA Out = 73DC5F8AFA9493AD7767D15A36E7741044EFC225136B4972DC5294E80071A64D Key = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB In = EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB Out = 7EEE75D690458A604D20CD21ED64B228F0C3563DB8FB925341FC02845B6E06BA Key = ECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECEC In = ECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECECEC Out = AA4D9E1A0157AC347DC7A1997718944427BD579DC18B94F181390E8C36A1305C Key = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED In = EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED Out = 1695BC5C3D63F4B0E0BC3225F00BB0B8E8D29F3DC09584353E11510002E2BE53 Key = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE In = EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE Out = C68C7A2FBDA419A515AE816480490BFB2A72A4B6534A19A8D8C6C85FAA949567 Key = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF In = EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF Out = 5F45E7F72A64C66269F83714A88A0701561C3E7AF33BB48887D4439F5DE4A82D Key = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 In = F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 Out = AD49A5C8EB06256147F02301FB47710E915B5A8FC3219C0D56A19382977119FC Key = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 In = F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1 Out = 2387AF70EE04E7F25277E81081B044EA24090D503CE8F64997BB610C762D8F6F Key = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 In = F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 Out = B5D496DD36BA0B47832C170A53760CE5E47B1FF5C28848F5F7A1827E94BC73CB Key = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 In = F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3 Out = 77978F2EAB7E8B6B32C9293B83F51419785A0CD276276CB417ACA806A456A6AE Key = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 In = F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 Out = E3CBD41F80B27C9A684D7C7C27BBCA9FD59E5E81E93B7BC5BFDF66722EF68EEE Key = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 In = F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 Out = 4482F0C362CB423104CAA26E1415B0B7519E1189624D313E65D324C6DC95F516 Key = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 In = F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6 Out = CD72EE9A6919348595286348C7E488DB3648458688F72BAD994B26FE6999E676 Key = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 In = F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7 Out = 03EF38F91710AE8BCC8B9193F6A55A7C90C66300D20EDCF5B4946F3B38BEF6C5 Key = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 In = F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8 Out = B67638D30578AB2319FE275D0B833B50D7ABF01E8760F566D0D441D8EAFDF8AA Key = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 In = F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9 Out = 98B05FF6042436505C7163415E187E09F10C3B1A86FA4B458CE1EF31022F5D16 Key = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA In = FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA Out = B670A350A2CF0478412307EF00F97F8B30175CDB7593FF4686BD614B41444342 Key = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB In = FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB Out = D7FD492E6302265C24FAB910AA1335C29D53406147E853F7604F4AF1A9407E83 Key = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC In = FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC Out = 28926789363A4306E2C75FD1D8FDF0FE6B62FDB2AFAEDDA6F47A565C2781968B Key = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD In = FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD Out = 813C816CD4B18F20BD06E2E93CFAA717EBB6554B556CC33D67530608A9BF100F Key = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE In = FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE Out = 5DC15C83E7C4F5AAF8D8482ED1E443271B28B59288783DBCDDEC3544E3368A6E Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 0598127BAF11706F77402000D730C54A0B84C868A98C6CA4D7F3C0FA06A78B7A # Randomly generated by Crypto++ Key = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A In = 66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD33694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F62023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B34884533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3AFFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8CA99B2C2372ACB08CF61C9C3805E Out = 3E60F958F89E79DF1E70ECF03CE6244A71D892D1855833296E4B245FA3CC18F688F97D9E44AF7CD887BB95DB93C34DE08CAC4F6CC5E41E53F7733BFF48C19C12F06B00EA2517D735A5F939B89B908C281B9121A6C1B26CA6C5465FC0BDCD07CA0C9284A9014BF58395875A4BCFFA523131E84F77D288FEFCEE1B4D4229FB0F31075573250C08ED6A5870C6E3779DF375F869401B4C4ABD4407011EA2F5540A7E572AC2EDAD80F94C5D35C322D2C2934F305B2CDB31B6B890595C80464AA5B32721FBB204EF72AC1F11384318D73D3C79D05A9946103416C4881374182E4D569EC2729610D02993D8888985EB4D1334449D5421ED3E9FE81EFDC5B2F28863F8E480CAB18845D48A436FBA35C1A920443ACA8DD4A5F0D88F0E10C87E45409C28654CB5E630F173453AF4D4540AA85DB48A242B779FBCF6F602700EE165AF5D8775DB665CFA858F92F66B471220C117A5A9A3B51F6C7DE5E41C8551ED101930A57FE38D81F36E7457D0F447023C8A09D97E30760AA0317559C5180239C616539164433A10D6DB2D2D69D23B8506E5D6D9B51B7501458F760B8D17B49324A9931D2A6911B75CFB4AADD58AF1928F723E939BEE1048DA8CA8F1FE7749FDDCE1F707AF151BB88431695926FD81F871A0148C63BA2BD7B369D8C797C71FD86D4F5572820204037132A2BED192FBB4D88EDF6FBD12D43D91E8363EF026056E684A8EB9B5 Key = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A In = 66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD33694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F62023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B34884533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3AFFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8CA99B2C2372ACB08CF61C9C3805E Out = 3E60F958F89E79DF1E70ECF03CE6244A71D892D1855833296E4B245FA3CC18F688F97D9E44AF7CD887BB95DB93C34DE08CAC4F6CC5E41E53F7733BFF48C19C12F06B00EA2517D735A5F939B89B908C281B9121A6C1B26CA6C5465FC0BDCD07CA0C9284A9014BF58395875A4BCFFA523131E84F77D288FEFCEE1B4D4229FB0F31075573250C08ED6A5870C6E3779DF375F869401B4C4ABD4407011EA2F5540A7E572AC2EDAD80F94C5D35C322D2C2934F305B2CDB31B6B890595C80464AA5B32721FBB204EF72AC1F11384318D73D3C79D05A9946103416C4881374182E4D569EC2729610D02993D8888985EB4D1334449D5421ED3E9FE81EFDC5B2F28863F8E480CAB18845D48A436FBA35C1A920443ACA8DD4A5F0D88F0E10C87E45409C28654CB5E630F173453AF4D4540AA85DB48A242B779FBCF6F602700EE165AF5D8775DB665CFA858F92F66B471220C117A5A9A3B51F6C7DE5E41C8551ED101930A57FE38D81F36E7457D0F447023C8A09D97E30760AA0317559C5180239C616539164433A10D6DB2D2D69D23B8506E5D6D9B51B7501458F760B8D17B49324A9931D2A6911B75CFB4AADD58AF1928F723E939BEE1048DA8CA8F1FE7749FDDCE1F707AF151BB88431695926FD81F871A0148C63BA2BD7B369D8C797C71FD86D4F5572820204037132A2BED192FBB4D88EDF6FBD12D43D91E8363EF026056E684A8EB9B5 Key = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339FC99A In = 66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64C514735AC55E4B79633B706424119E09DCAAD4ACF21B10AF3B33CDE3504847155CBB6F2219BA9B7DF50BE11A1C7F23F829F8A41B13B5CA4EE8983238E0794D3D34BC5F4E77FACB6C05AC86212BAA1A55A2BE70B5733B045CD33694B3AFE2F0E49E4F321549FD824EA90870D4B28A2954489A0ABCD50E18A844AC5BF38E4CD72D9B0942E506C433AFCDA3847F2DADD47647DE321CEC4AC430F62023856CFBB20704F4EC0BB920BA86C33E05F1ECD96733B79950A3E314D3D934F75EA0F210A8F6059401BEB4BC4478FA4969E623D01ADA696A7E4C7E5125B34884533A94FB319990325744EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA54D835E8D466826498D9A8877565705A8A3F62802944DE7CA5894E5759D351ADAC869580EC17E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83B4692F3AFFAF271693AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8ED9612EC453902D8E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8CA99B2C2372ACB08CF61C9C3805E Out = 3E60F958F89E79DF1E70ECF03CE6244A71D892D1855833296E4B245FA3CC18F688F97D9E44AF7CD887BB95DB93C34DE08CAC4F6CC5E41E53F7733BFF48C19C12F06B00EA2517D735A5F939B89B908C281B9121A6C1B26CA6C5465FC0BDCD07CA0C9284A9014BF58395875A4BCFFA523131E84F77D288FEFCEE1B4D4229FB0F31075573250C08ED6A5870C6E3779DF375F869401B4C4ABD4407011EA2F5540A7E572AC2EDAD80F94C5D35C322D2C2934F305B2CDB31B6B890595C80464AA5B32721FBB204EF72AC1F11384318D73D3C79D05A9946103416C4881374182E4D569EC2729610D02993D8888985EB4D1334449D5421ED3E9FE81EFDC5B2F28863F8E480CAB18845D48A436FBA35C1A920443ACA8DD4A5F0D88F0E10C87E45409C28654CB5E630F173453AF4D4540AA85DB48A242B779FBCF6F602700EE165AF5D8775DB665CFA858F92F66B471220C117A5A9A3B51F6C7DE5E41C8551ED101930A57FE38D81F36E7457D0F447023C8A09D97E30760AA0317559C5180239C616539164433A10D6DB2D2D69D23B8506E5D6D9B51B7501458F760B8D17B49324A9931D2A6911B75CFB4AADD58AF1928F723E939BEE1048DA8CA8F1FE7749FDDCE1F707AF151BB88431695926FD81F871A0148C63BA2BD7B369D8C797C71FD86D4F5572820204037132A2BED192FBB4D88EDF6FBD12D43D91E8363EF026056E684A8EB9B5 botan-2.4.0/src/tests/data/block/sm4.vec000066400000000000000000000004061322470703100177550ustar00rootroot00000000000000[SM4] Key = 0123456789abcdeffedcba9876543210 In = 0123456789abcdeffedcba9876543210 Out = 681edf34d206965e86b3e94f536e4246 Iterations = 1000000 Key = 0123456789abcdeffedcba9876543210 In = 0123456789abcdeffedcba9876543210 Out = 595298c7c6fd271f0402f804c33d3f66 botan-2.4.0/src/tests/data/block/threefish.vec000066400000000000000000000035671322470703100212460ustar00rootroot00000000000000 #test cpuid avx2 [Threefish-512] Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = B1A2BBC6EF6025BC40EB3822161F36E375D1BB0AEE3186FBD19E47C5D479947B7BC2F8586E35F0CFF7E7F03084B0B7B1F1AB3961A580A3E97EB41EA14A6D7BBE Key = B1A2BBC6EF6025BC40EB3822161F36E375D1BB0AEE3186FBD19E47C5D479947B7BC2F8586E35F0CFF7E7F03084B0B7B1F1AB3961A580A3E97EB41EA14A6D7BBE In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = F13CA06760DD9BBEAB87B6C56F3BBBDBE9D08A77978B942AC02D471DC10268F2261C3D4330D6CA341F4BD4115DEE16A21DCDA2A34A0A76FBA976174E4CF1E306 Key = F13CA06760DD9BBEAB87B6C56F3BBBDBE9D08A77978B942AC02D471DC10268F2261C3D4330D6CA341F4BD4115DEE16A21DCDA2A34A0A76FBA976174E4CF1E306 In = B1A2BBC6EF6025BC40EB3822161F36E375D1BB0AEE3186FBD19E47C5D479947B7BC2F8586E35F0CFF7E7F03084B0B7B1F1AB3961A580A3E97EB41EA14A6D7BBE Out = 1BEC82CBA1357566B34E1CF1FBF123A141C8F4089F6E4CE3209AEA10095AEC93C900D068BDC7F7A2DD58513C11DEC956B93169B1C4F24CEDE31A265DE83E36B4 Key = F13CA06760DD9BBEAB87B6C56F3BBBDBE9D08A77978B942AC02D471DC10268F2261C3D4330D6CA341F4BD4115DEE16A21DCDA2A34A0A76FBA976174E4CF1E306 In = B1A2BBC6EF6025BC40EB3822161F36E375D1BB0AEE3186FBD19E47C5D479947B7BC2F8586E35F0CFF7E7F03084B0B7B1F1AB3961A580A3E97EB41EA14A6D7BBEB1A2BBC6EF6025BC40EB3822161F36E375D1BB0AEE3186FBD19E47C5D479947B7BC2F8586E35F0CFF7E7F03084B0B7B1F1AB3961A580A3E97EB41EA14A6D7BBF Out = 1BEC82CBA1357566B34E1CF1FBF123A141C8F4089F6E4CE3209AEA10095AEC93C900D068BDC7F7A2DD58513C11DEC956B93169B1C4F24CEDE31A265DE83E36B4073CB5F8FABFA17DB751477F294EB3DD4ACD92B78397331FCC36A9C3D3055B81D867CBDD56279037373359CA1832669AF4B87A1F2FDAF8D36E2FB7A6D19F5D45 botan-2.4.0/src/tests/data/block/twofish.vec000066400000000000000000004427251322470703100207530ustar00rootroot00000000000000[Twofish] Key = 00000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9F589F5CF6122C32B6BFEC2F2AE8C35A Key = 00000000000000000000000000000000 In = 9F589F5CF6122C32B6BFEC2F2AE8C35A Out = D491DB16E7B1C39E86CB086B789F5419 Key = 9F589F5CF6122C32B6BFEC2F2AE8C35A In = D491DB16E7B1C39E86CB086B789F5419 Out = 019F9809DE1711858FAAC3A3BA20FBC3 Key = D491DB16E7B1C39E86CB086B789F5419 In = 019F9809DE1711858FAAC3A3BA20FBC3 Out = 6363977DE839486297E661C6C9D668EB Key = 019F9809DE1711858FAAC3A3BA20FBC3 In = 6363977DE839486297E661C6C9D668EB Out = 816D5BD0FAE35342BF2A7412C246F752 Key = 6363977DE839486297E661C6C9D668EB In = 816D5BD0FAE35342BF2A7412C246F752 Out = 5449ECA008FF5921155F598AF4CED4D0 Key = 816D5BD0FAE35342BF2A7412C246F752 In = 5449ECA008FF5921155F598AF4CED4D0 Out = 6600522E97AEB3094ED5F92AFCBCDD10 Key = 5449ECA008FF5921155F598AF4CED4D0 In = 6600522E97AEB3094ED5F92AFCBCDD10 Out = 34C8A5FB2D3D08A170D120AC6D26DBFA Key = 6600522E97AEB3094ED5F92AFCBCDD10 In = 34C8A5FB2D3D08A170D120AC6D26DBFA Out = 28530B358C1B42EF277DE6D4407FC591 Key = 34C8A5FB2D3D08A170D120AC6D26DBFA In = 28530B358C1B42EF277DE6D4407FC591 Out = 8A8AB983310ED78C8C0ECDE030B8DCA4 Key = 28530B358C1B42EF277DE6D4407FC591 In = 8A8AB983310ED78C8C0ECDE030B8DCA4 Out = 48C758A6DFC1DD8B259FA165E1CE2B3C Key = 8A8AB983310ED78C8C0ECDE030B8DCA4 In = 48C758A6DFC1DD8B259FA165E1CE2B3C Out = CE73C65C101680BBC251C5C16ABCF214 Key = 48C758A6DFC1DD8B259FA165E1CE2B3C In = CE73C65C101680BBC251C5C16ABCF214 Out = C7ABD74AA060F78B244E24C71342BA89 Key = CE73C65C101680BBC251C5C16ABCF214 In = C7ABD74AA060F78B244E24C71342BA89 Out = D0F8B3B6409EBCB666D29C916565ABFC Key = C7ABD74AA060F78B244E24C71342BA89 In = D0F8B3B6409EBCB666D29C916565ABFC Out = DD42662908070054544FE09DA4263130 Key = D0F8B3B6409EBCB666D29C916565ABFC In = DD42662908070054544FE09DA4263130 Out = 7007BACB42F7BF989CF30F78BC50EDCA Key = DD42662908070054544FE09DA4263130 In = 7007BACB42F7BF989CF30F78BC50EDCA Out = 57B9A18EE97D90F435A16F69F0AC6F16 Key = 7007BACB42F7BF989CF30F78BC50EDCA In = 57B9A18EE97D90F435A16F69F0AC6F16 Out = 06181F0D53267ABD8F3BB28455B198AD Key = 57B9A18EE97D90F435A16F69F0AC6F16 In = 06181F0D53267ABD8F3BB28455B198AD Out = 81A12D8449E9040BAAE7196338D8C8F2 Key = 06181F0D53267ABD8F3BB28455B198AD In = 81A12D8449E9040BAAE7196338D8C8F2 Out = BE422651C56F2622DA0201815A95A820 Key = 81A12D8449E9040BAAE7196338D8C8F2 In = BE422651C56F2622DA0201815A95A820 Out = 113B19F2D778473990480CEE4DA238D1 Key = BE422651C56F2622DA0201815A95A820 In = 113B19F2D778473990480CEE4DA238D1 Out = E6942E9A86E544CF3E3364F20BE011DF Key = 113B19F2D778473990480CEE4DA238D1 In = E6942E9A86E544CF3E3364F20BE011DF Out = 87CDC6AA487BFD0EA70188257D9B3859 Key = E6942E9A86E544CF3E3364F20BE011DF In = 87CDC6AA487BFD0EA70188257D9B3859 Out = D5E2701253DD75A11A4CFB243714BD14 Key = 87CDC6AA487BFD0EA70188257D9B3859 In = D5E2701253DD75A11A4CFB243714BD14 Out = FD24812EEA107A9E6FAB8EABE0F0F48C Key = D5E2701253DD75A11A4CFB243714BD14 In = FD24812EEA107A9E6FAB8EABE0F0F48C Out = DAFA84E31A297F372C3A807100CD783D Key = FD24812EEA107A9E6FAB8EABE0F0F48C In = DAFA84E31A297F372C3A807100CD783D Out = A55ED2D955EC8950FC0CC93B76ACBF91 Key = DAFA84E31A297F372C3A807100CD783D In = A55ED2D955EC8950FC0CC93B76ACBF91 Out = 2ABEA2A4BF27ABDC6B6F278993264744 Key = A55ED2D955EC8950FC0CC93B76ACBF91 In = 2ABEA2A4BF27ABDC6B6F278993264744 Out = 045383E219321D5A4435C0E491E7DE10 Key = 2ABEA2A4BF27ABDC6B6F278993264744 In = 045383E219321D5A4435C0E491E7DE10 Out = 7460A4CD4F312F32B1C7A94FA004E934 Key = 045383E219321D5A4435C0E491E7DE10 In = 7460A4CD4F312F32B1C7A94FA004E934 Out = 6BBF9186D32C2C5895649D746566050A Key = 7460A4CD4F312F32B1C7A94FA004E934 In = 6BBF9186D32C2C5895649D746566050A Out = CDBDD19ACF40B8AC0328C80054266068 Key = 6BBF9186D32C2C5895649D746566050A In = CDBDD19ACF40B8AC0328C80054266068 Out = 1D2836CAE4223EAB5066867A71B1A1C3 Key = CDBDD19ACF40B8AC0328C80054266068 In = 1D2836CAE4223EAB5066867A71B1A1C3 Out = 2D7F37121D0D2416D5E2767FF202061B Key = 1D2836CAE4223EAB5066867A71B1A1C3 In = 2D7F37121D0D2416D5E2767FF202061B Out = D70736D1ABC7427A121CC816CD66D7FF Key = 2D7F37121D0D2416D5E2767FF202061B In = D70736D1ABC7427A121CC816CD66D7FF Out = AC6CA71CBCBEDCC0EA849FB2E9377865 Key = D70736D1ABC7427A121CC816CD66D7FF In = AC6CA71CBCBEDCC0EA849FB2E9377865 Out = 307265FF145CBBC7104B3E51C6C1D6B4 Key = AC6CA71CBCBEDCC0EA849FB2E9377865 In = 307265FF145CBBC7104B3E51C6C1D6B4 Out = 934B7DB4B3544854DBCA81C4C5DE4EB1 Key = 307265FF145CBBC7104B3E51C6C1D6B4 In = 934B7DB4B3544854DBCA81C4C5DE4EB1 Out = 18759824AD9823D5961F84377D7EAEBF Key = 934B7DB4B3544854DBCA81C4C5DE4EB1 In = 18759824AD9823D5961F84377D7EAEBF Out = DEDDAC6029B01574D9BABB099DC6CA6C Key = 18759824AD9823D5961F84377D7EAEBF In = DEDDAC6029B01574D9BABB099DC6CA6C Out = 5EA82EEA2244DED42CCA2F835D5615DF Key = DEDDAC6029B01574D9BABB099DC6CA6C In = 5EA82EEA2244DED42CCA2F835D5615DF Out = 1E3853F7FFA57091771DD8CDEE9414DE Key = 5EA82EEA2244DED42CCA2F835D5615DF In = 1E3853F7FFA57091771DD8CDEE9414DE Out = 5C2EBBF75D31F30B5EA26EAC8782D8D1 Key = 1E3853F7FFA57091771DD8CDEE9414DE In = 5C2EBBF75D31F30B5EA26EAC8782D8D1 Out = 3A3CFA1F13A136C94D76E5FA4A1109FF Key = 5C2EBBF75D31F30B5EA26EAC8782D8D1 In = 3A3CFA1F13A136C94D76E5FA4A1109FF Out = 91630CF96003B8032E695797E313A553 Key = 3A3CFA1F13A136C94D76E5FA4A1109FF In = 91630CF96003B8032E695797E313A553 Out = 137A24CA47CD12BE818DF4D2F4355960 Key = 91630CF96003B8032E695797E313A553 In = 137A24CA47CD12BE818DF4D2F4355960 Out = BCA724A54533C6987E14AA827952F921 Key = 137A24CA47CD12BE818DF4D2F4355960 In = BCA724A54533C6987E14AA827952F921 Out = 6B459286F3FFD28D49F15B1581B08E42 Key = BCA724A54533C6987E14AA827952F921 In = 6B459286F3FFD28D49F15B1581B08E42 Out = 5D9D4EEFFA9151575524F115815A12E0 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EFA71F788965BD4453F860178FC19101 Key = 000000000000000000000000000000000000000000000000 In = EFA71F788965BD4453F860178FC19101 Out = 88B2B2706B105E36B446BB6D731A1E88 Key = EFA71F788965BD4453F860178FC191010000000000000000 In = 88B2B2706B105E36B446BB6D731A1E88 Out = 39DA69D6BA4997D585B6DC073CA341B2 Key = 88B2B2706B105E36B446BB6D731A1E88EFA71F788965BD44 In = 39DA69D6BA4997D585B6DC073CA341B2 Out = 182B02D81497EA45F9DAACDC29193A65 Key = 39DA69D6BA4997D585B6DC073CA341B288B2B2706B105E36 In = 182B02D81497EA45F9DAACDC29193A65 Out = 7AFF7A70CA2FF28AC31DD8AE5DAAAB63 Key = 182B02D81497EA45F9DAACDC29193A6539DA69D6BA4997D5 In = 7AFF7A70CA2FF28AC31DD8AE5DAAAB63 Out = D1079B789F666649B6BD7D1629F1F77E Key = 7AFF7A70CA2FF28AC31DD8AE5DAAAB63182B02D81497EA45 In = D1079B789F666649B6BD7D1629F1F77E Out = 3AF6F7CE5BD35EF18BEC6FA787AB506B Key = D1079B789F666649B6BD7D1629F1F77E7AFF7A70CA2FF28A In = 3AF6F7CE5BD35EF18BEC6FA787AB506B Out = AE8109BFDA85C1F2C5038B34ED691BFF Key = 3AF6F7CE5BD35EF18BEC6FA787AB506BD1079B789F666649 In = AE8109BFDA85C1F2C5038B34ED691BFF Out = 893FD67B98C550073571BD631263FC78 Key = AE8109BFDA85C1F2C5038B34ED691BFF3AF6F7CE5BD35EF1 In = 893FD67B98C550073571BD631263FC78 Out = 16434FC9C8841A63D58700B5578E8F67 Key = 893FD67B98C550073571BD631263FC78AE8109BFDA85C1F2 In = 16434FC9C8841A63D58700B5578E8F67 Out = 9594CF62D48ACD347A68A3161F0F3EE7 Key = 16434FC9C8841A63D58700B5578E8F67893FD67B98C55007 In = 9594CF62D48ACD347A68A3161F0F3EE7 Out = B23E8C2C731C514017D1F2B88D77D208 Key = 9594CF62D48ACD347A68A3161F0F3EE716434FC9C8841A63 In = B23E8C2C731C514017D1F2B88D77D208 Out = 93CC592BC96D95FA8AC32DA894F6AB89 Key = B23E8C2C731C514017D1F2B88D77D2089594CF62D48ACD34 In = 93CC592BC96D95FA8AC32DA894F6AB89 Out = 26516E6BD4AEF86AF4F4AD58FA41A14C Key = 93CC592BC96D95FA8AC32DA894F6AB89B23E8C2C731C5140 In = 26516E6BD4AEF86AF4F4AD58FA41A14C Out = 00A8FFFAB8616BE710A6592438FC40BE Key = 26516E6BD4AEF86AF4F4AD58FA41A14C93CC592BC96D95FA In = 00A8FFFAB8616BE710A6592438FC40BE Out = A19B811C77482D97C842EC62DB2EDCCE Key = 00A8FFFAB8616BE710A6592438FC40BE26516E6BD4AEF86A In = A19B811C77482D97C842EC62DB2EDCCE Out = D7FF438678D818CAA26A676342F98E8B Key = A19B811C77482D97C842EC62DB2EDCCE00A8FFFAB8616BE7 In = D7FF438678D818CAA26A676342F98E8B Out = 84EAFFC0C091582ABB717086E0807A5F Key = D7FF438678D818CAA26A676342F98E8BA19B811C77482D97 In = 84EAFFC0C091582ABB717086E0807A5F Out = 5500AF1C79503FEF1BACF35A81DC2865 Key = 84EAFFC0C091582ABB717086E0807A5FD7FF438678D818CA In = 5500AF1C79503FEF1BACF35A81DC2865 Out = 7282B2F3E766C83664930A19D201D7E7 Key = 5500AF1C79503FEF1BACF35A81DC286584EAFFC0C091582A In = 7282B2F3E766C83664930A19D201D7E7 Out = 6796085C32FBDD2AB43E81EAC1262743 Key = 7282B2F3E766C83664930A19D201D7E75500AF1C79503FEF In = 6796085C32FBDD2AB43E81EAC1262743 Out = 5839F9E148B9FD2B5A52751D4F178FDC Key = 6796085C32FBDD2AB43E81EAC12627437282B2F3E766C836 In = 5839F9E148B9FD2B5A52751D4F178FDC Out = A88F34056742E55408A7A9E7B6D4C8C0 Key = 5839F9E148B9FD2B5A52751D4F178FDC6796085C32FBDD2A In = A88F34056742E55408A7A9E7B6D4C8C0 Out = 9C8C304CB1F937C6E42528459FA8872F Key = A88F34056742E55408A7A9E7B6D4C8C05839F9E148B9FD2B In = 9C8C304CB1F937C6E42528459FA8872F Out = EA3668C0D96529A7F3BF0F7C2B5C5BE2 Key = 9C8C304CB1F937C6E42528459FA8872FA88F34056742E554 In = EA3668C0D96529A7F3BF0F7C2B5C5BE2 Out = A8FB6EEFCAAF9C4041072D570984CED2 Key = EA3668C0D96529A7F3BF0F7C2B5C5BE29C8C304CB1F937C6 In = A8FB6EEFCAAF9C4041072D570984CED2 Out = ABF4662E5D50F71B15FE3B428AFE3500 Key = A8FB6EEFCAAF9C4041072D570984CED2EA3668C0D96529A7 In = ABF4662E5D50F71B15FE3B428AFE3500 Out = 3B3AED23958DA6E2FA4493BCBE59A806 Key = ABF4662E5D50F71B15FE3B428AFE3500A8FB6EEFCAAF9C40 In = 3B3AED23958DA6E2FA4493BCBE59A806 Out = CFBF446E33C3DCD4DD5161CA00D4BA8F Key = 3B3AED23958DA6E2FA4493BCBE59A806ABF4662E5D50F71B In = CFBF446E33C3DCD4DD5161CA00D4BA8F Out = 072ADBFA7EB962BA199AFC720339FF29 Key = CFBF446E33C3DCD4DD5161CA00D4BA8F3B3AED23958DA6E2 In = 072ADBFA7EB962BA199AFC720339FF29 Out = AAB346D9123A8140AC563EF17E7054C8 Key = 072ADBFA7EB962BA199AFC720339FF29CFBF446E33C3DCD4 In = AAB346D9123A8140AC563EF17E7054C8 Out = 3C7DDC5FE6E5888FE61DEDA0C69CD320 Key = AAB346D9123A8140AC563EF17E7054C8072ADBFA7EB962BA In = 3C7DDC5FE6E5888FE61DEDA0C69CD320 Out = 34AA645C7E3532098ADA91BB128ED821 Key = 3C7DDC5FE6E5888FE61DEDA0C69CD320AAB346D9123A8140 In = 34AA645C7E3532098ADA91BB128ED821 Out = 7A5D12E315038522DA01EC0834B1322C Key = 34AA645C7E3532098ADA91BB128ED8213C7DDC5FE6E5888F In = 7A5D12E315038522DA01EC0834B1322C Out = 86E235A1CB091FF7FE6FBBCA0D73BE58 Key = 7A5D12E315038522DA01EC0834B1322C34AA645C7E353209 In = 86E235A1CB091FF7FE6FBBCA0D73BE58 Out = F3CE81CACE5D6BA9C558111DCDB22F5D Key = 86E235A1CB091FF7FE6FBBCA0D73BE587A5D12E315038522 In = F3CE81CACE5D6BA9C558111DCDB22F5D Out = FB30A5D67D5F5BE4048C77E2AD3BC9D1 Key = F3CE81CACE5D6BA9C558111DCDB22F5D86E235A1CB091FF7 In = FB30A5D67D5F5BE4048C77E2AD3BC9D1 Out = 31E69DD3D2D90E81C9EBFAC257E9823D Key = FB30A5D67D5F5BE4048C77E2AD3BC9D1F3CE81CACE5D6BA9 In = 31E69DD3D2D90E81C9EBFAC257E9823D Out = 87579B3F19A9CDE12BB882FFEAF665AE Key = 31E69DD3D2D90E81C9EBFAC257E9823DFB30A5D67D5F5BE4 In = 87579B3F19A9CDE12BB882FFEAF665AE Out = 24A8572AA844FEF25F7670FAE30F1CD2 Key = 87579B3F19A9CDE12BB882FFEAF665AE31E69DD3D2D90E81 In = 24A8572AA844FEF25F7670FAE30F1CD2 Out = 0CFA32E5E33F3B2DAC9F34D25979319A Key = 24A8572AA844FEF25F7670FAE30F1CD287579B3F19A9CDE1 In = 0CFA32E5E33F3B2DAC9F34D25979319A Out = 3C64D7FC881B9B82ABA21FF122B98F54 Key = 0CFA32E5E33F3B2DAC9F34D25979319A24A8572AA844FEF2 In = 3C64D7FC881B9B82ABA21FF122B98F54 Out = A794CAEE6756281B7A64894E4E4F70A8 Key = 3C64D7FC881B9B82ABA21FF122B98F540CFA32E5E33F3B2D In = A794CAEE6756281B7A64894E4E4F70A8 Out = 89A9BF6B893BC5E6FEF4C77F3D0F29A6 Key = A794CAEE6756281B7A64894E4E4F70A83C64D7FC881B9B82 In = 89A9BF6B893BC5E6FEF4C77F3D0F29A6 Out = 5DBE44032769DF543EAD7AD13A5F3310 Key = 89A9BF6B893BC5E6FEF4C77F3D0F29A6A794CAEE6756281B In = 5DBE44032769DF543EAD7AD13A5F3310 Out = DEA4F3DA75EC7A8EAC3861A9912402CD Key = 5DBE44032769DF543EAD7AD13A5F331089A9BF6B893BC5E6 In = DEA4F3DA75EC7A8EAC3861A9912402CD Out = FB66522C332FCC4C042ABE32FA9E902F Key = DEA4F3DA75EC7A8EAC3861A9912402CD5DBE44032769DF54 In = FB66522C332FCC4C042ABE32FA9E902F Out = F0AB73301125FA21EF70BE5385FB76B6 Key = FB66522C332FCC4C042ABE32FA9E902FDEA4F3DA75EC7A8E In = F0AB73301125FA21EF70BE5385FB76B6 Out = E75449212BEEF9F4A390BD860A640941 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 57FF739D4DC92C1BD7FC01700CC8216F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 57FF739D4DC92C1BD7FC01700CC8216F Out = D43BB7556EA32E46F2A282B7D45B4E0D Key = 57FF739D4DC92C1BD7FC01700CC8216F00000000000000000000000000000000 In = D43BB7556EA32E46F2A282B7D45B4E0D Out = 90AFE91BB288544F2C32DC239B2635E6 Key = D43BB7556EA32E46F2A282B7D45B4E0D57FF739D4DC92C1BD7FC01700CC8216F In = 90AFE91BB288544F2C32DC239B2635E6 Out = 6CB4561C40BF0A9705931CB6D408E7FA Key = 90AFE91BB288544F2C32DC239B2635E6D43BB7556EA32E46F2A282B7D45B4E0D In = 6CB4561C40BF0A9705931CB6D408E7FA Out = 3059D6D61753B958D92F4781C8640E58 Key = 6CB4561C40BF0A9705931CB6D408E7FA90AFE91BB288544F2C32DC239B2635E6 In = 3059D6D61753B958D92F4781C8640E58 Out = E69465770505D7F80EF68CA38AB3A3D6 Key = 3059D6D61753B958D92F4781C8640E586CB4561C40BF0A9705931CB6D408E7FA In = E69465770505D7F80EF68CA38AB3A3D6 Out = 5AB67A5F8539A4A5FD9F0373BA463466 Key = E69465770505D7F80EF68CA38AB3A3D63059D6D61753B958D92F4781C8640E58 In = 5AB67A5F8539A4A5FD9F0373BA463466 Out = DC096BCD99FC72F79936D4C748E75AF7 Key = 5AB67A5F8539A4A5FD9F0373BA463466E69465770505D7F80EF68CA38AB3A3D6 In = DC096BCD99FC72F79936D4C748E75AF7 Out = C5A3E7CEE0F1B7260528A68FB4EA05F2 Key = DC096BCD99FC72F79936D4C748E75AF75AB67A5F8539A4A5FD9F0373BA463466 In = C5A3E7CEE0F1B7260528A68FB4EA05F2 Out = 43D5CEC327B24AB90AD34A79D0469151 Key = C5A3E7CEE0F1B7260528A68FB4EA05F2DC096BCD99FC72F79936D4C748E75AF7 In = 43D5CEC327B24AB90AD34A79D0469151 Out = 05BA7BE9BE5274FBEB4AC5FD5FAAFA10 Key = 43D5CEC327B24AB90AD34A79D0469151C5A3E7CEE0F1B7260528A68FB4EA05F2 In = 05BA7BE9BE5274FBEB4AC5FD5FAAFA10 Out = 89D513B989E3CECE4D2E3E4C15D4E01C Key = 05BA7BE9BE5274FBEB4AC5FD5FAAFA1043D5CEC327B24AB90AD34A79D0469151 In = 89D513B989E3CECE4D2E3E4C15D4E01C Out = E56E462AE2E66F800CE2224C4CAFACBE Key = 89D513B989E3CECE4D2E3E4C15D4E01C05BA7BE9BE5274FBEB4AC5FD5FAAFA10 In = E56E462AE2E66F800CE2224C4CAFACBE Out = F5DBEE5414D79CA46BE17346FDC72BF5 Key = E56E462AE2E66F800CE2224C4CAFACBE89D513B989E3CECE4D2E3E4C15D4E01C In = F5DBEE5414D79CA46BE17346FDC72BF5 Out = C780FC28815E667B3D224ECF1F4A7D65 Key = F5DBEE5414D79CA46BE17346FDC72BF5E56E462AE2E66F800CE2224C4CAFACBE In = C780FC28815E667B3D224ECF1F4A7D65 Out = 2EF17A0D75440ECEC9AF18D29ABA3CDA Key = C780FC28815E667B3D224ECF1F4A7D65F5DBEE5414D79CA46BE17346FDC72BF5 In = 2EF17A0D75440ECEC9AF18D29ABA3CDA Out = D653FDFF96BCF89A929F6377AB41967A Key = 2EF17A0D75440ECEC9AF18D29ABA3CDAC780FC28815E667B3D224ECF1F4A7D65 In = D653FDFF96BCF89A929F6377AB41967A Out = 36BBAD8838380C8793A7AEA0A11D04D2 Key = D653FDFF96BCF89A929F6377AB41967A2EF17A0D75440ECEC9AF18D29ABA3CDA In = 36BBAD8838380C8793A7AEA0A11D04D2 Out = 034EFECFC0EFC00D82C3345A8708AE78 Key = 36BBAD8838380C8793A7AEA0A11D04D2D653FDFF96BCF89A929F6377AB41967A In = 034EFECFC0EFC00D82C3345A8708AE78 Out = EA38887307337A2934A9EB802F6CFDDD Key = 034EFECFC0EFC00D82C3345A8708AE7836BBAD8838380C8793A7AEA0A11D04D2 In = EA38887307337A2934A9EB802F6CFDDD Out = 7C279D47775AB4C26442E8A117943DD8 Key = EA38887307337A2934A9EB802F6CFDDD034EFECFC0EFC00D82C3345A8708AE78 In = 7C279D47775AB4C26442E8A117943DD8 Out = E3CF581056EBC1169CF451E930308726 Key = 7C279D47775AB4C26442E8A117943DD8EA38887307337A2934A9EB802F6CFDDD In = E3CF581056EBC1169CF451E930308726 Out = 65527B29D489C8CDDC62E5E7FFC4E924 Key = E3CF581056EBC1169CF451E9303087267C279D47775AB4C26442E8A117943DD8 In = 65527B29D489C8CDDC62E5E7FFC4E924 Out = 3B491F930230A0170819CACB48F9030C Key = 65527B29D489C8CDDC62E5E7FFC4E924E3CF581056EBC1169CF451E930308726 In = 3B491F930230A0170819CACB48F9030C Out = A7C8193F35AF63B51D7F9DEDCEC85866 Key = 3B491F930230A0170819CACB48F9030C65527B29D489C8CDDC62E5E7FFC4E924 In = A7C8193F35AF63B51D7F9DEDCEC85866 Out = 009A48F9A1C27F9AA5F9BD909C848B60 Key = A7C8193F35AF63B51D7F9DEDCEC858663B491F930230A0170819CACB48F9030C In = 009A48F9A1C27F9AA5F9BD909C848B60 Out = 3B507E987B3F827A093B26C85CDFF6C6 Key = 009A48F9A1C27F9AA5F9BD909C848B60A7C8193F35AF63B51D7F9DEDCEC85866 In = 3B507E987B3F827A093B26C85CDFF6C6 Out = EAFB3BA6C78E37214FE908669BC24F6F Key = 3B507E987B3F827A093B26C85CDFF6C6009A48F9A1C27F9AA5F9BD909C848B60 In = EAFB3BA6C78E37214FE908669BC24F6F Out = 2B09F10D7F2B62A4D0DAFFB9F882B980 Key = EAFB3BA6C78E37214FE908669BC24F6F3B507E987B3F827A093B26C85CDFF6C6 In = 2B09F10D7F2B62A4D0DAFFB9F882B980 Out = E6B9FE907009B2DC649412DD630AE576 Key = 2B09F10D7F2B62A4D0DAFFB9F882B980EAFB3BA6C78E37214FE908669BC24F6F In = E6B9FE907009B2DC649412DD630AE576 Out = F2E4DC89724CD58F85847BD09ED4500F Key = E6B9FE907009B2DC649412DD630AE5762B09F10D7F2B62A4D0DAFFB9F882B980 In = F2E4DC89724CD58F85847BD09ED4500F Out = DC650444FCEBC2BD6E450EF4605FCABE Key = F2E4DC89724CD58F85847BD09ED4500FE6B9FE907009B2DC649412DD630AE576 In = DC650444FCEBC2BD6E450EF4605FCABE Out = B7CFB31755FDA2AB0A67FBA09901A73E Key = DC650444FCEBC2BD6E450EF4605FCABEF2E4DC89724CD58F85847BD09ED4500F In = B7CFB31755FDA2AB0A67FBA09901A73E Out = 9C7E7578F3D2923DCDABFED0A5EF86EE Key = B7CFB31755FDA2AB0A67FBA09901A73EDC650444FCEBC2BD6E450EF4605FCABE In = 9C7E7578F3D2923DCDABFED0A5EF86EE Out = 9465E9AE176483BD398C8033AA136F68 Key = 9C7E7578F3D2923DCDABFED0A5EF86EEB7CFB31755FDA2AB0A67FBA09901A73E In = 9465E9AE176483BD398C8033AA136F68 Out = 8551279DE9991805FCFC1937C52AE9D4 Key = 9465E9AE176483BD398C8033AA136F689C7E7578F3D2923DCDABFED0A5EF86EE In = 8551279DE9991805FCFC1937C52AE9D4 Out = A830EB8DA52ECFF7F93B7627322CF9D7 Key = 8551279DE9991805FCFC1937C52AE9D49465E9AE176483BD398C8033AA136F68 In = A830EB8DA52ECFF7F93B7627322CF9D7 Out = EC89F0E5155425D4B92BD4B200C1A6E0 Key = A830EB8DA52ECFF7F93B7627322CF9D78551279DE9991805FCFC1937C52AE9D4 In = EC89F0E5155425D4B92BD4B200C1A6E0 Out = 8AF76A782061D38360C6C3CDDCBE1516 Key = EC89F0E5155425D4B92BD4B200C1A6E0A830EB8DA52ECFF7F93B7627322CF9D7 In = 8AF76A782061D38360C6C3CDDCBE1516 Out = D4EEAA6A069659D5D88590DE75515631 Key = 8AF76A782061D38360C6C3CDDCBE1516EC89F0E5155425D4B92BD4B200C1A6E0 In = D4EEAA6A069659D5D88590DE75515631 Out = 259C021D37B077197B80FCDB07EA1AF2 Key = D4EEAA6A069659D5D88590DE755156318AF76A782061D38360C6C3CDDCBE1516 In = 259C021D37B077197B80FCDB07EA1AF2 Out = 300CC8B4171F0E9BD75710FAD033C570 Key = 259C021D37B077197B80FCDB07EA1AF2D4EEAA6A069659D5D88590DE75515631 In = 300CC8B4171F0E9BD75710FAD033C570 Out = 5CFA5BD213A74F02E65390A4C14A1DF6 Key = 300CC8B4171F0E9BD75710FAD033C570259C021D37B077197B80FCDB07EA1AF2 In = 5CFA5BD213A74F02E65390A4C14A1DF6 Out = A443EA1B2C5747CE7EC5F21D4FE0C147 Key = 5CFA5BD213A74F02E65390A4C14A1DF6300CC8B4171F0E9BD75710FAD033C570 In = A443EA1B2C5747CE7EC5F21D4FE0C147 Out = D2DED73E59319A8138E0331F0EA149EA Key = A443EA1B2C5747CE7EC5F21D4FE0C1475CFA5BD213A74F02E65390A4C14A1DF6 In = D2DED73E59319A8138E0331F0EA149EA Out = 2E2158BC3E5FC714C1EEECA0EA696D48 Key = D2DED73E59319A8138E0331F0EA149EAA443EA1B2C5747CE7EC5F21D4FE0C147 In = 2E2158BC3E5FC714C1EEECA0EA696D48 Out = 248A7F3528B168ACFDD1386E3F51E30C Key = 2E2158BC3E5FC714C1EEECA0EA696D48D2DED73E59319A8138E0331F0EA149EA In = 248A7F3528B168ACFDD1386E3F51E30C Out = 431058F4DBC7F734DA4F02F04CC4F459 Key = 248A7F3528B168ACFDD1386E3F51E30C2E2158BC3E5FC714C1EEECA0EA696D48 In = 431058F4DBC7F734DA4F02F04CC4F459 Out = 37FE26FF1CF66175F5DDF4C33B97A205 Key = 80000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6BFD32804A1C3206C4BF85EB11241F89 Key = 40000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F097147AE851845984DC97D5FAE40CF9 Key = 20000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6117F1977C5ABD9647C56544D9458444 Key = 10000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 75A6240AAE357DEDDF99936705618284 Key = 08000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F026BFDF6BFBC7E50C46C533BD271C24 Key = 04000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F3023228D77045D37D1B9CD77437395A Key = 02000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F67467BF6B490209809714D50679B2D7 Key = 01000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2C8431B922C5F560095E9867B1A41256 Key = 00800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1FB76E90D207BA4C770F67284D6B1359 Key = 00400000000000000000000000000000 In = 00000000000000000000000000000000 Out = A70AECE1D41DCA9F24BCE8393F6D54BF Key = 00200000000000000000000000000000 In = 00000000000000000000000000000000 Out = D4580FC395979689221C57A23598358B Key = 00100000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35CA62BA8126F015FABFEF8F9119AE6B Key = 00080000000000000000000000000000 In = 00000000000000000000000000000000 Out = C81FACB16E087EEFA823CF34E02FE482 Key = 00040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 07400F04E4CC6625AE3FB41ECC863F2A Key = 00020000000000000000000000000000 In = 00000000000000000000000000000000 Out = A0941008068D401DEAB6400C86CA53AD Key = 00010000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2B63BEF50BA87A58BFFCA4CF44C22927 Key = 00008000000000000000000000000000 In = 00000000000000000000000000000000 Out = FD49069AE9F1874A264A7BFD894ED886 Key = 00004000000000000000000000000000 In = 00000000000000000000000000000000 Out = 232755C754075BB5CC5B85ABFEA38779 Key = 00002000000000000000000000000000 In = 00000000000000000000000000000000 Out = 41358B9C76E959037E13F7E5050E0B42 Key = 00001000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8978CD09C054BB1ABDFFBED09D1CF7EC Key = 00000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 9F2A7CE5FD51FD5D7E2D42407EEF8F6A Key = 00000400000000000000000000000000 In = 00000000000000000000000000000000 Out = 6AA2F0627F312A77C68D1F15DF0E1379 Key = 00000200000000000000000000000000 In = 00000000000000000000000000000000 Out = BCD56984E45DBF087BAC8757FC4EFF5A Key = 00000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 9D3C6C8ED48C9DE7A64CD05D8BF41D54 Key = 00000080000000000000000000000000 In = 00000000000000000000000000000000 Out = FCD577A23F455ACDE3732C262EBD2D86 Key = 00000040000000000000000000000000 In = 00000000000000000000000000000000 Out = 022E2430D81858888C9E575411D4064F Key = 00000020000000000000000000000000 In = 00000000000000000000000000000000 Out = 5742CA8CF1193491C1FBC148627D856E Key = 00000010000000000000000000000000 In = 00000000000000000000000000000000 Out = 88BD93610040DFE248C2FE05EF9F4FE0 Key = 00000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 29A9D577BB3824209FEA64128247CE6C Key = 00000004000000000000000000000000 In = 00000000000000000000000000000000 Out = AC4CDB534844EA86000B845FCDAD605F Key = 00000002000000000000000000000000 In = 00000000000000000000000000000000 Out = AAC6098597D46B8145A60F40D4EC5308 Key = 00000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 3A7DFD0855A5BE0B16CACBD685FACEF5 Key = 00000000800000000000000000000000 In = 00000000000000000000000000000000 Out = ACEBA627EBA87AD051C3E0CA0DEF6CD7 Key = 00000000400000000000000000000000 In = 00000000000000000000000000000000 Out = F0A55DCDBC513EFDD603EA455EB9228C Key = 00000000200000000000000000000000 In = 00000000000000000000000000000000 Out = 2176DEBC78D6B4A6D0FB37AFA6B51081 Key = 00000000100000000000000000000000 In = 00000000000000000000000000000000 Out = FDB1B57379B85A85392613E8B4597B63 Key = 00000000080000000000000000000000 In = 00000000000000000000000000000000 Out = 58AB1112E0598586E07FC8359DDFC7EC Key = 00000000040000000000000000000000 In = 00000000000000000000000000000000 Out = DD6D1D2629F333528CB66869453BC273 Key = 00000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 932218D99553BB2D4BFC69F1EA67CAAE Key = 00000000010000000000000000000000 In = 00000000000000000000000000000000 Out = 399D066426F7FEF66F8983086DC044D8 Key = 00000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 3E1BC58269B6B8C8C8D00806975F8337 Key = 00000000004000000000000000000000 In = 00000000000000000000000000000000 Out = D50A1F966058C6D702D1AFCD700DA0E8 Key = 00000000002000000000000000000000 In = 00000000000000000000000000000000 Out = 6E7A6BB3554F12AD1F88C289D621CD0F Key = 00000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 9ED4EA506A0CBA89B246C14D1B5B96A9 Key = 00000000000800000000000000000000 In = 00000000000000000000000000000000 Out = C395A92C1A6884857B263F01F43542DB Key = 00000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 06562AC497C60F802B68B47DB5B86B6A Key = 00000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 255A726F2106177FEFA7006BDE05D059 Key = 00000000000100000000000000000000 In = 00000000000000000000000000000000 Out = B8FD6A8227D0565A4C174AD270EC1205 Key = 00000000000080000000000000000000 In = 00000000000000000000000000000000 Out = C2652FDB48B9DDBFC43B3F7CDD831D6F Key = 00000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 913EB9205DB2E17A96A23A724EDF4C84 Key = 00000000000020000000000000000000 In = 00000000000000000000000000000000 Out = 9A6694FEB5EA44FF0572124FDB265658 Key = 00000000000010000000000000000000 In = 00000000000000000000000000000000 Out = E347498DECA6B211C30E21FD0B47A333 Key = 00000000000008000000000000000000 In = 00000000000000000000000000000000 Out = E70F0D4ED829A81E05D42E511EDE9376 Key = 00000000000004000000000000000000 In = 00000000000000000000000000000000 Out = 140BB7CAD8D6A3553BEF7A3D52347BD8 Key = 00000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 5FA55360F440DCCA20925A3E15B42764 Key = 00000000000001000000000000000000 In = 00000000000000000000000000000000 Out = 6D5B969DFC3EA0A6682CC66488D221DA Key = 00000000000000800000000000000000 In = 00000000000000000000000000000000 Out = E2799D5C380B49D2F6997009079D03D3 Key = 00000000000000400000000000000000 In = 00000000000000000000000000000000 Out = 06AFBD8077909E847AF467BB2D47E893 Key = 00000000000000200000000000000000 In = 00000000000000000000000000000000 Out = 46B1EB96EC9EB10897F1562E59287253 Key = 00000000000000100000000000000000 In = 00000000000000000000000000000000 Out = 1793F1D4E1A1606F99C7019C19E85129 Key = 00000000000000080000000000000000 In = 00000000000000000000000000000000 Out = ED785D0BA19553CE73B69F4D570C3A9D Key = 00000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 298DF7334670B7391BE203DF7E8890C7 Key = 00000000000000020000000000000000 In = 00000000000000000000000000000000 Out = 150C12DEF6EDC844B0B45361C2B3AECE Key = 00000000000000010000000000000000 In = 00000000000000000000000000000000 Out = 06FFB5E13438BA8DBD8A3EDADFAC73A1 Key = 00000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 6C5E5719D5F31E929FF9C44F086EFADB Key = 00000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 4C8D0E13996F4D32CB7984B7BB1B34FB Key = 00000000000000002000000000000000 In = 00000000000000000000000000000000 Out = C9BDCFFD4B9F3BBBB33A2D2C51BA83F6 Key = 00000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 929B29DD0D952161FFDA8CB417B166EC Key = 00000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 87F9DFCB07275916E7A446D3DCE74232 Key = 00000000000000000400000000000000 In = 00000000000000000000000000000000 Out = 6FDFD0BC8F49BE420CD68A894C7CA4E9 Key = 00000000000000000200000000000000 In = 00000000000000000000000000000000 Out = CDDC09DE42DC2CBCD9287A2072A30D23 Key = 00000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 9B2FF668BA9D77AD1E9F30BA0173EBD4 Key = 00000000000000000080000000000000 In = 00000000000000000000000000000000 Out = DEF29890D59A511B32A30322D7471E38 Key = 00000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 5094EAEC9F23D0DBFAB8240A42ED5BF1 Key = 00000000000000000020000000000000 In = 00000000000000000000000000000000 Out = 79CB87BC375F58DE8DA780B9BAD3DEA3 Key = 00000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 7139B3D980B85D3B77A3BBDB6CB79756 Key = 00000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 148ED6E8FEC02168377C96956AE18D93 Key = 00000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 0AFED5A710F2BF11C77F152951AE32CB Key = 00000000000000000002000000000000 In = 00000000000000000000000000000000 Out = C265AC354817550FAE12A51C2DCD749C Key = 00000000000000000001000000000000 In = 00000000000000000000000000000000 Out = A3B089F79D0A07EA0893BB48D508B35B Key = 00000000000000000000800000000000 In = 00000000000000000000000000000000 Out = C0A7B6BCE0675A48E95D39A7659CB20A Key = 00000000000000000000400000000000 In = 00000000000000000000000000000000 Out = 6CE0A0BA02041CB5E6C0A46DE1B71A43 Key = 00000000000000000000200000000000 In = 00000000000000000000000000000000 Out = E54045C33A386555C5754ADB0A181244 Key = 00000000000000000000100000000000 In = 00000000000000000000000000000000 Out = BB652196955BB7BE7E8CB8E2E992A750 Key = 00000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 594B2917DE6119B62BE3DDF10A1A47E0 Key = 00000000000000000000040000000000 In = 00000000000000000000000000000000 Out = E8B4F95053617F6A10120DB196AAC4D1 Key = 00000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 79646B1CC19708973215B9891A2C1019 Key = 00000000000000000000010000000000 In = 00000000000000000000000000000000 Out = 5E7E6175F6B548E5389C1B1C391CBEE2 Key = 00000000000000000000008000000000 In = 00000000000000000000000000000000 Out = C0860A7B47544872B9DB5C220088DE5C Key = 00000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 325163F073E5A27EBAF339B1FA53682D Key = 00000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 1A0C4583CEFF5810F3AB42A471415A1D Key = 00000000000000000000001000000000 In = 00000000000000000000000000000000 Out = F8DDF239D19363957C7C8C9B537893FA Key = 00000000000000000000000800000000 In = 00000000000000000000000000000000 Out = D3B9999669509564741F236EEF2401F3 Key = 00000000000000000000000400000000 In = 00000000000000000000000000000000 Out = 3376DA406D82B76591B610C6C9FC3F9E Key = 00000000000000000000000200000000 In = 00000000000000000000000000000000 Out = B6AD728D2970637642723FF06204EEAD Key = 00000000000000000000000100000000 In = 00000000000000000000000000000000 Out = 0ADF4A82FFE602BC13002AA8AB24EA71 Key = 00000000000000000000000080000000 In = 00000000000000000000000000000000 Out = D80D1378E30036D92B4A359F68D0CBFE Key = 00000000000000000000000040000000 In = 00000000000000000000000000000000 Out = EDA13B315897290E4ACEB4B513E9749B Key = 00000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 34589936B79E4F43260DC6CCD1820D6D Key = 00000000000000000000000010000000 In = 00000000000000000000000000000000 Out = C7A8FF65CD38D008EC6745897E010122 Key = 00000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 3AFE23D89E79E9F8A54F103ED51EB14D Key = 00000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 27994D1AA909806C7CC8E4AC4CD5479B Key = 00000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 610D5528725B34FD70ADC66E83BAE266 Key = 00000000000000000000000001000000 In = 00000000000000000000000000000000 Out = 3A3064DFF6E0B54D864E81FA76270065 Key = 00000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 5E9B5966ED3A2358005C9773F8690AD9 Key = 00000000000000000000000000400000 In = 00000000000000000000000000000000 Out = 713738F580CED6E358D2CDCEDA64F99F Key = 00000000000000000000000000200000 In = 00000000000000000000000000000000 Out = EC7FE3578906291B2DCF0AD7FF8B5358 Key = 00000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 0F714C096C244BED865A9E064576FE5D Key = 00000000000000000000000000080000 In = 00000000000000000000000000000000 Out = B7C226C60B6F3031A1E2160823A62679 Key = 00000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 5C78C4BC8F15DC964FE9EC75203AD7D8 Key = 00000000000000000000000000020000 In = 00000000000000000000000000000000 Out = 178FB7443FBD17DCF1AF122D4D117239 Key = 00000000000000000000000000010000 In = 00000000000000000000000000000000 Out = C55C99851BD135155A080A9C4E54B919 Key = 00000000000000000000000000008000 In = 00000000000000000000000000000000 Out = AD75C80D72EA278B3EDE380DAAB1F708 Key = 00000000000000000000000000004000 In = 00000000000000000000000000000000 Out = 95054D1ECA74F75515AE8C17941D3A54 Key = 00000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 8E0B0D4F95C9C9D65420B4B1869A1D3E Key = 00000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 7712EA2F0598CC8CFB9A934DEC848B5F Key = 00000000000000000000000000000800 In = 00000000000000000000000000000000 Out = 9D730E0F7450183C0804D6817CBE058E Key = 00000000000000000000000000000400 In = 00000000000000000000000000000000 Out = 3FA52E9B242F9AF61322FBB6BA583A01 Key = 00000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 3D47D74F667D60458188922EE8D8A7A0 Key = 00000000000000000000000000000100 In = 00000000000000000000000000000000 Out = 036B4E4E02D84C56AC61007DAC33EC33 Key = 00000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 4E171141E51234DE6E4B236643A6DC85 Key = 00000000000000000000000000000040 In = 00000000000000000000000000000000 Out = DB720E7B04462829DFA258ED9E7C7F2F Key = 00000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 8B10E11115FF4336DE57F2EA13AABBFA Key = 00000000000000000000000000000010 In = 00000000000000000000000000000000 Out = F0E35BFF226C064E08368AF440298DB9 Key = 00000000000000000000000000000008 In = 00000000000000000000000000000000 Out = 6C4C8811B4DF74F2A7D7F79A6253CEA7 Key = 00000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 7DD12AD3BC7A419F92753D8CC39637F0 Key = 00000000000000000000000000000002 In = 00000000000000000000000000000000 Out = A465B01EA32B2F4F87C85FD06F9B0A02 Key = 00000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 8DC902DDAE09F52B1A3A77EE89C1441E Key = 800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B5AED133641004F4121B66E7DB8F2FF0 Key = 400000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 998110F200555A32C6C123E66CF87DE9 Key = 200000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2DBAEEEC682DCC957C2D51B0990E123A Key = 100000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BAEC0A31F6557D6D13B888A94F63058C Key = 080000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E51ADC9773E785730586E6812A0F0FA5 Key = 040000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 97067E60FE010AEEA48C0D3224AD0941 Key = 020000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BB73A7C859E6377A5E42EFCD55CD2C5B Key = 010000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 914BFE25D7FDEE49B46FB5C2B60DACA5 Key = 008000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EFEF0047892A043A1D594118477CA513 Key = 004000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BE59CF7C4E4B482843E67B4EB65B3038 Key = 002000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35FFC8038CB124B8078EC5C7C7928F14 Key = 001000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 086025FC1CC6056367304C51DE871DEA Key = 000800000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 950F0B7BDFFC78AE3AFF022F78E1670E Key = 000400000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CADF4568B43C950FB688C6608AAF5FAE Key = 000200000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E2313E3CFCB5E745EBAB983BF2867579 Key = 000100000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B4394412F7B4A1A4A22B73C93BAFD85D Key = 000080000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C014C9A992E6366B3BD2EABDF1508187 Key = 000040000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4344D702AC78A5808F4AB566D5509B75 Key = 000020000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 937893DA40E9D7F2ECE9028FAA4DE6A4 Key = 000010000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E77874759C6AACB611B715A52A37234A Key = 000008000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 841FC7FC0EF6CE08CFC6056B3C557F23 Key = 000004000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6AC04A6988F1CE601E4C48241D42C1CF Key = 000002000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5254F42B5DD207461693C278B6ABC855 Key = 000001000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F58B1AE230B417541649CB035FB5231C Key = 000000800000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5F015060D28C6CCB2E5FDCB5AFDCF309 Key = 000000400000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B0DBAA257FEFFE48A688FE247D0460B7 Key = 000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1235DF200338F96E39E881484B6B11EE Key = 000000100000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 671D87102E35609B32F40A91A7E29E04 Key = 000000080000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F01FB3FA3E84DEA6057F3D88CD651876 Key = 000000040000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B96C1E40D0D407ED90D11892503A296F Key = 000000020000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2E27350191DE6C2E9DCC51022A3C96CB Key = 000000010000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BDD6CFE5D00E7F8D698143E653A0163B Key = 000000008000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FEDABEF20F51910E57CF5ECEF878A8E1 Key = 000000004000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EEBF9FE247A78C6FF2A91428C54D70DA Key = 000000002000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 41714E55E90E0E154802FBBFC0BF58C5 Key = 000000001000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 69480F26BC5DFF8F6D8A0F10E0959BF1 Key = 000000000800000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A39E4BE5A7E13BA3C48CFD98A52CFA70 Key = 000000000400000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 95809A16888FB49F5053375A6533CD58 Key = 000000000200000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5F0DEF37FB14F956BB31703F1FC968EB Key = 000000000100000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CF0A28C9598D7BBCA6992238B03EF4EB Key = 000000000080000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7FF241BA32E6878542978957F137856F Key = 000000000040000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8D489E0496B54F91A0254E4103804145 Key = 000000000020000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9925949BE93F4A0BF4114CCA2E05B566 Key = 000000000010000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6ED9A5F014FAFAE3D05C4AE027066873 Key = 000000000008000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 958453307A371EE2D3DA8DD327D9B51B Key = 000000000004000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1EE0680BF9A798A1C63636EA917B17B5 Key = 000000000002000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C0CEFB2475B21AA8937E3048604D9928 Key = 000000000001000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9034DDEFF43C9CC82FADE8DE0A2476BB Key = 000000000000800000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 09D32779D0C8D02E0670F377187756FC Key = 000000000000400000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6557BDB19F03E62D823C0613BEA0FAFB Key = 000000000000200000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 83505664DED694967F2D9E7853BC4B43 Key = 000000000000100000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0BBABE3B7F381C3B3D8A9D846D8CCEAC Key = 000000000000080000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E3AA0A67CDF79DBAB013103E39E8C822 Key = 000000000000040000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AF3D0C9B673C322355480E8681237D13 Key = 000000000000020000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 60D325226EC8DFB9E08DFADB479649A0 Key = 000000000000010000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 845B92A3C56880E8007B452B57B73B75 Key = 000000000000008000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 76C59CD9185C518D65EC641EB73C6387 Key = 000000000000004000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 735567D0B8A52203492220804F3D62E6 Key = 000000000000002000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E74FB07622191A053368131DA36FC299 Key = 000000000000001000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3CFF40E0E9A86F67D938D2483BDD08F0 Key = 000000000000000800000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7C502AE730F5A9ABEACB15240EA1E8F6 Key = 000000000000000400000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0B3CA10C02E24BA82261E65BE4413512 Key = 000000000000000200000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F7D50E95931755A98B143AE254090F9D Key = 000000000000000100000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A4E84B8A7B8CC3766307D66A9C6AECB9 Key = 000000000000000080000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5298367E93E9B9CB5CF402A8BA9EFC62 Key = 000000000000000040000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 03D44830C40510CE7866FB86FAC6E1DC Key = 000000000000000020000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 978E4BA4EEA6739B1769FF4389F0367E Key = 000000000000000010000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 707EF1166D2F11FD1519B37FB00D23EB Key = 000000000000000008000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 435088DBDD8646A7FCA8851CA2FA1FB5 Key = 000000000000000004000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F3DC32DD6931A302391F9B992A5B6122 Key = 000000000000000002000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D93286DD8A05432614FD03169F36ED15 Key = 000000000000000001000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 59F83FEA4BC9B24BF69A98CA3959CEFC Key = 000000000000000000800000000000000000000000000000 In = 00000000000000000000000000000000 Out = A689BC3A8DB36A22763E911370C9DE2B Key = 000000000000000000400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 04EB5BA604BA64DD112BCAE830C27966 Key = 000000000000000000200000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7EF653E2D804E80BD678C3A6CB222625 Key = 000000000000000000100000000000000000000000000000 In = 00000000000000000000000000000000 Out = A94EC287E7F70C6503DC0B891920C622 Key = 000000000000000000080000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8A78497E9D18A365599444C972359F0D Key = 000000000000000000040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 2F1832E285C8D24F226B50CCD71FE46A Key = 000000000000000000020000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0B6675F4BD4BD6951BB96AF62D3C9B96 Key = 000000000000000000010000000000000000000000000000 In = 00000000000000000000000000000000 Out = D6DEDAAAECE52984A261155ED7AF5290 Key = 000000000000000000008000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7600A0FCF96F24A21419103466B937B5 Key = 000000000000000000004000000000000000000000000000 In = 00000000000000000000000000000000 Out = C3E359420C4C4AF445C470AB347B3667 Key = 000000000000000000002000000000000000000000000000 In = 00000000000000000000000000000000 Out = D915133DAA11BECB43E020266B709BEC Key = 000000000000000000001000000000000000000000000000 In = 00000000000000000000000000000000 Out = A0001FC4E31664ED8C375644D02717AE Key = 000000000000000000000800000000000000000000000000 In = 00000000000000000000000000000000 Out = D8E96A3F240666FC02F31E84CD1CEEF1 Key = 000000000000000000000400000000000000000000000000 In = 00000000000000000000000000000000 Out = DE0B6B80C40ED4447E36A84A62EB235D Key = 000000000000000000000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B15F04C34FC0F35F96C86837665CB38 Key = 000000000000000000000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 02DAE104DA462934D87FDC73EB4011A9 Key = 000000000000000000000080000000000000000000000000 In = 00000000000000000000000000000000 Out = B1ECC134EB7221CE00EBB977E08020E2 Key = 000000000000000000000040000000000000000000000000 In = 00000000000000000000000000000000 Out = 9F13CC1BF91C1B49AB6DDD7AF7A05ABA Key = 000000000000000000000020000000000000000000000000 In = 00000000000000000000000000000000 Out = 414D1178475679525B5EE7ED373E2A0A Key = 000000000000000000000010000000000000000000000000 In = 00000000000000000000000000000000 Out = E69F2CC70EF18DBD360DFDD5C6573EBD Key = 000000000000000000000008000000000000000000000000 In = 00000000000000000000000000000000 Out = FA45D9E00E4C221A14C359742AC25C35 Key = 000000000000000000000004000000000000000000000000 In = 00000000000000000000000000000000 Out = BC2AC98007820862150CC1B1E3E11ED1 Key = 000000000000000000000002000000000000000000000000 In = 00000000000000000000000000000000 Out = C7CABAB4D7DFFD44C5943EB8E9441C3D Key = 000000000000000000000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 6DA6716020FDE292E8ADFB2A31BC6B24 Key = 000000000000000000000000800000000000000000000000 In = 00000000000000000000000000000000 Out = 9516AE03F102950795E1869E07BE0AFB Key = 000000000000000000000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 4748E60F70C6172E5D5B0C21E67F366C Key = 000000000000000000000000200000000000000000000000 In = 00000000000000000000000000000000 Out = 40C7CC6385BB634FB68F73CCB5C446C2 Key = 000000000000000000000000100000000000000000000000 In = 00000000000000000000000000000000 Out = 7F0CE574F643711ECFC5011C0BCCD49A Key = 000000000000000000000000080000000000000000000000 In = 00000000000000000000000000000000 Out = 2628849CC2C62FEB305A1287F24B9693 Key = 000000000000000000000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 6E8C11B5EA12D40CE9F83693314BD836 Key = 000000000000000000000000020000000000000000000000 In = 00000000000000000000000000000000 Out = 503FCDFCCB2AEBEEE6FB59326D06745E Key = 000000000000000000000000010000000000000000000000 In = 00000000000000000000000000000000 Out = 69698FE789F29872F0A4116CD8714255 Key = 000000000000000000000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 3072C09636828285E7135E92B04C3601 Key = 000000000000000000000000004000000000000000000000 In = 00000000000000000000000000000000 Out = 00C19303036D6D3227B9C7AF806BEBDD Key = 000000000000000000000000002000000000000000000000 In = 00000000000000000000000000000000 Out = E6B06BC172CA8892C8A04D6717AB08CE Key = 000000000000000000000000001000000000000000000000 In = 00000000000000000000000000000000 Out = F7F08E268646EF8B9D728D422195A88B Key = 000000000000000000000000000800000000000000000000 In = 00000000000000000000000000000000 Out = E6C0BEE988E017E708FF1A1DCFE38FC8 Key = 000000000000000000000000000400000000000000000000 In = 00000000000000000000000000000000 Out = 33D0841FC04A6394056AC82D68DBFA02 Key = 000000000000000000000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 066AF29F6138FE67D676925DBC375ED1 Key = 000000000000000000000000000100000000000000000000 In = 00000000000000000000000000000000 Out = 60E1109A80F56DBCBCAC75AF9EE3A982 Key = 000000000000000000000000000080000000000000000000 In = 00000000000000000000000000000000 Out = 84E692562A2DBE9452CDC7F5F7DCD4E6 Key = 000000000000000000000000000040000000000000000000 In = 00000000000000000000000000000000 Out = DA5C0CB7DE7C2A9DEFC76348955FB51B Key = 000000000000000000000000000020000000000000000000 In = 00000000000000000000000000000000 Out = 26AC1CB6870A598585E211852F9C980A Key = 000000000000000000000000000010000000000000000000 In = 00000000000000000000000000000000 Out = 49776D30C4A10352FF0FBA170F09F275 Key = 000000000000000000000000000008000000000000000000 In = 00000000000000000000000000000000 Out = D02E72C408A05C89F80C9EC450419FBF Key = 000000000000000000000000000004000000000000000000 In = 00000000000000000000000000000000 Out = 993D122B38640477385BBFC79177C212 Key = 000000000000000000000000000002000000000000000000 In = 00000000000000000000000000000000 Out = 1482C5D53BE2F16634C22B9294D6E10B Key = 000000000000000000000000000001000000000000000000 In = 00000000000000000000000000000000 Out = 4B9518E3188D68E20266DCAA5B26337F Key = 000000000000000000000000000000800000000000000000 In = 00000000000000000000000000000000 Out = 7D6C9C9F375EDDE4A23D83B8B62E198F Key = 000000000000000000000000000000400000000000000000 In = 00000000000000000000000000000000 Out = FCCE30A6961099AD269080FF07A24E1E Key = 000000000000000000000000000000200000000000000000 In = 00000000000000000000000000000000 Out = C822629D39268498E02E6E4D642E7921 Key = 000000000000000000000000000000100000000000000000 In = 00000000000000000000000000000000 Out = B96890D4CC0BD3C41A14D0547F98E077 Key = 000000000000000000000000000000080000000000000000 In = 00000000000000000000000000000000 Out = 78665BAC269A5DB3FFE165526A42F688 Key = 000000000000000000000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 5EB1E7293616CD444011950212E53E78 Key = 000000000000000000000000000000020000000000000000 In = 00000000000000000000000000000000 Out = FD682F200B2D5D17D177E785EBCE6C08 Key = 000000000000000000000000000000010000000000000000 In = 00000000000000000000000000000000 Out = EAAEEA26A8AE037C288DDA6791580418 Key = 000000000000000000000000000000008000000000000000 In = 00000000000000000000000000000000 Out = AA525000B28A88169212096B6D5FF58D Key = 000000000000000000000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 09C8F1F28B94167498D9377CB9909458 Key = 000000000000000000000000000000002000000000000000 In = 00000000000000000000000000000000 Out = 847E4FFAD40194940A0F7FA0E34739B4 Key = 000000000000000000000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 50DCE06E775C1A6DDA24B2A926C9EF8E Key = 000000000000000000000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 3896FB03AF06F69CFDDDFBFCDF8E10A7 Key = 000000000000000000000000000000000400000000000000 In = 00000000000000000000000000000000 Out = FED04C2F49DB4BE1D7BC5E187FB1612B Key = 000000000000000000000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 69E749DFCA9AC8A990444E9FFB6CBA09 Key = 000000000000000000000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 9B2262EBF59AB552E04D57A72FE6F013 Key = 000000000000000000000000000000000080000000000000 In = 00000000000000000000000000000000 Out = 8FF0BF7F0088916764CF9FF21E1BDA67 Key = 000000000000000000000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 5DE1FF41440B4CA0EEF22C8C3F96F23F Key = 000000000000000000000000000000000020000000000000 In = 00000000000000000000000000000000 Out = FEBE3209C8D61E85024DEF2122AF0268 Key = 000000000000000000000000000000000010000000000000 In = 00000000000000000000000000000000 Out = DB63B702C6E39A283B64B90F36FBD426 Key = 000000000000000000000000000000000008000000000000 In = 00000000000000000000000000000000 Out = BB364F05F769FFBFE18288BD782D20EB Key = 000000000000000000000000000000000004000000000000 In = 00000000000000000000000000000000 Out = 8A929CBDE0CD9A9545A08DA2D16BA838 Key = 000000000000000000000000000000000002000000000000 In = 00000000000000000000000000000000 Out = C5AE232EB4F293497E79E20E436B5A4C Key = 000000000000000000000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 3979A57AB9EB520E1475D745F897A9A9 Key = 000000000000000000000000000000000000800000000000 In = 00000000000000000000000000000000 Out = 469B440BBD0711C31B9AAA2564ECB68A Key = 000000000000000000000000000000000000400000000000 In = 00000000000000000000000000000000 Out = 260AC31933A32B75C13364E868FD84DB Key = 000000000000000000000000000000000000200000000000 In = 00000000000000000000000000000000 Out = D5A76D2E0D00BE53B401ACB0EE70F8FB Key = 000000000000000000000000000000000000100000000000 In = 00000000000000000000000000000000 Out = C3475809C89275DE82F9F22D59A3DA37 Key = 000000000000000000000000000000000000080000000000 In = 00000000000000000000000000000000 Out = C9B8FBFBF1A120BF47D0F2F48DD23661 Key = 000000000000000000000000000000000000040000000000 In = 00000000000000000000000000000000 Out = C662358CCCD46730D243DEE03B871DC3 Key = 000000000000000000000000000000000000020000000000 In = 00000000000000000000000000000000 Out = F5BA874DAE43AD835B3F1344653411B6 Key = 000000000000000000000000000000000000010000000000 In = 00000000000000000000000000000000 Out = F0185396A6A69D48BBEADFE5B644EED4 Key = 000000000000000000000000000000000000008000000000 In = 00000000000000000000000000000000 Out = DA0DEC6F13B5AEFC056F5D040C5DA310 Key = 000000000000000000000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 7E1DBDE7B45F9C3E01A285EA575AD5ED Key = 000000000000000000000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 7A814893FBF78A6F5345F4E250DA454C Key = 000000000000000000000000000000000000001000000000 In = 00000000000000000000000000000000 Out = 8C8B9E24399A6DF8293B0117307D6084 Key = 000000000000000000000000000000000000000800000000 In = 00000000000000000000000000000000 Out = 11BB87A542E9135ECEB6143A07E0B65E Key = 000000000000000000000000000000000000000400000000 In = 00000000000000000000000000000000 Out = 495A92DB6E242E0A878EB4AC4C886802 Key = 000000000000000000000000000000000000000200000000 In = 00000000000000000000000000000000 Out = 97A5A7E3DAB800B3D4E7D468B4CCB951 Key = 000000000000000000000000000000000000000100000000 In = 00000000000000000000000000000000 Out = C74D778D3F0440EB91981C23CC4F5669 Key = 000000000000000000000000000000000000000080000000 In = 00000000000000000000000000000000 Out = 1B485B0E4A063B844BC2AE8B722D0757 Key = 000000000000000000000000000000000000000040000000 In = 00000000000000000000000000000000 Out = BF9D54F977A978797A4268CFC84132C4 Key = 000000000000000000000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 90C50CB6D84B6A74F3D64A419B0419EA Key = 000000000000000000000000000000000000000010000000 In = 00000000000000000000000000000000 Out = 776EED1A9849173A7AC46E94C9B2681B Key = 000000000000000000000000000000000000000008000000 In = 00000000000000000000000000000000 Out = A42F612CBF53529173E148ABA2B55D63 Key = 000000000000000000000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 6F8B5F268B3DBEA72BF0D1F92B13684E Key = 000000000000000000000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 9379DA858CEC7AC58856E7DBF79C4757 Key = 000000000000000000000000000000000000000001000000 In = 00000000000000000000000000000000 Out = 17FE109D4638A9E1FAF130D621C160CB Key = 000000000000000000000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 2BCFAD82613FFD8D9BCBC539C1158BC9 Key = 000000000000000000000000000000000000000000400000 In = 00000000000000000000000000000000 Out = 8EA212BFBBF476CE35939066A7F1757D Key = 000000000000000000000000000000000000000000200000 In = 00000000000000000000000000000000 Out = 1BFAC7B1B8EB14C26ADA2055E0C9CD36 Key = 000000000000000000000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 9FCA8C1340C47C586D6A2FAD9FAA6833 Key = 000000000000000000000000000000000000000000080000 In = 00000000000000000000000000000000 Out = D22D10708CBA6566DC096B8ABE3F9679 Key = 000000000000000000000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 1FFC5754FC94465A073B714267DEC18C Key = 000000000000000000000000000000000000000000020000 In = 00000000000000000000000000000000 Out = FDED0173236B23DF4DFC1953355AA78E Key = 000000000000000000000000000000000000000000010000 In = 00000000000000000000000000000000 Out = FBE9178C4B27E51E24BF17053724AA2F Key = 000000000000000000000000000000000000000000008000 In = 00000000000000000000000000000000 Out = F02818D3D58D1F3345594670D3009DF4 Key = 000000000000000000000000000000000000000000004000 In = 00000000000000000000000000000000 Out = 6E148020BAB1DD04492299F6A9D9BA22 Key = 000000000000000000000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 8E045AE3022AF7562106681B2B8CB70E Key = 000000000000000000000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 2C73832593114BF299424E30C5848625 Key = 000000000000000000000000000000000000000000000800 In = 00000000000000000000000000000000 Out = 127FC7BCF85F44F5041158A5EB3D040C Key = 000000000000000000000000000000000000000000000400 In = 00000000000000000000000000000000 Out = B25FABDA9D6E6704F23F33B0D907B762 Key = 000000000000000000000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 21B968BF3EFFC638F54BC1524D8D378F Key = 000000000000000000000000000000000000000000000100 In = 00000000000000000000000000000000 Out = 18F3BEB5D5A6B6AC512752AAA65EA3BD Key = 000000000000000000000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 5588729059256CE49AF2DA14EE4C9D00 Key = 000000000000000000000000000000000000000000000040 In = 00000000000000000000000000000000 Out = A6EBD68D0A6F46DA22CD17D4B55BC4FE Key = 000000000000000000000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 50434829C09BFB7C174E1BE33642FEFB Key = 000000000000000000000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 682C20B72DDFE4F678B2379FA25715CA Key = 000000000000000000000000000000000000000000000008 In = 00000000000000000000000000000000 Out = 925721E954372C9EA115BFF97BBE9A12 Key = 000000000000000000000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 32929E53C8E8D85657B9B55A4911028C Key = 000000000000000000000000000000000000000000000002 In = 00000000000000000000000000000000 Out = 8EE624F18BF5AA25ACE8667643D0D80D Key = 000000000000000000000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 30A61DCEB9A951B829DE01414A801807 Key = 8000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 785229B51B515F30A1FCC88B969A4E47 Key = 4000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B095E0619E70CDF5F4BC6E88079CF22F Key = 2000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 44F32AEAE82516AC8857C1985B7109EC Key = 1000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B2BBE93B433C8F0415B90282E788C071 Key = 0800000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9E953EBAA3B13F43F90908B53DAA0C09 Key = 0400000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4579140290095FB25B3144444505D203 Key = 0200000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5FD5F687596A9AA9EA105A2F7CF59A94 Key = 0100000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 005EA3AF8AFF3DDA323148690537853C Key = 0080000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CD8E33C4F06FC0586E821522B2FEB08D Key = 0040000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CABEC07E46D11086778C3E1937CD0797 Key = 0020000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 56BA650835E125201400380C4D2D5D99 Key = 0010000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = EB48A1B279E95EBF8FAAC13D70F8F452 Key = 0008000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E52435C29F7C9687B268C539BF6598B1 Key = 0004000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 27785BDF6F6258EAC396BFD0F56BEE82 Key = 0002000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CA16B1969FA373F43EF09D19B3379F3F Key = 0001000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6D1B6F14090368034E10CF0C1E4F5744 Key = 0000800000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5AE3ABA331C5D765E3D112B1DA09E7BC Key = 0000400000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 767F9CBDA1BA9914EBA40D7A172A4077 Key = 0000200000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8FAE713F677A82075D773DB73D58763E Key = 0000100000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 616CA9A15D710CA38FCA9A8E0B16A21C Key = 0000080000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D36754729DB34ECA1ECAC2CE2B381713 Key = 0000040000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E68E3A421462A49AF8D7E544F7789301 Key = 0000020000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 69B24511DF9BE48CFDB416F08908315F Key = 0000010000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 1329EA7551CE6C335DB924D563694058 Key = 0000008000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 74DA788FB7A6172B65FBB62C7ED4FECC Key = 0000004000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 862703854F75F433135601000CD9363B Key = 0000002000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 824D4C002C401677D5785D6C6DA96C68 Key = 0000001000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7F9F21E8C45D1E8A843060B963CC628B Key = 0000000800000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3F6F7B1157906913B09BD2AE2627C6B0 Key = 0000000400000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A1B7E0CC8B69B3C0C6F635F962D0A22F Key = 0000000200000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6FC34DDFF0C74674CE124D85E8A3447F Key = 0000000100000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 436A5D315AF443DEA9BEF8D1E817E7E0 Key = 0000000080000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B0434C9C98CDA4B313DAD6F1E64A943 Key = 0000000040000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AF9BD15EF1535259C63D688BF67119C4 Key = 0000000020000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F61EF2509D173E348E01839A26D033FF Key = 0000000010000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9D37D036C8568D2173654423CC7AAB39 Key = 0000000008000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A93D98C055DDAA592390CADB0F0C468D Key = 0000000004000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F19CB2A5067E9FBADBD4F0D103007A54 Key = 0000000002000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 83C5D584511836263D8B0DE7CEF0AD16 Key = 0000000001000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E09206EB6A5E8AC933BAAB46547E4CD9 Key = 0000000000800000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0A0EBA6ACED7899AA633CE67E8923936 Key = 0000000000400000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C93968EC0EE02DACD3F3EE9AC2320B88 Key = 0000000000200000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 64D62934D409F36505EEC3B925BE914D Key = 0000000000100000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BBADB03D5F0FCF375E671F8B009F3AF1 Key = 0000000000080000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DAC60B05A1C3A203C6B4FE882E780079 Key = 0000000000040000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8B650EC280BE261CCED5B5FC7F8A9BA7 Key = 0000000000020000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 35EB82F0BB6735E2DE661AE4E9E9EE57 Key = 0000000000010000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 40B1042CBE87D64DDBEA4BAC8CF1F08C Key = 0000000000008000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 13D46AE35D868401D23C891ED92621EE Key = 0000000000004000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D2C6E9C239B4FA5A1E76D038EA4660F3 Key = 0000000000002000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = DE3BC7CDFAF9AB7143E255DC87645F3E Key = 0000000000001000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8FB6CA966B5ACFB180A296EA5D93711F Key = 0000000000000800000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 59F622ACBBA15E522717A9EAF7047949 Key = 0000000000000400000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BB2939FFBD77B308DA93220AD68A21AC Key = 0000000000000200000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CEBE5EDD9BACF0A0FB75B259DE7097CD Key = 0000000000000100000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3448844E63AC2BD809E254AC3BAA6B3B Key = 0000000000000080000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 49C27499EEC1989626B1E50435BA0273 Key = 0000000000000040000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 39E97018F547A8A802578B80952F2457 Key = 0000000000000020000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9934453FBAAE1CB362A0012204967AE8 Key = 0000000000000010000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E9C98A03713835EB4497346866791190 Key = 0000000000000008000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E026C858938B47D28A8758CCFAEF0FA8 Key = 0000000000000004000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3A84B0A26CEA6A8D8A94D5B791A0D3E8 Key = 0000000000000002000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B054259980B45B9D2D7CD6C13200BAFC Key = 0000000000000001000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 13645DBEDE21FF7C79C06141AD9E4CD1 Key = 0000000000000000800000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F29B1370BA8D8CC19AC8DF5DF77F7319 Key = 0000000000000000400000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 6A2C94C488D5BD32742F143B2E8D0659 Key = 0000000000000000200000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 27A0BF748F513F18D4F7831527A3608F Key = 0000000000000000100000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0B0D61E162A88E04C38C19CA668C2DDC Key = 0000000000000000080000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4055BA24216EF49FE36E6145A5CD31D4 Key = 0000000000000000040000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 99699B31EBBE6ABE1F7B2AFEC86DC7E2 Key = 0000000000000000020000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C8D70448CBA770CD94088F60CBF8C5AC Key = 0000000000000000010000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 56C89F1BA6D3AB20465F01F81D00A894 Key = 0000000000000000008000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 919FC5BBFAB8C31F8B2A346FBC2AB282 Key = 0000000000000000004000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FF57E3AB8751DAA252DD0DD917BEAD8B Key = 0000000000000000002000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 90B94853B317FFA8D41F2A32A3A061AB Key = 0000000000000000001000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F4A0257D0CF6C8C87D154746C2C94B52 Key = 0000000000000000000800000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 03666F848F252B501754773CB68CF3B2 Key = 0000000000000000000400000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F3D0941DDC7412A981C5F6CCAB082DC2 Key = 0000000000000000000200000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 21EDD2A11C57EE97AEADFACEC20A8691 Key = 0000000000000000000100000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 577CF09B5606F1443E8B57952004C68D Key = 0000000000000000000080000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0CF408A2FBDA07068BDB13A371867FCC Key = 0000000000000000000040000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 88542C9E680C27FE8FBE090AD73410B9 Key = 0000000000000000000020000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7A8BA6DC89A1AD4385D0696AFDD89496 Key = 0000000000000000000010000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B84FA0FA046D5D77EA94CF3E8FDED147 Key = 0000000000000000000008000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = D73CB079FB7101C933176352A93BB028 Key = 0000000000000000000004000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A7C8C1A59E141D608BC91BB69E7B2859 Key = 0000000000000000000002000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B2DA67AFE49B33E5EDFAF148A17BF06B Key = 0000000000000000000001000000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = AC2DB35ED86D358616648D22B52DF012 Key = 0000000000000000000000800000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 662EA9D88A9A2C89581502EAAAD074D5 Key = 0000000000000000000000400000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 773A30DFDA8EBCE50EDFB925343C9ECC Key = 0000000000000000000000200000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 10B7242D9C7CA610C20F1183BB949514 Key = 0000000000000000000000100000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = B7DF971F9C3444EFCC13210292126942 Key = 0000000000000000000000080000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 13F7406746C6E0CD5666EC04C0E540E2 Key = 0000000000000000000000040000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9382384DCAF80CF537E24FC5F2F71A8A Key = 0000000000000000000000020000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3D5819934619E09F10E90C4EA7F30F40 Key = 0000000000000000000000010000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 710446D0A254F68975CD6AAAE92212FD Key = 0000000000000000000000008000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 0A44FDEAA17E5F3E536A08D7A5B3267B Key = 0000000000000000000000004000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BAC72F53EE39296D3A23B126F8D8B20B Key = 0000000000000000000000002000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 88C342961D0EE83902CB78C29539923D Key = 0000000000000000000000001000000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = CF3B48A6351C4561752D6A209F93A30F Key = 0000000000000000000000000800000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 957B107D23F3694F3FFD9957BBE13168 Key = 0000000000000000000000000400000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 23675E18C1C66B483D55E14AC7F9CC80 Key = 0000000000000000000000000200000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 955B8619F99F7609201CEEB338F32795 Key = 0000000000000000000000000100000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 9F2BCB0C28768DA3B76206979B14EBC2 Key = 0000000000000000000000000080000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 258F95A0E86EE0EE8FC020B4A01900F2 Key = 0000000000000000000000000040000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FD7B1DD7C7FE279E6A5E2926DD890B5E Key = 0000000000000000000000000020000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 59CF38A7C863C623991B5392944CB43C Key = 0000000000000000000000000010000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 27BCC9206AEC78DA48C1E9AB8D1A7A07 Key = 0000000000000000000000000008000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 62D8460820B18811DEBB617DE7B8EC8C Key = 0000000000000000000000000004000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 782D8A4D30EE841EDB2E7E88C63B851A Key = 0000000000000000000000000002000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4D10D177334397F49211BCB10F207905 Key = 0000000000000000000000000001000000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = C8E608BAFE61254A0DDF866BB4D063DD Key = 0000000000000000000000000000800000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 05DDAB3DAEA0C64C1077BE22DA7ACDD4 Key = 0000000000000000000000000000400000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 951388F2BE1DD7013A00327FC6DB7905 Key = 0000000000000000000000000000200000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 62F8283651EFDF475DE8511EA7256AD6 Key = 0000000000000000000000000000100000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5B259EEE6B19EE12D4CE20D2F38D4BCF Key = 0000000000000000000000000000080000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 704414E13DCAD9DF7F593F630E68E13C Key = 0000000000000000000000000000040000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 41AD9DAAC24ECCBB454DBAF75D5B9989 Key = 0000000000000000000000000000020000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 919C54C126B54D7A570D8ABA9FCE5D08 Key = 0000000000000000000000000000010000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = BC665541FF0F2E86DBDF4444C01AC0EA Key = 0000000000000000000000000000008000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = FD30E2D851211506C112D5701B859BC6 Key = 0000000000000000000000000000004000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7DB7B15E4ACBDBB0BFF4C4EAEDC2231E Key = 0000000000000000000000000000002000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = F0AFDED56AD72D4C1E57A66EEDF4816E Key = 0000000000000000000000000000001000000000000000000000000000000000 In = 00000000000000000000000000000000 Out = E53B053D9B2E06656138D4A1EFA58888 Key = 0000000000000000000000000000000800000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 4DABE13A3E656E95150440F81DD92666 Key = 0000000000000000000000000000000400000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 175D44DFDE1EAD6E0E6862B511AA7007 Key = 0000000000000000000000000000000200000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 09B690F493F5C779E8B6ACD09667A997 Key = 0000000000000000000000000000000100000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 68D0E4CCA0119EED57ABF3C7574BDA8B Key = 0000000000000000000000000000000080000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 12C00618DA7EBA5EFA5E58D2696D891F Key = 0000000000000000000000000000000040000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5DCE21AF0D23BC5AEFD4EA331B16219A Key = 0000000000000000000000000000000020000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A5D7135A053B904D44B40E4E21693751 Key = 0000000000000000000000000000000010000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 3257CEC675BF755FEE67A44D7EDF2731 Key = 0000000000000000000000000000000008000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 324D30DDC6979F17A3BEAEA3A76AD44C Key = 0000000000000000000000000000000004000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A1AA0E04E2B61861796FD2AA30FBEB05 Key = 0000000000000000000000000000000002000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 90CA81DF4000404B567F5CFA9D193CB3 Key = 0000000000000000000000000000000001000000000000000000000000000000 In = 00000000000000000000000000000000 Out = A2E6864259483D059B57BB921B7FBD99 Key = 0000000000000000000000000000000000800000000000000000000000000000 In = 00000000000000000000000000000000 Out = 545690C09C8C396F1273510DA9065C12 Key = 0000000000000000000000000000000000400000000000000000000000000000 In = 00000000000000000000000000000000 Out = 16D86FCC5910E2DD0CEA4DD5219B2D03 Key = 0000000000000000000000000000000000200000000000000000000000000000 In = 00000000000000000000000000000000 Out = EC4114C19DD5711CD927B0DBE34AAB4B Key = 0000000000000000000000000000000000100000000000000000000000000000 In = 00000000000000000000000000000000 Out = A78C62D8FD439E5B10A7EF436714AC22 Key = 0000000000000000000000000000000000080000000000000000000000000000 In = 00000000000000000000000000000000 Out = BA5D708CBA34F782DA00C7643C971DB9 Key = 0000000000000000000000000000000000040000000000000000000000000000 In = 00000000000000000000000000000000 Out = 7DB9ADCFA26C1E784E7F485BD0A0A52C Key = 0000000000000000000000000000000000020000000000000000000000000000 In = 00000000000000000000000000000000 Out = 8A025CED99AF1047C5345358A291CDBB Key = 0000000000000000000000000000000000010000000000000000000000000000 In = 00000000000000000000000000000000 Out = 187A1824D390AD2798E4F2264E5F1F21 Key = 0000000000000000000000000000000000008000000000000000000000000000 In = 00000000000000000000000000000000 Out = BA28DE5C32353C65B97A59889E7A7A40 Key = 0000000000000000000000000000000000004000000000000000000000000000 In = 00000000000000000000000000000000 Out = 5D486AB86A883029EC74916851FFFA11 Key = 0000000000000000000000000000000000002000000000000000000000000000 In = 00000000000000000000000000000000 Out = F9C79D54CEEE6170B195F4D30FA63FE0 Key = 0000000000000000000000000000000000001000000000000000000000000000 In = 00000000000000000000000000000000 Out = 96B8429F476485F8CC2E204534A8B64E Key = 0000000000000000000000000000000000000800000000000000000000000000 In = 00000000000000000000000000000000 Out = 13061D65FEF26F5ACAAF3B55FDB98C36 Key = 0000000000000000000000000000000000000400000000000000000000000000 In = 00000000000000000000000000000000 Out = C72DC86F70B40169B3456783A611DAE9 Key = 0000000000000000000000000000000000000200000000000000000000000000 In = 00000000000000000000000000000000 Out = 82AA2DB6FEE9212968D8282A1BF3242B Key = 0000000000000000000000000000000000000100000000000000000000000000 In = 00000000000000000000000000000000 Out = 220C8B197F54F8E86DAE575B07A570EF Key = 0000000000000000000000000000000000000080000000000000000000000000 In = 00000000000000000000000000000000 Out = 873C47F6F75BE9F710F91F2C54A69A7A Key = 0000000000000000000000000000000000000040000000000000000000000000 In = 00000000000000000000000000000000 Out = 0392FA7BB908FEF23774772F74AC968D Key = 0000000000000000000000000000000000000020000000000000000000000000 In = 00000000000000000000000000000000 Out = A94203746A266C5744C16BF4E8DFA6D7 Key = 0000000000000000000000000000000000000010000000000000000000000000 In = 00000000000000000000000000000000 Out = D3BA78AD6B01CC7221FA7778699C8316 Key = 0000000000000000000000000000000000000008000000000000000000000000 In = 00000000000000000000000000000000 Out = 994FDCC09C25400D14C05117B936EECD Key = 0000000000000000000000000000000000000004000000000000000000000000 In = 00000000000000000000000000000000 Out = 4012F67B2A0BEF2623CA6AC5B054BE62 Key = 0000000000000000000000000000000000000002000000000000000000000000 In = 00000000000000000000000000000000 Out = 1134AF65E6D3D5E3D3C23A499EE2F677 Key = 0000000000000000000000000000000000000001000000000000000000000000 In = 00000000000000000000000000000000 Out = 6B35A344BD8DFD4002F5F22EA288F8E6 Key = 0000000000000000000000000000000000000000800000000000000000000000 In = 00000000000000000000000000000000 Out = D293D438C563B8EB3FF26E23A7323B74 Key = 0000000000000000000000000000000000000000400000000000000000000000 In = 00000000000000000000000000000000 Out = 8085B7A7B939FA37BC4E1D746E9F9B37 Key = 0000000000000000000000000000000000000000200000000000000000000000 In = 00000000000000000000000000000000 Out = D628AD150E15F413010BE15E391D3F48 Key = 0000000000000000000000000000000000000000100000000000000000000000 In = 00000000000000000000000000000000 Out = A5C2AC88B6FD4C57CB4F2C2920A584EF Key = 0000000000000000000000000000000000000000080000000000000000000000 In = 00000000000000000000000000000000 Out = D7F5183F6BAB04B87A1ABAA3914DA848 Key = 0000000000000000000000000000000000000000040000000000000000000000 In = 00000000000000000000000000000000 Out = 3B2116BD2E362FC8985A0F0C618DF58A Key = 0000000000000000000000000000000000000000020000000000000000000000 In = 00000000000000000000000000000000 Out = BF31E8DE8342A32BBD80A8F91507BADA Key = 0000000000000000000000000000000000000000010000000000000000000000 In = 00000000000000000000000000000000 Out = AA04A56C13507AE5137657546766AE2D Key = 0000000000000000000000000000000000000000008000000000000000000000 In = 00000000000000000000000000000000 Out = 72B9D7628AB21DF89666E50517C50574 Key = 0000000000000000000000000000000000000000004000000000000000000000 In = 00000000000000000000000000000000 Out = 2B8DE8D2D3332E6A30215ACC10A69847 Key = 0000000000000000000000000000000000000000002000000000000000000000 In = 00000000000000000000000000000000 Out = AC421C73A789D79B452623DAFD3D6D0B Key = 0000000000000000000000000000000000000000001000000000000000000000 In = 00000000000000000000000000000000 Out = 995207D8CF8C10904C0F47652C9C4287 Key = 0000000000000000000000000000000000000000000800000000000000000000 In = 00000000000000000000000000000000 Out = F83BD19A357BD7901C0E8FBEFCF857ED Key = 0000000000000000000000000000000000000000000400000000000000000000 In = 00000000000000000000000000000000 Out = F42BB427C894A072C861C1425CBD71BC Key = 0000000000000000000000000000000000000000000200000000000000000000 In = 00000000000000000000000000000000 Out = 3D1EC73B166DC0120DDF24267907C0F9 Key = 0000000000000000000000000000000000000000000100000000000000000000 In = 00000000000000000000000000000000 Out = 8EF136AF5D7D1B513FB59FA21F7837A1 Key = 0000000000000000000000000000000000000000000080000000000000000000 In = 00000000000000000000000000000000 Out = EB4BBA7F94CE9429255A583D2F9810CD Key = 0000000000000000000000000000000000000000000040000000000000000000 In = 00000000000000000000000000000000 Out = 5FE1C3BCD24818948514CB5A32FFD0A1 Key = 0000000000000000000000000000000000000000000020000000000000000000 In = 00000000000000000000000000000000 Out = A990117E78D1C5BD7833B96A4A180744 Key = 0000000000000000000000000000000000000000000010000000000000000000 In = 00000000000000000000000000000000 Out = E63684CDC37E6768C45012EA00D008E4 Key = 0000000000000000000000000000000000000000000008000000000000000000 In = 00000000000000000000000000000000 Out = 78B711F290DA924CAF1E4F1E11A08F4F Key = 0000000000000000000000000000000000000000000004000000000000000000 In = 00000000000000000000000000000000 Out = 85B7F0D391AF9268643D9C0B72433A99 Key = 0000000000000000000000000000000000000000000002000000000000000000 In = 00000000000000000000000000000000 Out = F51410475B33FBD3DB2117B5C17C82D4 Key = 0000000000000000000000000000000000000000000001000000000000000000 In = 00000000000000000000000000000000 Out = A3C5BF72F39940DC7DAFB474A77A6114 Key = 0000000000000000000000000000000000000000000000800000000000000000 In = 00000000000000000000000000000000 Out = 4EFB0E18FB2F96FB6F81514BCE0A7BBD Key = 0000000000000000000000000000000000000000000000400000000000000000 In = 00000000000000000000000000000000 Out = 10112F5ABBF246996860B843FC7159F5 Key = 0000000000000000000000000000000000000000000000200000000000000000 In = 00000000000000000000000000000000 Out = 94A91373701569B8C21487A7BDB164B6 Key = 0000000000000000000000000000000000000000000000100000000000000000 In = 00000000000000000000000000000000 Out = A466821BD64F552C0610ADB737C562CD Key = 0000000000000000000000000000000000000000000000080000000000000000 In = 00000000000000000000000000000000 Out = 511BE2BA9F2A272CA2F5C1D0F3E249C1 Key = 0000000000000000000000000000000000000000000000040000000000000000 In = 00000000000000000000000000000000 Out = 5578CCF8B92D48363EED4601661EB56E Key = 0000000000000000000000000000000000000000000000020000000000000000 In = 00000000000000000000000000000000 Out = BF90E87173A45115C811B6319C24FC4A Key = 0000000000000000000000000000000000000000000000010000000000000000 In = 00000000000000000000000000000000 Out = 8029EE840D130319330B432D95DB9AA7 Key = 0000000000000000000000000000000000000000000000008000000000000000 In = 00000000000000000000000000000000 Out = 19D6D9F45582481A573D77917E778F3C Key = 0000000000000000000000000000000000000000000000004000000000000000 In = 00000000000000000000000000000000 Out = 556D552FDE7C64227E2B72776488D6C1 Key = 0000000000000000000000000000000000000000000000002000000000000000 In = 00000000000000000000000000000000 Out = 3E81B51A214CC1F1CF6F35F9106A84BC Key = 0000000000000000000000000000000000000000000000001000000000000000 In = 00000000000000000000000000000000 Out = 4E48243857ECB700F8F16872E0BB4FA9 Key = 0000000000000000000000000000000000000000000000000800000000000000 In = 00000000000000000000000000000000 Out = 681654DF6668CDDF1D3D604483AB483B Key = 0000000000000000000000000000000000000000000000000400000000000000 In = 00000000000000000000000000000000 Out = BD6CEEFD85A336E4F12D42076573ECA2 Key = 0000000000000000000000000000000000000000000000000200000000000000 In = 00000000000000000000000000000000 Out = 7488F9790FEC8AAE2AADDF6A600629B3 Key = 0000000000000000000000000000000000000000000000000100000000000000 In = 00000000000000000000000000000000 Out = 669C36695C33B63F16077CAE9AA940AA Key = 0000000000000000000000000000000000000000000000000080000000000000 In = 00000000000000000000000000000000 Out = 7CE998A357384159C9B34A9A8AC7DF78 Key = 0000000000000000000000000000000000000000000000000040000000000000 In = 00000000000000000000000000000000 Out = 51BE07BA8106A19CCC2005B8B3932FBF Key = 0000000000000000000000000000000000000000000000000020000000000000 In = 00000000000000000000000000000000 Out = 2634245A6EC3F17A35B7FE1D3E17F769 Key = 0000000000000000000000000000000000000000000000000010000000000000 In = 00000000000000000000000000000000 Out = 24D4114760BCE04C0109C06CCE199F6C Key = 0000000000000000000000000000000000000000000000000008000000000000 In = 00000000000000000000000000000000 Out = 3F055452FCD596C6D588BD48BB5D5080 Key = 0000000000000000000000000000000000000000000000000004000000000000 In = 00000000000000000000000000000000 Out = A1D97F66DEF90DE14CC2BFAFF09286BB Key = 0000000000000000000000000000000000000000000000000002000000000000 In = 00000000000000000000000000000000 Out = 80442DC4EBFB53B86E232D886CA166B9 Key = 0000000000000000000000000000000000000000000000000001000000000000 In = 00000000000000000000000000000000 Out = 76A593802C6A691152E8A04E5DE2D05A Key = 0000000000000000000000000000000000000000000000000000800000000000 In = 00000000000000000000000000000000 Out = F923A147E00807D58FB9C686E01F7E07 Key = 0000000000000000000000000000000000000000000000000000400000000000 In = 00000000000000000000000000000000 Out = 8EA3B396D561A3CFCE729A0B59647760 Key = 0000000000000000000000000000000000000000000000000000200000000000 In = 00000000000000000000000000000000 Out = 4AA735D710704790C060BAD696DACABE Key = 0000000000000000000000000000000000000000000000000000100000000000 In = 00000000000000000000000000000000 Out = 7F7C322D82557737F5407A797069B711 Key = 0000000000000000000000000000000000000000000000000000080000000000 In = 00000000000000000000000000000000 Out = 5094418C55B7D591EFDB7097CB95B16D Key = 0000000000000000000000000000000000000000000000000000040000000000 In = 00000000000000000000000000000000 Out = CC014984ABDFB760A835846668340929 Key = 0000000000000000000000000000000000000000000000000000020000000000 In = 00000000000000000000000000000000 Out = 18F86EA6C633228579C5728FF070AC21 Key = 0000000000000000000000000000000000000000000000000000010000000000 In = 00000000000000000000000000000000 Out = AFCF921E4FA24FDEF85EDAC12CD479F1 Key = 0000000000000000000000000000000000000000000000000000008000000000 In = 00000000000000000000000000000000 Out = 684085D0BE8AE0D617B2EFEF62CAAC93 Key = 0000000000000000000000000000000000000000000000000000004000000000 In = 00000000000000000000000000000000 Out = 04C7B0268EAEFED098C815935D868CF9 Key = 0000000000000000000000000000000000000000000000000000002000000000 In = 00000000000000000000000000000000 Out = 39AE859D255487A68093A376D358BBC2 Key = 0000000000000000000000000000000000000000000000000000001000000000 In = 00000000000000000000000000000000 Out = F1218B59E947816041B21AC28685EF36 Key = 0000000000000000000000000000000000000000000000000000000800000000 In = 00000000000000000000000000000000 Out = B9BE024D06447F8965E480B33975E36F Key = 0000000000000000000000000000000000000000000000000000000400000000 In = 00000000000000000000000000000000 Out = 24ECD5B3178150233BD38A4B9F8EBC86 Key = 0000000000000000000000000000000000000000000000000000000200000000 In = 00000000000000000000000000000000 Out = 7AD12485E896037A8D1A4ABE8A80B9BB Key = 0000000000000000000000000000000000000000000000000000000100000000 In = 00000000000000000000000000000000 Out = CEC561C6F4C45CC944371E5D1C18EDF1 Key = 0000000000000000000000000000000000000000000000000000000080000000 In = 00000000000000000000000000000000 Out = F4B1088B0858A3737DF2C90FD919D1D4 Key = 0000000000000000000000000000000000000000000000000000000040000000 In = 00000000000000000000000000000000 Out = 5EA6D1B9881CE230B8EABAC59B7F5393 Key = 0000000000000000000000000000000000000000000000000000000020000000 In = 00000000000000000000000000000000 Out = 8023134FAC8BF5FDA86368BDA618AEF7 Key = 0000000000000000000000000000000000000000000000000000000010000000 In = 00000000000000000000000000000000 Out = D37285234A927061BEC9F8AAE0E796C8 Key = 0000000000000000000000000000000000000000000000000000000008000000 In = 00000000000000000000000000000000 Out = 68AC18DB2FBF0A4A095A4B3344BF035D Key = 0000000000000000000000000000000000000000000000000000000004000000 In = 00000000000000000000000000000000 Out = 563868079C5DF91E3B47B370B0BBB820 Key = 0000000000000000000000000000000000000000000000000000000002000000 In = 00000000000000000000000000000000 Out = 86C3BB221834F7507505434E4F98DC92 Key = 0000000000000000000000000000000000000000000000000000000001000000 In = 00000000000000000000000000000000 Out = FD8220818731607D8B69AC5963D0FAC9 Key = 0000000000000000000000000000000000000000000000000000000000800000 In = 00000000000000000000000000000000 Out = 550726375ABB0F9A7C010DC4E47833F9 Key = 0000000000000000000000000000000000000000000000000000000000400000 In = 00000000000000000000000000000000 Out = 8AB5E8973A5D6648517D151295091C0E Key = 0000000000000000000000000000000000000000000000000000000000200000 In = 00000000000000000000000000000000 Out = 338BB4B5569AA06411B9911381F350B2 Key = 0000000000000000000000000000000000000000000000000000000000100000 In = 00000000000000000000000000000000 Out = 332D696EC49DF4B58C5FA9CC84773F47 Key = 0000000000000000000000000000000000000000000000000000000000080000 In = 00000000000000000000000000000000 Out = DEB5AC8F895AFF45BA5815D4912D8371 Key = 0000000000000000000000000000000000000000000000000000000000040000 In = 00000000000000000000000000000000 Out = 89A49D3AB772D0FDAE05FC692EAF6C7B Key = 0000000000000000000000000000000000000000000000000000000000020000 In = 00000000000000000000000000000000 Out = 02116E6AEFC21A4D4D64CA27AB7AF31E Key = 0000000000000000000000000000000000000000000000000000000000010000 In = 00000000000000000000000000000000 Out = 58F79FF1810CA4B0E0178F7D9C24A581 Key = 0000000000000000000000000000000000000000000000000000000000008000 In = 00000000000000000000000000000000 Out = 686FB1ED659D9BF17DA2BB79AC636C93 Key = 0000000000000000000000000000000000000000000000000000000000004000 In = 00000000000000000000000000000000 Out = 1C5C176C4F5796B2C34D2A12858EB511 Key = 0000000000000000000000000000000000000000000000000000000000002000 In = 00000000000000000000000000000000 Out = 2A94B92CC9C4776817C0A77D49E24F22 Key = 0000000000000000000000000000000000000000000000000000000000001000 In = 00000000000000000000000000000000 Out = 890583A6C9549A3DCAFBD54BF391BC8F Key = 0000000000000000000000000000000000000000000000000000000000000800 In = 00000000000000000000000000000000 Out = EA88A883197E483B4AA16316EA97CCBB Key = 0000000000000000000000000000000000000000000000000000000000000400 In = 00000000000000000000000000000000 Out = CC5732CEB99A0A0353BABA6432BCBE9F Key = 0000000000000000000000000000000000000000000000000000000000000200 In = 00000000000000000000000000000000 Out = 88811B506D565779F09DE9BDF8702BD8 Key = 0000000000000000000000000000000000000000000000000000000000000100 In = 00000000000000000000000000000000 Out = E11FEE3AD4A9A03956704B58720C92DD Key = 0000000000000000000000000000000000000000000000000000000000000080 In = 00000000000000000000000000000000 Out = 644555DFB9CE8EDAF888EE142B5577F1 Key = 0000000000000000000000000000000000000000000000000000000000000040 In = 00000000000000000000000000000000 Out = 716E2BBCBD8FF7E7335784B767F27CA9 Key = 0000000000000000000000000000000000000000000000000000000000000020 In = 00000000000000000000000000000000 Out = 83588863F183ECE04E95629A322F9A09 Key = 0000000000000000000000000000000000000000000000000000000000000010 In = 00000000000000000000000000000000 Out = 5E2833EC95ACE6B93AF28C6FCDBCE5D5 Key = 0000000000000000000000000000000000000000000000000000000000000008 In = 00000000000000000000000000000000 Out = B3EFCF17F0E1B275D413DD4D3A5CAE68 Key = 0000000000000000000000000000000000000000000000000000000000000004 In = 00000000000000000000000000000000 Out = 3C943E1A2E7E56E4B185302D2D5C5DBD Key = 0000000000000000000000000000000000000000000000000000000000000002 In = 00000000000000000000000000000000 Out = 8CB4E2498382B523DCE6F7C17C91400B Key = 0000000000000000000000000000000000000000000000000000000000000001 In = 00000000000000000000000000000000 Out = 85F345366155D13F8F257734D2CBD6D9 Key = 00000000000000000000000000000000 In = 80000000000000000000000000000000 Out = 73B9FF14CF2589901FF52A0D6F4B7EDE Key = 00000000000000000000000000000000 In = 40000000000000000000000000000000 Out = F5A9150BAB6D6AEBD6B4F97D9E93B28B Key = 00000000000000000000000000000000 In = 20000000000000000000000000000000 Out = C30F8B221FD6D3996F973CDCDC6E305C Key = 00000000000000000000000000000000 In = 10000000000000000000000000000000 Out = D6A531FE826CB0454F2D567A20018CB7 Key = 00000000000000000000000000000000 In = 08000000000000000000000000000000 Out = B62324BE427332A6089C7BE40D40292E Key = 00000000000000000000000000000000 In = 04000000000000000000000000000000 Out = 929B4789E9D6940C9A158880CA21C0E2 Key = 00000000000000000000000000000000 In = 02000000000000000000000000000000 Out = C14830DB50BA7221B27DC033B0D8D331 Key = 00000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 743342B02EBE647AE47092D435FA60F6 Key = 00000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 4F02AF45C09373D879CD01506A4E7D14 Key = 00000000000000000000000000000000 In = 00400000000000000000000000000000 Out = 92BC9085AB0BA8FFEC2EA6D360864817 Key = 00000000000000000000000000000000 In = 00200000000000000000000000000000 Out = 670A4ED16EA1BDE23E16CB52DBD31CB0 Key = 00000000000000000000000000000000 In = 00100000000000000000000000000000 Out = A52335AA9F42886084E21400DE48B62F Key = 00000000000000000000000000000000 In = 00080000000000000000000000000000 Out = A5A240EBFED79F38F31497EA4C9CFCDA Key = 00000000000000000000000000000000 In = 00040000000000000000000000000000 Out = 46A64A07123E1212FE9E2F30EDFD80FF Key = 00000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 20C9F20A8045AEDEE9D6E1CDA948339A Key = 00000000000000000000000000000000 In = 00010000000000000000000000000000 Out = DF1606EEF4FEE3F4FC9EC26E2AB388AB Key = 00000000000000000000000000000000 In = 00008000000000000000000000000000 Out = 6758972B3171F0EA46304542776337FC Key = 00000000000000000000000000000000 In = 00004000000000000000000000000000 Out = EC9B591DB8476C26C3CFDA618C1DBBD8 Key = 00000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 651551E741359E0A10BB4EE6A1C07C02 Key = 00000000000000000000000000000000 In = 00001000000000000000000000000000 Out = 88BC2BF1F8A55562B95F8547C9A19E56 Key = 00000000000000000000000000000000 In = 00000800000000000000000000000000 Out = 1A6CCCBD8D40AA14810ED615A6A6E24D Key = 00000000000000000000000000000000 In = 00000400000000000000000000000000 Out = 7B68DA568ABA5AE69D93C915E37DEE91 Key = 00000000000000000000000000000000 In = 00000200000000000000000000000000 Out = EC3922A728DA9E4C212D910E5C4AE632 Key = 00000000000000000000000000000000 In = 00000100000000000000000000000000 Out = 5BAC94C97A4069400875A5ABC07BCB17 Key = 00000000000000000000000000000000 In = 00000080000000000000000000000000 Out = F3B4662918864BA94C1CF79C73B1F259 Key = 00000000000000000000000000000000 In = 00000040000000000000000000000000 Out = 6FBF5A9A93EFA6640AFB80D9A2D22CF7 Key = 00000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 74139BD645DED7690F606490CCA44DD2 Key = 00000000000000000000000000000000 In = 00000010000000000000000000000000 Out = B20F456519D353AF91C012793576F9B8 Key = 00000000000000000000000000000000 In = 00000008000000000000000000000000 Out = C0AD52D4B4F67A9333A5E4B1B1176EEC Key = 00000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 797224710FD09F9830B0F160AE9051E8 Key = 00000000000000000000000000000000 In = 00000002000000000000000000000000 Out = 73669B64C292F4461FAA3A3D091D08DA Key = 00000000000000000000000000000000 In = 00000001000000000000000000000000 Out = EFE0E893CE04008935CB7D43A7DC9ADD Key = 00000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 3B0A2D3B236324221F81BFCAE45217D8 Key = 00000000000000000000000000000000 In = 00000000400000000000000000000000 Out = CE6F569FC89127B1AE19466FA36DD6E4 Key = 00000000000000000000000000000000 In = 00000000200000000000000000000000 Out = 6037FE38896C05745C58C28CDF7FF386 Key = 00000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 92F5817D0BE37241F9292F6FF918A8E5 Key = 00000000000000000000000000000000 In = 00000000080000000000000000000000 Out = 20C9A2A684563495C255A5751C1AC01E Key = 00000000000000000000000000000000 In = 00000000040000000000000000000000 Out = AC6B6DB6D069B6895F2283435D33BD43 Key = 00000000000000000000000000000000 In = 00000000020000000000000000000000 Out = F9354B12C2366F1CE10F9A0550281267 Key = 00000000000000000000000000000000 In = 00000000010000000000000000000000 Out = 684FDA9FCF3B3B5648A452CDA07CF002 Key = 00000000000000000000000000000000 In = 00000000008000000000000000000000 Out = 9BE294C97C2A963006A2BD4541DC7DB5 Key = 00000000000000000000000000000000 In = 00000000004000000000000000000000 Out = A984F6F70E93FE65C8798C01D4E5D30C Key = 00000000000000000000000000000000 In = 00000000002000000000000000000000 Out = E06A6CE2D74DB3D78E8F5D991C322B87 Key = 00000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 646771D16BAEDAC3F8E9D00C212518A2 Key = 00000000000000000000000000000000 In = 00000000000800000000000000000000 Out = 9D2D410DC6F3BEC913D64BDBDEF3285E Key = 00000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 6850AFECD8064E77F4F6944BDF5B324D Key = 00000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 2E341142550F73F4C8E9DCCC5931A158 Key = 00000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 0CA58E149C2120A8EBF9A7885A89ACBC Key = 00000000000000000000000000000000 In = 00000000000080000000000000000000 Out = 41EACB7F6B5F9E3E3D299CA416EA2C59 Key = 00000000000000000000000000000000 In = 00000000000040000000000000000000 Out = C4D45503484DBC83CB52D3DB4AD0A7CC Key = 00000000000000000000000000000000 In = 00000000000020000000000000000000 Out = CC52B159C2BCF87EE5F4926C6E7B7744 Key = 00000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 7E8A4023B8890A2DBF0D54E330FDF2A2 Key = 00000000000000000000000000000000 In = 00000000000008000000000000000000 Out = B05E771660493DCE3A275B0252D343A7 Key = 00000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 83D0034D231E179207F6A97FB1457FEB Key = 00000000000000000000000000000000 In = 00000000000002000000000000000000 Out = 7132BF130E8732C41F68107F49153FF2 Key = 00000000000000000000000000000000 In = 00000000000001000000000000000000 Out = B93021593B9EA2588F16E87D3C5DE0EC Key = 00000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 26031449FBD6C84201B0BFB53B2C23CA Key = 00000000000000000000000000000000 In = 00000000000000400000000000000000 Out = AFC8E9D2B9BFED9CE0B898F28607DF4C Key = 00000000000000000000000000000000 In = 00000000000000200000000000000000 Out = C5094DE7E36CAEBE1B76EC3AC2C875F5 Key = 00000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 7DF8910A2D256FFB5D56FD1358F131FE Key = 00000000000000000000000000000000 In = 00000000000000080000000000000000 Out = D93F84C1519D6627465E984675AA800B Key = 00000000000000000000000000000000 In = 00000000000000040000000000000000 Out = 5F1861F1523CDA0C95644B0C4F2EE6D1 Key = 00000000000000000000000000000000 In = 00000000000000020000000000000000 Out = FC5C4893AD148E4134EAEB3B1B190E29 Key = 00000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 80D1463F9E9416A143B2FF69DE629510 Key = 00000000000000000000000000000000 In = 00000000000000008000000000000000 Out = F16305404AE6266C619DC8ACA2D492E1 Key = 00000000000000000000000000000000 In = 00000000000000004000000000000000 Out = 3B2554E422F9CEBB8271D7A48C94E03F Key = 00000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 18B039EECB68A05CBF8C65EE85BDC4BC Key = 00000000000000000000000000000000 In = 00000000000000001000000000000000 Out = BB26ABB17AD5482B1DCC4018E7DB0950 Key = 00000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 7E7AC0FD5B98157CEAD4BBAB643BE4CA Key = 00000000000000000000000000000000 In = 00000000000000000400000000000000 Out = BD8A3B64849E54CC2D8379DCA9E42FDD Key = 00000000000000000000000000000000 In = 00000000000000000200000000000000 Out = 58C388DFB41FF3E14394C73FD8AAC56A Key = 00000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 944B295E23C5B2542DED57A155D33EF8 Key = 00000000000000000000000000000000 In = 00000000000000000080000000000000 Out = 067B4DD07DCA1292CFF0D80D75BDACA5 Key = 00000000000000000000000000000000 In = 00000000000000000040000000000000 Out = 7D7344373196C5B30676F270BFC90B07 Key = 00000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 988C5164A82254B29326C98812A716CE Key = 00000000000000000000000000000000 In = 00000000000000000010000000000000 Out = 8FFD48787C28542E0450FAD4CBAD34D0 Key = 00000000000000000000000000000000 In = 00000000000000000008000000000000 Out = C50E7CD771628964E708425160FFB02C Key = 00000000000000000000000000000000 In = 00000000000000000004000000000000 Out = B293B07F92D68C18FEC1466996B78020 Key = 00000000000000000000000000000000 In = 00000000000000000002000000000000 Out = DE21B2A6C8D7B90A7714DB3EF5209A6B Key = 00000000000000000000000000000000 In = 00000000000000000001000000000000 Out = 4700E22C08FE953CABAC7E78A3F747A7 Key = 00000000000000000000000000000000 In = 00000000000000000000800000000000 Out = 504C1D7FAE3AB9A62323F21BF9A80A67 Key = 00000000000000000000000000000000 In = 00000000000000000000400000000000 Out = 064BA0E8ADDD8E9DF4496E6931AD25F4 Key = 00000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 51D0B15C08FF32F1DCE7B28320875566 Key = 00000000000000000000000000000000 In = 00000000000000000000100000000000 Out = 1A20EA3DB071121460244EDE27DA7A39 Key = 00000000000000000000000000000000 In = 00000000000000000000080000000000 Out = 0035A5F7557B1B009327109D0C62F25C Key = 00000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 803939C10EE11BB254A7768FAD053DA4 Key = 00000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 35D493255A870959C12F26170E6A1B64 Key = 00000000000000000000000000000000 In = 00000000000000000000010000000000 Out = DE8381198215D45B1BE787E4E8438500 Key = 00000000000000000000000000000000 In = 00000000000000000000008000000000 Out = B22E9707E738F723CD9B99386CE0162E Key = 00000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 24C65ADDE5C3CD24B75C343782E87F6E Key = 00000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 0050FF2C1A3C2AA68207D333F9956A72 Key = 00000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 162F7B8D35C1A98305BA0FE2A91FF27A Key = 00000000000000000000000000000000 In = 00000000000000000000000800000000 Out = 223D6117FE4864C2B3C513EAC2A5266A Key = 00000000000000000000000000000000 In = 00000000000000000000000400000000 Out = 3DBF645715ED7AD1964E2DCDE2F8806A Key = 00000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 3DBB85509557BB00FE0F2013A90A5753 Key = 00000000000000000000000000000000 In = 00000000000000000000000100000000 Out = F2D75E45A62D1758C7A542BC805AC482 Key = 00000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 77628153A62DFD455B1C0E5B6CE9688C Key = 00000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 8AE9DF2D94F6E85C86459132130E1BF5 Key = 00000000000000000000000000000000 In = 00000000000000000000000020000000 Out = BB610990F42303F4ECCD795E16780A13 Key = 00000000000000000000000000000000 In = 00000000000000000000000010000000 Out = A38330C5C0B464FFD6983972CF9541CC Key = 00000000000000000000000000000000 In = 00000000000000000000000008000000 Out = EFD11CA98FEBB6F1ECBEBBCB8BD5E35B Key = 00000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 3BC6740BF141DD33D65FDEAA10BF1655 Key = 00000000000000000000000000000000 In = 00000000000000000000000002000000 Out = FCF7BE4B89B54547C0BEF84EB85734F6 Key = 00000000000000000000000000000000 In = 00000000000000000000000001000000 Out = CBF5EF38DDEBCA39F2F6BEB2F3042D96 Key = 00000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 1119C20F08D4EA77A13C331678D4D71F Key = 00000000000000000000000000000000 In = 00000000000000000000000000400000 Out = 5C8241DA3FB0DC7328271B9FF72C91BA Key = 00000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 337FCEE0AD0BDCA24AF5411B69D39B37 Key = 00000000000000000000000000000000 In = 00000000000000000000000000100000 Out = F6C56A841A31D58A90F5693F87380A3F Key = 00000000000000000000000000000000 In = 00000000000000000000000000080000 Out = DD8C11B46F768B7CB2EAEE7E3448DD37 Key = 00000000000000000000000000000000 In = 00000000000000000000000000040000 Out = B8EE7182E563888E4F99335CF0372598 Key = 00000000000000000000000000000000 In = 00000000000000000000000000020000 Out = FCA9BAD58DD9C77B0BC0E616E7DE7F2D Key = 00000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 798DA99BEFFBF99B23A3C15A31F60CB1 Key = 00000000000000000000000000000000 In = 00000000000000000000000000008000 Out = 015CD86F000C87948BF3591C3DE4391F Key = 00000000000000000000000000000000 In = 00000000000000000000000000004000 Out = B40B9945EEF7BC52E0B244ED71FAD3D3 Key = 00000000000000000000000000000000 In = 00000000000000000000000000002000 Out = D9BBB27B7D8AB20241E60F04108F1E12 Key = 00000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 6EC3F259B3FA960505CDE9D20F9EB905 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000800 Out = 01C1772AD104A988B2978447B91199F0 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000400 Out = F8D5E997A8DD1B5BBE79C9F36B94C73C Key = 00000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 4040058B08B27B6A585F18BFDBAE3E29 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000100 Out = 55547D09ACAF0C915B24E15ABAB0C827 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000080 Out = FD7A0B33D397DA035D146DD56C869960 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 80C38900313E9350219EAE9AA7DA5E1B Key = 00000000000000000000000000000000 In = 00000000000000000000000000000020 Out = F50D8495C3DCBFF4DFED0736F92475BB Key = 00000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 58A06DC5AD2D7C0550771D6E9D59D58B Key = 00000000000000000000000000000000 In = 00000000000000000000000000000008 Out = EEE324733E6409500FC9F9D6DCA185E0 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000004 Out = F97C415886D05C12598F2C95F6B3EB16 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000002 Out = F0FC7D86D814589A09D8EC136F95A124 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000001 Out = CA737FF1FD0FE5B8E41E90358A5F2CB1 Key = 000000000000000000000000000000000000000000000000 In = 80000000000000000000000000000000 Out = 62EF193EDB7D399ACA50EC1CBE5398D8 Key = 000000000000000000000000000000000000000000000000 In = 40000000000000000000000000000000 Out = E7A58D547688BA8B69DA949E38AA6FAD Key = 000000000000000000000000000000000000000000000000 In = 20000000000000000000000000000000 Out = 71579F70A8EDB2BA5C00C513E2D7DEEB Key = 000000000000000000000000000000000000000000000000 In = 10000000000000000000000000000000 Out = C6171EF892F8224DC5FAE230AF629F52 Key = 000000000000000000000000000000000000000000000000 In = 08000000000000000000000000000000 Out = C6A61053C48D7ECD7DDD12DB0F316AD7 Key = 000000000000000000000000000000000000000000000000 In = 04000000000000000000000000000000 Out = EA5833714F1324DAB7F53CACC63F784F Key = 000000000000000000000000000000000000000000000000 In = 02000000000000000000000000000000 Out = 450BCB0C7351CB1CDAC5D02E80D13C64 Key = 000000000000000000000000000000000000000000000000 In = 01000000000000000000000000000000 Out = C267D3634F84215FB7B4635AFA385E52 Key = 000000000000000000000000000000000000000000000000 In = 00800000000000000000000000000000 Out = 6DB5B1B156DA1C36B9AB5AB59B063C29 Key = 000000000000000000000000000000000000000000000000 In = 00400000000000000000000000000000 Out = EDF2D9B19FF75561E8FA6F411C4A0431 Key = 000000000000000000000000000000000000000000000000 In = 00200000000000000000000000000000 Out = A11AE84E6D2C56DED2B9497FEC7504A7 Key = 000000000000000000000000000000000000000000000000 In = 00100000000000000000000000000000 Out = B3A1A1E271BF94DA3A5ECFF1D4293A56 Key = 000000000000000000000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 5577374ADCF2F58EEEFFC432C42AEB76 Key = 000000000000000000000000000000000000000000000000 In = 00040000000000000000000000000000 Out = CD9D355C3574343BC7FBE645CE7EA721 Key = 000000000000000000000000000000000000000000000000 In = 00020000000000000000000000000000 Out = 76EB4C046F052AE4ED41060BF60067FB Key = 000000000000000000000000000000000000000000000000 In = 00010000000000000000000000000000 Out = 1273A4BC420BCC9E29619567B1E61762 Key = 000000000000000000000000000000000000000000000000 In = 00008000000000000000000000000000 Out = 1F80E1CE3F12C96F2E647BACB6DA78D8 Key = 000000000000000000000000000000000000000000000000 In = 00004000000000000000000000000000 Out = 12D34A7875E716B37A7E250D37AFFDEA Key = 000000000000000000000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 5A54D764EEFFC4B64143A58B071514B4 Key = 000000000000000000000000000000000000000000000000 In = 00001000000000000000000000000000 Out = F4F1567BDC5B1F938D5A214419090FE0 Key = 000000000000000000000000000000000000000000000000 In = 00000800000000000000000000000000 Out = 6CB91B935A0FBF49636CDF64A12955B7 Key = 000000000000000000000000000000000000000000000000 In = 00000400000000000000000000000000 Out = C082154A07AF64FF6ECA811B0E3302E6 Key = 000000000000000000000000000000000000000000000000 In = 00000200000000000000000000000000 Out = 49A746CC225C1B6009A93649CDD9EDCD Key = 000000000000000000000000000000000000000000000000 In = 00000100000000000000000000000000 Out = 1CAD0512E3CC51210B411EE452DF62E4 Key = 000000000000000000000000000000000000000000000000 In = 00000080000000000000000000000000 Out = 4FE9A0CF34BBCFFF906D8450197CC9D1 Key = 000000000000000000000000000000000000000000000000 In = 00000040000000000000000000000000 Out = 38DB8EF6C8993F17BB4D1614B9DE15D4 Key = 000000000000000000000000000000000000000000000000 In = 00000020000000000000000000000000 Out = 08DB3F476F551D19D9643A9E139E0553 Key = 000000000000000000000000000000000000000000000000 In = 00000010000000000000000000000000 Out = F0F518F73795AB51BFB6E0AA99A0DAC7 Key = 000000000000000000000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 91544D597F679E7DFE6D16D475809851 Key = 000000000000000000000000000000000000000000000000 In = 00000004000000000000000000000000 Out = B1F92601B6D8C6B81176A46EE7341D28 Key = 000000000000000000000000000000000000000000000000 In = 00000002000000000000000000000000 Out = 796C3A8CBC6450E51FA6F8765ACD0F10 Key = 000000000000000000000000000000000000000000000000 In = 00000001000000000000000000000000 Out = 5F7BFE71BD2E81599DDA3411BC1CA579 Key = 000000000000000000000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 2DF7D576EC6296101CAB16012092C12C Key = 000000000000000000000000000000000000000000000000 In = 00000000400000000000000000000000 Out = 20769DE071FBE22AE49E7B3F5D646418 Key = 000000000000000000000000000000000000000000000000 In = 00000000200000000000000000000000 Out = B6F5C012E4BA15DC86536F328B137FC0 Key = 000000000000000000000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 1C3031DD05EAA4C278B55EF0E7E4C1F9 Key = 000000000000000000000000000000000000000000000000 In = 00000000080000000000000000000000 Out = 3D72A53BD537D04AC59E0AF36D105ED9 Key = 000000000000000000000000000000000000000000000000 In = 00000000040000000000000000000000 Out = A6FFE499A2050C38F4E89DBF12B27430 Key = 000000000000000000000000000000000000000000000000 In = 00000000020000000000000000000000 Out = BFBB2A537B2C1339D6230F35A256F289 Key = 000000000000000000000000000000000000000000000000 In = 00000000010000000000000000000000 Out = 70E79718C97DDB187411436AC072B148 Key = 000000000000000000000000000000000000000000000000 In = 00000000008000000000000000000000 Out = 13BB56699085842B81DBE8FAA8B26269 Key = 000000000000000000000000000000000000000000000000 In = 00000000004000000000000000000000 Out = 3E4DB71B9C737C7F8AEF632A5ADEF61D Key = 000000000000000000000000000000000000000000000000 In = 00000000002000000000000000000000 Out = D7A254B7341C7677C72F9DE729A3BB78 Key = 000000000000000000000000000000000000000000000000 In = 00000000001000000000000000000000 Out = 527D14E58B74224622DF7F3FD65932F5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000800000000000000000000 Out = 708703993AD1DDE5C7F8714686F3AF32 Key = 000000000000000000000000000000000000000000000000 In = 00000000000400000000000000000000 Out = C57D3ECB71A7DA4708DE6F338BC13E09 Key = 000000000000000000000000000000000000000000000000 In = 00000000000200000000000000000000 Out = B31FF60BE0FDC17001CAF87FC7FC0B2D Key = 000000000000000000000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 01877AC646A283472DA74182FDC1E2B5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000080000000000000000000 Out = 3C678BADA3FB1B872C018DC035AE16E8 Key = 000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = A2CB209DA6AA40E043E6FB9DD2476100 Key = 000000000000000000000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 4F9402FF56D04C8FB37DBE1A3109D2DE Key = 000000000000000000000000000000000000000000000000 In = 00000000000010000000000000000000 Out = 342DAAD90F0F1699048D5CD16FDA2EC7 Key = 000000000000000000000000000000000000000000000000 In = 00000000000008000000000000000000 Out = E68CC86CA4D952BC3890AEC0A7AAA4B5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000004000000000000000000 Out = 02A88364BF94A677124F670A566E3F0D Key = 000000000000000000000000000000000000000000000000 In = 00000000000002000000000000000000 Out = C961EF325E2A32A4359CC63BE1EE2C77 Key = 000000000000000000000000000000000000000000000000 In = 00000000000001000000000000000000 Out = 03BF43C9083E4D9919D12FE5C0315E67 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000800000000000000000 Out = B27063442470BE07DCC2256EC71A4F1A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000400000000000000000 Out = 222CC5A29084A4BDB05D4C2FD95648DF Key = 000000000000000000000000000000000000000000000000 In = 00000000000000200000000000000000 Out = E08686BFAA936E1890AEEC834E3B474A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 10DC4FFCAC5F5A1FB668277E8E75BEAB Key = 000000000000000000000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 03A9199978F9D652A4C528FF86C39CE9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000040000000000000000 Out = DDF718A1BEB37CC1B0905520DB7C1611 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000020000000000000000 Out = 2072191C277EE40FD557FF5F67A2A546 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 96B3608C06112F619B156105EB082BBE Key = 000000000000000000000000000000000000000000000000 In = 00000000000000008000000000000000 Out = B5D919DFD9828C4FF4427E72ABFC77B2 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000004000000000000000 Out = 9570E7A96D4674C800AF8DCD01DEFF64 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 59723DB66EDB29A9C81175668903777F Key = 000000000000000000000000000000000000000000000000 In = 00000000000000001000000000000000 Out = 1779BDFAC6DB722BCAF4D3A8D9D2E725 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000800000000000000 Out = 5107B50A150998C6EA01C14697FC0E53 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000400000000000000 Out = 36A6CAA08BD5D2B332E9323F7C2E76CA Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000200000000000000 Out = D1CF37451667EDB8D2E9934D39A27A92 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 4E96227B0A018755FBE8AD5BF0E421B0 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000080000000000000 Out = 3221B3D3A24745B483BBF99509B330A0 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000040000000000000 Out = 98A4AB39B84D21D36A5DDC2660BD68C5 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000020000000000000 Out = E5C351E1783465EDBA5CE0592BC77E8E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000010000000000000 Out = 35489488EE33D0344C1BDB6263D28286 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000008000000000000 Out = 97EA899F53C60536DAFEB18123FD6C5B Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000004000000000000 Out = 8511B11C7D2D8FBF63702A7E3AACA08A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000002000000000000 Out = FE0C90596E4F47FD8A9927D83F4DCA52 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000001000000000000 Out = 186FE000683CC19F621BC6C2DA300B71 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000800000000000 Out = 8291F94EDF578E8A70CD0CF8F3FB3558 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000400000000000 Out = 2891C81846949C917E757EBAE20D34EE Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000200000000000 Out = 762D85A32DAF0C9F3CFB3388E808FEC2 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000100000000000 Out = CC6807D209B728C559C32336FD8FB71D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000080000000000 Out = FCD07057EF4820154075A0DDCBFC0BBD Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000040000000000 Out = FDBFE2C3FFC82792D338388A1FC6D22E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000020000000000 Out = 04D5F7CD68FC2352BDDBC82CFE35DA80 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000010000000000 Out = B1784A7BF395FB525471EE3DC8972FED Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000008000000000 Out = CB5D8A62D16220123EF0005876E35B19 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 311292EDE1F30E9F22F1EEF8FD19BD80 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 382BC583EC9B6E16E3DF2188CF0BF1E8 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 632C9AD674BD1B8A15827A789BD133A7 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000800000000 Out = 0EE175DF45B889CED6974E9C2B8F8A78 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000400000000 Out = 6131A1A18F00CFDA5B4AF4FBE5487445 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 0C8746747460A540E2304B55C12EA672 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000100000000 Out = DD6D4D2AA3EB702C597E4E2DE59BF4C9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 774EDF219459A4744AA1CCDE7D969A60 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000040000000 Out = 1D7B340C4CE68AC97369FFF0FF9980C8 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000020000000 Out = D18104617258AB02AAE02ECCF552A891 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000010000000 Out = 8DC66F1D7648EB62F1DCBEB3CD237985 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000008000000 Out = ABF090054ABE052ECE0B07BE6B6CC6DB Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000004000000 Out = 89239AAFE9BA86E5EC794397E0180111 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000002000000 Out = 6E1CDC049333211B4D7533E21504D200 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000001000000 Out = EFE662AF24D9997FAE45CAD4F92F3091 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000800000 Out = 16F53F3A6CC3B4F86DDA1B8792244901 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000400000 Out = 047CBACDC5EA84771A61FE1204813D46 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000200000 Out = B442FF3318822EA7F60E2A8A082A043A Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 971D07AEEDBCA5B7BDCD033F708C97DB Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000080000 Out = D307263273E250C0B9E08FF23003B0D1 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 75F7005CA9C6EE5A1F9A4897FA67C661 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 9B421C68873D49F07E3B9025AD609787 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 5B182593B47DC674D8B1942CB97224B2 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000008000 Out = A896871A3157CCD1F5A788E253A6B0FD Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000004000 Out = 789A3D2B2A70181EFCCE5529F200DC44 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 7F9462D23DB6E99AD0A54EA84DBD94E2 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 23EAFE1F7CCE96B6BFE2484E1DFC4AB9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000800 Out = A76C323805F9C252C8B86C83294B9987 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000400 Out = D8CA1075B7A3F2CF2DAC0980B1B66CC1 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 8206D89F2A07BA6403647FB85A2F4D7D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000100 Out = 3DE7573CD46D85488364472B038869F9 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000080 Out = 31C62401D6E9E4995C0913747BFE7C7E Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040 Out = C464728025916B4E8D56E4A9F98C1A25 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000020 Out = 0D4643EE09ABD6D6062187789AE9A77D Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000010 Out = 0C06EAC3043ABE6554C2DA42F21E7B05 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000008 Out = E26C6B2CBE2130729A5BF96E7CD29912 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000004 Out = 4DE2B8FFF3588A5D4E62CADB720E5BCC Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000002 Out = B96DD46C6A286BFF721693A98491F529 Key = 000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 64F1DBD3C79EE69AC9E0ED5F554F4AB6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 8000000000000000000000000000000040000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000008000000000000000000000000000000 Out = 23A385F617F313DAC05BCB7EABD6180735BE2B4738602A1DA3DE5C9E7E87192303E8BB7A568E95BA792DCE77D5523C2BD3ACBE92C482D2E806FD837E41DBB288DC3B1C37C69B4059EAADF03FCD016EB4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 04000000000000000000000000000000 Out = 3C9D9BD904E0E6916089A4BAC35E5368 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 02000000000000000000000000000000 Out = C47DA045701B93A388E76FCBCD349F22 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 01000000000000000000000000000000 Out = 52F264B196925A345CA5ADC57C234B96 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00800000000000000000000000000000 Out = C923754C5AD2E3F842D01705A716BE8A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00400000000000000000000000000000 Out = 630075C7563CDBACDFEADB781CC9467C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00200000000000000000000000000000 Out = CB4F69BCC76A2499C6FCFBBE4CEB8CFB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00100000000000000000000000000000 Out = 0442F15EA2BD6D9EB773F9B99804DF56 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00080000000000000000000000000000 Out = 9CE6896C15C3CC00E2AA1944D7117B98 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00040000000000000000000000000000 Out = E934066740023616B349F45582442647 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00020000000000000000000000000000 Out = D08EF37A59D94ED645B1D1B160E3E816 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00010000000000000000000000000000 Out = E91891CAC17FE493C7167C6CB59DCB69 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00008000000000000000000000000000 Out = B27A42D2C870DC96BC6C551218C44CC4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00004000000000000000000000000000 Out = CE8D23E64E6BC18208CEEB282E387326 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00002000000000000000000000000000 Out = 36F76678A27F2F5A436073D5ADA4AB3B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00001000000000000000000000000000 Out = D0EAA36F9A648905B277F0BD24B1A339 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000800000000000000000000000000 Out = 82BE0E3673E7872BF79BBE2A45F4BD93 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000400000000000000000000000000 Out = 013CAE3986083F8D321273D68CA9784D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000200000000000000000000000000 Out = 0A7FCF71DAC023718153FFB761BAEBEF Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000100000000000000000000000000 Out = C784C5EA8CE3897F153336047D2FE3E0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000080000000000000000000000000 Out = FE776B4476A4F029E5EA9293E3C1BCA1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000040000000000000000000000000 Out = 302A5F9A73B07D83699EB9DE1D86DB7B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000020000000000000000000000000 Out = E6C43F6F62F1EEE0BDB3484F325053B6 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000010000000000000000000000000 Out = C5579556F710EACFAD9319AA85B89F6F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000008000000000000000000000000 Out = 96C88E46C1C2BA0B583F30FE0248A794 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000004000000000000000000000000 Out = 287D27FB1CA40821294B1AFC868F3A6F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000002000000000000000000000000 Out = F4602DF76A24010DE5A1353043CF178E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000001000000000000000000000000 Out = 47F98AA9DF5E7314D3D5571EF6B95284 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000800000000000000000000000 Out = 77CBF7DCA60F913FD9C82AC65212EBB2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000400000000000000000000000 Out = BEB1C2BC4B5C363FCF5A0466883079A9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000200000000000000000000000 Out = 2AB8B9254ADBDCE17F0A719815DEFF7E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000100000000000000000000000 Out = 75A30CEAA03AF66E44A85DC66DEB20C9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000080000000000000000000000 Out = C37E64CE86B615573C4C42BBE71DACD8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000040000000000000000000000 Out = 284CB50259A96CCED1C1C64D8B603024 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000020000000000000000000000 Out = BE346B07869425CBCA54F93D7A1F4035 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000010000000000000000000000 Out = 60EE2023B03033A972E28E4A21C7005F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000008000000000000000000000 Out = 4E1FD4BC99AEA3BCC6B9066EC6329D43 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000004000000000000000000000 Out = 079BDF2DAD2CE6FB7D21BBD76A7ABF48 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000002000000000000000000000 Out = 6B933D9914169C2A704E52EC6D7E4E1D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000001000000000000000000000 Out = FD854A50372E5D301367D8E98CC88028 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000800000000000000000000 Out = 8CE94A2C43B01825CE5F271135481BB2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000400000000000000000000 Out = 73A43C713898BA7D7D2B6BC8673A7AAA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000200000000000000000000 Out = 13873CFBDED482C0B7B435025A9F1CF4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000100000000000000000000 Out = 3F168CD782896F22C56A92A09EA7E162 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000080000000000000000000 Out = BCDF1C8686E68810FE90B16ECAB46147 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000040000000000000000000 Out = 95C18EBA59E3CB6359DE7CCE9E8751F9 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000020000000000000000000 Out = 03CFEA7D36D56552CDEF806215EA7596 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000010000000000000000000 Out = CC189A2E8F529EB139DCA2033109F40B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000008000000000000000000 Out = 453912532144CED54B7D4049BC8B8CF2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000004000000000000000000 Out = C6DBBF405A056A80CA788267538FE8F0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000002000000000000000000 Out = 2EB5E272874CE244A328BA6410480B4C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000001000000000000000000 Out = 263BFB611CBD9D9C7FF6B1A9E3276696 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000800000000000000000 Out = 9CC3EB61A9907F5F22251239A9EB38ED Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000400000000000000000 Out = 726A3EE922EDFE52206C2191E1F045F4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000200000000000000000 Out = 1344C1E04A9D97668A240D82396AC021 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000100000000000000000 Out = 9067BAA44C264E9A2AEC292390A6F492 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000080000000000000000 Out = 1176621BD24D35670B08D6A065806B02 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000040000000000000000 Out = DF0D31D14D81FD086E8E32479919FDBC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000020000000000000000 Out = 44BAD80B0BA01E971ADC4139D6DE0C36 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000010000000000000000 Out = 76C59131EFFAE14058D99E22698B602D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000008000000000000000 Out = 7604D9F3110F8440917ABCEA49710ADA Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000004000000000000000 Out = 4584FCBB487171176C4318082EFEFDF7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000002000000000000000 Out = 019D3B42FA31A9F9175759E6C3193A07 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000001000000000000000 Out = C324FF5F71A974F13F5D83226441E3BD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000800000000000000 Out = D9DF41408DFF80DE7C9571706B39038F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000400000000000000 Out = FBB99A524AC23D74047D814EC0AEDBE2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000200000000000000 Out = 877C855E25345F6C7DB4237ECF64C874 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000100000000000000 Out = 206500F822C1305F9D61F49FC57AFBF2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000080000000000000 Out = C7538D97A78844C3C00740865E26755B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000040000000000000 Out = FADBC4A6E4564041ADA094C603CABAA4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000020000000000000 Out = 04C482E0707DE6DC1917727D00C4FA6B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000010000000000000 Out = EE36B8996AFF98BEA6E2115B9D173321 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000008000000000000 Out = DBA4A5F38B104985D796ECDDD812B605 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000004000000000000 Out = 1DC0F910CD5AF1E5734169459E170192 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000002000000000000 Out = C3B7D6914052503D377B01DB4E3A630D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000001000000000000 Out = 54D807506602ECF7D6B8C4D923317738 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000800000000000 Out = ACE4949143D4D1441AA854331E7F511B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000400000000000 Out = F7BA140AED4756B26789498A17EBF62D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000200000000000 Out = F23E08B81ACB75FE2326A94ECC5968AC Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000100000000000 Out = 4CF26F088604368B17DDC09FF9D0146D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000080000000000 Out = E93AEB7AD76A6AD0AF4092F363421F1B Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000040000000000 Out = 3D234C0F78ECBEFCCDCE1EA6EC98C145 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000020000000000 Out = BA300B0234F0C96125D33123CDD7D6A4 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000010000000000 Out = 1CF1A160FAD7E744F08BA1454A999211 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000008000000000 Out = 59A9E8C14ACBCEC235529425CF86998E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000004000000000 Out = 22D29CFEF3A6DC0EC67A9EA8523D6158 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000002000000000 Out = 513971F979FC906FADD982D7F08E4F05 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000001000000000 Out = 6A95C07D7FACF2CD36DF362116A2DD5F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000800000000 Out = CD62AD57393A38607436FAF0985C2D50 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000400000000 Out = 5209ADE137B93BA0963528E3E1A40F2A Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000200000000 Out = 545BDE9D1C11239ED70D93060F24E397 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000100000000 Out = 720622F5194578B3C24B5DDDC7E30327 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000080000000 Out = 9E12338BF484106249754EAA6C441192 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000040000000 Out = F13303DC759CA65097EC87F8D854163C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000020000000 Out = 4A2A6EB6845723C1C790D693B596CDE3 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000010000000 Out = EF3D7C67417CA1FEEF03EF71441BDDFE Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000008000000 Out = 214FB38A7511A87CF160F59CCA2B8E33 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000004000000 Out = DCFFDB5E44574D0D593A70ADA4C79474 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000002000000 Out = AC9D55D4A4FBB80C9B79C9077BA381B1 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000001000000 Out = 05C6D61B75312924E0BCEDCB4B8D55DD Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000800000 Out = E650CB445AF48A77E8DB6E2EFBCE6FA7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000400000 Out = 4C9902E89253D7A172BABFA87DB94816 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000200000 Out = 5AF4F5E8491EE7F87EB809D82AEC12DB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000100000 Out = 1C11730D62BCA6F847B1457B5287BD12 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000080000 Out = BEF65A32FF7383CFDB5A90C2F3B93837 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000040000 Out = 2F3AA68FFE3B99DC92621782F3F9ED67 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000020000 Out = 18BD598BFA2C77E21DBD594EE0E5CDCB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000010000 Out = 248CF533016A6AB1F84F85B2C5CD41A7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000008000 Out = A3B12F578353514CCC500ADD6C495A6C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000004000 Out = EE2DC099B37D200B4D3930A6DE07208E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000002000 Out = 412C9F198D58A0F01F66DF07CF211636 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000001000 Out = 5B3532BA46716B02E761339DBAFBAAB0 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000800 Out = 0148187CA72EC46B522E4FE7E1261522 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000400 Out = 84C529CC4E23683AB90A24A6690662ED Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000200 Out = 0D1EF0481593A3D95F0361C776D9A4D2 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000100 Out = D622171C73726DB6620FFDA6540D510E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000080 Out = F218D92AED363C6829F7FA3BA346E0FB Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000040 Out = 40CD83A5F0BFD0E1D7FE14299CECFB7C Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000020 Out = 512F022157AEF0015E93F3737911A35E Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000010 Out = C7A5A88356152E95F36739AB5EF9F63F Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000008 Out = 8FD0F15E2504A8F4FD751CA7799FFB1D Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000004 Out = 0137C87257A8CBD18C218A867B3AB5F8 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000002 Out = 3DB0F1674F187DF1CB036DB33A05A0D7 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000001 Out = 23D1247EFF4CA8CBB378DF118369821E botan-2.4.0/src/tests/data/block/xtea.vec000066400000000000000000000525721322470703100202260ustar00rootroot00000000000000[XTEA] Key = 00112233445566778899AABBCCDDEEFF In = FEFEFEFEFEFEFEFE Out = 36552E889D6A41CF Key = 00112233445566778899AABBCCDDEEFF In = 0123456789ABCDEF Out = B8BF2821622B5B30 Key = 00112233445566778899AABBCCDDEEFF In = FEFEFEFEFEFEFEFE0123456789ABCDEFFEFEFEFEFEFEFEFE0123456789ABCDEFFEFEFEFEFEFEFEFE0123456789ABCDEFFEFEFEFEFEFEFEFE0123456789ABCDEF Out = 36552E889D6A41CFB8BF2821622B5B3036552E889D6A41CFB8BF2821622B5B3036552E889D6A41CFB8BF2821622B5B3036552E889D6A41CFB8BF2821622B5B30 Key = D94576CD1A5F99E4155DC7BEC5D33DF2 In = D51399607F7AA9D7 Out = 782E4E131C5BA746 Key = 07EF12BC9D06D7DA20131116B665E335 In = 10B233473624CCD3 Out = 57733A1DEECE283E Key = C6462B48AFD604B75FCC455506FFD411 In = 3B905E951E4FAFE7 Out = 776F4965DEB65775 Key = BE195F703D6FEC2232CD0890C981B27D In = 15B623D1FA2DF9DF Out = 3BD5AD5C9ED6101E Key = 5B8410F7A9EB92DA120810C56FCAF8C9 In = 7C1035940696D91D Out = 5F93FA1D06991415 Key = B85C9E26661889D0FF1054C6BE27FDEB In = 90B245144895F3AD Out = 6105BFB0947828B7 Key = A8A1E956D54D238F6CEAB186E7EC99ED In = 4EF2CFD120B8D4DC Out = 51FAE58A10F7C3DD Key = 8BC4879201A96368927ECCEEE67024EE In = F6CB5353F4A1C432 Out = 550AD71BA8A34568 Key = F1372D85D8C3D1A60DF57EEDF317AB81 In = 215C080CF158A09B Out = 13D1E24BA9FF7B63 Key = 017F01683F5E009D196FEEAAD385C5A9 In = 568583061DA98D0D Out = 6439B1DFE2ECB541 Key = 281C932DDD3C364B09F1896007FFAB03 In = 0558B306316B0823 Out = C8F82FE4491A8917 Key = C1E95465C7EF8EB04254D1A5463C6A43 In = FDCB2764303222C7 Out = 244DBFA1D2C914E4 Key = 0F86DD6C96DD31164B656B0F25E4B411 In = EADDBA89070EC46C Out = 5A4909646763454F Key = FBACFB479AE21194C35B8184E58DD66E In = C6507BCF99B9C2A1 Out = 6F08EC714E8A7C18 Key = 2EB36C4A9598D471700A1330070FFFC9 In = C380B0F1C21D4D37 Out = 72D4D4BDF5C00585 Key = 0A7F48127091780617A1F534B3271BC9 In = E5B7C1517F24F298 Out = 64374B40BB732354 Key = 303FB24822A1B8A84D0ECE77B86380FF In = D14DDF77FDDA17BF Out = 014F1E707D02C8D8 Key = F04EBF798C193F199C1F532AF383555B In = B9682750BB15CAAD Out = 9001D21B57AB5360 Key = 200C0CE59717D5D9AF6813CD207FEE73 In = 9706769A18A2D03D Out = 835FD788C089FD45 Key = 2828D51F98AE0B33F4DE2B7FBD18A529 In = EDB76C54847DA59E Out = B0C0125494D39CE9 Key = 61AABA6BE48B0D0D14FE5D27FAB852A4 In = 178A49BAFBA53F23 Out = ADE26742F25EFBE1 Key = 2080E2409BA01C8532FC84403EE8C06A In = DF4CDB61A5F38536 Out = 9C895E72168B409E Key = 271AD15192C4D1204A4A2561E3DB6FF7 In = 7C944D08DEF34C0C Out = B784E23E00B3B498 Key = C1E297C0C761777D8A76FFF02D22B859 In = F4C76C1D47FE568F Out = 62F9E58B0364B0B6 Key = 23C807A2EF0A551F858FD52D125A47D8 In = CAB16583E15D0074 Out = 4563BE765E74653A Key = 9FA5D4D8CBDFCECD559E3CE88BF78EE1 In = 97B05C60774164AD Out = 714807767366854B Key = 24F4E91083139099D663647A7FFAC321 In = 7017A263985B735C Out = CC68E1ED7F7C7832 Key = 7CF8626DE76D8462218ED5C9DC8ACC26 In = 15475A90DF04CD29 Out = 416EAB1EBC155782 Key = 3C6AD7DF17332A3E1E3DE06007387357 In = 87CA0AACCF146CC8 Out = DED575554058EF42 Key = 24237A762D8A89383A2949F5A0F5EC08 In = 9268AF048ECBAE67 Out = 899B9B877106C764 Key = 209A2833A39472D9720380FFB2F74761 In = AF0062CD77A84EBD Out = 26DB40C151B74530 Key = 22EBE7A30E8855B3B453A6E926D4F187 In = F922CA875B991A31 Out = 2763F255636A34C1 Key = 1B5E23EBD915C1FEE59F57DD91AF7347 In = B4ECC305C3DBD8E5 Out = FBBEC8F5DBF4CEFD Key = A6BFB85FA91B8CA4197C8B502A62F972 In = 3DAADD7A9633E19B Out = 4DE5C07EA1564A64 Key = DD0C8719A8DA117DD9D1DAA189E65654 In = E197D59E064818B7C8AD72C29E227E09 Out = 04CD161E422154E5BCA5249582B9D4C0 Key = D8C8ACF6B4B68A837639320798994979 In = AE53AA320088B4042EAAEE3649FE6E36445696F01CA40D3C Out = A3B303C42178F97F719449529D51511491B41EB70E6101C6 Key = 24059EA6D8A9F0CA678ED6680362596F In = 655A6B1D6970ABA078819E5AE1D08471A0E01E0A5C64E612504F4BD9BE4A8AE8 Out = 7DB966E1A2B7C0E8EAA9D308EF89652A5857461D100DD0CEF9C6FE7BB4DFE33A Key = 2434D48F17E0A7D91F255FCE60F3D6EA In = F3B1BB81C053DB02A8515885CA6DF124AB04927D2AAF6F0032BF17B4B437E1F2C7D82F89BAD898DF Out = 215D5ABF53C4AA0D7571A0D9D05C3B6D33D65BF35EFFA4778FF59DEE90900ACDD4FC6645368A294F Key = 18C1E1EB3925EEC61559DB74EC99491B In = 06F0A1AD9F9EAA665044D0A2EFA10ABC30F7FBA3FC47C6AE1947B7E9B47733547E5C843DAC59D09393835061D834971E Out = 066309B116A6692F279F2526FD284E75479BF7FB5F63096AD7108CFB0DB39062A2627594F098F0BF5A3B4C67CF29E993 Key = 5258617DB39A2968B1EB02565A2BDD1D In = 2FA1106E95056E070352666F059A72DF6CC949BB3161D5FFD8FE46451444D096BBD606B0BD443189AF001E5BBBA134DB1FEA7AE9B4587438 Out = 1DF05B34A733F83B7DA1F194507904CDA99C374174AAB472CC598E06960263BD9DD0EFA2F4C14CC8AF4039A55EC00125766D25FBB7139081 Key = C4A02982C1291093144C64DA1E7E3D67 In = E6ABE28FD1E9392CFC65978D586D31D344140673E345D6AA06C75E1C03E4E314831EB94ABCAF6B23F2C34670A79500C6142EE722FD7E408D751DCB30E5C63F5D Out = 3EC6FE802F4EAA740DDF34EB79798F458049FE09190D12455EDD6129BAE85D22FF4E96AEB59DB9413DC24D41730454F65C443C819265B4CDBFB87F5ADDE7F4EA Key = 58B61987700468A366178595E20A365A In = 213595590E62A55F241E3D4CFCA65C1BA23BF801ED05D25A8FD0A06A9846BE3C28B9BA45A2B32BE80ED468E007EB6EFF0EECDA4460A700977B84464631B642135BAB8519248CA0E0 Out = 5A6D52C19193A6C002D58C15BD2490CAA36550B684A726C33F1A12DFA2D4764FB75EA336823833637765F37547103691B852FAB81BBD74EF6C20BB885AC42946998E74D2B8C2BB75 Key = 75E691CF7E511D4B1A114C0E80BC7C7E In = 7DE080A1683521CEAF78AB4C3160D326A07FF4C6F446A94FEADFC0BC8464EB781D743694734C5938F7D2DE4822EFFF34A82EF0C2E11F92CF1E0B2989786FA990DA3AAEC7FC647675024BDB47F20C67A7 Out = 1A5002651E1686F56A6BFDD8DC40DA9DCAE7E4773237720BAC8962DC2FEBCAAD885C4A62F13476B303B2700150F5CBA1CA976A753E6971095F175E8BA2D97E1F1C18FEBB0F8658DCE957E65DA18D38D8 Key = 5161285DC54A3D9ECB691C0CDF987D33 In = 739D59F39F57C04D1450926AD161AE7CF1522C4929CB299C2EE03842E3DA7AFD54AF4DEF19867E278678222C85D8901526E62A008D449478FE4249173B6E80980B9F91D09F7F5CA8A174EC73A57AA878E74F0315B6F3E15C Out = 59E210F2DF601ECB05F4FBAED1077A9AE1B783526DABCB881881BCD103658E03FD6C1D122508DD039470226BA0AA50AA087D40732D77D137DD2CC96824E24C44BA8955D250297C02E3D444F4F1E78F5A02C50C7314CE356C Key = 19B8DF4B8C9BEBE46AE4F71FDB4EF5D4 In = 3A483364A30C28F9B932A11152D741304802030C60453D1E9433823A21F033DF5A6FB43FE9CCB423946DD363F9EEA9F0E60898652E8E4C4B6AB6410B468861CDCE22B3043BBF72520232EB34D1685274A3FDCBFD9753DAD0AE467CF7EE661145 Out = 11AB2B4CC8CC30311EE2B979C6AF90C5EDF073CA2E483C2F0207E8E95AACC55F0120C9B0DC689A2B645EA1560FEBF3D027F0F24E551205091D04A72657209E814A9DAF3457ED96539FC1CC8937D76E2EB4854313E2C067F86EF889757E014B35 Key = 3D29E84526A1D60D177C03632DBF1E96 In = A9E72827F67035507B5F0747149A73AC2763000470087FD6F8F165FCB872AE7BA58CF568E1D70D28891881F0464207E5FF67CD2A707B71286DA7635085B3B68F9228A646A186C8D09D3E31B56562ACABD0D5AA32F608C54086642AEBB72767643C90B7DC02FF772F Out = 5AC440B8C9AF2D5843B125711F519D34DACF4D86CDBC856933C96D5B3CEA980E9DEC2F0E2BF6E8EEF38214D59B5562324C009953DCCC4ED2D6C6B55211AC5E0EDC7C8AD3F8760823D55365D84525E09DD3145DB6D700D9BAA4A92F38EAAD8CE33000A0ED72A1FEAF Key = 10E1FEA37BE818FD0CC1421E16A3151F In = D24A21AB1ECBCF2EF83A1FCBC1032EED930FE269AFF8EDCFEE26FB1A2DA9D063EAE522E841024B7FDEDCDD6BAA1126834C996B9FD09654901FA8830C64AB1F5CA3BE896D5E60BE29D08C9E0A4F07956551E618F1FBF46DC8255A4E2F4DC8DE5729CCBB39FAECEA0A4C45F53FCF5C3973 Out = 2A2A34F1EB3F99FAFADAE4A68CC85799D9EB7B1F0277E71D56FBC395E3A93980B670D36B87153B90B8154EA962C39A049088665EBFE6D43A5E9A04A93F4D683DD509E27BD3AC659E5AEEE8B62EC3037C425EFEC0E726E8E572017940725A794E58817914308832AB59644B03D1155D33 Key = 80477A99D76ADDF3DEBEF9E8FF185DFD In = 9CF0C3E72880B2C3FEB787D84866DB80D4B4EFA60E3708CE6FAF0ECC29EDED0C8D9EB26957F1DF63FD39EB11158DD089B9622D161AA83E0BB921067F77D6F4479B17FB9C9F30C4F56A86EEF38733C8D557053BD4978E41B965CF1F2025402836AC90935E9564BF23F5FC76F29DDBA491446695A82D54514C Out = 3A8E38AC17AD900742F711491153A7FB93C04F981CF75FB34FC9B28A2C24A81C60AC4585DFE04FC026B6731A8C2404E65DE9FDAFDD32685A3863EC4CC77490F8E0D3ED234152FAEF3C8E1BCE7E4BAFD1171141D5ACE23BB3E5EAB0F20D000371DEF9E831BF716B6AC5EC2313F013766071F3AAD4492FD780 Key = 978393BF38701AE612953AE4C060B632 In = C1BB0B801F25223FCDF8CF13251877AA8472CA6924C0F51F1C968E981CFEF665F99EC57E4C33C3B083D7DC62DC0096B062CBB6DDF4D39DC28843A74E81A5F9558FD9F5F74D3857BF01A341BA443A2440C85CF069A757AA0E1ADD2B67860F3BEA805EAE1316BFD5638C312E96614607B5BD816B55FA16C301B71212B5B1203F2B Out = D481D95387B075DDB6771A669D3E11AC591A629B53405802F016E710D5E919E195A4553CF83337ABBBD506131F363D2BB5A8D3B542AE8A99B4D4641C373BABFE737C14AC6612FE466D2A83C867F42D4004685B230D3FC1C23D3410D767353A5C523B0B36E0D35D9B3D9605AE9C8402D0F7679A3573F3354E6BE0F2D173355B6B Key = 9A4972A00B5C1B22AA07DA8C1C8B8FF9 In = 0C0627A330788002C9DCDFBBF23F46ECFF4CF793D93D934CC553A64ABAD1DEA3710F775C71D54412BB3B6361B54C5E2DE7244CED9B546D146F20D8730FDD8AA155EAFFBEF34C70BE1F6199F67D88186ED039E00BB88B7DD13F071AA4C309CF92C10DE3882674B5C5C5EDB457F826C2D62724E1AD328CC09FB4113E083E4C4D31717FFA66914890CC Out = 5AAE35C53504B9DB9CBD7C00B01AF71772BE3E911DC6EBE45C1EBD331DD81CAAE710F9637B2B22C12BD16B0D84F0B41A59BF169938475F56B57347362C7E6EF4F9ABAEC9F44C3BF11BC2D02DD0DB00A8DB780A1D1B399C11485EAAE96E1AF12EDF48B4CF6FCCD343F16CD0565E843EB4FE1DFFC1EE2FA8E0F73839D6F6E131442154A4972F552DC4 Key = 8EBCF7F6F9025BD94D2985A4D3982A84 In = F2DF92A7AF36169DF9F2CE6DAAB0788284FEFC9D1C43619FAE6CB75576EE173DA697A01D96835B357C89B737794D0E5B2C7F02F8E5DB968E2D000AFCFDF9B17BFC8383832A2CA177CBE99385C9314F94977350C2D4B4AC6D37E0EC8F36E666C54011B2ABAD25CA922946A7B0C9FB5AAF54D618BBFE59C1751404200BA90051B5E54F64C7045B72B01681FCC6E7763F8B Out = F090795579AE3AFE49B96ECD3A8C01D449DA8AD81AEABAC135EB9CBB904647D5B1522B208F325C0597A2294CC1A10164551549B69E96F5AE72DDE9A4656AA533FBD7E98A6E66BE29663176D5621CD21F29494D1CF6D784432B1524BA56BC3E67E9FB4378190268B4DE6BA74B8B2B0E1EA52B75C45FCEA715B8A00B7D2456BCE2B45B192EDC10FE777FE53260F8E25397 Key = C2A7EAFAE3BAD26025FBC1EC1F3B1342 In = EE4C225C44528549B4F609723FB33467DBF135FAAB3F6C82DD9E3383714F39EBB31FA595850389D1BB1C1E9DDC3D1E0439F21B819B3D294B15EF81EA1E95C36E75D20B4C0D7C3765E97E9A2B9E03B5F5D5705DBB35C241779E232B0781EF9A3F371D89E451DC68F6F7E0AC8AEB7F8E41DEE6A0A86ED9195CCF12BDBD820243865FDD31B8D0F33418023E2089BF65A5C9D20E03DD7D4C8287 Out = 355BDD01480727A7496347973315434AFD0D75AC1AAF3869A461F78EF5E5923A7C4F749F7929C497CDCA398F4CA868A860E0296A952BC115C07B38D5460753D134E8111C0C108136154EBC7A386921F754D1F116F474C4B7DC8B5515ECA301E30D1D4661FF2814621C0CE1CE812B317C94EE900FD23FC2D941504B345B5BCB4DF7CC3A01BD3D759E4A7C4C4FA893B6B230D21FEFFB69C0E4 Key = 86014B66CAE76E61371F64A580B3A3F7 In = FC2B09E77FD6C0DFAFA0EBA6AA058D2357A620E4EFE70E52E8136B5294EBCF97E3DB642E3062EDA1DD93DAF24E97FB14F41C53D38729105BB46DB59507B6152CBF7747537F9FC8A8CDAB5028AEBB26FA8B5E020D7E1D110C159425ADA07B6E2526106DB5C1B4E2F62B5FFDD398EF3581EEA831FC686389C19E679B394A79D24AA34403BAB37A8B313F82878605E027EED34926D390BCFBB1E786153B0379C382 Out = F330598D81495B8AEFCBEF71B791A872B394E7A472E4E9E4D4C4DAABF7C2EDA0AF52CC162FF5001DF22EB012792A509C25566AD0BEBA50529F015CF3C4E6139C80373604EABA6F7593AF87B31E300A3A2C5B9DC10EB36DE921BDF7E5569BFE8A4155F6F5F272846194E0178B228E15DF6787AD158F0907205FA941D76BA4A4F2C121652806B463CC1DB8BDDE50776BBF19577A25A66B4DC3230870963E53A137 Key = 372ADAC63D66E934514CB2E26B388F25 In = 2642676CAE2461ADAADCE76CB12F9BE1A85DA497B5B6FA3FFFDA136E5ED6E53ABE52AA961D3D12EDA92644D9CCF6EE1C0023744BE75786CE57FCA3102D0E4AEFB3F6CF7E0FC1C74D37DDC4CBF3CD59560DE06209006A55E8C463156B8F1D81C7C9FDC270A39FDBD67F53A19673514569BD75BD747076C2CDBCF51C98995EDFE830CA8372279EA41819DC68ECA82B247653BA8EB10A8F909A762B74D9D46D7BB3E29C725C74504D0D Out = 20401A5F52C04821DB0609B9113ECE78977DB9A614CAEF283062D84985985C50090D64F5BE66BB90E68D75801900FEBFFEA8BD5790337BB0ED215011E541AE1285FB3B305E05F4A24E2CD6D3A62EE76CA4DDDD2E371A67E36DEA94EA5C26CA1D1B322F249DAD9C5DE435D7704B4F29A7D960EB9582316EC193C97BB5B64BBB2ADE27F250C2BFBDD48D660825EBE99E75C0E4354E0E5B84338E6361A5C9C368F095D3630C3E9878AD Key = B4BB2D7C1DCCF12BF555DFBFF33BFA09 In = 26BA6EF5054908E2CE4618CFABAF79F8D87DA4605B7F33EFA1C6AA0F039E138CCA821C75F0B2D17E52932B25CDCDE78DA2BC77432786E865CB153E0A0C637E9691D08679075095EA47DC18F40435B2DDD071D066F3B2B792FA528C0A64725F2B07981A2FD91F658C49B75317FB963B2BB68430EC9FAAE98963A8EA85F62AD4F77E115D3FD979DB421A773F2454E6AF49BD950550B126921E2FA581EEDB2387EA285D652DA362BBABE6F7D8454074B6C9 Out = 9CD37096F29ED2C56C7D2842883A79D712F6AB9F5F08AED655CFECAA2F482FF470D74597188C280E8FAA0B19B51B56A4A8B2B8E3ACE48927A61787341F5DC153621C14110710895E4AD3886ACE7599919C985C70A8B9A7891FA43D1CDDB30726A2D5027D77386E5E8B80BD7CBCBAA250269C250A8F2276E052A88997182528B947751DECC3E8555A8D4C6D6C223F7B6D431AE2C7931DB88200DA4D987FA0ADDF0C0C8997B7224E06F9701BFAAB2E99CB Key = FB8C5F864EAD033E0F3D427E76B5C9F5 In = C1EFE0B080811DBEAB17EB4C00E62F695BA71BB8E27006187F6F224F29D83820BEF01EF26D3CD5FF85CD5B005FF0DE9A8795B20F31E4D98A3BAE15B7BFB60FB8642D77C12E488652A26B5E32116AA0F7177D1E3F46C31DFDF212683B08E84C0EE72A15466974FC5024F3A0FA2061F53AAA86B3A29114D165C150D6FBBF0F07645C91CB5C9EFBCB292ACCF7159203BF83A28FD040E92711854CDB4679A6D885FBADD29438BA11E9ECBA68F8BCD4433F7DCC6C263E41C3E64D Out = 781D45863F3047C63BDB423712F166E4E5D018A6CD05B70E1131622E93BD6E0CB56735B5335001B9B971A671475DF0EDBEC0FAB32DDFD422504A941860C223D86B77EE2A4F7CBC4434738CF7F59059EFC0CFE4693FA9BD553B5EF3C1F311FDB66C8B4117620126768A74227874D9BC89FECA06CEBCEE39528378B1B5915543453E667860D94C0406543B341175650D865D245225B0964BE723516490D8F908DA7B73A72C790A5B6CD6B980D0FF8DEFE9BE0859163D3527D5 Key = 4ABBB43F2BF9C69B02AED5D4D82310F2 In = B863168DAF023E33D00F90F5BD076FA62F3BFADC93F0A1EE0E1466DC87507BE3E0420F884D40511F5C1A6DC912E70F33EC90D52E2F98FBE89EF076E3A95CF011F6ABA8A946B409C196ED86094597D35C548EF84ACAD0CB3E292CFC4D43183F4D97C43BFC5445A5DDF396159F9662D0D844391075E5A209A00CFD49AA86519F7C3DE285D9DD02F3924D0836C725AA0669F3B98C4B42AC893B90F55D4F07B83CAD7F693BF49D72423A369E7FC563D44229CBFB5F7A25EEBB50DBDCA0852851D417 Out = 3F22A08DF104CB891887000C0B975296A0A736B7D074739DBB7B16100EC96EA30F84438E3C9B6F38063C2C4FD8B39262D828F000B8176D6793F8537598DA976A29228966AF45F698BE394FD0FBFED864BB1B81BCEF8D9FED2BC7FBECEFC31D319D6C54648C9C0ADBB83B18A56E8C1D72DB37FD24EABA87F6C9767E3B3FA4566DA71D03539EB8E558390EFB8B1839AFEBE11FCD2F81774674228FB965D4A78164E57F5348DB47E06C0D2507B9738F3750D1780D49E485B9CF89A7C716F9A628AF Key = 8C366409428A56AD49CF09F5C790325F In = FB669C4A5B01B8808E3A7A08E47D2ECE63202C4F896402163D88BDE3FA02A0C7EA924B808AC430A3A157B09FDA1991A18DE25F842E2DD3A221AD2804660791AE592E60D9991C59D6D0E50CA49F1F4FF5AABA0C81DA2C36EC169B420745357B82201009C2E2EF15853C65647FC93B587E25415AAABB8AAA7B441F8E1616A1DDBA24C83935C5A4755C19719837AC1EFC7275B37E264B1AF004513D53BC94BFF7D6763AB8AEA592FFCE8725BF2CC06C711AA2691475CDCDB82A28ABFBB1D166A20D3563B66060699F16 Out = EF73A9BB5596BC30BAF024316E5085A71F83CA9C8BBEBA4C0F5EACE57BD0F19A9688590B4F255E048E90EE2F8316885ABBC82BD6F15FD6AD56C3C58D5FE6BF3BBBC6795E4E9D424EB570CA5775B39EF117F4D0337F88E6B3096F0206F89D01F1EEB39A388F42C44CB03AD06A6A4E914D545499852E2EC5F1F35556515FC7D04E884D48D92BB1ED179C485EE5E5B136F81BEDF14ABB843AC9292B80440FDB5CDD50EB573C744AF2444BDFFFD785FE3535F698F446B533FECEFC1ADF7752916B2B77C68F1AD08A77B5 Key = 0D852CA9C6CB0FA6A95F2B0D414A6F19 In = 379AC957E6721F2C33CFA9C8E8FAA85B3AE28E346E99FAFE06C5F2497724D800C332A3DE25424523CBDEBB0EA95AA31C88B8A00ED3CF0E90B42BC1CF690618CC15796E1966AA57067D5B7E172A1F818C1C7EAF58C27E6EB3F647879E9785FC8362210C8E8C458A60AF1CFDBEF698869E3347645C6D9AE7407F8DC7A1F84B20C1CEB17E33320F9BECC4B3E8E450BE9F5956F74CF33F764526F097DFCB63C57C9798F791B471C494062BB6675C374EA7273E69C12B5349172AEED9C66AF0380490B74F2293AA22DA87976580994A5109B5 Out = 7AE8556DD6A8EE6E86499658479AE39CC400452F06071044CD165FF5C2B85FD59DE4BFEC7FBFE20F578C1E21A53BC896D3FE5D77C7F908FA96A68FADA439645F621ACDDD9E2F351F1E4D87BE5BCA2D6C93584DC331DD623925B630EC01C296F64F71DF0DD92232C7B0A0DB821B1761A442CA73EC3FCBAB386B0FFA35754ED91B113D51CD9239DF73ED46BBE1485075BAAAFAC363F541870AA96EE7F21C4ECDBC0DA9F309B2CAB1C77D6220B2BC9EF5F2319607D7C3D32C9F007C21CCA676872818085C971FFB778138C5398EE372DEC9 Key = C071C64B7DBA548A42CF9656521425FB In = 84B35BBFE1FFE781B931EEA1556DBA23D38673BB229EDBAAEA95A93736104DF3805D496895F105FC5433F698CAC70526A74EB67935788C35D87E6ACB63A285999CB981173BA6EB6F8402F89D4D2DBF0A5DE904D5BDFC4864C6E48B906090DC418E9A91BDA8BE63E3CB341B570EBA6C5095A478C0FF43C062E12FB180D0B74DA39F7B562FFE9F652B3FF4356BA024777AC34D7F84C45FEA5EC21BBAB205C6FF43EC92782BEEFD471DD8703FBD5DE167A829443F5F1EE398475A40049C2AB577B5A6BF2581420F38D22F46142B59C92ED80F44A22A49644843 Out = 17B0379B31BE60CD613289C2176135F971DDAAC953B76C8B48BA9FFCA0A040EF00E97A320FD19C9D4CB269AC205DCEDA98DB7390992FA4FC567DE5A39ACF08DACE83858E03E3BDE07B75AB74CF4D90DA3FF2B95476F9A81853BFFEBD91450E71E4D5BB5291BEA641F877361112D65E7578390A71CA8778CFACD4D25F71C90D289AD29045358D1DC8E14983E75CCA03F12521969916432CB967202086B62B33AFE1FA5B5A68BD4BF19888922F814577ED0E4F09C50D884A7DAE5B08B2AABFA8FA159BEA131841CB0F3B63F826E36682208F78839D9E84D917 Key = BC12C0EA9A1D8C2F0CA4F4683EFB8E38 In = AC1211AABCB5E081D8C95FDD138A42FD6F1D808E37077D65D8FEAC80791E5D169A32B2F333CED7B84CFA383B430BD7611726230664C2471C0413CE30006872B0707DBDA38F9640D5E376D050DDD5526A3313AD1247B6CE98F1484D9FF0169B7190F8D4CBE10BC03234E3CA2581EEB98DC5969E2EB57A4C5A10DD5B5619D80D5A9B9C3595EAD7E0B5B622A5A2F685D70CD687BEA1876C74A29DE026C1F8F673D66F1171B1633A05393A9896705A8E504BC474083DB285BF8DD893D3D699505345EB97985948DA52A17AEABF279CC28E9793D360E8D707D5C36C0047BDC6ABE83E Out = 40BF0E1D3B5D92417849BBAE059D7EA6F22D409F5563957BAD0A4398F963AC823AE33A6F6E908AC004E94A5AB9E3E7C4184C94FC90EBFAC6CC70C60FE939453507BB65913FC9A97721A730880EFE22439DF0C516009A06FAE30F6CED63D9CEB707C331D0EDC2945EE3561EDAE176E525E66EEF01E4FE4880F8F7D79A32E45CF71300A262A5F78079C20D7A9EB543D2269579EC077A33EBCFB9289EB85C979951923ED96ADAA2984D6DEB1F5B3FA9CDD859EF877B7594E84B99E3A9D2C8B8F984428D18A1B59EBFB851CB8EF0B4719725CF07D73E580C18B537BE3AFB34186668 Key = A114856E299B436E09F437C57B15109B In = 2D2E50EFC0C6378E1D6BF584C498600F883CB10A49E27325E20A018B0BB3F192C7462F1CF76636CB86F3CE38DBE3A70502A7A6F72EEFB76990773407DA628C11FBEC2E8478EF2F98F0BEDB6733F695CF0158B8CF5AF6097F84116CDF8B973F3B0A6BC863B12EFCEDF0AD18F4755974E9A05E554654115EA2B309DC37D41B7C1C6686C6470A7A528BFD2E8ECA7E28657ABB5BC34532C38365FA1BA9DAA3CEBC85A9F30195E6D4EB52EF8CD243AE7DB1D082501FCA2A93A4A81C4E1DEF5F4E0625BB088D0B2F4C31DC26561179DC3B46DFCACE0E82CA9A05058E2118194F6021CFDBE0D8C1D7B6D41B Out = A6A0348A6F587D6664381AE45F8A0BC69C51F7BF6C26755452CDDB4F1F101EA2224F61BCDBA8E97067DA55F4BF59A5D7CF12ABCF4DF18B92E4B6921569051F5E70F25698FE0D6C19B891B48A3E03EBD7FE4A79A250A8B5FE6662D4430725AC447B55BBDAFB259B323872B4EFBB452FB968E979006EA49A789F4C3743DBC1306AFBF5A4B1F421C99A3AA07A2E98A47B4DAF2204CECB2AA86FB9AB60125AD0CD94C799CF3EBEC65C6F4F2B864C11F513CEA9D6280CDF16B1F0E1F943A444786E1DCB1851681572ACA9571699B82CE9E5275E6999A1EEB599CC8A0583D11D47938324E95B67407A0D68 Key = C722C9F2A15369264DB7F54FEB0207B8 In = AFC793265B90D53B647275124998999B3D8C91440541DB7E8CB0E8837AEB4653FC35361B55D659148D9F25E3C109B1BB92C037397DA8F91CD5AF0B6EDE7667BFCF1DDCEE76AE83F167D937EB67005D48A9503315476A43A45001F621444C562563DE6901E969F6662249A6BDAB7A638405EA3AC01304FD2DB772CC7AC122CD3D65B749A3F31704910950B642C8E5654DC10B07C614C65A07BDE2AB52196999066284CF0F6EB66CD1A62C29B683A436C5BBC15704688BAB92972421903D53F2072F7B8D53B02B70F63E7A7503207360A4872E04CBADBFEB321BCDDEA5E89419FEDED04000065DF73BE58A79AB5BDF885E Out = 6CAE06C13E54BB2375E3D3C741E9C61D3813AB63CB157E54FAFD28E9A4D935E57D74032E5E669844D277F211B480F0E54E4F0B09C2242FE1D5EEFF32E1313759A47E7450B55E09C437D1EF3F60A0572134C2D9B5258414BA5D84774D65FE545F1B80E7FC06BD7669D05AFAA2271AEE74F8E0C247070CBA2FFCA62B6CE5BFB0B6E75055F099939AC44FEC6E9A3615FD57B3723119FF14C927BA06DFFA36E91744E035AE7A9F21625D74BB62C41802782201D1043E5B9AE266997FABBB42ED800EA1E2F2A4E78C265E3CBAA9979ED89A8FC6C9F16BC6802A5E7D2D819A7D8357B9C40B5BCC50726EBA3DD0791E11489771 Key = BEF7E425E917D067300D40D19AE12ADE In = 936C9695CF82D4241CAEDA1E8C80DA52CA4837BBDD2158E2CCDAA99EFEC6F1FA29D6ADDD6FE3A660F50FC6C2AE456BF742081FB471A317707C523638AA27DD85621CDED72631C4690A857512265A11C283193BE33BBA6E77EACD56E9DF9541BDC3567814E98F0E6D57D9B25440FB7AB62AD9375B2A96F60C4E4B57AD02F62EAA06793D0C5761369447B9A0621EC2F9AFBE8F52E8720CCF67E4A1BC7285463E8DEAADC248CD8207739F04FD13F72E0A7A0CDDD5EA0B7111582A389C21F499BB4349E8BDFAB0925E4C299773A9A546913D37B7951C9052EE9455391880A77CC66F133FB8AF5CBDDB2433F3F9D52F94A15D8A9143D0729F6D60 Out = 8144D92331D338C920C0BA0C6B32C6EE28BBCE148F6B56B5D2A12D029734A41B8B4071E4A7601A88E8CEB031DDD38E4588CCAA900E8E23AA1C3D4AAD39FB75B90A8C47ABE3641FC6B04EA1E74FD4B4B9E72310F79D25509B3DCA63BEB093A08F7149A23E0D548DD5C20449C90FB41C88CBB6D1D51D35DE46D4112090926A7948563487E34E7507CCBA9825BB48EA8709239CB49CBC0FC09447570E1FDE99E1316BC24A5CD38E53F613152BA9BAFEB065AE30CD73DADEF90E4E907C0E55EA0488B9CDD20926B3893D8429E4C9FCEA17087B6933064976F2503ACD2D8D0DF4CF6F10BFEC0C914B0C46E6FF575464FCEB1EDC01AFBE446F77AC Key = 19796BDCABF22920277106075D0E0EB0 In = 23D35E037CBBA0A76A46DD433B547E17B54A81782A51D13829BA301250ECBEB0EB598F76BE470D8411E7E58516873B4C9BB87E4B41C4DA3BB941C3F8A9EEFAA507D30948692ADD5E53AF8EF3CE42D6944D8E2994F45F4090B8934BCB09B94B3BF04726F42B00ECF9D9893BAAABFAF712E022F82317CFEC8AAEB7242BAADEF7526833C2EA481816856BD423CC652CC04301C7212BBE69F251BEBFCACAF0F12A19F99EC4A88E4381403B24322133373ABE881C0F97D706EE4CBF3F5F7E69B8624F50270E508ED0487B0B8116BE1AF904C23B4F704BCB8AF92B118A912B5CD0D759C3F73A6331E1337B693B7EA65A017CB62C51A4E4AC7C6AB9530DE747FFCEF27C Out = D968A79959F5DCB6486FE846504AC0E8753E56410795AB9637BA84EDD9AFD692DA253ACFDE1FCEF40280D30BAD93AF2386B755835AD1CB18D472DAF37D7C69109DE9898E09C69DD8D5DAD6D6640246B28F905FC0B1329D44E9AD2DD4D5D467862AE364CE7A81D5433B00CAF11B9A1D7D54910CB2B01888348ED423A2BB40CE0CC23210CE10CB9B123AAA8F41A3B25114398160C0E9241CEF67F52CC419AD31E5E04C4CE91716ED99702AE69E7A1D501C47A53F81E611827C7694E9B4B9446F263FF1170F4CD70B432EFEF97F0916CC6BA81A8E11EC996526E9202F6910FE8A427CD0BC8C7BFA23D0DCE30FDD6C2F36B582A3C9B698BC5CC6CEB3F951B26D586B botan-2.4.0/src/tests/data/bn/000077500000000000000000000000001322470703100160605ustar00rootroot00000000000000botan-2.4.0/src/tests/data/bn/add.vec000066400000000000000000000373341322470703100173210ustar00rootroot00000000000000[Addition] In1 = 0x0 In2 = 0x0 Output = 0x0 In1 = 0x0 In2 = 0x1 Output = 0x1 In1 = 0x1 In2 = 0x0 Output = 0x1 In1 = 0x1 In2 = 0x1 Output = 0x2 In1 = 0x1 In2 = -0x1 Output = 0x0 In1 = 0x5 In2 = 0x0 Output = 0x5 In1 = -0x5 In2 = 0x0 Output = -0x5 In1 = 0x0 In2 = 0x5 Output = 0x5 In1 = 0xFF In2 = 0x1 Output = 0x100 In1 = 0xFFFF In2 = 0x1 Output = 0x10000 In1 = 0xFFFFFFFF In2 = 0x1 Output = 0x100000000 In1 = 0xFFFFFFFFFFFFFFFF In2 = 0x1 Output = 0x10000000000000000 In1 = 0x1BA7129B437EF98 In2 = 0x1BA7129B437EF98 Output = 0x374E253686FDF30 In1 = 0x7FFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFF Output = 0x8000FFFFFFFFFFFE In1 = 0x7FFFFFFFFFFFFFFF In2 = 0x1FFFFFFFFF Output = 0x8000001FFFFFFFFE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA Output = 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF Output = 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0x10000000000000000 Output = 0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0x1 Output = 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In1 = -0x31CB6DFD33AA855F61B671C2B7A4972C47FDE3DEED69355B0793E1AC350FC8E5DAB5E38E60696D4220DE0557049C04CA1BE7A909D0DFE3D7F2450528554D In2 = -0x4FAF03723E Output = -0x31CB6DFD33AA855F61B671C2B7A4972C47FDE3DEED69355B0793E1AC350FC8E5DAB5E38E60696D4220DE0557049C04CA1BE7A909D0DFE3D7F294B42BC78B In1 = 0x2DEBD3724F91912E542CDF60606F9FB9F07633A66D8F9CBABA08C0605FA9EEEC16C2DF65D47113291EF2 In2 = -0x497EE12838529EEAF98B7A9646B59E07167D3005EA4648CA2B1D3C3EC55AB04E58927611E5 Output = 0x2DEBD3724F48124D2BF48CC17576143F5A2F7E0866791F8AB41E7A17957ED1AFD7FD84B5861880B30D0D In1 = 0x6792AC6F0 In2 = 0x1DA0E10503E00FCDEC773EA1330EA45DE602FE Output = 0x1DA0E10503E00FCDEC773EA1330EAAD710C9EE In1 = -0x27734811B5580DBA54C80C6D9C057889E8A71FA5D1D3726A18EF26FE5DB08BED2BBC06D11C049378C49 In2 = 0x3DE58956EE296060A33D7DDA649E69570ECFB2968E85D1CE72E30FBB9A9C0598028F6EF0B8CFD0DB0D4FB6F06D9F48FB6F7A927E7F644DF1C7DC Output = 0x3DE58956EE296060A33D7DDA649E69570C587E15733050F2CD968EF4C0DBAE0F6404FCF65BB299B46BC0C48087C4403C9CBED2116DA404BA3B93 In1 = -0x7D4DC4A968F81D20854DEEAC5B77B64A33470756A2BA41F83BB9E9A9CFA06A0E6D2FB7D6A754762EA165DA In2 = 0x7D5C11470F594E657B88A67443DFDDECB0FE57BEEB07F5C2AE4BB8DC6C1E Output = -0x7D4DC4A968F81D20854DEEAC5AFA5A38EC37AE083D3EB951C77609CBE2EF6BB6AE44AFE0E4A62A75C4F9BC In1 = 0x139344D0E396BA8ACA4221920CF3A7376C7F2A3C4835A9D97454F86 In2 = 0xBCF9A6F9335AC6C0933269C0D70CD977DB93EB525B5EF59FE1CF3EF9950D00D107A74BBA81137B1645E5D69C7130 Output = 0xBCF9A6F9335AC6C0933269C0D70CD977DB93EC8B8FAC03D94D77EB9DB72621A0421AC28273B73F99A0836DE1C0B6 In1 = 0xEC36DC35526EF1B844B26079B9D5456CFC2F645AEA9D8B2C38EFC6EF48BD723CF In2 = -0x466A4EA57C0EF2266F6BE04CB94D48E0B993E3472F0 Output = 0xEC36DC35526EF1B844B260334F869FF0ED3D3DEB7EBD3E72EBA6E635B4DA2B0DF In1 = 0x6B8B8B01CEF353F5BC8A1ADD88EACCFABAF15C904D7C65625FCA6F9436441951D79C5B869FBF8C5441AF21EA89F6DD3CE039D535A65A980E1CF7A In2 = -0x14343B3A5134010B9D7C83E2C01DD65E46F5CC1AC5CF38192A1D422AFE1324A447DE5E19135FA3B1DB2714 Output = 0x6B8B8B01CEF353F5BC8A1ADD88EACCF977ADA8EB3A3C54A8880231683466B36D683F99DA42CC0AC19FDAFF3AA8C492F86253F3A470605CF06A866 In1 = -0x1E3A56C5AC5932B82D4B9603A4FA6D4BF0CED0C491F8A09BF4203BDC2DCFA8C40A1F99A678DC669E1 In2 = 0x40491CCEF0700F7C5E1BC5FCA64E3C68 Output = -0x1E3A56C5AC5932B82D4B9603A4FA6D4BF0CED0C491F8A09BF01BAA0F3EC8A7CC443DDD46AE7782D79 In1 = -0x86537488CD11859CF3EAF06AA893670B3A739CED553D152352100EBBDB2CA971802DF2553F77E24B5AD2A6137E0516B In2 = 0x488AB9DEDE8BB0932CB000EAE2CA82FBCD62A021DA9EC4904C6F7103CFC26ED74EA7B6ACB267BFDF98BFCA7B8B4DF6D82F97790A363F9B Output = 0x488AB9DEDE8BB08AC778B85E11B2292C8EB39977516853DCA535A22E7BF11CA22DA6CAEEFF9D28C795E0A52793CFD222826D17D255EE30 In1 = -0x2CCF281FB315255B1F6E31F597A9BD5F00BB938A7D9ED80B8C889AAD25ECE3313C8B50EFA175CB40647CB57B2673DA26AEED In2 = 0x3AB8C0A37 Output = -0x2CCF281FB315255B1F6E31F597A9BD5F00BB938A7D9ED80B8C889AAD25ECE3313C8B50EFA175CB40647CB57B26702E9AA4B6 In1 = -0x4A9B578ACA5D1EA250BABE2F2ABD410B05F9298CCE37D5CDA089D7AA6FA7A339C27BC38D586230A89C6ED7C62D9952B1937BBE623294B0D31E887E0DAFA24772 In2 = 0x68A7F76ECAF9E8A9DF5D04A8F237C241E3B0651CF36256D3E23F96DC5415F634CDE Output = -0x4A9B578ACA5D1EA250BABE2F2ABD410B05F9298CCE37D5CDA089D7AA6FA79CAF4304D6DDB9D792B2CC2448A2B17534768D29EF2C0D2772AF251AB8CC503EFA94 In1 = -0xEA9861C035A7F78F79D402D1 In2 = -0x1B622BF9A4C6A10721233B00E2C90C8690742FFA0D903BC1B7B2D03288D3839336AE0D5AF4 Output = -0x1B622BF9A4C6A10721233B00E2C90C8690742FFA0D903BC1B89D689449092B8AC627E15DC5 In1 = 0x49943D5A8D58F68F7D5D98F2A0AD8E8010C86EF6C311447E4A7BBA1DB4C11CBE554A10F2A31F622085131B15B891ADB95A0CB02D25FC93708855963 In2 = -0x116AAFB7BE514668033D0A0B8E3B3CEAC557C65B7713DD4A Output = 0x49943D5A8D58F68F7D5D98F2A0AD8E8010C86EF6C311447E4A7BBA1DB4C11CBE554A10F18C7466A49FFEB49584C10D007658E180D0802DB91717C19 In1 = -0x13158EF38BE6500747FCDB4432C217C992C9B5E20BDDD910891447E21B4F008EE4 In2 = 0x38370F553F6BDCFD3028116984B2962818B6E5F65FDE8F845CB9415CC23F9DB26E9D179E18FC835124ACAAA16F38D977F7BF6E579DF5E3E2BF253F7 Output = 0x38370F553F6BDCFD3028116984B2962818B6E5F65FDE8F845CB9402B695064F4099CA31E4B48402503301174D3DAB8BA1A2E65C65977C22DCF1C513 In1 = 0x385D4675443BAFCE295DAB2E2DB3E3CB3217507541D0EF36AB6C922CC844B2A0227816E5B3C6355C24E00AD015EE1C In2 = 0x106EC3C473D2D7DE8998F946354C604F5 Output = 0x385D4675443BAFCE295DAB2E2DB3E3CB3217507541D0EF36AB6C922CC844B3A70EB45E22E1441DF5B4746E24DBF311 In1 = 0x9CD07AF9B4785B26D2E5F9C4C0D104DC4287C42EDB5FF52C87315FEAA15BEB3E2C66B8615E1487B17902 In2 = -0xE3AD3F9961602DAC3DDBA390AC1E96AAC8C45184AF0FE03525D96DA0F Output = 0x9CD07AF9B4785B26D2E5F9C4C0C2CA0848F1AE2C009C17724E269E0136AF5EF9141BC7635AC22A1A9EF3 In1 = 0xE2D8E7F293F2373C51B646D81274B2CABD27372090A2D3714AD59BD3 In2 = 0x3E3 Output = 0xE2D8E7F293F2373C51B646D81274B2CABD27372090A2D3714AD59FB6 In1 = -0x44115A4B59BE63F072FDD861F4E7EC64D30157B6D92FA67CBF661CAD4F96309BA78ADF09314309A440FA163DC20A9A9 In2 = -0xCFBE263DD0A0251C9706E66C7F4B753B Output = -0x44115A4B59BE63F072FDD861F4E7EC64D30157B6D92FA67CBF661CAD4F9630A8A36D42E63B455B6DB1687D05B6C1EE4 In1 = 0xB3481E6859024D In2 = -0x2D09421F94471EA0D9A09CF9C7309332E7C8E59BAE4953347C9C5265F5D3B2E25CF582F0BCA0919641AD90895EA43B46ECA0E19BE9B54FE652A14CC7F5 Output = -0x2D09421F94471EA0D9A09CF9C7309332E7C8E59BAE4953347C9C5265F5D3B2E25CF582F0BCA0919641AD90895EA43B46ECA0E19BE9B49C9E3438F3C5A8 In1 = 0x255D7BA88D09ABA60C035ED8ABB89A8D02254911BA235C97C3132E9B18DB9E7E391AA646A2D1EC2ED4CA0800 In2 = 0x84220D06C756970279F399BC07C7D89F24779D5D1144A4339511626ADCE96AE00C7766D34D7DD546F1EE04F837DC185BD3B5B86479DC970FEE79F8 Output = 0x84220D06C756970279F399BC07C7D8C481F345EA1AF04A3F98703B169583F7E231C0788D70DA6D0A051CA011137A9694EE5BFF074BC8C5E4B881F8 In1 = -0xE642F1B In2 = -0x6D778DB5694A6C7180304EB1FAD28D51939E45AEA8CFE43FD65730DCBBDE77A8D5055F4050CBB1507B800376D29048662F8D16 Output = -0x6D778DB5694A6C7180304EB1FAD28D51939E45AEA8CFE43FD65730DCBBDE77A8D5055F4050CBB1507B800376D290487493BC31 In1 = 0xF52FCC04B4A30DC9136AEEDEC91CB994036FA80CFBB5DCBBCE75CDF0C41BE8B93BBCBDF067B3C97B1EA059EFCD1B83D In2 = -0x7B3BD57EE9BA2AC03FE0C8E41CA1AD40666340C61712314DB2832D879EA95011FD3D80E6F Output = 0xF52FCC04B4A30DC9136AEE638D473AAA4944E7CD1AECF89F2CC88D8A60DB22A2298B703DE48641DC755047F28F9A9CE In1 = 0x5BBE86E0D10ED4A4259DF61CAB3A In2 = -0x9ADFDFD329CA3359E12D474ED10BEB5251A752BFB473950 Output = -0x9ADFDFD329CA3359E1278B6662FEDA650764F8E052A8E16 In1 = -0x2B832987277E4971FA111454E665CBBABC55C2C457D549F4581BF72 In2 = 0x3287838CC03525B22C894A4CABDB91F9426E356DB3921A79106E19566F5848C15F4B4E9F80F2 Output = 0x3287838CC03525B22C89479479431F815DD715CCA24CCC12B3B26D91132C03440AAC091DC180 In1 = 0xF9458F73A7B72F27EFFB031AE424F1308B171B57F07A9EB918F8045973AF186C7427DF1CDE10C24E8BC6E8706ADA20F5F1BA4EE3356C1DCD65 In2 = -0x1A658503EC5C465A561C335A392C06A7BB05556D04BC78B192BC105480F6BE8B54339F3097ED82F5F1C6403AE266E2AD64300288E48B32873 Output = 0xF79F372368F16AC24A993FE5409230C60F66C601202ED72DFFCC43542B9FAC83BEE4A529D491EA1F2CAA846CBCB3B2CB1B774EBAA7236AA4F2 In1 = -0x169740C522EB8836AE0D0E7DA06752EFE505EF97A73AF4E3FEE5C91A8C05E1131CA1593F8DE1F4BBEE03B80F6A8AFE508F6E6837295D1C28 In2 = 0xA65C24F Output = -0x169740C522EB8836AE0D0E7DA06752EFE505EF97A73AF4E3FEE5C91A8C05E1131CA1593F8DE1F4BBEE03B80F6A8AFE508F6E68371EF759D9 In1 = 0x1AB82F244FEF0640DB4A97D7214720EC18B4B77C1FBC08F314BD784897CCF9E185298555988C9574562E4C77F4EC650DA19C09C0D89035EDCEADB5 In2 = 0x167AAF488058CE55F05B6AE43198B1A80D9E8D99BFA9A20003B335F082E226E8DD5631DD2E7FB2 Output = 0x1AB82F244FEF0640DB4A97D7214720EC18B4B77C3636B83B9516469E882864C5B6C236FDA62B230E15D7EE77F89F9AFE247E30A9B5E667CAFD2D67 In1 = -0x10D5DE9388F06 In2 = -0x3E24151D5BE9F749B196896BFC6568A77DAF0739B66900E7A1DEA64D47B6BA15E2C72B3EA12A7062B Output = -0x3E24151D5BE9F749B196896BFC6568A77DAF0739B66900E7A1DEA64D47B6BA15E2C73C147FBDF9531 In1 = 0x626F98431DDA4857818188C5C4759289DA8F766A9CBE73B37FA2392EB8C9CEDB39E61F In2 = -0x36C1E7ADC26936882E2C9A38072B2EF0C76CE3FA6C87 Output = 0x626F98431DDA4857818188C5C43ED0A22CCD0D3414904719479B0DFFC80261F73F7998 In1 = -0x4 In2 = -0x4F168C48971684B343A380811A468C48784CF8DAA8E3DD3893F846BAF37323030A2F Output = -0x4F168C48971684B343A380811A468C48784CF8DAA8E3DD3893F846BAF37323030A33 In1 = -0x63370496EAA7F2FA4B03BE322CC91B18BD97ED204A1826C819458ABA6925DE0C In2 = 0x4E2A2C70A Output = -0x63370496EAA7F2FA4B03BE322CC91B18BD97ED204A1826C819458AB586831702 In1 = -0xA7F8E69657921ED1F8433D95D3CB4C65B0AD08E4AFD6898EA0B3B4711A7178C16B60D742F2F5156C39D1810E In2 = 0x3CDF24E7B7A33ABD03CB9F1706E630A605C4B4BBC230D2F99A11BD2739D60126BD260674D14139ECF4C90 Output = -0xA7F518A40916A49E4C7300DBE25ADE02A64CAC99641A6681711A135547FDDB6158F504E28BA801589B02347E In1 = -0x17A057602CF743924B6A4AB0E9939C85EBF369409A3AD000AB938CD0644AAB1C6A03FB97FA3FA9C629F37792889319F38782B3A23C842268982E39FCF7 In2 = -0x14986367147AE2D224A9FB19A08E2134A7153CAA49 Output = -0x17A057602CF743924B6A4AB0E9939C85EBF369409A3AD000AB938CD0644AAB1C6A03FB97FA3FA9C63E8BDAF99D0DFCC5AC2CAEBBDD12439D3F4376A740 In1 = -0xFCBC189F66432585076812699F4E42AAF5C3FC9061E9B5933356B7FC1448A1210CC1B87314DDF814361A8 In2 = -0x1CD60D0606E846CFEFE36BC897203517E2F8227489EE8F909F5C70229F524AFCA8D682AE40C87F302DEA78C48B2DDBEDA6FD62306CF1400D4EB0 Output = -0x1CD60D0606E846CFEFE36BC897203527AEB9AC6AEE20E7E115DD96BC943675AC05164BB45F63D8636355F885CFB7EDFE7318E961BAD0C150B058 In1 = 0x223AD9BB2B417744EB50C54710B1E535851C0A4CE28558817E6A16FA1DEC1C302EEDEB52375A9712B35461C40E36F1935B03D83D8928C70 In2 = 0xF9ADDF1B8C21DE8E903DC3 Output = 0x223AD9BB2B417744EB50C54710B1E535851C0A4CE28558817E6A16FA1DEC1C302EEDEB52375A9712B35461C41DD1CF8513C5F626722CA33 In1 = -0xA6005ED6D3C542C8C3B3CF9D0E6CC1C355A9F12F8AC043F1BB93451491237CB723DA0F76A1D040E4848F0392FBC4D5D06FC8017909446C45573159E854 In2 = -0xD521F630AF6ED1802E37053D3A173AFEED8AED368B68BECF5404A7855D905AB23151E3E03F3561EC6C662B Output = -0xA6005ED6D3C542C8C3B3CF9D0E6CC1C355AAC65180F0F3608D13734B9660B6CE5ED8FD018F06CC4D435E5797A34A3360CA7A32CAED24AB7AB91DC64E7F In1 = 0xC9288E6D4476953C30937FC29A In2 = 0x53241A699F33D008F6DE731D9EC0C995635E27FC351C3B9667FE9F97FAD14715F5519F9C85679D8C3610A1D Output = 0x53241A699F33D008F6DE731D9EC0C995635E27FC351C3B9667FE9F97FAD153A87E3873E3EEBB60956E0CCB7 In1 = -0x14D6605B6CA0BED0E3C6E15DA4D7414FBE269A0CE226CCD6B053A8A97064D8B43B398F28D94EF83D155B9A39335C08 In2 = -0x38223FD65C8CA3CF81E65A30EC9FBC385B453AD0E22264BB681667035C2F726459A242A646EE55D0C4B801B957C5E9A Output = -0x396FA5DC1356AFBC9022C846C6ED304D5727A471B044D188D31BA18DF335BFEF9D55DB98D4834554960DBB5CEAFBAA2 In1 = -0x9250771C In2 = -0x5041B8CD1CADE059F336C29C205B994C1105613021BD0BF840980D52E884ED3945A607E1D3673BC81D7EE4BC59FD896B82EA9BA3A8279CE83F29BA Output = -0x5041B8CD1CADE059F336C29C205B994C1105613021BD0BF840980D52E884ED3945A607E1D3673BC81D7EE4BC59FD896B82EA9BA3A8279D7A8FA0D6 In1 = -0x252555C6ECA1C9C564021DB32BA447987766DFB5F3 In2 = -0xB51B999F81898F62EA530710294E7DCA18433099E063C4052B5D7C91BD3385F2CD1F13CE29A2321475B8A41E0722 Output = -0xB51B999F81898F62EA530710294E7DCA18433099E063C4052B82A1E7842027BC928315EBDCCDD65C0E300AFDBD15 In1 = 0xAA0A5EDC83FC46646DB83AA93BFB2A84EA8A836EF67B0F3658E9769B60E4300BEF0E67F28B2DD7F8 In2 = -0x61223220ECC267957 Output = 0xAA0A5EDC83FC46646DB83AA93BFB2A84EA8A836EF67B0F3658E9769B60E43005DCEB45E3BF075EA1 In1 = -0x35FE95A43E5D5FAF40675669A29DB87336DC363D446E2C6FA1F1F146D2C3C948B26EECF0CC4CA81CABFE7E468436C9CB0300085F562CBF0016B066E97C103 In2 = -0x3E8F1F274373D75817D5D67E5215302D10481D7F963236B658EF0D326B2D7C99B493C9000F9068277E369DC05BC5F56C060AD3B Output = -0x35FE95A43E5D5FAF406756A831BCDFB6AAB38E551A44AAC1B7221E571AE148DEE4A5A349BB59DA87D97B17FB17FFC9DA93682FDD8CCA7F5BDCA5D2EF86E3E In1 = -0x6379E5426D1A80CF647E5E018A469A7B4391A68F376 In2 = -0x529E84159D037B2DF823E397F68AE81F Output = -0x6379E5426D1FAAB7A5D82E393D261CB97D110F3DB95 In1 = -0x6B313343CF9C60799B6F67CF1901E282FF1879CA9158EC397D95565236F6A1EA2FD52DE77996511CF5C0DC16C2CEA1B9DF1B747 In2 = -0x47C68A1FA0E084C4CF6F62726D35D0E44E36751E1282E07E2E4B19CCBCD193C4981FE3B87FE77DCE5760 Output = -0x6B313343CF9C60799B73E437BAFBF08B4B6570C0B87FBF968BDA39B988D7CA1837B8129916621E36320A5E14FE56A031BC00EA7 In1 = 0xBE7 In2 = -0x1B2B372D015EC298BE2E53F61AAB688A8048DBE4218D04D367AFE5B989943E14C76549C8BC04618A3ABD684568D8D7E129A3DD3B38E Output = -0x1B2B372D015EC298BE2E53F61AAB688A8048DBE4218D04D367AFE5B989943E14C76549C8BC04618A3ABD684568D8D7E129A3DD3A7A7 In1 = -0xC4F9D29310EA767AA8DD0AF418447DD3DC2C220C48591F99B6DBF0521F7A5640 In2 = 0xC4F9D29310EA767AA8DD0AF418447DD3DC2C220C48591F99B6DBF0521F7A5640 Output = 0x0 In1 = -0xC4F9D29310EA767AA8DD0AF418447DD3DC2C220C48591F99B6DBF0521F7A5640 In2 = -0xC4F9D29310EA767AA8DD0AF418447DD3DC2C220C48591F99B6DBF0521F7A5640 Output = -0x189F3A52621D4ECF551BA15E83088FBA7B858441890B23F336DB7E0A43EF4AC80 In1 = 0x17FB5C14378626E94EC16B21FB8CCC92F76FB2F2B50B97B4638A9077C2246D721FB9964F37BD2896868BB07A00851CF7F4D7E2A1EB82564F0CEEA In2 = -0xED7032C591ADDE75225BC72B43AFE64B506E9C9FED691F97 Output = 0x17FB5C14378626E94EC16B21FB8CCC92F76FB2F2B50B97B4638A9077C2246D721FB987783490CF7BA8A45E54441268BCF6732D9B01B857787AF53 In1 = -0x4640AA0277F7114A67A2094094D2DD4FE579BAE27177FC081D6C960F3AABC0406C6C42636454AE4BF6378B0C89E95B6FE21752 In2 = -0x28ECEDB2C3BF2BAF41E7CB48A68776ECCCB1D9842D3A3CD5D8D2ACDEFC09FC3CEEEA07AA993361FB1B2D3BC1BCAAA6716C700591BA4A678B150C52211E5E5 Output = -0x28ECEDB2C3BF2BAF41E7CB4D0A9217144C22EE2AA75AD0DF260081DD53A5AA640669C82C6FFCC2EEC5E93FC8836ECCA7B1BAEA511DC31853B3A2091F3FD37 In1 = 0x5F2FED076FEF762B In2 = -0x211E0872E976CCD667969DC26A4FDE294E64EB5C062E88A5DC762CCBE5227766417F58AA752681DCBC9F1FA6EEFDCFBCE23B Output = -0x211E0872E976CCD667969DC26A4FDE294E64EB5C062E88A5DC762CCBE5227766417F58AA752681DCBC9EC07701F65FCD6C10 In1 = -0x2B393039B13A32B6F67B9B2F1A1088347D0DC1A07A4559C746CEB81658C6566300861CB140CEE7374A83 In2 = -0x65E413EE9891FB5BB176200C3F66DA777CB23ED295BED8B2EF1981D8D04BDB3630EF254901A0A4B297443E562A98CDA74B8CF9E1CA5314BAEB95 Output = -0x65E413EE9891FB5BB176200C3F66DA77A7EB6F0C46F90B69E5951D07EA5C636AADFCE6E97BE5FE79DE12F66C835F240A4C1316930B21FBF23618 botan-2.4.0/src/tests/data/bn/divide.vec000066400000000000000000000164411322470703100200310ustar00rootroot00000000000000[Division] In1 = 0x1234567 In2 = 0x103 Output = 73701 In1 = 0x100000000000000000000000000000000000000000000000000000000000000000000000 In2 = 0x1000000000000000000000000000000000000000000000000000000000000000000000 Output = 0x100 In1 = 0x100000000000000000000000000000000000000000000000000000000000000000000000 In2 = 0x1110000000000000000000000000000000000000000000000000000000000000000000 Output = 0xF0 In1 = 0x8000000000000000000103 In2 = 0x1234567 Output = 8106479557646752034 In1 = 0x1A923B3406CBE81B093CE418F6A73107F504502B2E3D1B200762FCF6062723DE405CAB0AEA00000000000000000000000000000000 In2 = 0x184F03E93FF9F4DAA797ED6E38ED64BF6A1F010000000000000000 Output = 0x117D3DB34AD005954459BE9ABEDD0E5DEB4EA0000000000000000 In1 = 0x38643020ACA9585367FC9BAB0D8049169F1C3F7B7183 In2 = 0x3 Output = 0x12CC100AE43872C677FEDE8E59D56DB235096A7E7B2B In1 = 0x119F4F0A35F4EB9A107EF0A5743816D711B8D3D69378F In2 = 0xD Output = 0x15B06147A4DEABD14F61282E18E29243C70ADD56DCE3 In1 = 0xA11E405D5B086A12DFF64F0D4B25631C0FBE6C3C1FC2 In2 = 0x5 Output = 0x20394012ABCE7B9D5FFE0FCF756DE09F365948D8D326 In1 = 0x57074977A639D9AFF8381B In2 = 0x10000 Output = 0x57074977A639D9AFF8 In1 = 0x57074977A63A30B741AFC139D9AFF8381B In2 = 0x80000 Output = 0xAE0E92EF4C74616E835F8273B35FF In1 = 0x1427C4642AF7240C990FB083C197CF3A4C383AC1407CCD9DC7504EA1A9DC227 In2 = 0x80000000 Output = 0x284F88C855EE4819321F6107832F9E749870758280F99B3B8EA09D4 In1 = 0x19C78AD6545D90CB8DFB4FD910251B1BF276C99786 In2 = 0xB3CAF67425466 Output = 0x24B4D4D3A1022312FC40FB0CFF23D In1 = 0x2A1640FDEBDA73842CF7B19B61F0F8D89AAF836250C2798CD3E0AF43FC9863A6B6BC94AA8F003EAC17E83781E9285273D7E5DE28A857BD84306CD82CFD33D In2 = 0x3BE860667770952B887D5B1A56937CC26B6AA0941AF0599F20BE6F55ABBB215F9391B623024B4E92C8B9B5174529E9A094924 Output = 0xB3D8F5CB2C424527D33FE642 In1 = 0x261C8EC385F6104B934409C2B4FA061EE8DB73CC9C0684C22AAFC1E0EB341291 In2 = 0x320D4D417E520 Output = 0xC2EDB7A2F54A6070A271E78FF0F8D709EF85517EE726CDF4A41 In1 = 0x46F35C58F66F6DB728ECC04A8C1A721F1F516EC698D5B0D7CB229E575287B4D87B1131F1001EA9288A In2 = 0x1AF19784E4B6A33625EA4F7A9BA6C5BDC41D104D516848E119BAE2B6 Output = 0x2A21F4DA223687CDE8BE2C6A4F8 In1 = 0x2C076C243BF9E49F9A7DA27A48BDF687B98A362A4C985CCCC62D1314417DB8AD04A452BE9EB6DE3AB3 In2 = 0x2134FC3FAA Output = 0x1536DEB82307BA5A1D1174E68BF94A9E249FF362B61184AC975C44DDC9F2C2EAD82E989A5 In1 = 0x77C55D6FAC38455D8A8D84648FA4BCB88121D637FD5635F9E13A985D541FE09BD545FB897E38D710D6637D4E08221E9943E4D9315B0F2B3439C In2 = 0x2985EB7A11C8C8155A3E4E294F1C9CBC72ACDE893E1276175BB12E7EFD505A86E63E090FEEC125410F6B7A56901F0B0 Output = 0x2E26AA7620F96DCE4F66B In1 = 0x1EB83432AFEAB82C503A3AE7D1FE2145A657 In2 = 0x1B74132E23B88B83C49AC3B59E226ED254 Output = 0x11E In1 = 0x292F05B8C913CE450FD5046705032AF2B4E97F9A0A4A992B22D9BB62E277425B9650147773DAB473BFB8D2B4C3FDAF68EF2 In2 = 0x312F971B41C948DC01F583751BBD5B9B8452D9301915ABA6 Output = 0xD659BAA5FA96F2630831645948BAE893178767A0B31578A1032 In1 = 0x4ABBC62DA19EBE450C99EF70C30B5239B8FC155EB752D4210E188FC682EFB2CCAB79794D18381224520395160E67CE47E4E3A59CB57A3D43134C0A153CBC In2 = 0x11E737DAB5CE92C773E44A887B59 Output = 0x42C9F96E5358F9978E2F3C314F4DD6F8A9648379787AD2EBED1D376A46AE88A0FB608FDE2F2F0DD08AFAC6ADF7A64238D In1 = 0x2FE0852D84F82D2E73FCC933E71F80A73E0D27936EC5657EAA3D8A3B3B81894379F668F6EE9E156A82F6AE720637193C3 In2 = 0xB8CF930E2D09B07AA3FBAE257CE9A77362AE59F0D3D48BBA7AFDB8AA0EE4EE47BC715DD99B0E444F01FA6C7EE413F Output = 0x4251 In1 = 0xA6323676EB6AA6A4E484A45C68BA886BD3AE9F24FD8405D339CF330D613B61876E177E5A81A47F67292443915ECB7CB27B9BD6799FDBCCD82C01658D In2 = 0x1C4615AA5D13855FB70546E02989F188D4EE3B500A9149AAED1703 Output = 0x5E0CB691315D8A1BA26E1BEC607412F81C27E7B3D9016855910F3152F5FBC06EF25 In1 = 0x3637DB115B99DAF7986FE330C2F60F1C1FB7008B797DBCACC5B52BCAFEFA10D6B1EB670E0542069E32E9CEF4E05D128015910C8E0F48BA547DE51F7DE12FD313 In2 = 0x1A3B21A07D273FAF910E25F16BB67280487E8ED647492BC4304A4291F995A49450C6B44E6DF3FDFE81A2F16C59E36CA1E2FA782A4523EEF4ED Output = 0x21123C809108296 In1 = 0x1468D7B66C0E9A675B3D51E03911AFE7E09FB35D8534A6794F8E5E38EE9B2D828306B8701454D76F1129504A3A80B19A2065F7A5191F9EE7AD7D201C98 In2 = 0x2E9F1D54D78DE72C6557BC8E270748A738E2479D5B6D36F90C1FA7893F43230DE240E03BCDC867B220A4C0C7AB09EE Output = 0x7011BC6B1BDADE59E1E5B9B75C69 In1 = 0x23D9EE1E700E1A0A33C31A9CC0332CB086315F75180931552030EEF8C9A35DED753C03F5322DFF65E90202B9453761C In2 = 0x360B93088CA61DDEA9AA4EB54583949DD6D45CA9F6BCA0554D41016194777ECA83915210396F6EE29A Output = 0xA9D1C9CED75E1 In1 = 0x1747CEE3BF59D337EB9DE03F8AFCB3C0EF9812EDA996796A373A10275D16B3265D83899CDC5D53487B340806B0BBC6A0D3580EFD6E In2 = 0x1768A6C1F7CD208D82C5EA854F08E12C5B2A Output = 0xFE98D30B3AC973EC041908A962E8F596D6599A5EE2F41E0C561B20E088FD01553F9D49 In1 = 0xA112BC364C0D2E6D7DDB6015F8A2DE2F3BCB7D9D020F2191E662C61453B0FEFCBB933AF7A07175264CD53C45880A7CBBCDEA6 In2 = 0x4D7E19269CFE527D440D8CB4D846E709C06E2013D36DE59845E6BF12231E38311C5157B8CFAA Output = 0x2141CB2E602A21842D49A46AF7 In1 = 0xD0F58C290879C932C39847FAF4207A67648D0D34203B1DD4A112ACB4D2B0F824A705CC2FFD96E0C12F283DA348B78A2D4518616553FDB97411E5A9 In2 = 0xB972207BE27D3ED266BCE671A76A43EBF5DC8ECA2E0CD8835 Output = 0x120758D6FC233DC23860F341F5411427755EFE35D390B94F42DE9558AB21F07D1C7501 In1 = 0x1069ECB445354CF5A9DDBCC642FB8EEA6004EF6DE2F681AC4B8651966C269FAC0F8D62D3422ECA6B0C0733CE0341B9E3462A512921 In2 = 0x355EBD92682C64CA2F2DBAF55AFF103F95E1001115E8452186818C13941628C16CD Output = 0x4EBB59E2A2FBAF16D00725624A9450DE8484FD9 In1 = 0x18D3EA9252FC65F1DD0A7DE2EB11DDD4BA6 In2 = 0x39E62C0C71B953C5C2BF609326 Output = 0x6DC6956A1 In1 = 0x53180BAA3E5A97A22C1D747F8FCD21EEE0E836210A7C89F5704D9992907A97A382A355B10DE5533212EF91AAACC38995A3CFBEA63448A3A In2 = 0x1E3D4F1EA7E6DA22922FEB802546B2382653D2DB1F4470D31C2771508814FD0652442CF232F72CB5271845446F0F6C8D5B376 Output = 0x2BF73DADEB9 In1 = 0xC042193E472757D40488972335EAC6B22FDE7BA27BCA82A98349D79C87DE30D820620E6F79664B75EEEA991CC56FCEE54E42AFA2152A4390743B34F40175D In2 = 0x61D7D2A94938E4CF1FCF583CA4C803920E4E29B85B5403FBC83F28B440A Output = 0x1F707F47101937EB82EC1F20CCCC0ECEE6E4CE9FDC14764A619923141282889490A In1 = 0x2CC0F67F9EBE05FDE1DA7AA112D58C9CFB3671A62C72F19F04C82E901CAD91117E8F79055D8EF34F617DF87C3B752146B392ECE01DC67F229E95C2A34B5 In2 = 0x1CB9FB25CF40C4DA882E3880AA8C05CBC2C966A7A1747E10A704CE51A809CD4CBBB07293013F5D89559E12081A27C Output = 0x18ED44788218404336AB090CE854EA0 In1 = 0x4FAA3BFE1958B338AB22EE7843C3CB4F5855F09994958BC83E01889D42050552AFBFD049198401C426F03EE8340A390DDEA9A6743FB23DFC In2 = 0xB3459A764A20C8FADF99C3789E Output = 0x71C2EFFF66072DF507D9E6BD92DF077842EA28B3A41CB8385D751E0B37191F4BF27425D896535007F994F0 In1 = 0x1C61703693CE50464424022B5DA3E8A615A77CA2B0F5168FDA4C9DA0979BF1741D71A2A937F2EF842ED9AF749 In2 = 0x3982AA34F975DE88C6C687EA10 Output = 0x7E5523DAAD238C3E40BD11827830E2A43F9B7120C20EE5B666315F00D35024F In1 = 0x3262F9708D2474DE0DFC64FCDC788DFEE77D9DAB4C462AB8BDFA0E493C165A4EF754BE8578B2E30530C702 In2 = 0x2410F8CA80D2A5559717F91AEF9A07736B6D1842EA5C2349E7618A3266026B2A1353FC9C1E91F1CDA9EAD8998CD014E04D252 Output = 0x0 In1 = 0x2D4AFB1CF50DA7B860942F42B7D3226E3D0131B54E501EBC6243 In2 = 0x7C29AFBCC87C548A3BB554CF3B560A2F718 Output = 0x5D62A17758C3DB650 In1 = 0x123F71E77499975C79EE4C4F7B275A4410863CEDC3E244724D5AF83A8A2DD73C5D5913E9EAAB3664A182C424A21 In2 = 0x78B294AD98589FDCC2D53FCB0FC9F0E70E4E30323832D5669F66E15 Output = 0x26B426C03F76F97048D5DE0B8D9DBD02F4DC botan-2.4.0/src/tests/data/bn/dsa_gen.vec000066400000000000000000000320211322470703100201550ustar00rootroot00000000000000# From NIST FIPS 186-3 CAVS test vectors (May 04 08:50:52 2011) [160,1024] P = 0x861F667D91F69347EB4D9CAD32E092F9780353D67DAA25119C85E9E3D69E90E9C61ACD34AC08872EA48F01883D40F009DD9B23C74D45A8AEC24BDAA8697F6E622319D0DED28F870218B2036DA2C135D4873DBBDCFFD1873F258041B342C116A14093647FC969A7C68EFF42F56F38F6ED7A036B9C8FC70B1B8AA97E4058D2E94D Q = 0xD6176BD352652861DE08EE21A2D6597622E522B9 Counter = 325 Seed = 492270A5D1B3D74CC16928C3E80032C297F8C422 P = 0xB5CF7916632405A72A407979949EE858C91ADFCABFAA6CCA0E5456090B0D8EB7F36C34F23DFE1759C4A3ADCD776629D871214560E5E11B2F79792F040042987091C55951060BCB5FDF7CB93FED8B45FEA26376E7682FC601DF883DC7E272489B83181AAC7340A1EB0A0FC97F53AC80F3F965CD8ABCD7AA5FE1D2E38A357CB9F1 Q = 0xAB1A788BCE3C557A965A5BFA6908FAA665FDEB7D Counter = 35 Seed = 1F5DA0AF598EEADEE6E6665BF880E63D8B609BA2 P = 0xD91E0AFBBB6EEF8229588BFD59DF6D47BA4BFF14104D7D182F403204DCA5DD859F8DA96FAA74523B323F705E7B4D62425D7A6CD7052C1045E6A2E79745F4625BBA2B22B3DED86E9F903298E28F8E8CE365D67E37227C04F5C80F223251060BD291F338629E4F58BABCCC14CE9F46AF474F7A5C8BA22E0587F84157DDDDA7BB7D Q = 0xFA0CD4B34387D320D483B3DC4728A9359B17992F Counter = 571 Seed = B378CFBD34B4101C4DCE33538822ED25AF4D6230 P = 0xACD5CFD97AF56F5D5699BF71791DB35DA14BD07517F119D01D0873DA5A96A375A527D7E5D530E20BB81ED377A1095AEF5618C75C30BDAAF1CEE0B16E1A911F95CF452ED06CB3A608E5B9A09C25C37572CE0C139F4FF9F4E89D3E13A5E372936120664341CF9F70CD327029E09C74108472B5A28AD274EB4C39FF03464242A435 Q = 0xF30876D39C441114685E3998776063AAA7F9C0D1 Counter = 219 Seed = 828BC9726EED9C6FA7D7F03AA582122CCDFFD5F9 P = 0xF68008A9E020F4161C55BA692305E424A21D6E76E3D98B5A55DAB72EE839A67969FBEC3A54A210874FFA0A8A3CF7067FB9394896EA9E4C46E67EB957E708329DA3C19B093F95CE3A0A0370C29850E2DEB1A6B4AE764BFE8A9D84A430048DC2526C70E0BD22597483B49842A3688964AA50F19DD0F389B866D6CE1704F71BAC79 Q = 0xC7CAD94C843BCFD0B0695888C0E1C3AF00BC60E9 Counter = 281 Seed = 48C8F626EB22A9D258E6AAED900D923B56C508D7 [224,2048] P = 0xA5EF01F3071E73BE30C896A6C88BADF224AC0B1B88B376DE04248247FEDC70E20AC70D34CACF753222AD0C55E84DB1DC0A50868E636632D0A95AA327556EE9D5CE310FDD299C39DED7F36B211168D227665A7DE25B537C575B417C56B18594FE03692294F52970C698D8C6E0978A4553B8BAE97A9FD2FAAE33677923E444E97D4097A6EBD0CD0E31414EBE9C9DE375ABB661731B2C5C62F3A42A2B7AA71EE114F8DAE22E3D903E57A410974CA156A083DCA96A9613600521F3B08509B6B482CE4426C8CA37770BEC7E5B173B8C02E06664314061CD6D4D898EA17F4D53FB547F9175DA912211AB65E0DBC2B8DD3CA420B9B4012638295176037F4DEED25F9DEB Q = 0x94444E45DBB89CF4BE000EBEB98CAFD87F41DAA548C7449C46B1B63D Counter = 118 Seed = 2F4BDC8EFBA78904D7DC8A0EB98F8486D066ACDBDE25FEE5BCE25AD1 P = 0xC6C220912B0616E7829172851BF9A8FB9B1C2292735C9C3975EDD524EE3673712883E393A84AF03650DD723CA193E43BE7D5137D261261049716B825506937CACD7B74305F775AE54CB74C7E6092A969774D5DA32E2C1B7DEE77AD6D0138BCC8F5429A05605451C3F0B874744CA0FCEE9A9B784B0026A2666CF5E13629A4BD9891E4F14B79F4D294F04FAD4A7A72B4757F4EEF235C64F8C27E1BDBA5A5FA6502D7F73846320E5CEF7F9CE10DD0A3614E677C7A3F17603325BD7ECA045BBE7EBF782102A345B108EB294C989E8285EEB7AB100FB16690459C8546F6D1881605BFAC08C278FE31FC3DC7C98E21B3F038D898633ADF3EE0230C28747A00000BA8D3 Q = 0xB8D4E4D471E6B14B63991E6356A7F744F3622BCFCE9E095AFEB0C119 Counter = 1939 Seed = 502527B06F584CEF9EDB968756CAF6E482311A588DE45D9D92CB34E3 P = 0xD84646E7A6CD94F6B59AE0E9E4C2771E4427577DE02427DB99D47B1900991C042E157767AA8D18ED52F42C01E705D54928CFCBF413098AECD354A39B821ACDCE2ECAC983F555DF4758481823F43E36BFFB02AC176855672D8BAF66DA26CF92435AD98A69ECD57F13B3849383A3C54665A55BA85283AC12272B66EDCC2396A393E43CDF87BF80B29A6E140F36201A5A3B347D82D4967AF3812985326AD09BD0C9BE5984CB7A5AA1113B31E05A78C6F4D5047637E1CA897F8B35E42BBAF070F6C14DD556511735A8623353EA8533BEC1D986446FC287001A123567D7E05A6EF993764F4CB5695C683BCC406EDF4723271A01CCC34AB99947336EAE39FB7BEBC89F Q = 0xFE79458D0457CC9BBF370B17D8E4FAB9D3B3205F48604603314DB6CF Counter = 626 Seed = 0DBBF5222F3D29D54F7A7BC90A7E3EB07BC82FAE3B552477CD88CE90 P = 0xF408E95EE670A7CEB27C1A174F159715122D6B4456C0C3F32073327FEC52D4C34D2ECA26B63DC0D6AE20E34AFE068CD03ADAD89E01D9A0CDDB9EDF1761EE0A51855224794E92BA43A5FD624BAC1047C58C873AE25314789CFE6FBD5748E0A65D0E30142A149B0BC649ECCAFA8A2C1543958681A3DC85A15FC237F440D969342BA31E4FB555FA90B3B614493BA504AB99906CABFF6179650F595DAF53A6D1496A72D32729AB0B365EEA98967C76B2B6C04F07290DB285436ED4EB982D5844144A19668CA1F2676354C0C1E53E609392295B1F45954DCEF84AA88085A50E5F1C81148F961ACA6483FF79DDA88F699110551EADB82DD2F663BABA206E837ECD9785 Q = 0xD9A392273802CA33861F15FFFDCE180B65E0E14AB8CB2C2E2077816B Counter = 676 Seed = C31E2BC7D927AD49F6840521A2AA0B7E6371C773EED271329AE41213 P = 0xC645528A39035BEA1B8EE9C2BDF513A6B6F5BFE707D4931FAAE1D1DA638BE8531F15D78D5B6A7A83EA309D9B2AA8B128425DE6F85D4D7E7758A1FA7A3E16E33541BEB060010BF7DB432C99F417BEA5C36E290378889E91578B1ABCDFF7A46531CBA7A960280AB71546EFCD375151FF4E80735FB77D8D41341D9CBCAE341338167B69A4361BE34FF92F1DB6F0643CDF2ECA9D6C49E53A8FB0A7D1C3131540F032424A16DBFB6CFA8A2B1F4B6EC50989734931CB586EC6A55716E238ED52E9781B1F7EB10D47CD75B4814AAB68AA823C6659C30A968623FE017EAAD87079FA886B2DC5219DBFEFAD2BC2A37E100E26E781722BB35C0FE0CA448B2527AC3166943B Q = 0xD9AC70A4BEFC93B9DDB7A2AB31D620BE75E980EC0AA09870544CB509 Counter = 18 Seed = F99A828DFB37C71A12D1FFD19DC0178A5BCE26BA457EF43D8FB8FFA3 [256,2048] P = 0x8E2266D5CB5B1E9AD34AC6380E3D166FD4D60DADC6DFA1BE8492A5642C91FDF7E81B9634A4EEFF59E7E93B1B0E8F49DED45A72788866DFF71B1329FEEB4B6CDBF2C7166C7CBCA20B04300AE127C9940233E891712AC905ED6B43495717A2998EA8C4EEF4EC6C32DC9E774E8E66476F17D9C39ABAC59E8B583B1107B679E0BED078476E933A90CFCF80C89B831C0E054F86EAC7CA848E059662D938A4E12947E2E73B1FFEDD7125DD54BA463217ABC9C5F3399132AEC77B946C806429F6F812C10716D57DDE7B5D45CB2E5EB6E4DBB81D5A465054FA17E613CBE01AFB49EA593F33F1A696A774941CA1FF6F208577FE529F5E7592F39698C63BF6AE9D56CD2D93 Q = 0xB19C6D094E1210C92910F49AA083957FBE68C0CA4602896F50123FD776786275 Counter = 105 Seed = F770A4598FF756931FC529764513B103CE57D85F4AD8C5CF297C9B4D48241C5B P = 0xB636E5970383CECAB68840CCA8A909A29325C3924E2C187DD034222F9E1A43341061CA620F82787BD349FB8F380FC3F0ADB84BE116C695529114AECEE8A0A1B09E7EBB6888E6DA71F48EEFB3E9990E2D7BD36C1AA24FB10E011A193D6B5A1B226CF97FAB302E237ECB1DC824264DBA2E2285930005717C4E9A12CC1A1AC336C20619C4D06EC4E1E02E0D1D2D285661A7472D30C4282646506487CBE6A5C988EE8402D474713A7D8213EEB19A0719996BBFD3835EB8832EEAD5A3A340E61C52F00DDE1C98655A13839AD215D8F43C8E482317AF8B086C3D555FC8DBB2F595F2563520A0C6387661774E1E6CA5FE2626B26A2C4F99B7AFF043A091434DFD3275B7 Q = 0xFE9F06FA1901182AB00BF063BFF8FD4F736922CE830FD50FEE47EBBD21E291E9 Counter = 720 Seed = 3A66A430F23374CE3D2E758881C411C23DAD4A8CD6AD697056D24B8CFCC8C353 P = 0x8D636640981C2CE1935BD16AD3AA3CE2A6EFA26F23F07CEDA92766F80E82FA035C6CF44DC41E08FEA242C5CD5846D839BDF0C11D3A29EBACA00AAD844CD33A80448F1F96CEBE66B9963F7E3B5C976E29DC430BC5DDF5D2C198EB736339ADC14D5C8A3D22533D7C6A861B6A8B31C55E46804E4C2F95E2E9CC2BBB23BBC833995A7AFE619127D28FA53B0712B17DA4786F9116CC39E2C6254845E85513C220E368FE9C92BC71EABFA831062F01E66E8A970F043112CA0AF175F64D13FCFF2F087FFF9198A9FE9732001AB49B2A48D0E39F99D036698703AA853AC02C65F3D559935A72C8BBC6AB2FA59FF9A2FCD837A4675229ABED23D42BADC12A60B34A3BF0F5 Q = 0xB5F3C535E7F48D3251D353B73B3A05C4BDB4591A8C2F2BA4A6A945A889F5AEFF Counter = 137 Seed = 77EB88F087BFBBC312BCA7572BAFD36F2A7ACA2E4D7378DD923B0B277F3D730F P = 0x8FA95228B848A9533375E4789C88BB7DF505C4478ED3C79545C5D2B04F0E0EFBAC8D3F603603A48B203E1CC67DED22B840AC21BC41B7AB78C73A9CD0773148CA7C87A5A51564164F683E8F8A77B97CF7D91F989AA3668819BCA8F54E0EC8F10C78ECD26982048CF0AB0446A6DE154BBED8891BE916627D470061811CAF51BEF1B5BE8EF2B560CF981C2A097B3769BED61D6EE9B66221E956FE2C49F1809A2D5F6996BE7B39F41AFEA5184A73C049F3ABBD28FDDBF37BCAE6C4AA4A7255464C2EEE915C44B8D90D76E5D9E3D8E6CF4AC7C5D9436D19CCC27C5BC1B65DBB56723B5E77624489652313F9DA2CE38554401FDBD61C78F2A4FA69BCC2F5AAFFBFED2D Q = 0xED3F52BCE81572D126B27FB1E9C02346AE523532AF82B79943565593D6F46D45 Counter = 40 Seed = E0ED96BF5E7D78754B5095ED766A1BBC4338EAA8F3D00E9906EF51A8798BC1C2 P = 0xA80F2481A814D07EB47A7C67E24BC3F8F1CCEBC6CF684A0BC9FBB0054CC24CEF24872315B566630D5147184980B4BCE3F0849660C84B22DFACB785446C0F6314B7A53A92CF821BCCEB325E03DC9E404832146D34FF8A9B112ED0E69EFE69C6195DE03373E590EBA88FC5B9D337D6566DC7E82E326A28343F644779F6784159EB3D33F2DDF1157A02F2F91D0897A4E8AD53F614186A5FE043187510316904BD956966E10735D6EF01C195B7DD7FD245A83C18AF7908FEF0BCED2F454E1954F2A32C35658F4E0F5811A3D06C81CCA715537DEBABBBC65BA4DD0E7FB0C08397622F039A51DF69F5B10DDA61F57BBB84C55F25EACD0F3D8B40AE016ED0BA856837E7 Q = 0x9E3B5A7939082C95069902D3833DF8421871CA2DAB8A34F7BE6CD39151291D07 Counter = 722 Seed = C7BB440D973189CA07464B037FD309F68EC38BABA390988A2E986ECEE281E2F5 [256,3072] P = 0xA9A1BBDAF47BBF939394BE1A09C926F8454868724EA0E250C85391799107C8AD071CCA629B2176545EFD6627884426C3DC22D4A6DB9C2A598A2AAA0E073DA4B85A92D169FFB304106A1B0F7735DECA6982C2683AC968BEF6570FB07DDFF0B0EA899BA88295EB167BE900E41A6C8DF073BDFC986DE3ED164F3D723ED6A53EC920F27809B5B881C7A79DF6CA6C27F1E2A9B862B43DFC31CCCE1FA2FE5D52DDF309092BA6E74EF5BAF34BB958EE47D406454913DB0174B644F5494B88D550B648234268296816D5F13FCB0C9EC941CCEC2F89063546002FC595A823FBBF32935D04B7887A8BC551BCF09EE0DCDCFAFC92D3A905EF80105F578249164438689487AC029E1226017B8EF8237C47F1F760A7483EA9BDF5620C5A43A07E0C3AF5380DBBB6460C52838ED212554BA77817C695D6BEACFC07819899C5F402E947CABF8D066AB2814B00B8D8EDAE3D80EDE581C45D7BF61F6D04C570328852090FF294CD91D2471C3226C55995C508348549606731A534487F81F29FAD798653CBCFA450BF Q = 0xA0CB348B7AB4557E615F6EB6456897DC1EFC788789C412171C1C694A10A31387 Counter = 857 Seed = B167BEEDE890505C69F3671195F5E3242C03BF9CE89EBCD6D2231E95DAFCE2ED P = 0xE4B20E906D7100659E348C25170E8B2005CAFCB505F61B11CE00289185090725A36279D4F30B6E1C461CC6FF791DA04E040DD1E59846F77256517D06C7F026AE98E5B257CFD5D439F18AE33846903114EBE1C14474C01B2763995F90FEB4B498465F0B666348FDB6748C469B156A62A6C3460713E33FA510E0F25199448DED51D8C9F03CC496BE3753601F4A36D2492308824C00036A2B2474AA1C9E715C0AAB1D8EAE4ED7968953BC3B55C9640F0297AB702314AAD32F44E58AC033497205FE512FE0B07B316ED131760CD430F9D721C2C1381785E49B93CDC711C330CEB5A214F0EDD97074528E0DE4C88BB5EEB105BB062270ED2E2E50FA960698285A2B43B067C49C92469E39582B49E457418E0C59772753ED5F41A1E1A50C943536FD359D517A28A4B6CAC7CA24A9ED27879E5E750782F40B09D2BF7B13823F1A8BA52C3A02B1BBDF8C96BE27F8738F0EE719D5ED8348EF7570057A926BC361B254586CA372CF1C47AB5BE2611D754B9D4A74CB3E45FC94522CB64C2F7934CCD7C81023 Q = 0xC688DD65FB0C5B9D9E535C77598D918909EB955FB925C4E30616C25C65C7F4D7 Counter = 2455 Seed = C4AE29DB448E0B111E9FCD8626DA16C1CC47229E64BAF2CB93D4927B1F9C1E8B P = 0xC8FEF9916D26FD6104164BE6C3104E1041828C7CD158F2FD4079329E7540EE385B64E66A717850BB728B2CD731B7B1E60F29B0C5CBA3F7C81EB5324A5B7EC27DC3DE8687932FB195B32F4E3E4AFCE237E50F821BDAF80FD93A9EE4337C0495D34EA74067565D297FBBC175091F439FE2E4FA6606469F86BB11A09DDB448E63F8E4F03E9068DD34C2602B9377E7D91A683C5866125621F039DFE1E7DA25184A1753FBEFCD5DF01EA522394ED6FB263712E1B1D54D2F5AA1D3F651D37B7BD35648D6D80D5658B89DA15E89271A143808AA43BB9CE832FE373538BF88DE0637E12B36C37E6C1AAE1D4FB1AB6A1AB43C07262CC4D3C2EB116184ECF64C7C6431AA4ED22537B074BAEA4DACCD1163121DC0523B94C7819D6F22B119D1573BE012092D5B69267FF355DEE653CAB4ED575824FE53435DC8A92624A1DAA7A578E58206FC7BB56048FBB9874C62B5C680AF4DF7C881D9D93D725DDC586BBF004D49184C94F01E4A938EC24B42926827ED4BCCFEA87288686F38BC04FB24B376637BB10A45 Q = 0xE28110722C105D8A453F7F15CA89BBB5E27783F35BDD3A8D2EFA3C0358293F75 Counter = 290 Seed = 1915C7D89BF0856CE36D417055822F180E173CD78E032C8FB30D0E8EDCB261DB P = 0x8E6C12B3B028AEAF88F21075C96BD8DE0DE9D31FA75D6BA3B349DB4163C7F80D5A53DC7118151F5B904834AF045A9C824EFDAAB2D5449D2E805F7AD0AA60D0AC260DA9C3182A25A215723B7C85873888395532B8E7ABC4E93903E3A99911063EF56E8BB25C3DE19C0B5A16C451A9EF4500BA60D7210458248E6D51CB2BC56F2CC9164DA87695F6CD8450CB07DE604F7390A78C1A3BD8083ADB572B2FA9AFE5CB0DF877D415004D50F1338F3BD3394272BA595510740DDE8C636FC63E7FED469717E6DC418E93B4BE3A136CDCE039557A01ECB1CFD31DC8699D02328E252C4DF020D1DC23B13BC8D1B8C8791D779CCEE874EDBF1E42E8CB6C319DC0043A7583E4FE7A1677B7ACF7B0DAAC11DB0F5DEE9CB90AE35DCBE582716625A934B45979BA8ECE0DD541C8D5D2E2452F047967766D9A1FE9A825811E278769BD26407E8F838AF5BD60F34072B6776E3AB2369B1994A1232B8F6BE8438D4BB7F4F50873866E55AF79BC10B4061574F2BAAA254D7097D40691B926FBC244A7A227FCDDB4B783 Q = 0x8BE8E9C283397DE23A1F718E91BCB44341893D269C2F55BB55131AE60D4827DD Counter = 156 Seed = 2159910828C9E9923393CD1426326BEF50FC8AB823641D628B4FBA027B6A43C6 P = 0xEE110644C8EFEEF9F1DC19E42DBE4A32FB85E43ABF3B4A2972443F5E6F3852A71401C76DE97233977FFB9F139471FF51F1DCCC60DE0746031DD09233F017013B80D2DD7D5C5BE4EB2F9D55D7DF41DBB75EACEF314D739BC54C1E4D47356AFB8E72222EA95D9081679DC55B0376818F54E94C23C44F723C081B35025C06F6F3E67FF53A04F0A668FBBE3A421F23C48466468DD9D3E61E87EF8ED4D74FFEA4CF07DEA19157CF0370FB67778F9ADA58FA0771A538A66CAA022221ED7E8407CC65793290028AEDEEC7A4EDE15D96577F573B08D4CF630FF54BCF7B3237872645704547E10B0646D9192A795A88DF547B2B1DB54FA11F5BE42487E8BB78E19795B82553892666E9B0E9D0001C3CD4AD8CFA4580C1E79CFA719C00BE114D2D1FD6EB29BF7A58DE95F3C0977AEB128B0D0E31C1F34AB30D0DEC1AD74A3EBFAFE6D48784AE66A592E84A460E43A2A23A6DF6FAE65D83B03D794D044D0176A75415AA9B3A5E1EBF9930C2F5EEDBE00E633A1367E382203165219A3D4476A2096600E005C3 Q = 0x927F85A4CF3768EAD1D8F21E884386A95DA784F4904C8D5F9EFC701C5AA01703 Counter = 3710 Seed = F4F0FA605C985CFA4D5D3D8731B96406CA261A10BDBCE3E6145E9D12C041DA15 botan-2.4.0/src/tests/data/bn/gcd.vec000066400000000000000000000000471322470703100173150ustar00rootroot00000000000000[GCD] X = 259 Y = 4943984437 GCD = 259 botan-2.4.0/src/tests/data/bn/invmod.vec000066400000000000000000000652421322470703100200640ustar00rootroot00000000000000 Input = 10 Modulus = 37 Output = 26 Input = 5 Modulus = 0x7fffffffffffffffffffffffffffffff Output = 0x33333333333333333333333333333333 Input = 333 Modulus = 0x7fffffffffffffffffffffffffffffff Output = 0x17d4f2ee517d4f2ee517d4f2ee517d4f Input = 0x435b21e35ccd62dbdbafa1368cf742f0 Modulus = 0x7fffffffffffffffffffffffffffffff Output = 0x604ddb74e5a55e559a7320e45b06eaf6 Input = 2 Modulus = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff Output = 0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Input = 3 Modulus = 8 Output = 3 Input = 46 Modulus = 207 Output = 0 Input = 2 Modulus = 2 Output = 0 Input = 0 Modulus = 2 Output = 0 Input = 46 Modulus = 46 Output = 0 Input = 1 Modulus = 7 Output = 1 Input = 35 Modulus = 118 Output = 27 Input = 37 Modulus = 37 Output = 0 Input = 32 Modulus = 247 Output = 193 Input = 3 Modulus = 232 Output = 155 Input = 4 Modulus = 49 Output = 37 Input = 13 Modulus = 32 Output = 5 Input = 0 Modulus = 128 Output = 0 Input = 9 Modulus = 30 Output = 0 Input = 72 Modulus = 209 Output = 90 Input = 128 Modulus = 128 Output = 0 Input = 186 Modulus = 196 Output = 0 Input = 244 Modulus = 255 Output = 139 Input = 30 Modulus = 4 Output = 0 Input = 137 Modulus = 255 Output = 188 Input = 1 Modulus = 2 Output = 1 Input = 4096 Modulus = 4096 Output = 0 Input = 1024 Modulus = 47680 Output = 0 Input = 2559 Modulus = 32768 Output = 30207 Input = 1140 Modulus = 30291 Output = 0 Input = 65407 Modulus = 65535 Output = 65023 Input = 114 Modulus = 58099 Output = 45358 Input = 32133 Modulus = 63186 Output = 0 Input = 74872531 Modulus = 81122052 Output = 30251239 Input = 138512891904 Modulus = 274928246166 Output = 0 Input = 19155854819583 Modulus = 132457537501314 Output = 0 Input = 321702216162685863 Modulus = 14351210277666964779 Output = 0 Input = 5702088828586291675473844 Modulus = 120659954327758016144051200 Output = 0 Input = 1381154561843139772565402723 Modulus = 12938817738268038125359303680 Output = 10831558789389249705155777867 Input = 1381154561843139888563074147 Modulus = 12938817738268038125359303680 Output = 7483361061048530345279266123 Input = 353575671723906404908937929663 Modulus = 16379577634673855538078375747588 Output = 5424925150363389436398213907807 Input = 353575567831843781776743228351 Modulus = 16379577634673855538078392516612 Output = 14507030634574599508195160259031 Input = 5932013609900586720416866717974463606 Modulus = 157985104902351897599664760919956858813 Output = 137384145053796253507992509511633346213 Input = 5934358449498290280944615319455483461 Modulus = 57179984906444735091851033144201922117 Output = 0 Input = 5934358449498290225604383098326828613 Modulus = 57179984906444735091851033144201922117 Output = 22697271185327139532492607909525549995 Input = 5337771685919167754137485072704672701 Modulus = 91798092946582745705792136535843674047 Output = 59431059125715532913707527689895128976 Input = 1518595342835455146359363196561036567315 Modulus = 1519074226426779905418220868297910704851 Output = 216491286795930710742743091756865590062 Input = 1518595484134550200412310463687399691719 Modulus = 17407187612354188700325529915223044339062 Output = 1050533998594910199482332672766948626657 Input = 388760448127871507875122837108613066470355 Modulus = 1205204643250808245658101759109363337082125 Output = 0 Input = 1669713237405268049741347488485456028639902377366485 Modulus = 1669713237405268049741347488485456051491443372861914 Output = 0 Input = 398637512861752899234215521190349285850377557036019453 Modulus = 16913607322884231003972700698661394372993528197172294202 Output = 0 Input = 427446633136819657617260277185660440274378810199477422 Modulus = 22277341715914872633639938175673308140803023434155684410 Output = 0 Input = 427446633136819657617260277185660440274378810199477422 Modulus = 22287254121160404973555300255783629234241223241182435826 Output = 0 Input = 501745196544693333667845974244235246008943272210392616196 Modulus = 2904735607707890026261611817935915992469970191014850947972 Output = 0 Input = 109426338083025832350018630959529072710240976222272457902 Modulus = 5705537055017063673485368640671312931563284105316529730301 Output = 5695753835642879025591354374573295050013429342942614892889 Input = 109426338083025832350018630959529072710240976222004022446 Modulus = 5705537055017063673230156865480609083965753149742703571514 Output = 0 Input = 109426338083025832350018630901655375873649448370738400256 Modulus = 4288754839891794986644564190212897590922742990432574752754 Output = 0 Input = 109426338083025832350018630901655375873649448370746788864 Modulus = 4288754839891794986644564190212897590922742990431244999154 Output = 0 Input = 429747653614002181966414089209712982200249648235674175114240 Modulus = 1097921239012299516581200498361588539641167746809967002778365 Output = 0 Input = 128446770315441505302296835548258594011134896122159507189900 Modulus = 1097921239012299516581008432694501783276222205555137183216381 Output = 219986048331980802027209140807303911225451864530554188903277 Input = 447584410955856452287246880854680494947482540748015423869816571904 Modulus = 18419847922728001223206182587888235679730764835068434316526345646845 Output = 16386496642885036091412630273282093035304875618431351485989854789299 Input = 120315531212506540057801504581627182706278848112115921099023419126567 Modulus = 4917144330588045510247020374629314082052158446827629926348911518083253 Output = 3030994927256014025585180874866267837614610672488319046753359416923727 Input = 120315531212506540151337609370804969471314677405958034357003101877031 Modulus = 4917144330588045510247020374629314082052158446827629926348911518083253 Output = 1978340046947507049724294929115365995519252306444332739172815061269905 Input = 30800775689904259978366003646549413560882720299856084749809937678542774 Modulus = 683805059752202575388582136495557799968573023717901967390987274718734517 Output = 240370388046193083071523850481338147926965153332870744069927460655307604 Input = 30800775689904259978366003646549413560882720299853494522153407396128694 Modulus = 683805059752202575388582136495557799968573023717901967390987274718734517 Output = 0 Input = 2018553874361367298145675409666425880684412740908097248429230021370327373523 Modulus = 6257666956854245571156623954291389062506272145414502920943420771994563664370 Output = 0 Input = 516749791828359856733133733624844442703531546106337463854768039123921209956051 Modulus = 1601962740954792178511279624863457282526760780831042080841950423849414971486890 Output = 230856667976269565713982212321537105076636815227442434506602290800184534213641 Input = 516749791836510028325292904874605025455209661672472895597882885470803807621901 Modulus = 24746388702611539381672292566441357946089217895509840464189771861463679375110909 Output = 17482785185421985832903984836155740711949111142021976010578203746370663639655032 Input = 516575657702705444731828386286990358576255653930522141564916289533307771382064 Modulus = 603181592709262078391140809535865498758742038698079163361470567680606867977769 Output = 105419531729149402170799132522495848121272857883374311753321274212623545604949 Input = 132288324028608818260037095126080946034233855342093709875606820327738110818023086 Modulus = 6897521130957919784109871897567803339329188714187867447487427052852736664272961540 Output = 0 Input = 132288324028608818256735679253395542641946101624833780903489523173168169220732590 Modulus = 6897521130957919784109871897567803339306887968988951458563421952842033304992546820 Output = 0 Input = 33865810951323857474248200236739055225453272871677899054758364817644205578097438440 Modulus = 1336761842089086518109402297011132364678426286505650097463614087821831304082721080409 Output = 680666261615799093246158924451816069866890139937374621105160904708555004808872202064 Input = 2219429786505960323453386512955361468569996645477400738428081850052714778763400741660596 Modulus = 74644623621998485568522014429595573410825194841129784518044354291189647009980996806247513 Output = 44980859362445889697874871437022415086249938228081799228533960589115470984822921835420815 Input = 2219429812369474322430006541114271756689646905654694692874967400462416146465741367015669 Modulus = 118092432322492914932166433872615993294711576417113721780743884693098072952657666087829496 Output = 0 Input = 2219429812369474322430006541114271756689646905654694692874967400462416146465741367015669 Modulus = 118092432322492914932166433872615993486273519025328051004054323025225064930124423195246584 Output = 45554954757410401208183175617376407821900801172665808021586586851454842588833978502168381 Input = 2440288857295708594745377736385929488579489395798787318892313085465840721878121394228126672333164055 Modulus = 104970984129146665904184575634746492964433139288576813336730565768174676479178423783477659219299550507 Output = 14671453223764321804593410809299055027442412830061447237871472648065404002626509643617206325928242157 Input = 2440288857295708594743071234232271526631042852992193925231356433333781999635808984537840067696377294 Modulus = 12986734574256797728830108804499551338924248129086953933619255599680620873522117850067270334882334277 Output = 6554368278035291249140934335351561402189972344559266201163693625171000098909390791642663612309462516 Input = 624713947467701400254226235682127135775643248943076541731739846015600641875659168554387910069460385230 Modulus = 3324604051009740218580507853960719378088499442694176694510244026097376363106040264407829236736340673835 Output = 0 Input = 624713947467701400260173945111908685932360782177717690976575045326828454951882043159509843243856609813 Modulus = 7776049929827457451467496338135650250962349341177051611687883759673088834047281293954394577019598147015 Output = 895035322328725504836539011082424952178122994196309825247180108627498779687317427001231304898218276652 Input = 174344864248944721489958363894350825562866724078548959857881058699744850016662729466417206099821693688531 Modulus = 7661023828498798868556002291749556932049635612657205994496375464376857552595554625487435582985529312359172 Output = 5806684388544048054125065739585226489316822423636709060201946836231324705392016785107101386413247098745119 Input = 40941253261243278965931697730351927594382506715029209939426764755460358380477075894159326884619186448292356 Modulus = 1086765801118506491796991686050760953569583839419629831222695852915818100252554264051906135666050956354901366 Output = 0 Input = 40941253738340902553376751414201639531564244122970842592205881780688821929846131679632199139828789928988117 Modulus = 1827457991855811955608734510184894757331810307756991048284972553624554653552789759060220911277882659102730166 Output = 1331087776473769984814382583670464156187083826442474849062893066109367982063099320751011417022384993153415825 Input = 10480960948068504396786706826959925758002177063712953571288012560541553307760359175828116110276727516707361725 Modulus = 162193201041305370619623369415020258472052982947477384875437355642168759791173509808267455016478387343904290061 Output = 125488009689869893055514052704882236567346149973601535779502954396698947032027865786265777615854760770492993503 Input = 10480960941706184992684052656026024263059955258137042998736844699782705389874823178306919324842189179921022277 Modulus = 36800733063304504947530639673895045066268010254690970457128754056241144976366275410605967734997426817889804553 Output = 33991242570706707667236447768169953772356195464917699049157480345156600208304903373255110451365189326397706940 Input = 10480960948068504396786706826959925758002177063712953571000669646629199146818169108237433123940798550253134611 Modulus = 444508115338009329899869791332552066699503593957693859395799275928077740507526172912896740812150716216612361525 Output = 229422040019717816724385415959976143888072276766483681458489278087868059152678335062896497134334948877411270716 Input = 2683125973728839530410853301807034138280004443466549776569040186904529414653869226507070116307346296826701462843 Modulus = 9420987747486698640753167661409834276396286467108085298166099145382701362524685042206451251623166080499314590809 Output = 0 Input = 2683123638565830462460506169221826092145216215896529855147200521854078452067928158614878658280170139562030818067 Modulus = 113794077526530388454366666581133329075072913151423281214760827202832039292901247814592593477524028188928540751117 Output = 3181486834656041655145545362874773634212349894644732034073302286025476172065758951953852478418188291211797486275 Input = 175841343814293227463337396549876322236244208719130555573598557313362842128874981016665540944889785822973085152081626 Modulus = 175841345716725740901266386006418580327847298194448328832436829433160509229071929085803614947045047568175391540184369 Output = 103159671532181294917126266681690917401639083406905320864457007930136703451131595164838824937123885993273545750347887 Input = 12670704167654052015845325422070891900662783414983596587592474314149877175763413155061623761411194025613895820745242772234057580726020 Modulus = 606221634145623926473919998643879129750919828439756826073755496676782745487925171120694260293421283243727657829432340823463542485798589 Output = 325119450519985844425909572170305791701047266400642711471239149199438072162899305362050335737076107753276444743032360627349555423787931 Input = 12670704167654052015845325422070891900662783414984719693045792313769002489678295501929526402863659914306935770940769577844214769043204 Modulus = 606221634145623926473919998643879129750919828439756826073755496676782745487925171120694260293421283243727657829432340823463542485798589 Output = 162543323075020638720519638197497742575019900954984468715810309041120093594867545829236446866300288119285790744320542764125135244156981 Input = 12670704167654052015965536579770034324541704455061660429923794460460341071193665713413983606963240760597816072507527959641663504516214 Modulus = 337454135939991025440974553646717829281524882790617748764239353742205007300592705472124431326524609819324355028428975161808528390037849 Output = 191711558709124308853092629503802489439994943269065022875433763199809530621552208486996585886323969976100835646879332044251700256326309 Input = 12670704167654052015965536579770034324541704455061660429923794460460341071193665713413983606963240760602067816258079825863938137261174 Modulus = 337454135939991025440974553646717829281524882790617748764239353742205007300592705472124431326524609819324355028428975161808528390037849 Output = 163693130905945285938988905228226250828273725899357147098175833065878084985776552043008740885736315718974779741438948154794721438148333 Input = 12670702989237218183341572262206915647533368853924924421167416877400766157633821648558382651553829793446525243175304655977987577597629 Modulus = 167687398787919443409866707360476378449752341914087357427971443623903047452096448980661191233382697808852666283644507610837240047040000 Output = 26198363272887968265940405540523842553509526493465790830756895829780101651098509764093686156106754698233652421236390724215879994168469 Input = 12670704167654052015965536570667711692322764443998551364056934060872219934893776122673632570190222085724697272254755827205369260066564 Modulus = 606221637803025680493984397679069247334976533760816329195168119804134985845650008885036440742774482985029824942508972670651152886527301 Output = 297930981346508308077060079178174886176222582315143236987824758631343982491425412096700368075441527214462789116899500434073448626618530 Input = 12670704167654052015965538056854719708558076267706352788692116955286879648768407539809619705633212182437317125252278993694382910550276 Modulus = 336342546698155082654269384583033370776885134193636605638177346446051485806771236878044696175041955889906264146135604515316441509737229 Output = 29710044402085162860891499731695053324316818348984827944724119676181685719272546131255090112316139702050062657510519937889997921906159 Input = 3243699965244727854935442499124970405768542426604780651818858720614596136354258342030945958797780427122310462252877991930364819864993083 Modulus = 11389275204242166570296397818219070268029184759653233506843010684964215946998864293695607841302097194516968066020196084347787198871240922 Output = 483591083989379416679317068734053688860281901954527928305263453528993668286833500291846735116390084353318216960908267093197048470036743 Input = 3243700266919437316087177360191581473604369293032148978313282628288335262565236947493270196986858243706779730869259692618751754378228181 Modulus = 3243700266919437316087177362090931103399581068991671456033441152428988454889605507406578036965997831201809880401632845937544163420585976 Output = 449060048386417315556394965326128672171631836284095117350216923675237728024398263909109484579299678269625591699229336450872865194323637 Input = 3243700266919437316087177339054698228639870242026823607209249381907192322390358111127651453196977017675303739695968707155833427090813397 Modulus = 3243700266919437316087177362090931103399581590472881397645358650534558602876696054665220994381953359355747865910186032576092817744795392 Output = 0 Input = 3243700266919437316087177360191581473604369293032148978313282628288335262565236947493270196986858243706779730869259692618751754378228181 Modulus = 3243700266919437316087177362090931103399581068991671456016920565812462370075886825489312215902273196503792806639937478375291357746364607 Output = 3157041632843012029465702023283791371264148713411255488074811690511564911257807788682362419224137866030050138559022401908183637088122824 Input = 212579143170064736106724466048066242405299697436791465656542089487055881314661687430341292684130268725793673549873700992745674410838458676835 Modulus = 844997306004696299163250002830100139030348530362999974488110411361897392393441731673049146104379650124523380126570415543028845994017541884951 Output = 90042235909796313403246556199691336938493895751400881926820715389171546316664666331065524557220306769957141954034246936126593423009778492097 Input = 212579140692832243947089255477514437600310826182873368129100406886016368038146703549104757192658331666470621286035437743508249620000677901269 Modulus = 212579140692832243947089255601991260792394944937438180541524906201085533885293318995267565381371376206072565375985272109043219755131134277633 Output = 0 Input = 54420254956103292083468584863399439491211255648989633569523402232939245802500760498455401325139167651579119489900155965029176878846320571736851 Modulus = 54420260603921895262307603061793317526979980494932414591353666780735468654003386549760438780834180108541862023256313090099416246305693809014390 Output = 0 Input = 54420254956103292083468584863399439491211255648989633569523402232939245802500760498455401325210906825850012340319437994540483733755046361000753 Modulus = 256336217163667176926876972997634287983241265237416297039263798452300641972142161771275190851121822113753466891563172055516236664423544493913672 Output = 249639626948404897201823460023898793153629336460540363030077448597026689603245693346932367321470555276067421656053664922053243876390131473446873 Input = 54420254956103292083468584863399439491186482296317701382448707730966199154858999157632326082911261173810376293488399909176234857795870840810288 Modulus = 256336217163667176926876972997634287983241265237416297039265741121192867701221637856880084641447670360341817253710334094427270183998162469336648 Output = 0 Input = 13931585268762442773367957725030256509743739467857331553906869179127346983643903784353875477225282860495475568307972621209572000974690624264170288 Modulus = 65622071593898797293280505087394377723709763900778572042052029727025374131512739291361301668210603612247505216949845528173381167103529592150181892 Output = 0 Input = 13931585268762442773367957725030256509743739467856013249408136742435868806184627263908144120527890863864023878565644844972566761885223327351139120 Modulus = 65622071593898797293280505087394377723709763900778572042052029727025374131512739291361301668210603612247505216949845528173381167103529592150181892 Output = 0 Input = 13931585268762442773367957725030256509743739467857331553906869179127346983643903784353875477225282860495475568307972621209572000974690624264168240 Modulus = 65622071593898797293280505087394377723709763900778572042052029727025374131512739291361301668210603612247505216949845528173381167103529592150181892 Output = 0 Input = 13931585268762442773367957725030256509750081446141346193797990971632446925440194687604582739253992147417603159121776126602363835841291868416192789 Modulus = 16730121539317871172342595004898637565235943632429535746364480423976404391809513119844122219725846478363671751446058715749646063015087460587030532 Output = 8368839406516452903756209946387051915318092352613260941427082358204889953591454325300261134875605405619265486617635344461020949591704829610078857 Input = 13931585268762442773367957725030256509743739467856013249408136742406226031339874317879709948365666759453586762491240860578465620379197566163315504 Modulus = 65622071593898797293280505087394377723709763900778572042052029727025374131512739291361301668210603612247505216949845528173381167103529592150181892 Output = 0 Input = 13931585268762442773367957725030256509743739467856013249408136742406226031339874317879709948365666759453586762491240860578465620379197566163315504 Modulus = 66678074992355212492972477291024620123383756538597841786987539665612484157508055762732736048062074482866560403796977768634854512109825703485523972 Output = 0 Input = 13931585268762442773367957725030256509743739467856013216815561121084091425885398337464686646455607178915816884525004809350238618063087562247596848 Modulus = 65622071593898797293280505087394377723709466380015330877919971303570420327685353316309565046385115573376824350924295230220650294110007404242875976 Output = 0 Input = 3565274158390580065942252346975669440938570360129990072320275485940842272191709980043975960127547030171850555745080176460848825984881566457811907367 Modulus = 145688282393878974430665689139064885117858316327080109277467955124143504677560965946882000623252634720746281075244998531385210785658090895818056194564 Output = 43438737258420936317490294961909303833113784064184692921563182443635630254111925849114347993545550274938073634834329985553660946703546560573655654007 Input = 912710184547988496881216600825771376880274012193277458513990524400855621681077754891257845792652039723993742270740525173977299452129681013199848286134 Modulus = 15713824771687342809698206255786485333683596080267863418114080029798682342046700396218545307354345786371389163105225982679575627140243491932139431789762 Output = 0 Input = 233733237014399300369188485549408548707200621216984258931687413984830484753821051332657625023527910057464522415960516664867757108351270781191467590883202 Modulus = 10054298972755544659485066725967268548008616514652163326495271260864146681036310799605073854973249929469361057842044668698454869002271645012663132873907133 Output = 620882166792703801524880332577262430527517439863282425521418541021955396481806289566340355534315491854438786044236069081190778891233315424075315757454073 Input = 59835708675686221045238484644891074710234144677552744580679785722661736462389632942830849948755169642469193170273341697814434896098588685326909548863140963 Modulus = 560548058342384653516138841752073907202772434357101785120224583491028267040408881144439370757006310834756188600910656519013411465381139862670982471083144537 Output = 0 Input = 59835708675686221045238484644891074710234144677552744580679785722661736462389632942830849948755169642469193170273341697814434896098588685326909548863140963 Modulus = 560548058342384653516138841752073907202772434375890125782415249314144111814723577363444831148272869800414516373168328719930279013090731849749132095338624345 Output = 288023766490940907070774297709765545835695374314184667906398931065048827967212438748434110695077482481115046757153955195126855193182401539977598570719366082 Input = 59835708675686221045238484644891074710234144677552744580679785722661736462389632942830849948755169642469193170273341697814434896098588685326909548863133620 Modulus = 1329562625917217052910625892172972805320468046060354367470357100999393164351121456188872082076817065193809999859517335386441451745128184853985391399246542169 Output = 381713838721853045446210203844423377670324724248927516157282410794719510877064196966980704814908957683956798786487518153099133074885711884655550527759550430 Input = 59835708675686221045238484644891074710234144677552744580679785722661736462389632942830849948755169423386450887295030158247968377858059093320263472532799412 Modulus = 1329562625917217052910625892172972805320468046060354373242758460207716468145407747895356021810542995243011420322184426286549030536919355502285489776879994037 Output = 429120447050565987746412325409285848633834383862848647673075659002103958346518394681058275344884177230216756280389240460261076822349464793777793710991503298 Input = 1003876608965061678699711946147886654583641732725152055443736136924435209627532864239270914864015791089404522769082846488734344028870871147591294567957336933874447 Modulus = 38559908546177557097721887170920227103445446555000857278913354277871570496513672104938789008277024176040539351265087009160346781667312151853605764324217740094077027 Output = 22021865938391910485941892422896656563178490407870702806681467808543133124575786358977213033733395001560210688051383463281574121289968876209220866045352476996915155 Input = 1003876608965061678699711946147886654583641732725152055443736136924435209627532864239270914864015791089404522769082846488734344028870871147591257674469189514771215 Modulus = 38559908546177557097721887170920227103445446555000857278913354277871570496448935788684380892123429716176828299867412807353949428457861805829557796944238651899902051 Output = 14368357982601202000692544778087762210345344180879650981792676369928984774193668445375836726390068568445200182203560018327610606626783407610687993223051460237027758 Input = 256992387993922882115519242002267204163958280694902854777438773165028812741820300742384101620467227297951260702776745365693102268609333941403372929142489383748076291 Modulus = 3105560673298506328472089385746585896322911006740772751605160752499227148385424850362140158165019680645739648726058090243814223511639161631852729287604717869259565828 Output = 2322484593360248972803085811686365806060063797313230509497970163285203519904646342173323688226147654544918783691327115436052292182385106099615339567513136063879840431 Input = 65790051326444257821572925952580404270899173102825542663868894627884582709571518677209748416019817305674876843604308670298295897660589296995641401495105646770364032950 Modulus = 1460598742727828605836860681156746006166272494387112693708892744343548055514972863039476201659720247220048664250204314648520085411164461712526657028588699682983099362771 Output = 370134468809235355809931021496418560257927761651782631431723120822241707286126622619231228275210678415132318220494260963802381448709723310690465171935975287188943190781 botan-2.4.0/src/tests/data/bn/isprime.vec000066400000000000000000000502361322470703100202350ustar00rootroot00000000000000[Prime] X = 2 X = 3 X = 5 X = 7 X = 0x101 X = 0xFFF1 # First prime not in lookup table X = 0x10001 # Misc random primes X = 14316557441 X = 151601382993659001523 X = 2199163969452631049452040286673993338197 X = 16507654986299102863 X = 316362908763458525001406154038726382279 X = 0x908EF92E5453DD53 X = 0xC892038CD8BD587BA244C45B X = 0x8055A641BA9041BA0D10166579D42F6B X = 0xFCEEE64D4D40D734058A51944F2B53152FFE7F15 X = 0xEE23CE225FDEE2080403C2358C17A72D57C5B7CBE171D6D2BA59FE82DAABA9D3 [NonPrime] X = 0 X = 1 X = 4 X = 255 X = 0xFFED X = 0x100000001 X = 0x1043F9AC97177F7BD0B6876E1747CD0A6CF3B5DBD5306E6D2BA59FE82DAABA9D3 X = 0x24F08CFE94F236901 X = 0x1C443F2F861D29C3B X = 0x2BF2F5F313B1784CAC2B5CF9532AA6CFA27DFC0F3 X = 0x95D9E7C08BF3FA230171B6188BBC154FC879D340687A52C6B35424B471E28449091A7D784F9F X = 0x886353EE3F610EA9DC507EBC572E2F659D76E1459F175556D93795683BA72A6679491C328076CF X = 0x168E8FA52C7B0274DDC9A7B6BB14FB2437B91638CB25161BD004EF43565B5231FAF88E13AB885AE0E7C20FC96BA3BE15436F03D1603 X = 0x1DA20BCB5DE084D2DDA31B118D671342B828052EF5D39AEB65904E9F6027000D3A00F88658EA1EC52A10CF32D8892ED16F2BB9E110F6C9555ABB069BA7A069C6F1FE46873E957 X = 0x7215D1519157B349829486479DCA81AF352EFE7B516C0079D4213F1554FEA6FE81A5E099B528536361EB5B5ECEC96CC3183CB21B3E4A045F50A5D18BAF5CA154E856D88A2D6082E93BA5AF650E20C3C2873A98AFD9D54843C02547157 X = 0x36133736D1 X = 0x8DD3F98C901 X = 0x53251 # The following non-prime values (and commentary) are from Google's Wycheproof tests # If p is prime then the Mersenne number 2^p-1 is pseudoprime for base 2. X = 147573952589676412927 X = 2361183241434822606847 # pseudoprime squares derived from Wiefrich primes X = 1194649 X = 12327121 # G. Jaeschke: "On strong pseudoprimes to several bases", Math o. comp. v.61, p 915-926 X = 2152302898747 X = 3474749660383 X = 341550071728321 X = 41234316135705689041 X = 1553360566073143205541002401 X = 56897193526942024370326972321 # A list of strong pseudoprimes to 12 or more bases from # https://arxiv.org/pdf/1509.00864v1.pdf X = 164280218643672633986221 X = 2995741773170734841812261 X = 3110269097300703345712981 X = 318665857834031151167461 X = 3317044064679887385961981 X = 3404730287403079539471001 X = 360681321802296925566181 X = 552727880697763694556181 X = 667636712015520329618581 X = 7395010240794120709381 # Richarg G.E. Pinch, "Some primality testing algorithms" # Some composites that passed Maple V's primality test. X = 10710604680091 X = 4498414682539051 X = 6830509209595831 # Composites that passed the primality test of Mathematica 2.0 X = 38200901201 X = 6646915915638769 # Composites that passed Axioms primality tests X = 168790877523676911809192454171451 X = 68528663395046912244223605902738356719751082784386681071 # A composite q that was acceptied by Gnu Crypto. p = 2*q + 1 is prime and could have been # used to break the SRP with that library. # http://www.iacr.org/archive/pkc2005/33860010/33860010.pdf X = 233827489457314527331467907356100405232549379971733249650087398191542695662679115657626701477211734957066864835979560428632968558985491020031718032728786934761830612407539788738389834804112831048493371292441426451179971550359625305463829009730525437856060434572821557303838067028455480173152174543909940520352338084540532209678251 # The following pseudoprimes are 1024 to 1280 bits long and pass the MR test for # about 1/4 of all bases. X = 173062611414399390658232917862739135524848544363998436303084727513085426673093684058028234312597183385536670796001184814581807178685660312964257923307841168376622412972295432300191118906455596063609936643031721065109822926173698786848786582094520943139138009108180649097618810676094425505547347369635059151651 X = 136099885892399458477080305673739378689483245066221584061455921570784014696997016196935523316168750387027856624173915737138040384334162971247398689854706029275431407028615888533012918610480990022386148796379692392850397246576121436088869385931427080895536740913457414488449790876563256100025424908640036566991 X = 316688375608386437421379757779276540412122545033442874913608227262770470335539825484056485495303653581675917765425776336382516484708794514891794859629545011811469601460428778510574606216627610930594654525686171019765270172220260057282202615710851069446603121873496655525294839125742517721479483987924741221051 X = 186785694002678642132801225656186719643704247017683123340863572840120481332740690296425537870889503100273775347189620291247182266051117402306961193255486702389001315623336948708913938663766675822604289835221988612387022254700737033287973420727356494651195431833673259400609717994958747847898007198993092012403 X = 179639066126300967799401671841610886660929207919727738745232300602750546404186962234806423243160992149524026517310832658546103698224730515713772933976457906751697355710699183284927973990745341231158578954614781007101406949906000339898234046606680082274669864309065127941774208780103317444828873858305613764441 X = 197194524085561523935938577984854327845985252162946770376109467281189594776245829996960570423566272168211942090903965989665312046718418693934025583647341695134065566474352554207810854787929284015042099758637116781199978266343468760679551811591367813147177875984898571603525952885934025286780854976730638309011 X = 315000813248346168693407625056991248935216183936964838573658781159971838226732674288265941973610843971773212814194827628754750849549588421903702315436565970387119142993552663715551586581960248038598579837710301034898247047182667956083431512960522212612279266245495948831504762364224662571600318327270033084451 X = 170894610236614232071564956494126711146504551032906128147621274032573410076795759093464783793540456868246805453794432693438608747656833753674500442989626468892341565281803639470271121897646438029795161418432797979461569692919748848065959091755776480614225664177795195470929762281195447906351417368682849843661 X = 344000370199347416505163474679365912312228588642939088787442579805396287970863997000504005120780533350535874773754291779072767657299212000552180980839328379536622696237474649639004862671352175928935249466938367953074872370682165966418566130395323376736516767872755699135674189217223109386132423577475778316621 X = 138448909343722671880314351740830916278120326372935587281862834944695264415850785820375793931599456884131330850309445163053132348118439725196722488178936032989162127096990828542718648126854836321501499457100367916779232817286863221952600626787469684939436451238457213158274397103569820623680840515654121967511 X = 316439386823206871346636164448924890050652125877864816263874447019119652991341471892512767356833013036596313520681688846037642422058303711027020977731971469313828021385806157441077657252831199515126729145408040958578380505446806576341163588698094381212906912979884469786023782783106107762632814558326808787771 X = 342961098100864161486224083444064996530615333608713481168433421427817847848808231587480736204728509866407803683577588064876248986627917970721407574366482474956464008840562218539437088991213443686581244468670230768746624924083761284969471148856846083279368375653516879275492605255161494494045951397742913942521 X = 145262597146950198402983317029784468866625742919846744533002367696562782381925075139139930520346726630860925038417520841048478748173408690100803386628315407260460724324957380860416531476612359390675514955532124090127597883627039869878570938907641350999452942901485886289548101644664410043634050840333618736241 X = 103875970392676952824793549226382893918770722897777186300203751664479562050977123972289929315717558677706616837050252404201111892868394359927108413461144788316226799790655169187714036057483534137944994036412984530284019391161346173629541003286304852813525704436628490382188950208123780350213139500089456366841 X = 209262684834708760781378828826012883216045622771588748049592833781430908796364015367633518238497257347693398354563483221744331332528919261931329808331753456631473557050588173643619875493912344262122927629778826442021480388121726709494897667644505493953841122580436721054077839958796624587867034849970594728503 X = 259961974092249031010227603062857594431439837198127643068846961266772005421073175255160571859806585623933076083354026720150711464375869967746325500371685760342898099183114419807958654613613854399259408657437156780223269043081096609877199006862511248990329589067604336669355585402887916288037943709029191674911 X = 148494412403103322617790447472967208041427708128812693048671309929515715881545523410764344130359406227126016497399642347726034074857469854866669198948655053082186111410005989963123962723450119664228552171284801593222656654683510273370663211536463220415691464644614536183219912321808854090915103775109695786903 X = 198951823787361124930411813610219829991074975106392146571215767501609838087179827135862554836592949340043265497052033837199003071263871954417468537542759843054899935687365194283002403584007149487837111761068191757630773706541137817805185812103245128290071673542006653340382017735899123084476453857081318545991 X = 100151654947252996043048304163211754746777587142702306692434166984038755330098831955228744694322537016096512607358351287591352995655554893223580483857764100115214746205606713424344869011314868310794273156514093861279449413522759799967523399898069268728739367463341929936509718884001903262839905032784262429503 X = 95231206592596470170500609905849442045564547265058783767596160210162649328723702952067039028722189901551617226203049071432575686912108071032771616159536783552831568339753661508472308255156836457399521849955736774530191276074724269639715623883903007852200496655144350028488056721467755918814393298596327869403 X = 113269289613139045987221838168670476157836730159022951727133866871803517984548824974383829544258356211263936613672131433712832720317909560575328664237540188143415517690966913820407105917871661636540517137224670577811216377174354694586862330746730799787557140869529264839386342569691698111927128704157615097153 X = 146847844534363588585309790039628824975112779508886863375458304099023620010134739900409422108297615491941343243438794419278070814832779046634885071582835688508933384516245429006116427382617949079713164417750742186233232850990403187128712092976902908607450338866991708762791875618755240139448209180903665732503 X = 358412810221928846165188109606360323720655048142248089956469337069891988161925279182207899372236993040751183199049811064730560746022073963857677172123650694187762839204698560127083582857191356761960185713492812536976691258036712784053125734439393862988510716841734490107828355376447675347185589367615046902903 X = 136413254073020125119434184465514800285073635295381931240903345105818069560349289617656965328836783198111535348238932718954415951560405730847235775035340408484490592989244418679611824558459897397010340558814522802854982012583742552368228166904908748136802133702260393866732616878693744975284760231993354960641 X = 120121309077413673757973584538895340053078707116007436412672855151473033018568172415152125730799408413400442697832948048164313838284868252529547559069691488487393115675459439240223181642866729342993196497371101511116354455141429907183234984597199837581257543510797169400923829329952407436122292964382266031253 X = 274961162498721700837795876571850161951923504987707945218130565747245640262722421808114353386438668769035914966494393198895709050358277453956447636555409300854018401232502616530331143658908539168226609336701796936963304692734694998233898508239810354573599326268702707614772584950389057955691219494031838859791 X = 247298211474214536023668493148879183399132978885752967092151982122755890641856724943270179044946868108401503142712501669997689725488277075239138647902134463451436706674384070937644414378922408397424080253817427253472696804180199677968577101924609860357709848139330190576017582503777009836399771498662905893541 X = 186534718886580998173370111544816079042584670455810850117180327746163633753014575413454959923578288266455109198977784465376154230882378024111971510810465276396395657415178370245114122816237302328393303099711090670061109774495422227139479023758278081750794950528224900273599212004329531461848157373189908642761 X = 285222066304318808807440348756959206512109737156133765320791968958061255441639532142589633195949710293792634007355153699552500134028759770788754166339078427645792536001991144766729628117371050306527654454337958520732309306981263990241529867679171677372308601834079961869281917489638496882679996929360595283091 X = 181226694573701424780809995604208189403454412466009020384060212389337953064906112451523821277506877740852536185141584946755187420904863344271961110077635791220319963938065397633608138595169161436595273219128460849681615673231703413005405286329650440795248270402413500178325587999299003705988651612697260381081 X = 346147802084908988163605730186745996807051687260298732207255261061226967176670988511272076506359607314799699361510659216049566069966154794154897232197433347544538725616640069913605417680979153794166392029635163055246391693210977409542760131833241323790056533380330505490643091283956267491266793755039018149751 X = 291997980097006865890553981103897105153148223341834443462048822970699554781915153514961936955543911140074002652746536457498993361682279972987736655018586409178146143048864596533190807270958265838634581161605509776918985909639375293439321397861730276448559427971296399182413971389773786687947710326691137231821 X = 4145154657949019520090421067892641813006171355169512965016842717965605608345677070047674053932189113793437189588504071861413206876596422868599328943199463347247109139279156232354244036749607133015105499354740364264523832014989327244648027567866644179973588685140041000602876709543832749014374100484229987854182496484982493504634095371261651820866750919282103255096749335753834321723611 X = 7263570684005586918409651676342477962666063384721447164820162267363790003137994944696141214510462612778986577033412479555865362502656930339533617799427179849708811066678403560574528663579436770299187611159071848712668510417692823114550446719084221850233353544862258108486420641329524797224084595903392576175926450327110287113582813113256500835397705152529000369324993100375959770969653 X = 3266663369261434628530741133725226939380890029427130078147736465299657609609866300289037551044842755296645715455685385229229753037488770815042188048059347290440541953284413920836228770883378333839361634881282676119589334709165541036798092721269225600972531571877021083483173456889586533434762148051173834392034092081944586022679255357901358842147871934591187835506106526312170065069453 X = 2714275054823322283846947242758076394288969833351667671546539844865164304081725719193278199274587859302964845933174264046206721616978898415824746652517284154696057825266292769391590992419682314563946417035619325266947257091436696492494177352417584114484475661078574695869675993807128667478899686975153304356423463804980259495149174741764929495016696034025325328362453468725905824967341 X = 9266983839147571189339684823228253420616685503762301572754412275112784329325896460070245239752617832925926748469508691163897231549619954919002517181056246469211229002569927844376004535572738353861591882136393291951512396743267427648075154617935904316277726449386507253882066728735163630819726247327318549654310222647082566628770190476835111363804804130289258330689970347505178654499153 X = 6943685859962113005380005918916483733270787990846044283782171250109685123273631832530232093515797678613166669636433353226818439586659507237191626629561100778400131847260203138804429806291455932383952066228056762115442513166346145910224582828425403465971492726015022712635093903343807744925561923150283620959189103749396693669637302516191876159629263102871218404211406214291913457837031 X = 8697498751458522624235585703214358189002281420472600166267178848980987666586924803733439542008165386809605610353749313146537722602615273804265594080404564052198483620234454011455111149365063946240472545398288332411818055040869427951279027405975059749360297586866737986343943071199029523215312890080825621259691281966944084616331478525965853482434855661783331701815854319557311791089421 X = 4252141813347264797276096871298065242070358505647997888003056375005314524854352079310528912951451072362402998902953098969590411710408837750141172009165548416886410221360178681572909258112397873664014299809018676076741787758620956387796785085878200748397774100098277829187755707448924352539796147791636919657848349116938620050178856948159776951152904039928184566420276462662063200768003 X = 3356647398302910967427184201762737607743709740247537918189248572175533954283802689062525081851852734889897477334086780084079147031820727070324920070840437155763226320158001284899218149321246112300036417841991332124497348096579076242448857352000771247540736125494932479963810579612138848322530062021159961102867820239356780956355417516589837048328595783663185309228059280538060703599461 X = 3687125575229624930459923973437509789116885700012081850445193578448642376842508935093284643740184187161367381099111236064332065202257820899866692588032081832786591527415524508016853418430485681125008729650000322084879372381541270180139663134377177885154388955828150837227279419346006939707087576369145528995973353007018603605253425313893549623322294320271794700959979551805023755301753 X = 6088560764944279853795552546797623009536823218028533977947580608201502351499239562431906098700162556623464821186830052418230647270268723857805333260836829600476446747589889271361495026265577182561494515318563339483672950711193945073071458843901227339418284308418249346164255537263904716264107533715262289286225173170023166725474264485741673708045592422332077910805474866320141535282581 X = 6081766267938901970682791123502557184373300073506187731779846380408319328847515288256342223013061371721646953608064927698171220288957077247001074713915746730873934116374154451501318344435872804243131225731630921851260690656608624225797294197741881140769183047423036591415554315572834216165818564674211730699205101430138380407908411653089682561429233629882257193405738361710224809601753 X = 5000879164859908887599881582814678322611278734193303790540199067694680487630949138029561981059040676622704805199759505344261591426777024652195253427903233383141727974223807795260167091026502016058553529785304239405043134061167377896985489252957729348463979606693348302035145499408189528388311420653920801330868717079628682687526955257367318056584393982273703259039286649949183439159753 X = 5033660524073962747735388920230339629907033897027296197974576730565442285770625764556644742555355351632593596423437331609301931491253476638422358536021269897373786970147536124316480116188329213881347704723060451053853932258315572365588301231482715348124261924429243350354700249690669153072088296895527429954890479118171541902174533835033869855676849020277072477676533264422475881350311 X = 7656692474335471169217545128846872228367812415627865759181393395824161882582837117325964824736330503446252358450994304908935138254338790534753258273308644071243551595575749198649556319567571199044097578241324151657090338112756973390540016908863938814598847539682462098038069550359839730605084928463925913734287506607573840601410310907532071167877913851021343288086388023500885078468451 X = 6916552449605114038869281931877716049700938960849845402874660241341657411577096773695551899347519493283572406534713868735362052083315244085748653192655726562280996506756099290098242247672536575459382651810818256784829505942965567114371502731619372511210627161036252027448018534647854500781285005795085102984883071052178783569323746170765354579006834683132794491034727000125687008493191 # F. Arnault, "Rabin-Miller primality test: composite numbers which pass it", Math. comp. # v.64, n.209, p 355-361. # # A strong pseudoprime for the first 46 primes X = 8038374574536394912570796143419421081388376882875581458374889175222974273765333652186502336163960045457915042023603208766569966760987284043965408232928738791850869166857328267761771029389697739470167082304286871099974399765441448453411558724506334092790222752962294149842306881685404326457534018329786111298960644845216191652872597534901 # Richard G.E. Pinch, Absolute quadratic pseudorprimes # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.210.6783&rep=rep1&type=pdf # Lucas-Charmichael-(-) numbers X = 28295303263921 X = 443372888629441 X = 582920080863121 X = 894221105778001 X = 2013745337604001 # Lucas-Charmichael-(+) numbers X = 6479 X = 84419 X = 1930499 X = 7110179 X = 15857855 X = 63278892599 X = 79397009999 botan-2.4.0/src/tests/data/bn/lshift.vec000066400000000000000000000255541322470703100200630ustar00rootroot00000000000000[LeftShift] Value = 0xE739A1CCBDB501334F332ACE8B16B81C6F5EB6802F2CC1966B7522BBB3A6EB1BE00DE71EC26851919BFA61A691 Shift = 0xCC Output = 0xE739A1CCBDB501334F332ACE8B16B81C6F5EB6802F2CC1966B7522BBB3A6EB1BE00DE71EC26851919BFA61A691000000000000000000000000000000000000000000000000000 Value = 0x72376EA96BE400981D34608D400A621785BFADAF9B3BBF0AD4D28FFD7AD5EEEC8DDC1678C216115F4A71EC0BFA5022018FCF30AB8AEF355F42C45D3C1B4D Shift = 0x74 Output = 0x72376EA96BE400981D34608D400A621785BFADAF9B3BBF0AD4D28FFD7AD5EEEC8DDC1678C216115F4A71EC0BFA5022018FCF30AB8AEF355F42C45D3C1B4D00000000000000000000000000000 Value = 0xB0C043282220B913876FAEDD80EC831D9DDD45B252AFE051E5D52B8A1153BE41148169362123C8A812778692648A2F81 Shift = 0xA4 Output = 0xB0C043282220B913876FAEDD80EC831D9DDD45B252AFE051E5D52B8A1153BE41148169362123C8A812778692648A2F8100000000000000000000000000000000000000000 Value = 0x2D00BBDA306021108EC0E7CEE5A618F96754E0362803F9BA755EC0C95B524DB86AE99A9351BBABC Shift = 0x70 Output = 0x2D00BBDA306021108EC0E7CEE5A618F96754E0362803F9BA755EC0C95B524DB86AE99A9351BBABC0000000000000000000000000000 Value = 0x1E5E48BD54D24BA Shift = 0x6A Output = 0x797922F553492E800000000000000000000000000 Value = -0x3010FC160FCB335EACF8C7B6CF44823E90640D401DD9B8D921AE71FC5A1CC6CA2CC3E0BB0F151ABB Shift = 0x3F Output = -0x18087E0B07E599AF567C63DB67A2411F483206A00EECDC6C90D738FE2D0E63651661F05D878A8D5D8000000000000000 Value = 0x58089F86A0242B6AD790827A22DDD0B3D171C4F949778E68B8EFD9F2813A2D993AB527EAD94355B8DBC02306A60BAA7F656768B6EEFF2F9FDF019 Shift = 0xC3 Output = 0x2C044FC3501215B56BC8413D116EE859E8B8E27CA4BBC7345C77ECF9409D16CC9D5A93F56CA1AADC6DE011835305D53FB2B3B45B777F97CFEF80C8000000000000000000000000000000000000000000000000 Value = 0x47EFAD9FB55F9D358BFC1D908411EF93BA1C74760198093D2B2244455B579CDB3F3A7B0C8228421E1C57B69869964C1BAAB891C440AAF Shift = 0x18 Output = 0x47EFAD9FB55F9D358BFC1D908411EF93BA1C74760198093D2B2244455B579CDB3F3A7B0C8228421E1C57B69869964C1BAAB891C440AAF000000 Value = -0x1AEB4830D3884941BD0B4B168AD9CEDCE7CFCC05607C6F06DA6876FCC254793DBF426D94CA37558842211FCC7A6D2A633DF6E71EF3 Shift = 0x57 Output = -0xD75A41869C424A0DE85A58B456CE76E73E7E602B03E37836D343B7E612A3C9EDFA136CA651BAAC421108FE63D3695319EFB738F798000000000000000000000 Value = 0x2C2FF2FE35A12E015C3B4E395E149FF1D98263FD298804179B136A7718426485715884A67932A8D56E768F4C0A2F Shift = 0x5F Output = 0x1617F97F1AD09700AE1DA71CAF0A4FF8ECC131FE94C4020BCD89B53B8C213242B8AC42533C99546AB73B47A60517800000000000000000000000 Value = 0xE463D99C664854ED736F Shift = 0x6F Output = 0x7231ECCE33242A76B9B78000000000000000000000000000 Value = -0x1A164C1E5E313 Shift = 0x8F Output = -0xD0B260F2F189800000000000000000000000000000000000 Value = -0x6A29D6A56B8FB08A7C4BDBFD59EE394C5F526C12C7791A4D5EFC2AB16490F58EB9 Shift = 0xB Output = -0x3514EB52B5C7D8453E25EDFEACF71CA62FA9360963BC8D26AF7E1558B2487AC75C800 Value = 0x483257AA698C5255677C031FCE49C53B3D666D42DF3BDFC6CD7AA91C3F595C088B3432744085C9A781CC46CF160C0B53F2F796D233F51A8070C39C309C Shift = 0xD3 Output = 0x24192BD534C6292AB3BE018FE724E29D9EB336A16F9DEFE366BD548E1FACAE04459A193A2042E4D3C0E623678B0605A9F97BCB6919FA8D403861CE184E00000000000000000000000000000000000000000000000000000 Value = 0x1FA0055D8231B4ED1D8BB55C0BBB377E5D7EA7217AE0547BF3C672301EBA2E96723BE40C5D98F Shift = 0x6B Output = 0xFD002AEC118DA768EC5DAAE05DD9BBF2EBF5390BD702A3DF9E339180F5D174B391DF2062ECC7800000000000000000000000000 Value = 0x61C17EEC735A468B7E327D20F0A9602D530502E1823025218DFD31FF44F864BEA9DB9B2D25F9B0A Shift = 0x7E Output = 0x18705FBB1CD691A2DF8C9F483C2A580B54C140B8608C0948637F4C7FD13E192FAA76E6CB497E6C280000000000000000000000000000000 Value = -0x2FE1ADCB94BF37ACD24F319555BB1A6FBDBF093FAEF07ACD35BF2B686A9E9D7A80434E1CF28DC9DCB50B722ACE8C8A8C43ABB402A436C Shift = 0x5B Output = -0x17F0D6E5CA5F9BD6692798CAAADD8D37DEDF849FD7783D669ADF95B4354F4EBD4021A70E7946E4EE5A85B9156746454621D5DA01521B600000000000000000000000 Value = -0x77B652B8F78F33CA1710904B09766C8C896F5F499380FE9115F7F6C41C4ACB53019D0D782DBF43C4CF541058CA7C64D3 Shift = 0x98 Output = -0x77B652B8F78F33CA1710904B09766C8C896F5F499380FE9115F7F6C41C4ACB53019D0D782DBF43C4CF541058CA7C64D300000000000000000000000000000000000000 Value = 0x16CB01B68A0C9783D669216A79D6C465E12FD04E81F4C7F5AD955074CECDE2 Shift = 0xD8 Output = 0x16CB01B68A0C9783D669216A79D6C465E12FD04E81F4C7F5AD955074CECDE2000000000000000000000000000000000000000000000000000000 Value = 0x32C693253F1FAD5EC3032FBDB6A45F3D361530B27C317F31CA7863327F86AC12CC41380CDF65EA Shift = 0x4E Output = 0xCB1A4C94FC7EB57B0C0CBEF6DA917CF4D854C2C9F0C5FCC729E18CC9FE1AB04B3104E0337D97A80000000000000000000 Value = -0x35AB812469C4DD191C4248667529BE91B2B045D4E2638A83A968A0F Shift = 0x6B Output = -0x1AD5C09234E26E8C8E2124333A94DF48D95822EA7131C541D4B4507800000000000000000000000000 Value = 0xFB9571AE7949D845E2E5A351570AC9DA5CFB44E77D13ABACCE046932D78F6E433CDFE1BE19D1F404B Shift = 0x45 Output = 0x1F72AE35CF293B08BC5CB46A2AE1593B4B9F689CEFA2757599C08D265AF1EDC8679BFC37C33A3E809600000000000000000 Value = -0x18787A2E277E69E5AAF6D8A13359A33203 Shift = 0xDE Output = -0x61E1E8B89DF9A796ABDB6284CD668CC80C0000000000000000000000000000000000000000000000000000000 Value = 0x15F08E19EF16A909D37C6ADF61 Shift = 0xD2 Output = 0x57C23867BC5AA4274DF1AB7D840000000000000000000000000000000000000000000000000000 Value = 0x254FEBF0CEE267DCFD66918F2683A52A00AB70A79BC5592DACFBEBF0CFDA1C252A002DD0FA75B5E7FC4F6722E3144CEBAFB58B3 Shift = 0x82 Output = 0x953FAFC33B899F73F59A463C9A0E94A802ADC29E6F1564B6B3EFAFC33F687094A800B743E9D6D79FF13D9C8B8C5133AEBED62CC00000000000000000000000000000000 Value = 0x3D7AAD27059D540794499A892A2A5961C3B1A55F5DAC2DE9650C53484FED6F8C691D Shift = 0x19 Output = 0x7AF55A4E0B3AA80F289335125454B2C387634ABEBB585BD2CA18A6909FDADF18D23A000000 Value = 0xF9D36765FE12D67DCBF0C31273746BDE3E7E84E0007FC6C666A69AD7BDC95F381DC61D1CD9F39925E5 Shift = 0x91 Output = 0x1F3A6CECBFC25ACFB97E18624E6E8D7BC7CFD09C000FF8D8CCD4D35AF7B92BE703B8C3A39B3E7324BCA000000000000000000000000000000000000 Value = -0x87396E735D99D52848308640C7C752114D4DDC186C04AE64075FA2ED9F69C627A3B51B01CEF0A89621AED66977297A44F5585C62DB0B46E2E9695189D21830 Shift = 0xE1 Output = -0x10E72DCE6BB33AA5090610C818F8EA4229A9BB830D8095CC80EBF45DB3ED38C4F476A36039DE1512C435DACD2EE52F489EAB0B8C5B6168DC5D2D2A313A4306000000000000000000000000000000000000000000000000000000000 Value = -0xFA2A0F80DCE385AA37E667C1253078A3FDC7A4E83DDF520B63C63AAD19406693726E144F41A1E991985952B581DB517F93066FC Shift = 0x80 Output = -0xFA2A0F80DCE385AA37E667C1253078A3FDC7A4E83DDF520B63C63AAD19406693726E144F41A1E991985952B581DB517F93066FC00000000000000000000000000000000 Value = 0x140511E1D6E3AE41176789E6354B60950ABF20C8840231D0515FDD06D35E3C08644DE9BA31987BC77F06 Shift = 0x4C Output = 0x140511E1D6E3AE41176789E6354B60950ABF20C8840231D0515FDD06D35E3C08644DE9BA31987BC77F060000000000000000000 Value = -0x378F419372F8143E383FE5BF25AA16232FBA8945FC163484CA303302A10E7EC095C07408B08036F8B82CA7FDCEB Shift = 0xB9 Output = -0x6F1E8326E5F0287C707FCB7E4B542C465F75128BF82C690994606605421CFD812B80E81161006DF170594FFB9D60000000000000000000000000000000000000000000000 Value = 0xEF7A273859AAB9EA24CDE209CF14A8C884AF61A17C574C2481724205AA8B161B853D53DE688C498C5AAC95A9403E72456E53E6EA2B Shift = 0x1 Output = 0x1DEF44E70B35573D4499BC4139E295191095EC342F8AE984902E4840B55162C370A7AA7BCD1189318B5592B52807CE48ADCA7CDD456 Value = -0xD685A0F9021D409A6BA34F65EAF307080AB3A68CD1A535D8AE61BEA47295B2C81B Shift = 0xB0 Output = -0xD685A0F9021D409A6BA34F65EAF307080AB3A68CD1A535D8AE61BEA47295B2C81B00000000000000000000000000000000000000000000 Value = -0xCABB664B0A5943F07BAEEB496A2E0F4CFEDE69063E65AC69DEA016E5E Shift = 0x66 Output = -0x32AED992C29650FC1EEBBAD25A8B83D33FB79A418F996B1A77A805B9780000000000000000000000000 Value = -0x161F3FCF8DEBAB85F30133663F9D26102D93CCDD22AF1F4E9A51BD7DB2F441699380B821EBE4275FE5D946A4F66CB4257F0103A1B0A1 Shift = 0xA7 Output = -0xB0F9FE7C6F5D5C2F98099B31FCE930816C9E66E91578FA74D28DEBED97A20B4C9C05C10F5F213AFF2ECA3527B365A12BF8081D0D850800000000000000000000000000000000000000000 Value = -0x7E14D1CF8B82F649AC06CFFCE296552705202EDFB7D721D572D3B00C4C31980AC46AD950 Shift = 0x18 Output = -0x7E14D1CF8B82F649AC06CFFCE296552705202EDFB7D721D572D3B00C4C31980AC46AD950000000 Value = -0x6CE6BB7CED94F095C8E67B2 Shift = 0x45 Output = -0xD9CD76F9DB29E12B91CCF6400000000000000000 Value = 0x7AE95BC60E53 Shift = 0xCA Output = 0x1EBA56F18394C00000000000000000000000000000000000000000000000000 Value = -0xB0AC35E7B076BC6F57E19A0568E00767E7F59AC407558326445BD0B247810FF7AE445FDE3A1C4F917DE916E64A1ECD3214E8779B Shift = 0x4A Output = -0x2C2B0D79EC1DAF1BD5F866815A3801D9F9FD66B101D560C99116F42C91E043FDEB9117F78E8713E45F7A45B99287B34C853A1DE6C000000000000000000 Value = -0x378E9A5091EFD9896933F3547045A0A02CE3097900A2A575BD475ECB2AAD0FE23DA9B24E998CD7823F4C562F11F6CFBCDB59B55BFB5B5039A3AE054D5D9330 Shift = 0xA4 Output = -0x378E9A5091EFD9896933F3547045A0A02CE3097900A2A575BD475ECB2AAD0FE23DA9B24E998CD7823F4C562F11F6CFBCDB59B55BFB5B5039A3AE054D5D933000000000000000000000000000000000000000000 Value = 0x5FEB82D33EB057134EAE546F547260344CA822D9DED9318150AEE82E2549DEBD2561A06C29E77F689DDBDFE25E381E82E8316CB7129E30734D38996A72783F9 Shift = 0x5F Output = 0x2FF5C1699F582B89A7572A37AA39301A2654116CEF6C98C0A857741712A4EF5E92B0D03614F3BFB44EEDEFF12F1C0F417418B65B894F1839A69C4CB5393C1FC800000000000000000000000 Value = 0x12F938788BBC7D18F2C Shift = 0xC7 Output = 0x97C9C3C45DE3E8C79600000000000000000000000000000000000000000000000000 Value = 0x66436D80FC86FF21776C5B4F62C582E87F54D7B067B5BD0F772 Shift = 0x2B Output = 0x3321B6C07E437F90BBB62DA7B162C1743FAA6BD833DADE87BB900000000000 Value = 0xF82C84951E0609661B Shift = 0xB8 Output = 0xF82C84951E0609661B0000000000000000000000000000000000000000000000 Value = 0x6A4173A90A400C0E8A1F2FF03466F492E8838743F019EBF0149E5681079B4732 Shift = 0xD5 Output = 0xD482E7521480181D143E5FE068CDE925D1070E87E033D7E0293CAD020F368E6400000000000000000000000000000000000000000000000000000 Value = -0xB82886F5F5A972FC6248BEA3F5B6E6935F9234DCD6D662DE38CB89AB151DBDCD46 Shift = 0x55 Output = -0x170510DEBEB52E5F8C4917D47EB6DCD26BF2469B9ADACC5BC719713562A3B7B9A8C000000000000000000000 Value = -0x344320075AFC40367C2907E552A862E46878CEB548F67C25A8898D6BFEA2035465A2DABF1F9A759B447C8196 Shift = 0x86 Output = -0xD10C801D6BF100D9F0A41F954AA18B91A1E33AD523D9F096A22635AFFA880D51968B6AFC7E69D66D11F20658000000000000000000000000000000000 Value = 0x180F0D38B97987F35EAB73DBD7F4FC10EB96BE7D5C0959B8B065F98A64D457FB63E3341DDC3B903BE683173E Shift = 0x61 Output = 0x301E1A7172F30FE6BD56E7B7AFE9F821D72D7CFAB812B37160CBF314C9A8AFF6C7C6683BB8772077CD062E7C000000000000000000000000 Value = 0xC2A502857481389B835ED20720FC4771AE15 Shift = 0xE5 Output = 0x1854A050AE902713706BDA40E41F88EE35C2A000000000000000000000000000000000000000000000000000000000 Value = 0x22946A4F246B19CE940DE1650DFD11CDA2E6311DAD222E3FD21681511691FD513E47B062BACA295EC012B3DE0FC593CABBC Shift = 0xA5 Output = 0x4528D49E48D6339D281BC2CA1BFA239B45CC623B5A445C7FA42D02A22D23FAA27C8F60C5759452BD802567BC1F8B279577800000000000000000000000000000000000000000 botan-2.4.0/src/tests/data/bn/mod.vec000066400000000000000000000254121322470703100173420ustar00rootroot00000000000000[Modulo] In1 = 0x9 In2 = 0x7 Output = 0x2 In1 = 0x7 In2 = 0x9 Output = 0x7 In1 = 0x2261331 In2 = 0x3406DE Output = 0x1DCE85 In1 = -0x5 In2 = 0x7 Output = 0x2 In1 = -0xE In2 = 0x7 Output = 0x0 In1 = 0x0 In2 = 0x1E8D2D00 Output = 0x0 In1 = 0x0 In2 = 0x1E8D2D00 Output = 0x0 In1 = -0x1E8D2D00 In2 = 0x1E8D2D00 Output = 0x0 In1 = -0x23BFD0990E34C4 In2 = 0x1D Output = 0x0 In1 = -0x5 In2 = 0xBE38C5D Output = 0xBE38C58 In1 = -0x8 In2 = 0x7 Output = 0x6 In1 = -0x7 In2 = 0x7 Output = 0x0 In1 = -0x6 In2 = 0x7 Output = 0x1 In1 = -0x5 In2 = 0x7 Output = 0x2 In1 = -0x4 In2 = 0x7 Output = 0x3 In1 = -0x3 In2 = 0x7 Output = 0x4 In1 = -0x2 In2 = 0x7 Output = 0x5 In1 = -0x1 In2 = 0x7 Output = 0x6 In1 = 0x0 In2 = 0x7 Output = 0x0 In1 = 0x2A4E282493E8C041BFCFD375ED5924B8D68C120E1CE0BC3465997F2F8AC33CE5216521BD35E20EE5B9D26B973388480A0C5A003942CC6DA85DD4DFD8B In2 = 0x84D5D161F78E97D98585836FE912A3795AA58DACB5B Output = 0x197AE594643E817C634C8794AF9B76DB02BFAFA2B69 In1 = 0x1A5BE98A2D712E25B94F634859714B In2 = 0xB9BFBE360FA4EE3D1AE1E1D389899E4793F9311EA6 Output = 0x1A5BE98A2D712E25B94F634859714B In1 = 0x381C7C4C0034D95CDA4D7A3DAC384544C36AFE4C0E4B6B44454AB99399132DD12FA99D2F5D788C In2 = 0x784586F5713EBAB503A5 Output = 0x5187C976436B2161C929 In1 = 0x35D In2 = 0x6341A1F8572C7FCDCD9A35E293 Output = 0x35D In1 = 0x1B25908A724DD9AC8 In2 = 0x6761AFD189EED4897D0EC650E7A991387E08D6C93F9FA2F1F82A199D87B3E56F9495C11E04962781A46D510C176244166A9A5F29 Output = 0x1B25908A724DD9AC8 In1 = 0x324DB51EB03558BFC598BAE4E9FEE42C447B8C0B92A51 In2 = 0x76ED7E7C0C68AF8C3AE54 Output = 0x24F0AF8CFA1163A3A7D1 In1 = 0x7A9B406D9A4B4D87E70AE11CBBF7A4EFAF0B38635BCC422BF34F3686A32E7FDDCABFCAE48B18EBF2A2CD0FDD45B34D753E85D89A529A45C56AFA In2 = 0xC0E2A4C6B748B37D817CEC40BF01299CE574E1CCC0CA126267340EAB9AAE686B89052 Output = 0x7870A16EBAB941FBDA4A1749D0E2C941326F43D38E92DB128C5DB96C9363460956374 In1 = 0x30A7C6392C4AC6F1BE87F8CCDA5A64CCE13CC4405A18 In2 = 0x1C889B7AB36165D55ED5FCA40FA9EE559B2DDC94FA386E5F05CF1CC910F5627D7EFDF7325FDC873DB205E141AE50964A7EF35EF82C4D58B01D Output = 0x30A7C6392C4AC6F1BE87F8CCDA5A64CCE13CC4405A18 In1 = 0x36DA73B4B2D7ADBC8A7A27D88E5779A635A8628E8DD9BBEA04F5E109162F658C89D8C13CB16FF9BBEAA09479 In2 = 0x37 Output = 0x8 In1 = 0x2C736E692A4DA93DF58B4CB781C3F0C3659 In2 = 0x3506FA2167819E3738BDE7CD533448B1AD6B075EA904D9F5CC5BC1BD17275 Output = 0x2C736E692A4DA93DF58B4CB781C3F0C3659 In1 = 0x4040E116526FD4449A68BBE5AC53CD9C50E36E52BE659ED61 In2 = 0x8E14582730A5E771870DCBEED2187142D476EF203C83811FE1E3D66F6 Output = 0x4040E116526FD4449A68BBE5AC53CD9C50E36E52BE659ED61 In1 = 0x35CF035F1AC16BC3C6642F9C43CF3B8B61712E9E9685EA2233CA5CD5D6DCA1ECA3B533C67697823 In2 = 0x43B1D15F6914EADA8601792C97635EC325BBA0F4805 Output = 0x40425D111DF2C6F95E8D91AC3CECC1FEA32B8AF4672 In1 = 0x31ADA3A5C325E4ECA4BF9D86E3370BCF32A6E6783021DF2D7892874EEA76A5DDA4C90368EEE8D4132872198B29A45B5B In2 = 0x2BC153FAE33429DB4630A9 Output = 0x1477783F9D2644A98D6BA5 In1 = 0x1A6DE4C010FECA8DD719C9949FD4C9EBCD58C753EF31517F7D99C35 In2 = 0x3F655EC40C3D908C4CFC35A96E51C3B85010578C656402A4D7963BCF71D70630BCE37448A184D56D820B1870DCDB292D6B0139D0653BF4BC Output = 0x1A6DE4C010FECA8DD719C9949FD4C9EBCD58C753EF31517F7D99C35 In1 = 0xC34264A2C65A7E1295F587DFC08FFC In2 = 0x3C158C9E4D1C05D4A158A0D860BAB Output = 0x3BDB46A30912B7CD3AB072E0C3CEB In1 = 0x6CD4C4A9AA91F9D20BE5535BEA In2 = 0x2886BDF02B32BC09AC6A6B1D3BB633B6CB5A742F9516C8B4B3F17B012F19B75F98655FBBA00BDD447E3869AA06A558C9FFC4E99CDBAA5 Output = 0x6CD4C4A9AA91F9D20BE5535BEA In1 = 0x3F61B265AE5064462BBAFCAE2FF391AC941403068A3079B04D9F5BCF2E4AE42D2B17925968779F93B11DC1E090540E25E711AA73C1 In2 = 0xCA30FC37EDFF148449E735C314CC428ECD7DA899A3B1A6E493F56DA69499C0EEC Output = 0x9D047BD22108F1403FFD114B80BAEE69D05EFA3D72A9EDD65737E8A5568241D2D In1 = 0x57AE837700D4CB592771FDD80 In2 = 0x4FDD3F88F7E97407842A3696E676356 Output = 0x57AE837700D4CB592771FDD80 In1 = 0x3C875D742770EAF61FAF5618D3B50953B5DE5A7A743 In2 = 0xED529449DA23D1D89A42228F1A6407A8146923894AB1459A4780F7ACA7207015F184 Output = 0x3C875D742770EAF61FAF5618D3B50953B5DE5A7A743 In1 = 0x1330F0F55812F77E076CF7F7B23FDA6EA8EA72EBF1C3EB020084BAADD93E9 In2 = 0x6C679459B7A75135B6BE3DA6686590DF0E735202751DD5772E6A29C44B686FAFC7F Output = 0x1330F0F55812F77E076CF7F7B23FDA6EA8EA72EBF1C3EB020084BAADD93E9 In1 = 0x2B4DAD5D1AC8900057EB7FC530A27671B76EDA0480EAA44EF51A In2 = 0xF235C6D2F1F2219F503BE760BB404CBA857C5DFB6E95E94999EA353FB82BD82CDF1F7ED1121FF1E1 Output = 0x2B4DAD5D1AC8900057EB7FC530A27671B76EDA0480EAA44EF51A In1 = 0x4C801068F41CB7559BB59D93072 In2 = 0x283269A4E71EECB7BD9EFABAF69C3304ADB784C61888D2D7DE669D64199C9A39DEFBDEBE02CB75C062888B691CB66DC275E2988E63636649C9FBBDDB8850156 Output = 0x4C801068F41CB7559BB59D93072 In1 = 0x1435711E75AB8C0A2F6A4006C9A289298D9FD0C497B0C83B928677E5C0EBF6E422E7039793 In2 = 0x82143F9E049C38452EC91 Output = 0x1B77DFB3F3FA00D5D7BD3 In1 = 0xFBEF3DFE8C1F6CF626D9 In2 = 0x1BD7622A7438950EB60F0C5F015CA7A0181504B6418026FEFE339DEB2AC3C5369CA7DF90DFF59F9705AB7686879E Output = 0xFBEF3DFE8C1F6CF626D9 In1 = 0x200893F161539F78251C88FC In2 = 0x8E413E9CE Output = 0x6310EEAE4 In1 = 0x3F6DCA9603E629D35ECC84EEF17B085AB583AEB1F62C6F5447F6F9C5E88DA6C7FAF15E7DD808D13754D526C651AD2107B05039A77C287C439EF58887 In2 = 0x23304FFD222EFBFAB5CD320AA3D750F505727CB54235DDBE5D5A02FC508B04533BD3D0DC02CCD7379A89C03FE012B465 Output = 0x2041CA9D0DDA3B3A333377296801D220260E8E9DB138DE40A491E46D0D53EB14BCCD9A051267BAB158371779373FB8AC In1 = 0xD0E2C9E95EBCA60722A070B823F521A964 In2 = 0x93EA1ACE369B39DD253492823C4F8858E62E3CA88EAEC2A5C254DD147F6B55035D77C984130 Output = 0xD0E2C9E95EBCA60722A070B823F521A964 In1 = 0xB40F6E5C321DD06770A72F1C13932120A130A238C9D1B80D2B069A084C36CDF846345C704234EFBACC0ED6F79A001 In2 = 0x44B30B27BF28C1BFFAF2 Output = 0x35602611D3A62D94F337 In1 = 0x5AD40A06D6D80591BD9285D9641D3E4DA612F34E3A3E207A0CF4B91F56B109A19CFBB073D In2 = 0x2DFD79588352CC98991A46AC0584E64BA55848B2017018C271B25F6D62CB3920D0C2995C0D4DE4A6683B4275B048C Output = 0x5AD40A06D6D80591BD9285D9641D3E4DA612F34E3A3E207A0CF4B91F56B109A19CFBB073D In1 = 0x2E076E4F899FD12FADF37286F92FED6A7BBE7171 In2 = 0xBDFA2612A8FA10E1E5B7BAB63EAFA6C8ACD1BB7410DBD3B3C2BA537699628AD77CA8E21D9302FF78BABA36E16 Output = 0x2E076E4F899FD12FADF37286F92FED6A7BBE7171 In1 = 0x2723DCB53EBFE695D3E173733DA80D12482255E46AF95130A3DE28405C16B4243911D9F6D1C08CA5A3 In2 = 0x21196029 Output = 0x734E7BF In1 = 0x5C0BEC752AB52E1E967B6D0317F10B0BA76A2EB86E562D9FB59E2 In2 = 0x397F5DEBC49E2A8C70D65E5240C60911 Output = 0x16FAAF0D8839ADFE3B65ABF4E2638D88 In1 = 0x50DFE538B59BE3AAED8769 In2 = 0x2 Output = 0x1 In1 = 0x1576BBE1F040D4C5293C26F3D9DD In2 = 0x2B2ABFB0BE86EFCD75A75FB Output = 0x1A328B8A12B2E86BEB00911 In1 = 0xDB956956207CC553042CBB576078699179E8FC390A3EA34BCF1BFBDB479D52233ABB71533056B6347B6993DBE9F57553EE61A4E0A In2 = 0x2 Output = 0x0 In1 = 0x30DCD7CE05C38C1487894BD5BE1B3228386B14A2ACC30C In2 = 0x62000B450EC7560FF7336647B82AD34CB25D97081D33BA45EA26D88D529C1A341C25 Output = 0x30DCD7CE05C38C1487894BD5BE1B3228386B14A2ACC30C In1 = 0x7856EF78E91BF In2 = 0x1335F67FD20FC2D09E7294E7FB48ABF5F96BB357E7A2EEC0C9F4AE418340819675F716C786D89925CB2E8CC7F6B8BDF0 Output = 0x7856EF78E91BF In1 = 0x55BE14CF1F90117C54D7D4476AAAD726F256A50BD5B40489CAB787365A4B7D67F1923F113A4095871061CE730C9DA9F6FC4 In2 = 0x6F2D20B075BCDB6EAF4192E6191201BB0493DF8C6C519208B9C252 Output = 0x2809E9E9F70DFF2FFFF7C921E5D946B43CFA4ABA1C6584387F7FDE In1 = 0x57A76F3D623AA8D890FDE3578D44160CEC548245949D62BA308E99DCFC8D8655B5751218AF In2 = 0x3AF04038D497 Output = 0x21F9246B33A3 In1 = 0x31388A950A23886231EACCD8BB47E606AEF3F0FB37BDA88C6206EF8B18D1CEE889D87E94FB86F62DF1C386 In2 = 0x18AEC3439E0 Output = 0x1347FE86C26 In1 = 0xB2612136E5B946C4F5A30F32C36532BA0CC360833AF7E86FC0E70 In2 = 0x3E2BCA81EE33B31D196463EE520ED5A4C242DF645FA2D4D2E5C4CB4D8D925663C618F Output = 0xB2612136E5B946C4F5A30F32C36532BA0CC360833AF7E86FC0E70 In1 = 0x32622690F0E39C8C73459EEE1518E9DC3A8CBF7B61EFD0857B915 In2 = 0xA2789271A3049043FD6BC089F70E10E52B21C6FF5C53CEEFBD96C04312619A3CD234B67 Output = 0x32622690F0E39C8C73459EEE1518E9DC3A8CBF7B61EFD0857B915 In1 = 0x64A0249BEB74CDA60EDDAE0B4899ACC4DC5ED672E1BC9A820A2BAD095EB5D10B6DE59F49725CFF7132B594834731581398269E61D338F3ED5CA8E6BB6EBFBEC In2 = 0xCA55E1E1FA32DA8D5DB3D511276B92DFEDFBC70C2FD6C985A1D770D8436CC58D42A8703D5ACACAB7FD2148A40CDA8479D7CB0586A34E Output = 0xC68D2BEA911B6841D9AECFB98F6D0AE8DC92641E6DAB6EC6FD446EAFE74204E130B024E8DC74553C75B47704F91866A428FBC634D8CC In1 = 0x14D772D895E6CE2E8A9505D25BA65BD931FEA121B465CED036491638BB86B031DDA389748AD722156EA66849CC43A2FD42459EF6 In2 = 0x6 Output = 0x2 In1 = 0xDADA69C24686EA2393C127121A12C275FCE8E2EED58E84ABB90D7A6BBFE2BD8AC51F5D0BAE3F273200564C1A61168865FF7344DCF1D970CADEEB2E8 In2 = 0x55D421A2FB76A699B5DDC3CE2427D8953E58F32DDC47F2E61973A8F066C7874C93A0EF8F179E10E563F4A398147 Output = 0x37C6097CE62640A1CA0C78B50B6C067E38650009F004609B356DE53AAAD714268D6CC6B2B56F58DAA7BDFFEB078 In1 = 0x47F36D12BC7CABB1331D34E84515D5975728DD In2 = 0x2E57F04FBE70CF2D175E34F7C583C0E15B8B946EC567AD59B8F2CB2665410A0B91025B5F731A8CA260D992265D530F90EEA41FAC03B515D4B7D10B151A0 Output = 0x47F36D12BC7CABB1331D34E84515D5975728DD In1 = 0x18962EF4CE1D7BF49682495D47DB840AAEAD25E0CF28D6C1395F25A09D2485F5CAACEA88DA7E756108B6B6409 In2 = 0xA4A4338EF6919AEA9E Output = 0x80A82C6CD5ADAAEC3D In1 = 0x6183E904BA8 In2 = 0xFBFECABEB11F0D3E79F3A1E0F8CC955427BFF6EF75279542071C5AC5ACA56E282439E6D6D873 Output = 0x6183E904BA8 In1 = 0x6365BDCC94EEF7691EFA970D21816FA75E00D908673E85856715B7AE4843AFAC296D79BD5CF128F9EC3F860F40F6369EF61027DD In2 = 0xCEAC6335411BE409DE14350881AFC55DA16DD60E2DDC1D6DD3548C4BE3B32933DF0DE7A0A7CC2986E05F8EE10FD4BE30C1153EEEF2DBDC46AF Output = 0x6365BDCC94EEF7691EFA970D21816FA75E00D908673E85856715B7AE4843AFAC296D79BD5CF128F9EC3F860F40F6369EF61027DD In1 = 0x1303523812A77 In2 = 0x147DD1D9D7364410D783866DDA9195059F1F7F3630352D1C38387668431DD12F83CAE962F13583D0C1023E9B93C3A142EB1081135D963F8DC6ADF629B3DF3 Output = 0x1303523812A77 In1 = -0x1B50EB5449F45B22930B8A14B346E499DBE0946107F3C1558E21029C4FF46AAECC71666823947E898E2CFAA80D84F558B83FD1FA117858326D4D4A3D5DA0D59A5662316FC70512323BE83EA1767DCE52393B2B16B8A8D53287036D2D61E659B13165B3CFB44B1059AD8DF575FA65C20FE5613F1F0C27F3A05A922DBA856E2EB8 In2 = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Output = 0xD0DD7834F118FE11F3F27D938D153D2843CB2CADB9FA28BA1AE784808DAAE4E915B47E10884383350ACD1690E1CA12C3F92C56A95434D11BD615E3225A2AAE9C In1 = -0x184DCE99E95ED3337B516B39BFDBAA8320562AF079102030166F7CE4A176E71B5FC501B1F2759D8AEEEFF1BC52D441BFB7B0D26B6FC9FB9C2C3C00F526DF965B In2 = 0x962EDDCC369CBA8EBB260EE6B6A126D9346E38C5 Output = 0x3CCD9C977A3248C5FB141B3F0EF3ACA391B3914B In1 = -0x40147F79DA93E8D3F21A11E66D2F08F445BABB7AB7C3C2EF1B94312E6CBF347DC65831F7C49EE202F8E6F77233FB3EF7E462D5E4D3C81DA2CBC9335F9B1A7F51 In2 = 0x962EDDCC369CBA8EBB260EE6B6A126D9346E38C5 Output = 0x34889A4853583C9FC0163C085D8B74A1 botan-2.4.0/src/tests/data/bn/mul.vec000066400000000000000000000741301322470703100173610ustar00rootroot00000000000000[Multiplication] In1 = 0x0 In2 = 0x0 Output = 0x0 In1 = 0x0 In2 = 0x1 Output = 0x0 In1 = 0x1 In2 = 0x0 Output = 0x0 In1 = 0x1 In2 = -0x1 Output = -0x1 In1 = -0x1 In2 = 0x1 Output = -0x1 In1 = -0x1 In2 = -0x1 Output = 0x1 In1 = 0x0 In2 = 0x5 Output = 0x0 In1 = 0x5 In2 = 0x0 Output = 0x0 In1 = -0x5 In2 = 0x0 Output = 0x0 In1 = 0x0 In2 = -0x5 Output = 0x0 In1 = 0x100000000 In2 = 0xFFFFFFFF Output = 0xFFFFFFFF00000000 In1 = 0xF30CC0 In2 = 0x3BF036B268242F2C0F8D3169A1D0A7D6EB Output = 0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = -0xF30CC0 In2 = 0x3BF036B268242F2C0F8D3169A1D0A7D6EB Output = -0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = 0xF30CC0 In2 = -0x3BF036B268242F2C0F8D3169A1D0A7D6EB Output = -0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = -0xF30CC0 In2 = -0x3BF036B268242F2C0F8D3169A1D0A7D6EB Output = 0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = 0x3BF036B268242F2C0F8D3169A1D0A7D6EB In2 = 0xF30CC0 Output = 0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = -0x3BF036B268242F2C0F8D3169A1D0A7D6EB In2 = 0xF30CC0 Output = -0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = 0x3BF036B268242F2C0F8D3169A1D0A7D6EB In2 = -0xF30CC0 Output = -0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = -0x3BF036B268242F2C0F8D3169A1D0A7D6EB In2 = -0xF30CC0 Output = 0x38E80022123D08942C34CC2F7A9BDE755D053440 In1 = 0xFFFFFFFFFFFFFFFEFFFFFFFFFFF6F67B In2 = 0xFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF04 Output = 0xFFFFFFFFFFFFFFFEFFFEFFFFFFF6F57F00010000000001050985000008E55EEC In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0x80000000000000000000000000000000 Output = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000000000000000000000000000000 In1 = 0x80000000000000000000000000090985 In2 = 0xBFFFFFFFFFFFFFFFFFFFFFFFFFDDE48C Output = 0x5FFFFFFFFFFFFFFFFFFFFFFFFFF5B969BFFFFFFFFFFFFFFFFFFFFECBC43CA8BC In1 = 0xDFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFF In2 = 0x7FFFFFFFFFFEFFFFFFFFFFFFFFFDEFAD Output = 0x6FFFFFFFFFFF1FFFFFFFFFFFFFFE29B6E0000000100100000000000021074053 In1 = 0xAFC1CFFD57BE9A5D50136FC20CC5D26 In2 = 0x12412589AF125C363D32631463F51F45 Output = 0xC885A9B2978B29FF512F3A3454B090ECAFDBC51971956C865FBE806DBAB53E In1 = 0x6DD921FE56D7207A520C25D947FBA37C In2 = 0xB68B7760D6B79A1E63F7DECBE79338B2 Output = 0x4E543649C3325C67BBB672BC7114F89C74B1D8FDF05E5E647D666A2ADCEECC38 In1 = 0xAFC1CFFD57BE9A5D50136FC20CC5D26 In2 = 0xB68B7760D6B79A1E63F7DECBE79338B2 Output = 0x7D538A0F9EB6FA3F92BD8460B4EE5A93EDE95B2FE6FD63D3FBD7104494B146C In1 = 0x6DD921FE56D7207A520C25D947FBA37C In2 = 0x12412589AF125C363D32631463F51F45 Output = 0x7D538A0F9EB6FA3F92BD8460B4EE5A93EDE95B2FE6FD63D3FBD7104494B146C In1 = 0x653B2B2729F34B5D59C090A1138282BC0D79FD80A0D5296723B14D0DFB3B4A742A758E0FF7303A51 In2 = 0x76564ECAE696BA53812142B305057827F3FB001AAA52CF41629A1A477694E9F6EB1C1E546074A3EE Output = 0x2ECB66ECCF82FB460EE7668D10C25C722EBC1CA1EE83330C82E86E20BF7A0CB5BF0E1D5C81805D8942864680171DFDF285AD7369A09F35B9FF1729E7EC1724DC38C2CAA7FF370F6C2D30F58850ABCA4E In1 = 0x21A9269D7B8B63CF18FAA933B3C868BA1E8CB3F00B57E197709ABF96EEB9BF12E8FE22B3 In2 = 0x144C992B68E3CA712678215D5BC968702CCFEA17717737BA501A38D26FA5091BA Output = 0x2AB495F91AFD7C36F85ECE6FD58577F995DE88D62A98A07C6D9E3500AE67B0F100BC709D1F30894662774D0CADFBA091788C427CC6F4BACB26E42CF92F6E4494E03C990E In1 = 0x416E63549E2CF08FB225058B3545CB4A47CBF9 In2 = 0xDE38C473C27F7BDEF02A084192B3E17F435CF7 Output = 0x38CC3C7F360737411DF7B52A222A3672C6E0D39F0A868479176A6143E1129D44D5AA61BE493F In1 = 0xAA20B1355073F21C57530D2F90BC40E47AC463 In2 = 0x8315DFA60E97FF3DAB7A6F61FCEC2CD5B6F127 Output = 0x571D43FDA6CE14A78534AC72C50B58738D62630766A59A7CEC1A63433E499B1B5EAC5EF71E15 In1 = 0xF641594177C8C364D922C659A8F7AE0460C7D74B266C8CC258AD5F In2 = 0x5948DD29FC5172C37C31DA6957779A1BEBE452D8DEBA26C5D3D390 Output = 0x55E2CF27AA49F938584DCA4044D944077E226206C6F8C7688E8760F3B5C106413FD0EF4B63A97991DA86FD113FF4822A41F76913D270 In1 = 0x3FEF06998B0DDD140E01527426EA409B2B9E640F223DFD652229FD17EB99D44F6BE6D4935505DF676F48C8FCBFE2D5096345D6509267AA40C54D427F0CCE45CD0F8FA7E4A22492D7ED4FFA45E3C0E5E3C25C841943FB2CECD6EE9275AE93C4E15E2D9F8F317C44C541ED52A6338B0FB9F7F7F4DEA78CF7EF5201837C00A6D4D2 In2 = 0x260ACC6378341B2B894DACAB3A44B914F19292BB32898B155584A406161BB04AD9C14DB20888DFCDAB613B368B5C699305C4E9B226D90F9523FBCB6293407BD2BB18BF7BDBA8539FB577F19B72124C2D83A2BC31F44366E917DDC705085B79FE9E0DF0E98E4F6AE3DF63D9B321382C18B95DE1DC4D1DB93B3092C9C6F8C9764 Output = 0x9802D5C5D5A73F9D4E694A8920F951CE4BFE80C13A35CD5332A556136B83495A2E9B4D2ED53AAE1218D2E1C41349311F86B1EE1F2AD5CD3C5B264E8E68906CA45BD7D0FC8E8A5A9648F458CECBA41FD0848A04F506BB11DDB378F3214085CF865BA5533CFD73B28B1E12784F447B156F59A3B68E6EC68303DDFCE59CE33CA386FF3316E6A5E6F9B4201682AA9E59A6D7CB9315A492457640ACCA19FC7DC3A25A316FEA9A0F1D32838B7F911650647F996551263C2D001FA1C720753AFCA316C7137300FF93F2DDD2846CE14C55D0EAD626F681BD11707F9674905396A9BC9A889EAE721AB6407586880A95575A968B43BDF50323627AA0FCDDFA4E198B0008 In1 = 0x3BA5A9C550B8CF6C3B87CC106B6551221A0DC90AC193EBCC526E4E5F53CF012FA6E05B155DCB3C4C0E1A90A01062A67EC434F6744195349194770711EA836A8B In2 = 0x54F04F121D22DB842523E9BF75727D5B0E9EF17E6D727918894927FADE87CEEB2106684C4AF7C49653425E29F7A91ABF8ADEC4DE2CA499DF2534644397E454AC Output = 0x13CA59703F4C087C16A9A7BC7022904A37A469C1D0FD9FA7FFABE8F7D887FE1572C0BF5C75FDE6913B565F8106BBA9C26C9BBCE190A9B8967112D74C0AC3D4FF9D2A385B96833E3C456D5601C74D8D2C9FFF35ABC60E7CC15D7C680F20757C13A415F1B8FBE3C6C32434AA36C528473DD20EA39F0E5EE22D1CD23040900D3164 In1 = 0x570B19E In2 = 0x3B18009209FD4C028455CDB9900AD2529B45BCB63AE44C31F00C5EDD7D907C Output = 0x1417B832B4BA4579992399BA1317FF6034537892B64B08E811ED10E89947226A4E888 In1 = -0x570B19E In2 = 0x3B18009209FD4C028455CDB9900AD2529B45BCB63AE44C31F00C5EDD7D907C Output = -0x1417B832B4BA4579992399BA1317FF6034537892B64B08E811ED10E89947226A4E888 In1 = 0x570B19E In2 = -0x3B18009209FD4C028455CDB9900AD2529B45BCB63AE44C31F00C5EDD7D907C Output = -0x1417B832B4BA4579992399BA1317FF6034537892B64B08E811ED10E89947226A4E888 In1 = -0x570B19E In2 = -0x3B18009209FD4C028455CDB9900AD2529B45BCB63AE44C31F00C5EDD7D907C Output = 0x1417B832B4BA4579992399BA1317FF6034537892B64B08E811ED10E89947226A4E888 In1 = -0x5E0B6C8E3F8C928EF1FDCDEB13EB08C542B3B4E788E601 In2 = 0x2F3EF3255D06D3C6E78287D37B48F46270E1492A07F1A6641CE9B29D682A996F59A48CBEAB50859AD30566464 Output = -0x115B3904F9FC9256104218397F0BD0B7BF07EC01127192F7C2C04ED5CA3057FE54F3137A36C198569DF622B8635F7D74CE943C248EA6273B53B67245AF217E65FA83C64 In1 = 0x198A05D8 In2 = 0x3CAD0058399C667A82D3586EC9C750E2546834163F0B28CC0AF256AB9A9C204741488F8ADCE6057FC155D69325377D6997A187C6B4A Output = 0x60D9BAD602957E1DEC8057D007A03C2D90057DF811675005445F97972C5121FDC25E78770745E0350EFBCCBD792670A66FF6463B0B26F6F870 In1 = 0xBB949E1DB00F1203ABA4C3B1EE66 In2 = 0x860A675F181BFA0A3AE9A6BB40ED734BBCAE5F5BCC10E95E139603D7C771BD4F7BA42E933FA91D7A9344B553322A9EEE58FDCAA48DB483A1CA Output = 0x62376A5030BFD1951CD922EBD1D94CAA19C0880B328336AE1795F06C9D4ACD3F4CE0CDF3BF1374502A20BC126362DDA566C4BCC96D77850067847C3AAC53F7E4F6F4F00786427C In1 = -0x180CD72159F7E6E080B143BCA1ACC7ED3A5A9A5497 In2 = 0xA5B3C58B5CDFCE1E8C299F51BBBCE92222F92D3F14FF49E976259F17DAD09A709C480BF93FC217CBFBAF1DA7640EC186F80EB62CF Output = -0xF912A31E48DCD59565CCC6E65FAC100630532D2083A605557C08CFDC9A31F0B881D84F43BEFCEAE95D356FBED4D327217CE37BC4C7E3F8CD614E3450C9BB7B00D4AC64544E7DC93419 In1 = 0xDC92577DE968EDB102F4DD166C311997494FC1465A0E5A694CF202CE8002065E155EDBFEC64930C83F8D5E2BBFF6C2884604 In2 = -0x6A013A88ADE1C0CAD9C0E347AA292D521 Output = -0x5B55A73B6585C575839E8B3674C33E5FF003BED948F0C01D73CB58BC90325C951552896B26E92849BB95456895F2BC1B9E85DF2D7EBF73698FEEFD3936A98EC1A5A84 In1 = -0x3E93C7EDAFD4D794E1768EF78246D45C542549735D1A36E5DF40CF4DD2359880D95866714D3E1E1 In2 = -0x14AD163 Output = 0x50DDAE91C405D5A93A8D79469F4A60F3C7F877AA189A6A2C46AFB4799FACCCA253573946DFAFF35630B03 In1 = 0xC3FB959E5202F3A25F17720D277DFE4958D66EBD49615310962D35AC6206023DE1A7C44B9AC7EDF1E767FF0 In2 = 0x3DE5504EBBB6FC15304F2DB66C636AC6697D0C431CC0AEBF8084B Output = 0x2F62802E7547FCB26E4DFDCEA44D11451801064AC97FFABD0CA6853E7F991581C865695EAA6D5DE148412C67EFEF3A0CBE892769737EBB6B0B070FE698215E20ADEEE136FB50 In1 = -0x1375275109E077A7023 In2 = -0x1C9D3 Output = 0x22CC2CBF126CD99BC18E7D9 In1 = -0x1DE4500770DF85A0F298B5EEDA3CAB2ACFCE9 In2 = 0xEDF885B509B154AC71AE341854135E540B6BCC657B767059 Output = -0x1BC962E12BD675B50803B8115C1C92F77198113A5FD25C1EB1FADB069E1796AE52731EBBA8CD1532FDD01 In1 = 0x3FADA5 In2 = -0x34C9610F66 Output = -0xD215CFF2D10DABE In1 = -0x2 In2 = -0x11ECB36DD9ED9A0F1128598E6CA26887FDAB5484777 Output = 0x23D966DBB3DB341E2250B31CD944D10FFB56A908EEE In1 = -0x4DF26D6B19CF843C4B283EA7617A334BC70EA35847F274 In2 = -0xFDB8F4AFA89BA798A89A0714B356197022412E4922A87C6D700A90485183BC50BB317F65CC277DF4410489755BA2E5FC639346863CC3732C4D05F39F0831 Output = 0x4D40E6E209D6004539F24A588E12DE8BCA522DEC89C5A3A2AAC522A9ABD61E11DB830B463BB8A779EA42C3903713E8F25406A1BC246BF0306F52715F86C4EB7B663D3C865EA3E9CE05A7A2C9190313A81DD7650834 In1 = 0xA98F2DE45A73CFACD98B520 In2 = -0x115EF0155C49B0A71A275CC775901A7F77137E28AA9C1CF517E4A9E9600BF0E942F8EE9732AF4E4CCE931C444B16C3C23249FAD4DE0FC Output = -0xB8163A364C0032BFE022B7647BB4D5459B1922513EBF4ECB1CC59A2B333A2D901B9D3703B4537395FACCB422469EE6CA705D35CDBC459121BC5290C82FD1B6E4B80 In1 = 0x1952E20297E1ADB1FE86050A9499491A9055DFCBB8718CB8699CFE2D8B4987D4AC61DF3C5B74FE4A0B0B4C9F949DA244E3821 In2 = 0x1A40B85646D1262AABDA42A8A409C598CEFC68339D19E76792B142B600FA578ABA11E080E207AA0E61ECB60676FC1FC4798778182060FEB212C1E992 Output = 0x298D1E8DF5E08567ACCA69A4DA68230E4CFFE1931A5F59C6A6B0651D1C48FB62FB5D2476CE454B110FBD6937167B60C4EDCF022AC5B4F926555A35ED0254C96F5236B7EAC96F6EBF1BD8398D201FC554B1EF74545B90DDCC11638CB4A8AFA25C548C93F808351EDA4D5088930BD2 In1 = -0x23E6681D521DD9D3DDCAC61632A5ED3B0EB596B76F3EA608A34C5E81EB64E13F53414CB55F169124E95F2B1BF5206F0BD5FDB35D2C6155DFBDBC51A1293 In2 = -0x6D08C7C1539CB43C2E82D222 Output = 0xF4A558AF43E3D0D861BAA6B0DEFB03F44750549AE676281CBBFF68041DA0C4699A9E17DB68E69413C3D9264E7CA0D42F31F71A78F05738DCB84A42EAC2BF1B9CA5D3DA37E769590D86 In1 = 0x9589A033A984D72C440D8C73113BDF3E9 In2 = -0x3C27FBE1C134279947753CA728C444B27C6853F14780554514C06E4 Output = -0x23239CA5527DA325621CE946896B62496ACC75D3A599C6B9227318952433DD9208B1249D38DD1A312B10B184 In1 = 0x33279DFD6376351E72BE42F41CAC576E66E5F9100A181BA In2 = -0x75E2E69C35 Output = -0x178E724316D3F61C14AB7334D675967B7E0017AD61FBB950A4D993382 In1 = 0x2D6E0F41861E66848F282D643743FE24BA5B0392AB1C42A8EB0EECF16991B8B67F47F88566DE0B7507B7593F7A58E236 In2 = -0x7365485F828A086E19F5DF820718B90760B28C461197BB185094D64AEC39009F9F Output = -0x147A6A1E5B660BA7CA8692F974B4B0A53D4598762B05B21D5942BEC883E32EB3CBAA56363EDC76813BBD902D6681650DEA3FC124B021FF1ADBDED8E6108525C25FA0BEEA86EECAAA309A04CB9037B4098A In1 = -0xBF6928C38E0D7A886BD8F25E448578186510D8CE4D In2 = 0x410A74CED5334D47C69207AF3B4B3F48C547349E3B1263C00A7BA51A5474E6D4FE5BA3540EF19BD404A3853F6E440834 Output = -0x30A184CB8B353D03F720DF8140B6784E8E3776D00ADA9467C4B83266ECBD97BBFDA9F23AAF3853799E025FC91222D04910BAF529D89582562B1E826F211CCD853D14F04FA4 In1 = -0x1BDC3298C6CE0101BD56ECA54466DB2009A5DF49F2D9743F53BD1B12501D750BF9A824C0F62541B5FA2F In2 = -0x5A3F15B6601E5CBF674F9A5C0F6D1AA980EAC675F5409D1A Output = 0x9D2475712A5BAD847B37969C5940CD226E0BC8D703CA41403460569B1338F8AEACF6CE1299AD0027E25E7D917A94B4DE8F1478340B95D91A1BC3A63207DCDAA3BC6 In1 = -0x108D97B010954BC30C97F41F9B2BE3604EE39C619400CD912 In2 = 0xDEAFD5AD48C2EDD66295E707D1B20C71BE1C1CDA0F7D20FB01928702582834BEC8125C28ED220F4FB7EE4F99A06C1B5670303087B5517AB6FBF1D144220 Output = -0xE66282663563AE0C6701E42896585EF8E5D77E3AEA8E97BC4E2BAA1BCF7B97471840396656E9A717E44595BB5F6C455A48C4D8D61D4FE605DB72D3AC0E609E1EB72461E079E1AD2BCF2F9D196A8FB407DB150F9C640 In1 = 0x4AB9069FCE6B4A4A65BB8A7F191B5690EC140A0EB62FDCE7F06337D4A In2 = -0x3CD7F5A8685FA64F14CA75EF841DE19552CB23150CC4016FC24FEE4902EB13FEC309282CE74EFA7C19716C1D0ECDB36199D676261BF695DEC504A7C7EFBA4634 Output = -0x11C266A63FD1E0D66974C13F9904BBAFDFDCE7C578FEDABEE2C70DE8FDD8238CC94212C055A8181AFCBB6AA1C7689DC9D8A37177249AED84C56EE58521297678D35525C9CD5E745C5E1EE42435A09B8E4A402BF3F7102EB66747BAF08 In1 = 0x558D9B1E2226B0391CD0A9DE613C5297D9B02ABC04094E9BD6123719DC9CE9722B0590CC2BC006C79230A6736CF80BC529B483 In2 = 0x6BD51C914E380ADC0 Output = 0x24096833B4A89D843C7FFD803CD734E9B0C27685F63039176F6D1596687432F6AF1043D15C333129E91720513FD4AB2C2A05587A580823778C3E940 In1 = 0x2690DBCD87AC52B537A547CA13EB85FD8A9841CEFC6CCAEA891E4BF01AAD8140BEDC8D4609DFFCC005448B19AF90963BA9D70AA64554114E725C408C0AC1 In2 = -0xCCC81EDA10283A8CE840D074D800856F3B2F47C5D50C1AE65B0D439B19 Output = -0x1ED994F9543BB0A5FCF4A137DEC85A2CD5ABB2E5CCA0D0D3AAE7A70976558C0C22B95B24BABB7A15254376923D8DE07F51900E651E35E7798B7189E6D3F292A7800647CD25D3008F0A7B54EC238AF795714E1EB45E3FE4B5B2E7D9 In1 = -0xF056B548F9AF6F8DE2EA0214057E2ED5297F1588A056F1081DB0AC50F65DCEE8B384B02DB420BB978BBD2B103D5AE6E5D97B6EF9D2DF026F91AFBF888C In2 = 0xEF0BF9322ECC7 Output = -0xE06C30EC5E70699D2C0A6E7FDA5BDD8574F2B7EE052350B21F985AAB32D98661A857F0F5189EDD9A37B1117256C15AEFE70F931B9AE8F934B040BD43A957B90B65C34D4 In1 = -0x1B3BF21D6FA3AFEF4E7F3BF8345D3D16A5E62768BE665847D23BBEBAF4327F47666954D61CF4C56B8C095BB06690DEFC8EFE554D64C58D3EE14BF9FD667144D In2 = 0x4DA91A30F9660632271CEDAD857A9DCD6A84A1C150F9953F8DD55E643D72310B1D4BBA17324149D85DB686E231A4 Output = -0x843052EFC5F7ADF8502434F4F6D457B0718196B3E81FF36DE4CBA34924DE02B92466B349DF6533B9C6357141EEACF947E42FF7871725DE713A1269FC594AB9D587915BE5E1767EECC7D3DA285B9C96ACC52E6E39A991F468D42DA637EDED89F099A60C4CCB48EDFDCD4EE5BE54 In1 = 0x1728EA6059B02F1F7AA518BAB0F44EAD25DC2329A563BA0AA674FC73312625B74E11192741C7C53B6DDEF51ED3 In2 = 0x234B78A0ED214751DBD0 Output = 0x3316BF19360E706EA7B145B20171892ABF3FF09D56FF43A3E5F6E8C9BDEA9E047548188E50AF04325CE1FE5E3954527B31E4F1E4A8C70 In1 = 0x37E143072FC0C5906CAE3882433C1FABBABA02D26F8E5BA49594A97892DFE26A41A5F07066B701 In2 = 0x7E539D529F574D4302FD6041EE55F437B73EC74864CD6708D7D62FDE3 Output = 0x1B931F5D73E03460481891D494134409BF8FDC6469C807392D796DA9ABD6620E3FBD0680F2ED34DF9955DC4C3E521A25E3433B482489E7A33C84D41259B2D83B95242E3 In1 = -0x2E4A99C5B35F2AD35B2DF5547FC34B8C828B029EBAF3E6CD633A7440E1F185A83 In2 = -0x2177DEF6E90DAB1DEC026469B59C32DECD5C4A7D1AB6D34D5E19DB7DB0B5 Output = 0x60D4AD14E3339F908BA27AD8C2C7FBE059AB4C4E9F1C15FE0EF9FF1CF0BAE792073312B8C19DFE4BAA12463A96B110F9CB526B696FB5008FC879FD690E9F In1 = 0x5757F6D35AEED2F8BE2B76C1F65C9DD537F9123647A81CA542233CE1 In2 = 0x10F0FEB6606BF4075933A343E3076B48D938B440E1D7A5545967A87B9B7E80F46F87A2CFE Output = 0x5C7B8CC1C292D26B5BAC01E2D381CCB7C9A23EDB98D4326E98E6CDC201DE0E7DB1A12AC771F3F7E3B7E3B2D9E93C5A8F477B9CCB5F06B226E5A84FA0A8A7133E In1 = 0x7256C81379A7601D8F47188E70D172C733529288928AE64ED71DD6D41024B6927B8EA5E53E0DEAC56CF353EDDCC6BD00214788B3C276F2B984E1859 In2 = 0x5063C2F61C2ED5EF0F349C65055124E21E8F332123AB2C60529C0BEA6A23C33A86873123358692C33B2FA94000CDA21FDCD5BF0001EB605308EABD728D81AC15 Output = 0x23E7AD292525C7B234F72157B119BACACEFFFBD27C8B7F9841539EC5E96B8B389F855A01B6DACDB7C11C2E7E1E5DE7B10221D444DC69A974AA1F8D840C98A52EBD4E5EC677447AF6FE431067248034A8CE800094EB61D06747425E63B432E83C7BA6972CFCCCC53D39061DB87BB8622995B15CBF9E2B84D409CCB4D In1 = 0x2D7C9B In2 = 0x511304D37488A38400EB81D442428A70835A36196F44919B122916AA57124668254A3C19D25F9E534B9F Output = 0xE67CE2605D47E7C231AC473CA114EAF1F689ABC4BA2592D4D76E8E1CC8985F279A12B1998E05785398002CD45 In1 = 0xFC92ECFC6218E9F5C5CEE8518DEB7B10E5E75644B333F8E62A165D9B64DB56E9663BE5D844D7C60A9 In2 = -0xEBE541C99DF3587B69BC469CFB54FE Output = -0xE8BD0FE1E52EF8393E81036CA38D5FAFB8ECA5B96E6887E77EB5C918F64F3003BD0D31184000771176243265EE8C9351CCF80C172D25BAE In1 = -0x3B6E4E1BB9D40A9F5609648857BC5B8BC4C5BFA7 In2 = 0x19959E286378177828AA51D787338B149C1529F4AB6A7A17403ACB849ECE08E863AF00E717205737CAB90F51F4927E78A7907D5B02FF6A4B1A45DFA113E09 Output = -0x5F0818B9FD1B7D5C9D9FAEDF5EF9CB9E23FCFDD83DBA40BF49DABAA8F540675EE121791FAA64CA8AC5597BD4A979D31FC0571D26D4F07548E20C2FD74B9715C3E0ED4A8DA9449933ADC2EF50DB879F752EDF In1 = -0x27A67AB37F0915ED8760819FE0EB511AE453450EF1AC7C9AD66A42453C33CFE3E23ABF4143D536D345B0633E8BB451801F8E7F013AFBA4195DE6569 In2 = 0x62A168DFC5145559D1A8C60684CCB8EC087D050AF56DFA891D36CA3394309CB752051797996CF06B9538F01A84A9868DA78C179D7991A696C77149DC22E514 Output = -0xF46BAEA2BE86FB8F8E6E87C5F6DC565F38151B5B2DC40479D9AC00519ED1DAC6CECEAFBE9C3D54D971068D45BA10D95BD810602CC4763574859EA892972C483E08459A5EDFABE33840B461BD63FEA1CC6CE2164F7A72FB87D99567C857A6D5FA9519FAE2242E9611267389201A0FCC1F9C0216A582D05A08D934 In1 = -0x1A78FC6F1FDC0E117022759157F08600 In2 = 0x719A820AE158385E601413464E Output = -0xBBF61A778210C63D181E023663D6D699866B2373046B421A681ECD400 In1 = -0xA2BED87EA8F8C54786543A59DA78D88894133A70CED72BC63491A0BC5E9681 In2 = -0x2D4 Output = 0x1CC43BC4635DF8DEE47E635061DDDC46242C6614708F887CC8CABDA94BB81A4D4 In1 = 0xDE20BC2B13A3F297B28EFAF3DC537F754B8CADBA839D113BDE4EE93C803C505F5C0E8A6F31FC86 In2 = 0x238C0158E854D7DD20648B5A68296C23083A8CC3BAC8151A25A2241453221B362E1C8E1771E67411CA006BB2 Output = 0x1ED7F4CC10D24A47F10227E558D210B9DD5DFBB1704F8EE61AA8DA8BEEED8D9E7AFD751C3B5FCDED020D063C87173C852D9960B10BB27DB062038530D71A0AFAADE6B72DDFE8F2B6FED83512F5E6E2F14D972C In1 = -0xAD4AB34D10F5884F944F9A9BF2BACCF903966510D0A03C382C9F892E81 In2 = 0x3822FD0367CE02C06AFC1D44ADC4706A94188C026981146554973745221F6D8A3 Output = -0x26000669CD49BC347D4975D6C3206E73CC2C606005415AEF2358805BAE6C546E6BE85DA96D79BFD1BA7DA32EE4791AAC046D1C82F718125C128A48B7423 In1 = -0x5675C48CF6B5C4474E50B2FCA5E1997036C8632A20D2972E0E36A88541B5F457ABBA In2 = -0x64A2EF29693E791C3B1F7D540FB31DF15DBC4475EA53AB13D86C494DC3F487289777D001B64A9C71E81AC6774D6369 Output = 0x21FD0813607A9BA3E3264AF5B3975ABD416ACE2FF2D06DF0662936CF72A223541F402C9BA565159C116D6977EA330E8EE3FD047313F69E86A000207F909CACE7C69DDA8D174AF3725B9D30462D3C505D4A In1 = 0x740A98DDCA8474C0B9021E343D386 In2 = -0x4DC7DCC367BD8560AF Output = -0x2341C84938C97AD93DA19C2C0C1457043E98EB49D4DD89A In1 = 0x24302E6CC8AEE123053843CA9919801CB9F1472D07FF6E92AF6BBF560A40970E70BD634 In2 = -0xD454745984B01C25C194329B9581B8AD713F381892F77E9D301D9BC8BB0F0A176B7660F826851DF0195 Output = -0x1E03D6B3CE6DD79E804C78238EC54AD6AAB201061B327139D76C9884EAC3FFE0E535D9D4BFC1A8F52403802B3BC9CDFFE79F063799D6BBD28CF45339A05F91CAA084ABF47AFA985ED39105E044 In1 = -0x38BF13F505BEC089F6EDAEBD1FCDA0D8852C6194AFBAB8BB8 In2 = 0x218929E08DE5513D194E3AC02EBCB70C6B7C14393CECC659665AF12 Output = -0x76F091CA4B571243534D60FDD7710B0F532A6531025732A92AD22D86372CA2A249746ED218EBFCC5DCAE8B43B589773E62A9AF0 In1 = -0x1888C92BA95F548276290FE3A2 In2 = 0x747E299922AF5A0D3DC5F0DAFCC179F3B0AF8D3979B862588CE44E3573B2D7E7318101D231DADF6EA1D0C81E92C11243711FFBEB Output = -0xB2A12776187C149E131BCBCCF378EA3B9408CAC28F3781A55BAD46905D480F2AB3E4F08F7A64D393D7460294E00C3013723F2CB058D2EB35D313890875863CBB6 In1 = 0x1DBD1900384B4A7A0A1C140EAE72833CE18BACF9310969DD8628149981F280EE31996E69E5B8 In2 = 0x76F55787D836A81BFCC0D6CC6BEF4309C7C5830955A241649552F38BE15F02204C51A Output = 0xDD1A9AA127DBD249BBA17FBA6E05741877EC9E9EA5E6A109D6340E23B5CAA924A40400CE1F22543D198626AEDCD2BA1CC98938ACFD7BF731160B51C7FF16EDAE7D1B5A36BB67ECB0 In1 = 0x2B967FB644A63FF17898BB63 In2 = -0x60D1F4157F1271EE75067CD28082A4D6AECCEA3A636A712711B019 Output = -0x107C2F51B841646D470881071A6425C87A0FA61BCDE5FC885BD3C99CD84A4F66E53CE14E515CAB In1 = -0x3863CD446D6F7A196A5589D2248013FED088779C7D132A8A92DE7CEF62428D12A65A6703C9F125245E9F0E7B2 In2 = -0x31A6A0F92E9A42004CEA2A79D3F8EF77A1C1A107E89143082395CC8C06B43F78DA60F1887A Output = 0xAEFCE7676F2A211BA43AEC26309EDC7F46448969951490384DDA7E99A7C8618A6A7174E952979462610315A8B2D1FFD9AA7EE39AE06D6A84FDE1BC8098750FEE5D85C55F432BB9E10F868AA9DA5676FAD4 In1 = -0x1F15069789259C5E378B4A78B21177D7852E1E2A67E5983C2F497F04275768166CEDAE7514CAD44B561F44 In2 = -0x18AFBB61B46A7FDE5165F70D14418D18686400FED1EE2DC682F71B Output = 0x2FF4EBDEF222ED5DDA641D105B32D9923E208377CC765DE2C83C4491286A155B287488EE971823BD55ED39454A5EB50B2B2DB04E410519E904BF316777CE8AFCDF282C7E82C In1 = 0xFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 In2 = 0xA3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000112AC1C9A Output = 0xA3FFFFFFFFFFFFFF5BFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF5C00000112AC1CA9FFFFFFFEED53E366000000000000000FFFFFFFFEED53E3660000000000000000 In1 = 0xFFE32ADE79F13069CA8FEBE1CDC589F26EADFC7F479E31A8CE3A817D6067397F In2 = 0x17AE95CC69406271F51D96DD95F0C25365BBDA81E6DB59D36172A931B21CC8F1 Output = 0x17ABEAFCAA59BB51CCCE3ECFD0796AA817E5F81E8FD76151EFE17CB21B9ABE1CC421EB978EFBD8E21756BE4EABD32DF1C6008FFCB6550088834103EBFDFC588F In1 = 0x3BB501782D8513D46AFF72C5C1147E0DE6A0103FD4FA3EC985740D25C9B1AF8A In2 = 0x17ABC5C512534C3FE776699AEA22A5D9BE0C6891A32C028CE9EC9491B1E93A27 Output = 0x585532A080F20C1554C3EC2E8EEACF75B539FFE15F3AF18912B4CBDB0175C3171C37ACB8A725DF5E64EF671831BBEE8359B4C1C8B09F3B31BD932B52A710206 In1 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In2 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Output = 0x4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In1 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In2 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 Output = 0x4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In1 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000 In2 = 0x800000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x400000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000 In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 In1 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000 In2 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000 Output = 0x4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000 In1 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000 In2 = 0x80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000 Output = 0x4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000 In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD42119822E32EC61A1EF372CB3E2DD28C259C527F939A26A86D2127DA5EF377DD69CD3EA474 In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF781FC8EA7C4BD4EC2C350A3ED4A9E8FAF38E1E0CCCCD41D7214B8BB616F898A8470DE49CB67F32 Output = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF781D0AFC146EB81AF24F293247752728C61A43A91F4CD57147F3FA4BCE53614D687F223374FCDB2CF91D886CBA2C2E62A577DC266D1804AD45CC2E28ACEDA9A2C5496B7989261D73220FB0E74FA2F09B6F1224B8BCE5D34B67CB93457E824A9CDB2D8BC449AAA8 In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF781FC8EA7C4BD4EC2C350A3ED4A9E8FAF38E1E0CCCCD41D7214B8BB616F898A8470DE49CB67F32 In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD42119822E32EC61A1EF372CB3E2DD28C259C527F939A26A86D2127DA5EF377DD69CD3EA474 Output = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF781D0AFC146EB81AF24F293247752728C61A43A91F4CD57147F3FA4BCE53614D687F223374FCDB2CF91D886CBA2C2E62A577DC266D1804AD45CC2E28ACEDA9A2C5496B7989261D73220FB0E74FA2F09B6F1224B8BCE5D34B67CB93457E824A9CDB2D8BC449AAA8 In1 = 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0x1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000001 In1 = 0x1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001F In2 = 0x8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFFFFFFFFFFFFF In2 = 0x1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Output = 0x17FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFE800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In1 = 0xFF555A18F82239DD165C52A4C5210B64D70E18EDDE4D833EFE6529627A6D485ADB0C4CF74F38A362C786CA2C04CFA815C3253E5DEEEACF317E2F621BD015DAB9FF555A18F82239DD165C52A4C5210B64D70E18EDDE4D833EFE6529627A6D485ADB0C4CF74F38A362C786CA2C04CFA815C3253E5DEEEACF317E2F621BD015DAB9 In2 = 0xF4AAFBA87A45D7AE7C217CF11731C1B247EFA7CBC325B72EE4B7BF8A2141CE088BD11C6C42C2D98F3FF36CEC51CA2971F579243CDD97C249612583D8D1738649F4AAFBA87A45D7AE7C217CF11731C1B247EFA7CBC325B72EE4B7BF8A2141CE088BD11C6C42C2D98F3FF36CEC51CA2971F579243CDD97C249612583D8D1738649 Output = 0xF407E38E5A63579D70CABA83FD8FFE4A59FAEF258BDF3ADC17F12CECBA6A3CA774BF1628E4DB2CB885E2AE694A2F05A32E932AF0D435AB4C5D0280D43C9C460B2A917EBCBA2EDF555BD0D0A9125AD110978DB3931DA25C5786B63A60EFF323E09E0815C203C1F790DE59AE13F20AE5B5B1FF96673A3BA0E0C15D12FC8A0BC0D4790B52CE6533B7D2654171C62C05A742212A99B597A7081AC598EDFBB0A791CADDD2E90958F268F82B0B50EC0588BA81D845ABFBF7D63FDC6BB2A37C5E42AF8B4281B7A00568301A7A3B5BA1173AD47BE397D54805E3E69F56D3E0877B1EAA91B489E9703A0B9E1FD29451415DACDA6F54D9408591D04A480758115410D334C1 In1 = 0x1756B56CE57F64C2126D870BB3747422527219980FB5B3194E10862FBA086918DE0C51BF3E332A088E3220250220E45C09D4C3AC34BBD02EC676821AE25608F93B9675AA92C20EB In2 = 0xA2AB2077B4DCD709754E597599535B2D141EF2CCB40DDB463E0D24BFB61156EB5AB20AFEE3F23E7F31AB70358298D36062D2186B0B6E3F4B555BD08F65F175FD Output = 0xED478AFD970F5D8E22B1E85E2C186CD98172870A148C78475D57F7B524BD7752FD6F779A440CCE75981160644EC06357C057BF0BF3B880900F38AA0DE6E8B7EFCFFEE2AFE75243A1C03AB249BEF09D30817B42FD55292F8F135757359B858488BDBCF8846E0A0B8F51E9B14930649541EA6BB22AB2CB38DFE6A0666675EC48E07D92B70FE2EF3F In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0x4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 Output = 0x4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In1 = 1024 In2 = 0x918100000000000181fe7e0000000000fffe0001000 Output = 0x2460400000000000607f9f80000000003fff8000400000 botan-2.4.0/src/tests/data/bn/powmod.vec000066400000000000000000000256121322470703100200720ustar00rootroot00000000000000[ModExp] Base = 0x1 Exponent = 0x0 Modulus = 0x2 Output = 0x1 Base = 0x2 Exponent = 0x67 Modulus = 0x96 Output = 0x8 Base = 0xF53 Exponent = 0x17C Modulus = 0xFC1 Output = 0x1 Base = 0x5EBDAA Exponent = 0x86CA74C Modulus = 0xAB17B43 Output = 0x4760F28 Base = 0x8466D0C17 Exponent = 0x67CA63635 Modulus = 0xCAAD20657 Output = 0x4484225E9 Base = 0x7DF406A87 Exponent = 0x508DF4A9D Modulus = 0xFD2785061 Output = 0x16FAB14EE Base = 0x153014C3EDA6813C33 Exponent = 0x3F015 Modulus = 0x107A2F9D441C723BD789 Output = 0x1511E0BE0F7631CF62 Base = 0x2 Exponent = 0x400 Modulus = 0x77E8F1591092967F286A46030CCDE683 Output = 0x4C2C52EB1054E501720FDCC043CEB086 Base = 0x2 Exponent = 0x1000 Modulus = 0x43729A4BE70 Output = 0x466BDEBE40 Base = 0x2 Exponent = 0x1FFE Modulus = 0x81E644685F4B7EE718F2E18F84195651CBB7B27 Output = 0x3EFEF820185A68AEC5F04D44FA3B0906721CD1A Base = 0x2 Exponent = 0x10001 Modulus = 0x1B63761AFCD7F89A44714FB1ADDFA28668B5808ECAEDFC5930FE44965503F5B517D0430C9612BE6FC1E4EC2275F0FB6A05F729AC0B Output = 0x175E1C5F2E9B222B6F98898B694DEB7D5F0549130A24850B7A1B4E78D3CC6B791C1F8F2F7934DBEADC3DBAFE3F91A21E7D563269C3 Base = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Exponent = 0x5000000000000000000000074AED6FE50A167FD03000000030000000000000058ABD6FE4C24510367A7E36EECF121FF58ABD6FE186725FF0000000067A7E36E4C24510304CD23FF2000000000000000000000001B98192F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001 Modulus = 0x18000000000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 Output = 0x11A0D334E187609000A94A5C70A9BE6023C0E37127FB8CB79DD822C3D9969692CA8241937C6A5AE6F818B16056838E58702C4081908C35FA33D9380F2A91B9C943CC8930337EFAA6D146B26030FA7B3FE07D5ECFE08B9F5D0DB25439AC232DED14CCC30CFE06D389B6D9A1B7B9EA0BB1B8A5D3CA15F3006A0D232A3F7CE1C3E9ADE55965C75A896D2F1EBF45E3C3A28D368412AED6E90C0D4E71D882197AFD52C3D22C8ED705AC096E55E3D6EE1E5A6E91C7C0175377E4094589D65201507D6EC493D9B5D807F720CF029EA958EE5B33656DE875E973AC607F9F93E687582A5104DF8FF8EBE247B4B27EA37AAB82989CCEE5126D49D6A9886A8EFFCA57379890504D04FD4D79F539C6D0ABCC44C851EAAC381CACA826487A56D0FDA8824BCC86F96A04C34A07B024B0E1186F2ECE5E24420619836D110AA9C23A917F7978AE9839 Base = 0xDF2F1FE817 Exponent = 0x61FC837F5533B6E7B2EE3F52AB56F5C0589498D2D4B71A7A671167C770C04 Modulus = 0xDA22C7614016834D35447546DE13EF75CD9FC5DB3C1C288E2AAD327C1CADDB Output = 0x467902F517D87B73F3E80886FBAD58A2EB5802357332E5E5F2A29A3AA65225 Base = 0x3E1 Exponent = 0x5978AD6F0C41D9E6A18E639644703285F96C10C679486F4D548B82624EAE11 Modulus = 0x6E8E5805A00D7013542D3E31F8A52B0591C09CD8C8267DB275A667329BC931 Output = 0x2B31F1B1C994C95C92261D2BF3798E95BC4B3CA33ACD8622622CA200B6F6FB Base = 0x16CD Exponent = 0x1412029F7 Modulus = 0x74FA74286E240E3DF02A518674E31B66AA1ABE2038C311C437802BD2C4DF30E9 Output = 0x5B3617148E895F7D63F3216FFE940197D3A564EE652A1B7EE1F84EEC7D84F016 Base = 0x2E2C Exponent = 0x329A5581DDF9C439EE1D22B176255CB7AA672728CFCEA12F531D9889ABEF Modulus = 0x19DB2CD3ED192BDB3BE14B52A22078F4AE69448B22FB3C47B803A2535B3F762D Output = 0xAC89E841A0426615B950D0C1CE728E85717E6BF49E9A2BAAC4514E9CC8A6BBD Base = 0x138615 Exponent = 0x2127B4E1C672A6EF82093E16728A170D8A99E179ADE1344572888D783E52 Modulus = 0x567E4E7DF343DF0314D70D9C43635E4CA8D9FE41BC3901C8EE05C4A4F479 Output = 0x4F775AAE8BABA7A2AA1A91CA86FC8EC9315F26443D0952F64CECD24B768F Base = 0xA96CAEE6F99D9055DDCC9A67E1AAACCCBEB40D2AFA23565D2AAD14A0E696 Exponent = 0x247 Modulus = 0xC34845CD0DA4F10377B4C6E5A4623C8EE57203AD6115781D3C5923E974F5 Output = 0x8EF8B5D459374F77917BF2A7313839A48E2431D19B298338A589CD8EBCED Base = 0x1675F91BEA439A713EB30C74808BA9DC66ACA3434F174D2E5FEBBA71AF65CB Exponent = 0x2D2B8E04C242812E51B344CC0C2A98237007F9ACD0DE78DC468A9CFF2D49BA Modulus = 0x5F35406DFB34FF909E03EAC32CB6DB15E5CEFA0E59E988865FF1252A58DDCB Output = 0x5CC3F888B0EE4B4FE58BFA4DB22C208E263D160A61D7525E0BA1A96A6F89D Base = 0x16424C11E95C77C77A2BDAFC609AFE148 Exponent = 0x1234184727EED9852361FAFCAC391BFBE Modulus = 0x1A16EB76865E864137D7C72C34A3FA2DB Output = 0x151AE807B0CE712C115FEC5951E7E9F0B Base = 0x12051528C4525101CF07EC5E3FE9EF476 Exponent = 0x3BD6BA22DE280B77FAEDD1A70CE82C2B68BD Modulus = 0x6E34D5DB17775C0817A89867EBF663ECFA79 Output = 0x65A6609E9463D28CACEA2E0C8557B93DE15 Base = 0x2FB5C95D5702990E91A7F439800C51988530BFB Exponent = 0x81721C65F5D8F9C6206549E5C8606509 Modulus = 0x4A98FB939327EE13C11013A1C352F4C047A9D0B4B874D7B387D6BD795BF73BE778A92C5297BAB409F3A14DC993197 Output = 0x1CEEF3177FFD9880EC503660284939B934A122CD5E92880B36B5E86B7D3D7A6C327FE047CCD74FEA3D444F4340FF7 Base = 0xBF791361D54005F624FEB32A5EECAFFD2243C3088F8945569ACE8E0E0D0B00489B4ADA19F5967B82A098DB97 Exponent = 0xA9F22D3362DA654FBA8F884C4B386ED27D5F419684B8D56C5C95CBE65C05AAB9EA74D8EC41C0D79FC089A86F Modulus = 0x101F513C66DFB89F1ED0D03E0ED1F2FA3FE1AC6B86DFDB352D2B5979154D2C22C763101997DB94E91D777B3B7 Output = 0x79998AC2C00348A5C5C166D5948805AFC5F4B7A85C14312842830FF93EC7B678CC59E21DAD6C531BA5E2142C Base = 0x2D76D19D8AB4D88E3C1D0286DCE731C4BE9CA39BA0A329256A2BFBC9F6994A061424FCD955AB996196F8BD0DE0344 Exponent = 0xC428A6F75C999585FBBC7CF9F6926D71D30DEEC76886FEEDF49CCB0D95FF46101C217551278455BD26675CD50E0 Modulus = 0x796AC6B1AF58EB618DB5C07DF2901A45B07E36FF5AB7E2F531D8F21A337BE4750617CF632BC6360A0B7A9219D3089 Output = 0xCB92647CAB4D0ECDED534799957780D7617C3EC6C9834B2A829A13CC0E861EFC3529B056CC9FE05CE52F96B851F2 Base = 0x1EE84446B082ADEA57DB1981FA4615E5F3 Exponent = 0xE20B04652F017DC01EBC1C57E6FC598E9E Modulus = 0xFA7C9F013AFC6FBC7E4A1F3EAF8DFABE8F3DE9292A4E8CCAB4621DDB24E20E25E8289E3D79B484643B1E9ECCC74E79 Output = 0x70D1913C72834BAFDBBBCBCF7A856DA47D1277359A668891D2022E3DF4A723A8D10ACA7C7D5FF3021EAAF5DD34B02E Base = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Exponent = 0xB69B09104B6014D160140841309969A4 Modulus = 0x8DFA80DF945656CAF186B302053E2F1CE6642A2CEC217CC4FB3714CE0EE5E3D11EA777115F24F3F53EEC9A1A18613 Output = 0x8CC7007D059A8C83BD42518EB540E1218BE0E0F1AAC1687F31A0D1472E16F379C7C1CE0096AD5FB47501426DDBE1A Base = 0xAB155850CDCF1D13A6FE80EC25C8D17A4F5 Exponent = 0x280A08AA00A220AA002A20A0800A0008AA2 Modulus = 0xB0AF5E718307F0F558FF91A5DC7578F9E2D Output = 0x9907A436B00B46A54D393E428D2B42E742D Base = 0x40147F79DA93E8D3F21A11E66D2F08F445BABB7AB7C3C2EF1B94312E6CBF347DC65831F7C49EE202F8E6F77233FB3EF7E462D5E4D3C81DA2CBC9335F9B1A7F51 Exponent = 0x2 Modulus = 0x962EDDCC369CBA8EBB260EE6B6A126D9346E38C5 Output = 0x51ADA2F6C0DD379DEA6F45A50B91E9A7A3481EA6 Base = 0xFFFFF80000000000 Exponent = 0xBFE01FFFFFFFFFFF Modulus = 0xFFFFFFFFFFFFFFFF Output = 0x8735B122788A46DC Base = 0x70000000FFFFFFBF02 Exponent = 0x1FFFFBBFFFFFFFC002 Modulus = 0x800000000000003FFE Output = 0x609529A3F5345D0A1A Base = 0x3D80000807C000180F Exponent = 0x7E037FC10007FFFFF80E Modulus = 0x80007FFFFFF8000007F0 Output = 0x24F01062C097A00AE0C1 Base = 0xBE0000000000000007FFFF Exponent = 0x7000FFFFF800200000 Modulus = 0xFFFF8FFF000003FFFFFFFF Output = 0xD34CC02D9BBB5F1B3FD65E Base = 0x7F7FF007FFFFEFFF00000079 Exponent = 0x8000000000000000003FFFFC Modulus = 0x807FFFFFFFFFF000FFFFFFFF Output = 0x3A298451F401ED3F361B3E83 Base = 0xFFE0000FFF80003F00000000FF Exponent = 0x7FF7C00200 Modulus = 0xFFFFFFC00000000000003FFFFF Output = 0xCAEB2FF794C6783C4F1F06E684 Base = 0x7FFFF8FFFE00FFFBFFE000003FFF Exponent = 0x3F8FFFE00FFFC00000000006F Modulus = 0x8000070001FF0003FFFFFFFFC001 Output = 0xCCAC1B86140C6F650017FE6993A Base = 0xFFFF000007FFE00000000003FFFFFF Exponent = 0x8000000001FFFE0001FFFFFFFFFFFF Modulus = 0xFFFFFFFFFFFF0000000000000000FF Output = 0xE6E68CFB5864CC3EC011E84DAD071 Base = 0x7EF80009FFFFFFFFFFFFFDFFFE00020 Exponent = 0x81FFFF000000003FFFFFFFFFFFF3FF3F Modulus = 0xF8007FFF8000000000000000001FFFE0 Output = 0xBF5C09CB4AAFFE50A5598A04E403D9E0 Base = 0x7BFFFFFFBFF7900003FFFFFE Exponent = 0xFFFFFFFC0000000007800003FFFBFF Modulus = 0x800000000003FFFFFFFFF87FFFFC000001 Output = 0x1729F5569C1B022EBDF418F5A084D6D069 Base = 0xF9FFFFF000000FFFFFFFFFFFFFFFC0000000 Exponent = 0x83FFFF000000000000000003FFFFFFFFFFFF Modulus = 0xFFE007FFF9F83FFFFF8F000FFFFFFFFFFFFF Output = 0xA917797602DADCC854BD67D27E86BB1D6575 # OSS-Fuzz #287 followed by some variations Base = 1024 Exponent = 0x1000000000000000000000000000000000000000000000000000000000030400000000000004000 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000ffff Output = 32 Base = 1024 Exponent = 0x1000000000000000000000000000000000000000000000000000000000030400000000000004001 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000ffff Output = 32768 Base = 1024 Exponent = 0x1000000000000000000000000000000000000000000000000000000000030400000000000004001 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000fffd Output = 0x3a130cf2e4c28710c6661c071e38d642150f28479017f313d2a855564458f9a958753fb286d6b6e Base = 1024 Exponent = 0x20000000000000000000000000000000000000000000000000000000000608000000000000080 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000fffd Output = 0x9943fa648c48cb4cd01756bed11e3382aca74d84fb0bf8cf8d56cd4524f80538d4888cbd23b8e2 # Check support for negative base (GH #1168) Base = -5 Exponent = 10 Modulus = 37 Output = 30 Base = -5 Exponent = 11 Modulus = 37 Output = 35 Base = -0xFFE0000FFF80003F00000000FF Exponent = 0x7FF7C00200 Modulus = 0xFFFFFFC00000000000003FFFFF Output = 0xCAEB2FF794C6783C4F1F06E684 Base = -0xF9FFFFF000000FFFFFFFFFFFFFFFC0000000 Exponent = 0x83FFFF000000000000000003FFFFFFFFFFFF Modulus = 0xFFE007FFF9F83FFFFF8F000FFFFFFFFFFFFF Output = 7559902530247723476756105022122181875899018 botan-2.4.0/src/tests/data/bn/ressol.vec000066400000000000000000000033741322470703100200750ustar00rootroot00000000000000[RESSOL] Input = 5 Modulus = 11 Output = 4 Input = 5 Modulus = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151 Output = 5128001483797946816458955548662741861156429216952843873274631897232136999791540518339021539968609345897897688700798659762992302941280478805021587896033442584 # Input and composite modulus which would previously cause a (nearly) infinite loop Input = 4 Modulus = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057149 Output = -1 Input = 20749193632488214633180774027217139706413443729200940480695355894185 Modulus = 26959946667150639794667015087019630673557916260026308143510066298881 Output = 1825097171398375765346899906888660610489759292065918530856859649959 Input = 64 Modulus = 85 Output = -1 Input = 181 Modulus = 217 Output = -1 Input = 4225 Modulus = 33153 Output = -1 Input = 2048 Modulus = 31417 Output = -1 Input = 2 Modulus = 4369 Output = -1 Input = 1024 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000ffff Output = 32 Input = 1024 Modulus = 174763 Output = 174731 Input = 1025 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000ffff Output = 7195614950510915163755738138441999335431224576038191833055420996031360079131617522512565985187 Input = 16 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000ffff Output = 4 Input = 120846049 Modulus = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000ffff Output = 0x40000000000000000000000000000000000000000000000000000000000c100000000000000d50e botan-2.4.0/src/tests/data/bn/rshift.vec000066400000000000000000000160211322470703100200560ustar00rootroot00000000000000[RightShift] Value = 0xE2001D3DD54A53C2BE0EC9BBA26AF4205943F6E88367B35AAC9227D6D7303D3A305BF685254BC8E3D8921F Shift = 0x47 Output = 0x1C4003A7BAA94A7857C1D937744D5E840B287EDD106CF66B559244FADAE607A7460B7 Value = -0xB66DF12F1D32958A1CA0FB8BC5 Shift = 0xB7 Output = 0x0 Value = -0xB66DF12F1D32958A1CA0FB8BC5 Shift = 0xB8 Output = 0x0 Value = -0xB66DF12F1D32958A1CA0FB8BC5 Shift = 0xFA Output = 0x0 Value = -0x1BC9894E685B695947DF9A844A14F404A453E6D7C7C004DA11F0808A4EC47D9A9E06E91E5A4A6F9A220A2 Shift = 0x4D Output = -0xDE4C4A7342DB4ACA3EFCD42250A7A025229F36BE3E0026D08F8404527623ECD4F Value = 0x14B61F50366E84EF0FA8C87842CC67EDD20DD3B2EDEF08637F831DCFE2F292FF98A257CF08ECAE109D6698D04B00DE1506A9D7E4A0E050107B5DD85 Shift = 0xAC Output = 0x14B61F50366E84EF0FA8C87842CC67EDD20DD3B2EDEF08637F831DCFE2F292FF98A257CF08EC Value = -0xFC109764A4D53E1EAD685C337F70DF5D94E2CA1379FFE23263C964A85B8B19C7BBA1445876727733EACB67625C4 Shift = 0xAF Output = -0x1F8212EC949AA7C3D5AD0B866FEE1BEBB29C59426F3FFC46 Value = 0x19D88C299C3070616A090E7C529709612D14447D0A029A2E8A432 Shift = 0xBF Output = 0x33B11 Value = -0xF082CEF7E44C49DC674D3F2A1516A53F08D7BB4D26FE931FDDDCE9C4CDD8AB Shift = 0x84 Output = -0xF082CEF7E44C49DC674D3F2A1516A Value = -0x1F4532AA54F61A4755DE72E3BD Shift = 0x5C Output = -0x1F4 Value = 0x14E1DBB92AA6EA1E55AC85660A580ACE320B7D9AAAC941787466DBE144E37FB845DAF26F02DD8D578A92BD15EA47E39C526137FDABF7769FDDD1 Shift = 0x74 Output = 0x14E1DBB92AA6EA1E55AC85660A580ACE320B7D9AAAC941787466DBE144E37FB845DAF26F02DD8D578A92BD1 Value = -0x1BA7A1849F7E04 Shift = 0x48 Output = 0x0 Value = 0xAD Shift = 0xC7 Output = 0x0 Value = 0xFA36051EAFCA0F0031 Shift = 0x95 Output = 0x0 Value = 0x713B97FE86653D75798958A8BE1CF2F299DE3432783601A6E0DA365C52C5930502AA04088FC17D0A4BD532897125FC0B0431BCFBE6BD Shift = 0x24 Output = 0x713B97FE86653D75798958A8BE1CF2F299DE3432783601A6E0DA365C52C5930502AA04088FC17D0A4BD532897125FC0B043 Value = 0x197295F9F6F0ED0F45DA6DF257BCCBA18EF04BDB7693F75BA33DD535FD Shift = 0x56 Output = 0x65CA57E7DBC3B43D1769B7C95EF32E863BC1 Value = 0xFF07A05DB24538D07FC527A Shift = 0x12 Output = 0x3FC1E8176C914E341FF Value = -0xE49687C2917266A75DDD94604EBCCAE62455226E3DAE2E1E026193E6D53AD83A50E0FCE253E30A30C11F108FDB5AF58030186E6D469D0B49FE1F30D5 Shift = 0x68 Output = -0xE49687C2917266A75DDD94604EBCCAE62455226E3DAE2E1E026193E6D53AD83A50E0FCE253E30A30C11F108FDB5AF5 Value = 0x2DC0C4A0B3D6609073E091ABCD856D43B6D965A366CB80BC3A56EC Shift = 0xD7 Output = 0x0 Value = -0xE2DA24B2713630D9B221545DDD3540BB4FA84267FAAB36B79983235CF96E3BFC4078AEB1AED7835900DF96EE04EF9954A7E3B49296E352387675857FEBC Shift = 0x1D Output = -0x716D1259389B186CD910AA2EEE9AA05DA7D42133FD559B5BCCC191AE7CB71DFE203C5758D76BC1AC806FCB770277CCAA53F1DA494B71A91C3B3A Value = 0x345B5E1B9368 Shift = 0x40 Output = 0x0 Value = -0x894B89D9331F9DF608134696E25215FAFF7988CD44F43D062C4C8B2A4B87E2D4DB64A60E744404845F431B31AD11349 Shift = 0x2F Output = -0x1129713B2663F3BEC10268D2DC4A42BF5FEF3119A89E87A0C58991654970FC5A9B6C94C1CE8880908BE8 Value = 0x14C Shift = 0xDA Output = 0x0 Value = -0x3A322180154456EF2DDCC5F05600A2F311FB55ED38CC04DBBDDFAD04E8299F7A53B8F2790D5950333E1633842EC6774 Shift = 0xB9 Output = -0x1D1910C00AA22B7796EE62F82B00517988FDAAF69C66026DD Value = -0xFB3F01BA6BF18DDBB684A7F33D673420019254DD0D8B2AC732699A8 Shift = 0xC1 Output = -0x7D9F80D Value = -0x23ABFF93022515162A23EF1DEA170909242 Shift = 0xBE Output = 0x0 Value = -0x78B1D340767E11487B9BE6197602BF05939E1C728E5CA6E58911DD29C7558640865A817C59124554AD2C6D24ADAD2AC0CBC5B25B2259C0ABEA1E55 Shift = 0x19 Output = -0x3C58E9A03B3F08A43DCDF30CBB015F82C9CF0E39472E5372C488EE94E3AAC320432D40BE2C8922AA5696369256D6956065E2D92D912CE055 Value = 0x48BE4A30AA166D8562B4AA44 Shift = 0xD2 Output = 0x0 Value = -0xD2FE65846C02400C0B1B58A6695259F8009C9DFA293514E860315CC670CD00DBBB86502790902B93A3744A04CE9BFCD72092D159D7E Shift = 0x40 Output = -0xD2FE65846C02400C0B1B58A6695259F8009C9DFA293514E860315CC670CD00DBBB86502790902B93A3744A04CE9 Value = -0xDD2A6F1FC78124B1A42DADBC536C396A516BA08530CA6E8768A7B0716142143F6C835E340602652AAE13E6 Shift = 0x68 Output = -0xDD2A6F1FC78124B1A42DADBC536C396A516BA08530CA6E8768A7B0716142 Value = 0x59A3BCB5252C4A9FC227928FC523B Shift = 0x39 Output = 0x2CD1DE5A9296254 Value = 0xD49DC351115205AEB59A89FEA07FCA01544FBF4A4AC5E60E6F279AACB8A82E854DE1F65F33F3FDF99677F046FFC2584C02179654D57C634 Shift = 0x21 Output = 0x6A4EE1A888A902D75ACD44FF503FE500AA27DFA52562F3073793CD565C541742A6F0FB2F99F9FEFCCB3BF8237FE12C26010BCB2 Value = -0x1117777A6E9658BDE591C6AD22350219223D077AD4C2201943 Shift = 0xDC Output = 0x0 Value = -0xC46F4A2E589D1C61FFAB8D270DE194151F9ECF4F673A44A712D4CB22097ED0C5EE22F44EB010B8B7C43DD Shift = 0x23 Output = -0x188DE945CB13A38C3FF571A4E1BC3282A3F3D9E9ECE74894E25A9964412FDA18BDC45E89D6021 Value = -0x2B8B4E43133842D547A40802EEF89F016855BE206DCE14134103A92872AB0EFCB65D404A150220DBA7285D16A0FC180A5356A9C025 Shift = 0xA Output = -0xAE2D390C4CE10B551E90200BBBE27C05A156F881B738504D040EA4A1CAAC3BF2D97501285408836E9CA1745A83F060294D5AA70 Value = 0x14E4F24EEE784021120CA263A1B7E4D04E7B4F18844A328FA054A83CB32CB0A001BADEE82 Shift = 0xC7 Output = 0x29C9E49DDCF08042241944C Value = -0x803920E81EE Shift = 0x23 Output = -0x100 Value = -0xAEAC803C060E062819953809A6467EB20A6820CA5689351731B1AE0BB8E34FD79FD80BA5E621DDF7BEFDF16D4C68174EC0480936C93 Shift = 0x20 Output = -0xAEAC803C060E062819953809A6467EB20A6820CA5689351731B1AE0BB8E34FD79FD80BA5E621DDF7BEFDF16D4C68174EC04 Value = -0x160B67743EF96C5C323BA10C57377676881346426FC340FA930A99958A9 Shift = 0x67 Output = -0x2C16CEE87DF2D8B864774218AE6EECED1 Value = -0x451AFEC0C20ED5A2A4F574F46FB766C00CF881383F6BFEECD6EA18FD15CCDE5A66DE9B2A6CF0 Shift = 0xC2 Output = -0x1146BFB03083B568A93D5D3D1BED Value = 0x4F80C1069085354E50D7B83017E5504AF02465CC07F22738CA3AF4CA20F3083093C94F1446746A97441AC763F027AEE83C0CA4440EC38 Shift = 0x7F Output = 0x9F01820D210A6A9CA1AF70602FCAA095E048CB980FE44E719475E99441E6106127929E288CE8D Value = -0xC58D6456C18FAF48FA8A7D811DE78E5BD5A1CFFAB2E6501A6AA5653EEE Shift = 0xC5 Output = -0x62C6B22B6 Value = -0xF1ADA1C80F346B638BF26F1BF79C3FC6E291415CB01496E1AAB412EA3ABDCFBC53718C5AA Shift = 0xBE Output = -0x3C6B687203CD1AD8E2FC9BC6FD Value = 0x1EA6175FD9C8F8CC18A8673A47D9897ACD911E7F9D4ED7D1297171E7A3DD7851048FB0DDD829AA70D1922A196CB314B9C432B8E18010B3 Shift = 0xCE Output = 0x7A985D7F6723E33062A19CE91F6625EB364479FE753B5F44A5C5C79E8F Value = -0xEC64FCAF91225CF00E84C1957089642BE6AEFC3CD858101E45363089555432C9B12F716A39CE52405B13D5CB9D41EF8BE0FBC0C14BD0E Shift = 0x1C Output = -0xEC64FCAF91225CF00E84C1957089642BE6AEFC3CD858101E45363089555432C9B12F716A39CE52405B13D5CB9D41EF8BE0FBC0 Value = 0x3F68893912729DBAEC Shift = 0x9B Output = 0x0 Value = 0x46007C61B396CC5FB076E4CDDA1994A3B6F106A4CF1 Shift = 0x1C Output = 0x46007C61B396CC5FB076E4CDDA1994A3B6F1 Value = 0x1E8D7B5 Shift = 0xC5 Output = 0x0 Value = -0x1B51DF7BF8C44F8EB406FF03BE2314A27F609F0EE0DCF48B5FC9A7F Shift = 0xD9 Output = 0x0 Value = -0x3639 Shift = 0x60 Output = 0x0 Value = -0x2C74CC8EB77FB260B99B22CF68FA5DE561B0F1D3D6248FD4FC9A32814AC773D5 Shift = 0x28 Output = -0x2C74CC8EB77FB260B99B22CF68FA5DE561B0F1D3D6248FD4FC9A32 botan-2.4.0/src/tests/data/bn/sqr.vec000066400000000000000000000042211322470703100173630ustar00rootroot00000000000000[Square] Input = 0x0 Output = 0x0 Input = -0x1 Output = 0x1 Input = 0x1 Output = 0x1 Input = 0x8000000000 Output = 0x40000000000000000000 Input = 0xFBC09CE6C7753664 Output = 0xF793449845751B9B8A4F0BEA3AF65710 Input = 0xFFFFFFFFFFFFFFFF Output = 0xFFFFFFFFFFFFFFFE0000000000000001 Input = 0x3FFFFFFF3FFFFFFF3FFFFFFF3FFFFFFF Output = 0xFFFFFFFA000000030000000C000000130000002A00000021000000180000001 Input = 0x3FFFFFFF3FFFFFFF3FFFFFFF0FFFFFFF Output = 0xFFFFFFFA000000030000000A800000178000002E800000261000001E0000001 Input = 0x3FFFFFFF3FFFFFFF7FFFFFFF3FFFFFFF Output = 0xFFFFFFFA00000005000000060000000E0000002400000019000000180000001 Input = 0x3FFFFFFF3FFFFFFFFFFFFFFF3FFFFFFF Output = 0xFFFFFFFA00000008FFFFFFFA0000000A0000001800000009000000180000001 Input = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000001 Input = 0x80000000000000000000000000000000FBC09CE6C7753664 Output = 0x40000000000000000000000000000000FBC09CE6C77536640000000000000000F793449845751B9B8A4F0BEA3AF65710 Input = 0x8000000000000000000000000000000000000FBC09CE6C7753664 Output = 0x4000000000000000000000000000000000000FBC09CE6C7753664000000000000000000000F793449845751B9B8A4F0BEA3AF65710 Input = 0xBD0195D16E7CCFAECBAEA99C93AF0BD7 Output = 0x8B8B5739C0749D94995991A47AC664214DA95AA566D243C0826ECB521A7E2E91 Input = 0xCDE6BF0C9E537153D5784F7718F6EC90 Output = 0xA59B5DF60ED1F64FA35F16EF3BDF88FD5D1C21AA1A318B56050008667F59D100 Input = 0xCC1B05F112A67F4D0EF8A4389E60CFCE Output = 0xA2BB145276B697C049EDF608F44309FFC4EF6B4A93F16FAADDB67F3ECB2EC9C4 Input = 0xF047C0A0B6B0EFA1D8B47490FE62DB56 Output = 0xE1869D49C0A28E62A916ED0A94CBCFBADB6BE0913A62BBFA53B5022B51C440E4 Input = 0xDCE99F85EA38416FFC953675A9F5F410 Output = 0xBEA25F61EFBCA9DEAE023B52967834AB9A4E8AF06763B076293E7F2A2F4E8100 Input = 0x9836531F6B1705CFA8E091FF3931A950 Output = 0x5A808E3C7B69E7E9164A3CD6D343CC596184436E884551BE8B831467E09AB900 Input = 0xE8B538496B78657A89704090991CEE6B Output = 0xD388F64DB6FC6440BC8F27389A3FA2CE51637C690CB33AB636F550A0EB7320B9 Input = 0xAFA871FFA1C6B4E8A55CBACCFE843667 Output = 0x7887BAB15175AC389F3B2457B4625759536AD3FDFD3355D69ED7006489C79D71 botan-2.4.0/src/tests/data/bn/sub.vec000066400000000000000000000335011322470703100173520ustar00rootroot00000000000000[Subtraction] In1 = 0x0 In2 = 0x0 Output = 0x0 In1 = 0x0 In2 = 0x1 Output = -0x1 In1 = 0x1 In2 = -0x1 Output = 0x2 In1 = 0x64 In2 = -0x64 Output = 0xC8 In1 = 0x0 In2 = -0x1 Output = 0x1 In1 = 0x0 In2 = 0x100000000 Output = -0x100000000 In1 = 0x100000000 In2 = -0x100000000 Output = 0x200000000 In1 = 0xFFFFFFFF In2 = -0xFFFFFFFF Output = 0x1FFFFFFFE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x0 In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE In1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In2 = 0x1 Output = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE In1 = 0xC4F9D29310EA767AA8DD0AF418447DD3DC2C220C48591F99B6DBF0521F7A5640 In2 = 0x6D72F5441CA9DBAFCBF4DB9701D6C667C1D5376251DE09468E3EFBF1FB04CD95 Output = 0x5786DD4EF4409ACADCE82F5D166DB76C1A56EAA9F67B1653289CF460247588AB In1 = 0x91AF1AE9122BA385DEAE3F9B478C8270A2D2221396FB3639B44E06E3A1AE9817 In2 = 0x8966B342D42332D2155FE03FEF2D3F84B415D1FDA1168A5C63D0F9B86B77CCE Output = 0x8918AFB4E4E97058BD5841974899AE785790C4F3BCE9CD93EE10F7481AF71B49 In1 = 0x7720BC7E5A52D5A9083EE9AB0E3B6FA60EB34585FEF514A813E821345D39AE747A6AFACCB5C865D60757711D82F8BB81B3F127B30E245B1A0C744651CDF In2 = 0x363867D8F525A952FBA8AA74B63D6D61D7117AE6CC611B27832F93C97161C65F8226388F4BD9D2478284B438CA11A2914B057 Output = 0x7720BC7E5A52D5A9083EE974D5D396B0E909F28A564A9FF1D67ABF5D4BBEC7A8194FD34986349C64A591119B5CC02C35DA1EE0308970224FFAD1B506C88 In1 = 0x1B821B0F516E447A95442D3F2FE5CAC83B6A7AA In2 = 0x19B9B7821A31A6E588C47B8D7D9CBDF3B2A2BADBF6FCAFE97B0C160042BD2AAC7762AE119355761C1AF1 Output = -0x19B9B7821A31A6E588C47B8D7D9CBDF3B2A2BADBF6FCAE31595B20E95E758158348EBB1336A8F2657347 In1 = -0x7730253C6B1A76063F070D25DFB7F1E69FCF5283F983DB9B585FEDE87B78B7B2C8DCE72BFF55323E6C375C43FF4E2A8F25950B1F18E6B2714EA061BA212964E In2 = 0x3E441DEDA948142D7F60717EC693F5FC29011349E7C Output = -0x7730253C6B1A76063F070D25DFB7F1E69FCF5283F983DB9B585FEDE87B78B7B2C8DCE72BFF55323E6C379A881D3BD3D739C28A7F8A657905449C8ABB34734CA In1 = 0x195277431B3AAFA0C3F In2 = -0xF951B313DDB8244D5079AE4D47F6CECB812E4982AAC597D23AC806E5 Output = 0xF951B313DDB8244D5079AE4D47F6CECB812E4B17D239C985E5C21324 In1 = 0xCC42E47D0B6CE51C676F0A3BB5877E0B2884A51E1E58F1D1849E0ED13695CDFAD0A28FD40F64F076DBFABA918A28ACB2B541D8C3AACA9D1 In2 = 0x360BC009F31DE8A1A6901FE6076EEDF42F999EC63CA892E6FCAF73B6DC9D89D2A84ADB1CE6443D8D555C745C4AE151F87CEFC03898539F158313CC Output = -0x360BBFFD2EEFA0D0EFC1CE1F907E4A38D721BE13B45E41051720569E92BC9CBF3EEDFB6FDC1B404C5F0D6CEE8B35A8DFDA64F50D443612DAD669FB In1 = 0x50879BE5916651A9D7E6640E3A818E2177014B72CF77 In2 = -0x37E8530CD80B0C64B814E66E65FCD380AA59F6E3359EF417BE6C2465992BEE7 Output = 0x37E8530CD80B0C64B819EEE82455E9E5C4F7754976829C30A083947A5058E5E In1 = -0x378C40B5FBC9F973CBD794D2752F4DD In2 = 0xDE34CB783A1057CF55DD139E899392992FDB371BA5409F691 Output = -0xDE34CB783A1057CF56149FDF3F8F5C92A3A70EB077B5CEB6E In1 = -0x3947B0 In2 = -0x7B5ED9D74939C00A693972A3BDD623044A05AD3B6 Output = 0x7B5ED9D74939C00A693972A3BDD623044A0218C06 In1 = 0x3D98651545ECAE4E240F938476B9D4709A140179AA4AF93CD76F0A66B4E52CA28D81CFCB6666199265B516DC7EE3550 In2 = -0x1F467AB19963FE68CB00D77FEDE42A738DD24EE4485096B605AD8A7 Output = 0x3D98651545ECAE4E240F938476B9D4709A140179C99173EE70D308CF7FE604227B65FA3EF4386876AE05AD928490DF7 In1 = -0x6DD6EE5139C34D3E56714C43 In2 = 0x5FF068173D0DE8F8C68D0226167586F4284B075622F627DABA741A11E566D385D6BC1C15C9840E91129037A8 Output = -0x5FF068173D0DE8F8C68D0226167586F4284B075622F627DABA741A11E566D38644930A6703475BCF690183EB In1 = 0x1263BCBF9EC5099241CFE7B0FDFBCA97DDA555C2BF In2 = -0x2F665AEBC1F2114C74E772B8AB6C9CF40DB1210C4C28D400E251EB37B6073E5D658149378B42840831FEB0ED5B5DE Output = 0x2F665AEBC1F2114C74E772B8AB6C9CF40DB1210C4C28D400E253117382012AADFEA56636065263C4DB7C8B42B789D In1 = 0x1379687600BC3FAB4A66824C26306E2BB0A296AF1DABD12E5951F61E2E853C920EAD081F594FB2A3BE34F7D4755DF83DE89ED5164 In2 = 0x763C9C1832B246CFEED0CE9BF0D5FD30A8A8FED598CB52E6D390DF6A65EDAD2 Output = 0x1379687600BC3FAB4A66824C26306E2BB0A296AF1D359492411F43D75E966BC372BC322228A709A4E89C2C818E8A675E7E38E7692 In1 = 0xBB140C866A8B5923D037C4CBDC9738CD58DF1FF00942E419F6BDF510AC96EC67AA79 In2 = 0x315844738557F7DA0DB1558A96EB8485FC18AC45A0102CF90AE667D16117604A5FACA5E Output = -0x314C9332BCF14F247B74520E4A2DBB126F431E53A10F98CAC946FBF2100C96DB9931FE5 In1 = 0xD723BA742F0E47FEC In2 = 0xDA6D7DA1 Output = 0xD723BA7421677024B In1 = 0x3443AABAFA42542770B In2 = -0x246EA87A1D42B3B08BB7516BBF9AE5D269EBD94093F0054D9D34F14276694D1A58759475374827427F78AEBE139492FB00 Output = 0x246EA87A1D42B3B08BB7516BBF9AE5D269EBD94093F0054D9D34F14276694D1A5875947537482745C3B35A6DB7B9D5720B In1 = 0x1E329598DC8E2B0ABAB6291BC7C1103CACF4A0B20B8A101905EC0BB5E In2 = 0xB12FBBFBA56 Output = 0x1E329598DC8E2B0ABAB6291BC7C1103CACF4A0B20B8A0F67D63010108 In1 = -0x30BD94A10E4B9ABEDE8DBA276B495C170E9ACAA5290582EF9F08AD7D67202B775DBF196B8AB32AE842E48F2DADECC3BC878EE13113E3A0B3EC In2 = -0x2E31D36EDB4BCB1CE3B7261861105A479F07740C4A31945993456C77 Output = -0x30BD94A10E4B9ABEDE8DBA276B495C170E9ACAA5290582EF9F08AD7D66F1F9A3EEE3CDA06DCF73C22A837ED3664DBC487B44AF9CBA505B4775 In1 = -0xAB37F3BF5CBE52F52C1008E4C4FC0E1818580A910C486D4CA7B659BC0FCA913A0206F95EC44D5570 In2 = -0x3DDC55 Output = -0xAB37F3BF5CBE52F52C1008E4C4FC0E1818580A910C486D4CA7B659BC0FCA913A0206F95EC40F791B In1 = -0x310E3 In2 = -0xD9CC840605B9D18EE2536D8E28DADC94219ECC18AFCE94034614FCC73D8CAB16D8B01DDE6A6EECCCC25BDBEA36B8FE57574B6F081A838AE09807A85593D46C Output = 0xD9CC840605B9D18EE2536D8E28DADC94219ECC18AFCE94034614FCC73D8CAB16D8B01DDE6A6EECCCC25BDBEA36B8FE57574B6F081A838AE09807A85590C389 In1 = 0x16623E0D6BB8429DC7AB In2 = 0x473131A802E3B451D0E151729E0C21EAD0DF5F19EEC54DD79C0163BDD5DE716D0FAB0D0A9EB96C67AAB5EA30C2141B9AD37AB4DA37FAA9CBFC0 Output = -0x473131A802E3B451D0E151729E0C21EAD0DF5F19EEC54DD79C0163BDD5DE716D0FAB0D0A9EB96C67AAB5EA30C2141B996D56D4037C767FEF815 In1 = 0x3DF6E94FAD38D8E3AEE058315BFDA4AF03F7D09BBFD In2 = 0xC6524E617604BC6DD7426CB88219F162F5A84B3DD1974B9 Output = -0xC652106A8CB50F34FE5EBDD829E8956550F9474600FB8BC In1 = -0xB6FDDB59ABC6A5BF6FD8C3949897F1E8 In2 = 0x1DFA9658309AA530153A27319B4D7A52CA562BF51ED1B50D2AF9A1C211142CDE8E4237BFDC5CEF71169622B1639D832F73AFA411 Output = -0x1DFA9658309AA530153A27319B4D7A52CA562BF51ED1B50D2AF9A1C211142CDE8E4237C0935ACACAC25CC870D37646C40C4795F9 In1 = 0x3B615FC54652B5E9129DE9CD2 In2 = 0x260288F4854CDC72E1ADD425EC91A9B95F0757161CD36A017FC813A828AF7BAEB1 Output = -0x260288F4854CDC72E1ADD425EC91A9B95F075716191D54052B62E84997859D11DF In1 = 0x10EEA3D6D71A528F780B6ECA281D08B96F7642CACFB0A15D86BA14DDF32 In2 = 0x16F94151B72EC25D563A5D8C27018D Output = 0x10EEA3D6D71A528F780B6ECA281D0749DB612757E38ACBF9E0E1526DDA5 In1 = 0x47C7BAF7BF826F2C8A5AE2DC2CB9966518C57DD8EC31C39DEA5D3329D7BE41677DF4572D86B In2 = 0xD211114CE5460E73AB175 Output = 0x47C7BAF7BF826F2C8A5AE2DC2CB9966518C57DD8EC31C39DEA5D3257C6ACF48237E5E3826F6 In1 = 0x84129AB18924955D4C37E7B86862E992AFCECD208747259F34A87E2A0A47190F59B440 In2 = 0x62D8D5C0A48DA85EF50BC708BA96555A1E9C803D50A8BB7AB38293C2DC48033FA1580046E5A8245B33EB63EE02B8C8 Output = -0x62D8D5C0A48DA85EF50BC7083683BAA89577EAE00470D3C24B1FAA302C79361F1A10DAA7B0FFA63129A44ADEA90488 In1 = 0xAC39D955EAC8A0F9AFE661DA0324F3D2FF36D81F042179BF4153F14D29E2AECE1470240F40D In2 = 0xCF0F0C36 Output = 0xAC39D955EAC8A0F9AFE661DA0324F3D2FF36D81F042179BF4153F14D29E2AECE1463331E7D7 In1 = 0x76A19793E9390241 In2 = 0x45B7CA117BC3099801DD020928073D08C53EF9E303CCFE75DE7FA4721FC08B4D78456 Output = -0x45B7CA117BC3099801DD020928073D08C53EF9E303CCFE75DE7F9D0806474CB9E8215 In1 = -0x6B34647A3A898E65D20332C6426CCD6B66EA9C87326092E4EAC09B03BE69CD69B629DBE0B36A5E85758943B7E6212B4D0BBFCC3610771AF In2 = 0x7F9DF6EE1FB45FC5F63BBE99961D270B968ABB74A3DEB9A78E95EDA704F0AA3C9EA912B66572845BA633054C48245FDEA703535AEA0CF270AAD81F97D Output = -0x7F9DF6EE201F942A70764827FBEF2A3E5CCD28420F45A44415C84E39E9DB6AD7A2677C83CF28AE3786E66FAACD99E9225EE974863718B23CE0E896B2C In1 = -0x34ADE05D484ACF1FA10799988AC0027C308722E147400DCBDEE53B11865AB76AF0AFA040EA7760AB7EF In2 = -0x13C09CA26760AAD90E3ECD0E9B8B7DEE3E95D3698B0373868682AEFC0CE5ECAEA609510FE97B68F7BAB686D5428344 Output = 0x13C09CA2675D5FFB086A4861A9916D74A50D276963406B14586E3AFB3027FE5AF4F0EB6472CC5DFDB6A7DF5F37CB55 In1 = -0x19E698A7522219757 In2 = 0x19B3A167C1C066B11A01BB3929CFF936DED7E27D4EAAE4ED94EEE2B68FF90E68AD2FCFEFEF36A18AB75D43E02D3D178C167A0AE325EE Output = -0x19B3A167C1C066B11A01BB3929CFF936DED7E27D4EAAE4ED94EEE2B68FF90E68AD2FCFEFEF36A18AB75D43E02D3EB5F5A0EF2D04BD45 In1 = 0x3577FD69874BF7BD48718C5CB8DE663D2213D45C810E86A9411D382A31A171A7116F00A8A3005DF371DA5032A0DE5FD2E2343F6B2 In2 = -0x6BE1C6BDB549E0CFE07A42F66BCB Output = 0x3577FD69874BF7BD48718C5CB8DE663D2213D45C810E86A9411D382A31A171A7116F00A8A30064B18E462B873EEB5DDA8663A627D In1 = -0xD9844A898712B18FC3F0551B5EF89CA13AC4376BB560DC85B3F2 In2 = -0x1836EDAA6C75FF0D0E682 Output = -0xD9844A898712B18FC3F0551B5EF89C9FB7555CC4EE00EBB4CD70 In1 = -0x1 In2 = -0x5D5B041CAB471FD3 Output = 0x5D5B041CAB471FD2 In1 = -0xE1E7680699E0061716952373432335BAD42A7DB4739D6D90285D4AE59FE8E989C0598 In2 = 0x26A399E79403 Output = -0xE1E7680699E0061716952373432335BAD42A7DB4739D6D90285D4AE5A25323283999B In1 = -0xB61166437A1082A37C28F1B6F969D161957A34C091174739CFFD5351E654B41D661BDF60AB In2 = -0x304A78BF5DD055F2F6674291BB5BBB1FC74817B4752629B080002A2DFE1CDC26575CE5BD2D33A02BA2F2C55646707615B Output = 0x304A78BF5DD055F2F66742865A4556E8263FED7CB2970E40E9631414A679901D45E872202D5E6B0D3DA7837FE4B2800B0 In1 = -0x7468BD0C34E52F0347B54587937752BC54E31E4135E5138B0F53B2184C0E1101F54F0EA9B4BCACFCF1F18485E9D6C2BD3AE0FE70C691FB55E42E6D In2 = -0x1BCFE32324EBFDC03FB8900EDFB857465DB Output = -0x7468BD0C34E52F0347B54587937752BC54E31E4135E5138B0F53B2184C0E1101F54F0EA9B4BCACFCF1EFC787B7A473FD5EDD02E7C5A3FFD06FC892 In1 = -0xF6BE2059893585C4ED40ACDBA6BE7CAB5 In2 = -0x2E326CF70C16FA855D06924096AD488190CC Output = 0x2E230115067E672D00B7BE35C8F2DC99C617 In1 = 0x1763F6F487F598E9F1D19DF90099954E587919841D8EB229E26538780 In2 = -0xBAE1B8B021A878208107BF9EA020AEA939828FC193A703EB93258B39F8 Output = 0xBC57F81F6A27D1AF2024D97E302A47FE1F0A2159D57FEF0E314BDEC178 In1 = -0x54AE8AF71D0C1AADFD028DB3BDA070FA20F927E4FE20D09DAB7F6D9BE0B05474DE5E6CFC6A06AAE708B71CC6D78C41F886695D05 In2 = -0x892F22B52E8F518E4025041F84EF9B6EF6C5D67E7EF2C4567F07CE85EF2D0AF85C2CAE0ABB80987B259C1A298DB698047C6F027AE1C7D1E0CE20E5BE4DEF Output = 0x892F22B52E8F518E4024AF70F9F87E62DC17D97BF13F06B60E0DAD8CC7480CD78B8F028B4DE4B7CAD1273BCB20BA2DFDD187F9C3C500FA548C285F54F0EA In1 = -0x13F2AFF42BDA18DF82B8E23A09BA3F4E8B8EC6F081AF379D22623576D749174C3CC641E6 In2 = 0x1159C6A3912A5E1AE41DE8EF2BAFE0ACDE194A80FAFE7653488D9F84D460EA7639319A4A5BF86540164E31 Output = -0x1159C6A3912A5E2ED6CDDD1B05C8C02F96FB848AB53DC4DED7549006839887989B671121A50FB17CDC9017 In1 = -0x232575C46B02F59F8C2F9D1AD8 In2 = -0x1F9FE8B4C1DA5E8B2AA8719E36DE92 Output = 0x1F9FC58F4C15F3883508E56E99C3BA In1 = 0x1E87AC7EE4C2DB126AA81EBE15139E9225085AAF1940DCA3C4CEC04 In2 = -0x7ECDA4AEB61FF5A6EA23D7914DD97D2F2B36994D869E7778B2 Output = 0x1E87B46BBF0DC6746A028D60528CB36FBCDB4D6282D5B50DAC464B6 In1 = 0x32A836FD13 In2 = 0xD4B270491655376BFF41DCF05D1D1EF90C11677EF89DAD8B3058B5DBB09EF8155170566FB58DCBBCC7A8BD14C Output = -0xD4B270491655376BFF41DCF05D1D1EF90C11677EF89DAD8B3058B5DBB09EF8155170566FB58DCBB99D254D439 In1 = 0x6DCE620B44F2DFD1FF3CC99A249967448 In2 = -0x44AB2F Output = 0x6DCE620B44F2DFD1FF3CC99A249DB1F77 In1 = -0xD480356FB22C5BF78E98DAB436B1E57B8368EF76191FE6C6FAFA819FCC833AA1236 In2 = -0x38DD7464DD0AFDA7CF3C61ACA7F5059F6B1EAF69E5AA647F3A41027CEA1DDCF303595FC06465803B91F1D841EED5D161FC78C3DA2B2 Output = 0x38DD7464DD0AFDA7CF3C61ACA7F5059F6B1EAF69112A2F0F8814A6855B85023ECCA77A44E0FC90C578D1F17AF3DB4FC22FF5893907C In1 = 0x6399F2B8BBB7E537F In2 = 0x53F47E2EECB8AC51E84174C0384E03B061B12F90F13EDEAADD8A36990989981C7E184AEBD077BCB93832F97000FC2161 Output = -0x53F47E2EECB8AC51E84174C0384E03B061B12F90F13EDEAADD8A36990989981C7E184AEBD077BCB2FE93CDE4457DCDE2 In1 = 0x24921974D2806EEA74A787B21C065201A4A45BCA62F8160E7E40D62E76572DD2F94F47C3C7AEAE34563DF66A345063D8F4BF9B67A7B1763 In2 = 0x72445470A38A5B8CC9AB488959F6DDA83CCC02712C7652213DED88E5B6F71BA1436039D6E2856BAC20B44D72A31B2AD Output = 0x24921974D2806EEA02633341787BF674DAF91341090138664174D3BD49E0DBB1BB61BEDE10B7929312DDBC9351CAF82CD40B4DF504964B6 In1 = 0x450746A7BD2CE46E185EE4AC4D139CB9382C4432033D62364AE7B7CDE753E5746B342C1061108679677B1DBC8EB275DED In2 = -0xEB200F Output = 0x450746A7BD2CE46E185EE4AC4D139CB9382C4432033D62364AE7B7CDE753E5746B342C1061108679677B1DBC8EC127DFC botan-2.4.0/src/tests/data/charset.vec000066400000000000000000000034041322470703100176120ustar00rootroot00000000000000[UCS2-UTF8] In = 0042006F00740061006E Out = 426F74616E # Nonsense, converted with iconv In = 03B404960556096710751827FFF0 Out = CEB4D296D596E0A5A7E181B5E1A0A7EFBFB0 In = B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B246B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B204 Out = EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8986EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8AB2EB8884 In = 0A0000000000000000000000000030000000000000001D1D1D1D01000000000000001D1D1D1D00000000000000000000 Out = E0A880000000000000E38080000000E1B49DE1B49DC480000000E1B49DE1B49D0000000000 [UCS4-UTF8] In = 0000004800000065000000690000007A000000F60000006C00000072000000FC000000630000006B00000073000000740000006F000000DF000000610000006200000064000000E40000006D0000007000000066000000750000006E00000067 Out = 4865697AC3B66C72C3BC636B73746FC39F616264C3A46D7066756E67 [UTF16-LATIN1] # Botan In = 0042006F00740061006E Out = 426F74616E # Heizölrückstoßabdämpfung In = 004800650069007A00F6006C007200FC0063006B00730074006F00DF00610062006400E4006D007000660075006E0067 Out = 4865697AF66C72FC636B73746FDF616264E46D7066756E67 # ÿ@Ãé¿ã!ð In = 00FF004000D000E900BF00E3002100F0 Out = FF40D0E9BFE321F0 [UTF8-LATIN1] # Botan In = 426F74616E Out = 426F74616E # Heizölrückstoßabdämpfung In = 4865697AC3B66C72C3BC636B73746FC39F616264C3A46D7066756E67 Out = 4865697AF66C72FC636B73746FDF616264E46D7066756E67 # ÿ@Ãé¿ã!ð In = C3BF40C390C3A9C2BFC3A321C3B0 Out = FF40D0E9BFE321F0 [LATIN1-UTF8] # Botan In = 426F74616E Out = 426F74616E # Heizölrückstoßabdämpfung In = 4865697AF66C72FC636B73746FDF616264E46D7066756E67 Out = 4865697AC3B66C72C3BC636B73746FC39F616264C3A46D7066756E67 # ÿ@Ãé¿ã!ð In = FF40D0E9BFE321F0 Out = C3BF40C390C3A9C2BFC3A321C3B0 botan-2.4.0/src/tests/data/dates.vec000066400000000000000000000007301322470703100172600ustar00rootroot00000000000000 [valid] Date = 1970,01,01,0,0,0 Date = 1998,04,23,14,37,28 Date = 2037,12,31,23,59,59 [valid.not_std] # these dates are valid but not representable as a std::system_clock::time_point Date = 1800,01,01,0,0,0 Date = 1969,12,31,23,59,58 Date = 1969,12,31,23,59,59 [valid.64_bit_time_t] # only valid if 64 bit std::time_t is used Date = 2038,01,01,0,0,0 Date = 2083,05,20,8,30,9 [invalid] #Date = 2037,12,32,24,59,59 #Date = 1998,10,31,22,61,0 #Date = 1998,10,31,22,60,60 botan-2.4.0/src/tests/data/fpe_fe1.vec000066400000000000000000000002331322470703100174630ustar00rootroot00000000000000 # FE1 outputs generated by botan Mod = 100000 In = 666 Out = 48166 Key = AABB Tweak = CCDD Mod = 100000 In = 48166 Out = 69575 Key = AABB Tweak = CCDD botan-2.4.0/src/tests/data/hash/000077500000000000000000000000001322470703100164045ustar00rootroot00000000000000botan-2.4.0/src/tests/data/hash/adler32.vec000066400000000000000000000070321322470703100203410ustar00rootroot00000000000000[Adler32] In = Out = 00000001 In = 35 Out = 00360036 In = 5EC8 Out = 01860127 In = 679496 Out = 02F60192 In = B32AB23D Out = 04EF01CD In = 8CA9455795 Out = 07770267 In = D37EAD077220 Out = 0B3B0298 In = E2210CD33A1068 Out = 0BB90295 In = 5BB33F53C9D00795 Out = 111503D6 In = 537A0E6291C9DF5E4B Out = 130F0420 In = 387900E329FB770A78FB Out = 167204AD In = 0CE184B96C789E7E0A6EEC Out = 207D058F In = 773870CD456F8797BC61EB73 Out = 2547063A In = E5FB7B41CDAA1C4FB21D195467 Out = 33B00622 In = 60D382B3CB4341FB141360855BD8 Out = 367006F2 In = E48EBC5C8730639FFB47C12D238856 Out = 41FA0775 In = 4A25B557982801088B8B4E45AFD7DC0B Out = 30AC065B In = A864D51DA8BE2CED6E2498FFB1E56C4EAF Out = 54D809A6 In = 580E32B4D34F21CC2978076EB3A6D0FCCFC4 Out = 47CB092A In = 5B32E288EE8AA4E866678D65DDF844F5B3CAB1 Out = 70720BF7 In = B014940A8D58C8550E9E1BAB1E96540ED0AFA6DB Out = 54DA08ED In = 2A085FB051FD798552D6E1F60DE222AC5F595AAF73 Out = 6F340A7E In = C1A30E3E8EEB24B5350A75D1D38255FE834CFE6C638D Out = 7D950B59 In = A8BE4CC3005FD904F6E58D5DD60AF8AAC3928F2FBB2B45 Out = 97790C37 In = C6D1E2B2B546867A22ADD3A422F2111ECE6ED49CE85F0ABB Out = B12A0D68 In = A28FC69AE1044743338EAEB08DD876267B9DE4780182568D82 Out = A7F70C7D In = 5C575A7D25204220C994D3E130B48E14650477D64FE646890033 Out = 8F750AB6 In = C3AEDA730EBFBFE54DCE695AD46CA06C4D2D197680C4C42645D60E Out = D2A40DBA In = D28292D1255B080A66BE9CD5C213844C2564DB843A95416E5A8DC215 Out = BE1F0CA8 In = A8E22320693BCB2368267AC0F4D448825F36A080CA2C6DFD67DA66D124 Out = CFAD0E6B In = 41BA45D14C618EBE7C0AE0150F1D18EA457E54164DD6E3FE8227EC874D65A085A5BC9B06C5399B4C5D47A5D639B9F2E1C1211C46DDD56728D2269C7FBC1E9EA82B1DB5FE2974AF83D33F5E7039E3C44DFCD9359492DE314514068E483EAF1637ABD215117D53755229962A37B91176170EFD1AA0DC751B53059D32DD4FAB3C0AAF52375854B9FFD2BBB303CCF617874B60CA368AF6AA6C149BABF22885F443F0D2870EE9A8E5E429BC00B7AA0942025838D8ED1489114D4BBA666678BCB6C75B66902559186BA330ED378EA5905DC8B41C474ACAF54BF191A0B20FCAE96DABAD046241C58324A6C1CCA5F50D1FC4C35FD565B53693D0FBD874D5959C8327CCAFF79760FCEDF5C0CDE1721054B443FDE8D771B5621A9AFB0F935409F5C63638FAAFB99BD5A3519408A30452A5BFF41AA62DD077AEF418942F076F730D10277ECDA8C1A71A4E16FDA1F61FE45660AA554E530D31562818EC961EB116AD5161687A23B8DAD5E0F016BD7AE0AB63E710B20AFAE8928C616292D5DF207042617BE830401C30A49FF8308D9060AB7E124417B139FAA303AD73C7B102DF81D763CD239C5EEF3A5FB60C374216263A48B68C9CC02121CF90AE72F906BE21C87315FD88A24237215A725992F4B18855D2217A4D033F4597440567736AE9BCCA4A7187479399B03E75CA828736614209FE0D3F71A9C90CA6310BBBF387F983BE221729763B290C986B8B43BEBE7F3AF9A895BA29663C4B204935C0F7182549E96D96252DA545ED4C54EEE6C1A174AC74CE9C22DF29159F8EB12771CB8396E6F07D0FC43EAF930C0AF228D53527235637E5408A234B785A9E2CC8A30C7E27E1FC55FE6FAB0B3465616F5EFC59B1B52F2FE8A4BCEA7EE470AC47E148165CF025B99808494865D5FFE9263150821C10BD916423101EE3B8640CFAA74A4EEBC86349DB8C8726ECFD1F4B603E6755FFA0586304196A11EFDB7F892B5C7E0EF1A41E99ED60ABE3402D5017240869A26F0447017A313922932FFA53E56BE913A0EA465A95E0370C0B5A8418733BCC2FD7D294F23C474E3C3D331E2B7F42051E7BAF2026295B56837F497865D4D60B02EB2E76058756D2E306519046B6A3B7152236D73B2C698A8F0155C4E8F1D634D5737C3D7005B5557E2FDF1EC77B2B16239B5C21D105AF86B8BE5BFBF52E00D63349568CBE25E6735BABF057E3B01CAB9520D5D03D2C4F7CEDBB7C6FE4943B95B27CECF671AEA54B8740074445D4F14C17C9B9A12E581B559CB17149A131613FD35ADF9ADE4DE981DD01E45262002B480B2FD524E39B307BD5A6D1CF9178B59B98F2B43EA4CDED27513AAC550E1754DD6452A9434BB59B1186F9DA61E174D6610C2B286AECDBAE9E6CBD4D2BFCABE0B83627A13F87288ABE927A891E372163A87A437CD1F4AFC91A940FF55F5DC6CFA5AADF689946192050BE7C Out = 9DA7EB84 botan-2.4.0/src/tests/data/hash/blake2b.vec000066400000000000000000014210211322470703100204060ustar00rootroot00000000000000[Blake2b(224)] In = Out = 836cc68931c2e4e3e838602eca1902591d216837bafddfe6f0c8cb07 In = CC Out = 1a926bc943aed563be0f1b2c7e3a64d962e054509018a422d2bdcbbc In = 41FB Out = 0f13ab23fcea3b2ea5d55452af7266fc40c3c9cf5dd19d26fcefbee7 In = 1F877C Out = 5517b00622a841ed3c3e1579cb9a298f49f293a9f6c97b2f6bf06ec8 In = C1ECFDFC Out = da3dbd8c051292cef4492561cf9e13f2633d4a53a042ca6fdb7460c5 In = 21F134AC57 Out = d34caff9fe2a54f665d9f0422d0141acf5585c7a8f222f3fb8d3696c In = C6F50BB74E29 Out = 746a72a362ac79c5f077820b180fb5fcc5d1aff00d9b71e627c74036 In = 119713CC83EEEF Out = 075194e4614bf009bfa810759489994200190c1f2712daf5766dfd24 In = 4A4F202484512526 Out = 9989709d0c5be9353b902acac4617dc028d4195e0a83fcbf3fefa4e0 In = 1F66AB4185ED9B6375 Out = adcac140e02efe54d91be9c3997cec2fd9983e12a83570dfc7d332d6 In = EED7422227613B6F53C9 Out = ce11dbad8b796f09b88a6eda279e22e18b8da147013a9e39bc898d77 In = EAEED5CDFFD89DECE455F1 Out = b9a77e554a3c22c6a1c8a7636fb369a77a9e612f8994fa49b5ab56e6 In = 5BE43C90F22902E4FE8ED2D3 Out = 37d1addd0dcc99c57268772002531a6c3fd24c26119f1ca1e6b76247 In = A746273228122F381C3B46E4F1 Out = 6f932b21814f9c82eb1d7646addad7a6445f45afc6d3d8fafb501ee7 In = 3C5871CD619C69A63B540EB5A625 Out = 1a5de095c488219be1db8c34f78d0f7c052b4be2a2845b14fe342ddc In = FA22874BCC068879E8EF11A69F0722 Out = 6f1d50881e662a1b73e13305335763066f91d0a7917f8bd26ada916c In = 52A608AB21CCDD8A4457A57EDE782176 Out = 6f08fdf677c07c2e13b508e68c38adcb708d0c08911c24cf35c15231 In = 82E192E4043DDCD12ECF52969D0F807EED Out = cf679ef6dc5fa29c269d7298971aa77768fe702e9017a0ea1f203590 In = 75683DCB556140C522543BB6E9098B21A21E Out = f4391b3678b07490e49a7890eee47da35cd3f697d5dcd8872a824d12 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = b0edeb4dd2ca86a9d7e8dd553b8a2e1b6b3820e67ca3b042239ed13a In = E26193989D06568FE688E75540AEA06747D9F851 Out = 1a873bf701c5b0727be7828de917d9a0c80f50e49ad75dc9c5f736b6 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 3782e0f4fe2239cb4d01e1024ecd0309a163d97763b7dc9cdcdaf5f4 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = b33c243fe508dd1445f885472e3c9b3cc8768c285805e47ce62a45ec In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 597a22938743e1c5eeee9a7051fbceb01cf8d19c4eb894b5e3b7cdab In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = 2ea1c5e7eab2c7cc9c698b0c9297610d2e8f25a9ceaee6f76368a232 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 294960eeb981139a6afc38f682c3cc7db486735a44da057992418e3a In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = 0797b09e6c66696f445087f126685a76e8e671f4be069438b2a9944c In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = e4a6172ed88ce97309e1e44c6281cbd51fed1cb729250b89cce91e98 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = b8ff1920d46a6e5ee08f9b4d97efd1f32f8184fa5f14ef4579ad651d In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 86ff91b6ad8a766ec67299e3a4fd492287d53a4bb47b971e00d5e40e In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = f05931f0003226b005d7e0ae2a0353918785dcd6341934faf80693bc In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 1b6143808c646484d4d1eea8fd0e01d829fa7ba58136a240b9baba2e In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = c8993fa6e6b5ee380157d2fe1aa7623dba31644b5bbf17073507553d In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = dbdc64e81245b2e02881f7a4c40f4f658d416ee6371ccd208b6e3f6b In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = fd86785b490be79b2ba14aa6e3a1e31b2102785e00ba76a82007428c In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 76b84ef62281b420cc7f502c6456d632ac6154aa523508e416f4b435 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 394a5bc22413238584f25df59d8e51e3cbe57c6a78f8152d4aaafd04 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = c9a154216dfaaaf986fa29640cfff12ec5d6ed7cb9d75f96d12b10cd In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = a7cc240c0a92de66c15ffcbafb2671590774b74b42ac4e9d8ced35fd In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 560cc57b1062ecd6cab5b9d695125a9eb1ddd3b2e902b466980e7f3c In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 6618ee0f49fb5187645b5606f2522d824a9f760eabfe7cefd649e78e In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = d4f392cc7ff19662012746dd693099a419012f0d311009a2a9c7234d In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = 1039de3317a6203a2b48012b8d2ebb35eac9a73ac0e95a7fcb5cb80a In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = 23c59b050922bb833687d0d047f328a081c552fe1f0ced62faf035ba In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = 5850e3b51d1f5babfad30bb68cf1f3b6a34f0333cb1c9dc0335a7052 In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 77b15c630b6b01b806a545c6c190b805e96c487dab8ff9669650b490 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 3b7788e60b07e0155fac3b5b69d42671161d21016a92da40e97a560e In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = 8e757c2abcdb1004dba65ae9b1f78fd118704cae119f401c6c629eb4 In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 43794731166168f1ca3239e0bae95fbca248e732959c99b363b23a4c In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = 22a7a42d55cdaffe4a48ccbb0a4ef92267e96f7251a63ed0ed436514 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = df0243a92e210853cc1c5af2419db141ce4a5adaa991dfdcae5f02a0 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 5399dba7eac60b19c5e5917bbc85d1d642dcd275e12a429ddf4c4d2b In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = aea9933eb9ff3decf76508fc6d29e7d6fc1a56edeb71ccf8a3ba3cbf In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 58cee899e8d4ebc55bdffd729117f16f3cb871bcaa830a0299d78c81 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 6024a8913ad88f475be1e5f4c691e593636162e4198bb81e4757b33e In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = d9ccfd4ef9aca3c8a7b85473baa78bdc28d88a7691e30a33f2ac5e40 In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = 29977abf2112409e9d1aa141712f006f9d48b84883e10a6a0b95bce0 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 10c6feb7aa83b1ffebfbf7b53a5b39cde5d3b192a488e19ab0654cab In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = dde5042150fbbf1c5ce5972e3b98c01b41d5b896488680b114e4817d In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 055bd81a0adcb8512263ff6702f272134f3e6542eb122439847f7ef1 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 996d28d06a9b43cfa9ac004c312f9e7145ba3504b801954b1510d158 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 009b27c2db55ed146bf15dcdbe807ac7d4bed610f39eb3521e6f9644 In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = fd97f126b8704c6e6224e7191c5ea2e05398054109a02a8885be7a41 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = bbf756f38f7a7433230a3a3c89f757ca34ec1ca11996983c07c785c0 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = d810a1c32442a954386d3c15478c154779c2bd5dcaa8dacb0ee1e471 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = df9454a06490db91a1c8ffdb246c8f3971c4c6e7d205dd19e83fda22 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 9e02d86135e194325245807e28227cf387f88917209866371929f6db In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = 33c470201c40d4b5be4a3bc55d479c1073e337a4caa78e5fcdda44ff In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 18dede59aa676d1c8ed2942d93c3c4d3bfaab34d7ff64138adb10392 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = f201b78a8c46168d8df97bcce91feb0505ea74bdaabeb930a4255b48 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = 7e641b66490231e94fb06a030d13ecc069c938a66a8b500f6281eb33 In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 762dd5bf53a54b62374a3a953e0b2f8f5c72610613d583468d7a7602 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = b3f1cf829ec165c09f8b8cc15070582ff54c1d2618d467de93b49811 In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 0e4444ad5694fffda4ec7261ac079dffadcbb277f71bbfda9fc253a0 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = 5e1fd1bc075b4998ef9ef8077dfed9ec0fa5c6c3ec35cfedd8444365 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = 1f6a8b599362afd0cbedcc4d96f7ad9c60c47db77152fba700e762af In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = b785eefbff713b35bf5a4b8d021f34cb69b9a8ed284725110a1c08cc In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 01a3a1c117b944f17eccfe26760c434e3bfaf12f9e26d8bf77bc6d7f In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 7eeab67b9cfb95697804771df14f1b20900e0fd3f7785b2b31bfddb2 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = 8b2605ef61de11387022ae193f45fc56b38a5dc9a430c2a2e0d151f9 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 0a65959672a176828d5fc820187b1a60ec7ec5ba8898a6ba58bd1a18 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 15236b06eb92ff99f8349af48804118f6ac1d6c9ddb60ddf6fd9b42e In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = ddcb16043af13661205fd35dcf248ca7d92f6aa04693688c0e7d9908 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 0d02ba5c73dbbf28dcbbec5fe2a9ee90f1f2aab6daae10b7f89bdd02 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 7dcd63efd7a9eff1dedc1a420eae7d5c52d633ad17683417c85a507e In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 9c57386eaa0d94f4287eb4cd59b85f80c2b55b598a16a909b345241a In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = a294502fd797dab011b1063af73a50cbc8c5d7302fdc0b30a7b58a05 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 1ec342a2b721764c04754182841543614e2066e1f4420123b74d5398 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 61e0b41492c37fefecb767f14bc0b50f5d81e0a09f41f59beb11de10 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = af6e05feaa32d06392e5197d41cf8b86c68caca794e8332f3a066151 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = d11777b8fe2c62025db282c7ab894e6185dd7a859af970812f66d36c In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = 5b6a196d9a4cb8e1d47eff4f9e8a4bf72693b400b272141514e85937 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 47c7fdd3920c0315ad285b9b73b8e15553f826780e3741a35d6d44f5 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 5b2887b88f4cc8c94d617f4a779de0c6718d2e65ef8da96518640c76 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 322807a8cf1b52945e0f943f452d6f97cda5ae76e724228dc95806a0 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = a0c872265d1737a58a004f9176552177f78a8548e15137bdbe6526f7 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = b8c057ce96753f987372cf5f4c912814b2a96b8d99a7cd390e24601a In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = a48a671d6bb5c1606350281b8a5da8bd4f095f1af9c0fd5570176e29 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = aad0bb1a3dc786b16a7a4d824228ad1e8d217ee91e2dac74d24e9c3b In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = dff80d2ae82c0881e9633b22d53bc031be939e576af2d686551a2756 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 89d97c0cccba10e1e0cfd801ad93bb1274a29cd1ab0266689506ac3d In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 199ba9673347f8c61605d9cbb611885364f6f8f108f80523e1f729f4 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = f6936912a7d330a28eeda8d43f9b14bdde4b0ce5d2b971d7abf9a1af In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 6575454f9456efb484e9860d59068ce986cdbc5220267ac4cfd43305 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 6388fb19fe381055d52ea3858e67ffce44bddca1ed2b13eb7ec2110f In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 9729e34e75fa3992a71cecf277b6af6dac4bebae6b7ab0deafb81cbe In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = 4c93486fdec96ca5fcb9e758b3c9481407be5d9289998e8be5d4c5ac In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 6d370ae522db82091d7b50edf0b9da75cdd80c3860dad31d3a3cca8c In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 89699ed6306d2198c1d6b2af6f20eaca549e1074ad2c360b38189a93 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = fa4beb5faeea2ce35a19c31830642ae0004290350a3d08c98f92742a In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = 37f557f4774c62ad409878dde6bed9cbb8fe71d655ad16dcbc3e0b18 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = e0100987bf06977be4b249f3dc91ca3579a1b1af26589e8cced72f4a In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = cd0ae7d09aa39e3ee86b609940a174a6bb569de2ed02afc567a39982 In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = 3d6c866ebaa149e0c6ad8ba5e9a685e1ad56d81a00fb99d9020f11c0 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = ae8a3fec270593fd694f24d7dff0e58b35a6117197a912f02f37bd07 In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = e1234ff6c2cf27eaf4f1b61d65af1ee5e999a00273df6b4ed9ee0209 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = f732477086288d447e6be84cff07848f976c6fb331cf0c41fc5a38e8 In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 685e022a2a4bc57eee9d451a5c033a81ebcf4375d7f82f992a03cda7 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = a8e50d0549972db96dede853569c0a4453ebb50ac754abc596412918 In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = c5804ec4ede0701857d69ca283aa8d96403ae92595a269b800217007 In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = 5a99bfb07143bc45f141220e3a5d3e712ad5379d19f07ec9968ab2a5 In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 0e59962e136392445608b297e9b1bca21fdbafa379c9a87f3d5ca2a9 In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = f130a956ca3e557e2d446355abcd0ce0e8c594ea669bc0f177c9d4af In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 73959160f546098eed7e8c45b997f10a09061245033e814ca5aeeb5e In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 481fedfae1d80a9f609b9baea3ef1987f8cd8e97bd6fb9b838659a1a In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 7eb5d5050caebdc2d1c875cb07d6d2518de07931473e3ed5df2393f1 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = add9b57e76f144334625fb6a7b9eb06c2ab32921eb9068201e9c947c In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 6054990815003279c9b4575c71496fc3a8e298f3081718550b2d79ef In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 84f92e76c0de6c7928bbd75c84c47b353549627eae09081cc232024d In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 1cd418dbdf948fba46a74524312df9132412071765243dfefda9cfa8 In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 353f2f4c635f43a5ab24020317dd0fc3b87dfb7489307342c959eb9d In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = ce84931fb96a0b10a96a68bbf27c6aa3ee6f8032a4e21485050295d7 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 5245eaf1a9bc404147b74d5c8e2ad990adc5c5c52ec8de312f71f7d1 In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = b746f02fffc759ee82557ee41ed2361113695a8eefcae3ef806dbc7f In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 03b80280e6ac994431cf47d74c5ca44344ecbb13311c4ba77ef86fe3 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = c8e2ef36db40ad08cdeed1d0d1ff5ae27384f2033a08d8e87a089032 In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = f90c3ffaa84dfb0edb08621a7eb29048888971f98caba02e86286b36 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 2a0739e583c1729003665fde843a4dd527a0ba67c95f52239d429e71 In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = 5e6b416891ea14355f3df18944a9264e8373adad06917b61c7eeb8f1 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = a4b4e5738a17f8bd44b7dc01d028b41c33662a6aa6dc8efa7c2c2187 In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = 637e5d1e2f936e5e4ca009b876df0e41f906f6670c06543fc49dc7bf In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 2e58db86af9a1a61c11641d3520face4420574ccc4ae13b83c391ba2 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = e2f27e6cc4829659d8274eeb837945acae44ddf762d55f19bf3f0d52 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 8a96e3a5d124d0e3f737481d74c0947b8964cc86745fefcb0c43f682 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 19f2f6d97bd6d25b8e9f01da837c422ee2b8ee0d58bb3a0ff856cfc4 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 43903dceb49f9734d52a7cc7e272204db0d51b7e78dbe4e0603ad818 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 4a16b6e76511f374130f806388549705819856baaf33c2db572d0796 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = 1213c45e8802c5724f9b38fd6bc55bbe5166f5e8e750e18e97b13a07 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 9662eec9857994ba2e9a65337d68657505dd96f7f34803496558cb9c In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 95853c4c524afdd85b765835e4fa4dc691ed5f7ad9d7c103038ac5b2 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = d091c10ab17dc3b54a0fa183970956616c9e351e1979be912aa59062 In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 64b0bb1d1943212afaeeaa95dafbc8649ddfa5e0a9d0c87a265914a4 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 20a6a4ce9f4bb907eb4aee92b468588ae4ae28b62c86e5fcb864fe13 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = 07a4a321d80ce8b51909216c29043e22a64801df275ae064ec41d96f In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 3e30ef42379a09417f0b24d839e12cfbedb8b6ddb211953502fa5b2b In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = f00be8135126fff6a46c44248b9b792660c29fd076c53f4ed046b104 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = c81e4f41dd960abd066339f24b744f453bfe642bf5a5dfea63246cc7 In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 112f7ecc2afe7a429687804eccd7df473a2c58e6e21aa0ee759310ba In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 87e063509cc4b67a1d25858034b53646738d3c906c48492e9a977425 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = 692810807c7602365c8be4b2bd2348cf87f691db4730bba80193ea9b In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 463bc05c5e7648e16b1cf4a37697139ed20625ca611360de3b20839b In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 28ae8245484af07503c8da5c8aff313741ef19e1e28ee12d4931a6be In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 02781b3e406ce42756bd7572ebf273bf5373936a031c4d51c3c77c51 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 2dbb8bddf19da20c10337f9df558ba448c67989e900ad1562af88677 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 13999b2a55c892740e2fba894add14e4c1d155db375a2c13d004e796 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = e77f719583964b841e84a1fd8513397e694cd50675136bc5049bd657 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = fc01efe802e733d81b9643955c3c1f6511cf111e2f5d174eacbf8d27 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = a7123385b484cd2da667fd049b99467d5cb1c2890b59f7bc003fc685 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = b1dc062dfe088856dc5abcf99c3712f778bbec4bf5b64cf3c57490e0 In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 4084988104259252fed4dff3ecfc889e1e184ecbb7be67e07dd06758 In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = c8d88ecb1f35b7172de504ffaac4e2a08aa756d92501e6ee4383b815 In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = 939d6d46f204cb8526676b1bcf309b85187f542e07825718fe44e412 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 471ff6f1eb3955c23fdb4c0246d59296260245283eefdf6ac271bfb1 In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 36595a20f5c9a01ed25f8d52b3bf3026fb200970f0e73c2184aed9e4 In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 4a34b435d182661100c14b1dc95a47ce67b9f36abe3a1eeef2eb5c73 In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = addbdad9c5cf13c6abe94e34426a406a75163e72532d203436027121 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = ccad25625f5456d361c7c1485d016e43eb52f0d6520846680a913b02 In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 534b4bdb1ea69b150278457420d6ccf23e4ecc32b234da39cf3f2dff In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = db2ef9a783a2efd08d3c90b82446720c8935ffb8c28f67c26c96b20d In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 229ffa8ad5900504a7f6b7253926a5452add85203e5296f524f77f35 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = 174e4ad0a551f460d4fb4b7adf708a1f0aea0288259c1446fd4c2d3e In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = 0d8d2d56cdd6e19376cff11a2afbddfa919dc20ac7b7108486b172ea In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = b45689b7690b46dd097e6bd75fd7d95b0a115d78e758c0f53341c963 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 53d76ca8defcfaecf1bb14618a3f0c713f2c3c3422cf11d241eb4c10 In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 3c9f950687fbcc49f2d85cf0ce22ba183fab2c63e4453e072ffa5fbc In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = f9c3f4b2421d0ae667f4df71261062a85aca92cf922af91b2ef00aa4 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 65d58a6ba1e5372aa8a9bb7f7777075c3774398dbf0e8d68e4ae92ab In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 8b0e038bee7afc95cd40a341e667aae46413d8df91ece90e9da96ec1 In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 1d513a663c14801900cf786e4f1fb97224b83b0978d7964558871286 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = eb88c491a852a31f38e78a8d0b430b9566917aba73b337e17c877e6a In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = d5848e6ec1f79c10c9c8c085d965eed9e3fb59747f5c574b01b4b7c5 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = d678f01d6da99ae8cba1651ae1b3a11fbe84bd73a76c58b6bf9607f1 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 98843bb1f4bd663849885699c9b944a738e0006d795dcbab2965dccc In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = def31ca9f3873379cd2b4fbc2814d0cc67ceafe91521afa84a4261d8 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 681d3c081207618a1b3321393498c8c58ee7b5ddff597ab2cc4bfde9 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 4fd27570c2c4b665e4ac9a97b6201dc85d274524c11c0c5e2da3c412 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 509d74c9639ab044b635110334003f59d46c440cf48aa57b15d68184 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = d52ad0bbaac22a144f9e21cc99a585edd87878fea7c561fa76935c12 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 17c24deccce765600437c1433d2f2f69552eceae7c8346e647b26e1d In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = b28f9ef601bdee03f2c4bbb2d358dd5e232ebbe3c8f24be10f217e37 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 1c035c2668feca7620c592212864883e4f68808c4b6ba4a574b7086f In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 856f030764bbfbdd5d1384ea9da5bbf7f0a06e0b57445bcf50e10c77 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 844cc3a727675ca2ace1c78e6fc2e15a0de1bfed22017bda97ae8af9 In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = c6e18316befa5793bfbace6f44655b18080083be196a9148ccf3f264 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = df45297feb54539d81283aba4a482947b0df1fe818fcb1a2c716803a In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = 19b9bd4d5349788ae6d12eeac0407b84de297b8d8e23339150303a71 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 4f5f0377d3335014cfb8ae31f1bf33732dda8c6e9105ea72f6f238a3 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 8cd7f88d47b4135b45c742870d199d60eaf4e1bb4234e8e17a192bb9 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = d9a1b4b1e5c6e0b568a1671b93f7808d9b16c31a7f8ac37df8c8413d In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 91065d29e0e1755d896335ac503d526039d1a6561b70cdc98adf2c07 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 769175a927c65ad802211900e31c664d81a8373faf6d964567e56232 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = 448039a19c2020dc2ad9062dc87b504793238fcc555387b7c80a9a46 In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 48cb9b942cc1c9f3064bfad7b99f419a3a447027f774967ad012ee65 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 300788847e84260eed7f81e9347b0a28705f6dec2ce1d41e7d748a2b In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 6afd5e6fcae451417ca6968dcd9b8bfb5cd2defd835fcef62e8799bc In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = ae504b123cf7600f8792b90cce79eac630a42ebfcb10fdd2e0dd63dc In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = eea3834e7e253f5204db74719ebcc390ddf7a7677613be337cb88df5 In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = e5049c18e846e89a7ee19e63c9a2fe3d2a9c21c877ce18d789968d7c In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 37b3ba05184555eeb84a052fea719374d04f5f97ae047ef04ae142a8 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = a6dbc685dc366bfce1408346a09e9f82eb51c29d4109131d15d13743 In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 48c711b6161f5303dbbb0c44d301044abb57a48504d5efda76bf6777 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = b4218bdab6a5a63d80cdfcf8fdf65264ae58948a560c08207ad2fd99 In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = d0731a432132aae12f7acc306e0d7868bc8782e60bb7b5c8804d42d2 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = a8b8dc55bbead446d58e87aa1c07fe58c87f099670eb05d4fb3f96d2 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 442ca919770a679ac8c2caa7c31e47eb0442dbe89d987e84d5d2c6ef In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = d0fce0b2439abe400d461653bc154105cae56c0f53b80cc2647d888c In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 9d7ef88e849281dcea90adf1da822253b6ac07849f110e8a7a0f352c In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 408d2b7a956b6d39d5dd67ad7db4b840937d134aeee8be0eb3cf31a4 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = d56c0952990841c3e2e62a3fe0ff91fd0359ad70cdd84b8a538188cf In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 305164be2141732b4f286464070da6108870c3c36a9e783aa63783c5 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = c152bc289a4c5c358642d6fc12e7b4f635928b366e76cb134f6c66a2 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 6f9a3f00739cbef2e04611dce0bf577995a8e0c31012cd3614a15a21 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = 92f385222c33fa5b1180c0618e1b1e004b89afa4560859f30b6aed3b In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = ad155539b87633fbfd23936e9f2be1b90edf5ebb4f2c0ad823b1ed86 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 3564713f91511219542d3501728b440dd539aa7fbac38e499521725f In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 419c532e640a31a848dc8c201cd5c29a5aed25f4db50be2527b6cbd2 In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 11bbf19863cf76d242be3c7ec3e0c648f7e385438549508364893409 In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 074d75def58e309b17d29b2346ba6510400f124edac09b2b3c0bec5f In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = e74992099989a4ce8118935029c87365f2b40a940712474f3ede51d1 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = 6c8845c560e769be5f9e9ebd968669b20db12156ee285dce0ee5a4cc In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = 528c3097cd389ee2fba0c772a5b5e9b36184c53298e236d54ec735b8 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = 467d328b49dab2b3405add621b839bc7d2ef21584cf7629e413c2384 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 94182ca40024f6835f333f281fa8c6ab8fc619444c4ae14a184e813b In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = 79b5c75db50855926373d021af5735b404bb59afd88301bf2b908d3c In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 738c8dba6c9d31d016e8f794b641a80003c457ecb35849cc79d5d8b7 In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 8a8723659435a7ed51e71c65def9fa7c510613d7a9bc163ab739a08c In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 517a8427524efb9a6be662bf533888319a5ff6219f7f71d8d7057b78 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 13c91e9edb90adba9217a7c570d3e48d1bf7e850652d26b4b99402cb In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 620d083af32d1e75a4d470ec7a5f5683c0e17a1f20e687009d4457bf In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = fb444ffb4c9a249866507a12942fd580547852274aa6fb1ad18ae562 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 527ab8e54375758a3715b718401a73d861938cac3b41b3287366eb8e In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = cbe66be6a01ad4ab6a082108e7dd445b79ee6afeb8affb3bf2d9e4ca In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 0363bca9541020d4045b7c88f57a10a1e9c0d9a1a66eea81f66ae0f9 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 28ee87cf342e5a7320762c905d4b60e78fd6aa526f9f52d739bd43e4 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = a7040164f5423605b981c97e95c347bc38553bab95d33eb33c063f10 In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = e50badcf93cc87bacece66b1887ff3c6b58377ffe28e6455667c0f76 [Blake2b(256)] In = Out = 0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8 In = CC Out = e3f0d5af2a41c8fd042a6ec5fef8acfd591903cbb97a3ab666f08e7c39c8a948 In = 41FB Out = a464a6ab07b3205c7d44e07dbd83431c2bcbb67739a611748687820e1473b418 In = 1F877C Out = 5868d8802e659afd11b06134af3bde8af8771904d981c670eb5afff39801723e In = C1ECFDFC Out = c86d7b42e003fdf7cf2edecaf72ad31dfcd2e760c2ef3c5271f518b50ebf0948 In = 21F134AC57 Out = 07c408f561f4e787c372e2bed3c5e0712974b3779da8bff92c352781620ab9bd In = C6F50BB74E29 Out = 5d506ac9eb30d9e0aff48367c826337d6c580ef0baa65606ead12e12fee007f6 In = 119713CC83EEEF Out = 1dc248af1b1ab128599207862440a45d1ddcca8684b04f9318561142f1c3db76 In = 4A4F202484512526 Out = 508b1db1b81a82b89f1884847f5c32a85414a4c93e49e976adaa41e4678ec3e8 In = 1F66AB4185ED9B6375 Out = d1b8b12a6d5c44515b8ce2836a18330072a7cd0b990a86737a44c3303a7dac50 In = EED7422227613B6F53C9 Out = d47185943d9efb4866a4497a28526a2f95f8d2143bc449d1d76fa7c3d962be98 In = EAEED5CDFFD89DECE455F1 Out = 2cd25fe400acfca6f2c4f819904102086ec9b30045b99f067f121dfd40f9b889 In = 5BE43C90F22902E4FE8ED2D3 Out = a132982e52ce28d1cbc1edb9a49ed360507280b6a6eb3bfe30651254e4e5bce7 In = A746273228122F381C3B46E4F1 Out = a3f3607784917cffa25842cffadb76a32003886f025c12e326bb570f8cb4c638 In = 3C5871CD619C69A63B540EB5A625 Out = bc4584fd19429b6c0076cba7241f4e24cc303bada37dc1fecf81d8f794d9a254 In = FA22874BCC068879E8EF11A69F0722 Out = aa95009e7516191a163adfc34d51acd6196cbd5d9fbd25c8130267428d94b066 In = 52A608AB21CCDD8A4457A57EDE782176 Out = aafcf0ba5f5a4393f484522edf2b3c38d0102afd3de10ea0e8e512c7c7e4052e In = 82E192E4043DDCD12ECF52969D0F807EED Out = 34292aa01d199af294cb06771fb8d136d983b5fd122eb2d7c838aeaa3204398d In = 75683DCB556140C522543BB6E9098B21A21E Out = b1b8510092925c1c8eaa87cf43f905585ceac0bd9cb0d242025a3ed70456db16 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = a05b0d118ede2b221ea3b403a0dd5b70ca2487def109ff3dca25474cef832271 In = E26193989D06568FE688E75540AEA06747D9F851 Out = 2d38b779252c92dac4df25a15cbc1923e46e84235a2da0854e4b8adec1e61202 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 1b724c6fb639211014641b87777e5544c20f215a79cca1d1cb43fa24f68f753a In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 5111345d92ca78c6634cee4936d0fa6cdc7647359fb520c4d48d71f1f46ac2c4 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 71d45f5d62e020dbdee78e87b2e44f58322c1687c7308302f89c2f46481eeee3 In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = d0e391fd70bf80f2e90843f841b4bcdad7d26f09be6aee8c789841cc14947dd0 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = d520bd9d8400e032806bc303392edd20099f9f9fbba345f15b8be8a597d87d39 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = a383833ef172bda3b17cabd684f472df0b27e8bc33c34f075bad0e59219102f1 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 535a39c7f85889353f30bca0ef2dab4c38aa29a4e7bfaa9302bc897887700a63 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = ca40772e2225942216b2cc12f52cb6a21ebaf0e184deb624367f076d0ec1c0e2 In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 803932ffa31dc035a403bbd85ed038139fcb4a9e140195c9177dea6ec22f14c1 In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = c454c20b0686a6fdd4f4dcbbd836f8292045ff4ae95c75d58b54f057bc094835 In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = c30405a54d19d17ad6f4a8b012dcb6a4bb8600fe726a7eb629602e4fe8822071 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 93237359cbd20f0cbca1f67ac89dc68ebd529a7275e6bbdd8549fb576e8b8685 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = 8f57999020ebcf50fc8b6fb381e69a8f7571a593e36beaf7331850ca70df00a2 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = be17d12bd3ee5d011c8ecd5fd482653878f02eb89146d8457c63ecf81462a9c8 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = b5102cb0626c6735e6397135af5b6c9aa582ef9ce97a10c95ddc0d9a7ce27995 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 59bcec212effb5f69fce4d63fafabba58628f46958c10d39e30fe0122ee52e4d In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = ea29fe84ba0ccb890af0b2c728ff70ca1467c491503e533c9013f8f20db5280f In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 6786f4f2898c8a7d36f1eb2d6ed934cb95009d45f23e2a3b5062e379d0ab4856 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 3d97e793b18c54a5f78606675fabf0b663f44bcf2d494448d49a0905785ebe8e In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = e18bfbbaa743258a6a83c851bec08491f3ee24b6e484c9337fd17621f3971806 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = f2faef23673cf74fdeda22d334278fe45d5d99c0bce1df0093a36473a8748d53 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = 0294142dd3792018031a5ff62d0f5606a9e2711eb9be870803630fa39f583530 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = 9e4faa7f496642397d73c76b6e9c93c04111377c37a5b4a40386d1f71ab3f314 In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = b9f4b742f917e7e57e62bf9ee84c15e7690eff3ac2a12b43834c6ec7dc34f08f In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 4187a0c461636c02d363369835b71f7f252f45df3cfd72c27a3c7b65faff0e01 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 7bcca696598549abdac0e99436e8d1ac5052401af6554fb81db3be81aab9df68 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = 439ad6b1dc79f3de8f545aba29c20ef9e0029a633bb225930baac6a033b8d945 In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = e4406b4df4a4569a35bd528c7a976c6a45a7acd86fe639c8c6c7831c89385dbd In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = cf2c3bc29ea4e541dac3f8be27c1d588b38addbc35fc47efb13d222854162e41 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 1dcff872fd9666de9ba2cda1e130785b97522ccc756f3d46a90979938abfed23 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 122fb026c20bcbd250f98092e660e85e5c600cb9eb31d09a2c69932cfe5ef8ac In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = bc079c1cd80b2a2a7fb2f36d2d3e81401f7c441bcfdc2dcecfc9b2b30a9395d9 In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 7c67e9eb9281e58517728e8e955ef640ef7ef7bc51dc86e6d9dd9b9662bba869 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 3b8b0b5c83711e3f31568d03b74b0aaab7ffd7c0bacc9cea66ac06ef188604e4 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = b5f519e714ae8ee83c429fb7d5b4cadccfcb9b2226018fda618ffdb67f3dcc2a In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = 767380e3669d709c576004ba71002adc5826f3e3510bcd0ad0e935e6c8597dfb In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 4cdb9071af6cfde4a5705af0df6ac371de4f48afce80fbe3fae692b41b8b37f6 In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 45a4283c0aac0b8ef6aeea077a949a5db452e7f2dd1c24017015f4fcc9b8601e In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 07179dfb3c9bf77bb204995255379b41bdded4a81edc5acbab07b6bd0f4145bb In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 73e1b3b61296c03de773c64f5da7d603f6a93ba266b0fa7a227dbc0e255f1064 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 310ee5215c969b054949535e1f17c45ccdde886ed7c0f6ab63c589a0a2222d08 In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 52ed4708782f773201a7c5bb56422884bef29fdcb0e878295aceecd11a1c7306 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 1b916fee456761126bd218ce7eef47c02e85bc8df9d239c1902f3b62573107bd In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 7ef5cfe1a98d19888586d942a1a4a15797f56b1846b29d06222174fec757e132 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = 58c767cd6c1ff8f37468ba77487a3a286d055cf598a9246955c07c7166a17e25 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = e0d0a13753afbcf39958c080ee42985d11c7546dca9a21e33a64de4ac63ccdba In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = 71ce286655dc4b00b2840748ae4c3c5493cb7ead3d4c1ad72e564a310c65f420 In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 1a3f414efbada323578d0d16d09419fd1bd47e7637526aab9bbdab77c825bfa9 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = b5e7c3433208c457c6ed4cd4dfaceb33ee81b99de57036f0e82fbf095409ec4f In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = 0fb8a6e1a1acd7db33fe05353fe11d5a58cb710cb529f4ddf51b37df2ae50f8b In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = c2c92829f2d80d3cb807a533d6c418026034d2b4c14f9afc9d2340b1db4d7da9 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = a62d20b74e48226a398771c4e530f2d6c281eadbe6baca476e999264eb4c132f In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = c4c577488c7bd1d698ecec0d60dae8745b4a098e337442deed68949cd02e7e3e In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = e8926b27f61a8589be7fc3547fde36380932af213eb97bf3cefaae759e04a0d2 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = 0acac5a021d54b0f45ec644113f20744c7cd49945cd031192378732f15736a7e In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = c81d70e306be8d231443a7b076c3d8d6925c8e8d855d600d8c65528ddbbd1d2d In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = c176e6a4388514cce135abab6d92d5e56a38599f0f363f7288a952dd45d910ee In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = b29bc33b06c5b2b9d9847d788ce32b088b6bd5fe70f360c8635db660e5444800 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = af2eabefc30dd72e687f199f3e944ea7e2dcccd9686288601ad6f6b4d6fb8713 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = d315482850cb31ea68152970899dacdd827d2341c9cce2ba983486e8f067e496 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 4cfb36b4bc783ba8c7b82cc3829a704cfa36427a8c8347261ff3573018b7f4ab In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = ee488a95d5650dc01ca7d60377610b76dd95fbb33fb4efd788e96f9cdbcb3ae0 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 970daaee43de3f19f05ca2d875455ea77a35ec897db60d9d3a44f743e84fbb29 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = f07fde60e8144c48812c4c23e0e8c2b4f50ddda401674031c05247f5389137a2 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = f221c50c415dca6944c9ef2f6929afc6378d850b94446628f694a9caa6be0e4c In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = 42834303ceb44f62e994927206770ffe805de02561375f10d95d88dec7474b4d In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 475f44d41c2917fd4ca4d507be217799877bf7aeb4aea3dd0311eec58f173bd1 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 68c56f207afdf31f33c38457be41060fee65e68dcc38ba6b3494ba747f583cef In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = 5632b5a25f4cbebf21124dd5295332e211b07c57e46fae098585fa003ab66985 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 56566c8dd254f1095518d0f2cb1ffc3e3e9d75c7fc95443cb21624d49b895b51 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = 8d28231fd63ea9968868baec5687b376e2e1ad607bd3c6b69fe880898392fa38 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 2150245ddaba054a9643edc9e4767c2d07645f7e2007ccea16c8e91611b94bd8 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = f5b7ca757e953c51316c507176a6bf03d9341066f3f413e8045b0cf36fd50817 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 9631af35c804c5fc09160b7d49eaffb826ebcfddd8c210e1901ada23cdac03a7 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 4fb2d2033f21f8bf2be0039fadf078b95e42dcccc9d60efa184b85733ce0b233 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 2401fc50eea0b566ee020559f756484fea01fb89729634e6b1b8c6fed323836f In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 88da26ab49a0630a18131139cd108edfe8982908a38b29dd4d48ebf67a3bf3ff In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 50dc52601eda2fa399f0714024ffe5c7e8421e79bd1e558e7ee0fd8cdfe90bf0 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = fcd265721e75338e35672231d1aa569e6eebf43b07e73cd4a125e3991722cf5a In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 73a5c82c4cdb988f670836c2986c59749d93d231d22a61489acf3be5d41031af In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 5b77cc2446775cbadec1400fdda0c53b4093dc9e683c1d1248462fda74a3a835 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = e8d22d20a8f3d147f5bcf11670aa8be226292a6d880e01a3e4b4d765a9c63d21 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 45211376760c5e2646d1bf3aac7bd03c95e577e95a05659d2cbda004b6f2a9c6 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 92627e5a262be427b123dd488a06571b4d067934f3b5a4d9adc43d1624e9556c In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 965dcf3c955d4608a2556b43ac1bdd2061ceadd5b32a24b56d0f341ef6c0743a In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = 291780e51d780aa9487dde0d3962594fba7edd264ecdf3150ef4c339bee941ff In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 54a38b82637fca03a45625a52f2cb545fc500c706d273e8b42f1d6370a19ed00 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = d9bf619c5bf263c5d1a0dba92584c9bafa2223349997cb6d4dca316373a0c10d In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = 6532f91edbe1cb613b5d66e2e8a913df356f535ccd02f771cc095bfe1aafde8b In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = 72b91168003912d77cfa8be4bd81a96318bb6a4e692d64021dd9eaad95b8840d In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 1295ce0ff1f581911cfc517bf6eb5257828d805b7cdef76be1dee45e73faeccd In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 9b55d2232cde7157e6a82ec7bc71b6127fd91b32b86168f0384b87511b06d06e In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = 5b593d68dde30a2a12e155d709f6f0e22a2027ee48b395c30daa5ba9a437516c In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 0487dbaacd52f5a7071057af915eed49e4f9d62e208910bab55be369b947c1ef In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = b10c588da5a0d784c530f0da2f8080fac6b88e0ae0b5f6b41ee72b328bbef39e In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = 219780cc657d6c702af614da677cec8725b5c2c9e6dd37264bdaa532d8a8af30 In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 791fabca399168cedeebe404ae232c75db5f1be23b45792df975a8ea3ad28a0d In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = f5255001f18bffbed199daf1eaddf3207d74f708e643405f5af175565052a29a In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 011671ac40735bb022b9e4b419c4cc8fa0eb668ec5cc1ef3cb019d9f4f66988c In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = c8a95e18e0e4f7a933e8566d2494a6da915a0d98cf8349e92b4cb93747e77b01 In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 2abd4fdc77775e5c047ae9df4730d4b8a77dbb1352ab78a812ab8118ccd08c9b In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 2d177f43de5f062131303586770b6cdd57d343be690435649119f596764e21e6 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = f84b134f32926b71ad100a2d896d1ceff0b158645c7a2e78bb0f33f869a94487 In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 6ae134e6de806b000e8d349137a76947746457e9be368eeb9e9f85fab9938d4e In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = eccc9b83615e804711884ef987559e449b0e2e28fda5309d6e3cc4ed97d5da80 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = d60ff5c4001a945421595a6b7dda94b3f4c35bfd640f279e068a40b76806c9c0 In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 48518c3fba4900895aa353087ecccc60b2ecfcd6626cba0c56015701dfe94ab4 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 81ed71d5dddf3871ff0e521cadcfcb7adea4ce8e9acd766ecd8ce36661f58a75 In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = c2b0dc6e97ef828c47ebf283c94c3eae4c169bba48430061a165f4d86d7f035c In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 0b69eb2a0dd618c0e7443c040d82c5204732f5b6496e1ce47a6d9fc58d5ddbd2 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = af20adbea664f2674cac4a77731d92b9003f1bcc6113842ef22abd85c92b044e In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 2dbefd6b8b145ff5f4dce845d35cb713f959a2129b09c89f099741e04b22c33e In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = 89dc08fc3d97de1f548af1a1441e86d5476ac97dcc2aae370fefb10ba9e8c817 In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = f145265b5b92c46f38045ec71a73f8856ec8be41de234e29e1400c7b4da2f347 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 32b47fd29f2b30122cab117dae1b4afe90ec72e8f88b3bfd4540c501a5d416a2 In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = a10a59244c886d66068945a6b90bd6f19cf8355dd6005c967d6287e84d0dce96 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = da9dfeff4f1fed9bfa8fdfb7fdbe9f60aef5038018a48997c8540ce01582badf In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = 3ec2295d0616fdfe887dcd93cb3cc57bd381e30ee9c1dc14566a050c58742444 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 329777c1378d000aa39806e27f6d92d22e375f8bf5cd950d885745e3635c9a7b In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = a68036022089316c48273d4bbd681bd6c2a4c0eafd1a28889619eef67ff93446 In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 88b94e751911e3686fdb8c7e7aafcd8462dbd71200d763da1ed626432bfefbe5 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = 90d764ee1cfa59b9b66ba321b3ede26f27392951dd53096466391e24402a8f55 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 20b9dab34809d1eaa844ff22c14b207230a8dc660173aa0bbc744bcb9386c8ea In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = b27d35c0dbdb739a3f45a7f08c1310bf6f31ade1bec0c033b0a5f127c5be58a0 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 14127b73faffbe7e95f5e2beae8176668eee182eb38759e54591eaba4f3442e2 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = fc915bfed73d808f74159fbfb03d0824689f19cca24c112cf87cfff164c84160 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = beccb4aed629aaa32dc028764755215477e7b128ef583dbeda45a659076fcfbf In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = f5051155cae4a30d87a5634ece4a85f6235151379e17243d9344c1b668217b82 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 5c6ec5810a859a9575c1ee331ab38779bb708b0b92a9e41bc28532ee90ab7024 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 5a25393d15c2a154c0078a2b956d2051416ffab2bed60aa994db26db3af701c7 In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 4fb09d4818be81be1fca8d115f6db9aea5d8883a39f4175f7e96b37a6a378c73 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 9006f59611f10214ba326945b04f9db075cd1fefc9af6349d368f4773c470d1e In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = 673f1d05f6e2251894b027d68799d1baf37306822af0cf6793e5c0b5930b0576 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 6587ac7b68f5c2f03b623d7dbadc6bfd589bfb3d6888bf7f5082884d53346280 In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 08b1909024480eb77ea582fbe7810db5c6c83657507a4437f7176b71a8efb1e9 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = 3286cc13f6de5dd70e5bdf48c9152a40a239ec2e1c8b5ab5f01b183a4f251cbc In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 84ee4d4f569edbfa4271a6aa5082da7f36a71eceb5acf185b8755ef4e0e43081 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = abaaca3251b25d0043a450613b555d644e798b5d51b86acc08ead65b4fbda716 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = 987e45a007a4424167ac7506da8f539c4387304e053a534983ecc5b0621e8f3f In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 5fe299c37f7cfb6adf20b406617324ba3ae49fd4635964929ab7e8007c66f573 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = e3f2c62d17e9a19ff760e4166f98abbdcb4a157e6bfb46129b05425c0a37385c In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = a0c97ae36867d5b066e46a710f3f5fa68a2e67b9580aea0d04a20fa0f03ffd73 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 11224522bbdc452e1ac313a60d8ecf582bc4e28499130e884ac76bdf0b57bd8d In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 104f0210cbe3ea227fa7017bc96ee6350ab3fe4299f78d0b6afde0c97cf94c96 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = eef772347e060c4dc0a1eb5854926c3bf7197f4937f226881a038e3bb0458bfe In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 1aefa0c484231061d4f6201be7bfbbb91276ac1f69380e6eb399ca4efe3d80b9 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 75ffecb3e1ecf60058f243fd0300bc5d634598d82b54b863e64fd9d2fb113955 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = cf3b62269f8bd93b5e17a0c45d9690c2638248a9f6f871380e60fe9a03280223 In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 1162f0313bca0a04fd770a2124172fbc2aa5b7914d5b89aeb2f35ce3c9198d0a In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = fba3051cdaaf5ab29ea6344cf7f3783d945f5dec34970810210879900382008d In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = b291da99ea66457b22844ec35f23718138976058fa8dbaa580da90f57492fab9 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 6510c0ca9697a03f800e483f78389491f18e9e102bb82939e3c366efab52d17e In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = c5f0176242bfcd3812aadfe6708db65f8d1ada7a63a6a1dfe395ff59db1b474a In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 7e578105d756ccee051cfc3e3192e9a0a521fe2481026ca2b4768f90de1b8322 In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = 4368d5475c3ac6a5894f91bf1f84c1d5e1162f80e6e358797294cc142f4d7390 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = b130064096a916e2ab1bb60d673acb5ba08a140d74435854dc74b5c9f6a1ad62 In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 19a433c573fd994772370b68f15bd3072385636787d202146289375b734f82ac In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = 3bb032072a6bb19ba9cf822f583cd174b55077e120089c82fba770e277b35d43 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 1fa2be5ed1a5ea507dca6c8f05079b036a928b1eaf2991756535c2bec0025bc3 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = ade26df33218b924fb606eca06962d0be8e0c012c55fd81a0e7b8dd4d101e762 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = 1aa87867857c28ca2e14503a29f98a7faa57c0eafdeb7d5e60b903262bc79512 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 664ef4854e1a2aed15b2d6b8463d9f30d7c3f1a4b74acec296a2cab24afd810b In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 2235c5bb92492211d2f008e637c38786638bc2f24252a7480532cd37072db5ae In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 21ce9f83868fbe56f0ca9c65a927a6fac5168e57b542b96df378633c5c2616bd In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = 1ea29abe6b1a8c319b4f53ef8c6edd575e9de1551957d05fbfb8ae0217f77055 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 4a6cf6c2a09bcdef0ca2353eb847c2b99cbee2e9a5f0c07e579fe493c813312b In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 551c87a7b77342982e5118f85909910c677e00a986bc0bcd6920097191409d46 In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 98a3c2f0816b96835f8bae291e14636d0e764e0e41839e1d5de7e56095e63402 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 27be7cb7417099b827558edaf0dcd75e952f06553f6b444ce5fc3701b4fbbbdd In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = f19d1d7c358c79d85de2dd5471ebf4f23115281830078cfc7452991194b6466b In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = e03f498a70743c4bb9532d27919d60eb872bb13ed76d8c764dc124595d03da19 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 61edb23976b4c414f841a75ecb8980b281ccfaab94de2a1e3fe7e6677a64be06 In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = cb45b6d9d6d58bfbc76b81cac6f8bf1f7f97616839f0943ad3e56f84640c1392 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = e955c0302b945acfed294258ad26cea5524331c6be309dc93fe1083f38455f96 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 3c351ca113e30ab9e9e99b313ec32a8e0f37b7d1fd098ff69c96b4d3f2dba7e9 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = a16083c61ae30575ff618b9fc560ddd1d1cc835cadd1cad4c6d48fb36447b384 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = a9cccc8124d2cc619c00d130b950a1dce3197026e12c3143717d2ab77f605c4a In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 53bf43d1d384804d88340ab050271e66de532c1618fc929dc2004b100385d64b In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = 2b813d01b0e6e9ccd63ac9c513e837cd33fed46b8fa0be7c91a299f8b1106a8d In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 9a90d20687176af65aa965c3e9a3acba89fd3b5d4ad3b48fa954cef043c49663 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 4985ebafaecb5fccf715e9fbfb987c10fdabfd92ffb0be5e19e7160d7118cc4f In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 52a0d20fd2a6059fe921ac866f56cae0e3a873b58853421035453cd1d88fa2e1 In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = ed03a43c09fc34ebb21fe0988c6c37bd7f750435e8fe7ee3e3e90e5a99c0fab7 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 68b3c731f2ca85fef1b9bdfb527a58f49d0393bf6208bbfc6411013790070b9f In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = 95d5b88da031bf444f1dd839e69a9e5708a611f0f2266ddc0e98192b116b7f48 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 04f23b04763288bd67ae2f590cb099da0a96ae836b2240784a6174f0683a0dbe In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = f3f61dc26ec5fdf0fcec7d6a2d13c97fa6ab77b8438906106c00164a6e17144a In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = 3d3b2f132643f8a34d5e0a2419243d2ef06bc12256d36e8a9f6b058a2db90076 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = bcde85279ceecd8f4fb4cce66653c848d01e8d997c7b0a20013078b78ac0e7ba In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 8cc2ca7f2193c1899796734cc70e77ec6f6ab342846cd7dbddf7f92d1973e8fb In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = c492d44558167ea86477e78866cf7f98a609ae1369e8d09974f8d7cae0ae8b5e In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = e9e8a971df9f735f2f0a0bf406f7c3147920947d496b0a79132b2c93ac5376c9 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 5112ebf6d8411a2f536fb616a138385f61ff281e217b637312c3b29126ccb7d1 In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 104fc7dac280e6c0d4ffdb4c092d3023f6b4da6ced49ac5b7dd7afa04627b734 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = 2731c99917b5cba4e7a2acf1fb3d82f6b22515b13ab1a73b0f78148b3fe0e40f In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = aee65c0f1adbc1ed5cd80d97370e5e104f8f5b33daebefa65b2f96cd53a0a61a In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = 6c9cd8d65c3295c941279dffff07f396faf6958219d38485812c56ddfd8aef32 In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 1ddc9fc60c6b89abb22d5358c887def45a0bcb998530ee2ffc4495b90f8b2fec In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 70e41012213367c48c58bb10975540b0f93245d9a8e73b38b17d215c15ba396e In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = d8387e89301b745bd3b50792bfa2ec0f7b2c053faff02e8320375acb50029ae9 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = c752394672423c6588ac01fc3d5a89d3eec2f56d99be6cc74530e403cc624885 In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 71f3e4c26a706e0c3c30f5ad6eb16573f9850aba942d1ff3729634b6bccb1e48 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 54e6b4e7a918b5b0a73a458f7a6e3c426366e2e6bc110ce16cdddf96356d2164 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 64daf074aae0ee8c06e8bd87067d8ca82d600d388e1514fe0718aaf4c92a5fae In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 47695052d3e232e74d2a516baa5eb7c0e5d291088989ee9bd3ee75c0dbb749c5 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = cccc14222df23463559456d77a37484def4b1a9ea644dce0529c7945f402e021 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 916f3fb79807853beb01d10f44b2ca108a4cdc3992e4f7efd4e2b5d21d8ff043 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 7e80f30d3966cc30e93b155bd74b64c5292eade7faa76d80393668ed442d57c5 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 127413e6927e6a4fc79cbfc0b295b3b861d11943e02a67b2514651d475418e26 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 0be9498d42c42e4b34340e8c5c3291e79c43823cb32e0aa1487c6fa0a2c0f3d0 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 1be9a7d7bd198a1283c838073aa4994c5fe3084a7e474d061988c5c425bbcb92 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = 8c3ffd7b284ccb88dc8226854dc29bd779a60a5cb65dbc73c5a5b5c2279c77f2 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = c43199215a8f796edd9388c8377bbdfee8367fec31bc4135e2ba2a1778441f87 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 1fdb0067ee0563b16a0eeb231320ad723a1e4d28d28811b45bac842490d2d7e9 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 71ffdfa05038d4862ebfaeedd1538750f12db7bcb810cbb341d656284cfbdc6c In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 6dbdf5a5f5950280281636c16d798bb18fc68c3830a5340ada428706b9ebd0cc In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = aac3581d6fb39d26950cac99d149bc1751233dd4614e896e66dddad5676c7f12 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = bd6109c513075c279b8130701d92cdb823f6403471ec1fd464c2fdfe6059f7a3 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = 437d315083ea9a70b5cb7048a43f4de2c0387bc2a288706c4530b22faae3244e In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = b2e980bf1c4efe1689e5946f38cff8197003e6e0850fb9c6120dea1c68c3d937 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = dc54e21ced98c3986142d785a5b5ec64de3098adeac0a73f362dbbe9e810483f In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = ab9daee11b314d25bd6e63dbc6f64b95a3459d8e9135026857b2530d65cab990 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = bb125f2ada003b4252f7bf1354dced94a887d12d9f7d7ff869549df8cb232c90 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 6c9fc1b76ebcadccb5dfa3349f90e3904f2f716991257f14f7b2cef43f259337 In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 3efb688c2f015265ffd8bc4e728baf1b8afdce02d5a3f45d5febefa6db5cd38d In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 9bc2a1c137b07ee7b341e696a19f25582d7341ebcb9eeee1ab434e6375809841 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = f0aa77a6116e4cd26fc40d3c390c072642d6328f8816c2288ef8f81cbe1c0b19 In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = c99db06a3bed5b8f26cb898cd1c9eedfba59b1a223a98f1f7c91031fd8126948 In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = 6639c5984d3e535ca509d017c2c142cd05836bce0f29db5b30ff14f299546026 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 827871105662dca2416b0114a00edfbe42a8bf9802b23d43fd7039c6f3e0291b In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = faa28f28a188bc7327a02b4e3d5a2988b9331af492262adb9f3ee659508026f0 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = feb2814c962211bdb47877ef42d7720c52ebdb0c520e48ab97da22878ef721e3 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 10bc0f48980f5335a65b7025382edd0d44d538623406f7fe4fe762bf903060a9 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 4c8c8ca9b8a4a909429cfc5e32d3a85f3857ed7813deb272cb56e7cead64bf39 In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = f1312ac440f089b1eaef3e3a8e7c15c734d5fbb2e2dab1caed3824ff13827e2e [Blake2b(384)] In = Out = b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100 In = CC Out = 9f520c539e7b9c056895f27718a97990ff374677d08b5c7f307f2f0d6d84d96ce65ee615d19452c7237feb11907d9bb6 In = 41FB Out = c4131fe792ad9c30f714558c44a37906fe1a959e8f80e590d592b878bc77e52af9870af93240420d2a40fe9dc208ad7e In = 1F877C Out = 3c93148a342ef7dca597826edb97466148fa217d8761175e5f6dc52461a4e270007e5a0663fbf97cdd894e78140e2663 In = C1ECFDFC Out = 5f77d0d10c723078fa42127c7bf89e8869503075cd82cf6bb3ebf3a502fea269a2a6f7f216ee159088c781ec47ee0d70 In = 21F134AC57 Out = ab828876b8b36b77b3df9ea8ecd123c248e31faba8372298dba31158ceef8fb6d68d54fa43f784cbefc9a188d1d29f3a In = C6F50BB74E29 Out = 77c55a5efdac2e9db8c49797c17b1d68942437740648126169dfaf7917af3eddc0184aa0c8cbc185d0df1012393c1780 In = 119713CC83EEEF Out = a1a60084d6c9a4a9d92653815fbb3e4587b35177112014dad9011338a2d4617cd96071a32344f7547891d23385f0139a In = 4A4F202484512526 Out = 141e5ead3e6f54be88c6069a4c64cc0b591b718778bb3256e85d2707b22211a9b9db86be06d15e3d755f15c45f31e22c In = 1F66AB4185ED9B6375 Out = cdf2fc66549d6acfbdabc2ea9b5d6d895f4bebd2d1a83fe10eee819ed10a26c6cb0fd7810a74e45cef71964585a87321 In = EED7422227613B6F53C9 Out = 8543472ca5e3258f9924cdefa09adf9122271324130737c671014a75b3be5f42b31cd5515b8d48c6844e4d1146479ca0 In = EAEED5CDFFD89DECE455F1 Out = 7ae9f858489a6dd4d8f58c7b886142b65b6b62f4160db42d332c432b2d1d676cbce8789517ed97a9ae96ad71a70f639c In = 5BE43C90F22902E4FE8ED2D3 Out = 3d268230fbd42202a2fbc80635365be2d03e6aa64f9bb67b19f283ae2f33992f56f544f3346f14bdbebf9d0c22827b63 In = A746273228122F381C3B46E4F1 Out = 5a39ac570b92e86da1316b17e5ca2adbe19dcc9fc4a286b5aae953e7b92bad17b1fa69af0e06b2d6fe9bc26b651a59ef In = 3C5871CD619C69A63B540EB5A625 Out = 237b8f576c048667e11c4ea32901a8ebcd63c7c7b40bc324824f301b007978043902db961741566b3af6769cf4ac8376 In = FA22874BCC068879E8EF11A69F0722 Out = dd837f5133c09f1d5d7169f20e8fcdfaa4ad5b2ca9c93bb42f8353768ffedaf1499614baf869ffa7683d3beef18b927b In = 52A608AB21CCDD8A4457A57EDE782176 Out = 3866acdc3ad454c52edf7ef3326f1f1734ff2bf7b2955f948abbf20e96467f901c6cfca3fe8eb4a7e88f8ebfe0472e67 In = 82E192E4043DDCD12ECF52969D0F807EED Out = eb5df0af95f3952322087266b495be3cb69322d1b8baa0fb2df924d98ef22222b876b5be6077ed8df9b6603a930dbb61 In = 75683DCB556140C522543BB6E9098B21A21E Out = 28e56bf77c856b206b27feb5c65adbcff905ed72f15274ee3493bb0c0f6ea94d8548e7f7a6e58f8b6f050398f66f768d In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 4a2a982161af4d4ce12ef10e02b198727643b85d63146cd78c29759607b727eb086bf5a1417c5de9626bd3da79975207 In = E26193989D06568FE688E75540AEA06747D9F851 Out = 8c6a7b5eb771c09d45adccddfda6d2e266ce02b1c02ee98ce70b78726181ab9a7202fac620152475a82f5231d861218e In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 6b27923e5a298cfc27c65daaedb95ad14eb60921f32ec921d75304cdcb70a2f03c4b679b648b95bb3de654f99cc18a40 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 092b927f5eef3f4bbb86a568b44ebf742ee55a194b339e98800e81523864d7211dfe7521a6954a0719f81f20a79c623b In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 9cfe6cd164a63098e2e1d4f4947c3cad945ecc38fa69c704d2d9975c48ad44548f2013c6856817f4f614bde0ca6a86b4 In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = 915f6308a931d761f3764589de11d7ba65bfb6bcbc8460ddf0d671ad129ff4105b9d82739d36a777353e304cd46db67a In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 78b7dd2f938bd4933b673ea42202db2d59d8073d58639903cc3ecb40eba9c1836689dbf709282525a8c9b4c90b6b6b93 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = d623ef431778b4f28e28e632d5c892c0a969ed3b1f98b79753f8b7b3a6d1a4c8e218a15b0535e00154ebe43670657fdd In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 9c62fa3e75ffb7c80f216bc5d17d1de4ec4e45bc971b07704c27db9a67085420c4e4cdb83601367d415b7ec1d91ff410 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 8245798dceb37527ffb69985d01932f9743ac934328dbf38d29a69f7709ac93968bcd077d03fa34c8c0630b8e872e747 In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 53a448530dddb72c05eb575d320bb7c9b28a77ffbacaaa4d697c98e9da3b10413ca782a308c3140bb1a5713b38c9ec69 In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = acf14905179789a271f8c8f08a79023d26edaccc68094a94af24864eb46ed80f334a3639530768ce23857612dc9ed2dc In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = fe6bf735216bbfcf893478b24d0bae7331e46012ac3f11065ab94ccdcd4ef44e3cbaa994d80cbab84ba543af8269c6db In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = b985eea9a06293ae8483f27348d788aa773e63a4272ab1407943047de2d9dc5bb67746ad8e97b43ac754437b5131ebc6 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = f411663d2953492f3b4ee570a84784901c0759b5b75a782c11547afcd5d7407d4748945a48d85e85a13a82fb5082819a In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 78c37c14335d8b9f3931beac79141481a9858fe4835290628cecd8118cb30180506590c53f1557611940a7d3b355f1ae In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 4ed8ebf0e21813354db6d49838eb6bd98bb2db9206b6753496c1cf67a34e2e5e26745a704ca75dc1dcde1a03877ce0c0 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = aabdc93bd423e5204724c19991291c8ef0bc0ef2658e01f2744c0eba577ff6d605b90252a8790a1fdde6d0fb495be147 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = bfb1dc5ed4b8f37a27fbad30a9528c50fb29a4a4babc02719f4c41755b09837fc62898bbed05a83978fa46cfe47cc598 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = fc6537cea70fd68f9bc55177512a424397a1b5b285d3c453be0554d02392da2940dd37f45d07a72436441340b5fe8cdc In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 0955a0cdfe35668017d2822105d9f6a60b3e4b4707f834620afa7e06b15a94386d3293c6c3e374833be90561ecb8da9f In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 16ecabded51e6d3d89d7ec9eb58945bd25dfa28ddf6c45245621349a4d35450979ce4d8ad309ec5f804ad5a112991cd6 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = 3de757110c9d68a38c561596f22d919291f4bb5946cba4251a63f303e091489a2f69ee5ad2c88466cf3f9c4385047d81 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = f6a107fa14449b7a5eabd06d7f6870117b73964979ea688a9156351b696c11accca1b3827a6aa5d476c7af926cbe4218 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = d9f8eaf05c65c5ffde2e8cffa235d0d10427e14547cdd6a8b350677847021084e7ea7b4d0a89d5092880e9c285be28a5 In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = 829bd205a8f1a8121d0499d2d3a4bd73f563174e8dc59703e1747824385edd173e6f973bfa4329c6e097262cbda16b7e In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = b282b5f8c7d63cdeabe9c726ccf16b892d2809aac99aba85286344de336caaed572f13cd4df9dc477a2dd0a4d50a66be In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 75ab78c51609121ad69ec25f347d48783456d460832a129a31956ca519f4afdf6b8f6511ebcf6d0b40b97c1bf37bc780 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = d34352cffc4a5683bd187c276bfa1dfd73fefc9009352fd3d519fbe4d48ac058e83fcc3120f57c459efbf454047c8ab6 In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 5e9cdd7dcdcaa8d08affa3829bae7475bcffd44aea6cc2707bce55991106e748051b760ef700dc5b0d3c12fb1a89182c In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = 01b17c63286fc3cc35e407a2ae91b64a788d5871a8f2833c890f9f0a79945d04ab1e07fa7ca9da40d8cade5c741463d6 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = c109be681cfb94d3c539d388596590ace0195fe259dbf18b61c29414b1cc328edb3ed378e17cf8005fe35e3504bd6a9b In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 6f0afb88c3ca9529d9c430a5b571f19e86860dc2abae894ed452c38cad5cc6a7bfc6d58fa0cf95129f2f357b930d2ee4 In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 247285c03828a23df11b743f48d7d5be419318ff383aadc9ab94518b2ce8d1dfb89427ffca8c38696061a3f16f698aa6 In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 6d678615839e017f80b7f2adc79677be4a0c51fdade2579461e1994cb639d3284b4fcfdbbaac31799ca728d51a01d615 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = f667bb758b54549184920259ad80d01f16d1e6a70ea9095947d3ee915f3a404bb66c06cf85204513f1d78abb28371aad In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = c2d5c24a37c1631845a21e952350313175c3a6daa39d186deeb01cec5a3b326442e1b32cdedcf19f1c01e030ec3191a6 In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = 1a6624b4c537365fdf1f2ee17993111feaad2ca2e43a3effa47c101a3ce0650d4ae89d97833344fd5cf72133c697ee57 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 528c89564249d054b7a1b16a2fee6ae558755ff5eb773112d9c9f1e69e7b4b3e86d3a0db0997ad20a445e1f5820a4e29 In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 948e6e49c8c4a84ea5c6dbe9f49c89df5c85e03e96052669650cf887383ffdc6d4b725a3a0bc8395fdc3945b767ef8dd In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = fea3951b37647b55a940533bc441d18f6ab1429d49e15db6bad2a13a1d50597c00363999980ce8eedff7065b41c53307 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = c281e1eb33761ea2dac216d2f366ee5990bee48f53cdd824c01011486d2f8cd57b01ab51229e07b6687c179f288399c9 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 72fe1fbe6df8b7e297a56aeb94ae7008bfd431d950c1892e82d4a2d328fd9817d5328feb84edf3548ca9dd3d91494d69 In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 319624bc5976161defe71338dd6ef42a1b160e1b3ac6162ce298b552915a2b62ab62e92ecde38be5f40eb5b360a54051 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = e4154b4a5d9542af7130120d321d5b0991341d2ff8610266b7883abaeb927d1d5567e4280e25dd04431428a0fe52ee20 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 02ecf14a6e42d2650874d928a5940c8f045687185e83e5257aa0ced7f7fc1ce28ba32f9b6466135d68318d7876d0be52 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = e070f7dd0ad5ff98ec0142a2fca07ee228e5d483ada57fe0208ba6e0dd987a7b742bd02c48ee489e5f074ddfeddaa438 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = e877529070fe4579c184d78444b1c97ff223e144951b7a7e32f1d2770f61a53538c58e73a8ff9623db27b58a1357a15d In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = 091564553555f5a7e8c34b99d78045aae4ee45b9264aa459a64f7ef6fb50f412d701b7e16098dfac9ce5344b63cea813 In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 140684e982eb089cda2fac32abb79b35647fae68055ab533252b3c2a10207aa2240c70cbf3d7d81bca42c03b725b9b6b In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 5fb98a996b6be084fdc472038841b66b0cb34a811d307fefb1e9b1239e43422c30f8bb8f4fb9c4f1fb98eaa17b4785fb In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = dd218a6dc9368dcf92a39e786a331fcefda5fc43037d08370341029eb97476c4c0bbb54fe257bc350083a1cae44bcfd7 In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = cf4e11aa284f233e4135bdea3f8fa908e316876263ffa352de264cfb476b8164544dadd93116949302596be3ee9ee170 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = eba5f7f07f25d2cdc1f49b93d1228039c95d4ae6341660ac99519006ba6c86ecb6c38f9725b89ff4249fe344dae9ec32 In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 18e5c463197099f4186238f6aaad32a04d4096a594db0563e1e7c5cb7f12b598dba4bc7cd491852f83273e14f7f8f42d In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = e23b48aae58896cc35fe65321c526a44191cc8ef78c1759785e85da854f953a5cea15a946fbb019f4db46ad1c496b2fa In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = e11b87bd2c1a84e1b8a3b295f884b2160981ae9632a64648c6be70d899e97f7ba3ff7cc71bf57c95295e6ce97b8a3ea4 In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 7dfac9bb5fe6529594e6c651b570985e8e64360c8a9c7846ab89b58c4db63bef3cd947e946055aef427524aa451d1e05 In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 35175bae7d827ef11bb897e4a4122a97dbd6fdfcd33a19dbedeb6eee35ebb5e0ae5a7e50758bce0cd56ee0263ed2909c In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 7cd1b977981a9eefc9fe86a2b708b69a18f0902a7994564447b77875a80f5a003441850659a750a9c45ab74d728df571 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = abd67da7fa1faac0855e7fd9515a08816ae3c7087c28e49ad763ce7c14b2ada4f9950412e35e90cb9fd8adb6e34cb0ff In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 37a079ee9d2f50f6706288d0cdf2cc9e2592aa0b27da61f7282376b6cb1e504ff034fb5e7df6fbfeb4f8de1d967bc45f In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 1fa6e82b15990eba4a04c730920edd6b249dbb50983b0edef742f37818caadafdbb38cb4ae37bf8d6c64bfe9f387be05 In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = 9f4bd47aed0c824e9adba7317a2bc4493455ce7511ce5140ab6251b1e06549937b7b7e5b4b8a18d7f834b243c2e06f95 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = e9c11a55019a9f3e47b23a33b2255e625ca9ff6076dfabb433710cc1b7ba4ffca3c810ec030ff5efc28de1705f6aea10 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = c936e5c153d411ff269ee9087a4b73e7235ef0696e423ed2fe883ac11e393d566b334502108c0d2fe79bb4666440f344 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 56440839424c5e384f8ea87d15fd1de3db7c278cba6ded61cd425ad442f8209d902b93542afb05ad1fe69adbb9376c58 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = 167eb3c251979cb742006be5a5d092a9d5e6adcf8a744fdac305479fe87c54dd67a50ee05c2750f7fd22d3f8c035e15e In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 27b313d61d98cd8c26d2613f67c134c5aa7f36c790ea72b7e71431adf74848ed7f6c372f320c839035bf6dd28e897c4a In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 28112f192cf39087783f85c8fcf8c59a27dc847563491b31ac0fc49f524ef91649aed06bebca73e36a29ba3a9bf962d6 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = 1ce9e8fc9a7354464e35a23777c08da27c51270df91c482411c7bc343c64d35134579b6a8947b881f3e43e08d0b45354 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 74b6586a542126238eb1d85d95cd6d7e65ab9c77320a5a7b247c06d833760a62b74b0d8c181d450ad9c69bffcb0ced4b In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = aff33f2d163c9b76ab432be4bcf97068937979eafb63ebdc1f01b0c0b522d75db35374d9b5df486f22f522449d232a9c In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = a42b704d2954844f583c5ffbf60a9216e62f25d27ead79910e084c0334376752ab694d99021fc6212a81497770f4f340 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 7c55504ff134c929167c45c2c5cbf998295911c93f9a3a612444dfa6b79ab139774b846fa3af601d08f36cbb8d8e0416 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 476d2b5fafa7ff08625a9eab779093969bc53dddcfdd8d5b56737aa16b709d498fc214ce592de2c246db42aa00b989ee In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 658e527d34bd40e90d9f2422852ea03ab12f728642e898fd9e0aa46b5687e82e123bb1ac3b7dcb16c62101bb5d03cec9 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = c4bd7c55a4cd6dc5e85ad2dacdfe57b7fdf826d9eb4e85e1a850e014e1e62ace5642a6fefd47865a281e0a95c41272ac In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 2cfbefa3ecd702b5c557b5031ef0a63273b4d1948476f914a2d8b871ad33eed72079160370d23002474bf1ee010c83d0 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 06c9a2326a988d2466a61a1b3805005a335ec87c9801564dd14338b403af209e1d22d514cce4bd4c266ea27f607f01d9 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 79668721ca4ed5e831b3301c6d77aba90f313f79db48dda9af909c0f884007770d17536baf9216f92ad05f9301098c3c In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = bf3cbf54e89e717ea4ce44772f2fc784e50b73af277483307051bf33e61dc7f5e24927ac8d853c2ee6ced0e018b5b208 In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 7247a15203bf1d4e5a3f73d74bf8dec2a336b93207a6ea32f632a925b25f80fa1fc4ac939beb15b829142a5d0433d472 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = 28878ced06af49e54878ea1fe85160f661757fb578bfedc440cb3f350d5bafd4fdc6ed8c37e6c579e7e4c3817a9876ed In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 2f6fb3faf7385acdbe889f31b53d64bc223c34ae7a37079cff3cf0fb26534cabf067a86447a08f2113cf174dfaec0126 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 47e0608ca8f3719763575914859f57d9e4e8cb74409747e1f2f34a10731d96dcb5c35283835cd2d32eb8ef5d151f934d In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 308cebb832faa2ef1d63ff68c514c9847f2babbeeb90ae724bbc66be69338858cc88005988225b05c57aa32a45af3683 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = 05b695195f956ae904ccace385e84b16efd8672b8c86c03579eb968d6c5332c7df66153699f20b992c3de7ac8678f05c In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = e2ae6eb4a7d72404fa3d025980e6a1253a1d2cb6998af3f645ec0b7a24bb7a70c48937ca2d47179c6f29c5b41ebdc38c In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 596e7214c029c8f839567496b989b1ccb4c79bb835f63099e89a7b0e7fa1b6cb2d52587cd8d33ab025077f8c6c979080 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = d2608eb2b9a3cf31c9a35d21d4a6100494fa4d11360b11a6e9def5af783a111a52beac700b894c8d46458b0d80d283ff In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = bfb2ef53dfde08379153dc7bf747fc2fe14dd1374dc24ece818c8e342419bcf829619714f5203ba14d5f6005f37cc346 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = c1382f1a23960a36e337519593385567a5283a407ca51b24b946cc56cb03e6d3e82c4ad7a2511311ec7cf15297fbd92e In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 3197b70cc0d94d3d0e21642705e67c074ffc4653f8f908917f659c2466dd10909dd41ea27910dcf4ad4e9440238d5bd0 In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = b0516d916263efd61097b58c575252c4dd9196d667a1416cbda066780fd89d4b1b8afd98f64da1034e48d6c947d63c4d In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = aa7ee456bf6f53ec9d8c665cc3242e403d2bbaf56c85d79c513ee0c57d4954c95c08d6fc268ec9b46dfff62a7d149dce In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 5f37e678531d5ba4f936e9f67a21aa73bf2496ec2dbec80c47355b0656af45678603ff8c32b7b7459c96f96f28acfc27 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = 0b2d57740bbef251edbc4d02f0415ca7a7eaa7b94d3f74fe3bd4d4d225b11d36f8a6296a4ab94b381c182cd29f14bc9e In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 19cb41cdd2b9ae126512d3007bc5a38e7fc70eed6f777231c9487bf21ebe2631fe471221124a8a26e5e8a7a8f77cb15b In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = b70eb35115783e621b8464de1c2b16bfe053b628faef100a663f1fde11fd87b06690f1cf7cefab9f94febd80234c4590 In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 6949030b1c9f7c4e06348c6f09e966a38aa7b05afe026649521ed7f1ec60bee218c78ca2bf51b388ee8b54a2cf645d61 In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = 333dd84e1d4330e3ee1415cad6376b0bc2d15dc020541d195bd6fdab54e49c1ae979bd7e12095d4ba2f9134aa4dd7d3f In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 863bd57c046ef94200b6b2962311a68534409127be5d6edcbce9d72ca35a49ca0978d10f4ad43da1791d5bea3cf9aa21 In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 2bf1b8e98338347f3c6a8646d8a591eb32d5582c7b5518545f511295cc0aacffe9581ce513cb78e0992133fcd975d757 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 67248a52a271f44c7c252ca17f932a443f389a9d80d010986bd94ec7a2e78ed523ec20515446089885f708d41d442d16 In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 00ea27f40d5addcda90a18162bb57c263567c51ffa97918c052014a8ee9e5c93f821f2c8d207d8ba183434d08f5ccc89 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = e07dd123cfe81a3154facc2df52db9ef3fcc91eafc8b8ba2bc6673942df4ed15018c6ccdb0c1926f71eed24fd8781366 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = 2bb324dbb4a953d856dc6d7b481969e2ce0bac5b8226e35ed63012dbba5d2ba280fc4adc017f09d6604ff0ea8ee140cb In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 5fd63c99f250a407683169c79e5ff49b2471e681ff0b7dc603ba09ba216b2429dcb1cfc34540efc9cf58a211bd026f30 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 81ff81eb6aa70ea32ba23c0a453c8ae3877ec3a9a92a30bc884d22b4413a833019f78b2c4b626e0f275d577c8273a41c In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 77c517179319728d7379b1f36f50d8550c3c8f2e6edeb34310fb497156bbbb5adc13090d3f3cc7d145d49dd5f1ba75f2 In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = e779c1eeddae094b9906a7c29659592be49dbd85c13c65e9b142796779c121f6364fd67c370af0b1301fc9f5558bc2a3 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = 5b3a9b041191e54cfed76930387205f619577c28f043e778f3d6812b40e48a6a23c73ce1e2d4fa883dbbe334f3597fe1 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 28859002b9f0a4859080eac9369cdc70f49ab61bd43e25d9ee56404e93023e4456a7f1e6d5ca4704f3ea3dcb8bd6bfdf In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = 6e2497f9f88ea45bd8d142fb2f09b3db66e994fb4b3169cd329ffab6ea658939bd54337d361c2d87b139ea8659c4d91f In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 0e51f4461bfe88ba37b85b434b1e62e9284e6cc9865ab9abbffe5a0fe10dc11910d2e60674f808fb8b8c4fa02bd4da08 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = c1f47c367e8894b5a1ceb6dde9dd12d86550e2e438de4b2a1285d2f0f2c61d7a30f131286172708038505d9817892bef In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = 14c149e65a8fa2d4198a9ddb4a6919ed5e2e4b547b509f41e71bfa5312d25f04f4468b73d9a7625f3880789ea9d5ed6b In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 458cf8ad1f1bd64e6303a0441f9199f678ba96481ccd2a4e6ea3f6c04698e09dc8483c2a50268f474b601c4fdf8a5f4f In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = 9feaa15675450b9d0e01363941b7c6866f7cd3869835c9992f1240fb5796e8f5871e916270c5ddc8cac9ae2243c014b2 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 64324fa938bf221081ea4b91479d8b9b33024fb11f84f9bf0d63330655b1f67517ae87492e4ec2a851e17fdff06f61c8 In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = b188654a91b0856dd4afc68270fab9511b11d78bdc2847b04a376f3746afe7351cd1b27fde0d655dc6b5451525f4731a In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 305c8ea9a4ae2ad5b86155dd07b0c92d5504fd29dad87f74fb4fee93dbb09c5f2ec053e87caaef71eb6bcde048af2d9e In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = db68c56feca532840c9464b4a4f5bb571231c0af976bb13c0d2d4a76e853db4a91252bf6bd2a8a3acd6fee6d8b017f53 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = d82141569ad9941c0e027c8476e2b807caf6de06cf3a46db2b14346a5b74f219a650375efb820e577af749b9e086b9c1 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = ff47d48754e79dbb40bb3c73e0030ebfb0001d22c8a2d764853c0ac1e745caa84eb4b189aca330032ca3b1ffafe99d30 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = c575cfa29a77dba2ad7a49244151363c1dc0427644916ce322fa91b80304ee90e5c16811315004efaab003a32f636bea In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = aa92f1067b9851724b56947bdab893f1ee77cc4eb05eecc8323fa2c3f419fc79061022c61ba11b7c3114b8a3461cc3f5 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = b3730a58519c31a4c78ae95f5625e52c0537604ab0f63b3dffe4455224949da3db312ec17a0d9492bbe37de27608c8b4 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = acc1af0d1bf9d27b1f3b221fae0c826c56aa151501e3e767d45bd793c2ffc71ebc7fbec93bcb33a52baa5265eed6cf94 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = f45709b474091dd6e28d1df60bbab3fdcd74532620b516b6968aa2365c1a165f6e02cbc7051a3e31a7077aea89aa6149 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 2b28baf7e6e0c24315ddfac88c1fde6779bc3b9982199e8deeeec60b5c21aba84ed06b3552a49f0fabe0d139284769bf In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 533496735f25d1b4ea445a9c0fee5146d6083552c8f16ececefb1986cd112ec362aa0351f7d1cdab3c236eabc3c52f69 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = dd0d1b5a5d8220ed17c97623b090e2f22b900eadc0bbe02bcb98a7d869211b6ffa4f04cde244dbec3c9a2053511b62c2 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = 7c49b4cbea2298aa3130085de990234285024bffbf3444ec1017becbfcaad9e9b46bfd00fc610d4ddb99384d071b15a8 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = f882e3e0b6af563b4b491bf3adf73816381ebcb7c3254153a6b8550c1058d2c9ee1aa41d899d96e1ffee86133a30c796 In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 6617a6befcfbb629eeb99fdafbebb560b2fe8bec7bb6315cecc9657ad69e74af7a95b1854c6a78bd30eb21babc1a1b41 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = e9993b8b57a33be5d6cf1b42641fdde187e700e86372ad7c5aef0342a8273c568de95caceeb2d3995eb0fef9d81c4cdb In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = c6ad29409ef84b4d1304bcaaa55b069649de29aedc7230541a4765875a41e47abe29663019855b28cf3e17209c16422f In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = c962f1e1739c8793309057fbd7f1228b9e4d78d2e5cc58193369565a2c73fb729bad66b8ae03c1e8f1309a306c12c4ce In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = ce274ec62ad13390ad701ddea3213639a8c22cf6a128e50a8440791d30994523376c8b3633a93dfb2284040a980bdb49 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 9719827aa5f969dcf746be754a73952f81e71819dda6b4d2c107cbd83d2a2b9f29d1b61578c36ca63f07eb701122d359 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = d0c4f64bfedee16a79f467056fafe67e61d7669616c4d5b2893a2d22af2eb087ecf4733204243298eed9e24da25c01b0 In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 82136c02e56609103dcba87a1f6f8c8ef1e40d50742f9489c0b691560debf9cd2ce80e93a8d920f53baf8f96d2205ff5 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 9af7cb722d4c5f5a212f5d47155d3b3052fe7e7ac434d10566881dab5400088a1f51e6a02acf69c41c56cf6690d29c03 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 8dba987b0370444a6452e4fb0957398cfcf33a971b29d340b60282c0bd8a2e7a188d8a0eb740acbcd680a20c4de5df1a In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = a646293fd1f3af1f2f372c06e7a8ee9103d1e3ee91bb020409e48bc20aceeda13901524cbb7601816135781611d7a384 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 553c17a289d3666d44ee7595547270ae6e7939c18e7ddbbd91585d352c08b40d77289a68a1cec3c37ef174003e2cb6c3 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = e54a96244d04d63fdceab516522a09c8b7a4baad6517916708044103a66294553c27e98aab6d8efa114122e632f6e1f4 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 459525a7de3a8a986f03bc38d9797bd58a97fa72ae02b5e6865ac5338ef730330264e2525fc8c1b75d437fd7434a25cd In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 7e97d0ba568c3bfae07b4bd4e8cd6aa14186907c7a2c18e613c6ac124c517c9b8ca62df0835f43130a5a6fe499301da8 In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = 8d1c83d98a63adec8062e665b81abf3a3864811902f4f1b989dab1161918b7511b176d284c3d42525e457fdbf8b844d3 In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = 6fdf52321d3ed730ab6c9758f46a6ed9ae9ee22271ff56f99d0bd2e2577295a644db668d54611ff8a063d1a35a9802f9 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = e5906c73ff1af5e41ea96cbe2df7c6d895752f723ebe63785a834b67c5f6181ec92b820697ecd3422c9757d8b4800974 In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 190abadd04b5b35a805931717bbbdd8b15e77876c40beb51503a3cc63901dc89544854ace5ff8637432a3983c2d81255 In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 50d604dd54c2960ef578e73fee29015e4cbb14efa1385d1700153c9896fab7f9161f13629ef42039445592c8fcb540cc In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = e7bced7b40fdde8556db8412971b9d2da0b13cc57bdd72d7b18d949998ac2caa6bd8aaaaa08beec8df5db4c7664b2231 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = d26e62659f9d8224413bfefa2bb84a41a661d31d5cea3593d653892bd0e48d8b580d56ce9c999418906a46876275626b In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = c2e78b6be635882a9cbda6ef1422ba7042c4e351a33d7ea8ca610cd633a7f6f569b401005b4517bc9cc5229b3a410559 In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = efa81e9bb4c0181c8465b803d8d352c75acb692430d832c6edcb276435ee119de6e87fa5b5153520dbca62ff6c8c49be In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = d9446b90f46ab68c2558211a4f64c3adf44af25d35b2da8232e84e546e3ab26b42cf1afe1d78b13637541bfbad82f350 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = af9c582652e70ce44f2e3f2ca560fda17777295836e7fe6ed0e1d3f04678d144eb7289a4fa6c62f6b12e235453524e30 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = f78373e2d9e513cce980e76c88cf6309b6aa6d3665bf28be01d9280d12de091397fdd0e44db1f71acc695c295682cf6d In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 13411f6fdb552cc8014ce092d3f0193defce75c5b62afa29540ea50356739286542ee69d8cecb2712beae859951477a4 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 9ad0cd56ecd303155c7b0886a4542908ad7f63b2ad60367e6c60c053020b5cf64aa4c0262a2c03104431c267b9196674 In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 50377eafda8ab6d16b1253f0813bcb2793cedf40826163565a07cab8f9238c00e8c6840bb205983c6cc769f5d6dcec0b In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = 3c2d91de42731365e5d89021e8d9fb2b0be54e25369473d721719bcac11274d53ba42a3a1ea4a327e48cc2502a6efc1e In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 35dcbceab923c709f846015df43f8a9bf1d53b5d91f4c836bc38a13867aae8b555fa3460f219c9fb691fb9fd5f9edfa1 In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 8f9fed3ed19274d3530486cdc5f82c909c713b59d630d065c4d668386c1ce0352b012823d88e8eac18df18ddccabe1aa In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 892e2a0d09a3a1279d9b62f86903f3fb70bc5118f72c8464a04628ce946bbd2a1372f65a5e042ba11be6664b5ffb997f In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 032fea2a692bd8c3ea2377e345607257eca97c604cafb14085b80ae967cd815e0df8d94656ece1271a45d1b8e0bf6f50 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = c275246a4841977f5fc54918ba57afc67b4e9a7c5fa320b544ef98937111333623feb6a80c8edc3ffd8e18887b9ea370 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 91a542751ac85394cc73b8933debfb5bdfee1d18601565a9e947e295a95e2966cabc03fdf1724b30f295ae82d6f3ca2d In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 8af3096381876c1af19fdf33125f09204d21f8f489f21f689d4d0b602c9df7fc5f5e7bcba12c7cf7488d4ed383a6ec4b In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 89fa7456831ab6fd269b74e07afaa2ae23cc91db568f32c685d6e4703a66fc98869881e5ec021cd7dd714eb152e36625 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 8ad02911a7732af0a4ee93ab89b23fdb46e1207a028cc780c8eb606890dbaf90b049db2e610f57fd526bec3ec85de861 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 6dd54f8ee63d3e26ed509f9299934f56eb308ca3564fe9fbc50bebbcea203e5a7e580f1b104719275c94942a187edc7b In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 5559adba63ced58eedb6fb2191a33398cc727beeaca3473e53af6fc1968947f0c2748475aa3638d48b9a84aa1204cb5f In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = 03a090e383d6e4cb5e7d49d4a2fce10c9342626b9e0030aa055a63623b55210921b02be66e62d368582de2386cc75056 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 025430e6adbe0bf0f78a1b478a94e9575b84f2e25dee611f31f9258a2e8bdb51853d18609122374eef41d4062ad884b8 In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = 19c179db7f2c884c85921e2953deeab1fc6252db73b7422d8f09cbb577abb121bc7d28376d2c95c3e176f53e169323c2 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 65bb6e8b834040c1abb67d6cf1a0040e615f1d6e893ec18c2705fcf7872ae5545264e92ee6623f8dd7d960ac02713105 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = c0db6f13224bbd06f1c3d788fccade03fae995e4bf31d22b624af44ed8c31f9ec666a5619be5eba4207cd1bbe3c41c39 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 1318f393e1da8eec72389731ae116196b10f4c319c06cad9bbb2f98fa936953890754ef3dd7cf8b30a727e3e09a55abc In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 6c3dc89984841a71747ffaf533118584ce4aa6a5bfb2aff2887505a2f8a3bb13468f97e22ebb46857cbd60bdcbe37bb9 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 0ed3256bf5be71f9e1c168b719ac8125a583204e656bf4f6b25f3e2f7902b4297cb3f54ed5ef56f4447496ec21b2598b In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = 5d90e16b9610b03a12956155092560e5dd17f6c4fa2b07ce8d2bd885344be0c1a9189b76a521c37e704d79841a9d764a In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = f8c565996e3cf46f18622ef3a962253ab57b3ba8b4f7c8a7bcffe4db2015c7fcf093c76f7deaa0e4cbfd94d2e21bb7c2 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 7ce9d2e764611ecaf6f468ac6771842bf6d9a557c98288db48c9c597efe6df716bf20eb25c73035ac69e2b8885dbe5a2 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = 13a57b2acb6b97058b9b15d520f28b05ccc2bd2ae8b49826cf48ce37bd10aa1c887cab2e5715d2d04c161ddf386a6d52 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 6703c6f174e5aa6f00dc3a1c778018c00c979f46f7edb9cb467cdabd47653366a14cee1ff9f52be334698bbd0990cae5 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 6631a04e7dab4fdcbc80ed02dc96358dbcb82b2d24bbe5e895c88acd54429b559d4a5bca36783b8835655c64991c5c34 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = cc742ed53828b4c0893c3a623ba4658bb0de2c2224577d95aa091604a6c2651c511b5db595d56b8175e79ef7ab8c871d In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 81410886bdf351983963e24ceb8c5304ce16ce320c86528064d7d45bf51d330386afbd61f792a8ec52af4f107f5ae74c In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 237a920f145006fe54302a0d4cb0591b4b0fcade3a55d9cd1c41a509df1b83e89788b28d3f625785f7c59f6c951826fe In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 0e23eba25fcab77fce3a887d1f9db94cb99142126d2d310d470e71a7e4c6a7df0fa2126eb50d5c977c6c1459b3317873 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = caf6a36a964a994ebbe5c5df0e593316feb66909d729a25273e5bd949ca344dd0dd87ace49fa7d8e2bcc349005bd4ffc In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 19cc31e2e24966c2af3a6004de188b9aff367d8ed6db06e84ac5fa2f72ee0e13f410812ac2d263981a598e2ff9c0563c In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = a614be4171d5df5b2b3f6ece56a2a83f7ee89a8d8c7659f0315451c8636e4186448a3b458a03d0a4cb4c1177b409457a In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 2d448485075cd13048e9ca9ba6d9ef76b06ba367020f419947731a566096d9f3794a5d25f5d173face53038bb19212f7 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 84f60d2b8fa0c64eaf672d9b2dcd4500c63dfcecc610d830afd75332e7bc3fe3b38713dca0ef4c2c296df670a1d2f900 In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 33145feca0d4f671faa806b771f7fbf346ac274f276bceec27acdbaba25d8a79fe9f815702426fa1324d3f56221ba394 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 8c1d659811dff725eb1fb72630bdc250718f6365a6c5d508fda703bf0e1bf112cd462b57a6c2d9eac55d489cdc55208e In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 635faadd379c9d2fdfb90fb44ea9cb40433045fdddaf3c2780cff6a22135de133337063397bed3831c2553a8b0de7e08 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 378727f32dac6cbab01b65d5f6c3ad39c33428ad7c0914e39901a07ef32b0499f246f1d7ab3cb1516bd250b2767317c2 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = dbea71a183f4a5bc8c8900d63bc13c02164994d09ddece4f6d49c161322e06409f32e6f07efc08e6f3d69819c8d228b0 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = b35ad699186095463013e6eef839e9559eaae0fdfe47aa194b4e52a0daa2b57434e53c4d9e7af148b2abd0368c6e3038 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 4fc7e15dbbe3f65851712aa62f0f131eaaf94e9d1c52c41730b8cff271586b7927dc7908a25c445bf4c6686289fbb464 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 32ee08e3bef3c8047b351b71a20fd46690207cf7b725a8d14fef260c3950e3e6340e97a1b41d8972ebbe346bc9e498c8 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 922662629b8567737aff249b99a3ee04bbbe0eec2e5a4749ce027e5ac1e0af99d7d1980c125be7f00c364e7e4d9205a6 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 3ecd165631b7c251f0d849d42e819340d0118d74d0aa42f5eaf4971dcb8608e3869ebaad35bcb71e27bbf9ae2de45b04 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 2f73ebe57fdca33764fcebb88ab6e3196c3b92c6c05d4834d20cb226e3fb9959f0a1e904aff8ef452bd75bd04e553936 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 9d8cca44d87a09c02a4e2c960109fb5753958b9dfbe2fb19106505039a52ed8c3dc5430a18bc61c8e99b8d79ef656199 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = d4a4a038dc4e8ebf7f89ade2ec890a6414b1738276531c3f4b62849b6f0571d0561e59cc048f67fc07bd5422ea1d6f4b In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 2139e0f51574d76cbdc150fa01a65d3e6aea258b86d4f8e9215dbdbff17be4a6ef903a0ab60492d745eb45ef31cf72d4 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 1f2ff8112dbaee699034bffdb41a8b9134dd988f88b07490b55f63456acb803aef7e3beb172c72888b679336ebbad7dc In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 72108b77eaa6c8e9343fb76c22c8e8880595d508317f5cbfe186145bf8c0ae55fc572c2630eae05ccb5af80e2da1d74e In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = f7c53a713b12d71a6c1d9d1807830b9741543d015d3d8a9c9dcc00a259f242fef75da89db2e88955b96d5cb4e82d61ea In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = efcf4a1c0f5c537fb5f48654dd6f120f48c572a8edc8f7cc3b5a9fa80c2ff5c98490ea3faa3947582aa8e0ee4331211c In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = aa8e8181b8c003e0ade20560d96bb1ca8d135b89e7eac7257e5c83afebce6691412a35cde5417570bbf05e155903d35e In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = ca6d1fce2c77aa5166d1921d1ed47267279a01d76edd9f23b99384f2b6d75edfb37d76e703bbf9c1a1c1f3255200089c In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = 471d5dd2ee36fef634630fd1c1ee05a8525e9659e7ea728ba58c377d26b3a6ffd0bdb3ce6d9a0cb41f24b617633bae88 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = e96d1daaca88a54db215d70081b7cc1e6a76d958630e7f9b25ad40f81144d3867e00031acdd20ed5da8df4974a48cbbe In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 3af51bf205bc6dac06826c868419ed5b572a3f9272c2ed0f81fbed6326fa5f508949527b53bfec31033b755dc2b8534c In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = ce7834551d72513af5687bc70ae9a5d2fb1301104674be4fc09d59c62d7a97c37d40c955f3b94f27861ad88e5409084a In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 2ef5bccf6cbbe34bd442536855a5badabd70d2b943e79c8833aeb4e70956dee63bfa56acbd797bd3be95026ff10b8b32 In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 9ffee5bbe29e5920da7386d4e07c623d98d437b887e40588b48ce90fcfd5eb7d8ce83e61a0b112386e2a5b85fbf89a9d In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 1b9d6a10fdeff6ddf18f3bb03ef3ea321f5fc07e217d706d30e1d01f248c890789722f4d519940d4294fe975cd2ebafa In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 34db131dcf0551187f0f91065ff7e088af1accc3a5e9f2ca1eb3db53d24f014c63e2d751928a253087bba7014a46dd1c In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = e691fefa41ed8303b4047147e73d2786dfaa3ca665920559cf70fff722bd4c580165c30c600b50099f94b1362f2a395a In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = ad83836b7821c9d25cb18ae8b5746104c46e41e66cbfc4d9474a509730e401b6a606fdf3c5c07980bec8faa0a108fdc2 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 17281ee206a052e79a4b037134d6afc0eb256d0ff11d1eeb08eb895e10e57755da73f80398a1496b85a3ee5e6391b8d2 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = c3bb34cbd9a8ca8cb34331d06ec1ccdfca00c33d6fc36a0f919472617b02cf23fc9ed85cd85f5d248ae92f4ba60df38f In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 668c747e71597c8d48912d0fa7f09e48b4e9db16b431fbfa6be694c840b044d703a99d89f06f2b0da1f464514c5ab2a8 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 67b34e61cd24fe2b8c3a5b2112011450dbd099dc4b0a6114cbbb7ce6ee57e060612977e3fb6f51e1626adc52e0080e1a In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 65a2ef5d325e731352b279503d004405b6593cff9466189b5c10004fd62eb1dc25681568b6da669ade962a2b253db162 In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = c06cba6b82271d5ed9f60c191b531925b8853f2952334509acc60d13cf9d7d4a0a0585ae87030cc4e011eb93579af861 [Blake2b(512)] In = 616263 Out = BA80A53F981C4D0D6A2797B69F12F6E94C212F14685AC4B74B12BB6FDBFFA2D17D87C5392AAB792DC252D5DE4533CC9518D38AA8DBF1925AB92386EDD4009923 In = Out = 786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce In = CC Out = e9bfc0d3aac9639604e9ec53ee0f41282f2df5ea7a0d6e88a620edf208694b96e8b0a8d21f0908bc6af54a05c16b8379a21016843e535d41b7deca17089e4926 In = 41FB Out = 37ce1fe37bcfdf1da0018341e405286ba20ee9de3d674e0768861913864121113d3357a2ba48dcd2e3ac11d69ed4f83664bf1da91e47576c45a8ea06d054a01f In = 1F877C Out = f9a58b6f9f3e7355ca9d031e3f5b460f49f7ff9d9ca310d4c6330fa0c869ed15848a9196130430f5f9a1a5dfb7347cb5c444d05ac6234905bdda3d291f046f4b In = C1ECFDFC Out = c524e0f5fc9a535135e9eb6120365e22f0979ff910b24face1468b0e54416dab422425020c0c45cac1763b64e2b7bbdbbfa3314453c7924f6a6ec543eb08f425 In = 21F134AC57 Out = 6d132924c50de1017a11e6bb5ec736b2f1617fb7ecf12963cc43f569ea33fdf2c3a17232b30d3054fd7cd8a4b848ece7eabddaf893e9d36499b8e60fe943d723 In = C6F50BB74E29 Out = aa6a1929b2288692f7fb56da27d1c69ecee2c0a2ed21848201b37fa7860066d0a569c95a8088f7ae04a077c0593520c4a7aa6fb0b0bc79751af076985c998129 In = 119713CC83EEEF Out = 6dde70cb29cf808df56472dbef85fae90f22a947b35f7108a67b1c57ef74339a37beaeec0afc2c1f3e45a582b97de3e140b0a70d234b0a1bb21bf8177868fb1d In = 4A4F202484512526 Out = fee4f7fe1bb9aee79551f365c1dff2051a40c9953c6e7cf166e63e82abb4e9f19032da2c79a441dc483f6d13619db0a497b59171d5d8bd5cced8ffbde18b2868 In = 1F66AB4185ED9B6375 Out = 6587e21d2f9e6ff2fd6d85998c98f9479f3c9a2942f4894422237df6337e7c7c6d7115113ba9779dc7ab9af610602016ef6509d866bda1dc670adb673377596a In = EED7422227613B6F53C9 Out = 4b54f9536bce7c9dc0978783f78888d6ca10312a6f44d2c7f840f8ba13f48efc27bc9873875a831ef307956928058575fec8c98062617a7a54aa68eba8464618 In = EAEED5CDFFD89DECE455F1 Out = 892d8dc7842b5fdb08af06a22046269ca92ca858b2c090899006bd674c11d8c744eed680a20eec97d8d842821d10cc3770672247b1a6f443a02e2492b8c28b9d In = 5BE43C90F22902E4FE8ED2D3 Out = 3ecce01033e85d14fa2f150cfcb5f85c10a392b516c3dbd72f7f295b83aa300ff6b361482daf69dd4d7b36d580339000dc06e7f58975b8e5d6890f11e0ae7325 In = A746273228122F381C3B46E4F1 Out = ba01a2d4d3a5309ffe3f09e50bb557b8e114be70f1643acbfba02d1e58d882d8ce98f96b6b8b667532213a5d0563fc6d6b33532472510d6837322f12ff00e6a1 In = 3C5871CD619C69A63B540EB5A625 Out = ecbdd9306d5b2e633eca3d17a5a9113c64770d0518c1c4232ba5d45c83855be59678923ff9b86cfa99d503363fdcecbd81fffd3781a2d2d372559baefa9e8cd1 In = FA22874BCC068879E8EF11A69F0722 Out = 9c82d5926485b2764c5a005732198951b5b253464ffae1d45c1225de16693978a287c99000f70c0a137d5e05fa113efe99bd1564071afd18ddefad343cde35cd In = 52A608AB21CCDD8A4457A57EDE782176 Out = e213e496199fe6579b50b45569efd030ce67a76b045a19c9f1c214da41459b4c1e25c6754171d3d174c90d5d45d133bcbed7fdfaf78293bbe7bffd1947989532 In = 82E192E4043DDCD12ECF52969D0F807EED Out = 293ab40bf700f8f0d59c0ff823860a2e0a29ea7382ce063f41356f46ddb682392ae2f256a73012330eed8dfe68397f4de671d6d8220d869adc3a3f5bc6174606 In = 75683DCB556140C522543BB6E9098B21A21E Out = 75ac7e512c3d5b36a05e37f653828d7000019022c74fadc7f46a017eaba1940ad3f055f1edb7243d55420514b82fc917a1664959b0caee3d6e82c08adbb854bf In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 9cd9d8ad54be08ab872a564ca19eb08e054d10764c55f20149d44c784eb016396c497097396dcf6dcfc20632611df7438a2e9ffd4ce9bb221a5d151e4d1599b8 In = E26193989D06568FE688E75540AEA06747D9F851 Out = 46e0bf724ebf8a3c66185ba56d6332980aaa6a918d2b6e17da603e647c1dcd886a2b0569cec63c463f53faf2f3aa8d66eab805f3c70c5b6b047a148fee6a1fdf In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 12c71c14214cd0dc9a3627a0d8608c9ed0c54cd95217c08393ed9f0c6b2a5dc68f0dc104832ebea798d1f6c66566235809c6a47123219eb4046f489da9efc7bf In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 4b019a0cbf45bfc5b8a3bbc52987b0c13bcc338e22f77d46711abed86abc7038f99309852124da87e98691a373fea22538c5a701463809c6d48c3e27a2acc5a9 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = b36bd83040e1fb360a18593ede85abf858413fb8bad1f6e1f12f5b0f17cc4b484815b578f2ad25b095365e5fcc8145f714f496d3ba6235c28e9c2784b2b8ad8a In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = f256b1ff2a679500d8480139f2a1033894d2f1939f18b5636083ef0b9f1faac8bec9665b15999f9f5f3284dc911df86af82c5fb230b9800fea17aecdd80b4254 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 44e92b277adb2bc74095d96663f2e42989772ef2d33e3772676875ec0db4121662c523e9ee6a490be142f45de5914a5aab9a550e8e530731adb982ad9969d493 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = eb494064d42ea61bdef59d83fa38adaadbd45f7eb3bf330d7041dd539aeb20940a708fd14f25d95cac1856d4d532a58fd385622ebf4c47604a8e7218d6b4d353 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 7cd4dadfea22d24e40239724a03533ec5fadea1a41b70f8e70ff404b9295ac9e3d9c18942476201c82e0d381a44a658d14918718a4bf4a0102fbce49449c470d In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 71e63cb25f35b9cbf0f0e1f48c60afacbc4bb7a95f61515c928e0ddd074b00210c693f03aebafbe0ed83caadb378753a2c5bbba9d78f49b319c7f07fb2ef70ea In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 6db2a68c97fc451b016a5c3f2b360a8c830f6072d010043b2d22ab6d05c4640e6ec80b8e1395d3951b4374098049634a74470d568ebcdd5ebf597f9d9de94550 In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = f9f9f80e7e810a99d55fad81ec6fcaa36efcbf247b6c04a09f9817c204ab3e46668c35a32b476f2660dce84632a5f6c52445b2b343244b10949a2db9446af43c In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 25385e59f2b4405d9d18186db1e308362e1efc5e642df385d8646b4e1459f18b3f22546e5b18e91a8a90d82e19424c95babd1039a78b1050ddb7f70b81ec4e77 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = abc8df2f99b3e802dce1db5666611149a9bff2202bc242e91985bfd9a69f7a71700e06c8eb7e35148c027926ed73f5c18cbd658381d34b6415acb109e51ca6ca In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = 0b1a4ea9058954afff67ecd4dc2d6338a09887ed1c499d7e33da3fa56ddd53cfaa773cae565048786ff49175636e5a06f7a45e5ef28e287ddc58104d9741dbbc In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 9f823b85c7ee25f609909c6c37fad9efe886b6f50bb0404c6f99980ed621a3b5aeb0f9f128e0cb2da9dde4af3b0e8eebe349f236fbd124cb4b64ad5b6105b4c4 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = b1897ebc572d0b25f3f856910861e9f4bb84965ef0fc154473565b38829290772eb72c1bb92723eb46c03d9110728850ba8ddf17875be85376b8d04372a131e4 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 1b8de009cfd655e62c9b0fdcc4c48e6b6609a5980db7d993af881a2a347486cb9ab2d9102dab7837a0af26269593a52a0a71b1aaf4a5989682d36b5d6a925b9c In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = 43a94cd295acfff0d8b151e600266f89cb2b9603c2e801d9e53d96031fa0764be76644c9a4ebddc0de872be6c97486e541edba1ef9d7a7a188dd021f5450ccf9 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 803ef2cff9f64dfdba23360e6388097894c078bcd7d40362b5710b2c36272e4966c2dab6f131caf666a471d7d2c43b0af4fb6f946dccc1a6e640f05a215b419a In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 8996e2a459ca1b19de295a303b3d6e91f465b7da5932d075ffe62aedbdd7453c3379599257980305c209d225b1549bcd48080a064030f38e98a8c7c2ac4ce358 In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = c4f3e195746d272cb103805b4d1dee6925ae2dfc2a41757b342bf2eb9260644420cd2d75297c978ebbede14f8a9c5caba54a26c3831c1c284860737f65d3a96b In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = 8b0f9eb869510611ae3d9ea2cb40fe5afcd764fadb1e08907f5b1665da3f2696545107e8248f1dafa37878f9080d2b1d0287bcf5b8584ba28cdf8b91a7a64e59 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = cc8ec6e40d5f229b6741e76cef7285137e514a690342dc3aa4f4986bd50b042f6600db6cacab6da0c534db2527c32e17a526c72b4dc0f87626082b53bccf82e8 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = ac163b27ab4d2991e83642d049a28a16cf3a6b4d6d7bfd731b61e76a9d86d7bbe309828d28d17967bdc9d1719e071d12ad7d52e78da870fa611b0ff7aafbc70f In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = a441f774b4673fbee0437229a6f40954d8435a8e579982eb1db09e7371223a8f869fa7a399617a3c53635031ba979c73450035701a1dc6f2f2f16a0e496a9ca3 In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 063684f451ea6904870bf0fe2d1fedcb28769a1171e14d4096d6cefbc5f4197138c823739660977e06b15eb1a286040576a4fbdc9c273ee82b9919a3eb5e8681 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 2f765bc67dc543d6d42bb9393c637898e4e5c41f4d3cc8c359665c5884409d224d3c116aa047dcfe662f24b5ba927d4843d31d1214c06e28ee870c259b8e8fe9 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = 70db18b9c53d55091eb5f2526231e5d6605d0c963c2bd442ca004ffe73cef29faf5fbfdd63ce492c811462f1f9c5d152c1d0e1aef7c93461db5aaf754f573aca In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 3d9d5b2c5ca7ace5ca54e19f8c65174e0b5221d1ae533cdf2c513bfc3fe47a952f3ae3103b49121606ca8866de0c52b0639b86f10d94a225292fbc9c72f40765 In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = b0979dd7f8766b9d1c71c73c0cd08656c3c0c03307e70d132bcc05ed0119238a6d62bace7dd9b4f3bab66e8f3bb8ea507d02b1b81ef56cadbcf191e80f4799dd In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 20af18db3aceca3146f321a55b3bcd59cb84023cc7d4f719fd01af6e4d083209d971b5ba85a4ad2fbebb0f8ea3067db7b238d6eb0ef1e6e232147f7237281ec4 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 53aebac7d4237a8d65afe54097ec6111cb1a661d6b64105c72a7348243cfe84a7c667e77b5ddcd855ee6a1ba2e1db0f32e5936fcf523fb848d4d0d43f89fce4f In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 5c52703fade0c7733366151fd7256fbcb11e5148c7dd8f64d6be5c7c44a6e7aa68f23c93c2f71b79b2fdd363a4eeb8b06a8c9facf4ff5e9d17b205096c8de89a In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 91120cbf5cab81f8433dec6475d4658f50760f78514c87cfd13bd0688f0ca719429419352d0794cfdb785e6cb51fad7d1d8f74dcf3db661a497db2bc679b3e04 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = e83247665b1416f6a6fb108604d50640f0fc1a54c3d1bee400bed043acde117d53ebf234d0abec671667a27a4aa01a2d18ddae907f27b41829b99bcdcfcd7af9 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 4f26127dfc5dbf72a721683c911dfe160a2ec85d5618153247aa233dab551f0987f87acc4039a914caf8bfa2fc852f695d146d1bdf3cbdc4de8db84e5fcdeba7 In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = 56633a7b792142826cabd249ec31a12d5b0dc8f92cbbb510c0cf498bb8454f29b129efa1216a69a82ae5e95d6573c9311548f474722ac097a07dbee1dac925b7 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 1329bc4493a75f74762c061e303fc3180ba517d92f526480761cf2387ebfec2acd80c1a9b6711bb209479752610e99d7cfad2c5370e4c9565d8312441733a7ad In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 9348024df82f48fa41b8e0d0486603f3187751710a2a5270c66bef8b175b3af7ef5e6b1b0b750365cb5061bb458023995c8de4523657743f4de22e2db8a371c3 In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 2844fa546040cd5bb3287cb4a2656580a651f6ac4e6d98544c2073d16a3c5961af39c57f9af42d0941aa083dc1ae9a7711ff196c69a513545727e68b85a71098 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 4e0cf0975e3f37b8880d262b771ca9b3dec567a1da3b0d069508977aea904a5f414ff1ac45d13f68768b041a474754fe48d06139e55a16af781c80eafb96fa9a In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 810e53733df59eb89a73a5e40deb666aa286023a259a4bdf072022ab14ce3fb4238fa84328276bb29dc2fec4270318f55cd633ab1c10a593bed5973e28061ebb In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 467be3e23d528464dbf9c9f8e205fd2dc6daa546ae7d4813f703d01ee7445ae90833850e9f11329b604229aedb6c83d640dc5d6f4d9b102c0dff1059393e19d1 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 2c45fdcedb2bba9b13648a018e87c983ae780f90c7763a602eed1929802b0aaab7ce11c672aac2246d34ad1695d2250dc52a02dd4e8975ede59f900627ccdf56 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 8560f21fece0a9598b99c34596fc8796f4f0d323a77a6dcc6d72cc1a02e8b96d9d45472cec1f237a435aaf790c75b722df9a8a03522435226531ef9d0af79b86 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = fe36d2d0d90278280b233c219d4cf34dc8db0d6db4c25e63874d9779e93efa7254175cf02291473977b3ebb96ab11999f70659a6570483fd5f6e129a5216314a In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 316782797c22c3f22ff3287032ed438e2b3486b6aaf0479476aebf1395cb6ec0e5f31cdd2f5c5c0ff3ac939beb7259f4073a8de3014ac24656fce94ed81d51dc In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = 08d059e04307d56fa4ef8ae385ad586c461d90a554f862c160426f6217e25a291ae74c73e597e70644ac7d31e4d1e79cb76980ac51120a59c50c577966a948e8 In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 97cf6ebca0b710f07cddbc253e3ab73037c49387898b1d572b0cdf530d15f2e170bbc2fbbc7983f8d177edb6037365b6dd6731e2f3746eacc0bd1512d09b9f0e In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 8ab442ed7d06f81866c2eb871108080ec4aa19369dfacd161c1bc48b6c93872ac0014a1eac1d512efbe40ac40dfb72484d5f64b62f40d4ca6015f380e4f9fd21 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = dcb9d75366d5d12e33312c07394592d4adfd7502cb5019e01e0d2fc0f3ced25975e6060f3df8ba6b60b08a05e1f7c858ef618ca84dfbad65b638e54dfff6f487 In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = d96d344a97aad94f719358d2205a404bc1519687610e15702ce383fc7c2985bf44579c606129a41eb18aeca840c3f1b6c5745cfdcbe14a5f021361e6ebf0b821 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = 5129926418f12f3d18023e1db38ce20862f89ba303076f794ea34f3f398e60b4ff6fea7e975b8d78589314da1de3b546fe9dfbca0e0bfa93ec2e0cdf840ee7b9 In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = a0400331e4cb8630699131344eaa0a3354e4f862c10c9d75655a071c90b959f5e20055058e3e06d42c6d51ec205156a33b8d6f5b4a6d1716141685632abe5665 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = f589d702b13a22c12f32ea9b9b44224fa6d85d42fbcfaca0464b057d7877b29d5a76de8a20087db6feb1a1e3e8d0d17eb97adc2e824a2409a21c5cdfca67f076 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = 92d12ba06c6e4202dcf43ddffa89a8b73f7126e6e6107eb52b7e47f3d35ba782184bff47730619ee44734d8d595a6000e7df4d671cc8c325845ec22722d85808 In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 94d5200a002a73944c63589bf5a1f86172a22874720fd022c54b4a92f85122b1fb113ce005e24131cc3b532f553cda600540185a43ba195a8f992d317ab2cbfe In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 0b4b60615124647a2cb1fda6482bff150a47feabbe014297d542b3520b9cc382b1c8bf9b1aab16f4742d30241130ebda9c1a1b9ca33098f80773b8112d894cc2 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = e9f7f7f0f37135413abc285c1c628cb6621a383fe3b5a10649907476b6a4561aa92903a37a86975d089b0874e9221486f96a1e55f86094c6e1100875568e8b17 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = 0a238f7e5556d921004bb4941cdd0dd6febeb98120d258186be7b3c21345c62b1c7c2947bb182e03446121deee3c4b5451eab932a38bbe0da4da73ebe3bb0e5b In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 1e37024564b51dc3ea04adaf5b883674549450729cd6f631b3c809e38d7450e9f939f12cb923221d1d918eb9f4d954a4666eb909c583ba5714cad51f27a0de3f In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 7e8fa1902cb1b317b6195bef840fdd4ed6776ab15dc4cbbd4b17d3cc53f10ecab8734c35ec98da2227d4dfe31ebb368af7b055df88ed2f36cb8e3f564f3b7038 In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = ebc14bf37fee002b132eac0f15716a233188cbb133e630dcf9c370a6c87466557c292dd699218ed891c0a70607e77bb761d03744b5091d3dbd7a519273ded9cf In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 772782a2f0cf9c0bad2e91a64b9c6b5f8c53c9ad3d55607ffb46be7f37828806320e5e82ba8fd62aa443eb226677df628c14276791ea4062c8da10b6c3786130 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 61ddf7035a24a93eac20e48735bfd1ee901b2a5e2eab74d6aa3b9a22c3dd41af3f6c6f8540812145efff0a4947828c22d4f369fa08293aa908d738883bf94c2c In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 30af5f1ce400715ec3e76eea3bd51eb8fc252d825d8b3ac2430fad259cc72d1110024293ca3615e41f1445ecdb13169aaf2ca0f23a920d0754b1556ae4fab29c In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = f38dd5440610a5b56c10bb4a84b393520d25cd5665ae8acae8a2041d22c50428776fcca9471a92bf32efdea5a8321d051e78f396535f4bf0ae4f3c7ae878c046 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 3d6904ce2d4d926212ee7f55399815766d6a6199ff05849976cb54916d68def0ce712aeb8106dad0b891f80363276058c5428f90c9c026d4d349383465d80ecf In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = f3ec578b2a40e894e34d1b37888fb831677635b315c423d25e477f440abc1dfb10cdd62891f65544ca0404a513e194bf3905b297774b647ffe523197bb4ca889 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = a5114ffa5542c0bee2b0a80a2b3d9344c200495f96b9002c1da1c4a05da31a5d848941c078578d76b88a91012f72ad0ad4adcaacfbd7f1cd11d938e0e350231a In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 5d61e4a3a9defaf1faf4dc9cfefaa126b0243accac611ddb9394390f7cd4d182e663e28e87ee9bb30c844d24373ae9c5005786a612c1ba32b583b9183df8cfbc In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = e2e10d6f6d41f2f3ee16b72a37d5192c41d60da003e32711ed8a793725ee8e80120e7ecdf89306c62aa8bc31261179026cb64c528484359c20701068ca9a07ab In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = c8805c26b92b9fc68ed2755d0f93a815f7202a18a824b00547d79ff78f13ba3978c353d31ee4173d428ec8c60f4356ab13854ff35151b41c76740e19f426d002 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 45936978ee10e57bdda2c7dc9c59902b30c242cd5f7d046aa8b3665a95fef8730af3d3b26c4602f15c77f53804f6b5440010e1230c8228f0248451a97b56dd4d In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 61e9ebfc3eca0048b66469d3fd4467c59ce826cfd826f875608dd6253eb79973ea7865d0eb6f118bf20dd063be7a44d12e58eb4140423d025780da33256dec96 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 2e7d6aaca1b5c9579cb1027147c0d2837148d6dce77427e6ecf099f7363e21c363f895c265c6d7693d40619247e7ad3f2a250f9bd044051e4420661499e3abf3 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 697763f1910368ff4ce75e907a5fcd2454b388aac955638ff7d3e2b7c6b526263079612143a214316f94bec80dbd974638bab37a79b9938b2b642cec33f6900a In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 9794754a10e3fe43228fbcf088ade821d3823e31779c707f51c044ea6c87b4ca93695685865238e8f0a4c77a9014a540e76850eb076569250fe3515940eecf52 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 66f0c30b81a8682c4b6da37296e2f1a267ff041f8588e155067b6ba1114a69958700ea3c3c76cfa3dd2d4a46611e19cc3b157510d55e4d7f675790cf264b4c8d In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = ccdcc5dc3b458a1bd9d598405594c9dfe8a1ed4ad31fbe0c9df3e86688f10cc2a44f49a86d1c619e1bdce05510a443423dd28f9b6dbc1d67aac28ab6dd46ae62 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 483e1c04aa498d310258fd77cc55a601f734cf12719e6547f16cd9b92cf45053e5be9aa80479ac4d4595916932d171fb1f0ebe1aa50806dc7dbf6776232a1139 In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = c492c716b387aa60b25192618195279a9703e94f21b59f1ac42ec2818e4c51006c6588c48e1efaeae580c41ea324ea128a8d9574c9566e7aeb6f16ca653dcba7 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = 57055d19864eacae49454ff937807bd66fe4d4ef2c46a71f0c67cc1378c6982875b0ed01d838a4a72ca39950edcee0a66036e036fcf26d730e4f75c2eefa20d0 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = fd16d5eafac106ddd134fcf0263209bba499f88cc0465ce9a6c35bbead3c0fa0a3193b6c52bde6b54f9e8db7d6972b27ddfcd0c6f71c12ad90600b0936eb2a4e In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 3eb279ee85ea26405223233073d8a0d8ed7188fac306937020ec9a6492ed2449bfde6e1fc5dc805c9bce5bedbe00b649c54af24bf7a41728ee8cdb8dbb7c0470 In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 7b000245b287b8527f90798a712f793b22b961793b9778e4c907a784061553ab9b713a29e21fa2602538b1ea14cf58cc9b9121c9c652ccc4a6577f4f3f59c023 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = e7e68bc85f25b3871709c5adb8420923d142351e9eb8057419bb50c2aa936157d589f8d60c902871b6a954f02ade64aa1b0f72ec9873644d4eb0d1ae873225e2 In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 498696271b2009f9aef1b570257c9aebaf399504d15ff8f1d647f92f00f6f962fb07a3c884ff854fc064bca38ed5e7fa78bdb5985841455e85c9f96a5e0152af In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 2d95ad464465805ef681b1442b327de134cbb9b677dfc25b253a7b70ff11f011ff1b743f79854b6577645bc7f25757d61a729f4a2feb6125d08d6a1a55acabad In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = ab6a84eec8c58e3a49efc4200dfd5bcb2702a5eaf94881a63b1d9222e306b9d6261aa02441a38a9040800707b992107f26020a041e3aeab2aab0a68749d11e74 In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = 33757eee7a4973a83216ef0bca5ab2713e76bfee9d9e9f5efa46faba1888a0486cb9ec50e53c0d976db08d84de254f7bcff16a45f6c739c620c8a2616b57e7a2 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 998284e7687d92cce337b69bf850d389279d9d8f1276c63d4f736b8e6c3876fad215b098b0e42b5b20bdb2d8a9ef9ab67d109b95c24e7b030b371457ff43e0d9 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 258bc25d618dc460087bb02e2ba2e2fb9ce05a83c79cc442e1f461023e8fa5fc57f6b5465e29350175f3fa7154585e3df7ae016049fafb07e8a94683e47712b8 In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = abd00774f93f2a75ccf7af7d9c8e8f6e0e3cfb90cadcaebbe92722f46dd207e5cbdead01827d2cbc4ec152ad0d1e5a92ac4b1dd1117bf7b252f56ae110cac3f1 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 29c1daa5106facea688dd0300eab219dd67554b761443cafb5204b75b84c8bb05c5f3fd2a0eed0b39c1e70fe8b115089faf2c04316bee15500ab40861660916f In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 1cf96cad34bd8efef3453b1e64231fdb79ac15055f96b7fc935895b37aad6e1a9c25188a4cde7198f2762ce2acc32e97fef46a161323e185be90611171ed37f9 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = c10b4ac1aff6c2f5ea841a60f9c9f9c73793c7059f8becb086d7d6b9d2f11a4d3c12eaa191f5b8bca1369eeb2096554bb8b0367c04c608f6c3fecdcd2d69d762 In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = a5ef0500b3994db5c05fe7b63d1a9f206d61494a4566440ae12e09a4eb55efb93aed128da8e42a56d51822915dc1fa5a4f49e5f6b47328fc4431cf8352f91af4 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = b66fdcbf35be506d81f580988a909c771306250afc627baf57f3395781598fe42ff6a42ce45ed895fbec7c23942a760e20374a61968a38462a369ab57c480aac In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 54b7035cb097ab5c0894dd3719b7534f5bfc4afdadc19bd5f5c5cebdc4c8bce8ef5bcda21dc2273cb2d412aabdbdcf470a3248b79a0db00b3a2fa0795d4b044b In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = 26b86742fc3a6bbd6a7a5284cd0501e23686ff183912d23d70d2547bacbde06938d81e6b05bbda2ec447665cda49cd6841a293c52459b17dcc47cd557dfabf4c In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 7983c025e5e5f709b5ebad8e460bd79b1d75870e5b03ddbd519e7643f5015cb78ebc8caf35570d7cf5f1c6985e0fbdd62a7180717f82ba8d8fa60e2900bdf630 In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = ca2e683ac12ab45e5aea1f8ad2d38acdedeb8f1ef56c3b549a8b3ab77be27fe9c4f5eb33ce0ca1cef12b167d3a2da03bfdb013053d288d99b1390300c2314e4c In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 7ad59b633faf7945264e5a9338e2c1d6dd17f36fc58b117129e8a23b5b91b5f59129e104058f468d19b05f04d8ecc56df60c26dfecc28a142e60753b6fad184b In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = fdd4decc23bcff136f54c1df4496ecff0be04d44e47af44664064cb8304bf0599c3069d1ccb9a642746c8ce0ec40512c524bfcd67d35f01211faa14d805c5631 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 22f166360c2012b0492f0ded75d242649cf64a378d76469db5428ee9f70daa639aaf00ea5452376ec9a7856b86005bd260358dbf57422a9681ec88a188b19fce In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = 7d48a380a623b044c48c8ac2cb3215b44581c5bf8f976990e53e201a7ce07cca1fd14ce6a9e8afd3b4a56d7284512d7b1b32c010989fb2b31c386a56f79708ec In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 4a3c9089148f5be86e123b4114ba5c12d2cbb73937a9b5375dc6670598789248f8a7b43d2d612617048763f3eff8ccca3ffad24e12801911a0cd2821990693ee In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 16d2f600f38cf0eb7c5c1e347817ad3c98b085f720007e98aa82dcb68de46ea939f768809ea60acc7c92d6d9712809b1f91690e7192d04ccb34b61c00e01becc In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = ca0a8af149192df8b7f99fbae435fa0a897228998ca225346a4f9754300a9bd63b0712a92ea9c1ddb43208c9365def3bb9f639e7217cf6b2e5cbc35746383343 In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 4020f947b7ab7194b53e45ae11aa1c21c96db65e7ec9cfa3ed87918be7fffa258e5d824f1e58d9250273db639ca6f8984652a01e3364feb53bb46bb2311e3a7a In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = 3398c1564c33aa4f800bf8e778e9ee941edf0c485fc9530cca45999328eaf867b9cd2045430428c14e6e64412dbeb842e932c97a3e032597e0f63a438034344b In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 802f77fbe223b8ea6e25a33d46ece9392770b72f894696a7266e0a386bd81cf407a304328cc8f5d46458ef54fb3cec57af735a1917aac1b9aa6f77f7c5828782 In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = 12d3554d958a81df7cef444f54f8d98b346fa83f0626c9270917aa1530d2f54aa4364e194ed85373163f02e2684bd557aa571c125fa33c228e3e5a5a85f5514c In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 444f0f0862884742e65fa7271de03785f8d7f6226a3d402c31a25a8371b7f91e23507556ebee1303b10c77132404df09ccca3dcc2d70fd54678502bc1b79a8ed In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 9df2cd7dd4a7a7bd940086814e5ea4f7186be43193d3edfac14f1304b32f6b9cbf31fe86049cb7eca2e2bdc4cf00a62db34462223707afe3a5e2b9207d1964bd In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = 3d6ed5a0b54a883baa3163fbe50accff279269579c2be16b16b149a545c13386da89fac372b2d119990b6d94ee930e50a947636627a508f1def392aefd209856 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 8384ce6b3815a95b4a0c1938293286a74a9b689ad14118e431e925e30ae11426859b2c21020acd4dbd40943a0c149676e32062200f3f1dcfc76d4cb5c6946ec4 In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = b5f4876fff10cd88c17a38adefcb89073c46fa89c15ee1a858734e38d0c9c0c1b31803980bc7c3073f78661a6296120ca61e2c54f5e2f35b34c2b04da4627f58 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 6a931091dc886b54f112eaef7d40d7f121e79e88e2db66074a2bebabaeac5bb78e14c48ecce0b70d2fd4e030c8877c01bcdddc59a6c4525353bf46a452817a67 In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = 0b3a8cc2b3a81cec764cc0f00e367ba5d9824163f07b0d5b982bce034b130d47eecbc60bd6df29605128ee1b14b8d372ad530893178f7a682959a45ab4a6eff4 In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = b24a228de29fb0f1ece8187b2d508d651771854f3b877f8a81aa26ec0b00f1fa2bb4f115f25e583ea0ee85cead412c1e01ff919571094335f80ed4734d04cb9a In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = 40066735133f7a878a65f79b6571ab0b264765bc8cab19050c8bd9da5a7894b1aaf9ba80678151cb42fe3537c9374e272c03ebd410f6f0bf09a6bb4239204a01 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 10973a1e03372fb6c881c301f596b29ab06a13cd51593e6ac0f01292188447e5209a3551cdadfe332e96a723420f8f87b442eb2bca3457782af30695a1025c96 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = ba80e9c38acb1c54a8b17e7f950da3c52a7a45045dd49c88a6df602e773badb2d9c01b34a72375f39bd89050b2a08b354e063919a4a9246e15765ba21796238d In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = e665414d7ed3753c22a27aafb13082c04e4389493f037a2c06dde2542fae979b8272f89e0aa54dae0ebf6cea2b33a0c2c7a7cf3b847b18def08fbd79973fc055 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 04e7f56171ed9b4759e30f8c614a0e125a0adf14b37ce8b2c7f2376632b7b615a704c01556f1bba7bdf141916f581792920bb66c33dbcd3650573a0ff7fc50ec In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = 341d8dff8a01677a86de518b8df9f82ef37316f6be7926f1cfed5bfe354e675a6bb6e269433fd41a735cf320db9c140dd61991db74fc30911592ab0bdcd61aa4 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 2c99ba8948b6f25430bbd5bee47d09b9c8db23664b47a5fdccf0d7eb07334963fed07d8d596253a12371523344670c57b01ca431352a1736841aa0c1c078f990 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 22d5d68e844ea3c92be236cc7a645a1dbfdfbab4b30324e01925b8a0f2ab32de2ad504d6e8fe90a5a0ab5525c9922b30f5025a7227ac484b6a94667ac2de6763 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 380f84511cda436cc951f43f3e2866516a5b4033888a2a9935b5766241aa797223a150423097b6ab4f830dbb595ad9640768559c2c63036acf31fe2d8600eb7b In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 5a8c59a3774ab1b0c27db7325ee45c659f821caa8da4a1fcb0f145827c83b27e630473d5bcff87106b4d0f9d17b5826c6ed15a07d8ca7fc8114334aa9030b8ff In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = f57e7b8a9a00a8051ddce2ee84c5f52fc78db5f66a6df5389b520a91315c8b9cc5e6af092491dbd6d4efeab7356134a03c0602dc70b7fbeeff777dbed74bc5c9 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = a90b61d18791179a62fbdcbede4933779cdf366610a9c963ebb0a65e9f39612c7fd2806c82e15f148cc6db49d716f1c811b25efbc791a03f08305d8a01e5ce07 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 5097ddf361b067e64f04cad31d1f291fcfa48fffec29cea580c35e7ce60cb7cb1743a54f95e1924e21632e2f42b2ea87f979b46e1d5f488731a7fb0b437acdbd In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 1df93508dd4e63ae1f12a9b1816dc6f68799e93450733cdc499152059836a4236425bbd816988e718c4fbd1280d4f6956fb07fce76387935fb5cdd43c84e1c77 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = ad2f0a8d29bc566abe21be38ac89c668220d58756ebd499df1acb1a2ef752618d17b1f0a8953d8721be9f3b5df62754bcd516dc9f2c7af055f1e6ebca3fdac15 In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = a6425f3c2192e1e17681327ab1276c2bb34974763d2015808b849cb65ec92d6cd9fcce56c7657488c72ee5076463fe5cf6460ef05e7349d3d4f4f525bc18778c In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 7597b9715900c996f69009f0a3d7ad036d370504213350da721a54cdaced01667d742b3d8dd0c1787af449a005336f75f855d1c3ed0a430c80a9670d4c51825a In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = 8996be65f722a5439fe070cd74a855b7d06263109d94245a44097b5463376e408750e22243aeede93248aacc078f7e9eee56efceb7c88d7d69cb13470b477585 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 3f02f63361b647fe629c76d35c656fd950aa2d065ad5e5df7dc73b896fe5692a723c7b24b0efb2ee356b8786de9c5b72aec47a0322765583a635932936a4eb95 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = d394c299b14b605334c28220e41cae3ddbc48c3c0b47790e49a95d89bd6270aa84c047592f9918c9b09d0a84978f8eaab289ca6e2c2b72e3cadb944be65e6a9d In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 91eb9d68328f1eb3356f88f676b7a5d979a7fac960e50f054d5e47f97f6b8cc7400c156a18931729b24ada19870d01a7d5c6aa173c55f4d95872f4013c8604c8 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 32723cc296f37f04aa7605775c7d87b2ef624eb4b4086498de728895871b5eefa5cbd65e7e99ba2575dfeb2956d5dcef9fb8f2e51c6385ffed83c13fc2cf9e44 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 882204d91182faf1ef31913eec0b4bdcc6d945d9f1ac8fc9258b664a2abc515b73145d555bbeccaf231cc8eb9dc1d1a9caa00e194f195e4c5cf5fd0167488b23 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 6f9468be77f86685e8da9f38f8b66ef97ce3dc577d6948f64004ce508708abaa362dfd4ad96def78ad077a6a9854a97e64184485eff5f5ed02b23a8bd4875541 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 9ece7d544363b33dba4f8411ca98013568aecc739b4329d564cd73a085c2faf9191602905e3fcf9970dbfaf3645dfeb75ddc338a9272c6f40fa29b42213c87d9 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 329a5d4b30d16a061e4ecb01bc2bf587f847021770225e4dcb0588a33056ffdbc81a707d3514b6fa40ede1785201fb4677132e9ae86b1da05112802832440efc In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 0543180b8f1ae2fb5187948c6c981260c1a8aa0691872cc1656209c9d38661d35e666226b4f75e253a183fc457d87d7a05f6edae7d13605ef5ed1ed7b9eb983c In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = d49f9d32a787d2335797af169953232574fb0ca3477df8088eaa79c5b720b81ff5e9bd2194b29d6dd7b0dd626d58ca850674e963169259cb9161dc5e50371609 In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = ce4e1d9a08ae9f9db885daea741ffc56887d1bc8ddb98d0fc0b3695822b1ef75325ddb7a52236389dfc7e4857ecd409d9052f420b211a2578a251171c9c2ade1 In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = 0689f8ac424663aa21040c523afc9d1ea5d22f99efc166fbac64a19fe15acca2d45baa7a42347f1716d3703b4c97b055292a82fcf798d3d65e334bd0d70ec92d In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 30f8de9721ef84528998adc80280918fc40baa105e8f8b8dd07fdf0a6f801f4a071c990bf9d9f2a380b0ec2de7c4139e5a6c8394890c5ceb2430f098e4bc22c5 In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = a092a14c6f5291c4711e47c32f576ed6074fbe52f7c1eed8692fc673569370b47ea4c67569421ce2bace72b5837628f4f0a1982cb784200a80659a54903ee63c In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = b8d200a7129ab8659fab9e786489e7946fa70030ddfc41aea209fdb32172cd060014cd8c069c7eec83c44184221fd519acd11e35bc38797a2fb01b616433a789 In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = b2471140773a97d9b6f7d205ac703f1f6aab45ffd1c9e7fbb16e246027476eee2e789686ffd9456e905029b00d21510e86bda845364af1f7ab04e7a714e7f121 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = 2cc78153d1d7c42eaa1e846ab73463ac2c36aff5b6e8b56b82060d46792014a0625ac81064124d6d67f70c106ea557764ab2e798e85530d88b4fa4e996c446fb In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 9ff76839321b6c006fb039c72d28592f25d83180588a3191d9321f5ac1e3f0799e9a77023b0ecaff944e0100518a12c9a99ab5f2d9132a81d0cbc7fa83f7b87c In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = fa3fe5b61e8954aa79305a926aa4a4ab88ada3a4e889b922e2415eef742dc1d2d463ee438cf9f9f5e80f0513245804177499bd8e98eae749765e5217caba9ad6 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = d206aaf6ceb8608420c8eb28adaffec428402550cf7730dd2dadbb233ca4da6c34191ebeeb1c38e07fb18dc4eca8586464671fcad2c78c71e68b72f65e711721 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = da68e6936d6a159cfd72c8e639f976b1838ded757adc2454c7f5a2ed6eb17dca07dd5bc3f91fd227d1e68bf4f90ac223debac5a1c4838f15731d58965ad05bf6 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = ee4a75df2fc3884053d0227eb2aeb9ad9fbd09755b7747b718a6d2de3d07a4e7f60afe565e8fb00693d406e0094839ba8fc04ee4cb9e9f5e1c385569ee06dd15 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 28a733099375f0e6792933ad42dd3f8f70f925f501531072469418eb846227b48a4d293b52efb92913982f1af5a5df4e003a5c65dd0b2ed9d0b16926502da70e In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = b21a3d49db6505650b123499679abe41b9812e81e18ccda59fca58c83bfa57dbc94fa7f5cb8a8f77993d43422c47efea12ccd394709a632a4f6ae31dd022eec2 In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = f6f20ccdadd50a694015ea045488a73d4965b93309aa14a6dbd24feee4255b03dc88909b277886a073317e99e404f28d8b86f65e2447b81d8c3b8f38ecbf41e0 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = aa7f13cd4751f9bbb7ee58a19ffdaebef8b64821ba610f211efe2e79adb27adb0523cb4c8acda0c81ed010280253f6db511414cb2dbfc460b1632e9821a2f8ae In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 60d5d5fa5fe6ca648d8b2908fa3ab578f6b2c230b7351a5ab675ef12b2f3a02f6b6e7de8b674196acbeeec79a19334e99750a00064156710db4524ff42ae29e3 In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 589095b8ca7edcfa527698990e121b3a1b8ae0d4d44003282e9bf4632a54919cf27dfb625885236eab08b26be320fb4a51204057b565fc8d9cbffd1d320044dd In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = f5099f5a3f18e8c27057aa1e1eea86074f4ed07ccb550819a724c9c0e4b968dcdfde232ac65062061529f4be185e14fc1544e0209beb7d06757a4d3ea63f65f4 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 9759012c49caed45d31e60db814e32b38330d2d354527079fa04a34a7c7499ee4d8358efe190ba53650ac132b63404df3afa3b557abdf64687959a7ac83bf260 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = cdb18a741a36b22d478bfe58320d114f31759b47b230ec49269352c5c4a9b7df6e75bc500b525bda50f9c971e6073b835c202b9e7888a61555b6d6073aff51b1 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 4964da1a5bd8ec90620a08109a0705f36ac854084e19f0603c56f5631012e7a468ccb4c75943c886852224f7eaf78d488b4ba1081fbc9710f76f883171f39409 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = e81b4e894a4accf2c5cfd9fa1e826d5554c7dd68073e97f2408592d697289ee7c3504960108ce44d3ae067eb4f710b6e01fea7688ea8592aabf127982414624f In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 229529601c476f05eae23c0560fa94c7a16e530137437f4167c8de6d8ee71f73d6714ca3920ed1e4f797e7c0e73a07e8f9c077e5cf22e55cc2dae7049db237c4 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 435031f471e8d76fc7da2500dce358f11e94ad6574d4cfadae8d4a84ae09d3ab81bcc5f8ebf69102e174d827ecac0e3303851a5828ea6881e3e7977121a06f2c In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 569fabe8d56b700d46cea867bdf5514c50201442b8005ed9be3b1603431a33ccd2f8a79aac4ecc6990ec4acf8c2522c8533295aa8270dc53834bb34948926944 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 60e7f4ede39a61b77187b29ed22247a9f121ac7893fa0e16bbf39354898f2eff333de43720819046fb958853da2df6d94ef6b11cf94d8d103886d1c74c3ff4c4 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = b730bb918328578ede7baaeca9a965436bddc3839d9947223420cf77bd08a1b33b4753efa591e1fbbc5061df84424f7449adfd55766fd43d1f4ad3af05e506c7 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 0c6013aa66c6e04a7bf5c122c197efbb1449fcfe0f37d251b0c994f7b06e80f4b7e4c3587d8457f227c898aa9e4986bf6ff405194bd7b8ddd9dc7ee4af2ede63 In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = e7a8f1356afd6e6c19d62794e9e33765f152ae9ff36e7f1f67ecfa100fd285837475c78b1c2a7b2e6e400bb6442be0e669e177718a474aba87b8378c683fe01d In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 4ee1a6af6cd61378b0d96c8f6b7cf6ea30fb075a30356d8ae0638eb968b78e21a5b55c74176eb33d7ba10548a1c338c0a831827b4e4fcf900010df71f1fce426 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = d533b61769ac37b2ba659fefb80b07da679fb7bb9ba7c007e02e5879ec4622fb4363a71388460e7e302c19da0632fcfa83d63fcb53a52cc77470f360a1efdb5b In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 3ab1a381e0b14b91c3590fa485ff2648e80255cabe6b3e390352b8be55df4efb50d4cc06cff8e813581266cb85b6897925c7065507a09a9c1cf666876d632c4a In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 81dd6e8869be675d380ed8ebf89a23ebd27858479c338e60647c586940d21ff5df374eee431be798e3c5cbafc5b3547e9e377b5c1b0bf2a5c6f3164160373657 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 771325a02405d96d5222beff7e88b4e5afdc8b1c067df4926c976cd9ff3253727bc4e78125c81dd162588975fa9506411283cd25cc459dddddf59de8111da3af In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = d5afc9a9095a023369a3714f20ad920c372111c69ec6350ab32207114aafd38a83ae61217d5256626127d03a21694398d96ea8f387d0f9a0a3c8f749e061dd18 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = b4f9601a5eb75123eeef7d03e41dca075c17a1770eb9b7c19ea357dad55c8edd56de2b0205362861eddf52d528b7feccfe6fedd6ccf0b0ed8fb2f9ca133e40a3 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 64fe31a2ed2f070918b20d233796cb4671dc79f3adb43fdcac52c548c9654767725f60d92d36cfb902f1d8bd49fdd0e3c2d79588ae8d93babc42ee2dae7ecab2 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = d040e47163677d093993baf5712c9bb543352a84edf3695ae739c4938cc94e223cc61f3eeca372e8eba41336be33a163bc51ff07fc0c2819757497af28036bcb In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 4fe50604c47cbac76923ca1acf9cbc1a112d74f4b1cd6f4fc257c734316ae66e9206598d60c8cc88dfc2f303f27a52d4f3c73bcf1e3980bccd6988ad3d95d2cc In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = faed5e6286e55888d55e4ffa86ca3bf7fd9bb286c8a2ba8e5b7c33f8f20edb1b801632b3bbe81a58e64763ae4b7469b4a814fbc774c23850bab931afb71a8608 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = 840a933c8a117537611b8a68291c0039a0ca592b6b184d037a7d0333046dc46ff7a7cd0a9dd5c66c949ca72dfbcde9d416df9e893a79e348bf9ee0a1d72fb9dd In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 482a3dc10a575fce17888f69c99e0de17c730ffbf56f01b7f54447bb251e9b2018f35561d3ca7c12ccf9b3731f419b22ffe412777fa45666b79a223748233891 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = a844b8b905e059254419dd0ccad361413fcbee76d6ab82c8f4d708ace62ed3138073bbe49a366b84c95f4777fefe92ab213955fa63f7c438359fa038134c612a In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 7241ee8ec880717f94a700e9e915aa474cab2a1068a7a56d7cf1cdcc0400323535151fa9c8759877cadbe39d357f9fff6950abdfeacf2d1c3d54835ed7fed953 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = 8542062229938ce461c47e348bcadc6085118e0a7800227477abf5f5981237894c2ce131799d455142db0c877cb46a35be1d2c0cb386a200c9d07b868a5bdb40 In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 9b3d69e33e0c6f51ddef4457af78657cfc07bf35d90ffdee5cec43d6c81b5c987c62019eb2cb42a24bb99cb261166258f4241c53a5f8d34468541ee7bc6bf1fb In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = 405ccfe3a43b542778e5d8cadaa73555ab3095a31123f852cdcb76561e8a45b295a47e54e05a38a93a765fcef0ff7ce198592a27da0661605213a002cecc4020 In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 91e5fcd46cece02f3405db279da87eaa6b77c926945a77a75c346cb137a3f95b753497abfddd99094764ea0a318aab2e89502a0a22d151f0b5bf2c46300be2eb In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 4747177a5b44e517fccd84e022259675e925c967447a759c2f20277bf2123b40507f51f12b7c6301eb0b22ff7bd3c4fbebc14ca47483b5038d48576d6bb647df In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = af235c0efd38e3326880503f5e0d67ca3a950f8783801b9002bf054bbd3e30db2c19d97719cdfb56517acd8c1b1fd67ca3c143b44763f1edbbefa3a150486e24 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 95c8f1c229a87040a8704c9a1903a728784dfd0a095d0a70fa04adaad80b7814a9b236f5870b301bdb720b5ac9f65e18144ec8505e673e4799e716982728e92e In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 8f5371eddc8a5ff9d9fb8a045d56d61f18002a28128dfab9cf1fae13e0ff82aff6863875d173023875b4fc2ea06b2cce0edc42e947961b6de11f4be3027fcf35 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 89d67fd2b2fb4167fe5fa19e3578c846856e95dc9da8e28c7be4ed60f08f11e636d09d3dcea514c0de3c369f1ce2ec392353a683a27b2c611eaa916d7f76f68d In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 785c212ddd4313d925b62a7348ab602e30a146363bbee39b7a0b6b790d35db6a6af2e811aebde82427d76d0742c0e764c33e823ed6070b0695413c811bc1cfa0 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 7e1546f4f0555006a087ad79088ccc29755acfca43e28ea979d68ef1f53a9aad6f2152eb68d308c95e1511d60d17b490b34bd0b467d790971e1516a1ee7bc71c In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 48f474be0fea796aface17f6d984d57aed1d5166010af7d3b6d4dec47e4a1dbdc63f136bc3c07a82d53821e78282588a688dd1e36648a3b65c91469b4de3ed6c In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = bc388ded65483faa5dd20ff2d77950829f311e35cda8664466983c2412f72278ef29ad9bbc9b2929b579ebc40f23656b849a21bfd10a70f22e7e91f6a37e4b1b In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = d59756115277a35a80f5d0d5b1a975fa0e74d6a56da90855480454252303eda30c884fc3cf39a82baab9a85c32b1fc870515498b77f178e1a439ced65abe8b3d In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 8ac3c8d5254237948d95a7093e5a69b74f13f03b836edd7892f7e0fb4b8756710efa9ca0d89a6f33326d4e5695ef248296340d911222a487c9d59472ab5dcf02 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 51af24e79da7ad92b1b2dd1229aa5fcc0c493e074805cf9cff99cece8943f19fb8b78b89cdc23794f5feb38a81abb078a984f65464dfc35b94721df7a8fa87cf In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 061491ac2501a065b29ec16fc474d5e7121bc81f1aa820dd1df7423ee04c3700e815cc8435b24ad0cb3a8d7377bfda5af8115379640d1ce7cb4b7795e9b8fb18 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = e3f5146c41d7dc3fb691df35c37923e63c0790d4f5e47b077cafa986500dfbe3942b49054417309bb3986d15e2c7048630d69f646f672deddaec33d807272e38 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 716e69c4ab2793d751351636de09066e17bb959a4a0cfe526d64b36a73aff29f1cd248016b256a8ea7859232ccf8a6ef8ad71632eedafd4f2b86317c1059e77d In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 15b7f5030f1b7221386f386e0c7c6fa51dc066270a695e1883cfe1937eb1ff17651a7c5740a29559bdefa7877276af2a427b6ecfce2cf6b86ecb5a76f691ccb2 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 5706430335324092a58f970627bfbc5547c8ec14d4c20a504b33f8dbc0b2584add8e42444f1a356a253738e00e3e2c732a7d0e5065bcfddb2973ef5b2a3eacd6 In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 1f2013ffb10abb079354a4aeca9b6284630a4d869f2c005899bc8a51e8e3c78f3e91131e0525e089782e769806d766f0ecbdba20e3e88b49138fb2c6289978de In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = dcc6ecfff93b04ae6b0d2f5699ded5b7a9bf933ff4a37f60a65964af2d55c5afe6e0e4dbf56426b4293f945325230b70ee92e50ebe09942b05578bdfcb553a35 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = 17af20d2d44775531a946de82fa2aae7d87e9b2a109039f2ed555d277210d270b80ee25eeb52157e88a88b50a68878ce084fb92d46a626dae42214acc98ff009 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = b3c85df7606362b8282d9b7a2741880e0755da229d53c902c15e2c8925ec3ca42f79e5f6bbf3e69512d4b160a785eca8da05a81caffcbcf4f85ad760cf461d76 In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = f0f00afe3ab5f31fcc11ea7d70b7c4e61d13f600eeea442d09a90ddee9d17e574d553dda158bf63c3f357f89436c0990e5fdaa054647af4de0f2981653a9d813 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = c397f4991aa13a7038bacb194f178244835c90f4654f1a41680e881c06bdc0000752c630e18903967ca03229a0f26db70dc5297c357c169f1abfc9ef90363cc4 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = dfa614e840f355830273713bf1ab44d30755a084311b228cc3a417af171fdf618f5480b7cbea7f97f04f84dd169aedb9685965ff7aeb3fbdd4fbfb5752a2e00d In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = afeab3b6af4c84fc5b8aab8e33c346c0d3d8f246b3bb7ff38b542dee084f2f6486b52665b51097b35ff62bf63f3a8c690dd23081dc8b2533089b0af79ca788b6 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = a87fa390fe8f87a6597b111af53926d2b9743b65c0b91b01ed4fa41a1ae55c109b0e9491f29063343a290f58e8f5217573ad9733c01ae70dac6334e1ad42a201 In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = eb4b329d7e77347a5594da0f5069b796da506ea44a0fc2b705244207f0e33e7d95989897089be8d157a58f21e3cd17c359cea4533735fa67e758979f0ba6f1fe In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = acecc573d277ea7b1f81212b7e9c9347c590f788f8dab30806ec8fadc9decf213bd909ebde0cd81e16e77cd8985fa73aca60ffd27e8dcbf179f94b2c6df80883 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 135f8392c8598e8edfe202eeb5f93710a322c6593f93c0ee42b4e9d0478e1c3546e9511c0f6d9e6cfaf4e575f15e120f6aff84e56a58f29bcaf0a34d8b7ac04c In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 4ffc1394beaa8989316ce1fe42e6f854aa4bee3c9011f75860a967f304b287b3c686d46b870cd09cd230db2740b5d123c8eadec00beff68a9a8f4179af8026d3 In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = 0b922c3e2805006f792d6e8df0feb70166769c8e06ee1ea40f8f5e2755146308ded4875295a6dafc2b1840fc5bd081c8125e1546946c8c473e904c6205ccaa1b In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 5db5736f8140f21478bb0a8aa8e0e6792f76a203dd2fc9ad7121786c824085da31d906137256ca1290310a2ddd5780168c5e3acec6a5a5b7455fe78012217540 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = 75ae631ce948c713c408b39b8acd88248938173fc17bf6c161ac3bcfabca2c134d61ca2e87a31468420840835c957180e60c2c3e21405638203cd2f58424f9f7 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = b9a9ef514060dedb1a47ec5d1149cf1593a0b3379fd28de8f7da13750320b870675f9ffbc2df1ff8bcee74458b01780c0683e85e164baa4c530e655845fe218a In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 2c246116303a48a5476760353e5c1c1fa3e7c0d3a20a1fd4a30e3665fdc4a8c70bf71ed1dbfe61f58b76d17cdd3aa816bd51be5017d9c7a1406598799a5c4df2 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 3d7ca411ac45d5f1e8980e4729c66a86f4d5d5570412437c896b9e226c7af57443d419d456dd97a561d81f89d53595fdb45dca968e4f0c155fbfdfa344cd500e In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 3c2bda5f81efc825b7ad7df07eed5d55b02b1a81165c95830dbc6281c4f8edade4158779e1afda7ccc0bdf0f9c09b02ed979b9291d67b92c58d8c443e981a471 In = 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195 Out = ae7676911f5f0dd933707ad7657ac3830a85a5b6f13365fc57b4b8f18e0828943b4988a8955f7677e00ae7b697235943347a7a45f4ae7a159624575e42deb0cf In = 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A114E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B292D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C2527AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18 Out = af3aeb7968ddd9d60a60851a430d7970297e32e11a9df17ad6a302b0805d1995b1d81cef0367297f61efa82093888f281265b997709ececb5f3fc6de6a54b6bf In = 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A6961652676DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC004691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B4628027A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718ECAE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651 Out = c15611edcf5bf5fef25c36edb456dab9a1bb3d958e55a90cac8261ac1934a72adf086198fcc9461e8cf386e4449b1bf664d2b916db8287da45f15244008c0823 In = 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAAE17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4FDB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D51071BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493CD136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C3074E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6CE2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7 Out = 499fdf1f42f1a5bb7b4641309038ca0533902c4bcec8f1d6282d20a471b428e05256964502b67c71cc2d816526959e26c805c30ff858eebc29ee984bf7210ea9 In = 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD80F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5AA756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746DB6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9FAED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD Out = 024b16b48409d87c7867c1beee9ac489c20699f6da86d3a1fc95743130b436998aea4e0ea9a52bd7d0574d572e6346db3c8f5b5d29c9220e720d3f692981657b In = D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C313D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D73D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B21E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D51263B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978AE90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A92498D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6ED83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A790910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC98D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBCB88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A896771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78FA3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD5649FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8 Out = 870d4fb4417e01b05dc6cac65eed06b70f8cc12ee199dd96f6b2cd860a14380b87165620b7d24b77e5a1634e2a4bda67c3927d0513633a5b1a7abf37c83a0d2d In = 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB42610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A8988B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC82670939948FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED664023616B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC628140996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE00D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA9628381055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D599B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACDB178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF214DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3BA36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017C3A66CD4EB2DDB42EF85EA0CD65534 Out = 23fc1456e95c5c0b805fb288e5f0f3d026ced63c8ede11f40f0ba5fb217822e7b3f6eefe7015941259a83819adb9a554e6512340665a4f2543118a51c080f10a In = 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA05418770F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF0445B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCFE87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E5544E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671ADEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC7283661D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615FB93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF199E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D29B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2CFBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AACDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83EDF9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED09253039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADED1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B965A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E1741553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E819C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48ABE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C640909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E53E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB46652196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D259C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7EF94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3DA8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6FE398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C213171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD46B568CE294C89 Out = 55579a82d97586845c32a2cbc776b39d93a7ec26dbc4bc7540acf2c0921df71989aca1125b4fd6d8f18de53cfe33432bfc1a5e412db46a4dff0256551299c264 In = F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E90449F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EAF977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0FA032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC0103CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F44120ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF300251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CAC2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B98320B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B0562B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1AF9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A463B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137FF9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BED133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68DA188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE897B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A7403001798992F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54CF7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA6983D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B52C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B04DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC099EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F9581DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F94E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169DC46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB000057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D00A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4BA1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441EC8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656CC30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D72DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B88DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B855845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F164678160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D6294FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D12089CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0AD12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E73EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A810FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1ABF6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215 Out = 8199a6466cca59ee6f770cc24531397acd3f827a6dea1cb8882fceaed9145a515731429476fa343b528d2a60137d4717ddb58be19afd5cf69e380e316914ffa6 In = 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB29647F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B6004DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FADDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE3903080A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBDBEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A2944384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E6222A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D3752889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33DB8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB22907F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD15C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD56495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDEFD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A8194989755D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E532A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D7785C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FABAA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C2153663B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530CAB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD8986EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFECDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BBBE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C28F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705CA27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2CECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D10CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246BD04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB09895CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E900200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A13EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398ECF3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BFEA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD43835033B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E2626AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041CB3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB5223191E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B2442B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42ABAD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B467CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB33770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F07942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C790245812113204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B09B7F42D193FB3E9C06329818251A2F7E6474462C95DED Out = 578041cb3c013b2ebaf5648b2a53882e3c93eedba0d8f37588723123c9a52ccd95fa60b47cca11132d6c2eadb22aaa45d29355260a51d25165f12bb22eb84ad7 In = 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F76316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA3760826D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E6939C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108AF1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE70057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DFCAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D009432DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083EA427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF0036D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A5952AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CFAE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF09772D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1FC070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665ED1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA289984103F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1ECDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADEB9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F621275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E816D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A31870543D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B440309989857103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D880CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD231B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB397EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3ADFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FFDF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A24924A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC2775833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA780703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF942815C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEBA3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D559D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD878C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FFE178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A65A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F9476D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFEE744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E2885EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB89B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABBF1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A864D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA725473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112FB2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA42F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE16318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884EDD768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B652467FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030CEBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF57795DABAF40687B2CDA7A5014168F Out = 9d80cc24759de69e41ae45aa3d67ade2262179a57b12d2be4ac9ee81736de3a3f5836240ebdea3910b8aaf7af0679e5ee38ff728437f78cbdd3a0f07a4200c09 In = 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D50752ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07CF488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A1076D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C405F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB0378391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB16700EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC33B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60FA01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9CE264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA14141AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C32958A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA75470C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0CFCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94FE43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE84E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D36257C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C9563844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CEFFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE954785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB78676E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FFA65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B23C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFFE6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C94650C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D02BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFDC2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91DF0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB507608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159BAA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC4245A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E13B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E14843D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F76242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B260F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C73696F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA81F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D3521720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EBA748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA15337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE723199224F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F710BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B3013839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FAF353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A350314B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA40FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF862EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB048CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389FA745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615BDE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA6069369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF1739C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B6575A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D23519730338D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34090FC9BC045271 Out = ae9b21d46be8420bd282f83cf326846f1f6fbdc11ec98b19c612c53896da4cac0a6d591282c8d7c6bc21500966468688a27b48485f4e41ca31f5711cca7176cc botan-2.4.0/src/tests/data/hash/comp4p.vec000066400000000000000000000004071322470703100203060ustar00rootroot00000000000000[Comb4P(MD4,MD5)] In = 636F6D62345F696E707574 Out = FD1A64F7BC61608FD054303AFA2E31608AA3F3788E3034821D63A0288A70B573 [Comb4P(SHA-160,RIPEMD-160)] In = 636F6D62345F696E707574 Out = 2B5F61CB57F94E7C7E6D7439FFF260028665853988224E0AD8C08C2FAA61963C8F761654AC529325 botan-2.4.0/src/tests/data/hash/crc24.vec000066400000000000000000000071741322470703100200310ustar00rootroot00000000000000[CRC24] In = Out = B704CE In = A6 Out = 47CC72 In = E5B0 Out = 5AB692 In = C52385 Out = 9B469A In = 8E69FB27 Out = 2B8005 In = 4A87C90369 Out = 452CCE In = DC10A8E4AC5D Out = 60375E In = 6B48125403AF14 Out = D8948C In = 0BDE9946163348C4 Out = 6DC026 In = 384EB1EC12064AED51 Out = 29B27C In = AF4F16B80F0AC808B595 Out = 1158E2 In = 0C571D708F3CB0A234196C Out = 24D7C1 In = 7FE77AEAD433AD02533EFEFD Out = E25DC7 In = D990831F658D306DEF60A10D5C Out = E0C845 In = 826CE458F0983CB46E68BA73D27A Out = BB86BD In = 995BFA6433F4185E76DC67F6D30C35 Out = AEC6AB In = C7688868D06251C906A919F011ED7FFE Out = B9B9EF In = AA1E9FECA8E4FE3CE31928FC262A4015B8 Out = ED74AD In = 5273E2B97EC0AB37B1F3004C1BF69E7A0C77 Out = BE8A43 In = 2F68AA285719E8F8B6C1C01227EC83F2C6ABCB Out = A852E2 In = CFD75FCCDAF1980008AD554AC7FAEE2E60317121 Out = D6F9B5 In = 29AD5BCF5F4FD710F0CD859DF62AD678F66DEFC0FF Out = 3C15F4 In = C70CE8FB338D808338FA51A0125FA9537206EB6961C9 Out = A210AE In = 141240BD7DFAF34FB8AA5ED107A899AE8CC29201B4CF32 Out = 822081 In = 10C4F0E357A90F7FAC078282A92E9E10E347D356199427B9 Out = D7C1A5 In = A982A5BEB78D751C6999B8F487F2A186CE587A0B558F3BD39D Out = 1AC0DF In = D6AA6D70B1E5DC2985D0952FCCDB6227F1AEB01CE24B8B2C2F3B Out = 6BF464 In = C95155A2CB524B40F1F7DE80D2E0718406B309FE818AF6580B88EC Out = BB641B In = 6E68D0055FA2B284183000188682F36D31B26F8D04950E381F965DBE Out = C62516 In = 260D0ECAA0E8E9F595C5AC8E1D7EEA2DA7603A96BF83251B3122C80D07 Out = 876037 In = 80E559D244C4188ED223ACF70E358CDE3110B6161F70C3289266873E7802 Out = B8184D In = 637C9217C88420128CB3CACFF911FAAA2257CB093715B882AE7B708E2EFE46 Out = E39818 In = D2272C22FDED6F8F1012F230FD29B56622D8B25864101E801EA80AD0038577D043F299B2CFF639EFF4E083808D8C9A11DA0C6BDE91B58A6E1BD6F6E17D860E4860493EC7B90D388473A85332E39DF103D0133B7B3CE83BB88DE9333D80C09837B882B231DD2D1C33676BFD77D5596B6AD4BDA0BA63150310FED783496BF0E10107889E10A95D81CDEC48C06319492BB6AD17EC9D13A29294EE578377D772377E18727C38D96952322791143F63D4B8B849808448400D2DF85E9722BD8E766A4A33F53F77F2DFD3BDF8AF16153886C9CC7B47D62CF957448E326DD9E3E01C558F1D68230EF8D0B8F8D9CC427C94EAB99CB5ADBA109ECF52604CE483D2CFCB12A11486900BEE7A78B9FDEDEE60E00DE69703C2AC0756D3A0D74A155BB6FAE5C78ACA3137FE28928AD124742449F9B874E8C10B159C4E508771B6848F9A71DC4F16F42D8EADF4B0ACDC38D83A9F1A1E73A6D46C437A82B575D287AA0339F3A3390F9DA40897F6C9EF94F4816234B9C92F9FD7D0E4D29F21D97A1465EC5341516F8E7614190D9CCA97DB96AAF91FEA4420DAE08C43289775FA96156F8DCD8CD02B34C01297A79E2CD34EB211F3464463D33B07DB91519C4C53AE9A8911E5740CB564F628344203A830356E106C45DAE9BD29CFEC398DD7DA04FE67CE1A7DBCB8B0B35373DD241690A391899940833F570972AB9F49726DEB55B95F60173E7B32E81BB67B9141826862646F96BCB8331A8458615C2614076F5FA8C860DAFF2684570384716CACBB375813E2331F809C4A7BBC3134858E69032814812D90BA2AD8CFE2C5DDF24B8C802F857CC424842A1B9340A00A6824C6CCA9374DF99A882401B466C72BC6902E467C9932061A27FA3DD75253DEE2F9FED87FC9E5963B1674628B3D227F2B476DA8CE3BCE3C845B582A51D46D975A86D0C347A0ABED6AD55E24941FED982ED0BD92A01097E02ECDE37F00442050B8F5FC22C295B4CA3EB66CB4A424E490CEAD354B263F2E0EDD0DA0D6BA6E7F0CD84C13667958F936FF18938C657B0CF0951A554C06934C132030FABA32C7B038266A91DADC4C5D65EFF7EBC76E16969D5A7BF0FAB573295CEB76C8623A79922EEA61B9C48E402AE547381D412F5C2C4590452A2651921E3BA8C5E3AE5313E1B61D83624DF2DB092834C29185DE44355B2D5E4B90AA81769040AAB8CF59F91776FFA86A7AFB78BA67BF90F71C9996296C497ACC2AAAFCF6DF4BB59D1657C97D189E4CF4C14F834E562F55D0A2D2A0B3576E896A7F6D567BB78B8956AE4924FB573D509A5BAE3C75065D76EE5ED2B5D4AF0B55F17A4406BCF38DC7302D8E68C3A34A5211F06BBB555525BA3312E4BFDA85CAD2BCD5F08C45010D5100A0AC4679B54E518DE2FDAFCA039AF8E02DD713813A91292FE6CFAFA1E92712C26525861D3C48D2A0253AFD14A952871052130C Out = 97E8E2 botan-2.4.0/src/tests/data/hash/crc32.vec000066400000000000000000000070311322470703100200200ustar00rootroot00000000000000[CRC32] In = Out = 00000000 In = AB Out = 930695ED In = 9112 Out = DA3AD8EC In = 7814EE Out = CCBFF8D0 In = B833E34A Out = 3CF5EA01 In = E82355DFC9 Out = E26E344C In = 0AE1C79DBDCA Out = 31666AED In = E03ABB0006E852 Out = 4B755129 In = 6A9F7E0C99AB3BED Out = 3E3D892D In = 901D636199E6900216 Out = A627CC4B In = B56B114E357B346E3248 Out = 83845B2C In = 9F85F4ED02899207CE7EDC Out = CF52BD20 In = 37548C6B4F99996A9E243790 Out = 90D9C1A6 In = 183C1DF8F8808870F6DA2A3FB1 Out = 079BD60D In = 6213908DA80D4FB2DF29ED8737DC Out = 994C68CD In = 8852141FB4405E0C3CC6A14EAE64D6 Out = 256409AF In = B8BD524FF91CD2699195636E7035B241 Out = AE189D30 In = F1BA35E6503D50A6DACC2B3B3038B6261C Out = 130A8886 In = E3F51AA78DFE8C2083C0721BC280EDA90F4E Out = A10398A4 In = BBEF661E8064936B079B7D398137C7DF7E9B50 Out = 67A1B46A In = 172949BC62843B24357BB0BE815A231E076011DE Out = B1FC384E In = B81EDF9309B0FEAFD9D3C33DE2AC278A39604A5F5A Out = 4F204EF1 In = 8B93D005AC5CB91F7422B1BB110070442C9B9D3DFED3 Out = F2E02E35 In = C2AAA8A9116EF67071A7B89BD930219A0D93B4D429222B Out = 9DD0E0B0 In = 7EABAB1422497A99C6B99F91F6E69DE1915A3A87DD71E637 Out = 72EC609E In = CD3FCB8FFC0DD5E163E8B6CD76A39C2804BBE91821D780576E Out = ECC18144 In = DA267A57335B8E73F77443B2C74596851407D4C5122F1B22B055 Out = A0B5C467 In = EFD26D48E020D6C8014ED651A47ECB61142BD1E10A0EA69D41ADA5 Out = 74E5B3B7 In = 3A2A70233F5A5BFAFB76A58B9131C877B6C1691F05D7B79AA7F1AB28 Out = E84AA432 In = 21D411056F80656AD1077C1F785F4C44A8BB8C87FE5DFE14469890B52B Out = CA157CA5 In = ECE01CE672A42EC6007EF3FD6298DD8554BD3D01BE8C8D9A945E150F087A1567BB17266EEDF2DE3BE79C0A14ACA1E02C247C4C5E126C941F0F123546BF6AA6B15C1639215C38F79C1E441E8AF2F812ECFC89F2F9A358AF8D65F29A63AA49F42028B232F6AF3EBCB80E2CADC007A62879A065B0253239468043504C081FD6B5FBE1184F69C4D157883BC25E9D5985C0DD0DF137D0AF6278B07CD9935F5397DD98FF1DDF2F47485CDDF642ACC901174F664D218770D1C05246FE7E51B5435626A55C41900DD97663951FDF2EFC18F3087C24FDF23603676D732B7BE9A00E55DEE023077196114D9F516BBA13C93DFF4930F045484193B2FC6D41B7C9FC1C6F362232ECB643CB5F74B637DA845D9510B881049FB651A47D1439D187020A89F485815D683509EF570023DD9D6E60DABBB244E7B94D56D2FE9E37D3ECD2CBC4EED7FD9840FFA547B44C06AF2102BEB08616C22FB45994372CCB9EF1AE5FCEBEBC7DB1F0A74EA260A50C3232A36084CAE7A95FC54A61CC7B022096DA821428D9DD21A0F108A5885AFB11D777ABCD6362FE011CDB7E2B36FC943C3548AC643357AE81917A7FB508202255727707E87B801C55943769152ECC6A8BD98D4ED4CD74D823D4176A66D3B059D711A58F7BA890E93933E81AA73527FA1B7044406C8A38F14C19936C26A09FB1F4C380210E55A55A03557D72EB7EF1D9FC7745817BDF4A328CAF340E7F6AF05182C08DA2165806263A28B0748FB5E33AEB8ADB4D4C955C998CA82998C26049CC549F77A77756A08986A2AE5C84E0C1EA8A7E9EA9E44F653A0C90FD5BF615AA8F7E5398063BCE72E1EE15A32A7A96EFCB6D5365FA7E33CEA17CF0CA310DA167C6EEA1494A4C581420AEC2489ACE5F67F92F92D8D871B96F6583C7619E156495828C9A3A08A33FCB4980522E2BCD7A9D5994C841A7E684F132BF8AEF668C1045BCED0C6C7E5B0DFC46E24190B2A28EF0C34B5C14E16D36BDC3A87089297360A47D6B6121475274128D9C9EBB10CD0220A1BE87A8A015DFACF19578075572836B4D2E54190FD709D95636BBBDFD2420F893AF11AB4B33F489EB2C884AC4EF3505072162663698361A1FD5E9980236481A23EEC510EEE798AD558ECA4067C363B5E892A489A9913DB71506241C2B743F2402DF8D75F07F551B9E2CEF1ED9667BA421E658ACB9B10FF4531C0174C34F17D96F869DE142FE6A56EE1DDCF0FB3CF47E856E3718ECEEBEAC912CD0A057C81C46F806AC8814F3F66B29B2433409129B23224FFAC15ED1F21FEA148C41DE6B6F6157251B60B4A5E3CE91961EC36618BED42759B70403EEF65388F0E5AA28F305B48E66DE1E21D0891D64EBEF281DE976FA877324DDBCB10402926EF8B6D0F7B73C55759E8B35756B393F12190E5EB0495DE818334F3459B6286D7FF6D8C1D4BD9C3086F1FDA0ECD33C4FFAFF Out = 72D73FE9 botan-2.4.0/src/tests/data/hash/gost.vec000066400000000000000000000073601322470703100200650ustar00rootroot00000000000000[GOST-R-34.11-94] In = Out = 981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0 In = 616263 Out = B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C In = 730B3A80E44DDB0AD9A04D990D22F84009A86E5E8A2E00164EB168CEB279 Out = DF252A7F37EBDCF4995B5419394A6D3D2C782D30AB5FAE89F3665F86A4BBF78F In = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F81BE8E78D765A2E63339F Out = EF35DA69225241950EBA3F20E6EE2D86A6286707EBE04819A81F79AD71DB62E2 In = C4852EB81C5EEE208BBDCAA019F49142FC132197EDAF0E02374187066A9E25 Out = CEA05A7CA858638868FB64A1BBC015296980A6096B4EB09B03F1C8B075FF25EC In = 12FC7387466C9687EF618EB38BEE08D4F67564BC48DFDE8A477EBBBC425C2C54 Out = D1E138CD1DB357091037E6041E6BBC7F58E32C4294F938868A9FF5E66E174EA0 In = A040EE298C760CD98EB6467BC03D839A31598922758D475AA389881F465A8BE79B Out = 6AE26456D06C682AB63DE2DE3D0A8A932370B12204BAC4B04F78472665A350D7 In = 3679B590CDB17A11BB39575C88F02BA1EC7FD72A454D3A30E702073A9451F7CACBAC5B985ED5AA190E017597F2A038DE1F0F08655D429544459C7ED9EE75A4B921FF517FD4FB98E2FD0D79EFADB1CDCD Out = F2D03BA660317AB8AE88490C6B25B79D74B2C307AF0DF128E82E98204C3504E1 In = B3980FFE5331EE30B407FC8EFA18FF6CE35C841C1622C405C93A51CBE8B2EC9B4AFC999E2D87CEE18FCA7089E26FF5C5CC7AE1E29CA6E766E03831C8EA1D633519FCD34683A128126B989C4D079113D30BF4B6A89A9D0E7AD63F42C05CA5F576A1C8BC2569E437D47CD3228465355770290D18C4AB263E81658141C2263738C8FFF4ED69D9243D55F85FD95D9431CDBE3EE682E90CC06A7241AC3468E36C30E2601D4B3941898F39E868967D99643BD84ABDC1567D2CC8BFD8FC27BB68579DC974E902B57291EF5AFA85D793E9126B33CF2D8A4D59520C314F33ECB78A8980FE7283B3E414A23F0E2816A211290D45F83ACF45932151C47084B0 Out = D8A200CD03364E0FB2A396FAB05E67E0EB1195672316B0F54D1D05425E2005D0 In = D658E6C4786E9CA4E60B8961514C406336F46691F29A9B2B1C07784E7EDC6C55355219ADC0B551A6C0DA07112748745D3CDAEE2E748A599091D2DF0FAE4B64E39D7D915D33E204F3BD0B05E45379418F542FBDC8B917594AE9385A9783BE7B203C0C7D6FEE8162AB8D678FE0E1D07035002DFDB94456042D8E5EC5111C4031584CAFC73A302AE6BD91759E72460EA7463BA5FF80FB03AD8A61729B7EB2CDD6FE7C9E39ACC81F6A599408CCDA167320511820D114237F9E85F13903A406D9A28277DB2F3FFA99998FA16569B7D88A08F1AADA05CD59A3524ADC55EEE32F9165A66C94E6672D7FF6CEE45F85BCE98EAD9368B261C155B30B3209FA15388B7ADEF70FC45E3C43540B27B490E49D1E913186449247994553CB4E4DE086D85B65CF6A292EA66D82B194364278D4600A05E74E972EE7DC81B32BCE93B1A6EE16765840A4FFAD26B0415DF2BA3153C4363A12CD68F9A9EAACD4B840865F2E9CD587DC7986899F36CBFC29852D7C4963B65B301E54DA0801AEC14134206FD1F5F6AD6E7C370DB3020ADC873758D09B0E2BCB2C7FA5358054F6C1881631590B270779A43E8657409033C7C88B976399C22EC541D4FAC228F083B006B40A11DC118A804F11D78FA10A566995EDCC2EAFFBF3F0CFEEB2F7DE36A7E5EAB1F6C6C2814611921DA03327F69DBCE369EA9264DE8333CC352AAA6BD28F5683861C460763579980F8CCA8EE6964D2D34F64372DE76BF91D95A3886733DEEBB9FB31C05E8859DE8025866F8FEB41623AA599678D0460AA9A0332013611ECEF0C1DAF6AA60848262ECF95BDBAD61FF47CB85B09BDBBB357BEE558F5F645E40262946C089CB52FCA84C4873E9BA632175F8D201C48D37306B8CBFBAF10E0B173741E7B10D3AADB576F62950A09C721685441849C14F7A2CCC29E7BD37E2D46F24BC1021E6CDD75DB400AE549D106B1254735C15B2C6327EE01A3C17FD007711BC974393551AE1091B8F5DA89FB8BAE42C06F9DECD2C4DBD4679C5337A4C5526D398BA28A39B21CF1A7F67AA28228E44297812F6A450A3EADA691E44A5637B78FC2591AFC0B36EDB22C6854AE9038F128B92092FF2AD0ACD061901BB8C7D2478A2C6186379773EAC4DB3E726C7763943083262FADF6DB7E576C990F336B57BD97B843CF50B7B91492F786FE6EEA929F6DB8CE1BAEAA9906163215499D6C0735254A047501BD8994B40F9223F925C267DD90828C3A1B92504DA79AEA14A11F39EB23AEEDE03781954613B840387AA7160A29A24544349591DB2F7BEFD09B28BCBED6A99F0D2A34543DEC9476663B8C70642EB5A8624B393D7AB42D4B4F55070E2CB0AD39DAE18D17CD218D335C19A3C0475968A9A4A1E71E561469A56970B3952060CFFA415C120E7E9F41DAB9E59B003E03AAE2A59100FBA56AA00EDA54A4FBB473F5F6CF07044DA74628 Out = 12DF46E869E72CB058629D3554917D7ABA7C6D9D432751F58600138DD5862BFD botan-2.4.0/src/tests/data/hash/keccak.vec000066400000000000000000017546041322470703100203450ustar00rootroot00000000000000[Keccak-1600(224)] In = Out = F71837502BA8E10837BDD8D365ADB85591895602FC552B48B7390ABD In = CC Out = A9CAB59EB40A10B246290F2D6086E32E3689FAF1D26B470C899F2802 In = 41FB Out = 615BA367AFDC35AAC397BC7EB5D58D106A734B24986D5D978FEFD62C In = 1F877C Out = 6F9D2898EFD096BAAAAAB2E97482DDB6389B8E6CAA964B7A0E347E13 In = C1ECFDFC Out = E405869DA1464A705700A3CBCE131AABEEBA9C8D2FE6576B21BCBE16 In = 21F134AC57 Out = 5573DA2B02216A860389A581F6E9FB8D805E9E02F6FA911701EEE298 In = C6F50BB74E29 Out = 163C9060163AA66B8B7C0CFAA65D934BFF219BCBC267187CABA0042F In = 119713CC83EEEF Out = CFC04C6F8463DDAB24CDF8B8652BD11DF23DD1B95F118328DD01580E In = 4A4F202484512526 Out = 7A5C2CB3F999DD00EFF7399963314CA647DD0E5AE1BDDEC611F8338D In = 1F66AB4185ED9B6375 Out = A5A75806083AA9307074EF8FBD7DF592985E5F714611E812216C0449 In = EED7422227613B6F53C9 Out = AC78FC53A1DB90A634F1AAAF90119C889C8C24B59B98B7366029CC73 In = EAEED5CDFFD89DECE455F1 Out = 672CA6826686BEDB258532830D606B258C6DE60154EC0957CD8B858B In = 5BE43C90F22902E4FE8ED2D3 Out = D98CA07E172B0BC53D679D2F8D002C63FD24A6307F2B7E1EEEF28BE0 In = A746273228122F381C3B46E4F1 Out = F122BE39C91A6C17CD5900F531E680D54CEDEFD4F0E3D113D26543D4 In = 3C5871CD619C69A63B540EB5A625 Out = 2A26D2AD2015C67CABB7895EC5FA25473D4D1433FAE92B9B2CDA31F0 In = FA22874BCC068879E8EF11A69F0722 Out = A69E4EC1648CBBD595558EE4EA345E4196C2881E85E853739B1F4604 In = 52A608AB21CCDD8A4457A57EDE782176 Out = 5679CD509C5120AF54795CF477149641CF27B2EBB6A5F90340704E57 In = 82E192E4043DDCD12ECF52969D0F807EED Out = 455584A1A3BBFBB977AE08DDEE93DA5ACAE0F2F4C3CDAAF089728AAE In = 75683DCB556140C522543BB6E9098B21A21E Out = BB779E7267CAF0E891547EE3E3BABF17837671CF731ED56334F61CC3 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = E7B181DAEC132D3B6C9DFBF61841135B87FB995BE20957B8CD095E2B In = E26193989D06568FE688E75540AEA06747D9F851 Out = 44729646A05AD0503A876B448F88F177A0A263AB746CA6E30676ADB2 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 05E15793E417DD4E02CD6C5636D42C1638C164D70B79F717F25D1A15 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 2C4077A8858966EF79AAC3EC6D82855EAD22867BA45D617A68CB926E In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 2E897B479FBCBF42D2139F6768DF147A3B85C36A5B3F3C066EB0565E In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = BA76FFEFD006B81EF5991E697D0425621B16818EA27C11056E00904E In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 1C1E758D87399A36BF7C8A2E6A55CE6A4F0C498737956959959FD2AC In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = DDEA76409C61F6D1873F01A34251C74C37B34F28F7F482A84395B5F3 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 777C523CF42D0006ED1F88F1BD0C3A5EF21814723794B8461A375C3A In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 8D7474ED6DEA4626AD3C1D06D2AD5B198CAAD07B12077C680CF6D89B In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = F525D4515D3CA54A2FAB9C679E93561FE151EA0960751352CD7F591A In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = 9A8455F41F693B91B3DE46BF66FF09D42DC300B856B1DC2DFD12555C In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 81AF3A7A5BD4C1F948D6AF4B96F93C3B0CF9C0E7A6DA6FCD71EEC7F6 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = A27A051A36A1501974AD8E9873E9DF231AA9AD90EC1D7A8BBF8F639A In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = F217812E362EC64D4DC5EACFABC165184BFA456E5C32C2C7900253D0 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 5CA92B5F5830E1E5F8DF4391339DF7DF1F23BB31AA05437C103F1652 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 9F01F07D930F40A26407760104EFD10D4436295F6B8C41FE2A4E09EA In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 22A3FED1F4E298C37A1D7BA0C80E994B11D95F290F3945A3CEB2E2E6 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = 35F1AB1263211F738D3F97D0E4840C387E09369F23BF9239150D0306 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 34CC708B874D40478E82324BF3AA32FE9F85AFF8C60B4BADF97003E3 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 5F339B2F87E7F695B236267C819BA1705D97644AD72E0871C7E3A913 In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 8E20D5C83CDA8226B58CEFD74C293CA7579CBB3949CA9EB2F61565B8 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = 606255348812CFB5082F4D4BB6BBC2FEEF044E381FEB0E346061AA4F In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = C885274CC3BF110995FEF1154A86772F28B41E745E86E935B4E3A03F In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = EFA7F7E7BFFA6A5E7F7D1C24E7A0A9DC9A6F72B3E9550A0AAA06CCE6 In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = ACA7DCCC6B809D511F4C248CAA5D1374E734C1ED6B995760CC3C56D2 In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 6F1EF55CCC6EF9B68DE54C14448487901022452AB761F84644E9A127 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = B297F61FF06021BFE1B9D350B3F54D810BC16ADE17001BAE1B4CD4A2 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = BE9A75436C3988FB2FE21D0C10EAD9B9C807DE2E13A9BD8437F13332 In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 4304582C3892942B1960822C965788B22DE19F1C6D5E204476ADFD26 In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = 0480EF8519C32F89C65B8DD450025EC49CBDADA6C4CFCFC6FB4F1C61 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 0BDE9CD50D70F00EED97CCE40C3DF22BB4904C08C4177C3A95985D97 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 3BF3ADDB761AB32A38B7B47047AD45B68EDFD88ED475227447EA1B1E In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 6182614C8257EB05E9AC0950E15E6044872E5C0AB2AF4540764CA0C8 In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 0B5DC722EEA2C348325FD9B3D7F08F365B71D5B582C27BEB79B51D5D In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 29C2B817C75B6417BC89C262AF9D58F0C18FBD991F59F4181F237038 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 62C5876694D88007709B50900EE2E6CA9505CC90067EFBF4C1D95B0B In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = D362BE7896B2AC3CA4DC3161B7F6C5B3FBE65F32D040402B8D306B15 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = D420C7BDF8D86D7B1CBD1AF7868EBC4FF17245595B94959A0714333C In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 2E04DAE6E3FDF2A47FF40E6F3E61B371F3E51A5864A31CC11D127620 In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 22817A21CFCEC4FD2348B6BE8A7042A37754D76A3F33A8F818312CC7 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 68CAF2203317A8BED30C1792E888910124F2F0EE1D24D47274BCC856 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 7BBAC0C0F192D2C479348358D2247E4C08966A512F73D40445B52EC7 In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = D226D9E1F36EC4222693699B6D0383C1452E391C41EFD7645289F8E3 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 294A1E5A0629A2736F188691A35FE1ABB55472785DAFF6CD88C6D537 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = C533DCF88CD1A5DFF22B914D3875BD57FC17B2E1F474AE360C3877D2 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = C9B7AD7A32B70DFB5A8A2FF9D98B300E484B996ED752A732D84DB6F7 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = CF646D5E5C81818C97A01F393F8033CE3CB7CCD07FDAC9988766BD1C In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = D411E8A7CF50AAF91076A8CC5F01BF5B6BB2CCAE8046BF47871891FD In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = E094C0303D1841C6E4C0864857CF36CFC980E3CB4D78F18E301117C4 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 51948E1772C2C2EE49158D02A975B27477BD041262954C3E60F5ACC2 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = 8214A2B0E8BB60CD3E4DFB0D0855D0F6C4BA6D2728D0687BDF75F79E In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 8A2AE6B9AA7B1E08F8C7DC3BF5AE876660D30F79391714A175381091 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = 702B1906A63D0F924AFEC3BB5E5C5742E85F9834EA6F5306644811A1 In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = BF2101511220B7DFE54B127C2476EAADFD4EAB7FD0F6BDD193078AC8 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = B07ADBED912723A07FA5353F665EC14FF82D85E90BE3E5A1F5C90FFF In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = D1718F0D387AC427111A7E90E575DE5F04778EA2BA147A8451914FF0 In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = FAF7D793024E6D05E77C5231712478822C915292FCC1427E6ACFD3CF In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = A375D756A8F39C72F67CA489C95F99350FFD0515B151A3BFF288CAAA In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 1BD1B6F3144A3DEE93DEA1DF03C0E958F485B8AE164DCEE55F973413 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = BE88B495D0CD90281AF2094B8D7E72EB417288CA16F751C09694B682 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 7DAC046254808464024617D63A038267FE2CA65052BDEB569A0A9C15 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 89F6B320EFABE42CE13C9E20E4829F31A7848EEE3FC854E603FBD46F In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = A805DBD3B8DF5E03E05EFFFDE1B94B35A23C5D77C2797D984E56656F In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = F05742CC1DB422A3113AC49602E8D0DD6CB472E7ED26BCE40BBA09BD In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 45945F867B7E1E75EE496E0FC4AAFF71A0CC539841D153439AED4DFC In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 5A8AC7533E1354068B564CCD214EB2A2E097DD60E08BD69FC782B0AF In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = 059F7EB983362FD44E94E2BFD59CCED43CAE959C9A483EBD5E6E2036 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 22D62AD272FEFC89F73256EAACE00C7B8E998FB322C8EB67DC1EAC6A In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = A396EA905EB612554BD00E4FC1BB4C5247D73FDE4BBAF5380ED42DD0 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = D8B5B24B9E92326FDE5DB1058EEDBEEDB0B65982925734B6E2844036 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = FDB9015B20DB446F79575E6B8C73A98EAC731CFE2E59BD46DBDA0E35 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = DF1B47E73E8CBD2CA852CF58AD68B5F8BAA1169C0795961041E8A918 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 1E8A90918D6EAD31E446D4EE2673871ECC5C7DA9B18ED511E1632E0D In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 1060AFD1E1B9F7F41291A4861774B3B0C95A812788A41D7EBEF4A893 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = EA91EDC393491B4CBC035B8538DF08E3C6B8CAD18338053C81FE2E08 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = DF1AF149E5C92CB29174C1EDB6ED891EBCE4366010DC7CBFC9B1D757 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 5F698408BFF0246B05BAD96CB342B2FD2F11B6804EF2FA07A81B0920 In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = EBE6D61E8A946E0D45D3889F9E360ACD3A1A7D6C4B1307448E6E7357 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 1B7F6BCB2271AC9C3B558E95F85285EE756B03B767A01AC57D7C6E94 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 436D1BCD6B3DE2677A72B93E2CEDB60C84A4FE125A802E2997EB2E67 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 62B10F1B6236EBC2DA72957742A8D4E48E213B5F8934604BFD4D2C3A In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 1186BEA0880D0A96F6A56BBB431F4D264838BB0180DCF66EF0B599CA In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = 383D2F41ECFDA5994E815432999D192E1A282FF5663196A4A268A67D In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = E2594A633B2DC671FD0DDFD3BF7238332C425520827C524FB0E19778 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 234764AAE8C39B1571D7741BB176FF86246070EC9AC97A1B2EB35472 In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = A634D7EBAA2BC0043EB5E237690E38FF1E05EE5A042882A233A2D92A In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = EF03FBB1EF3296EECFB98909E416D113B5741E44962EC57993C6DA5D In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 210D245CC8B5A7B4C1B118A9890ECDDC34A66EA92805B7A7C19A944A In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 517BAE010715A020435CFDB531B856C5704E0EC611360F60D5B76161 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = 79D478B4BC5E6FC2D406BB1C3834A5CE397A88E80135F55D8FE32C5E In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = F7BA7A56AFC1C58E62841C3B98F5677199F24B534B0D52D9A5C95495 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 78A90B769E9A326C93D5A6A6105AEE031DCEB2C8D222B36E02F27DB6 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 3D9D5C2FD2F60F4BB89E11FD3BC2FBD65602EB3F3F38D6FA03BDCE2C In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = E1FABE16152560387FADAD3324CBB94D8AF968786C3C994C8F926D32 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = CEF84F1966215B1511F5E0DB564D6827898184FBCB88BE0213FC563F In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 8E4B5A2B79FC1E7D0526AACB5B9AC01A569635644C9249DFFEE3B927 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = BAFF55CDAD66AA77AD677E13A138B2F17286B504EA6B94EFFD9D9A95 In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = B4EFBE1167755F5A75B72CF15E0601662D036A16CAC8602A909FB328 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = FA4BB608F8F60841E1189F8770051695CDC9935BDA7187C36419228A In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = B3A877231519C24E2EFA424E6057128EA105B54C65E58074B5B1583C In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = 9F385C0B645DB8DB8B73C98C40BE264FFEE6151C7B5A0964E67DAA9F In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = BD6C865993082EC7B3808C13FD140FE0C0667B3EE51B9F8F1F4DFFD8 In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 8CA844ACFCAABD3B969F86C2F1ECDF1620574EC8C24426BE2DCC1BB5 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = E8D549FF8D53745A4C5C75BDAD92314025DA877A77CE49EA134840FA In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = E6BD80787F8704FFF73112E8B368ADFBA3A1109162C769491349DCEF In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = BD7D9E6CF9D2C1030F892533E01B72B5288E174B0864D81D71F8C6E6 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = A5312E8C7F0A3594A8ECD1ABC5CBC14B2585F0B1FE32A4E1FA0A2E25 In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 2E0D739386AAAF37980EE421AA8C19B19AF52E70F59DC0A6988471F5 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = AF3E0CC6E64501F10FD39722E852355FD6D80D32190631E2F06C22AD In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = F009E05D1AFE2D33D2C5F4008B46F31468A7BF5299D4F0AB0EFE4FD3 In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 76281BD1613843A3ADBCBC78D1923AFB5B8AA2DCBC48934DEEC84AAA In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = DA7C79E04FCA2B69AAA58199CA69105B6B18FE67E29F380501AA7FA8 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 70ECB261757371A282903C696715DC03F106A339F076203BAB436E94 In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = 740D3CB455133173EC652AA04709EF0F549F19A9D4CC6BEC9E876B5A In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 663835A81A2A38D5AD3A37BD9BC96618D27CA32286E9091834A0871A In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 2594153AC2DE681F4DEE340FA344EC388773A377D5B89E503254FD2E In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = 42275C296937745758FF2B7BEE9A897191AE87E42BD10198D9466C19 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 143F9055EB1F736729C77721FB65ED5EE142F6E969132FB22989C11F In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = 449A0313CCAB4427032B6BE9D66F827FFB4C71B538B2104F9D14D14A In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 21E2760644A19ED18ED0CD74C4E4C071D770132AD215EB6F7D42B01D In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = D5534C72BE2E4B1FAAA813118B0D29DBB86F624067EA34515AFA08BE In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = C0CD413B1CE000A1BBE3A2CD103C7F8F95925AC6C8A5C922AFB5F96D In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = 93C6BF585E994B1669184AC71DC8E772B53443E668DA0786D528090B In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = BFE15BB51F680F2F489F0FDEB32F271090A09D1563F29FEAF92104E0 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 6D735FB7579135F61B771B2BB0D81514CDE9C977ACCF6FEAF6EDEBF0 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 6D93153145904CEBE0E8A66C272BEDF4F0D0A3C53AB30264135431A7 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = AFE30535675A7021BF618941D94DDFFCCEFCAA1EF06CDE306D5D7A75 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = 916501614891BD99400A8AEAABF69326FA98B833AED82386AB19E507 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 9C3759905E47E49CC7057C9237545D444F758535F991F7E8728F3A51 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 733ACDF9CED47F2E43936ED6C2AC0F824F4F5B5D2942522D4DE5F6FC In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 530438B7A86B16434C82713EF7392D25C5CF814C7C6408368C4F2EAF In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 84944EB018F8A124E3C969C037464EE32BACF8E58901D2E22291DF9A In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 1311DA757C405F2A0EAB110B0C515F05FCD59F5495A9704252DA5AB8 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = B5FDAEAD7E68333CEDB5D4AD636AE7059EB31305E2C831787FD51265 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 2919FD6C376AEC9F502893A9970B9AC6591855227C0E137BE01705AC In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 8910E7ABC3DAA506974EC13E35C43133EBFA91DEEC99BFAD4954447E In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = F8B4A4A6FBB8C8432712B5B815B36685C86656C3F67D05BDBB44B49A In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 926FE0044B12422D3E4BFA52C59252ACC91DBF09C488AE9D31C7EB63 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = A4E4B4A573F7B8865D77D7E57F7D840A55261A96E5FEDD763D0811F4 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = EBFD796B29F6059931732F98602185B6377C4E6E40BD26C810D6DA96 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 3FB7392A6621B852312A374C14A679AFB0E3D2EC6A2D147BD5E873F6 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 8B3750655AF5ECA10CC4F291043590E2D19759253047A4C1DBC86577 In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = D3A5004477BBB21CF7D0FCA84E51A7A57E93FAE7222570C01B00E89A In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 75B77C36E394711DFD35C11AEC8C033DCD7C18712F3B06D1FEDC1077 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = E52DF7FDF957269CA0B0F46553D554FE2E6367019B379A1E4F4C7A9F In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 41853CD54692DBD478BB1E2D6CEDCDA1D139C838AC956A37C87F098F In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 1F2727D5132C453BD321A9FC7AA46FB8B3341D90988C41DE8439D2F1 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 5E745F8966D91EEE013B061281BC20C79B0323000A15BBDE7E0D25AE In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = CD2EEB7D48D0260986BADF16F15AA09B5229B7830C73EE95B8CBF85A In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 3322FA727A0089F500A6A99D67419A76C7AF77EF2893E8D385B42720 In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = 234C1BC03FD4C3D38DD4C736B59A9107911210D54E98B3A372F57236 In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = BF229F4017E1674D4CB87B70D3D777C7114F085D77216437B860D641 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = F95DE3F40E5FAF58D3320B5B24ACEC7DE6B4B7E54C2F80F6D314AB5A In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 04B3BBBDDFEBA441005A48CEBDBB1C6B6A674C2D9B224DA29844374D In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 6C1809CD88A0EDB211986359498E0AC37E25E8EB62946938C37D3C26 In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = D2744A1BBB34718FCBB614C21E1FCCD0FF88615CB82AA03803AB9460 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = F6115F635D98B572FD1BA85763ECCF8BF273FBF7B96F0DB0120CA8AD In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 5EE73A4F13A08A2D9B1E52DF88972FFB9F03B843A387EE52B00EDCEE In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = 44BC64559BDB910B7079E0261FF8B49DBA141B32ECBCB70B3ABDFBF9 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = DE82ADDE823C312F83B3D4C0BD35AA0395AB747ABBC22A70973E2A6C In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = B1BA910C9F5E126607FF2531AFFECBA791261E354E2C1A81FDA7A756 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = 3EF8D4A6BB8E172374E806E8D65D5F81B3FDB36299DE1C0CCC26DC65 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 1C89D6460B3F13584BF8319EE538F24C850CA771A51ECC547652BAE3 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 99981766CFE3B1888F2A008EFA1088016CB29993567F9BB74B5C4D3C In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 0215E91EF992DCC7E82D16A2C9B27921C1310C182F59DF8BED5151E8 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = E52EA6714A3978810DC19E999C32516D4ACF0CBCD67E917A4FEB56D0 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 4C3D6321133EF74810E60D3190FFF3CF20C8521CAEA6FF782D7E3BAB In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = B9F006DBF853C023DEBE2F40035A7E83C49CDE656EC86A4621950F3E In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 0A5AA6BC564B8CB2F5FD7255455C0E7A5DACE0050C3BBD259FDE2AB9 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 8CA4E085F04956B5B16520E3A767F8BA937364FE5F4460288AD4F231 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = C0AA34391CB3104C41995F3DE782F012D421585E5384E047A997062F In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 33C10010A0B810386AE62F3F927DEAFC0D5AF0AF3DC7A8355CB779CD In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 842A2E13D2728CA55B42D784BB6BC4B889E56775AD56BF75789CC57A In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = A576281CFAA89DCEFB1D37772400BA4CABCEEF33CBA2F833336A74F2 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = B1579476972D42FA388FEEB8424834672C4D1A4225EE2DB89DEA7359 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = A32EC69648B4FD9BA2431ED0FEF036188C19788D7DDF0D25B6B03ECD In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 2B8CF4C8D9E6717EBCE4F0584ADA59A8ACDFAB98AD7E33F355B77095 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = E583849474F3C759B7A3093C7ABADD61425073AEA2678E278215708D In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 10795D3ABCC077F4A1F5B5653C478F9DB42110EA9F34925470B3CD11 In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = 31A843B4A9F332F3B6B099843540AA70651B26B80E0BD75B77F3AA9B In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 1029CA117957D80F3C859E8394DD34969331CA3BCEDC436B1EAB0849 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 6096E9914C1AC93A6809DE7AD91119C637B00BBD64DCC3E1FAC1E1ED In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = F583F07DF2327887C6F10A9B1D509A744F3C294A4227976E3C3722E8 In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = A9F43B9621FC5902DF2458FD53D0CDE90AAE7000855C67D853C7937A In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = E9675FAAC37C93AA61FF9730679A3D1209ADBAD4652582DFF5B1BAAF In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = CDB500740812A0D70C68D0097DCC7ACA86EC066C89D36642879A74A5 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 66F205D7147991A940AFFB7401B692275338519A97608C584362FFEE In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 909FB29277AB2C4CE4279C485D4FBA7E18FF1A88C66DAF7ACF630310 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = ED535EC075C983A08F7D7AD5714EBC846F25E8661492B2B31978EDF2 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 87F15CC2AEC24168D8BBAF188825F3BB0178CFB5C5899F2FD042CE89 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 31BB872545217FDBF11077E86B1EE451475C31DC5E0E636EFBE50825 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = 26D69F0AE8E4DC61C6354FF570FDD913CAF21C18697F0371F2D323AF In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 175393534D90B614B158105C95E18A1052A56D0E775EA1CF51AD5853 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 3DECD71DA22639985CF242F2FAE7172459042C826495C8D8D95C3719 In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 2D0A56864BBEC6449FBF7B2EAE53DA46647183B56FA4EDB1602E5163 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = A0FF9E11FBB451943A17E3AC510DE0B582BB072B16DC4E03F9E4019F In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 4FEFBE74645949A1291C6F6F05EAF4B780EA01EC5EA5105ECDCB984A In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = 7CC9EEBBE0DF46A398233FA31286F8A530292B53E48BA54B6AE40472 In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 03D718DA677C4018E52288BB30E4E6E732A16144931176F0A8C73970 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = A9ABB430FC1B3D8C6CDEB5319878E7B12B118E2E03F40562A376418C In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 4A7A58B337872189A06B53B6BCC50C29EF9D0BBC491832907AF14EC8 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 808E01CD273919BA1BFF011E0E7094EC6D5C4962912B08F11965AB58 In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = DCBCC30B6909FDF00650F1A10CFBBD419408F9D37F378C5CA693B803 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = BE077F12762EF51859B6C520B19231E30442AC268CE4FD47366FF9F1 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 25C425265AB07D0A8EC659D4D5EE618BDE87003B7255FF4B5315F1C7 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 046CF62C41CE9B0F54B667558063023F59887BADA9CC288414ADEE7F In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 37E3844080986179FDA99E9B8C54E294643060795B66E810E3E25D9E In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 3B503D615E54132B42CAC1A0450A0D7E2EDC63ED87BF109C509C7987 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = CB40837DAF4A882538464DEC0A999DA482B4AAE08708EA6D5D7FF461 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = EAE911E66661DCD3472B458A48B74730468923C7ABCAC7F311F02463 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 307D5A8BA5865A4D281ACB2F3C5EF16E3B11BCD8C0F82D22D47C2CC8 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 58666B325D81CBE6A4BBAD91720E2BA93C70EA114E7F77323C5BE486 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = BC296FFD39381CF1C96228A9F380F41C871B8788C654ED9B384C17FE In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 0CCEAE713E5E39BCEFE7A2273004816FE005D5EDFB2A965CC9AC9948 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 7997FDF30837D8B25E85FC01316E31B61EE814490DA002A04816D7CA In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 9897B479871AC73DABBE6221E27BFA67278F2BB044E3D0726FCB2B81 In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = EAD2620FBC4BDFB14AEC8C7B9AA882BA3EB2AACC9A15D7D36DBA086D In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 545E59812C7AEA1BD1CD48880D6650117DFD9E58A791DAC1072B19DA In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = 7C2FA00961BCF020B95A0ED7193EA3583340BBD37898EF6A464C1940 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = 232DB22EB2C19109AFEFB71918EA2DAA7C0D76652E1884EA7A8AE646 In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = DB85AF5CFCE746240E6D44E73CEF66A72CE5968284D35FFEF7FBFF6C In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = A1EB42FB0792361F0D6809A2E8DC062F09F2855B39BC2C4B7F54311E In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 1AF4A3AB9A07CF064C254D122CC7DE15E0F0D3CA3DFA50EA1C43A78D In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = C14D43525E18892C79142D887D2AD3992848B72CCC087F64F0F1D621 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 116C0462D50D57F948015EC74BE9015707313712B45883C02FE84E1E In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 96F7111176641F6373701BA594090079146D4220F30B5120C12498BA In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 9EDDAB2C9C60B122503C1C30EC6E74050EE13C7E103A05F9ED41D992 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 54CC87B9655180C0E1C6672350AE1952DDF51EE5D7E215569652AA2E In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 4629C97F9BA98698E0DDECA5E0A3B6DE210EA9E84BF942C2CCF4EC68 In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = F45034AA94C1A2686EB849EF4262F2F5BA9ACDD0E8EA32401E060B43 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 62153F592C49D3C0485F80073319049A510C730327940CD9D52F3698 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = ECDE4D6EB0CF28010B45D0D310E7D05F08B80AFC44B8A359BE7E1923 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 3BFC5018CF15CB88007929924B3E014635EF135C91F9671B29BE8731 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 22715559AD15717722B1FA0583996090C79C3DF16CC1E6E0F6D3E898 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 2F36FF8AB7264F7A5766DE025018E19B5A64D90994B743B8FBFBDCCA In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 5AF56987EA9CF11FCD0EAC5EBC14B037365E9B1123E31CB2DFC7929A In = 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195 Out = E90F81AE86D72DCC2190AF545A345150A629EE7DC7237C1958CFCDBC In = 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A114E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B292D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C2527AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18 Out = C1C80B60ECBE67B7A49940DF5E3EE7F31C1304844D9A333A172983FF In = 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A6961652676DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC004691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B4628027A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718ECAE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651 Out = 230620D710CF3AB835059E1AA170735DB17CAE74B345765FF02E8D89 In = 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAAE17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4FDB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D51071BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493CD136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C3074E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6CE2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7 Out = 34A58DDFC5C2222281FA73EB34BFB5E152272CC3AC7FE97AC58C08B0 In = 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD80F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5AA756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746DB6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9FAED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD Out = 0790649A6F6ECC4DCACAFAFB6AEFBF6C6F7EC883C72671DB211CD163 In = D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C313D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D73D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B21E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D51263B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978AE90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A92498D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6ED83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A790910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC98D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBCB88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A896771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78FA3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD5649FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8 Out = 97495BFEDAF1CAB18E85190B374729F5543FA3F1CD88438156F01A0C In = 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB42610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A8988B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC82670939948FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED664023616B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC628140996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE00D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA9628381055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D599B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACDB178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF214DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3BA36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017C3A66CD4EB2DDB42EF85EA0CD65534 Out = 6297DABDC66A68A28E2F32FC95E5864035001CCB7A0DCF592467D415 In = 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA05418770F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF0445B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCFE87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E5544E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671ADEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC7283661D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615FB93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF199E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D29B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2CFBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AACDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83EDF9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED09253039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADED1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B965A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E1741553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E819C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48ABE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C640909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E53E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB46652196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D259C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7EF94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3DA8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6FE398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C213171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD46B568CE294C89 Out = 2C700B4059916AF3F47D9017F5725F42B0D51895331F090048C276A0 In = F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E90449F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EAF977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0FA032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC0103CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F44120ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF300251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CAC2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B98320B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B0562B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1AF9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A463B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137FF9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BED133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68DA188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE897B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A7403001798992F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54CF7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA6983D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B52C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B04DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC099EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F9581DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F94E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169DC46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB000057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D00A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4BA1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441EC8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656CC30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D72DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B88DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B855845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F164678160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D6294FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D12089CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0AD12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E73EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A810FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1ABF6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215 Out = B4978F5DE02905355D9D40FA09E6F8A297CA546AC8382CF10152B2B3 In = 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB29647F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B6004DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FADDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE3903080A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBDBEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A2944384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E6222A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D3752889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33DB8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB22907F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD15C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD56495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDEFD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A8194989755D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E532A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D7785C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FABAA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C2153663B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530CAB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD8986EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFECDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BBBE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C28F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705CA27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2CECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D10CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246BD04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB09895CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E900200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A13EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398ECF3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BFEA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD43835033B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E2626AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041CB3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB5223191E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B2442B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42ABAD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B467CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB33770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F07942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C790245812113204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B09B7F42D193FB3E9C06329818251A2F7E6474462C95DED Out = C1756C010C173E999B6CF11E3B6BF4400C8C866A18C2673A4705DF79 In = 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F76316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA3760826D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E6939C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108AF1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE70057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DFCAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D009432DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083EA427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF0036D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A5952AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CFAE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF09772D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1FC070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665ED1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA289984103F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1ECDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADEB9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F621275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E816D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A31870543D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B440309989857103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D880CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD231B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB397EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3ADFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FFDF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A24924A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC2775833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA780703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF942815C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEBA3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D559D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD878C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FFE178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A65A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F9476D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFEE744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E2885EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB89B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABBF1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A864D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA725473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112FB2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA42F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE16318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884EDD768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B652467FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030CEBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF57795DABAF40687B2CDA7A5014168F Out = 98E40C176C8C8EC46AB940688D47978B8D1CACEFF37C700FDD06CBB5 In = 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D50752ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07CF488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A1076D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C405F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB0378391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB16700EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC33B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60FA01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9CE264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA14141AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C32958A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA75470C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0CFCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94FE43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE84E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D36257C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C9563844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CEFFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE954785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB78676E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FFA65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B23C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFFE6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C94650C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D02BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFDC2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91DF0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB507608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159BAA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC4245A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E13B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E14843D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F76242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B260F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C73696F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA81F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D3521720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EBA748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA15337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE723199224F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F710BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B3013839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FAF353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A350314B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA40FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF862EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB048CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389FA745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615BDE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA6069369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF1739C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B6575A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D23519730338D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34090FC9BC045271 Out = 82698AD78DFC9E39665C9DFD54C7BC44DB0EBBA2E741E80D5292669B [Keccak-1600(256)] In = Out = C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470 In = CC Out = EEAD6DBFC7340A56CAEDC044696A168870549A6A7F6F56961E84A54BD9970B8A In = 41FB Out = A8EACEDA4D47B3281A795AD9E1EA2122B407BAF9AABCB9E18B5717B7873537D2 In = 1F877C Out = 627D7BC1491B2AB127282827B8DE2D276B13D7D70FB4C5957FDF20655BC7AC30 In = C1ECFDFC Out = B149E766D7612EAF7D55F74E1A4FDD63709A8115B14F61FCD22AA4ABC8B8E122 In = 21F134AC57 Out = 67F05544DBE97D5D6417C1B1EA9BC0E3A99A541381D1CD9B08A9765687EB5BB4 In = C6F50BB74E29 Out = 923062C4E6F057597220D182DBB10E81CD25F60B54005B2A75DD33D6DAC518D0 In = 119713CC83EEEF Out = FEB8405DCD315D48C6CBF7A3504996DE8E25CC22566EFEC67433712EDA99894F In = 4A4F202484512526 Out = E620D8F2982B24FEDAAA3BAA9B46C3F9CE204EE356666553ECB35E15C3FF9BF9 In = 1F66AB4185ED9B6375 Out = 9E03F7C9A3D055ECA1D786ED6FB624D93F1CF0AC27F9C2B6C05E509FAC9E7FCA In = EED7422227613B6F53C9 Out = CAAD8E1ED546630748A12F5351B518A9A431CDA6BA56CBFC3CCBDD8AAE5092F7 In = EAEED5CDFFD89DECE455F1 Out = D61708BDB3211A9AAB28D4DF01DFA4B29ED40285844D841042257E97488617B0 In = 5BE43C90F22902E4FE8ED2D3 Out = 0F53BE55990780B3FAD9870F04F7D8153C3AE605C057C85ABB5D71765043AAA8 In = A746273228122F381C3B46E4F1 Out = 32215AE88204A782B62D1810D945DE49948DE458600F5E1E3896CECA2ED3292B In = 3C5871CD619C69A63B540EB5A625 Out = 9510DA68E58EBB8D2AB9DE8485BB408E358299A9C011AE8544B0D0FAF9D4A4EA In = FA22874BCC068879E8EF11A69F0722 Out = F20B3BCF743AA6FA084038520791C364CB6D3D1DD75841F8D7021CD98322BD8F In = 52A608AB21CCDD8A4457A57EDE782176 Out = 0E32DEFA2071F0B5AC0E6A108B842ED0F1D3249712F58EE0DDF956FE332A5F95 In = 82E192E4043DDCD12ECF52969D0F807EED Out = 9204550677B9AA770E6E93E319B9958540D54FF4DCCB063C8561302CD8AFF676 In = 75683DCB556140C522543BB6E9098B21A21E Out = A6D5444CB7AA61F5106CDEDB39D5E1DD7D608F102798D7E818AC87289123A1DB In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 5796B993D0BD1257CF26782B4E58FAFB22B0986D88684AB5A2E6CEC6706275F9 In = E26193989D06568FE688E75540AEA06747D9F851 Out = CFBE73C6585BE6204DD473ABE356B539477174C4B770BFC91E9FDBCBC57086E6 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 31C8006B0EC35E690674297CB27476DB6066B5FA9825C60728E9E0BB338FB7C3 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 3B8FA3904FE1B837565A50D0FBF03E487D6D72FC3CEA41ADCCE33DF1B835D247 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 37FEBC4DF9D50DAEABD0CAA6578812A687E55F1AC0B109D2512810D00548C85B In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = 2329810B5A4735BCD49C10E6456C0B1DED5EAC258AF47CBB797CA162AB6D1BA8 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 6FFFA070B865BE3EE766DC2DB49B6AA55C369F7DE3703ADA2612D754145C01E6 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = B30761C053E926F150B9DCE7E005B4D87811CCFB9E3B6EDB0221022F01711CF0 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 04F1B3C1E25BA5D012E22AD144E5A8719D94322D05AD9EF61E7DB49B59959B3A In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = AEEF4B4DA420834FFCED26DB291248FB2D01E765E2B0564057F8E6C2030AC37F In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 03D26AEEB4A7BDDDBFF7CFF667198C425941A2776922DF2BEC545F5304E2C61C In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = 435CFC0D1AFD8D5509A9CCBF49706575038685BF08DB549D9714548240463EE9 In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = D477FB02CAAA95B3280EC8EE882C29D9E8A654B21EF178E0F97571BF9D4D3C1C In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 24DD2EE02482144F539F810D2CAA8A7B75D0FA33657E47932122D273C3F6F6D1 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = E78C421E6213AFF8DE1F025759A4F2C943DB62BBDE359C8737E19B3776ED2DD2 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = CCE3E3D498328A4D9C5B4DBF9A1209628AB82621AD1A0D0A18680362889E6164 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = F871DB93C5C92ECD65D4EDB96FCB12E4729BC2A1899F7FB029F50BFF431CBB72 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 4EB143477431DF019311AED936CAB91A912EC1E6868B71E9EDDB777408D4AF34 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = 9A0C1D50A59DBF657F6713C795ED14E1F23B4EAA137C5540AACDB0A7E32C29FC In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = BA062E5D370216D11985C4CA7A2658DDC7328B4BE4B40A52DD8FA3CA662F09D1 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 3A083AE163DF42BD51B9C664BEE9DC4362F16E63383DF16473DF71BE6DD40C1C In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 4876E273AC00942576D9608D5B63ECC9A3E75D5E0C42C6ABDBCDE037785AF9A7 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = 4797BA1C7AB7197050D6B2E506F2DF4550E4B673DF78F18C465424E48DF5E997 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = 41C91BE98C5813A4C5D8AE7C29B9919C1CC95B4A05F82433948CB99D9A6D039C In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = EE354290E3F9CE9123C49BA616E1A2684A90F3DDD84E73A1D2C232F740412B18 In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = FBEC0B6D71696EEDE900B77AA6D7D25F4AB45DF8961CA9C8B3F4F9B51AF983AB In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 9D24AEEA08F9A4B5FB8B6DE85A2296F5F4108DDD1EEA4F8EE58819CF84EDB765 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 732034CAE3FF1116F07FC18B5A26EF8FAF3FE75D3DBCA05E48795365E0A17C40 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = DEAC521805BC6A97C0870E9E225D1C4B2FD8F3A9A7F6B39E357C26414821E2DD In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = AD55537347B20D9FCA02683E6DE1032EC10EB84DA4CBD501E49744A666292EDF In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = B1F990204BF630569A3EDC634864274786F40CE1C57165EE32D0E29F5D0C6851 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = FA460CD51BC611786D364FCABE39052BCD5F009EDFA81F4701C5B22B729B0016 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = F7B0FE5A69FF44060D4F6AD2486E6CDE9ED679AF9AA1ADA613E4CC392442BEB5 In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 24204D491F202534859FC0A208237184471A2D801FB3B934D0968D0D843D0345 In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 81147CBA0647EEE78C4784874C0557621A138CA781FB6F5DCD0D9C609AF56F35 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 5B6D7EDA559574FAE882E6266F4C2BE362133E44B5A947ECB6E75DB9FC8567E0 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 86F87E75C87F9BE39E4AA6D0C5A37A5964D6FFDC462525C0642C9DB010DE38EE In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = 959FE007B57C2947C36D1D66CC0808D80DB7DF45D68A34852B70D2DDA192C25C In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 1A93567EEBC41CC44D9346CDE646005D3E82DE8EEEB131E9C1F6D1E4AFD260F7 In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 549DB056B65EDF7D05BD66661B6D0A39B29B825BC80910F8BF7060A53BFF68E1 In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 794ABFD7EB622D5608C1C7B3F0A7821A71900B7172847FB0907AA2899972663E In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 9CE89958CBDDD8DCB22F66E8CBA5F6091A51953189464803BDC773ABC7FAA906 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 6DA733817DC826E8DA773BECA7338131AB7396417104EDA25970980C4EB2A15F In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 66C9CDC8E8C6C9417D7FFBEF3B54B702EEE5F01A9BDA8DD4E28FE3335DEBBB51 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 24AB37A93674CCB1CEEC9E5681EFC8BDF9FCC7721CF1CAC175E0B20E461575B8 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 574271CD13959E8DDEAE5BFBDB02A3FDF54F2BABFD0CBEB893082A974957D0C1 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = 1947E901FA59EA789845775F2A4DB9B4848F8A776073D53D84CBD5D927A96BFF In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 0C1B8C1AF237E9C5501B50316A80865AAC08A34ACF4F8BEDD4A2D6E7B7BCBB85 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = C4315666C71FEA834D8FF27F025F5CC34F37C1AAE78604A4B08DAC45DECD42BE In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 5FF8734DB3F9977EEE9CF5E2CF725C57AF09926490C55ABD9D00A42E91A8C344 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 1E141A171CAB085252EA4C2F8F1F1087DD85A75AB3ACD0B3C28EAA5735D349AF In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = EF763F22F359DD7F5B3FE6A745C423D6B641EC07BA5235232A0701510F74426E In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 6A769F93F255B078FE73AFF68F0422A279939920E4690B4AFF0E433CFA3D3DF3 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = C06DD4261638C44AFCB186F0AF5DE20EA53AA63316FBB71728F874FF3DACEB0D In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = B5D84B1809E83B5E75AA53BDEE79E3A97F3FE3A7D3162EBD4908240FF69131D8 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = CAD7ABB5BBA5905B5181DD2DBC4E68CFD01BA8659F21C8290D3F835C1A68BBE5 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = 83CA09C1F418B5DAD0A7F64A904A2E07C3314F7D02D92622F8F4674BC1F6AA3D In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 330DE3EE16AEF6711461A994863EED47AF71B362D4C2F243534EF432F63A091A In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = B5675197E49B357218F7118CD15EE773B39BD59B224D9A45CA71C6E371D938F1 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = CD9038C1066A59990DF5752107B066EEBBE672CBCA0F60D687D03A9D821934BE In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = D3172CA263AFF2B9DB6FB13337F2543C5AF51151801A76194012F710306C14F6 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 9E3D4BCF580EECE39BCF13E5716E5BB8F5E8C3FC3723F66246F836D8DB1238F1 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = EDC2D3B49C85B8DD75F7B5128DA04CD76BF4878779A0077AF3F1D7FB44F18931 In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = 80DCE7F04DD6AC17CE709B56CF6EA6C0A57190649BB187B5E6D95FA18100C7AC In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 49BBD5435D2706F85FE77B84A5FA15DDD8259E5D2C20FB947F139373E5C86121 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 6B6C11F9731D60789D713DAF53D2EB10AB9CCF15430EA5D1249BE06EDFE2BFF6 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 7E738E8EB3D47D18E97D87C7B3FC681F86417883CED92BA93C3077812BBD17E7 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = A278BA93BA0D7CD2677BE08C9DFC5F516A37F722BB06565FA22500F66FE031A9 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 9C0A9F0DA113D39F491B7DA6C4DA5D84FE1CC46367E5ACC433CA3E0500951738 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 6BED496D02FE4CC27D96DCEED14A67DA7BDF75E19B624896DFF6B0B68E4FCC12 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = ECD2E3FAF4BA4DD67E5A8656CEBEBDB24611611678E92EB60F7CBD3111D0A345 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 634A95A7E8BA58F7818A13903EC8F3411B6ECB7E389EC9AA97C0ECF87FADD588 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = A0FE352BA2389B0430EDBE1201032EB09C255514C5C5B529C4BAAFCEB1AC9817 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 9A0BFE14F9F3127ACA86773A620945731DF781A6D7DC82930CCDE2F69DAC8F94 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 19E5101BDE60B200A8B171E4C3EA3DFD913E10111D96F9682ACC7467282B4E31 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 4CC2AFF141987F4C2E683FA2DE30042BACDCD06087D7A7B014996E9CFEAA58CE In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 9A8CE819894EFCCC2153B239C3ADC3F07D0968EAC5EC8080AC0174F2D5E6959C In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 8B35768525F59AC77D35522AC885831A9947299E114A8956FE5BCA103DB7BB2C In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 955F1F7E4E54660B26F30086F2DDDAEDD32813547C1B95D305D882682B4FF7A0 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 8FAC5A34EBAFA38B55333624A9514FE97D9956E74309C5252CD2090D3BBE2F9E In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 62039E0F53869480F88C87BB3D19A31AAD32878F27F2C4E78FF02BBEA2B8B0B9 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = CE87A5173BFFD92399221658F801D45C294D9006EE9F3F9D419C8D427748DC41 In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 2EF8907B60108638E50EAC535CC46CA02E04581DDB4235FBAC5CB5C53583E24B In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = BE8B5BD36518E9C5F4C768FC02461BB3D39A5D00EDEF82CEC7DF351DF80238E0 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 52CBC5DBE49B009663C43F079DD180E38A77533778062A72A29E864A58522922 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 3A8DFCFD1B362003DDFA17910727539E64B18021ABBA018B5F58D71F7A449733 In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = FA221DEEE80E25E53C6C448AA22028B72501F07D1FF2C3FC7F93AF9838B2D0A9 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = ED9C8B87FCE27BE4E95610DB1DDD0C035847F4699DFC8C039A798A30343A6059 In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = A485CC9CF4CA4F659F89A0B791A4423953424AC57146B879D385A9E4062AFE52 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 93CD4369A7796239A5CDF78BCE22EBB2137A631C3A613D5E35816D2A64A34947 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = 3751CE08750D927EB5C3AE4CA62A703A481D86A4FA1C011E812B4BC0A2FEF08D In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = A88C7EF7B89B7B6F75D83922B8FD00F034D719F97C67884121434447AE9DD3B9 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 2B4F8F9EF7D6ED60BB4881E635E0F887A51B0C1A42BAB077976B43D2C715E11A In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 586CFFDC434313CC4E133E85AC88B3E5DEA71818ABCAC236F0AAE418F72B6CDE In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = 52D14AB96B24AA4A7A55721AA8550B1FCCAC3653C78234783F7295AE5F39A17A In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = B6345EDD966030CF70DFB5B7552BC141C42EFE7A7E84F957B1BAF4671BAE4354 In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 0347901965D3635005E75A1095695CCA050BC9ED2D440C0372A31B348514A889 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = F0BF7105870F2382B76863BB97AEE79F95AE0E8142675BBCCDB3475B0C99352F In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 631C6F5ABE50B27C9DEA557FC3FBD3FB25781FCB1BBF9F2E010CCA20EC52DBC4 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = 3757A53D195B43B403A796A74AAFB2064072A69E372EE5B36CC2B7A791F75C9F In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 0CC903ACBCED724B221D34877D1D1427182F9493A33DF7758720E8BFC7AF98EE In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = F23750C32973F24C2422F4E2B43589D9E76D6A575938E01A96AE8E73D026569C In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 1ECE87E44A99F59D26411418FB8793689FF8A9C6EF75599056087D8C995BCE1E In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 71B4F90AC9215D7474B1197D1B8B24449FD57E9B05483D32EDBEBCB21A82F866 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 3B3678BB116FADAB484291F0CF972606523501F5B45D51063797972928E333C0 In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 4068246495F508897813332962D3AE0B84685045E832A9A39AD5E94C154D2679 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 82696259536520E5E4D47E106BD1DCB397529AAFB75878F332D2AF2684493F1B In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = B494852603393B2B71845BACBDCE89FA1427DFE4AF9CDF925D4F93FA83B9966B In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = D8A619C0DFBED2A9498A147B53D7B33DD653D390E5C0CD691F02C8608822D06A In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = D82E257D000DC9FA279A00E2961E3286D2FE1C02EF59833AB8A6A7101BC25054 In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 8D5B7DBF3947219ACDB04FB2E11A84A313C54C22F2AE858DFC8887BF6265F5F3 In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 607C3F31342C3EE5C93E552A8DD79FA86DCCAE2C1B58AABAC25B5918ACFA4DA5 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = 0656DE9DCD7B7112A86C7BA199637D2C1C9E9CFBB713E4EDE79F8862EE69993F In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 4DDD6224858299F3378E3F5A0ECC52FA4C419C8EBB20F635C4C43F36324ECB4E In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = EC096314E2F73B6A7027FFFA02104C2F6DD187F20C743445BEFD4B5C034B3295 In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = FE71D01C2EE50E054D6B07147EF62954FDE7E6959D6EEBA68E3C94107EB0084D In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = BD6F5492582A7C1B116304DE28314DF9FFFE95B0DA11AF52FE9440A717A34859 In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = E717A7769448ABBE5FEF8187954A88AC56DED1D22E63940AB80D029585A21921 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = A95D50B50B4545F0947441DF74A1E9D74622EB3BAA49C1BBFC3A0CCE6619C1AA In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = ED53D72595ACE3A6D5166A4EDE41CCE362D644BDED772BE616B87BCF678A6364 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 810401B247C23529E24655CAB86C42DF44085DA76CA01C9A14618E563B7C41BE In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = 9F01E63F2355393ECB1908D0CAF39718833004A4BF37EBF4CF8D7319B65172DF In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 7EC11DE7DB790A850281F043592779B409195DB4ECEDEEFBB93BA683D3BCA851 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = A74AF9C523B4A08D9DB9692EA89255977A5919B9292B7CD0D92C90C97C98E224 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 344D129C228359463C40555D94213D015627E5871C04F106A0FEEF9361CDECB6 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 4CE7C2B935F21FC34C5E56D940A555C593872AEC2F896DE4E68F2A017060F535 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 24B69D8AB35BACCBD92F94E1B70B07C4C0ECF14EAEAC4B6B8560966D5BE086F3 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 19F34215373E8E80F686953E03CA472B50216719CB515E0667D4E686E45FCF7C In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = 290BD4808E5676EB0C978084E4CD68E745031659A26807AD615B10CDA589B969 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 70999AB9818309AFA8F1ADC4FEA47A071A8ABD94012F7CE28CC794A0D997C5CB In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 83120033B0140FE3E3E1CBFEBFF323ABC08535C0AA017803F5D2F4ECB35F5DFB In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 5584BF3E93BC25945C508B9188D0502C6E755BBEBABFC8CB907FA7A252EF464A In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = C234B252C21EDB842634CC124DA5BEE8A4749CFFBA134723F7963B3A9729C0B4 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 645F25456752091FFFCAADE806C34C79DFFE72140C7C75D6A6ECFEEDF6DB401C In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = 2D7CAC697E7410C1F7735DD691624A7D04FA51815858E8BA98B19B0DED0638B5 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = F664F626BC6B7A8CF03BE429155EE1F5CD6ECF14816DE49A5E229903F89A4DC6 In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 06425E83E4AF817D735E9962C0CDDCE2CD40A087A6B0AF3599719E415AB9A72A In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = E8C329149B075C459E11C8AC1E7E6ACFA51CA981C89EC0768ED79D19F4E484FB In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = C86768F6C349EB323BD82DB19676E10BD8AE9F7057763556BBB6D0B671E60F2A In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = D97F46F3B7EDBFB16E52BFEC7DBA0815B94D46E4251E48A853EABDF876127714 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = 51D08E00AAA252812D873357107616055B1B8C5FB2AC7917D0F901DFB01FAC47 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = C6A188A6BDACA4DD7B1BC3E41019AFE93473063F932C166E3242B7F52A3C6F8E In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 2B31FBC565110110011AB2C8F6CC3DA8FB55D41B1AE5E04310283F207D39682D In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 1351F5DBA46098B9A773381D85D52FAD491B3A82AF9107F173DB81FB35ED91D2 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = DFFC700F3E4D84D9131CBB1F98FB843DBAFCB2EF94A52E89D204D431451A3331 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 26726B52242EF8ECF4C66AED9C4B46BF6F5D87044A0B99D4E4AF47DC360B9B0E In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 25E536315F08A40976ADECB54756EBC0B224C38FAF11509371B5A692A5269AB5 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = AB504592AD7184BE83CC659EFB5D3DE88BA04B060B45D16A76F034080DDE56C6 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 5D8EE133EC441A3DF50A5268A8F393F13F30F23F226AE3A18EC331844402FF54 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 712B1CC04C009B52035CC44C9505BB5CB577BA0AD1734EC23620F57EEF3D37FB In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 942E39E230A2251FFDB2F85202871C98597008401B322FF9840CC90CC85B337D In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = B542B6CD8EF2DAB4ED83B77AC6DC52DAF554ECDA4EF7AB0A50E546BEBE2D8E5A In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = F7E9E825722E6554A8619CCA3E57F5B5E6B7347431D55CE178372C917BFB3DC2 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 14BB22B98EAF41A4C224FD3C37188A755F9B04F46F3E23A652DA3DB9E25D2F2C In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = EB5668F9941C06E5E38EA01B7FA980638B9536CA1939950C1629F84A6EFF3866 In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 913014BB6E243FAC3A22A185F8227A68C2311DC0B718E276BBBDB73AF98BE35F In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = 0284418C10190F413042E3ECEB3954979B94AFBF2E545FC7F8A3C7DB2C235916 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = 8FEBFF801787F5803E151DCA3434A5CD44ADB49F1C2FFD5D0CD077A9075A492D In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = EA7511B993B786DF59A3B3E0B3CD876C0F056D6CA43CC89C51C1B21CCDC79B42 In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = BAAECB6E9DB57971D5C70F5819FF89C5093254DE19EF6059C43CC0AFDA7C5D34 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 56DB69430B8CA852221D55D7BBFF477DC83F7CB44AB44DDD64C31A52C483DB4F In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = F8538F597F4463CAD7A91905744B87156DB33C65BA87B912427FEC3669F425D4 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = 447EDA923CFE1112A6F1A3E4C735BF8EE9E4F2AEE7DE666A472FF8CF0FC65315 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 74D94C13AFEA4DDD07A637B68B6FE095017C092B3CDCCDC498E26035D86D921E In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = CC11196C095BFFA090A05BA0BC255D38BDA7218D9311143F4F200B1852D1BB0D In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 8C085B54C213704374DDD920A45168608BE65DFD036A562659F47143604144C2 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = D2E233264A3773495FFD12159EF7B631660C1B3E53A3DA0F24AE14466F167757 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = FFAC7CA5FA067419D1BDB00C0E49C6E1A748880923A23ED5DD67DDE63D777EDB In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 5B2ECA0920D32B1964BBF5810A6E6E53675ED1B83897FD04600D72E097845859 In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 68F41FDFC7217E89687ED118BC31AC6ED2D9D1E1A2F1B20A2D429729FA03517B In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = FA2F3DE31E9CF25AB9A978C82D605A43EE39B68AC8E30F49F9D209CB4E172AB4 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = BA2AF506C10DA8D7751E67ED766CFCD47D048D6EF9277DBD2ABFE2FD5D787B79 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 3CD33F8811AF12183C53E978528F53AE7D559432724029E55FCFA9B990B91713 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 3ECC9D27994022045CBEAB4FC041F12419CEC8060C8F6F9F0372884DF6074B5C In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 1501988A55372AC1B0B78849F3B7E107E0BF1F2CBAF670DE7F15ACBB1A00AD3D In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 5C4E860A0175C92C1E6AF2CBB3084162403CED073FAAC901D0D358B6BF5EEFA9 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 272B4F689263057FBF7605AAA67AF012D742267164C4FAB68035D99C5829B4F0 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 9B28E42B67EF32EC80DA10A07B004E1D71C6DCE71D8013FFA0305D0D0CE0469D In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = EE53F83D2E2CCC315C6377EADDA5F42F42F3AADD664E3E895C37CBE9D0E9B9DE In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 21CCFDA65C4B915303012B852AB29481030F87347C29917E21F210F2BD5EFC9C In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = F5BF70710DA440EDB43AFD3EB7698180317FFEFA81406BB4DF9C2BB8B0B1C034 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = E83EA21F5BC0976953AF86069A10EB6024A1AC59D609688E4A9759BB8B6C9441 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = A2D93C6367E1862809D367EC37F9DA44CB3A8B4319C6A094C5E7D7266FE3A593 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 3C647B195F22DC16D6DECC8873017DF369EE1C4696340934DB158DC4059C76DF In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 3BB394D056D94FDE68920CD383378EE3ABCC44B7259D3DB9CD0A897E021F7E2E In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 43640F408613CBF7393D900B921F22B826357F3B4FDFF7168EC45CBFB3EF5EFF In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = CB3713A5D5ABBC6AF72F8B38A701C71269B3B51C62EC5116F96AD0D42A10FD90 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = B304FC4CA22131857D242EB12FE899ED9E6B55717C3360F113512A84174E6A77 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = A3CA830D4771C1BAA7FADA76C5FCEADD0F3CB9736E19CFEC52E9E74F56BFDD55 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = CA158C46370E64A9F032F5BA8E091460FD555EF700EDF7087E56BEBFFA261DE7 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 5901CDA0CD1510DB5455D072D2737A6721AD9EE3272953A19C7AB378BF3646C5 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = F64562D6273EFB5EBD027E0A6F38C3FB204A6DBE894EE01200EA249B747CFE66 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = E7D7A113B3A33175D0ABD2CF4F9ADD8E41DC86C93C9552C5B3588277FBCAA24A In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 3B40C1493AF411AE7849904D478DF2407254BF62B88E9BFFD7B42BD2A60CE0FA In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = FEEB172AEAB2F0DEB748FB77801CA22D3CE99B7A9F9789E479B93D1F4B1D227F In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = B240BC52B8AF1B502E26BF1D5E75FE2663BFBA503FAF10F46754DC3D23CB61C1 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = 3EBACE41F578FDE6603E032FC1C7CFEEF1CB79FE938A94D4C7B58B0BA4CB9720 In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 65EB4BD5ECCA7164CE9B66727F112C1AC6120DDD200DCB5CE75B7487843FCDB8 In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = D7155F6D3A90801F5E547689389FF62A604C81B7C1583D9204AC6B0194F0E8DD In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = AA7ADAF16F39E398B4AB0ADA037710556B720B0248D84817B2CFDF7600933595 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = B195463FE22A160802BE0A0464EE3AB4D2B117DE517B331C7BF04C8BA90C6120 In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 9F9296C53E753A4DE4E5C5A547F51763A96903B083FBC7A7828EFFE4763A7CE6 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 51DE4090AEC36F6C446476C709253272CAB595D9887CA5D52A9B38086854D58F In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 87A17400F919F2F53232B2205E1E8B14BD5698A76E74B9BDD5638A5C7BA5DE1E In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 9742536C461D0C3503A6C943FA8105DBCD1E542F728D71CCC0517CFFC232EA68 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = AE3BF0936497A2955DF874B7F2685314C7606030B9C6E7BFB8A8DFF9825957B5 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 5FE0216DCC1BDB48F3375B9173B7B232939AA2177C6D056E908C8F2B9293B030 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = C339904EC865F24FB3F88F142A8786D770934E006EAEDDBF45ACBB6B38431021 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 4CA8B7FEBDF0A8062E9B76185CF4165071BB30928C18F14338C305626789C6D3 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 23D2614420859B2F13AC084453DD35C33FE47C894DD50C087FD1653FCAEEA00B In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 5590BB75247D7CD0B35620F0062B90FFB2A24DE41220ED629D9E9A7ABCADFB51 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = E5932441B012E503B0B0C6104703BA02613E472AD65655C085B0ADB07656B28F In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 21C0D84EB7B61774F97DB5D9ACF1DFFAFB662C01ED291A442BEC6F14D1334699 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = 0D1E6BB88188B49AF0A9A05EB1AF94255E6799515A2F8EB46AA6AF9A9DD5B9E0 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 935DED24F5CECC69E1F012B60B7831ABCE7EF50EEB0BEA7F816C3DBF2B4ABDC1 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 6755BF7E60E4E07965BAC24E51B1DE93E3DD42AE780F256647D4CC2EF8EFF771 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 62C9F5E5B56E2994327A7F9A03888DA7BAD67E387593803B1807482B137B4509 In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 9927FA5EFD86304E73D54AA4928818C05B01504672C529471394A82E049E5F95 In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 84E056BF7BDFC73A3AAA95B00A74A136D776069BEEB304423BEAD90120DB6350 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = 401C3BE59CC373453AEF9603F7335C1D5FE669909A1425D7671DCB84A49887CA In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = 020485DCD264296AFDB7F643CA828C93356F1714CBCC2FBBDD30F9896C3F2789 In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = F8C43E28816BB41993BDB866888F3CC59EFBA208390144D3878DBF9FBFA1D57E In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = 4EA524E705020284B18284E34683725590E1EE565A6FF598ED4D42B1C987471E In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = E4963E74AE01FF7774B96B4F614D1CB2A4CF8D206ED93C66FA42F71432BE2C3F In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = 0F0D72BF8C0198459E45ECE9CC18E930CB86263ACCF1FC7A00BC857AC9F201AD In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = DD1D2A92B3F3F3902F064365838E1F5F3468730C343E2974E7A9ECFCD84AA6DB In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 21BF20664CEC2CD2CEB1DFFC1D78893D5CA1A7DA88EB6BFD0C6EFCA6190C9E15 In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 6472D7C530B548E4B47D2278D7172B421A0FB6398A2823DD2F2B26208AF8942E In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 2AC7FF80EE36D500995C973B8746D8466715E6D8B0F554AACB5D2876D7F5B874 In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 9FF81D575F7BF0C4EF340B4279D56E16CE68821AFCDF2A69105D4F9CADADD3CF In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = 09EDC465D4FD91C5E86B292F041BCC17571E1F2E17D584DFF21DD7DD8D8BFF35 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = C6D86CC4CCEF3BB70BF7BFDDEC6A9A04A0DD0A68FE1BF51C14648CF506A03E98 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = 1AFC9BA63EEA27603B3A7A5562E12B31E8FE9A96812B531E9D048385FB76D44F In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 9B5E15531385F0D495FDBE686E3E02ECA42B9F1B1CE8837AD3B3E42E6198050A In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 216FC325F942EED08401527A8F41C088527C6479342622C907EA08FF3290F8C6 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 43184B9F2DB5B6DA5160BC255DBE19A0C94533B884809815B7B326D868589EDC In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 348FB774ADC970A16B1105669442625E6ADAA8257A89EFFDB5A802F161B862EA In = 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195 Out = EA0E416C0F7B4F11E3F00479FDDF954F2539E5E557753BD546F69EE375A5DE29 In = 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A114E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B292D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C2527AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18 Out = 59E904B2AA0CCBF2A9D127446F113B7CC3D07B970E07A322325ECEE66AE0C9CA In = 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A6961652676DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC004691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B4628027A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718ECAE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651 Out = 6C2A841318066B90A9604D0C8ECCB2986B84A0C8675CD243E96957D26E9C1CFD In = 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAAE17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4FDB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D51071BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493CD136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C3074E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6CE2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7 Out = 0EC8D9D20DDF0A7B0251E941A7261B557507FF6287B504362A8F1734C5A91012 In = 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD80F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5AA756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746DB6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9FAED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD Out = 0EA33E2E34F572440640244C7F1F5F04697CE97139BDA72A6558D8663C02B388 In = D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C313D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D73D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B21E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D51263B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978AE90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A92498D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6ED83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A790910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC98D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBCB88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A896771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78FA3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD5649FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8 Out = C7490B05B172A1DBAAA66FAA823108D44C82F1E82A41FD57FD95000F30DE747E In = 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB42610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A8988B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC82670939948FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED664023616B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC628140996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE00D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA9628381055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D599B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACDB178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF214DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3BA36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017C3A66CD4EB2DDB42EF85EA0CD65534 Out = EB351838FE8225FBEBEA9168DBB708872CA43AC93480C3AFFBE6CC3A15A2263C In = 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA05418770F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF0445B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCFE87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E5544E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671ADEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC7283661D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615FB93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF199E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D29B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2CFBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AACDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83EDF9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED09253039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADED1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B965A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E1741553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E819C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48ABE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C640909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E53E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB46652196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D259C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7EF94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3DA8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6FE398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C213171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD46B568CE294C89 Out = 96BAEE8ECA9DCDBDC467549E307D95C20A07FEB72ECCC780DBC29D40AE7CAE45 In = F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E90449F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EAF977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0FA032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC0103CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F44120ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF300251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CAC2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B98320B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B0562B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1AF9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A463B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137FF9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BED133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68DA188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE897B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A7403001798992F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54CF7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA6983D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B52C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B04DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC099EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F9581DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F94E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169DC46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB000057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D00A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4BA1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441EC8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656CC30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D72DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B88DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B855845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F164678160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D6294FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D12089CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0AD12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E73EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A810FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1ABF6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215 Out = 6C8723DA27CD98E20F2583D01868051EF2DAFA645901F82C74D5320EAFC18AAC In = 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB29647F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B6004DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FADDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE3903080A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBDBEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A2944384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E6222A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D3752889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33DB8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB22907F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD15C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD56495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDEFD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A8194989755D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E532A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D7785C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FABAA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C2153663B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530CAB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD8986EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFECDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BBBE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C28F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705CA27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2CECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D10CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246BD04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB09895CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E900200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A13EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398ECF3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BFEA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD43835033B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E2626AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041CB3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB5223191E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B2442B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42ABAD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B467CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB33770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F07942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C790245812113204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B09B7F42D193FB3E9C06329818251A2F7E6474462C95DED Out = 3D20746DDA871A104202EC1AD7D60D8E165FBF97AFC1929511E41781A35CBA45 In = 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F76316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA3760826D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E6939C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108AF1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE70057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DFCAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D009432DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083EA427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF0036D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A5952AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CFAE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF09772D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1FC070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665ED1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA289984103F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1ECDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADEB9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F621275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E816D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A31870543D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B440309989857103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D880CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD231B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB397EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3ADFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FFDF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A24924A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC2775833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA780703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF942815C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEBA3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D559D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD878C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FFE178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A65A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F9476D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFEE744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E2885EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB89B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABBF1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A864D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA725473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112FB2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA42F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE16318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884EDD768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B652467FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030CEBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF57795DABAF40687B2CDA7A5014168F Out = 4BA150C2F4DB2449515CC9B545EC0012747324700D0AC1E554EAB84A262BAF00 In = 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D50752ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07CF488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A1076D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C405F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB0378391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB16700EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC33B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60FA01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9CE264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA14141AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C32958A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA75470C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0CFCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94FE43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE84E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D36257C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C9563844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CEFFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE954785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB78676E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FFA65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B23C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFFE6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C94650C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D02BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFDC2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91DF0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB507608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159BAA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC4245A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E13B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E14843D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F76242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B260F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C73696F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA81F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D3521720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EBA748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA15337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE723199224F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F710BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B3013839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FAF353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A350314B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA40FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF862EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB048CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389FA745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615BDE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA6069369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF1739C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B6575A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D23519730338D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34090FC9BC045271 Out = 192EAEA84038D588AD55DC5143F2BB10040EF78BFC7FB91F6B5E4C053466AF00 [Keccak-1600(384)] In = Out = 2C23146A63A29ACF99E73B88F8C24EAA7DC60AA771780CCC006AFBFA8FE2479B2DD2B21362337441AC12B515911957FF In = CC Out = 1B84E62A46E5A201861754AF5DC95C4A1A69CAF4A796AE405680161E29572641F5FA1E8641D7958336EE7B11C58F73E9 In = 41FB Out = 495CCE2714CD72C8C53C3363D22C58B55960FE26BE0BF3BBC7A3316DD563AD1DB8410E75EEFEA655E39D4670EC0B1792 In = 1F877C Out = B0665C345F45E6DE145B0190335EF5D5AA59E0B49FC1425D5EAE7355EA442284CB8A2152D565EBDF2810ECCAB15AF04F In = C1ECFDFC Out = F1850B2ABB24F3FD683C701582789D9E92B6A45F9C345F9DAE7F7997C8C910E88003E592E59281CF92C92D6B51A1AFD1 In = 21F134AC57 Out = 68D437327F158287C304BBAF36F782F497DA2C480A1FBB268682362218641F9070A014919AD7331C49BEEFCCB437FE9A In = C6F50BB74E29 Out = 03566EC003FF55184F0C85BEEBC6D1ECF5E5D082D8D40137246F8FD42BCE097C09418845EF60286FDD894A00FD2D6589 In = 119713CC83EEEF Out = 790D700FA34D6A835BE311B639474780148A2F087AC2FA86E8A1A433EC7A04FCBFC5284A3E188B7D91C6D094EAFBEECB In = 4A4F202484512526 Out = 638E65758A297CB09DED1AC5B9E8F779802000AB791F67F33C60BE36443793ADCC8A4A58E98688157A41784F02A4BCB2 In = 1F66AB4185ED9B6375 Out = 308EC6F2EE3F6E01FB3AA06EB7C8CADD199354751B69FD4BA4D4671858F28BB45C94E712AD9D356FCB443067EF5ACA2D In = EED7422227613B6F53C9 Out = A88F2FD112E5F11E775AA7858A3A5202E8FCD259F5D112BAA6F568240D2ECC047EAD88509E4B8A747D370751FFB2FDC0 In = EAEED5CDFFD89DECE455F1 Out = A22A31349D7816545BE31B80E992BDBB62A29480917CEABD0AF5F2FAFBF276D4C29B63A04910B830B8757C81E223B7F9 In = 5BE43C90F22902E4FE8ED2D3 Out = 36CA9CC329F9A00FAA5F4F21170A017742174D3CF03C084AEB759F6FA0390349E1B502E435CFFB0BCE4ED46C0012A65C In = A746273228122F381C3B46E4F1 Out = 3DA54976B291DF77F10BF95E9B7EF9FB2F88DE075DDF6650BA788590F4E2E3C830D3B7DFC0193656B0A185E3AAD9AA5A In = 3C5871CD619C69A63B540EB5A625 Out = D21A7CF252358A1159A55934456E67D9E1DA538D4E9F9F1ACE2FD75F3074B27AE2B356144BDA7BA0B1ECA1AA201B20DE In = FA22874BCC068879E8EF11A69F0722 Out = 8A0C6331429375F052960AFFF6D5FE33759F97145D60B262BEDE86D5254994558FC1800ADD09D6887C275F4DD3531CB0 In = 52A608AB21CCDD8A4457A57EDE782176 Out = 18422AC1D3A1E54BAD876883D2D6DD65F65C1D5F33A7125CC4C186405A12ED64BA96672EEDDA8C5A6331D28683F488EB In = 82E192E4043DDCD12ECF52969D0F807EED Out = 4A59DA05C6E035D59D93F559D4A130D3ED91C22EADA53FD679FB0B0F31398A6FF83A5A9739BFD4E95F57318FCCB816F0 In = 75683DCB556140C522543BB6E9098B21A21E Out = 98E6BCCA5F2BB30C554700202E0604F7C86B4941F0345325100C83B1234C45856DFA761E70DCD972ECB1247AEAC29259 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = D3C3D76B3D3926FD4CC4C05A087C2D76992998A5CD8C13FA3D233E0ECB2AD8B81BA4BE581E02BE91C7F82CCAC90013A0 In = E26193989D06568FE688E75540AEA06747D9F851 Out = 7C53DA060058183CA6204E77F0709AEBEF73557C8F5E45C195B7E9416E7261365D03B8A2D6C01A102655344E725475C4 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 2415C1D053CA207C17D99D02DBD177CD1AA7F00B0D0CA2CF30B4D2098EEA1A04A68E5B1C6DF2FB25ECE157C423EE8AB7 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 90DA42B0C314445EAFD8656B26644ADDEDDC713EAB36289BFFC6ED4A85BE66A10F5ACD6B3C61E9C36A17C26260872DC8 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = EE209E98A75A67B09008202CAD380917EB1F92C5DB4E8F2C64900AF8C603D265CAB317BF7B8E2251E479F8818D3022CA In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = 1198EFA57E1A7884DAC827E683255575510E1F92024A135144659BE87BBF0D063ED26C987647B923A091CF11680316FE In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 0435E54C016C0791677DDBC6BADD55D146754296B31132B0B1C0B5CE4AEDB03AEAA9A2DC5157D7AF20B8E36D75E1CC00 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = 88D898ED7E6E54A683812B372F678A5FD73BCF3160A969FE4584651ADB3255F9ADCC8B85DCCA5C3BF8EBA3A1B69D9B90 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 7AC343A9369FA7BF45AFED43084DC1E275AB1B70034CFAACD4F3CB5E5E2201CFBD1CFFF83BAAD3897A4CB8A0DE5C35C4 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 58877B8DD98C51339E4302ABE95CF57662CF05AA01938161CBFB5DDDA724517F0C002D54B54EEA7EBD64E209DAEB8F01 In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 1CD638128718BE351385E7A156C3F0EE8B210D1565876F8ED46C227B930D188FE8CA27760FE189D3B136836561E9A0EE In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = B4DBDFD9922AFD1CE46FF1CB27C30E2AEAA967631A04001C7EF2B5EABD3C0678C0FF219BE7B9FA04CF83DD40BC1B33B6 In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 503DCAA4ADDA5A9420B2E436DD62D9AB2E0254295C2982EF67FCE40F117A2400AB492F7BD5D133C6EC2232268BC27B42 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 64D11ADC77AF5C568F37E44EFAC5FD03C460391AA833ABEC4E464237A8937EEDD23EC513DD2A71D0329BEAA8BEF395C9 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = CF38764973F1EC1C34B5433AE75A3AAD1AAEF6AB197850C56C8617BCD6A882F6666883AC17B2DCCDBAA647075D0972B5 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 882BFF904BFF1031139503BF6E0274C7A3928C2D73BF474A65B97C22F65F32BE26AD1C5F7E4FA35D5B6253AA4076361A In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 80448B7A76E0F0666048C02165A4FA8DFD250A227CCDD4471C3703D07762362DC1DF55FEC29E2A31FE70958374271DD7 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 6268CD6B41F4C5123EC4D54D1E6943ABB32DBE7BFFB8EB95E4FCEE5C12D4647BE143C27F1281CDD275904920441508DA In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = C73D18DE07A65ACC7E2D8B2A51002AE28CBC4B0A6EE7F81A6B483F81A6DF8FF6B33F632A6E6312888CA714821C0B13DF In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 3A0BEA62F42F9CEEDB348F6E1613F00356ED9766A5C19F0C2EEB05C74DE69D3943E16CF72281FDD92715FA3D51515931 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 1092F63955F3DFEF1322CF9516F21540215552BC5709CCDA17AD276ECAA091A78451FE9925791B8A9191B5D42010156F In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 8CD022971D5769761B8E96B442444FA1850F1201AAB0AC9F6E8404E2B3EA1D936244EEDC7957C80B7FAE60B3F216C6A0 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = B6575D53D353360521B20AA1F993F6E2B5A262D1F508789D5CE2469E9F3F33CCE8848DF690CCB0D676FB949EB171A7D7 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = 7358C6A0AE58EFA14F65B8E162F07EF2D0AD8DD2006A98293307B76B3BA9E71C308A6694F0B56DE8D59E58536C3513E8 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = 18030C2B5EA23B6C66BDAF180A41173394540215CA48FB3E758433FF9884EFB9E56D2922BA5320BA84BE36E6EFE6B89D In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = 6F9F9016AC3B6A5978A5DC8C7506C8B4D28742253BC542E79D95824417AA542991EEF7E2B9C58CDB0C93616AE9C1F88F In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 424421BB9399BD44AB76500273D7F1E1421A2BFDE1A1C130C0B3474409D8AE92B3E38539CFB09ED1D23C62BB32B9364B In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = D07A2CACEEA869274BAEECDA43B6020930EF383A897C72A7AC7FBD8FF5CEA7F8BE655844D9F9BD2B498880FA1527D94F In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = 25D7AB5E930819CF5F59ACD2542691AD66481DA547EAA9C2ADD7C8EA69A475F416C430EA1DE840974E3236A62520911F In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 36A6BF2D4EB3CC6FB797914E734B2CA8702CA7CC6D539B4DDB233EFAFCF068712E845364A4A929D31A440C7DAF8B134C In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = B69D40A90207EDB20C0068F402008C0E64300B89A1B6AF7930708B263C790A087F3ADBB4C84295D23392E0692F35BDBC In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = CDDB883B9EADC59D2894178B3BA6F61E5E11C2C415C89E554E20A17E4909F8D960F02AA80E1A5129AEEBF2CF975711A4 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = FBE0056D65AF279EFF1573F169809A05B6A52112B662D07CDD2570BE5E198A28D1EA49CBEAF0C05E76A9F09BAF6D1F34 In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 26473DE684CF58D559C7C0CFD360A9AFFDF33900FD69A3A946581484B93EF6FE6FFAC461B4551E136BEAC64CC33A4C15 In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 462AD97BB0156A5DA3DD0E9E5BF06D31024FE43BB80C018F6858EE4332F2EB5A78ADA06CB55DDC172AD87F88E26D2451 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 9F890FA80A4C48B67181E89DBF15175CE48B21F9D09405218A8CE3C0759282780E142FC59851157D14509FCE79D1B17F In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 2D9A3447D7723D837B8784FEAF03B8F9694CDE5FFB84C6A6628895A345BB8F3F5BA725416906DE063B1CEFB722C7E56A In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = AF415063A5E25C6E55ECA7F9BD1CB0C71A7A059B569737036B339CA559CC9C7466FA239EA57CFB5FCC50944871C008FB In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 6811EC07E6E85A289C881722AE84E6AEF01FD2761294C6ED9856D2F7EA1C71A89B2FCF4A9E56533360EA22317561EC05 In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 7C90268E981A3C0FF19E14CE9830A1B9DA5FC183950875961582644462059DD2FADCFA68750D7D2F44DFCAB9FFCE5832 In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 64E9AD357B58C6FA0D26D0D1F48C4AB057B9F80965AC38494E88F542BA41D6B798FC2DD88290F8DDE7948C19B5A1F260 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 3D73B33F001387FD1E752068AF39454E476B8407038C772D94400458C93664EC5226AD1BD3A19A6D9A6FBD6E6A62695C In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = FC619CA9810CAAE3639B3FC661388C454167271E65ED0A2E5E8BC718AD21B9EDE895A658C946DC2FB15B33354DFE402A In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 5843123A28F0B50C082023AC43B7299C4FE67302532DF4805BE6DEC3B84515B1C6C98F8A4E3D6CA826DA4A11300C3B9B In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 81EDF06E9B64F3016B1547535ABA4DB08760FD23E9580163192F663FF62106001006A1393CF20DE4656DBCB029FB6314 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 14AA679B0C11F9C363F549330261B45E1E90CE31F4A1B0CE5CB9EB81BD6079A3742D8602356C50985D0D3E540FDFDCFB In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = E430CE80BCC61D87FDE0A278CFF54D730C03A03377F4AC10B93ED59C5880117ACB20F1705AEFD29BE033D2F202594655 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = C9F74AC47F9146F091DE6309357F3C2AF3A9C4474CC005AEFACE3C7A552B6127E34EC82C3AFCAACDD83E695CB86241E4 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = C42ECC8863077ABFF689413CE37B61F0436DDB62E56DE4E3333C26D95AEE9E9CBE1D8AAA6744C0DE6BA9CFF0FF01A6BF In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = B15392718CBF4A7C7FAD1C15E7F26C446E79D54251404E646B4DCA3D42142ED5140D0D30BD836C7D513CE6F5E104D42D In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = E03294C68EDF4E8826B699ABDDBEF75467C49CAB56E085E4B83A58B2D9BDFAC9D58B45AACC0EC0CE2D6D79686A41AC13 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = D5539D7AEFF9F74DC75B6E95EADE063BE419B15A4179CFD06D4FD2741E22B2A24395AAA1C0242C995EB5EA891347B4DB In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = B115A9968B054C934C396D8188BA0C33A23C7189CE88B1DE4A06CD319792D28647EAE1D88FB0B87443E46292A5C645E8 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = C8FAEF757E6D7B0AF46DA1E57C71ABB4AAF7CC91C5CDC33BA8A738172B95DE087EC4C92692CB40EE3787BCE3206FB7EA In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = F4F21BB74593AA107DC195FF52A3F90816CCEAE8D3EB9D4577B28B49C339837A52700A62EB421E8CA1C87F456310F62C In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = 83544511A07F6058D9FE5AAD7EA837A9E180D8BBB884C5650B798942983A605A514C21D8D63DB0E25AAE51D26F410BC5 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = 8ECD8459FB904D2EDDB14207659C2BF96EFBD3E4C8988736EC75088F1CC8115D3FFFC8CEDF1C01721469D27968A6856B In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = BE60246E27959DC8065C6D4DCAC93EB7F7146B49C759BF1DD5EBA46A3ECF074784A9DF18DEAB7A19AF7F6290CDACA87B In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 9235BA18C55E2CBCA0FB1DA3BC8D0DFD848CA0E51DDC1020D4BECC0F138DA1087929FEC93AF16F5FB29C4A777DD91548 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 08739DD866C6216ADCA26D6121E5D81FDB1F7BCD4802C2B811D73C282277D4014B4936E5589F62279BB33075705795F8 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = D2A2E858A5DD85D62E6F51AF7E42352AC0D7A68A835431BCCA47557E3B5C3373F40D3BAF85AE416012C7C982B2325790 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 2990D7EA068A0307047B151D5DD6B1B2358A9EC8AD9B6B826CF1BEF399D488BD68D77DF8BE99F7DF7AF14AE0CE636379 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 4B3087F800E4084D7F685737AC635DB459CF70C4FA863C711C1143CC10F0C4AB0A2370C099FB282F9C1CE5F015BF3F79 In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = 5D347FDDB118FD7DB270898407979D2D1531D3FF6642EC4F22917EBBEDA6CEE0FB0DE11432EDDDFCBF0E2AB9CFA65804 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 954637B87FDCC484F2B61F7F42558068029F96099C1D6B9246585092EAE68924E5441B45027248A2728833169BFA5004 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 78726E91AC311F4D104706362B0314C243CD81644125881FBC03670210C89FB8E7BFF6C61FF68B234C3171F16B398F36 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 80763FB54688F122269430980AA3ABE09091020B8CFA6BDE0EDC2C63AED8B8BA097CDB79B8FC7F5117508FCA4864A14D In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = 80447583262DED037DA88F3B98698BD8F7AED7D9BF4D99F8132EC3E7D16BB844ADAD188757CEB32B359C56E5007EA3E4 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = E5FB4AE5DDFB4CE8221DF4BE70240B76851E55FAE86BAF35BAD9E7179E24C95DA6F0F0695A8A5291A2394B92A6FF7B7C In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = CE6B07C0C7DA2FA1E6CA05DE0652FC9F1F452FC261E73E52457C72BF0D51BAC7D66160CFF16D6A03527982E7D4393507 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = FA76E05F8D2832DADFEBA0107A3137B7B9D4D19A77A1E78F8BBFECDA7EF46414C363453E8C4902C302A4E18CEA4BA157 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 1B43B70B6BBBC768C1F4B3CE241667ADB5246D29981723846168D2234E19A5130B1F576B4974C613639A449E61B2CA79 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = 938252393A532D9E1F91D5C222E2DF2CC7AE102705BFB83FE30DCAEBCEA82BFF9BDA7CA67095439859146632494D3CE4 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 47633AD0C80AF26BF74D9598DBD5BCF77FC6BFF1BCA015A611D7B8240F597D8767FB8B0BF5C333156580AFEE121C299C In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 04456322E1BF27785EDF3F596DB33E693AADF76D9D259352D97ACD561BC45236506FBA3530772242CB369A83A38CD749 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = F8B1F2C317B9D1898C305DEC3C6C0AC45CFE7F995E944968206C1C1B2C92BD1D4FA392FFAA6094C6AFF95E47DC259EE9 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 4F439197C66439BAF65618F826E299A329380B558A52B0711182580BDBADBABB13AD66D60FADDB9DED226F0B401AA8BE In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 1C8B99BF6A3E80F0B8C67FA9BBF07D19C15D484CDE38F8FAADB748AE024A02E29FD2D7BDCE66D46C1A5239D7453FD3E3 In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 46F87BC07849E95104E67CC3DC71BDC109C1102BFB1ACDFE2F6A23173B52BF836CE00CD7A5A5FFE7D3BB8FAB33DECEDF In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = FA12B9D070F697FD5391F3FC9C44056CEDA63F035D766655AA7D0A575ED55B15BA6BAF56300940B565E37A248E2DCAB8 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 5304D6DB2730FB07B85348B0226B1A81A546BA1FE201ECCE1E552DBA6AFB84CCE7A6F954E3100AE1724B82CF1CBC4128 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 135114508DD63E279E709C26F7817C0482766CDE49132E3EDF2EEDD8996F4E3596D184100B384868249F1D8B8FDAA2C9 In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = D560D54A2881ED47CC8C5AF9818FEEAF08B621B1AED4569D08807A0B61F902C1691D8B08FF75590FEAAED6E75F4C9E3F In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = FE5F30A315584092A271FDBCF4347A24D14A1F98CADC88DF288C36CEA8F89E9020019933BCD4F5A7479E3E4A57644C49 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = A4E5EE130FC105818CD1A0DE74F1085B9B4D93889C509DC3A208B5230D39D8F304BB403F72BF0CF5E02C4C4A0831F328 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 9FB5700502E01926824F46E9F61894F9487DBCF8AE6217203C85606F975566539376D6239DB04AEF9BF48CA4F191A90B In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = F2E0FF6CF4801CFF2ECA1703E4E956C007A1F2709430F1F7A0A4FDD16A063522A4DFB6C41FA529C2E325F8CDD4F8DA96 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = 62029D962D2E323688DC5851C549DA39EF49CB994D2D6C51C57B9BBAB375AA10BD0605208D9946EA472573880230DD2D In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 25E546F76EA9F98E03E3B2F4AB608185073658E7EDA0777BD5B047A59085C3C500916347D4F77E38E35159AF133ED638 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = BEEFCEFF9E2D0825D60EA20E5271BF49C4AE3A5B54B56050988DD3DF5DB5EB4F1002EFBFBAED2FC72179DE44116976B2 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = 7D18254D46A14D0383EC56AC9CA2FDA7885AE673468C9F3B45BA792C2C23C9FF82491E6AECA15D076AD3A3432CFA650C In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = 1E3E007CE37792D8A4423B797E876E89859590DEDD39711AD0F1DE2FD925F4320B44BD57DDC7050427943E3C957D4B6D In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = D1D263B5311B05C7B9F7783E3AFD9A2E75791CE0503ED820474B35340D2CC84B0270921BBD965722011AA30CE4352926 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = E482B0C1B2057F1B6B897BDC230DCA2B48FFC0E4600AC40A44DCE03E99A8D1DF94908A9FEBA0405DA79569E75059F9CE In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = E54BC3B249DFF637001B58D13CBF64F453E01AD68A554CA994F71EC710216EF9769F1C8B463DC7B4A90A0CEACED41E3D In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 01DC4CED4693B36814443857931C5D3CEE8762FDA0220F8E9E63AB1EE9A7135ADE21C5AB3791821352FFBC322F3ED208 In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 587C8104936BDD74700666663843746015906CF4C681C2A6FFDD07B732E9E7787B165E117DA340BCE4E27302BA288299 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = 51753384C8F9584BE3ED4526B9B29A97DC8A87D195D0155E7444950EEA55ABEC5C0D7814F1DFCE5CA4BF1D50EBC709AD In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = BD1E1E9AE80B7FA79ADBD47D7A28BA44F4874108CD9BE5D327CC93C6ED4DACF8A9E2A3491D4168BFFAE63FB2F1070DE7 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = 6B7C1144FA984261377DBAACA78A03AE580B7F3A17D69BA0D56EE908DD9EC9F87EA30A7626ED7CCF25B53A6994E121E8 In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 76414F3B9E4FF8D150280C8E44BC54056849B25351352D9D9E986B3ECB6EC050542709AFE01979D2EB97E51D41217E6E In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = 92AC60E5DC492010A45F46AEF05F403F7569E1B4E2D0C909C871A783FC12457DE281AFF4C4CEE0207D20EAF546285070 In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 8F99032CB49BB022EE5FB32446E1D39AA0FCD749741E4796979D4BEA5AB1B04D241592EC6058E54B8EC9EAB274EE632D In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 8BB4F3CF0390A31D682213D22354DFE7D580C811682259872F2A29A08D373FD998F842334F64F81349364A930C82BAD4 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 0BB7DAC544569E6EB74ACAB01A846F74AD2A0F31D8FACEE4D09FA49C81B93BD83B4F129B96DA4C0EAF165FDE52EF295B In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 10DD9348B2D95889EE613907824A10EFC708A101A67672FCA4C6539F5156C7DF805DBE666FCF4CC578F421AE3CF27122 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 444B8A6F1EE118DE3FB3EC76B2FBAD9EF31916E1F99077DEFC51C2E59C8E6A3E207BA48E5EDD66C72B5BEBA67401D794 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = F4D17C6299BAE7D0E6D15A550B311F30C1B038AEF56FE375F3B4BAE14F7EA427C5AA987EF93285975CE5F9E46A3E4C20 In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 39F911E9CB2763C8911AC3153040E48F403ABFE373E14B709A476868D3AB5841D1088F8393DD728305BA341138365D27 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 3ADEB7EEECF9069F143A10151FD4506AEEF3A0EF94CA65D4448ACF1E892B8EBB0887631804DD64E153AD41FAE0127A85 In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 14830877DFAFE6F886A22DE7CE9A5FC74733A8FC27ECC523B6B4524E6312CBB22B51D7EB9DDAB37BA54BB2C0BFC32A6F In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = D109532BC4217326B3D25ED2D2F3F0D2482CC5BDD054218FA8BEDB91CD814F7FD683AA2AFCB8342CD34CE54D607E3DA0 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = DE64A37A7456638D3ACA1B895F4A88C26817177986A9F2F5B77B49CFF2C3E46BE2C49ABE89D741375DB87F4C898F6762 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 8D9743710C171CD399A0D712E9D53374ED8E0A97672A40294C74F0D503F0292D6F41D5CEA08FB3C623C4EBA56848770D In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = FAE998D1074E30F2EA0A8B9FE259FD2E2A36804995EBE7E3A5AD34865B1A3316675297FE8E33EEF8ADCC02BE8C4765BE In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 0AA9CCC3C9CAE1603D3DA5E95F304ADB8FA575833929B09F7C1095D968BEA0471DFE8AAAD3AD11266DAAFF95F6667ABC In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 8FFDF6A4752D17D496F8ADEE7116BD2AF0A4B726BB3F4C5F85BE2C9DFC34055A509E4FE016930D9951A7212553E2E908 In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = 278E83CFF1FF6CC4B3AC41F3879DA87AE63B535B43815E273687A4CC519855B452CB6AF0198BB9FD0F3E43739BC0CDD7 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = AA4B5A5FB94FE19578F33323BA1EEFC5B6ED70B34BC70193F386C99F73863611AF20581B4B1B3ED776DF9E235D3D4E45 In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = 3174CF3754A6FE603631ECDA4895171A9DCF7AFB02EB72AE270A9E3EBF2A65A72C3436C233FD4F17F7FBAFBAC0680C63 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 354813D9823D2F02D75D13893A6ABDB44E9E99666533429CC6F7EB3FBA10BF9ECD4A18BB9D5188E6E8F91DFDDBE8409A In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = E2EFDC5007E4C13F811043DB967A423DE02AF411B4A251A225CAD041E83BD4DD89D8B24198DA00096CFE2E1B3F5D1960 In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = E44C0856F0C245E002F914CF300E98C496E725A4DB561F2995AD9C8B97F341E15625B56B03D4D5880927B8574F5E5D74 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = 5D290C5DFF59A3A3DB8BC7320B8F64A4DBF67CA4F5DF9A07F235EDB6460345FC8971040481C9A5D0F09B62262B9ED9F8 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = FE680250CAB1FBDB6AC8800DDC28E70100DF8DAAE38DA27004872AB05D40B15AE93EB44266E3014F0960038B28252C7B In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 511B13E53FD353FA4D38EF0CF8F1AF30DA554828A5FD1C53EC41F73D9ACA6C54AC7972C933AF4A2FC7AB852CA63A1BA6 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 554CF00A9AAFE0DFC8D49EA03288B52AED43A5104E22B838E40FDE7358491B5774DF455CF2EC73C53A7B30627A142A41 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = C13C177E6453F78E81BC4EFEA7A10E9CA02273A6EB757497368539BF4AE1F1BBCBAE0FFF5DAD55EDCA61F474976CBF64 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = C3E5DDF4572A386C99F998E68FCCC7F85867A73E13C2058C18391A922416FD352CA6B659BAD021E0D9A05789F59D3C67 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 157481D0A24BA9FAFA1800C9713E702976167FDDF52367A7932AA3CFF22F4A2E19A016C7BACBD97CEC3EA6B1E87CB3D3 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = BCDD36EE35C2C771852E27DB2CDDABC155AB43D28E6289F0ABA4F93E793C999F30836C7483FBEA5A73F4EEB5D8D32FE3 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = FA7F66D37C1DC3E81BF55C443ABAD5CF79A3D9834F77A206291138AE31438B986737DC4599EC5D10F7F005D1833B7D2E In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 8F0E47ED680661F1ACE9EEEE855D935FDFC66B97C2E9A6FC7341F14D9327C8E72BCA3FA67E59804CEA41F09E1C4F8715 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = F105810E724C2C55162CF71721E3F59871F06010BC7F052AB282BFB6D4A3BF184B892BAF8FADD02070F64B9E036DC5F7 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = CBB0FCE4AF36D14B63BC72D37FB4028327843FB22EC033BFC068E7B081287E31E3451D8A1D97692B379FF9E6ACD40240 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 44E4F77C0D7BCA6AD57D334F974BDA8DE2E08E104F14A8713280CE73897A945DC23AD058533B85750D9DD9D2D7B5D1AF In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 6913184FAE1EF9FA2D57B1B7BD586D51DE9A5F387037266E7B4A83F4366498FF86C89934C05332A7E641149EF627FA34 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = F04FF5AAA68F2558586D2748587DEE3CF28BACAB5BE5F887D24A068311BA2D9E9BC0206C2706B9C109E7162E3ECB6346 In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = D4B8CFB2FE5B63BB5BB678B98B465A2DFD23DFF498E778EE0535A5C077705AA2CA2F039832BAEA0F735609B3E4E18CF7 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 25B7237DA9D40DE047D41A30BD37155C0F108D7296B09079957D4EE31224A4BA256AF756D154878910C158E49186728B In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = F41B2D02D321F4BA106F931EE27D3F74E8D397BACECB0A1FA90BF5C837ACEB2ED8F0FEFF07B7EBEA6A88D0CC54AE8E6A In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 9673A1A3535B8975CA0F512CDB0FDCDFB0179CE229E756AD70EAF1E5C3E1A4135E9FA7653EDBDCA4975AC18B17A662EB In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 32429CB1B5DAD663A0663E49033DB2290945019DF7E792CDFF3723EEDB88CD0603B3FAE0228A184F8EFFAC45112F453E In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = E91DEEBCD72BA12E2215602B488DED203A1E211D6358CADC6F906FBD89CA928F541222CBD8FC9A20B573EF22FC178778 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 45290A24291E81CCB8D7840B6C4812AC98983D7BD3AFE46B427296AD636862B9E03ECF605B114CB47C0207267BC05958 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = E6BB2FAF5ABB3EDAFFE9E47F62586409B443E4C698070D61FC082261053270ECDC2484AA0145C851031E3C99DEFF2389 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 79B792B34DA4425BB0B4217ABE23E5DBE4E87D3940E2F7BA52CA146618580A62545C44B81E06620AF6E273499073E3A8 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 9FA1D0AC7C37831731B71C19AC9E81EA115083ACE6D94349CE89FDB79B3462A749D76FDC93892F2F16AB0F7E18CDB79C In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 187CDFDB3757D80010D1E53157A5CCB0FCC34998EFC6BB3CE2E60768F5EEAA590656B49C0E036A3F34C9EF25F3BE587A In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 7043F54F390B6ABD0DFF06F266E0E7B3E41F8D2E8DD43F899AC456662447A823A567B1B0FB8C2DF24E5F6689060CDDB4 In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = D0CE0259AAEEA5BAEFF52929423C3DA07A8C75195F86D733A718D1C46A1E40AAD404750C41D7A158E79F278830B4C07A In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = E4385A3BE011AF20FE4566C1CEBF4AA68270E42BE50AAAAE65F8F605E980B1D2736FB0E794330D764CA96BC68B8360BC In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = C979F00656A09E68485CCF07FBBB9108B00C5FC11D41F5966FF086F26C7102478EC177EE6D78C623C375A9E6F761809A In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 36139336110D1D6C27E4CC1F26F428EB8BDBCBA3AA9FFDCECF72009FB46BFAF9E3464C48BEFA4745BE36C697DD3BED8B In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = CE3268B8EC923B3331EA2CF85132C0733CF8BF87DAA544F8EE386D5DE9FBD4D8AD94E00B705CA5B61A3C1790B650080C In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = DDC398879BD16FB681FAE1512E3A1AE7ED2362DAD8BEE0D12D2256B2D856282043DC0CBBC0F63197B75E9982A1DAA8AE In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = 350B4B2768020EAA95452B90414439A38BE03686131D45612C1B85FE06FD9196F27D221F4FF83251AA8E69AEF72F904D In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = 4CD1367112C40FB7E3919DF20697A4E1CDC55FD0F01BE3953B1998B5FCB473E76E9E75D5D82E2973B3DB89538554933B In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 878AD52FA09FD4B6465083C9C9E6A2DDB81302E2DB0CAA934D03A196972ADDD4BB8FF869BF0069E970D6BAEB5BBA9B79 In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = 60071A7E2ECFAF3B5B2E84A677FB98E44BD3725ADDEEC5C37EC62052D57AF7B687A063FD39C8F6E86F79D97F246C757B In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = EB929023D66AC20F11BF68EBC43069D27F35077A68D21FAB30854FFE53CBD784D7B25776D9F266F106433751E6C38A68 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = 6A51975C9FFEE8B94135A3BDA954DFE14E6267DBC9253F0BB04515A6B7745AEC611B7B66AE57D3FD3770AED4F412EC84 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = D2DC49C04553F09A8C3D7DB51DE890A71DBC10FE4E910C68BA5CA5DDB313D0A68375275C291B4DEB41F45E35A558BF77 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = AAB5747D7DCC77BACDE81A58C37764F8F41E08F2413B40D4E6C792CEFE52E4E2A406338752D7AD1269E7D5284FCB7400 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 72B526D74CF9521E00D9D6BCDFC1FB1760C6ACDF2DD75171305DB45D38098FF23C5B8ED3C21DA73FFB8DF7217CE46DBB In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 800CFA48B4647F7783BCD41B2C0F7F7D4D0FAA72481A2A42C4E9C43C9F62E27ACB4DDB73E318061D396059AADE4145E2 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = F782FF0DE7D5442D562CC500256EE4B5A00E885C8CD86009C53F337AE003854DE4B89794281A64375E3F696A415B95D2 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = DE34506AD69085C6357D62B0B127CE66E25E8EC5FACA5BA898C75CA19E9AF24F02406716C61A71D62BDC28D718C125DF In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 6F4FEEDBA0ABB4DBF824302250E6B668CBFFDCA0B8C338236FE02A8779D8ACA391D8D116B2BC43D40E736096470A0BC0 In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = A040CE1CBB996723CBCDBDFF7A6A5F69289737609534C5AF36F6C420A6ADFD570794079509D07E62566C58062D8186DB In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = FF13C29C5E0D746CA27AEE38B6B49A13C1B3D70E62875443BCFC22A22E75031E60D68A917E3AE1D42D374D44CDC9F4C8 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = 3A4418A16896ADAB7C6DC783A0FC9F8D7E949937BE1D68B5EF02574B2B0C9BA902FB9C15ED64FC825D598AAFC1B26347 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 17F84411E60F6BD856D09C0ACF314E7546466AB0C1616284D2240D22BCCC7240E5A2D656D35257AB49781BDABEF6FCF9 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = E577F79B0E05355B8F63EC1E639BC5A51A72BBB0ABAFE76D3133DEC4DA9BEF9A361F3E3C0ADB4C07E2757FE1D4790B9A In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = F78106F10E6C1F1CA5190FE541345145EE25BC51D3C1CBAAA04C0DB2A3BA2584DDD30F3A889B94BBCB9573CD9417574C In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 6F42FAF87DA65516FC0CCA70A385F26EBDAA94DF64AA5E7A3119AC18C6214E3D0B61158FBD6C2487E0ABFB0C6C85EF87 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 82FC97EE34A8FCC276AE1C8130555CC2D339AA6CB34003488378855529F9EE3AF819EC104DD2DE300AB7DBC04B2B4017 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 75D140BE47E116211F4F668E05ADD36C83B3E481DF9F28064A41898335D97C805471214E29C0B849875845C9B8DE25E3 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = 1A04CD93747CA583A58AB4A8C7C8C7A33F025EDE1B2DD080E5AF0C4DC63C8715E436DD57FF7F401DECEF813F330D6588 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = FB0626F2B189679DD998BC18F30DF82D0907B62AA77C8669E22B53860E3988503D884884163A561739254CA13929B69B In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = CC2EF9602F80D0734295C7C158EC366608CF60A423D0836644B60831A94E7EAF994C81F19174FD6CA75BB246BBCCA200 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = B5A7160112E0825A7C03643BEB98B1FC2549B81F01C3C4271DFF99BE57D472A7FAD133808D7D2D414D6011E9A2E8DFEC In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = E7B3118D7FCA9D294F596D820F468CD9027920777A41A706EDE877CBEB9517F223B268C5E805A374051822692E9AB44B In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = C3FA6C9D0FF231198AECA80EA428AC4B32C481D390CE4A90D0F65FF7D58F696C1FAADA1673D7E2D161462C95C2E2A310 In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = C4BD1157C093ACB27BD3BD7F444F836BFCBA0DAFE11675104C6437E5981442BE999C860DD6E1B75FAF6A553E907B61EE In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = D099F3C8052CAA2CF9751B1ED2D472C21FED667892BC1C417600A4C93EFFE88F1B17B36D37E4D26B9CD65ACB13A6DB6F In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = 7A9FE13FE3318121BABB340A3B045DC89D1BE2D0EC05802C9254FEC39EFCDE163C514DCDBA3FF93F9B097486C2012385 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 8AEEDE5D6E2F9F1C7A6644A8DA0F93574DF8CA33B2ED9D364615E1F9CF1A801315410733881CE0DAD2F6FB5A916A97E1 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 29E62D8C1B71F826544A0CBFCDD99CF8AA1C97E153063120D295EDF69E2ECB5A2783C66760D0F87BF944516824CCFCB1 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = EB2F1BF2D9EE857B189318DFAF49DC3FAD79501189AC9B5765DFB234EC4A62F0B0E34E7AC3F494D6F05C7BB86AE5CDA2 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 2A9CF2FD012B025616478CEF6971B6F9E494A63AAB5F53310DDE70FC6ED27F1E2D7804AEB8D206F641A73E054DA620E6 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 5F8E2DE742036B6AC4A7D8987B47C4C7A1CCB7239E1B3EEFD1116D6392C79177D68C66221F31D0FAED9134429B89BEEA In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = B0B1F4058417516A5C5A9683A5D72B489E6AD42273D591791D2CDA7360A4008E86C8899369946F7ABFE29BF92C9CA965 In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 9172AAD6C15B4DCD79BBD84FAD0601119D8B4E3AFED17B594FF38424157985EE27B65826B9905486E767E85AA031E07B In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = BAFBB3321C4798548F5DD983EAC1E16E1F3EF2BA5C9D69A340F6CABC9C7FE9F1FD95A692B7387342304945674D9D2E4A In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = A055E0A9C4575CD4D7AD84A240176F21ED68F484A269E0C9EFFB6FA93746E31F64B0B90C513D2B57EC78E9E5BA3BA99C In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = 788D19AD68D1B26CB0078389B45FB18B3DA35A57A1EC914273158EAD43749BF1AB49B1A68D4831CE193F5852D20FD96C In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 9C8A4F5BE01AD5AE0946EF7E9F5A82287B6344B966EE28BDEDFE4BD43D840D232054D5E216716EA4F80B457CBC110D1A In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = A29BCB89FD2B89006782088BF9A4AB939EABAFF6F4EEFC31B01A66B73CDF0B977D945E051D7E9F02F19CF32AD4BEBA6C In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 61D3B13728925646476D67C8D626D2ECE69D9B42503FA6A0DF2B24A5F2AB0FB7D74C2F1F7F04304C49AC94BD4E93FDA4 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 589AB9981D9ABD1D712D59C6863D850BB1D412D24A967D76CCE78FFC998F8C016DD4B115A1BC4DC49248AB5F758C215A In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = B3CC7224A1DD208E739C5528239B8D335A129EE20E59102621180E6B51714E0D60078F4E7328726434AE41CA273515BA In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = D33AD2A71C712A6F8AD9AC923966B4DB8C4818C79CC60F8275367D2452CFD2F5542FD1888D64C9E912B92A186842B000 In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = C12D450A020CDE18C24323FB4E3FB23255714B1D4CBF29719F74DA5E6151FAE901DC21A6680AD159FFB2E7C0AAABDF5B In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = E5B7A9B41FA0CEC3252FF95099523DC845C69B670D8DFEBA3E4AF6DEC659C4B2D4B04F5F7062209485A37C542CCBE7E6 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 5E2BA5382C357B5A1987BDAB9A2A0B053EB75EE770E1994E630F24015AB102E482A95A25B68F5DE99FE9748FA48FF696 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 0467C2B9F02AF8CEAF4F8FE88D1DE3EE03D78EC26EDEE0E34B6E7EE49AC357C35A9AE352FF4932D75E0617B8B0C61C80 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 87F9ECB906C9D8AAFA8DC62AF858C99609A8E9590BA5BC91A89205DE44F06AE7976A9BE918AAFC9134DE9029117152A1 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 510CB484B6D4B47A590F6211C7F33592246A2E05A1C69258B6CF9A24C1A3AFC2527841AE3FCD552E5103DD24743AC6B3 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 03F3BB45FD70966AC5EFD9598C480ED677C86C7CF00B10261AE6790C5279A5E47386F3D31726D9CB619B92A79CCAE25C In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 68A47C7D124E8AEA5CFEEF7A9D8CA7AA8DF6EEE6652DE3A385231F29BC4B983AEC8AF2A61329B64BB59A45B77A38E4DF In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = DD3BBA1B4F8493E0639151D9303835F492606E2DB3AF34FE65156A642794196D00A6C34A3A5FEA66202C3B5A79980A8A In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 50D3B02AC7B907B310C1C0105EB47F6DCF3AF0E473785DAA54D8037A9A3E74A5D1A41D811202F1E3C8A140173D92F60F In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = A6BBAE1FF8E00DCE34F640CEE2CDB5BCFE4382761BE36A940E50EEC12B5C2A02B2B6BE18A7C87A36FD2194C4D243EC38 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 7ED83EB659536B36061773073B148ED2117512372E49E0A3AEE48B96353EC936B32688B150C585944D2008F21366B531 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 2516E0015ED162073238996D5A03239087E01C2091F7B03637E6C89A758F565E45C908DE873E378CAA433BAF339D0552 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 6BAE42ADD06C6A20A05D845E7BF391F1EAB83E83A710A18527FC03646104E52A8B417CFF375753882081F31B6F2295EB In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 14690DDB5A48FDF382DBC745AD0330C1486124F6AD2E5AE4A850E38C264F99AEAE6F156062AB1946DD07AFE1700A8294 In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 9DA6652BA890007A01126F0F65970ABF3474C7659C6C80B04DA2CA592EDF0F399601BC0DAD10A0DD6E316A286E2338EF In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = B94D578DE79A437BEAD951E9AEE912540D0139965CF0142F1FD403534959B75D11E0B2463201B10364B905CF9BAA57B3 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = B85F56F69D3BE57A1C2AA553F90BC1B089E8F1C561881BE64630EA6BA4DD3BD5301512313A18C26DF3E97E056A59EDCF In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = 7D9508FB795811EA1442DB3ECB779CB0494736E7123B252CF88A9A0B50D57CF00B87A6C4FAC27F821CD55979D586AA39 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = AFD94B061F354B04D0718326D7E10A6B598CE31CC39C52D265D6CF04E4D9EE75CC200149367600312E7514A62F0F0964 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = EC63CE9DD979FCD132244BE11A45DDB1D00FC8F80160B8CC456F5C5EB89E0C3F675B28B92DD9E6CEFAA5DA57B4908646 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = 86301FE98F3FFABB0CB0085AAA1EC61BCAD6171459A8623BB780EC32E46F52649946A421EBFC7DE90F0E74EC787A3E03 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = DDF8D547BBA4F43D8864CAEF1B1BED77AA12E41F6886A5D8758C654B7EC1FA5B0E77BA4E7680C7830DA161E14CB1E65C In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 72953FE4CA34E717E304DC77AFD9DEDE32A8467127B9F78BB0BE6191A7ECD051B7DAE091B1758907DDA3B1D25C0C5883 In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = F36A9EE455066E562FB675F399D9DCC6BCCF68FD1B0BA9F7DCC1EDFAC1F1E234CB67B5A0F770E55435F75F9EC84A9151 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 37368F5A074DA0E5075845F76B1AC5858DF793EEF88A854C7DAFE3B90720707A145A5DCB0D9266C6148204CE693C5432 In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = DAAC83B0C5C8F8FC3BCCD259C27D964673B4DCA790B4B63899E1B6C19CC291FE6F88376281E0FA320ADFADC82A8FF4EF In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = 357258FA6579867CC0089C8B3C93CE10677A5AD4DBEEE2A27CEA90317ACEBE7254505468875BCB334E0B6F70CFE59082 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 06E9F892A2716DE18DAC1B8946604473ADE060AFC8CB1287E389994076FF92B4BAE3D84854470ED061AE31A97B7D0DCF In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = 64047790B1656E78953B981B1BBFAEAF9D2B1B8953AB0304791238393F3372C6373A1E087B57BE48806229DB73E1B1A4 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 9CA6F39087E6457E12C969D41C8BD66BDD6990CE23D355669E7606B9203D216811237955DF6739495D94F0C48CE02845 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = FE99F19C79A89080E2FF90981DDE91994542D4BCC1276A82D1A2E53850341B9AD5422CEAB81E69DAE5E91DC5FF60E1A3 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 92E1D994FEA2FD500A4B7F5139119058A5B70EF6174E553F12FE7BCFCA24B00A28391E3761BDCBA3FD6B033C1286E28E In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 6BFF1C8405A3FE594E360E3BCCEA1EBCD509310DC79B9E45C263783D7A5DD662C6789B18BD567DBDDA1554F5BEE6A860 In = 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195 Out = 86B7CC3544E5F91F12A910A56ADDD6B5E7DC7DF51FAECC2FC515EE669B5912DD116AA13052569EAB597CECA922B1ED32 In = 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A114E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B292D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C2527AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18 Out = E0100D6A02568B244DF7EA67F280AE5D956BE63836B02BBFE8875D6DBED16465582E5B4DA7A67602508C679F0A50EA2D In = 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A6961652676DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC004691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B4628027A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718ECAE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651 Out = AE559C732E55C521B7731E9C8065931B93AB5EF16728E3F3C738E7D507B18489388CC3CA7BA01AF672C22CB767C295D2 In = 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAAE17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4FDB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D51071BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493CD136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C3074E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6CE2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7 Out = 5975FA4BCEFC79FADC79CCF1254BBA9EAC252E24C7DEC7EB8972D265EFAD3F6CF648C49DFFF5453AD27D62FF867A2F03 In = 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD80F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5AA756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746DB6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9FAED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD Out = D8A18FDF0DBC4D9DC9A399EED833D258BDF4E06C50C12550B50297DDA05784AEE91F339766021B2CA6BE1577823D920B In = D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C313D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D73D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B21E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D51263B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978AE90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A92498D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6ED83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A790910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC98D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBCB88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A896771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78FA3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD5649FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8 Out = 96AC67D6C90BE81E7F5EF052C4CDE52C891F48FE9E387758DA5DCDF13A07F75DE17FC03C6137999AB1DE0CE90E15EAD5 In = 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB42610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A8988B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC82670939948FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED664023616B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC628140996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE00D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA9628381055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D599B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACDB178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF214DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3BA36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017C3A66CD4EB2DDB42EF85EA0CD65534 Out = 3CB4482B4F5FA15B8C240ADE9D99534E8D914A4C01290EF4B9417597431EDB1ECE456DC60B26FBD9C88DB5802D1CDCD9 In = 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA05418770F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF0445B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCFE87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E5544E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671ADEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC7283661D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615FB93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF199E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D29B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2CFBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AACDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83EDF9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED09253039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADED1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B965A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E1741553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E819C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48ABE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C640909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E53E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB46652196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D259C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7EF94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3DA8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6FE398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C213171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD46B568CE294C89 Out = E17A2A660782BD0EB57B463AFAA745F658BD6D073C56F69DEADB629D4EA93C1C3603392DC6D8414527A962AE3477FD34 In = F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E90449F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EAF977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0FA032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC0103CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F44120ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF300251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CAC2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B98320B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B0562B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1AF9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A463B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137FF9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BED133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68DA188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE897B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A7403001798992F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54CF7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA6983D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B52C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B04DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC099EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F9581DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F94E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169DC46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB000057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D00A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4BA1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441EC8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656CC30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D72DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B88DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B855845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F164678160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D6294FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D12089CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0AD12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E73EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A810FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1ABF6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215 Out = 74B19A3CC577847C757B08C2E19C9E9492F8C5A8EB9E983C68DCEF4AD4EE3028D2E626D343ED2DBE90906EDCBA513E8B In = 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB29647F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B6004DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FADDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE3903080A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBDBEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A2944384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E6222A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D3752889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33DB8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB22907F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD15C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD56495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDEFD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A8194989755D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E532A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D7785C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FABAA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C2153663B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530CAB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD8986EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFECDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BBBE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C28F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705CA27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2CECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D10CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246BD04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB09895CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E900200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A13EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398ECF3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BFEA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD43835033B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E2626AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041CB3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB5223191E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B2442B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42ABAD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B467CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB33770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F07942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C790245812113204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B09B7F42D193FB3E9C06329818251A2F7E6474462C95DED Out = 5531A34D8565A94B7357BA7171AE7EDD1E61ACAFC1747DBAC4D4C022B8ACC6649C8E44EC2D6455E623BCACF10C3915E4 In = 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F76316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA3760826D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E6939C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108AF1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE70057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DFCAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D009432DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083EA427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF0036D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A5952AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CFAE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF09772D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1FC070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665ED1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA289984103F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1ECDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADEB9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F621275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E816D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A31870543D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B440309989857103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D880CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD231B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB397EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3ADFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FFDF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A24924A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC2775833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA780703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF942815C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEBA3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D559D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD878C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FFE178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A65A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F9476D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFEE744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E2885EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB89B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABBF1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A864D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA725473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112FB2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA42F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE16318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884EDD768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B652467FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030CEBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF57795DABAF40687B2CDA7A5014168F Out = 978A5C74CAB4D5B773ADF64CABEC0DE036D087E041F6C1A985530C2250D283FAAA7FFAA0142588694E67245BBA56B9C8 In = 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D50752ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07CF488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A1076D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C405F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB0378391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB16700EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC33B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60FA01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9CE264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA14141AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C32958A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA75470C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0CFCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94FE43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE84E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D36257C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C9563844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CEFFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE954785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB78676E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FFA65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B23C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFFE6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C94650C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D02BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFDC2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91DF0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB507608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159BAA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC4245A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E13B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E14843D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F76242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B260F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C73696F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA81F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D3521720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EBA748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA15337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE723199224F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F710BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B3013839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FAF353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A350314B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA40FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF862EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB048CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389FA745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615BDE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA6069369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF1739C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B6575A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D23519730338D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34090FC9BC045271 Out = DD29ED9468BB12DE8F9CF64AA766B04477D659F032746AB4D09D56A540DB1A3D13F7C91B27FCE10C4CA8466F4A06C2C2 [Keccak-1600(512)] In = Out = 0EAB42DE4C3CEB9235FC91ACFFE746B29C29A8C366B7C60E4E67C466F36A4304C00FA9CAF9D87976BA469BCBE06713B435F091EF2769FB160CDAB33D3670680E In = CC Out = 8630C13CBD066EA74BBE7FE468FEC1DEE10EDC1254FB4C1B7C5FD69B646E44160B8CE01D05A0908CA790DFB080F4B513BC3B6225ECE7A810371441A5AC666EB9 In = 41FB Out = 551DA6236F8B96FCE9F97F1190E901324F0B45E06DBBB5CDB8355D6ED1DC34B3F0EAE7DCB68622FF232FA3CECE0D4616CDEB3931F93803662A28DF1CD535B731 In = 1F877C Out = EB7F2A98E00AF37D964F7D8C44C1FB6E114D8EE21A7B976AE736539EFDC1E3FE43BECEF5015171E6DA30168CAE99A82C53FA99042774EF982C01626A540F08C0 In = C1ECFDFC Out = 952D4C0A6F0EF5CE438C52E3EDD345EA00F91CF5DA8097C1168A16069E958FC05BAD90A0C5FB4DD9EC28E84B226B94A847D6BB89235692EF4C9712F0C7030FAE In = 21F134AC57 Out = 2E76D93AFFD62B92FC4F29CB83EFBE4BA21D88426AA7F075BFC20960EA258787898172E17045AF43AB1FE445532BE0185FBEA84D9BE788B05F14DBF4856A5254 In = C6F50BB74E29 Out = 40FA8074E1E509B206448FBE757D9494B9B51E8D6E674A67F53C11EF92E96C3EA08B95EBD4172B020010CD6CF29539A34D6BFA002A2042787AA8D879A0F5B54C In = 119713CC83EEEF Out = D1116786A3C1EA46A8F22D82ABB4C5D06DC0691B2E747AC9726D0B290E6959F7B23428519A656B237695E56403855EC4C98DB0CF87F31B6CEABF2B9B8589B713 In = 4A4F202484512526 Out = F326C7C126DDC277922760FEEF77C9BAB6FB5D3430F652593703D7C5E30135CD0B0575257509A624184330D6AB1F508A666391B5D4690426B4E05301891DF897 In = 1F66AB4185ED9B6375 Out = 1F5B8A6E8D94F5E2535D46842B9CED467C39C2DB323963D3F3D937E9DDA76FBC17072DDA2AB4771CD7A645145A2AEC1B5749BF9EFE0CDE006CC3EF8936438E0D In = EED7422227613B6F53C9 Out = 2AEEE7A720C030A820CD7BAA8570D72CB90B7A238C38C358676358A7AE9A5CF26635B2320D61C1284899E654F0BFDD0A3A9C343FFBD11838B57465E6C3AD3A57 In = EAEED5CDFFD89DECE455F1 Out = 7B1C1BEF3B4DEB4B4812C81A6E7B3F2C66FA95157FA3B9D2959DC56B8ADD100170D3C8D1745FD230A31F89FA17889C4C58946B5D746E47B71ED0394B66D1BDB2 In = 5BE43C90F22902E4FE8ED2D3 Out = EE41401AF509D6FC0944CD4A0BB29D2DCE0DCC862606E669E31381E5D6CECB463143645D696D14E40169CDC71C75686D6E8732B432092626421CC6CC196F80BF In = A746273228122F381C3B46E4F1 Out = 9B53B410B9F5DCE90A77244DB407A3D0F4898D112D0044A8F66AF933E26666DE63EBD2A4322D8FE525AB354CE9676B6A14D0CE6B3D24E6CD5832BEA0C5153CEF In = 3C5871CD619C69A63B540EB5A625 Out = 2B53FE6583FC24EE8A63801067E4D3BD6E6934EF16BC822FC3A69F4EE13A404D9A3CE2BB4A12C77382BFDE4D843F87FD06ED8AECC234A3A24CEDFE60BFC06933 In = FA22874BCC068879E8EF11A69F0722 Out = 80946CA68E8C16A9667CD8339D1C5B00F1E0D401D0ECC79458754794838F3AE2949A8CC5FE5584033BCA9C5BE62C7C08F402EF02F727CEFA43BBD374C2A67C52 In = 52A608AB21CCDD8A4457A57EDE782176 Out = 4B39D3DA5BCDF4D9B769015995644311C14C435BF72B1009D6DD71B01A63B97CFB596418E8E42342D117E07471A8914314BA7B0E264DADF0CEA381868CBD43D1 In = 82E192E4043DDCD12ECF52969D0F807EED Out = C37C9DC2E20D8E2F0AE588D7D45A807CCFA000FC948AC42A8ED63BB14F318FC3D4B963F7305980E6A0FD2316B55B63142373B1A29002264855C716C5C9F17F4C In = 75683DCB556140C522543BB6E9098B21A21E Out = 9073C62555E6095F17DF71AD02BABB9100288633898489B21C906A3190875BAEACCC83BE80ABD11466FEC371BA2C4623D07F0131DEFAEC13A8C732A9F8417163 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 23E9352856718E1E2D68A21D56D93117CED7628E984FF04ED8C0CB9B10539E4EDE284F94FA71BF4B83BBB493435FD6BE26EDDB09DEAC39680E6B05ACC87B8C4E In = E26193989D06568FE688E75540AEA06747D9F851 Out = 909D753426B1DEE09FC474F18CF810D5D5AADBF8A09AF495BF6C22ACA0C673021BFC5D2AD94F50B24E1569E956694B21CF2CC8B4F3C7EE4CF195E4424CC415DD In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 046C6019FC4D628AE0DA7092F9910F269B853D3B57052039AD1375C665405F9FD79D57579F42C4FFF249BB85AE65113A9F4276CEDE73E9CCB0C24753935A006E In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 51C909A6528949BADDAF1BA0B154EA9C33FDE5074359505B76D4B7ED54352DD893D40B142A5F802F378CBA7B8C3782ECF2A048542BE6C5936822214846A8D5E4 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = EFC8917E1247742A2D4EC29AFEDDF1E6ECE377B3D8AC6E58C9851CE9C99BD599ADEBFED657BAACD1793FC91B04DF2957BF6F1888869286002DC4AD9AC7F76793 In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = FCEF88BCC7EF70D8C3973429AC5139155F9BA643B431013F1817ECD2FF3AB287880F9EA54DF7503CB3F73D7CF2B87D2E9BDBD203378FAE74CA4BD2667A4AA706 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 470BDD8D709875C8E6F88591B97D6486C5F03B54BFC905757483E013F63A6C56984D4518D45C2D2298EADB44AF3A0C35A76B573D452F5747844D3AD8F84A2E85 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = 429FD438B390AD0224028975467EC228F9ADCDE71E1738005E3717C58F727AA2B7C61780BF0C5F8B766CC6D34551D87D22A130B8C215614204E607AA82FF8469 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 790A010AEB6F13E019A1DC35574B1219E74FF5DB6FBD8746733664FFDBCFE1CC6E8AB39117E3244C4FA3C0A962C9F50030AEF88E193E7E0D4C4747345F30CB54 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = AAF7A391600270F7B5A2A3BBC7474AC4154EBEAC03A790A57FDAD96CEA2D043C9FA5F6916790B92F8032D668ED9A07112DC5B2373EC816AABCA6F577CE60415E In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 3E2880A974E50F98BD6CC0F9D769AF348CE3B7E8FA38CF0CA2DA5FD704C9C0E57D5500BEA3CB7477927F9C394AA3F9BBC01824350291B9A0A0CBF094BB37DA55 In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = 48E55E0340F20466881A732AA88459AD4BCDEF364C3BD045AE099F953D89F15957AEF204265C3915BA42FE4235196BE3D0F564676227C3C0DEACFBAF68F9E717 In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 9D8098D8D6EDBBAA2BCFC6FB2F89C3EAC67FEC25CDFE75AA7BD570A648E8C8945FF2EC280F6DCF73386109155C5BBC444C707BB42EAB873F5F7476657B1BC1A8 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 1EAFEDCE7292BA73B80AE6151745F43AC95BFC9F31694D422473ABCA2E69D695CB6544DB65506078CB20DBE0762F84AA6AFD14A60AB597955BE73F3F5C50F7A8 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = 9A7688E31AAF40C15575FC58C6B39267AAD3722E696E518A9945CF7F7C0FEA84CB3CB2E9F0384A6B5DC671ADE7FB4D2B27011173F3EEEAF17CB451CF26542031 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = ADA5CA5630660003C4D16149F235FAEB78132F7F773A631F820CC5C654B08EAB4206BB4EA1389D1CF74D3B60B86E484C90C817CDB5DD5DBF327163B4646F7213 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 71A0801D32587980B09963A0F547B8B6EE3BADE224671BF44F12E3DA4F21778BAC37FCC73EF45FEE1C96688BAF9020F487B1A16E3AC91B504845D6FBA879134F In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = EBA678B7A0E5669DC7FA5ECA5D5F19FE625E113E5028DA5EFB138923CD444757B06078E0BA064B36C72CA2187AB9DD31DDA6F24668F46C32F8EC21AC59AAFA24 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = 12DF92D889D7BA0DF05BCD02D9DE58C97F4813126967FF78BDF759C66C4CBE9DF68AB31A0256C776730BB25DEECF91F0997868AC8BB86DF7A0FC110CB0A4DE5D In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = B8C7CE2BE4CB32C140E75B75474248C1DD77D19B0CBCA31A3ECC2A35C532E4FA3ED4ABBCDA27AA68A9DDA06B245443E5903A65652A94ED3AF15065D3E7736E47 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = A0AE9DFB56831FE4A3223C501B697BD8243C471E8343ACFD37A6B587FEAC74571C23DEEBC9B94A540A02F1B1E2251E01229C9D58C4279F155D5566FB18E81295 In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 631E7847124A70FE6EB293A44A25C50600B5E7E975CA9FAB5AE64AB86C7E42C912DD6EC093F01A8DEBC6E1F5E487AF97DC3FD6C53002765050BE963FFCD4D989 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = B989263BB4E0424F95FDC9A49C83A3769FBF31DCEDDA7E005AB5F22F43D2718DEBD39085971F7EB7822C9FA0F67F776CEC4E35A9A8B8C835EF4E9EBDA1922E4D In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = FF6ADCB9E1546798D396DB78452DF1A375B65EE3D54FCC915A8CA3DA693E24931999B0FC8A4EB92F6FF85E42BB4CFD9CE7D7863EEE709C9EF37642B696174474 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = 1051B7FF77274B784E7FB7823E756F0C4355047E489775BBEDAA7CE5A75EFAC331492C016CE02EB2BE8BA2FE6B735B9A1484E73AC06DE573C5D0B4A58822A36A In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = 5639A2824297CA099ECF2A81EEF1753F6314CB663D860F05A39E3E801FF82060BBA10628E2C0D9E0A84DD05ED637FC0B65BA03BB66E46FB256F2A5B28D3F41D2 In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 97F9D642507E6DD179D56F4B815E92D0D486826F273EC711B8F9CB76AFC79F900816FDBC13DD3A59FBECBA1F3B6953F879F27C8987B24C6FF8557A2C834076B9 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = AFEF2AF5A01B89BE190A0E6E796AA51F1F8C356772C6FC7731F08AAB8BD81AEE1287C70D564F4F169E37B07F28202A85F468281B4CDC1273CF61EB30E3BDCEE1 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = F467CCA67C387FFC9F1B173A084C451095D01AD0BF3953AC103A76F0F1BC86167305A926A941A53417F1611A505AAA205BCFCCBFD343465DAD8A6C1E80609A9D In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 4B389A2A0DF5E295EA9444F2739B5492F290C4467B0B4CDC1CC9ED2CEFA7A9E527E0627CDAF0BDA58F17D13F94AF7D2DEFF6FC5D53DD9157674475527FBB4F86 In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = 6590FFFB7311AB7DAB370FB518CCC19BAA9AF7C84179ADB002F8FACD3C44AF2830A84DF1E2C2402368CC36614A6EA22903063E57D00EC511A46A9A03FE3819F7 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 895796B2A0824C55F030D82E794925C38D8459F38CF848519F120FF6A9D5A03EBF006C3EA5021E8F3B3408FF12F01BCDDF7A085BA0A9A58944FEC1F554836DF8 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = E4BBD54BFB99D345471F8AB94271B4B748F5CE70C21C28AE6559E03EE7890A2C814043E624A6BD2944350756B37FA8208FC7473A67B310CEEBC17D965ED688B2 In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 80D862AD05428A299213E65B50310463FD22C505E693DD4719E0A120EEAA35C5FC1608A08D22E2CCDDECA49878BC26ABE55A3C9A546347439A942ED0C1A6A23E In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 021B3B392DECCB9075559F88C0C229026A2048CEF8EEB2D4F94803DCF2DA0A73E004D7F14E9FD662670B59229AB3883C340F4E3A8C42624CCB90BEC1156F95D4 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 97BF33A5254C8ACA27486428440B1034AAAFAC8B498ECB830C2581DC68518079B65FB0C595997693DDB8D68D9564EA98DC43CD287E2E018DB7DFAAAA205C547A In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = C05FD9C3FA73F80956FF1C3B89160EB520CA640E201B3FE5E6E296220E81B59D530476010D3784CA08692B8C716A3BE982B37450A96D30A401D3BA3C390D9DE3 In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = B980E657C13726DBADB6570EA3A9E633869CADB798EB35C482697A04CB712F1C1E8C5D0BD67E43E52DA294E82D5E80A695A74A3D27C0C672ADCFE2C928859A6D In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 6ADFC561835FDDD70A9FEB57C513165D12AEB3283F0DD7774DD58852DA9E969ABDAF20DD44856FA60E11BDFA2DBB7E3347669FFF7A57A8D8D37431C2B309972D In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 0E7459BDC857B949CC59A9C649B9625268BF9A11EA81EEEFA4ECDD410E2F6FD2C78289C01365F99034FF8FA8C115DDCEBEFA26A8D6468F5030E641745950061E In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 2A8CE9DF40879B24DADF61C9131F694E5531ADE6B7AB071CA10ABDD3C2E4A22C868A52986A329F880137EE76109770927D2658E63EB486D880290AC0782CF5BF In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = A83CE5A6A58376D57DB4C58DA1B46C131FF1BF8FF2DE5E8617FB37E5098398EDB53F9888B8752A8AFF19178F2F6BD7A33FD36C59E4A631906280907FC1C5AB07 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 9EBFCEA2DB1676EEE6B103119543C6049DEBD8FB8F1E01A5AB5B348E2919E14C8CFE8E542F2AB747B0FD4A4C3EEE4019BB046E24BFE2091FB9C65DCA527B71AD In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 97B08BE7653E9DF1B5AFA459EA750A3AC9BF3577BCC7E5344FC861184880926DEF354E4C65B20EC66C47B7AFFD3E7493958BAB0A90724D3D8DD9E1D561FA60C2 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = EF8AAF08159BBCB88EFAC49A33A5248B7ED0544960D8DD54D748A91C0D84C69F308BB54CB5EC97D3F81CDF76E68E0320815B93F2A00942F2168CBC18E8377708 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = C0A4D8DCA967772DBF6E5508C913E7BEBA1B749A2B1AC963D0676E6F1DCD4EBAA3F909EF87DD849882DC8253347A5F6520B5B9F510973F443976455F923CFCB9 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = CF03C946EB7022F60FB5439462AC22684E47EAACBFFE19B797760B4A24A5238BE9D90E17D40EA6FE7B2885CEF7DFB8BB489401CAA94F2DD6E04592E33E76B9D1 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 2C35F1A57A17CB29403A2B40FC307BDE10BA8F7FEC7B94E1E42EB4EEB952AAD00EC46A26646CD51DB0C6B238189D7D470E21C29BF8710423CB5602CAB75E29E7 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = 505E6E607C90C57BBE7CE52BB42DF3D90BC32DE554025730C84ED0F89A0132885D7A40FADFF7A4B01DE4D29735AEFE0E0469F4F172B62A0DABA889E152308FC4 In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 7BE2C95413C589EC5AD69F8D80BFE9F26540D5C1832C7A49A31A8F5655D9CE8B47D97C69CCCD693C211904142A5403DA7AD09FBDB825698FE201988FCCCD2BB2 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 8AAC9201D76DF13424A32552F04390E499B6168711B70C875789DDAA9B115F8B8259A60D17835E2587F8901C3CA782DA9AFB28BA87B9FCBE05A47A42F48FCD48 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = AA52587D84586317028FB7D3C20892E0288BFE2FEABD76D7F89155FFE9CCBF1A09FA0FFB0553E83F79AE58BD30A35FA54892B6ABA0093A012427DDAB71CDF819 In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 48FC282F37A3E1FB5DF4D2DA1F7197EC899AE573CA08DF550E61EE847EEB1D24C074FF46BCAEE224EC7D8CEA4256154F0C4D434E682834F6D827BFBDF75112F5 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = 6B4B0F126863552A6F40F45E295DC79B9BA2A88EA7C3B2F607AC1A8431A97844C2A7B664443FB23C05739DF5494FE9824DB80B7F3E67872142F17E2C5544E1EF In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 7EEC7B730056B1BD4F6FFC186FB45591E50CD93CF6E4FC958889F82D3F32C5C74D03A4BCF7D2754298F134698AF4559B0E29BAAA365CC00DB0D51D407179C56D In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = 79CB925ACA072EBB3B49A9D0E59BB07DD1C223C1F26C91768B929472C51B977F85C6CEEB54BCE89CF9FF6155D7FE8091540F1348CE9592A6403F92105477870E In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = B5D1ED8F039044BCFEF41E99B2F564F45991B329B503FC91FA29D2408512F8711E9DB66F8AE172164650545AE9E3DB32AA369EC47E81A77111276E6CA38E4D92 In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 782C008A9EE3DDA0A182267185C995A2AF737BA8CB2F6179F2CDF52505F8D933E712FC4E56D10E175EC8CDD62DE6529CE1F078BFA0DC7A5284F8C565182F85D9 In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 91A0241EDA8CA597CBB0F703AB7DBAAF859CFF77B20401AD46230CE3B2BEEF6685775DE37576014D8DA1BA672D47AAD95FB53C590B650634CEBB43A175738569 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 00B02DBCB7A3BC117701F2F159FC4492923C437D3369833A9BD09E78E260D48D37168D36C49777B2E68E6FE9846106A6AB8768C3971FAB31FD922AACB87D1CAC In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = 3DEDF819B357DFAB1C7092ABD872A1554DD0962E9944EEF9F7F8BCE830F2D74F1D9BA2B748BBC6EE0B7600BE8CB0FFCB79924D9F51CDB9B06BD6FD37F3050229 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 5FBE194557B0426F96BA60712176DF073EAFE04F2A50515455412EA3D80C116758AD952598F48031612181D82A16EFE4668FFB3BCCE9563A772FE416FF6DB3B3 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 2E8AB1619859C11473DC7C474CE8B0AE44B1C38417816FD95B9E0614F31E51EBB1DD16D1CBB584C4EBD28AA99F4A68E09DFE3AD462487F2608124B7528293045 In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = DB2D182BDBAC6AC866537E24712332CAE74DC3D36168982E4453DD6E009658345255013BC0A54FCA17AEEDCC4BEB79BDEE192CFAB516D24591C8699F7C758179 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 90A2C05F7001D985B587A046B488BF4ED29D75CC03A745731B5B0CE51BB86387C4CE34018A6D906EB7BEB41A09AFE9FEDD99AACC41B4556F75229C8688C7FCA2 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = EA3991C4A8A5F0146402DE4AE235054C78A48DCA340A7D4AD8753995F82347ECFC0054D64EB4F20ABC4F415C54701CBC61A7B239A7C221B833D9EA9F94B154E8 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 1313023B753ED1727F13CC67A64B989A8BF6548324DF9854D8D5A963ED3D860257FE6522B9C6D6CB1BCADF322C985601BA36F7E67110192094AA8F9869A458A8 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = 9BCA2A1A5546A11275BF42F0B48492868359C78D94785A0EE12DC1C3D70A8E97EB462148FAED1FFA4DAB0E91519BD36C0C5C5FE7CFCFF3E180680318E1FCF75B In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 8492F5E621E82FDBFF1976B1BEECFF7D137805B5736AB49216122A95396B863A0481212B6DABA8B05E29E287BB0E2F588F86407C84DBFB894E6ACFC6F6B2E571 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = EEBE4EC0FE3E0266527F4D9F57A017637EAB92377D82B15856A55A22B008DF67F27AA5AC04E1DEEEB2C819CE41DB07DBF6DCAF17A192A4371A1E92BADF1E6389 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = 9E36E6291BC2296CB4BA71109CEDCC2A3F0B4F1AE5E5406DC4B3E594551D5C70E6F814D2C9B8413103EF07535886B4AC518AAF7AED64ABED7A5B0A26F7171425 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = F1089483A00B2601BE9C16469A090EFC49FCB70E62AC0FFEA2D1E508083CD5D41DCF2DAAE1E0EAC217859E5FEADDCB782AC471C01D7266136185D37B568E9606 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = D063EA794CFD2ED9248665A6084A7B99051C1051E41B7D9DCB1537A1C79CBA6DEB4D844C6A618E43C7CA020D16976999684FEB084616F707209F75C4BD584D86 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 424A86D746C87C85DABD1DAE298A488E4CA2183DE692D1D01C4B7994EE5124F9004BEA84933C311CC38EA6F604A7769EE178E1EC160A9891C42C462A13A62286 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = A9403C26A96DE2C3D359EE29F3FD1C581154852D19AD12884B79E7082D2DA22EC83553BABA2BDFF2A2FA15947A8E6ACD5F5D113EC091BFD1962A0A10401D2C98 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 3D23632EE4C2D4F4118A02A677B5A32427C72BA54899BA2E6CCD22EC3DEFE0FCB052E3F83D35786CEA2080EED148A0A94628E735202E6B2809994C5F5BDAFDD6 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = D8FA886884CE577A7282DECEACF4786E7C68FC69B141137FF5DC7CB3C5F8ABC845716DD27397E8BD5CE245107A984A3F8B21F19F99ED40118621DC85303A30B4 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = C768CD313602FABB2193F9EDBF667B4CDABD57D5FF60BDC22BA7BAD5319EA04E7CBEC5D4B4C4560AD52609FDD22750B618951796376ED41B2A8EAFFDD9927722 In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 8562CE9399806623B2695712266AF3D4C14F77D2449143379246962C22398C813544A7DEE4C4847F09D3CBE437349B7FC6738AC97075B5DD9E2ADD6ECAA610F4 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 99ADE7B13E8E79AEA6ED01A25E10E401CD1D055884575EAB3E66B2294F03F8D5DBF72AB1AE39103189383EBFD2E43258510C124A894A793B206FAC752C035789 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = D12831BA39DBCD41F56BC7FC071BDAABFB6E7572D08B2FDA3BDDFC6FA5662F4BDBFA431CA2E38B18172709072E50120DB6BE93E86CB4ACE3C11DD0E1F3F5C712 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 527D28E341E6B14F4684ADB4B824C496C6482E51149565D3D17226828884306B51D6148A72622C2B75F5D3510B799D8BDC03EAEDE453676A6EC8FE03A1AD0EAB In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = CACDCF8BF855040E9795C422069D8E37B6286066A2197A320BD934061F66995227BE6B85FD928B834D3CA45E1AC3844D9DC66D61581E7799CCFDE008639AB3DD In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = F454A953501E191A12A80C7A5398F081CEF738E25D48B076A52F77FB09EF0BC2325116020BB06C2C585DA9F115BD9D8F13B50E8E1FB1664450FAE690B7783400 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 5F968CC6ECF71C588A3C3BA68858BBFF96861F66C0733FD61FA91A479A49618DF22D9490219DF8008DC78840AE022C5D41AF2B890D0214E562DA8DF0CB3F8522 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = E7149461F9CD00B71C216C50041B3EDA9707D7360D4C21740C44C212256A31DA398FE09708E450EA4E2826B7EC20BEF76CD2FBD9D096AF6F77F84ABC2E4FB093 In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 77097413CAA5A2D38259D47EC078871FA09EE5614D4C14FEB7A95C921C0AAE93B8737A6DC89E57693BE8A0710206664B80B657A1079605A0FF9664BBCB0722D6 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = 55D8E5202360D7D5841419362F864CC900E11C582FD0CAB2FF5F1680F6CE927B5379E27A335EBAFE1286B9D4A172AB761A36EADE60F10468EAC4CEAFBF63C7CC In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = EFFB03B497ADD6230A0ED99122EA868138644AB81E861491E526FAE37C39872CA731804A0004599849478A787BC7FCE21903ED551D7DB881D2A2C367B6168547 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = A2269A6EF2EA8F1CF8BC3394D27657B0DB996C55E7C47784C0B451202FC5279679D79E06F8DBAA9A63665FD0E914D13C6E056EA006DAAF4CB61D2629468E3D25 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = 5A2970D5EC346A8E4E1D5D1E57DC22F6875DDF1CE3626B49A91109E0DE991033E932F883B6A795016D5014E268304ABE2F7577505AAB00956911781F075D113A In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = 2B4356A64DF31936B27F4530F076EE73E71E4E48ABDE04FF1F548E0727F4A5810B71874187FD96ED510D0D6886AF11960A0B3BAD1EE75DDA4CDC148E162EDAE9 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = EDCB59984267BB00402A78F2CA345EF2494956172E10927EE63AFF23D0C834BCA50C47CDBFFD8995036307E9ED4B143E853450367D0E14AFC8490073653CD850 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = D0B453FBE709C69125DC8FE9E8AE9245211612970373B454F8656A755E8435B321DD3A980FA28719641747E254DC42C9BF012B4D6DBD7ED13020A83B44C504AA In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = FE97C011E525110E03149FAC4179891AFCB6304E1CFD9D84CB7389755554EE723571D76B80B9333A695884192340B3FE022D4A233B7AA8E8C7686745CFE75E67 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 1BC4AC8D979CA62A7FC81C710CEDF65AF56C9B652EEC356AA92DA924D370FDEBDF076F91BA4FE1EC5CD78FC4C8885EA4304BA2E8E64944AB4BF4D1B3D7DEE745 In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 76E970E9449D868067CD23B1A202CBDC99693FF6FA74BA644EC41CBF8FD139CB0F5D1106FCD6C871C315FF41C3EAF99C636288F0FCF6A40B480CB881D87E098F In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = 871666B230C5AD75B96D63BE22870621C68FD0899655BA7DC0E0E5299915AF252C226DD7217601D3A6880D55EE5A20B10820E21C74F730EEA9D47FE26DEBE006 In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 7E3EF62552B28A2B18A71CEEF2DD8659C8BDF291385AD02FED353775E01594F27CC28CC78663E17CB8B39FD4EA48D494AD0BD7AEE9277EC9B21E46523812736E In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = 0B87F6EBAA293FF79C873820846C0FCC943E3A83BD8111931FF03FF3B0BF785C961CA84CF3FD40E0D831DBAEA595498FC12DA88CC507DE720A35C01D73FC9595 In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 681BABBD2E351501C285812E06F20940FD865516CF028B4787D1FFCCD0D537705E8E9B73C608D5A8DC4F08EEE0902AC12936DDB8C7B29228C6AAF8D0B909C30D In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = C46D2262F186421D07FD740F922306D99B1E3826F6A32486BE5A91DC298F177F50915E17EB4EA2E45494C501736CEFB0E22ACD989DA41AC7BB7BE56B04BFB5E1 In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 0B3DBC770332823E686470D842104D3B3C1452F64F1BCC71C5F3FAD1C0D93F21EFBD48D73C7D4909227B06B06D54057A74E03C36D9C106EBA79411F1E6E1CFFE In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = CA46276B0DC2EC4424BB7136EAE1AF207BD6E5CD833691C7D37B2CAEAF4F484B96A3476FC25FEB206AD37CF975383DD522CA0CC6200A3867FEE7F178D6953FEF In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 815B44668BF3751A3392940FCA54C1E3E4EF5227B052332AFE6EB7A10AC8AD6438CE8A0277AA14BCC41590F6D6A10B6B1BABE6BB4F8D777EA576D634B0BE41C0 In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = F47799A8547FC9C07D0F808029E7335607D72224BE286E118657BD13A2C51D0374426D9EEB7693BDE5EC6181574C1404DF29BF96941862BA1A0A9A5903319498 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 8A0AE12A9E797FB7BD46CBB910076A32873BFFCB9AD98B4FC37316AED681EC49C65ABBB9586405FF96CC80DA4BB8FA73BE1BA9E737595B2307CF369D61BAF59C In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = A3C6D58872BAFDEDFDD50C0309089240D6977D4D3D59FB3F2BE133C57D2DFCFCC7C027296F74FE58B2A9A6CB7E5D70088934D051CBA57001FE27965CFA071A6F In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 11E0E521B55F02BEFC7207C06444FCC0C16DCF6F34962921B709A322F35E2193477B0DFA21F213F209705FF3958531A75D94346075FEB29A288B62E2315AE270 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = AEBBA57C8ED5AF6EC93F4AA45772FF5167B7EA88DFA71364F37D8FC5FDB7DC3B2C8331A08023F21D110B7D821E2DC7E860826235E7E6291912AC521384747354 In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 2DF1E09540B53A17222DAB66275CEBECEB1F8A5DB26B0C41F955FA0549F3367E82299E0CD673958AF7DFA04D741AA63BA2C1AD351764DC9228D215F22C24CA58 In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 8299CFCEA5F00C93A5EB8A84A13628A68B26796D53FB6A986C95B0B1C248920FB946D8AF98343D14EFC74A4611C53CCC27C5F14C7237AF28364346CA5CD70D1A In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = AF57BEA357FCBA0579C4204C0F8DFF181BC8A473014BAE78DF76069DE478B2F2A390327A65BDD24BE926551C78F70B0D5F1C8F4B970997D557F06336A315A749 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = B299E421061EF26C32BB4F50EE669D05FEB2CCBA3297289C30E6434057B3EA7F617BBBF7A5555328FC291F794987577F458350DF99AF3A5778300BE0BD80164F In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = CBDFB0D0E720F87259DD0D0B4E9C5319E7F88AAEF7F7AB2FA1CA639AFA0160822F96B3C357A4894CE53CD713FAB23AD052E8565FA3B3A523CB9CE39A6BD535CC In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 059A181C83A22BFF0AA9BAA22D872BDF23CBE341032CF0BF57997A4A1924D24FBAE9DCA14B6D290692B6A6B6344CBE531734F58AD0224C6E39BD1E87F870AAD6 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 9EDEEB10EE1B7BB8F16A280D8CC3EDA5E909C554419DDC523B69ECEDF2ADF3B3C9BC66FEF365342471C458126F083A3B8E7C0C9D9D77E9F90196B71F9AADF492 In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = A6054FFC3D81591BE964C4B004A3A21142365B59EE98B2873D488293F93A8D7154BF72100012C60D3C9418F6AF8EA66372CB4703F5F6381DE6D4B9B98CFF1E90 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = B0E54A12FDBA0738898F1BBF0BA81F81DE77648D8D14C20BDD5D90F300D382E069F5DBA7EEC6B23168B008B9F39C2B93FD742A5902A5E02728F57712D6A61D4E In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = 3CE96077EB17C6A9C95A9A477748876C6451098DBEA2B3261E6D75B64A988E1C75D7EAC73BC2402AFC726543E2A5BDB76689C0931FF762818DD2D3FE57A50FA9 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = C9ACD6D98A349512B952D151ED501562F04EA4BB4B8965812510B9B842531A2B41A0108AC129CF9C9517BE790921DF64AD1DFC0B93DDBA3415EEBAF0DA72F6A0 In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = 26B4E5C4FA85CB33359450E7F7158FB6A0739984565E9D9EBE6AD65B118296E9C1098C11541C871EB1B89853F1FA73AD8702EBF4FC9BE4D0AB057E4391DF964E In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 913BBA5C0C13CC49D8310014CF5AF1B63BA3D5DB8A27699FCFC573688F0E826FB5A7B5D10D3A1DE693AA66E08C0915E7278F61B5FA30F1263B134F016F74841F In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = E5D53E81866283179012D9239340B0CBFB8D7AEBCE0C824DC6653A652BB1B54E0883991BE2C3E39AD111A7B24E95DAF6F7D9A379D884D64F9C2AFD645E1DB5E2 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 5DA83B7E221933CD67FA2AF8C9934DB74CE822212C99E0EE01F5220B4FE1E9B0388E42E328A1D174E6368F5773853042543A9B493A94B625980B73DF3F3FCCBB In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 72DE9184BEB5C6A37EA2C395734D0D5412991A57CFFCC13FF9B5FA0F2046EE87C61811FE8EF2470239D5066C220173DE5EBE41885ED8ACAE397FB395E6CA9AEE In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = B678FA7655584970DEDBBC73A16D7840935B104D06DCB468DDD9814D6CF443FA6F9245824DBFF3AB5FFFEF24B29CB2978796F37E7B49B1682D59F79E3C169E81 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 66C64D5B0585DD8C40BECD456E4B0188061AE8059F03E79FE04C40925442BA93B052F52087B30BDBFD4816BBD148696D4FA6C61F216253D7AC178B39EC44C770 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = A7BD506DB9C0509AD47413AF4B0E3948B47C18278F15F5B19FBB0B76E2C1C1F19DB9438528EB6D87B0B4A509567DB39F32641E2944365780914296CF3E48CECF In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 2E681F9DDBD7C77EAB0D225E2AD1F72256BE239DF25933BCD6CEDD757269B35E2A5352B3298A4CDA0542FF7D3ADD2B0CF42F10FBE05A67C8763D54A78A43AEA7 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = FD9BE24763F682043243525E5E0780534A82AD5E83B65EB4ACAF5353313A4CC7C5EEA9DA141DE570232CB4126287E5C77657CA8D6A16B5BE53F470343E722FD6 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 14EA33BB33FDF0426E0DFB12DE1C613BA97141454C8971BCCE25C6D87A6C2403CCFAD1E8A6C15754C3CC5AC1718B7F7F1EC003C1B98D70968C5DBB95540B4A17 In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 3B4B395514E0CAB04FC9F9D6C358006CE06C93831E8948FB9BD2A863F3FA064E78EB57C76DD2D058D09AB3D105C28C2DACAEBD4A473F1FA023053CC15366082F In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 2D7D28C4311E0424D71E7F9D267A2E048AA175455FCB724CF0B13DEBF448B59B0F28265B0F010F4E4F4065004904A7C2687A5A1B30AB593BC44F698DFF5DDE33 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = CB665EC69ABD75743C8713034E9E41736F8C1CE2C77A8518E50388C411E6284D9AADCD4D3BD5A9EB74672325E41E8A67ACF380D1E8A61684F0E501F5663A031D In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 4515A104FC68094D244B234D9DC06A0243B71D419D29A95C46E3CBA6F51E121ABE049B34535DB3CCBF2AD68D83FC36331F615B3E33DEB39A3381DFBCB798FE4D In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = CEE3E60A49F7CAED9387F3EA699524C4CCAFD37C1A7E60D2F0AB037720649F108CCE8769F70B0C5D049359EEB821022F17C4B5F646B750E3070558EC127057F1 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = E6ED6F060906D1A772F47E83907507F88A151DE401ED79ACB56BE57C2596792DC0BC5A9DC1045E37C6A31DA1C36200214E4F5698AA2754EEB2CAECFC03BEC39D In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 9ED4EEE87F56AE2741E8E4D65623E4D1FA3AA111F64A85F66E99093BAED990FE1D788D6A4BE1A72A6615281EB45E1B6FB60AFEFDD93987F794084BDA962FAC7F In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 23139BDD84E9F43A6CC615F0F036199328D39807BEC9E786D4251B83B30800F9DBE8EDC0B910FCD9D9F204C2DDD4D3B92BC26A0CFAABE764BFB90A1444733CD0 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = EC69397000AED63CB7E86B4FB0BFD3DCEE8A6F6A1CFE01A324DA13484B73599FCD37AD392662D4C41D90BACA66BE4D6E3424EFD35D7FF4CB07CBDFBEBDDB7B50 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 2EA3EA00E6E9305CED0FC160E004265221306A2BE9613474126825AA3C3170AE07E5EA42F6B74F0B2C1BD2A6CD4D26EB1E04C67C9A4AFEFC1DD0CB57C2A9F4C7 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 6A7ADDB28F4F2C23CF0C264579FBA5F892E010689F837B84D006D91402FBFE9BA44B9126F8B5DE1EC6BBE194A3E3854235056A09901D18E8D6F1727DD430212A In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 2C0EE8A165BF88C44C8601C6372E522DA9ECF42544DCDC098698F50DF8E70EB7440CAB2953BB490CD2A5E0887BEEAE3482192DA95E5098D3B318F16FC08D1E1E In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = DDD4FF117231ECA0445EADA7C7F1D84686520DAA70E160C87DBBB3FB32BB9E2F4CC53DB5413D4E88DE18A0118570318BD6D0E5264D779339AC6F4F4A95546A53 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = A9744EFA42887DF292FC09DFEB885F1E801855DED09DC2F97CBFCBD019751878619DA1BC9573201C7CC050E2AA1D453E951366D81C188D329B3CB861C1D78F92 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 89CAE46246EFEDAD1147EB1868C23A6BE54F6BAC75F0C98A9AEFC6BF3CCB89AE012F2E88A9C838B55E57B232CB3C80BC3C2E9FB3FC9768C6226E93284E208BF2 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = E80A63FAF248AE762D13887AFE8E1954F97327EDD9641CE563F4148F9796669827B3A12B06EBD710D4171B86E21BC13360A541845354E0F4934E6FBBD7ACBF2D In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 09C10C4818A6821C170D6780D006F7E853E30FE2D9A4E96545673704EC0A1A3E356375715994E1AC1D8CB0E56DBDB2F77DC558ED228FB56EE62217E63455FD0B In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = D1CAB5979EB7F53C97DCA5D725D8B33008906D7759FD3EBB8401EE2FFF01DB895495A0A062D47F251BC3FC13988607C6798969D213C941EFC152E7DB1DA68E72 In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 96AD163869AE2FFDB89B96F4DC700ECE27D1F4DAAFBC5FB81A8E9513C6EA5E2B6A8BCCF4E49A294AF326F872740661629AB780581155810E492424C24F8D1DD3 In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = FD2E7A6E11E5D00278099EAF403054D617ACAC5BD3D0A4908191782C89F9217A3F0118BC2B284FDBCE803F66B78DD795EB18DC16BA85E19CB6393DC56C06ECCA In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = AE53776D969A9B285641998A9F2C70CA71856C956A3C430A32A1E03A8E08D544F16511A27CFA59F6B8275A2357F8EFA6544B1CD0C00A9460F47954A146429E49 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = D4748C8E17F4117BF2BF71557ABB559247552126C36192C5DF5C6C3E307D879B703C3FCD7099DDAB243E2F1D5AE5066990A7B38D3F2CD7FB115AA6D135E7261D In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = D8FF0481A63890F0E5A536EBBA2F253FA2CFA19C0F353587AF4BDC3190E4F8F54D17D665E8B2011121D444BFADFFF3E192D97FA03B849D63F36DB20F4CF88A74 In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 52D771B5016C6B1B93D3BF6A13F718A7B4741D528798609308B54CEA6037862D923751FDDCE10580A7D6431BF208DF17C1B825F7C7401CCBD6D806B744241ACF In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = 36D472A8AE13D1E70E1FD275117FFE34063BEFCCF6706FAB0816E1B81F7FE7F2DDB2A122F1F52C9950644659430F81BCEDAD5D833DF4814CF60AE6C542CC4478 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = E504AD7F33D65B8D3487B28805D478778C901C0AFF5F889AE95E2919B4F431A80116A8993469E822895F3C21A41D67AFDA93A5B29B6250F76335A76FE8919274 In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 1DCA53BE0A34114447D1C1443B92B69DFDED705956EAE60BBAB39178CCB11F526A302AAE83720652EF4C5DD450A3647DF7B77C4664717D935B4F5B20F206FEFE In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = CB1B03B180E04021E0099050EB6B7EB9092C5BD5C445E9D31EE39C724F038E9F619A96D3A2812CA7F208FEB2D074C3F817262F7504705623E635B9F273E37A59 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = F0482F098B93624BCDE1AAB58097198649A8DC84421826D1C1011AD41B948384C8ED5A97C64C134B38A0075812A35F9CE3CB200972C2ECDFC408714139B9BFF0 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = A3188426CEA0C18CB638BCC45C4337C40BE41F6E03CD2D7C4FEE26025C5CA281CFBB3AD1554D45EDC2EB03E2EBE3DE02F57D36D5B6A88A3C61A6AAEDE62180D0 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = 0B14693E6320668D64EBB3BF6EEB81AAFCDB7320ECDE80A245786D1B0A808A15C717DC8E8813BF64BF4AA57C29C33E913D6CE1879E52E1919FB83E4A208EDAA4 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = A9ABC3F554C1E717935D28C28E7C26AA9DC5BD6D7B02ED7DC6AFE21A0EA027A8801AE076F2872D08635EE81420711862EDC4E448C85513289438B3C8BE456B5B In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 04DD83D20F58E854D857F24720C50A4B5F83DBC8CABD460D379417CD4813772AA85591B90462F34DB3FAA4DCAE335FB1252BF41162E24975A0DBD308C41A4A6B In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = CE76B25C928CB75C09C0674E8FCD22089654182CD3D84B85CC44B186A8B1A7CC1BB66F389DA6D744A24A7B02BF5C85542D1BA8EF0DB4A86D2FC394471B396519 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = 02D1671981C2E85D0455EE85F41B8E9C32B1C80221DD432B8BCB5FCEFE0996F32FE9FC3EEB3F1F557AE1632750B92D05239AF857C42D59A3DAEB9629E1158BEC In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 6B8BC6211FE5001E07B7D20E0C49D314211E3893A39DA241B8839BB3A494F9A2FD8561009D22CCA1330A69362B386E715F1DBE6291DBEECFADF196DA47E53198 In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = D00E919DAFFF3D5E51AD3A3046F5E59D64B69CBCDA223CB28BC370201D2C722BAE74DFE0086B0EB47BDCB62FABEE870C3340D46E55D8CFEDF2DD3CED8A8DB3F2 In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = CF63F28F107A509A416F9A92C4E4DB4DBF00FB52C2E16D8BB9694E09F9142A904C34E1E960BD97B8CFB2C53E7660C79B841D1565CDAB83293234026A23A56D12 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = F21B8D45B6A857CE663C074C18CC54D914CDD5EB0D968E6153A5F70069345D205DDF4370EC473FC80B05F937D014C0A464582CB4A73B1B72041C5C99F576A41E In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = 92287F42AB1A2123669C4D35F18257D3A536445F0E4D2C801E99F8529CD9E2A79205982C280C7A6CDDDEF24CE960EC6CA9A35F590AEEBC40448C389E915FC4E0 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 74A9D8F9F72908C7502D1C41212CD86CF4344721A6F02D390346F2BAEC6E6137421E6516C3235443BC2337B3A77630712A12F11B7BA24B2D7085499BA74BCB90 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 7432861132E6894BB6AE5115398198317E12CC73C0C5DFC61CB189FF5AA9FB0D62224CBB1BFA8B105784405718E6F8E15E041DAD80D11AE507B33C15C6CAC824 In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 6AF4FF4C423051E3306ACE812E5CFA85532B73DEEF0DFE601D2630632389D0FAB2A109214D32508D2391775665B87A94D1DF29DB1214CB48DEC10DBD3D8CF591 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 4648D263B608CF28CA65B28A361EBB00E0784C65AB1D55C46A785737B6C8D83DD52E3367D898921EA36DADA42D893800D0BFCF86554CDF5E7630D60A2E8EE29F In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = DBD3732440010595AB26F84EFEB07732227A7B7B52D6FF339C7FF1B6442249202AE33A0AEF5167F5B0474D74A5B50CDB033D6C5C72894A3686FE6ECB36E357F3 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = C24D4054110889290CBC40B82AD8599229D8E86E4CE76BDDBBB6F5386223512C9D7E00973C706442B2C80EDD20904067AF8E4E681AECBFADC6AA15A2EBFE7DDD In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = 4A6404D278A0BA70488C18D7D1861CDE26FD57D66A9AFFE74F1E646E616003A52FE42520504AC4ACE5CA6665CF9155F44ECAA05D55F80FE9794ADE17871C5728 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = FFFD1B1E31377DFF00B492295BCCC735733B021F47BB4AFBA6549EA6C1BA3832E8587099AD0CC216AF5899AC683EB7C246871E21C30FEEF9BCEEDFC78D0C966C In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = 33C8F40E1BD1EB1A3A70D2071D27460EF0F6B2D3ECE373743842D6B928F3771E4B7446A9ECFBBF552C064F6B26095401097581C38B95E9551119A1FDCB3D58E7 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 2A11CB6921EA662A39DDEE7982E3CF5B317195661D5505AD04D11EE23E178ED65F3E06A7F096F4EAF1FF6A09239CF5A0A39DC9F4C92AF63FDF7211E1CF467653 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 9196BBBD194541FFEE7EDBAB970738BDD3AADBD6B73D1C85B580AFAC1232AE8077F743CE8B5B6F2B418B5134CCCD4F83645E8631885B14FBBCB909A9836C374C In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 1959CAE3600F128F72E1821C337D841B14CBBFEF3A6D22286F18BDFC3EF63528C11BFFA841A6D2208AFEB5664D524DE83090AB0DB07CD47EF52F4D2EAA8454CE In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = A913DDC5BB089C121FF093BE529225148DF787D48F4F61699EFF9FC2910282A898A81A38D66BE9B06428D6466A614CA822A872C1C2C4D503D434D3B1D6942102 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = F10B91564AD93D734743281949BACEF065A6432A455236F1BF798DE9AEC6CCAC9B8D373B07C5ACFBD676EF21E4A3A9E0F7C38E8756D177D0A5C283D520844B4D In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = EF26A1BAF33D4DE047BDD2CE34736E042ECD33AA569FFC0CB81ECFA66E9F87DA8D025ECBA24BCB187E4201046FB99A02DFA6F1BF88EC2B88DE216CF759FAC41D In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = F8E079A6DC5A6A7E7F32FF7E8015D1B26D43B54F166F2111CFB2B1EB238CABEE58630EF845E0DB00DDF1D800AD67CE7B2B658B42118CC15C8EF3BC9FB252DB64 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = A5BFAA52499A688D9C8D3DDC0BA06DECDF3829BE5D444ACFA412F4C6E863F4786BE9935805310734E4F0AFFE05558999807408E97E100FADD0C93FF160F8B11B In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = CCEA9FCF1AD93270AC4690E96B875122C5B5EC20D2CC27079CBF893126C44E0208A8BFA139057D72BD2638059EC8DA8A720499AF9D4C117F86799D7515DFC6E0 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 2EFC5DFE028A35503A25BDF8B2164D86CA7496B7C5DED09C5D414B6977ADBB4A6988AB9939D1EC65F46BCC99C1DCD5F19E035D8D3DC387361200E4DA80C80671 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = E80D7A934FDAF17DB8DBB1DC6C42E90E139211C2F599890C06B15D6248FDBE682D77D4E05F26D72852F7492BCE118CE7C36950BD2C50F9699BB47D89C3115377 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = C414B29FD07720F46C351F5C80BE2094E95D13AD97BDD1F7C5207B695693CD5E1E0169B1AA2E271115BD5171FEC51D04B71E3E7CE1618FBFEB382F56F65F7EFF In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = A4679A4CBEE6292203BAFBA8913245F30E046ABA6C0937B407C00B73D17D8D696690EE25BA1B39DEB3DB93525A8FBCFD88173BA9C7A65B4406D0550BA9B6CC07 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 5F49D6594DA939987D1906294B33A037F63C79E078531DFA7E6CE67279D4D5DBEB650FF8690F23B63B7E9C48EA8791B80FDB34EF66DCF0CEFE45842ECFF4AD1D In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = B77FB79669EA52C738E58A9EF3ED1501BBE7974478AFB5A8BED44549D6232FF8D7AA9EEEAF02F6755327951093243110D7BCFC0E51299DB793856B57A77E8420 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = CACA0FF43107F730A7FBE6869FBA5AF1E626C96303BE3BC95155164199C88922194511B24C48911186F647CA246427F2CE7BA747271CD8D7C5E1D127C21F1EAA In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = E5106B2A0D49D6D1E13E3323232101CEA5DA71CAA24E70EFCAC57E0CCF156CDF4C2492B03CE0E13437018DAB76B9C989883BEA69E849F33BB937A397B84ADA6A In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = FAEE462E4BCED12AD54D3757D644396ED9203037741661AEA32BCCADAE568C4BDC925EDA76610E964FBE3FB26B33BC0BC123DDF9B528715317CE5C92E00AC96F In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = FBE25B43E540104A3AADE897838C63511928AF5ADD4F952F1E6D4C39E70C923DF191FAA36F46B21F827D9B437996FF7206F73337CF20C6B0DB748A707455B420 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 0A41A004573E0A983FE9C93BD57439A20C8F99B800A60D4A07117E8D9B25C0EE38BAB3CDB6FC9216B8E07F0CCDD028C418EF97B6D7E15DECDE7425497644E2E4 In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = FF081507F979F69C6743E42EE758858713B570CB48FF85EF0D728C4E1BB5456D035E498C05EA4CEBD820E134BB252AC76BA4949A4FAD76871A9972AE2FCCCEEA In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 03444AE8319EBD121E7707B9CDFD1FDFD52F3D6B3D4BCB2748AF421A3C8666C22D8C0D8A096767B1CD16A8D54738C5F67A6F9D48C90827BE71691A42BE87108B In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 5EE0A4459724037B7318815A80147C172D6C8F8874C9A0057706FB3E300FE936815F07672E6447B771DE699DFADF345C3BB5974CF019315FADD5534DFF6A079C In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 54085A2F9C327E5D8EE225EFF5BD2C2837E44E8057CF1691E6202050079D26851061C4DA8D88FC19237E5B658950E66866E92019D9E425E2416240A59D25A6CF In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 3EA49B6ABD39CDF04BCCD648FB7E1F8AE3DAE9D3E3A5EAB9CE29BE356DEFBBBEB1BB93AE40D31CC1F011DCC6C6AC85B102F2654E2DBBAC47333BCDB4758A1A28 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = B3851790CA47575DBF988F82C3B501DC8390A8E8598698166167567A0332913CCC8868584DB4ACFB2C9DC0F0A6833292F4DCEDC47CF003217689BC2422B53B93 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = A710CB26C632F289504CD0039BA6AB9B4D3524C52B286D466E2F8939F8684E3F18DCA298A2BA67EB710997B7BB10AE279438B9B4868D0ADB248F282BB440A130 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 8F677A8089052B47BE60C0BB7666E403A5DAA5E28A2B632F2E496C587F1FDCA0EE33D9E78DAA4EF575B13389748B8C24110053B0B96A082C06C3F80EBE8DE976 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = CE631E6F2C2DC5738C0FA958571773B58AF130B94824331419EE57E2691CE5F29DB3D8FE456CD1E7CDC07F6105FA1B6FD729C2B419008CCD889169C3385DB1B9 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = FFF677BB58909C158EA677BE704253505B106AF934F639ABFEC63BD0C63097AA4BF032FE924149DD991D335E1C44C0220E4D13CBC41B6A98FB5A05FAA3FE15B3 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 451EE587226C99989F5EC10050983B1FD661228A4AB48618F1D1173C94FAC39ECFD3C26C16653633B26097E31A0F2213B4F1153A57CB48A70D2AF1ADEB1BBC06 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = F9D6AD8686125E71FE0856E806D68BA97EF123443938D28283387F33E3AC6E2A7DE042A3EE5F7994C1EECC5B6F22CBAE1349CAB2FB7A0A0125EC2320320858D4 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = F26F3268FD620FC476A49AAC3ED1580864934A2F6BA881ED8C8FB757AAAA64BCDF501E1913DE600BBEF6F12C949FEA8FD68C645086D5E30C9253588FFBD19BE5 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 080845D6FD22A00B30FA01A4B4F81FDC7B46CA4C6A676AD5863A9DBF6611BA97F24FB59BB5BAC4E376B3B8B3357166782876B701273FF351BC8C5805532767D4 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 2678A8715FC7E538522DD7608D769508B63017D9EB6CC48F1CB07D14E741066936C8316BF3211E09F62611E140DDD14A07F97F9F372E99C084FFE289EB302BD8 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = AA03EB09417435DA9E6E7803F3B6EAB66FAA3D59CC622950D61F9B962B69145AC2255CD752CB9607742092697B1A79D124817AE26421E61D1176764832ED354C In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = D3012F2FB56845B258D7598C0BBB2C97D53B602DEAE9326DC3678B2228454A1E29F28848ED140C70BE85CDEA9F99A8DC347DEABD46D362ED1AFB231146A0255D In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = B50C896F2CDF7F105DE751FF6CF664E592FAB752D652B06898B9B288052DF22F721AD87E702AF043E6B1E88929850CBD5698A9172C3932400B2538E401A6F081 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = A34A2F27C32F993A7E7007867733547481293C391255FFD0E5CCBE91E1CC749B13525AF6ADFA0C2D1D64BF87DD65B996ADA9111C5DF55BFF8A5742E54B8444F6 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = DD5F4B167175D9566DCA6C5B1B54A33D02EFD02E25E23BB6FB02D878A4415E5E8682C209BEAC04E9882A272D01E8EB435CAA5BCD74FC825C6B9082D041DFF333 In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = A43AE5DAD936697564AE1BD9B8624C5C31CC36607322AF40E253F10C285467AFD0D08252D2BAD76EFA52E4775C9C26761ABE38212855A80112FE02623FBF0A13 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = A5AC23D4A0D533CB9D8A68873F5CB749228458D43CE6BD0536C8733777B5E6E3F28FD36BFFE69002A0777BA74FEF22DE3FAC4C818B4842816C6094496F968555 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 07F3BCACF5F78816D515CEDF1CBBA4FFC58D83AA8687B0E7252FAAB43E7F59A7FF7415727ADDF9A22560ADB5755A2C6DF8C7E6DCACEB53106A714D807AAADBF3 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = 13A592B73EDE487036C8816BD6FC6CDC04DC6133409A6EE990584160518F9EF573264CF04D38A3BA75D150F4F026F6DF8936E13C8F4F3ECC9ECBC43FDFC488A4 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = C2FB590AB74E230B8FE159892F94DE04EF7ADAA02B918D4994F996538D257F5A80C9B3BE8F410170B0C5CAC3F507401220881C5E08D8BF0A13247170D39085BC In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 02951596A13A1A41188A4A1D6346F7EAFB60A2051EA67C63237D1A9B79EC4733F33ECEC223DEDD946B78387B6F2DF5E9AB6AF7DFBABAF80F4FCC94FA087275E8 In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 5AA4E32F0EA3E853929BF64ACC9565A01300BC007063B939F6DBBE9CAE0545EA95FBCAC32575AA0727EE4D937071E6B3BE74E23FE76FD63EC05C7F7D8A407AF0 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 495B2AA2103159D9A937E9DD56B059ACA98A5E3CB7B59BB690DEDC00C692E9D7A18614A73D12E07634B209CC630D1818B09F1076A941FF80474493E3D42B9812 In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 217B5A985BED80008274470E254443238C5AEACBC7EE2289F0E63B7AFE6D0F395E2361FD6D9DC33B4F54F03FF56F6B264976161D80091788EE9D262F147A35FC In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = 293C551E753BBA7F314DCB93A0FAD94F3F5DEE6ED45D765A708E6FD277601F03F6C905D7E1EAEAEC513CBBBD672B817F6D60FBF02C20167D7F4B7B84AFEEB3F6 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 89FE6314A0246EFF3BFD07A95FE239BD5071467F53799175B226DAF6C3DB618CAD4CA1C1AF64BF5793F03254F560E6335BEAAA86BCB9E961F214B2AE97B47AF0 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = 7690F703E894EE22D4DFF55A7F8D5021D5F17B729F95A59C4D55CFB225C67BE105F2E7CDF56D140E566648E9E9C39BBED96F985A6DAE1F21D8BA500F7FD40EDF In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 65E415C7958A47FCA9EED3846FD1283AFEB38E5130F57ECD99DCB21BEDDA856E3B5FB9F839E579C5EA386EACA8CDC0A9549EAAF6EC452DD6CB5212B709BF5C59 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = D6542A2F0654B9B874A627D3D53764A65B1DF2C0CEC3BCD0B4B088FAA1095E54F1799757C4371F8D544E298D600E21E11B2F90D295712621231A09C58B05A704 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = EC983E787628B94C87FFF8D57D2D058667D12F5AF458BCE79BB7844FB41D9C55920F593C8D8730EB8D54FF1D51CD8AD2F1C2A0F7D6B299A21266744E47D142B2 In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 81950E7096D31D4F22E3DB71CAC725BF59E81AF54C7CA9E6AEEE71C010FC5467466312A01AA5C137CFB140646941556796F612C9351268737C7E9A2B9631D1FA In = 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195 Out = 4E987768469F546296AD1A43D54C0A0A6C87E7E4E26B686612B1E5B1554B689BFFD56D6A4B454CE4A5717625BBAD321F8D05F19C225259646F21416AA2D7C2ED In = 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A114E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B292D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C2527AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18 Out = 3D370DC850BC7E159CEE3F24D9E915B5B1306FF403C32C7A3A3844F3FC8D90E35F56D83BDD9C637BC45E440E1F27CCD56B6B3872EC19101BBE31845108DCE929 In = 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A6961652676DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC004691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B4628027A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718ECAE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651 Out = 218A55796529149F29CC4A19C80E05C26F048ABC9894AD79F11BAC7C28DE53BDC9BDB8BE4984F924640867FCFCE42310ADFA949E2B2568FFA0795FBB3203DE65 In = 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAAE17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4FDB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D51071BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493CD136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C3074E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6CE2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7 Out = 116AE94C86F68F96B8AEF298A9F5852CC9913A2AD3C3C344F28DCC9B29292A716FAF51DD04A9433D8A12572E1DBC581A7CDC4E50BC1CA9051DDBC121F2E864E2 In = 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD80F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5AA756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746DB6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9FAED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD Out = DEA56BDABBC6D24183CF7BDE1E1F78631B2B0230C76FF2F43075F2FDE77CF052769276CAD98DA62394EC62D77730F5761489585E093EA7315F3592717C485C84 In = D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C313D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D73D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B21E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D51263B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978AE90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A92498D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6ED83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A790910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC98D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBCB88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A896771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78FA3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD5649FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8 Out = 6E010624E0C2589F52A7FABB75B077C86DF04E4BE6FC736DD00346231370A9A0F6715E683F9733226C6AAD1947EB466C7DB79979DD367C33900D9727BDBA24A9 In = 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB42610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A8988B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC82670939948FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED664023616B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC628140996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE00D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA9628381055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D599B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACDB178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF214DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3BA36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017C3A66CD4EB2DDB42EF85EA0CD65534 Out = 7AEE30930355718679D387DFBED08EB700B324BB2775BCFD11A88D37AA69A5B1B0010E8A5C38BB20E5E5DDCF5BB2436830DCE8DA2048197756FC85B20C16F0A0 In = 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA05418770F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF0445B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCFE87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E5544E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671ADEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC7283661D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615FB93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF199E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D29B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2CFBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AACDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83EDF9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED09253039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADED1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B965A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E1741553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E819C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48ABE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C640909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E53E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB46652196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D259C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7EF94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3DA8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6FE398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C213171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD46B568CE294C89 Out = 76583E740EEFB6394F6AF310AE896E1B2D181581165CE1DCC2317D7EB044677AC0AA6323B5B14243D0822EE49DA1C676FBBC1F189B919BCE8A0AB283D60308C8 In = F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E90449F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EAF977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0FA032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC0103CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F44120ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF300251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CAC2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B98320B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B0562B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1AF9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A463B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137FF9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BED133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68DA188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE897B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A7403001798992F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54CF7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA6983D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B52C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B04DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC099EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F9581DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F94E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169DC46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB000057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D00A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4BA1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441EC8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656CC30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D72DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B88DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B855845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F164678160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D6294FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D12089CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0AD12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E73EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A810FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1ABF6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215 Out = 68CFEB4AFC84FDE5B1A2F73A914C705BC211CAC69FC68189E3587412EA741E46FD230AF54BAB9AF65AD5322CB691B04EF045C15A187FECC7AEE9FAF20C8FC658 In = 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB29647F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B6004DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FADDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE3903080A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBDBEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A2944384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E6222A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D3752889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33DB8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB22907F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD15C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD56495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDEFD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A8194989755D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E532A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D7785C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FABAA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C2153663B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530CAB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD8986EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFECDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BBBE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C28F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705CA27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2CECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D10CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246BD04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB09895CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E900200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A13EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398ECF3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BFEA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD43835033B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E2626AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041CB3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB5223191E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B2442B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42ABAD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B467CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB33770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F07942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C790245812113204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B09B7F42D193FB3E9C06329818251A2F7E6474462C95DED Out = B141289FC8E97191C3A45A125EB29831C532F764C9924A5EC1755267E7DBACE68C9EC4A685455BE06A75DDFA80421F16A3FC96203277E3CB22543B9C07A94C7F In = 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F76316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA3760826D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E6939C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108AF1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE70057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DFCAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D009432DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083EA427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF0036D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A5952AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CFAE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF09772D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1FC070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665ED1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA289984103F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1ECDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADEB9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F621275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E816D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A31870543D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B440309989857103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D880CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD231B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB397EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3ADFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FFDF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A24924A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC2775833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA780703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF942815C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEBA3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D559D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD878C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FFE178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A65A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F9476D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFEE744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E2885EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB89B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABBF1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A864D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA725473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112FB2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA42F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE16318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884EDD768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B652467FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030CEBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF57795DABAF40687B2CDA7A5014168F Out = 29E5CD96099C4834FD0ECBE8132621D0345BE3DF0C7AB9B8B86D91E87FD8AFA0A4F209506B8D8FBABA154AC65552BE5F5C6BEFEA1DB664BC558F57480A3126B4 In = 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D50752ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07CF488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A1076D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C405F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB0378391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB16700EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC33B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60FA01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9CE264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA14141AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C32958A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA75470C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0CFCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94FE43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE84E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D36257C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C9563844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CEFFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE954785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB78676E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FFA65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B23C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFFE6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C94650C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D02BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFDC2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91DF0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB507608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159BAA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC4245A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E13B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E14843D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F76242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B260F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C73696F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA81F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D3521720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EBA748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA15337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE723199224F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F710BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B3013839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FAF353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A350314B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA40FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF862EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB048CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389FA745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615BDE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA6069369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF1739C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B6575A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D23519730338D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34090FC9BC045271 Out = FC4E8EEF8A77598A389BD58A31C348B22C6328235A39F1F097C06D189DFE08658B89C16D9B26A43D17A25F1B4007852CED212856059D8B5EB42EF6066C845850 botan-2.4.0/src/tests/data/hash/md4.vec000066400000000000000000000203001322470703100175620ustar00rootroot00000000000000[MD4] In = Out = 31D6CFE0D16AE931B73C59D7E0C089C0 In = 44 Out = AAE7B2D482382AAAD75FDE64DF8FF86F In = 0246 Out = CB386D6A1189CD159F4458A1CEF7B28E In = A7EEB6 Out = 1C4E79A284594FBCCAF9C67B4C41A7E4 In = 93C40129 Out = FCD8841C546F832310476AAAAF7E40BB In = D9CFF9DFE7 Out = E05B135D5DDF92FFB6E85F95E1B246AE In = 6C69618F2E04 Out = 9FDB803940A796F1A3812C3FF149FD92 In = 51CB4187084217 Out = EBB806618D65266CD195CCD4B00E5CA4 In = 7FEEC81F78691BB8 Out = E1C8A1F598A1465C30B180731D134572 In = D9F6B614968646FFDC Out = D27628156A0EF18309EC5085E67097E0 In = 747F01DF7F723DC311AF Out = FE1F19114FFA1695A28B92315F6911C8 In = E933B52C2E88CFA8E26F3E Out = 18B8AB7B5B7610CD6262A05417AD467F In = A1483E3BCCDAC94A9A2B1A63 Out = 39F0B4AD11180EAAE992489347AD13C2 In = F1C7365D2B16368DB23EC806DF Out = A2CF9BC244949E0B9917AFDCD0EACC65 In = 8DBAA281D14C19F35C2AAD537F7C Out = F2E6FDDD6568EA8AB316111E5946CC9F In = 785D55E2AD30E4960E6AA3482B648B Out = A01DA0D565A3753717D1D81ADE3166B0 In = BEE8FFE30FCF0BE745BA22215B320F66 Out = 68A5FF4E4CE33D50E8F42B49505279E3 In = 28BAE5F8B5ACD3BE26521E0CAB1C9A6541 Out = 93B775F3BCCA2F2BE24D5CC63BBB3224 In = 2A7415DBFDF5FEDAD4E8DCD96543FA6D03E8 Out = 2BC3478938FD5EF823D2974302E61ED5 In = 285A585DCA6B4B4D59554C80BDF8B19491984E Out = C7C6E691B1785C64D8CEDE5B6F6B98ED In = C7FD53B9E39B4A447442C45B7AB3FD0602C57DE4 Out = 3DA2CF785958E6C115D8843BEFAD1979 In = D83F308D3AC2F0D82C3E69A08CE8BD97AD02E3492E Out = 82F6CA7BB64799BE36AD89714AEDEB83 In = 936800D2940A8A22A5D54804B451F59668FDE5187416 Out = 6E4F874F35C5BD38617A31F9EC693B44 In = C7D740B0DF155D9C1F11D1F6AB708A22FA1F2146D48953 Out = E72B78BCA0A764CDAD13FF69B48B2A8E In = EF7CF50DFD9B72E8CA0099BF631BB334CABDF76192CB951A Out = 9E7B7A7458B016BD68736D1512995585 In = F5A46EAEFF6B9A9F01653E35E90116342C470425CAF7B942B7 Out = CC032DAA2546C0C2BADCC0BD77EB12C1 In = D8AE0DE315E449498FEAF2FBDB1971A09B7BF658AA70AC782E15 Out = AA1E5DCDD854DF06B715DEAB33E62E0D In = A1EC5E04538FE815D26B6B3BD9A889A43416F301064B15BCB480B7 Out = CACCEDF21D2BF863F1F4719B4B83F18F In = 97EA99966751703402F57A2B5B6505BAFD1C440B8147C87EEC246F0A Out = ECCB8D37D12527CBA6D493169AF12159 In = 01864FB76236CB325D893BD1C7778E017284ABE61217C9B5C6B41E55A7 Out = BB7EBA4B6592A688CD29C782FDB74EB7 In = 976A837D0AD29D030D376C3D8BDFD37F4E0AF1C4BB72B043EE3B6AF44AFB Out = 4B814B19C0DCBFA31405AB495034A4EA In = 6E72B873F63F61E03EE166E6E988951ED02398094FB6DB178B2AAC3A56E248 Out = 95BE77F915BA362E80430F4911DAEB22 In = 894B431AA20CC3AD8CC34C95895E0BC2DE6599FDDC863040ABF7735FA2128905 Out = 4CE468F58CFA95E789D74A47FD8BA37C In = C79F893B67218FF1672939A1BFE5F7E48A5E81E502585DAA16378B95F853251EDC Out = 777CF61193AAEE17EF6B68B5168AFD48 In = DA074189254813206E7A3F4483CAE746550F5658A8287D0250E988FF49E3EEBFFA81 Out = 011542927FD9263EA2CA86D668DBBF10 In = E881A6FEBD17422B451CA7DBC1D4A7D9878970CD3E7FB0274247654279FF837886C68B Out = 2AAA877A05C4D944ABF15C603C8AB6D0 In = 0ECF376EF3EAB389E65F415D4247031420792C988E47D63A354481B52C31ECD552728A79 Out = B817B64F224083D701A6BBF838AB7796 In = 888941D7E809DFDDC49BA6B2EE804DE1AFBA451126F0CF8B9BAB1D04A78EE28D98A4A90288 Out = B320402832D24B4EF38ABE044B521EF4 In = 9634A438BD14D8DDC3AE525A04C37E7BCCD803570C1A9123F714614B365017360FC50F280936 Out = 8DF996A89A7D2BC860ECA7FAD90B34DB In = A9B5ADEC5616B4BB3DC89A5996A4977DA8C1AD36910143C267ADDA0BD80F9054F4DBBF02CF585F Out = 98EC309FAD45969BF125350868669D39 In = CB76A9EA278044A520757E020ACDED18A5417D096796B8E8119DE09ABF5F17F95E826AD61E39858C Out = F29AB28DC618F5E4FB8525387B00836B In = 914502535D0F05A72A316F15BE8316BF9E579EDE86C591B8037D1EC036D95F8CFEA265032029F6B696 Out = CC09BE6F76C27424ADA44C52554F05AF In = A273736D5BEC5C75463FEFCB2297388BAAF202111517DE2506D331BF7F560E020D347848C2A1459423FF Out = 9AA76F6791DC4ABA5DAF67B4A62CBB47 In = F6DFBD94D04077E328166DD05FF54E6C7BEF77E104648951895771BD4897B2B7216EF6A66A7B18BEC8A639 Out = A90B980820FF501957009DF700451D78 In = 6B5B94AF15D1F60A181925BBF0372528964F79D5F2AE04850AC53105D9D732F3EF699DFE26FBBDDF43E17CA2 Out = BADED5524542AF6A21F796EBDA1A096C In = 520817840BA40BB5AAE8709ED60F89D7642BC81C7B7D68A52566E353AE869D0EDABCD8B3CFD3200851AEC7F632 Out = BE5618463DA165C84B7E1C8307A5A301 In = 3F793FECECC4896206D2A3F960394DDBA4405615D3DC17453036958DCD2042AB4B6FAB256522ED1EFD38C22D9FDA Out = 9914518E9351F15DC4D60B243CDA1B58 In = 2F859EE93CAF6F3944D1AED1194A53C236D95B721FB892D5EDBA47CCBA6D95EBD4985086A8E3C0D7E84831C41ED70E Out = 99C81ECD5B50F43DE3385A9E0D482CCC In = ACCA7AA450D9FE5AF957C5C9FC152822D0A7FA9322B044666B3264ED488656A805D9FD95EC243FDBAF0937BE9460D77B Out = 400ADD0630AD12EFD9695BB69AE126CA In = E84D9DC677B38B6A9646D2648441E12D7DF7BB3DC0AC0CC20C2783CF0C1C45B932729C33042D0B013B562DB482D50C24F2 Out = 8CBECF75DBDAD10C9D480579B476C6C0 In = 07C14E13B62BB89468ECDA029F66EA279EC9AAFB7BA7C80FFCD9946F88CB80F323177B77C65C1CE9397775C980A02B481C92 Out = 320C6C79226261DFA3D2B9BAFC51A3CF In = 7F999F347589D4E2901BC1CA533E8DA0D3BCFC39564DE20FF0537759CEC5DB807D6EB2C9D4587AAD0297BA6CB0BA6BD436CAB0 Out = 0FA0F71F8E8B9F47A966283F3C8BA4E3 In = 3099FBBB801C8B27A26B549FE23A834966A9AEB9C59EC76E6EAC7C20D934370C6B423DA31582F8BADBF3CEEDFFE69D3333A8E15D Out = B2CE84058F967E45000D287500C9D81C In = 839ECEAE837ADA0AE91E52343B095B9CBE6E1529B090677C36F4CEA1FCACD106797788954417C61F951D678B6B1E8EED9FE7E0D2DB Out = 7498590DBBF71F17EA3F4EEF7FD68641 In = A4F122E71DAB34E6E35A27BECA6F3753E9DE662FA23E4B6492A1A0145AE3CA7362F01258670B9C955F55A300BF2F7D22B0A020E5CA15 Out = 98754DE80336A4BD012F8A05617532BD In = 6FD5D1E011D2C155BF4CE63FDA59BFEC91755D6DE6F646CBE774BF96FB8463B8C8806BE81F1238C5F9AD1F77A2A277D2694D12C3E5E9CD Out = C31E7ECCD70786BA1E2301239E2C9EDF In = F1B68A476C7738A656E25FC954AA7A42CB7E6BDD3142523F6566CF5B838D13E0E011263407ACC6BD74B0FBBEB9B918529FC5848031896C0B Out = 90FF6B4BEE1A2B833982850E2F06FDEC In = D223A6E65743997A871BE50E918F03AFE9B9847464A465BE1EE852BFDB150198957695F18A7928B0041575BCF5A095B3291242DA05D766E1AE Out = 72C28BAFBEB177406866743F1B8A2B6D In = 784743D4AE588AFBBA7425AA095A1E757017EE0F126683CEA69901458D237A7A69CD2235FAD6A1DDCF1E4FC98017B3FD2081BFB6E3F801B46FED Out = D956EE28E490B90B9C57CDC723A310FB In = 3F18CF84A687A40725F32352824C9C2AA7444A4888E68D6892C8778D478EF4A5D97E64F0D4D6D2C8A20AFEDAE41F7FB30EAA293AB43DBB16FBD9AC Out = 51678626D21DFDF58AEB6B35E977730A In = D7BBA140CA4D4C398732FED7CCD574C326FB498E8750177DCC9347110E43C82B9CEDD9A3BE266A6F93C1D5CFE5C6EB2D2768C5841F562EE01A4770B0 Out = B9DD09BA8E4A8B4200E943F928420368 In = C6B516FD918CA874B08B446C7F421AB01532E12D4ABD34CF1B7E9AB6B478D04D21D398C9E486223A803003E93EA6FDB6323FA52634383D5A9E43FAE4CF Out = 6D14138691FFC136B97C432E88AE1957 In = 4C4E1022271853F9FA261C3A52BF46E806A73ACB3E3AA25343D826B5291BF5DF171377D76285273B2AF7CD2E50A3D5D2BC08742817A29851AD5BD1F8EE02 Out = 15AB1275F436B96CF1BCBFFAF15E6EBC In = 3141EAD348142A07B4B7853471FA243511F1D8E6C633EA25BAE04CDA97B1AFFFD0B647131C67040986EBE78E86D89F1C86CF591365F7AB45865EDE0628EEFD Out = B58A8F44BACCC511DE13227E98A69F3E In = CA547E696B455522A16EF1191F8C39196BBBF6EABA00693B69698DC1344416F6F3BA1DF367B7EAE71D48165678F7C78B0096D6DD5EE2E7EB618E85758392EB7F Out = 8391004470075BF3CD8858C492E7184F In = 2FDE680648A3CB7210D74BCD690A5F03B1DCF7EED861DA0F4C4E3FEB7B6B7D4B4988F5605B30613B87E7DF8D3D6050721BE4F6FF0674EABEF58720685EDE942F82 Out = 2CBBC00DD0EE6EA828221934A4605A93 In = C6E48AA0604F18E1F579BC827779B850FAAABF96327FDACE8C10BEC830AF1EDEB2A646A5143AB342B9191FA5B02A581C4CE68880608B9D37120C2EC560B4AE309C94 Out = AB6200335E0B4DDBDB719BC4E36DAA07 In = 84600F3274F4ADE17F1C8C7AE3CF650D861269DA9079F2474DB121BD29FFB9A09D8644A62E8E88C369722FF09108C430C8FA6B0E9EFF4DBDF1F353E1D25E5661AA3E92 Out = 526A127BE8518E713CEA69D5147E9382 In = Out = 31D6CFE0D16AE931B73C59D7E0C089C0 In = 61 Out = BDE52CB31DE33E46245E05FBDBD6FB24 In = 616263 Out = A448017AAF21D8525FC10AE87AA6729D In = 6D65737361676520646967657374 Out = D9130A8164549FE818874806E1C7014B In = 6162636465666768696A6B6C6D6E6F707172737475767778797A Out = D79E1C308AA5BBCDEEA8ED63DF412DA9 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839 Out = 043F8582F241DB351CE627E153E7F0E4 In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = E33B4DDC9C38F2199C3E7B164FCC0536 botan-2.4.0/src/tests/data/hash/md5.vec000066400000000000000000000243671322470703100176040ustar00rootroot00000000000000[MD5] In = Out = D41D8CD98F00B204E9800998ECF8427E In = 7F Out = 83ACB6E67E50E31DB6ED341DD2DE1595 In = EC9C Out = 0B07F0D4CA797D8AC58874F887CB0B68 In = FEE57A Out = E0D583171EB06D56198FC0EF22173907 In = 42F497E0 Out = 7C430F178AEFDF1487FEE7144E9641E2 In = C53B777F1C Out = 75EF141D64CB37EC423DA2D9D440C925 In = 89D5B576327B Out = EBBAF15EB0ED784C6FAA9DC32831BF33 In = 5D4CCE781EB190 Out = CE175C4B08172019F05E6B5279889F2C In = 81901FE94932D7B9 Out = CD4D2F62B8CDB3A0CF968A735A239281 In = C9FFDEE7788EFB4EC9 Out = E0841A231AB698DB30C6C0F3F246C014 In = 66AC4B7EBA95E53DC10B Out = A3B3CEA71910D9AF56742AA0BB2FE329 In = A510CD18F7A56852EB0319 Out = 577E216843DD11573574D3FB209B97D8 In = AAED18DBE8938C19ED734A8D Out = 6F80FB775F27E0A4CE5C2F42FC72C5F1 In = DB7BF252A4641FCA34866BCD5F Out = 6EE7E13A9D83DA498EC31AB7F1AF2F9B In = 8D62994630AEE95D4C2F192B3F7B Out = 7BC1620BEBB0BA89F8E51454A2F90421 In = BD68233EAC90E380907F13A3DB7A4A Out = 529961E476F563084D25E0F981CAF73D In = 8DF425048D0BC1CA3544975250B956CA Out = 5127AEF56B982E136A90BB0617AB89DA In = D18ECD6B341CF10DE7AFF3CA82EE04FFE8 Out = EBFD075F46B974E971971CE09CA3960E In = BC66823C5C3B9328940D2C1312B90DC92205 Out = 436D62CA86CBE2D645B728C3A3D012FA In = 247E8B8F71BEFEFD1B001D34362851B71C2C5C Out = 69D0CC38938B60E5308F62748C91FA78 In = B2B8E155E9409960B216FF533647F1BEA88DF5E9 Out = 550C07A2545183EE4A46695CDE92CEFA In = 87BBCDAB47CBD7A8DBFD46175E901B2F2014D2574F Out = AC1E96028760970301A2201C02E7BC2F In = E68232740643E72213C7CCDDF3FB6BBBF8FA91318E07 Out = 4ED55A365805C916A7B476F29161BC1A In = F0521C42DB4D92770C7BE97BC3BBCCC13936A72FB0ED94 Out = ACE41D10A5771692320E8AEB0C6EE308 In = 9910BCA80E2A1E98D16871CAE15129D0E372F07CC0076C6F Out = 349B05E073186D50B8E98581C90C6254 In = BFAFA136A48F1DEB19DFB707E34B495FB1C72CEA1DF6F47993 Out = 31BB7F0CEE1528BE4FE0CCE8D140F622 In = DE42D4B7A1FFDA4F086142F8D9C9A29F752A348E566F8CE53FE0 Out = 6D7E9235A586970F8670FCE5FE7A4178 In = 45BDEEEF37A626381FD30D7AE7DA9DDB4AE8F5F17E919A8286AE2C Out = 9D1D7ABC247166C9508BB99934DAC532 In = C5661640140037B16D5C98DD120AA50FAEB3548ABE84906DB82E0228 Out = 0993CF5D2A56DF4D47F9FC2DD48F62E8 In = B5B9EAE5DF6E2191C154D7128A2286E9C7E682B24CBC72962470BA89CC Out = 1BE6103887AB908F155C0EB3968F9E37 In = 264A4620BC5429260CB2DD0BD1639613F9AB513189F54467D46767B737F2 Out = 828B112BCEE9225AAB202B54345F002F In = 03BB178060230719B7AEBD628334EDCA158D062F3AEA6C0073370831FEAA32 Out = 2C07E94CD50F9DDE6C9C99085573F6DC In = DF9A276CBECC9A28D999A67BD14D28E1C5827DB2F0B0D48BABA57F07BED49752 Out = 3D39093BA64DBD00C07183177CFB4F18 In = 65ADA2267A286CF3490F5967574E707FC3C03E837D689C997B9A634E5B4710119B Out = 50C430128BF7499760DA8164F4FFB71B In = 2954D2628C422A02C1B8A9D2950D177B508FBDF57DF94BE3447FB79E40B2F65845D1 Out = FD9242F1604EA977F5DEDE760AA9319C In = 053F2617C86E5468D53D869CD260549392C53F6A7D8429685B86AFDA12CE4B611386ED Out = 929AEEC5B56780EC07B1455B1D2E0580 In = FB55D0287923FEE055AE96937735BAAB47E488E3C24160E13B5FE2D06534A2E00F957FF2 Out = 35C6713BF2E172D0A30A142869EB3B9A In = 38AD3FEC103EEA5F808779233955B03EE4E7677A894A8159DE95E9FDCE9BC57D919C13C66E Out = 73E6A3F3BF0891DC4FA050936FFB702A In = 765D5F0B37926C40D544BD7AA4052EC15BF4F367567C2F1ED21427C785724EEA29303B055A25 Out = D2DEDD1D77EB642E6CFBE87DA2537AAB In = 86DBEF8CC3D93F340FB31E92C2324BC3301B9196ABF4292263AB0B883E002423F063280B0F385F Out = 92032B502AE736973AC4BE67E263809A In = B81F79B5B9B17DA768607C66B99976BAD8F53DEFC743EDC387B6C2584970BF5FDFEAE48E99AE4C09 Out = 1CE836B431110C7E4099E5D8F8E54C0F In = 8A8BC0EE1763CBB2081E774B282085DBCDB5F198DEDE350BFDF7B290BB097180BA50318A833F5BD9A3 Out = 0B278644E43EBAD38FB5237405B31C35 In = 359AC2B44FCE85DECF35F5CF9536C7F6C48BE18F44731759A8D6C5DC2BB8374AF0E12A48F8D111286067 Out = 37FD5E056A2050789F8E95E9EEB8E564 In = 6213F3543EA1B634B8D9C86A26D08D1C8B7DADEFD9BE50721354395B1A99D653DF7475A5FFC45A7E035ED0 Out = 79FB0A2C96B58FEA3194CD6FB3030C1F In = C2409DF528DFE67C1488D7E84970A82E006EA1B34D97728EC821FE0597D8204906DD8396948C2CFD9A86E13A Out = E235122E1DB5E26DEAFA30C64C8FB5F9 In = 4E314E192FD989FA432E727083199163B6448C83CFB98A968189BF7F3DD69B635EFC381BED87108A794C19336A Out = 1C494D375150DCEF2FD51F84AA59D601 In = 2183108500C74144F21D67DBE132EF997B0DEB97513A381334D5413A6805733357A641A3EB2A72F0813C21589A9B Out = 23D80B20EE33C33D8A75E485309ED45C In = F43753ADBFD4B2BD905C0F06D5450673D98AD6F50E192625338F5737DF8A0B3759642FCA66CFFA9C96EBA5F57078CE Out = B176D8F4982A9CCE331366079033FC1C In = D04E4313C792988B8774DD759AD8BDBBF98306F4F6F7090F0E5F68FD8A2351544634BD44F7423F30FE37881874F5B819 Out = 9BEA5C357BF5202B6976307713A903B5 In = DB266910FB841658BB855DC312702CB639834C1E5C50AEC2AE199D352D2E4CA1DE6CAF81968D586A31A3C5D65AD0F4912E Out = 768434AC733C239B8DBCA7A459A2FB42 In = 43BDF85AE7C27AB66EEBF743F1D4B67F2BBC98EDB8B92F3251C81CCF54A219F6A684E1B65ECEF7B3FC9C95AB3B5B7F374FEB Out = 46956F7F64806E86C9973DA6CE2FBF90 In = A87792462EA3BB903170039536B13C1617BEA2285FBEC835A7FB2CE7FCBAE27FF0EDE753862E0AABF04DA01B74D95C042E1FF9 Out = 6D78DF86BBCBD8B08DD7FC648AD0DA64 In = CFEE147442E699CF016714EFFB3579981230BEC61D7BD8CCD4CED1556278DE848627C9D72FAA12AE7E00821839FFCDE8E2A421E3 Out = 67E9F45E71CA07B2E0D0D4B658B84228 In = 32CA147C83280D487ECBB61C3FEB34F0D44D6E5414E2A544EAA2C2992A19469090DF86C2D98DC4350205A50416DC045A28580BE425 Out = 1136E79134EC1B4AFC61F39F9D0EDA2A In = 03B674C177DD0E9D3C450FA48AC356417B319874C46B04F9387E823785FB6A2CB1035B17F7B3B789BCC1721167BC393518737AD65A1E Out = CB5084C965F8433B3F739A3F85AD649B In = 7538B43E81C97808AB82AB9BFAE52E2395185B3779E0631A11FE85B189C9F390BEFB1087577AE977CD79AFE115D7462F60C4693BC16E0A Out = 0D88491C0EA8F820A253F250B831BD26 In = FD04FE966AC54F6A1BC4FBC86FA328248AA235D9F190C7D7D72C2382C094EBABEF7872BBD5BA4611445B8374F0FC0269E5032392B95B8DDB Out = CD9965783D9A1EA097E9D9E2831ADCE7 In = 98948A1E28A1F7B97BBA154ACA43BB28C05A197E8471F1D35359F5744C66BB9D0FF234B7B5E2E73D533E5FC78C13FFF2B68B3C7DF94B860752 Out = 037A76A6C9B017AC440B3A9330EDD0FB In = 06449B27F353990EAA0A81C4A0422079B5296FBF87209D084DAF4C81C796433E923571733CAE194EF225B12E67D1F5F21E0A50486F1A3E57C6C6 Out = 75B70BBCEC3769FD56BB04D7FCAE220A In = 75D4D3B833E659784D26E988145A3B7B01774CE6321F61A08B0A0C1A4645FDEBDAA49323B051B47C1F6B38185D60139CB7C22755FF6E2BB7FCB5BC Out = 2A087E2C8002DF98EF390183E96D52AA In = 20DF7267729FD77DE12969F507383E240F39F018A0666E32A58846E0ECD9FD6D7A132BCD755F463846A1C861BD5593DFC71318DD7BDB905C315FEB72 Out = F414EFECC9C65E20FB175DB5C7FA2AC0 In = E96C3DF4D195693DF4D3CCFACCDA4C6A18EF039F886F33B6980C4F1233A5C704B3DFB205751A6B09145AB69E47A1653CBD69A593040AF6B3D6F5407267 Out = F14A6A40918BBC6901639C04C34C1B3E In = C44CC1C20FDE000FBD7F49453FE4519000E30AEE2BCC504B4FC0911807FDEDF488C3BAF39A6D227A22D8888E9912C1AA9B37DDD2EE9C509B300E864493A1 Out = B82E59AA885C741BEAE1DD7FE19B1ED6 In = B37A592ACDFC58C2E4E78FCECF067111846227CC1C53347B141F5F378B64FB5163DC25149B88C28E6E390C561245D73485DBA5D616654EE17A76C20300E774 Out = EC58A5879BE2E425B1A126AD80E32FCE In = 3104C2E23C21C174A512C7DF0DFA11DE82FF6D9B8CA86331970F8C29A5BD5F58DBFC874B9F3F81136E8FB1AAC2D244C697637526C8A680B3072C86272FA684BF Out = 51E46388BBC048DF3914582F8ED32E0E In = D6EE0400EE5E1C18B170D309D17A8C79918449FFDD945F33C79DA666678C0EA732E31226BF56398B0C0BD654F286F00ACE0184C486440433D76E74E3ACBB933F5D Out = E2592235FD61589C07E26861E34B75CF In = 8910E1CA14F15DAE918DAABBC4C7555417ED6F8BED1950CF7B6B321E14D82AA492960DA9068F8B24A0C061EA41FF7C7DCBC797B4CB1E0A35C8F86E33CA0CD558E93E Out = C0059500DCC36D2C1B8D07D521BF9047 In = FB7B50ADDE9FF5D8DEB65C4764DD3FF42C15F498D65018583F224734DF414C8E05235B406BBF79FF32EAA14DC9599AEDB4A9F201BEF4AD2D324F1736EB95F9B70BCD1B Out = 0E2496AD1385C0695F1123141170F9DC In = Out = D41D8CD98F00B204E9800998ECF8427E In = 61 Out = 0CC175B9C0F1B6A831C399E269772661 In = 616263 Out = 900150983CD24FB0D6963F7D28E17F72 In = 6D65737361676520646967657374 Out = F96B697D7CB7938D525A2F31AAF161D0 In = 6162636465666768696A6B6C6D6E6F707172737475767778797A Out = C3FCD3D76192E4007DFB496CCA67E13B In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839 Out = D174AB98D277D9F5A5611C2C9F419D9F In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = 57EDF4A22BE3C955AC49DA2E2107B67A In = D9C7DD80BE463DCB2087E3BE65F0453BEBBE1B6A3440CD10CF26B60653F00C16B92CFAB17F4BE6F2A7A5F463D1558653DEB907EEF6579BF86ECB460A252B7D92C6FEA35AE8267332E816928486B1AF0AC4F61238A8A2D37E7648A9B8F3E6E972CA989C6C6FCBECCA418650DD5D31EBD1E6C31288C0AD0EB3DE61EDF01863EC11C2BBC4D03D78407999EC1A33F606F1A49F6BF1E626FAA2D57E4FB2B6838B349C28B32E90377D71FDBDED640E21700A0FA6475F34462098FFFE1F76E3E82409C86EFAEFCA4599E764B682FA4CAE0606D39F8F87CD29BE2ACAFEC9C0343A4ECCB8F43B110049AE7B74EBCF01567A86F3B3EF75D38874940BB142FD65DEFD1A0ED4C33086915E46F85306F34CB7A110D68365C830B822330784EA44C168D9428065B206B34721EBBAE49B840AA74B0354FFB1D744A29451A6089C3C8B2C7F242BB9A83894F311ABCBAD2D0F614687D935E5703CE323764A016AE97D841F7122BF6BD101343790FB3FF889DF86F770B4825BDA11FDDA93BC1CFD2C0D9CFF907330BFEF4758BDEDC2012B025561A60B659B4E9E4FC458EF33F7D5529A64F10D87ECCDBD260AF5F3D76E069BE60FCD10274C7B4E199E8A9E85F0D6565939808E51B52684CA76D5F83B515B8C4936ECF342B770E1D910C55347527EE495E6B16423369E781037CACBA212C5A7380789EE168A90FB2B291B975005F1ABA7DB3B9D950202E168CBC8DFF5FF951E28DC86E6FEF0371911CA1E94CCEE27E42F7EE907273B2E87438D3520D1DE94C70057FA79816E5BAD7A840FFF881BCD3C680543BCC19E847A3136EB84EE7389E3978E122FF782702D6BFB1C26ADE57570D15DC8408CC132E8D647D8B318FB76E8918D2513AA9E62F64E4EA3DC8D618E9A596F2B6EA8D0C55E2791A713928A7D6401B533CD86048E3581EA8F60FE8F94F6FD5B577B73BA339AA8C5B4CDD093AB895D6F9AA5575BE5C9FCDC461A1E9DC50F31938779AE8BE160476AD65FC1F7FF9601B07E48CFE676686DD772999737D0264EFDDF546167F4393BFAF26CF29801A4D4CEB04A5A551332DAE0014EAA9E090260CFCDB547883CD0A622102AD1C1B975353BBFD2F1C98C555BCC4DC26631AEC0E9FD70F6098785748F5E2D3A1963F99355D05599C180FA35920E48CC0594CA3F3B1A05883B28B73EF43FFBBD8A0AB4C4EAAFFE5793B415B957CFB27A46DABEF173B316BFBA466023C7C89EF4A5FDE003B3602E722C9E2E3E624E2B130A024A2B6CAEC46FFF282412BEE4F28CA4ADC6822219D76BA77F911EF8F9AB52C5066806A1D47EBE40045F1DB3590BF0128A56CC86943670FF83E8D4E120F6E4D0082386EBDF83488DFEE827371C773A2B7A03ECDAC24EB977A16361353DDB164ABBB1908CA2F2BC694E141DACFCB241746786FB24C04D2DA7AC188436201B3556ED2D6874B0AF6227AA072B51BF8699 Out = EB16D2E1DC85C8EC527FDB6BDF228A63 botan-2.4.0/src/tests/data/hash/parallel.vec000066400000000000000000000006611322470703100207020ustar00rootroot00000000000000[Parallel(MD5,SHA-160)] In = Out = D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709 In = 61 Out = 0CC175B9C0F1B6A831C399E26977266186F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8 [Parallel(SHA-256,SHA-512)] In = Out = E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E botan-2.4.0/src/tests/data/hash/ripemd160.vec000066400000000000000000000257171322470703100206260ustar00rootroot00000000000000[RIPEMD-160] In = AC Out = FAF1685349FE8B832BB2FF1CBA482583B3560F3F In = E9EC Out = C4EB5003F5FC64E122194EF6FBA841B30B1E8761 In = 74524B Out = D5904A1D8BA51B972BCF6D00681A5F0306C57AC5 In = E233E3B4 Out = 9CEA3480EF59215C514C4FFF9B813677120AA8AA In = 445A2F97AD Out = 6AE5414CBE327CDD20FD8887F2F94D7B69222AB7 In = A242802B76EC Out = 5DCA1535835D75ADFA1B204C5CDE68C2CA8F1D67 In = CBEC35D2FC21E9 Out = C9809CA68C9013F34B7525936DB84B5737C591DA In = E8F3385F8B210A7E Out = 497049F4D70E7B42A3F30582C27CC22DA5A51CD7 In = 61A82B5B622C48F6BE Out = DF01106CAF345F6E084DC5A46137EAD345D445D9 In = 4AC97BA5461EAF9228FE Out = C44507E89C39B4E9965FC9610B6B82985B1A2B57 In = 0E0B7D71B3CDF458B883B5 Out = 39F567E3B8A7AE93BE5AD8E35067D8B2AC81B9CE In = 43A4A8265FB24F3279D6CDE3 Out = F6342D8150996D93CA43369A69A502F14DDE041F In = 5CC368C293058FA49906602624 Out = 893A6A07EE0A2669BAF707ED3BA2376125EF9654 In = 0A52FEEB91C5D0355FBB35E93F5D Out = 5162732EF94AFE500679F550CBECF8043B70ADA0 In = A3FC5E1467219DB6ADD73F59808955 Out = 3DD7B8C0D2278884B5A5C22A3CAA061131A5AD7A In = ED45B0BC151B3A739D710AB3AF72A32B Out = 5BA207C3A45289463C98A21E2138C3758D2DDC4A In = AF7F01692A1AA195E2A3856DD936285F2B Out = D744FC79D37AA33E16C60DD7973B7E0D1E790828 In = 5028D7983E49966980AC8A564CAEDDCCE890 Out = 5906BECDAF00A5C700D548EFA92FB23FCD1C8D6F In = C17757BF03B8661B4407D06E4E47E8B6C678FB Out = 2B7202910CDBD3CDA240AFFAA5929D6F82FEBC48 In = 5C4172923580ED789714245E42FDA873F405EE97 Out = 053DAFE5970069C38F5575A54C4BBAD3FDC34DBC In = 74F77522AD9FBC0E45DA88354EE4F5552EAC5F02F7 Out = 0B72DF59FCC468CC4BEF4B0A77DA59DD4EA4486B In = 33A75FB9CDBFBC9A257B122BE7ED337BD65CB1FFE9A8 Out = 1B8A94BCEFE1E6CD9000A70AB342FE7930E62220 In = 8D7042CBDCD336C86E7732A1E633BDCC137380AFC37D25 Out = F18C667A28AA595890E689D6CD19FAE3F9FB7D7C In = D9419BA075C613F701E19DE6449E21A22FE4BB58067A5B0C Out = D656A0F985E186388C2A211AE0EC8EA30B059505 In = 8E5A281FA95E7E9B42EC0CB0B9A35B54851257AC78494078B4 Out = AEBECEDAFAD9EDFDC204AC1303D14F549EE12CCC In = 3E01A429466E67653B7B07751F8E497929A0DE5515FBA7D69FD6 Out = 1640ABEE310D1860D7944F0B9929D3E4264AD358 In = 1CF65AB71AD544D423CB904F064A5D227A01761D6A6188296201E1 Out = 0181503434C565B41EFF7C432E220BCC290F0A71 In = 5781599B64981D4657B3C4751DA4D7594BF446E386621EC838C30D84 Out = 07D728840AB1449D31CBADCD5466D887EDFD4650 In = 44C392B435A8CE90062F7BA756D23FD7A3582F23C61DBE8A06BCAA2B62 Out = 4ADACCC7626AABF56320040E42174BF284D4333C In = 053AEE544BD93733C6FAA8AF9B89D1D7C1067832273F23EB6BB5D1D7ABF4 Out = A993D46BFD0705CB8692F6D6B88AE5DCB20CBCCE In = 7A641E5243317176E497DDD286E47A2A36DEF6451A4A44AEBA12C03CFEFA57 Out = C0CEED6AC5A60323EF0B6D07535AD5264EEF0AFF In = 3BD0AF34C27EFCA58CE047F265F1CFC8BE60280CBFA57225AFE6B353EC1B1B86 Out = AED53C23187ADCF3C2D85FE77AA3FFA7CACC85AD In = 5C861109B9A1FDFB6E9B61737461F722E6582C94C9B406DED106DFF2FBACDF5B07 Out = CA900EED8F00A8144C60756317CA7B23FE5797DE In = D0416B0BA3B19EE355186AC2A09ACFE91964F229DE3D4119AD5AB4A09CF0FE10DD2A Out = B2421A5314D8311C18773DECC2798300A36CE63D In = F7077210023297CF642C3755338EBD2CA234C22269FFAD31A7BC6B12EBBFFCCEDE293D Out = 797538F704EF4FB5D7E93DDE8B9C742EAB19010F In = 169ED88895E743A171581730D9CE32B90E557C2AC178F00AD15C13B2639BEA59AB5CF95B Out = 2BA71C7B2BE43AF1825A3BBC7DCCD104A8F8AB74 In = 747EF1D2FFE2942444429B7B6D46631C7BC8C00A63D44176014E8594D9F2E09451E956B0F7 Out = 5EEDCDDCCAB146BA30C9613D5B4825DDF6D0DF57 In = 546E13EFD694F71819385EE6F9A8022EB57B0E6173AD2042984AACBB6CF506102317DDDA6773 Out = 5BCDE7DEE110935114F5422194178110A0C8558E In = 8D0AD66F63EE8211654EB12362F5CE0F7A0672A3E77A0F3FBB6E6986C13ABD2DEBD6E7F916FC7F Out = 54FD721965D4C6DBEBE9E3D2B5A334957EA3F0BC In = 6120F98D23DDABF5CA10022CF22A58CC89CD516F6B9AD1901A6C450B89569BD75B6ED43D1AB1ED1F Out = 560FD1CF282E07A4FBBCB495EA33C550CEC1CC1A In = 7497FEA1D85825B29DBECE7C90F52B1B4760393693B31F56EB366571D49CB6B0EE854BDE58BAA64FBE Out = B61AA965CC9A9A1AE9A7CC0087E7417CF942A0A2 In = 2470B0926239D1A1B94F85204EDDE011000E3D08DB9F59E86A8CF7217C48C5DBE5CD00480FFE00A22B89 Out = 81586567893FFA39A8079018F46B9FF14811C590 In = 56199F4131AF9AEF9BB9F1CEFD8552E75E1B607770A461E6DEBA3664972908DF469B7E065D0DB531608171 Out = 6B74A4AB1C06E029004F14DB759C344DBB770B1B In = 554809F00123973A8308B8D3D5F10EE4E5514DA51F615E1F606957E1FEBC87BA9C369F6ECF29F99CDD57733F Out = FBF816D9A81A8605487F6529255DDC43D031065B In = 4315B59DE93EC8AB4BCD8EFD4FEE3B87CA4194C24211EA0E79055DDB1FBA7511203FD56C0154AE12DB25ABB434 Out = F465D07419A5F3AADE344BA5D64A5133EBA1B873 In = 7C2D0A5131F7C83789B1CBA64E5E6B3485E3340ADA2135008FBF1862BF711C7A65592FD4A49C511E29CF910003F5 Out = C9D8494FDDF45D298164D5BDA3DF18AB29434D58 In = 7597DB5290120386E158890C7BCD70DFFFC100184A8339F98E7EBB17B23B6A88772F4A05F2E0A7B2059DEA991BF154 Out = CE9AB0CF93F471AB913043DF76270514AD281EF7 In = B17BA36D07623609ADA5CF2D8F878025F02C3A4F578021BDEC12345A53780C71FF9AD5F280BF8E1039E5643389F478EE Out = 2B42FE8018B985141E4EC9604F2C75D454155EE5 In = AB1FD81A1D2128A9767132079C36929BD76336157054FA889AD09B117DD753166CDC9AE51EEA15DDF8D7B3113F8534DF77 Out = 22954D720F8259B5F04D288A453DFB54712BE71C In = 53FF3194FD863938021F2033F2E31F508AF10E8D0B309FC2E3477495141732BDBDA9CBA44F83B5459FCA222A894783741C7B Out = 544E6CACE0C57A4AF18F0913D951191869EF933D In = 160EA25128E0509398038A0F490BA73C62A03E58997174594FDA1B45924F406DD3BCE56253021B446D27ED16CD7AC0EEFEAA48 Out = 6A56C5CB8CB5F4E64EF06FB32D94188884682A2D In = F18CE863EFD88F83ECDAA3ACC57786AD1A961B31446436D4E8F86F5999D475EA783BA3473D09C60D0CA6FE3D8BC16D5B5460C296 Out = D85DC07C16A44C4DEFEF238EBFDB7FD14C73A788 In = 890D6A3EB3EAA9C75FB27D643257A8196387A5A49556CA3E81351B2668E56FE1D0E15BA1139C59B48F879664F6CB3B80A9BABA6DED Out = 50F41FFF64A49D8753883F71792305A0EB0ECBC3 In = 370A044BC71750BBCD57491DB54DD6335F426299A3FDD0FBF6C419856CF2FEC70FBBAAF6AD0ADC2B31681BE7437F1DE7D02393034E00 Out = A31C9760489983399EA803BC7945914B7CA59142 In = 64BF8D78E7E1BA0F32F6D4D4F1AA68B12965A7F942B2B152A47869750DDAB6F1F33C82BA1E75EF76F1B2D9769016CBAC063717FB06184E Out = E2401F5AA89927A7F51D4D6345B482B135EDBD32 In = F434CDF6BE6104121A533FB7F7D4F100FF1F0F6DDAA76297A32BDAE535CF040CB38BE51CDDB96107E1045CF24444BF482D9EA131CD163A53 Out = D95AB29A9F3C2A2DB6374FF7A0DEECEE521BA792 In = 1B99BEB5458C96D9D402D85CB1ECB797D352AC8C04F3FFACA76A33B365CEEDCE9ADBA53A5BF381ECA73D863DA273FBC47FB3F9A9F6F25829C7 Out = 220F85E79731C094C8D457CF97296F89EFE404E6 In = 034A75357AF6255F0B55856FA240FDCDEBAFADBFBCB500D17E1830A3D074B252AB2777333A9381D63DBD4DB685A72A67E41825B331F0E183DAA9 Out = A0671C3BADC8D07C59F6551017B00211B3C35B9C In = 9C17DDD3617C5522491DEB7FF1BF56076ACD10EE7C482D606247EBD6D67F8062A3E9ECF29D938E04879C062FFEA08C2F87F3BE840C50294FFA1DE9 Out = 47FAD7E0D17A05345E130FDF458071900E90371D In = 147C4FDD4BB30F38661C0A4C57CFCCF5DE5369B089EDCB74AF24E814AD4BC17A466FBD2501E745AE16D2D0C976D3DCF2F93E2E7088733BC6F4013F28 Out = FCA67427FAC3BFFF73FBC789A4D8FC0058B1729A In = 719F6946F69E185FBDD545EF118F9527630025ACF9B62DF5C38E69C9855C7B63E905EEFD099E0635D2C40815A01B5EA79585DA3E4F1A2EC97C46DD1F00 Out = 7EEF5539213A672C7599B489B0F80B954B0E9D1D In = 997C62CF0780FDD3164780D38BA784905E4A87BF1DA252E13F6C320040193E5CAD1EAB40A6DB7291DF54952C1DBE3B76541856D2B71591D0794435243372 Out = 7E882963AFD9163AC13F7E4C1A7DCA9FC4C6CCF7 In = D93D8E8987E0D01BDAA37B1AFC53A07C5A7F46273D1F77A472D83D0F9D9B241599AFC51846C16E33D1C1E2E532BED264C49B2A9919F324834B097509933798 Out = FD21687491F7F8D2A8EDD82DB8F08137D6C1499F In = CC54B091B967D610BE6D6D889F909F843419091CDAE2C4447B8C830045B12760964AD8D05EB0285A428BACA3E7B7398A37F7982238288732710EC97B5E32122A Out = BB391A32D4F84199A444F6E9476B908209044624 In = 61B9077FD4A0E2E73060B4B26E86FC7A8131E0E305A5D874BBCD28BEDFA46FA84DD89431FEF6E16E4B5B3781956DFDFF1C1843DB12329F6C1C365F9A91B3A1F15B Out = E3D6E5F7196B310A56089E76220A59D523DDA37A In = 9CAFFBB1325C6579B094C4EE8F5B1EB9CCDC5EE861FFA090E055FF2CE6323295AFCA2DE193F15E5FE64AB7AC655B9E99145CE1786F266BFAC834A0FF367FD174540C Out = 954D88771139F64710E8F31A0B990E8A1E569A74 In = BC15671078B9AD440EB3C16FE28A33216DB848F19A289A6C805655053311A2299F9C7D091D3AA130E0DF2E318E75402D54528A9C67FB4B14D754D4DC41E1C06787669E Out = 69F3A729309B288EE077582807DBEEC2ED5D4360 In = Out = 9C1185A5C5E9FC54612808977EE8F548B2258D31 In = 61 Out = 0BDC9D2D256B3EE9DAAE347BE6F4DC835A467FFE In = 616263 Out = 8EB208F7E05D987A9B044A8E98C6B087F15A0BFC In = 6D65737361676520646967657374 Out = 5D0689EF49D2FAE572B881B123A85FFA21595F36 In = 6162636465666768696A6B6C6D6E6F707172737475767778797A Out = F71C27109C692C1B56BBDCEB5B9D2865B3708DBC In = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071 Out = 12A053384A9C0C88E405A06C27DCF49ADA62EB2B In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839 Out = B0E20B6E3116640286ED3A87A5713079B21F5189 In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = 9B752E45573D4B39F4DBD3323CAB82BF63326BFB In = 35B8A2F1B5F332F159AFB86212DCC4DE02B3FBA3794B0E5FE74A4ED9F1A55F55AE7711C6FEE3178A410E3979D8B07594D769AD733EA00D64DCC1D601B871F918F1FDD914C2B6F9EC49B8AC13A62A07E1091E0DD024E645BF3B602B4706583060CF9502E4EA6911AC9EB90E13816530B7683BABAAE225781440C35E8031515C45D5E4F5493FAED6B0457DD661B713895FB9D22646ECAD7C07187B65AA508FE4F5B15A5C428264910143581512DCFBDA974902037D82451E4B1E12AD3364C8F848E2B2A7D53D25F30C06AA6C62784DE8B8B6D097559C62D340C8103D51E0C303B1781F5A95AA6AD1B7EFE3DB9E8D8BE9D1271AFC4DA9B0928642818965C922DDBB0B0A53E6D2ECE3672E9568D0E285177BC5E5A9C2349788F8987267AD5ED26092A552AD3674344DE7FD79B9E33B855DA47F8CA0A70EE806945A6417C92C97CDC14C6BD9B7B25A2D89FEB62C594FD11A7CF3BEA1EF3018B26B0E401EA8C7B8F07DAC07B77ACB78C3F45A73BA9FC32301EB3A19DFF000F3413AE0E925481D8F93D387CD458D749BA848BD4A92B9B7AEB0E244E479ABC4A85F50E94C7299E06BF0DAA1587F49907CD94C426C33ACFC31E08D183A4353A36D8C6D39AAA1AF20519629C01A45BDCD60B115CD490E9873D74FBEA994B75BB7FEE9F2167850AFAF42873D44543E3D6359A0A0A140705D4021DE256AB12C38184BF822B9B69D7FB059C32EE332D86AB9DF26D1CF832381555CAD1688A362BDB1F2982A55AAA37E5137B95B5961E8F354EA30ECB13B98DC697605556DF4C4EEDE6593016B7BC30862C55C6651DA8A3589DD3E9EE42495374BA7E6C6BDEFF8CC078559DCD99581061348B13FAE03259832EAD8BB84FAB48EBF725C6C5037539FC373791F21D34B56DE04A6CBC591B798B7CAE2AD8BD5BF9E963559C981286F26802FD1A49A5A906AB814B34FB514A8ED0FEC7B67A550A59FBEDA7B0685E69ADD13B68A69E070CF2C9E8D6CF4CAEE4ABA732BA20A8BA6C3DB8BFFD392CC2D14D46367D451F0A3B77A411B128224AA473247C4A9A446606CEA8414E9C09DE13301C8E60B2EE51E9801E1CFFC6E9EF283238E2AD209E5D48105D48044BFD28BD9F32C53D5D37CCB158FE597983CBB45A05F1B9148F25772ECF3667554247CDB2A95A99E06275C36C6E4FD779DC9F8FA457516EA4CD020F6726E3A32DF65E34BD85DDFE16B285A0AFB0F3E2DD8954A9E636BCA5CF7FED181B041D14D223F10AD0DE9E23372DD7A61718CAB6B9CC7C1D88D98697356811AC0B834228A299F6EEF970E11D59E9FD307DACD40256AD7BEB203175CCABF70D9137BC29E2C7B0494C3FA6D338B027BB993E870B02EC68A08EC8A24BD163D5AB43411AB7BCF1A09F64A7EAFE15A0C350F5D6F0E68C1A83FECE5227112F8E6F8EF11149B3188970A279C9559BF11E7A4EF9F72C9C1E9B58EE48FF880AA Out = B48C57CAA63FFCC261E4B3532E75CBA497B4FB6C botan-2.4.0/src/tests/data/hash/sha1.vec000066400000000000000000000263771322470703100177560ustar00rootroot00000000000000#test cpuid sse2 sha armv8sha1 [SHA-160] In = Out = DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 In = A9 Out = 19DA91F2603889267DFD77786E07A5B8F067D62A In = 97E8 Out = D617ED3AB073B4E7A53D2A238D7DC55F26EE3888 In = D45C48 Out = 8E7E3C02A55608B637C8AD621E6AA933821C40BD In = AC42E6AA Out = FCB240AA79C665358ED174887E186220F0DA2608 In = B520B2C214 Out = 0374FD36056476A85427EA2F7B1412D65A17D64B In = 9E2D7971A47F Out = DA4106AAD290AE4430618FBD3C5D1FC6C66ADAD9 In = F1EA1C9B787BAD Out = B234020692659C3DEE19F7E75390984DD7E7EBBB In = 22BB11D0A3DA8661 Out = A307CDBBEC5297114EC00193E056C0E30B15B499 In = C70BCC3952C8330A17 Out = 57AFFC668D529B05EF9FDCE03448AE6B4848522B In = 24B2BFC2E6D47E0467B3 Out = 393C606D9C41D743BD234EB62D36A381151FA8FA In = 179BA867948A881232F2DF Out = F01A9954C602AD6A295512AB1FF58AC0AFA3CD1D In = 0DF890F7B14B4A8D16B76AFE Out = 5CEF1B50663EED91BBFBDA9EB7F34757AC5AB330 In = B0DBE17E0D80568C0AEC5E39F0 Out = 22AA3BC193DC2986C10CEF2E5AA4C673883D32D4 In = AFFF20DF4873A1AD68AA924DD5C3 Out = 21337165D43D02685C5FEC0CC1C73C44DD99A072 In = BCA74FF24F139C9952074F9D16F6CF Out = 9F48417F472141A2CD49CB3CBB4D3544EA76F949 In = 9779CC9003344147C0A718C6EF20987C Out = C7255A698F731CA134BA102982345CF0A305AAF0 In = 06CFC48642CADA4A5E1A4BE7D42AAEBCB6 Out = 044581EF47C9F2DE49F71B284B7D80631775A6E7 In = 8A68E58F72C5DE3A63FAA08DED9C89435372 Out = E485D9B0FCED9EE033A4B4759D211023638BFAFD In = 9AE8D4749CAB071975A18F45A49FA950B13A38 Out = 5BD5DECCAAC74D57D7CE628ECFB973409B364982 In = F1413BFE7319315A7A7FE2D32F6E564C9186CD8D Out = 633002546668978822CA81A44E0CA113EC95C088 In = 58E747CCFD7781CA99755B24BA4EE7C13B59095796 Out = BBAB138D0A3369D67C9ABD0A1E0583EA6DD2B402 In = 90D6D80BADF7D52A7513892976D6C5BB28D8562E7748 Out = 8F9D0D4F0E8F208BE8CEAD973776C9441C9202CB In = E033E25A7D550BEEBA3965753D86D4AB982EBF0621FA8A Out = 0B2EB3B57ED697BCA7D73E18A479FAD38EF99ADE In = 0EABDACFCD5484F3B4C3D52D38E3E80CEE792B0CF600E2B6 Out = 1F04BBA35687BA07375BFCC645E2DF26BAAC2294 In = C6A3FABC7ECE7AE5592A107C437F80B1EA24488337F1AE6BA7 Out = A5E8F975C621FE415E49BFACC94C189E644261BF In = DD5CBDA778F532D63FFDFD67D0A5F4B0262B4C505B4BA0F25882 Out = CF03D0BA50F9E569103B85BDF43B949E907EF0C3 In = 389CFE2CDC0B55DF41C1C704FE9D58585B9E5757FD71415F73F073 Out = 00B0AEF6D2BD6213175DDB6B4E7968039F70AF49 In = 45B1C7013FCF2AA9928B166F9666D3E76B61DF676DBBA7420A159BFF Out = AB5CE29466A6BFB2DFD93DBDBAD389A0B7F97C1D In = 1F1F4B688D24B30C8146D576156A7FC3149C66682B28C97EA157950B67 Out = 18A9AF9587796E9E8493D20D8AE6F2EC82103352 In = 0F84EEC636A3381757004310399D3B3F12F97605B701A9038EC04B1CFC81 Out = AD05B1D89788743F97344D1C3AE3BA9499353371 In = AEFB942B4B7A9BDFC9A97C447F7065E21A917F5393EF14150C5569CFC28DE8 Out = 939EB0F17269FFA80738F66B3B45011A04A679A8 In = 8BCCF096CFB773326D7487A06D217A2471E709DC4C60614FB5A7E481381982DF Out = 3B69259D2E5E00F4208E8D2CC84D798A33CC1514 In = 232F3F1AFE834DD615BAC06A2510D1852E946F34B9E2085F7A36FD8844511F461F Out = DFA0A9DB29A68171E01A6C7399B90F974A13F940 In = 704452E58745BD09D159F6AD40FA9B8C7419A2AA188D8B3AFFB00AC34EB2E304A0FF Out = A099BC7BBED72769786FD913F61F655684031F93 In = A62B2098C1D208024EA91470C903F8426E5D8F660C1DA268D0958E4BC11D2CD98F3835 Out = D2DEEC7774B67D924D131224BF6C908597F99178 In = BF7E4F3FD269AC9CEEF6A08DBB5CB5BCAB5AF7080B8D675A7332F741EB9E17963E9BE157 Out = EEE037F1DA86921B491CBBF048B9BD872418DA9A In = FF94FEF100BD0056A37830E6B1DBCE8B832EBF819867932D46BD7495BCC5CE2E9DAF08F1CA Out = 97517C81813BCAA6BEC71CDE13DB4FA44CF4BCD2 In = 88EDF78F02C8E36CF0CDA3D07A9B1485CFA8AE44884E290461A22D599A7F30E3A88E52F019B0 Out = 44FB2EC4643E984CDEAB550BA1383CD6E7847CF6 In = 7FE04629976A8EC967733E95F2BFB79DA1A126DC5CEF391291320A57DA487D49EE7C4247F8A932 Out = 782C391A16A08F98C32C780D7A1F2570A7675FA6 In = 97807FE1CA7BBFD000A057A70A6F6F026ADD4EC3D50AEC664A2BF970C0D0D36001DBB7231640ED9D Out = C06024CD60C3859D653B5ED18AE949ED7C43C05A In = 98184A0CE7EEB9C8DFE36D6A19FD668A3B6F0C9A493835D63A70A4340AB6F8A7ABEF0E5E09E4807334 Out = 7B7EA4D0E3AA0581B1DA3838ACC370E9394CDDF8 In = 33347AC8506D2C2F74C458B2AA0BE72CE38C752A4623A62DB758A9A6827287B364CFD4C077F0D1DB9034 Out = A1FF355DE693851B9A62D77CDC709826B27D6B3A In = 7DB60CBEE84BDD9B357951A59C724A757B90D77D85D61F5B90FCD93D101DF697F4904EA0F2FA1CA7BD7440 Out = 2409204F9658D8BB4C8BFD10420BD576FD7401FB In = AB8AEFD1533F3F07DA8BCAFB5C0C12E6BA7364A7EA2525796924B075242C22FA0028F97B670DE6ADF935F082 Out = B3837EB32A441C2C10E112677FF1569D2C6372F3 In = 890225FA3A7D120C325EEA0A0CF4050833C62C527B6A009CFFCA8DC2094135051B1BC8ED9F9ED37B5DE16B4052 Out = 5AB7E0AC97C202630A54BB3BEA5F485BAE9257C0 In = 5D6F1CC0ECF25EAB98398A20D8278F84DE663FA9252361F01AA3F9A0D4FEA71CC86BC63318A5E3019A6FD96851C2 Out = 2E3E5F3488A5D2C8C02A3B7E566844F35C0EC2D7 In = 0ED8D77EDA25AB5B9AF72F39A49B688B595D79363C563FE8F0265DE2FE0E490B4A2EC86DC789CD0B05716993500C19 Out = F4FC59ABA3C8D6F57DBA4F865DD24666251AA2E3 In = 89837C88BE7FE04FF3364AB6D455ACA1860D5C11FFBB56E16F817857CE0E3EB8106D9FAC60FF571B181C86A830EDF292 Out = 31FB958B1D0935E46891EB09F8BFB99CA6809C5D In = D5E0D6AE8AB7A630EF2206D5160338C7AACC6A5CED2E8A3AA224626F1BD16DE547FB822CD1FB0EA84C1259A427BD1AFCA8 Out = 69124A48D475B5110EE562C59131DA40707F897C In = A9CB3047ACAAF1A2AE06231A4DB46E28EB76694EA03A5FF78FD3C36797CB74259621324F2897D80CC8C070454E55C341A3C8 Out = 53F6A0A6DD49C2D58413FE55A3CBF334D559A03F In = 338ECBF06225FBA761755EF7F9147A1AB2AA696BDF2516584EBB948192C6BD240902451FD5E6ABC48B017A71BC608C87DE1623 Out = CD0AF641834C8DEC7CB735BA31CB674AF90EC3EE In = 552150498BEC425BD0DBA052C9DD61714CDC22B1DA7F915FA7286C8CBB7D722342E691C877B748DBC369D4333F287587206EBC2A Out = 9B658AC6B9BA14176CD55F3AD40EF51722F25FE7 In = 6467642AE2A5C9D1A98BEAC2567A7097F00624AC9FBC1A7751487417EC33BDBE7E1597E0205A7F85B10A06B7F8CBAF33E41B3FAE28 Out = 48514214D5442EA393C2F29A0B632FC2C76B3221 In = 80C293CA96261C78EE05F7D666AA2D4C84D30A8B66EFDB0E34B0625E7CD2F691CD4A92D07D66E22E837853F7DBD5D34BE1AE02501083 Out = E2E5864D1B24C5E8C1A2F8E54F80C942207DB2AB In = 6FECF376F676C90422AD0A6440EE8EF2CE1F4A4F5AF46868F77013F8A582D465F09F18ACB8F1052E603E4634AD345A63495C80ADD64940 Out = 22C6DA67A1B13AB8D11DBA2989E88258CA12CA2E In = B6CFFE9D40FBA3830F2C20248690AB0862FBD8B1A5EBF832965F2AD7E8BF3C74A93062C79F9CD16DE48043A69BFEA723035A2C81FF118184 Out = A517711BFA20D7324C710DBF3C5A955EF465926F In = 47C63FF1E5AF57CDFC0307BCF453F528E5767CAE52117854E9036F20286D1C1BCA2770645B4794BD5047EB59F0EA5F751243AD8EB5FA3F69F7 Out = 533815F09B700B11A674EE0647F8E320F79A5ABD In = 995C78E561CE4F9D9B9226C01DA4C55B5C4A1D5099027B1123AEE851AECA3B70CF54BC7A74A4185D3781EAC76CD63718645A8F15CAD1911F529F Out = 62E81989C86A4AEE3A9DE5114AB72821AB7B1150 In = F713F0C9CDF3A28629861AE19C38B73664352AC6939C976AF92A673857AE48DCEC04E8967EC5AD8245CE062D8AD5FE5E92F39F5DCAAC9884F8B5CD Out = 79221ACEB0F387413AF24481A55633E54DE4232A In = DEF310EF52F8839F15BA13C8A5B90815867AFDEF25247FA10B6AD03E70952F5AD0B9836012F119315C43C90DD6B5D018B3C75BB01659535588A4C17E Out = 136C5C9F49B4C0C41E87762878846279E167D8C5 In = 4FD13DB66F140B6DC804F9EB821FB82800976070D59EE4C035527EEECEC97E1EE5C9973F1A25362A84BEC6EAA38A47078CBA24C6B7155CF76E30C22199 Out = 988A4CE4FDEE20041D30AAED622BF1CA4E01C5AC In = 57BD9E7BF1647FEAC33DA17BA902FEA19F7FD09E85CE23BA02EEC263A321580423DC0872A9F794838EFB820A8D3D3D2AE81574F77825B70C569568A31EAF Out = BD95E63B9EA0ACF05710DDFD13B77D518BE21CB5 In = A222082AADDCA13A7CBDF9A9AD12BA723456BFD8B515A6A52F8F861226CF94D5C3AB0B2A151A3B557DA8DA72585EFDF60FCA469AB30EAB12B51571E906557C Out = 03AB52978F19B3FA870D84814002A305AC58AC10 In = 89AA2C4D4F81CECE57B0485842B0AF8B857E7609CC0F29F0343A5B8A09181A63C8F84251C497136D1916DC5634DA842793C1B648A381B2534DA78E78E7898BE6 Out = BCC5DCB8FF9EECF6B282FDDFC8635B1923C2BAFA In = 94CF076400B9C2911C2C2C1BBCBF30E50157EA88CEB3B4966E61A18BA2C58ECA65BAC7952E5A629E0DF53F4B8A9B031765A639C87A4941E42CAF4A5572AC05B085 Out = EFD01DA5BC765BA961954C2D7E5FF2104B1FA58F In = B8847AA6FE095FA629D090307AA2D686C7D628B12D63BCFD8E4F6BE8CCE039E8CB69683B8B70DE74DCBA93A019D0B459D707C4F2BE8EEC9B0280F6ED26D99BD454FF Out = 32CE1A1F18A2FEB9CF0189E37D8894E7CEB70CDA In = 676DD8B7DDF731349BF6238C855E8136AD59E734B20ABB500018925966EA4E07633690AFA11E57550766745BD3401459373A418A360D4C4B9275714679517C73F60FAE Out = 81D2AC8F3A2C92E190ED1AAA0F7EEF24579E697A In = 616263 Out = A9993E364706816ABA3E25717850C26C9CD0D89D In = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071 Out = 84983E441C3BD26EBAAE4AA1F95129E5E54670F1 In = 3AC0944F60DD6E0988CFD28AE2103952C6070DC0A97EF7AAD20B5F9CB8FBE054368BF91C6791CE900B487B309615F29F1A045D210D226D2A018ADA22D27C Out = 968569B83FB232766A9967C9FF6E9B162BF49DC7 In = E5EF4476F1A0C19631E317518F0E64A8AFFF579A264FB3B00B55C108F76F667919731882DE4905BA0493AA17E1F39115D136F9A037C704F5D329CDC36CA728 Out = 170A3BF2284128B2A02097800B6A3FFEE825BFE5 In = AF500080F6905D82050886CB27371AD9BDCDE1D3858E66395CBD034D8A69198AD33A762534CF9C7F39B22DE123AD03ED25BEC4E73FE05A1CC506B8D06D32B0F3 Out = B79E4B7FD2A3DBCF5E9BF50D91BF651FF713DC65 In = 0AEE08E2D291A3D500160C74FD6A8F4C64531FCB51297E503BC4ACBA07ED629AC3CE70D1EBE5B4730DDF29DED06B9E9CF8EA963718CE4BE9373C35BC1188A5F054 Out = 5CD361EC04BF2F526803FEEB81E729AF5807EDAD In = 08D2CA90EB94205F40277F2D47DE7F52025B31B57F62DBD443BA005D6301FEE4F4DC57181C7269F1FBA4210E26358C48887C09C4317CD890315BBD563C948173F6F1 Out = F788C706B2B67D4D698C2DCF99E45B1A8541D3DE In = F0B38F0505089A926595ECA3080BFFEE28929EF769577D91A8E5E2867B01EA4C58A4CE62101ED2DA38D608C266346DFB5FC14800D618E958A8572B35B23393A11613C85CD443D2B4DE78D5A4D641E70A23467D7CB4BBBE362AFF2AB35D1A075CA33EB619DDBC9AFC65586F077A3ADAE4B1150E0FE9274280FB011F0420155E5848920D9E25D1BE66DCC670D4395FE2847848E04645C13B334E4BCB588E069510BA6D014115579706670D2D93E3080466CE6BBD07CDDB9670ACF68E4E36FA17E03EC3F88910FBCE247128486B0475775AA5642812B44F444A14DC547E7D5D98527302261A13FEB8BDB4A7A0FB221E1D08388B4353AE2DC7E3464969DCF12B17ED0A5E549B8FF8A8956FE5FB69C1AB428BBA8CAE7E267F52CAFFFD2DCAE8F9B5D448AF548C7BE88443649254089A281A1B7537896D7D4C97399F0513E3976981843E20C15EDF14378DC4425CAC30ABF7CB034B6D4AE213360CCDD1C956ACC0D437C177C983EAEB9FB5F3A5DEB19CE3319C9368C2A7AF4B077A6B1BD417F17E2CA36BBDA826718515FDEBBBEB5268801073457F8AC83ABD1EED888BBF218DCC4554F67EFCE107A216B0540116691DAE98F34FB218969728E3165425C7EF1BB033329DDE4CD98A7317727F4E6E24AFBDF39F79D71CF3C6B93E75E007500874BDD94F7484C15EC5F5A509FA4AB14828B2895B0280C554600DC9834D23F824E1EC4662CC62CECDA8B9F9F31A6B4D589E5F95401644800FFD2132F60CB45A91940CD420ADAA5DB3577F41E099EB79708F7A0C61D37923B503DE8810C55F80AF43B4D87060070BBA4A948A41DE58E7A7DBDA9020D77F290A62F1DE6E47521C495B6EFCA40FC97FED9DE7389836F82BA05FEE66975121C38A6C7926EAED407E37CAB7E7005A891A93D88F68DDE4DE9FEAE55D6FE86FF34CAF9CCD7263085C2CFA67A77FD28659FACC7AFB9734159D35C6C96A755FCACB2048ACB7756696F4E481328A5A93A9D0BF8AFE0C31A98E1E6A4BED0C6CA661EB7218F9C5792334121604587A86423B652FBFA1638C96CA1715164C7D074117ADB267923F06ACAE45B493438BFAF384CDF7697AB0E0B75C6D21C6FF1139752143FF84F4652BAC47D44689E7A73A87E4491C0D9B8DC60D546E4350BC66BCF814ED004F202AAA9CE6E4638ADEA6B485CCAD2D55FF7A597DE0662C746AEB34B36C7D46FD47A67DB75363D314B40672A6289B60F1D444090B606F73A9CFE3BA46BBD3D5E629AD508D6F6592DA126E9400377D7DA41295DFA37E5654FA841A5616E528C65952846DB40FDF29DB7317B8FEEE5B0F670EA0198520E58FABEBFB68BAD63709C5941BA9F8DBB064EDC425B263DF4573EB6E3CADD080D9EF7BCCA048F60E163448DD6531B6B9F8CDB66CA368FE6AD9B651C51284E51253A3B64FFEE4806A0A88840BD61CA888345648D7743A060A36105C88 Out = 8395ABC1B17BA7BF947145EB1DF1A2050C8E78C3 botan-2.4.0/src/tests/data/hash/sha2_32.vec000066400000000000000000001746111322470703100202560ustar00rootroot00000000000000#test cpuid sha armv8sha2 [SHA-224] In = Out = D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F In = 61 Out = ABD37534C7D9A2EFB9465DE931CD7055FFDB8879563AE98078D6D6D5 [SHA-256] In = Out = E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855 In = 61 Out = CA978112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB In = 616263 Out = BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD In = 6D65737361676520646967657374 Out = F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650 In = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071 Out = 248D6A61D20638B8E5C026930C3E6039A33CE45964FF2167F6ECEDD419DB06C1 In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = F371BC4A311F2B009EEF952DD83CA80E2B60026C8E935592D0F9C308453C813E In = 8000000000000000000000000000000000000000000000000000000000000000 Out = 84B3F13B0A4FBCCE4C3F811E0313E00DCBD27431C229EFF576598BE8D1AFB848 In = 4000000000000000000000000000000000000000000000000000000000000000 Out = 94CE3F7973AAED52C6C446BCC59BD8D43B6695FA3FDB9E3D1CC47503A432D3D8 In = 2000000000000000000000000000000000000000000000000000000000000000 Out = 6D0855A335802F0BC20946F3C48C05B6B98C14B578020D5F42A166B97FE6F59F In = 1000000000000000000000000000000000000000000000000000000000000000 Out = 56FD25956F759E64E853071FF01587C364EAF6286C97DA600E0BE78C701637DB In = 0800000000000000000000000000000000000000000000000000000000000000 Out = 067DC6A810183E9069F63C2020B692C122C8D58263ED7F5C0E531504DC3B6E06 In = 0400000000000000000000000000000000000000000000000000000000000000 Out = 4B78063B9C224DA311BD1D3FB969BBA19E7E91EE07B506F9C4C438828915563F In = 0200000000000000000000000000000000000000000000000000000000000000 Out = 5778F985DB754C6628691F56FADAE50C65FDDBE8EB2E93039633FEFA05D45E31 In = 0100000000000000000000000000000000000000000000000000000000000000 Out = 01D0FABD251FCBBE2B93B4B927B26AD2A1A99077152E45DED1E678AFA45DBEC5 In = 0080000000000000000000000000000000000000000000000000000000000000 Out = 0CAD7906B177460EF96D15A612E83653862592A190F78FBB7C09F4AA89E616A7 In = 0040000000000000000000000000000000000000000000000000000000000000 Out = E30C1BA805347BC13F4E4E4E82658AB2C1C97BEF72C4F3D555590784C64B3587 In = 0020000000000000000000000000000000000000000000000000000000000000 Out = 3B5C755FC2A3A868DA0A668B2704635B13E3DDA0ACFD386B4C025ACB644400C3 In = 0010000000000000000000000000000000000000000000000000000000000000 Out = 9F911FC19889661AF03C2E9849208883BB606BEB75BB6C162FF63F65E4CA8157 In = 0008000000000000000000000000000000000000000000000000000000000000 Out = 3EC07F4585EF5C91814F7DDCAE396DC42156DF82307C46C7AE977CFCDDBD04A3 In = 0004000000000000000000000000000000000000000000000000000000000000 Out = 7E8BBD09E5C09DE409CDF71C4B39F59B350B4B5DEC4A45D0B6127FDF873B4602 In = 0002000000000000000000000000000000000000000000000000000000000000 Out = 1616C4B5C8DBB446F269F2C9705B857B4A4315355A52966933E6B0E51DA74A76 In = 0001000000000000000000000000000000000000000000000000000000000000 Out = 36258E205D83BFAD1642D88F39A6CC128CA554016DE9CF414BEF5C5C4DF31019 In = 0000800000000000000000000000000000000000000000000000000000000000 Out = 9B885490F45E3558384E94FE2C64773323AE14BCB8F9E8E02B3FED18EB930A30 In = 0000400000000000000000000000000000000000000000000000000000000000 Out = 3BFB6EFD3AFC93BCD7ECDE51304456C2DC0C697A337DE3FD611CBEC3B3BCC53C In = 0000200000000000000000000000000000000000000000000000000000000000 Out = 1D8052462938001AFE80A3A2DD04EA8B28AEA9F613849C5285401B7DF2E8D604 In = 0000100000000000000000000000000000000000000000000000000000000000 Out = C15F125ADA3B323C7D79FB6D1C96D87CA7890C468A209C66F80B5EA223E5E533 In = 0000080000000000000000000000000000000000000000000000000000000000 Out = 4C49B88894D742530818A686961A640CA28692C2E2AD020B7CFD86DE3E594068 In = 0000040000000000000000000000000000000000000000000000000000000000 Out = 85BFB6E1A0AA50099696212DCE8A0067F4FC8A2C4DA0946B6106BE1DD01D7D78 In = 0000020000000000000000000000000000000000000000000000000000000000 Out = 5D5E9793D0F89CC3A709D2FFC1B488F1FDC7CAADE69BA027EA7B44F18BCD082F In = 0000010000000000000000000000000000000000000000000000000000000000 Out = 1EB50E78E6DFB0A4725FB71BA0443C3129A6822213F3D40DA2439FCD2BCED580 In = 0000008000000000000000000000000000000000000000000000000000000000 Out = F7B7700280839E9E0FF8AECCB3BE5C586DF0BD6B7BDB4AC8C8ED45AE3EEF3686 In = 0000004000000000000000000000000000000000000000000000000000000000 Out = 2E0D44F2BE93B23ACCB8E7680FA0B58E25F48E33334481A9297C8F5E9428F326 In = 0000002000000000000000000000000000000000000000000000000000000000 Out = 672504FFC411A43E4E9CAC5A44BB62DF4A7DA166D18E4D47607CEFAADFB667F1 In = 0000001000000000000000000000000000000000000000000000000000000000 Out = 4A9F5FF8813D3465074FD633B060B49318D9EE98B3CF3B3F4A3C903E4AC66396 In = 0000000800000000000000000000000000000000000000000000000000000000 Out = C68386BCDCEF8EDF31D9ECCE2A34E006F49AE1652FF0BBDA847FF6601F762815 In = 0000000400000000000000000000000000000000000000000000000000000000 Out = A5FE20624689A0F3378834E922989DDAAEDAD5BF51D3B1F5E84D63778A8F43E7 In = 0000000200000000000000000000000000000000000000000000000000000000 Out = 03DE22D278E3BE1E8FDB7DA3EE6679E6D514DEE8FC118FB27A91664CDEBED8AF In = 0000000100000000000000000000000000000000000000000000000000000000 Out = D1AD35A94F018CCB8E40A06FED17DB11F0638DA3F3E638108ADE5D151ECCCE23 In = 0000000080000000000000000000000000000000000000000000000000000000 Out = 4D205614446CBDF1A8160A7182BCB24EFB32D725E016BB91D84C1E7DF55201AA In = 0000000040000000000000000000000000000000000000000000000000000000 Out = 72171D3BFE9863D702B81AE9C69135AD007200A5A7B8DC419F884C944A309DD0 In = 0000000020000000000000000000000000000000000000000000000000000000 Out = 3F0A6EDF24B8D9F9038B828D2F45F7625123F8A1B07E39892C86FABB2FE687D7 In = 0000000010000000000000000000000000000000000000000000000000000000 Out = C9BF3EEA4D22268BD1EF0027A5E1E398F0D6C4A8190BD99AD869A8796EB0CD4F In = 0000000008000000000000000000000000000000000000000000000000000000 Out = 5706ED5B0DB45898C5C01F4C4B5360043E1029CA00B33C33E684C27C30222A1D In = 0000000004000000000000000000000000000000000000000000000000000000 Out = ECAB997B21788D277CFCCC07AA388C4B199AE63D6E606CDE28328EC209B794BC In = 0000000002000000000000000000000000000000000000000000000000000000 Out = 58D2C35FFAC68BCF336A44B98AFF5740823CABAEE65865C608D487FFCFFC95BF In = 0000000001000000000000000000000000000000000000000000000000000000 Out = 909F22C2B34103BF854580C5F2C4F64C2520AA57B492E422D1801A160B6C6E67 In = 0000000000800000000000000000000000000000000000000000000000000000 Out = A0FC0A816AB024C9DED26D9A474B53C66635376400FB3AB117BAB262321A1308 In = 0000000000400000000000000000000000000000000000000000000000000000 Out = 9DEBEDEDB5B1B6A2A2FABE9104C8D3F425144F290490ED788D6B6A19994C703B In = 0000000000200000000000000000000000000000000000000000000000000000 Out = CBBF98775780C3B92BBC871C1D5137107BE63933D0F3FE1BE7AEE434AA5509BD In = 0000000000100000000000000000000000000000000000000000000000000000 Out = C1B245D91A44973947297E576511B7FC55CBCD06159CB0F111101E601B36843E In = 0000000000080000000000000000000000000000000000000000000000000000 Out = 6986E93DBC3B044D949945C0AF3BC35ED63915E0268E9395D552D4ACBC5A79B9 In = 0000000000040000000000000000000000000000000000000000000000000000 Out = 5FF28A82880765E64116AEC484F2B3A0EC1DBEACEC2BBC78737E5504A94C2DF2 In = 0000000000020000000000000000000000000000000000000000000000000000 Out = 76DBB5BA9EC438D93638BFA8F62664201E29BA84BC6B1AB704D9688E89431503 In = 0000000000010000000000000000000000000000000000000000000000000000 Out = 80D3EB7836CB04382BBAF764EEC343F07C9618BDFE98E01FD2BA2958902253C0 In = 0000000000008000000000000000000000000000000000000000000000000000 Out = 89FF132255600368DE253F025BF92BB5AF9BF4D1FFEBB25575CE30EB77E4E4A6 In = 0000000000004000000000000000000000000000000000000000000000000000 Out = 2012053E7AE584DEEE9B71A412FCC9351C29961E9D3972615C10EA59329A1D3A In = 0000000000002000000000000000000000000000000000000000000000000000 Out = 414DAAED4DEFCABB5A3E4A82131B914E597522EFCE506AF7B294A14486B40ED8 In = 0000000000001000000000000000000000000000000000000000000000000000 Out = BC52EFFBBB3C6F7C66AD400B707CD98930A828F6B5BA3E0C71D706F42000E80C In = 0000000000000800000000000000000000000000000000000000000000000000 Out = 6225473F5D9BAB2A34928D9F3C9891C990982718319F2408D07670A7460D783D In = 0000000000000400000000000000000000000000000000000000000000000000 Out = B2B2DEA4697FCEB6CC466A7859A30C2BF5C6E477F6F442A1918802BFE707990B In = 0000000000000200000000000000000000000000000000000000000000000000 Out = 873D4CB3F71AA7704660011B30E9B573AE0E839CF0B102633F197290F19998A7 In = 0000000000000100000000000000000000000000000000000000000000000000 Out = DA24CF903BB826BFC026106F54EACFE50C0E8319BE205B47E181642723DA2305 In = 0000000000000080000000000000000000000000000000000000000000000000 Out = AFE22988EC899E95704B9E87082EE375F78DB2687478CCFBC2DFDC1E121C49F4 In = 0000000000000040000000000000000000000000000000000000000000000000 Out = 497D0D90F9A77F1D67F0567E67F7ED60F9D324CDE0DB266E51AFD4B25CF24FA4 In = 0000000000000020000000000000000000000000000000000000000000000000 Out = 0845CA0AAAF8F899437303A1C4A24101437DA7C90D1147E653295BA68CED2D1C In = 0000000000000010000000000000000000000000000000000000000000000000 Out = A1BD23817C23BA5910B9EE8404740A0CE3E81DF31A5AFCD172B4613ECB1A9B65 In = 0000000000000008000000000000000000000000000000000000000000000000 Out = 13EA147D01F645B321E81F39D15CE4AEB9CF2E0373D6FCBBC1CA7CDCFCC40C29 In = 0000000000000004000000000000000000000000000000000000000000000000 Out = 912E64C464286112AFC2CCD15E638707F293D8A8133E03D6795E96562D471183 In = 0000000000000002000000000000000000000000000000000000000000000000 Out = 1AF94AA75BDB9B976831E1A6A1A7BBD14697F710E514AC4019B33815F167B555 In = 0000000000000001000000000000000000000000000000000000000000000000 Out = E13FCB8F649438F18530EC00DAA36A110FC641A226C3DDE990F82C4B561DA4DB In = 0000000000000000800000000000000000000000000000000000000000000000 Out = C8387BF8DBADF1C9BA583A8D27B620F4BD13CEE4EA2EF98BCB0E1BDFD6F3D8C8 In = 0000000000000000400000000000000000000000000000000000000000000000 Out = 79A257D3B1260EAE2C407B55A33C28E19777C185B5254AB051442D2353B35464 In = 0000000000000000200000000000000000000000000000000000000000000000 Out = 6552EBE29B1B037562F1888498BBB208054638E97C0C625F127C1A203EFFFC65 In = 0000000000000000100000000000000000000000000000000000000000000000 Out = 2D77A6F16003C7F09E6DAEA5CAF4E61B9CD822CDF21A33F300EEAF33264AC67F In = 0000000000000000080000000000000000000000000000000000000000000000 Out = F5B8339CB1EFC7F3FCB94DCDF8BB3EC191EE016609082E47242EE6253A05DA9B In = 0000000000000000040000000000000000000000000000000000000000000000 Out = BD7CDCC82D46856DB3E580548999DFBA0D8BD38E0EDBB797188DE335D933C8B3 In = 0000000000000000020000000000000000000000000000000000000000000000 Out = D340DBC1256765FEA41925FDA295BDFEAA1055CBFEAE0FDBA8608E3116D746DC In = 0000000000000000010000000000000000000000000000000000000000000000 Out = 49293309D25CAFC914C11063C2D1CD286A4500D519B11B4FC98500EFB85F6D9C In = 0000000000000000008000000000000000000000000000000000000000000000 Out = 6091339D451E8F830A46C5CE040717C9D06F36AA4C5A9A8A9F1622384A6EB694 In = 0000000000000000004000000000000000000000000000000000000000000000 Out = 6CBD66038B54D94A931006EA23DB48C300E1384CE7FA0F7CCFB8EFE2FC0AC4F8 In = 0000000000000000002000000000000000000000000000000000000000000000 Out = 8A1A30A8F415D71BBB03C5AE3DF4836CE54CBCFD78816BCE86E0B983B059E972 In = 0000000000000000001000000000000000000000000000000000000000000000 Out = 8039AA16A81B23F2410448563996605C13766D1E7417F4BDFBD8AD5D0D33554E In = 0000000000000000000800000000000000000000000000000000000000000000 Out = 7549D699D3D1989D940600F25501C243E9AF21FE51EF2ADB8358C159C9E9663F In = 0000000000000000000400000000000000000000000000000000000000000000 Out = 831F3936CACEA264EF4FAE2E36B2110F6729BAF434E61A6EE379D0C014F2DAAE In = 0000000000000000000200000000000000000000000000000000000000000000 Out = 013EDBD6B8EA866D7AE7F553C079663CA22ACF4E21E64F0085ECE1B449BD10EF In = 0000000000000000000100000000000000000000000000000000000000000000 Out = D9B846387CE55AC512A1E2807AAF6F8DCFBEB462ED6D4176CC56A0B0BDFE1047 In = 0000000000000000000080000000000000000000000000000000000000000000 Out = 0528B59ED6EBBA187A69C3C41E88120B1315CEE497BB6731191DC05000CD1E78 In = 0000000000000000000040000000000000000000000000000000000000000000 Out = 1EBA730823BA27ECADE25B38144D339053446006EC3F66131AEE473EA3FB9E04 In = 0000000000000000000020000000000000000000000000000000000000000000 Out = B8AE9BF4E323C6EF3BFE75B6969EBFA68FE6C14B06481CF06869D12C555DBFA9 In = 0000000000000000000010000000000000000000000000000000000000000000 Out = C89944EF4886967A517064A212E38BDA5FCA80CA54E18103A75D54A6E230C694 In = 0000000000000000000008000000000000000000000000000000000000000000 Out = 452E5D0AF5DABFDC5C74868D916F1E390A7354937785F1F6D4D0B1D72F06BD8F In = 0000000000000000000004000000000000000000000000000000000000000000 Out = 87AD2F7F2E5DB1BE3BCC982EA058955AE34A3CF0CBF87DC4813AE5B0E6B3C517 In = 0000000000000000000002000000000000000000000000000000000000000000 Out = FB4635AC471CBEBE2EB3367F259232D7B62B8A6342E1BF73294FE447C3B8076E In = 0000000000000000000001000000000000000000000000000000000000000000 Out = 9ADA02E914EB181D22E7F6D9B3F39804A0F758BDA23995E567E3A1EDFF0B60E8 In = 0000000000000000000000800000000000000000000000000000000000000000 Out = D41BC420CD25BA9038A4E1D1C4CEB1B05D993D0B68095F46B4BB524B72F15287 In = 0000000000000000000000400000000000000000000000000000000000000000 Out = 329954D9CB855DD7798E587403353DD69CEBF91A5020AE5FC4D742656E4CAD0B In = 0000000000000000000000200000000000000000000000000000000000000000 Out = 7FF37D832DB4DA7CC3473FC3F0B263949630F21DFD8522A544994C5A3B12644B In = 0000000000000000000000100000000000000000000000000000000000000000 Out = 7F27BEE720048484188F774D660D86276B6383AB2E40990F181E5349DC72FC52 In = 0000000000000000000000080000000000000000000000000000000000000000 Out = AAFCA0AC1D6C80EE40FB43FAD51F006D39DE0A101449B450A3E0FD9D44FE0230 In = 0000000000000000000000040000000000000000000000000000000000000000 Out = 941A10F2333950E3501C6229C085A54185E55A1017C9B8DFD9187B614371884C In = 0000000000000000000000020000000000000000000000000000000000000000 Out = FA7862ED967E19EC63F91344184684099C7BD734EDF810509E2FB308FE5DAF16 In = 0000000000000000000000010000000000000000000000000000000000000000 Out = E5C92E4C6590AD2F982267BE2B13E110C44D9C69E93516F594B7E433A0E93AF4 In = 0000000000000000000000008000000000000000000000000000000000000000 Out = 0656DD98DED7D764BCDEE4E96A9699E70974AE77CF72F166B7A979B707F1878B In = 0000000000000000000000004000000000000000000000000000000000000000 Out = 1FA047EFED4A196A9B538C099E50B67A0F537897FCA6F0AEB386F43E65D48A31 In = 0000000000000000000000002000000000000000000000000000000000000000 Out = 74BF1C0E1DA85358FA86ECBBAB419C9223F41D47702583593CD01539E861DB73 In = 0000000000000000000000001000000000000000000000000000000000000000 Out = 846C472932FDA94B56483E7A903C6545B5CDE4FE5D0A2FFA03B52AD53570D54A In = 0000000000000000000000000800000000000000000000000000000000000000 Out = E78743B610392B52CD122071F9071A8E9C35AABEC0BD63C73C5FD12171838B32 In = 0000000000000000000000000400000000000000000000000000000000000000 Out = 4A435A44A2BE1F40D8E6A1F7C332C5330EDE4E0F55505304E571B4443255A5A9 In = 0000000000000000000000000200000000000000000000000000000000000000 Out = 18122CF13AB2412FA65CB693713794DE6B30403B65688234A6FA940FC6D506FF In = 0000000000000000000000000100000000000000000000000000000000000000 Out = BAE3E67A9D5505A5685EBB52B8510B44315C0FAA422F0EBFD4EF3413490248FB In = 0000000000000000000000000080000000000000000000000000000000000000 Out = B7F300939FCC6EA45A8920C7B8D3F18E753C0076062E4A499B69AF96328CEAF9 In = 0000000000000000000000000040000000000000000000000000000000000000 Out = 7E5AAFC21B6238FFFC561283AC2B592C1F5BB35237061629AC9A4AF7153CDB3A In = 0000000000000000000000000020000000000000000000000000000000000000 Out = B98F3C9FA25CC07AA02F7456E15C7707DA6702628AB589351B8737A814DBCB9B In = 0000000000000000000000000010000000000000000000000000000000000000 Out = B01668CF19C69B22737F7409EDE201CC37BF1B23FC0630FDA9364652171389AC In = 0000000000000000000000000008000000000000000000000000000000000000 Out = A8BBE8B393AB0E3D0E822C8AB9F23B8F1C985E93E6EC17050CC6A0D82B27A078 In = 0000000000000000000000000004000000000000000000000000000000000000 Out = FB246A9EEC0AA00A971416718CF0BB789F44496183642024C5A3C8043C5E72F0 In = 0000000000000000000000000002000000000000000000000000000000000000 Out = 5937034D4C6184BC32CEF38ACA4BCEA720F3D3061191D1E0EB5C84E242C7DEEF In = 0000000000000000000000000001000000000000000000000000000000000000 Out = C0DEB1F9A2060A3CE111BC6C36DDFDEAED2713229EAC55C75608B9272E10B78E In = 0000000000000000000000000000800000000000000000000000000000000000 Out = 08CC99BD1C9E6C2AC03DD17C7BE3F0D744AAC4144D542D2F4D2F3366837E030E In = 0000000000000000000000000000400000000000000000000000000000000000 Out = B5026F002368EFAB1FC2AA97BE628698C41DB381B44F8BC2C8BE3635C8F0BCFA In = 0000000000000000000000000000200000000000000000000000000000000000 Out = 98A020137D37236B11D0ACFEC699107679EAF0339E8C0AAB3AFF1538296F754E In = 0000000000000000000000000000100000000000000000000000000000000000 Out = A30B09A7870D5FCF10704CA8A00083FF4ED2D0B78F530161C698A0DC272C5F12 In = 0000000000000000000000000000080000000000000000000000000000000000 Out = C4CEF7219FBA14B0515FF84CA552273E471EFB23A26274778C11D0FB61805A8D In = 0000000000000000000000000000040000000000000000000000000000000000 Out = 0F70F20E2513A79AD1D153C98981D5CD21DE4C134977658D1C9C4B4367A73F99 In = 0000000000000000000000000000020000000000000000000000000000000000 Out = 690A81F1FE0464FAB24A2E9861C24E52087D902B2DFB344713B42285051E5C81 In = 0000000000000000000000000000010000000000000000000000000000000000 Out = 403E430C39EECA88D967926B543A06FBB68654C348801FDE7466F34A5579E2ED In = 0000000000000000000000000000008000000000000000000000000000000000 Out = 715623D0A82109017F74E8DE00BF5B700BC6C161CA403CDEB9A09B659268B779 In = 0000000000000000000000000000004000000000000000000000000000000000 Out = 6E367FF2768A6D4C980D7D1B75F312663CB816E5C0191A8839F6F9E50A44853F In = 0000000000000000000000000000002000000000000000000000000000000000 Out = 81F33A1BC1018F2C4886865F55AD2FDDD891160D06717805F2687155E26DC2E4 In = 0000000000000000000000000000001000000000000000000000000000000000 Out = 1C074CA4ABAF8B662D0C75635F84FE4ED9011CE476C45F8214F798438E1CB9FD In = 0000000000000000000000000000000800000000000000000000000000000000 Out = 003D837BBB718E13778188399EACD53DF9781EE8AD3F77BBD35F5B617D38AB24 In = 0000000000000000000000000000000400000000000000000000000000000000 Out = 37212E518E30D555EA442EC7467B1E95DC06371C9784705D0D885D1C61981029 In = 0000000000000000000000000000000200000000000000000000000000000000 Out = 74119615B3146E59D08DDDF07CF0614264D73F2118CF4A5CECFBAA691B005F2B In = 0000000000000000000000000000000100000000000000000000000000000000 Out = 3269AEB6831504CB8679EA40F749072951EB1728CC5E21E45FD0D6B423F6FA42 In = 0000000000000000000000000000000080000000000000000000000000000000 Out = D504FD065F8D2BCD3D1D3A4B298328E09F1CB44E3106D156477E992AABE9812C In = 0000000000000000000000000000000040000000000000000000000000000000 Out = 8AA4012B4573828D21C20AC64D18A6EA73DA0347B5D1A71442091CA48655DB70 In = 0000000000000000000000000000000020000000000000000000000000000000 Out = 650189D78DE4CF754ED237A9DDADD9686B58D85D06D82E937DF6075F4CC87642 In = 0000000000000000000000000000000010000000000000000000000000000000 Out = D140E61D738C3298875886B8D8DE576E48FF5C7E9F4D0E66D0149D0BDEE19F49 In = 0000000000000000000000000000000008000000000000000000000000000000 Out = 59E7ADDB5E068640DE3F8FB015017E7AA7495430D2533F87D4ECE9F7EE548FA3 In = 0000000000000000000000000000000004000000000000000000000000000000 Out = 5481B8528EF488D0A4ED259244306AFF83145B7D675E159EFECE21DEF7561297 In = 0000000000000000000000000000000002000000000000000000000000000000 Out = 671EAA12D76BE21EB2CED2F61AC1E98DF94C1952C2CDFC047895C74F15A7F3FA In = 0000000000000000000000000000000001000000000000000000000000000000 Out = 6CC4F0E930B34481D03A4134331852EAED66667E3B3D8605F7CD3777551D2B6F In = 0000000000000000000000000000000000800000000000000000000000000000 Out = 58A971DF91F981284DFCA88C6A21AB89D4E6A12E0D8A1E12BB585EB697D597E3 In = 0000000000000000000000000000000000400000000000000000000000000000 Out = AFE25F910412D62DB9FEFBAC5CAF3D240153725FFF1B8D85FF835BD418028738 In = 0000000000000000000000000000000000200000000000000000000000000000 Out = AC99C31BFF7B16E8916E8ED5C969CE7DD1B7A4A009F2F03EA8FB240B1AB16CE5 In = 0000000000000000000000000000000000100000000000000000000000000000 Out = 85A6CECFA95E645104A45E2E34E98F92039ED921ADF65E78631E270548521637 In = 0000000000000000000000000000000000080000000000000000000000000000 Out = 1C686E808A38E9D3D800AB94F8EF98888FA959593FE9A78850EE01CCABF170B9 In = 0000000000000000000000000000000000040000000000000000000000000000 Out = 058AE81BE2477D2BB0EF309F69713D68196A0A9D758BE3814B565088FD752AB3 In = 0000000000000000000000000000000000020000000000000000000000000000 Out = 5B1919A40F9A5AEF568E1E24B414A85C0D60D1DCABAA2CCECA09A91D78A91D15 In = 0000000000000000000000000000000000010000000000000000000000000000 Out = FFD4927E8C35AFD614A39AEC5654A8CEF3CFB47B737BCD55342BFDA0B9D81E53 In = 0000000000000000000000000000000000008000000000000000000000000000 Out = D47A6B8BDBA65DDF5820DBCB3F1733018CFA0A3A278540C7FBD575E36E20F063 In = 0000000000000000000000000000000000004000000000000000000000000000 Out = 9D8A03520FC2F2653AC52B7C0DA06F5436858A811E5F4B2DB0B2182C2C8F6D12 In = 0000000000000000000000000000000000002000000000000000000000000000 Out = 13A17E3E7C07F58935075A41B2B5B332CC64F7099E320430DBEF41685DD95B27 In = 0000000000000000000000000000000000001000000000000000000000000000 Out = 9250C7028C00AAD64F1A1140F4DE8812608FCF15F3E91AB886C911E71BD41324 In = 0000000000000000000000000000000000000800000000000000000000000000 Out = C019BC0605ED4157C8D3E4761BC74D403558E426D04403B17C9923AA5A732C48 In = 0000000000000000000000000000000000000400000000000000000000000000 Out = 524FCBE1456CE1D535E6E75098F7A817EEB99F6D3B77A9705BF40674E84AEAF6 In = 0000000000000000000000000000000000000200000000000000000000000000 Out = F4A5E902E2633F78A4AD90C9305DCA8CCFF31A8CE6FE8DC3755A591D201BB51C In = 0000000000000000000000000000000000000100000000000000000000000000 Out = BB242C3D49140119969CE07F0021E400ECDCBDEB3FC8C92459EFF346878A6FF6 In = 0000000000000000000000000000000000000080000000000000000000000000 Out = 362B9130763C98696ACE92E946F2646EDB7A9D419CBE12ABF9CB40B9BBDB32DF In = 0000000000000000000000000000000000000040000000000000000000000000 Out = 6BF88E66479D09985823F2B87BD7DFDDA415442B5132B2482F9B092CD3FBAA4A In = 0000000000000000000000000000000000000020000000000000000000000000 Out = DF6777DF2585349325132C5A6AB16481498BF9A1957EBC2F113095669C7AFE96 In = 0000000000000000000000000000000000000010000000000000000000000000 Out = 37108D63C635FF214AF8A98DCA6A3E288FA14EA8F5E8C52A583B6F12BDBA3CF5 In = 0000000000000000000000000000000000000008000000000000000000000000 Out = C22FAEF7E57A7BF3E344132436FAE85BD59A9BF4AE01DA2545A6EE3779773AF2 In = 0000000000000000000000000000000000000004000000000000000000000000 Out = A1947F12BD61D72067884D47AC2C8DF8541FBB4A9EB2D0F1A8F6997207819AE0 In = 0000000000000000000000000000000000000002000000000000000000000000 Out = DDA4ABDAD1290FD66A171D9724A409B02612F8606C58D85D530F30E7CEDEA3D2 In = 0000000000000000000000000000000000000001000000000000000000000000 Out = 658FCE7342D3C8E1EDEBD0EF0B72612346500B72CEEB1AEED11845F1AD1401F6 In = 0000000000000000000000000000000000000000800000000000000000000000 Out = 518EE98053E9D1F1F42F9E59DD74A6D9AA0D1F1FDDDD4F799134B4C111226D98 In = 0000000000000000000000000000000000000000400000000000000000000000 Out = 1F2513F0CD6195005B81727F7784B1F109C2F680A5E3343A9EA0FAC21F35BAB6 In = 0000000000000000000000000000000000000000200000000000000000000000 Out = 2D05A4ED553CBD1F532EEA35D158F01F2867D49A7120ABE733A5F6C2E5C92C21 In = 0000000000000000000000000000000000000000100000000000000000000000 Out = 0BFC42AE0F93D32617BB3C7CF8E4A6515AA8668922E05AF39A27CAE39F9CA221 In = 0000000000000000000000000000000000000000080000000000000000000000 Out = C3F2631B8F76C94534ABDE0EB456EFA47DC43B08F7CDBE379622621B28458915 In = 0000000000000000000000000000000000000000040000000000000000000000 Out = 9C15E4A671EB6E390BDB67AC4441DA8CCC9E56AFE28B8BCC928FC6F3E552569A In = 0000000000000000000000000000000000000000020000000000000000000000 Out = EFD7A7E53F7F21FE9B9D4A5BF3BE5AE7ADB0947F8412BE25F7E88A45743E6FB8 In = 0000000000000000000000000000000000000000010000000000000000000000 Out = A524AC0D0DACF565BBA3B84015D995202E1F67409D63FE16D442CAF5C72C3D3C In = 0000000000000000000000000000000000000000008000000000000000000000 Out = 80073614FB76A09C3DD701E83BE717117A3694D05331B032F8104CA241F11482 In = 0000000000000000000000000000000000000000004000000000000000000000 Out = C475A4C797002B5C66A21DEF4295CDC4C9DE4F045FB0FCE7A1BDB977224BAC97 In = 0000000000000000000000000000000000000000002000000000000000000000 Out = 6D8547CABF8F0AEAF7A9B3598CBA769F545C61E8873FFD6D5E7EE9C1C5527F95 In = 0000000000000000000000000000000000000000001000000000000000000000 Out = 7187108D9F4506C15B5E6AD523167BD2BADABE69242EB6AEBCFE52F70874E757 In = 0000000000000000000000000000000000000000000800000000000000000000 Out = A195EAA4E6377B4C0360C343D52F82704BD85BC5905D669C5E4ECA7C1F028C88 In = 0000000000000000000000000000000000000000000400000000000000000000 Out = 72C72361133DFFEBFD3EBBB8FDC6B76DC530AA7FF5E22EE709B65BE866DACD86 In = 0000000000000000000000000000000000000000000200000000000000000000 Out = 20F3BF2E8F3876FA733F41CECFDA7C641CE579B8ACE9DFE06A64A4BA72BFA901 In = 0000000000000000000000000000000000000000000100000000000000000000 Out = D3B0F2A184D2AEDACC760448DC351B63E975D5E48444320733F19381EB973659 In = 0000000000000000000000000000000000000000000080000000000000000000 Out = 25D380557DDACD3761FED7B1EF2AD9B2CB25EF263DDDC08E34646EFBB696F718 In = 0000000000000000000000000000000000000000000040000000000000000000 Out = 7DF39F3B439912E4859500ED516F4096EF60A96911F626052B3315416C307F90 In = 0000000000000000000000000000000000000000000020000000000000000000 Out = D05070BC61FC95F05359B8B36C70DB0E3D5FC077F73C02CCF4310A24C91A0F33 In = 0000000000000000000000000000000000000000000010000000000000000000 Out = CD3683D700693575FBB3355F844458ED60B1A45294CD27CD380A9A10E660E407 In = 0000000000000000000000000000000000000000000008000000000000000000 Out = AB19432215B64F93A344F7E6A46B386C4AC159924AB4A6F366FB8552A96DBCE6 In = 0000000000000000000000000000000000000000000004000000000000000000 Out = 1F6B7158C0B0A4311FBEF86E39BD812BC94207D154B9CB2380433F16F6821B7B In = 0000000000000000000000000000000000000000000002000000000000000000 Out = E65A4E3567D420D98EF51C29405AB004A019D794C51A67A680F6D54F21F08E5C In = 0000000000000000000000000000000000000000000001000000000000000000 Out = 53382A486C2390F7FF94A33BAFCE7285F382BDB5BED4FF076D7A161B169D6B4A In = 0000000000000000000000000000000000000000000000800000000000000000 Out = 9E36673A278E023992B653AA0683CE64BA7CCE51239E091C80D98BC627B45A00 In = 0000000000000000000000000000000000000000000000400000000000000000 Out = AD51CB9156C8CB66C202133E098061688A0360EA0E5B49A9F47EB00C346EB1F4 In = 0000000000000000000000000000000000000000000000200000000000000000 Out = 9DD8990FD868111F6854AC54D85BA38B9B0BE3E02037B4A3DAD2D0D9E89DBCE3 In = 0000000000000000000000000000000000000000000000100000000000000000 Out = 8A4A51AEB3BFE9FEECD9F4AF22D2D34C534F3A2B127E959236407206A4E1DB2E In = 0000000000000000000000000000000000000000000000080000000000000000 Out = 32F59D1C8E62EE49BEDCCF59007194EEBBC698B888050723C5325A746463E3C2 In = 0000000000000000000000000000000000000000000000040000000000000000 Out = FCCD7332FBD25CE39EE7522F432185F2322EF05CF1F5E36A2458272FF1397A0A In = 0000000000000000000000000000000000000000000000020000000000000000 Out = 62775BB6A290E509389C0EA6BAE5C8567A0E034A813F9AD62666B4871D8FACA3 In = 0000000000000000000000000000000000000000000000010000000000000000 Out = 264AF724EBD387076F1427EAF7D7E94734A209DDFFAB1BF455528D8BFB548681 In = 0000000000000000000000000000000000000000000000008000000000000000 Out = 96FC8FF80897ED6F514A67FB4FA5CF9D53814E305FED248BAE6B5761A331E0C3 In = 0000000000000000000000000000000000000000000000004000000000000000 Out = F98B7C970726889639C19C75FA4E63BFF6D48063806A19EA4584B84F3C40079B In = 0000000000000000000000000000000000000000000000002000000000000000 Out = 76CA7485A665D0B76ABBB2909B193D8F8572C8DB77F969256480F63728ACA867 In = 0000000000000000000000000000000000000000000000001000000000000000 Out = 8004B9B6A39295D73D00759682C72DE9A49E7278189CA9A1D704FFFDE8F8AECB In = 0000000000000000000000000000000000000000000000000800000000000000 Out = 98177F21E631C18FD21733C5BCCF33243970AC5EBDBB19A257DC96BF43D5151A In = 0000000000000000000000000000000000000000000000000400000000000000 Out = DCE21D3195A4B65B3B2C3EF0A954A157785C8CA4FD195AE15BD7F420D9D5CE14 In = 0000000000000000000000000000000000000000000000000200000000000000 Out = EDC0E40C3027D41914BF3144A08078742B337B96DA8E503D4FF84BB6A8E97D55 In = 0000000000000000000000000000000000000000000000000100000000000000 Out = 013F21DD7052786E2C338B57F23EC2C7FEB0C12F7B3B28FBB5AFFACA27103F51 In = 0000000000000000000000000000000000000000000000000080000000000000 Out = BF8362CE587255D74A374DE2775680C02A02B2106D05EB9B1EB83BC88A9C97EF In = 0000000000000000000000000000000000000000000000000040000000000000 Out = CA72BC9BB4F0F6E2DDD3D641D94A62163A066AF9D77AC3937CB00D134DFD46F2 In = 0000000000000000000000000000000000000000000000000020000000000000 Out = 6B42A2D46EEBC60C0238517A9F2B78BA27CE4B87ED35261FB0A0DEDDD39DC753 In = 0000000000000000000000000000000000000000000000000010000000000000 Out = D441092F524AE16D1339E78FB13892732A5975705F90F82E54EE09D80448E49D In = 0000000000000000000000000000000000000000000000000008000000000000 Out = C7F6DFA7F3E4F92D6C20AEEAE921FA209685D0C20714D69A95D1F94FA41D097C In = 0000000000000000000000000000000000000000000000000004000000000000 Out = 300223DF08C84B22C569FC15ECAC264F9D1CFDAD758962B406C757FCA69D0A0A In = 0000000000000000000000000000000000000000000000000002000000000000 Out = FB81B52E00690B2F03F8D410A357E582F6F4367D4359FE7DD7CC6C6A3AD24CEB In = 0000000000000000000000000000000000000000000000000001000000000000 Out = BD5ECECE8B8CBC564A91294968C3BE209B15730CF7594D2B79BEE0D44391BE7E In = 0000000000000000000000000000000000000000000000000000800000000000 Out = 80179FB24A6EEC0173DAF26891251C3054EA8D7280F88D4C57A3F52B5F1AA388 In = 0000000000000000000000000000000000000000000000000000400000000000 Out = 59C6F16A4878FC819F3A3CDFCF7C5A8CEAFE9231CE259A7F9E377E3D8B41C16B In = 0000000000000000000000000000000000000000000000000000200000000000 Out = B18656E3D9D293F342A9A4B88884BD9A650D72368C1703B74ABD2D4ADD1B6A5A In = 0000000000000000000000000000000000000000000000000000100000000000 Out = A7213DAEEBA47277122DFC9FFADBB36881C6FA9C89293D2291407522639E017B In = 0000000000000000000000000000000000000000000000000000080000000000 Out = 33D62D3A60AF659D70978E12F6AE01D6D62686965288B584796B6AECC37167B7 In = 0000000000000000000000000000000000000000000000000000040000000000 Out = 3F2F1919206CFBEBC68DB1BD552D78AFF61F5AD296AF45F15145E176CD4E93BF In = 0000000000000000000000000000000000000000000000000000020000000000 Out = 4ACA600624783F035871A05365EDFD0D01A67C9DD59D38A68117474D81F4A93E In = 0000000000000000000000000000000000000000000000000000010000000000 Out = 9B352CDE8F0BDEFCC8B1F37D34B3641FF6F55C05FF5193928402ED95C986D1CD In = 0000000000000000000000000000000000000000000000000000008000000000 Out = B14B9519FE51B738F81BA61AE48723835412B544F41E8CA4D3C2BE8B8E7B7ACB In = 0000000000000000000000000000000000000000000000000000004000000000 Out = AFF464673EDD86FED0C0CC97BE3DE9375E61503680B17AC4FD44AEDC02EF086C In = 0000000000000000000000000000000000000000000000000000002000000000 Out = B600CCFEC9DDAE068109C82B0B7BA3632501857EB23CA7860FD26F3BC1335697 In = 0000000000000000000000000000000000000000000000000000001000000000 Out = 884AA440D0320D6FB74A8B02BBE5F7DF50CC4B83571523CDC4A2683776AD6218 In = 0000000000000000000000000000000000000000000000000000000800000000 Out = C20D94291275F858E53FDC834B0E02FD496145B8713F53555E863425A61D1E88 In = 0000000000000000000000000000000000000000000000000000000400000000 Out = B1087C12C70D6224460202DA3FA5B985D3D2B130F2347D6BC7DC7668856EF5B8 In = 0000000000000000000000000000000000000000000000000000000200000000 Out = BE7F81F61289AFD0E08467938F054F69D2795E570D0F5C7577125BD37D72069C In = 0000000000000000000000000000000000000000000000000000000100000000 Out = D7E79AEEAEF9CDC5889C68E98DCC7C1D85172D0F183A62815DF0104CA67F3068 In = 0000000000000000000000000000000000000000000000000000000080000000 Out = ABCAB82BD056C3A975C8CC78B160B1A726EA2D58DC8775EC9CC1E97B1887263A In = 0000000000000000000000000000000000000000000000000000000040000000 Out = 716A3871C88D6C0D6AB03C6C925CA5B0FEC9816CB393BE5226E387048DC379AA In = 0000000000000000000000000000000000000000000000000000000020000000 Out = 046284F44965FFE307372B5EAA47D0DCFC282B13B1D13FEE3786A0A2173CA034 In = 0000000000000000000000000000000000000000000000000000000010000000 Out = 0316CC9C233290D72C53938CF8D216E24447D95114C3F9BBF2FA508EEA9E72CB In = 0000000000000000000000000000000000000000000000000000000008000000 Out = 388A34BA91711C31E14675BBA6CC29A157237E2B1B6095B02A49373A8ABF43B3 In = 0000000000000000000000000000000000000000000000000000000004000000 Out = CCFC11FC56D48DAF0F233275E9E591B76758CE6099465FA3E8B925FACC8C1D87 In = 0000000000000000000000000000000000000000000000000000000002000000 Out = F1C19314208EC565B4E50664B650FC0D256B4EB5A177ACDCCEFC78BEF7543A6C In = 0000000000000000000000000000000000000000000000000000000001000000 Out = 954A6575B642BDDDD05409CF5973BA837F25B2E391950BE91FA23334093D88F5 In = 0000000000000000000000000000000000000000000000000000000000800000 Out = D8C9AE155F36F1EDD6A9A0FBCE9D8A2D97EFC4896EEAB31FA4B2A267F10F83D7 In = 0000000000000000000000000000000000000000000000000000000000400000 Out = E1291A0E2D900F2D61C7B915EC60CB2F26C58DE63B0DA7F1AA1F40FB609C7261 In = 0000000000000000000000000000000000000000000000000000000000200000 Out = 18DA34910AFFCD9B1F0B80D57B2B545DBD3FCBB9327B0744553B0AE309D01F2E In = 0000000000000000000000000000000000000000000000000000000000100000 Out = 0B07727D83B28795BD6CBBCCBEBEA5CDEDF3430C407723FD2F5270BED6F574B7 In = 0000000000000000000000000000000000000000000000000000000000080000 Out = 6580335A2908A8845A95E26E793D522451579D91C90A4C92D8667361957C4FA1 In = 0000000000000000000000000000000000000000000000000000000000040000 Out = 34B59ECBD01296EA9FE6C2F1E22AD83AE34AD9917F762E5AE194700A95F5B08B In = 0000000000000000000000000000000000000000000000000000000000020000 Out = 8C7809B15F5525F59885E518A954871A34A4850A0C5AC531CB5564C91D10FA81 In = 0000000000000000000000000000000000000000000000000000000000010000 Out = A1F386B9AE9B170E1F02E3FA611B991E4A383E1D998FC03F1026028B70C5FBB9 In = 0000000000000000000000000000000000000000000000000000000000008000 Out = 25E947AAA44B7574BCE0D0AC4D91D63489A7837F6AF73764EAB3CC83EFF2B01F In = 0000000000000000000000000000000000000000000000000000000000004000 Out = 1B85D67D1481C20BACB50AEA0C506AFFA04B258C049A8CBA641DD4D3A0ECE1A1 In = 0000000000000000000000000000000000000000000000000000000000002000 Out = CBC332EC5110FEAE214FF569FECA4BEF1B3CEB809F0E2362E3924A762153785C In = 0000000000000000000000000000000000000000000000000000000000001000 Out = 0193D8FF39177FC604D8C0E60D5495222DA10CD84D4AE6D12BF84CA923158B31 In = 0000000000000000000000000000000000000000000000000000000000000800 Out = B6A210AEB8D431276712B83DFB27A338166436C37B13E533E6A664BC0696E21E In = 0000000000000000000000000000000000000000000000000000000000000400 Out = F1337369C5303A28DA9132C4562C7D1D7381E3F30575F05C72DD3E969CFCA5EF In = 0000000000000000000000000000000000000000000000000000000000000200 Out = 5BF54EC3CE05919EFEDDEE2AE288118DB06A3AED340D89CFE279D0C6927CD336 In = 0000000000000000000000000000000000000000000000000000000000000100 Out = 084E640FA57CBF5F097FD08636FE5E98E23839D95C532099EFE1A7A838DBAFCA In = 0000000000000000000000000000000000000000000000000000000000000080 Out = 63794A3BF8875AC2C32BA6238D27E7E15E56A3B794B8D2D6AEC82FAEF2360E3A In = 0000000000000000000000000000000000000000000000000000000000000040 Out = D9ECE2CD2214F52C55DCD9BCA56A900EC79C1343F12DF8A60F0298D255896B61 In = 0000000000000000000000000000000000000000000000000000000000000020 Out = 9633190BF775667487569D0F5E7ADFEBC899E55AB9D62AAABE9F8754A3FA9C20 In = 0000000000000000000000000000000000000000000000000000000000000010 Out = A3ECDE0C1D9DAA6B7A949C87A1AF7963C69CB2C412FB3086C495F14630C17B7B In = 0000000000000000000000000000000000000000000000000000000000000008 Out = 38DF1C1F64A24A77B23393BCA50DFF872E31EDC4F3B5AA3B90AD0B82F4F089B6 In = 0000000000000000000000000000000000000000000000000000000000000004 Out = E38990D0C7FC009880A9C07C23842E886C6BBDC964CE6BDD5817AD357335EE6F In = 0000000000000000000000000000000000000000000000000000000000000002 Out = 9267D3DBED802941483F1AFA2A6BC68DE5F653128ACA9BF1461C5D0A3AD36ED2 In = 0000000000000000000000000000000000000000000000000000000000000001 Out = EC4916DD28FC4C10D78E287CA5D9CC51EE1AE73CBFDE08C6B37324CBFAAC8BC5 # Randomly generated inputs length 1 ... 129 generated by OpenSSL In = FF Out = A8100AE6AA1940D0B663BB31CD466142EBBDBD5187131B92D93818987832EB89 In = 973A Out = 149B712A766C0A02B72C6C3A7AFFADD4085D7B05931B4516EDC65A9EB6E22680 In = 3009B8 Out = 96A75387879E8D57480DF10DCE407C6ED6797EB43256F5410EDE8755EA05D4A8 In = F88519BB Out = 9658E45D0AE5F088CD673E167919285968A2878CF9D1CC63A10F09FDE37C997A In = 8701E337BB Out = 3A309AFCFD5ED8E1CE622A8D559961E428664A6F727DF4C22136FC4EBA08ED23 In = 0D90326391F9 Out = 00037AD7367512D5AAD2F2A804722D3155D2D0C98DE3935F2174F922975EE15D In = 5D10FA95BD08F9 Out = 57511743DC186AAFF0F93B4040AB48CB49139E7C3CDEE653F61B5E5F61C71D36 In = 4984CB3608F9645D Out = 8B68120DC066C80F689DE09BF75A661848657589D362FDC528A2ED63409B5DBC In = F64202A9B1DA2E688A Out = 4E49C74F6DECA3FF64CC1280E2BE7C8568A02999AFB9E5C0ED9EE78322B7A9CE In = 86F8219D69CFDE40A2D1 Out = 5CF4657D7B134962D64F46DCE6E09F94262123A0F693360F842345FD3F475665 In = 3D075A7686D6F2B0D933D5 Out = 476EED19A66A112B7991A04062FF281B9595A4BC45C101629E92E3DD402F8EA5 In = EB6BF5BA40801B27104A5FB3 Out = A1A726DE33B6028F6D75BEB140C0FEC93ABBCD0B985E6DDA3BF818AF8E2B7096 In = 23501486108F3DE2E9524C2EFE Out = B3883F5C7978D40CFA25F60E26AF8E26480586DF3BFB5F238E53F3A5F241FB92 In = 6E33B6D645ACD2C80CEDB84500CD Out = E208985459AA801305493A313178D45D74E73B26AB268ECC57762D1F219B1DBD In = EAFFF26976BD4F943A705E36E62A69 Out = 48A1434C314BC67604FCAE1EFF83F17CF05AE693B6427CFAE3B1F6692488D8FB In = 522051983C571EFF97886F19B08FBE69 Out = 1F73010D11DBC5C283BD2ECF00B1E8D3745095260E1FCF00A3ABE0F0CCA4A2E5 In = FB487FFDC5115F00EE6D5B7437E990B78A Out = FFE14FF1BEC3D445A8E6C6F8CF66D054D9B0FD00032DD1FE7FEA7DEFE2CB88E3 In = E5158768A77C5FB06ED06ED333AA54A6C185 Out = 8BF02C8642733293011185538969D1799F5CE86DF439930F995C4E3E530089FB In = 87583947BEFAAD4B43B4DD48FBA48D659F679C Out = 12B778AA6A84E7FFA6449F394E4A2F90AF4BEA3DC85E55AB2476216A87689B82 In = 620418D700021FBE28E0173CE6102DFD3BC0A303 Out = 186ACEBBF96463131AA08F68E1ECF96BD17A041BF4FF054585DE252B85EFCF6A In = 68F055AEB433075CE3E29C4763A49A5919D90CDCCD Out = DBF521256DAFD25F7E35E58E3BE51664F950292073A18EBD9A13E06B5B82965A In = C1FAEBFFAD2BF41EF1B65C68632CA044ED9A572A4CB0 Out = B62C1A8FD2258E256B06315D1C2D98746AC18D7B170EAD81999B6110EBF69601 In = 5C861F96020CC754B59066431EC96978FE0AB7FD9D1D0D Out = 5D3F355244C3B1E8904C7BED52BFC412B5CB8922634A20088D7EE7061BF2FB33 In = 9BBAC4E256126423DFDEA90BE07315FB057F1523137C9C02 Out = F9508865F80493F20A01A0277BED6E111149DBD99B9808578ABCC26CFE090A0A In = EC77F4ECC1F6EDFC63DFFBFE2EDF3FC9D348D3544A70888C1E Out = AF0CA3504E8364FFCEAEB3601E260F0FC43F9C565E76C3434CF16166EF62CBC1 In = 8758D30E8DD41C7F4449C4F719F4AAFA900D836D3919F6BED77B Out = AE4BB846E12B020A438565FC6001340B8C05C2F9DA4CA416C60061D7F271A582 In = D4F2A3729002173AB3F226C88FBC8C6B3CF7B73F9BAD2BB8888569 Out = A0D93864B001794CA7E99E354DDB595929863F3338C5840598988D5782BD28DB In = E4D8EBFCE3D71014659AC8AFFF185E6C96A6D404ACCFA70D794FF56E Out = C8A86EE18A1F5BE4A513B647AFDE990ACC08699A66862C21879DE3D10E73A0FB In = 0F212467411D16E92AFBFE5B622DE745B41D631B2EB5477153BE84FF95 Out = D5987E1E058D24E929C4ACDB342A8AD290DE72BF95D534D84B49629C4A4E4200 In = 4EDA3360C3E4BD5E40ED0B9EFA421A43DC364752333FA9F317DB86B6E5D8 Out = 68C0C4F2390A0A5415D9ACF86C659B148372EC1882687586251997C7CE519CB7 In = 95A4F9B80AD217FDF65AC46BF3BE11D49CF03F013E72FDF6B3D9C6BE560508 Out = A08A038DEBFE196F35D8F0087F9F2FAB1C0A10E3B01E6B2B80376A3DA25C0B1F In = A0FBA76B5E023C7E0CDA8B843B4105A7F0091092FDC254DF303B3C26F4A1F8D3 Out = 9F3D31E526C953D6D14ACC8768D890F800D09DDFA361797571F30B854B53D9C0 In = E58FD27C82C2F2605600D10CDCE144C54DC24F90C2D6E7CE7E8FA02FC32F247565 Out = 95D42CA4521F927BD726FABD165F37E0DA75B93407BF207EB2CCC8BD8EA1A8A9 In = 7B92504499E1290321C0FC7203F6C7D9912CC4BE9521AEA911AB14FDBFBA79BC112D Out = EFF00679E3B10E40E7F3F2B15070EBB8A5F0897EFEC7AC7AE55B39C569C2CB00 In = D515195525F3D271CA8072E23B86A00C603B0949C5A23A3E13078319046519671169DC Out = D2E644512D4B18F01DCE2F8481AB99AF5E7BFCD0E82C67FB36EB09DFB0399858 In = C399A4765AA46378B1CB64B7BD9D84ED6E288052D1D1CF5DFF6C0D0B12DAD359578FFF51 Out = F08F6B46673F1A596EE4E493CB5136DFD5020E2AF13869B1C297E0341AE99DE5 In = D1E565EDF6F4EE2B12A16B440712D9E52D890C96F3EE91495E53156A196FBBFA46A7474F64 Out = B8EDC023612884C4D42B55161455C250E3F560962A835A2AFBDFBB25A4B51C39 In = 31A55CAA88925A63484E53D946B5FE86B34A221519FD341AE1E77C7C4196DDCD174F16C98263 Out = DB84214C82F246EF781652F39E39D8594B5DEE43A2D9FFA3F67B4BB11CCAC40D In = 3D888A1040AFFD114A719D42EF733314612618ACA03AB040F35EC71543EE1F02EDC37CE6A84C49 Out = 2447EFDBA2DD415FA6454A944C43753F9191AE5C7B0DBB065CA5C468DA0E4CC7 In = 0F801C7FC8FF2EE603C63CF1AE42D1DC9D73497245341986C2C39D08075E624998C47694E038806C Out = 4A5051FB9AD23815D88B9E003883169B25FD02BB1A06FACB36AAB35E252D62F0 In = BEDE92EC1AB0BF966C7BC098DB7807B86A735A2B89CA7712F1F93B3FABA69F2A867A5F361CA235A088 Out = 39A6B566A9D5A3AB3BE43D022D06A77338821A891BB952431DC500220E3D62C8 In = 47B80BC42FAD7773884849297B4BA941DDD42FC14FCA3C39E2DFCC48C6AFCA7D8C9D55D5156473C3440A Out = 28CA6AB9E8B5ABA81389EBB03273F09F54E398497632A5826B39B41920CEC687 In = 9522C8A3990D3D4CCB4C3D41C9B4655DDD35C33307D4EFEB74C583C29BFB84A98954CC5868C23C78127589 Out = E0A7C694A3700FEC0A16335375641371A9C2B2C68B4DA08AE67CA1FEADA33AE8 In = 169B7817ED75369341658CC854EBBC0AC11A531F94C1F4B9260732610803B0F2096A2E9A65B6C642C2546442 Out = 12BD7465B0E681478552B94DCF6074CA70529D18492D857FC8E658C3398AE5B1 In = 4F52B6723E7165F12D76A70BB311C04FDA7E68FAF091BCAF77065ED3E77015D82314A252EFBD7CC4A92473CF60 Out = C0CA351E2A50E8D1E2E0E994A7F91FC6CF338822FB0FCDC388342A5F99F0A62F In = F38B8C4FDC73F40E3253C1B3B14F196558380A3413D34924E0487F5AA77B3384E9F6E046309AA062F7C813B601E1 Out = 6DA821D8B24A88EAA765D0BFC4ABC03E147E15BD62DDDDE622FEDE4532944D52 In = 41705AE5A1D12FBCCB4426CC811262D21C0C46DFD2DCD8AD7B92CC939B5549E063AC399A1E5613B545364F18F7BF4E Out = 6EEAC8187BC0564F68E63CD9231FF6F352C18461907A2FB1C2DE93ACD44940BB In = CC70E84AF58D027F5FF15B6FDE96AD30450D7F871C423A3531AE6FFADC8DC87ACDED57D0421BA15E237575C04ABE8E12 Out = F0B28375878E437940D7EE4E7BC2DB4C4C8B5D3B6BE0C0755C10AEAB00A29CA3 In = 2DADCC9FD75291B810439AD51B29502464F810F66E6998F348F4E2B5D5F128570ECB1FD671C9423E71DA3EB5F6DF1E2F33 Out = 510F97486B03FF7AF1FECA9D0308239F63B4F8349F1FE2A577CF9DA93E23AC3E In = 0C086B9C06E92746E5325B86C9D8423ABBEE782E0CFF47BFC618FCF49A1E09FB5C031089137553268D63AAEE75A662D93C87 Out = BA5369C00659AC9C5337A38E51FEAE0F005B0123C9909FAD5BD4605BDFE9C445 In = DDBB8C24637FF24E073E9EE299AD5E73493C6A3AD0EEBE0D5130A65F3336906378A02E84B2DF4D925DDDBD44E84234F80B025C Out = A7F11830A67D3E2C7F4A37A4B5D274D4D0F3840B86148F1AF85170E230333188 In = 6651A6054E16D4988752FE56B3E4088CF86FF6CA90EEBC0E3E5C4A5F14BF9CF643BF8652827F439F6549351356D2761632BB14A0 Out = 3F400EC10FB5EBD455EE9175661657ED36D44AA6EAD84F3772FB7B164D40B29B In = 18532AF22D7F1E2A18ABC479CF6E899561C4A9A92AB27967D2E079AE69B651F01A9C95AA6908623D2DED86AED3A14E361D7ACC465B Out = D523310B1FAF11C3FA9FFDEC513EF15B41DEFDB877B4E9525B2519C8B1E5C909 In = C022F99C785A0F2F1210F27D94CFD60D9C99368C469882C18899F7FDF2BF12E6BE231BA8F6858368678596D64328FBA2870F526D4C0E Out = 7F9ECD5C9F908D5794A065D457DCD31DFE6469AA680F1B58C8CB666ABD17C1A9 In = 966D0D84D3F2BDC957935613D946509145B3345C90BA2244810EA6095EABB9C4F785868E61115B23AADB8CDCDE99FC83509D52CC67D582 Out = BCF40210B6A8CAEE5751984946EEBF7FB411F8E5E0FD5162E5C640E6B2A85075 In = 7B5E2FF358964BCE486DEA8C9B85176EBE361CA9C8A81487187D72773232BF2EE9576E02568AE3CB740C05B8A2BCFD7FB9B03EAFE41B9A93 Out = 1CF74EC4B3315D56FAAC576D2DBAF1D62D53E0D59A256E6F5C83C496A71887A6 In = DFC064E095B6E2CC8DCEE66470FE361EF1DCEA43B9513E7154D2C12C357C5A1C86F59BA0837C1AD55314A5D2D36BBDE483EE7700CFB0ABBFC7 Out = 5B8E6CA7EBFBF16B9AB45D9BEB2789990713D61CE01823569D7B5A34CDB4B9C0 In = EA76A6E9F25F8B634F9997BDBDF34780D6D1E206C404D1ADF7DF45EA579D64E5EEC7D847FAA1423636CCE2823333E0BF7B2789F9968F997B45E3 Out = EC7994335933794F14BFE62ED48841383B163AF4D916B10C60614D1796F06D37 In = D73F2D890A180AE81922E250E43F13484EF5679BD5CF8BAAC362DEA4FE58F60CB9CB87802D72FAB4132C505695FA4E5E499B6D8F8CA5A13E57C508 Out = 139508399C2B7AC0A49FF2B316443046860E7D932F21E7517CBBF6172542FDDF In = 970DD3B6376C81F6FC633F10C32A14F5CE0DEC000C4D47578C5E6EF7AEE8F31FDB3767D46E1376097193E1C030D8E1CCDDE953F8B0C1C78D5FA42FB8 Out = A5674DE8D6BFFAA12D400C8846E8748CB13273C649779BAF62ED258A4792DC01 In = 5506B56C3090990E3D33CF5E7AB66AD5A55CFED9E960D43CACA74437CBBEF28CF748F80A53F730E4B124B21D6C4823BD4BEF135CD33E8ABE6279A343EA Out = E76FAB992242DA701C8238FF19FF2681ED304BD846DF5CDC843BE66DCA51A5DA In = 7C72DED849BBEBAEB8E56854039DF5B4F8713840A992D4B4643EFF24F2A60573E7F89EAF10EFE903116A033F63A62017196DC27D189C55841C227795958F Out = 98E5DE57125A1DAB829FC0DE9CB014B60267F3A4AF412BEAA2417A7F9C5CCFEF In = AE4798B1AB6E006BE45ACC330BAA0FE66CB17164B18F169026FDDEFB16CAD07283C382008A0D7DEAF08266D07627B7FA34E1299280F07AD1142A988B2061F0 Out = 75A55F359DBFDA6DE4750467C18EBC50BBA0F86C15AE146F00D2A319C16F1928 In = 3B47876F88F7C4E7CE09F8BB35240915391CD5D335F12B40B3DA5E30EB504A196B484F864929C89793F93691AD4C062EE4861E811EF2C0C047266752BA43524D Out = 14609C054E038A8CB4F0886DE99B31307F2E707A072C674ABFA646161B6BFF63 In = 293BA657B574043AFB815D8BAEB83B03499D61EE9229A32DB39A8DEB5EDEA3509D62CF54A15EFEFA68396940381B780410A53A1D742149729083BEB205BAD17205 Out = 1A4E8DF414957FAC9338AD0031F77176CCCE4575F40D5EEB44C18BCE5A7AD812 In = 087ECFD0DDE2F63A7246AAFE357D3168B810E47A07F8EEB24082B157CDEE2B8D86723F4DCF08047E1BC238C3E649808263312FC766DD0ED9346F07B91C5E8AA2856E Out = C446A79314DAB7D4E93C1A06DC561C1EDCE3DBD41A9216E745DB5CFB58B4BD10 In = C06E7A4D50F1038D0CC42B915D6D500297DA6BAA9311A946B381DF248D5F1C9C4FFE52BA6C15F174D5A0365B193A8854C74616C4E2178E77A5286D86EA5E5E5F1D00FD Out = 0EE3A6C829C9A0A47D567B4ADD3224521AD9E2F3B7D5C1110A974C725F625B05 In = 676C2841C4945535A4BE0407946507018FFD9A56A05D3CCEE17549038E5DF00366C7AAFFA9063547685F0A0D2D6BEE151D923DED73D06A7A468BF79D48B93694A513D973 Out = 65B35BA31CBB29AD6BF5C885B3FA81C8E432BF4FC35B38B1031006113CEFD14E In = ECA5C2A10879DEA022D18594548871F3D55310A113FA9FBC303B7FCEE224AAB34628637E19DD4A0128D28418630E6BD5717EFACC1A944AEF9529D8B014FC8049A4FA5F6B28 Out = 70D209943C26F74C32132F6C72B387CEB8C7375E67B214930A306B4ED71117C7 In = 5FCA053E81D9D1165E2DCB05C61AF6DAEE510620D12CD359F55B91CF4D26A1FB5275E787E649F79040DD2E61FE42AB9E17403120921C62CA0BBA185DE631E9F0629F67499ADE Out = ABEB92AC392AC96787D04481026BEC5210C96A9CC9DB2735D7CCA73A53EB5D5C In = 897704D8AA9A96F684A999E6E04A4E00E13C363F0DBDC4866B4CEBBD0A9A181AF61FBC13B546135248BF78C4CC8DE88D297191489BD6D6D6E54BE31550EEA0B2A6FFDC78BE579D Out = AECC884DB001CA82ACB3E8568FE1934ABDCADF0ED4B76ED5F68600A0671A30BB In = 069E2C17B8A2B2C69979863A53D7C5A83CAE7F51CEE7B496D8D6E5628239B4FBDC9692B2B2CB7663C68290117BF15EFDA791654F9517FE08CD96814B3202324F9BBCD7AF76F408D4 Out = 7B9F7E72E2DC21D382EF002EDA3404BB4707FA085B0F8C68142A31748B78C338 In = 554B3377A960EDA40EFEA9FB9F97C68DA8D9B269036558D5C40CC1D386F57C2BEF45D07907B0D086BCA6CB13131E9C5439CAC1FC839D5A6E3C4132C5950DEF0DD075D38C62926BFF40 Out = F3CD66A5AEC9E1896A988E2BF1FD24A7C394F987E70EDF2BF58D4BC988CB2C6F In = 5B63E62B236AAF438D7774F53B76AD569B670E6689537F51CA0AB7FE23E89283305718759AD4C588194E3B76366873ACED496FB763F0D77C2E3A544AA07F470D7A4023EC39C200FA52D8 Out = 389D006116A6B368EA275B0152E7535B6C0D0ACC19FC9AA1F217BB76164A6747 In = A827215DF69240B9FA27A5F0D01C81824725BB3B89AC58EAEF5658657FFA5157B3EE6AEFEE529F7A0EE4160F5BAEFEEFCB542DD8E96A43170B6E3BF3FBC5F41D6A00CB2C229790F801C86F Out = A622312F496564E08EDD2526C31D1232523BBE051BAF351CB08B829B4CFEC272 In = 793F35FECF83366E0F252FF50B639F70988BD87441FE3F6A01F60DE59E2E331FA68E9E12C20D3918F4895392051D3958FE3248CD43BF298B7F417D6448E29A7EA96D7731B7E885E014374410 Out = CDFDEE23FAD49434B697448122522CCEEE85ABD664B30D216E923FDA6BCE24BB In = C41419D5EED53E00812BB5FE549963C1E1DF6A6A9450767F37774FE604033BBC2DEE6348E2B2CA7E43697CCC45957EC27AA030A7C136FEB81DF63914CB0D38FDE7F1BE96009A993D62CBF27791 Out = E65F755C8890D288E8B234D490B5063996DA0D9C47301D965F6EA87C7B1936D4 In = 38A6136F07C7C11C99B2255A8E5DDF3E5C0825CFB4F9C5245E8CBE8EBFFABD28CAE44117F52CB704E6928B07D0EADEAA10684F8A3A9727D94D1232A4D448B65B793ED71ED666E6BB239E8A6FF8A4 Out = 9B87FD77DACB93CF2FB316C78BDBC5E5CC7FC480718823CD16CC0CC527BAAC46 In = 3326D34CA091609AF2C5174D0D08EB2DDF0B341DE4411D72BE44228CBEDEA4047CDC388800EE6A557F260DA19C23C016951970699D95D67CCFF825F7D5F9C140CF484BD6DDCA7E66AA8E8F3D7E0835 Out = B0BB87B246AAD67CCCB9A306E4768BAD5F95E06F0E08A784B5A86DAB9BA52B02 In = 3BAD194F1615792001AA4805F0328ECA6227AD785D6217285B9DC1CB79CA71E01E95BA91597781DF728F6DD4D115C1848FB8F3DCB367CDA35F17CB8EE897492F8FE067130B3B40B542D7929AFB4F08E3 Out = B1F0065C655CDD4BC3CA68BDAE1194DF719A6ED45F299BB597C9FED006C36B87 In = 23EBD4B1D86BBF9ED8E1648B7BDBC2EC8C2F82C64018335C5C76E2CF908B11EB9C6EB2758CD0CC73F215C5979334B810F51AE39BBDCAE98F8DE9753E65E1C80B7606F3FCDE32772A1603A4FDCD6FE3D109 Out = 34745040DF3050620965DF4BAA159AD79F1BE50D93FD02C804C7CAB741B2AE8D In = E6E89AB035B35FD24D2EFD0465854F886539B8218D1F4614C9929D72EBFB33D574EC4B97AE51238C542570729DB8053BEC8BF770B63F5B3332B2BB5D3F6E3FD4A942804AE06B2E9850454A28BD9C8FD9D1A8 Out = A93E25F37D70EFD4FE4E37754083EFC23AD924BB41E944CFC7BEFBB1D828B2D6 In = 760CF0A6724676CF48CF494A4DD4B90040BF0622A3E3A6A315F587AF8856B7C5899CB5C91FE499A334134AD6578DDB71CC255E087756929A972D282661B93618DFDCC9335D8C91AEEB94C7AE1D778468CD25F0 Out = 4E77A9EE0224B965103C9125D0684B5D98C6935ACD5644CAE9917E834F693F9A In = 1A687B6941E5CCF1292FE0EE45AA19429A5852B4C0CD8EA6074797DBBBE796DD694C4371F6BF1D8C73B6871A8B2E7C57525A3125BC7361E77581A7E27E6D38D925EBEB3DF8C46AD3F650F48C6CC7F80F2B368C17 Out = 5B831CC26F5BBCC8B6D0A62DF829E8017DFD1773A80B138B5CA4D6565AC28D4C In = 18340BCB8BAEF6D990D90F5CFB9FEAD4E380897219AE35073BB1DB33F2653E58A0394DAC354DDCB8444C5DEB25844393EAD5EE25211E944B222E9AAF73D3A6275B1F7F31459F1E6FB55C64AAB1E482DD8C91FCD1C1 Out = DD331C4E1982F2A115B8C516156363B1C58D453FC68593038F568A61375E40E2 In = E8507672C6D566D62970EE499C67F5AC9C44FB3C5D577C78E8FBB12AB48458259765E8F2F6D0E7A343E2D20ABEA2B3DC094CD26379F73A79AF40EBAEB0304C01DA08F4BA2F682D48291C05C056617AD340B60581AF70 Out = F211D53A0E2E172FC456F23396E3A631E1A153F179E28D06529ACA5C39CECA74 In = A5E5D8F4CF5371C4702543F89FF7C1B46918288B5F06282D3E26489248B7B3E8135D9C71E9B2FA4436F004C45322DA8476454B9C350E1BC477ED575504997A768B30D8FFB16023241E9C6D200819D3D9558D0AF6D74211 Out = 4DA2AB81C2245FCD196D7CBC7AC5BD262E11AC7B34ABB3B2E09A6534FD2A52D7 In = 790168DA4356E71A50575F5629FB1BCE51EF4CE99E9CE9988AECEB1F1624662526A300A4EA3B68225C86BDD7AE48E2B09764E0E939A6120EC30B8563B20ABBACF42849E190A3483EA681A1910FAB84210DD9443331AE39D8 Out = 727954B75AB7A1E4513B113E05055CF8A78940241E319D359B7A92A7C78EDA3A In = CD713C0D54E47C64AD36CF54769D87FC653E45B75622BD71AB444B8ADA3D247CF6DE7CBD68136B65FD7DCC46B829120C7D6EF12B416AA027C064F830342BD5426B91C4F4C6531779003F0F4A4850091A299C7B2D284D3CB84A Out = 52D52244B334667F16F8C4367C32E07B4B61D3CE1841CD0EC1128253BA225924 In = A3786164B8B87A3D4A32D1CE5151341AB96068EE556E339E519C7C83CA19AAAA0577BB6502973F8F40CE87D6279F3384201FB7817075B92423BEB339043512C4FA94707CA823E3FF4EEFEC142EFF91838651679F198F2563E67F Out = F61822440C88CE3B83CE2372A2A4B201139A324E6E19EC8797667B13ABE18010 In = FA6D2D40E0653597F75E394F45DC0B362B528CF2CC21A289FD280506A710E7CA844298F430CAF1E4E0F021742EEFCD301180A1D0A7A7FBC0DFD0DB8C660EFE9C833C6F1C9FF9B26EB4CE1BE198487FD5127D953F6003B431560AA2 Out = 153419B335D6AB697EE165364803812D80617DDA1E4F053BAAEEA1FFBC148EA4 In = 3050EE1DC8F4C9AE18E85BEBCF8DE0412B8905C1582C0864DBA61BB4BE0EC35792C7DE9C9DE93DDD2B36AA6919A5FD955871C3A47DC307BBD804DCEE613D55DB0953C0354FE2613072F0602E9633FF0920159A1E6364DC6F81DD07C5 Out = 37F1D7184E1308664D81F076231E0ECED20D8D1E1AF28DCC26E38D24084821E1 In = 27C57B7AF9E3D12BD0080589E341E17D3A6005AAF22374C94C851CCD54FC8D1C5214055491032D16123C3E13BD1EB14DF38DC775D04436AF6EC77FF523B893DF1FBA68F785E77DDEAB75AEBA9B246901975C213F8F8946F716C657C967 Out = 7E5CDE6276BE0FDB98C230B2EA39A511FAC1B0CFD811A68D0F312AF05D3ADFE2 In = 92CA69E867F9761D84CB348535AD0A256F51E3A883CB81F2CF0B98803C76C7F35F7C24F960653B133E151097CB7DCC7D2FE1C4B4B295C4B1AD09D22CFD6F46719C55C5D479FF883811EE80AB458F5A73D97B6B16A9052E02248BCCD04F46 Out = EF177EBE105881BB17D3130A8F88883F1EE8C75B9843AA24955CCFFCECF35B4B In = AF577FE64CB9E83B8DB1213EB42E695361B09027FE028DAE2CAAD2053896884D10369EDA5C4E221115C306E2295845B84D37D416C24F48901CE10BA9AD9CB935182DD8C7C63E60A0C7B82A65A0C759A806A4B6F99B912F4334153A6C14850C Out = C43D14A7250B39E1E39E628ED7D5DBFB1C77818AD49F959B7A99266E55CA06EA In = D60684AD738ECEA11C36540BBC74B3C098BF0AC9D930708D09777F8D0BDAEAD29280DD0A547DFB173A499F27AB63B47BAC72A378ED7A08C7B8CE3241E559A49CE8FE8298BAAAC3D1DF3B12CB1976C850856798C9B5424F0E93F0E2EB808E018F Out = 37607B2655B0C134658E9C80063F875156DEDA87BFF4675200D3665CBEC59F44 In = 57C98FCDC1C6C073F316CF07B4CEFB38F088E6CC29FD7504557DB22A711CD71776743E9F1174D205B7A28737515BDD8AD90A68F86663AD0CC32E7EA77B8BBAB2CD4555B2AC07C5550A4B3A9F6BD1A6CD4C88D309FED9434723B90E5F51C098FC59 Out = 77E8C3F2FB95D755C575B43A86DC0B5E8D49F6DD72A79A47B0317207E92581F4 In = 89D5D2F1C2906224E80D259AAF9CEB4E3EAF10B4FF871DFF0FD18699773B9C200DB8FA2AF9A1361363D6B588B56651F3FF05990BCC57E6975EE83FF5964AF4647F423A2D32BF65718A4291665B158613AF16F1F048D8F5872B350BC54640DA3BDF4C Out = 755CAB9ED51681C7E71795BFDB66015123F70A8F1190D4B41F3130AACE642CCC In = 23DE91FBD7311A58B821B5625C7D055194DC1E5000BE5D94178AD3FD67967941B5EAB62A6B0F17E9635FD5C818EE6A51206A9A98B4177BCE0ADBD3B9844F69C941D3941A9345CAFD5EFBBBE70C287A6CC3063F1F941ABE0229F4CE72E2BCCC4E59700C Out = 596FBFF31FF4E7163C27D3CD23D4CE7FC2A5192A22F3706F8727943FD7944E14 In = 876DBCD4E797BA073549E370B4D5D8EBD74913E72006CD9763CAD301765D79236D876B168144C0FE621F1E80471CAEED2024758967FC653C859229824F73977E55F8CF0078E098191CD077E3EC744534965A9C8AC1A92E566CEC1125E397125B193A3AA2 Out = 72F557042BA095FB1D73ECCBF2D2E70F1CEBADA211C513BC3AC52D2C0B356279 In = D81C941C365CD3532572CAA53FAF31D7C1666FE0AE5AACAD7F69523386C6BF215E2AEA59297B82FACCBE4CADC22545D6BD882C8310D9DF274D1FDEC6060CE65A55303840FC7545900213B2B03032E6B1D0D8A35FAB6A47772F653D1AF8776705A5B4106CD8 Out = 1D4B5DC2C54CF61381519D0B879E063D582A129DC5CFF9226C4F406E28A25047 In = A841FFA8DC92FEE6791F624CC8C24D4B5F43E488EB555AC4932F8FAE7C9E66382968084C3C548C72164247EA3EEB3FBC6391DE092A100203FFA94854E494EFC102B1A8E2493F5DD501F25CE29096AC55AD85F44829E6636563EE6BE0A3831295AF5D09E0C37A Out = 4F8296D2E2E3EFCF851DB491B68595676FB52A022817F72A5092C7D7210FAD6B In = C4F0218C4E732A65DE55D513068ACA367B59CC77AC172159D10335B3B6B3CDAFC497B870E5C8124826F2E8DCD819FA9DAF5353CE8BFA06D0A3A51BE5926BC5B1C48A7F8DF8BE079DF93A5E31A83CEE77689A9BC6A182DED5B416AB132C80953F8686297D8F5E1A Out = 8961C85D32AEBA936958AC84D937155007A8A6C57FEC71E74D5150C28C08B511 In = 7268F226B77B788B1D9117158BC9AFC8BADD165CDFA25B0BCA050BE6A571C043965D3C56D876A79EBCD2C4ACB35FF08C8EBED3EA56717AAB0D3D14542C478878CA5EAEBD216B35EE6D0ACF6DE10696AC58D54F073923FA94E431FADB572B840C6C713A90EF45A1E0 Out = D50CBD42F2C915C3F295A920E22A0304E9752B8FB2595D92472599BD67D31DFF In = C73E0B4A4053AABDF1E29A65B09D022F1394277BB21E0CF1BD1F9459BC7FB3835FBA1C0B812E2867CCEF884231F2EA42D9F11A689A4AEA58FFE2C9A991F3BEF2E779CF10D7326A3177CF14BE3A607B86B4D57264DD6AE4A1E0984E520F286D865CC589AB8D56A85875 Out = 16F36A7376AE6F436FC9B406E396E2ACA7B198C75278963F2356BA8250B8FA45 In = 1A3800E5F2E087BD943B82F4A8E058078E08688112B90844DBC6862CDBCB5F94AE25F751222583EDDF91FAC7E07873CE903BF60B1F87EDE724FB000B532B556524B4F39BCC2F18050074F3E75A9ECA9E18746ADFC6606524969E78764BF6B00D9A6B151E51EE1C289D57 Out = 9BF5C1147B6B51F1282F17DFCADF9A145183D59E7787D2B1B66880072354A545 In = 7BE4EA6FC4B5657A402CF56600A531050C2F0399E24A7355A70D0DCEB2F7E9EA4D7B23EC4CF717ECDCA6128E823CFA294BF77EF1130496BD55C4218FFBB5C3A13F5697AC9F274E5C023D1681C5EAA49D4242EF1C09E24BA809657AC70F14B7BE3CDAAA1F9C086629C8ED33 Out = 8E5FACB215D8CDA215F92E89837436A599781E4A4CF8969E01F60855E7FD0636 In = 53D2469D8AB1BACCBC356941D1E46B57B619256DFED64CFC57FC8C0741E402C83F7D8423F216C92D16653403373FC1BADADD248E2FB09DA4ED919EAE75A87E4A2EEBE143C12CCC1122AAAB91CD1BA00CD2E767F1372B2201A163678DAB11C688DA47EB4E0CBA81EFEDFD7978 Out = C22C82136ACA63FAA9E94057DF45AC1F1E0A42B76ACA0C09A1391A1109AAE1F1 In = 9AC84800C6414AD40047F215B244AE0080DBE0AD6D7DF75C0080EAD0B02F2FA06649F7DBADDA4ACBA223A097BFCBF2040E13886C1733D5827D6FEAE5DE7A60498AB0DE5BACF4DB7BFEE612440903B91B66D836D643780AF9CB6A703EADD3D9B1C66E0DB2832EECBD892D86901A Out = BB99E1ADACB814E5A6515001EDCF2444851B2DAB7EE9BAAD7C7A6D47EC8C3AB7 In = 56504F109A5E577010EB5E98C6558E231943E0CFA32C0B2B0F3C2CD6A0054A2B9E9D75FA68877767DACED55851447271F3AF2CCB686F129CBEAD4C293E20C00D52FD75D1F99B19C124C24D455526FE1DF9F9D219FCFA92972CD38C83A8138874B7366662F94C0BBE5D9B8365B9FB Out = EC6C767C53B9B5184D548507B866BE140107590733D8E7056607D9199479731E In = 56BD9CA50966C8DC38740BACAC77464870C10129F70AE0E6555BA1D10118BD050260C51AE20204BE89E89AE584B7B0BD1C21F31B009298B516284BCD34C792735AE5B16FBE392D85AF6528B6F262087B122BF7DA5BE633415934AFC4BD492A6B5603AB3FA58944C6B65D327799E879 Out = D80BF63CF3F88309D76BEE0DCFF42E09C6AF9A750DF7328DF23CD93ED6CF40ED In = 9E6683645A4134573220706F51BC6FDBB0F68AC43CA634992ECE5AF9C8C25686456945FDABD1796FD541576D4A7399B1048548E43354381F170038838EDD5E65225F0F0D3D286B1BE618B4F55F4A7B7E549FFB1025FD6D5C1591678F8EC70F45F1A7C4EE6611169DDB2D04B9532F207E Out = D8CC725D6A64608D317D677560488645603C8393F46C4DA329D7DAE6B496ADCA In = 5D96BE06103AE7DB1A3FFEB6FD3A36767A75ABBC12A2054FCE11F0FDAFFF02A860D2E70633E37CBC7A5A2245A44850928D23278A2C77623E5E600C3317B04C7534AC373B557FD23BA7482CD984283DD8122D21AAD43B0297950677CE46AED23151C5434908AA4452354810376B4B7F7B08 Out = D31D217A9D2529F9ED1447D0EF3299C1779D31569D9D05FDF5B3513FEA6CE77E In = D985F6C0066654A39B02E59F699FBBC50FF748C08F6850EC5BF14133E7A4620FE28FE422BD9889139C1C9AC2650680631B22B68BD034D93980B65AC4E5EBB07CF5100C9728FFCC0FF6EEA69A676E4BDD0017A24771EA83661952ABF4E1D0E3F7F24B7862DD9D1AAAD3D24DC05914DF864C89 Out = F1DBA5717F9C7B691170F1E231FC99FFA4E104AC58B9BF0FAEC98DEE31CBC939 In = B548C6F1220F0FA73D3ED439C1432F60A4E46AB6F83D926DC946D4C252470391EC2B44D9F1436B2C9B55F20238576020D95352180A94D6040204A74378219346A849685B7BC28BD164595E2C97329DD59631119CBB9E1D323BB1A83F7ACF06F802659D1393485A7341AD04799E06B7814D0A81 Out = 18B70142489C3C3558B779E0D4CDA50350EBB1B143568A2D4F9501B0F9DC8F12 In = B60732DCFEA1FDC4149F277D7025BD5884C47283B7FCA241AC21E217D7DEB491F94F53D629FDB6DC61302F3B7CD14AA7FD91B9E703447B42395D82322E2E4F176C6E83F0924886A2EF0CCD14CFADDA53F2ABA7918E8A4C8DBD3F8075648B508F2C241C15F5177DD5ACBC4D12EE4002D236267482 Out = 9FF5DE03F07CA1F14F9DAE20AEB83F1BC68C062F20BB71F3CBF710080EF1D1B8 In = 89E1B7A0B3BDEDBDBEC67E260681DBCF2AFCF814565A955604EFFF8D00409537FBC4077399F7626C11B342269A0B4B70BEFF1C496D7268F51AF61586F179FA59B6A31FF530F3C72A7E35CA78C626C196B4F49553B7C87DFD0D6AECC7A10DCF535DCEC1A63440765429294EF344EE49B68440B1BA3B Out = 77724AB3BA98A411D4BDEA831E74FA65455367FCF893511B46DEB8B69528E010 In = 9919ED7C116A6B2295385CC53914134CEC53A09EE205C52E5BC7AAE85CDFB1E5B901B1FE3E5A4B260C826CDDC7603F050CC717C4831AF65E3D6DF0B72D5D4DC19137E8C1EA1952B62CA0FD0924D5BD4C875BE68EBA59672D28F38667B612C035C60C963F989104356B237E2478667DC09EB85DC50CEF Out = 9579CBB4CC270B4833D0D2D5A8CEED5B2A9BA197ED3925CBACEC39B8FFE88EB2 In = FDE621E8F6C28A3116D051DDDE0CE49D951FDB32C699C794D272E2544034530D16660797BD9A2DD041AA1A52C88667C56E1972973689505216149814F8097CCE392831B4F00D104837B22751FCC1B492F0F946D30C329D77E985F1D8AD2523489E980CFA25ABD4CEE8404262AC0BFDAE59495AF51DE394 Out = 84BC7E5CC1CD2451C1F4006423DE65348FF516CA234D3E1DB5974F2CACEEA7F3 In = 0BD9B05363D85A8C29335B7A0FC8775A14E4B3D318A07020C1760405FED790DA50429BCD4107C316F52707603AF7E7283CFCCA0F5D7E265B53CC1899AF5C2386A8F3D30A476289255EB3A8504423E8F9AFD46B71DAD21BBFFD6CDF0F7C37FF811805F9E9F727966AB279BEC9124384EE12E91556135AC64B Out = 0F25EB2A310B897D9FE5296E86FB54CA90A24A33C2350F7214871A76D83ACDB7 In = E01B90E74C37529AE3630977BB67D135CD40BB856EF72B5ACF2CB1779CB4466B7EE622FAA605D184A599F8EAFFA1A4B66FA82F0F1CF3B6E8D61BE885B346E6FBD0A7D3AB9001D5D092B4769149987DE7AA07783E33C0BCA6E04F2D51B06CB8D10FA1C6F8189E9F168F8BD1D179E736E089330D999DD1DE1804 Out = 2B202A19499AEB7EC32887183974BA38D222F1DDDC1957E891C7637866C6D02B In = 69DE25ED8B06C25730DE7D4F0F0B721418F7DA3FFD0FED184D89EC7CC68C2FFF7BBA7328D5646BA5E1DE9A10C7D8C48738500684F1C37F3F5627085F9C532F3369C79BC20D8FC4EEA6098EEFE809CE2FABE6815A73AD5BC596BCA47229F15915138AF98EBE1FD7A9DBF47E9CFA4236B8158187C8C7D6B0AA413A Out = 8E1578C57746970BBCF5208FED44A07297407A3B88050C9C1B2AA4DFBC371BB3 In = EF8E3CE9E94140F5F23BDF1571A99524ABBC97559C04C758AC7D38B2461CEEB8B9526069866D4DEBC20451CA7BABE6938B619A7231C1E27AF42AA0DEB7533E08E768029BCD14F8E26354D672AE6633D75BCA0B96AEFBE1E553E3D27A77BF97B0B5DFE7801FCC98552A97E2A7CA6BFF07A7DCAD0B8758E00BE9C9B6 Out = 191951344B69CBAB81A8C5161683D523959547443C7D991370E602E89C657D65 In = C6BA237FF92B7017164B862F6423F427A2F7FC6B9E08DB177AE8A0F525B96A5F8E6D3CEC815FD0BC67082BD87EE4BE865D207344F75E14BAB8370CBFF15535FE08BF69ADDD46D483CA0BFE3407D067885722A644346D401811827F6FF66BF32B7BFE7FFCEA9ABC33D0EDC38183FDE134EEFA3E7F35EDCD8CD96ED598 Out = D49655944CF84E2C736CAA721990D87EC4A206D97697A6E69317C60CFE2FF880 In = 94A5B0B0884EC2A5B6EF06867FF449A256A905EC5353C2DDE56722C1020E4B7A6C2AE6FB81907A8EA4A48FB1B5CD5821446F561488AFECDE2DE4980CF60DE4C4E8BDA2E3B09FEC46592134131BE45B4105DDF7857BB793B94F7D58AD27D1856048F0896846791E17DBB050AA0B623884666EE13D2A0BED0963E054738E Out = 7715F423CB25126E8F60A84860D8E38D5A6DD405CEA7B87928A855FA0CCD413A In = 04FAC7EC9EE4765731C4373BA10AB30E61902FC70B6EBF653BD1396157C05CCAFC821928706BBC0346E750FBA1C37C4B5B930EF70967C621B786DA91055AD6D8A90E374D27CC65A830BFBB7346D3F6BADE676D690394AF5D02588B48C9482F651F0A4C9154A93B166F4B75F867AF9DD34A943BD268A69456F4753F24368C Out = 32F8C89FF99FC942BEBC45EEF397B2E6957CB87A20887C8576FB1574C509956F In = 16488821759E6757A19CBBDAD74E956C576E55B76D6C652C8AB1683591E53845BD8943E6C63EE98F3735624D51975240B86043B36E904267A79679F685E1924CDB8C49700722E8B360F83B2747D00B982C568488EAB5AD9D2860F20750EE11BAEBBE116EBEAB2BA4DC12B21875019D29E78673404E6C5B2CF0174F93C41255 Out = 9131972A3CDEAADD1BF73F449F89DC1BC8B0DFFFA75FF6D32824C52695A39EFA In = 075D68D52224EE85A0F029E116C1894B0C673DED797F803EA298163D316C6B59C9584A0203D08F5F79F36891FABF8430CF9212C02FB2A287DEC3DDC772003167909D68E912DE0192817C085A6FB729ACCADB2ACAB6D5E91ABEB92F4CE68123DCD4FAD9F6ED80515142EF1081981A6C2D62B1630EEF02690DCC71F120E661DCD1 Out = C00F6356A020B716EF4BB1C89C82BF7CE6E5DD167BFBF2C81AC5DF42217DC3FD botan-2.4.0/src/tests/data/hash/sha2_64.vec000066400000000000000000000056101322470703100202530ustar00rootroot00000000000000[SHA-384] In = Out = 38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B In = 61 Out = 54A59B9F22B0B80880D8427E548B7C23ABD873486E1F035DCE9CD697E85175033CAA88E6D57BC35EFAE0B5AFD3145F31 In = 616263 Out = CB00753F45A35E8BB5A03D699AC65007272C32AB0EDED1631A8B605A43FF5BED8086072BA1E7CC2358BAECA134C825A7 In = 6D65737361676520646967657374 Out = 473ED35167EC1F5D8E550368A3DB39BE54639F828868E9454C239FC8B52E3C61DBD0D8B4DE1390C256DCBB5D5FD99CD5 In = 61626364656667686263646566676869636465666768696A6465666768696A6B65666768696A6B6C666768696A6B6C6D6768696A6B6C6D6E68696A6B6C6D6E6F696A6B6C6D6E6F706A6B6C6D6E6F70716B6C6D6E6F7071726C6D6E6F707172736D6E6F70717273746E6F707172737475 Out = 09330C33F71147E83D192FC782CD1B4753111B173B3B05D22FA08086E3B0F712FCC7C71A557E2DB966C3E9FA91746039 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839 Out = 1761336E3F7CBFE51DEB137F026F89E01A448E3B1FAFA64039C1464EE8732F11A5341A6F41E0C202294736ED64DB1A84 In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = B12932B0627D1C060942F5447764155655BD4DA0C9AFA6DD9B9EF53129AF1B8FB0195996D2DE9CA0DF9D821FFEE67026 [SHA-512] In = Out = CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E In = 61 Out = 1F40FC92DA241694750979EE6CF582F2D5D7D28E18335DE05ABC54D0560E0F5302860C652BF08D560252AA5E74210546F369FBBBCE8C12CFC7957B2652FE9A75 In = 616263 Out = DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F In = 6D65737361676520646967657374 Out = 107DBF389D9E9F71A3A95F6C055B9251BC5268C2BE16D6C13492EA45B0199F3309E16455AB1E96118E8A905D5597B72038DDB372A89826046DE66687BB420E7C In = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071 Out = 204A8FC6DDA82F0A0CED7BEB8E08A41657C16EF468B228A8279BE331A703C33596FD15C13B1B07F9AA1D3BEA57789CA031AD85C7A71DD70354EC631238CA3445 In = 61626364656667686263646566676869636465666768696A6465666768696A6B65666768696A6B6C666768696A6B6C6D6768696A6B6C6D6E68696A6B6C6D6E6F696A6B6C6D6E6F706A6B6C6D6E6F70716B6C6D6E6F7071726C6D6E6F707172736D6E6F70717273746E6F707172737475 Out = 8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7FA17299AEADB6889018501D289E4900F7E4331B99DEC4B5433AC7D329EEB6DD26545E96E55B874BE909 In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = 72EC1EF1124A45B047E8B7C75A932195135BB61DE24EC0D1914042246E0AEC3A2354E093D76F3048B456764346900CB130D2A4FD5DD16ABB5E30BCB850DEE843 [SHA-512-256] In = Out = C672B8D1EF56ED28AB87C3622C5114069BDD3AD7B8F9737498D0C01ECEF0967A botan-2.4.0/src/tests/data/hash/sha3.vec000066400000000000000000006741001322470703100177510ustar00rootroot00000000000000[SHA-3(224)] In = Out = 6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7 In = 01 Out = 488286d9d32716e5881ea1ee51f36d3660d70f0db03b3f612ce9eda4 In = 69cb Out = 94bd25c4cf6ca889126df37ddd9c36e6a9b28a4fe15cc3da6debcdd7 In = bf5831 Out = 1bb36bebde5f3cb6d8e4672acf6eec8728f31a54dacc2560da2a00cc In = d148ce6d Out = 0b521dac1efe292e20dfb585c8bff481899df72d59983315958391ba In = 91c71068f8 Out = 989f017709f50bd0230623c417f3daf194507f7b90a11127ba1638fa In = e7183e4d89c9 Out = 650618f3b945c07de85b8478d69609647d5e2a432c6b15fbb3db91e4 In = d85e470a7c6988 Out = 8a134c33c7abd673cd3d0c33956700760de980c5aee74c96e6ba08b2 In = e4ea2c16366b80d6 Out = 7dd1a8e3ffe8c99cc547a69af14bd63b15ac26bd3d36b8a99513e89e In = b29373f6f8839bd498 Out = e02a13fa4770f824bcd69799284878f19bfdc833ac6d865f28b757d0 In = 49ec72c29b63036dbecd Out = 47cab44618f62dd431ccb13b3b9cd985d816c5d6026afc38a281aa00 In = 502f4e28a6feb4c6a1cc47 Out = bbe61d85b4cae716329e2bcc4038e282b4d7836eb846228835f65308 In = e723c64b2258b5124f88405f Out = d09da094cfefaad46b7b335830a9305570f4f4afe79f8629ff9d0c3d In = 0d512eceb74d8a047531c1f716 Out = 29ae0744051e55167176317eb17850a22939d8d94ebb0a90b6d98fde In = 3b9ab76a23ae56340b5f4b80e1f3 Out = c0903be96f38051cfc2a5ad256aa0b8332217f450eab904ee84b6541 In = e9fef751a20297ad1938662d131e7a Out = 48eba36dfe0575597d13ca26133267199dae76d63d1b9e9612720d08 In = 2bbb42b920b7feb4e3962a1552cc390f Out = 0dfa61f6b439bf8e3a6f378fe30a4134e8b2dfb652997a2a76c2789f In = 2254e100bde9295093565a94877c21d05a Out = 6965256463276dbb26ad34a378c4bacaeae79d700283b188d44d73eb In = 784ef7adecbb9a4cb5ac1df8513d87ae9772 Out = e918a5d52a0d42ab8ba2ea386eb6ad83cb8dd9a6bd461506be356ead In = f4e68964f784fe5c4d0e00bb4622042fa7048e Out = 765f050c95ae3347cf3f4f5032b428faeab13694e8c7798eafb82475 In = a9ca7ec7aaf89db352fecba646ff73efe8e4a7e8 Out = 65d6a49739c0e287584ff9d1f3463ce2e555ae9678147e21b5889e98 In = b2f7018581a4e459cf9b9d9816fc17903ba8033f13 Out = c6837f12227bfbd86ccfe794053ce3a54052c8ca8430f526fd64b5f2 In = f50086b4dc7bca0baec0076a878dd89571d52e47855b Out = e39aa96fad581961bda032ed33dce36defde958baf9bae5dc558cf89 In = 6e6ef963f5000d0b91b0ad537ddc9697f8db8f10a3d5ee Out = 66dcb292b4d6bb4cdd4099b8e7bfea9658680c92c51562c091577056 In = 12a7b1a73b0b26a66362ec2a91ea5ff11af49a7a148a8cc5 Out = 6fc91ec8ad448173f591b865ed3eb89115a278003376523c00e22f2a In = 8a4768add4a9bd7b3f27461220ceae0218cf3322f4d2a980d1 Out = 9a88bc64e743f2acaa1670cca7e201a299e1cce6df7015b0d2535213 In = 5c5b8c1902c8608c204e72a813e2b625021b3182c48b00f7fe4f Out = 31802a0fa9ae7ae88626604ad9ae41381d6f7c3c90effcfcf70efcf7 In = e89e5cf07afb4a58ebeee17ff596d90b3274ba348f14f284fff025 Out = 3bc9b7973f55735b612ddee8cc7907a3f1429b06df7cb1293b989802 In = eb9e1143782a0f9fa815261c2adc2758fb1d88ffe40a0ae144189a48 Out = 9d70d22520094a113297a192ead33e316924fdc7a2a9f8ea7098b84b In = c4ba3bff885fb78357221a9a903bc7ebd11c771faf5789e5aabc993a5f Out = 7b0212b4ee0b14dba62c2db7a765ac56db46e0b06eb744ee35726ddd In = 07810e6b785177e52d0feac0394f3ecc41f35aa08ff1ed8162575f85888c Out = b413d6f0cce14b7a1044a14bb2803d53bef907093769a5aa63a8e316 In = 01c742dc9ab0b05df925d4a351e38bea7ca7ad783594e22487d5b8198583f3 Out = c42c707ddc7b630939544adbdbe567a333ac88c3b5e738dee8f862be In = dd0f85b55fdf56ba254e06f8c2b650cc6b86bf28a14d714011141a86b8f14bd9 Out = 0fe92469297c2c34911eae424710db6d312047898b9756edc5c2deb2 In = ddf48f4cdc856c448326092dcf6bfc4ebcf4b36fc2e516eba0956807588b6e827b Out = 6cd83ba70e1bd387d603ab14c9fdcbf9862d2ebf0987215f011abee8 In = c34d1f8729663569569f87b1fd6e0b954ae2e3b723d6c9fcae6ab09b13b4a87483b2 Out = e57e1d24dbd9a30ab311291f5d6a95530caa029c421dde0b487a577e In = 808de7cbf8d831ad4f17eb58031daed38bdab82f467f87c6b2e3a7c5de25c8e8229413 Out = b3c13f11227f4386afdcf7663a120990f27da205ffb9bf83676f86dc In = 5204a0a63707bd1cab67a8797994a052ee73884b325fdf37d86ef280b3f550c9eb4e7fd3 Out = 6aa1060f84127bf2c988230a907242e7d6972a01c6772ba0f7b8bc86 In = da9439bd090dfc2eccc1203a7a82c5d6467fec4e5b0a2b2c2b9ea65b03203a8ce365fbd98e Out = e8f0929f1f6209d41185292d35ebbf5a3bfe5492713b06d56579458d In = 668bbd38c0ad0881a7f095157d00f29b576b01ba54a8f1392e586c640ecb12b2a5c627a67884 Out = 75dd056962c5bb5d6f616a9f57892992946d048df57c0a36a40a365a In = d63ac3bcfee3a5bc503cf20fe8ff496bf7a8064769870c8fc514c29b55825b6288975beb94ba56 Out = c694da941a7a506cef471fdffb5230bb6c3cd2715341033ab7268e9b In = 985f06121aed603171020badc2075fd33256d67d40430839575ddaa7a3f1f22325d06ea40252d5e4 Out = 29f8846aaf234281b515ea1d45674535a6126c38bd959c1995cad7c9 In = 8783849552be4540cb24d67996a10d16444b2d936d2fa5fcff51fb0dd5ee03998c0454289215fce47f Out = 84502256e3f4291ef4d15e8705e579951fc0e39a2d58fda74852551f In = dab31c7b3f40825aac13f6772771b7e7fbc09fedf6eff778d51190ecfd4b0f256cf189baeeec507e945f Out = 97168a9c3b07ec4987a4cf1f2478731fc674f56a2caeef074590ed6b In = 1119b962bed5815734af7827ec536701a494ac5d4ab83eea1b16ecc80ce4e5f8694a7d11bcba2e34f084dd Out = 205d89e032f03c8519cf43b720478389b1788f3522c3d347febd2c70 In = d2c45e2c1fa0c44efc84e6c0654cc0d867a3e33733c725aa718d974ed6a4b7f8f91de7d3622b1e4be428de2a Out = d483e39b7add050eb4a793e54c85b250746e382399c74736f33da890 In = a873b148fe1807b89cbed930a7802abad6ca0442340e62ed21b84ead9a634713bb4de5648208c0eed6738d9cc8 Out = c86bcc12a6ab792c149aa83a6783ca8bb52b0ca4b2c12661c0a25d22 In = b3008f6f567d1eed9ab5b3bbce824d290e66f66bcfcff7f9b8994835b4d54a4e45c9b8651b37dbefe5e3fe5b674f Out = 23929753ad07e8476e7bdac8a0ca39e9aac158132653be10ebeeb50c In = 78d073b4e13f6850dc1ca36683abac72336465d790eb3575c942667d1e3ecc849f37a8d73604cb0fe726ffe55744a2 Out = 6229233fc655ea48bb5b48b73a081897d855f6cf10478228fc305842 In = 45325b80e043c0cdce3ec421ecda529481910c09730128b4bb927dda1659ddd8fd3ca667d857941e6f9fd939a1c57098 Out = 776aa1f54e038f390491a5d69bde7a2dbcba97c35574ebe60c9a772f In = 3bdd6821d938fac52101fbee5d6ba191fb3b6cb634dbf42cebaae57bd897481ae5ee04e2d871a4c333ab5ab6588144f2f1 Out = 62f8f3baea6dcf5af25d53ddfdac0bdcde88e3895df567c6c416a541 In = 86fc66f2618c98fe9efa1e3ac04e340385dc2b746cbc0f7c757b88342810fe70d81200952928e7aad0c0b6b19a044537b009 Out = 20a21eb1d3130a4519ce6abd5ab6817081ae1bef3603056476a00e41 In = f2a6168e7f92d313fc30f9e6f825a480916216f02e0308db70773ec165e25e81ffbf0220c5ca0cc6c91d3a09da99fa6efa877f Out = 5d6e5c82574f5e5c0339d3af1f9c28e17bcddc306a15187aff5d3dd7 In = 5e3b6b75b54f21b8016effb39276f5e7f493117ac4c0f2dec38a80ae2917dad83c68900120db1325f1f4697e0f5c25a8b92a9702 Out = 5dc2147f1cf655dabb5ca4b2970b4564eb19ec456e6f966bbae19762 In = e7f17c131950c06311f47799a0f5a6b4996f4cc890334450e1bd6cc6f5670771c0dc607f8eceb15300ec4220510ed5b7deb3429de6 Out = 4ce80dab9f933112a3fd78c1f76434b197806eddfe35cb0bdd845c15 In = c9aa3d0f6d878db11235e7b028f8d67e2ce26eee718f308e21132e377e3170e26ece95bd37a4bd7f873ba7f8b71517ec50297b21cf94 Out = 5963b41b13925a90c9e8fbcded9a82ade8aae36dee920199f6d6ac7f In = 0f170afafcefdfa8b0de328dab30b4e44d98d6aea2bc39557ff4658fce4fbf8526d8b5359f173c14e4da7cf88935c9369fc7d607863f25 Out = fe7e59028c7855c37ae3dc5ee324864cfee6b8bccc2c3b5a410b65d9 In = 6b2b92584146a433bee8b947cc1f35b617b73f5b1e0376ac8bdadfe5bfdf2263b205f74dfa53db7a29e5078f5c34a268119736ba390961f6 Out = 132cfa7e71fe0991abbd88ef588ac95ac9289b1d775b42033567dd33 In = 39f7a94312bea1b4fa989f5a6775df538f01704120838c4a3104256478b5c0cfbe8b86e2912c980b390ea412edddb69d461e50f9f313bc17af Out = fcc59655b8fec1a3d878345df9108bd99f4dd0e5218a55fc335e57f7 In = ac582b5a4bb0c5e9c40d8f277bda9de3d07fff01e820a1cdaf88708f1d60be60b9a5e83b5c593657387802b4182d1df4e9466e6d7ae6dc7c8079 Out = 5c2e10fae8f4304cd9361690e5d2c4cd15f10a7b14ea60208739579b In = 072753981998453438a520d9de2d5704292910148b8f794ec3765b240c7af1b79462fa9a2f000dd94d592d3a2a069dc244daf57b12c57675f3f89b Out = b0d290a6ebdd950811a2715f354b0d8935cb610a471cfc5dff5e0660 In = 66a9a6d0a322ed2852378af82c0a2c027b1082098ab750925a4dc2e8961d0062c9db02e8cf42a6b48afb0056d6c1f1fbbec3fbeef049535f6e9b3864 Out = d683488c8420eb2d61e528ab0a7b73aa780a085b9c7982293b2ac6ad In = 18419a8498d4e9bfaa911748186c5753d5da5aa033371ffc56650d0ae9b73f430f0d1f3c9d40362786c0429d977b899b64016eca82e64203f6685c12ee Out = 51d0cd33fd6579b05c366c6fcc653638b7b13b62798b99b36792cdc4 In = 4fc52009d58a0fc2573e83fa335b5c1df8c14b2e6daaf05bd6e13fd5722f28de4816772424c2f94ddc3de0d3d7e26812d014bb9fd83012dc9abf1ec9e3f1 Out = 630ee2beaf1c1592eaa6263fc562a260b6054e9eab1aa19536fda170 In = acdaa28692f334732088f5efab2c7951fe0f845b9e2c6f1253c3cdcde30a4e8d2120e38c26422219df41eda2c8334e13f669a65f5ba2075b467eded32936d5 Out = 7d4991d54c78af5809cd17024cadae783c6f5a1f0feb365b532580c2 In = d1593cd338b7a25bb5413f112a639fe31c981e505c81a820e638c25209e2ce56c8838a7c8117dbadccdec959a6f7cab0cf304315701d4ccf0167b4026a6744de Out = 84e18330723e4f90520d0b051a9bf9bd7b5c7ec0177803f15cf740e5 In = 8cf8ea25310126ae1fdce3c9195395a9d45051a2a3f08ce154d8265b54cca7031a7ec840c3a3359efa4c91c41b74baa698d54ffb9b0170f2edadc5201650c2bdc6 Out = 75de14169d16a9902f6e8a3359d94594a889c4aed9246caa6cf5612c In = e0320fee19af5bfd511a23cabba75acb0815525a3734305aafa49c1d8bdfbd853579646a36a7873c4cfff2eabd7e3902eccff1192aca1f6dce3cf1c988e6aca9f2c8 Out = d7f2018c303ee045de4b8cdefcfb5395674e3a8770d65f0757b4cd5e In = 1a424ecce1a82c47742171a701ad6e0ff1a762ce26f8e332818a7fa1a800a4e506a4bdc813a09ee1d57222ada79a12e2399549ffd80f1628ef55e231ce0913f9ab1930 Out = 277f96fca5d9ab055fae5d4dd10cc49c2237bd38d95bd8dbd168ec21 In = af172809570cc306333c25523f863c6d0e0154c55e404722f0d4ed419713dabf8e18493a0e0b53b220a36535b1e8f0bbe43e624fac9f566f992807b6f2d70bb805933e2e Out = 9581170093600cb67063a314d8decf109ff9368ffbc90ea2d3250577 In = a62f4b43250cdf3f43c1da439bc5e4224b15185b60d615e38e3c512425aab145401b57ac3fc0bcc178eafef52a2b7b04b2b89e760212f96c4ee694990831858f0fa7c13c24 Out = a0f5775a2d001a66f0882ce1415261994021988690840c6b4a3470c8 In = fcf81c93f917bb06f278f48826ef9ca8ba99ac8f00129fd9f8e81ca31750d5e54818af0331dd239eb77ee4b0c4d0c2d84794cef27da6bfeb707794d3bdbc7b349968f2a316d8 Out = a97a74fb01fec5caf3477220eef6e7c36d0ba4199ddc755f7ccf94ee In = e61d24b500581734c29902ade4c5035c090868df9f24bb330609fcdff4a72d6f18001424fd813cea32923d8aa86c3d215b2ab7d134237bb62e78f61cb9e9b4ef5ced23729d019a Out = 40758314f1abbd43e0bc9c73a1c7e24719d56eebcd967b39d355e978 In = 37b14f04233dfb4da5e5bd1852f77c41e25c4926936fe414c8108200f6f3cd78c03e2dd9615446c14bebc2c70d65506a7a5dec4808806291769e0dbab200e576f9fdb9e240c8b8ff Out = 2d36af0dd95619a96c5664d8987bbb82d183466ff44151034fed687b In = 45efb0a3d8fb7bb683913459727e8756d67959cfdd4f5b80e13ddf45e09debdc2cc68ceb632d6d45a2d0a869f6d4dc4c136c805849fe77b4b381e4c6b22a3ff69947a9b5aa6b7cbe42 Out = 125e983229f65bf01b59a9b619810a88f1c53b4c3b1960b52a205d99 In = 9b6c3c77746219dd88976966c68ead59eb62aa3cf6647798dc06d4fc7ef8bd44d8903f1b7b6f8bbf3d6249052f862e9ccfb0d1957f0bba233603bca0766286d17eb9746bc002abd69583 Out = 762629518833ba68333fc3e3b4d482c60b4e0e828872826b68313315 In = 9f452f900219017199edfc5d7d86a162d9750bba4cec77428ed1032e5711b6fb7c37c1a65b3d041c7aa1d4f16bbcfc54f35001436b60abfb6544c0b393fc1389e5c5bdbdf2eaab1d99dd59 Out = 19b432f5c38f665441d36c472d386008a5bbd82aa4eabeaabe3d28cc In = cbfd186592fa68dc3a21d62db1ba55121f58fecb11695859d70bd7ed2a21a2a013a699640842973b571bf4a7c8ee4f617d5e8a4d1e8c15ae33e77097d146eba27934b1e33d8a041f2444ca3a Out = b32ad13ba4a0b9fc1aa9a1a57bdbfbebdfab71cf5a16e06040f75787 In = 173225324c6c350ddba227b89a651e576d1ab6a96895453c33ea61ddb37fa253e666a84d0fea609814688495246161eb9cccdd792cb1b88f36f3125d766e2eabe84175cbe66dbecc91a0ccf173 Out = fc8feecaefffdaa966e9536b91dfc85ea5113a01d6b320677d727a7d In = 6999f398407480cd43bafdaedb8624d9ba0972aa5a2f3504a67fe54ef744b7bb41ea70cf8faa771fac6a2f5823de83826af4c3865b6faeeee3d1d0edfe7f0e9fe3207f917b467d841850fc6e648f Out = e7abcb4c0f218814ecf45fbf28a3f286d90c5e740aafd1647437c1e1 In = 2727eeb1d51098c69fd8141d78f21275b2bb949e7115fd3860526bbda25547c20cf31b79919fa37bfd4726c4e77906ffe0ca9705f1782da0454e799422c815e01e785d418fa881f84341d8cd71ec77 Out = 2be332c873ed4fb70bc1916c76bef2cd3385e674b83aa1ee8ad28a01 In = 1f48a5b401d88e6cbe37f3f634d55462865f7cde7990052a1e4a1e4cb2e58c84c2c7ef82923447d7c068b6aa25e388acfc05704e46da14316d37ccdd2706a7b79ddeb02dcdd76f342c9cb2f490c18dc1 Out = 448b70f575a8a1eb74030a985e9c504d4eaf6b1814e1146f782c9af5 In = 6dce9a9ecb48b9da8aef51a89e7f7fc1a6a78966b7bac0ac5ba7ab18d92b616bb74537bf7eeb9bd3bdfb40a450747c3de2e6eecfb12763049148fa9134c7870ba80636fb21fc7134f92b0364f5d27deaca Out = df855d544e17f01125022bc18e9ffced12f3cd39674e68184657ec7e In = d498b6901345afddc5aa50cac77f7f794d7929eed571d95b59c289a0c9f3b812b896bc7b566f5a639ed9948ed066c2c622c6e4dbb2ea37e7c06806d61a22c326d72356ec48c9b5182c29b5f923af20046605 Out = 5b225c29e4547777a2c6a1a2bbe9da2dc6a8c6d0d01d8d8022988be2 In = e958b80489aa6a38526244da165dc4464e7961e457f763abdb23f7e48d368331197b37cd5ab1e515ceb1124848504d8be587bf3041d10437ebd53915164556b59106bebdf99115122d99529e02ee155138a13a Out = 364a988400424557a9c60e4e1f32f0855a3383c90b007d30ee3ec333 In = f33ba982bc2c3308f948a1b64c7fb68fb891bc05fa18781b1dc95dc749f7009adc58cca2bb0cf790ebdbb4165bbfab9304a2a6f234688dcf273094dcd8d7b38416be57cedace5783d8b92993548256b5373f2b4e Out = ca37e52f2843a0f65692c5aeed0169601da3275dfb3ee6d81b467f60 In = 8b5d77a906c7ec7563af7551a796e5d5dcf02c42121d7b13a49aa9d4bc79d637190e4e6510ecaf92d1104fd4ec5bd8351446350722d1b2775dbc5e65f8fab473dc637b5ca8a9eb88f68d11dde15275d7c472f9db43 Out = 9337537de482f0cf88cad6b86e195a1e422e59cc60d41d0eca8b0091 In = 3a564a84c2b48ee26da138ce2d1ae3c7933bcd65e40288406e56f30d1c48690a4998389dd27b55376f9b4e7f43607fadb16e8933726f00a3e41264cda553532761fefc73e86ed79b849b94e0895451332dc80fe39a4b Out = 88eab3e16ca8da5716542bae3c7c736b541c896199b2cb941213767b In = 618a53989ffbbf54a76f01f9b87772491d87c8f25c58eb11b18a04f5ba8ed62574c351a466df64731c911458d765cbde83e7f29de90bc1bb26cc56b35c140555a7dcf00f5394d76a4cc531d7d5f57bac7dcbd06a4f73ba Out = 4a727cc6b4bd93d5ff2ecb81ab5057dfdcbe3e0c49436a58b9ff3ef2 In = 31857bb4e82497b526e426de6920a6063d02264d5249feffd14abdbbf03563d4c59ad1f7572c7d0efbc46a65dea9580bde0e387c9edce27cd9b20a46f62a70e6dd5f58e40aac3a22dfb6ba073facdadd58cd6f78c02bd219 Out = 9e614fc139645e158cd1b216e2623e586242af64f8483e6fca20ed4b In = 14859008c83f2831be4d6e54b781b9fb61dadc40c459a93ede11b4c78a7e5a55a71701427526a03b42d883f247904813cd812e7a947c8fa37406aa6145aea6d3fd9ed494186f35333d423ce31e0cd473a031a5803c5593e9a4 Out = 545fafa43afcaf38063d8a312c3a27e0d74bff957f8ef4d51cb29698 In = 267a14bad702ef0a8468b31c72715f0533f6b97e6e943839dea420719d6defc5a399f84689e64ecf931ee395ee49f1fe362199b73cc6cb0105b3654b16f19f06ee8aa6b5d5418743d4804f9a059270710d126765e6a49c4ce2e3 Out = 9b9360a5c747e6e1288f6f9d971051ffd84641f6d64e0a4b5142e4ec In = 6c98a8eb3ea4451401e0424c10cb722683b23f75ae254d62eba75abb9aa9698e65ba1ff7c9f86d36d1ca6f0425d19428441b00450e9a2ef685d5da1cd4de1e779184db743fc95a461797333808ae6e42fce1e9da5d82f90cd71b54 Out = 0c6f33f9534fc52f3700f37b9ee678b4c5c8a90b1a2eb1574002e377 In = 4bae62a008d9fdba351a1903c66d58e587361990f7c9eea05a2f51f90a2892f60e6c14c4ed36b908c4039bc89797fd88e54281b37f619b3d9a274587229ef48351e8cb1881cb0fc83e6ddc90a05b160fd7d0a1eb0835d57158e42c7b Out = 989c156ba1fd1f70deb378e46ffcbf6f2cf9cf977a92ac51643c97b4 In = 83ca6d4ebdf1c04062ca1abb977670ef9bcc889906935fd64ff4c739912e541b8f8c7932f595ef66e18256dfa1f51f63bfe7a9df3ae2aa431771d19318d6aa3bccfac1a4c8aa0a0433ff807a881e0d5a9722aac6cd57c77eb6a9edf8c0 Out = fb831f2456595fabee9d458625283a80bb4f8f031e9abdbf48b7b51e In = f4c7ad8d24ed5a682c473463e85391050c026fef0b0e6dca388e1a7e2bc872a46746a63f3a2c1ca6e4c8b7c5fb6b58850d77a58988ba091bd7fafb66ced184e548bcfb1b0e6e1485fb6a19cd5ed07640a0777b82273d5e80799b7fa7a57d Out = 13bee617474b3fc3447025f2a488dba8825d46a4e128b9a8bdeb1b85 In = 5f81c5aec92385bfdc55ebd600f23cb04ac9d5c7a1396f801ffea1a6b94aa617231761bdeebc9ec0f4bf9bfaf5ebc7ac82a2c96f1a74c46d94f0dad0bcb9ef7b41ddaff8cf63d2b278239e6558dbaed2797ef3b7f4cff8fe592f6a3551b3d7 Out = 143a6f0a20d5b4dbc5df64a7e50f9985631453eb09ded71667709083 In = 0735cecaedef99bf4c53242f0552f49f56bbe589a2f611af75f4f3aec366cdd6702d46391512580202b869097fceb8a45889fbbf9852472f94bc2f432bb8309c4d0c4d3fba01f6e90c5c2ea3f890ed95d132c31f4dadbf268c378fac5604e8a4 Out = 9f5e9f7429e5488a843c52ffb46ae2e84228919d32330a9193af3b21 In = 9b4e4df92e5152fe1ec56a9fc865f30bac7e949fc4f62f0b158d10b083636b4de9bb05db69fe31b50103fefc5f8daf3af7156b4552ca3667a9d720bbb2e4bcdabadfd4b7f4fc5bc811faa36710a9d17758a98d4a0474fec27e9ef5b74f5c689935 Out = 487a6f2f875cb253de4cef18ecb4f2a54388ebaffbfc4259bdd97f09 In = a61bef838867710ff4341b26b13b8d7af7e461ccd317b160cc4fdaaec7f1805a28ddd3663a4210a7d1b64a752e866aa7224a75bf77bd0d618bcc3b0a3eed6bfe0eb2b882819e6a4cc437bd38915ce53c55d94e9e9339286483dc230d0049777ea1c4 Out = e257bc45b62d0853ba4b0f8578698f4262c31a778cb6a6317b6e6d60 In = c0bd79e0c5f72fcb1de6c234bdb67bd0d3f481b962a3a01f2d8c483bd7d5d98548d51d27532716b195fdfb0ea0b77db759b54e269e69e48e2cb07bc9c06259927d2755f48e8d9a020c58a9c9221a9d836f03b30eabf9099c8eeba6abed63bb38275b28 Out = 92df7f848ada8a9698ddc2e7452ac8fc43cf83d2ca2cadd712c595f2 In = 5841db7cfa4f11f67b411c7a4233b0bbc60f267f4668cfa4baa6886109648ecf7c1694a873ef134e5702e20fcfa706a73720cb064e7c14542ebcef3382356c44f335b0ece3e945585e7eb4be4d8756e6ed9f67ea804f5c3a433276e29f569810a3e656d0b2064e1b79ffbb10249c4781d2d421b146a8505cdf4f47f8ca91b93b7671aedd480ed79f91cb1e8cbdae827fcd0622e5075197c4eb5c87fd6aac77ce531de19a0ec987ed8c2b06bb7e85aee8c57e910d2a10da7a50a16177e6707cd0213317906aff070c54679b23d0e874c5a48597b219aec184f466fbf0a8a56d49cafb7745c577fe04cfc7044e1ca07c1d51615c5b3bf3f3ecc1f37def1713f54135bd2a4388fa15dee7936ac4c8766df8b45a0790f8a619ba9e8f10fd9b81bac14ac158121950f4a18312f40b3e2ff05eb5bac1dab891daf47284dca19cb964d0f14e2738e24142558a8dcbade496ac583cc7b1bfe37adfa42718086382819c7712aec23f4995a702e64c163224724aed31cb00c9e12ad0d1a494bccbb6a20abd95274fafb813cdb17e97fe20658a71267c0cd5801b695484d14022629ee455aa6202f70e9684596a3ab6ab010ea7ca0905d3596bf7fe13c496635fafa30e25466287e1e64bb0f63302f0445c8991fca1b567b312deb3b699db469e3a2dea249a7bfd36be3f5f4a16be8ff2ba3d10b0f372120cfd394ee50b8832058ca53ef8ad96ae1d1fda59fd1a56d9dca292ec8e09251a8cb56e984723856dbc2c71d349879ce0bf908465b847b2172b9cf0ec3deab7c85ac1e75985e8ba3feca2fb71c03173dc4399a54d23a6bb900630bfda669e0e649fa90a59466310f2bd77aadf04b205ead2c2a5d7e53e578e96e7677cb02e143682f6415f339a6dcd5632e5e7be1238519494eccca6186f570248509ac4a1af852c2ff335f497bb17e05b164f965af65bb096e2f3103aec3473dce3fe49ffc99bc5dc87a13062e019827ba4e03391264e4f51ef16c9aeb46d1129866fe85049be7485676c8f01c61b6519f7623ebfb073984b7cfb797cb14a03b9a2b4499d173761b3fa5ebb7e5364b0bd779d5eec7b12b40eef6bc9aac9137214a09613ed1b4eb5eda83e59e0713e8cef8c593c217173ca22b22e6042e60f85c0e6ddef493d4a98bcd9d6143007ef21389e5d806679dd030d2b0ce84bef876547de5184b8657531a7f5ec9175fcc0961f1572d1c17b9a8759c4cd06ceccc33931efb97b427b15a93664497bb73af9142d5960d73c60f07d8de43864d2650b2a0480df7bef677327f18fb578ffa8e2c2e8d2ef3bde0e280d32f217aa5fa2a7604afb892dc811d7d461dcf730542ec3c9dae8e6a5af6e8961cf5830807d6bde028ac78038d46188d80db4d94dbeb4e3508b040fbcb8685d9eec7d4b8c35a8fa394d4c8c461c40d05a7d80217445228b80828c302900e5eaef12c932798e41412c1af274fca694f5823aa6984ff260038147ea12948fcb7a7ac7a4aced911efc04792102047c474079cb900686cc57937a62847da36e04536796768090452772e8f241fc06a63ff967b8a433c1dbed83935cc43901a476bddf04a7770cb245ed010eba2ba92a6668748a4ce6a7280b1af6bb110d54390b020a9b9f5906e05eb37654f4579612a2d5c6c8efe9e0ba9aa1c80ad2c24536a9690fe2c7ee29d85b0d704d58487566dd8788faf402159a806034ce71207ba23a39166185fd1aa12543177f4cc5ed2cfec7e0a9c5faeecea79f5f9155ef9f85a5bb49a142508443a29d92743998a66eedddf65cc9981260f5a674dae6f758e8d237ce2967ad0dc7bc630ab4888749339211f39b68a62a5754bc99328c004fd2a9f4cd815add5d345adca6c59f5b7e84d5aaffee0aeaddbcab2bf620afd12b4b123c6f3285a81d9264518f31e8dbec689ef241de172ed496e139b52cb733955bf555dbc34fd5f5e9c10aec80c9d13ce7d52fe2f2f738b6ede02ffbde0cee350b3a883abc1f2e8c425b4fe638ac03150962aa09b313d02cca8f55f3bf16cab262c91db4a65f798ba41968a5e3f83b20d72dabdfa7d1c0de34d6f2c2563e8fb5688a5c7008767f9918e39c5008153f05581e7a8c589acf73339d4f932bea04e526668d976acc085fa5a13510306bd76b941e5e374ed7c494cfccb58cc783f2eba343f75054c9dc85533b790ce262cdfa9413a1090fee68e8114c6ad5b172216ee80be3c44fd5c2b22a9ab16da662e85b5fe78929254983180003b697711e5917fba4991be258838e33a4245a04d3ef36fd805fbf184eddcba4dae3fa90ee628ee6f8617c96bae7c275421cfc851dab3277c86af56e673daa06b93825954c037ab1ed830ff263b6f6f85ddf7ab0a8e4f8d4a5f4f1b1fb6c5c2d89fc41089f0683626d46fe7ebbb8d1c5dbb6fd0edc61301c0143db6871338a21307875724e3152035ff46ec22bb5fce3a6e9ad2522ec8158c3a0dc1c3358dceb98f4ea5ac34d8f9baad3894719741f5aa4c0b180e04b938fd3531c54a8a3f992a7b7c7486521e233382c7794eebee133bf8332a47f470fc919a4c29838de8a1e470b35c49c77f1d2f0466031135bea75dd79571b68a89d0e7cdbf6704bcf36985f365c57d0156780ba6b6ba7ee13e328e8eb496c0236e467e73fe2654940a607d781638869c4ea457ee1c07de9ae7455c7212f1fb4b98ddb3f19abfe9bf78273973473e0cf4c222a24f1883b6bf34403626332bce8f83f736db17cc4a7bc71e58697b3e66b75b93695e3eb6adbabfc3aa1f97acc05bca336594f7b3ed6591b638ef24c22a3075472b7ff1091a39e43026c2a2ed773cd612ceb3bd0f4909429f8968c651ce0c99ee4738d20382a94c264ab40776399f3205d0cbca46e3e3743a987ae275d8b843c96b2d442e7d855216746817cfae1f688d2a21c1f354608108047a0ba6c0a00d9905a1d9f2715a8071425366623b29d429296a168d012d03984bfaa45d1c7051bd854b05e7f49571c7131a65c6774b1f6a5d194a8c7085665bdd714f015285baa7889d5a978dc280989501b874c90fb4b143a3d06a392643d347825e5bf97c92f78e0d4a59837e476616bdb0e5c6c40eae6b8e3abea17c069f0882649577b1952de40f47c6ac0530a036b2f1a1f714b7b2335cfbe27ff3390f9f05f47653c11bab4937e5673e03c6e76365fd31c07e3a5d3984a68dfb1855a5899180472427a1002c0ba5a3dff684ac2b6b360db97cf10ffc99ad19c977e71146a99ab05f41bfbceaff0b14f86a045f0d173eae487d865afaf0720e518e67a354a2962a7bcbe242248688231dbaa070671e698c041c64ce934db7e439c8420c4231251df012932057369f66c684e390f7d5593f62b616cb73f5c123d8b2108c8dc9aa2352c25ce80183d358794568310dd08020eaf706e20b9d4055b4e85dd495d0a7a31a37aa0991f2a660ac6888c1379470e9034bdf92d88897e254b7845508eaa045ccff04f5a7079b27d68aefd1f395adf05220eb6e495c4a624ebc2e8e357c1653d184f84cbf3724069e18e7d3d05889cf5e02c4d4fc8cca4df962a700da099c85de75ee6f3915c395699f1b574c51b6ee6d8df657609eba1deb57a82d351785342a2e61eda3081c4caf89e4ccc61597c6271eea65f4167c5aaae78c93f52a72e76b3afd388b9270a4f665feb4dc18beff01323ba14568937caebedea588b6e82818081ae061597326c4bfa3a00cdf8ee192644469d329920c6d2a09026e41477e97324575b2a1965aa0f38e0ec6eeaa263121af500bbdfa727cd5b61b246e33438f25f758fe2f4cb8f1ae186198aa73258406d6c47dba2f57443e405039721e2f567fcb0ab24728ba5d4bdd3900a78c7801605567a792c31359c042521c117a8a939c1b2b5d7d9ce74a6937058d7a58962fda9599f7dc384f33f836915aa0dafdbd07720b8e572bb83f62d0479d7769f865e231dc0ceb01634962978e63c4a1e1394e6a5b935857b5a2d5138fcf43332749f394be4563b0e8308befb9c5d181edaedd5e7c2af5a3581b4c8b4e8152369b52ab48b14fcab9565fd099940f7bdd7b6430d8eda3b381281f15a1f45228f6dd0655b8457a84ad264ddd3fbd9f1827032fe57430ac1693ae04ece221c02bf654dbaf8dfb5425eee0711e4c86f33af12d38679ae592933d42932ee64749ffb7ab590514336b33010d6ff04a90ba58ce423433b76cf5bdf08e105808e55e08bd48e4e3059e3e108615a10fb46b32f610fa99e67437440b400922e4d47c7adb69a635e5bc9c3b52e091aac904672b975baedfdc3bf51befce1c3171d38d3eec6f5b9279a3ade17e92f9f3c8d524d2b110e78c919906dbefdd6fd27b808808b010c1a11b7553df082fb6f26b8114e6d7d33d16b2f5ed0290104c7c6e560d76db0080d8478c1e726419614d4d92c7c6701508049cdd283e54e96a95c6ee8de7a1a101be8a726e4a36e2816acba4adf02e58d0ecdbd938ddc2cb22b5119479f9b894dcaa50a2e3d4d51d8fb18221480247013025ec64af6f4e581d60eaf2622b943e6a5236a7ff90e32cf4d7fd83166b6eb0ae463af9fc717c02a31f9f72c6dba910431cb8ec120cd58359349a54a99a19e9a3d464139072c04d5c57bbb028a88bbcff803409dbb720c3156dd510722cbd1e9936e44c1be1bfaac18fdc14f8109096e813446bad1e496eb1da5a40f081ecc22714380def4ccead4b4e5d2bc5827c30a54c769c26a0d3e8c7008660b5381d66b5c2dbc39b2261b78219cb6f119c830cafa22715a8ed44c3cd76e5ea20cdb39ecde94c27aff13d7bee58b3595ccd699d7faaf262c46210722db3f557d3a163bcf7ee05848e47b64ce8a19175077384658dcd550e099dcb86703e41344e5192539c579474b68440bd198ad23cc24d67f7629fbb61e90eea732d8c3609e15cc3f5439c8562c935714ef95b122aeda988c59688b218d323d1cace1450433d317d04864334f936d9cc74f0b8cdda1a266b42821ec59d587b25ffda6d2c6ac26e2223dce23f827fffb6c1a81a6194b8328410cdc86269f9735b74cafd36fb117157b5afd011b91505d4a778067a15485c6792c22c150936baf6ec185aec7e9ad9824c77b337e7968a8aa8f8f373c65b028a5b17a059e580a06ca86afcd96fdf05365add023ea8550c6d48a367eb1260d370cc26dbad9977c2414c0b596a494e82f8534823726600f9d108ffda4c93ea3d9f8888248c9f7caef939a2073b9579e12ce831bd9fcb0ad17a6c66d114c567af7af2a41173621fb51913a76cb9cee19e686c32370321e331bdd580d2d02159b7a7ad1328fe8bc173154c8420616006191f61b20649151a890ff6d6561b2240d48a1a5de19a6712776256d098bef357ffd66b49c1ce1f21460522cfe13262ad84b6ccdcc1b3ae8310a4c5055c4ef377a101db51e02eaa880721fbe5fad24d00569237284ff6ac840d4119bad18ddab5ab465472f7d731cf3aead4b109575be9b8c0dbb8f2bffb959bcbc739aef833c28d0849256f546f575fc46fa9a35e19ba29b73d17409c16586aa9402a3b2a790eb4bc3bd1bd229dc0e4430f384f32f0f237e9ddbbbff7771ce86e27050c7124fab0f6af1067de579c76eb45f563929c4241dd302ed77eb883a38eee529978c227003c155a05c4273a7621a66996e955fb0605d6e91d8e350d0a90088b78addb1430f101270d80773b609aa2fd4f93c8bcc2f82462f8a28719abf60818109cca32b1b9e4ffe5afe20fd49ace38f44e6ee82728cb34ff58294a06356f90f7a22a0310fb435d348ed23830b67a953b65a30d911c1dc7a81b861e97e2918ea46a7525cd39aec760b9d23513824aaa6b762fadaf46aea3796947f7df6220599d6235eb450989b6f0cd6c96db62b0d13afc4f48b03ce040f9cdc9764b589e9a4915e6f416cf66a47b25fbde16fc4fb1f0649c5f627375389fb5950a6a1a6eb94de1f2b0c10fb82856402a6b549379c5425b9152346ebfe2d1bd3534ca4c034f027303a1c25f00bb18c852cef2ecb173972dc8e1849332e836412475ea520eb40d3574579911d2c5491b1f89905c99556567ad6df19570b143fddd5e28b0f390d4a5df42c3eca0ef5db4eb2bab6793d343a5a95809c9fbc6712fda5e240d346ddf30aee3c123fd91cd224025b2823385a84457401bc536a04463b5e65abb4393b3825dcb1f7c3b451defa8e83450fad509e031a6c60ba3c74445da874b4fc3aac80786594d4a0c71d679a013af485c59fee5c31c8701d5b3e732b2d1643f173ba34c932ec901c3b07d5ca01881dcca8cede185e1ed3c4eeea3a6f925340dd09ecbae1eac11580389890533676a82d7d65d4fe4b7573f71e0103ef8233930627ca7b88361b4a14e55600fd4a0b7ef06ced3ad7a0d537fe130a3574a3bf25b5f3dddf85be03171f6bcb8d8fe250855d9fed776b04470720f48d37c69dfedc3195ac4fa2298064ebf27fa0d3a94ba6bb3bedf38220d1cba7e91273ad19f9a1c436c031a5209b19bea1f99f8f4406ca546b7516e49c7e6bd91c2250f1bfb65db4fe9fee574a5b1fe1a0c1f48c5e89d76e550e48581f53d0ffb2443659363ff64a14d3ef8050c85c9c185f05929ddab752213ff1a8515ae060d6018daf279c56cea1e49be8d9eab936315b3c69a9035048f891799adc9a8446aee0beb939d36388cc5859568eca1ef9123e00d82b0c8c97028b48f7651ba5f762692f4015ee07bfbeb99394166f742be490b8a8cbfb518966b5c68697e629bc1b24490b62f428bd9e8eb0681be1a115ced7cea130da89644d975c111702fadd019a74e4c9eeb0c89560189b42298ffff99da98b03b01b71deba705e9077fea23b521991f2e38629cbb632f5354e24308c69b12eeb86eff842a56c37a84e1f53f2d49edb84db92286718683d9c584af2b0c44e529163ed41a0e0b662078e43374da96d8a28dfbc0c920e213d1e50e88b8d35e8be9c4ffd9321f4b8a7563f54977558ec6685f5ec1f7321c6bb643de6444a44e73bb5530738ed68d8d03d6939bb9169853644280aa733d8bd8016272b651079b3918475f3762bc480a36315daebca659fc40c7dfeedf9bc6f54db16a136065db488b0bfa996039117ea714b1f6f48d3a1d686feb039ee5444fe5b132fff557753e7e23911df9e55056b0e11f08e323bf53559b209d33928a5483f25bd07244ff678c1ea149b249bb1efe3713592b02502a92ea1ef0204c0f8f82f5534979c6e0701f6da9810bde8853d9872d6c1ec1a30faadd44b0f74a5a6d7d2aa7af7e55bec4b281186888fc6e81fd41cbb640ba1e7ef7d520642b35e18add12c786f269e0f1e0098c749c5bc425b3f78cdc238438f51472306e3e973b542d3e3164787c0d6422676419b8553fcba828df225998790e8b250353a3d6ce45d81d83dc63148ab7e41b3dec8f7117c04456413d356f5537c67e07a8fd8d20fc88312d3354cbef59bf958851745812b012f03191598153ed50ddbbc29e22d9d498099c1dcffab1b62f86b1ecf94287178e974ea338770baba4d4ae5518203f6a92176f00373968798e3f790390f90b7331bbf70754a8d30f5cf34dc4fe0de82af0db047f2d007a0086501c59ddb4063f86cea91230af4064c3aa1896b2545a825ec4fadf03d86ce792493a44323c0df9084ff3784ee2ea6883799d4ed79c1d3d1685c0c47e29c79b2c8b415720d9991c30c0549e11fc276716d25a51c03d9687d27dd4b3de8d0097cfa6d0073c152e358ac05af82c438e0ce854ce441ec15d0efd1dd521b77abe69f62c54d8f68733c190b0651af06194a69261779a45bfd73f00f610929b6b479e3a7c4e50b2a8403ccd21017b00dec1e08f98c4c8d791ab947897358aece7328107172ae322e0ea23aa82be9cc0039c374a5b646446ef30bbee61a27f4e7705ced6ad8914b9d99802b3660af4d0789a175d39a4d106110cf1bce5f5e4127347e4338fd769d9eab056724b651794c6220d22b424a3b7afa6f27eb48e5deb946f4da83e946715ace99b51936b799f44fa85554b5260be33851aae2e0a413c32e287af4a5e70ff989a4debde7c9f42ad5a1c4f7fbc7c9c152df6c5e2c83276e7580eb323843bfa2648eabb9d170d4147e73e8bb1d17bc3fd17f3405366b64e1a266f4e6aa41c97de8bfe1b5fc927fdad186894922fd2e823c9bcb7f054210453d415fb804c874b39ca04b5871183ea556436f48126065b51b9afa75a1f274c1ce79f24f4dc20a6c0997b04b37eb599d96106161f52aaafef7e4878f1361d87ede7676548d16d1cfb50dd73656f118e91856283cd442458556e13a74627983a3f49fb26eccac12052a6b89bfd714c3b2647e8c80b6907e73c3f9ddcd9620bf59995e7046136c1435f0178e91c13ba11f03ee55d6a4fc9df0c3943641b840d2c8541a7684693e21888d7bae521c4efb597c104be5a56ee923e01a0f79cec00517ad3c8dcfd70a7f268bfdb1abf0341987574b3656c1ceab35a1f32e1ce388a06f2c2a7dcf64b8773672075e4346d743d21d06ddd000042c4e8e875bd3fc80ebf75a4d0e2d183051e1c8007ec3251ec16255ab09fc6bf8b194303e604623902ed8be0d0891fb5a554e1750d9d296f1da5e87a18281099385320e81041c5fa0b039e1d332a2161ecba6e65e3719a038d8ee3c501009e3bbef4eb1b60efeb998ba43490555097065fa10be94603f4bdb013cfa207b39ff5936119f4747933760941d800d396e11152bb526591bed9fc39e6d4c798abb6756a3a2629a7784e4e086f10e51a6770218a6bca61532cba5d6f6acb7c3073723987e2982196678c501d8e4793b64cf4a54b34ec6316b8064fd531fc566b85439090fd0852adb18e4a9d1204b313a1cf1b39a930f138fb5e421fbeefdca65bbb3909dbdf5379f0c48c1bacd0b9df207001ca2b2082466112e283742e757d8149814721859a77bfbf932db1242e652377e7614d43accb73d49fc4f430c76d806f17fd40a3ae2348d00e27c187774235573ab38202b744ce03d838b18f38d2c39c5b80cbb1f50956b64bbe50732af2c08e8a256bf6582eba313a733ea25069d561ca761529059653d2da45e06fcff37f9e343b6d870605d2ed24e8ee02847f305ff341df715656baa63842e3d5bcc0acf6f76a094d27469288262e52386baf6ed744786d437dc705b0f459ed5d97e6f3391235b1b1528d93a2cca80dac6c56db786c8e60e7d263cf839cef6f6fe7d2bcd53323094c0e3740bd76ea72e71d2220a3a9f83d070ab9728e7077ec751310944bc8b67275c0c01448b36a2470e48db8f9ab4a64096d3499323d87d715a03d041d41748fe700d498c500ab84c258f61eeadef96867a0719e2f4293d1ba159476ba4bc1a3e844d148c2fd233653f0f7cce7b399dcba1add1bd63e204eeaf9c386b33632712213429eb2f7659bce32ff3d70d780137952f37cb76eb1b120b3569e88af5b5a0ce2a525259de7376995a90b26a960bf1ddf314b5372ccaae3d8aa28baf580d1013975569b3f3c8bee9f519079a79032201632f22ae8e58ebce05adfcac76778b78e3fbd7489ba2ba5c69577da60b31f189e552bbe2f70ff0450d51e289353a3986760c451dbf4792791e12bd9532dc87fee34328db5035e62a0955e54c7fa041c4b9505a3c48006fc87c126f6fd84e0be8c4cb10a18213f4066382aeff3befcbba128fbfac1c1579d2ec1e3a3de4cda6cdf0b21c3d74f1435f82a0e5a9517001f1ea901b7525ced71ed400c6063ea28037cfc0f3b60d17fac0ce773253a86b09f0aa1c17a04973b2359d7ebcd2ce15c0adc9bd3d1437cc42aeafce3b042a280b3fb8fb5b33724b319db061c4a97c6d8fb84670a45fd95943b38d6eabc4beee30677ef58e39879f7de07370859430f414dfaea2cea0da062456d020289b4c079fef62d158b770b7bd855075a89ad2f078aa691b63df241b0e20e0aa5a92bdb9815fce5963b715db1a15ae36d4c44aaae2a1dfa30c229ee0289726d4ebb0f74dfe40295354405e53bc17f57db219806a7b4d78027173309d9b45086880fee30b3d19db88d65b3366ca138c10eaa15c786a359dff39d9c2998eb2ef2cc482693a67724cc08f0f7c5e6c92ddb72364c71bd8e1b4640c5d3c1d2a6444ea5c467223a3d3e4c327642181cc1b4f3c056ba79cedda27f79405867196e56d68f352e40f1ac50b5847620a180f364a663abde643d0a75c8176db89ddfbbdd46f2faca944f4cf294997121f6a606b36fc67626a58aad0bdc95de72ba98172dfc6b85ea70b587aa65cbe7b49c1e5437cc737631d23a2deb099ef30551c4f8ef8373770c8ab6e4dea5a65a56e63c645828f4fc7e5ece1589fb7d4bef07f8e99868854e8f26e5fd05d0a339977992cfab11b5a96acfa8fc6f1ecb599e21a6519f182b6d00f9a538b6736d15e4dab3fe87135fed85996d3b00e003aca1535fd98a0ed062f0678710771a4e6fcd6e126992ba3e396d408d59f5ebb0a586f187e9dfd91eb0ebf50e2cbe11d1b7cfc830a95452eb2d80598be1b49e5ce4bda0b0fb16f350e74226ace5f216918e5a6d81262299e13a4d48eb6aa37452dab3d55d85b5ea31669170d5c4c9750843fbc29678a3dbbad042931e4d690a4d0817f3f022332a1acf68682b419ad9a079325be3095eb4d29ffecca7126bcca5ed48a11b59154f878215712ff4eca0e4ae8cbdf96099a1b2e9d05a18422237f80ad4513182e2a7021f4720265745576f54695d4c170b1ee65e75cfe46532d8bde13988c54811dd05077bf9d0d12b898b0b56be4d8519a8e76e4d929df4043b51f0e6bc6901296e2acb1272a20b05a3c213e35590335bcc3089d65697672cbc6eca6a607f56afb6cdeaa90f0c5d6a32cf3e8db796ca37f55c318e608336f2f87ece43298ab10b5378d6ae438250dfb2fccbc468d38234b0b515f464c3fc1d5bdc8cff5c1d98c2d0b62fa094a67dcca0c55c05cdc923d88ae577a6b7ec2ef27332770d8c9a867caaf0561e96eb5cc788c35fe06b0a07a9e06806f3fe5e3828bb0b2cdc3fa3f28f3ed1da76aec34646d77147e2d4f8a61f6db7148a8cbcb016bfb11f09f9ac757128b52d5760b0e2c12959c47b702797bf6f5d50d9076a2f42eddebe152f2677d8e524ef1f4156baccdad73608e11954e071c52c4de2f8fe43c1ee8a6c64a4821cf0ab606cb50726d078941d498c40564921790777a3eba58fd86b149e1ea91cb3d7b3519e5054cf629efafa8bf63f245fdaf382d4beb4cd8d9dceed28d196b03406c7134297b20cf99a864e6e9358377b1acf2ef3b7e6dec38ea4647b120fe5240a7125e7ffc1781c17c09960083e18417d665c4313e441d827662b23547713fa5f2c1a0cfce5993083246beeb9533f496f43ab41675faf21f49ea1a00d6ec53d7162601013a0d8dd594c26892b3a24d95d019c7d069b6f4772b8588fc1599143edbe889fe885cf89268269bdd2556197e30a8064862a1a9f2e4db03104c9e0c4208af40ac006d5aa6771960b43276dfb8dd927866aae39bf93b959324c223c34c67252ff4ea693e798944beff242a28ab9f7d251388a352f2f95b4021c051c0c2bef05dbe8d772973664fbda6419c7bbf3d12163543095547e6d413ed8e4f8b0ed6b8d2f332c0a5fcd5e16591d2f1605c81f852b5243f2c5ecaa913717446ac9677269779216b397c9fa2bfa91e545fea31d7e17c736a5fa16d824995ba5eabc468e1b33aa2a16e5b8c3cd2d46feb01d11659cc7178b576769705bb42a7be11ff73922e1dfd8aca016454a6fb0bdecd79f8241a7b7a46fa470fdd735e848f66ae5ee11109794dd7d6ef9544073b564c4b9fe0d384c345737b9eb079d299f8303bf27563e85f131d43f5a4b3de477b04add236007399db677a0c27d3872e22f90df7f72ca1f70323ae3d2cfb6a77747f085bcda830453060ac21e98b648b35488c350e741c8946718090d32591136a45c5004fd3a20e6be579a49fa950f858a620746344415d038f22b641383d6284dc4a8a6189b33eb47f495ff03335bcb39a317b9ea3f8bb6306fa771f3c55adebce01c0add34a1c35b484188533fa206fac2713669a29ea8e5c729b153ac13cc6a3506cdbb84fef130f929805b0876cb4646a046330bc33ab1cf1e9ca3869573ee1a1549341ab007915dba719b3c4e8a94b62163e6d99dee2cbde2ae74135467b125b417c7544978d50c80c694399db77e878109f59a8335df3a326135a0d50a4bde6fc3e5c03fb7747bf919c68ee8f45c312bc2dfdd279411ba7a5f78dd9bfe16baa4a82fed076608229fc5a2aab4a3c659ae09160fdfab9cc526f3be181d95ca30ff6f064944e708a6f164d92b85584557645738a12fcea8d0c4b865fede73aed7dc62f9535cccee6f7a71ba7fdf8441b10b37984fac8ffe63d03800d0530a6d15c84e8999d38a31e2b776c72627aa540cef24e559ba61e5f4d5dd2f5b2fec6d814f6c279b2da16bb724de9f9d025ce4b1ac99805dfdd7081a522241fda97c2890de5663c5ef9504433f339462d3fe7c45b01009dadb71cd3ab1a1d916644c36daf187bea88df7841d82f056163111a34f8622d24ec7a4adec80c66553f4df10a6359aa8c18d2b73ac8caf55058e38d225bb4c8a2866f242864c1a7734bfa73eb8f6e9b28f51b35b86b8cb01df6fd6816ebbf782062decf3be80287f1749372959d20f5c909021942293cdfd023a6d498104be6a4680f769fba95aed9a15f1592f33760743bce8c616aa4296fc927f931321fb93980493fda4442c533baa78568fb7b863373c9b59c968a3704cfc8fe68b9049ae492d65276edd37405a6b3e9a21bb40c0d9939bd7b15b7b0961dd10bc60ec231af86fcd8fb1c0e62594fcb6ac5bda99d0b9667cb864ff33d2e9b8a4ad2972125a14404f9ef3bbd38369c37305b4823df33509b0846ad0586d3313be114bde91fc2b536dcdcb1a69da5753e62ec24ea7a8fb01d9b4295b7328dc72bf814e8e1c61bbfd9aa49e6923aacc22a28feb8c617279e34ad0270cfea6445a3b85b81d2c3b34b378abf4248b7566b41ab1b6e7f5e010329660fa716556193eb4870ee84bd934296a5c52d92bba859cc13caaddcf627c544edf0a0541c8b994bd1db99bf5dc18a3f23e30f36eeac72128894dea688a1cecd6b2dc551e6eb400b7b25e84b4b470d7a2ba150fdf9699f5d31ff67a5bb75040c074f7dd45c876e726dd545ef2e2db18ee58858af84e7c9f33695b1a138ad5149eadd2fa726690cc9d0731774ae7960c57a1f8f14362fd61dc0de2462a6519ccb3b5f4590eb990358cb87c6a37435016512ee5ef3b848b023f76128afae67cddb235e2658531d3967879aba4228687cb7d47e2b16b13a3d4d02a62652f8f9cbc1ca613ac708ff983e2c335a19721bb903e9565f43ca0e67e3093584112b0e80c557f0e9a4af470725e1db10f2f8559f9179ff6343abcb142c3697acb5efafd32ff3939bb9f3fb6d63ce194493651e18a8abff9edefb792e71af530406eee3ac46c5d3b8cc7925b4411c755cc55f7e0c91a7e077db63219cfa9cf1f6cbcdb2f353f637a8a6ecccc307f377c1508e7e6195962958048ac9460f26f9e9ce3724909ead48d30ff2f982fd7aa8dbfc9c2500faa063a81f197c14f875f445d5d2426c6f138ca2ce33b3d96ada8f12912e7cd108ec15cef5b73feefcb06a71a946136d0e508d7bad5902b0983ab5cfd6ef89bc09a3c7344e0d1cbc65ffe1d7123c9f7cc28bd3c77209eeefcdc3a078948456aa43ec0241f2c21a66798be3ded75cef82d5ece4efe6ed807e529dda779398eb81fff04c5da87f41d4817cf7eec24d0a658d9c4a59d1adbf456fefeb329bd14e2b85d630f039ec9aefc4faa66f99b8f80f33c38d6ffbf1b42d6be1591374d7898e1dc733626eb02c9d8c2c76c92544c2660e8833982b60651c909dae80e553a4940febdf1c0d7400c71f3af1652e9a6f546814c63b2ba2dcfb244871e3b8eda524a269bb84dedf1c56c64d9fa97c6107c0878fcec2c16021b3700d2ba3b34c9625206a4f03ab9a8a30c98d07fed6429391b420d194b6423a2abc1263289f197e81cf1524023a4c523f7021b1cd05e51ab137ef5919d1ef314a507fa1da43fb661ff893c1e7549e7a690331257cd2f1a4075825edb9dc100efa737d6e21699b55e7e20bae1bc1380c98c9e7ec75020f3a7b5fea16dc9d4cd7216e345065d7a053c1d7a6740749c10fb30b698d1e60e6e2f593655aeade4c96a989cbd10e56b369951d8c9a12b4e28ca211df90e1b31fa65d3ebf444b65b752790c6a7984ae7c9d4bfde4a8a3c9428a4d23727e25c2618e9ba61f5967fa3614793f3bcf2fa7a2f9cbbfd62724518a119c8949dd515655a19813ae23a76771e3916a635b7809ce85fdab8c9efc15612a778a8e38cf37a2e73acf942971730fc7a9d40da5c59ba748ca092b9593da70dbc6706614062df1686a21f8f32ee5b9c8a9c65f367f26d64a1820de94516b5e2e7181fbfb5e00ea2d1150020a478616ef798881950f720293d139cb249e8fd42b600675743f77343d15a5dcf5221ecf4302629c4adb47d42cdb9c1acce20d7ad97b46fc08115c78a06068ab3c29758bcc2a9cd8de4d6df41c2091f41585aef740ab8bb63d3c755d5fd8e19a68c352f393da7d5cd8ccab096b86608186ef3af468d61bce9e288b8c816757ce00577eae9ffb4e51c0bfcbbb21f750e8a78879185ae53f6ab03e65ac0ef414728c4fc265f97358de1f9093b4475aaa5200b9320c1dc13fb3fde4cd660f665eac9412e4c0a72ce02c7ba6cc99e596b7e61ae82f77b95063d00c8389628ba77ea4a108ac66b30c31635f693e150195bccd7c7f3602377cf3e9658462478a9ebc843a99e40024fd92aa5041b0cea53e042eaee410559e2c3628914d20be14335f71e82d523503e64a29d896eb6cd879d63239818517f64875b317488b6e324eb195322cc0ae57aea2097ed0b898a32e7900a4bc5cf047b7f8b27fdc6a00ebd7f818a0fef413283fe272ca57ddfa0c4536c277ff5f8a9a63074e5270871b48b67d22ba0bb60b7f80528b459422391ea7559d3bb1548af633eaae166ea8684fd488d909bcd03e6359397d76ed51fdde3a1ebb7739049b640fe8fc563d968e0a17606814770855dcb2e16fe6cb30f056e7d844b3013763ebdf4b5d9745193681684ff563a528f8f273908a1b9789b88d97cd607770b48a938b59fb63eef808bbb09ba97faff6ceae858ff69fb722fd8b3043354cee45b964fc5bfe41a0fdabc0d58dabeffb3b8017ce26dafa95c368599b83eeb9e3b0986718988ebac3eec898c16d243bf3beb535379c5eb29736a0fec1d5b147b7becea3c85ad155bf94064c5a833becfe491611a83bac5127424e828980a67cd3370420f5e7f29afcb70ee28a16198983a24bb20a49e95facae1aeedacef7e39de3e1e785891711e31f87653770e59aec92fb21430f40628e43ab499e05c9017e8a0eff62856943da931ada4bd7c8a8a0e1ce643dd5d7e434c9aa9bbc6e4760dff3327072260fb74add6f4bad94ea3a07576e85dee3d66c0808beec1c51968726e7f6439fb331f59cc32dbf45ef72d889bc808b1080668371c79045a6f6e1febd2e027fcf73f986360efd3ffb2f880a8ed7af7fbaf5afafd7d0c8ad42a44e4e0a90fd2cecaf8df1828686d2b79e56597e71a068c48bd87ba2e90d2dd8a505fe77d58f53ddb015bee6f271806182014cc152fe4e1587096c3bdb07cc503f2f966ac461fb8abbba76cc1b6551e124b46cbf426f3a97346c0c086d5f9292bbf49e4d261b2cdb1ba3a09bca0b4e1fcc953fe1099b3231d926e27269bd8786617b9f87c365eeb816fac4bbc50b7e04c2cc4f8d6e2c41cbbd6276e295c8b41578ed218063e54a09f6e46a94d40cea764d82242c3bc76c4e294651bebb2920254a71aaa0ce4647b6018b1b8ec1b6985eb6df44273616bda065fafa6fa188d39f1d30c44fcb2eeea780175e1153b292a5460a39e428c13baab9a7f95e108bd66c3a52f6f5244646c5bab0bc8551a8e031422c8bcdd870ee546d75d7f2cfdd3072e9fec8fa9f3557f6f97cbc52843f88ecf56cc04910cadf87c88b1b92a824e99b715cc3c605a3292383a6e6e0b42094bda6f362bf9677152913124da861090ace1c956ec11d3ac535a254c297a8f30b8b9ce8f999332098239731f69bc3339af330d15254b19f32129bafd9e02a5ff64020740b3eaf6d715e99119dd3964ba1f1f637f5e5877d78a4b9deb221000c5cc37abf2216d205a7c164d9cab8a2f828b2b6f0e1de697aa0d14309d5c3f3a345fcf2f0c589649142333fb205b2aee3351db8239ea51d3eb083805acb2fcbccbad3d0307dff2cb84b9e71c4d72984b3d31a43f9b2a46b72b3a1b9f71bcc502ec1305ba6d0e0f323c9e94336c785ea110791a09aa7411dbeae1337084d014a7265fbdc7b48948179c4fcfd315e2ea9a5db6a182d05e6f9c9abc13fb6ea38803fab1c9bd66d839e6345bfe7dc228c8916568df1db52fac93cb1931c2879d8bb3e9d7be0e0c6161289521a48609d07510d80e373cb18e553bec97114888249c3174201f3c0dbb3a492f6f56ae45708cb316252e826de0e60f8fa4371fb8df26071a2941b9f34c41e2736389391d7f5bd2b03c396132ddfb7924cf179ab233d5af4c61da2a55aaf46ef1ccb0c8fa538f0a26c1fc6bb8cbf2233c76375c0cb917849b585cef9d4dee593af961d0549372c3fa34cc145831667837481ac620e56831877b2e8c42ab7c2baf7810d1b4b5c38aab234ccda9a4d4f2c5a3468b773f54408158e372de5a4a70dfd7526fb340ede8aa0bd32a25acaa2d38162efea82d480c29600055d8c0b5a33c858aeca8cb4e48776d139c44af62823f2f48b21c35c02ee02ef987ca756a4d56014eeb3d9b8134a3b572b69f339a8c1b4d38184bff5913362453ab1beec4d9bce8f2edca581337bf7374eb8dbfcec58cfe51c3dfd08f439bde930245a351d2c19b3b66d77770cc2b359ebda8ca5ba8e4c14a37105fbf4a91bc3c5fe0299dc314966cd8fd80265c576a549f68e9edb0b32475d4b6038592b84bb40673f8051516792bc694f8a082f4803b235674d1778896693f09525eb6601b9e886985245357a1ecc256477bba6315b6cbfa11c357d5a588e8b2c2c710399a50784957780858af242e89f3147d23a95c0bbc372ffc1ac079342aeb4b5a95567e388be58cae8a0f669dd8920745d6a99f65156b63bed875aed3da2247d013be7c4bb9c5beb06c2128829a9ad09ecca4f56abe152b2a8f339e2a590e692b3560ef445b6e9aa88fb2ee6f7873ed02a609f28eeecad2c9bf98cbca20061bc66abc2ba4d946bd0165032cc6dac3d8fbc3672b345002f716ea03bc15b7bfdc2c244ec5dfbbf472557cb0682b39f100f4d54ae40d6a44048c8f12f3af988226e7128752678bee771f4739250f2e8211883c03d17c960487a51f24e6ea3b03886185f435dec19b17c9450bf7e5210d6720684058047bcafd0b2ad81a7827aa7d362f2404a7f590f0ee06b7353fa9e99e47fa8f0c37841dd0f932ab12bbe6ed81df4e85234570568ee80cb9718131ad1379632e52783763b029b70c4447e14312c794963659fa523e51b781416c40de533f22ccbf590e32f707387a437eaf51bc7971d5a237dc2aabb597bd09236fe3fa03c9d8c76c9112220c377374f2c98ffb8f66d1fb719e36438e4dbb5d7907546461b8e0fef54877ddb324867d3698543c53f409a699c90b92361a0aa2cfbfa62ed38063cab59cda66968031a0acc4551b71a9fb3802e5111467bd396d89f16fb5c3a0dfbf1016c07920eb03a3d7a5f8f552e915246f6afd467d87b6324a350795ccaab340873eb061ecc55aeb59e5b6769241e5f011d316a4f20a0f858303145b590e9cf39d8d20dd449fc5eb75ec240b9a34ec2faca603cc6fc4a3dbc6d40c52f33ceb4cc58aa837d2eac328ee21b810f542a637926c2b09414821a97830562915c63cc091afad0e1226e128153ee9431dfb92ac559e12f800f4f7733990884a5b2affd37474a5bc8ce49e6d7d9c4e0e7eb0400288a45225395ba3cd6d8d29431deba30a006238efad94596d99b23cdfb2011cbe8e274efd550ca51c968eaf8fe878c4e8a800bd03eec6a0acfc296c33328ea754e88f800cee5879e5470d81ad4562e3d3edd8c8a5eafc12b0175a22a59a897e4a2a459bb06fff90cbe1825617bf3a7e704442e2220c951dfb6ddd16a334b1e022c601d8a45442981518a5834ba05ff3223dd78014de3220f3722aaeb8ab689b533e2ced4525c1ee653ebf9fd5a343e08e5d1f28fada43da4cd6bb5162594e0e70152f300f6f0e0240d669023242a6d509048243407b5a984bee07b51ce8b297fdcd91578f9a87821c720a60edd8c94f26d69975924bd6e9952ab83054b436e650d9fbba3232bedc7c944c2255005b9d5c45dd264cd6595c9d3f1559b6566b681dccb6de93b2247fd5af86dd2443be6e3dd4c5dbfc85525fe87dd7a79e4990abb9085b4b20b348faac3642e7d80d62203ff5dc1d0dd34261fb8947909908671fb73f71666590accb84db28d8ccd7f761d74b88501d6aba114ac41dab231d5f329cb461d6dee4b060e3d071268f3dee81a828631b97a619cc5ab0a26db8e2e982de19d513092a04594de8e4679ba9a83e072ef4e5f90ff221aff17e4ee703769effd2239150cb19232776cb027ea5b4c588c1a635de12c38fbef919c529f9b6d5767fd5d852625f4d04fccd9db4acb4d6a1730f81a3591e850c2a0d76fe300ac4e665745e9a6a57456afd447fba3908dff5d5895fe53d53901c16b1bad040f2fba43587aa755d819acdfac84f1bd5214fda4bbc37105a134f6341bf374c96ffd8547278329fb67ebbb277d182360baeb4e358009db119ddf1763d7e42cfbc81e95b7ede8d560f9f269cf6f89fb546f19d858d0f0a44070444d95c8783d62c49bd4ded132154b37379f1ea961df601aa68554d3ff345ac36b7e1316360fc6097b2803fce85086c8c1465d5427394e639b3b73b0bef4273d5a9326e8a60aef3fc67b6d9592edd7569844d5976470e4f1ffe4fb90b54a6f871b7514665197a50f85b465c5b8560786c583cb9b9feceb6dda67359a6d9ff948b60a25babe1caf21bfbb33b4e3f2de024fe98a8760152a7e34ac69f76d5c8e29313ca3097503d61c7c781f899a2923723e60598430536bcd169bdfce3de7f6d296f2d47effb2e2a8c4d3716d6663a07d9bcf7fba950e7402871cde4866aaf9eaed14023ee3939b6ea0b47087ce081bcc6d1d455019ae0ec49017af8d6f0b5e1a3c897374a90cc816170365005a805d07bc34f36f449b01bb38749bc4e074ef098d3b6f46da87334832a898ff92342ed590fbd13e9d3d1590871be816424c725fe71140dcfd6ba2abf88b51adff8a55def25a26e6acfd12eb85f4deaa1bfbb0c653f32d5f9a20dee77194d83128eb9ccbe9393c8ef941bf733be8c7a9f6e971e4d7c97df73a0eafa5a5ac74b495c0c9447e80595f0d72e5d1b0dde93a587e7d617e7b79cb649ddc8d9db96f5ecf6fa5f0b817c6816ff94cadecbc8e86cb229be64df26904a0352f4660a40f565d62f8789fe7cb1ba73cbcadf86efcb4d63d951b4e1495c9763e6e79f6569dc5c7ff8a833bd6af553ea5fd7cdbda7bed023731a788ca44436f2062cd68b660d296b022ba95cdbc58bb9bd6c09de75559d578383303fdbf9a1243d3ebbdaba2a651dc8ac5b4b5384ca6851122477fd01fd9687166c8934ff5e70f897afd1fa96880ea884ba0746c5988cd7449e0893668966fa6e9de763a7c77ed4b2330f9bf41ac44e5f462f4a0a5e7dac8de70eccd5b93f69d634d8cc8594943e28e5f212a595c51686a011b1c5b4e14d4880092de2158631f7d1ebf43b1e67a1762927e32d71879db5285d327a142e362f09662b0e16d20f4df58f5f1afd4fbb047cffa21e468240457f7030a9f4daf38bd3d448dc45b93e43003181c789d2d75e7207c3da7d5baad1f5e930e7ff6e01f98fa20bbf2a926b718280f0a37c87730e78cedd049e6a39c52c26a7866c5dedf29d7de8392df403441cdc20312de43a7f21b3320f124489a992b72937e43124017db672dcc85482550fd19513166f8a3aed63776c8150f6e9ca292a6eff7e20a0b0ea101ca24a850f0bdfc3bbde8fdecc3c4e119f64361e2022eb2f8e16ab704ac797547b143c77dc7175308deedbc4adaee1a53a236a7bc73d8bad27b22faf8a323cb46ac6b0d767d120601bbfc9c859b5ac86af47447c599a7937ce5a911ac97158c47e023e202bbb6fd6e7d9d0564ad12d4a71587abc519a3233e488766e831559e9278f3aee8290c21974b585fb1b91e27522df739849ed45360cc425f7619edeb6f9a63d9f16e1b58c34eb613326684a8b3634a5bc9ce430c299864661df6e45a266ffccbe532ec8b3bae3e87b05d4e3e11e00a785d51f734e3d575e2a47043d2fe1e45ed8c1f85a348927924f24584d3b6ccbef709d0f8b4d4aafb3bd430113d40cfc7a5addbf0863022ed52c2c72c4ee84eef4293f34f75444080d875de568235ac085c120e351e3b88247ae68b5096f08e24c0c361035e7dbe8b234f221b8922da927b81615a51b3e9a6022738f79516b5e5d963c31c56c64da58329a2673a5284ed68c37b6909de70f9544d762a32a1ebbb Out = 6d9ef20b491372152ba56e3758f885f8e40e282dcc19908b8493e7e3 [SHA-3(256)] In = Out = a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a In = e9 Out = f0d04dd1e6cfc29a4460d521796852f25d9ef8d28b44ee91ff5b759d72c1e6d6 In = d477 Out = 94279e8f5ccdf6e17f292b59698ab4e614dfe696a46c46da78305fc6a3146ab7 In = b053fa Out = 9d0ff086cd0ec06a682c51c094dc73abdc492004292344bd41b82a60498ccfdb In = e7372105 Out = 3a42b68ab079f28c4ca3c752296f279006c4fe78b1eb79d989777f051e4046ae In = 0296f2c40a Out = 53a018937221081d09ed0497377e32a1fa724025dfdc1871fa503d545df4b40d In = e6fd42037f80 Out = 2294f8d3834f24aa9037c431f8c233a66a57b23fa3de10530bbb6911f6e1850f In = 37b442385e0538 Out = cfa55031e716bbd7a83f2157513099e229a88891bb899d9ccd317191819998f8 In = 8bca931c8a132d2f Out = dbb8be5dec1d715bd117b24566dc3f24f2cc0c799795d0638d9537481ef1e03e In = fb8dfa3a132f9813ac Out = fd09b3501888445ffc8c3bb95d106440ceee469415fce1474743273094306e2e In = 71fbacdbf8541779c24a Out = cc4e5a216b01f987f24ab9cad5eb196e89d32ed4aac85acb727e18e40ceef00e In = 7e8f1fd1882e4a7c49e674 Out = 79bef78c78aa71e11a3375394c2562037cd0f82a033b48a6cc932cc43358fd9e In = 5c56a6b18c39e66e1b7a993a Out = b697556cb30d6df448ee38b973cb6942559de4c2567b1556240188c55ec0841c In = 9c76ca5b6f8d1212d8e6896ad8 Out = 69dfc3a25865f3535f18b4a7bd9c0c69d78455f1fc1f4bf4e29fc82bf32818ec In = 687ff7485b7eb51fe208f6ff9a1b Out = fe7e68ae3e1a91944e4d1d2146d9360e5333c099a256f3711edc372bc6eeb226 In = 4149f41be1d265e668c536b85dde41 Out = 229a7702448c640f55dafed08a52aa0b1139657ba9fc4c5eb8587e174ecd9b92 In = d83c721ee51b060c5a41438a8221e040 Out = b87d9e4722edd3918729ded9a6d03af8256998ee088a1ae662ef4bcaff142a96 In = 266e8cbd3e73d80df2a49cfdaf0dc39cd1 Out = 6c2de3c95900a1bcec6bd4ca780056af4acf3aa36ee640474b6e870187f59361 In = a1d7ce5104eb25d6131bb8f66e1fb13f3523 Out = ee9062f39720b821b88be5e64621d7e0ca026a9fe7248d78150b14bdbaa40bed In = d751ccd2cd65f27db539176920a70057a08a6b Out = 7aaca80dbeb8dc3677d18b84795985463650d72f2543e0ec709c9e70b8cd7b79 In = b32dec58865ab74614ea982efb93c08d9acb1bb0 Out = 6a12e535dbfddab6d374058d92338e760b1a211451a6c09be9b61ee22f3bb467 In = 4e0cc4f5c6dcf0e2efca1f9f129372e2dcbca57ea6 Out = d2b7717864e9438dd02a4f8bb0203b77e2d3cd8f8ffcf9dc684e63de5ef39f0d In = d16d978dfbaecf2c8a04090f6eebdb421a5a711137a6 Out = 7f497913318defdc60c924b3704b65ada7ca3ba203f23fb918c6fb03d4b0c0da In = 47249c7cb85d8f0242ab240efd164b9c8b0bd3104bba3b Out = 435e276f06ae73aa5d5d6018f58e0f009be351eada47b677c2f7c06455f384e7 In = cf549a383c0ac31eae870c40867eeb94fa1b6f3cac4473f2 Out = cdfd1afa793e48fd0ee5b34dfc53fbcee43e9d2ac21515e4746475453ab3831f In = 9b3fdf8d448680840d6284f2997d3af55ffd85f6f4b33d7f8d Out = 25005d10e84ff97c74a589013be42fb37f68db64bdfc7626efc0dd628077493a In = 6b22fe94be2d0b2528d9847e127eb6c7d6967e7ec8b9660e77cc Out = 157a52b0477639b3bc179667b35c1cdfbb3eef845e4486f0f84a526e940b518c In = d8decafdad377904a2789551135e782e302aed8450a42cfb89600c Out = 3ddecf5bba51643cd77ebde2141c8545f862067b209990d4cb65bfa65f4fa0c0 In = 938fe6afdbf14d1229e03576e532f078898769e20620ae2164f5abfa Out = 9511abd13c756772b852114578ef9b96f9dc7d0f2b8dcde6ea7d1bd14c518890 In = 66eb5e7396f5b451a02f39699da4dbc50538fb10678ec39a5e28baa3c0 Out = 540acf81810a199996a612e885781308802fe460e9c638cc022e17076be8597a In = de98968c8bd9408bd562ac6efbca2b10f5769aacaa01365763e1b2ce8048 Out = 6b2f2547781449d4fa158180a178ef68d7056121bf8a2f2f49891afc24978521 In = 94464e8fafd82f630e6aab9aa339d981db0a372dc5c1efb177305995ae2dc0 Out = ea7952ad759653cd47a18004ac2dbb9cf4a1e7bba8a530cf070570c711a634ea In = c178ce0f720a6d73c6cf1caa905ee724d5ba941c2e2628136e3aad7d853733ba Out = 64537b87892835ff0963ef9ad5145ab4cfce5d303a0cb0415b3b03f9d16e7d6b In = 6ef70a3a21f9f7dc41c553c9b7ef70db82ca6994ac89b3627da4f521f07e1ae263 Out = 0afe03b175a1c9489663d8a6f66d1b24aba5139b996400b8bd3d0e1a79580e4d In = 0c4a931ff7eace5ea7cd8d2a6761940838f30e43c5d1253299abd1bd903fed1e8b36 Out = dc5bebe05c499496a7ebfe04309cae515e3ea57c5d2a5fe2e6801243dd52c93b In = 210f7b00bf8b4337b42450c721c3f781256359d208733846b97c0a4b7b044c38dbb219 Out = 3305c9d28e05288a2d13994d64c88d3506399cd62b2b544213cf3539a8e92e2e In = 3cb8992759e2dc60ebb022bd8ee27f0f98039e6a9fe360373b48c7850ce113a0ff7b2ae5 Out = 3c00bf3e12ade9d2de2756506f809f147c8d6adc22e7bb666e0b1d26469e65a5 In = 22634f6ba7b4fccaa3ba4040b664dbe5a72bf394fb534e49c76ec4cdc223f4969e2d37e899 Out = a87e5c78837d7be0060d8f5eda975489ec961b28d7088f42a70f92414ae17793 In = 6e1dcd796b2015ee6760f98fdb40e668b2cf38b05c91f6a91e83bcc8ac59f816f90a59d64e8e Out = 746bf845c08aa186b5fe1ca35528232c4a491a3a2a32cd23e990bc603f3268ae In = ee0be20320f9d44073281265a6e9fa6b9d252495624b8d016b8ef57e1b4e859d8ad3b50b89416d Out = a3257baf14ca16e1137dc5158703f3b02ebc74fc7677165fe86d4be1f38e2f7c In = 8ae2da242635b6568289bf6bec8a438dbac1f5b4d50a90bb7449bdb92a59378e23452dbcabbbe879 Out = e25c44802c5cf2e9f633e683d37aa8c8db8a0e21c367808121d14d96c8a400b5 In = bdd0252dec5b798ef20e51791a18e8ca234d9bfde632a9e5395337a112dd97cdf068c9f57615424f59 Out = e02c1b197979c44a5a50d05ea4882c16d8205c2e3344265f8fe0e80aed06c065 In = c4c7b6315cb60b0e6cd01ef0b65f6486fdae4b94c6be21465c3a31c416ad2f06dcf3d6eae8eecf84ca7a Out = 2da21867cd6b5402d3caff92a05fddfca90199fd51a94a066af164ce3d36c949 In = b17977aced3a1184b14b0e41a04dd8b513c925ca19211e1abdc6c1b987ac845545fb3b820a083b4f7883c0 Out = f91b016d013ede8d6a2e1efd4c0dd99417da8b0222d787867ca02b0ea2e80e45 In = f65c3aa1d9981a84e49fc86d938f3f756f60e3858d5e1f6957dd4d268e28d68e90ba9a11d7b192d6c37fb30b Out = 3acbebf8eda9d3c99a6b6b666366c391e8200d55fd33ad8680734def1dc7ae85 In = 49abba1fa98f3c4470d5dd4ed36924af4a7ad62f4c2dd13e599238883ed7d0cb95bbaae58b460332e6b7681446 Out = 02bcd9ea4f1aa5276f38e30351a14a072bc5d53a52d04d559a65ca46f1bcb56e In = 275645b5a2514fe65a82efac57e406f224e0259677674f1d133f00a5ee9a6d1a8fed0eadbbff5a825041d2a9715d Out = c70a874d786cd0f3f09fa4dc1bb8f551d45f26d77ad63de1a9fdfb3b7c09c041 In = cd02b32107b9a640fc1bf439ac81a5c27d037c6076e1cfe6ad229638037ac1550e71cf9557c29c2fc6017afd5a8184 Out = 36c73d11d450784eb99af068cd4e1cbc5768c8a2118010aceec6d852dda80d95 In = 5a72e0e1aec82a6541f04883bb463b0c39c22b59431cfb8bfd332117a1afb5832ce5c76a58fcf6c6cb4e3e6f8e1112de Out = 90fc3193552ec71d3315ebbb807913afd4cd2f0833a65e40d011d64de5e66513 In = 43402165911890719f9179f883bbbc2a3be77682e60dd24b356a22621c6d2e3dcdd4cb2ce613b0dfe9f58629ee853e0394 Out = 5c4b6ceac9441defa99b10b805a725d4018b74b3e1f24ad8934fc89b41b8fd9e In = fc56ca9a93982a4669ccaba6e3d184a19de4ce800bb643a360c14572aedb22974f0c966b859d91ad5d713b7ad99935794d22 Out = e21806ce766bbce8b8d1b99bcf162fd154f54692351aec8e6914e1a694bda9ee In = ace6297e50d50a11388118efc88ef97209b11e9dfcb7ad482fc9bf7d8deecc237ad163d920c51f250306d6cedc411386a457c7 Out = f5581403a082bbf5ad7e09bdfccc43bf9683ebc88291d71d9ce885a37e952bd6 In = 3bad18046e9424de24e12944cd992cfba4556f0b2ae88b7bd342be5cff9586092bb66fac69c529040d10dd66aa35c1023d87eb68 Out = faed76ff5a1cd99183b311e502c54e516d70a87050cf8961c8cd46f65c1358cd In = e564c9a1f1aaf8545a259f52c3fd1821ed03c22fd7424a0b2ad629d5d3026ef4f27cbe06f30b991dfa54de2885f192af4dc4ddc46d Out = 811529c600c9d780f796a29a6b3e89f8a12b3f29c36f72b06cca7edc36f48dc0 In = 6043fa6465d69cab45520af5f0fd46c81dbf677531799802629863681cea30ffa3b00836fbf49f87051d92aaeac0ed09bcb9f0755b7b Out = b0fceecdaef6c76d5fc3835b523ce2416f4a9b9bd1f90234445df0f2b689f2f5 In = 2040c538c79237e6f2b8188c6375ec2f610ac2301607b9c23660c3a1e1c3a902cb2950c59aac3af28f984f6369c4debe8623dfa74c967b Out = e33dbdc0acc23fcfad3c759c4333410bd3a40efb1366ade157d2c81d65a0a6c7 In = 00ff6c96b7aa3cf27d036cf20af7031434113252574bda9cf9244d85aef2593d3a7a83bff6be904b75164a1766828042bc3f4f090d98a03d Out = d000eafca34815783bed9b050c6901c97f2e77d4771a0ed724dd8f6ff1448791 In = e8df14936cce118139e690f1662f88cfbc9c333b6dea658c02cb1d959644592842542fd9d8d61a04d4a892128f0ddff7b6502efffbabe5cb0a Out = 3479a9617a3adca35854c08fe987c2fe7ff2b01b04f2d952c107b3f066420551 In = 4ed981a31f70dd6b70c161be1f01fc1bba54d06d9494e7eb194e213d5e0e71e0fddd49cb1f075353da22624cbe4ba871aab32906e45b6fbb691b Out = 9c824a00e068d2fda73f9c2e7798e8d9394f57f94df0edeb132e78e8a379a0cf In = 7802b70c6158bc26d5f157671c3f3d81ab399db552b9f851b72333770348eb1fdb8a085f924095eb9d5ccfd8474b7ba5a61c7d7bcde5a7b44362cf Out = fa9726ccb068c0adb5d20079c35a318b3d951eb43b196c509ab790b7e9202207 In = ff83dcd7c1a488e5a128d5b746284552f1f2c091615d9519f459bc9010ca5e0ac19796c4a3fd7a15032a55a1410737d07855b07f61fbd8f5759e9218 Out = 8bd8d494a41acda4b7cd2994badaecff0f46ba2743458f6c3fdc0226f9492ede In = afd4764cc7d5de16a3cf80c51d0c0d919f18700c7dc9bc4e887d634fe0a3aa94097d590e4123b73f11ccb59e23496a3d53d2bfa908056c11c52c23abfb Out = e9e3b3da648cf230f1973f3814eb81316d2a496826ea39adf4674576f97e1167 In = 6fa6de509719ffbf17759f051453c0ac3cbe13346546bbc17050541074b034af197af06e41142211ee906a476039b3e07d6cb83a76aac6fca8eac307c034 Out = 766630993fbb651fd8d3603e3eebc81931fb1302a46791df259a6e13ca2cba9f In = 93cbb7e47c8859bef939155bea488090283ecf5023d99767c960d86baa333af05aa696fc170fb8bbac1e6473956d96b964580ee6640f0cc57be9598e55fc86 Out = d3212abca1100eb7658c0f916daf2692c57a47b772ee031c4ec6ad28a4a46de9 In = 67e384d209f1bc449fa67da6ce5fbbe84f4610129f2f0b40f7c0caea7ed5cb69be22ffb7541b2077ec1045356d9db4ee7141f7d3f84d324a5d00b33689f0cb78 Out = 9c9160268608ef09fe0bd3927d3dffa0c73499c528943e837be467b50e5c1f1e In = 4bef1a43faacc3e38412c875360606a8115d9197d59f61a85e0b48b433db27695dc962ed75d191c4013979f401cf3a67c472c99000d3a152227db61de313ab5a1c Out = 8703a1f7424c3535f1d4f88c9b03d194893499478969fbb0a5dc2808a069ab8f In = f0be5e961bb55b3a9452a536504f612a3e66aec8160a882e5156eb7278433b7ea21de31e39383d57fcdfb2fb4a8d227a9d6085fb55cad3abb78a225535da0e34efea Out = 2fa180209bf6b4ad13c357d917fabb3e52c101a0cdb3f2299fa0f7f81dfb848e In = 206f1c36ba25aea73398fffc9b65c4637cc1f05a6bbee014dccbd61e3b7aa9423887bbac62152a4bf73a4b7afabe54e08720589464da7985d8e6591ac081d115df2fe6 Out = 558ea7c800b687380cce7e06006e1ebe0b89973f788c4caac5780f22dbf382e8 In = 8cd71434c00663f3bda0205508a4a266548dc69e00ca91fde06d165b40279af92674f75bd8133e5a9eb9a075c9068f68f4b820008a1fb42d89d1d759859e68f8efc6fb60 Out = 085b343b08516f320a9b90fe50440a8bc51ae0850fa38d88724a4d6bd3df1ad4 In = 4cf5bbd91cac61c21102052634e99faedd6cdddcd4426b42b6a372f29a5a5f35f51ce580bb1845a3c7cfcd447d269e8caeb9b320bb731f53fe5c969a65b12f40603a685afe Out = f9dbb88c5bb4415e17dee9222174538eeab371b12d8d572cfdf55b806e3158e4 In = e00e46c96dec5cb36cf4732048376657bcd1eff08ccc05df734168ae5cc07a0ad5f25081c07d098a4b285ec623407b85e53a0d8cd6999d16d3131c188befbfc9ebb10d62daf9 Out = 3571326a1577c400b967ac1c26df2a0dcf5db7070eac262a8071da16afa7c419 In = 981f41a83d8f17f71fc03f915a30cd8ac91d99aa1b49ef5c29fb88c68646b93a588debcd67474b457400c339cca028731df0b599875ab80df6f18b11b0b1c62f2a07b3d8209402 Out = 62aea8760759a996f4d855e99bcd79e9a57ea362522d9b42fd82c12c9294a217 In = 5c589fc54fefc4d6e2249a36583e1992fc6b8a9c070e8e00c45a639af22063e66ae5cdb80238c82db043a5e1f39f65626e6d7be5d6a2d3380fa212f89211200412e5e4315fc04e40 Out = 18deba74e9d93ae7df93c6c316ef201bf5e3a661e68868e14d4f56264f5d858c In = 7c8691e7b2560fe87fcc5e2877f7e3c84d9101eca4818f6322a58986c6cf05627c0d6919ef2edc859f81fa1f33e0cc1f10edf7e52a9c33981af2ff0d720c94ea4d62170b2a4d1224fa Out = 5a5a438b57c1b3ce8756094252362afeaa9fc91cd45b385d16994ec8af49aa6b In = 97359b564b2bc20800ed1e5151b4d2581a0427ce9539d324c3637cfb0e5378dc2cf6d72946e2a3535a2f664ede88ed42a6814c84072b22c43de71e880a77c2d9a05b673bc15a82e3255f Out = be54f2e435f760d5b77c0ae61ef0aa7f5f3366f47819f350dc8a39aff8c73a8f In = a0dfaecd3e307c5ddf9a93603f7e19725a779218734904525b14586ff0ce0425e4efe7e1c06e745c28ed136f6031c4280fd4061d433ef700b6d1bc745064231fecf387015f94f504b6ad8c Out = 60d80f1c703dad5da93db222fb45fb7fa768c8aa2787f4b81f1e00365b8f49e2 In = 568d66d061306c3419a1928ce7edc8e3400c30998f09bdac6f63ff351eb23d362e8dc5927eac805d694ac9563dcd7fb2efa9591c0d827af9f39146f0424873aa8e3963d65734b1713baf0a44 Out = 7a4fe37f296991121792dd7c2c30390725a1eebbf20b766a5a1c3c6c3646d996 In = d65b9f881d1fc7f17d6dd429faca8404e6ce60fba7d89b7fba003c8ef84d8083182979327611fc341291ba80dc70ad3b2f28b6d29b988445e7fdb7c6561f45822ac81dbf677a0b27d961dc6358 Out = 51cc71b6934afcf28fa49942b76323f36cd6a0aecc5a0e49c10994ddcabdbb80 In = 711c88adf13e7a0e694652f2b9a397543f4937fafb4ccca7f1ad1d93cf74e818d0fedfaee099f019014ec9e1edfe9c03fdb11fe6492ad89011bf971a5c674461de15daff1f44b47adad308baa314 Out = 1780e52e306858478290c46b04d8068f078a7f6ad8e3790a68fc40dccfbdadc9 In = f714a27cd2d1bc754f5e4972ab940d366a754e029b6536655d977956a2c53880332424ddf597e6866a22bfca7aa26b7d74bc4c925014c4ed37bfe37245fa42628d1c2ee75dc909edc469ee3452d894 Out = f4afa72f3e489ad473dc247aae353da99fb005b490e2c4e1f5bd16a99732b100 In = fe0c3280422c4ef6c82116e947da89f344d6ff997bf1aec6807e7379a695d0ba20ae31d2666f73bbdbc3a6d6ac2c12dcfb5a79173dfc9cd2e0d6000e3114f2767edec995772c6b47dadc136d500251e5 Out = 89198e2363efd4e0ba7a8a45f690f02712e6f856668517bae118d11e9a9dc7cc In = 02e238461d0a99d49c4cd16f442edf682c39b93114fc3d79f8546a99e5ead02f0cfc45081561da44b5c70eb48340418707fd6b2614580d5c581868ba32f1ee3ac34bf6224845b32ba7f867e34700d45025 Out = abef81b33591eedcac0cf32fb5a91c931f2d719c37801409133552170ce50dbf In = fb7c8cd4031007f8159d5c4c6120dee6777a3ace0a245b56f31e8aae7828dab3cf35c308de1d0d684592ef3a9e55796603a92f68d109f7a3ac1635f7c4d334955614c812753431bb0a0743291a0fc41547f3 Out = 5a67284d39e4f37caa64ca1a54593c35f6d8f3a3ec20d460393a39f6f57c4486 In = 6b2e868c7d0ee1c240d3a67e2fdf36e8e23817c02644a54453d10454da5859d41e833a5285ec63e8ce28aa64a50435a7740eea4b7d5827892678b35993d3f5da7a1c64f533173f3d0fa37e1aebf70827052c26 Out = aecf5dab6fea9ffd1bce2cdfeec0bee9d214a669e8306d5b6688afa8957fc91f In = e5f3ba000c43bb6aca4e0a711a75912a48241cffa5b4b0b17f901f9e5097d94036c205f7a307d008567d05e58ac0dfaf6d971bf9d3d450cf2c7c83f6b328f676e9ab425642f5a5a71e389dc4fa49b6d7e848a09f Out = 182d6e4316f4bc18d7163b1b21462d99f99c6f34d2c00ee771ce54fd6c5018b9 In = 939c61e68af5e2fdb75a2eebb159a85b0c87a126ce22701622f5c5ef517c3ab0ed492b1650a6c862457c685c04732198645b95f84ccb0e726a07ce132827a044dc76b34d3f19a81721f1ea365bc23e2604949bd5e8 Out = 121057b0b9a627be07dc54e7d1b719f0a3df9d20d29a03a38b5df0a51503df93 In = 9eadaf4811a604c65eaa7b1c6e89f2c0ab96bebec25a950ba78aac16d9371ca1e7458acf331e077ef6a735d68474ab22d2389bdf357fb2136c9f40e1e1eb99592c2bbb95d94931016b4d37faa08b1e9bf71bf2d3708a Out = c237194b902e48dca5bd096cb51562079d0cdccb2af8088197676c17b0896be2 In = 71dcca239dced2ac5cc49a9bf9ea69a99be22ba62216716b524db80f337dee5eb7e032869e4adc1497babd1fa82fa8c3cfbd30d2eadfb4c5d40f99f9d194d7182c9cb7d41e8adbdcf2917e086782fdd756e2961c944070 Out = 377d1cffb626735810b613fd31ef9bbb4577cd752521abe3a41afa921e623da0 In = ea130d3236bca7dffb4b9e50e805309a503e7347227aeb9f1bd15c263a98dd65753d2eedaa734b9ad88f41158f32419ca529f3062b910c019f3f239f635fc1116e5ab7b242feb4471ed9168474e501d39d6bae52cc21061a Out = 85c7a52d53f7b41162ea9f1ef0d07c3fb8f0ec621617f88cb3828ebe5388ab3d In = 28f1be1156792af95c6f72e971bf1b64e0127b7653ff1e8c527f698907a27d1544815e38c7745529bc859260832416f2b41cd01e60c506239a7bf7553650bf70d1fe7a2c1220ac122ea1e18db27490447d8545a70bf0ffc8fa Out = b2eb3762a743d252567796692863b55636cb088e75527efd7306a2f6e3a48a85 In = c8400ef09c13e8acc8a72258f5d1d20302c6e43b53250c2f6c38ff15be77e3cac04d04b8421fc8fdff8be5ca71edd108e9287b42dea338bf859100eea376da08a0e695f0dc90b95e467cbd3c2a917a504a5ae01c310ae802c4bd Out = 69966e89b7bc7f39cd85791b92180ff3fed658d8240e393e1e6d7c24b8d0ac95 In = a48950c961438e09f4d054ac66a498e5f1a4f6eabfde9b4bf5776182f0e43bcbce5dd436318f73fa3f92220cee1a0ff07ef132d047a530cbb47e808f90b2cc2a80dc9a1dd1ab2bb274d7a390475a6b8d97dcd4c3e26ffde6e17cf6 Out = 44c00cf622beca0fad08539ea466dcbe4476aef6b277c450ce8282fbc9a49111 In = e543edcff8c094c0b329c8190b31c03fa86f06ace957918728692d783fa824ba4a4e1772afbe2d3f5cba701250d673405d2c38d52c52522c818947bcc0373835b198c4cc80b029d20884ac8c50893c3f565d528a0cb51bf8a197d9d6 Out = 6d5260384f3cefd3758fb900dcba3730d2b23cee03d197abeff01369dc73c180 In = 4e10ab631718aa5f6e69ee2c7e17908ec82cb81667e508f6981f3814790cfd5d112a305c91762c0bd9dd78e93ef3a64c8be77af945b74ff234a0b78f1ed962d0d68041f276d5ea40e8a63f2cab0a4a9ed3526c8c523db7cb776b9825b4 Out = d88e5f3b2d0a698fd943233760a3000a3360d9040e7374b22e39ea58d868102d In = 604d8842855354811cd736d95c7f46d043a194048b64bf6cda22c3e0391113dcc723e881ae2ad8dc5740aa6bda6669ddb96bb71acd10648380693f7b3d862c262553777004bd6852831618519fbb824759f4dd65af1b2a79cc01096d7c8d Out = 8a8ab6cf5c02b9ae8f4c170740eff1592f3eda11d3420ac8b421d93cfbb35db8 In = 628180e14f41ebdfde3b4439de55ee9cd743d41040f3457ef2280370dd659619fa0ce69580c709725b275a6eda8bcb82a8447c20fdf68cba15412f83e2a10079fe9399a3e3fa61975ec0a64041c0ecde59e4844e9f8a608cb22d2576854182 Out = 8d154bf6f9cb72efc0d8b3927a8f690060d1d48bbe5cc72094d2c8b149a75132 In = fc150b1619d5c344d615e86fca1a723f4eeb24fbe21b12facde3615a04744ef54d8a7191a4454357de35df878cb305692278648759681919d1af73c1fb0ff9783678aec838da933db0376e1629fcca3f32913f84bc2ff3ffc3f261d2312f591c Out = 3f626c8bb20a132495bd3022b3fcd0ce0604b91a9d70132dab4099f73dde23d5 In = 6dadbecdd15e5646e3f37a6fe5b328e06113cce3c8cf07285939afba44d117321017902b3a9d2ff51f60d18e1b585dcdf34e49e170ee60fa4d1dc246548d2c1fc38e7983f42769c43d65a28016f3f4d479ebe1cd8fec5d1f886dd21aca5067d94f Out = 9098ea34c40b541b153e80a8bd92da19432b18b7d329760b302f8a54c395dd06 In = 9cc5fd3035b72dc63b8c3c326fd013081e6b8716f526d3fe176b45256d4c37cc3dc8417dff49ada96c702b8fd715c65fc08a17a0a720b9cf1eedfd4922ccde6baba437f782ee33b95371056b0350dad743470c3b663299f16fcfd34f6fc459cd0ee4 Out = b0c04f24bb6d3d4fcbfdf9222d0e886f1eb60a0566a478085f7623a025a5b981 In = f3f063fbcf2d74aa5a02d240c962ed7bb119b3a212bdb41594e28428108e613152ed16e01e451fcf702b0e5a08f82eb12677652b93e05fdee00ae86cf2dc9a1fbf05b93952ec5b8515eacc324fb830e1ec236afd7d073d4b7f7ab1c2e048b99cbfa012 Out = f930d79360b581b1bbfdeac57133a339444f5c44538c921631eabaf058277d32 In = 5dd529a4bd07d70a7a3f1dac74f073b67ab8cadeb23815e23b220832109320e930a4e302fc3c69c9e0281b8f356dbba266dca57d52e8543bf2b527523c71657d47e780faaf5196f63b6e3d46bdd580573a8925684bcd32f6c33aaf78920eac4deac786f3a0f16779d43c0c37d4d1cbbc3ee6d4086590b7fcf6d9260edc13fc41606c7f5595c2e23af3b80fcb4209a3b9ba1c39c568d9eb33d3bc167be0275e41f3fdf287576c1122e00ace6ace241036f552dc081b4fd784a208062767f3d935e9a268f3ae98fc17e25bd17d42cb1a1b38b14637479b82d7aae87f7a381f75058b85680061eeaa0242d3a16a64a5ca50cb61febcb465f415348208dc1d523a9a21cb7a163a1523cc4999c59bfd5b27bef6898cfd2a54362488fe29b5dc3431daf39f269dffb66f5b3cd6c576d494394b0152796471104feeee856a6d3e6e61ae4827f5fd7978979966b12a65b3f909e033e34c575042475aae3f546c0ba8d3fe6a8b6e9f7004a26d0e537acf60319e66d5658d409192274f0f536e1a0b898db39ff41ae9ac0198be7be3401ca4e501c32fffc586faa7f6b75ae940e005ba99b3308a7f44f4188176f68a01b347bd38e189da7b91542abc79d82b5324c3e3ffe86574271911f1667cc77047fe11604da62b1d37c966c2817dce3f2e4f0babc53985db9acecc334eb836bc9964ca7747fc5cf18196fa184eab874d5acaa6baf58ddae65ecdeb8642128b97804d39a92fca667ee260d6d32aeb4a7e5dfc5cb996ceaabefd7c369449720d288321279f0cf88febe18fc39c1e255ef9c14cf450b1e33e8aff4577026bc005982a495c01e66d2061078b891b31410ce70d2438264db4de73ea8f747bb0e4bb0efd2ba076c6136007dabcf0f76b279c70caebeee47229d1a148c1f6a521c677b38530bba6b3d19906e48bc0d9d4bf56bb7f08df31282a613ba045c528c54f81ae49c0743ab58f1185ad5ec06875f281f1b4e5d3b6789fd4697b82a9ada5652028d14494dad43512adbb9eb94d55a66739f2e9921b6970735560e06adcc7f19e49a622e42d19ace2a598b4742f7cc44ebcbf7ce30704858624d7c7cf5c35dc41384fc429dc8bdac996cc06b6b7f3357fa2a6068f2250c65501689fa2d6f70c521e54902e8e32a811a8ddfe4a8dc1df42122cef5f15551c27129cd0a9f1136b18223ef0baec17fe00025503f758eeacdf34dba018881b6d467ffac2ad5693e0dd6d944b949e41c5e0cdbc7c84c083839d313a7f8522aba3f8710bde75ac7e52e726de09854bb8e3f73098d3ba6f874bc531d1f56d8c0ca48610558acb9cddab8076a591559b85428e54736f610a02ee9f5b296b976e465a3883622f75ceb7d2ee856f4dcc38afc8ec61d4b8413cfd5373d8c947cc6e62ab55f3ba363ce914af797ac7a4b1c73e5f5b7e441621aa7e6289d039f2d43767812787e305e896fd2a6b7e32fecef33bee21d34af1caff9003286a02d5776f5dc3f4686706417c782b0ab83ac3e961ad5d87896eb105e1381e9aceab577dbf4c5905bdcea00e44909aa051665ccbbc9c94d5c838be98f9809b2525bcdfadce3d2aa2af9e3a19954a5f73703e2f3caa117a53b731814bee6f621297bed7d04537201266613e2818b062cb3e4ba504d312f9497fe060e8680d5ca94b38a6aecb43229f099e130474c98cf2e31427eae1aaf8fe47cdc43511636f316ab2b40f0968198fc0de2175529dc32f86221bb779de60bb388116fc8e7884f41bb469bba6aeeb2bb5a8d0435a35f0c94ffbea3345b817c87a83bc038a55843887c72d794b1d81bb0d8488353398fc096729fd26ed3f066d345b2013ab005546d5726813a0bec387f3fab11486cecd37f634bb58197b15f28f92a8f39983e1662e3e824f4c9899d68d93b3a8fae04d9b23a28b9170752d9eb2afbe6dfde60edfbab2e3f6f8b3ecf203d6f6b938d5627c17fdd7989a3434bac53ac9477f2fc6fba056f3d04b18a2217e4ce30fe7b5f624facc063640c0148ef2bc314ac668f00009b21ba4eecea5ac267be071b089f0d9f39880330a22b3625fbc5d3e7b9874371c4fc13c88dddbdb22ed56a93b5838e42ae8ac579f61fb7e34c2b7eb45c83ae802b44f5ec24e2ef59b2aae7d2f2ab68dc844f469a885d2299a56a618cdff295be2692bd344288544b8b84eb63507521bf534bf33cc9722adb901928fbb452bd7e5f7bf62b573c70ea221a01cf4f8f4d8d841767bb49ed250b84ae316b6a227a633e571d5be38de9c80ed0a761504840a9af27f0a07a2ca5bbfba0276661f060ef3bbabf3067eb1367ba2f68e3f34eafa62d043a86eacf216f8d7557774c3ae584e02d483364d2823bbcacb2a1b8f0ef059622a1c91c232c8892c45e0889708cb6b41534ef5ad2bad67ecf113501dd833a7309d3017ef72ba9a3e3b7b49a1fcb17300921ceca7a21aa791d01187e6310d73c202aaa9389a3554979d0e60eb73508dc7f8b4c24275b3a540d0eb68f3ffc4e5a1c253eea7927fdebed462747d53f2e21fede020878dc08681596b9a4b2ca1275446f38f4342e0613b493f2e5d86dd998fd966ae7cd08975dcd357c6f69eec5e63f552331492a20597636c3695f259dba0250f132b275598daa67893fd3fedb557363783236b0cf15989b3332d81b0d0d837a3f89c7a6e17023a96aa67f5ec52b6736c2677b3654e0925dace2b1a289fc278ea04d6b21a1bddf779b23caa305d0b13b7c51854f6432f9eaaae99a40b71e350ace0e1b5a2ccf146e854844502ffdb7ee1080f3407f9545ceb7b7e099f6dc528b033c56d4e51c98dac3848aeaa5fb01bb296633ddf98ffc765dfe3302dbcef66bfa68ac165d3ea358d0590cd70a71154f1181c55c847b947df80cf01fc85e974a1e139983179dea75364628a9bfc879068354366082e094423064a6456f13cb81e8bdadcf86c2c4ac6fcc8cd75889938dd96df57e8767726f71a5d4181286f9cfd4c737403d35c85ae76c97e4473cfb219e3f810b0478b5524640e80c6510a8608ce0e489ad7f6c2d2796d8551e5b167e4c39779a8c8ce39728b67096d9495e005b6b24004a08368fbaebdcae405c8bf05dec27a1822c73aa83870c4be1a9911bdaf68448b558bdff1bcc03545fb9b2346dd84fb477cffc19012309a010b9e81f85f373c751e948e7c4d7fafbbf0b2f96d68e2e47efffc34f0c2af717d8f2a987e6e27100b2428df6406001e8f0c96aa4326e61d05d348fd91eff5337bccc7be168540a8958fce3970914d6c0a76ce9f90c0978e241f6b823b420bc643edfc5b8a4c8bec5b870f046a966e7f7157e23f1cddfd20230beb2db562f8141d1851d7a06a0fc5a43371a918bc69410fd65bf1ae2621b949c15265c9f9c40351764f9a2188d419babb7e8e42ac48982b1cc01f10430a42df6627913dac787d262e7d0cd44de3d2e348be1cb20e136e0c50993008dbc0a42d25f31bda251a69e5686496836243d66802b8bb2f89d0aafb9b6f8c5f964cc57b243d6a680cb5aed74e8a9ef46efc0f9110f4d480c589344025c89bdd1eb58f118b8de6af084e364105798ef01a1763a59afacd6e6b45f423152fc4491803e936836bf776c2efe86eb8b9cc3f0e9bbceeca5310c1230dd2ec9329726c2f3fba3434600587e29faca58dd0c2a9f19001b2c686034194e8b6e2c9400a0f0970ec51c5f378a80f676a2dac48d6f66bff1a3ab61b10b567de884eddfbf5f84e9e66d65eadb8a2f14d0a4f3ea972ed26efeecec39a9ee743f73078f7e29bf0a7d1100b29152d3d315c75536b79fd58c76867b5158c149dd13c96a8407e64bebc12d2374bb34040779991815a42dffdf9726c39d379dca0b9b4a226df56b92c346894a3ef0f57756a0e4720348b7fa46216e6a025e75db8a2673d39fdf30000b7dc3e983bb2dca2b3c2807a20dd4717aa5bbb333460ffac345e4d2bc2dba303ef75b85c57233590fabd22d547bf9e1d7a4ad43a286b2a4618a0bb42559808fd813bea376ceacc07e608167ad1b9ec7d7ae919fd2991464cf63570c7dfb299b61836bd73a29007cf1faa45b1e5539a00514272c35d58bb877526530187afbcf55a6f1757209c50af4eab96c2ab160e6ea75dc8d6ef4bf2bf3e7a4b3a7619db84efede22a0f960e701b14f0f44c89b18f2640017c05ef51bcf93942b8d3775d2980b804359606a8da2dec3d90f035eb2a74f507fec8ce41454d6c1fc5c752aaadb5d967c0de7588b52d3b64debea025093984c0a45f6f2b24e21acaa77a312ad73557f1120f6b15c9c2094d26df54c5f21ef316b5f25a751f614b2aa6139c4571a93a8c75506eb7de955fe0b07bd935aeca4cf07bab1889ff7207290cbb1b6341b88b1f2fc908d6bb4d4405c3b9b5db05e797353cb030cd8bbc57ae1f9937ec110b519189a3c0da2993c1a4a9c17221be1adacf41292aab8de842a229d67748a74994cccb061e2cf00fdda5a8bc976ea30d1fa5d23f8f8acb9dd1eb709964dfcb1b5cb73d19ab32d868a0f009d2ad297a686d9f3619e5d10f840b723d0b84194729b23a2705ee55a947126d142a3bbc0cd2cda5b7e1b7ea1f45f81fd753625fe21a9d3dd0f170fd2a533c0510edc98e21f4459f9bbc8a3cc387a0db889b8317639726a88106b7932435259e4742e0078176e0752bd4e82fc5f20c8c960871ab93475463826c4d7d5f94d521ff52078ff3ffa310af51582bec2f431b4ac4b3813ad32f571b4aba25a31955778144c68e403798566f5b6398ffe64d71ecf7d10320e2bf6a94c884f1b86cac861541a56c30c8c630b2188fdec7be3374c4c853970c1d0d853410354b6534e23802712d918b573586c2b367650c60fc0e1960c2a7c72b20914447549a7319007492fbe566198fee41e55270969574b02635e7a69a1ab600740c986a46abc50d210b085551a215f847641e34d72ca158a45e8485d8ca63b618d429feb7d2dd1129b6bf06bbed945b82873e3a91978ffa6fdd5fe9c9a2dc4963e4229854b30c1573db497f0dc3b220d995da0a2d9fe7a171faa159d569c9c13f83acc18715f81fe7c2cd48adec174e33d81c2d110c515291fc725e64e6d12793fbefffb8bf493a6db274ea05306ced7a962a2aa7a67417b72df97fdee29d82479212dd4d7aa86bedf566ec7b57590695182c895635f9f7cbd35f44ab25d5da42913de0af0ebdbc4fd1cad67928859f6ca64bd3858087fbb637cb35337720376e409a9246432f347b8fc831666c99c3e787ae8f9e50c7295ea166dbdea026a2b2e64e7a7ae1a6db5a768a84aaeb3c77ee057f45086d618bac5858bd15679022f6cc8420b4afccbad2d03557ad6d17c56966e37d2b9ffc2988a6c8633e9606c0223b620d5a7646d8cce3f433d6bad2b440f304c06fae4009dbd1de56c3f32f831f7910c8d6febf3e31f9ed9e8f99144c5bf40a953c61d7358b22c41d0a47b473d3ceb7d98e0fddf2e758482240d48596a2b11d85fa8166b582e19f407d593c9827847fc9ec7148fed8482e474f31ce99fe71631711d6988fa6569a4882f370fb03e28f1f56eba969ea13c7942579975e557e07d3e92812cde1c9dabc83dbf8a3502f10633647a83c07003a912a7387eb911e2f41ea3f7f771a818a24e7da7b98f4b4291ef34bec7e1656b0c6c6e9474a989a04ea7de3859339c7d00916b8a2e3d9b903d7f5c01e37ff5e50bc62a17f83543aad5508dbcc2b25e3d4f1783d148be585c516a46de570aa6043fa6465d69cab45520af5f0fd46c81dbf677531799802629863681cea30ffa3b00836fbf49f87051d92aaeac0ed09bcb9f0755b7b131796a447a993d57fe671c06f3e2b8293cfc034749191bc27d00ae916e084c0030c6a1049cf9b4d6547109ab6e6bf28816bbfbf3810ac9afc054d78601e74f070c92605f242fcfaeb0ac96865957d8d70424ae7679105017491ce8e5697f3b4623512aac86a7e851817e44f05b22f5a683ea8d3887b629a985ad55181b3c9b4e23a762855b0e996f556a9791da79b36724623ad23368c0d6f49aaec68dbbd97f7bf99a6217a04d488af600e35db8aca9443019ac02a4b010146948594759905aaadc44db23198e8db0b5035d5b6c3bed81b8bc4e8bf661f573adc458beb23a802ea3f45923e6d79f650c21786a010b946b70953225da70e780bcb53d7a32425075f52b549074b30df68fedccf013763e5ffc36ff76cd4766ca3a7d8ff076327c1f445c55df6fab5a0394cab39410165bddb003eee54b6013ce8b8fb8c7daa5439925f9f587241af41adf4ac4bc83667d6340aeb8f7d1555efc448e5056fbf54761fe968c2e2eac7c8ab3d098dff9e1039f0279c624fb91a8d1e9dbdf2446bd080842b4b21b0bba43f1a71e7874c0009edf9a07af03369f91fdd00acdc64767060aa6d6eff437defade4d671c21826f9fa35bdacc08fef99acebb9da4a37a8db1d78f7f9e303f74f1bf0b4ccc5ccd689698ec55a5acc11a43c2f106ec425c9babfd510155658f36d9026552318ced96141eb02ae475398bfd8914d90d296a0b44fab02eadfaa37f0146e009c4488f7288a33bace0e8b4b9486f9b76afdf2f672d3e1139f06618d81afb0fc5fd060f7874c5036e237dbf4cb504f9721cca1939b565f8c5c53e5bbc86ad4929544c0a3259029be134bad590c3e7b35e0c80b3fd8dd0db54b4f9f896c4cc20a66290fc1ab5da69988d16844fe5766d9cd7798c2d172d3d59181f5c1165e63acf905b51ac0bcaf116b51737b49a3f6cb1063b1e32d1c9935597150296da79dbf77631a760db42c6ce15338c6962a1452d214bc6b95e4471ec9a8198b1a2f598d07c8a69d394d05f314601eef8df5a9b83b112323b0d0c5d609adb6adc4fe805cd2bec156ed8f23ee2cff8dbcd50b9b4372e24cd027ebfba542089157141df87500ccd36ad1836ca550b9edf71774d43ca00fa13da13ad1d59c421053b193ab20b87b44a28c30c95fa915a766fa393aebec208831c7c730ad3ee29d6845687fa522517cc4c79f22665f9b21d22761b7977f9e6b734199fe7451709f5d75a45e4b67d8e39829d6600099d3c40245f432898011b1ccb6b82573fc757efbeb502f5baf98e1e85bdf69767f46f8c0fdfb920a18ffc204ce2d8bf26878a10a4f74da1d2118df7a04c227103b7b26d2f77cc1606ff206e332ff1a38bc017252481646d9e6e04317cd858115f2fab401da82a6d3ac71e5318a36b88f2198589a7f405dd7257877875e325ecfcf4c0c154e1229adf805c7b57ddb4f3dbfc6bbac9cf9065e0769e1925ed0a884f7f894d6fd3632347a341438b4f4c68bbd12034e464a29b8b439eb007668467d9586b60c8cf5a9b25b893482d78c05c1440599492539af2b5373fc984d012002cf7fd97ea658766dc2898f5b8da8f4277b25e364e2d17e000d9c7b238ca31e5acd6a64f5f16582aed8be8d8b7e527b058bfd4a6925177f7f093ed26ada5628cfb8cfc1391526b3bcc4af97d9539182a29b12371e95159aef70e06832e02326a7b8365712bba3f2e1afe4130eb46ef147d4ee104ddbd2b89a690ba5464511002bf4288e488be32863c1e66bf248efb03c5e183ebc9f56bfc61d46f16db2299ea3952ccea22cee3b8b213c054db81fa7c960182a3488aa99bcb319b46ecf72e857c2cb7fe947cc15a1f86e4be7ab03bf3602773b7c3ed52cc4540c561243f4c78ea48c09e583869ced6d05a388caa5deca6ebcd85e6adf622528a83f21b7b7219263f7d55e8922bab6a98877f7bd0cedcec96f6ba0b4d121295674d863d2c4e0a92694491c00ab5646d47f2efd2b40d58a3e185b0bc3b2531607f9879f3d22ea1c15eccee6912657e315723062bd4a7c46f2401067408adf3562bdb59f9fd929335a86cd86e49da7d694eae5ee1a31cc4a106ef27cd261adce904acb29a1f283351aeaacc2a0172d677a6fb568eafdacddbe2b69112240a529b8282f06eb74e26c80a1d5636d9dd1ddef87089ad7b6034924feddf0d72eaf8d03dd4bfe24672d1eb132ae31f5367b821abc464a8765bbd46c6fb6df9a34b34499f386d8f4d34c94d825a1f3ddea139c2495d741a212bbc7bb065ca713599994a1f2475e05c126161b031473d0c18174349a2347d1c3eb6a3c4c3710e9a549c64360f856fc38a5eba253717774c4ad5273549324bc82330414c8afe1c520ab21a9c700898441b05d969d1fc871fa807d094a8d9f0a567bdf6e032de44ed3a8eff8aec7bf43e32fb21f6a862e706ce03f1d047a816348ab41708317df2dc526765b9eb5bfe1260b3364400e701920b6ded70bc392715eab7342d2d79b09fe0e00f81e325307122a288eaa1f581320eba360e6ce9ad9a263bd0d78d3e08b8749d3f7b6a6415db075d9c42d21ac077465d6e01d0561461cbc66f9fb75755b67be3781ee79528a07d48d2f537c359c220ebf7e39cfae5ed39cb82de5242420a65476be4f134e371f308ef7a398bb7b34cda663c1934bc9cfedf9d2bd47b3824df5d7d560dcfd0b016f2243a5de064bb189d2b73dbbfe301895720f0c48eb2b6388a1eea93d27afb47b923be2b4ddb5a22c8ca136ae903bb77e6b0d598e94c0f0f41d33b39c93ca403a2609e18309610e9d1c4933d4c991b38e2bf32c8176ecfd2393ca05620a05ae9625d22ab453f6fdc4cad8bc9570db14affcea0d89585590fc4adb28f854080576d9c146ad801d7889de7659594fc0e2c8241a850e04a3b4678c8fa2c4397a4dc188fbbcd85b7d85d49f4a93882ce926c0ecaa1b78407f6e4c9f0dfd3081038f617bab149cabbf2f8d567df18ad0fde8819cc3582fd591c893cc7ec0a3f34cd23dfaf7d760378a7b9c4b36fcc703a52ef27c8cc39b8b80c9255b0a748558fd1e3d4c078c8ec88773e9c69e3aa88c8902fbd42ee42529f479e894d8a03d78be7b49bb04bb8d265d1e5d0fdd359335506b84ebd043337997e1c5bf11cc351b35f2498d16edc519b584de6d1a75f1c4a372750a9b692f410e08a423dc81d4090d8a250b64a89e6937ae552a7e802b02291db679b7dd7f4a04f76e0962458209ec4cc57d177780dd8aa3ab8c30e0a7b78b7630804b278d5c1fb409b9cba3a7e57b3e122b56dfd33f576bc6dc581dcfab7085c9677fd0bf3f07495f7b3e20ab63616af25c4a6aff55450f906120bd0aa581516a757c5f7fba65bd5797e346f74c46d84e5a1b9f6ce8fd96f065ae4abf6f66e2fcf36a5c3496e119d854e39cf167d48f0f6bf00682bf2608cd2e2a4c58cfc6406529714f459b2264ccfc66aa027eb1971bd8f128aaa4696e1105bd493c8e49748f5fb7c11c91d1a61ad593f9925785f85ce9488c4a5d6ecfa3328fcbd374988560dd673a204095e8aa2893100abcf9bab9e51abbccb3dc336bfdc75985485b7bc2eaa740b9701731643c8e77d073b4e61916923b966e5ca251ae8d7cbad4395e9cd09f5d4fe8ff89305babb74e445f8466c2d596125695253d8c0bbadadedb37d5d579184a71f4f8f6cb1257ebf9a29a87320e53a63230c317e0669e4d2fe90d57425af913d39e879ed5ecdf0e58243264ae63fbbcccd485c7f2c9ad7b8f0ae9095f6c8910d6a63d10c161d8212b8e53e57dfc15bbea2a71350a5a71cdc5e6d2d373d74faa41b42334d798c98b388706f2e902290b55d9924a704171a99b26d09dc8c3d449de6f3ff25fba3ab448b85273389dc014d58aedec6ba73578d772eb4fa4579e5673809b33a0eeb30422c93f50b3f4613d32e58c0445b446a342712cd250bb3737c98e3fdde35dbde39061d571a23094f03391767b448f2b90a4cc9a0c14182756a84231da702edfb958281dbe4d78e195a137b337b1616ca9c52b3ee63796f41ad8447b108f8aa2ee43c81e20fbf5d192447e4c22d45192556c341e48035c28ea203b256988998dea19e6e07df6cfeb50e40f4823f48824fb6392441bbe934a3049d035cca2822815a22d6cbf842db7374991af215a2daa0570ebb845b162e3531caab520266efbd8a542c9ccee37beb03aad89064f69acda5ce880b024f27abb5e72ac4f5c848f99ecd0ff8e7c178721810bdfb91964b3e2ee30a6425e6a97d0dacf23408ced6bc13d7d17eb75f29bf3e452b82200454685f06c32e5a9f3c3f9576a21dbfed017b961f118cd23f3808f2c2b1d294e35ee2b28432a804bb584a19ceaae08fa561ce820d50a1bcc3fc05b213d15b6495b323c605e98fb8dd7652d72f8d2afc7a701b541d1f6bdb901e3c18a31a8b13be09a205e64833eb782eb06a13c96b8aeea4e8a8e8ce39a325f6f2830aede026aebae3febfef43011dda094f15d010bf7488ccecdafd99c7e81eef8dc5dc0911fa5f702ced4f2bbe3110b3f2a041c91eae842e8c7e1e0aae790e79854e55546a135fccfd18d85c67445b47013d8ee30cef3f84244cb01acb3b4e37260f0a60a3ac4450fbad1b53a0da2248d75827fd1ed9036430c15438b2b1469edca23b9c3307a5b2b524a8bfdf650e20018a9d75d8de88553e666af2d97d901715928985bcc7ec589619e0ef87776762fc4f6ffbaf7226cda9b664b7b3f2a3366d4a74bb856f90b93af754713d83c69844110fed273677440f4be215d6a3088350447d8c41612b6b003783c3760cb426556a1dc8b48df23eeb61639bc62138744b1b1496553f24d47264ef74a584b893ccd4ea1cfc0b1044aac15997e6dfab9fca28da68557c058c2e1a0803508e4c7706cc1568521069cbd9d644b8dd40da4c5a182f50b68a56088fa16dde1b8bc8269fca20395b40575b050ab57cfdf76d208743840dfcfc9ec0139571835b0fe458f4498aee6c1d716898e91c32ed55acb2be4588ee9d4538495680c391837d0954a0e4c616290a307b21fbe999100e41598b98ae811be6cb0ac4ddc4674975afc02206623f06892d191cbdbe1dfa6393ab5bb75553fd73bf9aeb270493016c5011f438dfd7893ccfb905a90a1021084c2ecb2c2dd5b65e9e6035d6f4934fd392d093f69f5e357780d159384e3e186eb33a46518884db19d001316824f6894dd0628dca31617fdbe8f8a3f60ae644f9617449d205ffd0380cd47a75162b422da16e5e2e365fdccc70a5626cb0b73b5aef53622826953a3bad705d7838a00f158e5a618d0ec7d0ebb06e1106e00f6fe5b56e1bce5ae38d872a6b66dc1cf34477ef9d44713b28009c20993c5f098d573c4c1ad33f13792ebd0c0c332b23a386d74dcd83754bfec07029dd40cfbd8f85c12be024e4f0b4b24fdaf92eeffd2f4ab631618b03a1cab4ea6490caf34ca48016cd548d6a73249cb21fb8d684fa05048732dfe7a6dd0a326d496a3744575aba9fb8fe794a0b57628632a1b6a4baa358ecbabf15c96e3bed9b40a0124d6e10a9ee773474de39bb883ecc6a3ba9bfa89c3941858205d5ee2ae702f8e878e174e26570ad1cc18ecf923e4578f21e6983630f5fa9d8c6948f9ec2d8db364161e5d8a73daebd8e6b1205172634667d48a221d17db276963a9eadc16aad68415fe2112656dfe38f5f11555be7430540eda37d121425e7ef2899dc6501061b034c08105524b73b5eeb4c077f111b5b03c905b963cb8aa95bff1faf20647baae1b6b64ad65fab017790209ff33c33d4206b278b290c4737471e8e9a75ed54b467107b450c3041f263de4d834ab1030d3124a756e44ee21e4b177522e80447a42df9d583797f127a9e361155f8283f62b0b5f3a1281be1cad27a51dcf951cb1690c3338aa07472f6a1282a8c8dfa1f71297faafe66ebdcd977a7a32d2c5e35782a1d43cf03b90a12f734e79b7ebf49c505e22bc3234729a6a53fe797f3723d35645854c535c53e4c1aecd7074ce034bac09df493dfa65eced593adb1e14638fada1505019921960e86a077646af566df040393e50e91f2ce935353ef6832cf24e5c3c308b04697d6b4f057177b6766be2aa3983b32927c0278ef78c50ad0564031f51d4f1dbcba31406ce4b4d0deaab4bf0e600aee105126c0d89ab74ba764d92929824933ec73aa9376aea11d93a97f2ba499e89394288835af285aad10716c45c1809b856e6aaf38ae2380a45ef96a1af68438b5a658c331c3a003a1a41256126da69aa4baf5bbaa53d1b8276900f1e774dd8fd6cf68543fb6a066bbeabe33197e42eaf44abb6c633837dbf97a56c32bb004627967edb7ca1897e87e5ceb8fb58403e10696021dedabc450aceb614a5238773510184f5a6b39f4fd4b6300d8910f68315e35805cc42f15bab434c6f3f56ec49c3d5903d89dcb5639b5a5b48a1680ce305da1bcb56142aa7ea20eee5c8fd37afc4392a1aecc2d1a123f9d7d30c088c482a752fd945f86d100f8a25de07bf6e8c9e55dbf4980dfef1b6b92a1492977d99cadd1e996095c48161ab78c2c5459bca97522a345666413b9ac5de75fabee8be2e3a7071719436df29ab6ff9ca36c550f858a040ec75a46718437b5c0e24d49e9eb3abcb3e9ccb13b0b292ebde3bf506098ec38122e12e5e785c8733947249236170590e91568c053be76a01c9fc32d4111d1e5fc252e70602378c61554f5034c19a01a2306a809d15727ea1522084a25a2d36439272d848fefd114e1964efb904592cefe37fb0c4857c56344350f3582ae595935ce6080db3d59f62a858309b73d4615d743d2260d22d7b23623388deca6dc2b9e6597f3b6ae8bd05c9d41bc056342854a94ee05a45ac74d578724a1c82ee451bf97146bb6b5df39f4680b711f5a0093c4c57f29b2622c9b14cb442fb9990a7235cd66476fe5dc998e5030c7697418d7d23035e0abdb60321a8a27661597a6f37d931e1536b10c8586f0622d8863f3b7ff7f72e8e5191a98b52e3f03708d525c1362ac639f99d7747ab30021d08c19caa8fde6a112bda43591320b866efc851283c681a12f12d5ece632ab32f66ef3667b55e187a94ba5af2b301d4d5567c7cd4b394e5c59be706535d9b3df4e8f2941c2f1f42b1d25975befa2d4e6b84182d2d6355303a3ff4f640622ca956d5f23b33c6caef9d2dde1c25b04d2e12c3c5ed9b13540259257bb6fb3a85fe3c7716b51242072828ef71d78f9c087ab159ab43868d39630a95a5cfeead4d448d148788236b7df4395e3c2f6487073c2f8ff1b75697ab5b35d69ac87f832c8333f56d3fcc09d55bb9c464ab0c39f27b76adc0d173fa52f3c23181291883ccc41562ef5f77e3b7658e6714d4f07a70406dfb3f1a457ed73299ee827b2077d20e1ba235728bc2c91ba190723076122992fcc1971935eae221a255c745ff25e96a2dff6800706eb684da86a64907c8c6790b46ef56a9081ac6c6ad750f1c55b7df33bfb08f8daf24a82193d9a70c65effd82d3705a0a9e282beb40b762e1d1e475152b34a94c4dbc905ffd33d0ebb24b2749b041acc175b358fa54b3c4b5601934bb8b1dd5140f25437a0ddb4e0e7483fe49258cd534556453dc3291c000c9fe250e27929c4ebe07c95c0bfaa9db763e8a687a765bcd05e32677227adb2bd53a4ff446bc8460220c2beb3fb767bc7f25d48ff629c8f34fd7d9b56b969f9c4c76bb5632c317b303da7011f03b121856e0e3a7e2cda30df9e9727d570c93bcf6596f1d31ceddaf2919a0b568ad3156c416c09686897585ccc0fbb62c053ff39a8c752f8c055dbc5c72c4bfed364de0916f71462a86c5c290057b4a33a82caa02b6d5768b911f43638ce316c8feed1d8595009d16ec1b2c0d5ffb20b41ee147f48095d9759aabaa071105a4412c9975672d748591e2ff2b0a778220f78ee6343991bf3f94478a5b10a632509fe9da5001e2d6e5e590fa2751f418324321c4d799935a922ec143bc46f573022c5c361619592da4581f9388a87fc53ee2fe029adb2b6fb98c305e3770a6cfa22eae372f783d81ac33b753b6d8c0922c1a4f28e4c903059cf6bb633358614f19ee066504e634dbe4be7fc11aa95e86e43439bf1c29c32423b38adb18c4cdfa4db48d47fb2be6423440a0651ae202aa4f77e64eacc413d4360dc64e4d7d92d827c86a657d0efdbe840342c71f4d5304532d7e5dfb62991ebd4a97423c4b59f18f71c647f3581e57bc4d8b7092b0fa9fd99c287471cb0009a0b324414cf5ca4e6ef8c976c3d1f316c567a6e7d9d49e80ca0e0d1c76c6ee9ec79096d2e5458cf6aaa59a79574124028599b9b45e81e8b10cc955dc721c0ce41a29147e6f0148f12dc062d815705923e52aed60877e7f398916273dcd9501e382c5c7cb52f2a548dd91481c67263982cd646972be950d20273cabc6eff975a3e5aed743f7e04c02a46075ccb42a6c26268d56726a8c376ed0850bff4110122d2d2a6b6ec493e4276974117063459b18d6eedbe8f22ca72c6b376c7029a27d884082abd322d216c014164390de3f6e5ec7cf215dc03d0562e09bf9a2107661bc08fec0fa7a668ad38c8e33b58ce08c02df784f593b87f81617f9d71c5f5564d26be5d26b3218e76bbb240a66d5ef9e0b08308e62cbd12952f79931667c072ed1538108afb4aed58d8820f02c21364b8229400602d8e5401d6ac22d09d15468c1a7188b4d66f0fe43dbc90c8ed87b3c6e2af0dec0ca89e48058bdf38cc404baaa4ff383cdb2a807949c688714628718d7f2883f240a86bd81a7d3ac77bfdecb95325a17b8ff9c9b89b3458846282288c66b5050b7fea4742b4049805329ab44893a946f94b495602809a838ad901334417c903a000faab1830b6a96a66a33cc8f4eebb4ec3b5bfe7b84d9bfd00324c3530d8f2488a5621b93f07d17fbea3e0cae56a50e45fbb61e8a0d1f4437ea1bde01079637d529925b62d8c92ad71094acee3b0ba4295c6e685b8dc4ef6babc12c5550ed9a71010319f8a997f8c446fc5357e3659f1fc64a83f9ea0ee9f3b0de5656d1dc76e4977dfc5e4d2fa949f440a9f237fb26b0a11418690e465a575f3a030c72abf3b452c8ac9baad964ef802658c61f1462625592ceb4dfb36a20229cdc801ca1386b99abd2b7aadd513c537705db84fa7bc04a8d4ee3479f3fd560ce88b9b5076e90d6ef16bb348299bad5fa5a3a4cf3984fe9cc3ffe2d5004fe8096b0bf2625bcac705c1fae2f1264f16e79ffea6148e19998194a0b780fdf24ecbdfc9b58434b46cfba969885d3d96887ba9cf3a9417f25c03a17141224f8ce0b0b135432a943e65bd122811d0e21a78687d85e0e259a7bcaf84d20e2d7788445479ef29b9fcb157c696c72df0a6336d5a65b32773e59241c1b9438d07087ce023b447e7d6c0b599a491b72b311c89edadfce77cbd2e5a7206b9663c4364c35aaadaeffbf592c3d1d3ad88a81697866fffcd936f42a668c3db0f8a9a672f040a566847d49ae56466d044bc1315b9a16abc32376d98e035cdab165125e6d9a785c2e6d0103b3b0fef26f1b1fab2f573645fe553f6245e49e613783a7d56c736335cc1191d5af63ec1443f1acd72dd64f37731699779932da390afa6ff1baa38b990a1938a7ec96983c4774719e9d40e8e8eb0f8d00d01598caf273729b9e5178f1ae2dfb61b0728bd0444d75e6c6bc8ac02de822e533b4617cb796b9bc5fa6b0a381f4e4eb441f4c3a0223c099f173bc270348610e0a38bcb7200a4b3a46c9bd194b17fa2df0c463e0499f5b9d668c068533d750649dc832e3f67831ff9be227b9d43d450ffb8a592ce1694ddc6d30f042863efacd338d4a68018771f1a61b74ede30fce7aaf98b58491289e3c4e8703c6c425643216af8cae09e015faae9a2e1c42359c545217ff52228457a750b8c67ab533987c8c55801ed62a2401fd87dcadb756b7872d2ec0fd5d277f04bcecc2c420119d91dea7af1e2f0ea7edd90b070a0b1a28f988067eed07b61e3bda4a7d0dcf677b5b54cea017de34a5a88b4e369a062bf694abc6c48aebdc3d33f2fb81be88dc3ac135f2db72a94326195a77f1c56f2e293edd97173cd03fe2d64c26563d1418e3aacb3ae99559e4332890aec1f310cecae167a1016b7d87180b30f482f43bc47e005ccf51eab6bed2bd741d2c8cafb1e064910b097fbb5de4bae58d8f49c48811aa31d99bd7877a0ec04de9bcf8157f73afa3feb8e0526950cbb41805a6790ba690927f50c696bfec19643df9a00ae18caae5a194f60a526327e5bd6a7220f6449ac6e9f71ea93676b1013f6aea557e313d9f1d272aabc025b4c0a6481582f0f4b0174018478986b36e6b17973fc0006d501899f9e2fc5d9f5b8cf826f767a2bdbacbac3ba9fe58ab39ecee0808110c45cb993e9087c6ced80593de8d8097b3a7a02b54e9accf5467fbcaec46ab114dc3966a337682d1bed8981b7e0418d9ccba4a7f61a9b8c621ee9a4e38d8928868ee99d3a13339e5d3a8fe6d001327f695ffa00ffa0435a9684800c0fb46233e08cebd1cb04d16cab54f1dd18d4215b7b57d8b2248818b41d07e13685c19c8fad36ce88c874e80470dd5df8e4d1a4ae1d53cf10273a822560297bd8d84d8e88671cf036c4fbedf2683432aee67222e3f9c45bcf5a20162b0a59be4799a0beaa88bfff7042f239a2dbea0e83703e22998b39fd244fd15b41662937272c73a3829c905aa9c50071b2567f400b24be3a4b3c1521d37ad6b7e51e1864ec133ee39d0d2e8067cdaf1c9d525485aa765ac05596f678315da8b292ac97c60ae05ae55674fb0f2ecf46a0c07a1a3de5e79c6b65265e5ee28abfe1e66c37d90806603f4b4e7665533c6f94c81830d741eb0b71d664ad445b6494bc4d07692c6817d747e814311199a7926f10c728e04313109a45dc73d7008dcfa822f8bc2eaf773895b940ab9256935796370162f76dd2543b2fe832756668b94c24aa916e42b6fcaf4b5e56661e8217b0b7518f7b26bb4eeae12279ae1177ea0ebea79949c659ac0afae7c21b55e66b34fe320efa023059102615a9ef865dea665d7a246fbed1bf2f54676f109152ba99881d51d294c41b415b3c53c8396d32e97d9cd34e70a1be82f447cdf455399e64f18e08b332f8fe04fd00f7b6bf384c1ebb8a2654905c22bc37135f25161d8f1da70e841a715189b1880e16496c41ae6c83bc8e10a2637421b954a3215870f52a35196456e440470d88ae3fded51bc26962ce8b010b5a3b59d7862a77a0c6792108392a16e057ae4f7b7bc5058e19308be51a9db45fa2d0db3e1265a663a07388bcd835d919fa281ddcf1565c0bec714a672b468903dfed1c4993d52c25717cc7bf9127fbe5ca5cef39a95420b2e7fd2b759b062d8c53d893769519777acc1d748cde611dd82ab539fdfe5f1237ae3cb59cd46ce07db13be761707326c812be05912a81ad55adb994a68ac7aeeea1c86f5951eb604c7a8f6e86b092a881e7d6f188fffa3902c5e275dfb93e356c5528bf17adf21b7d123bcf52fff87b5cae00cec0e94b3f5405c853e6142364255ac63b74432180841ad9505299052dace7c403d550e52ecddfc3c5762607b99e05395adbbbea2df5e6d0b80226592de727892742e16885d4c66d30fc595b845af6fa93da62cc724718ca5cfe3264fabfefc8bf75f545e30d6c3d2cd548bf72d0a2728cecf238fbfc231ec58317a9128ba32b12fb06fdb4dc13bc2fbd5e73f3938a399c7fc4c039899856684d709613dee408f84eb10089d55f52a0011549951830c8492f64f2a983eb09dbb9b7cc6d2e14eaa5fd6deeb06dc1a9244d0780b5d318a719685d30da5f8d91966477bc9cfdc858c263b828f719cd1822fd9fba0458b44e93b7080b2a8112860eba1ad711c270cbc43e0a3f9c7de438329f6865df1d96373e981ff238acfc6fcb472bbc6a20a0cc21c8dea33eeea971c9aedc14c4a630e98087ef868317bdb7527814cd047cdad271b0cfe44d008f6d6ea87537436706edf00301287875c8e51ae980998f4b71672a624893454808838818ce5dd9e4aabd03a5ff68a73bc081ab07d9a259211702b279c300b619974cac7c41e906b37ecf31cd34c78dce1715795f9a67f0723e2da053d9dd2e19de31425f7a794838059d10f53bb5aac14f091c4d4d5af3d359508a8cf7891bbd2fc9f01ec27f1d06d1bf17ca9eb37ca9dad4fa7d6d1bc1a8fb13c781a684ed781e8f2c46c47b039455adbc99b85171ec4d119a5c73fae88795dffdde516131df1ce95d73fafd8a5523d1860f2310390d18477266eca8e6e3ac1d83ffa2ae7756cd711a02d0671fedaed2fa7759601080bedf292941863b31b064f061f4bd3c7382bed89fef4842b2692a808ee5d1c6ebc35115201d135416454ec9a1d21ddfb9ef1b1f9792317147e530ce9232d59aa2a835dcc7d9e0cff5dd23863bb5510f9e652e658673835a12958e2b4deafc2a49d005d69d027f1d54da9bacac38f71a95875130d90dee3ba71cab2d0e58b5e455fd49991c113ebab7e00fa35fb760af33c83c082bcbb2b479cd105a500683573b72699ad1a0a03693600810d2db3e2c0d9a3751eb3771430f394619bf9ee5017ec1ee623a1b640f8bed1d6bb1fee01f678febb493cbba65dbe3c511a97c6b61a47e6075d1fbcaa3e5e9a82a59ace707f61bb196b212feab645f05a8aa1986f6210a384c15bc749245d840b3565fb3641dc0318ec287ae724cfd90653e00b84d98f80e6b91f7d269205b6fbd24a1e5b2631fe3e351a44a68da61edcdd1cc8fc660ba3b3ac318648719c58d9e30fdfe815a7d316acbe372ddb10e964911c77dff0ce3476025a8bb7a76b942ed27de5e4f587ab25badef986f4565f27d5aabf36611e5cb42262347c1eba9081065cd957b019adf5c74032b9c2c0aaac128c4808a04442f77611289ebcd1745ae77462492da5020d3cad8bcc2b95f27bb18bbb5d958810c6652f10256bf76941dd8c29c35473d1f57fedabc9191f5e1d186fc03d2831ebaa5783931a127597bf506ed5cc0dcb4336fac83cb773a41719b100feb14189fd2ab4d65a849993255ba8e00f6d40f480571406e39f216d45f7e3061ec0c8d66ecee5f00c6be7993b9e4dab7fadd537afe0346e4a880ac20e401548c773a561661e509952d7e6cf030fa897cc94b4dcf859c4ca197a18ea9d7bb18fa2d1c0720ca35e99d4d17d7da2361f6b9f2ac62b844b2be0f87e322f18301ea357e2015088e477b7396094ea439b1bf19f78f16b7b3ed1788d9a40d7a8e8c44c8dae5145036904bc2a8d145f0cc705ef75851ee605b81e5c83d82b2b74290b52ec3e9697a5bb6b714e5fe3242541432ec85936e248437a538040d973a57e5b7c1e99ba8f9561169b4edeea81b7913f7641fd1fa86f664d242cd933f7626c1c93c8c7a375fce36b05d11211beea405f8e8878c380a0aaff9831ab21fed47db66095d13b9101cad47680044122e5d50d4044d208b10395f87734be8cd2223891a82abe682acd9db8b503bb60f6d1d8b0521d14d885c2b1a089e01b5ab9752515363296148a87e47f8b013f5782d5d1af8dbd451a4202866095dac975fcf5cdabd1536126f7582890c022990f0e1a4974b9c96db631ee9a9e65cdd0c3e3c9b7b940352886ba68ef551c0fd06fe2c8c8669eec94939aab78c3bf5f392eb51a6ba94c81f31c1bdec4356770ec5e4606d4ed03ccc39bc564a5386c380b9dbc0f72e1bddfc8d061e22c98 Out = 0b9e7cd4ed382cf5ba14f90aaccc61f88a82f9fd628e58b8441f28f8236ec511 [SHA-3(384)] In = Out = 0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004 In = 80 Out = 7541384852e10ff10d5fb6a7213a4a6c15ccc86d8bc1068ac04f69277142944f4ee50d91fdc56553db06b2f5039c8ab7 In = fb52 Out = d73a9d0e7f1802352ea54f3e062d3910577bf87edda48101de92a3de957e698b836085f5f10cab1de19fd0c906e48385 In = 6ab7d6 Out = ea12d6d32d69ad2154a57e0e1be481a45add739ee7dd6e2a27e544b6c8b5ad122654bbf95134d567987156295d5e57db In = 11587dcb Out = cb6e6ce4a266d438ddd52867f2e183021be50223c7d57f8fdcaa18093a9d0126607df026c025bff40bc314af43fd8a08 In = 4d7fc6cae6 Out = e570d463a010c71b78acd7f9790c78ce946e00cc54dae82bfc3833a10f0d8d35b03cbb4aa2f9ba4b27498807a397cd47 In = 5a6659e9f0e7 Out = 21b1f3f63b907f968821185a7fe30b16d47e1d6ee5b9c80be68947854de7a8ef4a03a6b2e4ec96abdd4fa29ab9796f28 In = 17510eca2fe11b Out = 35fba6958b6c68eae8f2b5f5bdf5ebcc565252bc70f983548c2dfd5406f111a0a95b1bb9a639988c8d65da912d2c3ea2 In = c44a2c58c84c393a Out = 60ad40f964d0edcf19281e415f7389968275ff613199a069c916a0ff7ef65503b740683162a622b913d43a46559e913c In = a36e5a59043b6333d7 Out = bd045661663436d07720ff3c8b6f922066dfe244456a56ca46dfb3f7e271116d932107c7b04cc7c60173e08d0c2e107c In = c0920f2bd1e2d302259b Out = 3d1584220409f88d38409a29ecaebb490ef884b5acba2c7eaf23914bab7f5f0fc97ee1e6336f88dfd4d0a06e902ccd25 In = 70ae731af5e0d92d264ec9 Out = 563359fd93fe09f3fe49fcf5f17e7f92aab589cdec3e55e4c3715e7775814bbbfb8c4c732e28d3b6e6404860812dc6e9 In = 69c74a9b0db538eeff64d93d Out = 88c66389ca2c320a39022aa441fa884fbc6ed2d3cc9ac475372d947d4960579a64e061a297d1831d3524f98d8094404b In = a4a9327be21b9277e08c40abc7 Out = 751f5da5ff9e2460c99348070d5068d8a3d7ffcec7fd0e6f68f6cd4a2ef4226df8d9b4613c3b0d10a168eaf54eabe01a In = cc4764d3e295097298f2af8882f6 Out = 10f287f256643ad0dfb5955dd34587882e445cd5ae8da337e7c170fc0c1e48a03fb7a54ec71335113dbdccccc944da41 In = 5a23ad0ce89e0fb1df4a95bb2488f0 Out = 23840671e7570a248cf3579c7c8810b5fcc35b975a3a43b506cc67faefa6dbe1c945abc09a903e199f759dcbc7f2c4d0 In = 65b27f6c5578a4d5d9f6519c554c3097 Out = dd734f4987fe1a71455cf9fb1ee8986882c82448827a7880fc90d2043c33b5cbc0ed58b8529e4c6bc3a7288829e0a40d In = a74847930a03abeea473e1f3dc30b88815 Out = dba6f929fe55f9d66c5f67c0af3b82f17bcf58b36752f3165c16083fea8fd478ee6903f27f820ad2dd9950afb48c6700 In = 6efaf78ed4d293927eef2c3a71930e6e887a Out = 8218498ab01b63041c2ba0709e3309496124ddf0904543a9e0d9d096a750dda97f7a02208af3d8c618d4be7c2bb2a288 In = fd039eb6e4657388b947ec01e737efbbad47da Out = c5b3130ef8dbc580e1103fecae69c9a882d9ebf5a3def5938b07f843452a09c9f72f0dbca91d33b021cf6aa6fe60d2ed In = 9c694943389bdc4e05ad7c2f63ceac2820e1d2d7 Out = f692c025c5c5f3d1275213c1df9bf9eb6d2188eda90ab5bffe631f1dbf70ebd628caee88b7d149e1ac4e262873979afe In = 0fb18357b018b9bbb2cbb4cac50bc85609c92b8e7f Out = d164306c99e3798790f0923fe92dbf2f96c3907127dacaa467c766ac75788062589272cb7690b8af2030dd8bd61a3df2 In = 26cb40a460e2e727aeb867e0140d0f34790110deb5d7 Out = af2a42a4c67c3226c55b89605b0dee27e796c2792115f6097203db5aed89e35f563a8246d399fde00c2a5b97ed5a5e17 In = 6690a3a0373c829facc56f824382f4feed6eb184642b4f Out = 84e1b68bc9e2daefc19b567dec911ef46f5f37a74fdbbb6155e7e646f2735df2ac44e239689eb5b536465dc571e55cb2 In = 7d80b160c4b536a3beb79980599344047c5f82a1dfc3eed4 Out = 041cc5861ba334563c61d4ef9710d4896c311c92edbe0d7cd53e803bf2f4eb6057235570770ce87c5520d7ec14198722 In = 02128283ffc0cfe254ac8f542be3f05fbe4e855dd22ae98a81 Out = 3840981a766d725f83d334e8982965033a5fbb5107d94ffef33b1f700cd46348091a49f6620c37ae3ef5b20513494826 In = 27911dd0a6843ccae965d876aa1916f1dcd71e518f7f2197152e Out = f59f8428555984d1526cded8129c649fb1b683d35cec7c5e1209441a6a9e7c17f0784151b5ab8a8c492b402a3acb98c4 In = d9378bb66e8c8dee556d691cbc9fdddd6333ca5d50668862c3c57d Out = 994532d1a557e990b1cc9e0395a2ad8b05619ca322db9da3c4ed2ee194c051d04582fde72dd2b8f674cf6ec958db75da In = ae1828047c5f82a7b9712f3399832124b892f2f7aea51c8fe3536cd6 Out = d51111f8bffb44d81ad19683198f29d2033144d3cd856c749cac5b9cae0e712f500f8d0ef813f38e305ce175a7d6162c In = 7dd2d76fa054cf461e132e9ef914acdc53080a508cdc5368ab8c6224ff Out = 6c0b3395e4c86518ab0a06267320ee9ec95e50385b7a2527ddaa1bd0ead262c56122d4f4eb08b0ae22b3ee7e6f44dd18 In = 6fd72888a021f36e550967cb5605b55b78657c9272d93c3ded340d67da6f Out = 0551583a5b4007401c77ef4382fd8e245c9cf12e976c9766af6b7ae3c7e07a82b3079f903b083d5ec85cb94e46a85ac0 In = d500eb9546553619cdc31e0848c502db92d547efef3ae5eeaa22258afcf0a9 Out = 5edde2f94f8695f277ec05efcc00761fafd272200aed0e63d221c2b6c65b4972a6526f9a1f2e6ace0e81938f043fe877 In = 6189597e0198a18c65fa0bdd0797f13037c75c4058b7d3454c0f71bd2dd13b6c Out = 110630ca7631b7620e6bee6ed6e929098965571936c34829484983eba9532b8175528c228c57439453f027a4f7c83ca3 In = 243b941d748541af303f8e9d2c371cd03e437d62a9df485ddc176dc65da8c7da00 Out = 5884201f7a555ea3c5deeb019fd9e8c161e1b89756045e475b141ec5135ce5a41c93e5e1f79534d36fd8345ba434da43 In = 2dc3d789582c1a806c3b491d5972ef8f1733f1f5e02866dc9de2a8029ec0ab608d13 Out = 05a3903b519cdf679120c7ccb4ef178b58e4502fcd461360988fa06669294851e629d9dd3e77ffb73d24599d5d3edd36 In = e5b3f6962fe57230780b3d55b29effe0dfebde2c81ba97d4512ecdbd33eca1576a7f82 Out = 7ac2776afb74f55bbc4f6eccf825ee13ac7445fb54974e6c24ebc0f03fdcd8530199a61106a31b4279e02201ee0f54fd In = da03486aa3cebbd6502e9f5a6f0f835e973a581befcc1aadefe7b3696ba71c70cd58c584 Out = 02c44ceec0bb7dc0f664ebe44230192b5b0bb646bb944d23fa1ff3586dc0523fa9d7f0dd6df5449ab9edd9a1096b07dc In = 3c686d321ba66185cdca83ba9f41984fa61b826ef56b136e13f1239dadf6e03d877866ccb8 Out = ad624edd9f2c3a32b56c53d9e813c01d66bcfe424c4a96907d52ac1ddd68370ec86dac67504a90e8a8e75502e01081d2 In = 4dcff99fac33840f6532547fb69b456902d6718fd5d4538e23462db6d00da61975f2b8e26298 Out = cf37dd27997c1bb7e6dc405170066e74c6ce517c029ed8dce126d025da74e0b8e86da567e8d7d8d5b5d3e2a546df7489 In = 2799f672328834d7eaef9439795d35ce93c9094f58ded9f17c968a97a50a9e461489fed988e7f6 Out = 85cfc23c97cb13910b808e7033809a45aa0b7f7138de618c2ca622c8b813c988e264af3b96c7925dcbd1d2761757d800 In = c7e947507822f28a562745a8fe6fed6cb47d73145804c894954e21245cde04fa9155a35904926aca Out = 8bddf3baebbc5b04fe0b0a9c3c2b730abe918ce4892d2843c613ee96da0228512f0d1307c7d1a8922e79a92e957dd18e In = 6c497bf6ff69cb39e3faa349212b8b6691ca237905ac0099c450b6d33abf362bedb65bdeb307bfea23 Out = 3639fab6191b35246278522cfacee0cd5b15580a26c505ae3c46b4b1c2572016b48f1b012bbbedec47916950fbb33a1d In = d15936f3b0c9018271812b4c81453c4457c7edd110bcea7f5735d6f5882d8f27155eb4cc285a65138ad6 Out = 0293eeef0aa3392c93d9c6ca89c08b317622572d4de2286a4b9ae6c2f9c9e0e64ee6c483d4f10859077e3c6868430214 In = df18139f34b8904ef0681c1b7a3c86653e44b2535d6cecd1a2a17cd5b9357be79b85e5e04dd9eff2ca8b9a Out = db9e171d6e3336631c9ceec6b4d732ce62b015939269fb69fae7d22725500e8a2fc9f1459cf0a31fb9d16d7c44583f52 In = 0459dcbc149333ea2f937b779a5f3728148449a9aea3662cdd2cc653ce6a2050f9c0d54bf9326c039b263eb9 Out = 464ba409fbb45e985f84ee24662eb7c042c3c2ad9649f1ac4a8b2be9c07d37ed2e4284362057493f6a7e52c356b05bc5 In = eb3f7002c8352270340b8da8643622e5f7e32cdb208a0dec06c6cb9e6b64cc4d8cb9de1d49397b3386464a25d1 Out = a26bd76ce42d818dbec462d8fe7cdd957e6b84ae8750fb5e1c9c76bc6000e23737e073a59b4600e5056524edc667909d In = 47e3e3d8c68ac9d9f4b3759d8c7d9dd901e35b096ee4c8b6cbe0cdf467463630926c08289abe153bfa1bcde3cd7c Out = b504ef475a568f9caba8352a0b2d243acdf3d2b41d8890a6fb3abb8aa28a29e0c7527d20e2d79b25b400ec27c314db72 In = 838d9c181c5ab59592723bd69360e0d7fd15232beada7591ea899ac78ffd53a32fc73a5fe522ed35d92a6e2bc148ca Out = 53e99e1158d59032ffe4b5ea304c7d2f7a61b6b2a96ac97832ca26013549fe3f7dcdf926bd74ceabe4f1ff172daed6e6 In = a90d2aa5b241e1ca9dab5b6dc05c3e2c93fc5a2210a6315d60f9b791b36b560d70e135ef8e7dba9441b74e53dab0606b Out = 4a16881ce156f45fdfdb45088e3f23be1b4c5a7a6a35315d36c51c75f275733319aca185d4ab33130ffe45f751f1bbc5 In = 8c29345d3a091a5d5d71ab8f5a068a5711f7ba00b1830d5ed0bcdfb1bb8b03cd0af5fe78789c7314f289df7eee288735fe Out = e27b39a96255ff69c45285fca6edaaa3954ce32c1e3d9b1f60c1b6676594bb45caf0889fc11daf93a1b60746229689dd In = 32876feefe9915a32399083472e3c3805ef261800b25582aa7c36395fd3ec05d47b49c4944bbcc2b8b5ebd081f63ae7943d0 Out = f96433cdb69a607433ea2eb77d87d3328867dc4076b67ccf17f50f9e08e89a86624b60f2ecdb8affcd431fc13173fe75 In = e2e77eb54f321f86f52ea3d3c8cdc3bc74d8b4f2f334591e5e63b781034da9d7b941d5827037dee40c58dc0d74c00996e582bc Out = a352ab33ca730482c376bdc573c9d1dc6d3597f9be9f798b74a57beaa8e9c57b78ee6761056eb67363e882fefcad4fb9 In = da14b6d0b2ec4cf1e7c790e7f8f4212b8f4d05f50e75e2a56a5d70623c0d2e0115a15428129109b3b136d756e38a5c8463304290 Out = aae7ad977e17ac0e560c0e0186433420f9fddcd191b9e91567cee05df88f1e1aee50424a313998a873f7a9c289a02217 In = 2db06f09abaa6a9e942d62741eacd0aa3b60d868bddf8717bef059d23f9efe170f8b5dc3ef87da3df361d4f12bfd720083a7a035e8 Out = 85d4e3e5abcb1b59ca6f551eb43b43ff64890511f73a9083a2ce6e9c2861c6e9664c765629024f4b01b0cd1594a5981b In = 26bad23e51c4560c172076538b28716782ee6304962f68e27182048948d5c367a51a1c206a3e9b25135b40883b2e220f61cb5787ed8f Out = a44c7f84ab962f68283404f8c5c4029dbc35d2138e075c9327580baf89f292937bf99422e45756b3f942bf0a5ae4acb6 In = 77a9f652a003a83d22fb849b73fed7d37830c0dc53f89cea7dbec24e14f37197765206fe0e6672016e4dec4d9ebbe3e1b4423771a5d0a8 Out = 29c8bb39bb2aad419a00a80216ec71ec5ec9ab54c41927e3e3f2f48f079a5886d7fe89db98c807ab686d2339001d6252 In = 268c7b3a84849fec5c769bc4ad377dea10c9d20c91dd17fdbd9670a2fc909d0e212129ec40dee41dbf6194a3b04ae8be5e84ad5426ca4496 Out = 0dfc6ffcf4a387ec09ff862c6139a6f7ac77abb2b5e1f6dc814eb71525f8657ac74a7697c2975c70a543af0e227d03ca In = b8324341a6891a6b5e001a7d2ebba6e02e8335c124185309a4c9e9907c43bd8d4fa73c527fdf783650316dd24b148870e1436ac05111e9cdcc Out = 6278d1cc17fb6d54129d04987d4774fa846dcac4ba8b6b72f41e63dc387ce0081ba29fb2c17c6744edae24e669cc9e75 In = 5ef8b3d79d299bee2c414560c7de626cc0d9fb429884aa69cc30095ef1f36b7e03a8ca25fb3601189f163b209e0facf8dc447f690b710fb47b72 Out = 7ec9505f33f4a5493574422de078e0490b61be8e8d6f158192bb7d2bdc2dc335598dc88d9b443cd1c14b883a77119df1 In = ad7321c9a8b8f0bfe100811114270daad57f6e88772326b62d88a37a6f55c2cf9f759115ed6a590878e4dcefb592db151538db7de20229d26a181c Out = 3782d2caa537294e809e9df837b1b07e2f1df07d0f4c12e12459f56eeaa478d5b3a41e519d9414eafa5ddd5661c831ba In = 0719d9664541f0a824f71c83b809bb6afc973c9f7428e1ed11f7c29a558e1698b796aefb49eec2b098faf06bd43e82e1312bf0388c38a5bb523506d3 Out = 362c05f678df92883d56e19221391fb00d0f0afcec51d3e0feb15ba2fb60693b09d69118af649648933259d7b1e240ab In = 5415c2596aa7d21e855be98491bd702357c19f21f46294f98a8aa37b3532ee1541ca35509adbef9d83eb99528ba14ef0bd2998a718da861c3f16fe6971 Out = 8f9fd7d879d6b51ee843e1fbcd40bb67449ae744db9f673e3452f028cb0189d9cb0fef7bdb5c760d63fea0e3ba3dd8d1 In = b979a25a424b1e4c7ea71b6645545248498a2b8c4b568e4c8f3ff6e58d2ac8fbe97be4bea57d796b96041d1514511da5f6351120be7ab428107ef3c66921 Out = e248a64b6ef112bf3d29948b1c995808e506c049f3906d74c3ee1e4d9f351658681901fe42c8e28024fe31014e2d342b In = e64c7bb9cd99ce547d43de3cc3b6f7d87a2df9d8a4760c18baf590c740ec53c89bfa075827e1f3f2858ce86f325077725e726103fbe94f7a1466c39f60924f Out = d1e5a72d2595f38714c6198ac14f8a5cdd894dcf9b4b8e975174b100df7bbf4f7ce291b4864f27c0b64e6330f6c1c82c In = 91b7a1fd0e20072d9c5be7196e5eaf8df36fdf145895b30d4e4c02010d7c663499ac9d7a44732f4c7430511ba6fb0ae4b3dc9405523a054fdf962f5c5b79c423 Out = 07c2e0aeae30da83b5a6b320aa1cf727b10c2034583d7acda55648fa3daa017aa15588b6e2149101c56e3d7df7c76df1 In = 5bbc2d4efe63cbfc9fc221dd8d8384075a79c80a27d6a8c5219e677f4c5bb8338013dc2ab1770acf735d13c0bc704621ec2691350cf3ea2f53bded45ef8fc70702 Out = dd0bbfe4b799642191abe316df9d59a3743566778b4459c51c3be3f658bdce45516ad188fbe1a8cad8a1fa78f8ebb645 In = 129549278e8976c38b5505815725400c3d2081edf141ad002e62ff299d9a0743f9c9f25971710b194dc88285d50b6cec6e140c19072f51cab32a9f6497abd3e407c6 Out = ca26aec527fadcd5ebeb4eafa7c102f79a3c2edb452afd04f6162dd7a17bdd1aad7d616508a89a3ec6a40791d915acc8 In = b9a9f378adeff4337bc7ec10d526c6dda07028375549f7fda7a81d05662c8a0da3b478f4152af42abb9f9a65c39da095abb8161ba6676b35411234bd466c2914e00370 Out = 99914f684e0b317f9338af0c71e9655a3af7153eb9fabaae61454bf8de9e0bfd274c1eff6c4b550e47afcb3b20fa7d9e In = 101da5b09700dcadf80e5b7900f4e94c54d5f175569a854e488aa36fb41ab7220b0662178ca07a596768528123de3b2a3d944aa412875cedfeaf58dcc6d5b4a033a53b69 Out = d3e32c9b271e11e4968397d85d76938b974ac1ba55bcbe8d7b7da02dbd7e3b9c9af0d98bbd7e50c436fcf9e3551e3432 In = 14761bbc5685b5de692973e2df7c9c4750889c19a952f912c817890546d5e37d940d13a14ac7925abbd875b8cd60e4920896ce6decc8db9f889da2b5489e1d110ff459d885 Out = 272222ed50631aff465c0e6fe49ecdfdca983bcb7231e50903e200b335b845108202c28315912c9c4fd50e2c6f13a9ea In = ed538009aeaed3284c29a6253702904967e0ea979f0a34a5f3d7b5ab886662da9b8e01efc4188e077c2cdeb5de0a8252aafbee948f86db62aae6e9e74abc89e6f6021a4db140 Out = 8361b680243b1661d6f1df53db363cae41c2ebb7438c00606d76b9c2a253faa1f09d6f520d69d692ec1dca0c7885119c In = c434d88468f1eda23848d0804b476933f24baeadec69743dd90d8455f1e1f290f6f1aaf3670c4c74f76d3ab83e9bef21ad8d9208c712ca478e70d5fb3c4bd48834c969dd38f484 Out = 9c26e96fcc09a76cc13d24ad25c9cef4300e96e97e4fb59b441baffed07f6a70b1464f2548c7fd7839810dbb9e9c1e18 In = 3064e5ba1e7751bf7198e0811ff4d4ca17d1311c25d9c3a316b562691cde75c974b0b52645c134ddcc709d77b6c1bd24cd684265d723c308bb4d0159e6b16d97ed9ceaa57436d302 Out = 1ea779739b204abe911b4923e6f60fece271eedfc7f074fe1919f0cbc6ce2a99234b003389520884b660165f5a1e80f8 In = 89d9521ad84b1c9afc2fbd0edc227193acd3330764b0d2cb71bf47c7aac946af85be13858b55976009f3b36b09ced4308052c817c9c4d0295225f61a9659a0874b88667cdcc5213919 Out = 4209bb8f869f6f17c8d5c368c489ac51a75e24a85a12de1b16fefc292ce636ff8fa360e82f05684f6b0b074ba370a933 In = 3216662da0227993d88288187177a0287de4eccf245d7c718b8045bbfb8869d93f1fb9e94d7478b0298e628c07e0edaab01dcf79264dc05f8b2181aa3f831dc949726fbcf80de4c9c9ed Out = 64c45e018cfbc88f8f4ffe3cef0df3a94aab3049fafae28e28efbb2a4b94809eb302caf901010abfa194f72965663d35 In = e776e6749c5b6c7def59cb98340984539280a9874f80412d4df0ee73d58acd1094d49ed4e35125834cf8cfe349e599144e4f2e200aba4fd3eb6d78cde027c1d5620e0270b5e83ab26b8d32 Out = 94bd67b7f2587b0bda5487cc45d00e4365f1ee40073cdf0d23a5ea3fba01eef42a46bfbac5306d67be02d8d918ae5c9a In = 5d8f84b2f208b58a68e88ce8efb543a8404f0ec0c9805c760ad359d13faab84d3f8bb1d2a4bb45e72c0ec9245ffda2e572f94e466cffa44b876d5c5ed914d1ff338e06b74ad1e74d1405d23d Out = 947350307748c29467f00103d0a07c3c228c5f494fc88fe2352ca5d10449d0dda7076780c05439a09694eb528d1f477a In = 357d5765595065efe281afb8d021d4764fba091adde05e02af0a437051a04a3b8e552ec48fb7152c470412c40e40eec58b842842d8993a5ae1c61eb20de5112321bc97af618bbfbaf8e2a87699 Out = 32286970204c3451958f5155f090448f061dd81b136a14592a3204c6b08e922ee5bb6d6534dbf8efb4bb7387092c8400 In = a8cb78e1485cbb7a9474c1c1f8e0f307cda5139a7e947df5ea20ac330a6dffcad4a9bd755f9f58724789eeee532615be550dd84f5241fde0e3058aeedbf287f02a460445027f5e6b3829bf71ecf4 Out = 51168bfeef8a981c0def0c4cb067baf15ce5feb8d5f7e9d6076b2836267391aee1fd3a0b5d3434ceb5cf2d6fa06fa063 In = 81acca82545e767ab59dcc750a09849cebad08ff31c9297f4fd510ebe6c27769938319180ccc66f36b1a7cf9c9f3538b0f6f371509f77cf0bc4d6d87facc85b933f2e27f8e1bf6cf388f80c0fcbfba Out = 4ae44d6509986893a8414753b57d11f9c554d89c15ad6d70687c56c6c2ac73537acbb0d51f48e6bea6cf762d58890d7a In = 94987498b1ca87a6f3fa4b999db726115c455d0ec24029b2f5810e49a94668864b8c470f7fc07c3dcd97f41c973b45ba4fa7879ee7546596881573b6863fc39d940eb3fa3444084f721341f5d23d2561 Out = a733b118be72a187ddcbe5ba67e04b589f9cd9f8482c4bd9d64c580aba7d19d2d1f9c1ddf95fe6efdeffd44f67fcabb5 In = de6b32c2d40d0659166db235259b530ea43f44e75d8b3e9e856ec4c1410bbea3696964af8b6c5dfd3304282369a4bc4e7cf66b91fecd0c7c105b59f1e0a496336f327440980a34614ee00fff2587d6b813 Out = 17ba30c0b5fc185b3245313b83dd0481145953101128914765784af751745b8a2b6a90a434548f3adaf1f07f18649890 In = 854211bedacc19f77b46cfa447a4ad672ea9b643f09f5cf5274ba28888207e2466b38127776fb976db8ad7165a378df6ee1e3a0f8109c9aff7e0d6126fd71333c6e6ebe15d7a65151d6a4a83b82c8a6f3149 Out = ca85632a9f7c32ac4705c6458770025dda4fd07a8d5d6921b897b0da490d64400587649f2d20bf608b9a18d071b63b48 In = 822373d9d3d5b06a8da48a43095740fb98c9caf717350fd2c3b058024ff705b9346b7f0a495a6d4d93802bc45ece777f8c6a6e7c2ef6b8135115ff911a2ba5241665b6f7cbfa1b9d93b011b3aaa1dac1853fb2 Out = 6e84587c8c6e54353a6032e7505902ef7f0f0538dd1bb32922e13a7d4d98c47a541015381eab27e9186398120da7fb32 In = c04b701f688092bbd1cf4217bc4b5877f2e60c087bdac46611482a61d51f820140403bc85be0c336332da0938734bde8c502014f3509266c73c6c93c22a1bd0ddf15a5ce7410c2894e9d092e32c079922ba1abb7 Out = 75c585503f15a526113608bc183180b1cb80f4d1b466c576bf021b1ce7a1528391f70e10446681849fa8a643cb2b6828 In = 009dd821cbed1235880fe647e191fe6f6555fdc98b8aad0ff3da5a6df0e5799044ef8e012ad54cb19a46fdd5c82f24f3ee77613d4bed961f6b7f4814aaac48bdf43c9234ce2e759e9af2f4ff16d86d5327c978dad5 Out = 02a09d37d31e4365c26bec0eaacecf29eea4e8d21ab915dd605248764d964f10ebb8fafdb591982d33869a1d08a7e313 In = 0b7dd6709d55e0d526d64c0c5af40acf595be353d705be7b7a0b1c4c83bbe6a1b1ec681f628e9d6cfc85ad9c8bb8b4ecac64c5b3a9b72f95e59afefa7bcec5be223a9b2b54836424afde52a29b22ab652d22cce34b39 Out = 5c84ae39d959b79555231746ad5b33689a31720ed0070f6772147977edd0aead07fb8b7b71b0bd587ebc5c1a80d564c7 In = 3e9b65d7bf4239420afa8639c8195b63902b24495b95c4143978e49843d88a92d1feed2eed1a88cd072d6d04ea26dce8ee4b14896fdb69bc7ff2971ed8ac5655148d2e9921218d74efdf17c56b533d0bb17d11e07d7458 Out = ab7890d1b51af10285752bf9da5eee5c3e87a285dc33262d0261aa9a575f303e94845d7ab21b48f4e6884568cd78b550 In = 9436da433d1ebd10b946b129cb34bccec9b8f705aaba3f8561352ed36a8449aba2dd7ba15b1bc308b0c02913163af63a346524dff5521432db477f529606afb5d552efc95cb040db566b4d39eddaa19319e518a7b5c6931e Out = 968ae9104f9c907c5a72936250dfedd62cd04f6e5ddd2c113490808a11884449aaef5d013ea3993a6cb6fc5c08754408 In = 37254bf9bc7cd4ed72e72b6bb623a0cc8eeb963d827aef65ad4bc54913235b6d3551533ce33421aa52ffbf186eb9a2787188eeb1b52ee645c6d4a631bc071415c80014940c28fbfeb0db472c326c8dacfd6ab21f3e225edef3 Out = 975e10fac9aa77b780e5f6c2151ec4a3c72ff26e41233cc774c074df1b78cce5af1191ba955a0bce15926ae691b0ffe7 In = 79e77cd08a6ef770bbe4bedf61557ea632b42d78637149670d4d6157d56ed7b2ccaee45d9439dcebc557b4118e86c15aa0ccc21c474b21abda1676cc56434d6d46422993e66dc99387dfa985358accf69884b9dd18a2c4d04448 Out = 94729f5f99a54f5a3ea69233ff9d522392d4596eb6ac2bbb07492ece3c67317412bb47ae317ddd20536c3adc003862f1 In = 64b76cb554f6becc238a3fcfc3eb97993667ec82fdc3fb28d42567709c3250c7997328aeddfdc2750451ac462281bf66fa94f4b8712c7a8342660574f20268e707c466627519c56259fea55be91e10faab3ad2ade6ce8b6557f202 Out = 26d48ef5067d704ee9e2a64e399de23068908b3c911ffc4056c168362c37385c92d37d51354b6505a82c4d22fec37eaa In = 3df27829bfb1ab7d381f146b30370ef56b392b73b35b1be5d8bbcf88f499dda7f3c327b45350b8972991ee466545de96560cf451711fda884e3d9b2af3e909d655d25cee1c931beda79c40fa507097bdf1126771a7b9543ad5cb84b9 Out = 5fa4ebfa24150236c03409f0857b31cb95b0150f381c8858b01559957b1268f73c698709233e6b15468675a102d0c5e5 In = b00f4e67ca08ccfa32b2698f70411d8f570f69c896e18ec8896cfe89551810543303f7df0c49f5b94783cce7df8d76d0b88d155633302d46003711f233339b1c9a8c20164ec8a328890a4932b7d90d92d023b548e4820558f8bd327010 Out = eaa756b5892fdfc793d74e3f9f4d6c7a5a6a2241dd11e0c38ced59c8ec7be377a41d1d06774a5970ce9722d8e119d0ad In = a4f95f6a46a9cbf384a7e98e102d1fdc96839d1bf26b35a5a0bd6cb9734fd17e8a178d4581943c0fe469fb4fe94cc2f15e1ef59ae05b35324eb57ca07dfc69d42d41d80b3c3bb64e1aea143c7d79790a56697dc803ec93e6c68f27f6761c Out = 1aff8d9c64f0c162ed0195d1f3a342a010d14be0636903c48020ba42de1cfa8b98ae2142d89af3e69e9eb4c735857dd1 In = 02713084bf93fdc35135515243c3bc0f4b2b447f2d3461c0dc104cbfe23479ab036762a91d1987c953f7b3386abc80b8734a1d4eabf94f3a9f2fb62c943152b5253846fc2ec8dbb2e93dc74857a7b05fe2d7ec8040ba8b0d9ae69777ee739a Out = 84da02114e341a3636f00822b32bd21a8a1f7b39f2956bd97f39346fedf9aae63b304c65c93a541e8bcda549576d5f27 In = 00ce225eaea24843406fa42cc8450e66f76ac9f549b8591f7d40942f4833fc734a034c8741c551d57ddafb5d94ceb4b25680f045038306e6bcc53e88386e2b45b80b3ba23dec8c13f8ca01c202ae968c4d0df04cdb38395d2df42a5aff646928 Out = 81d6e0d96575a9b8ca083ee9ec2ead57ddf72b97d7709086a2f4a749d3f61d16423463487562c7f09aba1b26e8cae47b In = 7af3feed9b0f6e9408e8c0397c9bb671d0f3f80926d2f48f68d2e814f12b3d3189d8174897f52a0c926ccf44b9d057cc04899fdc5a32e48c043fd99862e3f761dc3115351c8138d07a15ac23b8fc5454f0373e05ca1b7ad9f2f62d34caf5e1435c Out = 00e95f4e8a32a03e0a3afba0fd62c7c3c7120b41e297a7ff14958c0bdf015a478f7bab9a22082bfb0d206e88f4685117 In = 2eae76f4e7f48d36cd83607813ce6bd9ab0ecf846ad999df67f64706a4708977f0e9440f0b31dc350c17b355007fed90d4b577b175014763357ce5a271212a70702747c98f8f0ad89bf95d6b7fbb10a51f34d8f2835e974038a3dd6df3f2affb7811 Out = eb396cfaf26ee2775af3c9a3a3047664ca34cbc228ccbb966df187d518717df6a328ecc316ed0ed09b170080eccc486f In = 093e56d33bd9337ad2ad268d14bac69a64a8a7361350cf9f787e69a043f5beb50eb460703578a81be882639f7e9ac9a50c54affa3792fd38464a61a37c8a4551a4b9ff8eed1f487ef8a8f00430e4d0e35a53ff236ce049b7a3abdc5cd00b45c4f3d49b Out = 4a339128486e5b274fc4ed538c0ec9e57f780e9c500c5f92b04ae81a22fbeebf3785259a0bb3b6d9b47f31873cd8dffa In = 430063db3ca8e810920ec1a2c3028e809780692e0dd7770e950abcdf7f773483b4b61f05a4c49cda7f617967a8b64ac4673bb8c0ded81c253e4b4d3d3ac9b594bce8ab00d7bcfddffe40cba073f89c8501d5aba6ee59823a2cfbca12cfcd6266c45caed4bfd832a675755f540c10ac49cf16e9ea27a2d0d5c6e5de6626cb618032dbd18a436063b74dc6dc8b5b46a39b38c61b946ffa2f7e76d02f42270bda6a6f2dbc294a9bba9beffceb4d47e2a900a4ace8aab0abc7bea48365adbad4f6ade41a16b9bed25cd9c1df33a3ba2be5027b91f936d1fbbf1cb6c729b0c770dcd0f86a8743864d74f92d365d949c6a8028263df53fba334021156423523625b65b12e4b9cd8a5428849acb1029d3e8a2fa0b7885ce539a71532922fa9bef3ca9d79c525162b22fa0017064f56948ea7101930a51ea847a7b3d5ac95693dafcdfcbfd7afa07e62505f816cab35ce3bb18c426ba009b351985641120e143e0af80bf9d245ac60e7f7ff1f6c5f30a8da2bdcc2d513be94ec1b852b4f040b2e79bb33be41a19a612863575771c5d7c2ce6899f0e98a9ddb7b83c8ead011ee8d80aa1c83a23e0b0da7f500b019998b9a9d0a3c73354f37e584638a0621b21ee9c4272ed070657ea4eb5f73cfc024dc9eda833cc0250c0d519b5d4113d06f1cb198c4d33b38c255e576f538fd02023b5dfb66334e553b9e8e34b3a67a4893787392f5a21a67df214dbf48c8ce6bbc38466415989432486c19c528f2d016e9b2be375c33f48a16812c38dc9bba49bd43e6c933d52848cce682e10fee8bb7bc4beffa4ad1502bf2d62f88232a57387ffecd8f238180f5339e37fceac223a795b487405422c3aa1e90c611bf1d1bc48ec9492a772624e41713c79d3c462e62f07d22ce0aa0b590d4516e5a02bc7e5a6424181f912b8a81d1b7b03696c31276771620e7d0d3ac8cce88a6e580b105869aaf88f3240a285b1e2a604d6cc1665e7410302239242eea67c6fe38cb6337b59cbc3a39926a94dc36bc766630e9908781ebaf01b61aa3262a6ce2b8457b8b83e4ea9a575e954691c61e51058574278e2b091c0aea3fafeca10ae3088142876dfdab37e0fb42c3f846a09eafdd29a1deda08f5a2180bbb9a46217d9e0150a1c0518e714afadb838c32e3adc99a428606196bca7bf1f74cab943120ed383e61478af4f509cfc80bca05780ce76f874a70539218dcfa9ad9bd15ca5b7aa8645c50048f31a20ca0c34e48ae3a8daf4075ba232c5f59845ee93b455dbbdae45ad97658bd95b813fe50657716c520ec068e50028b1c8631cc01a29d5b90624e9a9f26e1f0bf90882929cc1b422b45a851fabe7c4ebec7856aa98f984497b5799be3ee5ad91defdbc9b5deafb0eb7056bb5171fae7d4b1f1a3575ec0c92048e7e76e390dc71f0a81489b09aed36415999b1906f8d6ecca090e71aca129c8a10c058493755b51950b3e2ff9832a43b9c389b7da10ac75642e14bed5b4170f32686ecd9a4c065403fc031b1ad73608e176ffc487bcc8fd34f35e657673e152918f8bbf99ec4874dbb64fb2ea158702012675b58c67cce2a0db342c1b5b493122e404c12ec0925270dc7cadd3c88dedbd547401549c18d43c584e6910e49f398b083278d573846b87d10252845acb2a6a73833e7ce44d306becf5a313aa53ca2e5ecd5d0a7f9f3e752689576866bf268d262bd361baca85b42bd27070171761716a0dd45a4f3339cd6f6a130c56ea80b9cec656afaa2142a9776d47d2b55a9e18bcac75315cf0ebf4fe3d1bccb5cdb764effb4eb30ce205b0621e9f97ff8dee78c901c61c4348c390656ad8360de94912fc2312288d7d3d6d7e7eee5c6031d11611a63d977cbb6f04378beed4b9cda44895e6475c966368352ef6ca8c81d6c4751912422f73c93cd4e708b63563db577a2fad54dba224f4abf62ebaa4defd571a51de8a40c2e2bb86e679c4b476a2d12c4bf0d1325b428146567f1531d215f77a6e535c77d49879aec857a0ee7ca4bfd35d5932dd0c3c9c78d27080bff5a1241991296f31436ae5910f1ac15fe0616213d63ef0583f8384d7fc9b73abd42f7b8c9cb9090979da8df22d4bac754c597642691aa0108fb7f8c837687481d8215c27d39ad06cf257e126a552d8bb0b0d4af36894b8b2673a66ee156fe9de8c27548fc8474bd847737dc309d8ccbdc6ed7ebb7705a0aa408b3dae090a6a1e5a91d338fd36d1e7e3bdb24bbd35fee9ea8a8feef715fe64b63b0b7c94d07bddee017697e4e218f841873d254202f5cbf064dd227b1e386e32ca4efe4b4a757990f6bd4111f177960b606cd43ac827c072fd04da65b6e54340a986979ee10d9e0dd1f5b906bd745d8be9cffd09ee3b83dcc3859b69586b705a6930dd022caa979f23de5425dea59b5d83d4f431fd7772b848edd9d87b5171fa89dc331795b312cf7cc5c701ad71fbeabf2a5e356e8229700d9c0a45b82dd4bb7be73e31b4dd7c394d5a762cd26fdbde0c2e9f96c9d1f4ae821ec1336756f4f7bff052f2f280504705fae609c605d781eb603cd887ed70ce36f4832421736f39e67615ddd7222b9347259b2af0ca6b90ed5dca7d314b2a499cabc48a7ef9a01c5ff70b54fb596a88716909f2fb2404658275acf75e619dcb33a309f8d86043f9ace187eaa78c89a12543b7044db93e7a3b4668c957d727ad9c78c7d1b62da77c5dc4202194422567d33426e150e07669785e9285b5f2647b27ab82b790d856fee31d787c2a00ba66fbc8ddecbd3048adda1c9e9f0169e0be75a9df1d00f6ef0bcd6bd56cd14eb5090f6040b8db2f21a1d10f0187c2a418e1f6f211648eefcc1d7d2deb763282b1d89e9903c843439dffedb44fc2621769703c22de4083496ace82d20f1ac6531d5029d17b8d8e041a12909afdf1785a7f03b5aaaa13968a67797ef6d4ecf526640a21b82c8b03e722746a2180777dd3b5f6e407e96021393eb8b21ac14f4783225126abab434d7353bfcaf66bd6db29aad447a930b8cbcc5d06dcbc58c455dfe4efa92a6c48e32f0a3f3368349218b2ca26712cf48feeba4eee4f39ffee78b3081009c2d40e3d80d28d44256f3bcf058057c0f1c948129980c99a324b2058a3287cf8f396f5e4ff29247d8c703666989a02e7a61393dfc09f433e23befc5e06a280d73b19a242109a9f302bec0467f2439225a867d59ef5f6c5bb9ccff4f17422b63507c0960d5b83581c7237485b9929903b772a9fe87023db92ec028ccb7205a782f840438f469fd9830de654aa03b88779a0f04534e5a2ff44cfdb364466e7bf517b0d3d40583cae143d8dbbeba87cd260a44d881cbd009b5186ce83e4e93578111e8bd5d906e64040af7200992df32ba0ff96baf86ca95a39cf50e8356f7b6c524140bfb1e9193a88d247b52ada97dd8b116070608b19967df816e5ae7026068581d06d536561f75d34833c1954e772af984f2aed8eedea8e9f651ec881c1c13b5e9f3146024cf15e4499180d137e858ee2974ce7ee72c0fc33efd61c1adb36e44611ddf24646c2dc811ddb4e9cb980a98eed78e83064a44743fbbe01a1dee200c6dcb5f0b7cbe6887865f8865714ee700bb61176eb202ee04e3d2911cd493d215f644bc9cd58d6b2a925e22ce93d4972d795c91c7521ab57c108c9d4e3b6a2b68e2d11d60d7a1e1b91c24aaac98f0c3270e0e2417505b43e3b02f2c38b83dd40c1bbaaaddeac2703a0bf74985e86b13f764c0f6e4138d3d41aa046563b4d2740987478d9d77b7c0b7492026e3eb0c2ea462b932b903784e9ee653715698f2b46810c0eb28e4497a37bde66b4d099dbd36ef43fe1b88e31c034c647899ca653c309d6cef049b4046c34f933d4caae467b6f5a482940a984f77c47ea1b5b4f3b3691594bebb0264cb62e76ec66736abd52b5b25e8abf15d900336ea1431bc64c21c628083d5837cb21c6dbe2e2615b8ae9d090e55e9a5fb87ae8af1fa954c7f10506b7864d88552a2f9c9cc9d11afd39b15e6a7f3d48e3adb80a8d97b6acb0d460d18c4894e70ac4402e4e03ab16cc64499dc37eaf615e1348178eabe37a1d60b5b51ab1bbeab53403ea4412d8db5585034d20862d7a0ba3cbae36eec8435a20843fe7642b1a00f3db6f2399f2df05068ebb16082fd998b9832cfab2cdaf139e4cc076e25aeb6a7e370b70eb81a877733c85f8872f2661df3f126eaa7bf3c6348ff54d8ed3d55e5dc76d9099fdbe0955ad2c5c85b3e7138f300ce7384be7ee7dce2ceffc1e6e58fcdd042727df865728411cb67656720a34066b18eec5c208e47805b2aca32ce6e6184d89179fa7cd55a8e5aafb7f7dd28832bb5830723882032dee4a030a8794a3e9c85adbc688f87835058e67a760f8d6458c499fc9a1f65440652aa1ad14ceb0c1f2f106dca0551a85faf55d56a1d9b8af4c51af4494d2426ff8b90b033b0187416c000b5a946f971c44544f15d711a9e079f4c16b97b277fd1799a1c580e9b1d881fc6bc8bba47858604fbf5d672d2479a3c788b710f34f885031083c8cc3ab17d34aaa9fbc9058dadd2c10a5e888b2eb383e57af9731439211039100954bed5fee7f3a47edbf9304299e0587c1b0cfb5d5cdd0cda0d8fe9b08a5ee8a50cee331120ebd79e58ec174c409e06b8931e559dafa6699b476cb03758c736245e9473c1c7d868e2a8a7ead3af443d9a5989e47d6489b8c4887538c062bc200cb1763d13c4037fd233ef50e0ce1924abd315510464ce22de377026529085cee76c5e3711ffb445f7618ff1798567e4726a89443a95bdce70be2625f6ca69693cf9120cc26133e1d89b4d76a9bc74a47786af6428e09ee402845fdbb3f8b11994bf5a622ed0c77cfe47f387755b8a8d43904d5ad52db88e1cf1e2f09102a605762600e25e35b93eefcf47cbe74aefc75dee2ccd4a6554f2476d790d98d08d566a96ca335979514e359912eb0671eb794d0a14668d6eba380a60eadad14ab133f87782fd2782d7d5580f1b8edab8c8cb9c4bcdcda8323289ee32fefe435959c5a931eeead13a93fade972c5d6c08cce6d1181ea9a298040d7a4b7d22f6e3cc34042cd7a05e88cde6519b0b00c34741f274dbd0a3848777eb36142fedf3d153a792d104c7d653ccc03882811ee75f6d160efbab6255e9d44caaf3dc08410c3646d9863f084285d9b11cb4565fe136997b26e0778f1da563575f514b1ae87bbd3a63b44e0ba9053ce18499526db8b60c4944f2fcd1e5a36c35dc9745ccf10530abb8c4fa7713bb3d77f8993ded74c610a7f09902d1b4cb370da92b92c66394d6c05e1c0bf4888f249c001cde8a1e4debbdb33d503692050c084f77faaf460ff8a2df26492c11693877258afeeabd35e6b41446afa98739324e55e1452fa35dde79c3497cc4b531c231ee4b65b5596549b49c1ce7d29c4ff20643d33af08168d06c90ec6b677dcf0af1e4c7db94fbc55ce4d127c058d82f9458a2b4a297e81716a3d079dfbb6f2b58e08d66282ea93d676d3dcf02e444c1606df8ec45cfe052f7470a57a068962ef4267491132d6db5b177687d741de6ee9d6dd0e3eb3e7201bc80c7ee7617f7be25ea1eae66364f158329d997dfacc89c9580af005c8ca50dae758ea629709cc435541527e7f4564525ab18870b38f2b48ecc1fad5f62825c124fe7e7801a8c296a8de0625f0c8a2ddf26adb3c06a6a1fd17ca752be680fd733355a1944becfd30dbd07c99529f3b6f9c22185c6ea3ac3a6b6d0553f455666585070a43d036eac650b12c253f19ac6baa6fa63e45f6a8a54a2201faba15ff2c8c8b0f03392709bbca08ab75f0c86466bfbc3b7e471005b256a2118c9263061ccc4a365ee12dd8758a4f70f8223bf1f54e801e88cc9061d5f335ba8637ad39dac6ccf6c352cbd5a823edf3284de4e37bd963e5ea50f83ba4b2855383f45508cb0e9be6bd28819fb8296cc882de43a78ee2c0181f6eb8019316e972e2730ad182063f8cc8bcdf852a0d5457945de8bc92ed3d3b9490304225930a9f4e0e2f428430103f529a363472423d36d93734a11c7b33b6e640217bd0a9414f035042da362ec695074b461c255a7fccce04c7e3afff3c108108ec1d28ec25f8ced3e5e73c54cb24333a5faab7d8a4bfef4102f2b1fbcedef154f0b492be3122fcf37917fb4486438302136eae2f3456b976865cc6e35488b3beffc0a2a1fb540a598cdaf7708099631ce1e67cc0b747b91fc2905368759454a139dfed39dd12935081beb55b528c5ff54b90b85fa5f97a97382bebdd9a8830965f40b6d86ed514830821b98774a2d625c10bc54e78e25a97679df4d54beae418d0c1a42019220a5b80a278675f636218e296380fa8a8f57ac15502c1f222fba33ea14983747fe1647bbf768d8b44806910ee9525dda3b7bbe5ef9a2645c6c3cfe98dfb850945361859e7485c70ccbd70ec73412350693df535cc3f948f5cf8f961d65ea7301874f1cba84276b87275dac5a2e08ad97fd4a14189477f574bf7aa4818c75c81702a8b1171094ecacc46014d1be7bea14e383a89956669361a4c7d0cc3ea3785d2d34efbe011571040aa8ed33cbb51705ac53b9e7ef0c4945e53cc10762baab5c6eba7bb63df2221662fce0893ffc5af2c082ec0b49b240a7eca2203ae003889a2e040007ae73286a322595da0199db6487d8eb0c4a9fa00f20c0946ba0c638a1d6d824ba3be0ab88e3ecb32ef9d4c3e3691d5ef2dc1d9005e960c6a4894be3f9ccff8fd6cb80d2f9de17e38e0ff43af5ce18ecc6e6723812af485dec85d9af287a41ea63489cc6448a6ecc002b4367241e923e8f4fe7c1bdda41024c7cb9c7b84665dd6a997caff14ebb178f350773f7c153fc5501c4538fd2135dca543451319a350ff1a668b48894c46b40158986f61f23cd20e351150f00861571f6907619dd77290357a8fd92c352711db311c6aaa0ca59f9ddd630c5ca62d3464a155dfa77f4d2a59483b397422dd02df7e65e9aad0f49e7d79acc39996e3e53380d2f5bd074b3e14543fe1d7b1d3178ca52744facbb45f3b9e60ff4d673ff9fa9be13c550bf74be522e05aed5ea3c07129b314f0796f4246b02247de739bd32837132bf5f9cbc45a38df1d1b85b98e1b90abc242468ff82d636315c36882115b06fb3d165d4337c20a7e90f8c3aee0ea5e73e556df90d15e0ca5f1a2928d34f16fdbf83ca2f826db2c616eeba4de597c07ade6b4811c7e67205d53e2ae07ae89f667e5ef67551203f30a0f8a85d2683f00ac5ed1f77d5fc7530bc50a07abee932f017e9516e479bb02eaeb5bf3158da1fe11a6359f4de5fcf933bd8f3bc4959b6e5b3ac44e20de8ee0868ac679324a5344506565e508a186a767b5f8a6fc040158b793035984b0fe006f765094932eb177fb14d9653832e2c21a36ccf5bcea6362b92fc8d59a8166d7083680b1c29b4b0d742d069c46ea9ffdbdc8829471994010c2599b5edcc077f8d333ed7d4b208e794e1673f6df692caee4e3a00fc49115e785b8d131c60e9fda6306ed33974f0a400b89b8014c1f075a0200abd43072635b55c6211ae0cc5ce03a28069121873cf61ecf3948277cbe73a7b80c6e2fbda6e0c4f9f166a77a2dcecb0fc0029459a5000a8f8e37fc12b0a03862584a1cc35f1c55ccd89194a880ea9826bff44a46c0f251230d6d34719c5456a805f4a223fa628ad73d4832c804c814155d02cdcf1f4185225d345b09c00464e1ac0a3a701767d67195e70c6907ebe1540daa99631e820915f439ea4bda3505b790d760182470bb5488fa8c0c38ca625b685837a35d186f7658fa6cd8397a9b827b089d8ca031bbd86cff2c11e5f829a3e39812f049993abbe1d25d0f6c2998fac0fa4d5e290f5a75e861871abdd999b615e6c5ea6268cd6f557e3581e0d6a058e94919fd1d8e19c551ce07971ef3551a55c0cae2462bc9f8fa4a70b0460624457a517df9fc127c4f5f91381787e9ce4959c29c885336a2f166b3b91afa4cb748eacfd3d55350e46c5867930c970177bb6848b53d183ddad1216659327bfebbcbc100c60fa1bdf4a4d29d92f6bafee3e927df9f810395e42090ceeb9759b0b4568390cf1965ae3fa164bfc2566216956b0f03d5f4b3d351685b59eaaa01f72371a8fc59732dc5f7ca755abbbc3b0d0eb98431d2f8a77aa500d793c0fb0326ab95b7afefbd4889ef888adac9989436a24d3e06211d3cf05192ac0928faebe39f3b16281c58746e79742bdc766c0c1802ae82dd4ac302d8d9862f266d3a1aa280ea7af149c50fe81805cecc6cb70145a255f943aa9a8798bf64077818291de7f32c2c980283998b5dd5ea16f6fa223403cc17b5daf439b475a49b7ab45864186868c188c1249fdcbd3d1468cfb5ed67a97944c06670a7b09ed071babc489bd85338c05020288130b8c3c42e316aa154f5f636efb78040119d601094ba6a139c3604af6a89fffc3bc3027fd3d6990c809bcb349058c3a16be3ebfea5194d79e89364f544892b5f628e61adf619b17d7eed50e45eb48b2a0424dca27863532d21fdd2288a882b29295d79e501955472a47d3fbca77567688eb2aa926b232babecd7c4bf89118ff804c2b3ab82b3f29aa5bdd03406f5e8eb702fee4519d32774adb3c530ecafca3a99509777f6000c43d741cac0f9c070014cef0040f0ede725f9044c1311dd5a6f4b799dc0d804121ccd8b8819fc6fad686992990c7cfdeb2e335bd1dc8504c1148fc05f1ca53a94640d0d80759b4df18f7a9d110e3a6d93fc012cef03d2c08eb8faa723e1fa0e13d7fa4a4c8a3305dcc4e480f0cca5c7722dc6fa0c0f779b23cb00a0a4c7231900e739c454be6001cfc73bc0b0de4b9616221945a185efff10d9364f5a22ccc5fbf0200e3188bedc5af4d4dee9a99843f0775c8257dda856e6520005bc8b63af65a1617a5b8f8bf00eec645e03c5187b81ac2552979d3d5d04c3f2563477643fce6962ab4b2973e74c0c5ea087a748875a1ef818d93b1b5c0cad81d35a6d6ae1a6c6a81388ecf32ca2d33868fdc6a501ea7e4957a54dceee6e8d32efa6d3d45f7f37a6458d50762a93df65f9cea9ba75a3189d81742bd48e9ad18a1da2513ce3c83ae1b3c0ea997baf9f7bd582d7054d149c6948de7ba8a72228fbefc55bf129024eeed0dc11c99a5681eeaeb2c4f212cf6830f03cb3c7e284d21cc8985abd99cdf2224f376c8301192542d7c6fa1d41341a893a274aceab438b415a83d3eeb07bb320615b61524a6807fcd337fcf362d301d66916c7097bdeb31df8206e00f7ac106dc9c086b3c0d39881339e33f0f23cecad0f93bf24dec6c81733f67f90f9df886edaff53241eec55847b6235b279c20971b026798d3e9c58a1906e9f1b117689b837704d2fcf02dd6b1d1c88a4541306d8dd37accf35bfe3618ff1231be91192be41cbdb332bc78e998b3593333ba05327095fcf573ea1d6cba536d1ffdb2141f59c5a83daefaae7b46845ec0b7aea7d00a6f737a1c3f2c14452a7f24382360602a9a4ed93751d873016b60989ac61f2da48a69c5b602321502abd2a9358b05d59fc436ed9469fdb81290e623a3a97433850e653d09db385939ffed14bd930c65006be8e38eeb2534c11c78c99cffaec8f722f04adc7045c7324d58ce98e37cfa94b6ed21ed7f58ce55379ef24b72d6d640ee9154f96c614734be9c408e225d7ba4cecc1179cc9f6e1808e1067aa8f244a99bd0c3267594c1887a40d167f8b7cf78db0d19f97b01fc50b8c86def490dfa7a5135002c33e71d77a8cce8ea0f93e0580439a337338761466edc8f73fe2ce0fb374971d35061434771c8efe10cf8958c71d716f99d38834253a3d5cd6f59de7476937fe2710b1c40fcbd4d129aefd65b4b6fda08611c4b8b8fa7a5c7439bdc2c359b922340eb8eac72336a455f7f8b0fba89572c263ba16b4970682722fbc26c9dea135c650c82d1fab0ae4403b09ceee5aef52c949e6e28aa8487b6b67f787cd60768568873e1f9bdbe81d62f8af241f5651cd2544c980bd96d683ca431e6a4077afbd9502a916ae2e44bc28b16734f113734e40e4d095cfeb375819719f52c59cc33ad65387c6c92ab74d1be5b086262aba52b69aaa76343dc154c353e8b5bf384779970a58849f59964cb71619ac01049d76f0e6a5c68ce72af6626a8917afd2a316619799f47323883784b310fb242993278a5950fb2c7fdad98135ff0d1a147c8dc07bda8b072103a9ff5d2518020241f0dd534a88a570376a8a46c8ea80562a4c3e3798bcadca7ef0a164c4672d37104f8464d0e38a60e725e80d6554751032de354b330de99870b7f57a8d8d083084affa1eb2b04dba5098450a52cf5aeb2cb0403757f33d038f7c760edeee157725aeb8e13e6351e51a3e0bbe1fafc44f8e6ed97c66013aa401aaad8236fee78369a83b4cf27159998a83c6a93a9a23a5ce667b9afbbc44f29dbef6753453f0edc7491bc26d6ea7105805e04c32030b867333a1136788fe67ba460b684571c40ed4fdb4d21dcfdd11d930e327747ede89f352e46667fbc97bcdcc36dbe8dcd36f0932b10c61f96df6a4a169cb90623f08e540a0144b8938c76eae13409cf99196da747ad1f88fdc3730b3de9904518f8bcf998e9da0b5cea303882b16e05ca11ecf5f7cb34ff79a6c03f4ac205ec1629b08a9ea72f615edc732d6d8ff417a645f6e405120b6d53b0da4f06ce1ee363aaf271e5e24ba0e288c6316c74a4ed76de12dc372caeb8d40848a139b6e51247a40a14354337b23016b1ac450984708103c94557be25ca41d7929faa2162620c3f81dd5672fa7d90afbc06c1f59f8611dda2882b737689e54441b023b89cb9f8a2dd330f169ceb4a7b70a8a8e0fa186c94250b7cf0abdf0778dc3b6a239b0155f6a97d29d726e3a5a154f8c2749f0fdb4fda3711e0ccb3ee9aebaa4909672069626a256d5f9f4cea49f15fd7569551a6364a74b4e9dfece3d3f664851209007d0faa92a0530f10629dcd46ae31e4c81572fc2b2bb3ee742e4b86d1e9e78887d825f02c8d5e7e1652c2721310ab955a702b78c23fe70032172922593c30ec9fc4cbc55bfb26f54605e36830c56caef1fe8847a3b82d1e0ee696536445943d2f8729b087b1537b88c2263503951d3a7408b2f0345e2c4ff0e2b9a05acdbc841e6a683918788e19c4d0b363f648663ecbd6d1fbdff98d9bc054bb91a39c50c956b5b0e876187fd6e278b37a6fa5eec4deb00cf10b50f70a6684c3aea77af712beb028460959cdbaca024e00d8755ed395de8b591f2c13a5cbbafa80cf2f59693ea3f9da3a0320cd65b6ab7f98805d74d8a777bb85558973d53e878e81821fd5bed54a2c6fdd221899dbf37e178e94ae8f55f89fa493007c6d579360263df15f268f44c511b079a24fbb4d86bd67ab89a22e358ee4ae21c97c4f467f2726760d5e190f2c8944cd73709ce21ef2d2490df97b5710ad6d9361e86cc772ea0657e94fbbd2e93e61c794e2c7dace1e9916437c8385ab6799fe4d9bf73fc1d9a43cfbdfbdb68597cf0e0c8f845c1ea982bc321490e8e97afa0c937b37d5f55bcacb4af766e287fe554be35d1b9097fb56e0e2a7e8a8514f58633d7276b295d73eafde80ff7e77dabd262236d39fc07cdc2d5c1ed4ec6b4c7bab5267fafd29b7c98ebf60d0b4de92cd46d001f5b12195de48a7629cdcc0da2b8ddb410ddf3a623311f68121aa43904e54f5a6c9ed43ac22dccb5a88a1d7622fb0dfeaf5804f4044df89c93a882e3b07f79a0c977cad2b728fd1ede063384a50be6649fa07f0b9c4a18322627727fbc2d8c51da786e7789409c005eb496cfb565c7946669da5357afee973e39fb738459f81c040327afd50f3a089f27cfade09341ec97f69f71c2f9fc5a40327655a59f3d3ddaca8ed2070f57a603d246a5a30ee5fba8f946dd6ab2b1e9c0b37bac9c67cc55d3111c84bbab65574146745d695324401dc4590cbb64bfd4543f93dee54e35e26189594e5f8df39acbf7012bcfea6d487afa5e66418a76986f293762fcbd0a621a95bd856f0172ef08565597334f517324fdcf90798e66a47612dedf5f2eaa6362b8c1c056b073d28b06fa363ffc515eb0611511d00b00870d9f02ba992da654ee84fe95c30576d3c86b576f426bfd79b1a6c740f16af4ceaa003b7b17347eb4f26cdc5c209aec71550605d8e738a6428d416ec43a3883d9bfe8f19775dda41232e2d3b9fbcb451995597dd99accec47c7c3741236ee6e46c3dbcda61183b6eb04898d05c121215b1df83807d9a35007d5af6f916416f4745a4b181d96b117ae0bb360e5fd3701b46344bcda205651f15b57c9e83e2cb700f7a97964620056e99d12e7c11c775693e9d194c71b506292bd7f1b7d41aa367b00895a110fdbe51c5d0a9a2dab5ca09836212865071c127a6067ccd70b19f321296d42b9ecbe52b4b01ce0923671703fbcb6002a8023e20708b4567bf6f66db1b6b7cbb5a51210513acc63852a3035d90202b48e231241c70ae750d291ca16ab5d1b4daab591be60519b8b7d132362129a89ae164c41b238eb63448167ff7e5c70ea40ff9a97ad6098fcd0f06dc5957adacd6549883cd3eb2eda99eee611156396b75e2ad0be7dd07582dc75b68140506740729e538df74c499fd99198a96c4f3304fdb2d440a04e7baff6736a00e351b4853e9b2a9fcceac0357c1ffc22f38dca55983e21f8a5291fe6c78014af0eed470e51b699fca525273e09d09d184b9de12bc61346310d0ed6b9b81232f61391933e34771e2f10a9f30c0b59d7e3c4fe0be9ffe8cd74384e44bb40a04170a1dd2db76f6323a1afe79841e9125920002cbf22be05045cc785ce4e19b0cca92a2e7aec5ae146fed35cab522ba07d677db85f68891ea7352b43e8048bda30fa3d040f5f9fa7f4811b7780cf6b7ad0f4ae1f712dd99c0297e3e736511f731afe2b0c6f7395fdb8f2f8c6cd1bf107d08201d098e527e3c31f820e2db65d21e73f9495ffeae67900aeebd8f4ca84ee188a295a4b111cac4526762722c6cd5d22090a3f4507f990682f750c8c5d6f840567853aec43f04c253730a0d9e4d88b6814ec76e36d57da5bef150fe837496013b495f110f07b59dfdc5229a7b3173305ddcbcb3f8d89cd68885c21bcfa8b08effbdbfb3da8f64bd1805b100093f1fa97be18aaddeaf7dffa65bb006f19acf4e6a7d7d7e6dff998a6cdbc02991a0138aa4063a423083a98ae11a21a731747aa94331a1580f80dd6cc0ed56fc5a7bd739a0f3d35c357ba6dd016a1ee6d65b3a075481312b0a3ab6cbdde67b61aef9f420374f5de236c0fe62cef5aeab2a7996d0631337dea454af0f8c6c3740d342f1a531c3e1bc7b79387f1060d9de73f6166c3992ba5926f64da093279381127d563255f665d24ccfdd9e8e56a767fafa42449ea4c384d84a1ae6bac1960db3d2ac2e6c91f40cf1ea7426117d212e07aca3be5af1594701759d4acbdf49cafe6a79013e3b9352b1f1857f617d4e1ce234c0433422848aeaa25e328c2cb2a13b6d4812939d4c8cd60d991046ff3717d2bb213cf5df4c35dcf7e607c74ddb7ab1039ecb335e26a2a665374388abe20820694f0f65cfba301d9cbc3242edcc3ea9520593e6272a7c6a22e77fee2859d81565d1264c9bd563f5ba6819c6b28cd36b8504d273a05e02696b312d411fa46df7d82fe772eba6b6ae7973261a4422233fc224f1a370cc1ded699eb34937c9b10ee9f2bc9f6533128f0064c0084c99156d31eb563e407cb33c43b57ace19d28ba4c1a10c9ab4865ddf78c34e5672f6903cfce36a0cb774ad9f22feea986cc6e2ff87c43e2c7ea781e708193acd5d437ef6489495d47ebef45e2e026b6ed9aea06864e4bc1d6c9c64efd9eceb35b688c6e1408540603c626fc18e48661a0891ac278088ed35256ff03e13c7c95624cb5045093ed1769a6605106b594162a077ee840238393b52280b1edd2f3cf75016046cce47b2df40d4a092ecbb660f4a694ec7127c08f99acd9fd55faeace2e170ca9db5294963d5b327903af83be9ad6db437daddc235a66893acc2cb81dd80e28a1fe66b00c9020c81527c982ab7728e081d7fe2cfb81d00cfeb2e0f23b1d5722c3b8a953edb6ee69820db219a4340d132c12c14984aa89e3bdaca00fb26872a9839c92f6a5fc14953427f1df353c0401a6b07f983b2ef49bfc1bf286f033f12b661cac2ee1ea53e9aff8f139cb099e2a963381bf9ba990943e7340fe812a4316ffab6d531e0c0cb55a1348cff2274bfc5f0e80263284fe6af95523bcf195f8fa94eb4f19b6cbafb6c6e950f8370f9e0575c3f3427c5b8e9eb1341368ae117344da3ed9d948c3cd3c8afdb249064cf4c48ed643baf597d19dfa9288883327529444289618406ee5d4fab2d538ec49f0b7eec809f61ac457f749f2fb720d321757473afc5d3a377a0eaacb425e5591026e3a1bae6a785b921903c804dcb8ec220c77e8752e92b80a482f89721feebcba45e533b9ae8ae80091cc940d2eb29003324aa3a8f2f66b072fdd8ffd03f42778dd64b2a428bed433f018e9acce76d85b57240f0050b1cb011459414b81125bdea35d2b067fa0baac925d3b4c52922f6ae9b88d03ae61427894074fd63dd5d45c2622ef5909cd05cb172e0b6441810fe2686ca03b82917bee3d8c0e35909b3b61d45a72045d90302ffcffcc9d21cfe43261b4eb1073aed1d26f4bfed20ffecb903c6875a0f196e43b9237115f69db66db5425b00ad835eeb5a7bba444225d3f57dcd14ca74c4d7c8e95885c13803fe25dce33b1b346a32d08757f90f47e52f1392429899fe420739965581f520b79f13a2e6342824593076b66fc477b5a6c7ba4b0d59ee35fcc63dc902addb371f61de0f338f5003b72182efab63a416cf6493ae16a0f2a058db7c8947509804a40b2e2bb394ba5beccd9f38f31dbdf1cace45c646b4ccc7bf109fde0cb3570fae67adff4c8a8fb360fc739b2f3cebcffecd7998 Out = 0da901366899d382754b7f99a6aeba660b407dbd383f49514ffecea5254ddda1ed926bbbb50b9ce12455cd5e94f57573 [SHA-3(512)] In = Out = a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26 In = e5 Out = 150240baf95fb36f8ccb87a19a41767e7aed95125075a2b2dbba6e565e1ce8575f2b042b62e29a04e9440314a821c6224182964d8b557b16a492b3806f4c39c1 In = ef26 Out = 809b4124d2b174731db14585c253194c8619a68294c8c48947879316fef249b1575da81ab72aad8fae08d24ece75ca1be46d0634143705d79d2f5177856a0437 In = 37d518 Out = 4aa96b1547e6402c0eee781acaa660797efe26ec00b4f2e0aec4a6d10688dd64cbd7f12b3b6c7f802e2096c041208b9289aec380d1a748fdfcd4128553d781e3 In = fc7b8cda Out = 58a5422d6b15eb1f223ebe4f4a5281bc6824d1599d979f4c6fe45695ca89014260b859a2d46ebf75f51ff204927932c79270dd7aef975657bb48fe09d8ea008e In = 4775c86b1c Out = ce96da8bcd6bc9d81419f0dd3308e3ef541bc7b030eee1339cf8b3c4e8420cd303180f8da77037c8c1ae375cab81ee475710923b9519adbddedb36db0c199f70 In = 71a986d2f662 Out = def6aac2b08c98d56a0501a8cb93f5b47d6322daf99e03255457c303326395f765576930f8571d89c01e727cc79c2d4497f85c45691b554e20da810c2bc865ef In = ec83d707a1414a Out = 84fd3775bac5b87e550d03ec6fe4905cc60e851a4c33a61858d4e7d8a34d471f05008b9a1d63044445df5a9fce958cb012a6ac778ecf45104b0fcb979aa4692d In = af53fa3ff8a3cfb2 Out = 03c2ac02de1765497a0a6af466fb64758e3283ed83d02c0edb3904fd3cf296442e790018d4bf4ce55bc869cebb4aa1a799afc9d987e776fef5dfe6628e24de97 In = 3d6093966950abd846 Out = 53e30da8b74ae76abf1f65761653ebfbe87882e9ea0ea564addd7cfd5a6524578ad6be014d7799799ef5e15c679582b791159add823b95c91e26de62dcb74cfa In = 1ca984dcc913344370cf Out = 6915ea0eeffb99b9b246a0e34daf3947852684c3d618260119a22835659e4f23d4eb66a15d0affb8e93771578f5e8f25b7a5f2a55f511fb8b96325ba2cd14816 In = fc7b8cdadebe48588f6851 Out = c8439bb1285120b3c43631a00a3b5ac0badb4113586a3dd4f7c66c5d81012f7412617b169fa6d70f8e0a19e5e258e99a0ed2dcfa774c864c62a010e9b90ca00d In = ecb907adfb85f9154a3c23e8 Out = 94ae34fed2ef51a383fb853296e4b797e48e00cad27f094d2f411c400c4960ca4c610bf3dc40e94ecfd0c7a18e418877e182ca3ae5ca5136e2856a5531710f48 In = d91a9c324ece84b072d0753618 Out = fb1f06c4d1c0d066bdd850ab1a78b83296eba0ca423bb174d74283f46628e6095539214adfd82b462e8e9204a397a83c6842b721a32e8bb030927a568f3c29e6 In = c61a9188812ae73994bc0d6d4021 Out = 069e6ab1675fed8d44105f3b62bbf5b8ff7ae804098986879b11e0d7d9b1b4cb7bc47aeb74201f509ddc92e5633abd2cbe0ddca2480e9908afa632c8c8d5af2a In = a6e7b218449840d134b566290dc896 Out = 3605a21ce00b289022193b70b535e6626f324739542978f5b307194fcf0a5988f542c0838a0443bb9bb8ff922a6a177fdbd12cf805f3ed809c48e9769c8bbd91 In = 054095ba531eec22113cc345e83795c7 Out = f3adf5ccf2830cd621958021ef998252f2b6bc4c135096839586d5064a2978154ea076c600a97364bce0e9aab43b7f1f2da93537089de950557674ae6251ca4d In = 5b1ec1c4e920f5b995b6a788b6e989ac29 Out = 135eea17ca4785482c19cd668b8dd2913216903311fa21f6b670b9b573264f8875b5d3c071d92d63556549e523b2af1f1a508bd1f105d29a436f455cd2ca1604 In = 133b497b00932773a53ba9bf8e61d59f05f4 Out = 783964a1cf41d6d210a8d7c81ce6970aa62c9053cb89e15f88053957ecf607f42af08804e76f2fbdbb31809c9eefc60e233d6624367a3b9c30f8ee5f65be56ac In = 88c050ea6b66b01256bda299f399398e1e3162 Out = 6bf7fc8e9014f35c4bde6a2c7ce1965d9c1793f25c141021cc1c697d111363b3854953c2b4009df41878b5558e78a9a9092c22b8baa0ed6baca005455c6cca70 In = d7d5363350709e96939e6b68b3bbdef6999ac8d9 Out = 7a46beca553fffa8021b0989f40a6563a8afb641e8133090bc034ab6763e96d7b7a0da4de3abd5a67d8085f7c28b21a24aefb359c37fac61d3a5374b4b1fb6bb In = 54746a7ba28b5f263d2496bd0080d83520cd2dc503 Out = d77048df60e20d03d336bfa634bc9931c2d3c1e1065d3a07f14ae01a085fe7e7fe6a89dc4c7880f1038938aa8fcd99d2a782d1bbe5eec790858173c7830c87a2 In = 73df7885830633fc66c9eb16940b017e9c6f9f871978 Out = 0edee1ea019a5c004fd8ae9dc8c2dd38d4331abe2968e1e9e0c128d2506db981a307c0f19bc2e62487a92992af77588d3ab7854fe1b68302f796b9dcd9f336df In = 14cb35fa933e49b0d0a400183cbbea099c44995fae1163 Out = af2ef4b0c01e381b4c382208b66ad95d759ec91e386e953984aa5f07774632d53b581eba32ed1d369c46b0a57fee64a02a0e5107c22f14f2227b1d11424becb5 In = 75a06869ca2a6ea857e26e78bb78a139a671ccb098d8205a Out = 88be1934385522ae1d739666f395f1d7f99978d62883a261adf5d618d012dfab5224575634446876b86b3e5f7609d397d338a784b4311027b1024ddfd4995a0a In = b413ab364dd410573b53f4c2f28982ca07061726e5d999f3c2 Out = 289e889b25f9f38facfccf3bdbceea06ef3baad6e9612b7232cd553f4884a7a642f6583a1a589d4dcb2dc771f1ff6d711b85f731145a89b100680f9a55dcbb3f In = d7f9053984213ebabc842fd8ce483609a9af5dc140ecdbe63336 Out = f167cb30e4bacbdc5ed53bc615f8c9ea19ad4f6bd85ca0ff5fb1f1cbe5b576bda49276aa5814291a7e320f1d687b16ba8d7daab2b3d7e9af3cd9f84a1e9979a1 In = 9b7f9d11be48e786a11a472ab2344c57adf62f7c1d4e6d282074b6 Out = 82fa525d5efaa3cce39bffef8eee01afb52067097f8965cde71703345322645eae59dbaebed0805693104dfb0c5811c5828da9a75d812e5562615248c03ff880 In = 115784b1fccfabca457c4e27a24a7832280b7e7d6a123ffce5fdab72 Out = ec12c4ed5ae84808883c5351003f7e26e1eaf509c866b357f97472e5e19c84f99f16dbbb8bfff060d6c0fe0ca9c34a210c909b05f6a81f441627ce8e666f6dc7 In = c3b1ad16b2877def8d080477d8b59152fe5e84f3f3380d55182f36eb5f Out = 4b9144edeeec28fd52ba4176a78e080e57782d2329b67d8ac8780bb6e8c2057583172af1d068922feaaff759be5a6ea548f5db51f4c34dfe7236ca09a67921c7 In = 4c66ca7a01129eaca1d99a08dd7226a5824b840d06d0059c60e97d291dc4 Out = 567c46f2f636223bd5ed3dc98c3f7a739b42898e70886f132eac43c2a6fadabe0dd9f1b6bc4a9365e5232295ac1ac34701b0fb181d2f7f07a79d033dd426d5a2 In = 481041c2f56662316ee85a10b98e103c8d48804f6f9502cf1b51cfa525cec1 Out = 46f0058abe678195b576df5c7eb8d739468cad1908f7953ea39c93fa1d96845c38a2934d23804864a8368dae38191d983053ccd045a9ab87ef2619e9dd50c8c1 In = 7c1688217b313278b9eae8edcf8aa4271614296d0c1e8916f9e0e940d28b88c5 Out = 627ba4de74d05bb6df8991112e4d373bfced37acde1304e0f664f29fa126cb497c8a1b717b9929120883ec8898968e4649013b760a2180a9dc0fc9b27f5b7f3b In = 785f6513fcd92b674c450e85da22257b8e85bfa65e5d9b1b1ffc5c469ad337d1e3 Out = 5c11d6e4c5c5f76d26876c5976b6f555c255c785b2f28b6700ca2d8b3b3fa585636239277773330f4cf8c5d5203bcc091b8d47e7743bbc0b5a2c54444ee2acce In = 34f4468e2d567b1e326c0942970efa32c5ca2e95d42c98eb5d3cab2889490ea16ee5 Out = 49adfa335e183c94b3160154d6698e318c8b5dd100b0227e3e34cabea1fe0f745326220f64263961349996bbe1aae9054de6406e8b350408ab0b9f656bb8daf7 In = 53a0121c8993b6f6eec921d2445035dd90654add1298c6727a2aed9b59bafb7dd62070 Out = 918b4d92e1fcb65a4c1fa0bd75c562ac9d83186bb2fbfae5c4784de31a14654546e107df0e79076b8687bb3841c83ba9181f9956cd43428ba72f603881b33a71 In = d30fa4b40c9f84ac9bcbb535e86989ec6d1bec9b1b22e9b0f97370ed0f0d566082899d96 Out = 39f104c1da4af314d6bceb34eca1dfe4e67484519eb76ba38e4701e113e6cbc0200df86e4439d674b0f42c72233360478ba5244384d28e388c87aaa817007c69 In = f34d100269aee3ead156895e8644d4749464d5921d6157dffcbbadf7a719aee35ae0fd4872 Out = 565a1dd9d49f8ddefb79a3c7a209f53f0bc9f5396269b1ce2a2b283a3cb45ee3ae652e4ca10b26ced7e5236227006c94a37553db1b6fe5c0c2eded756c896bb1 In = 12529769fe5191d3fce860f434ab1130ce389d340fca232cc50b7536e62ad617742e022ea38a Out = daee10e815fff0f0985d208886e22f9bf20a3643eb9a29fda469b6a7dcd54b5213c851d6f19338d63688fe1f02936c5dae1b7c6d5906a13a9eeb934400b6fe8c In = b2e3a0eb36bf16afb618bfd42a56789179147effecc684d8e39f037ec7b2d23f3f57f6d7a7d0bb Out = 04029d6d9e8e394afa387f1d03ab6b8a0a6cbab4b6b3c86ef62f7142ab3c108388d42cb87258b9e6d36e5814d8a662657cf717b35a5708365e8ec0396ec5546b In = 25c4a5f4a07f2b81e0533313664bf615c73257e6b2930e752fe5050e25ff02731fd2872f4f56f727 Out = ec2d38e5bb5d7b18438d5f2029c86d05a03510db0e66aa299c28635abd0988c58be203f04b7e0cc25451d18f2341cd46f8705d46c2066dafab30d90d63bf3d2c In = 134bb8e7ea5ff9edb69e8f6bbd498eb4537580b7fba7ad31d0a09921237acd7d66f4da23480b9c1222 Out = 8f966aef96831a1499d63560b2578021ad970bf7557b8bf8078b3e12cefab122fe71b1212dc704f7094a40b36b71d3ad7ce2d30f72c1baa4d4bbccb3251198ac In = f793256f039fad11af24cee4d223cd2a771598289995ab802b5930ba5c666a24188453dcd2f0842b8152 Out = 22c3d9712535153a3e206b1033929c0fd9d937c39ba13cf1a6544dfbd68ebc94867b15fda3f1d30b00bf47f2c4bf41dabdeaa5c397dae901c57db9cd77ddbcc0 In = 23cc7f9052d5e22e6712fab88e8dfaa928b6e015ca589c3b89cb745b756ca7c7634a503bf0228e71c28ee2 Out = 6ecf3ad6064218ee101a555d20fab6cbeb6b145b4eeb9c8c971fc7ce05581a34b3c52179590e8a134be2e88c7e549875f4ff89b96374c6995960de3a5098cced In = a60b7b3df15b3f1b19db15d480388b0f3b00837369aa2cc7c3d7315775d7309a2d6f6d1371d9c875350dec0a Out = 8d651605c6b32bf022ea06ce6306b2ca6b5ba2781af87ca2375860315c83ad88743030d148ed8d73194c461ec1e84c045fc914705747614c04c8865b51da94f7 In = 2745dd2f1b215ea509a912e5761cccc4f19fa93ba38445c528cb2f099de99ab9fac955baa211fd8539a671cdb6 Out = 4af918eb676ce278c730212ef79d818773a76a43c74d643f238e9b61acaf4030c617c4d6b3b7514c59b3e5e95d82e1e1e35443e851718b13b63e70b123d1b72c In = 88adee4b46d2a109c36fcfb660f17f48062f7a74679fb07e86cad84f79fd57c86d426356ec8e68c65b3caa5bc7ba Out = 6257acb9f589c919c93c0adc4e907fe011bef6018fbb18e618ba6fcc8cbc5e40641be589e86dbb0cf7d7d6bf33b98d8458cce0af7857f5a7c7647cf350e25af0 In = 7d40f2dc4af3cfa12b00d64940dc32a22d66d81cb628be2b8dda47ed6728020d55b695e75260f4ec18c6d74839086a Out = 5c46c84a0a02d898ed5885ce99c47c77afd29ae015d027f2485d630f9b41d00b7c1f1faf6ce57a08b604b35021f7f79600381994b731bd8e6a5b010aeb90e1eb In = 3689d8836af0dc132f85b212eb670b41ecf9d4aba141092a0a8eca2e6d5eb0ba4b7e61af9273624d14192df7388a8436 Out = 17355e61d66e40f750d0a9a8e8a88cd6f9bf6070b7efa76442698740b4487ea6c644d1654ef16a265204e03084a14cafdccf8ff298cd54c0b4009967b6dd47cc In = 58ff23dee2298c2ca7146227789c1d4093551047192d862fc34c1112d13f1f744456cecc4d4a02410523b4b15e598df75a Out = aca89aa547c46173b4b2a380ba980da6f9ac084f46ac9ddea5e4164aeef31a9955b814a45aec1d8ce340bd37680952c5d68226dda1cac2677f73c9fd9174fd13 In = 67f3f23df3bd8ebeb0096452fe4775fd9cc71fbb6e72fdcc7eb8094f42c903121d0817a927bcbabd3109d5a70420253deab2 Out = f4207cc565f266a245f29bf20b95b5d9a83e1bb68ad988edc91faa25f25286c8398bac7dd6628259bff98f28360f263dfc54c4228bc437c5691de1219b758d9f In = a225070c2cb122c3354c74a254fc7b84061cba33005cab88c409fbd3738ff67ce23c41ebef46c7a61610f5b93fa92a5bda9569 Out = e815a9a4e4887be014635e97958341e0519314b3a3289e1835121b153b462272b0aca418be96d60e5ab355d3eb463697c0191eb522b60b8463d89f4c3f1bf142 In = 6aa0886777e99c9acd5f1db6e12bda59a807f92411ae99c9d490b5656acb4b115c57beb3c1807a1b029ad64be1f03e15bafd91ec Out = 241f2ebaf7ad09e173b184244e69acd7ebc94774d0fa3902cbf267d4806063b044131bcf4af4cf180eb7bd4e7960ce5fe3dc6aebfc6b90eec461f414f79a67d9 In = 6a06092a3cd221ae86b286b31f326248270472c5ea510cb9064d6024d10efee7f59e98785d4f09da554e97cdec7b75429d788c112f Out = d14a1a47f2bef9e0d4b3e90a6be9ab5893e1110b12db38d33ffb9a61e1661aecc4ea100839cfee58a1c5aff72915c14170dd99e13f71b0a5fc1985bf43415cb0 In = dfc3fa61f7fffc7c88ed90e51dfc39a4f288b50d58ac83385b58a3b2a3a39d729862c40fcaf9bc308f713a43eecb0b72bb9458d204ba Out = 947bc873dc41df195f8045deb6ea1b840f633917e79c70a88d38b8862197dc2ab0cc6314e974fb5ba7e1703b22b1309e37bd430879056bdc166573075a9c5e04 In = 52958b1ff0049efa5d050ab381ec99732e554dcd03725da991a37a80bd4756cf65d367c54721e93f1e0a22f70d36e9f841336956d3c523 Out = 9cc5aad0f529f4bac491d733537b69c8ec700fe38ab423d815e0927c8657f9cb8f4207762d816ab697580122066bc2b68f4177335d0a6e9081540779e572c41f In = 302fa84fdaa82081b1192b847b81ddea10a9f05a0f04138fd1da84a39ba5e18e18bc3cea062e6df92ff1ace89b3c5f55043130108abf631e Out = 8c8eaae9a445643a37df34cfa6a7f09deccab2a222c421d2fc574bbc5641e504354391e81eb5130280b1226812556d474e951bb78dbdd9b77d19f647e2e7d7be In = b82f500d6bc2dddcdc162d46cbfaa5ae64025d5c1cd72472dcd2c42161c9871ce329f94df445f0c8aceecafd0344f6317ecbb62f0ec2223a35 Out = 55c69d7accd179d5d9fcc522f794e7af5f0eec7198ffa39f80fb55b866c0857ff3e7aeef33e130d9c74ef90606ca821d20b7608b12e6e561f9e6c7122ace3db0 In = 86da9107ca3e16a2b58950e656a15c085b88033e79313e2c0f92f99f06fa187efba5b8fea08eb7145f8476304180dd280f36a072b7eac197f085 Out = 0d3b1a0459b4eca801e0737ff9ea4a12b9a483a73a8a92742a93c297b7149326bd92c1643c8177c8924482ab3bbd916c417580cc75d3d3ae096de531bc5dc355 In = 141a6eafe157053e780ac7a57b97990616ce1759ed132cb453bcdfcabdbb70b3767da4eb94125d9c2a8d6d20bfaeacc1ffbe49c4b1bb5da7e9b5c6 Out = bdbdd5b94cdc89466e7670c63ba6a55b58294e93b351261a5457bf5a40f1b5b2e0acc7fceb1bfb4c8872777eeeaff7927fd3635ca18c996d870bf86b12b89ba5 In = 6e0c65ee0943e34d9bbd27a8547690f2291f5a86d713c2be258e6ac16919fe9c4d491895d3a961bb97f5fac255891a0eaa18f80e1fa1ebcb639fcfc1 Out = 39ebb992b8d39daae973e3813a50e9e79a67d8458a6f17f97a6dd30dd7d11d95701a11129ffeaf7d45781b21cac0c4c034e389d7590df5beeb9805072d0183b9 In = 57780b1c79e67fc3beaabead4a67a8cc98b83fa7647eae50c8798b96a516597b448851e93d1a62a098c4767333fcf7b463ce91edde2f3ad0d98f70716d Out = 3ef36c3effad6eb5ad2d0a67780f80d1b90efcb74db20410c2261a3ab0f784429df874814748dc1b6efaab3d06dd0a41ba54fce59b67d45838eaa4aa1fadfa0f In = bcc9849da4091d0edfe908e7c3386b0cadadb2859829c9dfee3d8ecf9dec86196eb2ceb093c5551f7e9a4927faabcfaa7478f7c899cbef4727417738fc06 Out = 1fcd8a2c7b4fd98fcdc5fa665bab49bde3f9f556aa66b3646638f5a2d3806192f8a33145d8d0c535c85adff3cc0ea3c2715b33cec9f8886e9f4377b3632e9055 In = 05a32829642ed4808d6554d16b9b8023353ce65a935d126602970dba791623004dede90b52ac7f0d4335130a63cba68c656c139989614de20913e83db320db Out = 49d8747bb53ddde6d1485965208670d1130bf35619d7506a2f2040d1129fcf0320207e5b36fea083e84ffc98755e691ad8bd5dc66f8972cb9857389344e11aad In = 56ac4f6845a451dac3e8886f97f7024b64b1b1e9c5181c059b5755b9a6042be653a2a0d5d56a9e1e774be5c9312f48b4798019345beae2ffcc63554a3c69862e Out = 5fde5c57a31febb98061f27e4506fa5c245506336ee90d595c91d791a5975c712b3ab9b3b5868f941db0aeb4c6d2837c4447442f8402e0e150a9dc0ef178dca8 In = 8a229f8d0294fe90d4cc8c875460d5d623f93287f905a999a2ab0f9a47046f78ef88b09445c671189c59388b3017cca2af8bdf59f8a6f04322b1701ec08624ab63 Out = 16b0fd239cc632842c443e1b92d286dd519cfc616a41f2456dd5cddebd10703c3e9cb669004b7f169bb4f99f350ec96904b0e8dd4de8e6be9953dc892c65099f In = 87d6aa9979025b2437ea8159ea1d3e5d6f17f0a5b913b56970212f56de7884840c0da9a72865e1892aa780b8b8f5f57b46fc070b81ca5f00eee0470ace89b1e1466a Out = d816acf1797decfe34f4cc49e52aa505cc59bd17fe69dc9543fad82e9cf96298183021f704054d3d06adde2bf54e82a090a57b239e88daa04cb76c4fc9127843 In = 0823616ab87e4904308628c2226e721bb4169b7d34e8744a0700b721e38fe05e3f813fe4075d4c1a936d3a33da20cfb3e3ac722e7df7865330b8f62a73d9119a1f2199 Out = e1da6be4403a4fd784c59be4e71c658a78bb8c5d7d571c5e816fbb3e218a4162f62de1c285f3779781cb5506e29c94e1b7c7d65af2aa71ea5c96d9585b5e45d5 In = 7d2d913c2460c09898b20366ae34775b1564f10edea49c073cebe41989bb93f38a533af1f425d3382f8aa40159b567358ee5a73b67df6d0dc09c1c92bf3f9a28124ab07f Out = 3aa1e19a52b86cf414d977768bb535b7e5817117d436b4425ec8d775e8cb0e0b538072213884c7ff1bb9ca9984c82d65cb0115cc07332b0ea903e3b38650e88e In = fca5f68fd2d3a52187b349a8d2726b608fccea7db42e906b8718e85a0ec654fac70f5a839a8d3ff90cfed7aeb5ea9b08f487fc84e1d9f7fb831dea254468a65ba18cc5a126 Out = 2c74f846ecc722ea4a1eb1162e231b6903291fffa95dd5e1d17dbc2c2be7dfe549a80dd34487d714130ddc9924aed904ad55f49c91c80ceb05c0c034dae0a0a4 In = 881ff70ca34a3e1a0e864fd2615ca2a0e63def254e688c37a20ef6297cb3ae4c76d746b5e3d6bb41bd0d05d7df3eeded74351f4eb0ac801abe6dc10ef9b635055ee1dfbf4144 Out = 9a10a7ce23c0497fe8783927f833232ae664f1e1b91302266b6ace25a9c253d1ecab1aaaa62f865469480b2145ed0e489ae3f3f9f7e6da27492c81b07e606fb6 In = b0de0430c200d74bf41ea0c92f8f28e11b68006a884e0d4b0d884533ee58b38a438cc1a75750b6434f467e2d0cd9aa4052ceb793291b93ef83fd5d8620456ce1aff2941b3605a4 Out = 9e9e469ca9226cd012f5c9cc39c96adc22f420030fcee305a0ed27974e3c802701603dac873ae4476e9c3d57e55524483fc01adaef87daa9e304078c59802757 In = 0ce9f8c3a990c268f34efd9befdb0f7c4ef8466cfdb01171f8de70dc5fefa92acbe93d29e2ac1a5c2979129f1ab08c0e77de7924ddf68a209cdfa0adc62f85c18637d9c6b33f4ff8 Out = b018a20fcf831dde290e4fb18c56342efe138472cbe142da6b77eea4fce52588c04c808eb32912faa345245a850346faec46c3a16d39bd2e1ddb1816bc57d2da In = 664ef2e3a7059daf1c58caf52008c5227e85cdcb83b4c59457f02c508d4f4f69f826bd82c0cffc5cb6a97af6e561c6f96970005285e58f21ef6511d26e709889a7e513c434c90a3cf7448f0caeec7114c747b2a0758a3b4503a7cf0c69873ed31d94dbef2b7b2f168830ef7da3322c3d3e10cafb7c2c33c83bbf4c46a31da90cff3bfd4ccc6ed4b310758491eeba603a76 Out = e5825ff1a3c070d5a52fbbe711854a440554295ffb7a7969a17908d10163bfbe8f1d52a676e8a0137b56a11cdf0ffbb456bc899fc727d14bd8882232549d914e In = 991c4e7402c7da689dd5525af76fcc58fe9cc1451308c0c4600363586ccc83c9ec10a8c9ddaec3d7cfbd206484d09634b9780108440bf27a5fa4a428446b3214fa17084b6eb197c5c59a4e8df1cfc521826c3b1cbf6f4212f6bfb9bc106dfb5568395643de58bffa2774c31e67f5c1e7017f57caadbb1a56cc5b8a5cf9584552e17e7af9542ba13e9c54695e0dc8f24eddb93d5a3678e10c8a80ff4f27b677d40bef5cb5f9b3a659cc4127970cd2c11ebf22d514812dfefdd73600dfc10efba38e93e5bff47736126043e50f8b9b941e4ec3083fb762dbf15c86 Out = cd0f2a48e9aa8cc700d3f64efb013f3600ebdbb524930c682d21025eab990eb6d7c52e611f884031fafd9360e5225ab7e4ec24cbe97f3af6dbe4a86a4f068ba7 In = 22e1df25c30d6e7806cae35cd4317e5f94db028741a76838bfb7d5576fbccab001749a95897122c8d51bb49cfef854563e2b27d9013b28833f161d520856ca4b61c2641c4e184800300aede3518617c7be3a4e6655588f181e9641f8df7a6a42ead423003a8c4ae6be9d767af5623078bb116074638505c10540299219b0155f45b1c18a74548e4328de37a911140531deb6434c534af2449c1abe67e18030681a61240225f87ede15d519b7ce2500bccf33e1364e2fbe6a8a2fe6c15d73242610ed36b0740080812e8902ee531c88e0359020797cbdd1fb78848ae6b5105961d05cdddb8af5fef21b02db94c9810464b8d3ea5f047b94bf0d23931f12df37e102b603cd8e5f5ffa83488df257ddde110106262e0ef16d7ef213e7b49c69276d4d048f Out = a6375ff04af0a18fb4c8175f671181b4cf79653a3d70847c6d99694b3f5d41601f1dbef809675c63cac4ec83153b1c78131a7b61024ce36244f320ab8740cb7e In = 8237ce9396ccde3a616754414cdf7b5a958c1eb7f25a48c2781b4e0dba220f8c350d7b02ece252b94f5e2e766189c4ac1a8e67f00acacead402316196a9b0a673e24a33f18b7cb6be4a066d33e1c93abd8252feb1c8d9cff134ac0c0861150a463264e316172d0b8e7d6043f2bbf71bf97fa7f9070ca3a21b93853ec55ab67a96db884c2113bea0822a70ea46f9ae5501eb55ec74eaa3179fa96d7842092d9e023844ed96f3c9fc35bbc8ee953d677c636fdd578fd5507719e0c55702fed2eaf4f32b35ec29a7a515bbc8bf61f9baf89a77aeb8bc6f247706c41d398cae5ec80b76abc3a5380001aea500eb31b10160139d5a8e8f1a976dd2dde5ce439a29dba24d370536a14bb87cf201e088e5e3397b3b61477c6a41e22a98af53cc34bc8c55f15d7924e7e32fed4d3c3ddc2ac8eb1dfc438218c08c6a6a8eea888b208f6092dd9f9df49e7ede8bf11051afd23b0b983a81bcc8d00f7d1f2b27cb04c03aeee59c7df23a17775ae5984eda7 Out = f08819ec3a9a9806a1f55be4f0e56bce084e66fa271784974bf80e1bed7b2be559ebf5b6396ce52f7db7ef45543965f83064095a70328489178718b491a4100d In = cfa6c0413dfc1a619417ac3f80fd38247b56941da8c2adf3ff70cc5dabed1875b0395d69d1200b73b1c7820b38868c5b38f52bf3514a96be12e27e34601d95d21c6f51c700b4edf1cac4b2079d487418a4cc5f34f815f469c4b44ef1a7dbaaa9597026c59260c9c22736c49d76ecf7430500b74866cbcfdb5e0fc4fa46cf5ee2b06363ca4ecba6d0104440348d191ec4a4bcbc9763152ffe271a69b805a0b9656970913dfd9e8c02cd16af33a878f083c926f48ab79b1db969fec493aef6c31accc1378867808440a5d5990490b07568bc66e9872904a0f46ae25ef4077b85ea217bdd12541a9472e2a9840e0d6ab55cc4a523f782f8c19774efbd41dad506bbafc90c438c14c780cab9fab9e74eb9452a0b29438a21878bcd4c6be4edac4e77bfd14a83d6152253a62e826de503880d37bf82d10924fab6bd23f04308a9660499bb223afcc5afd1bd2fa592d0322a9a30eab90bc7ac22018e99d2c8f573554c85b019d0c4cd75e359e5e9907082a8d660b353588b5f085486d89bd97bb32335cbd8b9adf7d57c72c078d9d08d9c09a70e43da1f1fe5b398ef08d2e06111d9a9b25a893a5d84cd643b0ffab8ef2755f781c1d6ca49 Out = 3a4c2c9284c90515cb34a0895d0374e87467ffbbc7c1dda3239893a12aeae3b9951169fe85605ef7aa2c483662f3a65c72ff12becde50c23ec6a2bc8864c27c1 In = 43025615521d66fe8ec3a3f8ccc5abfab870a462c6b3d1396b8462b98c7f910c37d0ea579154eaf70ffbcc0be971a032ccfd9d96d0a9b829a9a3762e21e3fefcc60e72fedf9a7fffa53433a4b05e0f3ab05d5eb25d52c5eab1a71a2f54ac79ff5882951326394d9db83580ce09d6219bca588ec157f71d06e957f8c20d242c9f55f5fc9d4d777b59b0c75a8edc1ffedc84b5d5c8a5e0eb05bb7db8f234913d6325304fa43c9d32bbf6b269ee1182cd85453eddd12f55556d8edf02c4b13cd4d330f83531dbf2994cf0be56f59147b71f74b94be3dd9e83c8c9477c426c6d1a78de18564a12c0d99307b2c9ab42b6e3317befca0797029e9dd67bd1734e6c36d998565bfac94d1918a35869190d177943c1a8004445cace751c43a75f3d80517fc47cec46e8e382642d76df46dab1a3ddaeab95a2cf3f3ad70369a70f22f293f0cc50b03857c83cfe0bd5d23b92cd8788aac232291da60b4bf3b3788ae60a23b6169b50d7fe446e6ea73debfe1bb34dcb1db37fe2174a685954ebc2d86f102a590c24732bc5a1403d6876d2995fab1e2f6f4723d4a6727a8a8ed72f02a74ccf5f14b5c23d9525dbf2b5472e1345fd223b0846c707b06569650940650f75063b529814e514541a6715f879a875b4f08077517812841e6c5c732eed0c07c08595b9ff0a83b8ecc60b2f98d4e7c696cd616bb0a5ad52d9cf7b3a63a8cdf37212 Out = e7ba73407aa456aece211077d92087d5cd283e3868d284e07ed124b27cbc664a6a475a8d7b4cf6a8a4927ee059a2626a4f983923360145b265ebfd4f5b3c44fd In = e34acd510cb32ca5f97298a3829244bb23322229fd7a07821dd40a8d01582d5558873f7c0a3d00d278e1872605dfe15dd558fbc1d518c19bfbc88803cf64a9f72af06fab3d673420d6f5c6f8df65108927ddf63066c980e77b153b1af79fdcb7dfec2785ae1a0fb69a151fbf180e1867a229dc1eb8768a912523eb7b83f00dbe01e22db2643cdabd4cab5824b9c14320cda47435d40829bf815a5fce7a3e8333183c4adb67b6de5c751e3acec966d7dc31b7881ac165a29a182361bae573873faa6146a8c07160bc9cd68d6650e41dc254c8de788777404971e4b7e7cb76610a41b9e9c07654ab04493b199357255dfbc04140f52f244af414062afe342f59bb64acfbcc9146065d04b5a5fee410dfaefd887439bf5607c58af282a72986b77b9ca243731a31b8ef56acfb4e028dea04910742ed42f4c0e25a0f8789b063c2716f038a5e18fc0ae1c688e12cb684c725062474b9bde6be730cc4014dd4aec3c667379834938f445cddb120400addbf38e449d0443a1446a1297bb79a9a4f02a10ca6359e94d2ae87218f803105801866b1dd2037c066a393389b72190c2ec72be5b9294421ad8f8b1c8ac8a8af561ad6f7482a3958c41b73c18cfa7231345a8b7ad63bcd4508318f560bc24c11450fb13df1b7f30916f8664cb5174c114702ea536735e205cbdabc567834c632363d1e0c428e0ddb4480966280914fb5500970f9d2dd2a6bded33aa43be7bd1b12ed46eba2792ed636fc2b8a542f242438b544f381fc4e7e296430c8baa3dad2bf685062793efe03d4b34d4d99ba7366e54f8fc9da59f54694d4 Out = a1416054e488c1e013762d642b2c63361b33e4fc528149845606de20998bf2afec05da53067477a3c27ebb3c0d24ad3dd6ed390335977f129f1b6b1526c0e0c8 In = 0d542102f215c793f81cae2e79e5ae58b4439fa0d05577301eb6b2a19ff5f714c645f87e7e759a436f2256077d2bdec0926504109e90d8d3dc8a11f456c3af84abf1de0d10051c23955d9e3daa3bf0c3e176dd68f56f8eba0c47f6f7394f6d2345c09a57afad975cf135507905fd2c8828def04fdedae00e365527554f8178181b1bf605635551150b1332629859da38ef04066e5fb915f7e21c6cb4a0421a8cb568b8bf34e593776c5d0ea16a3841fabf52e66d83f4769c99048fbd357899a79c10a92c2b45a5aa9b7daadd8380aaf71e2f5af34f744b26e2755617150d3e90577c91f54f5dcfd520d9cebfec1b5d57970328a8cd1fdcbc46d78b6a48e751706e1338c2a915592184db44eeacefa241af37193604de70874c92f460d7f01a6e6a3c653a3f568ab54ee9d313cbe6c1ddf031f542fc9a50af7c0e5a9fc90ee0b3d261e2051b06acba066d42d652e70154e15a8477be39c55b5eb384cf262bed672ee975cc450f055735ce5ade48d9acce0a1a8d7a51a515b37bea3c99f72e87b0073ce737c357deb56274e3d4b5a60872f4dadaf6bdc488e05a1948a543fff7b9e3c2ffed9fc87efb15c7a55fa1355e69260031910b80680a83aa719a128685a84de38797e1492f52d62f6728156ef5db28f65bf342bffb587f037f206cab78a6ca0745dc8fc137e22e14f3d7183917ef832220c56a6b8bf3d58e3ae15a561adae4960365b31adfd2a4de0f13b37e0acdbeee47af8c6b5e030db16a82e36fb16d22f887d9543b6f4bc1f58484ed25179e61c19a58aea7bcafb0d6d6ae10de86860c9599e17b0c2f740bc119d3ce16868af502df69db07ef1f4564470be88be14e2bd503252f7566760cab98a85e3a9fb8011bdf8918733e7c54c38541735e09ed06218c4c785e5e784c19c7aaa677aa51 Out = 0cd249160510bdbc1a117600ed8dec1b68b541c684337ad39e8dcdf84bc7a9856cd8e210098e1ac47fabb3af0a4313a4a70f388b11ef53771651d95131936ce4 In = 802c4c6faa7e25b79a985cc98b972847a2dfef587e5f7205101646e4add583f46147c0c987303ee996f263753e556a0cb4875aec4a62345a42ee7145e427ab26ce009b2a8ca74393680b6c5b839c531b2551a02c52f0970c9e8a92034244af066e5ec6dbe16d9e7eb8eb60c483f24b3e9e45aa60bf9003e2cbf19267eeb6f55dea692924af0ab5722d9b25f666e2ba3bc76a60d0b8cbe0a6722b57b91005e7f2e929ac4c1e04f2376f22a53a53f108db47c8aac36627971e3a41cb41d2b7ec8f14a7389d55e5bc942788c6d772a99ee6c7677183f02e8e13cc3ad5465a566bfa13eab35d7d347a52fdd67217ec91e224ee509b567f682e4ccf1e5c12d06acefc8dfa07d5bd7a963998139040e9313d5d658a12853b5cdf93ecf54aeb5d797c5d2be01a4d3e3e7711a147089b90121858d31dbc574b920aaecbc8861a290ddde594a3d60d270885a2bf7ac2700abbd9dee1128316d8921566139ef8e65bad595c704b215ca16128b49bb5a5077fb4eab737704e0809e56a836c8088991be2588969e1e584d4cfc80edcff9ba71686b1ab7c3f047707126fcd80751e7a93324235256b09cbe7dccd792b618c99f7b8988258878fa9f9a18e0cf485a2d0e8287f284cf4757a03109fbd30e25e264bd205037551d6e7081a2e0773b8fce44549772a878111d84ff2a6a2928afa943a5d62f778a4c1785c06b687a31714fed01f93037e1cc52ff40a4bf0fa61482bebe016260c8938a61ced90542ca9d265b131397ad8cc79c519e0f46e0f70303587e38958d70723b771552336b7771f631107d2593d9a15e4e7fd0be57abe9bf835ee235581266af482c8d7f5ec87e13e182ac766578c81d286e8f61de2536fbd1e8a4ce4b3eef6a578cd145872e3023fed217e6acbada5d71d291fdef03896cc693e6ccf1568ad127aed4228f29368aeb974612c4402693dd449ecf04c74f66d3f93ebdc4e9b7882b1aec92d139dfdd3a3acd7766895b64ad4cfc71a9d0f79e8c81031d40790403f449b122f7e Out = 238726f9c46f44f3457be33cd360e9a369b31280ab718b01c4b8e324e40712f8911aa4220bc5f0e9023f47f48028fa37108dcc8938a34943775617eb129bf7a5 In = 1f93eb3cefd64eca5d7ec36cb7f21d768cd6854262ebc930a730f7eaea4e2bed4b32a54530fc1e973a185c6578aa058eda30b114e8634222b35d784e0c01c01bf5984dc255b86a32f06a0f55958bb29599735f9f85d50b660ce6266b40c26f3d050b0c3bc5d3daa165bc02c3785dcd93b3e8b969a10acc04981328ccec57e05962d40a39e81515ee83565d3788e8fd910fd7e4fca5cb2c02412ca7f67a89ba7af63b6e432645c421307f49392df4eb9595880be0f7ded36aee78ca735020a5a5a88761e2e72d8e405680ee52cf483eaa2d42549b010b6a448740bac9d8e44be460020a9d93931c55dca17309d6ad9fd5bf4fe7b72a1c9996f3cc9e83789d513e06f292fc92401567aa2a00e7abebb62033f5edbcd9d7076a1c649f269a1262bc83a020874cfc227fa863bf73b4ca2a92717d8e3078065dc7e950e53ca50c2464bd54ddc72a8eeba4be94d6355a12a433622ff19d6e6f42b642d7974d01533f409d56f04392c017ded4046db5058acb0cec523f8a23db5f3d0f43dddf15af5c580bed8283ed584f35d2fcad7c1efb4824f8309f80ff115c6738dae07c4be823b2f062bb10a41f3ab2a0c4bd110b2dc2846f0f3a066adbe039a6e5c8ab0ac53b5832fdc2711ddd815c26a4c6fc36e8e232373838a4ccff93bd3fabbdf5bb0f4d52bb06c02ec25acb3c4de4f0c605f450383af3c0e28d461efaec76e6e0c48e00a671c5dcd0fa5dc158fbcb62f6e218b39e5e87fa49157829f8968c6bf68e0afd5e3e823fde2cb00bba19a24514341db36a8d3e0f60cc5d5bc0233675bf814beb82098410e0c219506a90b1c0a863ccf9a6ae5e27af1bbc5d597dbc2cc205187318ba14785f2361386e4640fc3bd7eb2d59a93069bf685fd6cb8a66b787833b3d2a387a9fe2b7506dd025972154f742f78c66fcfe171c0c6f1f347c3e96617af0bf6dfeacf1e6ad949814fe567c2d9bfd46cc0a0e40a08cd05c6145eb78099e34e040e8c814184258ccfabcc33ae1bcea8fc5a1c0c05ba7a08afb0ae4b4e16fb394997f1ad4b5d55e76c11a9116796e646f390a3c21b42488b2e91351d253b412e3600ccbb8252f519d5060e8985e7913ef0e8eabea15cd2fda13a85b5ac637fcd57dd7 Out = d75e227a5ad2d3ea262dc663adac6e339126163ac683b3e62aff92653a3de00986329e4c6b79c0af3ed614a3d10135279b92d6f4100613f41feeaffa170bd098 In = 09ab78274714140e9e25d81ca9a1cb475945094f39fb2296f651bd311e29813f28b23579b597250b1576c8a30d93a1c7d7ce636b6bd258c3fd900356c7ec055408b53d294ddb3352efdcb76fdd80c59a9bc6acf88b1e6f8d6cd86c5520dd3b90b29dd95d9748068a3441ebaba1d00069ad172d1d2247309e4a133e56b165ed9c2d50513e1c47655ced8cad7de2ea1adc13a72e03b7b5609b9f28c28303ede11f81b8edf3633e1a7021a5450d2638db9ad760f7d1d2cfca2f73ff40029ddbe0c2b7bcf5a4f496eb6dd874fb84f8210b4c0128cfb0fbff3500cf8000fb0798b22dd643b07b58b8a1fc1ae0170add0d719997e900c8bbad68b6ba934997ca8d1f07e637679d160a04c4f0d3e0c65f64d62aa38ad040993f2cfa3d2065fd6d21eff8f07f6235b6f6db6e61359fe1058f02a62cf388411e1e49745f0f9a5778bbe9aafa03e969c1e3f0a176ec9d8357f4bdb63b0c6ff2d0b287cb284831ca74c5d7c20fab4461be39090636e11fd2defccf02d7bdcf7c3a63aea7a0b37180e8a67feb345fba46355fef44a9fc70f9210fff3108eeee06e19a85b2d039a4a15cc6a9cb73079440aebf6a04d726d71ea99616ecd68716b94fbdd591bfc01054588d1f0ad38b1b76b2c041eec9459b6afcf7ddda4a708dbd0b3666ef7531ffc26563a8515dd39411c8ca3ea986420504a49c19a46b919b399d6b0072fb75b7130ab00b4817c74a38794527de16065d1429eb95f142d28a558ec66bc25872816ed0dc11960b5084144c99c5348278ebc4114e186ad51ca03b64ad6e889412a4fb3e4f82e3415489cdc92fe054d17ff63ae62c69b72e552710aa8ad36cb83c6ae4dc7126d9bfbca28a786d40e50b05c89e2fed517f556765ffe5c46015cbd8194e32abc41e8f711773e2bcac9039f1a71975f8986a5038a32d9fc3de2cd5cdfa63c963265ab95a30b28e85edfd612bdcd33fb7062229b228c55fef1458df05554b28021236435e356c042ecbd38e9aaef31591624ce8bc3eedaeb0cc42ef67722ed7f1515937676dcccd210ebbc52867a17fee7693933d2bcd136ecc9210db98335f97ab6d9c5c21f770c47e5c10bc4e070636089c341f388f1691ddef47491082475be7177b2499187581e35f763eaa4a31d2e112d249ad583f81c7019e99234417a7cf01dba91d5565bf046b0097c4958928c99b76a3d25317a652711cb316a158e229d3c4d2f5d6c7e5aa29b4ade4 Out = 2c1182eee0a90b686a14e5c7f7bd47f89d44d531a53c84e88c459c1460ac7d2cc7922b7be672596d55654cb388cf9b3300a9f31f18fbb45f89a7dbee27ed462d In = 85ff5f072442756665a41f36cb2c99d3152f3458bfc3fcb5cc759901c33f7311f8b41a490c7ee4b2b70ad84dc582caa75ffcc8ae8cf1b5c3f8f03410f393c81cbcb3399c00d8398d9ef3477fad50d434c0c6a469683178f4fb22ea0f94d498f45b6284aa0738bb1ea1c735758a7efda1bff591325c6b8c6f5f7282a6afe92cc05d2bc5182986b38e48ef6ad764f38e17e5f157b16f873a5dab4ac67c4bbacca94875c2916eaa69041bd1ae4c4499cebdb822be8da96dcae668117c3a702fbfd7a6a744bbdf8c25a9a3d6c97c315707bcc2f18e6f120584311d2e6d8726304f71fe2b133e83152fa46766821033157f3b8bc48efeb338af67520b610c76a5c29fd968f7c3632bce1eefeaa2b052bb8063990487e393ec95af900f20716776618bbec6b8f285b74c3fc4c8f2039732505b761a42c5ba0a7c325da2715d028b745a35ad1d72f3a2ef2e6d6a37b20960374caa6c844d317bad18442c1d784ecc4337c685f0ecb5d2001472363c64b02e7f5ebb641823ff257088ca15ed6b53221548fab6f707d131c6185c96c8c295846eb83369c5ee2cf20daa79c6a6de197334b558a8fb6c51a68b63b2f1a274bf4b4e839ae25256c1c9cba7d8a51378a9a9e6a769c4c3c23c18951cfcaf9321366965e676398805c591f3a76f1bfbe20aaa7446b37019b29b712e6cc337637103c8fc0a51d52fa04034cdd1c79125c4446026b9c015c3e475989c7b8df3da0e2d4e5a17b21e0fd23b99a14e676d5ac460b14329181c8affd2752770e54abf9dbce5c934227cef40bca8b746d718628d658715bd41eb36acbbf0197450a4dcc9b9748f8928579895ce4956e0a0fb05c55bc9e29ec5ec8f9236f1b8ae5869f7372be3f53f4c17d3777664c844497d0b154a5ff3f32c865c5a4e604e478402d9921a1a437e1624668fbee1539b5a053b243b3090e5fc2067ab082521665cd54a808f00c16d0fe71984ada8400d5cfd5e9b3526009cbf24762e6e287934694b12a9907fb735bec6b6fe4ba2d7c1d6cc3c2141288d3ffcf9528a8752a0d932cdf8b7287e6cfdab2a03a7a1b55fe050da9d5f661f7df63c07c3685b89dd7c40c1c54f5ce629ee5f7cca24b6ca2291528f49fcacf119eb06b69170f3b677451990411b369d36306122d12093ca66fd655307a11b87a943e26e834956c2b75d47a334c3bd8cdbea3986e1413e9b744b108ea1f6bcc975295897629c8c93e5ec526166eff99b6045700ec12fc12794a4dca8dda2969fc4c3f199f6109e134919c0319f46f3b30c688d243b9324540d305009844eb1f2e03934dc074e93282a0d1b7da670b2ba287b182f1515 Out = 6d87f523d51ebfc11fffb33357ed7ff3e4051f58a52d45fba208429ee5b53995e5129d35e3b8d3448a3f56d32dbfdc762a1458569c839a4a1c57b4d69251f565 In = d43522210236c67e4981bf3f441b941cd52c5732b94ad76160fa16f3fc74fe7ed9a74f0bec7ddc77ae60f71a2bfd2aa7554828539fc0023ac7f49efef34666b100ef3df51743b76181368927bc203ef4cebd2c18d978a7e7f0e9745f299c800bf314d226aa0fbf04690c5dae200b3acde6944dc990fa2c3182e1805ec5feb6535a1ef8e8ce6a5c280fe95bf77e4684f845d471adebcffbe026e5aa42f0f46f53dc169681abdbf6941ad56b49ff5a863d9485820d137e7abc83fbda55d10714d12203943a68eaf51133d975eecbcea6667baf67312f8f138c422ef8dd91be0b96d4edd95b2e1fc16702fb612c092a4e39a15b0861688b2d1a0a83ec2357a2bd6a99dc4f2c2403c25e2e45174ce1f7e580af914de5e6f92f2c84049e6f4c3a921419d9ddf5731d61bd60bf7f957cbbd3014c571e04d061838b57b8f709970ef35efdeb6bfd42f5044e3f70825102017f8521b763084e4b90ff2ca7dd3862a6460eed1be28dba1415d7746006c69b4e53d3d6b804378a40be50abda3945d28bf4ed907028ed0301fa21a697f43e6d2cb6b51262e9daa9c775457b58f478114466c38ff2266544441df47e1e35ffa32210f17dbefb38d6691da74529f4194759035891a9c43da566e418a4fcaf5163b9ca50c0d3209b37ad1e3eb05623709b5232733f9eebbc4feeb954bf394c7ed5774a9a83aa4149f41be1d265e668c536b85dde41d8812b6a64037177def3cd23e7f9976d49478b363bcc2b0be1aa5f4013eb5f3e5f6fd21d51293876f18c85728e3f0e27ba18a9259648104b50d387e0e944bfdf3c9ef9913c956e617dfeefedf685c959059eebe8b3be4bcd3aca853ec4d0c5cb76f5e8eeadaedee3873353b9a6318eaa30bf99a81a94a238a777a1832bf63baa155be65b2cdc4fa21912f90126ad26c24565fa8c5434de359fc223d7a721e72622ba3d00428788463a8328ebff5f594a4b7757bde804c76b2b935261bfb693e5a3f9330676175278f36e299fb8b1eeea4bddf8625e6e248352d2774afb1e058fa300119551f475e04bbb4546d90aaf494c7f25a43fd8bf241d67dab9e3c106cd27b71fd45a87b9254a53c108ead16210564526ab12ac5ef7923ac3d700075d473906a4ec1936e6eff81ce80c7470d0e67117429e5f51caa3bc347accd959d4a4e0d5ea05166ac3e85eff017bff4ec174a6ddc3a5af2fcbd1a03b46bff61d318c250c3745da8c19b683e4537c11d3fd62fc7fefea88ae2829483871d8e0bd3da90e93d4d7ec02b0016fb4273834674b577ce50f927536ab52bb1441411e9fc0a0a65209e1d43650722b55c5d7ef7274fb2df76ac8fb2f1af501b5ff1f382d821cf2311d8c1b8ec1b0beb17580ca5c41f7179e4ab2a4013eb92305f29db7cd4ac3fc195aff4874ca6430af7f5b4e8d77f342c0f578f714df4728eb64e0 Out = 3e2fd51b402408073de5e665b81cd82052a11805345132a80f769f9574779081de8604f9a40699db3473fba4807eb1287dc2eb3e59763f21d81737b0ac6915f4 In = 211909dedf08fb0d8aa87bab8d45f6894b458761625e5fb031066ac3982b3015fe25f9d899e934d2e97f196a86b68e031c164788b4163248358f12052a716947c5b59cf624925228d4f41d38942a5c185bde60e89c4bcdc7c8aa43e915ed3ee97eb03b610a6d1db952efce3c3d0929710f8718a8a265f9d3f23f4797e00976a32f001e41d3e05c2a6b58769f0cbbbdb540f8b8f14ecc7e14bc366438132cd81ce28c8dbd0555d92627175b8886a8e08df61987ea29e824342d77e3f436bd2efd9e3cd0fd2a335a538f14c52035385aa13ad2cfbcba22b3d84eeb0cf2d2263eed6cf82e2ac9e2a859aa38fe8fa0d4f298130bd68e89e0f2aa2578265b6eced19553a8f16c6bca8be181694dfc4fe2721b8aace6891f8baa52bd077b56931dae9d5b345fea9753ca931a90f98fcbcca0d1a69d45d4038ca3781b81510cc87b9fac8c84c1cdd5e52f167f964b729bf844636fc63b99bd49a5c349ccf1a595506a6aef815e3cade88013b8618bca47d02878ed1012fdd62c78db4ed2a3488204d8818b118060a8c48631cbdb01c258ba13b92961102ad59ce3693279ae1d18ffb196681d6d614de10919c2ebf47f5520cccd2aa37f484201b015fdab5c4ddeaabd548f8e6e6625a7d172a478ae2cc6691c5ef8bca57ea6c2a586b84ff3005d6bc360074acb97b77fa5e57a6c75ef33fdcb119c96cbf588498b656b4dbc5d1bab8d65d83bcc1d8bcf4e1a4bae92f02544a1901d1738d570fd29591c8dff8da2d3e1090b48b920290095b81f264d5824a6668383293645e646490bd5f604b87a4988f4a758d9c71a7b4068ffbced4fb68be191d7b30b6d738cb1229d72120429774acfb455753be5a717d1f158bcfc655bdb63209c00769e372a477de9729c39c3ee423b26d5a412ebe49c00e20088b87e1ca166ce5d88f0af7c227b416da632973ef442b3412929b16d703142021b375c6cf2b1306acaf05d6f5aa263494b9a5a008ed4e401f2b3607bf68e600adb6b5d93fe0aaa6f6526a7cb98f7374eb2fb74fdb7f6a15c28385fd6d51e245ff3dbea586e7824b3811af6578384a5c604dc4dfd18b2d29cf33e1846b6e9774b89106984ea04867f4455b3dcc45096f768c64dc8590f5f077a4ff29341f83f14c69044df19b5b81bd95e44220263f02a0740dc25211630e6e6f255841d526603d1e5e131a493a3cf66bd13f1e6c69da808d262dd18cd2d805eb0a9e3f3ffd260d396aa4232a62de314fb8611188083b6940447b8e73e3f1f0b0f57766a086d73f32c05da6cf73f9e0a9f07493f998c9fd35ff37e36714c091599c5062b741d835a2e5cc0fa8dc2497131fd63031a9fa9ec6acef7ac6c3d87a3d65c5add4bccda2f2416bd83709c2c7039d0250e0aa31e08ad41ebf239fbe1dd4d843c299661be9b979b99afa9b78f3040e758057182444eb1b221b0e06d5fec86a672b75cc478c60e531c283ff9bad8cdacc493572364e7fd8a628d677a49f80928c52ea5dd50d711a60d933a4cf4916986305ec56ec5fa1a327631d80ce6285f74 Out = 07a66b976af9b5982d5d776da8a7db28746161bd43a43e562c136357b0aefa7b8c33b8ad2af6add3b95cc962cd9617341322fdd2c07b4d65becc43a80f3df2a9 In = 97a89d3246067de18c799589040075c9e0d2083280a2c7a944222c0c9ec66a196bca5b8b8376ba858ea192341a74f6b1eb70f32492b2c32f4276438adedba8ea56e66d2834c88f9f7264fdd68f0c4a5fe28ba6fe2d690c0e756abd211158ece70202bb51828566f5dfcabeb58a50da9b6b2c0908784e0a0e8605801a5fc6a0d614292d4d9534a6517edcbe1934c90c2f315a048a9ce926f61d5075bdefab2b803760ab66945db779f7a1e34cb5fe49e1da1d7fcbc1c2c690e1518451ea92f5ad11b11de2a7890135f12116953477fa7b0f7d62140d6254a27b129620770066244a236b0af83eec4f1565403bd9bd85c3778395adab5036f5929b9170bf7fe6af8bbe7d26ac07e08d0a744787ce575482bb3600dec114d651cff25f8aea96dd147c8b3b7eee6945b9785715c138cdcd7f829f8cef78379a7eda21e6b61fceb31cc4918e59e4ee83990914903142a85a8475c41f27f740ec435a30103b86add08f0bd95c01b61d02f663b5a21e116f62573cafa2cf67b73369f825c36348bd9c35fb698fbc8d7e2a972e4132d2d0aa4dc17e68fe2fef24d6b95b0ae9748d8680d63a4b0dd3919a644613c12793a5e2828ae3f5198fb8103ff82be669b77c8fe2397087c08ee9f816c9b93c6baab89d6b7a1560dd37e903d5f112c22b743e602b2746238e34be21aae9cabae55f32666f59b9b1316eab83006bb6a517f3fa81c4686329610f379b866eeb447df93bc2f6ee7aeefc7e261a282dbf97157bd97b13c471a020657df01420c6e01bc2fa3b6802fd2128ad814fb500d6a10d5503d482031591b37fb7a7bac70399a70098582e5ded519c44e5aa0faca3c9e7ca9f1778ecf90301a50e49e22a4a7409fc3da1aec7f087408a79b49ff9cd198b20d6c95d48c5fef41eaa5df312417b2afe0f9f5108aecafcc966f4cbaffd99e19fcf7498df218b7334b26b554793b5f04d39d97fe7d122b847d3f3fc95da50d291b39f9379b3b0672d4efc6f91e62a4433e1d8a12efe975c4ee9379b740d46443ca9d3b5de2677b652a897abb8e3e30ff630221da3df32d024cf4a0e143d8320eada9766d520e849ebe5c4708331e737df4d415d0f1cfafc11aeb4bf3d13104fe16d730e28490a0840300b27bb783ea63660bdc7395df8c95faefb14b736f4b8698bef159d4be5db98aff5362862f14243931cc5eb49321d54f6a97749503742cc5c94e4fdcb81ab3d8a0906929507f54d0ce8beeb88b2e23aaf454fbd06e2d75007e9e10f74e75e75eacfffc1b988a59ef3a81a02c380fe57005804d902fb5e3fb577759deb1ede89f7d0897d777d3c7c71e540f8a2a25bf41269fe66ec8dbedf8dc4086ddb2e11c1d8930d8d77eda130ae269a95cc22df580d00a42b6b9de179b85a0349ea20e164b6a1f1ba60e0bc02d1f38fa1ea0774cd18a660f22835ae545dc1ccf7c0fb35bcb8809fccda5e753902d487e3a35a01995be19981cb5c0dbaa57fcd3f06c7f40f07ba7d8b8f70b41f6b52ea24a0226d05ff3cb8a1fb1be6f1b81e6deb648c08a6cad7f5be241d61fa31f4212c8867a2592c3c231a60792142bd2613c1815358c92a5d6e2f446e64137f4392c3043287dd096b43b4a37ea7f5dc1d298b0623ccbf4fd650a49569a5b27bc6a6 Out = 767272f34a51e2ee0b69bc9d7a8b15f71c7f1d6c392ad37b4d2b43d8e989f076ff7167e368639eaad6df910eacf848c5f47979935988265bea455a15466876fc In = dfb77844e75f85583be98d8b02b601d95449ea7c954cd81001d31bf487e536f3db399124c73d6e0ec25c1e10c381750157d77b13f2d464fd8275c3594acbfa4aeeb6f563caf118c4884e7586f243435a04a68b6c46b5258e5959e392cfac0cf740b80cc9998269c2b847f9b53605532d843d83513af7020aab08e568bd905442f8c63e1ddcf84b4f78cd126538ce8dc1ff24c98875a3e2bba3082fa3bd7fba733e69f3293a5ba5b5f06a285da0a6d9609ce4c7d9a0c1afe766e32b0b768226d13c2793b35cb45e3a4aa5a36615951f508304e40e635750d71f203f6791a080a5178b8684ea0a6027ab06ec483fa447dadd0c87ed656fadd3f448d581b5e2b037fa1a34648b6692c43d1669cbc7da3946d2851a404f10ae220de2541f8b4e9ecf0b5e061ae7cfdc58285c83b65540dddc89f604cdc8433b0e9376240abaef33b572de6270a74d262d9461a2d390dc1be42be7ad5d790f3cddae8dad0aebca55305822b12c73e85889a8ab2fe821b8dca5dfe07db70a7c99d885ae56e7c6e9ed8ae5b35c17f2a95bb58cc490beafdc0668ce6adca522923a4741618968f253e4094018c9f9cd9715f969342f1de34e83751f0c32ed695a0772092eae56181020f692d9629aacbb6f9c678173cd65183914fb4fe75889dbe9a0069e2b79df298b99027f8ec1351b51e8ad35c395dc42128d8aba63ae271dc61b60386999f0a50c39b991b43813c1a42364d7893ef1d2f527f3d50eb7ee2988293e84d07ef28c8a1fde973ec5ecb54e96b3f02c914bd2c92b5f28513a83061513c80bc9ef8ee6ef949a19933169fd3989c3071453934978e1f53c920191bc57212854bab66cbc22de15a01b4331a34b43bba4a94f7040e991de983ad2be54349a83e80c9933150b4576b33ec5edaf6e0ec450524c8bbe048341c4b276b2d596c8044d28618cfa9213e6db647d4427893006917a118bcbb1ff474961b5164764f1d00d74d61e729f8e8c9ff535df1584f2a8f28667196fd84c18aeae5692b3865e12b05abf92851a00918759b36580479cd3f8df16ddb361b3db7b0323cd20e357f0bc41e58f3bebaf1c1bf8c07f71b976ae2dede67e9e347cb939c7e27096652392bb9111be9dfae456e43b23d5efc4c86218189fa5393aefd96f615c221df30c2134b109c6b22fe6666988a60e024fd91641c908f98b595364a53b598cbe7558c5b00b95518373ff7532480fd2b243f2f33166ea239c7af28163bca15680d450a5b6067f0416ac75abc8e427cb08865b216f590dca74861259324cfb276cf63ceace0a8e8975c4912fb2c2b69f0b015cc7830839971c63fc13995330a788c464bb807f8988a8a19b2a784c84f6c49c3d0df6dd36319bfbf8d82139097fde260f4155ce39a8b52ddbc3a3e958793940451c4f3ecb42f9344dd050674b57760587a4d45d6692a64e9823ba00fbcf74d3bd1c1695c26f3ef84522b143c1d65647120b8695d7ee83ee1c7145fb36a17d3eed35d449e162732e26f7c93632a588d6f99ef1de566352f4add6cd41cf975a6a1d8d0fc2f1c3a0be397622a9656c149884879fa1a9991d48947ad93a8e58153e954f5268b939cb8fc6c8430223d20077faeb18449939ebd21984f14e3d8db6a19ca122a3036dfe8b1514b4ab347f565aa5f5e231eeebc57a831d9de5a2dd437d7cab09db950740996d83fe0a601c1e28cbca87ce7056b2281c6c666787f1c6b97b968e7838ae9aa1183da8896f515ecbb5 Out = c6844ef20c8d121ce80dd8a3cee4f36501003232dc3e71519de69a4cf77329ece5f08967517804941bb00d65a864a0e82df5b5452d3700e4cc0f5b539ced454a In = 1d024b761257e905688412b42057f150daba54c4ec7d5ef4b5557be82f24992dc47a9678635cf48dd245d45f466b227931430d9c5b47baaa34f739c2691eb8adb556f679facefb63904b07fbdc6dc8822534cf97a4c24513da63da3127cafff2979e55bfff356550499f91ce0ce64a34609484fbf07667f650a0487b91b1d7c313589a939b179a1ca5475c21fc5d1257876b131166ea891c3eb669e8d05aa9e9d18ead3df5fe028f4e4d4e3bd45a87b345c264212fa6114e4aae27c20c4ddb2d7847760537710571e9b85166bd65110f3fa05f73723269521f8f694f6c13d755b08cdc3386f90b8921914ce8df071835200dec4e5817f7f0636116d9193303292364ca0e0d1d7ca09bdf260a61c704eb8e11f3fc09dc25f2bf2c18a63b35c97377d725dff165c07e02aac9146b2e3efa31b55cc3ac095a1edaf956fef9a290f954edd6ee5d593febfcfb1c4e27c32c2ab3000fec6926fd3e5dcfb82b7b01bf8463afc583778261af31d907ffbb0e3742b9fbf4be69bc7818efb72674eadac0dc4b24dae667678f914b4c72714f97c70ceeacf483d452327539b888206eb6fac9b554fe5e56902f5bef5c45ea0ce7454ef71df581d271931ce2dac6782e1bd513494817356c86abd3c71268b3198517d17f56e00289a003d79325c9c45394b981ae070eb1d0d069c27b75c4149ff9a75d2c5d9e4c2467ea6cf4a2774c04a60edd8d99cc1babf6d3efb38d3f54c6cc5cbaa63c16a7c94eb0a4ac58b9576adb3ced8d0738bb24814f241663c2bdb5859daf96fb2f5da1debd476450782eacbaab7a575839d864f847274cfe369595acd405a4a0d3b5d39e7a1dc3909a1af4cbc44b9294b9bb92e322c1fe6781258dc968847735e9f687174ded722208616797ed2ae7c49fadd7cb48bad4a48db5c665c1f4b8c15869e7cf9f81180dab4b2fa58fddfeefd3f45b3621da75bf408d6807471d0e4d0a561850d99f5e5a6a22747d132d7e1d3cd845af15e98abf84f49a3862c722e0e60545226110ec102c2c5da8dfe21056c4a3bdbb8caebaad4034847f7ab99c82d4bd94cba19c6937dbb313ad5dc45ba3529bede4eef2ae905c934f64f7bc233bbcc72dd5ff0a7ed85efdbe14f49a080bcf0afbb1a37d0d70bf5a236f41985f14866b39c8e524d2fa9d5284660b2ebe9721360faa1317805653d02729c015f9141bf1e02abab00ea580fc902a0c46264e31685258a688af48ff3f8419dcfa994461a14985e677d9e1ef4208e85eabe738e7e7eb42c5974151abed61c8fe11e6aa41c39d60d141dcb7d26b15296925aa5d2bfd03f1d60edf763f23e7bc8c208950a39e0344e3d6be2e11c0de73957c17c6e6f0c2eb43b330c1a4293e7ff0f0293e707ba4b884fd284f94898c514a77d57afe094fba724fdd39c0478d9990496f7b8ea2a8441c80c221430e4648f0df8d815d90d3e5cda98de67cc5fc90d6f3030fe75b3670132533ac079635e2ef7ce6e4e9cd75f5ba8be9d1c1eab5ee29b58c0262ee76c5d1b524f8c66a80a6af1689aa8c075e71a3bb98017500dd3af058b35ce6a291cabef73c0e6ad3511c99751ddb2d88b5e1ef02437e814d9ffd95a51f265dc1af0842b524f5d917cdcd13604b80b496a3ce06289251ce1a21be7f617868ae91f705c6b583b5fd7e1e4086a1bb9f087a50bf50f52c8143ae8b0516576828c15b924bb0c00257bc526cfd5bfe1443137ce33c3531ba16c753065bc24e95707e66a8626a9e49e100d9de8df840ff71bce385cd1da3e319444fba46eb0da747cdfc60d05a17ff5eb05d9d77c72f2333ebf95dfb70145091a1ebce50f95d47b69663e21feaf3ccd3b424d0432e9229 Out = b250f9455a5a90e3b7d2e2c7a70e42547b63550cab908ab514de782b6215584404971db76d6e2f2c604f0697bc309e7f53672b617c8967943a896ba260d65eab In = ea850f0e319762b788d715889a51d30b160d54ab0de3df249c900d37ca0acfa2b311b24fe70762cc0d016dfbcc1e4a0beb189aa6b618ad6ca4cf48a138c2a62225e5bc9eb56cc2026bdeee35e86b83060b7f0a635c97dfcbab54f005f4cdc213862ab562646f8843ec951f9fb6df84e5bf6b2d48c7087d28f7478ccdc7d52b5b1f072302bcb7be76d64f899f002357914f0489bebe118d6ad1d1a560797feae438a590e885ed6b837233b29e8cde04f10371a82e0b5d197b811ac226d2750694192c837b87b89851086a240523b991ec22db12fe749228424f496b879a5f875509c385238ac14ccae01b673a8d5c086cf6694d98c259c3a7838629eb98e4760e52921d4855af8fd5416f01a7926e7058c544e362bd59f19264fb82ba95addaa73ac2d352b12b695a758e7cb2fa98d297d8935cc62c3bbaeb3bcd005c5962bb070a7b2faa66dde342c29f60c58c813513777f3e2ad8a6269a50272b3aacaa211809e4bab63c6c047371ca334711d1a1b3ea3013f88a433e88eb2f8aba562d15c18126fbdffb81d5d6c9397fa052321f5f78cd629708ba099b540da5451e949eeab8687a8d6ac35c531411cb37144ab5ff6a7eb46f1ab28fbcd2ea0444cd87c57bf7d3c02952dba3d3987da07622c16e7c086d90e88ad3d9d4afee301d2bad915d868f54197b70b23c9fa385c443404fbc9abf7e6a1fc6eec93140b03a00af0a76adc3bec7ad2b8f786fab02893e6f62a8689f065da033d785a1090c01143438afb4988799b0b4446d50be9f2edcf5ae28ba33b129d6c19aee4770cddc2fe524f1e23536f94bb2d9058c04e519e57b3b25d7a30636891941ee6a9e7a32186ad52281c2534e48cd54266aa45bb321a8128508188eed80e3d36c53ba9b6a986a532bd76967006daebfba31c68a6457253a3295bacfb485c6594f4bedb8ee778ea7f52d50f97783fd21a82a94f8955199bb12c6b053f45e6ada81985f5a257d7dd867ca9f911a516183d89d332facd5ad9e0fe223a216d4785ee98237087771dfee68f87fb753a183ec32d1ceb713ac09ea10333a4280af98ee6f539e4b4c1d5ef2e2fd18f48a390b649e108b16309e54a7fcff1ebd9cb77190fb51bbaa0c47a0ebbc2291cf25e2a0f404a092d66d7236ddbd8ff69bd1b4ac4e75c6b7ad1fb84de1deaf12d18d64eaa24cca0c7e31f259953a2beb62866df030c5f8b9dcee380edc30ecc5802a8793785ed62197e3e462d75b1b259c25abe63dd430eac0df8f8be59920d0676413407e220cf8a8ed11fca908a6cbd01536367d88b571e05b846b0304955b0ba4cf9bbb81b4ba39b641cd1529150587bed687f8cad177c4cbe0563f56918ff650844c3761158ed3a63b7d22a6b0fd48885381b783ca24f5956bf6a0785d93afd2fafbfaac789dfd25c9b5d867bfd89bdb74cdc199e99ffa23edf02e524190be90f94f0d48250f3f9bb11d40558ac1081f02131ef676115bdb2eeff1cc84aeacf449f0771f640b2170bc5c615659de18bcc6fad780b9a1a127f599f2cf7014ff64b18740177db92c0cb21b44537357521a852bf321f978536e0c9638414beb424afbbc711ab742e7d85b01ef3521553fa10a4e7ac080bdf917398fcb0c5e5afa0ded36100f5cceda3a7fb76ce2ab0065ba1c0a754494991c8c452cb416f18ab115509e28ddb2848e9be5e4c344597f4ecb8207eb977e344334f814fa494ca3eecaeb9bbe6e028d8a645631fa4272fb823e05eee4a086b5f67719f0a58bb6cc3a9488d6dca9931156fb9a451bc3409b87796d676847f345bdbd7267bec6792d1cdbedf68976af377bca79ca2db10988e7e6821980740f0b216ec9224be1dbef1c07e3a4cebd9c278037bb6539f316e92aeb0bad330f2030a9f2e7c857c4253ac2803288b266a30aedac27c04671afe7d6f2d2ca8a006fdbdeb29402e7579e3597aea2493d5a0c08 Out = 74aa96e89e9ad0f23e1cb37ed4cecc53a0af47a68fa3289dd2c91da6f8b0ddd5d290418ea43abf0f3700bef12ce62de3f9969d45f8410381153c5d698f1f4406 In = e6e9e74abc89e6f6021a4db140520c7c02e0271d894f0a1fc12e1e1a736e9934bc0b9ae8beef750695134bfb8ce7df5391f4a47ce7bf1bcd1bf15bc639b6f19a3f63ebead25b30d43033132c66142709c36154848c9a2abcf181761e407b13e3593803d96296be67bcc3cacb35a28ca77f715ebce1a8e2f52c2495a7f184a717f1d40a3dd569c9c71f0b9b61615ab834ac6aebac4cb1e87fb223e1ebb29b543fef7d279c9399f6fd4353ac75520150b8349522dd367ce7626dc68171ec86c2613a7c828004f1ef100ee3258f6f62ff3cfe3a2cd608d285a744549dc1080e9a88bc19447090385c086a022f3822446bc6f2a1301f287b6a551e175f646cfb84b95c9b95f59f35e4ee3efaf2f6d36e3c61f8115741003f3f74e555ede1821527fe024c9c9699b130c972119554e8a91b12f8d4c9c3f6e6ac0d80576fc0b1242c5e967282dbe674e8a1ed9040d7cabdb0e3da30ad2d74375826d7650e8a60ef3ae201566e4cee46b37e99bf1d09e172a2db866e2b08e1fbeccad2c6f1c6f93ffa902940897219ef39695de5517195909902e5d56ddba5fa0ffe59c442fce3dc1472f777fbd4d0362369214b07974fde3f61ddaf982e28fc6acc54a526b4868e2f905345ebfa79e51987cd3a6504752539ff5742d78ad1c9a53babb2c7774a1df3f026f0816d7ec2c2ca4af8933f712d32e53cd850750a28675346334dcc97500a9c56c1e7b44596c73a7ecdbad0a9bed01972b72b793be3581d0d70e03cd5f0199ccd0042573828cfdf5203024087a0bba5e327911ecac021a0e9b0a64e6cc5cbf671f5bddfbd4283c2aee19216719a9c907572aaeb20886ae5c03dca8ac497c5b42ce87dd33eaa8bea7bae93dad1761be312df9d68a502daf27c5d7278452eb2dee520adbb22298e5f9fb32c150efadfa5a1b5931dc1f81ad10359c7a15852387a84e67320d187352a0438864e90ef91de0a3db393dd30d28a3f79f08c63caff92f082f788b38c27529084c80dbf1cd89735bf26515f74a923160415c1d05fb02d133c627e30000cdf2de11bda034b5dd70a8213dfb18a47a6724460c905d9f354d45bdc87b0aa8edac295a73ec442c8a671d0a3c6393a551a3a7ff72b6c006f0e1b298c2d9b53534a37e993c06acac00c52effd8d614e7b8856fe026f6b9bcd63d0ec9bf759c30337742508e95dabed1295284bbc908c60f7ad09aa1e6c74b45bdced316d52c247a960912d3f05adf8bf22c3b2dc2dbead6f29e716bfd651cdff25747418ee18c7a9e5752b4ccb98891ce1085c74a2aa09f9b1e270da11fbc05694c98f7f968c2a3eea1829981533472fba3f710c56191d9b2e40ddf7853a34681133a82bb0e8187158c350a94c47db0296af182cb1d2915f864a879f9ad5d23e85fbe8a2a6f23b4915bec809d99cec9d5ba17a5d1b9f0c4da2489659b89641dfd66a766ede7338ce0a51b84022fa2306f35dbf26fc46366c6a8232ae47432953eec67b16c232ba081fc448d491292847442b0e10bc90b8c4c63f8125afa534a3b3571e23b8f967003d5ea24f8df0a26838538fa2c3453a5d9fc9ae46588408d60f67881c2a8ee7bd4a68eb397d193a6fb61c6c647a2d6340db66df99aaa84df4e93ce0897fbae3472f2a4e18cb6a9766a5d0cade470fdc74645f3da70ed8ac06281f4ff31f4503a7d5ecf176deac6254efb5d49993b54c0120fceff7eadecc13b658fde172f7eee423f6fcda1ea642427b13af1cc7e55cf0f9841d11a78057237a2f11dbe0984d06008f98cdf322e037313486ef4968b448d641f17eae87f23f5cecb369d1efc7165601edd6c5e6e33bf95f7f9b8306fb119e7991c566ba476d44d60d14adc5051a0c92227dfcbcf456bbdbc2a7db86da533b75256e36e3feb71a364463dce2ae1d0a8b5f4a006abb915ff1789bbbb2f817947dd60288c8bf25c65483dfc60e6b243834cec63ab8dff3cde9c9008a50fe6491d8cb08c33331be3178f00ed311e4397ed4947810700985ee0bdc5cb02993431ad02e084eeafc8a41eab37a6cb2c063c4b4dce8eb58e04ea89eda Out = a598cdcbc02e98ca000e739872235834bc639971465f52cefe54304c0af4cc86f6e60e0292bc9bad2654bfde619eab534202675ef22b3b1c321fef534a5d190a In = a48a4ae3ffa7acd035454bc8188419fed665629dc37eb21759f3f4b97da1d784049c763876dc37b11233f37612825890302d8c9868cc13140024f304c65516b79954efe32a9c61f50421dca6ca86c9cfc08f287e8dd9774940c9d6e290c26aec689bff0da350f14514f74c7ec9f6326490747d76bb0da65d21cae67d65509acb7b57ecde675eb048489d8c26963c5cf6a8c2d4a979d067f9ab0f68fdcc6770fbd972ff7d003066a7aafce4c7b9be0f2e0e63753f4f8a84c5e780a78a4e6fb2258ad28013f62cda0942fa9b89bbe612b4cc3da85fc5a3c368dc06ea4a72d029f09761b7c7cfbcd6171680fb93231b2f2fea3ab5316483ed8b92877868c0f29d050705ebc21547207931774a0e79c42c476e41e3deb393cad512ec9a0ac03ed60be2a8662b4f3581d698c5d121464bd2a562397c8e3b3921ef631e9859fb1a9bab30316e2b06edc1d65554d8f51017e9f1cd0cc66882debb808d04ba7cf8efb58dfa884ceac1d9a8226e0aa7b1629039d2b8a10a9512eb61319985489b3f26ed584895488f0860fe62eed1857ec11e89f12ae08f3d73c6d9aa8e8b89e0592509b42040a94363ea8a3dda90bc84b729a3f62bb19f862bd9eb9274fdc671cd56d14b8c71b92d5bdf155c3c2f92eacb194d88c3fc809bc48b619254c2477623200fc29310be7677a867671b9550d98656504ffba97ba2c643025135c45418e4ea89c43d05014540ab480580ac3d786e4874f5daa0d8c4b76b95781fea357e971e08f79338cac33d5180de725ba3f00d58801f69cadf28216ae3ae1a1c31d2c42354039c916117f602d69bf98ac868ebec3e77af0dd8f78ba8b49c2f429139f361359161f90d6bf32714e41d21f5098e6e74a5b4520a587e8dcfe965459eddad407349e85617e4bd260060e70972fb8044eb518082be748181fe3ec50b9de67928d5d23b92c7acdb6963b85e28876549d86b221c833c721cec0743557dd97ce08125d5629365ebd55604948b677c6f6f90bcc08f3fcc7bd736b39f1f8399c569b329f9634339c83457ad9a74ae98437cd6a5d4e19cb6b73bc7cafb2b0624ec9c26aae748888b6c7ed3247523e62506f811ef061a84414dcf0714fe7fecc31701426f46194ca2ff3e3232cba0f569e369a862fd43deb6661b5f5951251fbe6f217042bfdc76c7a8f9db9f45f1c5ad005905c66264925d29a835609b25855d1b8316e9fa9bee428f3938338a203d38854f8fe3dc83877ebffdf2f2858508e843af9e2d9e5d9c5bdd85b0b6433544549bd4ae8114aaa7614fa3ffd7b74f8fa6112e6ed6532b685aba66abef1736c4476a6fca67b1e0d94e0220c2d7d88b01e0ab87f0acc30c3a864d6391a7af2da45a19a84b5e5c2e058c00fea5b9903f48de39428a779408fa28bf04cba6b221ccd5d0079a2ebd9a136470c40f4789754be8e4e8a6fe6e27908837d1bfb4c91b2300b9151d9f7b2fec1e7afb68476834f246d300ab0afa72e4eede53d6999c229322f9593d783ff27602482a1782d885253f30120163dff0dea2dc11781cd23e0485bb5b6283b0ed9a57ffd986c07f6ecc1c20a610d1c6a967eb58930e0713775c6f25a4f58677274167ca911cc905facf26cd453f1c57a665137a62fe2009d684295fbb5c4a3ba85178cfd84164132e16a25f76f80b39eec2606c05b2305a6264fb92280197a579b4d336395d5b51148adbfec2a3671589641b530490feae24e42ce6744a355da150c02839d87466b31118d0b0a6f89280358b5ae80254ae22ed068226a1eb0a280f86cd621b78fb1394a000c86a8659da1bfaa6386ff8016665cf8fc66d825417d76f4c3b8c2eb73dfcbcb49257d9119f00ae627c3fb350f836d034dd16c3e57592c1cd4c946043382fb41597d6b863d8cbf0b43dd94d43de46519af20473624a27c57a1e9cd4460c17d04a5e4dedf78c6408c401a78e81227f9ae88d9e5d769e7ec379380a5369c29b587b6f253e74c3b33ebb53103eb3ccc7f247364e48c77a7f03f22247a55461a293d253c77483859fdac1b87c2480e208a3df767cfbfde512cc0e65bc92aef116ca74919957cbdb1223fdba5309916e29f3d7d48e3fc1e81f68f488d0e21f7bde458cb105aef5ccf46298e0feb58d77122b58d9eddcbb8a8e1dce13ea5c5105e24c40 Out = 10f9dea4b2b5fba6d63e37612450a26a3ca900804c0d3ab8426d4539a1b89d4da38ed3821232bd9ffb1f27c26418072cf44369e48b86ec8b4015e37cd29ce5f4 In = b5033dd03db57f3da4ba033569a3e4fd0ff36b4bc630d2fb473a4d0300db4ba9719ef8f4d6e507600636b0d59bd6f4da53992807b6f8b1b8f9640d0923da13fe6eb87b01f0cfa0927ab9853ac16c16c0bb10b1a04c0ee5b9226a7a46de52b10f74f7cce1d49bd13bcaeb8c4a2290d31711010e00d09bf6658af39ca3786bad464b03f57aca7223c3bc76ccee0868b2481b13450d8ac66a23f8a87c083b4c900aba85feb6197c1d9219ff4d0fb91c3bb9a2ef60b1c1b8cb5d3630215e6d1ee2c28a25ed7b0be04710a83118937ed5f6d36d3c66d2bf98a07a0a35938b570829d8838accb3e6c729a633b134649fbb6cfe46a3605aca8f72e23d5cdb794133efb36d5da245f3584cba802aa96864f524a3f3cc55302bc5c8fc974f000e72c6bbbb104578197abc37b65942808915aca6283d5e4d3c2a612a32dfb60a3434ea165834eb5517c31a720084a1c0adf9077bf7ec0251660e8c20ebdf3802d2cdc787f2a0f64127159b8602c9f071be592f2a76c85f6796216d33905d7eefd0868496f11d0f4531ba67fa22f2d79ba37d4b3b0f981e9ab4a92dea872230d915a74acbbd73de671df8a556cac5fd4744ad84372926e6efa8eff3ce39f6f5c88b7840afbe6a0ab1d3187d23610c0b7d893102a52b3860705a3be8660ea075c519418fc95dc93c2b3b6118e74f8da8435a50ec0d7f973324b3d5333a6fea59d7a7495ea1005a1bdc3e1d9e2dfb117da39f546af78c0b08139904fed2c29a49071ed9d6c011e350ccc292377acf5f32a44083a6ecba5c8746f5116eb77079ec5c64391fadf62d8203b00a095832416e4e2526c573715157c4b044ad70e24febde62b160f019005a8af1cb3f4e8c7dd9aa3784f21519b32195b0e5e3857fe4ed950089c112e02480686b1dffe546dc1cbf5ce753591a4a8cc2df3c377eaeff9b8a27086b9ab5609ba5084a71a3c626df967d9510c7ddde41522491d2e4d96a9dc4bd778610ff7d534aaf99bf137523c93583d752e7c837e74d662bdc3f67eb9a4bab1e39fd2544525d48510ebabb9a83a654f54142441c27bc8f537c15c04b3b28da45ade8917a3de9babb89220155b5f1da37045fba57a9a68651daf04c51276231340a59aaeabff3ef1f55d2ad1a061cfbe5c4c690ae1413336d1f5772c70601973277d8d85b7e85cec59d5229b21e31a146a80030ea110b7eef73d39d73820ef6891cee839422a63ff4872bdbe5a637b3a3d99400d347974f1efdeb321f418f357f2222135e545f2af53be42d7a463719447e0a6a305fbe8e43e6279a91eb8f3c5db1fdf081bcb77711e205863ba538bb71c0ebd4cb008923a6550f3d922913f36bf00683c501b60f8da4164dee6c428172c7bea86ad3fef68f732c83e9a32542f008c532f2cb64d8b4a8a0ec5c425d538eba0b4dd67f28f0466805d56000cc113621c266cfc4cabbcd172bca4dd092190fc15b2bd7ad0cf7125b2299bde81148836186882592efa01f183d4f89bee8bb3b0634aa3405b4f43d740c39c905facf20f398febcdddb70f3d460e3d7b368215bae2132b72e27d00ddd4a1b4cfc928e55fd80325c4e971191731bee00571933b6e4a72b26d16d71cbbb64a90e78de6d69a8c78acd8c2a6d411cf6d8cd5303da96ce50fd4a958fc1be39e349d61fe855a61bf470d6409c6b4bf77a09034f2efc4194a310eb2394a7307c4e656d99b72c527f8f4b4112f6f2f62d2eea6df2a382005f28cdd122840a67af2d649c8f53dcb6fb2083d4a93fec8ce69be1d2e569551b57689ac33b67d4acf809ae29a9c54b1ab8308058ae7f4053494757f9d0885bdaa3eae08a1646ec477f68abdc8e1463c5dd46a994c8bed6947fbcb5ab59097e856c3608ee5a283a806dd5c37fe7480a0193eb6852a0059696af8261b02bf3a563d9d578b7b016a69fead55ed85b6a2a1402a62458de5b68a3021fc5d0ec4eb8bd134e9aadbf1718eb1df2e4b19380aa4751ff466f29c93401a01d47d345229edb4129d598303378ad2fb3bdd0369572e2a97e345f2956e2f9b0045180dd7841058cef903faa72ae2e48a051fdedae6a2d31ac57f0870a5ad35b5a4aa05d5788831c27356bd6dda2b38e42080260d57a70121017eaebed84d7c8a99afb6cc85b9c18592be45b7b3d872c204ba636118af27333dd14fc08484d2078a859b3d2a29aa80eda72e35565f148c380b0186b82fc7d9b0f3763628f7c8a50de82d97d45c3f6ccaadd137103380bb111e9ade94ad657d2171bc8033fad Out = eed31b1cf35dfa5d2afe01f13448ee3ff01e89b6da29d36c93d9292ba8d142f96945c645a888e6a13e22532b6e3f7f434d4ab47e791bf3b0159a9b70d4753fad In = 48645a050dcd38634f2edc65bdcf79462f72e06324ef96fb6f1c2a332defc55dfae7037965a701fca1e5b8d17d82899e95fa1848caff5eb9f161fae1c831c8fa2e26b511933fd2c2adaaa7436ce5c9a43123af543bf1c1e86119b21807c7100a4bea19d47fddd13cdc4751c1744062e069b54a905d0de60f290cf9e0d2f8c415b9fbd7ca11c926f296825f567cda7bdaa6779402199bf6b6b0027842110e0da1df2196fb324afa6c442579076dfc3d1b513232b458e218655ec3d745ac4f12382724fe70c8aa75334cf646de2deed02ad0aecfae002b75a59b16bdf28b04fc61f8cbb830bc2fbece18be6fe2a5f85b8f8db311f6fabe34fdcfc5d24f9774f2a5badf6c43f722fec50e449b1bbd6206d3ee09a0962fe37ff66296bf67b6e91d8ad629c1b260cb5ca1985273925e73fb7d5d77259686e27b16bd522c3fd1a9a49ab26e6084de7101e81dae9f4e6e745f1541c748fce60252e846c1c0e1d1fdb05db779f1c15b5d14250521c657d6ad5d2302bfb0d2398c2cf166aa24549c2d695a4d111b71bed8beddb77390b67f661a300828062066c830bb85d600a01c81f619ddfd869def28279a9d6ca77250e7c1c3bac9f1ec55fe87cd0c0efbce37418022cd06db4dd59576e31ed4b09330777865826c1a40ee7658af6118bde4d7b42efe87f4c2875a69d441a27256220960679dc7d728231977cceaeebcefede3232934718fe25565ea683b910f3e26c2e8b8f3f2d3c49ebe4b0b051ac439ee43d6984cf59ee4bedf625b59547313a7435890ef692896b7c5383c884cf642f1df15a4ce7aeb6fcbae17d42351667bae74f81a1a959e4578168788fbee1cb3fd9f287543683c2c82bb52fc22f1b01e413d0f7bfbdefd7ae9998016e767fc331b6b563233265ac3edee5afadd9c18a66b86e7de1bad0cdc11376a0fd41f5f6b522be904241e0ddb142f79f7dcbb68b83137c66900689414f8d68f9a487e0c02aac72712a0b71c1cfd67f51ba8b466ff9d38f54434795dc9a65f35e0cdeccda12b2759852e595130b27c178dc8f1db20b671bc983f462fa424bba508ead168f0de33c684576c72bc3b582776c4d88ec684ca628da739d24d79d0273b2895a696cad4b838a158486b9ee16dfd25d34997102c314af6b80d6bad8802a10da04f3cf7f075c896869be2e501304b7249d23b617d6ff8b32daaa6c9ca8061235a2b896e70465dbe5c33cc189fba8733a2f25b7fa765be67ff6fa8d37de7a4f22c0126363d731fa043d7cf3da351daf145719f73905bc599962516d68b8091017c9bba573d4435c4a451935ef43e6c329c17ae44229834d15a949bd7db9351d8b3bfeeda5a01c8b2e567c1827cc964810eac31fa43663498b383dde055680bff3a366ac67bf1fff370e201b22239eb6303f7cf9edd0bed7409bb84f8e146e8ff77c8d523885d030eab89faf5ced82862e3c13137d7d086f0c40539286777105ed43cd8fa688dfb8b0026555368ec440517d2fecd19fd28914c27a477cf41aaa7b85c1a5205c910f3d67fb9d4d9be66d405f2df698bdafae109e96ced01edde5f8bee443346596acc945ecf810796b75816e97c1115af256764153992e6c2d610b4bbfda5138430a1a4893f61dbbc5f18b27e7cd09fc3d0abc371b56f640ab7419d8beeb154948bf76dc8b07c3d77859d427b88ab115f24368fc7868b640bac7bad26be5ef1cfa25857e5cbdb1610516d2ca647ac53cb498f31dd54eecf0fda454c5316b5d37e9e4bcaa637854ccfec12dac762da4d4f663e0f7bc8a18b5c6c27e2dc9ebce0e8a6592ed59c82c9fc7e14b2a8803de833a3cc936b89ab823a88a9d787fd7d0157e308eb38a4db73df2ef91e104ade0abe29c0247440149af35754941ddc001f117ce36998f59734c0254b85c667c49c3920a2295d95e5bdce00af7f65e24b205f9a6f11bc37bef3e68b914f9380f787ecb0fb0cef2f25d212ab430129b868ee896536496e1359989a8754e33f3d80b11fff5134f2b7dcc1088296832f055f6fd704bf7a74306f0a24411bab924566041a382f092ed41272f8aa326b4072368d91a0920d97380833cce26e0e5441b16724811af36a2fd0cc294e9f2224a7f72efe6038689fd02cfada92d5744cd86ac187029c5a70701db9e5946311a34baa3c676d38f554a2e4479578d94543b398fc89e53ca6063e022172a4089f8506559e14ee1a1b7e56370246bd01ea017a43ff734f833ff54186ea19a716339182023c4d0c6741e4942e143588d6c94ed473b28d6af78e0422b1fd22c513379064b8fe5aefa6d14f03d063aa02df4bf26931fd1e5e22f9fd898b42d52589124b5780cc82be5f32874b25d8ed53a4d8b4e284c870 Out = 72db99e7a99975cdf4792f4649e2d08a1beb53bbdb7b6b186f2e7dc03abdd649c43b3b1f43b7cab4da8603eb6327e9595f186188aa798312837e61a4276657a1 In = 2109959848fbc919af4f76595c42f41e8f61a908f8f1da17288dc06d4611df5503b79385cf80eca04ed6bbff056fedb15a7418c0bbe354b61d324c60a83595d2b0413eabe892a89bd2ea97227a7b8a9a64074877c346bcceeb880214099bc22912efbd94f9f8a51125d43249222e72e0976261b478e1b9647cd80b10d20c0f60100839c86c7b8c0a2edcb3fc654f4e8bd9cc8a00427ef482b7698fdc6950238191d6d9cda7e3058ed54943c3aba8c5a4148febe289e3142f8485b501382fa8937f9fc62d14f8b7a6026509275cff80312ff1ade2b5d9c274cb72a506a571439fc1ac277019814b599d762eafe01d263d123bf8882e28a658747988731add9eac3f45251c204868b08ec5d9e4a0ca60cda5b4f35d5c9867e368e286d1fe3c61c2e1b2e8bb9013b7b1bd9a334c02cdd6ebd0a6c7e8a8f1ae1d8df5c6a7b95634e98f3a97d4d1abe066133d64716ff02f9e7b579bb178fa220fccfa717db3f3bd2a31265af04bd88ad776f593db50f914ef8e109841357c6cc00e38aedc53dba78cafbe5b9666615d0bcf0be8100bb12ce4f119e61f4840333839f8a64a03d59818f14abf4e8a10030a07c78c9a0ae020888cbaacd3170b2080368280512bab38d5df12b1a11fab21dc0471a701b34e97e0473b13e60ca8db9fee1e6579312331cb625e57158dfb628ab05160cb70c23af60be342df8edd0b9d48147d497e0628026075d9343cc86b1af2afe082a806b1d1befc6146047458832babef497a1bc883c2a0608694dae797b1d24fadc2e0a3794acc9aa4d8336c58812ce4018d2cb65571271492fef87c06d703d4d52819b8f7959c138071e3ec2431df83fa20ff9d8054521ce0e0ecd2714b8a97814179995289b3f462374c83ef230cf5bb995e230d5268a0f8a37c92dff5afc13975c7ee920d5b66d29235d7c23ffb61cc620ff00355b3ca63b0716459bdba7a862ccd5ec008da9159ea6790a46df4f0b6e1daad6a4479c0a86e92efe68bf2e9eece5192e264799c7ea7ab579e953eca008089024a0603aa4f44a9dc8e47a037fbc31c32030880afca31c7d4b79f221632a6e296ac8599b1e09c7cd259d90c8b3574f6e528dc37f4c4f183aef773e8fdd5baaf1297a883fde4ddd57a50297e0e2347a6535bc8e590f44da98d66f9d8a67026b61d145708b5e36e7a7c7a203ee84da5f625a3b4d4aee2aeff1b0d1a39398b51c0602a7a710163b9337fe0a493403bf7ac0309884a74177d4ffdf3bc55e0aea39483e1fa060aee25ca2b889ec73e76a39194932c900a1a205fde20c872c16284fc2d41bd0ff80b1a052a7cf7200c85136d814b88ee997301f7649d27d9042e5cbe0653acd4f34300ae21c495e7cff0ad08713985ab49ab86e13771bfd2d29b93a3b71eaf9d221c408bbb666263b240db290d640911414919e400a47aa453309173e8aaafb1ad2040659e6c45dedafc049afdd4fd66aad521c7673f3f99ae75bff640009259bdd7690372dd259e72ac8f21e8914af3abd706531349f5f70cf283f3682742dd7ac8232fe0c2ececa0d8e68777a4d6006dd82f50adca8607943046340827a5850b7bd7af8f2281108c09709351148bd518600686dccbd9116fb6717fc709a5989878eb4c2905cc5260c6950f1ee950b9d3f5f2bc4952d65dc40c6a9d4dd429604b48c9ce5374b5fa4198bdc1882b0cf6c6215bbc9c6a6532bcbb9b56439018234a72d7fdb775244f5906507335e3a9d21a6ba94c7c186eda7f4a6a7151465c2abd7e7fa1fd13019ad098b6ebcd190e96f75b45359166d99b344141b81efddcbdcdf42881cd533423ced658f2f9d32389847a953e845b8ebe032987f153bd8024a15d3966cd3fa5327a499c4f611bd0f5ea4f0231fdff768a1588a4e5978e30a663411c18a8de3d0ffc78ebccacf8fd205063f5d5a35b774992e9005c9379d48c3826385f0438e2027debae2f82739253df3cd4f11f767a41a2d1031eef85541f4a96f5038a567d52252b4b418d9277d6bf64084e185968bc6bca15f252bb98a4c118bbcbe13ff7481bbf2cca725f95f11763fab4370a2700185b9ea164218966c535f280b1fb362c882fb792dce2d2ec0fbf11ea2493a155cf0d06f4cec20dac7c7302eaa4932446930456607122170ed102b4ba86fbbc05b866b5b038a30dbd115d54d1600ea8dd65c570fdd9274da182b34dea064b6257fdf013a049ce72e2aa784efd8d74a93a25fa6c32bdf95aeb4d5b43434b8a7a92c333898baa4a2263704e5936d4ce11a6fc2cb4c5c5a128355881fe8dfec0ecff35b67d38031f07888a66de43dd23c76712e2af7e98269dc6cbade690c6f6a0e678015870fb560899204843ed4f7bb3c58ea4c527df90a3e8cf6863134c337d8fb79c83fb3af50cdd5c7df2fcd2debd0a98fa5e8641e721e18c38dde0377f6d41181064a16907fd9d648c51381055cd7c5a6de2656734fefa29a8bcbd30 Out = c69d1e7b32f7300a89291d2fe03c63b4bf50c6746003100ef82cbefd20468ac8536c697ac1cf5340ab21b15e80745665516e708f028bb37728e2d13440d4b384 In = 97586b625a8aa48ba39ed7e0134446b480871e853d00e6d39b491d32afb51f9f563e491077bf5d4f88642807545e621ffbdbd5483a35c2d2ec6980c4d1cc662b8ff9ebb2f60e0c738818ee0d39cbc5f77377f4145d3776875d6c7cc8dc6957f74970997160de77a2aca2721a4af337e2f143c3102f6eca99f5385a6756f6bcab8c8b9b753c966782fbeafc54103f7f887b278965374388b1bdb662c8c9da5bef603238e512a0a4bb7dd8d4e6121567931c0b903afd1c7676bbcedb14bc7dfc69ce4db9e96b63f6f63a5541f6d8deb5a8d9d71eb80a625e91f9690f72b84769c4ddc466abcd4725db3b478cadeb033271bc737c06e57e06a97f6d440b44a069a6967f8750c3b4f8118798fe32d2eaa696ccc7f24e16d6366753c4c306e8f0c3b8ff676403d2123941262eddae15fdd9bf11bbc7b526d4b8737f54d48c2c9f40a1236245ea84c9ae1221f371483da39293943845659cdf53740b07bec59915a8090759712d6041202d7fcd0429d1439bba5c24b286005ece12fdc3cbd8b6bac39ab53531f5eee3563948a6dc785947badd7169573fdbbbf2f65f7241ee0bf758fa34dccd6ab7151adf8465425e5e16b8a4dced7cb9b45d87c838fb692e213231d18c388db3424032c73cf27e0367185cb6a49a691c13ac552f91468bc17fd414c8c630b8f917cd67987835d88efcb570bcd156658f801023d4713befceae46ca86e8ab9863bf2281fa3e169827a555ba5d6c0bb93a84f1ba5fe0c2dc7e34ef1bb4fd93731ac1a94897987d05f8eb6004427ca0ae46a6b7e377e7c39cf99b36cefa0acf9245a5c984148d526826553e141209fd8adb6fca64c48c2675666a85adff19473d0df4e9fc1c257d09dc6c57b2761c0a9520669305f0d9d3b0ed2a437e6c31e3bc9a3573795569e63040b614a816bbaf193e137890a0d6b294b862d70ae85b8b5613f0cec3676075257abddbbd99f1d45c5dfee2cb7e8aac6bec9aab191c9e2754a0ae62a2fb13132fb30915b8a8c361a7a3b03a8032fda77bb45b2673b0029ffe6bf597deb988a69813202b62ea3b3e423bb0e67564378c0e362bb0df4b8fdb9c9950d53e48c917a6c18c8383086053754b865073bb41446a9a95b126954ec3765544848b51de4fa2e6d587e3a93a8888fcbbde41df22b6d7091e9110384640d4c55b0c8d7bcd35d4a9819e4976d2c6c275d6faa979e2c99fab50b965d97f38fd111cd50c6fa0b083331a2f7e162ff36ddf5f0b71318a6709a7b28fed2302953a620f47d0d45faaf8ab28a44b3259f9cf61de7962ae20775c25cc7c70bbd63dd3e0bdcba053100a7c3a3164767259be3024dcab4499afe0e14f27e9b54c031a10b2adc74694bdb85508bfd7c77d362cda4fe10bdf993c8ce04b4a3c857c9212380167a5883e6d9bcb3c596508fcf82a140b7300fa57d162a041bddfa8f38a0f95f474cb2ff9299d28ff8876ff96a89f25801cf25f7a754a6b5a0938e65af3f86db45ba3036ff8a5b278d27275f44d7556d56349d4ab312c87bdb5b10759d6b50968a493cb45e29cb3d0c2c133beef93ef33d06e22920cf03d9449b0d2973a2db139d8055126ef68712eddcbfe9b96e138c1ecc711d60e7fd5044e9f10bd274aad4f7e605bb828f235bbadf9a1334b4778a83ebd68203fbf97374be58972a5f344d11e0cb2a39422469eb9b1e22f15adf90f4fb9f117a899cb55c8ea055fbd10bfe741711e903be1ee00895c8b37fdfb011fa521726450f5b8854d164c2c768a66bb6ef7662726157309a66362f20a19d9ffca5eb4ae3fbca7f063d12580d94781722d06540f5ca71ee0972c300944efc9d946d97f9e7ed4e0be91835a03ec3058370606aef1e58037aee421bc23b36618d29ff99adc1427ab166094b15eb92d3330825f3d74ca86069a16a9d0e9606410145f25cf0f099c5020576cf339482759852879c94112a3d2cdb42b320352d2f7c70dc7e4df661a1606fe73e83b9f04135f80bc1affc5bee56f4611ab18919916123246a2f6328b47eddd12570dc8aea9e61391f757ecbf85a754c203d0269fb51e550ad1f975d629ff7daf0957cb0b6341685e29f18e8dfb9d67a602d518ce1c13fe7b399337e3056465b4c7c0ae058899088c7974b3128f7a062570cc6f0d9218b601a16a819a22441d8757f07b8362157984ac8963358866baa71460344360550304d3265ae3cac62e9281903a6c37de45ad8dd7a7de30880a94b7376e5acff370ec9570cba643121f3b0f48f1aa501bf36ee30786f5cd097e5421f92539251a8221b0f0dbcbd65178ecc7bfaa24f5f50c3175c00963a8109e4f1a4f61c8aaf1c30bec4d923acbabc20c739e6cc26e94175d0cab370e09c6f3ee6ae12befa8a1ba12102ff8db6a478303d98c406c021f9c5a706f18df37530497d8568a966551ef9fe6401696fa4e4638c2322c0afabe248f69b5b4be7cde59b32e5687a52a2aeb183425f354c5e79015f5373b849e9b3666bf2514941e8f7bab328b29043f5435e7c38997fb113beb013c4572c236db5a4639663f47668ff1e5ad9a789cecf655725b120b752772de645d01 Out = 19f109cb86236a5ef1eb3064413da5712989d87ab7eda21313d72471ad577ada2632cf058a554cf2512c821a0638dc343d62744199c2ea2507ab0fa09e740faa In = b8fc129b4d456a3fa1cc832b81859386066bb9cb556849ca897565f0ee02cdc97098f7c353bd63352418299fefd5d434b24b729512dcece04d1d94e97037fdc7ca8e0f93a0a05a6c222fabbe9ea2ddc4f4a9f24c4a2063bb0036b350e6ce4aadad2581939cb5faed845a3210f6b45941b3cc617764fa55638c06ecaeba8d5e8203a6764bafc6e8bf33e1e61c60d2eeb0d9fde69fca336ae1d7d6658a533dde4eb35915444299cfea160cee6a42c6441b4d84a94be3934b3ccbed466c19a67519a5868705bbf855771422728205560489f7a9d30317e1a07c4f95b8dc748fc9ecc175f31684a9226d176d9ced124bd603bfb48c50cee710aa4a14e363ccc182ceef6e82000374dfd406339232d06c61908decfbb8706b44cca6b3ee88890549c817b85c4aa22334b4c8bd7cd9a6834e38499a49c56536e4ed4aba01d41321c6e1219ca87cc87cc8164753836afe564403db069dff161097121e7146ced3dda021f5628f1fdc4944016a3dcf6e3fafecfa2b7820ede9c005450a1fe2fe2f037f907b5238ba48504f7e19c2876dd054ee242238fa174710d78df60e00ec90590d379cb3cbd5735a92943c2bd3ed1b0df18aa68d520599c6b5f3ca84c6215fa9ef1d3ecf72f8c52eb54bbcc0dc7887a49d32a0c1504045ab467d6eca5c2402b9d04a4aec53aca6965fab7fc9ca957cdf9c26f91a1e4fb5873335ca28eb7de35156c7a95396787e5838bd6e8ec5cd6288936e97e1e1ba4f222323c7e59bb5683b299b414c64e5b53de9887157f4a6a2652d10645dc40a7d43bf4e4b4b9353fb3ef2cefc1ee57ab30d1a14716b7faaa23f101647d8ecc6a6b4afbe3fa0fcdf03215969c11340bfe190726a54138f61cbdde48727988476313b9a7b8c2dfde1e8ad057377719e3ca58d9a9104974c528509526ceee6b2a288a1298e183abfe211aa9ff40881267a68ce3a91673fdd05398901cc830a9ed312ad03fecd0f6a6ae8e0cef55b8b01009319f97367526a024d269bafce4c72903729d0d392f325ffd4163b7c58d756568c377f3eeb1a1dd22ba8c51eb7f453625fdb3a154e30182b3d168e94e7ac4e05bdf075fadadd1cfc39d7291f26496bd0f28de7cdeb0c6c758ba66e42f05411948c0b83b01ee48f08e17b6fbd0394e26258057f0350d04965278f83905b15c68b635250679e779f7e8a5b3ffd361de0a0fa0cabbd65c3d6847798768510389573a98b852742de73e79b403fe9a72c8c133e691305122f3c59e48bef29f804a7d2c67fc9f8f26035cb7ef21a883f090e428de65ee23f5aa26dd72f9585f9c3243322f6c5e396460ab09a3976e2e4fc8fb55049345dd48d3146b64b11a0fcbb341b25b821ef16d91c2057ddfc007f4c37f5ed5b3f7cb910116eeaa80a83ea36fd14378c84255a5e93a21da553e9f9422d89cee42449d72b696ddc0e2934a97aaaa5c03b968b4b2097bf545a23a538269af959ac8ecc142661c9f34416bd23cf6157288e002ccf664efd64c4163d2640a5cef87a230c5948230c961478253e7f4ab0d74a6a0dcf77e3e7b6abd2b8aad7778f12178b118fdbd4bd2f44f875e4d18f3a353a7b38349c7c02b0d7ff1eab3437c40e4c6fe39c259f65259d3db4fc0c557dab25dcb4e41d42d8bb10467813a00ef656df778b6a6faa8be0e7f0ea6e79c7009fd23589c9425cf0401d4fcdc96124ac51984a10df001db7c8eab82022600a4b7a0a2dc0ca53f2d2a5c7c125b5bfa06e6741917ae5222172456d3e5dff0949e6a5956c5fce972e0754d64488bf04aac400a0f3d1631bde42bf3a29a9efbbaa5a863b9b71bf573616b31282ffcf766c37847f191e40347bb29e17220cdabf552d87c462fb84db32872c422091cd5f0b4e5ba4aa6966b520474acdd18fa65e73ea0ff76807056b4be32530c947a105b292eed74fb8bce6f78b2b24dd393cdd2c16859d569c2a4fa8b008a2232733b18789a3e2b0152a0e2505a9e3ef138487a73b537ed3c3dbce73793c61d63c6baab2bde38c74879877d53d2dd4ae2366a30de0e06288830031d1c329358b8b323a5cb6179c4417ee672dbc1dbdc373cb78858e94111ce481c1ec1837e5ea1e6ea7adfaa5dbc7cb14275509e367d50b994f38ccd75238ee46c3ecffce3b9afc093acc13f711a6adf3ff76ace59a8df1ba704e2211ef84aa3782f90156fd442de93be289730588c57136b82e8d1d932f1423ee18aaaea71f3d4539a537f48fbaf8f216e2838116197716421642ba8ecd91b040370a584a553e53d773d9e824aa1ca691a88e4bf8b4eee53dec6b3726d1185e6d069ab5145523f5f9f3a5a1aa053fa17a62fc2cd59bbcecd039725d044590779d0ec08cae26d573c8ae01e6cad34829fa9934ec55d8cb732483bef4d030e341f7d5e5a6bfd03b156b2b56802c1d1f8739d4a053217101c26055b7c4319bf805a4e572ccf05c3c230af20d3877ebac035e9ba729e1714820ad34c594d08db70accc6cdc4e9d1c2e4cf8c8cd45343d7e49276b1353cdd87d733aa502e550e089a95fe60565137b4a1e0803d1c6a2f8874fcee2640dbbfa62d193ec0586726d3fb2a17924cd197f9a2655687da61b6a7f9c58a6f12661e8c6b88797ddbaede0076b199ca6d10f87b2f8797d1d4e3e01cbc14d3f273840323d8a7e1ef7fd43d7753530a7280b76221 Out = d1b2db67f3b0539ca9c4cb755343efe7076e0c28625d3e63e98b864c98db3184cebce0f2d4fac97c36920f7c6e29ec3c801986fe9b30e2eecb4b4e9b7707d755 In = a23675723ccfb3decbe4652fdde21951fd2f660d1f0473803f7fb8cc44f4090d2a85d08f60f29a3e6fb2d55ddd42d77b51bd23a3f7ade8d42620cbb041ffe678db9c11381e8a603f6db1edd248a1d72270278a7b4c1e41bd8c88ca100cde89d4fba4c0d73c3f0ecb0c0b35f7e6a9202ca39624fbe6028625b7df3d536e38fa07d3c466d383bbaac996e835327e00b9833232778c8dffbdf3f04cade12fb53ffbab258a94bba33f20516f76ecda4ead0d65220d9708bdf00f7ff7a12217fe6296cbeeb482aca2d2ba86c97f8ec03c01b4848f6e8220e52660ac09a17eedbb6bc27a486c051d5e6d7e7c1dd87ef971bf5ed6a020b69d1f68d0bfaa355d7b936066015b3b85d87f17547d940a264d96eff5a47ead9c4712bd46ff01e627872f4b6aa84ea86aa3aed924cf569ced8353976036509d9be5672dabb6373b44da3733b5b7493c1c4793bad6bb8a163a654fc187d43f761a41c6c0e52a73bd1c3c52213176767d038cd5c25389590177b9337452c673c28321d57fdda3def21775281cc52dfbf587391cf98181eae30b48a6b9a95313083d4e3f717b6ba0649e4c622c5923002c1118126849eb66475eda519774c547d1b090aa9ea8c9e09b178aa859d6a1aea907ef5d16930ef4b2d837dc169b6239a444aebf0f4a04c61eecf7a1ac22ef2cf4d387a50b4833bdaee126ee3e06730e09617225cb4a657c75835bf62c2655a395dba893504ea2e8c2e1702f189e3ff1886fa284da91342728467e4fe2ca1b3b148919ceec8fa39e7740dd49ab491008aad607864506b9f2bf9b2852d4f7881bfa44a4ffe7f27e07536635e1fff02c7bf6fe69d113903b03c3ec20aa0c93e56ccf730fce4a5e7a4ae0bb40a21d7cdc73f550900d4c190482bca02ffd92877a55198023e21cbde090a6a8c6310cd368182d3243e3f9885a98301f1df46cbc8fff62d2a8e465f6f8002c938e39d4df1891280d4cfa21c5866da9d1b236a4196c9231d1667b2df10ac3fae561607e8634076e4a71fcccb7cf28ae1eb56c428559350fe525507d965e009807074e11b203a1854f7b8e02487ff1c86ef03d4cea9d108376ac0b5ccd3ce08f5f48ac954ace88f786315acc5fddf27d292952cc2f814c15ecc453d37eeb8b6557ec221336dde34c555d0831e4305058b72952c93c4d114daf35d0e991b428a556ba57915e78db0a26c5403ac0c136de80b8e64cf94986b427c72ba6eedfdfd4c37bf41aaae798bb6032a9eed9d8ca99ed9db65c4ebcd4d1bd410c127db4da7c08f7a0b3027141e66b6deb5518bc341064a2690123f0222cd76d1a36277a3e248cf604664e60fe14af3baf7765b79dcb4e8da743602b994edf11fe19d27b3655b740c83a76faf9cc94679d5da90f2d5314271a2bedb661be3bf660c367fde796f19c93386288579682b75c0eca0d0b2f1c3868c0b2d9a10455e4e63dcf497c6fa2d40d66fa5143fae1f59592b2f960e7d088390b97db82a993a33b8ef0a71b6832aedfce279fe38119e7eff2471b530497de361285062b345ffa05beb45eed0a0af3b178cfb85fb29256133573ba0d0dd80406df62a0c42d20b2edd602b819dc906b2a6adbe5e016b409a8631d20b58afdc0527a18f2771d3d939addc1fbc7672dddf3ae346e8e33e8ca57852d9374036ddbc2e98d446a8b2065b5dbdb7021314912b44cc09b9094945fc8a18a5c7201901dfd36abdec5ff30f0e5d9375f4cc44dd3144a69b40fbe2291a2c21ec3d60bce4dac695807b101d5fcd3ddbd1073a89fe6bbb21600323bf8288dedd00fc9aa8f3576887e08561a775026f255cabc63a913528cafc8229180ec332c888a72653b9b049d0429dbd17eb5871de7d74f7fd22481de1b54064b20a539862e7afac43a48fdafd2b268af53f39e685b7d558481dfefb244ec07ee421a4a04ab28884ff4040ac7d0eb273b5cd212da9905f6f8200e450f11d84d044d140cace5dc458fd296d3ece61c3efd021a8c7b8ab7596516772afe6a5fff15a95b2788c5de580b3ac8ff26fc8cd57dad92b35414daa752cbe3478537cb45a7bdb744a03375ea4b9560377dfa841544c603306c20b80748a71944af60624844f3f00bfa18ea23d84c2722fac84c25d9b335aacc9797a2ce12e3c881ce6d3073b2cd23a05a852a39c5e569a44e2c2ec4def0ca7a5fc0a06c74077b05673325bd6317359ae38e28f66a62b384756c588eadfc3880627b28aa354e064214fe4ea86c96e8ee994d4498a265a9a02353cabe8a209be6860f6211bd801140be14d3be3612e5a6660aa7a6d4b8f302412aaddcdc259bb2b5c67728746543084bbedd872953d3ca310c78a86a2138b2b83928700bd4e1eed6e68f77c3c445a1a544948aad205b60e29ce027cb6920b66ec864037ff315a1d1b8d1871067be13b2ee1f4f2b432572600207aa5f5855184d1f891c9f4adfd48e8466dfc41457675c04a65e0982d807958614b98eb57ce03c86be44d5a3e58ef49276084894b8a489cd5340b1a61c28687030dcc04a401422442b0289c4d2d7ed29288803af88d223924c7c89779bdcc107829c5ddd46bee9a2f9de21764cb76192a4e95c2c70fa119bb99afbbcfa2b88943380cd3739e578e850600681fb37361613b2bdd517223b30c3226e3fe41da55f6a117820bf92b75e5711a0ad895e55fb9d6c8d7026558999929d4ac6ffbb01b050d5c75f80cc8e4b377857c29b35a689699e33c64498e31d4d93f61af30c82cf0d5620be269be5f9171e9487dcc2110aa0d0199f1af531061c Out = f230ef921cde7b61cfef00b479835a892a7eb41794545a494e141749cc18734d0df36ed0f57e5d1519ffb3845a751ac726c6926551c738ff001ccd040473b197 In = a1990301c5f0fb63024de2f5b828a00fb2ab0749f066b7d9a9443e1c90be8472574e674f7127a28f1d23f30aa0fd7d69d1c06b38db7fd63c3f47e806185242c8a37d9c68fefcabd3304d48946a6acea58d43c484eb6bbc8a52127a79473359548f0eeb73f4d9e0d645b329ba9fd95d6aeb1c5b58a893316ceb8d3c9ca3c991bd22ea9c98d9250741633ddda4c6b1f061f53478da995dfc8910a07698b67db2ab64f7f7013748e9bb93d3ae7b675a5031b27162324632e78bcc336f9408b583c85e1e43d395aa4eeddc5de2670a3c45832abc6389377bb817242e70b91fdacdb91748ca397cb3fe7e46c3c28f38bf96ff66fec107f59e38d82279c12e85555829975bd25973cbc017d9ed961c784b0d4c6d1dc5d307052f73cdfcaa1cc28cecbee741a45b025a5d609ec3a635534870134703b716f51665932da073ab5ce951200ee08868b1c89e009c2e3903501e88fbfd96dff7483ba1de4b4b6302ddd34ef81422c5a8097d48a0db1499aef7351dad96c0849f87dbadfc2ee6c34acdb2adee02eda54291e126e7645f0c5dd0f5f7d01a67f0353a5d4f96de5adbaab2ed34a9df2b6e5ed15cff7e3ef5db3864c7dd0d927569e2e92b5054648df34b16eeacd2b3c3692652579a0c71c04e683a11980c05d138ce1dac77ddc7695355801cdc10879ddec09b38c03a06a6ac15da3cf1747b63a5205d488eda0fd543ef79df8e0c62a11554356939b004913f66cdb1adeefc13f70132675bf245b80a41889f886e4cb7550ba650cd1573684d849ad7972191c978982371a8ce70fcf17435c493dd4dc7e80c785744125c131f97c91576b6416d6e0eb8ce3b15988840b008b677016eb9148032e5654ec679fdc6e3d5115415e7228a79e7dc70c5443f1c8adefc83b675228f5d61f972b9842e396f7e31a4131fdc35ef225587001835e142a2ea0b2ee35a608035c8253d1bfc19f5789e4d45fee436a1e86d0150ec6c26b86b0840dcec031c23c89a105b26ad8efd2a20f8b36a81b617a2eb87bea82a1475a21fcbca7666eacf8237da1a8e8abf10fe7f4d644cfcdddab698c05134b8d300adf753006accf30acb672c8339dbd5b55b82f3608d9dd2718e3c5511785e8ae1f6588184b17b5f5f0bf1ae9c10e8f775a9f393af13acbe64909fed065d6362a1e30afd6031bc5553aa9e076ffbf84ed75198d45ac871c83c26883139c91182c7ded46e9cd4d6fd701036e004e3550263b9395f6793341980b7c0c8b1a5ae12db4e807d3e8113803da681e061ae453aa14aa0dbe15b3cd8b8aa105c76da833c669bd4d15020b90642d246b09046111e1a6c94f1cd0ad22e6d693e92914fd826ef2c9913d99811b608fd4ff7999101d75588dc4935873e43255b121409ebf5f8fe6b96eae2d363b91690625e82795c8dda04418a20bac83e6be8568ae69821db1bbf95ff72b8f737f4f1488d55e56c67324a8b5d978bb848c478d09b313da5f7cf905cf9912f14572b8ac92b1abc778ee4c08269a1e25588ba7349f0f1c1c973a147b5814720034142c2ace0d7e8c62a78d0ed5746a7e827d4428a312e0ed5771a4a663f9d730d1ec100bb569650a16277e196ce8ec2b94c9b4b5805f00b112dc00237da9a10781631aebc325edc4f5e685a4377821b102095f77e1440a0c5bb1ed7f2fb47e08c501933781f38741a47d3a5bdfa299b35cb4caec20725b53849b9325d49aac993f501f7b7c32a0048454029ccfe8c286f7448d9ee86a832b3001b79426dceb4d32c716240c63f68227f384e372bb1ab08430fdec838d0ff7e07cb16670eb88a951ef2dcddd17c94f01e427cc82aa20d46612b2719c6a505e187516f94d5723121f20bcd548ceb6dfa49e71b45a3673472f6241aa8d72f2a24a836ee93690393bfd1459d6e9e93d98729ae93773d060ad32980213f1477578e9101f92b747397b7e327b4f3b07cc1e1e61f4d26a18976b323c9a3a4258475686b3afa239bca24504f397aab69af0e4ea7c2af1a77f75f580c8608a0b15e6afa5d695844881124d43e03585e7233a6179420221a6659af0b0b40b7fb600e208c90177b56e3507e89d70eb4d372107384d6c00ff016b64d14487e1a7ddc9b7d662ccbcb21538d1ab843e1f7d3124f5cdc952adc62301621bbecc898eeca0d6bd0580eb06c81d2e0a8a9048a26faf74869f8e7f3395c8213481fa69915d56dd1113c6792011526b8a33200d394d1102171287eba3c41000b0208a185bba3c29672015ed9a6b6928aef065c3ce53fa3ce3d4d779b35889bf133d040c5a8dc14a43bcf7bed240c1c3ed54ca02ce0eeb637158e5bfcead858ad219e0cbfa4296be2b4cd473642c0cfbc9d2d550b4e8354444013b14725da4127149b8cdc7732d0382424491dca7ab0ec8fd00240f7a982dd080501e3ac365d4856ef4884e89e4a8ed5fb090882e1c9b6f35e2f35a3064aeab38cd4384793b4f62ec1c820c115e2cc0d7b1060349e210310fe64511a42b3538acfb0aec0994f1ae3399516c8419fdb15cce58ea659c0b92fd92afc2306c500d5f720addef1359dbe8136d0c6c789a1351511f8a1b9afc29816089e88fa89d9dc2ba99d68436e6507be33b48252a807b47f1a08ec66f50493de879f0fc506c7e694d5e62736035c061b152cc68805f5dc318a2551099a6968592d68810f45b03d592bf0e373fb6902be629f5811a754f353e8b6964aa7d85eae855fa5824c7e27a4332463a25e7345cfa5750196960a420fbd2584d02338be0614ed45c42517ed9a76e8716a35641577631589bfdb01118b90d9e3441673d088647a277dd865d7657ba5d3738723bbdd26e9b8337d1fa8efe93a7b4d8870dc5dfc6f14566b4e2c2dcac452665c987f2b7558569b844e4e Out = 074228e463f71f74ffc3d270373c247acf7ff36b7796419d917d7ed1b1f9312417410b8d59070f5ccc7a6ccf2a4b3fafa5951107cfca1c01dccf0be9fd422529 In = 27c74d76ffc8ecf7a69970c8584f294b04ee9a485e302bd630821e7ff050c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a567324b857735efd60f05edc7b7e21d260fb551c8ac95d02c228f065b62a77912471aff236be62f193f8c151b5b152a131253820f4a6948e78a8e6820550d8b10b79048431d9f981e6a648bc246b13a33b944fdbafa49de8781204d9b636115e5df1d8eab3467142cb613b98421be37cf2d0f2991633b7a562ecf1d9535aafedae848392459478b8c4e2305289445082f963c6d5e2e4a049aba2240d673f03037fa9ab1763445e387581cd978464c959b1b5333e7027b649c4da11e26c43b92443c9a5f696c6c0563fd849c3ae0dec65be4dde2f588d882a40dd51f4dd0940c49d7d0a9c5aac1d96864e5b637090083b61a62e150676846f92545ac124002868df3c4f851954e47e0b6c68f376abcb4f6e5689ac0483399e5bb7a2b3ebc8ee859b6ffb5d6d61a38111ab08f02ab1941616c79740dd34261aef8fa0699eb3f1af54b08461c142d9244b92a1e5f73201240d81cd7feaf9c889d034fa3eb761d05a9d86715ebf8903fc2babca4176ad70fda50da2b5d8549f4fa05006cfc04308fbd86a5880b2a4a25d046ee89f239482179fd39d9f0fc528f0d2596c7943e81a1787c49094351632eb9854935b8887b2e6307c34780bdbe3f1d8c981e7acc172423e3dbff5d15e441c39e541031fe761fe19500ded46f95ee74618ed87755fafe06e2e3d21f20d44538ba9783254443dd3bcf7706b6bbe08358cd015d5381331969a2eae952173b245e009bf45b02ea4fb9deb028ec49a6e612f87815d6fac95b944a77aebea521c57e99e7cc9cdf715ca3ea33aa3fc0efffea097b68c765c4aece0313882a708f10dfac0474b083e2ee401a89f677c9c3b6272892bef06d2df961f545df5f208cedcb6278525f9744ecd99739725c0b2bf3137f467f17b80b249347951c265e214488e3cdd071c3a03db689cb88b52f2e9ef4331e1305ee6616ad228ba545d255fd5f568a55adaefdcb1f17c79f4cdcd59f136fa3e282b846b9f6adb0e38423300098e33848dc01637d5c69b61ee7bb27deb8595b5556beb4f4b8118b3eadf9ba357bb45e13c663db3bb4a8206f4f732c432b19d0d248a7b7af3975a51f86fefc8550ee841d337d6bed71fc8bf94cadecb7b3d88ac2211b58d2c30284ecd9d8fdd65ebc33ceebf71e7bd98c8124a611702099be108ea9c49e469cdfb20f6c2fc512ee44f18eb578f9ce358189582446bf6826f2e99ca84791f10c36b7ee07ac5d1f48ae49c55ba806cccc022cfd8ff5e1759f9da056e64f39bc5d2c19f374f6cce7b423c0dba3304c5ee838f07bafc5df314fe6ba232a829f8fd5eb62847ab61a507acbe03856b8d36dcf4b603b4c5fc0827df6c16a3e88ca53be9b190be0945044e1cd30453ce7a4dfca6201a32e6a8c5270f43d95e80ac2ee5e63c7ef6f3775aa325138681c66c69e21a55d1c1c8f4b887109b40bf1b0904afe6cf398ef489169b681810abfdc41901c3dfb0fe076060cc85db03421213b4ee5de256e286ead6bb2839294eef21e9f035263e240c6c5c6bd17b8783f06cbe15de0e6d9e152cf97717ff36c6f5064b21d0b1eff05288e9e9860553f150649edac9abc41e49c02d53a9e2dfc0a9d1bb0b391b3ccf7436b7ca05f0df169cabc591b35320ef7f34b0d5407c7ab89824b830d0caab3ddc063481e3d6bf604f92c0df2d9cda8e3ffb42708e449e0b2a6fd1273a38c1a80467eea5a21f4b6ae3ca1f079ad17776f69440c9e5a3c054fb239452d7edf6ba97ec54a9c34329a2e3b24ecf8da97e465d903a25e932781264d050482c62e0d1e0f3f502c9dac084e9dbce8b687d5558bf6fad28fb792bc00206b37bca3fe68a8a3f5e55185ea69d40b72cdfcdd5a33ab6930857bed051ea4d272c6213cd9e40edfedef55147526892c4d811204ade78bd9ada1685e090fdc0c2299faba46e91a6d31577e71d4a535a955ed402356d7f4ef7a0f9f3225f76e7684998e44cedf92f5c90615c58f50a02992f9ce63de6dad539eb86890e23e23b79fac2703f72e3f1ebbe361372f8e91550d8e03ebcc1080ac21830aa0c74cc3787cbb0b1f4c3ee99111d5acf03bc6d2d5cd9228e4a82733a30c57cf8c5c89166021af83bf527857f6d3c63c183b622950daef8575fb1c8fdf661efd79295ee318986ed70b934253f4079d5bd6b7c95f6e3d8b62c74b565c0937bfdd91b731f447e9e24f2c9605a333b7424f5238633cd8fd500701233d62c88822b7fc8d6b0f961af1334ae32a105cea9c60b5459887362224bb4c083968c5602fd3e23375fdad3585ca8c03176217a995d82767d00a2fb5f1c8d084b238a7c7ce786a32b5863341855d1b7d36610bfb14fdcf25738b6cbc9e74b41e109817c5e7f0bc119571d147d9341fd9eed5e1e80219d607e9d395421308215fbb51bd63628101587c882e4e6997bfa0a6854078457263959aaa514c38cb3ecd1c2b40a827746190d291f35e1dce2359c83ad1b4c6509f58efd748e4f50734f299ed499d1e110340fe55c77fdd20748cbbbc3ca36dfdb2d74e24231132022a569b617f48309f10f06a9c53ba91d7dac1e7d3284d23c0c39a20578adcd706497f8b4d8bb34368af287d2e3e1621397c81b4473dbbcee0fa2ace39244bcc59b8f7cf7a14e640b209719fd2319c758f83538adf24f457a6800ebe929a69f943a046d1b0c3e710c646523852d453752016c0d1648500a75a7dce5a2a933b460e29f2f7b640c099ec8d54b074ce430a365e4ff19f07e8a54418f309c8b8cb9c007a85ab563279c56b06fd7001c8741a178388525553b338ab7a043236b120e163bc87545641187b8ddad8dec069ef8e0cacf35c5111694ad9cb893f3a2542ff7d167e597f16a7a398316a637b5abb4f5d0119785ae813c214320b979dbd3adc97b1f42499592d24d5323d68f842e04452ab810c3780b887a5d711a226200f62f8b5701c6cb2b3e88c06d85300ca675433d2b382b1826083d4e323c89ff6c977ea497ba9bfc740d605d4c38d5b9a5769479d38409096139de87ec971cee97105b3959c335c43dcd687c5877fd159b86ad73597b09c63dabd2bcf8c057d9f0df39cc25b2209cc8fd05b01ab902aaf923e2bc258389c92bccbe3fff3ec72c0a829edf840df8f0a62accaafb7272d46eecf8b6b04425acac2b05935878e76f5478fee5ed4d0b6a75c521af833aea4c3d3043f5822359cb4f352d59ace5450e6f40de71d9e5e454886ab9303a88c55d14ac58eb23a792bf8579a9e5652a4ca3ab68b1f5c26f10697e69d7ff99e2908165afac2a1d476cf3df670fe909be7aa9996f1df44f5f2bf3c871124019bed873a0b8b214c79944f2bd9bd3b712f86b9ad9a276ffd92c739df6ef0cc44294099e66561f4dcb03b756b07679e2098e7bf1bcc1517ae85da3c27a520bde9cf8a05c27162827802d307a588586fc55e74848e34a41f80579290bc338b3f191633947536771549f6c4ce806576f68a0794cfacd9bace9a8f56fc4720179cfc84a30ea8bc89f377147692a5a5ab7b951dae691dc3406d24b590497074ae1ab9a3423b020c7e6529e4511bbc50de450e282c1b8afa1f444852a73fde38370379fb79e22c2d40b387efbe306c6ff79d1eae75ab9b873d9b2ced03a63a749a9d6312aecdcd27b525babc239b5d08ddcbed39f1e1f77184baf80e0c462b2ebf31a0724ac28e03c703ead3e92238267a17a250088747c0dbe8d53d2ae75a708e0657a3b68a17c85d943ebd798ea5ceb5c8657c2263327c296feb03c5506e41ef66b12b59ed0f7e5e21df0139a64b0a76286043a73f61ae589561e7454a10aaca97d6949ab21e2eb4f2f5279334d3e1a57db830ffe17b5e4fa35f72129de8b107e2ed66e3a3eddf464fa7b8eefee45c2b1098c892112992f6e00f2a94119d618e8f1e279b862499fc801d3bb2ce2781ee292695c999135435969799336dd8bf47e6936129246b64becc8038466a445ad7108a1e0a40e0abf40b1f47587b40d51a2f719bf7456849747df837149ae2efce0cedebbecd39a01b89d0bb69017eaaf0b1e35e6cb0c64f06d9acc18328a946bc6677854e09c5399256d17dd0c83946afb50f31f02f2b7f5c29c55dfbda436987674f7320bc2d8041ba4b15f3981ab241831d9ceb8840df5fb46a94e47a556019549e3d9ead187d11ff660c3c39c9f58c633627c584ac7af5c4c4eda7ce8a3158788b6c2fa62f37e86b49e81272ed177a9d825be7eb1755079ffbf0aa9f87e62e1a3f873a6d1ab6b0481d34dc0c2e21f27828bfb7852b7a7e8e362556b4f7878281e11629cc80024fdc097504d0361adb3d50dc9e1a8df040d99d1513d7801a3bf69aa163880924af703635f183aa0a1f3524380571e8bf37c859474acecaa943c192b1506c5e23b64bccfb0bf035f9a5a5c95d5253e2f049a3924361627e3b812af0cd583f27074eb7f250bade7df055d86ad3ef88238960b16f92c25b44d9dd79dd7ee3c80bd85efad0bb66142af617152d2042d85495633b19bbd381c38a3ff5804b59d0b39fcd5d8fc4775be514d3a33aceb50b1d193a89b846fe9ca4568fe702bc221fc764852857f3557b565171cbba65aee8251fcde373bcaa738e45b5978a59a67dee2d6da34fd1683c24b5d9d5d56b973815ae049172a43ecf2a609a4d41ab4eb2d0046d16a0e51966f748f409b26ad7c394cfc7dade86247820ae24514e39808516f06dc871b7cec07913a8ae7ae9d6514b89fe08dfeac33617373ceada8ba5c068fa5502ebd0f013501dde0e5471fcaae2e491619c5983d1b804cb620d2a26296d280d0c36b7e827246e7f6f6989b19500e8682e3e5bcc10aa1cb7ff0e9d6989ce847e2e79f41dc49e0f711ae1b95ddc4d9e6bb6ec7606bc9588ea0a066cd8a733168eb0dd10f6b265079e57e3896845730d8343cf34999d234e4aca1c20da4d42e526d98992ddb8225eec6e97823a99173d961b0f1cee7bfa78c1897940d641a6f92ff2a50239a07d1d45a6262b3b9fe4378d87d3b66b1ec20d368d4454364c055a8f435be971301d4b9048b80cd4217f0251cf438b794e24169020a6e5613608113014d1ceef31abf0b59c74ae6be593a6c93b882281d2c79ab988c77abfc75624f8ad2f391a6ace159bea83986ab5c62cdc13ca03e97355a1980dce9bb8c7989ed1559eb25aa52fc02c7a0d523757c09b749e30b71af9733415f9e4d0b4fd7584a25646c217a876fc4f9339653c932afb7825e3c57d2ccb59189230a21b3296e053f64ef0b93c4aceec7f2f58df33ac55cff00bb579d3051a8922db98552ea2b9cb7edec5a8295340ec8418b38afdedb06347ce1075b8c97f50ef0c3bcab94218f43620c84d373a5935eb1cffa4bb96141b72575ddba1bd8f5642ec11e39b1e04b5653a810e2ea721b0fc62c395334e89dfb8cc2412578c528162a3a4069bdd85f654547854d541a145fe1387c42ebe18976356ee82a2dcd0ba99587c9c8327a39f4c973688f5b1e0dd3b56d49b738ec82bb91c4193495612ea2d331f0e19a66799932a4210569ee65ef9543081cc65a2840347a8ad16a11ff7675d17c226ffd8ca71362456c0b1bcb2813426deffebac8888fea838cf65ffcb8ffeec2271ddff1b30e365c0fb9269bf1b1f3b1bd5c9f020926acb9c3d4cbb4ced3d2495c4e6e27417588cb8cee8f56f0e3df99e16a7763567b2984128fc5a64c8434982e5c28bbe6dbe21a5035c69a8a4b5e7d08a2c44ad50009790581de4fa6a38e2539d1a02df7b3cacef6095cc5423b08d19f8016472957951ef945862f51943786fb4964dc189fbb6fdae3c265ad45574e22acede6a7e474dc7a555db3f1e8c923ef2dd764ade23c639b4f880a2ffcd2391e63ab87f5392138154bb57bfc13cb8281f988564c4db650a3c72e114ec3f2290f5edfc985b812c836732de5d497b7395026e80f6814b1ad80c515198e2d4fa451f90b29cdf3d1f37a6647901007049ed640871e85e9c6d0cee3ed8162bb4321a2bcbe07527ee7404dbf62f932c44c4980d0d5f22a3f6e60ca7e17f760d065275e345900a7bbab451cc9309fb161e6cfec526538b98800e4102e14da0d1f3e3c00da7c94323cc668842e10d210627c88854fb540d85636c13c6e74b7cbea26c6272989408664a1210058845ee4387609c81336a8fb1c689ebba9a7ff31e3b75c3dac1f8418e5d4151dd31b9481765bca415779dfa65d2eb2fa8a3f3eb37e8864b0dc9fdd6e12c79b392847019c8e96506d96ef634e9af1c4956a9af4d53cf2862d25aabafa8e0459eeb2872479f3de22c92c17c268584a49f8c55b902b818e270f2190bb52aa02a7ab2c6c7bbe486bb7c0b1738b88179099b144f1bf1aeec3ddd36b024ceb195b2afad05785edfef79600b1930d324b8d5a3b53edd017f73c01163c7fee383e664a5a58e8b17d89da33f596f6e5db7668f2136ca051c71d4f3754405a2dde9bcc8c461080bcd16bbc180bec0fa4082aec07c609c9d29ce385e6fa01317a22b3f6775ab1cfd6ae26f5b8d02b4da62cdb6ef1cfb5cac0fdcc68a683e98651c9196c81e49726bd584e1facdedf418ade0a6a469cfb23bb8e4a7fec9e73d953163ea742904b15cf6443b25a84628bc0702a768cba344510b2d0242f863aaaecbe862f1fca481d9b569a26586d7f8cc5a7de1c1aa40bdf6f00100df5f7a86b8d16927c901f18ce9fa3d4041cf660a528d977b3a6e6fc3324fa6c95c64f47abc2b2e60839eb37794ad063d41ebbc095588999d587ff6fe0e1065844171982dc0c17f36a83db1ede2b60dc1ed43a19bde33cb71a5459d18911c865917ed2f48cf7ba4d1bf45b494dcfd9af3ce3ddd68f476741ca8292eb6c459517164408172ee41e458501e8414896bf5fb6b4237199f39ddc9e9916f83adb00ef4b3d1565427fb89f4e42fe916f2e665024cbb7856e7644f9ef1e62a245609040a890a76958191d9cc02e2ab421d573330fa0e68c6d5df10c347912544c74d7cd97052a9de05eb1d09329e913f14a7a8acfca5cf127092686173f829890762be8cef11b6d7b9f19cd2fccc64b6dfbc0a9fdae675e2c165a1a0fe85fd9b1d3212498fb06627a78ca050e9d2ec4e8480a1301d3b22dcce4102a76f9f6b2314a4c038d6958177d7a26faa8019f1b00ddab7884c0b9daba10cd29f4ead39c9f19f0f834e29cf6e4f1c520949093b8381b192ceefbdaff542b05aaf24193034be0d494f7fd417b519e39195cd0a9170e9ef7b2b8fbb2063b713e200774a180d83d5b4c7f0ff23f33dde74759385bd1f4c7bbac7b36cb89c0a1fb1bad2a8b9fb46df98102910b9d1c1f443d224e08537b23d97c9e3383e4943ba1104ba9bdaa711133f55b271a2f7af0f45d30685b261241d5a59a7877c1168ce4806b98b45b8eb59f0bc1488a60c0e16c3a1c3da0c44a8034aa188c1389d83429fe956e0c0d7dd99f26dd6bf8cb9e7f00563e3495a8949d7b0c60d4e3b949bfe5ed51a0214acedbb8e91807d1ea541875342ec3966d70c81d4f3bf974d9fb9eacdf18b5a09de25a70c509a29227824c2f5666812f6d7fbe9fe4e24023566e4ee3466334e66168d45b4d1ad2d61dc998932f6de3bd3301df876ffc6f8bd9024f2da5b9a47f5fb2c7ecd3d40f0a377a6c4541bd71ec58b7a94832f2de2abc681de08f946ae7c360a38a1bbdcdaaff1565ba1fcda2293901ba66f06df26c8af049a0668c1e9c46e2f5c767408534ff3ae3762c26faf07e6071780ab662edcf4b40e1ccf9362954ca4d395904cc34925b83ede941e2de73646cdff474a60af3c9a239256427fb678708346363092662e7b595f9b7004fc27e1b2340111260830bcbfaf2758aaf1999b56d18e3d286eb7ff712bfeec9d0e62dfad660245e7b17724cbbc675d4a0c572e337dc1faee29674d6c8be61b5ee58e48a5de716d0a70bada300141d7c6d05c300193f7f04a5fe76c34c77b83b048542584e57712f90ea1e4d4c6db5088054da9aa5b57a5a5d7de64af27e4aefc005c7d31c13cbb1b53d34ca1535d4ff773d5a1151d0aa3685af53ec7f34a24a8d64d5894bae7f0d806f91a7eeff05d7be19a212a213872f9b0d4016372d46b1e8fd0be951aa13a98f1ba5452e4bc017c194430d1ae0798c2a122b56aedab0dc4f68cb81c27911fc3dabf040778e8c362e17cd7f20ea29f29f58762c6acf69204d22a4d112be029c18ab03184f49c2b9602ea1d75872f0f9873ad115ef7de8045ea51865c6cb5e0fbc934e4b1a002c27e44350a4262d76e76e439ca1a168b61ee07aa69e53339cbd75ef32476c33f0f836e05a642e7c1462b10d693e25024bc69f1dc0195c79372be1396f9bba67e9a0d4a04fa5b5d161e1fbf2a769eefd21a1d7090535272ec5d19aec56b6892e5ec859ed80d760efd7fbab9dd7a3639bc02724c6e69057a6c154ef8278365cd9c8c513329e77c409ff064c598a792770bfcd04c1d4a97283a21c7b965489a9fcc02dbd1a091533c23f985ad03069bf0e6909f3a46feeec47f09eab926c3f0529dd78a3fe412e54ab2228537c59e37ee764747dc908ef496625621bf13fa4d2d3692c5479e7218b174f4cc2c86784fb7e2a830faa4018fe50c8fd395d4f79b77c0bbf6af76bad6bb90f6c253f09acc94533cc35e295fa9fba53c670110c2c07962db844013f106ae2fb1cf76a90e94cdf18966cfc8b0291e54e547cc6f61a67b4579d7c21e1f90d378ab5c5b59dc91aae319821429fdf7974113dabe9bde33c4901d57fd3e4c5b72946ecfcba90aa973527480f6f34dfbae954d889e3940519e6c4f6cb91c8151d3aa82928e40a2c66f6520c63dcfa91daa781cb936f490e74f01987ebd60c6593de36d0b6cc8abcfe745a7beb1641845d51107d54c71d5dc20767ff5d2b1215bfa67b9a42de62eac231991cf195ba25b75899644a95b171a59f48d39c0b79c40505dedc4984432456b0a64603f5b4f47d307516f15585f8842a248b24f1b3eee88ed92d2778abf820740aadbe90d28f137b4c1bc5710b40e23a93ac846850f4ee9412f389060dd4b3ee2eaa7e0183441e8b86d94392d1e944330ebe46f9c1848bd7e4c5dab6c95885a19ad2cec267c20303add608154a502eb60e26c900960c54acf72a99259ee21a10c7ad2d4dc067455629a86f82f52406361a7ca7274efabda5a27840ccdf1fe5ce4d90162e4dc27a0592b7066662c37f35ac264dd83cee4b347f656e070a507d2c852215ce6061f5947188493a13bcde373bca499e104561dbf6487d7ec12254de16e9a8b898a46c854ea2c468788eb7ad61bf16d3499eb62eafb7fb9e6403e1356b4d4b776728235a628cf49c01a7a01a86ab222259689c9ef42a74e09383b6d50ad38a855c6bde7685ad462f5fa60c0142e51805b021a99f6c1655dfa0105a3f7df2c25cd8cde27c009a55ace2e87ff3ff1354f7fe5851b290122b064a382fd72d419f886cecd3dd6bca9f8f2c0d506543ac6573848b297ae89470ded279cc3ea1468e729937271d3fb48060ab7341c79926c602f328954ade13a3d3d943a3c86257fbb5ee4b50adf4eea4abd1c8b8bd6808f310babf29c4f926508fdf244b16f91c83bccc87e52213ef78eb4f6c199958c979375bbd5b5bb232f35d549a16acce0a9311c47b58fc252d798964dc08fdb3eec4e156b1ae81a1cff8e6ca23bafc6988c63f569420ae913f3300c2a6fb5d31ff62a92c2a97d94063fd96b04f9c88543d89b00370d0bbf07b120be94b652a2b61eef95c86abc506856df7978c3fc3068f59fe5b8feda6cb87a2f53937daf738bca64c58646ed77caac683f058195f0904b374bf4febe17aeb724742fac156c276352cb03235730b4a93c65b31bd9ec42422ddaf4f301e96fcec8c8712ccab51152814e48eb43a4afb522928a7a114d0642483bbfc7e9098529e3f860e31677d1feb9f75b84f9fb4238e36e9384843a64b34f165d60bf9f782e3dab04ba43daf0cec26e46d8c15cf69a47a2d5227cdce5fd0b12d7a8cad5ce479d8a66999805f52c635a11cde3ef524316d6583d3f5a108844d8348554d111dbcc3c8d695c21687f6663c24da6dede9b18b125bb16dd6ebcc1107ce1a3bbc851936a8110d855d22e9132633f544e220b15dc4386498d85024c61b8a300bc7c13b8bc4b7854cabaa3ad6ffb8a3369a7f9d4ffba842091e0c0ab73efb3b3fcb48803d9f28717a7a84581c293188c57f4ce1ec1939fe312045fa7ef29f904a2f8183e6a7e276b15247cd7d132d0a64091f3bbcad5bdd9377b48087d6e5c3bd6d02b2f16f83f963cb7b07547e09acb4b07ce73c388c84b29cce296c4c7c79fc2c529a08667b7e143e84924caa55e41a0ddc90e54b5a781 Out = 00c128539a58423e5d6290f7aebd26eca08e6e5da7b93f151293af186fdea066759c47da8e57c9de526bcd63348326cdddd28f1e9a3ebc08dac6321599a783c3 botan-2.4.0/src/tests/data/hash/shake.vec000066400000000000000000000252471322470703100202100ustar00rootroot00000000000000# Selected values from the NIST CAVS file for SHAKE [SHAKE-128(128)] In = 84e950051876050dc851fbd99e6247b8 Out = 8599bd89f63a848c49ca593ec37a12c6 In = a6fe00064257aa318b621c5eb311d32bb8004c2fa1a969d205d71762cc5d2e633907992629d1b69d9557ff6d5e8deb454ab00f6e497c89a4fea09e257a6fa2074bd818ceb5981b3e3faefd6e720f2d1edd9c5e4a5c51e5009abf636ed5bca53fe159c8287014a1bd904f5c8a7501625f79ac81eb618f478ce21cae6664acffb30572f059e1ad0fc2912264e8f1ca52af26c8bf78e09d75f3dd9fc734afa8770abe0bd78c90cc2ff448105fb16dd2c5b7edd8611a62e537db9331f5023e16d6ec150cc6e706d7c7fcbfff930c7281831fd5c4aff86ece57ed0db882f59a5fe403105d0592ca38a081fed84922873f538ee774f13b8cc09bd0521db4374aec69f4bae6dcb66455822c0b84c91a3474ffac2ad06f0a4423cd2c6a49d4f0d6242d6a1890937b5d9835a5f0ea5b1d01884d22a6c1718e1f60b3ab5e232947c76ef70b344171083c688093b5f1475377e3069863 Out = 3109d9472ca436e805c6b3db2251a9bc In = 9202e884fc1fc78b3ba2b78ff17b78a1f9e7e87840ef7713d732dba046e5059d2218533de23b070deee0f8d7f9c387c69107d5ccf4c2334126bcdacd4074dd870b645b5ecd86f9b963178f5a909b22889521136d02c895bdcb8264989e18b5b2746f68b1670985d6c3cee6e05f0d312d2ebe0a23110a86ceef0de2ca08da756486bfe3fc55cb94ae358e64310e209cfe836522b5c98eecbdbae3ba2b25c005e669de320842d40c87e2de711444dc4b43bd9ec3edd45eb1d3538e56839ed54d804454bf9dd42dd7aaf2467552a94a274403f15591d782bb55e3961c9a1a1e35793fa7f182b3dddb5f8c4ed8b3e67116487ee7406a7d00f48e9181763842a5a61b84612f8188ec02edd87f03ffa35a01995507ec406be242c586d9cb24be7186ac3809e360fb63329eff605cfe870bd17db1d9c1db4c308f41e9258327358abf75862874e8b34955b8297a4c783b8e6c3dbae62802c6f0c24be3ee060950f937be94454ae159a652847d533c3467ebbc2197b5877f812cc32b9cbbbb92b6c5d8cf8ae8cd139483114a247592fbb228a87071cf471826eb7a293b140c890ff688ef919a65460de77a524668b895c44f17746fbad1965d36cf8de98160b805953167d1e17a416cda75e309b214ca4667f373ba008cc0cd14aa9ecd8b20e53ea8ba80714874cd5864ea4698dd1062e07923b67928df601f8df3a510b9b2d9623a0b7f9954bbb2798ec1c419711224398c8f85d5bb343cfba992ead9947f5c1a500caf738fb7b8785fe2a3b5f484d9faa81f28f640f21e07716fb551a3ef360ef4a5572480d0a6fde0352b93f0cd49cad5bbe6033f80cceeec724e9f6e6b2ee52dbebed7af6f46af17a3a6dcec553c521c4b082541480e562284fced7d590d47043f2db2a5fa5e370e125ab771847a3a84b7d683cdb1aee81c8b096059229bde7f10ecdde9dbb73ccd6b904d06c2ca2916e798466b23724be170bb22892fa04fa9194381037819675a9790c53377f6c7d9c39695a3062427791c5b5b95e7e44587437ac67c3b4c60bf7da248800bc4bdd5341899fec38a26ed76303206b12e662374d8d3db8b17ce04040efe76e6fdb31220657903c06dee446584d062f7485a8495a6d1a8cf435a2f161b0e9c7069509971c65e3b66942786d39d5d3420f8cab28f2de76c7198ab4a9a13a17a12cf3d710d83702c1dc97abca7c4000194075eb648b23eadd8de6a5c773cde9932f822a2dee4d6604ed28eedc941e153ba3dbd97aa80fdf66cdd3e6e97dfee803aada535ca30b95f5f780d21205c29b1fc61905d9cde4dcc955dd087e143f8b790b47131bbb140afba839c60965d00a4c13d7e10051356b9bb25c7af3db225c79ed52c9e98ad94dac5bbe5b3128b8db3729730b9cf683f4446feccee93729d37cada7f84496ddc68eae890217d30f96675384d60e12531f69eb0874dcbcc878f7e8911ecb53941df90d145b3bd926b4533e87e0b239253552b039fd3ce080b5821ac8bddc659ebc91e3fab70bbf90cd9146e6bc47df6ceeb56bfbd89826e53191b099460631401adfefa6a605faf04a98194bb92d79bc94085ab8875d046845ad369d57c74b3ac1497ca2b8b92fb7a3de020177e19c76dda2190a9a1a0d7c9a4b393f539e27e1385517796fa3a24961e9adb268e2bc3e2439336c715db6a487d22519d9f93bd5f8894c852b4407382d3188d91ccf5d74f0342658bd867472970886975b770b8b7a5c88608c18d3063e4c1feff40604adca095e59cf12eb695024ea4248861b7446555795f2a08a364dafcf519f15266b3a4f67da46b17ffb4bddaca531a4f012d4fa46900f69813aa3c333c87e7b471f997ccf7484b0969ad2895a3a97620df9bec1b1e922d27ca6092cd99f02a6fb4d9ff7e19329bee3da9cbe7f6cfa3be99b6c2235fbed89c0eac6532d5fcc36977796676ac0a63adc4cf2f398d6ca90f77a55b25f62cfdde28b63bc9b854b98c0201531b7777a92e4348dbf12e2991fdc0913f87a983a7d760a79ffc09a014bf9c9a4fd544227759053b5779a2ae626fbea1f4b3416bdb6efda716329287dce98e6ce10cd9b3d41651d12c37b1a2244cb7fe040f868ea38b49dd2ad419b21af4219e9128ffd1c94d6e31e19522aee07ef4cff7053f9106168a72624867c9d6c79a58e7917e245ce6a585fef9bf799decbd3d53fb361f0df8098e46f74473164a44c46cb01e5597c93ef20ccd4eac637e5a70a25b31debe170e575f497758e4656607a7eba70c82de81a2927898ee3a1c128f6b8cf976235ce0f834a7ca214700474c20abe0f0240eb5bd186265e82bae2ec337f6569044afc9974e770376480330b9605992aa853f246a26f37d413d1cf6338d010fd427f90f5d3322ebfeed566976ee5b85e2ad5a14d24593a7a2794eb208f515eee9d620fb716d114a6240e23aac521b813fa548ce1dfcaaadb3e52daa69f79ab978590ed5fb84abe84a498deb8315ff4e6974ef9a72d4a0551b8c9f267f1cf83928b6a9e525fe578c5c0f40c322be71b3092239bff954dd6883738d6d71eb9736a2f7db7215657f00439ae40bb2d5d87ac7b80d87dc04c9ad92a4e0c868ede0788d248bc6f3408a0aa5f25f0c5ae39c694a3d5238406ccdeef1267e7f8ca839c69243a127e818e0732b209b0b436f24493bb9f21b4f154ff1470151da04a60be9595e04de1c74e9027c2b7e539401dae14134d4783186b97f3d3d4020f96fbfaa897c9e33b6dc0c81411bf22b762125fb05b7e0970e4771607be3329b9289bbcfcaa6566dded8b4b621f8deda11586d5d2e49febf0de1e15ca8fb1191f87e6920c6e314d6bef1466bc5cb29a98c2d1bd065f3163a56db6f3b6c8bc44b52d63067223bc0b47bae2b66d49cbde01029951c52bc104e12bd85c4719d3311c917776a89b643504098cb70f77181c7c4d244099cacd44469108ac05c38462b85cba8f2a15d83f233358e50d6545da5d1b3905feccb4b64825ae6f8d865e5e0ad792ac7123769e27c10ddd0184c39c45e51e2e5e9225bf5862600318b2bf8796aaa65b1854cdd6744ae1eb66561fd6a9436a0643cb8ed419cf942361d92673ee3e5c178a2a5c8cab399bbcb679c92e09be934a58c95ea8eed5d13ce37a21a7741b2a6e310491054f0581ad7c304de6e9af2046d82c23825a1d9dbc08164f96cab997cbc78409f4a2473a5a224a2ca5bb9da7a87c646c14edff603d5a2dfed654a23abc981935bf77672c2f3307c3ef12227fcbaff296b50cf3af1d5431bdca945d79bd3d4492ea20fdedb938f9d2376fa64f4cdd57420759a2f0e880b21b081c53eb4a1186aff92163f574bea0a5f336c16c989f22ec703685dc2b5a3f84f35f2de5ffdf6ffb510b41b9ee1e9ccdc709dc7e3b6fb5f4843604b7626b2a8a30df34202ad160f3a6411fc181d33ec8075b8feaa1c9b0f8b7dab8190a1e13a9250f1ef077a1fa275d654692dc971723589e3448682784777f970877aefd8b50648136fd42cbac04eaea6eb45ab4a64e2f54620dfb13a0ef6fed8e69ad83e21e63b8248d38b8e72ad332e09c88d67cc6f020b1a1d728a6df0d50b255a23bb871a7265056a5e44bf7aae154b1e356fb1c3f557baa88b106b4bc730cc219af9ee8935e52b036f83b09d678239af6b0b1cc8195589e8c47310f01a706356039d5e1dcc2a440584f44cffa69e5ce3f9e31465b52a0e46e75b64c716f273632752dfbd7e5bd8d8663e9b86b3903b23a69ea1821001d128ba7270b805df83afcebe7a5194a16de4dd0aa51bd5815ed539e5cb0873005bf7075d3bac2d5e1ca2bf8936c256238d90b10073a756994e637b5f9bdd264f331c94c7cd89d898c5a4c45c1cf60c0abf46a9c70c107cff923334b518ea7117e1fd29562f394cb4061da3df32d6fe7d8c6e8e08784090dcb2af2b8e4b179c80ee0490b268a2d1db677525b9824a74a57a6e286ac01dd957373d2a933a4deeb1e198908480aeb13571141292143bb5a913af3f96eb91a199a847f76cef72b0d34220f074804432e9ab633214ee8f0ab2df999b3301832eca8d345bc0726f2b0d9a0679296f4b9e209ec84de51a30bbe8659503ea0bdaca106f6c1e37c92da48870b1f34c55ad3b01d0ac2aada00410722d0941630f80bb96d457087afe93666b4c8926843b5152b5cb78921586f55079bf5e1b45185c4982475de1311988b8dfb6f6d97a281f2a6317924dc4d6eac524a4fd5a392b56befd4de6700420f6e10c3760d6d624ff0d343a64236498cab59c634cc6e65256602e705a7e991dc42a19 Out = d785d35331bd7821c8b4a7672e920b2c [SHAKE-256(256)] In = Out = 46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f In = 104fefe89f08d15d36a2233f42a7defa917c5ad2642e06cac56d5cc51ad914ecfb7d984f4199b9cf5fa5a03bf69207b9a353a9681c9cf6437bea0c49d9c3e3db1f3fc76519c70c40cc1dfdd70a9c150943c272cf9eeb861f485f10100c8f4a3e259c6470501932782512225ba64d70b219cf9d5013a21d25d6d65062dcc6b3deb49d58b90d18933f118df70ff42c807ccc851233a34a221eca56b38971ef858475488988794a975d3894633a19c1ae2f05e9b9c0756affd3cfe823ccf29228f60fa7e025bc39a79943325126409460926b057a3fb28a1b098b938872883804fd2bc245d7fd6d29bcda6ca6198f2eff6ea7e03ef78133de8ba65fc8c45a688160719fa1e7646d878ea44c4b5c2e16f48b Out = 46293a63c235750d58a24edca5ba637b96cae74325c6c8122c4155c0d15805e6 In = e17d557607ae1b5bf061f3403ec424df0e8d5bbe208ef460388a75bcc3485beebee51a2dd46e5ffdc6af98a51045b6e4cafb31e0cc534d5f15629d396ee1c50e4a828334f180f1f3dd7a04f5648159f8987031c66c7bba67180b9095beca83704df99b73a60a59a7fd6b401682a09483419462584731c0e0072e56b6fc281d7e8ff567d23a35207fee2953f2b2c9efed8e10cc7fa79be932ab72f8866f261c9ed71cf13af728cde5775d45703c24f39e448c7721d2e1bcc5cc807dec61e9073aee164091230ce84062af1f7767da27ff2eaf6c27112cc10232ffedcf189c66b99d8c5cc10708f9f875c6e8f17d1314761322b27aaca4814fa4985019dd65c283aa264eb0eb458975794ba8c5c4f6406cba8d5100eb708315ebf3afb1f86ca100dd8b1d4816ea1f1e35e567db85ac354aec9652a316b94fbdcfb7117fb1da8e980064d16fd220445d733d2e1b075c7b7671e8bc4a74a66ead188d7f6b50d70eb3d958730f650f7f99f9fb046d942f985a112997dd4e60674f8e1c005d1c8aabb93210090f18de583b90c6f2b9724d165c9402eb43ec0ec20af90d9c3d5e1cec12d1339e5733b657a90046ffe7eadd7de6c11ac16696d9084520075bf35fb559267e6a37cffebe054c112433df4408535f611a202d94e9c06accb34667647b7b5d035dde5fc11fe98c8b089689c8f5222f3ca911802d6572e0c5b86482b899d92027b39aefc3008cd2359931cdbecd71bd1a709b47ab75a70fd3c0be2aa235fcd5b11574674d8a7484d8800b946db7c973c316c66a5443e55fbe705a4869786ae66a2a72afa7e42b0c3c652cc41edcb1b8fe449ad271f4b7384d7242c55689adb91a9b9faf193839d029ee9d471963b1f495a2206549b3a2024a6e7e87b1904db8890f0050ebab243a67c66503a67551904ed75f0c26a630257b0b1478c2b7d0497e2f9f78646776b0bd938ce20d3a1af2f28c5fb04ef5e809a8f20e7fd024c0d6c2a38310cd94b69cf5fe1bcb95d99383496829370ac952169bcb738325ffa4c61e12b4016e596d65d5ae19a5877b45ab1a14c48ba24af7b51b3d4c6e0771058157243b318fdf2273264c8e5a2b47b6d32f3738925e9f5e4ceff0a027bfa26a6f38821f8a784e5d2eaf7f83d1c96670614e7a8e3686f11045e08d779694b95bf888d468f371cda7fe3af0fef2a9fffbbf4085cd5d61679306b6bcdaa3d0de60840ec11e53c184864b8d460aa5133bdd53ccfffdf1382a71f93924cf36b93b027b93f24a94b19c847d722aacd24e42a087bc9127d953613184306e613799f5c845df0ff49d893d29fcae44ee61a33bcbc2d7e252fdfa355c116541958eb6373b4ababf2256918efc300c3bd73a5a4ee76be49b864575ce79079e4675235927e1f2ecaadea710b8858253b86f46bba57becac63cb990b5310cea42508dec9ed45a63c792f7850e24c584a62bf6b0d650facf7e32ae106ecaace3f8556a850b2eccc74d41eb19735da1bbbe2ce929ab92c138cc2aa05acc3ce6e360e6867349e60ce5a62b13a2ed9b6 Out = 3c4a422bb47db5ef8e4e4029dd172d757258b1419444059799761138ce404944 [SHAKE-128(1120)] In = 0a13ad2c7a239b4ba73ea6592ae84ea9 Out = 5feaf99c15f48851943ff9baa6e5055d8377f0dd347aa4dbece51ad3a6d9ce0c01aee9fe2260b80a4673a909b532adcdd1e421c32d6460535b5fe392a58d2634979a5a104d6c470aa3306c400b061db91c463b2848297bca2bc26d1864ba49d7ff949ebca50fbf79a5e63716dc82b600bd52ca7437ed774d169f6bf02e46487956fba2230f34cd2a0485484d [SHAKE-256(2000)] In = 8d8001e2c096f1b88e7c9224a086efd4797fbf74a8033a2d422a2b6b8f6747e4 Out = 2e975f6a8a14f0704d51b13667d8195c219f71e6345696c49fa4b9d08e9225d3d39393425152c97e71dd24601c11abcfa0f12f53c680bd3ae757b8134a9c10d429615869217fdd5885c4db174985703a6d6de94a667eac3023443a8337ae1bc601b76d7d38ec3c34463105f0d3949d78e562a039e4469548b609395de5a4fd43c46ca9fd6ee29ada5efc07d84d553249450dab4a49c483ded250c9338f85cd937ae66bb436f3b4026e859fda1ca571432f3bfc09e7c03ca4d183b741111ca0483d0edabc03feb23b17ee48e844ba2408d9dcfd0139d2e8c7310125aee801c61ab7900d1efc47c078281766f361c5e6111346235e1dc38325666c botan-2.4.0/src/tests/data/hash/skein.vec000066400000000000000000014212021322470703100202160ustar00rootroot00000000000000[Skein-512(224)] In = Out = 1541AE9FC3EBE24EB758CCB1FD60C2C31A9EBFE65B220086E7819E25 In = CC Out = 23F031A6A4378039B66A5A178BAD217EAEC094B7FCBA663A47DDCF33 In = 41FB Out = B9CAAA9DDAF14985F6A3322C8F0BD182BDFB2DC3CABDFF56F14940B1 In = 1F877C Out = F320534DD6AB164DBF32194E8DF50638BE81B3442911E116CD004959 In = C1ECFDFC Out = A2AE4B71475C13CAB784E7439B1B46A7C43F65CA7131AE0DBDC881BD In = 21F134AC57 Out = 300D8A0EA0151A88AC8F4115878C65A7CF46546E091298AEF70414A9 In = C6F50BB74E29 Out = 1C727F7CC34DCA0B45545E642475F05356A51235DA43DEBFD9D4A9FA In = 119713CC83EEEF Out = 3F6E59BE0AB8CE2AF98695BDB82DB02484DD32B8BEC6FF990FE62A2F In = 4A4F202484512526 Out = DB2C2598BD3C70E7A692BC17A05F4766AE774EF17BFF1903F1E0E333 In = 1F66AB4185ED9B6375 Out = 9567A563C89743C3EC317902331F1D6B44D507E1AD3831895CB84ADA In = EED7422227613B6F53C9 Out = F3FD124C573369CC33FA357B53B5A728AFDDD0E88E0709B9529DEC86 In = EAEED5CDFFD89DECE455F1 Out = BC4CCEA347C20202D9A788E940E4C6A04F01AD9BE95B04E057E330D4 In = 5BE43C90F22902E4FE8ED2D3 Out = 58C4C23F268A352D4D060D9FE05B8F9439AE5C6E684E48144C9416D1 In = A746273228122F381C3B46E4F1 Out = 146E2AF3E7964E03B2E49B83AFA070DE29A92378E5F74445A29CFB37 In = 3C5871CD619C69A63B540EB5A625 Out = 0508EEEA8E53F9B54F4B3DA38A65D20B3F64E03C4E4E807E2AF400BA In = FA22874BCC068879E8EF11A69F0722 Out = 616C6D8209D8985CF498EA61D00DB2C4A2A448766281EDAA29F42AD7 In = 52A608AB21CCDD8A4457A57EDE782176 Out = 56BD9FF5DF1FD7F90CCD4463CFAE358CB4B9682083D76C46A29CFA81 In = 82E192E4043DDCD12ECF52969D0F807EED Out = 65E27CABFF039416847DA007BD52C4F156707FE23CCABAA0534B0A8A In = 75683DCB556140C522543BB6E9098B21A21E Out = 7CDE364D7C4BB5FAB5ACE235B9B772F3DF38A0608D08FD312CF38558 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 9B4E2ED839D7A996111C2DDA1B38C080843F6BF1EAA436D8323CDBCD In = E26193989D06568FE688E75540AEA06747D9F851 Out = E262D8F26587552677CAE10464A72C914B3AEC2460A462F0EB9F900A In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 4C5A54AAD044BC8819FC2D895FBEAEE6AA5AAAE3094FB2ABA671A5DA In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 46640BA3C20AC292DC61DA325F3E9FDB90B5ADF3C0B18910EFA2B463 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = C5908366A0986227FED0F781D44D0D1F6E82C3F4F13BA039E584D138 In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = 59DB014CAC582E5242C03910E8B2A2C2DE3BF6E1051038A1D0E1B18C In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = FC81767CA03BEAE9D7047A68C9C11387A219C8A41C3575A1D76C74A2 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = 93C0C5B021AD05F372DE7D8ED85E4A62AAB60D1B1916AD0274FB829E In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 6F9190F15AFC1193C170FBA6E12205A13181C9E4AE45C737A619D6C9 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 59FF99C3D587404053F312CA731778AFD2B25B28AC66265C6704E1B0 In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 0E0F9EAE23B2CBE152C03A024F25874292A4C43BC33A8E0A71EF30CD In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = 9003F81632338473A42E6C146F623AF03E2B3A84D480ED60BC46244A In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = A02BF7A5DD4F19026A185B6D235EE69028C9FE79DE1DA23540E346C4 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 2A30AB062D6017B6837652C64A7D33D01BF8B1F2D6D67567D8E52403 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = F7EFC8E93C910FF48EB19A150B5A68551D53A697ECF425BA4A0A4339 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = D303345BBA22F070013A1220D9B437FCC98F5A9C4FB34C1608FAA528 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = B4FC1D2805F90B4B4A1179A49FB11D5B2669D13AAF744B84DFE2DCA9 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = A2A83B496729CA27349DD9D6F7C67107277775A3B1066D25E6F0CFBE In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = 4A4EF2ADDECFFF390F4294718AE199FFEE59DD8AA8860AFE6385A764 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 59D1E2B79593483456AB50898F12B56076125F93FC9B62EADA31EB58 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = AECEE981C52C13CFD8DF10B352B8E2FBF1436533C985DC842881488B In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 0622DDAB744D3158D334321B54DF50CF392A0BB31ACA5A70B06D9360 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = C6C286FA7FED3422DF5082ECABA3124B4DAE8106A54FCCA63E85268A In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = E7D40A7106E6813F7AAF483379ADAD987F36F91D09C91E9D26A3D8F5 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = F446FC32046C86C97F49FD230C39C59A7871215E036D27AE6A47EF0F In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = 3329A838C163C43D65DD865FD5F023F1FF389BF03EBC4442BF99DC2E In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 0CF599A4497A8193961B9B44C498786F9F90867A5E40E0CA71F433EA In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 403C4D00CEB423A7E997585317FBA3D3C8D5D16FB4D73E2969605CFD In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = 118B7A682A6D05DDDADE062F944CA129DC1D58430D72203A5AF62DF0 In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = FD63B77D42B249F2DD6197C9F19CF530F3D2F821DAF3C2C61C342685 In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = 83976BC85DB2490589B2D6DC28310C0F3F040E9B6176BFC5761A5423 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 042F5CA6D3875F640603D5F21755DF11768E719FEAC6E823A0172409 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = EC86D53C6D7205C6DB9028A7225D24811524A6F40A8FC90DEEFCEE50 In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 3C81E8DA5C4C8C711500BC756AA1D0942275A622691A600033FFE36E In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = C460AD97BC680BD9C535560934A841010A822A681F85A50CA27C31B5 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 3037D5CE1604341DA47B20BF11B59CDBF79233CFE7318D974C00E0E0 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 43885645BBBBD5A695EDAF58079DEC1F3D6F23C32D327B38D38340F4 In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = BD0170B17230106BCEB4FF173AAD9E41BAE953BA025B4B4CD8AA81A9 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = A1E1F99A1F114320F36266220E3B7C5BF2A509CA890DA2EEB1177ED8 In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = E8970C064C1421C07BB8F06B709E4500C7B5D9DB6524D9834C1CDB3B In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = C63F1FA3D6E1F95261F3105A5A2DE1531B4285CCF9F94A376C0BF2AE In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 25535A1A8615863550DB80FEC1D9C1527DC26996F83CE5368E77E083 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 1BA7DF7DCBB08D251322DF8040429943699C41BF27B1CAEAFCE3EC8A In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = DC889CFDE54D608BCBE8807CDE65BD7DD74CB4EAB62B64C27510F69B In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 23F31697AC576E97FE5A65EEFEA633DFFE7270B370C6501CF30F708D In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 62757F1F3AE853A0A588E5B12FF98B77BE7A33A6771A5D2460C11BD3 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = 262C5045797C6E74C0C2771171862DB0BB64881925BC6972EB370AB8 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = B81D30AFBC576EBD8062413AC329E0D9F4F31AA3742C38D80B627689 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = DBF958A2735DAD5F8274B1D8782E301B1D91F3429BC957ACD2C893B6 In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 0E95AA29820434A6A46B9D7B34F83D73DD75BBCA59FCB608EB416ADD In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 509F1A9C348B996004671933D9D6F2B02B8DBF4B16738D5796901063 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = 93CE54887AD50DC61E2F7EE8F474A87090292AF62F37D7A95C9DD708 In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 3672E38180921DCFEED32113CF65C2216C2D617F4EA91D9F2C20950A In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = 8363106BB80BA7FB88EED05D42782F92F1EF1547A8E7F02C0EFA792E In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 2C02729FA9D8E97BB37DDF73D073F329216BFD7B4705DD47FC8AB53E In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = 1C152480D970CC4B452C49F1DF9EBC6E0510CE60882956C2DB0DEA16 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = 5F0D066AB3BB235D9054DE4D3ADE14CE57ADC4D3FA6FA0C0E61BADAB In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 937A74032C1D8A74140D2E8A528D1DE16E98734B9D32367EBD95F759 In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 3BE59D99C8B12894C2394FF84AAC78377D158F62BF9C722462FC3298 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 123E369DF8D28D008F8B8C9B919F6FBAD260E00E788D4BE4F7979FB8 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = 8AAB941709671B533C4C436FFA4DDA06DCD067F7AE2B8B7B46001256 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = E1D0554DD5206D68812FE15A55F567D6043EE6F0ECA6D85465816FCE In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = 172C06DF6E5FBE26D9A0612E38EF6D7F6C91A2E819A25114159FF98D In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = 02C877BB37D2C7773E32F4E89C62FF8DA920A70007782EDB73984053 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 2627BD23534A9A41CECB2F4355BC6827325277BCC3F2746C8BA43147 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 2C9AB3D8D819E7C5432B984A62846E19ED71C2FEED4B050508251210 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 75AFB673856DF404A0504FD52FC9DD6E3249F257D0DC38D5E8A2D253 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = A01AA45810D1055282DC385A7E540337444F8168ED598DECC9218C81 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 2F9FEF4B937E6BEB5C7BB1ADF350DC0AF2736049FC4A7DBB653B97C2 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 8AEFE7AFB36C05E360FFEE24E065B5490A3CA34098D21F8DBC268463 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = 4AE1D45A7B08465D33C494219CE9FFE225D56FCA002CD7CD1A696C7C In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 36F763C8892E45F107569438030FE9A67E6DD7297746D817D85CBA56 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = A6D391ABFEB54E66CF5EEA2E944C0CAE0CBE06FEBD27A31D1DC19372 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 74810333181351F6AE6E4C643F0BF6490D1F18193E57F0C11E781316 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 1940B9DF8D114F8A6D8F20B5767F1DBCDF421B9BAB5ED904E690CAE1 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 3288B06A5A6E325FE541A1DFCF8C36D855BE30698D0EB152FC9662D5 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = F365EF50C98FC089CC2C8110E2B68238BA29CA13263BAFC60BA75CC7 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = D835703EEE7C6379BFCA0FF5F1D3693FD7ADC6EF2CC6DB19720E479D In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 3079FE0A5C096BCFE50A9CE3EF152CFC4380E399FB1CBBB72C8AC37A In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 8B481609E6AE190E02920B4292825EA72EE2B6797B891C6979AC31CA In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 9E077CCCCD0F671EE3E2859577B626ABCC2E560D5B9502CD118564FE In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = FCEF079569F9A5FBCB9B7602E4B621D9DCAF0EA2FCD18806828BFC2B In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = A7BDD051298A0476784986AB3E968B0EDF1954DE6D44696AB5F92B36 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = 09BC51FD1AF88F5AC845AE39CDC20154440F8382ED919412809787FA In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 3B2CBF2BEED62C035B3D136A601CCCA220A89081C5DC6135E14BBED0 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 905B512336A509C86F19BE9A5C2D832374DDF642B494546D04DE975A In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 65B10B3379B9680CE849CAB1C3323AE020BCDEEFEC48CC40AB76E173 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = AC95FDC67277206C70FA3D9F9FA274DBE5ED8BEB21C4330637405437 In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = CB94318727F7D2B504BD6FE08FF976E5C3EE7652E91692EBA55C46AC In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 8E0261822B773DD87649D452B4AB2ACE8E9FCCDBEF50CCA7A18E09BF In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = A6FD4E798425D165F93C587422A78E344F3591A79EE4B3D61C6BCC9B In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = B45C62148B5BE55C5A6CAC66BDE40A23926E4591CCB17FE3FF3C1E3E In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 71E0E0F46D1DFCF3A4C7611C16AE2A505146C7302B98808BF3EABC09 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 024AA063C928CF0A61982DEA49CB1D8D8A338AFB25C0FAE0DA7B51DF In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = 1D803972FAFB79D78906AA57CB692FC1374B3F707E5BE0937A70005B In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 005426EE362D3E6856A3DEBBD31FEAFEFDC707390CCD05ABB8D64C48 In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 282B254274C4E48BC0FEDB609980F95DCFAFB8CAB169D953F757AAAF In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = E5A4DCDE82364226300B19F58AC4FCB8B6CEBE1E3BA3DC460AF0249E In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 24D79533275BC13DB1D99CECC1558612DA7ED65B91EB045FBAC56151 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = A64A85C821E0D5A6AEFF534C0621ECC69A52D9CAD322693B9985B17F In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 8904D08F2037217785B2153DD0427C24E34D69BFB31CBE0428110BF9 In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = E35DD40EDC75D0E800E03F53C042E57E4890112322BC3C7262A0E09C In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = CC199D06959CE1AE735060E9A83E48F981488E5C4D90CCE5D3C11FA4 In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 051BAB45E42B163C727A40127280F1A77A4BE63AD66E74F64197D1AD In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = EBD2BAEC5F87230C6BAFC891AC7480863835B0B7FA44888117920E4E In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 0200F9CDC0113E44BC56CEFC2DE33FA1C922D4D2C6DB542D31FC23FD In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 1AFE47E7903A8800A72BEEE759B6D8D7F6454CC31CE4847F70F0AC65 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = AF7DF737C397F0B2BF0D23279F0D134CBE0D518CE582F3053147EB4C In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = F03AE1D8D584A2C23BE366574802EE9922210E73B74207498C557DA3 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 599977A2776A5F79CDC72AC42D00CDB0ECCBD2F90A475C46A53876DB In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = BC7407854D7697C3228715B18499DC7BED6B6C4D6AB4BD6E6C3EDB9B In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = B04D664E950C5BB962C892A754CCC7AD50DC4C830643B0F76802A402 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = 929B29D079A8A2DB526DF89B04C6AED1B274005594AFF68A924C6F63 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = FD0F0B90C84940F2E14E5CBF16D516C1628380783CD2061BF597D7BA In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = 3B5ECFD1B5EC042DAD0D8E65E86A5F21BA72799F0456B260C6AEB3E8 In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 66684694F3476F12208DCE43C2CCECAAFF8D2452C601B88037020D33 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 20851889E5D68DC2BC7C8862EC3C09816CC4F176441FEF8719336A8C In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = A6169A86418ED26216C7A69E1506880854179800DC03509A58B24575 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 55BD56254E8C9194F13A68A5FB08C6A94AE7B23DCFF563D2DB22313E In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = AE007CD6C37751ADAEBCA977081741AED832DFE8A27FD44BD9326FD4 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 816990A773A7153A8D3DC3C4FBFA0AC011869D77825C088FF729FFC4 In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = 96951DA605DC0E6D5580146A8185BEE67247777C71C0C9AED2743B58 In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = FEE912946A41EB4A919B1874FF473424E5B7945001FC6721868F9DC6 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = 64A39DBA2443003CAAC682AC715EE9AC63CA1C8971F635E39B1DAE4B In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 472D17BBF29BD8979D56C0B3C5361FFC1750C6D8BC2DD31DE130268F In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 04D92B3649747B69ED2716C98C0AA8847AAD3763C84249384AE449BF In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 8FBB7FC5A5931D03E9780DA4D401B78740B2B41D2BAC1A6737AAC648 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = A442750DFB06A9C15CE4BEDFFBA0C5FFD0919F2EA6B6F39DE1A2845B In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = B113771AB71AD0195F2780B75A45852703332474F42A9B5CFFC2040E In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 2AA36D8DE97C460350B9037110431FEB7273513BB1BD3AD7EB843A1F In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 91A28B940F7CD8EF11FBBD7AC17C51320CBAC869C6F98C2EF38DDA89 In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 7BFC08D9E33C0904F5DE5D075CBD098C3F1611DC0FB068F27700013D In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = CBDFDA39718CD2C13A3D1D7C7D6AEC9EE40CDA1165420AEB756EBFB6 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 9D6FB81A85EC0E5015D6913761724F01DEA539A72E1D943DCC414E1F In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = 50E9B1E78BA993B8E22D34F2B4095D2017F9517DB8B00290F2505D03 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 818B55B4DB9EBD9724AD3ADDE2F5956D58B173872944E61C033B2E4B In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 9D9D4FF67AA3A0168504CF47FE8B75E27BAE44E6AD6F1203BB0C86D4 In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = F0C22507F52A9EEB923C0D16F408FB291995495172A970556E63627D In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 4E3014EDD99E0312791C5F493223AED72EA2E03E7F6C127F11B0BE76 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 3D5D15DB3A016752B2081C34C565889B4C2A2D2F28475DDD23FFF2C8 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = D0DBB060ECCF842740BB7D87BE353E220091540C21E8132338EE6236 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = A5FCAEB00A0376FB2E62D9DF53B47344DDDEE7A7817E9539F5FB6024 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 77EA65E0DA9F4AF1740DD2F707D5087C5889AC836D118662AE779572 In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = A60AE324B7407F015AE663E0ADCF6357ACD95CC870D9B2AE6DC210A5 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 133061E876D3FD0983A24E86BC112897DEA66C432A709C04E9524165 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = A75CC22D478664C1F47A35DCB85007549B614AF79077AAE116364A49 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 617AC34A250B3212FDDCFCBE33DFF316C607DF729FD8235FF8666344 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 212BD8E7FD102DD1FECD99DA298A2532D58E5D1EA8B6C0E16448CDA5 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 0D1AD5DEF3F7C71B86B7CAB0008A767E52F1AED5CE18D2082F1CC912 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 61CAF8F25D0203A6BF9613113F6695B3333195F56FFDE003073D982B In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 67BC257E7259880EC5FE45D57064F2818C3BA2C3E9F1964FA9FD385C In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = 386AF3129215423C0F7E9DD3EE4C864EED97ACDC594916624B938AEA In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = 7E1F10E11B6872E84775E755E0D6E45CC31C5D51E324C84E4D730003 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = F3833130635103FDD5D6DF6ED6833DA47C1807358FA2573AA5927CA1 In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 4DB3798AF14B1E892BDDFAD9A91CB88F65EEDE6F44D01B3E6E121EFF In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 9BC5A86FE2F740CC35D3B784F600E3397623DE9428F932319E7FB18F In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = F38EEEE36E2BCEE81C070DCBF29C665B34D8E62E090B76729263C6D0 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = AD1089AE26B4666348B9F590E21043F46F7FED60749250C0F08C2398 In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 96FE01AAD3382B1FA6A46EE7ED6C71A96609D61C5679A62DC551BB4C In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = 3DDC4ED0DBBB769908D0A1826F2C30FAD926BCB2A479C102903335B1 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 24DB76ADCE8E68D6F601038745346555AC9B18C0B738CE5A2806E30D In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = C96041912FE468344C0DB83BD877EACDBD26CE20C344FD5931794E06 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = CAFBC968A3CB44AF0B774E9AF243C0797DE084C2460E9FEDF17AFBA6 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 455D4D0DCCBB5DCD050E8BCECA56531EE6FEFC0359FE9A9F1B238060 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 9F9CD398D06D222D8539950201D40BB8DC52667F5CAA1F5C37439573 In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = B5F12F4FA2AB2B961604ECB0D3D109119E84123EA742ACF48FEF7445 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = 386B07094EB57E88C541B70F307A1BCB44D413976BE0E145E2C2D9A9 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 6D8D756C4A7065787140F50F8CB839E4BE2DF75321BEFBE2ABC59764 In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = D2D2C3B49A220AFA7493FC0D61BEC9D94E094E574DE1B811EB3FFC0C In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = C18AE14E86EB08D395B43DB53AD154B369C89AC596BB584D7BEE0EE9 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = E3A624A9B767C7334DE271EABC921242888CBFB17944C5F414AA7F05 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = 67295FA4ED1D315327EC1A2D0C8EA1D4DD612EBE7295883347EC83D4 In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 30269D654FAA84F1B03C0D75C4BF756D320A42C402665D3F356DAE7D In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 8A26859575E355A571E05D2EC08B8307FBC15025150B7F4E8E3CFAB0 In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 0F3A9EE22B9742D82198966556DFC9C3246874094B816062D2204FD3 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 756462A2FDA3F8BDC73F29402EAD09581EBAB86DCBF36AC7A83C420A In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 18C8EB44C99BE9B4240D3DE1EA85B52209A80F161BFB220DF3A56B69 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 24915386E0F96531A5EB7A39F8E0DFF5EF3F3EE7E51360E31012322C In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = 5E0BF93B3DB33AAB7121FBEABA567440D22138E0C66DCE38724992AA In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 0D98E67CFB2F86653E32DB40BB047CAC62A4337E9677115C2123B02C In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = E21912B71C0E89CE1FC0D74EAA7021B454C05409CFEAAE586F72AEAA In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 6A1B85C7B5DFD6575D82EA730F7148E5F43BF5835FB8DAF78E29E462 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 813D793D41C7B84C684FA8109C185EA92036D1B9065A93711489BAE8 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = F3D1FE163800A7D5EA20B558AAC1F9FF71FF38C3F54F76330EDD0A8C In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 733B61BA46CA74B57BD413FFA022264658869A43634144BAF2BDFB5C In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 063CF3C2F5F2E784F26B84873D2FAE324CA3381634DBE22CB4AD839C In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = F8F63C56FD61F1E58347A52E68F7AC2DD6CD808496B9E4772917F45E In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = F4FD363C47E1F3D133C4828141DBF83241140361D314065AFB605E4D In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 5213B12119C28283DA474BFFEA26313AD2BD4CC4970E5F8FD7383586 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = 96CA7E9274D05EDBD080090E6A000318D74105DF81651A855DA33E07 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 6601A76904EE9942F19EC6CB24E4F8B3EB5C552B0C1EC6E757010A62 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 222077A8910BC25446740CBEBC40709018BCCE9CA135C3D2609407E2 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = C85CEDCC7CD03E37FF27E8E1352CEF2F3DE6576CC0C218810D9B2F2F In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 1DC5FE115F63A2C5DF894DF3DF1450B77EB14F1A3CB26D0DF23B0A58 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 99380AD592C94B9F18172EBF1B18EE520A00002FC8E698CE87FA9212 In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 2A3DC44539C1F9DA2BEC57FECE1CC1CDA65AC20BF4CE05EF4E9A4B0B In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = B45ECB6370D92BA28B53D96A3114568B91F2F95F963CF31C2E5A03F5 In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 87E7B1B3797C3445D313BDD3946B93415212EEB9371D2F039B865366 In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = DEE769CE07F3BDA013035F381FF1880143F87FC38E691F37B7FE1443 In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = C94C7D071DEF2C0AD891F3C6FC10430164D4F46A8B6F150F50D892FF In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = C829025130E4B5801C5C89A793A1F1C524EC2BE5A665950BC471F542 In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 6643B89BE6E03C1C52EDC396C8CD1EEE99947CEA5276FF83EF6086DB In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 8711E010ACFE691FF86D575CE73B2A76B11CE7C473D6266018DA137C In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 06AAE9EA3B0B15CAFE01B97900C17977E83F871399E9D39279D6AB35 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 22978FA6F43C526CF120B1E4C2BE84641C75749707ED95AE32282472 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 5670455BFB73E038F87501A0EAF2E7AA0BE985AF844BCE9ABB832ED0 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 78B195C6C6F04FD3A075A60DF25EC1BF9996B85A10746400C2377C01 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 859CF23CD89486FA7C32BAB68947FE9032A4C013EA19F2D6A13D6D08 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = F3CF4E503317B874CE95757F0C0644646E031DD15C36DE66EB7C6DC0 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 2CC662C14C81E895133DD53154DDAA130E4CE8BCEEDE76DA6DF01473 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = B9C5F0BC4EBD9E6CB78D2EA5C79EF4887329BCC51734AED4B09376F6 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 75E74FC5F0A5759B8A669CACF874EC7B9FD96B4660C345D1BE92F2A0 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 6A447E4338072182F73660C1FF58EAA4546FDC4F6F567E0ABB4DC1C9 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = 12DCCB19D7B65F960224882B6F6988FF65BE64F31B04F2949F42831C In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = B2F1E13510E19996178F34A6A07982F73CD17953541A94FBE55E8C12 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = E83EC4B9C2DE697EE9540B2FDA1EEBC13A440BBCFB90DA3A31AB6F01 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = F364226164C3285D2151637DA229141494EF514CE6815D53853C396F In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 348EAB358B094840264EF09959D8190FD9CDAE6B0F8753EA9597DCDD In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 71F976F90B45DFA3DA49413EC568E7059D8F096BA3043BC862D8C699 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = BC73C79014FF681C08CD531001C8B3DC43B5CB8FBE22EDA68914A901 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = F82B56ED43F90E67EA9176D18FF44532163564E3991B2F0AA1ABBC16 In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = BDD56AF9BAA66AD5D08E6F439F5BDC9F75B6D232BEE8AAE8A75A37B4 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = 5447ACBE8DC8B440F263E5EC6B0558AB5E962EB4ED33CEC9058B9DAD In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 0069EF1213B3DBBAC09595D50A5EDFDD9A694C27CF1C906FCE529306 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = C24FDB3F1694A20F838F211CBE06A63667E6F53808D418F9E67F5C45 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 9AED1E2396E7CBADEBE222988E89088EB8662D9ECB82484DCFAADCD5 In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 5B392FAD87C1B929FBEE57A391C0B1DC16B259A40404E69C92932882 In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 6A67D956D2B1745B20058EE5AF7689318E0F41E35331D5333C27F620 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = A2EC7CA7F7878AE0BB9A089F426C94103E1C7B7BA55CDFA82FC9979B In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 99D7A1E42F73F44821E8503C34FEF36913C5E2F7BF3126806BF85D21 In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = A57F7E1ECD17133A0E61964F19936F88BA80C43A5D8FD454CEF6D73B In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 00FE33E7049FC993D9D57C36A09577808263BC45F8159FF22435D29C In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = 598555E1051F7883582409DFDCB596804A4316E36B4F619EB0504D43 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = DFDE90F60032C8C0043B93ED22E434BA372C17C599BC8A0E0D9C4F36 In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = 00920AD9A60ECBC8C161831AD2BEA94FBC36BB355F0197B1DC04F42E In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = C089D04204AC8F290BDFF56F5E81245F435CD3377B8B58FC473B22A8 In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 43FF1A91FD6AA39FFD919289E5FFABD13F13816DD5403BBD094F4158 [Skein-512(256)] In = Out = 39CCC4554A8B31853B9DE7A1FE638A24CCE6B35A55F2431009E18780335D2621 In = CC Out = A018268ED814E0AD0F2D0304E8FE3F4118FCEFC07454D07123CC2C3E40E06A4F In = 41FB Out = F91902DDCC9688462E48F0BCDFCA031637F0D8DA577C1E2AA316B5C022450BF2 In = 1F877C Out = AE5520F519D56CB15F15BE222B46548BF967397F353D40B109732F066F6396DC In = C1ECFDFC Out = 2638B1711F1346D08BF02B5D1A575CD924140A608512AF5B8E4475632599A896 In = 21F134AC57 Out = 391CF2CCF93B44FC60E965E77D1D83DEA8CE6F8DF64872721F6CBA5A7D5A8052 In = C6F50BB74E29 Out = 783AE71C0BADC74771C4A30C1A02619ECB8AAE05A49A514A45985B1B78AEEE59 In = 119713CC83EEEF Out = 234B29E28E19C7008E05FA529F1DF2A52219FA1C93D414937A7F53C3B10273E9 In = 4A4F202484512526 Out = DC278F71C1F634918A85129BFE0D7A9FA45156FA4EE970E89F4E85D5E3A9D24B In = 1F66AB4185ED9B6375 Out = 9A3B62CC26E36C9A8629320242D18900A5BA08DDCC37D06A32A1CF7C6F6AD718 In = EED7422227613B6F53C9 Out = 52A05352D70DC99E888AB366ED71F557FC3A44E408E0301C00970C9B9DF0768D In = EAEED5CDFFD89DECE455F1 Out = 46077CA953690BD06F228ABCF2F2F8E5452964069C04310AD3DEEF995478EBF7 In = 5BE43C90F22902E4FE8ED2D3 Out = 0A52D798101EE6F154B260743237DF31E15671FA8AB6FBB048F8DF46ED4A1044 In = A746273228122F381C3B46E4F1 Out = B054A5DDE925709DDF26C1FA45BDC2A9B6B82C71F2A80C7594082A9031FF666D In = 3C5871CD619C69A63B540EB5A625 Out = 27C80578D5FA8B471E7F5013E9221068FBCE0C9DF15DA33F8339E1282163F211 In = FA22874BCC068879E8EF11A69F0722 Out = BF961E0B1F629AE5BA8A5A0F5D120CE7DEB8186F39CE57142BEAF8D7BB92F496 In = 52A608AB21CCDD8A4457A57EDE782176 Out = AEB4E6D540B5887ADFCB5D005D6E453B35F8305A4C5CEDFA39B6AB63FAFB9CDD In = 82E192E4043DDCD12ECF52969D0F807EED Out = BB872A962A4C9916350B87C40AA475C1A050370891238EAD820B7C12565D5E3B In = 75683DCB556140C522543BB6E9098B21A21E Out = 941704A1F94EE92BC65C12D665799AE654E59630422F0D55F3011B2DB511D5FA In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 368F23396932F2258289166067635CC1A7397BC4699D21C937156986179D4B22 In = E26193989D06568FE688E75540AEA06747D9F851 Out = 6B9D5FAD64AC4A0C0412F1E8A568BEAB02F109529556A51D66A5716C0F695DC8 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 0F363ECC1B9F971E7AF89169A686237E3AAC4330300F387F3A589CADAA392AC4 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = F3B9E46D7CDBC0EC120761EE58876454FCC3EDA92920D6C319936CA6B36D8CDC In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 00680831552EC4EF9706264FF51A9C3B27EC3ECEA96D5EFDDB386EDB2A5E42FB In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = A1AF52917A60B9D58CDF795616B3E29E4BCE1D88D0902D85F0102D95774A74A5 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = CAD6AA978C8F95272C4F9C0529664DED99AF248554C14B9D64953F9EE7636097 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = AC5E951C83DD9228382A2419D0B1FB9137FDEEABC3C597A178D348E4180C0381 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 0B309226BE30C552B80324B5F57492597F1ADB39E0FA07048BF0558096EB5722 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 7A8AEEA414409DD1A7305EBA6752A5F3EC1B4A51D31D775215F37D797B864F9C In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = CD697F37A1E6379A4A127224827A29C58B7D48FE5A8FB94281E32356DFDFC00B In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = 7A7DBDAE0560E7AAD205E8D1DA28C61EED8AFAE6A17B8452D64632E4491B2220 In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = BC861EE3BAAA81D9B145BCC16346EBBB6245AE1613B69443455006F5B6730D41 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 9EC82726E31BAD61A93C9A34EA6634E6E0A2023B04A47EB929A92B1F692A5AB7 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = 38A42107F2767F7144FCF9A753939CF3A44E5A54A01F5A5DEBED987CA7FA421C In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 78BDFA9C96AD96EDA8A3E2AFFF06F92F2F1BECFD4B9BA6E3A51D4A42A40ABF71 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 94309484994A3CF04B882C8D53315C58FA2454D1CC753C8B703A073E6B5BF476 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = DD0E9DCA8B0B9A754816FC0CD75EFE3119926C2946FBFA60E85328D1E54A0CE3 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = A45830D06036D67D5893BEF27404EF6E2FEDB7A310FB45E3C5B15B32A3AB96F9 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 7EF5AC7C9D83383D2FFA30E340118D556DAD25D5EB3771FAC674B027E3B53D49 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = F3EFDB3615A0B5A241DD7A59D27B075C7D880AC19B5CF973C6DE56815E5AA02D In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = D74F60A0E767A8068A16BE3EC6F0ED2F5534009C8FC3C4BC7466B987A4582EE6 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = 90E61A8C10FD1830F3D9224EAC3231C284B57DDFF5E1FE4B05858C89E7F5CD03 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = 5D03C3C3A6CE9A4AF70270E6737BA7194FB0BE9333B6FF53CE470F15AE335117 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = 9AA90EE34964A1201FCE5B195C7C62FE118D6318FCF7ECD0D3BE7FEA480A1D7B In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = A095B61415CAD26F554D9FA725290CB1C6E213D88C1A2E25A2030DBCA69FBD0F In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 4C2D4D0E6C05D8EAD7468053CAC8F7399823D13AE53DC23545A6F831676DAD91 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 91DABB844959046A64958991A4A7A18F5B24DF9F112F97E275BBB8C09C495A75 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = 978FB5D4157BCE824B8F88237D6FA7C0DC526882BF13476A34EF1756F396A28D In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 6782789AF2F889D97D9BDC0EB98713CC94C2F6CDEC176D8AB8A067CBAB10CE9D In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = A1A9A97CD2D77E51588E5C659D209AC0D1469C6E41006938695C5E8DBD450B33 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 7279BE30B4F1CA70D243818B223EA198B51B9E04D1231483C40D6325AE5C03ED In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 40A6112CA57D40BBCE88FC0BA62137FC3543037BDDACAE3FECCF5E1E1EB99BBE In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 53A057E7182DCF231E9113392C24832368632D55FA38560D2A8B7AC4A3BF1BAA In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 0CB6DC402B26B013A5EC764D9C8E3D70A389B126C18A31AF02F0B5E7EA1B9F1B In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 48DE1D6037C0882AFD1C0EA6A2E4D154B68F20741E4BCE7639BD1C21A58BF0C1 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 640EC963CBCA339B5F01C0649EF6D01A1AF4C9F7E84622CAD95FD3B3D44FC98D In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = BF067598C5ECD7377A9C787B352079144C7B0CCD2523087292F066C44FBAAEA6 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 1888363FA0F4176B75CA5A978A8937D87B6CF330D1632FEE17BEAD16EF1EB74C In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = B0D012A15DDC5796EA900C2C1B5AEB2307B6CFC80CFF88A76BFF2FADB81560F6 In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = EB73C16F090ACB059F8E31C92F6239C61E721E8C47D6CD64B55501B757F17671 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = D90789EFA7CC0FCE8E0BA9BE68F9DE25228D9B3B4E12C3293BDD98C43DEDFF45 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 095FE20CAC9643225C06B5D10364247D97C909D66E05DDF3C111062AF4D08D6C In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 6C6B2655E9A5F60B2FD15679EA3A22E82D677870C47001C42F5390ADA1E39AB7 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 8C7AB8B3E4410566E586B851BC660CBD0814A9ADF847D51FC03E74E413F33147 In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 08375C3267E2196834E65D2ABF25EA2A33E74ABCCA281E4A4D816BD7C8B5ADBD In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = 3CCDCBB0C34CE4241173CB0E85FFA50955A8D597381AAC3E11F362CB23EAEF7B In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 2EE4684B5DB641809A9B74E1D44C5A8C71C7A57B8974EE9C197222B1D23F1380 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = A21894F2710469B386A7AA124EAD2AD09AAE7EB6F3B5CF347491CD9CF41EE73F In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 19CDC0972B16F5A084B23C8437FA11392DF5A1D07AC5C3A47B7326459BE5B673 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = E11D1332806BD947D675DC8E67B54B6D3916B7261031151FDB49522813686E00 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = 5D7B5CD43D331B77E9D19AF0C76366E1587DD7B6C1FD25324AF6AAB01F6CCB4C In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 5CAC4B0D209C0584F7B015E97CAB3DC8E4806B892477E16F0C10150B72EA4BA5 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = 54BF78BB3DE4DB0AD5B7072713EBC2CBA4B0905F2DB751E290BA4B0268224A3E In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 0A3D37F3E3229230B572DA75CC602A84494CE54E3F71B6B4502119D97EF5CF38 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = A10FDEC0AF7A84254B0CCEC804FC6459A967D2BE4F9213209F2756A2ACC8D9FF In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = C73C5491C50C2D82428408997197F185188DE6B37CB7FF390E71CB3BAF675DF2 In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = B2D5CAE8EA14910786BAF1C9F191F984DFF3139B44C82970100B818C63437BE6 In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = 22096E7B0BF4D02D6D7917372DE40061C98912BA4780CE8EA2809127EF8B16C5 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 1EE4600134EB024596BDE2CBEFA4FC7A28C4C5ED755C8AC56FE610F2ABB189C0 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = 462A31BE893A3683AD570B07F508FB094DBC0CD9473208385F62EB673EC22CBA In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 792E3A09971FA8FD06977085DE010586B925E20726B845D500F8A885F26C318C In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = BE1D265301623309F6F86FC9AF57D1CE79508ADA3D399D2A329B313388CE75B7 In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = 9217FF1985FC7B5D3C3659D88E121278B182A724ADBC33DAAB22AC1A3D23DC3B In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 735DEEE414C6BABA288B90AF36D3D2DBC8F6939BA4F5ABDF07CF58659F68E78C In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = C9634F96094D298D3451BD375760D6EAA55B0DCC3ABA31F60F5B857F9DD6C6EE In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = E517F08DB939F856EB454201B35AB1AB440A4AA5BB1909106948A3527BFB28B5 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = BA7C163C9772F526B8383088F6044909AD135AAB6D768A10F52D6492160EB503 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = F2CFA80FC4F00E0CB60BEB539BDE774F7859A7D8B5A5D4DE5443DF25A6D5300F In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 2A56DBDC7ADFFA534BD5D85075C23E237BD72436FC704682FDEBBC5A66B8E3A0 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = BC42076ADE8F4064F392665BC6B38DF1F318EB1F187F69739D8F1B12EA7D852A In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 5E0E986BCB24A4EA1ACD804BFF693FA0D4FFADF04EABC2306DD290FB3E6B8311 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = EC126D1F638BCA0E5B6F564F3557C40055D1D7B7D1A20F4A99E048C91BBC9081 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = B85C3E3BC8A4C5357A9E8F865C26E2CF06419F06D6CACEF987A2D062141E91BC In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 7360743B6EF8D22E3AA211DB4475F9BD5A35C7CED9E5A9467020E50842A79A24 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 89E18B58920943DE7867A603C1B73075743C4306CCD1D78913D7A3B740D3C825 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 1FA9AB02096CDE60D0BC70D57BDF91434CA0F05917381AD7DF87B215586CE909 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = FEF2A642C782251B43096681C3E08E8E8CBF4E5D1D593C76E6908AC1A8F8D387 In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = FC607D26583E38ECEB4429C2FEF1901050A154A035535E85FDFD368ACD4B67FF In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 3D1D387BED0F63DC7644E0642F717AD8D230560FDD59D40BCBEF43D25458FD28 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 00D88BF06EB22471678C9C4849DAEF658C19BA46F818FCBB696C2C1977DDD1E5 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 617440B5A98E810A8316F5D038E6D39B73A4561D963AC21641EA1671B593568A In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 0E52ECFC7E59B70B21AC4F6E02AA5A277DC315F111092DF7D9451FD84DF1CCF3 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = FD95F439AB9837C8296F635BD54F146D4F6C3EE8021F991938B99635BA55C05D In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = D8A7E38369BE51555C48D30178A90C961C429825C0335EE77D91611C7DD7F99A In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 0931E5ADE3D0C28F3EC2BC467DE1AB7A2604A06260E8AE4C54C96DC8B315E369 In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 4DE61FD93F93B804A55B72760ECAE851589C56F4EF73ACBDE9694DF338C5B41A In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = 9142F5AAE02DC1E3912AF868E023DE29292BAB840103DDA21C4303CD2D953298 In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 2C5C98FFFE3E2C815D290E00F1CDDD15B27807A3EF9878A226FFF53F203797A1 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = FD453F0448152F1FC7D4995419874AF356DEB6111D827C3316A2286B53149CF1 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = C0030EC3D454644ED92CBF2AACF9768D1EA21B59C22DBE98C8F2BA696D1CE9A0 In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = ECD9886C5257852B01E916CD257FAE9CA07C8A0F27448DCC63E959827DA750A7 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 3533601FEFBA47577E021C44F49AAF61D4A6A6F79CFC8F4A9805ADECBE1495E9 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = DEDBD8E69D095F7BABA95CFD1313359F645C822969B69413E22655B2CDF9656C In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = F5F30CB5D4ADEB62718C3FDF7FCA1AA50E6ECDD334E1DDF2134DFF178D60CA67 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 9AB8FBFC3C53430A30DAB8EC0AA96A4B85F538BCBBE4AAF410F0EF12BC979AD9 In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 4B38BF69C2D08D92A2A92905852B8EE90B4C684BE7EC550E1559F57202633661 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = 33EBF28D8881B61523689193F6A471A783C0F5D76DF73E47C035A24004F1185F In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 5171E62CBE96290D66161D561E95BF79295768B65E0F87EE0A8571418C74B96D In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = B2CA862FC344030728EC4DF7CA5462587AF39ACC4AB97F7437960E7FA3F0208B In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = D0CA3B616E3F1C29E4A6F18913EBEDAEAAAE18401DE3C7C26DDEC12746CA2765 In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = CFAF20BA211E0E57BC2B5C4E9F1FB413E20000E28A2594DF0F524FA385BD063E In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = E360D12CE51F0A0408DCD07311D795A66DFEE13B5F545D1A87FA01888910BB2E In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = D91BDDF47646FDB8704BF341ECFB3F7A38865B74AB66C0FC61739EA27F3B40A2 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = CAF2CC15CDF0DDA5B1400321D61A02B30303606D69A40F3A9BB4B852A632AB0D In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = B93C7B2B07866E6FBE146C88CB92DBCE7B4F33F3D90C1B69D2EB39B17AA122B8 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = F5259B275F25DA827232684CAB4B615609FE0D161916293FA173A71CDE464B37 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = 3D148ED7CDB57EDFC12FFE9D5D6373DE7F94927C7C1C5F5A5A883D3D6806A8B5 In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 056067952A0C8980EA0D580E45516C2CB0D2ED3AC0666474843F4A3C8C1CD7DB In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 646F10BA11E7B11292E7F60551316C36625382F200959F3569DE356F64DDEA55 In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 86244EA88B4719B0D9BB3A5331E7377ADD4B344787E1E1AEDB5255FDC91A3BDD In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 050E9EFCC769A37A0D2E2025D188420F64DA7462FF23C84097BF0459B5BC72E0 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = EA579B71967AFE941AF6F387EC21333A6D54D0DCCF8B8030A62D4DCE323E6CDE In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 4B4E15C2FFBCDF3D85EBB40DF82B33DBEF5FE7DB148F0D1DF56B2649127455E1 In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = C24FA9ECB586C843DE5D2ECC64704580777EC32B92167A383BDCF664F7B9F39A In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = F639AF0E45033DC8F3643646ADDA30FD522B1E375CF34BD4F04E46049DEE8246 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 6D76B610320C5C7732CDC5C23781D7F931DCA1DC4DE0B438B2A07442BD1FA90C In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = D7B30952F814D5BF6D4203443D21BD353E866CD615F93B555220D1FB0A7C0DF7 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 3DB2149AF362D83E1AF96E2FD2B7A08C367D9F59BA4B65F0FD09945B39083FCB In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = B912AA656A2E33D9710CF86EC449461078C7ABDE85D8E31CCD39F4ACC8D67F91 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 811EF2AAC250B75A2231CC9BE17339AFA3778FD44336E4B4D1CDA73FD9C1B4AA In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = CBAB02B97B7636B86C23CC21FCA742453E75AC7B29B95072BF03DF27BD7CD13B In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 83F63733C1092B4BCA9BAE01AFDB80A0DC5FC1D60287B3BED5A2BECCF94DCE07 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = D785429352E1672E59AFD2CAA4445E2129F80C1A31EB98661528DC4D15D827B7 In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 5444FA5B925075ED148D11844224362FA1081A15F2BD44859A717B411DFD0F83 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 2B6BB3691B9617D1691EE51528BA35DFE0F6CA83CA8DF670EEB9AB41BDB03A5F In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = 793DF7427FA71156E9E7F0376C5FF0065877C8E937154010B9739360A33C26C3 In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 566A86949F03886D205E51FA7E7D892C24BDBE4D9D10E956DEE0EF61C88EA4C0 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = 48872584A1F006928081F777B8AC410E564A16E2D9302BB395DD49B91682D8A6 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = C1D4648E6E385343201C67A184C7A6F598905A37A131BAE2F942F33F6E5DD816 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = C46C4D7AE2DB1CCF0541100432C6A914F517E13311880DC00C9942AE28327ECD In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 95B9F8B71DA1DEB5FB6ECE239A78D4AE05C16D1A6BD0A3A50ECA8913E49E67E6 In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 06C41AE52120920D08807C1B192074578683D619855E2086DB03A4F451C235DC In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 1484139C615266CD88D53299CEB4423CACB8ED0F61A168D5CCEAB5EC42D157E2 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = D10FAA55A303F8BB1C7BB04A88401230F87B06D41922F1783DCAEAA72704C06D In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 85C0A4EB3930C65A860DECD952073587281A8F300D25B56847193C966D11A651 In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 11372EDEBEF36CCE2AB05D2D1FC69619B8122BBAD2A0C3DCCEFAF025F3D2358B In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = 8393E6903E3F13269E12A36BCABF0B2AC562C88DB8D6E712B02051784D6231D5 In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 9852F04E0B0DE5BA2730B13F309918D0A9659D55C4F1AD6D41E021EA27400231 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 441F12172D7BA309F914F6F0C028A03F5BB65B6311A575DCC4F58743C7F96806 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = 2CB9727430FE2AC583B1FC544D6D1D40435483C68E842A4C8B3E848472A121F8 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = 775D4282398533FDCEB51F582DF79F0D58F266BBFE7054D63588210F03DDE1BB In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 8B7A28798F57467E11F67618461E2D68FA46936E1140E3E04E7BCA5F5770871B In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 3DEFD55D53403A607EF9DDB4FA46AC538369A384FF5B1BBEA52A4E58F90573BA In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 45F62D59A636A8534EE1BE1C59E2886AA7CA91CF46918CA2EA58BDB1B261639D In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 8AEB26E5C317F7213F4EBD663CD03470579EB1C9123CD54FBE51366B67F67ECD In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = A7732E2C8A537FA70093190BCF79D4B6027F9F1117D806A759BBD7C8E86463DD In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 405027D542CA47AAB86E8EC3559949073038C63F1D387950AFF366324F7BEA26 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 21DA77B4FEEB0E383D1593CDFE0C4A85D2DA53EB1CE0B6E459D23337DE40A567 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 7A4D72FD944EF3F85DB6249B7CDE3F57234BBE83594090075FFA251BC9496EA0 In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = 7F972B1F0E3EB173CB63CB7C6A8907DF8DE1120FB5AF85528F0B13CBCD93709B In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = D2FE6C5C26C24F492C8E29B2E2F2138A1488AA25AD62E28D5F602E8E324DBBAB In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = 8CD3CCD8A2080C0CE4EAC9211D3B013FDEC990FDA15975133D01E917CDECB43D In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 072DCBC9EC0CB4C069005401C1EF6F08AACDB4987F34D3FDC0A10B2C63440036 In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 9C5C246D8DCEA6DC951C75695494979DF6EA10C4C02DD850D566E090CDEA7F7A In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = 7CF815EE452712716457935062D65B4A02EC61E035D310F2DB73B2646847CD06 In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = C4D9850774AE7356E1611F3053AF679461585643550EEA4D17DFABF56080926E In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = CB5F77251039B98B8C824C4A4B9D0488E91CEFB9C0034A8DADA90892CF44130C In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = A81B4D1186780D240DFA3EE37E1B0D7D88D25C55F6F301A79DF30988247BBC70 In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = F0425B89B75EAB5D927E4A03034FBBFF2F80E59D704655EFD75153D1CAEC7316 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 2F5C290FDCB38D252A6C5AA2B0F2519FB47AA97F9B5151DBED387B3E60D639C0 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = 9C4B1992D5EC2DDC9504D85D97D9A845972E2501B09E13EE4C1E2ECC84B581E7 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = F69FD7169508A69D59F81431A40B355CB932E06A850F19B334E758B4851BDDE5 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 392A2AD8A05DA5927E742523113EF9BEE70672F85247F5C05A6FDBB507434964 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 7120ECAFC3DDC28D152D796B9630AB7A7B7742E9F639F831A42595AF6A8EC8E4 In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = DA9737030E97B534C1EF0204519BD64ABC568BCDA2C04F426EDB8F4966E9AC7F In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = D6EB621F0B57F913E2A782E63A67808E788E1C4673ACC7467DD6A9218B747119 In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 164AAFF496C06CC2B089726C5F3702EFF2ED35C5159A9B74306C5CF3639EBE90 In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = 99039CFBCC6B979118FD416AB3CA7F2540EB62F61E8895685C32BECDFD661F8D In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 146FDD252459AFF5E14A963AE6E7FD1C9C509911A4A100B2CF62BFFD4E2A8D4F In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 8FD3DAADCCDA89D6FE84BB94B4BA194A969BADCEEC9E510EAB6D77FEA83F5930 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = C900C0A33321CE80ED34A3D3A88AF670A13019B06F2066DBFA14104A79AD578B In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 815BA6349B6C7704802C59C9D54FB796C64CDE7E4FC87F870447E4E98EEBA3B3 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 4F726B5A60D083798AF6D1407D1C17368F553502424162D0549C93C5B370749D In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 8970E3E29F24F3CB0EC4200101613BE64C14EA7C117DF6704E392B62D7F9927F In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = F6CBE810CCC93A606683E556FBA4B78AAB5BC74CBA137F0D4E31F5705ECE4AA5 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = 4BC436A09B83523B49B9721F1C9BBC96D2C4B2A9EAFC461DF343E819401F10FE In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 967CFF9DEB5B79D5A79E7255B50BD14B7A060CEF866E22768765D3D192367F44 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = F76063CC288B4A2945D50FD90AC056149BED0F4E68EC1A2907CE290FD7DB7242 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = C09252DCDCEE60B6D40D7CFB313CDD1B56E0C95D5900F213D0CF33BF27F0073F In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = D8E3DF304D967FCA273D4D9DAA82EF70C1C3E01CB391094A2C35797ACAB3865D In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = B702FE508BF21919E30EDDA6879F47DCD9A07F860A779DB54B7F93B86074E13E In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 338596124CF38B825E1EC2F1882B414F1A2E5F88706361D5C7B22C38E385BE97 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = CC632B6299B71EAF8106B35771ECA7BF2DDC3FA5B54FC278D402AEEA12E5DEE8 In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 2E3A0AD6FD16B9DC2E43C209464B340444712B1DDEBC1D366D198723B06F5A87 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 587B6CDE5AF1C260A1F225337B6BD487B2140028B1D1266A58C4D9B1DCD0F59F In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = 11C167C3B9114ECD0EFED8DEF748324D873165175C5467CA286A954C86057381 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 35175ED1977AB325C9E2EE0FCD6519EF0A9BD1C6DB9E1A9D62BB3CB684EC28F4 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 78A2B33CA04DE4C0A372B8C49522F3BB92B8242D38DE344F827F0BA922A398D6 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = 19B67B2C65CDDA7F8CE2F1D8E811E19A98FE81232C36779A48791CD74374AF7A In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = B53F312518C9388436E34D48DD454F2C29AFB3B12093B487C71E60B93712AAF6 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = C8B9BE64E82F970997915C3AAA37E51C1A579EAC6CD4468850FA73F23BF4B5F1 In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = 3D8C612433F48DB7FB54B15976C9A236881C063856D49196CB1F511B89A05510 In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = ED206C5BDA53BCC418757E00856836439AC9E08A6E508686AFB5A46E6654170F In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = E96E6AAACD7861831357DD9C329F4056C2A1686622FD3F86193156E14D6B2E94 In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 9A601FDD743DD62BF8D34381BBADEE8F17D5E1B4B7CC0CABE53479A0AA1567A1 In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = 46B054CAB7793E1A16CCA37CA85712838081FA3A334642C0E441842F7071C534 In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 16188C138D46FCEE0B58456CF6EEE9214D405B280A14DD293403FDD1BF4F90E8 In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = 20EA35A4B0101DAE67CC931DC3E5FE49BDF57D9C7363447AA91582356B0F24F2 In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 1F1BF037BBAACC00647465511091824888D04D56FF40B53AAE3E78280FB7497E In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 2D9AD26CEF0B7DEC8436F19672CD1487FF65E6C5763778E90D4164EA2F0D74A1 In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = FCD651FB9D79865F0BE6C8144FAD6750B534B4924A547102BDE67761B44A2C1E In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 73C2F21B32CD6192A9547BF74A6BB7622E6FA6B044F92122758DDF485B21DDB4 In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 082E5D0692CF3D274897917ABC66A0E0688A5D4C87DA370009A4D3F91022B0A8 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = C88DD85BC74DFA17EB4A683018335CC71E73363CFE24E45690D25D98E969EB74 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 2AA62C1184D50EDEFB26B3AA922749356FB0741D6E3D9BCBF555521ACB106DEE In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 0A27CAA8388E204CD880A7FACD901EE93D98E019CD246111D634EA25AFAD33F5 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = FB6F77140837DF9E820106140FB80C6AA06688085BB05CC118B7131E5F4BCB20 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = FE039B7451F493B06607AF7F50116A7C9D5322BF18A942077CEFFFB6AA781073 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 685AD3988956726FB7F0669C8140D8119E5C3FA386C976172248554319DDE6D0 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = 6FD7CD6C507AB2978CFC6CB16FB5278517D5BC9E944CC12B53C2B1407C27DB76 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 48DECA46A39F2D84A8740169512CC3D99F6C229752D7C4741F14349E3D9F5970 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 1E6E99CD27A58B5A84F68B573C2595106DA4301478C9F54FD95D1A4926FB1224 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = 2D19BF4397B20FD9693D4167C334AA1F44898FB5456DD94F9CB3B21C8DEA28BE In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 1C089D1F7B04E3F871828E02560D59402356FE52E3332139BDAE63D7B82430DB In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = E9AA79C0065A30290B7DB60CF78252B4C9A65000DA256BC4BF46C9E6EC2D36DA In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = E0D9BB2C3FA082F0931C3091FFF450A3B43EF40A1AB23B7CED5D3DBB35C8D090 In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 6BFC745A0ECF2A0EC61B18DC3864171CB06F390397C8EF56BAA9FDB691EDA61F In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = C04B36B064A0E7255F9D93726BEB8CEB6AF104AACF95E0B1D9FE6674E3E28500 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = D1BAB81690777D5953C7758304DBA49D869EEBE5614CCB7B43D29B206ABF86E0 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = 59F8C65D1A89437DFED8776DDFC679C2A7090EBAE7CEFDA8D5C5E7131726E61C In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = FCC79031940D459B1AFFF94245872EC10F365E4191CFEB730073D8FD6542FAA6 In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = 2FFC21A7A45695B5112E00EDE09B4309D4332784B44DF8F7A318F399D419EF44 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 07F623F572AD11B9F025D3700331F105ECBEA315D3ACFC93D00F064C1D2124F8 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = B87633654FD1D30A3C7F7FC08A5901ADE1DFE1AD121EAE77F6CA81CDAF0F28FA In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 3243CC1A40EB34682A5BB6731E6895B532A9FD119E5D132D969504F964B687DD In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 7EF35A6D1831DA07BC5FEC817843308B0CCFD303F40B1F40DCC56D0F2281D74C In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = CD86A27F91AF52AE38271459E2D3531E6960981CC6A1FDB7B27D050FAA7A1911 In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = CBD9AE4BCE3ABC5B01754388DED697F95ADB8FAD595B9CAD613EA5EEDC5F6F36 In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 6A9C06F5740755E87EA22671B99749C1E7E8B8261E6C514B0FB68F6FD593576F In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = F80CF26B72499FF551F99236CF91C2E8152D36BB6952CC7CFD1D8F415DA4F6BC In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = D012BF61D4A8587D0C891AA96C550539CDBBE77385075B214BF607B9096DE3FB In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = EBD2851FC04B38E57323CE3199854DBB56DA53771EA6AA36F92D4F9D410A5750 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 22C3FFDB2F4F12F5E7E7E1B440F793F807C82C6A1758AD385C119144F8AFDF4E In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = AACBAEDB29AC2298073C5A4CD93EC4911829379957544DAB0F0913B6B6AFCEF2 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = E16B44C16364E7A8A9747CA062EDA67C07688F5353DB8AC76B97E4B87A33271C In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 89D35349D86B5FABBCFF385931532888F7DAB44B35E4522B196DBCC34FF5F912 [Skein-512(384)] In = Out = DD5AAF4589DC227BD1EB7BC68771F5BAEAA3586EF6C7680167A023EC8CE26980F06C4082C488B4AC9EF313F8CBE70808 In = CC Out = 00D5A235BE7BC36A9FD68227A593F106EE831F3F7558C96DA5B71AE7D0DB3084E43D6C57D9F202E8C69CC2C0D4333B20 In = 41FB Out = BD9CF424D78ECEF97BF6350B8A3108B2564D1C5ACD225F1AAFAB38952E2D055C63CBB2D4E2E3E1E0EECDC509D0376F64 In = 1F877C Out = 772D0130AF7122EC74CCC8D3525C9DED5EB947E7986D404289A188903DAE603BCD602463C9E5B5B36DC35BC2EFA63269 In = C1ECFDFC Out = 4695DA47BFB7CA4B4E3A75A9D11F32D4E1D2B157E4CC6C99D2F8958576E689C1CD290FE681F93815DE0597C1955B8FB7 In = 21F134AC57 Out = E05E9F03E3B93B551C8B6831A90236CF52353B5823DD7B0ED4C5C5E561B9BB4C1E89FB754C2A322E06F353D1279C41AC In = C6F50BB74E29 Out = EDC71C49237BADF4BB2AF8B3C323FD1B97B9C36007D0BACCD576D86A489DCC8F2D6057ED1367F11CE9608675510A800B In = 119713CC83EEEF Out = EA913BBDB422C1FEA6265B76D31595263C85CFFD649987A390937CACDD6DEB5A60737442B0F65B026ED7E33F8BA8C984 In = 4A4F202484512526 Out = A1FDE8F1FD6173938BFE97FAC79CF039ED1706037A37728AF44A8DE9BD3B0104527A41EF9BDF2DD6F9F47D6DFFB54F2E In = 1F66AB4185ED9B6375 Out = 6B5B8FF4A1E0E17A5A56DE5E22BBCA3C2515097FDC9F37FE3BE7AC795E4DABA9109D1D385089598ED66338432D403E2B In = EED7422227613B6F53C9 Out = 55E9B42D26411536444796D4491F8F0AE584AD34944266DFEFCAA8017D187ABF11FD7FF11F5213854D0BB8613976B3CF In = EAEED5CDFFD89DECE455F1 Out = AEC708568481A72811A7433EA10D108776ECF04800817160A9A7F81444D018CC343F59985EF697C5132E9E83FD093A8B In = 5BE43C90F22902E4FE8ED2D3 Out = D4C81A25FBAC868A5948ADCB01E2080F1C4E05B78C168E4F4A86B8B2847BFEDF81C0A15FDE4663B6D853496C18D96DCE In = A746273228122F381C3B46E4F1 Out = FD050947149FCB0ACADDD62D54C8B1F1AE7C92402FE5D3628E9C729B389DDD2F64D3773EA7FB3283A0B2779366BB1ACD In = 3C5871CD619C69A63B540EB5A625 Out = 90F75B68A1C4DEF30110140532B6010FD20E31E73B789BCD83242CED91F55168173C58E8F25E938E539E48CD8AADAE18 In = FA22874BCC068879E8EF11A69F0722 Out = 9824CAE6430B1A48ACB966ACA678BC04E2DA5D1D8AE80693805723E2F0163B4CAAF711EC56F1A7F34ACF06B73D953663 In = 52A608AB21CCDD8A4457A57EDE782176 Out = B68EDDA2FF7CCCB2ABCFFB878C565F5628F0804992218305FDD64FB1973EED7022A2A10983179761F2181B1C814C45AF In = 82E192E4043DDCD12ECF52969D0F807EED Out = 6B5D6A0E5A65EBAEECB1E355CD315E1F08FC2F661D49A5133816F20F8EDEF2E68FA2239062228A2C8B3F5EF1B93EE776 In = 75683DCB556140C522543BB6E9098B21A21E Out = 21C60C9A2E785776F148BD8E022AAAD1E96CC4D504E29595AA1DEF00D6D0D64A7206FF3A8538E9BED2465ED07239A7D4 In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 88C9F13E2287DCB77E130BDB79FBBD10CF57E2D7B1FB14C75827C38C07182DDB44567261AAF221E2A030B0DF6A687E7B In = E26193989D06568FE688E75540AEA06747D9F851 Out = 3DEE36F24D127B2E6C8F15C8A5D9BB63536536B0CFF7F8D9A6D4E2E76C1102E6E72BCE71DCF883F7E416FE68F0FD7FF2 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = E443B8372B11BFB4CE30EDCC67AB71683B4D5CA4F03F8B2DBDB01874FFDABA9BFBA53BA02EB1D4A528E78403DE969C60 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 8F6943635374867A09D3A48AB01693B912A5AA1922E0471F63C27A4B21CD813DA83A60373149DC3520F54C5C77137B61 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = CA43C3340DABC7468B13C36F99CA7A74AD1F9F20E19B7D56836ABC487B5566881EA55AA832A538B8CC4F5327CE0D92FE In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = 1FF2C4A8ED156BEA863C707E83B4761F9476A54C247D09EC1B80E500D816B6AF123AD985846DE52A5748C3A3522C49AD In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = 02F0D9A142AE9E372399666F18BF475BD8F0FF295E40E017628CAFF59B5696DA077A1FFFA5EE5F7F80655B77BFC86BD9 In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = 53BA772B7269004E71B65D9B57186038F69936D583937846BCAA1663077020581AE8C132083607B7B8780756403CDE0B In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = 3B1C7ADCAF40CF70ABDE54815A0B1ACA426D0C3F13E1BA202D79C8373867D10852318A51F4D8EDF5BEA2CE6E47CEDCE9 In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = B5A639D4D0254238E1642D5767E80580391A6AB2A423123DCFBF094F210776A89211E54810FEC520AA6F9F819ACB8FFB In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 330666C8C85D5AC1E59EF7B72428C383530C0C2597AF6E6A6005138990577E52856BBC7E153804234CBB7A2F96CB1A56 In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = D159D7F40DDC09965E3D57EC61E5F6D34BA5B8F57CB4D986C4A25B64F4A58CDC97FBABF386DD47ED8C381C336EBCA0A0 In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 2AF14104E4EC86798C83648E632CB6858B8E57669D6AB8DA032D2B93857638D065B50F5EFCC0332E806A6A2FACE8F021 In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = A6B34FDA062D8FB9C9DD4D088EACB612F38C67E932F4C6A9C7BA5D3285BFB5696E448821922B14DA012128E4D0D07038 In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = 8CBF02F8C8E4A9A016D73F0F03ABECAE333454C407CBF4BD4F04D3B793EF83989661B28A93107DD1C4C7063C113BD7F4 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 2F6AF995CC2FE971791211C8C4320E88A17A519B4AFA8BB507BE3FB320FF5CD242817E3B7B05B3DCEB754AC27B17C776 In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 859ECDC28135742976F8ADE4448D36BF8DF2065FCC61249FA18DFD701ABDEED1589BABEC4E2A172C0F284355C0DB5BCC In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = BE285BF78BDCDEFD092E78B03F4CAFBB532B82CAED6FE80571BE4D08B499E02B6298DD08AD1499534510B7FA68D999A8 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = 8258CE0AC0459B3674BFFC7649D914B6389F085339B68AFE019129EFD1590EF11E6221A2A1E3A43845FDC0D17DEE38E7 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = B937D1FB0DC3DB01F50E8403C0F4FB2BC3497BF6066D082D3F7F6F801046B3C93607C8394E8DD876122311CDC96BF322 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = 083D3E568350FF19873B846811BD9DFCEE62AA33D7DC6D1974427FAFC9D8B098A1188047666EF3DFDD16A15E0B21A6B0 In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 814C38F1F0A4B150FD1B3FFCEDA4C82182AEE533BD740E00BE0DCAD7D2C593B7F0D668F200FD60ABAF73954B1159DCFF In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = 603B381E7A62AFECE40A85E880CA81074FF9813561D35599A75591219F081223F22B77BC2556A930E221900E46717A08 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = 97048BF08A3AA022FD8B7B27B3378C71EEBA5A53CE131371B0F2174FA7362313BC4E4611FADAB501B00B626FC0285410 In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = A939E04321A4CD5C0CC8C9A6F3A0FA5BFE2F7E3F641780216C3D4F19498E4CC099BF4C7FF72D2DBE0B9DB0583B6FD87A In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = EEF30A214C1A13BC7CC3DBA6B2F6F0F3EE9402F1FD2FF30F7E365132AC40B2D52D42B5DCDCFFC2E8DBEBF9A085DE6DE3 In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 5EA522484208E44E03899F34B7CE1407D7248B4449A5D1017A315261C15F8328FF91EB71437E5959816948B8FEFB8BCC In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 8F369EA3FBF4EB7AC6B403AC2AAC0C1010BBAEDC3E3AE56A230DB5C8AB74E279A01DA2746945C9AD3D3C2EDA2F979B84 In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = E66948BB3F78F35702DA8B86CF00F8213C69F2C2D6AE53B5BE49A87C94B9CA96BE10E3ED70F7CAA1348233C8821ADE5B In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = 48EFB81903ECFB45C8E8E6AB4EE613CC51553A3614BCA5728723DC425DF72119761106AAB2BED22281F6329DCC4B76C0 In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = 8CF73E9A7482F2F724CFC20122D53CE753E125AE10D45EA151CAA71E809C74BE80BFEC538E033DAEF738E6AC4DB0BD28 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = E5A64162D97DCCD5AF0510FDF419148421D0C78AD034F84BD10A4459640BC2E084E8D79AC075C91B182B0B21DEE30F8E In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 7477FE62A1179ECD8C1FE3E631D6F50B05C205479723BCF2FBFC4CCB9622D03005209B726559E9B45CD3CFD84E063175 In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = 72445990CC993DE49DEAA95505141B85FEE3A91E3BE2B49C565FAF28F9B7407703449AE0BCEC6F9A7C7CD9330DA2C8DF In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 6FEDD863F915ED412DCF94982665D1804E2851048D680A2A16147790998F3B538C23CFA009E80F6633AC8F3A5EF2C07F In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = AB6AC800BC4DAE0AC3E068931CC247B911CC44CAC61893D5C3902BA244BFE42EF5A4CF56535F01A324F099F2592DA042 In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = A3053719509C08B2115E123182D7F539D3B27CE99C9E418508C231CE96D8C51E51F83DFBBA64991BC23B9311B827BF6F In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = C199DD19BF41CE9553A579F12991CED14EC0484E6ACB402298584EF14167814BFA1BF146E8151C0FD0924864B7A651CE In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = 8497A79BFBDBC9C94799FAF66A73D627D04A788447217829E06D624A44E110B43EB578502D2F94039CBB5F844CF4B5DF In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = 2F23ECE869A3591573DAF89F82CA1699489B7205F8D0FC13C8238EB16808BFB3393B42AB5269C23908D35493270582FB In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = 775822112196C6CC4D1A8AC4284087B3CF6EF8334929714D1DA233E15C815AC3E2C99311486DB75E046C0D72D98159CD In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 9395D781970EB7ACADE92B142A840D11065E54238EA80EC618E567D3640A5F812DDBED2B4B406DC5CB2C4D02B78B39A9 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 7328901A867F6942A36EF905C9D154737684A0A119322C1D5AF780CBC3C2FE1499B7813D563CF5AC17DD200DF6C57618 In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = 8B2C2A7A93EC9783F67F1F8BA86C81A650C1218356072DDFBE0A6834B0029E48B1673D48B9E9D34C6164633F098305FB In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = 8683823D6C629A73AF3DFA73E0355260691CCEFC35F135CD320DD3D6A44D0F25E5B614EBE22F3D5E5A29827DD438EFDA In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 1E9C6A6B67535E471198511F01D3873B37588D140ACCC3A06041CF0FA6896EF88FBAE115C225E13D07E49E8B521D8326 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = 682DE91050385C47497C05D0AEBC9A6611D21EE9FDE7BF7393DE821662D6F41DA566715827D73133BBAF5DD10E7BB8AB In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 7CFC7B59B57F22182AB86CE7464FD43C10087940B15338B864554435915C29A4D56886ABB579C0031369E8A6D9782602 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = 1171EF0A8BD1645EB6320AF04151333FDA4A961EEB1B9B544B84CF2D48C7FD1B1458BFED6DF5337CD06EFF2F8927A427 In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 975FB226B9943E93814ECBA7C0FE0271FFAE444A3EE3635C319B9D348C065738EC2C0F203A7D2B582F65BDE3244F0DCE In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = 8BF840C06597588DEE710B6FFA63DA53DBBD9E5674C1997870F6C990434BC837E486D21259E5AE7DF20ED6230F82F549 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = C7E1A46BD6641BF28161FF73FED29CA40C1737D2E55426CC6AFFA668C62B100312A9993CBF58AD1C67F8B45F2005B280 In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 973C655510B5767CF9245DDCD991A35653061589E677A3A22420718BA9B31A6474FB3BBBA6D9CC19069FFC0C13CB174D In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = 4F96FC1285F6CD408B14B1BC2969F0105BB8834EF0B993D5EF47FE018B9327843920A0DFA9237750ECC6AD16A1C1932F In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 14C74562DB319DE30671B7C2B74B84ACF67D0E7009D82C96BD23D868DF353161A5C38743A1D2B1F35FDC3D8A03137B18 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = E3482648C5F49C90AF744CBF74439C43DC28BCB956FB0165D3B1968018B5A1B4CDEC982464E3ED1F8571D2A9487D22BC In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = C5214A3074257511884A1E3BB06DE151C0BEE6C6FECB94282A8A4AFCFC8E1107D5619C80104C985275E1162BA8D64A1E In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 129F42FA6E56C17F89301B300B907F0E28BD1B50742FEB4EF1027A571BB7011E216A90468EDA7F5C0FC5352BFAAC285D In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = ED92AF2CBE613F76FBB29ABF8F539FD4E754341DC891E31690DAD02CDBF2D1C108AA97510DA91F9E931AB9DE9BCD1449 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 7592D415456664D9F5D1E2BA489DAC869B4A0C76929DD9AB3492BFC29843AC3B63FFDF98B2F3D2B97C6F901F7C8BC22D In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = 2B41D4B92DCA870B714C17F6A2C171E2F7ED712DB17D2B804B0EF1DD811EFA05D5302400DAAC35B7D8A6C0B19312D640 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = D6F3CFF75165E880FF89D66532C976857EDD33CCE338CC38C4A792C9AB769305EDE34F9AA2ED90BC80B8CE693D674746 In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = C380F8A8BA9207D5C8985A47A2F4A47DA929EE9A59BBDAF0583F910D8F8B38DEFF8B7C33411A8CCA3A048EB14C116E7B In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = 43878C46883783F66B667B82FBF04AEBCA2976F211CADD51CBEA2A89C0D02E23B0F0ECF89416F92687CC4F34998420A9 In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = 9CA305733AAE6AAF6A9FBC8BE3EF738160472B427A7D45512BE95B28512844A62CC9E77C6485BD64ECAA70947742BA16 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = 15C963B78566DAF09DB081A03D46BF07F56A04BEC06EED0772022DE538FB97A2C3C74C0112C218426D200C89806DEEE7 In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = ADFD0604E3E8C69761E5216A74972DF8524A80A4BFC44A9036685D1319DBAAA419B77643151AAA6354ACF0ACBBE8B804 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = F0E83C63AAB311880E90AAA11F813A7BDB33A54D9EF8300B89782720CB9F63D168BE37EB9AF76842102B83C1C3D2CFE5 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = 05B693139D12AB6357BF8E86CC0651986B562E69FF1793FC917882058F65BC5F7E29990855F4066F74194EB33C45D3C9 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = BD4AB805B0EF51C99A38D7312553D6A424C9FED2A012BCE569DA68D8464B828F2B724550C1CC8E5818325D7595B87517 In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = C41E37493A92C1B13775C345E8C0A910D08310FF38445D3556278F6DCB5282EC4BDE63800C5302C497146A031214547B In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 980F52FA262ECF7ABDC572AC637FA853E97E50C20746D706A4405F446BBFE5851D94D2D55B176ACBF7F6C8A3062D9644 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = 8A1948E4A7BF5A30C6C89215C78D7A3387F55E74E5C6B0A78D9C058E62BC2BE5E27F5511927290860403F2CE55C89896 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = C6D8729A614F63955D25E2647335679400DDD4B7A11DA5570D606B6E17649A3B8007AD1D29C36142CDF05A35BDDEEEB6 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = 3817C40F6AD82A51DF2BA03F904224BE15609D19110591EBE004C87DB7D3CBABB839F033A0602830F6DFBF8B739776D7 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 177F858C375275BE09FA3C7E969B2718199992F43E1BF38559035F7C512132FEB977F58EA3CE5A04E4FEFBFD46DD44DA In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 4D7D591B8FC1499A15D7CA4BB2D2ED66EFE8EDC62D4E4E0020ADA049C9645C5C880977162C5C6BA8762E34135439EC46 In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 9321BC18EB42FD8D566238755E0F3F2E36DB0C2C445585BF7874F8F01EE19840DA5DE2399FAEF98760627E8C4DDCE5EC In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = 7B3762B361A2031BD55AEC95F7F1D3AF6CDAA0C53543893B8AD5D8E4F173DC86D931AA2EE257EA9DB3FD723226851AF5 In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 4B60819A230AC7B5E9E79FDE70508BF2301636A400A266A623FF3F5AB15273031A95B0D1C66711287C76445172F98224 In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = 5657BA563863831C7E760A4A913960D3B5A0B5F2ACB40BB0DABB3BCB71D3F5BB261C3BC33A4B2F4B10066F88BB5C4824 In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 3D6479DF27738459A5953533BC80002CC160A14C44EB931F30C19D572DEE9ADC551F47833CF9BA1B54FBE238A3684EAE In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 1AA0DC5B65B7BC36A42A872211BAB8C337A88608104F4B0D94BECD4642888EA78096AB61E10A8A2601F5C19E099143F5 In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = 7DCD04C49C5775B2C5720B1D3C86237B8609240C442E82677F4BAFE95DF71E9BEA21EA038B8641049D10795E4592DBB7 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 27D71344127B131779C522AC0732CB86924CA604F9D828B397A4BD8668620D7F1A498C4647964514FFEBD65ED83E3FA4 In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = F35AD05903827DE6880D6743789EAA2BC151290105E93555BDF2222F246F3453D25E78CA20AF97FC7BF49C05AE8691D5 In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = 6C590B5247D6B2DC4EAE1E6091260CC4CEA39609533D7EEAFA2E714A615F69954BA89AB1385F71F2067B347B3EAE18A7 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = BA27E4B6235FBFA30C121828756AF482C9AA4AEDAF03FA71B28A79A9AB91065B534A386C09BC8F82F5833F9C7F5A65CC In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = C43E0FB71DCC91B15DCE61EE77F1AB80C35A4060160F0333717849D53678A2DB2368650177E2499EBC3924173C709350 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = E7D3CA73945E95DEF943819387EAE4D2E7A06ABF070743ACF98886E6E9C0D04C7AA8E45023360DF8660FE2316E7D4C5E In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = BB0416CE04F9E1C44338185FF508469E67628198CC623BA9D426EEEAFD1EA953FEA2ADD9AABA60B719A372585FA4A9CF In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = 9382974C4AB1F5DEE47B7BC4F46B9D3A9314ED25BE2D0E58613AC5DAD58F5AE425483B600E5EF80B97FC7AADA7AD94CD In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = A08D2AC21C648AD99DD8D6EB513E9C35B882E7EECDB0298D79698726C9AEF1256D6E3C589D46AE2C37E1D181D8CE7FBC In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = 34098ADF5B1AEA0505F05675EFE5D0087F21DCE090F9CF8462CBE90D7733012CE6B2473ED09FC76D20A88856F36702BB In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = 4BC42095E61032311071028B4D0822F9A1D6458DED53BE8AFF09A3F8298D981B3E160DED1AEE4E76132EC6ECE0ACA676 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = 5E7FAEB80BD976475D5353B516AE7741172CFBD2E01BB791477952B9AB3FAB6A8C6E9B465C519467EC7D74C72D5F444D In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = 3BCE4C5C10AF910C8F918D616F8448C1185C3FE5CAFC6FB65F78088114DBC73BF776B752369DCED810FA3C17BA6C9D04 In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = 5CFF0ABBBA9A99444F35D7059E00426A54F00FD40700CAA11B9DAD24585B9CDE8611E2D2362198679661B0C8BB32D51F In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = 7D267BC373B124004D87779694CF540376EF8F2B70FD2A1C42CFA2ABF1B3188369FAC54388D49193CDC290C6A4EBB42C In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = 5C8EAD9B63BE6A53B2BB566F7F85922A0C34188CD423A00C2E8A7CBA853E5D1099CD80F528ED566BB2E109B24C0A2705 In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 3A33C662B1627ED8BE5F663EF7D31339D77A417D7214D876375854C8B47A733A121AFAF4105939CD85C758DC50A9C01B In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = 93790C9ED2B9CEDA2F0D084D36823AA0E65C0451266B212B6E1CBE1FD7170E7F48AD9B40378E8AC6FADB5836A94D9358 In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 3D584E6ABFB76DC37E1970D1F6562624CF36C286D215E99C8B52C94A2413754BA6BA57E9F2B400DB32FCBF7897190427 In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 625F1B266FF16C3A6E578A5553160E4C988A9981A14A4E36658F96052BD6FEDB9DBC82BDBD7AB8F9D15CB8A6D6C60529 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 3A7C288A8DEF3863BD9794FEB6EB6088E654B583B7B47FCA43B0D11D5B141D4C4D0196181FE7D715A17666A5C9F85746 In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = 4A6C0BA558A8E6472D7ED43B3863119226D5E0B5E9F5FAD0EFCFB9725259782EAA01E664A9C6FC7E127232FC403F5BA8 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 3988419A32965476568BC28195C1308F7863CB90FBA3F4E25DD6B60A1828185FEE9493053C727268AA17F774409DEFF1 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = B7A68974A7B5A9444E9F1977EDA765DFC7CD6DC4D34B74107C0AA718713ED9501CE0B6EF11BE8A40E6AC370B791AE955 In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = ACC04F6CD4D93DA8EB2EC1F225F538217401751585B47CCF268E743B138E3B9DF2F03D208A003A69579C4CBBEA7B5ADB In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 9031196E98F4EBA461944E5CBDFF97FA210919DFDE60E4BDB8C62DFECADEEEDAA284F78276C1CA7D31ED87EACD798E90 In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 404B437E1FBD49BC970B010DC86FCA3FE2ABDBD5F651921781BDC92BD7B2D02DC2D20FB5F913AA4CB3BFF6283DD1F1DE In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = 375089B896A0A11A62A6B5144334E963DE8D5D2557E5B93E9A9A8ADBDF639FC40DD2966D09857E475D58A7F72CA257E9 In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = 55E79BAD42518ED80454272B5B9E6A61E4EE11C77297DF64C29120CB95BDEE5218C081CD272BA6AF14A0BFA03DBB9F15 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = E306B55F3A8A22499E54F8C784C24AE0769458C4F42EF9A8F5FC209A7058DA288AE4DDA3639B15AA718F6784B2F179A6 In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = AAAC679BB72A7CBE019909BE598B1E82227A491A3CD4F1FBDAE51245C844769CC15F89DC2D353E8B9E0766064BD5DE20 In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = C47DD79BC487DF4A1C459BC945543B7D17DB14DDC53F84D4EBE7A7A835422F65B7B500212E8F830565FA7AC78F2696AC In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 419D6DB2DB67466999F9CE9736B5CA4E6C4351E02D7C3343233894FC65D438DF1B212A0BF6CA935BB0660D24F89A6188 In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = A3ED4A09341F3D635442AC84B4E01A66E21D2253086F57150FEBB8805ADDE39BCE691E309CB8DF2F8D5148CBFC28AC1A In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = F741849B3C9A09212FE6D9090A63467058E1B2AAE77D8366195D780FC7BA359E7732FAB032551494D889463A0FDDF5A8 In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = ADA5085E13200EB6B07BB5565A718888F3922DC71EE085560EE26263D21ECDAA032E30A1B74B34908E818C6C9D8EFFB4 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 69C5C00A53B66F7386552E4506E980C99EB4654AE21C3A92DB94E13D5EB5C5B848DC29DC5F19874F670A211EC5B07CAF In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = 9F32B2C516A497DC2A12CE93545D8C86601EB7FE1231264F3D5B28FCC4C9E6D76A5AB5ED76BBCD28CDFF9DFA18864B5B In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 54645F0753C08007A1AFDDD5E59A59FDAB5B45E663C155BBEB2D7EAA9700886752E155A2FCB734B7B92EC3D9CE8C7B4A In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = C0469566E1C774CCB2C1C3FBD299C7D136F37D351D5EFE7428D4F213406B5C2802D5B897A4A5FA6AFC49466893069F6D In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = F7DCB1025BDE3AF26DC11AFA59C3F2D56FC8FF46D7F5C61447592AA9F9A47C5E0FA5904CBA15A83DC9A7F407EEB5DFAC In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 07FE20E4EA9960F0D43BF93B76AE784E127D34E4E67F4DC677A5F11186A3132910F988BF53810374702C631C8B511902 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = B679E7B3974A42A7E34D3E5E270A73595DE2EA1178AB9F539EC51624C89812E54B4BF7AA05B0BD6B2F52A100A10B245F In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 237CA952F8AE90BAF62F8CD927DBFD2DC2A82787F25916E0A7D1EFDE1491D6FCB627D9E4D5D7DC4DE3AD36C04407A129 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = 9A900E561004D66F944C17AC3C1D238A14F678BBE5DF2EC63891F0ECEAA49268A852CE388334D9CC5179D97DF9DCCC55 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = EBB3BCA2B586A767BC121E7AC63DE3ED29B9EFBFDC82A22D133BCC5DEEE7EF34BB81088620F09514D65E29D2FF82B3F4 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 89D430452B2467223CF1254F8D1F7B4012711BAD255CF60B4817502D83011D2F64E2D59C8DFCED1071B82C684F28B69E In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = FFF51AE665CE613D7113AD4562AC0F3783CF0F0F5F53174CD15F7FA2B330C622519271831FEBBC21357922CA38C2ED44 In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = 4DDB8D8182B7712B1F5956F25FE22673729CA3EB7EFE77C173168B73FF7A086780366BBE4B6218E9C09B2D0956D0CD79 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 0F7039A7F59D0FC589C303F54E5015626A0832A6CE41C49871761479282F87C032035367CB6D5205B0984EFE9705EA04 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = E6E8C29BDF2354D7087F0DFFAD3B100A13997A299F5A3C5F4A1B13996F575DCF0552D8FE3DB6FF835CBFA6EA115ACAA1 In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = C9C4913F7804EC328F3713B62C69A5716E401BBEA02B9D9FD8E99814CCF00F54175F40DEE92515A9FCCCC59E2D4B7F3B In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 2FF5E9203513AC6681360B1719B847A7A9E48590CFA0C76AD2F1D9E05417BA2EDD8459429AA4C6857F1B55E7F8D402EB In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = 6E5E1E478E688F2D7A9A2723C5B395D9924D42ADAC58458397BBACAF361BD1F8B812910413EFA8F1953D6C9363C9E779 In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = 713B07CD3D7BCC143FC0F5BD0C9CF749A34BCCBD2F073D38BE7AA65513CE6BA617854ECFCACDBE2C343163685B2813D3 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 3891B10051961C47CAEDD4355D1B3804FCB527F48B113BA7AE5A6738F8A5DEF00BD3739619D938A2DEA98E890C244F30 In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = 46AD8864D8AE2DBF6049936A56A766C5FF7E08354E6059EC758BF0BC289957E26A21AD9DD98EBF35C7F41BBD3C9A82C3 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = E86B2AFD940F8D97B6B5014C350840336B97BDDF10242209BA6BD1CD4033D23A9704F045AC313C558C725FEB30870370 In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = 73F02E63CB23E05A6267D1114CBAFED30E4FFBE315B70CEA1824167C82FC2F04260669439E9DDB1FF7A4737B8279C204 In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = 449557E5DDA3121C1CD0DC77AB17F3CAC077AE32D287128BFFF24674266235AC56A1D876BC6E4E42B32EEAD51D6ADFC8 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 03793FDEC73FD0F461E74ACB6AE9858124FC92F17689E8987C4C7361091D67975F98EC2C0BF902218C144E4A83966E68 In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 710D5E801FE13571B1FCBA8451B129737BDC775B677D8A0AF7DC3E293FD6D17E87F77D9570DB5E7967D4061C71D8D576 In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 2012C552935A60747AB15AECBEB64E4E32DEC26B0A51913525BCBEFA4E0D64A86EEE815A77F4BB3CC0C8724041C78DB9 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 5F47B2BCC16C913C91703DE29DD5F81E1C292A36186D814FF2D118637178BD6AE099E7416744F402228EBF85C071FFFB In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = 1B63D53002737F57F16FFF205D53E9932488BB5C6F8A48B99931E6C6DDEDB8D761A6AD6CF9D1D3A1282A20600C8832A1 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = 8F4517FAD18DB33ADB334BBC933DFBE99EC9ECAB7B6D9F80BB32CD37B7597892A475EABB3534596D54F6CBD58ED507AD In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = B517B814751DE093AC8DCB321E3246298615C2C404A17AA34DE73926FC951B5FBB3FB720304EFC578AE2EF81B001BD0E In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = 57913D673AC64F325EBAA5539EC66AB61ADE8C3F0252B9A7CD089FBB1E2E9EC6DEF236CFB755FC6CEDAF1002F6BEE085 In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = EC4CFD169357668A80FAF22036B63D1289DEA65345E247A75413EA328EC13E8BD0020933D2AE1AAD9BF9F856F0FF4BA0 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = FD602E5885409F02EA942A427852D94A83FCCA96133EB3D6F67F769F06D6CF2709D7D19A5C1210A556B5CC514F1741F1 In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 0E2C0624D62B87CFF5B3FA6760800FF3FA5E3A79C09CC1C80AAB652F7E3547E3A7FD8EE6DC85EB70EBF6DF47F5791386 In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = A6D4F149A6255987A672A732E53E78AF0DC1933360893DD367CD95C73ADA414C8473A09AF6BC6C773FC360A604AD3B9C In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = 7AFC3D203CD8238B168E486CD846415D5D7AD7C69AFD7B2766812675DF4719B138CE485B0A07F01C6BF84E405EA0ABC1 In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = 3E02383EFB0F1EC429C5C563ACF40A534DE66D042F5A17F11964445A9288DDB3A357531E6A6991C19D874DE7CF79563B In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = E2E74BFB3C690F88F946BCB0E0E97BE8EBC485E854027E60D31D7B3D03988A8DAACDB65C2B2A3CC79DD9598742E36E87 In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = C086AE3DDF080E95A61C9312176959B20A64D830B17BB509D6ABF7B7C97B5602404991D703DB6D574CBFA94DD1FF122E In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 7BBDD39B5016008599A57D1128284F26BFD3575018B2A817493B8CDC01F51EF432984ADA489C9F48A35DB9A1291EEAC7 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = 77CB1EFFAA608B26982023B9A791F586D2131EF3966AB952E54847B6F9367FA8F799D1D5EC4DA33E3402B8D9C7B5E7FF In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = E66A85F53AFE2FB7EA5F2B2A222E3E463BA83F9545260F0518478570B63C7710333F8EDB0792A411E7F3BA24440D8D41 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = A412954A490D969DF9E152A37064D22E2ABAF362993C068E37706739B6FC29A3FED38AD0110AEF0406D0562B5458CA26 In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = F766B4E8B3327BAB4B887EBBAD473F3EDBA9FEE3375AA042D70DB684013D7A6F51A0DC146374DD972D7FD664F0E4D8A3 In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 59AFBA40DFE9D873A41CDC96E8E028B7D38C8CF5D2E90B93AD7C623E70410E84AD0D9C548E82DE66C97D1456156ABA86 In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = 69F93C7DEA9EE5AF121C27D3B73D9FB57798E6431BCACDE8E6D279315FBAC00708C46BF8D9252608EE27F9C43A8C978B In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = AE8A5BF2BB1C4179172CFB37AEF17E7AB8D304AAF8C3DB77A0DEB65BE04B22627DBC75B1F4CBF0F6CF0478B9E811E90F In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = C1942E8E8072BC4999429683BB236A9D08B2014952F0912334C537F10D52A56393183F803E66B2921F2E538FA5406D7D In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 243664EC5E71B6FBAB9C8C23B62F2780844DB1E0640AA61D53CBB83E30F997E4433765087A27B9566D043269D89F52FC In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 8674C13392B0BDCA789DAAFAD155651B8B5F99CAB282B76B36C3D1F1B6ACF3C2042EB12DE924D36382D110CC4B313B24 In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = 5A2CFEA0B13290C9166A6A645DCD4F2A08E5A1352ECAC280A998FA93A53B1B801C6E4DA746A8DD0E1D3A1D47697DE15D In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = B15CEAF7F5BB6DB3A1F4AD4B7C9DD983276163857206DE4A0DE73AE0EFA34CE8130AE93FD1EB961F7777D280FA0B9AD4 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = 8AFD293CA0145DBB8FE45D36E37D2655F771D1F442A9073A62AE834B4CCE97D712D315620075219A718E7F6454D0FF8E In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = 92313C6E2958893505EFBA0F259243CC7804529D43A27D23B8218D4395D33BC27F4691FEF88298C94E818A8FFD245453 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = EE3468A9CCCE38DBB19A5D21E280D0AA0C43E53C7D4A7D5765ADE99275C46884112552E658E6D37D5BFE10A3B6C60CF8 In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = BB2D96E98D8DBDBCBB584CEA235888DBAED952AFC6E5E7D8D7FF60F1FD4AE2DB661E93923DDA830A4D5F90D116C4BE5B In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = 7EAD0CC318B26BF7E3E379CBF6C083765EF42A7E576552FF2ED62C531350604BC6409B315724A995C57CFF6700502A05 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = 0E5F7BF77D166621132E5D791BCB2BA50B31555B2F41528749D101D375796439EE367189E9CF511B19B54B1AD694460F In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = CB89BA090205A111F3B527A67DB45C3830EB48D8E83CBB84A2D3F7AD0E93E0CB1DAD17F79AB53C33314657790123AA6F In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = 9A01097120368F6B07024C89DD59285E81C510D75EFF02882110831769614E295DD84ABE057C46A44F549F6041525862 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 5542830208F3703FF68A2B504D2BF48518300798BE4A4F1CFD233EACF1F82BB9F9FC59BB91A0D17A948D78B3D4E9B81B In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = 30AD3BAD371BF14AFC4F7C75E8FEB819A9FC2852A8053C7EB8C69455C4736E694540C2ECDE99EC46A81E94EEE6FDE011 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = 5C3B4332ADE447BFBCD3328D81B849C124BD59CED92FD74DE0D77D9E4A5F2A23A6619234D88065596F5889B28EBDC54A In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 22C9B83B2BBCCF28325D124A76385D3EFBAAA69E2D9CC1694730C67E63B3087514DCE2594BB3EF685B9EC4A5E3D922AE In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 34AE91FE75C4D284F5C2E084011C37BAB10531399E8E4FCCD2E8AF85579BD5E46A12DB7BA50BF152B27C91AA50A1D510 In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = BBCAE5D76FF15ADD301BAFBF55D6550885BAB9660FD59B87F44DD0EE137C0DCF0D216193C5BE3644D5EE397FC0286729 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 2A0B9271E8ACDCF040480FF9E1EED1F4C90724B5A145FE275901F8CB1D000B6993D9DA11DFC261F8F256E5076EC92E7C In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = E28211409BFC540E8E9E3CA4CC68C91788F275B9A6399E9F4BD1D1126E0DFFF7F82CF2E325E66D35619EB6B005069999 In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = 10B1098955292ACEBC01688E912C40B0712AE72DC6696F292FD2004FC9D28279DE4D0DA7B8CB3EB4338B815229B163E3 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = A12C2F82AE2ABD6445311822AA9386809753FAAF883F0654F64601296EB2C38C40533C7A48F939797A9D75093432A4F5 In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 4ED291FC99C64B3657D0647C5DA5526781EA625C1A1C5195CFA1EC8EE38691EC605F96C9D7665AE5896292D4517204AD In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = 5AEECE701B5CCB35F43DB72265DC692E09202368D9BAC6F0AC8D135DDA4B5ED166638F002A2EC3E1CDB43919CB5F62D2 In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = 2AB374BBA7A3E03EA741290F0B94D083722BF8C4694A9C0932671A6C691D15A1EF88656D974DD80B0B741A3BCEDD8A6E In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 2DF2F57B9C85BFD93A25A62D8DEA8F319B29F4ED295016834BD62B82179BFFD54C3D753AFC9E7398636B9008B2235AFB In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 51E6AEF326CB5FA7AB58FCB6B951D5AB9E97933B61F3D44C48A16C9E57CD0F8B423F1FF71AF546C29CC94148444E85AD In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = C7C4A1CBCECC12325A90FE8FBBF879CEDF85973F2557FF371754F27A99B36D130A03E0C4B575E937A485C7F4D7AD09D1 In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = AE1EF5A3F3AD627EFD50EB91DF603654C5F2D90E0EDDACF5862E2253B84BC257155606B3C6F6D11D954CCC4A9518FEC0 In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = C720C461F5D48653A3A4889DD4C287BD7E115A9F91DD52610C52F2EA90903B52800AD3D43533FF8AB69227C97645A514 In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 2E47EF41408C039D257BEDBF5087AC57FE59452A35D1A3E0C6F3A333B915D66F844A045B7BDB85B4FC0D6A662C0BE470 In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = E94DA5AD788A730486EC70413ED54316941370DF04DF054395D5D798232397C0E980B25CA39251B22EB415BD9E272BCC In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 9A2B5607EB55AC23AD0BA6CB4D753C591D1DB9D2663B4DBC9EF0EFAE8C6F02E3CA943FFC47B608BF803C09B2B062F6D8 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = 42CB01F43C6FFF1E37C3E5D4C6A4394AC47ED5E678B7A536CDF9AB2C3E4713B1510249AD5F616C47D910AD8B8987FDCA In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = 875B2EF5981F303CAB294FBAA24CCADCF9DE2273483AA829317D83443860A4431D39977DAD19C87FAD3C2432C5498739 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 44B2BFBFB82D22C42ADFDB0830281B5F40BEFB129E2C92B2C74927E66C4AC0852DCE0B25796E2D1E68CC86219E7B0A57 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = 37D9DA46B02E810E460DF8C37AF255A4540ACC1FB58A72F50E5CE4700BD1B1BC4528B5AC7DF55443ADA26019A786FBE7 In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = 57B9549E03F9D7F65139161EA578D9DA731AD4DF962D57713AFE32CF2BDDAC9C0567D070247106130580EE8A9E1B84C0 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 701ED3F52B4EACEE924E02C1FD928C54FB8454C7BEEA5800B7798FAD28F408D185681EDBBF38B0D54658ACEA65F24927 In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 92BF47026DBEBE055242BA865BC2EC0DF784378745E2B5F54456E8A4A9C6F2C3ACF2973E4DA7E31867DE47BC0A59292B In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 9C49D15BFA855335819861393AFC216F98AC0ECB3DB1EC6F1D86A20A70DDC3CD3B3E1182E68AE9BA62CF87691516FA3B In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = FF8918DE7CEEC26488852BE360EC8EE167ABA8A9D8A9E006B19A15F606F2BBD05357ABB40C4CC286658120C0A704DEC1 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = 76CB2FE2D260D939672E3301EDBF82871AFF34D9F59A38557F69CA2F61EDE7BA6638F64972C13D46B74E0BB7AF7C1AD7 In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = 28DCAA83570BC5CAE98144D991CC7999EE46EFAB844BE04E50DCCA9B39F27820BF49D967C28C6E47867581CC40A8013B In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = 2D8F7012F5118011092FF7B08075D2463A1F0A1CDE808845904B9F8D8966D0C833CE78181F0EB4C03D2C8AAD865F6EB7 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 97A7DA85E03A49BB9C9C9AEEB015E5515DBBA53E0E562A4FE96A7A45199E429CB38D0062F63696AA12FF0DE87D30B330 In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = BF85BD95F5550F2B382352D05E73F3C41F12C1161DDE4EE6CBC0F9E8563B6D55F10C113AF3AD2ECB78E156210CA0A318 In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = BD795815C94513891FBCEE251276C2648C9B39D6695CF193607B763DF49E98B159956E982366343C9BF415E3F32D1A55 In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 650657A09AF30EBE4916DEF8BF50753907D66B5894D332D3CF62AE46D83C8353F06FD58CDC098FC4BB801F30F238EB7F In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 3946C579004179275E24A71A33B13ED39B9EF96476F07C71A20A2F55ECE4E3E8FB35E04786D784337DE2CAF88ED5A6A0 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = 24C91910D9895CE0E83D93F15D224D01F6354DBB38C1D8B3D19D1B1D51227845C78210F33768B7A9C68ADDC39B140E9E In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = 1E30D91FDF847DEAB875ADF3A2390923FC9FFB94E3FC56412DED435799E818533951EB5A4831179BA4746BAC3C9C440E In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = 140FF352245667FD29CA38A21DB3D3DD4BBE8CFFD3CA677F12482A559EFAF08E8B0A9825B807206CBF6BD35FF6F88A3D In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = 68B6338A2474B3976F21BA56B0716098D4736FF76EFD5EE9A3504BBAA8389F2C346BFC26010B46F52F292D2836C16473 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = 499E08E111893FD76C97435E4C89C6EB5407E843510DB18ECC9EEBFF175DA62120013880FF082847CAD39F8B52631BC8 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = 07EB2C3638FED3D91BAC7BE01C4F8D2B42E1871B11B3B4E769BFE259B34395CED6BA570EEBB61C443E0904E4B471AA30 In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = 8B2409B8DFBCFD80F4F972C86C4C765F60F3904A62D818D85694CA70C2DE3D0C0772C0058976BCC82332E51E352E055D In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 9C7A50D34C41F15F82E9F39BEC09D5B921AD325F116DEAB57C74528DF0D3862EDE1F0C98657CB1EB1415675ECB2BED2F In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = D533DF7948B95AAB53706447F34C73D818A1CB76E06C74310C3A19EE965D903D8FD0A569C946F7FE256A9465ED9D0ECE In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 6EF98C22A7A692F5A12E3A2C00724439D191CDFE9F65877F4DBE7BCF82A6662807F6FEFDBDFC21C005074169E095C2C7 In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 68B6CA904DE9A5C8CBB163AEDD7AA97F9BBBF7348E062D66EB1A289EC95837966937399D5F34CE0DB5FCF03BC7CB7DCD In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = 9299624AC4498D0CB3AB6CAA70877C0768DE74F29164DB203657ED25C11FE811491DC51C79BB8B7E4BAF7944C1A2DEB6 In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = B9E53AD62D831A701687603DE34A414AF823F4B5E2203A44C0EE09EE12E943AFF5F7368090B7B07F4CB765212A8C83D3 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = EDDEE421E72E69DC28F10CB7587CBE390960623E6EC8B7F6AC4650D5FA48148D3270EE90F7C5B232634811B78AB90216 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = C60AC87DFB3B2ED2129CF3FDDCA95BCEECD088E726B7BDDCFC6DA875DFE1BFAA6B148580F4F28965584B857E7534D39F In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = C4D228990D399E4841E24A69AFD6A8619E22FBA0694960F261F5322BCD1BE89CB7DC8DB635878D689D806D12E07852F6 In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 9DE565FD096433AF93D50065595AE778A2D1FA9A726B2193E67DD999D061F22B33188B5361C673672CFE9AB60A40460E In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 64D4446F97CDCDDE342BEFDDAC0B19BAA1D03FB28CD774685C49CD98AF388B5DF779F81B8249A00668A8E0FBA42876C5 [Skein-512(512)] In = Out = BC5B4C50925519C290CC634277AE3D6257212395CBA733BBAD37A4AF0FA06AF41FCA7903D06564FEA7A2D3730DBDB80C1F85562DFCC070334EA4D1D9E72CBA7A In = CC Out = 26D8382EBDC39072293DDCDDA6568B4ADD2449A05424A12DFBF11595228E9FBF7C542F25EC0F7348B19AD23EF5E97D45E5CFF7BB9969BE332923F33BE53A6D09 In = 41FB Out = 258F3CEEBD9C01271D75ABE73E90085390F54CD318B4D5FA71E8813A541DD96E9DE5A119D053A913296929E263267A3710B3675AB99C42A3F67D96FBE6CA8451 In = 1F877C Out = 72DDA5AB6840DBD44CB2CC8220C2E0FB5C435878E00EBBDACF2A5AD2784860BECB731C821D19E28133320ACA0CC9E41AA9DBF1469F6388C4F74A900EA38A9F5C In = C1ECFDFC Out = AF443E00D6C8BA0A533F9FB284CC69EA9E17787F2B10FA0013BF86D60A4EC0F7E9785FB74DC97A779832FCEBC931F362B5DD5BB4B4A980D7609A7E0BEE0D6020 In = 21F134AC57 Out = C41A9AB3E5B6EDB0C2D05DCE88C16B2A787A514E7C6FA97DA8735462B25D338046153732D038F64852A451DC57426F1D5352028A0A19723C514C532DAE4ACA9A In = C6F50BB74E29 Out = A8BFC5DAED08C05725E3ECB19FFB34AB8C4C09B6F2F518A6CB320B877BE8C3CE349A100E5ED9F5AF0BEBCC3C07AC42E55C91EBE9EA3DAA88F5217E6696B167FF In = 119713CC83EEEF Out = 90E135F85CEAB5AC9314C4DC2AF88585D44A6E395B6BD81365BC2CFA9ECC38240453BCC543E7A787874B728FE57B6E343C1DB36027A0C87E9B47E803C8217FA4 In = 4A4F202484512526 Out = 981BEA36316696B7B171AC9DB6A4686A895A50C0ED1B8CAF1D7975F9A7AD27F9CC27F116892DA744BF9A63A354C3FA8F8C22D5FA9BAE936C616BF304DF185CBC In = 1F66AB4185ED9B6375 Out = 893241922416DE44D3D59003765633D0E67C9D8EF9781F41CC5AA2660FB31FEDEEB64324347AA6D071EBB14668D11837F130C46FB291289525CF50B251D08353 In = EED7422227613B6F53C9 Out = 3F312715E82DFE72C02FA2A28FBF35A4D0B5D7C1945E58823157DFF5E49E621DA8E8BBAB4030E2D0510CF31BB1A425E8FBD388004D4A799F2D7685E422CDDC8A In = EAEED5CDFFD89DECE455F1 Out = 70F487F0E5C35B8A9FA623F321296FE230F71B78814329A2B7713F123B00672F1AC73184DB5E484CDB2AF46B9807383629730B8473F519925C3F7ABA799F8B44 In = 5BE43C90F22902E4FE8ED2D3 Out = DE15A598296A36B058F59DFA688C15F8A92433710345FD18AA3BB90A38AD956501ECFCA1B70B00EA0A567B915D4CF6446402AC1E8BF5FE621D2E7F6114094D9F In = A746273228122F381C3B46E4F1 Out = C62E943AC8257354D221B1350648B38F0F6F3DCE21EBD6F67FE1B578015749E1E4BA26EEE57FF80013514A31A6ACA6DA770884945D1EEF0E2D1473E0D5AE3964 In = 3C5871CD619C69A63B540EB5A625 Out = 724FD538802B6A11BC9C856A55BB4EEC7AD88738C0614D026E24F4883D873AA3D8EC05CE38F68CB983DBF3770797F62CBD0F263B3C58F0B4C14A3E8691E2D6F9 In = FA22874BCC068879E8EF11A69F0722 Out = DCF9470309678CB649F9AB976C5B68A4904C5A4FC1B270C68865F3F906CD5095C63890479B7BBC086354A8EEC19FA14C67328073A75D7274201E88A3E78104A0 In = 52A608AB21CCDD8A4457A57EDE782176 Out = CA2866302B25F886B6A8A82FE84A40DFA5496602E665D3DF0153134E3F6FAA37526A160EC41540E357347252D99AD1EE29762C4663F282C153E63FD7E68D9F18 In = 82E192E4043DDCD12ECF52969D0F807EED Out = 31B22976C33ECF524576854357717FAEA05D3A399A8C6EF29538969132F2D3FF8F91EE7372E89C4429189F8C20FE7030D9A6E9D757192F4263719730832830D9 In = 75683DCB556140C522543BB6E9098B21A21E Out = 456437D984258C4E35DD2557C5A76D4D160F20BAC68C527B1E0DB30F9556586E46425639C7F95BDFAD6C212BF1575165A3658855DCBAE7084297F6B30FC0847E In = 06E4EFE45035E61FAAF4287B4D8D1F12CA97E5 Out = 76330B4267B5D26D2858B4740C317675EAC8603F525B1ADFDDCB4AE9E87B81CF9226BDA0AD7A3043B3A6DE7E65D92972AA1A2DC894F3B4DF6D0080DAF42E48C1 In = E26193989D06568FE688E75540AEA06747D9F851 Out = D48BCFB92AC2671E854C8D23218640BED8C096E05FEDB9505DB438806E6A487ED257B205E0DFEAFE0A7712D6B78E19B4A81B5FCF26CC2CF34A1010C26F416223 In = D8DC8FDEFBDCE9D44E4CBAFE78447BAE3B5436102A Out = 50D4671D3737F716647EE911C947443FFB6AB86980BF480FED5EADA0AC43DB11BA812EA7C5135BED9EBD5E3ED64C2370ECFB4C01630C48A0157807E56B76C363 In = 57085FD7E14216AB102D8317B0CB338A786D5FC32D8F Out = 94D1E4F3569BF071C876584F64C7A9FF5ACDC7B6C00557A07221F29F16D5EA4A5DAF3C427DE279EEB5C1F5B6C4C164709075D701879307421EF85A86DADD4A43 In = A05404DF5DBB57697E2C16FA29DEFAC8AB3560D6126FA0 Out = 5D8B12E9344FC266A237E91D919CD3A7079C7AA6B15198B44C73B5B77CC0191F60234E0DD0D89086ED7E7DF86D0BCF3130321FCB340194942A990C2A3045C820 In = AECBB02759F7433D6FCB06963C74061CD83B5B3FFA6F13C6 Out = B1A228247E67BB27F5CB44E18D2AA0D8CD2F1AD5F21AD7D9B2F86CC736433CFD46B954C009CFC1B42B87570E0C14F57708EDE98EA09312D66E4714D46AB0EE44 In = AAFDC9243D3D4A096558A360CC27C8D862F0BE73DB5E88AA55 Out = D36B86F247D80E3F475CDC115CF4659BBDCF560E8197641F1590B3554759E3630D54AA33C8393E2BA1336C8450736DB04DAF38EF6C532A9A1189043A0CF8C83E In = 7BC84867F6F9E9FDC3E1046CAE3A52C77ED485860EE260E30B15 Out = 8813B67754B4DEA9B90036F8BB4FA9BEED36681250A2C1A91564C76EF6C1C91738FF206C787DA82BFA79F280C2F1D9E086CA8ADA8198E379EC5637835A0B9FC6 In = FAC523575A99EC48279A7A459E98FF901918A475034327EFB55843 Out = D8F858496D6E56ED38418383C762FC1572EDE99AA48DAE2E557FB624CEEE7515E57FF3FE72EC98ECACE3B140F502D9C7A2B5891BB80EB5349B5A594470D3031C In = 0F8B2D8FCFD9D68CFFC17CCFB117709B53D26462A3F346FB7C79B85E Out = 1407A2AD0CC06EFA064AAE9E7D4186F7B3D991531691D0DC13B2C81A8687B03467EE1F27D000FFE0D8E9FE0DCE85AD5779E0F827C97A5777D2EC0694EC6DDE44 In = A963C3E895FF5A0BE4824400518D81412F875FA50521E26E85EAC90C04 Out = 5366674ADB264EAAC4824109BC2F923817A2DF058FA3BCE6D91920CCB7E5A0442BF3126688EDF444C1D6CC13AC950EE88A389726A53316E1DF6BCE7FF077AFEB In = 03A18688B10CC0EDF83ADF0A84808A9718383C4070C6C4F295098699AC2C Out = E99A1AEFCC3582D6ACB3EC75FDA02D074DB5D015F84C945C994A92DD2E818711309EFFB6F271A9774233BB9A630DF317DCFABE1EB9FE4FF6F14E8BDBB68D416B In = 84FB51B517DF6C5ACCB5D022F8F28DA09B10232D42320FFC32DBECC3835B29 Out = 8744C1A732AAC29AF53F55B887DCB340FADEF26CF853C2CEF6AC20E6F278E3DEB5AF9C78E6C0B59E2D791CABEB1DFB321104135E0F9F749E6786BE4F4B19AD9F In = 9F2FCC7C90DE090D6B87CD7E9718C1EA6CB21118FC2D5DE9F97E5DB6AC1E9C10 Out = 386223818A80AD962E3D79EDAEB76A7FAA6FFA2F464ABF247335DD75C763D6C1213C0A695CB4DFA3B3E9D284CB4B9A2FC2A1113B3B6A072200614BC10886D44A In = DE8F1B3FAA4B7040ED4563C3B8E598253178E87E4D0DF75E4FF2F2DEDD5A0BE046 Out = 7F18283782AED5776F2E28EDF83D067DB193260340FCFB08BA2EEF5C8147823F07C00EBAFBB8447967392B17E2B4D6249FB6E454D45BFCB615A80CB503F269C6 In = 62F154EC394D0BC757D045C798C8B87A00E0655D0481A7D2D9FB58D93AEDC676B5A0 Out = 50050698334A42BA1DD6AA5AD0EAF8CCCADA992F4A4B14E5229A3AD6A561DC15E06D26A899F3CF6977C1DFBB5815F23461ABC29A2A09FE5190DE5E2F63CACD3A In = B2DCFE9FF19E2B23CE7DA2A4207D3E5EC7C6112A8A22AEC9675A886378E14E5BFBAD4E Out = 211121CE41BDED281FC05F7426DAED575198C307AE107318A282A173B25CF64131874216A71D5C4E5B66C9B78D8D266DAC1AA7773633D4CF5C41C521AF1A3191 In = 47F5697AC8C31409C0868827347A613A3562041C633CF1F1F86865A576E02835ED2C2492 Out = 55BCDC136A42E740C172545DFD8225C008D31BA2B9B5DE16C36A14D6932ADBA3565549A3B3043C8C8EF7F4DB0BB655A9F7087EE7E0AB4201598AA4EA46F4D256 In = 512A6D292E67ECB2FE486BFE92660953A75484FF4C4F2ECA2B0AF0EDCDD4339C6B2EE4E542 Out = EE8B6A342667CB994D579CF80D5BE9D4F816FFFF03BA97B75C9B601FCA358DEA4DA189D8BE7809C248D75600A19973684E2B2065752A31AF386F94E03CD28BD6 In = 973CF2B4DCF0BFA872B41194CB05BB4E16760A1840D8343301802576197EC19E2A1493D8F4FB Out = 8C84F238ABEFD36FADBBE91253434DDE7A6CF0A77EEABD2D5DFAECCA4442441B498BE287BA65C0F76EAD4EAA1DF115A3A6A0D4DD0453246E486798587B31B140 In = 80BEEBCD2E3F8A9451D4499961C9731AE667CDC24EA020CE3B9AA4BBC0A7F79E30A934467DA4B0 Out = E0D4F5C59F616B29C683B9E6618887AE567DCA178D81E8BE0DD0A52C54D625AF6D6CC9F86E1B0B7DF25B82F3D7CAC58C9875B474CDF9E9B4CB0D4573ECAD90CE In = 7ABAA12EC2A7347674E444140AE0FB659D08E1C66DECD8D6EAE925FA451D65F3C0308E29446B8ED3 Out = 69DCBDA2A00FD0B92EE7E5B4F36981BEB97E132C8F2E0D7B2B9CD455725E79800AB9864698B1C0845CCEEEA5E285B45CCE4B4264C0D1FEBE874534170F691094 In = C88DEE9927679B8AF422ABCBACF283B904FF31E1CAC58C7819809F65D5807D46723B20F67BA610C2B7 Out = B99D4BDC59B2F4EB7EC578A6866A88DD1E848BB7D19D9447BAB656C143E7FDA912959A767E721882A66491299B96DB396F392A688B38DCB020805B8F87168790 In = 01E43FE350FCEC450EC9B102053E6B5D56E09896E0DDD9074FE138E6038210270C834CE6EADC2BB86BF6 Out = F5528D909E8F70C9329989EC9F7A1B5DFF6695467447418D70C63E16E7EEF184064963C4E05B2A2A28D7C30A93E3F54FE63A4288B727D2F13495CBD9734CCD5E In = 337023370A48B62EE43546F17C4EF2BF8D7ECD1D49F90BAB604B839C2E6E5BD21540D29BA27AB8E309A4B7 Out = 90D7925A328822063A33DF2D74DB9692BD668FE06F2A4156404CE252F29B50CC81AF12B49EEF25525FEC69EB010C3A127668AAB32494B6624104E748B2565519 In = 6892540F964C8C74BD2DB02C0AD884510CB38AFD4438AF31FC912756F3EFEC6B32B58EBC38FC2A6B913596A8 Out = EBBF87270FA3DDCF816905B74AC0694E354DEE3952E6E27EFCAB42D74B15F3FE49A2434416932A3942AAFB90C5622D608C86275741D35040E375B000DE899403 In = F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0 Out = 73282C3DF72197FC83ADE5E4D263173D4B8FEF58749BCA410C48485DC19B8E6D34D42BBABB5CC8964E3D8E8F9DB60356C9884495CE889BC90972091A065EE4E3 In = CA061A2EB6CEED8881CE2057172D869D73A1951E63D57261384B80CEB5451E77B06CF0F5A0EA15CA907EE1C27EBA Out = 63DCE6FD63AE437494C6F68B3D9249322AB3BB6AB2B9EBD156F22434DD91C463D0D11C5484835BFE34252A0B3674914FD89C25E3EECC374CC20B7C0A397C649E In = 1743A77251D69242750C4F1140532CD3C33F9B5CCDF7514E8584D4A5F9FBD730BCF84D0D4726364B9BF95AB251D9BB Out = B175A67928A446645732F22D10EE101EEA9AADD83BD2BEA38C9E25E1D1F4FF18865578E3115303EEE7857B9D9DECC59AB66F42F2AA70EA8192FE9ABCED5EEB68 In = D8FABA1F5194C4DB5F176FABFFF856924EF627A37CD08CF55608BBA8F1E324D7C7F157298EABC4DCE7D89CE5162499F9 Out = DE5D2A161B5FE2E087476CBF15F8DF9C35E4BE11E9A9EC01EDC3818B88C4998EB0B4D405E7F4C924DDB3B077410CA73D2E7CD3ED6D87AD126190E445CB97D323 In = BE9684BE70340860373C9C482BA517E899FC81BAAA12E5C6D7727975D1D41BA8BEF788CDB5CF4606C9C1C7F61AED59F97D Out = EB994A487424E5EDB1EC536E9CB93AEDA329C983F484C7E4F1BEDD7CD1142B85191A9829E9AC098313FEB9BFB9DC69F12B2FB348AD3903A170EE4567D13CE815 In = 7E15D2B9EA74CA60F66C8DFAB377D9198B7B16DEB6A1BA0EA3C7EE2042F89D3786E779CF053C77785AA9E692F821F14A7F51 Out = 48A20D309E2F8F57C6EA2E0BA7CFAB190C1DA0E0E0AE1FCE67D1D9AAC18E81A1B7642A3714A355A0FAB20266D67E3170BD0F8D09F8382760AC4758279AC49CB6 In = 9A219BE43713BD578015E9FDA66C0F2D83CAC563B776AB9F38F3E4F7EF229CB443304FBA401EFB2BDBD7ECE939102298651C86 Out = 0ED3A9ECAE74DA1FEF8D0A589487B0EC4427C7D6CE39860D13B26747195CD272DC093C40FC4B655406FFFBDEAE9311371FA2628EC9983B0B57AF62B285BB6C6D In = C8F2B693BD0D75EF99CAEBDC22ADF4088A95A3542F637203E283BBC3268780E787D68D28CC3897452F6A22AA8573CCEBF245972A Out = FCC42400748C3911AB68C19FFBB6C7849ACFE78B524285143F4C136154BC516476B57144462CF89EAF1ED18BA1C1E4C56F75EB688D686046B8EFE7E26373812E In = EC0F99711016C6A2A07AD80D16427506CE6F441059FD269442BAAA28C6CA037B22EEAC49D5D894C0BF66219F2C08E9D0E8AB21DE52 Out = 55F603ADC026859C471A94E0C1B604A9FF080D0609EE3C0BF9484BB8FBBD7C8F54F4B8EC470B77025C63BA5A02528B715562627268AC42F04B8143D26EEB05F5 In = 0DC45181337CA32A8222FE7A3BF42FC9F89744259CFF653504D6051FE84B1A7FFD20CB47D4696CE212A686BB9BE9A8AB1C697B6D6A33 Out = 1129594301D1DF777FE7998448DAD08AD3A8E4FDA94C35AEADE6615AA1982A5CA07669C873A58E623C0C386DC72630A350B0FA5520E7CDA8D36BD506D5B24DBF In = DE286BA4206E8B005714F80FB1CDFAEBDE91D29F84603E4A3EBC04686F99A46C9E880B96C574825582E8812A26E5A857FFC6579F63742F Out = 9F56190D40C0964F698C06D824A4C402AD47C95418C6FDF43ACEB9AD7D092F7F62FF9D3F0625E15CDE1CE3E6118861449390B5AFE73B1865EC4F1F3FDBA89BF8 In = EEBCC18057252CBF3F9C070F1A73213356D5D4BC19AC2A411EC8CDEEE7A571E2E20EAF61FD0C33A0FFEB297DDB77A97F0A415347DB66BCAF Out = C74B2D83470EDF076ACCBED486888CCBB98E6693F9BCB54210CDD181A834CFE9E848270D985F883232D682F05FD225BD283E90EABD8A493EC713408EBAF34AE3 In = 416B5CDC9FE951BD361BD7ABFC120A5054758EBA88FDD68FD84E39D3B09AC25497D36B43CBE7B85A6A3CEBDA8DB4E5549C3EE51BB6FCB6AC1E Out = F1BFA1067FEB68DF42C69CF4944E2F57BF17291086ADBAD592CC0C80C4DC0A97D2A9B001BA57AEA4D81E892F54BBA9387FFBDF3A86250E81E5D12406E2ED57DE In = 5C5FAF66F32E0F8311C32E8DA8284A4ED60891A5A7E50FB2956B3CBAA79FC66CA376460E100415401FC2B8518C64502F187EA14BFC9503759705 Out = C4915196AEC17B0CD50C64D214CD4D20CB7ADD653DB9C623B76363C8D14B8FEFE0B883B3F36C39C3F9E18958B0558F0D86FC6D4A52BAC59B74CB58A68D4C8D8B In = 7167E1E02BE1A7CA69D788666F823AE4EEF39271F3C26A5CF7CEE05BCA83161066DC2E217B330DF821103799DF6D74810EED363ADC4AB99F36046A Out = EDDA51E38622C3DA0F007566F51F311AE06492C9D87F3190B0D74DC44348B1D2A8A6179AFB293C0205C3EDA1B5669CD951F477F885573A1C8C8D322BDD7ED5D2 In = 2FDA311DBBA27321C5329510FAE6948F03210B76D43E7448D1689A063877B6D14C4F6D0EAA96C150051371F7DD8A4119F7DA5C483CC3E6723C01FB7D Out = 66EC650CF34F084FE71FDF06FB3BF4BD17E1EBD545E878984125C31F862B939A3AF25B37D17732C3DEA4C2A8845EF1C49935F0473AF0551AB54950A8B92980A7 In = 95D1474A5AAB5D2422ACA6E481187833A6212BD2D0F91451A67DD786DFC91DFED51B35F47E1DEB8A8AB4B9CB67B70179CC26F553AE7B569969CE151B8D Out = 51FE1EFC5C659E5B7F94BBBF06078E119F4BBE8A40526F9A692AE970A58A0D24C8E67B94411109CE0445F425E24C94A52DF48338E3943952142A4DBA625F4BA0 In = C71BD7941F41DF044A2927A8FF55B4B467C33D089F0988AA253D294ADDBDB32530C0D4208B10D9959823F0C0F0734684006DF79F7099870F6BF53211A88D Out = A22E76813AD33D1CD84F1BC536FCE8CFEDA449E02A67D4B58F96C9689389EA40688A785991B90420F4A60244FBBA85CF9677D519FE7ACE300199B0CACE944D46 In = F57C64006D9EA761892E145C99DF1B24640883DA79D9ED5262859DCDA8C3C32E05B03D984F1AB4A230242AB6B78D368DC5AAA1E6D3498D53371E84B0C1D4BA Out = AB7A725BD93AB805D89D81EB6766E46E1A0045E654B82B389E6B481EAA7D26FE39A471CCF99B6E87EB8E2A9C0D7CADAD4B2CB401FFE5BD85DE8D0235E8B5BDFD In = E926AE8B0AF6E53176DBFFCC2A6B88C6BD765F939D3D178A9BDE9EF3AA131C61E31C1E42CDFAF4B4DCDE579A37E150EFBEF5555B4C1CB40439D835A724E2FAE7 Out = 2DF35398690D99075BC67BDE85D7CDF512DF9F05FFF16CFD1AEF3F7E641961E60DAF81FD8F9A625FE9149866FDC69F73C58AAE9F758AB5EA3011C67649E3F0B0 In = 16E8B3D8F988E9BB04DE9C96F2627811C973CE4A5296B4772CA3EEFEB80A652BDF21F50DF79F32DB23F9F73D393B2D57D9A0297F7A2F2E79CFDA39FA393DF1AC00 Out = 342B05F8A6BA4899E48153C11A90D3635ACA67A5852E706ECF2EB425D41372A7E62BA8EFEA5A6D5C1A338B060C3299A134D1D9139E3D96F4566A6CF15582DE22 In = FC424EEB27C18A11C01F39C555D8B78A805B88DBA1DC2A42ED5E2C0EC737FF68B2456D80EB85E11714FA3F8EABFB906D3C17964CB4F5E76B29C1765DB03D91BE37FC Out = 81119F5333D909808F37F4D9C00DD2C9B7F9B32608C6A517881155387A51141BFB945285F29FFCD79799B6E76265FD1940CCDEC9A591CBBBE19204374A533343 In = ABE3472B54E72734BDBA7D9158736464251C4F21B33FBBC92D7FAC9A35C4E3322FF01D2380CBAA4EF8FB07D21A2128B7B9F5B6D9F34E13F39C7FFC2E72E47888599BA5 Out = F8225F85838F81B6114F30B69DDD4668D7BD8BA357D283B4DF178380D8AAA0B8F10B6E85AFB7356C206B43E4EF2E1B1EE0073A4BE042AF3F94C489902AE9C5AA In = 36F9F0A65F2CA498D739B944D6EFF3DA5EBBA57E7D9C41598A2B0E4380F3CF4B479EC2348D015FFE6256273511154AFCF3B4B4BF09D6C4744FDD0F62D75079D440706B05 Out = 436067709B778CD3B60934649C8942D1930D74C36F8308686FB18B39E01DECFCC34EDB363D7EF2FD51353D571BE1019F119EE79A5DA61898927E6DB5BE909D69 In = ABC87763CAE1CA98BD8C5B82CABA54AC83286F87E9610128AE4DE68AC95DF5E329C360717BD349F26B872528492CA7C94C2C1E1EF56B74DBB65C2AC351981FDB31D06C77A4 Out = DC4DCE2DBEC1A6E2BFC964C6F7D2A58F0A0718B0146BB3E0611D6D8B7269C357C508BF5F1A3723EC373A7B225D9B9941134B2F6D649EBF0E8E1B69E344072B62 In = 94F7CA8E1A54234C6D53CC734BB3D3150C8BA8C5F880EAB8D25FED13793A9701EBE320509286FD8E422E931D99C98DA4DF7E70AE447BAB8CFFD92382D8A77760A259FC4FBD72 Out = C382A4AC5F26F5C77BD8908AF7AC65C596BCCD16F08D74B5C9CFF3582A1B8B05C7AB4DC81C564A856E1F364FD2089DDEB5652C695A5D567177463DADF8F5872B In = 13BD2811F6ED2B6F04FF3895ACEED7BEF8DCD45EB121791BC194A0F806206BFFC3B9281C2B308B1A729CE008119DD3066E9378ACDCC50A98A82E20738800B6CDDBE5FE9694AD6D Out = 54BDAFE6E565E86C38D28F6C9A39B4152033F87206C50B6A78F9CE41501F5A7B1DE3BAF6B1A41251F95A859F0106CE5B9226CA73BDFE39E947AED902B5038715 In = 1EED9CBA179A009EC2EC5508773DD305477CA117E6D569E66B5F64C6BC64801CE25A8424CE4A26D575B8A6FB10EAD3FD1992EDDDEEC2EBE7150DC98F63ADC3237EF57B91397AA8A7 Out = C326014CBAAD2173D04C15C8F33C864EFD5A9683A360DB013387C85B0127705302DB83AFFA28790AEDB2EE9AB88DA895E2F4B0F50180444F13564903D853F989 In = BA5B67B5EC3A3FFAE2C19DD8176A2EF75C0CD903725D45C9CB7009A900C0B0CA7A2967A95AE68269A6DBF8466C7B6844A1D608AC661F7EFF00538E323DB5F2C644B78B2D48DE1A08AA Out = 6560BBB2164B7A1D0B322618AABA50C12B331F82C2A2CFB5A3237ED9D51A19F7A0D4E6CCFE13C6C068B18AB38A3A635E2548F705CBA60176FD6F2D22F32C4791 In = 0EFA26AC5673167DCACAB860932ED612F65FF49B80FA9AE65465E5542CB62075DF1C5AE54FBA4DB807BE25B070033EFA223BDD5B1D3C94C6E1909C02B620D4B1B3A6C9FED24D70749604 Out = F9EE46172FB8F055AFD51FD591C3EB21083D21D6C5B6EE4061CA8A54BEDD5A75E4E086F962FD9D9AE62FCF9390AC55858AF2E94216A3426FEBB5ED17D148EA88 In = BBFD933D1FD7BF594AC7F435277DC17D8D5A5B8E4D13D96D2F64E771ABBD51A5A8AEA741BECCBDDB177BCEA05243EBD003CFDEAE877CCA4DA94605B67691919D8B033F77D384CA01593C1B Out = B1C25A6252AC357CECDCF955EF97DEFC6161E1B813EAEB502AE4CEDD0329EFF954A037FDB7C32D7F4B1BB93057A5503D617768E0A7FA6DE9C3876F43F2B36FC8 In = 90078999FD3C35B8AFBF4066CBDE335891365F0FC75C1286CDD88FA51FAB94F9B8DEF7C9AC582A5DBCD95817AFB7D1B48F63704E19C2BAA4DF347F48D4A6D603013C23F1E9611D595EBAC37C Out = 2CA0D306ED30D5B37F7AF61E7F2AE1E9485EBE90167D7C270572D57703823B7E63EA55D90D4197A6FBB7A7A1FC383FCEFE9F7B291722F50F566D4D4EDEC36748 In = 64105ECA863515C20E7CFBAA0A0B8809046164F374D691CDBD6508AAABC1819F9AC84B52BAFC1B0FE7CDDBC554B608C01C8904C669D8DB316A0953A4C68ECE324EC5A49FFDB59A1BD6A292AA0E Out = D87CDC2DEB84E484322C08D2CD8C841B0E2E8A06510188C42724EBC7F92AC2F972849C963839FC20625FDDC74DDFE730BEB7F1AC22CFEB9C08083FFEC5F7C171 In = D4654BE288B9F3B711C2D02015978A8CC57471D5680A092AA534F7372C71CEAAB725A383C4FCF4D8DEAA57FCA3CE056F312961ECCF9B86F14981BA5BED6AB5B4498E1F6C82C6CAE6FC14845B3C8A Out = 6D7181F90BD05CE2CE59A4AB86253BD919F8155381E70B2885BED000C31713283390F147805E8556BF9C9CB6399236166C82CB8572B1A3146ADC4EE679AA3F17 In = 12D9394888305AC96E65F2BF0E1B18C29C90FE9D714DD59F651F52B88B3008C588435548066EA2FC4C101118C91F32556224A540DE6EFDDBCA296EF1FB00341F5B01FECFC146BDB251B3BDAD556CD2 Out = FF5B17EE99E24C74058F479257CCE7A381DAF407CD967903C801647EA60EBF1FE910922788471BF1E0B609280AE7A7943966FF2836FDA6989057E04F07A46498 In = 871A0D7A5F36C3DA1DFCE57ACD8AB8487C274FAD336BC137EBD6FF4658B547C1DCFAB65F037AA58F35EF16AFF4ABE77BA61F65826F7BE681B5B6D5A1EA8085E2AE9CD5CF0991878A311B549A6D6AF230 Out = 06EF93E8D37636F73D67F4230160914ED05CD0CDBADE77BD69B32E02C6A419FC220F6E71E1B269A76A1F7F4C4E3CB49C0E4C3CA3466C58C25E2930C71DD1BF0C In = E90B4FFEF4D457BC7711FF4AA72231CA25AF6B2E206F8BF859D8758B89A7CD36105DB2538D06DA83BAD5F663BA11A5F6F61F236FD5F8D53C5E89F183A3CEC615B50C7C681E773D109FF7491B5CC22296C5 Out = F52A2BC9DC33EEACC30211F4B92E882AB8DD761394B1D09E22A91684319EEAB4FEAA71C24CFA11DA3ADD047672F19D47B48C90D50C9DBF5E2C0A50B995CF57AE In = E728DE62D75856500C4C77A428612CD804F30C3F10D36FB219C5CA0AA30726AB190E5F3F279E0733D77E7267C17BE27D21650A9A4D1E32F649627638DBADA9702C7CA303269ED14014B2F3CF8B894EAC8554 Out = ED3D326E1E618D140BC3AC49DB60C96B4D04252DE2D44DE3B414D8F96C05A6E37C82B1DC515DF1CF784AADE0201259CAB249924776C7C4E0612240F30DDEFBDE In = 6348F229E7B1DF3B770C77544E5166E081850FA1C6C88169DB74C76E42EB983FACB276AD6A0D1FA7B50D3E3B6FCD799EC97470920A7ABED47D288FF883E24CA21C7F8016B93BB9B9E078BDB9703D2B781B616E Out = A811AFFA9ECD8D88B51AB201F0FC33A137ED91F0953E819F9BACFA19BBACE50644DFEA77823BB9BAE5D6FD79B81B0AC7F202A386CFF6EFF9E7731553645975B9 In = 4B127FDE5DE733A1680C2790363627E63AC8A3F1B4707D982CAEA258655D9BF18F89AFE54127482BA01E08845594B671306A025C9A5C5B6F93B0A39522DC877437BE5C2436CBF300CE7AB6747934FCFC30AEAAF6 Out = FC3AE8D1C50A634D96334E5A2371CEC832557B0C870CA70E08DFDE59226880086E2A38A483FD1CE68C2085F804FC0C29417203CB5223F69A6DF20292DF13721E In = 08461F006CFF4CC64B752C957287E5A0FAABC05C9BFF89D23FD902D324C79903B48FCB8F8F4B01F3E4DDB483593D25F000386698F5ADE7FAADE9615FDC50D32785EA51D49894E45BAA3DC707E224688C6408B68B11 Out = 507D99CF8498582388396E9DA2103F885EEE826349EBD8639B37B133877108ABB1C34AF892D1676F507EE40171DE00502A71AAE08E5222858BA4F330D2AA0393 In = 68C8F8849B120E6E0C9969A5866AF591A829B92F33CD9A4A3196957A148C49138E1E2F5C7619A6D5EDEBE995ACD81EC8BB9C7B9CFCA678D081EA9E25A75D39DB04E18D475920CE828B94E72241F24DB72546B352A0E4 Out = 29B639522730DB5E24FEEE90619BB57274871EF65FFC8C98B57CF6EEA0394A2B7EAF3C177108E5DBDA22165C9C80BB0BA408F1E66603D0F9D48F22B3907E2122 In = B8D56472954E31FB54E28FCA743F84D8DC34891CB564C64B08F7B71636DEBD64CA1EDBDBA7FC5C3E40049CE982BBA8C7E0703034E331384695E9DE76B5104F2FBC4535ECBEEBC33BC27F29F18F6F27E8023B0FBB6F563C Out = AAC3A8FED5D9D887EDFDDC24477A9043CE1A66BC58324AB1539C5D8E8225933277AC3F8F99E69233F12D8CBA7642A50C9D12D314027385D8D2B743C884B27D50 In = 0D58AC665FA84342E60CEFEE31B1A4EACDB092F122DFC68309077AED1F3E528F578859EE9E4CEFB4A728E946324927B675CD4F4AC84F64DB3DACFE850C1DD18744C74CECCD9FE4DC214085108F404EAB6D8F452B5442A47D Out = 04B926518D363B85967CAB6A9CF36435EB6E06D987A023F50D8A6849219ED452760A2997E7C7E4B9A4D2818B617CF81E7F406AEC7D0799939B6369390CF47D8C In = 1755E2D2E5D1C1B0156456B539753FF416651D44698E87002DCF61DCFA2B4E72F264D9AD591DF1FDEE7B41B2EB00283C5AEBB3411323B672EAA145C5125185104F20F335804B02325B6DEA65603F349F4D5D8B782DD3469CCD Out = C70C68FD238DBFB07C9CE17DEF173A1D5BD41B49DFF3D401FA096B421E449926C7AA366892301F2C17FB6EFF3C1C7AE8637AF2F4A739A748AECBE1463FF5F0D7 In = B180DE1A611111EE7584BA2C4B020598CD574AC77E404E853D15A101C6F5A2E5C801D7D85DC95286A1804C870BB9F00FD4DCB03AA8328275158819DCAD7253F3E3D237AEAA7979268A5DB1C6CE08A9EC7C2579783C8AFC1F91A7 Out = 21CF4A6B86445F9BD8AD570ABE6BBAB75F6ECFC3FA6C935BE968A7F6E8A00F15C4683300FD07DBD245250CDE363D9478CB8F73FA0443956F666BBAFAD7F05190 In = CF3583CBDFD4CBC17063B1E7D90B02F0E6E2EE05F99D77E24E560392535E47E05077157F96813544A17046914F9EFB64762A23CF7A49FE52A0A4C01C630CFE8727B81FB99A89FF7CC11DCA5173057E0417B8FE7A9EFBA6D95C555F Out = 2915D4D41FC7AD3EBBB2720E8D2789984F800E5EBAE0C9376D0197B95B81E064120D9A040D2A7A6320B4CF06C6676E5923472B8FA5B9034A01AEFA48F41DB008 In = 072FC02340EF99115BAD72F92C01E4C093B9599F6CFC45CB380EE686CB5EB019E806AB9BD55E634AB10AA62A9510CC0672CD3EDDB589C7DF2B67FCD3329F61B1A4441ECA87A33C8F55DA4FBBAD5CF2B2527B8E983BB31A2FADEC7523 Out = 1DF71071B1815DCBD17C3B486FA0328D95D648DD58C9EDE85CD6AA0574E74D35151CA6A984C8D46B0CC1B9310E22092627D8A831AB9551798963A6301420F9D0 In = 76EECF956A52649F877528146DE33DF249CD800E21830F65E90F0F25CA9D6540FDE40603230ECA6760F1139C7F268DEBA2060631EEA92B1FFF05F93FD5572FBE29579ECD48BC3A8D6C2EB4A6B26E38D6C5FBF2C08044AEEA470A8F2F26 Out = B29A8B98E99E794B841D7525F4DBC88B52982642884B367F316AD2C611D1E3CFA5D0547BA9FA654A4A345AE7F2C39736959C217AA1A07DD8D6D0224F4BC6B385 In = 7ADC0B6693E61C269F278E6944A5A2D8300981E40022F839AC644387BFAC9086650085C2CDC585FEA47B9D2E52D65A2B29A7DC370401EF5D60DD0D21F9E2B90FAE919319B14B8C5565B0423CEFB827D5F1203302A9D01523498A4DB10374 Out = 6233238EDDD88518DD42DB92974C53386350172A3EE9D84AC898BCFA6D8C148DD3EDEEABADB9A37D1FC95AB991F737131748CB969FB6F60C57826FB48CE90DF0 In = E1FFFA9826CCE8B86BCCEFB8794E48C46CDF372013F782ECED1E378269B7BE2B7BF51374092261AE120E822BE685F2E7A83664BCFBE38FE8633F24E633FFE1988E1BC5ACF59A587079A57A910BDA60060E85B5F5B6F776F0529639D9CCE4BD Out = 7B13BD46E765B6BFCB652B4E8CF60ABC47CE6ADC26264017F906EAFD45FF7B5AECE954205F6F74EB696DEDD0C8B24AB7B5D86F4E21F2AB5E82C42CCB3139BF6C In = 69F9ABBA65592EE01DB4DCE52DBAB90B08FC04193602792EE4DAA263033D59081587B09BBE49D0B49C9825D22840B2FF5D9C5155F975F8F2C2E7A90C75D2E4A8040FE39F63BBAFB403D9E28CC3B86E04E394A9C9E8065BD3C85FA9F0C7891600 Out = 11CE4D9928E218504F4823B98BD9C90EA4AADE88B34CDA898C3470E0F8277DB516A16E5A890860FD353DE84C81CBB2D78443A4338582B98D26B33D516ABEA998 In = 38A10A352CA5AEDFA8E19C64787D8E9C3A75DBF3B8674BFAB29B5DBFC15A63D10FAE66CD1A6E6D2452D557967EAAD89A4C98449787B0B3164CA5B717A93F24EB0B506CEB70CBBCB8D72B2A72993F909AAD92F044E0B5A2C9AC9CB16A0CA2F81F49 Out = AF2A7EAB5EF18F204497D6B764937EE14EEE7A28C37DD9CB816E8F937530AEFCB8A225E3255518A4199270D4F5477E577B68FD0E7FE4B886E173A5B84106780B In = 6D8C6E449BC13634F115749C248C17CD148B72157A2C37BF8969EA83B4D6BA8C0EE2711C28EE11495F43049596520CE436004B026B6C1F7292B9C436B055CBB72D530D860D1276A1502A5140E3C3F54A93663E4D20EDEC32D284E25564F624955B52 Out = 58B2878C79A8CD7AFD1FF815204DC38B4B483E5E543C16C5E45B55EEEB037552FD50B08D43ABBA3AF6E25C49617AD8170C8FC0A5B9593C6A0CEE8C767ED032EB In = 6EFCBCAF451C129DBE00B9CEF0C3749D3EE9D41C7BD500ADE40CDC65DEDBBBADB885A5B14B32A0C0D087825201E303288A733842FA7E599C0C514E078F05C821C7A4498B01C40032E9F1872A1C925FA17CE253E8935E4C3C71282242CB716B2089CCC1 Out = C2FA1BE8AED5582F8E39E922C3917A4E030C8FBE07CDCD1B8888E9590DD31649DE2B03DA03FD4F15825CCFF82DBD6D600C69B4872A843E2B121981BC65E0A20B In = 433C5303131624C0021D868A30825475E8D0BD3052A022180398F4CA4423B98214B6BEAAC21C8807A2C33F8C93BD42B092CC1B06CEDF3224D5ED1EC29784444F22E08A55AA58542B524B02CD3D5D5F6907AFE71C5D7462224A3F9D9E53E7E0846DCBB4CE Out = 3B06E7D687E0F3C2F6A7645281F467D50853AFB2A87BC73408BA7951598BF4869598681C05B941049C1B106256B412CA6107200858570032E68104318BC5341B In = A873E0C67CA639026B6683008F7AA6324D4979550E9BCE064CA1E1FB97A30B147A24F3F666C0A72D71348EDE701CF2D17E2253C34D1EC3B647DBCEF2F879F4EB881C4830B791378C901EB725EA5C172316C6D606E0AF7DF4DF7F76E490CD30B2BADF45685F Out = 765637B71F0546AEB0394BB91FDB8FEF6DD85ADFDE6E06A321DA24033EE8E3B0403646F863F97C6BB9CA5B8702C6BCC691DB182D38DB19BA2B8595776F5D775E In = 006917B64F9DCDF1D2D87C8A6173B64F6587168E80FAA80F82D84F60301E561E312D9FBCE62F39A6FB476E01E925F26BCC91DE621449BE6504C504830AAE394096C8FC7694651051365D4EE9070101EC9B68086F2EA8F8AB7B811EA8AD934D5C9B62C60A4771 Out = 278351D6F90B051AC4804C8D85A30C56A242FDF1DF556773F7A1A67B6BDE8D6E49625D70EC13C9FD974D36C782E24BDD70CABC84B4D7D7607719E6CCB88F5611 In = F13C972C52CB3CC4A4DF28C97F2DF11CE089B815466BE88863243EB318C2ADB1A417CB1041308598541720197B9B1CB5BA2318BD5574D1DF2174AF14884149BA9B2F446D609DF240CE335599957B8EC80876D9A085AE084907BC5961B20BF5F6CA58D5DAB38ADB Out = 252C064C54A56F4C21888CA2F1B8CD3F56D46C7A8BD65CCF30674001FE58ECF52FC0F571B8FFEF4C8970A227F39F8E61CD2068DFAA79FF86CEE6032E020C1D0A In = E35780EB9799AD4C77535D4DDB683CF33EF367715327CF4C4A58ED9CBDCDD486F669F80189D549A9364FA82A51A52654EC721BB3AAB95DCEB4A86A6AFA93826DB923517E928F33E3FBA850D45660EF83B9876ACCAFA2A9987A254B137C6E140A21691E1069413848 Out = 31CD4B1BC499BE3923D020290E49A9B24FC4A0A7B974AB0BF2447394E193854B9C575D4F8DF12C96A9A1CE2E74B6BB0D731D26CCCD7044CE1D6D7580CE440A4D In = 64EC021C9585E01FFE6D31BB50D44C79B6993D72678163DB474947A053674619D158016ADB243F5C8D50AA92F50AB36E579FF2DABB780A2B529370DAA299207CFBCDD3A9A25006D19C4F1FE33E4B1EAEC315D8C6EE1E730623FD1941875B924EB57D6D0C2EDC4E78D6 Out = A1EC50CC515D21489A34BD69C88F2C45EE97B0A39B9AAAC83D3B008FD856ECD5661A78A46DC73D87145A3DE34D702E1E6F08B9B4E52E5A0042F4C71865448C74 In = 5954BAB512CF327D66B5D9F296180080402624AD7628506B555EEA8382562324CF452FBA4A2130DE3E165D11831A270D9CB97CE8C2D32A96F50D71600BB4CA268CF98E90D6496B0A6619A5A8C63DB6D8A0634DFC6C7EC8EA9C006B6C456F1B20CD19E781AF20454AC880 Out = C0F9653A4BC7526DFA97E4EDB6672B04864195BAE6FC0A1113A3B83DBD2C8855B576845F948302947E7EFD983F49AA802A21DFF605EC22465B47E92593B7699D In = 03D9F92B2C565709A568724A0AFF90F8F347F43B02338F94A03ED32E6F33666FF5802DA4C81BDCE0D0E86C04AFD4EDC2FC8B4141C2975B6F07639B1994C973D9A9AFCE3D9D365862003498513BFA166D2629E314D97441667B007414E739D7FEBF0FE3C32C17AA188A8683 Out = 6DFA000A05DB40B04F271AD4E92CDDB5283A69D0FDD6B6AAB44930082FA594D5D5F399256953CBBE58679D97BA976C25C766BB1E599BC0B53D3D2B16A7944BC5 In = F31E8B4F9E0621D531D22A380BE5D9ABD56FAEC53CBD39B1FAB230EA67184440E5B1D15457BD25F56204FA917FA48E669016CB48C1FFC1E1E45274B3B47379E00A43843CF8601A5551411EC12503E5AAC43D8676A1B2297EC7A0800DBFEE04292E937F21C005F17411473041 Out = 5F6DC10F5C7794D94999445A479B1DF6C18E418E0C746F7E7C5C2CD07CE7BAE3723C9146375FD53C31D30B77BA8929ECB4F3F9826171471C5A0060874DBE9221 In = 758EA3FEA738973DB0B8BE7E599BBEF4519373D6E6DCD7195EA885FC991D896762992759C2A09002912FB08E0CB5B76F49162AEB8CF87B172CF3AD190253DF612F77B1F0C532E3B5FC99C2D31F8F65011695A087A35EE4EEE5E334C369D8EE5D29F695815D866DA99DF3F79403 Out = BE3AF3DBF048265E9A4D4CF2BE74FDAF4919FDDFC787DDE35724C50EED60248059539FA0D291C7FA0782A8BC97FEDF4BC77B3359EB0A6A21A7CB1E157D261A6A In = 47C6E0C2B74948465921868804F0F7BD50DD323583DC784F998A93CD1CA4C6EF84D41DC81C2C40F34B5BEE6A93867B3BDBA0052C5F59E6F3657918C382E771D33109122CC8BB0E1E53C4E3D13B43CE44970F5E0C079D2AD7D7A3549CD75760C21BB15B447589E86E8D76B1E9CED2 Out = ECAB693D40C8312BBD410A6242020071943AB43AA4229D0881A947C607DCB4821A3FE66742E5DDF9AC5041DA9B1606906957C29CC487E36437BE176BBC4222C6 In = F690A132AB46B28EDFA6479283D6444E371C6459108AFD9C35DBD235E0B6B6FF4C4EA58E7554BD002460433B2164CA51E868F7947D7D7A0D792E4ABF0BE5F450853CC40D85485B2B8857EA31B5EA6E4CCFA2F3A7EF3380066D7D8979FDAC618AAD3D7E886DEA4F005AE4AD05E5065F Out = 059858C913729529293D386929071854485C703BF352A0FCA529779E1207CB505A8265868347322C303A08940202D386AA6E88753697D7476EF3A7A638DB71D9 In = 58D6A99BC6458824B256916770A8417040721CCCFD4B79EACD8B65A3767CE5BA7E74104C985AC56B8CC9AEBD16FEBD4CDA5ADB130B0FF2329CC8D611EB14DAC268A2F9E633C99DE33997FEA41C52A7C5E1317D5B5DAED35EBA7D5A60E45D1FA7EAABC35F5C2B0A0F2379231953322C4E Out = C742B9B057466C8A36DA533AC0B518D9C650A9FF6E58E9698FAC412D8F30037361DEA5E178F0BC789778804B1976D8F8DC1A65B68212EC5A6F6EDB1A5DE88951 In = BEFAB574396D7F8B6705E2D5B58B2C1C820BB24E3F4BAE3E8FBCD36DBF734EE14E5D6AB972AEDD3540235466E825850EE4C512EA9795ABFD33F330D9FD7F79E62BBB63A6EA85DE15BEAEEA6F8D204A28956059E2632D11861DFB0E65BC07AC8A159388D5C3277E227286F65FF5E5B5AEC1 Out = 7123CE99542416A1DB471CDC46CF2120C78DE65114E14D0E91E5FD8C323D58B66A7D78BE1030904AA1E4F157D9ADB333C01C02F84C0C49D91073178A9F677976 In = 8E58144FA9179D686478622CE450C748260C95D1BA43B8F9B59ABECA8D93488DA73463EF40198B4D16FB0B0707201347E0506FF19D01BEA0F42B8AF9E71A1F1BD168781069D4D338FDEF00BF419FBB003031DF671F4A37979564F69282DE9C65407847DD0DA505AB1641C02DEA4F0D834986 Out = B5DBA1E9D437D57D6D8F676A89760B1147454E9E492092CE192F5BDE015FA8C54361C3E651F76621332817E6B7B9081DA9818F07B3DAAC9C9E34B6F65F349ADC In = B55C10EAE0EC684C16D13463F29291BF26C82E2FA0422A99C71DB4AF14DD9C7F33EDA52FD73D017CC0F2DBE734D831F0D820D06D5F89DACC485739144F8CFD4799223B1AFF9031A105CB6A029BA71E6E5867D85A554991C38DF3C9EF8C1E1E9A7630BE61CAABCA69280C399C1FB7A12D12AEFC Out = E69B0A4A096714DE5972E51831D6A0A47BF0DCF390325C283B1A78FBB0AED2A49C3D0EFEDC048985EB5B256D8BC6E1B19CD42ABA2BC18B16FF6B9CCDF45D15EF In = 2EEEA693F585F4ED6F6F8865BBAE47A6908AECD7C429E4BEC4F0DE1D0CA0183FA201A0CB14A529B7D7AC0E6FF6607A3243EE9FB11BCF3E2304FE75FFCDDD6C5C2E2A4CD45F63C962D010645058D36571404A6D2B4F44755434D76998E83409C3205AA1615DB44057DB991231D2CB42624574F545 Out = AD134BE6908CFB23FFB8920A7993F803B750695AD7195667B9BD2A09ACCCECA68B67DE2D3312C8FB04482F543BE20F4F1B216887F6221A452B1D93CE246AD384 In = DAB11DC0B047DB0420A585F56C42D93175562852428499F66A0DB811FCDDDAB2F7CDFFED1543E5FB72110B64686BC7B6887A538AD44C050F1E42631BC4EC8A9F2A047163D822A38989EE4AAB01B4C1F161B062D873B1CFA388FD301514F62224157B9BEF423C7783B7AAC8D30D65CD1BBA8D689C2D Out = A6D9A83B9A6A258F012844ABB76B5A53B5B06E0E2A2802CBEB7B29074645B736A023FF8CC71627915FCACF734C8BBB6F68DD6FD0E76E73C7556DD5E8D8EEE6F6 In = 42E99A2F80AEE0E001279A2434F731E01D34A44B1A8101726921C0590C30F3120EB83059F325E894A5AC959DCA71CE2214799916424E859D27D789437B9D27240BF8C35ADBAFCECC322B48AA205B293962D858652ABACBD588BCF6CBC388D0993BD622F96ED54614C25B6A9AA527589EAAFFCF17DDF7 Out = 1CA44FFD7C894F103CFC3143C94FFCC6BF3B5C9E65BC6E5410D446ED5C72BD666197CF3EA58688BF06C4BFE3E73F9A3F8CAA5D6CD284E4A5E03E1313ED670B6E In = 3C9B46450C0F2CAE8E3823F8BDB4277F31B744CE2EB17054BDDC6DFF36AF7F49FB8A2320CC3BDF8E0A2EA29AD3A55DE1165D219ADEDDB5175253E2D1489E9B6FDD02E2C3D3A4B54D60E3A47334C37913C5695378A669E9B72DEC32AF5434F93F46176EBF044C4784467C700470D0C0B40C8A088C815816 Out = 7652A71EE36CA1E3D99AD8868D2268BA933314E1F2D1ECE6E3DC599B9FDC46753C94BF2B3F76587B13582D5F75C29BDD2BB2FBB957AE5E4FD0F368E64E377D3F In = D1E654B77CB155F5C77971A64DF9E5D34C26A3CAD6C7F6B300D39DEB1910094691ADAA095BE4BA5D86690A976428635D5526F3E946F7DC3BD4DBC78999E653441187A81F9ADCD5A3C5F254BC8256B0158F54673DCC1232F6E918EBFC6C51CE67EAEB042D9F57EEC4BFE910E169AF78B3DE48D137DF4F2840 Out = F6BF19E74ABEA64AE336BB1F425EC1D58F743BA700B56EE7A22DDFFDBED3FBADE27FCF7B9A2797D2B374E769D632FB245A9E6457151E5D63012B9B0B292CEB93 In = 626F68C18A69A6590159A9C46BE03D5965698F2DAC3DE779B878B3D9C421E0F21B955A16C715C1EC1E22CE3EB645B8B4F263F60660EA3028981EEBD6C8C3A367285B691C8EE56944A7CD1217997E1D9C21620B536BDBD5DE8925FF71DEC6FBC06624AB6B21E329813DE90D1E572DFB89A18120C3F606355D25 Out = 1F7AB9A67B8664D588C3B798322FEE18ABC43F9C064B82C3394409096901E38063024E638D1F4F4AC95A22D0B0165A3EFA5633A8ED301EB861F908AD91D2AF5F In = 651A6FB3C4B80C7C68C6011675E6094EB56ABF5FC3057324EBC6477825061F9F27E7A94633ABD1FA598A746E4A577CAF524C52EC1788471F92B8C37F23795CA19D559D446CAB16CBCDCE90B79FA1026CEE77BF4AB1B503C5B94C2256AD75B3EAC6FD5DCB96ACA4B03A834BFB4E9AF988CECBF2AE597CB9097940 Out = 4F44285FAFBDA04FDDEA743B76C3C4DD3C9A0155060A666E3DF796A5322DCB9C055971B5FD61323B8AE8A6B64680A7D71C5077AFEF83056B01F57F426CD17399 In = 8AAF072FCE8A2D96BC10B3C91C809EE93072FB205CA7F10ABD82ECD82CF040B1BC49EA13D1857815C0E99781DE3ADBB5443CE1C897E55188CEAF221AA9681638DE05AE1B322938F46BCE51543B57ECDB4C266272259D1798DE13BE90E10EFEC2D07484D9B21A3870E2AA9E06C21AA2D0C9CF420080A80A91DEE16F Out = 1A088A13768FF64F5A63EF623E245BC68A0AC64A2B1FE9EAB756A051CC9CB8773056736C20E4E51C17CC83C69DBC544BB4F095593D406066B16C15A53A8A22C7 In = 53F918FD00B1701BD504F8CDEA803ACCA21AC18C564AB90C2A17DA592C7D69688F6580575395551E8CD33E0FEF08CA6ED4588D4D140B3E44C032355DF1C531564D7F4835753344345A6781E11CD5E095B73DF5F82C8AE3AD00877936896671E947CC52E2B29DCD463D90A0C9929128DA222B5A211450BBC0E02448E2 Out = A7B7B719AA7C335B2C96890C1F40BE4FA63278C6396C9A244556D039AA16A862AABF60B417E95003DA542983C2730A8FBCB2D9BE81EEE58D33B488CEEA986005 In = A64599B8A61B5CCEC9E67AED69447459C8DA3D1EC6C7C7C82A7428B9B584FA67E90F68E2C00FBBED4613666E5168DA4A16F395F7A3C3832B3B134BFC9CBAA95D2A0FE252F44AC6681EB6D40AB91C1D0282FED6701C57463D3C5F2BB8C6A7301FB4576AA3B5F15510DB8956FF77478C26A7C09BEA7B398CFC83503F538E Out = 7CC4A1F7B43334E2BACC0C2DDA214A4302DB5021F176C23518CFEB5F9FFD8B149217C297A83AFFB0E18671FCC82094D14AC7C08EF17872CB3B4E4F380FBB75A0 In = 0E3AB0E054739B00CDB6A87BD12CAE024B54CB5E550E6C425360C2E87E59401F5EC24EF0314855F0F56C47695D56A7FB1417693AF2A1ED5291F2FEE95F75EED54A1B1C2E81226FBFF6F63ADE584911C71967A8EB70933BC3F5D15BC91B5C2644D9516D3C3A8C154EE48E118BD1442C043C7A0DBA5AC5B1D5360AAE5B9065 Out = C12761F00A8D1DAED752FBC278FF9FB6CC2366F07DB2F7A569EC4C4AA70571BBEE078FF0D306C2B9FF50F14F6480BCA6B9855F2A2B477F025ADEF29736DF8154 In = A62FC595B4096E6336E53FCDFC8D1CC175D71DAC9D750A6133D23199EAAC288207944CEA6B16D27631915B4619F743DA2E30A0C00BBDB1BBB35AB852EF3B9AEC6B0A8DCC6E9E1ABAA3AD62AC0A6C5DE765DE2C3711B769E3FDE44A74016FFF82AC46FA8F1797D3B2A726B696E3DEA5530439ACEE3A45C2A51BC32DD055650B Out = 40C3E38BCD69664A45C84A848C676CD489BC420ABB6140DBCD14AEB82F3A52664FD025F26B4DFB52C99B2D88F734DF113B3ED32884E272C0C68A2C18E2005E56 In = 2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817 Out = 832FA35E6AD63AB4C1AC025496B38891AB95986A7AE6DEDEDE9A528D3F0ECC93A8C5AA04863487C827A057ABEACAFE3CE411BD49FFFEA012F90C086A7E55825E In = 10DB509B2CDCABA6C062AE33BE48116A29EB18E390E1BBADA5CA0A2718AFBCD23431440106594893043CC7F2625281BF7DE2655880966A23705F0C5155C2F5CCA9F2C2142E96D0A2E763B70686CD421B5DB812DACED0C6D65035FDE558E94F26B3E6DDE5BD13980CC80292B723013BD033284584BFF27657871B0CF07A849F4AE2 Out = 591A7FBAF0B560A42C7525552AFDEAE41B380FD9701105976BD5701234F6EC7D1F800B35744995CCDC79AEF4004C8704A4B3ECCD700FB68C40E4D40633A2BFCD In = 9334DE60C997BDA6086101A6314F64E4458F5FF9450C509DF006E8C547983C651CA97879175AABA0C539E82D05C1E02C480975CBB30118121061B1EBAC4F8D9A3781E2DB6B18042E01ECF9017A64A0E57447EC7FCBE6A7F82585F7403EE2223D52D37B4BF426428613D6B4257980972A0ACAB508A7620C1CB28EB4E9D30FC41361EC Out = FD13F95A40175A4DABFED7C47B07599BDC6755B83C68CF391A6742E838E590DA126D8F1D7D69A9AE69993F51AD5F17BC8C895063490ACA07339A281D9FFA6FDA In = E88AB086891693AA535CEB20E64C7AB97C7DD3548F3786339897A5F0C39031549CA870166E477743CCFBE016B4428D89738E426F5FFE81626137F17AECFF61B72DBEE2DC20961880CFE281DFAB5EE38B1921881450E16032DE5E4D55AD8D4FCA609721B0692BAC79BE5A06E177FE8C80C0C83519FB3347DE9F43D5561CB8107B9B5EDC Out = 0CD73D5E4DAFC2C8F1470CCF0D91EBED9772E5E2A125D79B135CD0A86771457CFC025D6ABF6DE194BCE518F47A5BC839F8288EB55286478B724D1A9AD6AEF7E9 In = FD19E01A83EB6EC810B94582CB8FBFA2FCB992B53684FB748D2264F020D3B960CB1D6B8C348C2B54A9FCEA72330C2AAA9A24ECDB00C436ABC702361A82BB8828B85369B8C72ECE0082FE06557163899C2A0EFA466C33C04343A839417057399A63A3929BE1EE4805D6CE3E5D0D0967FE9004696A5663F4CAC9179006A2CEB75542D75D68 Out = 0235C1C7D31EFEDAD8823F40A52516AA7145AEE88D4250B0C850D9F7DA31AFC2D7D500D81C69149D57AE2353A8D85D898E405528A7DE8001C42081FD76519839 In = 59AE20B6F7E0B3C7A989AFB28324A40FCA25D8651CF1F46AE383EF6D8441587AA1C04C3E3BF88E8131CE6145CFB8973D961E8432B202FA5AF3E09D625FAAD825BC19DA9B5C6C20D02ABDA2FCC58B5BD3FE507BF201263F30543819510C12BC23E2DDB4F711D087A86EDB1B355313363A2DE996B891025E147036087401CCF3CA7815BF3C49 Out = AA46F3CF5B63B99CD18BC0530A2C07234897A8C46AE5B0D2CC86ECEDD79F2824845E2B4A60B51C925F152643DA4B3824A1EF30BDC43D85F9B7E1F9A1F3C6AA15 In = 77EE804B9F3295AB2362798B72B0A1B2D3291DCEB8139896355830F34B3B328561531F8079B79A6E9980705150866402FDC176C05897E359A6CB1A7AB067383EB497182A7E5AEF7038E4C96D133B2782917417E391535B5E1B51F47D8ED7E4D4025FE98DC87B9C1622614BFF3D1029E68E372DE719803857CA52067CDDAAD958951CB2068CC6 Out = 922642EEBA89CADADEDF8C38F1744C01726FDFB3B55AE4A5476B54254B7CD9A180725F3381A6454549338157565EBAC088B29738885B4F1FF8FC1EBAC7D56DA4 In = B771D5CEF5D1A41A93D15643D7181D2A2EF0A8E84D91812F20ED21F147BEF732BF3A60EF4067C3734B85BC8CD471780F10DC9E8291B58339A677B960218F71E793F2797AEA349406512829065D37BB55EA796FA4F56FD8896B49B2CD19B43215AD967C712B24E5032D065232E02C127409D2ED4146B9D75D763D52DB98D949D3B0FED6A8052FBB Out = 430921B199B2C4180C841EB09EF3CCDC7DC80793E43D94410CDA5B64A251422AD787F33075E0F6BB18E1F7E84B1A7E7386B7C65352AEA14BD67ADD03F09A004E In = B32D95B0B9AAD2A8816DE6D06D1F86008505BD8C14124F6E9A163B5A2ADE55F835D0EC3880EF50700D3B25E42CC0AF050CCD1BE5E555B23087E04D7BF9813622780C7313A1954F8740B6EE2D3F71F768DD417F520482BD3A08D4F222B4EE9DBD015447B33507DD50F3AB4247C5DE9A8ABD62A8DECEA01E3B87C8B927F5B08BEB37674C6F8E380C04 Out = 173BF476E53B69168626AD53CB84FFFA6AE8E369499C25D38599C3B3FFED96B539A5471A31E5F4C0457603FA880B7509356931C166784AF0BDAC4F68684BCA29 In = 04410E31082A47584B406F051398A6ABE74E4DA59BB6F85E6B49E8A1F7F2CA00DFBA5462C2CD2BFDE8B64FB21D70C083F11318B56A52D03B81CAC5EEC29EB31BD0078B6156786DA3D6D8C33098C5C47BB67AC64DB14165AF65B44544D806DDE5F487D5373C7F9792C299E9686B7E5821E7C8E2458315B996B5677D926DAC57B3F22DA873C601016A0D Out = 1EA4BE40CB78E3C756EA962E4EEBA36C3469ECFFA40D892109FA888B5271855AE37BAA5BE9A0D907AD081D1644929CA0DD16B7A8BBD0C3D1B6C3515BD557608C In = 8B81E9BADDE026F14D95C019977024C9E13DB7A5CD21F9E9FC491D716164BBACDC7060D882615D411438AEA056C340CDF977788F6E17D118DE55026855F93270472D1FD18B9E7E812BAE107E0DFDE7063301B71F6CFE4E225CAB3B232905A56E994F08EE2891BA922D49C3DAFEB75F7C69750CB67D822C96176C46BD8A29F1701373FB09A1A6E3C7158F Out = D57DD56F6F4D55D3DB07030F91F165086647BEDC07240C66203F6BD328F7FCF46459689568DB402EA6F29DA1646EF2576876090E656200B4489F408B55DCFC99 In = FA6EED24DA6666A22208146B19A532C2EC9BA94F09F1DEF1E7FC13C399A48E41ACC2A589D099276296348F396253B57CB0E40291BD282773656B6E0D8BEA1CDA084A3738816A840485FCF3FB307F777FA5FEAC48695C2AF4769720258C77943FB4556C362D9CBA8BF103AEB9034BAA8EA8BFB9C4F8E6742CE0D52C49EA8E974F339612E830E9E7A9C29065 Out = 8D75401D0C8F186789832ACF148F4FA1DA028BF0EFAABD51DACBC1678AFEA1AEBB4FC0EA546D176D83205A9B7CE9A249FAF88DBE51CF0F92DB4A104DF36DD82F In = 9BB4AF1B4F09C071CE3CAFA92E4EB73CE8A6F5D82A85733440368DEE4EB1CBC7B55AC150773B6FE47DBE036C45582ED67E23F4C74585DAB509DF1B83610564545642B2B1EC463E18048FC23477C6B2AA035594ECD33791AF6AF4CBC2A1166ABA8D628C57E707F0B0E8707CAF91CD44BDB915E0296E0190D56D33D8DDE10B5B60377838973C1D943C22ED335E Out = AA91A3A6F5690587FE1EA55F02BE20945DC1EC839EA1486DA2707CDA5964E8F8BDCDEE1D521932675049442E1B8350FF6C2A20C24F302BE5C9D1BC8B03494050 In = 2167F02118CC62043E9091A647CADBED95611A521FE0D64E8518F16C808AB297725598AE296880A773607A798F7C3CFCE80D251EBEC6885015F9ABF7EAABAE46798F82CB5926DE5C23F44A3F9F9534B3C6F405B5364C2F8A8BDC5CA49C749BED8CE4BA48897062AE8424CA6DDE5F55C0E42A95D1E292CA54FB46A84FBC9CD87F2D0C9E7448DE3043AE22FDD229 Out = 31A4C95CE728866CFAF05DBC65ED97119CEC99A624B191AC5B1EB998914B7B29FC09F71FF2E01510E88F74D04BB58CD741D3EFBBE5F1166B5C9A2045DD84A9C5 In = 94B7FA0BC1C44E949B1D7617D31B4720CBE7CA57C6FA4F4094D4761567E389ECC64F6968E4064DF70DF836A47D0C713336B5028B35930D29EB7A7F9A5AF9AD5CF441745BAEC9BB014CEEFF5A41BA5C1CE085FEB980BAB9CF79F2158E03EF7E63E29C38D7816A84D4F71E0F548B7FC316085AE38A060FF9B8DEC36F91AD9EBC0A5B6C338CBB8F6659D342A24368CF Out = D1A28FA6FF25A8EB4239887C3D845EDDFAC6CBF1339FF91FE83663DA1A5E5A849F32D136973C38FE9C54230F970D19857D972A3EB86E2D64B2B302C0DEFA64FD In = EA40E83CB18B3A242C1ECC6CCD0B7853A439DAB2C569CFC6DC38A19F5C90ACBF76AEF9EA3742FF3B54EF7D36EB7CE4FF1C9AB3BC119CFF6BE93C03E208783335C0AB8137BE5B10CDC66FF3F89A1BDDC6A1EED74F504CBE7290690BB295A872B9E3FE2CEE9E6C67C41DB8EFD7D863CF10F840FE618E7936DA3DCA5CA6DF933F24F6954BA0801A1294CD8D7E66DFAFEC Out = 9F022F46B468702350612A04A8E42E89452558FAE89FF2DC1AECD210F4C221204A51FA55012D22FF690C955D618B2819DD5D861EF59E17D41693B4FD2D70B981 In = 157D5B7E4507F66D9A267476D33831E7BB768D4D04CC3438DA12F9010263EA5FCAFBDE2579DB2F6B58F911D593D5F79FB05FE3596E3FA80FF2F761D1B0E57080055C118C53E53CDB63055261D7C9B2B39BD90ACC32520CBBDBDA2C4FD8856DBCEE173132A2679198DAF83007A9B5C51511AE49766C792A29520388444EBEFE28256FB33D4260439CBA73A9479EE00C63 Out = 4F8707FF2D414F80A4DD66AB12A8EBF1564AC406A5872AA6857B8BBFA00DFF6057FE75E53E0562D9243101F2094E68194789A202C5A47655A6D2DD1B426C5EC8 In = 836B34B515476F613FE447A4E0C3F3B8F20910AC89A3977055C960D2D5D2B72BD8ACC715A9035321B86703A411DDE0466D58A59769672AA60AD587B8481DE4BBA552A1645779789501EC53D540B904821F32B0BD1855B04E4848F9F8CFE9EBD8911BE95781A759D7AD9724A7102DBE576776B7C632BC39B9B5E19057E226552A5994C1DBB3B5C7871A11F5537011044C53 Out = E8FE68B74A9922464E45AD08493E2E7462AFEC671C4B7425EE5E873BEA5339F59E009E26272291093223B3482FFEDC5ECFD2832A78569D7DE49B68C51813BCFE In = CC7784A4912A7AB5AD3620AAB29BA87077CD3CB83636ADC9F3DC94F51EDF521B2161EF108F21A0A298557981C0E53CE6CED45BDF782C1EF200D29BAB81DD6460586964EDAB7CEBDBBEC75FD7925060F7DA2B853B2B089588FA0F8C16EC6498B14C55DCEE335CB3A91D698E4D393AB8E8EAC0825F8ADEBEEE196DF41205C011674E53426CAA453F8DE1CBB57932B0B741D4C6 Out = 08B9D5DDC2F758631C065E553B0743308A1FB943937CB0AE15F75ECC07C40CF3F2D274D2C916FBFBEC1C262B07507532B8330497AB5E27FACAB58616647257F3 In = 7639B461FFF270B2455AC1D1AFCE782944AEA5E9087EB4A39EB96BB5C3BAAF0E868C8526D3404F9405E79E77BFAC5FFB89BF1957B523E17D341D7323C302EA7083872DD5E8705694ACDDA36D5A1B895AAA16ECA6104C82688532C8BFE1790B5DC9F4EC5FE95BAED37E1D287BE710431F1E5E8EE105BC42ED37D74B1E55984BF1C09FE6A1FA13EF3B96FAEAED6A2A1950A12153 Out = B05977F9C735ADD58DCB98B1BB0340BABBC0392A2629639DF4FA2096072AE8852219BD23163D9F68A523C88B57DE5C1FF0BFA548DE552BC9E1D1EEBB12E1B068 In = EB6513FC61B30CFBA58D4D7E80F94D14589090CF1D80B1DF2E68088DC6104959BA0D583D585E9578AB0AEC0CF36C48435EB52ED9AB4BBCE7A5ABE679C97AE2DBE35E8CC1D45B06DDA3CF418665C57CBEE4BBB47FA4CAF78F4EE656FEC237FE4EEBBAFA206E1EF2BD0EE4AE71BD0E9B2F54F91DAADF1FEBFD7032381D636B733DCB3BF76FB14E23AFF1F68ED3DBCF75C9B99C6F26 Out = 20ADB45EE45E35CCC5570F3CAEEA09B1E921CB0DD22536A69CDF20D39B608F28DA161D17FEE70E0064886A5522EE26A1CF215F63802CD0478AE017F5F6DB4ED0 In = 1594D74BF5DDE444265D4C04DAD9721FF3E34CBF622DAF341FE16B96431F6C4DF1F760D34F296EB97D98D560AD5286FEC4DCE1724F20B54FD7DF51D4BF137ADD656C80546FB1BF516D62EE82BAA992910EF4CC18B70F3F8698276FCFB44E0EC546C2C39CFD8EE91034FF9303058B4252462F86C823EB15BF481E6B79CC3A02218595B3658E8B37382BD5048EAED5FD02C37944E73B Out = 18B458490EBF71727CE479BD7CD8F692CB93CBCDD104E371D4FCB12AA3EA2EFA8FD779C58ECD1C321E2EDCF991A4AA4DBB8C35C8DE98B52D898AA0F6087A82EA In = 4CFA1278903026F66FEDD41374558BE1B585D03C5C55DAC94361DF286D4BD39C7CB8037ED3B267B07C346626449D0CC5B0DD2CF221F7E4C3449A4BE99985D2D5E67BFF2923357DDEAB5ABCB4619F3A3A57B2CF928A022EB27676C6CF805689004FCA4D41EA6C2D0A4789C7605F7BB838DD883B3AD3E6027E775BCF262881428099C7FFF95B14C095EA130E0B9938A5E22FC52650F591 Out = 15BCA0A37F93998CFFC0AA8A306E76B2376C7D03BFFC3F274BA8E53F726A427680C2AC88CB02D48708FC5026C8D656BB5863A96748FDD04C438CFF925863F7DC In = D3E65CB92CFA79662F6AF493D696A07CCF32AAADCCEFF06E73E8D9F6F909209E66715D6E978788C49EFB9087B170ECF3AA86D2D4D1A065AE0EFC8924F365D676B3CB9E2BEC918FD96D0B43DEE83727C9A93BF56CA2B2E59ADBA85696546A815067FC7A78039629D4948D157E7B0D826D1BF8E81237BAB7321312FDAA4D521744F988DB6FDF04549D0FDCA393D639C729AF716E9C8BBA48 Out = A75FA73BE8F031538E968BF59DFD1565EDA3D35FD168C37BB9B2F289871FF7758BC29A58357486CD875C59FD41F7B484ED7C2580D158176BA452805CBD9302B9 In = 842CC583504539622D7F71E7E31863A2B885C56A0BA62DB4C2A3F2FD12E79660DC7205CA29A0DC0A87DB4DC62EE47A41DB36B9DDB3293B9AC4BAAE7DF5C6E7201E17F717AB56E12CAD476BE49608AD2D50309E7D48D2D8DE4FA58AC3CFEAFEEE48C0A9EEC88498E3EFC51F54D300D828DDDCCB9D0B06DD021A29CF5CB5B2506915BEB8A11998B8B886E0F9B7A80E97D91A7D01270F9A7717 Out = 327F1487A412B861E53047F755B2D6FFBB119AC289A40E4B9861E47B2C2C0922342A4005BD85AADB9C48CD899DB55E156F13C409034D88AA1FCAC59FDFBE06B8 In = 6C4B0A0719573E57248661E98FEBE326571F9A1CA813D3638531AE28B4860F23C3A3A8AC1C250034A660E2D71E16D3ACC4BF9CE215C6F15B1C0FC7E77D3D27157E66DA9CEEC9258F8F2BF9E02B4AC93793DD6E29E307EDE3695A0DF63CBDC0FC66FB770813EB149CA2A916911BEE4902C47C7802E69E405FE3C04CEB5522792A5503FA829F707272226621F7C488A7698C0D69AA561BE9F378 Out = 74C782A54600C154B0336297058646F0EE85A531BF0C8D356F0FC96D90421D47014FFF9F81EAEEA6DC90BA4860D6E14E1A42635B893CE64461A4D44CD92CD48F In = 51B7DBB7CE2FFEB427A91CCFE5218FD40F9E0B7E24756D4C47CD55606008BDC27D16400933906FD9F30EFFDD4880022D081155342AF3FB6CD53672AB7FB5B3A3BCBE47BE1FD3A2278CAE8A5FD61C1433F7D350675DD21803746CADCA574130F01200024C6340AB0CC2CF74F2234669F34E9009EF2EB94823D62B31407F4BA46F1A1EEC41641E84D77727B59E746B8A671BEF936F05BE820759FA Out = 4603EA28DC3A5C1C8E083726202C51C1B763F7D09BBED5B8FBAB0EF0F816E27E4E0675FE8B64C7DC356CB248C1214D40239FCDC1FB49B77B94F2A01A4B1F247D In = 83599D93F5561E821BD01A472386BC2FF4EFBD4AED60D5821E84AAE74D8071029810F5E286F8F17651CD27DA07B1EB4382F754CD1C95268783AD09220F5502840370D494BEB17124220F6AFCE91EC8A0F55231F9652433E5CE3489B727716CF4AEBA7DCDA20CD29AA9A859201253F948DD94395ABA9E3852BD1D60DDA7AE5DC045B283DA006E1CBAD83CC13292A315DB5553305C628DD091146597 Out = 41BC57357D866202927DB08F16DCCFDFF89A16498316BDEF586D5D92757319BC189386C763EA2961D10C2FD0068C1C2C73419C309547A21EA9854E11275A0E2E In = 2BE9BF526C9D5A75D565DD11EF63B979D068659C7F026C08BEA4AF161D85A462D80E45040E91F4165C074C43AC661380311A8CBED59CC8E4C4518E80CD2C78AB1CABF66BFF83EAB3A80148550307310950D034A6286C93A1ECE8929E6385C5E3BB6EA8A7C0FB6D6332E320E71CC4EB462A2A62E2BFE08F0CCAD93E61BEDB5DD0B786A728AB666F07E0576D189C92BF9FB20DCA49AC2D3956D47385E2 Out = 2C811EC09D88F5DEBBB908E06D7972F536E704E6CDCC389B1F54D7B34A727B402C0779E4D41CCEF9F4D9E3F93767DBE1462AB109604F95ACC89C418E8DD40C8E In = CA76D3A12595A817682617006848675547D3E8F50C2210F9AF906C0E7CE50B4460186FE70457A9E879E79FD4D1A688C70A347361C847BA0DD6AA52936EAF8E58A1BE2F5C1C704E20146D366AEB3853BED9DE9BEFE9569AC8AAEA37A9FB7139A1A1A7D5C748605A8DEFB297869EBEDD71D615A5DA23496D11E11ABBB126B206FA0A7797EE7DE117986012D0362DCEF775C2FE145ADA6BDA1CCB326BF644 Out = DEEECAC666AD939B3A8F1A00063B26FF8AECF97DDDFD0AFF77A63847CA7DB09E279BD725E072B40BC2FF511C2A20146EB4B292FEA9F8AA2E4652F894121C2257 In = F76B85DC67421025D64E93096D1D712B7BAF7FB001716F02D33B2160C2C882C310EF13A576B1C2D30EF8F78EF8D2F465007109AAD93F74CB9E7D7BEF7C9590E8AF3B267C89C15DB238138C45833C98CC4A471A7802723EF4C744A853CF80A0C2568DD4ED58A2C9644806F42104CEE53628E5BDF7B63B0B338E931E31B87C24B146C6D040605567CEEF5960DF9E022CB469D4C787F4CBA3C544A1AC91F95F Out = 490F734EB6640C36498A1AF2F941A6791DBDD2B1FAAFDAAF6DB82AADEC20A650B750DCEA117A3F009AEF83CB4262348F97B3AE01098694BF857A4C78C19BA56C In = 25B8C9C032EA6BCD733FFC8718FBB2A503A4EA8F71DEA1176189F694304F0FF68E862A8197B839957549EF243A5279FC2646BD4C009B6D1EDEBF24738197ABB4C992F6B1DC9BA891F570879ACCD5A6B18691A93C7D0A8D38F95B639C1DAEB48C4C2F15CCF5B9D508F8333C32DE78781B41850F261B855C4BEBCC125A380C54D501C5D3BD07E6B52102116088E53D76583B0161E2A58D0778F091206AABD5A1 Out = AEEB225218FAAE867F637DC9E7134D8213A73CA5D91B5512D38C553D8329D7970A590D4F864B371F94C5B3A1ED815D443CB24BF0D6932782E24DF80BA53FEEE2 In = 21CFDC2A7CCB7F331B3D2EEFFF37E48AD9FA9C788C3F3C200E0173D99963E1CBCA93623B264E920394AE48BB4C3A5BB96FFBC8F0E53F30E22956ADABC2765F57FB761E147ECBF8567533DB6E50C8A1F894310A94EDF806DD8CA6A0E141C0FA7C9FAE6C6AE65F18C93A8529E6E5B553BF55F25BE2E80A9882BD37F145FECBEB3D447A3C4E46C21524CC55CDD62F521AB92A8BA72B897996C49BB273198B7B1C9E Out = ED668AF5C6EF4115A4BEDFDBE8204BB379A65ED35B2F4EB5F26EF605B93BF3C0046CD5C5C2F00BF8D8B99A07C86A489FA333057DDE1A3C41EBF77D2C88E11BEB In = 4E452BA42127DCC956EF4F8F35DD68CB225FB73B5BC7E1EC5A898BBA2931563E74FAFF3B67314F241EC49F4A7061E3BD0213AE826BAB380F1F14FAAB8B0EFDDD5FD1BB49373853A08F30553D5A55CCBBB8153DE4704F29CA2BDEEF0419468E05DD51557CCC80C0A96190BBCC4D77ECFF21C66BDF486459D427F986410F883A80A5BCC32C20F0478BB9A97A126FC5F95451E40F292A4614930D054C851ACD019CCF Out = DA465F237A360DDD2CF8E75E60721481F082FFE4C17478F2D0EBF70865DE57430445C5940B1361FFF0D9EAD681A0B1F3600D05383BB25E53ED6F5E5595A87ADF In = FA85671DF7DADF99A6FFEE97A3AB9991671F5629195049880497487867A6C446B60087FAC9A0F2FCC8E3B24E97E42345B93B5F7D3691829D3F8CCD4BB36411B85FC2328EB0C51CB3151F70860AD3246CE0623A8DC8B3C49F958F8690F8E3860E71EB2B1479A5CEA0B3F8BEFD87ACAF5362435EAECCB52F38617BC6C5C2C6E269EAD1FBD69E941D4AD2012DA2C5B21BCFBF98E4A77AB2AF1F3FDA3233F046D38F1DC8 Out = BE6FF2738AFB06EE4FE46C11629196106FF3D8D9FE9871688B4BA4E988527652F6BD6B4EBA4007CA3A6334998FDBC4D63CA5809104334095B23841AF69601209 In = E90847AE6797FBC0B6B36D6E588C0A743D725788CA50B6D792352EA8294F5BA654A15366B8E1B288D84F5178240827975A763BC45C7B0430E8A559DF4488505E009C63DA994F1403F407958203CEBB6E37D89C94A5EACF6039A327F6C4DBBC7A2A307D976AA39E41AF6537243FC218DFA6AB4DD817B6A397DF5CA69107A9198799ED248641B63B42CB4C29BFDD7975AC96EDFC274AC562D0474C60347A078CE4C25E88 Out = 0D4115FB73C9351F4884C23543283ED210451A04AC3B176E9AE5AFC5CCCEFEC84AF6D576C92C07451E76AB7E61EB6ABEC182D864DD50CB161F6F9E832F65D9BB In = F6D5C2B6C93954FC627602C00C4CA9A7D3ED12B27173F0B2C9B0E4A5939398A665E67E69D0B12FB7E4CEB253E8083D1CEB724AC07F009F094E42F2D6F2129489E846EAFF0700A8D4453EF453A3EDDC18F408C77A83275617FABC4EA3A2833AA73406C0E966276079D38E8E38539A70E194CC5513AAA457C699383FD1900B1E72BDFB835D1FD321B37BA80549B078A49EA08152869A918CA57F5B54ED71E4FD3AC5C06729 Out = 42B6A6A777578717590252D66A09839DDCCC8331BD8A795138A62B8CA5C711226713B68DA855233AA2D2AC0660C11F29F80F8DBF13335D0BE35301C1968F081D In = CF8562B1BED89892D67DDAAF3DEEB28246456E972326DBCDB5CF3FB289ACA01E68DA5D59896E3A6165358B071B304D6AB3D018944BE5049D5E0E2BB819ACF67A6006111089E6767132D72DD85BEDDCBB2D64496DB0CC92955AB4C6234F1EEA24F2D51483F2E209E4589BF9519FAC51B4D061E801125E605F8093BB6997BC163D551596FE4AB7CFAE8FB9A90F6980480CE0C229FD1675409BD788354DAF316240CFE0AF93EB Out = 3F40B9FB411C50279F73EC33332330C216580A5C3169D7188F6B1DE0892D8CC6E80C7BF1EEA707A71D267ED48A137961FC329A0A32050EE915706C235E487153 In = 2ACE31ABB0A2E3267944D2F75E1559985DB7354C6E605F18DC8470423FCA30B7331D9B33C4A4326783D1CAAE1B4F07060EFF978E4746BF0C7E30CD61040BD5EC2746B29863EB7F103EBDA614C4291A805B6A4C8214230564A0557BC7102E0BD3ED23719252F7435D64D210EE2AAFC585BE903FA41E1968C50FD5D5367926DF7A05E3A42CF07E656FF92DE73B036CF8B19898C0CB34557C0C12C2D8B84E91181AF467BC75A9D1 Out = 5B1D609D50CE4FF4362EF96E32E0798385780C9365B5B1B465EEC5C0FE400167A2557F64806DDE296C3DEDDD4B18E5EB90BD1BB71AE2FDBD081D10003FD83960 In = 0D8D09AED19F1013969CE5E7EB92F83A209AE76BE31C754844EA9116CEB39A22EBB6003017BBCF26555FA6624185187DB8F0CB3564B8B1C06BF685D47F3286EDA20B83358F599D2044BBF0583FAB8D78F854FE0A596183230C5EF8E54426750EAF2CC4E29D3BDD037E734D863C2BD9789B4C243096138F7672C232314EFFDFC6513427E2DA76916B5248933BE312EB5DDE4CF70804FB258AC5FB82D58D08177AC6F4756017FFF5 Out = DDD1A7F1D75AB14D1FC1DC6A3E865B688DB53DE4DAD80BE67A10AAA97CEF308C8B57371946B200E795C9E74EF1DCBF43A24771ED0CF2A58F602BDDFF6BB88345 In = C3236B73DEB7662BF3F3DAA58F137B358BA610560EF7455785A9BEFDB035A066E90704F929BD9689CEF0CE3BDA5ACF4480BCEB8D09D10B098AD8500D9B6071DFC3A14AF6C77511D81E3AA8844986C3BEA6F469F9E02194C92868CD5F51646256798FF0424954C1434BDFED9FACB390B07D342E992936E0F88BFD0E884A0DDB679D0547CCDEC6384285A45429D115AC7D235A717242021D1DC35641F5F0A48E8445DBA58E6CB2C8EA Out = E3977556DA6A520E8A862DAC38AB14E67695D9AE3A55AA52AF9252FD8F36BEA109A6A7CF2DA9EA64721D471BD666F0BBDF96447B0B8D4C1F03DECB5BD418F7CA In = B39FEB8283EADC63E8184B51DF5AE3FD41AAC8A963BB0BE1CD08AA5867D8D910C669221E73243360646F6553D1CA05A84E8DC0DE05B6419EC349CA994480193D01C92525F3FB3DCEFB08AFC6D26947BDBBFD85193F53B50609C6140905C53A6686B58E53A319A57B962331EDE98149AF3DE3118A819DA4D76706A0424B4E1D2910B0ED26AF61D150EBCB46595D4266A0BD7F651BA47D0C7F179CA28545007D92E8419D48FDFBD744CE Out = FC4662DB69023866D710713E2F634E0EC99B0288B7B1496FCF3C726AF175994DD5AD71E90C3C174EB598F998117655F07BB474910110985AE85D14420AF97B1F In = A983D54F503803E8C7999F4EDBBE82E9084F422143A932DDDDC47A17B0B7564A7F37A99D0786E99476428D29E29D3C197A72BFAB1342C12A0FC4787FD7017D7A6174049EA43B5779169EF7472BDBBD941DCB82FC73AAC45A8A94C9F2BD3477F61FD3B796F02A1B8264A214C6FEA74B7051B226C722099EC7883A462B83B6AFDD4009248B8A237F605FE5A08FE7D8B45321421EBBA67BD70A0B00DDBF94BAAB7F359D5D1EEA105F28DCFB Out = 6B14336AEA148FCF74C6EF17FA36264DCA5CC116AD6D6A9254E329248684BC7CCE81E4AD67D334D668805B9E6298B7C886CBB06C028FBA6A0B075B71A40455B0 In = E4D1C1897A0A866CE564635B74222F9696BF2C7F640DD78D7E2ACA66E1B61C642BB03EA7536AAE597811E9BF4A7B453EDE31F97B46A5F0EF51A071A2B3918DF16B152519AE3776F9F1EDAB4C2A377C3292E96408359D3613844D5EB393000283D5AD3401A318B12FD1474B8612F2BB50FB6A8B9E023A54D7DDE28C43D6D8854C8D9D1155935C199811DBFC87E9E0072E90EB88681CC7529714F8FB8A2C9D88567ADFB974EE205A9BF7B848 Out = 2BB8562945A3CEA1384A4C7E1471614B9FA6BC79BDAC7595B3CAC498F624D9D1CCBE08239AE30B7547C1BBA549371A85C8F7BBC7910FE55D7A5F92A6A39DA8E3 In = B10C59723E3DCADD6D75DF87D0A1580E73133A9B7D00CB95EC19F5547027323BE75158B11F80B6E142C6A78531886D9047B08E551E75E6261E79785366D7024BD7CD9CF322D9BE7D57FB661069F2481C7BB759CD71B4B36CA2BC2DF6D3A328FAEBDB995A9794A8D72155ED551A1F87C80BF6059B43FC764900B18A1C2441F7487743CF84E565F61F8DD2ECE6B6CCC9444049197AAAF53E926FBEE3BFCA8BE588EC77F29D211BE89DE18B15F6 Out = 19AF9ADD1D377D23E11E55EA8A39A79B5553809868F9AB79E177CCD912657CDDD7E02853CF25A315F22264C93136BED99A42B098397BCAF1DBBF876863F988DC In = DB11F609BABA7B0CA634926B1DD539C8CBADA24967D7ADD4D9876F77C2D80C0F4DCEFBD7121548373582705CCA2495BD2A43716FE64ED26D059CFB566B3364BD49EE0717BDD9810DD14D8FAD80DBBDC4CAFB37CC60FB0FE2A80FB4541B8CA9D59DCE457738A9D3D8F641AF8C3FD6DA162DC16FC01AAC527A4A0255B4D231C0BE50F44F0DB0B713AF03D968FE7F0F61ED0824C55C4B5265548FEBD6AAD5C5EEDF63EFE793489C39B8FD29D104CE Out = 662E04B018416B89E6977558B11772DD7A7450FBAD3B47810E54C30F077A7D374AFA18753C39101B73DF363DADDCC5C2333CBC39AD73165A1A8EC0E8ECD26E37 In = BEBD4F1A84FC8B15E4452A54BD02D69E304B7F32616AADD90537937106AE4E28DE9D8AAB02D19BC3E2FDE1D651559E296453E4DBA94370A14DBBB2D1D4E2022302EE90E208321EFCD8528AD89E46DC839EA9DF618EA8394A6BFF308E7726BAE0C19BCD4BE52DA6258E2EF4E96AA21244429F49EF5CB486D7FF35CAC1BACB7E95711944BCCB2AB34700D42D1EB38B5D536B947348A458EDE3DC6BD6EC547B1B0CAE5B257BE36A7124E1060C170FFA Out = A9E7AD88B63FAE09049E4AEDBD23E5219CBF5DB4695EC3F2C1167C6A7970C9E231131EC76FB19657BB35445981CC085831390C9D756928B865C2156B072246F6 In = 5ACA56A03A13784BDC3289D9364F79E2A85C12276B49B92DB0ADAA4F206D5028F213F678C3510E111F9DC4C1C1F8B6ACB17A6413AA227607C515C62A733817BA5E762CC6748E7E0D6872C984D723C9BB3B117EB8963185300A80BFA65CDE495D70A46C44858605FCCBED086C2B45CEF963D33294DBE9706B13AF22F1B7C4CD5A001CFEC251FBA18E722C6E1C4B1166918B4F6F48A98B64B3C07FC86A6B17A6D0480AB79D4E6415B520F1C484D675B1 Out = 76E5180B485838BE4EED6F329A25088EF8360475763145DA0868F813C7D16E2FBD2DAC307C6F94990687410B478679DC31C1A5AFB7A5F056B818B7340DD43E9C In = A5AAD0E4646A32C85CFCAC73F02FC5300F1982FABB2F2179E28303E447854094CDFC854310E5C0F60993CEFF54D84D6B46323D930ADB07C17599B35B505F09E784BCA5985E0172257797FB53649E2E9723EFD16865C31B5C3D5113B58BB0BFC8920FABDDA086D7537E66D709D050BD14D0C960873F156FAD5B3D3840CDFCDC9BE6AF519DB262A27F40896AB25CC39F96984D650611C0D5A3080D5B3A1BF186ABD42956588B3B58CD948970D298776060 Out = 913C9FD00D3ABF9F66DF204D7D2C08868640F4999EBAC116E300937D4CAAA63A4AC736089E23E5255485387605418329069A0867370805F3B5372241D8C2933A In = 06CBBE67E94A978203EAD6C057A1A5B098478B4B4CBEF5A97E93C8E42F5572713575FC2A884531D7622F8F879387A859A80F10EF02708CD8F7413AB385AFC357678B9578C0EBF641EF076A1A30F1F75379E9DCB2A885BDD295905EE80C0168A62A9597D10CF12DD2D8CEE46645C7E5A141F6E0E23AA482ABE5661C16E69EF1E28371E2E236C359BA4E92C25626A7B7FF13F6EA4AE906E1CFE163E91719B1F750A96CBDE5FBC953D9E576CD216AFC90323A Out = 847AAD7AA005EE45CA8D68953F2790BCFC51E52D7DB650D77CB8560D8A7C25F20F56959F965677645360F7CC86354ED79876F71D78FA2DE734BA28323A76E2E9 In = F1C528CF7739874707D4D8AD5B98F7C77169DE0B57188DF233B2DC8A5B31EDA5DB4291DD9F68E6BAD37B8D7F6C9C0044B3BF74BBC3D7D1798E138709B0D75E7C593D3CCCDC1B20C7174B4E692ADD820ACE262D45CCFAE2077E878796347168060A162ECCA8C38C1A88350BD63BB539134F700FD4ADDD5959E255337DAA06BC86358FABCBEFDFB5BC889783D843C08AADC6C4F6C36F65F156E851C9A0F917E4A367B5AD93D874812A1DE6A7B93CD53AD97232 Out = F5DD8A5B24B8F34F43D52F256EA4880AFE6EFB182D550D3A62D77670F1E84D97D6D88B2492777BC74D6065448DBDAE16B5ED054D86A29B82CAE61943C2112746 In = 9D9F3A7ECD51B41F6572FD0D0881E30390DFB780991DAE7DB3B47619134718E6F987810E542619DFAA7B505C76B7350C6432D8BF1CFEBDF1069B90A35F0D04CBDF130B0DFC7875F4A4E62CDB8E525AADD7CE842520A482AC18F09442D78305FE85A74E39E760A4837482ED2F437DD13B2EC1042AFCF9DECDC3E877E50FF4106AD10A525230D11920324A81094DA31DEAB6476AA42F20C84843CFC1C58545EE80352BDD3740DD6A16792AE2D86F11641BB717C2 Out = 6B7CDD664CFD5F4D13DB3A1CAF9F8847C72B8D73C8524AF2DED9A74C1C9B6844DD4C50D6D5CCAB6C0EDB18E7A30415F244AF371EA046C06ABD6B82653B79B717 In = 5179888724819FBAD3AFA927D3577796660E6A81C52D98E9303261D5A4A83232F6F758934D50AA83FF9E20A5926DFEBAAC49529D006EB923C5AE5048ED544EC471ED7191EDF46363383824F915769B3E688094C682B02151E5EE01E510B431C8865AFF8B6B6F2F59CB6D129DA79E97C6D2B8FA6C6DA3F603199D2D1BCAB547682A81CD6CF65F6551121391D78BCC23B5BD0E922EC6D8BF97C952E84DD28AEF909ABA31EDB903B28FBFC33B7703CD996215A11238 Out = CA8C2C59A7CFE208F6642EDF1404E558773E5E7925793CB7E266CFC23DC581633FD197228BF4B5F6D6EEEC1788BE7F304D915E8E52A66C143B816591D4BE7058 In = 576EF3520D30B7A4899B8C0D5E359E45C5189ADD100E43BE429A02FB3DE5FF4F8FD0E79D9663ACCA72CD29C94582B19292A557C5B1315297D168FBB54E9E2ECD13809C2B5FCE998EDC6570545E1499DBE7FB74D47CD7F35823B212B05BF3F5A79CAA34224FDD670D335FCB106F5D92C3946F44D3AFCBAE2E41AC554D8E6759F332B76BE89A0324AA12C5482D1EA3EE89DED4936F3E3C080436F539FA137E74C6D3389BDF5A45074C47BC7B20B0948407A66D855E2F Out = 777F0FA0DD1CA6AACE4C4B8AAED1205B843ACFE729892208E52444D865D4F0EAC297041A936CE940B64B770F43944AD990F31AB2E921E0E77C846A8CDCCD0DF4 In = 0DF2152FA4F4357C8741529DD77E783925D3D76E95BAFA2B542A2C33F3D1D117D159CF473F82310356FEE4C90A9E505E70F8F24859656368BA09381FA245EB6C3D763F3093F0C89B972E66B53D59406D9F01AEA07F8B3B615CAC4EE4D05F542E7D0DAB45D67CCCCD3A606CCBEB31EA1FA7005BA07176E60DAB7D78F6810EF086F42F08E595F0EC217372B98970CC6321576D92CE38F7C397A403BADA1548D205C343AC09DECA86325373C3B76D9F32028FEA8EB32515 Out = 9ADF9DD8AD75BA78D42C9E5A99F980EF4E3FFE0F96A606FB738A6EBB4030CEF4BCCA674E67689170CEF3B68A7F2B2CCA7092CFD7CEF62EAAA0905DD9EE46DF5D In = 3E15350D87D6EBB5C8AD99D42515CFE17980933C7A8F6B8BBBF0A63728CEFAAD2052623C0BD5931839112A48633FB3C2004E0749C87A41B26A8B48945539D1FF41A4B269462FD199BFECD45374756F55A9116E92093AC99451AEFB2AF9FD32D6D7F5FBC7F7A540D5097C096EBC3B3A721541DE073A1CC02F7FB0FB1B9327FB0B1218CA49C9487AB5396622A13AE546C97ABDEF6B56380DDA7012A8384091B6656D0AB272D363CEA78163FF765CDD13AB1738B940D16CAE Out = 71DE400D939E8254D60533184A354622E9D5A5D05A601D554718AA73F8BECCDF21ACD9265ED8652836F82AF9977217FDFA02713FF5558D661D02A39DF05A1ECB In = C38D6B0B757CB552BE40940ECE0009EF3B0B59307C1451686F1A22702922800D58BCE7A636C1727EE547C01B214779E898FC0E560F8AE7F61BEF4D75EAA696B921FD6B735D171535E9EDD267C192B99880C87997711002009095D8A7A437E258104A41A505E5EF71E5613DDD2008195F0C574E6BA3FE40099CFA116E5F1A2FA8A6DA04BADCB4E2D5D0DE31FDC4800891C45781A0AAC7C907B56D631FCA5CE8B2CDE620D11D1777ED9FA603541DE794DDC5758FCD5FAD78C0 Out = 052CAC93F83F78046B26E411E32185296F87879CC73B58F0C2B32A94582C3355A52B3CC65B680F1277F78B7792BF07BFEFBBF5060EEFB78807760B8DE9A0837C In = 8D2DE3F0B37A6385C90739805B170057F091CD0C7A0BC951540F26A5A75B3E694631BB64C7635EED316F51318E9D8DE13C70A2ABA04A14836855F35E480528B776D0A1E8A23B547C8B8D6A0D09B241D3BE9377160CCA4E6793D00A515DC2992CB7FC741DACA171431DA99CCE6F7789F129E2AC5CF65B40D703035CD2185BB936C82002DAF8CBC27A7A9E554B06196630446A6F0A14BA155ED26D95BD627B7205C072D02B60DB0FD7E49EA058C2E0BA202DAFF0DE91E845CF79 Out = 80CE5C83D94450857A0A513BEF37B4D0760469A66267B72EA264305DA3B3659796CF01F0569397F4C8D3127DE708A2C0C2C6E3C0F53BB0C01D11CF6B68DA820C In = C464BBDAD275C50DCD983B65AD1019B9FF85A1E71C807F3204BB2C921DC31FBCD8C5FC45868AE9EF85B6C9B83BBA2A5A822201ED68586EC5EC27FB2857A5D1A2D09D09115F22DCC39FE61F5E1BA0FF6E8B4ACB4C6DA748BE7F3F0839739394FF7FA8E39F7F7E84A33C3866875C01BCB1263C9405D91908E9E0B50E7459FABB63D8C6BBB73D8E3483C099B55BC30FF092FF68B6ADEDFD477D63570C9F5515847F36E24BA0B705557130CEC57EBAD1D0B31A378E91894EE26E3A04 Out = 576E8CBC0C416DA1617867681C8C3210BF1B43B3FA125CF90176AC2EC48B0F62B23227A08AD8D79F447DE80546342D98D1370D5C806D1D42069C8A6E381DED0C In = 8B8D68BB8A75732FE272815A68A1C9C5AA31B41DEDC8493E76525D1D013D33CEBD9E21A5BB95DB2616976A8C07FCF411F5F6BC6F7E0B57ACA78CC2790A6F9B898858AC9C79B165FF24E66677531E39F572BE5D81EB3264524181115F32780257BFB9AEEC6AF12AF28E587CAC068A1A2953B59AD680F4C245B2E3EC36F59940D37E1D3DB38E13EDB29B5C0F404F6FF87F80FC8BE7A225FF22FBB9C8B6B1D7330C57840D24BC75B06B80D30DAD6806544D510AF6C4785E823AC3E0B8 Out = BACFD238DCB9E69C42BB3B53B0F8D64FC6D163411D1C483421C28CC7B738D1F0F87D314C0FA7573648D27D05D38A1F7E658839EF398C8972E8FF3E8C91B5DC62 In = 6B018710446F368E7421F1BC0CCF562D9C1843846BC8D98D1C9BF7D9D6FCB48BFC3BF83B36D44C4FA93430AF75CD190BDE36A7F92F867F58A803900DF8018150384D85D82132F123006AC2AEBA58E02A037FE6AFBD65ECA7C44977DD3DC74F48B6E7A1BFD5CC4DCF24E4D52E92BD4455848E4928B0EAC8B7476FE3CC03E862AA4DFF4470DBFED6DE48E410F25096487ECFC32A27277F3F5023B2725ADE461B1355889554A8836C9CF53BD767F5737D55184EEA1AB3F53EDD0976C485 Out = 202C0B54FA9BBB1F22C23DBA786ACC1B658C3012C9FA8925CA8DF190B99B5940A961B9E70F044186CE45F1D65372D1B0E642A43FAF7D033DE5733403030143C6 In = C9534A24714BD4BE37C88A3DA1082EDA7CABD154C309D7BD670DCCD95AA535594463058A29F79031D6ECAA9F675D1211E9359BE82669A79C855EA8D89DD38C2C761DDD0EC0CE9E97597432E9A1BEAE062CDD71EDFDFD464119BE9E69D18A7A7FD7CE0E2106F0C8B0ABF4715E2CA48EF9F454DC203C96656653B727083513F8EFB86E49C513BB758B3B052FE21F1C05BB33C37129D6CC81F1AEF6ADC45B0E8827A830FE545CF57D0955802C117D23CCB55EA28F95C0D8C2F9C5A242B33F Out = 42493BFCF21054AD1CD1C92CF92EE60D23588AFC1E362A8241C9C13E23603757FC3FC0098B467876CBFDDFAEC0EC586BB3E7BADD1FD934917A073CFF153A828E In = 07906C87297B867ABF4576E9F3CC7F82F22B154AFCBF293B9319F1B0584DA6A40C27B32E0B1B7F412C4F1B82480E70A9235B12EC27090A5A33175A2BB28D8ADC475CEFE33F7803F8CE27967217381F02E67A3B4F84A71F1C5228E0C2AD971373F6F672624FCEA8D1A9F85170FAD30FA0BBD25035C3B41A6175D467998BD1215F6F3866F53847F9CF68EF3E2FBB54BC994DE2302B829C5EEA68EC441FCBAFD7D16AE4FE9FFF98BF00E5BC2AD54DD91FF9FDA4DD77B6C754A91955D1FBAAD0 Out = 3F7F95E06980F15CEDB62B4949479D673917591F07645CCB69BF6EF188463DAD76FEE3C9F6BB87139153B178776653F9A42BE67978361456A5E36FF80079A4DF In = 588E94B9054ABC2189DF69B8BA34341B77CDD528E7860E5DEFCAA79B0C9A452AD4B82AA306BE84536EB7CEDCBE058D7B84A6AEF826B028B8A0271B69AC3605A9635EA9F5EA0AA700F3EB7835BC54611B922964300C953EFE7491E3677C2CEBE0822E956CD16433B02C68C4A23252C3F9E151A416B4963257B783E038F6B4D5C9F110F871652C7A649A7BCEDCBCCC6F2D0725BB903CC196BA76C76AA9F10A190B1D1168993BAA9FFC96A1655216773458BEC72B0E39C9F2C121378FEAB4E76A Out = 47852B6535F9B21407D93ACDC448370C963E3B927EE561354611DA1A9863425CCAE5EF32C6D29FE2F46975D11F86099D2A9F785549348FF1554C5F9EF8FF1878 In = 08959A7E4BAAE874928813364071194E2939772F20DB7C3157078987C557C2A6D5ABE68D520EEF3DC491692E1E21BCD880ADEBF63BB4213B50897FA005256ED41B5690F78F52855C8D9168A4B666FCE2DA2B456D7A7E7C17AB5F2FB1EE90B79E698712E963715983FD07641AE4B4E9DC73203FAC1AE11FA1F8C7941FCC82EAB247ADDB56E2638447E9D609E610B60CE086656AAEBF1DA3C8A231D7D94E2FD0AFE46B391FF14A72EAEB3F44AD4DF85866DEF43D4781A0B3578BC996C87970B132 Out = AEFB3FB01D5A5566117841B70ED2ECA0CE6E4A7D453AE8A11D9E39DFAF25753BB53EF1D9C388AB6238975616B64DFDD88B3DF97397FD671930B4D28F33CB3931 In = CB2A234F45E2ECD5863895A451D389A369AAB99CFEF0D5C9FFCA1E6E63F763B5C14FB9B478313C8E8C0EFEB3AC9500CF5FD93791B789E67EAC12FD038E2547CC8E0FC9DB591F33A1E4907C64A922DDA23EC9827310B306098554A4A78F050262DB5B545B159E1FF1DCA6EB734B872343B842C57EAFCFDA8405EEDBB48EF32E99696D135979235C3A05364E371C2D76F1902F1D83146DF9495C0A6C57D7BF9EE77E80F9787AEE27BE1FE126CDC9EF893A4A7DCBBC367E40FE4E1EE90B42EA25AF01 Out = D41356634CF634D78315C18351F0C132C854C768B2192A0475388414D46AE3A11BE790FF0D286030E58D2F8B7F0730EFAD51EED135F9F67764FD4E1D78FC4FC6 In = D16BEADF02AB1D4DC6F88B8C4554C51E866DF830B89C06E786A5F8757E8909310AF51C840EFE8D20B35331F4355D80F73295974653DDD620CDDE4730FB6C8D0D2DCB2B45D92D4FBDB567C0A3E86BD1A8A795AF26FBF29FC6C65941CDDB090FF7CD230AC5268AB4606FCCBA9EDED0A2B5D014EE0C34F0B2881AC036E24E151BE89EEB6CD9A7A790AFCCFF234D7CB11B99EBF58CD0C589F20BDAC4F9F0E28F75E3E04E5B3DEBCE607A496D848D67FA7B49132C71B878FD5557E082A18ECA1FBDA94D4B Out = 90E82FD6B8CAA4BBED1601832F022CD42EF5D2AA0C9C2646ACB1862A606C9BF65305CFBD8DC70DDCFAA0679BA6A374B9016895502C89966D42BBE538A941F40A In = 8F65F6BC59A85705016E2BAE7FE57980DE3127E5AB275F573D334F73F8603106EC3553016608EF2DD6E69B24BE0B7113BF6A760BA6E9CE1C48F9E186012CF96A1D4849D75DF5BB8315387FD78E9E153E76F8BA7EC6C8849810F59FB4BB9B004318210B37F1299526866F44059E017E22E96CBE418699D014C6EA01C9F0038B10299884DBEC3199BB05ADC94E955A1533219C1115FED0E5F21228B071F40DD57C4240D98D37B73E412FE0FA4703120D7C0C67972ED233E5DEB300A22605472FA3A3BA86 Out = DF68A8A39DCCD310EA7489D178B84E8AFB5410011EFFDB4AE044A0BA1932A79C1F8D20C20B7504AD1D76553D5AF3F18AB81FC095F98A97A95E61437B07B88204 In = 84891E52E0D451813210C3FD635B39A03A6B7A7317B221A7ABC270DFA946C42669AACBBBDF801E1584F330E28C729847EA14152BD637B3D0F2B38B4BD5BF9C791C58806281103A3EABBAEDE5E711E539E6A8B2CF297CF351C078B4FA8F7F35CF61BEBF8814BF248A01D41E86C5715EA40C63F7375379A7EB1D78F27622FB468AB784AAABA4E534A6DFD1DF6FA15511341E725ED2E87F98737CCB7B6A6DFAE416477472B046BF1811187D151BFA9F7B2BF9ACDB23A3BE507CDF14CFDF517D2CB5FB9E4AB6 Out = E70450F1439D6CAFDBBD6934CE8163769B2C5055FE1D4EC196AB093B2229849B3F58C8A74161FA0516C45AC406B1A73588CB6BA5DE24A9E792D35953C3F01780 In = FDD7A9433A3B4AFABD7A3A5E3457E56DEBF78E84B7A0B0CA0E8C6D53BD0C2DAE31B2700C6128334F43981BE3B213B1D7A118D59C7E6B6493A86F866A1635C12859CFB9AD17460A77B4522A5C1883C3D6ACC86E6162667EC414E9A104AA892053A2B1D72165A855BACD8FAF8034A5DD9B716F47A0818C09BB6BAF22AA503C06B4CA261F557761989D2AFBD88B6A678AD128AF68672107D0F1FC73C5CA740459297B3292B281E93BCEB761BDE7221C3A55708E5EC84472CDDCAA84ECF23723CC0991355C6280 Out = 5D4D81E795BE45C75C8F44D51A9F8762F0D0B6EDC49D1CBD14056876BCF10058D1B72C06C8790C10168F0F42B9C9C9829BC5224AB5E2031DE7464ECB74822CF4 In = 70A40BFBEF92277A1AAD72F6B79D0177197C4EBD432668CFEC05D099ACCB651062B5DFF156C0B27336687A94B26679CFDD9DAF7AD204338DD9C4D14114033A5C225BD11F217B5F4732DA167EE3F939262D4043FC9CBA92303B7B5E96AEA12ADDA64859DF4B86E9EE0B58E39091E6B188B408AC94E1294A8911245EE361E60E601EFF58D1D37639F3753BEC80EBB4EFDE25817436076623FC65415FE51D1B0280366D12C554D86743F3C3B6572E400361A60726131441BA493A83FBE9AFDA90F7AF1AE717238D Out = 5252EA0BF90D43E68D167411F3D171614C11B6830DDBA8AB20EA126F70AB89B120F4DB0BFC9E8A05D45B4DA7B884C7EEC51D4C079D021CEF9B02D8E856895573 In = 74356E449F4BF8644F77B14F4D67CB6BD9C1F5AE357621D5B8147E562B65C66585CAF2E491B48529A01A34D226D436959153815380D5689E30B35357CDAC6E08D3F2B0E88E200600D62BD9F5EAF488DF86A4470EA227006182E44809009868C4C280C43D7D64A5268FA719074960087B3A6ABC837882F882C837834535929389A12B2C78187E2EA07EF8B8EEF27DC85002C3AE35F1A50BEE6A1C48BA7E175F3316670B27983472AA6A61EED0A683A39EE323080620EA44A9F74411AE5CE99030528F9AB49C79F2 Out = 8A38DA71A86A3F26A211D1D0662E13B5A3DFD0E9F719489B814D38ED1675147791720ED349D754FA5A6B260F2736F66DB991C407664EB97FA6E936F08B9EF1F6 In = 8C3798E51BC68482D7337D3ABB75DC9FFE860714A9AD73551E120059860DDE24AB87327222B64CF774415A70F724CDF270DE3FE47DDA07B61C9EF2A3551F45A5584860248FABDE676E1CD75F6355AA3EAEABE3B51DC813D9FB2EAA4F0F1D9F834D7CAD9C7C695AE84B329385BC0BEF895B9F1EDF44A03D4B410CC23A79A6B62E4F346A5E8DD851C2857995DDBF5B2D717AEB847310E1F6A46AC3D26A7F9B44985AF656D2B7C9406E8A9E8F47DCB4EF6B83CAACF9AEFB6118BFCFF7E44BEF6937EBDDC89186839B77 Out = 74F8AF73F27D644BB937EBC0F58B8884A5F8C5C8BE34D26CF7D0EBBFE724663E121B36B64FD42B61132D424B185E4093E91E517EE7BD1E106D8F9E74B8057564 In = FA56BF730C4F8395875189C10C4FB251605757A8FECC31F9737E3C2503B02608E6731E85D7A38393C67DE516B85304824BFB135E33BF22B3A23B913BF6ACD2B7AB85198B8187B2BCD454D5E3318CACB32FD6261C31AE7F6C54EF6A7A2A4C9F3ECB81CE3555D4F0AD466DD4C108A90399D70041997C3B25345A9653F3C9A6711AB1B91D6A9D2216442DA2C973CBD685EE7643BFD77327A2F7AE9CB283620A08716DFB462E5C1D65432CA9D56A90E811443CD1ECB8F0DE179C9CB48BA4F6FEC360C66F252F6E64EDC96B Out = CFC4825ACA4ED0B0888647A6EBD37AC1EF1721806C35A462EFF091F14E3950A23E508F821E65EDC7FF8879E4D454E137429666342365CAC8087346D11356FFD2 In = B6134F9C3E91DD8000740D009DD806240811D51AB1546A974BCB18D344642BAA5CD5903AF84D58EC5BA17301D5EC0F10CCD0509CBB3FD3FFF9172D193AF0F782252FD1338C7244D40E0E42362275B22D01C4C3389F19DD69BDF958EBE28E31A4FFE2B5F18A87831CFB7095F58A87C9FA21DB72BA269379B2DC2384B3DA953C7925761FED324620ACEA435E52B424A7723F6A2357374157A34CD8252351C25A1B232826CEFE1BD3E70FFC15A31E7C0598219D7F00436294D11891B82497BC78AA5363892A2495DF8C1EEF Out = BB3566825AD58FD9D5AABE8B1E6C53F7F8E176F401EC327AD1455C20FE40B9A01012748DF19885F1660CA77D3FCE3A8D8F017E49CDE3F36BCD7BE3C776148B40 In = C941CDB9C28AB0A791F2E5C8E8BB52850626AA89205BEC3A7E22682313D198B1FA33FC7295381354858758AE6C8EC6FAC3245C6E454D16FA2F51C4166FAB51DF272858F2D603770C40987F64442D487AF49CD5C3991CE858EA2A60DAB6A65A34414965933973AC2457089E359160B7CDEDC42F29E10A91921785F6B7224EE0B349393CDCFF6151B50B377D609559923D0984CDA6000829B916AB6896693EF6A2199B3C22F7DC5500A15B8258420E314C222BC000BC4E5413E6DD82C993F8330F5C6D1BE4BC79F08A1A0A46 Out = 859D25E201724C1CD4F961A2CFFA4D2D860C465C4941930D3C77B84F799C09A4A53EE1194F9404161EBA23C869589D65183C4FA96ECD12CC9FCFCEF059F0B4A8 In = 4499EFFFAC4BCEA52747EFD1E4F20B73E48758BE915C88A1FFE5299B0B005837A46B2F20A9CB3C6E64A9E3C564A27C0F1C6AD1960373036EC5BFE1A8FC6A435C2185ED0F114C50E8B3E4C7ED96B06A036819C9463E864A58D6286F785E32A804443A56AF0B4DF6ABC57ED5C2B185DDEE8489EA080DEEEE66AA33C2E6DAB36251C402682B6824821F998C32163164298E1FAFD31BABBCFFB594C91888C6219079D907FDB438ED89529D6D96212FD55ABE20399DBEFD342248507436931CDEAD496EB6E4A80358ACC78647D043 Out = 38EE279BE412ED11553578F7980EF4E17898ACDBD774F5C98F9CBCEBA75E394DBC49357E9463E2EBECBAE687D344F9059445716D3B3AC044E41537DB00E9C12E In = EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D Out = 280F21678FD84E142CED7376105DF2B088144D246F1C4802D3AA550F7B04AFA2A226541255FAB2AD36B67D2CAE7AA42878464D3A4FE5945C820A1107073B8662 In = E64F3E4ACE5C8418D65FEC2BC5D2A303DD458034736E3B0DF719098BE7A206DEAF52D6BA82316CAF330EF852375188CDE2B39CC94AA449578A7E2A8E3F5A9D68E816B8D16889FBC0EBF0939D04F63033AE9AE2BDAB73B88C26D6BD25EE460EE1EF58FB0AFA92CC539F8C76D3D097E7A6A63EBB9B5887EDF3CF076028C5BBD5B9DB3211371AD3FE121D4E9BF44229F4E1ECF5A0F9F0EBA4D5CEB72878AB22C3F0EB5A625323AC66F7061F4A81FAC834471E0C59553F108475FE290D43E6A055AE3EE46FB67422F814A68C4BE3E8C9 Out = 986651FDBDF3A65911FB73D5BB132DE19F1060549E76811E05DC80AFC8012F77FA965A7FFA380163EAFAD2D495FA2F07CE7D7A7D4A94EEB0505B64F7C429F849 In = D2CB2D733033F9E91395312808383CC4F0CA974E87EC68400D52E96B3FA6984AC58D9AD0938DDE5A973008D818C49607D9DE2284E7618F1B8AED8372FBD52ED54557AF4220FAC09DFA8443011699B97D743F8F2B1AEF3537EBB45DCC9E13DFB438428EE190A4EFDB3CAEB7F3933117BF63ABDC7E57BEB4171C7E1AD260AB0587806C4D137B6316B50ABC9CCE0DFF3ACADA47BBB86BE777E617BBE578FF4519844DB360E0A96C6701290E76BB95D26F0F804C8A4F2717EAC4E7DE9F2CFF3BBC55A17E776C0D02856032A6CD10AD2838 Out = 53D548018056A72FE24AB630F7DC9C89DE4891D83260767A403CC2EA3F8921458EC7EA45FBFBF38C4083A4AAE3BADB5F5D0422EB9E525B7B8B4CD5BE0ACB758D In = F2998955613DD414CC111DF5CE30A995BB792E260B0E37A5B1D942FE90171A4AC2F66D4928D7AD377F4D0554CBF4C523D21F6E5F379D6F4B028CDCB9B1758D3B39663242FF3CB6EDE6A36A6F05DB3BC41E0D861B384B6DEC58BB096D0A422FD542DF175E1BE1571FB52AE66F2D86A2F6824A8CFAACBAC4A7492AD0433EEB15454AF8F312B3B2A577750E3EFBD370E8A8CAC1582581971FBA3BA4BD0D76E718DACF8433D33A59D287F8CC92234E7A271041B526E389EFB0E40B6A18B3AAF658E82ED1C78631FD23B4C3EB27C3FAEC8685 Out = 4C84E9B4DC2F3C60BAE0C3C11A0FD6D992567DC45695E5C8DAAAF5955F6DC91BDA8A1581A93462370C29212D7157588417CCEA1F9AE8CAD47635D1F837871869 In = 447797E2899B72A356BA55BF4DF3ACCA6CDB1041EB477BD1834A9F9ACBC340A294D729F2F97DF3A610BE0FF15EDB9C6D5DB41644B9874360140FC64F52AA03F0286C8A640670067A84E017926A70438DB1BB361DEFEE7317021425F8821DEF26D1EFD77FC853B818545D055ADC9284796E583C76E6FE74C9AC2587AA46AA8F8804F2FEB5836CC4B3ABABAB8429A5783E17D5999F32242EB59EF30CD7ADABC16D72DBDB097623047C98989F88D14EAF02A7212BE16EC2D07981AAA99949DDF89ECD90333A77BC4E1988A82ABF7C7CAF3291 Out = 140278E6BF4A3E62E5FFFE20034DCEDCF88AFD11FA9D3DFFA6EAC8BC1E82B8D22458E8623126E4DA646D1866218AA99140F110A1259A306132A4DD3292B5CADD In = 9F2C18ADE9B380C784E170FB763E9AA205F64303067EB1BCEA93DF5DAC4BF5A2E00B78195F808DF24FC76E26CB7BE31DC35F0844CDED1567BBA29858CFFC97FB29010331B01D6A3FB3159CC1B973D255DA9843E34A0A4061CABDB9ED37F241BFABB3C20D32743F4026B59A4CCC385A2301F83C0B0A190B0F2D01ACB8F0D41111E10F2F4E149379275599A52DC089B35FDD5234B0CFB7B6D8AEBD563CA1FA653C5C021DFD6F5920E6F18BFAFDBECBF0AB00281333ED50B9A999549C1C8F8C63D7626C48322E9791D5FF72294049BDE91E73F8 Out = 910CE76BE8C967718FD1E1EF7969E7A56F1354C06FABEDA892E07FBB659F936955E9AE9D75D5E3BBA81E8455B775BF4CEF2A4647E3C7C340F364A46F8857A72B In = AE159F3FA33619002AE6BCCE8CBBDD7D28E5ED9D61534595C4C9F43C402A9BB31F3B301CBFD4A43CE4C24CD5C9849CC6259ECA90E2A79E01FFBAC07BA0E147FA42676A1D668570E0396387B5BCD599E8E66AAED1B8A191C5A47547F61373021FA6DEADCB55363D233C24440F2C73DBB519F7C9FA5A8962EFD5F6252C0407F190DFEFAD707F3C7007D69FF36B8489A5B6B7C557E79DD4F50C06511F599F56C896B35C917B63BA35C6FF8092BAF7D1658E77FC95D8A6A43EEB4C01F33F03877F92774BE89C1114DD531C011E53A34DC248A2F0E6 Out = 8E120865B61ED74C25A3EA9805E286BFAAC7F75C37AB763C45E325E882E2B55D7FE2776A62C9DA46915DC27881990560648CC6DAC1226442ADAC95C4AB8CBE3B In = 3B8E97C5FFC2D6A40FA7DE7FCEFC90F3B12C940E7AB415321E29EE692DFAC799B009C99DCDDB708FCE5A178C5C35EE2B8617143EDC4C40B4D313661F49ABDD93CEA79D117518805496FE6ACF292C4C2A1F76B403A97D7C399DAF85B46AD84E16246C67D6836757BDE336C290D5D401E6C1386AB32797AF6BB251E9B2D8FE754C47482B72E0B394EAB76916126FD68EA7D65EB93D59F5B4C5AC40F7C3B37E7F3694F29424C24AF8C8F0EF59CD9DBF1D28E0E10F799A6F78CAD1D45B9DB3D7DEE4A7059ABE99182714983B9C9D44D7F5643596D4F3 Out = DD073E6362674B8D090C505B14BC4B110C086A655264B2D0E917C3BD2F5E43305E4B034AFCBD7ABD991C38946FA601FE11AF342B29C36E180B27081C37384765 In = 3434EC31B10FAFDBFEEC0DD6BD94E80F7BA9DCA19EF075F7EB017512AF66D6A4BCF7D16BA0819A1892A6372F9B35BCC7CA8155EE19E8428BC22D214856ED5FA9374C3C09BDE169602CC219679F65A1566FC7316F4CC3B631A18FB4449FA6AFA16A3DB2BC4212EFF539C67CF184680826535589C7111D73BFFCE431B4C40492E763D9279560AAA38EB2DC14A212D723F994A1FE656FF4DD14551CE4E7C621B2AA5604A10001B2878A897A28A08095C325E10A26D2FB1A75BFD64C250309BB55A44F23BBAC0D5516A1C687D3B41EF2FBBF9CC56D4739 Out = 2C1FF25C2128E3B59FC8CCC59D738523656A2A3A0C28F3BDA52C49243BAC3B42E26F8FC39DA0D864040DD08CA4F608ABAB45AFE38FC187882EB9BC3C46409D9A In = 7C7953D81C8D208FD1C97681D48F49DD003456DE60475B84070EF4847C333B74575B1FC8D2A186964485A3B8634FEAA3595AAA1A2F4595A7D6B6153563DEE31BBAC443C8A33EED6D5D956A980A68366C2527B550EE950250DFB691EACBD5D56AE14B970668BE174C89DF2FEA43AE52F13142639C884FD62A3683C0C3792F0F24AB1318BCB27E21F4737FAB62C77EA38BC8FD1CF41F7DAB64C13FEBE7152BF5BB7AB5A78F5346D43CC741CB6F72B7B8980F268B68BF62ABDFB1577A52438FE14B591498CC95F071228460C7C5D5CEB4A7BDE588E7F21C Out = 805746E78C228C7A99B1FBAE93BBF4C1F81DBF14C3EF7DBF70E9FA1FB5E611C5328E0A374FB2CA67A95161D5BF3F2D6C12C8A90E1CD4AF6ABBD00E37775D524D In = 7A6A4F4FDC59A1D223381AE5AF498D74B7252ECF59E389E49130C7EAEE626E7BD9897EFFD92017F4CCDE66B0440462CDEDFD352D8153E6A4C8D7A0812F701CC737B5178C2556F07111200EB627DBC299CAA792DFA58F35935299FA3A3519E9B03166DFFA159103FFA35E8577F7C0A86C6B46FE13DB8E2CDD9DCFBA85BDDDCCE0A7A8E155F81F712D8E9FE646153D3D22C811BD39F830433B2213DD46301941B59293FD0A33E2B63ADBD95239BC01315C46FDB678875B3C81E053A40F581CFBEC24A1404B1671A1B88A6D06120229518FB13A74CA0AC5AE Out = C2E4138CF6D5DF8997649C4324E06451218F575730C6ADE1825067587022EA3220A7F049C412F42FA5A73313956165525FD3D3A753DCDCCAE1D29524043F2BE4 In = D9FAA14CEBE9B7DE551B6C0765409A33938562013B5E8E0E1E0A6418DF7399D0A6A771FB81C3CA9BD3BB8E2951B0BC792525A294EBD1083688806FE5E7F1E17FD4E3A41D00C89E8FCF4A363CAEDB1ACB558E3D562F1302B3D83BB886ED27B76033798131DAB05B4217381EAAA7BA15EC820BB5C13B516DD640EAEC5A27D05FDFCA0F35B3A5312146806B4C0275BCD0AAA3B2017F346975DB566F9B4D137F4EE10644C2A2DA66DEECA5342E236495C3C6280528BFD32E90AF4CD9BB908F34012B52B4BC56D48CC8A6B59BAB014988EABD12E1A0A1C2E170E7 Out = 7BB7AA3C574F6CF20740B77C4F349D405D815A949AB74EB4439638C9521694A448CEE4729A1B88C5C6230EE0A6388D1A7BA8E909A990145AEC951996462E62D7 In = 2D8427433D0C61F2D96CFE80CF1E932265A191365C3B61AAA3D6DCC039F6BA2AD52A6A8CC30FC10F705E6B7705105977FA496C1C708A277A124304F1FC40911E7441D1B5E77B951AAD7B01FD5DB1B377D165B05BBF898042E39660CAF8B279FE5229D1A8DB86C0999ED65E53D01CCBC4B43173CCF992B3A14586F6BA42F5FE30AFA8AE40C5DF29966F9346DA5F8B35F16A1DE3AB6DE0F477D8D8660918060E88B9B9E9CA6A4207033B87A812DBF5544D39E4882010F82B6CE005F8E8FF6FE3C3806BC2B73C2B83AFB704345629304F9F86358712E9FAE3CA3E Out = 32761245645A67ADEF404906F3E29233A1C09B98785A38D6F02477F90D242C5BE71A4F9FE272E5A2C7AC644D245167A06D8162F01880DAD6684A8C7E27044A7D In = 5E19D97887FCAAC0387E22C6F803C34A3DACD2604172433F7A8A7A526CA4A2A1271ECFC5D5D7BE5AC0D85D921095350DFC65997D443C21C8094E0A3FEFD2961BCB94AED03291AE310CCDA75D8ACE4BC7D89E7D3E5D1650BDA5D668B8B50BFC8E608E184F4D3A9A2BADC4FF5F07E0C0BC8A9F2E0B2A26FD6D8C550008FAAAB75FD71AF2A424BEC9A7CD9D83FAD4C8E9319115656A8717D3B523A68FF8004258B9990ED362308461804BA3E3A7E92D8F2FFAE5C2FBA55BA5A3C27C0A2F71BD711D2FE1799C2ADB31B200035481E9EE5C4ADF2AB9C0FA50B23975CF Out = 72C59B8CAF93E65FF374BB129F7221B30DAE35205C3455D4D268657C6D27926C940096D004737DAF4306F321C840E402D35BE5DAE71CF48FF64F424A3CECF62D In = C8E976AB4638909387CE3B8D4E510C3230E5690E02C45093B1D297910ABC481E56EEA0F296F98379DFC9080AF69E73B2399D1C143BEE80AE1328162CE1BA7F6A8374679B20AACD380EB4E61382C99998704D62701AFA914F9A2705CDB065885F50D086C3EB5753700C387118BB142F3E6DA1E988DFB31AC75D7368931E45D1391A274B22F83CEB072F9BCABC0B216685BFD789F5023971024B1878A205442522F9EA7D8797A4102A3DF41703768251FD5E017C85D1200A464118AA35654E7CA39F3C375B8EF8CBE7534DBC64BC20BEFB417CF60EC92F63D9EE7397 Out = 77867FCE5437F2BBB52ACCB44140DF9D235023333031DDA334525DCC9178877F96B0216D007F5E3718E55E233E43C146A6942FAC5D815A892EB53F4BFEFFE17B In = 7145FA124B7429A1FC2231237A949BA7201BCC1822D3272DE005B682398196C25F7E5CC2F289FBF44415F699CB7FE6757791B1443410234AE061EDF623359E2B4E32C19BF88450432DD01CAA5EB16A1DC378F391CA5E3C4E5F356728BDDD4975DB7C890DA8BBC84CC73FF244394D0D48954978765E4A00B593F70F2CA082673A261ED88DBCEF1127728D8CD89BC2C597E9102CED6010F65FA75A14EBE467FA57CE3BD4948B6867D74A9DF5C0EC6F530CBF2EE61CE6F06BC8F2864DFF5583776B31DF8C7FFCB61428A56BF7BD37188B4A5123BBF338393AF46EDA85E6 Out = 37F2BF50D2E8757DAC08977B2882BAF7CD98E54FE12C57F9A5ADDC9EE5A77F8CDA29864F70179A4CF473CC505C1E25837443B94CE4FA817101BFDE224B5DF107 In = 7FDFADCC9D29BAD23AE038C6C65CDA1AEF757221B8872ED3D75FF8DF7DA0627D266E224E812C39F7983E4558BFD0A1F2BEF3FEB56BA09120EF762917B9C093867948547AEE98600D10D87B20106878A8D22C64378BF634F7F75900C03986B077B0BF8B740A82447B61B99FEE5376C5EB6680EC9E3088F0BDD0C56883413D60C1357D3C811950E5890E7600103C916341B80C743C6A852B7B4FB60C3BA21F3BC15B8382437A68454779CF3CD7F9F90CCC8EF28D0B706535B1E4108EB5627BB45D719CB046839AEE311CA1ABDC8319E050D67972CB35A6B1601B25DBF487 Out = ACB477957256D5E134873B0A4F804A2A492A72468EAEFE80F0DE23DD55862FB7CE5AEB58FE9E1FCEC12BFA7ED92D5E19D89075D11860315445250735811499E3 In = 988638219FD3095421F826F56E4F09E356296B628C3CE6930C9F2E758FD1A80C8273F2F61E4DAAE65C4F110D3E7CA0965AC7D24E34C0DC4BA2D6FF0BF5BBE93B3585F354D7543CB542A1AA54674D375077F2D360A8F4D42F3DB131C3B7AB7306267BA107659864A90C8C909460A73621D1F5D9D3FD95BEB19B23DB1CB6C0D0FBA91D36891529B8BD8263CAA1BAB56A4AFFAED44962DF096D8D5B1EB845EF31188B3E10F1AF811A13F156BEB7A288AAE593EBD1471B624AA1A7C6ADF01E2200B3D72D88A3AED3100C88231E41EFC376906F0B580DC895F080FDA5741DB1CB Out = F5178B231491395B863F570B96268B27A403502CF228173A94989E13B78615E7A07087ED7422696C295A2D25B4C075ED5CBFB3765F67F60047014F4554DC5103 In = 5AAB62756D307A669D146ABA988D9074C5A159B3DE85151A819B117CA1FF6597F6156E80FDD28C9C3176835164D37DA7DA11D94E09ADD770B68A6E081CD22CA0C004BFE7CD283BF43A588DA91F509B27A6584C474A4A2F3EE0F1F56447379240A5AB1FB77FDCA49B305F07BA86B62756FB9EFB4FC225C86845F026EA542076B91A0BC2CDD136E122C659BE259D98E5841DF4C2F60330D4D8CDEE7BF1A0A244524EECC68FF2AEF5BF0069C9E87A11C6E519DE1A4062A10C83837388F7EF58598A3846F49D499682B683C4A062B421594FAFBC1383C943BA83BDEF515EFCF10D Out = 60A65939E7472F42AB9D9FEF54DA531C9576BF1F740E62E04FEABC96D67C744C461A0EF4AB4C90BFB0C42F2A7724006218DA38D1BDF0DDEE536A11D2C0B2A6B7 In = 47B8216AA0FBB5D67966F2E82C17C07AA2D6327E96FCD83E3DE7333689F3EE79994A1BF45082C4D725ED8D41205CB5BCDF5C341F77FACB1DA46A5B9B2CBC49EADF786BCD881F371A95FA17DF73F606519AEA0FF79D5A11427B98EE7F13A5C00637E2854134691059839121FEA9ABE2CD1BCBBBF27C74CAF3678E05BFB1C949897EA01F56FFA4DAFBE8644611685C617A3206C7A7036E4AC816799F693DAFE7F19F303CE4EBA09D21E03610201BFC665B72400A547A1E00FA9B7AD8D84F84B34AEF118515E74DEF11B9188BD1E1F97D9A12C30132EC2806339BDADACDA2FD8B78 Out = B0B2699CD59779EE8903B952410B43E607DE0514FB5D9722233FA363F686E5C0F02F2F4866B850F3294B9172FBBC5D6BE0407FCDA88A70BF62634F1246B7B48B In = 8CFF1F67FE53C098896D9136389BD8881816CCAB34862BB67A656E3D98896F3CE6FFD4DA73975809FCDF9666760D6E561C55238B205D8049C1CEDEEF374D1735DAA533147BFA960B2CCE4A4F254176BB4D1BD1E89654432B8DBE1A135C42115B394B024856A2A83DC85D6782BE4B444239567CCEC4B184D4548EAE3FF6A192F343292BA2E32A0F267F31CC26719EB85245D415FB897AC2DA433EE91A99424C9D7F1766A44171D1651001C38FC79294ACCC68CEB5665D36218454D3BA169AE058A831338C17743603F81EE173BFC0927464F9BD728DEE94C6AEAB7AAE6EE3A627E8 Out = FA3D438287356A9FF72904A3A7E4E143F3DEDF0104F8EA1A8851DBF401F5F767511AB18C629AAB16B0FC7F42F96AF244CF797713F3A2936E78C435E01E09A599 In = EACD07971CFF9B9939903F8C1D8CBB5D4DB1B548A85D04E037514A583604E787F32992BF2111B97AC5E8A938233552731321522AB5E8583561260B7D13EBEEF785B23A41FD8576A6DA764A8ED6D822D4957A545D5244756C18AA80E1AAD4D1F9C20D259DEE1711E2CC8FD013169FB7CC4CE38B362F8E0936AE9198B7E838DCEA4F7A5B9429BB3F6BBCF2DC92565E3676C1C5E6EB3DD2A0F86AA23EDD3D0891F197447692794B3DFA269611AD97F72B795602B4FDB198F3FD3EB41B415064256E345E8D8C51C555DC8A21904A9B0F1AD0EFFAB7786AAC2DA3B196507E9F33CA356427 Out = 1527F8E417B736AADAECFD3331B56E0E2AD7DED6E621AAC34A5289C77D0228370025D42D065F2141E8513C841EF6B7222D2B138F3B236500D92D782D30AA0C7F In = 23AC4E9A42C6EF45C3336CE6DFC2FF7DE8884CD23DC912FEF0F7756C09D335C189F3AD3A23697ABDA851A81881A0C8CCAFC980AB2C702564C2BE15FE4C4B9F10DFB2248D0D0CB2E2887FD4598A1D4ACDA897944A2FFC580FF92719C95CF2AA42DC584674CB5A9BC5765B9D6DDF5789791D15F8DD925AA12BFFAFBCE60827B490BB7DF3DDA6F2A143C8BF96ABC903D83D59A791E2D62814A89B8080A28060568CF24A80AE61179FE84E0FFAD00388178CB6A617D37EFD54CC01970A4A41D1A8D3DDCE46EDBBA4AB7C90AD565398D376F431189CE8C1C33E132FEAE6A8CD17A61C630012 Out = 4288CE417AC9BFBD79624FF3B6D372B27291BC41038F7D27658052ED9BFAC9505593D7D7FF87620E43DDAFC9D3152DDE7BB572A035BA4AF6D6163DEDEF761981 In = 0172DF732282C9D488669C358E3492260CBE91C95CFBC1E3FEA6C4B0EC129B45F242ACE09F152FC6234E1BEE8AAB8CD56E8B486E1DCBA9C05407C2F95DA8D8F1C0AF78EE2ED82A3A79EC0CB0709396EE62AADB84F8A4EE8A7CCCA3C1EE84E302A09EA802204AFECF04097E67D0F8E8A9D2651126C0A598A37081E42D168B0AE8A71951C524259E4E2054E535B779679BDADE566FE55700858618E626B4A0FAF895BCCE9011504A49E05FD56127EAE3D1F8917AFB548ECADABDA1020111FEC9314C413498A360B08640549A22CB23C731ACE743252A8227A0D2689D4C6001606678DFB921 Out = 70EB09D44B47385081714872B8F37C5E10DBCB3173C752DEBAB0FE9E7FA2EA33888696A85C30B3703B149A48BC08C9D0DC5C2D4CE2D50270B6BCFB38BDB2D738 In = 3875B9240CF3E0A8B59C658540F26A701CF188496E2C2174788B126FD29402D6A75453BA0635284D08835F40051A2A9683DC92AFB9383719191231170379BA6F4ADC816FECBB0F9C446B785BF520796841E58878B73C58D3EBB097CE4761FDEABE15DE2F319DFBAF1742CDEB389559C788131A6793E193856661376C81CE9568DA19AA6925B47FFD77A43C7A0E758C37D69254909FF0FBD415EF8EB937BCD49F91468B49974C07DC819ABD67395DB0E05874FF83DDDAB895344ABD0E7111B2DF9E58D76D85AD98106B36295826BE04D435615595605E4B4BB824B33C4AFEB5E7BB0D19F909 Out = B8D59524A0B510ADF31C2BE3C28D9BBFDE3522425D7CC5E9985DB21ADEF17A392683D0D9865BEAE4FE52E59212C3DF4026DF0D507BFD31796BA235C34FDF6EB4 In = 747CC1A59FEFBA94A9C75BA866C30DC5C1CB0C0F8E9361D98484956DD5D1A40F6184AFBE3DAC9F76028D1CAECCFBF69199C6CE2B4C092A3F4D2A56FE5A33A00757F4D7DEE5DFB0524311A97AE0668A47971B95766E2F6DD48C3F57841F91F04A00AD5EA70F2D479A2620DC5CD78EAAB3A3B011719B7E78D19DDF70D9423798AF77517EBC55392FCD01FC600D8D466B9E7A7A85BF33F9CC5419E9BD874DDFD60981150DDAF8D7FEBAA4374F0872A5628D318000311E2F5655365AD4D407C20E5C04DF17A222E7DEEC79C5AB1116D8572F91CD06E1CCC7CED53736FC867FD49ECEBE6BF8082E8A Out = CAFC4468370B21BBB40D207D55FD79D4E753E4693075CCABBD8152DD2FC8BE77C81EF5ECAD93D0CF67FECF96D4CE401D1012A78FE5AF1575D430B4E98BDB0DAB In = 57AF971FCCAEC97435DC2EC9EF0429BCEDC6B647729EA168858A6E49AC1071E706F4A5A645CA14E8C7746D65511620682C906C8B86EC901F3DDED4167B3F00B06CBFAC6AEE3728051B3E5FF10B4F9ED8BD0B8DA94303C833755B3CA3AEDDF0B54BC8D6632138B5D25BAB03D17B3458A9D782108006F5BB7DE75B5C0BA854B423D8BB801E701E99DC4FEAAD59BC1C7112453B04D33EA3635639FB802C73C2B71D58A56BBD671B18FE34ED2E3DCA38827D63FDB1D4FB3285405004B2B3E26081A8FF08CD6D2B08F8E7B7E90A2AB1ED7A41B1D0128522C2F8BFF56A7FE67969422CE839A9D4608F03 Out = DB9F9D60468D2ACA0E907666BFE59D44AEFAEFFEA0F9B5FAF3F54A10F33441E0A8775D618D1DC05E454B4469ACD393B1938381443EEF27F98CEA2AAF29FAA504 In = 04E16DEDC1227902BAAF332D3D08923601BDD64F573FAA1BB7201918CFE16B1E10151DAE875DA0C0D63C59C3DD050C4C6A874011B018421AFC4623AB0381831B2DA2A8BA42C96E4F70864AC44E106F94311051E74C77C1291BF5DB9539E69567BF6A11CF6932BBBAD33F8946BF5814C066D851633D1A513510039B349939BFD42B858C21827C8FF05F1D09B1B0765DC78A135B5CA4DFBA0801BCADDFA175623C8B647EACFB4444B85A44F73890607D06D507A4F8393658788669F6EF4DEB58D08C50CA0756D5E2F49D1A7AD73E0F0B3D3B5F090ACF622B1878C59133E4A848E05153592EA81C6FBF Out = FD298EE7689557CBB1D2DB73661D535F88EF035339DA8CDEF3031F6F9247453DFA9C620865B9102903CCD7675A69EC4123AE4841C97C69EC8673830010169776 In = 7C815C384EEE0F288ECE27CCED52A01603127B079C007378BC5D1E6C5E9E6D1C735723ACBBD5801AC49854B2B569D4472D33F40BBB8882956245C366DC3582D71696A97A4E19557E41E54DEE482A14229005F93AFD2C4A7D8614D10A97A9DFA07F7CD946FA45263063DDD29DB8F9E34DB60DAA32684F0072EA2A9426ECEBFA5239FB67F29C18CBAA2AF6ED4BF4283936823AC1790164FEC5457A9CBA7C767CA59392D94CAB7448F50EB34E9A93A80027471CE59736F099C886DEA1AB4CBA4D89F5FC7AE2F21CCD27F611ECA4626B2D08DC22382E92C1EFB2F6AFDC8FDC3D2172604F5035C46B8197D3 Out = 0DFAD082D280839A2D3D54080F44E2826D554A3382A024A8B8F89125864D27F5AC75F8CA3D80C1B725005687A33817EF54B53C596E2D300B6464EFDF25860BBC In = E29D505158DBDD937D9E3D2145658EE6F5992A2FC790F4F608D9CDB44A091D5B94B88E81FAC4FDF5C49442F13B911C55886469629551189EAFF62488F1A479B7DB11A1560E198DDCCCCF50159093425FF7F1CB8D1D1246D0978764087D6BAC257026B090EFAE8CEC5F22B6F21C59ACE1AC7386F5B8837CA6A12B6FBF5534DD0560EF05CA78104D3B943DDB220FEAEC89AA5E692A00F822A2AB9A2FE60350D75E7BE16FF2526DC643872502D01F42F188ABED0A6E9A6F5FD0D1CE7D5755C9FFA66B0AF0B20BD806F08E06156690D81AC811778CA3DAC2C249B96002017FCE93E507E3B953ACF99964B847 Out = 9B15DED0185F1529AE4C75B56060A13484BF6DB0B7113F8D440C5BCF91A9D95E7ABD458D5D1D758A2019AA0A9A9CA18DA108314ED4269B7752F95D241C8DD95E In = D85588696F576E65ECA0155F395F0CFACD83F36A99111ED5768DF2D116D2121E32357BA4F54EDE927F189F297D3A97FAD4E9A0F5B41D8D89DD7FE20156799C2B7B6BF9C957BA0D6763F5C3BC5129747BBB53652B49290CFF1C87E2CDF2C4B95D8AAEE09BC8FBFA6883E62D237885810491BFC101F1D8C636E3D0EDE838AD05C207A3DF4FAD76452979EB99F29AFAECEDD1C63B8D36CF378454A1BB67A741C77AC6B6B3F95F4F02B64DABC15438613EA49750DF42EE90101F115AA9ABB9FF64324DDE9DABBB01054E1BD6B4BCDC7930A44C2300D87CA78C06924D0323AD7887E46C90E8C4D100ACD9EED21E Out = 9876B0FC3269B25129B2BEEDDE7D2F342E22351723BEDD3DCC5F225D8A480E0C596C99A7FFA5780E0A40F09BB342AB9E87682F8A7AEC50BFF19947E00BF66E6B In = 3A12F8508B40C32C74492B66323375DCFE49184C78F73179F3314B79E63376B8AC683F5A51F1534BD729B02B04D002F55CBD8E8FC9B5EC1EA6BBE6A0D0E7431518E6BA45D124035F9D3DCE0A8BB7BF1430A9F657E0B4EA9F20EB20C786A58181A1E20A96F1628F8728A13BDF7A4B4B32FC8AA7054CC4881AE7FA19AFA65C6C3EE1B3ADE3192AF42054A8A911B8EC1826865D46D93F1E7C5E2B7813C92A506E53886F3D4701BB93D2A681AD109C845904BB861AF8AF0646B6E399B38B614051D34F6842563A0F37EC00CB3D865FC5D746C4987DE2A65071100883A2A9C7A2BFE1E2DD603D9EA24DC7C5FD06BE Out = 612452D85CC2AF10F1AA9CED95EAA447C34A4A1236A27E8324037E9E9C7F983B8BBBB2BC168DE5F86D161C940DA2C86008A59C77EAD4AA13630EBE882D73066B In = 1861EDCE46FA5AD17E1FF1DEAE084DEC580F97D0A67885DFE834B9DFAC1AE076742CE9E267512CA51F6DF5A455AF0C5FD6ABF94ACEA103A3370C354485A7846FB84F3AC7C2904B5B2FBF227002CE512133BB7E1C4E50057BFD1E44DB33C7CDB969A99E284B184F50A14B068A1FC5009D9B298DBE92239572A7627AAC02ABE8F3E3B473417F36D4D2505D16B7577F4526C9D94A270A2DFE450D06DA8F6FA956879A0A55CFE99E742EA555EA477BA3E9B44CCD508C375423611AF92E55345DC215779B2D5119EBA49C71D49B9FE3F1569FA24E5CA3E332D042422A8B8158D3EC66A80012976F31FFDF305F0C9C5E Out = 55C0F0C1D6FD781C85E85464BF3AFB4867CD46667E49D1C369BEABD3194F4D5C237CB34027AF805A0B369459C6524E633625DBF72C5AB88292B08A59BB7633F3 In = 08D0FFDE3A6E4EF65608EA672E4830C12943D7187CCFF08F4941CFC13E545F3B9C7AD5EEBBE2B01642B486CAF855C2C73F58C1E4E3391DA8E2D63D96E15FD84953AE5C231911B00AD6050CD7AAFDAAC9B0F663AE6AAB45519D0F5391A541707D479034E73A6AD805AE3598096AF078F1393301493D663DD71F83869CA27BA508B7E91E81E128C1716DC3ACFE3084B2201E04CF8006617EECF1B640474A5D45CFDE9F4D3EF92D6D055B909892194D8A8218DB6D8203A84261D200D71473D7488F3427416B6896C137D455F231071CACBC86E0415AB88AEC841D96B7B8AF41E05BB461A40645BF176601F1E760DE5F Out = 7FF37874DD828FD1B4CEDE7E0AE6BAB8E366BB033B19892404B6546F2B7AC98ECD03E94FAC5BF810C3B86CD8EB2A3C2485A31BA7E34472DE14E406C0998C38B9 In = D782ABB72A5BE3392757BE02D3E45BE6E2099D6F000D042C8A543F50ED6EBC055A7F133B0DD8E9BC348536EDCAAE2E12EC18E8837DF7A1B3C87EC46D50C241DEE820FD586197552DC20BEEA50F445A07A38F1768A39E2B2FF05DDDEDF751F1DEF612D2E4D810DAA3A0CC904516F9A43AF660315385178A529E51F8AAE141808C8BC5D7B60CAC26BB984AC1890D0436EF780426C547E94A7B08F01ACBFC4A3825EAE04F520A9016F2FB8BF5165ED12736FC71E36A49A73614739EAA3EC834069B1B40F1350C2B3AB885C02C640B9F7686ED5F99527E41CFCD796FE4C256C9173186C226169FF257954EBDA81C0E5F99 Out = F5C2E8E12ABC3765E9AE3682DB57E2F8B766F6ECC8D0BCD50B8E237E427A2AC1E66B7212DEF66A5561BA1347AEA507DA088F4DD0F9F887354E6BF6B7DC267933 In = 5FCE8109A358570E40983E1184E541833BB9091E280F258CFB144387B05D190E431CB19BAA67273BA0C58ABE91308E1844DCD0B3678BAA42F335F2FA05267A0240B3C718A5942B3B3E3BFA98A55C25A1466E8D7A603722CB2BBF03AFA54CD769A99F310735EE5A05DAE2C22D397BD95635F58C48A67F90E1B73AAFCD3F82117F0166657838691005B18DA6F341D6E90FC1CDB352B30FAE45D348294E501B63252DE14740F2B85AE5299DDEC3172DE8B6D0BA219A20A23BB5E10FF434D39DB3F583305E9F5C039D98569E377B75A70AB837D1DF269B8A4B566F40BB91B577455FD3C356C914FA06B9A7CE24C7317A172D Out = 7F10AA2696AB43CE01E3658148B37EBE3C957345655F820F4D6176D2D0FB366561B25A185A845341986CBDDD1B1DC33D48F48EC7CAE99CBB016CA09595AE05CF In = 6172F1971A6E1E4E6170AFBAD95D5FEC99BF69B24B674BC17DD78011615E502DE6F56B86B1A71D3F4348087218AC7B7D09302993BE272E4A591968AEF18A1262D665610D1070EE91CC8DA36E1F841A69A7A682C580E836941D21D909A3AFC1F0B963E1CA5AB193E124A1A53DF1C587470E5881FB54DAE1B0D840F0C8F9D1B04C645BA1041C7D8DBF22030A623AA15638B3D99A2C400FF76F3252079AF88D2B37F35EE66C1AD7801A28D3D388AC450B97D5F0F79E4541755356B3B1A5696B023F39AB7AB5F28DF4202936BC97393B93BC915CB159EA1BD7A0A414CB4B7A1AC3AF68F50D79F0C9C7314E750F7D02FAA58BFA Out = 0D7CCD471A38BCE93CB11B673260F9691D4F1CB7663D44B51EB3BD7B0F1BC45EC4382CBDEF8D852424558615C554FE06405E3A1DFB88B97D8ACA74192C804328 In = 5668ECD99DFBE215C4118398AC9C9EAF1A1433FAB4CCDD3968064752B625EA944731F75D48A27D047D67547F14DD0FFAA55FA5E29F7AF0D161D85EAFC4F2029B717C918EAB9D304543290BDBA7158B68020C0BA4E079BC95B5BC0FC044A992B94B4CCD3BD66D0EABB5DBBAB904D62E00752C4E3B0091D773BCF4C14B4377DA3EFFF824B1CB2FA01B32D1E46C909E626ED2DAE920F4C7DBEB635BC754FACBD8D49BEBA3F23C1C41CCBFCD0EE0C114E69737F5597C0BF1D859F0C767E18002AE8E39C26261FFDE2920D3D0BAF0E906138696CFE5B7E32B600F45DF3AAA39932F3A7DF95B60FA8712A2271FCAF3911CE7B511B1 Out = B17B646A2179D20B55E2763A189545896E861291E9321643DBEBFBFD7951CEE2E53283C2D9B54BA23B124C68098BC5229E31076198678AD124B8A8A56B848384 In = 03D625488354DF30E3F875A68EDFCF340E8366A8E1AB67F9D5C5486A96829DFAC0578289082B2A62117E1CF418B43B90E0ADC881FC6AE8105C888E9ECD21AEA1C9AE1A4038DFD17378FED71D02AE492087D7CDCD98F746855227967CB1AB4714261EE3BEAD3F4DB118329D3EBEF4BC48A875C19BA763966DA0EBEA800E01B2F50B00E9DD4CACA6DCB314D00184EF71EA2391D760C950710DB4A70F9212FFC54861F9DC752CE18867B8AD0C48DF8466EF7231E7AC567F0EB55099E622EBB86CB237520190A61C66AD34F1F4E289CB3282AE3EAAC6152ED24D2C92BAE5A7658252A53C49B7B02DFE54FDB2E90074B6CF310AC661 Out = 51D322A34629629F2F9C6A9D53C7205E8C7421DA2E742C93E413E6985467885C6DB5174472292C614A5833C8CE98FD222D8A924E98098282300E000F1977B1CB In = 2EDC282FFB90B97118DD03AAA03B145F363905E3CBD2D50ECD692B37BF000185C651D3E9726C690D3773EC1E48510E42B17742B0B0377E7DE6B8F55E00A8A4DB4740CEE6DB0830529DD19617501DC1E9359AA3BCF147E0A76B3AB70C4984C13E339E6806BB35E683AF8527093670859F3D8A0FC7D493BCBA6BB12B5F65E71E705CA5D6C948D66ED3D730B26DB395B3447737C26FAD089AA0AD0E306CB28BF0ACF106F89AF3745F0EC72D534968CCA543CD2CA50C94B1456743254E358C1317C07A07BF2B0ECA438A709367FAFC89A57239028FC5FECFD53B8EF958EF10EE0608B7F5CB9923AD97058EC067700CC746C127A61EE3 Out = AABA6FF7AB56A145141244BD68314072A96EF4C83D0F0CC883082F7158FBCD22D99C46308FD8472BFB4AFC92510EFFE673FCA3AC5906990130DB540ECC346E92 In = 90B28A6AA1FE533915BCB8E81ED6CACDC10962B7FF82474F845EEB86977600CF70B07BA8E3796141EE340E3FCE842A38A50AFBE90301A3BDCC591F2E7D9DE53E495525560B908C892439990A2CA2679C5539FFDF636777AD9C1CDEF809CDA9E8DCDB451ABB9E9C17EFA4379ABD24B182BD981CAFC792640A183B61694301D04C5B3EAAD694A6BD4CC06EF5DA8FA23B4FA2A64559C5A68397930079D250C51BCF00E2B16A6C49171433B0AADFD80231276560B80458DD77089B7A1BBCC9E7E4B9F881EACD6C92C4318348A13F4914EB27115A1CFC5D16D7FD94954C3532EFACA2CAB025103B2D02C6FD71DA3A77F417D7932685888A Out = 0CE918B049A465F707B524F5CC1B0351682238078E8ACF52006931DAED402A5D584F7E3E7695B0B03076C1A09EEA098BC9CDE640E318A0527CE36AC92D8331E4 In = 2969447D175490F2AA9BB055014DBEF2E6854C95F8D60950BFE8C0BE8DE254C26B2D31B9E4DE9C68C9ADF49E4EE9B1C2850967F29F5D08738483B417BB96B2A56F0C8ACA632B552059C59AAC3F61F7B45C966B75F1D9931FF4E596406378CEE91AAA726A3A84C33F37E9CDBE626B5745A0B06064A8A8D56E53AAF102D23DD9DF0A3FDF7A638509A6761A33FA42FA8DDBD8E16159C93008B53765019C3F0E9F10B144CE2AC57F5D7297F9C9949E4FF68B70D339F87501CE8550B772F32C6DA8AD2CE2100A895D8B08FA1EEAD7C376B407709703C510B50F87E73E43F8E7348F87C3832A547EF2BBE5799ABEDCF5E1F372EA809233F006 Out = 6B4D98B9D0287C6983DF4E267BD638A9119B48E2F2E6CD010F98AECE27E12174C317CACCFB0BEE9B3993C8C844E00E781448A5FD5EBF8C01E5C7D1114742FC9B In = 721645633A44A2C78B19024EAECF58575AB23C27190833C26875DC0F0D50B46AEA9C343D82EA7D5B3E50EC700545C615DAEAEA64726A0F05607576DCD396D812B03FB6551C641087856D050B10E6A4D5577B82A98AFB89CEE8594C9DC19E79FEFF0382FCFD127F1B803A4B9946F4AC9A4378E1E6E041B1389A53E3450CD32D9D2941B0CBABDB50DA8EA2513145164C3AB6BCBD251C448D2D4B087AC57A59C2285D564F16DA4ED5E607ED979592146FFB0EF3F3DB308FB342DF5EB5924A48256FC763141A278814C82D6D6348577545870AE3A83C7230AC02A1540FE1798F7EF09E335A865A2AE0949B21E4F748FB8A51F44750E213A8FB Out = 43C69DEB892ACD8B887966B88903C24B87B5ABB38BAE41BDD843BD753A04761897021382316FA657AEB17DDD9340CB81238708BDBE7EFBA88F1050F46AD2D6BB In = 6B860D39725A14B498BB714574B4D37CA787404768F64C648B1751B353AC92BAC2C3A28EA909FDF0423336401A02E63EC24325300D823B6864BB701F9D7C7A1F8EC9D0AE3584AA6DD62EA1997CD831B4BABD9A4DA50932D4EFDA745C61E4130890E156AEE6113716DAF95764222A91187DB2EFFEA49D5D0596102D619BD26A616BBFDA8335505FBB0D90B4C180D1A2335B91538E1668F9F9642790B4E55F9CAB0FE2BDD2935D001EE6419ABAB5457880D0DBFF20ED8758F4C20FE759EFB33141CF0E892587FE8187E5FBC57786B7E8B089612C936DFC03D27EFBBE7C8673F1606BD51D5FF386F4A7AB68EDF59F385EB1291F117BFE717399 Out = 2037CEE5FC0E67A655AE13407E321619521C5F24409077BD06DB0EB41C7B1972D5DFB43D5C40713989ED4A493BCCCA49A3ECAD98DCDAE5B97419EA86A0268266 In = 6A01830AF3889A25183244DECB508BD01253D5B508AB490D3124AFBF42626B2E70894E9B562B288D0A2450CFACF14A0DDAE5C04716E5A0082C33981F6037D23D5E045EE1EF2283FB8B6378A914C5D9441627A722C282FF452E25A7EA608D69CEE4393A0725D17963D0342684F255496D8A18C2961145315130549311FC07F0312FB78E6077334F87EAA873BEE8AA95698996EB21375EB2B4EF53C14401207DEB4568398E5DD9A7CF97E8C9663E23334B46912F8344C19EFCF8C2BA6F04325F1A27E062B62A58D0766FC6DB4D2C6A1928604B0175D872D16B7908EBC041761187CC785526C2A3873FEAC3A642BB39F5351550AF9770C328AF7B Out = AE52BA93BD7DF6982D7BCB158B323331D27EB4CC71429C675709B0EF257FD3BCC1B66B3877F83FD418EFF1EED019794F3A45299D865FBB3CF4EBBF814DE6F3DC In = B3C5E74B69933C2533106C563B4CA20238F2B6E675E8681E34A389894785BDADE59652D4A73D80A5C85BD454FD1E9FFDAD1C3815F5038E9EF432AAC5C3C4FE840CC370CF86580A6011778BBEDAF511A51B56D1A2EB68394AA299E26DA9ADA6A2F39B9FAFF7FBA457689B9C1A577B2A1E505FDF75C7A0A64B1DF81B3A356001BF0DF4E02A1FC59F651C9D585EC6224BB279C6BEBA2966E8882D68376081B987468E7AED1EF90EBD090AE825795CDCA1B4F09A979C8DFC21A48D8A53CDBB26C4DB547FC06EFE2F9850EDD2685A4661CB4911F165D4B63EF25B87D0A96D3DFF6AB0758999AAD214D07BD4F133A6734FDE445FE474711B69A98F7E2B Out = 72B6C1EAAF98E4643EC3E6348988C7C5BA8AE0A4BB2EDC65409B7C4CBF37B3D6096DE4967FC0D0B22B7E709531BF9F65EE0203BFD9925BBB2A8AAC509AD762B4 In = 83AF34279CCB5430FEBEC07A81950D30F4B66F484826AFEE7456F0071A51E1BBC55570B5CC7EC6F9309C17BF5BEFDD7C6BA6E968CF218A2B34BD5CF927AB846E38A40BBD81759E9E33381016A755F699DF35D660007B5EADF292FEEFB735207EBF70B5BD17834F7BFA0E16CB219AD4AF524AB1EA37334AA66435E5D397FC0A065C411EBBCE32C240B90476D307CE802EC82C1C49BC1BEC48C0675EC2A6C6F3ED3E5B741D13437095707C565E10D8A20B8C20468FF9514FCF31B4249CD82DCEE58C0A2AF538B291A87E3390D737191A07484A5D3F3FB8C8F15CE056E5E5F8FEBE5E1FB59D6740980AA06CA8A0C20F5712B4CDE5D032E92AB89F0AE1 Out = 87C56BADCCB0D0FEABFBCED93088BD0BD06840BD194E4C665D5045BF221A04839F0BE03AA61F86AFF8C403CBE08FEDB76837A2C71CEA50620EC0C488C4003785 In = A7ED84749CCC56BB1DFBA57119D279D412B8A986886D810F067AF349E8749E9EA746A60B03742636C464FC1EE233ACC52C1983914692B64309EDFDF29F1AB912EC3E8DA074D3F1D231511F5756F0B6EEAD3E89A6A88FE330A10FACE267BFFBFC3E3090C7FD9A850561F363AD75EA881E7244F80FF55802D5EF7A1A4E7B89FCFA80F16DF54D1B056EE637E6964B9E0FFD15B6196BDD7DB270C56B47251485348E49813B4EB9ED122A01B3EA45AD5E1A929DF61D5C0F3E77E1FDC356B63883A60E9CBB9FC3E00C2F32DBD469659883F690C6772E335F617BC33F161D6F6984252EE12E62B6000AC5231E0C9BC65BE223D8DFD94C5004A101AF9FD6C0FB Out = 7228261B12052A13CA19EC70BA1D7497F03F2F7FC208A1FC499A01D2F9D1177C9AE9BA46E6F418D6088E4DFA8D8D8A27EA99B4ABC4236967054CDC60ED603E1A In = A6FE30DCFCDA1A329E82AB50E32B5F50EB25C873C5D2305860A835AECEE6264AA36A47429922C4B8B3AFD00DA16035830EDB897831C4E7B00F2C23FC0B15FDC30D85FB70C30C431C638E1A25B51CAF1D7E8B050B7F89BFB30F59F0F20FECFF3D639ABC4255B3868FC45DD81E47EB12AB40F2AAC735DF5D1DC1AD997CEFC4D836B854CEE9AC02900036F3867FE0D84AFFF37BDE3308C2206C62C4743375094108877C73B87B2546FE05EA137BEDFC06A2796274099A0D554DA8F7D7223A48CBF31B7DECAA1EBC8B145763E3673168C1B1B715C1CD99ECD3DDB238B06049885ECAD9347C2436DFF32C771F34A38587A44A82C5D3D137A03CAA27E66C8FF6 Out = C37C08D3A8C35C1C6D645B1DFFD7FF4082EFC21700D4C029E796620168ABBFAFE8AF0F421417DD357855D8B131F49AA09795842D7D298845321BEE7700ECDA3C In = 83167FF53704C3AA19E9FB3303539759C46DD4091A52DDAE9AD86408B69335989E61414BC20AB4D01220E35241EFF5C9522B079FBA597674C8D716FE441E566110B6211531CECCF8FD06BC8E511D00785E57788ED9A1C5C73524F01830D2E1148C92D0EDC97113E3B7B5CD3049627ABDB8B39DD4D6890E0EE91993F92B03354A88F52251C546E64434D9C3D74544F23FB93E5A2D2F1FB15545B4E1367C97335B0291944C8B730AD3D4789273FA44FB98D78A36C3C3764ABEEAC7C569C1E43A352E5B770C3504F87090DEE075A1C4C85C0C39CF421BDCC615F9EFF6CB4FE6468004AECE5F30E1ECC6DB22AD9939BB2B0CCC96521DFBF4AE008B5B46BC006E Out = 657C140E3C895BDF7096AC866B2910D22B42ED6D038A39D3E50BB923EB0A70F1D06EBDF68A668CF91AEF5A204063A765782B1D6489ECE1885DE1BDA7BD581C55 In = 3A3A819C48EFDE2AD914FBF00E18AB6BC4F14513AB27D0C178A188B61431E7F5623CB66B23346775D386B50E982C493ADBBFC54B9A3CD383382336A1A0B2150A15358F336D03AE18F666C7573D55C4FD181C29E6CCFDE63EA35F0ADF5885CFC0A3D84A2B2E4DD24496DB789E663170CEF74798AA1BBCD4574EA0BBA40489D764B2F83AADC66B148B4A0CD95246C127D5871C4F11418690A5DDF01246A0C80A43C70088B6183639DCFDA4125BD113A8F49EE23ED306FAAC576C3FB0C1E256671D817FC2534A52F5B439F72E424DE376F4C565CCA82307DD9EF76DA5B7C4EB7E085172E328807C02D011FFBF33785378D79DC266F6A5BE6BB0E4A92ECEEBAEB1 Out = 1704129D4CABEAD74C1AB7AC89D773DC50A88EE71937C25FC3DFA5F4FDF791695040755F15894E6A56380F713C23AA5ACAC8DA8CBA4F356FF18AE72AA5E78902 In = 724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195 Out = B2A35CF130E39CF82D85B5E4205934C0550293326354A0F9473890048F05AD76369E17E86D5D3F841C211312155F0B46266D8FB0FB515F044BCEB32FFEBA2871 In = 3139840B8AD4BCD39092916FD9D01798FF5AA1E48F34702C72DFE74B12E98A114E318CDD2D47A9C320FFF908A8DBC2A5B1D87267C8E983829861A567558B37B292D4575E200DE9F1DE45755FAFF9EFAE34964E4336C259F1E66599A7C904EC02539F1A8EAB8706E0B4F48F72FEC2794909EE4A7B092D6061C74481C9E21B9332DC7C6E482D7F9CC3210B38A6F88F7918C2D8C55E64A428CE2B68FD07AB572A8B0A2388664F99489F04EB54DF1376271810E0E7BCE396F52807710E0DEA94EB49F4B367271260C3456B9818FC7A72234E6BF2205FF6A36546205015EBD7D8C2527AA430F58E0E8AC97A7B6B793CD403D517D66295F37A34D0B7D2FA7BC345AC04CA1E266480DEEC39F5C88641C9DC0BD1358158FDECDD96685BBBB5C1FE5EA89D2CB4A9D5D12BB8C893281FF38E87D6B4841F0650092D447E013F20EA934E18 Out = DC0CDEDBA4F46C081F84E8DB765CF6DA2570A0D5C638ABB74774FC6F8C9A2708F0AB027B0CAAEF047A2FEB08DB43DBA5D802F5541D58956F998013AC4E5C5897 In = 023D91AC532601C7CA3942D62827566D9268BB4276FCAA1AE927693A6961652676DBA09219A01B3D5ADFA12547A946E78F3C5C62DD880B02D2EEEB4B96636529C6B01120B23EFC49CCFB36B8497CD19767B53710A636683BC5E0E5C9534CFC004691E87D1BEE39B86B953572927BD668620EAB87836D9F3F8F28ACE41150776C0BC6657178EBF297FE1F7214EDD9F215FFB491B681B06AC2032D35E6FDF832A8B06056DA70D77F1E9B4D26AE712D8523C86F79250718405F91B0A87C725F2D3F52088965F887D8CF87206DFDE422386E58EDDA34DDE2783B3049B86917B4628027A05D4D1F429D2B49C4B1C898DDDCB82F343E145596DE11A54182F39F4718ECAE8F506BD9739F5CD5D5686D7FEFC834514CD1B2C91C33B381B45E2E5335D7A8720A8F17AFC8C2CB2BD88B14AA2DCA099B00AA575D0A0CCF099CDEC4870FB710D2680E60C48BFC291FF0CEF2EEBF9B36902E9FBA8C889BF6B4B9F5CE53A19B0D9399CD19D61BD08C0C2EC25E099959848E6A550CA7137B63F43138D7B651 Out = 48B10FA23344EFC936E3E1864F1F1BBE4AE7358CA39711A4A984C602D2E7DF08ABECFA33A4114260F50DB9DC2E72468E358A50CAC43659616E1F8954F160E581 In = 20FF454369A5D05B81A78F3DB05819FEA9B08C2384F75CB0AB6AA115DD690DA3131874A1CA8F708AD1519EA952C1E249CB540D196392C79E87755424FEE7C890808C562722359EEA52E8A12FBBB969DD7961D2BA52037493755A5FA04F0D50A1AA26C9B44148C0D3B94D1C4A59A31ACA15AE8BD44ACB7833D8E91C4B86FA3135A423387B8151B4133ED23F6D7187B50EC2204AD901AD74D396E44274E0ECAFAAE17B3B9085E22260B35CA53B15CC52ABBA758AF6798FBD04ECEECED648F3AF4FDB3DED7557A9A5CFB7382612A8A8F3F45947D1A29CE29072928EC193CA25D51071BD5E1984ECF402F306EA762F0F25282F5296D997658BE3F983696FFA6D095C6369B4DAF79E9A5D3136229128F8EB63C12B9E9FA78AFF7A3E9E19A62022493CD136DEFBB5BB7BA1B938F367FD2F63EB5CA76C0B0FF21B9E36C3F07230CF3C3074E5DA587040A76975D7E39F4494ACE5486FCBF380AB7558C4FE89656335B82E4DB8659509EAB46A19613126E594042732DD4C411F41AA8CDEAC71C0FB40A94E6DA558C05E77B6182806F26D9AFDF3DA00C69419222C8186A6EFAD600B410E6CE2F2A797E49DC1F135319801FA6F396B06F975E2A190A023E474B618E7 Out = 0242B9AA3222A71FB829A0010B1FBA4F9A380E5DC57416CD57A26EC7FD7DC56D514799600717F2B9AF909D076D16E8FD9F96A705169FEEF91D15EBD38A3A34CF In = 4FBDC596508D24A2A0010E140980B809FB9C6D55EC75125891DD985D37665BD80F9BEB6A50207588ABF3CEEE8C77CD8A5AD48A9E0AA074ED388738362496D2FB2C87543BB3349EA64997CE3E7B424EA92D122F57DBB0855A803058437FE08AFB0C8B5E7179B9044BBF4D81A7163B3139E30888B536B0F957EFF99A7162F4CA5AA756A4A982DFADBF31EF255083C4B5C6C1B99A107D7D3AFFFDB89147C2CC4C9A2643F478E5E2D393AEA37B4C7CB4B5E97DADCF16B6B50AAE0F3B549ECE47746DB6CE6F67DD4406CD4E75595D5103D13F9DFA79372924D328F8DD1FCBEB5A8E2E8BF4C76DE08E3FC46AA021F989C49329C7ACAC5A688556D7BCBCB2A5D4BE69D3284E9C40EC4838EE8592120CE20A0B635ECADAA84FD5690509F54F77E35A417C584648BC9839B974E07BFAB0038E90295D0B13902530A830D1C2BDD53F1F9C9FAED43CA4EED0A8DD761BC7EDBDDA28A287C60CD42AF5F9C758E5C7250231C09A582563689AFC65E2B79A7A2B68200667752E9101746F03184E2399E4ED8835CB8E9AE90E296AF220AE234259FE0BD0BCC60F7A4A5FF3F70C5ED4DE9C8C519A10E962F673C82C5E9351786A8A3BFD570031857BD4C87F4FCA31ED4D50E14F2107DA02CB5058700B74EA241A8B41D78461658F1B2B90BFD84A4C2C9D6543861AB3C56451757DCFB9BA60333488DBDD02D601B41AAE317CA7474EB6E6DD Out = 961A63783683371125E7D4FD6455E60678AFCD354CE2C0A4FB299DAFB3C4EC46F45F48A63FF8EC29D44B3B033C931122924D3C2C9683D5C576E2F0453653CEA7 In = D1890B4704E169C28E44DDF62A1091450404910539FC2DAEB26E8ACF4533B024E5215C2D02820DD8FB2CFC1743955CBACFF0F8F35DFBB5E3F942F36247F68211D518F3F601AAE12A1CDC000BAB43D4C973F287E80741DD1FCF6C34F2E6B4B6C313D01C4FF3CBF9166F26946F18EF2D58271BA9233F09A6B77BFD4F48B36EB3D73D1133C4F842A7DC3907F680B0B773242C11E3DD973A44327EA7CEA9C0F8E07D682B6651E506B587559FE01ED721000BAF570A16FBDD9EA29FA3DEF4BE912058321A8B720C5C102E48A6E7ED6F8838D400DD57D06EEDBCD15323F86D855C94B21E41B14EC9E1BBC8019211FD88138C91F9ABBD9BB3914D26C1DDC21673D2D51263B39D66E741D924CF2B192C5D2C1A140126A3D64A2C77BE6C2C6EBE8599978AE90BD36CBB9AF64D078910C4094AB3BF399C34F2AB8EF843E9FE1BF88BF443BA21E4377E5F49C07FD9653B526E14562237F02D11B904BCA6AC31AE721A43E3C4910A24AF6F4D80C031C109FC0FE49F15274BCA92BDA04C3B4196C192F6CE489C63A806ACFC895AB52CAD657C1783B528E12D0ED856E1F8FC91F2AAFDFA0A92498D68530772EE73B359FCF1418D1096C46B34DCF90E5B468BBB2970BECBD70089CFB039D64CC50FFF5EEF26384D34F24515A6558B06A1FDD88F1050C5BD78CC6ED83D4C2B0E882AEBCF84AFB0430D0BF09F2FB42B8B4589158093A7709AAE75A790910E211EE1333FFB6FD80778DA3BF73858978E9DD647978841B18001DBAAEA43CA0C0A03DBB9BCF30CE76A6F4B2CF2A9B6531B3E4051E7E05090CD421BC66C4731E7122AD129FC42DEDC83BB460E3F889992FBD3CA072686E56B72C720FBC98D723EF7F247286F77CCDDC728738E941B1A74D4F16671C21FDD5643A115DDBCB88EE7EC67EA66FD2BCE718DF6E085D4B5FC71A72696636A8F7B3A68AFA51A896771FAAA7F1F827430AC5E8089DBC0D4175E1B22A057BC5F1724EADC1A41E78FA3ACAA8B97E5F2E19EF9D59AE12B04E7F0E8A621E098A66910E2A5ED2102B824CD3EA044A854F1CD0B33E61E7F737414B2953549F25DD34D19AA1981DE7CD5649FF6C6364A4F25312EF62395A747AB88AAD722C05AEC40DEEA8EEE5E779EF458A68840BC6BD5D29AD40F98B3AE010B6213372ABB7BB8B8 Out = F2240A89661FE49A693BDA8A34C8EB8C880F364D175EADCAA2863C669B1EB205CDC09CBBFD5ECA7B18FE1A807289B96945DC581D904D7982D0340E8F968D162B In = 4FA3DF1DEA75AD4B9C379206A95FED930000482E5B683FD2B17DC8E7D5C4BC1B73186CCC13C9FF2DD09FC1D4F68034D120E84CA73A00B71A3B46D1EFC6FF88CF2EDA65810B098CC5E651D9CF064E87076D5A871849F3B405D3D58EF5B1F10520A9FB4FC84A81A87B13DBFBF9D8674943E28C257E46D8AD7BE1785F1DC7C9B1BD574AD1DDA48F0255C853D2490BD3D63DA22A8369CFD02594999A2EF443308FB8298266A11EFA177102C75DC674E89FC9DCC1A0D3C863BC26141102175D2678EB6E13D90BBD9A5EB89AE8C0CB47D7F340D3D32042A2762BC9BF2B40EB40E87FB42610FE7E357051F01494704FBFF73321B47301A0799B7EE3FE5E62200F397A61ED4509A62F7106ED0EFB0ABD6AE9E4A1FE9B02C092DCDC75015CF602F3B9A8988B609E6C0D1C5C3E219FF57875C2EF01615F89447EA602DFC94EEC17A398C014BD346691FE209A002771DC8164422CD166AFB457A8B3071282178A3EBD201D9B07B27E711E7EE7D33AA5210ED4E4E92486775D14A6CED092E34A7AC82670939948FEC149F9C018FCAAD3FC597D315713F44FC5E1725F448ECAED40E8D841BD02F1E81C019B08F99412E360C0BD378391C67D964B47F50C26F0A483ED664023616B0FC9AFE43620DBE9CCFE070EF295C049EAC754C2123130C6B2C0232F6403AA7F0DC35A5999BF95D34AD612234C6289277ADB60E4F72EC2DF570F05395B3BE8A0A3C78B732821AA08927C524E15D65F66A3DB8C1C96FB70BC0686AAC310051F469FC5EF880C0F66947C1C328F97684EA24CBE63BAED8D114F40507C2901034E6AB3893F366D53F1CFCA309309218CABCECA4722FA9CCBC7249B87C12FF8397F40487EB00082E7F551D27E301C3BC7B5389F7042534BF7E692DFEA4DA24F7C34B8D2FF145F54B517FC97134EC5AC2CB925C508D7A6BD01FE7B764648274972BF08560D30802E0EB7EDCC57AF4797BBF92E8688268606B0F1BC901FCC22136281665EC16393FA9601C4FBDB18CD1D1EE382BC07973903E91FFA87399D1141D49F4F0C064ACF3AC9897891DF10BCA0116F2C3FEF180FE6A8E937C478F2EF293AE9186DCB1F76B6E48101DF64E57EA7C64C5C0025E221C8F5CBA5CC92D9CEC628140996B26D17F439B780F59A999301122F82D0495F8AB5AE1EA5790F45E992DFE00D5F82A7FF1354AEFDCEFC0D2D1731D22FA2B75AFD4FDA25AB194055FA9628381055247C8C7587D22E73C60136C4282452D47AE03AA035FEBC26FCCD42A1CB79CF866DB6418A49FD8261E877DDBB839CC39514DDB87A8A40D795532626FEA4A4C35D13E028F9ED1BC09B06BE999B8DDD2258AA0596BCBBF72AF67E10BEDD58D599B8D577A583D676BF5561F80CE5E9528729A92DF578FE75DBC70474B75747A8D55DE70E57BDD62D4344DC2115ED4DD62F1FC98BFA1E7421FC0700025C46D0ED1BEF35C3B778563211B9FA9E8BA4BBCBF01C2FB626AB7EF325CE9F468DF2CACDB178D36557CD85D542C067C289E926C1EA2F20ABD329E984168BB6DEF1DDCCF214DCB6A53AFD462F0E7E7A19E8C88F049244125A6D7DD41E58BC9B2FF7FA2478DF76AF73090CB1AB59E388BA20E2C297C967737A1AF61793B68ECD7439444C48E28E2D09C48FADA5E0D1D15E5B340A52F8B3B854CCA479F0A598445E14F53B3BA36891050C79673DF3E2B5825C955A29E5C9A22F3991D0AA785718CFEA1D2385F8E47E4A75ACBC7988D0558D541D71C4E6C5F1CB15B60CEA0C34A67BBCE105D7A896025E0254DE7D7AF724C9027D44B8642192A08AB8E1EF3046DDA6014DF7F4C9E63C635E48AB2E70B640D480998EC9357E665F99D76FE5529EF23C1BDFE017C3A66CD4EB2DDB42EF85EA0CD65534 Out = 8C0B44D668773C632A8B8316710F4B8E8948AB0DE82B9ADAAFF0A9FA901FE6532FC4E6741539C83966D42D646B1FA50BB7CF6F7545BE39CB561562FA1A474B6B In = 523DE8B1F4CBB65E81FF0B6CCD6EB8EF0A0F0A691ACAF4A77F25ACD2D66AD4B3EFD25BE70308853C094412A518A32020E3020A9F6AB32F0CD60EC0D7A194917D6C457B168A54A4B46F7B0D0C71BD61CD202F4C718776A701E0770B0EFA05418770F98E4E79CD066366FB3300E8BE359A98B82B764BC2FBBF59C7E8F94A157B01C6C7577B1428138CD422BC47330F8ED99F4C0AAB0D984287445539839389EE08D6345108AF26ADED0EC1D7BE774CFB8C5205DFE07CF6CAF8C1AFE37C7A2E4FE6013B93EB2463DE4E0971C7178D6A76B16A0E8960C984CE8BBE71B3B466EDF0445B835F09414D01F14C7B6167FF78FF118127BBD5F812C27FACD57B3B120E2BCFE87315C7A92B82EF5D50CA14A7174D1BEA7E056523E055A6AE42EA3765094E5544E5ED003C989C2F98F38A17E3DDA74DBAF9C669A319638A2698B0E4A611480D8AD3CF016792ECD1034925F42B9811A7214D623D047ABCA31997DDEB03275F80DD21F40DDC80616E7AD3D481E8EBC0A1A6A398E16A78369215541ED10B75671ADEB1AAE6E11142A1CF665FC1B7332DFBB0E10C21A2B48F78E57319AC9C58DFA8B1C2548E2979EF1ACCFEB215AFCD6C2C1B46FE97DD491758378330EFFC7283661D2CB84FA05281E9E517408508D24D042E7B9BCD34DB87CE972E4CBCDB98615FB93093369DFEDC782F44BCD03E81CF93051318B2401FF29F753A264BDA65AF199E3FCBB8B5D39C838A67D6C7A3DB046DC56C323DDBB5340CBC229E47CFF8C9D29B7A49AC0EC8C1440AE498C7D150EF91C29BEA7DF3EFCC2871A13A1D72D139CB4603D9FFFE85F6DDD544850EF63C3944FB35DBC00D4308CEAA6394B6E23F650D323F8F7EF50DDB68F1486EABF989BF44451F620EC9485C0B52D1415D3C909A2CFBE9D77DB19D069D33BAEE4D77292E63FCBF65C1EBA24BFFDDEFE95211EF0AAF8ABFDA9F94445E582976F986F5382CB669506AF2B4A5A0C43000A3C72C5CA4AACDC9D3D39FC5C492A393B6C341B86DACBBF6BA8B465100CC683EDB2D9B9F83EDF9C6A32645F51CC79ADC22A52A007BAACA618BE35E356D1FD1CFBDA73F1ED09253039DEF609450FD2D5943B9CD49CBD52A318EE3510D7CF3FD8FB388AC6CB9C6EEFEF3D3CAD8501B91CC04A888D33E16D6A4C9666F5F5F3B257193F2B46DEDDE11842909D8C48ADE57775B0B272E2DC9CEF1A083EB2CE58F4D1F211922FD6ADED1B82FE6F5B11251CD396E5A3666ED9626036E4E356231C146BBA0A91AFD3648EB7BFE0B9C14F15AF2F92309826F468945CAD0AC422DE3D6A773B76178422107CE0270E7F580B5CCEBA82CA0184AAFA8341141E65E39859885768FBC5CE63B965A0604B659E71D9DA2C7A43646088D8071D76926163AAFC69E25355BB0A222B7B2DA9F0A20C021ADC462E905A9C3BF31C16D87FBEC3F014F3957A720F1432E1741553092052FB58A198640479ABCAA51B104CC93E2636E1460643EA812BD44E819C2166EB6B349BA5BDEBAD59078910B5C22A56F004B8D9E4B1224D8D204B48ABE7355548A402736C5CB110F3A1476ED631FF168F4F3EFD89B38DE4751536548647523D334FAD7CC2D142973F2DB3C1FE08FC5CF83F9F2BD2DAA524B37864816AF29EE05951FA09D1C51D9D14EE4F72FD7BBF18B1A724FF5A0958A063947C430142AD2356E4400AAECA442E163372A8F1CD36E2DB988E7781165E5D4E7074ACE40858E8370E883694AF09977704347FB735C8717C42BC4EEEB2AAA50DFE637C640909CE379BFB9E2608F88751377038D1669F248178AD580A908D7A1B8DCC7E53E01801F1E485B5893F103F03E0F53B2B1440BE95644D85AA7F6EB7EDFBB46652196695EA23C08573397B111FF909025E20C5201293B4D223BF7AA01DE7CB28B94714370434B9588097E2401B62C7A0DEF1FBF89809E810749FD3CE9EC3C07CE4BF4C43DC966429B2BEB4D711FC6C448A12097B36F1E6817EAF4937A983F85D9CF3E62CC1B2AC6AE1EC9EAA8CD8EE2C3322239CFE5DB3D4E8786282E630A7D259C2FEFECA03031C960A66A71E436A3ED6F2F3CFAB4BD77C660D14205ABF606FE561A346F7D849B69475AC9F6822D80B9A2E56D5D495E4B309B0EA963C9FC5C7EF94B217EE5337989AFBC7107D233A8B362AC27C4F69DF9E191CD65AE97D6EB9E5484EB6F10349575E4CAE51452380151F902415AC9CF42C824EB23C9541D2DA1C26DB85F53CDAFB06A12B8393CD580A8E494EDB6710C720DCAE30832967E33E6303A92B1DF0841D7724284FFD2E00B95C6D623B168D21AC1BD3C675EDA33182A2C22370998DE1E5EB905372CC6EF32D5B765F5C94870DF4842D011603BE4CDB1C227E41EB2F2E8542CD325884FEDC9C5C7BB07A92D20D64B836215C59F162A3DA8BB67D6FC13FEF97CAB6ECB8A29E431A6519A6261C4521CCB90E6E609869E6FE398404AE047F64EC4263566DEFEE66329DD40AC985EB8A08D26529A544891B6F57CC235C63C09057AB6B6ED720EF41A3C9AE65768B43F6DCF4962A103DD93C213171DC2C9194E43265C689B49331450281A3FEBC618D1AA4D65A135137051FD46B568CE294C89 Out = A634C648944329BDEF5DE4F48D2F8F1A1E3DCFF5F4CCBC2E4375D5B4D3686D62F570DA68C5707B596249BE56256511AE53A307F0F01B8707E80C1A32D9313074 In = F5080D4C59E804BF8F34B334CABBCC7D32011BDE3677F4B9069416AC204114CD9DA7A0ED0F4B4D8344416336EEC15553EF526B6DEC267B1242657DD0B508AF81FECF9CFF9C82A6A7A9539814DD7E097615EF15373836B5D2F765CC8D5F82E90449F13AA741D5EE2FE63898E55ACD85116846807606FE1E2E29F98F9940B067D0D1DF01F080211B2EE4B0A30803782A7BC2EAFDC5EBDBA91EB05F7D7DC8E34BF6D44FEC05824F53418F235FB64E899EE147BCB403C8855E94AF378D182D79C3EAF977CB4E9D4A16D990A6C388CEB567B97785E6F2BC6745102B99AE765E960B6B32BAF01E2379CD6ECB74D3E1A56552F5976DFE5C742BC92BE596CA742FFC3D0FA032AC29F9F7C1A5C43BCCA62DF7D9DE35D0C7C179DB2E1AA255CEDCCA55064C2049FEE1AF2CE5EF696ED4BC46B7C55BDD51F2D44C8713FB2475C0B85246AC0103CC3863B7EB026AE076A600313F6FB40A4DF62A2AF81B7E917951EA870ECB31B3401928B5046D9A1E62D14B30FDEBAF262868517318FE17EC3C0D52524F44120ED8ED3BA70C643300CD0BC70DA72C964A88F52C3A91EC20BFEB5CAEFCD4D9C7685D8407476B5F34676C5EBD1E88A6CFF1C625322F8CD59B9ED60CEFB21F9491B95E72791F7AC7EAA3C16159FE9DF7A989ADD6C2282C47585E11397EDA9F47DF2B40166E03BCDD6186B46C6835118268DDBEF19A28BBADE1BDE0228FFD7E8B3C3C598D89E24B8CDEE79C940254DE26CC6814BA2722E42F7571600B7325E1FF300251D52A895B8CCBD049B2953B8D231445F68F7C26EC25A4B8695C8AC116F736BE939EDD762C9B4743E463C9B9B2F88E0BC0CE78781CDDC3BCA825ACD463C7CAC2AA6C430BBE820EA94AF9A40B1B5C006E9641A2FFA6E427379E1AD49C81B98320B3431FF0030DC683D61026438BC6A6D34B2C73704D9F62EAEB13ABB3E4B0562B4E0482CD6B2D7AEBC0367EA29A88F4A76F3D76FA1197E1DCA92C8216C84C1AF9B8C78C9E3A7799A4A79A783033B0F5547E8E75E69CF3615AB04EF989FE1A463B1672C571D50AB56972896E8A50C242F22C7F6E27CA4CA793F627E79608680F5421B28BDD2589F05E65430DF774EE873FCD1234064F7A33CF5A1FA4E368137FF9C1597F1FA0FA36493F20538077669EADFD3B06F788C912C715FB5D334DB6BED133A8FDC40F5496E66AD63881F0BA3727416715865253DC5290327B515BF68DA188DD5B4B0EAC7CA712CAFA8FCAE0C5503FE58A219182F1C30DA6D0C19CFEE897B7D837C97996A35F4CA8CF0537A01D17E7DE0CC9C129E4DA0ADAF1FDA85030DF9127BE628263B0624F372C47C3AC87EB945A57F5C732BEEE81A7403001798992F3DC944114FF3D54C4666AC5AC8C98D0D5596CBDEB420665F5EDAAE747D54CF7EDD37B162E372249D135938CF17D174D12D88279CB4C32BD6F018C766DA6983D4EA51D6BD8FF0A9B34E9A93BBDA70CF1B4B867D60A74811FD98D52FAA559B52C755CB70A76C94BD19654CAE7017CCD70222BF08C5D7AD1F5E4E6344FDB3ABE703452C29A696F39F9826ED8BC510A4A148E5BF8A5DBE6B82D7220164F08011C05AC5159D52CE9D45D758B645BBB248C2D341DBEFA1F8602C5D458A64F38F3B04DB39089807B6A10E1BB52770B92CE72E2D3BB0C2241CDED35054B84558D1CC099EF7B2296951951D5B6A22F93BF962AC5EF8FB55EC6CC2B316428EDF12078ED1B66D525D022819CBD489E1BEDB02FFBD507D55F9B5D4E22F6396EA233453754688D20151A09C70044B8A5A9AC033C3C3B847AD833D5C05B33407666EE82F9581DF9034EE15A9CA67D52F1D9B634B84C1B8BA9E515F1F060A5AC5CBAE2DE75F94E112F7198E239DF08D3103F065627438995026DF511C6E5BFDEEE5667D511D4181850C7C5D179107C1B86D24D5532A88A4149A2810DCAE73731B0E1247281A6FD31613DF6891B4C17B7A6A9AD9B77468254B93F85958AA0F01CEFC10B25169DC46E035D3F24557B4BF0E7D60174219108D916FFDC55E25BFFD9809EFD058E12C14F39C69D8FB73D3EC6458F47F2F8DB901BA76C86550B11B54D0641D4DB3EB000057DD00F2E511FB7A47E959A4402A3AC5462234B40B184020FCF7A0396C4D00A987C8741A4537BC17102A5C42AFEAB9F71EA66ED4CBC7B5EE682FF04F56F4BA1EA0BB326C4089930F9E3F3FFA3E06637CCE32113881A06CC3A13837448145C2BD01307A580FDBC385D8F46FB92FFEDBC8918D269DD1871164D4B3E2023441EC8B99C82A5F09821CDDF6B38C9ACC3BF3A38D5628016159588C33EAA29D9463A537C000A16AD8C177DC4CF716E625F46FC4CA8C19FBD8EF320F1D680639195C8B195B0A02738E0665F4190D6287E589CD6DD45B9E8CC23B08E1681BFC6F66B88DE6B091E825EA4BBFBD697E10BC407570AE4F2A3EBE569554639C2B8E051656CC30C837F5A92260EAD1D552B45801B6D28134166796C87F900225CFDC3CC49D72DFBC18D8D95B1E160ED3CAFD5C3467D48AFF87402CBCB1E1420E3FCB588AA19C8F42753B59DB6FB6A9FDBA127CA806DBA7DD97F2488FC2E438EEF57A4CC85B88DCFDE76AE1FF61225A1CA8BF4A14F729950322EA681B16D6492902506702DC8F348E4D3AE7FB55FAC1231FDE82091B34F1791B6AE37587B10325F6FF5E23B855845B86EAE90785B9D10D90A16644D01BB626F343B908A9591F4069B21822CA4ECF985C1E710475F33DF9AF4764CFB0FFE649063775338F15BEA7CFF29F164678160960A80ED148C9B7FAA58E9139911D3DD9536F69646F718F083DC9029D6294FC4C607688AA75AF350AC2C0B001A157D023D73D86ED8133809FCB9592D12089CBD7A1BB6BBA882FE227C09A53FF088907CB4BC2FB4B7F62D41D3D397C4FE0AD12BB3964370E21712951C679814D506E738C0201E42181D231136A435AE0397B61CCBC5E8BBEBF8EA77C8BC48BD6211F29248F9D498D818E2B544D28A5E60BA727F32EF4BA2707962230C900076FB764D0ED5CE078C9DB14DE894BBB836C6DE9E83202AE89F9A8D8CB0341E1C81B5FA8B16731B8E231E969C0F1EF95336D4E73EAD6DA23DE3AD1EB608ACCE4D4D93996DD76EC1F5F2C576F6B3B76E07BD8A810FF5D88B00FFE48C42700B61CC499336E7FB57AD72FF44FC631C7222C9A3D1ABF6E77B5ED7FE2F7228FED6C849BF7142C4103989A80F7C15642AE61650CDCA7E854EB25E9E72F4C3E3768E6CCC8BFD556B56D3507EDDE9E5C331DDEA75568B07813D20E8F4C9547838ED28448F2E67158ACF0C00B131473847816C5E2DC215 Out = 4726C1E176DB2823933F872FFFF0450EEB42E410A099A8A5DF5E28BC053A399D0A188F60D04E106291AA06E8817442938B198C9064E324D6C6142B0B3F509FD2 In = 08944CB473B828B118A31986DB67FC757F238182E790553404B792AA4F0095A6A83291E287CDD16521A3AE8C48F56FBC909DFCCFAA7BCC570C2159F26592DCD6B15BC4DD55CC05595AC634B2C3DE15360B0F07A03B5957BC9333CC5097919399DD9973ACE15E55940178C4C96BB5E0A0A10BAE175769548EBCE11E0D7D9DB29647F197D4B87F7039F5D4E59E016531DBEBF55A797AC9A6835032CDF34240A7EE7423E89C09124829CAFC5F89431C8AFC54FD979E50D48A82B47A53523C84B6004DAA323EFB708203E5388A6A5110C6CE2E341048A65FDEADEB3837A03420F9FADDC3F02A544F1E46D96B07C90C7971A7040A179E8198E90AA019268E00367120D5F3D98A5CCE82C885E77144B1AAD66EE682847776B04F01F501DCBEFE3903080A8058B3B8F1D823D917ECF31FC2D5B0795BF95A55C7093ECA7C801DD0BD0DBDBEDE7D56513128B29FC0B4D25A6240B24C99E017BDFF7ACAFC8F8DE9FAF5A2944384AECE82BEA04DCCC6D51FC6E6F27AA38F131B7959B13681A09B311D242E6222A1CE5687DE5C080508B1DB16B6F8290D33A3CC0D0138AC61FD9093825E9D3752889E9F20DB9F80F92750EAC88B38AC81C0016D40371EAB4A87E845E91446B0A07081B84F559CDB95340CB020AF22AEA1BFF2FDA12F7A42973FF163A1C6F33DB8B8214AE27ABDF1C54F5B03E29310FA210125E1296E8AF93A2996DBAEFBADD4C51C2C3B8A3E2BC9FE060C42BA32768F6992A99599206CD2291CCC5BBD50856F7F8D2D0AE1EFB5892C15A799B77482DE4553736B162ABB06631F1688F6746E7D7A37EE7EF24E6CC901175F04960C01990178F81E957E941DEAAC8846B3704E24204F43DDB0765C433F3F7D4D201459CD65682B7DDF3D47E95CDB31B96A4CB22907F08BA6E92A4A07703B2DCF150F922C4B7CF181380303FB72547847305999C3C8F9AC877D05D9DC4159DEB8A13D36AD1D533A56950E20F906D29D51DDC45BD15C1773991707480E37B827044BDC6473181B760A9036E0D3FA491C2F08C55130D8CDD5AC8E97D0813164AF3D28A585F0C2EC7004D498F95C6B62231A632A56C2D0C48FC3A6992D4051957B9ED6D9A86DBCCD962A8883CF82CAF01DA2F51A203D56B6089BC8FD0B1BD414C8063031ED469555E22EF872689C130B1C101034D572FD8CD0EDDABEC9EF1503D7F728B0941EFE2B9512438C7DDB176BE2EC2D9FFCD56495A4511428DF02819CDDA18D1ED5D3B16C6F42AA0AC681A9FAB51E8A1A856C15C51A3EC1031427142EA12543014DD4ACAC640B8A7729E63AB7DF1051112CDEFD4B988A2258334FA9A7F5B3A87A02074B9F69DD81B83FC74089A91D76AA4041259E80FA255F2084902AEB9E996AC2288AB464BDEC47AAB26A28A2A8194989755D48FC9A5C9279285F2F1DBB8B8018F3E4E13115D78A879792E45A8F4F24ED4A317440BA63E6929056EFC1D2529B75A709D6C0097DC2D97F646F334EBE6195EC5630132FDE58E25DBC17DAD822D9FA0938A2A2C926B105D108403DC29CF371C3504FF73BCE9C7ACF9A74C4954CE6A32DA96B21CF3211B3E49953DAB78C49C3E532A349003C59C62F7D40261CBA63A9EA21C89A38AA63CE431C43AE261C4D9999B1CAF491FAB8E7BE6E8C3454F1BE8793B2D27141FC107DA599A4694C41353D7785C05B5E31440458D17C6DB66FEB8A9C5C073FB946A67AC0312BB669D9B12FABAA5272CA6631379EF4ED420A4424A5CD08526384C047C33A84D5D7DC0C2153663B54C73DD799A3568C01B818992CDF8143F1DADD6B50CAE6EAE13AC66F31FFA2B362CC4D2880592B7FEE4B9E4CD6AA5E5DE27AAB9B5DAD9F7D39407AE927530CAB2B61CD7394A21EF47BFB813B5EA6091458D239664923280ED0D5CCA8285BB2281A2F9FB3FFECC8E9147E1E8FAC957D90C9E5F513738745A47C2AD0C31FD8986EF3B6388C6E821F166513811D547AB4336B5E04643497FC9F8D6E380EF6478B82B6E2F5F65DD98A63C68C32B94610E1D3B9538F13A7688FBB1EC3448BE9BD77BB93A34546172AE8D614F85228988E7FEB18C9A0C9827699E8B3CBC69750BDFECDA8268F694F4C509BEFC1A1166F85C829725299D173F867A300987A2D36D1BBBE37BE3208FB8EFE9152A41A5F0E931B6382FF7F9B18937958FB180E61F2A8C28F36C3C80C3722935AACB81C24AA17FB3E7A1026F7031A7449818ED62BA7705CA27C2D3268F90B6322921683DFF800A306CFC186CF2A61B37F35837B217E3B2CECB0843D84EAC67431E3D689F01522D4A4C73618B7C2965C9DABB15C0BE637D10CEEF72271CF39A7B803B41767BC34433C3E6FF449A439AE13DA1EAFA038CB9F2E1C84F1CE39C05DF56FE3D7B82386C4E628B6E27CBC5D575C66ADA3510C246BD04DB48F4AFC2D7352966DA2266C2BC9831532F53655D8BE42B421AC0D70D8AD1D3587257886DBF93668E907E861BA64F45999BADB0F766EADCE5238B5ED397F265935194812C03C5769137BAC97140525303CF48D65F39004A3F59B1FAB09895CEE05335D15B9B12265892F4ABB92AB1DD2002ED00CF3562CB67DFE1055968E4AB3306BB34BB87D0F64B26848812A2F7B50424A21FF94081A7F70F7B684AB0F092B2B085DCF84CA38414CF7290F607BF79C37EA84253ABCA8D4184D2DBE2E900200B81479E1CE8B71DCF2BD6E3C557A8E431D627BA669C2EA03068E0F7EA62C29777B22142D7A1D451BD541EF8EBDDBBA4E3BD8FFCD340E935BE7C66EFC14A13EA48134F655B0DE3180101F09D204C379743A357E6DF1268B55A9F7524398ECF3A59849A27B142239059998083E8FA91785E91C4D220B2FB17E3389EBAA384A49D89B5D78136DD2454F06CDE9837F096B744D53221127869904AC227CDF30BFEA78CC5545583F999B9C42A1184E2FB9FF3EC095B9DA0D138205C4EAC4C8C480C43153608849F63E161135C79D8B6C9CFE9B8DFD8AFAB559D8B595DDD43835033B4BBD391E028BB2A60832D9B697EE61408F149744DCE71AA11BB2B0436C1E2626AC3A27CDA293366B90B9CDE2D927855130758D3946B867192DCF3FCE9A3B9A5276E8C37B8CB136FC90A6DC22650F95E796A9886EFD3F424BE63A66DBB1041CB3D4A06F4E7EEE89F0B6D15C36F9EA010C66B332011C8888E8E4AB2B3AB5223191E1388613A0FD0F07C1B26D7CC7CDF1AC62A226454D6291B431CC3EF2DB2B2442B37DEFB942117FA247096BEAE598611B8104F37BEBEDD8BB8B949A89B5BF8E228ECA1D8F16BFEC75A02FFBB4EEE3A6D4A6087C43634D675311E72A9F3253BB5DD364E07EB4B9C84F586BA267BAFFAEFEC79E03B83B18595FE06D7E063EE604FF287004D141C1A43AF0CA7C5651D98F633FA875B4743353FB07BDE59B6567AE25F7095F1D9EDF30570E2F7D7EC194216898D910F9E295A41DFEE072CB56F914BB78CC9854129250F9874B63BB3EBE9A1CDC6EBCB0916E1C440354DED6AA818F2811DA913912A21D3961AC94A39F0827D3A419616905DC45842C8E69A43004B8AE922C8DE1E8CD0668674A7760153213835BC63FAE4F8D65614AFD74A34D42ABAD5025B884B34639340B45D49CCED423771916E18AA077291923017CA50795F3B7A3F349A3D29923833CE57801C631576E23B838A7767CA1BDA92B82AC502DB3688FFC83C09A4E40CAC31D20D9D32FA6724A80BE7091CDE9C7A6560CFB326B467CADDB9E9B7A491EDA283EFB0B61B4A1116DD859D5C0897EAA2A3FB2CD82FFB33770BF9E08091363B6B81D23E61C2A647D2BE440C5C79EA89690656D9F10B1F07942834E1CB6E2D2DF106EB6D6A21FA23819E65028515E88BD279F9317BEAFFD394EA51F8639371C3A89F11305A4CA35FB0711F5E2C7C3DD1659C790245812113204B4ED8AAE9FF09D43C6DDB13F5070D98831B2C7639FB6B9B01C288812DDFA8861DB32DC8268C07D30CF969953042B3DAD530D9D744C06AABE7A886C0FE57B09B7F42D193FB3E9C06329818251A2F7E6474462C95DED Out = 07DB4E0F124C3E6824F34A188D4CB1E2C0D8C02A7405D550E98C08E54B1523611DF4FEF711DF5CB8EE73ED7809B3BB2A0D845287683F61CA3A11E109F7AD835F In = 1A3DEAFCE70AF6F3F55D66AD9CE78D5F4D5C5F2638A810AFCD07D67E9F9A1380D6B34BE482EF030C22F1E978F544609CCE35A74C5109EE7038495B6210CDBCA8DC82C6E9E7B0D593FAD9665382B3C401AB8941DF71307DD77EBAF140AA66A1F76316478850E58886A9610631E9C722F459FA00C0B53124FB4F12778BBBA3760826D3DBA67CD030A96B654AF93F8E395F5F439549489F8161683F124BC980E6939C83A6085E4B6CAAF8BCD89A0E01ED70DB487166CC29735D9235A9CDC57B80C9C2E591DF6322F5BEDD32937073F781A30389552AE83FBE147D1B3D3461A3DF96C15CD96900C56718EAAE838417057579115936862679F5F2A45DADF65D14108AF1641DF987B57986384FA1433789F5DFBE87E90BD4E9D8D4D0741FCDA7348322B967B566B18612DBB8FE64F151947C3F7E361EE868676BCCD0CB3A1AFE046BE70057A05ADD3E65AF31E3FF414A627C0183E8FF583B41B75B203650420216E6DFCAB289665F054CFE3EA0943647528518573BBB1D0F27E1449E98739EAF0D009432DF0C1EDC1625264B94A71DB762659FF5A3A7A867F182D1F1FD34B341A4A181221870DC4A494013091A7E3B2B07E0160C438F1EE1E8A2B989C4FFEC36B5083EA427606767C29672F44779A8505B422B25A56907F565B27690D011426A62DF0036D57D967CD1D14E915BBC2691E7AF818C769D9E1F9EDD40894BE88FA1D7A5952AFD898E837716ACD73953BF2D1D448123FD1A0276D2C2EBDC760A4B787416CFAE5E963FCBDC8B551CB70F91DA0ED4A8090FEF178E879F2C34F3A269DFFFF09772D44A13D7A17468B5834C460957D5243C325F63F05F89D4ED98D361E7F0AB8A83948A64D0CFF8514841AA21C7F337920A9983E59BE4A0F1339E1E462F92DC1FC070126206012458A499A8111FAE078E00B0CA3BC1D6C7087CD318D5603C1C7E0425E6F729CEECA5F35B82F8A42E0E9B950EFB0904C5FB5C06D91D239913665ED1F1EE4B82185A01BA86CA2D3EA94E5A8842231A94C05280183B7ACA289984103F122203EC2FBA4A382E6F5236D6F68DA05E3BB0C558421F0EFAB91DCEEF6D1ECDC60F9B88F8BEFE31CDC3C2F024A1AF2C7336AA5D151E8CDA814A5FE898BADEB9DD680E337E682EBC22BFAE445417E37D2D89A338659A280AB1206DB74DD42C6F25639C1803BFDF2156DF613B0F5924D209F7F9003CE8794F989F4F27B82121210F4F65EC5A1F7723305CEE438C41F793EE04496BBE337BBD2FD3023830B1C8889C6F4D0C1192E364EDBE1CD987BA5D66224EE9C9405E1DFCEC0EEFFC5C73D3123F6731C6295D1E6B854B884FD22B6A3BBBE5395312585CD138BCA67532C6AB71BEBC6657C50DA87D2AC6068FA3970202C5E15EB7B4B3D2676C0134BCF1EAC2B26BA46930B5E660B16060894884C88BFACD6779276B86F685AB6F17C6D53F621275FAD66D021D26D1D480AFAB4B5EC75E0E763FFC45F599EA02504DA5D91EB5EFC3E4AE196F219E45E7CB05594958C876FF474A020EF73C1F09B1F7F7457E816D3AF51D86663D4D461754CD5E907456691E02446D6CACFD33516206A31870543D574592087773653D4086C2BDCBAB3C9B65CA11AD0D4E58DDDA8B440309989857103929549B7300CED42651D4086661694092C42875CB62858E6D1BE5F7274B4BCD83AA4DA05CACA186A30902830790F9FFA24418E1F9DB00FA40477E83B05C2D11AD7D81DDDB1E31F94A9DD5E9E13391C22479B570976E3AFC1BE41086D3BE6689D87CA4326A7CDE8E5B396A678D3CDB2C80FECFBA2BC799AE8B1528E96D880CD098DDE910D097EAAE660AD4D7EA51C18F18AA1B39614299A172512521DFD231B9840909839EB69C892EE23F1BCEEC1FADBA75786C7DED93BC9983F74CEAB397EB8BA84F7E4130B34258D628594A6F9E2348FD91BA2594E07B8057E8A2AE3ADFEA0EF919555385977041C5B6DC4F3880569171F7217AAA9A85F2F5BBDFE3FFDF79248F2A35FD4DEC34980C67290339B1C0A5A6AB8838157AE2F5140B4A24924A6688AE5CE72A48103EE9029CE8A0F15B1FBB19A12FAAB80A7CD9C0E389FC2775833E3190F1CF735ECDFE7F6B6C326506AA82613CBEDA8DD3691B81F4C1E3B0FC32D7E6719CBFC12F4A26E0FC29D6417953ABC9568DB4ED9A294B9FD5F2A666DDA546ABA301B1C60985033953EFD6F4538333B5C7DD3148814A3FD7927C366F40B3D7ABBDEB2332DDB586AF80959097663CFAB2FEECAD6D368AE10EFF9663D5F8BAB95935D25F45776F7F04B46817D05165A9DD4770509ABB92F8B9E7373CA780703569981754A51D6D376D65C57F55CD70E2DF5FDF5A6B829AE30CE3BF942815C8B4BE858DB58151D02A68AAB9FD373E047EFA51BD1A0CD1B61744D9E97CEBA3334B3BAAFEA3BC9E43AE097CF2C3D713EECC247FF43EC74D54907D8BF45E45B2E0E11D82B126A8179D3F66C055E11F69EA67AACC5FEE8AF01FAA379E51998F5070F9EE0FD30A2EB22A925586FB1B39024EB5EB1E127C76A149E7F02AF1B73C16E9E5A5DBE378E08A9FADF1194C625132AB3FDEFE8FE9A89BB8E0035A1A3AC5278F5D3D0ADE0E41C81C6853A41C4AC45BE3F68180FE23F27F18BE2E339DE1D559D75DE63ADF7A32BAE42B037AEAA3E123A5314891BCD35CA48D57DF4C17540E97202A8EA1328DA25B1FD6BE2B56AEC1E5DEB209F3B7A13ADB1CBE53EB645956E577A7621D74E42376D70BC5C4AACD239A852FBB7B3F62CF59FE10438C1DC8E1E46566325DA0CA43AAA63FB7E0B450A2DB3E3A2204704D894DB24B72B3078106E096CD543DCF027650CB4965E38AC36A8AD588C5962B4E26548AB88F0BC20E10ACC1C3FC00EF415B3C32499264552B14E2C0E789A3B8A8BFF9620FD939D0B34E806177EC696A4B3B1CA4B32BA979B2690CFB3A6B17BCEE6877FFCE757E4116DA01099FFE82ADD5A0C593E73449A96DB9CC2B9E846D166B095174F2CAF8B35DD878C836D9BB6EEEAF8E1BC5D0E149C739828CC480D731DC16B35B80D4AD82ED7D29BD05018239EFECF8DEAE180C6A459DBCBFE4AAB9A5E2C1E1BC31418CF2EEEB31FDF8BA02C9A91525E9163F672BAE2EDEC38C1BDB84EA237B4EF86BF5C0F0FFE178E3761E82D94F66E5EA40BA8170BF768409E1B4177AAFD9937BCE3FBFF590320D7C445372463FBBFB34F57447F42C16E026F179CBF82F617C86D1E8D42F6C908F9C6B77E38D25D51303DBD781FFAB569B4CF31FD0B947C45E1768A2E9DFE8369F520DC38D77937B69B821DB4FFEA8F50EBC404F0587B5598189F54B5A5B98966FD16801C87DE2C3C7813DD70DC600824D426D88C55E89D47214D59206A7A65A65DA7CA2E42FA62ED17E7AA5B3ED446BCC71F17FEC8593BE96D2037BD07F9476D4D732B32BC5DF8C921316B45699004716FC89F8D45BAE402C26DBCDF1A340847B932FF882DBEAFBEDD252E126C89A1E1FDD8908A1F67D15D8E432DAD8E08E950A3BC46B96CB89CC5BDAC703B3FA3E986EF1C6E7E6606E6845BA1EB2FBDCFEE744B5E45206F4A419E1CB103C8490EB293EE9AEC1F0A0D294F9D3847737413D30873F3C94740E8FD072817815EBBCE3F09EDEC9D1211A9E99547D620B2EC56C89E9CB8144AE9E46636324BD13C6CCA3AB9CD9FD8F7F937ABABC598232384427A2D4CE0CBF9765F7225E208C3CE128602B0AD08A1BAAB77EDB3111F0C6CA7BA0EAC9D89D5B4378EB82C17F6EA08308A79A53D150D3F85EFAB77294F02EE0E2885EE2AB2793392B87DB11FA77992F5B4FD75EF2F1A822E87407A4878894215AB89B6CC4A120F5A78B3C31AB80FFCC9ACEF53FC6F7F85685EB9D56D30D87C21ABBF1652EEF8F32C7C567BD1F08623B09C29F33561D42727A5649A3850071AA6C11735AE63C4FD31559CE560B27A362786A83353FE460B37074664A9421D3B2F6A864D5ACA087187B27E2B82F31CB3DF5E985CEA271C609B94B4E58356D40C7D5C7FF2E5990FB39588154843EA5FCA92F120075D4C4D006661A0FA1B0585454BEA725473EEF7D58117D5840C8348999003736C5EEB7858FFD273A1C3EB2812F5697C59110275B08F6BEFBE84C92497D5F73B7B6F794A849713B23AC5F29D5C7112FB2E7A6E89EB54DDFA3122E6C79624C1BF25EBFB9FE5CE6DAA779F3ECB2984DA42F8C6ADC77B21DD291E684FCA50E46070962A2D4F00813D8DE1B8ED33FED9715180C7EA8E2BB74FA65D9C7F6E142F3C81CDC59172E1020F62F65CA5A12CF2BED9DEA04A4D8CABC2948F7BE823A3E792625275B3925A6C8D8E2B428C75A5DB0F7120278CD7D6CAB768755C7FE2FBF89FDED1FB38AC7F76A2F8798CA36ED42CB7C07F006271205F546A4812C20077F050D4CDC79459FA686E97F0704B7A9FF7DE16318E862C53D361BC635A55A264BE15016545DBFCE3C6D6849576ADEFB6884EDD768214E0B438B0231B4F2692C2C0B5C177674F8A0DE236EACD9E0CEC7C8647E4E9A5861B957EC834A2F8572F01304C3FD6A06019E5F1499B62BAA8670B652467FA9A4F10F053263BFE9743CC7D933F86136AAE3A6FB56754D7D238397A0030CEBEA87CB255AF36138C373DBBAC41DD4A697032E4796C552AD9C9B3FA713C3A4E09E0EC5581E94BE7F31065157662F9E9C678B1EF1B8B8A847C51789C22B1841BCFC855820AF3258AF9E08231090B45D10046A00178E89BD515616B8A44E77BF57795DABAF40687B2CDA7A5014168F Out = 7A19EAC8B081B61CB51390E737406920414210BFE4E07BC3198651365193C5435B5147F99602132DD0DEA9EDB10A6F93A9AF28AE0A10320D7ECE88B325FD9F5C In = 1633256AB03B20CE079196B708A1C02D1B6072219070712C8589EE21341D50752ACB6CFDA17E982D828BBD6CDF54BC7232FD418A323D64939928597B9B52F07CF488250C5E42BFD3AB48012D709F8D747225839296386FCE5FC5AECC4BA7A1076D089DEA8ECEFAA0CF66FCA8602395719C12A04F929321784D7AB8239FCE2FF3BDAE046A266132B5C2AD9F7261F3014E87B389A6695978693D9371D0B1FF9C405F338C2FDE4687359603950A54CF4B9CDD9B24480B239ACC5405C14C886BBB0378391CEF0662A38882BDD09E3866AB9A66CFBD28EB5EE4F8009BDEFC4AEB16700EBA7DC557B489190A71FDA75E85F7EF841697F70FFD4FEA185E7A67C81C5B8F273BFB97B2CEF695C1C74446C4B425BE6B2E66DC0AAACB247E4467B7C7D84EC33B6B5AB8FA1979F503008BDCFF948CDBF1226B1B066CBCF34797298F3BA8C60FA01E0AC8B803223C656112FB91435D75453BAE4707B63330467DD13E0A4B992E6F7E46995899A2D95D23F4AC3D0802B2A6E7D024DEA19CA408C4BBE053F14C9CE264F129724A18BCB18F385B1CA091A11434EA96D98C8D0602E98EDC8DFA14141AF93ED0BA66E885E9FA108591AE59E109AE34D6B9F5586E4B4D75E7DF7C32958A65E88A9BAF41082A0A3F11539DC4EA2CBD9E1C6C3C439B622F1DE574FA75470C8C939B51D2D1C2A7204B859881D43086BFD8FB90346218D099C5AB36846F3B98A7C847318BDFA01E09717943FCD864C5A8A17B6CEB89D98E872D388F20ADC2BE5E2006846904F41682FB1283214F3D20DBC9FC9E0FF571844A1282E88590D7C085B2C568EC5ACC4462B389FEAA5757F7033187E2DE31955FCE55FEDC909255048B327CCAB2E582BBC9D8054BF5CB45145C7D3A3AF9CD5CF6ECBA490C634ECF00E646BF95E8642C43A4978EF08A574EF1F78F6CE57C3B34B5A123D123617FC8EC9B2AC0F9B70A7F6062D38DD7B8E9FB4ECCEF13DED5C0477483ADDAE4F1CC0CFCA274B1307ED0DE72FBCB819154CDA897D7575213042615F1741A8CB646A39F8D134FDF9E60E000EB8220F65CC30F5FA52C431B9E3B6101B96E25B8D0440B96E572A18A01747C02AFCD7513542F7AACE194632099D16274F31EBABB60DDD94FE43DACCE900EC0902EB5E686D48ED8D09AE63DA0E15C736809903A0297A92DE84E0260F11F446E1FC448E0EBF59FAEA3C726F97925C57CBDF85B1F77078D36257C85D56CBBEDCE180FE12B687ADA2DC9912FAC60334166BD2CEF06B089ED5C9563844D71D8FEAD2F3A93F3C07C52537336A8A70BF5B596B9007B9FDF2D082000F20E6B70D2A7E6C7ED27C4146895A6D85A246F623C1B9258A2F891F823ADE4CEFFD59D4FFAD077351E2F506E9A5BDD3900F0204B9E8969AFE72F5DCCB9CDF986D197AE4C4DB53014041AE6221B750E5290E307AD292C8DE6B899235212EF8CE954785537DC9435AF11E0F3427A9C7B22EFA752EA0B7EADE5F6EB4093BACB78676E506698139E4F774423B8942166F9A7D22480D814FC0AE19CF4960FBF6E01FFA65C8DA5BED4F1AE2B9ECEC5BE7B3C38DD4045B0C93EE6CC77A7E61E85D331B23C0D164B104518B3405497054445A353E9B48F2AC5E8E96298D6655614336CFFE6D8C9C915E387391519AD2632366AA3BC935030FD12927EFCA17505ED74C94650C778539004854DF6C24269AAB9C273A493D3E5B0B1D687C33C2FACE46B4BB3742D6DF743D09164D2E0EE7F6BA128BD5FBA2E3B33C199AE80FA9DEE3AD811D02BAA3D42A6362B2AD47BBA8A2C5CD00B46CF22CFE367281488A4852EB8B7FACE79F0CA6F8E78D32578DFEE01711C4DCF3C26D0BA13F3075478E708C5C5315AFDC2E4C0062D16458213BEC506A9E991A61825FF78DA9BA1BAABBEFA56B4A8C9E2E7B60EC4B7B541C8E0F79C86BB5F03F736761A37169B2AAB8884EC6EA217B02C59035F5BB327243D126B78D4AAB430212439B5A75B80618DAFEB66AA3AFF866C4DAEE47D374B512E74ADA933EF24A841BA271C6F02C870E8AB950FE06E93C91DF0E99165DC01BCB190E411ECCD85358FD4A88127A22E4CF4266A90845124BF97B25D7B1C46D3A0D68A684F84E2A638C692A52CB6E8C651A3AC492B0460004073D5349E35552359CA37660F77B2770D6B2B3F7B1922424AC4A8598B4C61A6DB507608A72A6A7D573CC055206276E14005A28A0EC41F28D7E260611D40F089FFE5E529375691412F4E9E12E62C3BE2C563C26D2444EA9C69E6C935FEB4DC4E802E5FE3906F8ACEF4798D940C3CD574BB5E74506C3E0B70CB62454A25F589EADB6B0709FE3B50417CD1D98F08E08B7CF68A04CCCF8D6588F9FC2F31E533CDA6159BAA4297FA446450D71C16EA2324EC09773E7C8817ECF680ED12F64A04863EFE3D9D8760F34DE5B0860B3991FF0EE5EDBA22C4D69120DE19D5429E4AAE91C9E7CF05CC807159A58F13B480872AC1609D87E7009DEDB71C09CEAAB640A2B6135855CEAE4AC2954933A0255B425D9FDCD9C246F82AEB7C3BB78C6E73E03DB7AEC4245A28693FBD36EF4938D59CCE19EAFC00671A0851612406A075713C5D1154D8E13B59B7C5B0902239D4BACFA386AC817AC5EE02A181A9A47C622B3ECF287E14843D452AF347110498A620B34AB4E116308D976062C9EE9CD35DB6CB79805B93AC9A15AFBCB52F1ED4309879D1924A4BA190B0B86E60A516E77D34B4E0A49D4EF2CEF3CC2F410FD8EC901363FC9EBD75EB460D4D8910BDF27CE26A8B4AEB94F9F76242401DC35D0644842B99FB6C439B82D82ECFE1AF0D01F9BECB15BEC83F13B260F7F714AA381032923FDE8F8018F3518547451435C9A5207294D08A907C73696F6CB000745E072E25B73B3EE11595433D27A1F11468686F08094F1D31F5ADA81F11F0677A29D72EBB2E1C4792CCC607CB938647E1F153F9EEF03D982595C631E49B6B7C1FA003A6EB8D59CB8892CD0888B05240F12701753F89007C859515A2FEF944BC60B36003A26702AC6FE04D2E942978FC31A97EB29871D6752399D3521720729007B6A7215A4282B2A4EFC2C56BD129E74C9B00847692B96FCC71CF7A7F19F3FD6B45C519FD73B4860880A2DD74E5727B31A93F0A87F0078155344AE9F7BDBF00D83393B634B5DCA88A398E42C320EB95C4A826ACEA90B65E4767B2EBA748F97C247568393E2FD3A66075CC12935B6D7EB5C2FF5282185CB62C73972A37B3CA508004B4F796BDF82B83B5BDF90D6BFD32B5089B0CA2683DC7FB2337DE42E650ED911DBEE1EF98257F9BA5AF54B1A54B04C0087A5A64BA779D86461BA15337C2E7D4955FDD777A025DE226306A17C384F1C52CDB5946FB0B46DD5C13BD7A55FE2E27E4C6D40D61D6FFC024468F8EDFC7C7992DF5DC5D05063FE723199224F53678E48F25250EA28BDF1089718EB8B730D1C06735C2F871164E2EB5E885A8DFD2A083BE97EDC94159CE9BF75D2433F1D782762F771903CBF9A1C9D13F710BA0E151B079DC0A8262BCEB1DBCBBC0F35DF6EECF7BAA7105B9808745853C96B4372E95E482035916B726DAC7BE95A72B19DAD48DB1B19E6EB2EDAB5AC1B3013839E7806625ABC129F41813E6D71EE4AB2040D81E42E6ED73ABBA64FF2EB433B910EA7D4F5ED3D8D27D39BB454EC019DF6114F544D7B155549D0C56D14551FAF353994A80F30F3C97E863A4F2AF316468A568038EB4D799350A6FACAFF90ECD44E0F44EFB6DC42EE4B0DC2C59EA9C1827326DF08C0A6E55CF4F9C3EA0E78CFF3635F5D08E44F1400D20F638D56BA84B4832090454DE57EF04B6C8805A36F63E5CCC6E830C87FFC164647CED20E4C486D09DE7A5F9E4B68D5456CDB22B0DDED2B95B3BCAE529215C2D25D6823C7D66A4FAE0A1E9F022BA5663204F2314DFA51A1F10E11D6D62A8BA6C28B6AE7DA1DEB5B57F2B65D7456059AD9F03DC5A524054DA39DD100D74EB657DE219795E3C45A0E4C762BA22F9DA9D8159E425A1EE783B4B22C250D8894CBEC706CE16D5CA393404FF478F141BE7CC69E45B077BA1955F1F49EFBE4847C795347F703300F672334F490ABF8B644A34B56DA00EC45A350314B9ADF27CAF7C51CB7DBA0C5477E7D37662F4F23247BCB8F7DD5F3E9CB8BDA40FA97568832AF0ADC68F71422E412254A6BFC8943BB465B01FCC8DE0B957677C78BC1F7566953E9D2446239F602C682A521C14F741FEA98C7E27AABEC339B6F5B94C78287A894AFDAE971F8DA7C7E4A4C92C8DA47BE82DC2532EC2DA9BACEDD2BE6DB2B2FB34DCCDCB34116507376578CBCA105E5E443BEC0F2EF23BE34CDF862EDAB34F0FF21335E3ACD92F59688B419F824EA61EEA82BC80E3463452192377131BA51FB0795E089FC077D0ECA8012E58B0637AD7022206887FE9EC00EE5DF7AD2E26FE819EE35C7A179C579098AA3DF645D9064CD557DA90BDD21F871CEB048CA56DF9653A10ED60F5E9F0ED7F8D89BCF5C22D1143CF44718FF2DFD8E10CEF8AABB67D2305F18177C1426BD4CD03F2625E459CE905067826A214E08E56D8F9455593E6B324E72DEDCC429D3BEFE2AE0599E360DF95E80D453A3A849E48389FA745635BEDE30E7932DE6A3816E31A2217F98D5E40238963D0A36C159FD4EC32D8A5CF59D433DEF3378634AF6887FDB3F3EDB96FC8840FE1B538C329674AE810E8C8B2B46DB208716D38E9D1AEAB097068AD83ADD7DD2647839B3A7388B0615BDE26F8692E9C07D8ADECC2A875203C3D3A9C6CB1D7D06307E9E1D9C3BC536DD8EB271E9A2159C904E61E8C9357FE759F36366AEF5A3D14CEE82913CD2708AA6069369CED763C8E830D70924E82E9015C2998E86EFC1DCE6AC2EBCB49455542A6D7DAB265AD6D7381FFEEE1AA40F8FAC0659B6FB56BB03CD8CAFAACD48D13672F7D524EB9684CFED4DBB7476E99149C28EC08F33BA6AFF839AA178F86B8EEAF1739C829177BA78547AD394136AA3FAD451A11E9642506568B39668B2436610E06EA45FA11D04D3759B033B5382645F15B3C39270B81B80487643913A24F2F1C1A1ED57C85CCDDC8CD6D59B62FA67CC80572968C8FD01894F0153634C88792A7C4A407A4A4CE46CEC5FE5D2569F95A27DE242444EA0C715B357518CAEA23E767E8545983F0D3A4DF66111B4AA1D399CCAFD796D7A80E592D5A51D2B3F60B5B04F8D9C009CA56CBD4DD84127A29B72ADB7645FB7279C9818B2B43963BD605F45B6575A5E2E369E0B401F5EC10EC703F1179B0AB9D4A89D6F096573952E513827364A84D38922734137E969D8167D6959B70F42F2BDA37E4C989ABAA8024C1A84ED6BEB74780927F78B32EA736B9B2B4A795C355C0319811729D9CC399D23519730338D62E16E5035FC52A817090703FE776D65EF9FEF5BA5F4FFEC3CC8E9EB2E312C50A479BDD4E6AB0A56C18C2DF69ED408417BEE28BB41DD13F8366FF6EDA4B34090FC9BC045271 Out = B3A3DC375B5230EC57B052882F13500D61BDE3FCAFE65AC7EDFBBCAEE5DE7550E93FA9C4ADB6B44CA3A4EE9E817CF456D595252ACC898703E45213294831C47B [Skein-512(512,Test)] # This was generated by Botan and has not been confirmed against another impl In = 414243 Out = 3D2AEA7C3724684CD95FA246D6D1B951D82939400BFADF5E10AA86978BA9D07F2DE2323774369F178D4D8224F5C3374B68C0A99A115B639C129B9F98E05012E9 botan-2.4.0/src/tests/data/hash/sm3.vec000066400000000000000000000771031322470703100176150ustar00rootroot00000000000000[SM3] # From ZA computation in https://tools.ietf.org/html/draft-shen-sm2-ecdsa-02 In = 0090414C494345313233405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A20AE4C7798AA0F119471BEE11825BE46202BB79E2A5844495E97C04FF4DF2548A7C0240F88F1CD4E16352A73C17B7F16F07353E53A176D684A9FE0C6BB798E857 Out = F4A38489E32B45B6F876E3AC2168CA392362DC8F23459C1D1146FC3DBFB7BC9A # https://tools.ietf.org/html/draft-shen-sm3-hash-01 In = 616263 Out = 66C7F0F462EEEDD9D1F2D46BDC10E4E24167C4875CF2F7A2297DA02B8F4BA8E0 In = 61626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364 Out = DEBE9FF92275B8A138604889C18E5A4D6FDB70E5387E5765293dCbA39C0C5732 # GmSSL In = 0090414C494345313233405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A20AE4C7798AA0F119471BEE11825BE46202BB79E2A5844495E97C04FF4DF2548A7C0240F88F1CD4E16352A73C17B7F16F07353E53A176D684A9FE0C6BB798E857 Out = F4A38489E32B45B6F876E3AC2168CA392362DC8F23459C1D1146FC3DBFB7BC9A In = 0090414C494345313233405941484F4F2E434F4D00000000000000000000000000000000000000000000000000000000000000000000E78BCD09746C202378A7E72B12BCE00266B9627ECB0B5A25367AD1AD4CC6242B00CDB9CA7F1E6B0441F658343F4B10297C0EF9B6491082400A62E7A7485735FADD013DE74DA65951C4D76DC89220D5F7777A611B1C38BAE260B175951DC8060C2B3E0165961645281A8626607B917F657D7E9382F1EA5CD931F40F6627F357542653B201686522130D590FB8DE635D8FCA715CC6BF3D05BEF3F75DA5D543454448166612 Out = 26352AF82EC19F207BBC6F9474E11E90CE0F7DDACE03B27F801817E897A81FD5 In = 0090414C494345313233405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A23099093BF3C137D8FCBBCDF4A2AE50F3B0F216C3122D79425FE03A45DBFE16553DF79E8DAC1CF0ECBAA2F2B49D51A4B387F2EFAF482339086A27A8E05BAED98B Out = E4D1D0C3CA4C7F11BC8FF8CB3F4C02A78F108FA098E51A668487240F75E20F31 In = 008842494C4C343536405941484F4F2E434F4D787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E49863E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2245493D446C38D8CC0F118374690E7DF633A8A4BFB3329B5ECE604B2B4F37F4353C0869F4B9E17773DE68FEC45E14904E0DEA45BF6CECF9918C85EA047C60A4C Out = 6B4B6D0E276691BD4A11BF72F4FB501AE309FDACB72FA6CC336E6656119ABD67 # this one currently fails for GmSSL and us #In = 0090414C494345313233405941484F4F2E434F4D00000000000000000000000000000000000000000000000000000000000000000000E78BCD09746C202378A7E72B12BCE00266B9627ECB0B5A25367AD1AD4CC6242B00CDB9CA7F1E6B0441F658343F4B10297C0EF9B6491082400A62E7A7485735FADD013DE74DA65951C4D76DC89220D5F7777A611B1C38BAE260B175951DC8060C2B3E008E3BDB2E11F9193388F1F901CCC857BF49CFC065FB38B9069CAAE6D5AFC3592F004555122AAC0075F42E0A8BBD2C0665C789120DF19D77B4E3EE4712F598040415 #Out = ECF0080215977B2E5D6D61B98A99442F03E8803DC39E349F8DCA5621A9ACDF2B In = 008842494C4C343536405941484F4F2E434F4D00000000000000000000000000000000000000000000000000000000000000000000E78BCD09746C202378A7E72B12BCE00266B9627ECB0B5A25367AD1AD4CC6242B00CDB9CA7F1E6B0441F658343F4B10297C0EF9B6491082400A62E7A7485735FADD013DE74DA65951C4D76DC89220D5F7777A611B1C38BAE260B175951DC8060C2B3E0034297DD83AB14D5B393B6712F32B2F2E938D4690B095424B89DA880C52D4A7D90199BBF11AC95A0EA34BBD00CA50B93EC24ACB68335D20BA5DCFE3B33BDBD2B62D Out = 557BAD30E183559AEEC3B2256E1C7C11F870D22B165D015ACF9465B09B87B527 In = 008031323334353637383132333435363738FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E9332C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0D69C2F1EEC3BFB6B95B30C28085C77B125D77A9C39525D8190768F37D6B205B589DCD316BBE7D89A9DC21917F17799E698531F5E6E3E10BD31370B259C3F81C3 Out = 4D38D2958CA7FD2CFAE3AF04486959CF92C8EF48E8B83A05C112E739D5F181D0 In = 4D38D2958CA7FD2CFAE3AF04486959CF92C8EF48E8B83A05C112E739D5F181D03082020CA003020102020900AF28725D98D33143300C06082A811CCF550183750500307D310B300906035504060C02636E310B300906035504080C02626A310B300906035504070C02626A310F300D060355040A0C06746F70736563310F300D060355040B0C06746F707365633111300F06035504030C08546F707365634341311F301D06092A864886F70D0109010C10626A40746F707365632E636F6D2E636E301E170D3132303632343037353433395A170D3332303632303037353433395A307D310B300906035504060C02636E310B300906035504080C02626A310B300906035504070C02626A310F300D060355040A0C06746F70736563310F300D060355040B0C06746F707365633111300F06035504030C08546F707365634341311F301D06092A864886F70D0109010C10626A40746F707365632E636F6D2E636E3059301306072A8648CE3D020106082A811CCF5501822D03420004D69C2F1EEC3BFB6B95B30C28085C77B125D77A9C39525D8190768F37D6B205B589DCD316BBE7D89A9DC21917F17799E698531F5E6E3E10BD31370B259C3F81C3A3733071300F0603551D130101FF040530030101FF301D0603551D0E041604148E5D90347858BAAAD870D8BDFBA6A85E7B563B64301F0603551D230418301680148E5D90347858BAAAD870D8BDFBA6A85E7B563B64300B0603551D0F040403020106301106096086480186F8420101040403020057 Out = C3B02E500A8B60B77DEDCF6F4C11BEF8D56E5CDE708C72065654FD7B2167915A # random (GmSSL results) In = Out = 1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B In = 8F Out = 2B6173F01B9002CAC00EC91C8B481867C2E35BF408BDE154D62844DA1B5B6E18 In = BF23 Out = B49515E07F9E777070D725FD49D41579D263CFFB4EC3FA65B93C87B473D91CB9 In = 7A9719 Out = 171E937ACE4B4E18FEF1EFBAE2FEAAA7F1022F722FFC82155A24E75AE4AC4B29 In = FB39E8CC Out = 041326870D40091C58CE7A252458E86CF19664CA6AA7E11DB8952329B7688A1C In = 95AAF89FE9 Out = B2249A453544CA8699E07B369382001E8D741C76CAD673851A4A25BE5C1765CD In = 7688740E973D Out = 5AC22E272E9C6E7CEF2C17178302817D865CB178C6C04B331B0E5EE61C2014F9 In = D7B976B5F139C5 Out = 667509D27E794D11621817E993B8DA4ACCACB3F83A719E635E0EA455905040DE In = 391B4861669A3DE0 Out = 911B051B02636A5EFE12EC8FAFA3B18D55B1AA6C4BC9E07789B2D44470B94167 In = E71EC750CC768837A8 Out = 429DEBAA692B6AEB85AAE6666ED2F8C206395D6A87560699DCA23D6035918B28 In = 898FB851BB90BCEEFB6D Out = 140F2130D810310C5D0A988E9B380678031C4A9050AABE1A7B5603A98F452684 In = 7D33665E8EF4F522B55DF7 Out = 3B4C28A7BD3AB41B65525F580EDCBE1A308C3FA09D821C192858A349581CA55B In = 815E16C63B984946C07AD55A Out = ECC8181AAFFC4DBCE05C8AD2B3544BF6838791D6C9966DE2996318B33EE37B8B In = 87EB36F4116F4D2AA05C9D2B56 Out = 5B617C321F8769B5227BC02471C117F44DFDF816EBABB60575D07EDEF1F880C0 In = F670D1ED03316874263B039CB53A Out = 911048C7853C404970A9230FD997A95B5B4A00FF74A8AAFBBCE72B4F9444DE8F In = 102CB525FA7E0DE28EFE6D2F2AD1B1 Out = DDC82E25EB0CAA33EE7229A12AC69A7B9B72345236E835857E81BD2173EDC532 In = 74C2E33D49E8C2A5144E82EDC04218F9 Out = AD2B435CDA7615F0AC367AECA843A69189B665552233F4804439090F86F3009F In = 706C9721E103771B688E97636AB26B412C Out = 78B026963E21183970483449EE9272A877A2254C89C63F0F6A0B4B86DEA1DB33 In = AC24DED9E54844B3E0CA037EC1D0F8103FEC Out = EB46D32B15EBF5C5FD2AF316C9717065CC21376053945F04CB6F92D31E1666E9 In = 1B39C5A77A7CD6D538C3D2D1079F3F5338C620 Out = C1761751AF06A5BE5233BD7A8D6FC497FC1EA3F36CAFB988E457F281615BF867 In = 65A647B8DD26DCAECE299788B13AC05A0E71C577 Out = 7239694C9B61CDF9E62D5D48BAFDC283F2041A9C0845E0DD975BB3A8E5A01198 In = 98F13468FF3C69382495D34BA12E1E4BD895BEC29A Out = 6B70357406F59521BA34F961AA4C7D78A088DB325595D6267AF5D499F1D95B1F In = 03DE8240C26BBAEF801D579D2F2BE849FFEAB779E056 Out = D98DEA9C0A614FB689750C75FD4C6D5E91447104F8F563DBEA1F50602DA018F5 In = A733F4ADFBE6B110C1EF6FD3599B680A6FA5644FBCD073 Out = ACFAAAD49A8B94D1DF81EA951A30EE2B899FBA79F60C452F63AF3C79E1283944 In = 1CB083E53C6242D1DD62510CCFB3D5496D692B8017023BAE Out = 1EC1F230391A74818CF79B24C9B4DF63F0A291E317EED70990C65EFAD9B5AD33 In = 6A8000BAF113DDEE93437CE36C9B28F69F0DF4A0500633EEAB Out = 9AA7E33E6D4EDC5E487A4A15B9BFA013D167D256AFD86DF7770468107DF19F87 In = D2D424446F9B2B29EFCF93F2DA96208A90A39FB0DC7E46AD8F53 Out = 6F5321A4BD11EB49DCFC9214D1391FCB733BEDCA2148F05A18AFCC3D141211E6 In = DB1BCAF89851CBCC847347EB4B1D0C40EA6F3E0DE1853D713704BC Out = 6194EEDA953C297C20EC9876E4F0D51C44C1CCC4037CC90E6BA184572C84EF2F In = BAB74A186887702204977BCEEFB1BBA1D52C9C58667E7FE0E3F4BC19 Out = E715A625D3D1271F8A3AADCF215F91161C1BC161BD645627B78C707F0C8B3B3F In = 36CDC511B3082AFD547F4331298F879AA742C634C10E0263F80EFDEECE Out = 4C77EB46A03CC08C37EE567127C0BCE8F952BA5FDD729FF6FC44E3FFE307A507 In = 072BEDBCBE5F9295EC6A2BF22490D984BC7388FE99035916C1262E8B592C Out = 6A1AD547946C39BB22DDA3DC8B861010790D8CEBF4CF8DC3C9493CA8D4C92F70 In = 6009DCED63EEF9985DA162F1BEDA1B56E0C17D51119B1AAEEE7B28050BD1DD Out = 8ABE85411E3CE2C2A2E582EDA291D45FCD3A4A5CD7E1851A7E67A49FA2F3BA9A In = 45DC649B6C57A9E21E9B069D06E12729B80A62FACD901C6E9ED10C38BA5C2E65 Out = 355422A0C526088B16C5207D1ADAD939CF9642150EBE110E213F23884F8DB789 In = 8D8AC08987FEB09407263BC7CD471911372F1DAEBE2C879B258C0EFBEF9C544ABA Out = D730E1A1482889C9F4F2B661941C2E1EA6A12F1C78E70908DF164B33C6226DEE In = CAFB786E63C6C4D5103D3AECA6299886B24B786361C03036BAA3CE3DB6BF3BDCA67E Out = 68B81461292074B7B949A7D8A401CAD6C843633EAA25FE8E85F605E7988BBB62 In = E4EC633F7A1F46C75CB75C74C9F37EA24BC8AA5887BE69DD62FFC9B4345651E8FA9A49 Out = A917D4574112F0FF3E1C00B3F4E302AE03D2B54EE8894CBF924936D2EDA27438 In = FEA3D74BEA7E23C35BA395D05F2A92414CDADEDFA78D98B66CE2D5562E6CC375FF1D7986 Out = 2C1454E32371A89D28BCAD57E06F78A2C32EFFC35BA1F06FB1AB8F0195674CAF In = 48227871EF6DD22269CF7175BB6E8865CB00747015D6E1484D77F9A6E0178702188BFC4CE3 Out = 4AD187F717078CC5151CFB7BD620B7397BF83B2AE8F48982550EA8F6CE91ACF0 In = 925A12C519BFAD3D9107E4091470984696FCB39034CA2864205D3C789BFC99B98FEAD7641D8A Out = 298B93119582BBC6BA4C7600DDA4529FBF95CE2C85185DC81BED51E4F2E43D7B In = EFFBE040CFF6884F80507DBA2FD878973534E30C78C781941B4AB3E92E5E6DDEE43C58CE0534A8 Out = 6CEC5B724F6C7BFB39F3BC39761354E9101E74D33B7C5FAF5A276172712189B5 In = 0F05AC77E8F3EC02A963C317DB0EAA7DFCAAB5E53778B0D084E8588E816A259797F17F30A359F944 Out = 78691973567040980019F43D1F849F36D22CD4DC892B2F78D2EB486711E46F8E In = AC0DEB1007740DA8454BF811CC5CDE964A7C5A2F23C7CFDEB973003ABA4FE0D3A00D2F072023B03A48 Out = F99CE704217B75A6F9A7973C2366E8024F803CB45BC951397C83F597E3604DDF In = 64D0A5B549B0DF0C7853CD7E828386310ABD66BC0AE2B3CF6052334D934637578522611AD8EEEB4516F9 Out = 5A51318FE4208F36EBF5B1B5A4EDAE1898EDFB127F888E0A8CE74D02806A2D7C In = 2218D41A7A2042F5D9171018941D3F21FC98E28011F5990D005BA5275052A45AEA443C06F412BABE72644E Out = 29F3E102AE543F246494B824B773B6F9DFF27010139AA18EE31A4B73789092FF In = F045E55868E517232F4ED65CB93D284E61CE37B4B8F2BEF143670ABB6D4A6BFD01B97D79DA5CE282EA481C61 Out = 85134D76CD0807BDEB81C146F026E3959E1D4C8EB25EBD1E01B58646D8B88AEF In = FB31D05DE6CBBE99439A8886FD322D9BEAA490CCAAB58EDD88F80B595AE5F945534CCE79A95570D5AD415C15CF Out = AB61CA446F7513B1ABAC7DCAE506B7F132D6904B6F28B3D40582B4CF3A4D3E39 In = D50B13F45CBB67405B6E970B45EF39E4D2212F95350C81A32ED01D6D313E9AD76F3E832C64133F4F71FE9FFDA640 Out = CA4DFDDABC5CA39C7E180A78493F4BDD9E24CCC41FEAD023154C4ED51AA3949D In = 80614915675003AFA0692E328C1390146C1FEF619404EF22A52CB02A9E1B6EDB37FE69349B2E3C925450C93393BFAE Out = 4B4A1E12D62B0FE331E89EE5B4275B9CC15083459761E18A6B24603A1C481683 In = FF5818BCC88E9D421D1BA030450BC968383D07E5FA17567A34AEFF1363C35B112081DBF8782FBFCF7B22D4BF547F0EDA Out = 504E22B30A52ABD5D8BF00D3E435CECBCE914A69E5652297C24C7801C89446B7 In = B0B07AD69494CC5381A36915445E163F56F7BD3FFD2A4DCA79CE8D971C21EC79BA4259C31D00A9D5DD8BACE8BE351B33DE Out = 13D92F108CE8E3C29C70B55E7A04E0291EDBEA486F3CE0CFB4A9A5E315DECE41 In = 0B82F7A1CD313A71C6F56236889E400B0EA1C88A25E69A7071DEE93853DCD47386665968C4536095CF2196FFF24E3A6B2854 Out = 3253522FE3E1FD9383CDA8527068671ED0B6DBB1896E8D137342506E4BCE0922 In = 9EF5632D6672FA3B311FE6C90D1B7B8E23C1A73D469A7A78F2103FBCD8EC91DED16449746DB1419795FC48C4D37A27E66D4A08 Out = A7E328AF93AE979E106AC22E1A91AFCFE268FBFD0563F3498AB29FB7C397E6AB In = E4914F48B0CB06901007332B69A6AAE40ED2329E25DE9402AC6266509326A57BAFEB94815CF77D5CD07EC3E1B9B6C3DD29F4464D Out = 9566ABA4535776D9CE6C831D817297C776B0036F53B81A35375BE68AAC10903D In = F1E4074DEB7985DD6DF88CCB056B68155081DDB188007EA0C4F8CD2062AC2BEF24DF4482216DE138D5C0562D2B03C10E296E39728F Out = 8B55A7225C061614573546701642BC0151DC33BE3B841F8D6E10EA32F1822575 In = D10F14138405FAD5B9EF771ADBBB0AE7A8B7451666F558BE5E5781A296190F529D25FEB047CBE770F8D1FB66D816839ED7CD13171ECF Out = 82C2F31DADAEB256557EF017F45A6C8E9BA4DC6F333421296F5313283AA6EAD9 In = 7878D676F80324F34328962ED7AF16501061427AE273D8AFBDEC6CD114B049D9B890A3A23772836B34A0A112847CCF2FC01B928E69434D Out = 3134E59B83E42717F838AB39996B423D29D3610A8CC2BA4A9A6F12E08D5A6256 In = 7FB4C6E63E9C4DB639170F9757E2273C9B1986DF897E4A4B278DE99B6EDE9B530F96EA7E7D54004E6B0F05F6E3FBE3AA62506949F73A1CDD Out = BE9BE655AC18CB030F7BA6CB577D802431C36E16D890E9CD8601D5A0236AAE77 In = 1AF3DA21FC5218E8E677A5436317F16B8C8FD068C73996A55B35518CA14159280743EB185AB7BD1DDD8A5081B99180DA39A6324D890B00114E Out = CD16450E9931B9FDF557A51B62965FB944B1723B0F38614C04A0730F2BC8CBE5 In = C0AA21B64BB53003A5D705DB7C8DF15178654F0360EBDC8A63EC90B525AF37D145BB38CF427C43ABBF7F4D92B47908E0E76B74E9D5AC53EEFF74 Out = 1C74B13ADBC8506D748B21DA0ECC002113B42740F36C5C12A19E5A5F283339F0 In = 678365191176C99CC68A07F6561B232061D74FD0AD69B9F0FB893D5E6637F75449C7149D2C83E06CBF20EC70537D7131878AA1520579072E2666A8 Out = 4A5AD0E337A78175ED26C081BA807019AACE6856450FB5599609CED727A30087 In = E0604AF69EA91FF923D8B77780A046E16C5ABC95E65CF534FF11C72E27AEF6517C2E1893690495443704A43032754B66D5425F5D8E6DF5F1D27B8E90 Out = D4AB98F43B266C93FF9F366F956838279CE23833780A4EFDC649F5111F9F26F2 In = FD8A32566F898112A87398CD228DD727B8448498FA151E777967FEDCC0B5A7DAB297DD92120E1A489ECBAE4A977D88A7D6D4B7ABE6E4745536E8F5AEEE Out = 61D6C410F6DAA6597B436886763F7E48E6C0EE0D7F6FBC7C78665010A5498B16 In = A3E62E3F53BB9C98EFE6978011FE95067B550722EE434544D4BBA39DFE7889F236A9ABDFDCB37F0DBE640D3888F71B42ADC104E61A5C909A5FD77F4A7A4F Out = 2EFDE07F82EDB2AC9B2D9BF375ED0B31CF37EC15FD431BB5F84805EC5BE4DB3D In = 1F240AF659192AB6331EB872EE8ECC206B672F0D602AD663021F0146E1AEE1124E7E35B2A0DE9A591517FDDB0333E19A56192E22BC4BEB6AD5896FF626C5D5 Out = 873A20B028BAC043A2F6C66CE8C689B80C8D9A56B3E5576F711354E1394E88C3 In = BD44467EC7A843662CAF04AC9854C0B78939678816502CCE84758655A0DBA2C17CF67538D5B4216FAFEF1C1B639B027A21677F9B02A0054401794E53D2AABB38 Out = 129F552A87B45C0A352B3F236705087BE01EE802029727B5CEC350EA0A5E66FC In = 55F25FA2A9C2A737DAAB7E5412042863DD5E80996722EA6C6EE8FE90BC0649189AACA31EC99936D5AEC424B2D174B75221C03DD5D992D0ACF07B4F69D2A13D0421 Out = 091523695FAC022B8B62428A07E2AA23E158B3ECE5B71E8217AED2747A29CE27 In = 72B4F86F7B64995E3C0B7E7F22607B198892F845529BA542B9C2C970D9C12C990D27A900A89A7AAEF9ADACEA3A641B140340234209FAEBBD7FF3CC778C826353E6AC Out = BAB5C332D77BBF31B29AFC4581F39B35889685998FF2433AF61BB0C69206028C In = BE71E5B7A9CDE6D7D220D879744CC3EC4BFC50A83CE84E3D9888929BCCE7C8199D737DCEE2C7198EE48438AEAFE118F9522C88AD8337362764ACEAC476C9CBD1215C1B Out = 2B52C627E3E7FDA80955520ABA77198524F32622714763723A5AA33D722D8E12 In = 03F157B18514111E6253F21352B99ABF9CF490A4744A0819B2934282BB8DD80B6924109138917CAE8C704D4B2C64B2F685C1770B20A7FFB343EB7649BBCEF8050E85ACAB Out = 2D8BCE499805D91C19C8BD0A77AD987BA234900F549D918B3A70D8DCAF167EFD In = 789C2827FDC6BCF890DF221C22F3C72F193BA3F065A6799F03B7C4DBDD8D1FBF26C13D61B4E4CC73167C34A3092E04FE66829A77B47C99DAA79A4A50B8583151AA89424E1C Out = A1D6C8E342CD9A7CFF8393E2277B7A8E64CE986CF59DD0E1C9B7DF3FF95FAA97 In = 05E63C70886FD99AD2DD7E765FEA4C74AB6CEFD2773CDE3C77E03B3C23B0E1CE122687E118AF9587E179CF1233501C4177656C778CCEC6BDB6A53646424446C663279B5CA385 Out = 08E5FD51D02A3F09A3A4B7FB069E2C4279FCB0A80875324314282FBDAD4B2F2D In = 1AE9481D30C7AAA3E25BE7A4A96FDC618E8A464BCB3F1D41F2332A31392A4616A16362E81DFBE5A0A3CE60A5324B5B7469C74552A7FB35154024FE590389BCCD77CA1DE402B171 Out = 79D07C6EDA9DABFEEE939EFABE20ECF64B451922BFEABED2E14DB66D889F1D06 In = 5B8E70D43337875BC8EB9DAC93E9E00FEA540574470A41DB6CE137A59E8E316EE5A5B618E0F6D9E027DBE9B08324EC7135F9BE8FACC257EECD0BD757E95D0642FF976D265887ADB3 Out = 8EFE47582FA0CE675B6A06148EE2CBB132A7E9B1951DF7036536E87A119483BA In = 1C52D5DF1A6EEA92A60FE1F0E3D85671134B261CE9EC196C61DAE6CE672FA3FD186F310E1D93FF46C88142425B228E3274E6A0A28CED43B029455ED8B8063C3F8596BB016839624BFB Out = 1D1FB14DE1B07C98C1990F1EE5EDB1D668444E8D77411DB5F4C28BA9D1C68C65 In = F70088393CBC8175D942A4D4469D07792AEF90CDEFEDFD1156D68B14E25AF70F59B4496B165BC16603B62F60311C6854D7019B64C83A220AA1FD751B2B8E60BFE6C8E18A176360A4CD89 Out = EF3F45FAF63447B63D836A55C0BF5CEC906ECB6677B12ED51E884CC3B6566406 In = 99DF20C2F743D3C5D1A5626C712F8C2E230CDC77E587960E9E0A13834088C7395E96CFD55B4684C70E2FA8F6AD8F68A10AC6A5224AF61A80F1DE2DE419BF7D64E3691A6508B2792D224F3D Out = C1492FC381756F8331F0764F1BCE8B68D364BE67AB3A474D2E1B9BABA8467F32 In = B7D595867687A684AD6DA616CBECB5C80876AAAC1EE17527136D6652AD65A1FC5C4CF106331C2601F810198A44834564E5541DD8E1643F38200AAD41FB599A68EDA94955D5B8BBEFB022FBA7 Out = 4023069CF054A98D89C07B3A9066F53E0640700A44958CECE492CC0A661C1AC7 In = 18D52FE8EE4A767557B8035D54954F2070012035D57ED42C75730C3AB7CBD86CA0BFF6F71FE818449CD82BE9E079D97A8F68DE1D6ADAEAE36DC0EE615C1ECAE916F397DB9C696D3832FF939BD6 Out = 9FEBD4895A2A5F07F9406E840EE27251411F4F03E3D6F1BC3E958B528D510FC7 In = 765982491587FD61EB065060326EFAEA94F5FDAE7EBAE3F2444D8D76E0477A05AD7F9A5A8324863EB6A2EE034F4DA8BE551076294CF002F64CC5086BE0BDCCCC2FA8BF02BBA33A0B179D3C589619 Out = 78A1AEE5C0011B24DEA79997BF7852EBEA0552E560E10E0422A0DB69082E4D18 In = 726CA2F5DE7760AAD29B131803790C7CD4742D389E7AB770BEAEA95C80D0816007F9F1DEDB04CF8355A8A950FA5A4C0ACE59788D052BFEA11F84D4B590B247AD999CA6C64B3B80E11C4E16173954FF Out = 0D326846E9E16527A83924C74C2D4D0AA850170761052402AC547047FFA966A6 In = 04B58C800732387285CBE23F7574201746BB9B4E1DC55F3A51C2E89162E15D8A88EE02CC874515C08E82399BC6DEC66323C583E0359F367F732EC2308C322AED8542553203DA1C03E2FA5DE81192191F Out = 969852605DAD4F190B829A18D5174BB1EB5C1E8AE48A927CD04BA72E58BB422A In = EAF1CBDE7F6244D12853C4158661113283066802115CC8C775CA40EC6D747E24A49D3E5CF4E2C77BBE6739285FED17A1245ECF2952F9E781DED99B05F1644B52BB49562731BCF2ABB7C67AFE0D1A083429 Out = 36631635E5F3C8230A7606FBC1673A7C354C87055F64AB72ECC2642FFCB13695 In = 5740A3EDA42AD8BE58C5AA4545E2DC9F9735C3BA6CB723AD97A153012EBB98CEE479A784DD4C86CE8C51B47B07A1BEF7C759DC7F0CAC3D9222A16CC2173A83746162C61318B8034BF685C803794AC572E1DF Out = 3CDBACCD4CEC3023F26EA39A0E77F32030840CD311BF63758B5509CEA2D524CA In = 35D3C8B698FBEFE30F9011E3796AD4616D3A49F7F5C100C297378647E20BCC107B0F0BE960CC4AB8972FB70450DF6E94B8F5DC97EA587C5C5062F2389B2C3488EE340D5951307C117BF2C2EF0BE6F90CB2CB87 Out = C45E00136AE8CE2AFBE2CA985FD92298D80625BD8FD0727CCCB34C627167947E In = 4974E863399C12F36FF595A9AD3E32B8E4E7930AB22B71BE1078DA07EC31194553FBABEDDF04794B5A56B9CDFBB70EE1FD862EF6D8146FB73F2C3EA02B9C453A17718858B136562DC2825B3B84989DB084738C7D Out = F1B2CCBD2A47136862E14C1CE5608175D7BABC06A4F7A5D9B4D671B8FCDD5E73 In = 1F110590F155EAA123C82AB981EA1A43232D3E590C7BC3F515900F0C7862FFA868AB27A931F7EF301CB82F7A87C32CA4133984872BBBD3E19597A30745E8BD1BE31FB82CB8260E1427A8E0DC385DCD5B4934814C58 Out = A222E428F3794E77F15249267815A4AE8E28DBEE0D42822CFF4E4B64EBBACCC4 In = 75BED3C7ACA8DDA765FD1E0797AF152E03B366E51932672574595A3212CAD177AD7BB59C45F55D03966A2F9DE47B6E3C71C73D73BDA52F2AD04B03FAE470109B2B87EE7F8931A85DDA0CAF960B12D393FC2F30ADF3F7 Out = 406C08B881F0A4ADE69049963139C82956211FFDE957C7816F7126AA1E95593A In = 3B1139B848F977B63B0A923B8D42A4A78DB5A83C387D3BC2FF62D07171997A309447321EF5C4467A8A1A04F3D9CA94B43184CA4210C57290AD0A44624580562BCB404BFD3BA450CEF3BF3E05FAA83F227FFBFFDD973504 Out = 38269BF707F56E1EC0DA4C695453C53113173A944FE7248B4FB850A301957A33 In = 527300B5BA1489A59C75635F277AA6F9F49AEA1AD4DCDE2952F9929AC00C2936AF0C5C4C55138A45E09A9603EA480CA24ED97DB87428457377DD9D90CF82A47B14F8753AD004EDABF6761E32C3FAA9A7F09A684242FB5374 Out = 2B092AD2A02EE43E9C2273FE22A4AD079BDBC2508FF4B892A30FD3CEEB80B57C In = F2AA628C7999C842AB71A863433BA61BAEA97A0ACE3F68072B87C95C4669BA95581ED631ED1E46F613E515658F89236F66140B507528BA37141105DAF71F1A834421EBBDA95E04450B3E741C7243C47C13B8F32EA3698DA2AC Out = 01416665B1C5DABE00F0D5AC35A29E2A87A20E9989E2E7F2763B145222200F27 In = F277826012962EF07689D1D6DB7C3B936EEC819D61496AF748D3BD0DE716C494485E7795ABB229E7A6B2E2385AE68D2E50D1BE3365231430CA89E21086C90CF5B71CABD983C3B123C557035185A85617B842E43538761D39A225 Out = 231DD751B4E52B901E320D4FE860FDDEAB2B7C19625DD5FA15594F878EEE7561 In = 17A3954E1EF7F7EB155A95E56DE1637183EE11812A0087C4341E7A7A9DFE63D0FFCA91F34FB3C79B12C733BA7CFF5816E7D81A237D46F8615B9073B9ACC506B108597A5458F4B331592787CB0F4DA060F0049E3B89DB654BF68E4D Out = 91C3E9812673C03F6D8E4C6B9D6756C8D247BF2E3B18FA39AF4593BC104791ED In = A6DE68EEA049E6FFA8113F214BDE7F733D540E86285832F639FEC88EC7C11815C5405E55FCCE510F6AAAFBFF0855F43AF349AFB869C14F3A1DD3128F415FF261886AED94D434CC02321B67ACA80A1F6267BF1E5D611F63DD59FB5C90 Out = F71CED2A6E9D06C47101AF4EF0F5929B6565A5C2A3FE99624CC9BB9A8F767A78 In = 073D2FF6248F370FB07EDD5C0BDF24A4EFE7BE32BDB7D419381EB527CDA3A3D66B3305A5B632D86DEFDC97B87B1A343262DC48EA8C7DDF5893AE6236E0A24AB51C7F5B2D4B1CA19875651FD8E379C0E5C2AB5C8EC0880032AFF973CEC4 Out = A0D8AB714C5DD00FCE23733529CD49C57FB80C88A748A81AB9F3616F5F812AEB In = 05A2AB51F38E8CA0E16EE147BE2AEF49168880A3C39A6854DD5D645BE127BC959E4D9EA28031353E278449F7BE5123976BDEC5C65FAE3AA65A0A25942C3AC45394054B1457F7919D0456E234FA772779DA619144B3F5C949A26E81D34069 Out = 66F1F78FAD4766C6348ACC5B5D1955EE8CED312DC8D0555636EC5397034FD0CA In = 58FB3AF8C5C26BB05AAF2E45402740A683DC8D3739893F935F4D5175A1B03972C76C84E77A5B3BBA167141D3C3596A025CD8FB3A7720691612E77FED7ABFB3EE63F98E11E3FBBEF7E876D3489A66473724E11EA0B773621AB9168F17394A2F Out = DB34E21A54D5B1DA2736B1708F1F1EF068DC162849DF88FE96FD1EAD352BEEF1 In = 9D0C6E207788A82B7393FB9BD41B99814D55E736DFD3BE736923F6A1CD82E934440B6866F264A64692A8CAEB7601F5501B02DD780769AFFB9D80642C9F0733A4C34BBACD26EBDAC337B6565DB41979F9A1E11DDF7D5067FED2F238078043295A Out = 3BBB8F574E235C6C94BE169CC26DDFE8B8F98390FB6D24FEA587F8B2BA4B9E76 In = 554BA7C8572CD8986DBC634E29204838AB73E6A952D96CCA677C6713BEF4698581A4C82FCBDF0EA2A53685BDB2FE3B25B2A96BE3CA8DC36EFF548EF2D131ED25A9D7576A1F878A6E937EF325035119422FC9C9C5757C8B6EC00812265D60FCC7B3 Out = 42C00EBE5E9038F564CA6397B46A86DF88C292C988DD7042C68190D76ACCD679 In = 5580420C3097BBB972B5CD7AA51B1B6C87500F68F403D8F113A6B9A9432ADF4087DA14A81B4476147412CFB44410DBD904E6488B951242C1D39D4759DDE4279E976020D329636F0FBE24442B22ACBEC40AF95EBEB3C5C7C87B3EBAA4B72CCD7A7E68 Out = FF949F3C5955F70CBFC93ACDEE77EAD6E4B9F4CB837780655097F516A824BCE4 In = B9B2AF4780F68D75D63B7D4308CF46C383F1111A681B6BC4AFA3A42361D132FEAD8A21A73CF5ED8B7866ACCA1CDA580C1E1203B9970D0467C856435871D5FE93F2197ADE98BCA40904FB032CA59AE931C822EFCD9A423E65EF9B47117717F72F857FE0 Out = 67B857E13780897F45A0244BCC6166C5130A898A52A181ADF8C9FFC63E7012E8 In = 53796795E2EEADC6C5BCB6321DC37FAACCBF7708C8CD8052F3B749C44CC24E1F702636F204A4FB6E1C6CB7A9FD8B712521068336DCAD7C98673A6587D9A426F17DC564EAF777D8D252BD12F4006B1FD8194C94FF1F134B8671D36C5515C92FDCCAEB5A69 Out = B0B8C4793671790927EFEB10D0B07816979676E52722A6A8AF071E52721FB100 In = 26205E90C424BA9C9A542B87A00DBDA3EDD0E9A1AD09AA0FBC5BF81500C10C966FAB462994F3590F4DC40947834C89DB35A88AD81A3FD78A51C5493634BF11B14FF8D52DD588A49E03678C5240199175E856611F5FDBD548E9F13EDAF52356430B37A23A8E Out = 3F27604AA346161E5634FBD9A4B29812F4F4855D5B0A0EF0907B0D762A180B3E In = 58CF59F929EF59581335EE7C73F3492AED7B6FA1878D5667573A0DDE68BBAA5D88D68FE289BED6E6A74FBD79BE1CB612F7E0ED3262AC9B97A92ED9DBB52FDE38A6B08DF1552C636FCE86EF699E9F4CA201851BFF04714258ED377C1BC08B50DB3F3CECC1406B Out = A8F21A0DF4B1AC55DA304BC08A244AFC09C6207712E339BBF980BFC1951ABE98 In = 8E8F4F97A37226A800AB6BBA0EAAEA6EA69665CD2F8C01BB3F5C69C80E95043E80875931E5210218A6452FC3A70D4CB3537D2A92432E99F1B79B2DC8D1AE8F36F9E7439661DDBDD8537ED8272B09C824A20533A19057CCA87A1879B7C9EC837DDF763FD8E5D5B3 Out = 30AC80E8B71743E38A08C48464CF64844950CCFD4887BC70D25F8C7C80BD55B7 In = D43BEE5BC5BF5A5A90152CD700114CD1635A96FCFC2709406ACB673ED21F5FB9C581579777B49C10DC58C47017E0C8FD6DCC89452FD37725B84DB2C03E6E8E85E95A4C82701CF343DE22CC3ED46070E1A260CBD08B1160C55B1E5C57DBE07FCE830A18A72521EC4A Out = F90475C1D8801341863708D70884C7603C233256A76A246663A8619BA3C382C2 In = BEF37CAD600E03F58561F0D018B9A77F2D350057B50B55BD3BC29BB63A2E0FC264AD6F2235D7A35930E50D84DF198A3EC6B0E10E431D7C2DB7D169B395B41E3087644E3FEDFCF7C2A8ED3B2D59BD97F650EE0B07190B21FB58A139101F3FAE867F98B87ADDBA212BE7 Out = 1CB015C3CC0842303C789F843EA4FA4C15FB0B18A73763C011537923C579EA5F In = A6EC667CBB6FB774C8A8DD317BF3C06933A448AE101557E812A559C065E9F77E28930BB6CE8880B0B1FF38727BCB9597AB697490934B3AF3CBA0C0A55F8A7FDE0A1F69EA8C7EC21EF8A245B9B4C795422CFC089519E8ED48EA68DF6D32BA3380E6085660065FF119E148 Out = 9A2E18EBDD907D2C02BDE46E499FB5A8A4B590774CD0A774A0D467CB5851A0FA In = E139DC3051756D9E5858D299A12D7C928F01B79E9141F6228133E0FB172971191ED95E835BD9B0CEB91658F4923824993EE389F05E7D049EDCC6B8E90259418AA7681E0DA970523FEFEB08A9E4ABCD90CCD2FEB07AFEF9A983789FD162E5BD34634AD718B499007C84B648 Out = 800C2D48B925EA539E528396870A03E89FC4B9538180486B937C3EDF139D87F4 In = 86DEB4C32713F1597259DDC1792871A5B36CFB6A006EC60EDF7715F152773435028DB5C32047F831C1DDEAB81ED873F0D0C7B8CC158437E6955C957B47FC2000A482A5C43833EF38EA47AF8F2FED54C7E41A5EC8C8481A6E8961F1073D3DAB7F04220003FD943F4768E742E2 Out = 296253AC41275B5EB60E12BAB599191A4378EECADACBA075389C17E4FE2FD07C In = 8843403FE17D0783C75E3ECA9C5748430D64872CC148A6A2FC589F425D6215DD5D2CC172AA9A566D39AC29CADF8793A514DCDC6B18F82B7E3CB70F489BEAD86AD61439E2AD5A1E735D2CCE8187B905E98B6FC4155DA00E7D45833450A339D8543970B7A02517BE961BDF4F57B2 Out = 9C9190EAB048014CD0C0F853F5A2A7D2B9D03E12FC8C7BA8B431215BF8A7DD51 In = 40F61BCAB993D0BB5FBCB25D34E45F2D06D51E130400BBB7D3FA8EB10D68062B83389BE62095B4D876827C9DED866962923AF22D4C078747FC6F8B8CE7C7392AACCF8F5DD410A72BD008DDFDA7CF0019F97B831D000B93039A696C0289DCC5646E199ED7C12890A66B734EBB0888 Out = 1A628DAA204E7B4829EE63C71C51FD7897C078AF80B0C044F8358E0C4A4B953F In = 7D2398386795EF984FC942848DBADB3216F65296DC0AF9E7C4FD0A49346171DB7289DB25FA5A80A5C919AE065ED2D78BEF6265C7E75151515D03795ECD55B6ECE4F790ECC71CFF786A529E06F23056FC8485D2110CC0AABB9A1CC1644DC77E64B55DC7BE5237E542917428DDE55E84 Out = D41E85726010E4400DD94A4866A7C44D64F302EE204C9E95237FC8590B1EC4EF In = 85BB2F9F9E65D24D36A1FEC56CAFFA21BCA3C14E7792C3BF347D83DEBCF662D1B800BAC20553ECFEBD64E3CF028FD2A60701D27213E10AB13E1995D72929B0CD3CC201513AC991ED390F288B12E7A1756B5D02987EDBCD063C303776BFC3F24D6702C0A6656414E9AFC63BEFA149BF37 Out = 2AD42AAD7E40FA925E02F1D8520026C0D12E2086B6A6AEA2C089197592B2AB08 In = E5A9D188B88E7BC821AAEEE6182073C748EEB10C19066FD40AC6508843B97BBA4A94F3DA2D401CCA34D3468B692E9CB7BEC8400B3FA3FA517C762503E47BDD9AAA7E84D4A124885E69F430B052C8802B4637281E71C68AE22C1BE1F71ACE258249E5EE27B76FA53B896465D2D3B57A707A Out = 53277E6E788EB3C6B2CAB72E54EB681E6861134FCB4DD63F10E572E28D9F1B7E In = 35C9F1143460E2104CAFDD8B1BCE6BD0EC5E953FE3513389E34087964DADBFEDEE8D6C229E5029D00B91AE0C8235A5612190A1F9D026DAAC217FDC4BCF718986FD319FE5E689FF20218DB89EBD3D9D9EBE9F4AB2F28622C050E01C6F681B4772019109F40E12F320A31C76CF20D3B10D0109 Out = 2AE47F0C7898F1E81D034D6E7DE79617A30918315A0C05983F4D2149627CC556 In = 83DE715AA9E75FF678EAE450FF33030717B4FDAA4EBFE229AAD34D4418EED66AFE87E63659F7D4AD6345CB0AD581795B6DCDF6E7023FF9A99441126A15AF023DAC2D6A78638D06EE009707204FB3C688DD7D233DD0C235D4005A8BF9B58392B7702C9AA4A33080461FFED08F3D6DACE81CFB52 Out = 65573347E093C76FF0DFC7A51D52B781DACEB8A84CBA13D526C05C53F0491521 In = 72906374538CB478B6FE074683FADEF4036218CD977C501B7177F2E7D8CB778EB73A0197E81DE8F667AC62306422A46DE662B4C85CDFCC7B678C3A7A1E80EA181ACD9B615B1E6BED52055CEF6E4E0897D330E727BE210AB7F98C2A68614972A57F1C85BFFC1E3C4F25FBE288CF70D67DA569C788 Out = 5C5E46A337BE3BF974D680494F071A54160A8FA1945E8377B615F282D10883DC In = 9357ED0C53457593D12015E9C924DE6815979D172F08713E36D29803F787BF748B2AD6739439F7527CC03158C4300434422B9319C7EB7449BA1CB258E74F04C875436EFCE5881877FDD71EE142C3C5AF6BAF35BD5C05969EB70855DE09152744A8FB611D6C7E10C9564807E1858976784F2959DE8E Out = DFB8694C78468DCB94331F57F800B3A35C9D8C6ECA25AA8A10E16F2D5D63E168 In = 44EB1F76FA2B8FA9C636776006CB25C8777F32A4F5A28638E3141224B17DF92177B02D7E3B6DE0B86826008AD1BEED1811D9F8110D4A37F5F50B8F0C0FD1CA863D30EB507B515F59335E8A818E98A179835CED932265F2BF8FDDED37B6AC899E710BC0727832310EED66F912858864400A7F8CC749BD Out = C2BAAEE9A6B743E1EA5E1CD2E8DB30478475BD51ADCD88BF023E299731E1B4D1 In = F5E327945E0F187F33051A39AD043ACE17D8DFABB438875520D0DD129234A97C7251FABA470E7D5E36CCB9A0F10B7BE1E3E0FD4A79B02F56345614E7ADA9393020D3DD56A161F12149523410CC40436C95A1C95BE346AA1B3B59FADC2990B418B6C85894D9FD0FFA7749762CFDD58597F8A508D6F6DE13 Out = E8DA8AA5FFAD9A9B21482233B9CFBB575DDEC12EE9F7DA11D2B05751F56CDF89 In = A8A9A1D0E289EC76B97A10838BB50104E71D7B20D2E8B6DE63CF2C33CDD32795B055511ABBBE30A2869472FA84DF67B3CFA5C6B9077E662416D9AADB32A193185B267A2A23648AFC1620076B44CF3B367FA7DAB02E465E82611A74A028AA09C77205684486A13D532222C9D805DA77BCBECA370A68BE2D51 Out = 0EF5BE8B1F3E4FD545D44AE47D187A458F1C61AA950E6FFB2D539C2E887B9CD9 In = A6B61A1250CE0EA9B8A5D5D07E63840CEF9E7BC066CCC37A4A8C1F210B7440896F4DD2D25CDB41CCE1ADA000CAC14A5FE952D537D74263E65C4EED03E9949A11774E4CCBB07652AF8A362F433E3A7331E33A7AD86DF84F9FECCE9C4C89ECAA56DC43145C04E3704B7461E9C0D92F644431552078631BA5C10D Out = A74120F7F6771F430FEDAA44B171F2D4FBCB8BEF83E29FC5A343E9A6FA0F4317 In = 218A3B1EA1DD423231E139312975E898026BB4D9B43C960B31652BDE34C10D2B0ECCD341EFBBEF85517B1D2C99308B4E9C484213B58E11BE2D8C945CED2DA27DB405F0047C850407BCBB73510D36972290C87CDA7EBE04AC44937BD99644615E547A7A45EDCA6DB4E1FADF8CCC23A2C832795F370A15A3819254 Out = 13E2DFF411A0D42EB12D1323CDE957BE60F823A122BFF76316576E73F858254D In = 2D30C46D61A2C39AD3DB5BFFBA382120D201AC5026CEDF1D0D1C9473A2D19F01A188D36407403A8C208978F01CD9979A5B4D987315EB01C824A9B6E746211FD7FEC08ED019B3FF8E35B39A3C37C3910158EC5A23D492B28D8083412AA2C397C1F20AB1637512FE8E6AC66ACA20319060EF9AE82314DCD12C73BC7D Out = 937C307B3D2D0C6FD1D70E852ABBEC3B0E4A893B9C4BC923A734614A22C782D5 In = 3D4453F890A2F297D4F0F86FDEF1FBEEFF8949447EBEEDE53F0BD390F73FDFC4366C668E7E3F4388CE5338309102496AE53D7CE63234E0A0AB3C63F91378460870BFA964B25EDD4E34A8FD57E6FB7A86183DBF3F286303B0A8ADBA5A6D0ECED58B0152D7F94D570FCA391B1BC0F551A50A9265955409AAAEBACB0E3E Out = 8AF4F714EF7C2BAAF7900E16A57467F46CC27AF206D9ECA94A467A98813E7C1D In = CCFCFADC38612DEE3677696EB474A3934F4011EEA72EA93228FAA64F8FE004286EF016CD8BCB653FC7F9927CB7A3DE84298F077B561B4FB2C8440F468970A431E99B7A34614B639D7312A220B19720A4D87C517A744C675E5A573116A703A0033C486A73EF3BF5FA448DC4861150D8C604000FA6C20356C45539E43E07 Out = 917CD68FB4FC4C1DAC564AD882F2197C2EB54D96E22C469D48B573183ADA964A In = CEF978907502F606B0EE6AB189ADC305EA048DCD3674070D2E3833F55AEADDDD4D7DA55B01485124CD46224A523A1BD0394A92038353EE2BCD311C5D1A0E18A32B321B31D9EDCD7B5721D2A7504FDEE09CB34364896C939D78FD678A93B9FC38C8C4E3D4BAF7BB5435EAB9EB0FD85998697E4F87C02BAF3140B8E4D718D2 Out = 162DD86C844AC23FFCE6CBB64F0FA20B840D293C74C29B22DF87225C566D1E75 In = 79E9D249F6160066B6FB1928388FFA95265F5965E06C4C22995A012B8D37D42EC8537F3F2FDF0467A7C548895C60E65C97C4CA51ABF87BAE2CCB23708F1E95653DC67942AB4069A82492086CEE3699B3D9F278F319FF219BCF52674D0F860E622677B9BB3D3DA8AB2EDC0DAE5F6B02B4037BDBE29929F51574C4BC838B7FF6 Out = 90AED3FBDF443EA8F431E308475EC38C85926A6A1EAD802CEF3D2763F0CCBAE6 In = B606A8398B80AF73713B0E1418BA34D1C6550221D0CAE6902DAB61234F73606C21C1D96FBA5AE646E7026C36735ACA98E92B44A21F7A47214A4BA587D1576904854CCA368D224FE88F4A59216F09678D41196F399A2BAEFE648A47032A2E79496AEACC91DF0615B21EF90ADD1B64FF851AE680D97BB45ED9B9FB8DA42EE330FA Out = AE6E2DDA5ACE3B88F4F4F644CCC67248CCBD9E6B2DC5D359B21E93903A965121 botan-2.4.0/src/tests/data/hash/streebog.vec000066400000000000000000001724421322470703100207270ustar00rootroot00000000000000[Streebog-256] # From https://tools.ietf.org/html/rfc6986 In = 303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132 Out = 9d151eefd8590b89daa6ba6cb74af9275dd051026bb149a452fd84e5e57b5500 In = d1e520e2e5f2f0e82c20d1f2f0e8e1eee6e820e2edf3f6e82c20e2e5fef2fa20f120eceef0ff20f1f2f0e5ebe0ece820ede020f5f0e0e1f0fbff20efebfaeafb20c8e3eef0e5e2fb Out = 9dd2fe4e90409e5da87f53976d7405b0c0cac628fc669a741d50063c557e8f50 # Randomly generated and verified against: # * http://cppcrypto.sourceforge.net # * https://github.com/degtyarevalexey/streebog In = Out = 3f539a213e97c802cc229d474c6aa32a825a360b2a933a949fd925208d9ce1bb In = c6 Out = d907b672d09f48d27ad06c26647921c9e25d063c038eaaefac81e749dc1d98b5 In = 8456 Out = cdda073c862905d97fe4eaf9a67278d730a357d94069b1ccb7b2b097e1459416 In = 7479c6 Out = 50f562bd496f8c6c24676660dd21ee7a14dc5a372ce516f9adaf2386741d92ae In = e7dd2737 Out = 8a8ac21fd9726ffdbe0b881c0c94f06525e906da218fae8c4c53773031785174 In = 9803bd84fa Out = 4eed32ea916ae4116a91699e366ed8195efce8607d1143dc1d29a815eec6d3c9 In = bc9206e1abdd Out = 8f7c2dd70dcff95834ead793772e43b1e0ea5f79ac57a979df084b4f3a5fc74a In = 18ab56c98745c7 Out = 0f01ba1a919d8f43267b4de4203c9b37f28b72c3e5102912e120108398ba5ed2 In = 7e79d7b28fd4e922 Out = fe7aa2dfbb8a8a29024fe12d62b8b2649eecbb810467522bffc7b8bc11e64a6e In = 25292490207594d063 Out = d0f9bf0a7549f7e7129a03de8adce045983deace90fe37b9c29e7b470f2bf868 In = 66a433f524ebe50df210 Out = e55e5b5d741e6f3e10237eff006fcb3c53741150d0dcddbfd58867e248e79229 In = 9f5ce576a1e0ab773a5842 Out = 94a1308373dd489c9b3dec5e871b3fccaad80ed185cd9c7750fdbaabb9c362ca In = b87e0c330ae7fb0bb9211aa7 Out = 6bd7ccfb5f8f650eddf926c59d890ba06b73c961af499064ed1caff2a697703a In = 458768c0e3799c927beaa39f3e Out = a384cb45c4a17522b5a4de835d03c073520fdaee2f785cd1f885bd7234e465ae In = cf85c68718532b8fd47eb98ba171 Out = 58d6a9a46bec9a9cd088b1656a4f9e620c665a7cabf5108af7880ea7a74c97e7 In = 4e1f60bdea8c3d86c38bc8a2ede5a3 Out = 77da30b1bb7331efb69d8533d3a38329e545ff020e053ff08085981222b29261 In = 20e7d6f87f0ce963e04ad19c9eeb2bc4 Out = 9ca92e04083ff1ec17a28cb8c0c007a16e5804ed47c92d780e090ade1bb4696c In = dc47c297ca1ac6c7905166f6e570fb0dd5 Out = 25b2ff122a1492de92174de084f03f71c3103180e094fe4d8bcbc72972c063b6 In = 0fafabe0c829088cbee02a8f7cb5bf520318 Out = 11f152a27da67a936842a7d5bdbf1862e386e95a1c378ad06377e2ea29595147 In = acb4db39cf5fecf770a87041436e22bc55824e Out = bf39a33339e715064483a69eaf63f1ddcd568d9e016344073cf73dfbda09a66f In = cd478c79ccdc15321cb14bac7d307ee4577673b6 Out = 7566bc1d0aa56fb71c7561997fc37be912d9949250db287387c43638b03e0ad4 In = 4de0635d36f06368c5bf2d529ea615ff513f617250 Out = bcc0e0617e371f0a00477d3adedc91aacd9aa0de5a4a43116a8bc59d41181194 In = 063f24b7aaa4055e6e2ca75bc2764e334d97448d911a Out = c6804960faebaf6a75156be494c9bb985b5a19a40b137d9786f31188f60f5017 In = e94806a4665fe8290d1b267325b7aa0a42b76df888fac7 Out = 5fa938a0c26d49e14d9d59f7b9d54b095baaa965d16378913d469882236cf019 In = 9fa6f4d9e93d0a38105f76f7f5bb1768d891ab4db91b759d Out = ca714a94fcd09614671fac99b84b8e65d252cc212a57d1ac8649ed9e1f934641 In = becaaf30d5da104478676ca6429d7ca800e00da0c391ba8609 Out = 0959d05fcb995306d29d6bfe4b7d8460a44fb378589bee68ff760048038beba1 In = e2943b9be6e824caa5de36aae93ca8e4adea62358062f06cddcc Out = c67003811f8d94f5213cbc1b7ecba3dc587f994e844398e0e76b0bcf446abe53 In = 55457308c8e1c352737d9127cbb0a008f5b011a45bd51d8629e4b6 Out = a5082be737f255441cfe06f6e157501b899cbedcd5cf228bd87a9703c0a5000b In = 715726c534994e525ce79254b08b5aa01350627732e78afff7e92353 Out = 6861f11fa8841f1438e652d7a832d18dfa0880e1bfb5dfd34bec6eb2942bc21f In = 5581a73d24e500a27933c37e032080e52145e17cb59ff9e474115b325f Out = 49cce75ff5463468da44508ac9149246c8e47d74fd1b2d6ae9ad245bd0f4780c In = c2893ac07f4bef06ece81331ac014ebaddc123d48c927c7c0865de3b2e48 Out = 5ca8c101b2aae16faccb579d5a3de2646524d5278012741d69162f2eaf6e8ebe In = 376e63469744dfab670439a919d248ea122697100c954163284c57af8bf3cd Out = ca7c637c2ba6c0e6c6dfe30086e9257d1f9b36cf238e07c4e365882a765e8262 In = 0047183eacf9a1ec89c9c2398d570817a7dec9c413c380ba2f7450099836e762 Out = fc062ba9825d1b10340dfb7f68e4bcc672f0e6f00bb5772269a10d8326f85544 In = 077a8ff79f4d75a1c38418adf1666be55e03e3220a80d0669fd67297a3418b5a2b Out = 29880ad1a6dab61a4f689a93068bd9f91dbe062c77b7f85f185158e6d263d612 In = d46c2db8cb84294f1729457cd8327146ca53abe789d0f194874aef8af65578836870 Out = 14b32344325eadedc41ce6f49e47a915c40bd2c22d617e3e78cdecd39ecdaa44 In = d223dc7d898529bcf6e5ce0e22beaf80d0b2e4611b0de5ea69d51dbdea0019fb819612 Out = a82856b4007304e4f64b47163bb4b6bb9c4987c87ec312acf1249e3707ed0d9c In = 3565ba3cc3e04b4e3f5ff6224b8dab44c8218f1339f872007defd531be7c3584d9ad9606 Out = cadcc45246e0428878a123d57d49b9f4fffe04cc816f6d2a4ac36a6e76b0381d In = c29ee7217350bb2702b6c03270f84e6996157b6774762297691c181fd2d04f3ce697e4e31d Out = ea623336c76a13aa927a2f3587c3b53045a9177db6cfefe767136784bb1286d3 In = 848de2b79df7236b0fe6d8258e77ea7474ab5df0968ac6455cd405e81087e34e3a16da12f9dd Out = 1b55a5ce730a946d4eb5598c08be0a5f9a9c5fcb7c2f91b4ce41763ec191d326 In = f18e844e9743d61037a2f03bb928fc2e43b229cd0a0f5bd05840ee09ef3e6c4471c25994303d3e Out = aa579558b212c7b597ad0806645515d05d9afe285a188268b33ed285199968fa In = a2731a4d71d09ad2ba4a0a43fc17ef0854f37e826e95edcbfa0b1862db76b763b83499a2bccc19cb Out = 075b8497b837163715b944544682dc6e11a74aeb6574380a241c57155a64ab7e In = 8d58933fbffc1b6917be4580ee0c8d493742f7e633e1518ca0d53050c8300e100ada0f03ff55c52511 Out = 40d93253f3cf80cb78cac22d6ed827fe12aa346524212647cd6fe2939b98b6cf In = 5724ab5f02373b99d9feef42f7e9f1a4b2f6378b6eea9576f6d9cade066ae52e18a6e45cb4b29f379632 Out = 1287628d6a1793df06fcc1985a6f148dc3182d63199dfcc1287b35dcfb2be377 In = d3e4c946ce7583c8f59d58bf910a7e5617f88a0f1bf3259956596ef53ee416b439da5739f68e23c5d970ae Out = bffe7c72838e07aabafdf29009b7cd61991d50b3028ece9048720831a5b5a820 In = c54583daa34c173c409cd2aed1baf046c69873f2e8b35717093c02334ca0c27a21d9b67d7c36803dddff3bd7 Out = 5296232e85be0e02ae2836c6840a503894a338cbcf4f3744f0e941f48e8c5adc In = 078928de5b2bc3b5301f704e47ca8eb14c224f9db4d256859b2c754163bf860531514f06570680289749153e89 Out = 683436ac38ee9bc5486e8cf37f1788d8e8fc4e92ef830c6f51ed70abc6b22d53 In = 845c9455583eb6d4021746306a0c3c3be534c49fef604a2ed1578178dafe8f4ec39d65d707c3d1117718ec7b4b1c Out = 61fecf8e91eb186410c64be362b4dd478055fa216e8adcc2c70a18d462832b06 In = 2513c03ffd08d9cb8b7bacaa80a74552a84611b05fe788a0c58e7d82aed398c419a1afa5c624243baa9dbe139fdc66 Out = 94b9b18d9f58eaa5df13ce62f7d02c53a1f4e327a26201299a0179f975722cfe In = 124392c114a766291b2c682ac99ded9a80b12c9ddfb902f3fb25caa2e7d616843d5e5836f1f1d752f510e0e05ac5dade Out = 0d820829a9d33aa57e433ed412da14f913a1838e82da39373973932445c63170 In = 94d972ab817e01326b274fa22e365db6f12d7158f729e1b87117bf04c98fdf3dcf1e8f33e3abd070b6f5852991ab959e74 Out = c7cbed41dbff81c0fa8dc2c7310fde528529ebe419e271eda7f3d91bd24d1d45 In = 5b679c24510f604afc7c5e883e14c8c971af4311f61d6a000ae49657c232532cbde1fb2aaad7ff80d9edf3b9ab28bb78ba25 Out = 6ffc1a123ef116a9bce8b2dfe91c67a15184e324ebc5d70797331b8426e14efc In = ab5821565cac043ee89ac3720426b773661b90ea78e20f6bda0c12e714a746beaa5dbe8af15f5c318de1df87e3f74c08b8d394 Out = 4271ae6333f5df268fc9d6efe2db379fd56e2d3a6b5e1877299d600e0d9ebe03 In = 0652a9a7a10b4d7986d4947de1e41771d0998cd0d1d7facfc947c473b0c4d9f62bdf823581520baba4619cad01d617cce1992c1d Out = ced88e44bd831afcd18bbd9e86d26f04077923cb44f123d86d85856bbc98eee9 In = 815298cb2b04d44672bd50cab9c85d91f01ae8cb0cbe37d0e7163270a2c2ce3e00b3baf3d69d755b7095beaf14f208b10216f64d05 Out = b30e2bf612c448746b90db8bc760e997cc27bbbb919184077f543ff65cfffeae In = 47a712c40cfed1f329282ce473f22208a709e77800913a95db08204ebeddb239bb667541ea2163002534c20e7b3b15f3d01ee4498bff Out = b99095c0865c853fcc6646fa49276b6a3fa726e3f535d32ea4ddd81fc541c256 In = fd2de357e33c6a5debf792de4ff31763ed125ff3ade89f6833b539be84491631608cb7871d3253ce5762b1a74a8a1e7bf648f2fb7c3d8c Out = 59bf3037bb0680bb6f54f4837ea6ab201ee5fda046502e5a87471c5dac3085a7 In = a5f48c6423bc2871a21675ad605dd374937ab6cf9b13c0fafce41e24122ca82dc71dade36af68a06b120fc2a67b38d9bcf3d92a4abcac44c Out = faae13e7b0a545e82593782a10f53f1566c31dd1a3ea65456995995c98866611 In = c88adf6c57e028f6502293df736b1e43630d5963f61be270497f9548166016f36d60d3a58a20090f719222482341fb08c3c2a8af464eff2fa8 Out = 3bf6b1f8dd621e3dbddb62b71001630b221acb88190d3324d55c60830fcd3896 In = 59ff1386303075a9d013a06e6930d94af020e93774b77e55e5f74651623140441aadc4ff79d9078decd1d6e8e3f310b5e82ca4d198dfe3aacfaa Out = 51a0e4f3aebb6afbdeecf16aa7970d0064fb7b437d596a8f40c66cbc3e4a7b9b In = 19ef25de00ca278a26b7c5efe4c1587d0ab97cb8e797894188af012f776a1c33e1d0a92e0c017643d2cf147d578ea480b4400a3ee8da296affa967 Out = a1bfa7a9f0b8f639a24788c47f7c741e6d908fd443e43174ba21fb763d8ef270 In = 3ae1fc3d145669c5d04598f8016ffefdf7f1b6d5e3be933aa4b4875f252596f11e986e5cfeae3615271447316ea5f2f4bd3f0d3121f4591006a557d1 Out = 07eddc088c5812facd925fa6e8abb585431f9a2472ba9c88eef733999dc49f96 In = 7fc7409462843054ffbc028b94fcb40beda1c81dd3c4e8504e6247b0afcf30e9845d09b3ddc645c94685f53a1c3e91cc69e4c076f377ada0c1dcfb931b Out = 6d40f5375e097b8076bdf9ab1d7876edbdc4fe3d9c87985c72aa8d691e138d7c In = 8ef3d5192184e6fc3d658499120b85caf5214d70a22bab81efe968c8a20a088dec7c4b6514b3edbc6bd1876244bd771a62c381f75953244fc0d95823b4a0 Out = a17155255d5e31d7ff6b28ccf8099e7cf3c5a72b28f2b65ee8f0e6046f603e8d In = 6a9302695100dc78949e64001880e1e28851c3d7f15ed1a72a7713f37f81e1cad9ef1bf6aaa976fa78a72316755f1f7c6538b69942e454da1b1dc7a736cae5 Out = 664d07ac8ca55f8ba78ca84fd5dde151d0afc5d2048173bdac840ba6374e4c26 In = 00b7d1c42da82cc055affead5924db662e5a080081697f8287c687fe91d32b4254fbb961725559a32c43c3f8114e05c2991108228ed83edc476fb9a62874fab1 Out = 68367c34ad8441a48ac7fc65657ac73aa51e1a36c5346c0bf011945bcb9ef773 In = 89e8a4ccd6285add12b0c46506e91c09a3c2dd30951eb72818b58187f1a608edebf569fa81254970ad7f04ae9a25827fa6482829fdc0797a5cff6f7446d14576d2 Out = 64f56da108ea18571aacb6852b5be57999ec5de82a7d1f719fcddfc7ec1b0ad1 In = 0b28903728d28cb14bd36f147d5a691a0159c8314a5f71e70a8e53adc14dcfc8fc6bb475060582e2793e0924cec01642f1d93c9dc5b1d2c02a62226baab3f6b05a1a Out = 523697daee1c08c9a401b108b1b2d3e56f0570de1dddc8fde732ae51b806137b In = 154c514e8b1d16e871203e30ff60952badbca9c5f2efd4e963027f6d0403b267517cf05fdd248fdb030b84a111439018fbf1f010dcda2fc97aba523306937e816daaa2 Out = 19f71d417e4aac02decf3e9c178d038097ad9afebaedd48899f572bcd7b3901f In = 7f2e20da957134e0a8de1d2de1a6f1a684ecca21857ab2cb6090ac3db04a7df92fe6e42e7db7d447041c9a82902bc5f7ff6fca0586479ffa82d0805d8c03e391cb4fed71 Out = 199998a7933658c89ce957d6945bc81f0668ac13d8466e9f3462968463b47656 In = f72f01956fda0389777d3229459c1fd088137c44f1a3d8fa6505446502d16081d0ca10f7502dcf54f5d98fc1df0300ac837d451a655fc9273e6cf814c12adeb56dfbc400a2 Out = 8ca34890683070ac98b0924625b1865d461e9a837a560760b4a14d577f5d7d67 In = 696c15a068d61a9c94fed5478fce14585a8e1ac7780e6e2457d16e66fcc8704b9c584056bbfc91da3f3f6cc8e45c313f761f90b06c7e2d499a198fb928b886ec21826c9fd2ec Out = 8e9d38cadd969902a6084ae1059619ca2c0d2fd2030a7d78564db0ee058a6976 In = e986a3f8f3a80693b5746de770f95ae0947ef276d399389f83dbe5952cd2d8ca27451491b3fd0763a2e9a80343a1d7f65f78cd0985a0f30c0117a93be598756e01f6a8492dc2ba Out = 396dd7b313d77b2ec398890df23cfbacc31c19d024afa6bf9fdcd4c7a1164fdd In = f578fbdfe924719755970a4e9ede75fc9465cb0a0f650e613ad602679ccef779f643f7d80971e3373cd3b66cda8f8ad2a1a7ce89d742036a4e3a061a6aa9ff83793a90f78c31ff72 Out = 0596d12781dcc7f3734bb120123d0d836018821540060843e84c87bba011d681 In = fc05cf3359c7d04e15ba358e426a17593006a08160bb5b9016aa17651e7e52a05c2f020d074f281059fe9d92b741bbc26d203e0908c4a709d2f11a766b90efa099b7d8c45a928f5f8e Out = c7ac1548ce70a78c235edddd7ebc5c4b3f7fa932c48af6eab6f0178cca52f3d5 In = a548f3e50edebfd548a261002500ec4863402968895d508282329752e855b7531549c93131c489d5f0a1db735010effb0015bb6db11eb7ba7ce903fad7dc1dba031da93cb89d44abcc53 Out = 71713452204c7e982bdc3cca51efcf53b5a3dcce5257c87dc00d1e747b1014e6 In = fc9e6e950a93c4bf5cf14171054079f0eef9394f1920cd5cec959d53eaaa59b476bf476a713c5ff5a6e14240c9862b7d27ab9ea673ae61b5275a028bbc61c7521e9bcd3588b1714ec1932c Out = f4a11cd3fd403f17ca3b2d30fa9b2f532550d3fa44e66db10e05c9af01a47301 In = 5ee361be1a2680595b409d9041c6b391191504df1f7afbf78d0cb0aa6c95ad6e6980bc095dd992ca41ad58b12b1333ac73a6ea23f4ffde4c1f9160e2afb80c464f599e04e344a96ddd0b6108 Out = 44fd48a6f614eae64bd45690e4515ddbdf08618e3c907113db8db95b1914e368 In = 3e629473f8bb27ee8144b470b9a2fceff34b8ed1efc5e1c84bccc85293402adc085ef87911be43706f9012a54641fbbe718dbcf97a57edeaeae387edf7a13be8af4ff88813f863868686bf5ced Out = 847a06bfe578bd4508d6a46137c1f15bedafcd8b1dca3c310aa93ad70cc9202a In = 8bcfb31d1b55b52108395f6d5f508fc832cd6ea12c0589855a77b43c2b03cd44a75a1c7c8962f452c4de7bf59cd7e53ebddfcb5d536490f5044967e1201b1cb99e30788b78e3ce09b398032353e7 Out = ee90fdbf6fac0046d7737e440da608e9ac750e1c2569d30b7325bda5ff764fa2 In = 1275bb99d7297f49ff96104c11c2c63d3e73661d502e2c95038571556f8979d084277dd2d94f5e325b0351e28ed2e141f73dc1ec2f4724fc6b9f2f1a3d2d0508e602512490da1394c5fdf3dd839a14 Out = 3f58eced00b32c7b2f8c26f070555e37e92f4e73ccb23b5dd6fec33b6af89979 In = fc2d62cb119400408c5294f5c24b3310e3cc162bb7683fbdf9d9b573d83a3977e329db3e0e571ec6c5babc4cbf19d139f5c55082dda989e644054db8eddfd795d558c5a719a130ef36be475c68bc45d7 Out = a9d909eea056f044c4b53201f80b975b78eafe8d2c370b7584b7022f8dc03e38 In = d58401aa36bc1c4470e6df1bb15cd420cb29838bc1dd7629ebc8ae103e8dbd8b935c40b49235f13a29896b177a65e932656565b8f83b937fc36f64baa80fd36994d793f2268eea0e6313113930a74c4309 Out = 94fb1e9a816f849367f73be06ea7b550d35dd2b7ebd941e8be85a8ae65bd99c8 In = d9b7d92b10191355c583925214432f93788a2ffc59074064d24e48a5b5019f239e19f267de551fa908929df45e7de8137ace5ac732f80ae06fad70e3f4bd8b3a5734e2f4025a2f38b47d00327f193b1a6d69 Out = 11e6c006d7c695eefa7151efb07a46f1a95b650fe7c7fb309eb718c19488e839 In = 523636cf1764e02a26ebbc7878913de804e54757db019cee2f1ff726a59b93a0e2f57b418ac5eae886847d3be0494dcaddaca260138414127540d476e9a73439b4cf7aa4de85d2ed13db579852c39d418365e6 Out = 21b4a3dba74d1fc6cb679597db9a7c0ad55e31a3a8d64d1ece8fdb7fe1dfc1c1 In = f370b75adc0518f92a5823534a6423503f92707045b446d58d4f5444a90a545d36cbdc3d2a4d34e1e9bd2ba6e8ffc5fd99c68fb299e270c06e975651603a425892f8214a68d2edc3e4ddf8311e86763b8cace820 Out = b0cab203f78e96769ef61fbff7fca343df43e6c1fa1bbcea2fbaa859a0170d25 In = 9e66d35885889b7ce605f409b360cde8d124847af45203de997b607ee3a54db395ffb171123d49d11f051753fc806bfd163ee2b72ead82896a93ccafd2b10238b7ebe686ed8acc212f7311e95caec5cffed5703db6 Out = 6211c1b406d4ed4bf4cf70840516319b7e19f42ee5b357eb750644c7fd5de921 In = f91793cab6a1ed1536811d5b599288a88ec442d1797c9414367dab69d21b06464601aaed9721e6f06c032b956b6df416c1f1987da0ebc6983e2fb40567e8ce9f7e351fdd1e155005b4acdb4e4c9adc84faf4ee40c61b Out = e2071ea33a3451b0fb2a7b9b4379d04f3108e89d51a5534749b7f84e5d302bad In = 9440e871c977eef1173d201ba630aa246662772002a17f98dfe6ec3c4715152db5662d0427f8009650053675b3f14d49c4571717832797d3e9d6ff3b7cda7f560baf4a336a75aa05bc5cae5ad43dcdce31d5d23daacc6f Out = f5e39276d23bb62ffa0847f625a69b00a562ddd6e7d58bf8cabeb4e18a8e39e4 In = 442538eec870b4631783c71409d366c53ef811b37822fd03c7902da573f66d8a56704c1ed217474eb9d733bae32721a8f4db0ceafba940a02c41f629c7dd4c6da7613dcc4eda20a87fe21f242b3abe94cfa282f41fbb8617 Out = 1c3359bc42e4734eb6c9bea7791586e5aa13de67615de18c3f36eeda4c33704b In = bb3215134576258409eab5dd2d012087313945179b3562014bb7e2f140456c0fb6ac1d60dd4da34ed4e4b5114e333e21750803787781fcd6437e5f4b8a69d4b06dc685730f70c4608ed49fe3ab8bc897b70e61318d0cc0a0a1 Out = 7792c404d7410bc2300930735b52ca9b9e870b3c6b38022c23c1692c8debe37e In = fc17ac62f9f25bc9304c01d84f2eb031a303f485c55ad3ea4113ac6a375a951fb234df0e3218e7f1db243743db0abdb388e9da53bc7ec6d7d51c2a41e79205bbcedf4e13416820ae3545fcc3ad62ef2e9d42bfb0aeeea073a541 Out = 1b23b7b5818078b45d172174d7b0d3627b82edce7e2a9f9764f0b4473f05f097 In = edd545fcfc2417902520ac9c9a5f7960ba2e39604a3d1ab5c5bd894a844224f635dde44cf7fb5494ef6e351d10798862b3635e6dc8177c6192f478066f85c98fddd54bcbe56bcf8ada9397b356d4938bc851264116fe1cf090e363 Out = 109ca6670ccc3b0cc335aa5309b6e5b89826252df91fb21f7cbab287e2d9e9b0 In = f6341940ed19429996ee4ac79c5ece558eadad018eed8e2940a4dc38721332a157e877d4914788a7efdeba439bb1cf3552f0cd77231770ebf91fbfc3f2aec8a1b99c5f0fe04a3cba0c4a64a76a1172df63af5feed73cefa91cd80bb4 Out = 863fc27d2ea971bb9dd260370ed713399d2b5d73195041bf5ad18245dacac9d4 In = 04dab7711527efcae69ad21fea72ea44ee4937ccbe0986f6a5ec8e98355d4b57a82531ef58ca38589ef94145f4bc655a30027a35b0ea84f1dec133b96c7e282911effc254248ca1d8a7a48f044c69cb928ff63177a68fd5ee5e2eeaaa4 Out = e8f1d65f3803d8e99396056ea86d257aed5019f57f15abe8caaeace5ae4f47aa In = ea252a32ade9b07c75ddba9640d4045a0a41a2036e22d49cd43fd29613d17c5885017ddde071225f63f6c620f60c62ca1d2fe53056757541ebf2c04b5158d86e7b92ffb9c5cce441a572fa8c0dac507974f8ec0ab04f5b656d22640a1fc9 Out = 0e421b6e854dd54a36a131d9141d6a83242e448eb9dfa11017685950a04f543e In = 36399f77d720da5bdfbb1679e6d58a1864066154b133ee907fe435e01d6201107a7293eb695fb9bc82ae6510adb7a8ba8703e811073e41173658d0b15e039f913a6a1e1fe8d5fa0ea95d917a2cc9b46bae66368066afa3e5265390543e8081 Out = 901e89ae4036f122e4dd7839fadc00e9193d8685562bd752b4e7b8b505976633 In = de7a9226b7b707763571861eafb351113c344062842c3e3d754efdf0f385a7d675df7b23a9bec6b27c51a383c768b771a2ef34fa243aa6071c8f1ae7ef2adfbc1706f95950bc24d2b87ab5c41332b516977b8c862e86584ca88108c191e8d17e Out = b023fcf3853c1edf1c4b3a62a7b95bd30b4cb9a9d3491062816ed15f0c88fb21 In = e083ac0e27cb66b2913d2769c6ca0d70756e71fef215dea02cc99d3dc218c75c5e42a1182cba6cf7448d4b5dbfcd5a87c3efd11eba5bd3271248874a27cc1cdb796f1f61816f76d922e5f162ac5a73e0a9142ec1adcb76f2cad50972e219e8d4ea Out = 1441b2a555031283cc5527ea61fdfd00870cc5e27aa2aea7359258bdc08c1cd5 In = 0f70ecc921afac05a5418b85269c242d1aa21dc453a607f990ce5d2cedc3e8f236c78608597a01216f84ea60f0c2ae181bb40dc98842ce187c6c1373a11be8553ccfda1a56fbde3cb2cb8a992528b3190e63a78da2c17d3a3548b46368f5a7f32860 Out = 574e6e75cae3518d9c06be095f22a470f60811570a9e34b883353bb764b91fd5 In = 466d9f69c20dc000333daf93b4b6bcb9526782e03b1f2c5275f6b1cb2e97f213e0ae511a444848798925fb482d2a1e8337297971153b944260265bb3956e960051cf813cba8b3632ab4675b5a3845fdb9a7e0eb30aaae73cf80d39a104fd809be8eef7 Out = 76eba627872f839b9fa5628b386b1ece5745e7f1fb5bd4fc4762c63e7e97f887 In = c5d7da289d4f04125e63b5b8677375f95370086282201252c604eccbfdaa94813d58205bedab4376cb7e7224d14bb47a4eb1e9576cc0c066ce6e7d889c6545c620bb8e4e1d70974e436738fc80f229d636709877792854dc5ca0e2b23bd1574e6c02bc7e Out = 7bf20ee3f8f776069fb73ba5791a0d40a2f17202086d8ffd47356eaca1593ea3 In = 58cf0022fed3fd7f6f83311bfcb8eb347a2c85e6f1a48f176baed5a57ff995496735fc0844ef4bdf10860e89e17fa5bc7dffc7047a0f6921f39b77b8a8bb1a14c0b5870fc01eb4a3a1d19a9ec33360255ea4ac62c83ce4790173777233667151fb85f07c43 Out = a793998387b2da75817d98c4f38a859862b56215f68e8eeac14920046fe78ddf In = f3f103a14c3b712c16dde70084a321c43f811778d95e14baef59869caadb9f52ac637009a78fd3891c3ef7cd5ba2b7fb15d66715d670dd0aacd06510c6079e48029a6899b9985c8f4199065cba7839778dfc3c5b422d353b0900afa207695fb82431d3038003 Out = b3d8fedbdcfc5c2c79dc51ec8417f920cfec792ad4f4579498d471ad5d5edf25 In = 757d1d325cd04ef09500ee797f59b114e7b5480a19a73d579b2faba3312b2eaaec17c03bba03fbef657d5caa5aa8ef899009208283f832d5aa6c586a7a2df9496a30fe0bd1c94b73d085ba812a3542623883f5ac67b280b2e7ec2b5135560da05a493ecafc0665 Out = 33ab2d4e9915e0fd00ae9fe8291e94e1fd52f96eb555f3f1db10f9e67c3ade9c In = e948735ad1126af9fc11485e910b09bb79a46879e2a4c12a870447af64565cc963314c46cc8d9d96f0586c4ede72a559bb55408ac6f938ca00b3fe50eb5ad1f3c8340fb078ddf40b72fb417fe5ef723ec1179f2835cb98a6c268e368e1ab0835c6cfbde4e02c1ab8 Out = 11ee2f191e360853d1886f2080c464a315021cd73b58c01ffe8fec51ece1bdbf In = 86bb3f5150b8e9f58868e2bcb9d28b4cc099d5f214ed105246945c4ca863aacec03215dd9b7f43b439fc22bc5a9d04151b68eeadabc1079101637376bb1ae4938413935906ecf55aada1db7a83d50454ebc6edd1f44c6b1962c585bd881e2de72820e378f36a038fd7 Out = 01c1911a47154f793fe0f7611ae993d0b06c8cc4d0505861f078962e58aca833 In = 0d9e05451b6059bdfd7de8775048a15cfdc3068e1372f9fa979a6a2ee353e102591e816b096ee893e3bc483fa8d838da340033c60092587b103f86da0db3d3cc87b575ae515eb6e35395b2d1b4396840b615bf857032f74e5a75e45a820706716a1238b9df20a0203779 Out = 939020707a7c19a251d1f0a2157ff987c36c829c3a0985ace76316e3d0f3e688 In = bc89a21df76da8a7f5ac6b9a5126791755db2d48ef5e244c4e4200e61de60e7de5c788c9df25ec52a50f183f62bbca2328b311c991efaf30fca90805933de1cb0c65d352ce977e87b800781f50848a097ba8148b2422676b9c50c6ef14024098cc0af0defebbd4563e99f1 Out = 2f539c7bcbb432ad32315ec23d89385890bab8875af380da9dca74960a093285 In = a4607c0976bd2cf863362522324f6c4f0152ace3fdbb9550f364efb420fde7524afb09651f5f761eb7cb060b9ebab8ea27535c5876637444f7bd50ff7f5d507c781547384208b496a95b0207a40625ee0194507620a68b91795664af65d0d2c8564c8b6548cc5b9859fe8695 Out = b1447103925b98da87633c50f2d3e1e2619b60885b62c1b0793f04ef8ef2936f In = 6322eb3a99f381a4b69f9d976d712352c58a62a377edd64c7ff9491db087e55fa90a2a9a783dd83ea95aa4094638eaf162f97e23bb90f2d4c23047ea39df9771be416492e014c7d4120fbe9ed3eaa4192b49122363008cc6aeeaae584f6b3404de4de6bbcaa6251f34c610038e Out = 3963c8d48385371278646c496bcfe364cec0cfb92f48b2ff2aaa716cd6f16462 In = 32555783580c42ae37008ec1bf29179ecededef03f99bb0bf20074de9a2d108318a3e8b8449442c35203daf5b536e633bdff30f9eba848b448e9e16434ecb9c302193867efbd2aa2f9ef75c54f2e2c049dbef0d3e07944f25d3bc874021e8dc8b88e7dd37f1cb5d03e8f1140e036 Out = ed6aacca9a2660e89ac632080153fbe12ae17ab7d7dc6a3e7de541e069c2d4db In = fda2a06369b11ef061f80f31cdc3ac77b4d52c51c3ecf0230d1953c0b5a48e041a74fb75ff703c76035288c6a556ebb726e1b873d23a97723457ea9d217c03c37fe92366b8b04458552c7426218d6e62a0a2c172fe8a4b643dd59f43b165006d451b9330a8e01fea42809968634af4 Out = 9c15cf691889f6303b8786a0b0a533a0f1058fceb0188376ea16c4141361fe5e In = b950e5be093a589e6a814d597e530891693df80957aebab9ced8553e6eb4d06486d9a421d74e46a755163cd8f5ddf04b91890894eace85829819f32dde527bc4a4cb6d63cabc6cc677c026ac934bd7c18bedd4d34a2d86b1d611778cf51b6000a304113a0116d3c10ced11309cff80ce Out = 9a35585f39e3d8545ab27b5132da68067e99b9f04834d9643221afb4c3ecb69f In = 058cf4140b79ad05bce6d0cb450f527aef6843df517b8a23488c3a534a2824c0ef1d529695861b5af83e372585e0ad90e2c4dfa408ab5ce808f7c90ce86e9f9eddfe3073d89be961ddfcfb4da32d4a5fc86b9194a40d2da6aaa65e1870bdb4a9d238ffe531f09585714c2d7d98ad9ca769 Out = 5cc4c6d6771ec993367c2ef04b7c124801eea428775b1482bf9a842ba897cfe3 In = 5f356b69d6a97c6556ae18568237ae941f5176e57f311f5cbcc9a1c0957fb8fce41a1a4dda34a7662051a7a30280bea97abac3f1268bcd30319721b20dfd37cb3bf05cc7a0263535609be96f0794592adc93943a5fd127d9ce1d9f2fd633b05bb1cbd255c6f6e3549bc886b9bccfde26028f Out = ed39356ce3ef435e0fb9e584cc24c27a9497175c7a881298d77e5ea2d1c7b87b In = 1b18364b6dc90e5d459379c518f1585daac24e2afaba95133893daca7bf3fc730807d9ab6c759842c348c9e01909c859e2acceee916f8c56a3ebe4691e6d3e1d379e941d94518903def5a760b5b6663fd92f74f5302762543810a1c65c5e1c2516691b2c295f3a3772a332d981942def7b1efd Out = 67254ca2293ed90b5808146743b1c379649a7f99633d9fcb71fb89b7fd28ca1e In = 895428e0f5822ba97426adae6545362402116a862cdc916f2c55f18a738a8ac2a961e56407b24ac9a6b89f8e9104b9ff15a5de2d522d73bf9fed6c17779249738124b5a9985460b42647b08f0838f48a91135eeb00df4ee974b70d2abaa391db88676e39d7e5ddc32f9df0fab1ef52346c01969e Out = c2fb520aae8c45ca0498a5a6e71c28c78fb5fa6f5f858f8eaef4511aac2dbad2 In = 8ff01f6fb921b70e38587c597d4701a8fb58dee122ef4cfcfef085d6327dba01ebb51154f59338b36f6cc190c10ceb9a2346ee619532be21142771171f948aa20834a2c88cfcd5684ed59d396a1576ccb6b346c7f5c2a8831644b946256bb53c41971584bf470eebe023d7e32f0169008f6094f2f1 Out = 64d3b90c1c23f5aa5ba7fdfe3d7a0d6d214576ce21c9be6d20448a7a36e361ed In = 49c75c21f696b7d83e2dafe346bd404e5fdce45f38664cf94735eabd8bd040769f8760ff4d2fd5e030f9e0248e7a9c2d148397b583839df1178dbd326148c4f332e477747d15d069ef120e869c9507a2deb2825f0bbaa8020b6463809dd9ad85ffcce46dc6a37b337aef1c076501053ce5832d728213 Out = 215b1c140334a219e3a51313a288e80a8d21745ed72e0fdec666fc586144fb46 In = 1132b559015e46e6c5610cea7193b7e8b5e226ff7644c81d7c956eb2b72e5cd1b3091dd07c77ea8bd174d473a85d2a4971ea7aa5ed7143c9b0826d8873b7b2eb6a0c59483492c25058ec041e28388f075cae1408a26b580404fef0caf6a81d3c18b387c0c52fabe677b6b4a8efb40d7fc3481c892ed9bc Out = bf83033df0319c79f9279319ce1a82c57caab81ffa6539d947256a26b9b3d099 In = 8b1bef65c1d7103fcd12b1fe39e5ecd5a564edaae6f26f5d14c9746765eb85435ecd8738fac63320ad8971d33f10cec20800075a925b6a801b1ceece155f92e0e1bb21d02ad9505c68d2c665fe2f57053b1bf38e37b4140ea8920ea5d7b1d9a0c1abc1ce2175a3b5f03e3befcf2c4e9ce7187ddb2a3b78c2 Out = 506a804ffc2bf4260e3a524e8835bfac37d0f373cb3c8301db3f90c93ffb114a In = 35baa7fc9c64b8bf871b2ce56a3d4c8856fec3e4975f0e51d3849a00f95b6148368e56d70199dbf205162f67cafd71b0234302eee2da57f0000b93dae962dfbc0c271c67f7a19a880bf3f54ece9090649b3525e2625d3d24485f0d3adbaa7f1058f852728dc49420eb0a685cfe1319a44e396c8ddfa5b0cdcd Out = f176810a1623f6187a66b7a9997cd9a4e9a41210ad70c2dca1083218794ef3d3 In = eead2b97c7e5f6bcc97b35c57e93f1563aa282e989fd6755defad07f1784ec31c39b1de29e6249c00b1df2e94464aae514384f125800396f6e0c42d5f9edc3886626844dc8074f5842f226fc4e1509e0b83dc48e3f2a69c4a9d0ba4dbe6b31c66c192fbcfb5d54e499a45d4c58da56549a29a632e8a2edd1f21e Out = e22985ec471490601639ec1e60c940bec9ac1ed166b3d1360feae98c88812529 In = 9694160ef54c31f3a8c344dec3cf2841c78968693ef56c0413a6b3aa32585279a01fe62605ea36a403055dc3fa16ef64d8724c2ba86cc96eefe6e68fa8e45d45417001e472dd0893548605fe4584ee102ef4c36d894ac22e50a7a72212c946138fba6f43d93142843fbd1a5ece5df351976fd4dacb92a61c708750 Out = 49f57e2c86d611eb3563b81f1dd0e7fa3debc437683edf0a0cf5a09767a28eca In = ca537de5ed9fee357428ede80554341a9a5bf58c8aa9e3e7bcad48febaf748a9e6e2c177927cd7f9c17c2bb99dd2a0e4164280cbd489ab6bf8b2a39ab49fd41243059928fd9e106e1cd334256d25aae57222cf96894f43f95288540be297defa6a115f075c7645a29d24d26e9cef60b187a93e9b68ce028c4a9f343f Out = 313a8550de02ac934e3f19d722e9af9d66febde1aadcabb4c6037046041ae4da In = 8d5f4a7f92eba051e546050534ef8698456afb49431aa418d355bfbfe4d45fb932672ec4fd9f4a5c4aa821c50f6199cd7aafe1157f6415aab8c297c8bbaa89ef49e3fa59ec9a557e5a75c045cedf3995d039dc0ea0fcb7a3f980daaac1ee6f26cf27d527199eded3ac2c3dca8c4fac553057b49c992c3ac733849ed581 Out = 7a25f2893b576e426d5abbe159a4284948cd74ec9491cbbef99f172ea4269ec2 In = 59cfe0fc4192f6603c76532c4f31b9faff346703dc7a035812971f9569a56d406a6af414914de2e8ae656d1a0693be4eb01d03d227e9d6368a938778473102bb43aaa21a8ccc7fc04c04a1a5c527ce5fc25e2423c4133b6dba6807391785bd054531a82073d18496fd6c76563fc0e3dbbbd2cfb54aaa1f50ca916dc859c4 Out = a2008dc09295cc82b2a62028c26244892ecff418ba428b34269007c63eabbc5e In = c1c065c63b1b848430326ded0cd23cffc644296813df0f968275492026737fd8d26f8690f19512e5a7c936050fc6b011d0538a6d5c1e75f839af3b0237d4a1accb497de6733f9717326260401a77a564e7bca93ae9fe7d257060e44ea08c350c9f64a78ce095fe29a7d1fc23de9350a47b71eda31514d134d84b5180930e29 Out = 1ef768f7ae820c2966b7c60b0cf208ab89c1f7b60f9b2cab61253c38d1f2c987 In = 290f597702e009d86f49d5362346309e26919eacbcb86165be4906056d43f95a1e181b2b0c12785c929f17a3d25943f5313641c915bf5dd38882d587da1da65d6658f89764e28ee13a24ac9349e6803579baa17d6ca571793c13f7a0fe46043deeed08922fb2e2353d8718c5f1c7f1fba2df54e9cbbad54a750da656863d2843 Out = c9c82e740ccc34fc0c14c61ab4eb037542d77ffda00d484aff97c1144346704f [Streebog-512] # From https://tools.ietf.org/html/rfc6986 In = 303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132 Out = 1b54d01a4af5b9d5cc3d86d68d285462b19abc2475222f35c085122be4ba1ffa00ad30f8767b3a82384c6574f024c311e2a481332b08ef7f41797891c1646f48 In = d1e520e2e5f2f0e82c20d1f2f0e8e1eee6e820e2edf3f6e82c20e2e5fef2fa20f120eceef0ff20f1f2f0e5ebe0ece820ede020f5f0e0e1f0fbff20efebfaeafb20c8e3eef0e5e2fb Out = 1e88e62226bfca6f9994f1f2d51569e0daf8475a3b0fe61a5300eee46d961376035fe83549ada2b8620fcd7c496ce5b33f0cb9dddc2b6460143b03dabac9fb28 # Randomly generated and verified against: # * http://cppcrypto.sourceforge.net # * https://github.com/degtyarevalexey/streebog In = Out = 8e945da209aa869f0455928529bcae4679e9873ab707b55315f56ceb98bef0a7362f715528356ee83cda5f2aac4c6ad2ba3a715c1bcd81cb8e9f90bf4c1c1a8a In = 3b Out = 18ff357b3d82838113a6f34d5bedd966990959e215d6793bcaf09a007dcbcc40b141b268ec3356117914ce9da1278f824d6192ff497f7394592f5c01ec64907a In = edd6 Out = 9327664d9246ff132b72102b4ac0d63e624cc0c474c61ddea6d516e821c8998dad0b76ccab3af9295f6d5e5b54ca46fe455163cb4039f6ceceac4c5bddeff838 In = d9d2a6 Out = e06dfe889240ffc3079271f7ee2dd1cc5eb493740fbf1616c290b1092a39ba52298ca2c268d9f26bf502e9aea51b8efa1efae71d55027daa2baaee6e3e44abf7 In = 5f9b5aaa Out = eda4c5cd10b4b66368903e36e8091c31d9161512ad3f6940aae1dd3b40a8a26fbe5dd083e6dcd4494b5123404bced11e1e00b8b149b067420842e0be53c49565 In = d9e19c409c Out = 4e969618fb56f5c267243e473659da1e225ef7002365a831dc6d32d84a353efc5e47e36d4d98cdd1934fbd3ae5e6fa3879e430425e45344ba81cec5221eeba7f In = 171070590b59 Out = 2af3c3405a4ffd767350f8c40cfe5029a1c062e90267fa4f4248236aae52ab3f4e8aac79b0c8af109e48d69c1f8da19aab51ef1f0c22dbc86ac74311609558c8 In = 8d17b013b656bb Out = 771961b062547dc8cf0545903559322133666b4cc432f91643b2a37dd8da876030b7367e19c3b7daf1f7e3e15cb6026f4215a88c8c5e449e3d5d92e4546b4bac In = c2aefa80ab5fcc5a Out = 8b5cf070e4e6add374c555db3164c6e5b3803d6f5d6ea0f6b2d2a6f03c9b36b88b2d2e36194539695f35e9d6729aec3ac54984c132025289db8ad30b42bdf384 In = 6e70a2fe85485d55bf Out = a32eee17ab1c87f5bad56d7841f2a5976ce8d020b8a97c41cd92a1587c79b8c8b35d967dafa9970ce6d1a131a8b75a814a6902388d67daeb6dd56ea8a7069bcb In = 0483fcd4440e4eadc8ad Out = 0c17f425bae754b7e8426cd0d91869814ee03e237cce12d2344e9234a685c72498e26109f1ab317b522c7b7d86656a531a96cb88830dfd4fca645096462cc0aa In = e973718f1e594eba820b24 Out = e8d0d6eb5bf09d33d57f5ed1ef4f17429e996775f7e7ab3264f2478c67eb792d45c7cfd7ebe25f235a1b87bbaeae933990f336129f71a54d14e9d07a43d6a7d3 In = e446fb1aebf36c3a59414840 Out = 7e3642b2f2786101f0069cb6e142531eae43985568739d18a26d5c5aeba78c009f909022511efe533dff6e9d080c97fec9502564edbf0310e67e7bd10ff10963 In = 47a1c512416a81b903568814d2 Out = d373dc6165274575076e4dd98b66b8d9461521f7ebcb1b213b203be989283f70e3df3530a433d83c96d457689d001aedee90707ba1aba340ce5225654126d867 In = 212002c9ce4a837edbf21f6788e1 Out = 783b84ffb712200f72a866fdaee4bd4e015cfabb474956b14a8cd413502157e709451131b23cce9d7d8b3e5086335a9c3fb4f78b1502bbb6b00b83b0b1443ec9 In = 181d57edd0521b6fbcf12c27694ca7 Out = 2ca780a2a3aa0f5b2b305d182f104260ea9674f01d203eaa5b0b6f8302fdca239bfe2b68ccf4a8f602bad1276c644d864273c145ae3d02aa534a1a79975fd0be In = 15000e6c34f7c0a0eac978222f7bcd8c Out = e6202e117ece255a9630b2b45157fd361c537b09edf12547235bd976aaf33d2595e0f8a691ab4826fa1d055c885b805e40254771ab634a9376c824af784ad594 In = c1d9bbeb7a145b2320dbcb8395711462f0 Out = 74e670067a52a446cb6ec973cffdd24149df65b8cf81e2a611fc86dbba8b6df98e8bbf5a749d1c9c5c467899d0b30989690b9d06c893e67fef8ea7ccee829214 In = ed12a3942240b77b589f42019b849b374158 Out = c94fdb116de73a2157776eb064327e29f5b13e39375189ce1f228f4826412436dfa825d89d2adc8b5a8b07ecb7458e2b6e7bc5b0050503c4caff0a4bc2c48e36 In = 6f5e6d0d619f0a5195ff8675004f77d6cdd78d Out = 7fbdaa8410a806e0f73d364d7d51c4af899a3822d7b724a149e302f55fc0e4f84de91359ac411949e705dbf2ad1b35e8372884863f5da763ff7b3458e8283f6f In = ac22c003334fa3671feab810e390bfc0c9e91e32 Out = a096e823633e8c07789a81d463d3b091eb35b0684bf4537f1019a55a3682cb3a113e585e628aa16833c410a1c598787f8a2f23e4f953eacf1d2d33883f0518f8 In = ee2e8368c09a41a51c450f13dc68caaa980bfcb32d Out = b14cc8259e2501d30cfb67f451585e52c7d7d65a912585644296af8ddf95903773c9e48811c85e5ae73bcd72218da2b5c294135304ca797c261c12b037a09d03 In = 1a8bd4b5728087a1c59e6481ff776ce2b3aab284c495 Out = f771150a7ec36c9f7d4a42fadcf8a3ef9c3b9df0316c35a5530c3dc596fb1793440ceceb4c8deb384c3d26d353c7a6a2a8c793b875a1cbad3621c2cbbf6e3d26 In = 4faee19e4d9e487cd840bb869f3718dc60acc97010e5c5 Out = 12c202992917b6d0b8e3388e5d60dc7da74bfe293de72312f872534e0dd3911a8199a026f32cabceae602a2783e9d4b334c9754a8c0f7f975f5482b7ecc0a6c3 In = 35e5f2d438ab94f959317628e0e810fedb755ec73e37477f Out = c601375b25de176aa905d678ccdd04ab6e4121ac67f71a8ab83995afa8326dc4598431165dc8484a42e3899ed7de410677f3ebe9a430670ef106c30fe08e9c7c In = 0897953815c9efcebece049dfd6d4bfd79ee1660731f2f2fca Out = 56ef8b17f3c2cff0f7de7a074c5e2a9b55f8630d999c4bc8f1026a02c8ee183648b9a85e655307120502dbd3e5b6441aa608b3737b799ef669b42f1226d2b9ad In = ba12261fb96b797c01405755f1206a82f88badb01be5b7ea3c2d Out = 87101ae97cdaa3eef8877ce88510c36a5aaff2d50c979105679cb7a9ed2e3a61bb8b37fe4405b573abda75bc6267ca7d6490ab230cee9463913435da38789777 In = f20247701f0b64a53d4bbbaf3c2739fdcc1b844d46027cd07fc9b2 Out = 5f06a7c6d79d89bba017bff29955e1de946fa37cf7c95461fd77332ca74a3dd8be84f9b5b2d4241fabbfa6fbde55b18cf3ca439512676f670eeef4220b03df12 In = 197a5c24e75d08c8f9794bd3fd661561c267d43508518293e21c1daf Out = 9c5f98a51181c5fc067da41e0f8e6dfa29a5f249f4900208ccec73d49c5e9a48227dee0c6c63bc572d4651f7c97510bba40f11d4b984a6cef0e88b9e0d96e2d6 In = f6018acd36c0c164e6df13160ddb5251f3e5b731c0b94daa255551cd95 Out = 296d2d084345da62b0717b2075cde3ff845ee9e039c703edf196c08f9dd123acb248a77756067b4f1a2be6edf103efcf62e9caeeb60f948b16783ebe237aa956 In = 0133617909738ca14795173f7e1e9fa6e6fb892c5c3a3ce64fd3d1fc23ad Out = fdda2f0601524faf65a7fb62d2417a1bb741341476fb7441dd3a234892d5e06aaa8bd2da6eb24a4b396bdcea8a8277d922720cecadd2251f170135bcb67cafc1 In = 2e471688606c1662656e4772fc9c9bb9835cb976af1c39f809d90c1add0c05 Out = ea667e8b6581b8f718c2d62832d03e88c4edc2fbd0a73918bbed547882cf9b8b006c5d23206b12a47996d22ad8a0ba5808bd7626460dfdc67913ec7941bf241f In = 264843615afc502043b929d0c9ce65779fe7b9cf78de8c80dc0b90b1d88d7d7f Out = e7211479a0dbb68784701f2bd0c53c842251aa76410d051516116763512ae4f71be0a382fbfa7a5fa68a37e1e674c06eba46981794b6e1bfea57748e2bfb91f5 In = 3672daf4123dc75b61b3ddd817c91e72c7ed14cb99005472db526ceaa80061be02 Out = 64dc2fd29144014945e88cb64d718f75ddc46a7cd2be76a74bedcc37221e6ee79c2c4563147c6e92ee5af623c52bdc7ea25e74b264049057d77246070dd68d99 In = aa6298326b271463d30a411cdfb61a8ffe451668edc3f648a09fdb6d85262047e71a Out = e4655ca9ad7e009cda207fba8e570b554d7c5894f238b88f0d8b636550f0b2b24bb856cb9c94dd6f6f69488cfb75d7a905d8fa222cd3dc270790fbcc2a8fd766 In = 946cda5b486335eac0d00b523a947ed9d95ff221b98481f1fae4eccafc8b4569088843 Out = fe578edbb5e23b801093d637907231cef1f1774a4d7e873dde62d35a06d4d8b390e20eec7effdc4a5c302149cfa0aa69fa390c36474004c3c8d69ac4c222c290 In = 0555163fcea13a9d94a1047108f64fcd81c2e5127c2217f5dba1aad516e0f65c6101e44a Out = 58dfe393cac14eece3cdf47685a07e317b23a7f5a4cd891e497999de8cce88f67ce4a29d66bd668ca6f0c87969ddb41f70ab5fce4017680fd81525c698f51e29 In = a674b40d69f6430b8eddd641090fe4d8fa4805c87ba59cfa1e476fbba2621f1b73ef16e353 Out = b92bf6b19ff9f6df2e9625d0aef0a8d49564fc3b1a287e8e91a89c7a4b9e7a8e588b398725177bb97ef4976b3a71e15aa198bb3db04dd75e259a0752272b62aa In = 6a49b10bca7480cb981c70c415a9f0c5cc54453823152cd2429218cdf7842f721807c1856cae Out = 33253a2eae6592f97e4ddf81dc24b0bda3aca1f42bdc2acc58ddc48d412a3bef250de9aed57b06ad6bc93443a8ffeebed7a03a7eb75a63873155fde306d37c73 In = c2d9e788e01f93c85f6bed49bff2b2b34de3256bce3322ab98d017fa4bd1460b10b3fe8608758a Out = 87b69db7ffbac8b3412652ec6306f249c0210bc9aceb74e3849e3a83bf2d9a94c04f476d126b8c49ca64b50c40227f383fe4379ba9b3fa04ea2565e638a6d57e In = 2674dd27e7651ece5e3988e5a42a5e61a73fd03c17a8e42aa5617a8f9bbc8bbf99eae125685326f2 Out = a8fefb2f7e7a101e1858ad6d913bfdf61b468235809cb16a237c57fd101e3e3b1e4e60acca4f84a8989efc9f5645f17e4cac2379f62cec96c51a847f27c1dce1 In = a8e7d8f9a4290d7bdd487a48a1cc385bf56b6b7dc6e4bfe1f1784863d07af9a2b3465f3bb6a8f95785 Out = 41e5cae756ed67e3395b7b98f3ba1925a566f529118106a25661c5079d05918f1d875d90534969749f7a80ee3c034035c655015a1816811a6d6c9a295a2e23cc In = 26178744ee24d93f25d6d396f3bf020c26a2e40e2798343118efb19ef6d343c924f2112452d77fc96a8c Out = fd266b262ab8782f94585542afa7ca93107d602e16fd564c77061e985310aeb5247c50f99482ffe076048d845bea58160a642c7e4ad581638ed29d1f979ff75d In = 2ec8c03f6db27baa933a0590e86276dc17378a868f4b68c56579451548b3c8f37d3881e3ba5c6124e7587b Out = f5970b0c3598c9373b5dab81ddecd6ba650f0c97e5c232683438614379f48ab94f2de94aa1c206796b7dfdb7dcfb8017426426d6af6298858430a96d536af27c In = c98c910edf468b4285d4744ebba2ea5cb74317ff2f173883fce008b4521a42ee646dcd408343471fdad96e7c Out = 0cec9a9add864e6c6e37780f99193bbb10027d3d67ea1888e8f104024166788353f8b269aac506da39a5ec7f9ca5b6510f5b36012de008962bb5d648230c187b In = 1566b929fc94e86c6cb63e9d2990d84a8853fb9db6c5f59b29093932cfffe2aa5fa2ff45687960fd3aa510682e Out = cb5c7b81c93f2445d3b7cc55cea8fb997a059d93e905a9da6f6871dce44a1a856c4a9f90120fc71fd0be21e734a2c4b604ac676a47809c34949b83f8c240af2c In = dd7f84f661fad06e41bd7e800112a50d875413ce4186085ac3bd09215f5c124ff5f8566a48a3aeac631fc35682c5 Out = 9e9fb7b594fb978cab335565c5ceb34ef4518bf74ac41740774e44e3e9f624ac12b38f46d370bc1b7396c6a1ba2ef823dbd7abe32b869d5168380465eaccbcc2 In = 2cd18e7d0017fae831ca2a40f99e847efe97a4d9e89229642e2adb5fdd7a8103fd37bb8e834df572f9b3685558968e Out = e843041794ba368622e87647abfa01966f4facf6f38001f0adf9918e36880189ad09277c6f2dc287186dbc62ac1ce47d348b04de6d39717ac1a257b78172b02e In = 99432a83ec17a04c7b3d2b8a705169650883d0632a7b0fd0c5a9eae0dc0d049345f22f115e05f8062868934676eb7e24 Out = 48cbc68dae29691fde7bc04e5bbd8b2a04b8d4b63fe5b796b681a531cbefe0daee746282f8bdd18e8cbb6204b1d6dbccc7186a81434c72a51cf17fe4c884a669 In = dc538ead72bf54088024f5b11785340edfd49af8a0a5efeff61dc7ca2acf9f7085943ebdec4a9fdcc425037887066f981c Out = afbec67099c1b1bf40c2811b20d6f5ac49c78f0b982adfc87940f2647aa15053c59dccd76425404d7f19df943c344cf2019c74f09068836dd3de6d1214d92cba In = 3dabbd603f3939029874e4370fa72e7f5702881e127727759aae87690be9515ab7a9b6b34bcb6d97294af70f2bd9fb7df8b1 Out = 7ca30f6f6716d5408147747f1d79e7863f05735fcd4830369fcbceb7a3ffd8ac1b851c637f70b9a70739ac340062241914b3aedbca3975e1a7d53810ac1e1e5e In = f6777cb2ba2b31125b049c5daf4c76a88b2d9a14bf13eb422a5663b5957aea90712882546fbdb75c1d85111a64a4272e726b41 Out = b1b1a77bfb7970c9e9943bae76255fb37c4f1d90c26400d7fff7838509d1fc2137d7d96ac72416997984ac32f7c0d9b25e74d5fc01178a24c9b211852a5017f7 In = 9daca30d371df4f72ec63e6e4eb8f039c817c63c248ee212ffc1bb7da927b69ee2892fb8f3506a90c5275b0703ccd66209586948 Out = 3f03df55140f90fdbf7d1afe36578c11a22b89506a2771afd9b704fbbd820185ffd992275542418ed0c21402fe99ff7797068daa7fc6156edc04d0a312539a93 In = 4b75fbabd032fef809f606c0c03e3d5ebfacfe7716478d2f63c10b1ecfb077103859f0c878d018d2eab25827c7288d83f766050ebf Out = 5c6a0ae66eb606cf821c4229b0091be23c5070334e6438bcc15d6c355c83c8b1ef05c39856597ae1468ba67dc13551008b876d412fc599c8cb85c1339c70916b In = f9fe72d4e1259891a05bfdeb06de7bcb0532bbc54b4c4fc19fa17c2b6a8166c047ccefb364bd2932bd6a1f17560711ba1b9f4fcf6cc4 Out = f8c0c446007c35c5019e71c35af961015ab875e33aa4eb8524d57dfc168b44c436959e57e46758ce1095db4a56b3893715e2fa0e4d721034742556ff559ad897 In = ff2ba24dd7ca5e01ded4bef79dd3bf110434ef19e968f6073696e5b42a89047a0b339bae58a2686c3ed98c687fe406dd3f10005b170f7e Out = 1bd75a9219f0c1552b7fe235e90b14c50614e6a6e5cfd992229a127e7f6ec44c5760641617828738f04fb1b3e826d982e613f59ec7ec1a5443d51071ee1f3cf5 In = a76ebf4ddcffac4afabc39a690d5e02cf37e48ba2e2ee1e993072e65c8ed7b0a8949737d600306755d89dcc0c5d714a9f40b3007663175bb Out = 1649b3b0ed295ad1c338be466e2b330f68b03379ac0bbabe7ce3205e25d6a7da6948d7f893d2214800243b7fc85d735f926436c9dc371fcd085d48096dc81e1b In = e7418b1dc66581426ab5ede88d0c1fc192a2b409b4961ac10e32c3d3e092e2959937e3396822582201b6b08a1e4b88a981469c67a3ad2f7c26 Out = 03902d2df6bb084cee2ab531eaa7789b72960a21647554176efc2949b0de6457b73cff29a0e157a6adb006af131157cdb59784d9fbd0ee747bababb8f418b029 In = e5ad10b6dc4d06532ca77e32deb57e1a9bede8f25716bcf796da82c752ce8e56e50fad210078c55969b2fc128c8501157d61f05a7b45e9e2eb53 Out = 3cd7fe015650d51ed08cf3384fc97eee996d9444a92c505487ef18105c4d7862a52017a20a67babc6c33fd47166d2e18b97ddfc090032f9e99b12a05369f1bfb In = 890fac82205c4fe10a9594e3c2632a7d54db9fe52759455692394dd5d361b33d5c8f1f74dddccc45c25cfee2f74126492742a1c7404d1d0a1f8ae9 Out = 137253d175da456fa5d2d8b58480fca2cbd8650a7638985b03ef3846075b564285c9330b5d575ea6779b583b46c09768cc4513d69a4c0f1bd0878a447da129b0 In = 9d58e6064bba32e9eb6d57c75d53bb403a8f7d204063fd71f33c35a308a2565d5a36ab0b723c9c5be668f86422871fca3bc7b0d1362a6fe2adaef595 Out = eb8d73e311fc1fb7d9b1607d8d1497d9007d4731e3de20f1f484edc3f2aa0bd5af4ccf1829392be349cda7246ab6f15fa138ca99e5dd43d484550580524d2bd0 In = c391370901c5dd79501f24433c565530867144526f12adb757e2253493fd5a1f9532ca2d7171def0ede45fb8dfac90fdce2ddb271d385abd2e8a3ecfe9 Out = 31c2c64efd492f512dacf1b7fbbf9b7b0965d33fb5744e1790b27110de4b396010d488823a1325acdce28874c1f86745f9a8e9a758de4fa96594604cba606beb In = 199fa68a43940186477c54939267a58e6f49f3078c97f3d20a4e43c35e184ca22d5ecc681818db7d56345ca83a48b094b748edc997c6e5a1a69cb90faa07 Out = d40c078cff15daac6bde0e53f43bbb7ed7d4ea540f89d36e03435bcb98b575520489cdf7e156bbf6f78cc9afd24925a3e0c77a21381d9b998ce4d52f3b96a60f In = ef743266aefdecced20679449be54dd9311302a642edfc6a961b7ec6aed1fa47a3931ee8577b06e15a806991ffb61dc1577a3e0f6c4a1c4579969bf9fafec6 Out = 8f608e9a4ce7165eeb449bab8baf25795305d23e4adc12f94480b0b1894ce38264d83ea9a0d463b0c99bcf6e4bb978d17e35b3c1c15dce155690b57f4ee51926 In = 6277ed0cbcd95d4f45f94ac9525effda8b823da886942c662eaa25ac8cfefbc826046c5d017d96d0cbc3fa28e5f46c466432ad3b7e204eb181cba531f4f289c2 Out = 04a8f7eb4feccf00281bca12576779aaa0fd81307679a76366b6ad726f4cbf0a9e16f03d435b561a25338c931750ab812cac1bfc4716de0a408fe132a7d5c9cf In = 44d2459c2ed212173625fc921fdd05a0f2d6593515944bfc5ca37ef9b75ae3e66234d124722ba75feb698ffe11c319e53726456d9417e396928d8519a3e6898195 Out = 0cbfeaf77ca3c157be6a367b0fda771ba5aa465f27c4a446fa5e23356006aa43cf2a0d1aa8803a2b85a34298ecb99936d8e4e986dce6fd698dbb097b7e3ed8ab In = c28586cd7f97005a210ee7b06337e1563b790c6d7b288fa628073be6fe551056d1583f3917397b719a39c22d8ce2f2ca5cfc78fb912b589c1080c06b7f590f2ad67b Out = b7f5a3675613a893bceff1a9d296662e494d45e87a7db71b958e04a2e2baaf09000941f19b1ec57125be2c6424fa1113b40ad7ea2d9283a53fddc6c78f6e7480 In = f0062b110134689b36b376b03a7dc5adaa16f27ab7f43b920452e101a2e93895d97319740e148bccda1fd85ab98f8636ae8db43953ae30e0440c43de83a425eed35411 Out = b283e3f1324ff344298c22d33568ddf92775a72fa5b5c639a51624ba87fdba79365064c1ced08597605d1ab33f0f77e15e9b010aaf4d690b99fe2c081d5ede9e In = 65e693170473037b7f4d5372f11d1fabc0eb72ff4cc059614c7bb3694597cbf9e189138f37e8c926543261f69d179c47718c6883032801b9eaad1e7295356841740b30bf Out = 4f24a696580583ca02df33d70c5e9b4e82ae5859ddf68a9f80af6e034b9daeb495b1f5596a1a780361d8fb33ddd60803d2af8de0de5f36a2721220f0adccc6ae In = 2e9b65d04fcd235d21e8acef2e2d80567d0a3cdadba786cc6268578dd1c5333d8ef10da3671c243e32d92c81848820ba64681e7f8c51f1fb8620bcbdc786a0f05e1cec2348 Out = 636c0e5a2efa1fcf4a3ba96e0ff917f46d957c48127312a5c0e74019b322774c452bcf32954177694754e00e52b865a1f6cb2ae96d2c327bfed426e2c12bb4d5 In = 7f8495ea658f2ce8c4817bb260492e40f6b65244009c379212e5a564e1bc44acd213ddbdf1baec91f5051b400743265a7827c48819885dad3a9bc7e2cbbfb7d6208a9288bcf7 Out = baaa475ee50e95aaff848abd3caed0446320ac893b51a9ca32d855ee82cdf6828b9ea3b16ef84a642ec44d72af6b7f8b96532de592ff3b644c3f436683015501 In = f1ab2f2ce1e036f73e58b0d74b7a93e29ed355b75b8386f53d4a7283c662005cd5d854e6927f0cd5432e93acb122bc69e917b80136d2fb53d10364d9d55dad74a86eeb40e7f960 Out = 71dc6a61bb20a39593dffe6328d4e2a708cdddf23cdf2036e5a2a7aab3bdc846db09c3858dff87f53179bbff6506dbfba4d534e816adc0da29de8e8dfb9f9599 In = 0cafef801e88d61192b5596e69d622f2b4028961710fe2aaeb1ab922d0dae29203d9d67f4a68f09a60c7405d7f017c32bec78c0c0129e37233935fb2b5aa3a0fa0dd6d0df43b87db Out = 8e944e832a0e9f6864a1e44cdd70b450e049b1f9fb4379bb4b9a214d4be987c2f3e6c0ceab3fdcb01e5e4273a5d02d23c89442c83131dee8303a82b9966b58bf In = 4d9c45b2083b29fd5e86287bda45a83e746ee3a4b59d662bbdbc736e5953dc092a469ac90744c613ba608caef1616a214e495ad9e0291936240d75f83b06657ffb722dfe1045bc9974 Out = 1001e6e2424165b6da8d9d91e8790259c51101b98fe2a1330090f66434af0ccb8028e44920d113e2e89ad94e9acf243a57ab639bd3314c2f82ca79cfb95aa451 In = d17fe287ce02fa1f470b2106d5c36aac41e10f815d4aafe0081f9b2ae2f7ea3af0fa71679f962289df3ade400a3b1c8e364146b9c019b183314825d242234e0f1a98d91d5be07cd37b20 Out = e2200d8d503ce58e19f03ad53f824865c9da26eb4e9f6674f663cdefe8c8af7ef91f3b687650d92df8b1a79dc7d2aca62bea773472edd2b063f35fdeab2c56fc In = 874663b94ce93041cd664810e2d26c433cc46d46b5d18453717483dd03a7647c47e2bfdddb5cc4eacb56ff893f33b0afd0f8077da7f2fc892c17d8f9105f945c658780119a87bfc90ecc66 Out = 5b5c1927817bf07428846050afd3f37453f8d399cca07456fb5dfd3ffbbfa962c4a26d9e6080d2873ab11e6597415fc0a3f51cbc0919beab45a6802b6dd2bcd1 In = f88d7b015f14bd9ec5c28e094866d3ad37bfcd0aa461b18722f2645386bf917e7643ad0f53a317664567863f2c21d0cb5129029c31d27784c4892b0067e2d3a11cff9f33a4e7efccd9477f4a Out = db9572aa08250f6fb7603f062824c5bdbef5e6e86d69e2d857dd0a2da48f6613fd14d555357dc0d41e1d78e7762de43f8f90bf3c767563beda333e1fe8103c0f In = d0c58eaa30a787d1b5a77240462e16e779ab65053200c78409e653a6726b069dbf649f7020618261bdf8323bcb63e1aeeb8d029a96ad599e0bef05014f82bb166a0b5f5b011f827f4d6a68e0f7 Out = 1f1f1cf55a587ec31b7a5f4f4fd03447da6bc5d70c51c3d79703112ac0b175b4c4b14ea26cecc1cc1f368755924ea405f47553f6792937c8d158fa2ff3466ff4 In = 2397424611e1c1151976ddcfa80475603856443b1d06621ef029fd33072a0840d858a414ca06221284b97817756e28325d6304f6ea870286a7bf1fd0efb04d5b1a23d17b3f82569fa71ddbea09f5 Out = 511d1f1f02b3d37c07e60f470ff0484527a896f0e894c205906aef36048989730fc00fcf7b2a33ba3bc1172b13935c2665f5091812fb78946c77c8ddeef15910 In = 4c044902aeaa2b87e54b79904fdc712cf49c88a31685af805a91ee439e24dcd9006c82e3c64a468640501e0cb37c71e6f54fe74cac841e8949b5abb23da7c4b733baf16ac78c0d20ff333efc7291d0 Out = 2129358323ae44950c68ac307af72e18c3edef3647996668d694ee9e7c5ef45885230e09780aaf0918d8f0d5c607dbc9285df286793e6fdcb51048f824ef2061 In = 7558a62030ffbe6bbf306828fd19bdb7843b63a003c4682720af64c147ff6d44ded3e94410b3368790c9f8d5cebab792147c63824122690e00b127e0fb5be9a1641c74151542b12dbaee773d9c6d2ddd Out = da65f671d11e0a93fea8770042e14fea409b183f272fc55d20f5fd94dda563a463be387717845802fcb2e3328ff58aef01b6c81361f00f963c26700f0067d0bb In = 163a2ab5e0adaf40870d38f5b20119e2df910942c57748a6b5319a8b4d795641f09b0cd4bb1838507d2292cb11f0dc7057aed264f8cca42ceb77345e5b720f873c5908d757b64b3f60124dffd6bd464c90 Out = 8f07eabe7868aa417acb0234ae1804efb1394f41f213f7996e8fda2ddd321475197541445a56c45ea9022c8c811fafff2454a8122f8d881e0bf2a2fe1f30ec4f In = 0ab40adc3e18cd5d04385cdff7006b7a24b62e082553fe41833ff0d8fd7e654f5fba98e53b754169cb2e9df361b19b041f5b0c38a470b51af1fe7ac933895326989215a28ada21de8ae432721bc4889bfee0 Out = 10cac42b749c67975b8cd55bbc8d5d74fa4461a849e334c323429cba9bf500f9a4886cc290d339b98b54a5f2b937a28209a9cb18530dc275af9196678634a501 In = 4dd70045fb8942567291e51acee750cd868fcda0d99ab7fe7cf38b33d33c6db286a2c4517034c847ca09fd563161f4e8d77aaa3ab6a3f6a2fde602b0338e29b38311bb3e31cd6f25893fac5d79894d213a9ea9 Out = 32cfc813fe7a50e820637efbe11fefdf5fe50b15aee07227b3c457a451a3a285f92fd056e4ca4ebc6bba05a1f44a993dc3d436a3cf36a470724cc5dda9dedab1 In = ba90891c45d5d7f84596b694ed1f40b957bf0f0a1a3c2f9a29bda4cfb8ff5402c973b4d60fb2537e10254d067093ac21f797154a9ec9301dbf86ac5c2713151331de40dca12b09abe9f0f7480a4c9d1c3f8d1598 Out = 9efa4348fcdbf3eac9cae2ad684470470cbea535c053f048efc3f7429e0f94ca7b3644378aa4aca77b5629ec08ad29230e9281095944c636a34d855cd951db47 In = 5bf8e84d9e69a65110b4fbd270ebff5a30ebdb3eeb685b563ba3dd9199c7460457edb9fb2e24e3fcf51b3eb4d4783bdeb1d3598eb5d2763dfa005df52f58c5d5f075cc168407de54b38e25fcdc21dc36993b9c5841 Out = 1a50a431a8b935e320f779d5831753e859867f34ab40a2b2f2f9875dab894657fc16926cb65228a19f9737ce059a5e07b11348c424d88e03b9236adf5ab22eca In = 4d4c5077437111b1be561f83d76a3ecdfcde4019707fa99af6c05626bee292920fadd3890dedd3e91aabb452df9ae3899d4e51d123aace034ef3fa1f91db93311c5f80881ba1282a67a79ab3b4ef49f86fdb15186849 Out = e3ee5573cd0a66129af359e649b02e22407e6e4cc7d73b2541cbbcb349e1db458b22a42f872980f1bd454775d3ea74d8b8cfdcdc72af1f66272e793aacf3c8e6 In = e9de80036a16e088f42a53f559a0c3b10cd4228ed45df727ae11c890c2da8352d44a6cf2715d46625e60aaf4460c2bafc937b810d6787c2904b27d81be03c2e0f26a8c73afe8874c3df14a308c8898888be519a934ebfb Out = e5a5acaf9dc4e894c679ed80b953caf5b4b5cbd5c9235559f8d128110abd20e1825cfb386990818ad70c64b1a1d6a3d47cd256a48514e90002f9b7a1683ef8d6 In = a4b9b82d780519044db99c7f67f36bcda7adcaa4fb1b2fcc3685f39c2733cbb6f13ff18b0522160e517186fe17a95106f27fd42a6126a7882fa50bd13357f2b427e7f02aa042009d3112a1a8f29d655b8686c73271de07e8 Out = 8daab564d51b08736768e28d62b6c4af182f5d73e55de25ab6180240d63a8e13f544e3da542263c8955c2b6ffde018230b62da2d0c768e489605e5792c9d5694 In = bd1e4d984d952dbf0193105616e57aca9c755cbeb3f527252cfbb8ffaf7d31930d5d93c9a85c8f781d9993d5e8db9dcef35e8c941876840bce550d67f38946a1e16434a8bb990c0f1036e3abc89e7abbb9d2e12adb4885c91e Out = 95ecfa98bcf32ce506c4e86cfb11ff45ea0d0eb78aa9e55a1300242e351a7efee2fd452cdd060eed6d75265878277cbfd9c6b6301bc0aeda31a0bfd8a7f91906 In = 61956799b4ce0d4c2fc1ab41c6f42c447464a43c95647b7ad6b5a560595be19ca5f75118688b4634292cb6ddb05b3a0974ae5e8fe5ad086dbad73e5162c76b55808c162d6fdcb70b5b61be095906e78d29f94f941cbc2b48bae2 Out = 4a1c77a75badaadc8d49bd977bf61a9c7c7d655d6f528943662e14bfb49c90288d845d6bc5222c20602d1d2a573239befa436b1d8d2e27e7952a2418e72ed20a In = e6bbccbab5281c33b80d9873e0b28668c69fb536ab6d65fc782087f07ef52a96ae0033cff506a4388d770e4930c08cd23d10372d6fb70cce2483599b440ac008134dd617e3fedc7183ae50a30a18646cfe10b93700c58fe3eda5b9 Out = 8ac058a12587d82eef1391b20283c11c44879cf83313ccb1c1103559c0e21b1e5ee2bda2c97caf49bf8e6e90fd207b419538f3c786b1cac325addf85e50e7df6 In = 362dc1c30ec015cb5713a79ac50453f7ac9504d77211ccd51cb19d9c08e40326e69e554510597b3ddda3d7f6fb8d7cf9d88dd50e736770b1fe19c6e38a9ef371ce2fd9e89476182fcff4ddb30806726555102fc7f948387a5cbf353a Out = 344a800d508b9b81ddcedb381d707ace854b5481a3f2d97c3749960ae9e3047b0e00a98934d3d4aacbbb4aa9a2ede41108227cea11753acd6fe606e253f98745 In = bcdbfa1704be6925ed7d9c34458753835f8954154377cbb3f7746845498ea040009d5a3f9d774f6a216ec9b1f2c450e90e058a0e7ef0bfc0e64f8515d5159a61a10b4059e8589c01ccc3d0730bf09dc941a95bf95b18d6984f47877e0a Out = 12ac4059ef82a3c29b081627e5b95de66286a459fb74c0ddf9dc6010edad16bf58718e397cece02afc170a29e42ab4706a2e2643ea0a06aed850cbee213b21f8 In = 533b504dd9eeed0c335754796d57eb4b278886561e999919eabcb7c3da1c5a8b052a954caa1ecc33bc70822f8ff61e69fe6a733d9729ad377fa76c2750245ac24fa3628f757baad1f21bd954d63d4fb170769306c7fbd0668db3ee9c8c04 Out = 1528cb1c03ed9a6838d377ed2deb015b910421b8750c5b5979379556010b2e1735da03b97781f9475276491bdc6b579c1484a18ab7b72d0928c46532a66be675 In = 8d373e21cf0533319b2de4227486109dcb979ae9172f281cf1c8478ceb5abdffe35ef8a60e0f8641a1cc800ccb76f8fe049f39ad76035f991956723ad52b4cbd2dc8de86f1ad33b431bdf72d6fb28a908cfd26e345c24a92fb0f9e6c8ee3fc Out = cd7022b592fe6fa5f57c7b5692f092518cd87b937c11d0c7e568748310896217f6ec795dcf61b356d8594a6fbd4db632ce475e01a7f9ef3d9fcf9c260b679bf6 In = e72fa945d88171e9e20c5cf6cd25d5ecd8ec5936bf23d58107c1fcc084377862629f19baba07ab1a8e5cd60b5327e8268dc8e4fe2e60b903eecac5b19235d156e63897d2312b3482b7959ca201e35c1ae487d436d41cd33fd546c75a09e4ff40 Out = 9960a10264519f99d4998651732c1ac8ad200c7795c169c2c509c503d468a776f2de06b5ec5ae45472621ec92109882c602e010f5eb2c28969b18895571a6087 In = b209d3c4e588c74e08e6c902b439d899ce7b41391288c2b089937864cbb180c5371982c75ad1f6a695748dad6ef56d4d4999f14093ae38ca1bd7d44591b4d76cea6f673d69b9bc045cc8af694bb30d3651194e31f1bd953cf8932d3f659d7cf1c6 Out = 3f9147e10a6f1e0055577b7b0473f33f480cc18207a577da976f43665a3a6b755efb1d8820c1d42bc5d90aa6cce46c9e10e3d779bd21f6ebd66c842ec7ddf8cd In = d2dd127c23ad7da85220fded2016c6b50e206aba4819f83ede973a6cde9fe6ceca93fd6565d3465b924b91fd935d5a6edaef48dfb139c0f561a9f88dbc665f80c1fe083f4e4cf4ac9ec0ebe1ef0dfa848c340d58d654a4ba04296fb1587ca34db70c Out = a0adc42c7687ccfc1b11589b4f15702954d2eb07b5d6756d84308c989de0b1a9fe3dacf4e9b0595f99fa49df6c40b8b974e0272c622ad3d128cec81c4068a542 In = abd8903f11fb694d4d24fe19e43e9aae437f860c756d36e574b2448b7b01e282dd4febedf515ab1acccf7eb714256ad64f7f8d8dd6d396ef08d44f485c03880987105619a9ee2e77ad60e52e3bd1b460ab7fa60f2dea39edddc198168481571f6d83ba Out = d41259de486a86749bd95fde7dda03a37eea02b0888114b12ce72356778259c79c7e71bf6738cd76b9ab42d918acd3091f76c7cf534c35eaf3cc7bb9cbc7a812 In = faa2fc56e8c960ace8e61ab634421914a4df93d69876e607ec44a0ec195ed03109c6dae1868ebbfb8b483ccb031a395d9b5d79de3d280d87b48db973bedd9c34852f2db6bd1aab004e47c411a182e63045487867fc79cc26ddfbfa45dbdddefba75210c8 Out = 300b6b00c6726ed067ac9cc65f9e09a0010cb96a1f06e33917b245bb34adc50957a411e2f14b6eaaaa7af24ce74286fa317da1f1989a9939c7e0c26b74300b76 In = c6fe896eba8bfee855d2a6b3f12a714d287471f7df44adfc6215d7a2e60cda7b22d167456f3def3dc322b01f382099d833065ebf7fff74dbe23a56f1bbd9a55a9371ed34681bfe17778004d01d6a33436271052f7621c4cbcab0db61487b542aa24a0d6497 Out = a6ea4c25266e3eceac8f6583e35b0117d7b96e706d72edf136ab5b2571c843dea3e5c2401a5e6b30b181100f16bc16de2aa64889488fb4bc151002956438021f In = 0af1c2a61b8a91d9dded5274749110c97e191ffaf524dd8b54c39cf403f881847d93e2267b33ff54ae3080dc49ad4379044d4cdf473bcfbedb3900fea4e791c91e539c7db59e1bcda15ae2f5a47e488dd4ca6fe3b69991e8572ac8910b098cea9fc0c4cec35b Out = f6f17611638cbc788000915f6b31850309043a0c25efba5bb9fcb1a2aa958c20da32d6ab80d9459ea2ad2d776ff67ce7fc53b1de2e2b6a9718fbeddb34a59800 In = f922734038c8d64f87d1030959bb3b8575c49221d273c120cae65d3fd76a6bff08b8b121ad81902c7ff9f404c8746cc751fec58043c9f1550ef2fff039d176374550d3d97b6bc55855a3fc8c2e6eac8bb6cf9f559ce32e7636caf0aca4cae8b55fe9f47fc85096 Out = 1c0d7f2b3f330e5937fcacbbe9dee717a827d6caebbc796dd941b720f65495800573c2db04e224773291d9a3e2a84ca500285e82e2f35b5a65a3e47b1963dc0c In = 1dcbb28eee8307bce08ff84c866eb4527541164038e2f673dbde9735f03c90018fcaa1d59104e8c08a2ba0599959518ad4352f786cd31691db31e977eae316a0e15d9b4026d02c6e00610f42bb99159ed120ced2dcfe959b67986023dc5e69bde3eb6511bca0a537 Out = 160aaf945fbb5c0e596446f512cbc86129df322f0c8e93307d284fe5fe06a3fa5f55c680c7619ceef50ffed7b36b293223808b16b070c1b6f027054b37a0f612 In = 5dd87becf9d60f556da87098bc2bcaf129603a606407d8fa4fb4c25205355a5208f949512eede3be67587158d4354740eeb81a42b87444cfed39f2ae4c874f3e0736e27329ba0d321cc0c2714ab80c41c7d1715de61daa8352dfc6d9b533e4b09ecea674826832d5da Out = ea6a3fca655b6c78b6dccc8183826ccc1a66964fa88173518d170703c1c411af07b4acf55d73b39eeab7d95c214122cff25521cda2218f1c0c238a95b09c220e In = 50f2c9a0245fd50652e1a635939e64a28ce413d5a9580a8eecdea165a54c9795558089b209b3d5703ced757baee7690d8524f61b53ab234c3affdfc52bc591a61f168f765b8953109c92a5d1c791986d59a68369d4cf6dfa62cff9d644924d0333cac25a65d2c6cb4202 Out = 1e12c64cd82120e2549c8ecb62e2d1ab82b3f94b1c636159f2813bc279ea6046282f614268333e7faabcc82cbd44b04c72abc15f2457abb027bf75aa30554412 In = 2f396538334596e0298fa27abedc266b305f55e5064499683438f4db441c8a22539133b3389f73c130ed0de0728ae1c7a7569e77dc1ff2403ab73b27630b33a9791420e6231d8a7612a613970ac9a6210eeeb8c97b19008ae75013d847f59032d7beaa6648da77f73d42f9 Out = 964b31c2eff6d506902f91e75479e1fd3eddbc0bee40bf8448e6e032dae52f4bee7e56134241d2a66cc6e797f222273f3fb0acf56fd26c06b15035dda18e93c2 In = 252ce518cbc509857c5062127ee825350d004cf8a42e83149bf93e8fea61cec053562a0de80c3b7de2eefe35a180a517dc3e8fed088648d9c8247f027124faeb036c3ec354b93b21f5ec1fd3e386e459560b298ad21567512e0bbc2c8cc0b9690e8bd70e43a3ec720f1ffef0 Out = d70ede276696a648c5dae5d6ea464d69e5cbd582ad45390753d980e7fd2014a00e7f7f30f0c8e335d6ddeb1c1917ae0ee4c9b824c1ee2e70548c2523fc3fad44 In = f2680af81985aa7c98378c1a65f6a033e020397463a041051448c391738e206e85162fdeb1e2b905f864b4880fc962e90ccf5fe2598149a397d7d0dc105c0c5f0880b3fa2364c77f18c713177555f8c808c48d9904438337170f2716a573d446878f8b3b41997386825f3d30d7 Out = 70cb714967c5911935ec143fc8da1254d934a2487e5a809c52431565a40f3bdd4b199a88dbe5cb30ff4b3b351ee97dc94da96fe471578effd95681964f92b34b In = 6afffb45e152c7dd71fff6040fcd874099f2121047760a8c72eda3b011043d54b37eafb1696c5b3916c58875c17c0f45c70b2d5482db9310cf47d8b62166b7252e51a4f14b53a55b49e6175610a010fff45c200b610a9057201ab16aa28283d4de718ab639c3ca12e0d1197091b7 Out = 2bd8bc98bf3456d04572831341874de526485a2c98f5633dd3f819e31d5cf970dcd070f3d90762a646a67d5846f9a0cd38319b87729ec0ae042d374b625801a3 In = c9798a0b43656333afa44d3bce7ae1582f1ed53b666ec1efffbe00c44374b05436c0b0e7c5d16bf7502505e01d3d2a2c454623a7b7ba8b50d6baf78026132abc002734299f81b9c1140e7d23cf3007fa9d1d378d0b529ab76073feae78f1928140fc5b92a1c5ce2fa28b2d158df791 Out = 8a628186a0613ffb60d981f6fc2b2fe09785579dc5aaec293a82fbf2370a46c7688a315e5935f8eb9131fb066335e4b54dc43579d31e583cef1ac267ba762b61 In = 8316ba0818279f8edc939d90237b3ed908825893944b757a0617f90ee4d8668ee0b5c9cca011e1d6870393791f7bcf185867d4d86d3ebbd6ede6dc473797bf90985301347da96d078b6d9807b6fc1835da18791d4af6e0eccab6ddc110a9a3ee73eca9ecab58d5b7529683042e4f00e9 Out = a4fb3e747a6430fa0d1e976cca6dcafd3d45d4a5d9694c47f9fb18b0ba5638d10483858d6e7856d406877390d08b15534ad01469c94032b9b1381ab114277c01 In = 8031f0f54ab95a732f1e801388f652883c549ac0cc8f2228b5d4ea412403e92381ce25f6c84fdf65c8ffb58016534233aae04f074caf0cdcd80d15da234abb6abc869cacb6e0e5adc6405a8704b7ee1be93e2b0ee6056e9820abd26816c2fb440e899734f15b0082f4ec86b115020831d2 Out = 4e0fe934ffe9ac57dc95a5c2d4aa4642399ff18777f0295367f84980fd8faaebb9a0fed69da6f043a143e996325c9e5bb7e0c42348e372c6d4913606409fea76 In = 033d9a821d7a2c8a597f90a8af448ae5dd07514b0d9b10c6a8ff4486543aeeb6b39f702ff937d410b022e43d2232e8f53ff7217ac892ddbb396cdb29e1811ed027256004e03e5c83e6cdf639a89de7679003a358f486b7b01b33c12ff17aac28d1fc130c36582fa10b079cf10b0a1f032bf3 Out = 1efeff146b1b453e98478e35b648af685408acae671aeec3bdd72367fbf2e078d3092ef2e57f25cb441cee1d31f180b6cfb6b2ab6297787077397ff18b73ee9a In = 20b6c10f5ed768c2201f144cbf0d6236cef0c3d7270d74f498d3f15f8e6681516db6a21daa583ac68757536277e547f51ffab7c274f85d5a3271e97f65b10331098a852ef93836c267328f9eaa875ffeb72ecdb59cfed8d73075b3fdc8a38662bd43352c489635749c15da8709cad5a1a278f0 Out = 2ebf1e5c53345b7e807818f8b701bf49c4f9398d968b62ba5b81212790f398941d4a85df6ce720dfe1b26430b76c9ecb0bf3bba7c9cdf6bbad3770a12465e834 In = 73cb8df4c034d6d86b9c1f584a764dcf93266324aaf074505592c257dd3bd693ecaa0f5afd6591d4ae73c36aaba7dc5c93b4a074a39320b2227470eebf3dd5b73dfec406ca9001b59356e366f77f6115de389eec91813216e6fe1a09a8073c9d7324110bccb046c23d724140be0c3eb8d35637f2 Out = 66d03c7d467960695624fbc8bbe8a49c7e9c0ac8fd9d5604046b42311bfd26e05812a5ae00e5ca19b10ba5036b4f7b8f647fb91c83374ecb1f68cc90a6beb063 In = 6a7e1d7d344fbc4ccb692ca6e7d712fc59718de33814449350def4dcf8cd826a3d58d0a3ea6a53f271df302f07a0f9a1aefd51ad20b54efa0c938b0fe358c2bef597f933c6e36f514d32de5a820163cccf80d717518fa11c20bc97b3e79f23659d6acc4b293b814ed54bc4085214dd1606ea459ae0 Out = d89d6c0711a6f8883b2a2b1f92674c4c3ef7859069485f8f35af257ef34b228acf9456f3e94598ed3d1433b83facf81d3d6870cd1ec97980d0dea5aeca382774 In = 9f2788ec7c464f637e991e7008d96717ffea2557ccf620129b342d20c9682859fec6e603d55d544287218eba5722fb194509be6fe1f4e548122b29f994e5d4f9ce62ee1d96ccdd15fc5c5094d1844ac35256ac4f83a7231bf251c5229129937a7c1a06158e19418c68b84f9c955e2e6c274b74dfddd8 Out = 22e35a1c5b9a3e29696df428aff40ecad84a5f8cac5cfac12d5df1548906b4ca0f41a6f7f359ffcb9624c9a1bba018f0fe79e6e9c79952d7ba91ec8f2418dff9 In = 1e0437301c010a0aa88dc418d601b90a2b52267385ec3bd7b405938583bb183a0abe30a7dfc1ba652060a3fc4d7586badcdc155de81bfb7f3ff66741e8bcb4d32e6f0bc95fe79d02e4078d5644477790953f5674f8cb4dcf5ea3b4b757894eb34091de2110fb4a1a8a4f0ee2689d1ba1cddf59faffa2bf Out = db4c013f466277156d05a851801379bb3cfd3cd101a6f366df49228a7cd257f53d162e740ebcef95b710ef198a3241a6012db49f0cef443d53ccecc848f8e916 In = f900dc0bb3dc2b2dc0d3aef028a98d62fdc231239c8fa6b87ee53d635431f19444a1dfd2ec889f250e5f4f95fae78af3ea17b2731d18ff04e06fa439c28d927b303e7a871c9a3df9191b672a75f0cb67cefa1a774187b2557ebe6cd88c76d388ce187679c0937fcc891c9ae34072fa43036d201e534cd886 Out = 64ced189b17331c0d86b5ee7358338063014625706ca703eb5e851d4eec30cbaf432852ae0ac20e89c66fee711ca95715a429281a23214bccdd4249126ef97e5 In = caff4c402362f32432b24132556cf20f7e4cfaa89c02820babff59bde353055c6d856a8d8ddddf9bae3e5d0e568cfd19b1ff45c97508a9f983f520dae2555f7e1f56387f4f92a6977349a0cf96c7f03a0f99ccbf7e12567b8ce714da3639ba102a40a6dd04d229c476d64cd983219755903f359546a86eb2ad Out = cdbbcb3f7e6cdfb42475bcac0933e94d19aa65cf321e1729215429ab43d13945d1b143015c50ca65cf82c0f61e334e935b85d166a94586f85f3513dbda70b5ec In = f2706be94b3fd3a2453471796ccb7b0f485b59f940738b70742cb352e045047f2bc61be80ee06bd081435ba92f4e10b0ce70f1db85a4686e699cb006ffc8109d0567eac3779c29c544f8bb7b852367645893358e38590772c18f72f8e4e4066218146d3ee6bccb8e4cfd750a395bd44888d7b1be9a348ef84ad7 Out = 11bac475ffaf77cd2a53a0e758631fb6529bd3880e64e60cad005dd72887174fedfd6efce4f2d4474f46e2b760fbfa293b2199bf5c0df0dc913fd14ba0419ebb In = 9f2b0edc6f7b3bed22228c7ee29c1082a53da7ca90ba44b993942c7bdc9b86562cbb3c694366a425445774e8dcdd5f81271849c452706be155d929403b80b0d100cbc471e8e4d91f31e561e469be9a16190b0ba540e9062f563bae8ef4851103327ac55c22085a75346b39e4ed8410631ab1b83956c5e793146176 Out = d50c19ef34b83786f63fa9d8105b4aacd8fa84f86f61abaa3fdb1d285e8435636a6e18eae3c134a6d818d6591c62fd71d7725d368b4bf1d1a8a8d825f6b9c3b6 In = 792d7eaacd3e0c3c4d00db4c9825e60f678b57cdc32731a3e0e63f70176dc9b07ca557cb50eba88bc7d14e26e4ca99b468101d479cd155d529c27e88001fceed2847fb08edd21c3b8e6c36df39be5c6f50742b335f5de0b3b9a01428d620bb0f67ae388c7f6ade2055324f8c53a9ec880d1180795df3d454c96f454b Out = 478502e942c4f56d453c7a3808a6b88a2d99995373c130614c1950a31fc0b2c141e7a42ef92c926063829edcbaa56104b012f129ba545719aff7c56c2f8649c4 In = 221111d2486fd86fd89866351f78ed37e997bb1340d5d0bf3b7ef0556c2ce3bb26e2b17e045e80f34990b690a0df5d4f3df50923f8f21bf2a8324824e9ac202d23f90a4cae6603bf6497505de4ee47d300fc31caa1f05fe3d53cae6bdc8e2f64de5e14d434807b7672a34c57041fc47e383a17e1da5c4bc3dac2af9166 Out = 393e4f8f4f8cfa739d5eb8cb994a56278df05f51467ea0883040f00707d8f336b2a63a62275762314939012fa5f55e9624765574f3695e510d2160ddf7d941e8 In = 2c11481c5136bd4f48bfe367f1e822d5a96f3c4ce250aee1e7145e84d40c946854d22c34680012c975984059c6831a8e95d35ebdc25fbd0374c7768fe57ac87962693494e6726bb7cb619a13a676aad1090b30619166085fff9c374f721e1cb3e65be4a3cf440b1292a61639aff64a591f80a566593e03229106455e3679 Out = fcf78f8ccc5a1b74c5740ec1c4f147d4bab5d7eeb1f207073318958fa02f2fc67d75c0d27e3e03c1add1ab6b556ea513f1eb92faec14d4e7f9f341dab5b778f6 In = 0079ce89a3bb7209563a1fab751a5b80e6c424b2996d241d601e255d601b81943eb05b44523f1c1b0cde018fe08dca199ab809c05b03ed281d7f4cfb16b978047695a98e7a01ff35c498c7214b9f6c401342d356fd2818036f786236d85211acdeeb7bbe7d669f168737f437d004d9783d4203213c52d178f1787efeb2ee3c Out = a7bcd688131c97b57dedc7aebd845e0042ea9f8d3a425f11f57ddfef8eaec040e93d9219b68ab919ac4c5c5c1522ed9cbb50951bace6499e2cd0db13ff57e136 In = 25894e39aef06148d682f48a34f100ea694e446bbf79caa7806c7c6f3f8a60a94b9c8b2877c617fead17ac576d8dafd3f8514e49825d54dc9a8916330dc560204bd795d0ce00a49ba3c25c7921381c057bc6a1abb362db79497c878321c2a71793f2bfb7ad211700fecd486241cc6197a50075560147b20b9cbe2f992f516c61 Out = b4ce87a416b83be3417ccbd7000d658acce2a5c3b57c92aa8ca3d912f20580748c2534a157b4ead16059499b9b11ae8ff07cca94a2a5a314b4ac4faaddcb0162 botan-2.4.0/src/tests/data/hash/tiger.vec000066400000000000000000000052331322470703100202200ustar00rootroot00000000000000[Tiger(16,3)] In = Out = 3293AC630C13F0245F92BBB1766E1616 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839 Out = 48CEEB6308B87D46E95D656112CDF18D [Tiger(20,3)] In = Out = 3293AC630C13F0245F92BBB1766E16167A4E5849 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839 Out = 48CEEB6308B87D46E95D656112CDF18D97915F97 [Tiger(24,3)] In = Out = 3293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 In = 616263 Out = 2AAB1484E8C158F2BFB8C5FF41B57A525129131C957B5F93 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839 Out = 48CEEB6308B87D46E95D656112CDF18D97915F9765658957 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2D Out = F71C8583902AFB879EDFE610F82C0D4786A3A534504486B5 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A3D6162636465666768696A6B6C6D6E6F707172737475767778797A2B30313233343536373839 Out = 48CEEB6308B87D46E95D656112CDF18D97915F9765658957 In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2D4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2D Out = C54034E5B43EB8005848A7E0AE6AAC76E4FF590AE715FD25 In = 5469676572202D20412046617374204E657720486173682046756E6374696F6E2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D Out = 8A866829040A410C729AD23F5ADA711603B3CDD357E4C15E In = 5469676572202D20412046617374204E657720486173682046756E6374696F6E2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D2C2070726F63656564696E6773206F66204661737420536F66747761726520456E6372797074696F6E20332C2043616D6272696467652E Out = CE55A6AFD591F5EBAC547FF84F89227F9331DAB0B611C889 In = 5469676572202D20412046617374204E657720486173682046756E6374696F6E2C20627920526F737320416E646572736F6E20616E6420456C6920426968616D2C2070726F63656564696E6773206F66204661737420536F66747761726520456E6372797074696F6E20332C2043616D6272696467652C20313939362E Out = 631ABDD103EB9A3D245B6DFD4D77B257FC7439501D1568DD # 4-pass Tiger outputs generated by http://www.hashemall.com/ [Tiger(16,4)] In = 3420706173732054696765722031323820626974206F7574707574 Out = D784FD3A91D22FEE99FF8E7E2ECBA079 [Tiger(20,4)] In = 3420706173732054696765722031363020626974206F7574707574 Out = A104348FA6F4F026AF81E4F46BBBE27BED70201A [Tiger(24,4)] In = 342070617373205469676572 Out = 4BC93EC0E1188DE695617907BDF4E4BE7F27C005D3DF9AB0 botan-2.4.0/src/tests/data/hash/whirlpool.vec000066400000000000000000000030601322470703100211210ustar00rootroot00000000000000[Whirlpool] In = Out = 19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A73E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3 In = 61 Out = 8ACA2602792AEC6F11A67206531FB7D7F0DFF59413145E6973C45001D0087B42D11BC645413AEFF63A42391A39145A591A92200D560195E53B478584FDAE231A In = 616263 Out = 4E2448A4C6F486BB16B6562C73B4020BF3043E3A731BCE721AE1B303D97E6D4C7181EEBDB6C57E277D0E34957114CBD6C797FC9D95D8B582D225292076D4EEF5 In = 6D65737361676520646967657374 Out = 378C84A4126E2DC6E56DCC7458377AAC838D00032230F53CE1F5700C0FFB4D3B8421557659EF55C106B4B52AC5A4AAA692ED920052838F3362E86DBD37A8903E In = 6162636465666768696A6B6C6D6E6F707172737475767778797A Out = F1D754662636FFE92C82EBB9212A484A8D38631EAD4238F5442EE13B8054E41B08BF2A9251C30B6A0B8AAE86177AB4A6F68F673E7207865D5D9819A3DBA4EB3B In = 4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A30313233343536373839 Out = DC37E008CF9EE69BF11F00ED9ABA26901DD7C28CDEC066CC6AF42E40F82F3A1E08EBA26629129D8FB7CB57211B9281A65517CC879D7B962142C65F5A7AF01467 In = 3132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930 Out = 466EF18BABB0154D25B9D38A6414F5C08784372BCCB204D6549C4AFADB6014294D5BD8DF2A6C44E538CD047B2681A51A2C60481E88C5A20B2C2A80CF3A9A083B In = 6162636462636465636465666465666765666768666768696768696A68696A6B Out = 2A987EA40F917061F5D6F0A0E4644F488A7A5A52DEEE656207C562F988E95C6916BDC8031BC5BE1B7B947639FE050B56939BAAA0ADFF9AE6745B7B181C3BE3FD botan-2.4.0/src/tests/data/hkdf_label.vec000066400000000000000000000022251322470703100202340ustar00rootroot00000000000000[SHA-256] # Generated by the Go version in BoringSSL Secret = fb8e20fc2e4c3f248c60c39bd652f3c1347298bb977b8b4d5903b85055620603 Label = TLS 1.3, something or other HashValue = e5007b1522d10013a1a7a32b3a6f82df1861074ba3d592abc9656cef425d1e9a Output = 531c0f2906532ece3c7c352b73885a87558d6b2f Secret = 4e26e6cc23cff7773690e838ed16648b4143d200b5835e6f38525055e0f71cb2 Label = TLS 1.3, something or other HashValue = 16ff13612414de6dd55a976d355418756129a69eeaf116b807f6dd Output = 1f55b71137985032969620eb7f598694ae16f490 [SHA-384] Secret = 7fff5f3d5a1637d91e5e27290b6a0f95d3be48f29a82433dae0e4db1a77176b19143076fc35f0217a16939ea6a8dfe7c Label = TLS 1.3, something or other HashValue = 55acb630845700a42a5e5d41dd2f7816b5599d949ed86674eb26644b594bc34443f1cd095d168377cabb7b Output = 831a9592e0349f7abba2dff78af07418d489f353 Secret = 47115775423d78074b1a1e605a941836f462a17c865c4e97efe3355a445710087af4010ed1f570e34a7f31aca3b060e7d2d27bf5dc902327b90d05 Label = TLS 1.3, now that's what I call a label! HashValue = ff4351c0de4ca54560d26cb5bdd4048fed3853297ebb516b284ccfd5e081ce5c0719965323f65914516669 Output = e4b8ca51ee3567db6fe6fd5e656568140dbee604abe9e9e92a24e885c313a070 botan-2.4.0/src/tests/data/hostnames.vec000066400000000000000000000023541322470703100201650ustar00rootroot00000000000000# Test vectors derived from from RFC 6125 and OpenSSL test suite # https://github.com/openssl/openssl/blob/master/test/v3nametest.c Issued = example Hostname = example Issued = example.com Hostname = example.com Issued = a.example.com Hostname = a.example.com Issued = test.www.example.com Hostname = test.www.example.com Issued = *.example.com Hostname = foo.example.com Issued = baz*.example.net Hostname = baz1.example.net Issued = baz*.example.net Hostname = baz.example.net Issued = *baz.example.net Hostname = foobaz.example.net Issued = *baz.example.net Hostname = baz.example.net Issued = b*z.example.net Hostname = buzz.example.net Issued = foo*bar.example.net Hostname = foobar.example.net Issued = *.www.example.com Hostname = test.www.example.com Issued = *www.example.com Hostname = www.example.com [Invalid] Issued = example.com Hostname = www.example.com Issued = www.example.com Hostname = example.com Issued = bar.*.example.net Hostname = bar.foo.example.net Issued = *.example.com Hostname = bar.foo.example.com Issued = *.example.com Hostname = example.com Issued = foo*foo.example.com Hostname = foo.example.com Issued = **.example.com Hostname = foo.example.com Issued = *.*.example.com Hostname = foo.bar.example.com botan-2.4.0/src/tests/data/kdf/000077500000000000000000000000001322470703100162255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/kdf/hkdf.vec000066400000000000000000000232601322470703100176430ustar00rootroot00000000000000# SHA-1 and SHA-256 data from RFC 5869 # SHA-512 data from https://www.kullo.net/blog/hkdf-sha-512-test-vectors/ [HKDF(HMAC(SHA-160))] Salt = 000102030405060708090A0B0C Label = F0F1F2F3F4F5F6F7F8F9 Secret = 0B0B0B0B0B0B0B0B0B0B0B Output = 085A01EA1B10F36933068B56EFA5AD81A4F14B822F5B091568A9CDD4F155FDA2C22E422478D305F3F896 Salt = 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF Label = B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Secret = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = 0BD770A74D1160F7C9F12CD5912A06EBFF6ADCAE899D92191FE4305673BA2FFE8FA3F1A4E5AD79F3F334B3B202B2173C486EA37CE3D397ED034C7F9DFEB15C5E927336D0441F4C4300E2CFF0D0900B52D3B4 Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 0AC1AF7002B3D761D1E55298DA9D0506B9AE52057220A306E07B6B87E8DF21D0EA00033DE03984D34918 Secret = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Output = 2C91117204D745F3500D636A62F64F0AB3BAE548AA53D423B0D1F27EBBA6F5E5673A081D70CCE7ACFC48 [HKDF(HMAC(SHA-256))] Salt = 000102030405060708090A0B0C Label = F0F1F2F3F4F5F6F7F8F9 Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 3CB25F25FAACD57A90434F64D0362F2A2D2D0A90CF1A5A4C5DB02D56ECC4C5BF34007208D5B887185865 Salt = 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF Label = B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Secret = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = B11E398DC80327A1C8E7F78C596A49344F012EDA2D4EFAD8A050CC4C19AFA97C59045A99CAC7827271CB41C65E590E09DA3275600C2F09B8367793A9ACA3DB71CC30C58179EC3E87C14C01D5C1F3434F1D87 Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 8DA4E775A563C18F715F802A063C5A31B8A11F5C5EE1879EC3454E5F3C738D2D9D201395FAA4B61A96C8 [HKDF(HMAC(SHA-512))] Salt = 000102030405060708090A0B0C Label = F0F1F2F3F4F5F6F7F8F9 Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 832390086CDA71FB47625BB5CEB168E4C8E26A1A16ED34D9FC7FE92C1481579338DA362CB8D9F925D7CB Salt = 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF Label = B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Secret = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = CE6C97192805B346E6161E821ED165673B84F400A2B514B2FE23D84CD189DDF1B695B48CBD1C8388441137B3CE28F16AA64BA33BA466B24DF6CFCB021ECFF235F6A2056CE3AF1DE44D572097A8505D9E7A93 Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = F5FA02B18298A72A8C23898A8703472C6EB179DC204C03425C970E3B164BF90FFF22D04836D0E2343BAC Salt = 000102030405060708090A0B0C Label = F0F1F2F3F4F5F6F7F8F9 Secret = 0B0B0B0B0B0B0B0B0B0B0B Output = 7413E8997E020610FBF6823F2CE14BFF01875DB1CA55F68CFCF3954DC8AFF53559BD5E3028B080F7C068 Secret = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Output = 1407D46013D98BC6DECEFCFEE55F0F90B0C7F63D68EB1A80EAF07E953CFC0A3A5240A155D6E4DAA965BB [HKDF-Extract(HMAC(SHA-160))] Salt = 000102030405060708090A0B0C Secret = 0B0B0B0B0B0B0B0B0B0B0B Output = 9B6C18C432A7BF8F0E71C8EB88F4B30BAA2BA243 Salt = 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF Secret = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = 8ADAE09A2A307059478D309B26C4115A224CFAF6 Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = DA8C8A73C7FA77288EC6F5E7C297786AA0D32D01 Secret = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Output = 2ADCCADA18779E7C2077AD2EB19D3F3E731385DD [HKDF-Extract(HMAC(SHA-256))] Salt = 000102030405060708090A0B0C Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 077709362C2E32DF0DDC3F0DC47BBA6390B6C73BB50F9C3122EC844AD7C2B3E5 Salt = 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF Secret = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = 06A6B88C5853361A06104C9CEB35B45CEF760014904671014A193F40C15FC244 IKM = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 19EF24A32C717B167F33A91D6F648BDF96596776AFDB6377AC434C1C293CCB04 [HKDF-Extract(HMAC(SHA-512))] Salt = 000102030405060708090A0B0C Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = 665799823737DED04A88E47E54A5890BB2C3D247C7A4254A8E61350723590A26C36238127D8661B88CF80EF802D57E2F7CEBCF1E00E083848BE19929C61B4237 Salt = 606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAF Secret = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = 35672542907D4E142C00E84499E74E1DE08BE86535F924E022804AD775DDE27EC86CD1E5B7D178C74489BDBEB30712BEB82D4F97416C5A94EA81EBDF3E629E4A Secret = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B Output = FD200C4987AC491313BD4A2A13287121247239E11C9EF82802044B66EF357E5B194498D0682611382348572A7B1611DE54764094286320578A863F36562B0DF6 Salt = 000102030405060708090A0B0C Secret = 0B0B0B0B0B0B0B0B0B0B0B Output = 67409C9CAC28B52EE9FAD91C2FDA999F7CA22E3434F0AE772863836568AD6A7F10CF113BFDDD560129A594A8F52385C2D661D785D29CE93A11400C920683181D Secret = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C Output = 5346B376BF3AA9F84F8F6ED5B1C4F489172E244DAC303D12F68ECC766EA600AA88495E7FB605803122FA136924A840B1F0719D2D5F68E29B242299D758ED680C [HKDF-Expand(HMAC(SHA-160))] IKM = 0B0B0B0B0B0B0B0B0B0B0B XTS = 000102030405060708090A0B0C Salt = F0F1F2F3F4F5F6F7F8F9 Secret = 9B6C18C432A7BF8F0E71C8EB88F4B30BAA2BA243 Output = 085A01EA1B10F36933068B56EFA5AD81A4F14B822F5B091568A9CDD4F155FDA2C22E422478D305F3F896 Salt = B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Secret = 8ADAE09A2A307059478D309B26C4115A224CFAF6 Output = 0BD770A74D1160F7C9F12CD5912A06EBFF6ADCAE899D92191FE4305673BA2FFE8FA3F1A4E5AD79F3F334B3B202B2173C486EA37CE3D397ED034C7F9DFEB15C5E927336D0441F4C4300E2CFF0D0900B52D3B4 Secret = DA8C8A73C7FA77288EC6F5E7C297786AA0D32D01 Output = 0AC1AF7002B3D761D1E55298DA9D0506B9AE52057220A306E07B6B87E8DF21D0EA00033DE03984D34918 Secret = 2ADCCADA18779E7C2077AD2EB19D3F3E731385DD Output = 2C91117204D745F3500D636A62F64F0AB3BAE548AA53D423B0D1F27EBBA6F5E5673A081D70CCE7ACFC48 [HKDF-Expand(HMAC(SHA-256))] Salt = F0F1F2F3F4F5F6F7F8F9 Secret = 077709362C2E32DF0DDC3F0DC47BBA6390B6C73BB50F9C3122EC844AD7C2B3E5 Output = 3CB25F25FAACD57A90434F64D0362F2A2D2D0A90CF1A5A4C5DB02D56ECC4C5BF34007208D5B887185865 Salt = B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Secret = 06A6B88C5853361A06104C9CEB35B45CEF760014904671014A193F40C15FC244 Output = B11E398DC80327A1C8E7F78C596A49344F012EDA2D4EFAD8A050CC4C19AFA97C59045A99CAC7827271CB41C65E590E09DA3275600C2F09B8367793A9ACA3DB71CC30C58179EC3E87C14C01D5C1F3434F1D87 Secret = 19EF24A32C717B167F33A91D6F648BDF96596776AFDB6377AC434C1C293CCB04 Output = 8DA4E775A563C18F715F802A063C5A31B8A11F5C5EE1879EC3454E5F3C738D2D9D201395FAA4B61A96C8 [HKDF-Expand(HMAC(SHA-512))] Salt = F0F1F2F3F4F5F6F7F8F9 Secret = 665799823737DED04A88E47E54A5890BB2C3D247C7A4254A8E61350723590A26C36238127D8661B88CF80EF802D57E2F7CEBCF1E00E083848BE19929C61B4237 Output = 832390086CDA71FB47625BB5CEB168E4C8E26A1A16ED34D9FC7FE92C1481579338DA362CB8D9F925D7CB Salt = B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Secret = 35672542907D4E142C00E84499E74E1DE08BE86535F924E022804AD775DDE27EC86CD1E5B7D178C74489BDBEB30712BEB82D4F97416C5A94EA81EBDF3E629E4A Output = CE6C97192805B346E6161E821ED165673B84F400A2B514B2FE23D84CD189DDF1B695B48CBD1C8388441137B3CE28F16AA64BA33BA466B24DF6CFCB021ECFF235F6A2056CE3AF1DE44D572097A8505D9E7A93 Secret = FD200C4987AC491313BD4A2A13287121247239E11C9EF82802044B66EF357E5B194498D0682611382348572A7B1611DE54764094286320578A863F36562B0DF6 Output = F5FA02B18298A72A8C23898A8703472C6EB179DC204C03425C970E3B164BF90FFF22D04836D0E2343BAC Salt = F0F1F2F3F4F5F6F7F8F9 Secret = 67409C9CAC28B52EE9FAD91C2FDA999F7CA22E3434F0AE772863836568AD6A7F10CF113BFDDD560129A594A8F52385C2D661D785D29CE93A11400C920683181D Output = 7413E8997E020610FBF6823F2CE14BFF01875DB1CA55F68CFCF3954DC8AFF53559BD5E3028B080F7C068 Secret = 5346B376BF3AA9F84F8F6ED5B1C4F489172E244DAC303D12F68ECC766EA600AA88495E7FB605803122FA136924A840B1F0719D2D5F68E29B242299D758ED680C Output = 1407D46013D98BC6DECEFCFEE55F0F90B0C7F63D68EB1A80EAF07E953CFC0A3A5240A155D6E4DAA965BB botan-2.4.0/src/tests/data/kdf/kdf1.vec000066400000000000000000000017321322470703100175540ustar00rootroot00000000000000[KDF1(SHA-160)] Secret = 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A736F6964676A736F6964676A736F696A Salt = Output = A0D760447F105CE64DB99FF2FC92F961F24E7D9C Secret = 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A736F6964676A736F6964676A736F696A Salt = Output = A0D760447F105CE64DB9 Secret = 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A73 Salt = 6F6964676A736F6964676A736F696A Output = A0D760447F105CE64DB99FF2FC92F961F24E7D9C Secret = 61736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A Salt = 736F6964676A736F6964676A736F696A Output = A0D760447F105CE64DB99FF2FC92F961F24E7D9C Secret = 617361736F67696A6F7367696A736F69676A736F6964676A6F696A6F736467696A736F6964676A736F6964676A736F696A0A Salt = Output = DBFEFA0EA12D352C4AE5B0AF17D061E0E2C469A8 Secret = 617361736F67696A6F7367696A736F69676A736F6964676A6F696A6F73646769 Salt = 6A736F6964676A736F6964676A736F696A0A Output = DBFEFA0EA12D352C4AE5B0AF17D061E0E2C469A8 botan-2.4.0/src/tests/data/kdf/kdf1_iso18033.vec000066400000000000000000000017741322470703100210330ustar00rootroot00000000000000 # Test vectors from ISO 18033-2 # C.5.1 [KDF1-18033(SHA-160)] Secret = D6E168C5F256A2DCFF7EF12FACD390F393C7A88D Output = C325EBBB41A82551D5D0AD4834870A05EF3918C8CAAE38873F07DCA43127A4DEE36A6CA5970F6C06926037DE7DF79C4915D83FF705821D2C46A1FA7BB81B73E27176FEB7FD3A45E40B843F1AAEBCCB1EF4FA7EE3B9B491A342F43EAAA435EFDED41E0A3A6EC2EFF1F2ED95 Secret = B711F58766B5D696513538F03036F30E0FC11CE1CAAE38873F07DCA43127A4DEE36A6CA5970F6C06926037DE7DF79C4915D83FF705821D2C46A1FA7BB81B73E27176FEB7FD3A45E40B843F1AAEBCCB1FD4AE168ACA94F8D062951EDEC1469BFEB97B79490FA58AD1D3CCB4 Output = 281D7CB2D7D5531ED1F9382152D9BE9A89A1DF09 # C.5.3 [KDF1-18033(SHA-256)] Secret = D6E168C5F256A2DCFF7EF12FACD390F393C7A88D Output = 0742BA966813AF75536BB6149CC44FC256FD6406 Secret = 09248DA92DCF5CA8360AE7F18533A19C6BA8E99ADF79665BC31DC5A62F70535E52C53015B9D37D412FF3C1193439599E1B628774C50D9CCB78D82C425E4521EE47B8C36A4BCFFE8B8112A89312FC04432A6DB6F05118F9946C80230CD9222E0146F2CBD5251CC388A62359 Output = 6F0195F38EED2417AA6EB7A365245073E58711DBbotan-2.4.0/src/tests/data/kdf/kdf2.vec000066400000000000000000000243661322470703100175650ustar00rootroot00000000000000[KDF2(SHA-160)] # Source unknown Secret = FD7A43EA8A443C580C0DE618ECC013704505EFF8B5A4A9 Salt = BF0B2ECD1724A348211D8C0CA7 Output = 79 Secret = 701F3480DFE95F57941F804B1B2413EF Salt = 55A4E9DD5F4CA2EF82 Output = FBEC Secret = BEEA23BF806E106D0C91F8E87095AB402C433C581088E1236FD20564A8F1AF67DCD2265C40 Salt = 36C94DC7C2353757E0778323B3DB333BBD57AA8F5C Output = 78F8E7 Secret = 5A6999A96594B0989B89CA72B5C0803043D4DE78709B490EB98610 Salt = 5F0F820B69ECA512 Output = 84C92008 Secret = C6E227F3F9BB5227BE37D6CE7433022D5F0DFFE18C5777EBAF396F1E40C4 Salt = CC06A6F3F9A0AF4CC76D839D Output = F518EEE6F2 Secret = CD6356CA771E3FCC4BB548B4E6EE4E3715EB7A4A806E4967B1 Salt = 221DA543 Output = E72EC27D6A81 Secret = B7FA7917A833B0C0364FAC414D92DA Salt = DC32AA175531CF88C8D55A51DA5CAFB314A92C2B52 Output = 8E54D1C86DA8A9 Secret = 8A14 Salt = 65A907357B5CBADC5C5EFF7065AD Output = A2FC623645F9AD29 Secret = 135FF7296DC87F5775B64F8CFF46D366C10A8A98712345CE58CD5839E9 Salt = A439FC03312570F9A4C76E5B17FA Output = 73036FBD1941C7955E Secret = AD499722078DF83AEC1EC23A507B190740B0A6821F8C Salt = 3772601ACF052CD530D91EC7 Output = A461A98B6BBBB0FDB0BD Secret = CF99B7A985C223BE83F999D7 Salt = 055396C3E0EE8190DBE10212AE099FF0BC0A8D Output = 735BFCF26A4357F5642964 Secret = B640D21A1FECF5E61D79E1E09C2393915D5790EF8080E7F6CC18 Salt = 5AE5506D6306 Output = 6DB9BAE99803B2EB725FA8B3 Secret = F69885268F3DF8488490419F49CD39A54D0D8C9A3861D375A8BE Salt = C1 Output = 2A1EB238B7CB39422DE263E4FD Secret = DCF4DF1F6B5D71DF98ECFFE8A4B7C5E7234AFC10CC0C941D853BFC32487A Salt = 7F246E5F44DABCB5B954A1B83D456F022C924D29A21935 Output = FCF8D9D4E43318EFC0056EBCD271 Secret = BD2EDB4CCCB0ED3D01BA03D1A816425E40ACBC7F214126A6775AFE28B0B2646DE040B9ACF0 Salt = A7E9F261EDC30903056744B123C3D364E979 Output = C669ECC95557FE8E49457576BDABD3 Secret = 3185AFBCFC621B6F9FFCBB75C7E71A4161A0AA39278676 Salt = 80834249A9A4CFFCD655AB92 Output = 687481BEF8354C8D48D8F5A5F3D9ED3D Secret = 15723A13E56CA0FF5EE43D8A4BA8284B4A946D861F Salt = Output = 439082061EBAE065C434932D981603AE1B Secret = 92167440112E Salt = 45A9BEDED69163123D0348F5185F61ABFB1BF18D6AEA454F Output = 3A5DC9AA1C872B4744515AC2702D6396FC2A Secret = 208AA86616B4133903946BA8 Salt = CF08208B76D97F Output = A267CC65619C84EF5FE1744EC3A92A06B99399 Secret = 04879F0DB43E33435D53F0DDDC72BEB957F04F2CA5E8FB38DC4F78 Salt = 2B688B3F6C12 Output = F46E2675B807CC42FC1DD4C84A5BEA3AC175B093 Secret = AAF175079CB9CD462EB2D4D62440EF18B22AEF1552CE5F04EF0158C177572D21 Salt = 48A228E55BF52B89A8FF5FCC3F4EE4F178D406CBA265CF9166 Output = 5A3796C9045712759E6DE769E5049E5829408615DC Secret = 901BBA708DAE7365ADCCB7AE056729B5DD610226966B084A02D1E8 Salt = 3FCD4A2A5D65E4CDF29241573F Output = 8A397BBA8EA862DCD004897304B901784513754E9FF6 Secret = D20CD658 Salt = 17D7E5C9E3DB69B28EC9 Output = 5C893F99FE81F1E955F2A7CFEC4F50B7CCC890BEAE4768 Secret = B669EDEC3D9A78 Salt = D072D0 Output = 1A4DD8282E8B4D7A739030FF60CD88C4D3C0E5C3A0DEB127 Secret = 349AD0D9BEA0D29C Salt = D4C8D8DB185F7EBBEC046ADC49A26DAA172F81E3 Output = 678051858CED59674C06B60EE21D18ACD55C10B049B22F5CFF Secret = B809759B369EF9B2F34A0254AAE645 Salt = D3EF4B914359E78F253FFC8B9B6D711E257B94 Output = 1C2C3C95529E4C8E5677F714E122A2E348810379B09689FA4B30 Secret = 20216E8DCC3AA461F9FEFA4BE06F3C63BB Salt = AD13544336F28B8F1B2615BB9658 Output = A24D44F5194B4257B92CF85C8493B5BDA52515E18337280C45F005 Secret = 40923A6409592A370301A859F1E797 Salt = C3D9FCE8C68AFD0F97D21AAE826ADC1EAB6F580F78B139B0B43B58 Output = 4C8919843B73BAA06853E1C8D9D4B18518CD857A624BE3EBBD507BCF Secret = 26541874BEBDA8DB76CCD60DE28E65E91CC5F128B9C56F6609185F108337A4A98B Salt = BD1D497AC525F091FBFD7389635DA5284ECE Output = B16B3FAD79618B39D2FB0983BDE7D3E8C17E2DBF2C2853CE8D92191696 Secret = 5D17A9CFD9994A1CC1F0AAC3C48F60C7DB Salt = FC56 Output = 1233A118E3B025AF2240F2AB14A61777A1347AE58033B2FFA313946631B3 Secret = 32048974CBE67FE8B4E6C0D4E21035B2A657E7C5E3592A61A2 Salt = D6ABF65542 Output = 5301147F08E1D473F82558F815498F7421D8C501056402F77A186779A6C5C8 Secret = F4E8338789D14BCD31EAE46199DB1A86AC76B8611809DF4D77279F53CB0F6DBF Salt = F7A146807292 Output = 90C528975E02E3B5A9970B0074C02A691401A7BCAA94A8B731648A1732806D6D Secret = 0DE2DADDC876B4B0322B3B995B43B580B4D5DF529F4E29606F825AFA72 Salt = BECB7FA1A65C69 Output = 41163C646606A0B96EE1FA2783AAD072260670283870BB8A510A693D01F9C0A5D6 Secret = CF00B2A31485DCC4D6F9296D219F4831CE80A0043CA937F9712DCD1C0AF02BD9F0DD7C Salt = 046259C93952F2 Output = EFEAF89E578CFC169570F08452C42157EFB9905D33DCD97DF29A4CD626F9DF539E3E Secret = EE67BFB3A6F4CD Salt = A85EEB10A12C6B8DE05642 Output = 1D02C4CE8D6AF08F2A4E8660718EBF8031C640B7502BE5F1F2EE91CB35241952D63BB4 Secret = BC02C1 Salt = E2E57EB395 Output = 6D3B84710944B5A4448455C22D5CF21852123816A33269ECB29DBCB10616978FD5200FB6 Secret = 85B2DFCEC6D020E7DD45933451363AF111346D52E1BA4B168D47BE178F Salt = CA79147C58E3422803290548BD3999F3738A04A8 Output = E43AC0F5353A0ED3C35C1EC0BEA6190C49A9F8925E510DB762441BBAF8B798686C1BE6D84C Secret = 6E757BDFE044D00A96AB79F3CEB27F96 Salt = Output = 0A18BD32469D8FCA917A80C173C2E01B2C9E2AF978CDE34E5EFF933B563F3B26842778BAD326 Secret = 26E7CF534DAF8F9243C5CE3297D807D1C6B4F0CAB16AB5CED3C737 Salt = 8AD8F6 Output = 4A Secret = 166C66F4B39A17A2 Salt = 81 Output = 8AEC Secret = 8533C513D7D26ECD416DD3DC Salt = 52474087F2 Output = 030CAC Secret = E876D64472865C8F4B7F Salt = BA88B207 Output = A83C863B Secret = 15AC949219878463A7B1A6599ED9 Salt = E79A373588F3 Output = AA28AD4916 Secret = D288A4BBC027594788F81964C74F Salt = 06 Output = 5777F5478B70 Secret = 84D3564BA0AA5A0DAC7AD62F88D9373B9DB280D026AF0AE5BCA633AE36C24ABA95A005 Salt = 364A60 Output = 934CEDC65FDE09 Secret = 5977D030DF4051B9FB03167331C6B6366A0F8CEC71B69FFB1FDC9469B5 Salt = E734 Output = F09FE23B9C34EFC1 Secret = 26A51955CBF815122460E803F1B399F617A4AE1CEE Salt = 0E33D563 Output = 17A5BFF10B516A752E Secret = EFB7C556790493E3C15B513CCD250FEF4BA7878585B8E50E1009C56BB146B5A0 Salt = FD7B Output = EC92ACB1367E34CF1361 Secret = F2EAABA8E42ADCC55CD36A2C78DD0325E55C1B4E9C6BE9F77966BFBD623CD454267FFC0BA9 Salt = D8D005AB3A3123 Output = E0DC1C8E9071A644ADEE46 Secret = 01A8F53F2BBDFB05D41E9FCCDD85CFBD4BC0502C Salt = 6E3EAC35BA Output = 1C9D86C49E9F3DBFF9674A11 Secret = 02414433D5734F Salt = 70 Output = EDB45D5FA17F17147645DD8DC2 Secret = 13EC731CB6C29FC4350FE0DE63FCBB5A6F3568E05250099715795D51C5AC10D89883F44E46 Salt = 93127BA3F25906 Output = AA07990CEAAB482272FCB3A3AB46 Secret = 2BCB12D2E40A5BB81BE4297F9306 Salt = 67 Output = 3F450384BEB9C9A478F46F051FF152 Secret = 4DBF180733 Salt = 54C4 Output = 0FDFEE8AF8D926763E28AB284C7B8040 Secret = BD3E9044AD45F1E710529172837597E7BCBC2C27505187 Salt = Output = 0E4FD5D562490C5FFD0A37588344D86347 Secret = 822816 Salt = C1 Output = 21E8AEDC72151B03D2F9A3E7CD9CA6805FEE Secret = 7FE688 Salt = C9 Output = 6701CD19F736B12C067D58FBF0D024E695C18B Secret = 1EC869F1476B8C7C537E8B1AC4411A10332A7DD06645C835EBBB3CEFD570A9 Salt = F338 Output = F04DCD7617D96283E463511A1A9313006EB6BD4E Secret = 6C78966EAF4DB43ADC3865962F292CDC81 Salt = D4 Output = 9093D86736C445B12843AD189410984F8B912281A5 Secret = D85C07E05DDA286A4A1B9191A929FBE1D19D Salt = 138399 Output = DCB8FF108AAE1B16901CABF9BAF0AFC4ED1B20A72312 Secret = 597406 Salt = D5A5EEBC47 Output = AE58662CFE38E861B289EF9E3146A37393C798BB7ABEE0 Secret = 33460E Salt = F8A648C9B6E9 Output = 6A85B3C6A5A6D0E1734004B788FE84C744BBDDBE42C32ABC Secret = 74BF53754034B0DC Salt = 89 Output = BDCADDFCCA599DBB24A2789DEAD088EEA633E8A15A03B65291 Secret = F6B3A879AEE95C1604EF005F90D35EC4621F6BE5D52F65F1BF192FAD2D22C223D66B9C8454 Salt = F89A58E89B Output = 9FA401DABDDEFE3B64702DB7395950A357CA32A501E43CF6DFFE Secret = 5C90E327068324D80B780A10646E01F1C57D4F67E2BF9322 Salt = C13297 Output = F95C1618F2F62B9EB4516E0AE68D38658183D30BF3B97B63BBAEB6 Secret = F88AEB2006224184F1231BF42D63D2BA69C88ACD47C27996232EB2FCF04647E8D03308D6 Salt = 55495A Output = A7666ACE2515FBF42334F21F48510174CD8944A7397EE0F0BF38262C Secret = B98B0026B2D40DD0827B58090D2698140A9CBB3B13F5 Salt = C1AA Output = ECE9B1E55CCF257F2C7BA2B39BA852DB81FE9B32DD08130CB6041CB349 Secret = F8BEF20480916E2762A77D00 Salt = 1CE36F6EC8FE Output = 1102796B06234073DC6913318D65010A4F4C9E95358DACB3CE0D08857B28 Secret = 80C9D5FD0C7BC1278F74975303D1F94600877754FCE3B8 Salt = EA8332DE20 Output = CFE56E573F2933E1728B3367F4EDAA797BE7C843B89250B98C4EB3BAF2E4D7 Secret = 2EDB67D2CC64BF4B62 Salt = 38D7ED2715EC6F Output = 52E44DB4B04F9792243508B969FF730779CB2A1EDF764324D11C14235B055D30 Secret = 86D77225DB6E5EA176F5DAF433E4C2C804B24FB22F2747FC5D8978189842981F19 Salt = Output = 02BF3A2F5009054AF526E277EF6AB436BD8B7A53A3E4C2671F1E34556239F97453 Secret = C73E664D445C0C60C59CEF54F10ACEAA456E6BFB Salt = F8C579F9 Output = 4E984339A1FB20BD73894494B36CE8C1182BCB0D289BBAB3BBBD366B1DD061BB9E16 Secret = 0651E961BA3374DE7248CE52EFC948809C20B8 Salt = 43 Output = 36AEC134DF567B1FBF448D0C56C6B62E40A375BDC74A2D44E415BCD105B48317145D95 Secret = BF5BB2 Salt = 159B4039D67403 Output = 6F7533ABD09546770D6E71769A645B0D3BFA6D578B7B9B182D25CF8F8B4394C2BBDCECAE Secret = 64353C0E4D64C60C3F2FEBE1C6466E57FB28 Salt = EF4AAB69 Output = 7B80CD69345CBA9E46186372DD6602F2CB55496364CEEA96823110E28CAA68BB200F56F37F Secret = 6FD4C3C0F38E5C7A6F83E99CD9BD Salt = DBB986 Output = 02AEB40A3D4B66FBA540F9D4B20006F2046E0F3A029DEAB201FC692B79EB27CEF7E16069046A # Following values from BouncyCastle Secret = CA7C0F8C3FFA87A96E1B74AC8E6AF594347BB40A Output = 744AB703F5BC082E59185F6D049D2D367DB245C2 Secret = 0499B502FC8B5BAFB0F4047E731D1F9FD8CD0D8881 Output = 03C62280C894E103C680B13CD4B4AE740A5EF0C72547292F82DC6B1777F47D63BA9D1EA732DBF386 Secret = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 Output = 0E6A26EB7B956CCB8B3BDC1CA975BC57C3989E8FBAD31A224655D800C46954840FF32052CDF0D640562BDFADFA263CFCCF3C52B29F2AF4A1869959BC77F854CF15BD7A25192985A842DBFF8E13EFEE5B7E7E55BBE4D389647C686A9A9AB3FB889B2D7767D3837EEA4E0A2F04B53CA8F50FB31225C1BE2D0126C8C7A4753B0807 [KDF2(SHA-256)] # From BouncyCastle Secret = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 Output = 10A2403DB42A8743CB989DE86E668D168CBE6046E23FF26F741E87949A3BBA1311AC179F819A3D18412E9EB45668F2923C087C1299005F8D5FD42CA257BC93E8FEE0C5A0D2A8AA70185401FBBD99379EC76C663E9A29D0B70F3FE261A59CDC24875A60B4AACB1319FA11C3365A8B79A44669F26FBA933D012DB213D7E3B16349 botan-2.4.0/src/tests/data/kdf/sp800_108_ctr.vec000066400000000000000000001720361322470703100210470ustar00rootroot00000000000000# Test vectors generated with BouncyCastle [SP800-108-Counter(HMAC(SHA-160))] Salt = 876F7274958C9F920019 Secret = 4C5FFEE342D0F1D9204CE138ED131558CF364BBC Label = 6408DB93D00CE5FED51B9A00 Output = 5B3A Salt = 1C465C8CA73184424257 Secret = ABE28C646A02BBC70A61E011208FC8D7D2B7F955 Label = 7D5AC51EB839DAE68A573FF1 Output = D5C0 Salt = F7B66FAF7CE8D8C2AB4C Secret = 2CFFB7FC425E39969B7E9D0A0276B8CE064E5A79 Label = B1ACAFA14F1352DA2317A0B1 Output = 2730 Salt = BE8D06763F91A55AA60A55B06CE7BD2C234D9C9B Secret = C45A9C1136BC29A26E83E4EB5424A7F39C1AD786 Label = 8E7C6A8F5FB03717F9C3C815 Output = B122C542 Salt = 763720019CC71126C08468067013EC799EA551E5 Secret = CDBC50F118B5D7DA2F508B0EE857E95690A613F6 Label = B5019FCAAB99E3E36831FFBE Output = 65184426 Salt = 515D252068D87A371FE5C899B1C2080CB28A11A2 Secret = 0074CCAFD79E7DFD0280AE90A386BE8F920625E7 Label = 0EA8F210978F8B6B19125F7A Output = 5565C92B Salt = 6BEDA97746E6B0C7069E5C5CB2266A60B404094B35D17658712FDF0760AF Secret = F2A86731F93686059970C42D35B7B2342BF55025 Label = 0BBA8C310FA61D5F39035B4E Output = E8BAF544389C Salt = 1065A01F835D9692D6B2B3A05817B8B14CE0D7FFB1EDA7C4BF2946E4E7D9 Secret = 85D37474BFABB9712ABC130FEB8CC58A331C1470 Label = 24E1CC4C884E0435D57E0E09 Output = 8E0E7FC3AC91 Salt = A9548D0CF06D8D913B4A82180B30536E6DCA9E22058355B9BE479C5EAA53 Secret = 59536A8219785131E8214324841F2A282F4618A9 Label = 237A47DCE3899A707ABA4E0E Output = 4EB42CF2706F Salt = 98602900A0774AD4804E7C0401CF78B17399DCE92D00032712CAF0118F77C02B758E9B77B1EC43E3 Secret = 7D8AFEAC061F157C1692279D46142022CE35D9B7 Label = 8548C364AA2F703B859B736B Output = C4BC89B34AF77648 Salt = F3B7A2F4A05D513AD138C14926CF3621EE17FF98A1DF72F13E951322B5CEFB41AC818328926645DC Secret = BD99552534CFCFFC19987B23551847B2F95CF634 Label = 228F63EFD8029DB884E4CF33 Output = D04DC1712A017F27 Salt = A73A6A3A0288A88BF9F115279BC8AADE2985E78C59ACACA43FA4F2E6BF8D75166914B9D4BDC88817 Secret = 2F8E815356C734F27237E2841A42610B28C71FEB Label = 20B5F315234AEFBBAF5CA7DE Output = 03BA7A6F07130B2A Salt = 3FA1C9459DF2FEA454785CFA3227A09B3CD015E952C821882B67167091DFB2C14FF0FBC2DAF8662C7AD11889411CB6895075 Secret = 51A0D8E24DA15DCC9A0DC0E3ADFC750DB3308E30 Label = B9616977C379FAF054DBA414 Output = 71A3C88CFF10BDB3B61A Salt = 0B761A25E33F26849E5A1054BCE664F6631B388018E1F547DDB4F01E4EA40A0F33A9C1C8F98D2CEBA43994586C6C5AA5E4F6 Secret = C79763F027569C1EAB9F8B7C3064424B29EDE836 Label = DD7962A43034915A95F2D85B Output = A81A1C06AB1AED573C33 Salt = 1B8699E791E4C19A1C368D2ED685DBBC93B772879FB1333549B607131A22D5A7EF96840B193E7AC589D325DBE6293141932E Secret = 0C88052600AE74BDC8FE47B592B968C4C374449B Label = 7B0B0FAA28EF84835EADB3A1 Output = 0D8B2F786BAF6506975B Salt = 574126FAE792D0701E37DAB8F613F22FC0611EA8195BBD2DF026454128370411A38A63FE06278981689C3E2F4ED94B96AB438AF5C21DACF0C519036B Secret = 283AAF84E63D27A4BC786A6A24D24C301B009744 Label = E5FAC14DB50AFB5E7952821B Output = E703C7C66C97763FD998C653 Salt = 805179E584376CE99087F1AB5A0F327FCB5BF42A0B6CEDA2A8333AC4B1C0D4F0511E3286E0280958D31D6A10C5764C778248112F0661E4CCCDA7650F Secret = 45A086923553F3C002DB1FA846534B9A994BB541 Label = 5B514ABC62F8DDFE6CD6E4F9 Output = 469E3627474B3F068C412CCB Salt = 965342192C969392522A49CC36B3979B3D3C66F84129C79F449E7CE10F37D410BC6AA94AB50FEA11A4ACA7009394D8315898ED944704135CA266AAB6 Secret = 94D92F4ABCE00B2FBF47B9316892B9DA9382D520 Label = 934E6FF267EFF269B33E8EF3 Output = 0EFF573E75DD81871E44BDCD Salt = 4D4E84C32D30D351C4376831CE149F3AE7C18B9A8FCEE82985CFE1D672E9C30B5FA5924677B29743BE7BB7B73658F8B74AF9A8B021D41956BCB1C141F42EB98296B5AFB16E3F Secret = D13423BB9304F980A233D44AD7CCA978D5B55927 Label = 578B0514D35A71ACBC75D68F Output = 322D2F7F2B2C60C4C7D056764B45 Salt = 8D62FF69BBCB91D508195DE7AC5B3E01479707E14F07081B62B916D384B5E1645ACAF1A537C147504616EBEB0DB5CBCCF6B9D5848C6202E153A16DD392A8CDCD1F531E324860 Secret = F7C091E854CC32DE9DADD25CEA4C176AD0BD23A1 Label = 3000034BD4CBF3A814D02FA1 Output = AE0A88B71E63293F2A9ACE198C03 Salt = 63939B9B0D0555B32B202317F757898CBBE724718A2EF507D5FE894D3FAA1D7336EC56ADD3B4402FAC5EC654AB5DDD27486C67AD12AE0D200626E447816A76845C568E4C1D79 Secret = D7015B9E24350330A71AEDA5A56EC016A9E13947 Label = 02679C69E9003490027EEFB2 Output = A7F1699F08142631380382A919BE Salt = 34EC1FADA670DE1D723071135A4978D73B8B21BDF74BA439FBF1C500F897D21D43ED81A7B87E2CE5AF76C5E146C9758F27985FD76162650A5A3F1C786F798252E2BBCAE91535B78547684ED86A98C702 Secret = 7E66176D517C531A84C9F6699A51A6BFA45B06E3 Label = 60A255C6B7753BDF4B53C385 Output = 16238C5788A20B4CDFA5F026FCF9A5E9 Salt = 1D44DB0AA6FE1634096C707516C3C101217B85328EABFEFD63A24CDB77F3C10F398E7940FE67CA17FE0A3D73AAC63E38B4DBE1B8DE588E4BAF54FBF0516644E992D5400F7CE064600778B7F3531D85F7 Secret = 3F7321A44242D2552B7FC1CA28FE615F7BCB6227 Label = E06F2C41D29D76072FAB73DE Output = B5D2DFD48AAB0A8A149BE9AEB07C4669 Salt = D04B241D6E255C87A442EB6341E341487CE431DCF0644CC8F50E5093EDCBA3C6B8A3C00770E88E7EC873AA9A711683459CFA170A8E48F15034D4176E3B313BBD82DE9D7F3109B1C56047B8ED8FADE4D8 Secret = DA9E53F1C9A6D74101A8148EF072E8818D3120C1 Label = BAE75ABFAAB84E82F9949987 Output = F82CD883465476C06EC1718D523585FA Salt = 8B7350FD843A958453459C83E1DADF127C3B9F755B1B5DAC3875B36F3A37FE72334D59D8CB3CCCF37E0F7E52F69B8F115CC1D6B5F290B7BA7D0F54B22AD4885317B58BE07CA4C9C8779339DB58826EA2599A14C6E87C10B8C4AE Secret = EB16D409EB597E1A95E255C750D3671A0261123A Label = 4A11C7573F89ADA54C5CD443 Output = 431945DF8CE57FF0AD6B35ED486EF2B4B5EB Salt = 7C6F95AEAFFB7D452832988F44C4207B7FAD94FA8B499292C0D48CB02F75E4DA86050A524918D4DD48D438B46F2FC2C1C797572337CFD9A08FCE02733D7E10539996CA1C0D7AB490EFF47FAC99F72C82A5F5359878078C3B88AC Secret = 392F1F7CA27ACE8BD4CD63D45E4E486E855ECB3C Label = F9F083EF265A15CA5E68F057 Output = D21FDB92F6FA75433ADE11D9B32578547909 Salt = 24D46D68303C77F1FB3ED10747D8B7E01C93970BB0C070404117F362C535D1E92BF90FBB3869E9223957CD496BE45B89A6527FC39D45DE2F2D5865BADF20893AA9951DFCAF5DBF7FA46EC6946EF709B7A139D1D19041D10B6F96 Secret = FCCC12309A15071018B2DE7BB775A1ACAA4A02DE Label = 660266E0D0A5FDB78FC6D350 Output = 79DE342C5358DCF29910D175B5CB3C2E5CD3 Salt = 13E3EA2CF37566A55321C8E6386FAAC93421D614948EBF5BBA07649D77A27E161021346BAC19B3ADE49D4250DDEACAD90E3643389C320305541B5C3CCE41DEA5586CACEB3D43C43B256DA060CB3366108AB7895C7AFDA46C68C09D63D49E74AD74B05D94 Secret = 17182760595F697F27E4E64A8E66102AC83A4B11 Label = EB5A279F6AC4522804FAF25E Output = AFA3F9DABB5BE44C4D25DD83EB1C0983D89961CA Salt = EA31694879BB9BF021D98A0243855F1B934B4CE9AC5AE5C2DADF8DF73C3C8B029F2F9AAA88F846A20861830C819A264C316911ABF5A179F2950DBF09900EDFE804BD5FFC255788A60D4A95662D98DA94B825E01AA86D6330D8255A00A627A173C6ED868A Secret = 346E9FFCABA437D22868CA4D93100500E576BA7D Label = A14B4B4AFB0268D1695D9D1D Output = E8E2161D3302EDFD913A4F60EFBDC6501315AE74 Salt = 676F255DBF8A576312DA3A2232D38D686E4F71B47DA3C1D120F3450176D85DDA1BF903E815E3C56E1D1C716FCA657774FEFFBB0A692724301FF75CD07B83B64E1F55CA9C1900DCF2E91356A15417F99D0A36C89328440827A7FD7DD803803E5D5394C259 Secret = C79721AE499725BA11868A6B501721D21E6B5E9F Label = 5B05AB73546BBCCB1B96B763 Output = 53C570373C7ADEDFF13BA573BB45550192FC585A [SP800-108-Counter(HMAC(SHA-256))] Salt = 2D8C9FEA0B61911D5035 Secret = C3981FD4820F6F6B26D90E4FCA64341446512BE1880D143F9824C4CEFBF14A18 Label = E950EF415307549F329DBCB1 Output = 8640 Salt = 78CF881708873D423E6B Secret = A18128078C120163624C34C469F0070B077646ADA03444F581AB550E9019EC6A Label = DAE87890C32602826E98C307 Output = C95B Salt = 73FFE4213A34248DBC9A Secret = EF317D97861D570DB3734CC64D19B23F061AF2E5482BD60EED50180B1010C513 Label = 1C1295E57D062206D730DE33 Output = 921E Salt = 54B5FF1F56E8382A128DFFBDD1935064A75CB93E Secret = AC6E642F7617BBE17AC0B9D3448C68A6F5C4EE5CF6C24F4FC8D36196244D6CDD Label = EEDB92E6AF837C518C25F016 Output = 07CDA9BB Salt = D810222D74DD5C0CFBF51751D3A0D52BAB9F7CAB Secret = 18F17DB9D79C606CAAD257A01D9B87ED0528EF86EAA37AEF40AD56E0A294B4F1 Label = F4A953FAE17ECB8330D5D2FF Output = F71CFC4B Salt = 070D4C51399CE6DFBD17E1F213A77F1AD902EF70 Secret = DB4EDE06C704992D6B3F833702C273E895AD5863141FE54A2D6F0ACAFB466A28 Label = 1B3B41A6E0512642B8A74E4D Output = BB30701A Salt = 8D2024E84782BC9AA727B394B1AB5A11D866915DCF8B696B7711BE5CB6E9 Secret = 22B9617DAC9A48CB7EAE8A74DCF6F1869D225C79E8E8CA4EE0317F2F9D140FC8 Label = F92E3FF8D3A363D940109167 Output = 66C55A93DD3B Salt = 31A0F757CA045A0C7080BDDEB963B1AC9F7EB28305D52F89FF850B55700C Secret = E73EFDAE544ECDB5D314D41D3192D877FA344F50C8CFE5F51D52716B1560B7BB Label = FDC3AE63280728B1448B2D88 Output = AEBA2D6BC8D4 Salt = 7D09814A730D55A76C53988666D4C2BD596FBCA367AB75B8EE845DF5C169 Secret = BCFA8E84AF34C560FF43A48F13FDCAA3E5ED0EA6BD8381C6510FA6B87D9D718C Label = 90EF98ACD9EEE323DD1EF356 Output = F738BC59DD36 Salt = E25A50CF430E0D3B0B451A58C8B00F9D607AEC946B1E6180F2E7B066F370710D004A4C0B02CB5F7B Secret = 8F3439344E7E96DB71993D83E4E4C77B05179C6BEACEC5A53F7DE1381023C277 Label = 73D70D740A98E6FEF15AFE07 Output = DD408285FCDF4B7D Salt = CE5DB621B45D0024A7CA7C6A343E096F159DF3D796E4F96C214C206A3C22894F1D219501EDF3FF2D Secret = 677327D6DDD714D863BDADD5F59F1F4BBB538D2ED959FD035BFC3F4B3FFDC1D1 Label = 18F4665D273FFE86C4A9CA43 Output = E25C803BC336C432 Salt = 6A9490C21C1E3C3B0AB90D7AF20A50DD49784DAB4D87E5434B29FDDA4D1474F2312036ECFD89124A Secret = CBFE8A924F1E435228B55392A8B76DBD8F6165F5B62E6C6E6A17769346DAA9F7 Label = 83B1C9034CC4FD11CA48D9A5 Output = C9A51159FA773734 Salt = 3AD1B1EFA7E029FA57420F91C483AFB31886480DAA984C771104D9151AEB4881165AA0FFBFD99F211FC6E950A678AC87875E Secret = 0F57BD32FD40F4C4865AA085005C3E16103703F78361ED30FE6F4C3DD26B7027 Label = BF437A7E86F66FB3F33A58A8 Output = 6604C9BAB231BDAEB33E Salt = D4D4174E978B3B36C06294A3263757E7562D03C0943E5758A8583A503BEF6EF4A5BB1A649629D5DE46BFF9BB54FC90A1AC4D Secret = 3557F3DA3538A3CCB7F2C1CE9C4A61240B94AA09D67FB8D0EEFD5D30E244A928 Label = CA662D47FB8D57C03A604958 Output = B054021B454AF9783B34 Salt = 2D70A7289594D3D6752A4907B1AA080BA29243BB51CE95A0A8FA613269DAC851A2035E47F70BD976109DCC5331820F10822F Secret = BBDB87903D302216CFF8CA2006F0106F9659172AC0E30E022E34EF09129145B7 Label = DC4BB86E7CD392DD15030A26 Output = 693C9137C8F4F0B05804 Salt = D38223F87F5F4624C022C64D069D50104CFEFFE618182DCFD77AD9D882EDF8ABE937664A7BA6B106A21D57B95D0621FAE58AABB7048E25E62E9F77C4 Secret = 0D0DC70813B14D348386117472DDDB66FD575ACC79C3FF31F3282CA3BD58B929 Label = 1194E13EDD8E18043311D744 Output = 241A5CE876F0189D721AA0B3 Salt = 5BE2F29B6254B3CF169CC945DBEC31FD3695445AE4FB998D2B9585D416747AF1880406E8F9B0C82EA24BF0E5596C9019BE86F136BA7CA4F129055C30 Secret = C099566A1341F26079003D67EFA0ACDC767125D6132A5CA7FC290E86AAF2478F Label = D7A5189EA2AB5EDFCA379455 Output = 427705040FFAF815372B9F0D Salt = 2976154F19739EB2A0E0740F31A177DF92BA291634344EF977D6DD23C7ACDD135B12697F720D9CD9337973C79D198040DAB1301B7C8FB300C24DB04B Secret = D74EB90BAE4684368D6B1CD0E6C19E0C74AAF7B3A265D1A3EBA649321C33C99D Label = C30825432219AA0FAC84022A Output = 5FADBB9B62A6403203AE2CCC Salt = A5F13E33609B85F871665ABE2209ABF78276571077FFEE849DAC69138FA0097CBAC76C9A2BD564C6A7EF3A2DB4171BA0071F2311E153A3CA2386BCD66FA99086A2F414F4F67D Secret = F8681D2348F73EA285537B67DAC118A8F96DEF754D61C90B03A4728F0F10764E Label = 877FB61CBBFAC07688A73F49 Output = 943063F0B1BBE570543CE47751E6 Salt = D638F6B69D7B3FDBD9140DCEAFCEE6F9BB78559C4E306B9C1ED30E6D7EEBD4A44AB891462A1772E019953450159F484D7D0F549C34AB5C6C9E340A6C806C1BF59FB1C5533224 Secret = A53941D3F2E90F646C9C8B020978DE8D056A86AF1753D14CDCD24D02B45D2C6E Label = 1AEA234F4D938D74A29ED384 Output = E815F9B2ED571724CDD594BFD919 Salt = EE1E5DE0CE1C411B32521E57960F7D85DF974589DE31FE4E4BA316997B750B6C3CDEE90592EBDBDDECE200FBC44856FF1C96CFBC1C678E0E7AF0A28E3D38415048BBB11B3D59 Secret = 16F3D351625B268D66D17D2BE1CEE5BD2E57D25EA84440C6EABFC93B5A8E85B5 Label = 9B0473C4B3F67BD57B59EC46 Output = 08891DF0E1D5FA42C5D7399F471F Salt = 61E3B97C7E164BEB2912CF52A5CA71FE5D02C70DEBE0C960BE33C9A5A097C3F4991A2A25CC97C7232482CDBB09CFDA58603390651B90361CF61D255C7F84A66646D145B1F752237B21D30070A8191A1F Secret = 8AB4AF3BB75EBA85BC6A61E49F9FC4DF6B16497542CAC40DE9CA5193A3D73A93 Label = 8B27C3749CB9DF85C4762591 Output = 0858EBF134E37A82E14138220AC0437E Salt = 34B57CF770DD5094248780EB0732BC562AA196073B52DD2EA8289B5A793816F07B9536D8F57EED7E0B4CD07CF7518BB9659AF9011BBAC510913A03505ECF708416957EC41BF0AEC80B96B480DFCAADE0 Secret = BC31754031F4499C410D909BDB326528D80CDD3CA93ACC7455B2FB1AADC1E320 Label = 0CEAEE58E88EFCC23B784703 Output = 09A9D7FB04E7A6453469231C81EA3A20 Salt = A4006EF0F9CA0CBBC63B1503531E7E10076DDFA1B097C0F43DBA4AF6EA78D217BA936CB3A440A78FCB316E8FA971D526791D0D81C50A0425F486801DD42FEBAA4660B71ED5ADA08963AC2F6609D2810F Secret = 7CFDDD7612BEDA249CF8948A5D46197DD97452A7280F9CC1F4C4244AC924486E Label = C31FD5F1FB64CD5910F6E838 Output = 2311BA56A871DBA4270D3DC37A5B96A7 Salt = E9FA1CB0C41536A5898E7186174C8FB817EA0CEF44836F6FA3114BA4720B830FC0154C98A82B5AFBB6A214EECA5C030832B26D3729AF60D77B2165E858E81E0DD8958A661990467E5837978090BEB6B3B12C6D799054418C31A2 Secret = 5557AD1FF1453209FB2A2CB66481FD414C94BD191C6A130CDD607096A4F9D5FD Label = 39B21B742524B23E5ADC7BBA Output = 242690BAC99F1C9928EF24E822A3778C65F0 Salt = 713219AF240846429B271D6FCCFC8681EFA660C2AD1FDF8F64FF0B4495074344CEB9F6D0C0FEC3D62384F0D2012B0DB5BB769592EE9D4546E7A4CADDA413858E3EF59555594BE9F8E248DFAA46DB920EE3E608A6A6EB36295D5F Secret = 7001DFB9E4725A5B3238683E04819574B617EB82520A9D0A892A0E85B8361053 Label = B9E638B4B3289F230245E196 Output = C6C0A7FA4FC7317C05B15E04B7606E78232C Salt = 6BAF45A49F2D6756A7DD81A2D60A7FAEA3D7D940C6CAD8722A7B1E11F71827B842513FB0E901DCB57ABA207FC89BCA1FAD2780FC782EB3E4AF27A1D521A0D1BAE328DE37C0FEB4790F681FB3FF595F976836D6C1B8AD2C0913DE Secret = 2BE7D57097ABC677C56463C60BA9FA4F3C28449416E8E947B87CF4FF22FB21FB Label = C3BFCE3E1A2489B94039029D Output = 6CE262F4AC854A1062D6892B29DB52763BE5 Salt = 945F9536A87A885591B2D1C1DFEE60528D2787911B680259F9F9802DAA5B693AFCEE134A24869735FB4C27164AAA80BED7518C9185471D7E7C83CDB093810F536F67B8BDBA87343D164BB3A65D757C8C48220F5FA959843C28DA1D7C85F6E141D55FCA8A Secret = 22317B3E18850908A1CD30FD45F76D21BA7634BD29C276C6F62EFA35AE6DFC50 Label = 2893598B5BBFBE27CEC50820 Output = 43161E4C9D75AEB322E5DD1783A5650124BCA230 Salt = FDA316AC93EEC708F203B0EE0E158AA82BEDE173BB91F62FC211845C4787372A625C61441BDB94EED37067048C1F9F4407C679E29B70163FF30889F7CF04B76B7214A423D2DF5AFA32EF722407DA5CD829015A704D76A2E710E83F2B05FB7208A8D79E8E Secret = 3E7167EB9A79D05F1647DFE5056A0753E2CFD188638B1A8B754D3B588AD844F3 Label = 79FBAFDC757CC07EF130AC52 Output = F0B6830644B54DB3B141773331B263EF24E83F7C Salt = CD922C879029E72D9AABC6BEF449170BD2520BF27D3C70E3CA0F9750473BB8F2A2EC972FA0524F8A0A2114AE7B48D3A2E67D216C081BFD425C0772EAE771886F079B80485813FEB87EFE8504F840E8FAF38A70B2898E15116C29B6DEEB88FA34FD75262D Secret = D91A5DD68B69D00C018853426546CA1A56F3BD0A870E8F53D2A70727C2C43DAF Label = 99B47AC07FF5EE2D7B9B1D99 Output = 93C6FF261D1E7A6FF8B21DC658273F4F7399F376 [SP800-108-Counter(HMAC(SHA-384))] Salt = F66A5F03BD8FB8E4EE73 Secret = 30EBC364331C53CF98F771C4864CE8B00766893EEFEC211B5F4E5DE0BFAE06C783753A5E8F34380EF30C7E28196F51F3 Label = AC1C2915AC20F5A301860A2C Output = B924 Salt = 060D22DE4A916398F733 Secret = C8C00543CF83154A8813D5EF70D0160712CB31D418A211417B9CEAC4711F7A26250E59162B70C7F87B4C478C66B552EC Label = E3A13EE5D9696CA3B043813B Output = DEE3 Salt = 945084792B6DDF1D16EC Secret = A653D7CDB80FC4A2040072ADD8A28D8A049AAC433DF8F0B98AF206DBBD9EB7C965439F1EBA41D981AF46DA0AFE314F00 Label = 9F2F49F13D0287BF845A11D4 Output = DDA4 Salt = 34B97E350599EEB5205D1DAE3379F116B18D03F0 Secret = D4880DA37BF639152A7DF2733DA99D0EB2CC740E1B6F4A8EF49D5005A6512A5602EDFAF49905583528A5E10B2C8A9C25 Label = 28DDDFFBCFAEF1A6A33C35B8 Output = 53A855D6 Salt = BF1C250E12F19293EF61D80FCFE118C5F06DEEE1 Secret = EA3A910D5E1F7A58AB64C1297D83E2C4DA7FA9462DD21B19300D7F094A175904FF08B52689088F779B6978B87B5EFDC7 Label = 899D6A6378A537B1BFA10F5D Output = 3E2809CC Salt = BCB78FA39A90D5F7DD9A38FEE121D0FCD3D0A00B Secret = 36E1DF6B6168DD90E42D828463DC8ED170BBB914EC6471353020CA111C7B82C085AD73E33E6565F8FA9F7FA2E4BAD9FC Label = 0FF74E94DF773A65E454025B Output = B601285E Salt = CCB07567F959120F28E0C0C7966E0E844BCC31B1054415BDD0DA19F7638D Secret = F7F248D966477BB0FED27F1530E097720893892F243F456CB0220DAB58218B509FCDC4F0AB5C4545202A08B8AC8F232A Label = FB6D6E273A4E2BC86179DE14 Output = 016ACB55B73E Salt = 6689027B82238D095A17A5462D4361432F7FBB96EB39985DE71351D21EDC Secret = CB1FD8EAE49144AD83AB6C0E8D4BF559173B7B63BB85673497AD6E2B7C1BBC9F56A27341E0C4AC952428CDCAB309E051 Label = 509E6DFFA60802A52E80FD0B Output = 7F61DAAB9C3B Salt = 9C093F3835EF5E7C4A6D7154840828C4FB126F01954987F26C4DF1783657 Secret = F569BF5D250FA3577FBC08BC5769DF70B812894E4E4DA95FDF7FF261F42B4CC34CA082F66C3D6FF2DC91706A541CE708 Label = BDF4B7789CB2FCF76AE97615 Output = 07DD24093048 Salt = 15A5533C754D1D08C406FFB4C0EFFD7D7CB5BE05D0751B5C3DD2B02B9C87349BDDF7924AD2D395E7 Secret = 394B42B27CB68183B604DC0F70F8E3D31CF63738C84297E35DB6CE942994BA2F96B27F99BFFADB68290CB3C7274E663E Label = D3581FE19963D5F2D352C22D Output = E84271E807E42F08 Salt = E4738EAD345201040391F2BAC2EC93FB6FF7D1D4E28804D76DE372BDC7F905CDE8FAA1669113E132 Secret = D31D5167BFE86FB7FFFC25F3D875C6A7F7F76B5BAFE5C6D2C94097AF23C33181E026527FE39FCA701254C210BB05F61A Label = 0D5F069EC31CF78615DA4AA7 Output = EE191C25C375A5F4 Salt = 047B057C06396CF0B003C56A010B0FCA1B9ECA73F191C58C31872B7F365802E74EEC9CBA6DD77FD6 Secret = 176B6C47BCA6B909CFC3B6F7AE41B458040D144E9403330AB00C0C1CA8803181BDF7EF7A140AD6B5B2FA5C6829A531A9 Label = AA9033C56B1B5CF2B8D55117 Output = DD8CCDFD5BC99C25 Salt = 0D51712432C298A545ED26A06D4492BCEE1B96FDD53130BE99FF80C90D26F214E91E6FD96C93187F66407C084E6ABDE8F7DA Secret = 072158D2DEB08F3D558D6F32DCE0DFFF754B0F629F7DB4D395E843BA760C2511E1B6D768D97E8848390334E63660AA82 Label = ED67F949BF8D13705D398E20 Output = 1B088AF8B7C1889FC520 Salt = 72A132371519C75CAC6FBF134D2D0B3CD3B18A18F0EB20EF459A79054C2E14615EC791833BD9F66A8B82CE82BEFA88475EB2 Secret = 959F0E0EE665DF65A31477FBB91A390BD662C0839C831F632BEB472FBAD4DC16E5495814103E8C506ED4E5BC5E68950D Label = 2DD45C96FC9405E2358FE243 Output = 2352FC10671FB3F2E9F1 Salt = 2C31945FDF20663426017E2C10778F02525307BE87041147440BB762CD41FA142A00EBF7F8213B7B182B30900105768D2350 Secret = E3FA76F33C8C15B9272F43C5F32D2A41488CFDE3A170ACB09031E95A4CAF02670B42FE7710D7CC0747EDD135F1AF250C Label = 6D37F9EC512B0713B352C859 Output = B7B75E1BF8BBCCDC4768 Salt = 050ABA4957749A0A47C1AF8B671B3128858FFB8260EC68435DB163A23EBEDDC933140DA0BCA3047A08268ACC6D5EF6AD750ADA3E82FC761184867313 Secret = 5498F9261C91CA90C8F42C9FC9BDFFE38BFA54FDB2A3D8BE5732A408FEC4BD32F3458D117EB73BDD7EFA7A091141FE82 Label = 1E3E8BDEFF197CBEACA540F5 Output = AF3F51A380EC868DB47E7391 Salt = A602C588D01B3B4109606194F36C3FC29960F086FF8C503CBCFF23422ABE627369FDBD5FBAF52004B92BBEBFD7B6194C04CD6AF89792B5B609531DAA Secret = 56A59C86A742BEFA1458C45209BEB4D5BFD31681E5978DF7862C10229E6F590A6E2FF3A253D1DD473FF75ACE457AD31A Label = 5539F01EE755873F175B65F2 Output = 8A1AEA04CDBAD545C2AF61A8 Salt = C3F69ABA8EC040308E577355F0D845749BE84725EEC1333EBED45CA5BA3F74743385A60C8F4B84AE800475F0A592AFE9B814E5FB3684A2A8E2C8C501 Secret = 4F030CDCBB768F3A689D4BFDE6FEB3F770A29748D01E998E933C16B2087070A74488CAC538CF4F5E84375164A6F8A9F0 Label = 64474DA54D684161D309D367 Output = 6EFE12410BDCF8FB95CE3EAF Salt = 31A96AC0F04EC89C9046DFA6B3A999927291180AD7B1BF434C4C69E707F3A430C8AF60FC5C669B8FEA899BA9F19FCDE07B4BFD9F852383921B3BEF7A65BC8B98DB698940C530 Secret = 17B19E2770921E4FFB41437BBF354A7305C0B1A392DD9719FC126480C9D2BF56428445B7C97FAE922FEE77E2CADD5BB6 Label = 91A069959415CC37BF92FA15 Output = DD5A577A4C22822693FBE72B8970 Salt = C20EE31669B5A5CF45258DFB28C3F7E755FCB10FE971D3E4F3DABE7E91CD3AADD2BD264E84C562DE85D3C1609FD6C21414A7AF33B9D4D3E78495D45C3F81B47D87383F648D31 Secret = 0EB3EF2905D128142398250B4DEE91747DA3E0E138E6F6C4453116CF80B7536CDD91DBDAE2D3136DE60D470A751F3B35 Label = E31104CE036A7E87288607B2 Output = 2E5FC57700B6D771AE059BDC9308 Salt = 2855E059E9BE6CF261C1E61A78F82EC5AB9AD5B7AF6006E70F0FC2FCAB7E3A90BAFC1C7218850F87D02E516D29B178F9AA6D12CB5571A671E69F4BDA5D3014003E6D4545C8B0 Secret = 60B3C88011BA3055FD56417C69168CC157CB636A61356676764A475C92C7EEF0BACC974004420FCC86193346AC8D891E Label = 5981C14891E847010146959F Output = 95A0748ACB2030BDC7B731253C09 Salt = 20B8B5C78613B4CF47652D667B20A3808A7A082C047A6D7C5B22346E3A076C947843C6B84EEA35F7E343F1A817A567E9EC08909FCD02D06104BC729D2566FAE7F04A21047D65C5A7C110705A463A0B30 Secret = 18148B335F2F968D6C1E51C5E7ECA2DC6893133250C0DCD2288F92F4AF5B370601D42301E53894F9166873FA27353616 Label = 3E744E6EE2FBE88A7FE52FF8 Output = A4502937D13F2064157AB9C80345841B Salt = 7E60691A4630CBBF66CE7F41E3A75E59FD6BD12755484556F5872F349196DEEBFBE6F9E35C6431001BC369A234F05C219919F5DE666923DA4B2F4447018AA46670B18074A1EB2EF78BA3AC2F5CBC454B Secret = 52A94D07C1B0EAEB4C5D4E49C0E13657904D38E6E28ED22D3C6D9ECB3D65854129C8199A0A0AEE397BD007DE1366D55D Label = 9F673BBB49629B67B442849D Output = F0F6A8D9593445F0BC1AC378121349D7 Salt = 124059ABAE06C4D684F61FB9D70D08B50E7C98C7F31C4611853B3A25C5A183E00AE9434C8E075456711BBB0B245DD49DBD498659A2C9CA8EC7200B23D92BA60853C73FD1910C70FC6190A3FA96208A4F Secret = 50871262EDDB38160336519DC5634D8D80F8CDD583E596206B53AC081789AA8D00518AC05E8CF246E20337B61A754158 Label = BB900F8AB156DDE082F7DB9A Output = 05710AAF7AC73C9BCD3F9CDC5504D237 Salt = 4D4D341BC5B4AA4D7A5D95765BD15DCE3DEF886657B7F0E1D2562C8BB955FC9D239363BFB89FBD5453D5CD9EE34A74C08E1797B4003E1E1C6C2DCDEAD07663EA96D762973A4F429A6C47C60C78D000C8DE22E811624C877060C3 Secret = 4D70F3CA939420D4535771C4C3C5F18AE4A8017633839744899FB02C8A1835CC8D443EC8C37C274F3F24F657E37EC9EC Label = F086EBA3F94E4F17790DA783 Output = 80AB2E62E691479A875A2BD0D70A7473F803 Salt = 14FD0D74DEE84480AF5D3AD17712AD53D0EC7CF40212310942DC6790C4931055CB14AE84D7D5AB3CC1B68FE88120554E924D40DE450B44DDE7B3863A8C8B9F8D5B80ED50B33B1C4FE0835B9086C23F4D817DA5A362245C28407B Secret = B11DF7C96AAC3BCDBC72E738C6D711015E7082B884D901DE9282DCA2E8CF44D194CEE505EB0D0D1AF62049F288715BC1 Label = 3D9A52FC1AFA2C0222706F27 Output = 226D94A19E98E1165FEA27524DC6BF7AEF4F Salt = CB14C038FB0C7B4D0715A1E53D005286C573F0FB93D203EC7103B80CD80C86B47CDDCEEB35F137329EDBC660AC83F97DF9185DBD5CA85E360FECA3846C036A8E0DDA3C275AC6A43CB87000CFCD2A31F5B7CF6CAC04E5DFD62580 Secret = 1C5A356B4CE2DBE725B3D843079922BFEEC03B3A4E5B2F1CB2BD5F582F1E442964436F2E0C7AF3217F0865E503A802F8 Label = AEA80CF74222B1C9C780A477 Output = 16C8921C15E640B51FF8D9C9011BF9DB4BE8 Salt = 99A01CD7B3F4097371C94C0CFC0A3E5321EB67F9993FF4332A3C04936EF1C68209538368F482E5C7752F226E6BAE2E260788CA9639F209ACDB3ECBDB6C2EFBE440C8E8B8A5CD392835773FD164C9071A8650F77B8D3EC3D93E74AED950BC4B7DA1AD6F85 Secret = DC5C248394FD89EAAF134C08A0F3D18B7D6960BB683B5D663ACB77048C4A20CD0A0A321B55E5D71CDC098A9C97EF2C7E Label = 22032EAAF92E44D39E109EA7 Output = E6E25FF61CD9DD9A53E709010CB06C33A4184CED Salt = 61A492F7459679F7EB02B629E7A4229FDFE0A93B9DC9756B44A1FB33AE2BF2B78A593545009559F2D29FDC51267919F02BAB149D1F30517CC10CD214D78D572B8338E84C10BC9782FD8163B4E0DCF4DF5752D65E6A02C9CA6490FD5BE26B1D3BCE4FBDBD Secret = 0F83B50FF23F5EFC99A109111A1CE9F8AAB9693B59CDDC22CE1D579CEA328037E8284103EB15BC30A597F16D21847FBD Label = 22E0368A849B2946F4F0C4DB Output = 8D92BE0D712F7DF2506875C69A5977BAA3AEC5B3 Salt = 4F64DDDF0804C793207C76E6EF768ED654AA3243B52E82FE79ED3DFF5BBEB9865792156B467814B9BEF63DB6BE0BC899EA3656ABA80BFF145072F831FEAE41BC4B304A9A5385BED6A62DF771A63DCA69B499D4BD9F1E8ACF07635C51ED4117FF76E1F6F2 Secret = 9BCCFE050258F32EAC2EE9CF2A53ADC70269ABAA952CC42CDEAD313F4033CDAE758CE80CF335632EB37CFDE945653FE7 Label = E257EE6E8BAB6692DF1D51F3 Output = 22DC12E4D8E251F66D2E242B4A1EB27458E24C05 [SP800-108-Counter(HMAC(SHA-512))] Salt = 33C0ED9DF8C585FD7B30 Secret = A6CC599CEAEDAA4266C1E5DB866476F798585D6F3E22666FBC0E5770621CE124E81B9D555476A87E5CA0778DF5FB9465DC239C8C574C83B8F5EAF3525495F9BA Label = 4B05526629111CE011863B7B Output = C18C Salt = 0FA17D15475BDF519184 Secret = 5B9896052A171CCD2D3EFF955DB09CE9905C0C13482E64891AD63785618A703CBEBA29FF151D907884533F11CA9C759529634AB6811D94779725EF3BC85B2063 Label = 571BF01C54025B0428D3F60E Output = 0B22 Salt = D76ECB782789884D24DE Secret = ADA10A78884D057675F1D5D47A018201206274FCBAA3A0E09456715A131C0AEDEFC7C877E3683D10ECEFA0587A36B32790BE232BE8EB2418F058CD4805A7AD20 Label = EB109A89817C1BFE3D6DFE5B Output = D73C Salt = 932AFB65BF0B0BAA16C0FE08024C4F9D82E92729 Secret = AEBFB599713D9F727C7A1FBB0F4282474766DA970A04E80462C1C541C2E9EDD2E1DA8B25C3D68151EB1D7149C5D40BF30FBB76EA554A4E60099C9DBB855637C9 Label = CBCC4646D02C5CEDFC3ABAB7 Output = 9FE61E38 Salt = 62BB46B69CF43F5369142029264F647594EDB4A7 Secret = D448A78A399C13B7501575F17B555D20CB261A92D19478532F3C07C725A2F560D23BA9042281CAF411810EC1A96A31701E979F6345DF5E0A406545E9A3C95B6E Label = 77024EB88C5DF91E32E51E3A Output = C2965457 Salt = EFFF62908E65281138498BBF5FD2BDC335B9A6C9 Secret = CA09F43D4BADA7AFD528F2848CEF50209A42A30806441AA07EAC1465F72DCC034351D111C461A23B7C43DD103C806277839574C697D8F2E93936DBA2084A9A49 Label = 0BEE621355699CE10602A6B9 Output = DEB740C6 Salt = C52DA0E1902AE6F6BB9154664FB9BE481995F2C50549ECEBEF3D94E0071E Secret = C308F4C3741C516F8694FBE8672143A6EF47F19F73EE7FB6A2BD67543650EECD5E0F836AA3627F07B35D17F0BA37F0B84699C79E84423287D08D1476EEC8348F Label = E4435DB9C50C9C6C8A6DA706 Output = E8E9955F8B07 Salt = 22B6645A5DE097C980B2454D3E4211F3B5CEFB561820005E508BEAECE00B Secret = D842935BF79FC560944965C207775B707735C98F8209F2A19C8A1778B2CBE034C29B50A6BF66EB94670AFC962D6826C8C0F800A8E3769946663F41B2869A1E0C Label = C6203EF7325990F0F1B60E43 Output = 5CA2EE61DBD7 Salt = E5C184857333E4E97ADE7E0EDCDE8B948B34620934C8B4482D5770217887 Secret = 8A07E63C5F1237D263BAA49A234CD7D94A6640CD0DC3101629C3195154128A0C60C130954A6287FCC46969C46162BC5C9DB8F9898F42581B37BC9F721C0F08E7 Label = 2ACCB52E2CF1534D0B1E86F6 Output = 7035FE0E9814 Salt = B7562E0519F1E6F45905088CF76271EE950285A1BD7250A077F836F251019829EFE63E67E295968B Secret = F49AD223C0008FC876AA9216676DFB52D07A29C8E627C6DA23E0F97ABD22756C9F1B688F52D0E70C995496685C478E228216D3EC3AB270465B34C900AC01C645 Label = 40AB62392A4AEA8328534CE1 Output = 82D3C164A9BE1E68 Salt = 924B3F5479E877986E4950151286995C59BE655508DEE55965D243257269181F4C5F63CD810B03EE Secret = CC2BD16275362E6D797D80CEBF459CB824C4713F64918B77FB4144F83A8CEEBB29EE8545219092BA5D94FF1A128401FDC59717C716209233913604F2E1A05171 Label = 3B271B41430A95EA1B878E2A Output = DEEB2B902AA31D76 Salt = 42D45299D558AAA52423B8DE7298C48FA6BA134C39B00982A1ECC66F1CB5D3B47EB713AC91A98DFB Secret = C062C9E3ACE4D40CA480E38AEC973B12A2D361FB9221CDD2ACE17073C856AE834846F200AA184C7F30F13495CA19734F28D1992B55298862656840ECF48DB399 Label = 13F5FACC0D9146200A531BEE Output = F76543B2D5DE5A9C Salt = 4F4C0556214F8EB8F5358DD0E89255E582780A728E098DE65B5B1F228D7CED8C41E813CCD3F9039A4B81DBE6D5237ABD3AB3 Secret = C5CFEEC9BA6B1B6107424EC2937356B25DEFAFD3AD3641717781100A0D349BCEFEC805414F58291926155D2E84AC076CA1B98791137E5208CE88278F62A92419 Label = 072F7AACDE47D2D9507B4AB8 Output = FCA57B9A651A1B3DA457 Salt = F5A6763197BCFC11985AAC42681E696A5ADBBEBF201FC400EA54C4278AEB74B1DD44B646AAF5E9A3890731DCE71CB11F2380 Secret = 120165772C93653F3AC00658D46B0D039AB95FFB198ABC79591EA994498C7265B977CB94321CE8A3077BFD2056743187FDCE8F79369B1A1B14A4FC03AE4F62D6 Label = 986A342FA4A8183A82B6F3AE Output = 5E06575093D9C710A455 Salt = E05E2B1DC75D98E6C2B34AF38F0EF76F971DA22ED7ACAA938E8EE091506DAE634C6CBE886F1BF6F78226D3DA493AFE769F10 Secret = 8DA812DAECFA0D02F6F2A873DD3B67C3D93AC59F2168045F47053EE894F830AADB8722B2BC2273AD831722C8E275C8430A2236850EE4514E4CE7960F34DBC600 Label = 9CF01FFF4605665D310D01F6 Output = 8D53FC57167A2C2A62F2 Salt = F612488100C710DB1DD71688F8881B285B8E54CE608A1D54A9F8C392D6D300D9F290C7BB3CF880DDE9A54C6DDF13BABCF07B7469CDC543835FBD9469 Secret = 46BDE80E68548245A523607F71FE6CD7061B662227592BF5CC041CA92F31AECB049F9C1091FE294CE45A045B5A5562EDA0A057233A92E64D5C4A1813DF565727 Label = 6C8F015E13AAFF83E0F17AC3 Output = 91163AF9F1F21285D459C4BC Salt = 7B187C85A838E8DB5DFC9981D16D65BFEA3680EE250F037D940D45FF3E48A34EB82129A5DB9ABBD01337CB0931206D92ED1AAD8B95E58BE40718B8DE Secret = DEC1EA826F25D2A82526A4CB29F5B859E9918C98BB95D572971EA996F3B0D9678D06867EBF3592394A57836BEF6525EB90BB7F5D0CD55C3D81013F2BB1B2BC9E Label = 4A1086A6DD9698E7B5C32C6F Output = 3AF56A692A5BDBFCFC52C2B5 Salt = D1FC0AEDB9F1CB1D5461C2E00CEF320E5273810BB165F2F8E2314565328B1040B351BA299FE46356BD3C13D0C18EEDBB795FB63FA41AE6D51800BAA7 Secret = C5EB1EDAEC27B43B9C9470F0DDF27A0FCACB3AC38DC28B6A6D429F56CB1A8ADA8B28821FE147E2B8DD163AF13E6D5AE6D220ECBF5013060BE12585B854412CAC Label = 5B775AC78B7486A815D3A345 Output = 3566D67A0410976B7EF2F242 Salt = DB548EE9900FFF9590533780FDD700C1E5945B7857D278377CC96686D0597A5C7EC23A86E20C30C19CEBCA483EBBD3CA39F3E8603679A793B4230C3AE90D476FE80EB4B3440E Secret = 26319F38D9FBBE0CFE6A34CD405E9258BD44CC7F14B6ADDD64F7F160C37881C62109C89058A924FA9ADFD7029EF2FC3C0084B882B32EBDF7337F83B12AAB2381 Label = AFB1A048578C6C74745F36E7 Output = 958FA25AAA101C7426F3B7797829 Salt = C78A37644DE0C9D41861BD4E4FBCDBB2FDFD8ECA6DC71BD13B085ED1C1BF3E45F6FA54DEE15081CC7201376501BD52D6A2E4C1142E35A1879B48E56D6C47BA6D171327357386 Secret = 61A4774E6121DC731632CC4FCC9581932CE50615BD8578C277F3F546667024C3CABC11E6C0B49778C518BE5B76668AE20D8B940BB1F92C26C39BC5BBF295A9B7 Label = 374DC59015288F37236CC5DE Output = 179464AFE230B3DA500B8001CC63 Salt = 2102F29595E9E7D80D8182BECEDC8175412D958ECB221C2F05AFD2689A4122F0EF8251793E3A6A00E8FED90931A5D21817F2C2299680D07D2B8527B147218DEC17DD4961513F Secret = E6823E0C7896F1359D161496A03ADFC2572FCF6869E78BB21288F3D87B38B6D016EF5F2F64FA023A5FDFEB2456C94765348DB35E5C47AB001E9DE6789CAE3424 Label = 5AD36CE72B335F4DAF8EDBDB Output = A218B010FF0C03BC7A7FA14A35FA Salt = CD8B923ADEED766ED13395D58E7091CC6FEFD5C8DA7C7C4BD09DF552734EC2A83E08F1C2AEA5C0639D91130DCCDA138570402CB41BA74B22F78A206CAEB0CD0D5A2512B3E5F3F2D12009A61FDD0C45B6 Secret = 74E933E278A3298AA058A8ABE4927E1902A2AD324E3525F6E06DD903EB7B7DE0E1EB1E0166DDC74EAA47BAF576947AEF5E90B9E87103FFC0172323AA8502DDA8 Label = 7E54BC50E2CCCEB07A8C85DB Output = 5F9D2701FBB0A452344CF0624E3C91F5 Salt = E77028694620A4D7161F376C01C6F8DC775CF527996523BDF74B23A1188E4AF61F106F5DCC40B2DDC3E6929CBAF60D4CBE8230C743A38361610493EA494E1892A92A9C66D4F9BE7E286C9C8EBB53D9AF Secret = 229F5C63258FB167BF0A6DF896B6EF2C92651AB75AE5F60CD665713FBA8065396C5D90611AB02392045C500D97B0608DC634AD68E936ADA437BF547751FAF4A0 Label = 6371EC10CA720076CB7AD827 Output = 19DCE8A66E42697975BD55F166A701FC Salt = 3FF76CDEE44D6DEE06239F5F54005002A613055AAAB8AF7D137D69272879D25EB920D37DC9EA939C7EE0A9361727AD43088BA6AF1B6C378D1ECD73237542CFE309F56E01C6CC82697FC5E1995DF55EAA Secret = E802812B906DACA75667A7B681C0828DEE6570A220D95341BD1F0DF45073E877F0FB8E49B006466AA84EE6205AB5F141E14F3A6AA406D3BC5815C005973D1670 Label = E006182F4D43B2EFE4F20820 Output = A9DC3A1A4B37A007FC7E87EB3BA3EADC Salt = 2A2621CD3310518AFD6F36955FDD0F794FB0B0479218E0D7660EEF4A9BE0B852C11CC5A26E5BC4D1F733B1750999E1B4A3D5542C9D1B8C35B089B54ECFDCB7AF73474509B4E9CD718A497B2CE1328EBB039EBFE3F8701930A373 Secret = 6B65F0EDA7AECAD580F912F43D48E9A3D6E61882E52483F38D0DBD8DC69D4A60E574F1E6B50A7EFBE239A848711AFA3BE25E47994CB19489AFE1C1E384FDD7F0 Label = 77E628F3776CB7F32254CC08 Output = 9E2A3D466B0357B290FDC783CF5031C1FF44 Salt = C5076FD31FF27607CB04160EA79A641F78A5F0B547D5D5FF4E56B0C7B06B83A797992858BDAD026DABA940AA7AD4281AE377DB6AD39F6E8DFF313F3B97B649BAC1423A40D4806AE888EA07165903C020A6F68F01E4890113E5C0 Secret = 36B140A3BC53D0EC4AEDAB09222B72A690F0B2401FCA7BA6FB979877DD6397E840322464F4EEFB32A9694658D5FD435A3EAE0867A88BE38AFF1F5391425E54B3 Label = BDCAFFFBB39D319D4C90927F Output = 559D449EC9C3491DE306F909FD0AF0450939 Salt = 51338913B3C9175ECAFE550C88428027D75985144E828B1F4E8B098F4424F271D336E7AFA65F0D3306ABB114E0CFE8B5A5997B3D8D23C79AFC6AE9592A2BE13158E20D24E95198DAAF39C7235A91D6CBADDFE27CFC18AE4BCF3F Secret = FE724CFBBEB7D1108D6B2456C10EFDFF36ADFF5351BB78245FFB64070FDA778301D602756ACF6CE83F93E1F53F2FB9D2B7DC59ED1BD24A5BBC807C889A1B3BF1 Label = A88E632D27ACA9894DA78C81 Output = 854E01BF1C651E5BC638AA65C9902F0A75AD Salt = D2A217054525DBC2AC92EAF5CF3E2D2E5F066E3FB7920A8736E835820B4821E5CC02C394A867149D9CE4A2D469063821701E293ABAFE77F557D270D38E74A2A0AE5BAD452C7007B4E16F789FC5460A375CD51DD4FED591BE285A9110588255009688DFE2 Secret = C6E799CCB57F89065269C2B7480CDA4AF3F65944F498B166A1291BD9C169F20BBEE408C775A9BC00011093E4D9D3E9B98E5ACF5AEBA5212278E96C50951B2737 Label = 30AB664413EF387B216807EB Output = 48819CA2F44848D00EB9237924B82BAE6DC59A2E Salt = 17E42893512C6DF7747906508AD41396096A13B7D9AA87C4F7FABCBD9795165823A1B54819EB190691C96BAD55AD233A85F3C554C3E9B2D9B588A9F0DA09DF0D83D6141B83F5A62190FD16AA20B15552C3417C96B931E7EB55E06CD57406D5AB79FE12A7 Secret = BFFA0F4267D5F24F219151CB38C581C0D1CFF8EFE475D7C38A47726B226DF36E47E1A579993B4BEF9E3197330610ED57350BDE57EC6EDF231BCEFF1532017C0D Label = 196636113098B35C35406BB4 Output = 40595AEEF8C541A9C453E27D38F6F04463331A8A Salt = CE671BB39F28FB3D4C08F5A0072953B0C1A60D2C1FE6547632DA88884FFB61F66F6EBDA9FBA60D6DBC9084D6414C79A42579DEB3B145B01B87E8BD142D84305872588A756D0DA65BC1D5A5388C08D89C7B23EBDAAFA96599101DF7E4801BB0331285BD04 Secret = 999E5F40A42B5AC6763C057AA6778399B9C9F1B0A7955E1753FA4BB5CAF920180A16122C6D707F0EB709CB1903A8D886EA92738417FA988FDAFF0CB83977B98F Label = 74ACE6E9AE7CCABF9E6D7D29 Output = FD9BCB8485AA4D67B6B72724107777EB36D23677 [SP800-108-Counter(CMAC(AES-128))] Salt = 715CEA804DFA4D1A97FD Secret = 1434F0CA01CED247B4E57C4191C2E510 Label = 6E660E852E809D3D0F9D1988 Output = 9FC1 Salt = A0A3C7954C48DF9A86AB Secret = 5300FACD33C4AEC9F0C68A7DEC198DBC Label = 712DC17761ECFE40CFEBBC51 Output = 4975 Salt = 48415223486C51CAE148 Secret = EE4284A2C859E28252FCC2DA6DDDB6B8 Label = ED5CD581E276563846C45D12 Output = 8797 Salt = C0712DC1B6A7568589B3E7D1BE76CCDBFCDA1D77 Secret = 2193388C70E7EA3483E5081C313E3ECC Label = 4785AAE3D563ADA51614B20A Output = 36D6C682 Salt = 24D0BB945EF2BBCC30250FDB70CBC389356D8139 Secret = 4123F60A687E770242B647E1A5DD71F1 Label = DD320F65CBCAC47D78F3204F Output = CFB6813E Salt = 8C1C3301812793EBA64E39E983C6B50401CDFA57 Secret = 43B29A5EE5AFFF6F5B159BA4951FF08D Label = D512FB93969A664F9AF413B7 Output = AD778420 Salt = 86D76086E0672812B0C7B84F395F5B2298500B40ADC6A3999BAA7EB9BAF1 Secret = 70B387E0B8013245A0B4654EC28F1D13 Label = 9AE727A0EA8243F83DC14335 Output = E781867862D9 Salt = 3B63821261AB267195CDF2068D2290E6CFEEC669C9D07FEAD9484BA2F964 Secret = 497B5B16AFEB27DEA3FABE6F81D318A2 Label = C46C1AE5F491CFC36DA78D98 Output = 7F964D4B0557 Salt = FE20A616C01029109BC72D67A7E65A857676099AD572B013330A8E006A10 Secret = 6213B2E5E0D3A1C9F88351DA90F469BE Label = A5895D9A9F6B37DBB2CC8ADE Output = D90936C00D4F Salt = 918A552A0AF4887D00DB182980EC60E7E39B79EF7678C4485B1E64EAFFC8F1F532AACF69CFBCF47F Secret = F0CA6C2DC10D3BBA2D3715782C365CF0 Label = C9AEEC9FAECF17B4BE88C385 Output = 5786116E2C742C3F Salt = 1F2D8C3395AA73E7C69D7C113007272FA912B7041B2477CF62CBD9558B0BA10F9FB995AC235257BA Secret = 3FA8961D997442A48FF2423E8AABC2DF Label = EE5E1DC8C89350DDD1B8AEF6 Output = 398F98F498A22173 Salt = 9E4A2FEB912CB95451045B8C032E6ADE5751C40EED5DAB3EA0E6DFBAE99FA0F0DC0310BD4EB23655 Secret = 2D499E34B179D49D8ED81D8118376DB8 Label = 5900459546832BD9363A4D01 Output = 419131EDE4327950 Salt = E9E37A345625037AEF9E5BE3CC681AA89C3358713A5DABC9D6EEC2CE303A3CDA6CEEB4369EFB5511F2B898DEE52EB33DE72E Secret = C9AA7AEBDC9CFF6EB6D9FBC8F2744A37 Label = 2A263D67CF55E63437F9E57F Output = 81AF6C25D8D80A345374 Salt = D431432AFCB71A30C5238951A49E2D91F0598F65C7862D6F0F4B086114854F162805DE2189AB89742C30ECBBEAB115AE5F22 Secret = CD82657E4B6DF770E01A936BC3CA622F Label = 9578505BD6D48B9E8C1A7BD9 Output = 8781C79D27025A51E68C Salt = E28E791FDB05FE5F29799BF61B18F3BA8208B497F0E557E7561764017412E465A79F104F20E8E08EBAC3B3509C155E20780A Secret = FF91A69E76D0AA2EDA5614C1BB4C8A5E Label = C6AB6F9290073D154CC35B90 Output = 119E14976B7A9E5EBD54 Salt = AFDE92883EFD1F5EC778F6379B892C739D6A73BB9FFF0B528CCD166FEF0C80CD7FCBBD1BC25DFEF84878BDF047113A4ECA8AFC6C8375F9FB43166F62 Secret = 97C6FBA19F32AF7B97D5EECC7290EF35 Label = 0C2BA79FACCEDA9F127745E6 Output = 58C26089DDC69DEBEA1DCCB9 Salt = 2A0055A4FEAB7BAB6CB3165EC5A213952D3C9A965E3D0DD7D17797110719BDAA16BAE29252EE769D408B933B642BC5B28E95F398B30450AD43871314 Secret = 14DF17494135409D76B3010494E31EAC Label = F5A4F919E85C5B8162B0595A Output = 13E4CB2ED6AFC68EF49FFBE3 Salt = 4D75CDD260528F1479C3B859975F7469B572536421CE07ED8B0408D826B83743D198FE86FC93A632E5B43866748D2E0A6066E279256C61E96F665A6A Secret = F86875ADDB720F7E05F09666A106F142 Label = 0775E5D01A5FC990B2E0CA29 Output = CF676B927B2105905E62CDD5 Salt = C5FB4C12D40F000B85C2DCAE2674757EC2D7E93AA10538750137103EED087D05BBCB571FC207B24B40197E243CC17D5E9C9A9377955679C92B63E8DFEEC6F8EFC765C10148BA Secret = CE099448ADE2C95ADB3E27E48F4D826D Label = 2BE68DEB481943283619CE94 Output = AA32DA593EBFE61B8B87B2EEBB35 Salt = BB9E6F75F638D4810D39A3FDDA02EC8E6CC4297A631E50DE358F86EEF28641C7775D877ADCA35FC90F1756B6E539AB01562D3550019A99B2727E7198EB1B77E5EF5AD35D5234 Secret = 9956A9E31155B899B53D7B73CA1432DD Label = E6AB7CCE2154CBD5452D9280 Output = C48323E243DBCD39EA45B74A5FA3 Salt = 1E387969DF729DAFE8BDE6308478081EAFCE130D1B823781EE6EAED809B27240E982C02E51C435E5EAA48B50291D43C7039D89DA8693DCF882FE258CF574BB0F37E6AABA18CE Secret = 74E6A498A4F81E3F8DB42ECD39F154AA Label = 8621DF736DB9AAED2004C53E Output = D9FE05D08CB417133D44082C1247 Salt = B93EFB62645D028FE53F2639F1A5AF99A0BF9F12B147B6E0643432DFD1ABCAC371B8DCB17B8C1048405FFBEC930B08A09026584F2C6809E97576CED5CFE9910CF7556E1B82521AE1CE47FAC614E771F7 Secret = 7138BF2EBEA287CF4B2BC2516871760C Label = 23374FC2D009B56B976B257F Output = 3862EE711131E43D26BD162919EBF01A Salt = A640E2B8DB2E68595BF11112EA19F9A5E7BACFA3C4DA4520BF4CBD2F9F6269E29F2E3A446FC85B8A2A21B1DE24EFBEEBCB7D16B95AC12D696F9086D0BF7180BD98C448B05BAA3F765C531619F207E5EF Secret = 5B8F046924C0ED88DA9370BE149D97D9 Label = F68FC892A41BDD645F9832FA Output = E9FA31B803371F23A0557E8F05C36E79 Salt = 4F6A31FEF3FD64CDA1B8ED337FE847A7EE1407AA55E9088DC4277A3297312874D1E336180CA091719F67002C80F78051F41E86ECD998C22DCE8A0B5FB9BEE4E010DDF01B3CB4656CB46699FBEF8ABB6E Secret = 162FC2B72FEF74D415E2F002ED90966A Label = 48351F9FC75E6E7E6C1AFC49 Output = 2768770ECEB6557ADD1D9D149BE30044 Salt = B08722EF11B63E7226393C584D1972D30E80BD5458BA3D75575371816F8B20417DF6C7FC5936AA7C08EEC1CF4649AA12A15FAC1AFA7CF7B65D3D74B8F605692D54B63BE4B27FFD93B54602140B40F66A30E9BF58A2BC68A62D9E Secret = 08BEEEEFC876A885DE2C0D4D700FD127 Label = F6612D312C0DEFEA27212D85 Output = 6530582A6A91F0782B6632F880486D37D7C8 Salt = AAEAE539A865F40FF7F2D5AF6EFDFE634DCB20C605646A1945877EEB469B0BDE43F80C88C26904C48EF7863858864E34624380CC785EE5A9FF423CBA7AE7034EB3499D5D3E698C8FD826B10BB2DC3A62BB29287123440D2D72AA Secret = 9EA265A0019889A51ECA294D49D44A83 Label = 668BC2052CBA249C8E4AF112 Output = 58E130370F1304807FB144BF61E817139AE5 Salt = 6CB5445786840386BD4215200344730F33C646CFE9C41721FB6A6FD9A79180FE6388B1B9ADDE213BD7DCE76664F8D48AF97CFAE6A258B73B55F25AD0D9852C56EBCF28BB56A58A755C2F7C68E1CE8A9E803C08B37F177E74FC6D Secret = 2A1E994E0B101622A00F96079D022E0C Label = 73F0E79CC41B7E8A03A953D7 Output = 3415CEDEA07DEBFF2845364D53F510D8C612 Salt = 4AA059D33D1624986308A72231002EC4234B8D7F68659DCF9537ECDF3ECD9B453F32C6DDE39FE5A0B0E29B4A7A7C8E0AA4BC4E45B21E3FD10DCC2EE0BA8EE1598DB700C144375838C0F0E79D3BEF082F58FB0564FF4C2768738EBF14B2261795D87CEE5D Secret = 06FE2C2055809E397ECC9C501C2FBC61 Label = 15DEB162BCCCA77B4727ABDD Output = 6591878B6D0E06EEFC937A25455ED4302530A6C3 Salt = 1EA795CDDDAD25C1F8E6F59611AE8D85FD9C125EFB4D0663B7FCA2074F87B32A685BEBB7368319E19A2D9D6390E8EF9997619ED177B9395C15FC27E3FA4B4745AC1AB7BFD855E57927BDD4B7FF070FB9D7D9FBC55269C904372871D078D80F4E2FBCA26C Secret = 93BF507EB69624949FDE2322E8094881 Label = B153EBF23E7DEB0AC582134F Output = 5AED44EE18474D9FB1A2AC9339B5A4E47A57BBDD Salt = 856B81EDE6DD769CB445282097E815D3CE471932EBC77C568B59183ED0E56ABAEF3EDD62782F99E5D827D8C77DE4FD16A7026DB4A851A4A274848F7B45148F04EE8E1CF33484215B05DF374CE588B6DDEB87D9CEBD2F8128C983B922ADDBAA3B4B3D1EDB Secret = CCE2E0C1E4724CC0A25287C5155F93E6 Label = 7FC973E5093CE50B169AA575 Output = E08B7663361647BBCD169359E684331EACF6261E [SP800-108-Counter(CMAC(AES-192))] Salt = 1A299B4BE6E6B8725B78 Secret = 488033B974A4F10C7086F0108C1947B3965DF1CF83EFA8C4 Label = EC998576A950FDE75C12E688 Output = F45E Salt = DCA1F183283158F8D7AF Secret = 09C7B766B2F3B70922B50A549464E180D1907BD425050186 Label = 4D1690A853F3B673BC48AE28 Output = 43E6 Salt = B70EDFEDE2BF4A8179C9 Secret = 1F36134163562A05A0065FBB561E59160295202436D49F80 Label = 1AAD3EAA1332C8295D0E9BCE Output = BDC3 Salt = ACC9806788973B96A6B6457A58315BE4B56D8B97 Secret = 61DBF9BE7C2389BDE2432B4AF9657819A505A300309EA5D3 Label = 6B4226D47612AB151EE48868 Output = 123BAFD7 Salt = C0D27440B2C996C2EC002BA44394F1DA495EEEE6 Secret = FA5CF1A840AF6597AACB55B35B7B2BB0A5E8D657C9CE728B Label = CFBDF27C8910AA3FDD50471A Output = 05317DC3 Salt = E7B8E6D818DF2FBB8AF2EBD4316D0B6EBCD9B677 Secret = 26D04C8BB37811951CFA3F56EC25B7A880362D502611C9D5 Label = 6B264872CEBD5658DAAB4878 Output = 50DD3641 Salt = 6B9E8FE257645F3A8E3C088AD51F29640AC307155F531FFE93E27EBED480 Secret = 78D6FE81584B58E51649E02E9C2EF40B0E0BE6CED2EB320C Label = 1E16D2305F816244385293D9 Output = 6451B55E9901 Salt = 17247E347B20FF8E8289404664E98D81DF40B5DED5ED40B2EAA871CB5F29 Secret = AE67393C661D67AB2B69AFB3EFA6BCA49F6858DE1B174247 Label = 0A1653B22F34DC8645DE1B78 Output = CE8D581AD36B Salt = BCC4D0B140EED88A600B3CDD44DD62D1167971DBE9FAD261C01B7E32A8F4 Secret = 357492F4EB88F9793EA152F3B680BFD4C77BD70E4E68328B Label = B6E176A6EE7DE9396646498B Output = 956DDA5C2BC1 Salt = 0928F9AC6112ED094DB75F319BCA52FFBB8C84CAEC3A8B2725F335D292F11443C8687F9D1865B8AA Secret = B3FCAFCD9D40D819B9544051540F0D6AA36AD4F62AF1F5A6 Label = 0F337947AB351578ACB9CB81 Output = 53F03C01C6F4A494 Salt = B1AE0E16A9C1368A354190B46249F798E12177AF0D02077F204C354AD1B24E9444AF1F18ABA5B139 Secret = ACB1A14D5A88578EEC37AC695A24D02473359346797BDDDA Label = C1C8459CF92AAC10CC3718D1 Output = A4E1AECA623D2063 Salt = 5B22D12DA79E9DCAFDC87503BBB4D29B11C844643963EA015C0759BF9AD816B72DF03609221AF92A Secret = 0D8C60DC37EF425061754565C0AD6576EC9DE83DAB76A85B Label = 66050F78A2E85A33AB3D3AF9 Output = E3048A5B78A6170C Salt = 6667DD52C470D0CC4E20879FBFA5DB0B4A883C19C31B9E99A664E29C622D934CDB4E36667CAB0136E1E9A43D226A201C284D Secret = F4C321962D6FA2E1F0216EE0B3D0692E8B844D79CB786E25 Label = B76244F7BA63146DA32CC2AD Output = FB6350F2C40FC4D41E6F Salt = B2C456919353FC6F135162706AE509A6276F52DFE9F30E970F6CD71C5909BEAD67FAAB61D5A767366E687B564A8ED13CF87E Secret = 9BA384A4F09BEF04E6332F1CB082DB05C8CF1F9333DD32B1 Label = BB878ABE3F16F49B777B7D09 Output = 2F9DEC27EABC832B89AF Salt = BCFD044D6EAEFDC4F6985394EC0806FC37CC37D0005EA29222A0BBD91FC0228E5EC1AA5C0E7303F53D9A6A3B37B3D60ABF38 Secret = FEDCCBCFFE737569776E28A87F665046FAE9A52B31ECB5D5 Label = CBC68CFEDEC4E42E80C5B549 Output = 999A8EDB603137C9FB65 Salt = B17E58F275D96E43EBBAFAEBB07333BB4687AA2DD379DC6582E590CE678694E56C1928B080D6E2DEC955906D52B2749C29D093DF7E798A4EC6317205 Secret = 52E5FCEE743C96F6E858DF91C9764C14EB0C7AECA211CAF9 Label = DB94F769539E31E9DD1D7081 Output = AB0EC0049E1F4267F2A49BDB Salt = 90647F2D22D3D1C9CCBA1F95172844E8181D7EA673A3C65C23357EDB84A8B36906E41D6094BF2F855DD2EEBC5A92925539D67479B57F2DEEE0E86548 Secret = 785A792AF368107B9858FFAFD67774A76E6B3C181902E230 Label = 6B267D6D67B12A5BCA4B2412 Output = A9A82D2AF66B25C8F385EA02 Salt = B117DCF22E14A213C5E275D0E2A0A4C3DEE039C48ADAF0A79E6254E38B6B5C1F68E46E5AF67955E4E3C325963C4C9549B21E235E6A0A1B3D3E66C2BE Secret = C9B0FC6DCB18674695B57E88F1FB4A9029359705FAA36FAC Label = 180EF5FFBE49F3F24483E00B Output = 007876CDB3BAC1F09035C982 Salt = 4BA62B15796C06A58E7614EFA9B6DCB88DD4CBE4FFCF22D6C14A1ACC3E07E35F4F019DC129E4B1E9E8F10DD19951D0E583062F32A7B599667EED5AE950E3942C065555BE7717 Secret = 9049E0BBA40CFB0D848FE818A056C5C48BFF7D468015905E Label = 8DFC171E24A176E00EF6C257 Output = A24717F17D2A35CA46D58FB4298B Salt = F8992452E3A77A38A8D7648727FFA3724B73CFA16DCBDF0C3792AEDEE0F42B7A2474FD02C2103F3F2FCFD89A9B51C1C8D2BE6B0EED7CF3278464D8F22E838F638DEC18C1208E Secret = 8F0E9D846B732C918B475B3B4BF73C96234B746450BA888C Label = 3A4A99AC130406AD0CA169EE Output = 1B2F40CF47DB0C62D223E6CF0698 Salt = 30D741E9B4889FE24BFEECF34447C577F13DEB3F7B006BD6E80213B6F0452CF512E406FC3FE006CF1AFC0EC114D9476A7167053C764A63E6D70970371D75500D28CC40D1500E Secret = 281B596E22C3AA6E2D80EBB89AFFB1B7BC8A847A2939477F Label = A5CC3F388B55475E36908C52 Output = 7E55ECF9C8B63BC7C6BEB2639122 Salt = E9707A6DE0871C72E8E18BF50F8EA2CD1CD3F371FBAB0E3A465D9B1BBC1335D6AF81575B1F69E18ACC1279368FF5703BA889044F145A4059D64024199D911C8A19C73183E8122A372E485D1A611699C8 Secret = E0FDC1B56E8D7930E9211F0BD9EDF11B1F2578932EC70C7D Label = 5B38B20625EBB12292710D09 Output = 586E59D4AA8D4867F6D1913BF03780F4 Salt = 64D7CE1A28BB0F8C0712A0197CEA3E0F0E2473B23DA3D2769CE9BA0B435EC7290BC4FF18EEC7AA5B42361208C0B083BA3E8FBEEC0360B0D327DFDE899A84466461F59320A089B40D055120A3C495BC6A Secret = 432E966EF2DE7F5B1AA71B739C1F6886FD067776E2484CF5 Label = E882B3524F3CC9F195494952 Output = 0CCA19C497F6D5E27CB7B82FA1325DF3 Salt = FF13DB88471D792F8DC4D85EB17CD1F29548B06867CE5A19C1D4CC4AD612BFA5B242ACF458897364B8C35FC2DEEE0C3EB762044AE169A6309DA90EE2C8775C6029A9EF9E42EAB98B83D5C24F3E625F36 Secret = 8A6DCA021A947B4960D81F3BD025633A78846F138CB2002A Label = D130184E31EE503E36C68F45 Output = B574687483152B0BB8E8CCEF205204D0 Salt = 0C38F69D7854ACF39D431AA701F5922FAE98BB11C4197B234FF41C487879914F0C9BDBCE84C7D1E3F608E0CA307279F2D29CF40A40D16B11DCDBF3B9D3E42C38C751E4A1277A522FCB4213DF73852BFBB1F5C82BD9052480619F Secret = 1C6DE2A295F4BD1CBC6A2C99AE366B0EBE36E5C4E060416F Label = 18394AF9F64099D33E8259B2 Output = 849E1A03FF197F4FFAC9D11A532C239257C7 Salt = 5B49C7C10F70C2A5D8519F660FB61F0298E3C648AD1F7DCA7C125629071202853A32DED2FD4913F1AD745D5AF3D0779B1B2C32250628F41005DC182DD8AAAC75ED9B38C8E9BC77FAD9D84213C9A6AFCC41C7435994D4D6366100 Secret = 8204AECA41F06E24C1A9A473B84F1E8EC861DACDD1FF9FD2 Label = 2D4679B29A352226C9283F54 Output = D741A8D7FD774B3BE52031DCFE4F66655DA1 Salt = 7468FB5DDCE37F57EF632E22A71F694048D97BBA033B8BFE725ACA2583ED107DB17256E9BD4B24791A7F9B3AD2AFD75498106CA93559D2A578128E761559BDC23F55BA8EEA75848F673A9E559A1D0F53A5102653EC6AC4B31C85 Secret = DE8A84E3B815F0C3421ACACE92EF9676B966607F595D88ED Label = 8B480800F1E3D91748A16F67 Output = A28B6400B0AB2980893E16932B3667A8203E Salt = D541AA764F6DAC29100E54031788BB5C0F26D4629F44145D9D498831584C92FE74852F35CD67B5BE21F279F7C8FC3C187BE6F296B856B16DD001CBD520555E6E3B5371466DE0578046B9A7550E024871656D4D658452D4A0885479F96B79CEBCC6E34931 Secret = CE2F64D4061A3D3310365A1C52E8805DB333D64F768D6B1C Label = 9754B8D8EF591DF604F1928A Output = 681A55C432FF0E26CFEADD88CE50A3941ABE8EE2 Salt = DAD803BC3BC2C8E22728A8E59335A76E14108BFB9A4DB7EB2520FDF5AFE7B949513050912ECA1091DF66F22ED88BBC2373698DEEBC2EC510969DD7F747FC4B3E55BF42F36ECC482A24AE9907B8E3E5943DE7C03FD44F8CD36B15CAF7EDD9137B12E3ACA3 Secret = B5C148D17EA7963C820444D6171E82D41674018E19345E14 Label = D3F738655651B4791885772E Output = B64950C775C11EE104947BE6F0B27E119ED7EF99 Salt = B7B9CA2ED4C123188C3C668207E57E50A9E170922AEBB5F8E96C3377F8F674C15A85E143753605AE0969C41EF8827477C9B939F3D0D1BB31A19900E0DB4F611B9AF2C0D9F721F1ECDEF46CBC7D558751BA7F23625AC920F1859EA19289210DF5DA206680 Secret = 6AF6B6BDB585CBE679BF1A85DA15D4E78F094D289B7FA9E4 Label = D4D4DE7F3FEC705E5FB3AFEA Output = 52B5EEEDB3FEADEB7A87C274D2D6D978784C081B [SP800-108-Counter(CMAC(AES-256))] Salt = CD361E17C2203004F8AC Secret = 4740FDE87398C154AB3079E54079566C75A061642E28DEB4338C597FF6060523 Label = 6E742D48D679B9514164AAE7 Output = 788F Salt = C02683DC630C7312644D Secret = 2DA1CAFBCFB65CB30E44A401002E2BBA4BF9547A96D108C46AB0FCDAAA7FA435 Label = C9A90CDDD6764C8E5A6BB700 Output = 0D0A Salt = 64B4D0B9E9B12D463DEF Secret = D35C2740C6FEACD810D44B4B904EF3799857920C043187B57D1BBB6D9BAC8CF4 Label = 716C62B870ED5A342EDA1172 Output = 8EB1 Salt = FE538B3969701F9A82251903D6D21D1F085350D2 Secret = 3A78CF4E1D3029D92884F69B505A23CAA00C37B7D9D1F76462848BFF37872EE1 Label = F59167C99F11BF6DFE93BBF7 Output = 95763E00 Salt = 0546B86809DD394A1A06867921D418C0376904A2 Secret = 3BC6C318C5E79C9683D3985CBBC726BE42B6103F2FEB93FFD19595362988459E Label = 1E8D590874112F882543EABA Output = 0CC99F64 Salt = 68C20175832F15C8CB127D859BC910DA10558070 Secret = 76B1BC2D6C1C919BE481CA1F3756FBABDC430AD474ECD5619553583C166EE327 Label = 642F2DB727EFD5561F4A2C04 Output = DF0CE732 Salt = 51DE4EB3E983FEABADD996FA7E3DA97C324AE23B26B4971E209C0C145390 Secret = 894E55234DE2B5C20798A1F9B437ABCB3F5AFADD0A6DAB41D632FB46C2A181FC Label = 63986E0E8D1671A18D149652 Output = B6698AB69E00 Salt = 8CB52C4464FC55F3C8FA087C0456F0F464D0D74866DED304266AF66648A8 Secret = 69120F31DE472DFB8B1E616C73F79524EC34122729E8C52609C1A45AD4825317 Label = 7B4BA0D8AD4C77255B082646 Output = 9BDBB763A0DE Salt = 841EAA0FC7E7BCAA2FA4F193BBAE458E6C430BD3D79449BA2015E8BD3AFB Secret = 3DD4FF8B2A8D67020DC1F0A48929351CDCCD44AA4643E86350ABF942B2698EDE Label = 2AE9ACCB8387DDFC35A2D0D2 Output = B5FE14ADC109 Salt = 6B9AB8A84196D5AF3511FC7ABB80A1D8A847FEDDC3426322A7538E109F18B074DA83119FA1F3EDFC Secret = 102C69C4C5D82C68DC37143F821759C2A1D87F3AB2FF6498DE0E98D7AC107C2D Label = A557CFB1273BCB7B1C6480DE Output = 57D165900D1F0E9B Salt = A32DC4F73CAFC8B6EB4DC6041E028E7D03883FCA1BB9CBD0C2E556195CB7CC208F039147179AD0C4 Secret = B8A712277B1BD53CC45F284232141B74A09D7690A50C9AD3A15AA4E67268943D Label = EA8246233876E6D69A2C025F Output = 63B001FDBD3CB92B Salt = 6F96F4B26F98845029F6D8D0439036274F0C5921E45ED4FCAEAED4BEBED116F993F0BD5C2004DB16 Secret = C6E4C09F7DB4BC916820C13F496865BD2D8C177512F51C2F04DE3A98C9D322B7 Label = 9B366117578341D780A56341 Output = 9D3F2A23D4BF8654 Salt = 2759DD8F986789338B6213AB5C4F750FEAEB6B135EE02122822F978AE3B2A9A2FE0344C944995DFF4DDF52BA157915D44F16 Secret = 5FB19FFD6C044D1CE6C58CFF9B1C66AE03CC1F81A558D5955DE8AA1608D4C263 Label = 62EA349F8D2A0125E2DCF1B1 Output = E477C68DEAC259E8C5DB Salt = C341DB776F7B43C3C58D86C529B4035E2226A88D3494CD844F35F4D177487E6A92881E80620EA6CFD4424FF41B361FAAE63B Secret = 7A48EAD098F8914CE444AF841F102FE5CEEB01AB64D82CCF3C5974DCF8069195 Label = 8AA6662E05AD2DB22BE52BF1 Output = 2F8723F02B5EDE9B829F Salt = B6F9480F8438945755FCBA50F9E82C40F62F0F89027C77673C098487161C777C31D2F424BC6E637A03C02135372E4236C086 Secret = BBF24DA06F7DDBDC012C2E782984F3C06675EFBD97F1E9BAF515B7DD76BB221F Label = E20513F3E25CDB5B7694696C Output = 99147075B21B22E7C6BA Salt = D664B007B18F3895D7A9138D0A2926F1CD9F8391CC5EA5A0A97EEE79BDE79FF4256A08378EDADB9E9B51301CED3C5F67626BBF7C77855E8F1DFF6BE4 Secret = E149D32640BC7BCED3A0B65E9DB85CF84B4AE7CAD63EC57868D9C3AC236B4256 Label = 1779ECF0411CC9EFFA107E62 Output = B1847A7E77732648737ADBDA Salt = 482C412A1533A09A374E2AA4CCA8D43A8BB2E6BF82C5F30C9ABE26D2A3DCE08DE009CEA12537547871990626DB46DB3721DCDC0305E498855CFF83C0 Secret = E0E8C67A1BC1DC66A2220B5DE2C573B94FCB7B727BA76A92A312EECE255655DA Label = 31BAA860AB6B60169C055793 Output = 6E9A56ED5F903B6B160D3523 Salt = 98B5E0F2252D570D1BF6FBDA0737DF0D9C88ABA0B3041660BAD83A961B6575A7C4B5B6B43B9B2812D64A33E773690B88A222F79080B88FB4679BAFCF Secret = 714A8F95A544C7C55DEA18A9CD69FCF57C34E3B2D6ABED602ADDEB8164737B08 Label = 1777FE42037E57DD06F66B91 Output = 9A0C348847159C9AC33FC5DF Salt = DC6100952E0FC328816F09BD3C67EE1B67C93B6C24899A4175F5EDCCEE2AD84966649D88CEC8D9C760E7712CD4ACC7E22773F70F27C9F605131005896C25D91E0C387A687FD2 Secret = 4AADB64BB7689C32F8C5AF3A7454138AD0A6730A75A057580FE67BF1EE62F3EC Label = C475ECC8FED0DF1F5DA2CCDA Output = 84E18F2464C141846CFA12397803 Salt = 177DF1A46ACF8760D77F68152785A991931020F9C70C580442FCA33CBA452FA5F2D4A549BD74C52E12E4A7EF14F1C7C8EF1AA4BB692B7DC3F1E49A8E7CB022671F19F4BB821B Secret = 2DF727295897EFF247A49D7E0F7F4BB43961E9E1ED01C129CD6C495B028959C5 Label = DC82BAD469AF590E53680ED1 Output = 545A74281D7442D59A1525141F79 Salt = 2B77C56A3605B047F4DA65133B252745340E1C8D2C1EE104700A2E10332BDE318578975FB66F61D3FF48BF8AE104ED49863BC5A05798058FD69A53579E94619B07E1057CF317 Secret = EA52FBF1E93E12F77B8C4D983DC48DD33DDA86DA5BB4CBB7115E7C1808096EA4 Label = 5608D5B363C74FEB95840E00 Output = 64B2C38D70B1EC35DB475F9309DB Salt = 95A648CA6E1762F5DA4900677E6D21831B69830E7DA1055AB54B6765B7B88A7E1583CB4157753E5496314DAB068BDF46DF0643773FB7B056F985B15A18CC3986435F0C0051867666A8273B78CD26362B Secret = 027D302CB281509C846532634DD9128B264D4E4D71AFB980D6B6AAB722C10950 Label = 6D97B1C11422A3DD719607A7 Output = 0524404AAC6D6E3FBCEE5891668578BC Salt = BB22312B761415CBA068469CD3393FE966A10C27593A01967119B3512F0FBC46A909E790C8EDDEED31087817B25C7144BA0BA9EDCA356D2D533ABAF3EF129FF81FE3C5972839CD42A01790547742DC3D Secret = E9851CE9A6724AA8E8382FE7B94A311F1EE8363A5D9B719764A2AA6B18E5B194 Label = 6F6B37541394AC44F9BE86BC Output = 451E1DBDD87C33699AFF4410F32C1B86 Salt = 9D01B7B6E778C078129884D26084F65A5C2F8E304A6C08888F9F98BB40F02C0AF48D79C4963998AC7057E7FF680B302A15FBE8D0824DEB217B96CDDE0DF6D6D76BAE240CEE2CBC3A597CFD3D733DB381 Secret = B054ABE49A5CE4F9D28C7CA0D89B21DC9F65879BDD2FB6D1A6BF4D80B10E19E2 Label = 1374E15FCEA97A638BC94E1D Output = 50966E293EEAEB6D13C6818D1AF8AD04 Salt = E5C89E7A2D86BBC56F83DA18F410E8957BF9BC67D76C9D59A03C976D8E42B0BDC48CA00B60D05D8C1A33DA43918F9A3AFCA29A8130CBFADB7D1A397881AAEBFAFCB8B263F9E5F22879A197CEABA312A02707159B942A79325878 Secret = FFB57E751E464E6731028E7A2EE7CF165081CE2A730DC28D99D8F18321E995B8 Label = 3862FF311B542526C4FD8BB1 Output = 919896CC65F8E28738ECD84859B8E9D9EDC6 Salt = 44D33F95D84219651CA4F270E4DB8223C8F3E6541B6D8472DE9956CB1552083086983397412F1F7E733691EA5795ED130FD28AF603AF3783FABD2F6955DE5F44F3F6E49315F8F03994B991758F016093F6FC36F105C839CD4A6E Secret = 81AC2C6E9750C0E7130B9F55A767E7FA6AC9CECF71659A9255FE2B3ECA3A2032 Label = BEE557B8174AA830B5ABC9EB Output = D2208A9055786E4A541CFCBD68248CD79E49 Salt = 00F49A14F08420CB2C2F312C33E4D633D1CE376191402F80635883955391E43A5886B69EB0E563B6C9A7E9E603A5BB8971572D4F0A89B45BF18137921D2C8EDE2D0C65C86761F6FF03FCB910DF1EA55DEE63D7058392FEADDD99 Secret = FE5080BB89ECBB62AE0259C19D220769F70C0E4DF480BBDF71844C38443A5B57 Label = BED2D92E64497064577950C5 Output = 5A22B09CE941FCF228560143F60B6A7BD27C Salt = 60993BF375C360C00CA54466581CEF4B380D777C6F0AB2D9D4E18C4EDB588D372905E18ECB84EF8D97550439A809EF358383690527240E3BACA88714D2B790493ED5E7F4CCAE40896A17F19A5101521F63501E29CDD8546455CA0A21E760612EC9FCE78E Secret = 2C32AF0C7A1961200A85DF39801018DF837346387B514106B68FF9350D0320E1 Label = E355613325EEAE95BF044491 Output = BD3BD6DF5EDEB374FABC68A932B81F77E0E01646 Salt = 00E7064D179B9C7AD801C9C7BEA9916ABC45A3D37A1BA818045BD3A222B2295137D741FB2F0558AF3F345AA28F315350FB13B74FA6089967B5D02803865D34887A49EF135BC2755548BAA1E27E540C0678DAD2976533BCE90F977476EB44354C99A052FC Secret = 06C29E792352EE8CAED9062F4A6C50797D115AFA5BE0FD3F3DC09328D95C7C57 Label = BCBC2FD762757EAE951FCE01 Output = EBA167B649F89A6DF5127A3A06C1956F21A4A9DB Salt = 67526FD56A8E31DC0F77C6BADC2E880A13D7B2A184A5B5D08B98327C6850D09C5BF7BF0FE73E870A22AAE23B5117CD5F3EF2AF7D472CB28CC61E3994A51610C8F0E1644C1CACCEED1F44BECDEAFF4D431BB2BDAD4CBCBC659FE06A7FC929BB5CFD382043 Secret = BAD7C5205A5365E663421BDE9CF2FFAB61400A7AD378FEE95C8BB44D465C7567 Label = F33E5766E3EE83AC7CB4ED90 Output = 832A3375C298151C5F8D15284A3431710513AC89 [SP800-108-Counter(CMAC(TripleDES))] Salt = A6A85FB8FA219289AA53 Secret = BDF778CD90D74AF1F0944611CD1A1C2976CC6E159284C0F5 Label = 068C39D69699921A8DC35B3E Output = 63EF Salt = 4328CA4227BCC798EA69 Secret = 1DCC7FBA4AE555A3FFDAA096DA7BD663E6E8CD75328E0A5E Label = 0BA37F224BDCC2A63C52C672 Output = 83D6 Salt = 86C8A52CB7D8CC87FC88 Secret = 516BFC3B32FE8DAF120FB1C91240FE440468186AE257005E Label = 0A88062DFE588A6841F38B36 Output = 1C98 Salt = 7E678E30E3F6F402A2E6856B8D5EE0264497B204 Secret = DD731EC3412CAF0AF2FEA6F714C093063ADAE99D40C329D2 Label = 3BA55F3C6CF70556E74E01CF Output = 4E252005 Salt = 5288159C667EAC7ACB2C52C68AF531D0F4FD3813 Secret = 25870418F29AC8B3C5AF2B0F51FBD495D9B0DCAA03E4BE92 Label = 6A6513E9B2B42236545E0680 Output = 201DA27E Salt = A3C74A4AE1CDF84AE435EA8F1CE7C253620550F3 Secret = BC4A5F5CDC11090F539C5C4E7D5D0EFEB3E80E25E6C3F673 Label = F22D967E44DD4712B7FD74A8 Output = A6291C7F Salt = E8BFDF2E2D50129E1327D8DE985F5C4A47BCD596F9045F67049EF351A55C Secret = 1DFE18D3882F8729C64E9B96DB859767A1379DB559E26AF1 Label = 5D8E6FF10833BECD9A2C772C Output = 4B57E2DCB015 Salt = A2424BD9B7A1D67D06213A650A836351BC3300B992764FF8665E22167B60 Secret = 627E382A51DA40A2D6B9C7BED795C8D15BF54DDADB192514 Label = 2156A54626E31B4456C3FF54 Output = 6038BA030D96 Salt = 60AD8774BB17DB96BD05C1A60A655A167BA15D0792614D27B54F8F82904D Secret = EF1E75D42A7FE359CDE5980BDB2267D9D5B243969BBD8186 Label = 8414B76ED3474E982962E90F Output = 27DC49C0BDFA Salt = 2E454478314FCC803BEAB3ED1D935EADBCBE0D7802A12AC527BB6FD933D48C9B5C36B1C53F8B0812 Secret = F22E26787944EBE49A6E27D6BCC5600DC877472CB624DBDF Label = 96845D7E281948833F29E459 Output = 2D815BFE982257C5 Salt = EE2CE3B1B082A35ABF79E71C1F9C75F3238A8EBA3EE223A908882F0BF8B613DA297BE902C04B9577 Secret = ECD1C68673F82FBB995040873A660555077CBC7B17E0C1CF Label = C740FB926BB57C44D6C2F16E Output = 8BA27B481546225F Salt = F0EBFE6941829592EABD8A71857488B35ED5D93E7D8CF93D371DE97EA2C1898B3054D7D649CC3EB1 Secret = 6BC8169CA6CA3C64EF552D6B546FE4A57DDD0C54503D6F01 Label = 3878B318640EE4758718EAE9 Output = 03F2749C12DEF11B Salt = 6E205888864D6804694FED896157433532AF86088911BBE76E3E239557677777348F0943AA90A89E86BD54A78A75079BE31E Secret = 1391FD1B057CFAEDD009179B6B5E0F8710E4BD18BC01528A Label = 298D6F0D47A3D6C505A0A4C3 Output = 3E863174AAAFD3BFA855 Salt = 6F242BBF2EAC721E34337289CD9646548C628C61A95EB68CB91D95DFC7140216D415072754E1DFE8AC322EE0B9BC20A93067 Secret = 4E7D10E28486DCEECF67E1ED0B4CF9F2093DEDABAD7D2826 Label = BD8A75236836A8FCCCB7C471 Output = AD84915869B203556E2F Salt = 6E30D7D659FC084E95B1BC3726AC242D7A21C1DC355FF44EEF3EFF71A7D5CCDF6F857F9F931A6296CC2D2250E94CBE9CBB3B Secret = 21FFE0455137C46A0AC0EA14280CC89EB333D84CF1AECB97 Label = 74AF3408E30516917EA77612 Output = BE19097607F2F8A47200 Salt = 61345155587D925DEF3A307E37A27F707B655FA958AAE69D8E4CF49370BD05FF7412C1AEEB754487DC82A3740A772B611E456B544D53453B61720325 Secret = DA5A847BA7C8DB881F1019D76674FE3EF30526FA3DDD5C42 Label = 42FD3EB3E17B8661AE3CE858 Output = 8FE27E4E0196A2EBADDA302E Salt = 3F8726D71E4F218EC56A18E886309228C5C05B7BC4E8C16874210900F15B46E888756D0D4ADE1A1DF5B9B2D3862EE7D20D94CA2D12AB4FF4DA72478B Secret = B4C06A341B185C252A41C331028DF57ABBA75457CAD49678 Label = 99A17A32CC54C51221D7D2B6 Output = EDE60A7709A16742FC4101FD Salt = B9E16129A7DB58FDFE6B23F7CAA4809BEB00F5DB54F4616604DBA2DD48CA854682AC11D4AA0535D7E5523ED0ABF01B05B1A91A2F719DDE8DC0CB2AF0 Secret = AA584848007C4A2C58FF11B9C6FD6F7D18694D09FB0337CD Label = 57E21B0EE6FAA71A74BA086A Output = F8A7457360D3D6C6AF1F0D9A Salt = AC331E74C425188CE0943E90FBD0A4C78C044C80ACCCC3602C3C5C66895C0148F94687F1B6748B404F7D63AC319544484E865968ED6472D921F3E487CAEA6B462EE21C1E1313 Secret = BA189F9AE1093FA4C391CDF5F58B9B1AC6889466DB32929D Label = 0AAB5E7B34886149C86DD182 Output = 720D0127308139778947FAE4F66C Salt = 3957A0F02BBC8BE50A766A99A493026ABE0850C2FF83F5A882ADDF1848FFA342BBB6AEB974180B0C02DD00ADF0474E3AC02EAC91EB46A04A1C5B3D20B77E8E6E78B073D33930 Secret = 7BBF77576C3863E611FDB26CD46D9C71A2F5DFE1B5FF33FB Label = 9D1516D1C49A3D24FA78222D Output = 0984E05F40A85A12657303654D1A Salt = 99C27C99505064DD01829AAF548813FA20E64B06003C3A60761AB5652469F3CB2094060E4ECB8F74A206B167D8B2A24ADFE0929C9F4E24A5DE91D1D44923FC38EE12DD98DC48 Secret = 0982CF5441C981925F019280098C1A7FCF03B3C2461747B2 Label = 87BAC4B204E1B37B30D94C70 Output = 470C13C7604E61AB59242A67564B Salt = DA9C793791B62DBCBEFD81A09E02B84C33D0DBAA7645E3EE8A610077308542484D83C3767A2B494B83D6767337847D9A8E0F7DFD8CC9E47D5F5BA8004C8EB8D38166D6AF2CB61CFD57420A23B41C40CE Secret = 9F356C89A06257C9816763D47DE2B4F0C122963FA9CB667D Label = 3CF8F4F4E1DE90080D39EFDF Output = E8C741ABFD54EC531BA520975CAEB453 Salt = 15826390BCAD45A314DF53420433ED7E6964D109B95F936A8F82322B5FBC619AE9E58406E53B091CAC86212D04952F8929074BD60ADAE700C689790ED2D54C6B77E5A41028AD77FA8376C334A22FE979 Secret = 8A6E2BE368BC5021261B622B30BC4520D93D365464328473 Label = 5BE64C27B392ABD911BE532F Output = BC149FAE8481C96AEB664FBC01702197 Salt = 3044DFBAA3DC7A37810BFEC2AEAF2F5FD9F6A0573FD4B7A8608E42A64F8F4111BE1B33B40261297D8909F9B5091B87BD28F5F5F638B687F2C8C3B306B94A3DD53E12CCE32B917321209E0F860EF44492 Secret = 148884186A95DD8B8557AFE89AF1956361FC70B7B3C77D3D Label = A8F2F03B734A520A68EF94D7 Output = E530AF9DAD15E5503BEA1C6E60E917D8 Salt = 59549DB0CA2ABF65F8ACE00180486DE7A370F40B822F84C10CAE2F6570EB669E29F85CC8826BBCCE2D0723BA51AD79CC013AF9A69C024D19334341B40705A8B570DA8F12461A8A528B13889DE0A1DD30E2A5C985E8055CD07FA2 Secret = 3DEA759AB87B754B2B5189E08F09600D3261ADF445011788 Label = 18259648274DDAE7DD2BEB39 Output = 5B337625BA1E8D7AB17192B478EADBCDF916 Salt = 92FA5039BA20F507F950B52ADE485CAEA23B57B068EDA002C02C7B7D58937828691CBA0B194A1BCA110C1D5B5355A64BACE79CFA690F818B7B2331B0241A604388CF55BE79357FF8ECA47E547ED6AED363BA847F0F4AEBB2DE0F Secret = 3B2D865CA642E4064B5004B00314CB182B2CDE0DCC438F03 Label = AEA3EB9AA50CB4950F342AF4 Output = 3EDD883B5CFE0E5C82757FBBF3286CDFBCE0 Salt = BDDE9EB1DC96380C562A7485C078806577DB60F0FBF2C800FD2A385BDE059EF1FD77308608CB3434962EE59899124190BFE7301E4D270595B356FB3ECBFB97C52DE23FE3EE54C0797FF6DC28F563794A186843E301F3AF321F0B Secret = E9FE934BAD59C23AC806FDDEB0F15BF459B7FC4DCE77BC1D Label = A9CD6C999166F68135F009E5 Output = 64B4325B0EFA6BB8B9B233D49383F6BB1933 Salt = 6040D79D1CFB9E34568AF6354CE68A52B0C3B57CB0172AF7F7BD95479F88A168D3BF83A0CE5BB875D9EB9DAAE8B46BA24776BB199056F73AC246EB3D59DDB0295CE93DB3DCF2B3C9B5035A3D6FC9C9DB041E5E6B6B00DAA99CF573335269D5AFEF9966D8 Secret = 311D92B09F64BE1BBF368D6422CE2EEDB1C7AB4B1C7A1A2A Label = 8C7762B0961458F959D03D6F Output = 35642BCC467174AB76795970B75E9BD5A4CAF06C Salt = 83E7CDEB8181238BE8E487999D48DE22F1A36746B3763380B848F1FE87199FD12E917F24151D9B0FFEC9825CFC26E2EF1BE3895581046AB84A9E57C53FC7F0138F107D72E7CCB6073D027925CDD2235F658879098453AC403FEA8FA5E273048F835B56CE Secret = A2760D029741C6715CB2D3347C2567123709706765E5F29D Label = D8FA20061ABA9E9F10D93DB1 Output = 758B0E239A3ECD6BC82391FA1D6F69E9B0381BB2 Salt = A73D83957A2431F455172415D2A8C9B5710CFD89C0A378F422ED1B1FB56F6DDADF14313CFA6419B24338AE017A135C1AB6CBC2D29D3F1D63ECEE67BBDCCE0504D86B7A69C9C06AE481BD2C7E1D310C671B255214932706C1AAB830B76C82CC16B9E7B465 Secret = 37FD2AF3B56B09CFB562BED2384A6CCC852BA0180384DC28 Label = 4578AB16CB1FDE0D34032F59 Output = 0188BF34FF6147D7959059C33A4FE8CE8BFDFCFB botan-2.4.0/src/tests/data/kdf/sp800_108_fb.vec000066400000000000000000002236661322470703100206540ustar00rootroot00000000000000# Test vectors generated with BouncyCastle [SP800-108-Feedback(HMAC(SHA-160))] Salt = 0976FDEC7817D94D60C4E0C9091D82E38BCFC58D7FFF0829A13D1B4455B8 Secret = E6EA4E4F7178A81230A01DA05705B9C8B902121B Label = 37935CBAE5F5B003398F8E3F Output = 1092 Salt = 614E4B95FAA64CBE30CE47D9C426536A54F62E51D5909F8216204075516F Secret = 5B5E2C32E98F06AA4868EEC0EC18D53904DC0C05 Label = 6EE961F615859CA0AAE6ACE0 Output = 419A Salt = 46402D8C205C356E9A09755ADC2BF243B55B14424B64DB419E0CEB22C211 Secret = 6611CF92C30689B302B190A7B720359A6F79AF93 Label = C1E9241EE2203B12CE1147BE Output = 5E6F Salt = 7076D22CA13A7779832FB764C0CBE278213ACF3A2F2CEDDFCFFA2243749C2170F3646A6D5FD6BEA3 Secret = 11EB3B1B4524BA22BE88FC4E3D47F2569F60931B Label = 5F8EEF37E520ABE310EC379F Output = 3E0CD40B Salt = BE46D5C76B85BE996709542FA9AA60CDDA3FE99899082B537E8BF556510AD4ABD3B1434FF5D9F63D Secret = E15D0504DD1DDB7EA92FF4301F969C1C0B4D07D9 Label = 79A4DEFDFA613F5C29A35C7D Output = 3BD4D1A8 Salt = F07A118615CEFF373C3723AB16061DD95C6D535B670768966E152A97961424BD5A15AFF1748836E0 Secret = 0B63ADE140256933576AFC161D8CDBE5B62F90B4 Label = EA0FBBD5833377DA154AAD39 Output = 286D69BD Salt = 0CB7AAFC183A43296EB6BA49D8DC4D17A46683C6DCC14455CDDECEDF969A2E172318532B9F2BA7F7A71E7F294E9E32EB1C02 Secret = 68FD8E6F60FA14E9D23FA9C5198E4842103DE282 Label = 08092ED5B72B8E2931DBC3F1 Output = 9599CF589F86 Salt = C5B4ED1D8603C07AC416ECDF7EC8C709C54899A15235577ED94F4CB627E2F858E419C39DA77A293B5BB815A117212054D6F9 Secret = 4EC193CBA4D5ADF08466BB945C216F0E1FCF6F37 Label = C3598AD3C2217647BCBFC340 Output = 9FA6918B4224 Salt = 91E6B34FF9C1E0C1CDE062976AD768EDCD35EC9DB7C0620E41E5497A4093BB6E66AF0BC5952518BB92ED51257FDB3CE4690F Secret = 58C0869FC5F88513E3429FD9A0DB3416737BE168 Label = EB9A545FFB6F80101F8CB9C5 Output = 859FBD00DD03 Salt = A69B2B585CCD4D10CCEE0DD03019F7C35E201648BA0E1F32A0671725934E387454DAB8B0DE1D53F8950EBBCD47D4F363586907C0EB49645E8F9942C0 Secret = 8D033EC3109840AD29B34F250CAADCF3FF22C462 Label = 9B77FD0C6D30231AF1FDAD2A Output = BF1398D5D6196C19 Salt = 0F0B5F366E44ACACD3E916D960FA2B8CCE73A04749E99F73A09D8A17EAA9B296374F9C4BF8B048F662416D71BD1B5EF16C00FF8532C875F15340B46E Secret = A58635ED67CDA2A469C3303094007ABCBBD8CCB3 Label = 5B3C144F7FE251FDEA82F655 Output = CC7AA19EDCC29BAF Salt = 35617EBD57AA2B022D095C757404B22CAA590FD195E86480F8872B6123EE269FF48ACDB531048E46F03EC6E7005D65F659E555C565CC810639CEECFF Secret = 625EFAB9CE5F86D9D9CBE2F0B6E7C877F44B8227 Label = 3B20560EFE6C30FB8E4CB0CA Output = 73FE2A56CC343BC1 Salt = 13B0942F024F57196435748E4C6FB6ACF9778F96D5324B7A9D3729FB59B45A8225FFCA9492A887F34E772A7B82834129CF1981C6AB2F57B1AC07FB719A05B0A9F02CA7FD2C01 Secret = E0ECAFDC43D9929CCDBCA1814EFA9724ECE2E688 Label = A6748C86A08C314E950D971D Output = 2E284193244CD30FE59E Salt = 1252425DF02484520E0A9DB6B419AD8FF0D2E11D9AB0327193B21BA4131014C5B617D6EEC37D4CBEA3834A7C20A30BB42569B85A565D66430253F2E360FC5673D84444FB8C43 Secret = 755850C67A397993E9620173CA61F4CA07E42E3E Label = 2C54C446DE5E9EA72BA1C1BD Output = 376FE7404EF48F344EC6 Salt = A11F67881A9880CCECD72DCFB8D694D053043809E4ADCEE6F2A456518EEAED73A23CC7F2B4012F62443256F677F433B31AF05257EB5328102A8571D8E456DF020127705A3E45 Secret = 2BF61E216369818182C03D4E408BB2F887D12C83 Label = 776AF03F572261EFB8D8C016 Output = 5F639414FED8C8B480FA Salt = F3B2BCC3B64D0474BC47C982D2AE31CBB496C0E3CC786989495EE8355D177935623D54713C0C1AA1F960E2ED3D31D5AB36F06343FA43143F9D8C94D495EECC1614C9DA11DC9AD9B4E8482ADFA29D6C7A Secret = CA6CDC9C6BA78C86FEE5CE4E3C0805C49DB769BD Label = 368B4457D550F0F830930433 Output = F5D83B5FDD52B22783A90734 Salt = 43843866832A7852A4C6D0687CEA925054EF1907ACF84828E4F2696F7FD22ED4AE5B607AE7DD56A0DAA30044D4826D8A33B69FD12B3CAF37E9EAA59C106092A0D6FD35918A250CFEBDE372317E73BF48 Secret = 13439258417DBCEC57C695B7C6A84D7C7A57BBD3 Label = B29723DDEDD32CD2C0F98A43 Output = A40EBE7162CFB10E981A3694 Salt = A91CE9C04DDFA72172CA30397A6814E8ACD7391F9A0C3C0EDE037438DB10870D82C4031CDB2FD8E572A26F934DC7974BA22B37EB5BACA7E261D1107B01C296D39E8D346D1ED42F2944AA609B464EE43A Secret = DCF40415D3952F945C36FAA496CAA41B7E0C92B8 Label = 61AA4706D8D66C2D2A96E8A5 Output = E59B19D9C36A49AA41A92864 Salt = A58097C9D797CD0E188AA4C7D9F9C9BA4E33DBA320259A921B3073F22D64B1A98ECE0CB9C0E350F454026A0B912BC987DB54B0FEE65348781E0BD99CFE1659D7CCB76B7399AB0C6B6EA37754CC44F31D7EC32F0611A531FADD31 Secret = E1009D2DFBA5F534C48E211DF4FD547D6A4825CA Label = F8516216D86EBB3DEF878B23 Output = 0BDFBB22A0D5BB15C6B40AA6A4EE Salt = 4B42322398163EE56486E24AA5C5492AB999DCBE4D2D3F55B1ED114B37236F3BB72754241A4F60DBD93C3A000EB291BBE7DEE18DC945336F7A8C385BBCD9895B6009BFEA8C78861785A3E55CEFE3E345BE55C7F0DF259AA902C4 Secret = CB5CE7783D8CCDE6D2A79ED5641B18C380D9D4B6 Label = D82E93DCEC7EDDE1536312A7 Output = 168661343D412DA621FE1C175992 Salt = 4F76BF0D6EF9AF1792AD50F4761CB0AF1070D6AE0C58E6D1B7B7A14092A70CFCC63510F2DDD9CD5CE0E5902A8D99944F51556CE61BCF8BA89FE83A80B15FC38251CCBB9AC563FE34075C73AC1F19C13C3D68C208859686339793 Secret = 555472B54A97E35B1CE86D633C861F688658E7C9 Label = 1DFBE51F30380F3AF46A798C Output = E8849D82021591C19459D7A81347 Salt = 927ADF41244814216739B751DB16C1C43A0C0A9616171DBDAA72046B1AE6256D40D58C671C5B34BACB0D1E4D8A619DECE3779499AADA32A01A8ACE1593EF19453A1513E15EDD6E07206A87CE40D500565F582634A59B538708C86F2D21376FA0DF80FDE7 Secret = FF41A4DA3195C9A14803C9E7A4E334C6290665D1 Label = 6EF96F422708EB07A65FAB96 Output = 99B1311043BBCCCE2C2989B82376DB86 Salt = A37486353C351869D0777311F016FB35924D194446858A70ECC437470D52667F362B1B7815036E81D1105EDBE93FB5DAC31C5C5CCCB8ACC6198C720B1CC8E23C67C8E6D31295C54BE2C75B554C0F0CA5FD3D9492B2E2190759E22F133936E46E1B93D6D0 Secret = 8B45AD68C2FB907DE13AD8E06AD208D90000FEEF Label = D60A73584844D4F6CA0AA998 Output = 39283A8C0BAE3E6F6E05695FAEC3F45C Salt = C17533C9C9E343BABF1C6F41763E0F1ADA24D39EE9CFAE9441A1879A82B27D2B3D8A1F4E7AA6C434777147C515DCDF389352744E012E4D2E2AF8EEC8B491C8D7F03460DA3AADF6C8A32EF1C6E0837A7AADE8D3F89E738759CD39FF6C5781EB40B2469073 Secret = F630E2005E2DFBEAF7B50C25AB8138AC83930D9E Label = 28DD67883135490B227BDD73 Output = 46A0A494750CB338376ECC6110274FB6 Salt = DD75DD867EF7A573CC5AE41EEA2B5AD127AD2657A796DB7AD1C1BA112A5FE73B08341776EE04FAA748455B6BE038BCB45A456CA17FE72ACE23B8EFD8E3A593858B93FB282A1624C9FF12885513DB00F7B9D754A083D6984A2538A975B327C73CCA0CB76800DD9771D173CE6512C4 Secret = 7B5315E2831B7055352E8719F4D4F8C7E561E4A2 Label = 83809DE8F6A8D4299489E347 Output = 56A185C640E89C7D688D2DCFAF884B2FCF95 Salt = 84DE71E8BD057DCFEAE643B858014A658E8AAABEEFCCDCD2C81E0117D8561CDD766C9355BD0A5ACC8754A6D50DC74603FB251958B90FB099ED0F40C8CA0F64E22FADACB1CD7401A8054E42CBA44AFDAC5852868682934B991BFF27C5AECBDC325A736EAA425D254ABFE75A7BC263 Secret = 672F0D36E84CCB8AD7214427B7FEF9594DB6B220 Label = 5B7FF3E53B93D2929E8C69E3 Output = 568F347C19BAC50F0C6743DE8F38A0B52486 Salt = C906B67559380433E752BC6FFEF6523D8755A2113FFFD54940D1D9CEFD293D9A3873C0095AE0217BE6B14EBFBC8AB823497B0615F554C2924D8276F48F7AD0FD48A9E383D1E2134564B526D84E51BAF6A8DC852B1D8ECA936DEE4CEF1E23E803EA11EA6E9F356CCC53868CFA6E79 Secret = C9819DB28D48D732C70C8FD9BD2B07C0E876329D Label = 0A4210CF67CD0368A77A979B Output = A0DCE35B9ACB90955B462213822D57CA5B2A Salt = 314F85D1E8BFA91F2419B25CCA0EAEB58A6E77244B20FEDCF458B6656CD0E67DA2E417151DCFAAD5946EFC97924C89C9BE7FEA6AC66E7AF8D165DF9C252BFA0F0D00F8850CA49177A0CCBEAC1F0818ED8D1D7AEA7455C608B22771A18F1A7A9974FD4B1BCC7641C404CE650A737DDC759232B662E2AF403A Secret = 3B674A2DB34DDFFBA29091A0AD3077C9DD4CC245 Label = FA9877411DF9BBA2B96706EA Output = 4371D87E4A58F982AFDFB70DC632ED620D76F14D Salt = DCA39AD4CB69CB55B95F5D46AB0CEF077B8770B1D39817B4F90BD20053E25E57A15F42FBE27E34A9440148911887B6F5F344681F3E18AF8A70663B9842BAADF9A526E77832388FF68ACB4A1A8E309404A3586613F91C470A7C3073C8DB711903A81041CE437A02AE2F83BADE5A94B15474DFD854F7480944 Secret = 1B41C4689C521FC70386F07E7AD2C765E0CE8DDE Label = 30F648C16E52BFB2A134D1F8 Output = F5FE75B2C2C66490CCAB8E684D42A7EF9C7A6C54 Salt = A6B31A1DE253894DFAFB28853F7707913467F0855E8AE5F38D5AE7D2A23B46294D322AB511390CF807293CD06F8D05DC3162F77FB198FAB18616EFC57F6E7844556322B8A03E1F2C5E1C700D6F90ABAC58C035ACC1C9843B4D60AF4DC9294942D4CD52AA5E2C638C78A5063F082B4648C9386195F7775EFD Secret = 1A2A3B280D3246257CA683C5A267032BFEBE936E Label = B686D252600420228DB788A9 Output = BC1729FEBC2B31F685DF5A12E1D00DC88E39FF44 [SP800-108-Feedback(HMAC(SHA-256))] Salt = 8BA32A09224E2BA61EADFE345E3978950895F605E73867946DD1175CC836421B6318D9E6384ABE5F323E Secret = A7C84831ED751469D67BD1341502F8D9CEA242F22B603A82B82E5F04124E14D0 Label = E7EAFC5B1FAEA3AC16E3B0B7 Output = AE76 Salt = 64BE18CCB62BD293F824DA34D95E27E2B0C6C48259F951A1512AD18AB5AE8953971DA0347B6E9BEC3AA1 Secret = 314F3948506EB6A1F3B2E4D7735DD679094AAA8523BC18F4433C4D4C56B83095 Label = A8BC2B363B51FF728174D926 Output = 1628 Salt = 2826F4D21FD8E45D342FD9F076004146CED512DB46C053FD057394C8C3A9E6A768C17246F9E73F221A14 Secret = DCBCB03E733FCF9D797C363C93E507CB49714CC96A943E9E3A7FE97DE3AF30A0 Label = A07BDD468AF3C087D74AC4A0 Output = 9E15 Salt = A0AB5B5844178624550285BA2836724D4E6FC1B636744FB6133229C6E6FA2B9F7019C075B91A85D069D7E5E74F22F76AC466A233 Secret = FA25E1934DFC6E1FBAA58834A33AC50CADB824A61E4FDD2158B37077874EBD03 Label = 80E4A4E5DA549E535C2C8D90 Output = BCDB8EA7 Salt = 78928579A5223313EB347915EFC7FEDA657A6EEECB83EAFA63A13CFF6B253977E4BB563E09D549EE616F3C52EDCE6CB574AA6577 Secret = 2A14356728AF81AB32542A8C787F4124A305E011A2D0754702EA2A7767F58093 Label = 8A8AA3AF09CC4F296B913DC7 Output = 2E282D86 Salt = F842FA438AD547D59CA86A12537220E7CF869D3FEECE55183EBFBDD90D32494EE22D32E41A78EA738506CE7736B5C597C0BD1BA3 Secret = C67A07587FA4E362E11B7B623679B160AA65435E5EC0B7DC0E73D22E613EDF89 Label = 98B73487EBCD07E71877CEF2 Output = FE37BDA2 Salt = 6488425FCCAC6E28EE44029CA1698C09FA240200E446EAE74212267D2525E9E3A300C49D8B98EEFE3940FDC9998848E8B0569A540304020DEFFEA989BEC1 Secret = 8B739BB4A7F84DF68527D7DF41CCBAE180A76153DB8994E4F3349EB6D216A400 Label = 13F62EF70FE1BA3E264DE948 Output = 77CF464B9F97 Salt = D623D6FCAD0D1E5CF81AACF12F3CA288E7256DF713C8F68B0AA6719460B7055CF71E63FE0F775C2BCBF4265C4190A8D19E2D020C7238548B1052DFF8F77D Secret = CA4347997DF86A766F17A5ADA44C937F0BD121E132DEA47E6E2A686A04E71603 Label = 1BF99C6651FDBC968E119584 Output = 3F974476C20B Salt = 947376F71E1E9525C80EFB07D7014219FA6ABE4FBE37397D22BD683DFC0FC9B7EA615E3F28688AEC955F14D64E7941EEF2E07BF11DCF7E46445CB9A41844 Secret = E8C87BF381EA347188F0392546800959BCF6D85243BBC0E3CA8102349883A6D9 Label = D402969A596B8EA8099A7937 Output = AE22D3157BB4 Salt = ACB78D432A8177174C93D2524427B216C9FDB6077C092EAD519415C3B5B190A4AC0971BD40A5FA2504411139B5F247A6615FAF6300B0993034B4F11482760100B5F02C9B5DE9D1CB Secret = AA26645831D5E8C289537EF0ABF83CD20105CC74915A4A40B4CE87FEFDD9FC76 Label = 2DF6BF21F802F2E3BCABCC93 Output = 34F73AA9A33782AE Salt = 93B55045D45E052A4EED0B9A89C1EAFC925795DB89126A684BE3BEA44BC8EBDDF38D650A983F712B0D2DBAD1E16297CFA2B4C057A95D890EAE948C77FC2F27D8C359BD1B74D6AF59 Secret = 89D98440A2BC1F775479115675566FBCFA067543A8DC0FD41D125D6A727787F1 Label = BB0AB23EABCAA7C9F8394D89 Output = C4EE826213803355 Salt = DEB09C953940149B6432089005CF096AC8DB2AF5DB0D7F7C1F86774388C72F0FEA6DDD5719C511CD8D97EEE267AA7AF1C170B5BE186F457DE3722DFEFFD1378B12753DAD1262844B Secret = A736FE06C81A868D09388C87432EA74972EAD388EE048C18ECD378956F3B1BC1 Label = A188CA3CD703F649AD1DBC34 Output = 1622B368B0D5ECC0 Salt = 5A9EDB68211505D4B75214FECBC956017C5D382A61A8EECA4646852807039838DEDB4A112AB53E34716FFBBFC54F9B2AAC0F7595CE0945E1CE3FE847FD2D5F12DC66DAADF2482A6C57F39B735F0364C075E5 Secret = 045FEE41E9EE0E27276B29E41DC0195D076F924C63D01B3492AD91C8FA194FE1 Label = 6BE32C52C44103269F2ED704 Output = F793D3D6A178356891B9 Salt = 4BCFD0FD258DFA49C9EFE8184CB5C96E02C2BED0041319336EE9F40C7B558186733DA433AF7C887B05A02E07536D3D80254BEB9F39A32D1BB732CC9CF9C71F3E4DB1BFE34FA9F62055E83F665BD718535CA4 Secret = E3FCE9D45422CBB2EBC254BF9181E5C6C677C838C0A36D3A537A05ADA4A01A85 Label = DE23DBA819A0C86E13E17526 Output = 44B8B6E419AED8505DFB Salt = EE8789D3D023978AF25F80091F3E0E82897C3490A7EC53821D26306C8BCB29B62AB13C44A410D06DF098199A1379A9748F873B333F991739F64AB575B6D124057592881B4DFCE7668299E16D8A32DF7E5547 Secret = 91748FAA61343EEE85154E9F4E4ED134648AE5EE3FF25EB425F3AC85A1E78DA6 Label = 550905AA6458BBDCF2D9FEB0 Output = 8018DC8A756986D0A7C1 Salt = 62EAC17784D9D4BF0FBB5C4754D184FD9C5DCC6CC86DA259630B64E1D9C9F522E4409644CD5D67F4E28A466609EF98D5AB450B0DE65BFE388F62085330662BC8DFFEA29E0D4EFDB91D2D36B0F3FF3628DAE2EE5EB0EE08786585E226 Secret = 97C151EF6E40CE0677D8B66DF0FADB13A9903EAE1347899E4C7489F9921F6E30 Label = 93D9D2B66A73FFF00D393D1B Output = 32468E9F15EA0A7A047B8978 Salt = 8686CBDBFC8342BA6A2034AE03AE9F7B25DF25659431CD9CDF518FB4243E8B3D6F6496EB23CA2B4A7C88A979905AB19950E70199201A76CA55DAFB63FA60BFA3455F318DEB9BC56423AB25FA5076FEA9FEE93881916278FC414B8342 Secret = 5E0D80E40D9101C86D6688DFFD01C2E28821963B3A167114FE65D9D202A4FD95 Label = 69D3E3AC879514ED5F470354 Output = 91E56A82155FC1174DFB0537 Salt = 491EEC0D7C1521A123F2AF2BD1EDDAEAD981F004F53E3658135B2742973E5CD55F76793617096FE8F9B3F306CF732F547127E1DF9D1276E931BB72DF1D19C3DE991094BF68A59190C4232DBF89D5AF9C7BE8563AA81DD2F4E6D5AA1E Secret = CAC51ADB3A9BC8E507315F9C8FDC1277818F375FED324C4AE3A84489F003A0C6 Label = 50E3D3615038DB5E6717DD33 Output = D505BB621AA57B3C5BC33677 Salt = B94F1E80F418E49E4599EE8E5D6389F7A1C0FA3F6BCE1CC64EB27CBA5D722722A4130365488F363AEB0FA02322FD1A34DB1052BF39AC57CB6796C8BF910A020D8B1B0149E7DD9C5C8425EBBB17A238ABB2ACAD9C2885E1EE5F8C8959870ED20B13FB2470F083 Secret = F4C431F66AB4A3B8F11D156C56C6D19F052A530DA4724C7131C5958069B8FBCA Label = D6ACD12B49D11A0BEF549F9C Output = 604E14315BF393A6873ED0FD7D2C Salt = 9F02990268F6C049B87A9F1C561BCFEB85711B4A44939F4033338F10CED0A61FA3DEE1CB9CAD4714F07F8D3AFDFBA0DD64AEA1341117563E64A4C81FDF6F4D7FDC60544F049048B198EFDD6D88222FC55347B10A615D91E789C9E5BDFAF6B3B3177B2AE593C2 Secret = 9F7D0D983F64BAE11869C108EB0F195A1EDAAA176B410B634B9CF5900214A4CC Label = 28C878072B35C381D33D5AA3 Output = 4895A1E8940F153C6FA8B82AB5C6 Salt = 1998365EF45E76BBAD70B3DC6E5F9AFF3853C1C4B12D2BA8BE6E8570575D6F1AD0EC74ECB85324E70EBB05C255641D3FC9850898638AFB766D0A5780B2D928A99370395CC2EB8CED6B45DEE14851286E765B177C6296C8F5D68215D39E1F268412D23C325F1A Secret = E8366E26D0805B98E478618D6346F9A3396BC16EC63C2AF92B9C943B66EA8664 Label = 35ADC47120E81F0B5ACCDF59 Output = 429F061FAF71A3FD96D8731B0B42 Salt = D7BCB82F08E27C7B20CE4B115EC664F0F25DA6495D7791A8764B4CAFD37209095E79EEDD6D7D30551B4F959A19CA74BA661F6B861E18DA05C17669302B2B05F2C9B0E64861DE0EB21F74396BB6B33741B8A882B81AC3AC0C920E7246AA29ED850A1A944DB98A8849C4D913F8170C2A37 Secret = 9233AA72F96935CA8AA997DAB687BF1376C08C82FB789A5E497645B11904F3CA Label = 601374C874709390EDD82456 Output = 760BBC6A3A120C3AE316A4E151BE3C4A Salt = 183406C9AC3ABF852E30B00E1438F46022834F84A93B4DA8BF3174F1E8525FB210BC6B27827F837BD0A798792325B129A47B85CD2207893D14BA01457CAD6914869FB4AB19C20EA3066948DBFE0FF0D66DB434B6602D38B8DF6F60E6A234A3ECDFA24DBDD85F7886ACF1138943205903 Secret = F572E72E6A97B6E9E2B0418B4C0192A200177BC8135D9BDF444AC8C32A898B24 Label = 2FED8059DF07D537C363DDD5 Output = 28534C9036AA9AB1310C687B0874A1C1 Salt = 8EC8E678EA5C45F48F06C7F84BAFA9A1E86BBD20180A18E3BB7154073D7B27B42E460D07165593B2F430C1E6A6CD96C2E08DBF7B474EAA76EEDC29241F8949D2061DA9DBAFF6BAB7CE44AB349D9C41E4A8F6C48C68BDB484ED96C9B9CC7BE31C2BE7AD38BFB8EA253DE73B6262E27123 Secret = 6AD1F06DF56EFDE1996B1EE3D741B2AB2E9B0298A85FFDD9CB8FD406B726C13F Label = 7AC177503939CEBAD49DF00A Output = CCD19645F92C4E9A0A911D9555E8E605 Salt = D604732185DC353B940920F0DB95888516EE168512D41DF770F668160CC98F4DE5A9621FDD13A5D2B31BECD0161BF4A43870771E9FD7F7449B6C8E7B9CD20237F1D20F528A35F124F4008CF829AB2FBFB1B084A5D8D39F0CA28369A23BB8C6318012A06F4881F88CCBBED907A28D5F0B81E352E827E7680AC995 Secret = CF017AB0894790985C8E217F49313A06DD3EB0EA5856CD9EEF80E52F35D9E6CC Label = 0A1E5C7D30661093268768E7 Output = 3BF2DBA722C88078DCA3C35A241D8EA2177F Salt = BD4B7B3EFB62336F93B286432B868E452FCEE0D57D02FA8B1A185162DC64F4FA18C73C96929C6192086F392E7936FCC4796BA98E5BCF162CE88E5F1D0DD3F8C9B3D6B16C51FD7899418E9BAA1BBDCDF15D8D15B22641CC1D997DC0E6B9FBF549644BD6AF236D732885CB39D5BD0E938D4A52885034ACE8DBBDD9 Secret = 3DE9225AA722AD8330426DA02EDCF606963360F41B7DA7EC8EA3CCE58288B722 Label = A43697A4E9F82862DE052EDC Output = F13D7F216C10D44784542FDD8B7EE5BDC147 Salt = F249916452453E57565B523BA8745CB24A284120391210B47CBF398180B56845E72EAFA20142114EC4A6FED9EB12886ADD1B132905C32F2E704DC3CCD385BF1C0EE5A3DA5273E084F9D17C63F6E4252362A8150B47A07F81B279675C5658F9D19F42A889CEA22959BB82B4E764E3EC5551DB6AFBF2AF06CF2C34 Secret = 068249D295A65BB64C203528652CD4A7388FB4F05F22BEE217968F7A743DDB9A Label = FD05F07133B185FF48FC7697 Output = 8BBBCEC4C6EB59F1874ABB076079D68BC55F Salt = 2AC482A92E75871626DB2756272BD90B695112C54BDA3CEC03C0D5C96FBB475F66EA9E3B366E3C03A9453096D102A4844488C9550E6C57288A1D3F500137DA6DE439FBF037BF0AC2E19A7E8B6BFCE201D9001EE9122EC664B25A19C9D21E647EE13070F71751BDB5DCCCED48E48A780C91AF3E40369E0FC11DDA91FB29107B57AD266681 Secret = 1269BC3481BD3F253D05CD53942028C6730BD15E3A67A492AEC6F484E151ACD7 Label = 39764C3E546BF658699FAC90 Output = 703A012BE55EFC34ED8E7F16984D7C29AC219CA2 Salt = 30B2B524F5C7B6CBAD351730F5FE51F87E7481987D3BDF1190C2ECA6FB8459A98664FC80F868D660FF393F8D930271E17FEEDD75BB303F69B20CCE5C19E16BDB187096D751FA7CCD2C7613B26A6853E35BBA678D5FBE15B5F64A8FA0D70770D054E42C022BD2039728B73248BAD8855B646B74D420FE4D82420BD9F93C8DC323F6FAE860 Secret = 9239512903A9467FCB244CAD769E3585C0120A75EB4422F99FB45C36B2415BBB Label = 6432A550CA3B164A753A5C3D Output = DC01C4DFDCEE9F2F632078C6EEF129E0E94D1FC4 Salt = 637C021B0FAE981D43464BDA74387DDA6731EAA14E680774FB67EC0118DA064056434D26626A2942A9DAC824A68B8EF2E38E960331FA1C71553635ADFB5A55C8E9D972D092BEC6A9C62735C5826F89A9F07693D902C4FE23FAA02E6696D8807A257F47501517508959B32CB069C0BF4A945CAA44FC7FF97923C45FA25868596F11B83D4F Secret = 63CC34508D9C29578F23040F0EBFF4B6B40D02C95D18B691162E3C6890B14ADC Label = 6C383B3C1A54582C30699847 Output = 52F702F095AB0C462E9E2BDAA85E1A41EC410ED5 [SP800-108-Feedback(HMAC(SHA-384))] Salt = 1FFDDCAD8C6DEFFF9A2BEC601CA464A2531FAD765B94D2C72ED24E4C7CBA8C78101C1826ABC88A8A8884CB9C2563787877D95CCDB09D8A843F01 Secret = 3A1CFF3F51B9656B4DB090DE212E309B810592F6D348CF8157D48A92744F5639885784D244C3BC3EA978DC5000A73221 Label = E5C88C173A4FC40ABCED7BDB Output = 1F27 Salt = 2CBA527C52529EAE06DDD69D7A9A98E3D66B707BC4163E17CE731A75CE4149312308B27525D92BA485D1A716B493E65251D8C14A7F17DD7531F0 Secret = FB7235EFED0726BC66C24C004C3EA8D14A7DA5B426BF9B0BC24CF87B5B84E3A568ED2D87DCA44A6889CB5FBA21B54A7D Label = 8C65ACECBC71F94B433F4B88 Output = DF7B Salt = 7778DE368B7C20036D555ABA7D7CB4D4597B3C2D2A5F60D92E1512384F6D4C8F92F45DE6A60F14E41668EFC8273124C258C61779CAE7E0282745 Secret = 06D59C362AFCE96809E8F5BBB3FCE95BECBF3AA51E697E203FF72DB3B6F9BC38BE75343374C96B76A76BA91A5AA4D843 Label = C17813B5C52634A2531E80FA Output = 5AC6 Salt = 0115AE2433731379057AD62F046250D20590CA9AB8256BDDDC2A8A703B90483BACD6912EA7FA50FF7E0BA312CEAD013B6C2990EE907F0D47090D90E2C77219B68446D159 Secret = A9797757082EE44523B0471DE0A3002B41591294B42F47E128FD508666D058128AA495EED8E4EBAEF1D5E69B5B5CB69A Label = DFB23970E620DD34EA2FE97C Output = 1AC84C8C Salt = 51E09829AC0C6B094D968D593458061C1042007A5BE1BF64A910E1E44424366BAEF86DFB19B4231F821AF0FC99EB89EAC56819132C987220056D450EF37A7325C27B190E Secret = 22E57255D11FE3BADCD30C207F98268D20B187F3DFE1DC3E5CA718B4A6E266B88025144C3D777EECBA13FBAFFDCED146 Label = 559AE2A94EE2E3165AE91E89 Output = 8904EA27 Salt = CF0E4AE3F83B79519BCFDF022EB5CBD732566BCADF1798338EC7132FF0C4A2BF048503DA67A6004E1A1112514FDF469A7CAE4B381EE295CEEEB73A1A675DA2A946F03795 Secret = DF94CFA19A3CD9CBD164C0FF9DB9B2983C6DC5B887A2AAD7E5FB8B4ED2B1F7E4B91365AED2C7BFA6A1879F3612008BED Label = 18988C06528F3F06CAD532A8 Output = D6873D44 Salt = CC68F95373DB45F128AF8A4595FD4C0EB386BA2E56F9084DD821F12E0D936069CD7CD36560E1539FE2554D928BC8D94D5A1B12C1B085EC116E0946895BB6F690C3A76FF66118334C0CE5D479A01B Secret = 855224D63FB64FF8DBEA82E0BAF7A050BE9F93565F38FEEFD846F467676D06BD38266B44F369F8C29FDEE36CC13C299A Label = 52F068255B34396026DBA455 Output = FFFEC499F2A9 Salt = FB4626A4B03792105828C2EC13F2F7945E6306F3205F020B4E0E56C3C78B4A3A0B3E3BFBA6FE750AD2DE69A530DC0E6356E33BD584E9FCDB511B0162263E29B1E1144A8CF14B0557AD5EA6CB9D14 Secret = 3E554CC88EE5ADA08E21CD666798BF4235FA103A02CD8DBBB2A2B2F777B7889F74E807BEB92242302BF9D1D77D1B38C9 Label = 2B70224EB3ADDCFCD913EAA4 Output = 75E620E120C7 Salt = FE805C4C3FDDCCCC14F48AC59E7F321B59E956892B5BEAA1C9D6AAA39D8C3DD7424ABF6FB5EABF238F44FEB5F11AF307CF9E9159EF41737556E50C1691FF24375D3D9B04ED2A3F58F9A147ECFE46 Secret = 7357F39ECB34B24D540A68D546AF494E128490CE2DB9FA40668BA23568B5A7AC0203F5467DE8E336A704FBB580B94695 Label = 7D983C21B9474BB138D59126 Output = C3ED2ABFBD60 Salt = 38891D5D79366AA00C3AFB4560C6356DDBCCA1C2FEAE5C677BF3E18706A6F6281976C37FF63B088D20C4C146825B111E79B2C8A86C6F2D4376D6B852637C8E348ABD58CE10F53AC9B6751D194D6DF836DFC3E5053212AD95 Secret = 1699E0C45BE7011AD0D96EB831E5FEB17828F35E6C64C7B543B81E283616C531171A2779E009CEF1C4DFD94A3866F838 Label = 0D2D25E199B2BACFBED0982E Output = 81D2A48A42F90563 Salt = B5977814E02F987CACA32A951D8D64E30DA519951EEA1FD15BBA0E0E8FF9A80C535E47D5E5A44509A0FF27E184F1019551B2A22BC53EC7BA60F6C66257135A49AFE314C972F4A34E539EAAB5419541BD3B170DBAC8C27FE3 Secret = 19DCAE47996B1EED382D6BB83F1D824DA65D660E1AFAA62F9E4EE6874370FEDEC6C278E87CFC49439012A5C0B3D036A8 Label = 4936F2ECFD48FB3A047832F7 Output = 924D81CB7D03E4F2 Salt = 9A0EB2C5DB0926CCC79AD9C242903083DC02941E937CAF8A80496A872C9A24A763F64B9F31F3A00A76EF3DE9DB3B9C2F0F5C4CB9C6FB44CB563E0C4FC192D18C233CAAC869E36A46DE573457E61D009181B6FA3632C95345 Secret = F9EF4139D20FEE3E75FC8CBE3DB0C83A766ABE484D5C22307342B5EAEBFB3D263BD9C96AE1A0EA308F5DA9EC0994CCC0 Label = D0D2E4A9C9CB46EA4AF63C29 Output = CE791D1635D5964E Salt = 0CF4A652C5AEAD5F275EDCBD4DC168FBA94C666ED85B8745D7EEE188C01616541B1137679CE8E7966F87F75B9D3D508626126E0A08424AD3EF51B65317DF93B5C56F3CFD32112EDF29A90FB456F5686C957B11AB461B70393A30FADA4E1F2C4B35C5 Secret = 0F5F55CAB2F27A610DA4C5403B3AE5E9FE882FFB743B558B99B8F01E35B79929B6D0958A058D20B932E02D932539E77B Label = 1CA7570CEE9AD1775863FFA0 Output = 9A6407C966A97439908E Salt = AEA4395AE9619593A44637DBAE69A1C63034D892CFF8FD87D0A5D7599BEE18113F0EB6D4DD9FEE0F349452D3DAE430ECC8A2DCFE89FFADE6DCF94F356D8D97AB0F512CFB5D57F58B379312279D594CC6DD509FF7618961618943EA6C49C1B7910370 Secret = DEC5ED4063552D2961DEA8AE56D445009EC61AE7D26A93F7EF7EF2AB3FDBF9497DA27AB67BC25A0D12268F3957533B06 Label = 8FFCAB62226DE6FEF32BA6B9 Output = 2C3531F1C6CED68860B1 Salt = 886D7415D327C99EC1304A7FF948CF3B8451522489AB5DC5987581B812EBD77483610D5FDCA61DAA5AC22D8D70D2D4CAD8EC96140222B581C4A1AC62C05F5BD5C565589CFE3E3919761A241C2C97055431652BCBBD1253D461EDEAEA4DE35344AA0A Secret = 0A37FA7FF2804D52B94CA9C33FE6AEA7F1FBD593B24915A82190F851B27276E009DB30ACF27256CE834C491A51E2C0C7 Label = A96C7898F36C06CFA3FFAA78 Output = BC18D55A750E6C95D225 Salt = 21BCF8CBB6C5E01BD2FEEC35D8744E903E287B5A873D069C4A2AFEA1BF4B70E78EE15BA39DC00EFF7B4F318A8E41A1390553C4948C829395F144011D3726CD7523A6BF35C56E661635D8359051BE17EA7EC4B003E7ECE0118648B72C1C3F1F3CF288C51B574EF1A05ABC7FAE Secret = EC3A718264B5C5207187A1AFFC0E47B5C8FB61F824C4F846DB689E662A1354467C628D8B2814D05B5593E9936D4360CC Label = C4DE509FF2E0467B8E701156 Output = 420741E3FD2C3BA7469BCA48 Salt = 681E5EDAD643735BCFB658D1F1A78CC443155BC1257597DC6BF58D82C542638839156F0D7630BBAF4963003240FD34C92FB065A2853B1FA7ACE02441EB950DEAB68127549F0075EE3DC6BBB7BC1B8A86482A0DDEAB6B9E99C2511D5FADCBBAEF6D0CB4AEE528CC2437F98092 Secret = 6CC6C06AFECCF85F01FC7308A5AE3BB0FCB6E37FE98D2AB960E517C773BE604920FF2624A9674453532EFB48F4A416D8 Label = 001C0AEE6553DA7EBD97E941 Output = 088EFEE5B62AA992FD743543 Salt = DFC793FC31AA54DF3188AA54CC96B12481D68C7D56922715EA43EA8C945AB3328971A8FD2074FF13D4570BDC4BDBC370FB9191EA430E3318DBC63E9016C2FD0DBCF870E0BA65982F425C249F9E61A91499B80CCDE97A5736D789380F97A88C8E37CFE7D6310F581B93EDACDB Secret = A4AD9351B252A11A77890F11E8271FAFA128127E7F3C5FEA2CB0FFE060FBB4D4342F151C1DB4DC1A28609D67AF6190A7 Label = F86A547B62834D414EAA799D Output = D23296D2863919AC11485099 Salt = 24886F9C75E4487A4B990227ACC62B18E1B5439136E11A39FF013C2719450B8965B53F966274A04324408CC80ACAB907FDEF2A008663ECDF2B89A1E63D5E75856012C1B19518CFEF57882A99B4143FA45B742AE656F12123D951A1AB2A24DC01A7212AA03B67B9198614EA2F562B6B5EB8124AA57BB4 Secret = FA54903E9B54EBF22B6EE5CF79DEAE7F7AAA007F8BF3B647FE75FB8CABB6966B816B9A3794407CE9DEE33115DFA7F40F Label = 8ECD12FA4DB2E32CD3A527BC Output = B44B533A6033E471877FE23C8CCE Salt = 3D3A6E202384D209648AC82708352ED17925374B3E3CC05EB27079B9E685A3F3373E692DB1116341357C67995ADE36B052ACEC265473B544739844747B9B57BB88B4D98279E20450123041800DC3BA19FA434F4035F9EBF5E342286EAED533C18BFB989750309C5006CD50C55ACD5512C2DE37209D38 Secret = 17B6459563E0F65FF9284B9EC8DCEA00B420EE5366E67F73C861EC4C027D4A002E768CC3E7D7C2A176B1FD2AE68A1EC0 Label = 0ABC1A16DC0D875E9BD51828 Output = 97065EB87357509EEB464F67DA8E Salt = 2D7EED6F929912D754BAE862FE7F68037ED4280837DDFA43C973FE44C2E513D97596812932F81B717EE0E36A986F8968FD6585943D74A77DD06080C1A08200FC049D0C0DA139064DE0DA321AC33B54E420B440FD374EC8D60CD7FC0D663C43168C00F6E87F44069E11FD428E73309775B9D57C886EAF Secret = A72AA7E38CB6B34AE692188FC226F1B0A024F3B074AB89A0EAB2CF0481E33BADA447E7863E9063922030F0CEDDA13FA9 Label = 4D4E975320F67DA3D3543F05 Output = F8B738DB97A4494893F5222764DF Salt = 0F5045D7874A68B731B85BAE65D41918835277293610ACB2CCD6BA8BAAAFEBF1837FB23FD94EEF4E86BF4E6AD61C5C40AF6EB808407988109791CBACE1877B3D1C2EA2D3A999A0AD6FE64D75457629E612B4898CBAD1D64B7B2A577FD0878BED8D79175DDA320496F272F056FE1EB5D00C8E05D1D8969E169BD287DC933FC530 Secret = 45F64F50973EEDFC631CEB7DC88CE21C49F0C92FE8AF5660D0E83E5D8125221B09A37ABB594565AAAE4509F1C2CDCFF4 Label = 3DA85E2DE6FC1235F2989CC7 Output = 170DCE2839C9D019FD764F9BD9BA564E Salt = F248835D7746340A04B06B3151A839722FD52FAB27E1835B68B2B3718CFDB605DA162ADB34C53E5E04DDC1D0F1DEE3D273A2B7D18C909A341B9C4E7666748C5BE84C6F3DE3A4B78FE51A56820D61F8A0B17965528BBC02EE18CA0F627CF699FC4175EC9C7CAC3F6C2275626CA281905FE769F0C13B988365C9CBA4FE845C1BCD Secret = 3592DC354C7D7D9102C191A9765ACE290ED048A99B4B078014FA5F1947237431D7E9C7FE83143E983B2F39AF3AA0CE6F Label = 0579C4EF8DD484EE10EA918C Output = 1A87986C94A5B2FFD5DA9517E03E1CD4 Salt = 44097383314FF5856C6FCED7AB8AD1C280902A84295564E107DCF5552CE43FED9BC9CFB555D69DBBB7B9804AF713275F49AE975FA20F2B4440F00704ED4B5AA399EBF4EADFE51013275DEA07BDC85043DCC6A42586B439E27369FD93F266D010DDD2CA3A643D9630BC10DCE91CADF489C01B370919EC7F85057C6070B6FE3DF4 Secret = B12BA27554C693946A02673638A20E4FE601D544B1D4E165CE0F57558D6B02B79C7BD1FEAB70A231608A3F59B386B3ED Label = CF19D0CFD8F2F5406135DEAD Output = CC9CC53319FD6C6B17886FC833F5E4C5 Salt = ABD2833AFCE8B8061D9823C630B86E466FA66DB0F76B2843F00FF71443B6EF2B4EE6C0BE6F41F9EE29DE565CFA6D88B44F83A49DFF62AA14C5B82DFBE824763C904AEC54ED42A88216A8C9624140BD09020D77C1CADC73D0D8154F36B67E13189427E9DDD3690436BE9CC5CFF57E3873C183A9DF68043D1B00FBD9D635444FF51E0EDDC2B5C85C7701D4 Secret = CFCFA9D7DBAD81BC79F33310A4B5D8A1DA606A9C6B6448DA99B011E3A632FBEE0062DFF93945E89E52910A698964B459 Label = B601CB920E44101D62A948CD Output = 67F384E7A587D107C7597D02931351891762 Salt = FF640734968340123C38491DC0DE7D5033A1E6D439962B4A8BE6EC95CD901769366F5D058D8E9C7F4FB47475B2D7A24A5EB9E3E72A632E41648D55770168C136650AB7DF919A42BAEF1CE6238B27972039DA91B562E2DA2B3685DE2AEB1BE1792B526A59B8F48D6C5707507AB2CDC50DF158DAB68744D4A2425CC9834A1BA36D9F010CCB787F5DCD4036 Secret = 6F96B65436579DDDC5C9EDC8603396B55D360C92BFE60419F9742265DDD10CA1655E6C5559FC5A99FAB531496E2508DF Label = F9CDD6178D6EF023D26EDFF0 Output = FDF0C7BDF2535A7645CA9462EA039A6D06BE Salt = 8154B815F99CDD9C91DDA48FDC723EFF721438C37455035C754DC1FB7800C9231232E0A363D64F73EFA216B1CFCFDE5231D68B7165446B89AB18DAF540454CF55F0F667ABE4BCEAFB2548B68F00C25D5B812B1B646A79BCEC63D0B98074F706266C3E40B9B4F7B031DE22CC7ABAE002DA880BD8042B4DA84C456A22CAFF90EE4EE250CC8900F845FB666 Secret = 3FD30632C5CFCB42B8668D7BF7811E240D787590FED319152749B3B040E737C826CA849BF63B0242D3AA962AACCA96A3 Label = 9E2F5F2FBA273438DD86D31B Output = B04A0236D59C4D4EE065B296B57C8C0AC5F5 Salt = C905AF1EB05C402F7E4ED024BC9883B75195B46754815E8426E95794AF7A53B99EB62C137378254E739F9565A8BD46FDFF64187CB16CA9A67148E993F0205E3CEF5CEE8617F913AA6612C1C6774D2982DE57549101A1ED9B92D78545E7B11B40B38C58B067DBE1DC2EE1ACB1D6B2EB09412A10B117001EAB5EBC5ED09FB6CA8D02AB3CB591079E53A190D0C6CC77CA2B423BDB73 Secret = AC303E2363C55084F00C3E011F363CF5C13C0CC9905379D0714ACA76DBEDA1FC851CC78CB8EE720DCC34771FDBD7F446 Label = 711B1D272B1C9507644376EA Output = 7E9F0E55E09FF089A986EA9ADE5B48D15A2309BC Salt = 5BB4DA811597EEA4AD3AC9EA0814FCBFBC1703065A463584F3BBC49ABC32E28F8BE694AB5417B7EB9FDBD1F582A20BF16FCE102F221AFE02029062BA39EB5B78AA92AFEC8EA7F0EA908C939CE454730A201F5573D4C78AC5ABD37C55D829283314628BBFF62F7BF87BA28B8C866FABF0D9DF20175EF48A3D0D1E1635E7DFF41B26E7D863116C15AD60D9DFDC9E201D71C538DADF Secret = CCB25C11DFA360BD192C818EB175C3C76A73283DF6D7869C386769F80EAC28D63700D15D19A7CB5B5BDF9FBF4187525A Label = F2980B952FE72D590B5093E9 Output = 8FA20ED10100EBD00B7C70D0A9E9203CAEAB1FEE Salt = 75FBBCC703C4D5F9DF67F5EA085BD7B2045F3BFA29AF6E946C01325D7B3CE59F6BD184C2C04EB20821FDB3D9D9263FC7F57F19202B27C637083F2367B9CDD8CDCC17A45E5F89E0ABDC7D8DF329D2FD867C07489A0267BB9F2149F0F79E3939D89A7D49638F30EE6E0825CED852C12AC8EB98158BDD7A02DC8C540597B2D5F01CD4D7820EFEBB324D823A83C9597DCBB09B9C2B1B Secret = E9E8C83DA770F4F78DFCCA140F912116F63EC704F9BFF1DB35A474E69A923AC8E0AC7C36160432CA1A62A2330DAD1A39 Label = ABA6ED181A41A5DD5680E5C8 Output = 004006170090E730BB137914309D69C6DBC0D15F [SP800-108-Feedback(HMAC(SHA-512))] Salt = A1BF74237FF9A58582135BFD9017A483CF65F1528BA58EAE100703CDDD3E736949E003B76354434FFB2C1BE3C9789573E4FF445494097A07517E4C56F5B62ED12DA2371C4230291DE2DD Secret = 7475D90525595BA1A1EC2B82F7A97F647707FB90B43863A87B9950A318084610E6BAA1112A35E1361C6E50949ADC106DF4BC6F046461F267E039B8936F4CEC2F Label = F4E1CC4EE1460911D0DCD5BE Output = 7499 Salt = 0913C9146B66122EE7D0054A46B4E0C0128356A4BB49A0FC11CEE4F9C62C3EF6A9166442904D6EB976D59E422FE15D3DC33646DD69681FB1DFE0B96FEE9045B7193D53A60B075855B69C Secret = C500B346DAB8AE053DFE0E3C42D5A7CBAE5D06A5A5EB5E8056877C903D631B1F60841425B0ADA3951679E9E7F0E268402E2706C0098F956E86F210207D6C6A14 Label = 78803CD4C2B02DF4076B69F8 Output = 8D68 Salt = 7EED28A8FFD68C8597C8742FDB6EA877DCD67B4ACAF502E49AF26B99BF229181FBC123A5468E5EAC056A0E47A5516F2D67AE540096A623499A92BDE115B02A7C6C49040F7E06BB463078 Secret = 91DCEA1B7030656633FA0F270830098797072FBEF8A616E2DBA185D627C571FEE2273B95C6EA6595A119E95083F444635617A56DE885AD1894DA22DB95871728 Label = D0EA2740AFD616AE30036F8D Output = C03B Salt = EC3E62DE99C7F8C086995C9BD02EA82DE29C9E5E8D9BD4026189C60C610BB3F254CBAA932BFB1BD336773EA9440D22C34DA478312676F4F0CB029406A3F845F6D1C3127A5959DE6BC68A59FA9CA21ADF86A3525F Secret = FCF35B0BAB350EAEE7A65F14F447302533A0EA4AB57EF385B87B405D486004478611D4942AEB67436EF20593BD568D2177C73FA605139D030E09870776646D26 Label = 4456A6A95EAB07DC4A3C17FE Output = 3EE27905 Salt = EF50AB975D79B7D4CF2EC59D28E62E1DB4FA557CD2EB4689F89C1D459D2BE46900EA6D75185357339928C44E50B09F342BB7DC12F14EAB1DBB027B10BE13247942519BE7C7017A774EEB1D452B42DCBE6C66554B Secret = 3F28C232788AD5162C8B9497D6AB5BFFB0EB8D663FBE0C0A40B9F0FE4B8EACCF81EC9259F4E770D5DE2563E7E7C8BAA6CDB93DFB126D3148C792ADB2BCAAABE0 Label = 018E77F6A6D59E762234CED8 Output = 1F9A0C6F Salt = F6AC6D24F67D4421CA26CEC5FD79A28F1C6401BF6AC808E9F72A59E61384DD2756E124C44EAA660AF0BD9900AC7381E4A8C7FAADE2CE701B259F6162C9DACECD3E662202FF1C5C749553AE7324F9074B8556E558 Secret = 0AC43015F8A7E95802D10E798D695E5397BF9B7C4FBF47660F45BCBBC56CB8E80C31FB9494C101D05B669837C1B61598DFA51F06E8CA703B833A68FB471D45DA Label = 8397E912CF318C813D2BE50D Output = 567FDC09 Salt = 6814F9E88510682DD995B851786ED7F3F0A35C47F816EFAAC84DC0049788AEBF0A8FB56D608CF2E6DDAF770CCC368BB0917BC1F86DC33AA822D84F5E544D10851FF8481188CF679F05AF594B294A05A1F6A31E1024312348215E462EFA1F Secret = DCC8986110A301A9B97E3F6B098C8E9CA6E25458C3344CE8AA121C72C747F3BBE941209C85686F44BF8B9A7646DCD9CBB760A37871D44C8848B86D0AE77B7597 Label = 6C8F14C1BE12EEEAA4ECE597 Output = 8E74E56951F6 Salt = F9E397B73DE2C1B85EA4A6386B6968D6AF8069005901C2E33CE72CEE3A0DDCBF24D01B715094D5AE93269EF939FAFCD286AD8A5BB0CC21C5B3AC406EF0B1637E9617A056D111036042F3C8871AC30DF7C88646DD6A4D73AF447834FE32B0 Secret = 4D3302A38C13FADAF7FE71A3C278775958801976B83EA8C2D625A633B7FAAC7B46FEB299820D71E39F6E6A34927FF07366B651BC5B243FCC4F6445AC49F3D4CF Label = 1B03A9043F6DB6D1983778F6 Output = 163A07299BB8 Salt = 8A747C9A11A9DFFE7857418DB5CAC7BAE088EF88944A0FA30E64E84F3932E45A3367D309ECBEDDB4DD401A55A04E05EDD43888E76F28E58D269E7CE83161D1CB672E0D41CB7309328B06EE72E33B0B7B627B60750E87B0D4A1A75AED834D Secret = EC0BFF5E9FBDDB33E42E5B948A8CD0227855473EDCC72FD370EFD9E66A3952ACDB8B4EE28458F0C11705F2F3D270AD97214C4E01EE8E5EBFF8B585353529972B Label = 9C35586247DF7E4D16BCE0E0 Output = FA8A0B166522 Salt = F6B8CA979E1BD91C0EACFFFEAD18F072C9FD3517385CAC42DFAFF8F864F639E07095E97D21F4BB9C489BDC1544B3B605DFC9EBFAF5466576929CEC3152C453215B9EA96A0B209ECC261893F1FDCA901633A1A45C8D5CB03F78BB9609F7D6DAC94A0269160457F06B Secret = 95C72C1C6FFF10D19A953AB91F7734DE0232F0313D1C34ADDFEFC59C677440EECFA85DF1E16FC4CE2167957480B7D35DD6DCF3BAFB081B2AA4A332818E1BC969 Label = F1952F52CDDA5ED7B97B8024 Output = 92230EB9DF6A1D7B Salt = F727A9D8CC77D92BED8C5DD657955F0BD575D23EE9B1A7CD83F7E22337ABC70F7BFF1A7FBCEF72C0D50178D31A3244655AB637A601B0C11F7E2F740CD0CB502EB0530104FEE3A894E93F7BD8A607720B49C4B0496F9D784CC44A7D1B528BBEBDA93F971D230C5ED1 Secret = B65242CEC267788EDF60186B6F791CFC1BAC70483089F5E01D75DC9D2F544D220F5201721314CA75125278A6FEF13161F6F9805637A3C12D788DC3C7840FD961 Label = 0A167B8C6DDE23CC6ABA47F1 Output = 0D3C3DEFAF40401E Salt = C5A32E69B3D9040019E668168E664E5B4D437AC327942C8D84F5C29F39BF34A8701D37E1999BC4EF1CB507B1A5242A88C43D4C30BA1E5D1D59E74FBEB06E110C3F4FB200C6907D750A07FB72896DFBBE77E8D04ACE79F3515D4E974A500D13E52504AF4148EBE183 Secret = 7254B31FB95AA43A1E89BF87A2FA2C1D8D118A1402DE445D02FAD0C343C1F99E26330ABA7BBF1D6D32E948BC2035AC62F4881D46B9BB941848B40316FCEC982C Label = 82415135D7F363665445C100 Output = 1387085EF615D4BB Salt = DC8BDC85946EFDD0E2907EFF6FEE79956D22A0B12246F4F49AF539B9A6B5A1433F8A76DB048266B826BDD168EA2B26CF2E69704BF8949B0FE0FE2BA92ED1A446C3F2BB2EB8D46957D0BD8F8F3898BB71FBE136ED02CC9289C78EF198BB95DC29AE7113F7BBE8DB401452B6BD42D242F5184E Secret = EFC768E9135137FE7EC6168AAF9D7C5E3E5B218067D44D34281498C3232251D48549D7A0A5D9EE22B28C46E02A85D466190FF5489230FA6F8CCE3F4CE85C14CD Label = 522151E959A7EBCCDB17057C Output = BA0334EF62FD92941490 Salt = 6520C75A42EDB6E6296224907ECCC61E41BF5D5710545445404D9F000ED76E3633255948C768F73AEC962B733AA0EF387E99A3F3B57BF092FE1F0D0440616669920F66BA4F820C682FC78A4E0EEBE4D56B4149D849D31BA73C51B042D1D8962E634D38D98FF39D5DECD53AE94F5F18262621 Secret = 1486327DFA4EC80FF2ACF1BC0502A3926149ECC902238D3855B3958BCE42DF74FEA1401CBA5F52B154E7D2A0E163FF07AA41A0567A934BFCF26474D5804CB878 Label = 88A83659A9D8F487F4D43556 Output = EFD932C8313CEBC60344 Salt = E20045041B9F6D97C0D6E56034CE1C29B9FE71E14CEE068EF81BA45A41BB896F0BB6F1B324128CF464958F3A06D261FC8A2F1997B3713ED26497E64D2935EC52AE08B5A0227519F489CE2C163D9B599F0C50296570D9404621C40AC484CC283071BB46737F542E8535B90176279EB0E601A4 Secret = D28F08223D49786EDAFAB7F8C35B4DC7318BF4F6118A0A1EF7E6E853C18840EAAF7CBF9719F6F732447C7BD18C760CA90E88366B22D9656D650E929D3ECD4A37 Label = 56A64CB840AA5B8D67D70DBF Output = 8139DB0EE1F42A7CC5D6 Salt = 11C656E6106490BC32F33EC8B5E23F640A4BAB8AB935E6F847B1CC22F2907D01A3D53D5A4A1758082D825EA1E6C2302271F9BB34A4898A08B577AFBEC68DD4A7F9BE3D3AE158967FAA7D56EF168C29EA8CF062BC7DA91B5F276E666DFA4BE40EC7119299A162A4A03897DBA682930D5B3C8625FDD418DB2329CE9645 Secret = 3173A173CBCD48248F72262C5FAFABA17A667463D8DA326DE04C069F2D08107E6305529256253D756EEDA02CAD202FB48160E6DBC7C12DBA48B8D1797D33EDB5 Label = 23A5E416555618D5F1D76C6A Output = 132E61A172E0FCBDFEB816D2 Salt = 488634764C5FB36273AB85B2E8154659C150C30F05D9F119752E87116913BC66F3FA2545C4285CD241C4D9D2125748DE857A154DB20B7E7F3D9D22A1F0CE7E248152FCEB9F89DA0716FC8420C9102C253FAAC2F636AD1AD37E2D15AEA21DAF42BCF29905176128F90B764EB475D5B98CA030AE55D7F8E697951F3FBB Secret = 24BF0C085D34FCDA5502B947A33834158F3218DC06B458524C51C58BDCB55D9EF92A6FC30942334149D428ED9874DCC62CDCA38812D7DDEF112E7157B2DAACD0 Label = D7DA9E6A698A8DFD20F3973D Output = BBD60F8CC591E6678BF465B0 Salt = EFE23FD6F11EDE8D14612A81D77BFF96FF1A5D8FF65319F840C3406FCE76CDE4BB9384D0938D9C1B0616B4BD90C1EC4829B25E30410524C303F1519AB40246F4346135FE9B59891ECC7C5E442F30C7D37529929AF06FDF2F0F5FD6E6FF131C479955B72BDEEFB1DE09F31A43AF79CBD0AE3433375D42A666B78370EE Secret = D69683753BB3C3DB968E1F8142B6A69752E785F4A5317A2FD41697B04EBA4F65D1E9579208D3563B667CC2510C601FBB7EADCDC8199311C3C6E3F76C7904D54D Label = 3A78C71D0EFBA8E1E9669F69 Output = A8018B36CB21BB9F4C0CD5FD Salt = BAC79166B550ADA95BC7786541B32F97C21A279E55F4A0A46F53F2CAD5CADE4B761619C47D57EE87AB01325BE609354F57075D78DA81C6C4771D83953CDAC4C193A5539EF8F9A85F316CB307E19590CD9FB5936DB2FAA68E24C1AB6DB6F28166FA4F9CED2D77BC42289684863AC21D2B5E60A1C728B79FE1091B2393E372175A6CA72BC45D51 Secret = 3572E9DC4A7D0B309D5430E17D77DE04F606E7023866E517D314F315F729983E1A81B9CBB3214F2EB99D982254D450DFECB83B3C5D22235C34EDF530CAF9FE98 Label = 62873536453783499C64FC78 Output = 9248F1D2F9FDEFFB7891DD758C9F Salt = 53047242628704C9CA26B43E3A178303290681EA64FFEE90EB0FD4ADED1228B05E995EFEED10B8F864D7F0B912A373F5DF436B4EB878C4F743114CE6D3919293A4F6A7E422123CBD171BBB4B998B30EF9CE10FFCA44C92C3886549985A5E5E9AC5210871192CF568DBD5F4211B7FDE513BB7CE6A346E39175DCFDB6AE3CDAB1B358FDA4E7240 Secret = 5D0DAD20E769D17151D221C03B2AF52FC70D16228B361409D6C2A41A29452DC26C5360CB44A6484C5F84126D39D0927A1EB2C70D64A73DFC79742BD980156BFE Label = 40FA9087A48FA012B8D25529 Output = 32D4CDB31F59DE7D1CCE86D28D58 Salt = 50870620AA8D5241753516C2D67AFA16DA447AFC3D886DB3E0D1D13C262884F7B6A4BC37E1A5B4A13BFD8DC73D757EC01C6A6716A284F4236D084C6F096F198BB3FA25E4AB89C16278C18D5A8A4A0467C51BF9FB196640DF1C0291BC8A14D02871ADE47A39604B7781AE588795F62500F19E3063B587CA3B095DA79D506333C01406CA24F208 Secret = 93399AEA9A17707A83D2A705C3F2A3C56FE41E3346832547F8A5A0C0D050CE62FC233FB4FF98934D8E78B8D2BAC7B1B03447C058517F456359C2B67FE415DC9B Label = AC5201499170D778B01F160A Output = 7B2EF9D85FB6844E565E6BAFD3F5 Salt = E8A69F08FA55DCAB5EBCA21CAC386F3B1C77F28612754DA1F80A4F0FBF7AABD64332C6ED8B7A44DB64985FD42A7CFE4F728FC5CF3CCA5786394D62632CE170B2D71329DAA211696C4C6AFA471BC47CE55D9E1976E5ADFF11CD355194083A53B83497B47C652E0DF76628394291FE1DC0ED7A222366C1B601C62BEB8B046B27D588E26AB82F2A0B69FD91BD4B7B6E367B Secret = 68B790106785E644E0DC2CB82AC5369E23DAAF7AC692286A005121D235C7412405D9985F11927B76ACABBDAF6D3679DE2845A0B1DE52987568EC712BCF86E1C1 Label = 9250E7CF54D456F8B4874B18 Output = D09A96AFD5039876AFC0717E8BCE3861 Salt = 56E400B8CDC678B4E778C72D8E612E2D036DAB16E6269115DCD6AFDA2F8492EC418E660C810FA23786D9C24989EEC73CE6F5803670ACB6B74CC9909C1CB39D4A3C31ED9161572CC70456FC20B51A482E78685FF7236BC1D4CF86BAF23DF4BAEBB37C22783899B6B860EC9A1257DE23A4C29179BF360F410F8E36B09E8309B6BA157C3A0A0CDA0066B09C92280EA9ABB0 Secret = 08B37DEC7A5F6F77591C80A2CF10460D63A185EC503129F3C58E77A4ACDF613C5A93842E7A80BA6C75AE2D0BBFF284E28E9D5BD7D33CB07546CD2121C8BA46FE Label = 2CCB5ABD59EB104306FB0214 Output = F56BE358A40441607444442B33A132CD Salt = 71A5E5BF303BAF3CBDC64209451B9949FED1B6A7B09C8DCD78BDC490B8E939536313910EBD67CF68BA4522ABE7042B3D417564B971ADB2D61890C940E259227DD7BBBA3E30CA734EDCC98882722212786263042D1F6CBA7BDBF8830F4464E4135C3372F30140896E0828164BE0D67F81EC7FD6C1337E3FE72CE5DC9EDCAF1489C6F47C2C4446A7E8DEE3231CE4F0C7A2 Secret = EA9157581CE7CEE0B2D8291817FC9A92ED48D3BAD2B7EF9324A0DC99E19659F7DF8585FD794521A688ED952F671CDE50505DBCF1D71E8E354C466EACBFEF96F7 Label = 47906722187606A2D74340A0 Output = FCEA610E7F980E3B6B26939DDAA67908 Salt = BC22F944F0AF10965A9B5708BF19D6854589EA0B3D84E330E55D058644472AC01342B51C3FB59ECD80B963AE0D725D510F4A209FCDDC6519B52FD4A1723B947D8D247B7F1EEBF3D2565F278049900B25C6F1B07342D68F2CF15040D5E4E0BDEC64BF248F89B0D344DD0346D51F6B6EB1D30BDAF58472C37E5897750D73128951CA1616E5E735BE628023C777D2841C3874A2ACC76AD479F7A5DB Secret = 9EA8EAD380DEFDE5D6CF310F37B52BA2021B15A1B9E95F13F0ADD63D782DC28C25EBE07F4EC123EA0F75E371E97A4A2D353E4B95C018594ED21D338BE514CE53 Label = 1D6B0A13614C6C64152652B6 Output = 4754B81875C9DA87B1A51638B533FFE1D190 Salt = 6AE9A9A76B6F218653D05A8425041C1DB4FBA3803A5E2B2B28204EE602BB74B6609EBAA6100BC27FBB1533C5FD0068586C5D2144F86D0ABC161F057D2B6AC406B5687C8C94C794787B5CCB23B33A486728ED3CE0C83326CFD50A35CF7C2C01FC58E7711C38459FAA6A1BD8D93D7ADC9AF4CFF9CD7593F879F52AF013C699F2D1D3C5A174446F7FB6EA9A20CD1201B9A055A93245C543412992C0 Secret = FB52CD21404E856C6E0C3B7F3B03880C5767AF199AE2EC058A108C8DC82AF6282E98BC4A73E3C79D8AA0EAE8316ABF05A44ACFACCAAF2C2C1F315725DDCE08DC Label = 0E7977FE5B5DF0753D43505B Output = 11494008E7D3D5E4A95D939D29BE5EFF7BA1 Salt = 4585F9129F8B0192BC78E713261D6D95F89CD658FDE60AD192B2329CC772F201360E1C3B36D5EF72BCDF466773B997B8D8EB749E0D0263C73019C6BB206C94751F62389257C5336EA83FB597D745298C0B647523DC67A0111B84AAEFF2447ED4490FE93E4A43D9D1F3CF0F1AB2C78AE0F7C7F211349C466A785E017D2C0947309D90BB63208FF3A772DD8BC06A2FF37D2A83FE476350752F39A5 Secret = F510DC1CA5B72CD9A28A92664FB6913B5D85C8C66C808A59878668E5BF3235F5100AA13A25931B832D0B295F2E0081BCDE295898E7233C4C552F645810BC9AA8 Label = B9C30DECDB5097CB6567E95D Output = AD11956DBBE419DEF264F7505E84133F12EF Salt = 34E42D4FA72EAF5313309721A13A1A656FBDE6B742332D72C6186B51B2C44954D047FEF9683276170FAF5F2AE60F6C1721D0C7838D9F1CA20C4A2003999F50D007751AE828FA0A674140A6503B2876D1EA4BF08AAA981A03E873BC9AA240E59234F1E47C9138DD4F82CF6DCABBCD813020A14AC4F8FB34638D2E926D5CC2DCD58F1A545D2F09FD7CC493271FD932D492CF043FA2E48A455511E11EEC79158DED13655AB8 Secret = 0D6742DE2D1DBE9A4635A2A21BA3CC8A890C93A01F696F1961DF3EF782D2B6F1F8C27F07BD3A0A79ED4D254BFDC23766207FB4E001454CAD72E1BD7E757A3053 Label = 101C14207F63E59E64C50A6F Output = 317EB7874E6447C286ED1DB13F148E8B49C84F2B Salt = EBF794C16CA7EBF378FACAC0610EC7CACCB089BE61BACDED14D6F3EF91D4502568562C5E19AB577F826C3D41A9C4547F951B84F8D5850867900C0108C33682847509392D1122500CFCCAE3F64A160454919BDAA6395BBB31216BB024A7B5920D196A3E0558B44721FE7011944C4D4F8CE303DE01061CC105FC10CEEF4B8C47153D020B56FE474F3E686A7390727F3B46D63B8E3124D4B9B037C56A900BEAA163869D881D Secret = 9532B1B4D39587844B03DDB93253A2956CA7CB39D642A58C3878AC4F9C8C6B03A8A4BCA190C469ACA674B92B70787D9F04993386546ADDA9E74534AE78DAEC8C Label = 942042F23AE8801A4284136D Output = F4BB71748B8EED22C8A627BA081E25D2E8815AEB Salt = 19825F63DB8253C0A94F463151489358870BC7688F75CE54D76C1C3369556E34CA883D65A6D82BA9290A371B81B3EAB40F2B4AF8142834BACD5269CC78CB93954DA918C3B89849CAF2844531359D2B3BAAD07C2A4217C6FD1D03F88E67D9BCC10C583EAB368936892608E571D908021F7D94E28BA62416FF49AB2926E1E86DCE0350BFBFF599031F5808F6DA2E46F7B1694B34C5816A22A8090377101BBA5DE15D09210D Secret = 44C2109F8E4773B96B82D355FEDC93F1E56280C107FBAC36A5B73ED0AF1DAD843F7D4BC5618EE68D0F9FA6CC91FCF820B055143962021E8BA51B343F5E88D52C Label = FE0563F7E8E8C462B211FD6D Output = CE00B7264A7BC254EF154690C5DE04C48495A3C6 [SP800-108-Feedback(CMAC(AES-128))] Salt = DD14C793E9618CC9B9C01D51C100E9FBB135368D71EC55161ED3 Secret = 7C51100737231369C790AEB3296DC944 Label = 3CD7544C256430D3C85F81C0 Output = 68CF Salt = F2C9B527C74493E2531281A378F00F689C010FF2DC606ED1872D Secret = 7B6FB1C5064468F453A5863E12867ACD Label = 34CC4E143FD61B26A9EFBDDB Output = C7A5 Salt = C6F853C32AAF2CAF40773754BEF84A4118E10B6DBC1ED9C9907A Secret = 1315BD8E37250F5F376C28F9B3C4C461 Label = B9B47E64E611BB18D6801827 Output = 52E0 Salt = FBBD79287968BAF49632185C440CC697E9E8887047DD6B53D2709F95F78868115AD7E78E Secret = 8BA82D25D71AA608B67ED53C43144DB5 Label = 8FA77539E489B483A054D139 Output = 3C537CE6 Salt = E1991FC5371C95A42E08E208016F3D55161AEC6ED4AC7FF9F86BEDFA239A99BE71EE4847 Secret = 06703BCAB9BF955ACBC6955A85041896 Label = 70FF7071AD1F6419F1627EF5 Output = 794E0507 Salt = 4E46D9E2A83013C925705B5C8081337BB5D241D382B1C0B05E9A0649845D3240D2E298FC Secret = 1C5E8F5AEA2D482543302955BE1862C3 Label = 5A2A3EFECD922C6D20124D90 Output = E14E937E Salt = F311F466D110ACA4DCAB887B547A28B7D5CFEAB2BB7AD41BAFBEC02804CB445F10DB3618DC5C5C646E00600300A7 Secret = A98C685DA97E592A6EBD72649D43E9A8 Label = 85444A9617113CBFD91205F2 Output = DCE97429FFB3 Salt = 754A73BB6B56C27559CC22C86A7CD4B9DD092E4613AF29951FD20222A40921FC0271DEE1FB1514F35BD97D08A1AB Secret = C2E0A358FC223EBE7FD41CA8590F2CA2 Label = 8BB897B576A2257C5C02AFBC Output = EDF1D86B97EA Salt = 0C3414512A9AA5CBCC5304EE56501A6A8396428C428B61C785259DBF4D6A21FF1552F9F1F19905BEEB593E871B2D Secret = 345B7E093D79B3228FDC8C584C36291B Label = 08B16453E2AE407927ADFD02 Output = 0EDDBD83893C Salt = 7552EFECC668395E2BC01D4B7B03C891DA08A5BBB33AB95A63797F0DE69169811CC85E61ACB221C493D47D3AFBBD680D2A0B056072AE65B4 Secret = 3999020E2409BC809F68844FDBB9C62E Label = CED726DDD5CE071981541622 Output = BB18D0E5B5241A57 Salt = B2436ED79659694568EF57D15DF884BACFAFD3F28C5984B5304EF9BCBAE05EBB728610F8AECD2F2D06EB26C85619F3CB6299A1E4EEE3F7B1 Secret = 85A09541FB7E7B3D7DD22DC36427D466 Label = 36F162A61CD2B39A001B07C6 Output = 1FC49B82088C2563 Salt = 7E5DD68490D7140A368CD4251BBA1B445ED3210978101B6316691E0CB2B0A83F31DE4A8B70A3F8F25E03ACD58B41515AD587E2BE51C49F3C Secret = 1DD0603C5FDC47B0A7C9DDE6A8654AB2 Label = EB3F56CEE69CD11EA2B5656A Output = 7FD52E0E0C1943E6 Salt = 2892468B3869F2106441726F5AE83EFF7590E56BA49222522A0AD8CE5C9421CA6D2255F8354F50DAC1F9A63625CEB893AB012A1B52D7BA670EF1AD64404F7EEB1562 Secret = F06D0E7225349516BFA541278B97028C Label = 13D51EF6296B32620A3401D2 Output = C0FE13B3ADEC9F996AD0 Salt = DFBAA0ACAF2112683EEDF55C3A4193865D9516540D11A77D366B2EE2F548FFE0EDB0A45C63EBEF69CA2E1625EA16FA545DA330E0BE0CBC1DCB65BAC7F9255CBAB619 Secret = 5EA5CFD14104D0C8AD18BE70FCCA6617 Label = 7F8B11EE208DA08F8D37E819 Output = 90DCEBC93A310E2501E7 Salt = 7B7C63AF638540140618D43AC4F752C4D4A24CF534D3DB2DEC8DF07F295DC53452CA7EE0552B4E42B1CCB79F2BAB030EC97239E7F1F01BAEEF8C34BADC0C3E9D8798 Secret = 2B515D0F8E886E44CF80293C2CE85343 Label = 2EAAC28C145F8A48EA211D97 Output = 469029CF52C024C684D5 Salt = A8A4817B393DC47BFBB6FBB4D52B47D9EA1CA1A2021D462ECA7453369D8D1ACDCEAAAF5295CFC603F17AC55CF8B958FD01EB41745249077CAC36E2EF172A9F6B4969917F2CB969A13FC45CDB Secret = 30D2DE833C84A86DE6A287D5763E26C8 Label = 6FB3952CF1B7DF0FB13A3502 Output = F0732025CA41B8F7BA48330E Salt = B1613FB1ED9526B13732404E9CFEEDD41E3EF6E74E432655647D6E99B81B70FF790949236C8C990029931DFA072B32088BC27BBF1E5F735A2A48CDF4C26AE11036BB347E8FBF6A2F10711C02 Secret = 2659819F042C84A7036C3856C1E82D90 Label = 6F619BEB4567F019FB6A30EA Output = 8BD6D45EC70AB43DBD5DEEA0 Salt = DCD7ECB0C7A5A529821DB33D6AD92A79471DDD6C4172D5850B571E6C255B7987BC472B674617FECD2A7A11A52A5D02C4A77B4C277B3EA0D3B3C3551C1B41A900CC0FBB3A10B20BFB9CAD82D4 Secret = 592C11922B3AA511E79C30D86570CE26 Label = 1302ED9325FFFE222A277596 Output = D12DFDCD1222CC00B9872BCC Salt = 784D64736F416A5BCCB1DC838BE1A6EE4D4B06309E0908CED5A28557E5D5851B6AA8DBC0D17A215D84ED38FF24E51B2E2D15A100EBE81294346990330BD53E0622D64CE5F2D9ACACB5E917383D36E9269265DFDA827C Secret = BD51ACE00AD8696BD5C0A1F211968CAE Label = E397E628843CBE39F8AAFFC7 Output = B4CFBF46200C355FF1A69F4232E5 Salt = 4FA04F0E3279F0673410BB07E68E1C1CBB18FE6FB675F3513F3F74233487663B1AE633A98DA3D3A02D69D2EAEFB56CBF126358C017EB9B4738E33BE9393B6AC5A7A814F3A627AFC61F8A1EEF79AEEC5BC1F2C079F204 Secret = 3CD90AA6BA745A601A32FC1FD435F795 Label = C70255492BE8EAB17E9F60C2 Output = 77064833ECF20230F7F0575F4546 Salt = F2C83B967EB1C272D4221224A5C3608FBB9B112D0FEADE5C951A6556D3B2A3867E2C390292177115CEACC042F4B657BA3966C1A7A4832C7EBFF430EA113C0D2FE8F122D477D02543AF06E8D81B9590663800DF6006F6 Secret = 98B65A2B2A5C2161126A54557C0D0097 Label = 51E7D29DEAD6F2059A5AEA60 Output = 04CDA0ABBA720FD52A7F7EA88065 Salt = 64F361F50C9DED2B0141701D8175A77365A654195C0EDDD7EABD2D223D39ECBEFAF7E1FBC2B31342FB66F7716D4CDA8743C9FF179335A84C0B35E86521E3978DCFA758380CBF223B87268A875E2F225D27D617B7B7DE325874921F72B2A05FA7 Secret = 70D8D3724510D002C0561E0F45B64B9B Label = B9DC7BAF151E41ECFFDD37AC Output = 06C0D79E87656DAD3D98D64712D5D0B8 Salt = 0C3EDE68F6BE119FE2F12E7B62B34A191A4B2DA1E5FEE71F57DCC24E29F26EBD89455EA66B01E9CF6DD19517F720CE4D887E68279655C16FB1C5AAAF278CD0BA2269F8E314B044B04B66CD3391D1E58BCA9C14B21788CC10BD0D0831C650290B Secret = D38BC099A9EF5265B04337E78EC4E6F2 Label = 17CF562123C35EDB5B058BBA Output = 989A679AEDD4FC65E2BC47A3051CFBAA Salt = A54145CC7E6CDB0E30AF990F3E037565630402FD5F81EFE392E9D3984718DA75858A20D72E29EC6F84465818B51EBB6FB00CD534DE63817FC81E46259085EFADF614CA2FDBD14E2887E863D455644564E603076074B92C685493E8FEE94B6E6C Secret = 338D8FE331015554FE836D88D7D6BF25 Label = B2F734257CFAED68B8A2A775 Output = CFDABA80B956165A4136052228A72366 Salt = 3A49550EDE4191A16F6E758DED61E7DF4E0DB3B24BBD4D2AD3AA5D6C3A0B88B3AD6B70E92B1F4BB63B142BE7D61D98655A819161B605F83E377111655ABCFEEE726B52DF7C2A70F1BE32EF01459873A0A5B172DC78B01462E9550BEF645C1E16952B7A7C564B336D5220 Secret = 2FB1D2F6787312361C71EC3DF56AF20D Label = 544513DECF3959F9E44CD879 Output = 9D5DA8B217FA04B694E3ED289544027E5B80 Salt = 96506FB7F541789DB3583D1BD88560AE109E5E24C325A9D4C09FD689E83AD729678E5DB92C70453C38B36A94EFB648CFEC2024CD860B6279C993BC0DC8F3431F9CB4449BE6ED01675029450B045030D164582A844835911FE68592212E8E1723A0743942484753A0281B Secret = 583262DC295AC862E99B95959F613DC3 Label = 77AF18CE2A17B1BB9EA0AF1E Output = 6753BC13905C033246405983B1DD73CDBA8F Salt = 804E1224FC5423670A7A0460738283EF12D3320E9F45A739E52D44DC435DD87B4F5F4D327550B40361ADF06BA77254B9265C5D40FBF4046541147A91ED837149ACD3886F5B507F7C3EF3B3862C569E6BD131EDBA325C62C2338BD701BD4ED36EE950A8F56FA5A27B89D3 Secret = 40F50D14ABCDB1F7CEFD80141214AD2E Label = D36C703AB55DE6872E4EBCC7 Output = 7475517CF0E49D1E7FD66E8DA4C84591DD56 Salt = 75851E941BB285B51552121761781C990B9BA59A0CC68A79C8EF11DF5D95DD62DED44290204A0BE9BED86A828793980C44867164DE6488498AA4EA718C66532AB1CFAF500DA470DA83FB350CF4311FD4F6BA62F9DA9B98BB8108A6E723586A572B790D6B1AFD01FAE8B5BE42CF1E4039380D1710 Secret = 9C5A561D71CEF14D3803CD4FED97B8F2 Label = AA49149F593BE5088D9D47F5 Output = FC3D1C6CDCFFB56A0A587B13D36510EFB59B365B Salt = CA72BA875D2549F0DFD7A42C1789564B25F9ADA8D7B3D84FEC409EEF9F98E7BB70E81280006D7E071117F94A42C40E569DBFEA7FD7EC871705EAA70BD81F88358068D43078ED2E2F39246131977B169FF7448291E6F96A31058E5F6940054A5659A9100A5387983DDC165A709A311A10EDA69F15 Secret = 762D485BE5F312DEEA672D37ACAB3A51 Label = F07FA717BD8C21750610A90B Output = C75E0ADF8DB178DF82F0534EE0DE883BF56A96BD Salt = 5B192D94B13C79BF4C71C35CBD2366F31170539021CCBC9B33C9B9E599E7E33E095714F9178EE1AE4D03E3B722B45C739FB884E8573C9E285BD2FF6B3EE1DA3A2265731A390CCC2415865C016B088FC29749B97452B7B05EA858E5D1B9A7A802B84A3A75F1A88A458D75487042CAAA3751D68C64 Secret = F3CC2AA44C8120DD85F1DBA528023C42 Label = 024CCD91B9A7C1EC26AC498C Output = 67C9DB03B753241518ED298B3107A0CD2E088182 [SP800-108-Feedback(CMAC(AES-192))] Salt = 7A63F38C461ACE19922C13603F4272C158BBA42F88B45DF82737 Secret = AA22B5E2F58B4F644698464AF2B56EC0FF00227DAF8B40F8 Label = DA93AB6F576C9A3BCD64CEB4 Output = 385D Salt = DD527BA1EC9197FE44670024C7EAF9F9939DE0FD27A314C2E3C6 Secret = 7DF5193C002A00983F7D55CB98DD7C781CBC342DF27C5562 Label = 0F509ED5750513A26471033C Output = 87DC Salt = CDE502829B935EFFE1DF0421FBC685C2029C52DEFCD6F988ED17 Secret = 17251AA14F3EFBA81FE3094B559F4FDCBEFD95F8DF908BFA Label = FAB326757A6CBCB0B31C67D4 Output = 9565 Salt = 5B9D92213ED537565BD00AC5C395472F8D8530AF5240CDC91BDF9EC03EE1EE74C0B061E0 Secret = 5A438F5F32DB78507AF50D5E327410F2E5C601CB393DFC81 Label = 0ECF1DF02A46E38E7B9DC389 Output = 0A361364 Salt = 214CC229BD6F110901582F39F20FFEF7DD58B97DC63D0491CC1545282216111E97AB2C42 Secret = 6C933ECA3CBF300F7D6A6FC67ED63817C61619ADD9CF66F3 Label = B636C5E28EC2E5FD5731F2F4 Output = 1AFAB988 Salt = E11021636304E6DEF45D56D5B78003D1711E516D4F2233E3D0423D0B4BB26C48F55D0858 Secret = 5BA166FA060C8CDC0394FAC755EBE536C897B2F08798F0B0 Label = E81A71518AA4E6E2175870F7 Output = 6A2C5139 Salt = 99AF0064CD22CBD33A055D0C010DF5CA9EAD070AC5CD5A2530BFC8509B9D906D3FF35381862EEC72E0768B7780FB Secret = F1EEA00AB6EA6E53050FAE37E0BB413C5474FBF2BFC5035F Label = 3495B36BB85A9AD07508D9B9 Output = 8ECACB2B315C Salt = 9416F6235B79D93B82D8BDF48F04F3F6802D92466CA6194B63AE4B66E878909322572DC595982D5F250D605089A3 Secret = 4CA0A26062A2EC7147635AE4065A9ADE81FED77B2A8AEC39 Label = F9DD0F8623527EBF1BFB5046 Output = 41D6B0226497 Salt = 6AD6D15F6352E1543CB4D0792105AA4B658BCC44AC7D5ADE18AF163DA8AD2E1E7B15F111C5AB9300C92574C45C9F Secret = D2164DB73768A4B11FD7E9E39BDDD9A8FC2AC232BB123F90 Label = FD7FEAE2A8CB0B82AC063D53 Output = 7364D7D82175 Salt = BB8D776470D48F25CF7829A0D968C04A8E4EF883CE1F4F855019421B67B308D43890F1E3C6F67AF928725CB6022C88C830DDBB5A1BEFF55E Secret = 258B028CE0500306D3C6B330BBE9DE9B9B2C3169709BDD38 Label = A880A37AF63ABB953018508A Output = 295A74E528FBF81A Salt = FA92569B50CAFA764B7DDC1BDE9A2B73FAE793DF8B6FDA7B74732DC0E9E6F4CFE7BA382506434F222057B1962EE2C5E64084E7371DC9FD51 Secret = 2489DD0E6176A50D4837ACF6AABE9BCBB96A8E0BC79C999F Label = 6CF72B6F7CDB7EF26B5685B6 Output = CDBE302305A8B085 Salt = F291214C446EB05C45CFAA0AFE704A5920804AD031031A2751EF8DF56475F97D7DBA351B725396700686FF168FEF58F778F2856078A38CE0 Secret = 99566395F891BFA0E13CCEF1F96A311FC325226158D7C70D Label = 7A7C3C45BE5055C898CFB783 Output = 92A0E21FDA176841 Salt = EB42ABD3D4094CAE394C089080239FD6338B2C903DBC2CAF5E183044806AFEE0FE479FE1AE5D10AEE0B28C60CADE39A615476A15EA25EA20B722FD31EC8B19CE2F89 Secret = A36535A13B7AD6419E7BC5EC3AA10DB13E6B9415717EB09D Label = B8571A57EB7708944BE6E500 Output = 77F1BA55F74D45836135 Salt = 8EF980C725BB9B657B60D4D275F5B58CA9FE0CE1CFDCED157CF921227E8389654E9571904BF43652DDE47429C54403F5E041804D810362ABEF7139FAC9DD575101E4 Secret = 1A9468E66DCE2583D85FD89A8B52438E7FD532E9B144FB91 Label = 445AAB96D54EF0EE41B9D454 Output = 392D27A002A709D421B1 Salt = A76F4E475D97282291E0CBB6440CD912254E87C1CAA70866701A4380D13A0D59C52991094C0B9C1B0A597EE7346A3B80FE7027532D2802B1C2D0D6199219CB691DB3 Secret = 12CC4B05203BD8277487DCC33AF1116C99AC2F3DCDD9A615 Label = 12ED2E96646C5647E383444A Output = 368398658F949321D86E Salt = B278603A2C381F605CA875CA14650BA0DFCE455A2D12A5800E51280B1D339982C276794247A11E7FBD1299982EDC381830BB373985B6AF12971F3252C3E69FC817E7FD3352AB87DD6EB2A468 Secret = 6F5CD9FD52FACF6CDA7409DE3E3BB109FA18574E7B80D9F3 Label = 7E0F436129EAD3FEDD7814B3 Output = 8C00586D2B0C85FAC5B870D7 Salt = BD0837794444AAB43E7BC80162F22D97037B6C6E624447D8BD0139A8390D711188C3D90444EACFB67BBE16A23D788FE4333583FD1348CE34E3C6FCDA68E53677E71D077FD6D864DA3B49C2A5 Secret = E5E25361936866C2F56A0A0D437263C6D548FCFF0D716EBE Label = EBD30B62E5B188E541B7FD2D Output = FF1C85BEAFADF31F0D639E7B Salt = 344E8FB0E9C96B47145D4C47D3351F822952BDF4AE36C235367ABBDA2A32949336033DDED47B17961A00065B525B2D81FA7B8178F42A1890C7F3BAC1E503833C0D83FDA2B78C7458A5ED06AE Secret = 16557D6FE11E5FAF952BF7A89C7E1703B508BA147AC950A8 Label = 5C01FE984643EDC8736015B9 Output = 10CCED14E9DD57097A85E330 Salt = DA1FEFA0114FC23128F122891FA6520FA612501D67EA59F0EBB68256633EE4AAD3838D5163317413A57B2B9AFE4FCC4BA3E4B67610B57DBE28C09BE2746D2B7BA34BE4B0A9FEAE901A105FDDE061C26C2BC13159888C Secret = B5EBB9637C127EB81A005D74A1631383827D1A6B7264F9AB Label = A9392CA2B1C0883F2DA59B52 Output = F9E7CE606F2E97046513803D8DF2 Salt = 35B4DEAA328788D2D7FBA8E67498E90DEAAD64D49CF05587D6CE61F55B9A11F755EDF9C8EF87134E43753CB2A486E311DF2FA564A26B09B792526E17EED27BCAD412EF8BF9D4B76CED1159097CFFB23FF7A86564F349 Secret = F06CBB55820E8659D1BB68001FD97BC54EB45EDF54655275 Label = 8FF63DD0CA5D6DE422F1D8A8 Output = EA0BD8256E6CC16DC7F9D8DD2393 Salt = E00168593779E145B48A8E831F52717B5C2897E66989E07C3E5C5652D052354801D47D6784E216FDE6268DA8FD69167EE0AC9172487B0E5521B15A86AB006CC26C26D6B80F49A8F1AD99E7CC4E6AFA4384E173858BAF Secret = 6ADEDC34E35C1A5B5B7F17E8A35E9E6B72337BE3234A525B Label = 50FEF0E9B2AEBDDB872C3B8C Output = 7C6C63A6BF83999BEB2D10C35CD0 Salt = F4DD9B8F164987955C4E8F95B0F32790BA52EB3F2E022EB114FD1922D76B3F1B9FC4473D5B2B067A031242F9BF5596AE71E3713EF5BD7A982EC520B2EBD93B59A64BD7538E2F322E95A8777F8B4C2374EF7DF7E16AD71E598D12AD57030C92F3 Secret = EF4F55638335E4922F7E5B62D44D9DC7870B275A2F90406A Label = 15A3FD9C3B0C81FC8B32ACFA Output = 0D01216F974748F990B016CC9F6DC7F8 Salt = 0BB59631D5557C5FF519538A37484D86AC989A3DB6EDFEB0FCBB127084C95655DBCFBCE139A8C5664607D93C71785C0F5F0526F0A4E26E0749D088037032124100B7A183F1B096221F0DC23758FBC373EB216275BD9A2AC8734E30DBE5638AD9 Secret = E983540AEBC328C97205B30F4C191A3EC5D6A672CBF89234 Label = E85B0D6E88B5530A30BEA6E2 Output = A762CC74ACD44A5BA4E1CFB2ADA6E12E Salt = 0C9E2822086B6CB68DBA02FBC4AA78FE1CCD706103689DF59448CC0076086B76B7FEB472A54537DA20CFDF48644228860044CAF2191C3ABDE2BE5EECF16F939E61EBB7EA82B9E60D1CE0DC08AB7342721C8F625E081185A8D3620DBD5F58DB95 Secret = DDCF451E111C7199C3391F00FB28D7217998BC5F67ABA99A Label = 97D3AB8549242F85B7CB41D0 Output = 4A247C01EDC0336B904999E6B46BE97D Salt = 2A21B45481C56E17083A36DD368255928AADA9E778621E553C9B3738AE7D539CEB8CA52E9B165CC878014F1F2C8A03814A0A59CD8DA7C43AD713641DD4146AFAD5E5664E67B8508943B765BBB2F7F807CEFFCBCB7ED80FB274AD80BBE1F7780550D07DC4D8962F89002D Secret = CDD70F27EC9C76CAEF4ABC4D465AA51D446F81861C9BA68B Label = 5C6C72916E83750A7A7DB228 Output = 355ABA0EA5FB08081DD0CA4886B276B501E8 Salt = 1A322A8A367D254025B866C546ECB68F3EE469DB156117EB50F4CF872D8EE36775ECFB2B810D544E468C19E5EBAFD436A4EDEB6F6F2A0DA73B7668D0E606389B5DC6C155AD06C7883DDB5B71465702928ED601DD471A2908BE7868456D5C29E4DE8E10C48E6EE3487F9C Secret = 5DA6C5D2E8F21E2D52720A15DFBF025860C4D780259F2088 Label = BD2F60A6742D2D487D3160A7 Output = C33F01DA8877E24A4FA12E845C7F38AAC94E Salt = 557C6CAE5CF3F2468E37E46CC2C22D2A2992EDB17B62A71016049D908A75DB177DA32D32074E7089FA8F99557F595D5F17281E52E5911339A95D21E728704D00948BD9D5A566EDFD31AED98F91BC522BC902BFA8DFAB75B359D4384AAAFF2F2A68C9B6983138B66B7CB8 Secret = EBBDF5FCFFAD290F1A024649919DF64551D4A8F5979E7850 Label = B25AFA0FE356C9E8C62E3DFE Output = 2EB920F32742A62C716E068DB4C7BC733F6C Salt = 63E4120E71BBEF8FBA2BCA83B155AE9567E42063F97C6F7EF364721526092838FC5557FAB7456AE76B27DE5E8896D879C2CE35C640712FA8B687E4BF0C24BFD2F16D106B67ADED76943F5C9D63753882A5CDE87FC49CEEF62819B86B2AC70DCBBBC8D77354187D9B3125B421051F596CC6751B3F Secret = 383BC4A6C080B165DFCAA1CBB21ADE4EF1F449A4BF31B219 Label = 1BCF800F8824084AB7A1AF7F Output = E5848CA0246434FBAD939744763B7E4F0E393665 Salt = 6003DAD34AA4435E7545F817F7CC416CD36995FE57ED91CE5BC892E37BEC0742F45601093110A36103721187ECE764B9796AB764A1649DB32CEE991F84BDE304379198649168CE8FA57C084E2CEE85CFFA9195CC63227C01B5C9BDD1978751DFBAFEEC8734101F57219AA896F7A9F6B41F33414D Secret = 4EADF7323CE03F02B404758CB150B7F78050C8C3CE85A1D8 Label = F97F8692586E9D2C607BD2A0 Output = 3A51379A39E7A94E66966614FB7462B70F0EAF71 Salt = 4F287E8765FDFB4F62DB3AA0514747F377DCD140F8744BEF26464F5CE841C34DF312C2E2F3CBE9BAF285B40F8A5FA72E76C5DE6993C9A2D3C5ACC8D4D4FCAE586AA66B11773A07F86B1846E4A51EDBFC55334D9D1EC21A80B9F329167DE8DDB72AB35A0E5599DD650F33CA0125315DF38AFCFABE Secret = 49E1058AD61CB645C58B5B136B1F95EA7F201817EECD6CF9 Label = C6F2BDA8E80B7F9B65572FD9 Output = 4CFAD3D6614020BD358BDC816E74653450D2006E [SP800-108-Feedback(CMAC(AES-256))] Salt = C0A863D41C29A55A7B5E4BD9163ECDE7BD27A8ED3CA1952FB16C Secret = 6F6543BFC23614845A0A41541313AB72DD8E5B56A463D6D8CE10D73307E73D5A Label = 0339133AAAF7DBCC49A1F41C Output = FE44 Salt = C083B2376280AB4A9BE026A2B571FEBFBFDE571E3AD06497FBEB Secret = BBA433917C4F150808274C9508883C6EA5AC5FAA5CC187DF490107310C8B2FBB Label = A3CFA889AAF42D0A8CE8CA43 Output = 9FCF Salt = 12B9F83EE8FF6C5D3343403CAE1553EB780D1A9332235B3D39EE Secret = 008AFC20771278F46AD3AD38BBDD399A7C8E6DDD1C993461F02E1FD0CCD47470 Label = 6D9DE1D6F379E3783C5992E5 Output = 7C39 Salt = 1A91E1FDBC7AFF6207A927B56C3D6DF868083F3AF77EFF0812775E15D4B4C243C68D464A Secret = D77B7BC065330115051362D0405B20039F53B394B1E82B0EFEF2D97DF771D812 Label = 8D98E4C60FDCA63180D96392 Output = FE002DCD Salt = 02C4F92461C2EE216D75E2DCB04EE53706AFA8F5E6BE977618029F0C61AE7FF2B1B60A2C Secret = FC7AC0CCE66A7E21E770BB6F6EF51E2EE699B5E5CC0C89B1F309EBF15A93ED06 Label = 1D65A89BF1745991ABFE7893 Output = B981DA91 Salt = 04413A62BBCBA17B063219F3D565DA3DAB30336B93E8805ACE3D4FE0DD75AD759982FA4C Secret = 58D44DDE413C24AC8399FEBD812F4117AE76BBFE42C4E9A133E329F1E9D707AF Label = 17EBD7F5A282A4CEE4C29FF9 Output = 9C068AF0 Salt = 7803FB4425B6DF93872EB3EE95DFBA4FAA31984D1B986AB1B2548BA97B58C08D2463C0B76C979F72F6533E1A0C7D Secret = DFC043EE52FFB3039E63DEA43485AE71F8175AED119E15FCBF3A8C2ED8CC843B Label = D39E4986150F3E3AF174F87C Output = 2C1389F101CC Salt = 635168098641B6C7E617530D02EE2351F3F656F0EF9A4037939469272E526B2A5124EB20620E569BC4323C7A81F7 Secret = CCB85525E6E277227768CD175C5617F1E29FFB5682007FE2A824C8D824F0A707 Label = 819C10DAFECA4449DE0535FA Output = BA202CA2BBAB Salt = 64E47CDAB5C53F86D26AB3F2865BDDA01A7C20B217AA1912F8324BDB99C0F20BAD1AE7B339A0DF9CB743BF874D27 Secret = 0A01C423049B5CF7E5455DC9E180FDC8317AF700D12B05CF7FEA1C87E7525DD7 Label = 418A5F2C5A59170EC02F066B Output = A908DE9437AE Salt = A217990015BC82B21E4AC97284AEBCCFEAA479EFC89161730667A4195D349546153ADD28D5C3AD227EA6282433D4829705F03A340C12CA32 Secret = 3757874A56A8496E38B23991C85B91271770E5E5B884A8F3E18A36B44878BB91 Label = 823DB10A80E9EF8CEF839CFE Output = D49D1D66D0353C7C Salt = 8CC3CBA884D6BDD21A4E3B5A831B80DBEF5C3FC9A83707CCED54C98CAF03DFB26662C2C366C3DBF7741FDFDC3D72AD4DB30AFFC480981C6B Secret = FC996EAC40CD6FB4564B507965C5DB6AF6648641BDE952021BA864855DBEB6F7 Label = 1BDBC4BC4FFB59DD9A7C6575 Output = 2AFC6C51583912B3 Salt = 5985C68B8466BD977B02B565909E4C37FB787B7498C5ED1FA18DBECAC96E7EA3E96F9FDAFC7AE3E167E60A33C10F69F5A74BD43FD28A411C Secret = 53599869108CF4BBB6845F432B50715D8184D2EEA6F89E55DBE4BD1757E2FC58 Label = 51E23A5EA4D871E1DA8B5499 Output = 3F5FAE610DD6EC88 Salt = D6390C728E207C73EAFAB25EBFC56F9F96103EFFFE335F0915E7197E43C5A8EC4E9553D5CF8CFD79B3F517BE9B7EA36D655C9C38C0A1CEB25F14787C4D948F9DB990 Secret = 5C900CFF79A0DCDF15A66B362E029A1563E2162127F09EA8B2B5310CF9CE1225 Label = 207F6A3D7E59BE78EDE13C99 Output = 9AEFA6E8D234F3257052 Salt = 624B1D6D3CAD8F4F005F0A6FD7E36AB34B62303AEEBA7E0D1FC22FC3E2EE1FF787C3B95FD0AD854DEACD1D47F00FFFC578BF62EBADB4DD28E0A47D5E1456D7C17272 Secret = BC135F05C1FB3916D9C34F600F80C0B1A4F18822265BEDE674A2C9EEC3EA3A95 Label = AF8E368C7494B4E070B90F42 Output = D292A8C22876386F90E4 Salt = E92CB280665866427C20698C94F7FD8A55D51453FAA598D127E293C08E3E68079BCD98B35192F77AAD3896963DE4A5A99A57CA42316A518BCF44CA5D964A8E10FB3D Secret = C837BA8209B560C34E1C5F6B21DE2D98E804E644783803F55BF903BF8ECFB307 Label = AEE43056DA1353651B21BAA4 Output = 736788341C6624D08E2A Salt = 3D9D95163908A4F6FB96D3DF308E6C85CD6E36EBC37F64626275C4C5D5258542980CF54FA856B375451CA71646D00826273235BA1969217F87CC980211EA0CF015A2400F657EB9EE03E1169F Secret = B848EBAB739273F4CF4CEE31DFBD96F875077D8C18A4118E3A11051072948800 Label = DCC3D62CCCA0F03431D8D26A Output = 03A96884241C0851450E2F43 Salt = 22A5363C1E4B21623D8E0D6C9398E936A89245F6EF34D623F0609D839865F1D00CC4A166C8D666BB8650F06DBBE10278266CB42C181C3A9A09ED9A48C2AEFB358E80FEAED4B132D36719449E Secret = 2803F3EC2086FDEE6DDCA5592A35527CBC69E2D363A03A3449FE1C85FF9DCFF9 Label = B4A06861D7E6CE310C763348 Output = 113732FD2641727CADA20826 Salt = A976D5810B7D3FC48CAD78BFBB09E2455569893B0CEB0A29E710283235689A2E21159DC1556B226A52741509FD38F68DA2ADEC088F4E8F1D27108B4B0765C4F33998A9888BB2B251B13BA709 Secret = 0208D58AE4A1B728F8524272C37ED97CBEFBC8F7E913142482B9101944E909F7 Label = 3C32669EAD0B9FE957268057 Output = 24A1D54EAFDBEA28E196F23E Salt = 769B21F3A9892353600B45BA302525C422BBE05038BD69F4C5E938D6779D85D8AD57BD5B7137E7F33457F9554F326B911F92BDFE3D5F0B9FA098072F09081F5EB6A962D5CF0D6C0BB8BDADAE9FF88AA16424F476E822 Secret = 54A47D66713B24C91997D1E563CDA611DE9B3AB8C82916B3F72B32BB4B8FF84A Label = DADC464042607EF108E42360 Output = 222FA814C740EEB9DC8BE75DA456 Salt = 3329CA505C969CEF7C8620360CC8002358A0FF9610F14CCD4453A17BCA276CF679C5E9B6DAFB7360466B4504E32D1A84663DC0764729BC2C9EC34A515DAB8E767CDD9E1D4BBDFDFB7F2C8AC4FF5E8B8BB391DFEEDE25 Secret = 4FAECA2D110DCB986D5A679567B134E32AF70D46A221D6B80B9A2B2F32C8D14D Label = ED17444202D6C0CD893008E8 Output = CD09ABEB77D128C6BB54291D92EE Salt = DBF32CB91ECD63C9FCD3B907D3071DED4B98AF51400050C85F57969F6BE372F0169CA5E3DD25D5D9332B9A1F859F1DD8C36665D810BA05CCA4642E2671FF0072EB8E969E38F7ECBE98F4C580055354FD44F17F5C8074 Secret = 5940052BEF0E1D5D804BC152C5F61D2DF9F749F3C2554543BF34166CB235A757 Label = F08134404F9C8A48EB171067 Output = 46CE0B60866FD7BB2AE4C5230D83 Salt = 4B0C3383204C91B5EEAB9C29ACB0F574C021C229AC704894580A73746C6E469B184E1C2BB9B005B6E7855FBEFAD809E0193DC29D2B9E5EE72415C19D79795CD672B600C908F4BF6FB5414A560C364D15AEDA33B63CD190E2B6E6D3E92DDB34B5 Secret = C4343577CFB89462C4ED767ED87AFA576D45AE884841471B63239634D3583D75 Label = C23653C1628357DBF0A8B0E7 Output = 5F13C4AB18EE5825682611C4E2B843CC Salt = 8363A69F650B0AE74C1DBEAC6C92C94B2D9092675DECCF115ADC001CAC6CFDE48191D31A51AA48F9C246D2969F0C20B6ACF2F57C186C25EC5F81FC336A31A1785CCE1111CD1390D7C1B07054BB8372662B901AFD3F8180163A8EEEA11FC55A1F Secret = 3B17FE8B7EA4825806DD3BE0A2E16E8E7DDE9008629BE37B4A090D011D8F7430 Label = 2AC625C5EDD44E5101CA5349 Output = 522E19F527B933A4DC473341000EEB39 Salt = 4D57C1E0824658C3F531A8059D1A299F9FC92D2B459FC960F6DE764066B39D567C2ECD830AE85C860DB97DA6186B6BF36918A5EB997EB41B22464B8698A7ED4FB146A4557B23A14FEF4B0A9EED69E2DE90D97D646EE30215970F324D1C1CB11D Secret = 3BC327451E4AFB3CDF21AAE50D0655F549231CD31C0D83F75EC00945B40EDAB2 Label = 110FA488F2054C7084CA5D6B Output = 86AEF79952314EB608BC693F43FF6E92 Salt = 6F72CB3627BE5B5A49B979640D08EBA0106E306C2809A94AC6ABB15666EBF259216151394DCE5FC97149D3156EA1D38D6F692D60506ED9B680B2FB0CFAA88EEDDA0F4C60E22359917D34B79AD7DCED7D9F4E5B800C5E6C4783BD31DC8BD46D324C63693F349BBCC41E34 Secret = A4E7CC9004209DB5BBED9918CE0FE6F2E808528B660FB27E371458DD0288E466 Label = 0B0361EC924B22B7FACCD703 Output = 10DD052B25FCA21C95B1C082163A257E7379 Salt = F9039B7FF214CD97C5E4776D7C5D570DDA5CCFABD3037BC203C5ACA831ECCDED3D4A8A581B649C88E85FF9193B2D2D1E46C942AB5B1D4895196372C3F759929ED868CE40128A10827F85A993A938B18E80E114E1B7E40F8C2DE0479D4F5A179E12BDEABF943471D62F88 Secret = 82909A7F6F3140C20ED10FB7F76EFF29675B6590EE3176CED695EC0BFECE979D Label = 1D5A0730DB27887C827D20C1 Output = 5B776E25655E5678A3A511B36D9BCD801D61 Salt = 72F25CB9AABD52CF767752DAC08C393EBC1E3F56A0D13EBF5B87E9069B82B8CDD61361F7E8F0042B917D99878CEA8F9D3A0734FF05157CCF7B9F033907DD924BC1BC6944384FE1E508EF18519B36B3BC98556F429ADE742E13780A89D7869561478C784ADA5268182066 Secret = 973727F10D9E708F1772E8537078366A9D5D461EDEB633754AFBB4754D001A06 Label = 9E9BD7B505061805AE1BF06F Output = 07224EF6F0CF21EE03E55C0DF2D2174DEAAD Salt = 6CC4BFB768DC0D2CBA8210FFC1951EBC810CA69E280315EAD718C41056F59E7BF9E42CE5A25A0EDE1903276E9772B79D4596829408F4CACD9350E2EC9D1CDF4A138EC7C935F10606BFA4AD419081E5598CCEA21A8513E5DB150F956A25BBEFE6E43A7473A9BB71E0254AA5A9C8F2BB4F25E1FA24 Secret = EB1D7F13D9631933C5C193F1BAE8FE3DDFE48A8D956EAA950A90B1632A82CE96 Label = B260AC15F242A47C93DFB28D Output = 786979D7A7C804E5BD1193D3C6697039706762D7 Salt = D0E4425877B4874D1F1AB302A9B9E6F0F0715766F82AD00F3D97FBA0906F0F6996EB652555521D4663CC95D6586EC13811F55415EA5BB9DED4C39CF32518D3C9F0ACB7BBA8C65FA2BF706AF96D033A02EF32618A8613CFE733C59BA3BB440B3FC5E7DFE969ED568EC7267B65D4853A5649F61BE8 Secret = 26C4F73C7FA29DF6ABEE1B8E6A4B79ED8E2820372FEDDDB861E48BA28509448B Label = 9FCE146203D20893C0C4CE26 Output = 3FD993B336FEEFD35820CC3B78DD1702E7A15F22 Salt = 9B61EC23FCF89990907020D49D9EDB07BE56C4A2E75B259AEE637CFD0B3612B82E0DE740E4B4D1228460A350E819386A523D82FE87F02AA8AB48E7D7718AE468977D58CE63C6ED207B6450D3AAAA291B327485F45CBD5F0AB878872594F76287A1D92E543E1F2992B30345C51623C8BFCB6AD065 Secret = F32826272886F1CEE024CFA5F1749F4546C9BF59F1C28C0B313499CAAEF6EF5E Label = 5CF081CA93DB24B47F664EB9 Output = 5FD94AD5742C20984276A5E6C61EE1897E51D436 [SP800-108-Feedback(CMAC(TripleDES))] Salt = 32087ABE1B9A6743612DC521A3FE08F386FC Secret = 75231DA5F474E080DF17D0F64D53390BD260340CBD40C882 Label = 9B9A54C58AD89DAA234CFEAE Output = A068 Salt = B02005C8C700BDC56C2B7BA8958DE957AA4F Secret = E0564C1571EDF76A01C40B212CE8E5726BE05A7915E55C02 Label = 9D2BD10DC8F89BD7598EAA2A Output = 5BAA Salt = F5E5D7313E6EF6F159D1537031E2C7F39398 Secret = 6B0A8A0A06E026B116842EC927B624F91CD4E5D6AC3670FB Label = 9A0F0E129BF3DEAEAC91DA88 Output = 6573 Salt = B3FAAA75C71576A66E60638E316A34A011C3788AB794DE521A64AC4C Secret = 6964BCEA82C3BBE5442ECB68A8D8ED5BA2585E7A5B7944C7 Label = AEBAE3BDB7EDE0E583FBE482 Output = C56788EC Salt = E6E110E07E189830DE681691909125C162004FBC5EC5979FDAC96CDA Secret = D686AE9A288CCA81CAF8828183165ABCCA32C779683AE4DC Label = BA0E5A59DB9AFB880D3DBA47 Output = 2C03A283 Salt = E6597435AD13A047EAA199282C80B4B3A015594BD2A5B9CDD88B1068 Secret = 88D5FB0B307B138E0CF9CB6112601D785427076E77387212 Label = 6C1078EB08EA9E63CF02EABC Output = E2BE38A7 Salt = 53C78C92DF22AAFE2EF558B49E21A5E77E56C6634870092113EFDB7B9D2FBA391764BDB09AAC Secret = 4165E36C20A919E2C55811D2A1E093167A4383B67D43D985 Label = 42931CECC45A69597CB857EA Output = 5B79FC90883C Salt = 99E4CF26D69032FBFC543F954ED2434B18975A1507D02521D79E504CE8C7F3B350E66DF43D24 Secret = FFBDA48F150611BDF492DC41AC25E9132007739B183AF3F5 Label = 2417E21CA65F6C7D4E7991B8 Output = 6651AF5067F1 Salt = E5BEBCE6D665C5E45C2803C64BFC3661BD4D4362B520DC6681806D410FEEA34F40086FF1CB6D Secret = 386122BFC094195EC3A2E5B4A8303494CDE1FAD1A9FAF5B5 Label = 013092F136CE511BBE441EFF Output = BD482C3323AC Salt = 4F43F8196A030983851C9BF0267D5D4448D2467D0D0C8232443DA0484358FF19EB1AED785414F5A1808BCA0C6B2745F6 Secret = 7A44EB1A7F433338DA8A8BCF16644C20AD2CB46ACF54CC17 Label = 210C9AE35D0EBB58E928D8C8 Output = F6EEF5F2A21D717C Salt = 36C3E3DBD7EC824AE7D0036528625C714473FB142AD117541DFD742BEED836CC2F693E7C96210892CFC7B5B9C28AFB11 Secret = 2552AEA8CD042A3CA348A6AAA64A591B8BD9E50884306B29 Label = 8D36EA8A1018449D9E4EFF55 Output = 53F32E20417156E4 Salt = 215C254D1BAD1710715C26C0F7A841E0E8BAA567708EAC34A5EFA0C75345AB9389304615F8A35E617F388E5BE3D95A49 Secret = 3250E691989C49CB7692D9A074469986724D4A053E09288E Label = 629C60D805BB52A139066DA7 Output = 42D01A621CEF7A8E Salt = EC9030C4959D9212D17656CD24DB7FC0CE9198FCDC7B29E1ECD23447FF3DEDFDCFA4BE0F08A1FA15178AFFBA38B930282BC4F082A0A64DE13814 Secret = C55D54663E291585AD5A6B25F9BDF001A31ED6FFB62D61B3 Label = 168416699E2F23A9B29B0D6F Output = 96BB89EB561B153B0377 Salt = FA826F1B319E8A17ABB4A87679D85BDE2FA99D73ACEF68B1161262285EF63130055430C76B6AF30C34782C9F5227B556CD6754F06292538FD774 Secret = 9B55632283C203611A8882374A33A295D90C7D3AC8BC2FAB Label = A288CAC2ADCDA9F6EB248A96 Output = 1A36072319C420CB5900 Salt = A07C1693552B8ED9DD32C3448A31A266F05FD02E689C8B0F891D4B79583939B6222BC804B31BDEB7303DB5F20EC617615A1640D231E5EAE05D83 Secret = 795E6770392AB16B95E7EF4D4316098AEF53C9DFDE5BDBDB Label = 2C0DFA36F010981CD54F5CA3 Output = 0EB538865D8EAA35BBC6 Salt = 6D378782A77717AB21458894A7E0A99C78F2432389FF1BAF963CE00D774FA1B6FFAFD065FA28E5B456659749D40F7C09C1ABA51190FEE768327FADACE22BCEAEBB38623E Secret = F068F50F96ABD55D2ECE23B785E8AF3FDC3D612F765EB8ED Label = CF5EF785C7CEF26B939CB504 Output = 9BC79E4572197CB99A788E4A Salt = 653287700DAB16DA5B473BC55C53B1F3BF19482D156085852EDB0D20012165462C0491DC54E0AA41024423A19539A0FDE01C8280968C3340FD53B1034CA99A34661A56C3 Secret = 0F5E9FB58FC49945FF30D0AB3FABE54381F8E685E35FA59E Label = B3924476F4F8EA1E447B3F9C Output = 22ABE2DAF85F56B3D6D2D074 Salt = 3F1C0A346ADA7DC39CDC1DE29885F990BB2BDF9C8932FE4C762130754516438298B47C91B2F637C9D31B1AA7CF2862C3866E186F5661AE6E22837D8188FAB3BC3665B9E6 Secret = 084EC194A63BFFE4AB2196C7C72B1858ABCE1BC1325214F3 Label = 42C0E618DDD27DD4AFDD3749 Output = 8353951390E8971F8035CCBB Salt = 6B9907DB76CDB55B224DCBA80115652BE73095A06129B0705143242CF2674621D7068C616BF6B9B27EA932EFC0DE5822146418BF7BA83BA17A435F169D566B3B8512D84BA035C451955721FCB1F9 Secret = 580D0BE71BC3D350948689159060B2C6ABF1AC8BC8DA1C27 Label = F6096A799ED6CD183A8C86FA Output = 8A3D56BFE5A11C93292356DFB5FA Salt = 2B968FE94A2CE34B73CBB9B2FD68EB75887B36EB32A8A4E1139DB9A874BD6E700110535D20DD62F2F6013FF748B3C296F2A8FE1417EF3BC9DBB81BD2DA700FA984BEBDBD990EE4B9E7844C4B6C5A Secret = E894D1A6392A554FEA4A8B0E3BD4D189AAEBA367DCC197EA Label = 1C33679739D98A8D327D237E Output = 7DC0FBBC3DF685A4B53793A559CE Salt = 25561A2BCD0AA703AAC4A0F68A80C04BC54350DA65643A57EE10F59004F64238500423CA675EE514C79F6027D7E90F9CF15D400206805F1AF0D06D6E1997AB3429EB94611F94098F540E326128C2 Secret = B998A06CB8A27231E85A9CBE65EF23396E1214D2351D8E22 Label = EEF5F1379A9C84444AD48849 Output = 70889E7612E3BB596B635EDD4F35 Salt = D08660AC8D652CE041D429F9F6A82CE6EFF1E4BC0C784E7980F9FCAC6EEDB766E3BA672DB68782AF8624C5ED4367EE6A5A3D7104B9B9AFBB36E369AD909DD9ED9F4F61781BC409DB6EF9DD83851DB98D265489143D484F94 Secret = E335A70EB5735F9654D3420515CD8F507903EC60CBB78D0B Label = 2457FAEECE1FE97DE614DF82 Output = F7CB1CF7700CF2B0F93A112F5BE6B4C6 Salt = 2658CB560020649503068BC2CCAB31608D72F35440C6BD906224F79A91BF2254B009C1F0EADA46C7F1937BF310AF58222588008699134207CD29C8871C906D1950C4B164D7576E07DC0C5746B85F61DE827DB62FD280681B Secret = 8D0FDE044FB7E3FAF853B49C306D9781870F3A2B4AD9A47B Label = 44A7A3ACAC6A30E69DD7D913 Output = BD4E5EFC31EAB6A37F5D4BAA61EEC222 Salt = 7D5C6580CBD64186074D3B6E137B9BD03F494D4A0EC6A20006D1EADBA663351BFCCEB3FEACC407E20CE3437183E9F3C28D9DF7FDF42955D66D54069EB660BA81B9CDD4682AF8D6C2B795BDA32825489A4538F4E3F273546F Secret = F258189D12FA7306EB5FAD1A8CDF3D7AF1115CFB75E84096 Label = BB65C9804E3CCEB2CF1AC503 Output = 95922474EDDFB1E7497C871BA0B6B723 Salt = 7EF9167343E7F98256516DE4DAE69388DCE4BD03C8E38FE6E7E39402EF72E3A2DA62392ECD7373F9BBC1D79EF191A40D3909ACA29BD883FB551008256D33EFAA46532F21D600C066001657ADF7F0BFCF83FF19AA600CBA1A7A5E78EFCB5E0CA1AD63 Secret = 665A8C9DC32FDE0B12F7F7794BFB742EBA06C6EFD10743DC Label = A4A13828F0F3C411241B196F Output = C4378ED35C49A9CC4739F77226C500EC26EE Salt = 26C544C34F4CB6C59812C4C1C92B2321681EDEB3215E1DA3297DD13A0AD55D6B77C0849D6480C61043168C24CDAE287F04C1043E6E3CDAAF004FB5EF73068B99ED4DD58D271BAED55DF6CBA1B4B5FD8FB5838C9BCC1F84BF4B7770770677601CEDF7 Secret = 4FBDE9A33163FB529ED7F9FC4791DDEBFBA2F34719C8F327 Label = 6549F486CC5017B5283616E9 Output = C06352AAFC59C3942D7A0644DDB23A215F17 Salt = A54940F649869F315EFBBF5DC44DD6C07CB88507757C9C8C33D6E4E4A0B76699156899B28A58EF5ABD16CB091893F4F47F5807B7435685F5DAD54D8F2F72BE1C256429A1F1C66B055387FA65BDD49973CC3C52F6EA32346F3512A32F3F980A404ADF Secret = CAD90AB55C832EF7AD62979C6B33A978D4A407DBE6D16327 Label = 43EBA3FE5E92477F6367F7CB Output = 7199112B6ABF2BFA307D8035895A93E3874C Salt = D39816670ACF393B86FCEE4958A84A7CF6626DC253C9F09831048E70EFCFCEAC3F04858788FB5C4F584109565D0352C689C3D1C8E41ED8CC86C2DA759BEEB3A5411807B50C181EF78FAC4579B135EC7BB8BA6CA5061B49A27E63340F6F8E58D4A95BFB913247573506C1C650 Secret = 5CEED31D85E5C6B094BBAF582C1C95CA6DA6F5B8B6FA4A4C Label = 466E9FBBBCB27AC81DBF3EC6 Output = 43FC5CC0093944A7D709320D3FC6711F36D5B0F0 Salt = D74BC28C5893835FF9FF76F360CE55BE83C064735F11AA6D349CF9655ED4EDFF91D66ACB3C78363D18D7F03CE2A320BC6077626AC192671BA58DF112CDCC0A606495496017F2C9F37F7D2B3E5DFE6719C9207208E86E1A16CB63C22B9F3E967C5A18441E5C4E37BA5842DFE3 Secret = 98DD59ECCC93F43C812E7A1343A8E439C31C60064B2E5BF1 Label = D57219A8C5A18FFBB596E4E0 Output = D0EB698A515B5578B6EC0D43393BA6E33E2001F8 Salt = 1C29846E98543F350B9C519E404A67F1E6540F96440F518EBFDC576FD7C0876A1EEA813AA91D3E1DA6C33C9E242C009CD43AC83227B1B41B0E1904CBCF4105020AD737674D7242281465065C296DA38BF868866F28E8FB354B460C47D463F3B88910ED62A114CF7E3EF6EE81 Secret = 8E219F8FBDDF5D95BCDD7C3D4831B2A41FAFB304B7E262A4 Label = 6CD15FDBD4A346D581C90488 Output = 370A47F02A08BFA937172031A2CE4C16689013B1 botan-2.4.0/src/tests/data/kdf/sp800_108_pipe.vec000066400000000000000000001720461322470703100212150ustar00rootroot00000000000000# Test vectors generated with BouncyCastle [SP800-108-Pipeline(HMAC(SHA-160))] Salt = B65A30885B0849C7099B Secret = 63CB90F9CD34B95007277AE6FC17FB45A9248725 Label = FD7DBFDD60FED4CADA6DB78A Output = 4B0D Salt = 644E398DF79D9477A706 Secret = 954418FCD0EA5B6800D99B5502AFC98FF7E9302D Label = F441EBB9D176AFC02CA826C6 Output = 17F5 Salt = 6303AD8D6F85B06A8133 Secret = 486DEE7BF8590AD8146F4419131A8ED35FB67407 Label = 1E1A50A04838FD3D15DE70ED Output = 096F Salt = F83E603F89642D588C6FB9E8C8149DC7EE8C2697 Secret = BDA9E80BC702E527206ABEEAD5AD0FA9615578DA Label = 5114C31AC71149514C87F540 Output = 9B1C6672 Salt = 35D355DE2A4ECB451BF7CB3125379936A37432D7 Secret = 483D123AEAD1F1BDF9041A030603B8432F0FC795 Label = D5886AB422F85456704F73EF Output = D820C666 Salt = 4B1AA202208F62A09B81631A5A4D5D03D6A073AC Secret = A56DF8BDE95B1F61019B9F191A815E3C7E18AC92 Label = F053DDBB1AA66D25B241FE51 Output = A3299705 Salt = 5AA081F74B0CA42BAE02876987FD288AA8ACBF4E6904F05AD5C42039A08F Secret = CFB5C300A7C47773BCEEB0FA971AABD9AA1E0420 Label = 2BF55EC12AF4CDB48A38D89C Output = B8E3A091BC54 Salt = 686E573FB28A6EF66BD4A5E337668FB120D397F3A3C71B425A7085AACE7D Secret = CE6409FC805759966BCE76F3B5EC1335A500BF42 Label = 8503E552DC474F3D2E957472 Output = 979F437B7DCE Salt = 903192A557566F518479E18E5DC37421F9D1A89077309422095C6DE74A08 Secret = BC79C2F0B1A414D54AAB32AF397A303F7005336B Label = 61DDCD43EDDB5718B22BBF4F Output = 080EF359C09F Salt = 8D2158258B2B786392DC171678132E21C7AAD3957B90EC3C786D7F27E9D1FB2B59C8454FC3494C6D Secret = 632EF388D56D4D73B96DA0507A167D4B2FA7A3FD Label = C853B22834014960BF36CBA9 Output = EE7FE931F1E09CF8 Salt = 83881C042A217E30E8EA91EF612B2FCE40990A8B64F208714A9E58DB65E0EDB03B1CA4F7AD594DA1 Secret = FF4188131F4F5C4400CFEAFEBD3277EC2BCB96DB Label = 5BC7020F1D84D52ACEDBD444 Output = 49ECFBF85C039D46 Salt = 74157D2B43E957235D679D28686B64999E0B3A0CF4A058A833310D4888F2F800B2BDA7B5460C1E67 Secret = 09CEBE9B6041FA90A82DF24258A322B1C6CAE133 Label = 968DA3AEC9E461B6583E428F Output = 8DAD9CA8EF0B2B87 Salt = 95C9141A7445CBBC6A6EDFD9CE191F33E34BCBCFA3001F0872E1317728AC1BB20660470A9CA0301C665C0E3403C993706440 Secret = 34522A42FC23DDB4EFC05A38A8FE27C59957BB28 Label = 6F47468E1BB9EE3606CEF5D7 Output = 1310B397D09441AC1E38 Salt = 2A1D624E4926E7C908682E71AD3B97549C226F19848852A2F52E71F5707D18F24F5D7E5401CE9DCCEECD51EE66D4037D6466 Secret = E18E59F203D78717568E68981DFF6F415909E9FA Label = 6977773B87E1398CFD911510 Output = 02DA6910B3D3B25C4444 Salt = 49B5F05CBD7B70DE9EBEE7A6CCD0CA593C7EDA9908378752B8DF8BE55C1C7D93A942080E728992CC6EF30982B4F89AAE5077 Secret = 824A746131D9842E4B76C1322EC942838397F151 Label = 1E8D2429211E53ADE422F98D Output = D6FDF71DA070FC878977 Salt = 9B638617ACB7137EDB40DF6BD286AB2DBC768908917F49E5787FEF9837AAFEC96E7539E3BC076AB0E1CD756DADF4B6E10DD1D4E2629591A3848C1A1C Secret = 61262C8C205839B94A6A7DB052D3A0C487836E51 Label = 70630A15709B1F247D7084C6 Output = 9A6079B6E8B2879F8F0B0299 Salt = 8FD2F2DC671C57869F7A1309403EB7E308E3E08A8E649FDCE881F33B97A130E842F845A569DD2D27F240C8BD4C045D1ACC1BCBB53C9BD3EAC176D55C Secret = 9B7275C8C7E17D575650D08AB590E2DB0A786AA5 Label = 1998ACA6E06447E3221CF208 Output = A7FAB00DD3E4CCA67BFE14AD Salt = E24A9DC4E1E7FBC39634CBD9F0A3F818F16CBC1D1368D02E61E2611D152CE310887E2BBB3FF60E9342572606652035C7A017CEEAC09FCF187E3A26D1 Secret = 4A9D01A06C779EA4DD7242ACFD92BFAB3E8DFCE9 Label = 789C9D5046167BB2E2D90AE8 Output = DCEC761AB0C83DA25452A873 Salt = 5F8F6C0147A4A5703B2885E16B172E2DBD57735EA452CE8D241493A2AE7E49BEEE05CB0E9A6C7725F2BE6912C519BE14B8CCC52920566A21F0C0BCD8C9CBFA3CBC7403807460 Secret = 8EEAD7041D2D1793C29EEABC699E3F562F61D5E3 Label = 7B012137D41496C6FB5A5583 Output = 60F307411E0D430A28C22EBA2980 Salt = FB9029F976A29B569E5F5480B0F83F2D4FAA60373C11D5F08D5529F7A2316FF91F0E80FEF4D01060EBC950F63EDEF804E44884BC4AB82EF3C9EA9B51F1267E52C6FAE07420B2 Secret = FFF26CED4495D23E2B1852C9865EA624AA2FAC7A Label = 27DB0BC123BFBA6A0020306C Output = AEDEE54F650316C0540B6E80EB00 Salt = B9E29A7C1129B7DB7FCA7170E28B36959EC808A99B0EA85A69BA4B20D21E0537173F61B0191D203B23E6BF42FF79046CF14A873C1A468E75A13EFF0E4E4CA45F1A7519DC22A3 Secret = 1095CD4ED29B5ADDDD2BFCBF159A16BD83718EA5 Label = E872E897AD5387481AF92A29 Output = F5763B0D2D2209E962E8AD7D2BEF Salt = 54E3B1B885D30A18CAEEE9A3429495C427DB0B543B695CA8F11037113EE0F5AF075275F61D22B9303612427F41B476143D38A0F9D2FC6AAB73B0219AEB0F7DD7E5172C9E5713F344A7401516E8F00D96 Secret = C233478B521859560C06AE2AD2A01FC084039E87 Label = 76A04AE1552F8BA105C03F52 Output = 470C6B7F790464F4E1B13B6681A48E00 Salt = 8B80A382D1AE995EA4BD45BE1058AF1DE60F792E87E85B8FF2A7460043F82E8CDF1BFEAAF4BAB6142C167907F8EFA3CE61FE53A67BD46ACA82CC62EFFC7AA31B48D3B401C8AA6BB20C52999EA9CEEFF8 Secret = EF00A76A499C16E27184714B6697772D2CFD87A3 Label = 0737479AA0BBF2FB6A606851 Output = 7D0266C4DB768A10E414A7D23C98A3D4 Salt = 4BADF745C55BCF8D1C63BB099B447FA57499F66B138F68AF334AACB641F35A2CEB72230AD92B618C1E1BB5847CBB55E5C314024AECF171DBD1CD3AB0DEF3E14258CF3F6C562616724865AADFA668F7E7 Secret = C66CBC95B52D60051195FE37D4C57F9DD7AC0474 Label = C40ABD88794D8579F6065234 Output = AFB52A7FB5AE11B810CED05A64DF3778 Salt = FB1BCF34DD9AD4F764A3E523508D8BE30B8778B2FAB0EC6BB7509642811E8FBF0D19EDEF611DD974E94AC6CA4FF61F1B0C30CAA4B4F0EE6AD3DC48AF5DDA1E5AAAB6494BCEE5EEC0C16D0942E03A9ABCE6455A42015D5E1CFD75 Secret = 35A41F3AE01C6A82854A9B851399D714FFAED7C3 Label = 10D7E05575A3F12FFAE2FB1F Output = 5E8AE48ACA1951DD0C8530CFED56FC91E5D0 Salt = ED869C149F415B873B281968754D21131F8130F155030482BE33315D1D5853B4D794D3EC78152B01783E2288EACC6C18B444E1F550BBD38C190B2F83953E0FD890DD96DCC4AC0A2B35B7A23689409F115A895B9B9F340EE0A7AF Secret = D15069DEAF8512D424A1E90E3B99A1FFD6C30089 Label = 290A591E7DDCA63BC908FF06 Output = D08685F29A653E046EE81F019E7DC3478D26 Salt = 058C3FE66EA57D30DFAD28F53F9F437DFE581F208011B7DE12F09183838BD8E182BDD31A109466C92E72DD0A225B1B2C68F28E3F003F06723C89C4CAE48E32D6A6C9E2BE50A3882BFBC0F6317487A6C811D0000C8457610690B4 Secret = 7DE4FBB2DC3E3C60099963D3EE85C3A45ED2A05D Label = 3D55B230CC797F9E935D82B2 Output = 3639233DE9C18C5165C2B2126E69EE869689 Salt = E97FF4ECBE1AF9B60F178B36C82A9DA13ECE72B4EAA7CBE6DAE081B51B6E5A0776DDD88252CD2EE81503A10D2679D97B3A647D885BDF529F22DC8DB7FCFD013F7A11A4FEB91A6F1611262BB4EE0F17C526CD606B2EB6BC2FCEF15E1D585CCBAE5807285A Secret = E46A6B8AA59E92E64F066319962564F87AFF921A Label = 2894F522FC3244125E79FDA2 Output = 9334C17D345653ED331E714A17184AC75D9B9908 Salt = 783C6E1621748BA88E22D3DE003FFBB4FFCD070FC0B8DED7984F7C5921F1E10031E6610E2F3F3B22322CADBBB7EB2F40082C49BE30CF16B890E619D2BCE7A46E6A124AE5C71324CC44EA80864778D9FC2DFE757DA662DA4360FDA90DD5C5B94FB97EA554 Secret = AE8A78177C0C2ED3E22A8C2E3A110496E4DCCDDC Label = F36F114AAE722CFEF2861CEC Output = 1285DA797B611DEBAF7B5C2116AB87B9BAEBB915 Salt = 1C6CB07E58B6E84230DD995020AD630D8E209CD004309C031D9C8DAC66FD28746C7AC16A986CC64D2CC9417BFF4BF1AEFA6EF1DDA428EE24B6BE52ECAA15F6C537195D1C19CA90078B8F52CD09D6E92BE9F4D23A7DD55B8DD97B5CE7FB241C674FEDCF0A Secret = DA98844C4BA65754FDBAD415BC933E20104ACAC5 Label = 262FD4B95A73CB24D554DBD2 Output = EC87CC0BF9A726A0296B4BC9481AF900296CD058 [SP800-108-Pipeline(HMAC(SHA-256))] Salt = 371FF6784237FC6F25B6 Secret = 4AC9763574A4483C8074B191DCA5CEC35DE6876A0AA54A87C56EB243E25159CF Label = 73D0B831421C59DC4F8CEA09 Output = 289F Salt = 99DF36B2F63393F1530F Secret = 267405BAE320404C7FEB20F0229744D44569714867B337D42CEECA6228F923D2 Label = E76820D905283E766F379350 Output = 5161 Salt = 9EDC3C36C833B1560590 Secret = 747606CA19878BEAC842D595FB9F2F7E41A28C3FE30583F5EA6E70E956CBC039 Label = EBBE0B58ABA5DD8DE4BA2126 Output = 1DC4 Salt = 58D78D7BBE6376E031FD1326D9329B508BA0D63B Secret = 8737F4D4A73482367675ED3F9F90349B155A41B6F1A6431996F2F2894B2C388F Label = 2357871CD5CC93F914D98EC0 Output = E3D61FCC Salt = 03A28B94E4DFCA176B8B9DF806AE6D8503461A8D Secret = 1754712CA4A4A4ADE0F2795016BA123D4307859C4A0E3B46DBBCE370D96366ED Label = 33D2A74EAEC0CC8539C6DD14 Output = 0360E848 Salt = 8F0D0D3A0EA17892853145B62BC813DEFF5953A2 Secret = 3AA994DF37BD4696042171C49CE31DAC36782B15F6DC3A56B663EB48BCCDCF3A Label = 7143A4E3E6D7664E9185552C Output = 4C702A8B Salt = 0BF086E5D9D2A4EA075D3C85B8A3D9FDCAB3F6CDF9C371B536E53F03070F Secret = F5CFDF5632E0FBC6EF584992A63B2FABF97D80E293F4BC4A1B53E8BBB65F9C7B Label = D80822CD5054A75390E56679 Output = B3B618BD03B6 Salt = A8E252155B853CE8D3C282FF685796CDF6A303BFCA49C9A2C08059BF5C5C Secret = A9EADFEE978F311BA8792400FBA9E736DBD79F2061E80507586FD953ACDDD206 Label = 345279B13381947FBCB4C29D Output = 71D4FF2B5C88 Salt = A378BC9CD750E3A5DCE17FAF20D9C1179E03F4CD132360573CD661938C0A Secret = 9F63B3441620F61BD9AE3C07784341006817ED39C6B66B2A4EC6BEB670E3F7A0 Label = D90D167611B414D3DCC48645 Output = EA67BF375350 Salt = 26C2D51B3A34BFDE154C890593AB9AD7F854E913DE4440D9188200070800291F0264400D26FE42B9 Secret = 67D2A58C87792B201C6F47339258A0DEC3494E43B836B9727451CF88825D2472 Label = 6761C49E63765E937F50461F Output = 834E8259A91E11A7 Salt = 8636C477FC8FCBB16EAADC35D06887CA3DE51E0BFC23DD95CEBEE56491DCCE90BFCDA319B203E4C9 Secret = 64701CC9974D17DC84D7440CB760D1E7C93FCF3B5B335DA82F545BC626DA0F82 Label = 48D31818D10CD1C00DFE1AEB Output = EB964E45EF24C5E7 Salt = B5199B1DC3A8018CA408FCBBDF606BD39EA43F236AC6BAD3144D6C2D293F3C41159EBABEC2CDFDDA Secret = 99C8A03BB19D48A6452B5469ACCF85565D2F2F9DB1232E22CFE6E7E4CB48307F Label = 2577BB07B2DD8BE7FAB92D4E Output = 8E895324F98816D4 Salt = DA22CAE4D74D1461E54B006466ED106777C2A5B4F34CFB767D82FCD252C4914C617D44BC94A39E46646651639CA1B792B29A Secret = D24C400C2A816388AFA3BA1EB7E3667C04DA13FFA062F00431F0FBCA5E8504E0 Label = 020712C794593C66792BFCEC Output = 8AE8F64F7CAE835B912F Salt = FC36CC0E211667B93144528D02E441995CA04D724C4C65DB9E2832482A82E5348EE62975467A519D5E94DBE2F5DC7AC2990A Secret = A916B455A2CA984409E947D9B2B4C4625A91E6D21115196FE11480D2F894AF1E Label = A4BF9F540DA137D27741B14B Output = 5BF1CDCD4DECA2A077C3 Salt = F7334E486695E41196E553170DE4F4C03C8BA258A69BD86B99748F97828265B95AFF5DA8498E53BDE0600A4E4D670D08E7E4 Secret = 336AC37B48E5EFA0AFF07791A322248731B58A700C0E1D8A5BF5639E950B27C1 Label = 543FBD4A0A2D352F4ADA818C Output = 35B3BD44E459EAFE97D4 Salt = A528C22DF70626B25F11EA9DAA41CD216C9916E233FE28896A74ABEC74E960CB90EB71ED0E124A9CFDBBDFAD978532F0240E9E508F607CE5B9B20535 Secret = BA49F38D116D0780F2D5DE71E91202FD74EEAA263EC303C938023B38F46FF07F Label = 729E9375BEB99CD7C85136A6 Output = 560CB1E1B2839A6F3D75E70B Salt = 3206A0BB94CD7933354A9092CA265738EAB983B398C4D6E121E9A452FCB2144C5BED5F4ED98F79AEF77722491800FE389258B5EF59B2BAD27C78E898 Secret = 7EA88A14BA06FD1D252BEBA934F89A59C9FD8F7879D950D5C215EC002C39F828 Label = DFF4B7A7B74EA6B5EA314F1C Output = 351F27A4F04BC315D63E13E0 Salt = FF76414A247F2A28E890902F923DB0598DF2596B18D808CAD68E1EB0088063A470E2D20C9F6C2734166607E80F678DF28B60E83D36F12D0BAA73F0B0 Secret = 3DAF95F769C5BB8566C8FE45CC3F503F21E9B3DDB4DC3B694825DA46E7353633 Label = 34B6DD62E984130C0BB66340 Output = 8CB4F90BCB83A563C6C60A0F Salt = 50B05945CAFB93111F3FBE412C7B719FB3B1D750B7AC4A9373B78A733CAD2BD76BF73EF7DA4DF8CDD0704999FD301DD16C43FDEDB9AA5F10D09FB16AE5D2103B9EEBD9447554 Secret = 2472024D887F7A71EDA6628D2607E0AC6C1B1E544B6E07BF08412984CE01480E Label = D4D252556146BD01CF5EED68 Output = 5F821EE1D7147AE44BB09DF888A1 Salt = D52E07E0B335C777EC81AC9B5659C1F13EDD32A0FC390B9CBA63199336F805614800B446FACFB6B01DB67EAED81707BBC45404ADA083CC6D206BA359A6D834039F7BB25123FB Secret = 3E25CBF5C140BF5594AA5B811572BF1BAFD3051853275559566882B9958EEDB0 Label = 9455083F1385310296FCBA71 Output = 23DDA6112522BEF4707DC233C5B5 Salt = 19B13FCDCF3F741420B156321107297DF0C2A3A93C1E76681A0CEF4ED54719C1B9880EBBCA4A11DB9C3D713D7AB0C09685E9DE99E0CEB572B494C5AF7CE37B5CB15BDC8AE4DE Secret = 95D78C509FD3EE5117E9D34EBDFC02B7308A1EBB62A48211A58711FB70368688 Label = DF86FB479DAC31E0BC722CAB Output = 45F306FFA42DAF549EEBAEBDABDC Salt = ABE98E6E1B1194574FB4F333AEADB4D2864D03572D0C408EE1B0F81257823910813C49EF288023D191179B003A4080227C13DCA4A9DB9E89F2BF28F44AA18469275FE6868778154206F4BFC0E8B07D5F Secret = 7FC9191BB43AE0FFF35B93651C3A069729ACF5F2980E6E99ABDDFED190915538 Label = 8F1EDA3E87ED39D0646FD586 Output = 6D14BE2885F8B6CB98E95A56EBCFB3EA Salt = 96D90D515C514FFCFE9E8EF7F2292069EEB9D0F9AC0AF5087A2782F9317F64676DC55EDE051EF9B1C519F6FC2B64CCCC51CA880AB7FE5438360E46547D7161DF9464E0CC75D53BFADB46F392DF73996D Secret = 9FA62BE9BD2EC2A835734A459281595996320D9F36302900E0627096E36AED54 Label = 3396198C16941F094C9995AC Output = DCBA100D6123E3831AA8D882F94C16E4 Salt = 8A74298819F95D8CD45F8663C5CF2F417AD6E4526972E6BCA662E8729C8E27B979D539168B0A84258967304500A9CE83B842B29C6B746B35A960650DF3F17648911F0D683543509DE9477D18581E050A Secret = FD37B7091262EB55BB273E8C58E9A230055C426E38672BBABDA316CEA8AC0BB5 Label = 77F03C663A7669625DE80981 Output = 0F1EE8544394872E95D2EE6FF8C5062C Salt = 744C6256340D4CA3B211A60EF8D308AB419A84DBB8E7C0BB6F5987DEC65F032DECEF91B9ED909A853401A74F388B665FB2905723153583A221CF3F6159BE9DD245F93FBF5A1AEAFB993EA5A1DC3E53968D1E010EB164EB0AAEA0 Secret = DB73BF49B81E882AB1C75EBB7811591BEAF4EDBC7DA3F6D9424B18338B5C4D07 Label = EE88E0D224090DB78C11C478 Output = E482FE17A959CB9217F55A61CF9D6A76966F Salt = CF9A03F27AFCDA1037FCCC3A62158082518DB65D74007146DCF2DA42DC5834C210E904CA6350F2DC52DDC7A8D76E4FD8A0EE5A8AF5AD505D292DEAF12BF01740243FF4B26A2E1841605C3941BDB774B51B17BB160A8F463304DD Secret = D0D23A20D500EA2D1A93FB69EC42B6904366DF8BA76E68E0AC82D8B1002C651D Label = D0A9FA2A6FE8F08A28B34A3F Output = D270E76C91CF2759CE6A4BD828D84E006194 Salt = 6DE0754E7FFFFD4D76C3D76270725CBFF297D0F26F4A6A60EAD0E94578809335BA306F510900C3077AD019DA0F31A51F0460E7FDDFB387D1DD5155E247A375C0B9690F59CD9A85E4C1DAD2999C6CC24D4205589A78DD5BD12CD7 Secret = A239291AD925BF51F94FEEEADCD80244C47041E7602555A5FE2B4EB1037A4AE4 Label = D1830BE05BC1F55C69C52D3F Output = EDBA28EA7B08AFD2E3263AB194212A258689 Salt = 5E3E54C59D6B4F1B07E4DE308D54DC50E9A2D2B041FCCC309A7455CB97F54DEDCC65427F0421022A1B3AB97D9D70B8BE3349285734440CE42A4EEEEBA54A88712C7C425B0F81779CD972233638D715C6018B2423606F97633D98A371E268EC712705F9C5 Secret = 84A7008FCA8F4A6BAF31ABCB40A399013E83E5363876FB0A5B04C15BE91E2080 Label = B1C9117170ABE1506D69FCF8 Output = BD7176E4A79BE564E4CA65A246E3BB4EA3DC1B58 Salt = 4760D27591933F5B092A0A7543BCCC7B9032CB93813B61695F7578AC6AF20AA969E654FBEF5BD646447A031E51F7EC92F9DAC135038AC04E5BBB908D5E024FD67DFD99EA2123871AAB57FAAC239E9C9B2A1943DB83ABF9EE91AD5AABF0C96CB22E8BE934 Secret = F2A7DE120940ABC458CB5854E7407331AEE249F67A22E824CF32A4C730AEC179 Label = E44993510AFD8F8262B1C68E Output = 47060B062D9B140918A97CB862306C7E0C4C3CB1 Salt = 6C254C7DB8567A58A9F7FAA8B3A32C4A3DC47DFF518585C25C55889E835CD98F09C0D85E924C8C9178C0A4FBBD15F840F7C0DF90A1930EAD19DC17625EF867A84A7FD6618297FD6FC9DA49983381F2609BE9C449C260C15F5EC02E2EB6EA2177410BF3D3 Secret = 662B028FF727AE2C77B87E9DFF95A8F13C368117DBB5B28D041B417BFF9AC8B7 Label = 1621C7DCA433B1B90B74F373 Output = F452D57C00A0799B538B2E28B136EF88D39C2274 [SP800-108-Pipeline(HMAC(SHA-384))] Salt = C7DD056E2807475B55B7 Secret = 1ECAF0F20EA2E2DE63A1D426DA78B5ADBA3BCF645EEFDA387EDFDE1FB56650F69DC5BA62FF91810E309E445AB5BF4BD6 Label = DB48FB658FB3C2E4A6BF4D0A Output = AF67 Salt = 723570B0D1A14505FCD9 Secret = 7B8662DB826F87F5A5CE1882FED7940126CD0BFD0CD65D21087CFACFD243A736C6DE38AECBEB639E41ACA3E97013FA25 Label = F4311563BA8F24B6AAE469BB Output = B79C Salt = 6B2A791326FAC063AD58 Secret = 5D6519BFEC7BCB03A1C6DEF0F025F2C952CC315152796A3A0C96FF2BC55AA2C3115F3926C37464E6336C7A1F6135BF50 Label = 260AE03CC88B40EBC3E8206C Output = 0207 Salt = EC35E8D1FFB99DBB798673059AB3C72258D56EE4 Secret = 38E49B9FC89AEBB087E33773357B32A78CABF52A5EC6F66F81797B7974A0CB00840CE9792CDB719416C5431791CA4CD5 Label = 29E16EBE13DF05E1D4880B01 Output = 4F731003 Salt = 251A70D809AABD4183E25A998B3E05745D46AA65 Secret = E59C6AC268A056F38A33EC270904E64595D162FC13DD0DADF3B3DF7755B1986DECD85BEE1D5941CCB26F54A08BC73728 Label = 4B6FEF2F087937DF4B490DFC Output = D7488D50 Salt = 88926F6E7744E374DE66DBFAFEEE0D016672FD14 Secret = F516752903866EDD8B4788C1394C99D5D8DE81FE228D724825A341E4A7F3D8B4EB8B187E7F630ADFCB1CC201DD9C819E Label = B39A5B53AAF7E646B9F92EBC Output = EA5344ED Salt = C6F5A23D57ABC44CEDADFD3DEF044FFAE69A4DFA348ED30903C53411687D Secret = CECCC6DC52EA8C85DFDBE3E8BD1B80724F581CC98C1C2DB256ADE5F6043C335945D26CF77A31E31CC2C3939CE072BFBE Label = 15712EFE9BE17796B2DD129D Output = DF62FE5B8E62 Salt = 6EA6F77E8DCDDC97B7B627C959058BED557785E0F59A47CCD3FC26188D31 Secret = 57D14A5563AB3BBB8FBA87D4F1C2BA6C7AFC0062BF336BF4C4CE55ECC650F539510DFF14FAA7436E43D106228D0B7411 Label = 223FA0A42E117F4954F475BA Output = 1C05CA0B9D7D Salt = CCA4E5F394A6645E9536299CFDD72A11F795B6EA57A17F6149F0BC7AB00A Secret = 11D25493E353DEB43AC998BEF5081EE7FE41615DF29572F71A474316602259401AF978E6FEA42FB21C49D6C181EB29F4 Label = 01877EBD22654B089AC2BB3E Output = 6117BE7527EF Salt = E477E5C05F1913094AAE941EB2BBF64F867FAA9AF3AC625C788F24BA385747BC394DDC767260BA52 Secret = FA33FF4B75CCAB9EED2FF37D04201ADC08CD4F9DB419208E80E153333EDA66D5CF04698E7329F89F7A6C4EF18BC530B1 Label = FB90B0F63EBD9CE82C047EB2 Output = 462569744DC230CA Salt = F63ED45A65206D4F7FD1F4947096F05F4968150DC1FCE7AE65139DD269BFA092BD34FB9E649A834C Secret = 15E6FB12266F0B92F8F49E46F7C2FDA85CB2BA96BEC4473E996A0673E23FAF54CF53A9F7A2ADF902F3050DB9619D2A29 Label = 1E0108B289B02B55A9B353EA Output = C137C3C71D97001D Salt = AB05544C4894C3E0FFD1AF7613D5181C5C57BF588474A6A15247EB71127AC10BAA19054FCFD2E4FE Secret = DBC61021461EB4E3ECAECF6CCF41F7A9B6C59757EA6696ABFC173154B61D7A278123BD16411C529A8D0623570382FF53 Label = 9B7483846D64EEC19B32D5F9 Output = A56A8E3185EDF4E8 Salt = F8A7D233AD73A02A2D558A7B1811A40C34FA939ACDF33705183FD0A869C6CFBB74EBA2596E597F60509E6BFC7F132FC349A2 Secret = 169A31B993167A92FBCE6F633D96D70C334C98F1D9AC8AD15B6E44774125120A5A803A2CDE0D7DC8827B32D87E515153 Label = DAC190BAE04E1F68AA315C40 Output = C5A2FFB3E6E44B66D13A Salt = C8675B20A3E9AE81508797A7862CC6E7070731F0C0278969688D5274DF6045CCE82C461A7CC4FECE54D5119A6F80E78C810F Secret = AEE5C7DC3D5E1C0C9063F745387037278EAAF285E66BFF5F633D965DE66EBB06235A1B2A2654FB3C8761AE2D5822AA2B Label = 1A95267E5F8F98AD954E8DF9 Output = DA4F6DBF4E6AF6503DFE Salt = B6D30EA1EF84A0149499C6E6FE0F6A0BCA42BD99D02D6EFB671BE60E822BE2D9E4525B057621609953F49AB0FF7DDFB6F1F4 Secret = B61BECC74EA0F95FDA243E4A8FACDDA23A07FE4C7AE12FBB1FDC6F61EBC802163FB6EBFDDC95190C2A675019127CC8A9 Label = 7DCD4ECD818BAF71B203521B Output = AB743559D3A6EA337A09 Salt = 387B6BBF7C9EB16C0BAE4B8236AF88A497C2A2627B09F4F36A0AB1D0C8707EC38106604CC8F2A597DCC4A52B03254E39B97C8370385E15FA1415EA84 Secret = C84A200D4CDAD32F5560515590DD44FAA8A10AE3D6F7F3D40A918C8C58C435D8BEA1AF5E02A9558B9BBD07EAE5AD69EC Label = CAF0630CB9EA0A1271363C99 Output = 3F5E9A2C64074711C3325423 Salt = 6CC244D2467717662CE2AD4E92FF229BF8D88E60D35D1201F9B501D27BB59E702009566E61FD6B8D236957CDE732CA1506EEFF0529997EAE9764EFB2 Secret = A671035FF14FEC278FB6007649F4FF7F72FE23E5DD1D2AA5BC442850E9E9901C9FB034F4E97893D9700E01C4EB0227C5 Label = 380E24F847C98DBCF85F0121 Output = 284F56B595AF0C2E4A33FCD1 Salt = 82FF3929B330E1BA185944AB07198DFBC474C04E8F767E5D8723F4FC0005864D0CD5C03C6F50736974A9A54189047A7F035CA5A406B449C54E8CB43F Secret = D34B97389554B24675A9BE50AECA65ED4A2565C85FE87212F8CD0F2A7E9C36D5F0B2FFA1D58A0E18BEE68DF9AE4065B7 Label = 48BECA8691CC02AE84831838 Output = 9A630AE62042914472469484 Salt = FE91E3AF5BA27C9E37C52252D6049AFAEA310ACE5AB05DC5C05C9006E51E39D357C100342B3109915E99B89D21DEC69158A6757864AC00DA0F51F79D6A8E56CF609D5C4C8CF6 Secret = 17DAF15A207CD0A0CB75D26FF0214B7DFCCA59BAFBDC949FBAE9D5FB16071B72EE850AB5307C443F1E939999F45D2223 Label = 646255CB6E2992C5BBE3A691 Output = 6D6B294CF6C7A5E869FC2D061CE5 Salt = 26B0A4A32B6E07A74B55E5A60EDFA47EEC422745BE727FACBBF7B5CFED7BB84957A1466AC66F88683BFE67AE1D068F97C15C1382C27C68DAC0AB60728AFD8B7EBAC7627067D3 Secret = 8400AF71AE4A1A21BE69EA8060CFBECA42FA47195EBCE454049E88A9B1C690F52330E8E658902350513D03DB4DD370DF Label = 47573481F9216D12402C0B6A Output = C54D224EE07CD953B5BF8D8B741D Salt = F826C8AD6D4B812DB78D95EE8B82C24D37303C9FD8209C07C6CD0422FEAFCBF3C1AFAF2A54D1E9C52403131AF6A50E17C7B02FED84E45D729E94543789AC96CA0A8682D1EAF4 Secret = F8EA9540230980EDFF016E1A74104584E57FEEC011B5FC003C0F1A9C34A11EE81D0D50EEB2DC9A01285F2D59BF410DD5 Label = FC9C98B30391E931D2A74573 Output = 3CBBE54C1605A53F1BC96C623E66 Salt = 082F0E248FC4CE1D5E5C3B6E331BA912A11CA3BF1E29B2D0BCE178166F94D01D015361343D4FDCDA72919E8C6AE653BE2D152B91B4B369ECB434A65CE4B7D3C87BDEF2C8B5A70A020A05BC12BC7D32B6 Secret = 677E6F1F3CC4F77FD398E5F085A4F6AE4E54D746B462A212E3E6049888D61CBDC29CD3F224B82B666CC3623E56E6457F Label = B02B4DD81E626A5AFB755F3F Output = C6A732E615A98BD2EA46A3AB81F1C0FE Salt = 55C182C9D2B62E3AB89D9597F3EB5B01C43E49D3E066C666E96176196F9598AAE006134D5AC93A2289382DE46022F7E8630E5FD66F55DBCA0DC2684AAF0B51FDF29A91DDD0F2A69608E9FB9EDF0461F1 Secret = 47517DFF18ACE4AA07BA0301E39896D6986AACCD2063DB302927E8243498CD25D99A2C0446A752F0039301BE714684F6 Label = 2C094154FB5275500D2C5781 Output = B08436FC81D0F8373D0D2279D0F872DF Salt = C3857D1C16368A5C05DC404E9755E9769A3E1AD032185FDBE01009866718F57CC381206528D36FAE5177E22349F8F7E8BD4F5058D947DC965F8E532F47B63A7F5C6459365CC35C406FAA3079C4E5E53B Secret = 6D989E5C1133841057893404C76DF88C1B88C653B6862957B7BBA309419E299EA03C423B0B792197DA563EF46DE8B2F1 Label = AD58D2FBA6937CD262BEDFE8 Output = F121481E5A5A0A9A27672E548EEE2E77 Salt = BA59BB525AADDD44DFE1C52D18681A3EC7791130D09333205E66F984ABD7199AADD21B4266FC555F3B37431846A441DA4476F3BC2BBC2BFFAAC8B3E27B1A5AB474E63AD8A7FBFE28B9A5C540509227E115BB765506871A15C5CA Secret = BE72483FA5C9623D50B276D6515CF5EE2256B86A294DE41F4F444120C13A6858A823A35FC943196F909E6A2384894BDA Label = B20E2E0C7070373A98C70E06 Output = C231FF36CAB91041BC00EDD9A5399D9A6209 Salt = 03A89D71CDE5415A35825AB337E24C47263367E8656063208B67C23B2A07272DCFE7626341E6EDB55793EEC65FDCA3072A255DD9F8E36BE84FC8663B64728F1E68AB229EDEA0BB3142B56FA9E801284327A0382EE0EFCD43D678 Secret = BE2414CFBD764582C8F173D7384037D5BA89D674DBE41BD03B5255BCD37829B271167CFE87B1E749EE2C53C2E100B813 Label = A992A30541AAC8B31EBF169B Output = 9C25B43124A7DE027FCAEC12A2E0606FD083 Salt = 30D47E1477CBEA431C22BB03F9D6D69E89E368DA5159A02F30FFEBCC5A6F76CA98BAD6B1A436254AFB468972C4CF5639833394A7F51900737B702FA2557D2BBD42D66F8AC4A96F70FA62389710E49BF50607E744440E9D194BB0 Secret = 7BAB435F69C2F084423A2CC3554AB041BBA48C5397CC13E0BA32496A1F1EC6676202E4061591AA5AF97D5B7129707C21 Label = E1A513C5A46A0D9504AA3668 Output = AD8E95870DAE4F437E65A66F1F814BBB5FD3 Salt = 5DB779CC1416899D0A72AACD22209959E43AF1D5CE8812A5874E05BBAA48D95319EB9086967AFDBD03F331598686B2D266662CD2EE5A3B504606731DCA495BD449FDB4AE65613F14CE6A1E3FBE174494502A9F41DC704B79ACD1778DC74F949079BF85C2 Secret = 76F2F58A10605073DE11FDF95A895F93DAA766C01D9FE0C414EABBB5974BF4B4A5BA529E070FDA4C148376CC90F7464D Label = 5B5AAB660AD8A056EC2F634A Output = B1B15BE5ACF209B5B774586A0BA0146F5FB033AB Salt = 0D315DC4A402BCE2692FC5636F08457C203ECFAEED0985F8319240AA895535B1BC3122185088324A6B72FD979D476A566582328394332927D4F5CCC082CDDE6BA0A9BFB1884E05F6FE9F6E0E5D7A1996616D6197191694F75D907C92681ABDD3CCB5AD2F Secret = 230A3D5117788D088EF018B79FCB61EEFB3DABFFF93C22CBA250F5B2C4AED7DDB05071B8784276510AE90730C01D87DF Label = 8AA3CF184C376099123C6A3E Output = CBDB05AFBCFC0E126FFB903E64398FF40D9A1B87 Salt = 0601F0E11C8862603F56A40986CC53412BECA771EAC0255CA30B3E88BE7825A4F56A441274DBB68BD1AD1503A3CDE3EDED9130007C344F4041A8BC99C48DD32435E4220A19A5A9BC0AAED408978E8F1C95E4334439E87A33224A158ECB2D33AAF61E37B2 Secret = AC0258BE324EFFB2D8B6382933F56040E46471969C6FF944EE24BD3D6ABC5FFDB1815B49E5AE19DDE087A354EF933695 Label = CF0D784CE58A1C5E8818E9D0 Output = 735BD29382001F05DF7CFE508B39A1A18990036B [SP800-108-Pipeline(HMAC(SHA-512))] Salt = EE2ADE03A78F200A2D89 Secret = EDCA47FC977F4F8E2B0288132AB642EBA0C91E6A503C55B5A7DA5DF1B482CF6AB5A90B19FE1D7B2DFE6CFC270FB7E4674B88DC5868B2BEDADAE16633F357AED3 Label = F83A5B6FD43318E4B1942D43 Output = EC64 Salt = DCCA7F35F4BF14A482A8 Secret = AD072D4C757D1389EDF6A72E5E0D5BC54A65D665491FEA4C891B12F8714391716084AB09E19D4C47F33EC93A75FC0F78B4AC4CC850947B72054A0B284E1426DB Label = 612DE1C145AC1A458CF774F5 Output = B9B4 Salt = 24F94D5268FE022875E9 Secret = FF5A4DA24255191EA61ACDFAB7F2B8DE1B4300EF811D8ACD79AFD22227A84F1B0E2A96B38406C8ACBC1B41BC0A4EB9471418FC0E8C58AF5E96E75DCC98544AE9 Label = 761F550527AF9F27CE608DA2 Output = E84F Salt = 947CDE6D2D861DB686FB65BC0D445A5E0821FAC1 Secret = 4309C94023530BCF7D36687F7EBB03E3E9ACDD293ABEDE8E2D0A0A474DD3DEE748747D4D74D39F5691D31377FD717E35BF4D0C5C00150273B0B4FD7B72A1220B Label = 9DDE5F16F8DBB11CEB19DBEF Output = 2DE22CCF Salt = 9032531E44AF275A0878DA2C87168BF6EF4035C6 Secret = D65EE39101AF135BA1C09DF1FDF9BF714F3BB5410728965435581FD53A6718CFD299D975E77CEE5C9056665537D4942C19A665FA3085E5C57862BD5260A68743 Label = 217A3C66F9DE1811A0088CC7 Output = 4D15914F Salt = CC938A27122421B7C79402B14C3D1B14748F1650 Secret = 07DF2AAD2BBD6CCBD271706872A8A6E22D012A9BC965C0E62A90FC4C0E5454F639A6BB9A6577671C5B856A22E3CBF88FA151905A9DCD978C53FF86E968C97734 Label = EBF1E7F1E9273730EF8E3356 Output = 357F6FC8 Salt = BFF28EE1A2260D1CA93E16A1024D584DA0B04A9E4AA335E309825E344F19 Secret = 5060FE273A113E6CC6D435ADF09C99F5578F28023EA0C1F531A14D3E349491D262DDB30762B9148C28C7375F7C6B55D9AA2D15880E52B828EC922153DD3C7D17 Label = A25A371718673DA2C9FA04E7 Output = 54BF1B647A2C Salt = A7A4022EEDC8EB1F3AD08F20878773E59817ECB3EBE297CEF6E6AB0169C2 Secret = AA51644992ED7DB8ABB9588B66418ECECD9941330A462C2670597A563FC718008D65C719D5720395D0A5B709704F43ACA9444E854142100941EE059A1A01B592 Label = 078226223989CFC97FF44CFD Output = 3A99268FADE1 Salt = 141CC7ACC9690D4CAF3DC03947DD61702D32C3725300F56D879D0E2E8C3C Secret = DBEF65632F587BE0FC71DFE15BD497A4E42C44D2E3AAC130044DDBA82F3E570144295691BC87BA55DE6280A546F321E01A6C5BEAECD66EF64A34245DC1F1E40A Label = E87FA27783D9917AF0688CCE Output = 28DA406B0F53 Salt = 999E5E1B5B41AD2CBDA185215152350E1C8688E4CE9FB63D5FE4181B1466B58C92E4F7F309AADDCF Secret = B11F6F3E5D01A9C6522E3727608E6BBEC072F924AC2EAE38DCE467BF045424659035EBEC25540AFEEEFD4012921D88A8A34F1A04E6D4FEA9A9EB4ED24BA83B01 Label = A343AA4F878FBE64DCF26523 Output = BE0E6480491296EF Salt = A4C049CC4E6CA67200D8262D482FAFE5A88C250B764B2CE53EB1622583C518598D198E2B50B6EEC2 Secret = 2658DC45AB9A4F65DC6E2E983EE77BA8A7FA0A10826266940E8B92D0BCE6986C8BAA1ACCE32086C430D3A6BC5794E3534CA98E91E59687753656CC8B2E9B6353 Label = CC7D5513E88646068D836573 Output = 825C65E91FFE0EB1 Salt = BFB896B349CD67633A6C779939F1CB4E763686E19B56509F1954B0F44E1B0A7C3E5F6722D4255806 Secret = 0A3ED622210ADFFD1A8003ACA9561B6D69AFB4B2B15E96B318CCEE3B8E721B258B95AAF8CACE30D87749E5CA2F835D9527F7BB10BB4922ECD1A26C8F98FAD83C Label = 0AA3FF88BCF138DE9820C7C5 Output = 7D826D78D870A0FB Salt = 561CCCDED2D0E95F6FD5F9A0625D818AFD21E71D6FBBC0E20D3A31513C5F4AC0F4956C8C7F38963E21675CE6C9D432F441CB Secret = 109030A1E5B64EE4543015BF7AF42C197160D6E6167CC3BAFCDCD17BA442CB65B71AD45CE77A9A4B226CB030D2E0D3B06245EF65ACDDE63A988AA7F860E5FDAD Label = D4517D38A4CF1EB031D793D3 Output = DC038121827D1DDC4328 Salt = CBA4AA7CCD2BBAE49569E29FC436A439DD8D2CBE815677AEBABCE7E39FB98CBCC4E510A88A7CF86EA6DC136607FD0D776862 Secret = EC56254A60AB9F00689E7CBAE6077E2A76D1D3191B11E70E742113361EBD152B6E84BD0CDC562D41CE4A34649A8A5C2E1AFDCAF0A01611B7D1DFA9EB3402EC29 Label = 16EEB4E1F61BA50794CBC228 Output = 71F076A83058D6E33C29 Salt = AB4578CD70630428313F756D42142FB61774EB5F7C33C277A26507912A50DD490F36D2F00EFB8E73ED80ADC5F4B75B4F35FB Secret = 956F1837601D7CA17A2E9C75FBD80877BCB086133D184825FEC96110D2439BCF5A2A90A2FAA10CED53E1FE3E0CE87FA443A9D6E136ACAB211AA0302A8579579B Label = ECA2468A14CB14DF14C2BB42 Output = 2660E65F69F7257F2990 Salt = 08BDECD6993A09DBC6C382843444B11184A16F2888E7354A63B0A850834193533D08FCF0DDB584E81F3A506DE0E7141595A855E4E237FD665796F9A5 Secret = 931D84DA367162707B82E04E8A687D283DFC0BD1087332D972853C262B8686994AC460BA93E428E5333C5A2CD4E7A901EEAEA408AC85D65E5FF807FC4D02838F Label = 056A7829B4B3E10BE2E99FC1 Output = D6E782E9E250599B141F9E9F Salt = E5C99036C684A60B5E3DFBF3B74DB295D986D765A4B01DE88B61F88921457B32BEA6C3E3A32C31794C5E3DEEC5DD2088F0873DB82AAB9CD13C3DF860 Secret = 5333D068666AAF916A0D69C2C9D625F72981206227EBC89402A15D12D1861FCCE1F957620E48D2801ED73F915C642D1B7495CB8099871C4D63E5800A9CAB711E Label = 830EF306A74522B2DECF385B Output = F41971B96C4DF171AA739E2A Salt = 26E011D626B0A3D95B4C0432247FF99136BBCD5C33808B0EC0D72477284B19BD00869E1717738DF4740EA345F6FE2CF8BD60DE8AEE0EC65E77351917 Secret = AA211CC6AE1566B4786AE7DDD5A3D1E1577E1A7DBF941341C4B486D4C4F094177B023A1919E40B9F949F29EB3F5D01F4C9A0F623645F7A32C94FEE23CAD4F66F Label = D493D31BAC4993C50798D801 Output = CBA3A24B112028398F269F43 Salt = A8B4B720214C8286C0E76BA2A2A6807276868638CD6D4E2CB00B6EA93C94999481FAAF06A58C05025A64E03F51A36F5EF01A17F60A1D86877759EB14B505AE3B7501CF37F0FA Secret = 65ED976DA5B3886FD102388D5DFFAFC8A2B6D3766B72BD93A25355C78893F7230FF1BA60718FC6525951A34947763CC18AEDE13E26AFF4CE61676F3F8B499521 Label = 0D4F8A5C473695E166377FB6 Output = 1D1FDC33D9CC8C0FC8EF79E1A1F5 Salt = D636410381D9EC4B6D1F80C37C6464E6AA5196E9E45D7FC8AE431EE27E2BF396760D9BEB4CBDC571876494B20B76407064C319E96BB176D84A61674965171FCABEF674CCFD6A Secret = F43829B914280304B74FA838C31143903ECC3CB678C8ABFA4E731E875AC8DFABE1FE9E76BD7EA61864317E2E1BA43E73769438BB2EAB9A2B335DF4A6ADC1DFAB Label = E473028D79E4821D3C6FACF6 Output = C529683D3849CE409CAB71D5A1AD Salt = FA10F5BB03459BFE4584F16184852D6F03F80C4E68DD4F09C480826A74D80E87E6BEDF05872D392EDE67172433E6D6AD55CDF33340DF3451BA50A151EFA9BC46F956D03AD582 Secret = 3AE7E08BB2D9EDEBA324899D0E0AE360F6ABEAA3D7FA229997BB641B94367F426392922C7523EF01279FD00E9D42161C7FC2FA4AA3B1AD4ED5E2DD8AD514F8A6 Label = A8686508F9ECA7D436950F3B Output = AFCEF13A989F3BA3CB7DCC30FEC6 Salt = BE63D39B2101A687C14D592D6FACAE34E204E979F5A46E3D67DB94EC1A4DB74300975C394E9E896EF5577BFD1B9B00798FB0652FAE0A7905878DAECD53B8BEECE0A80D9B8FDB3D7CB0C313AD963282B9 Secret = 2165557DDF29179CC1D63FF3D7EB5F3F895B43D6BC8BEF2EE7E54D13CB92BF4F38BAFEE6CC15C45005FA81E2C69F79D6925E197F1B7EB5DB9FB5D504A1537460 Label = 8056B3ACEFDCDCE8D5F890D7 Output = 3FC3AE22CFDEFE372C2C24F6829B26C7 Salt = 8EB21A04705FCD4C1DEFD7E2AA896CC6921FC916FAC2941F95C8ECD51D341942482D63FC8BAB5D65C00D9EAFBDB49F0C58DA98E8F2FD0D201BEA075A447DF4CF92772269B37AAB078C3AAC3F37054D22 Secret = D7980A2154231AB28DC6495DCAEEEEF7CDEF10848F443240B812E8D8D6FB4D962D8CA9CC35FA48BFE85F3373B018B3CD65CB28C1CEB4E49226C6A7B79CD66B0D Label = 8C728083470ADB2EDBCEE621 Output = 64A688514A073870733F98814EF4F12E Salt = 5D7269F3085DD932F5A1F211EE16923A4B993D7C8303EFA080DCE4670D43269204E1E64AD7E9F7A9F8CE5AA59B45D65971B0B0905A7D5BC277D083023EE8BC91BE9F298241BD5A823F2465C58FF27203 Secret = 54813C49948AE5FD1CF2D465FACC55644B2215E977CC058362C034A78CFC1F2CEDF6A2A3F765BCE0E41D2002F6F4865699E415196B6EBAEDA10BBDFCAE32FE1B Label = 97B0C4D41216A15D4AC0579F Output = 1CCC861A4546A6429F0353133E5806F6 Salt = C3C0A817B8CEA16B01D1D56712C51BC9668E948A53F0D31457229C193DFB7BD048113F37D58CE791C018A27A0CCBCD6E2A5B89E4A912C4895D7CE6AE16B67E0AB9568489B46F183119C05C3741FB17DB1ECF9878B7E3293F16EA Secret = 88E5762C0C4C8C78D76E50841EB9C1021574731D98BD9935C99199B49BE25DCAF46D21950A0E03B4075DA2B37B5B0308679E46CFE9831830B85D17753789CC21 Label = 04369835A27CBDC08A3FBA91 Output = AF1BF1972E71BF66660B60C1275171092EB9 Salt = 820A0566A5AEB879B804DC7FA280265F6214EE8D25AE28F66B03EEE3EBD78B3A89E0ED5A2C13C7E70AB797B13991151EBEF06312659EA08CAC2BCA283ACCC71BD9726AADEFF2EB9DEE50F88EB4EAC0946D3043F8092A0A1482B2 Secret = 317B55A4751E7821F9376A0B29608AEC2B1BE9F132417ED882EDE64868DBDEE7FC028D010B882C7D2047FED9E8E91924AA15CDC1E773C51CA814458E4720D8A6 Label = 7A2B9293441A7E5D30269893 Output = 8077F2BBDD3BAC10F0DD1572EDD61A78B673 Salt = 73F6D88B3957DA331DC5C093E52C6F844495F4AD8129A39EBF60687A17971C462EC8C7B1778F72E62D6133F86E053897CCD21329B7536BD1529F8C4BC28379D5C8352C75033187BD72416C5F9E2E78B25479770B2ABAC069E963 Secret = 94CCACF412304F0BA7511D8E57D8FE40D434F3DDDD6BFC5EDE6EB31E75F35EAA027E82BBBFB8AD3BD52CD41B0A223C079D3F420B86E3DA74F4606D98DCD97771 Label = 4E8F16265B8336A6C39DAC4D Output = 8E95933ABD387701437991CD60B65603A611 Salt = 3AED3A35ABEB06C613E14D3A4787EB7A8C62E3961E397FCE3887746A9692BB0B0AC6C53DB5F04A5D41E53638A5DE1447FEF7218DDF13CB00D678DF12E145722A2C4741A5CECFB2AE62698A24D78CD3C08BD23890F639674965DF273644EDBC6ADE2D9C45 Secret = 21ED4DD53BE9086820A28D628AC3E6C14D1D5B1BF008A787736BCB82E691372CBDBB72F7F53E909C246A6846855F125119AD5C98813A11D3BAE9A7DB8B9FB975 Label = AC5820AA5E58FDF2917B1247 Output = 18081BF5E26DCA0C25E6FFC8995665FE5C770C44 Salt = 93A048525DC2BF5BF5D79754E36D7671F4742A932AE267D4186834463CF893ED3CEA006AAAB1A5CE9A135869521B91E93BD74A7D25E372189E8B1E1F1C3917AC17BE568A411F9D469FAD912CAC9EED83641CB0B51249F7FFB7F877A29DE976FDA65499D0 Secret = 1243E70309A9DDD689F3139AC00DEB500A20D1478D87FCAEFF9F78E520438AF5485C7B1E914A11B53FA20E6DBFB72C8B9354B0448D9AEA131CBF1D4055865294 Label = 8E8F1717ACEC2A7DF81BD5A8 Output = 12DB6D019231255C8D8B48FADD55C1900438D216 Salt = 259C47BEE5FA8FCED41EC22EA7BB5EA22346B30DC3FFE4425C4F98DD72994936E02281C30272671F7155F54915F545B751A36A695A1DC90FA38D8733199298590284862EA951C60A3B78D9A8A63F671C13615706266CE7C2C9DBBE25C428E7D28BAFA92C Secret = 0B9FE0F42A4A90D66CB8B1E17C43C489290C77E2C4110E50C43627DB7EBAA4AE31105E27DA29A37E37F4D4C1AAFDE4D4C467DCD81F9EAFCDA55FDB8FB0239937 Label = BD55608F6C9C85DDAFF3F3AA Output = 12D450A798BB45437564FC4CEAA7F1DBB95A3C23 [SP800-108-Pipeline(CMAC(AES-128))] Salt = 1075A3E96FDEE1F81804 Secret = DD18316D16F3587F0E2A30E3FAAFCE0A Label = 828F91C78AA3E857585F5E4C Output = D5ED Salt = 5BF9219CDEBF1BB73F15 Secret = 5345DE613E50A21B3E180BB4D7566FB6 Label = CBF47100E1CD2FA239D7A0D0 Output = 8284 Salt = B9C8A441418DA9AC840C Secret = 366F061298B626F9A01706DAA543A2F1 Label = 3A4A8FF2357098A62B676D2A Output = 9A15 Salt = 3F3C00CAB020675916BB8F268111EAB34C027A66 Secret = 2794F3B1253294A2FB9FDC682A2524B2 Label = 1710C3F22E1D6BDF1C12F48D Output = 6E75EACA Salt = 61DE975FFAE460A92ECE20FD472350A76D77BE3C Secret = 907DBBFD363D8649B792D0185E1AFA85 Label = D3BCAE922607D1F7856013A0 Output = BF9EA51F Salt = 29922D56C360B33377C4FE28A7DAA681BD2DAC68 Secret = A87EECDDD9083620D774B4E685B7855E Label = E50BC02D5A9BB55FCE042E3A Output = 4FBA3FB3 Salt = 7F5025123428F547671DECD06FA1AEF6EF7F545DD35D4BF5F4040C7F8A10 Secret = 34E09A66EB4DA4185FB99A73EDCC17BB Label = 19449620A6A8EEDAE976A697 Output = F8ED77474ECA Salt = 0FB63C8D75FCFE302CC2ADB9BCD6D10EF76606EB7A5740DDABECD926DBC7 Secret = C5D78318156B9D7DF26B2CAFA866B070 Label = 9576EA8FD324AAC88AA24617 Output = 07EDAFD0AED7 Salt = B941C64B87D1E84B843597710D3AC317B419859063C7D5EBFB6351426F24 Secret = A46D76207EACF0508AD19E12BC3553FD Label = C3469A1AE2A5B574A74289F9 Output = 6C20AC298058 Salt = 8B1115DDEE1B1677B856570C26214F25EEC92011AE6C7E5DD786BEA1A8E0E4641EC3556C634753B6 Secret = C565959934397E0E4C3C8C0800D81577 Label = A546A25EFB81E7990CBE0FCE Output = E8D844E84AD254E6 Salt = FC1486BBD67270F100645660C7C8C2E199A63723CF80B50D92E0A2A8AFEAEB89DD95F51CA5133588 Secret = A22F89AB441A96467E6C38728D05AA6D Label = 07E3A3A9084353BB7BFD910C Output = CB7E39370A81AB24 Salt = 939E568C4ADEF163851AF9A8E37293867FEA196D9202EB81846A84EAE712E10588FEE8D4CA577EAC Secret = BD6F4482F44E8859CB018180CED4394D Label = 20A3CAADFD8A0E28FF1FAD3A Output = B256A1C2AFFB530C Salt = 8EEAC9B5DCE7199B501F57DBB0FAE08DC7DECF2516B4F3B5230EA3BDD7A208215565EBC07B75EC3DB08153BFBEB0B417D2AE Secret = 914AD9AE903684F74BA8BC95A3D51831 Label = BDD6396711C373859C2B7B9D Output = D6DABC916AEFC1E4000F Salt = 1A77D14F9AD202BEB5A5B6EF1DC6FF15B9915877FEE9E8AFB6F3280202EF8A24A6666928C074BBCDBE002D78B35A91B2296B Secret = C552142CF5D2130A88CC0973EE9755BF Label = A65E4E921F3F610BC25C02E8 Output = BD26A9294A575662E765 Salt = B1900D9212C0765309E38B3FFC942DBFBE6353185EE0E664DC4E66CB10278AAC1EA0183597BFB5D2C5D429D8A30EC925D3B9 Secret = FF300E8F348A463AEED7E50F707E6FD1 Label = CDC66AF089816B960D1F2F75 Output = 5690FB1EC4C0AC02D765 Salt = 451E805C831A1AD91D8F6871E6F09F6AAE3063496C90EF8CCEDD5CB5DD10D0128F64DA80BE34EAE01230DD9BBB9F252EBD754D18BFD80B37979FF712 Secret = 7E17088690D26A7B5921A0FCE9567E41 Label = 79533DD72C3E9D94262733F3 Output = EF41568A483169C3C9BC699D Salt = 164C384FED8BF25BF9D3BB626C988330718A0D7930D4FD3D0CDA6CC689FC654F6670F294B39BF346AA88D22AB5DC7B1E41D7F1F265ACDD7C93791708 Secret = 0EDB7439977D981E5587E230C7ECEFEC Label = 640FD56A73659251531E7BE0 Output = 8F341AEEE472CBBCBB9B54A2 Salt = 5933B28485D87CC34D14D6B5F5C2D2E41D7A2EA19B9AE058D4B55F8F1D6C92A7954B037249EF88ABAC1D8B49CA21C7EEF15F34677EF01BF315E6722E Secret = F9089D56D9A6C6F6BCB9992D1896510C Label = 3D45EDB9FAB78B295AB5B3CB Output = A2762C4FF7BC4D21E5C25245 Salt = 73F7CBACC851DD112B3C59FFAFEF864BD7BD86CA7D5B60DDE7EE19B7DF9EE5B51F18BCC81EDF0ECD9E81EE999E4EFD5D771682BE3663DBA3F66D749B1F3C38340741FA43101A Secret = 659343A9A868A5AC8627FAAC2C8BA5A6 Label = 22BBAC537879FC1DA5BC9EED Output = 21385079A7F295262BD2B89444BF Salt = 7446992627E11B33E86C65A3775AD85AC23D66FDF8BB55CCF765E91FDA26CB9C9CE685CBF827634B4FCE3AB130BAA1D987425CFDB65C85F3C48FE3671BE970B61D2CEDC1FAAF Secret = 842E659C36E9CB1251D155ED3F4EB517 Label = A4D8FD35E4B835C6265BF86F Output = 183BD78E6E042A95F751E7AB2DF9 Salt = 8FAAC1C89F29AEF341408485FC99AD180E0AA07F7E6FAA1F61639214617180DBF338F34F3894FD6121A381E332A94A95D055821D4F45AA2FA962083CD634D204E2A0278EEACF Secret = 9066D2332F136A0259F3A3B72338ADB7 Label = DEF6F7F5486DA5B30452A029 Output = 58DFC291222021249E5DA028EE16 Salt = 673858C0ECBDDCE03CBC490D2EFA945B473F0816FE10B003C707FC01CC671A9A1534658A83000F6E136E25AF619DACA7D935D9D8705AA91CA05730C48DE0464E2BF907135F83759E16883DD5954F5084 Secret = A5FEE6A78FCFF429D15AFAD018C63A52 Label = A368ABB6A8A5030BBA404434 Output = 98B76FDBB4E5BBB66C326EE0542D305B Salt = 7CE2E6944332CDC5357DE7B232FD7007933CF13970EF6706C0A3CEBDAE8FEED59246D2AEB7EDE3B676263D165488364CC6FBD7492C79BCFA1FA1C5DD73536B68CA498EF1E2BA28ED88BF648C06A73E12 Secret = 8623318122B2345EC46B29DCCADE7BAB Label = 23955B01F126B17F0F709A25 Output = C2CB1F5CA37491CFE53FA26EE0D9563D Salt = 98A3FAE45C32D56127A360E917589D843B9A3A8E54BF6D8884515D5B7B756064976D18303494C2C80BCAA4A41CFB3D1990396FCCCB34914618650FC20DD227754576004278D4740EB0FCC8A0A03F616B Secret = BBA9EC0710320EABF1D88B07291E5AF1 Label = F887468F595E7293D3E48232 Output = 0437F7C7F49BEB65ED17660D9CDF5C6C Salt = B9B5C1A0B5AC9C9D92003060AE79E07D2182F06724FC81C22265BAD0BA74544122418491D3C5602143D7B253D5D8D8339ADD8D1043B024A4621F2A7E16DBB441694B03E96A0C040AB39F9C4D1EBA27C1CDB0F3C7D42AAE82D265 Secret = 61AA99FBCFABB6F664F78A5D47B5CB27 Label = F9B86CF85016155F1D132D08 Output = 733B4BFDF1DA833D848B75064112B91F9574 Salt = 11C7E0E0B837859584ACA19E39503B464CC4CFD7D6476F17291E49E98A62C2C606AAB03D96D922E1E663E21FCE89A4992FD414EFF39AAAF002DDEA1FC4376325FAC75ADADE116843E1DCF9BF2E79A3FB80C2121B9B745EACCED5 Secret = 57FC99B324617EE7F54C7DDE15BF759D Label = 3F27EFEBFBD1FECE77637361 Output = 9D765431C510792D6DE20DB4BE1EF7D27618 Salt = 295AEDBD3062E88E9F039CF716505553D6027F519C840FEF83C67F943A17F40E8CBD9C62E26CAC1B07BE4F7A4978F30E70C2DC225965D66C45B16F89794D6ED221EFD2028AA0DC43EA9B47BBE5C9FFA48760AA3EF56436EC8743 Secret = B0E3FD5B7ADC18E22B67FB942084330D Label = C42C1E0DB85560851A666822 Output = 1883292E2F0A6DFE64BD70C702CA8DB2D4B0 Salt = 0BBE03778580BCD4A0E07AF050C9F618ECBB393CE5155D18A1BFE59C7FE07593F69726B42791AC7CEB8D32A76B31344CE0D5FF8DC46C6A830C8570EA9ABBB273F225BAA04BD30AA5F8905EA09DE70F3A9AB36BD072B22CC6AB102597268F4146A3FB64BB Secret = 3ABF45E50F22720EA8ECB0B7307CD917 Label = D2AA7461145DDECF16B1C257 Output = 7F8FD9042E6ACC8D93A08EA9534C4D979F76F2A4 Salt = 332460B4883CD00D59A5A96CDAC5CA6DF755DF048C178DF4751C6A65F8AACDC5BDEFA820961C69B7CA962FFB10750C90928E2A374C79EAE45595A69201507F4D92292B671E168C79E7E5EBD7A07B2223DF2EF8642B30014CF45C90F367EC654D87653B5D Secret = 5C81A99308EE6A6B917DC84D3B452ED6 Label = DF355ADA033D334E9BFEA26D Output = 74CB681081E0C5DD07E37D095140E1F21D8C5A46 Salt = 93EC8DFE0C5C9B93671240B61B561BE48B0E9F8E61266FA4638EE6D2E976DDFBD8A1B709DF4748F49D6B0B836E9524FB3A440BCD9B9E6C383FF8E2DD9F3D43131DB80B632E1D7D457D81C8401CC3D5CD9A849EF9F3EFF6695FD6DA177802C9E59DE6314A Secret = 329592EADE124AD1F9D0E6A1E41DACD9 Label = 69791B32D705BEF5F408838C Output = C3D001DAC0524F11203CB67EA61837A135888B3F [SP800-108-Pipeline(CMAC(AES-192))] Salt = ADC87EA121B83BC57DDD Secret = 796203C647B01FA2D0D0E4A93E84C1295986C3C2795DF06A Label = 08AE542228219DDBF9A8D50E Output = 7616 Salt = F665E7E96FDE00414713 Secret = 637FE03778EBCBA6C6DBCC718C2CCBB5947C69A60DEDA90F Label = C74B195B1F2AE82D6762F6DC Output = 9DD0 Salt = 2E4A482EE14CF6DE4924 Secret = FAF194EE0D64C6F89E5BE3295549BE7BF57CE0E59DB49633 Label = 41093D36F493A49BAD47D6A4 Output = 455E Salt = AAF6A371E5790C744B98AF130F3050CC5C605B3C Secret = B841A922DFA147076AA1ED7DD3705EDBA4199D6DF6E330E6 Label = 1289BE5EC83E78BEFF0FC2D5 Output = 932EC004 Salt = 48F90F8314E0E47246E9FF29E6F557A5961EC737 Secret = AFF625EFAD889AEE63F3A1B09C8B60144816B5EFB43A8EC8 Label = 010F0DB0047EB8F34E139651 Output = 125B9EF0 Salt = 5F7E0DB0FAF41356D7B9E657CA2C8F138CE20858 Secret = 5153F70B8DDF868F0BDA2D4E2E0453178153E8191CBDEA66 Label = B90C4338DD063770FBABBA3F Output = F22C8BFC Salt = 5F95C21C0FAAA5ED54916EF43032E7CE4F6966E21EA5771E9FF9B36282C4 Secret = 59E85291DB7C3CE97E06EB0D358DD176D4462A1742879AB4 Label = ABBBAFC68AF1D09D04B21CB2 Output = 5A7E385945A1 Salt = 436C6EF179E53DB994658486993588F8C499D4504FB1A51E1A38161EF810 Secret = F59971666D8928E44C1C4FA2882C7A7E4CBF085C4F0E9334 Label = BB5A980756FFCA949914DE33 Output = 2A2C806D60EC Salt = 1618FBFC38B0BE99CB65A3DDC56AF41414C34323E0E063CD24F73C28152A Secret = B040AC9058C67DFC54AEB3CFA0910FF278F4E5E789F4F6CC Label = 280B4BF782AA9914C84F5406 Output = 23B2C2155011 Salt = C0C6CD1687C6809A5DECE6D611405AD9524629A079BD648E3CCE76EF280D883EC74DE82783BE2824 Secret = 31BD281AB64DE9BA42A25E6B3294026CD7914F96E7D85D74 Label = EAFBB57C7F9B76C5A7698194 Output = 39C67239DA446C7E Salt = C90EA030D2FA3946B6BB574566A8B14ED910833F7B1FE7DBA555FB9DDC53F28638853FFB387B1938 Secret = AF792132F5735D0F1D4E7C039D9C03E48A2EDC68CC9C235B Label = 9E75239D8914092B3CFF96DD Output = 65B02C76961459DE Salt = 914727FFEB9CD8DAB85FFE26090D62F078523C18D8E6F139C88F911B6FF5DB81F4CE0683B50A03FF Secret = 44C2E7E2483BF5B7C423C265EF09FDC7E435C3854AFA924C Label = E55C098DB7280B879A40871D Output = 2ED703C519DF9467 Salt = D3823F6DF63BC612680ABB44C6391FD477BF53F9909CF0F4D0D98047FF29AEDA2E835699C85EE4B3F92C76458C2E8586A749 Secret = 353879522FB3DE4FE8D91A833B58D78FA80D42F670E2122B Label = 2E05E1B4F1A30D183F033E1F Output = F73F5EEE414EF9C7A1AA Salt = 2C31C73AE56B786835AE66FD6A7458640F510A7EA8F61F8240BE70811B6CCD6A91DCB9B46CB20E27B87233D9323A63ABC41A Secret = F6D0D60C14838FE78F4EA5E05DE3127B54EA066A20AE55AF Label = 2540F6996342ECAE4FB1BC2C Output = 6CD728F62591F1745867 Salt = D36662CFA05A62D59D30DD59EB1528EE0B863AD20FF5D9AAC185F59C55EB2846DD12AB25C066E62A628495738502FB702528 Secret = B04249CBBD9BA5BA9BD7255E5575FF68255EDB3DD9AF88BA Label = B14BD1AF7D002CEDCA6515A1 Output = 045D67BEE731BD53EA52 Salt = 476AE3CAE1AD6C92D45A62F650DC40500FCA9F046E2DC6299213C40C14AC1D39474F58E6EC1B5B6E6789D7C07F96C6906B631113059C0876BE035F55 Secret = 7B290A6246048C531AEBA198A61E01FB525B5A3376719AF9 Label = 67AD7F98C2EC4EFE455DD13B Output = ADA0B609D1D0C355B4A48B38 Salt = FD32AE3E64041FE77C4CBB68093276077E50E188405138C1EF727C1CC82EE943439EF1D0049194CCABC945BD1FED1D77E838033768600C438A50A723 Secret = 3BF11E748026BA1EDEFC2983CA7E6D6F7AC251A041248B07 Label = A84779F16654191A7E93DA85 Output = FF1D69768460516203E33D01 Salt = 14DCD06EEE9E2F26B1AB9C724B5EB0D926945DDFEB73F884EE56D9357A212191D548928ED2DBBBA06FE6AEAC3CE9E14CE2D2AD16EB62601018096CFA Secret = E9FBB8FD92F39B7476708CCCDC3AFC11A8EA91416539E594 Label = A0000E50E7A1294278ACED50 Output = A5A458F45C97ABC74CEFEDAD Salt = C28F152B77F4AF821F60723187501C493ECEE4F4354BC2B555BC3B68915F57614A1C79CE31DE2E5C4DB1242437DEF7BA04288344C294714185A800DF84C257B939579AC29A9A Secret = 6464DD12225F8AB6A847657C8F2DAD48343AD19CB1021251 Label = ECEAED94CCC9D40559D8A2D5 Output = 376646CE4DCDC86C86923999DB9C Salt = 7D444D26C21CE88D3A026485F82E8CC2D68E83F35692036C40D6D98B3E10D928C969E7DEAFD6B8BCA79C50CE8DDBB257E07038ACFC5E431BEF429C673CAB15617B25C60E89F3 Secret = 5F51E0BC30B346701336EF53087331D446D0BE5A96FE6228 Label = B21AFA500B5801ED8EF21367 Output = FDF1642950357842F9431B6D899D Salt = 3D01808153F3F6390BE601B98B0A93FDAAB471A864EABF8F02A9A5668BDBCB4CCBD14929D87ECD5588B3297E20A49ECA3E66136ACAFDE3C46E121BAAE289D955D1D45CD7D238 Secret = 3C3CAF127510A848FB94A756234F274063F74E04286822A7 Label = 5BE4A565E213E8D46571F7BB Output = EF65E5A8975A0151045D1FE7570A Salt = 8DF2B458A9DCF18097810CC12F641632EC94DB6DB4CB4881144940342B1763766DEA9E3CEE23DB1BE90DC02F57EF3FA8E3096AEC43AE1C2551FB8F84FFC7D5631D6CBF891377EBDEF6281CDC77FA5059 Secret = EB2EFD0D4EF97D38057FC44293090377C934118C062BCCF9 Label = 5BFB10ACE877F0AE2B7885BA Output = 0AACF74FA484D67D9B3B36B0DDBAF6D4 Salt = E6C328E0E5AFD2652F452391C2435F28CC85D87A45D1612276E00C2F0A2D4F52E95897952F5614CB9C0D26B8E1BA2673A5B11A434158A368702D49CABED161AC74640DD5267B05E1DAAA99E4FBD61167 Secret = 8DB6D396E11F515657004CBD4595594FAE34CEBD1B119647 Label = 2F1F097C29220466F09DD21B Output = 7C90BC47064293BC4B4D0F2EB77F9A8B Salt = 1B9681DB4DFABB3727E747F89894B5344EB2C1514D05AE9190DE0A76469EBAB926A8BD0AC81AB4CD23974011A823444E1E88F2C4309AA6DCE4AD17F09AF9390855D7D00C99D3EB06409D36633A94157C Secret = 73B1921D043688101892793A945E0F96AD8E825B8C0FD531 Label = 8FF81FE9146BB5A9FBC73272 Output = 11CAB5D3E44106B3A56D07BC339ECCEB Salt = 2B575EBFFBFCB1E1F1C76E22B16A406AC734FBD0DE3802AE4BCB21D343BB12FC8DDBA9B9EC8C2299B11FBD557936259A8E008609540CCF54D9624DD91F2908E5E5EEA9AA59EE14E66D96EF925D23DAD3CC77E83DDA94A6914C70 Secret = D12A9C03AA0E8D25FA17BDA4D452569E578E0EE0C909171D Label = F76A5FC527130C511F815B3A Output = 8F5970EA7A13669285B0B543ED2C0ADA516D Salt = B6BB6C4856E462082F03A4E1219DC6DC9BDF195EBCB765CF060C41A15BEFD119DF3015241E3B7CE3FA5AF873C181960F36152417F75B86020A66876C77822F898009D0C541B16E1E4B8C80C9721BB0C27EA4D863A69C96359B18 Secret = C14727DF8CAC2A2EA53D61750AFD3E841159A6E737B6B545 Label = C45A1C8B36311BA9731AF6CD Output = 11F018023A2FD987D2BF346AA3375F96CF30 Salt = EFC6C417E250117EC36920E85DBD9C9A2FE5954A8DA13F9BB97E7A700380CD16C5F5F2244972129C81921306993147485EA5C2F9C31B49C0E48F2A89EC079499BFCF1729468268520247412DB1A52789C3062CAB2989FDFBE321 Secret = 71955B4ECCA0A55D105E4FE9A405ECE0A1ADA0A373A09D68 Label = CB73F5363AA7AD18C4615BB4 Output = 37EAA2DCD6FF41C35013813FD67F65CFFAC5 Salt = EE913C0C8F8A7D6F89474019F92E784698B0FCC55A146AF6288440E5FA6DEF96D94BBD7934BB47410CB829302C93525018E8CDCB45ABB13A0BE1A6053F1F85D0F33CE3DDE75E215A413FF332390890F2BBEC3448F617ECAC996BBDA5945AB71D1027A400 Secret = 2FD8A515D0A4708F261BB981E0446F47F044B8FF048C1B62 Label = F1EB6BEED62AA9BFDADD30B6 Output = FB0C680F2E1361DC3BBD68367D35E3244EB2618B Salt = 69B2B24BBE0D0D37D476FF5B6304DFC46C047F87795B76B2A72FF883670474585CC49021DA3F12D0A3B57818750DFAB86296CFD2CA8E3564C829C65F54E628BE48EF0D72DF211C2DDE236D35FE2C7136532515235ED6B8F64257BB591A402D38B79A9059 Secret = A67B30A4E8F5AB8EA67B2267BB70EE5154331E941AB77D42 Label = 64DF27367495900EF9CCF580 Output = 74F5B5B77CEC24A65F606EB9F1992AB0C6715F46 Salt = 27207B1CAAB5130E6D02AC75A0187ACC62896DF8B24CA48D9364574F17758E04B66A008B15C5BA621264D33DB435069B3EE3550B9A76A284C7A6C51FC420207CC07BAA2EEA0DED75CDA66A548B9E1D9340065CB5C9826F5A11F313B013378E6975F4B301 Secret = 552A8673462D99B105756C60453B8603223A7ED4C8F10E92 Label = 4389FE8E48BFA8F2B9D65F11 Output = BA40C0537EDABFE5C0C9C6209BAF1CFDBDCA5267 [SP800-108-Pipeline(CMAC(AES-256))] Salt = 733DDC0E01690564490B Secret = D947A26C0847D7E2083B04442E53162073C164296E7EB0B4D6782468FBE927DB Label = 2A1641FE4E847DFEF0C3C5D5 Output = E3DE Salt = 07CC8257D5BB36BC5760 Secret = DA9C2FA068A980DB835A4CB64CDAAB7E167085A3458D3C692CC316098CA186A3 Label = EB2D60F65A408045880EB3E8 Output = D766 Salt = 4D79B0D206BA11C88C24 Secret = D2EE1D15F20B87B492C5252514E758B3A11FE6290969A0E1093C8E2343DACF30 Label = 75EDD913EE239E353D234B57 Output = F628 Salt = 2DBF1B40E18CC57EEEC0EBBBCEA25C6DC4E1371B Secret = 4507C93731AA217AF46A8D6012BF6B552F4C95A0A8758689E30EC3DDFFD82A22 Label = 7275CAE423AEFA54B32A2B35 Output = 52E82EB2 Salt = 3C0F3160365A2EB9C276E1BE70ABB71212AE5B53 Secret = 3369B4E54BD0398696FA4F88593F0B9C0B6BA87586BF1C7142E215C2D0D90239 Label = 19B570642F68B2D40ABEA185 Output = 31671A3A Salt = BFDF354A4A5859A0499C5CF2204E2E37E46BA3E7 Secret = BA6644EA693B484E407BC8C7C9F1A3733D0082BCDB03CDE5B8A0E176E290D8DB Label = 3B11FED280246C79D3395BA5 Output = 0D5E2047 Salt = 1E66EBF2C6F1257DF6484051F222CBAA1699E77F0825C14F6AC4F943E15E Secret = 9AA3E82503F4D39BD681E12733226F9A45F3C4DEFDD7F37CC34F6D4BA269E7B5 Label = 766CDA9B9070C57553218205 Output = 90DF0BA02D16 Salt = BF0743A6E7CF45196DFA9F95EA2AFE7E2F34F4CB84739FE31F944BD3A640 Secret = 8E5205B9A6AAF403EA4D43475CED4C3E5D8B38843FF3474C800A17124A3B852B Label = 51E7738658DE02B75F363EEE Output = 633E8F5FDF9F Salt = 1226BA13BCEF84FEBEBC73DE932A1CDFE6EBEAD547F142ACF57067CBDCA6 Secret = A448900D2438EDC58BE6885F9A4F07BCC149322FF8E4EBC747D7ED5BD523AF78 Label = 7B086C5533B98AB1B13A567E Output = B5FCDE478E65 Salt = 2ED4C6237F270157E5F1C0BFDCFEB25F08A32AAB263FC2C112BB4FCEC97E70D845AF4CD123003F69 Secret = 168047F84EE9C5C743CDAECF868C3441E677234F2661940B2BC67E1F795C16CE Label = DB8C31E567BC97BEB66C29DC Output = D11FF9FB01EC7AD0 Salt = AB280A0F25E4BAD8391B6A80AB5FDB1C0A7C3724420149956C8C9E4664B5BC6F6BF1FFE263054708 Secret = 712D4C796CC90A9808D36D73FC9C1AD754E1D36B84F6919490DD17B901A8AA01 Label = A2E4F7ABFA96B6DB98C61FAC Output = 201361DC17E0A619 Salt = B1E4B7E2219B246EFAE9BAA270432D81392358F913D9339D7D64413335D4F44FFF06EC4EAC28823B Secret = F8C15AE39557262216040FC37A9D8581715F5861A27226A4A73043EBA41C1144 Label = 4EE177EC425E51979C8D030C Output = FF5E740ED4B71EC1 Salt = B823A1891DA51C58A7E421B5D76DEBF16C6C289062DFDE5CF4A92EA9F775CF387706B99BCCA9FF8F4A81056B190F7D61CF66 Secret = 2774C5AD057F01C507AFB5FD284C6D8871FF8D2C7590C64B88A60C80213CDF6A Label = DF1DBCC3BE7BE773F829996D Output = 268F9047253A6F2CE788 Salt = 40B373CC4044552C86FE989C28F1379C2EC4E5F2F5B2DC850FFC1E282EED9500FF0DB866855382FF2060A2F7223AF7F4BB65 Secret = A3A5DB6602CBC2A2CBD8BC341914D9A762A30C5F14A120B984BA5FADC39DC126 Label = C16217CC5E2E6C7B5CB0BEFC Output = 57D8D49F10505AEB6ED4 Salt = 7D68B9EAA414F959F0D0A08F9EE8174B33B3B346AE3A70229F5C4CF9A26AF015ACFFDCA89BDA1670326BEF62585651F53B0E Secret = 5A61AA29A2AA8384AC05D7DE17FBACF7DE1F0631ECD29651CC2062C15460AC14 Label = 2D419635A6AFC3C1F7A6F5E1 Output = DA89D1848A3A40213872 Salt = 32F80BA97A9E165985BA2EDE759E15AD113D88F17463A593B4528483D8FC1386D9297D297EF32D7DA64424E93955EC5C5CFDD0FFE67BD96E3D049468 Secret = A09D3A9F7AF5997C59EB22A0697BE5F8084C1A0E6A20EEA3D0A0499E9EB45304 Label = 26CE10E1EE8A146ABDBCE368 Output = EC6795130F4F2F76327C0FD2 Salt = 28E0F4658D9BC976E7538C12A86156DC3376D688168F9991DFB967D9DB40F9B9C453CAC65CD92D126A188133673D1390C54165FAB85F5F53DF65F42A Secret = CAE7E7B9A189A9F445343850A5AD9D486E7A44EC1ACDDEF44849F8939886030C Label = C787A5C5D56C4F958C1CF01E Output = 62D257E170E3082E45C8EB01 Salt = 75F57FCBE6FB6D99049A60640509E40534764371C3BADC1DB10CFA8D5C6E56ABA2AA9BD8D4F6C30F275B8C1809EB4894E3063B15BE43842585928A73 Secret = FC71479106DC3F38B1C960212AF0C9B2246AA6F48193E38A37EE25CC57D4F6B5 Label = FBE1B11AE2CF6072ADCC0976 Output = D38063907E6368E128279086 Salt = E55E14D75C2BEE8BC73CE689F7FBCF07ACCACF859839C254E904444AABB05B621279804D1F5C5BFAB38D4420A5A8C397F4050A38FAB4E0B52E235751227EFA95DAB8B60B5372 Secret = 27783BC564A04D55C4A3EC3B45B80B9FEAFD95AB37B049417E311252402EEE99 Label = A6DBFB372EA43C8286AEFA69 Output = BDA1E29C677CB015B4F8E6A66866 Salt = 280E7E4C807726C00E834141243F9A34341E8CFA719B86EE73C9ADB6960E21A82EC15A75FCC5D38695F8442628F8056FFF5BE9E7F7F1C8F9486B07964975C9C0E9159E12FF03 Secret = 54AB51A887404D0A408B309A59BBECCDD409490CD7A468151DEE4692750AA143 Label = 42B796FEDC966727BA2B558B Output = 731FF2B0C7EC040926032D79732B Salt = 0BE2FBF66E76E790DAFF2465EE1D98683B0E15CE3CC69ACE61236E0F2EDD02040F9BA20AB95DF23438D716E8BF9F92CEC72BB0D393848D5B7F7526223CCA532F9A5C5E733DFD Secret = E1150A9C00F74461D1DDA425B0D8D809190A96C79F61A33986B55DBE3C2A96FE Label = 917D816D9086628F21455A5E Output = 4F58FBCC76FD38B9D32E426EAA5F Salt = 1B2F2DE43FC50098BDED16DD9AF636E2C4D05FDFFD75D93FF6D8920F5B98E2B55ADE4809EDDD0FBDAF7B79F1CD6063DF1562111D923DB0D461BF6B3594FDB6927719342844E8C3F1BAD17883925DF3FA Secret = A1F239D35CECBC76304B1CB922B4DA6C627425FBA8F7B7A1ADA5F18C3DB6270B Label = 2FCEB143CFE219A77F63ECA1 Output = E1C389A692BE4F29802459AD91E1A291 Salt = 623CC4EFAEE86F2779C135474BB813F3D0E6E48D06579D45D566F60E2F199F39A50BFE0ABFDE8501BD9690C2B31AA039BBB8460D2F696E99CD980F144B2CB54C71D3255B134EC6E08C77976AAA4BC392 Secret = 70AA98CDF7AC6B5EEA0BB64EE18D2A9385C3C2A3AF45EF44D2CFC7E79829FE76 Label = E6331E6332E38234B407682C Output = DBD244A417B7B00B8C394A632614236D Salt = 75996B4FF06D2F5F5E25637C58596988FB0302042E9DC5EF47E66AC4441759C2C8BDD9B8188F530EF8A5625E38A12A22C4639A73BED29CA5157CD7449CA27180DDDFCC8D20630C05FBB748586A659549 Secret = 22EA8894BF3E8F96A0A9BAE7D87B95C394A996E626A17E08A3FEF03FE16DDED6 Label = 2CB3A35B07C95A27BB785B29 Output = C992569D8A2AAAB51F493CAD32803C15 Salt = 7FC136964158C40AB4B49C245A60CBCED5F50028A5506162F3EB2CD8919E5CA075C47338F0D5DE457496AB90284AAB5952CB8D986D9D6329286DD4422D626CD3A131816DB5989F33D9ECFA33759C4CDC34755C6CACE85CBC78F0 Secret = B9CF0DF51A4837C30A470A920D5C98C1C034EF4BFFCB145C78404A30650165BE Label = 9ECD853B2CC808C7BDB59A4F Output = E0C7C18C9CA3E2CE6C50E538AC53A0BE39D9 Salt = 9CE9D2CA5064AF80A982F0F9848AC90AEECA5E8DA5D0D7B54373E587AA4E74F3300BCED0A2376BEA70C0BA8E74BF46F5A8F26058199EFFE1C5DC07E6C08503D0A6046FDFEBA9283368BE55A785DE5336ABBE88B8FF9CDC7FCBE6 Secret = 14BE1D890D1FA7F8A3AC41BDE09FB6A80859A0AFAADF00C0C75E86D432A49EA8 Label = 1B81CEFC2FE84C8042EFCB40 Output = 0002F4248CE7426C27412941654DD3AD090A Salt = 6CF2E0C8088B5C02E2898ABE94A120B1FAD6D91A04F0F42EE05465EC69539101CE9899C57F13C0CC38C9FBFA0C994B4C918D5924C381019F31E91D683B73FAF8242BDFEDFABD2BCF521AE3E450D5F60AA402AB37221BC7C9E7D3 Secret = C844EC4E672752DF11C4D1580A774C19444C83AA3689655C47A7A99108BA4421 Label = 0ABE755E2A5AFD167CAB650B Output = CCE26F3C445106A63AC1CCA94CD7F5A6ECE3 Salt = BA4AFCFAAFA75E494C571D29C28C0B524CAFF6B232F8DD489E0AECD2C3D964D9BD9E80870C1B17F75BC949EA80936E84985C561C933FDF2573BAD8C855D02A37C4E3243937D959FA32C107A0D4DA9F198852B53FE19C7A3111466A8781B0CEC8CBE3A8BD Secret = 3BA4A05F42FF981BDF612E99A02BD2E381A205FB41D52F9D682E7264B3F63173 Label = 14614DA13549C39AE78D5DA4 Output = D10B8B39FCF1708BF32F6DE61ABD30CD664ECB98 Salt = FB8F8228ED01E5CF5D930C238984B6E8A6325BB8F143B5075E49DCF1F49101BAE6B94B534BE48FDD4318A12B8ECE2CBCAD7B511BE411E0BF727F51CFE7E0CBF77FFC32EE37F097D88F257DC00BEB0B5E6889AED4E37F758259F41F54E5677D0F1CAADDA9 Secret = 6F03A0F655E70CF73E5DFB736030D09E9CBAE804F574A446E00A304D77BF865A Label = 3FB0AFCAE634C6975950A6BB Output = 8567C4E97D137B414898C63B9931BCB1FE3A1227 Salt = 52DB1E3162BCDBB1E9E3205A1A663D0ECC6C627BA70D49A9D8E6017C10A29F496C2AFEEB9A293FD9164EF024B660730888105A26182DAA047979CF21DCC2A833C48B1A3D7E3E59A179F340A6B122C6CDE2025A93BD4E1CDFAE70605CDA05E60CEB920CB5 Secret = B852048FFF2FADD26AFE3EADE78A7EC8E1AF1F18274B0F9B0DBF3259CCAF9BDE Label = B866317C71F7653D8A0A6753 Output = DDAFEC2A7BA2AAEE7285A4753C7E92F075CB54B9 [SP800-108-Pipeline(CMAC(TripleDES))] Salt = E722575651EBEE966409 Secret = 1BFAA9D892865593740C603E5024E404B5BD1CBC683662E9 Label = 99685641B2AE3ED6C5378C29 Output = 3BF1 Salt = E39CDF9AC8788398E432 Secret = D189E4DA0750C3DB51EA9ADA54AF980DD84DC9814F3CFE80 Label = 7DBD029B6EDF251C226DAD77 Output = 982C Salt = 786DF52D710A72A32385 Secret = 95F738DB9FAECD6E3CDF963CC7E343A4FBC9AA47EB7B9343 Label = 87D5A097C9CEB9AE3CF549D8 Output = 421D Salt = D6C1FD7269D6265227D061920DF9E4787FFD4869 Secret = 721FB4849C03B203DD97EE94C1C2172D8044657B24B7421B Label = 5850F2FE47968042832E64A6 Output = 0EFD60E8 Salt = 28851DE693C361E017F468BFF1F3F76AA16A1CD0 Secret = 55FD00F2ACCA229608CA8AA0C0DCEB08A620C91A5BC25993 Label = 45229C7DA6A6DFFC2F650992 Output = B643ACCD Salt = DE55DCC319BE8857D324FDB3629B5500945439F0 Secret = 583375F79CC3C9CB60F3522D59EC4EBACED30235FF6797E0 Label = 6DD86E6FF66354D37C253177 Output = 48477BEF Salt = 5A06827C85358AACB3207C740DDE669F50F378973125F96B389B95E99236 Secret = 415D5993AE2F28A70E591D85543BD18F4AE494D48E0E6B52 Label = C54B33E5B5A25C7F2163D7C2 Output = B2D8B23A5886 Salt = FED674D1FF3EEE130D348D546E26FB507A5C0EB35DFC3578FAFA6DE8D434 Secret = A4E37C0B29607E2E6EEDF1566E892AF1EA1ECDC9D5F41C7A Label = DC3C6BCEC7B778D79D1DA422 Output = 955428F03D3B Salt = 377991B4A843350AA436C97778B215DEB5C8BBB600F0E334C9E72D8BE2AE Secret = C070CE006E24E445DB9BB66BA21EB1D69CBA3FEB8877013B Label = 816FD53AFD6E0C3D566D8F1A Output = 671AEB3EB95B Salt = 0CE2BFC090CC63FB47F2BF23417CE9F233B5EB71423F5CF8DF24765123AD894718F1B829706E11E5 Secret = 9BEEB4AB3C69931917F35469601CCBBA19E2041EB3F8BC58 Label = B3E2A3BCF78D98E91BD91E30 Output = 6C84596AB37CA610 Salt = 4E0D59BB17D7B7040AF7C000A9EFDEB1044C0DE6B600699CBC31E6511CD605C4F5FB544E889DBBBA Secret = A88499FB7C4D563A1E915F64F0EAC97F899C9B1EF22D304A Label = 426AC7BCBA36FF08C0794BA7 Output = 68FA6AFC6F238E1E Salt = 978CD1331466E87B1BE6AC41605796AF9576BD633AA6D9F0DE722D03AC513F5070584F592851B860 Secret = E2DDFCA892C1EF591B242C16C88095AFF7A8D84EDDC45025 Label = E00B8B63B5A43CF33EAE8D5C Output = 2EF48455E9118E70 Salt = 24B86D8D4EACA2EB17F05953C703AF7FA1E9A19F754118CF54BF861A470A55DBA81DE5A45E9E2E664D5E22CA18E681C06CEE Secret = 92BA5388DAB3295374FD3351318D8BB6272AA8470211A209 Label = F5A964C8635C7D3909244315 Output = 4B8D6C6AE7B958543492 Salt = 3264EF74126A2E3DFFB2179396508BB9243B8743B6D6EF3073A5B93B60383D21E5AA6838BD0E90266998584B395CC114E30B Secret = AC72E96DC2C9CFE248026B9776C09FF6D0FA6FAF3BA4997C Label = CD0DB83BFD17C7CCFE761203 Output = CD9501DC23D54D51BB7F Salt = 9B647809EB8133D2A895EB8E2062BF289134F7022CDC3FCCC9A85B89AF04C0C7439BB66CBFE05D33C3865C593D209C53190F Secret = 25321A6A3EFC902BF9DFB39C56FDC470E0C7AD0C6F0D51F9 Label = AE79CAFB3A905A302072AF19 Output = A3166D56CE6A807F47C2 Salt = E9234007F0F8893835B48C80B55352B6CF17C0E4E476F12E3087EC271BA010FB1ECE3858C94BD0BCD14194150CBDA97B2DA8B03A6EE9B0FEE2DCD09C Secret = 2EB2516D27749DB56CFA18879BAF4AB4A489D712ED9F85A3 Label = 39EC05A5ACB2EB3C0E54B4B6 Output = AC26DB762D9DBB024BEFC1E3 Salt = AB0D3FD764737285463B2FB921FCF769199659558DCBA1987F9C357B44CEE0327C8870065DBA53094DF1C7EB6A1BF9CBE48708D0485DAC76163F712B Secret = ADDDDEB8A1A2881B365E4A3D12742EB42B5032AA5E48A24F Label = A3D46F9339F7FD7C079C3F86 Output = D45BC99FCACCB70F41D21ABB Salt = BEF545F538EB29E679F71A406D987DC62F0D3778BEC237E21D8D353806BD6CE6B9475D55A1814C7E9621366B2F3BD29A701677E4CF048EECAA4E9ACE Secret = 6D99A2EAF62E4C6020AC5C29DFC4E84B45AD1119F73B7A1E Label = 51B92251565F561E104CB589 Output = 170B6FB6C70925DEDA196561 Salt = D1BED94F3ABCE6248729B7271E644013A499D581C6A2C0EC0107953B589897D5DB3440255C8482A0B281DC5EC63B6B473115E317F9B81C3E90FA2B350C780A39970FFE495BA7 Secret = 86158BB8082B8445C102F828C7EFCADDBC2ED4E89482A54B Label = BDFF812899067F84DBCFF97A Output = 22325A572B72C7571062C7F18402 Salt = B694E052472EFABB10B33A89F5FCB460A085B63FDA8F62ED88A8EDF5A847221AD7B2B634D6953A459E956CDE4D4D4FF42BFCDE49BFA38BC82972C16C742452C457E7C4F475D1 Secret = 0B703E1F5F6FB95B770CA6D2A58F85D4033C31B9DD27D078 Label = 434334073E83B79436DDD7C2 Output = E7B6862DB49F8CC878ED1DF2ACC2 Salt = 716F53A2AA851E2F0D57510DD47F04EA7BC04FA02DE6D0BF0FBF507BB46E0BD182D45F6F629C0BD07DEDBB56911ED1A2C526210EC26A984921B2826B6D25FED56385E033111D Secret = 99413C7934DD84FB6598A5D03934F03D1D5FC9AECACD4B24 Label = 279CD444BFBEE9D47146016F Output = B266D4360EDB4C16C0E3C3440D63 Salt = 64283E42F8BC740996F3C3C25B0CB3092D4CA69FC70AAEA96C244C3830BA2B99556A6981A20CCD80DD4EA8EDA14C12D2EC0A07591A6FBD2ABDE13E3EA3BCBAD897B60582D0CBB0A6176E5534998488F8 Secret = 28CFD54E6FCE313F711C68FA4B9249A851E99FEE0EA68D80 Label = C91115144DE1B5932A1A7AD9 Output = 33ED9ECE654CE964F02F6841A591EAA5 Salt = 9556E742E1F3ADF888DFF1211759D57AA552B1E0E4BD799905FBC95BDA26A85A7083F9589EAC6D220E0029D74BD73078D9210BC815282083068AC934F0CDA6719991F6333ED0819A98552DB43C271EE8 Secret = 0BEEB99E5976A2BB4C35C241AE6A98F9ECC3C9DD4005B778 Label = 4763BBC64F7D72C70EEA047A Output = 90518FCA6133E0EB7C500FF74469316E Salt = 740494A2CDD08A8329E9E34A86562A5594EDB51755CAA44893FFFAC12216AFAAD858FFE1D1F81BC2A37F0043CE855440928E21138614DD4B7A1202C13AD9A012EB5817F3BB551A385ACAE1F45519672E Secret = 7DD4501C02A9B647A6F436FA6A2F4D2C209D517B7AB35A96 Label = 68ED779DE89E76B41C1D21A9 Output = A4894BCC6B55400BDE17F3603C54A517 Salt = C05E5D961A7BEDEA468E1149089F2DBAC91C8F2B6A6993C679F987F52F8D4C03AD04DA143CF62C08DE8F25849E1BD3F0AFF567FBF064E769504EE50617BECE2AD9FE654EBEB181C21E2DF8AE42D527A8D7731BF5451027B5BA44 Secret = 38C32DAD77677ECC90A84CF1DAE82E13580388D9852DCA6E Label = 8B88CEF9ADBE22423ACDEC74 Output = F26AEDFFB81E42C844A2CC51997DDCAEC016 Salt = 72501E11F27AF7D6B678B45E102EB53ED9ED28401A828E07AB0119127D7875CB192D48E654C70C604D139FA999DD70DBEE7B2DA3FE56B818C2E47EB85F9EAEE0AC477145030846344E186B1BAF38F764B3010E59F36BE99DEE71 Secret = A4D17AAFF9BD0176574B4935A7F44DF2B6EC61EA7EB52F59 Label = 8E897106E17A8193CE0284BB Output = 6AC50F1A4D4362148F094BCBBD454675B265 Salt = 9F4C821A1CA1F46A4E38028D66208458AA781CE0C07A46B61DBC6B1AF5D9837C91A540FBDBDCB22A56AA3BFD0A925631F4E0163BDD821FAFAA095571F18DD4578E818FA5D0B53A11EC86920D9D584E5DDA465C926223FC5797DF Secret = 821F2601089EDE79ECDFACDC04BCECF030AA27329226E436 Label = 1037DDBC38DD21A577035830 Output = 4FB6A1B737F21F30F17F81DB0D968761D7F7 Salt = 1753F289BAD0606B7A4364A1535FB66B438E2B3F65ACD862C4DCF511320B68685FA22ED935C41B9AF678BA6754E7F4C89B61B11CA926766E149927DB858D0E74DCA66F9201FBF34DC80B75BC6CA4E346FCD6FC35AAEB3FBF784AE4327F3A11C5125FAE42 Secret = 78D169C282DB42CA61EC2884B7BCAB8011270E79E00EE038 Label = 729D978124C6A1722B075F15 Output = 050BA2DEDAF725E213D80B3A2E50D515C30AD5F4 Salt = FED6F5072D3B9820AB3E5C5091271ECE9CC35B83F175A8AE728DDCF90E96AF99F4A50ED6B737B29380712C121FB8C769D3ED2501C737EA08D129B2EF748431E7BE1282E931F0D3200396B1D86249E97A937E14A0CE4C1EC7C62D674912989FE951EE0147 Secret = C091A6A1D3F589FA7EC75CD078350848A785AA48D443D34F Label = 9D7CA06048F917713666C372 Output = 241CF887E1DC5922F6B9E912B9BCDDD444B1761F Salt = E7DA5C0D04055DDF88B00E1F6270592E903B7D6DC2D87B6F30EF66ACB54D566CB8FA1EA3197BB55036B3FAE1B439EC87691A8ECF959FB27857CC8878F7173CDC1ECDA9EAD9407385ECDDC7BF827A3551584B068A7E31EA6504970FC362D44054746EA909 Secret = C5CAE911C71DE1B4C6C1E91301764A44A958AEFA2F025241 Label = 90A0EE259A6CEEB9BC416F33 Output = 090D2CC1B6288BA61B416BFC6F3B6492B80C319D botan-2.4.0/src/tests/data/kdf/sp800_56a.vec000066400000000000000000005671121322470703100202650ustar00rootroot00000000000000# Test vectors for KDF SP800-56A Revision 2, single-step key derivation function (5.8.1) # Generated using Bouncy Castle (KDF with hash) and cryptography.io (KDF with HMAC) [SP800-56A(SHA-160)] Salt = Secret = 51373E8B6FDEC284DB569204CA13D2CAA23BD1D85DCAB02A Label = 6C5544797A91115DC3330EBD003851D239A706FF2AA2AB70039C5510DDF06420 Output = 049B3766 Salt = Secret = B2F3A2D4FBB002D9F0B51258AF43E98A5423FB145257AE460342361C2199D380 Label = F9C06213585289654996F0C40467B9A69480AB8D5B16A08C7A0C5F1570F966EF Output = B7D5840565 Salt = Secret = BA68A99D6EB2AFFD8BD039AB13C3A3AA9F02C6C11FDE8570429D2FCE61D97D81C51CDBB8FF143D04 Label = 9D4169CC1427F2A407191B84AB7ABAACE66A95CA26AB0915803106315080F331 Output = EEA3281819DC Salt = Secret = DC5E08ED643FC5ACA38CDF756CA0D7D678F3B241FA61976EEB16A904FC83E0326E1CBD639A9591899ADF8DE1FC1B1B5D Label = 430312B971580AC2ABBE70998F136D3CACE833E0B165B74C351AFE5FA20D1EB7 Output = 4B16A5BF2E8885 Salt = Secret = 2897B5B2F94BE3550BAC75877817A0F47836A57A5FF777345DAA6E5F0599D4AB8D4C59C62067AEDF00C02DDA77E4AF871CDA63FBDE164EDC Label = EDEFB6C58327538F3B4F7E4B9AF30C7025122DE56B7E682E56D7EFE433C2CA85 Output = 2E37D1C5915BF991 Salt = Secret = 7566E8A2FC90BB54E366378A1D360CC0FECC1557910971848C66D1287D147B618F096A9B469B31D7FBCA3FECD0720EB89C3B46299034749EA787DB044AB7997A Label = 7664B2D719770E089BA50304245B45BF330AC0D241BAC76D55F330B3981CEAFA Output = B118FF090E0DD8FA4B Salt = Secret = 969040DA2CAA520EB50A19CC38FB5F0CA9706B51C08329844C7D3215037DB3C77DA4D6D8761347F4C3FA96ED2D3D99EFDCFB89718654062C2A7DD0D5DA417E37D66DD543A53E6484 Label = D8FD0095FE329F956FFBE411F5BBC5661809BD60DCE865EEC08DF81BE59C5AA6 Output = C05DA6E8FDB753F6196F Salt = Secret = 12DA37D3C6B51CD79EB5EFD1DBF75F457B1424E681C5D3CD85EE3C1BCC2D32F30AE19BF86D17FE382631E501A8E7D0DD9074934A0F2CEB98CC8613971E80056F73F6C25DD99BC52190799F23706F6F27 Label = DCB12731AD8BC0308EA4BD63F4924AF269936DD126D4ABA28C8C4C6EE489D10A Output = 7307C8917A34780F0EEB1C Salt = Secret = 6B9C5E760EAC93BC00542482AD998EF0DA4C49532AC2B64B398A63EB8B57B73C1E9916288968DADC3DB80AFF7DEEF139A45519833FA889B5422646CD102F1FA82BF9F0018A32EADBCCEB835E9B4CAD51FE411D977844449A Label = E8FB3E3052796E282980864686C382CA9DFCE33C92429B0DA13547FBB6911E90 Output = F7CC3A963D22CBA84B655A02 Salt = Secret = C65E98F36147239627FDFBEF1AB4A5F73AA3D5F91D68D81864788FBD6BA65C8AE4EF8C941FDF6D73DEB8990D45630B16E1A0AE0CA0F970BF08EBB7D7D84C612BFE5C0AA5AB3F53372DA692AED23DF90B1B08F32B000C898BEB71BCE743517B04 Label = FAAC974B1E71D0CC25C4C015D84BA72FCDD9C0D9679A48EDED50F5BAF3DB9510 Output = A218295C695687E6C976B96828 Salt = Secret = 817F4A10573ADB4CD667DBC48B2EC6C23450CA72CF1E0072D0450D370BBB9EB3DA2CEB9D2FE94F36D8B5B3831E02A5624F65FFB437CEF2075EFB747513CB0EB58F42DAF7C2E6930113B404CDC0D3C4AEB3A3ABF70DFCE220CB71D53CE156E645FC92686E3D907DDD Label = 6E243942AF420F4E78A3B4FFD6BB1FADF401A2C2D0B28293E5990D0929CB5CE3 Output = ABD64BA7B218B2EFE4BD6A11B67F Salt = Secret = F80D6C1C42D402E6E4D18C44D45A0C78A674936EDE4B4FC14C6F4D47C378DBD6B67860819F37AA5A553D36E9F34BACA2596107F475BDB891F9FB9B4101BBE55DC5CEBC789E58FFD74B480ED33EE2124667A5CF7E724F4BF231FD96A3536484C65839A3A443E9D359128D29A5300BDC00 Label = 446CC99F84CBAD1D0951AD04251DE3CCED5305097DFC84BCCC94E51C2E39D571 Output = 81500710004679B09F0BA2D7B3FD7F Salt = Secret = 6D4106211D95D9F76AA02979EDD8C388E1365CC8CF91455DE0CB7BB1EA541B1ED1A652B6730CA90E379596ADFB99C4C34185B28266FA499FFF876FF52773C57D6C6733CFAC07D9750015263B818C0A9E0E85A47B6CDFFBDAC8D12CD2269AFD0B11C9E6DECFCB7567E6CF8ED1A850DBADCAF7F2CECF850E88 Label = A6139DC9D3C54D939CB728396E78ECC6136A5567C4D52EC06647E3218BFF252B Output = 86F15C6A516D28419456D43F513DB22A Salt = Secret = 3CE74D3EF4943100A0EACD79F28C764977D05CCADABADE99A09F2F3E7ECCF1A0562F3D1D9BCC18E8B1C3ADA80CABED3A707FD4298FD1F708120739A9C43C4A55AC422E060506EBC519BFCBCE8B5A7641D1F32100551E93BAC2DD07CF93B67654411EFE2EF24017D556401A86AA3F2A196F4D92EF60FC1DA11D98ABF14FEC676B Label = E8B4DE11E3BECCE934705789CD2F21463F50988748D6D027002EC8E1BEBC2786 Output = 93B984E4CD02CCEA8F5212565B9C8F7269 Salt = Secret = 495C82408DFAB85487983026DBE15FF09CE7FA77C6C0CAA08DA2C91047E12EEBA9617FBC8891961BE82C8DC8E79888965C74DEAF43CFAEDF3B6B18308685EEFC750CE60BE6D9BDFDA9145F4EB5BFED49D6C2AD27C6A736529E043F808A7A4119CB936B50D02D85A2D4459AE0F3DEFAC2049134BF0E945537695A74B2FF7A9C9DF4DC68BC2201280B Label = 335DF88135E195878644EF8CC50591E080A3DCA55F48DA8550C717AF07E42D32 Output = AA5FCCA5E1256FE7694F9DDC7ECB7C9867E7 Salt = Secret = 71A4599C21E079932DD6493450BDD23034633103C26BFA775AF44BE897AE638E8190DC39A8F3D84C56592F85EE57C2500725BACF3EEB5DE3CAFEDB0070FA1B36CD97D29C5740F90D1B4631FA90E9BD6AD005BB0A2D6DCB8A47751BB84016BE6F64DB7EF4110E2A896B5C225A6586EECBC86C219AEE17C0CF88AA616D81EE7ACDFC03753A5B7B121F4A401DA213D46673 Label = 665186E586A5620E1547E6C8E08D90EFCE62B5A206334169B1549F5895D9E9ED Output = 8E50DC05E58E916B3158CFEF5A1673FCA80E8C Salt = Secret = D8281359E194EE68386AFB06AEF687D7C342A270F8548B2FE2A0F9F650A997D6A4F8C9711FD28E38B9750AB33E26AB92199BD6E8BC6B0B2F0073D5C035667D9393AFB68C5580926C35FA351C2F2766B95EFEAE4FF30CBCF0F2BC0A2D279A6631FD8FF6F7C67A6E91302C19C6FCEC37AFB48A318F3C580A025299C66F38975E59A88D55DE1BFF567C370A9B16314777CB4364C4CF289D6B75 Label = 935B371FE9B959B07DA408F97387C05F72D426CEFFCE3D986722BDCEA64C334A Output = CB8BB8AFC2A70B47169931B3117800DD714C012C Salt = Secret = 31B8A4962191C1D92B7385A1E1EE4D258422692F0ED3BEFC4938D07ACAC2182E3C20A14AF7DEE0F37B0A1CE515DD03BF989FDC0BFF6DDD3F7C4F13E8DCBB2AFC97E6E028A47245C816D3160529D857B671A3D4D8E3F4D0D5211D15F4B48EFD7F58D37483C8A85AC64C7CCFC1D4D3984F5BF17DF391FA83BA454EAC6278365C90D888A7E6C461FA936017D165CBDC216A08B4C58D23489F73D5CBCED06D372C23 Label = CBBB5401C2BAC52B590383CDB97DA2DF35504C83F6A58C7153567528200A2C4B Output = 991A3638509F6EC6D2408227916C448C803870CCDD Salt = Secret = E1BC374ED79B110FD320732CB8F4C8964DDCE70E5439DAF16580481B17CA39ABB4CAAF6928C02343DEA672F9F01D30F25D03DCC86D993FD5722AAFFE315D5361BAEE048AFAD606CA83942E6C8C9232BBC7F4FDA6AEB7ECBD41E785266C13C1C6926F37DE720F690556470C784995962B15C97181660B4407F91B6145F898161CC90125FA1B6A430F2EA1646F13C02BD234C587C3449A6D09E40A764D33FB870BE9CE9D657C42E77C Label = 34A0B46537817D1C53A9824A8ED4B7B9CD731630A6168FCC73D732C59501EA70 Output = AB944F298B06E935E95AB4148F118AC1A7C6E76BEED4 Salt = Secret = DFDD03BA5257D9CC662D4A42A837DF5F3B0B493BF4FCB63366D1EA33D56FE77FA0FCF16658720A79FF2E0901A9173705FF657B87511586B27C040FB917B1DFF0F5688EB268AC8A714CF2B30FE93B7873AD92B8049C99D12DDD5FB7DAC79DFF52480E7CE1ABE2DF675A23563900E50671197A0B3A93588917BDCF4219BAEE2DBEC1210AC8582E49B6770E4BF900E99DC32000E3936ED3FF5CD60353C7224F02CF66282C934EA9DB0148C118D8E4744CDC Label = C24AA0D37B0BEE05597521F7DA24766A39EC6EF30D0A5A0A5D19552FD8D5980F Output = 5680924772B0ECB18CF1DE1128ED764437FD9582E4064B Salt = Secret = A4253CF7EA1AB5BE0EF9ECBC21048F1B28F7C35B9C1C02F2EBF14B0B54B0BE9E1BF9C4BB2F5D5788B36692C6141723521A4C69D3892D79FCF76FBC0C9C3415BED3A6425E83A091257A4E6DFD3F96EE3B3264E22BB8341617B50A5EBE6451C6AF475B17B659AD44917C161196D8DA9025083F39883DA4FAC555B75C1F94AEC913B40177CF28B620EC323BFA00747737A5F6C968CD2BE526E1BB661B0D51FAED757F10B42468D1EBF84EEC1DF08A9FE237F71DE74231054B7C Label = C4D2C9B39DF024D89B8D1BA54360D33ED388FC71E2B9DB555F33CC641E67F23D Output = CD22E71044C486F3257D22294FF2FA40C52A3F45DD30EC33 Salt = Secret = 996844A82BA03706F454282102F6CDB4BCF673789058ADC69D81AF6DC03FD50A13DA7091E8A86D99C4EC67A3F5180533F594B67C14E9FE659143BF792D74DF2CEEB1E6D77DED4590D2EBB8FC09094924BEEF654711E522288D418A3148A8CF8B8DCC8D4FF4EC6124B1FB3FD52907EDE2CA94D1FA7F42B9703F04BAC5666C8A03B2FBE417FC6DD6CEB69915C4AE2744F8F8852AA59730DC559D70559331B4C7D13D81A27964811427770B5D47930C25ABA7950506D84C03A1F571E3D2359426DC Label = 4CC17E67509F94FD13498C91E0B36E69343D3EF9CD322B1AB2204A215BC800C4 Output = F073DADB25AD8D9AA831DB4941B62010152E82102E004B9F79 Salt = Secret = 8A9EA2A98EA50284EB71A3D9C55174FA4BC6C46F435F73D4329297CE81FB91FF49845B0F19EF780A36E14BE3EB0BE373147DF7CE81D788E83520AFF374885F24D1054060CAEFEE248E1C86630A267F38911C64D8718D9FAD423D818445ABCB9DA3A7A11E1D7DA72597045CCFAD0BF4C36B91F959A55BB356AA1CC1CB7CE3EE6615DFB2E596BB450C0E742001A567DB527C88D948F9A211B2CC503FF75972552591FE13482572A0D2AE62849EFAA311B9D29DA5D1B3F7C938B508A89D9690684E270FF0DF6854BD4F Label = 0BC2ACD8C64537C4CC9D5B1E94361DEBA083E076E109EC5DE0C551E3AB2B19E3 Output = B02D770F5F668D435B78F78410DB5A9019CD0621C53A9430959A Salt = Secret = 97660D4C91FA7E87ED5AFB28A08FC3A6E241E692EBB735B36B01E16C8D9C4D696199BF92151C279FF6224889F35C5CABB8E60056218259384BC363BED96B183A9E4BC62DB2925F0D624E616A79459073DA64B637E641E86DB278FF6C538808368D1DEBCA9D13D36F5598385E8C2EFE6DD5C96237F52053E10890FA9E1452ACFD0A2F640B87F21862306C0C0E95A4E54F90A94E907CB4D95412FED0616643FB9ECCECB8398D73595913F0AC6C10FB70A803268EB7E1FE6DA25A55E23AB95F113CC16BAFE0711E4B3C6B9DB314898D478A Label = BB4C0CA1173E06D6392340C2C22CD023C903990B51E895F5F64A5AE08317C673 Output = 0A5FDFCC3788797BD95D593B92164F41DEA3F17C0C0CBF91DBC1BE Salt = Secret = 1880514D1778BF65ABF11D5DB4FF0A8BDB601C3E8AC7971291E9ACC0EC843267A6ABE7FC69AF879E664D034187F040F0FB099ADAE388560E882F35A4FAEF4049654227F9B39D536BB7746FEA4BF464364373A17DC727CB96EB93F91B552B33BD27F4CB6CACF12210D1C5697F9BC870AD56984CA2A98C84A7537914DE1C08DE873B57CD874F50E1FDB9B8FFEB1A4260A27E6E1F72632974F59390C27715F87A2E3EC7643868370706EEF2CAAA4D00118441552C2369783ECEF3B532E14EFA86B608640AEDD2FB128D5BE34647F0FFF12B79DA47557602A7B4 Label = 2D451E8719FE802E70EF148A0CE9CA39C23AB158F740D046A0AD5131FB81FE7E Output = B419D3AA1956D407AF25C6EF8BD98EAC68925C8646A7206EDE5B9C32 Salt = Secret = 4AFC47B5F5581286BA77A2D5902B5BF24E4E4EA808E5E0B276EE679E2A18962230438A99A7E85B0B5C3D6DF9F7FE91DD710E49DC121A3F9FA7062E6D58634D963661198F26D69E59FB0B660E5AA614E10ACBC57E97D8C0F5F86E9E578477B54463CC0EAA29FFD1BEE59266A477AACE1FAB65F9C35D2CB889B695ABAC9D83110AF2732F2789DDDB70BBCF20F20C8CEEBF0B4CBF81EC5AA9E72142FDBDA20FEAC784D18D4EFB8AB98BE5A1397579FFE78848324EC6E0B46EEA4A448BA9AA9D7949E4B59D00BC2F04FB039398B2D3C4DC9353C2DD6DE556CC695FAD75ADB7B71CDB Label = 1D34412DBD37CA197318AB472A863558934146E2E9C76FB54602574032C2EFFD Output = 643BAD49734B5BDB179EDAC6D742480A658CD0C26389AEA74EAD288166 Salt = Secret = DA22DFC49B143BAF8F2078EFCD33CEBE4024F1C5E33291BBE20B58EDD13B9FAA779A3528B4AB5A81A190512982A3CB28BD5EA9343FB87093D7711624B50B7CDA9B928775DC5E1DA8E1104D4CFADB25703E898C05B198E8ACDD807A748C81457957BA0856D0B884783B93D7385931D548393E1C59F31F9057A518A6BDEC48AC662FB20DC1E9C040250F7B8C49DC68935CA5C6A3262C902213533DEF3FD5E4EFD6EF0C99BD376CC6E63800BB6B921B055DB2C42C0CA8B1B55F8AF93A762062DAF29541671875D7D164E8BAEA52D7292640370F042215CD484B3124C8B196EFCCEBE52348710476F23B Label = 3448E5AEBB152CB076207309114DDF8A003692108850F1159BE09BECFED3730C Output = 822651368C7B2BD6BF289E305C54F035BBA7674F2C37D5F5F0B166D26C21 Salt = Secret = 48A6118BCA849ECFF3D0F1BF7539E42EA7E67324F16EA72F4F4215E5B69C5B0CDCD406454298FD17F633EB97B8934A2E1A18BB77EF952574907AFBFCDCABD44605D7ADC1522AA84F6643CABD220ADFC8690414949F34DDA8B5DD07295D2931F90627838476599F35D93B487511B1E87A5B0E11ED186847397CD836CCDDF78E4C12A83062AC3C89FEE1535A46101F0BFADE483CD58452F65D711BE320B194B370ECCC92CEB355999406817F7B8D7E6DC596CA7B2685364B271137551F811E4884C4AAAC08071718C0266DAC17EC29F35B24FD5767750A44DFE39AA489E8FEF63447B16336C4CDAE61236B0B25015EA368 Label = D684668CC073238CCC713721342AF77D90D769CD657C70A9BAEEDD3F91BC9820 Output = D1170B301E3ED48F32983BDB2163D6C8302BB2CC77CD834B67F1084D889799 Salt = Secret = 5E81067071EF8FCC2C58D244EE8D674E056E325EF31E62EE291563BCA1921C50FA6203C3E7E4A13220A9D3AA0EEB5ADDD857FC270DD502C2FA8411F9E9992BDB953FE10CA09EE6BC88A9BEC38A325D272704E3509DD6B92365DBB7929E4D2E6EE96228686EB858AF1AD32ADF0C70288E87FCC0AC0A96341B5BDE3063AF2D5E39C84292A5E83F11B6D01223EA8F3B4ECD5EF73CD7C5AD34206AAA68B7D4DA3CB76907A9D3262CE5AF15ACB484D8E85C35D5EADAA1551EEFA11BD389DB5E22185E465A12059CA329001F9880A61E60F7A7A5F1F2CF373F244667C9B59EFBDE4D568B55492FC58B4FA4A1884EACFBD4931C0BB3684B20E87E20 Label = 78F258A38556FB7DBB4592542B8839805B59C2A4A8CD33D3DAD22348E25BC0B6 Output = FA47888ED9268A6784273167F7A2BDEF7E8A1DB9E8258B45E37025FC0A7D9D23 Salt = Secret = 7CE80E8B0480CDE01FEC587FE7045A8E Label = EA0E5D80A76BB5063148CC997B76DA2D895BC3E4DFF37C48579CC4E580F1FDA3 Output = 176E355AAA4A2209A7CAD190D2C76B78B12CDF83ADD1387709C30750110E573021 Salt = Secret = 31959754B0F25A059CB5DC822BF2C50D4EA35A6A2C6B5195 Label = 5CF8056657ACA01CCCBEA17896F29AD012C80AE667566F3CF45553087F36C3C0 Output = 286D54775485CD052F2B5C0275EFB130E302BA19FD9D112C571725CF669702DFC179 Salt = Secret = 66529B931640F301531F4FA68EE95A97BA4DE7673C08429A7F724CADBE8727B0 Label = 9C0F11D1AB916378EBEBF5D549A7FA80874C70E9A4B2FAE3B0DFD9A714167A4E Output = B60DBB6347265B771AB2F5D75D4AA8F8E132CF718C60EB0ACE43EC6A85C2D94E3D3459 Salt = Secret = 649390CF25B068F70F99651B04D0563A53DFCD8531FCD9C377A7D8E19E4E80DE61CE24D3F522EA88 Label = 94CC79364C09E9040B015EEF409F2D436DC687CA5AE4F985B52E76B58521E665 Output = 0D69DE49B7A32D4EE0409843A0F693DEDF86B1E5D0BC884398FDF49A5E698B5ED900DE08 Salt = Secret = C336F2BB7B74101DAB3B83584E83776B23B1EF261037B6570C5923DDE4EE96FE9FE3B650AFB6BF605371246C7089955B Label = E0625FCF16F8EBA2D7CEB98EDBC2316091C081FCFBF4CC5A1B73B1F00A94E06A Output = 00AC649733F0536C04BC91FD2798152ECC33DD3BB78F35E6F2B51A807FACFAD5541B98C151 Salt = Secret = 7947FE718563A28C3C5C0E24A81260AC4480FCAC25DED2F79B00F2CD94F7E682901E1109A25BB6D7FFB0DBFF0BD7591FE4643684015CAFD1 Label = D9C2A33593A0276FBDE7CD51E60C6EB3CDD455BA66BE8AC5272CF2569116C7AE Output = 2A3903069247FA781ED914171B6BA196B32FBB3D0CD8002212320368BB8364A2C4A5B1BE57D2 Salt = Secret = 40684285757E045319218F193FA880407F60F023E53BE2EA6722EB1109BCC28B3ABF8B06AB55651AD9D1C7E126E885DA0A1A96DBF04FA23B2D0EF0EB3EB77122 Label = D43A4E808536F27DBA7D0876C2EAFC9164DC6A85DCED61053B6B1490D03E07C1 Output = 0FDB4D8325326765404376887059F6B7AF3A6549DA1F763D4BA4A265AD9FFE9BB0B935DA735919 Salt = Secret = 1A7AFCA7593480A14A1916CEF3BD9B3215CBC6617FB221742FF8F566838D2603A727CD7D60D08C1DBCC7A52D273409A8FE0DB16702AEB1A51C85EF8F976A43DE3888F77E68C7E532 Label = F58BEB3E3FD67949C4178254733C1304653D48B58AAF9BEC71349F1E51F097B0 Output = 8A75393D2DD6D9B28E8D498FB9B8148B5F2AFF5C31DCE611FFBDAEC87FE2A083407C76AF682E30CB Salt = Secret = 746BF4F07582D1341BBE28BA882006C688419EA4C342D0807FA04E8C6CE79CDED9F974AEB6E94654B0671DFEFC07AA9B56437A07AB2E3E60B5A2509CC2E7DBE49D1B17D43BCF775BD5F5F34CA39AE09B Label = 5B21076FA10C4647568D160A88558F9216CF50C7AF199D40E79AFE2A2EE22911 Output = 1FACD1AAE6FD0DB8D81749F7A00C9A63AFB4747CDA2D2253B6200174A6A29663251E516CD956FAAF0D Salt = Secret = F8DC1B361A0B38EDF32D736C2FAE67E87CFCF60C928FD01A9863960844FCA106B80072383E4BCD0902A895527660FD54FAF071B49024D34D082B08723221EB61EB129FE8F30B5BB40D7398781471D485E54C8551A550216A Label = FF62638830DA30F5DA55BD14E229315CFEDDC58A8FDBAD3650104FC549B65D40 Output = BB7B8F7F682673DB205D9C58262C05E7BC26D42F316A96C1E556D994590A9846FFB1ED02FE83B56BA0F5 Salt = Secret = B5F4D4C0797A91BF25661C4BCA4FE8615D292C474EE04F08191EEE96541291722B0483AB7078DE2391AC911DEBE44A985765B3129BEC119CFCA3CD1378B68249B034B942FF3880C6080CA059356C03BB8C75C6CF7A92D1E611AA27CA0ACF70D6 Label = B5B4B3B84ACB6A8F5737F3B046B65995CDF80CB8E8E9FCDECF6ED1B05B0C9B24 Output = 08523558421723471B99644A07BE79BF35074521BAD4FCB2B67B50F06FC9BBD2D5E016108D39800C12528A Salt = Secret = B4D4DCD2A3D87D3A7492E34B71D2AFF108BFA7EA41F3456F3DC74CB711678E8FCED58206CB0FE4B0ACBAA77D3AD94FFE757CDCF42BF45FEE96646ACE0067628E0CA86EEB2B1242FDA43F4E2CC550ACF18F34C0BEB35DDC2EBBDE8406CD5E29B1FFA60F08159C5409 Label = 1B4A3D2F70BA9183F106C6CFC9B8BE1B229301E680E4C6F8FC2293CD850B8BDE Output = 666D964F2D3B0CA0F2387DAF5F47EB1BF616F96BFF138F55D88CDE8214F6809EF5C6993C5E90C9220DE7013F Salt = Secret = FF007BC35845D9540D986613DD4B2212E6F8A058AAC3DF921ED7F0786D2D73335CB9830D9003EBB858AEB039824E26C2B6D6BAD2EDE3CFA5FCAA9AD11718D26C89FFE8CC655CC544C9675C12C00419CD673AF59AAF8B0DE7F4F556EFCF610A855FB436A1F6CD695CE037D3E8A360C962 Label = 77C13199487E0EAB5C0B3816EE1AFA35AB3C1F7C76B1CCE6E7DD74C626ABD6F7 Output = B0B4BA050D9FE9162D178BA4ABFB75956ADC87E53DEF297A4715AF688FB0B02FBBE0843344B635F127525FD1C1 Salt = Secret = 8FB75E8C14142904032B864D576EBE05A46B4B09C3140FFEF7838EC1A84FF56A81C5D21A51F6E1D7BE1F7EE91529C76AFBD57DB5D2A3B3B95865D89906EA454BB06B57DF291C168D22B863C7C434B2F3338FD8212C83F884158815C851C5E58A1FBBBBFBB8A1356F87914D9438C71D7F999D5BFEA55F843A Label = A1C0BAF846BB9594FD6127393674DC45D5FBDDC9F01F3CC60B8685EFB10AA8CD Output = 3D1CBCB29D7B4DB0BD60187078B4DF9160A2FEAE77A7674A882854068D6EAC53F2941BAB97890CBC212A75407969 Salt = Secret = DFC5B005B925033A8BA08208CF03EA957426314CEFEF07582FA75F082064DABF182229A6BC50DD985E41583C93B98335B7F9C3B2D6E41D3821480354539FFB7A47264DECECEFB154039B675BA6A883B09E791F401246A1F728D046979567763D5552D78BCF69206386C5ED548C4FA181B012194D8E6E1AA7754306B05D93ABBB Label = 6A15930A9A4DE23FDAD9648DF5A87DE81BF3149DBC2A4DCBFE6CD4030447619C Output = BABCFF2D8770E61796DCE156EFA74CE43E4869EA7FB538E07681100FD2E82DAAE15D88BF20ED3E1224F89C7DF7EBC2 Salt = Secret = 8D1C9B4D7CC7F6122CB68E43B146BD32DE9F5E09143118B29DB51705F25D6C81890132F81DF3DC53A7950D0803107306289FA88E907C2E53EC13ECA20F972B38B84C5C1847F0BCB2EE4A9B64EB48348B73256E61CE2A2CFCDB71F7DB70BFFCC101F8A7F1FEE5F9D377E81FF9EC79B7FB25C849D7B9DD125107717EC8FD93105762B1AC629FF6DF99 Label = 2D14C1C1989469A6676196410B62AF1A98D05DE226B22213FA731A814ADE2F5C Output = 7DF972FFA24EC77F4CFFBB2C7F7344E188114339821FE3B6DD99FCA7D03F3BC09EE445C775C80073D55F72BE69C5347F Salt = Secret = 3D80868D09B92E3360A74365D1661758D8136CCB75313D55A253EE253061FA13ED43C7FE288848D9CAE40E5ABAE3290EAD665B97B0F58F115D3F9017DF71BCF872F39ECD1617291520F16D4995B1E711E1D0DC5EF61F6C48F6AF9BD94DBBAF5146E05809A239385C36001CF5C59E862D9A15C1DF20324095090657C9F168DB1CF79C7BD88C055377ECDD846A79C43E94 Label = 260F626FA017BFDA963DE8CF3883C7D77745509E69833116F1385BED6D80548B Output = 700AFD6578D57D6BC9F90B1823AB2708DD924A9DBCD2C6042454FFEB9239DBDB00AB2EFF183AA71548F91CA442F1EF25DA Salt = Secret = 312680EE9282726A16DF2A488B34AF9C277F7335A06ED3AEB8CAF7EB25D5D6DA038AC6B13B58E445B839838C4A526CA97D53699B8A73B54FBEBD34671F1E327F7FADAD6D00B6CA202EE06D0452E0CC8A514E9BF9655E299D9699493539D1F823F4C1D46A96F4AB0F55F475BA9191642711E576DFBBAA79F8446E8988DE8B9EEA300955DAF905FC57ADEEB45FB916EA2C7D44131556FA2001 Label = 065B341489EB84C9E249FB882713B15FB7B9E1B41A3E66B14AAC34DBD3733610 Output = B4FFAB43D40FFC38FA7D62590A7E199256F5699ECE1CFC9C5B28387F36C969C31F697BF957DCA665D8181441351A7FF2136F [SP800-56A(SHA-224)] Salt = Secret = 51373E8B6FDEC284DB569204CA13D2CAA23BD1D85DCAB02A Label = 6C5544797A91115DC3330EBD003851D239A706FF2AA2AB70039C5510DDF06420 Output = E14BA657 Salt = Secret = B2F3A2D4FBB002D9F0B51258AF43E98A5423FB145257AE460342361C2199D380 Label = F9C06213585289654996F0C40467B9A69480AB8D5B16A08C7A0C5F1570F966EF Output = 2C92BD1085 Salt = Secret = BA68A99D6EB2AFFD8BD039AB13C3A3AA9F02C6C11FDE8570429D2FCE61D97D81C51CDBB8FF143D04 Label = 9D4169CC1427F2A407191B84AB7ABAACE66A95CA26AB0915803106315080F331 Output = 275C1479FACB Salt = Secret = DC5E08ED643FC5ACA38CDF756CA0D7D678F3B241FA61976EEB16A904FC83E0326E1CBD639A9591899ADF8DE1FC1B1B5D Label = 430312B971580AC2ABBE70998F136D3CACE833E0B165B74C351AFE5FA20D1EB7 Output = C7BC023EF4CA3E Salt = Secret = 2897B5B2F94BE3550BAC75877817A0F47836A57A5FF777345DAA6E5F0599D4AB8D4C59C62067AEDF00C02DDA77E4AF871CDA63FBDE164EDC Label = EDEFB6C58327538F3B4F7E4B9AF30C7025122DE56B7E682E56D7EFE433C2CA85 Output = 467F0E255D21744D Salt = Secret = 7566E8A2FC90BB54E366378A1D360CC0FECC1557910971848C66D1287D147B618F096A9B469B31D7FBCA3FECD0720EB89C3B46299034749EA787DB044AB7997A Label = 7664B2D719770E089BA50304245B45BF330AC0D241BAC76D55F330B3981CEAFA Output = BB7CA07E752C0C3E85 Salt = Secret = 969040DA2CAA520EB50A19CC38FB5F0CA9706B51C08329844C7D3215037DB3C77DA4D6D8761347F4C3FA96ED2D3D99EFDCFB89718654062C2A7DD0D5DA417E37D66DD543A53E6484 Label = D8FD0095FE329F956FFBE411F5BBC5661809BD60DCE865EEC08DF81BE59C5AA6 Output = 7AFE77544A17641AE823 Salt = Secret = 12DA37D3C6B51CD79EB5EFD1DBF75F457B1424E681C5D3CD85EE3C1BCC2D32F30AE19BF86D17FE382631E501A8E7D0DD9074934A0F2CEB98CC8613971E80056F73F6C25DD99BC52190799F23706F6F27 Label = DCB12731AD8BC0308EA4BD63F4924AF269936DD126D4ABA28C8C4C6EE489D10A Output = 577ABBC918C26D6E8391E2 Salt = Secret = 6B9C5E760EAC93BC00542482AD998EF0DA4C49532AC2B64B398A63EB8B57B73C1E9916288968DADC3DB80AFF7DEEF139A45519833FA889B5422646CD102F1FA82BF9F0018A32EADBCCEB835E9B4CAD51FE411D977844449A Label = E8FB3E3052796E282980864686C382CA9DFCE33C92429B0DA13547FBB6911E90 Output = 2709A18D3A8275C6791688DF Salt = Secret = C65E98F36147239627FDFBEF1AB4A5F73AA3D5F91D68D81864788FBD6BA65C8AE4EF8C941FDF6D73DEB8990D45630B16E1A0AE0CA0F970BF08EBB7D7D84C612BFE5C0AA5AB3F53372DA692AED23DF90B1B08F32B000C898BEB71BCE743517B04 Label = FAAC974B1E71D0CC25C4C015D84BA72FCDD9C0D9679A48EDED50F5BAF3DB9510 Output = 3B6AD981CE917B0DBDD1B53C0A Salt = Secret = 817F4A10573ADB4CD667DBC48B2EC6C23450CA72CF1E0072D0450D370BBB9EB3DA2CEB9D2FE94F36D8B5B3831E02A5624F65FFB437CEF2075EFB747513CB0EB58F42DAF7C2E6930113B404CDC0D3C4AEB3A3ABF70DFCE220CB71D53CE156E645FC92686E3D907DDD Label = 6E243942AF420F4E78A3B4FFD6BB1FADF401A2C2D0B28293E5990D0929CB5CE3 Output = 2FD308FAF91F3B86FD0CEA1E099E Salt = Secret = F80D6C1C42D402E6E4D18C44D45A0C78A674936EDE4B4FC14C6F4D47C378DBD6B67860819F37AA5A553D36E9F34BACA2596107F475BDB891F9FB9B4101BBE55DC5CEBC789E58FFD74B480ED33EE2124667A5CF7E724F4BF231FD96A3536484C65839A3A443E9D359128D29A5300BDC00 Label = 446CC99F84CBAD1D0951AD04251DE3CCED5305097DFC84BCCC94E51C2E39D571 Output = 87AC2338D54BC461933C409E06FD72 Salt = Secret = 6D4106211D95D9F76AA02979EDD8C388E1365CC8CF91455DE0CB7BB1EA541B1ED1A652B6730CA90E379596ADFB99C4C34185B28266FA499FFF876FF52773C57D6C6733CFAC07D9750015263B818C0A9E0E85A47B6CDFFBDAC8D12CD2269AFD0B11C9E6DECFCB7567E6CF8ED1A850DBADCAF7F2CECF850E88 Label = A6139DC9D3C54D939CB728396E78ECC6136A5567C4D52EC06647E3218BFF252B Output = 0379219C12AF387682ABAF139EB14FFC Salt = Secret = 3CE74D3EF4943100A0EACD79F28C764977D05CCADABADE99A09F2F3E7ECCF1A0562F3D1D9BCC18E8B1C3ADA80CABED3A707FD4298FD1F708120739A9C43C4A55AC422E060506EBC519BFCBCE8B5A7641D1F32100551E93BAC2DD07CF93B67654411EFE2EF24017D556401A86AA3F2A196F4D92EF60FC1DA11D98ABF14FEC676B Label = E8B4DE11E3BECCE934705789CD2F21463F50988748D6D027002EC8E1BEBC2786 Output = AAE648045477576DB9227EECD143B7103D Salt = Secret = 495C82408DFAB85487983026DBE15FF09CE7FA77C6C0CAA08DA2C91047E12EEBA9617FBC8891961BE82C8DC8E79888965C74DEAF43CFAEDF3B6B18308685EEFC750CE60BE6D9BDFDA9145F4EB5BFED49D6C2AD27C6A736529E043F808A7A4119CB936B50D02D85A2D4459AE0F3DEFAC2049134BF0E945537695A74B2FF7A9C9DF4DC68BC2201280B Label = 335DF88135E195878644EF8CC50591E080A3DCA55F48DA8550C717AF07E42D32 Output = 53EFF528649C283051ED2A5CB2CF66D3690F Salt = Secret = 71A4599C21E079932DD6493450BDD23034633103C26BFA775AF44BE897AE638E8190DC39A8F3D84C56592F85EE57C2500725BACF3EEB5DE3CAFEDB0070FA1B36CD97D29C5740F90D1B4631FA90E9BD6AD005BB0A2D6DCB8A47751BB84016BE6F64DB7EF4110E2A896B5C225A6586EECBC86C219AEE17C0CF88AA616D81EE7ACDFC03753A5B7B121F4A401DA213D46673 Label = 665186E586A5620E1547E6C8E08D90EFCE62B5A206334169B1549F5895D9E9ED Output = 956F4FA643691B5B59B71965A018CCE9390C1C Salt = Secret = D8281359E194EE68386AFB06AEF687D7C342A270F8548B2FE2A0F9F650A997D6A4F8C9711FD28E38B9750AB33E26AB92199BD6E8BC6B0B2F0073D5C035667D9393AFB68C5580926C35FA351C2F2766B95EFEAE4FF30CBCF0F2BC0A2D279A6631FD8FF6F7C67A6E91302C19C6FCEC37AFB48A318F3C580A025299C66F38975E59A88D55DE1BFF567C370A9B16314777CB4364C4CF289D6B75 Label = 935B371FE9B959B07DA408F97387C05F72D426CEFFCE3D986722BDCEA64C334A Output = B41611D065263F1C9FE05D6958F30534E2839B1C Salt = Secret = 31B8A4962191C1D92B7385A1E1EE4D258422692F0ED3BEFC4938D07ACAC2182E3C20A14AF7DEE0F37B0A1CE515DD03BF989FDC0BFF6DDD3F7C4F13E8DCBB2AFC97E6E028A47245C816D3160529D857B671A3D4D8E3F4D0D5211D15F4B48EFD7F58D37483C8A85AC64C7CCFC1D4D3984F5BF17DF391FA83BA454EAC6278365C90D888A7E6C461FA936017D165CBDC216A08B4C58D23489F73D5CBCED06D372C23 Label = CBBB5401C2BAC52B590383CDB97DA2DF35504C83F6A58C7153567528200A2C4B Output = 7EBFE903638BAE49C2C02D83D5784A0D03E6514B22 Salt = Secret = E1BC374ED79B110FD320732CB8F4C8964DDCE70E5439DAF16580481B17CA39ABB4CAAF6928C02343DEA672F9F01D30F25D03DCC86D993FD5722AAFFE315D5361BAEE048AFAD606CA83942E6C8C9232BBC7F4FDA6AEB7ECBD41E785266C13C1C6926F37DE720F690556470C784995962B15C97181660B4407F91B6145F898161CC90125FA1B6A430F2EA1646F13C02BD234C587C3449A6D09E40A764D33FB870BE9CE9D657C42E77C Label = 34A0B46537817D1C53A9824A8ED4B7B9CD731630A6168FCC73D732C59501EA70 Output = F21CF4ED72B819E3FDC00A721AA44BC3FD6CC1533B89 Salt = Secret = DFDD03BA5257D9CC662D4A42A837DF5F3B0B493BF4FCB63366D1EA33D56FE77FA0FCF16658720A79FF2E0901A9173705FF657B87511586B27C040FB917B1DFF0F5688EB268AC8A714CF2B30FE93B7873AD92B8049C99D12DDD5FB7DAC79DFF52480E7CE1ABE2DF675A23563900E50671197A0B3A93588917BDCF4219BAEE2DBEC1210AC8582E49B6770E4BF900E99DC32000E3936ED3FF5CD60353C7224F02CF66282C934EA9DB0148C118D8E4744CDC Label = C24AA0D37B0BEE05597521F7DA24766A39EC6EF30D0A5A0A5D19552FD8D5980F Output = CD1E012F4D84B645962F53F86962BAD58F306DCEEDDEBA Salt = Secret = A4253CF7EA1AB5BE0EF9ECBC21048F1B28F7C35B9C1C02F2EBF14B0B54B0BE9E1BF9C4BB2F5D5788B36692C6141723521A4C69D3892D79FCF76FBC0C9C3415BED3A6425E83A091257A4E6DFD3F96EE3B3264E22BB8341617B50A5EBE6451C6AF475B17B659AD44917C161196D8DA9025083F39883DA4FAC555B75C1F94AEC913B40177CF28B620EC323BFA00747737A5F6C968CD2BE526E1BB661B0D51FAED757F10B42468D1EBF84EEC1DF08A9FE237F71DE74231054B7C Label = C4D2C9B39DF024D89B8D1BA54360D33ED388FC71E2B9DB555F33CC641E67F23D Output = 15FDE7969EC83F089421F57E384220079BB9E5923C9125E3 Salt = Secret = 996844A82BA03706F454282102F6CDB4BCF673789058ADC69D81AF6DC03FD50A13DA7091E8A86D99C4EC67A3F5180533F594B67C14E9FE659143BF792D74DF2CEEB1E6D77DED4590D2EBB8FC09094924BEEF654711E522288D418A3148A8CF8B8DCC8D4FF4EC6124B1FB3FD52907EDE2CA94D1FA7F42B9703F04BAC5666C8A03B2FBE417FC6DD6CEB69915C4AE2744F8F8852AA59730DC559D70559331B4C7D13D81A27964811427770B5D47930C25ABA7950506D84C03A1F571E3D2359426DC Label = 4CC17E67509F94FD13498C91E0B36E69343D3EF9CD322B1AB2204A215BC800C4 Output = 3D57DCFDDE391C25857055FB32CCC91C334A5DC15F8BB68C56 Salt = Secret = 8A9EA2A98EA50284EB71A3D9C55174FA4BC6C46F435F73D4329297CE81FB91FF49845B0F19EF780A36E14BE3EB0BE373147DF7CE81D788E83520AFF374885F24D1054060CAEFEE248E1C86630A267F38911C64D8718D9FAD423D818445ABCB9DA3A7A11E1D7DA72597045CCFAD0BF4C36B91F959A55BB356AA1CC1CB7CE3EE6615DFB2E596BB450C0E742001A567DB527C88D948F9A211B2CC503FF75972552591FE13482572A0D2AE62849EFAA311B9D29DA5D1B3F7C938B508A89D9690684E270FF0DF6854BD4F Label = 0BC2ACD8C64537C4CC9D5B1E94361DEBA083E076E109EC5DE0C551E3AB2B19E3 Output = BD150A899070DF4987A59759B11EFFE7BD5B66A496656E703594 Salt = Secret = 97660D4C91FA7E87ED5AFB28A08FC3A6E241E692EBB735B36B01E16C8D9C4D696199BF92151C279FF6224889F35C5CABB8E60056218259384BC363BED96B183A9E4BC62DB2925F0D624E616A79459073DA64B637E641E86DB278FF6C538808368D1DEBCA9D13D36F5598385E8C2EFE6DD5C96237F52053E10890FA9E1452ACFD0A2F640B87F21862306C0C0E95A4E54F90A94E907CB4D95412FED0616643FB9ECCECB8398D73595913F0AC6C10FB70A803268EB7E1FE6DA25A55E23AB95F113CC16BAFE0711E4B3C6B9DB314898D478A Label = BB4C0CA1173E06D6392340C2C22CD023C903990B51E895F5F64A5AE08317C673 Output = 73947AD3217A5C7DB0D89E29FE73E49B845BDD8C9E4F12915F9F49 Salt = Secret = 1880514D1778BF65ABF11D5DB4FF0A8BDB601C3E8AC7971291E9ACC0EC843267A6ABE7FC69AF879E664D034187F040F0FB099ADAE388560E882F35A4FAEF4049654227F9B39D536BB7746FEA4BF464364373A17DC727CB96EB93F91B552B33BD27F4CB6CACF12210D1C5697F9BC870AD56984CA2A98C84A7537914DE1C08DE873B57CD874F50E1FDB9B8FFEB1A4260A27E6E1F72632974F59390C27715F87A2E3EC7643868370706EEF2CAAA4D00118441552C2369783ECEF3B532E14EFA86B608640AEDD2FB128D5BE34647F0FFF12B79DA47557602A7B4 Label = 2D451E8719FE802E70EF148A0CE9CA39C23AB158F740D046A0AD5131FB81FE7E Output = FB5BD5886B26D1AF7D8C21FDDE72C08BDEE7BF58D553C4B05AB903FD Salt = Secret = 4AFC47B5F5581286BA77A2D5902B5BF24E4E4EA808E5E0B276EE679E2A18962230438A99A7E85B0B5C3D6DF9F7FE91DD710E49DC121A3F9FA7062E6D58634D963661198F26D69E59FB0B660E5AA614E10ACBC57E97D8C0F5F86E9E578477B54463CC0EAA29FFD1BEE59266A477AACE1FAB65F9C35D2CB889B695ABAC9D83110AF2732F2789DDDB70BBCF20F20C8CEEBF0B4CBF81EC5AA9E72142FDBDA20FEAC784D18D4EFB8AB98BE5A1397579FFE78848324EC6E0B46EEA4A448BA9AA9D7949E4B59D00BC2F04FB039398B2D3C4DC9353C2DD6DE556CC695FAD75ADB7B71CDB Label = 1D34412DBD37CA197318AB472A863558934146E2E9C76FB54602574032C2EFFD Output = A24679E6548368E075777DA1D12BD14B2CA4F9914971020FE89A8745C7 Salt = Secret = DA22DFC49B143BAF8F2078EFCD33CEBE4024F1C5E33291BBE20B58EDD13B9FAA779A3528B4AB5A81A190512982A3CB28BD5EA9343FB87093D7711624B50B7CDA9B928775DC5E1DA8E1104D4CFADB25703E898C05B198E8ACDD807A748C81457957BA0856D0B884783B93D7385931D548393E1C59F31F9057A518A6BDEC48AC662FB20DC1E9C040250F7B8C49DC68935CA5C6A3262C902213533DEF3FD5E4EFD6EF0C99BD376CC6E63800BB6B921B055DB2C42C0CA8B1B55F8AF93A762062DAF29541671875D7D164E8BAEA52D7292640370F042215CD484B3124C8B196EFCCEBE52348710476F23B Label = 3448E5AEBB152CB076207309114DDF8A003692108850F1159BE09BECFED3730C Output = 6043247BDF8962D4F9936D6CDFBE9A246F0B8425785BD65FC237D1E9D6E4 Salt = Secret = 48A6118BCA849ECFF3D0F1BF7539E42EA7E67324F16EA72F4F4215E5B69C5B0CDCD406454298FD17F633EB97B8934A2E1A18BB77EF952574907AFBFCDCABD44605D7ADC1522AA84F6643CABD220ADFC8690414949F34DDA8B5DD07295D2931F90627838476599F35D93B487511B1E87A5B0E11ED186847397CD836CCDDF78E4C12A83062AC3C89FEE1535A46101F0BFADE483CD58452F65D711BE320B194B370ECCC92CEB355999406817F7B8D7E6DC596CA7B2685364B271137551F811E4884C4AAAC08071718C0266DAC17EC29F35B24FD5767750A44DFE39AA489E8FEF63447B16336C4CDAE61236B0B25015EA368 Label = D684668CC073238CCC713721342AF77D90D769CD657C70A9BAEEDD3F91BC9820 Output = C3EE06AB47C72C48CF40CD8F39C8B5F567CEF6517A3EEA56B81502E20C10B2 Salt = Secret = 5E81067071EF8FCC2C58D244EE8D674E056E325EF31E62EE291563BCA1921C50FA6203C3E7E4A13220A9D3AA0EEB5ADDD857FC270DD502C2FA8411F9E9992BDB953FE10CA09EE6BC88A9BEC38A325D272704E3509DD6B92365DBB7929E4D2E6EE96228686EB858AF1AD32ADF0C70288E87FCC0AC0A96341B5BDE3063AF2D5E39C84292A5E83F11B6D01223EA8F3B4ECD5EF73CD7C5AD34206AAA68B7D4DA3CB76907A9D3262CE5AF15ACB484D8E85C35D5EADAA1551EEFA11BD389DB5E22185E465A12059CA329001F9880A61E60F7A7A5F1F2CF373F244667C9B59EFBDE4D568B55492FC58B4FA4A1884EACFBD4931C0BB3684B20E87E20 Label = 78F258A38556FB7DBB4592542B8839805B59C2A4A8CD33D3DAD22348E25BC0B6 Output = 33E4748011E75711B0277B75E8242CE7FD86F02826672C3DD2C0F75BDEF0640B Salt = Secret = 7CE80E8B0480CDE01FEC587FE7045A8E Label = EA0E5D80A76BB5063148CC997B76DA2D895BC3E4DFF37C48579CC4E580F1FDA3 Output = 8579076E5599FCACC8FC7AFC5AC82ED72CBAE744CA0759CE3539F00B854AB7459D Salt = Secret = 31959754B0F25A059CB5DC822BF2C50D4EA35A6A2C6B5195 Label = 5CF8056657ACA01CCCBEA17896F29AD012C80AE667566F3CF45553087F36C3C0 Output = 46A872EBCE57D6AEF8BF06ED5B653CA007F8247C74A06669E5A09EB4F31031A5A6ED Salt = Secret = 66529B931640F301531F4FA68EE95A97BA4DE7673C08429A7F724CADBE8727B0 Label = 9C0F11D1AB916378EBEBF5D549A7FA80874C70E9A4B2FAE3B0DFD9A714167A4E Output = B80502DBDA61A6CC9D9D39199B209F4ADB70A7AEB65FA80821DEBD04B512E34CF494C0 Salt = Secret = 649390CF25B068F70F99651B04D0563A53DFCD8531FCD9C377A7D8E19E4E80DE61CE24D3F522EA88 Label = 94CC79364C09E9040B015EEF409F2D436DC687CA5AE4F985B52E76B58521E665 Output = 07A96C468FFCB57CC33DF2BE309E35EDDE30987C277FD36DCC5E26681192CBFC1746D006 Salt = Secret = C336F2BB7B74101DAB3B83584E83776B23B1EF261037B6570C5923DDE4EE96FE9FE3B650AFB6BF605371246C7089955B Label = E0625FCF16F8EBA2D7CEB98EDBC2316091C081FCFBF4CC5A1B73B1F00A94E06A Output = 89D9656D0F498AD792C824347AB0F204FDCABEFF6F112787D2A17DFEA2581C6989C9A27633 Salt = Secret = 7947FE718563A28C3C5C0E24A81260AC4480FCAC25DED2F79B00F2CD94F7E682901E1109A25BB6D7FFB0DBFF0BD7591FE4643684015CAFD1 Label = D9C2A33593A0276FBDE7CD51E60C6EB3CDD455BA66BE8AC5272CF2569116C7AE Output = 89A7344BCCE3BD7BB20275F3DDCF86772F500AD55FAF89F4ED0760031224995FD553B357FE38 Salt = Secret = 40684285757E045319218F193FA880407F60F023E53BE2EA6722EB1109BCC28B3ABF8B06AB55651AD9D1C7E126E885DA0A1A96DBF04FA23B2D0EF0EB3EB77122 Label = D43A4E808536F27DBA7D0876C2EAFC9164DC6A85DCED61053B6B1490D03E07C1 Output = 37D5CEB270F3A2027B7DC075A1AE513141DCB1AB60C2BB196171FD1D1741347952DD971FFD5337 Salt = Secret = 1A7AFCA7593480A14A1916CEF3BD9B3215CBC6617FB221742FF8F566838D2603A727CD7D60D08C1DBCC7A52D273409A8FE0DB16702AEB1A51C85EF8F976A43DE3888F77E68C7E532 Label = F58BEB3E3FD67949C4178254733C1304653D48B58AAF9BEC71349F1E51F097B0 Output = 474DA15899031271269B4F44E855313E47F4B6EE2FFE7AB71A6E1ECF1350BDA540D646264C226550 Salt = Secret = 746BF4F07582D1341BBE28BA882006C688419EA4C342D0807FA04E8C6CE79CDED9F974AEB6E94654B0671DFEFC07AA9B56437A07AB2E3E60B5A2509CC2E7DBE49D1B17D43BCF775BD5F5F34CA39AE09B Label = 5B21076FA10C4647568D160A88558F9216CF50C7AF199D40E79AFE2A2EE22911 Output = 1AFCD2E0CB3A4EF58DBF8CDEA261566664AA1581238B122C9BA03B11B010B8F3637724824F1119E3E4 Salt = Secret = F8DC1B361A0B38EDF32D736C2FAE67E87CFCF60C928FD01A9863960844FCA106B80072383E4BCD0902A895527660FD54FAF071B49024D34D082B08723221EB61EB129FE8F30B5BB40D7398781471D485E54C8551A550216A Label = FF62638830DA30F5DA55BD14E229315CFEDDC58A8FDBAD3650104FC549B65D40 Output = 31EF775090D2C174C3426691DF7BFB1EC11E3783DF95978949F681952E67970414C65463BCB3AEA83D53 Salt = Secret = B5F4D4C0797A91BF25661C4BCA4FE8615D292C474EE04F08191EEE96541291722B0483AB7078DE2391AC911DEBE44A985765B3129BEC119CFCA3CD1378B68249B034B942FF3880C6080CA059356C03BB8C75C6CF7A92D1E611AA27CA0ACF70D6 Label = B5B4B3B84ACB6A8F5737F3B046B65995CDF80CB8E8E9FCDECF6ED1B05B0C9B24 Output = C048AE3EB9358DBA4D0C6B79F7D978C0BA3BF1C7183694EE8BE20E5132699D35BBAE1A3B69463E1FB3334B Salt = Secret = B4D4DCD2A3D87D3A7492E34B71D2AFF108BFA7EA41F3456F3DC74CB711678E8FCED58206CB0FE4B0ACBAA77D3AD94FFE757CDCF42BF45FEE96646ACE0067628E0CA86EEB2B1242FDA43F4E2CC550ACF18F34C0BEB35DDC2EBBDE8406CD5E29B1FFA60F08159C5409 Label = 1B4A3D2F70BA9183F106C6CFC9B8BE1B229301E680E4C6F8FC2293CD850B8BDE Output = 983AF7517237E8436E57A26ABBCA06B2B0DC9E2F3AC8D7ACFEE84FFDF63B89EB85BA163A273551734242F69E Salt = Secret = FF007BC35845D9540D986613DD4B2212E6F8A058AAC3DF921ED7F0786D2D73335CB9830D9003EBB858AEB039824E26C2B6D6BAD2EDE3CFA5FCAA9AD11718D26C89FFE8CC655CC544C9675C12C00419CD673AF59AAF8B0DE7F4F556EFCF610A855FB436A1F6CD695CE037D3E8A360C962 Label = 77C13199487E0EAB5C0B3816EE1AFA35AB3C1F7C76B1CCE6E7DD74C626ABD6F7 Output = 541A19A59BAC9451EDBFB32DC91029032282C871E51E79995F8026429DCD27D89EF34CE7E6A41D03C2B4C039D8 Salt = Secret = 8FB75E8C14142904032B864D576EBE05A46B4B09C3140FFEF7838EC1A84FF56A81C5D21A51F6E1D7BE1F7EE91529C76AFBD57DB5D2A3B3B95865D89906EA454BB06B57DF291C168D22B863C7C434B2F3338FD8212C83F884158815C851C5E58A1FBBBBFBB8A1356F87914D9438C71D7F999D5BFEA55F843A Label = A1C0BAF846BB9594FD6127393674DC45D5FBDDC9F01F3CC60B8685EFB10AA8CD Output = C20F63A9151C2C9DABC9621F230AA8F2CB8138F3ED3E23D126B158BFD464090C226E7B3F870173F914EFE4BD5FE2 Salt = Secret = DFC5B005B925033A8BA08208CF03EA957426314CEFEF07582FA75F082064DABF182229A6BC50DD985E41583C93B98335B7F9C3B2D6E41D3821480354539FFB7A47264DECECEFB154039B675BA6A883B09E791F401246A1F728D046979567763D5552D78BCF69206386C5ED548C4FA181B012194D8E6E1AA7754306B05D93ABBB Label = 6A15930A9A4DE23FDAD9648DF5A87DE81BF3149DBC2A4DCBFE6CD4030447619C Output = 4C4E2C17BA679B9FB96C58D4F10790C3E11CC36267439D524C882C786060FFCF2F71F3819F4AF73D41399BAA7A256A Salt = Secret = 8D1C9B4D7CC7F6122CB68E43B146BD32DE9F5E09143118B29DB51705F25D6C81890132F81DF3DC53A7950D0803107306289FA88E907C2E53EC13ECA20F972B38B84C5C1847F0BCB2EE4A9B64EB48348B73256E61CE2A2CFCDB71F7DB70BFFCC101F8A7F1FEE5F9D377E81FF9EC79B7FB25C849D7B9DD125107717EC8FD93105762B1AC629FF6DF99 Label = 2D14C1C1989469A6676196410B62AF1A98D05DE226B22213FA731A814ADE2F5C Output = 8D8664E4200243E68277A04AC17C56E664250B93B99D7B6F890A12F860E926F02657C1431A51001B9FFCCCDD18A02134 Salt = Secret = 3D80868D09B92E3360A74365D1661758D8136CCB75313D55A253EE253061FA13ED43C7FE288848D9CAE40E5ABAE3290EAD665B97B0F58F115D3F9017DF71BCF872F39ECD1617291520F16D4995B1E711E1D0DC5EF61F6C48F6AF9BD94DBBAF5146E05809A239385C36001CF5C59E862D9A15C1DF20324095090657C9F168DB1CF79C7BD88C055377ECDD846A79C43E94 Label = 260F626FA017BFDA963DE8CF3883C7D77745509E69833116F1385BED6D80548B Output = 07115962DA9992E827D7D4220AB122B4450A1F8B6AB166A4940069C0E418906A248D74211FC927B2F0A4D68F8AD06F33FA Salt = Secret = 312680EE9282726A16DF2A488B34AF9C277F7335A06ED3AEB8CAF7EB25D5D6DA038AC6B13B58E445B839838C4A526CA97D53699B8A73B54FBEBD34671F1E327F7FADAD6D00B6CA202EE06D0452E0CC8A514E9BF9655E299D9699493539D1F823F4C1D46A96F4AB0F55F475BA9191642711E576DFBBAA79F8446E8988DE8B9EEA300955DAF905FC57ADEEB45FB916EA2C7D44131556FA2001 Label = 065B341489EB84C9E249FB882713B15FB7B9E1B41A3E66B14AAC34DBD3733610 Output = 5DAA066BEF6981C06011D1F42A888ABDB9557CC15BA289F5ECAF9418E9619E38D985ABDB310F2B57DC12F86650591FEAE873 [SP800-56A(SHA-256)] Salt = Secret = 51373E8B6FDEC284DB569204CA13D2CAA23BD1D85DCAB02A Label = 6C5544797A91115DC3330EBD003851D239A706FF2AA2AB70039C5510DDF06420 Output = F62EBAB9 Salt = Secret = B2F3A2D4FBB002D9F0B51258AF43E98A5423FB145257AE460342361C2199D380 Label = F9C06213585289654996F0C40467B9A69480AB8D5B16A08C7A0C5F1570F966EF Output = 39CB7A8753 Salt = Secret = BA68A99D6EB2AFFD8BD039AB13C3A3AA9F02C6C11FDE8570429D2FCE61D97D81C51CDBB8FF143D04 Label = 9D4169CC1427F2A407191B84AB7ABAACE66A95CA26AB0915803106315080F331 Output = F7632AE67C0B Salt = Secret = DC5E08ED643FC5ACA38CDF756CA0D7D678F3B241FA61976EEB16A904FC83E0326E1CBD639A9591899ADF8DE1FC1B1B5D Label = 430312B971580AC2ABBE70998F136D3CACE833E0B165B74C351AFE5FA20D1EB7 Output = 706F616063ADBA Salt = Secret = 2897B5B2F94BE3550BAC75877817A0F47836A57A5FF777345DAA6E5F0599D4AB8D4C59C62067AEDF00C02DDA77E4AF871CDA63FBDE164EDC Label = EDEFB6C58327538F3B4F7E4B9AF30C7025122DE56B7E682E56D7EFE433C2CA85 Output = 35F489FC6A91BE16 Salt = Secret = 7566E8A2FC90BB54E366378A1D360CC0FECC1557910971848C66D1287D147B618F096A9B469B31D7FBCA3FECD0720EB89C3B46299034749EA787DB044AB7997A Label = 7664B2D719770E089BA50304245B45BF330AC0D241BAC76D55F330B3981CEAFA Output = D9E33EA2E6A0ADA3F5 Salt = Secret = 969040DA2CAA520EB50A19CC38FB5F0CA9706B51C08329844C7D3215037DB3C77DA4D6D8761347F4C3FA96ED2D3D99EFDCFB89718654062C2A7DD0D5DA417E37D66DD543A53E6484 Label = D8FD0095FE329F956FFBE411F5BBC5661809BD60DCE865EEC08DF81BE59C5AA6 Output = 349A4A00BAD7E6C12526 Salt = Secret = 12DA37D3C6B51CD79EB5EFD1DBF75F457B1424E681C5D3CD85EE3C1BCC2D32F30AE19BF86D17FE382631E501A8E7D0DD9074934A0F2CEB98CC8613971E80056F73F6C25DD99BC52190799F23706F6F27 Label = DCB12731AD8BC0308EA4BD63F4924AF269936DD126D4ABA28C8C4C6EE489D10A Output = F0F76240629C5F6BACB0C2 Salt = Secret = 6B9C5E760EAC93BC00542482AD998EF0DA4C49532AC2B64B398A63EB8B57B73C1E9916288968DADC3DB80AFF7DEEF139A45519833FA889B5422646CD102F1FA82BF9F0018A32EADBCCEB835E9B4CAD51FE411D977844449A Label = E8FB3E3052796E282980864686C382CA9DFCE33C92429B0DA13547FBB6911E90 Output = 63F66E3BDF41A58D9828F189 Salt = Secret = C65E98F36147239627FDFBEF1AB4A5F73AA3D5F91D68D81864788FBD6BA65C8AE4EF8C941FDF6D73DEB8990D45630B16E1A0AE0CA0F970BF08EBB7D7D84C612BFE5C0AA5AB3F53372DA692AED23DF90B1B08F32B000C898BEB71BCE743517B04 Label = FAAC974B1E71D0CC25C4C015D84BA72FCDD9C0D9679A48EDED50F5BAF3DB9510 Output = 43EFAF93B6DDDD18F988419604 Salt = Secret = 817F4A10573ADB4CD667DBC48B2EC6C23450CA72CF1E0072D0450D370BBB9EB3DA2CEB9D2FE94F36D8B5B3831E02A5624F65FFB437CEF2075EFB747513CB0EB58F42DAF7C2E6930113B404CDC0D3C4AEB3A3ABF70DFCE220CB71D53CE156E645FC92686E3D907DDD Label = 6E243942AF420F4E78A3B4FFD6BB1FADF401A2C2D0B28293E5990D0929CB5CE3 Output = DC2AD02C24E40CA82AFCDD05E4E0 Salt = Secret = F80D6C1C42D402E6E4D18C44D45A0C78A674936EDE4B4FC14C6F4D47C378DBD6B67860819F37AA5A553D36E9F34BACA2596107F475BDB891F9FB9B4101BBE55DC5CEBC789E58FFD74B480ED33EE2124667A5CF7E724F4BF231FD96A3536484C65839A3A443E9D359128D29A5300BDC00 Label = 446CC99F84CBAD1D0951AD04251DE3CCED5305097DFC84BCCC94E51C2E39D571 Output = AFCC57EBA395C5FFC942AB53D47504 Salt = Secret = 6D4106211D95D9F76AA02979EDD8C388E1365CC8CF91455DE0CB7BB1EA541B1ED1A652B6730CA90E379596ADFB99C4C34185B28266FA499FFF876FF52773C57D6C6733CFAC07D9750015263B818C0A9E0E85A47B6CDFFBDAC8D12CD2269AFD0B11C9E6DECFCB7567E6CF8ED1A850DBADCAF7F2CECF850E88 Label = A6139DC9D3C54D939CB728396E78ECC6136A5567C4D52EC06647E3218BFF252B Output = F14783CEE70711496056B9189B16DB3E Salt = Secret = 3CE74D3EF4943100A0EACD79F28C764977D05CCADABADE99A09F2F3E7ECCF1A0562F3D1D9BCC18E8B1C3ADA80CABED3A707FD4298FD1F708120739A9C43C4A55AC422E060506EBC519BFCBCE8B5A7641D1F32100551E93BAC2DD07CF93B67654411EFE2EF24017D556401A86AA3F2A196F4D92EF60FC1DA11D98ABF14FEC676B Label = E8B4DE11E3BECCE934705789CD2F21463F50988748D6D027002EC8E1BEBC2786 Output = 0D9C2B249A270A691D6ABA82C51AB75B07 Salt = Secret = 495C82408DFAB85487983026DBE15FF09CE7FA77C6C0CAA08DA2C91047E12EEBA9617FBC8891961BE82C8DC8E79888965C74DEAF43CFAEDF3B6B18308685EEFC750CE60BE6D9BDFDA9145F4EB5BFED49D6C2AD27C6A736529E043F808A7A4119CB936B50D02D85A2D4459AE0F3DEFAC2049134BF0E945537695A74B2FF7A9C9DF4DC68BC2201280B Label = 335DF88135E195878644EF8CC50591E080A3DCA55F48DA8550C717AF07E42D32 Output = 4C721A5ECA93A1161ABA8F4BFA585FF5203E Salt = Secret = 71A4599C21E079932DD6493450BDD23034633103C26BFA775AF44BE897AE638E8190DC39A8F3D84C56592F85EE57C2500725BACF3EEB5DE3CAFEDB0070FA1B36CD97D29C5740F90D1B4631FA90E9BD6AD005BB0A2D6DCB8A47751BB84016BE6F64DB7EF4110E2A896B5C225A6586EECBC86C219AEE17C0CF88AA616D81EE7ACDFC03753A5B7B121F4A401DA213D46673 Label = 665186E586A5620E1547E6C8E08D90EFCE62B5A206334169B1549F5895D9E9ED Output = 42CF2162145DEC0641AFE5A7BE3EC8EEDB8347 Salt = Secret = D8281359E194EE68386AFB06AEF687D7C342A270F8548B2FE2A0F9F650A997D6A4F8C9711FD28E38B9750AB33E26AB92199BD6E8BC6B0B2F0073D5C035667D9393AFB68C5580926C35FA351C2F2766B95EFEAE4FF30CBCF0F2BC0A2D279A6631FD8FF6F7C67A6E91302C19C6FCEC37AFB48A318F3C580A025299C66F38975E59A88D55DE1BFF567C370A9B16314777CB4364C4CF289D6B75 Label = 935B371FE9B959B07DA408F97387C05F72D426CEFFCE3D986722BDCEA64C334A Output = F419B82EB4E73CD8D107AFE81BD7EEDD9B56744E Salt = Secret = 31B8A4962191C1D92B7385A1E1EE4D258422692F0ED3BEFC4938D07ACAC2182E3C20A14AF7DEE0F37B0A1CE515DD03BF989FDC0BFF6DDD3F7C4F13E8DCBB2AFC97E6E028A47245C816D3160529D857B671A3D4D8E3F4D0D5211D15F4B48EFD7F58D37483C8A85AC64C7CCFC1D4D3984F5BF17DF391FA83BA454EAC6278365C90D888A7E6C461FA936017D165CBDC216A08B4C58D23489F73D5CBCED06D372C23 Label = CBBB5401C2BAC52B590383CDB97DA2DF35504C83F6A58C7153567528200A2C4B Output = FDAB8C73886F5E156C39D1CAA6B2927369334552EA Salt = Secret = E1BC374ED79B110FD320732CB8F4C8964DDCE70E5439DAF16580481B17CA39ABB4CAAF6928C02343DEA672F9F01D30F25D03DCC86D993FD5722AAFFE315D5361BAEE048AFAD606CA83942E6C8C9232BBC7F4FDA6AEB7ECBD41E785266C13C1C6926F37DE720F690556470C784995962B15C97181660B4407F91B6145F898161CC90125FA1B6A430F2EA1646F13C02BD234C587C3449A6D09E40A764D33FB870BE9CE9D657C42E77C Label = 34A0B46537817D1C53A9824A8ED4B7B9CD731630A6168FCC73D732C59501EA70 Output = 50D6F1DDCFA2EEF2419CC17939F288BEC8F423AFE24F Salt = Secret = DFDD03BA5257D9CC662D4A42A837DF5F3B0B493BF4FCB63366D1EA33D56FE77FA0FCF16658720A79FF2E0901A9173705FF657B87511586B27C040FB917B1DFF0F5688EB268AC8A714CF2B30FE93B7873AD92B8049C99D12DDD5FB7DAC79DFF52480E7CE1ABE2DF675A23563900E50671197A0B3A93588917BDCF4219BAEE2DBEC1210AC8582E49B6770E4BF900E99DC32000E3936ED3FF5CD60353C7224F02CF66282C934EA9DB0148C118D8E4744CDC Label = C24AA0D37B0BEE05597521F7DA24766A39EC6EF30D0A5A0A5D19552FD8D5980F Output = 305F51C1B1A8C622D3ABA6D4D4B6012321EB331C9EAB69 Salt = Secret = A4253CF7EA1AB5BE0EF9ECBC21048F1B28F7C35B9C1C02F2EBF14B0B54B0BE9E1BF9C4BB2F5D5788B36692C6141723521A4C69D3892D79FCF76FBC0C9C3415BED3A6425E83A091257A4E6DFD3F96EE3B3264E22BB8341617B50A5EBE6451C6AF475B17B659AD44917C161196D8DA9025083F39883DA4FAC555B75C1F94AEC913B40177CF28B620EC323BFA00747737A5F6C968CD2BE526E1BB661B0D51FAED757F10B42468D1EBF84EEC1DF08A9FE237F71DE74231054B7C Label = C4D2C9B39DF024D89B8D1BA54360D33ED388FC71E2B9DB555F33CC641E67F23D Output = 7B510A5F7097F48CE0467388AC9B7E4DA8A5D4A36DC39C03 Salt = Secret = 996844A82BA03706F454282102F6CDB4BCF673789058ADC69D81AF6DC03FD50A13DA7091E8A86D99C4EC67A3F5180533F594B67C14E9FE659143BF792D74DF2CEEB1E6D77DED4590D2EBB8FC09094924BEEF654711E522288D418A3148A8CF8B8DCC8D4FF4EC6124B1FB3FD52907EDE2CA94D1FA7F42B9703F04BAC5666C8A03B2FBE417FC6DD6CEB69915C4AE2744F8F8852AA59730DC559D70559331B4C7D13D81A27964811427770B5D47930C25ABA7950506D84C03A1F571E3D2359426DC Label = 4CC17E67509F94FD13498C91E0B36E69343D3EF9CD322B1AB2204A215BC800C4 Output = DFB085482929D914F01ECE2563FF93E3D6B4CBA2E02BE5386F Salt = Secret = 8A9EA2A98EA50284EB71A3D9C55174FA4BC6C46F435F73D4329297CE81FB91FF49845B0F19EF780A36E14BE3EB0BE373147DF7CE81D788E83520AFF374885F24D1054060CAEFEE248E1C86630A267F38911C64D8718D9FAD423D818445ABCB9DA3A7A11E1D7DA72597045CCFAD0BF4C36B91F959A55BB356AA1CC1CB7CE3EE6615DFB2E596BB450C0E742001A567DB527C88D948F9A211B2CC503FF75972552591FE13482572A0D2AE62849EFAA311B9D29DA5D1B3F7C938B508A89D9690684E270FF0DF6854BD4F Label = 0BC2ACD8C64537C4CC9D5B1E94361DEBA083E076E109EC5DE0C551E3AB2B19E3 Output = CE91D5938CFBE6D1E4F0DB926896F3816EB7A7AA5EFEC9C9E4A0 Salt = Secret = 97660D4C91FA7E87ED5AFB28A08FC3A6E241E692EBB735B36B01E16C8D9C4D696199BF92151C279FF6224889F35C5CABB8E60056218259384BC363BED96B183A9E4BC62DB2925F0D624E616A79459073DA64B637E641E86DB278FF6C538808368D1DEBCA9D13D36F5598385E8C2EFE6DD5C96237F52053E10890FA9E1452ACFD0A2F640B87F21862306C0C0E95A4E54F90A94E907CB4D95412FED0616643FB9ECCECB8398D73595913F0AC6C10FB70A803268EB7E1FE6DA25A55E23AB95F113CC16BAFE0711E4B3C6B9DB314898D478A Label = BB4C0CA1173E06D6392340C2C22CD023C903990B51E895F5F64A5AE08317C673 Output = DC7AC3A5679A757109E0FC9BB9A23876630966B3ABDDCC11DA7F4F Salt = Secret = 1880514D1778BF65ABF11D5DB4FF0A8BDB601C3E8AC7971291E9ACC0EC843267A6ABE7FC69AF879E664D034187F040F0FB099ADAE388560E882F35A4FAEF4049654227F9B39D536BB7746FEA4BF464364373A17DC727CB96EB93F91B552B33BD27F4CB6CACF12210D1C5697F9BC870AD56984CA2A98C84A7537914DE1C08DE873B57CD874F50E1FDB9B8FFEB1A4260A27E6E1F72632974F59390C27715F87A2E3EC7643868370706EEF2CAAA4D00118441552C2369783ECEF3B532E14EFA86B608640AEDD2FB128D5BE34647F0FFF12B79DA47557602A7B4 Label = 2D451E8719FE802E70EF148A0CE9CA39C23AB158F740D046A0AD5131FB81FE7E Output = 87DF56F2FDFCAFD1A15A3B16366C8C7817D7BBB9FB349E72307151B2 Salt = Secret = 4AFC47B5F5581286BA77A2D5902B5BF24E4E4EA808E5E0B276EE679E2A18962230438A99A7E85B0B5C3D6DF9F7FE91DD710E49DC121A3F9FA7062E6D58634D963661198F26D69E59FB0B660E5AA614E10ACBC57E97D8C0F5F86E9E578477B54463CC0EAA29FFD1BEE59266A477AACE1FAB65F9C35D2CB889B695ABAC9D83110AF2732F2789DDDB70BBCF20F20C8CEEBF0B4CBF81EC5AA9E72142FDBDA20FEAC784D18D4EFB8AB98BE5A1397579FFE78848324EC6E0B46EEA4A448BA9AA9D7949E4B59D00BC2F04FB039398B2D3C4DC9353C2DD6DE556CC695FAD75ADB7B71CDB Label = 1D34412DBD37CA197318AB472A863558934146E2E9C76FB54602574032C2EFFD Output = 4F1AA1234CB3A02911F5E48A3ECD5EF10C96D4F658AF0BE6452EA73B40 Salt = Secret = DA22DFC49B143BAF8F2078EFCD33CEBE4024F1C5E33291BBE20B58EDD13B9FAA779A3528B4AB5A81A190512982A3CB28BD5EA9343FB87093D7711624B50B7CDA9B928775DC5E1DA8E1104D4CFADB25703E898C05B198E8ACDD807A748C81457957BA0856D0B884783B93D7385931D548393E1C59F31F9057A518A6BDEC48AC662FB20DC1E9C040250F7B8C49DC68935CA5C6A3262C902213533DEF3FD5E4EFD6EF0C99BD376CC6E63800BB6B921B055DB2C42C0CA8B1B55F8AF93A762062DAF29541671875D7D164E8BAEA52D7292640370F042215CD484B3124C8B196EFCCEBE52348710476F23B Label = 3448E5AEBB152CB076207309114DDF8A003692108850F1159BE09BECFED3730C Output = 8D95ECB4275CC9FA8DB09EE0E1B4A34DBA1A4496D1DEB15A900D30990891 Salt = Secret = 48A6118BCA849ECFF3D0F1BF7539E42EA7E67324F16EA72F4F4215E5B69C5B0CDCD406454298FD17F633EB97B8934A2E1A18BB77EF952574907AFBFCDCABD44605D7ADC1522AA84F6643CABD220ADFC8690414949F34DDA8B5DD07295D2931F90627838476599F35D93B487511B1E87A5B0E11ED186847397CD836CCDDF78E4C12A83062AC3C89FEE1535A46101F0BFADE483CD58452F65D711BE320B194B370ECCC92CEB355999406817F7B8D7E6DC596CA7B2685364B271137551F811E4884C4AAAC08071718C0266DAC17EC29F35B24FD5767750A44DFE39AA489E8FEF63447B16336C4CDAE61236B0B25015EA368 Label = D684668CC073238CCC713721342AF77D90D769CD657C70A9BAEEDD3F91BC9820 Output = 68350FBEA94A5A9CA560D6D6EF6187FB412964A45DC7A254F4882C312C4D3F Salt = Secret = 5E81067071EF8FCC2C58D244EE8D674E056E325EF31E62EE291563BCA1921C50FA6203C3E7E4A13220A9D3AA0EEB5ADDD857FC270DD502C2FA8411F9E9992BDB953FE10CA09EE6BC88A9BEC38A325D272704E3509DD6B92365DBB7929E4D2E6EE96228686EB858AF1AD32ADF0C70288E87FCC0AC0A96341B5BDE3063AF2D5E39C84292A5E83F11B6D01223EA8F3B4ECD5EF73CD7C5AD34206AAA68B7D4DA3CB76907A9D3262CE5AF15ACB484D8E85C35D5EADAA1551EEFA11BD389DB5E22185E465A12059CA329001F9880A61E60F7A7A5F1F2CF373F244667C9B59EFBDE4D568B55492FC58B4FA4A1884EACFBD4931C0BB3684B20E87E20 Label = 78F258A38556FB7DBB4592542B8839805B59C2A4A8CD33D3DAD22348E25BC0B6 Output = 3E84FD6D8B05D646E0E905E74AD4A4D7EB39A0A03829CD4C1BF2A26BB5DA80C4 Salt = Secret = 7CE80E8B0480CDE01FEC587FE7045A8E Label = EA0E5D80A76BB5063148CC997B76DA2D895BC3E4DFF37C48579CC4E580F1FDA3 Output = 9E04DDBA94C2C36F8E9B1B6F9B0F4D70A20CF1122DD94AB5724D192ED1939D924D Salt = Secret = 31959754B0F25A059CB5DC822BF2C50D4EA35A6A2C6B5195 Label = 5CF8056657ACA01CCCBEA17896F29AD012C80AE667566F3CF45553087F36C3C0 Output = E00F3A36A51D03436121EF6B98E2538F10FC46F8E14D0F8BBDD798AAFBC3CD72A67F Salt = Secret = 66529B931640F301531F4FA68EE95A97BA4DE7673C08429A7F724CADBE8727B0 Label = 9C0F11D1AB916378EBEBF5D549A7FA80874C70E9A4B2FAE3B0DFD9A714167A4E Output = 9D7A69D6C82364C5304A76A918E05CA8B18E7510EDA03E8ECCE6AB6E0947F4843738BE Salt = Secret = 649390CF25B068F70F99651B04D0563A53DFCD8531FCD9C377A7D8E19E4E80DE61CE24D3F522EA88 Label = 94CC79364C09E9040B015EEF409F2D436DC687CA5AE4F985B52E76B58521E665 Output = 81FFEEBC4D2D0AFD51A4B00D9686BD3CBD658473D23358249FAAB0F4D676528AC403405C Salt = Secret = C336F2BB7B74101DAB3B83584E83776B23B1EF261037B6570C5923DDE4EE96FE9FE3B650AFB6BF605371246C7089955B Label = E0625FCF16F8EBA2D7CEB98EDBC2316091C081FCFBF4CC5A1B73B1F00A94E06A Output = 67AA955D98820974FA9443E65C286D199E43998B3B0F1DD48A42CD6954AB2E3984C9E45307 Salt = Secret = 7947FE718563A28C3C5C0E24A81260AC4480FCAC25DED2F79B00F2CD94F7E682901E1109A25BB6D7FFB0DBFF0BD7591FE4643684015CAFD1 Label = D9C2A33593A0276FBDE7CD51E60C6EB3CDD455BA66BE8AC5272CF2569116C7AE Output = B498EF45410D69274110E3F57C91977FCDF501E1F12D4EE773CA6352BE81498A8D09A8F0E54B Salt = Secret = 40684285757E045319218F193FA880407F60F023E53BE2EA6722EB1109BCC28B3ABF8B06AB55651AD9D1C7E126E885DA0A1A96DBF04FA23B2D0EF0EB3EB77122 Label = D43A4E808536F27DBA7D0876C2EAFC9164DC6A85DCED61053B6B1490D03E07C1 Output = 155B12CFC67BDA6507E6176E6CB50FE2E2D94F114CE1454417D38A89ACCF89F7277996F875088D Salt = Secret = 1A7AFCA7593480A14A1916CEF3BD9B3215CBC6617FB221742FF8F566838D2603A727CD7D60D08C1DBCC7A52D273409A8FE0DB16702AEB1A51C85EF8F976A43DE3888F77E68C7E532 Label = F58BEB3E3FD67949C4178254733C1304653D48B58AAF9BEC71349F1E51F097B0 Output = C747ED81C72949319AC3A54F0450B15F63F21CD8FFEC0E7FAB1E160701E5A6F3C10EF6C870E9030B Salt = Secret = 746BF4F07582D1341BBE28BA882006C688419EA4C342D0807FA04E8C6CE79CDED9F974AEB6E94654B0671DFEFC07AA9B56437A07AB2E3E60B5A2509CC2E7DBE49D1B17D43BCF775BD5F5F34CA39AE09B Label = 5B21076FA10C4647568D160A88558F9216CF50C7AF199D40E79AFE2A2EE22911 Output = E840861A220A836CD2D18F78E40B3C3D499ABCAE8AD6DBBA1D43D32AE2164FAF01DD8E0AA402F24BB8 Salt = Secret = F8DC1B361A0B38EDF32D736C2FAE67E87CFCF60C928FD01A9863960844FCA106B80072383E4BCD0902A895527660FD54FAF071B49024D34D082B08723221EB61EB129FE8F30B5BB40D7398781471D485E54C8551A550216A Label = FF62638830DA30F5DA55BD14E229315CFEDDC58A8FDBAD3650104FC549B65D40 Output = B2560950DDE5D8653608458634A075F18FA19B31E12E6B918B42F640F73267167E4A4F65F344EB2713D1 Salt = Secret = B5F4D4C0797A91BF25661C4BCA4FE8615D292C474EE04F08191EEE96541291722B0483AB7078DE2391AC911DEBE44A985765B3129BEC119CFCA3CD1378B68249B034B942FF3880C6080CA059356C03BB8C75C6CF7A92D1E611AA27CA0ACF70D6 Label = B5B4B3B84ACB6A8F5737F3B046B65995CDF80CB8E8E9FCDECF6ED1B05B0C9B24 Output = E1CE46C06767C97A13DB74CDA839A9ACA906B1B7F15A47CA7E6F85049A4CCB239B4D14FF7011C2005F267D Salt = Secret = B4D4DCD2A3D87D3A7492E34B71D2AFF108BFA7EA41F3456F3DC74CB711678E8FCED58206CB0FE4B0ACBAA77D3AD94FFE757CDCF42BF45FEE96646ACE0067628E0CA86EEB2B1242FDA43F4E2CC550ACF18F34C0BEB35DDC2EBBDE8406CD5E29B1FFA60F08159C5409 Label = 1B4A3D2F70BA9183F106C6CFC9B8BE1B229301E680E4C6F8FC2293CD850B8BDE Output = 6543F1F8728605BDF528F362FE636E9867F591912DAF5E440F332783DBF721982E16B9BEB5E55EBECE715B5D Salt = Secret = FF007BC35845D9540D986613DD4B2212E6F8A058AAC3DF921ED7F0786D2D73335CB9830D9003EBB858AEB039824E26C2B6D6BAD2EDE3CFA5FCAA9AD11718D26C89FFE8CC655CC544C9675C12C00419CD673AF59AAF8B0DE7F4F556EFCF610A855FB436A1F6CD695CE037D3E8A360C962 Label = 77C13199487E0EAB5C0B3816EE1AFA35AB3C1F7C76B1CCE6E7DD74C626ABD6F7 Output = AB02B347A0778C793872A3255615D578CD3B9B64E7D22C998E4A2B861F4A9203DD4B9CA278BE176E042DCD27EB Salt = Secret = 8FB75E8C14142904032B864D576EBE05A46B4B09C3140FFEF7838EC1A84FF56A81C5D21A51F6E1D7BE1F7EE91529C76AFBD57DB5D2A3B3B95865D89906EA454BB06B57DF291C168D22B863C7C434B2F3338FD8212C83F884158815C851C5E58A1FBBBBFBB8A1356F87914D9438C71D7F999D5BFEA55F843A Label = A1C0BAF846BB9594FD6127393674DC45D5FBDDC9F01F3CC60B8685EFB10AA8CD Output = 6781307FF1FFB8138976CA7F6531F6ABBA1E9EE378547B8DF25AC3080A787522E0FE5EB6802D02C159ECFD7F7F36 Salt = Secret = DFC5B005B925033A8BA08208CF03EA957426314CEFEF07582FA75F082064DABF182229A6BC50DD985E41583C93B98335B7F9C3B2D6E41D3821480354539FFB7A47264DECECEFB154039B675BA6A883B09E791F401246A1F728D046979567763D5552D78BCF69206386C5ED548C4FA181B012194D8E6E1AA7754306B05D93ABBB Label = 6A15930A9A4DE23FDAD9648DF5A87DE81BF3149DBC2A4DCBFE6CD4030447619C Output = 96E989A69698B035A0531E6BADC947CAF047D4638F33CD16317CC6523D6138AC34C454849A86AF7F9C7D2CECD18A97 Salt = Secret = 8D1C9B4D7CC7F6122CB68E43B146BD32DE9F5E09143118B29DB51705F25D6C81890132F81DF3DC53A7950D0803107306289FA88E907C2E53EC13ECA20F972B38B84C5C1847F0BCB2EE4A9B64EB48348B73256E61CE2A2CFCDB71F7DB70BFFCC101F8A7F1FEE5F9D377E81FF9EC79B7FB25C849D7B9DD125107717EC8FD93105762B1AC629FF6DF99 Label = 2D14C1C1989469A6676196410B62AF1A98D05DE226B22213FA731A814ADE2F5C Output = 95352C138EB9B23735BD68CB242889970846DCCBD9775BCAD068528E8008A3BAF1ED2047525EAA29C99CD6E0E634EB30 Salt = Secret = 3D80868D09B92E3360A74365D1661758D8136CCB75313D55A253EE253061FA13ED43C7FE288848D9CAE40E5ABAE3290EAD665B97B0F58F115D3F9017DF71BCF872F39ECD1617291520F16D4995B1E711E1D0DC5EF61F6C48F6AF9BD94DBBAF5146E05809A239385C36001CF5C59E862D9A15C1DF20324095090657C9F168DB1CF79C7BD88C055377ECDD846A79C43E94 Label = 260F626FA017BFDA963DE8CF3883C7D77745509E69833116F1385BED6D80548B Output = 5CD35BBA0B1BF51CD62EB55EA408336DECA1F25A34FA00C71E9A6B3AFC1BA97445D8845A71EC412E9EC3A301A7B0C8A97F Salt = Secret = 312680EE9282726A16DF2A488B34AF9C277F7335A06ED3AEB8CAF7EB25D5D6DA038AC6B13B58E445B839838C4A526CA97D53699B8A73B54FBEBD34671F1E327F7FADAD6D00B6CA202EE06D0452E0CC8A514E9BF9655E299D9699493539D1F823F4C1D46A96F4AB0F55F475BA9191642711E576DFBBAA79F8446E8988DE8B9EEA300955DAF905FC57ADEEB45FB916EA2C7D44131556FA2001 Label = 065B341489EB84C9E249FB882713B15FB7B9E1B41A3E66B14AAC34DBD3733610 Output = 71B9C00E846818DF9C3DA24C0ECA0BC8ABB52BAA936EA4DE901B3215B450A2776E1F3D8ED1D4A3C4C7EED8B394A4649CD4CB [SP800-56A(SHA-384)] Salt = Secret = 51373E8B6FDEC284DB569204CA13D2CAA23BD1D85DCAB02A Label = 6C5544797A91115DC3330EBD003851D239A706FF2AA2AB70039C5510DDF06420 Output = 894340AD Salt = Secret = B2F3A2D4FBB002D9F0B51258AF43E98A5423FB145257AE460342361C2199D380 Label = F9C06213585289654996F0C40467B9A69480AB8D5B16A08C7A0C5F1570F966EF Output = C4159FBAEA Salt = Secret = BA68A99D6EB2AFFD8BD039AB13C3A3AA9F02C6C11FDE8570429D2FCE61D97D81C51CDBB8FF143D04 Label = 9D4169CC1427F2A407191B84AB7ABAACE66A95CA26AB0915803106315080F331 Output = 95B7D28FBAAE Salt = Secret = DC5E08ED643FC5ACA38CDF756CA0D7D678F3B241FA61976EEB16A904FC83E0326E1CBD639A9591899ADF8DE1FC1B1B5D Label = 430312B971580AC2ABBE70998F136D3CACE833E0B165B74C351AFE5FA20D1EB7 Output = A54E6F26388977 Salt = Secret = 2897B5B2F94BE3550BAC75877817A0F47836A57A5FF777345DAA6E5F0599D4AB8D4C59C62067AEDF00C02DDA77E4AF871CDA63FBDE164EDC Label = EDEFB6C58327538F3B4F7E4B9AF30C7025122DE56B7E682E56D7EFE433C2CA85 Output = 192EF18B9F943928 Salt = Secret = 7566E8A2FC90BB54E366378A1D360CC0FECC1557910971848C66D1287D147B618F096A9B469B31D7FBCA3FECD0720EB89C3B46299034749EA787DB044AB7997A Label = 7664B2D719770E089BA50304245B45BF330AC0D241BAC76D55F330B3981CEAFA Output = 7037E2D718D13D5EDD Salt = Secret = 969040DA2CAA520EB50A19CC38FB5F0CA9706B51C08329844C7D3215037DB3C77DA4D6D8761347F4C3FA96ED2D3D99EFDCFB89718654062C2A7DD0D5DA417E37D66DD543A53E6484 Label = D8FD0095FE329F956FFBE411F5BBC5661809BD60DCE865EEC08DF81BE59C5AA6 Output = 9DC5DCED54C31CDF6B69 Salt = Secret = 12DA37D3C6B51CD79EB5EFD1DBF75F457B1424E681C5D3CD85EE3C1BCC2D32F30AE19BF86D17FE382631E501A8E7D0DD9074934A0F2CEB98CC8613971E80056F73F6C25DD99BC52190799F23706F6F27 Label = DCB12731AD8BC0308EA4BD63F4924AF269936DD126D4ABA28C8C4C6EE489D10A Output = 6EF9F5A73A69F779D45C98 Salt = Secret = 6B9C5E760EAC93BC00542482AD998EF0DA4C49532AC2B64B398A63EB8B57B73C1E9916288968DADC3DB80AFF7DEEF139A45519833FA889B5422646CD102F1FA82BF9F0018A32EADBCCEB835E9B4CAD51FE411D977844449A Label = E8FB3E3052796E282980864686C382CA9DFCE33C92429B0DA13547FBB6911E90 Output = 747965C4EA52BEC68896877B Salt = Secret = C65E98F36147239627FDFBEF1AB4A5F73AA3D5F91D68D81864788FBD6BA65C8AE4EF8C941FDF6D73DEB8990D45630B16E1A0AE0CA0F970BF08EBB7D7D84C612BFE5C0AA5AB3F53372DA692AED23DF90B1B08F32B000C898BEB71BCE743517B04 Label = FAAC974B1E71D0CC25C4C015D84BA72FCDD9C0D9679A48EDED50F5BAF3DB9510 Output = B9E60B022F604665878C30760E Salt = Secret = 817F4A10573ADB4CD667DBC48B2EC6C23450CA72CF1E0072D0450D370BBB9EB3DA2CEB9D2FE94F36D8B5B3831E02A5624F65FFB437CEF2075EFB747513CB0EB58F42DAF7C2E6930113B404CDC0D3C4AEB3A3ABF70DFCE220CB71D53CE156E645FC92686E3D907DDD Label = 6E243942AF420F4E78A3B4FFD6BB1FADF401A2C2D0B28293E5990D0929CB5CE3 Output = 09FC404D89DEB000D73F80BA0BFA Salt = Secret = F80D6C1C42D402E6E4D18C44D45A0C78A674936EDE4B4FC14C6F4D47C378DBD6B67860819F37AA5A553D36E9F34BACA2596107F475BDB891F9FB9B4101BBE55DC5CEBC789E58FFD74B480ED33EE2124667A5CF7E724F4BF231FD96A3536484C65839A3A443E9D359128D29A5300BDC00 Label = 446CC99F84CBAD1D0951AD04251DE3CCED5305097DFC84BCCC94E51C2E39D571 Output = 4CFF781B8FC3F767F7DBAB5BA873D9 Salt = Secret = 6D4106211D95D9F76AA02979EDD8C388E1365CC8CF91455DE0CB7BB1EA541B1ED1A652B6730CA90E379596ADFB99C4C34185B28266FA499FFF876FF52773C57D6C6733CFAC07D9750015263B818C0A9E0E85A47B6CDFFBDAC8D12CD2269AFD0B11C9E6DECFCB7567E6CF8ED1A850DBADCAF7F2CECF850E88 Label = A6139DC9D3C54D939CB728396E78ECC6136A5567C4D52EC06647E3218BFF252B Output = E0A0E3D0E8878979CF520B072BF5B901 Salt = Secret = 3CE74D3EF4943100A0EACD79F28C764977D05CCADABADE99A09F2F3E7ECCF1A0562F3D1D9BCC18E8B1C3ADA80CABED3A707FD4298FD1F708120739A9C43C4A55AC422E060506EBC519BFCBCE8B5A7641D1F32100551E93BAC2DD07CF93B67654411EFE2EF24017D556401A86AA3F2A196F4D92EF60FC1DA11D98ABF14FEC676B Label = E8B4DE11E3BECCE934705789CD2F21463F50988748D6D027002EC8E1BEBC2786 Output = 1F77A2B2B0B5E109093401012E29440D53 Salt = Secret = 495C82408DFAB85487983026DBE15FF09CE7FA77C6C0CAA08DA2C91047E12EEBA9617FBC8891961BE82C8DC8E79888965C74DEAF43CFAEDF3B6B18308685EEFC750CE60BE6D9BDFDA9145F4EB5BFED49D6C2AD27C6A736529E043F808A7A4119CB936B50D02D85A2D4459AE0F3DEFAC2049134BF0E945537695A74B2FF7A9C9DF4DC68BC2201280B Label = 335DF88135E195878644EF8CC50591E080A3DCA55F48DA8550C717AF07E42D32 Output = 318DADA5367F0818C4347E7AD0D28028B84D Salt = Secret = 71A4599C21E079932DD6493450BDD23034633103C26BFA775AF44BE897AE638E8190DC39A8F3D84C56592F85EE57C2500725BACF3EEB5DE3CAFEDB0070FA1B36CD97D29C5740F90D1B4631FA90E9BD6AD005BB0A2D6DCB8A47751BB84016BE6F64DB7EF4110E2A896B5C225A6586EECBC86C219AEE17C0CF88AA616D81EE7ACDFC03753A5B7B121F4A401DA213D46673 Label = 665186E586A5620E1547E6C8E08D90EFCE62B5A206334169B1549F5895D9E9ED Output = E9A37AAC57B112DFBCCD30D6E68B82BB112989 Salt = Secret = D8281359E194EE68386AFB06AEF687D7C342A270F8548B2FE2A0F9F650A997D6A4F8C9711FD28E38B9750AB33E26AB92199BD6E8BC6B0B2F0073D5C035667D9393AFB68C5580926C35FA351C2F2766B95EFEAE4FF30CBCF0F2BC0A2D279A6631FD8FF6F7C67A6E91302C19C6FCEC37AFB48A318F3C580A025299C66F38975E59A88D55DE1BFF567C370A9B16314777CB4364C4CF289D6B75 Label = 935B371FE9B959B07DA408F97387C05F72D426CEFFCE3D986722BDCEA64C334A Output = 9F4796BDA909FABD40EC3F227A9629B76FD01077 Salt = Secret = 31B8A4962191C1D92B7385A1E1EE4D258422692F0ED3BEFC4938D07ACAC2182E3C20A14AF7DEE0F37B0A1CE515DD03BF989FDC0BFF6DDD3F7C4F13E8DCBB2AFC97E6E028A47245C816D3160529D857B671A3D4D8E3F4D0D5211D15F4B48EFD7F58D37483C8A85AC64C7CCFC1D4D3984F5BF17DF391FA83BA454EAC6278365C90D888A7E6C461FA936017D165CBDC216A08B4C58D23489F73D5CBCED06D372C23 Label = CBBB5401C2BAC52B590383CDB97DA2DF35504C83F6A58C7153567528200A2C4B Output = 750470D3E7C9E21F6DBD3795AF6764D8BBE87B56F1 Salt = Secret = E1BC374ED79B110FD320732CB8F4C8964DDCE70E5439DAF16580481B17CA39ABB4CAAF6928C02343DEA672F9F01D30F25D03DCC86D993FD5722AAFFE315D5361BAEE048AFAD606CA83942E6C8C9232BBC7F4FDA6AEB7ECBD41E785266C13C1C6926F37DE720F690556470C784995962B15C97181660B4407F91B6145F898161CC90125FA1B6A430F2EA1646F13C02BD234C587C3449A6D09E40A764D33FB870BE9CE9D657C42E77C Label = 34A0B46537817D1C53A9824A8ED4B7B9CD731630A6168FCC73D732C59501EA70 Output = E0F805B8BD8CD51A4F7F47201E5F1D35AF3E3435D141 Salt = Secret = DFDD03BA5257D9CC662D4A42A837DF5F3B0B493BF4FCB63366D1EA33D56FE77FA0FCF16658720A79FF2E0901A9173705FF657B87511586B27C040FB917B1DFF0F5688EB268AC8A714CF2B30FE93B7873AD92B8049C99D12DDD5FB7DAC79DFF52480E7CE1ABE2DF675A23563900E50671197A0B3A93588917BDCF4219BAEE2DBEC1210AC8582E49B6770E4BF900E99DC32000E3936ED3FF5CD60353C7224F02CF66282C934EA9DB0148C118D8E4744CDC Label = C24AA0D37B0BEE05597521F7DA24766A39EC6EF30D0A5A0A5D19552FD8D5980F Output = 60124D23738738B37AE5B27A4BC7D85A13DED5161A1756 Salt = Secret = A4253CF7EA1AB5BE0EF9ECBC21048F1B28F7C35B9C1C02F2EBF14B0B54B0BE9E1BF9C4BB2F5D5788B36692C6141723521A4C69D3892D79FCF76FBC0C9C3415BED3A6425E83A091257A4E6DFD3F96EE3B3264E22BB8341617B50A5EBE6451C6AF475B17B659AD44917C161196D8DA9025083F39883DA4FAC555B75C1F94AEC913B40177CF28B620EC323BFA00747737A5F6C968CD2BE526E1BB661B0D51FAED757F10B42468D1EBF84EEC1DF08A9FE237F71DE74231054B7C Label = C4D2C9B39DF024D89B8D1BA54360D33ED388FC71E2B9DB555F33CC641E67F23D Output = 9F20B501F8A509D7FB6E060559687E7D584511FDDD800781 Salt = Secret = 996844A82BA03706F454282102F6CDB4BCF673789058ADC69D81AF6DC03FD50A13DA7091E8A86D99C4EC67A3F5180533F594B67C14E9FE659143BF792D74DF2CEEB1E6D77DED4590D2EBB8FC09094924BEEF654711E522288D418A3148A8CF8B8DCC8D4FF4EC6124B1FB3FD52907EDE2CA94D1FA7F42B9703F04BAC5666C8A03B2FBE417FC6DD6CEB69915C4AE2744F8F8852AA59730DC559D70559331B4C7D13D81A27964811427770B5D47930C25ABA7950506D84C03A1F571E3D2359426DC Label = 4CC17E67509F94FD13498C91E0B36E69343D3EF9CD322B1AB2204A215BC800C4 Output = A80042B1C40A49C1CF1C0AE6C4DFD3F4C82CA973FD01053F94 Salt = Secret = 8A9EA2A98EA50284EB71A3D9C55174FA4BC6C46F435F73D4329297CE81FB91FF49845B0F19EF780A36E14BE3EB0BE373147DF7CE81D788E83520AFF374885F24D1054060CAEFEE248E1C86630A267F38911C64D8718D9FAD423D818445ABCB9DA3A7A11E1D7DA72597045CCFAD0BF4C36B91F959A55BB356AA1CC1CB7CE3EE6615DFB2E596BB450C0E742001A567DB527C88D948F9A211B2CC503FF75972552591FE13482572A0D2AE62849EFAA311B9D29DA5D1B3F7C938B508A89D9690684E270FF0DF6854BD4F Label = 0BC2ACD8C64537C4CC9D5B1E94361DEBA083E076E109EC5DE0C551E3AB2B19E3 Output = C5823090AF5379A5882D31F459A200BE1EFD8C9F04C2869BD33C Salt = Secret = 97660D4C91FA7E87ED5AFB28A08FC3A6E241E692EBB735B36B01E16C8D9C4D696199BF92151C279FF6224889F35C5CABB8E60056218259384BC363BED96B183A9E4BC62DB2925F0D624E616A79459073DA64B637E641E86DB278FF6C538808368D1DEBCA9D13D36F5598385E8C2EFE6DD5C96237F52053E10890FA9E1452ACFD0A2F640B87F21862306C0C0E95A4E54F90A94E907CB4D95412FED0616643FB9ECCECB8398D73595913F0AC6C10FB70A803268EB7E1FE6DA25A55E23AB95F113CC16BAFE0711E4B3C6B9DB314898D478A Label = BB4C0CA1173E06D6392340C2C22CD023C903990B51E895F5F64A5AE08317C673 Output = 5809AA09C3CD1E4A05C43A2D224EDB037FE7A15849AA4B62A46D25 Salt = Secret = 1880514D1778BF65ABF11D5DB4FF0A8BDB601C3E8AC7971291E9ACC0EC843267A6ABE7FC69AF879E664D034187F040F0FB099ADAE388560E882F35A4FAEF4049654227F9B39D536BB7746FEA4BF464364373A17DC727CB96EB93F91B552B33BD27F4CB6CACF12210D1C5697F9BC870AD56984CA2A98C84A7537914DE1C08DE873B57CD874F50E1FDB9B8FFEB1A4260A27E6E1F72632974F59390C27715F87A2E3EC7643868370706EEF2CAAA4D00118441552C2369783ECEF3B532E14EFA86B608640AEDD2FB128D5BE34647F0FFF12B79DA47557602A7B4 Label = 2D451E8719FE802E70EF148A0CE9CA39C23AB158F740D046A0AD5131FB81FE7E Output = EEB7746523A94D6C182BA19FC225FF6E0DDFF56B46566B3C5761426D Salt = Secret = 4AFC47B5F5581286BA77A2D5902B5BF24E4E4EA808E5E0B276EE679E2A18962230438A99A7E85B0B5C3D6DF9F7FE91DD710E49DC121A3F9FA7062E6D58634D963661198F26D69E59FB0B660E5AA614E10ACBC57E97D8C0F5F86E9E578477B54463CC0EAA29FFD1BEE59266A477AACE1FAB65F9C35D2CB889B695ABAC9D83110AF2732F2789DDDB70BBCF20F20C8CEEBF0B4CBF81EC5AA9E72142FDBDA20FEAC784D18D4EFB8AB98BE5A1397579FFE78848324EC6E0B46EEA4A448BA9AA9D7949E4B59D00BC2F04FB039398B2D3C4DC9353C2DD6DE556CC695FAD75ADB7B71CDB Label = 1D34412DBD37CA197318AB472A863558934146E2E9C76FB54602574032C2EFFD Output = E7903B2E0E77B5EB1BEB3879E65F211C358B89E981BBA36B9080DC5B3C Salt = Secret = DA22DFC49B143BAF8F2078EFCD33CEBE4024F1C5E33291BBE20B58EDD13B9FAA779A3528B4AB5A81A190512982A3CB28BD5EA9343FB87093D7711624B50B7CDA9B928775DC5E1DA8E1104D4CFADB25703E898C05B198E8ACDD807A748C81457957BA0856D0B884783B93D7385931D548393E1C59F31F9057A518A6BDEC48AC662FB20DC1E9C040250F7B8C49DC68935CA5C6A3262C902213533DEF3FD5E4EFD6EF0C99BD376CC6E63800BB6B921B055DB2C42C0CA8B1B55F8AF93A762062DAF29541671875D7D164E8BAEA52D7292640370F042215CD484B3124C8B196EFCCEBE52348710476F23B Label = 3448E5AEBB152CB076207309114DDF8A003692108850F1159BE09BECFED3730C Output = C7BF2B21D1538548DDD94AEABE3A1257DF8515EA6B6D9A7B8251FE67AD0D Salt = Secret = 48A6118BCA849ECFF3D0F1BF7539E42EA7E67324F16EA72F4F4215E5B69C5B0CDCD406454298FD17F633EB97B8934A2E1A18BB77EF952574907AFBFCDCABD44605D7ADC1522AA84F6643CABD220ADFC8690414949F34DDA8B5DD07295D2931F90627838476599F35D93B487511B1E87A5B0E11ED186847397CD836CCDDF78E4C12A83062AC3C89FEE1535A46101F0BFADE483CD58452F65D711BE320B194B370ECCC92CEB355999406817F7B8D7E6DC596CA7B2685364B271137551F811E4884C4AAAC08071718C0266DAC17EC29F35B24FD5767750A44DFE39AA489E8FEF63447B16336C4CDAE61236B0B25015EA368 Label = D684668CC073238CCC713721342AF77D90D769CD657C70A9BAEEDD3F91BC9820 Output = CC83D81AFF815823C55294F5ECC7FC651BA70AE0E9B86BB38DF663BC298DB3 Salt = Secret = 5E81067071EF8FCC2C58D244EE8D674E056E325EF31E62EE291563BCA1921C50FA6203C3E7E4A13220A9D3AA0EEB5ADDD857FC270DD502C2FA8411F9E9992BDB953FE10CA09EE6BC88A9BEC38A325D272704E3509DD6B92365DBB7929E4D2E6EE96228686EB858AF1AD32ADF0C70288E87FCC0AC0A96341B5BDE3063AF2D5E39C84292A5E83F11B6D01223EA8F3B4ECD5EF73CD7C5AD34206AAA68B7D4DA3CB76907A9D3262CE5AF15ACB484D8E85C35D5EADAA1551EEFA11BD389DB5E22185E465A12059CA329001F9880A61E60F7A7A5F1F2CF373F244667C9B59EFBDE4D568B55492FC58B4FA4A1884EACFBD4931C0BB3684B20E87E20 Label = 78F258A38556FB7DBB4592542B8839805B59C2A4A8CD33D3DAD22348E25BC0B6 Output = 4D53DDB8659F45B10992F655390E9D32B6E4F900296C901F404BD16478651B17 Salt = Secret = 7CE80E8B0480CDE01FEC587FE7045A8E Label = EA0E5D80A76BB5063148CC997B76DA2D895BC3E4DFF37C48579CC4E580F1FDA3 Output = 6D24A9301D58FD4DA8979549881EFEB4F68CB0E4BB2088567CED503D25B6C3A18B Salt = Secret = 31959754B0F25A059CB5DC822BF2C50D4EA35A6A2C6B5195 Label = 5CF8056657ACA01CCCBEA17896F29AD012C80AE667566F3CF45553087F36C3C0 Output = 392948A8F8C534E3ACFA99FB840F68336A3D55836675B61C1EB6C1853C7D4D92AC0D Salt = Secret = 66529B931640F301531F4FA68EE95A97BA4DE7673C08429A7F724CADBE8727B0 Label = 9C0F11D1AB916378EBEBF5D549A7FA80874C70E9A4B2FAE3B0DFD9A714167A4E Output = A3829B18C59D3F06DA50CFCBA4FA2A03B13F5810372C6B007B08BD767A9E6CEB6F12DE Salt = Secret = 649390CF25B068F70F99651B04D0563A53DFCD8531FCD9C377A7D8E19E4E80DE61CE24D3F522EA88 Label = 94CC79364C09E9040B015EEF409F2D436DC687CA5AE4F985B52E76B58521E665 Output = 997D1F4B29A9987D90E7DA354CAEF0EC130B496D79FB4C4EE7B15C5AA24A4B211B6B4AD9 Salt = Secret = C336F2BB7B74101DAB3B83584E83776B23B1EF261037B6570C5923DDE4EE96FE9FE3B650AFB6BF605371246C7089955B Label = E0625FCF16F8EBA2D7CEB98EDBC2316091C081FCFBF4CC5A1B73B1F00A94E06A Output = 3C4E763F114AC6AF87CE4AF0F6F45CDA16F739A5133F94CB8D2C1EE84360D0F0DD23D545FF Salt = Secret = 7947FE718563A28C3C5C0E24A81260AC4480FCAC25DED2F79B00F2CD94F7E682901E1109A25BB6D7FFB0DBFF0BD7591FE4643684015CAFD1 Label = D9C2A33593A0276FBDE7CD51E60C6EB3CDD455BA66BE8AC5272CF2569116C7AE Output = 62F70C30D25A6FAFC82EEC6EB0DFFF04715BB4A1B580DD71D3262DF2DE5A5F695E0A5C883511 Salt = Secret = 40684285757E045319218F193FA880407F60F023E53BE2EA6722EB1109BCC28B3ABF8B06AB55651AD9D1C7E126E885DA0A1A96DBF04FA23B2D0EF0EB3EB77122 Label = D43A4E808536F27DBA7D0876C2EAFC9164DC6A85DCED61053B6B1490D03E07C1 Output = 4FF4FF53F4962681681A96BA43C343A0E19D0E57B10590AA6CEF260A326BC627078854B309B901 Salt = Secret = 1A7AFCA7593480A14A1916CEF3BD9B3215CBC6617FB221742FF8F566838D2603A727CD7D60D08C1DBCC7A52D273409A8FE0DB16702AEB1A51C85EF8F976A43DE3888F77E68C7E532 Label = F58BEB3E3FD67949C4178254733C1304653D48B58AAF9BEC71349F1E51F097B0 Output = C6CE5B5C49C2F99C35A0310CC0A1E8F82AE512F9025541F18A1B96968ED14BEFC9E26B9A14EB8803 Salt = Secret = 746BF4F07582D1341BBE28BA882006C688419EA4C342D0807FA04E8C6CE79CDED9F974AEB6E94654B0671DFEFC07AA9B56437A07AB2E3E60B5A2509CC2E7DBE49D1B17D43BCF775BD5F5F34CA39AE09B Label = 5B21076FA10C4647568D160A88558F9216CF50C7AF199D40E79AFE2A2EE22911 Output = 76231687FCBB3699BB3AC5A8252CF92454E0177C868722412785D91D674E906916256F89C5BA790E0A Salt = Secret = F8DC1B361A0B38EDF32D736C2FAE67E87CFCF60C928FD01A9863960844FCA106B80072383E4BCD0902A895527660FD54FAF071B49024D34D082B08723221EB61EB129FE8F30B5BB40D7398781471D485E54C8551A550216A Label = FF62638830DA30F5DA55BD14E229315CFEDDC58A8FDBAD3650104FC549B65D40 Output = 7E7BA6100A4815517841FE4D948DB86FF2B879A67A9E3B94C63E040B3D9ED9FFAE59D80B2837E427DEE4 Salt = Secret = B5F4D4C0797A91BF25661C4BCA4FE8615D292C474EE04F08191EEE96541291722B0483AB7078DE2391AC911DEBE44A985765B3129BEC119CFCA3CD1378B68249B034B942FF3880C6080CA059356C03BB8C75C6CF7A92D1E611AA27CA0ACF70D6 Label = B5B4B3B84ACB6A8F5737F3B046B65995CDF80CB8E8E9FCDECF6ED1B05B0C9B24 Output = 7514B6A3DB4E5EDF9A0A50CC98A68B0BE48DC85A2E4D43A8360A6396C4A4D2B93947B438DB779FC419EBE6 Salt = Secret = B4D4DCD2A3D87D3A7492E34B71D2AFF108BFA7EA41F3456F3DC74CB711678E8FCED58206CB0FE4B0ACBAA77D3AD94FFE757CDCF42BF45FEE96646ACE0067628E0CA86EEB2B1242FDA43F4E2CC550ACF18F34C0BEB35DDC2EBBDE8406CD5E29B1FFA60F08159C5409 Label = 1B4A3D2F70BA9183F106C6CFC9B8BE1B229301E680E4C6F8FC2293CD850B8BDE Output = E425724773905323FB364D5893C5545642072D4399398E2065862AE524D75A49899FF9D30597DA7F3604D7AF Salt = Secret = FF007BC35845D9540D986613DD4B2212E6F8A058AAC3DF921ED7F0786D2D73335CB9830D9003EBB858AEB039824E26C2B6D6BAD2EDE3CFA5FCAA9AD11718D26C89FFE8CC655CC544C9675C12C00419CD673AF59AAF8B0DE7F4F556EFCF610A855FB436A1F6CD695CE037D3E8A360C962 Label = 77C13199487E0EAB5C0B3816EE1AFA35AB3C1F7C76B1CCE6E7DD74C626ABD6F7 Output = 383DCEB728CB7104FC02E557E2641D5992E380292B3E20799E12ACEAC1B85C73856171033F6644E45F7CBF7BAF Salt = Secret = 8FB75E8C14142904032B864D576EBE05A46B4B09C3140FFEF7838EC1A84FF56A81C5D21A51F6E1D7BE1F7EE91529C76AFBD57DB5D2A3B3B95865D89906EA454BB06B57DF291C168D22B863C7C434B2F3338FD8212C83F884158815C851C5E58A1FBBBBFBB8A1356F87914D9438C71D7F999D5BFEA55F843A Label = A1C0BAF846BB9594FD6127393674DC45D5FBDDC9F01F3CC60B8685EFB10AA8CD Output = C276B2927DC22A5FBDB09514986BBEE6F3359A616CFECE503FD031ADAD1801CB9925C80DF7B03574DAF914D7EA88 Salt = Secret = DFC5B005B925033A8BA08208CF03EA957426314CEFEF07582FA75F082064DABF182229A6BC50DD985E41583C93B98335B7F9C3B2D6E41D3821480354539FFB7A47264DECECEFB154039B675BA6A883B09E791F401246A1F728D046979567763D5552D78BCF69206386C5ED548C4FA181B012194D8E6E1AA7754306B05D93ABBB Label = 6A15930A9A4DE23FDAD9648DF5A87DE81BF3149DBC2A4DCBFE6CD4030447619C Output = 1E06170CD9F895E813BA635E90B6F5F5E7665414D554D09A7A67DFE7B95514ABA440F9D3A15886BC574FB3866390BD Salt = Secret = 8D1C9B4D7CC7F6122CB68E43B146BD32DE9F5E09143118B29DB51705F25D6C81890132F81DF3DC53A7950D0803107306289FA88E907C2E53EC13ECA20F972B38B84C5C1847F0BCB2EE4A9B64EB48348B73256E61CE2A2CFCDB71F7DB70BFFCC101F8A7F1FEE5F9D377E81FF9EC79B7FB25C849D7B9DD125107717EC8FD93105762B1AC629FF6DF99 Label = 2D14C1C1989469A6676196410B62AF1A98D05DE226B22213FA731A814ADE2F5C Output = F1FF73E8F6C4FEAC192F29E3133C7401B4605D5A9498DB303EC41A657B5C53C83A2C59EB5DD4104D0AED7276253D6CA3 Salt = Secret = 3D80868D09B92E3360A74365D1661758D8136CCB75313D55A253EE253061FA13ED43C7FE288848D9CAE40E5ABAE3290EAD665B97B0F58F115D3F9017DF71BCF872F39ECD1617291520F16D4995B1E711E1D0DC5EF61F6C48F6AF9BD94DBBAF5146E05809A239385C36001CF5C59E862D9A15C1DF20324095090657C9F168DB1CF79C7BD88C055377ECDD846A79C43E94 Label = 260F626FA017BFDA963DE8CF3883C7D77745509E69833116F1385BED6D80548B Output = 8E6DCF349BF0A62ECCCA1EE5D9AC2BC51A44B6BDE252AFFAB03474729B00DBB31A24FBFD684FD43EFC4F65178767026DCE Salt = Secret = 312680EE9282726A16DF2A488B34AF9C277F7335A06ED3AEB8CAF7EB25D5D6DA038AC6B13B58E445B839838C4A526CA97D53699B8A73B54FBEBD34671F1E327F7FADAD6D00B6CA202EE06D0452E0CC8A514E9BF9655E299D9699493539D1F823F4C1D46A96F4AB0F55F475BA9191642711E576DFBBAA79F8446E8988DE8B9EEA300955DAF905FC57ADEEB45FB916EA2C7D44131556FA2001 Label = 065B341489EB84C9E249FB882713B15FB7B9E1B41A3E66B14AAC34DBD3733610 Output = E4322570E75817622BA42BA00E04490418A7F879D3937D580018573FF67500759D73B1D0BBEB3B5A7759C4D9ED174682822E [SP800-56A(SHA-512)] Salt = Secret = 51373E8B6FDEC284DB569204CA13D2CAA23BD1D85DCAB02A Label = 6C5544797A91115DC3330EBD003851D239A706FF2AA2AB70039C5510DDF06420 Output = 6F015EA0 Salt = Secret = B2F3A2D4FBB002D9F0B51258AF43E98A5423FB145257AE460342361C2199D380 Label = F9C06213585289654996F0C40467B9A69480AB8D5B16A08C7A0C5F1570F966EF Output = 189C0F84B0 Salt = Secret = BA68A99D6EB2AFFD8BD039AB13C3A3AA9F02C6C11FDE8570429D2FCE61D97D81C51CDBB8FF143D04 Label = 9D4169CC1427F2A407191B84AB7ABAACE66A95CA26AB0915803106315080F331 Output = B7269E8FA844 Salt = Secret = DC5E08ED643FC5ACA38CDF756CA0D7D678F3B241FA61976EEB16A904FC83E0326E1CBD639A9591899ADF8DE1FC1B1B5D Label = 430312B971580AC2ABBE70998F136D3CACE833E0B165B74C351AFE5FA20D1EB7 Output = E930A8D6060B2F Salt = Secret = 2897B5B2F94BE3550BAC75877817A0F47836A57A5FF777345DAA6E5F0599D4AB8D4C59C62067AEDF00C02DDA77E4AF871CDA63FBDE164EDC Label = EDEFB6C58327538F3B4F7E4B9AF30C7025122DE56B7E682E56D7EFE433C2CA85 Output = 5FABC62D3F1ED357 Salt = Secret = 7566E8A2FC90BB54E366378A1D360CC0FECC1557910971848C66D1287D147B618F096A9B469B31D7FBCA3FECD0720EB89C3B46299034749EA787DB044AB7997A Label = 7664B2D719770E089BA50304245B45BF330AC0D241BAC76D55F330B3981CEAFA Output = 9FCB661D6BB43D6964 Salt = Secret = 969040DA2CAA520EB50A19CC38FB5F0CA9706B51C08329844C7D3215037DB3C77DA4D6D8761347F4C3FA96ED2D3D99EFDCFB89718654062C2A7DD0D5DA417E37D66DD543A53E6484 Label = D8FD0095FE329F956FFBE411F5BBC5661809BD60DCE865EEC08DF81BE59C5AA6 Output = 93378AD62E6FF5BCEEA1 Salt = Secret = 12DA37D3C6B51CD79EB5EFD1DBF75F457B1424E681C5D3CD85EE3C1BCC2D32F30AE19BF86D17FE382631E501A8E7D0DD9074934A0F2CEB98CC8613971E80056F73F6C25DD99BC52190799F23706F6F27 Label = DCB12731AD8BC0308EA4BD63F4924AF269936DD126D4ABA28C8C4C6EE489D10A Output = 06A1B2AEE061AE14944E53 Salt = Secret = 6B9C5E760EAC93BC00542482AD998EF0DA4C49532AC2B64B398A63EB8B57B73C1E9916288968DADC3DB80AFF7DEEF139A45519833FA889B5422646CD102F1FA82BF9F0018A32EADBCCEB835E9B4CAD51FE411D977844449A Label = E8FB3E3052796E282980864686C382CA9DFCE33C92429B0DA13547FBB6911E90 Output = 5FE81C4E6A5FED732091F976 Salt = Secret = C65E98F36147239627FDFBEF1AB4A5F73AA3D5F91D68D81864788FBD6BA65C8AE4EF8C941FDF6D73DEB8990D45630B16E1A0AE0CA0F970BF08EBB7D7D84C612BFE5C0AA5AB3F53372DA692AED23DF90B1B08F32B000C898BEB71BCE743517B04 Label = FAAC974B1E71D0CC25C4C015D84BA72FCDD9C0D9679A48EDED50F5BAF3DB9510 Output = 47EC5A699ACCAF156D1FB7F795 Salt = Secret = 817F4A10573ADB4CD667DBC48B2EC6C23450CA72CF1E0072D0450D370BBB9EB3DA2CEB9D2FE94F36D8B5B3831E02A5624F65FFB437CEF2075EFB747513CB0EB58F42DAF7C2E6930113B404CDC0D3C4AEB3A3ABF70DFCE220CB71D53CE156E645FC92686E3D907DDD Label = 6E243942AF420F4E78A3B4FFD6BB1FADF401A2C2D0B28293E5990D0929CB5CE3 Output = 239EB6747DC55C57682B202D08D8 Salt = Secret = F80D6C1C42D402E6E4D18C44D45A0C78A674936EDE4B4FC14C6F4D47C378DBD6B67860819F37AA5A553D36E9F34BACA2596107F475BDB891F9FB9B4101BBE55DC5CEBC789E58FFD74B480ED33EE2124667A5CF7E724F4BF231FD96A3536484C65839A3A443E9D359128D29A5300BDC00 Label = 446CC99F84CBAD1D0951AD04251DE3CCED5305097DFC84BCCC94E51C2E39D571 Output = C1A552A6D3B67D46C5146CBE2222FD Salt = Secret = 6D4106211D95D9F76AA02979EDD8C388E1365CC8CF91455DE0CB7BB1EA541B1ED1A652B6730CA90E379596ADFB99C4C34185B28266FA499FFF876FF52773C57D6C6733CFAC07D9750015263B818C0A9E0E85A47B6CDFFBDAC8D12CD2269AFD0B11C9E6DECFCB7567E6CF8ED1A850DBADCAF7F2CECF850E88 Label = A6139DC9D3C54D939CB728396E78ECC6136A5567C4D52EC06647E3218BFF252B Output = 6967C1113F26FBDD1E77D5976F9EF39E Salt = Secret = 3CE74D3EF4943100A0EACD79F28C764977D05CCADABADE99A09F2F3E7ECCF1A0562F3D1D9BCC18E8B1C3ADA80CABED3A707FD4298FD1F708120739A9C43C4A55AC422E060506EBC519BFCBCE8B5A7641D1F32100551E93BAC2DD07CF93B67654411EFE2EF24017D556401A86AA3F2A196F4D92EF60FC1DA11D98ABF14FEC676B Label = E8B4DE11E3BECCE934705789CD2F21463F50988748D6D027002EC8E1BEBC2786 Output = 6B87BF2D829E10F2B08C334C4A17318E0D Salt = Secret = 495C82408DFAB85487983026DBE15FF09CE7FA77C6C0CAA08DA2C91047E12EEBA9617FBC8891961BE82C8DC8E79888965C74DEAF43CFAEDF3B6B18308685EEFC750CE60BE6D9BDFDA9145F4EB5BFED49D6C2AD27C6A736529E043F808A7A4119CB936B50D02D85A2D4459AE0F3DEFAC2049134BF0E945537695A74B2FF7A9C9DF4DC68BC2201280B Label = 335DF88135E195878644EF8CC50591E080A3DCA55F48DA8550C717AF07E42D32 Output = FA5C15E576C94729EF2911FF0F397184B46E Salt = Secret = 71A4599C21E079932DD6493450BDD23034633103C26BFA775AF44BE897AE638E8190DC39A8F3D84C56592F85EE57C2500725BACF3EEB5DE3CAFEDB0070FA1B36CD97D29C5740F90D1B4631FA90E9BD6AD005BB0A2D6DCB8A47751BB84016BE6F64DB7EF4110E2A896B5C225A6586EECBC86C219AEE17C0CF88AA616D81EE7ACDFC03753A5B7B121F4A401DA213D46673 Label = 665186E586A5620E1547E6C8E08D90EFCE62B5A206334169B1549F5895D9E9ED Output = 823B2B105829234D0EE6798AEF7081800D7E65 Salt = Secret = D8281359E194EE68386AFB06AEF687D7C342A270F8548B2FE2A0F9F650A997D6A4F8C9711FD28E38B9750AB33E26AB92199BD6E8BC6B0B2F0073D5C035667D9393AFB68C5580926C35FA351C2F2766B95EFEAE4FF30CBCF0F2BC0A2D279A6631FD8FF6F7C67A6E91302C19C6FCEC37AFB48A318F3C580A025299C66F38975E59A88D55DE1BFF567C370A9B16314777CB4364C4CF289D6B75 Label = 935B371FE9B959B07DA408F97387C05F72D426CEFFCE3D986722BDCEA64C334A Output = FA567347E660EE686A970903EE8B9C5C33140D36 Salt = Secret = 31B8A4962191C1D92B7385A1E1EE4D258422692F0ED3BEFC4938D07ACAC2182E3C20A14AF7DEE0F37B0A1CE515DD03BF989FDC0BFF6DDD3F7C4F13E8DCBB2AFC97E6E028A47245C816D3160529D857B671A3D4D8E3F4D0D5211D15F4B48EFD7F58D37483C8A85AC64C7CCFC1D4D3984F5BF17DF391FA83BA454EAC6278365C90D888A7E6C461FA936017D165CBDC216A08B4C58D23489F73D5CBCED06D372C23 Label = CBBB5401C2BAC52B590383CDB97DA2DF35504C83F6A58C7153567528200A2C4B Output = 4339F6C31BC7C9C346C91A3E3D5D9DDF6586DE450B Salt = Secret = E1BC374ED79B110FD320732CB8F4C8964DDCE70E5439DAF16580481B17CA39ABB4CAAF6928C02343DEA672F9F01D30F25D03DCC86D993FD5722AAFFE315D5361BAEE048AFAD606CA83942E6C8C9232BBC7F4FDA6AEB7ECBD41E785266C13C1C6926F37DE720F690556470C784995962B15C97181660B4407F91B6145F898161CC90125FA1B6A430F2EA1646F13C02BD234C587C3449A6D09E40A764D33FB870BE9CE9D657C42E77C Label = 34A0B46537817D1C53A9824A8ED4B7B9CD731630A6168FCC73D732C59501EA70 Output = CE1EF4551F6B842C30C856DB3DE75C99744A4CF08F3E Salt = Secret = DFDD03BA5257D9CC662D4A42A837DF5F3B0B493BF4FCB63366D1EA33D56FE77FA0FCF16658720A79FF2E0901A9173705FF657B87511586B27C040FB917B1DFF0F5688EB268AC8A714CF2B30FE93B7873AD92B8049C99D12DDD5FB7DAC79DFF52480E7CE1ABE2DF675A23563900E50671197A0B3A93588917BDCF4219BAEE2DBEC1210AC8582E49B6770E4BF900E99DC32000E3936ED3FF5CD60353C7224F02CF66282C934EA9DB0148C118D8E4744CDC Label = C24AA0D37B0BEE05597521F7DA24766A39EC6EF30D0A5A0A5D19552FD8D5980F Output = E5323E5F6B0AA76D8961A1612824881A11A59D92887FFE Salt = Secret = A4253CF7EA1AB5BE0EF9ECBC21048F1B28F7C35B9C1C02F2EBF14B0B54B0BE9E1BF9C4BB2F5D5788B36692C6141723521A4C69D3892D79FCF76FBC0C9C3415BED3A6425E83A091257A4E6DFD3F96EE3B3264E22BB8341617B50A5EBE6451C6AF475B17B659AD44917C161196D8DA9025083F39883DA4FAC555B75C1F94AEC913B40177CF28B620EC323BFA00747737A5F6C968CD2BE526E1BB661B0D51FAED757F10B42468D1EBF84EEC1DF08A9FE237F71DE74231054B7C Label = C4D2C9B39DF024D89B8D1BA54360D33ED388FC71E2B9DB555F33CC641E67F23D Output = 78B90D1D4185A3F2C9EC020D9758A696F06317AACB0112CF Salt = Secret = 996844A82BA03706F454282102F6CDB4BCF673789058ADC69D81AF6DC03FD50A13DA7091E8A86D99C4EC67A3F5180533F594B67C14E9FE659143BF792D74DF2CEEB1E6D77DED4590D2EBB8FC09094924BEEF654711E522288D418A3148A8CF8B8DCC8D4FF4EC6124B1FB3FD52907EDE2CA94D1FA7F42B9703F04BAC5666C8A03B2FBE417FC6DD6CEB69915C4AE2744F8F8852AA59730DC559D70559331B4C7D13D81A27964811427770B5D47930C25ABA7950506D84C03A1F571E3D2359426DC Label = 4CC17E67509F94FD13498C91E0B36E69343D3EF9CD322B1AB2204A215BC800C4 Output = 9293B109259A1A67789033ADDD1FF931CF12EDF991CD525791 Salt = Secret = 8A9EA2A98EA50284EB71A3D9C55174FA4BC6C46F435F73D4329297CE81FB91FF49845B0F19EF780A36E14BE3EB0BE373147DF7CE81D788E83520AFF374885F24D1054060CAEFEE248E1C86630A267F38911C64D8718D9FAD423D818445ABCB9DA3A7A11E1D7DA72597045CCFAD0BF4C36B91F959A55BB356AA1CC1CB7CE3EE6615DFB2E596BB450C0E742001A567DB527C88D948F9A211B2CC503FF75972552591FE13482572A0D2AE62849EFAA311B9D29DA5D1B3F7C938B508A89D9690684E270FF0DF6854BD4F Label = 0BC2ACD8C64537C4CC9D5B1E94361DEBA083E076E109EC5DE0C551E3AB2B19E3 Output = 03F9A1F03E811CEB2551F41A5E7C5E64BBA7E14C2D991E3B0377 Salt = Secret = 97660D4C91FA7E87ED5AFB28A08FC3A6E241E692EBB735B36B01E16C8D9C4D696199BF92151C279FF6224889F35C5CABB8E60056218259384BC363BED96B183A9E4BC62DB2925F0D624E616A79459073DA64B637E641E86DB278FF6C538808368D1DEBCA9D13D36F5598385E8C2EFE6DD5C96237F52053E10890FA9E1452ACFD0A2F640B87F21862306C0C0E95A4E54F90A94E907CB4D95412FED0616643FB9ECCECB8398D73595913F0AC6C10FB70A803268EB7E1FE6DA25A55E23AB95F113CC16BAFE0711E4B3C6B9DB314898D478A Label = BB4C0CA1173E06D6392340C2C22CD023C903990B51E895F5F64A5AE08317C673 Output = CB9C9A37C94A4F2B95F03D09AAA58346BD83313107E25257E8D422 Salt = Secret = 1880514D1778BF65ABF11D5DB4FF0A8BDB601C3E8AC7971291E9ACC0EC843267A6ABE7FC69AF879E664D034187F040F0FB099ADAE388560E882F35A4FAEF4049654227F9B39D536BB7746FEA4BF464364373A17DC727CB96EB93F91B552B33BD27F4CB6CACF12210D1C5697F9BC870AD56984CA2A98C84A7537914DE1C08DE873B57CD874F50E1FDB9B8FFEB1A4260A27E6E1F72632974F59390C27715F87A2E3EC7643868370706EEF2CAAA4D00118441552C2369783ECEF3B532E14EFA86B608640AEDD2FB128D5BE34647F0FFF12B79DA47557602A7B4 Label = 2D451E8719FE802E70EF148A0CE9CA39C23AB158F740D046A0AD5131FB81FE7E Output = C2066FAEBEBE65200D5AEF77A2D4664687D495D55651F4092B7D94DE Salt = Secret = 4AFC47B5F5581286BA77A2D5902B5BF24E4E4EA808E5E0B276EE679E2A18962230438A99A7E85B0B5C3D6DF9F7FE91DD710E49DC121A3F9FA7062E6D58634D963661198F26D69E59FB0B660E5AA614E10ACBC57E97D8C0F5F86E9E578477B54463CC0EAA29FFD1BEE59266A477AACE1FAB65F9C35D2CB889B695ABAC9D83110AF2732F2789DDDB70BBCF20F20C8CEEBF0B4CBF81EC5AA9E72142FDBDA20FEAC784D18D4EFB8AB98BE5A1397579FFE78848324EC6E0B46EEA4A448BA9AA9D7949E4B59D00BC2F04FB039398B2D3C4DC9353C2DD6DE556CC695FAD75ADB7B71CDB Label = 1D34412DBD37CA197318AB472A863558934146E2E9C76FB54602574032C2EFFD Output = B73959A0B39CB7EE9C49E8234A116A54B04D3D09D107124BE95770608D Salt = Secret = DA22DFC49B143BAF8F2078EFCD33CEBE4024F1C5E33291BBE20B58EDD13B9FAA779A3528B4AB5A81A190512982A3CB28BD5EA9343FB87093D7711624B50B7CDA9B928775DC5E1DA8E1104D4CFADB25703E898C05B198E8ACDD807A748C81457957BA0856D0B884783B93D7385931D548393E1C59F31F9057A518A6BDEC48AC662FB20DC1E9C040250F7B8C49DC68935CA5C6A3262C902213533DEF3FD5E4EFD6EF0C99BD376CC6E63800BB6B921B055DB2C42C0CA8B1B55F8AF93A762062DAF29541671875D7D164E8BAEA52D7292640370F042215CD484B3124C8B196EFCCEBE52348710476F23B Label = 3448E5AEBB152CB076207309114DDF8A003692108850F1159BE09BECFED3730C Output = C229533B7369D904F67C55F80FEB02DBE86A9FB9C92F645A83C109758FE2 Salt = Secret = 48A6118BCA849ECFF3D0F1BF7539E42EA7E67324F16EA72F4F4215E5B69C5B0CDCD406454298FD17F633EB97B8934A2E1A18BB77EF952574907AFBFCDCABD44605D7ADC1522AA84F6643CABD220ADFC8690414949F34DDA8B5DD07295D2931F90627838476599F35D93B487511B1E87A5B0E11ED186847397CD836CCDDF78E4C12A83062AC3C89FEE1535A46101F0BFADE483CD58452F65D711BE320B194B370ECCC92CEB355999406817F7B8D7E6DC596CA7B2685364B271137551F811E4884C4AAAC08071718C0266DAC17EC29F35B24FD5767750A44DFE39AA489E8FEF63447B16336C4CDAE61236B0B25015EA368 Label = D684668CC073238CCC713721342AF77D90D769CD657C70A9BAEEDD3F91BC9820 Output = CBCB792685E3492ACB0B6CA878DDDB26D09EE59469D67490545D3CFECF57A8 Salt = Secret = 5E81067071EF8FCC2C58D244EE8D674E056E325EF31E62EE291563BCA1921C50FA6203C3E7E4A13220A9D3AA0EEB5ADDD857FC270DD502C2FA8411F9E9992BDB953FE10CA09EE6BC88A9BEC38A325D272704E3509DD6B92365DBB7929E4D2E6EE96228686EB858AF1AD32ADF0C70288E87FCC0AC0A96341B5BDE3063AF2D5E39C84292A5E83F11B6D01223EA8F3B4ECD5EF73CD7C5AD34206AAA68B7D4DA3CB76907A9D3262CE5AF15ACB484D8E85C35D5EADAA1551EEFA11BD389DB5E22185E465A12059CA329001F9880A61E60F7A7A5F1F2CF373F244667C9B59EFBDE4D568B55492FC58B4FA4A1884EACFBD4931C0BB3684B20E87E20 Label = 78F258A38556FB7DBB4592542B8839805B59C2A4A8CD33D3DAD22348E25BC0B6 Output = 7D3CF27424BCA2615493C39B116DF3B5A64B1B6423EEBD9EDC5B606A98CE2CB0 Salt = Secret = 7CE80E8B0480CDE01FEC587FE7045A8E Label = EA0E5D80A76BB5063148CC997B76DA2D895BC3E4DFF37C48579CC4E580F1FDA3 Output = 34908371545FD6E9186A1826B87C3CD0BC763FABB0EADC54D94B97B63B8C647C78 Salt = Secret = 31959754B0F25A059CB5DC822BF2C50D4EA35A6A2C6B5195 Label = 5CF8056657ACA01CCCBEA17896F29AD012C80AE667566F3CF45553087F36C3C0 Output = A472633F4B70A3A6878383206B8AFBEEC1153AE132CACF2483FADDAD454197D1CCC9 Salt = Secret = 66529B931640F301531F4FA68EE95A97BA4DE7673C08429A7F724CADBE8727B0 Label = 9C0F11D1AB916378EBEBF5D549A7FA80874C70E9A4B2FAE3B0DFD9A714167A4E Output = 26D9804352D8ADC9793D7DA22590C33D527E553E9C1D98425E0B3A5ED7FBA2D5D57BCC Salt = Secret = 649390CF25B068F70F99651B04D0563A53DFCD8531FCD9C377A7D8E19E4E80DE61CE24D3F522EA88 Label = 94CC79364C09E9040B015EEF409F2D436DC687CA5AE4F985B52E76B58521E665 Output = BF50279F4DD1E5C96D441170826FAAC6B09F13ED6941322EB3F58C9E8091BAF3CEAADB95 Salt = Secret = C336F2BB7B74101DAB3B83584E83776B23B1EF261037B6570C5923DDE4EE96FE9FE3B650AFB6BF605371246C7089955B Label = E0625FCF16F8EBA2D7CEB98EDBC2316091C081FCFBF4CC5A1B73B1F00A94E06A Output = 81276A611131660345AC057FE211F3F8C34B8AC47AFB33098F0470DC31A0D0968A1D9E20FB Salt = Secret = 7947FE718563A28C3C5C0E24A81260AC4480FCAC25DED2F79B00F2CD94F7E682901E1109A25BB6D7FFB0DBFF0BD7591FE4643684015CAFD1 Label = D9C2A33593A0276FBDE7CD51E60C6EB3CDD455BA66BE8AC5272CF2569116C7AE Output = DC971BC7F832CE5E1916DC15DE69EBB97C52BC4B775CD7B7F5FBFBD25A695BB740958E840471 Salt = Secret = 40684285757E045319218F193FA880407F60F023E53BE2EA6722EB1109BCC28B3ABF8B06AB55651AD9D1C7E126E885DA0A1A96DBF04FA23B2D0EF0EB3EB77122 Label = D43A4E808536F27DBA7D0876C2EAFC9164DC6A85DCED61053B6B1490D03E07C1 Output = FCACE2ABAD7396B90F150016D39079E7CBA9F6A61FEE5A2A8FC3CE69F75BC64437E45AD0B94A95 Salt = Secret = 1A7AFCA7593480A14A1916CEF3BD9B3215CBC6617FB221742FF8F566838D2603A727CD7D60D08C1DBCC7A52D273409A8FE0DB16702AEB1A51C85EF8F976A43DE3888F77E68C7E532 Label = F58BEB3E3FD67949C4178254733C1304653D48B58AAF9BEC71349F1E51F097B0 Output = 56131025F86E2649D8861091E22EF057AFC5BE150BDF8D8514204CA9610E5B8D4487E04BF7AE0123 Salt = Secret = 746BF4F07582D1341BBE28BA882006C688419EA4C342D0807FA04E8C6CE79CDED9F974AEB6E94654B0671DFEFC07AA9B56437A07AB2E3E60B5A2509CC2E7DBE49D1B17D43BCF775BD5F5F34CA39AE09B Label = 5B21076FA10C4647568D160A88558F9216CF50C7AF199D40E79AFE2A2EE22911 Output = B665C0B2EBE36780EB7B8E7CCC12AA4810CB333161415E02DC8E6D7B0917B19807B848248E73B53D09 Salt = Secret = F8DC1B361A0B38EDF32D736C2FAE67E87CFCF60C928FD01A9863960844FCA106B80072383E4BCD0902A895527660FD54FAF071B49024D34D082B08723221EB61EB129FE8F30B5BB40D7398781471D485E54C8551A550216A Label = FF62638830DA30F5DA55BD14E229315CFEDDC58A8FDBAD3650104FC549B65D40 Output = C204FD93289DDAD050A8B23AA694C6A0247351FB9A2A7AF239F672244DCE17C7C47A7DAE36D44CBAF155 Salt = Secret = B5F4D4C0797A91BF25661C4BCA4FE8615D292C474EE04F08191EEE96541291722B0483AB7078DE2391AC911DEBE44A985765B3129BEC119CFCA3CD1378B68249B034B942FF3880C6080CA059356C03BB8C75C6CF7A92D1E611AA27CA0ACF70D6 Label = B5B4B3B84ACB6A8F5737F3B046B65995CDF80CB8E8E9FCDECF6ED1B05B0C9B24 Output = 652DC7C89A9714043F779ECFEAE7AC6A2D536C635879035470D8BB4DFF0F1F1E9F04BB91E0F932CB2298D0 Salt = Secret = B4D4DCD2A3D87D3A7492E34B71D2AFF108BFA7EA41F3456F3DC74CB711678E8FCED58206CB0FE4B0ACBAA77D3AD94FFE757CDCF42BF45FEE96646ACE0067628E0CA86EEB2B1242FDA43F4E2CC550ACF18F34C0BEB35DDC2EBBDE8406CD5E29B1FFA60F08159C5409 Label = 1B4A3D2F70BA9183F106C6CFC9B8BE1B229301E680E4C6F8FC2293CD850B8BDE Output = 67DADF4AB877D42497ACBAF142277917179B77D7FA8396ED9B0174BDC1A131FAE62948C7F45272658502108D Salt = Secret = FF007BC35845D9540D986613DD4B2212E6F8A058AAC3DF921ED7F0786D2D73335CB9830D9003EBB858AEB039824E26C2B6D6BAD2EDE3CFA5FCAA9AD11718D26C89FFE8CC655CC544C9675C12C00419CD673AF59AAF8B0DE7F4F556EFCF610A855FB436A1F6CD695CE037D3E8A360C962 Label = 77C13199487E0EAB5C0B3816EE1AFA35AB3C1F7C76B1CCE6E7DD74C626ABD6F7 Output = 283A52086AB37F53D11AF527A65F756BEFA1AE3325B1C70D4E8B20A6DC4FB728C6507659B827ED92477119927C Salt = Secret = 8FB75E8C14142904032B864D576EBE05A46B4B09C3140FFEF7838EC1A84FF56A81C5D21A51F6E1D7BE1F7EE91529C76AFBD57DB5D2A3B3B95865D89906EA454BB06B57DF291C168D22B863C7C434B2F3338FD8212C83F884158815C851C5E58A1FBBBBFBB8A1356F87914D9438C71D7F999D5BFEA55F843A Label = A1C0BAF846BB9594FD6127393674DC45D5FBDDC9F01F3CC60B8685EFB10AA8CD Output = 85F07BE0E1B7219A1811F861C541BBEDE82B232ACB1B5EDC3F081BBA370633E4BF6FA0BB84A3EF3290AC9A4A35AD Salt = Secret = DFC5B005B925033A8BA08208CF03EA957426314CEFEF07582FA75F082064DABF182229A6BC50DD985E41583C93B98335B7F9C3B2D6E41D3821480354539FFB7A47264DECECEFB154039B675BA6A883B09E791F401246A1F728D046979567763D5552D78BCF69206386C5ED548C4FA181B012194D8E6E1AA7754306B05D93ABBB Label = 6A15930A9A4DE23FDAD9648DF5A87DE81BF3149DBC2A4DCBFE6CD4030447619C Output = ACA6F681378DEF30EEE650639521BAD45AC266AEBB0B620BCC102BD1C793D4CF76260D00FCC233FD661D98FFED8197 Salt = Secret = 8D1C9B4D7CC7F6122CB68E43B146BD32DE9F5E09143118B29DB51705F25D6C81890132F81DF3DC53A7950D0803107306289FA88E907C2E53EC13ECA20F972B38B84C5C1847F0BCB2EE4A9B64EB48348B73256E61CE2A2CFCDB71F7DB70BFFCC101F8A7F1FEE5F9D377E81FF9EC79B7FB25C849D7B9DD125107717EC8FD93105762B1AC629FF6DF99 Label = 2D14C1C1989469A6676196410B62AF1A98D05DE226B22213FA731A814ADE2F5C Output = 623F2107F17A96F41BCC03A35A6D3E85FE7F4BC96CFFDE1398834ED97E4032439592F249B7879FAD7421A404259102C9 Salt = Secret = 3D80868D09B92E3360A74365D1661758D8136CCB75313D55A253EE253061FA13ED43C7FE288848D9CAE40E5ABAE3290EAD665B97B0F58F115D3F9017DF71BCF872F39ECD1617291520F16D4995B1E711E1D0DC5EF61F6C48F6AF9BD94DBBAF5146E05809A239385C36001CF5C59E862D9A15C1DF20324095090657C9F168DB1CF79C7BD88C055377ECDD846A79C43E94 Label = 260F626FA017BFDA963DE8CF3883C7D77745509E69833116F1385BED6D80548B Output = 0269ED42EC6AE323D7ADDB907C5A70DF3CBA5359CCC4AA3F95E6D4A512BC70CF1F5D61D619FFF863ECA97684A614EE20CE Salt = Secret = 312680EE9282726A16DF2A488B34AF9C277F7335A06ED3AEB8CAF7EB25D5D6DA038AC6B13B58E445B839838C4A526CA97D53699B8A73B54FBEBD34671F1E327F7FADAD6D00B6CA202EE06D0452E0CC8A514E9BF9655E299D9699493539D1F823F4C1D46A96F4AB0F55F475BA9191642711E576DFBBAA79F8446E8988DE8B9EEA300955DAF905FC57ADEEB45FB916EA2C7D44131556FA2001 Label = 065B341489EB84C9E249FB882713B15FB7B9E1B41A3E66B14AAC34DBD3733610 Output = C9CB31A425D2FE9FB1D7814A5C99FC913E92A8ABB79FB0C8F7A4D5DF78E2AB2DDC58597ADB2540A9F776DFFE7CE55FAC1856 [SP800-56A(HMAC(SHA-160))] Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EB401F0D18967D4B Label = 250AF78A11742E32946C29CA3050C700C730074834D86445031DD24B6385F11D Output = 41675490 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F266935F3F2653B90B034232E0EAC2D8 Label = BC8B64E391F42C924BBCD9DB7FC8E8DB70EE2DF6F27BA530430DBD4C689077C8 Output = AC965700C3 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 43CB4941CCDBEBF8239D5940C34BFF21ED848CABD0F1B485 Label = 2A28A0515B4F13A63446359CC9B424A00C11094EEF81B3405FFA5602153599CB Output = A170DA6DFF80 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 108D22FDF4F86CC8A88CC9EB7F57364FE941B91899FA632FEC37AF93355C1C3A Label = 43F20C218B9E1610467DD80032C01D4CAB0708C5D37CBA583BD6CCBCF8CDE342 Output = 30C84F5D04807E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D0D418137ED431F46A11E2CFAFF18CCAC9DC002B739CFDBF81784D29097BA2CE5F150BDD59B5629B Label = 3D5E8581F75BF9F2ACF9453E67D23F65BD960D88EECF0F91B802ADAF607563FD Output = C2E4CC136A62146D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 65E74E486B5AA76BE0EFE1BBCA8769082D79569E84EEC09F352153E7D834EF6129706A707208D5A4E1F1D889DB6110D1 Label = 1E5238E4BDD20ABDD3FFFFA5BC4AE7BBAC2F81AD929B0F98B13A3012C4D1B310 Output = D66519F7270327511C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F3384802AE3DCB837C486FFB99227583985F4F198A499FD48CD10FD038E96640A6798085289908F970194C17564ED490C3BD27DE36608B8F Label = 3CE99A68B7E9941174417B351F4DCB11811BEEEAFC9C5CBABE0CF245049CC3EF Output = 25D4645D7C39E5E520E4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D542F7C7CA10A14BFACA1DE08224C114FE93E24E6BA8666E77CAF86929982F9FCCAB3FED39D8FC6642BB24F8A6F5854FEBD4F7ED9D85757F965334E8307F3917 Label = 19A9278E80FEA775F632A1E02FAC05EF4590DC7AE67664C2BE7F1F6561984892 Output = 73495116EC110782FB66AE Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2989E93602EB752DB63303DCF565096188161660EF035D7184E2098B1CEADA1B63F7E34C268B7687EB24951D18B70601101CCC5AD299ECD0DAD79230BAE0A9B48D343CC45373E359 Label = D42D87FB7570DDD92255589F61A331FC8E4E4A5352228C346391929397B605AD Output = 155B79812FBB97843853FA79 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3A714A57D458CA1BCE05D1A48AEE9E22A1B895C6A1F25D9CCBBE3C5B9F8A0330D8843950637F94D2AF83563C0FC2B84B582672FDA22EC40C8C28141E147B73A3E43FC075D7F54D9938CD420181C2E659 Label = CB5ADE740C06028D5B729DC87E7C7907A5DD25426AE50B93AF3D2950B480C214 Output = 2DC3EDF9D7158761A640B031A6 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4FB26ABA370CDE63617BB0D24F1EB66C43AB546C8165A5C32A0161DF21A3FE4E09E64C166BC7BCAD8BF2B13341347522743BC8AE85B4D7053F5B5FABB7EF4A959DA4ECE2681E86E4EECD7329B6A97E5F6A07978E281D42BA Label = 6C67CE828B4AAEA7F88F9F74FE4F0704B3546606CFB2790957468A9EE9244470 Output = A95976F53DAA51DE72580426DC60 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F228C758811D780639746D688B79994EC2FA598567C4D4A77B74C3DC6BEB5A1BC2CACBCF85F44EF8DBCE6B067D7ABAC9B47FCD6A2A0A9E812FFAC511E5BCA2B57DF4178F2451BAE4A9FE7A04B8AE87028BE106BD69666B748D46558C24F8BD02 Label = AA9156DD772D9877E7FA962D046407ABFDB869270D9A495CB39D854345BE0915 Output = A52293371C34854A431886B4E7E6C3 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = C8F0345BBCA4B0CAE353B03ADF35F5E3BE5149C2D31968E16CF906F735CFE4B5B86098487B5F33187CA8994D5C2A7CCA40BF5C54606B6E85A7115D60ACD4CA92A3FD8D2D557D5C024FEDBC9A6EA4D16758DBFE664B6B6DCCA387E2FF9A7D67E787E4D3B9313250F5 Label = 39908FDBB5C4F752CA185E3AC5D1F09070D2AD86729466D5A216263F02348358 Output = 006BC143DC4CC4BF3AC139E2292B90F8 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 5509102FD1143EFBAFEB04C498CDA8E4B189C6EDC8C01B91B049EBFE4371A1A199B6E8BF3128DF92E178ECBE02606D5A1EEE965CB314CE7A1896DF5AB920499514723F044B714A580D817210C01108C8193076CF0034D2E143815112743C0FFFE23A5FFFE8C94E8A6CD17B6B30AE8FBB Label = A37106B5FEF6D126ED9C5577E9AE7F2D5CFD8837220065FD4C6B2CDA3BBB935C Output = B89B2246FF30FB16C30DFD8E71334D7BFB Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E415F9A9A1562BC5D849CE410499ADE5DBA1D4291F41123138C347A19CCFEBB2EE75832E68EC452975794AEE56A129BCD6D33632726DE5CA0398E95D2B15B0C28CF21C42C7290AE529B7F389CD6011DC11A8274A6B96E87DACE66B9F919CDE900646296F1BFC5EE43D12D704624587C2702244E28C621A7F Label = E3B85DA16F82F7E6C6AA05C037F46C0F445575FE37D459D15FED6A6258B9CF9B Output = F50E611E919D452945C88D7C8CA3BF81462B Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CF384FCDA1C41C696C590228344E45512F38F444F938EA604EDCBB82A49DDB4391F913E92C34986B6E25178A704F1F6F0182227FB76B3ECB09B00F36B167E1C6E3EDC43F66A748594B5EBFBAF08FDDA6C0F221E2A44700E6A9C8A7A5F8C203CD2C0D110A96AD114F39E55E95601DDDBBFAF271FE8DB2B850BC9B2D0FA9AF7501 Label = 37F3A1866C111F4B046F2E914FAF2E24BDDA1AFFBF5BD0FEC2DA8769364B2895 Output = 4439C07E992C455F346F58627C75AF86262506 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E14E018339B4EB124B6BCA4A7A0FCD06CA5D6AA7F8C9EB55F737537218D8FBDA8077511BB08760C34AC879E5365031D38CFFA5DF043B213801520DFB20D631DD638A1FD0ED8BC6FE57B56C0B33E7E80413E38F8BF13A0724C9FFC57DA71CD6EC674A6D55D72E8F6C36A15FB7E38B462DCBDC79E5DBA20B0FEF7818A210F595B41F7464E5E1F5AE05 Label = 78836033441190920DFBA6BBBA66BB4739379F290C7D2213A282C60DDE22B6EC Output = 0964C7CF2CE6B6BF4BA508FDC0BB7D87979680E1 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2FB3DC9EB7DB0383F5837F2D897CA4815B287545841B72F7791A68D4F4A8B2B11ECCF3D613DC9B4D84F3A5BFF161EA32869D92541BBD925D850DD980A9DE050912242C81F6870D43F78599CA55E6818769565DCCF6BAB4C7FFB0DBFF8BA121066CE7689D77B91AEE6E867E2C12EB84B8F12CD55886831B20161DB6D851B377850EC189D9AEA68FFCA7E4C8ADF0828DF0 Label = 5964B1D2C15B48262BEE5AB2EF54F2E24A85483ABA9512CC0A8721B8330F5638 Output = 32D248F31C84776ABBB6095349BA87713368486E37 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7A770501AD1B0EE284499DCE53DFA83F676C9652AB735E23086B821FEAACDA479996AC2DA41D2FCB069997C836916E976178161CAE57987A24B46D0EA3A0F4F9E72B74E0C9995AA526435DF1BA8FA847CD734136FFE26B3CDE6F35A936C13F43226A66D92A9CBB661349D5ABA507754D91A986824A372E2AFA87327A7E4202C91A81E4283A0F34A626A1FE83A3506BB04399C8510B3FBDD2 Label = ABF71F104307E23134D56667FE0F9FAB3BD20D745A30B8BE5A32A86A30A7039B Output = E60D2502C3C65EBE426E2A83423B63EDCCF048CEB2D2 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7B0BCB76B6F0412076EBE36E8834B199E051CBEB779B7F2BBF8959A5F7FCD330C82EDAB4DC4CE13594CC30C64F15C3AA0A2AA3D35A1169BDBCB753EF3A18AC13DC7F91DCA89BC5888875359E365FFED64867B5C74E93B71113C024D08CF215EEDEAC5D64600A84E398A5197BA6BBF3587B7C762F93A6654D5207774B90DABECD935D8D335922A6243F965A2AC1FD5E1CE770EA3CF2D5DC480FBCFE78BCA5CCB6 Label = 05E7AC1B3F00CE8ED433639506AB9958FF0718071B39713EBD963B118059514C Output = 6E28F353BE11F93F42E78792DAC2201D00CEFE497C0224 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AC3C81340F65D45534B9BAB1F135530C6B021E78FAD668F7CF649812E1F2C66A1C2243A4FE937C4C54B1C8059C42952F28852393583FBB2BABDBC13BF24438F4A89B8F09B2EB6567316ED89E8250D5780F96907B72921A6194BDEEA4017CD59DC46D93F808D4C1C8F21F507E19624AD56EF9EB1EEA4306678D62A41D1DAD735FDA6F614E071C57D0311846DB3C415482B82064D35BA25E66AE28952917E97728B506499BAF8F5611 Label = 8705FB6A2CB5120329B4840C649769F23D1CD72D0B9B4150B9CE7BA7F11BFE53 Output = B714D0EE6FE9D1468C80B7B92A06422253494D5B71C3A438 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4F11973C96C736C05B70E163B2797E59471B8272804E9D4E4678BA8ECEAD24FB43B3651B2480B8AF4F97865B18B2301292841975E5693F31367774CC8B958FE7BB7C9AFCCB2922EBA105682AE812973B961EAD4E6C9A8267A4A237D0296B721ACBAE55CED65761573B7462246567F7737EC3DA0574CC01773DF4E72B99BD9E31B3969DB5630203D4385E077425AF959E5434B6D8EC5B74F8E1E71684E1CA12A074CB6413C26E35955093688A724FE18B Label = 66629509C63BE7542D3FA3C6F168F0A5241881E4823278E4AC3AA354BC8820EC Output = 878712154FE8703A5D194856FEA202EFA7BD1B143D65DFFA38 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6FAFEBFC260F1FC60EF0FE680D4D412DAF6219A1D888C4D767220A42AC1091BB8F257155586B937FD6DE0C2935A45926A9FE0FEAD979C1D90D767AE901321A37645DF860DAEF394AB52985A78126B0667536B2B08262EA0490F5F40735A1F2331BFA4D487B49D7ED7CD6BA1FA663667E50DA4273F2E88BB42FA8B950F3596ECCE378E6AF72FD095120DEA3DD0050D962A03F3EF2F7B1138EAF16A2B4CA8D4DC7A20EC6E613191FF322D309C7F830DAA05EDC0723A1434939 Label = F178BAC0C5222A8F364829C3578BB8C72960488F0B31381E4C3D8D87D9B7FDDF Output = 2AF888E15FF3CB1DA592795F5AFE66721E862A9AA5C9BAA1707C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A1F503CBC91020A93A026564F0BC3DEE67FC2189CFA495EF662519867007BEFA9A4D978214EB3A8461015A5461E71415AB9BFC103D8E3AF0F3B6AFE995DDB9C0D18F975839A1D19D9136012442B76A9D6A595AA8DC24E555BBCC485AC03EC445EF577AD64880560F5C807F3C706DBF937C8BF0E0695F8725AA86E2CDF96FB7070D85AE47A1D40103CC855C1C55E58EA0F1B9711E51AF7764EA16056129157CB97FEF2402085AA1D591D6D136C0F8AF90234854ABE8C443F06A93109C4A79BA1F Label = 5E783EBDAD9012D0F9108F109D04CA211B4A2673615D5CAA4E59F6186793D446 Output = D6ED5AED9A71159145F9AB2029BA8B5F28D7688A8DD47D4F15A0A0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EECAFD527808BFE01A4BA95BD7F682C22A46E48C1E3EF2B375B95D929E0922ABC800746DB29970487C11B725A4316A8D1F3B27B9278FE61C44A207664C9EA15097F8F7970270CF65CBA13534008D9063F382AD5F2C8D5DC49F74BA5CBBB49965FF5C8CB65982601D0F17AE2B46DE76371A1A395B9FC526C5490145A9E4D25DC270F2AF4850A1F21D8A7A43E7DB59EE20395FC03B7754BE234AD8FC839F94BB68F777EB705618329FA5BFE2D329406E3243D0EF164050383F4A3B3B732AB9323CE568169EE6F47705 Label = 3ADD448192B82A6D759CD6BF56F80B9C11C442F9328CF3D9DB2C0A6F8B533A19 Output = 191745D2348EEC6A4FBDBB3F4474591D6904F5441338342181C01CA0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2CDCAD2C55A88384BF8858726019C4BDBAC1D6A989A70C626B395CC323C972ECB562B5492BD5F83B0A7F023E22D01C494CBE1604F84B0353109B08BDC3DF5C1BA27F8D7DDFF240992069934808DBDE4E59F0888F9BE5D04F27A74998EA9793C0F4FBF679A6CBF92C8D27C85E337A857C090626FB41EC26C0B3F3D0B396BFC93FA18BBF57A57900A4A2D53F18A60D5B89BEB09F22CDA7C7A808B2AACC4751B8AD9CD58794E719FE23444941DA08565B9E31BACDC188FF4523D7B8EBFD13CF1153EB0BC12290E340FA2AA955050AD7D9C8 Label = 923C0D57BD59E19BEFAC04EA77BE33F55C7CC2270FDD1BB468EF8A64A66172AA Output = F16C13D5729FB72E7821A0F7B8AD2013B4B81D67C98170EC6B3FF2AE40 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = DB89C784A184307153AE30873EC4467220C8A2AEFAFB1E9151E8575A1429B4D27ACCBDCD7076E7A9FD74FB8F7A0037E8496A6F0879BAC25D4D38947401866DC6FDA27B209D074A86F90275FD5BAC9FB035D5BCB69F612615898FF01EBC8D168BACD047B11471F7C25BE4F873CD7F9856B904D5FDD28284ED2FCCD6280E0FA3B77923D86888010CADCBB3D96E2B7D9CE36546A5C6018E5DA946E668DA154E90FB8374374DFE0B0042E12B491CAA4BE26FAB14E6D09B23FE55E5EC58592BA9106B18D4BD057EE3935D0001212401BE17142803D8B9ECFB9625 Label = 3D95945E40F1618BA461938E4FE283F701543F1A6EF2604285E1815B42BDA9AE Output = 85663AEFC417A2F8CED9F31130A26622967A703FD555015C95100FE527CD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 100803B79238B3A54507FAEAF55CCC19A284DC32F086741485407CCE2C2CD68A3652C764A14932B48E0C1192F71758627B4485E032E787B40D78A6C68B327BDF4BDB0C5B1E0BBD9BB9F43EB457DCB96F73522B22AE171C602FF96CECDDA5E551D4DCA952F519CE5E52EC35A9D39001C0E47CDE8C26A4D2CFE0EED32C96FD950650DE9E1846D6C20B2F1E310EB9BE4C1797C098650DD63E16D8B267FF6396126F056EFCCF3B89A00B7D98159B708B329F6E23906EFC46184FA85B3E116D4F01470B1EFDF8655CFA1A01B2F32F394738C78A14152C6D7E3830CC958D80544D1538 Label = 47D6BDA1B59C8BACE9934E9C29376A783FD1D98066F5B26DBF988D2370AA398D Output = 8E3A1FC6860AE3073FB90554903340EE4BB6B13F8951DA40CB034CB7800161 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 86E1724BD562925C7FB873E8D1C743C6D1737E7EC6AF4F83BEB1464B9F5A7C890B2BE5108A26BC6199CB04D6DCA6866EB8EC07277991A853E23D3CCF86B37EBB73022CFFC0F23FE41AE0BBBAC8CD495BFAC229D81F31C6948BE7513EA960ACF3A682C674A8BF72EAC697EDD443D29E5070D9630806AAA43533CF0B1E9E9ED04C956878F86A32A0431BB45B27637BD52435A39CD4698A6DFF135CA59E6FE30E7D43C8560351D73F53F14177BAF225B2432A124E0A1A3FF3EBB0F6792C6D087F6EDE49F70E153D4E5EF5699C95EA2AF0ADE53CCEAA2B80F8732972356E5ACF120B06D165EE366E1F3E Label = 9D937F7DBFF518039D961FDD783BCAF9BA14AFC06FBC956D2DA1AF1C4CECC9E9 Output = DE1A2DB0247782B248ED038BC58705D3628AF5A2F47F779955ABFF9BB83A2636 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = BF8F0869BE3030A86529B4A467C6653A73580E94CF282756CE0E9405315CE8C3 Output = 02BFBBF4DEFCC0F5B2754FEC6968D1F30E673BF86B58016497E2671AD7694D77DC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A1A4826116C026D6 Label = C8F86B92BBD5C8FCA75C90F957BA2683A5F51F55182AACFE4BEA52C1F87C2FC1 Output = BCFE5929BD6DB1CC886982BFE27AE36018C2135B7D9DCDD62AB03F3E14B379543254 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7F188E15B44278E58AA96F313391E7A0 Label = 490A33137D6649933FD767CBF63B36C5281E74AD459A999DA90858968827EA2A Output = 9A1B2FAFE49E7DB46087C66E440F72C9B824F5EFE3940F6846336A2BB7B84167B93F6C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 99C0B0D2FC4691586CBCA53C0FB812F74A553F5EC29157C8 Label = 3447FBFE246A9FD57E715172AC406FC236CBB64A343CBF8AEB898EA70EAA6F16 Output = 513CB609532EFA4D28FC4B7DEBD55FA4F290C7852241C0D8BB196D28F59E7135B7A081CE Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 0BAE8D62FDA61766337FA15501AC7855A655EBEDCF37E96898D89AEBC377534B Label = 5B194D7B87AC8D5248468981328B798620684ACD78F4973F15BD017CBDB63AE1 Output = 80B8B4C0A1117E8E2E3C5B94E105646B451B55BCFA4B4A5D52D57423F9209671999613E7F4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 07A673D3214A1D83D96935CD7515890D95647396DFEA9D2F713421EB3ECDC262EA74385492BA113D Label = FFF54CAE6A6BF266EDFBD888E08EBA52389DAC36CEA81F060E3CDC14401145CB Output = 883866EEA0E3B21A41219FC9A6D83AA8E2D3DB72B1855C4C1FD8848C0B05BEC91F3A76E64351 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = BD212E869687B9E784F2591D96CE3F6C86A01473164460C86DF30BC373A79AEE9D6A1B2B71E5AA0398BFA35E31146780 Label = 84A094AC3ED5170FC0CE95F1341F8E34402467F402F656C616C26CA2A32A2FD7 Output = ACE1DEDB6BB233649143547C52643302BCE47EBD0B239497340FE87749B537FE3D64D3E6547BEA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D30F2A7FB24BD35D234058B1FD66A93EA2BD900BC9EB09CA2F8AA9BCD3C803BC06BD3F97B4A34AFBCD12E7E37DACB71C9E78ACC02D887629 Label = AB6B86BB4D304D42968DCF1BC666951114C1234B5C55BA9CC91C7BD562830229 Output = 0A40B0E0147A500786272A637F4B4F6CFD294B8D93DE2E497CF2D417DAF71870433A0DACD3D1A9C2 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 37C9C0306D9B284654860DE0B393FC51E4D52F749FD2FBD7F186D04BC8733ACBEC21D751199DE8ED3C08A132D3CA4A92915D087EA3C904F364E051D4FDA1B72F Label = 0CC082C868802D901119B70D7D98D1C31AB27AE96D8FB9B0D10C533440253ED7 Output = 672B588D83F72ADC26482A499B0DCD0D2C5EE460192B43E8184A8B18AD3A6CA51FE6A273795B87C4E4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 8854696013283CA3760F9128165DBDE28372285E8F506E327AE2846BFFFC3151AE1EFF3751A1CA9E7E4F214957973FF72A8FCD4DE419331329ADE369F747E8102C9F5E29DD5AE31E Label = B215B4B98FBD06208D30E428032DDAD3DB5604CA6BA3E27F04C2B3CC54D8F2F7 Output = 48D3D9B290A5BE88D5FE8FA617C3D8045981ADD6A456936B51F74ED9548F376A46C5CAF8062C6C94D781 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 18E1AECC10A7E7082C964E20DED7D667C04CA1AC7EC0000826769F96C252613B206906F36C53A01CF03419F42F1E1CF98112808E121930595687706B92C0A11920DEA79F5B59F2FB60AA24CBEA85D3D4 Label = CFEAABD8E9D673AD0EA6A144029E14E0CBD8E2373B00FB816F8E1F282981E099 Output = 8C3F7E590DA892242F9285E568FC55C852004A9404A7963D5F161DC259E6B5BB9B6C7B994947A281F194D0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D3AFF276DCA07C525CED5CA87A7B3D4227990C9378BCB1A7E0C4432439FD54E184C20B0352511A0A0306FE96630EB7E89A0BB9D6D196955C82B0D2630D181AB7E150B0BD7F31DDAA572745F1B89E15997E99A426FC995A96 Label = 54D1DA94FAA191D7D9F0FC9CD66FB6DC86E87FE41E39C35689374202200BEFF1 Output = 9A5CC2DA9790F7B1B758BBDCE5BD6B0ED98AEA962C58FCA47A0CCA27FEDDD613217495EB6791B2F5D35F925F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 451122C6A4679810716102636EC9DE5B4F25695DA5B4B29D1E90757F926449155C156C2AEE256175897AB533D51368FE2D913D258A7219F14C0FFF362FA17F6878CB8F23A8D31051025FAAC3A08CF3649E6F9FC6CA795534A827DB95B3E0011F Label = EDA87C7EA65B76CB69E65A8873C24A7F85B13BDBDF40737815D00D974BDC9017 Output = 76514FD987502E573C6049528FA86597BA93ABA98F6BDF8A44B6C38B1DA43A78E244F0F06A0F8F9659D1B2C761 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4FBB0436C4AE6A9537EF33DFF4423228371DC5EB42F074305A04146B692B6652CE955680A8D5D4F54A140059E7913121D2617CDDCD6B7C8AEC21D90C869D934376339F3381AD36AE15BE0EB5074D534F9C57A707EF87A8A0A56ADF3FFFD98A13EA1D2D784417A7FA Label = D8B20FAA24E80E0D118C97A5F69F491852FB910F9569B6DCE4D4A4B3926DAFC1 Output = DF1B80D85ABB2A64194E55803A848ABAD1DDEFC99C7BB15DA5F40C6D85F0804E56B5ACEFF4A58311F8AE31EC2FAE Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A1E288ADA724ABAD2865EBF2DEEADEDAD2208614C58B55E97D8D980AF708865354C8CA04C1764137073FE37C68BE609FF0B40C2CE43D0B73BE3EC692A2F55948A7189C61D86DF4F4F3B69ACF2F37921CBA09AD702F7467F60F69ADFD1766BC399E0F2170BF413AE897ACA5FD38CFC137 Label = 1E93B6994C3C3B91722532943DC3B008FB2BEAF37BE45780FC02FB59EF7C69EE Output = B68D6E6B8B03B55658C19004DE40A962B0735FA170B642223121696D49968BDA19DC523D7AAC94FA3E54927ADB7B2D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 83CC984C98B02D10E6B9109D7AA089C2600467D77573E66A4A7C963EA1D8861B9B6CBD955E7DD439711038B99294BFCE58CEB12CB03E12DEF22617A7C8F6E7A70432F13CD2EDAC2A3E85F56C44C7973271383F8492DC45FE583374EA4A78FA75FD8D4CB0221C7317DEA7FA6FDCE768A4DD49E4C12D2674C7 Label = B540C8E9ADA3E588C33D3185191F826EDD96F3F1E583AA39C575D688F5EAB60A Output = 8B08AF10D3AAD9117D2C2687C9844EB55968B4E63374F67FF6F7FB98DB64175F250156B03C9E38E32FCBCEF451F5DBDA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AD22C04E5433CFCA435E51CF49B49CE02CB5D1B119352D3F41B64A129B0BC73704D2983B94DA92B54D6D2881E0F84DEDA056CD45C9F381DE40BABD7BEBA01DBD0C4B585BA88D128445946865BCAC335EEBB5F15EA1A05C1698196338AF489156F76E1C54FB3035FF073DEFE6C5785E261423D86758F5EDC8F0CA466E994E2689 Label = D1E5A14F5E95F408CDAD54DDD48336F6B1BDFA38E118CCF77D0EC9CEEAC68FF9 Output = 11FC6A35D53FDA808BFB30CFCC1F809B924039C6311F9C7162DB084A436210465DC5D410DFF55D18A52D65018DF46C1CEB Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 68DF88B87221B19AD7447200098BD5765C82D322FF906E4F21D4D35936428AE40F73E561F118E07448C5E41F1972847048F4D523DA1C830DA912F37C8E277BE740F223A7D56D83E60DAF97FA73FDABB07A3CB540097D3759A5414D1AC88294E8578A5393602248D42B72B7FF674823990B12001CA4E3F70DB89C1DF468670F051E08BAD31EBCE1CC Label = 87DFAAB36AA6482FA98EF9B1B6D8933FE5C690D128DFF2AC3BB949B133BD54B5 Output = 5F167A5DF56C1FFB63351075A6CAFF23926599FB2D29ED0C90C50F16455E23D9C48CE6C7DE9BA2ACE54D807D49AE0DDA5E53 Salt = Secret = 7FC2A2CBC7B6BFE8FEB55F1B10CF09D47CD03223F2C1CEAC4B85E59E915FD2FF364654470785FBDE Label = B72373D09DED6B30753E2508FDA3C2F66EEBD493A90B81548A2F631F76E45F82 Output = 637ACC176A019A209C95B6E07CD7CD561A601303C90DC572015363F2DF1C992F Salt = 00000000000000000000000000000000 Secret = 7FC2A2CBC7B6BFE8FEB55F1B10CF09D47CD03223F2C1CEAC4B85E59E915FD2FF364654470785FBDE Label = B72373D09DED6B30753E2508FDA3C2F66EEBD493A90B81548A2F631F76E45F82 Output = 637ACC176A019A209C95B6E07CD7CD561A601303C90DC572015363F2DF1C992F Salt = Secret = 7FC2A2CBC7B6BFE8FEB55F1B10CF09D47CD03223F2C1CEAC4B85E59E915FD2FF364654470785FBDE Label = B72373D09DED6B30753E2508FDA3C2F66EEBD493A90B81548A2F631F76E45F82 Output = 637ACC176A019A209C95B6E07CD7CD561A601303C90DC572015363F2DF1C992F [SP800-56A(HMAC(SHA-224))] Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A475F012C4B20DF12D07A4E5296137F1FB10FEB2DFE8CFCFD21C756F33ADFD4912168EEAD642FC5DA762448FE9AC52855B3CF81B327BA85A5ACBB76B80BA4518B87536F6493E8E693DDA86373E3943C85F9DD736252B0E636AF3DD36F8B9DF920C7CB2CCAFBA5D6F36164998E65B2BA677A168F4E41EBE46E13C3D38473409B6C6A6805AC645295F513798ADCE6F7224 Label = 6201CAB3D785F12657508A0A07D63AB36FBF9F8354529A58F003AE9C0DF8F733 Output = 03BE073D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6845C1F48A444E18C550FFA9F802B73B3083F6ECDCB06ACA219208B4C3C0D6B13C7CABCA1B949CCB899C85DF740CBD6E7D8CB22825C192F33BF2D01BB2CCEDD1F3945FF9B58D8051CDAEA3FE1751818E8A89FE4B657152D31176AA46B799FC2D10485562FBE84C48E9B24137C9C817B85D94CF7FD296AE49939D96B3922B30DB5E6671DCC014FC506D1FA20AD90EB67E09869CE8443790C4 Label = FBAA174B964E46531999B77AE7A5FAEBFC8A025C99E68E555324573D5A4076CA Output = 63E8F3F1CF Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 599075D3B2C1EF4FA09B56254E79131BD84A09549F3D7218427F6447B15C19A5BB4B572D0881D64A37D0924A2EBF0D92C1DDAE40C392EC572C45D72167BB62C7E7E918A2DC4BD60730ABA065BF5097B421CFD14F05CAED1DF0FD9CF59385E481EB0711878B814759C05B4091D56BE79EFD47C55261C19E6DDCC0DA9385B6EBEE2167B41F2C78A20812112B2246E98323FAA0E297AF34C0A862364D77C481934F Label = 7D7D9A00830916E5A9BFC7105138B25F740E2380960934BEC15131BCF0065DCD Output = 2FCB20CE2FB3 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7DEDF2571445DF936A539A407F673CD6D4BA87A05B91C25AD8B34462C33B95B82331E793BD454CF9E2EF2197919836586DB744EA108501280A0089395F969BB06B827414E132BC9943F104CEEDEEDADD8E55306CA1A9F0D2F82DAA360D2C7B31DEF7B18CF7E01ED2338AB458ECEC994572C9DF44A679464C8B8DDD160D9598101953DCEF437B99DC47CA89DF6462D9EAC6F6987E3F1C9F52C413CAF19572D6D10AA75AD34800938B Label = B9324E75835405414413540D9492B5F5A0D104E4715C64CE4534429C96CBC46F Output = EAB9A01933A55E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = DCBAB3ED9B8FE0DFB2716F62A0DDF7F9242925EAF0A85219C84A2BA5D96DFEE3D7BB4B2CCBB52F13626D4B6ED773DAE44A8FE4216D44DC32286DB2B0BBDDE2B004342BEE79F9BD7612EFE66D47E55AA06568D0E95D239D962F38FC0BD105F32694707F185D4618B069DD1B93CAAAC1B55CCADC909664BF3007E9A2E156213C6520C800F9F95A6733EB9D9B689C530E3E0DECAE068C68527CD7266A9E75B7B68D6EF35D46A75238090802E08D1E9FB3D7 Label = 42B769F0DB6967C6AD73ADF797A3044E06EAD05D222A3146E3D2AF079DCB0102 Output = 42948125573C6B0F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A65CA3E5D1DDC798FA9A49FA149E4F1BCE8BDCEF5FCEFD97F4BDBA31A8CDB75B95154832B152857AFD8EE8BE46A19F2FA14E20EC8EE25CA40D9B9FF95470990A15838FFDCFBEC9AB0388F40EBC32E2D93E31F9211225BAA481DCD6699750A669F21E1D374A728645184B12F607B681C5AC47F4451145CC2EBBAA929A4D32AFD4EEE5E077710FA60CEFAA7C31553056FF28449E7025EBBECF6457EAC322FBE1CC60A5FD68D3068C8C8E038D976B58FA4359A2C2C5415C4EFF Label = 56AA36FEBDF60EBEC38E581829AFCC26B9DCEA1F74680F152510B071209B8242 Output = 11B8D3D72018186C36 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E2FEE08112CCC087CB1CC6B101826E1435673B0A2B9F0F948EC4ADCE36AA879CAFF6F820BBE36B7EE1CF7D2A52FDCDC9A603EC5C21D7D3F22C42E5185383222C0F69CF99A0D42F1A278F19D2990DCF45D3873DDC46E410AF2DD1CDDB2C6205A1261C63E625AAB2321B596BAD5E62A2A44BB1E4B9B4AB7722125D27BB8C3B006538FCC88D40CA4F59868993DF3C5AE65098412B43ED542E324BE1EBED98E7630000650936B0E3A5C53C1C044B57FD6DEDF8C43C4377A3740A5C2F286B2DADDD88 Label = 652361EC5A91886879670E063C99AD87F19F8138643346DAAC62AE15F9A20ACE Output = 7D07489606FAACC304B7 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 0DB70CFBA994170FF884142E61821CA599B8128E90B4D867099E1A25117000FF4D256514FA5F927FEC387A526C823761D543B3BC9A10B69A2BC74FCFDC7E1AFE6469C54FCD99C3580A932632C4FF856CABBF3914FFEB00C2C38371B6F1659F8E67ABD60BD83A6B0A475FC0117A7AB83D64FB9FACE3CFF37AB4E7C8E64B6C16CB584CC3F3E6B6F7C6DF28D2DAE477D13540893A5940D0D47696F586D0B7620F511D754BC8B3664B070177FC8F8F7D4C6F134BF6556D41D5CD7B0B60C9B21A92B028BC3B182BC05C03 Label = 1B50D614D6F7C7543F1F6D2195059B61E0F8CD94D39B147617151CA80AA031BC Output = 61D50C108C32BFC6F29EF4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 319B81EB2C9028ED1999AE9D5EB627615BDBAD9C16B9CE72ADD8ED922B19A2C02C36C195BB4E1754EB1361BBAA277642A41BAEFA85C904F4663D268F51E970F3B312A64687DAA5CB7529936ADA493C8F9AFB7AA7A5282AC4F519A7F92708A411911D75517D3918040B9D98C2E544D5AF7E7FDB1BDC92C70C757FE7C4E8BC8D4C6C2CBFF40C36E3805F6B6FB317A6F176F630F0862F7A1FE50502140537E26F7383FA569C8DEC2392B74CB2706A03CDAA3C1037F2EB553CF76E6555619CE4A42E791CBED095834F21BC71BDEE13A0F389 Label = A382B9B0F37DE981908BBAF63645B76FB9DF34222526CE1B9F8552C36548A0AE Output = 4A261C56D74744D76F8DC22F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 48AEB4A06CE704812B935D32ECC269B1CFB0D9586914871D0BD9DEDB10EC3A25A252C28E91FA8AC17A194278AE3E1705AD92A54817F7F21DEE90E104EB84DCE738213DB897C51B4E64C4815AFC755BD0F9EC28BAD0FB8CF74056E054BE3521AE04D71E86303EBA97C50074317902AF0354996D7AB4716BC76087EE458396D8DA8C2FA1A3F4B489498F00A4DEAE2CA40646F3631087D4A451B60C75FAA4C3320B9392444E459C07025B887BA71809BE4F88E678F739DB6174BE80BE51BB4868685AB406C00DD4BC09E74FFA2EE6D5B476CD4AEDB86597DB5D Label = 5F1ADBE36D8783B51CA6BCF88D0994C796EE1D58E6B361A63274C5E11C85327E Output = D7ED0DD5D93E4CE2693759882A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7320798D150048C73245FF71B9731FD71FB9146D1E84AC3BAF01433B789895EA749CA7D7D24F17ADAC5D497D547294FA6A4AF2BFC9724DB8FE3CD207315AC25E6BB5484B915F907585DF6A2D1DB27A72ECEE9855B8FD1905B50AC0793ED46AD5B945B77562536DE089B1DC54929010894FAE557990B4E2AEB2F6A15FD4A8788B91B642792260C9230C7D3EA33A3BBE384EF6967CD884551BDC058749FB979C3D6769E7BCE0E130E89815F684D6126357CA55E69B40F2FF4A838870D4C6B6A258D11B21EBA3F074359A05A2D9C0D1FD7AC537C30D1BF365E1442AB046E726ED0D Label = B2FD1F80640AE69D375986936B7F8724E4095AFA5772FDA6BA78E1DC98D10D83 Output = AA14549F26DF6B548474F9E89213 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 208AB6A779D31E6C63A11FD54A6949D7554925E3A58A548463DDEEF1D500735366533AA752A3B1B0728A6D690DF96938C5126F21D7C88E64E2E2011743662FC2D55F391EE2FA50C01858C6EAC7181BA43ABB4259CD2DA048279525698D467C0C169CB77470C2CB7BCF67C420E75B0894577D67F57AC8AF31E40A1CAC9ABFF7F6EC49C1D0295393F10D0EE9DDDFFA22A7026D92FC1A214855357E3C1D3898CDB7F3DB56ADEF0F142E26BE6B0B09F5B4BE74C4826D4E27D69A071F7A66484C92316BE8E4009A8AE4E05C2953168F67F54BDB8BFA8F66C4CBF772C7E8FA82D56B87B3FB431171DCCD61 Label = 83C8FA6E48DC6351BD756229BE810421B4D397E30CCAEEF95C34BEFB8FB745D4 Output = 4F2F09292ECD15DF895031DF0F409E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = A8E06A6B1BB5E5E8C4B2845632071F68B78B1CC71F1694864047F041268DBD6D Output = 6651F74944BC9606791DA6AA55BF9374 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A347FB1CE765A204 Label = 7CA9F0ABC0D7F44D1A67C36BF318253B01F3B0B4983E0218FCEE0CB127295E4F Output = 8835506A93A12CC129E94DD3EFA75EFBE0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D63300522CD3E62BF7CF95A4C333991C Label = 47D0B693336917CA1F2095AD0DE123768EC8E69F546BD6543A4D2DA9D58013EB Output = 7EBAFC5B4A2F4CE48E46EF3EBD303FEFC25A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 0B7DDD7970C7F1EC63DE190BF6A045967E75610752F6A542 Label = BAB3B4659719D752404D5D9F96713046841C4774F976106CC91EABBDC67F3AF5 Output = 0C2ECF388FEEFAB34D47D280F9EA51B7775489 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 8B5E6A8BE8449740458B7E188D173E4A0E8EA32BC8D1FAC3F13E83650C43E6EE Label = 1F782AC1828235D38535A846502FDD224E90F7E6FEC99ADD91C2972350CC72BF Output = 4FAFEDAE275C4DA8DE5A98F39FA1CE1D5C5D6C28 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2E50F2540BD16B0C8F0AECCD1970B63CE81F9EE809F2A788537E437E4DC1B158236D87E40790BA09 Label = A850BC9A338ABEEBCE941504D733DB5263B2279243936D588BA859E1526D76E2 Output = 4F7A6D36FF3EA39AA0AE08121F49C502395919DEC5 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 9CD487E4F802B280BA50EDAEB5B2FA92C8F3664451D5004E44FC1218B8B72E18877E01D97EEC2C7B2E71FA834F48A202 Label = 625BC7339D8816B0BA84B18C2C4BAFD0258812C6211421C7ED721CBCBDF6F906 Output = 268083A65C1AA708EDEBED75A850EA37E5673A5CEE30 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 669672BDCBBB69FEF6A2A2579BADD64283E2E4A5A9C27A3DC1CE7848810FA1A09DF16FD3DE2EA2B5CBA56E92133AC709EF771AB3B07E2C01 Label = 36103B9A6472B9E9CF8337CA49DB3C14925DC5EA4E6C14E79A8C7A97E69FE953 Output = 7EE4E30607BAB9D58DAA484134A6D3626BA0E1D582EDE8 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AF7F7C3B573BE1E24137A761A9F814FD80313085337F57BEF5622F04EC30EFF30D6AFA29EA004696828CCC8BF9585BE90BD377D84960531C81E107023CEFEC92 Label = 96499E3444D4CE877B735FCE848D1C035613449ADFC89B877DC853D8A4F4628D Output = 2401BC2405C0F40F46CB0A750F657CEB2B7FBEB115341534 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D5FDE7CF8B0B29617939D06EEC09D9F531179EB356C4B04DECF89C24A86C7ACFF205A621EA3BCB045B438DB7714E6236D496318EF2D3337553D0385A6F4FC7B1662544D17E80B612 Label = D3F61D23ABFE899EC3C690F3B74511CA88C474197BD1F1F21E46AF589A06FBD9 Output = C69B64887ABB734CB13CE093FE18E5EC486E8C22B2824B1FBD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7A9650B85B71C550BFA3BD7D8F9EB4D26DF2395DD28AB2581FD41CDFFFED3EB451318D762AF93BB773ECFD38009B0A7B04783CF005775AA35BB4A79860421C9A4AE90DC176822EF28FA1E1AFBC471271 Label = 824A76C0D30C423ECE55C68B2328D5373E8F5BDC2688CC70F646DD3D3E040B7A Output = 620637A817F6A92F9928F473A486B7E59623F44D5DFCC557584F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4AFDEDC9769143CF5EC2934FB3993116EAB26B12517BC0BD09EFDB91DF8AC944CB5B94904DF9E190C94DB752291C1048A64A016B549CA96E53060F50F8E99F30755FC722B7714011554605C538CD00E4FF6B4154B358F35D Label = 840C044AF37E969C16E7D009336387008AB3D0F9A2C4D244E6F13957FDCDBB66 Output = FD1AA1D21FFA056C3AC429C88142F7337F6789FFEC551E88584EF6 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 468DC43BC0A134C69A0714EEF52F403ABB4972EF6C08A1E8D494F06CD12B3D55CEFCCBCA6C2AEAD7D52286D2EB9E416C1BB172114272CF32A8DD5419F33F78D8DDDF5EB6AF8A999AB74513503E0B7800DFED6212A5C791289910A74540457814 Label = 0010A1C18BFEB263B27B33DEFE551FC3B908F238E9CB5403BF75F6F24F2A6C30 Output = A2E99A4B3078AC829E54B8A1CE67CCB83BCDB35FAC4E4B9E67557775 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2F76FB60A57A8C945371F8DEB79FCD706CB5F72BAB3CA5ACD71794FF8826604A5C634EBC1217913AF911A4AA5560DBC691AA6E2ADED5A13042C7644F1695CBAA3B40207ABCF3245F9299B7EFCDC9EAA8ADBB569465D06C1F043D82864AF068DFD7C912E122570CAF Label = 5C4975222E85E1910940638736AA9513770819A730132AF34397FEDD07483231 Output = D7450D28CDCF0D6D27C517DB9345BF62E338987790A178552B4345CE65 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CF2830290528EF69C4005FA26CE3A5B4409D2E93D5C264FB2FF00DCA39350A482373EB593124CB8D6453179E67F4471B6C414BD559D0EA0FDEBF75C0A78CB6A3C90D779BFB062C0BB97A686E040C8C7035EAD9E2EB15C2115AFF26216F8CE8F191989298290891D933F56170E1647639 Label = FEE072FBC3615D989D2A4C39D08F283BD32CB0BB01241A896681554EF31E735F Output = DF27CF5303F133B96887FEB8A0F140ED87917590B26C0208C3A7D4F9A955 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 75C8AFBD82D5811A5605B1D8749210EE335CD1D4C382FD11B365EA6F1E4D1045208A52675656BBE2144BF33158D69B3B38D5A318C94B2A0FB6165DF204B391A3B84AA82F4299820CF1FA6363A157E0D44A0E9A6121A559270B59E6614B68F54925ECD47E7531A12D5FD4928DC7B8D7C94E182DBFDB29D132 Label = 88C0887E2041A8E845A65D5A698879FC43748CFDB636425641502ED264F5824D Output = 8A08E84F509C6408502A5CE2FCAA2EAEC2FF20102BBD88EF1323B6D812AE17 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = DE9049A19B2D9708CA1C32614A33E3E805C049D801D351C026E4EB5A5FFC864E6E89792D9C86C561EA833538BC7FC32CBC6AA18F4CCF4CBD500AA0677717024F58D468D73F6FB985537E961865137FFBF2B0F6DF1C7796277B235F8A66E13CAFDF36A610CAB6EAFCDA2BFBF6DF6BA3A9790C00B232AF6CF57BFB992BAD4BACCF Label = B8156295ACE1FB3C2013E61959D01B78F3B45FEFB516ACA6F94BEFEA6112AC1D Output = 4175D211E9B0494EE1C222B668ADF5439FB8F8C4A4EDA113BFBF5F92148A9324 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A1661F45BA6A6C84B459D05393730BD021972A0331F71E3412B48A8F154A3B15B030026E72F571726E4D1553B6B82DCA2342AC403BF21BFFD518CB7E665F2033D2EEE8B11291265A1B5F08C214428258626DE0757F04F2A9996FEE30BDF4C09D6DAF49AF52C3564C3C587DC28E35C38A36F56FA1C2EEFF8FADE0847E50FF29FDE10F3BA1A8A7F979 Label = 66591D4126F60C9F9D7186B2A48D797C913BF28D76369ECD5979EA5A9D40F3A7 Output = 743E4570B89BF3F6D81FF1D81B18B17B4AC1972D881EFF3B8A01702969D60BA93A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 31710B9894A346F131C0A52E94361425E2A882C0C62187CC79F01AA79D739E7C209C2D6505D9D8780E44A691D52EF8D48E385330CA72AA0DDF66C5CB3993D0584796D9C4C4AFA1E9EF9169BD4842A092EB606E8E1856B321373ECA18E470B6051E0184129F81D34494A22B46F1F580EA3831D8630345CCFF29A4639B660928236300D49C5DC6FD17BA18540BC547FC2B Label = BEC8695D5A456FF6A3320EAE2B0D86E03E34EDA11C0FD39C2F9500BC5F9237FF Output = 172FB50725761DDD6A29D8B5ECD5440260326B80E73B87EA365E0042699528E725AC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 672309BCC2EC9630234A19324155318B8CF3A0ADE5743438E7A2EBE601BFB5249846C00926C2FD54634A2568100D7DC83F3DB72BE88077FA21ADB147480E15D0058859FA52540326B071D75030DCA4B09C09359682D44465CCECE932B9FE20FE9E6DE4FD7365B92BB652D4BC32B47BCB02F770756E3AD18FDEE414194011652B0B3234C073EE81CFA44DC532AE115F4A4AD985E1A5BA8E0C Label = D5CF26A30823F900E96A7A5177B59BE0062B5F1948A18A3D295F6641C913C76E Output = C4C56CC0DBCE94CD6AAA1066F3FEF5EAA8CCD52CC63671EEBEA98B16E2A798F2D75545 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2066F0A6B4662D019641CFA6D444FB773A0D19B6F3F1218ED6A93B015B70140755A3CD2EE819356C7BEFC45769204F43A028FC57240B177BBB8C5356CD8F0624DF9D668B654916BB9CB69C412C87D578D2F170831F7C4D91D8D9697D75A50B1B8C311C09D13C7848C1154103F07FD674BFFFE85410F9C3EA0530C37261DA2D1C3D311C802B6ABE1F4D57C38FA68AB1764B45D0CF46B1DFCE8FFE61DE1F1D736D Label = 449D2954309B931AB141FC79DB77ADF1D75C19CE97067B275D7D30F902BD7854 Output = C1313AA9D96085DFC19DE7211AC45E17C726C26500939E8CD23CF24E61E826EAFBC7C55C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 33E5B8B5BD5402FEB7AD3691B059E62B02D3E4B3D3E9E16CEB088511B2C8A825B4850E92697D9622821C45F299F1A68A636CBD0A5D0B7D3340986CDE0A0A41D4A8CF44A301D97AEE2A4F6242EBEE4827A5602D4DFF76D3778D52100E2D0CDB5AE973DD0532CEA6DC2E0BCDB2B6ED7DB61A3BA57E6A8973F13E3B98D14B1946E8648DA706C6BA2472AB4BCD994092D8C7997CD9BE9D6AC441DC6B89A94C5E43CA3ECE7C55EBA8AB56 Label = 2742A9C52D4F78B795D2263B01D0F28D952954524BA485527DDD7AA371BE5838 Output = 27644B7E4664531A94B7235513578A24124D9A3F8F1587185CC74289B9767B49B82AE7B683 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E3D12F21D71F79D76E2A22AA36BC0EEA63E6E4EAE8C8B948FB1F9614B50D1601AA73D7FD1B3A2C4B56C875DF816208C842205A0D13D36DCE2D4D4501034A956096951AE20B65EC1DD04EAA4AF70C1142C1763C77A566999795F28D4B9085FA3892CBB40B574DB895FAC76EDEDC5BE41B80139C9567067FCEF44CF6C7CDA160FC33EF03FBEA7794D5E894C5C969AD995083590DFB3A0F1BD68A93BF09E34DC7907B3862FE9F9C8029DA6191A2D283E8EE Label = C63F9056ECB65978C81852AE5E27036A01076A4A4497CC67EE345AAEC52F588E Output = F1CAE09E272325D267834FE8291A4A38D494658CBD1D1D258C89532B371BDF5447BB3751BDDE Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = C2DC36A15681D8D06A9FB1A141351B5835C87F6144D5AAFAEEB1EC3C1C25F96DDC60733BB861BA80E567D3C80F9425ADAFC9DD69F735DE7E7DC386D1D759A6D1ADB27643D4ECAC7A261D236800FF0D765DB1CA481186D8D0B588A3999DC9918FA8654E35F6623748F375BCD53B7C24410790007F94338AD4DEF3FB44F3B358600F9B0074CD205D19492AA0A9DB90E72090B81FB4D69136E362E12D4DBAF7DE29E339C8333A80480BA048FAAAC2AF303B33D2A4DE3DDA23DB Label = 2B6268CC4EF0F707E9301BF7DB973494AA14DCB1F8D1AE83816D9C2812C2BC94 Output = 7507B0206A2513CB71A4BD143CB4A715EEA2F2D09A0F615943085CB0CDB7783EED1B756258F6CC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = B6C128939F4229DEE5CBC7E92E5C94ECBD112DB8A42E0B0443483E50FDBC2AF79AA22295F16E181A469B173B8D5F353BBBB062A0C2641DFAF64BEB8A51B1D8E56E763837E2E8E521F20285509EE0EE99928DF9B731F24E7D5754D0C42196B682022679CB99F51860EA52F064380DA5C489F9CCBE222C89BC072120BE8D9F5A8B6675AD1E8A780E361B58B9528285B4A79EDD7522DAB8372587B11C33E9927B76ACB849E3E5788205CB693D75CDB81D5F1CC6E7FBE5715665314E3641C6D862EA Label = 623BEA5E90F7076932F0AE0090B9BFE27C69954B7B06418D8EA5622CEC44BBDB Output = B869098E7D1CF950446C98236160FBFADF0597FD08F796BBE7A7267EA0530BCFD25EF91CE06956B7 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6EB39F6ECDF7C19BB3C4D11E4FBB16B3BCF603FE2E8D7207673D594C09DF29E78C0AF6E77ECE15C0B6F110B82610995F406C4AC74615984F7B423285F257A340C14577577FB1C70DBDDA0640F40DEA5A78E493F78B14085203B8F4DB32C2975BC804834E929DF17C8C1267AD967077871DE4DC6D389011BADA16075F3160CFD6644884B756492654B048A3EBD4182029F6FFB63FBB6F0634CBFC46E6135DAAE52004F03F50E5D5921F27E2C426EA3EEF5FC5C0791E057B88AF6AC69731335CD807B3AD9D92480DD6 Label = FEDA7A561816D5040A1973764997BA0B739B860624BBE8CD80760622977B2206 Output = 8669FE7D17DA3A29EB783113BCE961B68275647D8F490621D67FBE02A93FDEA1AC00498491656CB7B9 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D7B04AFC9D3DFAC28B9F3B84201D143C86F294C02254B16CCA21E4CAF1AB2DFFEA4781BDD2EF2CCBA95A3C2FCFE64529B74CDAAE11D1DDB5111A260EB60DD11DCA9E3702D6BE0F1E4080BEB729019623C407018453BFC43FFD12A5ED367C88553F461F292FE622B9B834499382510A98E17B0A1D9F5187CCC837483255ACFD61765A08AD23FC2841048ACB4DC40145B097D165ED6FF7E88A16511E5944B50CC0F4D7A7F0B442AB57605F6A9B3E20F0A8D64D16503FEE70112BA6E5B2ADA8A6F9F09E187B1FB08284AC3390D7ED49944B Label = 18218F755699A8241550F052DC4BD54B92E230F7A35A7E1E51339A0EDC64761B Output = E82C33321281EF541C18D8E6720488020700FA5DEC8A4E99CBE19250711101BF825F5EDA5925E3C879D9 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = B12CB9428E55BED14656A2A0967A1E4D5A0EB5EDAE5D2AF11A106A52D8267F8C5EC3A5FACFC8979BBA997B7EBE5FE4F33ABD86C11DA7C200B6530DA685DA793F7CDDA6189D758B4D67ADE12AB43E02CD4FF7D675FE986B339047DB07818B9914A05D9CC5CA2EF1E9FCB10693F92E4C7E97C70A559AFBCB2C0BE74E013590CC4A9C83E40B29F7EE3F89DAD9F9887F309068E328AAC0517122ED01307F7E094C1527DA0A77198D44A1808F5A04E3B394A7DFA7C913193C291B02670FC707EA291A22717CB48AB7ED707B32B0B1AAEADAC9F6B3255E4DBC5273 Label = 3DC8345C766AFE2D5A633C814463E526ED516ADA5AB17C102B084CD57C936657 Output = CB42729FA6AF1AA024B350909512565F59A558DC5D4A4F8EA04E10E8908A3221CE8229E8520D3F7A55DE00 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CAACF0F87A818A081C69A3272B0CFD98AD9EDD80E0CB550982AE74E80A7038100EA99F9E5E31ABCD2DC5FA77F3FEBF999A3F831AC2FEA5F62CBFDF756598860935C56187FB8B1C1D641656C1139769DCCF6872D7A006B68B2CF00A8C13A545E8627177934CE4F69D042FA4E57273BCBE1E53ACA11E3A60C46831C82B74F814B8F8E7DCB19A59E794B9F7138B943A789D6E90B0BAF3F00BE6F33FE54133005FE40C29BC6BBFF3D5BE048B9BE854603B1890F7F3B546781030771836356C26FF66A60DF7058E2304E296D198D074543341E5D94E02A369F955EC558D317586E1CE Label = 92370A0A74897ECD5462C710ABC417BAB2F739C90C2D9BB1381A3FE3F9C8EEBA Output = BF01F31F3BCA6424365EA109D1678E46750B4E07ECB9522E457449AB922F8F40ED0A4EA5D9D5A6014303D5B1 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 09431AF820430616A9BD3415B09828177A845F08C559F5E9921D278FE3C644C092DEFEC46AEBC4305E368456D81653986F9DD962972C05E4663CB16119357C235E79294F9F0DB62C9D7F03D60BADA9FFDA710F4B77AB44281460BC485B692615C97F6D933EF681320F2D11B636D7494B6016B797824C966006AA42BFEAB47D8BB38EEFD1EF3015CC4C10F81DAC1373345273771C08923A8FA3251F9D89859EC9B42F5B1F2F83DA6F57B11BE5D702608698D6A5DB8D6A483E141D9DC9730D195F30BA18ADD27CAFED2F76169A1BE2C220E4B3DFDE5249A79437801BC12FB546F31A5D150C11E567C9 Label = 931D0318A3572FBA77F8BA5CF73459336EE3E143CA545982DC926C2D08E712FF Output = A8B498D367461634873A9E262F598BDBF22D7B8C316805EF6B4D1974035E0FF45B58B4BFEB96F09BA515DB3B5A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = E339F198EDB41F4CE404A425997A05825657B804428E41885D511B4E9E730137 Output = F9B25211698A5C3AFC57EF6549F27F8B90B8A4E826A11197E21F7B467C81A6C04FFD95D5AD508CE34A90F6015C61 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3C7529D2E982204B Label = 0718E41EE31BD4561E3296D95D4E51638E4D9760F29C7562E72971FEC006818B Output = D08DF4B4023050843FF02092786E5E2E464F9D967D31A8E7B8F3B782D90E49915914E5CD07EC854FE7C216DC61C510 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F2804E3CF5D62D18EC7FD1CF60490AA0 Label = 99B292F01493C0FBA6D4141A91568DA0BAC691B8A743497FACE37164A2CA144D Output = 22D0A8BBD913CEF74E2504D4D24B1185797F78D9461D288AD547386CCB9C064D78F6686AA98967E01EAC19B7D20B8345 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E17A1319A4242384704CD5D11F337C96D00A442A0C0E637C Label = F6E40EEC236C013202A7A3E53AF8ACF63BEF6C4C3466D9571DA5570B290AC83C Output = B0B432043FD2D1180827DC36697E02C40A16D741E078009600FDD07A6446A9B120E72DB08405B62C0EBCC5982B81739DC9 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 30DDE77740C32DB7F495BA8D60F3430DCDE88B3732F753E63BBBDCC55460E8AE Label = 4424B9B55006BD07940E988986A705ABDEE48CE382698915A1507C898B7717E2 Output = 6BB4CB06D7B8CA867E35ED739CF0E4C51F2AC962D5A168AD8793914DE39B9453D4D9396E8309D51DC4B178F787C52E324794 Salt = 00000000000000000000000000000000 Secret = E7B512BF21024B91F05A5DED0486859F651D93E860EBEE3D6BF3EBD4C80FCDAD735A54E677ED51B3 Label = 04F745554B8A476B757E868F92D785C744F09DF8CDDBB78F4268863B4592F9F2 Output = 0366D8600C738F5D32747693C4CE9FE9B443E38137C88D82204F067020FFE6BD Salt = Secret = E7B512BF21024B91F05A5DED0486859F651D93E860EBEE3D6BF3EBD4C80FCDAD735A54E677ED51B3 Label = 04F745554B8A476B757E868F92D785C744F09DF8CDDBB78F4268863B4592F9F2 Output = 0366D8600C738F5D32747693C4CE9FE9B443E38137C88D82204F067020FFE6BD [SP800-56A(HMAC(SHA-256))] Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AE5156BCAA700DBFFEECC153ECD842EDBA0C7A3E9A10CC20264C9EC754217F9986BE41E52C5B96A8 Label = F08A1C3F5F7BE77ADF49DAF30B08B9F2D26A6CCADCAF4A57C744C40BB5DFA8C8 Output = DC5ECCC0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 19CE2631B4E8FB8F320BEEDC00EFBC8A6CB270D8E30D33D749FBFAAC8C45F72C5C6C1AD8BE500E2F6E5226E359209461 Label = 03BAC36FC5F72882A78504256CA10BD18D168CC024F60985D42F8040A6F779FE Output = D836964866 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A81EBF47CF2C83693966E290E3F454410FBC22A5974A9A27BF8C86A407CB00A6D4588BCC9E75569A31FB694D162F06E5795A90F7899D3738 Label = 9B1B2C757A40700ACB8461A0634B844679C629EA252CE88129C80580A6D7C9D2 Output = 02D5A355D30F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D3E096E2BD33EA67289E86D2CA6E16905AAC9EBE448728845B50DB4E386C8377D7BCE034F0BB36C287F68460DC1741FED9D194F1394DBEEE3D99DCDDFB9883AA Label = BCBE158263299274FC1990FC8CE54759A45439CD976F640A00E2EA8AC0A9D202 Output = BB31155DA367FB Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6DE6EE3E3B14DEC204DAA666F0EB95A9F53FF2198BE898FDAB7B60942A1DF46A03973E9D0B78DF17473DD0EC919F3F0FBA8CD1CC764FEAB8163BD5BD03DC7371E4456093B13BA107 Label = 0892D7D853049C39086E7FDA4B1E4873F5CF8776438E646660D0D14774A8E513 Output = C0024A2676685958 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 0F70E5719EB0C4827FC1ADD4D0BB0FF583B0FA3343D2B4DBA4572A027347AD8532B6952F6E0741C795A81D1999FAF79BC2301D4976BF3323FB9332FDF1D524FCAC3E5DA3A1FB0A735C554E94CE601BCB Label = 213DF905CC7D4AACDE9192E3A12BD093F49746448C883358A5C3985C0DF985B3 Output = E5206D08BF086727F5 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E1B365CCEA749B7CCBC2839582FEA227B506AA3936EA56B45966D94C22F9C2915645BFD2C2AFE81E79B6248359D1D29AFA6EFC80CF401334C8BA6617F52EE65995E5327DB41934704544F1BA2A3FC47A83CB4FB3F4E49146 Label = 85A5D51A4787C234B8A562B55F73B6A56DA1A20EBB2D34FC6F5AB8F2B3C1539C Output = AEC505D69544438148A1 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3BA3913295713B3D90DD08C714F7AFA812FA6410B8D9557A910B42D0F7D96D600636BB9ADD8D293583FEE0050F63068F70406561E684EB49F91DB0395347C89E3FC15E90D8A824D55EA227209120A294831997B09FE47BE17F9AF494E5956F68 Label = E72C66B16795D131C08DB17252ECD4062B4AFD0114F45F634AE081DAD3A865DF Output = A3F426AC85B7931834A02B Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A0EA48B40ED99194ACBF0E3A3D594E4C42CDE9C9698531119DDBAB0995B8037C41D225F930B5095233C823241F689084EEEF34938189205CD11676A103CD2B9671061D425B1EED9B1B58A2042F9BCF774E0E49CE4414B89D02E610AA0182BBF23233EF85943849F9 Label = 574151586A1E343BFD41F2B4877A1D7E18F0593F9B5AA74A027EF435BFBE936A Output = E67CFFD47A36CCFD058B19F3 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 98F6A04CFF9FBF02C423F4B272195A93C1F66ABEA67216DC6DCEFC100FF83ADF2167C9ECE2BD4179FB7B4AC01B462C86C73B2778195C67D7F7433BB3876E1DC3249FFA0935E506808C27F4BC80B5E90D7A97F4BC759FF8545EF3E7DD9212E5E031FA391B69145D823179A3BEA8080BCF Label = D15C77B3F2B6C81F6139FDB296B6B9B77BA94137CCF402E69FE9899F724D7DA5 Output = AD61B5ACD03EC16A296B205082 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 00160AAD127CC181EF65492DCDE8950BB70CA427AB2E1D24A8A110E7C589C1079E1F205909D0F6160D8EF018C1F9CB632537FDE875F7929F6766D450D354BDF6A7EC8882BC8FD27CBB1EFC65B44EE6A6B2932F0E73766662A05C82A3DDF3B7E70457B7482569FCB1AA88978E9D4B14AB8A4BD9F7B2E56BFE Label = A9B9C4B59FEAD706FAB64227837ED43C8DAFBF2F3716736222C63C48B6B54033 Output = F68E7841664E205CBA1899E24D4C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 8210D9B7B825D530F6E950EB6E46E16DDF348F48F54C6FC3ED8EF7406D9879407E0AF6BF6D7BBAF85D41756A6725A9C0C6912B9A5980EB1818955FE9779F8A493D5FA53B9F47698C303DE0C0DAF3BC3144BAA6BA5E17B0F38FFD10B139D4600702EED2B828BB3CAF9F03D217520E6F745DB98915C6808B039372DC30A9E32F3B Label = 6F266C92EDF9C760785428D7591538AB2228C8B1EFE5D3B3AC9FBE209D70133F Output = 8B6F827D49DE544FFF79B16BA3BF6B Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 75185CFD1783E8459D6E4527F629836ABBB1C20CE036C0EE0C996C34AE395B9845DE3037F6EBD679CCB646712F20BF77F0281CB02273C020EF55193928A17B5B1941CECB50541C53DE274C072EF53CBD3FE5587BA8A221E83ADBD044AEEB01FC5AB09E0A3E84086546FC9AA4CD10E683887CA803080ADF7FC44FD0275E55D18DCD87476777F90D48 Label = 15F68E7CDDB36D01E5AA08E7B472EC9194AB8BEAF431378F9DCD34501C7B9D93 Output = AB04F18C6466B2E666F3852CE81CCFA5 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 8339CB28303087AAD563DB22AA8326FD048EC3E26FB4442E1360894BE81D9A7B5D77DA0DEFDD6F8D05E961B1A55EE2FF24C1C63AF51D59E599EFAE5849BB87288F6F133E77A82EF3716A40BC25478014268BDD2BB4CDA8FCDDD8B45C43855DA9277351359E1A56633640206D2C903CE301D2CD3AE34685B06521E018849912C7C56781A8772105CC73516E00B0846BA6 Label = 738E63BF8DD355D83CCDD8610ABF4D2A4C10245DEAD706D84564E01C6797D146 Output = 89CFA3EC7C5D8E45603A4283642544A768 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EC610FC2EE5136FD6467DB671C9A6841B9C9350C548C12A385FD85C743BCD081B662B2A396D088D659DE5C96AC5FF27CCCDFE028E39D0D7C57F65503CBDF8F5DB6B326E93E46204AFC46390FD472C799ADEF0625D04955231EEAF7E0BEAF998FCF1AE63DB669AE378BA5BFA8F47A871D3FF0B82DE925734B0AF60748679F058F86F3E5DBA85D0EC938651584A41173CC4650D98B689E1E77 Label = B2A9A69100EDF156E40AC5EC69DA5D977971A52D28A284B6BF48F8D9A0880F21 Output = 0CBDB4C428A3E6C3CBBF41CE05ED47004555 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7A8C83D1475AF3CE23FA6FC1F176A508E83F07ECA39C563A5B2CFEB0B2BC5CE642AE2AE31EA408F0B7ABF6C3A4E90C013DC78584BE424A7E00A305266CA049928A1DDAB9819429605E4CC734917F328E6D626148A81CFA2C9B0C3043D138146711608C2F06A49A9E743C928D17BBBC4C9A302CB441407CDB0E2AE5E990C0BAE69E392A08DC6765D55BE32CF559AE69FE7C055198C0AF4AA7553FF9CDAAF99669 Label = 25E538B01FD898447DF0A2A3F2D38B5012A6DDC48F72596FF7B83E52E5EF2912 Output = A1D71D1689483DB1F2BDBD9D461DEFE9C91E7E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = B90E0D9653A5F842367CEEF16234509F849B3B06CED69B1488768F104F334344D0DD43A5BA910F54B0707B0ECD7A9BA1AD28AA2ABBF6EE9C9E4658513CA1728480EF785665A3A7C1E90F86A306FA1E727475496524722D31215868660236AAAD949439B7882186D492EA3C4FC5A963D02DF6E92D94F52DC4319D801444A250EB7D5136ECADF06953153BE02BF75604D2C9BB2AC718E3CE60DC126B3E6C6BDD1D8AA13CF2A2FAB170 Label = 1F94C5E476F9FA846BFF44BEB4DFB0453A77CB4F6C642C8BFDCA1263EA1A8D3A Output = 58773D1D188D8AA25798D85ED6E0E7F93E96515D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = BD2538ECE27433414F98A302C4091FB416084880B72ECD37802B42D4FEEEBEAE2CCE9B497CB53BFD6CDE62F557EF3EDB461C62A78AF2DA47ACE47DD2969085B55A4F225A51F639A2EEB4D4D103F15E904B34617A05D3F07456B1C34C9D9B1EC3CE3E79487DB09E984E2C2B11454B7FB05DD3A15655619B2DB2D3150CEEAA0B12159C2E5B2DD56E2E99CA84954D627751550B673061F26BF10D14F80F17DE339176FA728226A30B8CA47FA4ACAE51D45E Label = 307366580994EB6E81696329B7B3733B238279071B55708C625D1EA53EF81824 Output = F9625502F3C332FB91EE241B7AC9B6FF2448DEB87E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AE3448E3495F3F85AF7099EA03ECF130261237341B5B455E5BE2DB463A0672CD2B4F5C03CCE28280C4C0EA4A0007E07CCA368EDEE6135E27BAC8E2950AC703124BEFC5EBC73094BE5EE92C01CC0B9D864F0125ECAF9F7582BEE434876AD988D385CA6B5DDD9895DF8E0FADC1E60087303C0497CBE1E49F5DF6FE520F1DBAD0539CED26DCC7A17D94DA5D6C64845DEBA0ACC81A345D15CA4CD7B07D9305E21794A8335249B7B3541E91D85497ABFD2201B8F6C1B14AD6FB01 Label = 0010C0A7B4B217BF8ED92BA362CC35862AFF19B89A29000404AACA607EC3BC55 Output = B56AB46CDD67B2B18F79C1D5C79F699A4DA12674B476 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = FBDBB714E3F6813F4295BBFE4FB1138995FA7D431802CE83EE1BAB3365DDFFD77FA4867B7F5D6890D295003C2F485670C0A77A210B1677243BDDBE1EA49B7F17210A96D2FD1DE5A98806A2C6E9BA05D86B923E4D6598A6E458E25CCD273B6D41D187736749A06F186B41F12F360458B24146B25AA7E0D94BFDF0C616231E595B2CDFA578AFB413AF6E65FA3745ECD47287CB7505AC90D4FB4F89BA5691E344A816D527CE411BEB9CF0BBD1F977874ACE4F733D4368A8C655C8B0FFBDCE679EF0 Label = C6EAE47CD086C5BBB6F68929A47341966EE460A74F60D6DCC6AEFD519309B5F5 Output = 15EDFB3096302B05CF100A3BFA93F7E88F0897C2E67309 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 49BC9077D8DE5D86C6691D3E011ADE8AC63FE64CDC0BAE842E2549B2E428C0FE7AE1A24E72962D7A5A7BE7A4311911FAA9394B0FB830F76D4AF08C3A24BAF1E8AB9063BB1BFB47A2EBFDB0A1BA22BBDA60FDDB6A166DEA82485006F922C61EDD421D499EA4EC32CC70F3C8D688008171F86D3DA1E17836F465A34B497F12FE3BF3F55A91A79D40984C0BA7EF369B250602BBC1248CDECA2D8129A7DF88E086027B96FD05823906C913172215A91D151444001BC09996D90F7F53C013F38C32FDC7B5C6153E85C229 Label = A138EDB1E202DD47AAB61DDDFCBFA123F4765008498621F80B93C3296CE1EED1 Output = 3422CA9ADAC7031B93F8C577D417143A2BBC8470184EFAB0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F0ADD40D3F393017AF3CAD1A3678D3CEFCA34A19CA745FF02FA2119F7D7E1C613B3F26A5EEC6E126C0D6A4E7F2CB7F84650A073DA7DB29135EF84FC74553F5A2204FA0ACAACEF17D5651A3DD0C2E1531D671F81F9E6BE36C8D5B0D5C42EC431DBEB33AB496C3ACB8E5B2F9A5750D5FDDEFE06793B549F2AEEC686B2E50A01E93F9BD2AA9970F82AE1B3F2391353987B9131EEE9F5A7AC0FEA337AC8D6AFC502E7AFEB2E4ED365C93E65EF16DF8F33AF1C2EC962A7B57AE411C4A10061D19672A467D1839BBDCF950BB9A6901281FC7FA Label = A92AB3A20241C250562BE23E3EFB14856172444DDBD9C0C5A418CEEA856D4093 Output = 4B32392B2BE5F04C83D21D02A6FD81D8DBA467D92ABA720D57 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AE1731B01BFDC7BCE9DBECBE54710C28A15625B0D3A8FCD145A8FF9725D8D269E3EB458EF61D0BF213008663BC6F5EFCCD37A77B3D9BAACF4331D9F6A22636630BB6A4A116A13C2E09C527488F67096D90725AA7F02A7BB3F7DC53B55D9E84D3CB47ABD7D622A9D23ED0F1BB64B3EE29B763226720968351E90D91FEFB4932900590BA9A14C0FCB485A3FD48D8EA21F0B799D413FA7F68796B3851730FABF19BBCF0CA18ECD15DA739F8910F01EB60B44BED5410F24473725FB70559994D64931AA85ED77545631E59F15BE2A6DE2F1C2B3B363FBADB835D Label = E9F0D03DA0482E7089378316F690A730347E63F47A593765B0324CFA79913DCB Output = AB83D17959D6A7D97A0E3CAE740A8C5EAD189640C6D686A358DD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F63C3B031791C2C6B04A1517B238F14617239BCCE246C598406B74063684BCC30E86B66D1A3546501AA0FE18A79727569951C6767B252D65143D0E4FEF0C25D5C2321C0AC54590ED72BD0AC4B05ABF1898E6D60CB07BB8D389F39D10E98E7CBE1814E5BE4D5BF43205E7F28EC7E89D47C74B72C727A5E0787A28C42480925036D301F5430C711A469BCEBEAA7DAC8147E5FDA198382717825FB469E7B92A8EF6398DA3CDD97D02DD3DE7756C0A1972389047922753E4915DE3921CFB906E1E83D447BC0675CA204D0201785D22BEF902065F91896C8960B1C6E8A52DE94D9300 Label = 34F31394C9C7AADF0CDD2CDBFEC379175402598D4213A7C01F039DBD38601B25 Output = 2574A04A7BEC0ECE447E38E5383A8CB029F7F5F1A331DAC3EADE92 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 807A479BC1F74A4506100A6EF427F8ED25328951699475638DDB9A84D31D7B085608999331A7511B52AC59E24ED9D56EAE9C86054ADAC20B23BE1D460F5C669FFC3573B169392DD87C76AB3A50C8FC6B1EDA8CCC66A7965C438CE62DD955B2FA49B1B842A464A7707CA1AFC853747FFC2052E696D036CB6478F9C65ACE97FDC68BFC037DB09C099DB55EA864E20C3B0D0752432F8E97BAF28C11D5B8ABB08FC9C175C31114F57C27309FE672FF06A69DE287FAD6759B2298F24EFEA3CFA83520706DEA7F5205E7A44C7A6979793BABF248C2D1A7910810D43986E500F4FC304A8A2F2E926B9A2689 Label = D612D0A356C0188FCA84A0E9B2E47EC283916BB6D650A215079FCE874D46F909 Output = D7BAF1450CD72B9D98B0F23D25B07B71522BAFD927B7705AF8B713C7 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = 6B65297A617EBA76FF65BF3F396FE1513FE0105B492C0071590820873587BD62 Output = 3114FA627BBE355186380448C9135E34D5332D36FB9D36E8BD7BADB9DD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7784E1E7F8CB9B25 Label = 1755AD04AB94AA3CBE83C54AC6DDB41DAD381DDD64BC283268D7DE1136489378 Output = 6CFAE580DA4646FCA9066C0DE8BC20876449ECE3192764A9520F632E341C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4599B3BDF584FBE051C34CA83FE8ECA8 Label = 53F6AC10732E91F728320E1762A3E6A4C38A770FB1883AFC54589DFFD2BE51BE Output = 768BF8CDE4855E6F121C80C9453ABBE368010BB101821DD69A7A2582244D16 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 50370165D75826539D522A33FBE3C57A70F313EA361765EA Label = A6A107D838A1136B625D3C50BA2F83CAEA5A7E8F8D4892018CE6C03325E9BAAA Output = 0E2EC21C5950353485EA0E5A161BDCC149DDBF2B5D70D0B52190148CD72AF698 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 713E56305A7BD670FEA95F9E4E3D8B638DED29A3A674D5B64574A3CB996DEEFF Label = 40FA7C528A99EF7ADB4EF0737BD224DBD4398249B620C63F94343E829E6F7FD0 Output = 61D0E910F5275ABAAE6CD15897981A070FD90832C53416D60E5F390563B3DA235A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E938C5A86E992A2D88C1DF74E356ED81D48D9E5835DB5E301EACB58E7B31501570E2B8656EDD0B7A Label = 48409EBDA7AA6E2F3897B1A24167CF2FBE7ED3E8AAF9B0F8ECAF55835DB4792A Output = 5F572EA878EEAF814539073745828186091ECD5058B2C5D8494859E18FDB990F6DAB Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = B13F841C6CA8FC3A14080C9EA1B74DA2A2FE91E8EFF304FD740015C400F9B43798A17C61CAFB5D44444D8F5916613D1F Label = 5C5840F132F7864669B7D1B87DEA146D9C89A57D8EA9C7C1309BFEA62C76A8D6 Output = C515FD2E3564D346E027FC80C2FD6B7886AAEFA6AAA22FE75DD41DA2BF3BF3BF8E9688 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6BD5A427EC15866924D36D33A3D4B9D242E91EA47C28EECD7715ACB7890333FA26209207923405AF6A4CF7582B9BD004719FD2BB7D120B49 Label = 919BA4D469ABFED6C69360027DC2E0317F746D409728E776EDF20BCB4C0D64ED Output = D00DA4B7E46BBEC355501690F87AF4DF8544F200F98B935F959CB1362B0184F6B9A64CE2 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 59E6104D3CB83154DABBFB73922E879AD0C0EDDCB19211F20B159722AD233133341D7FA5E82333BA80F2803441FC1FFA15BBE34BA30B67673244A8682EF20160 Label = 650AE74973F6F2A311C95492DD7B2EDB42E704DA587FE4801809930B5D4B5526 Output = D214C2394F845216C51A378E4B72EF89C9FD44DD0998CD405F25873303420C458E9C791472 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = FC99ADFCE0DF40E238067B9AD2C0DE80F1E99FBB9F2404108A4DAF8D5192CA5123CC3C0280DB46D805A9101359C790825F75577C3D5D273333690074127684FA421B63D7578F8D59 Label = E11688D1B4BEFCEC681F171FB4A276D34C1CC7B0629380A8AF717FBD05CA3986 Output = 31A83B689C71B713EB7EB1390FDDACBF7986B0406272EAAAD01858689DE909AFA633FE5CAC68 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D3B39BBAAD22605A452277F27D9F057EB65E8E7AB45BDB271C016D0858E38443036DC0F46F3D867AC456A7FE041063337B18361089A4C997930665074AF79BD49F919E1284660468C27EA8CDCEE07DAE Label = C08D81BAA103DB341A324837BAAB6131F03845CA06B823C59E75E6C71E475926 Output = 89A72A214185C07D75D51CBF05C59704CA580EDFEAF60BD912C6BCFD63862E5A07C8F173C9BCBF Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D7FDF20FDC07A4732B64EA686F43DF7CCF83610210DFC9E6B1F89D4D6AE13BAFDB794BE9E121120762A88533C51C5EA9053B79F46EB613BFF83DF253CAEF6EAA8E02B0228FF98403A09035D5931EADF119F3DD69F883D21E Label = 6ABC3C6D99325DE36047C216DBD75E766FC509E583DF9719C1566E7829286ED1 Output = 7B716F7A7C47257C0F3A6BBBA05A7AE72E23C88EA6A106C1BF70390E3CEF3078512E45C21C0F79C6 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 81F6EF34E9A04371AD29C98B30B90CF70D67D8995F686126C39CB48FA2DD2C83D78F16B6AB1E4BAF1B22C967B8FC4290DAB16A67CFD7069EC045370CEF1EA03614CC33153734BAA2AED9CA24728867D0E9221A1EECAF5BFAA815371B2AEFF9EA Label = 7CC09C96A672DA0259CF555EBFC175B37BCB387B8DD5E02B1AF2C5046CD49607 Output = 350CB9C59816CC35A4E9A3AEF9802A90A995294610425A2914F997D4241022015BDFD8BFC96B9A02A9 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4C13450CF2ED1D7168170CC4C32E5E20E2732559807FF0025418AB3C181E125A5B5C4071589E80C66EF3E2F752FD80F496EF512D3C5CD0926203117A6654006F768B4D09C1F97E43A4C7E078155FC66BE84FB2CBE6426E64ADCCE3FDAB7C4C07EEDA98684AACC47D Label = D9F7C48F384F22FB9C32A900DF81743069C4837D4370B2A174E69983F53DA81B Output = C7FBB7FA3332DEB1A8F06D59F22BEE00419DBCB5CEE294B52DFCF288A55F0CE8354DB94863845EB8DA6D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F36CEE0E38E048F89EF806E621A6BB6E014CD579B105CB21434ACE7A872A9E67E3E2DE82F8CA9391EF3F72377D8DE9DC014819CAEFE9B9948A8D8C085823B1299B03B900AAC6F8A182E93500BC16DB3A4902BF928517768F98283DD82D2302A476FF4722A8A1573A0836364B0ABC1A45 Label = 391E8222CFE7E66BDDAC3BE1723A8F5DBBC7628E3AD66B57F0C325F9C76A53FA Output = 46F02B09DA4BCA95BA977F700B41ECD67A3A87529448E94B18533DFAEC32CD05FD4BD640D146A5A3AE7F53 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EF53ECD29EF54FDAC0B35E893A378AEFEE26DCDEE87410BEDCF3803D2D27AD430D99F780FA02DBC41200F6296697F7EEA2A271485F7CD4CF9277178CE9BB7DA2CF348B9A53C7F94E7FC4C172A2030D0E1CD0DFE12DB8FB54CDFAAD49F3597577F945EC9AB7820AD9A80BC67EC354A6D3FF7356CFDF790E1F Label = D4FC4AB527839862CE602ED1C151CF0F0D2128E9E28D6FDD75F212AB6252752F Output = D743C3062F0282DFCDABAB969412E4F254D267E7560CEEDB1FDBDF3925048DBD38DCEA0506D5706123721670 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 83F45369F77A8A89A2078F367265863E4637D5CB207FD9FD474292F91BC04C836A9E27EF2DBD40ADC95F1B1D7A00DB3D4F6447D249A36F88F356C42C764BD3B4858C7DEC0F63CE23B2B8A2373AF89E26A476C4D3029BE87C15B7A72BF39DF0976E0B3AB480F7A4D42D13DEB68E507D1A458696B4C3C732CFACF04458E6D47C43 Label = 84705F9501AF44132408A6D8F1E5DD02D7D169073AAAAFE7E4BD22C0F8C3D0EB Output = BD31A89082A6BDAEF5CC8082B7DF3D4FA38C0B95D68F39894E56ECDDA127C6BCD5522D4D2692F00ACF669CB7A4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 17CDB05FE84621EE89D4C503ECFC688010C9419BC8B32D65AD733825C195562F820C1975145B53607434108A806D8A56210DFD58F78CFC80A6BF8DEE941DDC48C404319B614E3C5315DF6AF687E3F9A7ADB20E1E3C27CD50118E6EB94AC8091A0018C0D72B29D8FCEA826F95BE7161DD9E770C6FF80F6C5EDE346AE80939C9398E4FA40DC29A46DE Label = C6A836AAF62AA53C348AC4C559EF11A64BC27FB7572A43C191C0F12A82B6334C Output = BDFAA290A3D947EC57339A1D5D09530B4A019E57C98303F7BB9925B33B60C024CCC34DB04774A2AC3809444E974B Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CE890219F4A987E90D8F16F5798586D4A250EAA4BFF09DD9B3070C9BD46C39570CE7A1F577EF113F0F10493C082379105806D31891F7CD3F16F3B0665D46C19D0AD289F665EBF9204B317AAF2B4155FD45C4AC62FB957DEF475B4FD144CE935517CB3F358D255598492B42EA73767EBEDFE5D3A13757BD75CCF5F83A8E6CD2039B0CD47C2879F1FF6E37A1FF98D74487 Label = 272065BDBA26B48AEAFB48F3B52883D11088A315A574D7DBCB800C484C0D4F15 Output = 34BA185D90A1BCD170206100C16C96F2EA0DEDF0DF1A1C6AE7C2E94D76DDB9446F37A61428CFF879DFE56205FE4DAD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2DE9A6A242A4C2A83AB451417225F6DADBF6A8527650CA1D8FF912B0370F0BB5165153655CBD173187DFB2A250F13938132FFFB96AE113534DAA098500A65957955FF769925639DCBEAEF0756F08D691F7ABCCC72677652149B418A7F107853B159359645490B7799B3E26300593207996DD66A055F5C49FDB41B704159ECF0598C911B3CB3971BF29449656A35B2F2C6C3E61C02F841EBB Label = 7201F36475D41EA93B23C39BB8AA481B8A2D3C7F28E608DECEE90B8F297D392F Output = C1B9439825183901CB4FCD5C21FEB9CA04F5D14DC8BDF15B6FE14FA83C9765AA21C9D49B1B7A24B3C4F45770A6F9325F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = DE5BA60FF241BB5B202C441880B807B86B77AE3D39953CF9BE232DE577D066A61F1D365F040449AE51BB668DE9DCBFB93321C4244C213A305DD06918BBF16EBC007189E33025B1CB725D2CD27E83F9ABF8DB78BD5407B7242166CF175D318D6C4E22380AECD070A606ED82902D4D089CF9DB72F0A23C4CC66610368F29F4EE7C59AC5C6697DCF4512AB420B17B68CE81AFBFA622792DFD4BD0A8BA74CF6F94B6 Label = 43DDA73500981C700D04810DAB9116508F6062DD9525B597843B524C6926023A Output = BB01EDBAEC15500268A01C287C2E2E136008D8D53364619C49FA3779FDAAA432139FFD18D3C52FBA7B242873128078F25F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 9954B07527CF034799DE8DA951CDCC7F997FE2447C03607778619103FA4AD818AB3379992946DE3E781286CD23CF05891D7FD0EE0FB57C7F00EE235A2268DD0246E62571D70E6FAB7AF723F2A4648A0ADD8896976B606AF3938EDD0134B1E5FE0BDCD063623CB20BEB09E50A8AD9DD7065737F54D1AD5D203080E5E8CF5EE9130258835CF566F8A314B16856AE3EAAADED7ACA5FA1FC9B78582A24493EA6B310CB0BD572DDC83AFD Label = 316824BBB4A91C7F190FBC87A903CB5280984C9F7021B9A37F531E9BEB65369A Output = EA041F617DE62C6E1A96895C833998431D4E7DD5BDF34256E585590A8FD63734A4F787DBF560FE1A23157A987D4BAD275374 Salt = Secret = A8863B7EB7CADD66C616DFEA7C646F0F507A37819F615A7229E80EC38C524971E1961211F024A976 Label = 69F4C64716B4ED6ACA174C34E95AC10A1E9B710FE46A49FD44978101CB172BA6 Output = 6B9BDC2303195C79F2D831B19BDFB1E6074632C81F77247854155A3D595B4EEF Salt = 00000000000000000000000000000000 Secret = A8863B7EB7CADD66C616DFEA7C646F0F507A37819F615A7229E80EC38C524971E1961211F024A976 Label = 69F4C64716B4ED6ACA174C34E95AC10A1E9B710FE46A49FD44978101CB172BA6 Output = 6B9BDC2303195C79F2D831B19BDFB1E6074632C81F77247854155A3D595B4EEF [SP800-56A(HMAC(SHA-384))] Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 5D67AC5EA0F062B2452C60BEB1E425105C70D408323ED43B75D7B5F1FDA2CE8EC2CE4FD0EE88875F88B0312A84FEAE8298CE39DDFB35895ECA9E9F7D1F76638D6A47FB607E1433D0CD7892A3E4CB30431233F38B78C2883E1E619D6EC01F236B1E6D79CC9C42A0DF8630FC78C5375569689BF3D112DE3D9A9D1AD555BABFEE423111D4F6967728D5D63E84764F5FE886EE5130A43FAB8D7548E0E5F2A42BDD2040A631010EC2D57435AB870C4976317F Label = B005DFB1E5A567D9560F70EE5DF41A7B333B01BC98BA7681B0FD4BCC07AA6FCA Output = 4C93044F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D52D9C9772E02D214A780A7C2D9057A338726FD2507F5FD537B58E0E5147B6A902591B021FBD377BC60CF0343A94E40FAC4E146C9E220F3C750114CEA657845DBBEBC9EA5590CB3E89F67270DC10A0A1EF9B88AD1968065BCBD2F2F3A20054B0CC64DFF3B5086C0CF9C71628DD31BBEDEEF22B568BABE3C497A388C071FE5E1F303A828A6232B45966D9C8656A5E75B72A611C8559B01D777FBEB34222861CD79C16CCBEF72DCEC3C17D49D6898D6D958B537EF5FB3D9FF1 Label = F3A82B00957AD767C99BF6C5BF6A1BB0C632BCC11D2DC23F491CE5B00B48D514 Output = 08766BD174 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 85142E5581DB5737A988FA973A1E2D29ED8E88D468B2EA089BA5D1AFB8B146A6FADA688C8E912D477BD9C066D0B6F6DD8527AF21216F5578A9DD5693871A171D1FECD4921979E1B55405136061F6E672FD7AE326D7BB34C6E577182F0AE724243FE56D2BB9B9E1A5584C1EE4EB98FB489504AA9D08D6F3FB53D61BF2090853C788F323D435DB4EA06ACA625ED7D2F8A6F24CA03C50266DDCC335BC453097177F3DB3174CC637CA1CF1AEAB9DEF2059FE882D3F6D45BD7C574375451DAB3BA130 Label = 949C23360D39659F38118915B39A45D312F14EA076D898D34A094F7F65D08B19 Output = D3A2F419D02A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CE5C1394049BAF85D92755C0ECE2BF95D8D3DF6F5EFCA219D40947C24687883456AC54491E8B46A1A645B647696A364C87833FC0B6B6E31337DFCCFBF5E11A5AD125E929EF017B8A511D8DAFC00DADE527A049DFE9A3E0606C7CE6BCC580A17952F9988981507B623A4018F31E9CFC4F46B6D2C053C986EE5846B63655A127BA7A2E680378429A4C5DEEE645EB89087F8DD646535A5C8B8382CBF29FA4B7B693F8DD841FAE65D12A808CFB81A6C66630916E4612460586771F34F2FD1CE33E8CDD504BA1A88161AC Label = E9172FC7E923E1B0B94D377FFA8BC42E92F9B3665DFABB83E708CE59E304467F Output = 4BD9630600466B Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 827531FDC292EAAD66C8FCA8A9CB5EE0A9B4980AB7F4A42ED4BA36BBF3E7217DF24267799884E2A96988D20E71804D5B19D9CD54154D38F2218DA080FFE5BBA9BDD10D24451501A4BECC075CCDBF8B7E3B6AE4D24DF96D9F69D9AB5C4E82A76800BE0A6E09B333F7E22D2714470A37B900EA62D5A33B1AA07450B6124DF7E48E4CA24A6423B2165341F8FDD29ADD3D59CCD8268D6B6D0BE72011F7548312C8DFFDD3A12083BB2E4B4D93B52A9BBA0F7D06D453B26BC569F936947CF96C0572709EE52BE14D054A3E49482D04D73E69F6 Label = 239AB5BB9FCE09D29C975D778AC6A0FAD89B3F86A5BB4F4562EEF3A38547B2BA Output = BAC42598F8FF052E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EEAF3C7296A9728A5F2E7B6C511EB779252DDCFEA8ADA2974F619AA940C427CEE054C116C11D92E89880C5737320B5B7BC886BB305AF5CC845A76EAD5C03E090D9D3AF2D3C48A8FDFE1D5FB9B7A9B60978ECAF8C49DB29FB844C2A0BF3D89D4A25C9683B0307F20CC76AF2DCB1F9320852221C1AC5D2B0455ECC9291EE409A3D8FDCC9A7E4C533A06C07D8C5449B99EB94063947E4132BA94460469ECF130072DC022CECD9809729A21302385A13547450145EF4584DF19AEABE5AA0CE4CF56B02331F4F76B807EA4D93AC9E5BD25F26A7E127CC74700DE9 Label = 1BCBAC792265D191ED1460951A392A6D75497FE8C83224011337F837DD6CA578 Output = F6522B78D096281900 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 869E0D7592892D5194AD062FCBF93EA4C6E657C3125CA9F00D7EB99FD51E9C7278CA12EC8CA6CB8765F0601930863A16F2DDCD3CFC4FF6DC3A3F9BAAEA140182DA8AE4C1CB99018D1AD285DC91472F42BC42D72DF8EE42483C67A59985976DF47CAB0B80FCE74DF61CB72FA5E307391FC15B7F3B53F1DE567AA9370B775A7198E96347D600C2ED0BA04F487960E166DB0D24C25CCFBE658A4E5B19112A893B501E0134D8748F6D5FA926CBBEE9F606BA7701EAC253A1CEC6459E0B80106C3C10D373520A84EC9B96859A410789907EDD8688EEA8486816843D5659AE5F584DA0 Label = EAC048F5EE9A24DBCAE89E83EE78E6C1827CCC0E3D00283CA2E73E91BD8F0A26 Output = 4ADE15D1628E0DB55C12 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3AC521D28AA2DDC582BD4A13B92A5002556635FC01B05E778AA750DC1BE3E4D60372618EFCDAEAB6FF9F80AC77E55C1CF77A10D96027C636888E3D51F4F2C5F2C6FE4C00C0D367D829974FC6B83641E682AD19C8A10276B2FD48BB5B6911BDEABDEC4714BB95E2B996B6611B46F8EFABA98710077458F5B05A4DAC0104F7720E86A93DF00529943E1647ADC427F6C7F8FA8BE2C79ADCD929929269813BBCD857B6766E9DC05FA84F381E21E4261AC5B7A681E76C13E6E647219AA2C9619D3A60CCA86674F8D630CB3E73B052505D69F546650AAC29004BBF47F7F15F66191C46B16ED3982370D3CE Label = AD653B78964DC52AF5A7A0951F70E612F5D00158C34C2F25678D1158162A9A1E Output = CC7E8C3D6E99D96A8D3F21 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = AEFD06B74CE497EB3385FC101E1EF90759B7D9A87D30EFB4E47E1180EF9A9648 Output = 5FA19D040DB011E9BF6BC240 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 21BA8887988530F8 Label = 8EEDEA4BFE771BA00623928B30B5EB44240BBB86AABCD5CA6974EACAB5378121 Output = 75B5B187C518C2916708DAA6E5 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4968760A60B1ADC1717EB947C7E7C2C1 Label = 076DC4088D4BE7FF8ED60EAF41C51516C496C65A80C1DD5E31F9A42FDF60C64E Output = E6A4B01DA311599F14E47AD1FC9E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 1DADF3E70486E2E4D5B1B4AAA9989AD502B40D17D9637B78 Label = 40494292FD8019E1407AC60D9ACAEDE95E3CFF7A8195A193DCE031AFED8795E3 Output = 5EF0A8E87C476F4DCB002F44CD551E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3EB419D14552EC979CA6704E956A031985366F54AF578B33404307757B5A57A8 Label = C3783BD9194B93C53F0634298BEB8FC9BE2CDA0A197AA6B75515EF0ABDC7D21A Output = 25A4F3914CCEEE324F2FB66A6FE2FB0F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 99E283AFC968E8F6479AD0BD8A477325C9C18F8FF0442A0C4562D58202B4DF21E4EAB4B3A29FE00F Label = 1E520C6BF416BAED0BD28E7A8DA4304D610BB08B6BAEA7B8797FFA569DDF1E28 Output = 313BAE6CED095A7C12816F448D19B983CE Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 5E02884A139DD5F5BB8FE56F7481AB03359934A4FE7731BB8ECCB91A46C40013B15FDBA6E69EAD96FD78FB92DB6E4457 Label = 87423A3DB4923CA686512A006C7F5C97D998CED42D65557332B571F01FD9AACC Output = D717855FE96A5F1731C6680FB106C665CADC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EC31146F06AA8CBFDD777925FC92F5BA77AE1BC1F98BAF3CABE143152ED2525EB7D8322EEE5B36692BE6A2CBE1C088347E0B80462799563B Label = D1FE02F428DD239599F83B4B719566B51EBF23DB25D50564D2A8F4DB9B2F661E Output = 06BC27382E08C812075698732B9599EACC036B Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 455908C369190D686A9084CCBB39E69C4AD8A4708034F7186C67898F3ECAAB17050DD224CB49067D7DB2CA96BAECBAF6BA3AEDD0F48EE38E7FA9D6B201B1F8F7 Label = 42B8C97F594FFFCAEC2DE7070DED36E4E3C4582DE1F817B88342BC5AEFE886BA Output = 3C358A3612D9F8E3F9B1E00E21490C621DE7C0AA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 40370033105B37AD83180AD7499D441826360ECD9FF7FC43711D390D42AAD6845EC3BCFB10598FB21BDDD0FD6182ADFE7CEAE3054DE7CEE8B4BA7BD3B66EFD4525EEF21DD7F06551 Label = 6C104E06F089D3CDED05743ABF369B36E6C52378F012E9F1D160564D21A9A849 Output = E36C64B4BD33C67407A560954A9AFAE812D7FDE7D6 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A24A96840092427F0233D919BB819C6401AC5E71E2D07FD846D96AD39E25447259C7F95CDADE153BABF089B01DFF88A5DFE7495E35221FF0E467D5EA0D280D0F34924BB251D6B023E2D079AE0F3F84C4 Label = DDCD3200E60C6EE9C0E597E59EC94CCF2B65F3D52CC8662E8E1C62847160B335 Output = F861106CE0A4530CF0954440DC83AE206708D8E05FA3 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2B6D5EE96C1BE70EDCF902D9E577CB4C30BC94A970F8CC1382FE409FFE8C050581AB709D4739472A340DF786D1FAA9A876C5983BC6F4BDCB5A0D9C45CD71BFC5E9E6791FB3A2C89B80ED47958606D8AED395FDB70F9BB361 Label = 3CC82BCF01CC581097FE95FF0C72097B12FB87ED4118C8297D4C3F04A143FB3D Output = 0D653F1AD1F5DC799463937D7D3E7756DDA576F5FA70D2 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 2EA1731FE447DBC58F664DAD76936A993E923BFF0061E6C1BE4DB5574E60FFEA969FBAE117F0E6113736450F73748E84C26A5BFB5AECB44BB0DCE4D69C3B8CC322CBF64651DE85CA38C75D1A643AB91C5BC44DA5370A7F5ED25D6EEF432E7449 Label = 76068990327B69488B52BC4400D2A0CF8DB577B26C433E6F62D94F1EA03B88B0 Output = 7CC1D9B182B5E4EF2FE3076C0D18DAC7BB3D5C30472F7919 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E75243690C5CA9D7EEBA544043C6818FC5DBDFA8817CC830F5BAD76BB705899F3727BE4978CC801ED6803665C39115487FE20F20D2A4B10CE3B70E7F2991124CCA92B144D388B092BC0A51310EF985D8908D78896A17B70EC13290C99A7C2FCD0FA93CA50EF2BA61 Label = 5613E5B4467EF8E658E904BE95EE16CC1402398592DE51EE7F519A02F050DD5C Output = D1C4367012E28FB728CE9188B550C77BB1DF68AAF564281F81 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6E90DD3F1BB5037113DFCDF8D43387AEF29ADEC91B3FC404D2958422675D0E1F1E608D8BF9E22C54DF0ECE144230363D470ADC3D759D7AA1246011C1AE1B7D72D41430F0015FD850594F643A707DD7281966CB3B77559A6711DDE166309BB80FB21F2C507323EA686D23543435978598 Label = 39D043EFE597FD9A685FDE870382CF321E828CCEA9F82FBE77974928F1C4127F Output = FCFE6A972890AD554580744E20B54087769A0FD3B5B7EA5CE5EF Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 17478483B5A803296B2D99819732A5408B54A7870261550ED67AE66FCE76D6C2753B0C05E719DBC9D8881CF7B9A8A9138CB3B2753645CE40C350D8F172D83DA9398AD45CC37FAF7F59B797F275AC2BAF48F685CBF5F3D9D5269CB577C973BF5A47D20D05A20F708CF59BA31B01D4BAFA0C09F33FBC0DAF53 Label = 21F84229B3A43B08EE455D28450449C472206B8778E316F07B29CA5CE100AA84 Output = 8808BFB209677496607142C64772AFF5C2F1C05198C76EBF3334AD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 44398248C9AD6CF28E9CC2C5F051A86BF09FCF27301E32B3A1C27C628DEC0DF0467462CBE0BE171E1C57FC673EAE66E21D9CBD209A0F72518FB9734971827BC18BD8021BC363264A1EDAD7184B3E7A537202C9F3C871A0108058ED04D5F0D45354FAA3607A9DC0EFD4D0C43716F2D4D8C4CA3079268C9FD1CCACDA05327AC461 Label = 495C82A65A41E8E1F525B6447AB3549923FE80BA57E3A1D384B8FA4083768E4E Output = 08E1D7BDEC946D2CDD7F8CC015DEB62CBE264ECDA07ABE1AAFE6810A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 08EE77F9ED2AA12BAE29D0B9D6009600023514937ED7254A4D74C4A1DC55D9931D85557FAFF742617C9A744DF03E6E82DF7718A6D32282D503943281C36278DF22DD8B0D81209A3709E45D9E1E6A2BC7B1A6D471AE7015B45D062B7F7573AF712D6EBF7BF32920F6EC647D7D3AEC392E3494F3464A5A9F14694B80D0C62A84A476CFD0AD67B597FB Label = 13B1E8D9CF4AA24681BF3E917B2F99A4200D32E5E0BAF0807B4756184EE8DC72 Output = E4681888F4A0718203E9BD58DE3D9B26DFB9BCDFAF0507F2BFF83D2920 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 27C125ADB60DC74091DD915207230D12028DBCC871AA03C8C848580A2C2523BD889170ED41871BBA2E9A2FDBE9AB39970559D6959CD7E9A83504257C3C416B0EEE8DDFF5C1F15A14BE3B4CBCFAD0E9823DF9558CCC18C189C59A079D605C4EF9C305079BC6515C6AB06653B47FFF73899656FC4A023A26C4CDF98F4DAEEAD82BBA0C2B0858705CACDA95D6B3DC40DF1B Label = 872E06934122B82E04165628AABB4F12F319F82EC4ECBD04BB16AB07333318F8 Output = 25CF17699028297A0CA6F4B83EE0FB3B80FC6CC007C18523934FDA409DD8 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 8395C5CD63B654B8E4BF2383C4B463972100707F98D7FDFDE0CE2AB91DB4EED788900547FB2A48BB5B83FAA51F756DBFBB54F6D6EC4CF2715E7E0CBFC69D6F076510BF3AEB565736751199E5CD8DF52A14C72AACA078E0B38707632823C0EA8FAFFA6315F1983314554DBD8E5986A8F431420174E0A0FE5C9C0C52243043C7B286B2DD3F9CB10C173C97953EDBDC124442884D64F732A929 Label = 18321B8EEB20731061627C2E08084112391D95CB57301EC91E012162C750D4E2 Output = C22F4C671794DA5CDBA58AA56875A5465E2640AA004AB455A195B3E92BFC59 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 75F783488799C6BD5BAC00CA7D970799FA27BAB1EBD23F97D5E9AD95855C9A1A4947B595C71577D0EC3ECFFC237242E442798957349466C289F1864BDE83E3618762EBD5C8E754C16A8607116AEC1DCECBDE72BD01FAC05642BD963A3A42FA21EE2F2ACB7DAF2058FC1951BF4EE8426C56F388547ABD76BD8821967F8445A3EE8DA9C42234E2752F38C9294F9B6980A9783A3CE600504DE86DADE7261F20B05A Label = A77D8F077A7FD0093483A11DF3D0DE86777D24B492635EFBD9C7969FE943AA73 Output = 41988A9986BC528B7B1B39AF439C318C0CB93E05B07102F5E5A86B3537432D1F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 682020A076827975C3A082013AD7612D80F68215AB6B5CDEFDFCF3774286F90D10DA01C0B939FC8F0B5D12D36275BBE5203A4BB78C6AE3A71A6B4078703043AB1A50FC1584F9859D1E5BDA3FA25873D8FE0BB20FA8B0D625B58C34C4F255D05237A3507D8DEACE41F0963ADA4669B9BBB67FE5A92335756F1398240254199A6B3C3DD792F51C6BEE4B70A1C3272F4CC9FFD27CCAD4D4F4D405BF7787770E47209C92655DBDB1CA2B Label = 7DF9E96506DE32F7D6278122150431C6769F05E562A71D2F86A6051A1850A416 Output = 536DAC6B9E8EF89766A96391C724A77933E7793AEB0C2DE407A9479BE352A11C2D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 39B465104824DEB4CD997E96520D412861DF881BFB7E56B487F19632B329279B530953F29A7876DF5FED6D7436D28ADF9068C70D733F0598838DCF7A47D2FE45168A0531E3EB356B1CC492EE47643605EC7C2233B5BB9FEF06086FC5358B5DDAF10567E5A5AA244F16616E1B28766F1E39EFC63522CE6C18296081A73182724341CB3800232F57C96F78F038DD0222E621A1F1F7FFD7E52D7D73EE449FA7CED58AA6934044D8E5BC07B8B7E472EC35EE Label = 11B9FF3FE1DA43CC084A54759730230F4EEA37FAFF6CEF1B94EF9101E9D73766 Output = A18178C5E4C7F5B6D229EB8A0E399141F836493D3E5DAD022F0A2107C9D5F8ED38DE Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AFAF484DD2B7D5560619905B0E6F82C7FDE31C716210AA25CBCA7FA0876D1CF091A4232BB4BD5755670A134087796B803A717187C02FD993C8A13F476602C2571C1265E7209EF8BA10702D75FCF33B6977C013D63B67CFD29896C159624227376EB6C382E3D499BD9FDB5F0931169678706597BFF53A84A51ED7EBAA64C6B575874FC8C2444D5C57BA0A000A84ACFF754BFC1E557C83EA8494EDD7201B7C481E895536BA841EAEF7D5AC01AAB47BE0710E1EF999032B4336 Label = 6C5EF7668EE3CA89AC1E5D9D7570F0707B8AACE6818C12F3ED09C5D3AA9A606D Output = DC75272C5C3D374217BBC2DF97A471CCD983B627AAF2A45A4F005BA18102D4726243FA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 330BE9E73F61ADB29C1540921A14B59EEA4135F88A5213FF59B2EBC9019940FD5AD91B39725DBD2825574AAD1B358D9E63F23685E98047517ED5B2FBA68F0513BDC72DE39E1E374D2FEF2E94C5F429CF63D392B687B33BEB270FCAA116FCC4AE6119DCB94E347FF5A4C24874861252B274C679731FA665EE6EB50B738576C14842A3F8F8EF2769B2983B43795F00AFC1E8B43397E2525588E480F50768D070D5152EA39ECE9680BF9EDADF4D6BE73E8B04C6734F669706B7B4E00C6884CD9949 Label = F7835FB0EDD93003CBBE689E7FB25B736F4435A8D9FE8EA2096278DE450E317E Output = 26050108E488D0CA3F0A885D9426AC86FE72BD2AE10486FE18501C54780474E99E6B440F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = FBB1BDDD8083A7DA1A4DA84DE4BD6B616E1B036CE395AFE1DF0BF5659D1D61AB0A127D2322D3914FEFCD5D220D2D9759BC9126B1A64827D9EE4D1EAF284A07294ADAC832A7CA994AFF4D9A0F50FCDABB7256492B4EB2AAA16012BA3524B78BBE8DFDB1891DBF12D3628C9AF6C1A64B40C6A4EEF60F8A2DDFC3F12465E8CA2F037463CE1A5BD658C39291C3B86686E59F536790C6F993E2DEEE74AF6305CDD94460DB1B36ED4F6B0A81C5253829D56F0B2FFE8601CB3C3760A14582B64AFD70C0DFE1133E402C1DD3 Label = 2A9D59DF1CA7BE6CDB29FDF37F65C8B7ECA342F69409074B0FF5A8AAFEB36E28 Output = 67B5B750ED938705038C296B7E020D5BDA06C498AEB75DE9F095C77D19BEDBFE4BF894C951 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D0E7E15BBEA3211322E2E099B09FEAEA682151951E91977D149971536ACF20D3B972529CD872B8BB69866BDBAAAD824997A8C14957BFB4ADE8DC2CA50CE0D29498420CA919F8B9967D407E771A9217E6D6B23EDEB2254FAC7413E96BBFE223A13647476CA2B023B656519B8E9D3AD3E94B2988700B749027A17C4ACA9822A16E33B34B4512C9788299B68189532001205C753DEE72E6C2603B12CE2651EFD505924362E6F53B5379D8FF334F0984A2604CC50F65D7094A83D8A31D595497B9D29B2BC4260165A88BC202CF335DF65A30 Label = C0EB1EE8D67E1FCFDB403B38839A1F92468B3CC5AC97CB3D61A101D7285CB884 Output = 296F9622165A31F4783D4B7E286C4F28C5C7251D85581A6B8C5F0C68E9BEAF55E8BB7FF9D2E6 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3D598A0E35261B4AE951778A1F0211F326AD5143350923D0DE855E65E875AF5AE39440A293057A37AB1D66FDAA299D35D749A83FB422842472648F2BB08ADB4393009C0778B9AEEA7C525495075C61D2F6EEBB8D6B4F0C141FA69295E6ACFBC570A324196264BE841501CBA179CB9260EC41DE11D198C8C61951503E1A774D9B427C10A7C2EA0BCBED8BC4B80C51BE93095206BCCE656F7342049411C19F778C049E311CBE367CAC48B0329192A5BA4D3A232212DC94E2D2DE4A5F6E03067D67F74CB09AC265CF1D50F2E6156FC87A314120F0DA400EE3BE Label = 7DB4A0ACF01995BEFB97397CABA6642C4DE454B0FA912E998DDFA3D263BDD14E Output = B58EBF32F70AF0619DD01E1FEE0D44AE9A304B5455C22EAD1F871979052AECE938BCE6D73BF365 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 75F144A535A1988779B180F09C3BC0E910920CDEC935FB174F1A5A3BB4CE0A027ED83769ABC6E6D3312A6DA42DC355FC94A0650CA0A4683206F38507110652578DF9595FF02ADD0EC605B5D3DF248D2C41F02F1BDCBD5FD939CE4CB1808B0457E1904C4BF30C68E6244BC2A8E2586B6E36421BA77A764A86A518F14D63DDACF47B3926CE44914EF9B65F2B6A2740C6814EF63B818BA52707F3E9966DF029AF0EFB79001FD39EDB59BBCFE459C6CD4422009575125CCDFFD1A53203A49E1ABDE2298CD3DEF40B962B93FD1575D9EBEF1E320719205B3CBF1FDBED97457E207B6B Label = E44984FE7A3A8F0604373339D8FCFA6E4B1FBECF60967DC78CD2C838574D14B0 Output = 175AAA9D4A81F2326D2376A160F5989474E437192C5A176EE5F044DE9B60D6CF04B79201AFA52957 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = BB02856B1BCD331160B6D40019525E3FE1E0AFCFFE60BB068B05396A8A7AF6DBE3365A7767BF9FF289A355922798610349722B7377DDE85E309A4A18632DF8090BA2919FF1028636236BC38414218B1455A3548400A99A00CC30609FFA7C1DFEAC684B1422C5737DF5B3BAB033BF69214ED5C8CDC9E3FDB5788468E3EE5AA8510D4190D5888A274E21C9B0631E566F2F3BA9C1E56B3EBB3E9B0DD1DE799D2A1E16885DB87CF4AE6534F4A8616BD11A479E1FA039CDB8E1BA5A7587658AD755C03C37E3B2DA7F6606A5423AEFE53ECCB077E2B4590CE9E059846E81619D87C08AE2DBB659062C894D Label = 3F463D20D40E5CD2FA5FAA4C94C15E6BD2714121D99B05CE603D89B19004CD74 Output = 6F8A7F7FEC1CFF671C79450516CF601C78B938AFB9C7028A0079F84CA74C49462D190DB285CFDEC3D6 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = 72CEE65D90DB65D8C0A8D9299747690CA4ED3A844EA47AD9DC270F41517FC4BF Output = 55FC7E3DFE17E8517D9B62CF7D709CD9928D73BE4BCD1AAFDE2332FC3F865A7383884C7052D507EB5BC7 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 1F7BAE7E5F2B8B91 Label = 9F9CA8965C3AE07C060C3E2BF78ADDFD2B3DAEC11064BDEA943FB906BAC5E95F Output = EE994C70B9C15B614B534A8DB3CB2931D7E9B867D2A9E2397C1A10352CF3ECB39BE13B30D04CFBC790A229 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F160093E462665B599D155BB49A8E890 Label = E1E6D82B84B9F88D96C7591AD308E3704BA078CFAC7E3E30E3F839A3C2A9ADD1 Output = C21A983605C4CB50B137FDCAEF966BF0A2B4F619322C49DEF10243A8786AC5181B47D1411C551C6DC80EB5DC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 433A2E1513DCA10FC64509476BD2D555B6C9869768875307 Label = F8DC2CA1167ED04A7D579024F1CAEB4E3B9B27E3A7D4DD32355093AD8F3668F1 Output = 4029CD61BD70E1B86641E4714C2B383D9D40DDECDB43144F3CEF28DB8F688BB1840DDDDFB57F141624702F5C45 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 5E936C9ED0869F8D94F06D8E9A3F9E6DE96930D8C9F2BC3F6EA3FC0F4D0A93B2 Label = D99C4BBA73A3F0DE49BD9F1DA8BC5E1B6FB97252648C2E93C9E0D4FCA18E9697 Output = CBDFE4C975F9C9D3F99A2CD179A730137C56E4F7C868A8C7937515904723ECEBED532C976B0A7576D0BEE94CDD52 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F94CC231BB3BB0A95B3467960C9861F940A6567D7BD6A2717F440361703CCFBF26982D3106FE98C4 Label = 0DC0B05FAC202ED55202DE5BF238C182C9061FEA886F3DE5C2D3B30693075786 Output = 219F813588AC53233260A9D8FC9FF7848E5ED465EF29F0D598784C425649D45CF1013ECF29C972E6E25F27614A930F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 64E2BF03272A24E0E2C013C669993E5A9308DD41D5FA541A81CCFCF334CB7455D4AB8964044A04F953306E4BAA693684 Label = F3CFA1CB59258DF50062FA5B722F9059481EDCEC475C770AB36FF74ECBA082C2 Output = 2D5036BE33AC076DEE141030B36A1A0AD41DCF3A642541F054817E42D1A4B4DD958F134754968EFA372996EDBE6AE2EA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 61F0FCAC19EA240EC3705A46D394342FE8C1A9FAD340723B83B3235232C1EDC6635210B8E8F5C7A1A5673ED1C644410234923A53179156FD Label = 567B4E0190F659605255119B78980124BED713DF0C3A807BAEF182B6AA3911C9 Output = 769A6B9C56529CD850C0CF9B31B43A5356A31BC5ECE2EC3E90BC04FCC025A7115CF854CB175422555863765A207191E3A4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A972DFA6682D92875380FF13E7EB927881F2DFEC8FD7D33FF4E6BA8D9F126D87273C338BF18EF1013A21D6533F0ACA7213B98FA29B3FE8892F42D3AAEA4C00E1 Label = 90BD921D4B807C366240BBE737779BA3956A8E4E98379BC90D786223B3EE11DC Output = DFEFC5C422DB6E4B2BA3895ED7749F90B437729AA9C06B7A8501C55785A46499BFB9DF674193A2FDE8601FF2FE636240EBB1 Salt = 00000000000000000000000000000000 Secret = BA3C69B809B25770858598BF70D6314E4462EC7BD01B8358F57DD6143C836B6E1493F531B5BE055C Label = 3DE8AAF14257E2ED4DF572D0BA91CC301205BD26B598EA45FD11879BB7147B36 Output = 4C4141C3FED3580B5DC7C386092D39E0AB12B2AC29B045CC9241A620FE9CA8AA Salt = Secret = BA3C69B809B25770858598BF70D6314E4462EC7BD01B8358F57DD6143C836B6E1493F531B5BE055C Label = 3DE8AAF14257E2ED4DF572D0BA91CC301205BD26B598EA45FD11879BB7147B36 Output = 4C4141C3FED3580B5DC7C386092D39E0AB12B2AC29B045CC9241A620FE9CA8AA [SP800-56A(HMAC(SHA-512))] Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = FA2ABA3ED5ECDF611608DF6565B68AADA1CE937826CB8B7909A193E95236CDC8204B84374BA4708DFE753F031F279CC13B8FD0B79FDBC7DC703FEDCC4AC3551F26A8B66EAC3CAEC0 Label = 1A04559E73502BD46BAF40E97B2DEE693F88D41294A674752D40D8D45E173B9F Output = C843B640 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 45FF508FEB385D4BFB7BFC3112280439BBD6F4057FB42EF266B7925D309730C8AB26A9CA8DF52AFD7C1EE76ACC5E24925FC1F30EB63D246A3C324EB8E847C258796D900626DD944C015D07FEDB6CF396 Label = FC0352B5C56039941C5AEBF8888571B5437DD76FA08BE4CB163E6768911716DE Output = F991B6520D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E3460061F537E12C93EB430A4CEA09A1BAEB9DA1F0EE4292BB4504E81682BD5F8115EFFC0C19A8E855B6204C3DEBE26A4BCD04D0065FDA71FE0FFC143CD6C97539209F8DA192314EDCE379B0067A11CBB3C9F9FE768A9055 Label = 397083AECA7DB995ABD904C842450D833C10947DE04C5EBE785B7FB235063F8D Output = 7394D490D1D7 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 96F7F21B5C1CC224DF0CE8980B25A019AEC537EE22B735E3AAB1223F601D788A555ADEFE9CFD48C3A1E08696733B1CCBEE23FF55FAF98D9FE5583F536AEB9981C99B367C6C9DF37A470B8DD6075B0747C276FACD60758B74616D9CCF259C8F80 Label = 6C512BFB797340A17146110F3321A69253BDDAFDD38A35E7FA719EF24F39F7EE Output = 8F21D2DF4D0070 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 1E10A896D6E7E997A92B22C3E08A8258F6FB0C0B4850FA6206B91CA2F95BEA95676329B756ABCDDC09B20F0976C0D924A2102A452B6A37A4EA641EA2EDD560FB40B43E835E1D9D53FCDA370ED176EA863FEABEF49AA776D5C8318B20DAA0CE0FC9055D1CB3893635 Label = 83E1ACC6BC9486AB9653034CFA9333F4177F5CB10EC6C93264CD8BCDCB1D937F Output = 0D07DC3E32C0BAAA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D69DCD45E55E38CCD6B04D95C2FD5DB55A4233AC62C01104EB7A4F37936732D78EBFB1B1E070190E2AE4D0CD25723FC8E24972600124D16AAF3332969A8C6931CA41AE80D4D2528A0863861832BEE2E29985CDE7952989171C50188B6910CECE17F5EC4F23EB2FDF4E81A6D7E27A55A8 Label = 6DCD40797A5EADEB384A19673AECF211A0C6094E4D6E87C0CB42D42FA6709AEF Output = BC42B49272957B72CC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 9F0AC490F3D730B40DBD4167E5FBF1E72E8074E25978F967959FB62DEF7783DEF57D013770926A414A2DC805A84C2FE84126D8E73A5A10515DA821C0A03F7CC0D29E9F2682CE19E1A5083F61293CF2AFA531A9137553D4D263933F3B1D1E08CC968A05484E5459A3B3064315290EA128CDD479C5E3613E17 Label = 074196BCAA365CA3619413604B0A2F32EC5C59438DFD809849B1C5DEA52CB171 Output = 4CFA327349FF6FFADD74 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AC21985C76304878F8A17D2D4AE216B269106985D8F4A1D8ADAC7078AA67B5A3240C70B17C6415A9B448AA33073FD2988E2097BD2759CD9AA6A999981C92B31859B949228618487C8C85A4411829AE6DD102B6A2D2EAA12521A939C8126B6C5B58A4AB7831D26210982361405E1B36CE312E0ADAE067C30CA2E700AD78160B86 Label = 9EEE954958520C736121214B245AFC931CA59FBBEC028108CE966C9892B6E99F Output = 5ABE45917A9918C1730FE4 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = EEEDDB7AC728E76D40B613229580D9A96F890E112B0E29463E579E4B5E48C217D5C3BBB1CF9D44AB3E0C88651B61AE6AA6EA1B96383F7D1DC13B42FC4A84D5B4EB733A1D0F1ED088E391E73FCCB7B291C6EEECF36F0196C98C544787170E20947CD8CBE3983946FD3603283274BD3EEE2FDB1752711FBD2B1C794236ACA62C1539609043E8AE0768 Label = 1FF1BB62B1AB3369DEF8544503785279E50DEE445CF43170BA63DC017D46556A Output = 1ADD23E362ADF9CA656189F1 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6491F6CA219F0E2CD2F11294A560FD2DEB0C526B778BC8F6DFEA06DED6FF6CE9AD22DAB535941022C4C47A9CD7E218DFF6073ED0830B7ADF2DDCF69017232A97FDE6E14BD40B68CF72ADF08DF5DAE0FC39FA1561081669FBE28C3317FADBED9A6F8734F769AF6C61DE0D54B9644993F2B5A688A7879531800D34073C45468C329A385CC60406ED96C26EF744B053F67B Label = BAC524AFC20A1D3477DE54C657536F73C5A1B9BD1684BD34EE895D40208AEF29 Output = 648B67490A2F7BA919E3CB7098 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CA312184CC37B39B36C5FDDC29E35B3DB87FAA3D8519505F22743BC8D5A8353C4FF5170CC602B032F4176315C3F63BD0C4A1DD15348A82F0ED7F960365D6B087571EAD18C6119C1CF8183F279E9AB2800DAF240241F49037E9E49EDEF2B84B5219EDE368AAD168F7383174E65EC9D1EAA925C6CD8837CDAEBB7379176721F401D980029F74B667423DA2FFBF36724EE33217646744E53F93 Label = 76274147E16851499F8322974A679B847F78BC78EE1D9F45CE6F81EBA18B6878 Output = 4B3A16632D9AA5A7570DE7705664 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = BF75A5B0241D99D535018E4B96121A11AC65888FEB46B1FFE1C48B63072A46CB9BD8B1FEE48E0BB28BA573063FE0A4E13912742554B4CEFB7F198A384966E7D052422EE576D5B752CED6C69E3C04BD0E1B2F71451F69B97A7A3122FAA79BBDCA419C6C086A3666B350CDF367448B058EA12974FF783F432E3A6C73B2A58A5DE0397F20E19B0EE5FBA07EDD1A18B896E3E5215EA0D99013C397AE9F8D224988D4 Label = E75AF5D70D44CD59A5B9559B8324CAE52364DF2B573746AEB3AF7CCB2A937CDF Output = 462F925B4989804455A71D99730D6E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = AE84D4EAB5F7173DA81072B0B4769C765958FA82858403E36BD89250176CF674C15675D1BEFE58BD0AAD9D09888A942B8D2EDA076B56BC99FA91BB913296E4BD3DBE46DF49FEF5584C26A96A8E38BEA56857D11A090B8509831397B339BCF06E06F7E1FB631D2841A3B218F6DE111F5DE02C17805F9EAC887B15ABA13CEFB23C6E5ABF6F30F35E9D0B248EE99C78405B408FCBB4648897BA1E11804E2EAA104ACEB3C7CBFA6484AB Label = 88C46C04F067BC1E7638CEAB51DE4CB220A8D1BEC142254F092C274FCEB544D0 Output = FD8C27169B8C2504D917DE334C8A91B2 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 52F3290DE768D71E57CC8B2E9E836E488EBD4A600BDA602749C6B2C99650F9AD6CFEBDDF79E5613831A78D50EF9F5D5C0095762C125A99F9C96336FE86007FFF3D8DE2E806F81AAF1262C3EBFF81E3E40F2C85E86A0E7017903086F1600E614B63690FD3C34A9C392039CF5191077547F7FE7CBA7B28ABEABAECDDAD0880626DCE1863FD9D0B98E07F522811D4C7FDB69F83DDA2EC08BA74FA6520EF2F1FA742C0A2AD9E4930728AF6AB01E3D3B7E23F Label = 88F754007E160DC2799B69DDC77CCB315ECECA3B4A17CE62B73C53F49FF665B0 Output = 4275A1B26BB8C98537E968166A629E208D Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 5F1ECC9481F10AF762E1DA63A1CEFAD7CE1E5EA65AB2D70094512E53B5B0F304A4EEE9B07C6918C202F64A40324F8D98BAAE32D9659E829B276A773FD93A913EF837F4E20B51084ED8FD2CFA647B92EB7E422A9E86494021CD68F389902EE778F056FDFCD2238A5A1B3DBC377BCB7DF0ED5D45866BD97F6ADCD47A3CECE1D8020CBAF35326CC14994904911C1C95228A0EEC1C58739548847FFC9FCF1E9F17D2E37BFF8FE3280ED489315CE5815DDA34925AD249613795AF Label = 7CA71A8101EF23B074A4F3F8B8EFB87064C4A35643C3C2B551F91EF5A8A2D11C Output = 038DF10535E898CFB780A898A2078CBB2115 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 36EF70C10B9AD9CD53BCD385DE5AB3875FCFF7B1523C2A1B9DA012C53F26A1DB6737AED1FA95D1B7840AA2BAC836A4106EF17355A2B1BF73BB67EAD7ED8D5D809F639224106020DB434EB4DB19265ECCBD65EB050980736BCC5929271DAB6F41406B3332DE5D47C4C80C840C843FB936729C6E6FAB91494E5C12ED262F2E8BA17D654CB9AAFFDFC5393F12212D18C7BE88F3CEDEBE06DB420E938B29ED8DEC38B54853936F5E0F129B004001FD4B924B018E883D6B41E010F19264315DB388E3 Label = C8AD8057D696DBDA4DD4F322229CF5B5892385337539C5AAF808699D647FB80C Output = 08863C11E744EE76140CDAFE077AAC2BA23456 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7DD17C2A6685BB4BAE0BB2A03568E227A2E5505D03287FF132F592D67B9C3760C19B6A3777A2A16788C2B00E67EA659C9D31C735454783896B2CBE7572606554128FA2478DF3332C90C0D0D2ACFB1CA9339D727BD590D1494B4535564122DA99301B43FCEAE348A2FAC6ADEA680009254B40B91E2A1CCBF4B9F621E305F8E43E3DE901548F887ED81DE194EA283A21DA9FE91D7B3FC21B44E6F07F71BFA8BE16991851D963FB4DCC4D79E8F4DFCFBBC2E3575C6AE08FB36EA5C3EE32C6CDC6A7A53A6905F0390D61 Label = E3C8BB2CD88808ECD114CE6499EC8B64F82EEC1C89BF45E5E7047BE932FB6DDF Output = A65FE728A978A616FEA35293658051708BF32E15 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 73C7F3057BA3CCAE1A6ADE85CE50A8E57A1C3B06BFA9BE46455307F9CC53E39A2A6041A19C8F3560B86F92324DBD562516F3054EF4383B7CB22482571EFDBD57927F47813B325D580345D090CD57482A2E8796993ECD9AE7FB6A2EB95A5FE56AB65D26281B69495482FB98645C50BD81A2752AE01CB92F7CA43FAB62DF3C899AF3AC77595CFAFBAE0E8E30052553A5C3BB132BAE1690EDE0E92044F44AB06783F46F5C90BCC91651870DB818787F44EE60713E4BDB4946BA65C03D7C04F29AA41CD718FFEC57AAD3DDF753C48F769C75 Label = 7F83D2AAE2D556D26F47B9A248A10DD8C9515DE9B9F5DA949FE6FF4DE405AD74 Output = 330AC73AEA271078817073122DF38DC7FB798081FD Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 40F8E1CD34DFA03CE7DC764D7984C4B29883739AA60344F4827940C4D133A0BD9C76DE3EF090F37BB132A6C466BCB2972B7EC636F811651B1FF9C77C42CBB8CEE30E091B45EDFAAF558050BC9C41667A6C05411A7B8C1B6240ABDAFCCDA1357C3FFF3E97D98110674D210BFB97377D38A08450CE8FAB651149A281E74AE2CB015CE864D79C42FAED2040C909091802DE0FA2FC6E1988C5C8BC5F9D102FD4F0319510F77138AF62F01E33D2BD05DE249F7DE4DD147BE997E6331449987504163B762537117991A7F0F6D763B653CB8E3333EB105DBEA50E36 Label = 73ABAA30D268B624CD6CE3A789889D2B6EBA318CDFCA0FCB0B94CE96F59FC0E2 Output = 4AAC5284B9FB21DA14DF705D37E33AB49C59D500333C Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4A502258BD763E930F615D27FF0944880D427DA3063921CF9FDF3E45F262F3C88DD8C6D4FB6B6A31D31079898CBAA24F7F899080AA9FC727C3C12219C0079EC10021EE8521F2E16EA35960E36D50BE380967DC64B4A33A4115A86113E787BA1B69A9398181C16872AE1C9F9775222325692525BCBA752971A3AEBC4409570E965F9B040953C6AC136EB1A29BE33A78AA847000DC522610A7DFAB1C1D08311559664BB2962AD309DB65F17EB9576F8B95E63B37DDB64BC94CF3DD570C1CCEE394B928836A572FEA2BD22F84F3B540E28EB2C9ECA054346FDFFE6743DC590DB54E Label = 52CFDD76DE86626A10FB694A2D46E97232FBD3D4906E7184D4C449E8BA802C37 Output = 602C613932B8084B7649585FA11168064BA287CD9B5113 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 9A03C6AA9BC74FF5879421E3A4A80525EF277C7C7541D68C8026CC23A7513740347E6040D91A2979B5A222701DAED756BA2D29B87AE92177A61598429DC799A77FFDF6B16915E552B95C91299964DB0CAC734FE1DF81F73802EE9C68E2F1C699E54FD1B7A6C17C583A9886789FA0B41566126B9EC0659A0255616B035C4C8A22184D494975B8965FAEE87945CE36D9A438ADCC61CE823EAD1E40D53C1E985DE7BCD1A078F16F74A359661F807113201ED543A69041C91C6F6A2C76AD6DA9DAF615C24BFD99668B80D1D7C8B2453BE21AB3E8C161F9EB1BDEE6DF7547A80F57252C92886ED8F32FC8 Label = 93F80D08FD790B5CC02E557FB110BECCFDAA2DB0709744AE466CBD53FF97CAFB Output = 75738F5582F07F10C90DCE9B2F46E04F02304FB1BB7CED2A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = Label = 49610F9330488AC0DFA783D25F61DB68361E9C8A3D379737E59C60144C59E7DA Output = A6B74B0158F278307C60060D946B620D839E6BEED5B5BA4EC0 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = FD6C2C8B9C3A980F Label = 004614323DE2CA9AC5468ABBDE55EEB6C9941185B49B6B804502178C9869B7AD Output = 8FEF08D3C06D804556744F17751117E39760BD8D4A01D5F9BBAA Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 47029BEB659DD3CE5E66FF6E774C627A Label = 35939E931437419CC51ED8CBAACD2E0FB0A5551C11021BCB20F5C02AE4BA831E Output = 9BE7D3E11312E37C3357DF013CC491D446D14FEF4FF2A4F469B98A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 409B5DF746A26EB815B30A2AB2542DDEDE4084C939710036 Label = EF35B21615D159E116174E2AB7874472F85AF5A246B7A1FE3B2D742683996421 Output = 4A70DA025A745270D3C54BFB12FB6F7D63CEAC0D70B21A29D331473A Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E4B097DA9A5E4E0EC225A62840D42DF2CB866554AD2015BF983EAFEDF6572B43 Label = 579B2A58FC414C5A0DFB6FCB60D22438AF74119C08873AC9D8302AC516D73001 Output = 2E3BEC32D029B7F92DB41EBF264755FF52E5B89FDDAB1B492D9212FADC Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 03AC9EE0E2DF0354D56C765F5301B40618AF017968D2F219D17AF70B7E103F9EEBA93FF563AFAD93 Label = 3523F37E05DF8661725C55730211365D1A9B50015F1CE5AF560303C7D6B777E5 Output = A8E73DC8F7A6E6ADF1096C99697A775834BDAE4EF6AF7EA4C7F0C5C48F34 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 68ED79519B1BC793F061D0993AEF9590E107C95BEFBE202F851AEC42590C728E27BC2BE8B42879000C6D5818E1008AB6 Label = 51B96E76B0FDC221A8C7FA687C2B55BA6B98E76B737259381DE47E4D9ED35C5D Output = 1A1738B74C2B7F579FC5133F2D615CA796F9E0528924543AFA46DAADCB9619 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 042189B2167DB61FAA6AF4EF8332173777DF75B1FFB107934B2054F1B3B079901EF0A2C6D416D3FE35F38F629C69238D4F35AB1CB929985E Label = 06B2F3513E064098C324985ABAE2D5C478753B0B3821CAA473D396010D94BD8B Output = 1D480841FC82B0E61F0A8D68AB4218B89E50E2E8EFCA04491760D58CB491E042 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = E74EA408ACD848AB616E9891F35050533002C16915BCE2E84749E24FFBFB175D0AD4E8D10A093FAAACAF5A37F3985C538B38FD3765CC106D58147FB9F896758D Label = 5F5194B32F19C2800FBA4B056F2F55B7EB0687520D38ECB7D42951F8FFD769B7 Output = 2CAFCCDFE04660B80FDE08CFB5E80A7CEF9E0B4C5D0BC34551CCA98C4E85C9FC60 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = D680692B7B7AA4B02BCD8F213A0532D3EC4328B319FA48862A4D36DE7C511A2F958FA2EAF7B246464F4A9A2C4F74155968EC2D084E32BC3F5DF47CDA5ADF6D9CDF9B048F1476DEAB Label = 78439BCB94D61C628D6AFC7D8A59C6F5B80A4563695623BC4FEBFB5FCA1EE8EA Output = 8BE2C1BF8046594759616103590760A9A8F8F8E50B09DB1D644537F34442689FE468 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7076D9EBE102C7A2F77BAE4AF3F47041AA7F3A352F15928810F8C47FA53A27DCE51A869C4F6F46EE8DA396A41CBFE6DAA684D7A76A95E104B4E2DD5CC15737C39E61942C09586AA1EE522D4D0654AA34 Label = CBE471772567FCC7BAE1F19D887C65F825A9B4784ECDCE6B4687B55A32848B18 Output = FB6C3752CF531198396B7083912136C2729A53994AA94E51F5C4267BA8D5DFF8BBBAEF Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6B0D390095F4BEF95657E015E9681AEC76DEE324885F9183B1AF375D8C2D7E84BE36E27064745194824D7C383627DE29916DEEA65449DF01AC7736441F31CB9E429F6D1BB14E565B2CCF39BF47F473A044B50368CB6892A7 Label = 570FD2A8CB882813C53A6A1195BD1B84E74E7F3469A9E36BA3D089659B457F25 Output = 0E30C0AC8F2EC3880A1FE275D74B25E13B7180D4235A20F625B395292990B9909001E676 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = CC16AE6B04EBB3DE19E7031BA6C5AD15C0A1AD2D3E3C2D23D65B966125899D2ADB16ABB9BACD87B940D5B8BAF8000731803D045DF9D07AF18E84C1050BE8EE2236F5F103643E67994497D96F5053C9181EF059B1465AECE2078978BE29D50D85 Label = 39BB51F2BC8164C412F3C413B705E5AD73F741A7E9FF94F221FCCB80238B5427 Output = A42C52C66D82702278CE7E8A6CAFD34F575BE8C1EBC7E4E534E4273EEF517E33EE514EDF76 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7794D815F93A718F7078A7B9AC0D3A28C0B7F2D75BA48F0EC853FDA8C0686B74001082B74128448B6210FA176C453EE7EAEB355858CE9A9B3A66B32DC14BCD4580E4A15A376CFC6CF76FB9A7A573357D3F386E27F2BC2CC2D1B71302A03E9C221E8F734655D7F790 Label = 69A0CDAD789E05E94D77BB38C7E0C8FB623B28A46AEEA19824AB16277D554EC3 Output = 28FDE445F52D33B28DD0E6F9B2EC5F94E2A174D9B7EF64FE183E07ABDDEC2FA1E65E18B9E2F5 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 82E4D5A5ABFE8E43FEAA01C2CCB1EF943049CAA320CCDCFBC468016BDFF3BB5C445D8A12ADC2B54BE119ECD7CC16740C75CDD19674FDA0B2EEA1E2053DAC3E15709D3AEC581E5D82A2E96625051D0C28BB31F70E24AD072049C19E2754FCAC3B8F090749C5300F4A692799416F407CB0 Label = CC744DDCA3507AE390D22CE2CDE937CDF677A3707764D0A7B2AC9F07819F8625 Output = 30C94918A6C04E3046AAD9F2523AC95204637DD35B705AD40E99F19905AE8152C89B6E99ED1385 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = F1E65A8A66309D12272EE3CC54FFBAE66FDDA687774374F4D29F86C54166D7DB9B926B3DF1A96FDA5B91F1706AF2F9F29A1D61D67A287C7C4A9A812B20D51893B9BAA6D702D4D78A782A89038EFB5712F49F049ADBE3C0F757DEED118C0D418FF0933F005CBFCA73A17D4FFE2BF1DED5C30F07C075AD6385 Label = 94713CC76AD30FADB27B1707C08A9B006257E96D8E33D3F12AE35A7C88B43F07 Output = 6368BBFA7FBBCF558318D83AC45DCF9B1FB6C53104E3013AF553FD5AAD77E8F53E937DA2FD608350 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = A2D2C39FAA922DAD2DD4B1F0B4C5548A767CADCCDB2CFDB974F64DA9F417CE10A8E24F67B122A9187D0D639763DCFB5326BE9D4E3668977E37FD6581AB8CD0E58F3F817966A50AA32D340E78F37CB6697F013AC06C4CD0213EC1E8AFB91ACFAB2E729A1AB1B07D0295EB669FC85020CDE6BEC274697300B636C5F85E51374735 Label = 08F193EF6DFC1BEB0FD510653C4B970B4E3A6701F98E6869669CC42686CB30BE Output = 4EDC460E2C987EE7189A90EA5243DD9B137AC2364AA0BFC461E9D29C5990C076BB02F68844945AC002 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = B5B04E94FDF4CABBB00B2008363B297F3E4A2585EB345E4703790C26736985AAAB2D7C75C35C33FC5943FCD5DDB3CC9DBCD3D0DF9FB9229ADDF400FA83EDEF28E569BDA85DCE2949AEB3379CBFF7B22C3420BFFC8EB8144AFAF8557BBBBE4062D7A0A481440986C32CD9AE780BC72CF6A6171E198CC9568B07585E3E5A642AD3ECE24F634AC8C813 Label = 297B7DF6327D541111CA9D28E24068671058F70FEC4334A610D7B8E0850CE2AE Output = C4DEC82AC642B05F6EE190E0126D908F3A7DFE6125B1ADD867900A8AA3E3597172B7787E9230A14CBF2F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = DCC0D85A279085C453C8E7CAD9CF5D14F2F23A5AD2E912D1A7F8042E239C3039933CE5236D55B1E1BB84EAD4648B911ACCA782F5851C0CE7AC4FDC536911F2D099FC9DFBB87D213625826F942EDBEC46C2AE0AD1D97875620BD03E60AF56A876ECB73168F68307AE8FAC5A75734AA63FB35E29AE09E5B5E372AC129C39550418AD201DC8276E9FA66A051CDC667253E3 Label = 6AB7D7DD0384C432E74FCBE2DD315E1023CE02D356810639D66B49D4C14E3710 Output = 02E29656585C5344193AEC0AACF2E6F3A45010153961DB490C3F32FBBD5336903898FE42AB7372C393C7BF Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = B77631A100B4A5BE3B2476A41A3C4FAE3E24173C0332BB0DE96257D244A09699E6D987FE5C2ED23C400527D2CAB66925C3F772D7DDA4A188837572BF68E3CFFB94593837C0DC9AC7B183B57D987A768BB14EA7490AC8CD5EC38F57D7BA804FD76C1874AA3C11F696859461E3F0C16258C44CB2AC7CEFCA0730DBF23964CF45845878B15D0AB3F412EACFC647016342639E3BE931F5B4BBDF Label = 9AE7C9EED70F775D5286DE9A81B4DF184E79FD9B723B15F7BFB1BD1833D339D4 Output = DA4762E694DE57649166F24B776E3FD34F70AB7ACF61D2EEB067CB90D7BDDD21FA2A98BC971830F60C1979C8 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 7DD6D1F9964CE4582774F3E611A39E66CBE553D2C4E31F0920E403550C6E6BA008DF35CC7ABDDB3F4288092A71E254F679562AD7F79463F65E8BC788C7D7B979B1BFED27D44AEB2E2839BBDD162B5CB03A94AE3125FF1925D85D26CC3A70A7EB03ADAED74F93781A0D2A4068813D34E2DFF711EF632255B9473DEB2E818755B78ADF95BE3CE861C2C3D8B1DD56F7FCFC105C63007B9776B9E49204310F1DE9A8 Label = 7E58BC16536715E5D4D3AB3EEF9BDC557412F2CB2E7FBBC3959A485030232F3C Output = DE86F6B27B93178BF4DF3840F016943B09643BE05973F9316D219AE4997D74A53098E1FAE3887EFD3EA65E20CB Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 273EAE12E239507E790B7A485FDFDB83EFB9021A1B6FE1111286A77F3CA2F78BDB516044EF5E19783D4BA6714DA2D70A1226DCB127AC24094ED470BA146A8B5233104BF42606A400C800E166575EE4C152B57181F46352A41C7E2CBE057687075C47138B49CF4DFA20C7257DB3F2FA5F2CA0EEA9FDD71CF21241DB11A1A4F442B404778E4D0543490F5A2FA2B10EB254B7E055F41E04FD40112EFD87ACCE383961D46B928A4D9449 Label = B2D79D8C8BFA1201598A4E2A18E5DC78D7D60CC7128305FB5158983D25C280BF Output = 79C0F4CEAFBC89B37F6293236E00F3AF5B7669C719672E9E55FA567975375E64C5BBD91E077F2E3BB1455042432F Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 6A7435393D11C71693DBB8896F1DB8DEB9ACC60FC5C065AA619B61D6D61EB5D48AB0EDB61FDEB01F8139F6122D91B9160A9DB467BA56E845E92F43A106DB2D8BAD54880AEB8A4F57BECB5FD180CE983854D37F193C634AD74FF09CF336EEB7F928994E170032A4BF1D7166BB71BCA207334790358AB784A5EB8027CE8CF084672743CB8697A4035DC053A8E6110E14E8C759179F34897889BA2AE01798521B6DFBEDB7041DFC1FD8C1837B390CDDFEE1 Label = 86770E2A6961AC07F1C9E4A4E8A4E333D5E669F4DEB19CB15EDA392A6852C4F5 Output = FB184AAF46BEB0D53FB986F17F3B3CB16DDADE681AF0A72A3BAAF572B5A8D78AE0E09B234F464BFDB58C9AF9993C88 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 4C65575F4020CDE5EE78721F6A7BEAE80ABCA5F4F1CD594FEB136DA6635C9C800FE9525543B00AEB1B3AB47027804B31078A1AB98C482E326C119A3FE93FFD52A0DF14405CB86CAD1614A3A47C6FC21D79134633AFFB2AFD34024AF05EBB040C44B6FB8BCA376A65E04CE6102AF48BE7BF97B9CD01B743BD0BD8F3B3F387D1531AA995BA39721C8F5AF727BDE207CFA2D4068B808FF50EB2A91D1F1C0499B0E1CC2CD644692CD93B8A880A011D1AECDADA217BB739A5260C Label = CBDB6334FB920C0E19310F4A4F59AD83AF4D6C5D415775BEEC6A60CF923228E3 Output = E7292B21F0DC48E459527627A24F16B80E510B3071A1D4910E526DFF0EF2BD1F0239400440D54E1D9CC594FD413AE37E Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 77D2681A8FA4D9A23BFF9C1C0F4B28E3A7AD98786D639111349E84C7E48D7FCED1573AD061A47B645205A83A97FC43EC3A5675FFF832C54EEE8105429C1D71CB840A1EDA235BB156CD7EE58082691B55D632E4CED66B23601434419C8731DB60B560C29565D56724E1A22E4EF2E431A484B1FA9E6E1D8F6919BA53309D98063EEA078D8F00F3CD646825E8E8547B966073E95D85ACFB478A9822CB4B1DEC59299AA764953998D52CDACAA39D071F4F109D4B331B86F1D5ED232D2F538CF0DB46 Label = 94B3A4BEBC6418D38C6BFC242E333FB0BD58918AF14F2B2A97C9887D395F339E Output = 12981AD7F6DBCA625E076294F196D4DD5B072CB196A927AFDF16C42323B6DCF0B7B9F63EC7132DA5574612526AD3241826 Salt = C767F6D57C1F68860197E6634B7D82C4 Secret = 3F4D4CA74C46AEA4FCBD8B5BB752A86D3651A82EFD76D17078FCEA9FF258264C0B65CB14637317F99B977B6E97F9298C686A7C983020F608D6F0D6D17950B339F522979D4C19547DD62B9BC20DA97A4B0A5D7C4F51EAC08BA978F0243AE92401B6EB4A83519431BDD7E9C3147FF2A76BFCF252BA13465C8467B1DC4F52C253B7AFFAB32D389CE01C801CC1662A9BD59CB710334676475EA2613D95F289F243D0D195A96B49F94E4B5380742B6496D8B7D062D6246BB616BA779F213FC1D87ACEB5B0E385A50565DB Label = E0BC94FAC3F6B34EF8002F0EA7EC0B6AACD17FBDA64C92C34DD1E2703B6B3742 Output = D105B8E5D103FA30A5666863FFCF335E1150722AE34FDDCB133395B94E4815F32E1A6B3E8D65166346667FAB04F9F43E92CB Salt = Secret = 00A09DE3E7E8A6C552969A4A7E7BA0FC854425D62EA325FBC9DBF3FA1C198E794936CA4C2543408F Label = 76F3043FA2E9D17455E6390A405B97580297C77E0F9E50E65D917B3E3097824A Output = 00E92369E7D32619EE6987AB5BC606A727D32595B4BE4662BB4AF5D6E917DAAE botan-2.4.0/src/tests/data/kdf/sp800_56c.vec000066400000000000000000000270211322470703100202550ustar00rootroot00000000000000# Generated using PyCryptodome # it implements the very similar HKDF from RFC 5869, # which was slightly modified to be equivalent to SP800-56C [SP800-56C(HMAC(SHA-160))] Salt = 97ca00eac481e8b3556a Secret = 52f4676023946c7307b5e8148d97f312623a6e88 Label = ae8cf2e46773a68098ea53b3 Output = 1bcd Salt = 76b026053771b88e4e833962a10083835a33ddd9 Secret = eecb51e6d59a6fe688fb591799891d9211745a13 Label = f2d44c1b59d725ad7c662ca6 Output = bc3d9b22 Salt = c1f81098a72662b327c78876fc0b75dea3944f0fc21b781f924644c93f3f Secret = 9f5a5f8780a998175b43539cf8bf03ac78db0a7b Label = a969b5e72533bd926be139fe Output = cdfbc6b3d125 Salt = 9a8667d4331ad7826fc10de97a680feae1635e193214d364902b87eb75123038c37599a32a5b65f1 Secret = 06a4e7b9dd40cd8241a8928c8524680d97bc1222 Label = 3b3ed9481e314f42e74e6fa7 Output = 763b0dfc2c369e0e Salt = 2a9408e98340bfc45567e4940c45f1a95f741ddc222676020610322aeb50c612649a67914f8967b85af0c1838406a0f61dea Secret = e91256557650671447c551229bb42463d90f950f Label = 69c1bd3aeb3c2f8ee5f24ae5 Output = 3e3468dea8892883f2f9 Salt = 3da95b5ee8985ff7f14028da429d985d3de14ff23bfb29f852dfb50b18db9df3078a1b8abaf2caa2aeea8bb479494e7a6b3bd2473e24b0d6d700320b Secret = e8fcbcfab9277ea4ab53387e83b8e5dde6f8021c Label = 54945740bf97829fee4c8b50 Output = 2933ee2413da986b7657be5b Salt = e095dcc7123adef68dbfd6c7c29ac9c80e0df092398fda628942632e468fe908e92e9260badcb9d261f64ed5d5a1c3628c601e1c4d7a0f242a4c8009980c79e865476042ff56 Secret = 0bb6bf4819f22d9f6f96887ebb9095c31ccc32ce Label = 63136125e85a113da864061e Output = 97c38fe515a28acddb2cfbcee034 Salt = 2cc21b527b4a074f267875af9519699334347c8d15ed3d14aa921aea77c6c06163e689354a7988b795ef5296b9ff99c6e75e41d338e20b377cae08bdfe7920ff83c9834f02e671970c25d171f5c3c8dc Secret = a316ebe289aebf5745e416e6b1a189e55751fd24 Label = a993b8c4c2f70eb5ed02cf80 Output = 5f59752d2f2c4399ffe864949a208a06 Salt = 4bc4b91ee2f0e11bb3456cde97a5c5a6feca16a278d3a296a4e16a6980af15594307f53f52d8c98d47651e85256f098540af2a9c4568e369d836d11574d31287f71a03b9afbce86aa9629b822d46ef7825578b4d9e78f0de2e64 Secret = 40ae2aa2ebe5b276ad8f786e74d94dadcbd680f2 Label = 4d7eaca4362cd635c8813929 Output = a6dd6c1076c7943d98fc4b29fae13f4e6c63 Salt = 309140e642573e982ac8d13338a2963dd82a7232fd52887224f6b4d26085c9c7d3953c7af72a745bba93c536c26671f630449d3813cbd6f2c86e937ddcde5f2f43a6375135800acb846b52639b091392a95fe4d406121dce369707d5ef9376053fb7e32d Secret = 9b4a2d72afa39d598f81cb22f1b3edc7d1f91f68 Label = 6bc3cf66b452ca7dae045555 Output = 73ae9581548285698d00a391ac5eb301004eab1d [SP800-56C(HMAC(SHA-256))] Salt = 28e12e410d501368b3e8 Secret = b3dad1f46a18430ea0c8fbe2172922a5a42c47af40046db24d38cb11eff4ce44 Label = 94d91d500177efafdc93e8b6 Output = d4c1fb Salt = 83cb6e89742ee6a02484807b601bff18c4541a58 Secret = 34503f1c4f68b0b1a77aa5ee7b3033d1931d3791e3807a440e2f8f2d53c758ca Label = d9317c91c613784c058217ac Output = 68f792ca2f07 Salt = 075589bc8edadc44f5a8e2225dd5b96fda92b0cb990e18c1b4268bcf5a3a Secret = cf37bbd4b781a1ede2326547a943642d4719a28053eb118fd63bb7a7da423de0 Label = c30f26e9d9c6f2493642445e Output = 7346edbbf155646db2 Salt = c97bd90493e873101db3226226e1e21d3f8bd95399106da05321a38c5c45033822e156768fe26fa9 Secret = b550b9390efb03f2450df54113a1344be2d45770074ecd727cff21f232f88f07 Label = 11bed92c366397feee2c9a1f Output = ab8ef443a9f23bc88e3e2f6e Salt = f519968ce019d41ec8846041dd10aded81f87b45da1719fd449f6459135ef2a5eb776d8c137e73871bb02d784f8fb4d921c3 Secret = ea74d3ec9ea5808644655903056d1ff6451ffe870e3a86d208ba8d45e31b14eb Label = b70697a769d87e8f47c578df Output = a1ac9b6228f9271f7067d640b1a3cf Salt = 0775d0303110bf187f87bcd9361b7e05970346360cc2d52d0ee00ed01cf92a078cc29e52f95ef2915bcc146a17bffd87b06d43938cef9b9f61c6142b Secret = 85ac17a66c6d0cc326f7680ebe0ff8655e3f5bfd7ca8898a95745eab521b38f6 Label = dd85261b531e23a05744b554 Output = 116d72bcf5a31542bf24898ea3663f211a7b Salt = 966c1f4cebe790a9cbb18ab170e6472eefa25c34cbe1369f1f6715544dfc35e156091a9b3d9f588e0148dfd441a85cfe09a9a799e2a505e8b36d700ce2964213d385c8dac1a4 Secret = b6c8412dde55865e80e2496f5a76930c9136dfd50d52534c39b29d8c2a19bc70 Label = 7a744ec5943efb5c99b6b6a8 Output = 40596e7548b670886760347daae013c416db59e9a0 Salt = d6655c220ede13a9778c41ea0edcb662486490d8f4bddd930d0c737362cbcab5ac602117d040e8a7c67e715adaeeb5c6872ef75ceac3bd17f63ff87f5366c36c3ad7f4c8eca695c8423aa528c429bdf7 Secret = 97fe45438ad4515217cfa63596bf8cbd54386cf7800bd8166809ba37bf8bdb46 Label = 5a54c7491df248ceb5ce677f Output = e133ab9ebd72b00378f9fc0d6b434175f6b77d99750b6510 Salt = 89cf79068274b9c8be72ca089705214cfbcdf21941c2ed731a3c38aadba6bacf514117de08d2867e8b8eb89f614e90745a3e69902418094fd6027136486b30b648f97bb7ad604ef5faeb7e40ecf3f31bacccb9527095d0666638 Secret = 1555c89ed1cd76bcc7771ce6f04f36258abc24f0a599a975197f36c76270f7b4 Label = 1b5b4504396890dd15f3c081 Output = 7113669fc54b8685d810fbda72501297c607d316cd0fd54b3675dc Salt = 3f8f8242f99f6334bcc536208eda5f16675a05a7c93a15264906511dd5ea3aa52d427a1dc5d3c629d2e7df9e494d83f077c98112c7b952277fcc6a0d207e8d269b8f8b6dd2cc419171d83bc71a7826a9a1421cf2cb6d2562ae0c3273d1ca53c4ba58dd94 Secret = 1fd2b381110cbedd80b2ddc4ee2f48700303044ab345d48eec3316a20d01b4de Label = c5d0f9eb31293ba4251f5fdd Output = fd3b37142521487e97f251d13c31bb01b5714693ca0dbfc1065a7b024a5e [SP800-56C(HMAC(SHA-384))] Salt = 9b9b25cf91a93d3cc618 Secret = f6070cbd6cf37c42ce50bde749d11a5a3bf3520b2c48b724288d939d8691946f2fee8bf8b3cebaa0 Label = a156e6dc23125279b172846c Output = 6c951cac Salt = 0a21aeed5e089b3156dd8a001caf152ffd6d7620 Secret = 523a5f2dcf0d36bf3209501b4acda2736c161e688f6d91d44736d070f4e80b92c4b3699998a5175f Label = 2b5cb3d56a5a7f6d1461c6f2 Output = 7df3023eaf43b870 Salt = 4c81cc5d022403fe96c59cb31d35c57b77e108648862416386244616dea3 Secret = f1f82f22861f8cb9b833d6886e97d26ee7f5893c0c38fd218c6a3802e1af952f82b1ce233a61a3c9 Label = 394db0ee1c798e87e8b37d3b Output = c45862cff28982950a8fb591 Salt = 9afec70b49b802e6faa719b39609e2940fef2c5ee9bac86f4cf58e35e91cfaccdd07427d2a2e4f01 Secret = 28d5ed9e308fe6953631e2bd8ba8d2f4b86033239a6a8247bcd55e42cf9b408d2fa289ec5482690c Label = 22b9d57575dcc31d0df658d1 Output = cac0c4ae9d70789ea6dec63cb290bc96 Salt = 7e9162b80d7f70a91f5c2db209f079cf63c0969a55bbe84c4caf1c6397c515068e307fa0458dd944e6dcb17725a91ae55e6e Secret = 4e3f4fa2994461d6f1d77f025828fa67f838bbe9597b7b24007e4751579c6d6c288de022f4131d59 Label = db53aecfc64227e771dc4e8a Output = 89fc93c05ca30f78ba2f8ca7c21d3b0c25136b66 Salt = 6d7eb49381befb89664bce0bd0f2fd174e9f83a9ecc87e15fe7f91bb83ee906f4ea512f5175feaee422f4a28a620d3e3878625c1097cb72a2676405d Secret = a638f635e763dff91f3191b4ea69e8eeecdae27537899b0ed3fdc6003cf545663f9dcee12298efd6 Label = 061ff514534d3814191297e7 Output = ff71a61e44de535a2e892d235daca2d8724a55ba7cd8a821 Salt = fc8d968d2892dea9ec20cc0207912c8d7fe713dfd7e9c9f91b1ca5ce57384b3edf975e6f368244320986ce23b185a1f7abb053c60a1ec8a8f2d94f4baba02c8ce4442b20d16e Secret = 039e9f561e6a07beb6b0fd7bc23c0fb25e2e62f3173115c7a12c40f1edbccc6403d2ec7def9a592b Label = 89b1ffd0e309d1767bbce6ce Output = 3e4bbc50ac69260ce0213ec43f293ab66a9305e16effd17ea525a38f Salt = 48471cef158f1761b0427c627057aaa45401e120566769697b7ff42f0ff3da1f1d496c8dd00897d18318e69726c334e1db41caea203e06444ee1a72f774e74ededca2249d5102b6e975b8b47db97e075 Secret = dfb046303b7fdb36ef8f35f37c6b27fb06debb309715b14518e0dac9414fd8a93d4efd2283dc3fdb Label = 9e629aaaf56e7a1121ec6965 Output = c789896cd14a45cc427ec9e7d87121bbc24d38c2df857617af475f62ef9f9ff4 Salt = 0abdbc020bf2c75c8dd32710fafad41bd2ffe2619e9bf67ec2e0b817bb9aee5b4597a9428463a39182f860bfd31f2889896a67e5a63f7ebe9ed49aeeabea34417e47b4c81efb2661c50afa703b3f4df3480394b11ab72609dfa1 Secret = 95c67352e996c0626b28dedeb80846da6768df0559522630a8350326b698a6b51a0b6d022c50ebc6 Label = fe80546d5f0019a325ff02a8 Output = 55e528942098aae048a0fb122323b8daa9efb4abe353c98d66013d34907d68cfe5a543fd Salt = a9e2f49b5c6b9032d8f5990db826ea3e1280a558a18bfc476d7b651df11d58459bd63a84e1873fd0df096b14f4c0d4ca103c9a9b054a886af79cfbaee9159e69e005d3f63cacb5331fd1e8056654ef50069241199af90815ebed4f60fd2e17526ec66898 Secret = 6f97ca4f8c61875fc452442aac903e3f6b63f229051428d26617b0ab7c127e098b7a9395eafe4844 Label = ba852ca1cd0cdccd87708338 Output = 0d317a18e498fe8e9f0dfa5130190d80db5eec6439d483108157b129d8be5c0a74032fb5321f28dd [SP800-56C(HMAC(SHA-512))] Salt = 36b6876d676c8567b81c Secret = 876039a028357f06ac7c979b514562e850c297859076b8feba0bc6bbdaec124d5395b8c738b4070a868b12c3ecede77b404b4c1ff07a7f1cf4173f9d76d6b587 Label = af61d372b433081bc96755e8 Output = 3b51763389 Salt = 91b58e65538804805b04847ef28cf83aa9a11888 Secret = 45d83073616cf9fe91303cfec0d304ff41805e7bf91adde35b94dc969020cca3af4431735616605ccf1a91d6766275d269b36f73f9ebf08fd10bf524845317ee Label = 98148d0b58581099ba1216a0 Output = a06e3b65b7a47eb1ba7c Salt = 54fc1274b8de282d063b64f07cbb17e96516a583bc6d3e1cc61d820c904e Secret = 227c8c3fe395ce3412c94b48a9e8b466c0403c935a5f166f05c493547f73ced325cc5f2a06959ac794c65b80b2783d69b69172948bc42b0138aa791a16cc7959 Label = b3c1a9bb90b3046fcde568a8 Output = bb46f155917ddb5da76c1ca2af5aa5 Salt = e97deb8064d3b11a945785fd2edd6634601ef263474921c7e325a5f7f2db03e9e3a51c039e75c73f Secret = a5a77ee3bb607b6b23b4ae6a786c61fc7b77966b30ddbd6804d946e175082dcc197ce5aea49d02f0dc3bda7ad25e823a932ccf8abc98f09cd1b34379e83e11f8 Label = 447b47f230508819cadbd9bb Output = 848f99b84c5cef918af72707b969fd8b4eefa5f7 Salt = 8a61b2df39258f3110229001fae9a48a2388a3da03282ea548e0d054aaa12c9db3d1b4e21f3e73ef2af908ac97cafa2c5415 Secret = 91162085deb5ca48c1b7dc624e11090928f05f15283c0b3980a63585fe0432cb4e8cbb702d91629d0f4f7152456b580de40491fff14c4c2fb44318816b41eb36 Label = 955281aceb9166f814a995e6 Output = 6c0fd21c8a1e0263d23e0777a62a0b8a2cc83b9f852612cdf6 Salt = 91ccb63536acb20e03313bcc7fadb4c85b2b023086c10b14395d5fcf77d35f2ce529ecd8b9355d33a222f6921f94c99a76ec437125cf93bdafd2bea0 Secret = 718089d09c9b767bd08a21dab8774b0decd9f752f56ca7626082e04f56d022b99f3045182c6045825dc7b0e2c53831d897544ea4d3eee8c4c783316d080ef72c Label = dd9d7e3163b794e70351365a Output = b5dc7546a804d6585e9e66f0adc3609b863812d56115f53da091297cfc71 Salt = 0be69cb82bf5c0cdd1d8c1bc34754f8be38679eaf5612a924f6b7e1e4a3a2852249f4df1180b50cb2affa71483d8234b8d92ea83f8f7049632ee0d235b4ab1a3235c5270bd42 Secret = 04b8eb02afb88419419bb87b5a93e1517f73983fd207979790e1cf654c34ba8ebc3178886f50475f9c1b729fa8f9ba9e3d538a11e483fd578ff46aae08305fa3 Label = 6f31a270d2e1a7045e3fd31e Output = 98d0e662639f3b95f88e1d62b1290becfe8f1927d64845b5d3d95075bcdd705bbf7edb Salt = 84feb63c7b952ca05553e115ed5214589064036ed50b553887b2c501ff28d4ba9f84057beb04b24eed8048f56493cee228cecfe53c299ce20af2d88794c8a26f781868481a460778d6ea7932e07a6117 Secret = 7d930466f32501a3e2d7db5ca1c0bdb8df77fcec3c02443211a9ca3a8938bce3ff9e043139e7d6a96a905979c3a0f664410c87062d9175db55487c544bc2be22 Label = 1bc5656ed7016cbe8d3e781c Output = 412f20c3715ab3a7fc0d2215c993c062fa25f7fb2357e5d9378401895cb0f214a792107d7a25f09a Salt = 085d11794daf67542aec5ab6d436a27a1a7697ac6a99a6929d143553f2aa179f4cb1c53d7c9d0d89ab4756fa557f88efc0605a991e1044444bb32b05bcff13d2ee5ae7ab3e97cce22d1471ed141f42aee3a7c02a5e917fa8dc7c Secret = 6194ddff65b4c611e1acf639cd7e0edde88858a044455f43ddecfcd6203bc0a855bb735aad112950841699827a71b00933fe8b3490bd4ac950bc20bba7a102c2 Label = 93035c91ce232f20987a9432 Output = b509b7d53139bf23c2e623dd2ba2d10e4b0c7236ada7d2864bb2241909dada426a26c21405976525f8edd91669 Salt = c1b4a76e62cefde289ab0af32dd4923b164188dc62084661fdbcb51a1cd0f47fede52b23c47799133fbeb12a8cc13159ee39e131c24d6f0d444ae7e6114c831b7c700c8c47e1fac275e63b674eeb89bb768deb20b0e9f1937a17e17c744344f255ffa32a Secret = bd076aaba5c050ddfc53559180270fd79ada6f513aee54c2c31c2c78e4511eaf6c5869bfe81732908cd7dffd79244342212de16569cb1e58ebde10aa9822a9f6 Label = 3d6d6946599b198cb8506a6c Output = 6a422b3207b1e4716bde589fdadbbbc2c74a0b61272c671b3b91c4afb5466a391fe1069a16e0c5faf98f10599776ff899599 botan-2.4.0/src/tests/data/kdf/tls_prf.vec000066400000000000000000000137541322470703100204070ustar00rootroot00000000000000[TLS-PRF] Secret = 6C81AF87ABD86BE83C37CE981F6BFE11BD53A8 Salt = A6D455CB1B2929E43D63CCE55CE89D66F252549729C19C1511 Output = A8 Secret = 6BB61D34AF2BCCF45A850850BCDE35E55A92BA Salt = 510194C9C9F90D98452FB914F636D5E5297C Output = 5E75 Secret = 3CC54F5F3EF82C93CE60EB62DC9DF005280DD1 Salt = 7FC24D382379A9CD54D53458947CB28E298A1DCC5EB2556F71ACAC1B Output = 706F52 Secret = BD3462DC587DFA992AE48BD7643B62A9971928 Salt = 9F6FAFED1F241A1E40ADEAF2AD80 Output = 841D7339 Secret = 1235A061FA3867B8E51511D1E672CE141E2FA6 Salt = 1026B9224FC59706BEADAE58EBD161FD2EAC Output = D856787D41 Secret = 63A22C3C7C5651103648F5CFC9764A7BDE821F Salt = 512FBF47D9DA2915 Output = F13096FEED6E Secret = AA15082F10F25EC4F96DFFE9DC3D80BBA6361B Salt = 519B87DB85FBE92FB4070F3BEF6E3D97DF69B66061EB83B4A334E8EEDC0F8E Output = B637FCADE57896 Secret = 775B727CE679B8696171C7BE60FC2E3F4DE516 Salt = 453C2549058B063C83E8B85E5CEF3570DF51B7D79B486F4F33 Output = 3431016193616501 Secret = AB299AD69DC581F13D86562AE2BE8B08015FF8 Salt = 5569FC Output = A624CC363499B1EA64 Secret = AE4947624D877916E5B01EDDAB8E4CDC817630 Salt = 7FDE51EFB4044017C95E3608F8FB6F Output = 5B908EB5B2A7F115CF57 Secret = 4F13EB6FBE1FA2FCD7B5B21C9F20980D1986A4 Salt = 514DBCE520AB34 Output = EE73EEE90E35AF2BC3575D Secret = 41BC094049008CBAE99CAC0BA901D0B2DD15DF Salt = CB6C0544FF8CF74C71E910F2220D54C509DC442CB3 Output = BD859DAE2729A348774146B5 Secret = 95751B37945DD9DE515B45927A229AAB40F7D0 Salt = 75318F49A11F42A24AF48267411FDD0831 Output = FE310AF0913149D53718AC53E5 Secret = FC250F36E5C1365C3EAD122E63F90612DBBDA7 Salt = 8A4B5AEA3AC0B2FF777D77B5EFB6E7D8AF Output = C0107D144E53227EDE5E677A35BE Secret = F6A8A67ACA60F25080100F3F5C928038936E57 Salt = F8B663768421BA77861F1EBEBF4C8341DC01ED1F7D4B054B7C Output = A1FCD686295E3DE32C438A8FFD63CE Secret = 77BF131D53997B1FB2ACE2137E26992B36BF3E Salt = 859D1EE9A694865ECC1830C361D24485AC1026 Output = 60D0A09FCFDE24AB73F62A7C9F594766 Secret = 39CF412177DD47B8E97A4D92D104138CD4E41C Salt = 9CD35F26E8A89C25410B3394A957B781BBD0D190DA Output = F7D49D2C112F3EE64411F50B264AE15BB4 Secret = 5C40AF252D0A4F445E638D954993BCB0673281 Salt = 2DFB810DC9ED5B291754144937E6052666D476D1F5F94C Output = FDA100D44E2F839C21199A56ACAF57454C21 Secret = 2A8B07B082F2A4C95611B20685A4410E90B8D2 Salt = 320ADFA586F7EBF346646DE9 Output = A5CCE186AFDB9C0EB664C719DD1A69C1BA6059 Secret = BCBD1EFDA490B9D541BA9DF50FE9A451DD0313 Salt = 255230A341E671BC31B1 Output = 2291E19459725562F106F63FE2F81E73BA23F04A Secret = B361B123993602D0BA62567BF9B81992DB108EAE Salt = 20878A3A703785DE37846086C097619E9823F7FCD2B7B3A9466FA6 Output = A71CB3E9C58E83414D69775CF7127E9C95AF10B7E2 Secret = 8E7CC0EED8BFF691B370C08FE0DB32D06700B088 Salt = 02F3B9155F5CFF08B9F47A2FDC701BA3F08BCDDF21292911D06FC0A5A99B Output = 25DA6B3027CBBCA4352EFB85D3FCB9060285BC39ECB8 Secret = 041CC7ED27C01A701A0F15269DA6CA6D806B10C3 Salt = 8E5F4FADE80AF92D495AF5A50C8E Output = E3B7F0D721C05663166B43A75F2997F9F029886FC069D0 Secret = A7421C0D96D2455E57408C2BF02E86DCEE71B060 Salt = BD2623716653B538C885FA2ED4B0A2 Output = 46948B1DD4C7977AA7241ABD74A88E7838E575DD34AA9B75 Secret = 56DAD2D1AF95F938E073D10A1A779F80BB0F76FE Salt = D1DA1DEF7BD5C327894B7A992AA7A694664470F642 Output = 53B1169FA52AABC427D1C41501B612DF6D726F55DAD9D246E9 Secret = 4F2E4F77820A686894B90A0AFD0ABA772D0CC6B0 Salt = 062577E22854BAF0E68A51A27644FFB0 Output = 30ED285AE596143BE7998901C2F35530D81CA4DD14E03D17DF2C Secret = 86173BD0F3C5E7052482B53BD8604E197112F3D8 Salt = 12B4E5F24ADC8A Output = BB3BD1CBFA7889441E930C4B5E8EC7AB00D9612E9D762D42427AD9 Secret = 2B9CE8B0AB3041D6A1803BDD342E6537E40BE305 Salt = 517D3D00850F48912B713E653CB4F38703B6A6 Output = 88F8AFCB8109C7B359B18CCED73A1B09404CC9EABB23695BF353ED9E Secret = 819CB722AA4475D8301A8E24DCD9D82DF2B081F4 Salt = 56872A31A10E8C Output = 83FD6F33AD11819019E086F0683E26D59D57C9E5AF26C81738E44D47A3 Secret = 80F1F9B0D05F41C448E5306E41833918B9E688ED Salt = 6175CDE230DF6691F4E8A36B265C53CAD736AD6F34F895D5C6633D66B5 Output = 0C00B5F50565FDD5345C63773D5FCC8B3C8E412DFFF23B95490EFB4E53FA Secret = 0AE876A7BB96C24CEFA6ED53CEE7B0A41B8FF7B3 Salt = Output = 881B99C3E43B1A42F096CF556D3143D5C5DBC4E984D26C5F3075BCB08B73DA Secret = 2212169D33FADC6FF94A3E5E0020587953CF1964 Salt = FCD5C9637A21E43F3CFF6ECF65B6E2F97933779F101AD6 Output = 1E1C646C2BFBDC62FA4C81F1D0781F5F269D3F45E5C33CAC8A2640226C8C5D16 # TLS 1.2 PRF vectors from https://www.ietf.org/mail-archive/web/tls/current/msg03416.html [TLS-12-PRF(HMAC(SHA-224))] Secret = e18828740352b530d69b34c6597dea2e Salt = f5a3fe6d34e2e28560fdcaf6823f9091 Label = 74657374206c6162656c Output = 224d8af3c0453393a9779789d21cf7da5ee62ae6b617873d489428efc8dd58d1566e7029e2ca3a5ecd355dc64d4d927e2fbd78c4233e8604b14749a77a92a70fddf614bc0df623d798604e4ca5512794d802a258e82f86cf [TLS-12-PRF(HMAC(SHA-256))] Secret = 9bbe436ba940f017b17652849a71db35 Salt = a0ba9f936cda311827a6f796ffd5198c Label = 74657374206c6162656c Output = e3f229ba727be17b8d122620557cd453c2aab21d07c3d495329b52d4e61edb5a6b301791e90d35c9c9a46b4e14baf9af0fa022f7077def17abfd3797c0564bab4fbc91666e9def9b97fce34f796789baa48082d122ee42c5a72e5a5110fff70187347b66 [TLS-12-PRF(HMAC(SHA-384))] Secret = b80b733d6ceefcdc71566ea48e5567df Salt = cd665cf6a8447dd6ff8b27555edb7465 Label = 74657374206c6162656c Output = 7b0c18e9ced410ed1804f2cfa34a336a1c14dffb4900bb5fd7942107e81c83cde9ca0faa60be9fe34f82b1233c9146a0e534cb400fed2700884f9dc236f80edd8bfa961144c9e8d792eca722a7b32fc3d416d473ebc2c5fd4abfdad05d9184259b5bf8cd4d90fa0d31e2dec479e4f1a26066f2eea9a69236a3e52655c9e9aee691c8f3a26854308d5eaa3be85e0990703d73e56f [TLS-12-PRF(HMAC(SHA-512))] Secret = b0323523c1853599584d88568bbb05eb Salt = d4640e12e4bcdbfb437f03e6ae418ee5 Label = 74657374206c6162656c Output = 1261f588c798c5c201ff036e7a9cb5edcd7fe3f94c669a122a4638d7d508b283042df6789875c7147e906d868bc75c45e20eb40c1cf4a1713b27371f68432592f7dc8ea8ef223e12ea8507841311bf68653d0cfc4056d811f025c45ddfa6e6fec702f054b409d6f28dd0a3233e498da41a3e75c5630eedbe22fe254e33a1b0e9f6b9826675bec7d01a845658dc9c397545401d40b9f46c7a400ee1b8f81ca0a60d1a397a1028bff5d2ef5066126842fb8da4197632bdb54ff6633f86bbc836e640d4d898 botan-2.4.0/src/tests/data/kdf/x942_prf.vec000066400000000000000000000011051322470703100202760ustar00rootroot00000000000000 [X9.42-PRF(1.2.840.113549.1.9.16.3.6)] Secret = 000102030405060708090A0B0C0D0E0F10111213 Salt = Output = A09661392376F7044D9052A397883246B67F5F1EF63EB5FB [X9.42-PRF(1.2.840.113549.1.9.16.3.7)] Secret = 000102030405060708090A0B0C0D0E0F10111213 Salt = 0123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA98765432010123456789ABCDEFFEDCBA9876543201 Output = 48950C46E0530075403CCE72889604E0 [X9.42-PRF(1.2.840.113549.1.9.16.3.6)] Secret = 000102030405060708090A0B0C0D0E0F10111213 Salt = Output = A09661392376F7044D9052A397883246B67F5F1EF63EB5FB botan-2.4.0/src/tests/data/keywrap/000077500000000000000000000000001322470703100171435ustar00rootroot00000000000000botan-2.4.0/src/tests/data/keywrap/nist_key_wrap.vec000066400000000000000000001265711322470703100225340ustar00rootroot00000000000000 [KW] Input = 00112233445566778899AABBCCDDEEFF Key = 000102030405060708090A0B0C0D0E0F Output = 1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5 Input = 00112233445566778899AABBCCDDEEFF Key = 000102030405060708090A0B0C0D0E0F1011121314151617 Output = 96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D Input = 00112233445566778899AABBCCDDEEFF Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = 64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7 Input = 00112233445566778899AABBCCDDEEFF0001020304050607 Key = 000102030405060708090A0B0C0D0E0F1011121314151617 Output = 031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2 Input = 00112233445566778899AABBCCDDEEFF0001020304050607 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1 Input = 00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = 28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21 [KWP] # From RFC 5649 Key = 5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8 Input = c37b7e6492584340bed12207808941155068f738 Output = 138bdeaa9b8fa7fc61f97742e72248ee5ae6ae5360d1ae6a5f54f373fa543b6a Key = 5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8 Input = 466f7250617369 Output = afbeb0f07dfbf5419200f2ccb50bb24f # Following values generated by OpenSSL Key = 00000000000000000000000000000000 Input = 00 Output = A9D2D4394815D53F2799ABD7E51D2C8B Key = 00000000000000000000000000000000 Input = 0001 Output = 36D0CA197F638BF478D022C7E543B699 Key = 00000000000000000000000000000000 Input = 000102 Output = DAB4EE2853E1C44C5E553E644143902B Key = 00000000000000000000000000000000 Input = 00010203 Output = 446C037F831092B147C372616357BF7D Key = 00000000000000000000000000000000 Input = 0001020304 Output = 9ED0AF6457B82E0DDADBD2240A303D74 Key = 00000000000000000000000000000000 Input = 000102030405 Output = D863A8CE0DF301A564945259B4F74E7D Key = 00000000000000000000000000000000 Input = 00010203040506 Output = E8387E5456242B0C30BE77FC1FF0C1FD Key = 00000000000000000000000000000000 Input = 0001020304050607 Output = 01FF4C430CDF3D2D815B0972B23D7C35 Key = 00000000000000000000000000000000 Input = 000102030405060708 Output = C06E2163E0CC845B348E012AC9413DEEE40C8C3B030A3681 Key = 00000000000000000000000000000000 Input = 00010203040506070809 Output = 3DFD2F643C38B07E121C77C2CA0EF82DA742B0989B6D848E Key = 00000000000000000000000000000000 Input = 000102030405060708090A Output = AFAEF390634E21E754FD09F55A4EDD918A1D23ECA9B76F2B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B Output = A42D14C830F64F0A73570BFA7FDF8DDDD5E3AD3065A09FB0 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C Output = 83F23527625FC643942279D090C1B61D10FC978B54D778CD Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D Output = E073C30E0DAC595F9FD28A0CB9E53945B26D1E1DE4E66D04 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E Output = 64E3C2F7E0F7CB297C6B8C4CAF665F9F0A3F7082D2522635 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F Output = 8F5982C7D265A0A40FC81D2326429A0A65BCD1368F0E16CB Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F10 Output = E29EC6664BCBA00986DD9845F8C4B26472BFDDF98522E537B5D23D5D2A8D02C5 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F1011 Output = 9451ABCA0B9756A183F8C9ADA834E1AD2400B693C33624E59F26C35AC1586E2B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112 Output = F03CB49A65FD3EF8FC83C52F029A3D73667D5B84DB429C38436619ED8320D12E Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F10111213 Output = 759524B855037849812D62979A18F24D3E672C2663DEA9204BA5A639FB7DB292 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F1011121314 Output = F352B8228FBFA0769C2E3858D7451FA603E9B751CFE780ED0F93C850C7870259 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415 Output = 3491F4C8D916A1BC3824D1478EC746BE8C837415017ED52A1ABC30FB14DDE825 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F10111213141516 Output = 0E6E35C5B9D706C2FF2C4C6CFCF254849879D6C1CB577E0A73BB12CBC7AC9740 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F1011121314151617 Output = E7DB580663B113B57489E1107F2DCAF7CF80629E7CE1839E1ED044ECD0299E79 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718 Output = 883500DB91747BAD8C5E122ED2338F3BCB6B43064F5DA9D1303E165815EC8CC4C5BFD31AEAE1B6A3 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F10111213141516171819 Output = 24099AAAD4F19BF614ECC35DA9E3646F73AAFAA9C46975D4B56D72A332AF7EC4850B8294D94B7E1A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A Output = C24F8CCE3425AC9638145A0DAC28B59368583FF3A7AAD85FBE1AEAAB5D23C0B128A1F9BC575B785A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B Output = EFD0BC7612331A98F2D68F86E606717197BF57E35114234C675D40E9462ACF00DE7860C0F38677F7 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Output = 89171C602A315AD27EE1C7F903DCD08F48FF02D97EC59A079E9180B26F17BB010D8E56B3CDBF9006 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D Output = 0AC1B4937C438DDE64E6733A70D3F1BF99393B2A3E6B42ABBCE6A8ECBB1F0665DCDC62530739E8FD Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E Output = 3A4553B4613F602B0BFC11609616744CC99CAD4B1CA1FFC6568DF20FD2DC0B020CFC1E6ABD2820D4 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = 353B0F55E3569A4F11AC5434F94D9C4ADFAC2E289F98B6564FB7DF0EC116E77493C176868DBA1F6C Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 Output = B42ECF577992FFE257548A1BD920E8A2648EED647675B407A0E730C658AB3E917C284A6C4DF847E4D783A3BC614A2630 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 Output = 06D4BA477CD212C49B78C00D231FCCF7DAAE65742D889EE6C828D87D3C604EF3A14A95DE45EC537B7AC83B78C1CCACA3 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 Output = B056D034313D327E2A39E0930C0E43D79CA0A28F3323CD70AB19B381A0D71BB1AF7AB177B0D66B8DBE32178714917A7D Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 Output = DE3AD3A933A842B574767B7C6A7FB28F442EA3C94DF7BB81C38F392CFEB8B313E999E3A8248204499A051CE50EDEC5AA Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 Output = 3F6EB078FAF08FA5D3BE87EE047CF1ECBAE7FC70753DB67EB63B0A073E73847AD200BD241C91CB87BED689CF8F75C93B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425 Output = 445C7209CD605AAEF330EA0C5A6469728AD6B10C510F0CC59DDF26927E11FC5F2D0DC1375541A1F55BAF356D7EE53500 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 Output = 122A43F6FCF53F48127FB59F3F9CE1C6621F6B6342569908796AE1CF6E5F27BEA025E35ADDBC3B055DD365AB61485905 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627 Output = EAA9E4B5B6372DE37C283D751F0376E4BEAAED1F98FE31DA171910D66CF839AB8FE11AB892806F04AE4E217847802FD1 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728 Output = 8DABB66ADB361581E5D68EF8A17A09D74A685F7507298362103F5853F9475F21434019F2E92485DA19D2B11F75CF90734231C1421290975C Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526272829 Output = FC8D65BBCB5912874DF58EA60DD63D0E16951C10B05AC069A9764A11276D6AB8C968DA01674F230376F8FE6BEA8473A14D3C79EAEC52E003 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A Output = 603C4F13DB9F651AC3DD6A3AC6CE056BE605C6D72E708A8424C451BD2C24F63352FA2BB693947689D2626CF273762E5FAEE361D793AF819F Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B Output = CA10E89057844F6E968DC6A75125621FB6FA779D3D1773ED99891694B19D28B9C9B234EC7135A585AFFDBFA85E813EE54A22938D2B89FCD1 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C Output = 6C64643E7386B22E2D0BDDE6E812DCAC90F3417D933E057725BDCA8253EF1868AC7152DE08668515DD136E476B00BDFA2F5DEEE0FA23D42D Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D Output = 2FB135455B08C6EF5C7E835F09DC55078B3BF0B79C72308A25F5437DAD770A59D4E63EFBBA77E7C6A6316005E35082DDE15FD616A3EACEC1 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E Output = EFDB7BC1EC888B698FA3190BDA302D68E4C854CE38E67790CF661BBC394AB2113BDE3AE202259490253B08FC7BDA36DF0C8DF62E0BBD3AEC Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F Output = 6FB04EFCAE2CDC3B46A8A9C9834A28B1437C2E755BC594460E0621B46BBE0F5D4BBE181502EC9142F71A4A5B0871EE62E8BD5DF4BAF87357 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30 Output = F0410A66EE0E4B9913243184284A7473B5E80E59149F23D2F85D5C58329678ADD62EF6038E1153B61772E3F5A7D2E2A65066663FE3B30D3F6D79F0EACBFFB307 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031 Output = 9EA24A531B21B1D12AA0EF0CD620E46CCF557142ABC2DA7601C6D9C597D16C0CAD842ED4C791EEAAE9AC06AD66B58A44ACA0989B4ED09D9B1D1C07FF705E775C Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132 Output = A3946C7481A0439B552DAAC3C804A9F9909CD5DAF5D5EC3EDA0D31AE5D99B541FB4D487C7588A786143E36002050C5F8E2DF0864708296F7CA1178588D252D66 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 Output = 3389BE82398B80DC86C88B506654437B51528119C26BCDF1F3A6470DF96B5A89D012B7ED0E58508BD244622E3AD919E22A2DB902A53336CF69ACD362194EF788 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334 Output = 2E206446A99B6F07DB75253AEB0ACA89CE55811509AA969BFE2952720FE1BD8CE840C2FE6E3E48E730B7B9856AC28D2941EADBC39F829567EECF8EE70A9FEA20 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435 Output = EB6ECD5B0DEAEB3D61B9DF8581202E272591BF19F3EE052FAA217C5CD96AE15882ECD934D1CF15F2CD5CAD48E46DF1B889C756834FC9067B4BBCE71EF7FBE2CE Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536 Output = 09EA967289A07CD184AB68484799B58A1AD4E47DD0FC1612480695F0CEA62A019D7DB9184DCBA2FA871B8D7F0A21B07DDB1D79A9912C4278A6C10517D6FE7607 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 Output = B7B16D760E94318547FDCED193613311BB4C228544EB0D0026A3BFF85440411CECED8E9B72B2B088446E792058C5BEDEEAE42B622C97E7305DB06F49C06DBEEF Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738 Output = D90841D6B936480461BF2D77FCC3FADF20177A3707FE0A47153271F05BEE51AF1D5B9EC466B1B43A45DC8E439924B6CE3BFD28EA33337036713FEFA82164986696ED78F14E9C3965 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536373839 Output = 1EF61764EEF8B3A532C0CD60D01078719EA74AF30DCAE28A7508A30CB3EFE4352C315DD68C329C967975A8344C99D3234A056040860390416B387DC263396F7EFDEF5A5B92A6C4AD Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A Output = A591BB3882464EDC11416ECA7995B7488EA8F1B89AFFCDE6FCDDDE60FDD45F51BB238A9503C7AACF750D8024F5B1DD39655558958585BDC842D07A34C35BB04719CC784212DED785 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B Output = DCB4F791FB0C1867D90AF107256020B66E8ED09B898E626CCDCD55F5503774CADDC3B84E87A91E3CE749EC35A47E25F0C19B9C4C7D9705EA36EDF0D748471849AD61A8769685B2D7 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C Output = 0AA8C1E34B37FDC58A1A9934BD14B523F20B6AB32F3AAC273E625081015A6E8CE95C891F522AFE87E580AB393CB8942E24DBE812DF74DB93029744184D144692701188BFFEB6E141 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D Output = 9EEC100B358284F4E24AEECD3F3A87ACF45A67FB9FA46D5F77BC4F7272E544B2D7329A56AEAFBC668FABA50D73A37B00300DE3186AAD77949E28C12A04B65192225A9ED929FCF5E1 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E Output = E5D51A1C59E955797CD79E962851315E788A72AFC17B003963A64D4713EF93D370129780ECACD566A9DE9AF289ECDF46FDA257D73658383C0C052EB9C70D034E29209568BF144D72 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F Output = 3199D2B70CE5CDC5DD62F0CB48B1DE3EF07C836C49975841C7B972E661899A1CDA28253BCA33FEB3697C434CECF3EC76D979A3DFC3D862E22758A6B2468752249D2AA0B30EA2A447 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40 Output = C1C6E77BF5D31BC960ED2045165DB2D6A73283B5511121055773EF2A241E7FD0CE61A71F11CA6488C73945970CB684F5E009CC86A1D3EB0BA5F294ABEE29B3D4424005F21E096EDF105088BF69908455 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 Output = 59C0B44AF3C63A77E8010B03463C261C03960B4BD0F1AEE7EB0EC2D0E7EBDD08E28FB8C41F24DD4FFC3EEA78C5800714CB4A963A9489E8017362BE33AEB2CF6D9231AE39641A2760E9E5265780FAC82A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142 Output = 72F38DBAE62DF7CB17D0E1BAF464224BC54A1C49D10FCAA70877F40B429384C8BEFC18EDBD9A65713A984151F97C3B0F2FA4D6127AE4FC8BED3DBD3A7073CBA8F174284DECE60D1556F8E5957D7881BC Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 Output = 1EADC50143A9A33DF1901C1BE115B9EE408561B03A7D0BACA7EE2698FA16485699BBC0D1C8BC74D87ADABB50CBB87976965CB01CFBA67035DC3189E98550B0C3902E1271313C81265F4521A732451E7B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344 Output = 4182301DA5BE6417C384943AFFF69A8B80AA7B2DECB55C1A9C29328B8CD16BC9540DB5B5FA751CE1B217E66E51E7168D269DCDB3E6130929DCB5E1741B31E439FC87D2AD81556E1E788BE8F0B370323A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445 Output = CD07B672EF635F47FD386FA62A8879FC304C8C2454CFAEAD21FB47FE30E4A4EC4ADD7C1EAB44D261B5DC18FB4EFFCDC56074D7B395E6559E9D5280B523E84A99862AD0BFE66D6980D0F59C56FC229773 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546 Output = 69DBA0FB08140943E3FE98E4178646C6CC0B1B44585187CC1688AF21A140CB4BCFA8D370EBC00B612C21FF95FC32FDB3D089BC2F5812139864500D30D8F25D2DCA579439542906CF0C1AFB424A7A2D95 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647 Output = E852B1E41E680E45CA8428DDE1A4B4D77C620E6F4EB4EB757C69BBB44EB66EE09F5EE6271F6933253C3D2BA20CDA9C5F22E7445DFFE598790C6BF1E3DB70A2B42707CB8CA0A0D28CD3ED32DFD1E1227E Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748 Output = 5FD7FE77D721DA369BA9CFEB4548AF21518A088DF3951960A6ECA5CD52FFF0A5A89E3A0BD6609C7B40230E31173898A82B685F40E001A67D1F4B8619C6E537A9E03D8D620BF8086CE2F6A81322A6026C1A6585CC12D41D58 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243444546474849 Output = 775509D94509D50839D8D4BCA6624F1DFC873CEC61EAF254DDC5BEDE233026E10625D7D5CF8BEB1C8518829E659F816FF1BE2D029390FE57FCEEBE1E3208C0D250C1F966C8E3FF27A4964E250AB7D732FF670B0E54EA4676 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A Output = 862892008B4E499C6C6635CE7BA728DD25A6A83C043B66B6B5CE36028B72D3245F5B84BF22D7415BCE41F21D2104A43EBDBEEBD8D138AC4D15E32AD27A7FA88B91AEDFC382194ED728F09738B24F5413A74C0E0B13B4277F Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B Output = 8F4F512116100D0ED926D1645ABFE94E00D126F0E9429A00CA69E8CCA1C8E70A7F4DF6F9B0AE1CBCB40BE2B05086B4A6F1B101E65187C71B91401B49AF313A593EF01B96855DB1ACDFD809D60DA8B1A682543D7F6AD6C337 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C Output = F9DD0B7980B4114126972D2ED6208E3FDD95B2A767C4050C16063E7433E3085C148221376F5209FD6AACC359653D2ED254A987C35F1D440F00A39E2B14A8D8DD11ACBBD635C0A76B6628A63B12183F2138A0DA32C074AA82 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D Output = 863710066B206EBF4035E0B8413D6A94872766EE52155624E9719A16769A975A5EF0595F3816B7993BAF035AE10D205DA4DEC0EE3AF5210582DFA063D347565B332ADF99459BB718928478F334F249B4B38FF8F7B2D2E813 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E Output = 6E1C71E71669D7CCC469DBA5342B6C14192A0E25A086352A3DD4558A12E1C348FDB1923C31C63F560C08F963B50D4BE52C21989B7A6D83AA14CA8A6089124734734AC4CF4F4C6AC2721D76BCB811F91507E975E4058F1FAF Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F Output = 518BF14BE0D60D53D184D05068C0795E6AB1846949937546886552F23581A4A934DB2496731E93BDCFD43A78343FBEFDBC8A8B55D5E1A94AD03EEF07BFD32CEECA1A8816BEE47B846E4A368A30D64C10B993CC041EA69073 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50 Output = B1BC96690224BEAF3F51EE319CE697E8DAF7A666B676239F7C32B7FFE63040F601B8EDEF54D90B243A39C9CD56CDD3AC14CBE89F45D5958798F7DAB6B6F2092FC38F1D5BDA51F06ED67B75AF2587015B1AD21C10C63ACBFB0707D5CC651F8458 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051 Output = 649D67FEF0AE7432B793DE16B3C27598088E87DFD1A4CDA952703412B3828DBA04F9188FD823C03F6221DDBAD16C3728D40FFA2FD88DB52964E556B28D5CE532A52DAC53C7C3258FF2EE12CE901825372A01DCFCAA07C0B55773532838D9CDF0 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 Output = 997555B6E7CBDF2D1A010AA7865CA84781A2FA2C4F32762D234A0895BC62004B6BDEE39953B6236B0889147398A8BFDD609D92531325E4B7926DA0B06CD9026B032A929F6172DDCB99C6D42D35F9FC94D6C3ADAF0522D5F3D05217405645FB16 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253 Output = 7B8582D74051A6DB1B7483D26E0612B86E55ED0CBB7BA88A676049F6DE0EF4C9C4D719B66DECF1A5E6F23653B705E6BF9BDBF423F905944E51D65D1DC792A2D3554B4C427E9CA40B4C406AAF58ED611109F97DE8B05B1ACA8F9C76118F2AA925 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354 Output = BA9D1128654C32AC040C7B8460774CADB9E38D9EA07D034FA83516D9E06802FB55F5872C16EF5695EAF6C6A9DAEEE83748793843F213C54A778D4524C72C5ADF5F02801FB2F6C2FC9EC4B8299A42BC33BEA4C7DDEB6A5CF492F4F757ED9A3A86 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455 Output = DBEB24A8A1198084F973517C8457DB028ED6DB5D1E3D97AE75F1E33EF7D63148DD60AF68F6378E04CE46D6B466C46F4089AA94C36FB0BE591E8D41547A55534E3B004CE4AABE1890B258317EEA581682D9DA7891B2A3AD5186E579B7403A6910 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556 Output = 9325A7B4B743ADBDEB4F8E9BF92672CBD3E6D29AED20B24415B8D8ADFF2C7652573401BBF7C45386AC6D93F70BFCFF2351489EFDA6720EB9C1BAADFE1D52CED1D0754B5F00EDC1CD8AE4654EB2E0215FC694E64B32A09CF7DA0FCCE5875E0A90 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F5051525354555657 Output = D3CB65301588CB2820595CE0C0BA899E5A530A4BEEB29DAAB1D26BBAFE35A0A010E3D17A7BF87B3910465FCDA89BDF4EF564A4D801F31878A56625BCA8F55C2EE3ECDB754060DEADCFDDB8F9D11FBD6B7D2B44F6B016C350D04666584C1547CE Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758 Output = 2DD836C8BDE95C111E549F7199096ADB2F7452E6986B8E736BD89EC01ABA1E8EC2DE7FD9F65FEFD42E5C572C61C5308CA673CD24C499037D8B7A33A35277526E83719D205E3DB0E79815D322D6A14388661D5B6A31D831AC76593D27944539C1FCC5440E0E42E53B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F50515253545556575859 Output = DDB5299481F0419C5672D08DD6AFD92781D05095A9CB9F5F978A892D77615ED7ADF00B9A4B038E450EAF3BC12A38567E3A7732DA9DFFA6B18B341EBA79299C5855138B70DA6E5D3D859F510ECA7F9E0921E433C8814C5B07BEFEB48301A4F3945D7AC995DDDC529F Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A Output = 4DB58952C398ED8D77C3B4E3677E4E2A282CA36C30B0590765061A2D849884738EE94521B3DEAC18CA8908C6BA8198ED8879BB7EA1B09E06E3770C2F92F1AFCE547DC30F761E568F496D5569FA9540D721F273B789919F3FA0BB10AF07D4C540DBEB8BDF2F939917 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B Output = BB64F4A30DB269B6EC84E406E5C4706EEEA94370AD65736BEBDD945F5FD3AA85C22D74B47EC086093AEBFBF7A1E671ECA57A3E055AEB0C4B622B81A38EC6C3A1B5341E176AA8ABE20170C5A2B4CAAAF83E55DBC6B4E12339A53C116016EC806432E8198786EB4F4F Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C Output = C293A47B576F6FCFC00A6E46D0C3BECAA9B2EAE0C043980AA45C87A8CF26472A6925F0EC62F18FC782D69FC9CDE34B8385E6EF343B7BC9BFBD5C6D9FFDF5E49649984C1E8D4238D5F15E75D928610E02BD590F5247EF85486BF327E59D2078E002C9207EF714E705 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D Output = 3D4522574E9F3E495ADF7154555128FF59252FB5BB992568E3E9D7D22D9FAA288DB70C931CBFC5A2DA5FB89AF6BEBB0B703101E885677E885D8AA921E05689615E98A00182CF683BB36F2CF29A7C7432CA389587B6AB0AEE4165DDD3988A84B207F5FF22E12319FC Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E Output = ADC07AD97AF4791C34CDCA604E787EF8519B1E82B69FA76F8BD561ADD476AD5C5ED35E9E2D4E5A8F69DBD5A4AF7F3B7C1C719F153BDF740B7C93C104FA44E9A695BF1AAFF7EA153A12CA7C2F7F09E7FF82D9934585347D2821D6D881AF14BFD4A596D2A5175E992D Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F Output = E3A87C98F63177B4AEBCD213BB5599EE5691FD97A642D5F952DDF6DA711E3CFE64A8C04F348FEF20CDA5310DAD3214F0205749EF8AAC76C46CC9699C86EFEC02678DA53C6B1F2B72FC3FA3A8F6BA9B73E23E351F924831E8D7FBA13F9124CCC03D0383C092656027 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 Output = 1FD0A6C2E7496670A1FC367BBADAF2F1662E99837DBE2D65D8FE395B195CCBC07B34E843277562E13F908889D727EFCC45C13B90F87E7E6F4E4C8B2A51D4E085D221CE31B9E6EF1DDC68E832F510CD25B3043908A45C3E13F303C25491CCF3684D4E61FC1B2A0C5AF84A1CDE26CCD430 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 Output = 50E0D46EF0669E88808EB80B40B7E7A5BC93A4AE5DCE984BF3F6B8578441DF3236B8E9EA832B17F31E35105B0C3E66268D5749D9120C7D44655C8B318329FC41282BD3E776F0349138CD4B0ECCEB19D9F81BB5C095E8E115D6CC1438CA87922B2B40BCA4C84E501769066EF392B37DC0 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 Output = 1B69450C2540AA9FAACF0620A1F17565FE19D5C9150F4669E0B0D4B653FBA06DCF2291F9DB3B0BA9A9C00DAC7183AD9C4E0193F941C9451B2B9F80A89A4269525EFBE65D378AE2214EC3494A1A3029A0DE632C293ADEAD59AF250AC5604FCE40729BA7AE11407AB45382DB4A70F7B409 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 Output = 4AB48AAF9B1A82C1A41DEF775C4FDBB2AFA918B12607F8A27B91CEADA784DBEA27D3A427AC44436B9377632FCD0AD89D61F090C98A4055811ABE99D24137BBDDEBC8AA6D9781871CDDFBF35868E22FF7FB2167E6B08931C4BD8992DE6EB9A050D58DF8747550136BE664A9E5D410E90B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 Output = 9F3DBCF9DF717D45E73B834ED3C82D3DA01CCC566F8DD7CBC1946383660C1CD7748C9CB8E8C50D11D94E9B4F2BEAE2DE8AFED2864F6601FA479A77359BB77493C2DDC2D7F1480882DB03140E716765A6A0483C53557609EE9D378EC53A9901B7ABF08B088B77B8F4729C81965E8C777C Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 Output = 00D45FE14E3D338187B9119EE7672BC31425BB5983CED91A7F417A0A449D5A813EDC86ACE59A09654D1F3BC05A9E32DA138E8D1D206F58468291DE5943DB9133C5E47BA79E0BC665E839E01000C4317260E5EAD914C3B3FFA15C9638734CA71EAC37AF1B80F1C1045D49933E43B93FD1 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 Output = 9EAE24ED81F3B829763EBA904EAFE5A12A7212526DAF6441A53C8E9EF1608E0C8AB69BD5DB988105FF6029904CDC26357F53DD96457723748FE23E1DAE0B68692C8320CC62AFCE75C4D1BC6DDA07219F745AAC398960CE494CBE683B11DD49011B5E0CB353DF37E34D48278C06E3B9CB Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 Output = 103E6859FA00EBBDF653FFEDEB45E8630A827D6E07B149ADC1DF74B41B3A4C3A2615E128E13610994A99EBA68A3F0B70964738AB9A4BFE5E057BABE30EE1FC9C4CD683CEC27DF9A20C72B5CAFC95400E7AC1BC951412C0E345A085662726780C132C7AA5C1CDE3B62D2647A346CF65D3 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 Output = 3074F4F18FDF69EBB6D9A9BD5D4E69D01E5EB2F061E291A496D45FAB0DA4A473DC29606493331A928938B6DDB99A6550B03993E673D769FDC0180734A5929445AD607930676BFD50D76453BC1C9B5842B0E05AFF04843BA444302BC7C12CC068D4C0EA5AB686558956CE2568F76CC7B950923C022188DE1A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 Output = 24216B02FD43B829FF427C5141B2518DEA38E2374E8DC75647B0CACCCDDE3795219DAA28DC538A62A661553827120459EA88856CF1A74C9BA569D0689087E3EA5FA2AD8D359032D2EDC84823F5FCE389E09D5543DC1AC387AB9022F9B2FFC8C088231D5052D9CC2C5756496E65E55ABCA3667851A842714C Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A Output = 59039CDBE79604BC8ACC0B5D6EC5725F96E65980F9FBF450772632ECE1EEF9CDDC634D97AF621299F084FB19D63203F35470614DFFFF84D96368A4006FD5FBF20D9D75B0CC4FF80BD0614327757664670B1E8DCA038BD5BF65C3DBC7FDB619E65E0DD3FA1BBE24AD9313A4EB2F15F54C74167C6C73ED6516 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B Output = 0A51B1C2AC0406C5BE85E5F8727309DE78C6124FD917D12C8EEA624527D42FD9615F2E0697E10A129BDDE1F1E38128A4C3AEA8B910A0F8406C31C79986825EFD9F09D80DB0B91EACF0F4AAAC0032EF1CB6CBC0F548BAAEFB218B5D1634D7369B1D77F197BB2E7498ED0A3CB141D77336B642DACF31D5457A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C Output = F664CE868579486A99025A42697622757287A581D93624868D38ABF4373E7EEF4E12D1A76396A0C0F4D7CBD21E4CB1D98EF8BBD4926C96EDC48A7880050D16BD5A957CA3B140ED14BF66F9A377F34992DBAF39BE45B99C0325C09D272912B9004192E233F43D35BE68610E130D8C8C1488F1F0EBDBD6134A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D Output = 9082A582F7757F130DEDAE224FB38D1CFB0C21D2381A5D85052197217B1866769EB3B2B54B213CC8F8790DFF6A17AE2F88BE707AE27526367AE44A95926C7390F8EB36F473BD682FB5980015745F0999006A7BD5C0518965CF333F5A991A541B9D84AF8A0518573D9842D13BE4A7F7188F2619FDCD7A0379 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E Output = 0EB4964ABCAAFC30588410830C84DBFACEB03244DDBEA08E4461CE01BED1EFC6AE641D73BF5F74B149A4849E584E3EB42470B6501EF20B45B378BA9ED031EAAD108440CF8DBD614CAB59EA67193CFF630311FDB802C285A08D5ED138C02E348062411F6B704676056BB7EEF6D33972B8573BF3320E2D979D Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F Output = CD20F890025A664BDBC6530D9C790CC35A80B260BFA12D052816C394D5090735B9462B4B480C8ED1A44E2E416A14646000726496597F2BBE534570DE00678C0EB477B12E5D12E3660A2A87FE9F3981BEBB7A5E799145315D0E655188607AF187811DFB114A625BBACFFDF7028324FEB78E405A8AB7992AB0 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 Output = 1D4155755C898D95C6A9DF5CD5F1A3B787A116F9260BD2A69D0B0FD303306F6644D20C850511C40C310A7D4B43AA640BAC12C6038E136916055FC78179B3FC160B7DC87616EB423B5B1E355B1FE081DB8273A2CA508E974FDEB04CA9FBEC14A7029D18EA58C6AFCB081E261B06C4A5088EDAE1269FAD6439BD4DCE7F2A7DD3FC Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 Output = DA0AAD85CD857E0A4A6897B82A2A11EC9A5BAB108EF73D615424BA9A3E5CFA850AD9469096829AB8618E5967A7AF3AFE1FA583C650A95D0FFCE7EDEE48A7B935A49FE39EB0C1DB52CB6EBAA9C69829BC5E45340AA2FD149007283793E47FAF97BD45657C40411BEF86DBD0E9ACA6F49BE97734C26FB64CC1625895678C6DBF91 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 Output = 83F99171340C092801A8482B2FAC5CA3405135D2760503AF3897C08F4217A3BCC08C2E8ECA5230E7D5E48B65EAC41A1DD3F43B8082DAC23EF161C6DF3E88706DC31104FA970227740097F2DF3C0576E70918064B2739B330F35DD7D02A3D144D4F9A5808C33FA98ED56BF3DD25D67CA986CDB14F5DC11BCE798761E7C849AA9D Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 Output = 6DD9D141E47A6948E60AF60A31FB955B7358FD843849B03798F3F8B3B28C4BB009FB55EA321F349E844526FDC183FEDC49FC2C6B54D260FBB3D7E20B3E1BE66B0C37ADF9E7F5EDEDEFB238162A01C59421CC8412637E9E9EE59D26C859BBBD7993B27C78084247D4CA894BFC4338952F2AE4669FE3456BE8F0591F5C92882649 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 Output = FBFCDEDB9E03C58077E12BFC87F86B7CD3FCACF0DB9D9A31FDDC36E4ECB2B23DFA7974055F3F5A1FF6E8136CF9C708F66F12994087C866E3F85504A3B9724D17938C199F6503BE6A30170296CAB00A2DB1E6CF0963780E58E1FA56E569244369EECC24B4B92FA2B349B8841626DFCE53FE4C36746086F1974ADAF2BA3DBACE2F Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 Output = D1A1F1F7C2995DBD4BDB66CB367D6AA995B45CEB202EBD939EFA50D635336855AAFF2E7C548496A259CB4B34795B8099FA086AC00880EA25F3C345A77F40AC967DC91F181E19FCD4E3A5FB73B15B1FA83232DB970F7B30BE98E88BFD4CA0B475C1B7AA831078AC37160D581717E6D546FEA5FAA8EA99C9AEDA4EA471F33B3194 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 Output = D376E69BC513EFBB8CA8FBCC2635965E295CCD1C0C27CC6EB5DFE443A585F4DDDA6DAE207A56BCFD1362E4ACE1BFA975AF1212824D65B732E41A1D92D2CFE57F2A0198EBCF862ECFA9D22F024F47CCAE41178382FEC37A39088B94875B739EC64998F62A6417106A9C78BA28D70D06A93F90884AF6A30DD2FC6A21D9FAEE2064 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 Output = B04E30E501339A530360D9A845CAE9548E0F27E36DB3950A1CBE927A5ED8B855F78E86E1429C1AC5206BB7DE4F4A08D90E166D35F7583C38E59C4A56B962D1800D79C7AD4C8561FA366EC9C0C9EAC00B5AA3C3C16DF1647E73A8C64F14989D2D6FBB4642C12EB19DC7B5A18F531BFDF92434238660B1BE43CA5821ADA82EBE75 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 Output = 260635AE31634020B6E488F6C95ABD2CCFB11510C1BD96C093608762F214057815ADBBFB2DE2BCE3027A4ECC1DA4C7A2F8CBCEA25D916ECA621671A9275C6C5E60ADD32C203F995C97C5531A86488D8E3BDD7968C35EC61C2CDFA861C8879B6B32F8D5979FCD5ED1C2E0365547397FA4DF1B60E64FA4A8AA0981DD2A1A9965DF081557F8BF43CD6B Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 Output = C7F38CB064D26263CDCD274AE9F35613FF1A2A4641591F6E946251FBBC64CA16039CA649F58995241AB67037563972DB55B9D12CFAD6E4128C361C353FFD8AC890D0D1C29991236AAB6C27DF09C24B6955A82777CD5F30BA372D46CB8A848B7AF91683B87EFC80EEF65C9404D2098E6218375D18920C7358E5AD2A1573440FA59F56FA7DBA5D40FC Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A Output = 2D15CBC166B3EDFB652B09120251DFC5092756E66AE810B1957A9425B2A592D4D21C9E5DC63FBAF0F5079E94F11326599C8D9E71BCA4E9EA6FE11FBFB6901D6A7E2106C1354B18FF6329C6B3E76FDE3A01CC268B7A01562C55CE3B3BF261CDE406750CDAA016FA990951494E54B13469AA6143F205F8D86544C672EB8369A5F363CB0E8355D92083 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B Output = 19BC8957D0E3C941EBDE22B87A81AE8B422BF122C0C4AD133DC11FF43529039DC9D8671CC4B073C9A1C52A86C0B8F917A0D747224671F87CF3CFFAC440A2843398311A12EEDE2709C4C75C9955BBD9B7D3B2E58B7BBB428D62F20C58C6985CB3292CD82D1E2350071C91FFA08F3C27AAC312B47BBCB5ADE3877F4AB64DA88C1F82D89E78A76E73F6 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C Output = 80C4B26C03B3FC542BD0674E46BE692606D7D0107EAF03E4AC3DB176D9CE0CE5104A9E5E9CA94BBB402C35643FEB6D08D5C9B7496141033CDFAB7D02FA6293D2EF001354C9565B875CA781872D922B4A4BFC2948295D7FB7C6874DAF9D0F10F24FA07338E08054A02A30D4E27F1C4A7BE139971CF4F5F1862AD7E0C170F5ABFE13EC19F5D7E37CA2 Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D Output = 0321201DA921361D45A6F9BF613CE15316945C2C3D52D9DDB2D6FA33549CFC4C0837FEBAB65E9AEB2777E4B4D367BC9F0A15683A1BB5805A3292A7DAC59CD1E73524F561FF1E2BDE898FB2605648B385F9A1AA38A10581F4F5DDB31DD54A777F91F21C1B8F61FCD5D3884AE083A5C90545B807FB3EEBD472A81B574718CEE428D5A0FAF776A5229A Key = 00000000000000000000000000000000 Input = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E Output = AF2187578A2495DB2A746058D04E2902C83134D727E750C37681015921A852D1E796D2B6D352C86A1F31B891C7EF5A7BB03CF2D61C941D6DC51F5DEDA91C512921E631C8287175EF9D49365F86B4D27160B0CDCC7755E1C60E52C60579014BD705BFEA6323CED9F4072A06CA00BD8A57F69BB87966CC34811DADAA52CC92823AC5DB2AFBA20369D8 [KWP.INVALID] botan-2.4.0/src/tests/data/keywrap/nist_key_wrap_invalid.vec000066400000000000000000000041241322470703100242270ustar00rootroot00000000000000 # From CAVS [KW] Key = a377331672bf423c0e523d39bb549493 Input = 1f3c7f161fa59b93b3df55ffa092b0e557f92397a0d40159 Key = accc4b014123f9e95d3c6f92d07da9fd Input = 020cc7c82b6b7cd2ff4d28186930305edce13d65cc36d8d1 Key = 25be3d1d7fa0d1e6d7c97d78f80f538e Input = 5913a3d046449f5a7ceb5e1e8576e2744b96f179978edcb8 Key = 95af5484f263f99346fc45578b651f0a Input = ed6d3a9014809c0024d0b066e8a9850b6b27f5d320986a6c Key = 58f3ac243b1f937e6b131fb06b723277 Input = d542544d8ff9d1454ecd2104b17d5f13756b2a6c8b15f5f3 Key = c5cbee63ff4ec496d7a4c4f2c09554ed Input = e53da2e62d1a358678f91ff8e421eb84ab00b93239023ba4 Key = 5148bdfb74e1a52f5c8cb24c36981019 Input = f39c78376db84fc611ef8566dfdb7ce42258abf6d9b73c581c61b23072d20b7a0aa3867bc8358c02d52a48f79a3a5996eda5942f7ac5c56b1ff04bde63948461100709f9a4fadbbb28daff6075c547ac0b575b5e34830a1fa0741bac2a4da4a51369289b6d8b2813dd181cb43a7524de145c1b32742e7b57d919d8b61d8487acc596121bcbbc18fd6fae7ba0c3dc6c177cc575a8c0d6b97e145ab9624bed55102aa0fbdd016d49cf284ace156f02a10402800bbe073f73a4a2d8d2d1f5327466a180033d6b7318d4179b9875b00875eb90f2eaf08d05e44e74192cc192aa2f5560a5718c0404560cc09ae09024984338c9b94e9df89ace66aedd8bce938f8fabaed3f31bb4960d85c626613f51b834442559c32e05d527b81c0f23998df7a511b2c45b994d3bbb46f822b22c1da212e33cdbcc625134e3b6e1b10fb8b9e84323067754c21906d555079bf48bc5b6942e4aac282800a2120c4bd4856e94f854a30a6042b9678a80210f3ed821992c5c9707db6e9ba38d58d694916aba87bf8ea6af6a0734924325e1ec996708b36bca5dd78aa7a6fffd7c123dc2f68f11ce36e1542421b532cac45d6863e07de4928e7c3ad8c24517b89df546e86eaa37d6412bb37416ecd0f8c1df43d67f0a93b655f1b27e24d7d1281e2c4b268acbaeb0ceb8ebcbfb56e55e7b703c714db84063c16eeda3477ce5d53736ff38e5436e68e735708faa11bbb96cc7 [KWP] Key = 659fc41b910ed045a76707d722ff6fa8 Input = 4d4b37f9ca2416b2942f34f702f0cd37 Key = 49ba2b4ac8919de4e7e4cb2648b5dab6 Input = 3d9afc5661d9c8e0343e1c362b9b2bc5 Key = 6801637408f46b912c14330a88ce02d9 Input = 31f78f54d749e02014a8580f600ae1de796e08efa4f6b60230b979f133a0b735967304b67e280cf25805ab55a16765ba209a4eb66eeb902b90db633d9df1e71e1f707e8fc938adc415b051b6bfb452816f51cd820197b79d16816bd5263b10cd6ceec3239aa1288c731e146a9c8e7bd0 botan-2.4.0/src/tests/data/keywrap/rfc3394.vec000066400000000000000000000020701322470703100207360ustar00rootroot00000000000000 Key = 00112233445566778899AABBCCDDEEFF KEK = 000102030405060708090A0B0C0D0E0F Output = 1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5 Key = 00112233445566778899AABBCCDDEEFF KEK = 000102030405060708090A0B0C0D0E0F1011121314151617 Output = 96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D Key = 00112233445566778899AABBCCDDEEFF KEK = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = 64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7 Key = 00112233445566778899AABBCCDDEEFF0001020304050607 KEK = 000102030405060708090A0B0C0D0E0F1011121314151617 Output = 031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2 Key = 00112233445566778899AABBCCDDEEFF0001020304050607 KEK = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1 Key = 00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F KEK = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Output = 28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21 botan-2.4.0/src/tests/data/mac/000077500000000000000000000000001322470703100162215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/mac/cbcmac.vec000066400000000000000000000216211322470703100201320ustar00rootroot00000000000000 [CBC-MAC(DES)] Key = 0123456789ABCDEF In = 37363534333231204E6F77206973207468652074696D6520666F7220 Out = F1D30F6849312CA4 Key = 67C6697351FF4AEC In = Out = 0000000000000000 Key = CDBAABF2FBE3467C In = 29 Out = 616FE88F809D55FE Key = F81BE8E78D765A2E In = C254 Out = AED0202A4D19E0E1 Key = C99A66320DB73158 In = 63339F Out = 69E2BBE362FFA373 Key = 051758E95ED4ABB2 In = A35A255D Out = 99AF085AE0872883 Key = 110E827441213DDC In = CDC69BB454 Out = 346750C009F85AE7 Key = E1FC673E017E97EA In = 8770E93EA141 Out = 457FA6D39A704CDB Key = ECB03BFB32AF3C54 In = DC6B968F385C2A Out = 725FFF0F41477E42 Key = FBFAAA3AFB29D1E6 In = EC18DB5C021AFE43 Out = 1D119FAEB0BB44C3 Key = F95CBBA8990F95B1 In = 053C7C9475D8BE6189 Out = E4DD5474534FE9DA Key = E5CA0BCBD0484764 In = EBF1B305EFF700E9A13A Out = BEE63E65CAEFA450 Key = 5AC55E4B79633B70 In = BD1F231EA81C7B64C51473 Out = 495FF947F6665F45 Key = AF3B33CDE3504847 In = 6424119E09DCAAD4ACF21B10 Out = 53C806C8B69CF03C Key = 1C7F23F829F8A41B In = 155CBB6F2219BA9B7DF50BE11A Out = 2CFD97F2BD38C7A0 Key = 5F4E77FACB6C05AC In = 13B5CA4EE8983238E0794D3D34BC Out = A83C88744DF51267 Key = 3694B3AFE2F0E49E In = 86212BAA1A55A2BE70B5733B045CD3 Out = 112C46B74BD7D1EC Key = 9A0ABCD50E18A844 In = 4F321549FD824EA90870D4B28A295448 Out = F12831C24A551F5C Key = 847F2DADD47647DE In = AC5BF38E4CD72D9B0942E506C433AFCDA3 Out = 0AB4EC81A81F5C6C Key = B920BA86C33E05F1 In = 321CEC4AC430F62023856CFBB20704F4EC0B Out = B2D3297BE75E9505 Key = F6059401BEB4BC44 In = ECD96733B79950A3E314D3D934F75EA0F210A8 Out = 0AA5F1B82E138AB3 Key = 3A94FB3199903257 In = 78FA4969E623D01ADA696A7E4C7E5125B3488453 Out = 7143592230891CC9 Key = 54D835E8D4668264 In = 44EE9BBCE9E525CF08F5E9E25E5360AAD2B2D085FA Out = 90E6F543EDA1AC82 Key = 51ADAC869580EC17 In = 98D9A8877565705A8A3F62802944DE7CA5894E5759D3 Out = 491310A9E2B8B18C Key = B4692F3AFFAF2716 In = E485F18C0C66F17CC07CBB22FCE466DA610B63AF62BC83 Out = 302E436ABB2B6193 Key = ED9612EC453902D8 In = 93AC071FB86D11342D8DEF4F89D4B66335C1C7E4248367D8 Out = 1ED636A10A187609 Key = 7AA6F2B4A8CA99B2 In = E50AF89D7709D1A596C1F41F95AA82CA6C49AE90CD1668BAAC Out = 2A02740B45449296 Key = 0022569AD418D1FE In = C2372ACB08CF61C9C3805E6E0328DA4CD76A19EDD2D3994C798B Out = CEA8016EAE33A92B Key = 7281CD7165A63EAB In = E4D9CD45A391C601FFC92AD91501432FEE150287617C13629E69FC Out = E584507E7606DD42 Key = 32BDF97C8C6AC75B In = 49CF714BCE3A75A74F76EA7E64FF81EB61FDFEC39B67BF0DE98C7E4E Out = 5A09D5EF7B21251E Key = D1BCA70DBE9BBFAB In = A43C02F4B2ED7216ECF3014DF000108B67CF99505B179F8ED4980A6103 Out = 3AA4E5750CA579D9 Key = 891A2B211B01070D In = 0ED59801D6E5F2D6F67D3EC5168E212E2DAF02C6B963C98A1F7097DE0C56 Out = FAC262455D9691C6 Key = C7E2ABDDA44D8188 In = D8FD8B16C2A1A4E3CFD292D2984B3561D555D16C33DDC2BCF7EDDE13EFE520 Out = 32127540A949B873 [CBC-MAC(AES-128)] Key = 00000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 66E94BD4EF8A2C3B884CFA59CA342B2E Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = Out = 00000000000000000000000000000000 Key = C254F81BE8E78D765A2E63339FC99A66 In = 7C Out = A2F5C113EBEE0F124B649287C7F7986F Key = B73158A35A255D051758E95ED4ABB2CD In = 320D Out = 5C787D4CDAF3B4D106A7AA09F41BCFCA Key = 54110E827441213DDC8770E93EA141E1 In = C69BB4 Out = B32F25C34E061A972C49E4B0A0678AA5 Key = 7E97EADC6B968F385C2AECB03BFB32AF In = FC673E01 Out = B5D6A0E8F3202BFF37796DB5EB920B7E Key = 5C021AFE43FBFAAA3AFB29D1E6053C7C In = 3C54EC18DB Out = F3896484B179F90BE3B62DCE3F748C52 Key = F95CBBA8990F95B1EBF1B305EFF700E9 In = 9475D8BE6189 Out = 100D2CDA97B85428D785D9EECC8D51E2 Key = 484764BD1F231EA81C7B64C514735AC5 In = A13AE5CA0BCBD0 Out = 92A7A024C4F6D8C82C53030545C23C10 Key = 119E09DCAAD4ACF21B10AF3B33CDE350 In = 5E4B79633B706424 Out = E235CFD4C307E2B3D44199E83E5D83C6 Key = 9B7DF50BE11A1C7F23F829F8A41B13B5 In = 4847155CBB6F2219BA Out = 2379D24A48EF60E46807E92C1A602AA6 Key = 34BC5F4E77FACB6C05AC86212BAA1A55 In = CA4EE8983238E0794D3D Out = D6DA42CAE5C664F3C4D597CF6CE1DDD7 Key = B3AFE2F0E49E4F321549FD824EA90870 In = A2BE70B5733B045CD33694 Out = 93990491923BF761B3220C1E45ACD359 Key = A844AC5BF38E4CD72D9B0942E506C433 In = D4B28A2954489A0ABCD50E18 Out = 9B14531370EE1EFFCF5A3BBC2161D25C Key = EC4AC430F62023856CFBB20704F4EC0B In = AFCDA3847F2DADD47647DE321C Out = EB597AD53F1B208B4FEB5C20D78545AB Key = 50A3E314D3D934F75EA0F210A8F60594 In = B920BA86C33E05F1ECD96733B799 Out = 91C3626B64EA3B16E15C2F9B32189C68 Key = 6A7E4C7E5125B34884533A94FB319990 In = 01BEB4BC4478FA4969E623D01ADA69 Out = F6251F1A89FE388121DED78B8CA9FD7C Key = 60AAD2B2D085FA54D835E8D466826498 In = 325744EE9BBCE9E525CF08F5E9E25E53 Out = E55A004723589CAA843140BA5AC52119 Key = 4E5759D351ADAC869580EC17E485F18C In = D9A8877565705A8A3F62802944DE7CA589 Out = 53A217151AA961BBF0C7AD4AFDCB9B5F Key = 83B4692F3AFFAF271693AC071FB86D11 In = 0C66F17CC07CBB22FCE466DA610B63AF62BC Out = CE21D27F4D455511CD327D205853EE85 Key = 12EC453902D8E50AF89D7709D1A596C1 In = 342D8DEF4F89D4B66335C1C7E4248367D8ED96 Out = 4DC9B5ED541B7382F0FCC7CFAB5AAFE0 Key = CA99B2C2372ACB08CF61C9C3805E6E03 In = F41F95AA82CA6C49AE90CD1668BAAC7AA6F2B4A8 Out = 2FB0B595042C8D7AD592583D7E6C76F7 Key = E4D9CD45A391C601FFC92AD91501432F In = 28DA4CD76A19EDD2D3994C798B0022569AD418D1FE Out = AC464531064DA66A2F8591AFAB2931D0 Key = F466C626BC51E907F0BDAE188D092EF1 In = D4A628D05B1663A1BABEA82646DE1005197A63C1EB5C Out = A16EADA7B6D32D01FE75759FB6DE2E1D Key = C3CC5CDB5A660A4B11F2FA6401F09621 In = ABE8AF530FF6311FFB4B995F0C84BB00EA8226A7D30FAE Out = 7D980A5E6DA633CE4FED22E815A1C5AD Key = F68FB7F87F4D196B2ED3B61B12BD083C In = ECE1BA4BED3F06ED298813D05B237F1EEFDBFA4941049452 Out = 425497C221479FC5696D3078D062E725 Key = 3C48ABF950E73F6BF3E0AA7F9FD8E659 In = 451B0CA13E8BBF2E67B977A8BD0CFBB49BB2AC1AFFC5862D98 Out = 90029A6EE195A0665D02997A844BE499 Key = D88BEDBEE43C4DFB98D6C58E123C9F4C In = 4F8E165B89CAF63B76113A3B9767D4D3AF7FCDFF660C6B59EC15 Out = BCA39FFF3C95AB00DACF2B2A9A37C7FE Key = 563BD2A3B30957FE13BAC9EA1DF9CDEB In = 7736B44B0A63CAD76330E3CE8ACFE3625AD0213F0C6E3AA444FF33 Out = D55DC707BA4568B0642E3D70116308D1 Key = 1E28CDA2C49C88BA3A8FF0E5045F35BD In = 839CCEE6F69E0735AB756F4FB96F8210AA55B35D5E0A5C71C4255BE2 Out = 295F3F2DC91B300874147AADBF2132FE Key = EFF0FBA7BE74B33E4A1EC97DF918D430 In = CEB7CD790C80D66A8A32DB4F573631765EFE18229AA0DDD52FCDBA332C Out = 049AE1796CE825B2ABB88AA1EBE8D7D2 Key = 037BDD91C33F42A542D05C732BCDD8B3 In = 494A8E4762B1E2028EB7315B7164876155820813F6BB5141D91ABED33292 Out = AD921BBF28C028B76D9E1B4F92D36DCC Key = 1A945A50D4864266F30E121EACF0DB4E In = 2E2D3536402CF2916DCBAC2B9EDEBDA15A9A331DDA75C21C461E8F71EB6724 Out = 952D487FE1B8A1F63B26B2027217AC14 Key = 1569E6656010D19C57CC4A8A2F1DD727 In = 4A76816750F6296C3C47FBAE3363D24DF72C9DCCB2E032A5EE44C39A349FE87F Out = ED1B41F593FF135A1E6DC7C85A2F1A2B Key = 65D9968A7AD9F3DFB790E37DADFCACB0 In = 4975F3FC5525A1436965DD9D04C61C192F037E8F134F2C6A1B76F54B93CC72DD41 Out = 29326E91479F46720D9D1B067B10E617 Key = A625628B0384BB75735DC4A464EC6BF5 In = 7A3CC3C9682DE5DE223072EFA24F300728C791A2A08482571465D4C1628171DCBD34 Out = 440A055C9D93DE336B725E0FAE8BCB3D Key = CC5DDB04ACB3BC6D683262C3CCB9A96A In = 8F0B7911638D76374FD8B8C0B575F55B9A57E69EDBA1134FFED8F362C45E575369D064 Out = 345B392931218A9395F08BD1A45A9B43 Key = 68B27482E675F08447C3EF76705D51D1 In = 944A7EE34856D6AA1A34016E9ED1D26A2FAD6EDB612B48C95DAA8D29633694F88112DBC9 Out = 2D49E335B07A2519287CDA50D482FC48 Key = 6227B605C796BA433FD7705C7684EE06 In = 889A9BE544280FA85EA3A0DFB57BA91D2D1D9F14929098D953874FC3E5A1956D3B30537F58 Out = 900A6FB8FD5661FF12B7F391279DB085 Key = A8E7DC9BC9260E03D2A9F4830B7AEEB0 In = 1DC859A4171D89B8B2F7F3E24A733AAC9AF0B162866BA5C5421521B89A10BFB7D8185BEF35E5 Out = 096DCD92F3919145B298201BC3820612 Key = 2A751C9CAE11F38FEE260B957F963FAA In = 4030C561E85F71A71649C07239F557E1DD337CA6598BAA2B349EAE3F189CEF58CCB4BAB4142B5C Out = 2E8B2AF6CFF3FD6AF55898BC1374609D Key = 01E94EC21D1FADC50C351C0BB101F853 In = CADD5809F5F4F84EC0AD0875C133D1EBA8ED8856FE7BE5EDA2F1822187C1CC529E245B931954E1D9 Out = 351E0741D63B5CCED0131A483C3B89F0 Key = CFBD131D158F55BBCEA980BAC352DBF9 In = F27A747A3B40CCD965276C7E7B4E577C37A63E54C5EC1AD22136DDD237D5252A4F9AA48ADA70633F97 Out = 5F144222C4B8C33CA82A85CCC177A0AF Key = E38DCBE99D1003CB6AAC4D7F23791454 In = 2FAE3104D35B536DFFDD486F4087061045192D5AA98215772C9531EFE80CE917BA1A1C8E756FFB744D43 Out = 5FD061418DDE0BB0A8A3E6A4FD5BD2A8 Key = 068DF83E07AB601E6E84019B55314748 In = 69FC6052141B6C30A9E19FA455ECE8387AB32117C324E22DD030ACF3A9C04712BDA864D1C3D0016CB1A010 Out = 73E376B5D0B9466453438B5CEFB27EEF Key = 9E3C0463AC1D2EC7951851920377E41F In = DA0890EDC5385196FB229767D33777DAC47018CB1B78EA8AFDEB25521C6D9AF6752AE33A6235D05D5767C42A Out = 03F54C4F6B9E5E214BE93289CB2F2D4B Key = A90B145DD72A2FD10796E3368FF9DC6D In = E47F1659A9F9930C2E636985CA2EB0686AB4CB16D1FADD67122FF916A6DE358A5D4BE30645761273D97CF9A3AA Out = 9FA99D925751C9613D3A8D42E3B604B0 Key = 69ECFA9B0A41FDF990F4CC167B987870 In = 2F66CA7A49D1BFBFE333985F2C3B09D5471D321E4761EF4FF7D28587CC62F4FBC8BF75129035D173686AD394A5DC Out = BF0557B787C01A589BBD6EBB83F3A330 botan-2.4.0/src/tests/data/mac/cmac.vec000066400000000000000000000143101322470703100176220ustar00rootroot00000000000000[CMAC(AES-128)] Key = 2B7E151628AED2A6ABF7158809CF4F3C In = Out = BB1D6929E95937287FA37D129B756746 Key = 2B7E151628AED2A6ABF7158809CF4F3C In = 6BC1BEE22E409F96E93D7E117393172A Out = 070A16B46B4D4144F79BDD9DD04A287C Key = 2B7E151628AED2A6ABF7158809CF4F3C In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411 Out = DFA66747DE9AE63030CA32611497C827 Key = 2B7E151628AED2A6ABF7158809CF4F3C In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 51F0BEBF7E3B9D92FC49741779363CFE Key = 8989DA29F037D54809D39E0F21BAD66B In = 3B2E8F8C7838FDE9610CE6FCC10F854AEAAE3A2184832A Out = 6B642B7D118A78A160B7EA0E11789A99 Key = 2903F5E3C9630579E3B7F9E97E141494 In = 9951105BBA18783C1AF2DC8F88A9B98C9E9C5502A1CEE559 Out = 7C05D6851E344F0F725CE228A5E91F40 Key = F7BC110047D58BB40C79BB46697AF357 In = 94D6C4C8EF018F83115A27B01218A7CE29A715FE32C90AAB84 Out = 1C10A73B946DBFABCCBB21C93990AE5A Key = 1EC461A0D7D45DBB8F329D28FD1120BF In = DB170C579267ECDD54DFE24695B56459160530EB62EC7A9489A3 Out = C27600E6310E45A698C5F5F8BEDFB6DF Key = 726F0F60469CA5B517BD4EE64FEC2198 In = 52ADDFA309053D90A9C807EBB9B85D28C8BD6F6463247B20726170 Out = 03E0A715698908157EC2CF38A818092C Key = FA51384A5B8B3BE1DD2C91D8ABC9E262 In = B47B761A8FBA35F68E25B097A17191F2A9DB4D34162E1242BFEAED88 Out = 97442B172B28A4C98BD1CB2A4D1634F3 Key = 5171636008FDF3CF658D980932B44394 In = 264D32E2A14653254743926ADB7CBB4DDF1C55DD0F24429DBC4BCF718E Out = A6945844614FB76BDC75BD488637E34D Key = 644A3F16490C8FE381CF5BD6B09E7525 In = BF685A96FE74FC30B14285B1479A1591D92CDAE6BBBE678A193D3AB7B360 Out = 022D9710FC7641F76728136323870565 Key = D151ED7EA3F4E6E3BD4DA7E0CC3FCED5 In = 415D0574EAAE71B878EC707F50A850A196CE448AB4274701CF27CD0EF5A2CC Out = C9CF027DBAF268A9B7304AA8E3F5BAF3 Key = 2DEEEDB2C4CEDED515493D0EB23F45A6 In = A39FA8261CD507B473C53E7B6BC2A859AF5A1E7E38F3938230A23470E7DAD48A Out = 79171CA85E8F2821B0889A259491CFDB Key = D5505FEB66C306AFB167E1B240682C1A In = F688810E10DCFE4A64 Out = 61364AD45A2E15C8EE119CA8C36FBFA9 Key = D1CB929113E995A13D9E0B5FF068CF2C In = C280CBC1 Out = 76EA6672EEE06EE1050365F4CB404D66 Key = A7A252D3AB457702263B837F48814AE4 In = F610 Out = 5AFE8C966695BE3B4FCEA22F5C27B059 Key = 7B3ED445B003A4839266B017B7F8226D In = 3D5E Out = 41246CF56814027408D33634109C9C9D Key = 25F10513DAC4792CBC0A76A1603E3CFE In = 741D Out = BB170239A6A86DC4906F8FA56222F883 Key = 900EE360285E4273AFA3674BB76FFB57 In = 2D225860EF0FF7FFFA2040C60077560E5AB737B9F9AA689C11B35480AEABBCDBCD143CBD2433BC1E54FDE454743B63CEF29A87EB44EF8756A2DBD651 Out = D36509415886167C44D9208EF5DB4C5A Key = EDCBA48465D6B8BDBF274658EF587F72 In = DDE273DA5EE3F41B370A7C10B706FE82AB82E7813BA44162EA99514218C3A4F5A517CF03FBC41E32CE9A4385A141074CC3EECDFE930E607DA8B1C0C07464B61A7C851D77493CA918D6EC9D772DA5C3F19391EF269F50A44701640876C8BE904443AD Out = DE5E5B64B403E3772CCB13E175C734FE Key = FB565C5DB38C2237869ED34CA10A055C In = 85380139C424704AC24497634E9CBFCEE21E0F99CF3AC8F9C6AE2D6FDD09136341149C05380C4FFA50E65D9E831D6C653B7BFE0BB5C6047C7431EB513AFEB47B1250804B5DD045ADB6A34C39C0B89EFB349C06E9620A65D63C5028764EDCF2612D72AC8A42F137F9948332543CD150706D5659D061BFA69D0FCE135EAB05BFD8786B62BA5C99B3F11DE64559B795C924EC22F44DE19BEAF169FD4F14030EEC7B794E35D5E8E9C6 Out = 3015A6D16CDDF7E1E8C28521F4064A28 Key = 0398D70C12CE6F7ED28828647FB18A56 In = 7B326530160FE8CFFB68704022DE43BBB54FCD83BF4C554774BAC625441C1DBF4F82F06591D8348C40A4CD6282101D3860EBBB1F371166ABCB2DD00F49EDCF986FBFFD0197328DD7D65A39596B5791CB424CEA795D5024287DF438C7E1075F50C65D515D8FDF3465396DBEA4C44F6F069C597FF9AAA32227 Out = 39F2933F156616549749CCAEBF682322 [CMAC(AES-192)] Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B In = Out = D17DDF46ADAACDE531CAC483DE7A9367 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B In = 6BC1BEE22E409F96E93D7E117393172A Out = 9E99A7BF31E710900662F65E617C5184 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411 Out = 8A1DE5BE2EB31AAD089A82E6EE908B0E Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = A1D5DF0EED790F794D77589659F39A11 Key = 76BF48A88F0F5531C4D1A14846742CE39B8D8827F863ABDA In = F4FF3C7E2F56F4 Out = E1D41EC244EBC98373457A95685D0EFB Key = 970BD2C9C46E9B85E13949E13D39B466A8070F40570D1070 In = E2C0FFB463EF4B6EC114322FAFB8 Out = D25D89E8CE9685D975C645FB2A19E50D [CMAC(AES-256)] Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 In = Out = 028962F61B7BF89EFC6B551F4667D983 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 In = 6BC1BEE22E409F96E93D7E117393172A Out = 28A7023F452E8F82BD4BF28D8C37C35C Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411 Out = AAF3D8F1DE5640C232F5B169B9C911E6 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = E1992190549F6ED5696A2C056C315410 Key = 19449A56180CB52462C37109EA1D329708F7C4FBC43B37E1B2C55E38F5551C0E In = B664B2C219D625DC472EC765605E6D5822681C5E9FFD10645B Out = 3FC310BAF6F1A39FA25AE7DEA104EDA9 Key = F0D16D00B5CF601F1A5BE91422A5562C252C5C1DEBDF05B5BC328BF8505DF740 In = 6540E334A0024EFCEB621E91B94AB6E5A6D4D085D986410B113A5B6E319B9D96DC80CA7C8319786E7B96FF34E0B6 Out = DA97AE2997EB3E74B35C6A6FD5471F8C Key = 420D2C372E496D403A9F520158FCCDA6D6BCE14E6EAD2B90918B919E5E8621A0 In = 4DD7C1974501D1E454D23C509FE2265BC375CA Out = CB1C20084C5DACB3270F118633DB4F33 [CMAC(Blowfish)] Key = 0000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = CE2A6A95E8C3CAB9 [CMAC(Threefish-512)] Key = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = C07C71A284C7A63023146376F895E83543EA3547A9268861CD00B7AC405AFC34A9EC86A30622D38C7E765521B148AAB5DEDD3AE80496ED56BCCB17B2E3D18009 botan-2.4.0/src/tests/data/mac/gmac.vec000066400000000000000000000061031322470703100176270ustar00rootroot00000000000000#test cpuid aesni ssse3 clmul pmull # Testvectors in this file have been generated using the Bouncy Castle Crypto # API version 1.54 (https://www.bouncycastle.org) [GMAC(AES-128)] IV = 000000000000000000000000 Key = 00000000000000000000000000000000 In = Out = 58E2FCCEFA7E3061367F1D57A4E7455A IV = 000000000000000000000000 Key = 00000000000000000000000000000000 In = 00000000000000000000000000000000 Out = 21C2EB20CD2214DBDF34C9B82ECB7ED2 IV = FFFFFFFFFFFFFFFFFFFFFFFF Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = 00000000000000000000000000000000 Out = B19E0699327D423B057C95D258AC3129 IV = 00000000 Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 95394A79D3A4E94A419D2EA464005F79 IV = 860490BADBD9D69CB13322C8 Key = 03E76EBD8695CAAA623817AEDF12A6FE In = 06CEBA51C28BBEF65FF07B3E265A8905F950B6763498E2A35275E40B985EA459E3AEA0E7B8701E2EBC5C7FC73657F0FE25C4 Out = 09A226837D34C6881BB1E4377C29F781 IV = 7F3726E3698857F573877988 Key = 0679238B9E5FD7AFA8F4D5B3AF08671E In = 90B3319E2973E670B392678CA177BB24CF0343D1F8AD0C6A2812C2C7A012D6667BC2F1B74F7F6EBDBE9491AE6AD36FDA0052 Out = 02972297D35F920876FA42F3BC588D95 IV = 2B4F4D6E9C4AC0778DFE1185 Key = C592DFFD2C340191E688C78BBCDE9B14 In = D184E694CE693FA39E3EC026500B771B3C7F51A8F9E9B7DE609A6E34B92A967F26B453AEBD6011421CE21C4C500459997A32 Out = 6174D3E5298EE97224ABA305196FB34E [GMAC(AES-192)] IV = 000000000000000000000000 Key = 000000000000000000000000000000000000000000000000 In = Out = CD33B28AC773F74BA00ED1F312572435 IV = 38709F4B067D1714DD63F428 Key = F3582246D1DD6AE73F855C82B774E94E8143D9F8354A9F66 In = E924266E9687AF9C8E1E23EBCF80AD90EE072B3FC2B57C020708AED47A5D69DF5748B985D8D78BF48D63A4149C3EF72440CC Out = 749EE0A6FEE5DEC22E58C597E1CD047C IV = A47E708697F2B8D98E7F5CA1 Key = 890EB916B61FD6101400ED06FECB89C342B95396E635B3D6 In = E18155FDF859872A7491B847B80C5070A1FE9728E752129D54DBE616B4616FA4697CA45DF7C9292F845AC4CA3EE120701924 Out = 2A73023EE22E85937CC61C8575E962D4 IV = 80947F9A7FE0AED56AFCE4CD Key = 2622E5104C164548437A131BC45BA080E70BEF18AC1B0AAB In = 485DDEF269A377AD7B29AD1E2055A08EA01E0DCA4B83F4DF5668C0197EFF6B8B835ED75BB4046813ADBAE0F900811119C5F4 Out = B36E1D2CECBA1EAEB3C43CC3AAED9C15 [GMAC(AES-256)] IV = 000000000000000000000000 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = Out = 530F8AFBC74536B9A963B4F1C4CB738B IV = 6A9588E108A7F8A01407476D Key = 124A6263F56093DE70CBD45B2F57450B99DB7C068B0E11DA674D267CB739CF4C In = F07D4DC8F1D32903DAFCDF1F3CA792AFC325D36D8E82E0EA0F6519AE81F4DF905F3DD78076F02FFE74341EB3E606A8ED6DF0 Out = 9F82882851DD41F38334C3E5337C80AA IV = 551D960E1C2FBCB565E00E61 Key = DB8F74ABDE797BF29215A9D1883E5BCE4B0334A2C7891F82D3DCC106EC026F7B In = 6C4399B071B67B9F5495DA20F40D23A8A9FA86D3217D9226C43F7BA5E083C96280D13EA65324131631A2ED573F80568DC47B Out = 1A55AC6CB46B8001BAA02BA64FAB7B89 IV = FB09C848E7ECE36527B7FB70 Key = 0994C9E2A62E30A727BC69AE2DACC8823B00DD2888ECE29C2CB764A38FD30FBB In = 4E1F2940DA4E4F5616304E7E398070FD106B32B68A0A47977CD008760F0972B5B519FD91C4AEDE49AC869D0766AF8C1A8309 Out = FFF8F5311D7A16F78930F319EC3E9F8A botan-2.4.0/src/tests/data/mac/hmac.vec000066400000000000000000000067241322470703100176410ustar00rootroot00000000000000[HMAC(MD5)] Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 4869205468657265 Out = 9294727A3638BB1C13F48EF8158BFC9D Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 546573742057697468205472756E636174696F6E Out = 56461EF2342EDC00F9BAB995690EFD4C Key = 8FB6AB01840023EC453ECDEC73DC1B66 In = 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374 Out = 6B1AB7FE4BD7BF8F0B62E6CE61B9D0CD Key = 8FB6AB01840023EC453ECDEC73DC1B66 In = 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461 Out = 6F630FAD67CDA0EE1FB1F562DB3AA53E [HMAC(SHA-160)] Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 4869205468657265 Out = B617318655057264E28BC0B6FB378C8EF146BE00 Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 546573742057697468205472756E636174696F6E Out = 4C1A03424B55E07FE7F27BE1D58BB9324A9A5A04 Key = 4CA0EF38F1794B28A8F8EE110EE79D48CE13BE25 In = 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B6579202D2048617368204B6579204669727374 Out = AA4AE5E15272D00E95705637CE8A3B55ED402112 Key = 4CA0EF38F1794B28A8F8EE110EE79D48CE13BE25 In = 54657374205573696E67204C6172676572205468616E20426C6F636B2D53697A65204B657920616E64204C6172676572205468616E204F6E6520426C6F636B2D53697A652044617461 Out = E8E99D0F45237D786D6BBAA7965C7808BBFF1A91 Key = 0102030405060708090A0B0C0D0E0F10111213141516171819 In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD Out = 4C9007F4026250C6BC8414F9BF50C86C2D7235DA Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Out = 125D7342B9AC11CD91A39AF48AA17B4F63F175D3 [HMAC(RIPEMD-160)] Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 4869205468657265 Out = 24CB4BD67D20FC1A5D2ED7732DCC39377F0A5668 Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA In = DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD Out = B0B105360DE759960AB4F35298E116E295D8E7C1 Key = 0102030405060708090A0B0C0D0E0F10111213141516171819 In = CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD Out = D5CA862F4D21D5E610E18B4CF1BEB97A4365ECF4 Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 546573742057697468205472756E636174696F6E Out = 7619693978F91D90539AE786500FF3D8E0518E39 [HMAC(SHA-256)] Key = 0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 In = 616263 Out = A21B1F5D4CF4F73A4DD939750F7A066A7F98CC131CB16A6692759021CFAB8181 Key = 4A656665 In = 7768617420646F2079612077616E7420666F72206E6F7468696E673F Out = 5BDCC146BF60754E6A042426089575C75A003F089D2739839DEC58B964EC3843 Key = 0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 In = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F70716162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F7071 Out = 470305FC7E40FE34D3EEB3E773D95AAB73ACF0FD060447A5EB4595BF33A9D1A3 Key = 0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B In = 4869205468657265 Out = 198A607EB44BFBC69903A0F1CF2BBDC5BA0AA3F3D9AE3C1C7A3B1696A0B68CF7 Key = 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C In = 546573742057697468205472756E636174696F6E Out = 7546AF01841FC09B1AB9C3749A5F1C17D4F589668A587B2700A9C97C1193CF42 botan-2.4.0/src/tests/data/mac/poly1305.vec000066400000000000000000000374701322470703100202270ustar00rootroot00000000000000 [Poly1305] # self test included in poly1305-donna Key = DDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFC In = 797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1 Out = DDB9DA7DDD5E52792730ED5CDA5F90A4 # onetimeauth test from libsodium Key = EEA6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF880 In = 8E993B9F48681273C29650BA32FC76CE48332EA7164D96A4476FB8C531A1186AC0DFC17C98DCE87B4DA7F011EC48C97271D2C20F9B928FE2270D6FB863D51738B48EEEE314A7CC8AB932164548E526AE90224368517ACFEABD6BB3732BC0E9DA99832B61CA01B6DE56244A9E88D5F9B37973F622A43D14A6599B1F654CB45A74E355A5 Out = F3FFC7703F9400E52A7DFB4B3D3305D9 # draft-agl-tls-chacha20poly1305-04 Key = 746869732069732033322d62797465206b657920666f7220506f6c7931333035 In = 48656c6c6f20776f726c6421 Out = a6f745008f81c916a20dcc74eef2b2f0 # draft-irtf-cfrg-chacha20-poly1305-03 Key = 0000000000000000000000000000000000000000000000000000000000000000 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = 00000000000000000000000000000000 Key = 0000000000000000000000000000000036E5F6B5C5E06070F0EFCA96227A863E In = 416E79207375626D697373696F6E20746F20746865204945544620696E74656E6465642062792074686520436F6E7472696275746F7220666F72207075626C69636174696F6E20617320616C6C206F722070617274206F6620616E204945544620496E7465726E65742D4472616674206F722052464320616E6420616E792073746174656D656E74206D6164652077697468696E2074686520636F6E74657874206F6620616E204945544620616374697669747920697320636F6E7369646572656420616E20224945544620436F6E747269627574696F6E222E20537563682073746174656D656E747320696E636C756465206F72616C2073746174656D656E747320696E20494554462073657373696F6E732C2061732077656C6C206173207772697474656E20616E6420656C656374726F6E696320636F6D6D756E69636174696F6E73206D61646520617420616E792074696D65206F7220706C6163652C207768696368206172652061646472657373656420746F Out = 36E5F6B5C5E06070F0EFCA96227A863E Key = 36E5F6B5C5E06070F0EFCA96227A863E00000000000000000000000000000000 In = 416E79207375626D697373696F6E20746F20746865204945544620696E74656E6465642062792074686520436F6E7472696275746F7220666F72207075626C69636174696F6E20617320616C6C206F722070617274206F6620616E204945544620496E7465726E65742D4472616674206F722052464320616E6420616E792073746174656D656E74206D6164652077697468696E2074686520636F6E74657874206F6620616E204945544620616374697669747920697320636F6E7369646572656420616E20224945544620436F6E747269627574696F6E222E20537563682073746174656D656E747320696E636C756465206F72616C2073746174656D656E747320696E20494554462073657373696F6E732C2061732077656C6C206173207772697474656E20616E6420656C656374726F6E696320636F6D6D756E69636174696F6E73206D61646520617420616E792074696D65206F7220706C6163652C207768696368206172652061646472657373656420746F Out = F3477E7CD95417AF89A6B8794C310CF0 Key = 1C9240A5EB55D38AF333888604F6B5F0473917C1402B80099DCA5CBC207075C0 In = 2754776173206272696C6C69672C20616E642074686520736C6974687920746F7665730A446964206779726520616E642067696D626C6520696E2074686520776162653A0A416C6C206D696D737920776572652074686520626F726F676F7665732C0A416E6420746865206D6F6D65207261746873206F757467726162652E Out = 4541669A7EAAEE61E708DC7CBCC5EB62 Key = 0200000000000000000000000000000000000000000000000000000000000000 In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 03000000000000000000000000000000 Key = 02000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = 02000000000000000000000000000000 Out = 03000000000000000000000000000000 Key = 0100000000000000000000000000000000000000000000000000000000000000 In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11000000000000000000000000000000 Out = 05000000000000000000000000000000 Key = 0100000000000000000000000000000000000000000000000000000000000000 In = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE01010101010101010101010101010101 Out = 00000000000000000000000000000000 Key = 0200000000000000000000000000000000000000000000000000000000000000 In = FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Key = 0100000000000000040000000000000000000000000000000000000000000000 In = E33594D7505E43B900000000000000003394D7505E4379CD01000000000000000000000000000000000000000000000001000000000000000000000000000000 Out = 14000000000000005500000000000000 Key = 0100000000000000040000000000000000000000000000000000000000000000 In = E33594D7505E43B900000000000000003394D7505E4379CD010000000000000000000000000000000000000000000000 Out = 13000000000000000000000000000000 # Randomly generated by libsodium Key = 9E9D85AAD102FDF3867984CAD7436C36D1A00481C8F19ECE2070271B5D998FD0 In = Out = D1A00481C8F19ECE2070271B5D998FD0 Key = B1DF3FB9EA530109228401A375516AF7337AAA04EBD1F9BB79B0EE97AD6DD946 In = E9 Out = 5BC3ACAF241883EFAA11D4554704EF70 Key = 548E3E7495C8DDD028EF42C85BEC26CAF49B402592A25E37D54CD086C742620D In = F062 Out = 4844B6A0345BA7B688D345D4BB90B164 Key = 95C9DDBAF2A0D598517EB8E3869CE1E1DCE86384F8C7B9CE8F2B157DD297469B In = D815EC Out = C4BC6F4BA5258216624AED8416A23081 Key = FC7B0C21141632AE850B31A9CD0BA1BDCD68689AE88817ECC294AD5F1217395B In = 15E0213E Out = 67E592B5167E669BE51E6F907AB2795C Key = A2C48C332C649467416B072DB19F6376EC75BCCDB1CF03C4AD86BA2D1B69D00C In = B5ED4BC907 Out = A96C7AAA30F5F70D4F466CBDCD1F8431 Key = 6B554DA6070086A0D81DA6F3A18B57951DD94959499DFFA5946769E4CFE08420 In = AA99E9E0635B Out = 837AD6CE4A89DBE067817498CC3AA0AA Key = E86CEC57707D632B7F3CC2257A5D8025C15D723FAB8FACCC8398AA8B5A3FA765 In = 525030B06AAC7D Out = AD406A25FBFF944A474514F5AEA51E38 Key = 8CACA0437F997872FDA55C4E663733EBA37C7C7407D67A0C3DD65B211FDAF5CA In = A877A82AE521AA02 Out = DC35AF493BAB087D16F0C68E027C73B5 Key = 8B9F30F2065CCEB9F763D79F1B6433A058A8F2AF052A4555FDABDC624FF3B0CE In = 4F0522E58738DCAD50 Out = 939C9ADDD0CEB75BD7B82807AFD483D8 Key = E29D977D6439CB90358DBBD2538C8BD48DAA5CD09A0038232CAB61769128ACC5 In = BEE52800EB0DC6FA3E43 Out = 4ED9A237B5895EF61FDD100F16C53888 Key = 2995E27B27F510E25F926C0109679605DB8FF757CC83822DEDD9C1F6615FE39D In = BAD92754E84F435F3284E6 Out = 08096723A036D7FB8F15507BB8C0BC43 Key = C81413ADCE932303D367A96AB5485B5CF1C32005AB1B6CCDC921EAEE077ECC1E In = 907A005DDDFB330FD9C0CCE9 Out = 29C1DDD60375E77B69E38B522B32E709 Key = 7C7DF24D60A6A202564BF3124DCB06137A7FF53B1864E43E2E7B73FF2209B9B7 In = 4DB2DE834EC7CBBD042D9581A5 Out = 5BE481E149F955C65BEA350A4DAD4C21 Key = 1C20C733E41854683EBBC49A085E47704073359BDF26C24817DBD855DAD2FD76 In = 47FE8BFF7501E52AC14FCC687384 Out = 4A650D205CE287CB8C9BE568C4A451A3 Key = 079810FD6F1AD87D7A2E1A9D72C55249A8CFA875B41FA14568EF9741E6A769BF In = 5B5EAB1283967770542A7A57702A93 Out = BF159EA2671A07302FE2D6B5A5F40E75 Key = 828C4B03687DE973E34AC6FA5CF01699EB658EC84F3DCE60BAB5A35AA7D2585E In = 3EC00AAE4DFA8952BCBA685521D9872A Out = 359138B3E5E097BF48694AF31DBD915F Key = 73DCAC8AFDE03315932C4B6F032ECB86901D1A401DB20E45334A52967FB6A5A1 In = DA71371BDA6B96B51D361660F7E2221A0A Out = CAF6EF581BEBF03C00D33917EDED3E00 Key = 7FDE7001E3FB22D673FDFC2E6138F7E2C2409537B95C04C8FA6C8097E3880BF2 In = 2826E1BD0C643140C2A750E1F4E08E9CBB35 Out = 8734CDA02BE02553D41455C99971711C Key = CED5B7D685752522B80233F4F47262E5C1E1709C30F8E9415EA20AB1F7DA1D6F In = A03B1F880AB72B0F12C22BC837F1DAE38FBA9E Out = 9D0DCF5BBF90DE436BCC864FCB43DEBF Key = F5403228FA8A9879A3C8288319072C62A70F1605CB0C36F7612DD131AAE59C55 In = 592C0D0BBD2CF2225EAB8912CDE12F9752F0E217 Out = F88A11292AE0CF5854C626E6B079EB84 Key = B5CD17608F894FB90A014144F9677FDC490CCD20059FD3F99B569ED9B51D3B4F In = 2063CDFD23683718F0994B3E2F6789A443DF0E447B Out = 6E5E516FA39CD06B3E901ADE57FC8C08 Key = CF04CB06DE7AF28D2A9E022034389509FD2EF5168FA40D6F29D500A287BD647F In = DE69747C2ED30A5B69567B528604BC968AFBC546CC90 Out = 1186387E982661E6F80A5D38D4C63D4C Key = 8642E25ABA2FEBC3F8D7F1E7737D7CB55CB5991E6933CD7E1AFB4F68A046944C In = ABD9F8E04CD681D50A679877B2EDBDA1A0A376EBECE6E0 Out = E2843F3D16E7666EFB8EC48E6C507657 Key = 32029CBC18697477DDBB910A9494868DEEB0315D25A49F76BB43544B2F83B941 In = 9E354F70B52AECB086DF664825C039824ABD6A0F9A7C7FCB Out = 0194DB1F13222163729A8F0ED84DE466 Key = BA34D5CEED7A4F134CCADEAABF1C42B37AE8B1334B78B789DD29A989B50E029D In = BBB666E23FD40458BA38D06A5DCC388BA103BC6D04095A7AA6 Out = 9356DF51E8E76D5466F509EA513112AA Key = 158CD22AB957A0F9F977353BD9C83B688D51088DDEAF847BE81468EC345EA443 In = 3E820F3AE6EA6EF9C59D7B527BDB76C5EFD65E76B3E3B93C9EF5 Out = A3EBE4E930B3EB5B7A3E475B84A29F45 Key = 59E4BBD352419AE4E5819240A0033A301CC3AC86187426053B69F572E83F2470 In = 9655D7D3D6C74F9A0C9502C9EC7FC22F4710BDC7A0AA0BAB35C929 Out = 13B6F916539A5D06DBE3F801DE8D83C1 Key = F868AEE434D463FB1635F209481D60815A03869198B95141F89C1485CA969730 In = 612E7057B89390E7FA920111D2F61598D3769568E1F2675B3D13C01E Out = 835C1C8745B16B5AD0168C646C99EEF0 Key = 325AC69BA9B00B0609E3DD12DB3D75681F43A398EEC2C92C9E99A440440A1E4C In = D8AE537E24503E12405BC80DD4ECE2D48C90CA74DCFD90E87C2E756EC4 Out = 5549B4C997557CAF14DC198869C76CA8 Key = EB63EABF1FC590A086E7C8AD25F2A4BFFD4AB6016EBE9D274B630353A162234B In = 0E2934DC1FB134A1C1CF6EDAB1D0E24423E4A39538822EA2D9B94931BD23 Out = B07A079761EB76679343540A3F75CBDF Key = DE07129A2B4C79FB8789D4A9564BA185A2F1F4C674ECCFEB19D0940D64CC2DD1 In = FB01B7D9D4B46307AFF6E4DC19A211969D479D2496433B8A4B5C1B7BE2F6B9 Out = 4E412BD481F219BB9D88B636AFC0E1D6 Key = 344579DD843D176804888F814E4FCB11D7D41FBB4E157E0E71DAAF5AE49FC1DA In = D1632FBFF20101520A1B7BB071BD9089E23435633B180941F4A4F00A127EC3B8 Out = A24F40C6F63E7FEE5458D86FCD0C340D Key = D29B469F0E5067BFC7597B3415B5D3EB2F55388707446A614C8233EE1AC7A052 In = 26B5CCE0A1A1722360E0C99D65EBC49CB253536177F5F95B42BF462B7C82947B29 Out = 24A91FAC5D4BECB46307EEED954ED011 Key = C5824C96352B4639AF1172BF019C93FB5507EE82815764022C89EE001ACF3A14 In = 59F890D5F008B064D8CB8A491522A944CFEB1846521B39AAE9E198B1F7B07171BFA9 Out = E9A211BB3F2B0A11445C5D06378309AB Key = 884DB7C6C2D254824A7E514D29829FB5580D77B948CEE0377D1218E674849660 In = 25822916523687B1A68E51C55C97A56DF6893B5E2716B7F2A1483138D4D45CA7DE813F Out = 53FA73CF055F7A21521F8D4F33915A88 Key = 229222BE1B32557A5741EF3182FCFDFB63A6550BAA9892EFD3DDBD67608229A7 In = 8E8B1188CF23A77C89D474F001373B52F9A6FB76F40B28FD83345E7673812B985BD558BE Out = C659279CDCBD804F889877137449DF73 Key = C3C747651BA5B9975B87ED7EAFFC023569662970558BDD2992774D4F721449E6 In = CE8ABB5B6AFA5614C682608B7F6D1374DC282EF0E033542B5BF2C4C3B2AD02CABE5C13EAF7 Out = E746A81205ED30C8A1872D5E81516B05 Key = 4ECFD1C9A89F2F5CDB6C2A99C2A8AA6A7E5DD7184B87E265D68BCDA15D1040CE In = E6484C98EF43276B36182B8E4B9BAA058330E192E2FE0B0AEC0AEBE64A6BDC2AA4A8CD65B10A Out = 2564EE67D9C00EF3248F3239378E25AE Key = D6B7BCC368DA611151F58A58096DA802FE64DFE9D18BD8A8D8FB97157EE96099 In = CA460B21E0D3BCA60B56667B12D3C42D4F525D6DBDD37F8E14DD7B201AA03CE2E69DD4C5FCD283 Out = F5F74E3FDAA14CC0426C89C999BA2E30 Key = A63CB4A43CE1EDEF181D1BD339E9DFD9DD7667BC9E5B642DFDF26E7E6DE4BA8D In = F40FC0763C321E2F668DAFEC1422A399405629E5D1C9B80C5C1DD5D8DF7643475D13E79BADF451C6 Out = CF5E17C8890B63A4D3E061A53C51E9FD Key = 040F48958744F1E8169DB72BB800CF339A4B4CD86BC237180C2E7D279093BA61 In = 0C7291DAEE8B5EABD8F8373ED30C240474287951D8739BFA9978C252AB2D92C89C3D3730CA9AE15C90 Out = CD7BE663024A843F0244777FDED633FF Key = 8F235B87E0B652FB146A4A9E1367FEDC04F009F3807049DDD8AD83D93F2392DD In = B58BB0431016BB591040F15C2CDC303214C0E290A802F97077B7F3B0D8B7E4AC83C2662B880837AF550F Out = A31889EB51AE63DE762F912D2020BD7D Key = F149D8929882EBF4457D0579AC795ADEDBF724FC2A4422FC42BD9848A44C6A06 In = 9549A9797916B7567B011A96D43D7615ECA15BE9DD955ABDC38517033E346C2F52C505021FFE351157C190 Out = F299FB43775F3EE5101B7D12485E11BE Key = 3EB6529C93F120190EC3819B5356211F67F224A1CBE1BBE8400EA3F8375506C2 In = 4E3C135056EF1EDE0B56E67C35B359F8778944A7C060CE3D9A455E31006DAB955194E830FE458E300460967F Out = A7E9B419DED98F092AD1034B1A008A9E Key = CB89B844CD47C422D94F75D7E05EB722C564A924531EEFB8EA39F5CC8154A0FA In = 920AB028BDD9F877845E1A8995F5255AF2C6BDB2C5C218E52AC72B58571E81F27AA30EA78C50C85EF504ED056F Out = C038DCBDE5CBE58469ADC6491CEEF8CC Key = DC4667C6574DDC3E949DF0F51DFDED57E1DD4FB9C7F64C93C68EBF223E2180FF In = EC3FC04B9B01BC7CEA445E9C5A713C782C083DC75408416BCD071A2D311642DCBA891825E0044DF800E5ED65314A Out = 2B9301B71DB683131EEDC55227925F12 Key = 492AB714C763ABB9BAA4FE4311B89277C2926F1BE7105262CB50C80B4B70469C In = A9E528BCD43297E7D2F33AC7488DF5EDBEF08AAF8D1994F60098653FF6913138AB3C03262ABFDE8BAAC10033098E7E Out = 562BFE9F91BFF7318D44E52BF5E55603 Key = 7C939CA4F592B90C2C65D530983740155A3F1C7C63BA0CD84EEBED1A579D959F In = DF99C5E78BDCA6D261F0B8BF5EC7631F572BC2A6C2F734372C35CF9E2F8D812943D23F17BE0636C7FDFCD53C73F79FD2 Out = 02BA172589E102D0C071129C74F440A9 Key = 7C74F59B91FD56D09A14D318A457517E83656106B6E933E590DA6A2DA1D4B0A1 In = 75C194EEA5B223358AC7D0920F9451B20318B97A72E63FD711095746BAF5358AAAFD4DEA1F3722688799A5B0685C7E843E Out = 351B1117D44D528ADB283F0450C50B25 Key = A78D532E96553A435B44CC54BBB22FB23AA1F4F41C6087C60CC9FFC564C95051 In = 6D8EE97A667FDF890356C7CC5E69C1EB4EEFF1C11C019D257E2537797A9EB45CC2FCDA4A7536DC0CE929D7C8A0CDB9834677 Out = AAD5FDF14D229E87816245FB06D9B505 Key = 7D6880EFE74747D0713956B079D74D717358B69772480DC5B9E473D71BE84A94 In = 410351D27DF685CBD0CFDC166B3F90C0FD4A334BEF5774EF2E59948DC7BD118B4D46B3AEE139EAEB54EA0A267F8D0A2E057933 Out = 8B4CF9CF2500A25C86FC5AB6B6565AE3 Key = E96CEE991E966AAA662C1C0FB5C15F422A98C5529629826B645BED629192085B In = C6551853EC02C8315B6219564C11D319C797FCD9E4528D2700B7A562FC4A0D4DD1DD6D445F13E27EE6373539470A4AB7A9366654 Out = 4F8D294470CDCBBABA89A246BAEA9014 Key = 9E89E9C49DAF18CD8EED9733AEB53D3804AF2775D61C9A833F65B0E4560C4738 In = 2AD404004B5589253AA91D392905200B8A28F94AEBE5D45CF674B158004BFC91CC48584E7451FDEE87132B7058EC9E48CDF16F3380 Out = 3EDA0BB3F660A60E15D90BFAA2E996F2 Key = A3FDA18F925C1588291F26DFB43E1B7D70AF097462F52C276A89095ED7D01685 In = 933A72A8351DB8367E9F6E63C2A36DCB02801470AB7846308A2DF7925B6D81E50340C22457F6E3A10EBC6D7E205B113B8E5B9C9EB41E Out = 20235C71ADA97CB8796D0CF986A7FCB4 Key = EF411C2190426495EF79C6913615E9A6CAC435CC4796C421331DBEF519FEACB9 In = 54B66666FDCE1754A62C75DBBE40D4380739FA959841DF05F267EDA6C6F9049A9D1E5770E42D237AB8E411FBA613ED55F60A12A26FFEF4 Out = D551758D4AD5DD0A52DE7CA1424A03D2 Key = 427525D85A907836D5024566719C9373F5684F18CB1F8B4D3F2BF6F0A8B36274 In = 5D5AE246E9E84F54B4C8015F4FC3AB5C63A3A2F5EA257E7574940F1A3C60C796DF3E0C96B73B3EC3597504F048F7A1437FDB268ED23733F0 Out = 39351B13A888D194BE63F869B5D0C57B Key = BB78DD08395D96F18BD71C084FAF26490A492E1345CA8A1190CAA509A13C1A43 In = E324F0BC28D8C51DAC56087928BB784D613FA00E4E0399D81CF24C6317A28DF48C3A2A35BF2E16E366F9E1DBFD20C01C7B6ABA6C98F72AAF6E Out = 1FDC7616DF7809FE775F3694D2166EBC Key = 325544641FC9E14C344BB0BD42C88540D6B3E8FEB2DAA8AAC4E518952831EEE8 In = C3708D1969C9D980F1108936055BAC50ED43A3BD7DB246E34FA282F77A0F9D5968D7A1856EDD36CD06D768125ADDD3368E41E025FC689368AE20 Out = 1935CC6A925E182589CF85BD289E8430 Key = 932FB37709A9DFCD232E5B6FCBCEA06DD384818DDE1BA6A85AE813A054D8437F In = 98945E5490056F4C616BA055D5F22F05EC99834F1702057AFBD0B812E95AE669F4E6C0A940318A162EA85FA8DFE0D5F9479C87402A1E9D45649EAD Out = 163BA4F137C343172ADAD46BCE7F1CAA Key = E286704F857F611C6A10FCB650A6974496AAD9A285AC6F65977B11B6E5310B16 In = 8883CEA30073C555537BEFB1A4CA25B50E71AC313446B6039CA4CF0BFA9074AFB448EFE2B02E124F0C3EB35BFBD878F2C632C8D0AA37D9DA6858554E Out = 3C96DB1DB3EBE7260E6527DD93E5B95D Key = 375B7709A43196D08C8D91406AA82B307C4A7D5CDCBF59118077B69FBDF5A649 In = 3AD186DC498A3DAB9142AEA55899EC0AB125A0AF010DC71E77C8F9DDA9A65DD7CF4FDC41029465F3998931285D6DCC2C454CF6D5E4F73A224312C343CB Out = 3C5D43309DF559415E6E4D2300BFA847 Key = 7B5532DEB4AA9DAF0EDDA3D361FAF33E83B309BF3EF7E88912E00905562049FB In = 4FB4B3F34F54C6A1ED4BD8E5AAE61E03E99643DD1EFC996A4579AC88E6702DDA06B66F84054CC3BFCCA6CD3EB67E0569FEB48191398A27C2D605CFD6AA38 Out = C79753AF74F8E1CC65A48190200E8F94 Key = 3ACC533363DFB5012D00F8F67BF5F16167E9235AB0E7D535D0C2E8E2C0F2FFAA In = 66CA0F0DD4D4013C18BB7B51CEE12492706FDCD59DC0927FA9637A3687F1FFE6C15AC64D97FDCD6602AA7CC3B1C7E4D11FC336F4CCF516A4A4710BF41678EC Out = 5B00273784949EC5AB564DB7AA54F008 botan-2.4.0/src/tests/data/mac/siphash.vec000066400000000000000000000244071322470703100203660ustar00rootroot00000000000000[SipHash(2,4)] Key = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A0B0C0D0E Out = E545BE4961CA29A1 # Randomly generated by SipHash ref impl Key = 000102030405060708090A0B0C0D0E0F In = Out = 310E0EDD47DB6F72 Key = 000102030405060708090A0B0C0D0E0F In = 00 Out = FD67DC93C539F874 Key = 000102030405060708090A0B0C0D0E0F In = 0001 Out = 5A4FA9D909806C0D Key = 000102030405060708090A0B0C0D0E0F In = 000102 Out = 2D7EFBD796666785 Key = 000102030405060708090A0B0C0D0E0F In = 00010203 Out = B7877127E09427CF Key = 000102030405060708090A0B0C0D0E0F In = 0001020304 Out = 8DA699CD64557618 Key = 000102030405060708090A0B0C0D0E0F In = 000102030405 Out = CEE3FE586E46C9CB Key = 000102030405060708090A0B0C0D0E0F In = 00010203040506 Out = 37D1018BF50002AB Key = 000102030405060708090A0B0C0D0E0F In = 0001020304050607 Out = 6224939A79F5F593 Key = 000102030405060708090A0B0C0D0E0F In = 000102030405060708 Out = B0E4A90BDF82009E Key = 000102030405060708090A0B0C0D0E0F In = 00010203040506070809 Out = F3B9DD94C5BB5D7A Key = 000102030405060708090A0B0C0D0E0F In = 000102030405060708090A Out = A7AD6B22462FB3F4 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = Out = 9BBA4CA0FF8CF5CA Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254 Out = 474A3D4A55BFB364 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8 Out = DCCE723718444981 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D76 Out = 3BFC828B03F3BC86 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63 Out = 731D82FF69D32F91 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC9 Out = 2DC30C79EAEB92CF Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A6632 Out = 470E18E4AB16C21A Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB731 Out = 4BD0C46B0DD2E678 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A Out = 9EA09C9401808C75 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D05 Out = 190F7D3DF4EE7C79 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E9 Out = 93C91D8E02617E1C Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4AB Out = CEED4CF53E1A6CF7 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC6 Out = 63A7AA054DF3DD34 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454 Out = 03CB99AFC5749081 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E82 Out = 80A216A197DF7B2A Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E82744121 Out = 519A7FCDD0799A30 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC87 Out = 1257D4140FE18AAF Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93E Out = 06EA81DB5FEC50AD Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1 Out = 466A1C6592985926 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E Out = F1E040A7BA53BF73 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97 Out = 83D3F6587449E528 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B Out = 47195A20F3F5EB89 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F38 Out = B15CC680530086E9 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AEC Out = FBA0618A89484698 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB Out = 1E78313620262F04 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C Out = 3A6A22D72CD4BEE1 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18 Out = 1CCA89F7612EB1EF Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C02 Out = EBE47A6E419120CE Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43 Out = E3C84C1DCC2C916F Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA Out = A64933631D955CCC Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29 Out = 8CC6E0F1E0A1A069 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E605 Out = 7095084F0CA2BE9B Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C94 Out = D3B74D72533F0FE7 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE Out = 50489426B6585B99 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F9 Out = 9F065ABB4D0D176A Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8 Out = 8FC3896D73E4FA4E Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95 Out = AB1A9E9D1D27617C Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1 Out = 33192A15813C8E0E Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EF Out = 19158BE6BB4DF2D3 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9 Out = 124D9999C07C5F1E Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5 Out = 4AB5769CDBC18FFA Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCB Out = AFFAA607903DF845 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD04847 Out = 40967B87E46C92DC Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F Out = 73AA9EE7DE316517 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA8 Out = 0B80E80776D069B9 Key = 67C6697351FF4AEC29CDBAABF2FBE346 In = 7CC254F81BE8E78D765A2E63339FC99A66320DB73158A35A255D051758E95ED4ABB2CDC69BB454110E827441213DDC8770E93EA141E1FC673E017E97EADC6B968F385C2AECB03BFB32AF3C54EC18DB5C021AFE43FBFAAA3AFB29D1E6053C7C9475D8BE6189F95CBBA8990F95B1EBF1B305EFF700E9A13AE5CA0BCBD0484764BD1F231EA81C7B64 Out = CBF51B4D013F1408 botan-2.4.0/src/tests/data/mac/x919_mac.vec000066400000000000000000000036271322470703100202620ustar00rootroot00000000000000[X9.19-MAC] Key = 0123456789ABCDEF In = 31311C3931383237333634351C1C35383134333237361C1C3B313233343536373839303132333435363D3939313231303030303F1C30303031323530301C393738363533343132343837363932331C Out = C156F1B8CDBFB451 Key = 0123456789ABCDEF In = 35383134333237361C3B313233343536373839303132333435363D1C30303031323530301C393738363533343132343837363932331C Out = AB4884061A159618 Key = 0123456789ABCDEFFEDCBA9876543210 In = 31311C3931383237333634351C1C35383134333237361C1C3B313233343536373839303132333435363D3939313231303030303F1C30303031323530301C393738363533343132343837363932331C Out = C209CCB78EE1B606 Key = 4061610D85685DB0F4D9F1C8FE15A123 In = 3330303030323031393543555354303120202020552020202020202020202020202020202020202054303253454154504152594742324C54535435534F414131393935303232373133333934343030303020202020202020202020202020333030303031304139354558413030303030333144 Out = DBE9EB0FA03838D2 Key = BB296726F91480CDC432AB3067536EAB In = E7EF0EC901CCC8E5E44579A25AAE7FB82FA475ACD95F2DE313C5C2B7BCA63BA395496C9615347CFA7AF59CD4A31C8DD3C0027F9961AD7C75723E2C2EE467D279B13E10C6738CC0ED815DC125794EF8395177D2B2244E27978D53C571BB97EB6CD6FB324987F3360850F72DC9462502979DD449C1227158AFC41E217FB50CEB8B071ED48E110A966102C42A48E92CDF860028482299A0D25EBEF3DD74FFC9FF06E7D494F8DE2A59E0EE8328D8AF075EAF30A6D1C947A3270596057995CE799BB54D2FAD2B5A060C48893420383C7FE76C25B8356C5C5D72F262EB88306423E5B15392DDAD98E9F521 Out = 83C4B075AF24AB7C Key = 214B48AB97E144F1005831C8C97B8EF0 In = 12916051C77047C9EFD1E3A43D0086D9899AA28818BCCC5D8B5A0A848682F8981359E9DAC931A4B902875D3F87E318107DBB98967765F302BFFD8645807FDE93D8C76EA1F8125AFB99B83A209B5331190EC9AF852EA287EEA00D33208C11B364D92106D13360CCCC1807EDB45A1ECD68E77CED161E7404BE8137DE0E49927222B378F3E7D9C0B3F1C7A0A521BE7289A6EE76BC0DEAC0CB6BF7AA79403CEC62EF6456D63D168A2FDD2AD4FEE947878F35FD4B42E70B0E5202B8CC43F4B8A5E31CFBBA5A114489EE6E5DEC57A473E6DA70311C573C2AAA3FE2 Out = 31174049F029EB36 botan-2.4.0/src/tests/data/modes/000077500000000000000000000000001322470703100165705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/modes/cbc.vec000066400000000000000000002034621322470703100200250ustar00rootroot00000000000000 [DES/CBC/NoPadding] Key = 0123456789ABCDEF Nonce = 1234567890ABCDEF In = 4E6F77206973207468652074696D6520666F7220616C6C20 Out = E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F6 [DES/CBC/PKCS7] Key = 0123456789ABCDEF Nonce = 1234567890ABCDEF In = 4E6F77206973207468652074696D6520666F7220616C6C20 Out = E5C7CDDE872BF27C43E934008C389C0F683788499A7C05F662C16A27E4FCF277 Key = 46B534FBFFDAE457 Nonce = 297873B948A44B5F In = Out = FF4903E653AF83C4 Key = D581A1D0C70F94A1 Nonce = C1DDD7447249EF80 In = 69 Out = 60FA7B46523AA51F Key = A415B62E7E94CAF2 Nonce = 57FA9B2F95F57401 In = 02B7 Out = 63C1C1EF79555ED8 Key = 5DCBE42DB374090E Nonce = B6215A095582763F In = 568960 Out = D0321483090F524D Key = 8FE92291C654EC9B Nonce = 0C054BBD31A9F623 In = B6EAF23C Out = 88E289E1DE3E6451 Key = DBCEE35E86088501 Nonce = 11A8928BC6D0D117 In = 60A658CBBD Out = 89BFFA9E36FF1780 Key = 72338F946012CED5 Nonce = EAAA48B0C2EE2F3F In = 7E10CBD9E95C Out = AFC5CDF559ABC6D3 Key = 837FBB3167F0CCAA Nonce = CD399DD3E402F8F2 In = D907CE88F077FA Out = 3476402272856EA8 Key = 308D1C02E7A4E09D Nonce = 6BAA74F7F1A72E1F In = 9476E85B198C9AEE Out = 1AF298A150514CA70D252F88271B3CA7 Key = 126AFF39882542EA Nonce = 51BADB479DE66A73 In = 5C11285270E9606CDF Out = 78665ABFE3DEF34F8BD55796825EE915 Key = 0AE8510BB0FB3994 Nonce = 6C7293A8427BCB3B In = D1D3D8675E42A4242FBA Out = E77BB4A24B4EE8C9EBDA4971C2E60D10 Key = 0BE9277B3504D524 Nonce = E47EC7A77DB94755 In = 65026A8A41EDC1D880F6C9 Out = 45A6EF4ACD49F9F1D892A808FA7B6F28 Key = 2F03C36DE4F78E13 Nonce = 99FD2E8848F33FE7 In = D72E81F4130107E396D5FB27 Out = A88EFF91876A1B6958D52F99FE9B18FB Key = 69329672E546C969 Nonce = 294922CBE7E12341 In = C8A3971EFDA18AF1B18BFAD98F Out = 54FF90BD90F6213D761F4B3FF89A8DED Key = 3007D71E86D8EAF2 Nonce = D7E300E168F60063 In = BB9A90F11551531DE512DD48270E Out = 9BA7908E56EDB1BEF992FAEE40F5B1CA Key = F73C8C3355092EB6 Nonce = 2E0DB2552BB83AD3 In = 77D6C182E4DDD444D614BCFF98FB13 Out = CB50DEC4728FC2F1A1A5DFB84FA1BD25 Key = DD006F15E727CB62 Nonce = B256DC4FDB58451B In = 40AED22F93DCFCB1D734B7E4657DD31A Out = 66D17A6E9D5BE3281E857B4C7E497988CA684524FD994882 Key = DF70FF987582CCFE Nonce = 88BB3B9BB2EA56D7 In = BB25564C7EA1E5BD22016915805C27B51B Out = B7CEB5F5ED2945F131064BBB9213694B19A04FBD1F138866 Key = 747E09FA9BA257DC Nonce = F1BBD406191DE0D1 In = 49DAB8D85EA753CF4AE2ECE7A80F0784E42B Out = D7FCE9E5BED161AD7D950E453677E5BEE422B7542AFC0BD3 Key = CDAD411D0FA80E9D Nonce = C83D55B1196958C4 In = DC13A6ABAA35CEB3E6650F825A67942114AF2E Out = BAFDB50E16C9FF4449BF336D410441D56E1E5335B54C9F11 Key = 642D12C591F6A4F4 Nonce = C17D0C69067AF296 In = A8896D88907AD77AE790828C0A3384C1614E07D9 Out = 70A9EB1C11BFD1B1D68C20A6B72C869DAC5372A8ED46AA07 Key = 62C62F54C426C59F Nonce = CB6252CA271FF303 In = B3FEC4CC29DC1ABBCF7D86F01D2C02C2A723E7C2F8 Out = 48ED5583A04D333FFAC9D6462FD96BF79222EEEC70A6AE70 Key = 386DCAD5EAE86830 Nonce = 48153B966C8D686D In = AC0B4D5752D2009BDCD42314D9723716294146424542 Out = 8A284713F8C9873AD5F558B995C5A67A66557A52601975D1 Key = 782545EA65D89B01 Nonce = C2CE203020AABB0A In = EA331F6E518A8AEAB2EF0A4E92E0D198DF5DD0CC74369E Out = 6D3D7DE9938935F9FB9AF839E416EF6F842F2ED827334BFB Key = ECC650E1ED1CE8A0 Nonce = AEBC43AB811AB5F1 In = B292D3A3FDC5D709709C87EF91122761847871F9B4E33426 Out = 21DAE17D157192146B52C49D90F898B25D0D1DFE677E8CD5B568814E9C6BB6A8 Key = 4755B8639FD7C8A1 Nonce = 4152E22F14BAAF0A In = 65026A8A41EDC1D880F6C90BE9277B3504D524E47EC7A77DB9 Out = A3B6404C4D87F72D5E0995D7CC20ECE742D9705D48524CFA2820317087FAF578 Key = 92A18B78A25C4B7A Nonce = C3AABC68CEEB22D9 In = D1D3D8675E42A4242FBA0AE8510BB0FB39946C7293A8427BCB3B Out = DB621F2FAC9A924C83ED0B9E8ACEC9F1E23BF3FF2AD6EFA814903F2CE293107B Key = 2341239C09C73427 Nonce = C4D5B2B6863DB060 In = C8A3971EFDA18AF1B18BFAD98F69329672E546C969294922CBE7E1 Out = 940C610A41F04E7D9BE0A74D5D00FE97A2647D3D16E9B76FF0DB5BBDC197C82A Key = 166EA8ED9D29E1B0 Nonce = 2BE993C1BE8FE9ED In = D72E81F4130107E396D5FB272F03C36DE4F78E1399FD2E8848F33FE7 Out = 7D495CBA50C4127347E3AD29E3B8C098A3312782E3D45ABFA1621F64BF8B8A06 Key = 3AD3301094B2F471 Nonce = 8638489AF44732F0 In = 77D6C182E4DDD444D614BCFF98FB13F73C8C3355092EB62E0DB2552BB8 Out = 9D926142271E814BA4603509187C9020DAA0D50F15AF6E698E384644E9468C11 Key = 04BBFD95AC12E6FF Nonce = 30CB120D13391C44 In = BB9A90F11551531DE512DD48270E3007D71E86D8EAF2D7E300E168F60063 Out = 44858416F946C7FBDFFD720282881630803803AB91CEAB1AF4F68F50E9C16DCE Key = 35501029E137D63D Nonce = C1E0E3A06B357B51 In = 8EB8FAF49126AD5B8A0AA6DF8B52DBE50DD5AED271641EF983BD650DA69816 Out = 5B4622F1C4FAA817EE3AC181B969A7AFED7117E23F68BC6017519A7D1399CFE9 [Noekeon/CBC/PKCS7] Key = 56C5E79C74EF63A2B64D831EC0FE0F5A Nonce = D79A4D3B34BDE6BFB4DC0BF752987080 In = 13 Out = 34B809F9AE45A52C3C8509DB14932E88 Key = F4983295EF1FA592DAB2310E2E880FFC Nonce = 51F3733F3165D6EB65D5B43EDF35D740 In = 0D67 Out = 162A78296327F770DE69D67E4457A8C2 Key = A91A7BF471F67C1A0965E581A2222406 Nonce = 1B5F5B8141905F070FC52D9CD50968C1 In = 63AF95 Out = D174647B1A88041C95C7F008C7BA4A28 Key = 138AA1677CA227FEFAC8BFECE91CC2A3 Nonce = AB60820C1B2969460532B9C3AACF2863 In = F7EE3026 Out = 9C1498690EDD348D517ACCCE942235F0 Key = FB9DA8B850ACDE73B5995D5E913E9B7C Nonce = A062C36CF4F5CDBF6424D6D37F33FCC2 In = 0F330C110D Out = A3DB1F6987910561A9D34CC4B614CE73 Key = 387403BAE6E59D5E028D9AEAEEB3EA82 Nonce = 62200EBB9FF187D0502B4DCFFCDE6314 In = 74322DD18E42 Out = D18CCAF4D22AD3D84BABD35A63DE9BDC Key = DEEE15B8CE0C0C413B0AF67C25BA154A Nonce = B357D26FBA489278236388C9E6A21495 In = C70A03E92ED032 Out = 8544D24B952DE66076CAFAF6908B61F1 Key = CF66029926B58A127BE0EC73B2077100 Nonce = 522D3061784EAD56F460947A6205300C In = AF8CD43A3261B258 Out = D504F374BE690B207353884B04C5C0E2 Key = 5818851FB541EA23F545CFB969436D98 Nonce = EB8BC39214CAA0EEFD886154433D3E3B In = 839FB81A72FBF5C48B Out = 53300ADAA73B7D064C1B988D188D7F69 Key = C5E00BAFA4F9E1705589441B9EA9505F Nonce = 24F146DF583FF0B84557446575EC3284 In = 58AFB2B30F6716934B01 Out = 0907B00FE2F8DEFD08FE54AABB5A4B10 Key = 2864CE9F3A5511F63903CF0CD0472240 Nonce = 96C419A75FCEFA60E11312CEA3241EA4 In = 83F62FD42E895E13B7E34C Out = F64F02BED29282D976A61F6C02851B27 Key = 6D5E4E6B297C7A69AF683FCB18C4DEF4 Nonce = 202DD513E6D521842CB116CECB1F17A4 In = 99D8D0271E5D6C510B38CFEB Out = 15CAFCF3AA4BB5A1F018267C81482B4E Key = DFF926FD70664DBB19833EBC9068AE5F Nonce = 7E62EDC1E23489D5CE838CA3C5E327BA In = 58E5DD103A644F47351FE13A4C Out = AF390EE66A8987C6777B0070ED0D759C Key = 92D13CAC6300EE6F17197E299ECE8671 Nonce = 3F31171C66235B9D9EF6DCBAD5A33AB6 In = A35798EE1FBF7F92187633E57FAA Out = 1C4D55E9F8B8D8458B751D8016E0CED2 Key = 99F1B3BF5F635B125C6E430BAF0FDE0B Nonce = 2D64CD72703C8841F8F451E586CE52BB In = D8A412EAB58D217D70C7B9C604B783 Out = AE9DD1426DD34F2BF7B3B478E59D51B9 Key = ACAE925B9F91D3BF59E6344D1996B7E6 Nonce = 66BE0EC9F49DCF852451439BEF133EC1 In = 2CC0A7196FFF6B14410437639D4E52A0 Out = 21698232D55EB045290B49C25927502FCD4314242F2B9DF225514FEF90E313D2 Key = 2AB3F9635F8ECE37C016FFA9DD5A5279 Nonce = 596AB3D7A114DD167A147FCB4E8FA522 In = 0A6B5968D3AB48F00C501AF499BDED6FDB Out = 432003A72A1ABCD2A463465B9794357E209C315C087E35C5F48336295F67F685 Key = C2DE2993F036A42278976FA347EBBBC9 Nonce = D6AA4E2906CE2A41DA17CEE09FEFF11F In = 7E96CEAF7F052A4D85C487FAF30A712E5D6F Out = 790C13E773B628CF27A92925CB3E605351293D031696EE1EDF738727CC523DAE Key = B20DE0EFD63F108EEA8BDB70D0392F6B Nonce = 329D0EFC4231C92E04D9A0F2BFD2AB0E In = D3AFD0D1F52D332005205944E465EA567D3DEB Out = 3707DDB6A30F4D69A5B37CA8ED053A7F1C638D9C9B940AA09AC57A4ED51878DD Key = 8A8A3F7D5FE8F459A1461153B4F76211 Nonce = 947C1AEE44B94B91FC1C62C0E9028284 In = 5A82E2FC993C66A31C005313B34193DE78B4E04B Out = AA1892D23ABBC7B9654155C9386C87D3D33BBB6086E567E1D713135E2CC2140B Key = 0B45B853970F62B6F24BC5498F1695E9 Nonce = 860A1A59C1F3236B58069AE9B3F58BB1 In = 3077002017E6E8E72AEF13DE3FA8B6634F9ACD2F33 Out = 897D3F4494E271915383322EE393A6C8C24E456446A04CEF0F183B79A322D9C6 Key = A51BC2500F49C9CA2B684EAFC3929F63 Nonce = 8E982F2645F6CA43C0E5FE6AA349297F In = 8A6D053CEE814DCD67D809E325236B08658736119D36 Out = BE86C4BEB29B375D461B48A1838B689B6A22379442997C2ACC8D3BAFED8D4836 Key = 6D0FF160740C3F2007F1A2D9FF0764F2 Nonce = 2024652B0E280F4F8A93E1C4D586BAD4 In = BF4704F12FC4573DF7CA7A53FF1AC9FC9EC2D0A0155803 Out = 392929D03CC9C781D66F57FEA40984985006AF5C5692359E40C3089A0C08DFDD Key = 678B962676645FCCF06DA0DFCBD33AFF Nonce = F120FC32EAAFFB07E35C0F15A8D9EDF0 In = DFECDB8353EBC87CD93D9032C85B6FC7E325DE835F69EA2D Out = E706FDBCBC6678583BADA7959B49ED4FA21F4E601A7A68D2FDB60B676AFF33C0 Key = 5C592FDC4B2B3DAED6B5A7F6A2CE9CE4 Nonce = BA1583958621CA564AFDB695A0A050DA In = ABC5F54DC200DD2DAA7EAB951F02181DD9720A80049E01BDC9 Out = 0D37E7254C1ACBF30A7AC5C69490E90B65A0E359D2146BBF50B5BA4787EF9ACF Key = ED4B91F32EEA0976A33F64FC43AF2CFE Nonce = 6EB6F57BDF2B1591FE46CA47D0DFC0DA In = 9EB4D3B7B4C56EB33A8030807FBAA27D22246071D983844703BC Out = 2304C35624BB448BDECA623D39445182AC592C71C20878F5E39C8E9A39762A1F Key = EBD731F49D23576D1E8CAF4BEF574A05 Nonce = CB9E26D5905B16EA48D219456C48EBC2 In = AF7676154A55F1F3D15B76D19CADA03A5D8436FD2B6AEAEB222A5F Out = FADDF8B2B3B5B1685923E5618022A832180493F47153AE61F8404A538B4DB737 Key = 9A912A664FF96EE3F469C779155501CC Nonce = 024D04B050718AB5682DD19AC6A23592 In = 13122D32A60EB988D34AD32B788B8CF5CCB567FADA3528B0DE384050 Out = 4B951CEDBFAA5A5178D22CDA8664AEBABE478DAB09FC0BF2DBE973C404FE07F6 Key = 2E7E22C4EC84A63DFB9F98306C0D45E4 Nonce = EF523F0DA968AEA82E2F2D23E8AD0F07 In = E19A1FA72689052C2B9C76A33000D8A0EEC8922A1BE781A6896E38659F Out = 71A71BCC755B92120C31F1B99C085E236EC462FBC6C6296FAAC5AB0EF6CA811F Key = 1311EB599EAE368A9C1E74F9D1D47BAF Nonce = 4C7502264C3C81E0586EE0D9945B8649 In = D0C9073DD44DB4A4970ED69029EB9FEC5BC336E9D6E92A680A75EF0C3151 Out = AFC5FAE5E52AC9CE466881AC5B667385234F6792DB7645F42D2CF36760FAE219 Key = F16CD73539227EC5BA4B516C7CFA75B3 Nonce = D17E2642CDE1B30AC5BD01CAC83CA84C In = 20C167D950AC5A84B6FD9CBA41945F66C24F79969EF9B19DD116D76CF64A5A Out = 148752675C1DA7236701AFBBEE8245158CB80829CBE1079B5F4DFCF59DA4FA04 Key = EC35A92D97B902220D88C3386EABC55C Nonce = 5431D970289E7E024CC0BABADD674C67 In = C068288373DB250F6714E0F9DE4A63778C91E1EE81963BCF98F2CFF2BACF3553 Out = 31E053FC7124B23E6FDC33878FFEB9A8421207456460673800798E422A7E94B1195EF848BF1E063CAA7576AC094C1E4F Key = EFC07A770AB4FBAB2259B3A3DFBC6782 Nonce = 5E3A9763D6DB8699B903D230387FD45D In = 03940BC21C33D89773064B8A35CD9FD282F090BDC208A0EED18AAB45AFA023A188 Out = D3B49ED8640D32CF6A088F8316929C703039D9D3B6C43C32DBE99F8CFE54CAE40C6B9B587F11F1E1B421D987AFDC7D71 Key = 0B747E8737C8555F5FCC1418A8E31B5B Nonce = 0C403788F70790C0503152208A8E9CCE In = B6B8DE15FA0A356241354E771BEF08A82955F7F35DF8E286EF17DED946C770B05356 Out = D3E2469F505D7DC2683AFF037A1197362F40F5A623F7D8350BD5BD090B63793A13A6958BF9E0AAC0A8A792B92584A295 Key = F43A11C50188A97B132732245D88E2A6 Nonce = 377F526D07DB430BE1C478225612841F In = 923EAE6FBB20806FD86F7EBE2ABDECC838EF66D8F9AC1C2C185EE3C1BAE0D9FA32444E Out = 327E33EDEAD51CD874420D8FF3C0641CF4A1187B2C56259A71F60C23EA6D8CB7DAE38198A8321B6ACC834D27EB509CCB Key = 6158B9B7AACC9DD9643F0627A616ED3D Nonce = E21158CCA6D0656B58C64195B3618B58 In = 9057941CE977D02B1F6894251363F425DC515C68150BA5CE6F3CB1AD2EAF1B5666E67C16 Out = DE4DBF13CFF69DBAD566A98916B1AD670F6037DBA9E06B5F9A3CB59E08D24157C6E6F2250211B5F32631D6775F06A579 Key = C8424ACD2EFD7C436FB1585AAE45CCF7 Nonce = C15FC97E431ED75E523814EF991E3D82 In = 8DDB465D9C82EB9C14BF2C2E26D90D8F1B5E444B12ECF19791F16DBB2DEC2D5B612F666D64 Out = FD774E848C09A079ACDD9D44A419300F2847F93478032C6066FA9E89359C1280E7AAE4C1D1933A47FFE0E02E9582569D Key = 11F33F15B8C0682B634486C48BCCBBFD Nonce = 0D96D9FFDE5C617201E0997747EA02E7 In = 124B752BA886C4ABD367AA6DA00115EF08C02D9308F739A63197D132E7E1B21AAED339229E3B Out = 2994CA132E3A30DC1B04D9368DC9F37401442E78AAA935A63CD6C7C9DFB1ABF818B48863CA8F20E8B4F5B582C3AF6284 Key = B522777FCAC3652A1FED51D8FE3383E7 Nonce = C9170B715D6CA0EC9CC569074A21CA7E In = 37FCB3C6DBE79BA1FEA19FF5C4F14DED4F403E970DFA9501D57751E38A174514862575CAFD31A4 Out = 08D6FC20CA4B2487929F9548D7D43E6E6E0676B2030FB539FBCA79BDBED41315AD1E1C6677B2B83274BFD5B6D62CDFC9 Key = E258D2823B59737DDEE65B6139C8FBCD Nonce = 32C7481FD836BC3A9945CAAD3477E16F In = C7AF9A384643D90CA1FC461209048836AABED909BE8971B4D2B7613628A3A90964A0891C4B658333 Out = B3D53C6E550347335D677019EB675DFEE6EF263946C43CA4C07D68340E745F51B5019BE2841B834154F0D219598E0884 Key = 0F52FD5FBEFCC7E25CCEE870CF00DC25 Nonce = 4EFB84578A93800AB7DA40997A79BD89 In = A9F2347EE607A05E505CE488B779BB6908ADD5F7DCF20F47F895B64B029EDFC2A3A84946BE935533BD Out = AF1C8D0F1CAB3C4627E31B69A9207EBAE680D8D092A411994507DB47643991723B6AC3ED37CCE02B2B599F7A4C265011 Key = 1DFE339178BC2FCCDF847A885B026C3B Nonce = 8D1A7B3B4E1F32BD9D34A6FCA9C4689C In = 5FE50D3ED686D329D7DF5CC4952AEE83E0FD0265CCB032474152A19100C85154CE0D68947450EC32D66F Out = F08F5BD75CF2372E6B5D82FD25AD4C8CA2250280C1B611EEDEEE4715B9974773E9D9E2183CE3DCE2138F9632472BF184 Key = 98120F0F48839DC5E9B7472ABC73B61E Nonce = F5D19A16FD2FEC948458C8ECD96A20EE In = 1663DBE5C893D4FCA8DE266978D7C48D70197254796D394EBA09ACC27D528B63DF4026B8AD27DB07988858 Out = F60B2CA4AC382B2127CF452CC9466B7388A7C78E1B8D9F27F3B95B70DA3D74E2F9F092C5168FB96EFB220F90CE1AFE03 Key = 213FF5A5FE08326FE2E5C5DC05604A01 Nonce = 465280C995DE276B0B6B6378C8408CB9 In = AB6B6488895E81DCC4298427FDAD9EAD39561C5C99D933BA15F5DC705B5E094B5387D2E88D91294FF6F3B8A7 Out = 5401EFD707525F1E4915EA8E80BBE80C9FB5E6C45600426297FBE05ACAAC7DF09912C000F643E6E9462491B30D67658D Key = 2F3FC6D862409732B91F426A12EAA155 Nonce = D16992DF8C17F4CB936810C81CD963AA In = 392477CA63A896B14131842857FF6A2C30C1DAAC96818F89D313BE2EC14C39B88A855E30ED9504131CEF85640E Out = 2E196AEC24F2D6B59B57722F58BB8CD6585813B7050A83482C8E5C38825C1A6265B7BBDA707F5E6CBB02C86643BA67D7 Key = 63D77FC7B6ABD00AAEBE33C9B2EC1E5D Nonce = 6F12888D71AEFB2420B163811AF9BFFF In = E14EA57790067110020E72DA6AA2A972352692F86264C3CEEF69CBA1AA5E58DD23A991F988BE7DB99821333B7895 Out = D01D65E636A981F5F3D4AC9A829225E82AB76DEFD23E0691712CDA65FA6E6538BC512D6E44EDBA17BC2D1CDB064DCC9E Key = 5A82107DD3B3FC7D9D1E4CC5117EFA7B Nonce = 0803AD8DE267CDC8BBA99069E8D892C4 In = 038534D14E2FC942B0C504B92C3DC1977B4C962235DD3BBCB5DE9D0E8A1B466ABA575BFB125BAF3FF480FCEB6E4BED Out = E344F758173083CD3813410BA07FF8F9E781E04890B27A598890DDA728D08B2C19401462F2A649A76234F6D428160E32 Key = D337AA8F200C073F4DE5E042F352CA42 Nonce = E5FD769526BBED0E5096997B57FF8D3A In = 564677770E8B7A02485987661EE2B6EF8EABBF80CBAE9404E75A2FF7C4E6834E438FBF09E7FC2EC63521A12A6D4BB30D Out = ADA7CBFB49234A49CF6098350B84A8A440504671889126C1D0F93B2CB616F988D4FE79C9C15929843B60C35348FC91BC6244A225951C0A07F185DFEB127260E8 Key = 3F65622E95331BCCDF8A6514163AD1A1 Nonce = 55D4064906F2C6F67F2ADB2D1A9CABE9 In = CE0C994114AA7919D9454BD386008A4B87CF2A54BBBCB122F2992F7B3FC01C5BF0E4DF661265382C57F57A5D96F226BCE2 Out = CFEC3737847E8C27A58F7A616B76D875107C6E6DA75F2DBE21F6C2090AA45F082FF3ADE9ABCE4692D85D3EDB17C6EC108D4FEEAA67D5ABAE6BB8E5420F0F6BDD Key = 64D7B821DC6916A464D41B2D3A352728 Nonce = CF8AE7BAF39569FDAB4BCDE9283E4EC4 In = 37B6E210FF6F2810B29653D3C3B2B80D939AC030C29C1E2D61D9C4B5432B3FD3883D34C99DA9D701EBDD96273D3F292F3753 Out = 7BA7D4D5A586552FC008A7A82E8D0475F3DB4C0795C9DE735700C0751634B329F8F71D21701F74E1F179F87778000B765CDB3865CF9569713DB023092CA8B4C0 Key = 0CC7AA03EAE54E833C10616F0DF07FBB Nonce = B77D7E2620DD96499F46F311696DDCEE In = ACB7AB275B18F55C0A45CE3B2CED3BE4DEB113CC4ADA87EE851A1196BADF0B9F91D579104772040B3A33DD277F2A33843EE909 Out = 11D15D948182EE585F2690F236A4ABFB74029D525CA579AADE4FCECF4C47A2881BC6F04535C514D13A03B23D06B4BCA6EAD0C2756D6B5D5C616B229DAEB58848 Key = ED590A7F005156105AFC45D9CB50F525 Nonce = C5F2970624FDB6B7DBA0A6C2214EBA3A In = 27C36747E9672CABAFAA5BAA95E95FCDA760FAA3FC1C6C7F248C374E4C6C9A1E4A44873BE795DDA3ECA213B2146DD8E722277619 Out = 07299B862884F6FFE4657709404917F411BC24FDC2B6E504331E6D18E94A71F4F5CDA54DF8FC3A0E77EFF63EC9D0B82F8CBDE1DF86B917CDAA45EC4E603E364E Key = F567648AF7EF8A506E5F22542A3C2867 Nonce = DDD7C1DABB2436BD0FD28D6752359863 In = 9581E9A8251C7DB9C4B15D2B208FF66874959D134FF812FF3639D1F1D05E02C7806EF336D67782E8D05D1EE900785F7267BDBBE76E Out = EF5E6E49F0A3A01BD37C078516E6A85D6B5B04B1E4CCE934FD3D2872FCD08BB949DD606B4771C02FCAEB09A666DE721BA86A68CB975BB394D1905E3A1A233B3D Key = 79FF68FEC504D32A717CDEAB94A7B5BA Nonce = B30BB4EC282B3D4B6135A7E17C2D34CE In = 0683980F2EA98F5BF000D2E9AF1DC15A6311A13F398DE23D0579BAAFDF59B0A03F051AC214D80316416222305A676B17826565065FCA Out = D96932925025F6D2CE24CDC3A4AD07A90456F011681A669C1C45B685CCFC73506514BF22E0DB166F37628F4B8DC3FFFDF60552C96B6840D0BDF510059467D7DD Key = 573A08B1064652C81BB99C46C7C1944C Nonce = 26FF1AF8F21A79BA6F59A7BA710A51E6 In = 4DCAAAFDF72971AED4B15B46436E19E7C8F79220C8EF7855FFFE378C35F578B75D0872A37B67DAC675083F9ADEBA89DC5C6A057F762F25 Out = BE12616523F94449F8120B6BE35C84511A59E4D40B0430EDA4C4DAC995BF0F08856EAC2DD4E709BC9D813A40D8FBD588EFAB275E1A11966666CBEFC08050104E Key = B493509AE30EC0AB626D2920D9E929DF Nonce = 43491F9196D8251FD46759222E3CBDBB In = D41B814F718B82CD1B1F64071F9429BD180E1DE6F121692D17AFB7AFE64CDFF9ADFC20E10B02A864901F90B863BA85D70E7CE4F53162FEE8 Out = 70A7862DA2217F3374CE05AE4772231A489F2912BC1B9A3483A6CF9F11AA05C330BDB25BE9EA678F73868B29F908C1B4B715DF760DCB23B3172D7EBA94477541 Key = 0BD6C4A47107E38C3C234BBA38F4794D Nonce = 0888924CB3C8DF8FBC8E3CEEECE1ECED In = 4AAD61A9D21D7F76BFA86A6B054EF02BEF75EBA59DB3D7A8F6AF2472923E283D0BD50DF43FB832B74EC6AC1A5B6C55EB8A929FC143E6A2CA5A Out = 59CC595EDFC1FF1EC7E3D179273EDDA43BDC9B7E91362C89E19910FC4BB131A00B7684E147D0912F3B71C8F2F9B00482AECEBB107923C38F89B7C6CB232BEC5D Key = 1022A5A56788270CBF3303D958D8E365 Nonce = BA4179A2F159004821934A0ABA0971BD In = 1A0AC832E284616BE2EC6705DEBC789465339B961D029B00B9ECE780B32940D84EC00EB29991BD92572E51614C37312A44AF192C189F5D0B034D Out = 12CE713413361CAA87DD2E584677B44AF5449D09CB083BB459EE47F65C834A59ABE9E557F4D961A6EA7C058B479243799B291FFAAA5B1771BCE62C0F83902A3C Key = A6E9CBB2936DCE26BBE3BB14A22C0B43 Nonce = 0D061B14FCC07756F78590BEEBDFE3A1 In = 77D91E9A2ED17549724830B17B5394B44C6F5D54862EC45D2124129471A3075D75108F34662056550A4ECD24133FBECB413EE5BF58A5EB089EE8D3 Out = CC5DEB0FED41FF63865638826E70FB572CD040CCF9273183BAE3EDA2124AF44444597AA311A182C59C6F2612A0A55B7CD048A1F735FDAB8E4BDA44EEE347DF2D Key = 930F2051D3BC4BA985241990B92C6C29 Nonce = 6E12ABF415BE763B09326743C4D03EDF In = 508C2A9A589C470FE01A24303A63E7F54C4AEA5053805D1DB6B1F6481511FBEC1D32BE1284B0CA1E24AA234EE9F6A77A448CE623C1EE0FBB343610E0 Out = 424E77DCB1BACBCB1954F7FF54C5ACDC398F98B522E556C0362D9992E8A00953D94514AD35311016DD51AE95BF7DDBE29E89F1827C65C278BDB0FB9D243E7B75 Key = C5E25A158442E6248D257114484E4FF5 Nonce = 6371100FB16BFBE598590476C43F143B In = 3DFCFB4B32C9FBA848403256BF0D3AECE761EC23D492DB5B9A6845123F01735848487CB1CE198028B4FE605D40F7039BA46371436E2653EC84A132A7CC Out = 49355D300361AECAED24CBDBDAFD6A31EA8358646F84FF75B7900F6AAD59DD2515F8FC834EBDDEA297D2AA36D1103FAE5DB9C60D213C4CDBFAABC24E62F631F4 Key = 478C7266D82E73C4C3882CA4A05C0A1A Nonce = 9C8336BEBB6F820268F2E6D0807EA389 In = C50339C7DC951DA35A36F4F613899000069F50A41BF957A75118C596C7CE758A2BDF378E4B83F31EB4CD596D301B1617DC1C9E08C70B2C3EA410B546756D Out = 8ABAA6655CD7D6ADB51E22ACA8AE019743F47BDC8190C05B0FEFD88B5669434D3202F1C121D51C5E46AE46B28DFF3195F2F8DF2A94F5CD0F7D11685AF6D10F0E Key = 527317EC7A1D9762E6891BA823FE3500 Nonce = 6B3E5D8466A4D655DEC67CD62807AFBA In = 1E570542A73BC1A212A8503E190AA8E24C7E5D87469ABC1208275E17DD5D7882EF33F839A2CFC503F07641184C77A0B1B017EF916F638EBCE5B253C18B8212 Out = 13638206A95985F22D055C9350F00926154ECE397C1FBBEF16B66A3E4B0D40469966E45C44222B903027F20D7AB620DCFC0AB5FE2D7E563B631E191F762ADCD2 Key = 6D632D11E9FD60638E3F7D11ECB29D2E Nonce = 66FC28B235FAA4C012262C716F9F7204 In = 2E83482C2ACA9B7C9010809C25597D74D19F8AB95FAB3A469D1B31D9968BD3755D26F12B4D0D2D54E83ADEF3DA53F879F095EBFC4AE8D1E8562E90C55B22FBBC Out = 857882CF9E0B8C298D1A4BA1AD25ECD9FA50B3512A9BE93632A1BD8F27E768DD23C8955AF6B4EE745F6CC162D9EA7D9B99948B3F256078705A192FA527AF8D594FACE3E88F0D3844B1E24A7857477233 Key = 5566DD5873F4C7D4302AEA5217B1D5B9 Nonce = 2C17CF9E41895A1871D5F3EACD478E20 In = 7BD83E3AC317811A304AF3428DCAB0379EF114DFB9971F6BF67677A2E513382FAF0E352A32D7F3296475A39F3A7E851CD3E5225D0B0F675B94014DC9165A1D9A1B Out = 0D15F0823F83D7652B4655D8ECCD0633FDF217CF477635269D6009DF417382361E413DF7495006E9967E82090A2D99D5A690A2349C9E6A350290CEBD1EFA4959691BC52BD8BB24913C440B9623641A1D Key = 9AD3C01359760D2B9D7114ED4C54E35C Nonce = 1A0E62541D7AFD5ACBC18DF5EA79CDA1 In = 1D464A69C8E8DDDFF2205F2E7336EB89C7EC1002660649CDB1ED826B5E8283BB02FA96F18B4570458BFF5086B46EB4EF0F87CC9F39C7FF9B3E881978F7FEF9CD48FD Out = F4D03CC920684F92865C2E5B7DCD21A39F0223990AFD50C38A90325FD038817FBAA975F2C3AC7EE4192B71104921B9F852868276192EB9545CC14B8F9BE3696414745BB9ACC575C0DA3A1BC72DFE420D Key = 623FFF24CFCD55E89911987DA599012D Nonce = 5CE090821525286F0F60E46909107087 In = 44A5F5D7B96035F5A554499EA17B9B0193484376812C2C2DAB9F459F536D97A71FD4F723123156054FE53DF577BC448C124AF49AA9D003157272750BA3CE5712776EE9 Out = E697871A69D625FC8F8894E6056097E354A88118E5189C215254E0AC2C85A6A1092A34314CE547C56D60E14E494590C9965BDA9D75F47B20E8761D14AC2DABF351767830040808ED9673E88A89050BBB Key = 3195B7E2AFE39355D556F29F21800597 Nonce = FC64A4493B82CB958966E1F93DBFFD8B In = 6FFC0D5515AC7AA12CC56503CE163F52789BA0FEFC324ACE7DB228187FF7E1EFBC2EFBE3AA010B8F6D298952B0497FF677FC464B1FE51FD93E5C2895EA1CF4FB4A773919 Out = 1DBCA0F4EC05DAABDA02689166F93B7FB4A3229D7DEB3C97B3846E53F7671383DE567BB10D8457E92B1947F36C5BD4B9AC68B5633AAC16453050D65CF8B85C88E5F7B9EAC641038A6D225BC5B60BF39F Key = FAA44A1072FE894478C7557B6FFF6394 Nonce = 6E5B9C688C4A5C8EE4B4CA1A263D6E00 In = FC9D3C47542680D7ED0FB2388D42361F9583D2ED2285AEE599FF6E5DF9471B80E477F347B6C88A83ECD1167EBBEAFF93745BB0B06735EAF25579C679DBEBCFBC335AD348B1 Out = A4652823CE03E688DAF56F93B2DF8C9F55E399B1B13ACF7E6AC344A7AAEFC327185BA29AC9FD0A29C42367D8DD4740A4C464A5979827C793EB29068F08A4A3E5FC118CAD6C58CDD04A6F925617010727 Key = E7D0BD991DB9DA63027561A13D620F72 Nonce = DEFC409F9D66328C93426D55BCC5F3C8 In = EAA0F53C3414A0B7B6BE05327F5F2D76ED2E5169E4ED5CF7A5F066B1196F4DEF208D544116F2774B3A02608DF263415CAD366963F791C7808E2E248882880E2665436C7E8B44 Out = D3AE352CB790D12797DEC61BF8C17AE0557A764B4E3F2ED2371BC624AFCB8A6B340BC68A4E97447FAD51A52865B5A6A492BAF5AB525653F34392B299CBB74FAD14A16F3D7EAF4C00DD73FCF4FC885EC2 Key = 6B422723B4A706C9A184FF4FC38824CC Nonce = CD0ACA21752C4EEF842DED5A53BE27B6 In = 0C3A5198A1F0D228611124BB18A94A59637B8EE8C3BC128003D90645067C1D7E3F12440B08DFBB24493A50D963EFEA835497F85DE87A3857B1C5FAEB0354281D76BD618D1214FF Out = 9A13204622AEA6CD7F70C34518555A2DA17A3CE11E7A832F6AB69F8EC8880BF72921470897BE8B0B90BA88020847BAD4AE5E9A37E22E6FAC568E6EDD1FC8BDC0E4D7663CD573F35F43BF4BAF85BAB7EC Key = BA37159B1AC79AF43E716741699FE664 Nonce = CF45A98BED7B6ADEA83EA03B6054D857 In = DC05E863402163187548943B43533CDE7642FD31BE2A177EA79CDBE52053B538A394EC65F09A1091593892D6251F325A38AE360D6D7AAF234F9DA6E841523A2F7AC724447C9631EB Out = 3A927FB3306824B549B18FD5699643A08B64EC3B9E1322FECC32036875545F56DB2FC7B34B7A097FB4C7E211BB5FD8E1B69813BFEED2DE4771AA6A4D4557C232BB4A488ED9DDC5CE2CC8BB67A7B66932 Key = D89F12C903BD9E3D82E05CC72F88DD2C Nonce = 2A46464A0975A3D77884BBBA01508D2C In = 6768571A03A74594A20909B61211C99F91D3EFAD8A72FA0460B5B3A404D7F0F194677A90AFB6857B05B923185C6AA6043A7E8373178647F528645E68E0FEF4CB36187E0083613FF998 Out = 88CD0288FBE70E08403BDE580AE08E23CD0DF5C7E1BCB076E6F0C274C48C389205A58F7E17871D1F3DABF5DD3DB597ECA98606DAD8A5F6F66AD5E5AB16E6DDDEE91C55EB62CE86ACFE87C4C703710ECF Key = 197EA77B0320C3E2F913EBABEF18EB1B Nonce = DE295D509AC3165B53922EA9C199CA85 In = A6428DC3C3398CE37098E1F059873CB92D937C437A7D75D2129BFC5528544E4BC50D29F6D882BFB8E500B2625BDEF5A6EB1DF2F3A5FFB9260C540EC67C033769E6A84D6A137B257473E9 Out = B6218336CE13C1589B1892BE8507B218DFFA2018AFE90CC17EA792955069831ADAC30AC868339EAE50B10E513E7F29EE2914FA41EA76B6CDC99C4D300DCA5E9C2A96023F8D834B7404956F51667239A8 Key = 9741F404AAA4838905C2386DBEE885DE Nonce = 7D57C18C4C0BCA04FCDE6F8E38D413B7 In = FB413ADF6745E383C87EC50BB8DEB4CAAAA4C5D24AA3A449018DEC8A6B85B10B774891EA61757BB17292B38ABEB12DB3B71C71DFA92D475963B0F1B1FEB93AB9A753D11B753EBFD2A3D74A Out = 740830C6AAF2BCEA878799315F5C842C54D760771EEE19F172C9289C0876BDC03A608B81597EFA11BC8A7A7EBDBEED5761822EA62E22B9A6EA530C9410225BD1A6398CC8E257EE054B2C3D87A05DB73E Key = C18B48925AAEF9C1B8CE83C3C0541C5E Nonce = F4358C6E2F0F1ACB31433337BF9630C8 In = B647566525347CFCE42CC44F4EEB9CCD8325B0350A4F123065621B7D03C04DFB2A1F5C9F41D3B1ECD3814A2A7BDE4DE46EB0AEA673EA2FD582D00038F256D888A94AA60488A7ACE9F4C29667 Out = 70913C486EDDEB34D7E1D7A8B9CC75234E0B3D9000717949A59132AF2D2B056DD0243E11748F6D2820D29C0BD15747A61AB1B2D87FA6E4438EA053DAA4D39A2FBDD62DE2AD36725E9688E1A31DA8DEE4 Key = 8D12D956B50250AECAA4380C2FB5FB99 Nonce = C8F19FE75D91DDC9FEB38B71A47250FA In = C8D276B9194CEB3C01B3DD0E0B0F84FCE5D548F7FF60C634C0ECECF4C74B8154514CF766960E34DDE8F9F7C60215C932589647B1548B0B408210727D4D4ECB6AC654A6A4E786F5C124034586BD Out = 68EDED1A1230A88040241932A87C894C0F3EAC2363ED85EE077BCC869AC9D98261DDF9186DE665CD5D70AB210CB4D266A2A9D990B37AD6489B55275019BC8D9B06F19765E390156EFDA6DAFC6205321F Key = 3CF3AEAA654897E706E2AC1239667209 Nonce = 4110B8B8CE35B9BC3523B05DAE24C69B In = 95095496B695C5CFDF83F196F400CA78266F2CBDB9F58DDA77CCAC98FEE5BD138ADEF80CC73400B0BBAA66A3D57B0158AE49E393F3D78EF8196827775DE2F0050C531C5EDF2528331BAB2C703AC8 Out = C3B78AF1743A14F1268D87EDFA707968191FFBC9820C410DFE398146814849658D5ED951E7EACEEDD27F2BCB821DA56B31FB9E2181E836A54C8E54763BF9EDE0449ACE3E0F5757AE3BB07002DE63C25E Key = 40A2DBE5EA11E2AB589DD95F71D4BF34 Nonce = 6397EFD9F05A5A87C43730CD42C29033 In = A1B2C52B1B10F73DCAA6ED822B92B61C27245D344DBA2177F509D28ACC108642F2013A0777C4B69B76C707CDAB448B451295F636163B4528EECD717DE79F3A128F32EC8D614412FD3F5FD2BD0FE633 Out = 797323F717303F224CC9FC15C29BB15C9296D7C4885882BE3D55991607DF005867179BEFBB30C9034F0C6F94438A537D33CF4F644372E09F07BD023902AD54D2CA2F14EB04D43FE04B4105514889EB02 Key = 23822FCDF96E4DC4088077C0CFD93336 Nonce = 6E4E85D4B38E442544B6B04FFC81352E In = 1D156125591DD8E4C30B09961E5560DA5D201B6EBFF5CAC64A1DB78F33D3C2C5CFFCD3F1E55B246DE700CBE18E045783B94195CE141E483AD9D70EDF28C6105533BADD7DA4FFB971D1778756D11C8D3F Out = 905975D4AB9A1B4AA6C9A39A999FCF7581BAC9C9C96F0B6DA63020DB3877136C1E9F8E89106942D9405C73486737AD57B4098A2AF29EC587D6B7DC07F469DF28C075435735DAE3F6C2F7CECB9623174CC62EAE8DBAA72679E117FB5EC92F2267 Key = B107244D1A4445A3C7ECE0B64FA7100C Nonce = 58CBBB9601C142CDA4CFB02A45861808 In = F252679F2DDA76DD110584CD0D9E5FA64296BB880606A150122A7EDDB6A682EFBE655BB59DF6885240AB11E4B74FD0A159C8DA83A8E3731DB39C8937E2927BABFD018F17B155BB818B3C0B358B6680992C Out = B48FC12FEBE86486299CB3FE14C1134D2F61BA984334F8C3AEE08C8A0E2DEF12C476096E9958576B81C6E05968382FC7EA17B85B8FF8805EC695BCBAE5608054D5C830DF39CB646DD4798D3AC0C15B572953E5645EB37F431DAACC60B874A180 Key = AADE936E95C2EADDC9FBB708A6753851 Nonce = 04F4C5D43118F5568DA176A140913851 In = 90F67AB45A02E5894862F15F0A919DD6D7833A2C1C46DFC9127D29A53B5A44C93B21141173F53CD4A854B7AF496CBAAFF654FE2B28A7B48048CC9D01113E00176DF95D7DD3CAECC5DA53367DAEFA377F84B2 Out = 2BE5CC556D2E2E67C37FCBEFA7B0FED5C350C0B2541F85671556207BB847C3C7E8B1910A7854B8590F0BDAC7CD1E52ACD6F1584D25B86407EA92222E951339D11F8D847108B0545580B5BFA551B9C1D7DEAAE8C100469F9A6E9A578FA2871104 Key = 2B3AE9E5A047CD4A5C40FBB546AD4CA3 Nonce = CE4C47854269A5C40CA58E56254B2264 In = 70A355394A84A1C6E0281A6E4D744248553F9F6C6A6E6E01DE13AEC21E7D36C2B6BD7C608917A4D9F723229C020A677DDEDC2F3EBE9AE2D4AE490DB9E456212C9AEDC04C2D34B2384BC75C8A9196FCC1CC642B Out = 9EBDBD9117F03F340AC4EE7BE24E45CF6A18C76CF4C79A8B19EB83D03B8F6202E9F9E0D3BFBC351C407E699F4B592C93D0E6E037419C48167ECBA7531EB0162F6D236682831409D1831CC309F227DEBE4FE0B395FA201E1E2633354381D30CE8 Key = 0AD480367F7085E45E72A001A4B8A43B Nonce = 6A6841A5E07DC00A0015006F5F60D895 In = DC75958667FE6AC96BC6B291DE43E04BCBA6500FBE005D5ECA3AE57AAC2E77548AC38A6DB461986F4523AC48FBCADF5B78259938DD037ABB4947D1F85538AE2B89F0323FC1F7539465563A816B3FF633C1BBC6A2 Out = 1DD9013DABCD617011B0E2C45549A3EFD665BD0E6ACF515A3AA4B3FEEF92DA1F3391685E8824BB8767AB1FA38F8C21E02518319A42C15307FD645541B543E98F74BD9383A5047C89D40B7B685999C086391E1FD2CEAD877361DA89BC89EDEECA Key = 10E06819D7EE77E7D55765948D2C21E3 Nonce = CFF4424C5812922ADBDFCE029CE63235 In = C160B510C45E17D2A5B38716E4A682884AFCD7BF1DA22E2C482FD291A713E62318F20AE2A6369CD5F958EF3A03EF2A23ACF0DCB68D27112B2FEE8E5E623E4F91849A061EF3D1707F698D682C62073D7D45A8406D16 Out = 7129EE5D900251E38EADB39DA6F0301E85266848C1D014D2764757AD5EEC1960FD8A46BA55A79EE64080D7808F2B967F9F6F8BA51F296D3EBAC8B653E920F8B0D2632EEF1C96A5E36B51C1D0F60D1DB0FF5D55C567F4393EE790C0BE87610845 Key = 9A937835746821DDA24AF556C13D7DBC Nonce = 2866E153FE0BE9DAA8506D59707FA3CC In = 871D3A83E921FDF2902B25660181FF81260E671390472416F9E6270BAC539203A93D4AC5F00DB1B63FB4E8B840CE4D118EE967AD74E6308CAE8850BE61B0CDE887FEFC61B341CECAE98A7815F5E699766F06B3AEBACC Out = 09AE43E962C2F9DDCFCD5AB82471CFCDAB1154C64DACD154C088D4BDA09377084167CB7D41A7F87D5DD0E702CBB78F0CE1BFD05C53485A91E7CF333E276A0FE84915FDDC7708F696F49C95894A4D6CB848DF06D52B0C5F720CE23A493E7F4DC1 Key = FAA109A3632C82622ABBAE17AABC60F0 Nonce = E057120AA0B73247D6608D148BA05399 In = 2D1799655E6DD69CF3C2E40F700F8C2F1EEA99B3C6926647BE7A07882232E1A7901F3B06829ADB9BE11391C190BCFBFE908C08CA5BA7EC5A5DED518B0F469A378D9ACB7F1E0B8D7F5E829799D1877604FA0F801D4A48EB Out = A1687F960FC0DD54B32B86B4A6FA988740456FC8E2CEB701E841CE897265A7BBFDAE0940D288355E894467CD703442D86C40D3DA31601FDAF990BD1576951426F8FE6AD5ACDFF881D103C5FD6F40440D95DAEAB2A3593DDDC152FE9B09F1991C Key = A5DCC797CB0383C344617502A5908A43 Nonce = 60284E3971826821263594FC36FB6E50 In = 311FE0F676F81A110EB931AC3CD2590AB2F3730A4077961D830E8B57C224EC4A738D27CA58C205FA0872F2BF6EA1732761AD4DE851AB06220AFD82C1DB0C0B2F1064C6F23AE0C092F0F5598B73F4CBC80F4FF249FB90D1D7 Out = 2816A89C908CBC999D1D8E8497B15F5697D66265D05B7900ADFFB41139A57FC96D9249EC2DDD805B83DE85CBB97A4C44A5DC85BEB18D7064855CA38870CD1E4C62EB78FDC7B95B32B93D146429830E76D48D56D1E9F6297ACB5EB959B30834E3 Key = FC62D9B01185D06CEC0261D6FD496086 Nonce = 4D689251DE48BBC21776AC578B59F6D8 In = 9154A2ECA919ECEC8C9B3B9BC0C68949A7291B9A645B5F2D2935C77AB506FF7F27B5FE0962A9A912B1A05DBF5141D03E4401E3649025947EFEF8C0AE5A1FDFBCFAE5487347174FB40A92550F54B7C8261413A50B8D4E6884BE Out = CC1EDD80A0FD2D06320F90174E4DA2DEE7CCC33AC342C03FF0FD9ABCDAA269D3EF75D24477B888F32221EA51A41866656A8CC3B95C601A95CFF53783179DB18AF5BA92C5631342182F283E083AE3E7461A809D1BA74F591235BD66F338ABCCA0 Key = 1BC51FA499556AF60332AD5D287C01DA Nonce = 8A23C560B6F0DEF3540A72423DF2C33D In = A15E33298652A3E42473AB035BB94443A4CFCF9BF8F4E072898B9375E0CDA222B07F8B902BA73F73806F08F85C13114A68EA480642CB3D459F0E1B04E4F881332CB5E05E9E358C91000C09A9F129A197339BC2A8B456455F0EAE Out = BB98AAA7FC7FAB8FB8252E69E54C2DF97F7D0D2C0BC3A679F5BFE2E51191F8DA0218681A3FA59B9D6584C4F2B1FD3A990764799084CAF60A45735B3B8A480CE28BA1EAC185601D4D6D76F25D39891DCA762E21D7D7911E4F4ADDFE7DB52DDE7D Key = F7B9E5CB7DF60D8F760D691B8E79C834 Nonce = B976C6CD3730B031060BEBD10E832747 In = D253DF61440DCE5FDE0C166E99670CE05E415CF2AF02D55A03F9419DC53B94C183660DF91681809E64B5ECB77C9180487B95B4AC06F484EDA769194AA3E72FFD6F95E475A925A2420040B004610B212102423D879F821E196A5A88 Out = 775D59961E58EA72CE8F2173AE47E6BAAFEB68FD85BDE05346AB017D38954763B90B63989A1487326510BDBC75637B06045369DE798BB97FD4885B44E1B426538F5C904E44D85AFF8828DC56329B55BEC8F64BF7957E837B70AC729D03A249AB Key = 6A42A8F7A638089C2E55A166F87444C0 Nonce = 3EB4E4AC62EC1B18C96DDF1465C74286 In = B97529984693CE0621DCCF68F1690B49396E381E885AEECEAB3E1A7F61A8B7B2C5E58BEF82FDDECD29C9D9CB5F417005BAD6B7EB0C57907F2E3AB3E557F11BDF383EE5AB2902D46DB97827B26ED8C4C47368F677291E50ED9C1BEB3D Out = D02E1E17E9274C18017105C929CB1FC9C84071AD0773E4880C84AFE08D243EC72B3570768506285CE5708E0D280673FF9F0004636B77266A9CCCC21FC590D845D685B0F5292B9043FEC8F413E58D20844FBD626AC27F4A43A1CB0677098392DE Key = 483A477C5D7EFE8D7EE764194FE8E902 Nonce = F496A4D3745931C47A814F0D9F0144D8 In = 5DA55FA078498CCC7D509213E96F8915D466AC5504BB9F0FB922ADD1DB7A040C438470962BE659508C37F8C276E3C312D0ACCD1AD77755CA575336F2CDDA3B8E39BF99CEE435FB23312576E3FAC190472223FEC1D693E2A717D12E7496 Out = 4652C8A3FE43D4E4C8CA7C952AB5505F42959BFE42945B466F6BE08B512F21B7C0AF4A818A699D8A61C2162D8FA4DEB2B94D28EEBE99A0CA5819F386F1BEE4DFBF11F984D6594C6D2E4A5E75C0CA6EE74993AFE6817445290E0CA0A109AAD624 Key = 2A2B340ED14BC9746488F04E2EBA7683 Nonce = 578AF21489F2C8A42CF412A32906B1E6 In = 92C61E6AB26DC701A371CB5B5BAFE00B2C44BD2736E856B1E893B7AAAA62C08835784F02E3C1767D8FDB5DE91118CCA28585C5F03CB46591F8D3A3F09A0C602B01EDE470CD42EBCDF4C72456639DF2BBF7897246D7F82FF7D083805EDEB5 Out = 180659EDD79D6DDDDA8A64607957A449FB11EDBD4387863136650CBABD58411D7CEBF5C7CCC8F9A8044626C644E1A1E303AC8B6E638B0817419BEF4FDF5DFD6D6999CE8BD64FC09735DCD0CDD654824B6CD61A52B698310D116C1040526E7260 Key = 3E433ACA43F4CFE3ADB678991613F6C6 Nonce = 1073F4ADF297DF3FE37A0AE2B25C4A1E In = 9C28215AD7EB481E46752C39061377A489523A8DC9B62FC8E7CEB12B4E26CFD76F863B317999DD6F5A76686F9A4DD8E7558F64F9A0BAC89949A12D3F1599D7C64B6EA82A36F334B6055D0402048CA15127420FAC555E5E647814C4F4C6ECFA Out = F3031EA9E88EB705899C304DB9B46F0817F3BD87FBB8178E3CD99AEE040D818B2BDB27AD8034B3D31BF96783AB56EE91BC0F8DAC44C43F2BB0790429B8936991E6652D69BB1F0C2B0577D7155BE3E5B34E1DE64655769740B2C35EF8DEFEF596 Key = 94EAEB3A2E109BA196DAD6179CC6E4E0 Nonce = D0D97DF76AF11FA9120CDB1F4A0C5519 In = 45663D4795BF75D79EB3BA5BF5A9675C257E526B190B598562BC4DB4D441025EB9E61E95243165B21FD6965E2973DD04A141097EE5A85E535A80862B5D14ADA5214A98DD161620D1B98B0AA3FD66A1D31005AC822F290D71D88B3B02F1B9EFE5 Out = 85B49563722FFBB04C224DFAE52B97D7B69DE241C854B2CA795527957BDEC3EBE3A47BD259484F0BC10EF487B00B30638418F1F069888FD347F4714589D12B647DCCA4F275B5DAF428C4EC28122FE7ED0E980B68FBD5B89925DC0E3BE1CADBA2C9797F7FD5B07BB55CA139700AC5CC82 Key = 931096F41AD63122418B0694F08A5D1F Nonce = BFBCDEC1E1336D3B0AF876771A8394E2 In = 25994469BA58D88BD0A68A82D216FF3C15C8A1175CC712138529433FBE2E4058A94968C115C29AA80094E99F34CA98E0DBB6FC2DF165472262B2E4215FA636133B9674B2098CBE807C6565FB2FB4600CDF9D81861EDD9C7B01ECFACF711CB7BD31 Out = 39C4F62666E8B240DB0968C11645DAB7F39EA201CAC1DE82CF08754192FB70F56DFF8E106E22711F7C11B1E08C973076075812B0BEA56BDD983C0891C107529508510E47BAB4080319ACA3AB3F5C647BC1962D3B91C4EDE3DE437D2C496D765316A153AE368FFD97F9D897A7A4B41B4D Key = 54DE58CD3277EA8CDAB1E14AF30B96E9 Nonce = DA5A911787618709C0DDF10D4D370C9B In = 1F6C82684870A592B8FC13963078BA8A18BE42F6569396D9749C4E729742F3F594613FE0D47C681A9ADF5CB1AFB4CBF48B6783E679B5782486EFF088349083455DD97106FAD8D34C0219C32A2948810973C04406A5055629B3FEB44F086ED1B0782B Out = A7860FCD31608F84276797E5E62105D91D485D83EB591675B2D180EFFE41B795A0BB525D8C963257156C16BE7D2F23F2303878193ECAD2B790681AE7D9D4002E3644EC064D633DE7AEB9FE7F2F7A323F369AA48F28FAC66238BBA99E0263F51A3181B804043C835F61F3664B1B1085EE Key = DF2C9BDE5AE112FC52CB4CD935650ABF Nonce = 324E72A3E627412FB271C62D87106AD7 In = CFA3BA888B4985577682E7BC34390EF53ED46677D6ABD2FF005D9B47CE9FE9DF64DD6C89F61912FEC07B212CE6D4A8DC88AFF9F7E96F2CF1803FD3FEB9E538CD0EE34288A3C84FFAEEEF7789AB99CA574D6F71A4A82E28396532830A1737E5ACF1B768 Out = B4A9126CE1706351DF0AABE9EDD2F1E1BA10928DD2A15448A07DDEC6EA78C854B98E82B6AFDA1BFBA57EDFA627A351C2F3819906FC9950844230AD32FB1EE0F34ABE20D488B36C693E35A1A177EF69307C675F4AD3A182AB20C395582DACD33F30B5C7470D9BC2CCB5AC4CB39D5E665D Key = F76BED433BAE0EED648D1B28878D4134 Nonce = 2F8F480D2EBE3F01D63C7D1E1AC6AB64 In = 11053DEEFEBC7662CCE5373FF8624FFF4832229980A212A8CA936FB6459A53FB4731936071BDC21D916C85C6E5F0560E6294E67979A8FD00AF9191DF4807B3D454D4F57FFBEEF3CC2728F9306DFD77AAB3259D4A72771939EAB7B78581CCD2726DA93339 Out = 22EBAB368D5548D61691A4F77B6468A4D9AA2C2600009C808EC8656F58E49D8D674702E090E5910A4C67FD91335D149126478FF6FE2F342F42B8F50618EE6DD75A07E4A90D3CBFB0C2AD6CC1B9226E2522871C017C77A0345ABA7E44688AB5DFE4691ADF90FD48843AEE7D3C289FB6D5 Key = 9C0A96F10D955F3115174158E77BF4D8 Nonce = A0F912F87D0D937E388F9EFB14900921 In = 574A77F969620F53546B46BD2CC524DE9DED870EC2F6B9F61063FE9E9A2C4C55483B6B4172C034F04EDED86ACA242425241C984ACEAF7EF04001FAA887E66BF1C33594022A968BBBFDA3A7D9D9C735F461DE459DECBF12093009E84618504E97037EE7A648 Out = AAA424FAFC30A2BEDF0644E693FF02B2BF1CA14285092E980E522611BFB3A3727F68BAB53F5B9098C1112716D4B848882D4ABD847DE3A6F5AFA0BD8D7834E853D90CC96F1C35F7F3E1DCAF6B227031C70A29EA6B902A5A1266E16364999D5BC7E9374A7467F4673A995D9D23144FBC6C Key = 0E10DBDCF81E7F360D3CDB71AA1A6200 Nonce = A44C029268CEFA5C2665E9C883C9179A In = 1C5AF4082A03011D343A22628667787D1ED78ADCDCF4609C133DFDED8BF179C296A7B7E023503F42ED1ADC8676909A42DFB8CD7A5B57F77B4F13907B25A1D28B787B33631B46240FC36B5D13B059312991F0A54DBC269787EAC7D4C02E8BA8BF511375F0D18F Out = 2F86A992559C65306CCBC9138DA2C1987C168FF4278BBEBB4B48B416DFF7987F9BE993AB153B8C3B03D7FF1E4ACABC2E645A108382F995C290FCE8D881BAFF653F1DBFCC8B957CD7C424EB5D91D758960233A48153197374F1649830CC9244377BBDA7EE7C363096A1E0B94F83A75F2E Key = E8CC72398A38C02705E33FD308EC023D Nonce = 0982EF5D081AF4A2130AA9DC5895F4B1 In = C40A8815E2982C32C417F4B9369765F53D1546EA3A39CD5E07DB465DF161F878D8A361069AD0BA13F158D6F955A20C0F0225B83CA4C6F1D92519F26A8C711ABB68140270218B13CF2F85F008CFC5C62490FEDBE6DB2E0DC5978A365711E072C913F81B782C1A8B Out = D57A23818F90CF982C32648BB61769DB8654CC81E795668A7AA6CBC1597A8086E92EA40A8CF4950A87D3FED3260E5B30C90333CE3E90AF2452A6BD0D002214497A850DC2E3E1361FB689CD4AC25BF304F40D0ACD6A77DC96B5A52354AAF09EB9E45E34CEE834EE78583ED0763C2D9583 Key = A9AF40EEB9D7057C167C020C922789E8 Nonce = DD54B94CBB23C203486F41CDA7742B75 In = 8C38B56BDF41611178CB12970D12CDD3BA2A09BC9C90684C853455E70D995F94D0C7CD30B572AB9E24356FD3FF66CA1AA913C5E4B596A30C504CF22592AB5BB266956C8706EBCEA543ECB8C07A9557B65F72A66328B92037A9D1EE4DB32EE7FADDB037BD75C5A711 Out = AB5B987C10DC96162447A9DA1B70DA9C7D6944CE39EB0D507715671E7AC4FFC4663ACEB5FCF4AA8ABCA5CC155EC57FF43AE23E8854022F176D620B89B01C283F4866696FDD03B4CC262F3C6BEE590E26A25914F569592B70D017D872CC3D3A2F47B0194D7EB425442F3335FF0EE3AB05 Key = 42E4792765C8D601F647096128C22E6C Nonce = C0115D81CE8541848E778E2B90652AC2 In = 05EA52CC288620CA6E4A8232F1F3CC99097438471E6709C146B9DA1B1AC166EBE968FA273A8EBAA577CF673959B10D9008CA182F5075E86DFBD5BFAEAAE690135CEEB445088EAA7F870B71D9BFEA7DCDD2AF5C37D4DAAB468D67C70C1D556A10A33DEE93C2B1FFB758 Out = 1410F5CDDDDCC1FEC3E6793CCABCBDD2A1A14FC0D40325A9D6E69C4FE4D87191DB1BD4ACF6E4727D7370EA59B77FD5E8F02F38CCB35448201363966106388A3E007C4F76566F589C5326A847424FD0AB647974C3CAA452D95AA4CF8D86BB0939B430E6746D35D45576EA810DDEF7DE73 Key = 7B4844C6EFBB9F47BA2AE3CD350B00A6 Nonce = 2AE654A8577CAFB65B43407C0C6F23F7 In = 7104B9314233A3DDFF2074862A21B3AD6CA9693785516E2C7A4EE69A823D82EF0A4C57C3F5113C62D9B1E755F9EB7943D432C87EA9C6004F14281355DED999821B1ADA56C68736FCCDAB111ED640E9ACFD4D164310925F8E3AAAE63C8AAFA3827B0E45FDCE03EDE162F6 Out = F53F4386FE121FE5B734048DA923054DD12F244CC12763FFB8DB1E9E842DA3121827DC297AB6F11B8278E6E96ACABE3CE23E3C251078734F337E9BC92FBDF38AFD0FB2CC86BFDF16595E01F361A2F042974E6DDBDE8B2AA10CA755BE051A0CD58179AA4571664A3980B0E1DCC8369F15 Key = 0C76977CEDFF0BED19FD14FB31914BAE Nonce = 867FF78C9084E6B866BB74FF1549F0E1 In = 328C825FAD8E873D66178434F534E832EFC8B273BD74E133701184D59EC5E3B61B58653B6646CD1E91AEFF9B4A569976FD055C3039CE76AB5DB5AADB8D4790642D99346D9FBDC193B782F4F5C16F2F1C60084BF57B40736DF186EF9DBEB12B8345FACDA9A957D20666A1C2 Out = 6865D8CE0ADADF051BC5751DDC7DC02BD3E8425900F493A9866F9B0FF11704B26F949F38547859DFC1F7E4EC9066BD6825CE5596C32D97C11CE6ECBE63A58E32C3B423114C1E4330789817AE298381050607A1F8FBD37246763CD98128565AB89FB05942B02BA92337E30E5F9F87A1D8 Key = ACB06A6D35664BA240105546AFB89D88 Nonce = C4C566F5BE990271C34EB38B66F4A6B8 In = 1018329626BEEAEB50A5B078726E9BE6074CAB2FD2007790102626241CB5411452B28C696FB5DA1BEA90BAAD90DF0F15A559FA821423EB500F0D76B785FFB7BC2470509006CF192C3A5AB61CB6D5F7C6506C740C8BA763527FAED51748E334775D759F904B3CEB9520EEC9FA Out = E3C6C758EE636F36B674E5D06B3FED93F848D5C781772E31A88EEE0F84D4DDAABD6BD6D439D36AA5EAEF61302BE6968EE3B786B5CAA20040A15EC740680A4E0D788E445AD1D00CA2FA8A4D32D0C80821AECC9668CCF8D60D74B1BF960AA42861D9339A064A7B50555ECAA71A475A87AE Key = 3A57AA735A2A5BEB67002A4B4E0F0FB7 Nonce = 0FB689E2D76B4CB6886813714F78A471 In = D30D40FF5BBB7E7D4BFD03B39DD4F7CDEEA3EE36CF59735140A2CD884C341885A2ABB16B42883C17D0F8A8EA49932906C51B4E0B195438236C929E46C3DF0400D6BFBF7E7CD09F78ED819E51CAFACF184CED6D9854F0C7FC3D4E2E92BC07B9793F15240C221F9CD951BC1D8F7A Out = D99D6BE44B4B07DEC16063AE56D734955FBFA4BF24156531336CBDFF718D1CE8DD9414A5137F0F193B22351BDC56E4D62E827ADE0A414DBBCC99DB1FFB7001530AD06D22C1685B7C608B97C9F282EA506C87F8F1E861E2F56AEDF96D02BB615E222B9F83219D7C79E30E0A830DFDD089 Key = 25C1B9E50A35623397E026342290F381 Nonce = 99CF0F3E276941A23B8BA3AE4BC36FB5 In = D3C88CA0AD414F6A88903D4B2BB756CA44717CE6C542537066A898A343A3DD6AE2609E717DA65C9E82777A29E5C134942455B04E5926DF69CC1B86EA95805AB5267E9C456B29C89FB7D5EF184016178C8F5170F6456CB2D3A288264C501208C2F71578A794526A40C02267CDB749 Out = 12143011522BADD13CA2D5838548F63585804175B21B47AD9907FB3875049A17A27EE2C7E3C9FB61C4F1BC8795D9FA8B267B698A216BC3E3370A04E27CDAADEAD0C18E6F8564F3E82A779B2EE149F8DAC7CF9C7DB7E83BAAC17D366E3497135C4D59C1C4D0DD8BE6520A1415D7A12729 Key = 3FE0B766CCDA7B8AEC8FC3433DDDF5E4 Nonce = E5E7B817F2B2C47395F3DC983877C6C3 In = 1FA6BF67DE5B0B29BA7B510166D06CD100BA68E03EE4CC8D8340E1BDAAFD00DE840147243E746C85F68409F62E474505BB8FE6251FC550A2D8C9CA071CED983A57EAB7D7A0E636E809163E29677388B2E96F81165B4B7DBAC996D9DA923BF3F89BFD7E659AC6BAEEDC2C1F223C85E7 Out = FE2F1AE7085001374F5FE74E6C243763BA979839C7275B817FE5B1D93A8D31A2C265B646ED0E9BAD5EDE61BC9A6BD7FCBAE22D818DEAFF76C39CE6F8F4302F0D672628B36A1FE1DF90697408AA636F0F2EB12D00A87C1660C03257EC7F98FB0A2750958FC5769FCE8681001134A4EBB2 Key = 7E9BD6AEA141BD2399CF9C34D8FD0EE0 Nonce = 4265EE0DF32B9E35411F3890D981224B In = CB81F985B3551A1F653816EBC8472DEDB58C5BC66049A33543F92A64D9B0680678C5AB54FBF03B7CF1CB964E903E92FA1D7D0C3A5B4E2A8393687F0CD73693CEEFA32DBBB854CDA1BABF629CE10CFEDA1F16C8A60B9419069468A5D8E30704035EC4F7CE7D67A5547129FD136908C33D Out = BFE9B413104A26F4B3B86AC448F793F138BE0DD31CAAFEFA7AE2AE69BD09402F70F921081E66D0F3A092D3BC28CF2C8837991A200930F260443F9755F8AD46DEF08FE5020792BEB7D2241F5D9B290A4F5F849E378B8184AA616B081196A384393FFD2A15622029829F0BEC293AADB6FEB5893AD9DD2A4B46A32A033FC06BFDD3 Key = DD22660F816ED9248F192406874D15C8 Nonce = 5C25277D16E491388E300E43463ED773 In = AEEC500F45E292E59DE2A9C4BF4B0BAB26E920386B8AF44934C5DBCE4BA66ED3B294F0C4F4A88E70CEE9F9690E506A1C6E1F2B6E9085397BD3C8E197E8295728815C47D859E0FAF1C5FA2ED9237FBFCA5843A9F99EB40E53554043AFEBE394FC02F47E6734D3F01FBF0E4CD7D21FA3E631 Out = DD6A11239F7AD4FBAC8948E6E2D2F27D6EC5C818FA6501B910151B8CB3B5142DAFA7141C0310F3668C7C79DC1ED8144F01D6B0BF1E9574896997545BB441A5C25CA4152492A1CE498B42B0D8681E47FDDF2F240C9D0E52B516F459C5AC0299381FC7964D9A4EA8A28588F62D8BCF98C10C23999B81C20E971E4427CF32B72EC9 Key = 85F6C7EFEBDF11A904C8741F0C67411E Nonce = 60F0D61421D0D6F46D6BB01213C2AB33 In = 255BAF2421268D3A748F891E76B7507BED31C86FAD52BF775DA0C6DDB4849F138E4246BF66449217FB62AC389B70D0A772D3B786526D358A83EEFA4E963CF5DC473EBD53DDDE847F32D4B62D9616D1B0B37DFC552EB853A66FE62B58370756E17EF4D4ADBAF23091E5FC9D67CA0DA3FCBFEC Out = E73F4EFA1943CE9EF9704BB173B14371056DB816BF9CD52D5D509D84417393D1C3ABFCCF929F66F01E7CA8FF4E78BF73E3CF63F4557075875BF049A8F92CD8B8B69F40CD384D94A2D6A217292834033CD94BA0A06D0B41B26E4F8B2C5F7B6079630CD17CDDB518811A107D957645C7FF570E7F16EA4204EE79C625A5E9A873B4 Key = B52E2A13114DF2F34844234C4A170705 Nonce = 7818531571C5F69B1B4CF26F75DE0F21 In = F3CC75785335B638C1299C6D28856E4D66C060488BF17DB58E989EE2EFCE3D8671A8949051543F360D9ED2C6990D41DDB9DE2EB9DE00D93B058E560786F6D065C8F31B980275AB44F8553610ED91868B0F2200010B870C5F523F4B7059CBE889F87103241B4BBD2303445144E0F183781801A9 Out = EC768FB206FFCBF14D21E57C2231CFEC6FFCA8F1679C97F1CD7F295E4E1A531EF9846B2AB7B4D897D7814A124B3BB4BB6B3165A6B37C2DCD5A8BAA3F74735213E52299B793D058D3D6AFEFFC08AAB7B746D4446BC264DF72AAFD9DE23091287AA93C5267364A292A56EB20B011B4896021422527FFA26F3B8B833EC117BA4020 Key = 0E9881250175DC9F6564D3553B3DFDB2 Nonce = 116C34C3DDB5321A21F100401EEF6390 In = 0FE31EF68E81FD5CCD82FEC5F2CC6014AD31E41202A0E4C9FF8830C79DD77EE0FA45870BFB3F8F8D0572564793A348BE277CFEB269EC1163F898E60CDAB5E72987F1997B09732CEA505E59E6EF1230F638123CC2305DA0DF6BCA214D7775A8B56A712E73E426FE35C3D0B3F2AA2664EA0D323F35 Out = FF1155A412C0B8009C06A8518EEC87CE4614A7946E6F06760FB86B8BBA29485DB78A2A15D168A0CC53FA494463A803FD8D702835754F0A1310B8AB33978D05E44C7E2155997706F65CEB71388B822230DF2EFE65B02FF949DFDDA0B6C6863334C9F58B0AE50E3867514D53095483A19B0A44DB1ACA793BE988398FD3E523D3E9 Key = C6B2BB588ED1B6A954710036DB0166F0 Nonce = 5D54E4FF322F6E012080E8FAA242FDE6 In = A6EE4E43B382CC75FEC27BB90D2A3F204CC995033AB707FCF8EE2E7E76A3D189BEB002EAF964004264A7D712AC5560AA19652C0BC593DD2231B15194D9221631E09E4CCEBD1EF599AEF836772514B6D256F6BC22F05CBE6A452BE56328524EE8B7A1C1683108BEA36BDF538A8CDB871038420CE29E Out = 52F203A1ACB1465A9D2EB0FCB9CE83957F4207C7649D74FFBF8EAE6C608EA87AEF9CC76B90E28A73004B5D9B074BAE04888FB02194BE477B18DCDCE5E738DB7610029DF664EB8C9C5887914760D69257E35A5B40885E2ACCF160AE0B0E0E59AACBBEFEED01108AFFD9A8F6A22EAC8B504D084BF6949823D5F59DD924AC52318B Key = 86BF4DF958BE53CC007923FE8D6556AC Nonce = 20B3C91A3B5A66A6AB8599D01674AF45 In = D69325940CF2E33246F5C0C931BECB9E0372173963F58FAAC297AF7AEB4784B60B16E98E2E4174FC1CB73EA690A4ADFCD38E4A955C7F1D915480C028D30E58492C0BF7DAB257D5DDF2230B3FE0B62B73B17B82F01D661E1AACFED564B9615995EF7E0C81C373601BED078FB4668E55704119300BB31C Out = 6D0A03A606901BAC108C80DD968AC128964588F8E5B3BEF30FA0AAFE5092C5B1B118B2FAB9AF379D701FBF9354B99048DB408B7CE3A954361A2110CA97386DE9E0A8B52B86704D69BFAC08B77F3B961D39105FB3646E2075040C169A9388E68BC36ACA6DD627036B15B2AC7424D11AFFA0BEB4414F5360B4349B656D8332D638 Key = 915AA4BE886620705DEF24FBBBA40598 Nonce = 46A4D05C91E7931956C459CA51E4869F In = E05554670BE695A32D397A2A6951DA076F4B760D0C6B7413656B8D38143056A6A6074E4280D4EB70889B39ED6A27AE0F67D7FFD31A4933F8CD300BAC7C810162D2F91CAFC8BF4238A44C09D06AD503E638AE1299E1575B2B3B3229A9F6A240C23F1534CEAB344FCA12724D8D185C1A96DCB3E040000B95 Out = 05B2E6706BCA5507BCF4399F466212CE875C9C94436F7AA133630A3CA67A9C843230FC445177867E73A9AC89F7BB32C6653F1A30E4859EE98CF7BE8C5E1479A80285AE091AE932060F8093A63AF1417FADE414F33190359587A30280B330C657E3DC35C8A003ED7ED92E61ACD08049C716AC2F12F362C4FFA1EBE7B7590C6876 Key = 6FA0FBBB491F305F512982ECEBEFCE3A Nonce = 20CFB9FCC146145657841CB97395B14F In = 8E97900728874829423FF9E65CB2F3B4E3E720BBBEC1A3485F34A94B7580001E5CC450E6D76516DD9A8E450320248441074FBBBCF9A0BB3702B100126F5260F381DEFC536D2905E78A3783CA969730AD188D34381D353908BE269B10ACAFE287BFB37E93349A7F6FA96912975B817BDEBA0500B87CF95680 Out = 2B1C832A0210ACCC143745BF8B4A32EE68C86584868B2AD2C64BB802D831303F6028C0646107311F22ED520E063DEE06A2AED4F22D6ED762A299149B3723D30D264847CCB233E8C522B1EEC6458DBD238CF15A33B55627470359A09483C66B662EF012EE8C26A92BD6E12634B413A1A27813C0C6DD39165B5FAE54069ED2486A Key = 5896FCEDBF16D103B6CC4909222B1493 Nonce = F29D9A05434E704CAC05D280A8FFEE5E In = 7D15F0ED3E7D504B3051AE6C00E01DDCD7FA4C6F3A3F3E0E9FC945847BAC92076D92C9BE830AF40D473DA1741DFF53EF78502796B21B66E7E37707A400EA7BD544FC234B655115394DAFE31C5CBE48846AD62E8F15B6D346A50CDAB34FDD28593D5B369BCD7D8F47783BE8CE2F5735C50AA266667E421E1E1F Out = 91F4FA1D9381C08E9C635ED7BB5D12421F44F80E13CF665AA2EBD06052B3DF7F7DD1952D1BFC6B61E37953D7EFB4CD152111F74A80CD937FD88B83139E7860B678512C8A2D891B1AAB080C77B25C226F9C319B6B21D804471887A8EE9DECA336B29988AB80D6FAD00A7E1DA5CBDFB757E146C592323CB381EF40166D644570BD Key = BF380C44E37BCA81F3C6036EA3586935 Nonce = 32F440D2ECDD949684D4CDA9586A28F4 In = 9FACDD624D109102570E789B4BF006C1F0C24E95ACB8082D522615082DD933DD550921F38907BA5AC30846F9CC63AE18BB46852E8E802CB9BED8C09F049D6B35292767D4615648656FA05BC1CDC54A78B00E70A5098A884D0133171D5D8846217775500B2F33EDFAE01109DB72BE4782C3EA1F839A1134C01A55 Out = F2D12969396FC6DFE22BA80E9F6A176C9F3D91536CED8CC2A83E1D2A7DB83C1EAF6B069522CC1CABF7B30E6B1C082991D662F847B87F3DFF40C7A3CEC5D3D96615640A3B48B95E755CA22B3B0B635C2A56A61F2A8435E1106F62C79D37372B82BF71F6043C44813EB2E12729AB30565FC718392D5FEC1AEF0DFAB649EBA8EABA Key = B81F13EAD324F6F9F9E45659D72D0EB3 Nonce = 122A6645EFE2F81E6FFC8E4418ADCA30 In = 6A22387417FC3ECEC9443041CEE5E8440652146BBF214663631A4ABA37A5920E1BC9611FD936729CDC28084B451C3E08F313F31612C2189E27BB73B48F581C7117DB75CC22D821911CD70968B960AB771C83EC6BE2DEF41A22E36734EF56F2500D3EAE610A860661DDE7F9EF7BB75FE765C427B79C545463747BC1 Out = 6A9A030F41BE6BA42A1E7BD051794848D8A6EC6B57F4A0CF44A937A42164A767D8799B9923F501621800E05BD2B3F65A890AD5603641ACB2E980A06CA3FBDE3243CC2BD2AB50119576FABAEAEE19D75AEDD91616279A94F8B8B7F6A89E423055718DD356250A3D466BDBD35322ADE654DE176AB4F2740716D4D6B61CD80C065F Key = 20FE5765A855346A157FFAAEFB7CCE31 Nonce = F9147EBE79608EFFEB722B28AD6138E5 In = 344C97F9A847B33B5A950F5EF4EAB59971EF86D2D11C77B4196DCA55305B5F713303DA12E3D5C736B129706477BB8F71F3C81819766DE583BD915BFC4C9F528F32D2A4DD4DAA5C5286415090DE7CEAE61BA1B18937CD41E69055BD5A99C73DD392606FEDC0D386696F2BE9002980CB5F1EE5135974CF859E802806A7 Out = 16984B5B5369FD385CE7EFE789D8B2E80F3A7F3ACF0AFD8D00E7C31D7DBD24EB0C6DD509A4AE6A1C04A7A322BD897D307C421EC9A1FE1EE935CAFC27C6FAD7ED0617D184B75726FDC26174ABA388836A99CAF23818A4707EB60A233302E09CAD7B2F7FADD02A9466F8C861D481023016ABF6E57BEDD4B288C8A81B7EFB8A4485 Key = 01DC3A0701B7CE3EAFEAFA1A5FFD1B88 Nonce = 213F409C520A489A000F30016C01CC21 In = FB5EECD4A3BF6C6B1B0B4B4FF7F702FCF538AE425B5F7419687ACBF263F9587290F32BC9D146A651F4036346934198DD14C0187BBB50834A627ED9136D8E51E5EE2D4DD3D71A3546A3DD91F205905F4A4ECB83F1882E8D20A84371CF8886651EDA9601D6A3E7A6B60D7B90552C19F786D4AEA805A7C5F9ECFBFA69776D Out = BB60147DB21B8968AA6C60DF45053D8FDBA5FF5C95D468DC01A4030970685AD91FCCFCC5D35E19E50530EE6C3BE336EBD39BAC07E8C3B966692F2BE6149EB26FE160913CF23BB49B30ABBC97468F65CF347EFE06DDDE60E899E28B801AE21F451470041F98F8A778F75E03649EA7CF6013FF285F8EB1CFBD8760B3DF147AA796 Key = 9B9B9E1B898CBC46D32CB73E38F4C3BB Nonce = 41C1C33D445AAE243A762D2A5EC6B719 In = 7B1A9F40AC8BBB0E7E000CDFA8A715D9AAEA5C8488DEF0C31C4F5C4A2F2257D480F9C669B3023699C14F59D8240D86382E8DAB49F1F4FA10C69CE63137A21D17DA7001BBA5434C577B7F17A22D5ABA62CF0169FC686AFA28EC780A955DC0033281F569AADD0A7130FE25E8D517C78D90EF6FCE96863A0356FE9664DAE677 Out = 1C3C3D5AB36DA982C99679AA52D3B6D91E64688958E72BCD7DA933DD509B5E246277CB1603125002964FF838EAE8769CBC63792BB5F087D31F12841D9776B5233FDC4247679A99C050DCF0C14E8963D39551885F905FBA72C4689A92CCFE483782723783D560E6E8ADADB6F6BEA0762BA6F21F539E14BAB48AA69675CAA69069 Key = 763992E428859B04AFBFCC8EA1670853 Nonce = 38E2D175E535CC3CDAF3AE49A5D80385 In = AE5940BD642AE3A0487BDDDBCA420107E8A42982812995C5B6F97CFB7B1D18984D07151984685989294BE42DEF6CC4D0BFB41F2F100115ABD1F36407522C728E84C3EB0E5C156B89C41BEF436FC0EFB1BCFEFB876936654F0738893D601F57B4E791D0854AE1C6482D68355FCA5BE8BAEC3CBDAC383D187BDF85845843D400 Out = 86F1B8E57A56C1936D226EB3133F8FC7368E172ECE39C70C39736CD17711C20DAD4BFC8C445D1E94C6E313FEF1BFEBD4865805560E295F20E6860F26A8B35ABDB3B64C230585E1E12D1C83BF8ACE9BC76141B2E9C7A7D7E3BE69C504AC3A4DC2370918C0930B660106B90EC6799463EFCFC7FD057113A82134343AD3E51CB32E Key = 79D8EE7B194C1DAC8D6AD992922B5E13 Nonce = A709D2673AF50F72F03013ADC79F8D61 In = 18A0F0ADD69013BE387385E4B600D765FC39204E4284DAFB6A80062855C3C044FBBBD10C41D13FF4247ADA22B6533647D2B5BD3C1BE520282BD087C04850017DEBB7A2DD47527B2B9E3F148795994BE379790556C530AE12BDA2563FA02211681CCF34514DEAA6ED6AEF8568CF577A58606AE7E6384D572FDB7E17143E000B2C Out = 3924800EC62AFC28F39542F994316B1FD00CE52EC073030EA54493CBF259C2EF96AC4FF8815A35408ED9A619A82094E3CD94426FE09469F6D940BA73E7F9472C6AD14E8302CD46481E1971270B3EEEF22E0FEC16B530F9DB34385695EE904FA034DE7C6C1FA6D971DE0EDE7129DC0F6FC7404D7686ADB22383B0506CBDAA7888DA1DEAEA3CE196301B311A59C8C28499 [DES/CBC/OneAndZeros] Key = 0741219814F4369E Nonce = DEFD8C15FEB10458 In = Out = 79FCDEE6F5A94E74 Key = 3FAD1BFA365F515F Nonce = 587FBFB91B510842 In = 61 Out = AFE5BE1DF47E6958 Key = C6DDD3B4CFB3BE35 Nonce = 3397BADCFFA5CD9E In = 6162 Out = FB193EF114B131AD Key = 39CD739C5FD324F9 Nonce = 7BA9456759F9D9F4 In = 616263 Out = DED4DF8449FA9AF1 Key = 0CE7C79E562BB380 Nonce = FBFE8D32A056DF18 In = 61626364 Out = 90D644584B46BD60 Key = 1FC96BC8537C2BF5 Nonce = 7D14C2BBF4FEBFFA In = 6162636465 Out = 2A70B1E3D641EDA8 Key = 3EA0FEB6F73FA584 Nonce = F7EB4F725333CFE0 In = 616263646566 Out = D46AEE73FFF0871A Key = 938DE716B9569292 Nonce = 78C186E4F57CFCBD In = 61626364656667 Out = 98FF67221E6870D6 Key = 819B1D2932657450 Nonce = BDB02A5EE4B87D94 In = Out = 4543FC96F4B8B122 Key = 0D41339A489D8364 Nonce = BFB7F817CDEE3C12 In = 47 Out = CC6E8C070695E305 Key = 855595B620EA4AB0 Nonce = 39E6CDE9483737E0 In = 4749 Out = 6FB34EA238CD511A Key = 8DF23DFB014D257B Nonce = 4C3D7238A857AD45 In = 94A320 Out = C2D8EFE2B7E89888 Key = E6700FB699FDA882 Nonce = 3BBB4962D510E0B4 In = 621F374B Out = 709D24FE90B62702 Key = 33154E7A3744B1F8 Nonce = 9A7CFF1E07BE5EE0 In = A8A6EBFA30 Out = 9BA4AAEBF47F2934 Key = D5B9736A8BF39C52 Nonce = 9F9C1DDF2E81D3B9 In = 3F15A3A21DE5 Out = 32857A77CD5F0837 Key = AB8AD1DC2B5E59B5 Nonce = AAC43EEA7CB833C6 In = 13B01FB8554A61 Out = 42F700714759E23A Key = AB36FE234780AECB Nonce = E573C3E555078997 In = 875F37E530711B59 Out = 8A46DA643B1D2782D0DFB5210AD2745E Key = 9BA56B459BB4EC9A Nonce = 0F779E7C90490B73 In = 3C6D4C4C7D419EBC5C Out = A51F4FCD2EC5EA235610B21F77035E0C Key = 5E5CEF1045C62E7B Nonce = 1B4CCFB80E497471 In = D6EAC1E0BB495865632A Out = E7295D7EBF14D4401639A62B1A59B963 Key = 4AA17F4FE7CA759D Nonce = 7BE44B5716CC3883 In = AC0B3DBE737AB8DB9ECC26 Out = 26C9D2560D7E1B8247EF2B13217E1A8F Key = C6913279B07861CB Nonce = ED65E32206546915 In = 97032F592A72724D4B6BDA35 Out = 66F27FB8B1A5E3AC7EAFCE2266D6C694 Key = 267267DD1B7F94F5 Nonce = F6B7788B39D47060 In = F8B7D69BAB9A491010D7B41C7C Out = 9F86FD8E20FA43F370B4BFE50735B62F Key = 6F5F0F3DB8D7218B Nonce = 2BFF759EBBB0F0BD In = D87C1E74D45EC6906392F3DA14E6 Out = 75F8450FE5EB0294533ABE2464248209 Key = 6C6FAEC81E8976BB Nonce = 9519212C97D4283D In = BB6A3D9A99965DF79B4CE7697A281E Out = 16B73C7FBA6F359B582921165E988021 Key = EDC12C2E333DA4D6 Nonce = 4D2B65F5A40434D6 In = 324A67F9D21E72BFA9B47B6D44F0A5A2 Out = 08E30F789193EBCBE48D85AA29C9CBBA77DE5065FFD7E1CA Key = AFC1F8670347B23E Nonce = CF7643DE09109D0F In = BF0640B94C6208A3DA03C7EFF219086590 Out = 2DB26514369B9A739631BE6B63E928D437EB39C3641E7C8D Key = FB90A71C36341FC0 Nonce = E2854536F1ACCC7A In = 6796890753E748AF37ECE642392E6F4DF6D7 Out = 1157FCDC653E1644319CF7933D05D60E81FB2F85A6503BC5 Key = 352C22EE6D1ACB80 Nonce = 2FA6DDA5E4F094FF In = 3E13EE1BCDB631B81D58505B471278FF1127D3 Out = E8A9BCFF29B6C0C5CB60A73C91E480AB98EECD3BB8E9A503 Key = D2C4D489B222155D Nonce = FAB0A2C5D80FABE9 In = CB286DE6105AD73D734A7E03F256556C9BEAA513 Out = 423EAFEEC86ACD6807D575386F65B9B6488B51306D762E7A Key = 041B7EE6A1C92B4C Nonce = FF04A9048299F7B5 In = 5D047DF0F33352B1CBE1C0C6F48EE8DE30A4AC4E5A Out = 4A73158C12322376A5CB9F6A88BA8A4BB36C5D516D3112A9 Key = D7D6ABBC6B3F0D51 Nonce = 6CDD58FDA4C96D27 In = CF0791C7717083D47546AF26317647F3E9FCA95E7228 Out = 53CCEF2E488E717B0BCFF30C99E257C36B57DE139778CD3E Key = EABE42DC124A4526 Nonce = 3F57581479CDB2D1 In = F51232D422749E5835E694EFE010190AAB2B8DDAF5E7A0 Out = 5D35E1E183A8D3C3305DCB01C1751CCCF6FF6D7BE9A53C8F Key = 4E6B9FC17A58A95A Nonce = 70EDE349767C59A1 In = E0184489D98899102B9053D27B87C6F6C5D836BBFF93029F Out = C10EB94F783DED8DF7AD46C605042CB610948CBED32E5E28924A998A1490AEE2 Key = E3BB33E82BDB2B84 Nonce = 593A08135216F478 In = 435255534820414C4C2048554D414E5A Out = 69E0288D17900DA45557053EE79CA771E90CCB8D28198E0D Key = 458FD140271920A6 Nonce = 605C41F0790BE4EA In = 7777772E6D656761746F6B796F2E636F6D Out = 14D752E45A8D28EAB2A5C8E0A12E8A88E804451282F62CA5 [DES/CBC/CTS] Key = 9076D5A743FC9721 Nonce = A9A6C2AD38E682C1 In = 9F8789F30E3ED72800 Out = 48C597491E0C3C1706 Key = 0CDE4B75FE1C60B2 Nonce = 23034593F143AC0C In = CD8254CBE545A5E9C714 Out = 2D6FEEC8BA6070172D37 Key = 911DBDA323F5B30E Nonce = 51D47FBBEC9C4204 In = AFF70EB1F349CCC1584D88 Out = F22A14BB906DEA068689E3 Key = 27399EAD16C76FEE Nonce = DEFE481F6C7333C4 In = A0CDAF182FFB93314FE439F7 Out = 762C34D15E861502E7D5C77B Key = B221AC0CEB5AA606 Nonce = 1C01DA1D9AECA0AD In = 3AA32EFC2AD3E7A81879C38905 Out = 95D71FD889E597A3F52EC664AE Key = 710931E0736D16F3 Nonce = 378013D6D8779222 In = 58FB7BF8F6A8C26398053B5AD1EF Out = 4B3BDD1C187FDE4EAF0EE05B2A60 Key = BAFDA9C3208592C5 Nonce = 1FBA498F337A06CF In = 1E73E7D1B82FC519E7D6778CBD9E6B Out = A532BC6B9C5686C563B59E6EF47F8B Key = 7C92F7577E9E5821 Nonce = 85AD46CB62C42A4B In = 63B0ECA8495901988D536A8764EF4DE0 Out = C9E597C818E5D2E8D525744D1E58BAE0 Key = EAD7E457662B61A6 Nonce = 9BE7F359CFD116D0 In = 3B0692000B6FFF4622977B62358615D8B5 Out = 8110C505835BFE6AEEA9D8877469F677C5 Key = 31924C5C146EC54F Nonce = DBAF3718A8B17FB2 In = 04AC84288F0BE9BBF06A04E2DD6DE213734C Out = 17679CD3AD54BAF73FCD7F72C518F0B4313B Key = 09CA9A9F64DD9CDB Nonce = 6B31656961B96C3C In = 5D8B2B8476827B801B08098CE6F5E690FCE32C Out = 9461193572872EDF01E2266E56CB72A78A19C7 Key = 3B1E7CEB3483A31E Nonce = B3247C1AAE6F97DA In = F21DBD30623DDD0C3137578B1ACA3D048C075FB8 Out = 24657394EC233B6C7076CF6A33FA53B86C98CE74 Key = 0C133B1D431666B2 Nonce = 9D01A2A546DCDD89 In = A60CB3ABB1A52085A334641E9C26FEF09156E7CFC5 Out = FA9F81191286962E5B710C20C99983916AF173C8E2 Key = 9C6C9BC335380837 Nonce = EEC9907B66BF8F8F In = 800301AAD00F8F895B84218BBA09246DB23230AF3CC3 Out = 11ECD036643726BE0924C4C401058D15B63E539F773D Key = AFBD3EC2FFFB2855 Nonce = 021A20C31816F20D In = 5467CC7DFFCC6E60807E09AC80CC0F323AFBCF3F49B65C Out = 24788ECBB92BC763FE238037EFFEB0AACAFBF106DB081A Key = 22612A76D074686F Nonce = 6435B2BB76583F97 In = B1F5B889B9D1E78BA612BD7941D5812444D3510AA83D0B72 Out = 3266DA8CAB200E3C171CADE8AC651D44CDE2902EEBCF0F5B Key = 8DB74F62C79A83B7 Nonce = C4422D5E3E95C4BA In = 9C8D3469E24F2855E477222E3342136CF67673484603EDC5FD Out = 8B4405DC91225416A4A3F6838C72CD0F9743E5F1158AFF7DCD Key = DF38AD749B054C2A Nonce = 62DF2A547372237B In = 41B52662B96E82080D704718332453E8A3FFE3160C48A954244A Out = 1AC7CF83548D910658FF048174904A465D5F401FC585F69E96A0 Key = D7332D48E4A08E73 Nonce = BF57A1ADA757E6D1 In = BBEF9A510A56A5595612AAE5102CA399C2954E5C0A6507B7E30137 Out = 525AB2A4FDC61E88D17263F7726807D66719D0E33C8D97968FB00C Key = BB99706196E706BE Nonce = 2CB49529735604FB In = 52407DC79E76D93EAA0AF19D9910EA4B101475972530E5DE6AADE1B8 Out = 22FD7F774A84EC5B194B9B3159342F6DFC0EE7F3A82BD2DBC4551BD6 Key = 4F9BF676A7F95396 Nonce = 64DE012EA4EF1853 In = E69039A548D7C922BE551BE70A404D8BC347B5840EE4472E319C7F9430 Out = 1D69B5C8EB2BA0CC8E418A24E7F397C54CE69419048E0EE7ADD6142B2F Key = 817F84ADC89EC13F Nonce = E166F32F3549057F In = 20081F83FD34060842DF4073EA8F5B3CAF0B289EB25FBD807050EAE314CE Out = FFDD0C2735740CB998DF8ACFDFB2C80AF3FEDB07E01A8795FAFF51098730 Key = F67E4196CC6DF276 Nonce = EAA8CAD5C86EC7C6 In = 6045C8B00A0D1349C6576AFCBD95435F90068C3949CF32FBD2190C3F906919 Out = C99CEF2CC47F6A3CF8588501D20B91F99CAC725EB2D35DC8EC9B1BFF3FC193 Key = 42CE0D2CE01F9ECA Nonce = 71CF9AEB127BF362 In = A1FA682C81629A841AC8D1B371053997F4BABEF1D83D236AE4C77086DA24DBF9 Out = 2074FB01FD3D750EFE0548BD2C51B127188257F76431B71AE3A3A6AFE7103822 Key = 4466C9BF5B474B21 Nonce = 0DF3DB1AD76656D6 In = 541DA0919992A383F739B2B601B92DABD3F4AE1583D607EF692C010E7E00C21967 Out = 92B790B103A7664D2508D08E21994EF3705E6F8109D83E087878085A2B5DF354A7 Key = EEB3132A403F49D5 Nonce = 18BB520F687B1841 In = C909604CE459AEE764AADA4203EC6AD3B34D2720890CEB8DBE38CDD955D1BED744F4 Out = 602D9A17F224434CA5257433E395A8EBF714DA7A41654063F7791051786C21C6B2C5 Key = 6208B08A597F770A Nonce = 4A71971DFED24F2B In = 2D15B7F8554FCFA780172E27C7658A2035CDDC09DB71D10B9480C5345B250DAD722C65 Out = 2ABA254E087A44939B17C0B013FD0D2515A81F552CB833F83E497B0894DDC9B66DDAE7 Key = A25EEE00A0B616AF Nonce = DF78562B7DAF5D2B In = 559C03E98875616C541C1FC689D006ADE4FA75C79DE33DBFA5CE7829106A6EF2199D9496 Out = 8D1C902E4DDAB97D67508E13538675BD45E59E21D40432A2D2A5E9243AD30158AFD5AA69 Key = 9BE282204F105A61 Nonce = F7F2247110CE2237 In = 575CB34C5B252FC26D750583111B2F0440B93317119BE9ED482A0FBFBF0B6965C8BD672B6D Out = BAD166C1EB916C9C12DD3134E4F2A85F59109032E85A6989E581AB8834C6CCDBDC5A47E7FD Key = 86543EB8BE5D6E63 Nonce = 988C92F9C6E7F0A9 In = 82EFEFFC150758BF33700D7E54FDD0660D80B023B66DD10597A08BE9A5F26C9F71A00FE72CD7 Out = 95EF6D44507187386142436237DFCD9F5BAA7376B71CE10D6D47DA1D7645F790D1C30FA84131 Key = 61091390D89E195E Nonce = 55F954DA491D0487 In = E3411B122E35669226D9A9676C5A735A645C2588911B5DF3F00AE88C48FCF91CBED0EAD776511D Out = D9DA0C4ED498214DE38DFC8B6663DC231AB17E839819761952446E7BD4F3A4D5996D843B1A080C Key = 46656F1BAC4034F3 Nonce = B0AE27B323665888 In = 82905227D786AA54224A9A98EA663F11765606E37449774301E9229AACA08D8AAF88CFA055EACF46 Out = F46290E04EF671B0F1B40B6A3C957E416EC0240149D8E2DA20A936E9B65DF371BE6E3507C1075823 Key = 1C70A4D7A305675B Nonce = 05131A93D393B7BC In = 0132501B732D145D7B44D0CF92493B3FD7A56DD5E8762DB54BCECFBDD68E9843A1D0BD0F20849A3756 Out = F6253C8998EB2E8A898661336F398E555241736B9C0B5B83500121F96A3C85EE5BB6FC3489BBBAF3B1 Key = 27B33E69D3BCC393 Nonce = 7166FB734C6E9095 In = 374A3C384D246E0703BC69704DCC2EC8E8B4B6249BB9690A13F50D1723CE2638330B61D8F7328A8FA0E6 Out = 6BC4D82EF7CD9780FDAA3FEF10E2C786AAA81FD28B62F9EB47A2F25752A0E262554976A3BA619A02462E Key = 593C3910E6A31016 Nonce = B4F04B72B87551FF In = BF720B89414128080AE8A26CA4429BE5BC0C2C3FF51E29A13A8DF38B836817EDF289189948D9D8699DB418 Out = 4717A106215F960253C5CE8B091703C4235078F444E52B85E64CBDB4B1F76C7AB07346112FE05AF4356BBC Key = 201DE422F64787D2 Nonce = 1ABB95D29DC719B7 In = 3B7AE22299A6A9C4CE1E553821272605ADC48B7D8BEBB81E1C81F3C45CCFDCB6452989C314E1563F79D29824 Out = A48524FBFF6C0102E72A7756C488C8B317B33F7C3A5B7DBAC9B5B2F3D0245837CB6E4622407ABE3E6F9E6947 Key = 656F047010D196EC Nonce = 57008D1C6490B4DE In = D52C0A8CB50DA55BCD2DF81FD7FDE278862A60417FA2E3805B99844CBE4B0DBCD062B233397CD3FDB7B05075D4 Out = 92377CBF81BB2682ADCD32DF7054517FA3E3589A510420F6BE4A20E64FAB3D3F5053F8A2FDA8DCFE81BCDDB9D0 Key = 113094CFD2CC5B7E Nonce = 659806A7F5D7EA7D In = 282651F1695450455B6524AF1E2FD0C37BFEC3C37394E0996CE31E46C198B24949E7DA0D33D2388B865A946EA2BF Out = B76BE4E8CFE9B2056E2295CC3883CDA8F17DF535A51EDB480931AA5BE0DC2AB2101BDE55BC8E904EF6DA53AE525C Key = 58077FC3CC4757F3 Nonce = 6E459E39F0AB37E1 In = 9ADC8F91CEABEA3DF51FE620533E848233BAEC6DEE4DC0FC6F83843491AC8F614DD036616EC8A07CE5C87A13422E88 Out = 2AC49B69F5F2798FAA2726A26C4444EA6ECFE9C632FDCE9D15C7A9149FC1FCE7E9D52AD5844A04F504414B5D650771 Key = 84270A179A8FCBFB Nonce = 230750471B258152 In = B6D6A97A8F856E1F1652A0C0C5B4F0CF65A98BE4B8CE27754514A2104A97775326312680F5F0D209ADB2239BF8C6CD08 Out = 30DD92C5768A88EB8A8FF3FF3A4E0A2DB9BE7C9C3E358591DF5807A1D4C2EEB46408CF1329A20A2A0D9D810F89CA87C3 Key = 2360554BF329A8D7 Nonce = B58908438B0169B6 In = F630D0A6CD851E68D6779C8D493BA6A3C86618A97317E3CB69CFDFD8E792E1C7E8CD786F0FBDAF0169C430001A6C8504CE Out = F9C32B13EA6A1C1D2BE47A89CA46827840A8D5676B658D74C00F36F19E7285CC5BED7A81450C70DDC9D30642EDC266AE4D Key = 7DA9A637BF1880B7 Nonce = E1B8D1DD907D13D5 In = 023A29F413E2008EFA90CFEEA4C5E95D05FC24AA151B897662476C23C88928A50D28BC3A5A77A2DA6EC8AE91B579993AB509 Out = 84D24A62307BAE86B50E5C3584F3648D64CCF3B60C0C74F947116A2B54DE75646CADC8289F78161A1EAE8880AFB83248A57F [AES-128/CBC/NoPadding] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 7649ABAC8119B246CEE98E9B12E9197D5086CB9B507219EE95DB113A917678B273BED6B8E3C1743B7116E69E222295163FF1CAA1681FAC09120ECA307586E1A7 [AES-192/CBC/NoPadding] Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 4F021DB243BC633D7178183A9FA071E8B4D9ADA9AD7DEDF4E5E738763F69145A571B242012FB7AE07FA9BAAC3DF102E008B0E27988598881D920A9E64F5615CD [AES-256/CBC/NoPadding] Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F58C4C04D6E5F1BA779EABFB5F7BFBD69CFC4E967EDB808D679F777BC6702C7D39F23369A9D9BACFA530E26304231461B2EB05E2C39BE9FCDA6C19078C6A9D1B # test empty nonce, must be equivalent to zero [AES-128/CBC/NoPadding] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 3AD77BB40D7A3660A89ECAF32466EF97B148C17F309EE692287AE57CF12ADD49C93D11BFAF08C5DC4D90B37B4DEE002BA7356E1207BB406639E5E5CEB9A9ED93 # RFC 3962: Advanced Encryption Standard (AES) Encryption for Kerberos 5 [AES-128/CBC/CTS] Key = 636869636b656e207465726979616b69 Nonce = 00000000000000000000000000000000 In = 4920776f756c64206c696b652074686520 Out = c6353568f2bf8cb4d8a580362da7ff7f97 Key = 636869636b656e207465726979616b69 Nonce = 00000000000000000000000000000000 In = 4920776f756c64206c696b65207468652047656e6572616c20476175277320 Out = fc00783e0efdb2c1d445d4c8eff7ed2297687268d6ecccc0c07b25e25ecfe5 Key = 636869636b656e207465726979616b69 Nonce = 00000000000000000000000000000000 In = 4920776f756c64206c696b65207468652047656e6572616c2047617527732043 Out = 39312523a78662d5be7fcbcc98ebf5a897687268d6ecccc0c07b25e25ecfe584 Key = 636869636b656e207465726979616b69 Nonce = 00000000000000000000000000000000 In = 4920776f756c64206c696b65207468652047656e6572616c20476175277320436869636b656e2c20706c656173652c Out = 97687268d6ecccc0c07b25e25ecfe584b3fffd940c16a18c1b5549d2f838029e39312523a78662d5be7fcbcc98ebf5 Key = 636869636b656e207465726979616b69 Nonce = 00000000000000000000000000000000 In = 4920776f756c64206c696b65207468652047656e6572616c20476175277320436869636b656e2c20706c656173652c20 Out = 97687268d6ecccc0c07b25e25ecfe5849dad8bbb96c4cdc03bc103e1a194bbd839312523a78662d5be7fcbcc98ebf5a8 Key = 636869636b656e207465726979616b69 Nonce = 00000000000000000000000000000000 In = 4920776f756c64206c696b65207468652047656e6572616c20476175277320436869636b656e2c20706c656173652c20616e6420776f6e746f6e20736f75702e Out = 97687268d6ecccc0c07b25e25ecfe58439312523a78662d5be7fcbcc98ebf5a84807efe836ee89a526730dbc2f7bc8409dad8bbb96c4cdc03bc103e1a194bbd8 [ARIA-256/CBC/NoPadding] Key = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff Nonce = 0f1e2d3c4b5a69788796a5b4c3d2e1f0 In = 11111111aaaaaaaa11111111bbbbbbbb11111111cccccccc11111111dddddddd22222222aaaaaaaa22222222bbbbbbbb22222222cccccccc22222222dddddddd33333333aaaaaaaa33333333bbbbbbbb33333333cccccccc33333333dddddddd44444444aaaaaaaa44444444bbbbbbbb44444444cccccccc44444444dddddddd55555555aaaaaaaa55555555bbbbbbbb55555555cccccccc55555555dddddddd Out = 523a8a806ae621f155fdd28dbc34e1ab7b9b42432ad8b2efb96e23b13f0a6e52f36185d50ad002c5f601bee5493f118b243ee2e313642bffc3902e7b2efd9a12fa682edd2d23c8b9c5f043c18b17c1ec4b5867918270fbec1027c19ed6af833da5d620994668ca22f599791d292dd6273b2959082aafb7a996167cce1eec5f0cfd15f610d87e2dda9ba68ce1260ca54b222491418374294e7909b1e8551cd8de botan-2.4.0/src/tests/data/modes/cfb.vec000066400000000000000000000145401322470703100200250ustar00rootroot00000000000000 [DES/CFB] Key = ADD9CE7BCF48C44B Nonce = 0F90E78835BA3183 In = 5EEF8199471C2A7EF97509623CAE32C35A90245B70A21CE36E Out = 658B25E25DF23948847AFA4C9FFDD5B3DDF35D801CBE945168 Key = 0123456789ABCDEF Nonce = 1234567890ABCDEF In = 4E6F77206973207468652074696D6520666F7220616C6C20 Out = F3096249C7F46E51A69E839B1A92F78403467133898EA622 Key = 7132D895529A7AFF Nonce = FA1FE8F921706C75 In = D14FD67A9B4D7B0F65B7CA3DA91741603DA446 Out = 0CB8929A854E61AB3BEB72CE0F13BA328BA73A Key = F51CF13FD55F33B8 Nonce = 10E61C7F8276132E In = 16 Out = E1 Key = 6A2306397E6399AF Nonce = 6791874E16642DD8 In = B8F7 Out = 9F09 Key = 08D3B08CB02E2547 Nonce = B35072A53FA36190 In = 914AA4 Out = 1CDDAD Key = 454A9ACA108AD24C Nonce = 64DADB33CCF1DEBD In = 252F0616 Out = E22A706A Key = 087FC9F0B8BE08F3 Nonce = 5E511251C063B3C7 In = F06F376C6E Out = C2F054E435 Key = FE1EA0F0AC5F2C02 Nonce = A247E69CED4A2BF1 In = 9A181AFEC04C Out = C49218C8A25B Key = 1E7C7274307EDB90 Nonce = AFB634941C366C1D In = AC465CBD745341 Out = 768B6F5BFA9C24 Key = 53E241E43AAD03E7 Nonce = BE0A4AE59056D8FE In = 52BDFD51E3434E94 Out = C5D84483756AC360 Key = 487C9FBD140EF278 Nonce = 43F88DE155E98523 In = A62C02059AFE67CD7F Out = 032A99BE4DF6B63F97 Key = 8B068595D5B79177 Nonce = 7129287761D94D9F In = 32D3C8A283257F6276C3 Out = BCFA26EFE2D93A4B1364 Key = 750C87995AFD65EE Nonce = A61398FFF559FAAD In = 17CB11A60F880C16D6CC3A Out = 3DC099D927B8AA66B2A5C8 Key = 08A5F56200AC9300 Nonce = 9F9ED0928B8CD2DD In = EAA91CEDE4EFC60F02B1E0EE Out = 75614EA2FD5474FDFE3A5612 Key = B11DFA915AD86FF9 Nonce = 3885ECF48A611DC5 In = 68DB8992E91D759256AB373748 Out = 9D0E14F0B2BE2D3B47103DA75F Key = FBF9E6D9344B0F2C Nonce = 6917F8FE1AC12101 In = D75ACDD3E4040DFDA924CE09E627 Out = A878CE766412A9C387AD61642FB7 Key = 8616D2EA6E6106B3 Nonce = CFE4DFA7044F56AB In = 38B667A6E4458C8732AAE6F4D0AC36 Out = 5BCFD93D6B4B45D9D0D03162FA8FB9 Key = E255E4A4C3606081 Nonce = 3F160DFF918C3F78 In = 0B439A72A4430B3D15E234034BA2C066 Out = 1ADAE0A4A0D582B70B60ED1C859A07B3 Key = B9CDD5442E1C7FD7 Nonce = 5D1B1ECEB7335274 In = 82E27182FC22CD8918DDDBDB850034A4F2 Out = 9767881B1909DB5E146CAAF5FC6A118814 [DES/CFB(32)] Key = 44FD92D1AF17DA22 Nonce = 5EF2AB4DE2C32258 In = BF28A5B2F3FC788F Out = 13799E52F0BF6B0E Key = 75E1E4E29E6C9205 Nonce = 40D4F3DEF6222186 In = 083F1997FF19246C41ACC1EE3A18B489 Out = 31C4C90B034B75B21280B60751E60821 Key = 875D1C19A20E6740 Nonce = E2912582ACE9830A In = 5B38FD10CAFF5611114CAC8033DE01DE Out = 6434BCA36287C8FB3FD0BAF32874C740 Key = 79FE005333D6437E Nonce = BDBED60C0E069960 In = 44D4480CE326D9583E6BC13A78D7DE03 Out = 7D52C87B2A0D33B3A48631EF3184397A Key = FFF6D6B146354428 Nonce = 2EDB634B4C7CF4EB In = 81BE542AD00FCAEB34945D89B4F29EAD Out = DB0DBCD722960D54B531D8AEFE1B26FB Key = 330AAD15FFEB8E78 Nonce = 826F429D0F342F43 In = E0A787DA56534F407586ABA1736C9DDF Out = 34FFCFE532186F84EF57E0CB5AFE654D Key = F15BD42AEA7F38FD Nonce = 5E10F9CAF0730C4E In = 302C49BF921E0516261F00B2FA2E96A6 Out = 19D49D5A54C8FD15EF317AFD5A87EBDE [DES/CFB(16)] Key = 302A7B0BDB8669FF Nonce = 47C89DD706739D23 In = 6BFE8F2BF363D3DA0A2CDAAF2D7E1D44 Out = 8D407E5A8B5217C56B8A88E3CE478B85 Key = 4243AF4851BF8400 Nonce = BE0C9A3B77C26C9F In = A1A3ABFEB7BD450F Out = D67A4F0C8DD67769 Key = 4F05484FAB8D47E7 Nonce = CA6129BC11056056 In = D316B78F0C25C56E Out = E8BEBBADFFE18E2A Key = 04ADC5D1401848D3 Nonce = 5DE8A3519C477771 In = 09BD5550EDD99666 Out = 69C4AA4C8B88370D Key = B045BACEC002FAAA Nonce = 1716B53D7A87854E In = 7C1BCEF78CA58DAD Out = D14FF21AFF121E8B Key = 8053149DC51A7F4E Nonce = E18A7936211291CC In = 2671E5DC0341CCF4 Out = D618365EA3287474 [DES/CFB(8)] Key = 3400AA949E053449 Nonce = 2ABF031C3DD08BA5 In = CDD4BAAD59214E97 Out = DFD8C7EE7485E30C Key = CA2CC8DCAE150ADD Nonce = 2AE7960241E5ECD0 In = 0BE8FF9BE975CE5A Out = FF834A9315DE58C0 Key = 9D2A486812B8BBD3 Nonce = AAF8C0A145A00319 In = 772AEBCE3E9DB532 Out = E31732388E069526 Key = CA9CEA52658150EF Nonce = 4DF0F3A7B49AF71E In = B6DD299F4D45C378 Out = 1A5DE72F6BCEDD33 Key = 139D5249F1CEE0F9 Nonce = 1B3212F80A91A42E In = A5107583CA3CAC3B Out = D5541A94B73C2DDB Key = D8D3F1611C2AD43C Nonce = 7B4CDFC2344DDABF In = 24E224330C88791C Out = 177AA6BD3D885167 Key = DC24F740905DDA96 Nonce = 5C307E5CF2C73D46 In = 92C51FE490D57CE8 Out = A6ADC1AA622BAB1D Key = 3739A5D446E8CEA5 Nonce = BECAFE19A645F489 In = E85D092290F3A53F Out = A1A2A831C55F1454 Key = 98ABE3C8857BE8A8 Nonce = B4A9E4A90C4D08D0 In = CDE5CDDDFABED42E Out = 4AD6E96CFBF9443E Key = 51668D4A64FB31DE Nonce = 31E42E3EFE3ECD65 In = 6614A9AB1E3EC578 Out = 32B6733A61D38CD0 [AES-128/CFB(8)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D Out = 3B79424C9C0DD436BACE9E0ED4586A4F32B9 [AES-192/CFB(8)] Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D Out = CDA2521EF0A905CA44CD057CBF0D47A0678A [AES-256/CFB(8)] Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D Out = DC1F1A8520A64DB55FCC8AC554844E889700 [AES-128/CFB] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 3B3FD92EB72DAD20333449F8E83CFB4AC8A64537A0B3A93FCDE3CDAD9F1CE58B26751F67A3CBB140B1808CF187A4F4DFC04B05357C5D1C0EEAC4C66F9FF7F2E6 # Generated by OpenSSL Key = 00000000000000000000000000000000 Nonce = 42424242424242424242424242424242 In = 0000000000000000000000000000000000000000 Out = BFDAA57CB812189713A950AD9947887983021617 [AES-192/CFB] Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CDC80D6FDDF18CAB34C25909C99A417467CE7F7F81173621961A2B70171D3D7A2E1E8A1DD59B88B1C8E60FED1EFAC4C9C05F9F9CA9834FA042AE8FBA584B09FF [AES-256/CFB] Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = DC7E84BFDA79164B7ECD8486985D386039FFED143B28B1C832113C6331E5407BDF10132415E54B92A13ED0A8267AE2F975A385741AB9CEF82031623D55B1E471 botan-2.4.0/src/tests/data/modes/ctr.vec000066400000000000000000000012121322470703100200530ustar00rootroot00000000000000# Main CTR mode tests are in stream/ctr.vec this file is primarily # to test Stream_Cipher_Mode adaptor class [CTR-BE(DES)] Key = 0123456789ABCDEF Nonce = 1234567890ABCDEF In = 4E6F77206973207468652074696D6520666F7220616C6C20 Out = F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75 [CTR-BE(AES-128)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 874D6191B620E3261BEF6864990DB6CE9806F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE botan-2.4.0/src/tests/data/modes/xts.vec000066400000000000000000016441131322470703100201170ustar00rootroot00000000000000[AES-128/XTS] Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 00000000000000000000000000000000 In = 0000000000000000000000000000000000000000000000000000000000000000 Out = 917CF69EBD68B2EC9B9FE9A3EADDA692CD43D2F59598ED858C02C2652FBF922E Key = 1111111111111111111111111111111122222222222222222222222222222222 Nonce = 33333333330000000000000000000000 In = 4444444444444444444444444444444444444444444444444444444444444444 Out = C454185E6A16936E39334038ACEF838BFB186FFF7480ADC4289382ECD6D394F0 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 4444444444444444444444444444444444444444444444444444444444444444 Out = B01F86F8EDC1863706FA8A4253E34F28AF319DE38334870F4DD1F94CBE9832F1 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = 27A7479BEFA1D476489F308CD4CFA6E2A96E4BBE3208FF25287DD3819616E89CC78CF7F5E543445F8333D8FA7F56000005279FA5D8B5E4AD40E736DDB4D35412328063FD2AAB53E5EA1E0A9F332500A5DF9487D07A5C92CC512C8866C7E860CE93FDF166A24912B422976146AE20CE846BB7DC9BA94A767AAEF20C0D61AD02655EA92DC4C4E41A8952C651D33174BE51A10C421110E6D81588EDE82103A252D8A750E8768DEFFFED9122810AAEB99F9172AF82B604DC4B8E51BCB08235A6F4341332E4CA60482A4BA1A03B3E65008FC5DA76B70BF1690DB4EAE29C5F1BADD03C5CCF2A55D705DDCD86D449511CEB7EC30BF12B1FA35B913F9F747A8AFD1B130E94BFF94EFFD01A91735CA1726ACD0B197C4E5B03393697E126826FB6BBDE8ECC1E08298516E2C9ED03FF3C1B7860F6DE76D4CECD94C8119855EF5297CA67E9F3E7FF72B1E99785CA0A7E7720C5B36DC6D72CAC9574C8CBBC2F801E23E56FD344B07F22154BEBA0F08CE8891E643ED995C94D9A69C9F1B5F499027A78572AEEBD74D20CC39881C213EE770B1010E4BEA718846977AE119F7A023AB58CCA0AD752AFE656BB3C17256A9F6E9BF19FDD5A38FC82BBE872C5539EDB609EF4F79C203EBB140F2E583CB2AD15B4AA5B655016A8449277DBD477EF2C8D6C017DB738B18DEB4A427D1923CE3FF262735779A418F20A282DF920147BEABE421EE5319D0568 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 01000000000000000000000000000000 In = 27A7479BEFA1D476489F308CD4CFA6E2A96E4BBE3208FF25287DD3819616E89CC78CF7F5E543445F8333D8FA7F56000005279FA5D8B5E4AD40E736DDB4D35412328063FD2AAB53E5EA1E0A9F332500A5DF9487D07A5C92CC512C8866C7E860CE93FDF166A24912B422976146AE20CE846BB7DC9BA94A767AAEF20C0D61AD02655EA92DC4C4E41A8952C651D33174BE51A10C421110E6D81588EDE82103A252D8A750E8768DEFFFED9122810AAEB99F9172AF82B604DC4B8E51BCB08235A6F4341332E4CA60482A4BA1A03B3E65008FC5DA76B70BF1690DB4EAE29C5F1BADD03C5CCF2A55D705DDCD86D449511CEB7EC30BF12B1FA35B913F9F747A8AFD1B130E94BFF94EFFD01A91735CA1726ACD0B197C4E5B03393697E126826FB6BBDE8ECC1E08298516E2C9ED03FF3C1B7860F6DE76D4CECD94C8119855EF5297CA67E9F3E7FF72B1E99785CA0A7E7720C5B36DC6D72CAC9574C8CBBC2F801E23E56FD344B07F22154BEBA0F08CE8891E643ED995C94D9A69C9F1B5F499027A78572AEEBD74D20CC39881C213EE770B1010E4BEA718846977AE119F7A023AB58CCA0AD752AFE656BB3C17256A9F6E9BF19FDD5A38FC82BBE872C5539EDB609EF4F79C203EBB140F2E583CB2AD15B4AA5B655016A8449277DBD477EF2C8D6C017DB738B18DEB4A427D1923CE3FF262735779A418F20A282DF920147BEABE421EE5319D0568 Out = 264D3CA8512194FEC312C8C9891F279FEFDD608D0C027B60483A3FA811D65EE59D52D9E40EC5672D81532B38B6B089CE951F0F9C35590B8B978D175213F329BB1C2FD30F2F7F30492A61A532A79F51D36F5E31A7C9A12C286082FF7D2394D18F783E1A8E72C722CAAAA52D8F065657D2631FD25BFD8E5BAAD6E527D763517501C68C5EDC3CDD55435C532D7125C8614DEED9ADAA3ACADE5888B87BEF641C4C994C8091B5BCD387F3963FB5BC37AA922FBFE3DF4E5B915E6EB514717BDD2A74079A5073F5C4BFD46ADF7D282E7A393A52579D11A028DA4D9CD9C77124F9648EE383B1AC763930E7162A8D37F350B2F74B8472CF09902063C6B32E8C2D9290CEFBD7346D1C779A0DF50EDCDE4531DA07B099C638E83A755944DF2AEF1AA31752FD323DCB710FB4BFBB9D22B925BC3577E1B8949E729A90BBAFEACF7F7879E7B1147E28BA0BAE940DB795A61B15ECF4DF8DB07B824BB062802CC98A9545BB2AAEED77CB3FC6DB15DCD7D80D7D5BC406C4970A3478ADA8899B329198EB61C193FB6275AA8CA340344A75A862AEBE92EEE1CE032FD950B47D7704A3876923B4AD62844BF4A09C4DBE8B4397184B7471360C9564880AEDDDB9BAA4AF2E75394B08CD32FF479C57A07D3EAB5D54DE5F9738B8D27F27A9F0AB11799D7B7FFEFB2704C95C6AD12C39F1E867A4B7B1D7818A4B753DFD2A89CCB45E001A03A867B187F225DD Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 02000000000000000000000000000000 In = 264D3CA8512194FEC312C8C9891F279FEFDD608D0C027B60483A3FA811D65EE59D52D9E40EC5672D81532B38B6B089CE951F0F9C35590B8B978D175213F329BB1C2FD30F2F7F30492A61A532A79F51D36F5E31A7C9A12C286082FF7D2394D18F783E1A8E72C722CAAAA52D8F065657D2631FD25BFD8E5BAAD6E527D763517501C68C5EDC3CDD55435C532D7125C8614DEED9ADAA3ACADE5888B87BEF641C4C994C8091B5BCD387F3963FB5BC37AA922FBFE3DF4E5B915E6EB514717BDD2A74079A5073F5C4BFD46ADF7D282E7A393A52579D11A028DA4D9CD9C77124F9648EE383B1AC763930E7162A8D37F350B2F74B8472CF09902063C6B32E8C2D9290CEFBD7346D1C779A0DF50EDCDE4531DA07B099C638E83A755944DF2AEF1AA31752FD323DCB710FB4BFBB9D22B925BC3577E1B8949E729A90BBAFEACF7F7879E7B1147E28BA0BAE940DB795A61B15ECF4DF8DB07B824BB062802CC98A9545BB2AAEED77CB3FC6DB15DCD7D80D7D5BC406C4970A3478ADA8899B329198EB61C193FB6275AA8CA340344A75A862AEBE92EEE1CE032FD950B47D7704A3876923B4AD62844BF4A09C4DBE8B4397184B7471360C9564880AEDDDB9BAA4AF2E75394B08CD32FF479C57A07D3EAB5D54DE5F9738B8D27F27A9F0AB11799D7B7FFEFB2704C95C6AD12C39F1E867A4B7B1D7818A4B753DFD2A89CCB45E001A03A867B187F225DD Out = FA762A3680B76007928ED4A4F49A9456031B704782E65E16CECB54ED7D017B5E18ABD67B338E81078F21EDB7868D901EBE9C731A7C18B5E6DEC1D6A72E078AC9A4262F860BEEFA14F4E821018272E411A951502B6E79066E84252C3346F3AA62344351A291D4BEDC7A07618BDEA2AF63145CC7A4B8D4070691AE890CD65733E7946E9021A1DFFC4C59F159425EE6D50CA9B135FA6162CEA18A939838DC000FB386FAD086ACCE5AC07CB2ECE7FD580B00CFA5E98589631DC25E8E2A3DAF2FFDEC26531659912C9D8F7A15E5865EA8FB5816D6207052BD7128CD743C12C8118791A4736811935EB982A532349E31DD401E0B660A568CB1A4711F552F55DED59F1F15BF7196B3CA12A91E488EF59D64F3A02BF45239499AC6176AE321C4A211EC545365971C5D3F4F09D4EB139BFDF2073D33180B21002B65CC9865E76CB24CD92C874C24C18350399A936AB3637079295D76C417776B94EFCE3A0EF7206B15110519655C956CBD8B2489405EE2B09A6B6EEBE0C53790A12A8998378B33A5B71159625F4BA49D2A2FDBA59FBF0897BC7AABD8D707DC140A80F0F309F835D3DA54AB584E501DFA0EE977FEC543F74186A802B9A37ADB3E8291ECA04D66520D229E60401E7282BEF486AE059AA70696E0E305D777140A7A883ECDCB69B9FF938E8A4231864C69CA2C2043BED007FF3E605E014BCF518138DC3A25C5E236171A2D01D6 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = FD000000000000000000000000000000 In = 8E41B78C390B5AF9D758BB214A67E9F6BF7727B09AC6124084C37611398FA45DAAD94868600ED391FB1ACD4857A95B466E62EF9F4B377244D1C152E7B30D731AAD30C716D214B707AED99EB5B5E580B3E887CF7497465651D4B60E6042051DA3693C3B78C14489543BE8B6AD0BA629565BBA202313BA7B0D0C94A3252B676F46CC02CE0F8A7D34C0ED229129673C1F61AED579D08A9203A25AAC3A77E9DB60267996DB38DF637356D9DCD1632E369939F2A29D89345C66E05066F1A3677AEF18DEA4113FAEB629E46721A66D0A7E785D3E29AF2594EB67DFA982AFFE0AAC058F6E15864269B135418261FC3AFB089472CF68C45DD7F231C6249BA0255E1E033833FC4D00A3FE02132D7BC3873614B8AEE34273581EA0325C81F0270AFFA13641D052D36F0757D484014354D02D6883CA15C24D8C3956B1BD027BCF41F151FD8023C5340E5606F37E90FDB87C86FB4FA634B3718A30BACE06A66EAF8F63C4AA3B637826A87FE8CFA44282E92CB1615AF3A28E53BC74C7CBA1A0977BE9065D0C1A5DEC6C54AE38D37F37AA35283E048E5530A85C4E7A29D7B92EC0C3169CDF2A805C7604BCE60049B9FB7B8EAAC10F51AE23794CEBA68BB58112E293B9B692CA721B37C662F8574ED4DBA6F88E170881C82CDDC1034A0CA7E284BF0962B6B26292D836FA9F73C1AC770EEF0F2D3A1EAF61D3E03555FD424EEDD67E18A18094F888 Out = D55F684F81F4426E9FDE92A5FF02DF2AC896AF63962888A97910C1379E20B0A3B1DB613FB7FE2E07004329EA5C22BFD33E3DBE4CF58CC608C2C26C19A2E2FE22F98732C2B5CB844CC6C0702D91E1D50FC4382A7EBA5635CD602432A2306AC4CE82F8D70C8D9BC15F918FE71E74C622D5CF71178BF6E0B9CC9F2B41DD8DBE441C41CD0C73A6DC47A348F6702F9D0E9B1B1431E948E299B9EC2272AB2C5F0C7BE86AFFA5DEC87A0BEE81D3D50007EDAA2BCFCCB35605155FF36ED8EDD4A40DCD4B243ACD11B2B987BDBFAF91A7CAC27E9C5AEA525EE53DE7B2D3332C8644402B823E94A7DB26276D2D23AA07180F76B4FD29B9C0823099C9D62C519880AEE7E9697617C1497D47BF3E571950311421B6B734D38B0DB91EB85331B91EA9F61530F54512A5A52A4BAD589EB69781D537F23297BB459BDAD2948A29E1550BF4787E0BE95BB173CF5FAB17DAB7A13A052A63453D97CCEC1A321954886B7A1299FAAEECAE35C6EAACA753B041B5E5F093BF83397FD21DD6B3012066FCC058CC32C3B09D7562DEE29509B5839392C9FF05F51F3166AAAC4AC5F238038A3045E6F72E48EF0FE8BC675E82C318A268E43970271BF119B81BF6A982746554F84E72B9F00280A320A08142923C23C883423FF949827F29BBACDC1CCDB04938CE6098C95BA6B32528F4EF78EED778B2E122DDFD1CBDD11D1C0A6783E011FC536D63D053260637 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = FE000000000000000000000000000000 In = D55F684F81F4426E9FDE92A5FF02DF2AC896AF63962888A97910C1379E20B0A3B1DB613FB7FE2E07004329EA5C22BFD33E3DBE4CF58CC608C2C26C19A2E2FE22F98732C2B5CB844CC6C0702D91E1D50FC4382A7EBA5635CD602432A2306AC4CE82F8D70C8D9BC15F918FE71E74C622D5CF71178BF6E0B9CC9F2B41DD8DBE441C41CD0C73A6DC47A348F6702F9D0E9B1B1431E948E299B9EC2272AB2C5F0C7BE86AFFA5DEC87A0BEE81D3D50007EDAA2BCFCCB35605155FF36ED8EDD4A40DCD4B243ACD11B2B987BDBFAF91A7CAC27E9C5AEA525EE53DE7B2D3332C8644402B823E94A7DB26276D2D23AA07180F76B4FD29B9C0823099C9D62C519880AEE7E9697617C1497D47BF3E571950311421B6B734D38B0DB91EB85331B91EA9F61530F54512A5A52A4BAD589EB69781D537F23297BB459BDAD2948A29E1550BF4787E0BE95BB173CF5FAB17DAB7A13A052A63453D97CCEC1A321954886B7A1299FAAEECAE35C6EAACA753B041B5E5F093BF83397FD21DD6B3012066FCC058CC32C3B09D7562DEE29509B5839392C9FF05F51F3166AAAC4AC5F238038A3045E6F72E48EF0FE8BC675E82C318A268E43970271BF119B81BF6A982746554F84E72B9F00280A320A08142923C23C883423FF949827F29BBACDC1CCDB04938CE6098C95BA6B32528F4EF78EED778B2E122DDFD1CBDD11D1C0A6783E011FC536D63D053260637 Out = 72EFC1EBFE1EE25975A6EB3AA8589DDA2B261F1C85BDAB442A9E5B2DD1D7C3957A16FC08E526D4B1223F1B1232A11AF274C3D70DAC57F83E0983C498F1A6F1AECB021C3E70085A1E527F1CE41EE5911A82020161529CD82773762DAF5459DE94A0A82ADAE7E1703C808543C29ED6FB32D9E004327C1355180C995A07741493A09C21BA01A387882DA4F62534B87BB15D60D197201C0FD3BF30C1500A3ECFECDD66D8721F90BCC4C17EE925C61B0A03727A9C0D5F5CA462FBFA0AF1C2513A9D9D4B5345BD27A5F6E653F751693E6B6A2B8EAD57D511E00E58C45B7B8D005AF79288F5C7C22FD4F1BF7A898B03A5634C6A1AE3F9FAE5DE4F296A2896B23E7ED43ED14FA5A2803F4D28F0D3FFCF24757677AEBDB47BB388378708948A8D4126ED1839E0DA29A537A8C198B3C66AB00712DD261674BF45A73D67F76914F830CA014B65596F27E4CF62DE66125A5566DF9975155628B400FBFB3A29040ED50FAFFDBB18AECE7C5C44693260AAB386C0A37B11B114F1C415AEBB653BE468179428D43A4D8BC3EC38813ECA30A13CF1BB18D524F1992D44D8B1A42EA30B22E6C95B199D8D182F8840B09D059585C31AD691FA0619FF038ACA2C39A943421157361717C49D322028A74648113BD8C9D7EC77CF3C89C1EC8718CEFF8516D96B34C3C614F10699C9ABC4ED0411506223BEA16AF35C883ACCDBE1104EEF0CFDB54E12FB230A Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = FF000000000000000000000000000000 In = 72EFC1EBFE1EE25975A6EB3AA8589DDA2B261F1C85BDAB442A9E5B2DD1D7C3957A16FC08E526D4B1223F1B1232A11AF274C3D70DAC57F83E0983C498F1A6F1AECB021C3E70085A1E527F1CE41EE5911A82020161529CD82773762DAF5459DE94A0A82ADAE7E1703C808543C29ED6FB32D9E004327C1355180C995A07741493A09C21BA01A387882DA4F62534B87BB15D60D197201C0FD3BF30C1500A3ECFECDD66D8721F90BCC4C17EE925C61B0A03727A9C0D5F5CA462FBFA0AF1C2513A9D9D4B5345BD27A5F6E653F751693E6B6A2B8EAD57D511E00E58C45B7B8D005AF79288F5C7C22FD4F1BF7A898B03A5634C6A1AE3F9FAE5DE4F296A2896B23E7ED43ED14FA5A2803F4D28F0D3FFCF24757677AEBDB47BB388378708948A8D4126ED1839E0DA29A537A8C198B3C66AB00712DD261674BF45A73D67F76914F830CA014B65596F27E4CF62DE66125A5566DF9975155628B400FBFB3A29040ED50FAFFDBB18AECE7C5C44693260AAB386C0A37B11B114F1C415AEBB653BE468179428D43A4D8BC3EC38813ECA30A13CF1BB18D524F1992D44D8B1A42EA30B22E6C95B199D8D182F8840B09D059585C31AD691FA0619FF038ACA2C39A943421157361717C49D322028A74648113BD8C9D7EC77CF3C89C1EC8718CEFF8516D96B34C3C614F10699C9ABC4ED0411506223BEA16AF35C883ACCDBE1104EEF0CFDB54E12FB230A Out = 3260AE8DAD1F4A32C5CAFE3AB0EB95549D461A67CEB9E5AA2D3AFB62DECE0553193BA50C75BE251E08D1D08F1088576C7EFDFAAF3F459559571E12511753B07AF073F35DA06AF0CE0BBF6B8F5CCC5CEA500EC1B211BD51F63B606BF6528796CA12173BA39B8935EE44CCCE646F90A45BF9CCC567F0ACE13DC2D53EBEEDC81F58B2E41179DDDF0D5A5C42F5D8506C1A5D2F8F59F3EA873CBCD0EEC19ACBF325423BD3DCB8C2B1BF1D1EAED0EBA7F0698E4314FBEB2F1566D1B9253008CBCCF45A2B0D9C5C9C21474F4076E02BE26050B99DEE4FD68A4CF890E496E4FCAE7B70F94EA5A9062DA0DAEBA1993D2CCD1DD3C244B8428801495A58B216547E7E847C46D1D756377B6242D2E5FB83BF752B54E0DF71E889F3A2BB0F4C10805BF3C590376E3C24E22FF57F7FA965577375325CEA5D920DB94B9C336B455F6E894C01866FE9FBB8C8D3F70A2957285F6DFB5DCD8CBF54782F8FE7766D4723819913AC773421E3A31095866BAD22C86A6036B2518B2059B4229D18C8C2CCBDF906C6CC6E82464EE57BDDB0BEBCB1DC645325BFB3E665EF7251082C88EBB1CF203BD779FDD38675713C8DAADD17E1CABEE432B09787B6DDF3304E38B731B45DF5DF51B78FCFB3D32466028D0BA36555E7E11AB0EE0666061D1645D962444BC47A38188930A84B4D561395C73C087021927CA638B7AFC8A8679CCB84C26555440EC7F10445CD Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10 Out = 6C1625DB4671522D3D7599601DE7CA09ED Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011 Out = D069444B7A7E0CAB09E24447D24DEB1FEDBF Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112 Out = E5DF1351C0544BA1350B3363CD8EF4BEEDBF9D Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213 Out = 9D84C813F719AA2C7BE3F66171C7C5C2EDBF9DAC Key = E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF Nonce = 21436587A90000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = 38B45812EF43A05BD957E545907E223B954AB4AAF088303AD910EADF14B42BE68B2461149D8C8BA85F992BE970BC621F1B06573F63E867BF5875ACAFA04E42CCBD7BD3C2A0FB1FFF791EC5EC36C66AE4AC1E806D81FBF709DBE29E471FAD38549C8E66F5345D7C1EB94F405D1EC785CC6F6A68F6254DD8339F9D84057E01A17741990482999516B5611A38F41BB6478E6F173F320805DD71B1932FC333CB9EE39936BEEA9AD96FA10FB4112B901734DDAD40BC1878995F8E11AEE7D141A2F5D48B7A4E1E7F0B2C04830E69A4FD1378411C2F287EDF48C6C4E5C247A19680F7FE41CEFBD49B582106E3616CBBE4DFB2344B2AE9519391F3E0FB4922254B1D6D2D19C6D4D537B3A26F3BCC51588B32F3ECA0829B6A5AC72578FB814FB43CF80D64A233E3F997A3F02683342F2B33D25B492536B93BECB2F5E1A8B82F5B883342729E8AE09D16938841A21A97FB543EEA3BBFF59F13C1A18449E398701C1AD51648346CBC04C27BB2DA3B93A1372CCAE548FB53BEE476F9E9C91773B1BB19828394D55D3E1A20ED69113A860B6829FFA847224604435070221B257E8DFF783615D2CAE4803A93AA4334AB482A0AFAC9C0AEDA70B45A481DF5DEC5DF8CC0F423C77A5FD46CD312021D4B438862419A791BE03BB4D97C0E59578542531BA466A83BAF92CEFC151B5CC1611A167893819B63FB8A6B18E86DE60290FA72B797B0CE59F3 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E Out = D05BC090A8E04F1B3D3ECDD5BAEC0FD4EDBF9DACE45D6F6A7306E64BE5DD82 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10 Out = 6C1625DB4671522D3D7599601DE7CA09ED Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011 Out = D069444B7A7E0CAB09E24447D24DEB1FEDBF Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112 Out = E5DF1351C0544BA1350B3363CD8EF4BEEDBF9D Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213 Out = 9D84C813F719AA2C7BE3F66171C7C5C2EDBF9DAC Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011121314 Out = 2CD47E780DE4B008D8FDE727C1C325F4EDBF9DACE4 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415 Out = 9148CA1ADE56C1914833BCA9F7742F4EEDBF9DACE45D Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213141516 Out = 95B3BDFF7122C424BA9501BA0B9E09F0EDBF9DACE45D6F Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = A2316435248154E2026E672372A6A789EDBF9DACE45D6F6A Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718 Out = 8F4DCBAD55558D7B4E01D9379CD4EA22EDBF9DACE45D6F6A73 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213141516171819 Out = 4D184C4B48F4BE3B2491A04093713EC3EDBF9DACE45D6F6A7306 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A Out = 1FB75FF08D88C63CADBA2CCF5CDDE52FEDBF9DACE45D6F6A7306E6 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B Out = 5E20653F0988F211299DD6D76CCE0E72EDBF9DACE45D6F6A7306E64B Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Out = 60D814B83896C40CC56EC143D38A7C7FEDBF9DACE45D6F6A7306E64BE5 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D Out = 24F3B2374C2EE6DD6E0B9ED63E354307EDBF9DACE45D6F6A7306E64BE5DD Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E Out = D05BC090A8E04F1B3D3ECDD5BAEC0FD4EDBF9DACE45D6F6A7306E64BE5DD82 Key = E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECF Nonce = 21436587A90000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF0001020304050607 Out = 38B45812EF43A05BD957E545907E223B954AB4AAF088303AD910EADF14B42BE68B2461149D8C8BA85F992BE970BC621F1B06573F63E867BF5875ACAFA04E42CCBD7BD3C2A0FB1FFF791EC5EC36C66AE4AC1E806D81FBF709DBE29E471FAD38549C8E66F5345D7C1EB94F405D1EC785CC6F6A68F6254DD8339F9D84057E01A17741990482999516B5611A38F41BB6478E6F173F320805DD71B1932FC333CB9EE39936BEEA9AD96FA10FB4112B901734DDAD40BC1878995F8E11AEE7D141A2F5D48B7A4E1E7F0B2C04830E69A4FD1378411C2F287EDF48C6C4E5C247A19680F7FE41CEFBD49B582106E3616CBBE4DFB2344B2AE9519391F3E0FB4922254B1D6D2D19C6D4D537B3A26F3BCC51588B32F3ECA0829B6A5AC72578FB814FB43CF80D64A233E3F997A3F02683342F2B33D25B492536B93BECB2F5E1A8B82F5B883342729E8AE09D16938841A21A97FB543EEA3BBFF59F13C1A18449E398701C1AD51648346CBC04C27BB2DA3B93A1372CCAE548FB53BEE476F9E9C91773B1BB19828394D55D3E1A20ED69113A860B6829FFA847224604435070221B257E8DFF783615D2CAE4803A93AA4334AB482A0AFAC9C0AEDA70B45A481DF5DEC5DF8CC0F423C77A5FD46CD312021D4B438862419A791BE03BB4D97C0E59578542531BA466A83BAF92CEFC151B5CC1611A167893819B63FB37EC662BC0FC907DB74A94468A55A7BC8A6B18E86DE60290 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 Out = 27A7479BEFA1D476489F308CD4CFA6E294E4CD40E4BA22AEF6C26F9F32DDC925A96E4BBE32 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 11000000000000000000000000000000 In = 27A7479BEFA1D476489F308CD4CFA6E294E4CD40E4BA22AEF6C26F9F32DDC925A96E4BBE32 Out = 88DFFC5A67617A54952ADDCD9CCBDA5BA127EAAD95B20441788EFBC0462F6B54F65FD7579B Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 22110000000000000000000000000000 In = 88DFFC5A67617A54952ADDCD9CCBDA5BA127EAAD95B20441788EFBC0462F6B54F65FD7579B Out = 5000ECA5A1F6A49378030D9EE805ACEF460F314EE04BB514034EB27FB8DF2BC812AE5BDF8C Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 33221100000000000000000000000000 In = 5000ECA5A1F6A49378030D9EE805ACEF460F314EE04BB514034EB27FB8DF2BC812AE5BDF8C Out = E59E6F233BE0E0830483C6BD4E82F4C39543558A25E3DB60A553A5948145A6FFB5E6BE1DB5 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 44332211000000000000000000000000 In = E59E6F233BE0E0830483C6BD4E82F4C39543558A25E3DB60A553A5948145A6FFB5E6BE1DB5 Out = 01C7772FEB67516E13E1BE201F0CDE25F84D71AACDA86A3957E285B2059D7C9384F4432795 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 55443322110000000000000000000000 In = 01C7772FEB67516E13E1BE201F0CDE25F84D71AACDA86A3957E285B2059D7C9384F4432795 Out = 457BD3FE9531EBF13FF98F965AFC1A075B5C80108D3EBCC8041CD29DE4416A71F1ED58F383 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 Out = 27A7479BEFA1D476489F308CD4CFA6E288F548E5C4239F91712A587E2B05AC3DA96E4BBE Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 11000000000000000000000000000000 In = 27A7479BEFA1D476489F308CD4CFA6E288F548E5C4239F91712A587E2B05AC3DA96E4BBE Out = 88DFFC5A67617A54952ADDCD9CCBDA5B1A87DE598E8E9FC8E3CB6EB80141CDECAE9E78B3 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 22110000000000000000000000000000 In = 88DFFC5A67617A54952ADDCD9CCBDA5B1A87DE598E8E9FC8E3CB6EB80141CDECAE9E78B3 Out = 5000ECA5A1F6A49378030D9EE805ACEF0CE949B3861EB92CC4C541507AFF4AAD368E7FE5 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 33221100000000000000000000000000 In = 5000ECA5A1F6A49378030D9EE805ACEF0CE949B3861EB92CC4C541507AFF4AAD368E7FE5 Out = E59E6F233BE0E0830483C6BD4E82F4C3C0C31FEB59D739BFE8CD96A7F3950E4C4C21D832 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 44332211000000000000000000000000 In = E59E6F233BE0E0830483C6BD4E82F4C3C0C31FEB59D739BFE8CD96A7F3950E4C4C21D832 Out = 01C7772FEB67516E13E1BE201F0CDE257A22160502BF1B7310153E0A5215D70D1FA5E0FB Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 55443322110000000000000000000000 In = 01C7772FEB67516E13E1BE201F0CDE257A22160502BF1B7310153E0A5215D70D1FA5E0FB Out = 457BD3FE9531EBF13FF98F965AFC1A07DB2431240FDD34D66A0F7457129A0A64C838EE03 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 Out = 27A7479BEFA1D476489F308CD4CFA6E2DDF8A1A57E330896A2F95DC70D59CB51A96E4B Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 11000000000000000000000000000000 In = 27A7479BEFA1D476489F308CD4CFA6E2DDF8A1A57E330896A2F95DC70D59CB51A96E4B Out = 88DFFC5A67617A54952ADDCD9CCBDA5B688EBB032ED9C4B2223944AE7626956A07577F Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 22110000000000000000000000000000 In = 88DFFC5A67617A54952ADDCD9CCBDA5B688EBB032ED9C4B2223944AE7626956A07577F Out = 5000ECA5A1F6A49378030D9EE805ACEF5B0B898816A7CFA9D40DFBE35A7314196D0F7F Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 33221100000000000000000000000000 In = 5000ECA5A1F6A49378030D9EE805ACEF5B0B898816A7CFA9D40DFBE35A7314196D0F7F Out = E59E6F233BE0E0830483C6BD4E82F4C341785B48E59353C2F55C05EFC6D6191A733D0C Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 44332211000000000000000000000000 In = E59E6F233BE0E0830483C6BD4E82F4C341785B48E59353C2F55C05EFC6D6191A733D0C Out = 01C7772FEB67516E13E1BE201F0CDE25667EBBE69DB9728C534B88083A8FFFBA758210 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 55443322110000000000000000000000 In = 01C7772FEB67516E13E1BE201F0CDE25667EBBE69DB9728C534B88083A8FFFBA758210 Out = 457BD3FE9531EBF13FF98F965AFC1A071762ABD95A529D51FDEE8137740857DE1CB7F8 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 Out = 27A7479BEFA1D476489F308CD4CFA6E203C64AD2FF46C204CB36123C1BDB4B7AA96E Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 11000000000000000000000000000000 In = 27A7479BEFA1D476489F308CD4CFA6E203C64AD2FF46C204CB36123C1BDB4B7AA96E Out = 88DFFC5A67617A54952ADDCD9CCBDA5B45D25600AE3AB369378816F303C5EAFFFA3F Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 22110000000000000000000000000000 In = 88DFFC5A67617A54952ADDCD9CCBDA5B45D25600AE3AB369378816F303C5EAFFFA3F Out = 5000ECA5A1F6A49378030D9EE805ACEFEC47348F3EF418D34398192B465806DAA025 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 33221100000000000000000000000000 In = 5000ECA5A1F6A49378030D9EE805ACEFEC47348F3EF418D34398192B465806DAA025 Out = E59E6F233BE0E0830483C6BD4E82F4C38EA0534B5DBFA3FF0467797E0179C1ECCC42 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 44332211000000000000000000000000 In = E59E6F233BE0E0830483C6BD4E82F4C38EA0534B5DBFA3FF0467797E0179C1ECCC42 Out = 01C7772FEB67516E13E1BE201F0CDE25DE3C95403C6C12F005CBE1216ACCA26A7CBD Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 55443322110000000000000000000000 In = 01C7772FEB67516E13E1BE201F0CDE25DE3C95403C6C12F005CBE1216ACCA26A7CBD Out = 457BD3FE9531EBF13FF98F965AFC1A0707A896D7C002150B23BC4C24C04593F730A7 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 Out = 27A7479BEFA1D476489F308CD4CFA6E2A3FCD5EA382FD25A6469DEA467377E2EA9 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 11000000000000000000000000000000 In = 27A7479BEFA1D476489F308CD4CFA6E2A3FCD5EA382FD25A6469DEA467377E2EA9 Out = 88DFFC5A67617A54952ADDCD9CCBDA5BF0D6EDC2AC04C62D728FA4AA7F83F136FD Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 22110000000000000000000000000000 In = 88DFFC5A67617A54952ADDCD9CCBDA5BF0D6EDC2AC04C62D728FA4AA7F83F136FD Out = 5000ECA5A1F6A49378030D9EE805ACEFD0F354CA0758FE61E62B6BF79404154D20 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 33221100000000000000000000000000 In = 5000ECA5A1F6A49378030D9EE805ACEFD0F354CA0758FE61E62B6BF79404154D20 Out = E59E6F233BE0E0830483C6BD4E82F4C3E5288DD1FC040837735A40B3BE8AF83C1D Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 44332211000000000000000000000000 In = E59E6F233BE0E0830483C6BD4E82F4C3E5288DD1FC040837735A40B3BE8AF83C1D Out = 01C7772FEB67516E13E1BE201F0CDE25C3ED2B1AB747C3BEDF68F3A293D2737222 Key = 2718281828459045235360287471352631415926535897932384626433832795 Nonce = 55443322110000000000000000000000 In = 01C7772FEB67516E13E1BE201F0CDE25C3ED2B1AB747C3BEDF68F3A293D2737222 Out = 457BD3FE9531EBF13FF98F965AFC1A07D308CACA9E8E9F86E104E47F5C60B703C8 [AES-256/XTS] Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = FF000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = 1C3B3A102F770386E4836C99E370CF9BEA00803F5E482357A4AE12D414A3E63B5D31E276F8FE4A8D66B317F9AC683F44680A86AC35ADFC3345BEFECB4BB188FD5776926C49A3095EB108FD1098BAEC70AAA66999A72A82F27D848B21D4A741B0C5CD4D5FFF9DAC89AEBA122961D03A757123E9870F8ACF1000020887891429CA2A3E7A7D7DF7B10355165C8B9A6D0A7DE8B062C4500DC4CD120C0F7418DAE3D0B5781C34803FA75421C790DFE1DE1834F280D7667B327F6C8CD7557E12AC3A0F93EC05C52E0493EF31A12D3D9260F79A289D6A379BC70C50841473D1A8CC81EC583E9645E07B8D9670655BA5BBCFECC6DC3966380AD8FECB17B6BA02469A020A84E18E8F84252070C13E9F1F289BE54FBC481457778F616015E1327A02B140F1505EB309326D68378F8374595C849D84F4C333EC4423885143CB47BD71C5EDAE9BE69A2FFECEB1BEC9DE244FBE15992B11B77C040F12BD8F6A975A44A0F90C29A9ABC3D4D893927284C58754CCE294529F8614DCD2ABA991925FEDC4AE74FFAC6E333B93EB4AFF0479DA9A410E4450E0DD7AE4C6E2910900575DA401FC07059F645E8B7E9BFDEF33943054FF84011493C27B3429EAEDB4ED5376441A77ED43851AD77F16F541DFD269D50D6A5F14FB0AAB1CBB4C1550BE97F7AB4066193C4CAA773DAD38014BD2092FA755C824BB5E54C4F36FFDA9FCEA70B9C6E693E148C151 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324 Out = 3A060A8CAD115A6F44572E3759E43C8F8832FEDC28A8E35B357B5CF3EDBEF788CAD8BFCB23 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 11000000000000000000000000000000 In = 3A060A8CAD115A6F44572E3759E43C8F8832FEDC28A8E35B357B5CF3EDBEF788CAD8BFCB23 Out = 6D1C78A8BAD91DB2924C507CCEDE835F5BADD157DA0AF55C98BBC28CF676F9FA61618FA696 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 22110000000000000000000000000000 In = 6D1C78A8BAD91DB2924C507CCEDE835F5BADD157DA0AF55C98BBC28CF676F9FA61618FA696 Out = 818E287A6B1168B124FDBBD730488FE1E25330B96BA54A950A51AB35A8461E5B9EDD4E72AA Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 33221100000000000000000000000000 In = 818E287A6B1168B124FDBBD730488FE1E25330B96BA54A950A51AB35A8461E5B9EDD4E72AA Out = 37AF0A0E7436B8C07A5AC8FC3C1007CF84366DB3978319DB9ACD3ADB8DDA164B209ABC2CB9 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 44332211000000000000000000000000 In = 37AF0A0E7436B8C07A5AC8FC3C1007CF84366DB3978319DB9ACD3ADB8DDA164B209ABC2CB9 Out = 6CF52A5E258BF080D9EF18301448061EC1A340F0B153C9028422D1F2DB83EE46A77C4C3BB1 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 55443322110000000000000000000000 In = 6CF52A5E258BF080D9EF18301448061EC1A340F0B153C9028422D1F2DB83EE46A77C4C3BB1 Out = 8245242C6A1CED243020B11D5DDE84199EBC07E90165554C6185F00D9350042525F0F259E3 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223 Out = 3A060A8CAD115A6F44572E3759E43C8F8F552508845701063BCE2A39F96FFDFCCAD8BFCB Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 11000000000000000000000000000000 In = 3A060A8CAD115A6F44572E3759E43C8F8F552508845701063BCE2A39F96FFDFCCAD8BFCB Out = 6D1C78A8BAD91DB2924C507CCEDE835FAAF397703650CFD664F0446344D35FF593CACFAE Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 22110000000000000000000000000000 In = 6D1C78A8BAD91DB2924C507CCEDE835FAAF397703650CFD664F0446344D35FF593CACFAE Out = 818E287A6B1168B124FDBBD730488FE117337F34591096E2BEF63932AC5F82A81462CC39 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 33221100000000000000000000000000 In = 818E287A6B1168B124FDBBD730488FE117337F34591096E2BEF63932AC5F82A81462CC39 Out = 37AF0A0E7436B8C07A5AC8FC3C1007CFCE294D5B61E003CBE1C1190B2436C9F267575578 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 44332211000000000000000000000000 In = 37AF0A0E7436B8C07A5AC8FC3C1007CFCE294D5B61E003CBE1C1190B2436C9F267575578 Out = 6CF52A5E258BF080D9EF18301448061E7504A2127E3EF31C3CF68C23E5C136763E32F96F Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 55443322110000000000000000000000 In = 6CF52A5E258BF080D9EF18301448061E7504A2127E3EF31C3CF68C23E5C136763E32F96F Out = 8245242C6A1CED243020B11D5DDE8419BEA9DF5569B16CE9D98E412BF2990EAB6614A200 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122 Out = 3A060A8CAD115A6F44572E3759E43C8F3A9C7A992A69177CAA7FEB093D4CB3C1CAD8BF Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 11000000000000000000000000000000 In = 3A060A8CAD115A6F44572E3759E43C8F3A9C7A992A69177CAA7FEB093D4CB3C1CAD8BF Out = 6D1C78A8BAD91DB2924C507CCEDE835FBE8377FB3155793E49B47ADEF4ADAEC58FB3CB Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 22110000000000000000000000000000 In = 6D1C78A8BAD91DB2924C507CCEDE835FBE8377FB3155793E49B47ADEF4ADAEC58FB3CB Out = 818E287A6B1168B124FDBBD730488FE199D1918615E54BD5F21AFD5F350A6AC4B135CD Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 33221100000000000000000000000000 In = 818E287A6B1168B124FDBBD730488FE199D1918615E54BD5F21AFD5F350A6AC4B135CD Out = 37AF0A0E7436B8C07A5AC8FC3C1007CFFD7223FDEE014F60C8C273F9221D7A8922570E Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 44332211000000000000000000000000 In = 37AF0A0E7436B8C07A5AC8FC3C1007CFFD7223FDEE014F60C8C273F9221D7A8922570E Out = 6CF52A5E258BF080D9EF18301448061EEC07582D787D2EC64E8C8BF8EE69BF7016EF0C Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 55443322110000000000000000000000 In = 6CF52A5E258BF080D9EF18301448061EEC07582D787D2EC64E8C8BF8EE69BF7016EF0C Out = 8245242C6A1CED243020B11D5DDE841903C49424D4D444F23B893CBCD26B6D4EF6885E Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021 Out = 3A060A8CAD115A6F44572E3759E43C8FCB1783BBA9A61375BCE3F6F8C0914DAECAD8 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 11000000000000000000000000000000 In = 3A060A8CAD115A6F44572E3759E43C8FCB1783BBA9A61375BCE3F6F8C0914DAECAD8 Out = 6D1C78A8BAD91DB2924C507CCEDE835F76233E917848CB1AAEE224FF8AE6F3F6887A Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 22110000000000000000000000000000 In = 6D1C78A8BAD91DB2924C507CCEDE835F76233E917848CB1AAEE224FF8AE6F3F6887A Out = 818E287A6B1168B124FDBBD730488FE15DDDFE24D6C4F97C9F930F9C527E7B15CE4E Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 33221100000000000000000000000000 In = 818E287A6B1168B124FDBBD730488FE15DDDFE24D6C4F97C9F930F9C527E7B15CE4E Out = 37AF0A0E7436B8C07A5AC8FC3C1007CFF904E371A7A59BD34C9A3DC636D6ADE123E9 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 44332211000000000000000000000000 In = 37AF0A0E7436B8C07A5AC8FC3C1007CFF904E371A7A59BD34C9A3DC636D6ADE123E9 Out = 6CF52A5E258BF080D9EF18301448061EAFEA108BC2CD25569599580348AD83AA56C6 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 55443322110000000000000000000000 In = 6CF52A5E258BF080D9EF18301448061EAFEA108BC2CD25569599580348AD83AA56C6 Out = 8245242C6A1CED243020B11D5DDE8419B844D25C4BD732A30C82E4F0237857F7CAC1 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 00000000000000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20 Out = 3A060A8CAD115A6F44572E3759E43C8FBF97C76A8CD21BE09A0D530FE188CC1ECA Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 11000000000000000000000000000000 In = 3A060A8CAD115A6F44572E3759E43C8FBF97C76A8CD21BE09A0D530FE188CC1ECA Out = 6D1C78A8BAD91DB2924C507CCEDE835FB4963EA5500367B0996D5725FB0279CE7B Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 22110000000000000000000000000000 In = 6D1C78A8BAD91DB2924C507CCEDE835FB4963EA5500367B0996D5725FB0279CE7B Out = 818E287A6B1168B124FDBBD730488FE1B259DDE3A512332C6F23A80AFF648EF799 Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 33221100000000000000000000000000 In = 818E287A6B1168B124FDBBD730488FE1B259DDE3A512332C6F23A80AFF648EF799 Out = 37AF0A0E7436B8C07A5AC8FC3C1007CFC03E12D003BB29D9814128E963D7163D5A Key = 27182818284590452353602874713526624977572470936999595749669676273141592653589793238462643383279502884197169399375105820974944592 Nonce = 44332211000000000000000000000000 In = 37AF0A0E7436B8C07A5AC8FC3C1007CFC03E12D003BB29D9814128E963D7163D5A Out = 6CF52A5E258BF080D9EF18301448061EBA65BBC63613F8E283AD5DE78AF9887760 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10 Out = 7F117752CC598A8B0D81D88AF9F9BEC8C3 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011 Out = D1F4418F240D4535734188CC83A52026C30C Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112 Out = 0DE2CDD2C2A5114AC78AACDEEF14638FC30CA8 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213 Out = A06CCD40F54385404CB839A1D668E151C30CA8F2 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011121314 Out = CDE828C3996137292AE21DAD65526B3FC30CA8F2ED Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415 Out = 75E8188BCCE59ADA939F57DE2CB9A489C30CA8F2ED57 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213141516 Out = 56403FD6ED03F69A2A95CA17B3B3D6C5C30CA8F2ED5730 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F1011121314151617 Out = 5708432F21D05AC571449A7A8F4E1089C30CA8F2ED57307E Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718 Out = 9ABC9FFB364D5AAEAA7849AE0A7349DEC30CA8F2ED57307EDC Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F10111213141516171819 Out = 1A7297CBA8C2992302DBA6F501F602ACC30CA8F2ED57307EDC87 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A Out = F21758C331F8E66678332E82F012A07DC30CA8F2ED57307EDC87E5 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B Out = 34F8F1C5597F1BE62565DA0CBDA946F7C30CA8F2ED57307EDC87E544 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Out = CF32C3DB8C72E063CC3AE59ED7C4A20FC30CA8F2ED57307EDC87E54486 Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D Out = F418C0D5ABE38D7D4FC79A9D51E9EFA0C30CA8F2ED57307EDC87E544867A Key = FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A0 Nonce = 9A785634120000000000000000000000 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E Out = 581EA1FEE5516AD432DDEBE75FD27C6FC30CA8F2ED57307EDC87E544867AC8 [Twofish/XTS] Key = 879AB1F37890ACE3AA1FF21EB403C2029E225E4B82CC00CD6377EBFDF6A313ED6152830450ABA4E5EED0055968E66C81BB6DF06BFA92910550819F0BCD3D484B Nonce = A5F270CDCB5D92FE5F19805AA93B7D13 In = 87527DDED4D4E85F8DB6D6D41EEAB39C1F Out = CACE1598319D84999709808780DFB741AB Key = 5A4FCBB13F344844058CF9687437C096E9C20239A7949F1D6D70CB32C5D70312D18C6B27235876876964DB679EF5CED2D70F106C05AE97D41BD464721765C371 Nonce = CBB7CE96ABD669FA96152049132EC6AE In = 69C6D85BB44D5B8758AC5E88DEFBEA0CB844 Out = FB492A194BB05CE9D28EC2AA195722C09506 Key = AEEDFFB4675F482BAB1350D3B9493636A0F6B4170DC850C85A87ABE5846A06347CCD26285095BE412BC7DE4E8E119CD422FDCE2C46C24777A0A4DE95181279EB Nonce = 2D251F7A24EECA0F700123AAAAA5EFA7 In = 23CC70A3559643E9C9401E8DFA6F008EEEDA8F Out = 73F9AF37A518D8AEFB2235169377AA701C4EB8 Key = B54A852A6CC321CC2BBF99504C540556E2E3C282D4D40F097E64623415B4218BF945B103E2C146FC27AF91548FF5820F290B31547D2B53A0268B1886C3D98E8B Nonce = D1B43C29AA040279E0E9BCADD74483FF In = 3293E3ACDA035B437F88F80F47A00C140148A52A Out = 0296B4C958FD6580F99A035BAAF87EA8B84C05CF Key = EDC17F6E1CF8F2BC275BBB35E53A178CCBBE2C8F9738A41A35D208660D5A7E8C1BC328EF7C77653A067F4F2A1FECEBDE4C2F8255F6506A8616AA528755D24F83 Nonce = 0FA23364740B89F399AA68F14B8529FA In = 239AA6B6496A1B17CAF7EBE841AD4D305F181D0E6D Out = CDFA4BBE476B7359BCC50CF17B70B32AEF87CD93D5 Key = 53F45699D43A9CCFAB5394935CE6B12A0A55B03E1E25EDD563DCC7C49CB364A0264400AA9D590E323AC79A1C6089A8BEFB3A174D0C648DF994E204FFFC7414C0 Nonce = 5EAEBABB5548E2C7EFEA4D0CD5797583 In = 730EBFD04725B43CB168EF773D588DACF67E5BED6D95 Out = C32B428F3F2B3414306A0834B58BC41D17BFAFAB27C0 Key = 8001E9D2179684224BFB8E427F90926CF2AD8AB9E52E6E9EDE9FE3728EF40DC655C805CDF8CA632D3E432255AD41B05013E33CA450251B96B157321E5EA8C1AC Nonce = 6D562A8DE34420965FAC9FAF45EF8E02 In = 8FD9A731CC0E7B316FEE1C6577FF931B392CF414518DAB Out = 0DA66DE3470E52CCC1D808EE0A1619C07163B4FA4FECBE Key = 0F151257A51F8CC61D52DF7C5A760E48974A74E7C8DCA5D7143DE3C1B676E64219B797C53930E2AAE570FF237AEDD9575E85DEA692B5CFE33AD7B31484EFCC5E Nonce = 65F157992CCA26529661CACE1273C0E7 In = 1204A2BA158F123A3EEFA21042F6AFD2045E87D92C31C2FF Out = 8E4CFF694676E7425FB42DFE77EEA7329A220517F94B1600 Key = 602AE17A8224EBBE7A6BC7FCD96EB32AE889DDC6BE690EE2BAB6A61CCCD84934097787103551C04ACCA31718F0999E578B0097D9D1B8C87A6F9DF6F9824DD9A4 Nonce = EE18423DBA1011F590090CD015651D95 In = 4089DD27BC860B16652704D7F4A9F76A02E0E1B672A7AC1CC7 Out = 060F3C7AEB4BD9EBA297C677DD55CF2235BE25AFC0C9E3B2F0 Key = CDCCF36103F76D5251267F0747FCD883CEB1E04D6A6279A9785FCD1F5017EA44E0C736484D36543F2A992C12767CAE20F5FC73EAFE0EB06F2BCEFDF8B2E9FF3F Nonce = FC9BF0B209F90435C99658E1FC6C94C5 In = BF8AE22A658F3ECC49C8CC43E35A5C36E0E60BB6C430435EDA6D Out = 2226BB0328F5AE872ABBEE02FF27BB60D976D8CB0F6E41833E2C Key = BF053E1B82F633A2CBB8D73AC717F114D56F10612A4BB96B102E4BD4A5A969F0D79AF23D3F42DD80592D372A9D63A58B825B098BA4B1E496710D4A7FEE9E15EC Nonce = F655CCF9AE1252B0244394BCD0D1A93D In = AD78007337C9ECA5F9789F0669B7FB280178F42D4EC87C07129D15 Out = 36E70177507DC786A179575CCE35D8EC85BA8BD331C69718EA13BA Key = 37AE23E7C14765CDA22D97C932EA602FF45D5EBD9C0B6892AA8CB8F41FE769A6C401974FE8B8DEC62F3DB31C8CFCED2701C6153BA0C850D581634F89B6B3979C Nonce = A202C063F41692F239E817140522EAD2 In = 4F585C2503E05A292529529B7B1B9900553A27D0B54EB7E311E69B4D Out = 7A13D1E088FD9D2D6BA28F2627A629A2D9899DFD74652A2EA85F3F84 Key = 26B1E4E72DF299E7ABEE82B7D7B0E726DADD522C38589DD8679328489EAB8B6CB89043B615331559EA181A2E2B5F7A854C20A6703C7E07B2D002D6143812EDBE Nonce = CCC952D38B9B7028EE1958102734CB56 In = D4B346483D1423EBF0C37CC02E012B71F942A93FF81600E7CBDF889C5A Out = 64D5A716381E079CA0D942DEC2CEC99E393B41B1FD7929B373F43F4348 Key = ED3749DDCC889F4C8ABBCA8052112B2CB8B92E4E407C1D54281A77499B6D806B3F908358AEE4B09A2809D31A2E27D5A3F419C4B2B282BD4EB084C7F926F739A5 Nonce = 34DD22F9ACB18CCE540C370B332E7FF3 In = 6E46752B60A968DA60CFB3D3676CEF16E3D5F79EEA8D16CD27CB5A38CD9B Out = 585DCAC0CAE15C1FAE99A282740259A7A55A45F4435A146CA5ACC433124D Key = 97E98A5FE136E1F8B339A8C1F1F826779D7DAF3FA346A0B2C5F84AF58CB9E4A75AC32645A021A4F3E2B35BACFB01C5D5CCC5AE530DB839AA53B426E2C33F6F04 Nonce = 423A6F53B3B3C42E1A4ECEBBF51084DE In = 47130CDB3F935DF1481644E3C658302E633D9D37A7F4710DED757E069F0596 Out = F303516195129D801F1DFC1DEECCEE47637149AC40233E40F43FA5CA6DA5EC Key = A9B5B5F8C41DBF50FC1F3D38B1D707CCC69A6F34D5549867C7C0A4C6A3DBBBE1C8D404CCC0B080F6E7897442460141D28C6622D67DB30010F59B49ABF1E9629D Nonce = D76612D0ED6EAFF8DAA44F020F31AF95 In = 600C9906025E0AD59334C97947099E0BB2A8459177D0DC40DDD7AE343FC68BC2 Out = 1D0128E8306E6300506221FCCF90895E537B9B520603920B06CD7699A9557DC9 Key = 93E92AC5C312CE90ECF68001F76839BA2ACC65C00FEA0EECE17614E2A6FE7EF49D4FC9FE7518AAA7BD8B634D0C8FC0D8EB4C7F0FE7A3D0F5FE1B3BAA0316D3AF Nonce = 28260B5DDAEF8184182DCC91B3E5DE82 In = 9CB7E4FF0A54B62ADAC4420C0DEAF248EA432A657445D35543329843723797C074 Out = E1B6FC1A2D707E6F174736104A6256385DBADE3117B9F3F53EDA77D5B93FAB1296 Key = 938CBEA21DEBFF288C30F528F1AFDE4AC5432D391B68C33F4C9035D0372CEC8ADE5019DA1EF46B3C5DA8C526A39665C2BC42075E992CFC50E855AD1A37CD3B2D Nonce = 4978AB021CFFB63DD7BE72FA36524B26 In = 94D5CF74985CF4504592242E956102237A467CB55B0095D58B95CF1FA9950106052D Out = D163461424F606B44ABB401D579F7F229FB5E33F7C816E39A1C32109DBAC2DD50074 Key = C6315E81D91E73BCD60B0C6F1F579472A9EC6196243046DCD06BE28152EE4765106516B43984CD0C0EB28A82E9AEA038EB0F0570D438CF95471725D667ADBAD9 Nonce = 0B15215597147F6DE6276713B264EE13 In = A4E829AE491058EA52F7AB7F21C77B72008DA696CBC474D1361BED9A000817EE89DFCB Out = B6832399C95AC21450224E04A1B7809EAD1AF6F70DE3FF64CB508200EBAAAF76047167 Key = B678F7F0A0EC4248D0FBDB133F38535E4DB45DD6C9A041B66E6968E16C2C55F26DE5CF535B952ABAAA920DA2FD792FCF9F7A66CBC4A1308E47E76568179FC929 Nonce = 96BD2E9E8DCC0172772762252F33183F In = E3F4F426006738DA72F7D9ADB5FB1CDB298056874C4653198F817F3C1214CAED6CEFE9FC Out = F41E10BCD2B6B8D663036FBFA9456DD4C4FEBC9F8E23CBCB128E08A492E683574A1C3806 Key = 12D98553D28D31725ED5B9E8543418EEF9F73F0143A2EBD877BD881BDF029C3A16D8A61B297166D04B82505D1111C600E79AF616770E5B66A68FDB09E95C169E Nonce = DC6B3F8FDF82A574D0E5462CC67453CF In = A12AC58A2DA1E8E46F2802EB33EFA0A9DC49270453E580319229795A0788AEFE063E6D4372 Out = 3C5A2787B8A4052815164BF3D479E4ED4D1CD69D98AADC18596ADA13C67713A48FFFFE9F90 Key = CF73972F2996A9B0C436425930F25E3EE12DA4287F42939493ECA8A63761F950A4E604F0128A739A0D3758FB5AE9338EFF5C76817C880C8011ADB7AB6EB6F24D Nonce = E72CB48562C4E43D4D2192E3F03F75DB In = D6589A4DB377CCAC9835C08F5080F3558ACD9694464CC398D9C7D64C27473D86A8498586A22B Out = C617C6954F649C12E23339000AA3EC4383CBC790A74FB33186ABD1E84B2051CE80BA2107402A Key = 70DBB4B28ED1F6A0C9B1E4179B77A40F12EE987ECC0B68525AFC21344E57B081414D3F4E48B23AC57BE687026A064DB122413178E11BE6D0AC831BEB78BF6DC1 Nonce = BB86043B9AA9A75A24BEADD4E6792DE8 In = F7992231422C1146A7B033F21487BFAE7AA87394EEBB89AB94040AB854A7449A52E8EBD10EF5D5 Out = AE28F8BDDBBC049D70CC0C963A946473B979E924EA333849365230952BE227FD04246FEC526C5F Key = DB8AEB4BD5DB4E720C6FE726B16A040EE94BA1D03707EEE67D23771BBCE0C3C3B9904692F44D6F9E0358E1AC7B77C7278D1DE30131BE74C8F9B5A3446BC637D2 Nonce = 39A651FF0499DFA59C6901A56FBC6A97 In = 2F5B06525F44BB2B66BB254C5B0BB32E3E4A0326D002799752AF95FEA3F26B00E23A098BAA48932D Out = 3CFC16EF31ED7BB13DF8DDDB6259223A1B4A3E5125564B9D53BDA6E3ABEE20C98E11AC62CBA200EB Key = 5DFFC1F875185ABBFA453384F30BFA9B16966D5FCDFB55138BF21A9D06F6F8C0636DF1E9700A785AD6327D553828D3BCD63653EAA4D1BBBFA8107A43227DECF2 Nonce = DBA11286EF4C39350DBEC5D2A933E26F In = B978223179B1129ADEABF71892901AE53D3F9938145C20FA1E203285F75A9F9105489E48BA79B7F45D Out = DB31E6F89ECD882B3DEA586CEFB19CA423C7AC3F17FCDCCA797D777EEEBC7D0BABD66EC813867F59CF Key = 80E54D88EBAEC574E103E4F25563FFDAF5E4D81220D9B85D3573806E03417F7086CBF1B166D0EE862A0A4EC490E6C6C5FC2F83CFB4181F41D0A453DC2F255F43 Nonce = 02FB920EC7B12B308979408F416BAB73 In = A9B3BF6928AA42B50A6682BAF9A8BB6D3B37910968C84A41E5B74B26B29542B9927A27DC9EE16A826018 Out = 062DD7B2794B999AF7D50FD542A94B7001531D679DA332AD48F27AEC8DECFE1B743DAD035D5DFC248DF0 Key = CF4B05B0B683646C40D1CF14F0250948C1DAB60E38772C223DE9D8D82B2BAF057FB970C6E3A46079AE2525DEA66A121431865B3FCDFEAFDD1D7B73B3E70FCE71 Nonce = E2A45BCA6618C4D926422BD2F564EAEB In = 0D8AE237538061D90E8F152615A97FE1D6F70313B1EE8DAEC98491529D64F4F3FA8C533693E8259396ABAD Out = 433B99CBA9752A78714124BA2A64F5A0D258F6686AFA54F2A60E80061EAF325FB5194F119EDDE9D35D347B Key = 7CCC358E0072A30AD111576C52B5995B952B3B5A9C51664A7260E180E5EE7556D3816E376E92EC67CEE44B2BDB16AE1377553F0BD7448C9E8F863D769182041A Nonce = BE2B67B1154A7B6963E3E0591421135C In = 2534EB81B8E5570D4A046B44B3B98FBA57B076E05C868086E1B8FCF70285D102488684BF1081123C0D31B9E0 Out = 409BC2D364AAFEE1A081EC84A86C6B1561F65E041CFE851A6176448ED7D2177CAD56556DF372C5EC6A5F4C8F Key = A8C5FC35D228348F7D3B4E829991D1D84101403791AD06C394492BEC0A370B02479E9C3F1B05D48B42C6A0E8F53FC042EA53308E003E0F1B5888AC8F561C3181 Nonce = DA9761496B6C239000EBD8ECC8B4FECF In = 4AC5B53CCB2D1EB7C06FC055F9F98D3BA2849733356F1DF0F8469136B76D0B284695DBC137EEDC3498A0EF11B9 Out = B532E2C54D766A7D1E52D9987423E3A91F73D15BAF7A9F48D7CECF2AB0BEA3F7318F1710125F994333C5B95E90 Key = 03A7C00B80FAB58206F8E259ACB9465DB03A4C9ABE7A441C6B773CBF0520C59798D4B869EB9E14960190968E1B2140ABBC6A33F96133371A963C48F92A05BC95 Nonce = A995B2989E68BD0F03630FE07F6995ED In = D520EBEC3DB3DD896EC62ABB73A83FA1C1737489027B899B6DF710E059C83C958308DE975C842135CA5CA47D8A31 Out = 0C1D35A0E30671AFD032C1077EA17AA3C27AE0E995FB2EA86C784E2C9F9F9814BE6A0082B0937734A8E920663893 Key = 90A1BD357146D7D0F4E5D667C5A0D714AB2B0B34F97B9C58664E695347A9A8458AF655F3C6CCF70B5145AFC4F7B783BB92EEA10ED0E187DBE595CA1803799A4C Nonce = 3A724BB5719BD11F993CA26AF712ADEB In = 44A109A07472C7B6FFC8E5722476F8FBE1FF51E054290EBA3CDAA59748E2E045D0254AD475EBC722E773A7B3D8E6E8 Out = 4ACE9B6C8433304C631B20D965EED18CEEFC51C20687C7EDDFDC2F40D301BD162177459D0491C6EB5D6069A1F787FF Key = FE6E413A1EBB13243B96E3FB6044B6E19101DB311FC854C946B5DC8A244D7B0368C8FCE9AA66AA3A569F391EF4037C9BF4C19A7BF403095FB1174710EEF9E076 Nonce = 8C8C7624D029E0BB9F8331496B8D7136 In = 3937B23B14007CE4ABB0327FCCFBC35A7ABB3D9B7F7E7DC8E4A0A170D3F3CFCBC6C02A7D3C39F664CAA88C7618F99C23 Out = 24FD61C5A38DC471B0A4F8C262AC142F2F927DCA9060534AB1D55AE0F4D1BB70EA3F96D6974128B8F687D4D13F414421 Key = AF358329646F289900BE6EBBDB412534186C0C3997E614C75476D0FB119C80AE42D53B0F295A2C15141D25F3063934E4EAAEBB50083CA2E905F5DC4209619DF5 Nonce = D5133470ECADC405613DEE0055E6B77A In = FF1573C198D24FB7A0691B8173820C23D2F84A471B1B925B67A74FE91A17C531750DA50749CD1920BC10E32833BBF0ACFA Out = F76D6A07E1960422CA8478517509BD11E68128DD59A4092DC1D10B09742F35E09142463439259C5A136DE33DBDCC3C509F Key = 2892CFF943237F9E73CE5941C7DE9E5214AEE06B5E578EF25B0D3345A7F0F0EC458A658F7F5AF65031D37A20D9B391AA8FB94B7713F347AC5AB5855A6542F0CB Nonce = BD1B84BB5053F74D228E2782598DD29A In = A2F02C43D4B9159A23135DA83941AD6793C58E41D1061C5E16B87F0678F6A2ACBC45FD6BD7B2E807F6E187B80D43A5EEF0CA Out = 54679F2C4A14C003D9B36DBB442FDBCC549A89F728AE045BF56A7F206C83BEF47386FB383571C588E18F1C4C363B954C4159 Key = 4FA106BC235B28235DB9AB979E7F71664A7C62F417A7330067299E705A76D61C0BF79EE9319B8C1FB71C2F2F37A0C7E024FC6FA17F56A38ACDF7C0FBACE5B292 Nonce = D18F1AD318C22E6C05912D9AEABBB2EA In = 243507D287EA4EAB58BD77518A0CE1B55E007C74CC7EE5056329B2B860CC055841AA7D331F16E262A96C2F8E994A28C0181ED9 Out = 4EC40146A26B8FCF4A3AADD1B3F6526C8B648913C77E96192BF447C070DFD9297A054B77FB461E821FFB092ADDE1189B69B6DB Key = 6D681CB65CA41C05CFEC4960F3F5F3F0298872A95D4F975C4B6851A44F8485BD89E0EA5C0ACFEF92DF354629D1853F965A8CE67E6C0B8A76909116895A80E852 Nonce = 815862ECF3B4887043C666145C0818C5 In = CFBC2873013B2B02FBD7CE364C76DD5F2D4654441EE3DCD9F94293BE51A8F8FB953EAD403476FE61E95B5741D3AD81DC7405AB52 Out = B6C66B387A0105C4265D156FBC893FDB474304D3EE08AF0FF97ABAF63088D6A2D7B9E3705E656EFF0F895C272121DEB9E2FFC36F Key = A6E4E6A72DA0E0FF1565D455602541F82E48FBD2A0C6890C33F260FB0AD7DE92A77813F5616126B361181AF76E5A6245AB51DC7B6EC07559872AECC439F0EA1C Nonce = 9AD3179B5C322FB487CFACEF57DBF199 In = 82DF1F023CCC985D6206C054B7615BFEDF24B2D1467A801A7871203BC685C0A3EC1C5632FC5FAE7124CE06CC3EB62FF6751730A611 Out = BF743E9F687258C81CFE899BFFA0B444F87E04C9C69448FD5344456CB895CF6109847A416F3DBEB36532D7A2C80D817287CF4E5ED5 Key = 0BF38567AF2104AC31773DA0F604B7D158739B09A0BF254A3B10A5CF5760B261945D8E97D4F69B76D518E811D5CA8E9B0254F6A25D622337CB8825CE13ABFF76 Nonce = 1BE92DAEB9F5905F079A53A2964A5508 In = 5C1AC7B74D982C05CEBC5F59344F0B93B9ECD91E5E37EAD7B12B85F1D2DAB7D22CC0DCB4B8D8D98EFE072992C511CADE440F908642C0 Out = 7B1DEEBA9C9FD78A1C89C2447B1F97ECDD6B79F0E2DA3476A9CDBAB386F17582B1AD23A7270754F3599A52EC24180B2CCAE1CC2C50EC Key = 241EA8D3BC2D33DF661568F4C44A34C4B0330DD870C70D6F685B90145BF31655F0AB4286DB11015BF85BA9DC9317B50AF5B277A1C1A39694CF6AE39CF61F68D0 Nonce = 853CE9548BC247D41B6F38646F973A6F In = BBE9F28370C9A996551C5C19212305774B87222CE6E1F6F99725F4FE8D4E840335C38C5590E11DBD94AC47FB7F62107D031ED419EFDE6B Out = 7F8F9B5C3C7F69B2A484ED8C064255113A923052BE94258E1BD84096310A354A27AF788DED9356966EFA62B0D4DD93F900D9DBA8FB400F Key = 515CF69DDE4E9F2B8C7265370EA11F1B676797F387A6A8A2294FD1B5BC7712E33D86BFBAA422AC1A9C5B547A863ADA9855F5FD46CEF9E5A7BD223D9AF88B7208 Nonce = 52CB2BA31794B8156F37B26C7B202090 In = DC7C88B45E65244DD6F8F3147B01E56D28B616368F0CBA229710A516D6C82390D1A7B43857C7F02AC24770A47EDC17A200199D1E9A275501 Out = 3321E398240903DBBB79A4AF2F5793DAFA07901E363FE4258F26D9642EC3F9CAC840C0795DC7B2E70FA5EDEBD2800ECEC8ADCA623E8AB35A Key = C45611B1632B0F5B5640607909B12F29F2C750B389FD497B53E2FA52DCE1F47AE3396301EB37A9939FC243F5C30DF986C713F4B9E008740FF647D7956E9040FB Nonce = 85CBFBD82D058BC24D6D4AE129D59199 In = 6848311D2BF4EB014DC70D6CA324E920531651E057E497FF16F92FEC1B34AACC547BA516C77BE2880EA2C47A6160784DF51E752B8198141C24 Out = 73C7312F7DC845D40D4ED52DCF54CC0DDCDFF58384421BDA6CA0FE40DA2BE106EEFC6B0C290003ECD311FCEE924C4B58F61A342E3E80C36A0A Key = 597457763DBC8FEB019C7C950FF2BBB4F912EA2878F7FB3CCDE8B5DDE3B52B9AE8CE8166257B905DD395E5BB095D2779802A0BE02935B5D702438699135416AB Nonce = 5D782A2E109AFEE2965393A90578289F In = 1AA23FE9ED1451366F7262376813FEFE5C0F9E6F1380D4FE1311E78E5820A43AF932181A7C7B1FA4DFDED6A45447FADC2D853DCEFDBA64CBEB56 Out = DA1680F7E9504E44239A8C2CE1F7D2DFB1F0A2DDFFEE822A9FEA7E66FA14A6E793A0ADAAD0529272BF5209D579542B5CED8D1EE2C38B762FE50D Key = F3CCC9182D83F5F87A49D704069266B2F72558C677AE71C45C16106E177AA8205DD6DF212B14462500171832E694C3F7D46FF6A552FFB3D824083FB6C9E79C4A Nonce = 5F6E60F9C0DFD3020FCF185ED4189461 In = A3915C3F91218D64FF9B56194D8CF0733C97BB297C08761A671E631F20F377F70088E5C9908F28F79573934050ED744576DDB1A20DC7C0B6D9E825 Out = 3AB87C3CD8EC19EC119E8900BCE7C12565A0BF5FC436B8A708687029E188D152FDA2FD5408DBBDD7C7FFCA86CB08ABFFA50261FCBD40BCC984874B Key = 3CDDFBB2D5225D35EC2581BE66082AFFBC8E9FF582F7D1FA3D1ADFD053CF4220E0D21F803B1A5CD0197E134D117AD04C1BEAABE446F3C62A9E1DC975BFFB3C86 Nonce = 679365EA67280B9E3A4C09806525972F In = 4E81F4349A7C9185352FF1FE57719049CE0254621C4C1AE4E5379C318F95AEBB9F3808BCD2366D5FF0FFDE14372B99D8C0E4E5C923CCF744F859162E Out = F6EFBECCEA54D5ACA2231864D991218312C56BCB326367F18D0F881F42D11E50D58D2EA2C005C716CE4E4B7BC9FFE6E2C929F56E16C5721EBA40F2AA Key = 3FA51F16A65294B2AE00B5C54A4F50B93B33C74B8A3E49BA1ABDD247B003F8318528C53203968C2031D447432EA0265053CA6CF68E3A8F24A2790E3FC5461AE6 Nonce = A2AA2FB62C3236218015F9C276744187 In = B85A036B83B7C4FF91CB7594570A26AFCFEBAC804B03D594F6B4AB5848B12D651E27945F7C618A94A4009D5D952F06CC900350F149C906275ACC6ED0F8 Out = C467DCA8030C15EB8FB854C7A7E94AAD6014E431AED39DE299A19A2029A5AB07089B030ED15C837618958C0C2DE842BB4F71AD46901F6C3D0DC543BE83 Key = FE57C8D7369A1FFF7187AE124FA873C732A4439623F53D5B3D14383BCD48A29C2B80F6A617F02407537A1809656CDB008989C44590C2B2299B608F5085BF1FE2 Nonce = 9D8D82534C5EA4FD304980B1382D54A9 In = 6612182A789ADD553AF5490542E4F86172E1E52230D68F2AA40411104CCBE58B4F5DEE2EAF0663DA6964E4BF96BEDD13D38477B1963E54F5F704ED46FB0E Out = 28F5EEB48A13E47C117C85F3FD66DF79FA6835F6633AEE6F02745CA6AD6395322F9702F174487825F577934D54EADB6EBDBEADDD708F831ECAA6C2AB5862 Key = AD3703990E0B3643EE0DC3AD77C1085E927E0F9A190CBDF3060681BE7E0B25E76AC7D43495CF5501C9513F8FCD22248A134A9DBD0295AD9674EEADCB149405C7 Nonce = E07166F0400A8ECEAFDD70E2ADFACE4D In = 4FAEAE77D04AD3E836759258F437F8978958E210E69DD8FA6919C0663D654FD4C58C4C59B1384469576ACA2420FC912696F0611AEA03297601E433125DF809 Out = 318BF89443B7348EB32F1DBABB5E1ADCCB436E3E353088740CE729E14BC6848CB08A602F53EE1F21FC03D868891A537B805E52B8B4979E03AB97746616ACAC Key = 99D6EEC22AD27ED24CC9FA9CEA3F5629F62CDC324984C068F6654266752870A9FAF5836B6AFD88ED3AF16D39295FF9629F23D0CCC7BC591058F51D52A70E4363 Nonce = E50E8FF77980A319D57FE313E8BF4A66 In = B94FF2E1D9BF4D42767047EC3FA55A84CC17C153E5B437B9668C8AA663B87B9778332DF1C7686850BB846205211DB4D6EFAF5F4A4648268E098D9C0B8B87016D Out = BD88EF97AC43746D688638FBBD64AB6AE61E40836B7847037507F67AA7DC00C1D1E2C09BB701933B94449DC952B146699157AC02D64F506DFEFB2A0A93DF8C3F Key = 251E92FDD914EAD37144154697D3CDC0E2165FAEEE4ACEA216154E83BACBAD25191A83BB8207F7B6C69618AF5C07DDD6A7F699F8EA6D3868DB38E2CD6E64392D Nonce = 664A67099997F33E28617EC42B758767 In = 8A7681D3D79C9AEE5501FBCF56F4FE95B97DEE4895C3353E5ECBEFACBEF0DB93D2B910671B60763CC7A7D3A4B8ECBC740E25BD06A8AC2D9243D0CA789E7680B423 Out = 90501B65D55AC072BF345C449F999BBB0869064B8370675AC97E23DB3F393E4DA98815A23AFAC4F94AD8F947090B6086441F6D394EFBB24845DCD941B98C17B170 Key = E405257B7EDBC4A3C23386FEC7C28FEFFEBB62A295F0150216A53D55B4AE3A4406BCE5AA211427C0E93E3FF196BB57B985CF5A5E96C925CC97B659B36C5978FA Nonce = B8A48894E3651832B555924C677351AF In = 1EFB114DC234795EA397ECEC44DCCA39B40D6AD3A109D86033CCC719A447A7C266D5D32E9A7EFD5A1DD29243B2C82A90DED0E847A42A03A31F58A9D6AF12B1E2B0A9 Out = 2517175AEA1CB6A6E8458CDF2F9C03BA342D3D2E393D1F4B0B38BA716EF89E4A9816E6D5B0CE76C9B578228BFEE1DC258CABF7B598A3AF03661AAE55DEE8D0B791EC Key = 8FB60ABB22FF4DC7CAC8564C615B91E02C9F2325DCD6AA9FD73842F1531B908FC26D98F5BE709509AE9BD49B405B92E735B1121FCF9AAE3D35EA3B53514F7797 Nonce = AB83433633A0BB1D893A3E4DD60EECA4 In = 4230874B7E9F676A87F3717BE8A10810262BC43CD63977978D433FCC74AC883E06E7FD2BD6DB3F7B967DEC732878E580E55BF49CFD2535794779DA4BAC5A49E1DE301F Out = E74F4C437EB7AC14D15D8622F471E85785BBBAB29E91EDD564E235ADE5558959D93497A2A7C77DC12B3179B48E2F972189B9A45E251B089A1FD390A8AB12D5B73530D0 Key = 4399B7D0A38243427C7289B3670464F8F98A073AD43625126FED9F58E0C8CCE9CE04BD0BE7227F7C49862126A4AD12B730BE3ADBD950568FCB1E35017062646E Nonce = 00FEDB8FD80D13375600B5A4BFDDD16E In = 234A9F7E4FCFB807030F2EBC22E8BF5B13F1ED9F18A9BE48D5FCACAAF5BF360A8FAF99FE464A7533F1D5F0CE9F769913E1A6D6F716C35FADEE60E2F0EC8DBBC2CD7B1D23 Out = BA562E05F090F443867B73995EC3944DB57AF5321B5970B0AC88416D3B385E0CCB8D2FC1E65B9561B05D2CEC32A42CA4C793F725FB974DF417DA440D0FDF77AAC109FCB5 Key = 68A7CEF97894ECE9C5209DDA624DB66B94AA787F754ABE48D8313F63B44CFDB16894E32322D3220C5AB95E4C41E1D92A2AC1BA241F9B37430D6C7157F618BFA8 Nonce = F7B37973DEFE48BB5D97AF65493FB2D2 In = 78EBA6537E61B5FB5E0AA23E846AD8A82D5A025EE33E2B41A10A33B3D959585C518AA13D44C22196A2EF155800C6A59F9835DEB84F4729D711DD67E9F904FA89EFFB4C4FD1 Out = EE67F816C0AD3D8463B2717F6BE5380E095635B1B7B012F7341FAEF8E0DD9378CBDAF39280717A6BC7BE899EE392ADC6AD8B51C22524E42B3201DAC4190DFE8AE930543DDA Key = 54868B0E7A3981DC9445B3E12CCD98E212E91BD49324C5E7D05EA30C3784F33B676AD02DA26B733047689B0F53120F10320AC713DC5A1CD8C1F3DDD981DB00A6 Nonce = 5C90CB0E56FA07471F9E5CC8011ACE2D In = 5214D5ABD972A93398C1B42F6F01D3E6EB2DA81F05B93E3C2205DC63633632AFC9C0E4D1FBDD06742194F0E0B4943F33DD3A00B8DD86EB9AD51B88E236567C2C8DEA51535DD9 Out = 5333EEAB97D891F648853CD99883A88E808427F9D55D3F9E13BD8406C61B34E9492B02C19886B87A5FBA82F09FD86452CF9168122D7D01A8FA8A6CB39F7BEDCB3DFE26007A3C Key = BBDA2A40751D51E4BFCEA4B3C182AC2EB0CF036DA11DA804B7BFBD6CD1A2EE70FCA18FF3E7D6284B9E129664095D095DF425263E2249BD0CBFC7F9923D80FCBE Nonce = 0C049895133FFA08C805833D527A1C17 In = 06C8226B0B8371FB2273BA54100CA17D21C0731D136F75D1AD265C578137F47462805C80BE97601DA8CAEC4424959FBD36E22EB4111E414D92B4E87D450BD26A6F99ADE217E4BC Out = 239C95E80E86CE6D2E4418470D0E6A8B0FB31DBC62C525055A73E4F1CBD3649B652CAA386798A60BC8FCE0F8DA943EAA8049DC99C70D95C5864DCBFF171C0D922E95B6F6B6978C Key = ADC43AC858C693FDE13E931DF4EF45455A337805456DDFA82C5FA473652182BD013B906D6DF6453D5534C303CEDD067AABFBF76EB4240AA5B117122777DE8883 Nonce = C3614FD41E162C520FBCB77AB47DF3F4 In = 2CFF692A648482BA14A363BE84AFDE0F16C144DC2963804F78FF968EFCD6D88B4395A1EE7920608D09A245FEC4ED81CE208046F84D230E1679FF0ABE17C54D6F32D0E72AD9672DFC Out = 7EE68A642B84F28DBA809F5C28E250D3942DA8FA013C7C6D0A917720764BBE25AC943041E47BC27E54E3BCBD97414679F75C3CFD6C9D5FE700E1D6721ABDEA30472920AED086D76E Key = 59278088106408777F2CD7793C7D50105027126DED275EFD465DB3DD9D68DA47C22EFDAD216E508481B1467E08B934571E1C59E2EA60358423091972D62CD128 Nonce = D83A06D830FD4DF061F8D266158CB912 In = 8A80B592D33E545DB579B8DCB75B1BD90ED588A3E924F91544E34837D36AF75F6BA032D5C4933947AD375E76C6341738EF027320AEE95DDB6A13C187BE064A935D58756D100CCCE6BD Out = 357BAA66BA0464C001C1125D4F641DC9438E8EE56AAFD04C6F37F1EE70B5FD8EAF364A1740A32E8D0D2ED3025C2C6A17928C9408456F3B5A784B1F0D0897B3105F21FC5D57C929A730 Key = DA93A3852F02F7366D9643C1B576678DFE78161B6DAE9D8F20B6CD75D51E9709493E76F87D0C6A11C8BCE3378F058C44A9A440A5FBC60DBBBF5217A53671E5CF Nonce = 1C4A77AE23392121FFC99E9851A197A3 In = 059ED050E8D00B3D602B6AACE7D46745CD4A38FD6A870FC77A81FE909A86FA3D955BD763C644DD5B9D70B0D41EE1BD09ED91794758FDA6E9B547A3E7C68B7456B4A680D673A5D82D2D45 Out = 11DB33755520F3C54733FD6F413899807A4D6755B140E50D8C73AA067CB94ACE55DFDEA22C576B3373290C50D2FA8C946DC27377D69E6CF65D6FB02EAA00A79B3B40DF79BF43723EE613 Key = 82D21F701895EEAC47E72866E78AEF8A3D0199F250027225F33F5A4A5CE62AECE808B34F8C9948B0E9740FC9649E7AD11D66DE12025B05FD60990E0976FDF0BB Nonce = 517117640B8C35E5172D3F968467FDAF In = B5F5508E02190B1467FCB3B07FD1D475DDD3EA124169D31AD0DFCC0E245734B34839AD37C0B204363E62F922F31CEA7C588E576B7CF5482C7F95DA81F2C26D17E7169D52462B3BAF4E9690 Out = D63A3673F958971842DB40A48D5BCF20B1C02065750A30990915B2F95F131BC304FC3D9BB330F6B10606FF1B308E46050EC2252414E439A97E13F50348C6B789044D579765CE58F8B7DF4A Key = 7C969F67ACFFFA400E8FB8ACFE15FFB497C7568111745AA3B25347859309389004DF1E681FC2D20293C52CF26694B00BFAB0AA144980942A8B40A96943180E12 Nonce = 45F487446077B94F9A60FBB4BFD193ED In = D271157E98D0C9F8CCD732C971DA382ACB196240C3BC619DF0F50A5C0962C834E5F8A3DD1A9B1B7CE5606B0D70BAC6B706F720D850E8CDFE701EB760FECF73A003A89FD176DE7839A8E35511 Out = EAEFBF1F37F585CBC6BA595CA7CBE2549A80A42CD24C0DBEF325ACBD3FEC55F772F42DF254F75AF75E8288F38CA6A0ED420947C8526B0FCA42FCAB2F1C72400FD57958C6E459B8A2040713F7 Key = A16A48F88A94FF148D8CE7DFCC6165850FBDC2D218C4D7B5F3158B6D1E82DFA0968C72F6D92635C9951939ED0C001700EA386D5F603270FA8F71EF1ADC700E76 Nonce = 6F229479AE496EC175A4B6E2B0D15269 In = BDA47D56B2ED81452387B0720C5C8F03894DA74C549E74974897E50C717C4195A328B9B1E765D227F207BF556FECC2B8B291FB83E925901CD7DFC71C70CAB13CC285D880E823C0E7A638B71BE5 Out = ECDB5001C85CE86347836423724D92666FF5D9853D75CC2CB185A5D3F7F7AAE94BEFA01F0757E62C66AE8E37F53E9902931FF053A799C7866B5CEE5C37D468BF6CFE040D9E2546107C50425901 Key = 5A4930305D8D82633AD8DA1766AEA6637B75620AD0BA8AFDD56A9C5E16EA1706AF396F41A95FC6028AF36876D9BF447BBDAFC53B172358FFAB3F56CEDF1B9F8E Nonce = F726778E94B38938C9812EBEEDFB0B03 In = 5CCACDF79AE2401653C5F849D4CF93E906F0087E0B22789F3984D244E1EBE94A9BA7200364AFBAC2577513ECF320CB80767A5776CCAF2614B73689910CDBD481E272293121F4874702BDF186FE83 Out = F649D325261C63B0A0FDE9423F5946B42607691159B363C8617E96CD9604F3B216C0524DFDEA001392CEE80EE08171EF0743E3F1D1A43601D3A74D06E162507406DFFC75436E7579D2A821B2A0EC Key = DC5B30C8D64DC4660AC3C12FEAB3DAADFDB32D6933704DC99EAD9D767437655750A92F0946366591427B44A9D0B85C775C5AC84AA8F046E90997722D16B8C5D7 Nonce = 6519A204A9F70C512C7BAA559D33A144 In = 74369DE551FA1B9E11CDBAE0B6BA6001186651EF911FBB16057C407BB41B0CB8A41561A6F27DB865669D388CD3ED5D973EFD9C419B1C57F7783E96032313160D4CDA67FB780A8E3D3D050AA5F9A367 Out = E6FC9552C33EC021204A1130420D235A486200073044D81432D11425C23499734CF3C50E1A984CE551F8CDAD58A78CC912D1AC1AD7995E2D90B7DB1F6573CF3DBD69F0CE83802AB3AE158B5E840FC6 Key = 682BF9DD19D9AB5EA5AA153FEDAC8A39E7D00068A45E2284B7A8D79F10A773B957768A3EA33ECFE9125B8A895A8822E94345909F88E32A244A2BAD6A5A5164DB Nonce = D894D0F08227AEEBF9C3E0B57A8D4820 In = 084222CF351556DA67ECA0573C732D6644276417B4E354DCC2D95558793D39A6CD88E30D1B6498E259645B6BC96402124A1431CE496F3886DCE89C254B5F77728DBB5B00EE2F72C43BCAD6DF403BE005 Out = 8C2CB2FFAA5EE3698F3F6A6F643E353F15BC289A6ABD49F80CB182E486DC5459B9FB200EB999C183DB0FB73F7F56612635368DF4B0ED15CD3F66AB25F8D1F50D667062231D117A6E47333A51EDF0899F Key = 26CB295FDFE6C6F5BDFEDCF54364F0462BB05F4350DF3405EFDDFF3C4D1513103FC9785FD4EC4635EAD09BCF481AFCAA0B3CDF3399876B8E95BC000D7CEBC853 Nonce = 6AAF5CC4BEEAD2DD0FBE36B28ED921DF In = 69C47340932A673CE1C038C2BBF7552800E0913B3A259633D6F1AB794B87A8E83ED88AA3B2A3C97E431316CACE38436B662F83AE7A1A3E967F4F88ADAC5B5573680CC16700CE54DFDEDD0566590E743C0A Out = BAC98D139459EDE20320F344A88DF6630F7CA91379AC5E5412A62350A7842B637A4E7CF2CAB9D57C072E2427E3DEA7115BA201C57931181EE3E6FEC90216B2213B309A477DF138D65B10FDA75B3E87052A Key = 6F7EB9C437872599AC225B81AF4D3E0A756879FC1E28F1C73682CC1029006B1EBD44A387B61D902FE074D6A3DE3638C00F5FA5BC208691AEDE541CA0D391DBDB Nonce = 1A44D89FDC6ACE155B4BFE243F10DE8E In = 831B7700CDA1CABED51C0F73429620EC1B4E4FD0A06F15A1836C9248B7009E2F2F3BFF094B8DDE74C18AA00EA7E9439406B93F8394CDCC2226788A50D46050CC060AE597B8D35A5039999477F260D06A25D8 Out = C74592FBB612709C89DB77770295EAA61366D18FFF8066321EFDA8C6621111327FEBBB648516F0A29C918AF6F071D22BAC307ED5B718EA614A2E6B7CF4CD7544E6D674B4F5B6C46A60DE5EA2CFA6C7DEE23E Key = 706B6A96E33936778E1BD03F76670296DACA70F85C5927562A871DF2BD72FAE201F4649E170EF53B3D1CBFDD8A5837DCAB2B696888DE28915A05A42B06A205B9 Nonce = 9AE3D26ADCF9942E551B8C4507502DA3 In = 33789651D5555B1E0471B658F4F27FDD7AECDC0689C6E7264A16686A36298AD575796787C2583E1C2A0014CC7E919D7B8353CF17A757E7CA6453ACCF4D7C308B8028BBADB91A77025E70C649FC2C04F83CD40D Out = 2F2F1BB3237E681B358610182AA49093FC5949D1F56184B73C449E9C4A7B49DEF117EF4EB4470742B641A5015C394E0DCFCDC615CDFB611D793E33594E8702B8F10390EA8EB88C8A6BD800C599F4E51754E287 Key = 04A04947CF609691B147C8E066919D66213DD476F7AB32CF7A0E8AB1BAAD345654567CCECF2F047EC9D231BD6F10FDE57E9BFAE2B49C83275346237C84597DE6 Nonce = AE5685B285A841416C31F15143C0C59D In = EC92A03B6BEB1ED3778FE286D67218F04B08A5D959650F4E71903395E03EA0E0E8D4CD71239B11B76175124E12B02FA9BCB4FE8FE1059FF52A8ADF55EFF45DB5122C4ECC491112CB322577357572755BBAB6641E Out = 17A3482630F3F60ABDA71B0E5393927AC76DAD8A4E682040CFD11BBA17F886BFE7017783962B9ADDC48C19B4BBB4DEE2587C88AE14AB8D177494E7FEF799B57644A141AEC0EF5F94D0DAFED9F3FB52F3AE0ECE14 Key = 750E96CC7ACC6D0C1DA571E789A06C6DE785C8EECF85D8A0E603368FA5CD85AD1ABA7F2E637324E5049D4C4AB34755AB1107232223CA6EC5DD79EA8B97910CA6 Nonce = 6C5ABD43FC283BBC97F077A652EF5E81 In = CEF0348281F329EF6DF71DFE854E53586FD4B45285C4CB43A53C3DC9D50E60FB61E1672BFFEB8583D347094456BC36D7BBF7DF768B3D5BD3BA6E776DDB1A3DCEC5FB7D141412310D0E351FD48EABC2AA3BE8C8B0C2 Out = 3F69A54E80D8B2AF5D85AF0347A64ABFC4482F41BEF98130757E48181EA41F7A51D4BEF271B689AA66BC05AF745F9E85812C5093190DFF5B68C2C5623898AD604094DC589A1875C29605B92524EEFBC86E2016982E Key = D9998134F50ACBD6A3420AB7A4FCDCDF88C23F16DB056E96100864FDAECB8137748145886DA377A655A24C4164DFA69DE49A656396B3FF2288B912BCC755E0AD Nonce = 0979C201CC8303344E382C4C569D031E In = 82EAB935704E1FB44EB9218DF21EFEEDFD13B43B4014F03C9CD455E32585115804A0ADFD1CD1D8E77439B355645807EA1C3D16187F6F64EBAF06EB653CFDCA86950F26E92B284EF33AB0F8AC41324D0908DFEF079E6C Out = 34B61080088B2E6DCEAD63C9862F7544CA06B8D79F5A7F646663D040EF680D8930521D1B0A798601365294B22C46F61EF120BBF9579FB9078E0194488CAB18B2DDB299C062541EE99F0DAC83E33264B5333DB8542178 Key = 9D9BBEAC0A2C8E4795E73B510DD55CD2E720F0D1E9D0118E6FF630C7C601922DD977CF0E2730FCD5E2D8A4BEAB437EE498B957E1CC828B59F66BE4BB60D3B264 Nonce = A5F56DB37AEDE6718159969D08165A76 In = 67FED42EF9AE9A0046C28BC51197B0E2E545C60506D2109CB2F6D7F6BFB638F77FD2AB8D53927EF279C71D7BC04AEA3D39EB5698CEF1CE0E57F91D8496D001B8A2F077EE7F7CE7B687D7091242435B6576D4CBEAC7B03A Out = 52BFACAAA8D0DC7725BF5435AB9260B2F7F073CD82A9491497154BA49F86C821AEE98D6D8D8EB83C26349C0E9DC96CA898BFA28EEE52E5531267E7CE660FBD88BA22F8A493435ED4C2F4486F064EC202BF76926C674723 Key = 294BE26313DB83B29C4B8D9C73CAB785B355720988387D5B228797B4DFD9605B115F97EF2D995CEC01600B7CFAB6A52091413D59575A2C2B9F51A287C77CD824 Nonce = 091E39C65CFBE2F0AD505FF4ED63D143 In = D72987295C9A5D94E9886D46B87C7143D092492C63EC64C3E21965E8CCDAD257DCF359330F96AB8B833FB25913B887636B9577F8B2101BC53409B8F6BB504FE62920242ED521B9A718AFEF485C1E62862FA83F8E28E91BF1 Out = DF342A4DD0BAA08CC0E18947B87EBDEEBCA73020CAA453EA3E84E797101D9057865949B7DEC30CE8BE48A5B5B5E833732F1A8949EAE503EB4D2C443E1C5856E4C952ECCBA6AAB538D30E53733CA522B8486D545DCCD7FCCD Key = 851867621DD8F9DF3FA677494C2CB7DAC785F0ED8CF176BF08522D765408E42CF01504CA8A93D38131F26A3AFFB3090312D60EB378D56AF2A06C271B7210A492 Nonce = 09E2389F3E337DCBB665CA5C34D4B46B In = D341BCA45D3074B2B3FAED471D5317ADA625531F74A8A873DFD7BB369827466D623E5B43387AB0119634727C4602B35E0DF357186979827FF5A683AD3F21974B104F59416EA0317F911416373328DC9899ACE1B9E83D62E66D Out = 012F2A625D71B3134F02C097BB85CC5C51A58CCD1B99D95EC008E5A055B6E0962AF2A560FED8948C72AE2E63CFC76D8AFAE95AE849B2C3BD43B168915025786870DD16DA61B8E0EFF025DD0E68AF89F26067F1DF6B0A81310D Key = AE3DB29FD329B622362FF2A2C42E9728E2375896A4C157E45779E6E0A0DB280DB9DDD0052B64190F7A7A9C00F5ABBC58402FDA12137833352CD9CACC6CDA09A8 Nonce = 21AB5C631123C94F3BDE4A60B9F7E4B4 In = 8A243340AD7968077509BD363266DB666623A4E1BBD2DAAB6DAC8521971D0E93247ADE3D67AF23831EAAFC9403FC4AFE839A6CC9216B51568D3D264956372401F7170B5FBFC0A8CB77706C9E35E6F80A6CB72063019379A4C235 Out = 18706F504AD99D5B571FB0F6F31F5500A1EB7D46D766601E32E6FC45C094EE5A6A1B8F7D10945E841428141A011FE3705AF7D4DAFDDE51414196547E0723314095D2D221A57BAEE5AD50E4DBB5AA09100B0DA8D2278474050D66 Key = 67748D70D9D72E6AFB14C2819302D08EA6F1F23EC8ED0B75E03D03BBFF0C6534B6F0F5E50B8707E88B188D60529360026CF4BBB803E725B602F3E8C29EDDEFD9 Nonce = C8AEE1890BC2ABFA6EBFF88BD0AB56ED In = EB1624A74A857410F3538673C4D2DAC096F5CB949189984EE11848E784CFCE39E96F60B8B899B647147D41C042E15F8250DE0E1F452F85E646B83D690A5B89A527ED998CFD4C3781CDFC812811ACFAE0F1425E87488634F8C474E6 Out = 351D90C548894DCF668AA88041F06921F4B46907C250DFC69188C10A349CFAB6F2659DE30D446CC95119B73FD8971BCB19C25870BBB8EA51D6FD956EF9F48EB8428AAF3EEEE5C81BE2660EFF821578B99FF23C84A7611812B40282 Key = 7F807212FB82AA3373035BCF85E1CF33992C660A3AC0973A42D8A772F5B773E79E9FF4AE2AEAD3B09F69415237DB31F4A33EB45DA361C95281BAF1964A791740 Nonce = 3DC98DD398E67B7F91F55697332D8BBD In = 629181624FF121CDEF99AC7DFB9F702FB449DE66D55EE3502CE7FAF173FAD1677F5FACDC888D91848F2786405FADB0CA680D1F94491690DE4CDF83EAD2173557532B004C7D9922AD49183CFB0267D5AEBB57CFA0BC2955B38CD03C98 Out = BF0F45F87DADDF20472BC84B0D7D3E9EDB92E26B5DE9CC43450ACBA61B3F9375B04F507C6DA921CC84C77FFB221BCBCAD69D57E340ACE5638F734B95C0DC439058B294A62E7FA80A5EE46427642925DA4572B8B9E6A776651CC35F61 Key = FBDB72BF24E41373E79167E690C63CA97B8E6E192BF257104548D0CD1FE75AB97B0F3C5AC6ED97B29D50D1DD50EA0D6999DF74A5F172FDDFC1AEF170BFBF19B2 Nonce = DCE436B817B5ED491A1A20E507D73F98 In = 9C09CB230F1BA4DCD7272B14661E7CD5A6C0C5B7FF3BD0BE7BC76BC6149871AF4B5F2A0C4206B9D1EF68EB0F7E162105B7D50AE986990458C0721C9C9B8B3344D232B393C0000C37CA01D6B9B854F49FE3CDBFD98BDAEA96018EAA0F96 Out = DDDEEF2D8A91835CAF279FB19AE5B0F73DCB79F20FAD9129E50DE85EC29398DDF5F9DC74DD5B14A96C98F35CCADBDE84FF574A974969E6904648F0D07AFDD36DAE2B2F205E25CA3B083456F5B332D45C69E9CCD96F88B90806BB3DA79E Key = F7F61A9D1BAC2441D899552BCFBACC6420A8BABD2D9F2380BB74872E7243EF64FB72185FD13B6B8D452AF2F59E7511662D2AC085B870B092138CD8625D3C54EA Nonce = C2E32CD00AAFD581B8FD1E5B0768144F In = 1B243FD52E890B65E47EF25CA9569A37F64869FB300A11EFBA3D04410DF1BB175B60A70F3255F45F8601EC2F9AF009D40C4D72E1BD295F9DA1C83B6D5130603389E009064901300ADC5665B3BA2F62AC28E7C81E2319361FB4F2120C2C42 Out = 19464437BE6486CDF6F24A75A229E59B08A640B66C41687B1246A84EA6F98FE1ABA9AD430BE7D068D9BC59CB5DEB99EF69103A960D3C4E3CAF9DC3FCBB6FB61F7F618901E6885842BB8784DA1F4F27C6E951B5304EF257470E6375D92527 Key = 5C8934050FE41218671234025E0A587E127ACDCAA0838D44BBFC877F719FFB9C27F82D0DC83DF3FBEA9E18071D5FA9997A10B008C77C316327DF58BE6A5F868A Nonce = 5BE1AAFCE2071159446CEA40C0A49F72 In = DFAC82EC8594B2E18CB607ACE5557D42E458EDDC939014A0A6060DDCC862EAB6686E00093965DA2B9E5BE49E2ADA0D5568C0485F778F079B1CD732575ADC5A2997BBA8DBB4BA84554B82434EEC14AE917C893F18BE69B02BE06F7822B90C0B Out = B7B20B0D001B18707A5E2D9C99DC0A0A7AB212B80E39F04F00B9BF8CA3FFEB05EEB3B227FEEC1C8F5B1CAA66F4A34CDC3E63758C32CECCBCC94B075719F7327CFC119DB7F19F598A9E607AE1A05F6EE6E19325B61BD5EA4D2B7F492106B4F5 Key = 56D33F5BDDAF8A57724F7E6447D1475D16D413F38D3F363837A148F987550695EDBE2E27E40D37822E2333854DD887A533F643135E3FE431A05DAE1633829EEE Nonce = EBFEF8C3C762AAEC0639862FF14FBFD2 In = 30975F60F936909D5E92EB5246D966ADC490D89F3E332C4157C7C69A3ED6C826EF3920B7183352CBE3B43CB88BF14BE089A09EF80BA23C609F2BB74B0DB695673B7EB758DD32DAC570F25EAB735996A8AD74006AF2FF13D8193F16280D41F71D Out = BBB0A917F466E47943E5AD9F13D0A964A511FBE04C51487F8DB4AC86B80E47931787EB009974C270E9CC1752D116E8F89F6F8F181C636D106FB32C9AC07DBB66D8ED8A482C998158924AD52814F14B8DE53EE8F262C7B1DFBFF8A02D6877D760 Key = C3C463811FD88AE0A7E63B73383ED92FC6D1D86D8B37BF9F24F54E6FE73096DA2175B4DB6A37A3CA7DDDD25E0C56C4D2E98A1DD4CEB26649BFB50EC4FD40AF99 Nonce = AA54208D82C19213B61C3E6C9EFAE74A In = 75CBC9C2193E6D6C05D1442542B93D4DA1060F73069429D4B163B37CDA9C68DAEE7EB478E0D13E1BB875D736ED6D827A9260FFCA15CDC7751B30DC9CCEA58EAF39C4A2E663C2F7868E0AE87320604DEDF77D077D980948E29CD9297ACEFDBC347A Out = A01AD8C32A56A58751CED48857DF006CE408266EC348D97489D86BD41F218F922E2934C82110EE355D9AA46D9E72C914A6596311CE3D6BA1A156141237D86B452FC89D47103E2AB79CA7B808799FFF771431E667418810B4385F07BD73055E64FC Key = D9DA279E61E7D511786DDCA2BDFD285C9DD7739FD35D4EB4D89A686757005B3FF28C7F5F3CA3DB02F104A8FB59B14F3008D6040AF9C8C7AC5CDE9626BEBE8402 Nonce = 2049B5853574A6EABFFEF270C437550D In = A5B814CBF93E5DD0D4EFD2C2697ACA8031350C6C0CBD4A7FEF33C51B95CB4A0E28AC2C84A918BED457BE10BFD63381D316A25E13BDE0E79DAC0CC1943A11E6EE11978E5F9AC7B108AF3548CC3803F26B2CBF3A80D02E4B5FD5B54742CDAD153EB3E5 Out = 64A63A3CD77B0AD9599078847A582F39571BE1AAD402A3EDFAB7BA1133B1A9AFB2F49C0ED992210CC563CD6940DB34D46EEB1F38989937A9C92B89E9E58484933201A3208E526CECB6E89941AE5EFAA0173A3DBAFF77B4437449F1C9E14D17261048 Key = E015CB4B3E1B95D4EF72910B9562CBE27915F3C5E46C76BB24BD54D9B72A87A8B9051830D658DA4B21522AC9AAAF2B7E0C2FCA4EF907EC5F6F91CC6D78752118 Nonce = 1695DCF0E5AC925C8013914969DD68AC In = 26C813AB4457B48360A7A29D4B0FE64C67CD5D119096D2D44FD0A2515FA348626817CB4A039A9D707C717061545B4BBD630E9F5338E3B970E10E063C8BD933429A0F9F8D9CD31C55B090D68C99D0384282AAC273E197ADCB42587EBDF600D321C29293 Out = E9D3E28823341923F6F1909D70E4F0D032AAF6A2C93D8AE9FE28AA26700B41BF1B1BE7820F177D21F59FDC1702D149C6237B9F101A1B268AD617DAFA91356DB4526FF9992F015B219C6019AE4F2F739FFA3EA558C78AE66612BEA6F8448A3E7319C597 Key = 5E48FFFEBD528D21913555E3B68BCED994B23347A9FB7BAD69CAA3F920C08D0C126EB5137A7AF1C50538F83DB3F1AB8EB600032514A5C1D301C3D4971FB59B26 Nonce = 8423EEBCB184EC59ACFFB5A2A112B373 In = F0E6108D8F632FE6824A56993FB7FFD02E02B57BD0CC18AA9F62B06C2F5F8AE146A5095A9793D49187BCA5B15B44B9EE97EB232D372E03E5EB3668D1A832723BBBB1EE7798BDFA223B5B637758FC337A7A536C33365039748DA998AB12212C4DC4D2F784 Out = F5960BA1E179155964114C194B78402E3E8198C6B4B82DAB7F99811541BFC101F9FE56BE611E9D6AB98CF3CBBBE0AD9E5D139C1A0EAB0B6BC5B050528C9B888D0E78B1622192189105D44350895959DDF4CB71F8CCCB75762201C1BFDD55343598F5D483 Key = A218FA2FA0B5EF6714C067DDE8A65EB1A93FE5F814736407A93054622EB305B0C8377FFECE049B7B37587083376FFDC5A2CAC4B2FC3E057AC83DC06C66196943 Nonce = 7501AF345711B4C4A22B5C98D3F4F40D In = 5DEFAEDB9EFD565E940C8FFC884B57EBCFEB9970DF117FED5D06ECDAF771AC7D9D18E5527759F3953A365EB030B5A059F28D07F551B405932F62B1EF443418882E893FF9B7C798F9F5942B383CD67538E421FFEB75E5743F23CBCCF2719BCD99E72393CA6A Out = 8967A3CA68A3F87FAD0A43752F3CF19127F5D67C5AA3F69DF5F60E1C9232AFC0F2C7670C815DEB04147311C90AA57D5E1AAF521F174076891C82C5EB5028C3F9A11390008B6C8D15E26C6B877AD50E88228C2059A3F915EF0AC7CB9A46F3D84E03D91D04F9 Key = B32E9B7D7C1B73EFE7F06EEF09678BCCB2079A79A5514A59C2C6C72C874AEAEAD7A8D8F1554E216AA3B78C2F6CDEC896DB75FE1A6793CA6D395C39E44572D546 Nonce = 30EBB2CFF6430058EDF5C8CF536257AF In = 26E571A17404F047BCDDAFF7C4B2D2FD401D48CB817B0D91D5C7B47EB297B8EC01F0716D53B743BD098280858862DC9D3D912C6EC730B5F2DD4DF55603D082FF88257DD4CAC3317B41A8E664B2CDBD5D010835341A0CDB6B5C9DCE433A2D4608E2E93A257C83 Out = 3842B0186C89E3B823E1C0593DEDABA71C8CD81A3E338525233EBC1DFB2A1FA0ADC1EC1836621852979F1220E28D90390B742F3659A34469600852DFD6ED2E4385D5096A936CEA2A5B1458794E2E517A649FF99FC1DE7F0BF37E4B872BDBB217484094A3E4B3 Key = 373CFBA5AB9CEE59C7A2373C04ADD01D24505791927112285C7D0461DBFA6FCE0ADF12DF44E9D8C46685D7861882CE1B01C903665A10011B51DB89D338F759D9 Nonce = A9B65C943F17BFC72C2581DA3288B6F9 In = 42E149C0E5314F7EB1A6CBFF095BE9AA6CB2117F96B8BA8993909FA01CF43D18CAD5A559EF4BFD36A51D1A067165F4CE0DF560513704FA796F281F41D29366A9A60ACE6D38F31E635BF61670EE89577E8B6B1E0A9D530E038E42647D0A0CAC80706224E9A9A1E4 Out = 738D56C272FA8B3D8C726645F7984EECF4318AC2FCE8AA7EC09D2ED7E25553AFAE054DFBAE97305C73AA33C642B00E6548AA60FF834C0EF9D6EC3624A958E21AA146A8AA636C55E2E4A0E84DD9B3B0D92F182B3D41F1784B50998B0C82A13370CB013440124EC9 Key = 771338851F87F2099B0B5488FE8E600B2B3F92A528126CEE8B58FEC037D5C456E848D755482DF9C10DE579356354BD7042D2CCA54D611553444F9887D9966955 Nonce = 9DE9EBF3A3B502DD467A60AFD59E6559 In = C288E33D72941F41DD1D5310CFD541C6C07C8C8D70A7FBBE33C9E4EC940CF0CF42588415CB0DA37453D31A46EFF7B4983E0BCF14D42410EA6C060C86C9717F9D094A4649FD0A3D4F4F9F255C6B37E3F31925F12D48E86D102DA00B8F5B9E2407746276BCF1864EB5 Out = D330F79E61AF0EF80088FBFE806D7685A7330A2B2468213DA4C2FD6B86759AE7448FCFD647BDEA3C0247F4F9176418B62CADF5B9EE6F61682DCFAB82741B77C98CFC42FEC1B187ACE09CB8D06D14261138E5234974306203ED38FBB125F85BA955E7B9BECA0BDB75 Key = 7AA8DD5F93B27BB4EED70810D33040B16041D180877E6C03E273E1B87F1A1F408F811D9B984C3914D0B81791E765ABFDE416BB681E8A1F93B7E544F65A83245F Nonce = B3A8F6070CDED95ADCB8D420E35973B8 In = B91BD41453D15E3FFB736E9FA98CC4073BDB7467CAEEF461B011033F284D42EC588216DAA3113C2A3A8CB3139E02EEB0B36D0F82B7D24504F9C43BE93AD9F8CE4EB8C25872312162D01DBD87C65811D0FC4F38C6B395C307E6573AFD9F75C2644C1FF5D9F76FCEF13C Out = D9A17555C2840A4263DE6566E9D59465211D43FA0A6B168E443A363FCE5FCBC7B0E2BD646962B5DE01B9A91B680F3E18C1C0ACA0E8DB9ED24A5E2EA426CC016B9819C2971B8CB697F3F4F28CBD605DE3A10623C45862F0EBC690F4295B83BFFF61A114E7641920BFD6 Key = 90B71E846C7D462F8F1736B2CBB09CBED42B73C9B2C0CE843FFA0F8A28E6F41CFADFD364746D7DA44CC8402A6EA769BDBF60A1189F8AB0A62E2EF2D10C84C8DB Nonce = F86B79E7E9207F99C6F39860CD053C2F In = 05BA4D0D1822FD84B2A9705E02490589446DE57762112C4E99D941B69BD29A746E2E4AA28487B300B1F7390A70DD1FB1BF48568F08FC229AC28415F0CBA5A299F6C2D07D5D614A529F959FED3093BC3415780D64BF2F556FBC2FA0B4DF7D10A7214A28269B2ABFCCCC86 Out = 743B3DF0B4F8B7AF05ED0CE4AF77817BAFEA3E33980CFD1ACE91FED8F3AAE68B026C0086C672EB22B712B78F61494584509962EF44085B3DCBBA81469782A94BB53A03B03728E970CEB74FD2002EB496293089563A668A0A526376E5A33E44165F165DADB28C32A769F2 Key = 6E394318E1A810830FB68CC0D7D0A88F94E6AF97E548F8216BA57E08D56C7EE49B99385F3770A3A4BC8B8CEFF9A9BF8F4D42E28AC4D4A01365D9FE7DB01A256D Nonce = 949DB9612EA1BD78C7442FFB8182EF58 In = 482ACC7C520FF73186986593741ADD91BBA635B381665A4C6284916B1F09BD404EF58A2E8C91C669E242C19A32CD9E8DB9BE9EFC39C8B1F04B850B984140093418C6ED9C45E132576D554701C62700B7BD94AFE1359856D9BFED69CAFA0059F06E9E130715A83D70F5B692 Out = E11C9D477350856F801A22102212533A5DA5D091318F832668EE7348607AC8B35C50F78A5A36228B0050927ADC5B1226D42ABE82D5E61869A1943DB7B33793AA0055BAB40626C46754C113F8F6B1A07E956C032766DEFA78E0BF0E239C33E3162B2869041CD151EA109654 Key = D4F12CB27DCB67C904CB9D6C21B1FB3F16C69EBFB6B2F67BBAF5ADB99584FE6D7D965F9CC4A304C677524C6EF60496676E20B854DE21561A22B62E161E1A5016 Nonce = 5159D73396C90428993114810CF9E8FD In = CD79855BB76EA55A63FF654ABF570703B28E7A0C810D6BB7118FE0766E4C1125DBC7991EB52616373DDD82849847F5331DE6EB89CAD0F8BDF81C4875D1822B7207127857B602A821971EDBBB1B4D0D17ACD1D26F7FC6331058C3F103BF23C4E93ED5D78B87F854241C3C9DAD Out = 831510AC8F3E9546D0D7E3CED8A636D26F9215C9EAB7584C72E36A113A0781599E884AE39F594589F2C947259B0AE2AC7057BC96890BC8DE801D3B38E921DC2DF4C7AECEB8ACA67034FAB417C5BFD5C5753EDF70605E87B669DBCF62F3C9C24F495084DB5DE57F57884BAA8D Key = 7FA74A8FC8924760FCB20EA43A1F8F912780EDF3D0F4AEDE7484D2CC8A2A221D47331B39FA278611CCC9FDE68D1F2AD91B831409D30BD585529A8404E11CC5E0 Nonce = 25A4B3CCA27E618E5874793196B2A93D In = D4F7CC4CBDE3AE3E974D66509F0E11C62AEF7DD4EB35A2A0BC42A92C07C825622F1C1133C4F519409A81697F3A6E4CF504ADD05A464669F4F9E3A13482C8228A432D5D35BD0741298A6DF79F69F641A68A9D80E043EF99A3153984FD24E5BBC16B349334760F551076B5D38D30 Out = 8AA942882A76DC77ADF1ACF7307077D9B106E09AEF456C7209F0145E989D236148B690520B9FFC5629E9A57E270068FBB61722988CDA618669E292E03A6FCC25D514C524564A0EA66374E6A5706F552BDBA4D521F861DD3812A8303A81B81ED10C8BAFEACDF577A8410338C377 Key = ECF41ADDDE48510E0AD24894C1D20672476DFE4C447C114AC7741CAF24F46C319747DBB3A14156976A1E553942FCD3C5C3723C6B9A077BED3431467961BD6A55 Nonce = 340F276BF5D87280FA5959351D2C8F8A In = 43B5BDBA30FA2F5EEEE6849963B1AEE9D97D03468F21351BD1F47062C7A95C775DD28849115A8FDE8D07810386CA63D21FF76F46777A7A72E996F0B4888ACDC95233343E026E962005B5F6DECF9A6FECA8B0E7EC58D1C3356D281EDDCB933C256843D35131897D83C1E8D0E94000 Out = CBD60463CAC1B512FFE256EA3B1D9E948C50A52EB3940770D2A51E2B84476FE7BE00E96584B44254D5B709DB59A82C4D9459A896219C990463981C5D08CA65F356E23A5875C03A6C407FE2F52B92D0FA4F6C3B9D79EC20D51D8ECC1CF432C79556F4DB64AEA9CA2702E511C5F138 Key = 8D9CC3AF3D5810799B8BAE673035E24EB553CEECFDA5C613DB418C253EECF7E32E792EFF4B225B9CC6E2157E4662463652BD00E0D52D9272ABC63A65A4F32CAD Nonce = 82B45A731D2F2393C500CDE3FDB1D059 In = B5F26CAEF7C7A37581D87CD01F9F6D3B5B8DA6E587C73C593677FC95D34B065E64C70615065176E500F01446B026B709D494E2FC3209FBB10BFC25038400BA3FE0A8804B11706D0BDF8C7C5FF1FCF9426367103ECA49C9FFE8141281B8692717792B4D3A091D17D8824556271BABAD Out = DAA79FAF40F3F198F1D43C7011D9E0CCA0A15E855FDB336D0F346394ED85E00EDFA8CCDBA9CF0A11F65D4EF8141D4501A399B92186D08B7B821841F8FE76FE2E2FF386B70332D670F14265B9843DD503E00A1EB7232B8F775883ED8103037848E94F229A000028AF93247C26CD3ADD Key = 4DAA37EE05905CC235834281D4DAA2848E49605AA92AD7C7973C4EE3156C90BCBBC120CBF72B0511CEA50BEFF6EDAFCAC1A066A47AA2FB1D145F22A431A4EE0E Nonce = 118C870333DEFB518E6BF6C28DE77C25 In = 780DCDECC88D3170FA13A1138D090C9C1FB2AD38B08A0D278DCB3B98365368F839D4A7FCB0874CB533C886A7D255923B599C486D5BBAE4CFE92755FBF73478A4C282CDCE37E8B608F8018D08FC26059288EBCF8449C7F3BA78F83617B538741ECE1FB1CC3F9E40952E67EE40391E387D Out = 721B4B9A6559E797C49AD734BAFFDD0EC92D1640B86659BC90B3AABBC5F87579EC91F6BF209963F54B854F0AFF71A32D72D992A675BA38A2E7F61AFD39F1D1155E445ADF475504AAC3A0CFCDF349412D8E2AA9BB6FE3E8283E123846ECA76D62F0E34E6C3446C8CD46FD45D89B236DA8 Key = C6CDD9D731B42C2E755100AEE2B36D7D4C0264329477170F72D2A576FEEA2AB59ED6BA0179BC1A55C21543E8D6CD47A626EC16B32698A19E92A2897B315C0B79 Nonce = 4CDFF9A61F98BA414108867EB8AFDA61 In = D6CF912FB9281A4B5086BC851F5F7C40B267D73E78ABAB8D1E417C2AAB413A89BFBBB8BAC4BAFF248C1BF0EA5077E0241826C29038EE80748ACB14B5F88B76BBF1270B9C3E97841B87AC63ACDE7239E570A5D5CDD52A350C3A7928745CE9599B7AE683B5FCE6D5C49B45BDD35C06F4D271 Out = 7711973849383EC7E80A9FE41D211705AE1DEF6138AFB7A1C4C9513774A2CC9C79A4F95E6C2EB48CC6DA6F8C975EFD5821A054E027FA6F9976F5CCE8621E3A89BB0776AE3DEBB20777F18475AC94EEB187BC4467C7366D20F977C1E3FF71258D5F455F8676F3A3BEDF531D9720D79DEDEE Key = CB53AC5FB4AC48240A75A5616FDB3935532F6357E57FC51BBAA6C5D2279228116BCCA413F0F7ECBD85D939411BCC61FEAF5C73D0067874A045F016F49C1817B7 Nonce = F70C0F5B88C9695B94B7934CF8637401 In = 13C1024C17B9B78C18F549185639B2DED3AF1C8EE70FAD794E784F4D305095CBFDD2953ED736B75F8B2823C673149325E3DFFF8077731C20D3B12F5A2222B169D3BEDA142E5DCA3F37F122C885BD4221E8776357B858261032B0183F4C38F3CFFF19B96206094CC34F74FD5C6D29A593AA50 Out = 29CB815364BD80AFBE4C1FAF09AAB793EEC973AD65A3CCE9C6B23901C84B90A3622899CF5E6F8EBECBE993432741CA492DD49BB81309CE448EB4E4C8DE46EF4EA097F908472A8EBD687523005C91FCF4FCC590CC6F45E4F61CA4F7AFC329543441BF7E6EE12A6A4C7EE58594289279E463C8 Key = 9CA8E3BA9C9610F1B15438CA0395C9538AB9AC408B05A68728E379893FD3F4EDD3AD946EC26886526C5640D1D0FAD5929BDAF5107FA6A0DFE46303F20C7EB682 Nonce = A1369ECB4438A4EBBC918E19416560B0 In = F2F8A5CCD1DDAB9D5842FEBF253970FBB1F13FC158B545FE5E99907EEA4A25E6051E88DDEA4FF9BD44453E9D31EB54772246A18EB73E1A35E9C0A8267D07BA97D26AAD6E706BDD908AC0CD3F9D9C8E0FE24F1C5C7A0960D14C86A18D97BD3D55FA2073D10676AC40601279321A5F00021AEA7C Out = CC1E3D8138DC7993050D059C68F89172865A0D36C0CFB4AD58CC999149F3FF0C1D623A0E068F080629CF04DDBCEF918AB8E4C9DCE0B4179AE7D9E0EB7CF8B42044D930368455690E22E5FFB92169CDFBA5B48420C9B89AA7086708A8BF0CD6770E1AC7277542A84EAE84043B9855ED876F41D4 Key = 0338A0F1A7DAFD77612275177E38F1EF8640B0E18D8C02E1B175DB6240C7E4466EE7269DCEAA6A2BED27BCBD8E97CF11D85B70D1CFE3F958D076F064AE08B69C Nonce = B21A3FD84F96556D0E68933409A7EEE7 In = 1E73F5A84C10A6CF0680C8DC43687D5C76D29D34B09E327B8708B92BC020B28B3DFD5FAA3FCF9AD00E4F726F4B3EF95ABBF14CE84481132A2D31A695993A60B85C2B68F3CEC092272F22A4732C67769AA1C21784696D0A06373FEFE72CE39F377C3048BB40886DC6F2FD7C43A23BF5FEFF7CEF0F Out = 24DB74B7D6EE6CDB3CC03416829F30C823488D98354E72476D4001249DC15ACE9502580A2453398D08D45E2D5CD2A0359EA3576400D3A08214F70128009832BEB2E7DBCE4F3FA6E223BD92FE23B0866CC656740DBEAD98AAC046D745969EBEEA4F2C1DE55D467F932A0FB972B76C7515229F4D59 Key = E403166D7FEF1000E0B6669238B6BA73C618BDD811A4368C4DC6B700B38E2210E7AEDE34174CB0930400EE1325EA6BE3321C49B1D3DC185586100F580A875046 Nonce = F15BDD887F65D25D585770A222220219 In = 66396189590430B5BE5AF1E5CFE5C831862ABFE66D22F63C5F0B8F04481594CEFF1A39F7DA5A850E626630F346DFCED4EF67987ACA3D1FA9C4DD8BC18171BE3879E91F6FAD52F1BBD90DF94DB52CE98239A850114A242ABD6611DD9C142F6CB30405199E0A65531C66777C8054EF03BB95248B4F57 Out = B73922288BACD4660A85AB0707FFB1D125A81531679B9E2974E2C7958840EA2401B8C7C6B05913D7BAD2D9362EE829264D7271E7E47EE8BD45D085EDB48CFD69A3D08B7C977D47D8867B22DC4ADD8988ACFB071C6867FC980A3AE179E3D3B5B3C0127EC7ACE61AE48D1AFB16B9553DEB5583E5FB1D Key = D277E8CA361DFBE5AFC2FF04A9EFBC47591B8AE68FC7CA91490BF3A7935DF35BE29FA41561B424B7F9053046D1EADE655B60B82467963F087129DA002DF3224B Nonce = B898F0C1F1382C9F9327B01F67368200 In = 3032CEC02AFF86B5F2E339CCE38864853768F1960BF20A3B53D2C4187735F428DD082EC208FAB71F9AD3E1967CEAA3BF0777B87E98A696841DFC084E1347B82267588B372F9642D66F9E08C161BE3EADC084AA9CD6FF3A8FBF3177808C4EF56C187D0CC9121A84948D7446749EB685CE5F064DFCC939 Out = 1CECF7BE8466B2FBE7612181CE78128D546B75AFEB5D567F63095ECA5A5DB776EFE26618036DC48A580944BD34E08C54125594C3C1451CBBB37EDFF65F881376537288E3E4BA4534A4199B00C36EE02A889FAA4FC33FABA02C633AD6628BB2725C3E3E147E5196C1788B292CC7365FA3C9A15909BD87 Key = 7F5587B64A953FF3D12741C7F256716A99B7A88C21DE45FB45F3273D372F646FAC13249140051C4684D6B386CB8A50B93B2187CFD971D25517B01CE188EB9B88 Nonce = 33FDF38F0C938BAB399772D2F9E405D8 In = CFF35BB159EE8A3BEE6676C06A931588F1669CEF27FC33BFF8BDB94838F0E96F21CDD44EE497BEB4FDF0499D63483D7C60CB2321B15CE6BE6DF6FD8AFC31B4A5CD473AC49CB72E7C86AF56D5E7FBC38DA3FF5CB7D2A22B5FA2F4DAF7DD8DA105E8DC6B08C78159D15629F7009EAD564F984DFDF2C38A7A Out = 8C2A04DF5D2F4B98E37D42DDEEC7411694CBF941F0D954E6312768BB4B9906CFFA33D6877651240560A65F7A022B88A8B62BA58623B3C3EB892E1D1E43EC3E839C7111EF12A91FDAB754DF9169F324B36ECABC9F0037FB307A588356F50DBFE820C02E1AD377D6FBB17E8406092E52C7539EB87005026D Key = 8B395534016BCD55ADBA77CA7284A1565A66CAE0BDB22BD9316346CDD9419B5D009D0BEFDFA4F40D1B6FBCE5ACE5FA044B3AB0AD3919BDC2498296C44183B267 Nonce = 82E6A3DDAE62A789B7116DCE8DBA32DC In = 81B5D6B0524E67997F04A0E708A5B031C4B4EBBC2C8344F6012C1CF71DD44799E54B7074288B68C464F89E6DA67AA2F1E3531A81869DD4C856861BB2618BF35CE6AF27D0820B57982BD3332068085D55121D0A04E0448B9CAB9F951D3A63E10884B5426F49CF6254033B63C59253DFF3163F7D0FA3E890EB Out = FFB18F8B1287F8A98D59550F8714953975A4C0E3148EE40343DBC2E7CACC101367335F21CB190BE4D4687DFCE32DFB0E3B2DC9CE54D8123D8AD98CCDE7A9A80C00CF1D1456D1499C837241B4AC5575D9916668ED10AE5AC398E18CF34305494465C0E7DB20EE7EA6E9A0FB872A7C7574FD1283BB41714EF1 Key = 6DA973BB970599CCDE6BAA92BA993D962A6D9BE1B23A8831ADD3AD0388F68CA4BD026CDA4F65C62CB41E83603BBF5375829B8F9D17ADC2CB8207FC59EEF25994 Nonce = 0A0861098EBE2DD3BFF1F594E561F7FD In = 2C4E8C31E0EC855E6FD937EA6B03D467A4B280B6988108AABBB5DACF6C9E84EE565225A0832F92A665D98DA93EA0B6CA966C907B3C6029DBB1C595480DC90D571822FC1F0889FA3FB434A8FF4E13F20BF617A42910EA3B6DFA8077908948EA5D447A662BCD478FD2681E98C9DC3D8A87B2A482B28D467E7263 Out = FBC9BD2212532AE048540DFACDCFE5A518A3C645D3B17B5CDBAEAF7C8EF359E0BACACD90A4F4A667C2C9C07DFF132415A4494F62EAFE16FDF431F8BB105DE1411DDF1E158D917F2DD114D3F67A71D65AD14542F0968BE10A1B284B6EA1427257909A03547BAA212DA2928105C6A2847B7248C50DAC744642BE Key = 62B013DDC5BF950763A5E33385FB75BB43BCF75DC66CA54D9104B0236BC38C81FCBC87997C0D6ADD4DC45BC8FBC22FE36AC00E105A46B5492B4005A50DD65116 Nonce = A2E9DE101E506438FD10DED90EABCB3C In = 95D6D6BCD231BE3D7C1316B142D57FCB47D2AE9EB58EE6C582F3D3CCDC78D228AB555B5F79F15756231821F6A6657693FD6759D84BA734C86540B354C7EBFA5644AD54BA1BB9A691B0C266C28863B04476F361DE70E665545A179A1746B8252B76074D8ADA0CE0A5BECE2E6DCA1CC7F92B1EAB5B97B4B2831EA4 Out = 5BDA57FB858168C911A9D815073FEBD91BC9FCF17E00B373095D81289CBB4B52A8BD60744384AF161B7F03AE95EC030A02F9B2485763B7B573AFB5FBBCE316FB2FAD0A2567C03D36535E8FDF253A01A9E56D0B06A4500876DC8C13E1B4C914F2102CD4FF050801BFCDBE5FE2C4A95D7A4F88342C19DF6A70A446 Key = A483EAD017318E8BB4C0C8801462AE07257024E4BF17099B6B32ECDEFDA197FD87F138CBA0D0B96DDB56105E81086A7A5886EFFF967C24FD94B8689D84F22C5B Nonce = 605D48F582078B0604F3C5DC3111F7C5 In = 3BD568E69EACBFAF5D13322677BC92D0CE2BC7E4E7092CA041559AF23E42775DE3A8D2167553DE22F31C2061A7A870B6AF5D5FDC8A6F4834E7FB44BDC31FF14735C26B0893010A49261D68664120D2858002D887739E249CE730092460FCF7F46DA08F6B55622FD5750C73E5C5F0FD04D9096F9DE314873350C478 Out = 368390C4520ADF7EB9602D6AFD8D5087C26FBC854907F9A5475FD0C0B2E07E153B5621E4EE651438F30BC67CD9668B188FB745EB69835C8C0B2FC8F7BEAD94C526C5A50B328AA0681311BC3091C6647A0FB6928D27DB289BB48D8D2E0C037E3FD791C2FFC428D1B8A7042A961039919786718C9A25B7DD24F01AE5 Key = 63E4511330E7D1D2321FEC25201FFCC03F52EDF46C5880AFBC8C9ADBA5E768A613D257E272AADAE1A0AFB091F0850FFED65C9D670435E452BF0B0CFBCC17F6A8 Nonce = CDC6565013263CC5B1468EA8B270A9BC In = 6758ED64AA790A0A39490F2C1D57D42738F4946065560F0B1A5285C2F466E7BDD8F48DC2C71339BF73BD5E831B215EF0E20C9834DC3C77E874A3983EE0B404AFCFD0D203B5251867B0D529207891DB47601E82C7275D9986160B0152BCB63373B37D688827212E4C1BF62EC4CBDA2B365BCA7178D89ECE38A8718E86 Out = 734D38002B9366E74F8E359B40997A63DEC0E1283EE0F2C20ABA3691F679995A48D424CB7BEA0C39590021BF093CD50B614F2194335F22595F86B0A468A63AD281259DF6F54F1300AC7D9D2C221CB6E9EAA9EA36D94156822C938C54EAFD4A1C196835EDD18F94C19694EEB6D0BE2AD24FE4F9A4A6F4BB467485DAF8 Key = E1FDA54A463E177014F85F63B863E9996C6DD86AA476955FAA5FE2554CC20360104C0C90FB6D3CFE69666941DB660E7785ABC880BB00DECF81AB9D17AEB01E4F Nonce = 97F77B1B0B71D103B62BDB3C58E1F1E1 In = C0A73132E489967611D04F7C84B74CC3E2EB6B2C725EEB8D331542532F1AC452809A64EE1FA4927EB32E7E55441C4789056FC6721C1186DE8F49CF413A68E92849D9A59509D7B3155BD06FA91022D273496F0B26EDF671DBE3E69B3542F172861C1F40D1DFD9FDAEEE421F8223D5CB61A7BE99BC89888856E87F06B71E Out = 1FAE54A2D6A87893F58C3F478652DFE814338752823A20D722F583D94B24BA29FCBD551B722765F6E472AFE2240B485A54235D83C865BD5E11E5F1165A5647A28F6BDC749F8B9A7FF1554CA86364E584415A9977BF0A108DA508A5DFE44AC4BB3F93AB351E4CB749BFE9CE869DA3FBAC74C1EC669AF7910B4D0E5D1A49 Key = 26017D89A713F185A829C02EA39BABCED003EF442589E402B260F5DB9334E0DCF9EF15D02BF3066F73BD73E180B4426CA5C57CDA926368733D2314AD1F51C2C3 Nonce = B186D4BCAB5F782F0FD654CECD90F39B In = 21F2A4864B20BEB630EA2E92B980A4099078BA7C6359872D06B0E853EC7BB4156E15F471820A0C98F57020B29AF21D65E6A78A230AC8BFCF8B1321A4A1DC0728FCB9DFD7CD7F03048DE0A7AFF8AB291E566964F46E7A2376DB0E0119A635D697B58C6CF1659F9707029560E65387E5B989354771414BBB59983ED6980AFC Out = 880424CF394E9813B8E9388D9E9832572C23EB1CD866BEFDC5201E309246F41920EAB7FA86FE3D9E7EF39EFB68790D5EB5075398300A82A77722CE13CA7FF1EA55B17F09F487A16D79E00F93CB6BB8D7845BA5A6E7055C3A145FAB4E81BAEDE7C77F5835EFE213502DD461CFA69E6BC1176FC2B744871FD72AD90FAD562C Key = 3B51B7A749B08DFC6F904FA000A4D9245F24124614A933335D75F5667E2B7C9697FE44DF6AD825C43843E9C368F1BD4F173223D0A0DD9AED7C9C80BDF69C8334 Nonce = DFC1983F5119A9C4B55DEF420B59D2EB In = 66A37B60353183B31FC05232BD71F4CFCE7B8E080F28804A2D5940A2C61E1EB3CDDF1EBB90055C1FD2AB7B39E5D081597C94F3D718A1C5E1D2C36EC844D4CA1AFBA4BDC14B3F19BB9998EF4B3FFAF894C9887E204B6CC4E860DA8309D5E4981AE9222820268A4FEA1EF02249E533360F68BB0DD1730E28F436FCD9372677A7 Out = 80ACCA9006AA4097230D5948AB5629BF72AC6E43A08B74676E74B5D14B7C238E48CDE24E319564912061B2DEE67955640EC5D9A5852F41237DE45440A2D8BDA9B73C083120347EFD3B2C86851DA0EF02C24916AB58CD24B21235E54620FA934C0EFB200EA7E29FBEE098EE537023A6D03956E17CEB15534D99938E8FD56390 Key = E0104975E0561DC232B1DC0810A2FE19BEDD07EDC66E8208A3326111D51E25945A9D6D804147711D684E09471AA8E64FE328EF1D64C056F39291F9FDCE0E1845 Nonce = 0E2B9BF4754A37E86C53786FCDAB4782 In = E46C7DE449CC38BC249ACF4953CF1BA66B94A5616A6203A3247BFE1E7D3309F886A96A2B5533ABE67369A1F1EA324A0D6D15A04E36787D23A16E33890BC8F2FCA0540189A388E0B439703DF43CEE744EB0A1040DCDBBAB16BF37592C942D1E84325047AAF28926A1E2D1D92A935FAD0C7C406A7FB8A0CB58FC685C834E81FE48 Out = 69954B7111B4486FB4686B5F49D3D52CFFAE02222EF8A211D8618D9F2998BA73239974DE5E51516225969E33F705688A6EFB5C7EF2B13ABB3E0E2DC2E3E039B85FBCE29A7001C4EEFD8D0143378A08F4C1289680248174EB2EC81AEA9C2672023756ED685FEBF0DD7F748E469425C1C0027B64CC0E575656154B743C08DD6993 Key = 76AB2C69E81F734BA067B0B9D01C55A9FE7BFCCC1FE9C0A59DED509B7FAE0CB5FD342300C5E276D59E239FB5ED5BD857C4EE178DFA14EB5C64C8381E4224541B Nonce = 9A711C7B8AA57E098ACE1F58EEC4CFFC In = 93C5A236ABE90F992ED6D5A7B82091BD8907DCB680EF326968281261393C8E7F1EF8F37F631A7C2CD9E9EEA75F124D5D42E8A5C4FEC30AF989416CBE755D392D493EE604E7A9384E3D423E5A5F4C5C966244C1503000AA509230DF31906164D30D2FEABA8C582C0557821917E6725ADFA0D6A2A61E89D933E92D9035D8E249C5EB Out = B425B00661CE5B18D263F21BFA59C8E487875D0FECDBE76B4E76465F77DE11A9ECE56AD80ED1B07377E7B47EE4D653FFF8D7BD36A1AA254EAE0CCFED1CE6C2125D64A743424F3BC01783046065453894A34616F7CD5AC648B7E6D282F17A89236393D04B6DC433512F050E05C62917C9AAA68328D92482DEE3B989C116C32B227B Key = 2BEF82CC3EB6BD4A000AC829CB9A679976C1461C822D919B5A34A24219B3E438F1B05D19AE0471FD0A129F769C0E818EFC5666D33AD7E0FBEBCAC21DA9BFD56B Nonce = 35816266512D9C87E26CCEC6F8898107 In = A48758291351F2BFA2AF6FA0C5E211DE29B8C79BFC89104D08EE0CA595BE9544A0E6999CD5E36F77AB19A071F8F6D04DD0E81A25E0341B5AB51FC6A7DC189A3D6768B58ACDE108F1BE1218C78C88A7869FC84B1F35E299B0B79C4A09A1C0EE318DF926C6E5F699D39C76550CB727184B5DFF4A5DE3C89B147CBA34397AB042C10AB4 Out = F566F3EE9AE9A6E8DC0F27BFA6DD8065AA04F6EC22DBEFD6CC402B71424F0F4932C3D30838CED4A8874D1455D8F79606EFF0AE5E67E3237282B62FD54D930EF91A3E1317CF51EF4EAD96E7C3938B9D62E34C2E9669C36E01D2307E3125B94EECB9572FE48912A45AF32835B79CAF90CBA384DC51459A767115D918C6D06F8F03532E Key = 7C31E78E2C7394EB9B5E6B3657443EFB99C08463A3300047A11E29C31280F4E8A2BF9F45F06D33F48359F45550013FA6C9AE9147A1F8F257EE52E9FC4F50EDB7 Nonce = 081BF9111E8FC26FF5F521B1FA0D8C5F In = 54E25645EF4F0685286EB6D885282B89F658A84692E1D4729731BC0B8DAD1D0192518982B0FE8D6C6904D9096E05F5E3A31667D402DCA644F05DBD8439A8F59DD4BAEEFCB93BF5ADDACECF0EE6947B4FBB7F70BE8FBF898D02A36590D333EB3F4AB4281B9E4AEFF3D1B8FB6512DFFC00F408C149A3309ADA4EA5C380E6DCD555C77ED5 Out = 81C281A5EFB2A4FB6F239A27291F29772C4FC08F9F296FAC4C740A984A6B94813EC7C203CCF56E014BBE46F173587C059D03A5889C8E02DF235D310CBFFD82E5A3A3480094A9717DDFDE5C5ECABDF6931F0D2C205EFCF04157F3B40837944510E46AC4BC2B1997B1B4DD090CA440683126818F50FC23BE698ADF209AD49A8A82BB2F46 Key = 3BA6E21E1E7BDEAB22A5DA09C018B1ACA551E4D65EE2CF085870ECA5F1ECC93C9492E6EA44446560612FF834CC30A9491A8C9008A2076D8630A65CBF39A34279 Nonce = 5795EEB25804CDDA0EAC3BD3626F6ECF In = 06F3495E2ECE2F37DDF46363D03A474BC5635002F5452ADC8DC85678947B6934DE6F50A599E8AECB412E3064C2B51A2AF386135B30202C7A21D735DD22BF97C3AC23AFE003F1C04183BA73D5569FB919865EDEB13CE96616AD3C77317C5EE1A9AB53DEA2E6BB429EF9FB37D660B31FAA2237360FAE61BA29F122A98254467AA9BA1DEF4C Out = 9B6F2CD351822189251ED072CB97272464649308A16523562124F15AD966DECC3B22A93AA6F75700DD6F8D06CE373C6F29BD5755F4E3E963632BC4DCE254B55C4B77916193982085EE06AB800D5CAA1CEE1491DE1006F554BAA21B02D3023E0196267863DE02C58D18A7B17517DD86702A4A9E1E3FAC7613528744D428DEDC667D16E6B0 Key = 4084365D0393AECE34B53482FDFFF0D23837051C04E680393A77CBC36ACF352C67CB002A336D75C964ACCD2D6FE4A85140F23F8CEC5181DA8D7417CB168FB929 Nonce = 730D1EE67161B93E102E9414AE051DB8 In = C8567C7DB4F901A083E4A3463FDF72F1B70A1EC7A6F18B9208A6DB88E36C84CE2EAAA83444AE8C930B8ECDDFED95369095D6492981FD038DCD6F4D53F107B75EDEFAD677FBFFA1AE7C218E9E4CEF32AD4875446C533D651AC2A407EA0DCD9E8B17F72D2407E23141339FDA65ECE95EB70BAA2D3C3A854238C2008B0B212C0C39E0953E7A11 Out = 86DBDE68D137CAFA42181AFEC899D1002C34A848B57F706BEB5C35F80A2864C1DE836051FC7B6C8457D368E49953823657927A7526CA3A78215BFCE1249D53D34F08E15BC9A4116E48907FD594740A1142A316FFA3AB8D4C6BC8C05942289EC11BC1A80E4A861374F053E08D401A174465CB407D616F5C59F42645C87F19598929C8C11318 Key = 6D2CCE44439F12CBFFFF9BD738A99D60123251E0D1F6F30848EF7C71E7C53D058F1A1483A6297EC383396C5301BA3E471E9AFEDD07C14668746C314A3146B2A3 Nonce = 6556375FA789D768E9DAD4409E76FDF4 In = 8469D3302EA60CC72FDE028DBCFDD7C633E2030E312E4BF127E2D3425395ED43EAD12835D537E348A44E33634733758271BBA2C65CB4780C76D3A6BEBA69F32A17DA522A4E22E7E7EE561F5C05A2788AD45A3ED4918A05DF4C3BFA4EB93FB07EF1D1104B987853FE40EA56737C84EF8F00CDCB6363A5D568AD984CEC416404E788902556C9F9 Out = D0ED3237CF11A6FF2A05D2376726218A9D98AF8BB5270D9546D32FA2C394FCD659F008849E95910D638CD1A2A09A6946A9CEB08F7BA24E0D2E8518199FA88DD4CFD4CAB123080C52251F01E29E673BEC855F9FEE6BBBA6594884D35BB68384AB66E285F6E71362F4C78A1BAD4F976715F7F60A7EF2D3C7E601A3319FD2062714704CF2846B1F Key = 20E9D126623672BA3DA57683E89E0852E1C3753EFC76EAA125C2935ED0A85DE77A6645A4D225203BCDAE99645E9675EAE4D545529733F4CE49D570DD5FC1E5A5 Nonce = 11673D9E38B88FBD5147EC125BB21B33 In = 0F8D74722E2814BE690F915BBEC407C9BAD6AF6F53AD5315F70C8CB8D9504DD8647D51553079E3A21C7A8070D23C3345D202B9C5DB41C8A27C29E65E96F16BB2EBC324D452A4C7FB76AD80A421B9574F8E35E4D35C94406D9EDFDFFE9E31AB345FE69A63E3EA8537A92701188F58644FB29CE8CD990E25E8AF9A246A93DF23114463063A57DDBF Out = 52CC2A88639888CF9314FE15363700ECA64FE91088612D3D347991F98F91299D330F6D92EF7EBA046315B3DF2B017BAD4B5834FC37FED528BAE0FC4A161056BE7A805C4EDFFE887C58C1F311CCCBE8F01781F63C28C88A939264AB138AE8E688B72FFFAF965D756238ACD876DA846153E3B9D685A45B7B0C91F5D2AD9A8A4F5B66AFDCAF4509E1 Key = EF46366CA50D577E5F9DEE22282475B5231AA2F1A687C2A47BD66F46F06C8BA644F9294A117CCDE299608AB651EB665D4E95E7399BF895403CFF60C0691921D6 Nonce = 75236DDC71FBF614FB079645DF5A8FA5 In = D3231A3DAAF07FDBD3A05024319FA12A70A31DC8D9A7D8356F06D8F5D7394AA36DEEFDDC29D4BD9CE5DA729CDE1251F86E4E79CDCF573570F58CBEAB342B1AC5ADA6FFE3C62D292AD3F9CEE9DCB858C9A1FB0E4B11A3B21D6351FCF27CD9B5D6A4B6D1A43AF1DA10C8AA7EBA15EC2C71620B343B71C028802304583059FF06465FE17ACCE35A9C30 Out = 7D579CF1B29D202372FAB3C43618BCD1499BB26A2E5E71BBE7EFFFAFB295D9CA5928FFC95E0AA58C59A9D0E5E42108AA63E79936167CEA865D808904567FD42E45E061195B6234C12BF70122AAD6BC5C75097EBB16099B4F4F691F4550F180BC61D837C9688653FA2082A52051D6F7001473C00C58B4ACFB35040F6B9FABCB8FDC137905E0C8B722 Key = ECB1FAC66B4B74281A0DACE9F95911FDF79C2DC0E3B005124B7481E944A619D5C905FB915C4337749F4BDEEC3153BD2BF075371EE709DE8F1962D35B67DEA5B6 Nonce = D255A2B05BE2AA1E606895A99BE85AAA In = 00246DB5F84B1F5BE9235BBC9B2AE432E0F5441A169CDC9DA78ACBFF727470C6A768B2B14B1FB1BC88EADD9CBAC796D17F71629A829680FFB1797117A30B5FF4F9D7A935840C04333D7BA95DFEAC25BD289BBC6AB07B8850241AFCED877EB8F39FA7B7F97D44641767BD33290242E42E856C7E282A6D7598419A4B547AA80D3A9004B18FB54EDB839C Out = E94817986CEAE0E54D4EDA3B7AE0F8A4200F6D6DC0A483EE2496E8F371E0A26480F94ED3CDE72B6A7FABABB8E4619F6CF01A3A39880D9FFAA4BF3EB2425E5B3CE46FDEA93FF05E91585F26E25DF3923D69EC42BA3AC7C2B82D615A66B4E95797451F9C94D1161652409AFC670C3B64C87205D13A1BF049F54A591E916523E6A7433A28AF85B2495B6E Key = 5D2C1141A0038B998B5C7FC7E24BA1CD2B6DBC3F6218D6F598C9A0A3A3145BE6DFC88FFA319D96864620551A985518EFC9FC4D3F4A6C2B21BDAA00ABE64CE0A5 Nonce = 0A68613719ECAFF4A9E3F17ACF914933 In = B1167A2CF1CD06E919826114978664424C36B257D9B3B9188E1467B73DFA051F6175984E35C6FA8E7AF54A85B663E2DC7EA3137F444BB76FD501AA01B37698CF6237F45750547D6655BE389DC88A532C387AEC2E701178B7770C51BC5D2B2BB52046657D67EA49DE773C240DFF93ADAABB69B14785C071084047DCD24938AB0123E8A4C84C5B79ACDF58 Out = 845889650CCA54A1CD7FBFDB6BE1B3A54D295FAFCA3467A173AEF392BEA78D802558F0C8903A0DD60D53F11E3C34B26E5318632393794AD35F9D6C534EABDE5A107DAC9312E4386C5ED9FA84D6ECD1A32206BF12EA3BCFCBE5C4D1BE2BCEC76C8F2ABA19F1F27A89A2299E7D52F4BCD5C4186078BEFBFF85EE3266AF41CA8E5F3A929858E66A31B99D25 Key = 2BF4BC444006EBC96801952390E05B7C9CB6FA1267F9B50F09E29953579BEE1822D5CDD0B3BC341DC187064E4A2AAE1A6B9EC545BB82BB355CAAA7CE1CC4D10E Nonce = 86E3421B6FE8939F1092D7A647EBED42 In = D11779689ADB5D3940CD4C1120D4D944BB0E7CC28F1F1C87E3E7E76E128F2CBB542601F258CFFE937D4475A4309EE926B1D88A2D77AA8306E18D087DDEFA9E4F9D06C3AE700DBA7368955A0F0C495E1149F85EC6DC0DD4BD430A5C037F85E06CA615232442525840EBB12AFC6B287DFDAEFD9822BF5197486BBD51B826C7C11AC7DB4DB3F300C223C3DFF6 Out = 111EC8EA4E6F5094A8E3107F6A5A09052FD5BB317580EA80C65036537DBEF7F244BA22BE4514CEDB217FD914B4686A579BC8B023C8E16BC5466078BE193DC1BE70EBD3C323CC5544924D0580C452D9B17C61B66202B44883C139280DC202884660C2CE6C26D95F70C64ED351D6B0E61BDB4E874F1B82EBA19386824F8CF7C63F88C6AF4C949A00554D8957 Key = CC4774A4B2B0713E38662FDE415A674C77C8D860521BD7A837FBB6595035E505D93754F035579809233D92A10F4EB9094F8816ECC7AFF9CAEDC48A8603E7F009 Nonce = D62291FA5B2B0CC678E86CFA70072394 In = 04766E2DB785725BA503819DC2BD4F340F9E788783981B8D0A48A91F7F3753BD9612B2F66298AFD0DAF20B1C9B23BA45879A02A25515A5FA4FBB6AA4F9E29F5F640385DBD9D0DC44EB8932EA3DB73D72FD55694852502E306241C25A603A3D1DFC7CC6653F60CF5AC2DA758582C1002866BBD396E874563F06949D7B01A3B5ABF6E992C5C218C3F9D3F54D84 Out = 2FEFA5B6A8E4967520486C596E91FAA32C4D0CA2F87C5AD29D051ED24F08E961121C750B7A8563E44A9B78F99A30E816BAAFFAA440BD29137A3ABEEC2304C58657E667BD92508F5389E9E501B3E15380A94C754D628A51B4855E7DDF434D29222139C8D47B8A9077FB93A047F06870A39E1C932C9106C5F8549933167F01F34F7545705627E631C4B3D5488E Key = A194B48E1D5FD59441DF7B14DC819751A8F1AF7CDF6F1FE81C8AC4BD7CBCB6577E178460B24EDB081A9423C0D9F6967A8C4BF7CD94EEBFBC7EA115ECD97C3ED6 Nonce = FDC8DB35960B6C0C58D4CFF2E76A3515 In = C465F5C10941D4975F303E63731D7D65EBC7647DFDC4732635E4700969AC9A3C5E7C1850F42AC01B0B8F07CB2D0E985A726F3C802946F4B36C624BC0DD50F322890F33711F4434B64CC274C7CED8F15EFE7E088A6499739FA985D2E888376F535F3A6DD16A5AC6ECC836A734F4BB09C82DB1A0BB8494BD8C242D3D555C15E6D472651B814A02EA22E413320B4E Out = FD6D89ED47D9EE30DDC776CA8592C0A8111F847DA753DC69834D9A6D092DFD5F936F50A3FB3256B6A1BC76B6B51D361DA7A72773C7B4A92DB79FEF0536FFDAAC18A479389BDF79974B363CA577E0C961C31A680C37E2529DA109BD57D3A1484EED7959061AF28581042367D0AAD824CBA8F96547A61EB7517B5B2473184B526F1BF9F72B64A54524C2E251F173 Key = 69FD3BAF8258261004D9F1EA076BF5E358D1BDAFF0C779A70B0051961E516181AAE416C6AED93A7FF465C2CC780EA7FFDA147C25BDAE869A2C0049A676FA0F03 Nonce = 1F813975655755DB41D157C68AF69956 In = E65BA732DCB42FFD966AD5EF6AD3953C45FA4CEBF47142BE2FEE9D98DE020A88B7536A633C151E77B16E37D6F30D1FB7BCE7E49EC3F3B5C7164590392ACE2C4DA5206361A381D07CC182E0FAACAFD6842971E7FCF005D2992A7A2F9B6FDF40A478E36C631B8625CE0C196CEE270DF777A48BF2487BCC29A0394881A54B69B03CF42E406D2FD69DD521E504393917 Out = B8C352F394058A4A2D87030557409AD0840E87F20B3F5481F88B9FDAE065BCF38433C0EC142332676B96482370EBCAC05B7FCAA68676F25F5CF06636F888A64415DB39E3892D63605F530835383A8A6FC573A48F858CD1CDC7D7175D473248423F4B821D049D8604DA46EF2F8807AAF1F63D22D8922851279F645509C1A728086317A7A64C77377C792637795D6D Key = 0125AF88A9951A38ACD20CE05E8CF99C6522F3E163E80BCBB4F428BDEA563420427AA289D2F7676DDE807461749C2887852C82110A6A1CE8979837B5EB82431E Nonce = 9D4F8337DC1202FD53813F2A2DF16EF5 In = E2C37AE5B3ED0038B2994F316B7C1104812871AFBD4F1686BDCCA64D638FE6B670C6C24860A7E49AC34770691B1A45D97DF79940FD5E7FE2068751C5549815F562FAD16B3E11110C3BC4928A95823488EAA4CF91B4135830B6C979ED25638AF8ACA6DDB52D169DE7C55AF958CB9A90C065121979A7C9E7F5C0D5C8B9688957E9D0F447AE04A05085517AFD11CEDD08 Out = 91A679E3D1FF2044C0708AA1940E9FA94768F1ED4CB60D67F0D393F6745ED762791C9E3CD2AEA2B971C74B3248B1FBB012FDBBA109CAFC448C3DB0BA4194ED13C611A15DA00D663994846C504CA22DD580ABB2E30F406A7440B238AD151758515B047C226153A3931B7C4E3F74889E9FE2C7CCD7BFA5DFE8D70F1D38155289E1D2D55E3159C07E4692D1D937C0011D Key = 8EDE3C0F2485BA4D271AF1A14FCB7B9D104EB76E09BC74A854F73ED8D6CE64AB26162E0CB1BF890331686EF493F4D9355C242F9F5921ABC4DB31D18EA638D895 Nonce = 4F6060E046D31FC96021507D1B1F7E4C In = D69D8AEB53EBDCDBAA012D5FB0F3F2081DA76982B0A3FDF9B2B30A6080EAB923F9E1AC5846AE2B85F63780EF92673780EF724BB6328D2A76F77923DB1A82982222BBA8E996678C3B20BAB4396B3F234C349285B38391A2E6DED26BC0CD92132BC5AA83D3E6DE09C847476776C59D167EF081A3ADAB47E0551BC304FEF5BB7D3BA7FAE7187E971CFC6BC2DD6A5DDE7092 Out = DF12C4796004ABD43A0C77F0957B6DABB890BEC6819FE27DFC8D63BE5661BB46C6FB3E39E0C2BDF89DFD781FAED9939092FD7FCAAAB6B82C469DEAA9EF52069100436601BD409D444DCE19BD87EDC6CE973EE2B2877E6C31613D18DDEA67F51FDF6C1394FB7463BA08A8431280A3228E53CA6F6158596A3C3E779619B816A1A9BECF84D9B948842C3C32104BB7D4C71B Key = FB6C4EE5B44336B3513FBB1A6568546B9255D5417A453CD7BD056205F777C5F05C80B109D76D32AB6E81497B1798E009909A7249D92E7FF80585ECCABE09515E Nonce = 77C060C9615D7CBA606F943299740EEC In = A0238A55E1AF5AF4EC55B1660A51EE7C3B45868487D7CE808A521E39766D389EF6C9B9768D7F97305A9C57E0589425E51F4FA6137C30E76A5F298D0EEBE07AB53E93AB49C63A7EAB441F7B1CAA6A61A4E81341E1CA784F5DE330CC93E8831E6A11725191D4B9C601B3C0C1411587CB9189FA4FAB48173BF342BF411AD86210CF89B015AD104E47CBD4FE6D51531E846485 Out = E5E404C161E65FD1BA86DD5FE29BDFD03DA4293A0E0BB211AADF6F71D7ECB7042094A19948A27A653C213CC317C86A61A13AA7C83DEE76FC3FE9ACE61FBDF5C6EC2244E238C8C30234275AFA9486536CF81FD60844CF3F981B743AF0B87563006B9693ADBCF2541462654EC438FDE2CE65BF7F81206AB1C692589B7D293EB02537429B0062F39CD9741D577133F2CBF51C Key = D3A7712282A755A22CB17176560345E8775C3D19499BC51272C2EB12D7359FB5BDE1F74AB0930D919AEA9ECAF4CB9E77F188432C39BC37C47FA6FBAB6B0600DA Nonce = 59A6EBCD762486D7F9B1EB5DC2E59DE7 In = 833F44D9CA5D1E449AF04E987842C3B41FBE6C4B68FA49FE5299FFA5D44EEE1EC20610C83005FAA10AE792201D2AB21D38FA16DA871A5A1CD3E4F33B4B97D7056D8F4A8F8C5E2D3BED2DA938AB80F8A313C75C8644A47322AA2DA9AD0F1148670C15EBB25388C4E8AF6021797084E0B6FE4811146ED33A0E516BC969703569A134756C00ADBB6E468D21F46F6A706FC87085 Out = 39AA1DA3E9BE202090936EA41491A9AB803E587CB900E1080F77BBF2EA1482E75E01AD7B9F62DC87C9A50FC10BF927A6D06607C4C5E137DB32E7A89DD5675BEFADC05CE6E4E447C592541DD7B137D8FD5C9E16072C6B2B99EC8A7937B213C00EB78F2C76EDCD5D64C8081F4CCE69948D75800E7C18493971B32258879530FD2066529CC6B6134CD9A34053558B947338DBEA Key = FF50D6009692A4656CEB5AD776E69FA55B07870564723F3C4E5EE65BEB053D4F08E4DBA15081424EA9689FA6F893B9161C3FBAA7EBD910FE81657685EE009858 Nonce = EBCA601EDD1F962B139D2DC595737C43 In = CAA2D0C1473747DBB283A4FEA119B70A020ADCDED0C16FA43BCABB211EB7D9841CC6DC7C8912307DC06EF8A30F5DF7301C221C1E9C0F4FA439A70CE9B7F292F9387BC279EE15B559F5506983B48A6EC164DF2D0CA2C114458D1E39CBBF7AE599C4C2AE85DC02CD58D9EEE82CFA5CDA3F7A1EE4CCEA8E3247A69448551FE39F59B8F3EC7B4C2C6939A9CEECC8B8C868FFDCC3D2 Out = FD97837BF9D3F50B1363CBA08028F29580E1BEC32C31B99AF140E1BBF8675D146720C727E038D626E949EA68E11A50974DB42E0798CDE9C3C1F5FC25205F6F10B541933FCEEB4190D38E9FCD0C3A8AC4A5C041DF1CD9487B5478E24DDB2C51157924528592D9ADF093F8689F03D5EA3F04BB340CDA50EDD20E219BDE3F61F6A7D96ECDB169DA7300B0D0F16FCCAFB064E4A6FB Key = 0148EB1C26916C7D4399D14B11177CBBE12E40FB4793B2D9D545D86B4489882AA40C71A1678A1CEEBE68CCBDF20AA3DE2DD4562F4505EB9974341B4CCF0937CE Nonce = F070781A32003D20773C27840AF449D8 In = 18CB59AB4115FD49269438F2135E1DF69C5F599A0E6D74D7B25EE0DBC768947B9BDE8BF1DBC72C72163C4610EBFA251C84D14AC27C5C8C0AA819C8D07025233629C9BBB7F26443C1252DAE5E29A2E26676709E0DC0BA3322437CB2269937D461E0DC366035C17868FF7EC65625A864E4F9DA97B57B04426F02BBD357F2C03220AC4E6B1D55225FCC6FC82975CD7D80B0CBD53A5F Out = 711D01E11145CE9B88F7A6C0DBCEB7A5208ADCF4C6A20A258CF307B9E17A3352C49930479F23BCD9B3FE145FE821537AF6E57E8FA79E916F5133A8F8303EDF57DF919BEC301127B521337AA129F52707B0FE2127F7D49CCD2509F50F4EF63931DE626E23844AD4925FAB2EB39FCF57365D2E7B06FBE32D8FFB9C2CFC63ED177236C79B9EB8FF69EB3BED7B7E5F39558991691669 Key = 635F6FB4B93E5D997E8229AD36357850BABEB96EDEB6D3E0C0077772784F3326673C04CD4052A914E4A083F6C1D369242D145205EAFEBB8B10FD8D21510624D1 Nonce = 78E5D339434BE5D744906DFB6C36355F In = C101DE3BC4ED6917EE34D2967ED3F11FA9ADB53D27A657BF6736E7DABB33686F022565033B9F349C53048257919F90539AA17600D5027C475C05CA56AF72C256DB7627E7199399513C6CD92598B150562D945572EA9D73FD2CAACC638B9122415AE8AE028AAE6F8FF3F7247D4CBFD533813B6A4410FAD2B94463DAE3FF5578895C47350AD95F26F37731B56B2AD1EADE9F9663D752 Out = E5E12CD8D80BA44BDB7753FE86CEB0AE4AEAC30A1C1D531445F4B4FFD070FB041F0CC48DE1C0739F862C8A3FA3477620100A46A643A5A40DCC8773A31AFCF5AE9E29FA6AF612D39D7C99059E55C46A4A45149D3FE7F640841046D5438C76BBF437E6EF01369A37ACE3127159B657312175F800E25FD390BAB0E44BAAE0CB2960E6BB270CFAA0D3173630C885CED0370F0E97311AC6 Key = 17A8A4A8BBA9EE594818C91B97407C3BB8066960B83FF216E8FD855DE3BFB1F47119D9BAAD2962037254FF5C60A8609978F2C2CCD6C75D773CBF92FDF6A3A13D Nonce = 97C290F3C7EFED5EC7F31E4C2AC2EB3A In = D4AA658933CED4AD151674F5F1B17B767D978E0895C138E6F1CB1AE89C59A9314570C31B447036CFB4859D24343A59E147C009B07ABB8ADECA7537E368AA18C708341432E48AE06BAA2175FEB0AB4D32C544F0B225DA52830196EBE12C61F0481423EA8773F5113FE28BB4D888DDF54F3994BD631B59FF98982D4C56181C892AEC9ADA5C9FD487797ECACA38EB8445D4EA1CA367DEEF Out = B742DF92E3FA1A7846F7AEB6AAE3607A47A7BC20B52D7A4209786DE110D3D0FD154C5620F7F5BC396EC21E3C3E9FE46B7F527413657D589C16B991A96BCA7524819729329CA94C9719123EF2BD9A371730E6E0A658BD6113C301B3EC8007CC4756F7138AA06137D333A986833839AECAB325611B869D02F771EAE7385BA3A0193BFBA89081D2FD96507CAF0EA504C717D9807C1F2272 Key = 05FDB8E1957E1BB719C1FD3A4392D95847B861D556A39F3A97E27206B63E86425D262AA31BC580180479509D18BC3BE0A4F62C50E451D0015F05E98EDFBE97D4 Nonce = C8779A846670B7EDEBF457C76926E84D In = E1E6BD03BAEB87DF26924E9A6E2F739D8AC726805C3D154A19A2DDE6F84BCBB0804BB4D5B126763A124D51DC569E91A88720446A60764F0C253C3B946434CB4A3B82E5ECEBE87F3172DAEEAF7FB4868EAD2E2AF903774CC66E67041BC9DC4A5858083A1DE4B694D7121AD9A9098598E4300C67C8AD0E860826A0FBAECE31713590B3295E5A264798120A3223474DFF5B3DD28A286AB8E3 Out = 20882F1BD13FD6CAC712CDDADF035CB41D16A5D78B2F7F0CB7FACC0DB80A76752400EE878D05AE00874CA4B0AF7208A9E8A142F690767BE5078711197850207C039DBDA3DF165CD94C0B7CFA2CB481E891401A44F696DABA86DABB63044369331EF12BBA9F1981B3256AED90251600BA91AC3641C917E2457B60F78939E62B8AC89D1720CAF9543AC689B0D5CDE0BCA9D9EB0AD86188D4 Key = 1FD85C1CCC7F8AC116367B040C3F53378BA7D9EF793E3F8C595BFA66C017F53B7E82B43A30BEAC9ECDCB66BD1E825887D9AA5AF65E74A092FD489512CFBC5D9D Nonce = C5228BB3100D3BA341297226B5B2BB19 In = 48BA18139223316087102714AA4D2DB6945A1E9BE9930B2856CA187E57B02CFCEB82B5CE50275EF772F4A1DF4FABC008361721C62DDF1B01CE50DE2A628B2B2A61B0D1FF3E2960143D021ED80166B26EC293F9088B46518B9EF163884A3A09CBBB46CF6E298E0A859B240CAB3F105ED768FA90DCA66AE7239D2EFD3B7E7BA7E77D815DC9F16F824D0F25BA2971367517A159EDCE93660BB8 Out = 2F5BCBEC75FB0AFB8F39C2F48F593F6863AC5B055B815DE9D56E848070398BBE8341709E21855FE009CE7430127AD445642327E7641B83CDA94DB3F6098700B8B524AC2D029B31BE6A75F29FE0B92D0DF86C098BC0C7169BC1AEDE9800DBBF18D4C5AAA8D082B357EEAF2930BDCD658644B0AF7F116B63FC79ADF5A6D5CACCDECCDD0D05CD6D1ED79D77490C0A092628072128D408EA4DB2 Key = D418E11CAB049E5B4876B581F353904F8E54B5BED4062A6DB854460DD7BC805323CF1EA9DCFF0659FCE3AC5D58E8ABBBEB0EA73E119B0AFB872EE3B3294F91F8 Nonce = 3B2DCE189596B5A09D7768766C76346B In = BEE3329E50CEB79B31E9145D8BFF1641A6CD1EF4241E9CEB1250F8CF86046BDE097DBE79B48305C3E41B0A7A8CF1067544477BF309567C2087D9DF818F0737E612F426AC6587E3693F3673453E6C05B0E5831382EA23E322698EF85176DF77E218ADE52491412AE0C119711E75183024F89B4031612517F39DC3E656C8A648B852DBEFE0F28A25CBB6D3C706A09506B3307713D418268A3CE0 Out = 2E5B93BC1B4034410445C296C713E8EBE4EE088BF8305BFF5213EF4C10B1D8599AE54F20F5C21B1E98D974C8712D0C224E75CD88127F999EB0CEB7C232777B65D45C32D2690FFA784AA0DD97E679A962434921F57E59A7B0DA7A07D5F7EE026C969CA5BF389F9F777D2B4158AC000CF8BDE62E4CF92ED98DA63BC33E5D6C20CDF15423FEAC6F6FA541875FCBC84300795F270287F610C5C117 Key = FC858C754F5A0F6DBC4CA9B4EE8794B7AB138D8217EA31D9E0471DD4E4B29E7A341EE5E9D4AA9F5744DFF2F5BD4591E6D383B68ADE59CA5BACE4897E154F5A60 Nonce = DDD32533E7CCE75D145F9E75C9750FBC In = 9D75AF0B17241AE6B15AD8DE9E59C030FDF300456210A11773EACFA00046BE3D03F06FC5AF5247FBBC63EEBB98048E0BB173BD52734C643D394B7535F981481A940AF69B7FF5AE956B5BBF6306559E43B10E1F578E49BA6F8D3C029AEB96338AE2FEC116B72C9C520BCC211D11CD0C4AA953CEA83AFA45497B15C5152452691A70A261E29636D90B203C88DE29ED31A1F2C03EC3E8CD142A9637 Out = A24F09563DE9C2E63CF5202F2F8898836E46914C020F726ACE3D2D9B5C9D24432B02972DF083DA78975F76E1CF2928647BA5559D1AC9D26FFC1324E6E75F0327E800950D10014FFE349E0C22B3370F8AE8C8FEE323E4AEB2846EAAC6A8FFE791FE75B76730947A1054FFD391CE88C06C835A48F8D0E302E9009F8E7D2F7E343E057FCB9C1D6E25D40B818536602CD4F5F28F8A591ECADF6D1DA7 Key = A96E4AFE8841E78095ACE8DC9DFA0B9C1D239E9B9EC21B4D621F537E116FF538B3D980C69FD454144ADEAC7E8F48CB1E78DE10535D4B769C4635D467005739BD Nonce = 67CC9400071631DA0E28D38D62A9263C In = 03147E9D41521AFEA74653C51F86AEBE54795997840CBCDF01C83F5C5CC51840693ECF171F848909E6958B6293C6E2A6F998A5202461A99447B5701DC2DA093DCF94E88F7704BB25CB2FB16B9EC84D0E5B20895A5BB413359EC2166EBB1C7FC52B9A8302A05C638BB2AEB43CACEC2167598E5B92DC202DC0E1843C827770A502C65BC54D956C0B8B6817F1D9D85B37B50F5FB9BFFA9B3FD4E987C4 Out = DEF9E127A66407CD5B20C71CD91703044DF8EDE655529EF193399AC127D9B76370606D7F187CC343E855967814B3BF265C3EC1FEA8017395B81BC9AF54F23A053B71EFD3E03A847E0B0B74A367E4F4400F0513A171066E2175E9404B3E06373F3F568F4F2BB15031884406E67FA4A101D428446BB0093B8ADD0BECC1F5EC81F3DAD6C20101D53046AA5478B6DE03199D4A9FD9CA0B7FF7E0378E02 Key = 3FAAEB0FE51CCF58ED4421CB967C3CB22EE234F137C9D68FDA639A466BDD053AF1FE32D00A5E74F0E180330CFE861D55CDE113EFB9AD4287C0E0F33060B8A067 Nonce = 12C67C590BFA135904A8B77A80F68C44 In = A5713A182C829934B7589CAC856F5708C8E0450466AA0E2BFE735A7F0B287914F35D7E549B27AA7679F5C4644DDA3FEF0A5735017F9AFDBBC9651C05B5658CA86CD4632ABA3F521A73BC0CE784CF1CC744EB9C54081EA55EDA3842E2745052DD23E7DCF4933E2AD0723F652DE05CD6BF70D0E24CA0AD224DA11AC44C85E78540FAE16F4856CC5A372E1F4BD2D8205E2113636FE3582FD8EBF963C952 Out = 77ACB02AB169E65C492B408FFAD8317B07475DB66E41D6EBCBDD7E70FA8BCB6CFE7C44ADD7275D5EC85591F211720548DF116E162F92653E06BDE5DC3E8702281D7CF91DBEB76BE4F1D0200DD3DAE721FC0C9689E57D84BE555CBA33BAF9B85C59F420BE49707EE2E74A35787A95EECE418ACC88EFF8204535F9E8A994D9A434FBAFAA1AC8E715609CA00813A40BB8F2122556F8429D6FD88D61ABA1 Key = 0A5989484C2CC25ED6B739204B3CEFC7A0F6326FD225BF223F4BE2A5E0487D627C76ECB1198EEDC7336B8AA14DD2F8035F5D0D3044BBC856103415D7D78F3D2D Nonce = ADF628CAF9C5F249CCAF2CC89E34F9B3 In = 42C92C6513FBEEEA129DA7673A4B246AE288ECA8D04D34C6E3AB623115520ABE6E45936F7384770108888CF3A10D09CC20C31DB156D15925098751E32AD9946E2351A0CC3E50DB76BD9FDD8358252FB8A09AF008C72D08DB74042C0481633F2D7E200CD391C46683A8279101521E8358DB666061B03E2647AF84E9C647950647A641ABF8F23A23647908B92F4775CB46706C08CACFCA1BC510A7D83E6D Out = 2304811988309197D798FCD10C2AC5A6ADC402446A3E63B23845D09685BA50899291854C68207C5EA3CDD1701858D7EEEFF7AE5644048E3D9FF9386FA0EC6873F4E2A4860270E59EE4379D803C520F54B1850BF27B492C39BA8680E780AC3A4824D390F889B1E7BC150C5BF4BE22258AF437E6FDBB15AFB559771695E4C2EFE4192860637F59F7DE1CC86426E8AFAAF8B723B24A338C12325AB5F9D472 Key = 8DF9E4EB57FF2ED6DE948B6B53939D80515E38B1F955F07CBB3E0414ACF716EE82272E447DF64ECB6A6A230A1A6ADB94CD218828833E6A7BAA9BC1D43A8A30E8 Nonce = 0D7A40C5C46B0C04CDE693840874C7D5 In = 3470A4AD21C00C966B17BC8DD5F8569ED0B854FCB9BE74EEE1FA807E54E9C1A70571CD0F553739C27754F6CCE705BBBD76FE1E8EDF3B4A7A84F5DABEC5B651F476762D369D1BF6B9A21EA657FBA7BC44639299736E24F1AAE37C9CA21F053444F916530A01A7B8CEE66083D7E0FAA85FC4094AEAC43F196FD5FD529382F932E8B90C17F60CE51E08BDDC990B0FDD976F9F30FC787F0C6374A98E40E220C5 Out = 833FF82B7FE76670DBDF9933776CADC86CF3BCED569A04C6004A47F88C13102C0D6093D01674DE7F6EEA71553D34B4827003FB12A5F5A8FD20545BAE090E7DF22FBC615DC47200267626F9044220CE27DCB0AC24B5B581E98A29E8B10AA3334CB12C414A9B373E9273E23D5D8AEFF865DB27C2EB0A59FE44342ED12743F26DBBEC77B832C5871F3E0F5427DB47BA22DD2A1C6CE269EF8FE1308EB2CCF1E3 Key = FFA0B110904FBD276074A7585BDC073542F0034E762C00884A0569A6E0058B05F19812F21EB21E481C08F570F263310B9682514B48AD0AAD863E1988B428F8E1 Nonce = C3FEB8E49005914DCEA75C320A69AF24 In = 36A07EC7777182BD6833687D237C92C4FF12A24D910F7C4CEB0ED4DC399AEA57AEF55D8E545BC50C081E6A4A77E6485EC6FFBCB81CC41169B136D772E541D73B1669316FB67EF6C70986FF1F2AF1068EE7EDEA2AEAF19483C31A56468FDDE03A09F3EB4658A11192AD64791ED8A06252E30AD2CDD693A8C4D5E76D083FA632F80F85FE7A834DF7113928C5E1553D5EB05333E807C4D74B2D7ACB6432D9718A Out = 6D00149CB8CC148F4227EC5861D9389BDCA9292E6A1667F14F6CE272CAD86DDFE9A3F54246793B2526B28F0EA618B4AD632E7EB49CE05F13E310F39CE4C21811473BD0B3A8FD0679387849ECA70F9BDCABB40D18A25152CE4A74AB4D737564242FB7202D61A5D565DC46DE56768257C9574AD55E383C805C1CEEE9EA319C55A4119A98839D9C606CAFC075BD588219392C95CFCA2F8B6E7DF01E81DFE17A19 Key = BA3B88F214DB327F4C47A42B238762FABF73318D0DDC9B5D3DC33C9746E57DBC39B91B4B1E1D755A1555E68CC291EE37788DB23A4ABE2FB465B112EEE06BBEF1 Nonce = 431630AE857DB77B8B64A7737A10FD50 In = D5503CA5AC2C07FEBA34D137985EE68693FF2361277A64004DA80FB35099AF4508815D78EBD6A28B27CF8162735C59C70EB6FC670BB1B75A0E22D18EB156AA823644C15E197BC32C140AC1FA0D8EED8B66A5AABDD8070BA1340064F50918FA8208A880E8197CFFCA0D7A781554480E4980D740712DF402A864649E610608CCA503B66E1A09F353500753658E17D44A98761D84D34282489CFDB2EE5039AC3777 Out = B21860D696ECA1216FF45105567831F5FD1315CED5F35F21428F9CDD2BECDBE397E6A69BD6E5B801F83542D8A67C52DCBB2766B7338DDE2299B61683487138349AB68B13970169672740286ED4F4E0A66050A72BEE429BCBE298FB07E16561B20E36F5C1FCC4AFFAE0A5DF457821F313F6581998BEEB7C0495296961DAA703FCA6CAA584C049960D0136617174F24549BBFCD5164939CAF8CD7DE9049CA4164B Key = 9071A109B17914BECE4D1A15CCC15DBD3B93D7673DC4688316E20F209A242B4CD234F600F1424294AD432B9738194C033AC38729E47296777311F2FCF46EA18E Nonce = 616BB9EDC46DECB42DD47FDE2D98F30E In = 7933C19B0664A9A404E294A17F621506BCF48B8D9348BF1F6EBDE1246082E8D85ABE46D9CD7F6F05C8EB495C6A06EDBCBB1232BE78A450A9DDF6EFEDDA19E1235D367E519C7FD30A4B085154B019B8D31E50F86EA0F8CA9C925D79DAACE28B357CD8A58B7B478676BABFF33D3EA0238C8EBBEE6A9DC2B9FF1D869FB9B8E51586994320CAA7DDBBD1692EC82FBD96C35EF128946DAF1F1735D247161E6EE649C59D Out = B6153EF1CA49763F3C73AAE1E00B3291322E66C5A6014DFC9FB8E9DAB772F89BF1B9ACFC7541D6F505A690AD554175AD596A479AA79A717818200B36C8333379A9E0EDA8356426D9C6CF88BA8D6A2E4924A6E74D31717520AF104B3D4172D5216430B4ED1350AA9E89C8FA71BBA84238EDBB543BB97A719467237AA4472E581533D213BEB73F12500861B79A6CA05AC7D8FE8082175E2206185A12CE78B102191C Key = 9556F6DD01DD1CB5BFF6F98A783DDD7307DF95CAE25E3A037B351ECEA74D1208A091C68699D0109FD41B04C7D36C38D4944BB04D3051246316D7606F8A7C3FD6 Nonce = C52EAC897B1C92C2ACBF5D77E9CDCF3E In = 76503039E69DCCBC4387A31C0D693F362C4A66FF6FB90A2587D9D21A6BFC1FE738F7F561A3145E7619FED0A474BA9280743EC3A71F8E74F52D7FA77CE0CA4E478B7274ED1945A53A60317E7A954298EB6CF64921E31051E1BB0AC0ED1B91D12D38B5F80E3D5118D02B6D168B5E7EF256673502709674CFA0918CF9384994283EED8C31FF1B0B2098787F578206AFAAB591572EEE220AEDAE302A0C4392C5ED9BCC5A Out = D008E55E9E942051A6CF11E35B4A70B11103819D8C3C09592455DF6C53878B0984DD9128D44787881D8B8A8048E43CE56D009FA26E3C238B6D2D1FC001D697252CE3DAAC10AB31E2D4E4ED25476E2523F99B19D44897802D8CD4E28E8B552BAD3975CDCB7EE3847B279787A1BAB79EA062AF2934A83CD7A6543E2F2CA9B55542B0E11E93C41652DE73EB476D29E119413D8BA37C25AA31C559D51AD8689DF2D3A70C Key = 498BC2D54FDBE02095B0A00BA331ADE4EBD6D14A26F40CF6E96F1C56DA08A282D76EDA26B76D41399D66F91D8555AF54561ED162D5EAD46D96714BBC93AA192C Nonce = 01CC772A3EBA55EC4E5B5F03C0ABA17C In = 0E830E756DAC3A93AC9ABD80D932502CEF5EECB6CB6B9C903440D9026A529F173388AF70A2DAB1D38DE42EB02EE5BCF6C80B00FE9E0A06E5164B8FD04123DAD8FBC5D78B3C5028FEF7576D7BEB80D346958A351B54308D32700C063F0843C8214823A10323A5AE8DBCAC8734AC9B05795F807D265E74F4BA942ED9761398F19914E9EBE95DBE972E51F6E7174702E04C7C42878B81C81335F0BF648BC00183A8EBF69A Out = B7BBE2A819733E59278E0ADEA206FB156335C366DADB423076690A939E345F7AF2944F9C502B409ECC94BDDA44F8CD295F2333BCE4A6C930255F72A1E43A4E6798912D1E9C6738BFD68E93A8EB83D74C0CA0CC64014E696CF64568D8A31F3242489FE61941F6AD0F9B38BD5B90C781678301E41C6B82F324578F88EF6F157EA6328842BBAD08841AB90BDDB8FF08CA9F2443FE9AAF299076F792FE03380A4DB2F11F69 Key = 65E574BDC8C3C861F0F81E8FBEEF4244E66BEF56FEDAED4A8E76BB2D04B71D444A1E547BE8E7EC806A716C893D30AE91B0F7DAE1AC0DCC7B079133457B9CBD9B Nonce = 4B067CE2104FC2BA17A59292432380DD In = 44A0FD4C39905A704FACABEF27F0CDD8A2ED0E141AB6F112EEE466650F3A1D2874351198294910C484ABC870E028A24EBEE81403148C4DC2B912A3C36D218A334FD846E3D0DF3C8110EFCB04FDCE27EFBE2F776691BD4218D3C3370AD5F57D76C09B6A078964EBF9756D50C7910D10DBFF369F40420DCB202E601333C6455846AC4ED3AB70444379FBADFD0549439FDAFBC61C532E7EF8FEC3B39378CB84A79256F714EB Out = D95488EC9DF7882AB907604B632EA32C98BE5500F9FDC6D79C2630A8CC87429744044B4BCADDE1C86B24E222AA4FAEF13F909D57A495D1715994ED49D04B7ED72829C8CCC2303A4426F7A17135B33E54683B457C08016A7BAF4B0B1AA825DDA36968E6180EA33FEF561C191CFCE5EDE2372E05230B7DD98676DF6E282F14467E040A489DFAFA6DF71F713CFBFCB188E861C60CED4B181FF435D7A1F04CD331EA544F789A Key = 6694D4039045434C986BFFC8CF2E65A74929FCD8C50CA9CC66089AF5D78D69F3D1CDEADEE07951AAC601D30DFE6C0F919DBD2818B77E8FF68F6F22AA51ED658A Nonce = 569097E3EF1545EEDFF918679624C54C In = 15CAA9DFE923DB957602D0D9EC9277AE8FC7603DF72B1707C05E96A9E5AB6E9B17C1C7E4AB57A3495DC3D353A5E7FB29D1764DE841C600B0621FF0AD0AD3FE5E58B674329462EE4DFB3EBF4BAE3B5E23145ED32FD199F206BF8AE1591E9B84596942745A0BD313AE2B45B77428066C6D0FD3166C6C98FB8B87865F65F382F74F831BD2D2CBC83E63243B025FE0F695961A2E0B5DDF2569C3A81F6EA61A7013A6C7E7109E63 Out = 61B18CE005D9ABE43785073DB58262109AF3A1626551E1E436DB6B11DE937691EFC9394A230A9D7AB375072F69C102AFC2B0967E24C6B38CF6E62AF31182F723C425581394535E4FB5FE7C1C95677C5EFE70884E3A137D5DBB76BFAF3304398283F4572C19FBB0070C33C902554D0E689D908800DFE277AF9C0F07AAAB1CE449F3AA8AE0B3FAE7922E35690A969C7C11B45D806CA65F40B614B90ED2ACBE2C8E701AC1B8B5 Key = 56E4DE4690A9C46E1A2BD088605E4AAC59BA6628B8AFE9767A4A86B97DF7F2543F4FAA1F63A6CCB9237491D909D11A38E029633B4C98F7A9D6291EC8AAA70035 Nonce = F87BA2EE1032135EE28BA4194C35AA92 In = 61EA089EB8475C4738FB91F5741D5BFFDEC475D53C2DC443F353659BB1219582F67F18F3C580A8C7DAC724911D482034AA5742C56DFD3650E513461EE5E71DE717A2C76C0D284925BF627ED228AED4A47E9AE12CCF8BF1B31D3FAB701AC1338D728E340B3321686DE327D74E81B87A1FDF144EFF120106A0A0572DCB55FDCB8D917BBA5CB49B0D602A3400F991EACD3CCE8771C1E1A495F7AACACBBF4106AF418F9BBA5771E4 Out = 321D87BA6DEC0981D1499FFEAB9141FF884CE06AF69477923F67DE22EB3E38BB250C67FE84CBFD89F43CD9381B980604046602B9AA9F4B021B433ACD69B400DF32EB486835AC655BC2677E6128A3E5E038022C627B332EEF2F9587B7754B4D867D0D321AFE23AC60928D3A625CFF873525EF77CF941DBAACD7B56859D0EBC69318DAE44FED8B48ABC1C8F65DB354E9C2ABB26EDE74290001E7024CF7FE812A801B448B5B44CB Key = BFA826E4AC4DFE776D0DF8DDDA39793DA889F672D5FB898B25B285B3F42BC784325E1E409EB4D0B5DAD7F7E42164DBC6BB892FA87ECEAE137EC3A0ECD2484F42 Nonce = FED7CA3DA1BCA3994D0D3AE147E3F1FE In = F4DE4E8FE4D647944E70CABC8F6787CF0156E743D6F3B4E3F27D0E657E1E6D1CD52F150F98FE1011DABD857C393C1486F4DF8CB2C137F114D97C5F920B1515F83BC052B9A2BE132F0A26116CCB2DFFCE3E8F59F9E7851EB7ACEB35D92DCD3BDC0433416BD95D10FF72F3D8787F0C165CE6F46DAE2321B3826543683BB1A22E399CF3D18F2B44A805096EF15AF31FE70B86E24AAE7C0BB8EE124C5F8CC894348FD1421675CE9102 Out = 711011467AA91B37B7E949CB306AFD30D35C3162F57D2064EDCECA43FE94F91B90A70506FC0BC9D24D0AAE3D3845F46440E2EBCF6E9B1DC2A0D9CB633A872CD191F9CDC7F09167A2E8BEB18EA6C4FDD214A261A64F81A847AB87A3FB8D51098FD429402DA76DBAA038E615924042EAE29219AEDD14859A66222A2F7286507F92C295583787756972F2F5BEECE05BE8D76CE08522AFB1F582B10947BF3B1AE5943D3A89E6486F26 Key = A6D9FB1C7D20E7E3F9AB81BE975B7674F7BC5A4DC6FBFC0F485FFB634FE3728E90AA7C2A76010209579B4CF9636C9D556A0D8FFC97158580966786E0FA3339F6 Nonce = E72B8B864E1AC1D51B6E0396D5778F2E In = 9BDF21BACDEEC9C34656B418A5B9D470FC9A3AB86C68990A86B1D4B02AC6C54BF88E3CBE9863AE6B8BDDD3EE59DFF09D81FAAC5AA76ACB601E677B1009A995FA394DCE8FEFF5C3F0374009243BF87F1FC941B933C92D0359766612672D6A1B3B3C29763B4D7F976457C2A643FEF87CBCFB5257FC60869983F901E7E237AAC0D3CAF0F1780E0E2F72A9D60224FAC80633FA7A54688EB7E045D61D6684B4467797E1C4ADDA2A27D031 Out = E9D79BCF79A2A078664921A91E2E0173BDD20B32E0F232FB9F0518C3E495767B625C554C33D7E3A81865B6624B5A1899EAE6E5114BCC28D687FBF5D1D469994804D571FAE3F08F067CAF4D398C74893FC7CC11C732EA5A4D0021BB3C364E82B3BB551C71AB76E913C6AAECD9BCD4FF31D0110DE721A5E7CA5064705EE203085397B9DFF75765ED9A421455C18F3C1FFAAAB0C3E22760CF14362FDC103DFB3BD97F7DE86FB8302DF1 Key = 0876B75D86B0A36967F5661E5A0C95366ACF00EBDB818C98C0B37F67DC1D026A84BF9B5D6C1E33695CA4CAA9645F02C8ADDB0177C7716569FED8190DE3D30FC7 Nonce = 3670D6E827B6FF18102339B4CA24E91E In = C615DB8A7FBE10BD792680B7F7A7E48A70085D124BDB7C124044EDF76E496D4409BFBD10D139D1D22E0DFB52D02F3CEC8BD070A9C0638B03224ED25A2C893452F4B472F7C7533068A579734299877E6DC52564AA0F66B1E71A58F4788E83AB8CA7F35315B2FA08EC34843BDAC9B92D845F9597674FC6FC8C8541384A3C1A1B3BB7E0387381F9A5B2BD498DD59AA1A08E6A6A388440C5086B9800B2DFD0C35F4029D13384CF63C3469C Out = 66D12F0BDF0BAE2D12CF375A16552CAFA371FB4B79B474DC46EE1975561AD92BF0A5B8F3F72CF1D714C38A345A651A34BFFF24B9ED6945D6C08FBCB6B850888808AD3EF5EFDDFB4B4B43A33B250AD57D6313E9DC5E02603E0DBF72643432AFE44397CB5FF4B04D318DA22C85298024B359C61C09459B09C95A679C81657E5819A6A4B2FCEB6C18B81B4268D2642BEF0673537AD4CE74450A05C3E830E9472E11A97FA954AA443A6A1E Key = AADE70F812A185B4D67FC5C427481DEBCB79980A027C5ABD52C89650406065CD2CF08437640DF24229C21630B3266031B788B2AE460BEB1C7F34FFCCD1C266BD Nonce = 05B5EB69C7A36A842F6A45DBF6613778 In = 4DAABEE4430E71DF544C7153760D76529E89A09C83354D8D3525366DFA2924C4A9423D196DA121B7E0586F6E8A05937C99984A15C242CAC0EB9E461E1F38222A27FD3A580E56B119B654A5E28124EA01401EBDDC252926E2FCA5E891896082181C9E611CA9688E0BDB6978936518C1F2413DB9E27E54B1F01266A56DA1F7514719AED12F6FC127D651643886C21AEBD1EBEB6CE0E2F1B7203ABA4266D5B44F3802B43A08A60F9734CE3A Out = 77A9EA4431E790EE78704CC10EE82F2B5C4A43EE8D7398CE0D625EDC68C3C378143F8A3DDE0E0E72D5ADBCA3C0C517A2F97B69B0306212D448773F8B62BE84A9D2674B83DA8820ED7D50B430148EE4C73305244E2D399A0EAF27A97EAC959C209841CC030EFEE1773F057A87711CFF16D749BFF94A1078E0BFD0B619F19A911215218E114E02832AEC05239345A785006AA1C1E2EF1124EA1FD7CE51D16D433819F4E2C4C5E8850E7267 Key = 0C7FBA046B2175D2B3BF6525C5105A6BA8E22A2BB2E690A7A76557345DC5CE807C4F77C663794B302789C3EBFC45C150253DF057C4807BEF45BB3AEB57D27866 Nonce = A75C7C67A7226C4A4E172D168F7DB0EC In = E5D58C8D66D6C1DF53B695E13B0F6E93E7057683B59D0DAA79014121FA3DF062F56927A97D17B28AD6E0A8A8E83B9BB0E790A666B2D7AE8FDC5256F7C0AFB4927D8555842C9E19C97D131BE5FEC8175C2EEC3CCFCC1C8B5CEADF2EECF03E3F71FC8977B439693B6E2DB84E679EFFE5C0AD2B44560FD7CCB771DDECF7424B9189916310B3E0FF79814E486C62D418ED244A31B7618C74039BCC04F021728E28B42D607A3E3C0F31FCEA10E4 Out = D487D3F8D0DC54E4EB2A3777A55E57C87D433B3854F8495F26A1FFCFAE49C756B792544CD401D1DBCF36663DB13002FDE299307BD725CB37D6C8280E3B20F5E94A361F10656B0EEA72AC11856CBC5A73869365B5F8FCFCF1F3F8ED11AB15563832409CC58A4426BB3F7CF045114CF7F9DA17CE656BC6A2E5FB5A26E2EDFF2986AC4C6A44FCD78DA5809DBA5101416A5AE721965A975C9018788DB1B3539225528538E94B684005BAE66120 Key = 1C9DCF071F81ECBB4386E500216795CC0979594AC95241A0F2F202BDCBF8B77176C548C4F1571F1691082BFF1E26B0E7CC015915DDF2760A38E16D55B8C212F4 Nonce = 585958A7ED4EFB97BA1AB7A92522D8E4 In = 725923CAFE2455B46A3813C76B715AD76E8D6CA4CCAB579F0211CC0B772C157B7010056014A6FAF65CC52991A1B3D39E4CEDA5E53B82F9A8335E774667671D13B427D136C76F253BAAC9F960F4C0367C30C1957F4A22270F25092DD747704C309F19FFC8D47BD85776F37DF72DC15C1BFADF76D22856CC28B1D84684F2E6EFDE8C4E4F1964330560CFAC1F7B2051F2F1AAEFE6C46A5531D92A6ED61D3ED651AA457E829E06C71BC366820111 Out = DD9A6B60EFF42B4E2B13824037D3F9BC1B056A74C57568E346777F48C69BCE8BF14D538AE10935417F12A2C6458B918974B43A9E31FEB55B417C1FF9280A70ECB86CA2DB8A3D7192E0AAE59F05B3975215F5B5D03D84704D52EA9ED6DD4FBD1F1BFA8BDBEFC81BC66ECA8F2C29DC363782069E2A48CBAE2DB493EFD985E290A764F68F2923D1471057DC7140F6ACEF2C1496646FD10B3951E0A98C866840938B2477FD8C8FB894916CDCAA88 Key = 292D541B90F12BC9D268B003B8AEF93C70359B399071DD816019478C5F7AE956E26F04EF8BBB550C8696D648BB34B20AFC4B6297738A20CF9605C6DA9918B00D Nonce = 6AF134B839C4586554F6B98F18B3C39B In = A42241E600E862D1C77E1436444EE3B8A0511731401E818D10F7F1B9C88AB1EF34069B3871977FAA5F3514B56126F628CC74755A945E31E2C06AB83EBCC999DE1185CDAB0612DE962CC5FD8E9A833C79015E835BE196541E8EB6B67E9B14F9F65B667996B2B303DB5CD970C959BE43EEE4BC87F6F8515969131F93BAD5CA40A984C5BF7CC7BE8667476A3BCE769ABDBD38247B3C1A63B85137864FAF437C2C32A4314A0A178B224F3C3FB91AE6 Out = AEB660ED08E1E60446F7E33BC58383A8657DA89D98F8D6502E95ED5E7545676A8872DF494C4727A2D2A1A3BB98E03244D025BF8D6E236EC2B7269B88ECBDE6CC439021B6899F0D95317D46043A61F37F13B95A6FB341C9D9752639241C29171B71453D0EDE1FD8A550463F1A800591D707393039A24381E9D374336B488739E730F31D8FDDA00B3080B7321D3982EE7C249CD44DF0791FBE1F6AF49DB67089C4BAC7E11BC91EF0471BAE50E6DD Key = 814C64722D7CA27312FBD5032C9C452D049506B169B1702C0167D2E6263226DA3F3807C80537D28DCE20DF7272FEF6C9B68531FEA7A5636DD03352BA34A82C84 Nonce = 5A0AABED7BC74F505383C8A83799C279 In = 6516603026A028BF08B715FA5093F2B413629C9D69BCE927B0B36F1EA333376FC3D1A34CDCB69D85B387E5446E04C6118184D9792B8C95EE7A571359B49C56E5EF20A4F841045AE2EB6EF03EE7C7CE9AABC2B7AAEA125EEDA2C9671FE9C96654599FED61D0D757DACAF13E20D64BCACDB2F0ECAF43A641BF009BD3329DD9629528694B8BDBCC500795ADC1F079C4C4F8533DDE9518BE5557D882FB0CF95642540F4C74E65493475C9D090DC630A9 Out = 5704C3A40BCB401405997DA8ECF098B74B279E95E7F3F0146C8BDAF118B858E46A4FBCAA54295F374B922E35A8C8E0F5C5B85CE0324F8DF48D3C5F14694887DEEEC108B317FAFEC0D16B46BAF7BD5AB433913DBF19F4B57587AC1A95BE356878DB5F3A3B67EC35F777A0892652FD9D7335E737FB7F6A8558DB61D50E1B621D3473066BACE07091DC1916AE80495606F483B055D9D557B22AE00012893894BD274741501220A903A51A8157A76F0D Key = 58F525BA87C99CACA875FE49FA6CA0E406C6D6A4437F7A5F118350503933DAED77B7C64F01750302AEA446BA04AEFF44B58953F32DFEBD1A95F537A1404169E8 Nonce = 32352F6E9C939DFBD0CDB248266B0327 In = D47D85E7D6B191D37DBA9080DED2BC59E19D7F038A8349BFB9DAC98D648F6AC7D95C3B78D5672DC70192005C785BF9656DBE02ED74CAB53B7582A82EE67F00FBB1EAAE04C77555807A6B7A8BC7BDAA66EFBDCCB104B33ACF797E08A85E2942B6A4E759BBC941597B0FB189F57D85A300E3A0ECF56F782BBC487E714A47B8C5BD50A506696C9F1C1FC0383E2235E6BDACB3E89D89739263BE47906CB893C332CCF16C52B0D11AB7839576FBBD7054D3 Out = 91E239A8F026CEBFD5CE2E25F44F2658C7F204AC5563FA454C966BCA94A0467DAE4AF239DCAEB3D46EDC25F474D2E6A8251660748C69C2CDABF7F6CC3E3421476F533631055E9E519CB6C5DC76CE2814B6638C91C8AD7F3D1567B37EF2B58BBDCEE30C3B2207A00AA25C02A670E2D3305040E7B492816C9E83C29090BD2C71B24BE4DCE9123710A56FF1910FFBD7229FF82BFCEE5A66043CDB1AC06416070F9AC7A6A7D7014DEF1E64FA309D4E2A31 Key = B4915E26309027540ABCDD44373B0962902D039EC5F2C8D65EF6038F9853521F8B8CBECF748B309BAB17AF2DB24515C39153233D6B85B61EB9FA4122A943277F Nonce = FB9A3D0FCF6E73F05FBEE5CB85F1962B In = 27E638B2D906D09F193FE1588D325CE0DDA1A1A028EDC800BACB847FF74E6A7DF41E525FA991203309FC49375B1B39EC57F7BE082C80BB972B3D8E88794F95A0882B3868406CB4E02C4D3DB6B45FAB106FDC56F32E7E39E4E7BB6B2F24F2224523E95D47D24D95A1F300DB37BA4E8141F4B885100B9783783B4AA38539028FFB735EF697EB9043DA064DDDD8E8D08BB0442DE254CB604E89F7C7D82FBF366F62801FBFA4A2B01C3ECF26C9C4C5E0272E Out = 22995D449720E1E0F27F3CEE80C2D8B821E31527A48E72818FB5DC7C5F7476D2629D8CC26F64DB533CB1342A965C19D32359ED7C59ADFE2C219ABD547A9C907BCDEE220DAD3156ED92B5A4B92FE6023CC632233142AE32639EB74A7EA47A59C3837594C2BABB21A51DC47B1F19D6C0369D4DF14C00B9AD9267779774753D505913528AEFD93DF0C004F10DA9163AA0C871DA275531D74F9EE3099BE82EFB3216D80A2DB5AE0CAC7F3007C73E493DDC9B Key = F1BD3EF165421B150DB578BB945B77D81DE4801B62577F1B9392F33BABBB37330C044EC6CF464C3E9B87FFAC2EB150660F486BFD9554DFDCEB772676C45A9E8B Nonce = 69BC3A2DFD5BFCBDCD523D3C774D3A1E In = 66148853A971DBCBC5541C6EC2AA9F439F5CE613F1FDC1F764093E5B4DA40C6BB7DE5605E24468CE0C890B56E9286DB8646BB1B68EC671ACEC0D62137DD2D714C9E6D21AC97A1044CD1B87803C8CA697657122B8795EB73D6BB9A83BD5EB7E01BEE2614A528D20067F7CEA20A2CF6BC8371511E9A68C922C72898EEC6D636B8F3AAC321EC1DF477CF04D3AA07D6581C846633AFA18E5C3A1D6FC3F1A0D0D49130F52E497BF34DCEE95E9A4907A525486B4 Out = 1914CF1496620C8879F505103D41BD647450DD9AB88886DE7AFB7A607FC71FD613BA2D8FF0A5340CDBF4CD65F1DDE94CCE6CD8206B6039E5EF17C90FB4CBD2E7186894109FA8B7FDA6DC90B0248344AB2C61EC746330A2D71B794935D8BD295C2DE123041E9A54E12A042611DF5A7CEDAB6E43D7ECB4AEE98435772795612FBCE8DCFCB415DB01ECAFB9E93ACFDE2B0FD7B4F2BC6B30BFCD3292EA1D96BE61C1542CB2CA2392F0A10A13A362D5E50F6F9F Key = E5D8BC2238FAD3A3C3C565D1CBEF967BAFBE088DFB95B676C383B4699EC71B4CF74B89828261F76EAFCB0A465D111C0FF74417A517646A1F7C96904991DD5B16 Nonce = 0F1F5163DB41F49F89BCE003EB792854 In = 9EED8E0BB550F5CA3D84E1D73A8AF5C2AADCC2D0DA607DC25C801F5C4F1910A5E9A119C5E979E0C87E1E70EAA6BA18EFF168C0B38E6EAFF8D6549CB2C2D9BD35B5C3CE74D6B836A5E1A4CBBE60BAB759C0DC3161D2A0877A3E1E93DDD0593AFC955229B6AFD95497EDDE5D518675B11C645105C989DDF00D39B32DF0B9D233957AF786D1AE6351FBDF768EA4A0B36E7E4731C3A8FEE0C4DE6F22706FD968B9E7853261F77B115195D580BB116EC94D1CF60E Out = 9DCAEB90ED5B080CC167C05F7172A1CCCA7A48EA953AAD28EC40357FFE7AB3A82E00A0704DD7E2FD2CA8AE715E66EF2DFCEA1561E8F454487F79D9FC342B405DBD38F0F0824B72341996F33FE002837C710988D24759B9EB57F55B488D7C01FC8ED053726766318DD88DD954D586754FB1737E820D984859731C4DE9AAB23E4BBD79A2F4F6F71E5F52591028DE8F1819D2B9B141C5F52B47DB979187273FECF6A5E1572EDA6A7E4702228344548BD17FC19E Key = A187D9D49AC60D22EF8B3D47E295C028EC4DF05BF802EB6993A0BC52A16239C5B949869D0B4148C93584C5B77D9B72529DC9031583EF5BFA790888B84D504C60 Nonce = 55E37CD32E66714191798C6280AD75FF In = CB36C255CDF2768A8F29740B45507A28E0E3EE1865A78B6C35666C6311B4FC5EC134AA4EF3629A497AC3BDC913BF8523C439436886D1C9AF3DA480D0CF6C3A616547EAF9486CBC4F99B0AA15D84EFB8919431AE33DB44B99855486DB4C0B5CB20C85F73A2142D18D89B771F394D78DD30CA9903830DFE140230F6F2A43B19F83CA3FBB62358CA6A33F264DD31963E73ECA7B2DB42D7F62C04228596FD670E60A20355A4B4DEC2FED6C653F89C4E21D2C19F104 Out = 28D0A0033B0578BFC8E60566F79D393E96B76AF08B8F55771DFB81D7734EC27E8241FFB17EA4A7B3A7932B96D52107EE052C94FE8B8DFCF25A7D8CE97FE88CEAA9C10B3CDDAC754DF37FC30892B3DF44962B1CBCF25A0F0F1F0C1312B4791E51882773D9999F7599B8C967C94D76DCC57A470DA60A49E47C5E46D5F8A47594C7C7D2DEBF234307F55CF027D2E550055B70F16787E29A9D917A48FF0D15121C0F55248720975950959B59C0D24053033F641E8F Key = AB1A21714751B51353C601C85F2D5DC6729E59601B14D2E2020393A6CD0EC9D49F886ED07EFDA183EB93BA58BA704DD9DE5511116D806071C83FF1D955D20014 Nonce = 9F9F9D6FB6C4B8A62E97C7B5D67974E4 In = C38C7287D2765DD0D483FC4F41FDB5CE6DF637B0E792343E95F14CF4A7CEB1775B01A3AD4E63C0B77ABF6640C6D0C37B88D3B4EE9AC568F7840DCB00BD30DC6A3B1A9C67552FEB0938B5B881F2EAC65A56E524BCEDF332272D88F241BCBDC41768C64A5E834F7599526D27E5F63F0C94587B512713E816689E7B69A3FCEEA70759A0BD736D56A735C1AC3929CF36CF38C3C1160FEF59698B5544486CFAF53680FFBA6797CB4D7570EFEC48E0E7C097C4F009BA6E Out = 201E4B369B955710982E88F22E2214D51AD805D99C3D9F2C43E04F08A81441650775AC589BCC4760F592921222D772E672F1247A502CBE2405DD4432EA73E2F75FFE441A11D0C6F25C6290A99C98FE6BA02907671DBC94F65E4AFDF6D0E63A6BD2F7923A8D3BF2ABCBF3487D37ECFC74F5D0E2B6646AD9E6A04B273F6936A2EA43B49512AD9D81A793286A7BA42C27A04B2258583B6A32BED901F161D3AA5F50DA26D33539C093301456EE68254894F4B1DCEC66 Key = AA6935EDB7F287F5BF42A259EA65459847631BF11DF4082A0C2702278ACD6ED9DA5C54DA6B10032CDAD18EEFDEAFD8749B422B04747B3D4DBFE22C1200A1727F Nonce = E9514BA0F3B74767B55EFC4595A2F122 In = 7625E6E5003EC257F2B9255A341663E01BD6398D2C5458DC4C0DE6B9A77D3A455D75193B1F33E5CD1D8B16C3386BF4CBB356C299F8B24FAA389B297EDE289F7A8FCF4DAEBD45918D9E98E3EA7EDA78115E3826BABB48E786444A691969C6C1857D6B511388700285DBBCD44336B89B9E033EBFCA3A35093A6B41F5FF54495C11D2C87FBB43168A89C10E755BA40156D25926D1148C97A0A0412B952821D2C0D325E6649CB409201045AF041820248D78C1D00C95A1 Out = 1BE68233BC6557601760BC9121BA5CE47D6B911C046D4D2DF5EB111C66563E1974F88C509F97703A4427A2936AE8180AD0513288530BBE5365EBA31BAEAAC6226DE2D1F093956B5A97BD0FDFAE55ABF54B8A91197805899DF5BF6F84652113EB27991887A560CE3A093BC74B7B0A25719E5DD2F3B07D5A7831EA0A99C6A16A6BE527E4AF6CE7BAF5C7744F27B98D9E2F9981246765913E537AC69B3E04D31B5AD5F9EBD55664A7DD7ADD8984984F08E64F8598A766 Key = 4AAD546B1D34CD5179D90DD836B6E761475F23CA09ACA77D2970344C8D6C216B56B8C9FD859739234C763546EED4E7ADCC225829C8E9152A4BA31F7D16010E04 Nonce = 6452C6862482AFBFF4C91F74F679CB10 In = 7DE539616CDC8A30DD4E001B3386D7E4A1F61BCE4FAFD5C16FCF2E23F724C39E31B2DA02A91CB4CFFDE8A3D0F95710D07C6CC95727C62F2C72B243740324D0AEEC52FE624C9F3348C996756D251EE46E4764D933EF36356E4B409FF116F08E5EC4D765DD048D1BC49B9A02456A01261E877D713DAF44500B27B0C2EBDBBE0020AF0AADA465EF984A89ABCB6E74D514188689F0DA488EB0A0BE9B7F9A46F132FD11EB69277BC0ABF65216F7745250FF64A9F4B5D5EF62 Out = 49A858D82A3D9C7B7A38D4F7C9C2961D83345DA52C75DBAE7BEDF317DD54078409E7B914CF2B08A080ACE50654A87454247978AE5F1AA86C065A5EE8666FD4E06A15AE11EE6388811BF94DFA3FFC3F8ECD2ECDA464A57373A79C06CA4109C59370C9DAC196BBE7063FDC4DA048E5DD50D216EEDB03DC1D52DAE59A32F38C50EF19935111EF3DDF28E46236DA0EE77C2833FCC38E465C8EC67DCC3DC2C28873DA05EC0B9B6D651B4CC2B3245B4479A04A7EBDCBF21D87 Key = E66CEAA1B5D4E2BC78F7E03C6F86A292FE0392806D8F9C282C47746926A549044D47254C861A9427CFA3A33CB685635BDE03E61B644544E65055A25B873BBD83 Nonce = 02863060B296D8EFD8F4A7D266F968FE In = 8F986144100B7EAF52726D8E75E605D1F65DBEDE7B19D041E9C79F009A6EBC130A059DF15C1FA42E501A87F112C335D2C8FC4E9B95267B06F7327A9BCE3AD29B9E44F119C53BA3238E77278EE6CA3B01AF2B0264E855FAA245FEB8B602D4F80331CCB7225971347061CCAA19B58C25B234B84C99330946360476825E1B71A22CD01EA8911932A2EF373E4EF0B6DFACA348CCE90E6EB8D51C2816DAA66FEC8A24D2EFAB20D0CEFE91E4566A613695F6016A29099B209D4F Out = 2099C28E7762689917BC6AE46C861C3C633B3D74C7DED7C005FD6AD6E938110710B29F8D39D1DD74A114A4B4EC66890769D6F596B00D8A48AC4266419A379E0743F5CA3AE2EAC7BF7BED592FD62DC0758475808C0BF3CBC60184B9BC0F5D62D2DDFF525384916C03E5DB56490711FA1363B208DA8C1FB70E17849804E1F3534FB14B1DA63B6DC02C4870A89A9E332351AAA91256E917F96FACF4F55E91968B0C55FC2ED242104330F91D30810F503B1DE9CBED1BCD6D48 Key = 23963ACF25AF2227DD843B7409FDC3DA5E9E9316F81EE8B5A2CCCEB1C69F58A322F707272DA8B4C76E0CFF5F965594D17C1DEC5D44B1A3950837D73A6C95F725 Nonce = ECAC60D619A3E3E751D0FFAD0663AB1B In = BEA4C330CAE5A15DBC4E0158F6D37B5566F75395BB7596C13552DEF57219E86EE1F2FE2CF7E6AD6ED4013389469F027C2B6F6AD77EA0E914927460789F8E06BFF978CA7968B3651498BA72BE1C0F355EE0F44EE1B8C9082D8A97BD11FD9E82534F953270B0B011CE2BC49DDD8A2E7F8DB7CA6A157A40430869ADCF23C0EBC1742716F5DA731EC2B7EAFA0C631A78F3FE7291B93BAEFE1891FFB194E748A6416587302D8829EC154C0A5D2CA11603DED4A0CED38935696882 Out = B30A92B97E9D0BFE0710CDA1E1A3D7587C9D826E98B0E154FFCCE257D7957F52DDCF98C0B0189C64FB0A39A5826AA79B4C3B33677EC3A4E3D5E83C00BD80EF5048E30D046C5FF5CA46078E162F2B00B0CCCA53E33F1E6D7299E3C5ECCC8E501F7DC5CCBB2EE3C9E71F631D262BB75E040C62AF05FD9053105BFDF8AB364E8E579C730C063D4CDC736DB879342278DDADB53FE897D9F08C58C77749E889509FE547692ACD2053BD90A0F4DAB93D61FE75EFB8A59F5EEC8DFE Key = ACA7EE3DD9555536B650F4F53F0BA1152D8F60A870D55D425E041D9F9AB94FA2CBD6971F6464B9F489C03F0CD5DCD9A019BEB956C17B6DBAF5C2E04D16995A91 Nonce = 543D3D2F92BC46A81426EAC0CB795D69 In = 62664913FBB5B6456D74DBC567A448DF9376AE6FCCB0F38727BB5CA072924B387C8A3537DEA6B5513DB0B013E400A6BFAF7E00AEE97EBD6D2A214546593C6F148F0969317A559923E27FCBB196267B35268468F4FDA36D34B4572013642F32B69DD0A340E55D57477149F119483C552D6E5145C5AE95ADC85277DC7ABEC1FD9637E80CBC7385B81AAC1DD0B3B900D3C9DF9BC074420373B8DE3236BE220B0BEB2CF1E8F764B9994A3A77EE53856C9894E0A2580749E133F4C2 Out = C7D2A1E0FC1E4CD8BAA5EDD7DA174699990711CA471FCB435232AEE487CA370B84AFCF6515A13ED8311BDE1DCE8BB7044D96F6C9874CF2763811099F5FA3554B8EA0D43016BC9AF6D4D77129E4E81402D3A5DC59E81CCEB5C69F96CAF9AF52B99E9BA2BC7CD39FC98A01B70A0E0FCE3D5967DDB47C1809AAF3FABC75D83EACFA249CCC1B245FF3E19DFA351E2E87F39C30DB4E5735A128F717A637801216D7BF8AA3F4F299CB7267DB3DB2D5023A575B6084EF609E3410DCD4 Key = D19F3D8BBD36A2ECA71AD0FD1E03CB29B66CA129D1517552FC28A88FD866C2393A9140F010115225190B71D8E48C502F249717D002D0AAF0879AA7CB39862FD3 Nonce = 2C3C41E91B8680B9A65C23255CD0F3A9 In = C3C494F351BF2D314A4FA0A5A8E0119F8E0506AE2F030C75ACE586F3A0A9AAD956467F81607F3787AD327B11E9073F2C750AA1069C838A5FBF57352BFFE0049CA63718DF8B9272F20E7BEEE83DBE61AB8436642F1D05D2C8C1DBF607488CBE457D57CF85C249F1D5EC6779A008F698CE8DAA4640B4A18C99CB6E21DB641464BA3178064B8A49FF4F997D64B2C1CD3E6FCC590501AF2DBD55E4BADE852AB17E8B80759BCFB24E9B8C0288EA1BDBB14B03D2FF32A5FA63CEF6E32B Out = 0E322AB41B4454267E0E0B7024AE969089C272429B389F74ED19065AD285081D070CE8240E6FD0BF0C4AA4F1DB361C22634E81E3973AD9354B8DAEB208E9F6D29EB44439CF2E513019E4B3C7FF09CE129559462842C478608BBA469A8F08D6087D8D2DAC87241B1046A3F208DA0B5F0D3AD7A6A20072B10B3D36BF45C67E3CDE5D99EA175AA9B84BDCB0424D821E403093732DFA97A7F65C8D68F6EF21A7BE7FAC92D7E7A192AD7DC7460FBB2ED1E0DD0225B576F1481130AA02 Key = 637A99C167656B03D87D8C25DBE63ACE3F771D9650E7B3E51EB800B1BDE1D1AC400DF68864CAC55B5116C59C7493B5131E5B9AF1A76D209F55B1357795D38544 Nonce = B0DC648EAFA497C868805B7FA3E20FB1 In = B9C3725BBD665B4E0A5AA9663FCA7078CC2036B7B7E9F2955E0C1E82257A5484D3B4A20D9EF0437412DCA170507ACD8B48D576F18113AC9D191435EC91C6C03C2E81BC3945477320FB4114D4AC917014341CFA083E25A7AC0C28FBA6309E7F996EADF2B641B156A7C82E68878251D2AEAA5A6828AC2E157B62A2B16409C25D09EE882148C0D184EEDC8F533BE34585E6A20559379E6AF753D9899F65E87BA1CEF8E0BF6E3CA80A984814E9E87D004F81BF2F8575D159A27090AD7A Out = 8AD45617139ED7C6DCA516B45F0B216F5AEB276043224330CE8D418C82AEF428090055E1BCB54860BF0DAE0A344862EAEC249B92DBADCF931EB157A98F857189F6C558696A797B23C224B36E5D94E36CFBCD2A9228A71F732EB77EAC86BE4343F165012AC4AF8046214C3CEED46CF29C5C05CED26EF65E3E301582506394E92E5885960B13A2E1A7F543B6757B36D17A71BEB2D8F81FC7B7EF7D3D6E9ABCCF1C6983B49B4D3083F4F7425CB7FD842AD4FE76757BF3C5D45EC1E3F6 Key = 19CA3AD5BE5FE687923D51770953F1A8E94EDAEC453F43ACE7FFA2AF41BB18CFE619F1D53B86223A444DFD9C3033C51AF5B20E9840EED823180FA574407B4E42 Nonce = A84B2B2DCCB8DAC4B99040F05A69F77A In = 47816E0BBBF336A85EA59E248A3BB0FE6A7642C9E85F177D045738D642D5FB2E78531AEB81427B829C439A7A305C020356DB936B9FEC36AF4E863004F329799B3EE3916C01C6157F637296864516117E838815696A9787423ED8E3F0AE8AE66DF8C3044772435FCBC630084D31945A4AADF087ED22B178B5DC8CCA72BBB4C3A0BFEFA407A3F9C45816966CE4910054D9D06F28EEAB8CC9F91004A5C89B19FEA770B0942B87F6E795556A8E4D42CE252018E908273C442606244A3C72 Out = 4549FA2E7E9E84F05256156EE62A8E16193261954AEFFD85C0EA3AB1A81EA1C55EDE1DD0525EDAA1A30F5A47666697E54602A8343AD642848E5AF59D89340D89EA685478B738804C7BF108A964B6AFAE9C60DBD8AE863107722A877DAEB28924B1DD946CA03FA3F2CEA414A4BA157C187A53666ADE8AB3B9FC163453CB492938884ACF0DE9002511F41246A3D871F15B90A813189541EF6C6CEC1D91F9933C80C41EDA3775A681CDFD4B180402538B925901390CCFD7FD827B3586F6 Key = EA4E575BA26D7118D5652C6206A0D552DE2D60E39569D87634E3F130BB85FF39E5E72877B8475AA59609633C378CBCA9D463B523BFD221833626F35C9768CAAC Nonce = 0A232936E17DA9455384EBA191207CA5 In = F9B097CF2AAAB035BEA4DD3153A397FD44179D7A7EA9F6ABF7000B10E1AAF0224F40B5767D9A2DB43BBCFD14D35154AD975061C9423AEE456546BF80ECB9FE51B0E3E894D39AF72B8A589352E4094FD71A5EDF6B3290529012D20C4B946B4C9CDC30FDBACFAB60B9F8B48555C1FA40866F2E6A7B61147035A6B97A0669A0668C67329E4D1AAE9C599E107C9E15895C2869C2DB70F20B8541A8238A7918829160FD31854D2C9F16CDF0EB730E60DA72E16FF58BBCAA37DA0A6FA8970AC5 Out = AF1941EADF7EE25C41E40C9CB5206B312C1E3B568825AC2CF2FC0D97ED98978CBCC713BAAE8ADCCAA654A029690921F766306B886FC970115DE7E38753B14B0C9954587826AD95F6CBC27C34BAB95EED0DB93F082F8AFC4BF1A9FD9F3B90622708FC2B14E81460320A4C4D8545F30D04EB5393A82E1134BCD183E6A77A56C4B5C6E9B83DCFEF8262B08D32A9E8DF9C033984416912C93AD09BE869B043E862698D660ADA549635D9C9A8D45D40F26B5BEC11396B480243332531B5F121 Key = FDA8EEF72F4FB65FB0147AD49CD00036B0B4C2E604CF9E4BC9FA99964CD97304221DA1AA2DAE411D7D7D88CCE21A69F735826EDF0322166565352A15D2D25A5D Nonce = 4CA75D128185C53C071D9C57D2820202 In = 93F7C2B2EB2E8C0684F0F60300ED17418275F09A7E826A61DA4D28B2B0D72A209330DA4694147DA1957D761E3D50F1CFF760AE7BB222E1C1B0A8DB34E156AD4512EC4FEB15236B580CF45CF13DB8379C6E3EA61D506CD6748312B321AF52BF583AE86A14CA2F22FE8571B8B7DCACD4266035A5E3829647B8696A413BAC0B703984AF99AAA229814DD94CC045DB8CF0A9B2E6B743B7A1180B512CBF0E80D853CE6E4E0C304D970D92F38D0D4E9B954CD14172F1745A69C4A82BE358FD8386 Out = B9020967A74C6EE0B02D9A42263045CF5F88934FF5C5F90E9355EDA925DDEE949DB4C1600CD0F720C65332180D99ECAF376626067E31D665361E21D5B72FF9330ED7EE4E7D1FCFDAD0159AF07F60E4E2F35BA4AA4373B1DE845F56B5725476564D240CCA4CFA4063C374DC6BFA5FFB5C454B35409F5C69C49FE1C50E02A85357E3ADA166496A82C864A44065D8D38F9722DE5CAD066ECB4D327E8952CB4A80B38C5E76A1EB48EB6E249A5D04942146B1342C948369D250E6BFB32EB01A0A Key = 65ECAB031D16120E74B745A1BAAE66B69994D210622A996E618E1B3ADE7581969522A973336CD20E0ABEB9395D1ECBF2254F4FE7C3C98FB5BB7C7BB9E00986B6 Nonce = B8119F4F1169A094C93698B0CF33385F In = DFE82B84B22984A80EDA7A031493A56262693C41E0F08A27A80667D168DD6704B8D82F92DEA1EDB2D4174E4017C4CE1D7E66506BDE130E2256385920D3D1E272226C94330812CACFECC96BA9232905B74915DA30F7A233D8C961C6977DBFB64626158E37A9878D26B85328E8A79097190A3F5F339E4AE201F8858C98AF5C5994E858CFC8D34268689818CB2867705708BBD9CFFE88B2CF16C018DC47D730A6A5B4B951AC57E99DCA5FA4E172A4A2292E1827F2ECEF94FF483962651404F64D Out = 9E9F025C8199E0AE3BBF78AF8131DD0E8CE35E330A50431BFC619BB8071480C949B896BEE8BEF08E383EEEDA92BF950EE45F8F335EB006DACC17A9C5FB3294CFBAA2FCCF7819BB1DD7F645C5F21B08204AA9D89083648FDCDCC451B39BED9CF8D61D79308DC80FFD04A901F1796CA15A9436D9E8F56C03858B8C31EEC9633D0F29FACAECCCCD1E26E27A9B4B75F0CFFA89F93FF7B4C370B1224F3A99624770BF956E69E60444BD81521DB8CA8694942824B0719846C75001F466A2D72CED4D Key = 60CF7CEE39E10377D97679D791DA74E1767A6E47BA720AA78EE6A16F84A7B69A9C7DD398CB04A08DF6A70C4BBB48F84495A69F185C37B1DE2213F8F206C29F1F Nonce = E3ADD082F8D83F9040BEB9352888EDAC In = 6AD77D39118158C637757331C96E96EA0083B575AC901DBA359D5986FCB7FC95D0EBC94C1BDB41096DB2283D46FF939D42CDE66E2D186C2D93D74CAB23C385748083F63AEA5E7CE8DAACF3FDE49F599405B96DA231124F4A1810A5B0EB9486925C86C1E5AB95D26A6C6E28127A2AE877B70C9E6EE94FCD47B642224262FDCD055A7219C76F74E8541289263A38039AEC327D50B4FDBC3F33E5E9DC1D74CF65A0F0DF10B5AB7189FB19EA765BF8D7080AA563E62265FB59DA8C92D21EFDF19C14 Out = 76C872A42D922821FE22FEC8BCD179F4C775FB3010C57A2F3E10F6DE19DC60F338E81D4D36E3C07E9736FD837BBDA7574CAB760E3EFB5E55BA954C0FAD01B472CB3B159FC364EC6451D71CCC334FDEF95F38CC12757FA63005ACD6A8305BAF8B421F299B4FE02D524727D51E7E9CDBF7E3C46001EC49C5F599410D5F06E23E1330B49428CA36EA4DD7B28428AF2522C01EA9C214FB3C77BD43AF9BBAD49B8CDDBC12BC28FE1415311077F475C835728CD31E189F1E582D08254EFA4D560A44A6 Key = 621F5484DFA2D820C57EE2A0A111D6F6202F1C34197F26F03ECA92279BDC3EB0D0E974D90D8F04672A0B2D13C447B5120FFF859F57479C98C95A70FCFE9F27AC Nonce = 52C427FC02EDB8E6990F5CFA32E2409E In = 33B72ED559810D293CDAA5F90538C1288EED84BD27863A1088489F38A5DD9C15D9B63235A471B66A1D553FB94A7826852C32E64FC0C55D48D397AC368541EDDB33686C15426EE7E3F939001A1DC81F374B8804851D7870148A29FD3A76BDB8AD86CC8B5BD483F0EA0D1C40D6D22AD52A86162CC63703E0E48BAA5E7A85BDD4077B6EE61C0D27F87EAD8859181F86FBD92FF30C096F765DF0ABD9D23DFF984FE89BCB9556E03927C49A66744CC56B7B0D8DDC3A2B6DF03AE91A6545C778B287D947 Out = 569835F173A3A33F6035797D16BBD308D1B501137496BE22EF04C8C77B26A25E0AB82E81EEBC4368264B470A6057FC1F13D612DC1A73127619684F0F1A44472EB035CFE000E5ED3DEFD2938ADD11B0718DD76F8148234DC7F25470247FF46712509F886B3E21E27055662926A3375C84CF9EA31F3F2D4F877E1D9FF9F89F738853F94953AA594E51462EE0C3144E5A6592D596BEEA53271B8CD3417FBE150FFC948B652C8EC1C8715601FB02B62D0562F6526CE3E52A73B097F952A05F50F6BAC1 Key = C9FAA4A9C46B4F3A16286EB2F00F9F4B530487385AF169EBD8B6A91639E90A940B22F7E83EEB1A2D45863E042F3509326F0F51C8DD9DC35E8E7B234FAFB6DA7C Nonce = 726DD701F3623EEC8074ACB0EEE33C08 In = 558814DADEBF901790A50ED6EB7877905A7A1D08FE5BA318C7AA1D3ED42006DB7B90156D940DE3B82463B46617BED8EB3E036B689582F38BA74021BE581075299C94DB0DFADDFE12C99990DA22A72978ED81FFD9536412D82BC74A00E6BCF467BB3B777DE7D724A1EA8F3417E213E4A864A99A33F3277B5C4A4D5E6A39973733721D5E2A6973B7062A43EE925254A53C94EA7332E3F891973367FFAD4264E892678BDEF566AEDB60D4851520A22B580324EB6B0C4F04939DD8FD65843D90480A7E4D Out = E96F869FC3398DD68E2DD627DCCEE24B03EFED44B408D9D28A45B8D990619787D47A02D4AA6E2CA5D1C53A7F860A55C4E52809031B8AE6961214397A76EE6F9F5133302AB9D1EAB144638D4FF1225A1B3D3971D88770F6E1456E982A8E9CADB6794A73CAC4CDAC67A9F24E0BA09F7DCF3D18A31B9B63B5A1EF961995B11288B43E6DAF8A019F24D91CF65305411A48647870C9CA2C438707890844ABFE0EB68C2FA125B7973FA68223469EC72BB7010041C3005A2B43EB59DA1444D9C8FF4270065C Key = 6550B6EED999066C926A7CA8044157CC89681E8F12AAF07E5836592A86EC2761942BD821E0B33D93DE71F8A7C295B53F8A1DFA0D77B53DF684DE81CAEFB63E89 Nonce = F80966FA407929A27FADF059CC486A93 In = 7232544907730E42A16C9AC818D1EB8905DF1043DD3F779AB8563A6A456BB9320787B13C9FC200613607A26177DB259496F2CA94BA7BAECA2D578ABF325EBBF3D76F88102E51F254A9B3EE3277F0819C61064C81C398D0F80769CACA418E10F4ED16BF4B3039623721FCF46E30FAA7F91DC2F80B06A5438CEEF3609A902E9654AA69838D6E6E080B4F3BC1F937BC0A4855FDA9737F3AF29AFC4B05BD4850B2080F4E3877211F9E6294CE9C0209082FAB17AEF21A344B1EF8AB14F131A63088DA97C2A0 Out = 947F1F61843BE3F4027CE622E6A9F881CEF608A9961E59DD7B036284A753FFC4C3FE97354F66BE342A4DFAB4309F519D4F7DBECBBE284599DD00D1769FBB125778EA434545CD68958D5A775D3BE6DD60C056530A823B393818273602322CA9C5A5386224F33D8530E0AFD9E159B116CAC0C07B6826666539E746C72676076C17303964E3F9CD5759F30B079631D3DE70CAFDB36F751CE8E7B5E070ABE970E06E1D6685599CB4005F09924988ABD5427A45D9EF4235C269742C3EC5351272FB3BFCF8A9 Key = 11AC6CECF5F0EE65F7E80D6A67AF512EB7B78CC1AAECE515F7E18B0A134C849FFF7E0F0A0CDA0A6EDE88672CECE501D01A37FBC1512635A9A88877BB91339774 Nonce = F5D202E8898E2AF85FD6BAE92F719628 In = 8E7F1F8DC7C94A6E2161691DD0916250C3E52655DE45216820884C5703A89E6164AA94957A0BCD4DF4F7EC40DB6E8BBEAD2541A9C360B888D8D2F9A52161BF95D69848A8F30EAC6AAFBC0EBD3EE6BC5E1D1F8A1B75226A555CCB3AE468304ECED198586D9FF10DB28E7987B6D61D95A0A0010B6512987A848D9B6E5639A07A9B6C0AAD572A4462D6E33DCF27506B22B73C6427006F7CD23871414B33A2921FEDB2D495098AE7B38FF402105758915D63CFA37862B295779D43E95CA509EC171FAA7948DE Out = 88AD68CCE9BD6F09B560FC429B85E661EFE66DB2DC1FB719756858EC957E66657A4E39FCD1E4D0BDA9BFE4258DABCCD20A85025DCFAD96FA09FF4F123647F027553C16E2B44A659D833CBA9D57308EB8333DF1E9B330F2DB8BA8C7241E207F5B64637BC3A2627E0067FE86ADF812585837FC32F32C1BE8B5D55E39C3B8D9148EF835EFD92E3213CF60EA2B14051B6674AF51B6E79992C0A8A7C2C6DA82D677ADE52C5884814C696EF17F46CE7E0164F38D6729EF65767FDAF68E20352B3C0515D362DFCF Key = 25A201441FA5563112EB8A0C4B6DC434319A8DEB69847A3A5329684ACA259799995760EA8CB3529A6DA6728C3929B831E7724325CF7B8C11641447C3187C3759 Nonce = D07A20AE8E1B0F43C6D60A4EB6E5AC50 In = 823D9C292F162B6AE0791727C56C457D72123AC3DC6764ADF57526F53191440BE38A483A3E0FFE8405F1EEFC20F01B23B874F09856532A108F9B94ED5D8351D79371C3AEC1CF86D60E0DC453B267092F664D5EA27428D926AC4F93CBEDEE3078E354691FBF529716DFF11556A971F364DE4335C05AF97DF6382BE3D6D1C4EC080B99D08447DB0C680AB54C1C8AA26A41D259C7E5365EB301C1DC46651AEC6FBF4322E725DD7D51437AB3F6329BCD18543A149DE9D7F78045E5ADDE4CE87E3371855705BD8E Out = C092FC16A03F7753BAF6DBA3AC0D57EDD955C92DA7CA1DB98576944054C069BC870DE3EC175DB0952CDB6218D36230A02A29B4D81DD0E2C36BF3D9F71DD3C274E1074A8CA39112B5FB133DC30CF8072FB6CDB5371E3F52239338E98DAEEA0B4718443E5C981B18030CFEEF02DB93E673A6D810780B9AF4579D78FE55369CFC017929E390D5AE8A825ABAB2066F3FE652D12F2CA724E4576643977015F0691659B1633E0769C09285B7C0F28AB28E1AA6EC0ED70FA6AE0DEA900EB516FFAC9DCDB40CA3A9E2 Key = FE372A2BE18F88FFBEA1900463782A5210D8A533C2216E26EEDB4B3EB45D51EFCDA0E4383D3B1B09F4512F773AC3BE774B8497233F3617A2430B8D8B99DEED76 Nonce = 99B51F9AFFDC8CB26E44E0C0594C0A71 In = 64D338A2C50E45AAE4C4C07CAE9534364DD33FDCB7E8FA003234FDF883E9DDA7689E6DDCFB4FF0CBE330CF0AB5E8CEADCA1B09247101C0170469D33C52C5000208118C2D8B9D081D0C7D742A8F103567486A30526FC0898584AEB2199D8A8DBD0F48016B2F616A61F1CA3296030B1E21440BFAF92ACAF9CD5B92ECC5463BBB2F7279E75CE3C9F6BBDB42629EF59AACA1F99C07DC90280F99F0606447D0463167BCFCD1B1B5831ECA19FBBC06D35C58CAFC92FE5AACE9B5B835C882485DE0F7EB91A4B818F8EE Out = 6523C551B41765D26F70C84DC0CA497B48686E45B5A5075AACF8186DA80C6B95AD989FB89B47DECD6648219A6FE3FC0C192E758ED9DF8B4FB5D3DC039FEFDE6968C301A0A5B45DB6042BEB70BEFC1865B7F5CFA46DCC1DB4CAC3CA3435BE0BC62A42BB5B390AD43CBDEFE615ECD29DC0669A8E27B18C83281F1CCC2BD7B6C9FA5F384738D4A239E785BF2DE1F4C36C06C4FAE897872B0A90E24EC21630B39938E96EFDDEEC4C71A369888A468537F9DA9110901523CE0A4BAAE1B3AB43649C8025FD7F969F2B Key = 7FB87D898FA0D7159C3F304D34A6F313DF4335CFBF0337AAEDF5343D10AC0CA23FE7241D9BB9A21DB4BBF9D7C93EB3172A5D9E1E54A1B363A6E4EF9B1BBB55F2 Nonce = 9E264B3792B6626994A8BEC332D8D7F3 In = 5FBCB5362CE55E799FF359DDFE348F4FFDA38D5F018DB27EC692AC334DDE413EDE583F178FADBB4C3832A5DD6D588179EE4256FE449DA5617734616B2F2AD6F02AB989AC6A5423485FFE669652BED397F0E2093B4EBB38661E9D78AEF46987E7C3DEE3C6CE08BA06C4E66D722E01AA4BB662BA0BD4E0B74FEB89E895CB5077AAD0D792B344E5EF7B4B542BCE47FEAA88B7E626054BABA611577E9D20ACCCF9DB6B06C88D36E6208F6BEB2AF0DE5B7BA1EFFA8FFD01EE752C1B138D9FD8818637440805C907C59D Out = BAC7E5588759B0A24569355323DDAE5AC088266839AF916D214591A20739233E6967FCFC20044B158F1028917EE518D20F87AF47C48D976DD2B2A18C271960E08ACB0425D07B65EB16734252D9F401B19A1C5CB4F3E082AA0E511E8FC9B3D493A6ADA1A555B1262DB19902982621BAB93BBCDA75B6E1A9896F60D2A15376919F78F135F5E5B91C59023C5D7BC50C809A1EF7006B83CB6BA60AB0DF66909B535130C0193BF1F572632000D80ED77814696AD265D7CD5F45AB0DB9D73D8637C3D1B9DDE5B36EF8A1 Key = 2A11E33A15A29B8692A12C423B53A2E4073814D43F7014A2EF7FBB64199E0CDFA51F67A1681AEE396825666F944E545E23F245A11C0907B590D9F73533D0421D Nonce = 5DF45A5EB5583410E0E762B8E283E4AD In = 97F461B6865030E1AEFDBBCFBB7651242D690FBD8DB45FAAD049782616A62DADD00CFB2E7AB20A761682ECF01A8DBC3183A5C6121C3AF77E253D18AB7F0B0D808835547DB8BC41D8CD44C395CE370E6F618599576CA88A2C4DF990468D49A0D77481E1EC6ABF175F548EF0B39251F8D093A29D9667A9530E9D0BDE167C7FF118E589DA7D37D21777B7E40C56E1F216CA3660A3E1E7DF721D131424FAB29C326CE26AE08943040E0C498FE9DFE276705A7B0F526CAB8C31A970B6CAB30F7F9AC72A5196B52F8B1A43 Out = 77EA54BC4AEDE40478C90B8A50779837B8FA233595D6B7DC96EDA6220B02DAFCA083D10F73B80C4DB9AAC281AF962F72DA676F698D05E64DAFF713823EC6A4C0D1B99FA64BDF2D59C25465BABBD3E439914F5FB144430D53AFF7604B21EB619ADF33EC238691F43E930C0090BFD9DD13DFD2A62EB9C8D2BAD4E4BF750F976A498D6F9DD760F3DEC4125521F4204E662682D77E39A3B777DEAA801FF599BAA5FC8C443DE5BA453F3593768DE7CFFB3B56C1A84D4443FCC7C428A0BF7FB494CA747389F05A97FBECE3 Key = 54169450B58DC995384B56B8589582503EC0438CE981E85DB2233296E03A5C7429459207FA36859CB975E7EBBB512382FE8C9D4D86CF57976BF377B9CDE1C38B Nonce = A4947A745153886122C8FE1349D67837 In = 4E4D866DB7F432F970280097EA52E0EA81D35ED1C52C76E12061AE29EF662A5882B72913B651E810F9EE588F89444559F42DD401CE1B0B9F6D7D49148DC6D835C9A6A81193A4016057EE9DD64E902ED08474FFD916102FD27D95A60C9AD69FD93866082A0D4679F45FB8C966AC0D6508EC38D7F493924C40F3C2CDA856996933C2D4FDBB78BC2FE8D9DA5DDC49860671EE058EE6BA28B65B136F54D5999652A849DB26D27FE5641A4ADF4C104FDEB4A26F5487DBA86C9D2A62A4BC5B4511F073822D5EDBC5E3A81659 Out = 1742264209D643662553CA2E0A05B1751AF2547622ED6172F72B15B65CCF300E1E65DF050ED20F26AA5DAC492F90E58BBF278C916D9AEAA691C13497BD8DE7DB18F0A5846FECBCB2181B3C488BE7B4AE62CC13BCF9634C93BAC8C911C56497ACF776025CE29CE9A52A047A38E287D93E56DF20BEA7E6F0E897CB27E0B69F54126F1843D283C0F290800EC8B52B2EA9BAA4FA987D1E67870BC2903140ECC936827C86B610DAC2DE71D8128AA8692BF6F3790E9F518803358AEEB8588465F3956EB530467CA36DB23075 Key = 0E4189A200200CA465F873C0C73477CE503BFB689D2989E0F84247AF64D91E603153BA244AB9938B28DDEA17F062198D260D44C5518AC63C0302201B1344C08F Nonce = 8F01D0310D36ABFBB8AA420EBBCC0B00 In = F10A011C7BF73FF432007FB7E791FAB8D9651D02CD9CEF8E3A464A063AF896D81D4CE9E7081B140E2F007365B1842287D373CD228B1EDF804D68C068C0A56642C42D1C35950FEE0CA014E5EC26FA0F2D8EEF69E64102AFC9C450859914CDA8D80838191942A3B9DB71241E1092F8CA2CC4E578FFCCCE63CFE97B4DCB10485CF0E5639796521ECBA451626DE37F23416EF8FC26AE2323FB0C2AB78E067C6DC4B8C29A02663FBB25CFC99BD0AB1BCF2D282203C58E9ACDE093479D2F1644970DE8CCCFB6ECD154368A5FC8 Out = 4A563D84299330F82F07BB9C93419848446EBA03DE5B17A3444B8662626C82C5F68F9862BD203D127A40E8C7BD735BBD7C918186A12E8E94C10DF5336EB1EB1CFE04B73352B0A9C1EA4B1864F0B51CF879683909E34589B1A3FB742CFECB3A566AA0A342F741C19E9EC74E4CF1AF89015A8750AF9361D62E1FB42A75644E83B4DFF4C3FCE0FFF85AD782AD1F66BAC393BB70D767AF6E1D5B517962180CF70150E2BA56CBF632ED8545E34527B7460A359CBCCF598444B73D387B4E06E7EF061DA53A280AAF89AFB529C6 Key = 855C0899401237F2B9E2707FB02755C38E9EB2FD53E0623BAA0D3EF98DD1B0F7F26258B151415F6BF3D625EEC5A16883C52FF504E37EBEFBBE888179D56585A3 Nonce = F000E3FA7F45B7910B73D50A2E8B0FEB In = DF55686B6C5C4B07AC9D773C9B84FBF544F046522DBCFA47B31DEFC615E8243803C67B1C2E3273C239860E8DD536D19BAD4C42D9881072E04BE6BBC781D6E5E826ABCBFE9533114DDBB15DC708F6C0CFF2598713FEE9676CEAF5678C8ED38C6BB4796ADC926CCEFAC87C33EDC062D2DDF6CFBCC35F0660D8C93013170EAA779876F297B8695D87A5CAEDAF470368D50AF33ECD099B175D8DD19E82FC57621AAE9F910820E2A66C546BAB72D687EF7DCFEDFAC117E6E344D67349B794C39A3A3DAA73DF58EAB3A1268452A4 Out = 879EEDAF24203A141CA1207ECBC67264DDFB29A9ED1D8B2E06207112D8264B87463DCBCF9B010703FAB6ED619E204924F74BBE9E5F5CA84232996F21A10D0F441C4AE19D955D91B821A1C2F1D8438DA7EDA2AF012471C6201B511A665F24BC4B6EFDD03B0D87F70FF9BBEF05346F4CD537CF4A03F97675A59E89AAAACA4AE8BEC18DD5DD4A850536AE95C1B8ACAA7E3FAFB0BA27E883D90E57327B1368D181A2F1DF129FD658A077A3624489C20DB3A762CE66A2EE350438387C1D3CD86008CF70678151EA7750E55B37AD Key = 331DB15636D11BBA27FA7DDC5531C62FE1791FCECA8FF5167D0435AE89EFFE2E557B6626428669095E99B9BB08B669BCE6FFF1C43092076F41299FFC74DB33DE Nonce = CF136D9D7357C7D67E97BA403E63EE40 In = 8CE6E2EE9454B5F7EA8BD12CB2A5AA220A249271CE44B2E51C6283A9BF220C7CB09885D999ED0C111CE542D058E0CDE2564B37C46391FF64BB6994818A10462D560567FCF7FEBA75B54DA5F0C9F3B0489643FE0FB8215D5269BD53FD446BF8B65B7A16756176C84A23054FD16C8DF85A8CC71952500A387EF379CF766DF404906E34A47D6164F092DF287F2E19E464185FE11AC014EF97749225128A95AB65204891321D69B0CB0038E5107FC70DC450E4E3D1E11B642A581159EC0E5E34CAB2628A2B4DAE5FF94F24F3B21D Out = 3779E2D71D4A7B4F95024C217F29355EF163018F3466F924DEFC6AC2B249855F7943BEC5E7D7F37DD0E463CE6C277ADAB8738EF42CA056F2AA613D2F2C02B2277F914700695DA4AC794CC745EAA732B4C3E546452353332504384150A151C7789D8F196703A777E94FB4D634EF10E23AF8BBC45E920AEA05CAFABE53FA57DFEAD5339BDE2DEEB66373BCE7CEDF95A53BE10965035FB6964A9F716BB30E7258536CDF610E31CED2507843728E3CBBA81408FD248416D62F87237212A1FBBA9C934A760CEE6A32CD842D503C48 Key = C27D7529EA44721260768732C3AD8B24E3FC523213A0905D0238EB443B09E27645593372883DC1AF298EEE66C6DDD74DC45A007E0C22A5CA16CB3D2997637090 Nonce = D806638B5EBC073775377182AA6506B9 In = 714E80E6B7262BC345047BBF74BAF4C240C28128A402D3A9758590F0E564498A58E527CC323B9B45D4F89E4A6738F46695012A06C466EDCA22D0A007138D97C063032A137CB6963B850FF7FB4859664CF7B94619F870A2B3BA857AAC713CAEAC0113BB733B0361DE3F6D7526A9D30027F00EBB8FF17E301292DCB077A0044F6A307C00A3BDC798FC46EE20A87498C3B95FE7EA83EC6F204EF62385C193A9AC647F76151DC238A50780FB0A56D29B2D8CE597C0492EA4560079135504130AA4CD7419350D98ABC037016F53FE80 Out = 13721A9AD2F7F60EA7ABD6588535A7ABB74D2E68DDBB017C89E0A017D8A51B40BE749ECAE6D77FAA7355F001CB042ECF296539A9C03CC778B8693F0D0ED880A6534848A1EF61C627743E799C8DE5BC43DFCAAAAF58847C8892538281B43C274114BB193364ACE22CD93A2C4D764D691EAE8C5ED391CC2A8BE37FDEEB327414499B7166F71402EA0A017E895748AE990BFE4AA0D18C23D941BA7BE78716821459D02544437BD2F34A38AE965E269A81F4D57414E53685D8A01B1F0705C873AB4BA5B0245670BCA692173E36B45F Key = 9F2990AAA561A95239ADBC1535924CD4E588E7F8A70439E5E88D04BC94C795CD7E7AE34A586411458E1D84EAA427733AE33DC339C22E2920A987B188E5D1F293 Nonce = 84FAE789CC6DD71D5BED9323C2E72FB8 In = 4273D25B20A2AEFA2CA5432051C6B95DE336874C1063E5405E584CDF6C24E749C9A6450D350DBE46489457E58C4BCDCB5A4C4DE5407CC572285D4097B1E5571253F4937BA7848E44B8135196AEF8C867284CE2ECAE37F4D7CE69A15BE328C8568414BE88560BF25F8E00FBC2E369C6732BCD87551F7B9C1B39DB5A237AF5D3E8591E3BD9B0A431521436F286E5648A0DA116AC3982DD18FA272186293769B6BF1359CB311DF8FB408BA3C1AD95110BEC065341708AF064C8FD795E8DB95F69A962C62E9FF27EC52648FB9A274FF5 Out = 8F1120F0CB76E067DB6E7B1687C00741B32251D7FA6AC7DF2E5453989A92345A3FC5E0CC598B56327C96FA32BE2865062862703F812AC835890D40B6EDF8F8BB93834F9CB012D0ACB45FD63FBA06017584D055A7606726336AD64CF9CF339BCF2D92352E42FAA832048C9F9C0FD3CF3F8D66F7018EB7FB71773795F7B9D1AE56E146771F704911C1FE73A5B471F6224E85E287E2C6179AAF796385554F68FE919FF2F263D51189C32B7BB878BCFB694000FB2AF809E52961B90726811258F12BE83498CEA9EF253B24CBBBC7A922 Key = A9132FC52C49EA0BAFB5A6548B9917C5399FE1319A563EA44B4D39C0487154C049D21EB305A67FEAE4416F9BCB52E103DEC893E59BC33A54D7E8874AE208CE36 Nonce = 309AD070B6B593B53750224008400761 In = 06C19C37793F6850ECDB9623BA722A9CAB05CE250EB821AE57C91375C4BD3CCECF0BD950A4E1FD7E85508471922F7FD94B150352428D710F9323B2434B9E7E01E4D77F90D0E91753ABC6FAFC1AC6570E4D0A6C517508FBD73E9D58A4A0FBBED0063AB966024B8D6BA7DBC38AAA0B06F84CB0FABBF97A7939C529EB4E0A0345053CBB9ECAA8725E13005734131DF46EB90199687202A6816214A0E7AAD81981E9AF8ABDDE1609B1646A2693A8EFE5BD29DE2CF66F56C9F768C6A27372B9D649407A2426969E6276F08CE90C64B2DCD6 Out = 75DB49B13820E32B148FC7CF5C7E21C083D7BCB61AC50293FF61CEE1F9901EF040B00ED3EE647215016895629D748445F1566543F2510116FEE4961CAF8B8B71F161CA538C99F6F3E2F54980218B77BE9415E25974013BF0575DB7E3B4993D96FCF99A2A7287FA625EA0DC60D44E89E20DAB845AE1299E33EC936BC439DADCE7954538F8894BBCBB637BEB32D7C9622D0ECEB49D551B1ED0770A26145EC39BF47E14E7DFE18452F31003FAF21539163694298C7EB7FAF306F3270DAC2169D172CB60D9A58C07A7E65AF534C41EC67B Key = 755EA8EE63346E8E7BE6DEF46F5C579031D587D876AF5289A8E5392E7113292F1DF27DDD4D328F4E9E6F52913954EDDF20F5A576A378BFFB65B7E25891435DC8 Nonce = 977F8DD381F808E45C651A4BEB336799 In = C05B8538AA9113759E7D0D158FF727C4BE290D2357DCCCFB424BA08BC3E5235A67452950EE27E8C24716BFE6BF071C0D85859A320C8C872BFAB7DFA1E3E5C1174207BE841610155BE32E373509A64183FE4A05F00A99B51D214023DD41812C7832215F5B4F87AFB3231E93B7DF8F3274397A9AD5DA4197E3C7263192BF2CC3108BE40822327D2A57EBC6268D8B59A600FD0C55AB57765B0231FDEC506D9DFDD94F215859BBD3E930959DF7D6B85652C1EF482BDE7DD6C05F160ED7BD880907888DD4F877782ADD48875DD944121AD4D6 Out = 133161332BCE7B74D3BC79553ADDEE0387E035EA5A484B5F2C59898C45197989BCC3848135752FD908604CF15377C38B093CF78126B5F08EF37095164B75CB13C70BAF78A97887B7BC5F2236750A4B6F48320D851FC62A4764FAA646A388A04D997C8A8BB0822E047EB7FC4C69A6635A303A2DB2A91E715FB74AF8A96D9678C10A57F605ACD2A64E94C714B46EDC4DAD531F3A9F23055AE5EA68F9076E98F9021DD24D82DEA949C6D5F195A945178C9097D1E1738F0B8A206D7E5D458527A450A782BB4EDEC4CCD90F312FF036D76FBE Key = F0847AE871AE9B90893831C1E558ACEE64381846292C35102F699765B7B06AD279EB54F556594E2162D931F284FB48E2F26B530ADAD04D6D9C3163C29DDCDC6B Nonce = 21E6CC4D35D80D58C10223B2561F2E4A In = C843E946900F039553F3F862D50AF3E993A7E4AA4EA58EDDA4511F9F51250FA4F89688D6D8915B573E2FE257F8A75ABBE16B2E96028173BB12A6A4212FEE80677051F0D188077D3BF73DCB8865C77D2DB817C2C1035A0989A2DF7F562AB05A6153618AE7F1DD0EDA3351778B48DE902CCADCF1E33A66CDBEB03991D409FC1FF74A2DA5544D10A78D4A5B26F0084B1A863D911CAF23A5032AD29134CF98E2034384C0EFFFF2EEFD53D1750BB15E36D52CC6D346D146CA8285B49C751E147D9AFD352D90A95C44D20FF969A4538C2495F1F5 Out = 5D11A231D5F3522FA1AA113461105D9544018396F1833081E46A836ED4D8CFD4A889A53DC666B8D05C9D3E01C6740E737A4874CF6963884D6E7F287ABAC36B99B9E78B76B0C621CD275EF86F5DD2E905404E47D316510719E05958098884933068A63A22E32CD0474422FC55F404445227A8115F87663295D1F6D0EA05E187F4C1676752531C4B2AB3E2B6B0F404F09A98DE2822360691FCCD380DE1188FA998EF94069777A7AE8BB5B849DF89916CA95119D5AB3B5EC8EE0D653AC79902494F7461D04E405AE9074885F651DF539199BC Key = DFA7906EF224FBDF694195E87689536C5B4C8462A806665455EF9F65476DACDA9CFD9C5C424532F5DDAD54D7D8FA553055C8DD5A20193A3B37500BAF17370950 Nonce = 7C55B66CDD8CD368839A2545AD549F12 In = 9A555E3351A07E9DF81AF4BB95C645CBE877FC2F7AD003D8CC2277BEEBBF54EC47921AB1CDDB0720895A28D12E0DA7E00B5C549B4DE00282A4384C8D3CEC20E6D9A3A4A6D69BF09C9F3C08B6B2DE1074C31148B75210D5CCB36CC35ACE5A20ADBD524EB7F522E08837097DC692111BF6589B04B1E9CBB9C1E9DE9D523590261CD3C8000EF8ABF9CD9C6CDA4F8613CD4641C6F9AF7B6813E1097130CCDD43B33B3F9B273C43A245A5204349B63282935CAB6BF286870AF3535321D3BA94DD62AC97F50B5476636AF14309ACF169AB3190FC91 Out = 833A8801C3FF37A5A4F206ACF4EBFE2133D1D334109C856FB93DD721671B2071F22DA5872FBE43B29FD7656128D09B66E9BB630F92CDC2A132620D703165E1AB4F3949CBF6E8F4A254736AF521C1D3DBF97B5CBF9DE143969251A1B05AB96AD734FB01EAD1C9463BCE2C947E7EA10C8AE998C600A85280C09254AE651AC6F3ECDC6A52F36F31F6BC88E46F649D4687F3772A74B642495C818229A43CB6AFE8E5E100CEE924BB362B13CCB9BAEEA889E3738A0E782C68A247D95FA5D4FAA7CD1DE7C9CE671640B8415C9974991ECB5E90B339 Key = 84A24DA96DA3FA33BF463E82614F5FF6BF8E1413106BE79C4C7A6E3A33A187EF6F5544F7E48CA73B4D2D347996219264D3D6654825839D36CC6E94F293A10166 Nonce = 1799A67D65836E239161014192BE8E2B In = 34088A28DFA3292D584A845DF63886D74F6EBF84B7B3829458E732D224820AAB238E9E1E502A5368AC95A68CBCC0E4C5824009AAA3CBECA04FBF50A1C51BB247F1607E1A60CE0C97158DD44F786C3FDA89900DC393CCD3081C06E28957FEBFCF6F0EE2BC66212017984A32329269151E2D40ACBB76B5E4E11E6D93C14C0A794D33F485448770DD6AF0C0CF8A072FF1A16814053EEB10011B53DC4FE3B3417761B54FBA6DD08F800AFE7EB0BE0000412F814EF2D4B8399BE655F544F6A0FDEF196A2C06B6E7368B2B9ECC85C896BEB23A2E2F67 Out = 5048E5FD9A25F20EB0E2FAEF122A99EC11858639689F5987A6C4FE1FB80075D548C741C5CC929639C6009F9A7410DAA5C9253E5E520954BE4A903FE10C33A71724C8B0C46F7711CE9574A23EB5DBD05D437700FA7DEBBF1ABDC364F3B5AADDB04B34245F184C29512B2351145F30B1E52B778040F39EDC570976CAD206FC402A0689318325D9F32889D3D0DD863985BFB3237DADD2EDBC6B7FFCFC12569737DA572E7B81B3704585CB2DA61CDA18FDEC10C26F44085E0F5A852EDF4E3292613E2DF7F384A13EC3D310400233796BCB3D11FB45 Key = 541440D3BAF4CD676C26977ACF4617D6AF2B5FAA9E22321698B1E988087ACCE0F5E19B3BA323FD790CD30A2BE6F59FEAB0AACA0F6059EF869D49C72C5DAF73F1 Nonce = 1E9434A26DCFF2BB417B84DB44CEACE2 In = D4938BCA1201D96883D5A36A05985A6DA771CD3024F288A9C3F5AAA93C5AE53F14CF8612E48EC428665B0BAA3D85EFDC1835C82236E38E9CA86265DFA6316570776D47031558790A5778E873BD636621CD1EB6276FCBEE47504AD2AFA523CC786E33C37E6DA30118C3B2859723D33957FCACEDED68AAEA410DCC9DCF1F35BFF27BA2033064C184B04BD28B1DFDDE1CC08C808054EE5308E6447C7D77D23BC2AD05DEA5C73455C747DF65EA375DD24A79A17185BF1AE4262C2934CBA5557293A56041BB272132D4B42520E9CD5847917725640EE7 Out = 1A73411481FB309E1D3897499C980DC2A4890CF6D375674DF789D39535B4ED0C08076E33D009E87B07588A7562A40AF40943525BEF121A6C71DD8AE64769138CACCEA2B13B36DB494602DC9B71EE9BCC574F9C729400D70C85F8E502BA46AE97BB414E021B6BECC1B31353E4399CDAE0923A1B3CF7B2F23EF3EC7F7F1F540F3D3607C84E333D0EB246E6BF28F072364825F935D30911B3CCDEADA7E3C50E056BD418EEAC935F6C937ACEB88D7EC809816057A6484A9E1553A5D8498375302FA9330781B601A7E039EF2AF7E510AD017726564B23 Key = DC51876B956FED42CA6CEBEBAD31D92A3379C896937D2DB10A59B6D2662919923D9D3C4E578B2015E3383B3F93600941EF0029C8774DCAF52446597BCA6F64AC Nonce = C452174505E5832F558FB9A514C17A58 In = 8D8498D9D060DD792298C2DC1B209A363FD80B9FFF3FA3FF10931AC134AA63717BBDA6DB6F8F96A3C8FD11EFACBCF8C9F82F0377C536867CBDDE91A1A04EA493A45B43554FD5C373C5B9E16C8901AF1FE32854CBFA2089C494F9C00B015DBF2AA29FE0E052D5F5B1507BA9999E15BDA37589C3D8E731D233B8A8037FB174CD31D4F98FB4DE61C4E174D73BB53FD8DC22317338D3F6F256DEEBC500FEC9557FE7117D31E9AA251CFA06A8E7C4FDEDB4EE76269D53708D97BF2154739B41C05CE89662138C989BF4DD5B17C9D1517223FA29B0792209 Out = 32474467AACA09704DE3E77691C76D840A16C600676C6ED091EF86B4E31E0047CA9D0C74616495FEBEC14780E2CAAB2B1FFAAFABF638D0B09F29D1F1EDBF39381B1D2617C6099F5AEB0D679B12FD22FB81F43188E96DF5E315002FAA163AC440664C55B24A6B6A39BFAD865168ED2155045D6B6BE594EDD6EDE1C6DFD4D6F690CFABC46368AE683AFD75CE1493499D3D7646D52192C1445593E4D8DE7E43DDBF00E8633444B059730FBCCE51B564DB7234D34CA67AFDDF38A03E82FB15DCEF5FA0489B3505242C9C7481C4677FBF243E027C65E257 Key = 1775EAD6878EA57034A7C4171E24514E2F360A449E9B6D2606427D878CAE1808A2260544464E363930B86F165442E32680890B134F6C169841603F8DF2B18FB8 Nonce = 5ECE34595B263A5A4EA474C2F9496F8E In = F84C5474F05C4BB30F72B73964BD4EB005C0CA1C2375DE43ECBA366B8FA6FFC74E6506DE42BB78B4C16DFBA0D14FC90468EE6BDCC9D33177EC5B28E94CBDF8ACD42D76D79D7075A68F6489ED4F2739ECC146998108CD88E6A88D591707B46FE2AD2F74021006FD8B59FF70F18E5474379AB700304298C4EE9F889C5449B603F257186E82E7467D767DCEE43F1F33BA02388D5018F0B0F36B60D962CAD80D1DD001098EC8F0A05ADA6982ACB4B8AFDE5E5952559D7A690E28FA6B3B52F879FDFC4C5B33F829D864EC85894D9C60FFE69D978EFEA54AE4 Out = 518C99CCC99C66A8E47FC3F4E41B8DAE33D27B2843E51F02FF0015BF6D36684AEE10344BC69F34158803F19EFAA08183FDC6B2B2AED95DD398B4AABC8C567ED8DC6F581199597C008A39A763CFB859345874BDC8E8A6BB405E1362098E24C1729DCA334B4AF3077F4B5F672FF6B6FF209602A3B6A3F0AECF69F47EAE0880E4C42F0EECFAE50F9F5EF7B1AF119037BC8EF288797ADBA69422DF524A4490221399E47B8ABE06E5BD0AD61DF427415C4DC4DAB8B126F88F4CCFACEA237CD8761715539D68FB7D24FEFC294B9CBA4924F6A260C747FB9BFC Key = F8082513FCC96F9BE2926B447D77E8B8805D1626B35756F3C0BFA8E92C0213D626F8C767F82F3AD6219082C8249454BB5640C7B438245F6F537CB3D379AF0E1C Nonce = 7FAFD73DA2B8990650FABA66CD918127 In = 4B38B233C1EFF3329BE5122E346C59F7E15787683CAFF90069129AFCA9EA92EAED7D2A32355A49D275BAF2841D0CD6E6FE7C2E7D5C70F9AF5EF5FF1E3CC0C178A71818515DD6F36F25733A26AB17A21CDE8008C272477A495F44914466546628200154A50CAC657995E7DF2CA8633446D18059CD726F5A6FFD7289C8538E8D2DA389FFBE49484EAE75AC5B1DBFD9DE5D43DA81C7F41B08799288D62A761C8511B60E1926CC80CE6539A1721D3A2C18A7F57B2737620C34E37CB6D3016C8900D1FFE5EC64AADD4C65BF4D6A86BF12BEA4B6E8FAB3B3391A Out = 5984C4C70A614C93CF23F9BCF6D5FF8BEFF2E2CD24048E232633E56C10399E95854C30FE70BD4A151B174621B8CB7DF009699215B4BA47441A3A267C939F98EF950B23CD20879A53C678E9FA0CE4EBC218431B31586CDCD13086DDCFF661343B74CAD55B0DFF0AB49B5504EE076874E62C01D57CEBAEF070D3E761F1A5A08F40ECCDB4A58FEAEACB10C537ADF6F59AB02905B2D3AF6799E5AB8FE7C939F0794AAF9228676BB3C3C8DE45B55F37C486E683F6A7BCAF1E144CE89DE4A745F6D1E66A82EA47317C9910476682C74DBA3D04FADB6911D70010 Key = E4FE26B71D0F221D917F7138AEFE73A527C473CB5465B9E240F693C892A69C050E6DE0ACA357D653B61A418DC072C6D49588E31CCAEB42ED546663373A8A870D Nonce = C5CAE055BF18D2A1E9175A8282425F8C In = EB332D2F4C4531E2DBB33EA97D72B8805BE064FA0DA9D4525E34FBF235A907068A8FDDB91A2AF0E53B98C713790690F41617720BCCAADFF813C7044CD9AF94DB17FC072531C8101686729F25DDACDF76A8A7CEA506D2CA91FC4EBBD2807E6D10C87AE8EB51EAC125A172FA79ADA873BF2E519287D94C909797827842B600DF15EB2B4ADC0EEC77C8F46B16482F6DE8313C0B9DEF2BF17F8872713E65FB1F5C7B78543B0FB5300815231D8B39FA713D268238DB78720EF030CB183F12712B2C1E4DE82222C5EACEAAC536AB6A283C99E3AC87E638AF5ADBCC Out = 57316026D2D86FCA3C7F98E18B97988931E9CFB58243549712A960943E5B7EF621EE3676E57D6362E9312584B50A723CFE356AC9DAB2B9804B72AD9C782CA112D75B31255B9E701DB200653A160A5AF2DDEF3CD662482ACFE5A5124ACA4A4282F7A9F95870F3058C6410D0A41F69B1C172DCA7DE2CDFB3C4CA1CCECC8B737828C83DB457E74CA36113E06FC8B717D14E4E560A8318B38A14CA27C63B2F6971B708E4B94AD9FD8539DDCA8973CA3DDFAC510FBF4F21A22D69900CBFD248FF0BBB56C6FDB30A561FF993DBFA0D6DC67EE82AF2BC5EF21923A5 Key = 1CF3CCCDB640B9D7778416ACEE72878CE1F28BB324A74568667EE229D45CC52A0DD1971336C2DD461488A2BD4FBD59B3A8DC9509D71C361469BEDD2EAC6FC3F3 Nonce = 1316EF3DC8DAC3E4BE1CB7D84B55AA3D In = 64DCE8B7AAD08D95F47B43B72C75EB6E25C68A393FDF26C80EFA7E7D2AF1C7F052796E8EC81E5220E30D3750E9ABE6140C41FC287632EF085FBC89DD4C522C9C8BDE74E5C66399069F30F9D4AE74D161717AD26CEA44D479108B193D4D32F9EB529A399C9ADD4D42B560E8AE568B76B48ABF67BDF198964426396B7A0ADBB90699553CF2A24E1C69DD724C58B525D1356166179CD741E6E5A0BF496D45DB5914A4DD892068FA067C8514A3F7D877121444B9C9A460EF31C761A70BCDF2B9F13777BFDBFC2B479318B0940F7B078315F113DD435BBC860CB73E Out = 141D1263397455C3695F163E207E560F9EDEFCADFE52ED430FD3E6CE0443910AF18D6809E0458C0112E6D6A94ABEAA3289F61ABE39E8ED284188A48A8C9BBFAAA3C3E21C8B4CFA038016A9465EA7618892D7DCE0C534A5DCD71036C4DA8491626D28427E8FAEF7400C27A0FEB8A3107F3DF779CBF184A8DF7EF9701C9EBD6C1A6BD9A4A72540C194ED866C8ED873D143ACA554E7C1AEEC3C2BD3C05F38C9C48B55E4B212D18EE993B9B89659E1442ED3A4616899D91DAF285E5A304D41E01FF92AEFD797086800BF68FD02E3A86D4F20C66431CFDC8B40E9F6 Key = B15E06B5DBBB639C60D133A290DCE9EA79BC4DD482A75B5AB813C69A14D9824EF6B529DA1973487A80941B8EB35A80CA608D5BF4C62568F1A64E93B1DAC49660 Nonce = 8516F50528C900D3F91BD83376A30E51 In = EE70D94C62B7E577166DEC9686B9CFAFE93B15C9AC839219B5ECE0288F71EF2FFA3EE174A8744E7B9B353522D80C8EE725018A9213B1288E47158B0DA12D1521BD45B366C7C61BF326F438FE120914679220A806F4C15778F4850C1040D6576A353BAF07963AFBB6327BDF813B9D010A52CFA7DD0F7B63EE22797047AFB3A5CFBFF09953706F0AC741C7852E135502A2823DD634602FC331F55C3F6283F093B80CE640625A789073A2F2BB010D8711BD1AA6CA6048674A0C2CDCF00A46DF04FD5FDFC6406274F8FD1E0FC895C538A26B0FD57AAE15967DEA99C9 Out = 5FF211189A9CAD18260097EA1CB0BE056A44A7914157B23C956F628A0B4EFB022592392AC8B9F6CD51B515FCAB0EE9A7076B441B56D0643787ED99165937171C71D2A7E7FF5F51F622573C6D47647BCE4D6B698BB8F574DEAF72B04749DB7EF877B05883679AA2ECBB97A0A3A279405CBF3891C98CF0B57BD4962A6CA3BD281BDF117F8ED5A8E34C73D69735D215878C614DB4BB1C56E6A0C920FA20ABFBB91BF9CB431D619AD96F53C0A1B2A9AF703EA7A47F30F4745684B8F31A1B2A60DC40D5224C4287A3A61DB3CB4C901ED101956842F50BAD8A19A134A0 Key = 9FC3D8F669CAD87D0D1C2F6D199D46EF5DA2A50464DF3AFED038DECD870DB299E8C44A0075EDC9135D0580E9992BD1D542D046C2FCE3A1F3948A9E0DDD63D7E4 Nonce = A03612F1966CAB25024B7FAD475E3AE3 In = F98269236AAEAF81C39C20D0F95873D9A3E3B370E260137B332951017AB8A342DD2DC0E2D13EFB5178B3BCC773043C46C5032A4D9A700FB065A02EE674BE2EB7A8EF2BC0156A02B698625FDEA2347F4BDA6F03BCEDF6BAF16BE6BDC5B43A4C4C9CF85B47B4D7AA1F6AAEBCB8563A6C81CBA07B781E744FBF390C44C43A9690F2EFA8DE98605773B2CB8A9D89D364DB90AEAE88D52E885384F086A426AE61A259C8F34E0710CAAA977ABFA888C09477C6DA328DDE3C201EC52E6BA2507C969D587202BB74D2E0A97815DED40AF44F728997B5E71888CB6925056F5F Out = 42A8BA0460E011CB23DA387882DBF6E335DF7E40997DFF70352BD01A46FC535B6E0C00625782CE194FCC77E6A0B0A85D96B607A6AB1F943B4D1EF1454E29C0EC715450B4E474DED199E439FA515B52EC7F4B988EEBB00C3BC07C9845D7C5447C78356B13924B420868F67FC6B5514BCC31B59BFA7A66FA40FE2FF4646DB8F99B68C249B61742F9843B5879B7860A0E6EF4D4E27D82C4F8CDE0FD41F8A963F0B26E7C5E4024B7FDC2D0DD8B29F83BE3439E0425E7E44108BBCD0890B62FF3EF6BA97138FD2196A9FE9B3E4B04F82D6E78B5D1DAB4533D783620142E Key = 396A6EC3E247CD80247168D76046834FCE253ECA09994B9E928FF78B9547EEBF9066F0DD515A9ADF0A8C2FB24F19916AD5C490971479F56CF145EBD91E73ABE3 Nonce = 3F263CEE6014BA57E5DF4D1869B6AF4A In = AD4408423B35829DFE511412DA37621CBEFB697029BBE3F8F3D0B66D468D70E5DE2097106344895AE73429D865A832D7E5DE4F557278232B47119998509B25FBD2EA8AC3246800B5E5F910E91DEA76E487CF76073C83072CE1F7E02101F9FC643C7A9CE782040AC7BA472BBE5319EA4ADEBE45467FF9A79517EC25CDD55C68D7E8748EBA3A83271B288B80DAD432C7F48C7E88DDCB25569E2BE7795D62005489BA48414E13165F8F19B2CCCC5BD142D91BC9F9A06F030D3A29304DE55A3D0252A0CB592B65B4E8D41933BA024667B60B3E2AB1AF99655D144F329EAC Out = 28B8FED302DE29E2A073D5C85187C43902B1C20566349A0FCC0C766B4CDB7DE1B27DF7CD3661937467986879E52F61A44ACD6A227C1C63DB51A72D9D9F2D9298AE8AA6FF828B84A6163EF85F8D7639D751426628D133DA30F4E14D59C53A71FFCCAD3D49A1107CAF75AAD3C4BEDBDFC2C177855A252D88C61506F8DB362B55980EE5475D63EA42C6838190D764F18F0B3AFD5914A9A3185BFE8590AF4FE551E72D915607FCB8727CFD919A5BAB216536E772AF04B850EC5FA030A5F3B6D5A7FD4B6BCB3F15212D76000C9D6F7B772B0544948DBEE733D2235C7FDD50 Key = 51827074453DEE619C6E3061A7E85510C89CC4279EE49A49F04560AD6A9B92D7EDDD0254E1C7E147BA1284D1AF164742E74CDFF55FFF29EFCCA29F1EB03A0105 Nonce = CDB8755CB0501EEAC26E84585300AA65 In = 3D2F27E83552156CA4419ED21A0785D13E54DE818026A2BC6451A20D3E153FFD21C54F691849CB0DA44AC46468C7C4F10CA7500B862F5F59CD7489E7CE1A1F3FF2C4D29EF5EF10F2EBFDC22C900963AF3846D8AAA54132F48CD35634E63B0C3BC3907A80A08B4D9D4F2595371D3C12ACC225A28B163B94B910E22AE70F8A12072283C6DE071EA73CA2681F7258CDC6496930287512E9AD8F9691747F58DC4449219BF609BBD507233E7594802F07534314A3825F086F5243883ADA234967E2E8C30545CDBD16B2E32E5DCF827E1D6BD1A9BB7C9008D614D6F17736C1F6 Out = 0D909DCA72772E4629D54909B46CCA9024FDA40A13016C3794F889809C41F6C49DA4ABF72832AE44F59328DDCCD33AC9A6FBA495478C3799EEFD2848186516B275A1764A2D3B25EB01E9D9AFF1D179FE49BF898409452F0DBBC95738931FF04FCD18BBFCF679037724FADE72E10BC6847AC50051B93EE9F30B771C421C1894277331D955A36FA7D5EACCD03435105B07D61598B1C8A0FE4BA977620C728362E3BC3CAE0492F5A2794EC7E7DA25743AF4EF21432791096BB00D598DF433C784BBA21F64F16CFDCACB26FB3D48ABE91E0F4642725C0703C205FAD257A470 Key = 752761C128E74655EAC40CA673BE297BBAD9427BADCB31FD41D24977325764734123DBB3F9C0551B4F9AF034B342411A6A37B0BE1EEBA45C36D013379541798B Nonce = 6C09C94F287D9EC0B341915A40339387 In = 287827BB55B859CAD808378AAA6E5213F59BD55D21663927B0B8A6E3705320A6FD19563C2F73A9D2F7C10CF980C560435C21A4428E43D0F416347B780D1B6D0804B3C68AA589B7AF441E74C8D50C5E0C6A01E4ED1CBF073FB6D7625C227B9EA1B8A17C625EB5A465AA23620B3F1277D4F314C3A06499F657A1431B5A28D38DD998C577176353593B8154BA4260ADAF3B3B01DE1C8FC1364BE9C2C4F46D679FF8820C02954914BD62B46C90B36A50D0D4C93088FDF42012D60F63D2E6F29532FDD437A15600CBD9CEA33DF466CE16DDEF6F1E02912296C5866DE0F9818A9F Out = 5FF9AA509118BACEE02350AF42541C5423BF3983B3DB39EE3D23A97C4479FBFCA341376388AB7E8AED241BC1E1CE1CE3CEA0777E02C40C2CF37F3915F60B8B743FBCEC5D4464C6B9FC168163A5565AAC32B3CCA434A8EFAB58D23876CA41E99D4D753385C83D1330687453202638C00F63A2113013FAC0DB639EF8C491E4E4B1507600E5DC2EC6BFD71A77208016520951898AC45660D8A530473AFD89244DA86D0CA0F0B10A9390D2909F11DFF75F36196EAEF39AAA2A9A31CDB8F1736A087C3D8CE28A53CCFC5797E52D217F49FAB9B6C15FF179DDD55E239B33B24ED0 Key = F9DF053F6F86540A1FB48B7602389B7B07287920EEC03D256C9735A33F1BFC7599B60539ABFDF9049B565582DE65CD4BC12E3AFB4C32F49039D5B875DD75AEE9 Nonce = 387FC84933E350F71033BCC55ACA9366 In = 8AB2E59A24D5F2607842FC848DECF946F3DA1F5E00F54400F5A7B470B6EB87B940C4CED5D8A6A076AA35F81DD599CF7F7A5BED3E0846824F7F1E777C279071201B10AE0F3316B4699543E894976004FFF8E8C33A47BA25FD2D6F76E3B841C1B9013C6FFC35697A8EAA1F5F5C622704BBB90816AEDF123C05EC8FCE8595D4A9F7BC49677D745FA24F50B075AB35D1732620EFC3E039BCC92B0FA6E5103C2EA2416E3CCDD8635B9A5BE842476983341DECB3864A4197D39561048B08DEF48BCC530767AFD98D06C3702F41B08A1149D5049A9AD08423ADA0CAD9E7C33F9AA88C Out = 30A3D1BAFBA4081D12DE7D9DA0526F51E1772F6093195ABAC1C69BDEED77EB4C53B02BDC403FAA399DB6AA8B1827CF8D073A9D8CA78EB16679EEB4D50957E28CF2BB6CA00D05C286219FDFBF0DE35D271081AFC3DE064712816FBE1C25EFC2623E1E8E41CB82B6FE205979FDE7F96DBE18B101E0C204E481BC54D5B52CAD3B389A3BE224C1564D0BDE18EEB795B9D49E8B6BC0CF7C8DBBB48AC2F68A50B6612B6A4800B7C171D4026111332C0DB320802F26A72FB444029063FAEAC94E9EBD5A7AB820C38C22C594A787F6EA772FD74C1FA703635044F9F3F9A52910F60B2F Key = 25CD677272019AD4E231E6192FAFA22CDE641D3B46571C883D490388F58745590EF886A9735992E460F1668235FEC02A7317400FCEC60ECC829D42A08E73E3E7 Nonce = E9AA61C6E96EAB6B6BB2CEDA79010513 In = CA8906F79303365439AC120FC7609F3FD454DEA9CF9DE7CABBEE34129896F5AA83C100105789A2FE286688BCDD09F0D335D2A4647B90DE13DB0F9045E063492C970334E131FB9E59E1F5ACE75D5C8891197A594FBA0A8E85249AB0CC033350FCC794EDAD0B3A1DAD08C2A2110C40419C3E10EF47EB3ED1477CA5608E288440675A6858A7D6FB58F8D8A8824E4400DC5EEFE1F7BE986599AE2023E8ED078AEB2A8734D0C2F3BDF52B689F8C511CE41D0FC780F02188E569E428045A34C752D506C67109B0C49FF285A1AB8965A975DD199F8B582020AA9465A87494F36F536BD1 Out = 545BD5C0D0230D6247F61D17C87845EEF542A5623D0AB439DA7B111DA728A972A1E714A1537CC3BC52382D0EC1D894785C3BDEEC7A8320F39A1BD11FCB6A0FCC462BCE2A63B4A0D8FCDE40BF1FEDDCA4D07C2EF859FAA8BCD774362982CB2E0901FBAC5BDA0B6FAAF3F57E212794641ECECC3F63BE75DC76B937550753B2E1C8741F42E4C8DBB4CE6DA0964563D35FF52D0AC3E1CFCAB37B2ABA342A2C949DE2B3F37938B4702EF99900FDB578578FF7CF982D42412F42C767575D3D5BC7E617F0DBE0EBD666A5E335377D3F8710FE431403B9600022F0FFF2585A722BB8177E Key = 335310F6B3A04DB69AC5C39CF37D5A06B27E9CE5B4F20BE42E41F1FEFD23BF0AD256F520A5EEB1A3130E70AC1A65BB92AAA1EDC73B3747B510C6A2F35D8F8936 Nonce = 6C77E673E124E8C291F695BD10867EB8 In = 4EF7C5614320BA98111047AF34C8971A9B7DFA6DFEF4F037AF63C29B8BE853B842CE9E766CB33AEAF9B088BFE4731F34EBA07D2FFD845666249F86868BAF47EC827E296C3782C0643A814F41532BD46BA4BA1AB5B2247BB4AF5166EEC812E11748D5F082F3DD076BF00B2FFEDCE4FA5D39A3A893D593114D400AE680942676FDB377E9445E541CCC418834CF92DA2EE396AEE87A2A24D99CB91F1CF75D721F2949899BB6A2C6772B9790090DA747072B520CCF87262E3E537D404EFA1D916658B11E9CD854B15BE677FEB47699E9B9874D464E80BD38D1FD2F30FA578C9088D7DC Out = AD67815E31CA6A69297F0F33FAE51721702DC6BDEF156CCE9D70EEB29534889C4327D405AEC4E10D2CE344A7DB26899078EF715FA68BFE63591C8D27DE6AC3D9341A41975325864F84725DA38F8B5087D4D4FDC8BE404F348E760C96FE22208252DC8877B86A680EBDAC40FF976329502BB089D4F368431469748DFE5D9835BFAF020DDC609146A70F1272D002CE08FDABC3171CE82C43356A13133D4EF87E0AA3364CBA0C2DACA940A0A8A26A2EE470F183F736CDE46219E611E94BECBC7D8FE69441EBE8C4F6AD3D9BCF810BA1A42741F7CB855CEC01E86F191789773A473265 Key = 57AF0AC08B589616E3276884E48C39B995257567F1308F089406F0738B648D6D973C3D0B624EF86F3D114D25A68D38CC357200167A7609D74412FE5CD4E33568 Nonce = B42A39E6134016F07DD0210BFA8F753B In = 912FA9586149CF6EC5ED842F70F6EB5A27580A88DD43828D824C0E476BF940542FE78ACDF16105E249452618D90F776D51DA2CB7E5C641077877398481FDF5120F8E928C83C3EF9042A2050F1B59A0E6302B55A63E2C8234F01297D420E11588A48703ED31513480B442885CB9333B9204CC0ED72E645220C90E9C77B76F881796D113B6B80F5C86389349F41C26E53C8ADD8FD60E299AFCBEFD37C2552EA269EE8C9FFAAB31B99FD772A33FA134BB087461A54671A90D9C4A873027F9C1BE84B6D289549E8B79BA5CCE6F39E72FFD446A8A3F70521DFEB7B19E0777471592532635 Out = B17B2969B5614FB51F7F6981E3D09ACE20329121024F2E719DB3D581D48EB7F0498F7C53DD31F4D3AFF1476EEE83090CB8DB1BC610435819313E5B6404082225060C241C8C5EA35B9B2B61B04D5EAEEE4B1E606DDE8D7044A37114689665530FAF2C5DB9619923F428CC7593840D277D8A54B5F9FB1AED5742519A83A3B33B3F0ACB7A72BC1A7C9EC8CBF9B270657153A5E9F062511F7B7FB6F53EAC40B6BE6907C83150489A7B20F27EDF739D52632309625723207121F8B4927A3473F4CC92F6CB4A0C288BA93AEF412EB0E5AFEA66C9E92EADE2CC4A05C27A296A0DA75F50398F Key = 6D06A63AA19C523105160215D50634024BB208CD465894AD8DC88AE5B0FB1F6DEC4B93A44D64BBD44E460EAA9DA70DA4E23AF5ED8F8F8A44056FCD3ABD3F8DE8 Nonce = 83AFF932BA2437132DD0EC7977FA2999 In = EA17DB749595AEBB4A85112FA69DBA1F581C83C3C482C36C7D33A2229930A2BB438989688E9008B29EE75068E4B04BAEBDD1D33685D9F2D6CFE90FB1B9EACD8AE94452EC5BC0C953CD7F8BF24D938E53720E784F537DDEB3AAB4F410E1EE2736C2C02C1DF998C066191207C89C5A5DFD52406FDEAA699BC8CC4ABF96372122301B3423006692CB14E8566B38D88365D06D9137908666EA8493085DF520ED9E05E2A79072D5E899558E5CD0053251A787C27F41C621801AA24868D7664A32115E3D055B5DB9556704AAB5F61604305777A7F8B52800CE0A151C86AEBBB4BF7A1C899FB8 Out = 71C48E3DAA44D1812B6F617DE3317840D31701365FFE58D87B1642F57B4D06274F36D1F7D50A34D9A62A056D25984A1D8B9175B7C85289C3C1989A990861E824F642F06082E3ED9A30C39F2DF3362B96E03D468F4E5AFF7DE31B3FCF4E48D9046CB4DE0EB6E00B7ED62ECDE10E9834A63C87864D333B252A55EB5F06A432F69A2B43A57E2D69B53D9CCC6A998A4AECD77AF46811E7B0556AEC9FFC1280144813E0CBB5DAABC3FA8B2EE19F99525AC326DEC76F4B59509A88E8D58AE7C1BE50FE934D951AF7F330D92426C975B317A8B2A5CDE3472ACFB4EF0BC3B70B0F9ABC1B1E1545 Key = 7E4DCBDB3A16569F7BA83E628019F664420292E3B93F6258C3C8686022D4F03E5CBB4BF3577CF85BBF00BA8BE772D99EA5DF436A65F7AAF93DEA8D6C5422C898 Nonce = DC8E94364CF778E8EBCDD101A19D4601 In = FCF93E6DF50872E63501B70B99F8ADB937B95B2A2AD38547FA767355B23F42F089D73DD9C4B8F13F3FE7803774173A006378FBADAF6B1F975819B372BFB3619387A17AF82ECA6F1730684DC1237F15B894A4C6014EA93B77496928F6BE06B5460ABAF78F5B06B35BD311B925185F3C37D2FF62F995FAEEB1340AEE71227BD26ADCB5783900ACBF3C9BB3C414449E99BC8EFA5DDC5BCD7E55B12D4E21A7A4E12E07CF888E8F05D5A5774C0EE2FD38AC45F0939B6810ED128BD42F33FC236242C24B365662668B497BA21B98E3CC403044361FB88C4C491DA34644104FED5ED50188263B34 Out = DDE76466249800B6E76E59E28FF5A13C09F485E4CFE91D738C992E551918E244A19E409D462B947218E053C7154431A891353EE5FCFCCB5C06180B29C2E3BF282E855B123F0166035BDCFB4CC9950DF7A72704150A2768DDE7A168CA3DEAD2511C9FAAE3BA1B13E8AC01A16AF1E2414BED28B1B494FA3F2E4BA0908972951C1711C594B1A31BA1C3AA31E2C7C1D9204B25F0A71165BAEE774E77886E24E1EB5D72F9A99BB805007859999658E9F1E9DBA6C698DDFD2F1D92D741E75423A1B4A2646889C461E4C22F8542362E6640B1B7A318A96F568D8FC6175ABA4FA45F0365298BB41F Key = 2D1281DF61A249E8CBB88A1E06DACAC054980A95674F05F7088D4E00DEB739732754CA620864BA716AEAE0225CDCC7AD95271C172FB0FC3DD32108258E7DF89B Nonce = 41382AA24332F1F64DA504B5792CF9A3 In = 21FC19F9F97727B7DCB59C30B1D71632CBEE8636A8D5B204B0A243BDE418874D1940CC068D5F47989806A883F6DA94B50178B9933B9375DC0DBBBB10163878FC4398F459D28948E6D72C6585C20396AE45308FB3069F872CB9F3A4F83453D131CBBA86F0CEB20EAAD36A39C4BE17018E030308323E5EEE3CF6DEDC9EDEAA6798B413CCA0B44D4744FC81A1167CA0DAB5988AEFB7B2A02F240371CE29E9DFD16464B6564825C3BEFCF4FB3CD489665F5F4BEAA7337EAF2FFFF4228F2FC0106A2B666423C56065E931BABC44F26651229777170E7509F55323BAFDB316EBCD4D2773A94C0A12 Out = F1E994870CF051780023DD718C14FFBD529BFB1C95BA5CAB5C559DCCFA3E1CBA108784A609471E451D85D41474D2200A2FFAB6F2B9D6DC79BA8541537D21F9B895D57E9900156A1570972A477C14EAB75E65E19DFDF19F84A9C4EFD253B2AFFDDDC7DF8F3C4F012AC3418A9F4E194DC859E43F2BDAA14A2C6BDC66CBA8B23C796C1E1FD440FEE6613459FFB177591002180D66995239DEE4703403267519BC369919C947CA6758BB5CDAAE2CB9F015FCB75792344B153CEFE6D2D70FF1047CA9F618E3CE4A04EABC577493343A5205D84AAB7BD61B82BEF057C91BB8413C8716458E870E41 Key = 7301292EDF094D0184E0092C0DF8199CC56D2BC9A5D37B4CE0306A65E45CFBFD50459A8733904BAAB33C5EF7E4F98B25E622EBC910C8C5BB1BF07EFF34CAB953 Nonce = F22D0385190A5C34E8782D80608C5B16 In = 4BAB9EC9AF710A563D2403C1D8C7BC1C2960D42AD2BC9607C4C54602C6440065953820ABDDBFF011DE6C352534181A993445F10D0E4674327343CCAE30B8638CEFAE2DE298FDAAB3C80108313C0200FC135FEB694A9D9F5AA94EC9D57C55F4F2D3132594EBE89BDE032206655EC6E012C053205DB271A985323A47C10A47D0B81D4A8A788D999B7473843776B28213108AF985D87892DABBFE8FDB03BFE07408590AA982C34143906F246E05BA4CEA0EDA6024C915A95509922ACA4A2945F76A11F70E230642E35F9BB49C226097D57002847A3F88A6B463F953E425548BB892CA61CF9AD6AF Out = 0F8694CC1A6DB1B892333A5333A91E7A40F2B87D06BAC91078CAF1BEA410BDECA010E8A118D11E53173FDA34E9C5F1E0855165269E464C463CC892467351A08F06E8217453B53D51842B9F0C4667CEB2333BC336D9F0BAEE6A84FD1155212B76C2EA6CD05827344835006F4AA9D8DC87456D540E940FEFF82CEF51209002BDE8882CD3B2F0484A752E168007D02590A4E6C164FB8B05FEF0678274C55D366F1BDE2FD0CA580E54E94BF04583D34D6B89AC5DE76F154F8EE6E6B34834FCBD5DB3CAB225B0C0B605A5B1AB4BAB1D0613BC4A97817E23A3904D6CAED8A989BBD428AEB38A7F959F Key = 570D4755AE5F33B093E98B02A1ED2CB5C01C14CD46AF4DF9257B0CE0C54EADC942C4E322B599B1449367AB197BD93FCB3DBE34BEA9D035A3145F5D0A45A57727 Nonce = 36FE992E078CCA07611F66B9DCA23797 In = 8A037025C10481ED49DF4F3E54384264DC5B5976B82FB43445C7617D803B9650C492E555C7F5076E800A770874056C8BAF1B7B0ED780519A9A967AFFB71620EB8636CF3CBD30E78E0FF356D98F6863CBD32F2910DD330E9CE70C6627E8C40269E06F4BFB076570F2CF4B86F610F3CBBEEE6969237312B642F63723CAF57A8494206E69D694A0D7D769C01BB9C5E1FD059AC750CFA4FF6EAF19051F60D7468000855D7D69A8C4856D08DDB8A8AB4114956B0B241342726CFBFC0EB3A6D5A5C5B4B26F5CC3D13932F8DD1A02DB330D1332FEAB6E745C1534193074E6C4A7995166B2F303D3885B4F Out = F770E5B5F3EE03CDD037E8611D89E5D291B1CB6EF23825A8299080116B2D091717BCF14820C9675C2300F9AD771A73A3748F69513456AC5AC15EE5B93EB23760EFB1F734C61E886803E1A660D76BB2BAEA61D584E95D5595F3A0883BB5A73116A072755616B82DFEB10B59FED3407776E8C12808521BC0AB98C795E50362AA1D855E8CD7219613D31B9F9265C85A710ABC637EAD6D66B1B52C12058E10D4E9CE887DA905C29E32EB6741863831AA6AEB2427AF7C8F7874F6416399A2447830ECA01EA17C3B366C2E248241CF1628C1CCFFAE6C4169422703DDD5722EEF9AE3DBFF3877BC2090CC Key = C8E0B88E2FC9A9532DE10BA31455D76B7B25C46DED6A40CF45873DB3BCE50C39F49096D4D418D513F7EA39E92000C76F95390C3C3B9AD04BA586BDB94C8D2A09 Nonce = 502A91AC103E0D8C10DE5BFF3384B1D3 In = 469132F5B6B71F13C221FE947170F189A350B49375E6EB98C2170AB7E2D819A4515EFF75C392587D65B8C4CB0107800D2523DDB2C71D25F19AF1F0E1E65E9167127F2BA673710A58FF61C1E24A3A1791FABDEEBDF4739728DF7A22E99FA269C2BC33BF9D4909D6A4915CFE7A78EB9305C224533497FDE3629F8E6981BC83F71669EC7A428C3EAEF98C304A55942132FF8704C325709F11A697DCD13F6328C117039137BC427CA55B683E0512D8FA68F6F2D67E9388BD21FE0D4D2F6FFE648729BF53C691696939CEB5BAAF14CFD9B34AE4921A4B713E6B796E3931C5C012FF6A4462A261B2EB8F07 Out = F9E4CFE38CF201D9C260D1D85DE8EE3FB5E3B0CADB4D3EC290179B6D439D4EE4898554DCC587A47F71F64C5E5306510CEABAA4F961A2B99FB3E63326FBB32F8CE994953CF987A5736FA4EE0678A37EED814BC52B0ADA7A3C46F6BF2CCEB9DFC321296231DFBFB40C13193DC6C8E5163F7D97DA82FBA11C797F55740BD8DDBA90BB097F36419B1B7E4B14809516FEB4844EB0E480573B06FB2FE62BD42ED7FD476C213287FB9BC9B336DB0B12D311E5F5222CD679D28186D8699D90007AF10A6C518B0A23B4789AE2ED749E497D2EE4D7DAFFC8B904E92BAE48D9C0B54F2B1D63847A8B2ACF014943 Key = 797361743DA7E544A17ED94CB6034496CAC8DB82690B3E3C6AD767FD5C21BA9F067EA13C551A728C7B56A9F4E2D194EB7FF441C3BF1F536DCBED2B643A158BD8 Nonce = EECBD553AA8020CE0471796A24FF10FF In = 42895EFFA6DEB661509A8DB802CFBD51C13D7BA2E221A0087898B5E15AE55CEFB592DC1B7E93EE8261FB20838B441C32F742AAD275FCF505DBBECE400B8E08B966A3D00BB110FEB9A4461514DCD020D2FD756AAFD5148531EA3451720CC91C1D7E7938BA86127DD98F0A851B382311901466C83C6D278153A514EE3C6C6D9C9F2E7AA0DAEBDEFBBEB247DBBE33D81DA0F845354B220C5D9059355BC5816B271502B884C10EAC8A8A275AFF3DD63FC90CC1E44590D686ED15DA610E1A93D8DE02685574CC0F8CF42E0EB64485A366560D54DF4FC15AE5C5954EEC5B62B5C2B5AA349F314C90A30D76CD Out = 741DC67C088D533B1FE360D3D501BA00BADFD2B6C256BB89E929F53226B7A5597212FFFA5727F4FE77A273CC06CD4544E3AE994782186D8CF2977CBCB63F61CBB5AFA9AE3E05907FE50E6C4BE1B4AB9213173A8DBA6FC6F4DC179E2123D85925D9EFB4D4C23FA78D3D4A585FAF55C595F6DD37E83C5D5503A476FC3579AA1F6649650A80D2AA2A5D35AC62C991DC06636F70677F8C566EF7126E793BEC976270B68E510A2BC68F22AE6DF35FF56FDB6A15171F70E717C9F0F05F7CB953D01677E0E1130518907AA573E531E25830D4E3E012BE7171B3098F3BC685AA89FBFCE0ADBA90BDD7E7EB3AC6 Key = 64FFBF63CE4528DD431EF5FE89431A1BA9EE3AF072F3860D392BA06800D8D1C2EC523EE97A4805BF4CA1ECA8256226010C1D45B07115E2EC83C08D20F45FF7A7 Nonce = 23B5FE790A89FF2C94135AEF589507C4 In = DDFC4B8C96DA21137E0B405335428A17DD4B22634EC67F0DBD110895B06460CFFC9BD8700A90C2E08873DBB3329A289CD9A0F05E904E310DD3DACA9D88C9F3AA20931BEE38A57C9851F44F2D863617F6CCBBB246E97BD17BD6C80547F5B48D81EF33D7BB142706A525C8A346AE48057EB8D4E44B6490D8F6F0ACA5C3C3B2254C8272EC4773BF32F15DD69D00F51DDB4FBC399A292442EBBA4CADEAFB1EE3924EFCF23066FFD8A43426FE1F38D892087FEAEF19A6EF0F2269DAD3C5DFACB3705845501DF86B9B282595A50EC02CECE2E3359C7ADA5DA0058E11DFB01770E75505FD8544E6AC809CF314A4 Out = B743430805C875DD05E8F1359759856C74653C8E026C08E772710CCE2B9D4F8E560176F3340C3925D6CAF716BB96E4E90A1E25359B6B949968CC195828ACB268FE01F584831DE33F355B6799D93800794380A9F0CB2803E77D89231756D1C1CF7104B555F657DD2EE6E75A49D1D1E9B2009D3175D16B350215F1DB9ACAA658A9C30629AF5DB460778CE1AF0B71E53FE1B1E34927CB96F22E4D8896D8663BAC98993701CD6D441C4F810E90359D987EECB0ACB139E493BFE127CF9554CFBA9ADD76A286F1AE431F2873ED59D5229C23CDA1676B08A30B0F3CAE14D5092476EC5D729E4C1C04BE9C80BECA Key = DAF3B35002E91851700EE5AE30651FEE9D503A68E25DA1B0F995C85682BC0601D7B214EAADFFB9019D85B5583D6F6D70B0B67DB9E667C950918459D91083621D Nonce = FB5951B7CA80C7173B5848E840EB3597 In = B9D13732E5789081E76FBDC151B9B5687E14084E85967EF1F466A96D180E99A0EBFAD0BD62D3C0A9D95A7C091A6566E6EE16F431A745A280A57AAF96E825AEFE43C910F03426D11B158FC0A564DF953F43C22A41B57FAE2441FF0081FBA6332B46907029C05CC4B0B3808E62A928896B529CA834C95C82F961E5D5FC9EC2963E8F05DB56ED106A83D69BE024BE2C3BBBE7277EF1DB65AE723111808A26EFCFA7A2163AA7F3BEA56432CFCB128E33F52D0D9E74418D4125A207ADDA7095B432EEAC6800FAE65CCE8F15BC1855B6AB339B936966228B9902463E2E4AE662EE0F2ED461FD378C74D44FBA12ED Out = 276339F12D23B2F085F0CE29A03D40428E7D73616D987A535DF9F4CCAD37002C801DA88FED3EF6F83BA6C831C81B5F1992D5373CDBC1272B0031499E02AEEE1EFFD30D49BD13113FDEF45C8D25BCC488E3CEF5AD16B31C941D5CF8254BDEDD65FA1FA999D361B1A70E828AA1457D1CD729613D2550260062AA0AC7DC8FD34F69AAB065C58CC4A49973CBED22198C4F71AB3C912CEAB4F8675E6C52C55C520410117B224F2C42A14A538816FE28EF1ADD9147698537FC61E8CF64540F88EC70B536477748E45D80B18E46155D2B6316444BF8719FEE78B6E00571BC3934204D0709FF3F78421D5764983046 Key = 03F74F149E521E4C126B57261077D5802C574EAB94E75BDF4C0AF7D463D60A961EC8D5047E36AC203B4793E42D7231E38AF206128C483F849ADC9EF65A6DBED9 Nonce = 9B65716CAE6C38FF4144C8729632C844 In = 47F0B01DD8D9F113B1111F687777FE1B8475BAB8D5D9F97986043467D4A1251C674AA433A2FCECD248D2BFABD29649C49A596DE37934F3A22B621AB326E24772B71FFFCF0B55BB2F11A95E398DB872DA7E7F97E3A78FDB03C9C295DD445038A03158ECB9A31DF7A5BCD44BDD1E412EA66AD320D7F8F80620A2215560237347A6398493DDF42E71D97142571C5DF579B4925B982CEA4F71D0E36CD2449F4F52D5278810549371D6253BDDF9FFA02BF89D1FB1F506CC2FB5F827876EFD4F1F8A7817BD27BE8ED9C8FAA11FC9C647364CCA55847EF4BC8EEC950CEFD79070098AAAECD38993648621CF310AB2B6 Out = AB274153C3B88DB46CE7316E630897AB41FD99DD7B50BCE37A33C1239898179644AC08A45865466E18D327F422F60BD0EC41B22422A06067611C349553120D7463DB99AAFDB557DAF453477BB076FD0E0B9ECC54531734CA0BA750787DF9F37E65A0657F531D86A2CABB597CF4AE6D0E3E8404D1DEC2FCAC1949DC572F1D51B7B163C15C144D3E8A9A6241A7472C8D38FC9885D8F65DFBE5CB5D9D8411D48D93261F94FCA257B6487E4F213537D7B227D9AF905FE7ED8090F26C77EAF5308FCCEB5692FE383B5B3FC88A836165FA7D83E64A4B8D7983C267E1C21F8B845915AB65C72A9ED5266C3462F870A0 Key = 8C0409111B900DA2EA59092A1DA364F06AD0B5700353A5374E9AE381559077D41C8F5B1AECDEE1C07F4E11BFD4B20B84EF2C6FA3D64ABBF7B93BA039BC5EE7A2 Nonce = 86CB12ECB42257430C2D79EB86C9D6CB In = 7442A74EE7A4E47CBFA5586C9755D50F344E7C03EB8414D121CA04DA644E44F9276434A0034EDFBF2EA2AD5B227BA9D7CFDFF906517862BE6092FE320C59DAD5EBA21692526563613DB4E70BF67A6E60B748EA1274D23C51E38D87CEBBE8628C57600FA8D40FF7257F48A9D986E1E85F0D22E4035369AF1372A289204228C872272FDDC1488B46AA440169FEA9B2532D1BC73732FC9B316589019265777AC9F87A773429861A0DD26042ED4C35645F7E2DB0D5D21D4F11FC485F330FA3545C471816F00B701BB055142EC630F35C9CE6E4FA45A34E7A782096ED31EDC1AC41507B5D16603146EB013324CB3ED4 Out = 58E5AB04DC73919838D2E393ADB3BF0B854D2DFD1014B92F6E1F2457A7D3555D919B9969ADB8A0F5BB4186633496C98C8672F79141F7364DF81DBD306EE0C457BD8663318AD8020A8B77AC78F04AE830F255B44AF18A2BF81C393EB6E4742C6E082586DD597EA811816D91259388718CE445F772BED05461338463521AC0C04E2C2659B3C2E5B119318497EFA7A5B0F08350544C219ABF10EB7950633F48906A7BDB5249CC19C13445DED003964DD425EB2C804DA0D5E4033BF94618FE97EBE9DF437DE869F15E10B539E3A78EF8B05DECED51108D30147ED6D3CB592D7D212975B3F2EC7A75F110EE24B43219 Key = E9085EE53951FAF5F0DEB5489066FD4C29D342764626075A25D1A6DCAE8FE201BE2EDBCAE08B8D7D853827BBBBFA03B642D857324A5835151620B78FDD4A1D44 Nonce = 14BE182E38A344D85D49FF2D8CE3E7AA In = 18C68DF21BAB33BAE508515B99925FB785049F8F988EFB2DDC9BC44AFD79820E654182B99571C19639FDCE6723F0151A1B35477CE64CDF2E88F73F361D111E0D3428B04DE2D789F3154E357AA8F8ABC0D4EF7690A3F2F646F8E1CE7F8D9E50574241A8E41A75BFABBAA2D2037B893E51EFD9477B53D022ADAA64D382F8ED5959ABAE95B912E04F035D795FB607DD9BBA4A9873C538E25C5DAC4BDCEFE0D631674AB2C6BD2F6AC8A2E4FDB892920490288E35B10894B33E75896FD84531E67BD82866B19051F59D964C001CAC6764D39460C8216394765A580A6410CC66A4A3E8C4CB318AEF0F5FB4C6BD52D24D34 Out = BB211A3B1BAD325FC33B561EBE986D5E03A8F319B0114D3487A2F4B29735F4B52B9D1E83339B7169214F69E8BAED01FF0FE09AC0F04F222FAC7A99448F11B09F42DB02E77D130C2EC0B1B146C8C3B9A27E8A03604267DF5FE8DF5F4F8EAB15B9D2B4E7A02C157AC6FC18C4E2F82A630A9064418B9ADCDF4B0F98CA43435474A8ABB0DF2E43AECEF571E4C382427BC2AC0BAC6567473CBC7220E7BF682050F17DD67A0DF33DCC9079A6664ABC029B1308D6F969F88326748BEC0300AECF5EDBCE8D2B9BC79791777F45BD2BBB5525CEEB3884914125ADA4CC0866E02C47E340896946EAED0D8917729A20B0BC5277 Key = 50DA9EA5BC2A67B5F1F0DB776A3084A32F5F1F3318A330F1BC06577D9E50CAD53CC82002869D98056E38DF10F0BF30C33FC601AF527D6E5683C029D4F30A726E Nonce = 67131CB3F2D744E0C68BF4B872C2C5FE In = 15918520F3A5A8E78F554362E65BDED51966E000029685D8F5A61D184AC17B2EBBF5BE9566CF5C46E2CC23623E7F1DC20744113761D01BDFDFFDB74C1DCCDE9F2052A5516C848700DDE677667E52B03D89E8F147C698739664D52E9DFF2769F1EEB37F9D9DD3418DB21E402806CF7F6EDAF35581284C42AC5501DA4FC2EB5F3266693A26A383D5DFA66B291B8AE384AC922BEC973CD345EDAF41045A51FC4E36A37DFF55D32A19978C239F43DAD3D8FEF4F98523C2E2FF28FEFE794C64D1999130951EC74D1A0CDA56DF82FF158115B62B7BB062DCA0DB913C78BD33B44EF70B758FE3EFA4E02F6AD1708C4F0B493D Out = 2D49D411F9237303B89D304B03E4CAA535C9299842363C82549EDDBA752B27BA08CE73B7F30FFA78275255F6AD35973A0FCE8FE8D060586E90EF6AE64B19D87177F911E43079B8232DDAEDBC7A77E294E2CD59E48BBF02DE77C76E8BD2D3F9F51E7F59044745A69243ADA6DE557F35F42E8D46C44ABDBB9AE3EF013BE854503EC71BB6853EC11337D4E95764F5A83BAB2DEBCB16CBABE628525F195CC2EB4DBF349CE9FDA73D001502FA872B6ED26A56738BBE0B1B23C9A847DA28905DEB2D8202C3903DBD2E7DA694D1B999BBF7444AFF2575BFE84B671D576DF097D53E634FD5DA9C1363641699FA678A5E2B9198 Key = 0C6CE2F496B1158EC119B0A0E9AB74B3F489B4CCBC9C895CD7E19850884F73DD5B05727C9C0AF2078D8C578CE24E2F48DF4D3ABE6D238A473122F3831C4F0787 Nonce = FAE09A5BCB263B8ECC375BA60645D86E In = BC06C51D1422F4917B4E1AEDAB1682A4DE41A0AE0E29E916FF9966E05A3FDBA67AECD7E1E870633EED5E06CC223D3E8DE1DBD2ED672B2650F759A4D56552B1DDC876309E35A74087B4ED8846EC811554F73BD30050ECC65DFAB8DC83F4FBC03B2E08BC0F94E675E5BD79F5EEF270BABFD0E01F27BF24B29CE83FC211236EF9AA541EBE0A2BC8565B6A70FD68B07E42F5151695A7E5C70E595F007E5EBD112045D7879B8CA50FDA5C4EC9069E4B08967B7046204C62686D311F913A9CEBF3936CA5AF98D7DF0FBE58237331A0F0D06204E9548A26F14603A23F9E8AE8B21D07E4EC3FF0A6B31360954E10F115E1B9536B Out = 80E53B32929FA660B171E187CF208337620D14550A0EDCC3C4DC96F93C3A4E76A27F3924E334B841610B486CA5FBADAD2BD6A663910C260172328057077487363647E5E977DD32E953C4B1A34B0B43A5E9CFCB974FC06DF890937FEF591D350668D6BE6477694C00C7B3D9C15FC6FFA058485EE3FEC5716FC8230665D8F71DC484E1D83D848BF6F0F020A1EA00E060254C6A7CA1DB49F101BB88786DA40878B5AA758D63692FB65363DB11ED7DC63BDA3DBE18A509E567ED9D200386B5B878FEC9571F39082A8DD7BBD48A936989ED4A95873A77EA4D24778FE0A5B5787F5B0B2BB12629CE5AB14825E137DA01164BA3 Key = A9099ECA8DED735C5973D029F3EB1B7880AFB01E361DC27270F191FD24714C42D5D2D5F03DCB344A43537077B1BB4D346699B61C381D177A76C9D316E3E93770 Nonce = AAD82154B7370B6A67D899B24CE21E3B In = 685E288E1C3800E1AD2B7438F78467430EDF29B1186D07655A44CF36D2D73E8ECE227967117F581374AE4DA744557CB39CD85021E5C59173C0D89750E71B8FD5FBD7617BFC427F854877AF7FE3CB7B0A3F637FA95C703956E8102C1FC3B054E8BB58F4E8F483DD8CC178B1FDF398784C8716421799FAE814AD68588E5A68E2AA907F4B27638AC73E76BFE65683DCD7FB84C41828D5F18E4CCC224AB00E72DD2065DCFA293C79B4870350D91C2975698D88B33FEA46DFE08557F244C58B715900E75B4B0CBB1976621596BCCD0FA241CC0C3B6E452690772A950DF5785F8D64783F3610B67ABAF7E6675A5A0505C982571D Out = BF5B135026F3E73E6EEBBD22A1210E2A863C78E11C0BB11EE8A242E6C55F01F29B9DF915437DFCD72EC253A1D96AE713CF822D2C08F84BE16BF491E09353C3BA8C41A4ABACB70A24F08EF17BB0BAE9BE6320E73F6CF2DFD758E7CC40109C36092AB5E93D3DEB6C03DF1C028ED44345E4852F8CF738FE41C98491C38605E40F8915C14772A524042B02EA3C3A57C46BD91F8B7D2D6DCDF48E2DC23EF0610437666CE3981D6D59126840369A11EF6E3304FADB64BDDD3BF5F8C183D6258DE174CD2825BC84F7F469EAE12B622798585CCC639956B49594B3A6EAE92E1416AFBBD70BA2CF9C49AFBA035E28AD657613B053CE Key = 27ED87FF83D60062DA7B17EBEEA283896EDBE4C1C7A0955D36F49F361D696924EA08584069AEBD0B2B90635D681D28E98027E1E742A96E2FCF8DDD84C0452757 Nonce = EBC60C3A26939CFC266533839EEC054F In = 1B7246ADBCF13C1D27708145F1269E684056DE1CF6D698C06E83DF2BFF3A1859BE293228075844FDE9A1233EA6A9CB8AB2CC7893789B12A434E604E8EDED6A99114BA6257CA34AB9CD2CA7D42147742DB2EDCE2845EF20AF596E6A6F115C486BB9E1BD780693578162D210DF7569E10E280CE840FD47692CD1855EF58BEBAC8B5EEEDE0AC581FF8ED8877640F60F73D79CD6D445106D76FEEF0FFC81442909818E2088440D1A5BC3457BCAC137EDC41DC03C73D2B0418E978C3268844FD1C8CF6CF36F0DBA80319E2D452E1A0CEF619F11C08F2BDD5B79D52E30221AC2950737882A2CD51581BF34D5FFE24E73D5BAE41985 Out = FA99A6CE219F8CE34E24B1E6949ECF6147984969CF0E6D1FEDDA7ED74775E05585FA5711F97655FF7D3038381C7BE52C2F177CEE0C50D0F841DAC31C0A88FD65A424D01167CEBD9F5ED533764080F922BEF0B90571AB5A79FE6E3549C26BE626AED82E5CC2EEF781A2F2B8099413333454B490667D894C488FD9E27480F082590D3888F38E841F80BCE4900A2996B5382D1990331DD45B3632DEF6159F19CE46904E1558B460FC17D8FC8C9E159AC634C8BB9300CD703879DDF2D6FD9622F1B66B1CB6D51A73B54B198CA34C73C5498685E629DE82DC3FC7A4C033C3566C044BFD0CA8915C6C5C21726A38B60F28FE9AB511 Key = EE566E33DA207FA5086607A1ECC2815A1AF4B05C4C96882727570A23A214517E2E93C9FDC1FE860C67D823D29377F1BB45666323725D7A0D219F65EDA6B2DB16 Nonce = A7A1C1833033E0A92BCC961B291BC155 In = 1EDFE0BDA25C2D9CB00ED63AF3C30E3BF7A7AFF9169B749802C97CCAEAC6B87CC74646316A0F7F52BFC1B7AD674CC1CF2080A3EB780B0AF03C1AA27E5504F8B6FB80D1ABBF46A40DFF5624BCD9D4267D53E3AAE275B961050F3D9F11DACA27082D258A52C8AB0DA603FCFE849D6625C4B75FC7AD37B513ADDB455DB40855AF37D2C74A91CFB829935635CC1C41584984D394CAECB1260BF3CD44AF2113247EC7F02D0DD9B6C7E70F4A70FDCB01559BF2CB71AAEE299327FF2753B72F354F6789EEE630832022F8F69E0609C4C9C11874291F3ED2CEFF3EC6157B26C87E074ECA17DEC907FCC47CB52CA51E7D886C720BECA9C2 Out = BA20D7C5B159868A2FA2559882EA88C82B1E3048E7F65A5EFE89B8FE11AC800F3B046017826A5C6319FCE57B4E26D3642DF11270D0FD1D4455C441223D0008E3BD8E3B78DBFD0E25B40BC62AADE9C9D83847E3865E650AB32C9933538199376ACFBF9418874E71BFAB5A366F32567A77C9B6492DB3AAA1D0917556A2D4FF3E897552FA06522C539C6BD229CDFE109EC6A5BCC0D33C282464C3F3B4707C2847E8501FC54DF0F99B8DAE8198798443228C51A97BB12C7BBDB5BEBC813EBBB28FA3C1737B005E68ADE766F39EE72A8463AD9648DBDAF8341066F72C5BA7BA09AEAC6B3CA46A5D80EC88D13D8FF63AB506331F4EDA Key = D034A16BEF7526B8E15C0F74E5A5C615249F6462D609813DC10B964BEAC2D86FAE8051446AEAB7332408967D4C0E11386EE1F3E580769C5D2E71D347FA5E1679 Nonce = CE090BBF1BADEDB45D510FE89AB34F1B In = ED183973DAFCDBCDC28769895A208FCDF1D336FCD0AD6B2B038014AE2474957AFBB14C7D96F95471C26A1D74E4A5471B811306DD9A11BA482CD9B62AE5798E621D5DF916F7EEDAC0B85604C59B3CB2E0683E0AEC5560CB9D66EB28B7404F9BDD45735EEAAFB404AE56EAF78A824436384508DC4D8C075A73B5EC71B93A6684DC906649557311303CB53F82E5AB97A5003587A375D75FCE337FF1ECABADF76C5AB3B49E8F9CCD5F4BBB1E3136E5950DA150AD0D273025A163BE79AAFC2B706FF344E7AC07EAD93A18D1C1C6D732930E89D2EB50C55474F24AB2598EB6C54A8DC966ED61956BD8DC48F26F0317F9C2E0CBBF1E9EBF Out = 12A5E2CF12E3BD0E5EC9A319DD0592BE0CFC95A8EB313B800211A9F7529926ED1EC026A8042B73245D02C3D3A527EF8F8672E62D30CCED471D5A20D02DB17658A5A69A2EEC8E57AF1C2FD24F0830E634CB099F9F84E7821DFF344EA63A0C27D66D0E3ABA633D9C6698323B3A79D7F292A703F55D7F35DBEEE65A683FE28F989256112F889B80B2D8865060F7765A77A421C942D12F26E43C1FCDB67D26A4614CA418129B3A571425944BB5320E0E8959A12AD661D63C00D7E7040DD077592A257FB4E799119567651E98EFEAE102B5440034C8F118F9D8A90315233EDE3ABE4D50A76588DA3DCC84685269074635D5EC8463F63E Key = F8285A16BE35B63170F08921D8D28871C0ADE8C8CA3E780B6D2B9AA1AD6BE150DD6E1C2D53A332E95D8FD2220D48684A677DC6CDC67284920D70423F4111705E Nonce = 3053654EC34DF7C87CAA98343F7CD89E In = 511BBFEAA78DC9D2A7DF2470C103ED2E8D6CC2EB85C3C3529BF9F57D911280B862E29B083C7F737A05DC064B2A267D787F726F972E97431E23B568AF59A555625A8C592482EA12D0C07CEE98C96300978C035059444F9DD5200C2E43E3A3BA3BB33AB03C1F36DDA5F254D8565BE0553F634CB0667DBBC3C7C1B3300321674B2CCA87A1FA8945DAC6522F2E69FA30EAEA17F662A6F7CF421860ECC27506500E7170F02C608BF55447E190D723CCE5DEC0166AA9DCAF48FB1AE4160AFC59603F54DDDC9162B3FEF8EB6396F5321F0A27DE21CB0A65280EC883A9AD6C67C69C1E7903C93F5258EEA047E277D67C9A139553140D20C748 Out = ED2702B34AF0FD94FAE86A0B1875EF1ED95F8199D4CAC8EB33010A7A7A36FEAC1FC3F8BE873BCBE994196155061C40C9C6D649C2E0FDC68CE3285AD3FA058FD20E3753F98C1EE8F614D5031899AC813C982D6D2D26B72A829EF167A95433982F692B4AE0605679E8212E06A638C24DFCC195F59F183A92A8DE46B730797E76F449937BEEFF19B323B72D352BF35D1123A2A74E5E7FC96FB8CB4C24D075203DC8D416D7DB2B6B03D50AD35B6B2934D8161B1ADF0D16727BBB28D0B4C155ACCC7F1EB855F2EAD86D6BC36A7588C4B05974B64F1F966E24AAC4AA64FCA82AE3ABB0302F6FDEE7C2BD61F5998681454DAF3840173D31F6 Key = F53EA988F600C6CFCBB1D1A539FD2C4911B23E81B29D373CA23E63225FB7C33B4947BABD0364EB7BFD460AB650317138082061AC82D7DC885F73FF1C1E6F51D9 Nonce = 9731779293718D0E6635ACCD01B2E121 In = 2EDC8DA326BC92528CC18EE0F47CA74B33E7FEB8C5B5C4F715E1A792333E3953F7A391DE6B8F720E6F96BC4FE883CCDC06AD791BF7A9B6702109CF97426283242FE0F32483E4DE8921537DD4C9C9470BC2FFAEBF71BB22E82CAF4930A2C43CEFDFAB86A61096288345E603DEAEC5B8C2C2333BD07A95AA178BEACBEA4C9555A9B47C3D2EE262EB2CDCD3EA5B36EC05755BFF04FFD12A5D79F062804B3055AC0164656C9EFAF365027A9F0DDD0C10DFEED5987CCEA29986C89841FAB33D21DA67E90E4991DF49B4A0187566D00922CEEF32CA2CD74CFDB8853DDEA3A0BCA30E2686790E7AA6FC394CD9ED35BA10AAA6E3F37F6227AE92 Out = A4671B37B1D49987D5E6E1B0CC5781998B98BD9B0AFED9F71325A5F1DCE0EB48B3AE2553842F7242DDDA6CE31E1050B97674755B245BBBBD4EA7467F36210147B03EEF7E56CA7A64F9E61A5A24A468E90DB7F9B8A9711C51ACAAEF426D65A629572226E634A2B683816FBD4365A7F1F34FC60020C60C8159CEF2B809814D3AF25F9A5448A478874E2433AE083B3FDAD289F15CDDD9D5844D646E399453DB9F9F26EC787C42FF40D6191507E898D653D9225F15DC57EF30E589EE1B7B659EDAE67901FE0E23409B6491BEF6561A95474BD8D1B4F35C7D41DAD0A179A4798FC88E2FFFAF221AD14779B0C23A99649AF19A35E9CF8648FA Key = C37C751FC481BDCF74BD09A3108755D55845BA1BE7ACCCF79DAEA329560939C5C875C4B71CFBD9576689D4C28FA786421EF49832492348575C4617E5B532F0A2 Nonce = 94659BFA2E1E6248ABDC13F6FD6B5251 In = E348AFD877272E75AB4533E46A74D713423352E338E85F62FAFACB61CC353CA513702C0D42E5ABF5CF2B46C49E8128A153B47EC49BE7E5E349670ED0B760F7746B5933A1E878D301F566FDA4E9F9F00151A71B3580D204EE40B2533831ED188E4880E10EAC7420A74E2431EF778229B836CEB34642FCB05D2BA3345617CD7F908F35E4AC0073ABA016C49BA3C28AB470C846531E63FA83B034D73BC0EF73FCE32210F28012D92AFF26218D7FB79B59462EEDE2B1296D27C6EC6E40B2CB3F655FB79D3284DA532D806395BA6940EEAE0503BE49856E9DBA2C8214046ADC6045884AC8B0819C1999B30D6473520FE2B31B8682E6C17AE1F7 Out = 5710629E5F9BD71516DE966C84983BFE939D39CE82DF4F80E7A9D48C77BECA8ADBCBB1283FBD7BC863A2B174C67CC6D0192AA84636946898AC68119F39C3BF5EEDA15A7AA935A4D592537A8518C36435D9E2149FBEE571ED80AD5E101BE4F9A37912D770F29F5D3DD83A1534D29108C0E142D7F3DC96B4AC8FF5E68219E0DA233C657C14F9FCC20445D152583286B11227118E82F3CE55AADEBFD5CC946280478921B981F37114BDA9FB1A9C3896C99F62FB59BA975D267BC7676038FCE21C324BEB6E31327AB5756AB57DFAD3FF1F696E5A9DB0325A6A6F30EB37BB260F67F0A3C534B3D0170776F9A6DD3DC027038CCCB0D4A784E469 Key = 474361241C2D89DC2C1DA13160C53D7D9F33343D2A71F2636EF9B77D71B7464136454573B66449B87047E15DDFCE2EB64E71BA381F65FECC4AFA40FD9FB596ED Nonce = 2A9A82BEBCA83CC800D76D78F9F21789 In = B53FF69F8A08A98C6DE54BD5CCBBA661E17B63FEC51E675B4DB9AAC74BFC9C4745164325345D2904B6AC9616EF350BB60D82D7CC8A202EB2BA0946425A13575DE012026880C565F0B6DE087297E81783FCAA325EBB3E6354F80A89991A77F057AFB9B90BDB1943BCC4D577A76554E11C59A88B6BED70414AB3241E0B11E2C0F131F9DBF7B0AE4A56D4338441DE51421D3611CFA51A838E8FC6370B597782AC46914974135F1468C55978DBC1B2B1C4A5D65A67FF5D08270437A9512ACE3C7D42BBFE205D1F48CC9CC631CE15BB6CD9F5459A1F57F4AC251F437C65D9368905D096CC634488CC8C2F33E677FB6A8D9AAB4C924475036435B0 Out = EAAD8BB070AE8E2C8336E635990A8C35FD7A9E1D54C0668FF7773AA62E80E2865E90F8A6E414BE73CCB868F3A843C1F3C092941666535EC6CA5C08B274BA361C1A36E4B38218D0FF16CA58DAE1EEB1DB51FB4AD48CD38E1EF39B8C84F3E00A43B2F3333828D24F9306F13BDDF141EC83153C248AB63304E4FAE70037207D3E26530ED4671DCA7DF505A1D4CDB7503CEC69BAE9FEA1CE5F7CC7505CF525C3CDEA52071FE4A5110C84759C85BC1BABF52B8746A14A05C52813E5F02E21161A3AFCA76C294B32A136F7C2D6CAAF233E8714F0C2D5B57683278789B2B0B545D6B599AD0008E41D278FE9D3583165571D23A20C2849E87264D08D Key = EE6AA06605EAE130FCF2D9D32790440DB49792407D524CA1B4903C2FDFFC73968070C6114B6230F28277A02871F5B0459E2018122316FDAA6E1DB4684E126EE9 Nonce = 725B2C0B298372EA36E977709B492E24 In = FBCB195863262F25E0DDB7AA269DA197C63BA5C03E3585AE31472314C9853181B71F1B1365AC5369C8FE70A4B59DB1AE9C8E915055EB520B9BD87A54D51BFDCCD1B6C7622C99B281ED8C63F6F829E87FC4F1A73C08A0BFB861A56EA3E4DE282B0C57E5F8ED41BBE5E445E924485D4F8363857B917F7A93026ABE3D0EB647FCC03A938F67A4B1C6B8B0FC97EA6B8031725DB7288F3775247CFB25B4547694428F580F51ED4C87DC0F1BE5DE2EE12A0260525AFF942E1159483D4A533448FF802E827BE1DB7A90E65CD8D5195C920F7A2454920A203C94DF411BA6E3155FCF8456D5566891F4E9416886ABB0C06A97F8C0E95A464630392D3A20 Out = 878D6FF85F14EF6A5051CB2BEE2BC06AC8CCCF3925AC9A7E705E14BF51D6A97FACBEF5A830B9D0FC1F8FE14FE28143EDD63D5B6714BB12DEEF02798570A9E5A8FCFD136FCBAC9471F71A69C59D1D389EC154214C9CD15C675C6DE9A8903752219167BD864F6A79E69563A7154B6C88CE9E0DC360181214375F3CFC2A0F69B4262C7F58F6B292328153473C826EC358B4EE4E9D6E7D4AF77FAFEC9F431E8A7C17D3D0649865EFA3D55D19521851115993294A65EC89AEEA9DE8935EF65DA111B79D24F1260CCC1E2689D9BF285C05359941634AE5BEE9EB59759F4F4160F113E841F28DCEDC4151B6EEC54DD8A612226154D3B099D09FE2AED1 Key = 14FBDEF05D3DBA5A3D1D3B063BCABB96B86E2681FD070016C9DEC8CC4E1AA4DC87B597F8F6BB3294F7E5C9F68342E29D578BD71D15423CBBA34A030AA5BF1AAC Nonce = 76BE7DC9A0DA36494FBBFF86344D27F3 In = 8413D77FEB86C319EE67E59B7175F8B9F534E50AE9FBA248249D45182157C998AD2947E659D28877C7356ABE3F7D25025DBCE55640BF9A8594037937D659BDE7F9B0A36828DC528092F77BAFF3C13B9E8E46726CE907859E0080874D7F557DCE19FC7B59BC7294CE86A3651515DE9DFE32F19B09CE7A8C4BC968FE6CE920780492E46FD393C7C7F6AADD1E78A956419D5DA3B12410612D381AEC74DE440FB8E376FDC7BC0215FCD25E6BC33219F12E7484618C21502AE155233BC5110562791267FA6EEA9FBE426FA6F08A5961925EBEC03067B5C362E1F8C4B73C50E6092BC7266093AF7E54C3A8D352063284AE60CB93F5186F55575CFC52AB Out = 64E8DD987F52BD79D93A61FCE6B96B7E656D28DEF71A4924924C69CF89F6FC13E51E8BAA372327483EB401436D8981CB3F9545870C12579FEDA86798E14EAC2C2C2F948531444F8F30589202EF9491E883A3AA87F2BCFB68C475AC2E288CD8F20A807F35A6260A8E903ECA55368E9190091C30599CB87C2EC56E46AAFD26EF01C071492AC2A3FF569F8F310236C9D8BAA6FCAE0AA9AD5C0DD13821BCD973E108B1AA5CFB58DFC6D12016456E488B91F918BCD749F2E3A1C7BF564B5AFB2E572AF56EB869977F5DD83D94A6E0EED58901B89FC8AF65C131FAE33CA28E0C71B8D3A7F5DB23D27BB517977B7FD7BB3D4AED7FD65A9B17DD9884E561 Key = 1E6968CA450400AECE693F3EB5F0F50B2D3768CF547661113369C77F9F9B84F9B57B659D06ECC463583F5EC1F19579C688BE206B6981508790100C15EAD608D2 Nonce = 2C3EE199780755B8D469F2F9E6EC4564 In = C58CBAB2DB2DB412692422DF35E46D3D9F69EC55F0B9F94EC71AEAF6B52F15CA7792F4A187DC0269EF0EB7540589B5815568344F6C06904AB625116913379202672452476D5619ABB9AB059BCFF96F5575ACE2BE06F73C4A2E991C82D88621050DAC65FDA764E9B4D59CA0A3508841FF409D13EFC144E62D551DF65B5DFE84F628436999127EBADB0DE41DAC10F701B8E3D5FA9BE5551EF4A84B1D17BA4AE7FAD33F73C940850896B756D93672DD0D7885FDA05330E1A9855DF6A077E59CF8128D7F78C6073DF8488621C55E876F6B191CD573202330356C479C3DCCC63092BE5719A970EA631B7AB3FA602145CBB60A216A848A8D194B61D7B1C1 Out = 81F9F66C030B757029AEBB951DEC627EC72E2BB45AB309AA8693EEEF6B4433AF9E96F28374E877288C1B776A91DD50699B7FD2D8C6D7118BED79FB7A8BEAA11170D1276890906B9031B6F531318D10018C7C684B4B970210FBC348B16C2F8D21D827FC1D587FFAC1346CAEEA8D4A63C8B1B49F0D96483ED300C5D8981DED4D4055863E398B1379EB039CAAFEA87B6EC47ADB7B2D7CB07EE9D29A85B627B5685F1154519EAD0295E8E17D02B15E03A5B058D679CB547B9CA5DEF8DFF3B81182C9CB2C9D7ACE9B9055AB63FA8B443E97D93BBF9BCE84F0C5EE197E156C6EF1513227A13DCCD33BAE432503B6FBCF0F0CE74590AFEA0D2786C33E3C3D Key = DE02ECE25089A30B519D54F375BCACA7D3111FEDA897046BE15EF308146CE733A1D3F8A1EA1E176D0D348201C014CB3948E3735811DC6A3FD294A34DB9DA5DE7 Nonce = B6D88A316F8968B78D46E2581C49D8CB In = 948C211406A4634B01915C604736FB74B7FC60F1DE43B49106840A60DCEAA93D8DD4468D13382C1CB2120924212045EF1FA7DBA0520EDD75A958ED16BB4AD0C44813365465DDF51139234214BD7E0BB414DEED1571B7EBDD3ED3BBC2F5CD04AA92279D36235DBD1E25D9C3ACF5EA6603749FED072AFF287813F2650FA208DDFFFC28A240C9E138CC0E83D478ED083C7CCC6A8BEF7ED7E8E89A11AC6EBFB8CA25582EE1C76F880EE2FDD2E4E231DA4967CA8D6EBA943F602565E228D98A47ACCD96CF2912351DCA293AB91B53878E99716B25458BF3CADB247C28F2C4852FB655578BD8A5F6D30DAE3B0445AE3FDA30C77864D6D065122EF269B306AF Out = 61D1A1F7B08FE988864ED0C2075C17067454C98456583F6E7B34755D066C8ABBCDE4F18219AC1CB1C4211CC8BEB7EAD789F2E8C8B0D18BF8AE19A38C8208749818236C4B883D36D35D0791D13F41D67E51D19BBAB3B5B6F6886909C7743DD5FC965BEA9F9F75FD8078E791897406C6F135BAABC1103C99088F700A6AAF66A665DB22C4D38177348108029FE78D98CC48FF90D8B274C8451619D967909910E0E788CE75D9D7EA77B1AA35A84FC6525CA4D79BB10E8E375C232785A3F7620E84CE26D88547571CC936F7E8B37C85CE4D15A38DB35CB98E75BCD748A6AA64BA3879DA4797BC6FA239C3DE4B5C0F2FC2E2555936DD67564BE8C02C2B8697 Key = 4CC31C503C936554D6B74A9511C4D5F1032F188597485A4BE78050D61BA49C4AC2D9EC921487EA6D58EE66DEC9630623C0D781DB7990321A57DC455D31212653 Nonce = 4565AE21BF25216372E57BE96B5428EB In = DFA4FAD43CB5B460770F02886FE505E930B479892D32466542ED5638DAD9BD6613E5555FCE95BF1DA166881ED0E024AF9EC9EA083685D5ED0AE33CA22BF40A8667F4351E62DD5D47A9973E5CAE0A3B1BA967F5475F7ACCF42C8E42E2C8466A38C4E066E0C614FE9FD856CB9F4C23C6C8E5FBEB7AD45537F42657F1A7B703322C3F087EE1D43C9ED6E9055A7B72D007C731D64A63969A3C2E256ECBAD3EE61949E37006A8A7872D78BEEF3D470AB6C7D643DB6A63B0F7BE3D18758C1B246F9D770637C5F111AB21DE24F0CCA2C3316749E46D98B909D0187BC167FC1C755C38347B78C578F7475CE0A61EA0C0553E24253D87A10A768340F1E3474ADE2E Out = A474D5A4F18E39C264827D3B2B44BCA5243D0C2B117DDCFACE4078D4AA136BBA27244D6AD637FA1AAEABA4573BAD396DF3435649DA2BC081C9B7078C670CC47FE9EFEE55D1CE351A9379A1A697ADB104954BBB786674EF3D942DA1870D49267DFA93DBA094F72AD0B0085975BF38F401CDC0D99A44A3446EF55469EDD775CE608A07A3F2ABBF5CB963CBD3670B1EF93DCFBD54F19E7CCE3F837E65DC392D01274963828402DE7AB025B608C88153FFD193EC82D6DD82F9E738776A9B924591AE9F563DA04E1CD64AB5E1ECEFED6DACCC68FF5CAFECB3876E026177E9FCD17CBA3E692FBC2398E3D0859F72B7DD82322850C210DEFAE04D8E5A9CA25C88 Key = B36663375BFC993091B4E74A2BF2152695D8100AC0F9BB087F9575F04C34F1E6E81E2F51A33F0C327403E81605391295FFB4AAE9E10D85B96D71F0EB3E888CD4 Nonce = ED53B4437B72771F35DBD4B0A6DCB510 In = 67D65B8A546886856699B229E6A955165A8546246DFB73B33634CC0D2152E85D4453F00700A5534B3D1CBDD023DAF6572500300C8C7F1FB74521E2AEB12FEA74DD9B5B559E7C731F0E46D4B13EA67350D01866F4F18DF37A5894925F5478E6A0BE6C9F9F0277B365F309A45FE1B8B6250F43795152593DA988F3B3C00A49C676CDEB84BD888B9DBE97A869D43BF1184DD6C7A1C7BD648752B8D623B043351A89BF3F57D9784D9C78AD21E163EA8FE1D80FD3C8E7BDA24CE74F0AA1D162179874268BEC2ED4B68711124E551733112929F1F2F416477CE2D3C3C2BFA071F9260B6055273705196DE4063644D6987CA8408B222F60C0531033311598669BFD Out = 38508F9831BBC8F15D073F06F236686BE9076E236348662A38E7F5217976CA70F2C16ACE77324490C00AA10C509E1C76E6C4B7A8FBFC2A9B67740F02B2D3DAD38B0556B12A15C5754F1B8243251A0177FE876DCE216D1250300C60F55410B3022518440CBCF2DB81D947CB6D437094976A488CB659DEBC9BD40E508218250E9CFDCF0015AD0EC3F5AA4E5828F87DB89E5A885214392ECE970035BBD263873DB1CFD8B605C08EBCD1B7919B575B97657CF7914449EABB0DFD7F4018187C7A4BE130B638AE3DEF36384EA7E5AED4C02A72D038F8C92A9CD33E48587F6AA91ED84AF2E234FAED0348FC27322D61E50791744226D536B7B4D4428AE188EDEAF4 Key = 876713D5072CD46D22282404A9FF2B4F561644F6A97042E9EBF4B67E4C92AF477A2FE9E9B0AF0A7E83FFF22C3545C07862AE0A825C0426D17F6182DE87D114F1 Nonce = A9B40EA933EEC54BBCFC493688F03FE8 In = 76CBA3C36788D56286637AF36F40B8CD62DD6AE1E98035C6890C793CC9BD7B1629BCE020FB1D7B9DA888C66740153AF23CAE3A1C67C12BAEFE5EB2E50658C11B481B7570AD2E6171721465B8044BAFF4917A727E5270EDDE52F9EFD73BE6545F3D1150F408C07185761D52B3B39AC97CE30CF6270612FDBE71F3F0119C1D97C508F196458D27A9F72BB70EC17AB19A2BF91ADB60279AF129A40621DC2D480035E23DD602371D94CCA27797D6991F6F3BBAAC3AADA8B5D45ADAE004AE8C8CE0AA471309C94BF54CEBEB5122B3FE553F3F01A96D85ABD604FB56DC2601E9D4FBE29088BEF2BD44F22EEADF68E26CCA389E3E683D013F8A396E0F7F35B6E72295 Out = E0C9B77CB1E62B69F73D14C0DDE478D35042CFC7E7BDE2375F54296278E27512EDD25292970B0BE93BB08F77FE96E7DBD6B1BFAC0D69C040C3B08346DF6CED119B15B823FDB835F4BC0DAC5805BA9724FE89F4A1ACF1677A0DD8AC0F2A1A48CE4452A778C209E54F12F46A663B8BACB11230D923F4F6DBC8AA6242B628554F11BCC6A9F8BD4F589A397F8377D50113F56E42FED0233B8DA9BD285DFC058D989FC3BED904FDC4447ADE85A52F8480BD647AA0287D2265CDF2311938298B484C6BB59BB978A92E809FF5F93D324F65087AF075292C700C242F0030037C833A36BFD8B4C13EF601E84FB07D31CBA3F898A97C56D4F2203B2B517E16E7A49DF4BC Key = 03AB68E651BDF7A802B9CDCE5979E8C5BA50011CC598DEBF9C96D5AB24A6D687C2A13F7CB02DA75CC169B630B70A03F899B8953E1E7A394A0DADC0317651A0BF Nonce = FC6A578B92C0DE201C0D2397EA10FAEE In = CEEF22020D5FE1E664D7B6A621599124B06396B2698AA835A1E7D18006DD7A1F22A6DCB877C2D179BE4AABB0930533B13BC6B81393D01B959A480A1B53063792D3BC0070DBC433B7BC296BECE86874FE1EF3B98E6E9953B5566BAAA8E74B380E8AC347128EABCB92D30ECE67D9B4294FB24B697F8D3F9CE8A8AB20171A627D11258D00F0E13E990A1B6EF0BD9019BBB7CDB3A0E6C2B8F45F599BD76D75D5CBE8D1BA5802D9C08AE51972DAD1CE1FECC12F4FAB8D57725FC2D32CA6EED6099F07D19F00AC51E9EC0E7F40027AE87B3B2A02577C1ACEEB0672AF205DADE83364036C767A0F4A264E03CB3497A66122A4D713F84F3D6813327A1193A9DE61D084AA Out = 8CEF8DFFE12D2E10B2587FD60464AEE0B76D07D5B1F7B9165669C7643EAC77776C0C6E4A1B7ADC275D816D24B67C84A12397E4260DB19651903DBDBBF15613D90E7CE72A1BF4EFF3A67F05CCB9995D6429C1A3105BA79DB70903C340BB9695649EAC32737229B4EF57EFE6DBC638626D15765559782935FBE2F726B84BCC6F45FA5580F9242D675443C7BD0834BC409420B546914711564B4E1649772D483A42C93139D4BB95EF5AD6C4191EA5D50A5AFBF3A5A574967A29772A091C2B841098075596BBE5B5196B7F88AA39A43CFD4FD51E6011778958683954FDC644AD80853D47B1EED46863E18C1A9D2317BA6C82AC5333CF159F239324475077FA623CD2 [Serpent/XTS] Key = 2D2E5386BC3B936D07D9CE11E43CA175906837678B102FB8EEF6D8A02B214ECD8E4B76A03B93CD69075081D9BAF99E83F88583E620E351B3C4172333969A7135 Nonce = 38EC40B118BF54A851F55D7659FC6FE2 In = A64912329C9D3A304B838FB087750A63C9 Out = C5C91A425602B4CE6B81AEF70C57CBD6FA Key = 3303EECE235D3AA3111E48A580D0F7B9A008F102B1608A57B730E4671569CD6150E22631F2C6227B7E27ADFABCEB9AC1A37B43946E21AF0B9FAE85B2C0E0A631 Nonce = C0E92A058A0921AB961FFBCACE0E39C8 In = 33792FCFCA4502858F43260657F986EE5A13 Out = 7F040FC5EFD0EEEE7183D3AA8AC496FABBE0 Key = BC87297C1DABFF03DAD7080F4FD3F97378B8FEFD77489DB5DFF6EFBB05683661ECC5785207495CE376F923E47076D218C2EA999F7D66A92E674EF7B49BA5C3CE Nonce = A3090A3A117A4EF924069331945FE33F In = 114FDDFD42873966893DB4A97F54EF8062D57C Out = C7D739AC4748BB6C0E6F578AB6482F436A56E6 Key = CA0A9E45CFC1E6AE704028690B46ABE1710F18AC3737347F71C5FEB8125FEB230CF6CA2A2364F300D9DD3428E301C5CECF5C33FD27167FA95D144BF1F3DD683E Nonce = 4D867869EB5EC15F99710603B457A23C In = E0CD635C50BAF984FF26CE92EFD2068DD9B297A5 Out = 52C4CA78FAA1D5C2012AA75835E095B0E3CA6BD2 Key = 0D52EDAB29C08B1B06964AD97294D8E494955C9B46DACC57E67DECAAFD5A33998875DA8E4CBBD2E1E7AECBBC236F6EC068A5D8B123824CA08A14279F06599CA9 Nonce = 572937FB80372E8C98E469509CC4BEDD In = F7FEBCE430AFA8FE5CEB11284B9DD6122EA5A40367 Out = 763EA0F3EAC3935E25642AE16F88BC87B93F707092 Key = 1026843F224740ECFE9B9346A1EAB9C47BF1B0A576C9376BF8DAA697F36D2366BE8DD9DD884D55D87094FC5CB843B4F32200646E8CFC982A2CE13FF90BA82632 Nonce = 8DEE91215E68187CE1B16B30D2CA4519 In = B0F76A78D897A211DD8A18AA52AA8D72E859D3378BE0 Out = FA2B87DB768F28D3BAA970DC88521483670AE12222DC Key = CAD3CF326112C3257F265F12485758F5C726E0417088B9A378017893A74DED1B47147D13935072A97F4E20DC75099A50B625673E7BDDF8674631CEAAC7B9FB5D Nonce = EC1720B2B572F8B32FFFCC8DADB9BF42 In = A2CFC2925ADEF9462638C2F3BA621874FF520CB515374A Out = A3D2D5069608C7F1715E4B7420658DC186BA0BFAC8B89B Key = 1401416942F0377C7BC3C6684D5B013A642CD5F46D3F30746B506DC115AA0D31C78B21DC7D9DCAD632013FCED931F7A140BC9221EE96B1DE62CE5AB6075AE86D Nonce = CA9891C64F86CA9D382CB22F5C9846AD In = 937C6543FC91B6856C10FA0F7792850DA87251BF42CF3FD9 Out = 759C6ABF8C39AAECE8C1DE05EC4FFBD669E60949A26CF6B2 Key = EF1484D894B1F28E9E0ECA1F118FC998A4EDA2F247B5D6513AF075CFE65765A993624F2EF4A5EFFA84B2726DE4896EE076DC67D16F8217F9D2880C442D6513FF Nonce = 25E39A07E7F0C1EA5027517BA44FCFCB In = B0438EA9AB012BB8E564FCAC88E69DBFA9E8FA7592D2CDB83F Out = 358C7D0888188D9B8326E5AB4FF7EDD1922DFA9012C8CE107D Key = EF330CCDABCA8C3A8E08303CDA4BFB3248F6AF50BAD447A89AC0DD939E4EE0B80EB4D03B515C2F5D6CDC5CDB882A4A0902A161EA7D5B3A55D162C8A9D72BE58B Nonce = E368A7AC0867F1F037FA5BC712D16699 In = 1732C3978CDE150AA6B6E1ADF9478B420B2BBA68089109CBD3D8 Out = 5E1167CA5C684874E94BA64B34FF31B35FA488030A0F2785166F Key = 268F88383FDBEF3D78654B8607A405AF8268E17606EFE3C21CE2A79E22431FD5F03855E5345E3EFF0766F0AE6775D7DC14C8345D5830CFAAD7CC4DD1DDCDBB08 Nonce = 1CAF4EA6F270285448E4FF67D8088019 In = B5B8AF83F628EC63BE8179A967D52AED11A1D66821F641A10D9407 Out = 319AECB42B0B41F460BC09AE543014CC773292130615D663D5377C Key = 8E27A37490956A547BC2B909968C2AB009AEC191479402AA8E2243197A26CB2E4207AA7C71DBF268D5EB543B2D5923CC32173EB9F309A7EE7B48D4C96B446597 Nonce = 22E85BEE91A412BB408D433CD69341C4 In = 071F2A61C5B56E2F547731CC1D5F436339FE4FCE9843F0F3BB6F3756 Out = 5DBE768DCA4C4DBC23BA9F5F91D2A2C3CDFDF058F74A99512DE4F445 Key = BCD2F39FC436A46F3DE97D7F3D14DF4D85C82156C2E877D1BF878320A653CDE8CA714A3EE99E5DC6DCBDB4B3E20E774DDC5763422E8E66CBD4A934AB86153D0E Nonce = 5FE21A17925581D360C6BA3D5DCCFB57 In = 4002B4A6E526199D8970471121492C7268E26F43B4B9DEBE1C388A1F3B Out = C3960534858D335D7A6AF3E6A4415EDA053BD5F53D28CE7F067B526998 Key = 8BD07C2737B27FFEDB503F817AE4A8AF32713D462CC5EE428A6A2041508C9251FCB30080EF8D08D8C59D3D8668CF71A2899006D673ED15E7ACDA41635646EE8E Nonce = 0467E8B154A1460A4915A1854723E168 In = A6BA11AE269BC64444693E1E1510578023FCA38D36B58080DA763747E443 Out = A7BDF3B1BC625B538E7A5F91647EB68B86E85F21F12D256AEF7FD6A467D1 Key = 6E2FC001D8054AEDD2600DF63FCF87B6794170C99B5D2523F9F8F5B4285522F87A7F241200A0AB49D64C819C08F6AA9D3B0956637A05772FE80763FA369F051E Nonce = 30F231662ABBDED943FABDDE3221B631 In = B5CAAC897C50CBA32D2ED3A910F7632204FD9F21729F2AC0D4AF12FB42D7CF Out = ED5B0D0B19AE8B63C0A4D6965133CE078A40E5931A739C476AA1364A8DFB93 Key = F05A9EEC5DE3364407272E15822008E57E1E808634CFADCA76DF0942D94BBB63536D8AEDB16C77B5FAA086DD41FD8C7B62968FE2A0C6844DB7FEAE51F22AA0C4 Nonce = 85F2D8CA7FE78836B6A98FAFB03A911D In = 62BB3594176F79E3C4D3E1A79E74544E7FBAB57CAD1D06175E660386522452F5 Out = 1B87F8C19A41BCD059BDA7605EF5D39B361383017B48CED06FEB829BD096FD26 Key = 37E7D27C585832360629E34343F4015937EEB4987F28077D227DFABAA9398EB23BC3BAACE380AEC2A6B51F68F0646F2B33E6BD0FF714112FE3E28111DF8FE423 Nonce = E57ED1D0B5BCA67EFE6E19614B05BF1B In = 15382AD48DDB5D5BE9B41FB73DE27CBF7FCD7A7C7FE5380648BDD92B0B228744D2 Out = 8C8E754185C53C63C1CDECBDBD49E6CD92695796703ED5B1E6782F33FA9FA71472 Key = F91CC4CC7C0621E4F9FF4B20C7460098A7FA3C66A6A6B4655291EF8BE03B4E929601FB324A5928F37D2BB5F5A13A21C4A13B828839297B7BD7DCF246B4B52E70 Nonce = 395DC769949C27253E8F56398D14BAEA In = 67DFCBA843ACA0AD9BF86217AE1CD70BA0B5B72E5BAE11A70D2D458F28DA1B1A7CD3 Out = 754C70CF740610D4ECED7EF0188D08194DE86DB6EE68E0F957A41A0405B9BF479948 Key = F30596A80E7B20DE5DD02DEF72C96A76827C3F704C2829DDA5DC402DE218485BA02072CE6A8D9455EAA9A1FD7FB0320B7E61B91F1E20879AE971CE8E0ADCF423 Nonce = CA5375412A13D1CC69ACEA47238D915F In = 43CF81247F3B2263CABB1495818D21E62E1E5CFEFD9269EC65E558030C6907753C8715 Out = 9FAEAC3D4D9A0D809AFE1A7637C8D112C13B4D10482093F06A3F81E85826E0F33BB13D Key = 44230E0836B1316841C6A1D2ED0A0D2DB803252C5AC031C4B0D6D04BCA2C7B12791F0D70BEE29D5B5925F3BE8273258270B99997021A63E03857B64403A3C74E Nonce = 21D5D494A0EF531662DE801F17FA9995 In = D5DA49D4651F0A095F6C3BB6F26D6F3C74F82B66630D6E2BF88F599225B04E20192A70C1 Out = 512468CE96E079766A780057B99E017039BACE411E6F3DEEE1F3FECA585F7A714D9BAE40 Key = EDC32E7905157CAAB42581A0026CE8B72CB98F5850D43A0525089DA6EBE196F20A28BA6601CE626EDDD6A338F4A196E9804CF1DF39E0EA83AF591D6EF52BC091 Nonce = B0A5355902E88A45D903996F5CF2DAD2 In = E98D055114E453F56891D614A4D4B1304F445729EE355A6FDE15510A3EBC3124263B5362A4 Out = 21725040DA3AB19E2F7BF49AAC0B3803A1810DA1169590C1A1E869BA82A45C506DDF6BDF36 Key = 91D683EAA7FEB066EB00F1E8B499302DC5E94D476096E4C4E8A5499B6242A2AE09A1708DA9311934E9CD3A194BF9332F8EA2772E18DD38F8D742FAC64B52A9AF Nonce = D19CF496837C119C600BD2D9AB4A3A6E In = 04F9A067F81CB3B0C17B503BD2B3EED598E0FF016D78D52ADC2B20E0C9C819E4311C050562B5 Out = 1F779BCC7C2F3BF137A3C40A833F4642C9BCCE6B8017298DB2F4EA2BD970FA269F963A938138 Key = 9BE4006397B5D065AD344491A6A6A4338F221710F72C3ED04A4B963A48FDB702B465AD7D9ED9D16E8F7EB51F41A17E0A8865B06FA89D21DBF09CA6FECD3B7853 Nonce = 1C3EC19EA57FF994C6E57877FBAC9F22 In = 030DB028A774DAB81420BC35A6F108C14406F9190486207FF66A83ED3FB3B513223704EB5B25A3 Out = 453CB99DC809ACE604C6C74175675301C3214F046C54601E0FBF7416E7854691F3CF0193E88C1B Key = 436535A2B92E39E44A24CA2E5B478B419604C6DB68DCFC96A0C4742C4FBAC1294B5322569F5F955CB4D2552F6703933F0F7A8BA5BE7FBCCA3A5ED4A5AEDE1EE9 Nonce = 6EF7D677773CBFD4478550A8C50F1B93 In = 6E03086AD5B3950B55BB214D67573A9F996EA6B0A05F930685B5FCE95F13E3241E0BC766E5328849 Out = DCBD06446C6DCD28A06BD287EC91D2873A08EEAAD444AA05B3E041590528B1BA466A59CAA4CA8DC7 Key = 9D52F124B7FA05A83BC93548254E1813F0F07EAC404E97417CCCFEE2963606665D43E1A7FE9E561567F29A3F2581A1F22F3560DB7DE146632D7A4166A4397880 Nonce = 803FD28367C59E8F989E2B3C82099BC5 In = 71167FAEDC3DEBA25E2175634F8662502563EDACD7B1F04850E013BD559F8EBF6A1B69758515CDE11C Out = 4A800A9187795890B13156AF8F321489B1CA3D80FCC1413FC0FDA34E979D1091F5DB2DA14C715B8CC6 Key = C6FEA95C04A8C60FB5D0F5E2584FDF47EB2052F1907DEBEA745466061A271C6C68F964F3E632E33EE161A4362EF7138F342311F1F894EC64A917AA2BC9FE39CD Nonce = D15B7109DDA41C6BF165BBD77E694153 In = 331BAC0C68BA4C57CAB13CBAD0E1BF9185CB5334FB2AC62EBE1BDC8280AED2032B0408C03070666E8A02 Out = 9A597C07E449E4DB93B12AAA4ADEF1EBD2658900608B76A8F9E82F84B7E88B2620A9DF213A4EFFF9BD09 Key = 08583FDC6287F4111B846E9E441D86A684B283033D40FA4E05249BACA632648B8C536E6F166731CC82E3B9E413E55013BC0C6F21E16986A83487059C7E760243 Nonce = 20A1451F4A0C54B2850F8768C23EF2D2 In = E7A97BF5B4D93DF505C2F3100C02BD3517E503A1BAE1DB9A03F2C6C628E39113C35B5DE32E3A1F0A845BEF Out = CDBBAE44818CE74521CBE4640031136EE54D7CE063430DB4AC0265DB4781E501D1F38613D7064329E34F66 Key = D15FD7E98A90913F6955B818D3B0BB5FD6B5F69698A260047F5EB1695D1DBC2D30B47FCACA64E008746402DFDDFF109F1CAB2097CE350E3815997E82B824E34D Nonce = F1BA49B34B5241D103D5708759AA1043 In = F09943022DE835DC91022C8E3469DD30672936F47598AE45D2E9DA0AD202872F2EECB9A0D7DF5C43141137E2 Out = B6B6A65915862C183AEB24BFB067D820B5C9A2A2D733DC8B6A447B92CFDCA88565B329C13E0760A056AC1FF2 Key = 6D9ED6B853D403CC8912AB580471996269B47DD71226A740A160FF324ECDBB17984DF46B407C0E1538C09E88DFF7D3875377CFC2C181A47ED61D3A0211B3829C Nonce = E70DAE7DE687411F326B3708606B1731 In = 787BCB7FA345E332F3155014BCE227ACAA34BF1B5F251C841D192DF9AACB98701A8B703659815326E347968892 Out = D7B568B6713868E3A370C42D9736270D2D2B530990F844E7B0662CC5AF5A0017224B391C2BCD41DD967FAFF0A9 Key = AF24F1326E477305A7F3C0E92F6AFB4C78E1354BF33FFF3A69F85CB46F3FFEE6A376567FF4C48A89EF5D0F8BBE89A1067A72507F3B6E7796FBFDC2D6D66971A2 Nonce = 520D7AC675F475EE27B403885B3FCAFD In = 125B0831E1B9D2CF7D2217721C23C779BB6BC45AC62883785EC5E6C6F4493C4E17BCB79832C1CFAE7535B0F52255 Out = E5EBE57CB7990D92E27B11A9A033FAEEC0DBEB058486125CB4546896E109036BF6A42482D6AFB6BD6B9E19760863 Key = AC1A14214B02A17B4D3D300A8EE70245AF1204959FFAEBD5AA8508A4F1D84102CA67FA28E059A269E55DDB432AE6DDEF4BDDA000FC6DEB2FF11CE5B931996D2A Nonce = 34F0F96DC5CAF8E0A34E1263B3241B15 In = 776D3FEBC22DF177452FA292B5600D1F8D2D9547DDF425E335A7781F4D7F99279881FBEB7C250BE7EECE6277F36B48 Out = BA5C3B967F3F5AA1FC6BFCA27B0DEB3690E97D656877A3A5818770E3F67EBB0C45E85F3559EA97929E813DC62DD981 Key = AEF2902BD2C42F5A0844B7B4128D0D0D832B0EB2B70E0B308303CA118340D3840A75D04B10EF6A5110F6C88448B7E6EDF6D5439B0E1CBC1FBF93EE4880EA3C7A Nonce = D820B643CC274D882C94DBD8FFF6A253 In = 80F2B8E786863B481EB4EB37CACA034869AF225915173B4DD48502CED11AA9BA7D97708A19165640B526A655A9C90187 Out = 8F1FF889C3E7FC33D414365A191A41517B8BB420174C9E16F268B74BCA39E29F609262506B1656A0ECF08FA8FFC7FC47 Key = 021963C34CA80643037F5D395009153EF8F44907B46C9B72A32B93AEB2B6454ED2F8EA52C34954FBFF83F3BA18950E5365FDB4F6FEF563F8C61018E8D09F9688 Nonce = 7AD04E3741DD2BF2AC097D5650A2DED1 In = 618321D1920AF6AB3B8D047A707C0A26CEF5776D5F76D21AFA82CB56C26A5D0515782DCE07EC23D7985E7A9F76665CFEF8 Out = CC31FD0BE47DDECAE38A95B67114C2F479FD43AB428569BF68125E040419F9C812A80274C765232816F9E97EC49BD62621 Key = 7D855D24BF28EC378ABEA95DEF6BC3AAC6F13573D716A2125CAC654175C992882D4756D6B46255A37C1741EEBA23681F26B70ED132AE3CD4E71BDF15AA41BB8A Nonce = 26A8B30348C34F534F9D116FD536AEEE In = D6A914E0F066A2CD93B2B0B0DE71FD306F8B8CE6F2D7B0BEEAB39B96E8D688D1B02BBD983B42E7670B9C6AE107DBB5FD0C4F Out = C24784169E7A54A4B14940DF0E730D5A9EDB2D8BDEF6DBF13C0B23C312E7EA0D8DE7C2B04CB384D0BFD0035743CD159AFBB3 Key = 678F63B7644823FC9CA76864852658798488037AA055BE143D56622250265E02099427B369E9D789AEF43ECE7CDED6172FFE61A9FB77793792C8ABD1615F8D81 Nonce = 5E7B9D9DA944D2FC5EFF825CB225986E In = 548931C48B31AABC6B78A73CBC76AB51D92A5A53626B97A922B7EC7892FE4EA4F506A58BB990EFA1CC771AA762F339FF536FE2 Out = 730589AF27679A9726111FC1F133799DBA6FE7C7D0B944DA6CD8213589350354F3DAA15B1539F09E3C1FF3133EE0519FD473F3 Key = 67F070A8C89E7BB8C24EE530CEDF15CF68C2D2DDFE0572BB8A57F741A16B2F655979614C3D18837249E76164FC02654F896D7035B01ADF81D0A7F1EBA2209B23 Nonce = DF515A3BBE568EF7B1E308DB5D6B319C In = 07107C702CDC6E88600F8F329C907C47EA604DBEE2EE3048AFFC777DD766920DDA86ED1DB84D0A74D05A1CA2E5FE31C784DC6F92 Out = 8085E9F1F6A9C103B35D20C52F8F3628CFDE1F116C9B58AA7DEADF65F29C4FAFC3F0A209BAD176EC86F0B05C4A7208EA5EA1240A Key = D92BA285C5311C9721E06BDF23DC0AB4E9AA95224548E6FF05937B21753AA26BDA9121696545B0F466E7265C8F6CFAEF3E3DAFC2E8F600978AE2B5FD592D79D4 Nonce = 38ED78A11599AE454E17AD22652F428B In = 982BB3850E4DC983D4BDF06CF896A4E9D627143E63AB741C7A15F71589E3F28153F8C6969CC1A72E4D657154108C4DDA860AF56FDC Out = 42D328E475E23632CEADEA4AF06A3A9AC7E04F190C953EF0734218D47C032B6489A5F5FAE6BEECB7DB07A4CE2663C23A75F89E7E63 Key = 0641CD20CE2C2F599CEA485F594A700D71F686DAE8143DAE2BDC6A05A4EB7D4307F55E27FD5AC064D65F1B1CF5A1E20AB17BD8FE00EB2184CFCE23E2CE9CB8EC Nonce = AB73493267AAB67BFE11A45D0D133A61 In = 79DF47BC899B7E1D793A7602F8A9932CC3EA231AE881F8DAEEC7C20CB6EA709E451C0BB10E2C0634D8E7D47E28A57906778D8447E7BD Out = 30AC888D1011A4669FB77BCC413247F69C889EAD7C70009A4F805BC696DDB0AE11A5E1FB2E9E6814C23C616E5AB640C15F3E080C91FC Key = AC335B56AF79563F9CFE27B893C1B906B00F3008C3A7BAF007BE2BA4DF4A4DBAABEC4889CCC7BD87A568D2917ED7F9507D5AAA5183D9B4646B5B1389F927F85C Nonce = 505FA490887931BC21326BB51AECBF4A In = 4BA2A1BF88D9B51011509E40D1ADEB5EA352CB0948D77C4D35B99B5B608147B03A1C0F9FFDECCE78C90F46C5B542AF31C62F4CCFF4501B Out = 674D7CF26878208CF61EB61807CA6E816B96327C2DC69D5576A149B8A18AF171707A74E4F6FFF2968FAD1791DF066160BD259E8586DFAC Key = 89F8100C456800D0E6E7FC23E707B1D6016F9CA5C7AC04DF276BA763C969157D6F1286DAD3A303F79E77F5347D861B36B80DE239361623C1E3873D6E1BC60897 Nonce = 2B6407677B7BCD9AF8A200275F97DC0E In = 2D66D72E3D8A1A88B9663676EF1C5AF7B37A175D3BAF0F9BAA3AFBD34A01AD26D7E0FCC2B49A79D9B96384490BEE585423214F75F142A184 Out = A84B6BD1009B8CE205E56F276F52F23C079A3E74F2B9223A3B5B62D51E11CB706E2480B726392500A47C7C1E67EE9C154C41E7476AB8D685 Key = 70B64496637404919D1258209B9EEAF4299AFF4FA3B8D1FC27560FA1AF2D37FF1FADF43E4845CFC24E535C140292353AAC2D0C74E659A72F7ED7FA87342FF14A Nonce = 05AD42D5E2E7633DA65906889DB23511 In = 9044BFFA517A1EAA7CDD8039C70B04835412A90AC3F55C3162ECBE83425A06333205BE4C3EAAAFAE8F7C7475E01F670229F3A63360E43BB603 Out = 9DAB127B2981927BCE9A2F0147B81B67DC568DCE8843C1665846521D76CAD62BDC9C6E4644782A62EDE283942F94446EE4459D1D0FF20A49BC Key = 4B3B4EC015C2965C677660ACF7290535AFDB961117EC174A6064C435ADE9DE72ECD497531EF8A85E9C9ECA6DF819E0207857CBF05309045E3395F0CDED42BB7F Nonce = 6978A2805F56C9181A1E8A69A620C3B1 In = D960E3C53C4FC18E33D5438F3716DF0B249DB29303B3C978011A818C29CF7D14296ABF23F437E6D60A5E33CD8D54CFC8B893C4AF5DD3F2ABB265 Out = 073F377C34EDD3D3D80084E76DDA312A41175D6C7319EE87535CADA1FD06796AA7DBE225B5682AC229C8E71947DF3F7C1E7759D14DA843D3F4F7 Key = 650246ADC746D8B040F5F66FA88B19E3B1D2170D4BBB420CE65C48367F46AE3F362A7819AD347FDA0A897F9AB3B6BCCD30A6F6C01618E1C0E83E559FE49C66FB Nonce = 408111F50D7EF68EF9E5E0A674F56802 In = FAE7F5DEB49358554C36BF34C45E1CECCA4D78664E281549D970F9895D76D6C0366715F690CD90D06461FD1EF6A12A4CEA6C98706C2DC28B7D61A5 Out = D733D742DF6A7327BC356933958D919D8595B91837A85D421B751515719492B2D2CA83A582982C72085885DBA621724B1A17E1B94935651B3B0F37 Key = 0CF9B672743456723CEA953937E663FF4E2E583C3E9C819997CD1BB8F362E184DE69AF4A4D040E1B5E710ADFAE3C1ECAE9734397BB634BC76E7DCFFDA9747C1C Nonce = D54C647BA087A7712D538AB19F8A4F5B In = A7CED614F48880BD1F401AC2F1332F175D46417A19C17A90A941E0DED59C5C25C152299D253108FC2EEBC972D0A954CB83203DC8EB72E393EAF90BCA Out = E4D0CB9339F28918AC538B6E8947C1E6E54BA87BAEB88974D9D8E4F4C04F5B9BC60C7181BE039F7B50D6B46768FB8951120FAF63F7B81CE50EE1092C Key = 4DA3D4D9A992155015C806D9E84EF5E149FD20A3D9E258DD7A69D2952C0C6E3CC7867DED5926F7CA9FA6C0BC6AF1A3134E4AE9C4E97BC25BF339B4F907516E0D Nonce = 9A81E5FA3934D192EE249EA8E7562870 In = 3007EDA2A3BEDB4443D23FCECC42936FAD5E33AA9733FBCC8B172692F034301A288E9811E406384A79D84C859D0288ADADAC9239AD70E7E3F9A332729D Out = 8C3D6F96175D345DC5F25F19F3A30CC1ABF1051B0509520E91EF4FE9180C441BAA40E84D5955566F402935FFBBA10C8774869CF50AC7FB17B5E3A95397 Key = C492F6251A50928E0DD8FABA215CE6C9763B8F3FC2C6EBCDC0EF24D5F09F0A68B20CDFB7F40DCC8EDE656556713AB51421C6669C9B59FF11011DFC7DC590253F Nonce = 7B77974EAC00673107A64B08F29E3237 In = F8A4A921EF927C69B533DA38C7C691A6E348E0DEBAEC55642EEC34F42645D306309A5BB3574836AB2C76EF3258639425D128CF65C7B19387C2D0813E63A3 Out = 57440E748A38DE81CBBD80B1F3D1196C7EE9735D5CCC26201C05C28728FEF9E4159691BA02E6A51F9D38CE9A89A8B80756B9A0FA4CA9B709303408CF2073 Key = 2E922CDB47B6E777700E1E78481C2D4C70C6F92F331098266EB143C1C381C2C09CA5C3DED5E7A0BAE46E30165DC88940B7A0452E240A6BF06DE41FC7074954FA Nonce = 3F5E84C1B5E54EBB29436C367310D491 In = 81D95F6987B2C0C104E2032911BB510F39A56368B1CE8B4B3FB0F5E53AFBBCC17CB15327D00B4FA44EB30D59C1622E23AB0E273811F7DAA70082DE1A44AA1C Out = ADD06ABECFFE545062871E42E3F2D773B227026261AE545FE1E76E6DC6B0A6262B95035A2A5C97DE5AC27565151ADF3FC17A61B9C1D77A25FBE48F6EC6DC26 Key = 4B4AE0BC8AED1CE4A52F1CBFAFCB2EEDC287E715D3506F3A8D80AD82BD7631F2EAA9DAD03AB68F49C6DA9130E8E8BEA95E36AB423898D27E2D5E09B44EC0D280 Nonce = 1056E8BDCEF6EA625148CD5F2F0F72CC In = 15DC26624C9CA609300BC89CF5E65538C9813D3D6169B8567723CC1D20401A2AAD3E24DE64FC2ABD9EF80EE99C5DFC4463AD7F17B24B9C34822F4DA2AA085139 Out = A7CEB2F08743695E4F292BCFCC7C73F166A241A411716665EF32E8A0A0974918D70C08282FDFA91355CAB04DD4D5E2F4B65D56D153709B8791999F82C3D757C2 Key = BC5AD4FE0A1A75C1DFFF19FFD9E607EEDD9897E592079829CC99C27281C1ACE8ABF7E78BD818905246D4D1ECDFACB9B3C7E33CEAE3E4A1213E372EA02B2B8446 Nonce = 7E351957E1DB7F7F8947625469F59AB9 In = CE6029DF95D6E1F322C30361328E59F8FDD28F9CC38C3E04671AABA20D5EA355F6695AAE23A0224F34155A17D9DB8D56BF999AD680B937538F5D8C6732A6CB6700 Out = 6893C033D1E7C74C0B8185B0ED20DA8A60EE89B256857C3DA4E5C9912573AF5566B54734E1A364F34D82940018E210F3A9CADD29C816951B7369C7D33271B801CC Key = CDB89E813EC48551AFA46C5EF5C63A863B704F57CD4E845006BC24095B5F4C83896A88872AFF5A7FD2F54E8F8C8432A48DC4377287CE552E087C80F60D038266 Nonce = 9828B8860EB06DA7807DCB2AA091292D In = DA438EA0ACA5BB7CC14D9A426D32D946C912F8DB3A457E04345678A7CF4EDBD6A1958EFB55E7E6DF23565F85F8EE0F0CA1DA721F7D1123FEA5444A53DF5E1E3A3D28 Out = 89B9CE7002F24085E6C432D45422EEFBA53E25F3375AC4C1F9F83C81470FB8C71CBEA5E95DC6817D6E89B80D1DFCE9D4C4A75F2A7540B6F097577AFA28DB51983B76 Key = EB09BC7197242B0BDED28D4CE461A52ED3B9BF7067ACF2047392103276618963A6B95DDB960960B600AB904E14924D3F154DBC7B0F24EC01EFFC085F7DD24502 Nonce = E932CB26EF86BB92D8D0DBF874C123BA In = 38F219FD2B5E5ED6CB92A152E3E71469CD7A4E2CA7687E6A8B888229B54E50DC0CD4126C2D5C43D147307431F1CD9FFB80AA173B556A35E7305116018DF1ACEB109568 Out = 7B6668FA3C4990108EF066D176851924237E7B9CA0EC5C217702D0E1C9BB6C5427A47CBE4CF299EA6C47C54588578E7F6348FBF0CEE26AB13FD3A1C33A154D3435A505 Key = 82A117DF507C79C78460DFFA54CBE38FC42588D000075CA58A01375B4AF47954F86A5B3649E6A81DDC73910AF02C47A5BCAEB5C09E1E5E7C03A8BCAC9D23F977 Nonce = 61D4BAA8C572EF87F5AC5B265DFE870A In = 696C4AF722D3C897A497F58EAE0B96954E4CB00B3AE22E2634753ADB4FF6A10CFD9D38EB4A9B297188B22034B4716620D72DA40E3D073AD47F98BAEE1F54165BF43BA540 Out = 5FE6D0DBBA54E0255A2994024E895AE773A517CA023E28F6B07777CDDE04A9F20A3283ECBEA25C47A67DFCEFE433E006E212FC266290B1ECD10CB4BFBF6FE04042AF7C75 Key = 800F53FE3329BBC1AD83B5CAAF0C4CE157550E5B595E6AC9E5D6F2AF9FF0EE6DC88C87B2D3E2CF558B25DF5C274A68A1EFF2A5D163D7F056A79E2F279C9DFBFF Nonce = 7F2360CAF666793282F2A00E9A37F8FA In = 83A845F6B6F794DB55AFF0720A238101C4AD89D3B159D32C6F8946CFC65BDD0899042FDCFC2E0BCC23A5A375BC7743A4C516517923CACC0FA33CEFC8CF2F2086D05E9A61C4 Out = 1316872884AFDBA1FE0A4E16D38071786157B3544F6F19C798129115AE2BE44F940FB3F7190F104C900E49FFFD3A5C21DA1B5B8ED2CB21839A18E79BE9542F98DBFC766394 Key = 6D34AC195EAC4EC8597138156280061BC032A5A9028475CF8A22906E991DF3E6F82BB9AF05778BD0D09D840EBF050E88950E56E8973AA3C329BDA9C7404C0E6B Nonce = 24066FFA473235D8241F55E16C525B76 In = F03E6746B6AA4BD48F7724B8DA122384A4B3E68E0C94E49D7D22DF006C32BDDB8D874395546285259009BB930261BED3D89777581EE1435036189CD3BD1ABC3A5AF7EBD4946E Out = 7019329131FDE731EDC64FD24FB5637E84C94AA687C3C754CC9B172E5AA7A5FEBE7F17766ADCBADB7F5D91BFB0A88885A420BD485CDC10BC114CE134B51DF05F288973FF4B47 Key = 4AD17BE331A3A592EBFB7B0E920F0BF6AB326C0B7059BBCB300710FE97699862C92D72472C48EA6EFCE462D601A6B4EEDCC169BE473C776F10BCE9C8B17F7C44 Nonce = A181B65C04851CC450DC51EAF76ABDA2 In = 0A20F39DB1567EC6CC1B61AEE4D40E59BA78343ECF9459B3B0F518105433E862903C37E240EF6676AC3133E484D4105A192CCA7D80D75CAB3D1D27B0F78F9EFBE1B9C0D694B8C5 Out = 808BF3A738579EB79CBC2C5EEE9B6B14FB938E3798A162F39ECD3B59448B1303AD44B0EE812941C77B49768B730277F8FCB7E338C14ED9987F66E25793D0F88B0956ADCDBB7E4F Key = 78217BACE102042F9C0BC63A4EFB81EE68CCC2A13083BF483E06635D1F585F92E04E0AFBC4C52E1401E1AB5895644C6CCD74217E0EE60683700655B829B96781 Nonce = A0ECF2769438C1F6288BE9192D776A69 In = DF9F849EF94245A1CDF7DD4555EAFBD4D1755B2A4E2821B3497890C8320A21693BD51F0AECE2DF3F4445B8DBC759BA2D4FC860F68AF5D4A7576695C63E39B606D18B3802D370DDF8 Out = 938CBC602BA5B8E0A2A6A894D6DB3E004909132602EDECF893679E1FEA0032C85FB087ECC430051BDA600C4ABBCCEA8BC22F5ECD4B87E9B4A43EF01A2264238D2C1AEF886A90371F Key = CDB943D0C98907323D25E6E6F20D6C37AFA439EBB15A7C19613E4033347FD7150E4A67D76C26B2B7C28787499531ABDA74203480A2D6C57F8C79FE7EA7E08178 Nonce = 59E21CB577AE8B72C61695A53B90B1D0 In = 673CB7F14B4E1F148D4EB16C7EAAB862571C625E0285BDC2304EC299D520AE448168424588736A52B858F3EC23D98F48DC2DD81E459A04A4F4410C78498C686EC0F4DD97B7011E6D65 Out = D60D4E5F585B9FA126E140AF76B1AC0CAFDEABD840C9C9DBDFB06F30BA6F449F6A1008D7F8A3E8D029F6FCAA79CDCF23EE3FC07A3E0586EAB4AB6D9E3FF77FCFF2F4FACD6B0552C66F Key = FF3A7CAAA2477056F09A539D31E5252CF016AB00FAF86A823D409406CF2D9BA091F842CD97938D3F875FAD92DC5847A02292679342F48E79D26BB688D5956D80 Nonce = C898B915B9AEFCAD0D3B9669DAA86CD3 In = C10B09A05BB1EDE31326114D6935A86493C2147B770F8B100F52106E0F22353C3EBF3439A4D309E3A9E04707E0FD442092744B91A558365FF9DCC0DA6BE49114A05EC24726ED7D135D44 Out = F1FE6F3B8DF82B819384799606746A2AC053E6D7A7C430EB21DEC88BF92AC7250F6FEBD00AA9E2619EEDE13392E4173C8CEAAB033E7C59DC0DA5EECB533ADF4DEFC5483AC0110F9DF980 Key = 70783DBADE64C24169E2EAA718401922DE21E350A36919552C8EBE572F042C9EC65A1131B090AF15B4C20F59B87D13FE48E7C8EC9D863B5B33985B79EA5D1436 Nonce = 9CB193F8B79CE0788A5D48E5952D4817 In = 0A4AD44748EBFF8F1DC606B18D1CAAECE82FFDB0997F4C4110FADFEAAB9E935E85BA0F2CE5567A867903AFF1ACF3FABC52D942A1253D7C7E2AEBA223EC5B744427A7A18FA54C2BDF03A6F6 Out = DFC97C5F9BCBC36D79FFBEB1ED106461C71D1DE8712CF23BEE2883C0C4C4F2F2D6BEAA3D1771BCDE52FC1849DED35E3F2334E1C42B4F78BCD08CB3E9F3C17D5AC827757D4310483FFA98E2 Key = B931A97D7D1B9A0D8BF1CF7F7A9079F459E854FF083B999B8B56C39C0E61206941CBC018EA4D3126682807A1F7C97D2BFBAC9B63B5D2A478ED00177D4E91B675 Nonce = 4091BBB3614F9FEA3887EC5561F00433 In = DF2F1E70B33C587B640669B4B68EF926EC9C6B51BD14C937CB4C0BDBF7D5F0148BC4DA12AC0CC6B888EF4EB94325969AA4D1FF38E5E787CA8B581F8C30E109CBAD5DE520869A6965CE43623B Out = 81D88EBE06A2594DA4BFB6720883CB05C674D47F35019C965ABBF00547CEE5F9848FFEE5F169B6D0E3944F0BDA6799E434C90FCF9595D33CBCDCD8AF5E11F3BB677A87DCAB7ED2CABED2B0E8 Key = F2C5A19572BC5CB14AC927483160391BA6366CC53F7F93F83BD1CBEAA2008B3483D097846180FB65B23D75BE5A0525612524A6300856A16D8D333783B4F23E93 Nonce = 3DF4824B50A5247FBE3A97507C5AF538 In = 436E6987152A372706942EEFBB7536E8B6D4CA6B363122E7F67EDC3004E1292B79BF823E27DCDE0482DD1D31F4D0D022A5868F57EA5329618EE9EE6A43B16C4E6F20435EE390F395AC1BB32A14 Out = 26471DBD891F897FE3627511B21B2D9735580BDC714D02218C2090CA8E7AD7FAFAD2264DDE925D0C77ABFA55CB3442BC8F08DF065AD2410F142DE823B02F6EC1B9A85687A0F9D1687DE53CF616 Key = 2661E22FE507FC2A25319926A82D3EAA27018DB8DF21D08493F8BE33926E5C9FABB2C787BCE03F5DA0218675BB7D14A8A2731AAB55AC159A1B3B644196BE540E Nonce = 7C7A1AB29A923F568F9934A8F24EBD58 In = 56BE3FF29860DD6705172269FB85AB6D9330C6A8F650F951D3470F64AB3C5615A1205D8067E8D39E5F366E9719B8BB01A44EED2964C70C9CDC7D42D4B5D67226665C8B6ADEE8CCEF263F75F7E58B Out = 948C4CDE3D816931E4EBE4673227170C4814890E8A6628D984E3F4ED875CAAEE816CE0E0669E5A213D166EEBC96872CE48FA69149D064146559DCD512E98561651FE18EE0F5964E87F40CCCCB9A5 Key = A381231E27F1320C0352CA0B74C6B47E8110F9690A343C1D5FD05926CDA42C2E103E9429412ABB7A27806BE91D7EC5A32CEB19A2A3D7C0C07BD90BF143C4462F Nonce = 497D9185B73F6007DABE550F21C76424 In = 357E18FD9A2E891D20FE1ED5A4F1AAD547F419DAC97A26398E91CFBA2918FDA2E7C4627F04BB6101ADBB7960BA07A86350722AB0FF01955664A36F7E53ECD1A106A73EF5AC50E16CC7D97AC7A24D15 Out = 0338A1642C3265BA015164937148270F8C4E32BBB8DE648C13AA9729B384FB76A1BA7FAA2BD255E07515229D0E6EFAA2EF3AF219281C2D375EABF36B35C7C31D9656AFB7033C02039B5BAD81CB925F Key = E7F526508EEE6C79C4BF495E3844AE3240C804CC715089C14253E348758647F7436E1B04439DC1E47867D5DDC06E30E435868696019E5715182234927CA62ADE Nonce = D1B46349354DF67115BD1613806BA0E8 In = BAE412A3709341D4E5BF5E2EA0069F6D229E2ED6004BED7E320B30FD31A0B6AC5AE9D859EBC807C860363FF9157ABA3A6711AF5370256A02FC353ED73A145E3EE9ECC5F131613524A9C268CC920C9E69 Out = 3128F89DB3844EEDF812031BD5858240EC63F9BD1D390C27BE826F8680F34F36544AF1B634599304807230F508E62F0A762E12A59258579031207060426ABDDF82C2F8FAC7237D89BAA1513496833804 Key = 56E3F830924ADF6EB2ABA44FFBDE36FF50CEE692D224852D84759732F453DD1D8F7CE8CD8BC89EC7D533FC07C5D60C6FDFEA83BC7A98422AA7C94F1176E81DF1 Nonce = 59EC1B933DB7CB8C5DBBF2E255DDD83C In = 16A3761D5D19E38301085F93C8CF7BB7B57C07CEEFDFB35891DFE9D6DEDCCA771853779D24D9E68E834A32C6FAF7AB178B837B177E80ECA50F2108B6BF5B4D64CE4C0AE4C26DA69D9D6C2DC597A20A9321 Out = 2143139EE4F5056A392D0E360F5518092BA12B6C006238A410CE2FE9110ECD7A9EA4944AC70F8A45E291088D40AE615E61EBA19C7CD807F627DB9207D03BD5F2771D8BC55EAD7BBCDF23E638111AF3D0FD Key = 8E627F18B297CA10E2FD5F782035246D30E1790E306B19AE29DADDA2FD12BC9D95F1F0CC2563827FFDD6C1CFCF01CE264265A601A1C64F71B58081F624E7098B Nonce = E81534D4AC86F3A8548F392E12C396DF In = 24D7EEDEE5F9DC4C9C00D0A4F7CC008CAAB2ECC30A97353B9BE25587C3C555498257F8B1BA6225D64FE8456A86C10A945D5E2043B4F56A8097BDFE0BACBCDF2F2B707894AA5B6236E4F1C1BD81DC20BCA411 Out = 1DE794AD93BCFD57B300AD14B2D0F13CCCEE43C559DFC25BE16169F80AC0ACD0514B012ED474C7EDAFDDA6F4CB0DEC2723E1D9F9D56881814E373FCD681C23F20D0471B351305C7DF8DD913DA452E4E1A7E0 Key = 0A545B755C853852597731D5A1FBABB6D501CD59571D55C92AF8526FA97A6B7E856510E9464047AFCE701CB7A178D5ADBF33BBC4D028A00DDA7B4772408D1CF2 Nonce = DD6D60AD262774C962C0C6F16AFCE04D In = 93EE17749850BA6962C5858815F83035A8D3BCD113A8343E3A9EFA3CF34FEF5DCAD8A5BDC9CCAD6DE4AEDC4636F57BFD590C00B4505B20E05DF65808546B719E3C90EF45ED1894CBC82B2A0CA9BB1C154419D6 Out = CCE37BFC28B2D0870E842DDEA150C30D6DA19F0C4190C8E8E53089E546A5E672B19677751DE4B949B89BA5D6419F143BBC21673D104129F7EFBAEA2D0A512A9BBE2C0531CDBE716575CC7C88EA34AC5A450A3A Key = A6367980AFFA4B81776F23017DCEA51DC5C3AA7897BEA721FB3E77D2F165BF32DF8B33DD12C126EB10CCD13A8A90066F694EBD2096E3756F6D2AACE7510C7370 Nonce = 8FCD228AAAF79070C234543CEF7CEBD7 In = E7E5CA48AED703C746578F607251D1B738534DEA0B0172D2172849671DEB88EFBB9EA648B52981C4EF0056C487644F39DEBC4D1B5F5AF38D0E9A7EA1913C299955A07753B7E4CADCA08760C282A05EB98ECB91ED Out = 6125AD56EFF933C47AE48CD0A641F35F64BD178380F81C879495E25C5A82628F79394BBA7E2BF5858A310B2E98A056FEB9484BC423169C15F97EFB727E5FDC3A2B9802C93993EED836842E59709A38DA3634630D Key = C1A7BA8BDF41E1071AE1B496FD67E99C10F95BD45E4DF7524A2AC04EA98711C140AC1837EAD2F3DEAE97465B257B256949CF89A15DD9C681917026735EFC7385 Nonce = 06B34A3BCB427C6BC3E564F54147AD9E In = 6308BD31A5D74B1CA56803174B911E7F82D2D7C7BAA18179B6975070793464303676E94724E6C15A60131F09B6D0564D92931185726B730A7D33441042615062E68997292D61AB1B998DD7F76997FE8A12C60E4A34 Out = A57EB6C6DA1DC33C882240E485CFAE952543C4432DF7304F3705267E1D7FBAA9EBA5DAD60EE8CA4C02D20956750E266560497C2509F4CFFBB13EA0B2A59EF3C68D5E5A86715BE0F133AB49D6B21F094DE29CA56C19 Key = 7C74B506CFDF194BEE89AA3E1CEA248D3CDE19339F25A054A6F0E0978A18018A98E2771C2DF50ECAD7A828AFE1402BD9A04A504750C8BC1C7243C6E59B00F701 Nonce = 8BB76FC3A74757C51373FD05BE707033 In = A562277E9787D912D4DA2E7BA2AC757CE779D3F3A0734E490041EE2B205E45B9401E8A6D665759F3B6B3E25B02B793B5ABA13679605947BBE481FBCBA8B9D62BD1F970CD5AA01AB847BAACED038C7CF3D11B13A0A559 Out = 3C508BEEEC49B30F7CF5DC53373D45DB5878352890950251AEA39C74332A884EC0664997248C3020CD4C8EBB125875A9DDB25459BED2A68931A7C6ACF32310AA8A1CD49241A0C958ED855FCA46D4B993066144E2F4D2 Key = 5FEB3B25D878182C9A805C42E18F06B970E6A8DD77E3A773A86129FF6D6B6DA5570FE972916FB3A08D9DFE64E93A190366062F3F102AB559A6CFB9585BE7AA08 Nonce = 787A951115673D6EC7806383669E3D77 In = 32AB1F3D501464AEF7D6B8CF0778E039F6FFE727334C07E855804E71C816B0191B566EFB2C4E98611EECA7859DF3E0573A01B801888A0A72B74079E00F3ABC0846D5A93A832086031CC8FAE91546793A834AC4815A503B Out = 65530F2B08B7C1F3A09872C967F9990024FB75480C9108EC48BDB93FDDCDE7A7A2F7AE8AABD4854C491FA8DEC692B006E1C9556AD122EAD6849330F52971FFB52093CBC609DEA3D0A61E1B6546794C4646291EB7DD6E05 Key = 893E15150A3507E4FD4817B72DDAD367B758E8CE96306EC9099B0FEDD2F52AAF35B075D866449412A3E5F398DC10E84C446A464C4C51C0C45AE40DEC410B345F Nonce = 5256127987D73F87AA443FA66ECADE7D In = 69AD99511C51DB7489F41C52BEE4554E35FDA8F015E2C15022275BA060133D44C1ACF7BC7067E9DEE1A6F39A5F1CC16E2A8EE62C3C67412A65C5653F81C5233CCD8FF29CAA3202B04071134AE53775D535B6C558D2242758 Out = 9F57CD91402EC58903E500CB5B5C2144B4B4323A8C0E826E9E7B24181B9304AB09FCD957A283E4A6DF1A354163905B191898666A08208A451714E8282141C3E33AF5BC2B4C4F03E66D7FC9E5AE2CA48683AA2AE64DEA758D Key = 719DD3905FFF61879A4B092B6BC882DD65AA3384DF30003CF30FCC677535B35926A621E4A95F3C98B29A4408B3E325EB411C84AD635E71169FD9DEC59FE4F6E0 Nonce = 6D3BC653B3E4F85D9F5C75233916F575 In = D6737D71FB176BCCE7C431B7664A221E7D4F516E6FC4D73B6FE240729089653138F8F35E1D65F3BA762EC3635D3CB0B56F59B10C928CDE06950E6A2653E5F0BEDD5F046A89546A712B5C9CF7D88C55D0135583D424BD80EE6B Out = 636F9D4BA28929E2260B842D4F61A203A892A4B2875540E90AFFF65D2D36D6DFB42E8066385A1AB671097572CB37E53FE8BBD49A0155487427428E098E53675613F560F3883A8CA61F1AA8CAC7C2F76B271FE50471322A5446 Key = 82A603ECAA527A78202DD1CCCD0FAD0D9CEC5CB1C87B7268CA6B37B8A93CD224D0BA72B3A4EB9D88D4212CC84E3480173C9A4D6F25290F9243CD8A7FA3BBFD0B Nonce = 167A48FB0CBC423A21E8FDCAEEE1D2BB In = 1FC45ACA01C817498EC54C0BC908D9B7DF97A1999DAC65DCB7390690D97A74247F402AF1E19FAEE90C584F51DF1B4FAC34B988A279A864D15DC65FF59C74A291F8AA97C8DB4379D11A9250AC3D06022069C29C75CA72ADA114C3 Out = 6BE638D8C6C9AFC951B853FE2C7697A5E912920C70580420FF51D1BE0137ADB9CAD25A63EAA1DFFA1E3790367617453BE4122F5A4CB2FD670585283B6F5156ACD262BB9286AFA3799C7B313445FF8F2B74BD4DB33042D6EB8A21 Key = AC59FC93884CB05F91D73E67A979288FDD3846DF208F8B20ABAE9BBE8D05B31256358D089D64667DD77C4414D61567E58DE4B558B80D720161B68BF50CA43C82 Nonce = 67128707B418CF21DBF934303B0C3FF7 In = 4676B5965D8497D940FF4F24EDE66F50A5562E3A988AD86D3265551B2D6DF8B8D694820513F921E5D5B05DA82D03A4F2C3F1BB2877AD9A321151BA2BD2A406BEF3951F5221DAAE46CF081544A4F4B6BC2049B8A51C6840FA5301E3 Out = 7B5969E22AE7734260B2D2EDFCAAC3DD693731968A5BFC5B46000D3358F3F5145F02E09596A53EA9F83100405BA6C25087CCCDF86522B3103C439A9D9598B4F1CEE3F1836EA84DFFD6D0B90AA53512408B053E3D802C48C1A6B024 Key = EC9203195C8FC9DB886534C95075B1452F3DEAA5574EE0D94DA287A4229BBEEEC550AD2C8D09D8D29DE5D83444175F0050BC89E2D5F8794A495499310670D055 Nonce = E010BF035E23F39637AE444BF0F50C47 In = 820DBA2DBCB0F5F6940045CEBC40394F60C1AB9967052CD09B4F4F14C047D8EB84EB422014F32BB2A51C0411B10163A785A6DBC90FEEA34A0D6452318C973F3D5FE3EABA37E4A3459C057A41BBB93105D88A47FCB6E36356DC5E6DE7 Out = 227535D0AD2FB287FE0581383B75AC2444E32E242994F898D002C369B7FEA3F8C96AD42CFA31EEBEA29BC04AA0A189BB9141F173C066DB821DBEEB708694DA3CCE18266CEA5411E02802062E83645CD6BBE8A380DF478D787FBC72D3 Key = 1EDF654D9192AAC22A2E5C000911D1190BFF5146D8B624874938055753BC59AF3C79ED1A2B63F7590E0D2E2B1BFC4FD9FD7E10F23F903C1F3748C4C8DEC20991 Nonce = CCF19F78C795044953CB405418702899 In = E8664B228D28533B57A493FAF4C3F61126E85E8596BB9B73780D9202902A05DD7BB8C68BB2DCC064E058252A6D0E3F7D482C123D14538EA74517F8CCD618CD5182683811C35348FB1BDCB6B6B538F407C4AFED94EE98CAAE6EE122A629 Out = A8E7F8774614C1B1C6BEE486CB4FFD249AD07F22A93DFEF218BE32253D9895F974EE1D6DF2944AE977E3A7BAA13464C9F4C82CF501DBF96A81041DE5D3F4C8397DDF974F9C7DB0C4016434AC17788480FBB5730C9E5DA783201E797B78 Key = A247A25C6E9EBDC50964866CCE6EED1DB33C8C6736183A0D05448702EB606CF5E910B45ACC9024E1133B14003564C7A7C65538E39007A7BE77789B4CA817E659 Nonce = 0BFBD60B9E526C33A8F7E58A698CE2E1 In = C20901D342B4BA042D9C30D99E25DEC320AF982935D47D82FB01172FA67999DB923861E26794F5715E497457A126417F49503F16ED1D09F885E143C502C7373302106180AAE95D500396CC3FAEF26DB5593AC8363A3F99D5DC345D7A103C Out = 585BD877F4930C0D56DC76B94B2A457DFFF37BE6C53DC3A6FA1106EC834B6CE772DA4F9D865B879A15A7C5F0F06542DABEF5912B745511F44FE085C45AE030281790949C9B851550E62931DEAE3A0778AED187AAD3FBD1D3AFB5EB4D2D9C Key = B2670B162B792BC69DB0E284F565BA6F34F79D4BDA1A983099EABDDC2FAD4E73CAEFE5EE22C9DA8A4075D8528C83472240BCADD0BB083FCD5DE1A585543ED956 Nonce = 7679CD4E42B5D2A831DDA76FCB988ACF In = 131A8A1D098EE03489D6470B6A84B0118BBED2AD70424AFD567FC6A6A64634412B4D2E796A22E88145082C4AB6A123C1F68C53ECFC9A46EAFD0CDE55523EBE9A2A9622D3957C70155F8AC4CA96A1D4DF537D2F1BDDB3A99F5B8672C79951C4 Out = E1E158FDB46D7BB723384FB7752E1F198E3DCD829EF02B18F5399D95B462C60714F46C1208E2DFB6CF312A35B18EE9B1D3763ECD2376F803948FDA78150143EE128D094757D7B3F3D56C6CA50F80F398179577E65687C72B8EB189CEEDC0DE Key = 95E30268A8B51B1628F36878A8D399DBA9AE32C65EC2A586BB8C630A8C508C34EBF6DB6CB084445BE218A80401E23413FED6B427B00775A24C5CE0B719C86E24 Nonce = 4D6CBBADE1A824092490C63A00435572 In = 5E4A0DE980F9F84D120851120D70B56B2A4F2E3256A7FA2266A729F9509600F7621F33A3C56588A8CE22C685BE1EBA80BC66D3395B9746404E33E5A5F8FA4CE619B19126C04DBEC45DABD7BB99F87D407684EDDCA659461FB3835E8D6F0C3F11 Out = BE08C497B0296BAE9483DC975617E42C77EC5E74100A33516796B277B5D2C4069C59A164CEEE2D70097374450284A06983291AD62314EA05B78142B34400D9010454E33270E7C56BC272CCADC123D2681B6432CE9B70E096194DFDF4109D0CA6 Key = CDDE1E3EC8CF36A175E859843A5E90BCC8E7D2F696AB254E4A6695481C09CDEEF579A943C78554382EB27D6AB1A0EF46D585AAEA65267172C3357210E809769B Nonce = B10879FB2570F4E30C9B75BF82F1D011 In = AC3D621FB9D3F578CD668C778AE5684F788122453B96FE9F2BA25E520D6554516C4EC590BCD1CE3AEF6D25FB057840266A921CF77170BE425ED1A3466EF03979218325C201DB739E55A04AAC298E2D52EEDBEB9083B7DBE9B097BAEC77EAB94653 Out = 38D72DC8393E8A030FAF21405EE126AA7B220B0920819B5A31C3223E2225E5E4D4A99FE5091DDEA2CACA86B8E5080F6DAC261C4DADFBE93A791BC6F42736F8E7DCBBB7A6C9CDF7EC0143A5BF85A388C63C2E09FE2DE8F5623DAC6ABF84AB0546F9 Key = 1CC977EC5EA8B094303C623484908E6F7F4D5F8FEFF3CCBF17B46F0AE82A13D86D7649BFE202A210612D357C9831EF0A56AC4FD95BBA1D8378B940C302A3AD37 Nonce = E49ADE658CF74069BF4A0CF826D712CE In = 864A03A962A6CAF675E253FF4522060C282AA1CA16F334EB9C018258A4D16EC7A6B8CF4C44C1C7C3DE0F4F33539C96FE128F31BB332F857CDDD479BBB67BE7E090BCA34E60B6EC60109619EF894198EA931DFCD46A132D4DCB456C18BA364BD74060 Out = 6180EB27CADC6C94489EA99EF57CFA04EDE1EDD1C33B667A60803DA6D0357C02CFF0C9EB91155D600B4410DA4C2E962B78CEACA1963B9F44BB6100FC7C03E2DDA28892B1D332D34B07878C9AE6BA2CDA81EB61187CFE2608A2DC2C9C5429B31D8F80 Key = 64C912CE24102BBBF04B064809F5A2650119E9610B32CF62CB77F46812D9CF2A7DFC897CDD4C61D1FDED8AA2CB1E0F4A09FF78BD7E6891E7F6F4A65ED82A5FAD Nonce = 0309584D284ECD6B46833ECBC65C00C0 In = 098488C02872B0D0ED3E900E8C79A6E7E36D1F0A149CC29E2F39E983434345F3F407468245DDDFA144CA817F9144F5CC0F7BD89814458FEEC309662EF186F60FCE42FBC80CA4500E724E5F33B9E07E8B7DD31AB76BD8D57366FAD8E74FD534176FC4CE Out = 9B09E17E3A51B53374F67EC5842813F5FCF3CFECB1E3A4E06F03B46597A5195E298F0F3227822CA8DCD9095BE716561A484723B808B20B958C53592CA11B1F5589D7CE47BA9BDD706E352AE2B4F8B3F397B9B079DE192F05CC7AAEA8CC1805A3E9E5E8 Key = F41046323EBC41F937AF2108BA7CCFF29A60093A4F55A495BD8AA112C11E327939FACFCB848E4DB2989570D3AA76CA34639439D24627C18DD5A96E60EE38409C Nonce = 93745FC5648C8BEB999243A4DEAA8616 In = E06AACA7D51EC448F96556BF1DFA5859CFF3FF283447749A329C8C21F4F0A7B7B5A4CDFEC297B88A19CC4208F4D237B34F590A8EB72C98FF05F25725600D78447800F7831D6CBB0B4BEE113B54AAA96D732C59FEC9AFAB086781FEA7E785506E8F2298A2 Out = 8F3610B44FA700BFFA2A6E9D0FDBF9053D1189C1F4DC8148E6AD3C9093290902C422377D443EBB44FCDB74848F7E274A22A38996ACFAB15C5328FD135AE07F58880FE11039E3FA9C0BB8871192CE2126CCB1A5F2EE589672A7BFC10CEB906185DB877382 Key = FD9AE9F5110CD122692E59E32BCFBCE883ABC69987D247C019B6DD9C107F7112CE462B8DA4D587CE0247D8372971A4D379EDE810E647725CDB5AF2E430CA3F2D Nonce = 2AF05DFDF65DAAC4BAEF3862C00A62C8 In = 436AE1619D3BDC8C534F74681FF2573249FEBA565DB34C271BD2B34AFD3AF3531645C4BCA31ACBDDCCB02A14E586E7EA95ACC297F725C7F6D35DA2D5ACADC569270149FBD31EA52577BBE41AB92DF6AFFD46BBE3FA41444EABF1D41DA060034331A27EFC52 Out = 80EA0E879126401735683D65102E398AACFA9CC89313D4720919E0B2855058FD232C2DD84E8EF00922714111DC381B73C8D24A2BAECB3AD1B0E5E0289A80853D39EF79CCC35282A4B3FF090A6DBD5D41AB90C254B3888A998E5D264031D3BBD5C859C2DEB6 Key = 0D3A86358CFB0E854001E69ACC23A37DF9B0BE0D4F84CB357A6F45D5D94ED3053C0CEF9629A83C3A93AD6BF60F3FEF165F4582A6CAF079E1EEEB3D00E4CD3E67 Nonce = FDCA2980196711165DDFF38BBF9AA69B In = F69B6C84759D9504CA20083191FDFEE4F5E7FC0B5E3771FED2BC519DDE2074A780FD83B2378508687A5F9082FEAB301843F191768FC70DB1D245FDB42B3B62CB5060FE8B8AD010C461DA73DC139E0FE15D0B924E6C396DF759A3AA68B327CB8A5642B56E81B5 Out = F617F599E3035E7C0F0AA5EC17396835EBDCE26CF975618F01AEE9D5951A057823019CA37AB1F98FE68554DDD441EE60019C742B64C5A911C919C264A1372D5495E7C1E3BC1043F8AE6F92EE1A2D5632FF8709AB513712DC16391E9C334C1B5806D27415D9D5 Key = E44A9B4784E90B955B5A9E05F478882F843C53D12F854315284BE36402E111503CDF2616E80CD6FDD182407377761D0FCAFDFFD8D6E5E105D0BEB94657323E73 Nonce = D6945949050855C4894202F6ACCD95F2 In = 41F2CE69907B4FFBAF77918CF2A95402F5BFF25DD1C3C34DFCF8C15AE0EDE2D95217AB3BA2D72CDA950180CE213B5CD6DB09602BF97E2C01014E9B366AD1F084B9827CE35E2E834A35932FD13DB8EB93DA0B75C21DB91FCB15DFA629AF0C45290536566DBABF9B Out = EC0C194AAC8CA99BDEFCD6C62C283B13282EB226CB3897DDEB1C440E15269C782BB559BA646D40A9980D3C8AC96D972AB8B93CCE8FEED92C79B80BB05628BFA83F49ED691E75B933C4D9B0DEBA89B2D2E9F4645BA34F0964D33779271C4040695C6731856B1EC8 Key = C15048C76201023234EDD517AC8DC1515940E81F54AEA2E6DF9420AEA5562AACBE234AF2DEDF5A7A1101C549E4FC2B70D4C801366527B7B0F48A0BD57DF684D4 Nonce = BCBCBFB73EFDCDCBF6E80D87C016A1B2 In = 47C896A11889EF1BA5C4ECFF32A523C86D821315EBD7E37BDA73DC3AF9C449B0642069C7D05B69ACEE58BCB497A5C96F5E2FAA5B9372CC6B9EB10296C20A39F881122D6CBE8F19ECF8B1A780E4D7704B5E5D583A52AC8948DEE8C4FDBAE8BFB6B8E1F12598A6A20D Out = 680D5A4E363607CEE46E42213DF6DE86E26158D859783ACED21287804301F12DB0BAA81D676E191152505BFF53D59CD2090D90C2BD9B2738A3390418473D4CF2A488D581A8D9266D4B41A156CC66DE07E068A11E830488F57B851CDBC1CACECD3A710FBDF6525DA7 Key = 0BB0A123AD0774528795D29898837D54A8B945AA48B1DAA4EA3DD786DB62396C2E6E2D7359E405FF09E917CADC15403F4928221BAC56CD4C94D3E2F25D7B1C52 Nonce = 67D9D8BF8169D9B3B745A9C46A51CCE7 In = C8D2F64D6B9023E92BE952ABDBCC0C79EDBF1D126F5FF82DD2AAD907DDD9FBDE65B074E0B1EA8ECE18A03ED154CC96CAF9DB7933ED4A1650331EA6EECC62612385F2160F4CF857AA2D5B4471AF7C8E5EDEA758274BE1FE9777A33052FFAA57769093EC81D4766B9477 Out = 50E9BAC4C87E3FB5759414ADFFDD25C63933ADCF340F4D6CD5A3B0D6742F5CA0BC2FB7EA920AC08AA97F30CA61AF90F953ADC3414CC6EEBD98133BA3A6D944188E9D05EA0B697CC3404666B84B8B33FE504E29B85DF7FA135ABC9B3851714FD0DCD86288F92A860FBB Key = DF5E8AA90F636AB694DEAFD9B2949DBF7E7F5B854D25AAB5848DB5AC79998DBB99928D9D298FF690488E068C3A8DA51FB7B97282642694AC82C986D1FFA26013 Nonce = 081F7DBBBE9EE22219F63B7E743783BD In = 45D2DC013F863D5B2D57D7166C17E0C1771348078ED3AA5A15F4E814E90AB99168480B8FC97C249A0AC3A842EEE370F45E54C8C08978EA5E7D230B5B02C3B4EB0985C870FC230DFD01C83D354D89C65AD570D21D7BCCAEFE43DDF6BED05AD7C71E1C869FB7713A8FBE84 Out = F21C902C29308BC5DDD124A42710F70215B6E03C6634E07CF4F95278841449C2E73BF59327AAD0243BB755D779BCF6D4BF1C5BEB593E5E3B56BBAA84B88392E900376059778924E48E1BF39FEDF5DCB39CB8D53DE75CE5074759E4EE316799C52C51D18A7BA86B5FF5F8 Key = 78B8E0290AA9957732C79F0699E027D9747132D1D3AADAF5915685CBA3183E3B4B365BCFB8920058C1ED22FB475AC2D36720365D76DECFD0E5F2129B68E8B9DF Nonce = 9604CF4D052CCAD5C9F39CD2FDF4449E In = 6BD7FAE104EE4AE74CE307BF57AE731C5AC99B399108F7F1FF1796DE8BA7FAC58BE8B29EB437B5E37FC64CB1689EC59737BCAE61A321876A8B14A58DFD5F0BFA6C57D48A32FA0D4066408C8214ED7270D75E663D24AE1FD2284AB97645E0F5E7BFD2B15CBA29E7567F95C3 Out = B6518039478C333FE12E5938C3154995E21036FE602FB19B542327542D90A334E4AE5AAF242143B3E386F6CD16A865CD8E3B3D11C4F788268FCF8302D17D3C378D8EFA3E3A10E587478407CF3CB12C9C31B1CB8EAE169EF5EC0681624E755FEC060ECC6D9BDD6FE577D1D5 Key = 60A2431CC82FBE4749CC173936028A44D4DAA914A5345715846FB4E102CB9AABC9F606C56F0C61F22FC5755586BC28B559B65C04D73033379BC0ECCE2971466F Nonce = E2D8127E708B53A1E43FAC64C173D08A In = 9F79D9E56BFE8C9B6A36D57370D1127A301C196AEA339F44075CF732AB496A412396041000811E02ACF8F8A4E3BFCDEB071BFF30F1018FB1BEABBF0C22B4D6B5A4C1ABEF21E0E901696564DD42AD12FA611F7681C98BB59915BE65ACEF7E0DB40A4C768EB6352D2D8DCBCD5A Out = 9109612F993779D809F5BA0D110AB6763547D657657E9AD49BA60CA3E22769CBDA5ABE73A541714D5FAE4576C310887679C981CE88AA7328862614B8D756B4C408D365BFABBC0302C18587BD5D4131B989D77C775281B4C3345049DBA721A61476A814C6A56D6629308AA372 Key = 406238ADDDF5C0B4047320A0AE2159B2726C7172F5449E2712D5BA4D8B12490D5CC05C078E4FD20E16F3560304170D1B416B9574D5D1A149CACA906B4A98DF17 Nonce = D459AFF85AF06AFAFA1C637B3319C064 In = E3FB6DC979AB196164563724EF05C7B68A3196DA78B1405973027ADB273422C2178297D8CFF3C961E12E2F1A74839A02CF734C888FDF56027EDF15F4C5F09EF735B5B4E4C82719917F53FEC5586C346609FA203445C160384DBA40434656CA22B504499CCEC3D02E081053044F Out = 3CFA718F9DF27CB9E4F58758D66608FC9802834718076468C531024B19F9105B6E515E2ECB98FCB2BDF104D911B758AA92DA3AD5CA815BF595F59B5EF07DD07C164246398F70F24CC6116BBBAFD646407144AA216851B9950C509F9CD0CC39C853EADC592223C647F5CC4971B3 Key = 79C7EE3C15D46F95B3E6ABC29D9040EF853DE87B4AEB31EA47BF9F2D571F127E34811F7DC7C016DF34F45884771D1E16E034F2572ABFE5033133249EAD23399B Nonce = 5AF457B616D400B197E1333745939EAE In = 7C1768890833F7C25975F60B508EAF5E0E0C5A21854BF506AB71DDAAB963FEAB16B8712C2DFF74E2262D8119494448CA15B153809C0A7049EE62CA2E940708C06BFCBC08D16AD286A024CB7B448C4C9EA3411293C34BC022DF1155F164A596523BAE1D36408184D329DEDDADDB20 Out = 0F3126953B149457F23703B650AF15EB80B7BA6EF77E051E9D4478FC9E3B41F80564B8671919406C2969D5F56B03BE32C4BEB660E2BCA24A04B160D8B6283CEC3AFEC54D9075671C4D5BCC58CF33BBB980DFC94A2947AE64146422121460A8A0EF1B83D1CA8819751BD5C8F1D0D4 Key = 9DB3F4D3C0FDD3711023C0381604C174DF54D5B258FF10D34C9E27A27571BFA92261C81013D39906A56D437EE32E1541C8FA54204CFC7777D79FFE7A910898E4 Nonce = F34F5743C27986558CE1AEAE8300C654 In = 1DB0E3C80F58750B51ABFCEA443A352298697B1F1B6E658EC0FBE03AB1365375302266C7F25AFC177D59502408C1B48759B0DF21CBDAB3EA20A1B59F7AF9A186432752639EA9B89D3B35A1AF0C10ECD70781583B86B3999F766A8D15C68063C36620E5AC2FFB9378360EBA25906410 Out = 3335C951E4AB1A9A4A432BC7766E57AF65A4E6483EE3AC00650B0B77E96DA2C8A3BC6D8656265053820A71AA789D5F72E28AC6D53F534A3CE3A36C5D812CDDFE7663FE72E58515A1D4390F24F68E549E5F0D83ED1DE16BFA36D819DD8C43D4591DEB849B97AAB7B84F7529EF6D16F8 Key = 323AB39A5048DCCE476CD7035938C334D8F74AC40C091435E96C90694B310E06AC15D048E08A1E847961748DB07C24583A71C9029DBB92684C61CFEED792F95D Nonce = 86DA4590E89B99CE6A369EC0BD6CB8F4 In = 317A8FB8293F59FA0A4BA82B30B6DF3BEED9A69E430E17F6773655ACCFD1033D3ADAE04E159D22E1C8D946D188CBA6EB55C3D6AAA848A7F4DF2CA2C4E5BB4949A66D71AFD72F4729715B64A39E39B376E7D18C20D3CD05D5702D1811C1E9A2AE9A1CD8E59A3A36EBCA17B5815B873A83 Out = 8D591DD637680338D536B31F949FA9190DCBE8E07CA8EEC40AD1C16B54192CA35FAB45F40F473C4A9E12DE29AF827A71C62E6F1525EE55FC8968C3B6C16CD789B7EA938D7FFC214781983AACC68F634A927BC0BC9D95D5AC23261480826A0A5B50ABB2F3482E947ECAE908404CA56589 Key = FBCE17D3C543B60D7C1E3D2212D067DD4FC6B45B5E8E401040549603D295781EEA8489FCF1C1F02EC9685A759A45AA65292627677B92A56FCF516C65AEB9E1CE Nonce = B7F5698EAC7866298C4BA0F2C8BDCE57 In = FF30DFAA708EC407B616571B090FDFFEB04ACB99080F30FA98D6929D05F87D18A323A0DC749FDEA68C1F7927D399F89DAD0634684C6E8411CDA0A5F3B2302563884C61AB605E7B3EC7B1FC0E18A018B9BF78E826E715DECC77B065F413C38823B7EE7F5EBA47CB8A33DE68807380A0F2F0 Out = 5179B345B442BF36758CA8B750F54509844644DE3D7955EF2E2D03BB105B1F822B44F9068E1A846DCFB82A0D598C5B2C38EC9B7442DD80D762215FEB6877203139CF65051D59F20164582152638CEF22FD567FAE7A5ECD7B5105F72C87F2359D7648FC45A4D7176D48E53C24E2031BBB22 Key = 8760C0BEC871D986D5264761A6B28C9CE63C7CABDF795766CDFB6B75200228E108FC0BD09CB17663CC526F82237916E1D3794AD80F722D504F7472AC4F3D0E72 Nonce = A3DD31032D9179F26895FC472F82F7E8 In = 15A9032CB7FBA4C1B48C84FA108110DE0EDC32DC9A1752A86E0B15A38D700F8D93E830D2B99C15DF1DF2BDBB59919C707D6A6AF9FD8B21A26D37A7AC802A6E0D64BC2FC31DDCF72DC0E35CBF938EA1CBDCC12D3BFAD466DAD85B8405DABF03388992132CA3041FF2B384D7DD4CE8BC81621D Out = 0EFF57A8DC3FF960F183DC5569EFBF1693FEF4070EA59931051B4DA72D927F037CD6FC06D92AF8EB4648A408F84FEB00D531DC1C6C954A22868B8AA031E892C84619F4175C123A710E398B3E7B79A11BAF081BA91A640964F5DF985EA6BC313CBD78F693D0F5B1F0C6F9AC9E5379FF2B53E5 Key = 729638847E01B827CF51D79D1EB4A8DD5EC63641D24F38797BF0E9E91A42917EFFD9CC62C3A8A3FE63A8D81A78DFAC280228AE204F670A13BE16A1B6E0334057 Nonce = 14F8241C1A247FA7BC2865447AD9C18B In = 2FA5D0A789720901C0F476243A1C07319DF83F6F06A5CAB05301A16D88716517D8C9D11D806206F3A7E8827D1080DD327756B729D8EDBD42F6AAB210C05ABF63CF8DEB54AC55DB63B2C0A21C9EF992FE86A92832AA5452AC1E4033A54E3BBBAFD0CBC4362765B4527E459DEC09EE91A4FDB520 Out = 9CF0FAC9D487BD7827D39A2C56D2691E9394E0F025DAD286EE701E5E83AA19DE60090B03E01F0C445C3E0BA07D7898360E38C36D604178740C1205A837BCA0CEDD86174B9DB0D451A6FBCF1B13A553F26F266D4957716DFFE2E28B9ADE18B42EB3BD916B53208A43785BA9693561E6B68FEB80 Key = E96807377B3A102610CE11861E807773EE32679CC517B18D50DC19DE2775C8559C2B42E43CB3CE6DBD3D3930DF148546E96483C5278234648841E19C31C7BE2E Nonce = EB0834AC818F6CDF583C883221A2680D In = 09DEF4771CABD879DF77FE475D63B475EA4949BC6B5E0055F6FC48454A81235FDE3A6E089D8CD84453A3BEDA6172D383DE7B1B47C8C20EFE50FB123CE9A55DB3762393FE9CA10E0B81FD7D1FBCC3C5BB02F32A7B337A9A36AE70DEF8FEEA3ED664DC4C5DED0C47EC04C618229E90BEED92E51B30 Out = C459AA9069A7AD5126FDE41DBF86426FC5B06162ACE4D5BBCC0F88D183E557214D1C49CEAB56165F7CF6ADB0101C046304D0FCD41E70372383FC4B644D1F1E8D0FE11C3792B22A70A2A12B6268A8F8D6FC611A4D84E9398E721AA15B5E3983558ADC0F8DAB489424F7D93FE3F9CA2FD2CBAFEB71 Key = BEAA26F0B3AC4C0F4DFEEA5C3DF56A781AD2D37368C922BD5BB46D6FE532D82483B721CEBE2602EEE6C0BFA6E8E91E5D6D48AE9A7A751B007D6DE9D927E9A4E1 Nonce = 89F5F4272A6D04DB82F05F5BCA5E0448 In = 1CFF92B0C9F1ECCEC02F951447594DBC2D0649C4D927DF1ED39E125C034426793FB06B68B3C9EBFD266B0675A69A349179C636E70367A9D019E5A4FF64490F002485299C9426A07A18AD8AF1A25C7A60F9D0DBE6EA5962749299EF8876A0ADE1EE700FBDA4268A8F0839134F8F5D9EE4FB93CFBCE6 Out = 5131D396288281111C97991E2C9C1BC4DE3A4705AABC0623122B7AE250030C9DA7C7F5441F2CD7CB5525BB21CA8439F1B919525A70B3CF659ED2760E8617CF477B71D40D8889C427752F3BB0214B1E916072D6AAC5769C08B32173D619D96210752A624FE0F4A6C072A0E492CB4F3C4059F58ED534 Key = 3BB9B9AAAE7B0F7A9C1FE00ADA5595BEFE4E7EE612FA97D4BE21859A64DF9BDB75311701828FF1A6EDEFBF876CDCEE87297AB3F27A58BA3FC4807FAF1F7A0AEF Nonce = FEF2159226251D571991E2ED70B4966A In = C710F38527A635C3D0415F9A7106E43EE16BAA883B75009CA682B4A75185EA2A65A9C64E43297CF406407AAF64D5FFDCBF115E9DCB8A941CD0D06F2A2ADF2013043704F208595E9E5A1AC0C7A03404C9541B1B2C5EF7E6808E51DB8B8F4AE156E268DCC47BAEF9F1BE83B32A62104ED0239FF29C98FF Out = 7A160D8D41CC3E14BC0F3961D18D0E6B3665ECF28378596259BF8C9A92C0A150C2016C1FB28A87ED460778B9110117B1BF6DEDE35219307602463E9D7968E2F6590F521006BBD6634FB0717176DCDBF3E7A77BD81671E8FEC705208A3F28446441F13C8D438C5194CBA3E1931B81BE2F1DD3A9DAA097 Key = A1B17A739ECA52E0F1373D92CD876186C3C9A0A65DC7574E195845E342591F0AEBE73E987A7EADED8B3FF5E8C5226BB3C4BA0677770AE4CA5B56511E4819A62A Nonce = 0FC28C8195B2923FE28432CF934C32EE In = 84A5E384DD70B8012D51F4A2CC8E5BCBFAB6A8C18E0FC4FFAA07298EFB07656DE4224B3416ED9FA9E6D443B8693573D8FBA648DEC0D789171384010A0558877A8CA3C576F940FFC2B911642ACB8AC866EE4228969FAE97ACF99FDBD9A762E7E2C25BF4F5892563A1B584DB71DE49A5974EE5DC52FD88D6 Out = 6256C709BDC87DB68F9353854CF2C95BB7152CC911A78BE75C172D2E87666F70357E16D8B2AD0E0D428CE3F16DFC42AD958DFE8AFE21A4B7A282F9385523BC3BAEEACA2D64C6249377744473AB16A098E161CB1E4E3930AEBC5EBE31C2A306FE527D3A0DEC4AD307D7947C24B4D7CBB423673D04D1D6C7 Key = 5A18D56D9168739F8A1B5727EC39775C99BE86E5A654680AE5A857CBFAE5E3C08B5095C01DBEF36FD628726829E08B301E3E2D0C942A9A6DCDC03C499D311432 Nonce = 33CB2931CCFD7DF8DFA2814C9D0726C7 In = 720016F52B0036448C8026444D1425D81F7FEE2D97456E852AFC1E768362C18DB228FA9D40E6D15D358A77C7AD519D07E706F51DBFE46A6BE5F57E55FF7AB295833B4A0F44F2DFD2495CEEB9B43DBB75CD15EA4F094B9434F8F5810C2FE42C747E2E04CC4474A8AF6B2EAF9BB23A2C7181B4298AFC2FC0F9 Out = F2C052DB50B1B8745E1718F227EE875A1A5966C5A0CAA14F601C7388F2B6DB9475254ACB3887AC2AC8ADF00A7A2076119E6CB8E118E4D237E183A658F08175B33E8BB63F85996750E1BE6619EDCA78BF14A5D12FBB278F46240ED743D4C1B0E2DD6CC83C31436D208440D670AD073596229455EF95BB7012 Key = 94689BBC5F14EA5C80672BB6AFB1661A5881AB0C9BC32306A292D289565CC22C1B9BAC2B701113B003353803919ED19776B6407AF96147147EDF4307FF5E849B Nonce = DE8A8E19A7E125F7B7EE60179D40703B In = 2E10C2BC220F1B4DBB95B9475F9353BDD8A8335540CC087CFE0C46860DCF6004082A0C739D97A6F7781270A9194FC3F175B9B2857D06E3CB344D0C87E019BB2AD70A366E868C251C165CE92F81BA7278E8584D4A4B34F9FF1EAA81D9827606C16F69CDA3867EE312EFBBEF386563A9C4C9CA11433D5EBE33DA Out = 5F73434D90D624484D09E2996BB7904A542917EBEEC334B69964C1F6E9ED6B7B19455442D24180F6BCD54C023C479A8877CD8CA8937933D4EFD08A4A4B5B1189426E2D00DE0DE249DB84191B70AF7043E1CC80E029BFB1FFCC53C1EF95CDCF0F9A1F52A7C03E7283BA90FFD8D2E218E84C6B25ADE197CA48A8 Key = CAB4BF39AD1DD889CE0844FDDA2FF214E0E8B0B8F673680C664ED888593612FBBE6B51A864B73273BC3EE2FBA5157286E2F9C517162D9F339D7E5316E364E00A Nonce = 1320B913AF0150B0CACF7BB5C65C512E In = EECD851851F5574F0C611C0E4AE716297E60D708785D2AA1272FA92949780D984317DFA38DB5C3F828F87BB93C02BE70C954738B6A2E76E1D7B37A7BBF1D0C20728697946BF89BB0FFDA9AF5002EFEC8097E6138EDD278F94416D53D50E4EF33856D732F0AF03F0B138174A5709E16BE736CB1ECA94A1137D7B9 Out = 7A20D1FE8DEEBBE1E2B964AC46641D41BD19D15D29BB170900EDD35B0FA22BA5309F7CB560F9AAF9DC98C230F68CD611A988E4B1F1E2F1B96AB6680C357011A438AADA89098E66F933C0E856CDB84EB4C06A07579575665C8C9C2C1C727B50D4B894898A2657C8BBFBA1FDFD2D26D2D4A82EBE7340E5B110581B Key = 1DDF54C1F674BC63FC6CD4FD1212D4C510EA5643535B4866A63B9C3E4A3EEF6110F2D94D27BC4A2BFBC960FEF6AB70FD131EB7DA2188473C38D9A6EB2BC96144 Nonce = 0572477DD9BE3815B9E8F971A5C490CC In = D22FD6F61C04CAE2598AEEF105AD5A14C21CC91DA1040AC37094BEC60E3EB206FEFD87E633044B119504B7BBA8AD24914D8176F412B6BC57F23021E24801977D422DDFBE4DBA1786769059AFE712D9EDD99EEDB9B0237E78322058B27AD87758914F880E42D8BA8A20AD984194741D8B380A4F2962ABA705EC6AF2 Out = 2B1EF2D69B20A1063134D50CC73CBEA83F088A673D3B226746DAABF3F3E91BA9AEF39BEACE531D1EC8F1688BACBBEC8C4D834BCC6D74EC15414F0C132D5F2BD05956A5319BEEDC3914F2459F50B07E6800278F7C335B3A19969FC47BF6ED21563D3A661F94EF4BED66EE582B196FE89E53B61076EF22C3E1EDE28C Key = BD67D7C131B84E855A78DAB2065D4E9D929C2B6D6F95CA24C024B1345EC9FEF0BBDC0421EB20BE6CB572B49F30E2AEF9DD3DED71D45D7272F02909782DD0D5FE Nonce = 2226118F51D8D3C6D4188CB5498C0A93 In = 86D500F74EA0A80FB65568F13FECA00EDA0F7C8052E4034C16E3D00798390FEA9C04C5D9FED291FA1CABF37403B56EC770FA22F8742C79A63FA5C4F95E60970F853050AC8567F3DFEDE8F7F9972FA258E74F0E72D626EDE641FC1EDBE7F8F09E9D5E860732515EE69DE6F143777EE4F8A720A8531BBBBDF63DE98F6D Out = 54A50333EFF671BF4EA8EEEA0AF5E2F2E31266D04EB8DC93E6C82C287BEE00B565CD4A225142023A330314C90F952F8383C063138F9B503495435B74F574048B9CF70F5AFB0F59EED85E6240A6989E5BAF9E35799699ACE70B29DC17BFC00E49C29DD2D279EACAC0EB0B2F5A28C72010CDA6CD0202C7A8C816FC4900 Key = 55AF3DD97B4176087A4093D9303ECF1763B4CF996543DE956C6BB41E6CC49BB3BF434ABDE0175194E0EA8500FD601E2F6613C69546C1CCFBE0FB0531E81A7665 Nonce = 6B223E75C4E21A9921E4CE04250C2EC1 In = B4C0A353E4271B7EA7C6AE5160D703AB5C7AD5B0B51EBB293BD8A91E4F18768A8380F6F361CC20ED27347CF549EF588284DDC96F0CD049142D0EF5C4E4E19F7D9A8593DCE28D63990C6DBC664E3B805241B6BA5E9ED21B5CEAC1D5F7CD083A1856AF03825E4420EEF8CF2DB0E3DE0BCE24CAE2656035312922D37AF0D1 Out = 10E505734CFBCE50EB1C237A8D245E5206F69F514F4D6EB004BB09AE26534037FEF36FE56168870A3182C98068A60DDC7D6BE7E2B51134868983CE1573CC582BB354B68335818B336A5ABDA451ED7098B0C37030DE1839B6E0B0A8BAAD2B34E9E87F472C6280C96D2EB1026B87DC34D46FCB08C2FC8F00B723F98C7AEB Key = 80775DF24AA36DBC46F1220F0275217855B661A0C2574DA0EC1084AFF70C6F600508962700B50E79384C9C57C802CC8E69F0EE8F79B85982F99869255DDC81F2 Nonce = 300DE070DC5DF16220D455AB95733CB4 In = 27E952A8346D71E68AB76C66B8F0914ACE2E47FA6BE0D33D9FDCEDBB3AB21D6FD68B9C3A6819226EF8714143AD9372FD1CED15DDD4B00E469921BBC1CAA84CD472B392BCFE6A72145F4767259A31A1C26012A0F185BA27567FE9534939BCADB8518B5D46AD99BEBCEF0A8D6D3C05C38C72CC19F69910EBD35F3014891B34 Out = D15B7A804E64A8E1A9A095CAF6F599B8E41EF38C1A8290A2E00CBBF77157F44577BE30B5AEE3EB26AABFB3A4D5DC3918742CB1DF19730FEAE589FC0D1755A2B0636AEBE89EA454A7C7F91B631A84B49285F8AF0230BB186E1D812BE507EDF298D26C8AA0C91C9857C9B8B44DFBDBEFC0E0D46624C8752DF2E3916A197E41 Key = 0BEB99D723ED26167BACFE5518C9D6276EEDD0A1F3438222B85A2916A499055163424C33980656B538847A9EC96B878D81DEC0733390C05447910869EE352C62 Nonce = 15B89AB5313B4107E1BEA5AD2C09D23C In = C6CF174AADF9C16C7246928C7EDF00716297490F6A8F774E113B2EB9E0E1231D2AC1A8C2000670DE9A27774AFEE98263E8CB31AD36270250ACA8E469E7A4E29A2B33E22584B86AD3142B363B7D3AF1A40037FB14FC732ADAABB714D5CB27B4A9EFA76DCA9ECBE4E06D644C03D075DA780E1EAF490C7EA36119E7134A118CB5 Out = BFE9123F44F649C212AFE38E0FA2884642EF2485B201ED153566645AE533086584CEAFC25241ECF6314DC0CB5F01D90A1DB9B2925B2FAF760D7D97E706C9714C1347E8846DA2AB1BC4C4DCE9FF82DE3F11B908B1BBA8DE85B465663666D7C6CF1583C8C39EA1CEE09B2680AB34DB00E093DBBF0066BAC8FBAA681F154AC722 Key = F9B94B4310C487F2EEB936F17717F625557932378E20B920A652A6CE905EEB4858602726778968215E027BF0EBD36903379880379F000A555B621F1B0275AF5C Nonce = C49CBF53E23776269C32C673C8392452 In = D6BC799005A3D13522949BD71C098C87EC666D6B9D66585D5C6BFAECBE780252CA47EBAFCCC2B19DA4E57FAEC294164C02347547DD1A45C9F1810BAFF44215BF0774F1A1719C2113DDC2D41271C2FAA33AF962310989B2AB2596C8B8A367B862FE6A43C67039F801467D20D1C69747574772C047DE78D2B23491856DCBF05CA9 Out = 075BCA387DB963F8CC2113A4CCE7D5E4F1452BED6E1093E8C361C0C23D5B8587BAE4DE1D6492782EE04F54BCD8A801AE87BBD5E0BA24CC28A9F2D8EC34D2BB5F923F6A6E49508D4A6B582225949E298F3195283657AE5A6D2CFCCCCB660ABD54C41AA07C11F36FF2CCBAFF6003324B57B1535547967EFE8BA1497B03DDACDDE8 Key = AD2157D6E48794036F6B5AB706B220A96E11EA90BBA3C4D7ACF22B3BD2724D1F733281F116AF23F476C73934B40A3B88F04D84BD881B663B4A9771418C6C0E4A Nonce = 1736850EBD663E8B15AC58BECBB27E03 In = 182C51D23A0D8AA74CA0D8F16464F428CD13DB264D854E2B8ED0EBDFEBBC78133CA32DE826645B3176EBA1B64019FD6F925316223BFB840AF2F9A63C829D64391E4EC11A8B78A1031B98ACB8E71CAFF35A394A728585C7A7459E6926BA237EA3E64D295B4ECCE9FB99A9422212BB25B16E7E97FC18C015DBFDC3D26FAD5BA363D6 Out = 779A228D0653CA8405C2899C8371320353148114E2A0AE63BF262898AE21543D15AE056A261992EDE7B3DA66DC2C8173D8FF06E1E2CC1CB2595C9FEF7574B97FF8AE285D14C3C12CAE52034FBB8BEF5EE8089B280CDF420C5FC495C381142E1FCBBDC9A81B082BCC17BC1C1102F2CA4FC20332447D636A11861BA550008F937EE0 Key = 2909E3C1DF3EBC1B4E2FE43346F62C3DBC401B4E95162244F9DBBF240C57A68F8F6ACFACBD5F820A6FB7F88513E0F1FFF834D7EDF8B0A26CD360DBF805AC534B Nonce = 8E98DEA30C4597212A3377147F191C5C In = 40D8A3A75170592E5F529D29DA9006236D25CAF47291E0E6443D08CC819B9A5C9151AD94413AE1CBF17B0A2C8EFEA76D5419054359A918BE23ED147DBA75E5A1727AF567547E158296DD1817C4CB43CC02D87B6B62DA6A5A6192CD785D9A6A610C0D6869BF3506D63239A847371503D47F8DDC0C67B5482AE5D216B5FA30B352D84D Out = 2B58636BBEBA1F3A83417E58A47D23B673B6CB12D0175905145BD7D2C725C5DEDE5ADBC824755A19E2C177379CBC4DD4BF36F82057B5D5E6B3498B25C53E9DD7BA154D74C7DE64A5D32B2DC774A9A003CD39193E7CD9E102316ECAC0FC5E45E7D6751EC02EC409D1C062D8E32F6BE88DF4F1000BEAED42156D4458BBC03E4827D96C Key = 39F6E1C959EDDE1EC583CA985D981BADE2D796022ED1028FED4B7C6DC5CF5B73F8B70B763702D55FDBF688389103155F18FF8F85EF0E86AE63F0C3CB4EAA464C Nonce = 077CF8F2FF97C558EE3C318A9781278C In = CDDD69036E9320BF1FF4E752E745E763FB470042A4F93AAE641B57D0CE100068D2466302BC9D570DCD0FC88749EAF5AA0F35035FA0F5D04C69ED92B5447DD8DE1C7B28D17D7BC9D1EFCCF05B02ECFF320FDF4836BDABF5DC572D34E65E4F0620D26F540FC1123FA05F9EF432A87ACE2B2BE0A6A5EF6BB01401E8DDA43CB12B1103D896 Out = BEFB4A3CEF539E0F5F15A2AC5594532E989F23AD63FB57DCBADC5697844064FA94468A536AE43F487A2748F4A9281ED8C9CA72044CE809F799FD2EE3800D985B111731A3F2E0DC15F3233187D1180FF502B131CA68ADA0347429325BF544F831ED55D71D97A04B2ED3FDDF0214E570438EDA57558D7E22FFAAC630765A06D8D71F7760 Key = B16B1D3CCCD67AB6F037052074874D04ACA71A70577DD9472DF03E78E6BE80399CBE59253E641A1AB0FAD3A61368358C27814AC32EC5939C921740ED451CC0ED Nonce = 079D85811EA541E3F7369E6642C88AFE In = 02AD0C442AC4B1CE3B4783981E9572A083B63C5A9625EDF48EB6D4C2048050ECB02B3698F412888F4293CFB0B0F55BAA04D419C6CF8A5F35FE976FEE9D6A908034A77905F6B53335378FB518650B6B36612B323A197F7377D83FEC7A4A95D0C67BDB434822C1663D5998B16D85F4C9E075677720B01861D8009221E2CFDA7B246DE410F3 Out = A669D100570041BB5BA11723FED861B69451DAB7500C988E0E504624067DE27D51872A19FC51E9EC3A022A735E5C7996FBD29F9B39B3364747CBD650FC812D7B4AA581BA0E9D15E9B21238C1EDFBCECEE5FD7928BDF3864D78174DAD89CE113D562F0EA33D0CDE8980B199E256A475900538AB46FB15B93D209EF1784E3030D9B4DAB2C4 Key = 95A709AAA5982FD83517E032283ECF090BA772A2185D5C5A189689510E4D70F3A4404E5A306259D68B4B6681B87E11F66F957DB31338EA8F61F4ED011DD80D28 Nonce = 226A19FCD9AD661782BDFDAF94FB5CC5 In = 8B03C8D1EB03D2EEC494B65E3529ECDB72325F444BC41721EC67B01AF957E3A97EFE3C39428281B87703E8C30CA13C7B1BFC1E0D72EA585BAA5FA68FA232C8AFE3960A19C0898751AB390CFDF50F1C326204728C007EB185034B5272176C2DE0978FE10C42F4F876BD089C9DC9C25E7BDA88316F817C0DE46AB2F5FDDA0AF1BD2B8595D14E Out = F498A04B9EF5E1C39F23AFD77F46856789EC50140464EC61D17538B52B4128877C7B4BBFAC4A266B9EA396217A101C0A5781231385BAFF5C2B1E5C7500F0D825732E94076A3EDB87DFCF6EE7E80AD89B6EFA1D2C142275AD7221E854E0B2BFE1D661D357771DAE907EAB1BBB12F8CB3D9EC89E272F1774AFC75C6C6DE644B96A8D5595A73C Key = A5FD0026C475221DB0B8175CB815B8EDC392B6A5A03BEF4F8A393EAB80905615899DF15F554BED14576AFFE5A0850AE74AD5397687D6F0A36C68B6ED99208CC9 Nonce = D1938E9D13383D62411606CE3F7816A8 In = 904B084BFE1FCB161DD58ABCE8F857CEE874367121254A67EFAA72AC623F36E4CCAD0977C2EE32B7BD41A1DAB344F704C353D6B7C3351B346A36A58715B79AEDB0554AC0B7FF5307B8E34393FD8034B9A3E386378F7F063323F052A8390008077D38715CD26961165D02DFFEF6D7B23172FCE4E23CC4F39A2027409627947AEE5016AF5C16AA Out = DCFD7373BD77266A8C41040933BA345780946A5537DA0639D5B677E40AFBF456EFD2785AD674B72AF8768A543F7BCB3960B010664617292D1A511FBF755DBD1DC478486597901C075562503C5B328A29EB23D660B322A05DC5F76F8883F0700D4C076DE1AD6836B7C03D8779102C5CB27BCB0416B25E94D689D1E04C7F66DB90CC20711493E8 Key = 92CAAD32FEA3E17CA96F329B229B9412367B80AB903486FD61B593B52C5AD603D257406165824BCB1DE7E45CCA2D3444EB4E6474AFFF6A1BC0D4885C2FA80E8C Nonce = C0568E6A3DD0FE7E63FCB742A68257A2 In = 84E9BF42B31E381616233DE5165D54D813494600BC222162652DA83E0559A779230F796B47B64AE6501063A95F0D3579FA170C8D59821EE746E3134E1262EBA923BAA0CFB806FA8AE933637ED9255853484DD007C4F2685020CF3C8AEEC2F4619ED535F889F41F5B7104A6BFDB027EB58FB55CAA6828FE01D4F24D20A4B36D96F96C50D5C4D5CA Out = F1E7F0B33CEB81B200BFC509B849209D21127B10BD1390D87D45C28B949DE7E366027E4C14FF2E751B83078721A715D778FC298C817BB1EC3A96318F777867F8304040A847990954C4397042C339557E9E9A484997A509A14F8E997459B3C7F27C8DCB8E017A69170704F564BC439CC08B18335280A2977DE8AAECEFFDE1DC5919C86E11FFE565 Key = 23AD41F1D24AF8A060F8D921772B5F4F5A9E3283F90454D1368B9CF9973A9D34CBA431072FBA74BB034601B5459EDFF1501E1BD1683ADCCCAD84C0F893991371 Nonce = E369152C812F3E4BEC0EB846D1C97CEC In = 3D9B6016E7DF175BC319CA6D06772E7D7A1BB39FBA8E6ADACE88D624E8C103A12A6DE705CCBADF7F92D86355764B72F1EC67215719A4B81166B83F183D8BEC1C982D6468ED8A106070847B16763F210796459FC0BDF413E4619F41ABE20BB019C2337C14F5DCCF56DA8D9A46FCADEFD5727A636F6C632810420AF0224ACF482FD84CE859A9C4FA0B Out = 05B529C9354BF3855210936EF156484D35681FA23BE1D71A383C01D83300A263DD1B269A92434985C1B8A65DB6FC79FD4772204818BA69408D7426E51B7F74D59FA5F425FEF5A2162C1C6D7D522CED9927C8D7163DA1F8155C1256F62BCE367EC2584B9F367EF0ABE392FB8A70CB4251639E64E919B9A6578C211C1E2F58839A0E1F46B64F35B77F Key = 1F3605C8060DB8AD0A2BD01F086F5D487774D5B27D14D3DC2FDDA54A008A19D2F52F5F57F7BF58D0212677EAC5D08471054F5C6DA320DD8660145F6C385E9007 Nonce = 6248FFC00CE886E8F822D5D2770C3FBB In = E8ACB643B23EB6C7EE66DCF988DCB94CAE68CA5DABB5EE5C03D0D747EB59EFE2A3543C3DD25663274A135574F4EB374AA78E65361CB6E80CEB0DBC247B2073C6BD5E9BE3670900F637F14B0E38B1162BDECE9C44059CC057274B2A8E39E42D71C8249186015C142B4D3C1DE2334DF2EC2385AEF8B88F19D98D4A0FC34899DB3B144F420ED6E831AD73 Out = E0F85816367A2719C991A40B0DC318250B73DBC585CCC7CFB9332CA84F453AF79DB65A4D026BF686061F304BE2350AD8EA0F1567D5695C35934293861C593E2B78271C6EBA51FA849F6A8C2F3023751A2DD87E76B7FFFE5E9C01E1477CA17B95FA04CD5477EF726020979AF84C6A75DEE16B2364140AEF0A76405B3B550CF7CC576D22D0F81575514F Key = ED622D1037B91823A2312B1C9E815D30F3655FF083328C87C03987F34C91F572C7FCD7F980FF22D5B6C6DD28F0AD1AC78CD65C4F18F01CDA6FF29A50244ED205 Nonce = 15D2A6884E9C6F89EAF99C11DE5AEE9B In = FFB0184DEF25C574183824DDA2A8CEA0134B7B5053FD57EE11D8BFA11E88628ED765067187302B236B2D291CD2289E48B4FD6F16231C8A7DA0DD2E5E81FA96614B1327B991464DFF07C2FDDD97AA991CBE54EE17FBDD848F54F3FACE67EC72DD880F5083B36CDBA177C157B46B681B4562CC6DEBB5EC5B35696F73CD1408EFE1C02D677A797BA647C9D5 Out = E27D79EE294E42D8D7DEB91C43ED5C09D09BF7EB809CC0EECFEF8CB7396009F5F6776A4E1379DDC094274AAFDE774774CC39499A0CA3F9FA597F205D3C361393C564B7B24AD222BA91B8B907BB799859F3CFC0AEB7359346636AFA8081C502E9911750CA924E7013691750D9FA6AEF4E273C03CE6EF3881630416A19537938D0E0A2A0BBF5BBB1FFB8E3 Key = FBF092E79DF6B472B940518F18C817C492AA5416B7498050F7E6590C337EB7EDA3BD14A69260DE6E07033C8298B49DBC02C3867CF62D7BB9D470DB5EFBD4C2C5 Nonce = F1D54E3C09F2C0B350DDD3A99D953F99 In = 24780C445108DE3264EAD2EBB2FF3CD875A69BF7D09C4DDE186E92DB5C6070392646E997029BA4634EB9931B324423FB99B5EB177C7D012687D55791F8911F7938EBAD323A039D9380C6D80FACDC28929D3DF83D48E068E633F74E084EA7F4126477A7D9E17B1DB7D4877F3EC87E649BC471171D077DFC329B4FC25F349000B0B76543907FAA19DD5776E8 Out = AD6985267114929F81143F1A9A97D893651C42C93A074E487E6B9476C9A1B950D547243A152BD8CCF67154A4F5B080064B8FBD4D12AFE4B2649FEF167872BEA32E2AC2DEACA86122581245D7AEA354A03ADCC177546191E9AAE76A98698E5DC4318D62F38362C7756A957E52F090D1E5526DA1FE771CE7D40C1AC9F7B0CE544396CBFD946DBCC3EEAABD5B Key = 89AE5DBEE5261FBF22B3A7C50479B063441FAB45B652634D52D2C265926A7870240D492A72A95E5972EFC22F019D0A9197975890C72C8170B09613C79F3AD31A Nonce = 4B4F456327C8A819E8F2A0B7EFD68E26 In = 631F8402A8A2F2A3037DCCC23A19B986A9A0FE342827942BFFDCD16887307D1A236C76F62CF40B46B7C140123DEF9413BD0CB1439A7ED758FCAB8CCBB333D1B852EF9EC7C980F6D77DB9DFA91652E6BF6F22C2322157DF6B5A4ECE266998244A7F69C9DE9CE4581A9FEA6033C8F73BC212966A7F0943A49BE2427B95C19CDFF1FB6BA398AF708D0AE89AD8EA Out = 5CDFFFCD4B81042BE4FD2A861D74C8F2D1BC65D73733EF73DB9F0297DBF8D6E34383584094D283A4AADA1A28E4078B43E540DDEBA3299CDF2C6A51EFC01D9DB6C4130644250AA7E4288E01AC4CC2784B83F8FFFF38434805A88B40140A310EB78AEFDE3FA66C62A2B026F69AA049202C9190EE247753D94BFF64F9D1280755AC0406A37884B27DE673CB4637 Key = B184011092C983E517FEAD6F05456D2032752A09E344EC1C86A897053A2B1C996337F5CCD1A15651BACF199C2EE3DC2CA2BAD5F957B59EB56728D1FA30A4B433 Nonce = 6289A58D101ED6C868BD1688C05E3EE9 In = B6986DF10C1EF8C71B4C568EFECD0706A1605FA9F2A456808160C28A61F32846B4CCCC01A50F725D05C076F933A848BDCBBAA82426DE3AA81708087878894E787537BD1901047E3196E22513B9914D6A95DDAF00E5DA6C21DBF5629809F27C1740E423B9DF6619B5CD71766274AF3FD3023BD912A5EF6454C9D5A8AA05A89111B4E8394F370F16AEFC085492C1 Out = F6DC7A7AACBA454E0B2DF92D648553D645D3E0C880EB9497EE98A355A0F6807B9221F4B3C6317F915E15A979C922C14FB90FD71DE3AE69F7CAFBA2968BCD9F1B14787B0B0DB258F0B8C3E01C9E06E6EC26F0584848151D9EDA97391344290F5AF2051DCAC329CFCBF3E37A312BC4A7BE737308D0DB7AB9C83F243E1B37106A445F21982C586B72974C7A60E790 Key = 43D7124E5CDEE7E1025F8D16C816222CD64E2631AE6540EBD4CA39BE8A4CF9ED6BF822EEF3A49D9D46347420A43D70B2F4F65D8E6BDE53C229810475254F9BFE Nonce = 4D1253F5D8A3436AF1B74B6EAE1EE153 In = EFC485127099D25D967C8E755D4F91B5B2554275BF8144A365FE6CD0F9CF159D5FFC07BD75A5E37F6C7584DB6077754D6D2FC49F2BD26C6D1F665D2B3BB24DA849263384CB5D239EFB4AD4C643EA11DF1F0C65047651FCD967A4474BECF9FFEDB1DD6ACBE55106AA20B5A0469BFB7027469FF0B790A7DFB57FD0EE9D05AE24E82B5F71E6033E8E66E700AD88254E Out = 8B1DD9F350FAEDBAB5BB77285D76EDAF6B38EC9F4D3FAAA9B7D13AE441F8EE37DE9D0938FE5CDCC69C7F459C9FED76004708929DF4176A6B2264CD61EC9F127B0DFA7F553EC0BFAAF9C84290E83424E95B8FB047C982D65F3D5848CE5B5A94CC5C7F25C28AA7B19755A4897B98877CCB34197494706680EEC4A1D5A324825A244C04AAA757C7FBE10C60B26E9C10 Key = 117300A3FB6AE24E901354B0DE987354ADC49A0196F4A6C4F840623BC34841F9C34A5033B18CCBA4F74867DCF9F2E6B5BD1308A1F14EB9FC63F10649BE1140A7 Nonce = 87A40D8CCED2C153978A307646B3430A In = F777D4626BC8E1EC3F1B3D634111626E15344EEB5EC756B133C41D9723E76CC2438E5BD74DF9150608B222F7CFA6F1F88D9D4A01F63D3129A22559C3C8787664A46D0785214BCB184D46735065CF36AC60CCD81B959846E25F89351493F65B4DC924E7D550A891EF67848534530B8C051A1D125C534D0722EBEB092D129A802CEE99782DD1E5B0E967CF103B116EF4 Out = EB95671E50E7CE4E1F1D37619A36D4CA589454D636691AA79BACFA56A3B6783D42847889B58F1114C0BD0300BF31377CE37E444B6EE36DD8C3DEE5DEE5C3F1C05E156D1AC335B6BD0B51139E38E2D920F875DC2C35DE113C84112787D4A6B6A6484183DD03AF97877BF439A6B7020F8A00D370295B88A80B291779BD3B48D5A1685C814B1E95898562A11BEF62396F Key = 5A47E45D3E72A2F0CC66EB574C9F01E081668625D8D1F2415053A3B9778B141ED3109DF96A5310F261C857709A7906BA78B2BE949071F440EFF88A9FD1F943D2 Nonce = 801A180B177D6534970913222C592140 In = 60F27163F6B6BB28A798B17B2359C2304349A54A3B87B50ABFD5D9B77E106D0F483E483ECF6C28302900F2F4ECCB675174610117443F2FF392903F2BEEF8C0A6EE462454909913BD3614E8798D6EB0EAE943A73C214A95DC292F276551E9C4BED6A3BE4B15090D48303BDE9B3AEC70915825F88800D400F216F6C941B557B5E873D03A551917F90B795AF234816CB91A Out = B869DE2DAE9D5B1D767D98ECBD9EAE4581984F1835733B49D1670E5724594F2B67EB675B44493C0C7AA236F08667F2BF5CEAC40FC63BD4C3D51C4E7E26F45E0BD45062631823C821D7B20A1D3706F8D2AFFAB6BAD8F9423E93A1B9AAE04D0462033F95295D124AF4854AEE9D71E5F7EAAA0465BDD9E1278F590B38AADB725D6D0F00B3D9553FE4645EE6D377DCF65CB0 Key = AA773417AFA9B1204CF5E216459C603CDC9201572B2733D0C60BBB56454D2C6613E64E5F235DA766017F9F0CED7819642CBCAB7C4AB70C62F4177929751BF507 Nonce = 976FE9850221B235F43DA870B9B0F6CD In = A78B5AE80E81F65CEA967D460E49681433539F2852262B89E92444293FCB01BFAA4D14371C17C3B16FFC55D60CAB17ED13105EBC584BA065F85377E6E6262405A890D62069DB359326BF71E739305EFFA2C2F42C39F2610105A3696F6C431178679BEF02AC96F8A5D4B0E0C77D247DC5009C7E00036DCB4E8A555665F4D373042C645A87A0FD24CA273A4D1D20C82D4854 Out = 7E6174D9FEE9347287DFA5AAF14A8AF5F3A78FE118CDFDB42CB8F4BC34B2F9438F1513A874C661B8C88D59E667B0309E19A233225475D0BBBA6F710474EDCCFD50BEE8A92651FBFA5D0CE4673D3C8AE6FC3FBE04F2CD60E913F6E9E432E5EAB260AF956C7A0CF607E8B0425DA8473671FF39A9FF191E59072E5C86C76368573F81254D5C0716DCA77855E173F035551F03 Key = 4A202C1983B71E41DB112F14751587A50E9A6FBFC0CE44414862EE1B09417049EA861062B2BA0956A0278A34E86B883B07F42750906BE819C1DD0C3BCD12FE8D Nonce = C9BAFBE986B39D7DDCB8CE8B0D23E004 In = D2F8DB2B0686FDBD4BE64BC561FCBF9B738F78E2F2EFBF61D56BFE06CE9ECA4F23CC442BF6D1D51B55A2921A73C2D5FEF0770FA85D705E0EB2D93CD0ECD66727D6263D1FBA02C812890458385B6C138D6FFC83547646BB3931E2834DB5F28C84DCE7692356C2670A7A05BBC61CB8D0902EEAF0D18AE8CF71C8703AADD202DA95E9C7967A9700A43FDDF049924DA1D1A11379 Out = DA0885CAD1C8C75078AE7633F61B97B45B878CF2915B8B4F77C7BA456F0AC77188BAA8D2DD0E929083F9928D4B123B8C90A40F61399A89B45140422BDCE57869C313CEE655D497228CA7F084EA414820CE15C877D2C2610FDE831FD9953C5C9A9BB3705F01CD4652C6B1CB153FFEFC2318A2AC74604BE1ACD0CBD8139C8E46036BAD1247CF5AE785A957493E04787B095B56 Key = 0D7E37CC074CC744DCFCBF5C0A407F8ED629C66942086E427972E07CA5B532ACF13FE59C953F42AD1497137ED3985955581D6FF1AC52AC12EF3E88BB20628867 Nonce = 6FCE49F4F9E8C5BC8A865A7A5C128760 In = 8D8A5722BBB70130FBA449CD5BEBD86330F035182D93FFDFD11DEE731BEB1700AA69719256D4897240E2F39C54E390FF51D7B8895D2D04BB7F9A67EA8417E1226A67E5A4A75F429161C999B5817C5135251C54855CFA0B10C9B11A1C252FD4AEB368302CF470E0E1BC4E6EEDA8FEC2CCE1A9BE9E0B277503A427F4BDB0C3748D718037CF28591A65EDEA5C7A5F2FE05BF93702 Out = 2DEA2CE092FA848A885FC2022CD8A177715EEF94D252B6B36B27905DB6503DA82233C131519E164AB347339DFBDF8458F2517010A63186B1356C0FD154345E5A22CA4B8952A31591E73CBF2905425CC1C4EA1A41F84D94D87262055CAAB28DAAEBBC2EBBEE638811F187FBD472ED31F3BE5D58436EBF38F276E39FC24EE7C8B72543BF6AA1537CA25CCB0AD5998D6E70482AE6 Key = DF3F3E2FA0418382E7D49CF65468846BF7B207BA149BD894DC47BA65A09F0C9DDFBE81EC4DA0D3A42996884690E87328FE83D2AEC491768B1C682B20A52A6CA1 Nonce = 78A98853B5C4C088892F617835B5BF43 In = 24702D2AA753FB6B6A201E78FBD604850E2EEDB5E611BEF4969FB3687DEDEBC6DE5942B854115CF03AC8C6DC08207A08BA9C066C1A1D76856D0C850AABF6342881ECF252F29504BA62FD3517E858E79E87A9AA14155A75A9F9B7236C93E3D61D1D80A655621C2636142B8CF4769E69E9FB9A6E4D007E919D7ACB2C776079586C671AFCE2F7D823AA5461D4AA3A172A64AB04C6D7 Out = 353A10040F30D579A09BF918B7DAD930D7C4326844A4B91382F311559A70628925820AFCA85D2039A7FE4C9409BE2049EE8D1FA85734626DC93CB6AA49B5FBC8E99AB0EC9930E23324C83AD2696612D297F0612D188C83C7EFD073E434B9C3C40BDC51A751288BD21F07E3A2E08A15F96FC86A395D7FB253ABE474B592ACCEFA4E46FAB70A7BB7807FE486B26641CACBDF7AB67A Key = B42E8B5A90A4BBFE0E04B28C2A27EAC0A014EEBD1CFB3E8F601AD84C26188F433FFD9A4DC1B0A619078F16972B3CDE3F2278C6211E886631783EB64C4C84EB32 Nonce = BFE7AD86B83A5FB4368AE7770C2C8CB0 In = E9A4C906FB3D7C3E102E99EB537BE282CE4C6B3D858CDC05B0C0A8C158C0F0F07CC4DD0F5ECFEF80DE8242AB82E16C2868BE283DB0BB0EC296F5493E4D292765D2A9DB599DD6D811DA126F858DE07F323DF8CC339F6A0A6E3EFEC9A35C006304447D0E0E1E9DE8FA678E8DF45AEDAE039FDE01350F38905181E900FB0C45C063D426090D3D2FB719ECBB79F98216E3ED3D4C269F82 Out = 6EB26655DC6F5F56B45D719A5D5379A5BD56D46BFD8C88D763A701D0C16DB9971D1BB96891158281D020372AA580A2CAF8F809D500ED4C03149B540B12D0026AA9D03CB3688C14A13D25EA35C8801EEB15B6B8CB9986FD940E820DEFA3B5F5535401C97705168D53E3DAC0CFF8D4229F76C74FDE2C590B6629462F7825BFAC97ECDFD9D8F86476432A3339541692A4C498A3773D67 Key = 81F401C4720AE2E11080F7F52322026DBD8507B09B0799DF2C8100B6132D93F754C0F0A59C6E2B81C389E4EBF55179A4B3A4BB970326B42107ED495D909F9801 Nonce = CF7A79F18165AFC5F3723FCFC87EA81E In = 144EEAD91DFAD8259F884BB83198122346BC6877C0C2B5986F44EB9520878806CFCB2B1D4145D92B53BF9F894BF58523A2F7770DFE8646B7144C63EDE7FC090C3B64EA161A2D7AB48D7052AB727FEB1C0050004F44DB8F1F1FF562FFD7AB981583CCD3880E82953CDBAE0475F0612CF7E05533FC86B37985071274AB4B376EF7BAA76743027C324C69BA0300B4ED4EF2F85B3B3D0573 Out = C7DFFDA2591B600EB79876A120427FFD5AB32DA0A9BBF872660D5D7C9A0632CAB6FCF41CA1F1F482711C418725AB4C075E1D38BB22AA17B876EC5AB55385FBAA7CD7C31C6C61EEC28AD03E1E9C5652F3BFF72B8A13D90DEFFDCF3316C7F984CEC307D3C320DDB10F3467941B2DEDC26AEE46EB287FE1AD9A372C8BC129EB89A7860B66D156ED6BF604F911D97F233946F80408E788BC Key = E68779E736B5C1EEFB4E4C563AC2CBF5524C09CFCF99CD6A877557E53B3B9A3555DC626A18FD32AEDC787E168B86CD2F893C6EF8A2AA522247B007CF01EBD3A7 Nonce = 5C070C33AFB126201D6D9C41CB85FF92 In = CAD0E14D6B97CD68F0B7F7E43166698B8DB87C00271B7D361674538595773FF65A9AE74275B9D8F174AA935240E3B6E7F321030111900ED7304B3CD3624DB4446A7B66CC98D4F8E5053F6D4CA35D2583B6FD1732F776C7399C649C0BD2B03B009F283F41B2849BD1D1B735B365A0B728DE40EF0B08A9914C1889674293D0A9E49BC9FD70DB514200CA5BF2D396E6E512D04DAB6402900E Out = 099D2C6AE9FA3935BD67C1F13E1293137B3F262D9C936DEE9E41F6278311B98522E6FBE196286CEDBFEB737E3B221ABBFB64FDDDD54C3D56F06A40AD8C36AC07861A8F3EF7B4CEAB92C03BBF8161E0E951CE381E5AA4D5958B99E86C4CF48FA74D8F380ADE2EF9D58CD62B03854CEBD8099F6AAED5C0D13CF92C6BB89C0BE78AA444291A5AF88E55159EA68252913B3B621EF5D1D3EED2 Key = 80DF01B1339A9576F412F52320C4EFF8243C95F163BCCBCEE828536B81E57F64C3308A30110AB3FDE755551B12F7ECE074F3C7578CDBCD64EA4FB083FF568C20 Nonce = 9AB550BEBD5F65E689799EEF77350BED In = 855813289E39837785AEF095ED8051F8A87659E5B200E78B6F13C96185148CE5F6F941942CF7C9C64D1250E8116E1F93AABBCAB2B147A241FD64883D1862844450EE60412A2A38AF272B2254C31B09C07BFA14BAE2DC46F202028A6793C2F3E76AE50BB7CBC1C9A45CE2026FB1A1E9FF60617536251DFACD5CEBCDEE5C70B207945540485E9DB825AB88915104BC257E349A3CEC028617E9 Out = 07DAD2DF0247E86263755552CA7F12D30AA96AE29FE59B414E31D8921CA630E3A57344E2CB7ECD42CF6E9DC896F13BF308D4B78553C2BFDCB8A654B49B3AF7799C0318BA7CC25AC57EF98D9EA9D4AF4A54CB34EE84A6622D0D9320E72B8C070702C45EDE5F7DE2D8A0E073CE283BDD22FE831240B59BB4DC72EF915F051DD52B48DA8C56FCC0666B14F7CD6337A2185040D136892EA6310E Key = F2BEF6770E2A6BC2F9F5263090FAE3270BEE133223CD5682FDE56254E37F62D2B429D6E951DFFA004CEACE7207333589C3202F7178189BAEB6B87CF54D8E2EF5 Nonce = DC665BB1EFDDD25B933560B3D6488178 In = 4B980EC7F6C1C06403E001B970C57EBE64620AC8AFB1119263CF50AFDE86A75BF24ADCF9B78FB4AA3E813CC14E366006FED0EFB26EB8A27079E32DD86D78B6AFBD11CB50BCCF930CF69ACE2ABCF2D1AF3C9787E818F0942368712A91B5741CC36A848F9F6E59814E50E0C86339234E97ECC0DE1F303BC661260559E69765DE1D17ECE34A936868D334AEF1813D4E7A4F5F29286194A8D8CB39 Out = C566BC1659179928650911541497964A465D84012569ABDFD54D0DA5A815AC0E7E67AD83A9037AAB62424AED6FBBEEF92C9E1CF914242C8880D65EEE18F344F45961312CE18D11E4750853AF3A674AB607C2137FFB223A4D730434ABE6878E83B2F2523AFD3C2C7091C6FFAF1458AB26585905C8067F3279F2270227D378E95C925FE5EA37C55FA364B9764E3B72E0653AEF62F78E245CD01B Key = 19AB0F1AA637F73D03FA490489A46C78E427343574AB38DC731181D190EB77829FC9D677ACDD74340A607249439CDC4D45BC4E6D14AD237D7AD6874116DDDBB8 Nonce = 4F373F68CA1A9DE174745AD4BAB06E50 In = 91631D65B5D1FD953709C0E5F13555437E0AC39B165A05191CA3E7CC2B83316DC189EB21FEA46769E093C108DFD02A19210A3DDA4E744A7D6780F4FE1906BD5DE022942A2BC453F5ED5B379613BDB703427F14B758D6F203EADCF8EEEACB3F18FB665FCA19A8797E6EC034FB53816BB16715E732124C6A93004E2B83D39556473E321A836175DE6883032752BF5044F1036871935AA615278CEE Out = 2113EFED9A437854123F5CF3345ED55C99F29575CF292B415A31566AD81E29F83B4F9C4A3B3CCF8ED111D754583EE3E21007282DFD92E69D825556153BC8C4DB8DB9B194A225AF36C1C16FDCBDC83299E755B77280EC92E9937D509DBE4708C0E610AC378F53D810AB09799D5AC93CF3C8BE3DBF8A01EBF5AD264C04CAFAA4549DF854F9EE416554CEBC188331B6DB08555C39897EC5CF735B97 Key = 36F86422A1A8AD2786FDCF0D9B52E7230C79F65B0A14BDE95552C3EF460E6062043741AF24550F653B65A74219FD5B82BBF65768102B83979B282A3355A70059 Nonce = 7538D26B77BFF31D6E13E31850A4AA14 In = 9C44DA0A64EB1839130DC756DD4E6C39348BADDFCF23978D8E664F69ACEDBB31A89D0B6188D2DBECC770B82471D59023611249F1DA3CC80892D5ED3D4F38E94584E6B8FD24C7F4CAD40582934470BD6F9204AE7ED69BD0BA7403DBB8075039A6EAFEC38961777718FCB7F3032E9DFA3F5CB2827E6D1901318CEDA18A85AC6FF2CDDBD6EDE7084B62370C3E36EAE051878A344FBC771A327DDA56D8 Out = 02854B8C7D561BE4E831014A0F1D8B8D6AC07EB3BCCD836E4E79BDB2288353AEDF9A45BFBBCB430E4122CE73230CB21817D29C9ABA68B41E74D6217FF877116C95ADDEEEB8BC58C25E2A960E4FD0DFD8B9854EE2674BB20E68872D9C190518415FC6C4109E78E455415055698907DEED964A6DF167ABDA3FF1C03C0EC20C4406E8EBCA083F3A26F421771668D93E7FAC5A44DBE2B00334A8FA48B3 Key = B1D259B15223AEBFF9CC784908A27558E0D68B9F92A03B40FB4A2A851A720EFBC96E3C66E8FC665912BA0BFD55E79172FB665C88837C05F487006B5356B9747A Nonce = 8589B4920D6AEB54F5E7A222B0C4B627 In = 28E90084C2FC9B7A78FEBBA2207BB16508DCB86FB7FC49AAA00730C400C2FC9A28BDBF8226B9ACEA3FB218978242E6FCAB72A711264A2B696CDCC3875ECE06C863CEBA9239A49CC05832FBC3EA3359B9D0818C1BCB73D81A5B547AAF4DCB9B210C322D966D6403740807E48A1DA21600BEC16469F2092499C457B2C3864D16471D75A229A514F4D30CB779C5AC31C1F5A3369753DFB42F469CC41BE7 Out = 60A52B9DB1D33E16804F497DEFC3017170DE155FFABBDC5C004A55834021983982DF04C01B1C9AF49D3188112105FFD9C4D82292A0C551B03B07EAFEB9B9ABB15DE5E134D0F1E1625EB4148A434D682225DB55371C97487ACB561D33ABDC1CE46869C876E29A5E824C69CEEB45D04AE3F615BECEC94ECB6F5A1DE3F6A66391D32D50A061B15BB4B1A97C11F994B0475F69DCE51121E00B0F5BB740E6 Key = 63BA840AA75EBA1601E729596106D5A9784B1C96FB62105E72EA5DBE447A13E7D8CB40ED861F2B02103B6263F01960ED3E0E801BCEFF6B592E2020B6B6E5280E Nonce = 9A629576FC30BD795BC5120841F1E0F8 In = 9E0575D75D3FD597613F1D544E0CC4FB11E2AAF3619E4255626C58E6A768AA43A29591712724887B311EF40C7639F38C90D3D591417ED6E8919DF3FF2F0D99351F920F5450EF08832E50BE626BAD7D2F5376B858A19F1AE77852EA807A7CE9F45C763302AE8B174C655C5654275C3296D78A20DED07A0A6B3FE4A2811B161903F4724978435B55AD25CFA3A82DD5C5198D8D6D344C63D66ECB08A8435C Out = 87EA74BA569F363D8223F4B8C0744C39BEF2E2FF4FD9C60886096E5B431E293E40A6B5A5A948410B39F3EA2C561A0A1249AC0FF02F30B5AF58D014761B6D1E5B9A4CB05B885B7F0E918D26D0D26F47C3CB56B078BB31C1060BAC33177089E83C837875420F8F2E5F7ABD9664095422675BA652AAA5B0D02412643EA15C9BD592407325F26ACEDC44B54A92FD0DAA63A498F04E8F22B24F4824CD45FA72 Key = FB664243EA40C2E0DCF6AF9E7A1D38FA91310B373510CEBF9717654C9C45888D467BF18D905521879C1B7C9E050C250D32BE37582873938A98B3D89E09FAAE52 Nonce = 55FF333801629F078CA01FF9E481C288 In = F07862F285C06EE744B43BB659F9CC691B2216D92AA0A09E08E2DE81A68E1462F0582BE06588DFB1CC7DF0D64ECA246DA8D666B025E7946327F83C04E4F7820447C8CE1A50A4270BFA1D4EEB608B4020457CA06B1E53D38992B340580594CAEEE1643BAC970A5DA5F79207500138A707A3D22CC9F2522E14287BC360192CE506C70FE9FCF47E80B9B62D3E36B8473D65A54CE7BFA0D4AAB12E4D0CA6D95B Out = 828AAABDF802A6D3C367AA9639C5C3BBBB8665AE1032BD82E8253E94E9865943E7400BEAF5A81EAD1140B70031E8E1E630D1C318E8119286E372EE23AB0D77DA8215F0AD0ABBF0DF5088BB714507A83FDB10E0C5DDC83EBC27BB8E501BCC207BD3113D31DC5D6580D2E11E5336C2AFE69BA1DDD0ED1D089705E0FC510889DD7692753AEC9C06CFE5B274DD3FDF246B440943E52AAB04D0C4F92BE668FC34 Key = 6F46A21346AFC8D57630EAB85D3AEC58313E30F3436CFB5D75F1729D2CB8962C8F014BE859E3CE31620A06A980D11161F0D40BC0103CB6984099D8FA37B3020F Nonce = 2BE2EB6FBB113FEF2C0169E1367A4D83 In = ED64636F3E575D1ADD024A1CA62725E5BCD189CF03C12F54565D80ED1E2743C4237A3FA1753B6F5913010AC39F7C8BC2EA5DDF5A697CD3E22B22359F0F7F2BCBB696272A3532CA699A104FAD74D27C60F04B79E3946716AC8ABE22E712CAE051615FAD7B14D949E2D0DE393709DC827DE1EEE146DB5ACE5A1DAD14C59F8678E0A6BF913651DE3567FE1F9A5237924D9CEDFA823187A31846D6D721A1D5B087 Out = CA66251A56DF109C2A3F21D524FD20F0ED1F25CE8329E01D1CDB8A64B093F677810CB176051ADC9A4CA8705E8C52F8B55512D847D3AE64E1D5A3544BFD145805043CD9F8C40E629F15A0243C705753D22877BBB903E31345353D389B469D4A1AB4A72322857D674C9C3EEDCE02DBC06286A865C21B8040E4CDFF02C91334EEAE0C5A44626E5DB9D28581DEB82A24A5FD62FB84BE83A8105E89485C85E1C1F9 Key = DC519F4CC315A1A4CD3C2404FF61298C6F408E1D18C71724C8B338F108102E0FBF2058D7BFE78418E4BDDCC8BB38BA7D04E4899E42C5605601BA5DD2BE0F8C6C Nonce = CFB3AE17F5E805643192D1E3B3143E2D In = C58F2837B44C3166B99ED90BF974CDF99276D97D47BA88677749DF554ED8F19DEE1D38030A98946A58B6C565336D4ABF64D01E6EFECB7962CF948A4473C82FADA17AF3448D2FECB51584BBD631C7AAD6C59BA6F94AB4F503E35B3D79ED78BCEAE94C21F2AE92E5D67644C6101A74725E78E50230AA8C303983148EC7F2377C2E32FCAB79E1E59E046AAB7B4E3DD382129F65DD0E02C597ED91A1EF3A4371D316 Out = 2F89168484AEFD6F5BA42DC836006A4B5D63A9CAE45EA22A53855B00220CBD905F6131C8D7CB0BF5DECF9E26D8E305828067A63FDA8671D386E13D58397B61E9426EA451E6956CF35858BE5745FA749D3C16D71C860C2C6B394F54CEEF818C02306551232752BAB5732C63EE579837878ABA4D050BAA23CC414D47E42B6D3268B7C14511016E6D1B077E5AEF75DE92864CECD399DDE104FA1AFEAF08DF4F0BC0 Key = 63D001BB3BA9EF2152A84954436462B993507831BC16061F20FF35C15FDD2D241B7C1F8D7E9B742C0D5248CBFA10B41CD9B53150683090260733C4E0E6F999CC Nonce = B6170D37CA1032D2C67B5CD14E26D641 In = 8015CB61C5F23AC0C425789F0671CB8A000B8C9207EFCC39D01B149F86EE42AADDBBE6EA8DFC0F0BAB556A6C1945E66C03697422FACD5DDDC7AF6F43733E611DAC0EA877035FC63F7B7DB2F5E7FBA3EFA8FFE796EF8D3525BDEF4DA9BA8E65C722E3E191A47A29658FC8F993BE89B1AB16A221F4275A2879ADF5129E1CAA3C50731A80A17A34EEC1485C80A753047FB0B844CF6870F68708C26941D87B3AAC6A11 Out = BC79F30A2BBE68A1AFFDDCA05DD815A7624FC09BCA25A4F55BDAF47D9715C59754A74E2DDAF1F8395AD054C444DBC68E63A56FF3677652B8505CD1EC285258F3E6C3F5701D906648FE6A9DE9EAED5F82F2AF8B6D05DD08365226C278171810C357FCAB8647348226222E59607DEA2EECFE62F4A11037043254B06446251692B1809E2F94F7CDE7B02AA543701D897B578491C57C771FCE60400EE7060F336BFBB4 Key = 40342E898F45D16D7F8B217EA13479A6CE624E415B514B27D0DA3F2CB51A9EC5D2D3E254DE7DC952F77262C6392A466846F4AFF35D5442F5B0189F58431018AB Nonce = 02E45B98DDD87A5508D0F9FB01BD4803 In = 175EA892388C6704E28E0059A99FC01FB61D5AC0DF1ECD94136C1AF18380E9B9F4DE638CA8E5284026D10499EFCB6459569C4B47C56F3BE7F55D03A489612C37047243A740664885C3D9FB303D28C6E1905154723F0AFDF9FE72BAE4C08705FA27BF4F90C8025E4D29C3D25D134E82F725A0C9F3FE5B37B87B381C60FBF744ACC2184A6FB1DE83EDDC8E8DB49E89FAB62575C1FDF543D77B5515BEEF9E9A81E0D6BD Out = A16A0AF17AE7F4067873699F837741904FEF70F705D65DA2C2561D34F965FACDA065A7F0E969EC56FBE8AAF469BD251C0444F46DCD73F036034844E2F7D4D184E9CBED269E2772CDFF9323CEA678A2070586CAED7589C7DC57FFD32C49870AED155E3088FB41A2FD173C4A5F23D79553F524477BE40D90E08C81695359AA6B14D9CEE4D25DAF286C917A011E5696F8A9737A5144CD959352660E5FA984D8983630AA Key = 05B2C73EC44F52D1B6CCBF6DC5205FD0D99EA7E919AFA289DB75A16646F41132A98E693119F3EFBB6EAA32D167F1C56A2DA68E4D60F1AEAD2277210E6386D62F Nonce = EE237737F78FA7484451FF6CEAB84A45 In = 25BFCF57846C3E69DAED446B45DCD4CABBB8476EF543ECB297DBC5F62B6BF6B03D44E227F020C8BA5DBC9E986980A42A7172FBB0DDF66D82A85CEA529617292C118FBDB112AA2B13BE6F924C5AED18CB0122990DCF9A358AF23DEEB00F8F368665AA1C293AC106A78AF14E887A29663CF30B7D7367675EE8C7B931F678B0AEA8A024056B660223DEA8E7BC540C3AB5CAC2E287361C6F64B4CFE0B419E4D1E2BA53D213 Out = 95E762D269AD03E7547E9411B7D7042CF8C1A3268956B9FDB9914747D398E1A8E03DE764725C649F085DF46E7273B8DBE4FE50762DABA4115873B7DA65D3552892E4E2D8FDBEEBF43F6E5AA1D6BB8985A783BACFE32268EC1792E01476DA742C8259631B724B46ED5370DE32D359B75FCD6F8DC0F73A7E5B225EC61EC354108B8F6C5DA2483C87A5A5DE4F7FC7CD295980FF3603AF1AA397D093B7C417C4B7D855F476 Key = 2A2F0E7030F4937B0DE2DD365EB7F8E62943E3F44445949C9908ED1D9E78ADD24282D752283C8DA0467E0298C7477477ED577C1F07F786FA08A3C15FF01FA7CB Nonce = 1DFBEFE2C5E73C0F35AC39022F2F5250 In = 5D53348746D8D90E5C128BA57EF254A2228DCE02E015ED46AEA8AB7894E149489D846AB9E51E635EAFD7B104250ACDCDA5C32D5642CA3EF5E75770B0B42BBDE572D8038559FE2D6F6DA2ADD3D70DBE0F810719ED036F39C14FA65ADDA926AA5086416B1D8D4FC5F761186F8351928E2313D8C51312FF344D8D1A1EA98422031F65F7228BE47993FDC3EE93C898B97C8675098F8A4133B03A5F80FC05AA1CF230AFCE5187 Out = 453B7BB1036114B66DD0845CA657F997BE111A445338866D8EDDC2D4086C555A81F120E8E2F6021B7C3EF9340182818F6864617DBA787D9E94763BF63CCCEB549D49597EAD5D2EEA390E9EDE0B5AAF14AF95518B86816B8B094A8DBB6E9616A796282700988104EC43E2FCFD4616231F71FF917719EF7CD266F29E5E0D9ADFE7805B1915D6B3E6030EAEC4E2D51A8EC2375E8D64A20011ED599927AFCE084A6268084C7A Key = 3F39B0D2ABD3E6EE17A458F794F5CBAA553E21C78E649509D686DD64650ACE1544C98E6F11797E158873D73E96465FCBFA09B96048810CB7CFB7947B0D7CC75F Nonce = 33B29834B357AD1A82D8D505F61C4216 In = 46BD56FBB3471158ACD7309FF08839DFE84E8386479C5CFB608AF838C8E322A68B7404454802FD2B9378A3B2CCBE947C1C30D141543F497E64FF1A84A14542F7FD8D485A6BE1C49C3F25BFC9160A8D3592C262B92A6A036D29107E0BCC3C34EA496F666D21B2A9B6FE4E0CF0B1A9FB1D384C0240317CA825423B532C3D69A4B55BC1642F1A2947140EF51632E4365C72E816EDE42D46F43C4049041BB7E69B6525C8868E74 Out = 3D2630B3E1100113592D45E788D3012306964C12C52C61814A83C5BE7C087D9D106ACA726E7D3B95415BE9E07EFFEBE6948E168A6D7D313C491EF3B5C6165F9984AB50775F65D6CFEEAE54E92370EAAAE9A540F214A8945C9539ED2E15779D2BF753BEC0517DCC81E43B0625068A2BA489E20D7EF38556648E24A701115B9C11A7AE831E2B7F358B1D72437B8648E679300F992C601BD7FE95400BB06BE53D07C3AB51824C Key = EC692882EDB011616639B023AEB8CB3EBBB16C2AC13F70523869E2E213BE895C513FE5EAD9A79D0B1FCB7BB6D5F2102E01D5378D8C29F20A604D5765120BE800 Nonce = BE49D1C557728CDA79D2D0BE20D49172 In = 74CE7A8FC17AB2513D69FE4F947B40B806A37BB615F6667BABFE9C160CFB0154B729B64A9944129766832B8DF8A6BBE5A67AA7B47554BFDF521EB0A460CB249DDAB0812664E51D6F995C9B158380AAE9D14E3851E1A96BF893A789CDDE35D1649F3188DBBB214D220F67EEC6F4FB71361EA89E7F83773028D5D44D21EF543A7453CA31C9E4EEE68CE8A26C702CDDC1F8D4D5567ADC00B3DBD814F2E7E98BDD9DB7F74EEC6E28 Out = BC3A241DD09F3DD74328200E16FC3F0E84F26129EEC2C43C7CB2E541DA356E3B6801F0F7510A02F2B6F9F8706C3C439D27130F75B956FE76D894C3FA42586DA37A906A50232DA7222E41E5F2818A52C24CDC2AC5F7C10F95423B8DC361381D276C96A6491ED1EA10629779C670C37CF7AFB8B6D5DAB445FAD022A4B2DB6DCA787BB69FC91AC7E1C3631C1A5F8BA1AB6543E443B8A7A61987F98154CB8525963EFE174229C0B7 Key = 287A4E69F4D9A76282BAE339E22B2638A46D94631D6432AC5A89F656405654BD24662222BC177F58308FAFB5E764ADDC672AE1158602E814BD2B08F1FC3E36E7 Nonce = B9B12832D12D717517F258C1BE5690A2 In = 0470E50512A34C1DF99283CF4D9184E89948DB203520E275F5A522D2391B95C8A5B85F9F2C0EA567DA078BDA69AF104E7E8493CC7AA620DF29B95415D52EA9E5D94A3DDE13AAC17CC96639F0C5233D316DF656504EC796DB0E61AE8F694C6BBA9E2A07A42F6A1B345E427BA441058BD004DD41C34C6387082442E6A52DC50C3BA8172CFA293BD49F64EE4371DFB1EDDCF1ADA26111060EC107F83FBF80E8463FB10B4450510B32 Out = C8DAD6A72DA01261E456D96FD701EA8BF9087E8759A529A2B8882EE275CA6997CCC0ED7BF7F767960C003216AF788813E68CBD2F730BC223DF5B497016D19220D4986C2FC8A1D24EDCE97332D3B7484143273615B47E8FDFE6B35D35905B9507B59DCD18132895DCCC17694B2FDF23B770D342A49B3FCAE929450726A1E138BD723CCCB53FD527F834F09C48AFE8B8BBAB5C35A74FFEC17DF55C5E2BDF3BE3B79C0339FA6E62DE Key = 605AB0EA23DA5AC1C0686368934E5A07D7B39D6621D6BB0062070FF61EFE1814C64565999EAFFA72EDEF733D1CB2DDD36FA08B27F56EEADD164261B2B3EE559E Nonce = 50B23C029B17A5EF9E6E366A2051F1AD In = 7D03B4D4167C04FF8F41DD5976522F39A2338BF367BCBBC5682DFD043707079993F67571DCD86B4487FE88FFA978ECCFEAED8E7A549A5969F51D9B67926AE351EA9DCB942F0D5295C577D0462496EE8E1F1205054AF3107ACEA7039B7396BF025307230F71B78C3BD5240A1A7AC5C6C92979A4BE78E709BCE228A4B59D72F1348E8919896BFEAF6F8359F410D0FD1B5218E112A68884E1697C413166E70DF66A3A40BD15894C877D Out = F1434086EF7D7CB877B4C499A6081AFEE00274B2BF745EDB5567684A1E52420EDDF7708999D62C34E6EA693CF5288978A87D5957A3759A26D527E8DF0DAC70F1AC497F14ABAD4FD0E7ACC1BBB52560402DF9B314C99C938CAB4AEB85BF8BF39962B0185673DED1F8AFF394C0A813A00FC8DD8092E27D1F71AF641F65DFFA069EBD9D07FDFDCC96858182BC3EA94659FE63C8170839612BD836CBACB74635357A5C75B30F8F68FED1 Key = 9F67FD638AAC6B5B0E9A64F71447959C3ABA12A4B5008B82906E5659E15DC4EE0903D42010BF1B3ED1B37D0DEE33C1A30234D70C63F62CBBD00048135160C920 Nonce = 8E92FF08F492B43B205925F59340CE8C In = EDB1F511F0D4487A3E84915CBD97A0B40C0597A4F80CE26ECB19D0F75927AD01C481901BFAF88B12C0830F34A546DB1EE5ABA985BCFA079CF70FEF61E826596C65D4CF2E8ECBC2E9CBCFDB503C17DA79484EBD00AEB306F5F42B3CA0FEB8E6B779EA7DB842AC7E904C4DA16E199E09379F770CFB69B216AE8203B1733EC0EEE0410C9D0B72B2C1206042A7F08DB2FABA2675C65D150B0E7A3884AD2C75AD857800F6E5B5348AD45D86 Out = 048BDEA47D82862F3D18F81FFBAB7C67AB7E2DFCA8E0F7B46661D51050DB848C0CC464092B496A9A448BEEDB4C07612D89E5274317064ACEF9E9F1DA36189E0A08EB088629312850F6473208220142E126DEAB100E882FA7E989DD9039E737784C9E368B132D96EAF9D53DAF9D76E9ED44784FD47652FF640E1EA9141D7234854239CAEC35BADA36CC900BB6CFC829ECAF563EE211BA534C47FD99C0A40CA4058206063A961954156B Key = C9964226EF7B07ABAD30CA20D28D02D126A465DC8F99CB433CDAE7AFA7C974008556A34CA4AEFE35E5B23B047CE13EC038F0F381B8CFA1609B76682DF39B0C48 Nonce = 8096E3A29B150D4D1086E72B6C68E677 In = 7FC1F05C2DC5317B325ED9B03F5B335BEE640D04B8AF3EF3F8016D97E4A20B43171B1FB4F16EB06F58548B7D2B41F57B7EC1A0C681D431E436226B34ED0C6112331C85080FFB631E949CC724E7B80E8DBEC711355520316A91D549F251384DCFE367C568C70675C32D858E4199377487F20FD8C3EABF47A5978C5D25D317D6E6DA721E732522F7FC98B8BD923E8B5262B52F4617EF5382741A3AEECED3D8CB806B81D578C932EB00D905 Out = B72A32BC2036AD390C2B72634479D9005B7CA3B91B5CAE0E7EAD8A7B8BAE28FB837948F5170FF5BF10FA60B10F95EDD9FB4CB298DC4390534DC98DAB29FFCDD8576A71E53BCD14D9E4D27E5E658A9D2AB193E26C9A0C2640FEF334DCEB24DF2886EB253279FD196427AEB4859507A273AE728BC6FD095819DEBB7E4B26AB5EE07397EA1203BC36CCF46ED3C753E07548F6E0CE04E4082B21079EDA5D47AE1A9EA0686866DB72A5D49901 Key = 78C7366AB150CB962A22D34669DA30C58669A260642838BE5DA0732C4928662324747426544369FC00FAE335C0A3110EE1E0B98B9F760897E7DC27341B69C6B1 Nonce = C4E3F365345CE9E167ECED4451F53D21 In = 074DEDF1EBF0CDF27B52AEAEB9192DE48A00B9F54046E49E253ED5670F9030B0B6FC048DE0481079FD90FDD11C363DCD0FACD833A273520D81CFA1F11B5C07CB3BF10F533AF2BF843CE0C6F98C7475CCA6BA790823E590D26E1934B5720A7F00D9870FC73E05D4B1B80AEEB27F3CD2DC2AA7A2DCBEF69F40E348510C303BF0FD99D2C06182642402203C327C86F18A432D0B1DD9D6A7778E8C9DC7DD5A178DA0226EDF0A455F71124B3921 Out = AB1C8CFCB9459DBD044BCADBFC6ACDDFE6DBDB4F2E832A005B7E49576C1EB20C37E340ECFC8D1131C6B2B5B80B398DC102EF780F9F75022B24F3E88E4B152FAF49AF856535AD9C398EBC9C7DC3ECFA4C4A97A68069ACA3A6D7AC83B763F6B2F9D3656EA4CCAF8F0BB3A37C19641741A4DF9F8898D1BB695234C53CF14BA554AFE2857BE516DD22DBD106BBDF694A5F6C223AB1731BC12816F22FF985CB4914FC0DCC3D59430220F1086022 Key = 9C739944C94CD19E9AFB1B57257DA371857A1732CF22E4C043C8122F64A1DC17BBD92B4E35E9CD9C666DCF634CE8F99217B8CA2A8EAEF50808923A642600F63F Nonce = 1B5FA8118184A055DB35491464856482 In = 72E4138B27F098EA58B50569136A084DD9B1E10B4D2F5CC14823FBF5A9A64F0A1E4D67E330811D7B3FDB0562B71CC70E31246434A9D4492C23860D2D3BD53FB0C8B63ACCCDB999FCE782BD5C5862E81258870E823335F83AFB016F83365F14C0D14E84EE89E69BD3D21923020B2D7BE8E0700F9F625DF4E5038781CCA5D1B16E377017A06F7E1EB2E90C8AF51C6B0EA35600C49E57755363A60799624212AD1570A799D2CEFDB6606E00BE7F Out = 446CCD9503D8DA3FC85A9A11AD73F70E29EC72612A518D30F62A3BEF3889CDB2A468FC3629066D7AFE744C7FF2FB397DD150688C6EEFD828E5957517F9F1915C672FE269E29A327C913B06240E2DAB6E73387E8DCC807F16B60BEEEA4DADF03F837D5F40CC0BFAB2532F4D1980F0C2CEF54B4E417E36C79EE3AC2B7991151CA863989FDF8A1155DAF71A25C813F7068A66D4BA76CF0BF3BC4F1DDBCD8C2183D7471905DAEB1A6B1D03CC50C2 Key = 6702A191E32F70E4912EDD6A68E411F88ED6967EF800E84915102899A3D096D3A0CBC37A99A106B1B3C1C8AC946CF578AA638164264573085972517AB9F5AAC5 Nonce = C4A9288CE919D007E1823C446A04B33E In = 6450D405125780750A620B21E5F321C3135F0854035210D41D6097EC8D6400B543F588EB330AF977033DB532663B3EE83C3CE2249574494BBB6CC429EBD4B5B2E498D94FEA58B860A0680BFE7034DC73DC74B595A6D5730666E8EF8140CF5CE4EDB11A496EE6E84C3850FE132C36734A38DF8437A689AB87191C487D4C75002E0D83301249A07DFB3A098364054C74FBBA7D875823B2A4BF7370466C1A6E0CAF01918F3D6DB5E0FC923EE14310 Out = C608A2A5C9EE3324CF0F1508FDA3BC092D358CE21A3564E25AA3E455A9523BFE7CCE8472CEED2CC94CC735544486551C665DAB777E5829D25266D339808386E57BA78EF5AB04EED9135ABFEF4AAA70661B48F6F0074405333DC19F936DF26E9338A817FD55E2EF34071E01C0B96307962469EDA07974958D1570693D6254BC465511FEABB7D6223D45654BE5A3CE479E3BFF8E5EC9DE3931E894B039FA220B8DE2DE3974479A7F621977CE7999 Key = 2E21BD2FCD60D211F89A4FBDCBFB162C3B95F364B7F7FD7590F32C457EBAF1CECCE5B1AB9EB7A1BDFE705DBE8B5EF26AA3DEF4935D05B7CA35AFA55BC28F3C24 Nonce = 82ADA377171705CBAD75FCB8F0E65D35 In = EA3127AB21E2A44AF08AFCFAF6624A78080103314A48D59A309860D072B41511FE993C67878E7566D2AE66D326D8F53B45DD7019744087D2E1853DBFE006281D5B780D9747F0BBD9EE7A4FA2FA72C4F03B01CFDAFA3EC9A4777AF4127BB01A41C12F851D1077135353EE80BDAEE96FE3C183271BD38A2FD0C6EBB210AF1C99E03E45B1417D18A3F8AD4BDF8BA03A707B0566121EEEC5C10B319B732B9B2421EB6839F9ECF897478D28F4F6A79C79 Out = F7DDD97DAD526A8A8F75E9DD438791F088A6961FAF8E85FE9CB4B29E95E0F09506E38258121B260874849C51E8939E2E630662B28EBBC379C56103882EAEC5FCFA957B883CE9FE51A4AD930A5530A423CF8130989678D74E6CD0AC0F8E3CE67CF639D56ACB0CA7A865C434A754EE663E3024E0565A3211DCDB5771A046670730D2523D9B1FC39171515EAD97FC886B4C6D46C7E3DDB689E3BE470A21A80D0DF6EF9D79555E1A877F6247EDB6F295 Key = C66D330C5436E86F4B16270736CB78241C201241EDC7EB5913716496A42BA4EBE270AED737CFFA5F2C8CBBF9875DCEA4169284A412CF62896CF388013E36C79B Nonce = 800BFB1F8F673ABAE7178E94185F209C In = E8B2535D6A37682648469906AC881413CBA7D49BE0FC6F74EAE685ACE96771199941ED52DE67F69FBA34DB74D61D75063C4863C16310457164CB881ACC1CC56671EEA602191513416F7B7C3072816EF31FEF7EAF2F7E82C61DE9A5940B94AFBA33838D138F367F5C7B136370BCCE4C760D6E24BDB25B43AB4F3C3EA9683C9A9E978891139924200437551A0F10F15240816DA6B222E309B80C6A4F5E3F61ECD50B36D4FB99221DB0302C153427AA51 Out = 61265D8C6FCECD326A4F76A6768656523FB32068C5BE1FDA44F14C225EA50C7B2180C470832CF8E0B05F698A700B7DBE93C79450DF3F69E2575AA6BE5A37925850951D30AC621BBCCD898CB05E9860F5A05F23C3685C84470B7442BE7E6DF0C113E9D2A81C7E205491407AFF681FC57E3E03F6B865266938F943BBD4598554CB5447BB577090B5551893FE99B5CBAAC814624A993041ECF5A451BD6A9C33C95BFBF101C08190FA7D8106AA03B8ACE1 Key = C7C3824E1B8364D2DB2DC019957BB5E5CB65099A2C91730029DB0F33FAD5A989CCF80612685563C9F4C8F5D1075B2D54DB58679A7B0DAE823F2E2170846374E4 Nonce = A46A9D0618A4666318C58CCBD42F6EC6 In = 440AF99105B73ACA853DE9D61FBC738D5A9C7906B2E78C2381853E84F6BEBB26C0DB3507C9FDC0465177A57C0161E90BA98F274EAB79116D1391822E367D59ED447FF0D55A6A5FAC2DA9FD31F1C5E14029E0600600BE2D0BC0B1B02CE6D2162409B44606CCDE909C2215BF46C9FC5BDD089B3238FFD522AC86B51389FC327870471512F08D4911B80B521A6EE735F7EEDEECEBDFAA6E68C12598A36CE0EA2C36853164DAF6545786B05E471E9E1E44C7 Out = F4E9C2DDCD58BFA0D71898E731DB623F9D4947B11D02563D8943803A4774D77FA08F021AE17806CCB1923857A4D323C8CFBE5DEB36F66164EB66D07C5D3ECA9D0860C3E89B7E1BEF59D976E4C0D90CD535EAFB00EDDEE7C393F3DFE5A79FF2BC7B12879F4015A456FE416AE1CA62816856E50E79A760457254E3729D65784CAE9623E97D5DC609B95E43497A59EAEBEA2F6AC83647935101CB791517A2171766D4FEDA925505744A96BAF0527FD3D774 Key = 2D021A692A6F036D2C373D80ECE5D2A3B73B2D66FAFB5B0A6B587C098FA321F07BD02F3F30584832093F0DC7A4073B55597F5C8F450360A1CC9CC6EE39788B6D Nonce = EFB93BA156AEBFBD1D73ED80B110B52C In = BEA38F61B4F285DBC6559D06B81E1F9401386F1BD0C96943B5C251012B6487050ED43BE77FC95613449DAC4530E33A6DCC1D4AF1DFDEE7066533EDDF5B0F5181AF0394FC640D3CEF6A6F2298EB8F48FF237105453693DCD960E3283602E1ABAA64EB9523B53CBC8AEA28C09A4B55B9EEC4575D3F9F0998799F10FDE67C4B29212137627C988DA9D0878E9C0265F85E60E9946D3EAB9A973132506ACA6F57CD1AAD563711D169CEE234B4995EB0BCCF065F Out = 242212A8F250C8770CA394EAF117FBF3F3581C86D23C00D8399638D9714D14285389D22230A2242902E8F9C654751857B1B1541C78DD9B3B2B2631FFD97DC179A4DE3CFD8F2279C94ED1F8856016FC735606CFF8321494302DE8AAE0F0D7557D011BB10CB781F8B101732E3BEC2822A20007C4856FD83017C562731782503BCB9CAB5A393D892529192BDD409CC937FFAE058613080F7323413B911DCE83287171B2401A9B34E6A1244E48B810623FA3A0 Key = 4450F0026B43D66B3A815B3FD0A0A2DF6D1D980C08F0D8CA20B05C57A8291ED719898A7AE598B030FC166A4987F9E3600E45A6433CACB584DE54A15CED22DAAB Nonce = EE277CD358D228D0F1A17638A3B5CB15 In = 91BFA5CBFD3696A51BEB86EA4AF4751E5D9F240CA3F45B247EE805BB380D264CB350C7B72075930F0C3163F329D3EC42D046BB8713ED9522BD71D11F51117E61670B6FE73C7D960C21DC63D144E7B790B67DD5690082CAE7750D59CF630A9C9085BEC93DF7F7A14BD5A46E4F09E9BF73045D1BCA8BA676C8DE8C3E5148CE20DE39FE4831A7C1FFA69CF6D7B2EE1413B5B8902316358435458BF7561CD7508CEF9DEF25EA833491590419EAE766A90271C313 Out = F5D4B54EEA1F2524082BCB8284B588633CFC26D565B68AC2B5394E17DEC065D67EAC580F8E88720D470331B09D176559C032CB06A6A3C1D408B2ABFBB3C5C50CE4FB2C142A62A63EE12C9F83B184E273520C91C77F9A4963F692DF477E9208370C77E0C7B805271D08595C6A7CC080FE7767776D0614E2DCA49763783384F2D4E70BB29C32140F04B9EFE8E7323E7441BBEC9262A9E3726BF0D76F6B3163B7E52C593E4560195465F4B39063F64C50FE782A Key = 5E5A8C394CE4BAFC5105AF3C3261C627ACC1FE43C0B237FD9806EACD0AB5079E5EA69CB0D7D9DCA748E857D08AAC6BB08E64E39A9C0B89360FC9A006561BFF07 Nonce = 3F8315ED1166CFC4C949D80C4C877B45 In = C7FAFD52C448D1B4268F834BC1CDECC5DA0DEAE4C30D470DFF9C7927A1A9E672D3A7B97F2478C41DED153ACA0F477F6567C6A645AAD73EE50A01532F2D372124B128FB75AFACC8E9A750728440220ED567B25E53466A6544C94B843FBB7C65F1D8CAA66DDC8C6F26D61EC241D852381D2CAD9E0BA2D819A465B99C67BA275EB73A23C273E9FAD16C28629D89C4D8DE889A79BD4313DAE3BA6821C12188C2179F087231E5281761E83115F55F6B60D96E2690CA Out = 94157A810F5B2EBA661046DD944EA27D9323F92818D8DC50DC94FD4F49C5C75668FE433675A949128543CE5C3F40984C2A3A2171B0149751A9A577440A49D014E2D6EA21210C19117A6C82997859C9B0EF56FD213B29ABC4B19D4A7E3D5228C8AC14BD2110C6C435E0EFCE7551EF8CFD12D1B3660179B3F06D29908F2960E2E1EAB8E9206B302D13CDD6ED99F6DA45365A74E478231ADD6AD026DBFCD9BCCC20C8C95F92602D2AAF6DC42762C9A4CA834064CD Key = 233AF5A53B84497860C3A625F98B832F80347C03D53AB377CEDE75F9CBD8AEE57377A5E62E7C03F5D454B0337518AA1C8661CD9C96973A6F535232FE57AF0CE0 Nonce = 1477D308F9F6F17E3840B5E23541D1DD In = AE1AC26A91DFF93B4C079BD4E5E67AD33006172B9E01F1CD255B1300B09FAF6DB44E3840986DB22E153B53CC3413B4BB01B945984B45059CF438AE11A6A54788AF9B5FE3CB8F4C8A3C57E0E819F99225C2D8F4AD6263AD5A72F67A7B3551935FF4BBA49841E92DF509BB2F34E67DA9C0B80DE3B0C3840DAF5C285758D0431875AE25F6BFA24C957AE40B10972B966FCAAE32ABE91F9EBBF738F5D677A4CCA8A9B1C420986098C9D0B48129BE01EA445EC2533943 Out = 2876F104219955D951AC2320D2010877DC9C4202A38D6A9087C711A77CE84EBDEA9719854D3B784343BE2A77D3D154879027F122FB41B8501AB4069BD1E13B5903A9AFE82878FA8CC61048CEFC5103FE3BCD0C76A0E854646110BA35239E5C6C34A45BC03F651131B831E119EBF846460D1F2E5754AF08AC9571A3D6FBB2C82B5BDEA8A9A3C2FB9DEB4F8387595B5D6A4BD1A7122CD5CF058A80AA912B191FA10CC0CE6B69B6A7A2A8E7630F984E313F82D3F8E0 Key = B4003CDB89D9B78953A5F9CE584698B7F60D48F35A528AB607E7B3374EC8F3589DEB32877E6AB60B7214E11A448B82E1C88ABE8137E4085DAC2F1C80B58458F5 Nonce = E37419CD5E7296D0A960BC833592B15D In = 407154D63304014D9F5CB425F13C5FAFEBBCE80918AD24D749E696330E3DB8D07B0D04ADFD67913BECC7B8843B0AD8ECA1EE7246A4811DD27E15B4277688367553083DEDCBE550132A3CC16A1D088DCD5A8479EEDF25EB3C551569E73107F7CF85E4F151877F22A85EB430FC0BC31EF2F06302CBD8B77B7DD724C9E449A907FE5703551B6D4CE0042D53FF94CA7C7E747817BE50380E1785F075A5A6A702E6B6B1682CC34FA475452358BFFD614DD8DA37EE7031AD Out = 03BD1AC569325096F5EEF5D3114FBFA770E9EB84B5A2CE314F81595152474E59F1C235C0BD3309CB720D6707B90E2170719A525BD69A2E9D0409BA49019B435FD46F42667F6D97A32A094C5AF984FAE19BE6909718099F98D8B01F937AF0FDD411FE19048B7F703EFEB4B5A51B0B023150B0CDD8B6B0B91DEF1FDF526FC8BF3FB3BBE41DE16803935E45FCE9AC3E77F9980AB2031F40111DF44D8B4D8E8A9B0918F84D8DB8F370B739A55E45F48C41666C6EB71F37 Key = 19E6976CDA3657FD7B341388DE6EB2FE4CAD36489B55C26FEE2E854FA580319942C3D6EC2D7B8E998716FAA60539B5B08FB9B35105FF9D304641131844420711 Nonce = 896A1A4A3F825C802B88D5A5DB5BFEF9 In = EBA6C6B0E9A3754972CFBDEF03046F87722C8CEF5712B10AEF2EEAD6AB01C92A0074F2B37555E30D5FFD206BD1D85A810D26370D66494CA4DB339019A70F330B228E06C310BE5B0A108ED70C71C7471ABB61A042E0014B41059FF86C2A2D7AB0A5E978F9E1B1A0431B30BB27D1043BCB69810806D9558635B52B26DD915D9C990540DF2C5C6DD2FDF79652F509EB7CB22E9FE6BEFF80710EC013B7914DCBCA78256DEA744BC6BF23351B8831E3E65D24F365C8276A68 Out = 6D909A2AF702E986561209B48D684FEB8E8F182B196CC021EAF6C876874813F14C9755C4BF7E7D30A8CCDB76707B8D6AE236D974493EF2C0131E70E73AFD811255F319CDFD6B3E0C054F8340E18504EC94B42C6BA48927C80E8182A9E5D9E3F40822C71EEC43D209DDA15BBF4F7C2E880AC5044A41CCA11F52DF8E24671774A22A285E7915F063AF189CB90EF0845EE1B0C6C04E636CF0F6E85F0875E858BC4D6810DCAA9236AE75EF83296063E7D4350F5C54EE694C Key = 1C1911B5B6D11BA6D1B1D2B49DBA15CEB7102C2F2DED6A8FB6BE6E9F78AE31F970F080072B1E17ADECFAB5DA1433D72B9E0D12555929272AFFEBCD9D42857342 Nonce = 5B6CF655605C126743C49F70A7686CE5 In = CA50890D0642170FB9EBE4C91598F52E43F62F4D9F3D65A26500D77B0DE07A19D5856E746158C68702DC10C252C746A37A995DECA63B2C84F946117B45F49698F355A110DAAD751EC2460C67DCE33A38E759D106B88374A6980FD3E06B4C5AAD694900B11D43D2EA9CDB19561048471D480C3B62E8CC6365D1EDC65561A68EEB01FD4394ED61F3E6C9283072B95629B9529DF7E6F2D98D35B49A7F5AA8564E3766B25DC64383FC631404E05B94B0D39365CE1D44DD8F26 Out = A521CCD850FCA9E3A079127F4D4772170F517711574E9EE0283D5A6B329AC5DC1D61971888B5A246BF223006CD8BF1826F6C9209EA7322F0F6EE33053EBD1AF697E4C5A30E05B4BF521086A91DD12846D2713CC8BE767B28E24D2D72C1F6E2A77A153285684D94EDAFB68B3855719FF00E3D393BC72CDDF8931AB96DB1E2BE2C0AD0316D15F5EDA96DB35E1F4C0B1165047DF84E0B53A567CBEA98612F1747D16A6E170CCAC0906A5BF669A58B08CD3E62229A3C0064AB Key = 8EEAF603495BE33935430A0DB5E17D4BEA3E203DC90C54A6EBFAC5280EF4378AFA0B42545FEB5FA38C40CAC5FFD6CAFF2AF7BC59F314AEA5B036D35E34F8123A Nonce = 60CA599121E8D4581F53B105A4C84B84 In = C06142F18A1AB96411B2CDE62F6D1815F0590F4E0DB928CE610DA0C2120B61518EEB6BDAD0C0CDCEADA0DBC8CBF280E8DB1C7CA40FD32436CCF700DC2A60E4E99F17E645E5B83AC795C7F2630EE22F2391640C67CC55183150CBE6E1515CDD4DFD963C77BD4B076448A70BAA952927AA4A3160BE5AE41168D81941BFE19101BDBEE24218B024D9A4E70FC204A1248F71B79E7D3B6935E2015A69FC09B291303E4DA7E29C719644CF096DFAE7E86A1363F287503193D6596C Out = 8038EA8B31C83AE5344790734CBC6BC39F924C440E6B8BE4A44DD58D0EAA7BFADC283A6E802A05268CD3E52963AFB170B487BCD6C894F27655985CFD830E403B818B6A7834D5C58997A0431F6F83C95981EDF1801F6CDAADC06E1DFF45CEE4917BB58D1771FACA8B67EEAB2CD720E17B2C3D604A14850B18808B326833937B9CA167C9FC35E5445C733E50FB2922F74C7132E54F9FF0ACEE973DCC3FC7AAEF662D2AFDA197112B9537A88D8A91298B552F4974837FDFB66D Key = D800DF0DE1C35D66FF664BD96A411073B91CB9DDB69066CA1526A7AC75C1B115E113B676FC647D18C393498D5ECCAF0DE6C2E47E40850921B8573CA6E8EC729E Nonce = E745D3E0BC6FA789934944B88DC1F119 In = A2A6833D67884163B1BC4ACE349A201B0A6FBA76E30A6739DF79B399A54921B529BAB2654F29416E0FC55C8AE1B5B4A5083A87CA787F64B66DA424E879A5AADB3882696FB9A03205AD2CFA80EEE2267C5023773E6E7A53E00ACBEFEADC9998CD8D969D468D625C93FF57E5CBF00EA4AADAE1B8043F09F89AF2A9A478AECF162F978139BB65AA73EE98D6DAD0C9D408760996E06BCD35147D89D87349BFF281E357684991BFCAD240D52111D9938E7BAA6D7B715ABE3F0EC47E Out = FBA3835619C4E134A726891D95D664968AD65D4CA0C29CBFFB9B215D34D231A63BBAB20360BDE92FD88BABA8F0C97965DFA8E22A82685648CB77076C8111ECF5BE98A75D060227305680F4DC7EBCD1708A1656A71B84014C7EC4EFA4F15A920D3DD98A28898B7A9C7502AD78D45C2456EDDA2E8DFB1CAC3D4F0AF4A9912A6AC0BF2619D82F9486FC8EDED6ADFA98BCA157E2D2C7ED9A4A342EBBA6536F07988359AC27C29ED114C2BBDD695A8B64B3371C15A38DA9269869C3 Key = 0F5DFCBC3C722B1A770EF88883D997B9F1BF3D146E68345A0E28F8BE98199696BD4A6FAE972E2DA9A60897F5DBA6721B276E3255777892D3D8DF8BA1914170E5 Nonce = FAB5694142CA9BB313090798147371FD In = 48982F039051E4BDE96D9D1344606A5ADD0CE02909632CABE2086FE832067CF9A399BC333FE6CC7EC4F202D88D74C8E0AE52796FE1D32F546BD8B491607FBF0EF6522DA1F261DADD337C9A15D29C6DB12B90035629FF4CE69C3AD8E8248142DDF7BB1413132419C67B4835DCF6A0628A4AC6ABBD888C2C74A1F6EA4B5715138733850CC7D5BF7F801AA8DC3D8ED1CBCFCC0ECDA1846533BAE13B6D20092F04B2B2CB136CF968EAE4C4D8CBA1D53C8A6542E25E386B89BDA3ED42 Out = 0B7DE8410E19DC8E15E7062A3D3D5C00AFF28173C073A72E989DF723505CF53DE68D4B6A19D1F1B76B729D65DA274DAC8F7308E8EE7174DB85581D5BAB09A5BB67809F99D07677F63FDEE0892193AD4C966DF08386B75FF819CC8AFFE0A02B2226C04E5282D3998D2F7ED89B65F8D18667D3E4E17FA3F81E101836F8E696B987FE91B81085454A27DB7524F792F1C07C7D2F1AD7BA06E8F60D99ED869723B69C1A681B8EE00AAAA4B65E2A8AB724FEA98F30C8C88979FDDC0FF5 Key = 01AB5EB282CABD0531560F5F5EE246FA9F90E26CB83029580BA49A24C9EE66BABA0305B536B2553E2F18B72CF0D2C94FB27216D1B570B14EE1B2317C2EEFBB35 Nonce = 60CB3EFBFF62048EA13C465C0AA733DA In = 7CF9CCE24D50A388C3B5B171F6508FA61E025A8504D55B8624C7CCCE3E2CA9125247CF690B2BF388C36B5386979BD10E142B889AFD9A531EB16D88BF767FD0837F7D71993498968F64820FBCFB28FCA13D6E5C1ED4AC4DA0ED1F6AB74E1308B47038DCD39A8DA33F15377E857D53429328D222F2D0325F20DC1CEFC3DF4E3F7E456BF5C05897C70E33AAA4A918B44F2B02FF0065C845A3742354A25F492C651E65BD2ADA8298FB85927E334C15DA3B51AEBA97F5CD332E32A26B79 Out = E55D0392687D295CF444AC734E7035DF1F99A679203810E0097CECC64E3A400D0FBDEC877F8E8FE8E4160BAE15CB209B7EFC66406541424FA595C5E500F49EBCC98941AC4B9D8CC41547252134177B8884A8D885210E886B2C942BFC9E54A3F3FCBA4BCFF943AA27C565A0C9C3764281B847DEE305981608FC59FB6C596BCCC4A99D4F872DEBA4DB4AB196635E7DFF57132691816D8CC936F13125444DDDCEF117679461BE1D3E3FD4923125CD2485BAE422EBA40C163C375B4C43 Key = E0E260BF128B586F8E49F7511E6ED886655BE3DACB5F6047110CD77EAA2BE2B782D53734407AB5250E276AD6721F13C3BF21B3EA2BF56F6A6ED13ED4AFF473DF Nonce = 18D62303ED5F3DD7825145EC928BBD5D In = 2F99F7174171E5CF558758FE4A13C250F26036F4195A487DDE9518BB0774D5009FE35359D1C15350A167C18B0888BB1BB776951C149C0848D973993375031D64601DD0896E50097EE68C4D648B75C587E57B7B8BE8D8C02F44AFCECD91101C972A2C151D62FD715A53A732873F6969051AA80DB097EAC069F2CBF8454C01E0E04D996757DEBCEA1C4960F73DA472DC07B6B72F602B368C17DE8D83705DE1C948B5281AC2FBF147BB12F3F0699BDDD873C046152F4450864F99B82F4F Out = 77A1EE11A9AE1BA68F5826591BC9C8D3690FBD7B2D997236368DCC7CF0C4500EB1EEB71F1AD354EEA126F3DEE002268878F4738F6F4468D237911F5840E6DD4C00DA1F2724E9BD4138ADCB9BF588BA8CE53617C8C08609D24716C543CF519AB1446D05F3568CAE99685A833526C4B78ED55F4EE556F5844A17E020AF7F4B5351AB65668BE7D1E46CA492A0C2CE46CA6EF302417DEA2D342CF12B390CB2753B8BE4DC233483DD57570EDD36F2C3CC42425F3CE84D8A26CBF351A867AE Key = 0854EAFD42578C7200803C7BB75BF68887BE1DA526D8E9A936B5A4602EB94B3A353DAC9F4891DEB8A36CA2AD870A909CDF71D9A29FBF23BB73F556A7D0787421 Nonce = C38A6EA283B7B63C5E3D5E0554134C62 In = BE6683241F0A0D16EE28870D7B9B53EAE2CE81428282DB940FA25F5A97156408AAF0B9CC17F4008BFCDD15ED3605040BDD9183D41C660937E7B37AF283C6AD684EC3F3476E1772EAEADEAA68599323CEE4E8CB9238ECA5F1AEF151064CD0904F5CDA1A9B55DC99553EF0227F916F957A1DB95BBAB9C8963327810F4B15D600A9D8B49A0F12769D294FBB233A4CF7EF85F08631E144A247786271BBA0A07A5004732DF666C8554960FF11E3AFFA060016224D3EBCEDF1E653C6B98F6594 Out = 7E928D0727144C562E14A0629E7B7C9BF59B81951E30612962EA2EFF48CC1778F4FE9F494703EE48545BEAB021E22037D0DACD9C95E51384DAF38EF63E4F741FD8BB9650648100ED0467464281569A90FA7DAAB4930F0A59201CCD80947F73BBEC3D0CB42226BF3D4A0B2741B4CB6E6662B44F8183EA8B058604499D4EE86C0CE7E92736F11E5F57B03DE4D73D7E4D635E5702946790B5F9290B77F14892204EA8709DF528958353BBE8C7C8B048C61D6910E5838CA39E3CF854EFA67C Key = BA7F55327FA917BDD6F5A9678F69E90E4AC4B52B14D75263653DA305DE0D2FBD968696418F95F5BD8000BDC39D86B8F7C13E982AE4D5B0C2A698B1882FB8479D Nonce = 1844F3A80ABC2D2DE330292CF921379A In = 72201853E4271966921887B74A3FAA2A7D69900E334BB552C56045A608788954CB434B597D7A3A90B0E4F380631FC39B6B97F3B716305107EAA08D7C9B9FFFFD9966E873E62AFD3333F7B3AB66BDA1B7088E38C0C0E595F03193434D6A503B083F6B5939BA1FFBED2CFE98D86C2499C2FB0A412BB623E7BC0C962D57940E84A5CE5135245DD6D23C0EA7C32D2BFCE1B2368597AA73CFF806C477D14391D12247AE6FA1D2517DDDDFE110A0C33234089482434E5D4480789108A565233A34 Out = C5E2845B7306C15C425127AD6FDD198BF09A9706BE52EB9F06EAEFAE2426E3A60DB79DF0B4A859BCC741D3A21596EE325E0AC904B7BCA67C2855A8022EC0C97746A18CDA481033E80B462FF238F2A3BF1ACDA1A8AD89B1C7E3DBE100E9BE3044AB7E2E4264C0C5244F597506B9EBF74E93E1A051C9166E4E833E7D1E8677224F535A62121DE0235C3D5DDD2DCEA45C7FF0C640E33A5033A619B416CF085DBDF8661B3E3AA14EF0C81C62DC9B7E7FB0B475874490274CC958051F49045053 Key = 00425181802B691CE6D1AADE6B9195CBADDF8443D60C9515920ECA07637904302C85382CCA53F6803F5B02DF03AEAA36E38848A2001B4FDAF706FFE4374C6D3F Nonce = F3732079EE37D05203170631E634D7CA In = 10AAD0F7DE6F8D658AFF5CC5162A71A0AD67250B7E2E6332826B7BA8928B1910B6A6E238E8AA85925FA7D50F9E725AD9192D895DC4F6960CAD0E9D79A90C6744A70DAD60D96B8C933925209698550E4B93A17247C601444F4BAAFDDD63414A043146C21BA6F09ECE597DE730922657BC0E01148911E7591547A33A111C4B7BB4AC2A803B4B2CABAF98E60440E635FDFA8386A94D77AB9989DC2270DB9335C26BD7692FF3674A8F973747AF449A9BC3CBF41D999CA4F7B0D3FAE10B2EF4977A Out = CE081752A44548135672520C5B3C49812F359C4EB5CFD2D9C85377AB7CABF248F514AD88F6C86B3312CFABDBF9B94B5E07D5E711B0B355B0F1565C639E8DE246505AC67C4EFF42C0F3C52FECAD6D9556C074B9321C8677099AC5B9B97BD03A2DF231B45EEBAE2443343E62675D3FF7FB66520C07DAB62C498F35DC229E0F8A9EDFBCFDFEC844D7D45FE23ACFB70D7B592E8DA050BC5390A669FB7B0D31B8C96889A50D9365771DA0B7C738E321596CD706062FDFCBDC1C8EBE1543DE8C1339 Key = 99B1AD739FB6E0B0541404A43C619A50224C98758CA12739E6781930020A58E4F2F6B0E6D1FF0829BC67273B92E61A03DF9973EAEEA178D2914F0E85CED2D0BA Nonce = BC2F2357CA8BD1AAA4E5B5E474A4AD8B In = 836FA61AF56B019F692DE12395BFFE9E1FE2D9469DD6969AE32ABBD024F8E959EFAF934FE1E80FCF17264C950E03CDF1B9F654373F8D454064D8CBE61E596D161743966F42B9FBC9A9948DB37CB770476A7FE5655739EF1A894C17D9B6526D7BE8EF1EC19EA175D8EB478650D71FA824BB31CE6E5B1F96778A4E2EE11FD555ED843E7A95E284F231D566ECAB8AE21A0C30D9B89443F96960F2792B3611CD59B41F8F884A3B7A93B769300AE037D17FD1762A71A315A41AE2F5DFCDC9D3A99760 Out = 685D83824AE8A5607A5AB864E215BD6355F29A81E683852BAF9994D2148E0D9E8E8DD8CEE9439FB265C8F07C68C34304FE15EAF392805769ACBE78AFB1CE56CC07403FE4C8166D7276B22311437CF06780688FE697E8C93360E8C848C21CB33BF655CE1B9D68EE9FCCD81CFE926981D969E35869C65DCD57A81DC543886A774A3AD9B1845B95DA3A0F5975120C72CD7F67BC5F268546AED3D5AD471DF26ABB464BE4A614039B85CB926D947208F1754CF652A466F09305C6DBF20DC4A05907AE Key = 0F9359119866CC79545EB83B4532B7F002AC00BFADD8ED35BB96A27430609D741BE214E10A6CE667E177732CCF5757E793CF0C6BD54C87FDD7EDBCCD74F3E47A Nonce = C77842E2421FC96B28CA883E7E0ECEB5 In = FFB0CA3E6521204EBF83B9532306778EEA543B61A62EBA98658A37C3AAB970EA888703A80C98584BF8C5DAEC130C216426BD46AC6D27664F5F3A39795D029B748BF4D3F9677E37362854235097827EC220D016E051BC41FFD90A8FCEEB13005BA2700F73703B1E45ECC50904660FDB9567C9BCFFC4EE9B2C17E6DDE2663D6CE997EE01CD7B0A0EEDD02E6E447A090106B0E3825914FFBC0186712EA4A1B6B40CA3116ADB0A3671B0574DDAC03EBE119D09A1A9068947251A6607EA410FF7768BBE Out = D8041389DA35C6C12AB5CAA407D588EDF56E27556F8A56BA0FC046EFCD590CDD8122408AEF8C93EBCEA7D805B03A9459A34D536287DCB176472AC0B266BCC08A28747E5A3E9E436BC3B10022144621C813DB89BCB08314368EA480A469EA19B0C7A633E7E09B4F265CFF66E4BB4C14642BC02CA540B83A11B76C593B1D089D118BE75C289D41BF98466D22BB7012E8164B88BE7A4C0F19F21734A4B73E7E111455AD6F05750D91486DDC8FDFFD4923AFF703A7769349A6F77A408428B78672910A Key = 938F609B68DFD173878D66849BD764F736F4C34EAA0244B75C2C37AC2ABA87726C00303EC3843D8518CF7172C3CB4D186249522BED23C53090CBDBC997C28A2A Nonce = C8C31D8874F3EA57EF15236BF87E919E In = F4D74CF1120BB7D9ADC3F92D0B08610060E2ECF6CE7DCD85B2D4C0413735FF3BD8EFAD39575F6A7477D3A7DE3DF6216A3B9417240BB7FF7B7A32B7A1AC0E3F6D97B91E9BF884FD685D5E4ABA081A7D3DA1AE7D20089DF77D72181A2C7E3500EF226708AECEF8E1AC2B60CB2690F5B6FD2318AC4AF94432947D87C911FED3B5EF62F5AE5170FA4507DA2F063FA76EFF0F4E158C5F3537E7192304EB1E40789110C10535BEE49397238A27410F6C10C592CB89EA7165C7D5D43081D07D53A741444950 Out = C6F36FE628D05D8037744D1B567DE8FE7AD85C97E036B04D3B27573E31D8E1E6C6E126540895394655F8F01010B4847E28DF5C66AF7F4D50624776F4CE08B1420FC95A6D7637E696AAAD1BE671F21E961055BB2CAA38EA3BCA2BF0515C0F7F6D4EFADA92ACDA1414E370FE8BDD4D1C26520B11256152640189AE5B1374462E531B321EC624A3E254B6D01301B7C25408F424183330E59E238220283BD12B53544439C4EC1870FE892B1426B772B32C2F1022BB5ECE2AA37E9E97D7BF4BE1F15E7740 Key = 4A27EB0BA6D6EC801314612D49E6905B49FC924B76BADCA0710EF57797BB3EDB3F9A8FBEDE894B6230AA154F7374130255B7F5AC37CFB8271392CA1B974B4300 Nonce = BF6EA44D46B4878547CC370354DEBFE3 In = EB5535E6E264DF02DFF862853713A89021CE45358D74D95204D6D3D788C07539F28EEBAFEAB7023D81A40443D8C1437B6645DA895244266C4F6FBECDEA6EF08D796AB42D70A6D076872C9541A81E3D518F2750B8B47C896688B981F1AA310F16B0E85FE1E9AD3D8437F7FD57866FF1A934BB7BBE828BBCED3DD18EA9B9AF10D52CE35150A846F6AFAA8B72050E3F2639E61A26C5D929259EB58B7D74212804E4FEF834EB29A4242386CF6859F63C0B5843F7EF39C75D88D262497679D5539699651573 Out = 71B800BE49F9E28C49BAB3118DF5A4215018ABB16A18C572CD170B97A9ACA4E2BA03DEFC27F97A9743207D16C3606FBBA15D913CD790EA5B3EC7B6E1B3B9EEF582FA3836F688A22101F49405037B510D802B2EB30E1659AFE3B90C603D78E87E9F9E92934D76695D218AF314A275B06D61DA250140232284C0B9169F9C00BF0A10AAB0B73AC53737BFBAD23FC2E0AB7F3E61956507D58119C2FF95DE273D2710B2E2AFABB473787AF4A6F58A4A5A762ECC633125B33AD564B7B83D60B8D7E6A8D5ADBF Key = 0014D024C8128479C7EB2EDBCD188459B403C487A8912C1D010656B66A2992D549B04467EAFC90F2B013FE5C52C109908082D81F639DF9FF5FCDF390F27C40A6 Nonce = 7F80E0692AD8C618C525C7CB21A89F82 In = 559E1A0F4AFC9269AF81A8D063FFDB4E633448C20C195C3BA8408C38EA6CE6D9E63B41881E817281A6301B3E41356B0D4948F1DA4B771AF140734F698773C97421899F5DD7AD05D6A70239298A343B4717198E7C52276E942168752878AFE0D9FA764B3D30D65FE88B7DAF67A41DAE960F2997C803A77AC5DB5540521EF1F4C087C450CD19A7AE9B7858F599C0E194B81517A5A3DBEF27761A68C7D2DF424D7B16AAAC1586CB0EC363ED6FD00F5E7B3F903C79319733AA6C6EE8E9F341DA4AE9C4621DEE Out = 7AF5A8748E6DA60C341DD9217B5631BE653F294EFB8EDC237FB0F27187FAE80B09E647813A8DED7E4183647C339D650453EB69EC9A6192DFF2CE426672E236A4CAFD33541690678106937DF3B3F8D932DD6B215191FF0581ED893247837973A8B99CC495187F940EEA39BE90AD3DE0E7CB9CDB581A52E9BB7F1BE78D7C8D6BE3808CC35258EF2DA54F32D5AB231F97FAFCD29CBF1A34838E4C96A055F2F51AF27692DC6ADD11C4E0863E40BFF5760CB2DEAAB037049491D696EF9C352DC8372D4AD0BE2E Key = 1EEC7FB21870D49015110AA970EF8D90AFA9A70D7C42D8565CA95FF4DB5C9BECB81C87B413DE401567AEF4336366D1AF9BD900EAE670E404FB1D0176B970E613 Nonce = 2794A4A65C67CE7D7F426596A92593B4 In = EAB86C11D76FF55B2F035303C4925A8D0D0D049C91BE92B9CFB9DDD545EA5D14DAE32F1BE7B0EF21B3E0EDA1B2BFF9B2D387B310994635E4FC607936E1E365B80449EC00678E591771999C94F0DAFDC61BA2B191C356ED17928D2048AEA44A4E19D9FF4107E44E2A46E6ABDBEF247B6FA796CB288631DF08621FCF5EB14716C95C35A77C9DD9AB9FEEF766E977292581199F747A3A7294B2898CE27FE86FBABD1F05283E863BE8B95DE2FFCE529B473384F99CAB6B73B5E2247EBFEE42D92858C2A369680E Out = 61C702443AC36E6A9E04D892C24A456C1611836412D3837420ACBE81632DD6F15DB8A37E36FF0301B033AA4446E2CE5B42160ABC986E5BF08306812E893D2665670EAF0B32963100744AC8FDFEF34F29829DE7EDBB331C1FA7BBEEA3149AE5C7FB77E8ACC8806ED07359EB140CE96D68F9FB798B36D91AE46CD1F4AF0C5B9E94F6366674063D9DBFF1AF01D6586AE0A15149BAD137B7161FA0BD46B3753A44972001A651CD1C1DF5B013BFC4F64B22B840726BE02D02E3DC7AB199B220BFBBEFAF1B24090A Key = 91288086AC1F659A1901692B52C3E4EDAA0F598CFFA4EB58BAE8E318FE2B81F81BBAC50DAA94534683DEB7F7AE314B7B12E64B5E2C72E07D05F4F3AA15EA51CD Nonce = 8943336E2907D7901F0544481686E287 In = D3CEF9E2293B9FCF61FAC8D66176B9B227D38BF32376335665EB2AB89BD2338F480A6EC7F74697D901062D9D99C0B2BD3242A22C5511EB250BECDE63A37B32B8B4545FA5CED7543427268456C75FFC201AA138EA5DB48BFCC80E939F9BC3F6E2B16E8D614811B6E75491F1C3752DCF55B314EBAF26BF2BED9614F14CB553F5013FAF0979EB3D15D40FF94702D3328D15D1539D2B265985A9D2AF836B99BD159235C0B1C3C27AEA16408182B457E70E6DDE0EE6EBFE487CD481BCF2349664D39134D3F0409CD6 Out = 30EBDCC9883E73A68A1DBE5F62B29924D4478F9A97FD87F9307087D02D130DA4F1B4EEAC478B0A9492FFCF0BF3BB34799827B366824B7717E30AF71289CFDA2F60C3F0F72568206190E88D3DD9251D1B8E9AED0BC9A8EA54436FE38593255750E7FAB4F6A1CDEB703C6AFED2281AD873ADA562F1E302E74FD534B2680B9BCE2DEC3D2988A2D028E3FEFD5337086C788CEE5FB3D76DA15E2C94CA69EC81BEC27D374250C8B55F895BEB63F1FFE11F4BEDDF624F7296A4D135187D0EA0F1C352C9BB61A71542E5 Key = FC1C13484B2B69BD698876A85D4E14F4C4AE82A1023207E532F8D20ED69882AD62F83089C1F5E5CA8918B108C78F1C84FAE8ED83F7C8F8556673130118AD1E40 Nonce = 09F24D8D1E75377816525F7F201E66B8 In = CE3565BA0A89F5FD63C7F3E30AFF76B1683A2A40556EB33CA38B2F53058DB11FFDDB6EB83DCC51CC6B4EFF7A296481499E2B746674B6AC433088F52F09EDE54B30BC6E2BD028E611A3ABAB6B86054DED15C7B43A56B3A22D15BB5C478D68F3BF77CB0C60173856DCE5444E0B1043D26F1B6DD7E93D09A4F64894D63565289A01532216C339B20ED8A5BE6700EF9BAD1E08F413F94A4291969DE1391611E1374FB6EDDEC206E4586FFCC9EEC97CDCCE7E40C4F460DC115CAEE830B1CCAF5C70B01CFF670FD1DE98 Out = 83C3626169B4AEED4F276AF82B2934463595C68D816C1C095598F1691AAD98A243703DAB5F3D68E2D56A2D2EBFDADE769D4DCD6BD132D8C32A977EF55DE984F6A2A6E6C8CEE54209AC58E24CFBA30D04F2B50A9FD007FD0FF703AAC26D12DF799596543C425527236D5BD47EC59BD837406B4E6317518C5DBD5DB842711875455B9B88EA1FD5DE4CFBBF904CC10B2CC9D1EC949146B75B1AC84893E424962655305B09B149273677794D5444C3BC1EA36FD92FB966EFC455FD5EC5AA769281EC3A726223528C11 Key = 41A6D1880C7E6FB5BC5782AFC2015A2E9AEC92E1029EFB2138C7549FDB9780BB32603E8C52447B5AEB024CE2D86030DDA01E696B4E8E2B2D594E5A45D383A9DF Nonce = C94916E92FE1B1D443E2B8D02588EB0A In = 54843FA8D6C7434DA1E7FA2D2FB2EAAE7E2C1106F1636F35F0C97CA1101E60688C87CA5281C2C4BB6FF530DA7521FF42CF93FA2A150AA751E474350BDE382DCE7895BC52E31EE95D3B4C5894B19628F58C3EE519545B5A7E0E73931CC2238E26B921DB7A400EC6415B8B4DC490942AFD73C6BDCC6B351DCB390AC043F2370027EF51516E8A1E28F8CEACB27C6E3DFEE94F70E2E744263DEB2C03AEB80AC1A6A1D79F819FD114D1C67F3E397DE2A845BE2415FBE885B3B17EBA177F4CC4093BA3A1ED3304F5E8416D Out = 35E5E45974FBF64355571C5A1BF0AA69148A8314904E8188A0DE952B4F9BB43653529765EA698FB32C73CBFB26E7589B3EBBBCFED7ABD700957328A5A08EBD9723D95AE5688A5DC83F3B490429A62BE8A746D0EBFE1A8F596296ED40E16BAC72D3C9C8D7508A9743B9A950813E401A97DBBFAAC0605112B040537D562298A2BEED7E01002E01165979B963E44817A1B778929B9D416B0EF4E0D8643D339534A046F5D87E107C588C1C3624ED5C2B7379552EF21F62D1577B4A3A4FA95FBC3764F5C43B589000A99E Key = 01870569CC3ECB136C5413027144E51CCBD8A36E15F2853744DAE7B4E74D106600B801BBCA38B8C9EA64E87F42C4643351FA5C84D002295A1CE0FD75FE8DAA2A Nonce = 78CA0FC08EB3A11915A3CF5AEC8604A5 In = FBA6AAF6319D687E7B47CDB6AD81E6C6EF8CF3E95C583C2CDC402AF1ABD7B5808AB73BB9331D23140299D35E1E10D30FE957E314A5BB4DBADC2366BAAD9A0A0E641194373F51BE4522461ACF2B5EE471EE356C47436C1DE4FD97DCF7515BF14B8B45F05AB5134297B38E7A6756DA9FF14AEDFD0A9E9013C8791F1E4E142618F5D59627421446589D6E61E7135963C5151358BC7282BA2B56D28DF9BAFA7E360599C4C948CED58B45119A2BD8E936EB362DC75AFBE06480AF2A985AA6168F2FC4FF2ABA987FDC2253DC Out = 3C4416D1AAD1782CF5B2A2F229C4511D7272F166BEFDE191BA2BAF9B14AEB44CA72E1E8C899A75C9D1282D55F6364EE2A13F0FF4AEC38A01172E4B7D30FC18ADDD8387ACD3FDC59F39ED45F31756FE5C7A1EA1E674C8029DD562293129BC89A700ADBC8E0EA665B96BF04DE20433DB054DC33ECEF7773C7D7B117B633ED136738D95E8B31E2AB0941ECC780F855BC41504753F16835D63F1A51708E1AEB260D6AB38E3AD7AAFB9A64CF1B11904D3D54BEE9AEC2F2AAA0FD1B68CB75DB0FFD3441EF7056F7E292FC182 Key = CE1EE8443C2889AD1094C8F215151896D7A938ADA99514525DD446E9B5438F4770A550217775DB49E0194ADDEA387EFBA0B3FA28A825E62D92CE4760761000D9 Nonce = 6B1E5A4B9A949178007C4A33B68C64DA In = 8B8F766092CE5D8DB2183EA44E5E8E18461845993E6EA588275D53FB45D2548CE9EE837C66C8DE93E4A141CFA9C2B22987A5994E819AAB19654436F49F4594FDF5D8E4772BF3D4460B94BE1665440BF1CE351EB74CDD87B21D7F843C6CF0D24BA1DA47798A1BF180E47268C097CB112DA816479DF1078E556F232D29460E849EC227106F6E25CB9D60BB956218416DACCCC102D28511ABBBE2F9A053F8A982A6FE463C9761AACB368CB8D3F91F11BE6D4C4C90BD6011D7499AC760C0A9C3F8070F3539F5B0F64E6D8DAB Out = 539DAB85CF2AC519581A6E0D4460B65AC271FA0883E9527FA1FE1EDAE9936902D1C14DEEF8BF561DBB4AC4C7A59834DAE9909FE8FADC8AC4CCFA69E69EAC7DA984DF2413430C40DF35FCF6EEB0A3280BD96ACCBAEA2EF87537E27359E1CD59CC7DD93E02A855586974B354B12764B31DEBC62774F43C193D7FFC0B836AA5DA660CB5AC08470B19B8709A90FA89E7FC77FE4BB31B53A4866D97AD138C154DA17CD6C1C59634A0D12AA96D8C77D276D71A07E5F3E474FC8D422346488380FEA71CD096889544B86F1F2030 Key = 3E7AF68C7BC5A02CC26A61A72E6EB122F86870395D3DD8FF54DC2F7DCADB63F2E1F64222D8C0721EC21389C58C2C3DED9F9D2162B6B9AD670C63B02793616F16 Nonce = 41AF50E9009570145022F6D31E8D2409 In = D22225652EBEBC11D761C4F30D21495978B1F0F1D1E060190A9EE063D73859274E0930D22B44E57D0C02D3603FE1C85371769EAC22D4FA18566160AB5B1644D97961B9883050C162A4ED618BF10A148D38C06220AECE472C9C509E762686A7DA2817A26713274DF49F72E6C142ECD830844E25B08EBC1782C39B05684216EA51871C91AA28396CBF4D2B8A1C65D9C163C28EEE8FEF2D3C04106A9F87D33BAA548BB6A5BCBCC8B502053E38A7FEDFDF17CC406C88604FD6C3852BCEF2F3E2221604F7BF1B59A00976CB705B Out = 9078B3B946188F775C3353011B5C1DCBBB43ABA72F454E6911B5C863D905BF7A93118076029E4470D8F3BB2FE7E12A942E739C8E4563D458586FAF3D048FEA9E294ACD4E218CDE4771B29E456A91ADB71F3889F8BDC1C3EE743392F307E30B6AD2E2FACDDA13A3922D8D54E26F284EE6189912E50EA437E2EF0414C265545E290B1ECDE422941FEB4505EB350C0A338496A797E00B4014FD5983AC29729595ED5227B0A401EB5462F78102D3B3372C042CDFA08C64ADE093B4A1150BEF1BDA2EF722D4CB983C09C8E60CF7 Key = C3A5336F8A9E57BC35E34F741A8988FB86DD46E56DC9712E845C390E5246F300E8AFF73F61CE4619DCE7F3437C43D7F11BDF7A8A6D6515CACAC126C9E6564E5B Nonce = 59CB65F72F9C67580A5925395DB98545 In = 535488E23D8EF1110EFE7F5D3D2CA7E14A3EBAEA9959E52D26B6557F26A327BD06BFFB125B613721A2046A877363CAC3AD9D636DE77A2BFEE9B699145AC568ADDC859947E19455EE33B129C589A508C587917DFD7EF4B9017E5ED3E98586B970DA77526627B50CEF46E72D84B6372343DE29F9752F22D40E62CE30DF9ACC308FB0BD4BFF1193127120724D44BFE2CD31A340A16F129656653BCA1CBE023F51B4F7721F25E1FF6D8E6BBFFAFFDD95D57C2F5DCEB57B1D576AF664E3E7979EF370B24C55FB2301A9EC85496963 Out = 1F2BD60C7A4CCEEDA6010DEA2FB0D29491122B8A4BCD0DFA69AF58EB77DAF1342575985C3146C8E0ABDBF9B67F1B93F492643FF699B4FA81DA8018741720749FAF32B992F5FAFA93280D578A40632BD47D8750E2FE064D851DBCAE9C87A6AF001620CC179154BDF468332DC34259B6B2DC8E491A2E32EC85000D009AFD6708EF73D0908B176C0057F9DA0C655D142097203D071C69C330D8667B678D9F748EE3D3C21F475C29982890E1C115750B5E92B4B843D891FE7F6D9EF16356916DB25D80834D2964E2EE8E94D3144A Key = 166FCE6A689E4A5DB654490AB28EE5773B94FF4F85406C3CB06F1AB813020B5F71CB5588475D950674EE39BFA247B1181987A2834709224873F96E557DC29C8D Nonce = 08CD9F4AAB271859780ABC85F02DA6BA In = 27F55D03CE4568AA46EF67CB5ED66D2575E0CB5729E1A4F49AD4273A4A31204202FE603D3480496FDFC4BDA751E39FF0B277C79883FA3AAE55FAA9661669C0D737B80DF9871D578D5DF292CF74318C7C3DD8FD623133D91B4032CC6DA726C8A55185E8A95D4F54143E778CEAD9D8046AECDB4513FDFABA2289F2DE9E7870DBEA9AB92E0DA186999F16FA4D7FDAF44E11F784CF1D76A05AA27A2EEAF288B6DA2C864A7ACE5B853B4999C901386E178BE0CFF2E127D2FD92F8E15FDB9E1F0D12E506DD8321C2C6EAF6AE77C90455 Out = 667A8684FDC754279564007897B708F55D017DACFA94582507B430B5C9E974F86286C80783D5141B284CCAB7874C6B1F1CCB2F2DDB0B0E10A6B7E73408C19F269F1C996E20C3C3570EE03CBC9BAAD580A2780D6CE28C83ADE227755B293112CF7E100072833964A4BE6A56699D0451AF1C7C5007E3EE65A93F81C5E743117B78CDAC949ACEA36DDC4576C4A14D078704FDA4B42B306EE82CEF538B1D4A4C9011DDAB3714E950B360A49EB5F5AF43E4906C2A002D183B48FA4863D1B200EA5C55C13949ABF0A32F662026283835 Key = 6BBDE2C7C857D63A3BD561511630F09EB1EA1D4AC4062ACE2775E7B186D3559BD9376E4584E3664ED7CD9750830AD66AF2A88A063DF721CE8AB0CDA309B5EEE6 Nonce = CF3559AD8AB802F2D91AB264AFEAD5F5 In = 87F23DDD6C133E12808B4A4E7A786988FA9A515EA83BD716D1503F1DB448E8F3139ECF424775FC9A47D3C5B1FADF693B632BA0E380C352F491BACCB96B696E6CE122DEB6494C94FABEB47CE633E333EEB83FA89143ABB7FC8683BFAA4F47D26EC52F53438330CC84424C92B387C69222E7B4901C82C64EE069BC068B86620471E434FC8E17B7A8AB635684402056C543B1743C3ECF8448E7B28FC2369AA5686AB0E5D7BC3206FA2E0BD79DBAAB82D81DD75271A67301368EAC751368C527DAB973E1940B704BEBD528D0173AD67F Out = 08CE80E4171B67867ED224C3516E4D74EE85F3C2F7F0866803FFBFAC944D94E3F34A703A21DD6D759A7170C416FB797EBEBCB326636A2303A0FEDC7A5558BA5E546102E6931393F7BD4525DBA146153946910D7246EF570E481F470EE2D64AA7452778897B6F4929F96BDC34317301EC8AFD0D19350A04B725678FEA80775970A98E8E4187DDCC2C223C3B08DA6197ECF96F3686F1B46DF77BCA305CA75A3F93E959B7C62EAA636818683BB002EE1592F6D84DEFCCC3CA8B5E755CD4F2B5CAA3D162114A717850890744AC43B1B0 Key = A1589972F5DEC95D976E7B5DE44CFEC5A09DE4A6FC70C27894FE49FB9AD76F6B7318651596805C8ED88E1D27293CB16782CF9622C93832EF3F70719E6725EAF8 Nonce = C1094E3715E3AAE75B71E27AA4A1AF12 In = D5CB8E131F5954708629E18D602A29E6F1551311C28D2C808D2AA0EFCCCA922B11E5E12D3CF1A656DB41D76A926439ED803218FAD76AD5B90D4E8BF90F77BC4C73D0444C6CB7B8A8C133B0ECF85B52E9463B0F08FB20A5460EF84812D4B77C381A98463F76B37F2DD2BF3CB5046CA9561B5292EFC46FF32EB1A5D4F714961E31E2A97B7CF7832730023DF0A6A1BD79A48D705337CB60F4B62B00137EFEC88018A67362342863A0FE7E3A508D056E16E35648D5F13CB8D5871DC91BB814077EE1B134483C76950BE28885B5E859A60B Out = 5AD28D8DD9727F8A2F4095F21A5B5374BCA27C483417A3729A9EB9A1A9D52C36C03375F8824E27862F70D3923F795A7930B99555070FE1BE23BB5D257DD523D27A06713C8B6160D287F70783E020D99527349B1CF863E3B68ECB791E702BBEE8FE4857939D9D361FE1526C70C512A6C55C1C2DACC969B7EC0F0DD0D3D277F2BC9CA1910584DD8FC0A8A61189B9C2ABAD3C97368A1506F0938D71670D6DD84A74ED40FA8C8DC3F08EBBC3F8EED784FB83E335561F45A43D776608AFD83B9926ECD34EC4DCF051FF61F5F3D9282C7772 Key = 50C5796077D4D4B119F941EA5E83C143D0AF8B07C917C0F1BF60FC3FD80099EEBCD3A0EA8EA2C3E91E02AADCC09AB58BF4CD3C87E3F09626FD532DC481A6ADD0 Nonce = B2F73EE5955E2EBCDFA7E942E5C819CA In = 8E843FD325442267456066C1B459DCA6B92D5CCDFCD18CCECE7F081F3578E9F8CED6526EE5BD94EE35C4BF7BCFAB6C6CDAE5814F5630A7AC432A1A4A9CEC24DA57F18FAA1C4E5EDB78BC3E6968A3D01D7AE65E419E13F9313C749E3A98BA012CF8907BE47837E466BD391D22EB51141765029E991D34F60D6E8BDDF362289BED54AB48BC1312B6B4F189021F4E0D8DBE75C2B34354614F15E4FBD482F9A535AFCF7287461361D3460D893F95E368B1A9CA602A78280E741D81F338BFC8E560FD8C09216D18648C247B90EF04A60A11BA Out = 64A6E1D09FCEC7F4A126E002D30A2FE00EBFB577861734A92DAC871A52C4182CA140FCE10D9FC78F98D747BF36E368F01B5CB35D8A9F3CA824C03CCE0F34CF915872E0A913B5534CFCD135FA2DAF1346BF6EA236523FF3AC4F5E56F645BF7F95C16BB9C944E289BA4F8F616F1E137D529C0E9F4D08C83971DB7F099F0A391FB7EA6E5C5A5742794B984D4AE39D510A929AA17097BDA922024E1A2B1FCA0335F609DEEB2217474EEFDA9CC46990B4DA0CA0A70E37D6910DBF5EBD60F838D9BCD8254C84CE4ACEB08DD3CC902D395EF7FB Key = 2B316C30C2D2E3A7C4E2A7692A3DF1A403ABA403D50BD53813E68FDC254FC71418E83C733F9F3B98DAEAD607B6CF76D7755106BD93F87592819646A8A4ABF96E Nonce = 64F6F7B88A048E7AC629F76B17C294D4 In = 099259B6C95BB50843F59960740BFA94A6F001E02AE7E822F3385A9137F5D440AAEF70AE9B34DB2F4827127C7594971ADD584DB84AE5E80B1002704BACAFD7C2C0E3CF97AE76057B86DD215A917B918BC3122C505018725A35487150E31F18C3AA5435D043AD825E4309E9E63F9EE6D655A6D6F9C08A62802B8FF2E9650D5D950F3B8B7E73C5F41DFFE3509FEB59FD71A609C47AB73DFC47EEC38D6A4284EBAB6094D382FAF4FCDF5A5EF33ED44288FEDB524A8F7DAE6B05EF0621FF607ACBC089C4B69ED11A13A2162A275ECB673D4ADB Out = 9E12CF883A752DBBE6E184F1ABD72099001351238859B6C9B7CD04CEB78DF1C97EA8BAA0282B4F03CFF4E81F55153ECDD2BC20F3A25B029F302B30796B0C006BFEC79D8F182300D74F1D0D4655A54B3C311E96431AD95ADF9F530FC3CC088A3D54219B4AEAB5C01003339396E097BA1F716B842505CA4C492B898B805259CFA07BC18B9178BDFF658825010A1B4A63EE5D09CEDBFA205D1875AE4D423EC06D48F319BB2D2688EFCC29E3D8914F63AD6EE979B5EB832FF1130FEC0610FAFEB57E89DE31BF911624DA024AC1C76D023D7663 Key = EA1B3E82A30A9F62AC3021043A5DB172096012E0A169E5DD1B45B0ADF1908E46DF8083DBB2DE6065F9C6D131714DEE709685FB95CE8FAD19E489DEA4C1F9B97C Nonce = 946E436B399B25BC66782375D94B7600 In = 6A7890CF1CF056611B1FD8BA6F825832DADF96AFF3CFEA7C21F9D8EF7D6ED28699E22E21B97F1CFA5BEB0CCC217915A38F2EACFAD1371865ED9AF1C89892DC11CBA083706FC32221DDDF41AFD69DC92D08C874BD87D72C29605A1C986BCC067144CBE8511AFC2FA166BCA05A300D8CCC72545412B5558E1D0E626EA4DF8EF15CF3532B477880AD18CDB913287574195E5D6A2FE03C1BFA588B14458518B2A3A7AF06C23F5E0121EAD5C68DD933A6A8599ACAF630B5DC8CD11EF7D94E795D837AF8D9DA3716170743231B60859BB89FB1297D Out = EBBCD480D7D3D6577B08FF325D73B11FFB0B80C7F16AFBB824EE8EE4CFBF3A5C3002675C560C7535F43CD765885FEBFE9049CD991DD69F3743A73D4C0D8F688B14DDEDE0B9DC7080588B7E66D3F4233162044B725E3C16C94C55BCBB82EBE67FBD8086BBE78FFE464B97FD7F6DAEA0BCB5FD153B7D76F4669D2A4A53F8A0B38063289E8E76D0FAF64A7363BFDC12FBA45DB08CF6D07FEC9E67B768A98CCD517490DBC76DA9E52EE9240487AED24E13673232746715004F3F34CC66D30B95C7F36ADD7A2DF1AF7C64AA99705CC61B9EA6657C Key = EADE81F6DDE80B4E77B25B6D92B5BD621059A04A290717E42E36456A6A12FD7565DC456036F450795DB624818A61434A6DDA30E3B767082B96BE3FF8717C9151 Nonce = 47DE0EF7D67AE858B1C11D1FB3513FC2 In = 8428CC4A7B48909337504B6C9C23018D8D468414B965CFF8FD787DE4B20AD4EF8304E3E154BA6E623A027FDBE73DDE104E4B2D2BE6DF1987EC421694BFA5C402146FEBCB3F7B7CE109C2D198F5DE789F63D76598765539C130BDA129246EC9E895D181D13760791AE362C85E70825717C050930F34B0BAC4B7637C793EEC3207043E0098A737C7D333A75182BD904364ADF0939962AEE8E224370F797181AF10F57CBAD4147583E98A90687CB4494E18841889FADAB088639F0A645D43E5A38449265C2FCE10AA676DF23D4F154F10799D6FE2 Out = 785F133C9EBC74DAB0DB954D5EF0D14BC5E235A1D37546140E00F804A9B24DAA7AAE674FC24450197EA103844946987606338507D0772D442AA3B92DAD7760137D240E7A44B5F5DDDB3E380616097210CF489FE4B5079216F01AA164D8FDCB087238E0B1B5DE7704C71098A8C8A561E44C515A592EC501516B2C282561877CDB761208A1C4E2538163BE6F88B57DBB8BD599CCFDF2A2C7C9EBC9A1BFD7AAE38B538847C0A8B1AF2538ED0929BE28FA6C8056D4A986F9B5E935F1C580B549B84879B303D94929B8A7FBA272CD2F42A13EBE76B0 Key = D9C6A87BD9637A09E23B26B6750F874C6A50433C8D849B66182394376063E0DB2DF6623AA630344E0ECC0BD76A7E9572919DED7AB3223196DC79B871682737B2 Nonce = 18A7808B43783513F9F57E88B059114F In = CE14693992826312EC65686F4209E3358CDAD7AB398359AAA3B6766F24716D949363B70A4045D1212BE9EFDE8DCEE0019FA978A232029FA6733D71FA9E52E8CEA4FF4A2E25FAA127863512F56B67EE3254E2E228EB5FA75465441E4DE9467B49B51C72BDFA9A48DA81D0FD4DD5E398FC8C5A9864EBF98D0FE0D7A28DF7D0221C623B89269BEE5C486D06E2511603C04907DDCE7BA7D3E7FE926089FF7C9934BDD634BAE190D8861F8C49354E074512E707E62C85E87B1736B0E320085760911880F01C446AD8C35B03B441F4652D3738BD83ACD9 Out = 0AE1E2547728A2C29D0483DF01A2B9C0F70527BC82E8AE765B0C02C757D89D6860B0B50244BE85ADBB8B81FA76F2196341DF5DE5B10FFEC052D7BEE3E907A413BC336C708658891060C6ACA2C98A54B1ABDD56247D98CC43D53B792C25A4654460E2A339C6FE75FD65359A7F3B8BAE9E3404F038FCE000BE9F353A4924D88A43292607142951F1CBD4A1CAB5B02AB7AADC8C97D3BCE9C7D649D8FD4C5A621E8423069AC9C8F5CC3EE2A112A933A04F51E952CF1FFC1D6446329A47F09C831DC48CA9422524E3DBEF1F38F2E596D52952227EC8C2 Key = CE651C28DB642F182B6C4E5600EF2259916AA65A49B85A87405EC61CE51D9354BCA3A88224F4B755500F898BD718F842A2EFF7B067D9D2BF2B87540F3A3D758F Nonce = 830AB7F7E062A6A7ECEA05ADD6C839A0 In = B424ECD5D5582856DFCE1286A4934C8CBE04F9C1C38AAFA645140160F1C684B4AFDA695CDABCEC269A036D2BA57080197708776221ACBEE3E0BFE0CCA0E86F2F788A128A96F21611BAF2C339FA213F7E1132D13E80360796A74C45DA817A7AE101BB067BC8596BAA691DBA798D60F7600E783FCF9D58DD3403B0589F2171160CF671A7079BAF96F4CFA6119433A8225D7168CA7E521C709670B4252C0655FAA52E6642DAB67FA5101B801E597649554751D15F6C3953F74A05580668C5CD880920C6933534015C9342DC222C80F09876A60EE0E154 Out = 25037CEBF302ED18A3300BAE1BAB4EC8800DAE716E0F4D806114F7E49D6FF8E689735BD644E30FD52DBC815EC20F224F9F96CB05C1E95E6B560D894036087D109428B891247E41DEE3BA17CEAB654C844CB562C9E78FCA748C45CD71CB727AC7EE1136C6CE7E91D203DE43431E795AA5D1FDE7D975AB99415B04669EF6E290B4533FED82EAC477E0BC4A07F6A8D7D5EF26D4FF13BE08F60EE970D20E3E4EE3B9506230B12CB44395C421F154B5EC6637DCED2DC0A26851E617BC66774CB347760FDA897F7F6FFE0079BC090D71A581803B0A635BF7 Key = BA332DC89AA47B6376A3EB64706BFA85E849168F1DBD8476A24191560785E9293B71ACAF391261389DCCE973252839C71CC54A01FD40B2E8ECCE12E12DA4194C Nonce = 3CCCAF6C296F9E7BB5CA31DF74EF2B6B In = 192717C9D60F3EF892CB7BCB5BDF933BAEEFA5320F3C9A15BCA141BFB4890A71D6D053E6E725767BD1164B4C1EEED5717F7D4CF7C53825F46D47FCC0969B7B0530AA14E67335AED29EB76C255788B4CBEE64BF842CF6421BEB7939BCB295BBA054E4098EDD7EA418FD3DC43E44012FE3E9E75B50E9DDE48E861167BD4E9EE07F3C0A82ADC722273D62517BCE169A38BCD629F55B15198C1F96438F1451A16BF09628475DB409CB4254BC405E55813C32514516925604258AF4BAB8C1A0F594CDD1E62C35E0614F20D4E5B5A9F481C5717F44F5DADC30 Out = 980B4ECCC42EA4BB4CC6284EFD8BC17B570460D71551CB2B1CFE0D0D0EDF50A068DF0643216F22B03CEF2A588536D76904691F48E4F78652BFBD414361C5CA0AFA504A7AEB4F126C584F737303ACF98DEE0F2D6401E8C83A61A782D40337F171F718E9B48EEE2139C63FA1D6AB3A8755055FE2C5C076052ADACB728B1E8CAF22B5D6E3EEE3BD33D577623B147A24FF5A91FD028A8D99312E3BE2FCB21B0E06560E6348E080064DB5BE9AB79DC67FB33043BC8A3948A19A15B27AF69445AE8FB513B647E93AEC6BD354E4D7FBB30B46264A6F6211D3B9 Key = CAEE3F484BDFDBCD061183E19AFBE6C43749335F852154F51C21A8BFAF0053626E76489C6AEA1D95237C5E2F3A1C28F75888E5D846DACF4ECBD231705326B83E Nonce = 1D7BDA46E7E23C9BFCD5AC55C94FB881 In = B74BFF82ED467D8484C6AE456F319158D9F5EE51157CF0F043F0706B9C1F4E35B0D9366702C731B3F944FF0A3342A965DAA36B1E6C275B91819C2789F4F0D1F4BC62312E9741EAF9D675958D71838ED51BCE0475EC2BFCD7A8B4D9BBFFD31F02FD0728C8590CF8D5FEED6F89657C4BDA9B8B448B4F16FE384BAC312409423B6A53B152B93D1F6BBC33408B4E39388A0BAFDD11B04DA646C9B1986393C493117AF76EB16A5F35FB23081D4932A7AA24CF2C56CC6396981C48B516FB18C8D879DBFC9598369220260922F4EB58A8D8007DDE7FD7B055E169 Out = E86971A770353B87F2120815B3BEC5223EA4D9AD9BDE8CFD0714218E6D341350404F6A488711D274763266F8A493C039D08CB6CF5EE4203D7582C0D07E455524D6AA6046E964163C870F953FA9D26D211BB675B167F5CEABDB4A2988DACA8C59476E3E4A590A41395CEB65DE0EEE1BF6762124CD7C6BAC34BED5D4F690F4537581479A65A04D14B3EE86DC79633D77DAFD989876EBC3F582C929555D2272FA05043540EA7EE35CA58FD05E48EBF071B72CA5E24D14340137A5374C04E6FBD99FDDFB6B14733B2FCC5ADA1680BE91F6D1CBF8D649354036 Key = D004CF57824774DBB801BAA3B099F6256D0BCEF7320723676F38DEC90CE1FC45639195278EE548CBEA6D56899CC633B6BABC72B09462EAB196773ABA46863146 Nonce = 36DBA52A07E615CA79BE663AAB87F313 In = 379819C60503E7FA119E8CD735990055B3D238A6B8CC53F0B41929D12A5509853895869AA17E3806014398E0ACB595D43C6C77FBF6CDE3C34054F0CCCBF6B51BC8B8B8B7B782AD6A79AB319056B4927B3A5F4AB043E6F867246103BB4A3932B22932D44C9D0EA79AEA8D8E6B8A37FD377A080F8ED1C6A0F66CB9D10BFBA773B84C915D859737A68C12B90447296A6D66A234A8C7B6E2B62402F981A0A27DD1F4F5CF43CF8B10A6D7DE8508DB849FE9AA53CFE62D7C0AB503602910F3C973A191D88DB2314759268B5FA449FA518BEC9323618C3682A9F88B Out = E10A1DF9724BCAF9EC82F1EEEF4091D723083D9B67C8E89F0F2C51071E6A824757D1859747ADA011001CEF4B6E5B6A022FC0107FF0CF8688896D857B39AE9F09797846C5C0A6984F584CBDEDA20D6F9CA07884ED134E44E0F7A4359D37655172B5A78253891275FE9CDF5FDB6180A67B71503CB355A0ED2C21EB57C769BCC831E9A4BDF76730A5C77BC952A1E483779FC1893C74E022E03103225A588132841D1FD60AF85BFD086A1DFDC01215BB7E1F2873D3FF2D7E8222D5DC4ED01FBEE99DE93AA2BFAA92F491ECAC46CF3C104F0B138339F54184A45C Key = A3B3A08CCF65BACA8810583644E6F1D205BE1DF2A665C4F40C6C7B062B286089D8759DF98134EAD1904CBBF515C90E84FB3299FBD7E985878D20338B73D920E8 Nonce = 35E1CDED7A119251C8732A89F4DAE846 In = 61F559C5F810A1C8DAE33CE354847049DCD89BDBD3E93AB7CC51E543997C3AAB395A89137754CCF5CFAD4A05EFD30AE6E708D8A0A6FACCADF703F0DDB5147DC4097B967A468280F4F3F3923B4078FC11204FA28EF5CF8D440F329B4498B7C89FA26C6B47FE722F829EF628888DDE04082F0135D52EAC0D688A52B124159AD0156F0411BD76E3D297D49A5D793E3ABBD611EFE007B176EA3E21DDD5BC4114BB0A218ADFD52EBE4CAA83970F7D28D5D2134C1534F56CAF9D0D9F730EF4EECB645A48E606E70E536664F22084CB9CBE0307359FE88A3B90DF04B9 Out = 3BA656F0AF42BB37CCDC8FA77698973C7F9386F450A1FBF5B5D8CB62CFCBBAF5A043D7ED3AEFC4718B39DE52103332C1F9C22FC55AAE332F1106DEF40D86B36B05F1FDD2A8B8D6BA601CF6B5F81E367E7EAB6D12DD1E0B93C8D83F7E8D78A7DA35E584CC97CF47B8EC4B281EB052B06F7BE54799E65E460D6ECF30EECF472D7740DC4B361DC250997FFA4A4241C26200EFC4DEE7E65D67D97F71BBF7B088CD62283AC013AE1AF447D660D3E708266D6C6E8AF60072A0262EEF2459E206FED19AF04D7E2A2D18FC298EBEA0F0FA39322AC8C4DF0B9DBE7687DD Key = AE9040F33914977EC5E0F9C1A1B219C6430B31916B7E79C448E942AC079EAAB2D31DC6F801CC2E97F6514D6D287D89CED938C988F9C140068890F6A35636B72B Nonce = E2F10D2F09A6E83259372B86943D72D7 In = A680ED4AED1665E1126DBEB3A6836169E5D8E26E12C3B4314640577BAA0BD09E892A089069F5F2E40897C9740B9316D79D550AE5EA9F82ADD1A4A9CB498671F771EBF6925175631E2A3A5930716E3153078998F457D38928B6C1ABCB75FF5D487E90435F8DFC567BC51BC86FC91B2F0F5743A547B1A7C98AC62AF3BBCD95EF054EBA38C03AF753F05FAA915C9A67BF1EAF64A67D8462E05A03793D2244892D0F68074324490E5C497906742B76279426BCA93CB8D15627F99471BD157147DBBF61093BBCB3916BF56DA36591E56DC16430AEEB7C1B1BE7ACD0D0 Out = D76864251D5CC12CA7CFC7365208F8024DED293D0C8FE964E6604F0889F5105F7962E254B733D8AFAAB8A52F7D7ADE7FF3CE3B403E0804A79C980062F1E7F88E1BE12F1AE2E424A6939C738022CA6307120A5AF914FC29697D2218252C7E90C114B0B8E72F6081CD74721DD52139212F4F8FBDAFFA05CF609F00DBAB8C32E29C4D25A16977301DFA985078A3BCE695D27470F5F228485FCC5C71D6F1DD6E6B355CC3795894C934D64A56AA540DA4CF21AD9E73989F627F8C3434BFC4BDE9A8C860760626A8C9ADB297BA9A71D6253D3126E58ABD8290F4F1F0E3 Key = 0B6D997F3908FE53060897B727679FDE48AC86B29F1BDA9CE993C197648940C0FFA81A3C669305B008A44E221458937E4428CD4A8F18D1AF50CAA9628BC410C5 Nonce = 14DF452EDCE5ECE3A37251FC7256C7A1 In = CAA8B0BB70CF71434B46AA9F5CB4FC8A10AD9AFA4DB9F97BEEC80F8F4927EBD169F7781598AE0F3FCF06D15A129D3537B2A2C287BFB45B92A62F15482F0D0798CA3EA908E1B9C4DC5644EEAD5D3B855EEE6B39CA6FFC50C6A0F29ADE83316D5AAA2EC52D8672F6A01007D436B1CEB47FA9CF4FDD3F2628FAD378C10B703B3C874B665FAAD28D32F8AE618DB40041404420765C0700D6C99F6E33C5A500A25D717F04514EAF8819C3CBF811720F43B4705C77BD0A621C5E41763942C980EC09D929BCFDB2E53DA1C8960FA01320F54024110C4F237977110B3751A1 Out = E8732913AE17B4444441A0A15E22BBE04889F49CF09864B05DF367A26496E6FE2583AF287729359F7520FBE83DF2A146D8A3C630E8E374ECCE099B162C41CB6434A0B36187A6309CC9F1A10ABBFA90AFA82FFB934999D911FDC573E3FC65C6AD3651E4EE7B2FBB46BCACA8C71C6793C45A570A15AA9149EF067DE0E9EF6195B95593CC92307FC487B905B8370AF25DC64815D1226916476509D90CCBD50104DCC905ACC2DDD9401A35999234C0E8711852668B5CB6535C4C357D4883168B23FB6611AA80B075EDD633351A0623EFF59B477BD4E354BC79CE817616 Key = 160F863CEFB8B8FBA180A59860B0C8BF1DEBC4C40F06A40D6864E8B0C42588CD43B96AF941AB74256787959210F7A656A9C427C463CD3084414E13D6EB4D7D63 Nonce = 7C5FA02FE028C04C64F4AB057CC52836 In = 16AC7772715E633D8BDB7FAC8EDA6EE9C9B05B1378B0E44A6B34A47DA8D1611F97203FEC682CE354E265B23D721BA46CE012AA0BEA53981B46F08CEFA3715D472D82F28F73ACCA404A5B27BE788058DEEE90A74AA2F817170A9D89DE03BB89BC71BAF6B051262B42DFCC76B464A28655F20ED070976C95D359BDA68BB84482C72BC1B102E20F3E33B6ADA1535FD7E9CC7CC5A66B8561A980129F6968A9EE7A8C5705784E19E280938FF6E3E8270EC29111CCE3066687640722CB55B1F6CE22E50432EAD7400EC0422FB37851CFB42972A4AB635844AEE2F343495984 Out = 7AEC70526B029B01A975026C991F4184A88E516909837467AEE2478DCA90976125982AE3B1A31E4E756B13991BA08EFCA1CCB7B869E39667FEB9026F2DCEA8A181C0B41842899D61B89582734058D5FAEDB836150A6956EA4A0CED81F2B70F55A7F54505F384E060E302F537B18BC42CA8CC7227F8A309024E2008D372ADB2FADA174E54CC83BA89DCBCEE139EB64ECE945F60FEDFF01388EC1CDF1052373F2675B634352B036CDC8A347214618663BEA4382A7F5AE388E750D2B5350F386A8FCF953C52EF83E1FD227600F87ADE3C0C3AB3C0F4236CDD7BCEA9E530 Key = 181BFEC5A5EEB02ADD9EED07B2DE698322A41442D7329C1ECE634E1271A4C00674B7B1FDB0F426EFCCF79ECB3A1D0F98F6C5E3FBAE81D2E16076931401F0BA89 Nonce = E386052F007FDC354E8212BF84E4EB7C In = 8140557DB2CB5053ECF29487BD5FEC3C1C6C4576B402CBC7AF1478AEFF83247D9E38F8E59280123062C36DC1594E6AB207236595FA82E229E41FC758A0BFD798F2E17CB3A31290A55301D11954D217DDD1362AF04CA93116FAD7A0F21883ED622621826DDF7CDF21144C8EA736B6AFC2209412E5C8AE382E4A35E85612C41C10E767590074E990221F60D945779FE6220FE83C87B00AD1FB459974039D22D39805E538CCA7A9E08309EBC6207BB18FFCB388042E3E0DFF69D2F767E0F11FE4E408147E61CF31C529A9CCF676E62153FCE538B648A9B6CD21E3892CD89A Out = 66ACD530764CFA33CCF68F294BBD6CD7104DA5D5F439E147B61D893404763F165EF6B059A9CB66A47CB7E754E3F1AF7EC3B956DEB4FDC46699B32BF6B3B3316E82568C3EA798818035B737465EF2F059C5D2E25BEA585746BF9D4AFE0EF244FB6366184CE666B0FE4398D5A1455BEE43008263B890A51959F9222E0D81847DFA4CB51CB1C7A453D04A71813BA24714C8D5C5BE482BC860BD361A7AEE20FE274C9C05FD20277E9FD4A828E3DA87094EB2DA18695D1E1082B88DCD8283A3EAA53C7B35776003C3F6284E52F9D0849F83E3B66A86AD702C656C70EAEDC102 Key = 85155B51760E67721FDC7A6737BAD458D51848B33B2D9F4ACCBD561CA3C85A1D4847F3C5C2722D2D384A00834E0194F0B6E53CB8ABE16B6DC1F7FB19C4316B7A Nonce = 950BB6D39A0BD2EA8245541D8AE76E90 In = 1F36C3632270557285DB127EBBC1A2BAC63067C1865F16A7D0ECE4292016C0B1A141F8F5FCC451EE7FE4DD8C405302A4955442233070C6D1E6152753C2C5D87A962646F02DF695DBE5547C13012879134F4F97D15CD495C2AB1C59892639D823F4C3CF9B82ECF81D6371F7E9BCB25555FF994BAFD9A041FC5C98051B9A29563B3FAA848A8CAC0EFBCE8A0ADDDAAEBCD00D07C0F3864AE658E5063743E6B8675CEC907BF25DF9A55A571C56DA278F04B0DCFC56ED6A3083F7918E0CFA0FE29B3170D5B45A881BD9CDF7BA08CFE67D600D432ADB4A00A47D3B35D5374413F1 Out = 380CCA842C11F5732967379CA69362B2DCF4E27F7E5223AA6FDC6530BC195E6D355C72BC75D40CA2495788137A2513FEDC520AE3373EF14BF0B7EB17DD911A56F8F7422FEB2233AD6CCBEAC941431FA23DB14FB487821DF2B8D94AE80E4C88DFBC95FDF31E0CBB6EF7E284188CEFE49FD8A035562CA775A5E00C7991D47B3BD9F3CD19B7FDEE6D1BD4F2BAAF2F81980DFA75C46A26E0EB9BDD8B35D8E01F5CC0119153F5B223F2B69630D9CF20EB9F5D2854CC25A513F4CFAF40B9EB87690D6DE65D247615C33D42BDD242015E96940264582DA80388E4803DD706B7D271 Key = 482E227371436B679E1FD990940D9E773AB17BE1AAF461CC0CF9EF49322B3191FE24C116F4617697F0ECA8B3072B01745515C6A724866EE505AAF1A90FE964F2 Nonce = E02F01E558E161A08D163B9277476AF8 In = FA94A224D5431A48BAD45B7E25A556D77F8DF405AA2D970C5C2914EE7BDCC9942E0ED75FDE601E5ED0216FA1C3B2DAA8649CF3E5B9AD73E872D2072E6711AF46A00A868A87008EBD2F3A289F351DAC9CB6FF9418B7CE9D93784EC29A18353BB6F4C7DC8F26842A60FBC2C567B58B66A95F25EBEC4C440CEAB05D8F0959DF2A04F54E5CCB346E831EDCD392FE864FF877FCF2961167DDBEF56DE94CD422B85E6B8B92E5AB4E777CD31A9F408634BC787558F17BA279C286F444344927C2E1ACDC9B2AFC414AA1BC8FF1AD26C544C146E115F6C243EA76835A4B6BB422AB901B Out = E384915C1DE4C2B1D116107B23B31B2C137574EAB3D78C5E76080050549507D8CF22252E0872D94E421F592ED3B5CC13C1BBD76826A6EED30172605517A57EF403398757B6DF5795311C732B95C74CDE82FB9A0305B0941EC5077028929D82A29EB3AFB722A63C1EFE599D21E09C08CC20525A9A9A071063184DBD32288BE7728FB924F49AEC43BBF230D34257C7FFCE1279F467A915B94DF4CD2C0B6FC27B371FEAE033F7AB5E0887809EBCBCE4A50F29008A22B2817E73381B4E125C2B96495FE3B880A9CE4B8C20279A8CF82FA6A315D76E8A1EBC2CB39ED060F7F2B136 Key = 253EFE776BDF1E56DE7DD6D048E9771222EE4D4083F8F8A0DE293CC84EC7037B89DB568F89C9B2AD5009CF7F1B709194D87B7FB618397209212123FCD318CA8F Nonce = 5B26213DDF1761F242D5AE3C8CDBE989 In = ECDBB7F858500B166D01586266EE6AE5C8207477E2C27FD2F502033ABC58E8671D86766C01D297C6C061B5AC6AA14A0990C778E875C04B054FD59232845C5FD67F3B5261D03CC233B8562FF11220D5BF5DD3328C9957017B9927014766F0DCD1B359210EA77274CE80DF9046334F57E7DEFB02F90E75639C066E5390433A7A22386095A7BBCE0D62AB31F8C6A186FEACC324C7F930E9EAC78B32FDC7B9D26513976F5A78374621F5114296F930D8E6C90AC37FAE57FB9A0511C61A2F911EF63B6A2E9176DDD4C28CB091B7DE62DF087CAAD205A39CC20C04629A552C9CB4BFD9 Out = 796B4E7F0D1C7551BB924AB3298C2C5D6F1530B717292D0C71CB9E54A2814FAA67B679DB8575759C3F55CCA617DE84D49126AB3B3E240B5B64CE621533FD6546C7F166E651166FAF2E8B6640AA804C37A5BC9E6146FBDFB46DCABADFB94DEECCD0600BFC710BAC5D66E91D1E748F58E32F2CE99EEE10125B49C6657C80FA6ECB20DE78EB3948D3EDEAB3146BB7D6BF4B8728CDDF6D9719917261FB36361FE5F88448F94C64A793CAF45863009392C37F5F768FD4253F90F69D574F7C69F1BA59088B03AB7EA5BBDA213771392426307D330BC11711C10A3CCD0D9297747A594C Key = 50CC4D5ED53034A1C722EE0D23410474C6C0F991901EC4A12E78FDE91832CFA3A4183FB0E2C62A54DAA3A1EF4574265F4E816392DD0F1A2F3C7F388FE3C9BC8E Nonce = AA628CC121EE8DFE2E6332002E69F0F8 In = 18108F38311BDD38A8D45ADECB6A6F262460E0222009596FB1B3D5C0E997E7A18F358279A3825394378AF3C30F560E5188E2D346E9F2DF80BD8D2EE226BE572A3BDF9451CD43632B442B732DBBD96C330C0D3919CD0A89ED4B693B81114C962AE0E50D778E04270942CCB33DA65DAF0D82485442F655DD711DCC948DE92109ECDC09A4719A7BB0D25A61104804F4096DDC5ECB538CE47A0B6C636C5D95F30C9049F0A8E8198781F41774383AF16668E13C481D003433138BA1AD8CF0BB99938561D6EE0E5D0B012AE7A0A2C1A1D128025C49B2140943253D9A0BD4AED8AFC649AD Out = 5DAEA1C8171663763DA9B98D8A63251DAA97DAAB89A1BA12ECD6787D7D7BACBFD7CA47394C6D71F60B6FA0CE44B9EBA881748A6DA93F6028F38B35CFAF33E94983A5138850137E8726624096D02CAACDBD18B58DF5499E7FCEF4C850037F369EDD4EFF4739A0D4049AFBCEF77CE2848162891ABF3AB41CCAEE87344B127A1FACE935B5F830637968CC9A4A5F22156E5E460509D226EC8B2BEF94A7336D4E74D0D6412603B116C66B4AEBD1F4656EB6DFE9E86C959E41CAA9172BD97909A4CE70002A750B5AFD67ADD71645F8B3C661841299D251000C602CDE4B17721F145FF7FC Key = 96BF32F1EE668ED7BEF2F5EED2F8C5E10805A2B34D3DC2146774FB332ACBECAD9CF93AB6A7F0EF8F4291D2403ECC3BA540D22B5D4D1062A992DB75BC0B7B707A Nonce = DB8C10D2A7EB31779FA98666E65EF519 In = 4EF285246ECF7558058F30980D58869DECB535EDDAF68D41508B783B6CB126ECA86CA166DA47BF58CC4A91EE66C0233222B1DC056F9DF57A217815DDDF7708719C22F967D76D0590075A730444550A822011608C230AA24792071C9829D62D8CFE0B5FE3904C9EA6E93C232E45BDD60D72A78563B77FC8DE9F106571E0014E34BE98A355F78A2849EED7EC6FC2BF9722544ECE20A7676D618F8AB71B9A73D929AB1A3BE14BA6DE347A4BB534DBE7F580C06583E2D660528EDE539B79F276BA210A60AAB26E1DB8C1B293C9C733F0855663DD6920940A2B12B5FC4A306E19738001F1 Out = F38ED44ED334177C347E6E47470F4E71E6B1C3552B3BE9EC9B1E27CF859B9416768B91B7C5E98F2AAA16D3254835780AF653CC527B4035D91A4B28634AEEFDF8000B959E5932AEBC5A8B74277F2AF492EA9BC33ECC7F1F2EAD89E0595CC25E771684F9DABDECD077189D409DD798625E22E371593B36368F31BD50F197A920B38EAFDA357155B881720E47203323BADE95F2B57BD703108BA228D50A80455768361341C6612CCB1FF325EFF496033020BE489975B1C911620792B47EEF9B1E9BF51F566C42B291EAEAE4383373D78F1C4BF8BC2AAFF33116A92A820DE320B4DF8FFC Key = 1AF15A49557AEB8D9B5DB578813FEF2B90F20A0C44A42F3AC11B71ED9F047921401D4176A3DA1DC0C5833FB45977610B23C2D37A32A5A9778108976D63EFAAB0 Nonce = 13042090CEC102EE1BA82EF07D3CC690 In = 2BC7BCD80E91DA825583E394958609BE769537543CA8B44A9199D42EFD39DE592C8583BE50F78FFB49C726AE2ECF7664C776C8CF4EA70DB99198CC7F7DA043EE9A8D618C8CB7F5EDB6567093BF00D01F146601968E9FA98390FFFAFB4FB2E17D9E85742E9C77CE27E82B09210EA5E5EED3FE3A6DBAF2076110BB172F97604F05FB8F52520A2689E5BBF10760D3E9C217E739B9A3E6ECE7C195862885549C2BC3192BB07098BBC46623D46578FE0362134AECDD372375531AF491CE3BCAF286F9D91A82606B7DD661BCF5C558C2C06FEEB4A48FC71A1DC8DCE92F77DC4F9477F417AE04 Out = 26B0C5765CBD8D5BFE0BB2055CAC54D5261DB310F7F01BFF24C761E91287D6DD6FE65BA5D2F46387AD338649920CA90EE40C139EB9B05BB77FA429CE90661C4EBFF753FFB0CF9C6B81F2D0FDA2077AEA5706A3698D7140714604EEEFA195EE4253F47080A4549CC560CD4ABC46DC1B589CC6ABC1505122CCEDA993AB59F2642FD9D5EBEA41AF5E8AE395DE3F77239BCB9569C3E311330CF797717AEC89B272A71248E2865C927DCCD98D9FEDEDB8F872682DF41935BB1E5FA56797546D325BEEACFC2D73BD39771404AD4654F2D91652B266C8C2168AB1C85ADBB2EBFBBB782C300DF4 Key = 381BE60317EF66B0087CEA6B553D2E553439D2DEEBAFA29E9316643E7BC5982909B2E9EEA08604C754F143152B3505818CEDB529C080573178BE803E1FAE19B6 Nonce = 8402587F5878EE9FB251B8FBB111A3C5 In = A09419A9CF48D3871D948FD40083168F7E9F51CEF2DF928E9B2CEDD7DE29F4D922182833EA7531D3CA8A4ED277A0D8A0DE1E9ABEDE595DC69867EBB006E74A022356C76CA508B8BE54E3E2F4E765998B8495F715B03D6C6F304E5D8EC64982ABE34FCCF4E36FA43438803018A6BCC9EF880090F080D53C5011A4F6B0264D8335124158EE84E861049B2A031BB4231CE1EA230C714FFE6BCB048013E02B8D84BC5E35C5D6E59014E13FE6A03CC3543CF028417CAB8A629B237BD1FA8C5F4C474FB4B13FB72EFF570D01157D091DA1F4F24CA96CF36F54BB781FEAF070348400F552E73A98 Out = DEB151765020FFB77E29EC9290AE63AE66C4A37FCF3825AC28388F5FEDC044E0F2CB176C39F57938A617A94181F4E10690C78196DC1E2918A6E093F5D65E70C48C10EFBCB3D2A452C7C7A7D1B36FFBBDAA93B82E8D4EAB3B996FD7BB65D0667D4D4B3E64626A0B37C34138BF4F7A6E29F03FE59AFAD5C9953D47EC64E9D34C17E73506DD2424555B4C8120621A4A178B6C6EE6A414207FBEF6A6E24543E0D351B710D579006CE3067CF9E2C95974D78FED31512D8571BF6134BE53EF1B363CF6AE3C3695F34D17FB9161D36821D7E60B9E0BD2753C4BB237E97AE049C89A6E13B9F98666 Key = 48CFC4A5ADF7E823291C54106FCB6F2DA50E24D2E184A5CBBD1C8B804C145C7A9511EB31DCEA69AE3473C216D34975814357E1BC5D9D59DBA0E2F147AE008252 Nonce = 61775FB9236455F8049283939B1C8E8B In = 4CD0FC4FD0BA641A58D4D96AAA3F3A46E9B2273DB3277476BC9BCB67FBE9CCDA01171F84FC1911F225DF5E1C147CF988A12F33204E7BA6AAF8CE2FEA57B0730DDEB851A1A36C3CEFFFE7921041F9AFC6CCC7B9B08027CCB98621FAB24E059C558202118AA45B06C4D7440A4D075BE4E4440ED3E9B69A8351FCC89023B5679A026624F8F55376366C5111835E120FD7C099661E641D0311A1796711A3EA8AC9F8102C2BD2F99273E4F847D626DB20666F7CC0B32B1A86023CA5A8B053C789346F8C6A0615998B47EBD791FB944F9AB8CCD7C72B40F905C36E0EA55D5E5AA560CD64978B8A75 Out = 244079996958DAA3CAD92FE9683C17E7F22FE198C9B481F9229C4FF5756CBDB4547049A9985F23A41BACD8DC84A93F29B8E34F8C4922C8E9640C52187BF817B8B0300A9B291C648B41C246575ACC7C06A00E50AF824C12F3D2DE06451F5086768EA14B87876DB103461B3DD6AF9E3B0B770CA3832D877EC73F567E7A42CE191ADCF40FE08EB36F6A5DA0790AF6C0107BADF67711CA89FD0A2A45C8FBA6F7DDDF260DEF3E180330C7BCD1FA5C1BF6210202A323B37883F08546D86E301B1A9CB2BB91DE40F82CA568FF0B6D6EC58D7F64B412D1B8A798DA3FDB2DB05BDABC4AEFB9F34A3A5E Key = 8060B5563128C045386FFE9BF1F8B18B7E5F71984F6F0FCF4C109DFC03892AC3043AA49059537B827D9EE51109BBC908034A96325A0FD1FB3A8B32858A5829F2 Nonce = AE91B76A65DD2FF40596DDCDAD8789D0 In = 55052169AE5F934D73482F5B59807A8DC15F49BEBC828A6FF72568AC4FAE7A2385D82CE7A46C930FA7A74E6C2FA3B247EB6F59D15339A473E5F4094E1F65C88415CD3AD1ED1D611F99AA23F9EBA8642B90963A8F5167CBF1055D16A7AE39B08B45E1EC30399A35CAC888A9011848B6C8ED8CA5D87C2FCAD1B20872750FD8B186CBF80414971901AA919263367CAF80797B654F40AC309B4AA5668EAA4642F6FE679AE887876BD0E1107DAFA42126C10DE61987627107534056E8F5A6C543C259BD0904694A64445FDF88D7837E3E91051CE92C2E2EF38275BAECE50BF214B301F2D9DED63913 Out = 27E6D1787E4102D242BD2B5DCA9516EF931ED80B720D7A01E71AF88A276026C19538F51A3D3ADE757C814B85115072DE490C08516B2B5BEF6AC7EF47B79041836DF14EE11A11444F3303CD718E0CA65257F0AD0C45C7B35CBA0607C0F63DA6BD98D252A0CC78C55EA980FF7A65E821FE00919C0B4F7D297C1E684DD968F0E7F8A183FC84D43AACDDE017CCCF4C49709951D6124D32CC3935B849A139028825B05BA1B553C63F4FF85FA62B563B753A698731D6F8880BDAC123C191191C3E193F85A6B59F3DA6C56E7DF39CEA9C0BE78A4A1D0E68F5D58A0767509901707D104A35456C90909D Key = 169F3871F147E7BC5BBB2E1C8810808CD973CFEA0F7C3A126D7AA0A8514C53C2B690C4FA06E0D4205F1F556C839897939022DB739CF925E16C39871DFF8D06FA Nonce = B737D737EBE47D113625DF138D1FE2F7 In = 5D9F5ED753DF247B6E568117C89ACAAD756BF8999F3294D48B7380B4C650BF7DCD694040A10B59648BA11437173F22733F89B12C520CAE574633C031487D4CEB5E6BC8E61ED9F0DA492F2CA8544228416E316CE339814FBAAFF881450DC9A93FE44A2E90B678EDA786145E7477FCBE9822FB2E74195ABC8A5A7F04DB47AE1EE4697903F59B71B6E586B6DEB0F4794B1A2310CA07F631679FE6E67783FA3C93F12530D1EBAB62A84A52018D2AD55DB241024DAED00A43A004EB8672E48152B69AFFF9ADAFFA465403ABA06C3E8A791CDC6D7B139C1E9CDFAE22DAD694F8CB31D517D7F0C575A32A Out = 8FFA678847702BD5D009A51E099D85620F8C0B6D0312614E0D926EA9B3200E82055E01624094316FD2CA3A8D6F98D44343E4615AF7561423FE4864C21F82D8944402CBFC90C0862468A866934A8A983BA7A102E5A1A8D0FC76452A09643C76B3BD99A485953F10A69C9845B61467C583C5384EC885215215CB9A065D97EE4764A293F73E57965E876DCB9094C171F06509A54E4E801FA0ADAB0E071FF0B8540088A2B4C684B9271F70FA1DBFD6B7D4B81EF0B9C8059461BF4943AE59CEEE993CE2653A032F977E1DCAC936843A2F59EFC32265269D43C38C6A4004219415E60CFDF67943919D00 Key = 4B9C1FB18B46A36BCC2DFF9D5CB81542074BB24EB490B5080432C2BA095DCA220E6C52C6C29A010BD4E40420206BDC69B046B28A625937D07A44E21AD15D4CEA Nonce = 262476E43FAF79B40E3D790E10BF3973 In = 993EC67AE7851538B136277E21A1F8433633345E118CAE117B45E27BB7559FC0448F80FD61DAA0290F1090AF0DBE6E58687370619A1BF5234D47A298DF0DA5462D38DA33AF5C8C6ABB37E07498E23A0390CBF37415162116A792B8530C421AFA9AD4251A0101671B9F07D3DCD262EF2EDB00D7EE28BF82E4201E1854447B2ABCC20B2EFBE26D3F7D35B73C64E33C6EC4B3E8C7FA6A815807673BB68F30D65EC14205759A40AAA6962AF4FCECA6583293A5FE70D9EA1F2743338DA5C5BE1391405F30E025A1C3643BFB6ABAB4038F49015451BEC6E81FEFE7EBA8F0B4E370B7502A769936F481F479 Out = 33DA912E04453CFB58670E977FEB3488F386AB55BA973C8E47039322E5382F3F9C3677F648394C556E1465F825ADAE200C1899B5EFF523D58B69899434E5B519F26F98F93045DDA82046C036867BC86D66B2D4CCBB04D6F752749B308C22D4B769E5226DBF697EF7F9ADA1E5D665E65801927A7DC2D0B2D1940E4AD2CE976B676C8604C12EACE3B76A321F3DBD2425D0CB08C99408897E20C6D6AC61A0CA1A0B0948F4C5B8D3E24F0303D7CF48916EF9C43A53DF40C5F54604B6985F4E8375A32E0CDDDD7A2E7D78777FD6FEB97549A2413EC5AC36F2A917F1B04074FEE84A5A949ACB47E54D4893 Key = B1F48DBE3C678DF01D16CAA8CC06C9F4213696380BD3469F4265AA9AB7FDC043FC892170194D950D9AB3AEAC508836A07CDB6FB29D9CC4A2FD23267C515A63CC Nonce = BE33C0927A2D2567EEA9F7D67076A422 In = A98C8CA7ABBEDCF0BD82FF89DBB9DB52E9AF07BDA7252054A74C2965750002AA888EDE7206B9A8DD9A108F2365A22A80559A44D76A16DC4A7B969DB37BE3C4EF831390B804B6937EB17ECA53A6CA6CA719D43407787AAA8C71A0D349BE3D1EC38B1EFDF316F1B4512E0EC7A24DB1D8EDAD448AD992DC5FF7F4D31109F9A33F64C0EDF32D593C8248CEC38D79C8380684B96F569042343BB82B7098A235C16D5DF57617EC73BDE4C5560F1D04B9E692181CB93E3DA0F2872F0F840614FEB674A14442025C388BCAA44427AD53E15826BB1744608CF830E97558CCF37B250F338DC7BED023AE477BDB9F Out = 9BD1ECD532B5AEFB432B0F9BAC55FBBD2647FB137ACF078075AB31FBA1C46A9D0D332EFEA8DC0D922A8AF2FE8049F8E5067AE8CCAC005540FBED877C17DA499839BA46CEE821DCAF37F653C7BDBB6F2671D90C26791C047912B7EEB60D7D6935279C3F8B009F9642BD6F7015F29BAFB70219E95C4A2EDB98C31687ED7E5306AB88666275BBBADBBC94B19ED669F2B5D5143C6EA4138994701FAF8D374B198047EB39F9246CC0E14289C7AC1CB9EB0C51C7FA8C07B059DF58DD000635F0D02169D5E31930E140A87859727279228A95A3E2D467E435FB58C1721B1AB7D0B3F195C809F12A62200748C1 Key = BF85279B54CDB86BE5DC5E562CFEFE23CDA399B5A5D26A880CF2308172EB4937B4661707EB476657C973431ACEB8DCE28B5E005FCCC660DEAE965F704E2805D7 Nonce = 486DC46B6F20C779D9C02275B16FCCD6 In = 8E370EA6ADF9A27086C9859A2E75DAD2586B4977C28B5AD3925F577C7EFEF51B313C7B9BDCB9B35369A549C984B935CFE174351A326F3982DF4389A8902E6178D5229C532FC9FF3B1CC299B94A5BF984CDA03F091852FAD110BBE2E7FF8E0299B00F8C1336D41F8BE5086A49DF939E9C7B9E534D1475516613339807BBDD9DCEB3118CAB26A430FF17961D629D7E2C4666F325E27FAA8CFA8040CF26CF2E2BFD20731D9EC2A688ACA526FFC4307157C24FE3A02C219BC0647462DF122EE8D8BC475AAD7FEA7072F54F23B3FA8EABE745E5B097061E1C6299D8300DE1620CCE10829A07533629FC92ACFF Out = F96E6FE4234FE39D56EE70D9BAB8C3B6F0A81774BD28A0A47505A00DA8037CE32E8B9DEE085416956F5BE415B2CE8BC6DA0E55A5E5C6F4A2D7CD2F2FC33DAAF206436760B525C85F166C802DC2B7CACA85706841E8F5EFB3D3DE198848B5C8F06D64812EB0EAFF4AD075F30DEA94F3EE967347688E921314D1B764457258B3D77D2F05F65DEB4415C49654C21C4562218D89009C4C0D9254FD92035406210EE87BA46418F16EA3971798A2FFB082774A20EA4301680D564DFF359301524B365F3C5DCEB853826B6FE14C59AE00AE5CC1C3AB43A79225185F40297364A2CA23EB129B8ED646B942C9466F Key = 5B9F108E5237283F7604755A66C7039707A4F9684E2338CB7D6A482AFE2C973176A677F96070F3EE33B8D8D998FDA5F069DB484100203A12CD391A22BD8F7B29 Nonce = A5A790C40965B84AB067FA5922009E07 In = B68CEA817ADD6ACB9CD5208C1941E3C9EEA46B65F7BAC167F8FC4B64DB363723D32D1DAAF4B343BD0B081ABE7136DA05ADC200F5F0FB8B9D9FA9A3AA7AC15058F876D5D7069C4583F9344BCDBE0FDCF3FDAE7D8A20DB53DB673F20C65EDD538416B9771B44FF03AC20C124DEB8B4D1796F2AB82C0E26CB7365668611BD3E2727719480C6CBCC8E63165BFDAE741E638E90748F430510682510D9D870F9DF53257FA11EE28FE2DBED7EF11487D63ADDC2BA5745DE37588D9CF8F76CEB02F08B77F7E4E960C3668688BE14ECC02E01C43AA6B086B97B081FC4D60BD5CEE15CCFC828CC90D595A80B5F373EFD Out = 468BB4682456362038E3FAE16208E6AE39DA3488F9109B1ECE0F66AD7434B95C3D6384FF8D5DA7FA7A1D1CA0B1E064A027FF8214B5832723AF8D18C74FADE5310B1FF85D751372D660921E9766770384106F992A68AC8BF3C9EBF92B39069AEB3F39C825FAE33B16A98491F8BF1C667F98FE874D64F38CDA952C43B6932C4129C5A862BBC5EB0CE594E4FBC24438CF9576FC101C92FC859E6CC002304DB21EF0FBBA8A5F411EE7B71E1754710A93A6B630DA5F4ECD176A7FE5911DDFFFDC14E9547857F981B0F7CF806AE14E5AF70C672EB6488FDB9B23A469E6D5D8B75F260613E20B1EE4139336C61D8A Key = E67C49419F1D5222C82277968F4779384D5E14BCBA0D82E2CA08C890396982606877BBBED4910D4F528D8F88292A536ABB9A22C4DB0B1B83F39D378926E65C16 Nonce = 39EB8A50A2F50973CD9CC50F40EC7BD1 In = 4FB59B1ED90C36CD0C28F2F0D279BB9D5E5D94A6DA04AF685486F390512E2019B52D7A9071189802E4FFA2CA4E296326522550946D732A257931E26E36BFD41A004C7F97BB5EC4EFD784B99B867A2F844B46BAF818C1E037C69211B582B50BE23144649A634AB38990C661ACB406D64555F14BEB519FCC3DC6BF8AA73185FF055A492B352D132FE7C78C03E24AC8B79192EF4CD66CAC6B016D4BF93A7A6CD4C60874668923ECAA457777EA1E54A6E98468D38249311F0851DCC4E19C9DF27104960A7EF0201C275C3C655253A7A2EC6EA6646A3B902B5DDD8777DFF198CF53B7DBC5C6C829D124E037B2EEB9 Out = 91FEAF2306AE92DF99A5D413C986D7D06B45B2EA0E8E8553F4E7D04033B9686CC92E6973D9879D2CA91298ED62658A0065373E8CA3866E8247CE35211531FCE16DBAD3BEAE1F7ECBD12DB50CD7A0FFD71EAF4D78B49D195152CC3554D7B0FE8ED823EFCF8D50B04AC29A693545ECD0E28C9A86DD0792C28DB180AA49457255D96BF52366F9B7F8795C621115BB279A41C0BA8717F78E1D435CB95318E3D5135C9547C282A1B6EFB3E45A7ED6FC4188AD287AF31A1A7E0A5575E6629DCD887FC1A4588FCD72A3F0B583F54F4E2D935BC2B9AD2416054788C66FF9C26722DC2AC357D1FD5FFE8E0F62232D5979 Key = 4C6A5C8B9AABBBBAAF5CFD10B6AC195305658BDAB4004C1A2CC18C885BC9F2ABD48760202A127337E407AEBAC65E034CA296514EE608EA316EFABA9FF200E7F4 Nonce = F46B3C066EDA800E22901E58AFF9342B In = 9B0A6E6FA2F5E85790DD8FE601DF3FBC730594CB17F3C316121247D4FDA4BF3A9BDDA606FC1C51677889C06BCC2DD0C62DF691DE07286C4F8ADC3F4A3C3484EB781791A674DEF2AEAF1F16E0610976464F604FD39041F9F09BD8DA76C83372ED74BA6FD68970BC4852AE4DCB36DE5B332247091292F5F30CE7082DD5BEF7832C24A4383FB8393E621FD236E0FD4AC6A6EEFC4D8BE56119EC1B9A1A5957BC2B864472FCB49DF058D11214AB5D2D36E725D3723C98387F3843252F57E5C0B310052BE2F4717A36906BBC488F55CCB2579DFDF30196F9E8E76E71FD945EC72FCD95BFF63B1C849FDC9ABB19D35F98 Out = 33173B3AED526C3591DFE6E7B745958C09CD37F7AD339CA4297EADA1C0D051825919AF11A19D5ACE70D2E11847EF986464FFC76A7D990B44043491D36AB79F2D96592B737CBB6E616AF7CBF7ABAEBFC802E275F211F3DBF2BEDBA6F4032F358BF57471C0DADD4FDE43E79E43651CBB7AC1B569BB39A806C95DFD06917FA9D204BED020CB0552F7397C3C367C33CB48402E64960FF0BDB1D136D93F35C86019E75899F6B1225A6710307D746B4D1FB785140E54C41C762CD096ACF58ED4E067749F6023A5D7DBA91DDDD2838089BD65EE101A9CB598C265517E2DEFA2FE037D8080C0CDC07E491EC4F2268C352D Key = B1D9AADD09F509BC9BFF419E371C734CAFE36CEB562D52316E0C654BE2725393842A35BDC455F5D21B39109078348713E3D085D9164D036FF61711549EB75DDA Nonce = C4E3E7806417443BEF2BAA322442D914 In = F118B740E9FEC223D34AE72DDD8716234352DBD6EB95CE9B85A00DCC2B4EB4A3B20462DC2BBBC7B04431F1AB72CE140F939AA3C11B32EA01E148497FA2F9D760A87212918C3995102505618FFBFD5262310E8CA6EEE4BD0FB86B1A2FE02DB35279ED8A4739F6F396F57027464F71EAFEF1E1B0D63EE4B5B79DE6BFC008E77FE5EB588F803CE241B30BD48B06743E8D980858530B9922C59A5216EE13932C60EB20CECFABB3185642F19F67265CCBDD85539FE4908EDDD654C45F7EB3ECAACBCA9AC1F31BF0E31DC452DBC7EF40CA019CA2B21ECD26ED22185722A6E026485998BA653617E34A9DA2E7C1687222E6 Out = 7396FD2E8123BAC09944100181773B6FBDC073F42D2CAD9B62E6C548645F06C09A501978DE9040AFB4D07077EB937F132B033F46EE9B6FEBB5521DEE7F068DFC5AD3E07655E10041251021F73039CCDDF6BD803D439DBFCC28F9BE26FF3BB17258FDD5A4BFA3838741DDC93F3C880973BDCEBBF0DB7213AD378303EFF4E0F453338E1B316A03F0D5F3758B1028E3BCF7DA00264DC2BAC3C01DC9CD2B05B2298E2DD4A701A0345C096ADA401C28C54095185CA95C7C8572E92AA2B1D9523396E9C0ABF49E2A99A64D27896708604C57698824C491ED3FDD5A3ECFF465AC9B33C15AF5171B12F5A69C2FC81F17541F Key = 442E1B62331D606EF0AA5CBFAB72538FF3A780E0F1C937FF74DC55486704FFBFE16E93A4A8D9F4F0904270485398DC9FCAC96D165435DC5E06CC9CF7F4920CD9 Nonce = 02F7BA33BB45EB68B442C12B791B7185 In = BAFF8BAD4027EE53B929B20A53DC09F593550E56BA260C95378819539279737C1BB23613187BD077C4AB661AD688AB6D13FB6B6AA7D260B2B6B98D549A75BE38D67FA934AD3CCC92BD87D86901DC475B9FB88833A5083172DBFEDA681FFEFC28638E31C7F168D2278B75460A8F777718DD22A992731417879FCC33A0D11EBF3E4D3FB426C053D647D4290AE61A0FC219FBC5E4D5EE0BD417EF425B2FFC2F3749A7EEC397F4D1869F7207FDD33018684ED194C5FC540B3876710B2A611F73283CBAACFACAF955AA9D837241C3AF2696E787139CD12E66361F4A0361E1C1C917F0758023B913AF679F7C119FA9E96873 Out = BADEEB9DD59EA5BCE0705208F3576C6A4C8A4B5872FD259BDE0864BFF2FC414CC535B7262BD4E90A3F4C0285AE70AEA2E2AD45DB2D35888B7123972E4D3979BCF7ADC056360F8BA474EFADCB0F3D6BA52716B562F8364DACB6F2614A593EDA8BCFAF85A1DAF1FFB972970FFACE83A4D0E9FDE6477A1E075152A63A06C47DB6B3DF8D9196EFC0F94C457D4510963B799D422365DA5FD46BC14B444C05EDB95D0D54FBA04CC3FA039390567D1D1F1277CA7268ADA9874CDD01AE390703DC76CF32B797C30FCB627136617B87E093F76BB534FAB041C688CEDD8E0C62F147022AC32C8BE77E4663AFB238CEAF9E5B24BB Key = 27F48E7753EAB3F9EB99BF76C80532415C7C01F8C7BA151694F7783F569BF103A1CB71776AAA975BE0F2EFFEB825160FF0061EAB963341645F71DB9B60FC6110 Nonce = CA36082A7A37E54A96EA1C5610A58846 In = 0D39B8516FAD8010419EC380123F1A9D416DD87CFAB9C4CE4B444C76B924AE461539BEEE41C9C7E0A226E33856253A9CCF4B4F4FF9C560D0D31DA2581FC0EEC3DE64BB7A6825C5C422A1E97AA97595824EC61D8FC4CE816708FD82446478EA48B3514D5A6788D1BFCB87558647F5151ADE70A0B900CCD32B39CC5915536FF888943CBD1A5AB4E1F607AA6BCFECED73FF0E118BC6B9819597FE0088925D0BCAFA96331C6B212460636EE6FE7D92237C560226C7187BBBE53E2F4752E5066B0E06EF8E0B4724405840AB3FD7FBD19E3786EE8C280DE59A4D34682B217F39B24B591875C836845569E519BBE00E81A29946 Out = AD185526230E83DDDA6AD67353DB2E8508E1D6D54393268210A47D6086C418467BBFE8C3593CB544EDAAA750A68C6CD90B9AAD84D51149F4B506B74C9F3FD25744E4FB7A7B84EB5D263AA828CF11A83053BF8B884301DA354A8019A86A04DDE1EB578CC28BB61758E6835D22ACC3DB84D3FD7F92C866A71DE9B2CD48C86683019F6DCDE67DBE0BCE8F524D59E1BB372AAD5DC457FA4DD0DC50A5DE99E0FA9EB6844FCA13C8D4F3B9735DCC93CF43890FB2029BAD90464809ACD5B0F63F87FC5A2FC2FCF47B5B9B6C6CA28572061255E82BEA353353B909301FB1A1DD8274A1582913829ADE95599393180F846F8A6B6E Key = 25E2B8C88A0F8CAD2F66A7261A34869EBBF63A436A4A64E8EB2FDB39D2AD76971C981FC7DB4A7ADE918AB66D00AE3C06F7A38BAB2937D01756D4AF37887E9724 Nonce = 9FBCEBF211BA9F0B6FB9A90AB2520A8F In = 358CB82F5FEC1544203BA1B24F47A333DA1968646812C062D66CF9B35368D843BEDCE6E8DD86F6417206E4343EAD88DBD47E80133441D738060A49194F69B4929C5DF8C1E74F0F80328199ADE35B6D269833285D7D9373D1AE32DB5190F7F14B6106D4251A7C4745C344F3F8397988428C14FCAB57D486E4F68FEA2AB7A39511F0659A739ED7722DAD110BD29776F10700C0A16B260CBECFE9642FB1AD5B9105FE2E9D175BA2D2122F5AE6514B6E4A20210EE5D036F9652CF582DD44F65C71E38488BEE6D4EF5B0FB6A40D68DF0CE00EC119C55C45CB0405A84BD4F36638684643F6F97DE74BA8BCC4C03F41CA84F54B2B Out = 7FB17EC23C55F6151FE9D376BC3E5227068DB74E48F296A152303AEDB043BB558CA8415E0FB2F271E8F8F589E72643C7F3CB6982589225B158E5612E04B99CEB909D2CDBAF9067BD5E2EAB1967EA1054FD3BA6D55D8B01E2358FDDD94E47CF74DF1BFC613F49D2642725186DC2C4E1C2CE51885F373CA2A81604CEC4FB8BFA6B2A57BAA46CEB759D14C26BCAAAF87DD1AA01CBFD53DFA53D7EE986AC70CE660D86B4460118789694F7DF1029AC3DEE4F8FF04E6C474ADCE9ACB8F4B7CFF48947D920826372B0877F293850D42540CF84E4A26D7453721AC406890CA4C3F96FD886FFF8D44D2DB0288FA154DA1B62E535BB Key = 9FAF194EC6AA5E6CA911A13252AB8719AD77F50ACCB426D6E567715C7BC5CB6AC0A75A6EC870F00338549BDF1E6E309A5FEA74575F55DE4191A9D7CD23017E33 Nonce = 1D07182FC4954198732B4AC989D44012 In = B3A1D5097071B378A9EDD5837F88BFE64CF820186B183B1F85A5B13FFB2334EFB1D8B3E29B1BBBB2CE0BEF1070F1873FA75F33B2425906968D1761ED9B186CD034A851F662B3A0719E0ECCE1F7AEA86F9EF9469C61220F6BBAC363BFEF05493A839B1962ABE241937EA64E4B4E0A73F8C20BD9BAABBB58477209A5C168EA4DEAF3AE763E6138D845DDD6DA7E98F9C110798318E64905EB77F3673E71403AC2A8EC18E7D261ADB7D497689FAC8CFFFADB0BE4E53459044D6D42BF7E977F1FD7448DF152C530F9932B7A366EF95062E6B26E398B12AA322DCA7B6859219906D99AF918553455140D9288F63BD7B988715A4539 Out = B74BB164D4A015FDDBA0D7CDE1F7A941A80743CA9CC57F4B20A5C20E4467802EB47D652825F844D79B7F0061C53B3C169962FEF6C50739AF37E9D6C6D0EDAAEB338BBE74B270EE58BB356F44E3EC9D44966DA8F7A6187C911271C22B275A4677D31479AADC3D1F9C406EDA017B161F09763270E25E8F3300608329D98757FA6B8683E67AF2346E6CD39B17F422833E91F47BC5D0BBF63D4961DEF6E0330A342759E859084B05B6C0981B8DCA0417FAB91E101423473007144564B008C74ACEBF5A1DC1AC99E33FDEA99DADF1444EB065CFC021B64852ABBE903E14CC61257818C6BC61348948EB05D3A283F5BEF38C6218D9 Key = 6894A39E8F6B6657712E7F71F3E0E0E44507ECBB138EC3A7EDD33FC04DDF9EA55DA6666267E670E37B7C6CCF87DC2D2B0129627F190A75CB0AD527BC4ECAB443 Nonce = 74E9B32C230BF80728C3D748E53E9E67 In = 5A1AA96ECBB3C5C3E135831325444191F023D55F57C10C2F1851555BD333A85425BD2850B2BC0CD46DA792BF541B3FD8614D1E1B031E2BC3864E18475C2E8C83FB81AD05F59BB426BA17876E9050A02B63DBE2B7A8B6E5145DA9F5A1261DEAB8793E89034E5F4201F9230C36FBDEC953BF3A5290BED68FEEE2C5EB68A46BAB121B5DBC840F5C6FE2F5E7B7CB97D880BA95304FBEE3A76D066BF874B6912479B15F45AF759A189D73120954F2B6EC8BE752551DFF00595E384765C00385DE59501D25F05243C3B721B6F5F8E80AA7338CB6A6C1F92A670600759C2AA3FCD1E350762409D0C999ED1BDA7E00F5A85C857DB9D6BE Out = 25475474EA6E2043BEAB78EBEF2E4174B0AF2322D4C45EE9DBF6FBD04BB050595F894BFA57574071A0EA81491D816310CDA693C2020F14F3952DC14B20D270E4636CABA1C6E3374EF91E048FE9CEE6776D767A579DFA42A5B7797523DADFEE6525605A5281AD6A30BBFDDC32E7D2CC782A1C06264807E4E8966880DEF8F910AE679F4CC0D52850C400192E70E60B496D9F3F94BEE515CFD74E28DC45CD054CA6748350420DDB870FC139BA3D4F33253E5036D5A1BFAF91BB8433761AD43ABDD2D995B4AE3E0D246925907A38F69D07AA57E4DAB26A0AC1EB1A9BA33CEC87C1FA36B2309820A59032B134864F85F5F10390C94A Key = 0CB5720653ABD543CF56405DFBE9E16F4C1F3FA85F6056621FFFDC660D14F4600C264A246CD7D3DFE72A7A6E2E92DE3E5C1BD269F85822C2A53B4F030B347D08 Nonce = 09F2EF7BBF205D0D19C631099B4DF108 In = 4BA6DE3707E14FFD21F3AF4E2C4CB03AAE76D32C39F03C1B5436BDBA57FD276E527F93440F3BDBC2FA47F02CFF7182F07391EF0A458151E1E1C8291FBB9D0C0F909ADDD916AF7E6101F62395F13EB1D1F2E78CB3B847230E38631C56E7A130A6A506967AB287C8E3877ED25B4480574A04B371236546E21F90F9EE56E434C4CBCE8F289C243191BD7D21AADD47C599D0B560CEA26CF7ABA5230C0CB308D82179C405706D86552DD484B141623D6CFCDE54240130A87F755C81CB28D833683F125D6E55B97C2BE32BFE12793DBDDAEBC6E97BB357CD163C71730D3061BCC49A56831035053B51F373D9FE6BD7C70755CE371F0985 Out = 9A61431066681E479E1AAB08FFEA9B8210687A39ECB084C609FE34F61DFF7A1E30324438931A5B4C5DF5D37F5ED94E90CF9D6C33D993B6B63129FD8E7F01125C23E9CD03EFD5EBB65C887E527D9E64DE2B736E61F094CCF3756DA7378185CDAB2EAB41B490F3A42FFC626B32672131325FE3724EDBF4A0EDE7A69F51DA235479CE4BD74355E066E88F2541C7FF7B4023E6C10E680B64A682CE0280CEA3765014326AD244B4F2FCD136637C859881E2125E25AA0DB6685A3A76BC3259D375176FCB3D59295B2211C66ABCCB777729F8FBAC5BB8CBE7F30D412354D23BFCE03F160AB296CD20BA976F78B0BEC6A25A8E8ABC80E6AB Key = 65CA2CC54575DE5EA0C216C07797381D5FB65A9D334B94F3CC0B19DE8197D7241B9A666BC1F8A3146F64850F503C8FFA4177E22AD8A9A5CB55FF7451DA3D4ED0 Nonce = ACC65AE9781DBBA0B21188A18AF04BF4 In = 21E04706952DBE1139F0D5BB48607E166FFAB49106D572C3A157518189C9C75CB5EEEE4F48B66781900D757A6CF867575F2DC01B96D453E3C146B20EC136541601C1A1DBF73B8B0BD70510BC267767A69F6E76824D9BF872F8DC197C8992B9F73D39BA8A3EFBBA43765245E9F9694D16A65CF30955F3252B30EAD9E61D96759A8711ED527EBDBE0DA3A868F4C86965325F3816ABFCE2861878DC18D29396E1664EC717935708F8E17F0553A1C0AE8D51C2A6899412130021A1CA8E9157CAFEF578FBAF304016D4B9DA8CF076C8B9D21FCDD5F0789F85E6E5410ABE32A702F77E004E7E38AB4EBB9D837DA601D9B2A0FAA9E1B17CC1 Out = 6CDF3A7C9B35B6763DDFE061E3EF275DE2DE317FCDF8082CB1E9748FBF645D2025B035DDAEDBA18B1140384B0311B1EC746C10A461D89D4802D05297C57313DB1CA0005580A00FCF4127B2406AD66F4CED6C15C61B8543D65CE8C87244BD9F4A12686015CF2F1051CDBF84141AE68B38A09133152BD2D6E6A8288DBA5FD33FE02AC7DB872D3C7D14B8D4C142A99354115E69F7702221E8178E8832EC478FC388C9B73CC383F6FAD68AD68C6D555CEB9B14860A9A38A501EAA2F34226B390344D220097809356DDBD8AE01464A228D3C8BB9711133E7B4A6EC9A0CDA7AFE0D90FE2BD7C97003692249452C1D4EE723F9F9C93A6BBBE Key = 3834A666AD82D3E981740807F4EDA8B85A43B33B24BEC0DAB23E534191CE396CBD7CDA5344D324FA735C391FC4909183289F11DB275431FB019DE9D984DE983C Nonce = F2F696A6B2DFFBCB20A62D2F37378E85 In = B1F770905E832BF875484FEE15A26F8A0014A614CA9D74FB1594DF831802C3EA53FE84804766C6DC4BF4D02F5D01ADB41C40B2510EE26615DFD979D470736911AB6FD0273CE3F6D982646051985AA6D332FAF260D53C57DE0F6E84E685775AC6D300C36B871520548AB57D990CFDC2D6A1F1839540066B7F2103D4554490E76AA70CD15AD45605D14B1AB1D15294D7C1AEBFABDE479380EB1527F7306CC9A7A56EDDA752050AB8C72D793B36F02A3431D8F8B4C9F6998CB05CE803477F36367B671DFBFCD50D4EFA21E937F86CADD0BFFB434A7E309727C1DB30A2924DEEAAE642E49447D5EACAEF29A5A4EC5D0C68269FDCDBAD0794 Out = 02121075F6F40403F77EA8B9596CF8DF247BB25D3CC6F0F0362C000430CA63EA3D26ED1C5946E86F7C8A04A3F26D96CBAA130A636FB629B22B2C6A394995BC4F832527BC33EF415ACE90A92D9164D2079D21F439DB9CEB3BC63F6BCB6ABE08E2282CCFEEF210AC25F3443646C3E92A31D9EF2D7B9BBD1F0BA812DCAA643CBD89183AD44E8F08C0920BC07A05C2FA80626A85CBFC8063B662F8D09F8F6AC83CCD807B5B98DE32012D1C91EBE313FE6811D4AA366B0E01A3B71B1981CE320A7D17BE524EEDB9D68123A2E36E6FD83DB65CB4E9271FEECD82959572314D38C312454F3EC73652B030C49E6B08759B87549444E1CF99F587 Key = A0403EFD4F0B35C28E10BB35B47763AACD8548B792C46FCAFFD680A1FCDE44686E3A17283579ED029082A33EF635FF943FA6D1719FFF17DEBC1D29837AA21EB4 Nonce = C4D8B9557760CB777ACAAABC5309F74F In = E041C65BCE08FB8F211263845C478B2B8E3BB602226C90D364DDA7DF90A7AF0DCCE5249FBD86B34FFB42CC7EA11ACC32FCC4C283DA90B5658DFC459D9162D1A6CFB9F039A7770576DB8FDDC8DED46D0028FBDE949FF9CBB4BFC0B669E31D48C35F216B4A19A38B54B56CD6D2537B074CC68E1E3F5380D92103C547A62BAB4CD82AA2DA1DB3FC7854A1946ED8C1BFB77FA155507088B396987612CE4A3791D866878C2A06FDDB309FB3585573565221A6CCF9CE3645C68909E022A8D6FA4C1A305EF998E1B5A389CB1C82DBC8AAE6141ADE34609D565BF10577271833E496889719026D543637472A7DAB0FEC68F83BD903AAC38605A041 Out = 66BDDD3C18E60D5FB2FEF68782AF56D3ADEF6C604A690EFB0FC523B64DA53C14CF05CD0561BB8FA24371ECB60E4B7D78F43AFB352B7946BC880D90307D175FAB5A6A1E7BFED40C334BF884D2A77CB0866D02EEC3BD1E9355E85E5E6F3DB94A338C27A028530EFDB109207F57CA91F5920146E463CF178F77E7535E7BA1E6EE6B8861BDCD6EC00145754B4A0DA0F97F58ECB223192007DD008CC0F8C59C44A3F7A19A4AF48E81F13AD5AA6E71B6B497B659EEB947009DD905F8ED34CD7F4EA69D700040CB104C2E60F8654FD6E1CDF8A8550EEAC231B9CB3DBA9984902C61A5318BD12839B39C27934EB4F0A4D0CCA9620DA569D7667D2A Key = 912CE1C64EB95CC07A798D2498723F2691C299D97B71FC103BF31ABDA26547BF002BC1286DF4CD0190AB3D9406D1EE6400C022FDC68984E618D8017B3AC80F75 Nonce = D370B66E892B3B74D93B9AED10FAEC7D In = 99A35B8CBB3468CAAC183AC1F7C4992B3B8A051FC7431535DAF3A50260199EA88D23813F3B02E8F93969AF1020BAD0C709E927BD4F5B2AC2904C5BFCD376D68D8F99164BF14CD9520E9C09161020D124FA6BFD3D37328BDC4915A7738EA9007F19C0968EA8667EF7E89515DEEC810B843090E08946ECA12C16F66B29092CB7B7DBF9E92430712CF507BA2F3FFE56359113D32400EB820912635AF043B1270EEB33875F0A78CF01241FFF4404A778788B01DD58B6F9813EBA812378E8F1D698586F356D1C6A250A60F49F3F1ABB4468F35BF1D0197F186F4EA6B763396FC76003D73A54CD24031E5BF45F04FABFF68A8C41170AFD58DF3D27 Out = AFE01B7B56E7CB1FD48F07E5F7C523AF7DBD20B5F7BDEE8BD3FC023C9C862DAACD83373311124E8716BCBF1DAAAE8A7832DA9CBC50B8237109F5115296DFFC9A6ACC8ABD041A54B70D1D2437F1DB20EEF1974BA42144F6B48F16A49D955F34F92CF13CE98ADD4DA91B8C96E63A3CCEB96441CE5D47726748697901BA4DF2DDF20F87787FA467F5F718B801B04E005B5F2A9B592B4D836EE6CC22C63A126E45FA419CA63D19B77EFDC30009FF279356D4BEF70546D73105EE2F5D98CB9B8A880252D094AAF9E9F0638EAAA3A6141AF1BF3923953BEB97A42B84F977CFA55D50AF0C720D0B55574FD16FB96409CFB8D69176E25C796905FF45 Key = 8666320110FA484315410D173EC7F46D9C8527B8D0F702061C1CC524C33923E15E9D807277B323CE12A01D7E88041E47242C9BA86595C8F2CF212955FEDDA109 Nonce = 47609FC73A46E39B8534D1E0E133C415 In = 1D317168EC455679C436EC126E5DA02AE5DBD8F984A3907CE180CDFBD17BAB63E42B15466E2A57A39B1544DC5508F3E34FB83EADE55DCC3315231760FDDB06CD7A117DD153DEEB2C320871438685ABFF3F9F8DDE4E41F30C81D55448AD225468B5E4BFD22E0B8BDD3D174D5133C6FE0D60BF48658FD108682F735E0B04BD2B2D86E37CF5F72901BBA8ED0E7A9AD87659D1DA6FCABDDDB148C8272761B80B6A2A8ECF37BF89B36BF89500756C6F481DB7C2BA4FCA1FC19B0119154E99172AD561ED6C001FC1021F3F2F179FAE11FB380C49189CCCB01941B314B9775C131C2C7A6EB531354C60F86C82AEA534E706093D3BB11D016A5838075C Out = A3F7CBB2E8A0326FF75B80C4594DCE6CE266EF13B99D1FBF7FB34A77D5F857C721BAFE6C6C9D48C4CD1C8796111214433368D324B21C84EF82828A73F9EC8682D9DFB9B4B428E14C9C16044EEDFB3F8C980636E6195BBBA9F0B92C94FDF6B274FBF6C25F33962E57B4F94FA7FDE4B8FFC91D63F0189D4D9A010FAA3ACF444B00B3A957D6219500C1885BF14EFD3E9879E0A5FA76FF3AD6F70BB4C0A87CDC1CFDB082FE33F5FB6349CBD197271D81ED96D6A7820A69F0A907DEEFFDCBD655A24547BA43AE78EAD99365BD0E836EFF16C789843A7F1E321C18E4D81BC334DBA3B357B1BD1107CD3DDE2E9BE8FCB9423C556A8FDFD07937705B8C Key = 249DD0E25FF78EC529608091F46CD9CE99CEC6B7B62D697174029CCF46AE0C4E25A4BABB6878B083F66398325BDE5560FDA16A0EF8B230B61A84E80DFD278893 Nonce = BA52AADAFEDA198565D78AC8965A3633 In = 0D8F39796F3E3A18B928B368341684C7A4E7105C6447243D6E3C9A10562DE3A53F878AB599276D94B20B85372CC132CB2BB64278BBB7DF478138032EE2D56595F0B01A915C73FA6B6EE6ED29FBA4AA74A73CD3B29DE16C6B177AA811897612C9722EEB37D2C51FA0BDF2BB6B0D1AB7F0E636168EF6DFD9499B2EF05C475C231A4CC63D2924942C817076E522FB6D8E5B7427EF49E4FA59C72C7C3FEB1458CF44EB44042601EF3C0E1A3E17A52C2CA9A6E29C8DB633691F8A4A0FFA04BCBE6EC70F8028AA975A47F94B8455DADFA6F6D4F195B8D36377619C5872AB30DFBE8937FDC740B96483F62DABA87B92AA7EB6E7600181F0C8C44A8977F3 Out = D8ED7819D1262A5B1579C694CF46132E13B82A25AF23B3ECEF5999A290993654102500A024CA653258EA4581B1ED33182FEE3B91FDF0350CF991E22A876738FE3AFFFFCF90AA3CAD3A462F08E92FAC53066EA8E41EB56B57AD696B3A4251B10DA5A140CCB1AC09D2D969D9B8BFB0FECC72CA5EB8EA46D5EDE37480F269FA5CAD08939B247124D49F1A929BAED9B021B1D0996E5F3EC22A7BEB37069A7495DC5A4611D521FCBCDD4652C0412441A98146C56E6A9222EBE8C989869C77C6F0E37E0BAA5FE9367635D937B3D274928A831362EFF700DAC6663D7F1600C2ECF299D7D7CBEC3EFC82E453F7EDA0AF7385C2087A07731B9C61DA475D52 Key = 8950414F1BCB1E1544D93AB18F0E83153965C357FB26050948F33DECF9F9F5BBF66683508118893287359273A85BF78A8236B65DE562C3FCDFD4550A11C75E3E Nonce = CB53400A63F6B7D3186C49C6B5D065F1 In = F2408E4A597598BDEDAC5F66B877DA1A9C9B673EA3F95625035C5D74F3A82079B7F39713AC3272532775478DEFA05BEAC846997F48C94C3B10A77559946FE96C4F8957F7512EEFC60B599FDDFC46ACEBF46EDF156BFCA19B5928A0C518159F97CCA85CE3F3738B2A6C9626F6EA87BD06B24F250E098768620E9E23FA87E828A32C03A36F90E228C4C71CAE3011B4B30ED16ED4C8DE6C534E2CC683FAC179F776D524A3C128AC158349830E222E75F36AC6C404C53083DECA6AB852D5CFAECFC41E7FEB2D02EB47624B3C4972862C7C53BA6EE20EBFA2AA127E1E1759D983F5AF3BDD793D8B6C13A42072A5976231A7C5B8435E145BAD599E422DA9 Out = E3877C96606320F9DC31CBEC621FFD5ADE7FF6770200998F04C1A94C816BFF0B9D8E2033CD351982BE55D599BC2F3FBAD0159B57FED2CC82ACA9F20E7A96ABF4DE4A308F2E589B84D91357812519BE6E37AD366A81FA1E4B74AB2122F38E79C8B23120DECBF0D4BBAA7D1A9FB22216AD05AEA9165F2F8D427B3C77AB682B8CBD4CDB960EEF145586E7F44E8EC4F7004AA028B3910075476B408C94216CBEE652CAE307A5C05EEB1E20C37B66EB81A3DDD02A64DA5B857503B0ED2673D7A9C2F6D36EE53B0F00B82FFC57A4591EC211D2EE8FF8419C3AD0E336A4E94EBA86FF3D6D57C452E03A96E77CB24882F506C1B86623812043CF2C497051D2 Key = 50169CD100CCA22E4BF9E524770154CCFE9AD9EBFAE0C30C4641B73991ABA6906592A2F3D0F2F48ABE13BEA89DC2B2EA93A5EDD8066BF1C31A4FB2006BD24EAE Nonce = 99D8AE326A10284D8FDDC06AA5F4BDF7 In = DA3328D37C10F1086C15DA70960FFFAADFB7DF05D6E3571DE07FE15A260D5B990242820581E55FF826C0954548F4C0A4FE01A3A2998F3812EEFC4A69086575CE8A0E42687BB45303734D77D84F9A890B830B5ACC74171CFB30C5BBA4ED207C087994EE29258B88CA29E278294C7A21E68348A3EA426E30E28B3A900712726050CE2F40E31F9AFFCE4E42C28C29990D53D0514863A133A972EC26AE3AD8D0279E02C96C00FE3CE5C40FFECC392B681F5349C77DD68470103113270091E7B596B8926A143535DBC11B947281D725EDB073A9D7062715472FA1DB987CE8D36ED423C2AADB5906C4D91784400E572AF75D471A64178715E4AE22B6EED796 Out = E317060435ADFC840E830F0C853A5369D30DD666E5ED98417409E546A891829FDDF8A9E55284EAB364ED012B91DED2CDE5512220D6480FD64A78AD1C501709627AC3AB9416828973466FA127D0C6E168F42C8D0B60AD7ABAE72A8A8A19FCC6E13B65F5431869F61E4972E75E135025DEA54EA4933B6548320E398639BECB0F48B2C4DE093FBFEDFD7CDB62A98CBC58F1C9F9581E1DACB1B6EFEA494C36D3A22C5464612867466D19BE3E17CEE1140FFB3CC51CF6C3E3D0CB98DB5458CDB9CF69E53BB57A2DCEDBBA2916E8E7C822254F0365B75D38CAE4C4DB97194E3EBEF5FB0A1DA02D9D1ADA33CED23283F8DA97F1AD6050CF7BC4C824DD55A6C8 Key = FBDF921C80DA76FDF559BC8937823F8F7DB7096F164B9AFE49AC9268653A07361C62830DBD18A491DB9A7654E8C19613A284C35D7169D2E4DB3A3FE21B541C98 Nonce = FA8CF9134AC279FA9BEEB5110D322B72 In = C22F2380493B5CC7EA4E59998252ACB600E61ECF8E6C2B121955C0F149DD95186EF33D66D573B6C6CF7EEE29F63CF1524CA027B67B30E92275D6F22CB81BE477B002EC5ED16979BD696AB7A874866AD0171FF9B2D5F592617636CDD3A55C78578AD48CA803D73114C340B003D1BEF92993C3BD34ADB18AFD85BAB43C3720626BA944243050868607C1795A453A13F132E035CD2B451E1B0AAD50FC27C5C1A3EF7822AE6F530DB626B223E803584E23B6AF181E7AF4974ABAC12E42B44B56106DD2FE49E08AACCD0DEBC1FFACA6DC3D277740059DDDB727EA1D7FD8C63B6FF768FA2F0B8BD1C01D36CB5A190367EF7A78F1C790B50012C0FA24A3A6F995 Out = C80CB1B8AA44DDD9A7EB1D83074BE67B2E098C26BB1CB39113E3E14EFED0D3370F645D43BA316060929338C549B908325BBBEEB8DA5DFCB1CC3EAAEEF471E4247A2304786E1CBCC27052D267216F6AA741E7C392ECA0B9E83CA4EC13962853A0E2A7F1C27D96D71C327777DF31A931525110D10EC33BDED7C7AD64FA05AFB97FD91E31B4CE51740273E481640562201F2C19E67622D875573CFC0F9C4D31E882B8CFE37541B0C4F072AD9E9F0261AE9D709A54C98572484DD42DAD163F33C1D6254A80182934E8190AD1CB29F15D4913BAD2E7C93F7AA95C3782D50FAADC449DA4AE98435EFA80BE52F80BF6DB60B27FDA6457E7426B0BA6393364F2F7 Key = BE5FA91C4BBB3884D6E5F8BC9EF746EAAC06BF3C093D68A2CEA6DB22A084E9E2C63EA8FBB38D376C0B981637B712E5F2A46999FC7929A998FEC0A842AE40DC22 Nonce = 8C5CD690539E81D98C73EB06645624D5 In = 263A9E751DDC9D7C8ABBABE64FFFE976C9BC41EB468B8319C94357AC1ABEFF936318CE13EB15EBF7E8E03340B7521EF7E83F68E22C40711A3227A05722B0F29113DEFC3AAB5A078F1348035FF896DBF1AFD965B5E3788781994394A9B40041864AC70C6FA5B874024828F170DC039F8EC2D5B75F4469E16DFDF418E77E64BB6DB444DBD58A06DA728632FDF1B4DBEC3B304DB33973768745B59873988200310899FC8804AE157EAE270F4B8641A8A00A0B65A9D7B1C2C19301BA7B7DB39C94435FF3F0D1C59577ED3A71EA0AD377CE7FBEA781A876927C202249CF116B58740AF6D93B57240EE900064C7F6227719E4737E9FFE3FCF42CAAF6EF326EE3BE Out = 58806A677977E5979EA8717ED88D5B141A6584839BF7B00D9C51D21C93463B8DB59661EFD9E9925769DB1227B0AC23DBC3434E28DAD180B39A98C9876FB37DEF3959A5B75E41AC5B339645F25A9D1E72A5CB01D5C4E5EB8129CF457D802F02CCE979B42C2E288639EF8560D82A6A7F5D08FDC01B6AE4C0A0D3DFD4C34E14637551D4731C9F780D09E22AE5AE5EAB5BCBCC9ECC35B3C546383722B3A74585ED679E8A9E58878F075858158784CE31A1C57C3A396C8D01431C41E102B41C6A8BFD1AAD0AF3392414155DD615650C1388F2C158728FEADFDE384933F87B64E332046647522A67D5BDEBE4ED90577956B325107B837079A7D994102E78ABDED7 Key = BFB8460C7B07214B606A4BA04ED62317A5770D110C84BC75B64D2AF31F76D00AA2BBDCAE156A3EFD4604336BD3B690A592A5457511A8E3E4B6FC0DF8286E39EF Nonce = 7510B7E888B269F890C3371F636C4577 In = 5F9E8D18BD77176BBFB38BB8A3427D899B24EF227C7FF3FE0EB545C3CFFA119E687C72C865452F5E0D530CC96B79AD199D26F8E95D163C35C65CF7AFF4B62AE751FF396F895C4C5D3D4F243B9ED9CB291BD75EEC5A19976B26E0650AFD84F08A487CB66AF7560C1C0D59DDE2C36BB7F9927A5073113D5D5BA2AF3012975C2B4017BC50929C94C6222FB33B6C171B1D34D24C68EA1088F43C27F2D83D9366E4DF3F6C675CAB04E9FB4B3B8613752A1E8F7A0D1030DA1C3E56D81A2E599AFC9E6B2E084776F722D30B301132EF671BA32FA9E9ACE5007273DD94B2C393507832C9233211740D2A173D4925C383AF898515155B27E9E08BA8D6F50CD60E8ABD8E Out = 5FCD2A960BA94A7BDE02789ADA3E2D25FF7AAEDE6BBF3267AAA6D99E276357D72DA671FDE45FC4A8414E47F913A4FC09DA9CC52C8F3538A47DC0E6DBA786A6BF88F951E9E1CEDF38580177FC3B01F6B458E9B66876A46EEB457FD0FDEA030C6F4ECAB1446607E8E4D95E89FC78A8E6650A6D849816F7AA3B322EF23452421D67A33DE3867611EC24B7155EE33592D22364985D03A3D61DAF2CC8566EF9EDB63F05270BD5C0D651306476DD62FAE9545DC1372E2E803D4617849BDEC2AB59B14D4691E3C4B2D9F58BF083EB2D6A342AF825C67393B1C06E6952667F7D7D098DF7FF709A83F3B36B1C84B4582EC3BAD62E01DCE7C14DD3580BB5B6EAE8F9F42A Key = 44765C5ED4BAA0FF3FCFC4B6E574E7C640A221F64B699C61D4A96BB405EFF36F65A4957CA57D8EFA04EFCE61DE4F91F476F8951885AD50D842EAA74E9A75A577 Nonce = DA1A035D2F281D6962301C515C21AAAD In = 88CF2CD030D671A3407CC780E1229722F72271E9BBCDC01DFE11C94989AAE8EADF8BFDC610DB7EEA6F22D5599A81FAA2DC4895CDFFB30B65DB1A28DBF334FA5BC7657D59F2A99C3BF96A713A0F0C984E93D9B3E566629D9327ACB2AE7078A026ED4FE89BB0AD6DED7748FA222FDEEC3953A27892F6109BF67669AEB9D725542E10C583AE3A00D9A2D0BB642BE1D553E7DEC70499B91F6C7906379B1CE62E4DB3781BF9B40ECD87DC687E7EE5280EA0D338A62BDCE0315D69A801F45B6476008C6B3FF9514B2ABD23B2A3177E41BFF3BC664C58FD09B8868D2C4DEC07B3B2769EAD72C76EEADD4682A34C27DE98EB7817E36EE71A5EF9CB052DAFD65B9311ED1C Out = E2047BCF89F120DD00E2AB2682E9798BBF01A16D3C55EBB5D12641BE5E43C69E27CF8316A17BF17BA6F977B2E10CF8FDD9A1498EF440969590BC10139E909083B2131B1DB88EF790A9541108A1C3CF6782CA7CA63C74A2E6BCDD1FB7A805C9A900ADDFC7B232CA7FFF09DA514ADFC666B1ACC86357AD2C12E9D6C2A8BC5C3AB8C4DF5FD895C568BB824FC39DA96924054CB70B7CCB6DB1756143035D5D2125225026303C3270E8FE0F83DD54DD12E133DEFC481157BB2BA5CD37A2B93C2B21F857ADDFF8CDDA74E1A713E8D4E44D30B8EDBD13B2AFB9CD1F2D97283F9F53888D5B59F98C66DE5FA2950588DF3E3641C52517F6F0717C4F14F7F778E405F74AAC Key = 9F7DC5DB8ECF4302325E0A993D761186BD59BD247615E560B704F8C9B6126A85 Nonce = 2B1B7B6EAF72CA6F7F6CD1C0ED88DAD0 In = 53514C69746520666F726D6174203300040001010040202091E4F9BE0000000000000000000000000000000200000001000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000D00000002033B00039F033B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006202071717170181237461626C657465737432746573743203435245415445205441424C4520277465737432272028696420494E5445474552205052494D415259204B45592C206E616D6520544558542C206372656174696F6E74696D652054455854295F01071715150181217461626C65746573747465737402435245415445205441424C45202774657374272028696420494E5445474552205052494D415259204B45592C206E616D6520544558542C206372656174696F6E74696D65205445585429 Out = EF1F13233DE8092DDE062280F8CA8F480EC61DD555396F41FB8ED9444844F83789933DCF9AEEC1933D3DBB4D54A26C329D7461ECDD009CAF263EDE40007F26736782D95B629205E87D4747FADA1434EE74DB09505C43230A0E700EFD012A5F808FC713FB22624AF804FA318BDAC382773E2653B4D576D0BC1A42F9652F56280DA21CF82595137F9C472938F7519B6CC24708FD5409B75C5309E2C85294A2D1822A218D9891D56696ABBF569906CA0452478628A719E3F11AB097D62D3FFB4549576159282232655AB69CE1A4103DA8428F74D73E540A95ACBCF347D4EDD299FE8ED90AB8F09D5D16B35BC5925E0B191DD753E2617B9085F108CE6B445F604CAF2B266D5A10B460DE08A307D7CDE626D84412B8938B24EDBAFD982059782070144413A7C354F99D89CA475ECB626E7D93687A505B0F3E7D48823E4133E1C5946556D55266A90F8C213ADFB020CA2D55462FA400B26B159306A5D3A4C91815C3E4ECB8545E394099B330659E9B9C188AB09A53838AA8D0119ED9E55837BBDA655CFD4096C4E2227287195602F32A8239D69DF555145F4EFF077F69366416F800DC30C03C50DE4AFA12CFB4A8CD2E86B36D54CB44C3848FAD7917642551A85C76A3A3C616D32B471B5775A1662B997D392D0B091570710B1CCDE49DCEE634EE3BC3BC85ACEBB7F8551DAF5D15EF19A9DCD3CC9C82B46A4B9EFF8AAD0F8971A0F26DC37E2DDBBD7603298654AD6CE0829EB76F0892E81C569A71343BA8EF767B70B8A24ECF342B832483B7C9375D07BDDE2F1D6D4E6D28E997B1CEE1254F70D17F7C24EFB08A3634802B37C8C0081F501EBE9346B9DFF3705A449B5517984DDBC2BC91F626045EE89276C137233D8560B15C11592082D11935FF68A2ED6087527030E4FC31F37680132CC53DAC81DC3636DB5068FBFA3B6923A2DC7CA617707944FCD0CF81D092916AA54D5D26151C259FAA9AFCF9CD77A5E22FEBC019694205A1D3F999E59F00D42F26FB5B9BE68B45F37DD664A2E9BA3336CA8A37BBC7EB4525858FCCD69B746C7B8EFD534AF44028F915743FC858B45DD12D7F637FFFCCB431B3DB609578811A67BB80D954A16B456792084E0E828CAB146A11A84DDBE4C79859C9302FC55EBF8BFE8CD2B6214098549EA67FA52C8E0DF383F3532D87816C7452A7AD571C213307961F786C45FA3AA89A0B66766EF0775904A66BC17DF3EB56460444EA22EB838A555D58EAE5DD0628581B9709738A1D9B2A3F66D4CA254FDE4DEF8DE858574672F34BAEC851C58E58209C9019A32E0C728A866D04C1A5524689C11C97302E3BE145486887E7E6F11581F6751DEBD01C28CBEE855CB58F69D7945831AE82AF364ADD56CFA0C160CAB270D963CBF82E324409690597D80F1520250B8254B29B09BA74E3700F9E614D37728C373C15C1E92D2674686D811507C34E Key = 9F7DC5DB8ECF4302325E0A993D761186BD59BD247615E560B704F8C9B6126A85 Nonce = 92E8641C3A25F1A79D188D7DA317F4F1 In = 0D0000000503920003EA03D403BE03A803920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140504001B1F776964676574323574682074696D6532140404001B1F776964676574323474682074696D6532140304001B1F776964676574323372642074696D6532140204001B1F77696467657432326E642074696D6532140104001B1F776964676574323173742074696D6532 Out = 3A88A5D687632C9EB390B37C721A2010006D31FC9D4E3D169D242E1E44A317C0675566A5414EC5C5FB19FB10D329C9F8A0250AD8F07880459B98E079FBB1CA58725EABB2CCD6427E14BA01580B402B9EE34C6B23CEE38F5AC5B50A8198C5441EC3955B3290E2F7211C8B2970E3082EBFA1DA9233E0D94923D5F658A6BA1E0E5C7FC01889E3486551180032304FE118BBF7484A487B20B356C89C2DC5C1C8DE94882676B19FF952B3316B9C8C0187B5BF781D894AB1DE6E8537B57CAF45CF23E69B62B143E1AD9C47483525EB0D89AEAD9CAA731E6FB2A3ADFAB8C05E1F967460B05ECD759B6485AEB2A87F8E9030AD6C01C1E3E7FB468C624C50B2A20A9564FF5E1C164C0ADE0839099FF7AEA385AF3CD07D743B7C0812477AED4EE7EAF09AE245CB1A646F63A5B4A7741C1B223C73235A973FC08A7DA0B60D5B8BD8DA07C2367DC32CDE9A468DE47570D8FE52BAA8088D75572671F227D8BF5031165581C7D024535729112182B38ABF9DBA5F15B3EC590A6BE6C4AEB987E851C9A850D8AA8DE7CF93A60E8159130E94BCA5FB252A0089EABEFAB3E2FF77C7CB3193D3123CD2929E336C2E183272F83AE13574A0595591619BCE9FBBBB5D9EAC69B5D8C8BBD127EA886544BF770DCD8FF9C96F0EBF63F9D9C20FC8F1962CAB0E5FA7D61CF41F4F38A43E402FD91119ACD6F7EBB1BEE6D56C7BA2C014BF64018464E8D3938FC54F7A8B58A1B86C16859A9CDAFD5604954AC1BA17CC1057481FA8704FD3DA9B3EEC91B850B9DB54B38F59438494A316A0D271D813C8B95FA21FE7776F112327F321D6DA9E1C2909CEE630856A53140D9905DA751F42BE351FCCEFBC44EB80F0865A3EB6CB14A91471D9B0ACDFF0D65DA1CBB8E17E2234B20BA8D3555627A4356B8C0D0851AB981DBFE79A293C242BF862D8487895D7B86DE8D77810D0AEDEC2496063C9ECDC57B1D3B1B6BC54F9280984D532CF30CECFCF954B5D06DF949E405CA68C12C2BC8584BAE50EAC0F98BD2D1E8B53237F10F414D61E90BF3FE927D9508670D614EB1CFECF00C92AA3F50E2737F7BD3FB91C46D3677FC3F1EE03FE81EA6E7ADCE6FCCF06719BF1385C6608D2F833CB926ADC03339D03CB45996B199BD9C3B18AA60BD9841FBE5331CFF7544BCECFA79E44BAD1F8757DFCCE491267772F0BFB4AE236E19DFE16BD166856851999614F38997EAB29EBA438D10FB7278FF31334B8AFA0D6CBDCA39DD2ABAF46560805BBD9F7B32A3C551A4BBEFEBABB89069640C7E310C0DD8BDA60641D2468E2C59933DF671C22B57190F973E8EF85F5C6E05D89E412243366DC2947F3418198FF5A0A38A383354ACDB3B2D79E99E7F73457A9EA05506307CFE13E8BB571B032DE8DD22F3DC33AE338185FC099E9A5693C10B78D140F6B3BCD8F2ACBBADED84941AC3CFC8F2795BD94499B89E92E45B9C1 [TripleDES/XTS] Key = AF6E340E3361AD76756D9A72426A505D619997310DB84D5658A274258C1BF0A0090F10E4A2B8B02277074A4D7CC9037F Nonce = 08E28CABCCC505C4 In = 596E8B3B889BF5BBF2 Out = 1C908494BE7CB290D3 Key = 1608738E2FF0304610913244F0169AB59D6ECD9935AA8A77ADB8991E58B1272C901BC83D3F0BD954CDEF7814748AA601 Nonce = A30CFB4EEC4D2A34 In = 8C8AEE061C0AE36B302D Out = C0D0251F337EB231C842 Key = C365656F981EB0CACAB0EBCC6EA6019ADC10C34F962509185B9776544F1A007BAD0C8328F761146F9AE9EE6C61FF62D7 Nonce = 5068252132D6CB50 In = F73A9E54AE1ADCD0FE2E54 Out = F839F5EA2522AE88B392FC Key = BB8AC3BE60C519B23B90428F0E9FD2D73669A3A73BED60108C50D496340BA80A71720AC17D4731B6FF0ED6EFE094D0F8 Nonce = 001FACE467C3EB77 In = E29DE83CB476A22DE6D57E46 Out = 40258CCA6843A3CF49148A35 Key = EB0445C3EDB50EDE5983E6EBF65C3B09DC8440F021D73D0455E57B8FA676AE030006E7F5951F5C5D44A9077DF8FB0C6E Nonce = 9F66C0D8BDF9C2B8 In = 9FC6E51A2CBCA2698126D60460 Out = 7363B23A26CF19145C234A02F8 Key = 9773982582D9B42FDF323BB75884FE0C0F0E35DD8AC8C528211C49AFC3BD02CA81F96106B585A45F177D407C8AF333E0 Nonce = 7C823793374D30BE In = A520559F992E750E2E15147C6B22 Out = 4CDB658ECF92BAB32591547AE27F Key = 2A034D1DD9F504C02D0998AD22CB171714C3B7C86A5A5CABD32ACD7F60FF3E7DD87A56C67FA8B492A65F638938E23DD7 Nonce = 6FD09D721BDD359E In = B74E78431E0FBE59FB2C51C452BFD9 Out = 33ABB8C1D9D19F6EDD34E92C23A5D7 Key = 21DBB4BD072BC8A9A8A3102158EE6FAD4113962BDFA1E67BE069519765C079914B90E2CE9AF64D71FF99C1205D935A24 Nonce = 671EAEE385AF636A In = 61AF7681ABAC4B4DFDDEB1CBADE74238 Out = DD7116B54A456CA51A2C980F0961CD52 Key = 458DCD428BC0FD84152940EB98CC9992200CB63F5DC52F78F9BA2374B7FD7BB1EF468120A4CA96CDE9116811D608DFAA Nonce = D1ADC21B3819DFA0 In = 0DEC0D07D0510061DAF8F6C80D77465C73 Out = 6A98AF6621F2983106899B372D251D3186 Key = 8AE0650EA3C6C0532A4102F1443C64C47B8AF78FCA98364D732D00FA5AFF94663C0B8E64D21B0654403E94708D2D8013 Nonce = 7F0F1016C809CCA8 In = 81E22D517081F4E7DFD58E7299F58C266379 Out = C0C0BEBDC9A24C787870ABF119F521AE078A Key = DA3285F760EE345205CD3F9EDD9D4DD73A80C334B9F61993AF481C90B941F88BAEA2C5D81C0CC8C7A87F904D8E585FC0 Nonce = C21CBA5C380AA0BC In = 63799C2645261603ADB10942168DA814EA6B01 Out = F291293423FFF359AF694B7F52C5F78D76D516 Key = D5AECEEFBC4E6DCCA4C1B2F9D1790C060C6248BD94C1D8A84225EC00D2FA1F69BD572F775E164D4B9272EF596D3807D3 Nonce = 526DCB9D29074750 In = 02869B01FB21E4DF2AE861F797A5656F57862F79 Out = FACD3C19A2B76E2E1662914327826B8B9E7B2BDC Key = F8A1AFB23439C2FEF85E9BF6630F577134315689AEF881868489B0E1CB37664D825613D7944F673759B4B243A4BA0D87 Nonce = 1A07AD2392B75CD7 In = 7D6DC02743A82F9D2A7D9A3022A632CE0FDE60B5B2 Out = 0C776B17EACB4491D2402615C1ACFE46FB59F58F15 Key = 07360896E279D84C8DAF2CA6C67B8D8DB30F31BA20734D9E4000D0AA4BC1F34F8B433E598D0589B10CBF01F2FE23C4F9 Nonce = 227F43BDAE4F3707 In = 44E411A23B08D54ECDE8D99FCD089B3D6967F400A7D5 Out = 472077106C01A21D1566DED9D7E7517259F40AA541AA Key = 96C5700F7E8C16C9B199BE51191FDB317473CCAC75259E02A863557BE410DCD2E558F81D8DCCFCCE5C7DC70FA50BAD2D Nonce = 5FD5D57479014B05 In = 34A2E9FD808D0172666EE3FF26914747FD8C999FD9374B Out = 87B05D3D27567A568AAF740BC6FFD2BFB47081B6530F1C Key = 7FDD65967D0B8056686B59143AC98B86EA0C500EC4976A9B419935D6DB53B7A044DBE70C4B93D4FF9C85F8C7FB1003D8 Nonce = DD2E43A40E72EAFD In = B2EF1DF1B8265B7F8BE3A18D650F8CEE98C23DBFA25BD95A Out = D445FAB8CB5B88DD1E13D2DEECA82489B2732F1AFA9F59AF Key = 8198AF071EDAE7AA4C316C0AC2280AEA82BC9ED7FCF24ECA60BB559C1E6FA9A9A3A02A2FE7DFBDA248CEC6727293AB6B Nonce = D2F06EE207D0F0F3 In = AA45161FE3AFF8C8B5771AB2DB7E2C681F04E5E8C67B001692 Out = 3FC6BCA03D56554DC2F598F142181626CB5E8059B024F93F80 Key = 7863321EE44162E3F5B8682F760CB1DABA793D9C893FCD0DA886B2D521F7742B04243B0756748C46D87DB45F387C12FB Nonce = AB47B3578C27415E In = 80DD67385FC8D461D56D86AC9A5B33A47F39D50B61D037BD8A3D Out = A1398181740E1379CFF3C1A4EF7DA9393774DE5C013A46FCFDB6 Key = 69AB8BC60B6227975A5E254F390F8AD8E3ED4DD1F20188E730B395450D9316CACFCC34EEA68CC008764B873A4E8A706B Nonce = 82FF3F21B16D5775 In = 2FDD45060594F923731CF7C6324AE59BBE6AF2896B8A9CDABC2D9C Out = 3374F534D071E05DD40CBAA7D45FFE22CB9003FC3E84CBDE3C8B07 Key = 0F05EAEEB51C5967E5E1A7A8101819C8207912E869AA013E6BE32FB1A1C625C430E00292F50DBB0B23BDD8750EA11784 Nonce = D273A4E9CB94CBDC In = 3615C1398B7EBE5FD4395E84D551B95A7967386E27AC52DCA3D8D56F Out = 2F0DA401A37C4C734DD30EAF2B5C1BD5648D15BC9B2868210621169F Key = 2796428CF1A8DDEA1246EE9D4BAC6531F4EB8EA3E665AE2EB1162F7698D9DC51F9B3F15FB1DC836578B4956174150E91 Nonce = 897E8D993BFF8360 In = A252C9802B1F381238454AE68859A9C715B7AEDAF0278446B74807F97B Out = D12A4A1B01B1E24247D3E5508965727A1CF0133F1AE9D0E90CFF03134F Key = 89FCD9E0596A40B9017EBE37C3A75D3518285533173799A26E444B23F0E24DB070C3CC834D08851321DDA672F77FC7F5 Nonce = 307156BC32557CAE In = AD8DBD8D62E6FB60508C216EC7B3F5BD9B4A9F6ECC6CC00E9420A1719889 Out = 83CCCBF0FFCF4D4C833E79681497B32C60B1C18389AD5A954C48B5AB26EE Key = DB8D3FA7E248FDFD96B5964E4E2F6F724DB00A84B1A19AF47F57FA500DC146477788F837EDDD7E1E7E864864AB32645E Nonce = ECE48F3741CE377C In = D839E3ED9E55A7EC8B39C3F76C48D0094244CF5DE8FEC94D95EE079E73E8C7 Out = 59A69254B79CE95A9F553E518DE078C2ED46386F19EA5D9ACCFD8F16B68724 Key = BA868E442E8ECF78CE897EF30B7298D0D88E14B7F6763F8779C39C6CEC9F7CC1807A33562AD16F5F0A91381F3439492F Nonce = CCD513E94A91A33A In = 8ACD2DD2232484DE924ECFCA148CC2750BCF19AB5F4C0B842BC85136E1B39E6B Out = 9A9B148B87511D46D1B15DBB9F31D141EDE588F13A50446F718EDB32C9ECEDE3 Key = EC4194666285368994FE4A5020DA2E2F688D68DA5B06E143019B73CD49EFBF394E62260BEE0B71DD7EF133D88764945E Nonce = 80EFBAEC64855C45 In = EEA5D0D5AECFA03A0DDBE6690C07706F10EC6B48EEB8697C4ED415D9EF96E732D3 Out = 090EBBE41E2E4510F33D584B4A66BD4DB8D24BDC379CBB07106B22AD87C7DF8D77 Key = C187193AECAA580064B8D1BA695B8CD78718391FA3BB85F9A6F8AA272AF939C28EEF434F27964D72424A722FCFB219C8 Nonce = 114FFD04DEA7AE4E In = FDA674EF51FDB463346AE936811187FA02AE6BBBB73DE0AC8E325D7DC1BFF3697395 Out = A9CF988E41A71AB459DE50CBDEE960ACF6CF92F6AB5F82A8C34694E9B60675278E87 Key = 53338E70693A229B7C2111BCCA25452E931509A9F5CA6849C8EEBA3EE03B3639FD040E24AB5CCBC422E072C2E9892382 Nonce = 8A6BA30158DF0B51 In = 299778C0B4DD0CBC695BFD8EF0A7404ECFB340B2B6B6FDC469841E7F6AB487B4AD92A9 Out = 6AB6BB5D5E8918E8FC1FA83E3C3704C0827769E62D99221153E4554160CD5EAA993DA6 Key = CE0BD9F37CBDDFAAACED8DB559D40DA79A5361E640C239F12F8A16829A65379CBBCB07F973FC97967E00A3A50C3A58E4 Nonce = AD433310B6F024C9 In = B958D0F35BC231303EB05954159780EC464C006684122978ED6E6129F1E22C91E7B23C61 Out = E1CFA7A037C067CED96497D993D677E4FC5DEB8FFC307267D4470B6C4D81310561D9B310 Key = 5B4661B65F651D92536B55C24F9EED149127429F691FB69CFD0322204CC85705BDAFA66FBC93ED49D0F4F22BF1789D93 Nonce = 2459803996080DD4 In = 6BF6C007F979445600FBB6FC8D83AB7AE997D491C4E08AD62C0F682C34CC513AE04A9EDC7C Out = 26F53672104CA5BC1357580F7DAA433787BD1186232A3041AAF105176BCA0CA2443A1EA78B Key = 6367E933F46B1A0C9633558C80A0CE46CB62E4E9D915267D26E0C83EF11FC5D04F8E9B95B10DEC7A0BF9282FE837E09B Nonce = 7B1677EBD6E0F200 In = 76B85B9497522E19E1896532A979DF3F54E1EBBB23C72372B0558E590379AF3E9C688086D491 Out = 1C20111EB5B9D609CC22B5D58B6C8A7CB129D464B5896CC135B9609BBB2BDDBF9B05C722D784 Key = 5A68F18295A6F1132D97F51C3F74167394379974B725F143E583CF41CC554CBE73CA5C3EFAF1AB5E05AD724B2A67982D Nonce = 97C444FCC79E3734 In = 4A0336EE63DDCEE33EBF257B4B0D6F0F897A088809EAF4BF6EF71C34876339D28744F1FE315BA4 Out = 3867EF6DBE2714E6B92FC34C4A628F9CF069CF8B301F05C2E48698B560A82E65F6665962ADB689 Key = 9EA75A5CF2A1E94DA68B5551873D3CB24B7708339E33D9487324A6A17CB4DB2CB5D3ADF181614749420DEC2047E69D37 Nonce = 52564631370A6DA1 In = 8AF292869468D24D2AEFC76EEED436DA13E134FCA8BC02560720485F756DD0CE8369F365A67FA0CA Out = 33C50E860C301EE73E5B92DCAD1F0AC7B2884D4B8470B9B436EFC85D84AFE447885772FA87105B0A Key = D2500D053E6F039C33D5849CD266970050445CF82D394AB5849AE9BE83F2FE3DCBB1DD5050D41680AE98C103E758DCDF Nonce = B345479C897450FB In = C72EFF80BB0F2DEAA0FB855DDA8DF7D38F7B00EC1A7F6119FFBE8B2BAD113E6E70875ED1E294A05B09 Out = F6C2C21ED43C03365259572B2B4775025DCBDF0240C8B5BA21D44B4C1DAEACEE2D59F2FD82334FB2A3 Key = 765720903C07FDCC34AF41D64D729F2CDC8B8FE4AFE83D5133E4D0A380769FF6FBB49CBACA8438AB9A34B856D83F1474 Nonce = BB0AD4434EEB88CA In = 7BF9F9A04A2445E66BBF2B6C79E988EEC58D5E6F556904147D0C8C09F9A1B8C3349269C30FC4713942D6 Out = E5D1982759140D0D8C4CF4D52C18D17FEAB91B15B454FF60DD5145C09BB92041F570A33BDEF53C45A239 Key = DCAFCD9744FBF18B1351F1021612240B1B4333BFE0C8A638210A730FEFFAF0A5B2C9769322ED84CC084D1B11142F8167 Nonce = 68A426CAE0CFF7D8 In = EBFB3E083BD1B0B0620579C6349AAEF641C0231B28AFA0CBE8E759F32486A113EAB2EC27E749D46677889C Out = 0A5E9ABEEB628B6C0FA4F61AB3EC581C1DDD7F3BCB8B0F40D42D2EF42E86E341327BBA97010A2DD2B4BA4C Key = B1926DFE6503F66BE119D426827FF29B734211C4B86C28614E567BAABE7F4CB54D3378C9DAF57422FC76CFD1125D0217 Nonce = F2BD1D54869CBFC9 In = 3814FE7BB60CAE10DE6B3DE6E5F6EC269B9FE5B61F775FF89350D13B8764F0F4119C423FEBC3ED3A9A0A3044 Out = FB620A3222605A767FE6C7A9505FCFB6FFDD7FDEE7C4C1784EFA1B38D27FBFB22FC16F8F75FC6BC666A7AEB9 Key = 7128048D53AB24CAFBF106CA749DC404D72765C14DEFF45B184E23A8908E9B66B44EE78A8870E6080CE9D199372E1BAF Nonce = 5394BD5C1B6259EA In = 9B4337D32C2F17BC68D2FCF4021F841FABDC758EE66372C3AEDF000305DE591F8590B0F4D07FE007E1C30D31F3 Out = B4B0F4DF9160AC2A51E72FADDF9740099D0F81DA1B123B0877329877FD74C6B6362DCD4152CA28496BCF5D5D1E Key = E4D43CFBCEF4A861633ADF96835953E3B504B01C5C7BC9810C0A26DD55863F62110DD3A53F5824B16027D5C77CE062BD Nonce = C74532FB9F255125 In = C41D6960D546C18B44078A295A6743132814ED943949F3CE620B17DC536EA7E77AD5818E38C5C8462313A1564DBA Out = A9AA8A908C8EAD3EF3A3A088A214C321F27F99E54604F5806E43506B0D0A2760471A41EAB66A2B536DA999B3F19E Key = AC54274FE612D4D4A05673847593EB07CBFAFD2735B30AF6155A72075C195E3BA975808E61EE1EB16757D2D5076FB923 Nonce = 61F8987DDC762217 In = BC5DD6D4AE7FEF35BB0686CC95AF9CAA46E6F2121D9BDF5415C9FF1E4CAF05CE18D108914D7247C82E15C2BA3C9998 Out = 9DD61DCD613FEE8DE8841E94A2C8A0412AD2B36B408F73BDFC12717A68C7671CF50F40BAA6E74F9BCD8AEC4C62206E Key = 2E76801DDCB5C54A596F0FED1B2949AF267F57DE2208CFB819AF58D8A39DC63F4D24D3796D3B6F6CCE1C429ACE1450BE Nonce = ED3BE87AA83663F3 In = CE18C25075B4C1558F0A40A572A98BF90F99C7A943F205AAE5A3C2CAAAAB82646F0BD2F24EDB944F44F6DB2B987BB50C Out = DA9212F2A27188A29AC9E696BAF55464399CB5FBDD0DE2343B9BC1CFAFFE0AEB69B36B16A3FE9E145616B5FCE2CECCDE Key = DDC4555F64F09723D423F89DF90FBFE51B1B7E25DDC4D33B8E91416F772621FE2103B45C9F01BA7ED79B987E080DEF37 Nonce = 6B597FC12C2E50E7 In = 9F0C08508318031CBC205F7CBB7C5B71F653A6A5ED414269B63AB51274899A36CD9347175A41D1E48067C6825EB2C08E05 Out = EC310F36CF71EEBA986B38FD54A3C8DB8541D955DF150B36AA71BD2C318E23D77E9407C7C299509F08E96DD974DF0EBBB1 Key = B0F597ECE1F8F996C4F6FD3E9FA95C866E95C31083C11D80084B99FC7457682551F52A011FC3B9AB96F43E64EFDBFC58 Nonce = F64A6E9F42E164DB In = 7124FAD711B1C3E3E5087E49BF9A1CA98673C7C5592AD8E9314AE71666AB653F4816C97EAA9E50FB230EE984E41124F27028 Out = 50524698ADA62763B48BAEB8C1B416CE7A904386A65BC6B58A5076E23C9C3246481799F279F1A121E0876709DD8CC86D2556 Key = CE9BC717716E45E1B2EB93A5AD9EE1249909CE903BE15AC4A398B95F434DC4954BAC7592877888D739E464492AC02E02 Nonce = E0A6F81C00EA6A69 In = FE763D8179B6777D0ADA001F584956CD0ADAACFC6E07666218A5EDA14E41E3A544354C78498CB9D2729E559524D704205ACACC Out = BAAEECF33E93BC5123099C33D5AB194A944782E2C3CEE9BACC97DAA54632CC0D6D2DE89F924FA4216D8DA11CF0D4F3B993E7F5 Key = 7F47ADE7334964A04008B731061B452C77FF8E170FFA41BB54F51801BA1B933E38788F8251F9B3A2BED52A204C312DA3 Nonce = BA9CF264B4EB2A47 In = 8087C8ED9118E03A20747317DD147488DB5C2E2D43543FCF49E0A26FF4789BF7C76334F6615A0670D0600F295876027A7C2693E9 Out = C0615E9A540CB52C92C397B986454B688D85FF9EE193329426CCE3B0CD817263C038002B33D32BCED3B88C04972EE938B130E787 Key = 7BF4EB01A8ED3EF99E58173B61EDBE5247ADB52CC1CA2375E239747CA4E56675D5EE7910EEF6A283C576DF9A67DFE3A5 Nonce = B12704B4C7A8E537 In = 20EA772DC8F686BFC66E82A02B1CC505CDADA444D3D9B9F63E1AEB6E752765DD394EC68264152B50B4356C1DD41C4B56966BB3C66A Out = 051929AC82505C3594A3A13E3D6CEEA2AFDF31A4FD0C2627C69321ABAC37784B297AD55134B5D379021AAFCAB9BEA0E08C508CE324 Key = 604F13BDCA8FDFF10CF0D55EC09DD03C8E935595B47D30174F87B53D1E7B7ECF1048BEF3D4CDC435C7AED84D8B1AFDC6 Nonce = D31DF8D646F20BD6 In = B305C979FFE7BFA16A18CD2050547B39EAC2446D9013AF6649A04296FE3F2660B4C973FC5D7F152CEB519F2B85E46409132DC51FBCA4 Out = 438F74156B7FCF48132B50FC8217CEB943937727DF55C1178D447BB47DE2807B4161B3C35B0E4E22ABFDC7C0E6C6AE3AD3979921DF8A Key = C6C183AA28ABDAC87EBCBFA70ADDC058BF7511BFE526FA59126204300328B1D38A22B64D6F4102E6D7BE50DD955E54CE Nonce = 00F7AD947D2D8D23 In = 4C8266370CA735C9E60C92B34A5CF59E1914AD741AF71A618BA24EDBF9B325ABE06D223B0D22B60534E69F165C0698BCE92B271340E4FC Out = 33FAB26D0F56F4E86922FFCAE59B3C5F4809BADB5422AFE2FADCA8F98E7B9DB3147D2FD21C63C212F61E6DACF5EC58302F479A3832686C Key = 39558A42B17B0F10E3F8B3764A9AAC435AB995866771605924F54EF00EB2B88FBDD9990346499DE4642150BEEA76CA43 Nonce = 94010C456BD7FE52 In = B825E025DAC722B990F294A7C2346D407A1D335768575A26AE8C7A0183118229C17F5D1DD117BCBF36CF673E7042ECE70F033EF21488AB23 Out = 2949703DCAC361526436DC494B9857FCBA4BB1704A7F26C34FFD5E3E7D4C45A310C361FBD5DF17A7B3AEC752FF612C8846445163BA75992A Key = A422F5FB8730DC6268916618FC1C1AAEA5B4FF893BACE974835671684F7574847F0EAFA0AB44BDA321751980C01A6DFD Nonce = 962794CF1D474EA7 In = 608DB3842BE258F19115A98EC085FB84CAFB02B20F85750D549627C4C85C447D3481AA5A64C8422E88CF41A76F6E36071141A4C9F7BF0963DB Out = 6CFE5F780EAD2ABC377D179978FDD085EE4363DD40ACC0638DEFD1994C7D430AC6E0008E4BBA4D1D30D9580CCD7422C02DCD93D72E95083344 Key = D2C95AF5FBEECED20892DB9C0C57A5283F53454CEC8E5A5D7354287F27F2AF468057353D8BA389F13BD777F98A3AC2E7 Nonce = DB4A8E90D80EA230 In = 77ADB2F576D4A7CD951389A057FA5CA855B7F06E3940502BC278FF6BA759500E1B2AD113F7B8BE187455700C2E10F55FF7E49C8A5F5E9F0F985F Out = 5705801A8A555BCF56FF4AFF1523C05810797F1F1FBB5272BF7AA3E3284321CEDEF96F37F1888EFC5D2629ADC0D69079B59F8D98EF2044CFC172 Key = B33E02A74B493C1AADF8B3E76220840347F7A6806B7BC4B3C359393C0644B6C0BA75DE92B562C1B743B42D0FE45F80DE Nonce = 854DB904B4E1DA80 In = 96B8FA71CE93C90BC6AAA009CEF365367A5D5C52CBCCDDFE185A848BFDED03E564FBD769E56992A0D339D8EAEF2FFEE326631D74F8E6B87AE77F39 Out = 81D0D4025BD9D3ACB161B938EEB37BBDD3FDC5DF2DDEF36282D94A791FA59D5AEA1964499987968066865D66A9BE47696BE585310D52FA32AE7452 Key = F7716AD1D000B4DD875851519F0097709C09B6200D8BA9DB6F487684B0B4FA0E4D1B1D2FDD247E224CF56EEF3FE05ECE Nonce = E5D4038BCD2DCACB In = 05F03AD7E91D1AF05D86DF61FD4349518255390E7BCB9267F12932E05013B9ABD32B3E9DFDAA58E1BE470D9F3F075DC29406B6617B67B4135C50E114 Out = 76EBD2C33DA09E65BD24B1EE18C421621B3162BB35D23156359B02B6924C82B866CD87A1256A1318418A993F6D61101737AB5CC8DFA7A05AE3F22C64 Key = CCEB436B623C2BF464BABF01AC88F9D9BB09AF44AED4A0D210A1B5AD3C724BBD3BCC43C077FCD7255112F811A96C7553 Nonce = EBF874E8A1D35ED3 In = 4127143844722CE1FCBD8BF9468CBEEB347BFA24E082D131C2C2C787457F46ED2FE674B2F323D6588FF9B6326108291BA2DB11EBBDE3D7FCB313BAF0B8 Out = 5E784B084FCC0B7D9C8A9277472C551F4A2A50D47B832BA021305C289A719CCCBDA0F724D6771EB7F9B00E9E4019724408BDA28F2D34896063AB4BBAE4 Key = D5B36B7A57B2A817148A905A781BF015B2F12EAFBDA9575D2B0EE777792DF576D3C3B596659FEF5A66521C1E9165C65A Nonce = 289BA40CE084C8D5 In = F87DCA3EDB085856542104A39C842F2491A78965751F41257F131FF937B1E425CB358B6DB36C7E2AF8D44A4EFDA64DD3B627557E4F862EC2038143927C99 Out = CA18DCF6397F0946A4E8A557B86FE090F032BDD69D4323851025921A1599BC50A12C61BD54BDAA7D4D7D16AD539FA2403D7D0F0CAE162AE0D6773EE94BD0 Key = CA46EAFB21A4F619DD77A9E1562D8ED1B88418F9514D82CD5C4EFD2183EDFD163028A31125AE86A14E702D9990E058B7 Nonce = 8A85176A33215451 In = A51793C51C9FAA514DB11AAF93AC334A7F810DFCBBE0728498B396BE7BCB96BE15F63AB2AAC71D343B73A34129EFAA11B52EBB2C77B93FF813EB1F35486787 Out = 547B0C7917CB199809BD8F8ED7E783E4550A44FE042470B2C1D729C7455E19C7CAD27F64F5CC59492BA72A403C57ECBB42E34C48043A24B176D358883B2DD0 Key = 3E039B20F4178C25C9F45CF8C4C9098CC8C2B61D25F9F4492280074C4E6DF7FD770D0A78175A63E4FF19B9A72278A15C Nonce = EC0A8C77E6E1E39B In = 6644341E891F31A165A430025E3CC1C8890028189DEAB8662539BEF058519A4D350A46E26C04D14D5BB526B9EFE0718F5E8BF28788BBB90342004DF0E15ED2E8 Out = 41C9A09B2640B5938132A50C2F400EBA6680115FA76278F82D2615E3C4BD22A910F20F00B4965FEB3AED28367B888041E7EF4730E9046BA21438CFD27B5CB71F Key = 25D2754D0E2F106DB93EC27F47168972C8DD54FB97E12312909AE6C236A104D0A339FB793B1CC9C8227EBF2BBA8C154A Nonce = 6D0F264395890B48 In = 595CF308FEC3BA026D24ADB2C3358B3A69E9DB297A55B5A5995D0096D59E206894FF10CCB74B2C0DFC6936CBB515FD2B2B3A3BD0826CC002ED25E862E52FDC9F2A Out = 9AE1B1A56C2E6ECED863F6AB6966A4048F54AD79FF9A8E4377F6B2E1D2EEF7999C7F41076FA7DABECB6DCC4355534E5A42529F2E9008EEA7FD69D3EB2F6666D5C4 Key = BD69A39DE39D63357BC0C5664173E37BE71D8EADD0B8881DE396B8A616ADEBBFD0B26EE6CA7A94F64B230A1AD2048698 Nonce = 77CAFC7CE1C7AB65 In = 15335851AC3B41ECBB11C1853F1262F4D146F09BA95EE5E61BFBDA5912D6D76C8B53246A8AD03A6BBC2EE3523170C2E13E9A6D7622F1AFCB1512F06DF78D65C40421 Out = DC6F0BB8758D6422494D5A0BD8A7B97BD791CEE221288936DEDB596F537C3FF7BCE04985EDE96AF69546A969FFCD380484A2AF168A96A55CF3D466E001A7B9E6DC86 Key = BE5E0BB2CC8EDE601A0F1F39AF998005D3C930FDFBF072B3C857164F48006AC8F40AFB45CCAD8EA47AE439A44D2F6242 Nonce = 571BA076E2AEE410 In = DE55CDA2C48D19CD1634122BC99BE3F6FA9B4030C4A95233260098CD1365580FD23EEA222C694F99D4F28C7FB73184F6D90BF83C966EC73178DCC301A594C395CA18A9 Out = 8E226F8DA16C0D37724A6AE6BA35F8310200C7A636569432ABF97B413F42D2368B49AF96E44FA953A868D5840458FB578F4FFB888342DC51068136AFA321C2C9C8D673 Key = F78E4DBF4666041C85A4D1BD8E41E9B6C6A812E23D996155B924B221FB32A59A6E4038A1200847A33006E7B6D6276786 Nonce = 701C94F617ED4183 In = DFB35E713B97B554E8C2CB6E67D19D33F2E2180C00F1BB131DB9D5C525DD35B8C9E640E5B9650A0DFCE53254581B87B4AB8E8793B40DB50874D4EBD8319F5AB23518870D Out = BA1BC58692C5D2900743B7F398C283F6DF199E65E760404B16B4B8997011DA502CD119C97F1F8192D3A95259763B6685F52BFE80C69747E555650C62E501F40D0A4DAA43 Key = 9516FF82D3A3B84A087E99D15CB10EE198B89322DA03F42B22C8BE90D4CB652A95333F4F6D3532F27D20D3E8AB3E7694 Nonce = A71575080D5811D0 In = 5F4CDA0DBB40C9E8272CD0480521726E8AF0814FED9535B03D980C389B4ACC86B15354FB0EE1E90C5BE845832E659B6707CAE99D4B0254F6C1EC1C1033F68A1BA51937A6E4 Out = 17D4368D7EB5405E1200A80E45819DD43A0A450D257D5F37D585D8DC975AAFD5A8C3519AB17D30F3953A6D970BB13FBFC5055E6783BE529B0304E31C0293E331FF37A085BB Key = 2096C4B064315C356A4DFD0065F3155740E33ED2DBC687D0CFDB543E4B04C7BC6FCDDB2C15768C90779D72A390B7A8CA Nonce = 11A0382CA4944FB6 In = A45A94B08ABD5129115F796A12ED6908692FDE75950ABD23D3B950C908370D6F079840CED1845400B7242ED363C203338A616EF24849AC04F79D4087FC1C0AF83067C91A85F3 Out = 024FC771952DB3472630D3A0E5D40493AD29B514A1DF20D204CF22CF3F364C52A6EA46A80ABA899783F3FFA58241A6DEF5850DB5EBEECB5883A687116A41C5A75351DB460508 Key = E4345C9D06A8BEA3B0320B2BF5E3F772368FE7C291C50856D76ABACCE8031DB3545F4F9E2F9FD7831342A4038C4A666A Nonce = 3005F1F0400B9429 In = 9F0CC6280A56F1AA35D292153B3CCA4B493F823E28204F648F181EB4532F53D59CC314CEDC9DEF147F2D5126AE610A5C570DB7C2D5EEF17232D69A4ADFF77D1C9C8AC26CDA5510 Out = 399DC10E75CBD29700CEC9DAF9B6474E3EEF71CA051ACED22C7CF96E46EF79538D3312DAC7654F5F59D64C8969ED882E10829D3E271B9567CED2246C120DE327DCD50D5B661F9A Key = 05EF770E99C4B9FBAFFC6680723E225332691D0274B7A9D1587C5B4165F7856C05330C8AD36B542F3B9061ABE2E4D8D0 Nonce = 603D1DA619FE5A6C In = 65C8F136DE4A255A2F7AF15855F3F3D058542768679CD4625FB42EC9BC23E0F752BB2D8A4737B86D7B250E74D2D787DAD0A1648534AB0E0EA35A6420AAA07F380B945E0FEF6010E2 Out = 57699E2B659BE5D15D94E50103D1DDA5AB3B89799CE3CD1DD48D587279FBC6C3B27500D115C0F18C50959EF60E811918FD667597983D6CE6F5AE92D7D35B2A54F1DBC9040BD84838 Key = 4444C76C004E32F4D86FFED0FC6E7F125FB3B97ABACB6A963B4153ED6F6646566F09556B0128508A2EA704F425166BA2 Nonce = DE890A23A97AE34B In = 0CC3DCA7C22D142FBBBDC28365B983B0B602E3661F6DDB57A13A78E25130920E63897B1E5D6D0A255410CA31589B4FF012AE8EF7D206276AEA17280281C89B5E90FC92CDAE3E90FA2D Out = 544C0869810FE42026FE2282BAC76632A869A5EF15EB5BAECF7118F913A09FEFC32EEED3F9F057522E1914843484ADD60F5A5E0C8B4936CAF22A2B56C2FD1932E6D2F69E67F0501457 Key = 2CC18B3F45FED30C9BB3E0C6162103D7F6383580DBA72AB3EDFB6759DBED7F2CF75F494A8C8C2018155F523277CB1E33 Nonce = 59B170E468FEEB18 In = 46F56453DBC786E69C7A8B8343B44FA10BE3B62180D1055396200A4DEF7CD16B3AC4A11498AE026DEC225974C074CC05C2E38A0C3D9863564D06C4C51363BE3B34C6710A1C50A8DC4A49 Out = C7ED5707197AAC74CA3678C435915101B7F01ACF70E6EAE4CB620627812FE22AE6FA729C0AD641D1DD047916AB127AC4340CE5E2950F59C13BFC58716851EF654E3CC8A00E1F7F9934E8 Key = C635A07B528B15D341FB3938FB1867A86637E41F7021AB0B2241A202220E83FDD05C24A1652F2624F9FB43ADC75D1DE7 Nonce = 25622E1F1E088394 In = 4EC76D991B2A572B95CFBDC1B5EF14C40D623B60EB5B08F49387861F13A0C242A017D608210260FF457701A732D1FF43E890EAB0AA8D88FA414E3E313D166B024F8138732A9A69342A082C Out = 75ED6A26E516620792BE14D58C314AA9668F26900026CC814D9F33262896F8D613893C5A1249AFE93B978487D44CD09FECCC5AF14C7B1D228B4D4255A3BE2D114C2CE7CD2F19D6D925FC5F Key = A789FAEBADF784EBC09697E4C7B7DA52F3EBFB682FEFBE6D6871BD1EA9E2072BA5161F8BE55D201771CAE3D55847167D Nonce = 48218CCAEF67EDE2 In = EBE4A217240463C52F3E367637E35EB9914D1DA02A8E6BD1928CD70855884D2B5B1B20E1B32A22DA27269FA5FC42EE67D268D97D460BC5EF93015859CB4CD34B7306916EDA42DBFA52D62EE3 Out = AFD1396657E63F6B15C8E5172A5C98270E39BFAD0527A14CEB81DAC79894367A45CEFB48033B39562DC1B23D7507E47DFBABE91656CD11A26B6D20EAC5C804ADE02BF11A7C93D9CFA82EAAD5 Key = 2A70AFD8A26A592A112B1CC8A4DE1C03DA4A2E71C7375B256842327624F7D455B05135533C526D3B266B80402E97ACAF Nonce = 6C6BED5ED438A4A7 In = 0C49C0FEDC9D77D74EF36E5721F8899153C48EAB527AB6F30C688F7868F79CECCB80C03646D065724A7F5A94493B679F69B4C9B7631F5D6E51B38277D101BFD2DACF5AB254A35666FD88CE199E Out = C37215DEE1FE39F6AB4C33440324F9C19C8DA2161373D2881859E948AC2FEA191E0B219558C71358604CEA53B2A65D6E1AFFE203A737D50FD1D358495957B2C0F33C33BCFE7D342231580532AE Key = 297085093FDAF2A1DC4586E5E2001D0BE9C03C667350BDF1D08C95B8BAD0E4E91EEB9CC01612BDCC142C0C78001B69DB Nonce = 1DFD551688FD9A60 In = BD7CD146D054BACCE8B0EB21A59ABC1FD212BCC4794C0B6D600D153CE5AF65D9F9BAB5C2B5D0A5E25C1039366137A93ED2332067E89FCFD6C5F6B5565C419C6A3938F2473B08260335AEEB6C08DC Out = F3702FE8AF684F0FDF7E85AD786F5ABBB5DA3F14E7F0F89023BE4E0B7409CDE1BBD151BB3F9DB1B64F731ED2092D48E534B451C562864DB827EFF56B5CCD3F6B14DBC0477EA245618C1B2F5440C6 Key = 5720AA8DDF38F0215B1BCE8F7B5CFCCBD4A7C8043CBC3AB370FA7CBA0474FC6D25D5B2EC2D5A0C748F63800F530DCA9D Nonce = 2E76E771E3FB53AD In = D457E7E7AD66A8D7CB07C9C1E454CF8DE6E9D97948145731A8585078A524182C25D9D782837F09A52196AB5BF4BE30108E2AA7984636BE4EF79966D72C7D6C19D79B7A50A4C7D5F01EF9124A6660B8 Out = 379FF84CC48112FAB0633FF279636366F0E9CFADB453AC48A74A9A26DD7DAB304DD6378AAD4AC5EF28AD0F4CFE809F02D2EDD3FEA11B13CB7480DD91A3F6001FC3EBA4C80C31F5A562CDAC532DD8FD Key = BA80F73C66DD7CA229B6A845EF43DFF5524DA5A193A6BB21FC3CC790E1F0ACA4B00606E4B39DB146F075ACFF7BE4E241 Nonce = B960B5837B4034B2 In = 00C62822BFAEE16C7ACA5C16AC2F55AB52085716E89EBA9629394A44E86C2F858358ABB2421F07BB3F4FEE3D1294DB62B6FE9CACD797FACC8359679BA7F17B9EA7E10212C74180017C8D2FA5F6498B1C Out = 6ECCA8B79406B8229FE44845621200AC352DBF6C1ED5937C47AAED3ABF8B03904D7E701752FED27D91A5151CC00885AE4D8A7A58CB1F6D31B9F21F699B03E243FE1BE597B2114EC61BDE14A4796E4417 Key = 058768329BBF2E5DB735023DA3FF3D8EF1D0471C299DBAAA95AF4C10165720115245586CD5D0ABDCCFA3B52F83E36A21 Nonce = A1235BD14E93BAC1 In = FDE0BA5524C3FC2C69D0070E77DB96B4AC9A8BB2EBBF3DCAA2E1E577F562A794BE43FFD498DC0A03D79176C887363D746DE3EC65E279145EA4F0611677BBBBB4B3F203146123B2F7968133A888446E51F6 Out = 53B34B147D2E0926AEC3F418D8AC5ACEAFE3BEC4B7EE675ED84EF2AA5B439E6FF66FD6948C376BAA071E2DF6E0AFE7C1F0843C1E20251295CA83BB30735909EC0C899A12904DD060ABC3E100C87A3D72E5 Key = AE1C6312C48CD1629A606389D1877E3C521B5101FD4CB760A87E2D1C1ED1D996A1360C241FE36E2110D9556666C787A8 Nonce = 7DFB18B303AC12FF In = AAF3EA1783A29E2273361063A0D41610FDAACAD6E8946E86C8874508BAAB02BD2D8EDBFAD03F3D381E523EC5D6ED7AFB58EC9B8609C6735157AA7DC4F3F1052BEABAC974E89ABB18BB260953D591F2F3D1ED Out = 2E6FE67EB83E2F436F8C0FB83DBE0F7536166757E7099D1E1EA6946AABECB6E02488DE9F08EDD53527A2D00C14A5EBB5FD72AC5577A30B0F95F7B2CFD86A163B80069A1F1C9D532C715750D68857404EC03D Key = 7320E6495AFCAE1BDC67C72913254DB148B0A5C85DF023B308D3C411EC37031EEAE5CB51DB63FB19C67151FED9CC46E8 Nonce = 9E7A68212564E863 In = 3FD52D0E0CC3BBDE18B17632E662F0EE11EA8E1C7B148B630DDD1A6F01025E3DBEE10DF37A9196ED4060A8B34FED461C81E70FEDBC521A83A4C2D47C710E4D2077A1273FD43242D6BF235E748942C640B64F9D Out = 4B10774B3665EA10C53DDCFC1C9A2B96B233093901EB037AAFE9450EBEBBEBB56CFFA65D2B6E44337616648BC8E2341EA3ED0F5811402DF0C6142AEBF0C5A30B2A05D85A6F94A39B6E284DD8666325D0B7D8A5 Key = 258CD6F5D26611A0D8035DCD1C0F26E0BD86B40670772BA7C9DC4DB18AD38F9573D8C54A3CFC30862106E2BCE6C7A5C6 Nonce = ED8D0BA4895F10BE In = 2CB8E796E207320493DB417D356B44C1F6FBC0E68F23B9371AC75D40F37089C9C3FC9E0A4A33705E27E41152AAE27431FEA85BAE1607F111218961A18C3234DBC0D41D172D14EEA038DDD971A6E6AD9511E82650 Out = 87679F1AC604328B6C9B55C56C16505969FF9D40D1C8EE0EF9C9A9D5AB0A9510CEEE677B752725B1D00916E26E293FEEED9F18F17F8BA9B77DA3BCBF591D0D67DBE57AAE4AF7843DD176471528094A3A3FF2AEAA Key = 641CB0E9630827685C75E93BF0324543337E877F65F82A86FA352C00476467BC3B4D14997CBD00BCA9E37B24A6F8F1BA Nonce = 6E78260C205DDB9F In = 3CB66CE7DF4672FDD6F8BBE90754BD5BE92766C2EDAE10752EAA0136E81EC858EDB967F7C071CD4156C4CE54B14C359B7B48F88F873B464994F12129EEAC74CB02FCBB06F1A45A1EB75E265975521B2316E6DEE4DE Out = 2CC2ACC835F3E84FC6AFF725C290DAE36E67D7CB87162E52FCA1926EDA3C9ABEA5A5AE623B25CCB1C0F702E55B5430D30915851D4E331F5EC8A0C448E8529E25C3718201A536E6DFF6EF5C67038F8223EEDEC77C84 Key = 7AEA1836CFF6AE59E983007C0241A61D732A2E53333BCB7810217D06AFFD79C1A6E8FE9079F44FA35E88E00116A5FB3B Nonce = 805910FB562E63D5 In = 2A79B7999079CFB7F63105C7AB916B9192380148FAEEDEBE5567A791ECCABC85ABCA1F272D92484C6109C198E9BD4EBDC7F3505E93C3BA0F9E59E92DBB9A69CCB65C22BFDD9D2BC1F329BD80F3D327574EC86904B0B5 Out = 0FBFE0AA25EADC66EED7FE1E8F3F982CEB9911B8A97BE1B82879C6721485EAA6F4B380D02A056C9E85F0417F39D31E42DF5E9BA117DF036F11082796706A3CD7F23FAA5BBFA59231168F37698C962FDCCFD9E968613C Key = 8CCDE984AB70A7ACD1DAE69F5109576F8C808D0B16339B6B0A65B2E4712E6EDD62159F1FB65FC9C0BE28433DB982DB3D Nonce = 1EBBB405BC55AD17 In = 792990AF12979761E29B4AB2B2ED3A895122F062F6CA099D73492175FFAEA0AF87003C433FFC8AA353A24811C863D80E6212BBACCCDCB9FC0281EA334A186C929C73881136D01288E44D98B79503EDB12B9C10275ADC69 Out = EBC43CD03940FDD38213DF9FCC3D75D112FE8A9B1F5FD4A06947A79BC65C6527DD1CCDC49D67432454351A7A289B2AD940DCE432B23AE99A4897C3C7A138470D92FF497D5E88F631B93A9935C85F8B5FD404EBD41F2324 Key = 759B59DA28602EE92F28B80C104A6D243B33303FA93D82665B395BFA2225F1213357D1373C8BDEF253C609F89D55DB0B Nonce = 3D7C31C77EC2433C In = 7BDCCD1ED5C7C58AA8C26EBC10FA60BBE484F26A9ACE21FAF753C95B013B6812283AE19C54EF8BDA7308C9E52A4A0E19B5F774FCCB1803585ABEA0931852EF74ECD087AD748E1509F1A22E1278874DA8178FE725D941D417 Out = C3F08696882A472D3759A605B577E4AEB9B1919416C194C550DE94FEA6B305460D6DF31B0907B5849C1ABEA0CF500D606E00BA4374ED606067C7A62816AF09432BE5EA6B7FDFFFF14C1E8A633A42E56EDE07D114582C40FD Key = 5777CBC6401567254EE47DA378097CEBE744AD04C03EAEBAF38C097A0E53B25556CB1C2F9D184BA920B40A0595DAEEA4 Nonce = B6286B46D5FB2626 In = 32B78D9F5953B9CC21DB7102544F810B68B469E02A9FA6AC0AB4F03B732737D0EDFD7836B0579E4D3A575E7137C67719A57BB5A157B9EBC8C783426B35AA338EDEBE5ACF9FF475D22988277D74856588D86D04FE11F18E73D4 Out = 4A9A71FF4A63F8DDFE8FE65DC8710F75AE6D39C9BE50DF5E4D12B043670DDD29FC69A70F52ADFEBF75B5C56BFF9AED26B679F5D7A368CF8E210D4D7366CB1C436B1CE153B957616A321510F12D5DFC4FDBBC064C4558389478 Key = DD87FC5995355B2DBE4536F2E71F5236D4B449C4DB2B5537C8B5F190DCE575B5ECF8E9F04999BC4488F639B9229B5046 Nonce = BB0F33B6CDC80B04 In = 10E4881483058ED082484505A21A951BC3C3BC0F6582474EAECD4FE427C266CCA872793E09B195C1BD03D821AD71442905621E5EA86C69466CE88AB676F804CD6A7AC8AC633CDD1DEBD3E972D787FBD7AC100FF39CF6F0FC0CED Out = F8AA3DC6043D41A2D77A1600955881223F08AFDC3F2EDDA6C0DAAEA450A26DD4CDBBA6C8E6384F67F6B560CADE852525C903AAADBAC0DEFEDD3C2083B1EED43401690236BE280BC6BC1BB736842CCEF568C1496358CAC7E613CF Key = 9B02C6E552A553CB3D5D8368D69292278557D5C917B4F2219C91DBCE20B54087233E0A09B88982841DC59C97CE270309 Nonce = 528D9204AE720AAE In = A46C63CF901DB73CBFA0BA50B2EF6BDE63136C43DBECAD130DED170D5984CD39DED0B3224D31D051427239CA6A1C7AD610D40CCFA88C7266A60A391FE2C7AA9C6654F6A8C5F40233422DE4273644194B7E61B65F36404820A92222 Out = B9F8099AE4DF4C95954749952E5FD52E55DB935C7BBE105C58F7503F077EBA8057A80DD55991FE2E7B92DDF3F39CEF6710956F86647887A7A0F114647515A440BD811F9EC635A39A0C0859EF8A6DC0F37D308E72834B98D61D6BE3 Key = D2C6F8A0F321983779559B315F69DF5802B121C97DFAD4A4612B510D9AFA4F6DEB09E695EE72FEB2270F2CF8CE10924C Nonce = 88F6FDCB170B5823 In = D3CCFDC40C2986C6DEE37EA1B1C6D33D460AD4A26A75C5289779223C3E1474D05C27B8EE8521FCFEE5385BADB2ADE1CA31D18995BA5E12EFB0D7B3396E39A6C239C242AECD14DB7B786740317E96BBF8EDB8CDE1458FFB347885D565 Out = A4788B32E8975B9AC394C7D83DA712572DD81ED009CE4460FB11CEB9075CE625E2639EC5AE48A1FC7E632B02C8C6CA63BE09D48B186BC65566EB370D3CE24F825553CE553C16F2FF5108330673E10F14E76B261CA5CD5F87E418693D Key = 83CA3EF06A15B4F8B527B67A652F1EB2CE068411E0F2EAED14AE693880D66C2E21911535824B9DCF584DADEB97630ACB Nonce = 15119A3F0E54DA4F In = 1E14C76EFD5791F000A103BA786A43877283684B0485582BB5A4F96213D632B583116C1534A7D0E9025CBE76C557AEC9DA04235AB26BB96FC2D3115FDA6710B855E3C382458EC465F13182DF126BEBDCB94014D753A4B0A13991B1FD1D Out = B59A09B54A9B5A98616EECBF20597D39675EE522A9CF7AC2540B50CF5C2AAA619A96F05CC8D5C39161C1D5F6286C108B24196E9D82E501A9E89062B296808D367D8D8C1F79A07DD26F3E7E5B0906DB452D7DD987DAA0A0E360CC5EBC86 Key = 9DC683A403924735B95D4C747011C7019926AEAF260C1488064AF8F258CA290BC8FDB9A777B3CC1BE0785C54E4F0A0C2 Nonce = 456851BE6B78CD1C In = 89939F837D7EF2FA6055C4F3D2076C70CD392D40ADFF63D2A8B4BCC6FDBCF1466F34F1E6892ADBF80AC6D9A2542CAD67918F0CEE22CC06667DA1FD603607B90BE9B4E5FF98201F339E40086726FBCD7EA2675F5DF23AE70D5269DD8A1E3B Out = 602A85E8F4AE898E1AFBCD53098C9C9DDFED6A3DD5F953ED9019B2B45A5CE539FC86E484C0BB062ECBC483067637F83983FAEFD00F5EB08A7F28B45361C05E17DEBB56D4AE72AAFD8769C3E18BF0170B00C3ACF115E5B03A3FDE9D9D9A38 Key = FD3049AA473E1A4B4B71ECAEFF6354CE4E7B2DCB212EFE01A171AED3D4A3D85C73EDE789907FF5759C7346B5BBEB2D87 Nonce = 47C9EFCFA01BDABE In = 363572DF82F8FF530ABB987648DA64208635B3522CA9FDFDEF14CDCBA67D314F65963393BF9A75FA802C2FCFEFB7B1ADBE46A29904E5E886D665353DD15DA1E91D23DF6E3B573F4A5B0EB33B20EA96A1019F26336C2570B2CABE74EF09A2A9 Out = A7FE4D502D1317D9140ECDEDEE7B328EAA63CB81E4F04B98D26322583FC7C0AA3EEF85E7E545A988DBAE860D91E6C9E8B5C1F1672629808C14189A46D81F543C2A4B3B58D8245781444D5F8D13030B8B3BDA7198B0B80E357A32DE4B2663C8 Key = F8637008154408B2D169A29ABF0562F5E3F9138056642B36F6BC96ADC6D11B0177781C5D5751A672F357FF2213915F73 Nonce = 57EC7A53D72A6050 In = 1E54C9A5C6B8491B04755DC3E271AA40B84DE522EA8AC0BB505A3863D6BB70C84DEAC0D3AE4B383E8D7470C73BB562B13F7D98A5ABD127CABA17E96E87A4FEF5486EFB3FCE84E16B16F078C37AE75D51FB92D4DA02814839A6502485ABA10FD8 Out = DAEF43A3B5F158A0216DB87FC8AFD512F8C5B0E0A02FEF93061EE26C084A7FB0445B3FBEF5D0C4EF5FC9E9AEA1927AFC925E001F031D90543C3B8456DCDD424770BA3B5A5626E0BC37372CE40F0421C72485B7F3070511C88971A3D0353BEF0C Key = BB7596BF0FBEF3B5E8F445F941F7F8D81127465E0285E5778B28CFF2D7CC7DB651516DED09265039A2DC40E8FCBDDDC2 Nonce = F0C5923ABCF86DF3 In = BE505B1B8D8574DAE9731479E64446C66205FE6732155E46B93497735DD005F467BA45B26F700EEE9702F14F2D66D3D7BB2C37384DF410C572024F0DA8303057AE78E6AADB665F4754FE8E4F9CBFA0D52D845CED97822B209D1628D7FEC440E9ED Out = C7718C6903386C1FE3E06352D5D028EF552AF684A67D370755AFC213F889909D90627204911E832884F0995B19C9BDCCAA6CDCA34532A7C67E4A102B2D4CE15F4D34C7D450696A3C4835BF7BC184E4E463BBC500E833B000C90C86690BFE4D787B Key = 3409E8B48E54DBD570F2A08CC97231B641C01B1124EE9E1847015864557C41B7CAED50814BAFB12020952DE0919706ED Nonce = 0D87C3FD719A8A41 In = 93706C09FA219B561D5E98377F36AA97E24344EAF78E6FD9DD09F164FC63FD9A5803CAA71860846A295340B66D2490949E29614F7F520634C6A333B98586402377732375C16AD101A77119C813F96253146C70A611248964A32320508A075B09486B Out = 220662DC9C37FD9B2324F52C97F9A2B290E64EED828FC5143B354BA952A71AB0690517C1EA9418402FDD1B9CDDE018630CCC9CAAF9BB15C643A24B14139B357712ECE51A85F99176E87DFB247217714CB35F94F69443143C8AC4B23556302B633940 Key = AD2BEBB797ABD77F7E1F02E37089009575BEAFB02B7104CE55A17D08E2A7196C75307C6F315A1CB7A03C5010A73CF976 Nonce = D598B850E3F65256 In = A07F4896900091174A2228A2C1451F2FEB7730FF252B064ACCDC5EE02E0F41950A2EA58E87BAF5FB0C3AF10D173B9109A7D35C93FEBB3A817808C35BFD735F06E068125502C3927BC4FF91B30C653D2CD6D1EB4FD431BD7D0344393DC25AF200F153BF Out = E41CDF1572B1DEA05F141B76E900CDD443C63AF3138D48A40BA86E55173B9DDDD58BE2DFD0283D80A19D6211FB746066AEEE687246334ED91DB94DBCFD5F3CD7AE7D4C726D8E52401101DBF61E5B23A20F28172E1EF06A9A74CEA6E558523DD6E27A24 Key = DBC40F78C4EC8EB9E008CEC9481E827F506157166B30960FC7D37725551E00FBDA94D3127E77FD80CC8293F23DA5F2EC Nonce = 29038162670DE41F In = 23ED775F51A23B2DFFF0AFE780AC30DBD3F0E81F4C3815C73A8604C2E9539449CCC4B5DA1FEC9F3EE270A5B45CCE0AE26F1C47F0C7A492656E3E760119CE8B0B5C47C042EAFB0F81E842566D7EBF410F6C05FCABF94577DF64C8A04FA3B171678F49FBD7 Out = 18064691A1876101BC7E44B8586299345C30118C710B0971C455AC2C9CA03297FFD625E6AB591B14281616DE2F7EB60858BF204B0CE3D23ED3972AE45636CE69FDB916620B63075AABB692404278423D8E165908332DCD86141CEACC79C9EF3F1ADE49F5 Key = FB46F6F9BD972D0F6208EB0CB8B92FA2BC111E6045052F0AE4DCECF586FB06E6970B587CDAEF0C4E821D3F667D3599B9 Nonce = 700973A9E6C61EED In = 6DA8190E62172EBC0C4353881FC9D7CEDE4C34DEC14D771552E323B91D1641B3802E02BB35DE22CF7B2FFC7A4CC0D923B745E6E1ECDD3B705C52488B82A2ADC16F8910151080CDCE760979DCD49F83CFBA7F404D6A564FBE2BE119321695FCB73A737FED53 Out = AF678AF0ED467ED7252D0D886CCDDBEF707A6F1DC5D9C4C9CEC036B15CBB1847505D408B09EA31D705A40AFA0B125476F30E43D4CB23C7321554F151671F33503FD9C9165BBCE2A0778AC167BB9EFA94ECEF43F69440837575B369BF4C9FB50A25F74BE2E7 Key = 89502CCCAB5CF8827C0AB805D1B3A5F94BEF4969FEA7B5D0A19ED930F9A8F3AB21CD7BDBE84B23DFAAC0C794A007AA4D Nonce = 0F684E80EA1311E0 In = 3A0D8D953D9F291420E8CD7099191830111C71BAC5294CA880785829EF9DBBF201DAD5FA124B0F31794762465AFC678C8681F1A46DDC64F4BC3D8ED47ADB35FFBB1120B09D6D720F74F270A516A217006649A759CA2076FFEC9990A4671B5D4E251ABDC4E90A Out = 02CC827B1CA4806AA14035F587D56D4F75B22CB48F6511B8B9326B212771BE3C3806C494BF6952D087A73EDD7759F6D0CEC7B2794B8ADD1D3154C43F3C2F7460E1EB0989FB3DE93E06A8B10E2DACDAF74B769AB4227477F0A6EA2FF579CA5E821AC3928FF9C4 Key = BF89275DD43670F4746D7A6F3D9CB52887714CA795705E25EC58855A7809EF72A78EDC25D9B3F9929A0E69422C46012F Nonce = FFDCC94D1EA51492 In = 8DEC08BC76633DA1C5422E55AD5736E57B0FC871F727BE6C9AF892D6F8DC50A17059D4BDC38EF55E8D334F54D253F9C4F3AB60852B896124A91331AA7EC88E9040B84CBBC877EB9AEFD4CE21A614DEB44D5E7DBA600848F1FA202F8743B0C27CC816F303DFF835 Out = 7392C4D3C71B92464AE1F221F49B42E01D867C03C63D97438F106583D68A9642B557D39EC5F69992872FC1022917AD8A930B12510C363F7BF1FDD4C30535B1C3751B1C063197DA27AC88DA521E6410BCC045F6D6643067CC099AF59172F3FE668AC4BA59B3979D Key = 9D819A66A8C2943406FF51A5DCB7222904C70F138DA796B55726376E2DD9BFC17112BC6842012D352B31EAF42793DBB3 Nonce = C82E3B74B693371D In = 8D043DB31E9EC2F90B1ECCF369AC28A912C01156246E4E8FB71EEC578744246F0E415950D6BD1D1B87889A24F00B4657B8F2F11B6C067058817DAB2C7B2813CCB87DE958E4034F3209FA5A0AFD47FE8DA06CE4263BDD5B2B33CCE1825D5D403AF7B4BA1E0A40A662 Out = FF30AC926CC80F99172E0794C460CE53CF46500EE931550497A80A56C25C03290F9DBA4B85AB6CABEC30BD91334A82F69F94A4B90AE4BE0E8506F52E9CEFD000D1E64642F439D6BDD39A4E7AE40CC81CEBB7DDBAA72639F1C068E6C83DAC5E6D190848F1AC46AC74 Key = 3F5711712D16295C653DD906E3D5DFDD7DA2707CE7CC3E1F0DF9BBA9F7D53E5F743D79F4F54F363915DF3AD25E81EE63 Nonce = EED0FE35B9268BD1 In = 98C51F1D9F4308741507412CF4A87E3385B108A665A1106F86FA8A17B30F192F879496BAE8720E4E0AB3374E108D100F6951240B794D92294301666EBD93F13E1838967DCA554CCDC355613197D2B42A42E9E30A283EFEB5D3124A3F1FC8FC72649073786AC45FA99A Out = 50729CB7821BFF80A82CD63FB9E3EBD5CD930FDB3C7826CF4F257186CD5AEFB3BD566E35C920A99F7D1972C40A1EA3FEFB53E9AAC1CEC106211E568F066894CF22636BBA5EF1256DEF951EBCFFB9A1E2C622B48BF735FA129DDE4B222AEF6333C263354454EBB8F294 Key = F39966BEC7E60CE51BD220DC5B2A2B817A73CE7767D6195B08DE70D5B7BB6BA97F8E4DE1327DC33E6E1BE15759FCD685 Nonce = 68F49770C9E8EF60 In = 095225A597E7703987E5AFC522F74CA7CD10148FD1745ED1C15B79FC9AEA7A7DCF4A9CA18F34FB0C7C1DD562B99280BF771DD9E1A5853739AB094F75FC4DF146C23BFE60EE4EF71C48F31A58D8E3E5EFF006ADABCE33D936CACCF58E7CAA3A3EA9CDE825ACF174C483A9 Out = 310FEA486B6A2B26E2058B73194CE153CE1812FC71E5E583CA1F7E4B280236698B2CC4557537975D76B87E2F224705334467BEEF35A65F6BA2D8F88E7F8CDBBD06B9B23FB0E887AC97FF9A2528020B674E282CCB9C60384E1AC321F2B77503B4946F0ACE9674113CFCF7 Key = 937014D05FD4A6C7FC3DEBA0AC06B776730488157B714DDEDA80949C49941DF02A32AF225BB58F8EC633487E4E844B2E Nonce = A8AEE70C872BEA7D In = 1EA813DB9BEA1AB0692B720B9753049D8AF9F5BBC88BB969678A3D70DE64A865B1328AE3BB982267E87002F435DDDBC4F26698F15B997F920FEE7EB98C169A29339AD006F0EC5BE1C68CC8F485CD9EE5792C3C2D200DD23026B377FBD732431453870C73C1679AFDD2C078 Out = EF982CFF693B0B6F1E9BBC70BD9890D645F720DD3E5F17AA7818BC6F578B0CE4CF999E24EC9EC0805C147132218A168C71BCD5A4E70EDC736B7E82BD5CA5A562DC8A825FF494DE2371E494233757E8730A0A87EEC27D69E78CD4F95FB8BF6D20D76F84702A8D96E4AE5825 Key = BB974000A47E092D7086699EDE730B3D47D817AB689468A35AD22BFBE1783F52E91C018C4FD873A3C3124F8FFCB6997B Nonce = F380287DB78EAB5F In = DC85F77376B9FE9FC211C531E1E09AB0BA65CE08196F2C31EDE43D7752EBF5CE5F166788E2A7B3BDA50A1A1D84136CE0883BAE64303B836BFBE515A17C6A660B30A32C53D8F7E275F87C78D8FF043BA735F2A58A0818D1D3B7EE4BBA7F6B6C8DBBA6A2B269275663785B4A68 Out = 46B23BC98C9894BBE2E0727237C84C51FF5B61CA28457133173F74F9FD6C7B1B6D0257DACE267AC674F8BDD132FA8B3441C216C5325535F13053453A28AD4C25F00E9FF5AA2CC2624DC3C96106D3E4B6AC6928BEDC29BF64517E6C15283E6ECFE9D5A78CFA04AAE1C6BC64D7 Key = A71E32626200B616B73840AAEC8F1DBB372BCBA6B499724599F0DB60B5CCBF6A3BA7873A5A8FB76595870D69739540EE Nonce = 5219C9F682ED60B1 In = 5B9F4F0F7684A18101410FCCC4658C617B1BCD640D24A7136CD395006BBEADED79D2ED278E69B4CE5C1E8B8A87FE32F5419CD57237892D6F0491F7C100FF490072D6D5C5BDEFA8F170789368C654AE2CECA1ACC1FD8A42BC352310937F76F421E73BDD2B6F94884394AAA31F66 Out = 0C20E6F66CF472C633C31C153E76EF66BDD04D83BD6C4CF2204583D3DE53C66F778FDE72D2A223C71AEC84918840804D7618E95B71BBDD70F2427A2CD8CCCCB7129C3C51373F0BE15A17674CD9CBB0C9E2EB58227C8B83E8F2E8A120B4D7C18DD56F78A8164EE96E0322CE3FD2 Key = DC220CE4170F9D208B02B2913D416647F38FED24FF925AE59021AC4E3B67CC091924EEED317CEC8754F0986BA93AA26C Nonce = 629527F24208CE9B In = 9F7BC0B23B6E7FD175D36574A12BB1873613774711D8A5EAF1310CAD04886DCD626DA73B2A823EACB83AC68AB208D2ABE0EA1F4C7905CBEB9D02918843D446CB1A141E2E0774E17FFBEB962B2E1D5C4FC97FC4B12CE1408837B643177860E3E976131393BC43EFE284D8ACF38865 Out = D8DC8267F712888E0FDFADEC4D0617C7AF89CF46B4E300E18D1BEC07E1435608A90FF500FDD0ACD2AB036B56510BC63FF4361E1AE6FEE739E9AA338037E4A774CB6F6BE1803293DFA5865715CB58C3D6BD075588D0367B41343859ECA025AC54B4CBD4BE5BD2A79D3D669479F0C9 Key = 012BFE1E9BD611171036AA701EEE7C7BBAE5943AE3515FB139A41BE23F82A2121809B8042FACA96908E3D89704A7B71D Nonce = AD0710909DD4F20D In = 86BAA5033E5EEDC0A9F153EECC7849A21BE305F673AFED4E97B16F4441C9DDA124579B3BC85320B521E685EF09A66E17A2FE37DC3BE3F8A6AB5D861B484E14658517FD2BC026832C9F6464425FAC2437B27D7CDDF069AAAA16106235C751EA2443D9F9BEA74FDEF0D60735BD78C731 Out = 1CBF67E89E6D13483C98BAE5A36E6EDD1AD12885DEEE765C401DEB3E7EA04980C499653F81D17DE8B6FD763F0D69FA2C977AC94DBF58FD17BB0ECC567F5CCF0C9D85CF3FD7F7A2D3CC4B02892104A6B070FDA6510C3AA867CE1229660740850B92CBBF26C4888901DDE695E09C3AC7 Key = 7A4382B3A9E640981582C9ECFCFC0290297CD0CD40D00B0BC2FF88EBB229F4A503A920C4562C68A64BFC29FAF0BF7F5D Nonce = AFC6C2F5D4C1DC54 In = B531FAE3152A66C391E3A63CAACC1CC495599703871E34C07E00C654B733B7FE67123CC899DC5C3F13A7B85604F53ED2993F5BD9143E9B493D3E0610F4F6F9193C595E7576BAE7191AD57850D7431DCBFDF6DE5DEE3F7CAEF6B99CC89E9FB6EADADB41AE87408DEB85E05E8C9ABC5FC7 Out = 4374EDD79E8C265C5D277941C3293075F5AE796533DE54E34C4065E167652370238D673DE1FA618B80FA805A317C0B3B34D1230E8A63E8D91F701AC81E8DEE54E33959D80A468404CD351A6CB7B8C1CE808F7EC77F6D6F36AF54555957EB3B0F429332D1DCBE98030346F1766CFF5C1F Key = AA1F76305E46B7F90C6D80F92AE5E3921C8C693D383CB141B9A9B61529369AF15F042ABD45646E9771F2084AA0BE50F4 Nonce = C0CD473232F5675F In = 381552281B5183553EA1605441A8811E5BCA184CF3135FAAD0B5913E632D11957D46FA45B0228B05D9C27F5782FBD48911E22EBBBF1BD923959D34D44D3BC9474C1BF46A8B322A6B0177611CA9BE919356EFAD688D460D1FB3F2A1BE55B6314C5E108CCAB29E71A879F3AA83A88747A757 Out = 1998655B88BC035ED38A24E673AD49348E0EADB9F21420F1713BE09729FA844BECB82CF1327C949F5E40D371A326BE90EC3F449842161515D1728F348575D0F963520A1444EB1C880C0B4F190463DEC21E7A6B381D033AAEEB4D538C703694AD628DEC56FDF2B545560087C22E93207EAC Key = 026BAF447B1F53B87A949C517D77874545A5534AFE810B380FF0D190424BB8A87FB570EA51739E190C69CCDE297CD610 Nonce = 86BB1FC00DE415A1 In = E3A3B1FD4B3F0F6309777C419BB9D3FE17FCC10DB62BF03FD48F8E4DE5FD8FBD5D8EF4B2F8335F6D7CD1F8F4DC65B9BD43C145584C5FE5ABDEDBF946C0D6B4A1C7338B202437DAC59BBEF404B97E321D4A1658F358D4989412016408E1B32D254F860CE24D8475C9090647F68819AB5106F6 Out = 66F4D4403CE5B68D31715468B537138EB40AE4290ADD05F4970DC0ABA75F1E0352548E2597460CF93F1F952687318B28F1F35EEF6DE44BD966271A892F045F5993BEEB90F3D5DFAB5EAF3FFFE2F1C396E9122555C03B40785D9BD5E48340462F3D279C0C4815FA2635D9820EED98AA4E5312 Key = 1736488BF02FE3C6553160A5716A38880B53CB716EC071C5AA3CF1D655B769D811B0D727AB5AB2F1F055DB2A975ED089 Nonce = A42699BF4EB58014 In = 961C1C4E0BA6355B95FF4D0682E7D3FC675BCEC97E6FE7B34715209FC366B8A551D1C2585304BF4AFCFEBC14D305C13D3851734A5FA21E037AB94E5AA0AE5DAC31C595F75C8C86E3850F527D60649C8E02D896261F387253603450CFBA206BC5CE3C23E15853AA520C8B29D018EF1BCA7E24B3 Out = DEDCB954C69B9E9E1018E356B5EBE808585CEAEA1FB3A1855FD45E27D002AFBFC38B2648698B5AB2B4C9A730121E0E2416A95AF1BA8FF52C18298E1EDF7424241DDC6D633AE2B4453B211064289DEF7D158EA812D20E5856A8AD90C0B205BD21F9AFC0B3FBCC06097EF28210C8D1B813A82FFE Key = AA84101A8B24FB8BFD62B6D7EC613FE221CDB265FC80E125404D6809D9A8017A4F4113388D85222EC7450689627AA9B5 Nonce = CA8403CF35C4871B In = 63028B1B17E373F50F256F9F4B028DBEE83CB070FD6D3BFD73F2E2314A5414D2DDBA20E499FD0F05AFC0A2414F9FBB6193F16D4F497EC48AB762092ECDC677C404959A91E167D0283719C2B42F2BE6DD09AC3D15A35227AFCBE10CBF931CC44925163065BF2F2542DBE6489174153501017AADC3 Out = DF7EB8853E2EE46ABBFC0258DF6314E7DD9C60210652130B922FFC15A450E8188397B4884B53E1C071871580CA14C560D3BEEB24B36D35C144977B8D862BF10F8128F845909BC1205989AD4471219B5612FFAE3FEEC04FA0AB002408820A00A402CEDFAF9FFC7B0CACAB3A2B067332E20740FAD2 Key = 54ACB5023D0AEDB2A7E631BE0E626392EEA5C036CB440125974EED5C1CD885AD43BC0A4DBA63879E723E72F348A13ECB Nonce = E7C4F1643A1C83D5 In = 99B2AC13EAD705FC1553812E6ECC62D202F5C19A9D782B87D614412BC171EFAB01E35086F3D2219FE992506768F93D80FC945E5CBFF059CE43636E09CD8099B12167B61ABCEE46CD65867FBA1DC17D0D1FCC3A0E24382E5D928E9ED2DA9539294BE658E19586B8053EFBDB60D88775DC8DADB7A18E Out = 33CFE5B05C2A4006DEA05DEEE4E19D6C17A9224E85C4EA4BC9DF9384ED74DF6B5FC75FD4984BD167F4F336CD112CBB8F3929322C9F69E06435FCE2345BBD0257F00222D312EFF4388C2AE2E300F8842E8F4D4D97F8DB45750FEA5CB8776E7A66DCC773EA607CF425DE41EFC1522713423BB49490E0 Key = 512C09916DBDB5F8B75B8833F56845D5E155B5C4DF57F22DA737BF8530754FFD68A64B1421B3420AFB5156806C4CAAB2 Nonce = BDF4C9FAE71847C5 In = 90FB2D5FF21B18C4D6A35A49388CD2D61D4406604A4CD3A6A6FDDD0F694FB506B23F19354D36D54D13B92D391EE885925412121CA9F9437564B3419476AC46B909ED635A4907DEED2176A8FF9514A2233D80AEFD8DCDC0B397703E50997F13EBA8A11CAE4D156B881BB942F467277A9EE962200E16C8 Out = 937410964822DB97139DB2DE356C0468EE5773EF15CF9876B90CC8974A905A7F781E5C016558501B434E94E6CDCBDA16B86C0BC008BB73152EA7ED24C0BC90ECEAF0D81C600726D7F97199B3974FD57E8AC264FD64865217C8E93E97871646A38019F93AF873C8B02F79272E88C334132E3D86ECFB66 Key = 96EB4B44EE1A3F55DB2BEF1F2835AAF095BF74D918B28A6159F5333AF6ABCB5653662DB912C6D88776DA9BCAFC421860 Nonce = EC530DF9EF4DCEA1 In = 326630CC6BC9FFCF1CC4E275CAD90F994BF3DE828838B004813432B581B64AADA2727BD63D9455B5D69973740BCF0E636B517ED556A71F13A23DF801582F71B818C243E0455C91E0E3E2857405A8760E56ADA3103E995CE05979856D23E0325A060A9182052E94880FCF6786C8D89DF9B2EBE6D6D468B0 Out = E33B18E484EBB8F777DB40C98BA351939E3D7517F84C88B35A231988166C6BDCA4DC349DACEE54EF438E4951B360C7DB39703F2E977FB9CB2D221280494DB648F97ABD8847A4D7E56E32EE8B5EC16739E2574A837F12D62D3D3E70B010D6A6B13D894D84AAA3CBECDE4F5A2FD407325CC7A868561B9728 Key = 7F623C50A1B327877EF08FBCB5CF8EC385B4E0E1D385DA5BF230D00DBC27C0696AF2D730F79C407EEBBA37EDC3996E0E Nonce = 0CFC07373E27E329 In = 7929A272F2A645A2C22F98CB3E51CA00A0027E32785600A13C537E1F1262EDFC171CD2E2E5A3C2B7CF97720E9EC5E71AA7ABC2047868E1350DA36704488B4698BB290B1FAE13712BEE2BCAE519FD1C02E4DA80B59B148C92D9FCEF5A3867F06B1DD983D740E6E0C03A52A862820C96C8472F78A490DE2ED9 Out = 3DD2F3651E53DCC3737D2B50A5DA016359D376DD53469D87A2356D9CC5078973B6E9C9E9A263195090A35EA8D8C43C3B8716F738063E243164E8A185884BD638EAE39DB8D80CA45CBC5FB1BC19660085EF959A12C65D9BCE178769A31BB1F15F2C336D9B45790CD62F6DDF78701BE4CCB80459B8DB0C729E Key = 027088175B3BA6679A5A4B9F7969092F9D82341AD4CD0C26C3CCAB5EB842CA0AF8D722A85C04BE5AA4A633EB2004B933 Nonce = A2FDA73196F77710 In = A8C07161CB10C5B83F027D883277BFCC92BBA4131B3256B685FC72E773B5FE797FA612817663910C19D77C2C1E3E60E0A1B0BA69065F60B446B816EDC1E5115B57790A254758A8A7F156655C70AC82F891B99414657CDC3B07E22CDAE39D498660670C652856F8CF8C3B2B3863080D28CDE50B3768B322C5CF Out = D6466C3BA9BC6F250286417929744CA7FA5A674511894C5A2B3D196A0864BA6AF9D4914B3B69DC12ED10D9ABE4655C9276E876B6E91A77F076019B8E3D3468490590F160414B22BF2B2A9838B456460FC281C69D4BAD7D80764B69E5A7422FB9FC2DE6B0293152A132F795F7B67C4B1DD336675181EAE7F66A Key = 476CFBCBA17DD8C1DF71D12ACC2278FF358D44CE9C46969D78DDE006FF9C0B795AA4629E488B142A95B33B71A024B52D Nonce = BAD16417F152E362 In = E397E0CB0CF5026433491726884F8FC9F26A240FB71AC556286FF70226C30E22BAEF81ACA4A5B9AE7BC76A6886AF26D68ECEB353900D9C2C6867F668C7A4F00353E10BD57544A2F227B5AA8012ADFE1AD305B4758D19416BD64611C2F1198C088FB3BE0764BFC6960AB30828A16452808442CE13160E3F15507B Out = F3CB60A09256B5F00807646043E894123423D9BF394319E2881AE9DFDAB7EB0AB6D0089A3D9252B7DFBB85AC2EE7B36BAC6942E484B8BF8E457250E2A590865AF6B02E30C4F71D0A728129549DB3C2F7E2197E8472A9D2BFE61D42D125A3F8B60AE9D70C71653EF6F5E3CFAEA2AF197F84736A05D924EF6DF03E Key = 3228B497EB4C8E1CCAB63280BE3611FBF719C032509D764363295104B2711FDEF3C456C67D6D30F37DE5ADFEDC5DF7A0 Nonce = B471C77B86C53238 In = 30E894D45041EC1C6C143CF9C0942EDB0E39ABAFF069518E63045213A34B15B4706706F3CB100A3651F965EC31F2A2D5E1CF0E130398D2BF4D5E8D60EA26296390A20E20EC15C443083FE6A9143A3261747FFE06654F95DB727B9B907D0518C3733E6A37F9205A7E0C4CC319A11FE519218A91506B817F2137E487 Out = 27396BA018765B71CB2D8086CF551A0C0D7A9092F82CC6636095EEC9DB0E031EA443085825035602287D16A40CB4A30E2323F6F0A7D2284B744783015385DBECE6FF11633226E8E597F3BB4DC3A1A6B782A13DC241D35C603521548EF6449651283754613641B23FAC4B562D8E747EDA82BF3A024AFC6483F7E84E Key = 2E2696E9A23F49DF3E75BE263A5B2AC3D359B2E66693768AEA3DBB84A8FCA2019754B57ED1A4B5E88C8056963DE33AD9 Nonce = 2E2C2A2708051A03 In = 1CD106901E31D8C0BFADA8CA77466A1A8D03182EB9B7FD0F25F9913CF8D804912E1665C12531C10041BCBE01727161E43DDB85D5BF57FB2DFE7D28799BF19D7046DCBB0B01EC8F9D3789BDC62A301FB0672AD1FBA4B61F520E408089628E511E6A9268F33D4A913C449356051B8D1127C90052FB9A533F0D1CC9EE3A Out = 510EB1ABA53228A007AABDAD204E7D845C5801D192899DDB2A0AF3AED0F40813AE28C62884027690A8A9934E07EF075CAFB161D3FF3D3ECB78DE8A4BB8FDE5EA86A203594F314416E9CB6EBE714E9C16BD6971227014ECF7F4A0F5E926042CB6430CBED27419D69CB1B25DDB4B3A5E5FDE85FD092A6BF8043ECF4F16 Key = 05FDEB4B2A121EA8814A9349EC0C957BE90F78B1873D2B12F1C7381027C23DABD5AD13AB003E7308DA8673BC9C0DB19D Nonce = 1D9DAD8CEF8D5C8C In = 83828EFF523E59AE2910B8DD6FD1602F3653CF9F557555E1B129FF1C30B735D022A3A505E6E5E091F786ED1946F5751E9C1D6584893D5D6448E52839AB1AA9BFBE40E15A8E6055BD2CA529AEAB21B3636FE4DC1708821412FFE29963CB529B2EB39619C421E3D751BD6653B0259278D064B51C2247B284F5E90641BAF3 Out = 424881C0608E74FA85D31F88693796005CEFD59EF52C393D02E30DB30E56A473B5911E9FDE98D8D9F4D70A35131CE58ED4F02C2E07667E8B2ECE5C1F8C10A0E730EFEE9C6BEEEC016280F642A6284D70B7280710528B0A1855FE40C5FDBCBEE04DE73B15890C1FBFD5C1D449F94CA6E681C689C45D34D450E7324F8203 Key = 5AA847862F9D37E61012209118228340DE7BD035951792893DB26EE6DFE11D434211CA6568E0656947A787DEF4AF63BC Nonce = 74F3DCEB52677BB1 In = 84618CB880FF09C23976808DF38DC7ED98FEAEC593470448B090F984BFA5AA2159C6199BCC19153B6432086ADFF5D163AA8ED058C70F4C45194490D363936571DFE08E5EDF0C198E360A40BEA55331B5A1AEE82288FABB7E048C65B660F39FCD9E05355E098057878C8C75CBA7B88C45B730489E6CCACC75FC943F5C2623 Out = 260F58BC20B150792F35AD8987BE0392B11613F3B5CA1910351D046436FD439F47007A7F1B30111C1DAFBAADC1594BA622CEC7856D968A7017F18C8EF885E36AF07B11572D0F23D85E4F1DE3F31705E706F8537B23743751870E2BEB56851B6BF86124937A1E9BB5109380E1ADB3680D78D2D915DB859EA6F3B00B3A3DD6 Key = 4639E00979406AD3DF52BB846AF2CB20A90688DCC7BCDC94801F3F53FA6B30AC2EF78FD4B774FBF75006F14169FF5005 Nonce = 994E47543E886050 In = 241C0EDE24624310169483018309911076B72A6D79711B1CFD4F337CC4DD28A36F4DFBAEB1FA8A016D7A04973FDC30D1CB47ABE02E49D5136E1069E9269CA047A5C641D554CD1FC034B8E5FBAFA82F640689274CAA3C03D2A00EC128A36F2A5A43EFC189ACB7671A29564E4682A0C4E84EAE11651EA62CE56BDE33AE22B6A0 Out = 3F403E71D84C65972E338AB50B344A75C97673869A03107A914B496E6A663D78FB46417880AEA9F5C3DC1F507BEE6E43C84DB947C967DCD42031AB8B6A036ABDB79AE2B109BC01AB6CEBAD9475890316A718FE6FBAC08C260CDDCD1EF7A9A9B6E6818FAB45D66D567D6B90BA7630C5FE2B2875ECF11B540F6945F1D1ABD5DB Key = F994230CF918A2A9AE718C56190692242CE5EE9D9EC4224482F1DCB2CCD6F1DE0C031E7DE9D328E22CC035073F29995F Nonce = 7791293C3BEAFEB5 In = 30B3F3EDCDD8961CF876F947DA372C6BBB4B98CE57653A7975335B0C571444C8F1BADA230EEB0F1942066ACE8AFDF8EDEF0C114C8884BDD0EFB40E41464823CEBC54DA9A59C73A4333C3A193BAF1D4BFEEA6A72FCDB5A42C034D843FFFD32F101D2BBA99FA96AA4374EA7181B4B8392557FCA8D3A0ACAE29A64EA1D67507CBC7 Out = 0C523E6C12144C99B91366DB1845F20B66BBF7EEEF07D227B04DFEB0DEFE2D9F2C930D7D819CEF968E89AA6812338AF942C15F6233E9AB551DC61454077F36B4583035B4E383D8B3B07B8C6A43053FCF0E3315B371B55FD791DFCF3024417035F8E4C281428107699E8CABCFC475DDBE5124F423B5616740ACB73742E7CF2035 Key = 88A8AE1F03C7A67A5674BFA270393D06FCC69E0D902928B276F7E208AFD46A5D14427955D0D296A79CC2E0B581D6C7EC Nonce = 421849BC8362455F In = 96A550AA095EC65E187A257F9173864733C8BCCB52A252E664D00E693A02701D4652295CA84F56D87D787CC5ACCC66470176AE1CEA5EF91B9ACD3C12EB011C99A36C8402ED288679A1BCE3C1AEFE1419640D8ACAD65DCBA884EAE38AAF21312B4A15A9F203891275F7BA4739F2D77777081A8360BE8013762E10EDE24E8F72BF44AC020468DE4E88A1E21DEED4B065DA8C94764913B8559251C7273FE7D31E5DA4AAF354FE9973D428C7419AC1979240A29835C91C1D589C385110EC5F4FBD0707A63A9B4391E2598991C52D981E43872F5E53D501A868D1634C72C838B37A27330839B86DDC4FDBD75F874C66AD0B7FBE399B44726DDF58C72514FED37D34AFCF3B60786A3B88DCF6D527BCB3C83867B8F02DDC5FE5DF00370BBD9CAA9638B52972EA756D44440A92B94AF9AE58DD0CF30A1F403B05414E0FCCDAE06E85279B2D471D2B675A3AF72068A8C08B77D465A67899AEA9F1617696FF3A811ACBD7B529B86C080C121DA387091E6487733E682EF1B79358553BD912EF0C0E064BF2096FC05910A051C12AFC7412390DCCBA0F443302F081884A78E7D1AC4003E3AFF1B878D4AE9CEC41FF28DB33C3A60DC042A0337C66421BE343B32A2D190149DA4D29E8628D74585FA06D48C4660FC2433A7EB03F40B184BBD61C7CF34E7C54D7C2E7248170846473547255ACDCBDF0BA94CB94268DAE79F7BDFD7AA68792AF1B47 Out = CABE649915F699A332C711AF76355D1D5D4D808A6BE79A1D2427CBCF78D3EA44C243F1E75A42E0A5F40ECC8ED98ABD1B439180BB396C9717053A7A109F5D910102832869913AB9D3E458BFEA21C9C4BE18D153C14A4292FAD129BA600BD7FEBDB3A1F4AB1B5A8B54E389817B700D29944BF00B6B7C8A3B43EFF7A7E9B0756CFDB0BBB17350BACAF2CD229D828CE7052BCF64D87E7B0E39F2506CFCF5F4269CA9076702D437AE47658ADC14A3C6E2CDCE58970303CED58F48839351AB86A18F5261E088899EAB82B90AE3A129817C3DD55390D1A73A54A1536ADBED0CFB550EDBD93E8DE77CB90F469213CC2F721B24B8368DFFEBEA7FC3CC02A892E4A2E7CEF1DA2172EFEABB0C3941502747029A10157B257EE9A0734EFBD125064B412BEE6D0CEC4F48E5134059618A86FF58F132719DA91EE2258FE7E1DA9F3FA35664312739A9843C9C056D4C3FA3064284933F0DD48B316FCE6FD09769F05FBA38FE2A03E658469A5045197307F60878A93F1FB725984FC737FE1049955CC0A1140230CF8B4D7302A99D6F5F10B5A524B5018B93B81F2481D5B1F4139B37C246B5B5BF2E3ECA966930CFD35A38B30D1BEE41965C4B5D936D98BBAE2CA49CD5359880D55139E3A2A9B2AF9A3BF7292B1B370471D729B0767F1DA185DE2CC22A25C5DE3701CBFC6B686CA6DE58B73780AACABF90E38E6285C65470C4D64D79BAEC366A569E Key = 1B51A2E2BDCB58D9E175E2C216542C2E7EF4E7C347662A569A005250F465CBDA009F67AE8D9A3EC146D927A39B76D072 Nonce = FA6B7AC9D1ADEA81 In = 8795249E8A36B4DF61ABBE7DAE5D825E47BCF9BC3A2A20E313DA65EC2185B64DF50B97A56657E8FB09DF29F3C9A1F23ADE5FF6A8F046E24CC067F82D325456E965C8943FA62FD89F72E6A36C2E365F40A89545C2F58114ED59AB88715573C42D1B56F997F399C037042EE34D8308FADB788522D10A07A713D96B4148AC84AA9C3022826AF28F59F8AC50877AB878BC0DCC7D98EB4F9FFB053A5AD638F0CC9880B58DD2D3E191FE5CD57B348A35E7B77559C8B66C98DCEAD5592406DD340E5C8CBB75621411BF0C2AEC88B5D4D88C4E8948C73EB377E0CB7EE979D41125802129FC7609AF8E98181E43995CF7444CB2A6166FE755F49FC22E0F457C3DA821AAEC0507EB7775A796542F79B07C5BA7B1FB70E7EFD0632A894F627BC0057CF3D46C9F77A1E37CB039F8C4EE5DFE042053DAB9A240079F811CF9E56EFDCC049AFFC90EA3DDA6332F4AF24481BEBBE42677AB75A23C6BC4ED111C7E969E36E111D7B770306EC0B764F37C51E8E2FBBED2E985FB1E79A7A3EC790E32CA1BC5107FB99F93FA95841819CA0DA82C0ABE4ED549ED02617369C83F3593FBE24741DE49C224C493FD03275BA5177A74CE0D6A1167D2EB775170761398B999BEA4FA38C490B34FAE052ED6E9784A3A5E5ADD4C78A5A00BF01B69C66E001D17CA64A812881B5AE53A7A02AEE073BD1606D7FE82B4A7C7EB10D8452A1B4D81E4296C1B963B52447D Out = 264FABACE6EEF1EE9FC5F20BFAE7B70E2456A720510426EA0DD93AE4B2DBD71C26BA266CBD3CFF9C590B6A0DAF1F36F616F72724F15AE64CE2EEFC1C2973AE0B34E3FEB268DA29D19495938FA547CCC13007D4C468CDCA2D777FBAC5A83860B3E339BE1131DB6190971847AAA76655DF6F97766A1E423C7FCEE681795F17D5945EDDE2A964C29F992E1E3E43E8EA7D2E99E99F8120FCD05A3008C47356773088A71731577457D1EE2F448AC39D373C3533D124CFF7B8CA187BAA9A0EFF64E14E47B8A1D0F965B5099139D466BA4C85FD298695DFEDC2736DEF2E6F96285755A12003667021F6DFB6E8F7BFE93AF0908D15B843887FFE4EB111C1ABC13949F718E9E042D8572E895D7893C9FFC31518DD7235B777B6C6050B4341ECC726744C925592A659FBC956339DB8483BC8A1762CF7C6E2DC00A66F18D1C8F14C2FED4B6BE0F19CA752F8E79F254C5F04FD0F5676BA41E6B7709948C0D3D59377F22E9ACD015B920433CE5DB61F47D3600F8B3916CF7CB2192F1A62C2C7D34CCF9C85DEFC1B759FD4AFB7DCD6475D2CA538AAB662F8C38907D1D6E54FC3CE7DED78DA52D24EADC22D43DD4BD65E010BB8E752C391C8AC8783CCA284496373641FB2B2ADCE81DD52FC09B16F0E61174A40806B054A6C3D3F90174AA7C5CA4C6723B9C166DD1B462FFE6B2D3BD71AF46F45B16528CA45624B31D46ADE4A032CF978F83D87CDEB Key = 2C811686E0A407B1B61D587ED7C043C0006CF7A9B390C4A2757BEC3C14C25FEC236B53CF37AF788C12165424187F7112 Nonce = 7D8EE12C9E460576 In = 9F7646FEA7A03ADFFCA96D05DDB4BF00D6A928CEF34C27A064C9C31928736748D758B8DC9F44590070DAD463C6114F642C3BBAD73A2CE2B981B547427B23D1F67A77C54E8DAB0AE4477F5F1072028954A53E615D5CFC8F2895B3DAE543F58F692C4F68A9B949740653B084511E6595522A95573C4A5F09F85957DDBAEA67984F3B029D5CBF44606ADE017E1183EF7124C301949E40B58808C4A3948327BAEA69E11EBF9D9E9A5F7C8D625DA97FF0763E38FDBB8A887C5F49B7B719B979C405FBC4EDA281986B985B135B74E309B28707013B3A245983C07F2A136D9CB72588B61BA442DE714C9C091629FFCDFAC95FEBFBE63C90E220F4B9B3D7DD0A6E625796990D94007C7E7C97346C9057B205D92993CD1C1E6921F15364379B5777FEBF757FAF31663C33FC2763F205761473CF898E25699758C2CDDB30A7DD642583E4B28FCEEFF668F60724A74C3FE464B202987723C0FEDD04B11149B38DDEC9D60944C2E613C244AAE4DA6485BA513250EA26EE374B11F316F1900517074FE3CBB62432392B21325E72F4BD7DD2336E7EABDE29E64077584505C15861F0A7FDA0DA6D543AA898DC0EC81BE952990ED00E1EBED638DCFAE0EFECE83B57E284C8CB3AEDC4AFDF8B80A37793E76A7B243B242AFA7DB00A7C1771CC5EBE0BAFE0C5ABC433821DDF98FB978294CCE9C91B8F3338FEA31B99B2A2797EF2DBF300F60AC1637D9D2B Out = 56CDA1D2A211F800DAAF2CC5B6E1FB645C7C259FE7B4F0EC04F7A508E370489265300FBCB39583B0FAA1CF1CB2AF6BA828AAB07AD1248D24291CF23CEB1D57F99DB1CC77284A5F8E3F71FC343D7936448FF268E11E49FD1D26745FF3CBE06613A0425971C067DC73FEC74BE27736014A614A169132C6CCE8DA4EF569670CF0F6E3768D6CA52FEC5D7A713B68C7DC3954007FBD34C896413206889FEC2471A7D1357BB511D19E5DE147E97E63647EE6C4C0E7173CA13002CE3E285F2EF5255F3F3882ADC59B7E9CC31504A16D94944203B303A8E2D2D091E687DB658FE737413901EC3B4E1CA25A25E75D805E4707C62307C60BA2CFB35B54C5F4288EB315B2E87B9318DB3E619942C1BDBED18940A1F4614956BE155D222680C151DA78AEEED9E36DC54C70971172A1EAFE5C55F2C4629F83D956FA2BE31A602FA1B06475271919A87130617EA5C74D3AA436B2E1380714AEB48EBDF782D3CB884D7FECC6FF8116291124B717B8137F0FFFA6351805DCAF4BA0E878B6CE7A4905690406C172C9152E88D69AD2444D011CBC33E8803A0D4590EE4239330878F5C5E8A8E125E4F50B77E412DA658AE661C73326020587D9F2FB7838F51B95A482646489C67EEC26E1DE39F098ED50EBEDD48651525D9C451D9299B473AF1A2E7C376A35AE4CA58205537C6558776ED5C76A6DE1A38A3608615C1F8D33B55232F384B617F6735A28403B Key = 54C907782E8DDA9845AD7E4EEDD6E1A5B0F79551BE4AC805312C9EAC76AFA19F71B1173E170E0AD4DF95BD22719B075D Nonce = CFDA223B42DE19F0 In = 729094DD633A174039270D6A85B6C10A0DD0875B89B0256D9147ECD7095DEAC116540D4F39A37CE40617E3E3ED147F78FDDC4F32DE32AE0DA4D1913C6CA13397323C8854D5D863B3DFDDE349C20C32456CE648C356200FE4F4ABF2D8D8C94C47F95298E1C34139D85E5DD3DB56FEE7DDBBC49FAF000066AAEF0A5B8BEA6E0969645A3C639F63BA673148D46B06957193BD2ADDC98164B6A702707456090297DF4BA8B6573D8749A1C4D58D6CF4F1B0A001C398B2F904F369BD0BB0C52285274F329F6CCC9645B48F5962EBEA6C771E1B60EBFA4DD7EF9D6AAAC9F9887484965DBAB8EF2114FD60EE2E7517F26296EF126D9191376DD98364B8B08657BF9EF362FB8F6A8E3D232880BFFC748A934C55544F1F6C117A0D5FD7307D4B6C0DD32C367AC5126EDF55BA34700452EDDCE4E71CF89D9B8ADE00D181DFDC5E427A2F029DA00E10C29F4ACB4B31F203A1F5CA176654542138564BFECB6139813A741A1A62505C41E1FD7994A14303FD920EF4B9D141FAEA43496EA8FF338852FE0E03BD94A24914B910528890BEDA1C18C98839DDB20FBDD1B93E0D9D5275884D4D79E0EDF1C7FAF3663EEC7689FB80C42F5A44A454067913C1450A7D94AB6624AFEA64F2F79A541E8C436384AFC023D530F852B680642C0177054737E3992837651A321AB1278999DE318C411D4E39789F2C44DC5620EBDA3AA9FD94B6A7897A7012D217710D72 Out = 61DBB89D2482423A6A890AF65B08551BDBCF769B009DC9FB35EB43D1DBB29DF75721430F710BE84BEF1D6753B65D8F9BD2C5E73117872C1D7BEC351BA21B3CC947E4AD9696E26A1FF624895273DBAA512DFD4C1C7803A997B403F363E08AC1E91084E2F99C67A28D711017F950459BD842261356379383285AF1D441E5B75D49661B8F6FEA285B4F6CC9F77A93FBF8D59AE926676EF0FE5C2CA738F3CEE0C85EAFB62230C60A4CDBF2EA8C3B0187C5BCDCCD5F32654B3D885E1F97650F937DFCC93FDE41CCF40DB82CC4525D0C74C73C84D65DA61B1F954B08D4BF5B21F5F17706C646A4EDAE6987E60FD02C6DBA12E9B33B2D6C7688577F5A9E3B13031D92E2B2FFAA37BDA3ED771C38A6D898435D16BA27FC11B934E12D4B09B058442897A1E8CD27886F697DB988E30456327C214390D6FA3205FEBF6E30BB3C6742350EECF0E6064A6D5180D06A2D9EFEC74967B4427AED44DA08D413DE60BA5F93DBF0AF0FE3F70A744EC99F9D2481D5FA6C5EB350CEC1782B86C2B480692F83B3CFFD1FA7F7BD14EDEF4F868DDA8C9DB4892960044CDA1696E392AFC8C735B2833538F3D841E8F972A996DFEA2A1816604F1851AC88A0F4D274E4F35FB98EAE2C273499C3114B9ED3A52443D5980551666EF42694CA159B469F844A7446ADF36BB88CF8AB7EF73904C483A1BF6B9C76CB5234C42C999829D8D4238A283FE2D298FE485CD941F4 Key = 01878648BD27829D266AF6256A445B2FB1F9D72AAEFD0E571448094F0573434D01594D6CC424F62B42F4B2EC419362FA Nonce = 6F2DBCEADBC6B5ED In = 49ED4C5CF19D7F5F499B51FC68FC483CDEB1B58B4A4FE77FA1F39AF7CB20F4B478BA982955CDCC3D614A4462E7BCE483545E0DDEEF5CE510658CE67DFEF211F733EC0636007D09645ABB7B9EE1BD7EF2300468C96F5B6FCB6E56470B40C6FA86F01D957869E8ABE724CE072D17315A051FFDC8C576909A1E804C378B20F3AE98F4F8F4C6C5FF67F96FF39E8B109A93BC4ABC11ED2B4C0B2BCCB31E38485F2595CFEDBA3D859F20BDAED90642468CEDA31BA982D7857DC716EA4EAF6174A2E5B1E0361E69CAFE9CD1A64F0E64C4B4702B9525213C21800E140CF744458066890619CEF0AC034865D00295979B7CDF63D3530BEEB544342BBB651B8EBA16B8E9208926A83C1F353103A4C36A206612A5D6AACF32B867196DF586C6357429394A81B65CD1FD97966721792BC53E7E1880341E3CE2FEA9D48CB257200C516A0BF4351C810F3DF6B888F97BA1765C765B80E94554B100890DE7E0C3D5E5738D62E70BC6151D541327887D7224A0B5FF20B7FEDEE54346BD3E21E5C802C3568841FA3FEFDF72F437B9DF143B0E6A4FA859A9ED836FC6679C786E0D8559933A941AC1C5EF51EE879699325A024DE0D919F88E4D9D86934B7AAE81544D165CF2779C248A0B46F8D4D5A7FAB7B3C81568CDAAB73C405404129D8E56E67EC9FC291A8F17BF153AF4DFA79E8FBF3786C60D58763F97799CED4E77CC6F042FCAE073F9F7BA3D44BBF3BD Out = 1F9B3A83756B933D6B801D33AD8EFE9D40E2D0266B11CC363D99BC3ED52A9070D997F397FE9791AC38658950B9B807FE2AF59EB8D718DA067A2F7ECC37530735FC52897BC29F17E8DBA021137B2D9455B0A452E0194CAFFE93D67EBD6056AA47FE21051107C07CEDC5D4301BB5B135C7BA42E46D55F26CC74887BFA5CBC1EF4377F889B14CAF0E8915D438AD4E0AEA2481CCCEE62B9D1AE9B560576266410DF7FAE7CE9AB0D3C3E3818C9884FFFCFEAC84588F8DCFD3253E842AD11FBE3678292A15507D236D6929866544A9B6DB577280E0DA177F99432AEF2757D1E14516D84E499B041ACE58BA7F8C241F065CC59F30898561EE872D3BE93F815F1D81D85A5039DD7F3A7FCA877D21E82572B792A0CE4BD61273AC9FAE0B6628D15CABC9F156505CE2E8D38A13BD11BFEF58D81508BACF2A27D9710CF58ADC67BB9ECC584AF6DA155ADF9752544238C85D19A1E0E21CE36F395DBAAA0057171260DA02527C2F3B94C89C50A427AF9C906557EFF93081F5F03E3DB2F5D3EFD436474EAC242E62F2D3440304ABD63C5EB46B88A4205C241E7999BF0AE66118A007E03924ACA4EE2CE4AA3C91286D30F9651803297280E89831C609AFE1A09A6D97E1C7238DF98965EC5E7E3A5A70F1DFC0BBE3ED035B07DF7288702D91DF2943EB0E844F3F43F201CD48EC5AA46D4890EE823C63EBF7634753EED926A8AC3AAADB861EC475AF6C432C96 Key = BD63C9A9AF457AA8AC98A656BEED50AA5704FC1F8719DCF7EBFF3F0F17F654BA077D52619BE6E2A945FB98DC49466D00 Nonce = 84167B3A7987ADC2 In = F2F30FE45D60DB1E5C661FF3D53770C9EDEEE81924DE4E4C5EB3B83CF644FB872422C375768A6A0B6B6311C952C3B9D988E487EC2610C99C48FD4E4ECEA5A68AD09BE28CB809B286AC5021EAA5B3DBDF9B54926B901C889FE6A3388C9BD230C528C65EAF6369ECEDC3974DCA550CCF9545E44718A68DE9CB355CDA455B236537CB2295748386B401A4E7035F20A66344171D81338702B0A3967336AF59374FC883C3DAD1104C0B379B75B58CCD8DE6413B97488CF4FD03EEE651C89A31D95A9122DE041BC238130A7522B49998A2EB1CB665E68FA8F45E339E6781D6D260EC14DA068D856C66E8291EF730679CAA190DE5B5FDEF70D30F21FBF590BF3F2C60872025C59EBC4B3A8657571C53FC5C121F8D590FEDF3F337298D92F75D78E8B89F7B83C3438C0CADA0BAF4168DAADFB02F696628E664AC21E8FAD5550EBB711C931AAF6FD775F2BAF467161722855F98DC67FE081C9637BF9F896DA99252C8F4BAA80949A3236D111112F7A2D2E935F667C21282D08C93D051CDDDDBE5A537B7299DDA0F0DFD7A8EA80CD88EC47C12C889F74E4B99F02C121DF18902E07FC962CB9DB1F618D525C99E7832472856F9A27B6254B318AC2962CD18D838DCD8E9F75EDD85DFCFF1E3542BC2A6D7F721CEEFE17AD62AF2C1F3740FA974EB8C2AA65BA714BA84DD0E6F38F326D5FC9A81D8D3C4B674291861B9A49255D52A56BE8F22A797E9DD06B0 Out = 36170FE27C9C3696DA79AF1108F688F6730608DC4686F464BA2ACA29EA40D6BCFC0822174FA4DB9EAB70C124AE93996DF8D86F15614E228060B7101C1B00A9DAF9ED7ED5FA45388D6EBABF17A11775426C05E3467C76D3AAAFC952269CFF5782CEEB614342A6E8C16571C5E22A1B4729CB996462E9CE1CF8E89EB435CCDC0211CDB193697447EA75CFF47BFBEEA6B292E569DD9DF5752A8ACABCEFDF44F8D08B4B8AD9CE9F3A28F74AD7C7488A782755A949E299BD8F8C5913959704525332F735E0EC0ED2409D9161D49E2C72D4D932F75F34AE74858AB8AC4A2AC2AA0CB23FB703B36DC00B4476A7496E96A0C3CE3063706FF17F98C4CE6A0DD76506425A966E07BC87B78951FB6B90BAD68FEEB6A9412292ADED8E94104698C97F1D8F7578B15FB9E72F9984DE82AAB0ED4AAF3A03483BB6E94AE800E2DC426DAA926F1B6DBEBAED02D686654EB05E05F8269CD1E6510E91FCA31129565B91686A7B78106F8FB19EC24AF3DF65EF93CCD327E1FC256C5BABB20D6DB6A4A7EA40E56BFDD658F0E65CE4EA852E9EF7CD26549875B12EC2AD7A4BAB4AA8703858CA1EEF8BA28C3018C1FAF009D611D29D06C6D7F23EB30AFA8EA777458AF374443461D0B645F4636D96F523023CA312C3C98AF07149FA178783451AA4AF062E67404484711418660A38167D59630A06276FCD2D7B4A908DB3C5F738475F52FA229203F5828E29F8381F664B Key = C32F72F4E89166E3EEC9885B1453867AA2E4940C7184A8DC7DCDBD144BFE0406C5D9FAE4A432A8B7AAC50E435D2DD6D0 Nonce = 936122A37F14C86E In = 5E0EA90031BF80B8D03349FF9D54D1E2614A6621A4FCA2366CC11A6EC7C382F563CE0DBABCC0CDE1FA93B0857C93E7360C70569B9DDAC860BDFD7E13B2A882C3E61AB3361F2B12C064C1901E936F2317C8E4BBEBD7A9E653F965CDEB504531A8D133A14DFCF064C1118B1505D3614E7109D180EA9B0D0CEEFBCC93D938EC6CFFA1E8DEFAD464152DA5EAE8954CF7507149D79C54D47ADF40F4BDE034C5D4FEC3F1FC187E47D8B43748B4AA32726ECE9A396A744635E3DC3FA8D769B08ABFD0F87CA77700EB28149BBEDDE28DEBF3137DF99BF7217D2B36BCE9EF71B85488D099FB99870F3F9D23675C1DE2CB6E821F42B263A5F215EFB63CBFB78581783FEFACD044265DF2E80D1EAAD98E417B78FB94F7A5A2D79A9EB85DAB964ADB38D3505D9DEA43532E68C30D280ABF3E69D84846A9DE15353CD2C937B744329ECA447990699E32470947680E03F50134CA1A62FE96857930DD2F22221B0B1762608B9ACE34D907932842BE5E380E27264E0176B9981E98E7539AD68A4327FD9A0B36AC291BE99F32E63935120B8D6FED34C4F6E6CBF870BF8775F4E3833F882A16620E27E2E0FB668980BC757D497949A52A5850D0ECC0B0D40768E6DC5F40D0E6CFA79F0A8917512F3CA467061DD608D4DA6D48E862051EFE8A8EB7813544CD393318D0BA48F914C1A45A787D624EDF366070B8898113B8FCA46D7F6E2F449CF40DFBE51E503177FF7B Out = 8E745FB5E21C3878F34E578D61FA68C6600B68D9AEDF7AC07F2704A17FE65B2700C86E55406273C016340A02DA1C4B742774F193C0C78B27AFE273D12DDF8F2D70E29AB245E61CC3D3BF628AFCDE3C7E20444107FEAC1BCED6CB6A10837FD37C890C444C600D4D9677A32480D09D0A38B6D49BBC43A0B02E576B3C396FD6710BE3E1E05D20831FCCBC154CD80540D0F7396467B76BB4665EA58729EB312A0B2E8A3A216C55EE620E36DCE56A0F4AB1058FECE4F3A7881356D7115085A3C78C8210D3BDDAD512661DB85FD93D4A4779EA2B22027FE3E8040EF9145B779A3B99BBF4A60FC3AC54E8BEC89A7EE7B76A390BACEB7ED76AEB04FB19F6386FD493E437AB0A9147B88363C3FBECD53E0BBDFEF233C8E919F12314215E358D5BEC2CA0D9C63F0A27BB6FDD125BE06609C38B7783A0B1A571744E1C9C381A7F55C84B9DE1DE6AE75B1F035844E24C89BA287AC2508D75B48305D1A9EBD45EAE2479BD50A714964346113736D61E028FB962808BBF441290C5FC6E38D6361E4D910F5CE183765287BBFBAC9FE1852B529565D65BC2AE704426C04244DB19135F0F39AE08502E926A0159C074A90F3EB1893A14AAE1D8291E23DA67D4ED9C7279D4E7F44EC24ADC1E4D0F9F0EE039A78EF0D881723921CB97DDEF563D782709107CC9EAAC5B040E698FC935A76A733FEDCB934AABB34F0CE5B6B63E16009C9C3DCDEEA9CEDF3E07820BAE88 Key = EA269A4E6EABB2004133135AFF93EA6263B7D88CB603252178ED3BF30F31C9449193BB64D627832E5A6B6556571384A1 Nonce = F55B4EA476A09C16 In = F3BF6B544D792A514B0E9A105DB900B4C5E649A4DDBF9C32400E296F8DE37C00788A1D8DA34AA4AB46C6F37A8C6B793E71F85BFE935C0D616D762749475E0539F690AA5ABF21D7995F6136910908EE9A9BB9876B9B26FB3038BE7293ED9116A5CC048B5B928FE4B72658061CF212E76A76E0B6C5C3D516BB09184A42E4F795FF8651EC6E999C3AAB35F8719BF72EF5AD6E60AF88185A68DECF957056418CD470D2180221B0897EE24BC7545E799AD8B6540CE30CDBB87E1444C54605833C592884C0A894869FA9C2129BADEEB32D4A23BDBE8A3EBABFBE735B601A693013E61478463D67818E2A3607D2CD4D24D069CB9AAA66D4ACB4CB0B065DF929BF97797C5CB1015DDF8BD33F5F503CB2159F64F748F543188FF8EBEA71A6A669907B117DF1535113A8E0FCA60AA095A43CAE9B21D20540C0D869CD7A970B16DAE3E52E84ECDD4DA73CB56763F72158D93AA6BC10A0456DDF54D4E23E47B0D0E4D376F90B10CAB0D6CE9EEB0792894B29104182B032BFA6F2812AF43CC05EF13BC7AFAA7469E133FDEF68823F8D700D6D88BFBD04F13C1F692785A31A36B53CF9AEE267EE4517C822BB9CCA44FA294601DFD0FB452B40C374E09542B0FA05AA264D35233F82C2C202FBFFDC50665740732F114B11CCC4BF786E0DBAD56D730AC05E12EC234BA17418154A968E946F87F7813479339911D16F3422B483F9B0FAB0E20B17549D2BB46E5BCB76 Out = 29DF14368A0F03474DCBB394BED5227EF922C15EBE44718169EE7047D66EFFFA2E36AD3C4F3C1FC3759F9742B6E51356F3262AFE48A4D8ACAACE5B57B795BC8BA11A8609ED34A96B59A3051D3CD5668DD8A15796E8CBE2821525438043C7CEF181BF3E146D9905AA67457C07BBFA4D080E86EEBEA9324D57EF8D790CB10C643058CF5BE170A7BF0B03CEA9AA81B76A6A090B8FCCDDD159195C3D129D0D6692AEDCD6561CC61DE0EC9AD3A84EA6AD1178811113E84328E0F50B90AE9A23921FA545F58BA6E9B8F885FAA72B89952A6E889322948A7AF42896C80C03E0E1708A961DE724CB7607EB00BB6362C6E5C0826A40DE29DB0CC05E29D7880A9B3CA3776E6A435674C60C2CEB8B2EC3B386FB3F46A86935F5D1590DCC0815EADCD070A250BAB2464F0CD85AA8552C5506488602EBB46F80C3E6F9D5FE9F1BA1E8E3B94E4DB55FBDD3628BE894F35A932662B358BDE9E8EFEF273CD35A3605381E3DFB7FB5B1FB64F084D645C337C06376E3E1C30533036A2079DEFE4EB076EF7D254AC0848DE99AC6B6BFEB18AC14D531EF98C4B4F71813F82F5A76435C587BF0027AA376B24D09AA990B1EEC6E292E46A462B192E0B8EB85110F7B5870113E031D10E29B9B02A9AD8C52D397D3F77AD810364E66A0DCBF04B6948DC322A11980495A6B121F8B3A8CE2EC4477F96E9832FBD3D777547A1B0199BF7696094AD2883F643A81FA4580D5E73CFC [SHACAL2/XTS] # This was generated by Botan Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB In = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Out = BD07DC61483564F517087264D85338B3D3A8FD7AE68C74A52E454916DB66597366 [Threefish-512/XTS] # This was generated by Botan Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB In = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Out = F188D041F059F2E68829F275DCCBCD3090369B809DEBCF88D97D0BF5EA18F6C6BF52ED5ECE77C8C8707252DB9CD1F1D6149BEEC981EB559232C701B434CD52F5AE botan-2.4.0/src/tests/data/ocb/000077500000000000000000000000001322470703100162245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/ocb/ocb_long.vec000066400000000000000000000010371322470703100205060ustar00rootroot00000000000000 Keylen = 128 Taglen = 128 Output = 67E944D23256C5E0B6C61FA22FDF1EA2 Keylen = 192 Taglen = 128 Output = F673F2C3E7174AAE7BAE986CA9F29E17 Keylen = 256 Taglen = 128 Output = D90EB8E9C977C88B79DD793D7FFA161C Keylen = 128 Taglen = 96 Output = 77A3D8E73589158D25D01209 Keylen = 192 Taglen = 96 Output = 05D56EAD2752C86BE6932C5E Keylen = 256 Taglen = 96 Output = 5458359AC23B0CBA9E6330DD Keylen = 128 Taglen = 64 Output = 192C9B7BD90BA06A Keylen = 192 Taglen = 64 Output = 0066BC6E0EF34E24 Keylen = 256 Taglen = 64 Output = 7D4EA5D445501CBE botan-2.4.0/src/tests/data/ocb/ocb_wide.vec000066400000000000000000000055251322470703100205050ustar00rootroot00000000000000 Key = 8182838485868788898A8B8C8D8E8F909192939495969798 Nonce = F0F1 AD = In = Out = B9CACBDCDDCECFFF75C0B9AA97808DE6FBCCC1D2AFB8B482 Key = 9192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8 Nonce = F1F2 AD = 05060708090A0B0C0D0E0F10 In = 0102030405060708090A0B0C Out = 4EB0BAACA698928B86E59F81B3474B5F53676B404B225E622E1206EADEA2B6BB4F736646 Key = A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8 Nonce = F2F3 AD = 060708090A0B0C0D0E0F101112131415161718191A1B1C1D In = 02030405060708090A0B0C0D0E0F10111213141516171819 Out = A8B5AEA7B4E9E2A2E803081982C7C46D36B380908BCEEE0775898DA1B5C9CDFF8522E6DA3E52461A7E92A69B7F132636 Key = B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8 Nonce = F3F4 AD = 0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A In = 030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 Out = F8F1CEBB841D227D911D024669E08D903E0768250AA3CFF7BC466C3E14D6FC8A3D3ED4A70295B8FBD6416C3B8BA5482AFF18576CA0672A468B4C021C Key = C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8 Nonce = F4F5 AD = 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 In = 0405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 Out = CEFB901163563D53D5AC8764164388D091C40FEAB8ED24B7ECF1824B415C2FC95706359ED4A97B2B720FDC711B66B2915C8BC62509DE93E236965BFB57C04D57F96EE347EB7CF322 Key = 8182838485868788898A8B8C8D8E8F909192939495969798 Nonce = F0F1F2F3F4F5F6F7F8F9FAFB AD = In = Out = F00F1A7125DACF832FD0F50E6B44615C9996D209B29DF961 Key = 9192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8 Nonce = F1F2F3F4F5F6F7F8F9FAFBFC AD = 05060708090A0B0C0D0E0F10 In = 0102030405060708090A0B0C Out = 9AFC5E331177D5B4A34506C8670BAFC0E4882C7F6E82C72BD79BDF9E5AD6D4C830BC7A8B Key = A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8 Nonce = F2F3F4F5F6F7F8F9FAFBFCFD AD = 060708090A0B0C0D0E0F101112131415161718191A1B1C1D In = 02030405060708090A0B0C0D0E0F10111213141516171819 Out = 92A7C0C02A1F6E245762A3C3885DAFF1FAED6ACB4514475A5995C61B5E92C504AF63D449CD41F4F2F6F9EAF60B8017A0 Key = B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8 Nonce = F3F4F5F6F7F8F9FAFBFCFDFE AD = 0708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A In = 030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223242526 Out = 2070BEDB155997DD86DE55F27CD45AA8223B16313C31BCC0D347CC7EF551DA4A27BCB1806D9418BB37C64AFB91272D0D193F32BCB7B081A150505FBB Key = C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8 Nonce = F4F5F6F7F8F9FAFBFCFDFEFF AD = 08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334353637 In = 0405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233 Out = 70E46BCD56C24D0FBC2A280C3C2A26A9AAB9A0979B8B81C952EE799774C85F953E809AF6FEC0D5524972730C380017EF889E94B2D0C6CC75879291B49B8E86F9D4C7D6EE29383576 botan-2.4.0/src/tests/data/ocb/ocb_wide_long.vec000066400000000000000000000005651322470703100215230ustar00rootroot00000000000000 [Toy128] Output = 0D099181BE37171BF94582877D6D4693 [Toy192] Output = BFC53A29EABF2774369F3611DED760AE33338B607E5A8E40 [Toy256] Output = 623C27E137975E25BEF2F8441CB5BDEAE8E0F1E158515193900BBD20D1A7AFF7 [Toy512] Output = 6748655A0A83543D8AA6287AE9FFC37C9A433332DDFD4E8B42F94D741944D440 [SHACAL2] Output = DC4AA181A65BD11EAA23D0881A20740B7DBA53C9DE2474DB3C3EF04770DFAD99 botan-2.4.0/src/tests/data/otp/000077500000000000000000000000001322470703100162635ustar00rootroot00000000000000botan-2.4.0/src/tests/data/otp/hotp.vec000066400000000000000000000027001322470703100177330ustar00rootroot00000000000000[SHA-1] # From RFC 4226 Key = 3132333435363738393031323334353637383930 Digits = 6 Counter = 0 OTP = 755224 Counter = 1 OTP = 287082 Counter = 2 OTP = 359152 Counter = 3 OTP = 969429 Counter = 4 OTP = 338314 Counter = 5 OTP = 254676 Counter = 6 OTP = 287922 Counter = 7 OTP = 162583 Counter = 8 OTP = 399871 Counter = 9 OTP = 520489 # Long digit tests Digits = 7 Counter = 7 OTP = 2162583 Counter = 8 OTP = 3399871 Digits = 8 Counter = 7 OTP = 82162583 Counter = 8 OTP = 73399871 # From RFC 6238 Key = 3132333435363738393031323334353637383930 Digits = 8 Counter = 1 OTP = 94287082 Counter = 37037036 OTP = 07081804 Counter = 37037037 OTP = 14050471 Counter = 41152263 OTP = 89005924 Counter = 66666666 OTP = 69279037 Counter = 666666666 OTP = 65353130 [SHA-256] # From RFC 6238 Key = 3132333435363738393031323334353637383930313233343536373839303132 Digits = 8 Counter = 1 OTP = 46119246 Counter = 37037036 OTP = 68084774 Counter = 37037037 OTP = 67062674 Counter = 41152263 OTP = 91819424 Counter = 66666666 OTP = 90698825 Counter = 666666666 OTP = 77737706 [SHA-512] # From RFC 6238 Key = 31323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334 Digits = 8 Counter = 1 OTP = 90693936 Counter = 37037036 OTP = 25091201 Counter = 37037037 OTP = 99943326 Counter = 41152263 OTP = 93441116 Counter = 66666666 OTP = 38618901 Counter = 666666666 OTP = 47863826 botan-2.4.0/src/tests/data/otp/totp.vec000066400000000000000000000004421322470703100177500ustar00rootroot00000000000000[SHA-1] # From RFC 6238 Key = 3132333435363738393031323334353637383930 Digits = 8 Timestep = 30 Timestamp = 1970-01-01T00:00:59 OTP = 94287082 Timestamp = 2005-03-18T01:58:29 OTP = 07081804 Timestamp = 2009-02-13T23:31:30 OTP = 89005924 Timestamp = 2033-05-18:03:33:20 OTP = 69279037 botan-2.4.0/src/tests/data/pad.vec000066400000000000000000000056311322470703100167310ustar00rootroot00000000000000[NoPadding] In = FFFFFF Out = FFFFFF Blocksize = 16 In = FFFFFFFF Out = FFFFFFFF Blocksize = 32 In = FFFFFFFFFFFF Out = FFFFFFFFFFFF Blocksize = 64 In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF Blocksize = 8 In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF Blocksize = 8 [PKCS7] In = FFFFFF Out = FFFFFF0D0D0D0D0D0D0D0D0D0D0D0D0D Blocksize = 16 In = FFFFFFFF Out = FFFFFFFF1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C Blocksize = 32 In = FFFFFFFFFFFF Out = FFFFFFFFFFFF3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A3A Blocksize = 64 In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF0808080808080808 Blocksize = 8 In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF07070707070707 Blocksize = 8 [PKCS7_Invalid] In = FFFFFFFFFFFFFFFFFF07070706070707 Blocksize = 8 In = FFFFFFFFFFFFFFFFFFFF070707070707 Blocksize = 8 [OneAndZeros] In = FFFFFF Out = FFFFFF80000000000000000000000000 Blocksize = 16 In = FFFFFFFF Out = FFFFFFFF80000000000000000000000000000000000000000000000000000000 Blocksize = 32 In = FFFFFFFFFFFF Out = FFFFFFFFFFFF80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Blocksize = 64 In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF8000000000000000 Blocksize = 8 In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF80000000000000 Blocksize = 8 [OneAndZeros_Invalid] In = FF80000000000008 Blocksize = 8 In = FF70000000000008 Blocksize = 8 In = FF70000000000081 Blocksize = 8 [X9.23] In = FFFFFF Out = FFFFFF0000000000000000000000000D Blocksize = 16 In = FFFFFFFF Out = FFFFFFFF0000000000000000000000000000000000000000000000000000001C Blocksize = 32 In = FFFFFFFFFFFF Out = FFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003A Blocksize = 64 In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF0000000000000008 Blocksize = 8 In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF00000000000007 Blocksize = 8 [X9.23_Invalid] In = FFFFFFFFFFFFFFFFFF000000FFFFF00007 Blocksize = 8 In = FFFFFFFFFFFFFFFFFF0000000FF00007 Blocksize = 8 In = FFFFFF8000000000000000000000000D Blocksize = 16 [ESP] In = FFFFFF Out = FFFFFF0102030405060708090A0B0C0D Blocksize = 16 In = FFFFFFFF Out = FFFFFFFF0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C Blocksize = 32 In = FFFFFFFFFFFF Out = FFFFFFFFFFFF0102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A Blocksize = 64 In = FFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFF0102030405060708 Blocksize = 8 In = FFFFFFFFFFFFFFFFFF Out = FFFFFFFFFFFFFFFFFF01020304050607 Blocksize = 8 [ESP_Invalid] In = FF010202 Blocksize = 4 In = FF010204 Blocksize = 4 In = FFFFFF0102030405060708090A0B0C0F Blocksize = 16 In = FFFFFF0102030404060708090A0B0C0D Blocksize = 16 In = FFFFFFFF0002030405060708090A0B0C Blocksize = 16 botan-2.4.0/src/tests/data/passhash/000077500000000000000000000000001322470703100172735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/passhash/bcrypt.vec000066400000000000000000000346421322470703100213060ustar00rootroot00000000000000 # Generated by jBCrypt 0.3 Password = 616263 Passhash = $2a$05$DfPyLs.G6.To9fXEFgUL1O6HpYw3jIXgPcl/L3Qt3jESuWmhxtmpS # http://www.openwall.com/lists/john-dev/2011/06/19/2 Password = A3 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq # Following values from http://download.openwall.net/pub/projects/crypt/bcrypt-tester-1.0.tar.gz Password = Passhash = $2a$05$CCCCCCCCCCCCCCCCCCCCC.7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy Password = 552A55 Passhash = $2a$05$CCCCCCCCCCCCCCCCCCCCC.E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW Password = 552A552A Passhash = $2a$05$CCCCCCCCCCCCCCCCCCCCC.VGOzA784oUp/Z0DY336zx7pLYAy0lwK Password = 552A552A55 Passhash = $2a$05$XXXXXXXXXXXXXXXXXXXXXOAcXxm9kjPGEMsLznoKqmqw7tc8WCx4a Password = 303132333435363738396162636465666768696A6B6C6D6E6F707172737475767778797A4142434445464748494A4B4C4D4E4F505152535455565758595A303132333435363738396368617273206166746572203732206172652069676E6F726564 Passhash = $2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui Password = A3 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq Password = FFFFA3 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3e Password = FFA33334FFFFFFA3333435 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.o./n25XVfn6oAPaUvHe.Csk4zRfsYPi Password = FFA3333435 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.nRht2l/HRhr6zmCp9vYUvvsqynflf9e Password = A36162 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.6IflQkJytoRVc1yuaNtHfiuq.FRlSIS Password = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6368617273206166746572203732206172652069676E6F72656420617320757375616C Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6 Password = AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55 Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy Password = 55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF55AAFF Passhash = $2a$05$/OK.fbVrR/bpIqNJ5ianF.9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe # Test very long (> 256 char) password # Generated by https://www.dailycred.com/article/bcrypt-calculator Password = 4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595a4142434445464748494a4b4c4d4e4f505152535455565758595b Passhash = $2a$04$nP0HWhorPRGl309OF27N0Oluj0wfAKWClP9gDcqOU1D.VF4x6bHTi # Generated by OpenBSD's bcrypt code Password = Passhash = $2a$04$......................w74bL5gU7LSJClZClCa.Pkz14aTv/XO Password = 41 Passhash = $2a$04$......................1ylfG1rzUcx/p4E2WWXbK1hNBjulV/e Password = 4142 Passhash = $2a$04$......................eLmsldq6Kef4lNzfsH3GLn5XEr9/dky Password = 414243 Passhash = $2a$04$......................SeoxjjNIHEA7B01Yt2Fq2YNSKittPem Password = 41424344 Passhash = $2a$04$......................5UWApRNcV8gDN6km6KdMC7MJRnFLJLi Password = 4142434445 Passhash = $2a$04$......................aqTIOQ1wy6xo2DKiG2jtVHuLfBC.Cte Password = 414243444546 Passhash = $2a$04$......................3eUc6EVdIHLPSHsfENd73y1qHUgeET6 Password = 41424344454647 Passhash = $2a$04$......................FuV659LudNIL0yJfqrb.JB0ab1eCXCy Password = 4142434445464748 Passhash = $2a$04$......................1WDT31a/PBuYi4hmam2gvmgA54t9HUO Password = 414243444546474849 Passhash = $2a$04$......................aHMfyD101pOa19Avcj8wFk7x8JyP/Oi Password = 4142434445464748494A Passhash = $2a$04$......................MQooKLE8.P36GbWDUbrk2NT3PYZsXOG Password = 4142434445464748494A4B Passhash = $2a$04$......................eprYLc9vXOwDMCyqLAGvznMqJmzEEzu Password = 4142434445464748494A4B4C Passhash = $2a$04$......................wg1/merzamWae4FzZdzXVFCzeXcdRBe Password = 4142434445464748494A4B4C4D Passhash = $2a$04$......................F45.kWUMV0S88ts9G8w1ySdc0eL1QsO Password = 4142434445464748494A4B4C4D4E Passhash = $2a$04$......................b5f2SSP91ThKR9rHlejbqwpgGTKgEPW Password = 4142434445464748494A4B4C4D4E4F Passhash = $2a$04$......................GAUIFe599t9404.M92TX4qg.qlyozvu Password = 4142434445464748494A4B4C4D4E4F50 Passhash = $2a$04$......................hGf/sBFCzxtt7aLth.CkSiqMLfMNkky Password = 4142434445464748494A4B4C4D4E4F5051 Passhash = $2a$04$......................wxi.5vCbqbfYRB4Ptb9YMVEedkzkg2G Password = 4142434445464748494A4B4C4D4E4F505152 Passhash = $2a$04$......................fEQhKOa7gmjs2X6pPxkAG4Ua1CK3/MG Password = 4142434445464748494A4B4C4D4E4F50515253 Passhash = $2a$04$......................GeXtzTa.p8bAbpHdSzLDDvcT5z8rd2G Password = 4142434445464748494A4B4C4D4E4F5051525354 Passhash = $2a$04$......................D.nuIHnFpRTTietbZXCpTqMLktmgvOG Password = 4142434445464748494A4B4C4D4E4F505152535455 Passhash = $2a$04$......................0rP0aIe6CiaXgLviO7CrReRMoq4Z76u Password = 4142434445464748494A4B4C4D4E4F50515253545556 Passhash = $2a$04$......................2nuK3e9hYlR3ZpUulSwuH9XEFf/TwB. Password = 4142434445464748494A4B4C4D4E4F5051525354555657 Passhash = $2a$04$......................pFb7ADMM2CyyVheTwTO4ljTOaAd.SO2 Password = 4142434445464748494A4B4C4D4E4F505152535455565758 Passhash = $2a$04$......................Hb6CQJzZLi0jF2iRoWF/LytXl0UIlGi Password = 4142434445464748494A4B4C4D4E4F50515253545556575859 Passhash = $2a$04$......................hDkGLLxi1xlzQ2l8yCVZW8STSQwY8ca Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A Passhash = $2a$04$......................rEzQdCIvx3710X.o8rPHje0DJNW7nby Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B Passhash = $2a$04$......................YRx250oXqZ8PAF9VCwDd3tMHvNG/EYS Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C Passhash = $2a$04$......................8VVYuFwpyz50KoSQSww6HtAcM.puvFK Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D Passhash = $2a$04$......................U/uWNlMQ1nCojM9KJYXst0H..Vr3K7e Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E Passhash = $2a$04$......................JKICUBStZDD90QJxUirvbW6XhMN3k0i Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F Passhash = $2a$04$......................XQ1Pz.WGSIGPbun4umJ/uKtAi5mImNK Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60 Passhash = $2a$04$......................zK87xeHJykwKa7B3WqaREFx8LkTw7w. Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061 Passhash = $2a$04$......................DRU9poimCmGTetm8ijeul2OZ7Ghgyn. Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162 Passhash = $2a$04$......................cOoYOK6c366gK6BBmcYlCPqGGy7/Yce Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263 Passhash = $2a$04$......................f31Ni98iYpbJzxJoqhWuxvB8PPUOc5G Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 Passhash = $2a$04$......................uZLqllZzmsIDcmdihrBslz0A.WJp5lC Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465 Passhash = $2a$04$......................Mv6hK0wgc5CxkxPVhyit7DjpOLHCRme Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566 Passhash = $2a$04$......................40cOEgw5sV8TKGjzB4JF.yiTJCBJGsq Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667 Passhash = $2a$04$......................DR/BFDmrsl0CqGeCo5EYawLtrLL2PF6 Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768 Passhash = $2a$04$......................7VtgAnmfpC6qryaX7qsvlfCvk2ooW4S Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263646566676869 Passhash = $2a$04$......................Eo0q.nfaVXn4NIfoyveRiLRKHSMDAHW Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A Passhash = $2a$04$......................kfxex5FfUJhJQYogm.8FloXjQjvcl.. Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B Passhash = $2a$04$......................fmpuNlu0eW7fsRBEbIlZs/ZIP0a9Dby Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C Passhash = $2a$04$......................mI0Rbwk/yFUkA/TLKmMfSMu4KqSGzZq Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D Passhash = $2a$04$......................jqCcJxoUtwRpIFnCPZtrn2zpFY6tU6a Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E Passhash = $2a$04$......................FGzij2Dvl2qbVhtOfDhvGodD0BaH1zO Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F Passhash = $2a$04$......................8gWGyOqSrT/N84xajt5y1cc7kdYTS1C Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70 Passhash = $2a$04$......................n0uapt/O8ZGLLoTYi8RVz5gtLzcH9OG Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071 Passhash = $2a$04$......................snIIPVZopm0TC4WLrpTNtW136us.66S Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172 Passhash = $2a$04$......................xJlz/E02Am2/sxO97jDYuFkxKMCNPuC Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273 Passhash = $2a$04$......................ci6b5BSX.Gt1z2O5on9.k9Po1q6nJMe Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374 Passhash = $2a$04$......................JGYY7FRsBznRZJfr8gNUgmRIekndoEu Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475 Passhash = $2a$04$......................c.8sucK9TMUPlwbux0u2EjoWeS7exm. Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576 Passhash = $2a$04$......................2iQopzqprPYwjRJTAJnVPO00t8/HyT. Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F7071727374757677 Passhash = $2a$04$......................COrfw5/Mj6Js8CePzOVuowO57dzDlXq Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778 Passhash = $2a$04$......................M/SrGocfiSlHaOnFqqV0RGjlcuPM2xO Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576777879 Passhash = $2a$04$......................gPjyepv.g7qMZXDTwcEjfks0xFwQDsW Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A Passhash = $2a$04$......................YCdU1yffMxpqGnbkhm4j11QBUQzr6vW Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B Passhash = $2a$04$......................PFZW7x0F2WdDhhfr9IbRIJhaUrlT/4. Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C Passhash = $2a$04$......................2gd/Za4BdTci7v1rdamN0XZ5lk5PnuO Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D Passhash = $2a$04$......................fbhaW8SPcJjDFtC9ruTvwIZhbhoT6Ve Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E Passhash = $2a$04$......................yB12tMsxREReDqkSHzR6G890abKjKHi Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F Passhash = $2a$04$......................yyR3U//QnDydsWfSIZwCsrzXqwdED7e Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80 Passhash = $2a$04$......................IWK3CyxBeu3hZXP./rSl1gS.CHOl51q Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081 Passhash = $2a$04$......................OrN52h3sUOH7u7aUFZLLPecPAC6pDUy Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182 Passhash = $2a$04$......................7czL69h9T6Z84Yen8wrtzeNUPZIksLq Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283 Passhash = $2a$04$......................hlFxmtvTDFEJ/W7ViRXVzIBmwELyxde Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384 Passhash = $2a$04$......................wtpFiSjRvlfidwkUDR2EefHBYOStMyO Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485 Passhash = $2a$04$......................fFhiRdC6u8ZnZNqxK5vIyMinSFC4HjG Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586 Passhash = $2a$04$......................FCJRl4rapF1jLog3AjcYUtLupr62MHW Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 Passhash = $2a$04$......................qt4eTaEVpLnPbEit4noon6YMRxjO8kq Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788 Passhash = $2a$04$....................../VvYrJip/blbJEy92Sih8t0k26f242. # This demonstrates truncation of passwords > 72 chars, identical to previous hash Password = 4142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F80818283848586878889 Passhash = $2a$04$....................../VvYrJip/blbJEy92Sih8t0k26f242. botan-2.4.0/src/tests/data/passhash/passhash9.vec000066400000000000000000000001441322470703100216740ustar00rootroot00000000000000 Password = 736563726574 Passhash = $9$AAAKhiHXTIUhNhbegwBXJvk03XXJdzFMy+i3GFMIBYKtthTTmXZA PRF = 0 botan-2.4.0/src/tests/data/pbkdf/000077500000000000000000000000001322470703100165475ustar00rootroot00000000000000botan-2.4.0/src/tests/data/pbkdf/pbkdf1.vec000066400000000000000000000015021322470703100204130ustar00rootroot00000000000000[PBKDF1(SHA-160)] Salt = 40AC5837560251C275AF5E30A6A3074E57CED38E Iterations = 6 Passphrase = ftlkfbxdtbjbvllvbwiw OutputLen = 19 Output = 768B277DC970F912DBDD3EDAD48AD2F065D25D Salt = 7008A9DC1B9A81470A2360275C19DAB77F716824 Iterations = 6 Passphrase = xnsosmkvhggzspcncpoc OutputLen = 20 Output = 4D90E846A4B6AAA02AC548014A00E97E506B2AFB Salt = CCFC44C09339040E55D3F7F76CA6EF838FDE928717241DEB9AC1A4EF45A27711 Iterations = 2001 Passphrase = otilqwlukqts OutputLen = 20 Output = 71ED1A995E693EFCD33155935E800037DA74EA28 Salt = 8108883FC04A01FEB10661651516425DAD1C93E0 Iterations = 10000 Passphrase = kzneqfflbtvsthnfctaf OutputLen = 14 Output = F345FB8FBD880206B650266661F6 Salt = BC8BC53D4604977C3ADB1D19C15E87B77A84C2F6 Iterations = 10000 Passphrase = qkxhlqpemxhykmyucjbo OutputLen = 14 Output = 2D54DFED0C7EF7D20B0945BA414A botan-2.4.0/src/tests/data/pbkdf/pbkdf2.vec000066400000000000000000000052511322470703100204210ustar00rootroot00000000000000[PBKDF2(HMAC(SHA-160))] Salt = 0001020304050607 Iterations = 10000 Passphrase = OutputLen = 32 Output = 59B2B1143B4CB1059EC58D9722FB1C72471E0D85C6F7543BA5228526375B0127 Salt = 9B56E55328A4C97A250738F8DBA1B992E8A1B508 Iterations = 10000 Passphrase = jyueqgxrscgglpxdykcf OutputLen = 14 Output = DF6D9D72872404BF73E708CF3B7D Salt = 57487813CDD2220DFC485D932A2979EE8769EA8B Iterations = 101 Passphrase = aqrqsznzvvzgtksammgo OutputLen = 40 Output = FA13F40AF1ADE2A30F2FFFD66FC8A659EF95E6388C1682FC0FE4D15A70109517A32942E39C371440 Salt = ED1F39A0A7F3889AAF7E60743B3BC1CC2C738E60 Iterations = 1000 Passphrase = ltexmfeyylmlbrsyikaw OutputLen = 10 Output = 027AFADD48F4BE8DCC4F Salt = 94AC88200743FB0F6AC51BE62166CBEF08D94C15 Iterations = 1 Passphrase = cxgnyrcgrvllylolsjpo OutputLen = 32 Output = 7C0D009FC91B48CB6D19BAFBFCCFF3E2CCABFE725EAA234E56BDE1D551C132F2 Salt = 24A1A50B17D63EE8394B69FC70887F4F94883D68 Iterations = 5 Passphrase = xqyfhrxehiedlhewnvbj OutputLen = 32 Output = 4661301D3517CA4443A6A607B32B2A63F69996299DF75DB75F1E0B98DD0EB7D8 Salt = 9316C80801623CC2734AF74BEC42CF4DBAA3F6D5 Iterations = 100 Passphrase = andaqkpjwabvcfnpnjkl OutputLen = 30 Output = 82FB44A521448D5AAC94B5158EAD1E4DCD7363081A747B9F7626752BDA2D Salt = 612CC61DF3CF2BDB36E10C4D8C9D73192BDDEE05 Iterations = 100 Passphrase = hsavvyvocloyuztlsniu OutputLen = 30 Output = F8EC2B0AC817896AC8189D787C6424ED24A6D881436687A4629802C0ECCE Salt = 45248F9D0CEBCB86A18243E76C972A1F3B36772A Iterations = 100 Passphrase = eaimrbzpcopbusaqtkmw OutputLen = 34 Output = C9A0B2622F13916036E29E7462E206E8BA5B50CE9212752EB8EA2A4AA7B40A4CC1BF Salt = A39B76C6EEC8374A11493AD08C246A3E40DFAE5064F4EE3489C273646178 Iterations = 1000 Passphrase = gwrxpqxumsdsmbmhfhmfdcvlcvngzkig OutputLen = 64 Output = 4C9DB7BA24955225D5B845F65EF24EF1B0C6E86F2E39C8DDAA4B8ABD26082D1F350381FADEAEB560DC447AFC68A6B47E6EA1E7412F6CF7B2D82342FCCD11D3B4 [PBKDF2(HMAC(SHA-256))] Salt = 0001020304050607 Iterations = 10000 Passphrase = xyz OutputLen = 48 Output = DEFD2987FA26A4672F4D16D98398432AD95E896BF619F6A6B8D4ED1FAF98E8B531B39FFB66966D0E115A6CD8E70B72D0 [PBKDF2(HMAC(SHA-384))] Salt = 0001020304050607 Iterations = 10000 Passphrase = xyz OutputLen = 48 Output = 47A3AE920B24EDAA2BB53155808554B13FAB58DF62B81F043D9812E9F2881164DF20BBFFA54E5EE2489FA183B6718A74 [PBKDF2(HMAC(SHA-512))] Salt = 0001020304050607 Iterations = 10000 Passphrase = xyz OutputLen = 48 Output = DAF8A734327745EB63D19054DBD4018A682CEF11086A1BFB63FDBC16158C2F8B0742802F36AEF1B1DF92ACCBEA5D31A5 [PBKDF2(CMAC(Blowfish))] Salt = 24A1A50B17D63EE8394B69FC70887F4F94883D68 Iterations = 5 Passphrase = xqyfhrxehiedlhewnvbj OutputLen = 32 Output = 43734BADB91F5D89DB20B469CD2EF376CAABC226EE3952872050428EFB5E3026 botan-2.4.0/src/tests/data/pbkdf/pgp_s2k.vec000066400000000000000000000040711322470703100206150ustar00rootroot00000000000000[OpenPGP-S2K(SHA-160)] # Generated using Golang x/crypto/openpgp/s2k Salt = Iterations = 1 Passphrase = Output = DA39A3EE5E6B Salt = Iterations = 1 Passphrase = hello Output = AAF4C61D Salt = 01020304 Iterations = 1 Passphrase = hello Output = 10295AC1 Salt = 01020304 Iterations = 1 Passphrase = bar Output = BD8AAC6B9EA9CAE04EAE6A91C6133B58B5D9A61C14F355516ED9370456 Salt = 04030201 Iterations = 31 Passphrase = bar Output = 2AF5A99B54F093789FD657F19BD245AF7604D0F6AE06F66602A46A08AE Salt = 2AE6E5831A717917 Iterations = 65536 Passphrase = ilikepie Output = A32F874A4CF95DFAD8359302B395455C Salt = 0102030405060708 Iterations = 1 Passphrase = passphrase Output = eec8929a31187dd3a9a7ce5a97d96a67706382bbef70fe3b2a3aeeaf176bce252c117970a51fd8b770a69f8ecb199505395bd7b0c0760d6a38ac82900b23fe3b Salt = 0102030405060708 Iterations = 65536 Passphrase = passphrase Output = 24ce08a4a31de2208acdc15347def7a63492d38a0c08f80533a746279d91cb25e1b6b740b09e20a4884ca1944d506eb200753761066e8d4b24957c2593388457 Salt = 0102030405060708 Iterations = 10000000 Passphrase = passphrase Output = 09efbd3599e2453c6cf1749a7ed169514a12d1a721549468c6d0ef6737fa3e27ab6d100f9839694fc70c484a42b00ef87463d07e2aafb92033843a4bd5f37971 [OpenPGP-S2K(SHA-384)] # Generated using Golang x/crypto/openpgp/s2k Salt = 0102030405060708 Iterations = 1 Passphrase = passphrase Output = ea024c2de8af9a3edfbac9422f7b17e17c3165147b43f4edd58b55af9a412d07e0631f431a7e0028fbb145d9d5e059a888f1a7526cd338b1b6082a8681b446fa Salt = 0102030405060708 Iterations = 18 Passphrase = passphrase Output = ea024c2de8af9a3edfbac9422f7b17e17c3165147b43f4edd58b55af9a412d07e0631f431a7e0028fbb145d9d5e059a888f1a7526cd338b1b6082a8681b446fa Salt = 0102030405060708 Iterations = 19 Passphrase = passphrase Output = 491aa377a1a9526d53b118587a03f85f5dc64568f3aabaad66aafc923397fb74d7017a6a4812bff2d9beddcbc6a0dbd3b96a3f9a69b637d68670acd48d4dfa4e Salt = 0102030405060708 Iterations = 1000000 Passphrase = passphrase Output = af4986488f4e53ac4f7991a0bb8de15441ba1070481fe63b126ff3de2e1072f568dd3d6c5887d008925d27649494ae6f4860e141d5eeabe4f93745ca9cb8e08c botan-2.4.0/src/tests/data/pk_pad_eme/000077500000000000000000000000001322470703100175455ustar00rootroot00000000000000botan-2.4.0/src/tests/data/pk_pad_eme/pkcs1.vec000066400000000000000000000024671322470703100212760ustar00rootroot00000000000000[PKCS1v15] RawCiphertext = ValidInput = false RawCiphertext = 00 ValidInput = false RawCiphertext = 0000 ValidInput = false RawCiphertext = FF ValidInput = false RawCiphertext = FF02 ValidInput = false RawCiphertext = 0002DEDE24212121DEDEDE5EDEDEDEDE0A5EDE00000000DEDEDE010000000000 Plaintext = 000000DEDEDE010000000000 ValidInput = true RawCiphertext = 022C2C4018181818181818181818183A18181818181818180000002C022C00010A2C2C2C2C2C022C ValidInput = false RawCiphertext = 00022C2C4018181818181818181818183A18181818181818180000002C022C00010A2C2C2C2C2C022C Plaintext = 00002C022C00010A2C2C2C2C2C022C ValidInput = true RawCiphertext = 0002FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010100000021FFFFFFFFFFFFBC Plaintext = 000021FFFFFFFFFFFFBC ValidInput = true RawCiphertext = 0002F9CCFFFFCCCCCCCCCCCCCCCC4E0000CCFFFFCCCCCCCCCCCCCCCCCCCCCCCCCC06 Plaintext = 00CCFFFFCCCCCCCCCCCCCCCCCCCCCCCCCC06 ValidInput = true RawCiphertext = 000253FFC43B5253FF0A53DE0000FD Plaintext = 00FD ValidInput = true RawCiphertext = 0002FFFF06FFFFFFFFFF00000000000000000000000000000000000000000000000000000000FF0A Plaintext = 000000000000000000000000000000000000000000000000000000FF0A ValidInput = true # Padding only 7 bytes RawCiphertext = 0002FFFFFFFFFFFFFF000113131313131388 ValidInput = false botan-2.4.0/src/tests/data/poly_dbl.vec000066400000000000000000000242601322470703100177700ustar00rootroot00000000000000In = C673FFECCDABFB46 Out = 8CE7FFD99B57F697 In = C2F801E7762E33C9 Out = 85F003CEEC5C6789 In = 660D31A3250501E9 Out = CC1A63464A0A03D2 In = D4B2C6B411807421 Out = A9658D682300E859 In = DC703E41FC3EFF97 Out = B8E07C83F87DFF35 In = DC96382AB0FBAF54 Out = B92C705561F75EB3 In = 185CFF0143FA3A29 Out = 30B9FE0287F47452 In = E6FF7C75BE895CA8 Out = CDFEF8EB7D12B94B In = 0FB1F105F7FFA1E5 Out = 1F63E20BEFFF43CA In = 0BD047BD23011C64 Out = 17A08F7A460238C8 In = 145A5E793B641109 Out = 28B4BCF276C82212 In = AAAC1B803BCD5047 Out = 55583700779AA095 In = 01BB22019BF5801A Out = 0376440337EB0034 In = 012329A40180CAE8 Out = 02465348030195D0 In = 32E04D345F77CB05 Out = 65C09A68BEEF960A In = 862B1AA2707304D3 Out = 0C563544E0E609BD In = 94AFF09E3201FD4E08D48A549AFFD580 Out = 295FE13C6403FA9C11A914A935FFAB87 In = 01445B8ED79BFFE5FF33CD842DD44732 Out = 0288B71DAF37FFCBFE679B085BA88E64 In = 014A302085FB07FFEC8020863EFFEC67 Out = 029460410BF60FFFD900410C7DFFD8CE In = B750E380D9F7A010F6FF01B444FA6923 Out = 6EA1C701B3EF4021EDFE036889F4D2C1 In = 1A697E7E25485394319057EEBCE5CFFF Out = 34D2FCFC4A90A7286320AFDD79CB9FFE In = E95E60D2D0FAD8E86664D987655A3F80 Out = D2BCC1A5A1F5B1D0CCC9B30ECAB47F87 In = 447C8957D3AD868017858C80F1C0BBFC Out = 88F912AFA75B0D002F0B1901E38177F8 In = 666180AFBCB42FFF2701ACFFB8112DEF Out = CCC3015F79685FFE4E0359FF70225BDE In = 89B635C72467ED124502E5FF9D09A5C1 Out = 136C6B8E48CFDA248A05CBFF3A134B05 In = 1FAACA499016BA7AF2A899C22A0861C3 Out = 3F559493202D74F5E55133845410C386 In = 5E03DAD719D299790056D401FED94591 Out = BC07B5AE33A532F200ADA803FDB28B22 In = 01C9D901FF2F15FF61139EFC8171A6AB Out = 0393B203FE5E2BFEC2273DF902E34D56 In = CF4B3AA7767EFFEBFDC3670D8C4EBD7C Out = 9E96754EECFDFFD7FB86CE1B189D7A7F In = 6A5B3CFFB27201F3FFF0FF8067995B01 Out = D4B679FF64E403E7FFE1FF00CF32B602 In = 8E98FF03BC0D9BAB8098FFE5D67DC501 Out = 1D31FE07781B37570131FFCBACFB8A85 In = 212D02B9C91F970C89012101FFFF80FD Out = 425A0573923F2E1912024203FFFF01FA In = 16A1E3D2D24B61556CDDBCED13E5C7ABA4811C1AEB243B1E Out = 2D43C7A5A496C2AAD9BB79DA27CB8F5749023835D648763C In = AC6AF346FF2B0E80EB1F3AC02ABAF8C7017380FF0422FF4D Out = 58D5E68DFE561D01D63E75805575F18E02E701FE0845FE1D In = B5030D0D5D9B78D54C860FF29C0DFAD8B550FD092AE2FB13 Out = 6A061A1ABB36F1AA990C1FE5381BF5B16AA1FA1255C5F6A1 In = 5431324E7675B621282ECF80DC9C191E4AD1734A7B5A0D9C Out = A862649CECEB6C42505D9F01B938323C95A2E694F6B41B38 In = ED5B02B53DB602C424C8B58030DBE0FD01C8FF4DA807E1FF Out = DAB6056A7B6C058849916B0061B7C1FA0391FE9B500FC379 In = A6571DF06E0281A0F847E380984118A8C8A2FF01F4FE0148 Out = 4CAE3BE0DC050341F08FC701308231519145FE03E9FC0217 In = 2D15CB8F6D46863F8D712CA46ABA39FF01EA8C8701F5AB01 Out = 5A2B971EDA8D0C7F1AE25948D57473FE03D5190E03EB5602 In = 90900102114DE18774767468288F013ACC94E85E8ADEB701 Out = 21200204229BC30EE8ECE8D0511E02759929D0BD15BD6E85 In = 1869692F085475D1054384C001969E0C65E60222CC28EF34 Out = 30D2D25E10A8EBA20A870980032D3C18CBCC04459851DE68 In = 66E05387E4018267FF01C4FFE676FF4F0DC6CD30154EF49D Out = CDC0A70FC80304CFFE0389FFCCEDFE9E1B8D9A602A9DE93A In = D15D326201D836C8BF5C83CDFF3C5A80B63D806FF7AB0082 Out = A2BA64C403B06D917EB9079BFE78B5016C7B00DFEF560183 In = 787EDEFFABBE80EF382201356AA355F2F5AF3A14432AFF55 Out = F0FDBDFF577D01DE7044026AD546ABE5EB5E74288655FEAA In = 3CAFA39315F2FF65C9B590FD2B6442AB71E2DC62A31D31A4 Out = 795F47262BE5FECB936B21FA56C88556E3C5B8C5463A6348 In = DC734911B0CAAB250108894D38D11E8701E19CFC9F239FDE Out = B8E692236195564A0211129A71A23D0E03C339F93E473F3B In = EACC15239A807DEFFF1ED311687C1A01F944AC010E644DFF Out = D5982A473500FBDFFE3DA622D0F83403F28958021CC89B79 In = 7B2B0D80C866D4BBFD01DC6C74FFB13F6B799068D3C4601B Out = F6561B0190CDA977FA03B8D8E9FF627ED6F320D1A788C036 In = 01186E8B7DE2804DAEB71364E9AB70808BCD58971680F8927AFF6780CB62FF10 Out = 0230DD16FBC5009B5D6E26C9D356E101179AB12E2D01F124F5FECF0196C5FE20 In = 45FD23C43875897401EFB2C29A53900DFF63FF8601D959319A7AA7AAF2F841D1 Out = 8BFA478870EB12E803DF658534A7201BFEC7FF0C03B2B26334F54F55E5F083A2 In = 8BB1E02D1CFF75BCC5FF4EE41A3D80019ACD8FB2B652E5478084A1241F01F57D Out = 1763C05A39FEEB798BFE9DC8347B0003359B1F656CA5CA8F010942483E03EEDF In = 8017A58CEFDA4EB3F3C39AB2B5DBC69D0ED3F2D75BB05DD327C8FA804CCF806C Out = 002F4B19DFB49D67E78735656BB78D3A1DA7E5AEB760BBA64F91F500999F04FD In = 9FBC1301F4DB1F088A89F1CD3301035D16904FEE9854844417016537B8A27EFF Out = 3F782603E9B63E111513E39A660206BA2D209FDD30A908882E02CA6F7144F9DB In = 95BB4B56F7194078BEB8515FF6C92FDCC62C8083EEEF7E9953EED6DB22C7BBB0 Out = 2B7696ADEE3280F17D70A2BFED925FB98C590107DDDEFD32A7DDADB6458F7345 In = 56AC3F3E6E4EC2220111446C5F08B4E2EFE0698096C26ACD9B9E7E993AC8454F Out = AD587E7CDC9D8444022288D8BE1169C5DFC0D3012D84D59B373CFD3275908A9E In = 515AE33EE8FF522B207DE4E6926DBD4E1F90AA06E2FF35AE8014F9EA9D57FF14 Out = A2B5C67DD1FEA45640FBC9CD24DB7A9C3F21540DC5FE6B5D0029F3D53AAFFE28 In = CAF8DB3CC6B8E25801FF939DDEFB44490193806E0E9AFC51BFEA86C3FC5DD66E Out = 95F1B6798D71C4B003FF273BBDF68892032700DC1D35F8A37FD50D87F8BBA8F9 In = BDB281A665FEA84A312CB2DA90A5D8809537440EBDD201225E9D0A79FEFF016F Out = 7B65034CCBFD5094625965B5214BB1012A6E881D7BA40244BD3A14F3FDFE06FB In = B7882CBDFE426444C9D92DB5C7B057D58080874DC4D6FF3ADC3099AC4B430256 Out = 6F10597BFC84C88993B25B6B8F60AFAB01010E9B89ADFE75B861335896860089 In = FA36EBA53A0789A802E56E18E3B88180FF72D3B48E6A2FD759AF74018CB38F69 Out = F46DD74A740F135005CADC31C7710301FEE5A7691CD45FAEB35EE80319671AF7 In = A110B893FD9BB169E838B7F62C2B425A79C2D962D6688B10149A9D0F3986CF5E Out = 42217127FB3762D3D0716FEC585684B4F385B2C5ACD1162029353A1E730D9A99 In = 4A7975F9D8D334D72B1401925D012C1343EDA860A0C6FFA93E4C9D758748FF4F Out = 94F2EBF3B1A669AE56280324BA02582687DB50C1418DFF527C993AEB0E91FE9E In = 83612A4A010CCEFFA9629342FFC976FFB74FD624FF6E017AFF7C1DF180F0581E Out = 06C2549402199DFF52C52685FF92EDFF6E9FAC49FEDC02F5FEF83BE301E0B419 In = 950F78870E4F1A8E6FFF801EF01E8600AAC8E21790140F4DC39EBBA2EE8D3618 Out = 2A1EF10E1C9E351CDFFF003DE03D0C015591C42F20281E9B873D7745DD1A6815 In = 229AFFB2B282E7DE732256E9FFA9411CC13B430D0F33CC7F57019E527331FF11BB5E2E53522103693E9C5E80FF7F1885A1FC37A065ED787472A1800001E68A1C Out = 4535FF656505CFBCE644ADD3FF5282398276861A1E6798FEAE033CA4E663FE2376BC5CA6A44206D27D38BD01FEFE310B43F86F40CBDAF0E8E543000003CD1438 In = 80BD24865C804F3AEEA9606E4B292230C2FB80B7CA807DA72B65F52088EC9C80CC2848A0FF6A80E823A305AE988003050C6C92A2319FB6012D23F748F2B8E34A Out = 017A490CB9009E75DD52C0DC9652446185F7016F9500FB4E56CBEA4111D9390198509141FED501D047460B5D3100060A18D92544633F6C025A47EE91E571C7B1 In = C2EF017F14604C01CF0C14FF01AA80622001A352F612AD140E2E6ED03FDEF8014A63DF39348480FD550F950301EE72113120015E9F257A69869FF1E04CE3DC53 Out = 85DE02FE28C098039E1829FE035500C4400346A5EC255A281C5CDDA07FBDF00294C7BE72690901FAAA1F2A0603DCE422624002BD3E4AF4D30D3FE3C099C7B983 In = FBBA80186D8A25F9B63BA92DBC82735180F25AE02D4AB0B7318818AAB439B503CC8AB6E6F6A1ABF2C75A72FF26D0FBDC2148882EA90E0A412E41804555758609 Out = F7750030DB144BF36C77525B7904E6A301E4B5C05A95616E6310315568736A0799156DCDED4357E58EB4E5FE4DA1F7B84291105D521C14825C83008AAAEB0D37 In = EB8C6460E8DECA7873F26326C3E5658DCA012EE340DD6CF001248001473FFF253C808CFA8080F280940BFF801E1FB875E6CC8008B3FEA480FF172AFF2B804ABA Out = D718C8C1D1BD94F0E7E4C64D87CACB1B94025DC681BAD9E0024900028E7FFE4A790119F50101E5012817FF003C3F70EBCD99001167FD4901FE2E55FE57009451 In = 66ED47263E72C4A07BFE3593546F4D168AFF806F25639F088FE01601A90A5A96BE0E573005EF7D01BC2834B3E7F4F8C65A801B6BF3280EF962DBD401BEFFB248 Out = CDDA8E4C7CE58940F7FC6B26A8DE9A2D15FF00DE4AC73E111FC02C035214B52D7C1CAE600BDEFA0378506967CFE9F18CB50036D7E6501DF2C5B7A8037DFF6490 In = F7A8FFC3BB802C43DCEDDD3DE36F3F166F801780DA58E31EBF643875F2643D822B600814F7CAF002E35C01D199F5677CC41A754F8721ACFF5BCA08890A8EFF01 Out = EF51FF8777005887B9DBBA7BC6DE7E2CDF002F01B4B1C63D7EC870EBE4C87B0456C01029EF95E005C6B803A333EACEF98834EA9F0E4359FEB7941112151DFF27 In = 80EBEE627605DADECBD0F1067180FF80271B8009E3B08C76C0BE29EAFF646972D811ABFD7595808087FFE130FF0101807FD9805789DDFB1A5E8226FF5D37F5A8 Out = 01D7DCC4EC0BB5BD97A1E20CE301FF004E370013C76118ED817C53D5FEC8D2E5B02357FAEB2B01010FFFC261FE020300FFB300AF13BBF634BD044DFEBA6FEA75 In = FF28977022562ED9C2F7A7011B3808A02ED8F480013401338A804C85ECDEFF010125FA71AE01C02F5327F22679CF4F6EC392FF681B0167D2CAFEBD26309006AD Out = FE512EE044AC5DB385EF4E02367011405DB1E900026802671500990BD9BDFE02024BF4E35C03805EA64FE44CF39E9EDD8725FED03602CFA595FD7A4C61200C7F In = 4B3C77451A8432187B0139FF0101B5378C2F55B56BBA5608958680753F674080FB937797B4FF6F7D90FFB154012805CC01C7E231897F8414FFA5FF56349666D8 Out = 9678EE8A35086430F60273FE02036A6F185EAB6AD774AC112B0D00EA7ECE8101F726EF2F69FEDEFB21FF62A802500B98038FC46312FF0829FF4BFEAC692CCDB0 In = FFF1B636DCFF39BE6EC0FFC8CD1D80F01678FFCD64FF40FF7A53F2F89DE61EFF12E9BB2D2FD94C01E1BBCC5BAA846394B4C4430A55913FBE3F5580B0D2540CF7 Out = FFE36C6DB9FE737CDD81FF919A3B01E02CF1FF9AC9FE81FEF4A7E5F13BCC3DFE25D3765A5FB29803C37798B75508C72969888614AB227F7C7EAB0161A4A818CB In = ABABC192260BC46CF63AFF80D194431B87B94E03F466D7B51029AD3517A36A958524C9B4510128715601A0CB489F3DFFD32E1FFF46A7D1BF012AF20E890483A9 Out = 575783244C1788D9EC75FF01A32886370F729C07E8CDAF6A20535A6A2F46D52B0A499368A20250E2AC034196913E7BFFA65C3FFE8D4FA37E0255E41D12090677 In = 98889EC9ED30514468D62D16C8014BFFD84969076FB17AFFBE9B415B0C80273801804A3B79A11FE8738C80CDFFF280DF7601773B9AF3809403694880577F136E Out = 31113D93DA60A288D1AC5A2D900297FFB092D20EDF62F5FF7D3682B619004E7003009476F3423FD0E719019BFFE501BEEC02EE7735E7012806D29100AEFE27F9 In = 51CA0F9203C2408BAA2BA980FFFF32CBC25081BD958E2917DE16212E707E9E28BB8B0908322ACA46BA56ADFC017B50E77F3C69C3FF591274CDB509A8FF5A4045 Out = A3941F240784811754575301FFFE659784A1037B2B1C522FBC2C425CE0FD3C51771612106455948D74AD5BF802F6A1CEFE78D387FEB224E99B6A1351FEB4808A In = 5B87801DF79DE69D8EF5D459D85A019FB9C7E46EAEC42975135D151E8E4A30E64D3B6459801D1560B6DBB79A1EF09CAB27C0BDB256BB720129C3743E01AA8046 Out = B70F003BEF3BCD3B1DEBA8B3B0B4033F738FC8DD5D8852EA26BA2A3D1C9461CC9A76C8B3003A2AC16DB76F343DE139564F817B64AD76E4025386E87C0355008C In = E30D8CF9184C855AA05F27B7EE1061DF238052A64452AA6B2FAD9DBC8F86243552F62F0F8F3D0D837292804F2401158787FF7D1AA2EDE287369509184FC674AE Out = C61B19F230990AB540BE4F6FDC20C3BE4700A54C88A554D65F5B3B791F0C486AA5EC5E1F1E7A1B06E525009E48022B0F0FFEFA3545DBC50E6D2A12309F8CE879 botan-2.4.0/src/tests/data/pubkey/000077500000000000000000000000001322470703100167605ustar00rootroot00000000000000botan-2.4.0/src/tests/data/pubkey/c25519_scalar.vec000066400000000000000000000101301322470703100216270ustar00rootroot00000000000000 # scalarmult1 from libsodium Secret = 77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = 8520F0098930A754748B7DDCB43EF75A0DBF3A0D26381AF4EBA4A98EAA9B4E6A # scalarmult2 Secret = 5DAB087E624A8A4B79E17F8B83800EE66F3BB1292618B6FD1C2F8B27FF88E0EB Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = DE9EDB7D7B7DC1B4D35B61C2ECE435373F8343C85B78674DADFC7E146F882B4F # scalarmult5 Secret = 77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A Basepoint = DE9EDB7D7B7DC1B4D35B61C2ECE435373F8343C85B78674DADFC7E146F882B4F Out = 4A5D9D5BA4CE2DE1728E3BF480350F25E07E21C947D19E3376F09B3C1E161742 # scalarmult6 Secret = 5DAB087E624A8A4B79E17F8B83800EE66F3BB1292618B6FD1C2F8B27FF88E0EB Basepoint = 8520F0098930A754748B7DDCB43EF75A0DBF3A0D26381AF4EBA4A98EAA9B4E6A Out = 4A5D9D5BA4CE2DE1728E3BF480350F25E07E21C947D19E3376F09B3C1E161742 # test-noncanon from donna Secret = 0100000000000000000000000000000000000000000000000000000000000000 Basepoint = 2500000000000000000000000000000000000000000000000000000000000000 Out = 3C7777CAF997B264416077665B4E229D0B9548DC0CD81998DDCDC5C8533C797F Secret = 0100000000000000000000000000000000000000000000000000000000000000 Basepoint = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = B32D1362C248D62FE62619CFF04DD43DB73FFC1B6308EDE30B78D87380F1E834 # Following values generated at random by curve25519-donna Secret = D55FF01DA1262795A4E50E607F87B80DCCD447A6EE0F6CD8D25177F79575744D Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = D5BDC7055ABA7855692CC861009E3AE6B6339329826B11F8B92E5ADAEB85335E Secret = 0224D9367436089D81B1150DFC748EC851F9A41389E21C8C1181E01BA1760C23 Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = AD7E1E41C6AC0544F949EB76D71C75120ADD345C44384BDD830974D2DD329644 Secret = D55FF01DA1262795A4E50E607F87B80DCCD447A6EE0F6CD8D25177F79575744D Basepoint = AD7E1E41C6AC0544F949EB76D71C75120ADD345C44384BDD830974D2DD329644 Out = FC343E1965225D8666F4AE8E70E04039D21C603F7CE7F17C0CC8440C62C03575 Secret = 0224D9367436089D81B1150DFC748EC851F9A41389E21C8C1181E01BA1760C23 Basepoint = D5BDC7055ABA7855692CC861009E3AE6B6339329826B11F8B92E5ADAEB85335E Out = FC343E1965225D8666F4AE8E70E04039D21C603F7CE7F17C0CC8440C62C03575 Secret = 65A06F749B010EA5738CDEBE3EF65F38C17A13F8CCC5B0AE51B5091D845C6DEB Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = B84AEDDA6C2CD17CCB62D94E3238E7093BA77D15BE4C563D1B11EA3C2EECA87F Secret = 92B158501611EF8521C101E28629130427B42D2DA65E9EC9387B94BC2F08B806 Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = 06479EC3C771D635F54787DEA334149E07E20957127C816E3059258428C17970 Secret = 65A06F749B010EA5738CDEBE3EF65F38C17A13F8CCC5B0AE51B5091D845C6DEB Basepoint = 06479EC3C771D635F54787DEA334149E07E20957127C816E3059258428C17970 Out = 47C69389596EA49AEE14F4259250808385C37F4EBBD6AA176779BFEB8042D834 Secret = 92B158501611EF8521C101E28629130427B42D2DA65E9EC9387B94BC2F08B806 Basepoint = B84AEDDA6C2CD17CCB62D94E3238E7093BA77D15BE4C563D1B11EA3C2EECA87F Out = 47C69389596EA49AEE14F4259250808385C37F4EBBD6AA176779BFEB8042D834 Secret = 2D7B885AA77351153994425725F35AFB84D9729DECA3D9D832570569C973566E Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = 93928FCC20DFEA2AF6CA8B1268192B68D87FDA744FD67FCFAEF84165C504597C Secret = E3B07D96E4B5F3D265ACFE950707B62B053F2FD5CCF20D662F62AB09ED2AC325 Basepoint = 0900000000000000000000000000000000000000000000000000000000000000 Out = 68B7894FF03386C8C1907847866CD771519163D002FA7C3360650186A22F7263 Secret = 2D7B885AA77351153994425725F35AFB84D9729DECA3D9D832570569C973566E Basepoint = 68B7894FF03386C8C1907847866CD771519163D002FA7C3360650186A22F7263 Out = 0BE4BB615F362A21A28A404631F6832DD1019A7145C020031614D8B6F697983A Secret = E3B07D96E4B5F3D265ACFE950707B62B053F2FD5CCF20D662F62AB09ED2AC325 Basepoint = 93928FCC20DFEA2AF6CA8B1268192B68D87FDA744FD67FCFAEF84165C504597C Out = 0BE4BB615F362A21A28A404631F6832DD1019A7145C020031614D8B6F697983A botan-2.4.0/src/tests/data/pubkey/dh.vec000066400000000000000000002136611322470703100200630ustar00rootroot00000000000000[Valid] # Derived from NIST CAVS file 20.1 (Generated on Mon Jun 20 09:02:25 2016) # http://csrc.nist.gov/groups/STM/cavp/documents/keymgmt/KASTestVectorsFFC2016.zip # [FB - SHA512] # COUNT = 0 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x74162ac74759e85654e0e7762c2cdd2689009b24dae06d0a85260b81 Y = 0x86c59d66dc53689cdc6b60ca7628afa58759b27ffa0856d0037d390d60c14d86385bde5ed5bc6f7e0ab8e5f07d08a47b648abd10865d9f4c9ee7cf5f7982c63a52a33b96482a94b1ece4a99022ec4aa41c7453648089152093a84d16e16039d71db9aaa2aa701f483f6297c4d2647079290a2b94c9bf9ecaa6715758135898504130e381795adf7352b37d1be696012a03dcea4750e963365a7698355364cbedf1715abcb31e3b2aa072dfe15ffd4c2e7d69c8ed7dbb138522536b5e74495724fe4e74b662b9af8c5a35616b9dde39c80041cc6ac62aeae2b802f91b62e9be27dae8006797529db42b2ad8a16353ba6a5d25ea25d4431269ea6fc397de3f16ed K = 59ae47dfd2893b37bb229b05f19ec181b8bc7bace31d0ac37b27e364ea4ca179bb574d91fc554009195ee13bfd3877baa54ed390eab7aa3dfd6f3a35a776a80f58999d7931a9f0d842eb9bad51a24f2d052e56d09ade631f5e3ba64e957e4d583e20ad35d5336708482dd59b80a351e664a724cdf28a7796d2e93fffc7b113a8288be2b562af9dc3f980c917d56a723351b7f4be2d7384b51f69335cf6a2fde5fa4f151be66529a4c8e8850b9c98dcae3a84d0ac231845e2b3771b9c5583960490994a58ff0d748333f92d835f2886ff26b81ebf4b7d7dd6d052d3f2f3062f137ef3fcab8c95771ad837b0af0378d75285126151db08fd0cea5aa9933ffebc50 # COUNT = 1 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x14c593a439977589c7816268142588d783805e1820a1cae12168f9e0 Y = 0x5e281505e8c688933a9ba563f7647c37acb4e30284574cb54d3445948f84c2420c108fa951db5398c76713ae414060369be094dceefdd305a22c2cd693298e75e967579326662afdb3bdf7c7b4eac68b3c379b8d14d1ef3bb63a673e7d7d1eddb9a7fd21c84e751150f1c8bb4115b8f7ca3f8816503f723a8b8339c1376cc0d24eb97dfda189e65112b9a1246ad693e91583250a18e1a06b9bf07fa330493123f9d0d66641472dab54ef4bd35a196b6a30e32192889649db8dc2b3e802ca3bb8c92cdc24cf12b06af4c222b15ee493cd3b77b1e03fcfe22f49f71e0b23d07f39b7e624c610957e5c6b4fc1f074012b2e95b8961403b1d7a09638ea00d06f005a K = 90a6aa701672b0764d95a1ef3fb1ab68ccb7a8eceb70c96e798ad7fa249a87ebf3228de27db9ea9eea6930190183d309163200df33ad75c17d8db7e82bacbb4a2ca0aa2e9834ade45086c98aacdc57c55b2a1b6639c03e8161c93bc50137f9cba04c70d0b8df077a707ee9fe76c1d8fb2c2bb5c23e3a45ee6b507b59148bb8eba2fbe6ffb3dac19209c3ddd6acb5b45edc527932300ab44e9c2b8813919ec799ce1aa2ef34c306b09b0a30752801d05fd33613cb9371136b4b2c643c752ddc7be1132fba4424d4e4fc920dc85b027ca47c506d7ca27106f0f97f43964fa6e5f89c2e53bc2a2e5b548f7624e89093a846ff390bcaca66dc83dcf60f02c6ffeaaf # COUNT = 2 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x17c19fe66d53b8bf286cf534c9b60322e9dab11618e68b27d0764cac Y = 0x91783a82ac39437a411ac79850031ed0cedc8d0a49eba2a2ce508ac164d79fc7ff01610077aaf507cbc85827546d9345972f2b1797b76ea428420291be5dbc6c5e153d3a58180e2569d09539e933f3ddfed7fcbe0299c3f27f036f24daef7de871be4331eaf808544673f4382c1ecc0d05d0310ead7fd6cd18986347e862bcb8a87a0aa6f62e8b4c8d4f4cf41c61c16d2090f44cf01062fff397e51f53f2656b92e098d0621d6de3dde3646075362b1b9edc19a53d7b26f4d8fc67033136feb469248de404f7cfe6ee693a48fda28363ffd4c25a26ec7795a26297cd72434a016254b00553d14a9bf036b313e85d016880bd6262563edfdd686ef445c5217d8f K = 698228081a19cbb87eafd31fd23fb31b25d5fffce6dfe81132f1189a4f5602b674ff6dee1784ab9efa564d13c1bf39a2924947d6b798f58f2f4dbb4ade8c8b46eb86fc7d8c494a382a27f83f978e167703b9ea8f76e2a66fe2d82395672eec615824ba02d9fdce76fb3a2b8ff207a0a25b5a3033c5c7a8569d0e34aca63239be9affbaf3c3f261352b861894f9d429f36c3a6f6a35d4529d9e15b540c65c1c1e445e9f21c4934292fa3ea36a531d5b8c1351c8d1c45ec95aaab0ab6862e16d328c51986505281fe6147e28e11d371f616d9a18aaa8bf9e1e117e3a16ab6d5e950044e36cefc5e73908aa10e079ecb976580b1d96c30b21ebc27e71e1a011d4ab # COUNT = 4 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x071d45a7743d13260c6b2939cc16181296b5698c0bdfc73f1c0092ff Y = 0x0b97720ae423204135b8baf6663f28af27fec8f819191978a01b884481b3cbd063e08c6f5501d1b6458b9db2f19ce01874bd5f5e220cf743042cc393c7818e72b72d343eb775b2d6f0148568e6e6512c53d48c95862271783f2396d73cf50da63fe716d0fb54cdca8144293c26af2eea273d8c764529983ce59fc60352c122bba5f6c76f27388f6563ea97f0d312c74113b8c8d6a93b90734d407bcd55cca09dd7355370f5b6b1563d8a7f0c2c0205329fc707185eded3b07f87400eaf00f38361bab642742cdf655ec4beda7c4b4da0f38e9d5668a3ce6bd6247fc8032a5b1f7c3146dd03fb42d3fefc69ce16890a449bd7c298596f129bdaed6d40dea3c2c1 K = 8d0c190abf8df56730155b559db64d7200f01edecafc50cf8d709546e8b4123f0a81c79694261bc21be8570c79bf39c3f42b059d188e5ae7679c279f0bd2770ddfb59eb5418d38d807874e5fd8a8b311ccd3884ffeb084df72775f33b0120332495ac0af506b9d4822180eff1a41188191dcc877f14fce1fa30f461e7ccb47307661cfe55fd9b263f9e7ae94ce9b2cd8ae2b1a95e80ff83934e066ff4ca8814dde22613b76c2b1d5ab7aeba7a7e0df7738f3bbf3c094aa944c75ca723c105b3ea5d6a982882e1642003418116e6b0bf04473692beff0c1721ae6b8db5a2022ae129537e048b1ebd70840095a390dfd5da5c99332e786ad9254a033b20e46302b # COUNT = 9 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x24e22d77cf23d38a01e752d5d0520f1bfda273bc3dff79494ac89257 Y = 0x0a9bea117586f9f292f2fc9618e4526b08d7565911d8ba3da54d9c57371f2b8caaffa07ac919eb9769e50627ebd6d47a6899132c99256a66991a1d7cf930c1a81f3df5fa91081685d60811fdc9418a9f6fc44ca7b31cba7c16e49f4486430f1dbeefc3d13ebd6f8215186ccdcf85021799257e70f68a82958ec621d4c615b311f6aaeab2f87571cffb6d906da64f8ebf49b8960fa0c6758cc7a73c65d63a27f821bede07990ce78c91daab27e3136044ddc27df1fa7ec47722238ae8154485bd60413d706fb5596cbf1b053ee15506e51d6a65d368aa518613e2435d0cd1cac6ceea3f46134f0e9f9af181dcc38f3254479ed135075a298bfcbc4946d9648308 K = 645ffbc72cda0aa5e282ddc689889c9acb6fd9f137a8f2bbc0d21e91ea7e6af848a147b900e77d5212d86f59753668e5dc47b4b59514fe15650350047dd025a6fa75961b5862805026d4320806914ba892c23e51f168f9a01b2ee7970e1e96d48704afa45f24f9874d46791994d4e512a02cebe4fc80f2ff4239832abdff8e08db38843c39db0be7193f07afd6f527462b3cbb33ac6195f7509648abaa791a456a645667b12b9ce590bd30f478dbd0fe47dd9500a2defa17cdaddbe8f85cc807579d0bc2444ad8515c9a65a9c243db610a301cc581f261d769c9e9c5dbf8fb0e7d3d12da0e6e4487b0f243c0bc07879c0f0b5ca3d7fed4ce4c0a763d7b163d45 # COUNT = 10 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x5947355e82a4e9a8fc344d247d6c8908021f3aa9b9d67cc2e02de825 Y = 0x50d24594c93e5f66f46b9d949b3077807952b403df2a69c460bab1892e1485503f6ad21fb8512282c65fa878cbc120092295de9bfb1d677b7d165175d86c0c3c612cfd8682d90878641b28180237ff60346447719b13f524a240d29ff8d11b1acb695b2dc0121a5062eb88dd595ca265c2d43746541e0960c79c1cd66dda17de95121209361e6369eb728d1f8da6c6d13ea78a7942c1fe2b1a501d44a5c858d3a8a1c6648241f30fe7933e5d2e130a18c79c052c4dab30b3587cb1600b4634a996a2e834904140cf702c99c5d6a7b1b1af38a0489d6a69710e1c4f93b33a869bf8652a35efaa3f17010ffcc422c6313d6fac0cc1374a316266617dafbaa17e7e K = 69bcb1947604551a8480c0b3ebe380a1db70e7608f31bb54ece21656bd453d1b0ae9941c4573ccf24430577bfb3da4a4920ae99e636941d90b9fc98d77846cb653aff4256a165114ac9c0c4990b71385fe7b0cdcd3d6cb40d0c11d436164606f08820d2fec00212a0a30a2ee0f5052ed08738838302a9c6b3121393e75e2f072d32c9a806945be28d3aaa7cd2e7b4b12d6a565655d941389baca6458937bf6f71a1aa773e79fbba8dc0e646ee8d9485bc876428d3c50a8542b6f1cf89f9c9769a2f647a01581c353eaf8f27484976098b93d75a855525b608d9433660f9404b6c4590f068d9d19e5f75353f9b89f342209ad6ca318191c5ab4f9c8ddce5b81ee # COUNT = 11 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x38253fbac321c8e1690cd607785574c27daaac1af57063c9d29c8603 Y = 0x344d460bbfdd4d1b6c912af211f741b5da60f365ddb16c766a305785438a4a9f8f41dcc49fc8d06cb89167d91d7e9f558e4613d0163758d2afa88de5dcbe3d0726fafad55e054754ef63a23119e03c9b4165e29f84f5afbf6b1ff965ac23e41f81c54f7165d4096c26681039cf45290e00f9d1440d8ad9d10e724ec9a284581bb6c03039686ffea9e4666d6016fc9abe9c22babf2265376996c5580a8facb0062c2b275c8038941caaf7c3856232aa1d6be02a3b271bfa3e6d24c56744a6c61e5164042d9418452229c42849fa9c384b6b438de54a1bcaac23478959f68ef871a4e1d894389be0afd25ea49d8d7028400484f1daf5220a8beb67b847e7c1e824 K = 16d2271d2a44ded1a5b63519b71d4c1afc67ee79e71d7b41fc9d70dd52323e749c67ae1ac7e1969a5e34808811b36d5efd315d90754cde96b900a41a3259e9d76df4606d3c8f13d7f62381f1f7f9efca4802a424c3bb06433ddf49631e8b067653d4600b5bd7eae24a33a39afe230c7ab5aad24c3ed6d6bb81e96f2cee58a08ddd6da3f0a1707029e665acc495d5facc21f0e14279dcda78281b99afb84a74c45530a31283f192b8e867b5c6488d8a96380a0e29093dbd1be78681a32c6a9e2842f52ce32b1855dc2e2f0925060eabe6f9bd7885cd60b5af4999cb8b4f43e79b28fbf4668a56365c89341478ca7b9c936364bd06bfed43d6cf7ecf6e27a12ccf # COUNT = 14 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x867a149143a62b867733713012be81ae3bf57e1857a8e42dfed4f86f Y = 0x04307a0ed587c8edb194a6933a128a07e9f8f4635e558f6e9dec0112b6dc006689ed2d89aafb862fefc74cbc7a2176000bbd8249a61527d3bb56e7a9a59ea7daacc591605b111d46d01548693d996c4ee992d799a721f2fb6a4711db2103bed712bb8e0bb99e863cc031d374e085eef0f8f8046d63c6367611883403af83b6935a185cb607416320dbb9d3769892cd917fcba59a106cdba7f528998a851f25fbda6401a8c65a789c34ac6b3d1b466bde658fcc221f341896e87fed14cafc51a47190422457e66c0e55d2482f8c6d9658cd8c2793540b26e2231c199699e403d6811aef3023bf411baad7fb7b7efbe1658e0af02accb5c93d38b350925ac48806 K = 869c8121f9dd46f9674d8eaf5064d87a0e778f6a3ed38e3a8276b8594061bc07b20436ad7bb5c3681eaeaeed7a48023cf40b222839738c47a72b913288a46bf0c310e491eb27d2b6f0087079a1b42654d77bf3e221d6d10eae405200bb13fa2909066395e242b3d5bfda13971fd16d4c56c58cd7926cac40b7c7c00297aada84a3caac3d0646b8e5bd6e9dbedb99e6680a3cc6974219193f34e8f3cdfaaba88abac7dbc2c952d085e2e338cae61de74272c10a0153548eda5516e4132b852259ecebd9de463e05fb9668af7408dfcf7540de79319345a4719a405768da4e7ac529da19bce56ef2023fc025b92ecfceaf0a8301cae7f8e98a5a95cb1f5b7c1b00 # COUNT = 17 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x7945628fb95f3af0598450f4e511ffd5ee8b599006e51d7fbe8c3a3b Y = 0x999c2c2abd5f12d3bef902c3a8baca50610fd7e8dbcd34f181e52168e067b0ddd473bb00b5caeff24b4f4e697b381b1295876507c51f56834664598009a8ecdf905a3323cc99b55e0035bf1aea09ec37736ac7dfe9afec62d9b44a5037937e0bac7ca7e31cabc5a74119d19defceaac2e668f80d01d44779cec5c82e85489bbc2aa0051a95e67bd0e13840debdd18ec8729a72900da940668b03b590b6d1f3217b4777900bbf15688446380a815097c139aa38a79f842ebf15fee34d570f6464968035f20ca3a8ce44f55459e4f2af6186ec3bb9d8fa43bcb4d6dcbb85e95a40f56fa50cc39ed147b4cb9c8d1b7fe5251c689bbfd0edb42669a0a1d5e94081c6 K = 02ad2fd47468773ab0a800c74eb3f477a23a640b4f1fa98b88136f973da3d531d080fa211e6064a8ccd286249b9f7b85c9687d9fcf89d747ee1dde85a9b17333f4d825f2f93ee702b5665b9efc0e0d5dd983a4df651bff27b9aa9c4e8f14466b5b63b1b041c75f8724d6321d35f69954d783239348f38aded65699bff0525dba2d2c6d5ba1019bef953d95d14205d99d8d2aa8f48a1e50c3d205d1e0dcd0a8bf513d0a2265bcbbe90a8a3ed1af4621cac76615f7ee3a0040c9f3231f3ba1bcb5171a4d665507845a270e97a86db5b6fcc51a1934873c85654545f2196249dc5a7628e87f0e768cbecacd72ab82a23f9a215639cacc1a0b2717edfc099f8dc703 # COUNT = 18 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x3bdd31742f2beca2b8fae780d167d46f2dbf51777839b8c0f478780b Y = 0x0a4d27b92418c98ec0748b56246fd0399069db381df6b6c9c7689a7ccdf5b65875c73128919952789ccfac558140c419accd488e600c337f8c5e848e4229b14f021f71cdc1e8b83b1fb8b2b5b4a8fa4ce4667a26cf070bc2d143660e97ff7d17b262395ea14592f9815986dbbb5e611eb0b498b956da021a39478731fddba4877ad370864a6ec1e2c05db31c05d9c9bcb47963a72fdcc574996a94cacf2633d4d17e382394cedfcea517012090537e3bbc943c55b372a39e39537ddce799a40d8d0990ec27c0314b4da9940bfa547370cc11f690415fb1cd330898e3250a8d47e49e71e558306fa3f2d8df9cce19d27d8177df3dd27d743a5300ef055f207006 K = 167eb8511a00488727920561a4a437339ce8ac5eff88065fdf0693a44298df5d0b59690d23820942241b799089c25d8e265b818834a8de8d87747956171843eea5359f989c6c05a450cbf13bcf5318bbf65cdb35dd1527594ea9a9b6d6a406d09f031cd08070945ff0d6802c2eb4f4df8e9c279380ca5329a4a4cc7bf0cc767ecc458be5a3db1952056bd97c30f6f3928e1d148ad5bb6fde001c61b76d9df424865dc003f397a885ca2a98d57d049578882de7ff460c79ab4fb6f791f16e9bde739130408da73ba93186ffd47804ba506a2552c6609e6952a2503e88bc75419ed1782ef4323ad71602f6cdabbbfe2bd8d6bb9e924fca911d7804c3d0abfa33fc # COUNT = 19 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x686557c3b4cf1022c8550a58734a127a1e317fb780d9e038d10d8b51 Y = 0x0abaab43d1fa89fe755e278a6712a7b0773a6607ea4d17ef9e38dc8fa40e5a2ef3591ddb0a5b99145ca4c321d4cb8219c27555a8fd5c56929c0bdd6271c97d70d56eb227e72f8de64b7204b83b2868b2d9426430b6f9aa03f6c68fcb18ba5ef0766e579dba1238f0108991149be19c5fcbbd1803d905cfe54310e56f3fa97dd23e731b01ea3f3f3258e621da0fffa3928e184b2bf7148aee053ca55220d1502fc4a288dbd09980c8448585b12400311c3d6b8fdbebd6a690a40357d80a10475a2eadbbffba89aa1df15266e0a79d7dd13769362dfba4969b57f8a360dfb3d0646405f22080328baf6cf4a839de13161032c0a7332f23732617588ed6cae3df0c K = 7427421343e7c10be2d46f549a0189d65727250120078195cd3ac8d53d5b166c0745aec8c3142858563dcbd3f5dd976378236b077167a218d9a01263ba984cf346899af673f0854ddae6cc5b4372cfcfb023854480499cabddd4c7dd9ba6f559ead8eaa0ee3a3a3f4c4773ddef014384452aad53410d0a89843af467d783df22686777365dcacbe5df55612f7a66b966f70424d6ecad8c86373880d98651285d3118f2dfbff5ec5cfa9982bf00efc52524e62cb807706f23b1e838f0997c3b8ca350e1f0800466b67724c3e1df23e51572534c437c66808ea9ab20e9f8e533ca202febff1247f6cf14761bdd7575e2577d2383abffa5a80319977956361bebbf # COUNT = 21 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x336fdfc37d06d4ce3a9dc420629b8124ee79b19831f9bf416ebb24ca Y = 0x59b7ad974cb62312f5a71ad16c770cb374470ef7944de4579e961ccc718ed048ccf5aff00f25dca0d7dcd85b66beb0353c2257b959873cb546f500a20de724ba284d930030e8067f5dd7a836149e9895ae93aa885b21e93975824265c7d5cfd7cfe575940b525fc83b1aa8ed237365e1c01554266b08afa17ff0bd11b4f71be7bca2ccd01cd00e7ade8efa9cca6ab56898747a4a4848dabed3b7409f3cdbea6c8124f1d66c0a7dafb33f9666d5797b7900faadf3776d9179ca610037743efe03896389261c35d63c3b38f834dc571869ae2ca121e52c9629156e582224edee36b916dedb1ec0a207e7bf3d2ca6e62c706306bb97d44fed2c7347c4cc5d8114e1 K = 5e3f87c1980ff68319a5345130a1fafb2266435ca01c52f8dcfddb4cdde275dea77fe0f9dc8e59413e7008f0564dae7eb4d33ed387c73662fbcb1791cbc9705ecc53157efb2f4fad96fd505ec66e8fa39a22126c2be30e617801d4fd30099e59ad223c4f138798d2e76a9217f39a27f81ed2fb319100b3304936ec7934d87802738b762e13d375a826bec450c8798ce18acc7f908ca2c1fae3bd2107ed0d773db1cfe0c376825535f1d7cd82c0100d548f509a57a58f544af348df0816d602c1bfc48cf7f04c445f9911bf7cc7b0dfd8e1cd09204ea4f253d7af470a7e8a372d1dcec190d16176dd79b662f7d2e6128cdfc212bf1fa05dc5890180fbf7127e69 # COUNT = 22 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x13c957ba6ddb2f948c40f11baaa320502078a11fa162cdbb6a762f11 Y = 0x41236692833bee0b07a636870dbcd92bff2810a0eb05bdefc9ecbd16ad0cddd2a049cfef6b9ec58ad7c567a42d718cd3bbd6c0d7e8af6d2443676f011c82aeb55d71b3c8945baa3b236146cc0a82c0a54d1688a8b43d0f819454fe5e62cca7fc03ed3b0e07586a6128e62519fe44a2e5ed2aaa25be3aa3e89db53d50e194e5ec7090a5c821b36286d2c153148ef7dfc28ed0af2499efbe684fb898bb86208ee23eba3efabc622a6460eedd7a1b5b34c83a0b774f9332b2695a4f75a970f84db11d96fc4c9a3cb430181f9c125948bb7d72ab99d487080a9f550040ee378a9b9a2a5307b864341449c2f7933dbd9dd327fbbecd060c34e735e626b4118715e43c K = 44648d4b06dec1960f979c33183db7952b34a006d2a40a9a57e3fc0041bf80145c9ab49866404d0393c4e1c5e74f047a11a49de9ba0043d648404be35b8d1b8acb882a706b6316bbf2ff785051175232bbb607a0c58a3cb32a3e754b1d492d67881d2001def18e2efcef40f3174d553c6c1502e7b9211047487ab31a9c089c0fff232399b639df51ddfc5f88c028634733d8f20d9c3e4257e52a2411264f9f602760c1657cf3db7031ed62ca9acf58f2d46cece7e1948810de216b8d00c9ba9f225e1e344881ff4a2e66bb3f1274d41782ce8f0a0601870345f831515ef2fbfc4fbabb309c94637ea443b58bd917728d44633b97554abb3cd98722568427e253 # COUNT = 23 (P) P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d X = 0x45806463a27eb0841a362b959150b830dabb83112ebf697e3fce15ca Y = 0x37c26ae6fe17f21341180b4fce957aab9c19fc533cd6f7f34356ee38e9868a4a0c142553e5286074f7ce0c0ca54ea897f9be079277fc80cf13f1cd3680395c6a4a299d0643c07798dcf7c78520e87702a176c80182add5bc0b68afb55575f8170531adde656c84e189f76adcea09457faeed089b6e30566149daf7b522fd8cbf8b072a4337b22fd760f2cd92f02e92543425a84339886458cb544d6a4d7b1ab04c2c9e753a471a09fe9fc63ffa54a5d2722eaaece3df51fc43eb20db903fc4f2c25bdb9b03f3d850a528c0adf8fed32329944bcf8c6f0b31ab7042338939ffc259ad93723467c597554fe37898dad2a5f5ca87d3395b1253fcddb4ec962f6062 K = 773ffbdb1ff196d4fc98812542ceef1678584df359df7a706cb687bd260b33270d8369b32f2d832e752e8078300f81b54c813f8123b2e6b251f617582699d6cdf3a817555c882aea96f536da5e004fddfd1422fe41aeb2a0de41856247dbf8520b0aa467c30903284f935da9b40ca8d15bf3767b8c6dc043554ce7f849d95368f98667e9150e550b354bc87ad7a4353c3bc3ca8bfc15a40a52dd8517a12af0721660051d26d7d79552bcbec64677641594398a5cec8e224f31329989c535ff12ea0984c4cbc46455cc90f17768489919dbc376662089e0bc081434f4bac3332e86c378f270b49fbcede7bba7095ca39a445af68ef9ab1e56fb323cceb3287d69 # [FC - SHA512] # COUNT = 0 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0xd3c4bf2282c255be84bd33f7a1cc07c862e6db3547786620794d7493ece24f88 Y = 0x842a9530522af1434e1478b37c7db60ffe17019923220d084e1e1be74d437291900fd5f7bc883f516406b9668f980e1d631ebe1cd3e7bea1c4be8ec8ef841408c94a753b748e3dd6b35998a11f88ae434c16035c43bfdc4f86afabe3266a75164a3582c198685f3a034e8cc22ce6a4110c4b1091c92dff71db8d54883f8fec221ae5d5e26580a9d437f9ed86bdac49a763544d0eb883f68d420db34e866231912219823ccf982fa57a4c95a618517ca5dfda944e5fd4b98918ed308ee7c8ee9e489200d0decbf91e83798d2361630829a15c45976b640625842d89443f23ce0ec7816716716b80354d47e0eaafad23b8b0ba2fe1aa1f87f2de9213d02391b150 K = 92745336d18970374b779efb43a7471b8de391c7e9015dc3fd50955f75584812c202fc0fb1bc3a652fad66ee5dc1764623ef8c88d64a1651648c1eba87c068a1a82d5bb799d4eebe8db0fce8d7b4c8368e2d7a95fcc67e9586c3bccb42c9ec600f043eb0ace5df9d1a04ec4668522fead92dfbcb374ed7f606287846820f76c5f1960f56d10550395582df99662fa2590ed4b2fcbe94020939c6b3445acc3d20f3ff304eddaa1839e0eab679325487f20cb6568d7f57a4ec1a84337417acfaf4cdb6ea5c2df1f4b16bead8a1dfafbee0d02fe92142f44e12117156919257d5748450110b9236f5113e480e168f310a397e09de66c1e17af7aac2fcbd39f8b5ba # COUNT = 3 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0xbf48d7c4b97803746c64e3ac2dafd9ea6e4afe9ab5009ef8b9298c243808fb04 Y = 0x4261475afea612c4a09fa2264ec9f7c74056f606f5075f57c92d94afda757dd73d9275ca823973399ed77cb60457d7414f0208a2f078d4715a12c7f6414cf7ea05070f24ec4ba52280c9d4f0c03e3739dccdaeeba5aca2b6244f55c5355e3db63d47e68698fd764bf8adcb499a4c1d3624e325ce2c4f1b8a1d2a0d3aa872e15935a2974bb6ccf1567fb81f49ded50ff06720692bde564d1a3b65dee7d5af624b97d26b5af930f0a186c0f0854f39d406c59b49cc947f0b9d6061c15679090df43df23d4aeaf12f152be3659a2ac1ad9078f44b5be11cfff1f7c96c697c8aa50d16a07e15eca5ba9c270ee424af02f29bfc18ab21e1b8b18d40f54b9b53392da5 K = 5f8496f9121a4772661ce0a13fcfecaa8a66e8234a9efcdab68a98cc01e2fde2de535e5f19220a8c85e44c234b2e5c86462a3908fdee02e9eb9aa1cda1e690b0d56e2507f2be8fd47befb94eb09438b166d1d3efa5554a9d225f8456b26d132b979e480c0d894d8cbf4e951703f12b502ee1ad61bb9d5a364171fdb52f89347d60e88a5e963aecc7b2fa093ff849186399ce4cb03f5e2b26dbe0a2435620a18280a433a61c4a51e9ec9bc3cd4714ca4ebb5e57f401f2d693adfe372827fa3a3ba660fbfdd107adddd56d613ccd06aeeff41ee06bcefaa80032da4caca41a69ef906255930fa404a115f024ed0e73c996fd8f07bc2b550b13fbc797a491002e02 # COUNT = 4 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x29553aac124c5c5c1783032e834674c0a7ca139d11ffd4efaed0b87d2f828322 Y = 0xa7c45691eb71711bdea65c8aaa67ea5c6f5906497f7b6f5f59199b3ddb168490d35fb3f08da48cc37e063e63f1b1fb4bf7a889bfbfb05194248204278fcdbeb2968c89240c97f11fcb74999c062e0919ebd233addb9493ee23824d2166d9b9a38bfa3e37e1e2c8a10c11902ada2a6801747f32dbc300122c07c53c5923e8ed6829853c76610730e913a6ae2bd25b55877368fd4acd78b888bdcaa4dc0c7f632a80c8e7094ef92a05a5070bbec8a88fdbb89f6f86a456782c8133489462fb047b898d4fc9ccac13ced6c08a5971b2bbc8dc32b96eee42a505ae4dbc6c5160da6faf3d4f4d98c44091e6a09f38152ad136f9fd32feb506e5589acfa6e87387a002 K = 93ff1a7c777de9359dbc75b4f16cb9c4c95db0c00fead0543863ce4ca433993c95994a3414f6bb0d3d33628dcdcc05a22848687396fe5e5d8102d59d25fe5fd4104c11c2b2673aac2d26c695ce871d9f6ebb9884ba7bd2a78569d5b6b7b1c435b8df28133c87760b20b37be20c23502bcd4e10f8867c79a12c64093e7ad1be390e0168d59fa702578fa0988fd45964d7ad2f775a7c425c41dfacb721194f07034f5923caf89a2aba11e7b0bf3597df71ed8d112974e5f30eab45c2eb6704a9f0809ceb04b32120d970249992167c84c9ad659bc46caec466b26a1187b67ceb3c4e387679b54125465983ec75a2e89a2aa50653d658958852799b2d9111849982 # COUNT = 8 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x0011626e2bf0da66eb868f8380e9f050698838dd226abe99fb17e30bcb9e1a83 Y = 0x377fc68fb119ceddc8662ace3e8244e606f72a119b92439504e283528a2f7af0f550bc0c4320d087e3744c0cba1213ef65ad0f20f8d51806c83e20c83b6b858b57f4b3e22687a6e4c54a6727912d05a7db481b9d9c80b46c167b9b5e10c0659c58d5ce2bf4ef18bb54f8374f7b193d0ebc3f662e8a78465c9d4973f30f47e88ade67e8ffabc1722cb2b9388a70077c703d4c380f7db41fed84f95623f8c2a344a2f6218a10bd9194bd999cce373989c8dfde8b219a02d0dba0be1d126302fb16190e7b9f880261340fe89188fd11f0c45247923a411bc3df2da15e702cdcab077247e33e8bc96a8a7b12025e2498d28955b5df80d7a7d3eaf782b81235e0fbbe K = 61c2e605a09e2acdaac1929777e4ff19a0bf22427c080221d7beb461aad73ba89fe3cfbf9192c276f6ff147a1a09fce6c94d041b17138f61bfcd4ab75512a730bf7938308a05f2ce5ea4312cea4cdf735eb2ff15372d158bcf1ab8d4e66b0494c6b93c0c062880d046f68808765348fa05ab3ab6fe73e4a8d1ee6f3d05f7a0ae766ba4b24442bf0459836411ac820f25126955991db14f6f8e1ce152a11d9b8c3bf2cfac9f3641ee285b6e77751b9b43d87023f5f0eb83d7929c2c83b5a29d1a05b7d1d922fdf24a69fe83273651d9fef5865240b2e8d488d2d4503169cf15072e01ac7203df7a2e61e9735597fc23cd732458ae186f76fe6e259fcd43df81f8 # COUNT = 9 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0xadba9012e967827ecd3bbbb7d37d8332b47717c836ff3f4817e6f72d5c8a0203 Y = 0x9a9911732b3867bccd950d98db26b57c6f590e33af3c37a9878349b14a9a4779c7938192b6efc531e2bfeb139c1b95dd3d12b2a3afdcf57fc187d224de4c7876f7594dceb8d69ed72eaf16ae7b4f1665f207f0de50d6b5249331525e8d5ebaa15c432717a4f1c694977aa4f6bd6537676b918bdb8bbd1a11a50161d372c90fffefd16a5df0aaeb96a1bc3aa1b83c5764883cd5a253319506dae9ac069946c4830324c4fc5e0e809e2f0bfda6d7992152e3f30abf97eb8c5247dcb0863b79eb6095e2125f8748c6076137ce32ff6a5b2a0cbc2643f1127f7195ab4d9ce9b1e57d9ab41c09f328881d06d5a800053aebfe780c2f203815f04d639b928d732b4b45 K = 119d87df337a53ea200a3b5da30f639b602f298c3c97fcdae05929fc5968e6cd0eab09b7a4589a79b3b0e841911e5601e872b32a8bf1bb6cd4ba5e520712b37bc591e00e8c33a20bbfc61a47f5bd0f8d6782f99d1318750f646002a6f0f4b3b8f3974608a2d3d04a358e603bf31b8f2a95953423892b4bd7dfa6fc0d9534dfdf41debd145e49cefea8e35e0b143b417672e1fecb72429660228667ece76cfb5072e1aa1af04379eb086bef5907f9f81a9bb4e0e832a3786f93c9ffa2363c1e035a1e0540a6583827d51d4d38dbd7c60c904e8737f854d493337a47de932cbaf0b4c6a21fccf5123d110eb2da96b9354fff3697ce30041885c0ae047269367e52 # COUNT = 10 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x6de0eb61d0a1307e25feab40d2d39738712b0609e7a69e6a485e660dc5919b0c Y = 0x0f73ed35a690d3de34b5a44aa7b7c307c43964dcb990680f2eeae2b0dc5b66e2ba047308fe0abd58cad1331299bdc3f56708baa0876d48e4a0e852d61cd6be0f4bb7b2a34be16d360323a759fb36ac0d30ad57c08298eee1a276c2750f3aba527072c99e88efca8f13ff00e978564f6b17cfba6fb4753448d062b38a167d286734c45184b696e91866d0f9a43dd134f6fa712314d98c1f72452924c43770ab8b78db24b287987da26b6ee4080f9ab69c909e0c20366e7703ccaa4f0404c6b022949fc5eaa36789a0a5be1ef90a67f25c6cebe17bbb54b540ad891fd74ee4a114aa370df7140a77d94e3193acc4f6dfcefb400ae1f41a797c2186c31f2ed23f92 K = 64f3f4df8f275d484eabcaceca9be33b2ce9b51c5a2048727ddc383ec0bf2ea5dcaf80cc6f363806798414e8f21bf3f31c80883876e83dbefd766f275f669e57201e2e7affbee315544b24b42d90259fe929ba2876491c1807d6ba6d2b61dfbf42fc91c86ef852bd2d8c376594661dabce335214e5cddc403547b1246d2ccf38ebe99daa6d1faa310c29cdff752ab55897fd30d91bb7c13da8fe5ce585a964ec1f8b923b7551c3ee644ef315d9cb8addb52203140031c101411aa4913d4c6630de8eec50bedbe103800ced184ef001b9f00729f15873298c18f9e880a206ae2c1d7e2cff1fa1a45afce9f91945588424c77fd3e75e01ca43eeb8324bd013130e # COUNT = 11 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x94a7f7b90f46b2ec57e5844be9bb86d1dac0bec1a84aa773b35e92fbe2f9ddb1 Y = 0xb54379ef71df296b4355d5a9dd76c22e5f9a16643ca4142f9186702f9bc764150232a46a982a9798384dd88db82881acbdb7750896c6e6a4a626de1c1d6b420496c79324b16d4de7e338dac1619d892fa4738ec3e0c662d75416995fbe977536a81293d4fde3e1f6cba397c5f3a6a0803c24e9e7404e303470745edcd99ed02caf6fbd5a31ce02541a5c83ccd32d918c4cbcf231bec611db75e11886a01d4f56dfdd03e1cdc284c5ab35e29dea30f6a8d1d882dce1d52ebd131bfdb45d7834fff58e10c34db7475ffe0965800fbedc58b5bcede7d2e58d1fc8a4fb0f563381d04026737f86bd0e5a1883070ffacf242d545f415725d467bb25743d5faa6ecf32 K = d0f0d0dfaee8b5a79efb75d1d2711f06ccadbeac579cb70e0a3d2bfb32c495fb59468fa9e50f29ca2eb10729ec5ac43b329314de21d3e75d794e201dfe257ee3f22a92b5935c4ff288d35ae1d00fc64c165f0f04b40a622117627f852251d059bd920f35f6dbbb991e0ae9025993f9d3f30ab827dc3f076415abd55533d38ae53374bde9b30a9a43f52be217c653e50ad13f5b55c078df8da30d3096f144cc37a2bada6f1aa479c29103eeebc1bbec532c6c628edad7c3c8edcc3a24e424b0c1212fe1d878c52d1e8c6f3529e925ac76cc26e5d39ea58e61305a58ed4e539fc593f7cdb34923f463def9eb5f8d46866b55a3deae0706841653f3ff0c919546c7 # COUNT = 15 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x53eee2bc2f65117ec4cd8756d9eb9681cab98e6a18fd9927b436f6fcacf2c165 Y = 0x9c91501623bef28e4ddc37719058a9eb2ac50498b68d292b43b4bcbe27aee94cc44b621dc75476e09c8d938b7e4ef82fa9f4fb1be81e7844f79601341cd0ae9583fd5404f8ce33284830ed0c674960a0a3864e33061bc3063a73765cea62cb9f3e66ac4d61b52dbbfcc7d186484d8750556e1081eafbffd9d9f5f80cc3820b8a30d7023f1245d5aa6db5756b6552ce9f18078f17ada80c9a07405133797496038df2415ae5bb58b463904f739a5b0eccd239d2d94f455ee1484e9e2f16fbd2d28f2b96ee9873c520eba5f2f05d591932c9cd9585fc689a6e2cdd6022d82a5b6c5c424568a33b7b333d1c0a1167c6cf96e9f1d61059183e509be2c8d4d2513ee7 K = 988c2cb7e1f2481d571615fb741ddef6a8d1d5d058737e7610a56053f305d9cc5466f2c0f82cb7f2212d842dc1872416f2f9d6f7dc658bf1e4fea7793fbf2772d4cddb1d6ccb4fb3134764eaea390cbec2bd3dccb64f64815df3c47dbf4e8b9a16aecb5d4171d99b47ff2d2b3e27778b40f6cfb42b0dd3d2d9b0a13a360cd2b27110703c9ac63ebbaba5ad9233934e640e0bbd0f0a553b2e08b63a812e30fb66123d7f3835d17668c7e9729a0e656fb0071fb4a3a1c34400eb61d3a3c83d791b8a5885768c0a0920892617eec8b4663df492abf53f6992a4abaed224e7bc279599ca924a3fb6b9c7e4f4ef286f1dcb8a51a13f9fe5f49351a3c149c4592188ff # COUNT = 16 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0xcd66f16969ce85c1fed66a88cc4e7f5f434f499accae6fa1400f723c57284772 Y = 0x5754f09d35d8acdd7b17e2f39b640b80127a549ee7accac88d227b37c3ecb5b9949affd1474c654c377b5faa9037bf456d67800572f828f9d54be1e55c7711e0d253b6d52d528c6cf768e28506b5719a2ab7592ba048f43da9fc7e0b959a432a436f5efccc623684a6e74cc8ed4f858812cf89405ec721fbaad3f5f2b129cd4c4d8713dc2617fe73ba56fbbb5ef5a8829de94ae2d6d677b3a2612b9c34bdbcd37978689befc8d0d919de5fbc96706e8749c81f7b2250c693ca1dc7f0dcf23eaaa83ec2819e5e99edfa5330cd3b9cba6eb8dc5911af270ad9c20170b74d55e0f29b0ae8c8a6179937537207044796fc2860e2439ef8991e0428b5a732a53d4616 K = 806ad098ea1d67c6ce587091c546e922d3fb9f42d932cd53294c08ce51db53836b5203d39dae884ff15ce2fbb979a1e334f4c0f310976b2cb212be54e5fa5c6622e78a342998fcc453647975b57a71e3bd43e3fc4a379c8b66fbdb024cc260820e02410b518af3e64b2fbb69f59861da357302e204b6edeb0ce4577863560a9f79c082089868d8a7e65d571545306b610f2498ef8900488e317db02b7e6f3bd340ef98dc81a1681118e845e049cbcbe83c1154474af9cabbe2f347559e0799de2c89270160c69e94c0caea6bf69c9bd4320873842f1b49ec4b8a5c65aa4f4904525816a78002db4c3a1d4b92cc2aa28b44fc9140c73b54f989fc0ec3b69a68f3 # COUNT = 17 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x3f5edb5768f231efc04a72dc5a47f5ea490ee5ecea69457a1a5abe243fa1f606 Y = 0x7bb185e778ee3dc4f0bf891438c2ba1706cc7abc5ca97b52c440be328bfcc0332e3fb11f6f90230c100ba49e0a8ee8c7a82f696a32eef646cc3a9ab32b8856f275ae9c309b7be3438b36496f2c1e9ebf5ece0ade909ed2f2465934dd1715e08472f06b766e6e220604634661994df6f95f27ab079e55e51ac734581fba18414752522258593dc4905c430a4b3749d1180b501b918a89589649c7084b98aedc73aa1bc257659a69da5a74a68c923843d918caf548ba9d343f5f3bbccc3e86dfdb060592d518e3c43c10d2009badf7aaed4c93bf1e289cf5d43c3d1787d27383da3e0978974242976f97cda6c8a056430c03bbf4dd823f3f21f0d077d181a96d8d K = 1ffeb9ce6481659ce15d31ed39678e62903220a12953e55cfca2be47060f27e16a1c1ca2a59d81c588c2b873b91e2400bcac7fed015c6257291e0eca46a2323357beee93c8ef2d00b61c19ebff4baf1d8fb97313e2fe1253a61b031289a2752b4782b80db04ee97efec846d2589c131b98fe60f51e2948a417c0870791d7f303767d74f2482abbacd39a803db70fce9310a68786209ae4e359f64437fa2b7e74da1fe3a6d29551e843856642f6a29c3bd300facd559805cec40280ab96b4e2bef0031285c3d160f3f9b74ba22467e260269d70ee5ef948fa21acc37d25b6e5390b81fc5063cf14d38f9b952bf5a86b6f70ef76ee2fe7a09fe77e7176e9e190e1 # COUNT = 18 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0xc4e27b1df03a45d9af64edd16aee99896392549618fa698354274832d076c15a Y = 0x6799a78bd72bab332cdb93f4596d81c33447ab1b83d3230c67e44b661dff21cb2877542855c4b9de53477b73eb1ecfc9c2b7d652174263ed130a75e49d41b0475f238ce93966f0a061c5839371f85f47111dbc12edc8e2d1d4f01f4baf3d8862f0188bcd9052a3ef2cb41d6aac6fd018e9969ca6b07d30e149d6a0a4210b5c69624640f285f27ac19157245fd030b940637d7ed684425ccdcf6f83e2639bac50f69db7aab75a0cc21720d3e6dfefbd197066e161237ac0b93f4ce821f68bd2e0bcc9c53d71a4294e5d497b64eb5830e8f9e1b64911bb1169c1820f18c19d3ecf4c4baa3f5f33c9c549f596dba11889510534218d7cfa230e53f0c0f9a420e217 K = 73c97ce4d32f64d080636a729c5ec4c7ce0573e5737e22ce65a0571ccc10bf4bc6426a9ef7ed0876cb413f919dbde3b970146ea249e04c501f3e1012c304eab9edcbbe8252e7a9d9898634e323530c7342854e7582604db91814cc2bb9eeaf91b48753bd7fd05fbb053483addeeeea4a1a43e7a0f236c13c34cd2318a499ad43acbfc64d646fd2309cfb29ad7dd9c468aeb7611d5290c6476c431b281bab049894a3e65ebb671ccb2cca73c9214e8ff9f5557d81aa15788ef4855402a4628beb96640ab72f82d014a4b3cca54558a30d56e9339f18007f867118953fcad4d24238440e038a52cfaa01cb03d8059cae965ac3f5403d11e41c422a999d14b292b1 # COUNT = 19 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x0f97a69357b5b62af9ca603da8fb0c38d30d0cf9ca1b4bb9dad587378ceb3d49 Y = 0x118450e30a5459e056da29140db279901b215ba85975feb54e17a2c9b149d124eaa2af82b631e870abb2d43d377e58bab32f0966cd3cec6a56b0726d017ce1bfed426743bbe074db004db995dc0711a6d4b5bde53d96906bc2281cdf6746e39d5c1d21a08259e168db04c7edbe82a5e3297a762b6012922510397cd9b0726764c3ef49ddfc448e35fec52b8a3243484bb6257acb411feeba1cb97380d2dd4e9f0a034aa3dfce63bd506d5432a8206b12c10e762843ac44358448762d28fc6f28d0169f6854a2b4851fe81319b42bb96fad386e64f8a80401eb66ff7dd7d690942392cb898b2ef0738e0c26aca3b56cc7ee9806079c88665bc2d5e7f318fb7a84 K = 4dbf5a174593e87b261c4aa1e3685396106803aac987fda8656fad2807a945485279270274406de3788caf152a349758760c6f33f651f900c68dde9ac0d92b57942ff137f65e17c76473e98a7b24aeaeef601b25afdb573c0e9fc41e66a26e294ecfe25e05449e8d48c1f7b1043b39c0d72e9a200447e66b76682445521e8c52b5025f28f5535358b3da4feeb333d56e8de2558d1a7d24c807667a82edceff0d231fe1a34c8bb80fccf9d0f0ca65c12a48cf94eec122e7042e7f20b762934cc77dcd1b2a3e3e4194fe39f1589c0297ad8dfc6fa0aa9d76d83fe0be920f05e2b410b75a78b0c624355e42944067009b0582015848f3cb9687d8ac8caea0411d02 # COUNT = 20 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0x61dcba29f04712137c3fcfe6083db62363e0b2744edb4de5151c5b90fff22f36 Y = 0x5ea3ce0aa2ece97d3ffa2c0c97cfaffea19d5212db74ec0ca49bd05816688ce96e91d2b14fd8173aa8581cbe0b35b4c5d6d84e8cbbb33e173991c9b6e44a0db41cc3800f587134c82ba8bf7a9e129d6bba60a4a00d961d9cd6dc1e80a148ea55674d4efc2293f9f3667ddacba23ab271a909553cd1041e01e4eb6bf5cb6e55c9d972b42bd1634451170cab5cbbbb4e3b38145af03118f64753fda50e047e6483fbc4d5f0e50addfe03588566c7cdcd7da6c641fc1b74ccf4ed2600ea2eb399b6e149b54207e80d80ff9e411338b37cc0187326942b7588becd27f0c00f9569d26e3e9763534e85779b0f6b7359afd7a9e52479a6d7d4fb97a85ce089aa809301 K = 9c0ce218ebd9f0f895161ac96c576560b3cec0528ff74bfe10307c2533708359d73ad48e55e54656457ce7d82d03d2ac9b97002095d1f705dd0b477904c609c3bd3455176129de9ed9f04e09986fda9fe1e36fda871baf2d73f15c75d74c5af80afb0a9a3d8f10a1f415d64b64d1d67c7ea5f06dc6cec264ed45c16042bb78a15c88ab5e26d1e3f77b886779b84af41c3665c27acf35cb8af086d09f123435ff87018e97c58a88c2332171c5a3115255a4d7bc5047f86d96374acec55295cdb63fdf21a95cb65a37430258636e65b9a3496e7583648acac55254899d72352155211d6b4a6d8a881f40b356ab7e02f34c478d84563bad35899b6c463e955a0ed7 # COUNT = 22 (P) P = 0xd5aa4e1f5ef764b6164d96641da973187a804b04ac6e2e690b27c507a610600e6d30bed2eae8486235930e5e33c1a7ee7d629c69679419b3d381a3df8dd9f1a4280ec460f327295f3b99e0252ac391c7d1f4c28bf1d2cbc54b6607f069f3ab146f3475438c425278c09574528dbab1777d273d9db10f2231c9084a737ff35ab81919b5616c16ce6c08ded4b9cf369b7ab6a0cf47a8c8408ee1d76f86ca07fff26b1261e7ad4ed5f9ad97b9ec1542bffb79406575c98be808b073a32d09d8fcd00a1d78601c4c218bb08cf7d9b3b68a3219a160d99acb341f3d91a04e01b8497b3a485814434562ef783245e8c70bc4039ef63068e0c0e94b710b90343220e23b G = 0xbb2f5d8599ab7c2b18f6ace7b17c216a28a6c216508224b8415f12befda4bb687acb1051b03be23bbcb286e049b3513eb52c52bcb7bd21f4e1e1d9d15c0e248ef3785c3b6862e98e6819eedad3b9c0ff1f2d1a0f7360d9fd3d0c88b222a3ad822e6f97421a5d8017d6fac656de7915c6418faf7f83ba93fa673a323f18046e55f8eca9db7257fde3f2a529fd88962e659f2087941102645ea82a15ce306ad7b49b405857fdb3b2f2807576a998aea6a4f1810b342bda2a2f07092a0a22e528f49b942219e73cb04a3f0a9af8d2a53578b3d56ef055060616ab789509a1d1d9a194d83a99dd7d6ed024c592f6087d1336fdd3f56a27c58d4c992a708a75de2c4a Q = 0xee3e8455d5babd1c9611d1b6f23dfd13efb0fceab1235ce6b03cffbe2b0a1fd7 X = 0xac3b4e65ce5b3b2c2f6abd8448dfbd9ed9b636e0cffa28854a340fb7594da55c Y = 0x3bbe9c83b227014b8a80582e3885220388a11479b8ee4a5abc5b1390a2c173aeafa06de066fe24d9f3bc0ebb44d36f0425ff32efa263ca82a64cb0874fc43bbb6eb702f56b57b1eb250a07f321d8ef1a9359310e4265a917ac02bd5d59a9f0e94eacb4a49c38102b088cfaad9a23fbefc6a2611ad9e76b429fec7189c5918dbf07640bdedee1e4b3cc3f0f6074f84913cc7a1308e9836a133afefd6064ab6f1ecba8d4bed741dea1d3556f19857841c6a92b703747c736fa199ce74d1af36bfd144f95fa736371d35ffe938e388fe79083e3b78462a7b88d6179d5cc2f5ccd3bc79dad15a392bc1dd17748463114bfe3833cb842c39aa610bbd4e59255a4f93f K = 270354c2981f33a42693c68101d0730551418e942cd405afba00bc77ab0f0b6d6f838a1d82231be22dd2deb5add7fefa21472759d26fd0255db5f551c046b45575d54872045a3f8954c33f67f39396af7113729ccfb7a2c7b8edbae3c1a627c0fcddef4e4bdc0ac0c84da282cc24727b5567343213cc39baf0d3a0d9c51b12c28f553c2dc42b32e1ec9d8e45cb2cd9d7b0d439cd4f2d3924f1ab138729e80d384128b1e4a815b6254c40f7957ff2f309b23fce4d2ee5eaa4b47f76180e830bb03ff6213ecf94ef56c29ea54ec1e418bc305c6ef935f2d850a9f2a9081843f4a70c202263bc0f8b25d1242ead53fb5a1db831985b5c858e8893c66effabb16bdb # Test vectors: source unknown P = 58458002095536094658683755258523362961421200751439456159756164191494576279467 G = 2 X = 46205663093589612668746163860870963912226379131190812163519349848291472898748 Y = 26821400572298074358375073922715498403273583367617402781946773132088456286733 K = 5D9A64F9E54B011381308CF462C207CB0DB7630EAB026E06E5B893041207DBD8 P = 7080941971697125115953429172307253449997092375902849066092516886443770423993013931939664664691599157495586618571486777257251370592538466283944520569755243 G = 2 X = 558545918073450953822828294657166871085534488182588754070944297274702844791239790350137385125663944726718987047123606999344398260535747142299581818644894 Y = 5414004572904348025296832268296927639985617596751048805496391472266617693297043686410755975231136915922983393130810278045355076974349430254905203521469281 K = 65F79BCC47862E02DDE775B8FC7B1D0CBA094B753E502D49A4468687681F178CEE98016210E136E80255FC8FDECC4D38D91EBC82C94B17652BDC7569AC383F39 P = 13136945886549419892672364204240698856868140920222753719410945199521492957942501101571382423757107983263697942121022398653040312294171805755003420937008819 G = 2 X = 7234683127321298509925294581253140833264699266098978220501763131351358687985896274862103003239800546011982186510097828911316488529426006616714526458066271 Y = 2279687933022692843565305738851942847753122181957871349712298819158246913703861338250576252594546190393887657989733709994119777023140405518896999362296894 K = 290BF0265BAAD40A5853BAF3CC18B315982FF282C82D7332DA6A8826E789330D875F29F57D9A622DB7DDF156CF4440EDB8455BC32859FA2A178D42528FA64136 P = 7837101158566379575244981793821373232935960937791570311529087011989828139360157566031864344629391921990623396775060696298931110532512473525227009216442663 G = 5 X = 2271743810121848480269660476736588602223609425319496369070326649477151605521404690612976189919437998885287608828699462183553427369647044489290359586354073 Y = 5553605535786829473948867606958960228544449485744361474243970893441441245322015477973193059017330938119851955120496598438033407790780406867070511553809237 K = 4ED3B2ED6B3E8446D8E1C3D2BCA00FB939464874BB6750BDE5F5DACFE9F819597E96F6B1DBA27C785553383AE87188019734A160B6BA5396760B88EC1F2A0E92 P = 94601366105683233785857165617633883930888659900865798821537131281240413334589084848277586190796291421413056657355624982032535320546697702506255545831695999765620345337665948695835489391652130862575428732385880123143529399201847515289798598538556585982541405034303884158851145992650670977252891826481077576283 G = 2 X = 23484534159498465809072519330053257189446469650913804186985945596423260246286292600333967669376208639922768407894768298151128017428601886623219847603288857771541399565808620552396892534905511436715248032341612931260211253869255846963169818664325386727815821240629227196043893200670349600641190073530521475769 Y = 5432307605192951130143195594341230106472453193740817014833299044466758796406314885816769577417181043800208414512454882219387455875605089197474590288847925182956692434090736024405561167965732783350054200615740891235826401928590081691818434389717991597889828540215480852496077254876423767132564403274562077989 K = 2B6D9504C1D7ACAD9652CF79A6A0630EA9D19C197E908E992BC318BE2867FAE3C1AD5BE83E6E4AA1CBE0347774038F20ACD790DEA82B2A5862BF21FA4A1AB464AE985CA8AC4E5076AD0843E144C1305759BA047446A3A7F2426BE0C724F269009B54447B6A970876E5E4C613356805014D6060039C081AFB046863CA9BE9C848 P = 1552518092300708935130918131258481755631334049434514313202351194902966239949102107258669453876591642442910007680288864229150803718918046342632727613031282983744380820890196288509170691316593175367469551763119843371637221007210577919 G = 2 X = 685078553304159035464716326854822835193451441997442840800795603162509841400135338379277554904437091176379541017234777332187633447726175655914472581493290704556522238276021530976753683757729964722818958026528667421943355247435136595 Y = 327223566388550147370456252927505638960185374656702554704111121893769362737925338166155231522305523733603768644188224638966076688893552015565591036893892648172244492495933633231578970690616347817811694307569976520005347020917701473 K = 1835BAAC22790A32874BAD6465BBFA22BEA8A8FFF9847814273311E715FFED515AFEFAFBDB88F5F6059A874B8ECA325553D2399B36BDAF703E23D9BA426B440AB9B3232319E82F60651B5D9610FF5F62D9676AB0CC691DAD9373E14407515B06 P = 179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007 G = 2 X = 117358355093158243772281726564327046342660004246661964421820081457157103053753677892051651545371928439421320149937005053232860858176909658402981485172940971108603819473237690552637374100064919496138069890177714358665483995265800338671856318966175136885292325639757886026364383579423253849605396187475232095132 Y = 57539423295638442206892167066359686700569189630077747353691730929497731533857441647649392933925074234706822761847935684100782557487799951849914086530002264625999875869016136773588580906347655217075180010311369271052664776904944276355980602373353393308677804412765860544107788108937583994770986950679514411138 K = 78E5A35AEBE11E2A6EE2AC7CF250BB6D14D4194E4B4F863388B403A6D4F771792399B005B60876A2B54F38B10E80D7FABD5CA0260DA7F49D3C8BC319EAB0DCE98DB256D55A3D286FB4A92D426908121A48FBE08BCAFBB2CCBD79CF2422ADC0BF7FD6D32BBD7179CC92C5B6F3A0A66F75521119B054C9C890A5508FB82DFCF947 P = 2410312426921032588552076022197566074856950548502459942654116941958108831682612228890093858261341614673227141477904012196503648957050582631942730706805009223062734745341073406696246014589361659774041027169249453200378729434170325843778659198143763193776859869524088940195577346119843545301547043747207749969763750084308926339295559968882457872412993810129130294592999947926365264059284647209730384947211681434464714438488520940127459844288859336526896320919633919 G = 2 X = 739237112970057740207427313296331508547391873351087519031317088463605671805753509064566111939928774686685012380575825453558190567587908849270209558552261470752455892663534625353851360146457902583604933234946685508662607721742406960168643112043128254559696702490538293280515843221598157060555060961831253846736136674532026172122886701311272287722144640110537857543398614740899065206358082818681236923673818434846278268060441757896300104313769477393005945867319551 Y = 2319569997045750172247255393999740875354387751279327121702321177939778299701541339488022815311117326701128396690789142720324309771370152173591363190398312104191303941359918617839579521942187046950042060629622150750681445647628037848196430901082650422412334503051413809801325964735136409994376115795040051320646279397973104004574442215154659146959404571168426685620415022294507517851849794008307530784068395636247103219502223279453021147479873923533569526239456 K = 142195F7212A66E8E79E6CBCBB092107C38051B998A46110A759B2DD35DB937168AB11CE2AF35F8C9263C585FAE7FFF37B9080F65B6AF33A983D8177455F9D905ACADB57DBFF67A27D4947C999A2B5CAD13BEDAF05BB2A197654740F54C932D84580F6B954F57C0A42317CC77036346CB8FB3BB07A72497C74BE7A454AA98BCD458F85B323119565C650AE6F884BAD489BFE34B4A7116412E5FA6920355DCA6524110068A5BFA93E1CACB6A9A3B4FF47A760107AE212279D86C1A333AAC0E7BE P = 9650540440490314114937009702862421346296588410976036984583512014387927052445834881962885606471285866861162806563202093993018048357096397454155827066480523 G = 3 X = 582646568513729405829699179555740781 Y = 8099719757647916223822063484222705158878658473312587130023067523399140988048790366880122762583204592631817851831834181092213563237801470024540882048770579 KDF = KDF2(SHA-1) OutLen = 5 K = EDE06CF771 P = 10328425326708844997463618196881079202096586111807163616712657353772693558065330782839301782605824457005088877790770752381734283533915349886076287514294499 G = 3 X = 1245853531965678848050580170395345372 Y = 3741925297732257800388942145915951818711052550638265126235091729177488141581832572933605375465343091306397047810564632197696258931020804293367408515942002 KDF = KDF2(SHA-1) OutLen = 16 K = 02F0A9B8677D7874494627C1AE8B1507 P = 9735079771988746160588414005927328258439919394490709255833033931423838694501728498091693697913157881691746262124897319798812025850609839874242846065896887 G = 2 X = 1167818142943580811547899864055610798 Y = 8292441025584385605764255514650466545107472983148620609025625962746170801303655483386434681979246093568268448206095083434064909028960372597282728744026849 KDF = KDF2(SHA-1) OutLen = 19 K = 6F6B153DC35648A59C2A43398318F90CC1015C P = 85114557364650008420045895122918006307213511126615441094597696814447313996921277639983683027633045230906349467122611624145875444033385043106252287751516683 G = 3 X = 970719560534601667282575035417201115 Y = 10184561344323260378129885913082975330372891056845460299665355240407681081121453882614207213107251259039062495690891729714821396325174175235314653087355047 KDF = KDF2(SHA-1) OutLen = 33 K = 5A70601B0668BA303F8FBFC90FBA82B9D589BD586C576B414A6AF17F9B386C7020 botan-2.4.0/src/tests/data/pubkey/dh_invalid.vec000066400000000000000000000117601322470703100215650ustar00rootroot00000000000000 # Public keys failing checks from NIST CAVS file 20.1 (Generated on Mon Jun 20 09:02:25 2016) # http://csrc.nist.gov/groups/STM/cavp/documents/keymgmt/KASTestVectorsFFC2016.zip G = 0x1e2b67448a1869df1ce57517dc5e797b62c5d2c832e23f954bef8bcca74489db6caed2ea496b52a52cb664a168374cb176ddc4bc0068c6eef3a746e561f8dc65195fdaf12b363e90cfffdac18ab3ffefa4b2ad1904b45dd9f6b76b477ef8816802c7bd7cb0c0ab25d378098f5625e7ff737341af63f67cbd00509efbc6470ec38c17b7878a463cebda80053f36558a308923e6b41f465385a4f24fdb303c37fb998fc1e49e3c09ce345ff7cea18e9cd1457eb93daa87dba8a31508fa5695c32ce485962eb1834144413b41ef936db71b79d6fe985c018ac396e3af25054dbbc95e56ab5d4d4b7b61a70670e789c336b46b9f7be43cf6eb0e68b40e33a55d55cc P = 0xa25cb1199622be09d9f473695114963cbb3b109f92df6da1b1dcab5e8511e9a117e2881f30a78f04d6a3472b8064eb6416cdfd7bb8b9891ae5b5a1f1ee1da0cace11dab3ac7a50236b22e105dbeef9e45b53e0384c45c3078acb6ee1ca983511795801da3d14fa9ed82142ec47ea25c0c0b7e86647d41e9f55955b8c469e7e298ea30d88feacf43ade05841008373605808a2f8f8910b195f174bd8af5770e7cd85380d198f4ed2a0c3a2f373436ae6ce9567846a79275765ef829abbc6171718f7746ebd167d406e2546acdea7299194a613660d5ef721cd77e7722095c4ca42b29db3d4436325b47f850af05d411c7a95ccc54555c193384a6eeebb47e6f0f Q = 0xa944d488de8c89567b602bae44478632604f8bf7cb4deb851cf6e22d # [FB - SHA512] # COUNT = 5 InvalidKey = 0x4e2a136cf21a94b4c226fb5c6a4e9be1472acffe8dee6b20f987b1cdf90c6a581a69e2ab25e3615e9ee3681edb2c468af9142fb2d2f4b7333133e107c829e60d00e969c432a204105e75976eea05ee0988dfbbd01cc10d816908b0f616b620d4829ebee50ddd1733d025ebe5abf3d069a3424ec1300d582cd442cacae6f09760cb5f4195fff6fe0c85ac986e14a8b232b33c6f5e7729e0d38fd42fe07f646816e01c6784e029a03663199b2ea6135aee2949f9371045ce7c24a10acd193fb3ed5b53326bae54bf5928fff5548d0877555260ab4475bdade168211fa3a1df87510b08796ebce5ea742112ca7942a7a602d106007a5259624aebb74fe771755050 # COUNT = 7 InvalidKey = 0x347852ff2455951a209b19bb1b8a121f5c77c7899ce540ecad4f740aa14bb6b44374a5d5f1427341817618c6d64c49895d77ceeeb04c3d84d0c360e125cc88ef0751dced4e795c6db1819b10f4d0260ff430e934751b1fef76bd0f1b76d884f56c9c8fb008e9a11f5bf52270845be85d792aa041c70a80d7d5f36dfc6a397b5386f01b09f3e50a896b71358b709ffee900e0edfa79bc03d3aa5a5aed148b92dd859c65bd0aebec19ccd1ec327894242999ea8623b9ae9ff1e71a9deb6c5876ecd9e9c4082299196cd90ff8ce87d697888651d1022e418f47305e685057f0437bebf1b5d77887d2bb3cbd936d7a4a4e948962f5e940bfbca7216ae8dce27df3f4 # COUNT = 13 InvalidKey = 0x6ca0b830ecbd14bf83fa4c1953723c2ddad8fc49e43e10247fec75507258c17b8a48fccc246797369bb45aad921f76ba174a10d81966668f62dc9cd739a9f19839eb26503f4e7db63c14d706a5b44fe0c5a8f7a343941db5f15a7af008e8ea511ed7c002cf949482d50f35471bac48b1594178c9da13c3264bd86181f9ba9e3bd35aaf23c753413137f0a9eca8f52cdbd33d6a4e4bdc14b30405c5175a9f9b54d9f301a39321623d60133910d424f0985ae7478e1865241d096a07d5d37bdd845a85d7d2ae80f3b973827864a638be440c2e10c9ce3d062cd5a444f774cfb981d47baaca437d10756328980f43615245c3137be8bece09e25614f793f8c81c1e # COUNT = 20 InvalidKey = 0x14065ecaf934ad595e18264d51d79ac23b4b7e82f2f9be8ded8debedd99d59e43f295051ba53bfcfd9bcaf9488641d07e5fd9d1bd3e6ade4c5afe53521d085277d9739ebb70dbc75e531aa2df4ab9f5e9a5efb203c4d9eb2267ca1df7242d68f4fd95a3dac6908a6e3aab3153b27e09f244faebd665ae3196f3b119ff8d1ab30bf4b625a2f30c18c347fb413c02792be1e31fe5a13ade3fd6d068ae2d9e8740707267eb15d326ec0171b90153e2368690160c4073af09885bb215c7a73faf445e24071d5d502803986c6a54288aaf947b67a716d181e822807e82cab3c2bc56620db240a646da43c6091a7ed15c9fa14c7c3a4dde7299fbe908ef65a7d3b29d4 # [FC - SHA512] # COUNT = 6 InvalidKey = 0x0596416ae996328fe5a617575711a34ba575a556d4db035ea6c815c8203b0d9f7ca6c7a94cf661196808053edea255540543b63c40ba87f69f418051c3f06394527f0a2741f0d16ee94db40888edd85d4f063cf4e1cfd327505f83a2f3fdf0e83ac4a3f07a57842b15b4cc8e4f14f56ebe01f8dff21609ed0625c99d3745c41219b3791a5a8b544f5f9a891095db63d8be4a0c5b3c9520da5f307524552557b908ad7a978e6bd54ca18f7d55dbc3d75f961cb46d344fcd88c98c56c44f028871e847a01ea8670f58e990fa402a5040d8c7fde63dd38edb5dea1850d193ec53077444517422464df2c463465c169675999e3b0968bf03baf013fcdb05ae484e16 # COUNT = 12 InvalidKey = 0x71a6d5dafd1ef49d84c4cd15b47a9594d05199c3be2190a019ee52c6a844b4cf7a579b7e4d16d3591acd1a04e9298f3d3e65f66cc48629478baf16b51f223f8f13b5f6625ba1c013f078361b0fec44485fedc6a84841e744fd6fd73ad716f55bc9f1d18c45a3d7fbeeba754a3a56f215298ea037532341ffeec2a25a91d9a939ea8607a640ad7731612bc040aa98df944bcf0b37f31389deeae5766d6ff1fb21504689ec1681a71e77926f2602db5700415435eae90dd049c5091d941ae5ea3fd542442f2cccab30869f80b51b9002efb0cbcbbea1e45aeff9a92e3d896d722dc8cbd14211db99b40cbf4ba52473da790ea6531664d98d1cca5d49dbc55dc154 # COUNT = 13 InvalidKey = 0x15d3595dd8a4bf905cc739c92895135467bcadd3ed96e10ec9a07fcf8a1c693653dcc6caa8ded43d63b856f4516e73353557ace6983be82f4c8ff627ed04f3a2d31f9a827b68e65339fdce5c209d801f2bf99ffed9a5965233aab227b5b11926fb1981660f2ec274768cfe9729e5b72d9b3073716885a69c647e3469f6267eaa77d24c9068bac761aa9c0fb0b25721637fa99f4c4c3b76b0a2a3db7507d66d1bdbf922b10ad4105c05ccb96f4874844103e5a1d84bc46a086fd6d981979f7662695d0c1fed108b942bb481bce19328c9e0834348fa251341088f40a004743958aa5b61ef3ab2ef9be7d264334c21a33b695348f169ee244ab5f2bb92c6ff71a7 botan-2.4.0/src/tests/data/pubkey/dlies.vec000066400000000000000000002302771322470703100205720ustar00rootroot00000000000000########################### Test vectors created with bouncycastle 1.54 ########################### ########### Block cipher mode ########### #public static void main(String[] args) throws InvalidCipherTextException { # // 2048-bit MODP Group. RFC3526 # BigInteger g = new BigInteger( "2", 10 ); # BigInteger p = new BigInteger( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A0879" # + "8E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" # + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" # + "83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" # + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA0510" # + "15728E5A8AACAA68FFFFFFFFFFFFFFFF", 16 ); # # DHParameters dhParams = new DHParameters( p, g ); # # // alice priv key # BigInteger xAlice = new BigInteger( "A01E167DE1013D6859E6CB068B7BF272C1D49DC764AD7676BFA0D85177", 16 ); # DHPrivateKeyParameters alicePriv = new DHPrivateKeyParameters( xAlice, dhParams ); # # // alice pub key # BigInteger yAlice = g.modPow(xAlice, p); # DHPublicKeyParameters alicePub = new DHPublicKeyParameters( yAlice, dhParams ); # # // bob priv key # BigInteger xBob = new BigInteger( "8DD88BDC19AC1403A3FC3A0FC63D360F1062E3494177DC27F7EBCBD4A7", 16 ); # # // bob pub key # BigInteger yBob = g.modPow(xBob, p); # DHPublicKeyParameters bobPub = new DHPublicKeyParameters( yBob, dhParams ); # # // DLIES # byte[] d = new byte[ 0 ]; // the derivation parameter for the KDF function # byte[] e = new byte[ 0 ]; // the encoding parameter for the KDF function # int macKeySize = 256; # int cipherKeySize = 256; # byte[] iv = new byte[ 16 ]; # CipherParameters cipherParams = new ParametersWithIV( new IESWithCipherParameters( d, e, macKeySize, cipherKeySize ), iv ); # # IESEngine dlies = # new IESEngine( new DHBasicAgreement(), new KDF2BytesGenerator( new SHA256Digest() ), new HMac( new SHA256Digest() ), new PaddedBufferedBlockCipher( new CBCBlockCipher( # new AESEngine() ) ) ); # dlies.init( true, alicePriv, bobPub, cipherParams ); # # byte[] message = Hex.decode( "00" ); # byte[] result = dlies.processBlock( message, 0, message.length ); # # byte[] ephPublicKey = alicePub.getY().toByteArray(); # byte[] out = Arrays.concatenate( ephPublicKey, result ); # # System.out.println( Hex.toHexString( out ) ); [AES-256/CBC] ####### KDF2 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb7c5f222b4215cd1b1c197fe8cfa2a252ad4c61a599ade3c8e8d0442b93afc626405fbe7bb1d103bdd8ce9468071a013f0f627c2cdcd61a253bbf81feb5ae6093aee4a5bd71f2a2f20764615d0e70561903de24a46cfbc9340f4fe5ce209ad48c97a4e3a3c5c75186a020f4b44008f270 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb7c5f222b4215cd1b1c197fe8cfa2a252ad4c61a599ade3c8e8d0442b93afc626405fbe7bb1d103bdd8ce9468071a013f5be4a46a387f09e11d75b5d21993f4eeb287410282007dba329b59a588d84888dd6f6c8d74047ae9b82097e64da28721e70adb43526752aac237f565cdebf0be Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb7c5f222b4215cd1b1c197fe8cfa2a252ad4c61a599ade3c8e8d0442b93afc626405fbe7bb1d103bdd8ce9468071a013ff78712a17c1894f458195e0fff798d995090d935e3deb25e13fedb9abbce760da4f49b70ae6e0b6c6261a182386b687873e03f24ac64dd74ce841a4ab04a2bb6 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbe0004a18072d33b7a7ac09362953dec57197a78ccdac0f1aa98d2a2eb6580a48053b0df23dfe2518253813dc1d1e6651cfefdaa03d8a2bd25201f40abbae203d1487b0d79c57aef0c5d2fb05f9f86f8fa2806eb3cec40a46b9bf7589142ef680bea0cf197e28dd4615c6f921418a4f54 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbe0004a18072d33b7a7ac09362953dec57197a78ccdac0f1aa98d2a2eb6580a48053b0df23dfe2518253813dc1d1e6651457da847bc1f337d1219222f97d75fb2ae68938e7f28d7e9595b87627d07d0bed859d0fb0077655b1c36ec12024cfedb4f8db121fd82e3029c27f8bac0c6ba1e Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbe0004a18072d33b7a7ac09362953dec57197a78ccdac0f1aa98d2a2eb6580a48053b0df23dfe2518253813dc1d1e66513c34a7effee403da2137493cd7f3e55b77a0cdd894c7126cea1d50956297e9316ca319ae00b59f45fdc781d0569825835376d3ad8876d1e5351c958cc858de25 Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb97f3ed7829ec1c4b6d22646252e19a267df9b0100f47f6a376c9b9d9c35a446d1eb7b12fe7f6d6e659d9c83c3c9b3c2a51405729857b99429f910de4fd993092b037a8270bbedcc5168f821167a256e4 Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb97f3ed7829ec1c4b6d22646252e19a267df9b0100f47f6a376c9b9d9c35a446d1eb7b12fe7f6d6e659d9c83c3c9b3c2a3878d585b4501ae07e88d18b5ebb87b028347a4dd9a4624b849ab5b9bf18daf8 Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb41ca8e7f448450d7c6ff6b7e61e0a4fba8f40c2944183f9c7c8a46bc7eb2d468aa5fb1cd9739320e6a60909994fb459b5515c49b1eb4a33015aa908886ec3bd26b57ad9158dbac9a8ede364fb763f5c2 Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb41ca8e7f448450d7c6ff6b7e61e0a4fba8f40c2944183f9c7c8a46bc7eb2d468aa5fb1cd9739320e6a60909994fb459b06287932b21dbe518b9cb87a6147cbddfc72ec35f96ddf262271267bcfff1bdd Kdf = KDF2(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9378fd44585fabeac1d9f2941fa7fd229d2353130ecf210c7926c388c5e1e5438b3c6ba20f7551ef03d769e0d1c04587983fa4707e64dbe643d21f3a98267a3f5f14e7f3 Kdf = KDF2(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9378fd44585fabeac1d9f2941fa7fd229d2353130ecf210c7926c388c5e1e5438b3c6ba20f7551ef03d769e0d1c0458758b34c3789b3a3200b293ada094ea99522362b81 Kdf = KDF2(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbc220747adc100278b830f636b942d0daf1651e218ea592e01cd5a4a4234974a61b4a71ff4d1f19a5892d417fab9c21898ec74ba98720d2c72422e9214a68a9f4065d2a73 Kdf = KDF2(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbc220747adc100278b830f636b942d0daf1651e218ea592e01cd5a4a4234974a61b4a71ff4d1f19a5892d417fab9c2189cb14a54612e3a980d73c1e0ad972deb25753eb75 Kdf = KDF2(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb7c5f222b4215cd1b1c197fe8cfa2a252ad4c61a599ade3c8e8d0442b93afc626405fbe7bb1d103bdd8ce9468071a013fa0beb8264a28536dd671864fa73bf1d4 Kdf = KDF2(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbe0004a18072d33b7a7ac09362953dec57197a78ccdac0f1aa98d2a2eb6580a48053b0df23dfe2518253813dc1d1e6651825183042643dcaf2dc69700e29396d8 Kdf = KDF2(SHA-256) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb97f3ed7829ec1c4b6d22646252e19a267df9b0100f47f6a376c9b9d9c35a446d1eb7b12fe7f6d6e659d9c83c3c9b3c2a203a3d53a802d02c1be57381a72fa28c Kdf = KDF2(SHA-256) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb41ca8e7f448450d7c6ff6b7e61e0a4fba8f40c2944183f9c7c8a46bc7eb2d468aa5fb1cd9739320e6a60909994fb459bee03ba55e204037119a97f02f1a8cb9b Kdf = KDF2(SHA-1) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9378fd44585fabeac1d9f2941fa7fd229d2353130ecf210c7926c388c5e1e5438b3c6ba20f7551ef03d769e0d1c04587d25c8b9b56026ae8187f6c667c3bf57b Kdf = KDF2(SHA-1) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbc220747adc100278b830f636b942d0daf1651e218ea592e01cd5a4a4234974a61b4a71ff4d1f19a5892d417fab9c2189abcc03fbf5fdaa8d101408b13fe9cea3 ####### KDF1-18033 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbd02e423bcbfd01b23c12d332dbd5f4748de89e038bc0841f254509c4119eb62d80013e6b6ea63ef00904494377677137449fbbe79ebe11c57a32e88d7b44ced4614eef8a4f1c8f061f1f60413af7ed6eddd9120d650ac9fd8216b12a6af8f1594ab117fd3536f2a44f70654330809ddc Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbd02e423bcbfd01b23c12d332dbd5f4748de89e038bc0841f254509c4119eb62d80013e6b6ea63ef009044943776771378743bfaff20afd91f48a78f4af831e42335aff26ffa98c1bf74ef0e1437b6eba839de9dfca32869fa021fe19dbabbd1d6d3da10b1e4f434bf760da236666b10d Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbd02e423bcbfd01b23c12d332dbd5f4748de89e038bc0841f254509c4119eb62d80013e6b6ea63ef00904494377677137edf4f8a39d3d8c791b3945f242ef5f321ea69a270bc6c2b24a55f3e65b67db24b7e9a8a270eb3f175b49461982a2c2d53b48fd296818f696454d13c10c7b1cc6 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb8ab1751efd5cda04c715d94f0dc7f21058ddd90215a6dbb5f3029121c80ce39692acef02ecc5e5deb71352b45682de7ada1f4ec465be2f5fbe25776c3c03baa2c62cc3b44fa762798f3efb687a5281b7063fa71fdfc483e53dc0bfabe2853510fecb29b110b75d2292567eab1c86cb24 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb8ab1751efd5cda04c715d94f0dc7f21058ddd90215a6dbb5f3029121c80ce39692acef02ecc5e5deb71352b45682de7aeba22adf488a429ce9bff1b51a916e917fb39d0a4719a6d3eadbfa1f5dbf93ada69056d0ba459693c9329446ceed6ab09bbd73a4651faa9107f56d132dd62072 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb8ab1751efd5cda04c715d94f0dc7f21058ddd90215a6dbb5f3029121c80ce39692acef02ecc5e5deb71352b45682de7a21a5db0631ab9bf0f14e60f819a5bc7d2559531bce85fc466d9fdf6f3ce9cadaa60b5f833dc881deb143630b7e8a267a16144d926038ec3c2359b0f092935d22 Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb20faa6b9b8e36197a44df7ee04a6eb517621c0c25b54004b8c18da9d307743e2f75e0a106b1cd8d275ed146f0ea2d66342511e50f37a91ad3eb5efce92a858a95458a9484f9a9c939bc8ab8a028bbf22 Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb20faa6b9b8e36197a44df7ee04a6eb517621c0c25b54004b8c18da9d307743e2f75e0a106b1cd8d275ed146f0ea2d66355baba71e14d2826cf99292581db0e3f6356280965ebfa456093b75a50089f7c Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb20faa6b9b8e36197a44df7ee04a6eb517621c0c25b54004b8c18da9d307743e2f75e0a106b1cd8d275ed146f0ea2d663fa3df2c346fec36f0181aafdde052872c021aeae057298c72068ea9271d19a30 Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb5905e1af473bff629d6559e6dfae76dd176135417ec1f8bd56da34e604f3cba3edfe626868e6a6f5706454cc808394ae979dbb099676e3e61f12de47d87eb2c68101edce237b18b3ba41eca6c8d4a2c6 Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb5905e1af473bff629d6559e6dfae76dd176135417ec1f8bd56da34e604f3cba3edfe626868e6a6f5706454cc808394ae08f8d798a81ef521ab83d5d63127c8df21bbeb596ca63fe3789c28091805f8eb Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb5905e1af473bff629d6559e6dfae76dd176135417ec1f8bd56da34e604f3cba3edfe626868e6a6f5706454cc808394aeed35c9fcb24b2a440873264c97aadc860dc89e8b95a4e644c5ac2bb5f19c2c5e Kdf = KDF1-18033(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb780aefcb510dadc91fb23e93c1dc3ab67515904c394001d13c57cc4e8f14120d8b5d102f8a0af143ac4ae59d8358714e71a4b9ae7881296a1f8e4fd7695a9cdc00613360 Kdf = KDF1-18033(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb780aefcb510dadc91fb23e93c1dc3ab67515904c394001d13c57cc4e8f14120d8b5d102f8a0af143ac4ae59d8358714e666ffa3f0881093199f6ab5e1f2bca9658b29114 Kdf = KDF1-18033(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 20 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb79d5d8fcd4cec89c61a875f1f44b76f2c6561450ec419bce39d5c18a83174866408ddcc61780820295438b12371cb6b77aa52d217e6b8f9bc0c940eee9f18827bfc42958 Kdf = KDF1-18033(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 16 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb79d5d8fcd4cec89c61a875f1f44b76f2c6561450ec419bce39d5c18a83174866408ddcc61780820295438b12371cb6b76f5a4cb193769a1cc3cabac1ef709ad5cd903113 Kdf = KDF1-18033(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb8ab1751efd5cda04c715d94f0dc7f21058ddd90215a6dbb5f3029121c80ce39692acef02ecc5e5deb71352b45682de7a0b65f9aea49d094a71b64333211e3349 Kdf = KDF1-18033(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbd02e423bcbfd01b23c12d332dbd5f4748de89e038bc0841f254509c4119eb62d80013e6b6ea63ef00904494377677137c1b3b063d80fea08ce2cb5d846b4d6bc Kdf = KDF1-18033(SHA-256) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb5905e1af473bff629d6559e6dfae76dd176135417ec1f8bd56da34e604f3cba3edfe626868e6a6f5706454cc808394aef9fe22486b2f76c889d1d4d4903128f2 Kdf = KDF1-18033(SHA-256) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb20faa6b9b8e36197a44df7ee04a6eb517621c0c25b54004b8c18da9d307743e2f75e0a106b1cd8d275ed146f0ea2d6635d54b68cd4f7e34845f8a658b2a1cc80 Kdf = KDF1-18033(SHA-1) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb79d5d8fcd4cec89c61a875f1f44b76f2c6561450ec419bce39d5c18a83174866408ddcc61780820295438b12371cb6b7846bbcb1320b46d3857d683c68754868 Kdf = KDF1-18033(SHA-1) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb780aefcb510dadc91fb23e93c1dc3ab67515904c394001d13c57cc4e8f14120d8b5d102f8a0af143ac4ae59d8358714e63cd5edcce32a71dfa645223fdc8249d ########### Stream mode (XOR enc/dec) ########### [XOR] #public static void main(String[] args) throws InvalidCipherTextException { # BigInteger g = new BigInteger( "2", 10 ); # BigInteger p = new BigInteger( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A0879" # + "8E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" # + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" # + "83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" # + "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA0510" # + "15728E5A8AACAA68FFFFFFFFFFFFFFFF", 16 ); # # DHParameters dhParams = new DHParameters( p, g ); # # // alice priv key # BigInteger xAlice = new BigInteger( "A01E167DE1013D6859E6CB068B7BF272C1D49DC764AD7676BFA0D85177", 16 ); # DHPrivateKeyParameters alicePriv = new DHPrivateKeyParameters( xAlice, dhParams ); # # // alice pub key # BigInteger yAlice = g.modPow(xAlice, p); # DHPublicKeyParameters alicePub = new DHPublicKeyParameters( yAlice, dhParams ); # # // bob priv key # BigInteger xBob = new BigInteger( "8DD88BDC19AC1403A3FC3A0FC63D360F1062E3494177DC27F7EBCBD4A7", 16 ); # # // bob pub key # BigInteger yBob = g.modPow(xBob, p); # DHPublicKeyParameters bobPub = new DHPublicKeyParameters( yBob, dhParams ); # # // DLIES # byte[] d = new byte[ 0 ]; // the derivation parameter for the KDF function # byte[] e = new byte[ 0 ]; // the encoding parameter for the KDF function # int macKeySize = 160; # int cipherKeySize = 256; # byte[] iv = new byte[ 16 ]; # CipherParameters cipherParams = new ParametersWithIV( new IESWithCipherParameters( d, e, macKeySize, cipherKeySize ), iv ); # # IESEngine dlies = # new IESEngine( new DHBasicAgreement(), new KDF2BytesGenerator( new SHA256Digest() ), new HMac( new SHA256Digest() ) ); # dlies.init( true, alicePriv, bobPub, cipherParams ); # # byte[] message = Hex.decode( "00" ); # byte[] result = dlies.processBlock( message, 0, message.length ); # # byte[] ephPublicKey = alicePub.getY().toByteArray(); # byte[] out = Arrays.concatenate( ephPublicKey, result ); # # System.out.println( Hex.toHexString( out ) ); # } ####### KDF2 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9b311515aa49918497c0c52f8c09e2cf6b3bc0343131a552b3d72ec4ee73f9628310a5d278a69c52f5a76c68031365e2504ef4abfa6e105f359e6d57c60a5beaf94a156544baba53139a3e90dd6218e504e58e1c8992df4565e68ec611c286bd Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9b311515aa49918497c0c52f8c09e2cf6b3bc0343131a552b3d72ec4ee73f962baa771f5b54bef678412dfd3ea7380a42014b50aec4cc55d841b2ae20a168b3d5e51da011736d60e6ad446adc72f60e41f7f25c9d2e76badc473c110b7fc67b8 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 20 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9b311515aa49918497c0c52f8c09e2cf6b3bc0343131a552b3d72ec4ee73f96262aa912053ba6ece87a75b8e2c1cf4fc49c5b03f7c433feaf8386ccc44e48375dc7d2a6fa59403a0e44fc268e7fb88eaa9faa66f120ca4f133631f5aace793e1 Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbfdeb30b4378e3a6583da338d50cc23086dc8c3b33bc8e6d5612a44a2e1f0c5cbb8dbdb9d5c1e326f78df5beb66336ce5d95cd9f7cf349218874524519c2b5977 Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 20 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbfdeb30b4378e3a6583da338d50cc23086dc8c3b33bc8e6d5612a44a2e1f0c5cbf1a5cfd4cf6a4a507d8151956d5573f94713d848517c37657f9d278b0c1f927e Kdf = KDF2(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 16 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbfdeb30b4378e3a6583da338d50cc23086dc8c3b33bc8e6d5612a44a2e1f0c5cb0bdbd16fedfb41e28e6e52c6fc073a7f51d2951976602430a4788d9dcf94f40e Kdf = KDF2(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 20 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb070d66995d816ed81c1877398dbc56744848d0af4b63c374925eeeab5d99f55c3efe5a434f886c377d175a52798bc6edbb968932 Kdf = KDF2(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 16 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb070d66995d816ed81c1877398dbc56744848d0af4b63c374925eeeab5d99f55cda95ccfde6fdb8159f286781e3abb3b0d8252f7d Kdf = KDF2(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb9b311515aa49918497c0c52f8c09e2cf6b3bc0343131a552b3d72ec4ee73f9626e83627fdb17b36f71a61d52eb663564 Kdf = KDF2(SHA-256) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fbfdeb30b4378e3a6583da338d50cc23086dc8c3b33bc8e6d5612a44a2e1f0c5cbe4f06420b4e196e8d31a1667b2b50355 Kdf = KDF2(SHA-1) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb070d66995d816ed81c1877398dbc56744848d0af4b63c374925eeeab5d99f55cdeb9fc82441056058543f4240b7e5ebf ####### KDF1-18033 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb068191059703df1b4b140329d94c796cd2e90d295c13bbdf475e08373bc7a22aec8bda0985f4cda3c620e9a2bfa0767d8ecfc5179cfe11c19672b1bef866e374a14a7ab51e90bbeaac8913d1b650e2addabe7f64debc1fb3a8110e6e58050817 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb068191059703df1b4b140329d94c796cd2e90d295c13bbdf475e08373bc7a22a43de2dfe50e0fb98b3e06e6df77d84eac49ac9f273b4c5a64ce5656f706a8df07e6ca7a88d26a28f3d4df96ae5b1146fa2709a87e70659bcf1ef9d0d531ba167 Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 20 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb068191059703df1b4b140329d94c796cd2e90d295c13bbdf475e08373bc7a22a48f09818c5b240b402b40f080b9fd0f8103490c6592f8e56ae20ad10662f13415ada188324cb478888bab0b267ae5c05ba8acd20adc24beae6042b2d37541a77 Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb536ba065e41dad66225d9469433a5dc53362280c1979818a3349c170060c3ace16137afc5f0642407ba3db6717c739bfff83d3195da75b6c7a82f78169742573 Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 20 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb536ba065e41dad66225d9469433a5dc53362280c1979818a3349c170060c3acef0d102d22c4291474cd83749e499c1c65d179f1ec0cd27a3c995317597a135cc Kdf = KDF1-18033(SHA-256) Mac = HMAC(SHA-256) MacKeyLen = 16 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb536ba065e41dad66225d9469433a5dc53362280c1979818a3349c170060c3ace166abeaf1fa00a4815e47011090e272206df8c8f6362869c04eb0e704b625a87 Kdf = KDF1-18033(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 20 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb96e324a74d5941d71563b32059bba36cd6990ee07690fd5ac201f81e2091835b9e0d6e486f279855a6b4e4855bd12e030367e698 Kdf = KDF1-18033(SHA-1) Mac = HMAC(SHA-1) MacKeyLen = 16 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb96e324a74d5941d71563b32059bba36cd6990ee07690fd5ac201f81e2091835b30500fea11b5dfc1b60b691f3326c4d109970142 Kdf = KDF1-18033(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb068191059703df1b4b140329d94c796cd2e90d295c13bbdf475e08373bc7a22a6cfc28a4b15599d72666d18cb8a65e19 Kdf = KDF1-18033(SHA-256) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb536ba065e41dad66225d9469433a5dc53362280c1979818a3349c170060c3aceb5f786c722ea79e5c262c8b8b8f0f2f5 Kdf = KDF1-18033(SHA-1) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57dfafa0d81ac3aaca2570ad13cccd127239f4ee04843bb738234588f0daea53ccd8af65a5a00ed19fbb6f2eb57779ff2e38e3d5d27986253a1193dabf14d2402e1a33527866fa21f23f7abbee5f454aad762fc90139c8377bf6cc77af7f982404baea5ca4831dd8ed28babf2d43b1f65eff42167b82f020dfd4928d8e96dcb7845ecf8f560fbbf5646fae5bc4eda6d978e5fb333843a1f4525cfbdde756842a1e353f4de1503738eec6c9d901a78cdefedf8daaa49631da674b44cab2193c778bf29766730a656b42e96f84698f77913c718067048263034cf2a2f34572ab662e4b1c5b04cd71183433c591abd5613820544d46f7462bea57e44f23ab06e0fb96e324a74d5941d71563b32059bba36cd6990ee07690fd5ac201f81e2091835b29651165a98cf6ea7f18f6638151094a ########################### Test vectors created with botan for AES-GCM tests ########################### [AES-256/GCM] Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB142440A4B10508DB7E61E326B749F1B332A624C5DDF9E989A5D3A1FEC6FC5651A4FFBBC673A52C0B440DEFB8B3EEBB828A46DF1737A3E8DA67A3840041994D34C78D552A09423A4301F513CFF526D476C16C09D0C0F9D978B64A6AF8F883EBE704B412C72C91CE93B9DF82721ACFA6F3 Kdf = KDF2(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB72CE0E99275D750433D9D8115E9F4FF5A91A341E1A3E73F64D8DBE1BFEC7FFA1D2CD8DEF2C0664017A337303455BCF37D076564864E0733DF29D910E8BF0308DCA81A064FEE96811A34B4D0E4BBA45BED459E7BE4FCA58918633F2C6CC34871759BE982DC459AB39F989E42113E0F0A2 Kdf = KDF2(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB142440A4B10508DB7E61E326B749F1B332A624C5DDF9E989A5D3A1FEC6FC5651A4FFBBC673A52C0B440DEFB8B3EEBB82EAB5098B4E55338B28863B299D77FD6E Kdf = KDF2(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB72CE0E99275D750433D9D8115E9F4FF5A91A341E1A3E73F64D8DBE1BFEC7FFA1D2CD8DEF2C0664017A337303455BCF37845E0B4A59D925366D35D40C344FE6BD Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB9A0B0CAB5C285FB0CB1F788213B6B82A2C2E485C1D514BAEF7FC241D57DB031D9E80361C55B562232759A660C89E0DE0E11BB8C807142C1C98C07C9BD08BFC7A3D9977133AD07DDED60728B46D668444A74BC001CFBFB8E8FE0BACF6A4078DD4212DC7CDC3291CB3F02AC0B7CDF6E65D Kdf = KDF1-18033(SHA-512) Mac = HMAC(SHA-512) MacKeyLen = 64 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB7177BE14E602FEB0274B170E41879977CA357CD99EC7FF096964C0FE4AA7D39DC90D24DC433C695D3B2B4A7B88BF08B2099F5321322A66A5377C14FF3F7FF6C96FC72DA82DADAB8064248F0751EAEFC62ADFD4FA782D11EA953FA2FE924FFD7CB7310531D2A9A0091F23E0E195DAAB3E Kdf = KDF1-18033(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00000000000000000000000000000000 X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB7177BE14E602FEB0274B170E41879977CA357CD99EC7FF096964C0FE4AA7D39DC90D24DC433C695D3B2B4A7B88BF08B299019BFDC4ABE7BBED415937E9F58B9D Kdf = KDF1-18033(SHA-512) Mac = CMAC(AES-256) MacKeyLen = 32 Group = modp/ietf/2048 IV = 00112233445566778899aabbccddeeff X1 = 4316760088048858173826993660634587631078362099236037980378049883427191 X2 = 3824157470039532100357278938102046076290169354062923298804711018976423 Msg = 75dad921764736e389c4224daf7b278ec291e682044742e2e9c7a025b54dd62f Ciphertext = 57DFAFA0D81AC3AACA2570AD13CCCD127239F4EE04843BB738234588F0DAEA53CCD8AF65A5A00ED19FBB6F2EB57779FF2E38E3D5D27986253A1193DABF14D2402E1A33527866FA21F23F7ABBEE5F454AAD762FC90139C8377BF6CC77AF7F982404BAEA5CA4831DD8ED28BABF2D43B1F65EFF42167B82F020DFD4928D8E96DCB7845ECF8F560FBBF5646FAE5BC4EDA6D978E5FB333843A1F4525CFBDDE756842A1E353F4DE1503738EEC6C9D901A78CDEFEDF8DAAA49631DA674B44CAB2193C778BF29766730A656B42E96F84698F77913C718067048263034CF2A2F34572AB662E4B1C5B04CD71183433C591ABD5613820544D46F7462BEA57E44F23AB06E0FB9A0B0CAB5C285FB0CB1F788213B6B82A2C2E485C1D514BAEF7FC241D57DB031D9E80361C55B562232759A660C89E0DE0FB884998AEFEF7CE84F114928423F7E2 botan-2.4.0/src/tests/data/pubkey/dsa_prob.vec000066400000000000000000005356151322470703100212670ustar00rootroot00000000000000 # Derived from NIST CAVS file 11.2 (Generated on Tue Aug 16 11:21:08 2011) # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3dsatestvectors.zip # "SigGen" information for "dsa2_values" # [mod = L=1024, N=160, SHA-1] Hash = SHA-1 P = 0xa8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283 Q = 0xf85f0f83ac4df7ea0cdf8f469bfeeaea14156495 G = 0x2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33 Msg = 3b46736d559bd4e0c2c1b2553a33ad3c6cf23cac998d3d0c0e8fa4b19bca06f2f386db2dcff9dca4f40ad8f561ffc308b46c5f31a7735b5fa7e0f9e6cb512e63d7eea05538d66a75cd0d4234b5ccf6c1715ccaaf9cdc0a2228135f716ee9bdee7fc13ec27a03a6d11c5c5b3685f51900b1337153bc6c4e8f52920c33fa37f4e7 X = 0xc53eae6d45323164c7d07af5715703744a63fc3a Nonce = 98cbcc4969d845e2461b5f66383dd503712bbcfa Signature = 50ed0e810e3f1c7cb6ac62332058448bd8b284c0c6aded17216b46b7e4b6f2a97c1ad7cc3da83fde Msg = d2bcb53b044b3e2e4b61ba2f91c0995fb83a6a97525e66441a3b489d9594238bc740bdeea0f718a769c977e2de003877b5d7dc25b182ae533db33e78f2c3ff0645f2137abc137d4e7d93ccf24f60b18a820bc07c7b4b5fe08b4f9e7d21b256c18f3b9d49acc4f93e2ce6f3754c7807757d2e1176042612cb32fc3f4f70700e25 X = 0xe65131d73470f6ad2e5878bdc9bef536faf78831 Nonce = 87256a64e98cf5be1034ecfa766f9d25d1ac7ceb Signature = a26c00b5750a2d27fe7435b93476b35438b4d8ab61c9bfcb2938755afa7dad1d1e07c6288617bf70 Msg = d5431e6b16fdae31481742bd394758beb8e24f31947e19b7ea7b458521882270c1f43192aa050f4485145af8f3f9c5142d68b85018d2ec9cb7a37ba12ed23e73b95fd680fba3c61265e9f5a0a027d70fad0c8aa08a3cbfbe99018d0045386173e5fae225faebe0cef5dd45910f400a86c2be4e15252a16de4120a267be2b594d X = 0x20bcabc6d9347a6e79b8e498c60c44a19c73258c Nonce = 7d9bcfc9225432de9860f605a38d389e291ca750 Signature = 3f0a4ad32f0816821b8affb518e9b599f35d57c2ea06638f2b2fc9d1dfe99c2a492806b497e2b0ea Msg = 85662b697550e4915c29e338b624b912845d6d1a920d9e4c1604dd47d692bc7c0ffb95ae614e852bebaf1573758ad01c713cac0b476e2f121745a3cfeeffb2441ff6abfb9bbeb98aa634ca6ff541947dcc9927659d44f95c5ff9170fdc3c86473cb601ba31b487fe5936bac5d9c632cbcc3db06246ba01c55a038d797fe3f6c3 X = 0x52d1fbe687aa0702a51a5bf9566bd51bd569424c Nonce = 960c211891c090d05454646ebac1bfe1f381e82b Signature = 3bc29dee96957050ba438d1b3e17b02c1725d2290af879cf846c434e08fb6c63782f4d03e0d88865 Msg = 87b6e75b9f8e99c4dd62adb693dd5890edff1bd0028f4ef849df0f1d2ce6b181fc3a55aea6d0a1f0aecab8ed9e248a00e96be794a7cfba1246efb710ef4b37471cef0a1bcf55cebc8d5ad071612bd237efedd5102362db07a1e2c7a6f15e09fe64ba42b60a2628d869ae05ef611fe38d9ce15eeec9bb3decc8dc17809f3b6e95 X = 0xc86a54ec5c4ec63d7332cf43ddb082a34ed6d5f5 Nonce = 6c445cee68042553fbe63be61be4ddb99d8134af Signature = 637e07a5770f3dc65e4506c68c770e5ef6b8ced37dfc6f83e24f09745e01d3f7ae0ed1474e811d47 Msg = 2259eead2d6bbc76d49213ea0dc8b7350a97699f22341044c3940782364ac9ea683179a438a5ea45998df97c2972dae03851f5be23fa9f04182e79ddb2b56dc8652393ecb27f3f3b7c8a8d761a86b3b8f4d41a07b4be7d02fddefc42b928124a5a45b9f4609042209b3a7f585bd514cc39c00effcc42c7fe70fa83edf8a32bf4 X = 0xaee6f213b9903c8069387e64729a08999e5baf65 Nonce = e1704bae025942e2e63c6d76bab88da79640073a Signature = 83366ba3fed93dfb38d541203ecbf81c363998e21fe299c36a1332f23bf2e10a6c6a4e0d3cdd2bf4 Msg = 219e8df5bf881590430ece608250f7670dc56537249302429e28ecfeb9ceaaa54910a69490f765f3df82e8b01cd7d76e561d0f6ce226ef3cf752cada6febdc5bf00d67947f92d420516b9e37c96c8f1f2da0b075097c3bda758a8d91bd2ebe9c75cf147f254c256963b33b67d02b6aa09e7d7465d038e50195ece4189b41e768 X = 0x699f1c07aa458c6786e770b40197235fe49cf21a Nonce = 5bbb795bfa5fa72191fed3434a08741410367491 Signature = 579761039ae0ddb81106bf4968e320083bbcb947503ea15dbac9dedeba917fa8e9f386b93aa30353 Msg = 2da79d067885eb3ccf5e293ae3b1d8225322203abb5adfde3b0f53bbe24c4fe001541e1183d870a997f1f9460100b5d711923180154345287a0214cf1cac37b7a47dfbb2a0e8ce4916f94ebd6fa54e315b7a8eb5b63cd954c5ba05c1bf7e33a4e8a151f32d2877b01729c1ad0e7c01bb8ae723c995183803e45636520ea38ca1 X = 0xd6e08c20c82949ddba93ea81eb2fea8c595894dc Nonce = 6d72c30d4430959800740f2770651095d0c181c2 Signature = 5dd90d69add67a5fae138eec1aaff0229aa4afc447f39c4db2387f10762f45b80dfd027906d7ef04 Msg = ba30d85be357e7fb29f8a07e1f127baaa24b2ee027f64cb5efeec6aaeabcc7345c5d556ebf4bdc7a61c77c7b7ea43c73babc18f7b4807722da239e45ddf249849cbbfe3507112ebf87d7ef560c2e7d391ed8424f8710cea41685143e3006f81b68fbb4d5f9644c7cd10f7092ef2439b8d18c0df655e00289372a4166385d640c X = 0x50018482864c1864e9db1f04bde8dbfd3875c76d Nonce = df3a9348f37b5d2d4c9176db266ae388f1fa7e0f Signature = 448434b214eee38bde080f8ec433e8d19b3ddf0d0c02e881b777923fe0ea674f2621298e00199d5f Msg = 83499efb06bb7ff02ffb46c278a5e92630ac5bc3f9e53dd2e78ff15e368c7e31aad77cf771f35fa02d0b5f135208a4afdd867bb2ec26ea2e7dd64cdef237508a38b27f39d8b22d45cac5a68a90b6ea76058645f6356a9344d36f00ec6652eaa4e9bae7b694f9f1fc8c6c5e86fadc7b27a219b5c1b2ae80a725e5f61165fe2edc X = 0xae56f66b0a9405b9cca54c60ec4a3bb5f8be7c3f Nonce = 8857ff301ad0169d164fa269977a116e070bac17 Signature = 8c2fab489c34672140415d41a65cef1e70192e233df86a9e2efe944a1c7ea9c30cac331d00599a0e Msg = f23ee79eb4fce5cbf3b08d65a1803d2e3e191d3580a44d177d8ff069f90784d012ca5746e6dd6638dfe8413f1db3d8fe282c2160f5dd96607dd63d610f791dfc10abad18721587101cec8a2a12913cfbada3a5b7593958b9bfa6e9af3af5d71ff17ec72aaaeecaaffc5d174e629a090297e94cdfe988d9bf6c80827c23df5137 X = 0xa62079b4f45772bf17b85d7560e3be4e521439eb Nonce = c01acd36910f2f2bff608386b81c35a0a7c0b378 Signature = 8d388ec7f2863dd5b7c99ac93505d1580bf2e0c776ae9317696d37f2d8bd61c47733e9455b61d347 Msg = 6836255e6e659de4ffb535892d466a3bea09693e587eb5bd50f44f8a22f11697057d68660bc6562400d587baac1c19d330ff794a70df5300a5211c72541a56d0ff2af02a278ed2db1df94ccb2026d3138b2d924245021ee835d3c17b0b3b7677def85611227f6ce2913e7cb446a479b95acfd0105c25e4656fbc56c2a10a22b3 X = 0x7861e82e66b6caea54b159c59c887ec27b2e915f Nonce = 4e22cfa2e8ca2b33a9fd91ff4837fc205864e8b1 Signature = c0ab43d309a5e94b6ef4db9943306e6d966fc9b507ec5aa1928f19fc3a420f29b935bac46124c0e2 Msg = 4b0845c99db348294f1d83166b27f448ec29ab7965464477f45444f44672a409ddcafaf35e91faf401eca7498e3268caa2d96bf1aa840c0e1ed43a5ab60888fcf02b2f8a2c89daa598adf0b7d2dace9210efd41ab496a1e73a182da430c1d043e249a1289c91809c8c7298cfdbb0ae438b00936c283a0ec2d79cdc81c9ce3c2d X = 0x6f2d3b09fae6910dd975870db3a2c19d97169491 Nonce = 8588557c12ec6fe176b0be7bbd8b482ad78f1fef Signature = 44286019c1d53103980616940c028bad3217f78d4b372bf527c515f58025699a45f2021ef18e11b9 Msg = 4597c1ca0b0764be31fa73ccc589116cc8d0a31605f2550eb37fa569b2496c4f34321d61bb8e49f858c8671b7437fc15f269dd2d4146470b817dfe3069225ddd3cd4a6c977fb6cfc0d43264a7bf6659283e140e4c89ab2e8a4d0ede6274961d655bd79c7e47880a741fb0180c325b5b7d2f7b8a57aed52d0206a83bb69a9d7a4 X = 0x49f6c1ac8e639bcc99b2d9d1f1e325713f29b97c Nonce = 8ef1c5976ac8caf74df65d9ecdbe78a6490bc220 Signature = 90d547712bc0cebbd3ebd18a63d9b92a0395305034ea6176b4c63043295f129a4895e14ee5816563 Msg = 18c62a40b52347a473f57aa668eebb4484beb5f10fdc51779e6770106c0d122eb6356ae53a3379e270edca39015da3005770c7b2a5afd11217993153ff43a0b26db01aa2a493de061492a0aa3f229b5abd1aff29395e31b063504eb35620219ba29997f92a52e1b2e6ff207480fd13d58ff0290eec5aabf23b84943eea20a43c X = 0x396cbe3e71d74f6db795c38d49c32d78eab03397 Nonce = 04bfe51616f5c244d2e01648362f5bbe5fa73501 Signature = 29b7c0f90d624f8d587efd3f49f97da70f6e63e7222a3d9ffca0dcf57937e89c92538e32e7a8680f # [mod = L=1024, N=160, SHA-224] Hash = SHA-224 P = 0x8b9b32f5ba38faad5e0d506eb555540d0d7963195558ca308b7466228d92a17b3b14b8e0ab77a9f3b2959a09848aa69f8df92cd9e9edef0adf792ce77bfceccadd9352700ca5faecf181fa0c326db1d6e5d352458011e51bd3248f4e3bd7c820d7e0a81932aca1eba390175e53eada197223674e3900263e90f72d94e7447bff Q = 0xbc550e965647fb3a20f245ec8475624abbb26edd G = 0x11333a931fba503487777376859fdc12f7c687b0948ae889d287f1b7a712ad220ae4f1ce379d0dbb5c9abf419621f005fc123c327e5055d1850634c36d397e689e111d598c1c3636b940c84f42f436846e8e7fcad9012ceda398720f32fffd1a45ab6136ce417069207ac140675b8f86dd063915ae6f62b0cec729fbd509ac17 Msg = fb2128052509488cad0745ed3e6312850dd96ddaf791f1e624e22a6b9beaa65319c325c78ef59cacba0ccfa722259f24f92c17b77a8f6d8e97c93d880d2d8dbbbedcf6acefa06b0e476ca2013d0394bd90d56c10626ef43cea79d1ef0bc7ac452bf9b9acaef70325e055ac006d34024b32204abea4be5faae0a6d46d365ed0d9 X = 0x6e2e31bbfc670944d7a7120e39a981520614d8a8 Nonce = 8cb35d255505a4c41421e562d10827266aa68663 Signature = afee719e7f848b54349ccc3b4fb26065833a4d8e734efe992256f31325e749bc32a24a1f957b3a1b Msg = 02971e0cdd48ae2331db9c6285e9880e96104fa7a9f378dfea718e63efe98352fe4d35a2bc94b3a888cfb88b8b7d9f6c8c54e48613f32c9946ffe6e9a4b7108ececdda41bc151b3d8724b61f5b83a4e27476914387b0488e41be54f63aa773175eb373a3641e6e7950eee8faf048a841f107d30cf9be268493231545d8984694 X = 0x0b448f49a085a52a03d7f668a1d6fb87f2e221ac Nonce = 4481a4be9db6821e3b0a08c9c82603631971a682 Signature = 92c65e07462d668b06dd45b608784965897838bc2e40adf41cafb8048c793c7092a7e823515b6cfa Msg = 062e82fb43236ee17ebfaa3d363b9b873d0fe41444c74cef7f7e3bd81f723fd90fd148a28e997585413695113757758aa4dd275f70b375f8903c7be46e3a3ad3190cd04971abd2f1db192ef0d2b98bbb80181a721a5809928b5bca5c118a2911132ad233cd27c7e41adfccfeb4e952874bfa819661182975e44d37c61734759c X = 0xa4a25a8bb1c2ba69f9611939b591032b96333fa3 Nonce = a7135820910f041b27321534a17bb1f33ac51aca Signature = ba554124874d06a6cef62740e15821ccddbfe6f35962be757d75b0f17d15482ebb595ca4e9fbfe22 Msg = 4fca074844eae247d19c06e92032ae8e773043e2e1f45d400e9dcebbde5d65e7c1423b0390161991c026f38a0e2bfeef40dae18741737b1d535ab46b566a1b672fc22dec86747a7c7638fa65047f1ede36ad43f6aedf51b5bf2979adf4d9a94ed802a29de5603b704770b32c8b946a32e1b6054cd70c3add025cc9371d1e404d X = 0x1f15cafca282083e82d7e54258647b2914418986 Nonce = 128ab9677c7ade5e1c02a8427650ff054db6390e Signature = 651a389d8ca50d6e3273cabbe71cd84cccd023613401fe47b3812daa8c020c9bd42609cbebdfa728 Msg = 4d9630fe058998ca5b80ae62f3f73dc85bee291509843ac00240d13d55251ae53b37794783b97d53e042cab26f8c84de0a70f5b43051fbefb3e43f08f5d2e8aad9e2de2717412dbb902acc8849adc04d06fed8c1421c4cfe8b81ee7f5ac5d4f0c0b68e80b6f88fd3c7d5b32022572b0a681bd2d4df2d047b0b23b6887145afe1 X = 0x1485f719b8be77c78829baa0d2c322df60174476 Nonce = 8f4cc1254c787ec8cbf54405105f7ef83ffdeee0 Signature = 9ca3e433504c557ba1aac66469781175cdfb4ad572145dfa5279dd82ae99604d16a2b8df71b95320 Msg = 62b9d601e30b42a279c7e04df3ca8d8140a55cd5876c7e9181c73575e4c4f921a94e4e2d0bdd7ba98600d652e5df5be9464e7a9011ab486960f69d57ece1d2c4af9324457c1e3d83fba4265beb47407e4761dbc949d5bd67fee4a476a4d5a93d77acda96a221a0a31e0f024b3f0b8234c015238f3258daa085ae9f4e1aa7b1cc X = 0x43c76a9a00045cdfb2e7927b5c8730e006423c05 Nonce = 5e4b5e4595e31397422c7a4487ae51051289be61 Signature = 331920a7b79e3cfa7638e409d9702aafd08fbec6071d06e6cd301515f37b60690afa219fe5083d96 Msg = 0006e09c20376442e689bf2d34268fd69109c1301ea66cbe90394cc0f41f94822c28845819b9a98764d2f7262e98891487ff55b05bd69e18b7cad41bd98e137566b6041c739db11f78e567cac02f33f140d19a4805002545375daebfd7dcbea33242e73c8e269149d7eb9db9f9006e17acb736b5e977645ab651b81225c5e543 X = 0x16f89d97dd3b31c191495173ae0e145c6ce185d6 Nonce = 475b5aa12ff77d49e4c8171f80d3d1f15147ed12 Signature = b6aa833b825184729af308f81bf5e58e2d7e92845453b4b2e3fc802b2f977d0cf6eb7f5c16673fa3 Msg = e04a71f2b5c176a0db17a983a17dec588c00f42c9aa3026b5eb440f07a2140c2ed84024e0531ea7788dfeaa91883fb6a9841c17dcfd312968adb00e556bc7eb3021f57b7a16894fa4fe12ec93dfd494a0a1c693d6ade154ef648c05552da41224d4922d1861d9f7671b8ce6ce448e895ea0eed25802e3350ec08ae79f2d61e0f X = 0x3eda44e3c38380df7a4f47d8e1024596238bcef1 Nonce = aeaa655b6febfec50b05562c3f358865533e4736 Signature = 14892b1ec7fc716c75a17f7ad2e41ec6faa7883672cc56a9890e8bdf1a53d3acc6f89137264f9ff8 Msg = 5e8eb96b5c6ad75d3dab1e28bb2ce751ecc31611a019e8d4b561c7e4533cc7ab73bd9de931e8c54c51c5711e6c276a8ed92f4bb457ddf28233da2ca3e3013c56e3cd2bc61d4d4e0e22cf6361304e56d68b315ca5d3fcc472a7eef8cca575204dd084a21a99ba67fddbf90df7c6c658761734bce13c3d22d80b6fb9bece551492 X = 0x0b55f99ad958a766eaf5ac20a127a4df1b946bae Nonce = 9e9b9afb43a7157761f6c2011138d2f65ac1cba9 Signature = 7399b120d4bfbd6dc4064d2f3f8f0ca5c362b2d82302d81d7ebb2417eef45d88941b070ecab11cab Msg = da91c692cdb0a59562e2b664dcfe7554ac589d57f82246c4a8a3f9573bf47b257eb8f93447c1ebab13dce53d6f4416fb2c6c36303ed97885cf7a6caef055f7e3145ef3838c31877fad7a8883ffc84ebd973f8c06d17cdd339bb3371f9d3d4f2d9f0b80ae2bcc878b4af78f845eac4f2aacee6a9451daf814a44e927bb5428820 X = 0xac701252c773ba36711b9731afdc077c5d3f9271 Nonce = 6cabf2c0e2890b2b393da3ea6aac2782216efa73 Signature = 6f1579edcf437584d3e939fa5b002eee83e3b61471208a87a4cf2b3a9b65477773b0096d452dae60 Msg = 0f2edc87f4d2942c4693b064a511b93f790c60dc149a1b0b7041af5183bc0f42234134b284270e4c7e53614f7ecfe711de0efb28336d0bb359c86e8be8839f583211e9174832b3d41ee6d21864ac6186fd1db920dda65b25966c5951ab8a2050dda87d1d72e3032852ad43da9fb430e850022b4bb6cc9cb90e428f3a5ca32a62 X = 0x588f40e3eb813cd22a41c9cdeadb6895a348db3c Nonce = 8ac2fe7bcd690a7239d294b22725b818d262a446 Signature = b6ea9cdb211c4560b3d592e93af6d5f133b64b9b6242e45a472fa8147cb5253dbddebae31ef31e4e Msg = d12fc1983e0095e9e2b6b8743fb34386cc4821540e3efe1a29f84cf7e63e2a0668d551f912ad2221b5a3d6b9ebd12136def5e6690e1d32aae919f9f1cf5d24d62a46a9a9a604bae11b9c0866350367204a920b589a317ddfbb877f9fad6b0d3629af9635da46933151c0d9a20aaabddd3df5d049659b2860ddb8b20963261ea0 X = 0x67cd81c7d6ac2d8bd44ef26297ac02ecba41f73f Nonce = 1341e376e8919e01991e5e48b8e0c7255929b3d2 Signature = 360617965f65a68abcb83dbf2d886a1a10ca05de71abb6acbf7e653d2ebc3cb7149b51cc0c92fba8 Msg = 87a6dfb8487f16f6fef1d68bc31469ac210ea55387965bb4458ca0d00d6c46858be28a019ce914c39c2479f321f0252ca4a8bd681a5b358a093fc8341c31bc47c618403f93322b443084ce5818490b74e83c3866b8164bbcf79bf82539f428c9351c40b10d773cbe1cbaa8c9800a6dcf38d85515e2dff5d4f8a965ecaef37e38 X = 0x22bbb8468f3e90768d347cb3492f64db2a23f721 Nonce = 9c609e56c19f74ddc46eb2e2cfe26b1519ff0d1b Signature = 5409cd62f5539306ae8c936082eef932c6505c3907c0ccb30ec90b1481409cbfa2f5de6cfaf1efc5 Msg = a332b38e642bcad8bd271f776fff24a731724a43400c1614f5e21296db04f725eebad28d62e20ca3f7f18328a76b8092d97b632bb78718f0f2f9ecc7c12cc36b505959917b5c54312ad4717be84fa840b9f06de005c792af3e9ea72b7ae2e3423d07c781c9c2553f899554a0d8dec9a285c1ee25160fa278489474a0e4379516 X = 0xbbb1854e9b0942cb5d1eb71e8cc6fc7e0f4cfcb5 Nonce = 336e458fc213c0b2775537ae61decc034ccb1d32 Signature = a16a7308a6824d929b6a9a3bdb280d151a6eed817a42addab7ddb98000286044d9993d5cf818f2b1 Msg = 79b144d50e0047596cf06bfcb3e9ce3959ec4b8cc9ba01434fc3f68f47c868cea048b990e62cd7a50eee288b35ae62aa797924c9dcab76409b869b33de28885e62f17db7a7758973482968b9f960eb2dba84ae85101aa6c6141b3f0839a4185a4c496eae876ecdc45627330d36f01a67cbb7faef834357330aac36c7c6f47ac9 X = 0x754b24ea5c8cb8e88e370074e79cb62605530018 Nonce = 1b50341e94f4498b92cce4d17ab9d4016fb2e074 Signature = 021a3de98c3da698b477b4c3d50b2169e65f5e91afd764318dd0fee04fd6b07f550320789cd9bfa5 # [mod = L=1024, N=160, SHA-256] Hash = SHA-256 P = 0xcba13e533637c37c0e80d9fcd052c1e41a88ac325c4ebe13b7170088d54eef4881f3d35eae47c210385a8485d2423a64da3ffda63a26f92cf5a304f39260384a9b7759d8ac1adc81d3f8bfc5e6cb10efb4e0f75867f4e848d1a338586dd0648feeb163647ffe7176174370540ee8a8f588da8cc143d939f70b114a7f981b8483 Q = 0x95031b8aa71f29d525b773ef8b7c6701ad8a5d99 G = 0x45bcaa443d4cd1602d27aaf84126edc73bd773de6ece15e97e7fef46f13072b7adcaf7b0053cf4706944df8c4568f26c997ee7753000fbe477a37766a4e970ff40008eb900b9de4b5f9ae06e06db6106e78711f3a67feca74dd5bddcdf675ae4014ee9489a42917fbee3bb9f2a24df67512c1c35c97bfbf2308eaacd28368c5c Msg = 812172f09cbae62517804885754125fc6066e9a902f9db2041eeddd7e8da67e4a2e65d0029c45ecacea6002f9540eb1004c883a8f900fd84a98b5c449ac49c56f3a91d8bed3f08f427935fbe437ce46f75cd666a0707265c61a096698dc2f36b28c65ec7b6e475c8b67ddfb444b2ee6a984e9d6d15233e25e44bd8d7924d129d X = 0x2eac4f4196fedb3e651b3b00040184cfd6da2ab4 Nonce = 85976c5610a74959531040a5512b347eac587e48 Signature = 76683a085d6742eadf95a61af75f881276cfd26a3b9da7f9926eaaad0bebd4845c67fcdb64d12453 Msg = c1b1f1472f08df38a52a55ba55827ba3b7cdd6beded904fcd52610c899eda3c61682656873bbfaab0d907495dacf458ea3450afd93be967a37434d412b6325669ad84b4eaa278a24870ecc2df0da13ad526a9e6669958d4e52dbfba2803ae9ae135d0c0acca86a04c42ba9cafb09b7af96347188880b086169ebdf9f1f5f3173 X = 0x1a220585a989ef2c12bbfa9fc0d258713556fe38 Nonce = 8fef50b7121a04a24755b6f3e1cdc93848a9081c Signature = 54ed4efaecdfc78d026471b65cfefc6529945bbf6d6dac296ebde3f873b751c6b14843f0b7befdff Msg = b80a47071d1376fe617e59fdc005a890369a4ca5e678ff46eb9b205d6ec09cbd49373bb341fe7813ee442a6ece17e720bf71a74557ac9a375c059e5535e773a45e79e1bff3465a3886c86e2a2bc882f0beceefffb2ae1a522f13c82def4cfd0cfca6fceeb4cece71869e90cd10d0aff27a84b5601daae061cbeb3aa62b37fd3a X = 0x4247e7e4dc4270fc7680bc05746807c183e0dd98 Nonce = 3aeb3383a3c0f53217c0d7077c3cd66d2ef74a2e Signature = 1fc2d1cb80bf6e0e78b25fac293b752cbff2b5ac75bcc772f773d5fd98dde1f907e7ec2cba201dfb Msg = a9603054465887df15db07c0709a8c878d2f1abdcfc6195eabf3e9b3ad07e8558b99cc4a7aa076daf67e9b7d8480f11e8afb18e2ac56a9547b48453fedca32da9eb0c29271eb60f0a1d95c18f42d992394b3264ff3e21e606e0beac08a7ba71b8e5795a8da985118e432cf5b30b6cd3a603d8b0d580f06c626ee937c6cd05f40 X = 0x4d2a5462ebccc5d19bc6c1cabb609c08ad088e08 Nonce = 36a3cd0101358a4d30c5b7117bc239fb4f6ce2e7 Signature = 48539523815bd8d73ce702367c7712b9b13867f220ff4cfef8a668829feae73b520e8aa4d02c8168 Msg = 19eb088c3229a44f9586f00421cfe7423a486d5f7e28ad2c9119dd2e1395df1acc06cb28e9069cee62f09f48e4ca29269dd89df9fec1ffdf64b1fe2717fe52b1421fcf6c705c0cf39930f90ecb339b51ef95b2ef38a6d96a575f7b36f5edf4f2cbd6d261e1fdd77d4459288c02e68c82a3910ff8ca1747c86bb187d5205f51a8 X = 0x0842ddd5a04161e4579797b5d8eda0002dd847ad Nonce = 712eed73c8d2567809b4d9ec2f59e77d39290b2b Signature = 6bf4f5d3251201059ee85edb99a67a706f37197d3125c5af397759996b876cb5857be2632aaaf3b6 Msg = addb5a045c9f4f4fb9eb5e5db44d6515980c9e088015b68593d8bcbffc6ff57f18865ab824d3d1586425cb5081197e9e01cb7297b06b64103cea437eeeec9c50798679fb869ec306a72575057fd368aeb0f674a29c3ac248b6a08f91331d8456d062025347c12a0a61c61f76e5206fe6ca437735af430dea7cc8f39f1a5b7505 X = 0x1f1cfc682048375915fb483b77037c81c05ed728 Nonce = 703154f6c6e12f163ecad0494897dfcf5657fbe2 Signature = 7cc662e352e0eede85140107a7773ad8663e70bd15c17b9d245872844eaac3d46bb08c3e08597423 Msg = 02709d2be0d9dc1dc0ebc55f630d91fa23609f61b513c2275766034d8f40e819aaf9326c8db37c35c5a17e96bc956df6d11b558d16d91871afc010b3119c5798c2e29411ff4f0d7196e7e476bf0ad03bf72e897fed873c10613dd255d15243870b81cd87d0abc16e140d032fe5bd1c8eeb2f66e04d13d49269fc7da6b65a7c1c X = 0x1d9cf98dc0c1d7bf8dec98962ac6ef6e9406ce76 Nonce = 68ae16534c5f6225fc7ef980f0063de483a76903 Signature = 72b0bcc6defa66fa8bab029676a1c7703f9608f269d911e05acd7be52f2834c0aa005128e7fa85b8 Msg = cc061edb31c34d3981517f4d89afbe980f74185260cf48b3043bc13a144944ad43e0e576d2a58bf589cc021dc1c1d332c4d76896ea77dda197f683e51eed71b4d6df46666a1b142e679b0283cf339e5bca90e2ff9c34dd5fd7cc4917d66704fee4364f7693101dc766707104efb2b933c4848b93e13f94855f75e4fd756cb6e3 X = 0x78ffb40fd89416388804e56444c9a642cb5e98e8 Nonce = 07c6857486160ef4003470411573399fc4e5f7af Signature = 21f512425670943477534e9075ceb5b7d63f20df73c6f6f8de3aaea520a083b2264299e81cfc91c5 Msg = 79d529e40c2ba4e5b9c7d77d72076f1fd9490928ff4419c824e64db8fb9a051e01e8e173c6f214e0e9e645ed250b6daaa6f8c1a5cc900d52cf3e1efbfea25748e89a1a548c73e2d110b25f5308bcf757b2135216c91dca2783332c0d7903eb21c226dbd33a69eef575aa8a41cbbdcd1b3d94928aa8f8ba58c5ce0d317786e87b X = 0x784b9db2d19ef0ca8e696884c7711dc2f8ce150a Nonce = 1bfcf3290fa84652a476655506b145743213e1b4 Signature = 929a4851be0ae4ba91da0e6c7376d71df7592dbb7e6b6504b748ef0024d9d2a2e6f3bcd7cf135ac7 Msg = f5516410706323549b20c52dafa2f2f90799786c0ddb85048892ccc18720dce5c129a10eb4388788a3d97a03b0001799cb65a79c880836bc9f3204ea75a577204dc1e2894c572a258f9e517ca37c5b791e48b27c8dc1c821b34ebb1f29858c4a72a0d5172c565e9dbe1bdddf6e024891cd6291faa81ed565746c61c2eda2011f X = 0x673a384687ef29ebfa66e331866bd206ca2f7664 Nonce = 52ee4510675f0da529684fa60f6848ce63c4689f Signature = 27b3f235e4afc18c6613b4fa7f27d7a8262ba4c08b22634e4d45b71a84eabaa1e5a4bf1e37337a59 Msg = 55bd1526e08f6443b255acd32c286807542d34c0f3d79892713f9d6d6d6b3be707e4af6e71f7dab4a2c5f6bd25f5ae1f514b2644a4cdafcece1e58f7576f82e2ab0af2326c71279e9bcef1e1c54a76fa77ec2b2d056717645764e7991b520b0e5a1b049109519b22aa5204e3ed53b1e0957dab5ec32479d06ac3e11a5d1cbd03 X = 0x495009f3a92548be4c9a562ff703187b0ec2cc86 Nonce = 423308bb414ef959025bf1a4b27db278f904241d Signature = 621a290930ac436737a72fb4c62bf5c4b67481af62db20f82a5754f109f7a2ce581d4c8d71c68d29 Msg = 62789a89f0d708e21a121fc34009af884133681b9d4a66cc36c0365c34be72a4982eb0961ce257f35e6e7183f0204a96a545193001023d3309a8997e7c4b762ab4f4c40e03e13f4edb328b23cf00c09119deb40addf6567b3b74acef5ceff045304d618421e873c41a72d31e451d213b060829b286f64013d4d9342ae7ab8064 X = 0x2b8dd3965992fcffd158a0816a5987f80908b84c Nonce = 58ccff88958d5fc48d671ba22ed71f5f82370ac6 Signature = 89dcbca7c8cd6b90aa906a4c547153762fcfffd623e8926b18cfd4b67c53fac4a2d5321e5c3d880c Msg = 4eafcc6874ae2a6d525738967afb3054357a39670d1e5555d7dc55be24dd5a32a0c7ca3f1b5c6d948c9ce391013abeb47f7e24cd2c54e1fc7c0e92c4ab77f5973a7054bd1c6c845b802b7937d6520508ae018ae14b27ff4b1e340a4b9f6f6b4814d07e90cb8f19b15e915d6ad1834c0f7a3c3e1e45206772a0eec2d3f9160897 X = 0x6b3acee42276bba155156f23dfb7cdf64e4b1ae8 Nonce = 1c48f62bd097d7686879d33ee5771558e453bb3d Signature = 633e9812a0657cec3326aa5415340c46362fcd4b6b201f0c3fd44247f6c28c01d1217eb99146c040 Msg = 86d9892b48f5954101482742c0dafb68dc97122483b9e459f97495cc970e056d2162c7c71db167229fb7f45209e0c01eb06ff924b823eda51a7e990f3c986eb9af2a7a073f754cb84db453a9e8c0ae7fa5c05a2655d261ad7ec5612876fa7df09522e0b69ae92477f63def1992c96ce95ee7bd630ec1614621da6a512ab53dd7 X = 0x836d90fd90d21b84bb012da7b2168ea8f05202cf Nonce = 7956ea15111ff392d6a9359067bfd8c21f0bfc0b Signature = 77b480885c70c1fee2056237d1b79cfd9fb54a1f2283f4c0640ff6daacbdfbbef7224afa59ca3959 Msg = 8b60b9b6ba375448de4f00de51d18706ef8c4f97ba34c9cce2b0abb0698436009d1d2bafcbef73a8b5dff6a3cd5db5258ac84ef724b28d8a62d715da6e111939735366a7c66470364557f546377d5c0e7ea9064731cb7149e1051d66a7bed14aa205bdc5d4b9ca029a1e68a6fa2c1db22d27fb79d83877cfaa6742119229a493 X = 0x5a4ae9f8fc82c9198d9400c51f282493b194a07b Nonce = 662351e9b8c3a607afdf3ee599b46681e27b83c0 Signature = 5d159f894d250db90d7fccd49329e44d1112db4737231bc15195ecb6badb7c3fe80380ff912baeda # [mod = L=1024, N=160, SHA-384] Hash = SHA-384 P = 0xf24a4afc72c7e373a3c30962332fe5405c45930963909418c30792aaf135ddea561e94f24726716b75a18828982e4ce44c1fddcb746487b6b77a9a5a17f868ab50cd621b5bc9da470880b287d7398190a42a5ee22ed8d1ff147e2019810c8298ed68e1ca69d41d555f249e649fb1725ddb075c17b37beff467fdd1609243373f Q = 0xda065a078ddb56ee5d2ad06cafab20820d2c4755 G = 0x47b5591b79043e4e03ca78a0e277c9a21e2a6b543bf4f044104cd9ac93eff8e101bb6031efc8c596d5d2f92e3a3d0f1f74702dd54f77d3cd46c04dee7a5de9f00ad317691fddcefe4a220a2651acae7fcedda92bfcca855db6705e8d864f8192bf6bf860c00f08ad6493ecc1872e0028d5c86d44505db57422515c3825a6f78a Msg = b0dbbf4a421ba5c5b0e52f09629801c113258c252f29898c3354706e39ec5824be523d0e2f8cfe022cd61165301274d5d621a59755f50404d8b802371ce616defa962e3636ae934ec34e4bcf77a16c7eff8cf4cc08a0f4849d6ad4307e9f8df83f24ad16ab46d1a61d2d7d4e21681eb2ae281a1a5f9bca8573a3f5281d308a5a X = 0x649820168eb594f59cd9b28b9aefe8cc106a6c4f Nonce = 33c7ba88ff69707971b25ac344ae4a566e195f99 Signature = 77c4d99f62b3ad7dd1fe6498db45a5da73ce7bde23871a002ae503fdabaa6a84dcc8f38769737f01 Msg = ec84bed09ecb4a6feeec3a7071b65a4c1267a03cac8b5a0500c237b20dc058514da798335a21b23d7e8cbb15efcf92e6060a13fb77f4998147dec1d0fa0edd418b0aae8eb0056fc7d4008b198bd40b969dc10d79e15b2300820323bd5e1b7d894ce8e7bc8f7ceca129b5e511ee1c8caec25514f537353a912a971b8070e3f141 X = 0x952b61ea90df3f788eab61d95be16ca28001800c Nonce = 7982f6b8956c2bc0a2c2d02ecdb9e47d23a7ba81 Signature = b2570e0e19935438d32686c478473a0e45dad02339a02e9803624f7e90feab8714cddc41e01f8fce Msg = 80f757fc06409b70d733efdb68b520f3f9078ab936c4479fb98d0beb1631d8303324470824862224b439bc85decfccb8de8fbf36a2bc4ce3a092688249ab4eb9febfad268245fbd7e72e0f240500af71292ea23c8ad4b71e032106f587f4611663137690cb25241912763c5e1879b3ab67e2187f92d821fc81f552e2c355bd73 X = 0x2a5f637f4b886a3d37c4369cab04d78c79f1a3a8 Nonce = b7c75c380bce0fffd59dfc3993e1d0724da877b6 Signature = c7db4a9f54d882ec5f561705396c94834dd53c5a6752cb6be9b87265d76d69b382299678f96a5faf Msg = 36a25659a7f1de66b4721b48855cdebe98fe6113241b7beddc2691493ed0add0b6a9fbbf9fb870a1bc68a901b932f47ded532f93493b1c081408165807b38efce7acc7dbc216bef74ed59e20973326553cc83779f742e3f469a7278eeb1537dd71cd8f15114d84693c2e6bbf62814a08e82ba71539f4cb4bf08c869d7db9dea9 X = 0xbb318987a043158b97fdbbc2707471a38316ce58 Nonce = 2ff654b680e722ce65a560e785e8ce0b4773c86d Signature = 17cc53b5b9558cc41df946055b8d7e1971be86d7003c21503971c03b5ef4edc804d2f7d33f9ea9cc Msg = 65a3c92453f961de7f576d5a1e3106c38b7f20813994b5dd201546dc455065dde59edcd84d0fa17a85c0f9f99171d67a34475cef4f311951f2eef7f6b64a5bbc6da6d1b622480cde56a07a77aa6040ebc1fcb265b3b624881fd27203dcfe8a12492198474a990cb9f34a1943356fde5bce3fd83516da8bf780f8cb1851b3b954 X = 0x59d92aba23f50ad08b1d7c2ad560ded36b94ebc8 Nonce = 3d0ea569b4dc69342955f5b240af66d228791e50 Signature = 77ffaf4290c41eb089c1d7be5c8d3833027702efcb753a2d4ce0e59851f814779f343beb615f2770 Msg = 1526b64ce41cc8e2cef26f3706be530a36ac9cd16ff69f05773e9447ed9452064b7751f3a64919bfa3a7e1020dfc175a10acfdf096fd41c03372e4d2abd7ba887e0076716ce9552f2c7c8eddb1b3fca1bdcd23300ce2b1677d4a2debeaa7053466e59b098771bfb9218e0fb4ab6b7418abebcc34d681e14c4a8975000d83bb44 X = 0x716290d0ff2ad2329be2cccf825f2075be659743 Nonce = 919d698fe37c027e3e40cdf6e77f81e96d8bfffb Signature = 31abe8e7458ce363a5f3985111b239bc8df8dcb91d967be0116128699d167fc16e5e920a41311669 Msg = d7852ee90b3f1120bb11249808c7e7be14fe577bff1886be3c42589a6eeb06a1834110862b65d26cc5a2e5d903ed24328d684c96e3babb37ae31f96d32f57657a3bd7798aafae86f44ad8981e7cd47d7f31bb4564a757c925c64da9820963c1c5148f589d6393004a6a58aa2c8a578f4db7595f886170e79e9d57bf7ff8fd0a7 X = 0x0531cb42f45bb813f401bd239044df2d3d1968b2 Nonce = 739dbd1f84b6be2efdb921a0dfb76dbc6136915c Signature = 44c2d6509874ace71acd1dcc32335b394c4e41e037e78f13aec052eb7b07a8b9f6d54dbc77829006 Msg = 9ab91448a0dc9694be173ce6d9b522ce0e2f75fcb57720fc5eb8f92d8fb0e195030063968925a568636f4aea1edf6c5fcb86dcedd204539d8c291757fb8a51620abda59aa8f8502e6904bce0667d92c8cb3fcf1a61b1fb0bb4e9383b37eb469bd5c2f5a77680da62f907c2e263cb48402b4b12985eaab90451885e819b3e8c3a X = 0x6d764cf62a268b0070bf80308622bb31941d4763 Nonce = c66ea7177cd6edf6b9079fbcf6737d3890469b19 Signature = 95da25d06ff9c02bc893fb032508304c17ebcf08617adb8de10da1a87413d64466b482409d27bce7 Msg = c9c0e69f840cb6deb984c2575d7f6816fa35af03b4429c703a5aec90e7cb26e52413587f3bc5a0772be7b5e589c9a76071c1739833f4611fa951d375820b48d740626c665534d60487bf3e0a84eb6389e099fe621f269491c3b8942e03bbad2a5220caf51e7b4a2650e4b300024a0a96f0861b3206fffca83d0850f2a3e2a06c X = 0x38a62d234e1aea0e847621e79dd17ee9d08bd9c6 Nonce = 5f5755dce464174adfe00affb55a71222d83da85 Signature = b6b25a9da110b5d57675889eae75ab58a4d8e2815a60c2b0adbea4c5be065bbd0fd0e3ce4bf29200 Msg = 4002de825bb87ac346bd8487cf6be053cb30ee67c66434217107a8b0b52e5726900615edd2fd0acdf88a7e65e7dd3ba6abbbb371a1c840250d9ce809e7b1111f16daf5194211715ff5fe631e378408749848a0c81a289b4338bccd8d1053f863197ad02920fcbca514e2dfd94a8b00f90cf034adfd776f4dcaef2c8dce3b0539 X = 0xc8f0d697bbcbcc0e31864f8319984125f52ff5aa Nonce = b4281920a775fbeefb89615b236217fd1046f2cf Signature = d3cde170d82154ec1bbd9077c486971120600376b008fcd01b5e49a85a921bee1ddd706212799086 Msg = f7018ff0af6776ed4234c1fb9cca1f8cff31295cb9f76d8b73898430097c49a40028441771ea1de08ffd5cec7eaa59e32b3a170329139227ba86e0c5efcaee382bfff962249da853dee418413f201a28fe45b8293c262089d2ceeb9af67529ab011f04f5eeaf82ba32dce9a9821762c3351b00206591a3f87c5260a4263659f0 X = 0x9dbd262da7a529f80aa667b27a29d6a52671fb89 Nonce = 0f0e02596ce6674684e7ec448d2938de12842fe2 Signature = 079b08bc016c543d09d6b276c023347a3aace9ae164c3c380f209feaf8ffcf53691ee3031c3b3fff Msg = 4a18bdcccd46bb89567ceb9c1e2e500a3baed24ff2c5fc7f83cb3cf6a6f38859a1a927fab5e2fd7ea1e1a4154739301cb1957709103af886c929cf88d25ced5cd6f8cf3ffee7b088edc2f6abd1114398a3ab00fc21bec02e8e539ba12df70a587fbfba63195c6449b2b849547c42277834e1ec086b5e53d949846769e89715bf X = 0x5b3e9cc0e0be3d714d1bb2d95e5146d27a58f2ee Nonce = 3d9b8166860e18a9306026ba669a3620c2954ad4 Signature = b22c00fe0bc2fae7a4ab74edcd496c64a999c7d385ba8dbbc93ab94a76133d479e3f79576944e6ca Msg = 75474711821766b065e2448601e82b88153a41bfb5c6b6a9ddcf73170ee374a6625de19c560bcbd2020bfeab5cbfad8fc60ccfc95a1b94fbefdf815d9bfc43fa59315e7093d5685274b8afc3139b925ebf697fe2699b0feb1e42bca65e5d4eb0b4514af92dfab85e7f2666c87e9789395f354ce33938e9623061113465a4e2b9 X = 0x9b4a2536a108892240fc40c8c69a4b9b903ac760 Nonce = a993b059a49855e359014151700d02e8292ae708 Signature = 1ed131c96a2c310e1f7976d3082a69a5af45bdd070663e9ad7113ae57d4af6907712e0aaf88bc07a Msg = 340df708d457df9413ef2bda225c5f558b90966cdd531a0b5aa745d5c3ea790debea224861ef12fb1638bff0121ff26dbdcffc299bf9f3a9c1fe6027400ff14c34fb06f67db9c30a1dcbfd996903523d85046382ff280418d974a3ece6b5fafe305e2e79b1d07a7c1eeb7a1277a82282be62831df7fee38841462602986a8e9b X = 0x067e6e55be4744723b6f056b76629e93c297a585 Nonce = 77857e6de8f37eeb6925a87c027a3cd88b9d3584 Signature = 4f182ad42cb5671d3162bb9d04a06cd20edbc558a6c5417947447718ed1cb89a6efce2d3116e50d1 Msg = 9f23c82563ab7c0ba86bbb989335000a493b291e5dc17ce729494958903623ed99df344230ffb626b1dbefcce059ae16c2ee7ee6fd2a7807336cb71b8853e2ed3b74b2faac82a831d53e03d7bbb96d38df98fd19bd4c1a6248cd507c89f7995f59579afe5319731b443d6871e558f5b77f2f9a4dd99efb305e27916594524e02 X = 0xb457e1756ee9056fda7207616cf7c04a33afa66a Nonce = b29f28659dffea28449435b5a044487e29d82d6a Signature = b6599fbddb4856276df448cf09d62fd7657de6c34b49589099be5578322d829b87b43ac07f62e35d # [mod = L=1024, N=160, SHA-512] Hash = SHA-512 P = 0x88d968e9602ecbda6d86f7c970a3ffbeb1da962f28c0afb9270ef05bc330ca98c3adf83c072feb05fb2e293b5065bbb0cbcc930c24d8d07869deaecd92a2604c0f5dd35c5b431fda6a222c52c3562bf7571c710209be8b3b858818788725fe8112b7d6bc82e0ff1cbbf5d6fe94690af2b510e41ad8207dc2c02fb9fa5cefaab5 Q = 0xa665689b9e5b9ce82fd1676006cf4cf67ecc56b7 G = 0x267e282857417752113fba3fca7155b5ce89e7c8a33c1a29122e2b720965fc04245267ff87fc67a5730fe5b308013aa3266990fbb398185a87e055b443a868ce0ce13ae6aee330b9d25d3bbb362665c5881daf0c5aa75e9d4a82e8f04c91a9ad294822e33978ab0c13fadc45831f9d37da4efa0fc2c5eb01371fa85b7ddb1f82 Msg = 3a84a5314e90fd33bb7cd6ca68720c69058da1da1b359046ae8922cac8afc5e025771635fb4735491521a728441b5cb087d60776ee0ecc2174a41985a82cf46d8f8d8b274a0cc439b00971077c745f8cf701cf56bf9914cc57209b555dc87ca8c13da063270c60fc2c988e692b75a7f2a669903b93d2e14e8efb6fb9f8694a78 X = 0x07ce8862e64b7f6c7482046dbfc93907123e5214 Nonce = 2f170907ac69726b14f22056dcb37b4df85f7424 Signature = a53f1f8f20b8d3d4720f14a8bab5226b079d995311f53f6a4e56b51f60e20d4957ae89e162aea616 Msg = 6f39973fd225167a7673cd71ab3534d2686687c332f93fd66db5f1ca99678efd2825a84cd7a7107adf96501dd1d05e7bbc8d113e087bba77b2346b4364132125245e9aace3a146b576f654c86e07fc1914cafa209dd6d04845575dbb279cd1b23296d01ef505b5e1ce7f2194f18988f355c9b34f920ab35152e03bcf792ac529 X = 0x8d75294b56262e42a82db41a4039615396574dbf Nonce = 66a1322607ab98aaa57c12a5cc3f59dce8d7d0cc Signature = 1b9ed39bcc4b46ed0007679ce9c3f6dc7c4157b9258d4136ad95b704a7959d04096dcd781eb54bde Msg = 7f59744c790c0f985a9ae101d9fa00da3b95d2473d792805ec1d6d1e95222a6f30ee6ab8fc5a632057153f237ad3aa2fae8f1e51eae75906d07e576dd0021ac1711b1c8853e62d27fe6b098766b8ce3e76d347c8e49be0ab05d0d12fd777a85cffc7ad1207a9aa75643d7b415ba4b1b97dc0ee19d05a607ba063a0341f176104 X = 0x25b7fedcba71eda85fe189bf0d0c43214ab6388a Nonce = 8fd754defb1274bb7ddea0fc13fdc76722442d86 Signature = 38f52df78b0e454d3583208a0fce03b904eec8165cdc57a943ab1f269ca11c63bcb1059ee76f9c2e Msg = 16250c74ccb40443625a37c4b7e2b3615255768241f254a506fa819efbb8698ade38fc75946b3af09055578f28a181827dda311bd4038fd47f6d86cceb1bbbef2df20bf595a0ad77afd39c84877434ade3812f05ec541e0403abadc778d116fd077c95c6ec0f47241f4db813f31986b7504c1cd9ddb496ac6ed22b45e7df72cc X = 0x3fee04cc08624f3a7f34c538d87692209dd74797 Nonce = 934552738360670c98b9c5384b639c46cdecfa83 Signature = 00018f0fdc16d914971c8f310f1af7796c6f662a62b7aecc75cbc6db00dd0c24339f7bdb5ae966a5 Msg = a2ce90b51a480c0668b55936bbeebe3679f8d406a0b694b90345749e3b9c67776cae9a62c25cc011cdb3180263ddd73aa2090ec7a749092f6c7816c26744c5393acb08c6b7b359bb3a3c7543684f8050ecc6422234ff24978ae06b91d6a24c086d71eb1761caf14176d8bacdcad53b7895bdb0e053c616b147ff73d2d86ba3bc X = 0x2d667bebf445cd3ee45d5815e07ca5735b858ada Nonce = 4aeb4911d38f1f634ddf5fe6c970d943ea51b266 Signature = 5b13f1337ac72e419867c92f9387f9df62883aa590ab5b68fd8253b6bb64c61759164a97834c39e1 Msg = 3b6eeaedc5fb38ce8691686c89993caf17c9e24fa565a9e8d48436b87db62fab839c42d81fb1f8b8968c826e78d333b1d99d5c36e08a9a0ec7554c2bde07fd8ec422af128246ba3beae18ef2be755db22a869202951cd95796fc2ff7ba2a6967d19e5ca2304655bfdf879b7747f80a59b1dac0461cf6e490378e56ab378584f2 X = 0x71dbbac59768e1e3093f0c60404731a2ead482c3 Nonce = 8f78910d1e8a9daad9523626ee7ab1d0a5b4d977 Signature = 61380ca86798fc5fb61c35675af08d5cc13c25aa54ddf68f476884af3e0e6536f3a80925ee63a402 Msg = 01197ae960de90a93d9736896fe136bc561f0550c6b1cc3631b31df683017c2ab8c6f41d2745f1a797e0e89dc3d5878866c3694a080366757e6fd892d26668fd2d860ea2a2b67fdaca96e32297758787ecc0a7e1d304cc719803272e72e339b3f34c347e47b91a1ed69ca8062cd350dccc9c2264732b9fdd8462d9f6fc76850c X = 0x45963a0771456d6ae897edf7579091f5f8c76747 Nonce = 1f68d020331b81fc1aea51907e94f7d62ace9135 Signature = 41ed170c8bf6f20fd1ce18faac97565fdb4fe6f47c8c6feace68c97ca43780741fae58f2f61bf765 Msg = 0d5ab27b2b7e18cfce4ccda13aa1a5a8c18baaf39b14e642b8f81b30cd5418a1dd05df22599fbbb3bae4fee1e4b2c150a23e216c133fe2d8235485e34f80685c66bc0c190af67a0a49930b476b2803e12274cd43090921bf668fdfef155072a3cdf17901427afa51318afdda937e283e2c60d85e3bfe07f3da5f992c1fca4b98 X = 0x95bc588bb848751ba57d7a9ab340cb00e79e06d8 Nonce = 07a4f8000f0ecddb72302cf4d7975c7efc41c143 Signature = 66015e5fb3abe9d78523770f7ba0990031065ad74b8b153d5b01ddfa91f2dec6f0faff02e6e87218 Msg = 906a933bc823a307e2ab29a4a8f7f1510d5d303504fde38169ded168913e3bf81d53a4389a3e73a3efebd5e42cf402bf9fdc5da5ef46878165ada6d2e07299035a3987ed6c2c6c8becc44ea131a9493e72aee28242cf7cfac38ee870e54eb95a6efa9fad74354b281cb63ea71652eba1ad73f841dba7778f3a03d3e00190ed68 X = 0x8295ed7e125a65ea1762aaaada34602a7bc76845 Nonce = 8148e40362a255d240a3e6af746a8880162d78ad Signature = 99c91e0794723bcde34594dd2268418dfb35344342e9c49d60ad8f9b41f290ae6b772f44be62cea9 Msg = 1d6ba43a0ff677cf8cf68d6a1d3304d99490a7cae56fe35318f38ed0f5879fe254703fa77458c45e8a698469b899a215c25e869fd28741101d27dc111ffad6980f8ebd748f6977d5d60438e6edec37a49d3011f8f0f08525156ae60bc91abe661638f4b9c6c365c3af1713bf7f7225d4afad7a1b531a331133d8b8fd238598a4 X = 0x8d3c302da7b77ece9ce6e280e603bd260d2dc144 Nonce = 79989e8eb43520091706039415794d2306329861 Signature = a2b42cca55bc1ba33f8252d1a89c8d89b00b39502ec5166e35e63f0fa116b3db1bd18681a4399c04 Msg = 3bd0c5b759cb710c52b81fba48b6771cab17bf1b67eafd08f4ee1777dd473064dd0bec98d3582ee1e991ab9a91a6fe558a41db9ae6b21a057932811440d64c786b22d150e3d38c71900ad5b61e0530744e765b5c2ef30bcb96e726e3079e440086ef300bae9000df3403c33a79849f8f83d6c03f77eae98052578d82d628e65c X = 0x4d3e42ef42a60630edcc842f25a1b33c8851c742 Nonce = 6c59f3cec7e34db174dcbd6bfe224d52226c56cd Signature = 77d62ec2a95beba6c672d8422ee663d1d18049d02a339cc8f567c12149a8917375ec6ca4b47254a1 Msg = 8dc582a2b5af65e66ebdf5b533d8e22b38b5c1977e578d3213a110e9d4837a74d4b7bf7d71875690b5b71c8e8afab89434c46a8641cced1a130e21cd0c805ee45c134c7c0df75d5cd30c41818f7ae475dd6022877c743d09d54f0c94581ae7bd4b423f02e19397be7bd4a904b88cbd2f814b1dff1e796d9f2d1c8470b796c69a X = 0x6a6a9874f0f89f04cbeaebde3833ae179ade3f5a Nonce = 27b2661922214411aec66e58cb36142ab3e5a256 Signature = 05363bcca193d726cd20e03489e1b13b7df3bc9831bdaccb29e4a60023929f182199c070b71ac575 Msg = 477af8c025181b557732b9568634b1324e6669b4c28a0bcd4c653d4c81ed68b2a2043a800a314ba95e50deeacc5ee9c2ba6f6f62fdba0e86aca227d727377552a3abdbab601c2601846ec27a192a3f33e7ffdbe4a4aa7beb2b3ff6c91bd5cd5c890bcb6f4c908ff5b9b555e2a0a7df8c3ef6770136bbf009755bf6c3e6307310 X = 0x17949e838d7c93e1d837be65b3c4482433a1b208 Nonce = 620f07d7e7ced030e669685ab8c39174d88c79eb Signature = 3591c521b2a56cf46051c0cb3d444b9a22fff63f7ac78ee252440cf9e8510494d1fad8b518f1e128 Msg = bb6593ff219c9f20aa47e1e157e88ed59ae29c8940a527c82e0e0f2e855fa98e94e07be1f6bce3832b7ea1e60a5c9ef583f2ec7b179227e4afdcf829d673e1377f832ae38e7cadede415964f12baf775d38ce38e945563e72861519197c2d08f28d8b6466562e059ec41741de349ed5de2c7d6cc7518a87720a248b301733a47 X = 0x301c11a34edce1f7ab040754e0b2d4fd88572187 Nonce = 117e12f88d6e44fc7f4d51d5384fc31b2e3419a2 Signature = 61e727716cc96914509740a7cba6e74a9dec64062e77c14f01f22180bcda5725cf0eaac9ad13a7d1 Msg = 565f19244468515e8463d07b425b4d5f81ff2efab5156ba19a63734219c226ccca5903bf9c35dbca0961db7c2e3f6944d057edfa6c2394c39a00f1c42596e7ee72ed644c6a182115bdc44b9010c86e7b0ec2e3bdf7016c5e04f455b4cb693e32490b8f494bb4103b3b5ea6808222452841b733faf735f10a95fb283dd86ce593 X = 0x07dfca41446b2f4e1af2a67bc8468db9a9c2dfe0 Nonce = 4522d27cd17a6ee739873d69f107d872ed7e2db5 Signature = 5ca07bc7cd9f7a60cf79391d873b6fddf5a48cca9799c74a806fc196e0223fb1a613fd178cafbd99 # [mod = L=2048, N=224, SHA-1] Hash = SHA-1 P = 0xf2d39ed3062b13c916273600a0f2a029e86d7a4b9217b4f1815bf2b24d9710a57ab33f997294b014585b8d0198dfdccbcd75314da5ff85aa344b45adaeaa979b51a312a7bfa94472fb633f1a6f156bb4458867dfd38403f06b851f00fe2d3484077bded71ab7513d04a140220575fb693395480e4c8402b7a46cec2d37a778c305accd1f13e9f62e865315f4b22cc467c8986ec8e4961ddf810566b0c4ee369ac6aa15e43f4744005826f5bde8071a19e30b6909aac4b3d174237270dad02799d09b8a2cc5f22e66894b5422228b2c234f11f5a771c5b89cf465a2acecbbeeaa1725fe8f9b59422be8991052cb556ddf2c8ce8fa9206dbf39feadc194e00f8e5 Q = 0x8000000000000000c118f49835e4ef733c4d15800fcf059e884d31b1 G = 0xe3a93c09da6f560e4d483a382a4c546f2335c36a4c35ac1463c08a3e6dd415df56fdc537f25fd5372be63e4f5300780b782f1acd01c8b4eb33414615fd0ea82573acba7ef83f5a943854151afc2d7dfe121fb8cd03335b065b549c5dcc606be9052483bc284e12ac3c8dba09b426e08402030e70bc1cc2bf8957c4ba0630f3f32ad689389ac47443176063f247d9e2296b3ea5b5bc2335828ea1a080ed35918dee212fd031279d1b894f01afec523833669eac031a420e540ba1320a59c424a3e5849a460a56bcb001647885b1433c4f992971746bfe2977ce7259c550b551a6c35761e4a41af764e8d92132fcc0a59d1684eab90d863f29f41cf7578faa908c Msg = edc6fd9b6c6e8a59f283016f7f29ee16deeaa609b5737927162aef34fed985d0bcb550275637ba67831a2d4efccb35296dfe730f4a0b4f4728d1d7d1bb8f4a36238a5c94311fa1134a93a6b4de39c085e9f60ae4e237c0416d58042bb36baa38cba8c896295b745d5376fd8ce42eb6ee5a1b38f87716b265b76e58cfb24a9170 X = 0x6132e551cdac88409183bd37ee1452cd247d4834b08814b275be3ff5 Nonce = 7197392d32d0af6a7183cc3398556f8f687d86a8ff742be6ad38562f Signature = 45df2f423e94bf155dd4e1d9e63f315ea606dd38527d4cf6328738c859b3e8efa5bc0ccbf4a3cbb6515c4b9bf784cfacdcc101dc9f81d31f # Msg that produces a hash with leading zeros. Test created with BouncyCastle Msg = FCABA2CF434AC8DCFCEC X = 0x6132e551cdac88409183bd37ee1452cd247d4834b08814b275be3ff5 Nonce = 7197392d32d0af6a7183cc3398556f8f687d86a8ff742be6ad38562f Signature = 45DF2F423E94BF155DD4E1D9E63F315EA606DD38527D4CF6328738C83F3FF396FACFB75BDF18FFE0ABF1CDB3950B4AF63F1DE756713F15E6 Msg = 3bd2ab08217878e6774ec7797deb75d5c94c40e24ddf1fac8dde3a29c86b26f57157d329aac31a6622e1d6dac97e22695d7d1f8e20aa26b06795c2f878ba5d2b9cc4b16d5fa60a5fa5c24c09031de2f970a9b57ea24af17192ece21a4d120fdb52e62b8238f778ff8552fa453c0a8891243fc8757188e9c4e0e749f7e9cdf1c1 X = 0x32d53ad2620c156e4617a8680c543839c9be93103e80cc0fefa44ce5 Nonce = 2e8e4625de74e31bea9e480a5de92890095b6ce36897a2337ff97d53 Signature = 6d19fe3c415d6b07d6a1039a1fe34b106daa2eea4cbca971cb669eac14d7decc2cc05a1700fa256e4d2994bc4bd957bed0baf9a18bda7090 Msg = c67fa77cd7351d100c7624e25418481f8fa499d75f5949a5cae60f96a0f7bfcdda7dba373f9f7512a5f1460a95213077cebd912e2662c43ac6bbe38c4479b04151a5e2d2880902d031aa0dff3f41126dd09fba5c0507634ed16c3938fbd3a96473a8b1ebdc37d32c767fd5932efa235555f3825a1595369238675453604d278e X = 0x062bd01487e413074126d9d47258b5c7c77790a9db0af952ce799eb0 Nonce = 7439c7aa4446ed540ba50b9c817792b08fc0278fa0af2daded03756b Signature = 7924b76ee76ad7ff2ab327dabbbd31336750fc7663df4b5b94eeb62d5914cf965490b0bf8192fc6e169754bdfd31c48d716361dd15f45bf7 Msg = fde7434c41666022d6d7dabc7a67315b1ff49a2a85a6168f2b6063e3036a4f35e66d2872af3d97e5beba239698d88e13bd036ef08cf0e83a41664c3d0d21863c24129a6a9b27b8e96c8029ec673e07af7246ab77a56c21ca208df4b1818deda906b553b2b23a37b5a05e29825ebeb47f53986c2bf26d731a5b731fffc353258c X = 0x6e6bae97e3b37a402eca050d666b6483cf7d700419c5ab1eed1bed05 Nonce = 08544a6237ac967e5d11f2eccc6618399818b891df7a04d08cbc5e74 Signature = 49ea82713aaad799e263809e161b0655f1e74323a06041836f67698076b3f6c1647f8d17718ffb92d6e1424606ba9724e5290daa4ee95efb Msg = 6676a3a131cef7e5647ea7590da3c704a0f5dc3f37f26913a70d430609cc2497c45e68b7bd6f5893dba26287ff0d240bab8a0761936aa709a2162ebf1c20a6136a748352dc39ba4403cbe4b0a5a54a729286dd193eac1a2e6bdc150fb06369be4443a60e75e5330083ff009eabb05232c52368a26fd237c7c3185c1c7e7d5955 X = 0x18faf583215bc4fa71791f6f34e682ab3529aa9a1a71c1fc7bd456a8 Nonce = 11b25b09408bb5dd784ad70264e585c978dc02cc1df8bb95a28aedfe Signature = 1658a7ef2f444b014a1885b1eda8dad3605b96c3948e544e4c8825eb602150f67b19a5e3e39fc53abea02dd8f3b30d25c0b4ea0bcddcbdb0 Msg = 071f06a11588584da5576013029b5a14712581a48408bbfdbe34e17568c0a0e4d12c1e9c3fb227101440dd8dcdc415e3b49f68a26a0ec7612a10bbc64ddb8f7ec9e9750d1efc9c0574700875fcf52d00d37b9dd744ca841ecf7566977c1b5799dc4105d0b7a92551c5b33a50133fa300a5908b18f4c01936347c6049447abf29 X = 0x58882f1a41e08bf6c8dad091a299af0fbbd14515c1550906ff77f6ae Nonce = 5ff04e754fe3246f35b3400b87a450192a7bfd9b3c03f3ece93449f4 Signature = 07bd3f6718e39839304ef54ac48bda8d9ac8ee051a49bb9131dcc9186496b2469bfb5845485004702b0c79941bc3c3007007ba169d8307ce Msg = 71279b848c00208fb4e4d87979cf973b321b20d098dea912a3b4b5789cdd3b7ccd8f3993a9c92c34b70e9b0bd57520db56f2ded3a612a6169d2a1cc6350905ed0202a25c113b7bf8faec4edd2ea3b8f447ca75d15a712b4b4394c22de0c2554b9aa07ec8466727e7ef6f1f04ac4568d7726d9d77f50a2fd551ac29e42f8dda23 X = 0x292b1666d0b1fb361da268de725b11310000705964705ee975d4ebae Nonce = 6b1b752bb180d8787c71505be758c0ce41fef428ac10591502c9a04b Signature = 4cf5c26c4c2cd48c05508e52d743ef48685f6324141adef23d79a39659f64755a04c90a14b187ae142ec483c4600b6fbbe19f04a49e9ff88 Msg = 3ea03e9b005ec1954fee0c73326d8aca1a4f63648eb4cc59265528ee8e969ecefecf2797a0144c8336500e26a1c7cb1a642b1ec65201416e5deb355201de2bda695d1beba8dee62772f4d5914a245be9ffecf39408ae7bf1bff7c2451029c4ba0c522516e89955ad3bd699cce94c744081a9f2d60f5c5127ec722fa57316cede X = 0x087e432b1c29c00508d768fda7c4b279fc088c48439f09980bfa159c Nonce = 0a8a45ce2412cb84e4e0174d7ecd2eb5b37ad0a53b474fa9bcf56d9a Signature = 5ca2e971f21b70127a70c655eb87e20b2517976228a2c4e648d549b244036b34667136a5140dd1948ddc2fb2bf679efee21f29b7ad87af7c Msg = a3f7033958c5b779072b0548baedf4f88d14f11a6dd6eec0181b399943d7246a45d50c4f7b5295dae4cd3ba7c4c181fa201581ad5c4b38793bcf454f176868e9cbe0997aa41987b1aa3d5ddc046be7b022fb5130594c8a9df03cfaa7acef817e3ba5e192c69a120299492baa52a9be83b8e871abe318b4a1f588f9edcddafc17 X = 0x5831abf9843eee928944e3dbb759dc7224910e1adab827a04f596e3c Nonce = 36b3d1d36d1a8c41442b6fffd46bcd7977a306b53dcf7fa590538194 Signature = 1823f0a807fb9e71ad69b8e9fc674cf76f67c42cadbea6d34cf1f1cc667fc57a44b289fc34a198556117afd696dcbd96bf1baacb40d3f8b2 Msg = 680d878ca6eeb87e4ae158dddc3732784013ebb1da89401acdd6109089e5601d695f9e4e6ebf16026aa746dee80a01235033f242079af1b7fa6965c87eae8b3291a009e4f19d5b8f1394d866e7c9b72073a95652c0eed98e9484a15c9244764d8cbaabd49d24c207c705703cc35ebfc7683f4a0e6abf23fa07678350a6a00cde X = 0x738a8bfc478e462c4bef8d5633e0793475206551bbddd08507f005f5 Nonce = 58d8b64bc8c2da02a294e9db46bfefb273e74870651e19d6cd017c55 Signature = 7ceb71480b5a7133401b5227fa2253332e04f78ea5d0fe237c8525d1484800e81f7b5692b79eb21ac2fff83c49c9f0d409c756c73fbdd2f0 Msg = 697f9efc8653fedb898c77f90f124bea5c3b893c49d7f1b116479e83d35cb6c3940797501e7f52887d18ae9f4055e1bdd124b572f7a6fad101f58b52b30ca30d9743a9016af891896d25356e44f982d406ea26a9b25fc4f903092d7e8e8713774a8be7aaac93a6942c1f2c48e9dea64984ae54f7ef99961bfd9b8d93226af776 X = 0x550c8755237857a0c8fc8a63525d4025713b89bdb127d1c330c3324a Nonce = 0b4329f9e5ac4a117689883db2ca8e968d30a3aced61e27ba27c6242 Signature = 62054d11529b993a6f19a0d5481b99b4b4461a49866c29534a361a8b7a7fd0982e4e2118d1a069787a80b902493465f6620a355c86a94867 Msg = d080a7dff1ef20e33832b99cf83c6c919c07620bf608e080aa301831ca6178e44ef7a4c115e93ab6d877e96652171610a51d927d2034f42f280fe87d7c1747c480ebccbf565a150f3240f6d4ce5d6eb0b2e964416791376ed22b3559cf93a019676e9e0be3c8d34f0e0d1152ec6c326d3dbf1d3303beadd188c3aa0d77e8a117 X = 0x2171d5e7cdda9a691dd27f0524f24ca41d5d801eb2ab0dcdbe6014ad Nonce = 0f6626008e50c19def9bd694c00522cc861eb7069d55892e08ddff58 Signature = 44e70d2ead3c51dd0c5461dd4186825e23b4e751d8ab17d0b7edfaac48ffade27531db478f22fa0ec92bcfd2ffeb6db67715dcdc79bcb028 Msg = f6a9afe241dd984e3bc265787dcc49491b3bca67feef32fc1e07fdaf0af6c5d06dccb47cdb6907511cb30c109f62e66718c5c4bb43d4b00b51235df43223d60ce1f9be3493a4dcb02e25ed3ddae10d131b481a61aef334b690c7a1ec74865954b39ccfa7a51a9a1e62e654bb89270c774f082adf09b579c8358dacb9db7ca1c2 X = 0x77207cf0963f1e961c3539d7d0f678fce517f67b728bf15e0cab3ae6 Nonce = 57585204d88d73c21f66a150991531973978dfeaedd8024e268f18d5 Signature = 555a454880084f6cb2522daf3399fb4a501a943a9b6aacd58e2c7d37730fedb3a5911844146098ac5603e2baaae76962b33a327b50420a50 Msg = 2d1c573bf324028dc2fe00928f55f7fac79037d4d99eb185f3b997e042cdf808b5382d50a6aa8085c5d1958e67283df66986b93471c12e3045ba146ed5965c8ac5b44668f61984d21736cf1c276754b848e9fa636b6315b2272c19e65626bf8b1214d70989a623b5fff7803d28a663bbbbebb84c839b42720fd0e62246b3b034 X = 0x789375055f94b9ade40b0af8f70640336f5de213571ca1c645ca468f Nonce = 325b1562d5c9c61f95e6944fb12a4bb08d227c4dc0c8e9a79e391b08 Signature = 7bf3c0c547e21846212bf4cf3e38362dd4d359b7af6420f90da579075ebd5d2d88cae40b37a9a5a84e6218d2453afa146c79a5d5f5df44f4 Msg = bab4db55bf6d3abefd1bb4e0f7bcec65ee6c6d8eb04b7c480df4e9e39150f10c38f1abb63dfe1bb9755c41b38955ba38ba938b6ceedfec02001fa870070c59df1fd2d72a814104c5143376a3136b8118f7b47bd1ffab53359e53f95c66ee12705e31a462a8caae481556ceff607ccc8bf1450772cd68081d3f15a710e656ae56 X = 0x6f4a94c9254a557787de9afa08215414db5a0dbc67c66cde1c1e6f04 Nonce = 14fe2a5a75756885240ff29abd19d346b2e7e5dfa76d2430f0d069d6 Signature = 118d2227be4bd91e98a2efde15609b2b9124b2e83c274b632300432b3a447461944b2a59278a8e1118b406bd3ff416775d65530e54f9e623 # [mod = L=2048, N=224, SHA-224] Hash = SHA-224 P = 0xaa815c9db1c4d3d2773c7d0d4d1da75ecfc4a39e97d5fa191ffec8b1490a290ce335e5ce87ea620a8a17de0bb64714e2ec840bf00e6ebdb4ffb4e324ca07c3c8717309af1410362a772c9add838b2b0cae1e90ab448adabdacd2e5df59c4187a32a23719d6c57e9400885383bf8f066f23b941920d54c35b4f7cc5044f3b40f17046956307b748e840732844d00a9ce6ec5714293b6265147f15c67f4be38b082b55fdeadb6124689fb76f9d25cc28b8eaa98b562d5c1011e0dcf9b39923240d332d89dc9603b7bddd0c70b83caa2905631b1c83cabbae6c0c0c2efe8f58131ed8351bf93e875f6a73a93cbad470141a2687fbacf2d71c8ddee971ad660729ad Q = 0xea347e90be7c2875d1fe1db622b4763837c5e27a6037310348c1aa11 G = 0x2042094ccbc8b8723fc928c12fda671b83295e99c743576f44504be1186323319b5002d24f173df909ea241d6ea5289904ee4636204b2fbe94b068fe093f7962579549551d3af219ad8ed19939eff86bcec834de2f2f78596e89e7cb52c524e177098a56c232eb1f563aa84bc6b026deee6ff51cb441e080f2dafaea1ced86427d1c346be55c66803d4b76d133cd445b4c3482fa415023463c9bf30f2f784223e26057d3aa0d7fbb660630c52e49d4a0325c7389e072aa349f13c966e159752fbb71e9336890f93243fa6e72d299365ee5b3fe266ebf1110568fee4425c847b50210bd484b97431a42856adca3e7d1a9c9c675c7e266918320dd5a78a48c48a9 Msg = e920fc1610718f2b0213d301c0092a51f3c6b0107bbbd8243a9689c044e2d142f202d9d195a5faef4be5acadc9ff6f7d2261e58b517139bcb9489b110423c2e59eb181294ffdae8aad0e624fab974c97f9f5e7dc19d678a9cb3429cf05ec509072856f5adfec6e29bafe8e5ba95593e612843e343111d88a1eaff7dc0a2e277f X = 0x7b489021578e79e7bd3ee7ab456f659f3dc07c88f5c9a39e4f8cee81 Nonce = 37fadd419fcbd2b073a06ae96b9eceb63e29aee9ac5fa2bdb31ab85d Signature = 65102e8f64ecb11f06017b1a0c0def3c29897c277c4a948b1f4da6b921ad0abb27bd3c21166cb96aef70c0dbd5f3079cab0dd543d4125bd1 Msg = da5e7b051c1859d22f2a3163335d277951973c172e06697c0490ff15b592c1ebd0fa5efa2463119804a3fea224b96b463e30083e002949a24e922031764bb3daff8101fa088af5457af36654c668f234a00cd828cc740a898c0cd3df09315da9b346b325b2fbec475210b75482affa61a3eff50c83c3a039fae5cfa8d971fddd X = 0x9d8bba124417c126c1c011115906a7bdb7a493661d8a945e32cb283c Nonce = 1abaec5b4efaa83403fa970ff6027fdb596359df930a02baa12ed854 Signature = 313615836f0d338d81b670f116a5414d2ce90ea5ca5308ba4f0c8a7ddc1d4c3c06203fd598a476c891dfe5934162d0d35f37f1c09dd6395d Msg = f49895b3290d9aaeb4af611c5e30afc0047dd42c07216211d54977d1497fa4ee6abe11000d6ac04d24b4c50f31e06ee8a74774d3d304137cc6b114d145250ee7e94a12a1ab592ae307ef5d930cf39170e9756adc5e7ba62a54abb6f047b4500b6121e1f4a95d3c6a96f7f8333cbb1ebeed8b4db1a7fe75f4071cebfbbdfdab90 X = 0xb9174a6cb4d3b2e7e4d168078e920ecb651343223575dd37c0677371 Nonce = 1c52eec9523245bd82707f2ebdb05fee6d34749f23023ba72a5a60ef Signature = 79d544cdecfd1ec1b7d1ba6322a5e0eb858aeb4b76d5b3202cea233a0ea53dea4ccb25978a0af5529598911b47c25e0ba3b2a0505fd1d7fc Msg = 31d739566914549eb25726bf6d4b6c674f479ba7a406acd108a106f36c7f5214976dcf3adf2c83fd26b37d52c0b5ff51e6b3811a8dcb026a1fbb52f95027ea6034d91149b30ab4928ede26ddd692ddb8ddd929fbff83fc673788faa0ba5d967fd1339299e55be51cea80609d2b3c3433cf713a9686e229336cfa7e720fd5303d X = 0x4cb56c8acb9c107087837ef5e021f77cb015023c8ac1ec73575e5289 Nonce = d223b9e9c662ba6651cdbad84f2616fa223fa8742f783c87c2fb9e8e Signature = c8b8a92e8c101505a1991bcb02fb6e382a3ecbaec8f4374501b657be20d161cefd584979224379f28d827aa219c572f9600147f4048ba7cf Msg = d0a8a1ca0ff2b44b37ff860007334b23be4934ff89051d787ce69d3d7fa734b9779e2f0b38c235391a897fb8514b857b991d10e34a00dc25b0c4382dfb6d53aa87ec1784f1cae2599259406d4756539867679d3088913a138871e2a434747222fcfab079d9e655ba254463cb0c5786b9858dc429ffdadf4c3b6a253f90eeba24 X = 0x2286424f368e5e64bac0c977ff0d92a560b78e4f21b49f3aee7cdec6 Nonce = c2795f65f0f077e32c022a703f7eb8e5dc068fa67cb087ef366b243a Signature = 9dabff22a43012dbf47d56b9ae5a09f4d739dd69fe907725afcd84f4b60c44728e4b1390f30238fba1dc1003fdd39507ff5d6ba7e609f2ae Msg = e4ffe72c77c3a43af8a61f58f9240e1a07b5c2894d5bdb654b2b994dc0c987bad9b704075d3d0a969cecfc98b1dc20e76cd8e012285819462226a84dcdd67895f6ea278266f1575ea785a2c359f8f4593bef31a58091b64afb84cdfd23e4aaff29d9626f0c823d934283a4faafc9c6cc18622328cad96f77d79b9ba35a43d825 X = 0x86b0e564ef08e089c4c85675b6e5281daa4e82bc2fc0e27668052e4e Nonce = 5aba2fdf6b24bf24151943a4f32d2794e44d1f62e8c968ceb5b073c7 Signature = 4a2abc689d2a63e8b23214a3212a5d20a7386882d5e11c5d5daa66bc08e0c6547087b58bc94fae247e962da1a2897888d1bc9c8cbf3ad6af Msg = f8fec19288f3a8bd1d0d573bbbc180106065697481bed912f8752750d331e3a097775a12276bc4293a78a80748b2b2c37d20b800335c1d1b430a71bbdfd8f7afeeec82ceff2fd33f2624e49d37457f262cf5dedef9025ce96e0b7d499fcc7a7ff06c02590ea821dd8ed060cabcf4feec9592aceddfd32b4c09e4d44938435b82 X = 0xe5ada29e91ccae11fd060112540eac31d9651b34b2754ee51620624c Nonce = cf0544a08823ea2ad5f13716b43b154aa4bf80d6bbcafe6040ad91c3 Signature = 2f38c5cf86aa0e53d1fea0e65dd03813640404b8d9a8cd6d264d928547603880f3d67ba1a6eabc20137dc4882e417304cb95d622177df511 Msg = 7559465af5ca04c1e74deb9f8e46b0ef17de4d7a2ae0faf4e903a2998bcaa09b7f1730393320ebc57d052d2e98f5486e8e92bd1ee6bb0ffd02d69e5d4591e2fa12e4ebff8b6b9d3270fc75274f8f82e1c60edb2a21f8d5531a2380cbebb24f6457176e54769a136601a9b81da68ff196ff8cc78cf059c04ae22459cec7da89b6 X = 0x6ba814fb6c1d9fe5d282008dcc9af2761d1b03eb1fd02e2499c1b509 Nonce = 70af9c79fad2b3a0677fccadd95e6f72eb8a51464e443d1e5c007f98 Signature = c5d33f5a4fe2280a9b96d7a9b5530dc17cd1054bf1e8cf6f4aa3e2acc9bf1c062bd1e86f3bd3c1ff582c33270537fa7769b9592aef12e104 Msg = 1674823896c5a764c61fd19b125a7d6cd58c883d86794391477349f03616d75b6925e9dcc553dea37047f0cd153168eb26e5ad4b8fe7cc65e4fa275514c842af63507f901fd110b98249133d3d1266d2f967c85b7f88dd76c7f76b786b5572dcae68cc646e458b8278db346b2e970c7870cffd8457fbec06bbb5141575f40fde X = 0xb5a607136e5dfa76645f4fee9db17bbcd260b1f6023f28474921714b Nonce = 02e860266b3b7919a3d74f37f4fa9054f62f37959ee1ce66baea3b15 Signature = b1a946fa42a36d836daab56fe015c9f29c4544a4a47d482ea2d9cc5be2905ee70a5dc099b7e0baec5566b229e9ca8e7e00840966cf56c4d5 Msg = 281fd14ae2e702dbd25f77d8ba8af09fdd77b1839648ab9c880bd119d4475378fcd0d12415abb9f26bfb8e26f108b1298859235ed12e7f9e915628e3ca36c5986d18811a5905aef7878c6300a95ea87182016ec595d32e4dfc274adb47c3ed0f6c38ec893b331f7092f19b724b9fe43f0ef8dec14fb7bf8b9041b5390beb4408 X = 0x272b54a77c97fdfaaadf12ee05e1279f65e8748ef873c407372aaf80 Nonce = bc06f559baf16de28e915dd27485338abf2bd0e62cdda5b3f1ad05f5 Signature = 5a77639663664e3f0b19fd583bab6e680688cd89d5e012ddcb1e06bcd41c784b583cbc525bce87c6caa44062eac847bca8b005c12ab5e554 Msg = 503f2042358f7e414296ab2d41f3a1f3f11182eca6c82b2ae6ee833dd737bcb34691793e30110036ae54d403a5ea45cbf3e5515bbf80b1af139853f506792df7ff5235995e080f82b562326adaf321159adeef20388024509f225e8c5235368a7b045d69e472e6b2ad7d470a11f6aa8d4ca6c6cdb0f3ed4e06fb9a95e2cf200c X = 0xc3ff27ecdb6a7de642fb2d2f9d93ccb51dd09b543a77fb2e7a22a29f Nonce = ac8009b8bc2503f5a68d667696c7fbf66ebba6f88ed3db3504c0c9b6 Signature = 8486ab31c8278fad0691fdd6cac2f5fd790b2f3fed52b09986766042b6967b9eacde5f4883710eba387b3c6fedfc91944ea51f6ffab72531 Msg = 650c3c409a885fa6d1ac1ff41e15f9001f6cd6a152c376fd22e2851c9cbaa5350d8a92b7401030809395cf0b1a0cb03a24dc3b4347050e8553da0e61d81dee4402b1cec97d898dc6886601024f6bfbc48d2f2c40bf96de9bc0e078e440c771f74e7115ad22ba994ae2f857c7fb865ea750b18c79e7b048563becef8898ced3dd X = 0xd39e52c39ea46d6ce274670d3e8a22875cb9873daf4c2ed83bd3be37 Nonce = 78683cfccca3e13d49999e7bacccb43fa33e11547014baf66b987b83 Signature = a0c49d3c47240d30d26f0c20e4508b360a841285de3fc1986f1ef9f697caa2b76d15b1f9f177e209004a2b1fdd23a3945034584c2c15bfa2 Msg = 64129153eb9ccc74cc3aae1d5999c6e90d986be6fa40c6c4bc00b1c3f8072d10a9d8e6c314d82a7641f8a3ae29d3e7dd1942dbf0dc52b4b4b35bb67a994942aff029ca6fa18709915ff720ab8f65f231155cb1d0dbcba04fc5193afc71a5eddb4a03867e5c4bb92d37b7ef771da954ec6754d5fbe2e372b92df6a3ea8c3a4aff X = 0xa7d5664e781c28f4859f5c126cbe8d87f9b2aa0027149f8b0a921d46 Nonce = 85adc235c0060b510825ed2b436bdf003f4d63e299e973b5ddc81fc8 Signature = 3d728962aec35822fff99e1b5217d8a6264a7c608d8066f4fcc9008aca5c8e178a14ba006e93cf4ad119f045bbf82b828767d3e583d0bd15 Msg = 9fd2791c41a2ffa6df26109804eaf070122e20bbb62ecd9811551136aa956dc1c321327893a0dde6dd1d5b3a0d2a5aa97ed754e5bc066753338dddfc68eba217d2483505b0d7c0a437732f8046cf3bf5930a11efd3f6599c0f8d465fca7676ce1f39102cc0cdf13281b2c7b9cf7a7afcde681005e5a2e4e38cf82e421357a41f X = 0xddffa0c5aafa1acf98290ce6aa7a48db2ddfec48d6ea881745f2373a Nonce = 3ee8b1f03687b9726de846f54618ac45f8e2d6e8957ce6996bf50c2d Signature = a7cc7486f47fe62fe3254ed655e1c994902d797f0d7ca93fb97df9c1914bf7d15ce2c9ecc5ae150d6308fc557d94e1ef18c0860aa68ad48e Msg = 6b78b4de5f7526dbed08ee0ff4e43335b60cd3bc371b70cd4fd9ce45bf06508391085d142cc3891b179167c76a1350ca8ef8ce754ab1d624572e437195660f004cb7bed2ff3b0f7c7e53f853305a3821dfbaec33e220df3c3ef7a79f34e82cc8fff8415f108c000f21c3bb21a4c33267a213cb4a558e3b370d17c639247bffeb X = 0x9da093f73c714e0b9994078b6cc748a675cf4f3bbc502a23895097b3 Nonce = bdd792b1ece3d0ce428cc1294b9d7497208de86929a2aad2ef481557 Signature = 2f85ee5c32d546c68f0aa2698beae53e2848c375517a570e0f1b5546547667e8b13f21635a0b106d324d06c85b74a64ce9225cc5e0843581 # [mod = L=2048, N=224, SHA-256] Hash = SHA-256 P = 0xa4c7eaab42c4c73b757770916489f17cd50725cd0a4bc4e1cf67f763b8c1de2d6dab9856baafb008f365b18a42e14dc51f350b88eca0209c5aa4fd71a7a96c765f5901c21e720570d7837bec7c76d2e49344731ca39405d0a879b9e0dcd1a8125fd130ec1e783e654b94e3002e6b629e904ab3877867720cbd54b4270a9e15cd028c7cc796f06c272a660951928fdbeb2dca061b41e932257305742ff16e2f429191d5e5f1a6ddf6e78c5d7722cff80a9c0bd5c8d7aeba8c04438992b075e307c1534c49ad380f477f5f7987dc172c161dca38dcaf3fb3846c72c9119a5299adc748951b3dce0d00d4a9013800b2008203b72465bc6a84ae059a30c4522dea57 Q = 0xce89fe332b8e4eb3d1e8ddcea5d163a5bc13b63f16993755427aef43 G = 0x8c465edf5a180730291e080dfc5385397a5006450dba2efe0129264fbd897bb5579ca0eab19aa278220424724b4f2a6f6ee6328432abf661380646097233505339c5519d357d7112b6eec938b85d5aa75cc2e38092f0a530acb54e50fe82c4d562fb0f3036b80b30334023ebbe6637a0010b00c7db86371168563671e1e0f028aedbd45d2d572621a609982a073e51aae27707afbeef29e2ecee84d7a6d5da382be3a35f42b6c66849202ab19d025b869d08776476d1ab981475ad2ad2f3e6fd07e30696d90a626816df60d6ca7afd7b482f942f83b45cc82933731f87faee320900f2aa3e70b1867e1430e40be67c07f9290299ef067b8b24a7515b3f992c07 Msg = cec8d2843dee7cb5f9119b75562585e05c5ce2f4e6457e9bcc3c1c781ccd2c0442b6282aea610f7161dcede176e774861f7d2691be6c894ac3ebf80c0fab21e52a3e63ae0b35025762ccd6c9e1fecc7f9fe00aa55c0c3ae33ae88f66187f9598eba9f863171f3f56484625bf39d883427349b8671d9bb7d396180694e5b546ae X = 0x551595eccbb003b0bf8ddda184a59da51e459a0d28205e5592ca4cb1 Nonce = 6f326546aa174b3d319ef7331ec8dfd363dd78ae583a920165ff7e54 Signature = 9c5fa46879ddaf5c14f07dfb5320715f67a6fec179e3ad53342fb6d1c3e17e7b3c4d0ac8d49f4dd0f04c16a094f42da0afcc6c90f5f1bbc8 Msg = f3bb27bf9d412f13229a56d2d1533eae63f40004c143c6b92f6e606d263dd2da7581e5eb20b6cd021e3ab63b498abafce01b4ad7ac8628f7a1849c4e454f1168ae97adfab1fadbd313fca7381726f5045752dabaad6ea3250d303a5496bba2fa4895ae49f06a9aa6451ae70cf33b5f06fa17cac0144f28bd19fb2ac041a578ed X = 0x027d0171598e7ecf23f2922d0257e604291cefa77b5cfaf1b3e31ac4 Nonce = 7494772f199ab7a7e9a248f6c2df918c9da62dc2d4176b7db9419b37 Signature = 79a6aed73ce177ed3581f5d181a77f000d6358514ea95cb0388a6add2b8597a694564e267b6f250a4c76361f8cdf49863a7902afa48fd6d8 Msg = e714c01631704e9447390f5c315c9615a7a52863b143706583f661595c505aec477eeb5ad6d640ca812ce11750b67bc8bede2e4f9618dbe7376cab6231b21248ec914ae182df8753362d2118a65e66f64018810804ad97fcc1a87b8c9f349d1001e4b09b046991e6abe6338fbef7be48f1c80c350d2962eb6b8fce25b69f8dc9 X = 0x6911c21a3da88d54ff9ab58ae2075a2affa3f3eb656978ea26bfa702 Nonce = bfb79665f7d6df843d2c39357173e415724c83e1a10932efb9e22676 Signature = 790b4dcae31fe45cd3a7bb6fa10dcf9ede1f067123f93baad7edb48971e3e46dfe040496ce4c5e490f6944a23cd5e66ce9b4d9acbe4130ce Msg = 3f6e482fd484ed3d07f1d0761f2d60fc96d46eb0ecd10a59dd4f392e3d3b2cbe184010e132685578b1f6303239798a5303a81169d4f52fba0d20a42834de293e3a7b32848b65dd308eef5350d633297465425b7b1595ffc8ea7b125896f89e2844561635f52ec62fab2ecfea288d23f0a771cd6311806103135172cf9fef1455 X = 0x20328083aa86511140324fd0357067a1d6abfc316e77fe3d260f0ef2 Nonce = 8f4398bb9fe1b393c1d90a62e178899261fa0501c98bd9a8178b364c Signature = 3b5d8034c4b8ad9701bf29b10006db69d017fde8638079dd7bbface7cde01df54a66cef3c0538648525b250cb1f08707f5ff114bdebff8f7 Msg = 31a278f881fdd375565c0f28ff7575f216110486d6fe08dae8fd072950978bdff601ded1ef226b5d904c47f7142a8f4665e03efe5870da2dd1ab80e449f5c757b3b6996a9dc0b5b2750b97bbad2f553fbaff2aedecfc9ff6a970d156e4fe3852979dc913bdb296a321f766367239de45e47cbef4d79bfa3d576887c65f7f8a60 X = 0xb75ee80c896b42148eeb7d185d45f5872a3758e983b4fdd8c2e71ca0 Nonce = ba98b478a9e12a1d03b6aca65c0acb265764357cca67d04d782fded9 Signature = 2b47e257bf72adf34d618d3a6c46142881bdd0689a46f1cb3199ee6ccc1ff2fa3755a0e81edfc753bcf14e637413eaee0f22d7886b058dcc Msg = a6d76047bd18deefe70dc0a4bd082a10fa521dffda782a9364b9e2b11e147e1a36a11c4300672144d9b974132b4975f27ea6e8e46b55aedd6723e53e7bc9b40dce2449285a690885c3223b636cb5c4873c5ddaebb0b6dc5b69438d881a525905a51bdb97b051dbfec6dd4a7b580297b08f2ba60f2ead3a07531cf299977413af X = 0x1c0e4c78a4ad4f5046f929e7cd3db3f48b86e5eab4a5e2be61a08dfe Nonce = 5135933094326e3953250a29d5f5c4c9a1033ccb844ab35a14c19d31 Signature = b8674d1ba6f13398f5e8944b82150d9e9bc9b210a81495b335947e6475fcfe96926186efa12c007c0985205147cf65abd108363d8b891190 Msg = f0d5b33327695536e351b37cd3feea693f10377a5f8bdd913402c2ed67a0fc1e7bcaab002fa779935950c76e42a491a68fa6fe445cd35575cfce5f376c29c4e8c0fed5a5487ef418b96fa5752a033ad07959653d1b8af6702dcce40efef21b2d64cf06bd8b03dadb2fdaaa73fb2d3d75b0985e9aefa1f94442a5491ae46d7c51 X = 0x269055de62d0742324803624522e678234c3600ae7bc3996c8d17bc9 Nonce = 0d9d0b3e1f24cbb18320f9ce896cfca2a5a6bb28ceec83e1ff3218d3 Signature = 01a4f4bc633ebf842a28d045184d250529920df280545cba00501cad09fceb2df200b7c0a56ae7969f5473b7a1f6b703f743f954a4fbdbe3 Msg = f58e039d666ef064cccc7ed015017c68393d1455300d0c4fd4f0d302c43a0022363a7cb01bf0673d325293bd50b27f8187d88ee2b553b159a97d15ac543421446c2aec39566315211b9b4108cacf9085dacdb4de94bce84097c0892b1cc65f2e10d74e5293a04a837b616d4181f3fe4caa4cc2e744916e770ff0ab1368c86cfc X = 0x3752b20033843d1ea4f48018bede79f39c15de33df64140259aebb82 Nonce = 1220ac99b9124f1dc2212ade5691fd330d6d868f3e90694236d44b70 Signature = 31fde5f22ebb426f256b175057a76125c40136974ad58e681ec2c4a977b0614dd99acbbf4c43aa926b3f0be1cd52d52775f22a408c4e0304 Msg = 1477aa0b9f1b199b6aa0931d4d3f766d80a3af10c9ff7315391f15edc4e92632f9d4d21a8033215d5e99cff170d9888f020b0db0e5b97e123a2889898c5b0ef7c832d028afd5e385004531ff9989797c3bd954b1ac729066577667567884cd4bc5d055a3f645583d29cf4758507c883c5bbfa74444b9c5b9b495072c3261b6ec X = 0x83770784916227ab2a73edaac5a95f7538fd94f89650841d79a37d7a Nonce = 6406035023c5e150e8758baeb00a9b858ebd0e4090334c69e2fd2377 Signature = a2380b5ece76672669e26187a17da45ad89de1726c826e57378af7079cc26c3456c0a409f4cc98c83ea5176eb293ec7157e51370726429ce Msg = fc82372566ef2c626b2145549a5db973118dff4c6d1d7c4a2e16ecc31b43c14ad3683173535b0b82331f15a183e6a50200fd1e88ff903ecfc50bdd4f5875e264a4499eadbdaf807f974f8d8104477a0e4d30463dfc61cdac5bf44eab96c770a7db912eee2db248cdd2b9b36211f93870beae6bdf8e0aed0097519ecde3470cdd X = 0x8d2855e4ea3e5085a5c145e324e5d5a5f8f23756284669279728ec9c Nonce = 5cc12f090fd965c719efa2ee907a43b3643ca8f9ef7c537adcb09189 Signature = 5461b20704453b6c51837f7b9ef5836131b501f2539145ca3481e6afb65f69d291ffae2d16e3108d69aeb01b4f9202afa01382e53dea4d54 Msg = e66aad54048bececa5682644d5274c18068363e968e37e6c11c1f8a0d7e320578514e1874e9d4eaf1bd02da6b722ed22acfca48c3acb670a6f9ee62e3aa71deb18097508f431b05214c199c166fa42cd6a0797bc7b4d1a2f330cb62c2c95182fef0d06862542845e430d778c82076387adad4355c258e6c543cd656fe3cd2332 X = 0x2c984e8464cf5716053520b6a72c69798b9eec1e115b0a1e30e2e44e Nonce = b20370d79e097e7c65e956d76aea1e288b668dacb8e7944aba5fbadd Signature = 86d5bac3aeee9b501f91f2fa71b1066760df2e0ee147383f145bb0d38d6a207802d6fd6e534e1b8a1edb997b7cc9a25a97a9e4b6eebd0e23 Msg = c85747cdd2ac9da0999b7e5d7f64d11dce7673df5bc605051316b4b94bc7fc776fb1d3da5a4395a674aa8a0798a341b31b11e63cdfac5f854346f6a4b74b49f2d089cbb86fae54ebfd95eb9f05a1b5e84306e930461ad7f827cfb910014a3af4dae0d46ece912bc26870a433f70f0a38bf23b15d98cc658848f4bad9c84e89f0 X = 0x4076f4abf4d3c9a55b3f063535f6a69c221199581e72c5a8c31f1a71 Nonce = 7149f49e3d07c45c97db09632740560e5b0e843240255da43ae97ec1 Signature = 28e3dd71098ff04d1ca885c2774f78ecb3ecea708fab2e16bd5cece1ac8b6ee498ee383e28404ba4b53e64aca0fcd26790713264fe3cf6a1 Msg = a7a59da62a9391cfe628697548b05f8af39ea9821d76c314478e210fbcd27fbf6b0bf460a65dbcbadcddfc0178ece135264a7d7c5b7053208bfbde54e3338d901927e95e1dc8eeb73d299e6fa6584555cfeafd1925e95e0b3558ddec641175fc7293c0310266ace18bbb16f9084fd4ac22ad2dc8528c3f3f332684039e74b390 X = 0x22fdd44afd372e15842413c0829c9a894ce61a3f0b135c1546f57fb0 Nonce = b93120b594e8994f533c1811d61495f2ebf32fde9e7ecec856033f20 Signature = 84934f3f56d64815fc66b0dbf3b1fa56d1387be7611a1e571c405100431f11346950e77c9e9ed0127c50bf620f6f69a699cd017c7d87368a Msg = d4c5b439a1ccf5d98cf0b931f253f733037921d4efb02cf87b2509e732a56ccb49e0c83b1409cc009f1d2d1cb4c0c7ab00c402ee018ec5098031ac9e7197d4395d491721708a41ff5cda5a03be6a1169bf459470b1aaf53c8a9668acae1385b921f5a26c73365444515c3c126c6940b4bf57591a0bfd6c2c74c724426cb2ad3f X = 0xc9ed82462158cc9c99231fd48a81e4f8318a88735c35b9f2c08ad280 Nonce = 9f1fc151bcf8fe18bde1ac505737dc6868c34be605bf2ead6ae3294b Signature = 1b51b8d2d3eeb3d6218da3494714d0e88cd7366f387e6ede00f653e0844203a81fb38f57505bf83bc8c1da002a39e81abbdd2f99ab6a4d65 Msg = 40d4d9736b54993c1bcee7071c682390d34d47c35f177939ca5b70f457b3458fd5eca4cb03f0efe1aec10bf794b841216056a155dab58a3dbfc19ddf05d45861bae6eea2bd7ffb87a6fd0fd2394e847dc36c94c81561dee120779bbecbc32206327febaa17c96505ecb97d560c934c386f6f766a2f5154f545f22181c19fc698 X = 0x5a050bfae63d347d64379ad01441b0ef9ab06ec5842c952f7a1c29ce Nonce = 5de3d5e6b78c888ba4185c1547272fe562b44e507c871a0524765aea Signature = 325aa7b173cac96d5865aa50ea54e5df45a10e72fd5dd1fb265aae090a7203f6b8fbf668b8f6435e929fd52f52e23ad4b8a156ae5f3c9c47 # [mod = L=2048, N=224, SHA-384] Hash = SHA-384 P = 0xa6bb5333ce343c31c9b2c878ab91eef2fdea35c6db0e716762bfc0d436d87506e865a4d2c8cfbbd626ce8bfe64563ca5686cd8cf081490f02445b289087982495fb69976b10242d6d50fc23b4dbdb0bef78305d9a4d05d9eae65d87a893eaf397e04e39baa85a26c8ffbdef1233287b5f5b6ef6a90f27a69481a932ee47b18d5d27eb107ffb05025e646e8876b5cb567fec1dd35835d42082198531fafbe5ae280c575a1fb0e62e9b3ca37e197ad96d9dde1f33f2cec7d27deae261c83ee8e2002af7eb6e82f6a14796af037577a1032bbc709129caabd8addf870ae2d0595c8fdb37155748f0dea34b44d4f82ed58c2f5b1b8481662ac53473c693410082fbd Q = 0x8c3ee5bd9a2aaf068bd5845bd55ecf27417055307577bbc3770ec68b G = 0x43b5a6b6d0bb962ec9766a377c32cc4124f1311188c2ecf95c0cd4a4fa097225b7618cb1276c474578d3bf564c145199c092a1b14baa929c2f3f0f36e0c2dae91eba08be30992a889f2952e0442c37af484a4ecdc3243ccfcb9e3413cf5cdd6630b09fe17efbfde14d8725493019b7b73d1f782b48ef30bec36e00e02ba336d2254fc202a69612cd9446f91d76b739ffa6d8b86052f8dc5f1145801c56241af5ba9037241bd89e6338b58e01310671c268eb5e33acb57d1f99f16440a675827d4017754d601a17ada2fbedf904554a90b01530da8c93cd14ce293cb2bd3e7937e934b79e310fe4d80c13f92f63381355bd80a1abee1a73fdfb6da24ef28002a3 Msg = df5d564db83592c1128be5d29b7036880d55e834a291a745ed8dcd438c4da6b1b9f39412b2c5110730db83c1ccdfe9059dd96ec7ea2bbcb34e3eba72ef0a1d4721c7c0221e29279f014d63facc5bc8f18c539b92ff2af89e568225d6b4cf599cb3dff5e3c6ddfac0a27f10f636ec220abb72630bae9a39c18fd3663e4651ccac X = 0x4efa5136eb6aa74e92bbfc913b0bfebb613db7a47221fb7b64f42e6f Nonce = 7e0f1ce21d185ae65c0a00395567ea9cf217462b58b9c89c4e5ff9cf Signature = 5ab43ede66a15688146d1f4cd7164702c0c4457bd4fddebac04829536c58e8ab27d28512c46063c96bf5bceb8fbad232d8f5b39c4755d0b1 Msg = ebeb9e2b692ec6c9afad2a0c2b908939943fdf4bb7438e3bd9288e7681984087ffdcf86502079c291236d7f1adb504e67e0f88bee61b61717014cf06b5fad5cb36f1b223b63912cdcd2b9416524d37f5d7b05c37d1789669e141aff6670db2e0de31673b2055f6799ac887937e5664a659ea0254a8d4ba6f204df2a38c2a77e4 X = 0x1c84c5c065ff165a0e1d276c2ea9fdbf8423c12aa1c73844d6c64942 Nonce = 6f399d636570476f7a2013efdc74a1bb75f5b35ce835079c4e19cc4d Signature = 82c3747a0658df006a7a205a6ae2aedd5d2948488559fc3cfd643a648636796df622d13f070fbed4184c8138358c21db30c606b8f9be521a Msg = dbd2516b03fdc58b32c0233080ffeea41c0d9c156b30332ec42be5e10584be3e3db85ffd5b5bae16fc876a0c9217627d84011223fab57d176def61e40d912e7eeb2bf868734ae8f276a96ab13de558ec42614167c5aa4c60357f71fac58980e579440f69968d2280bc970d0066b5bd6a6f5002481510256b3eb21bbb92ef2cdd X = 0x383585098edd867a8522dfad08997095aa23539b9c816a5e28359b51 Nonce = 0183d11f1597ec9db32db21c1e910fa2be2f276f35d0583ce8b8f6ab Signature = 040405136a1220adbb64ab751db3307fafad5447ab2d9bcc52f79be31d35f3269c77c577243f1db8dfdbc4cc4531574276f0da1f7a44acd4 Msg = 34c45435d0cc29269272a93d43320698e454a7c287db9d062092acacd7ca086455e583baee1276caba068fdeeb52183396d5444c5a14ad52a5c2bc082cd87452aa8f9b23056b5f8af2638d965ef4fe6e4e68e88b0f50e01248fe6a6a1d9d6d93b03cd55d16fd83cd4e06763d926f7c50f20f0ed6730613f0f4db571e22d288e4 X = 0x0f115fc7073262e2f93a9d46b407b0f1bc29292aa09cd1a98a34a219 Nonce = 835a744aa418a297b7e11febe7f3bba590752e58fa1ae12ffa3bfacc Signature = 66481f241f6b443148f0b1f2459be5ca16413d947d0981628717c1082cdaa73500d0ad291252d07ceff9cfeab87a739752291eb5dcefea87 Msg = d7ac5cc8a4c3f38cfe5c0e1068ea28f0f95d3250d1aeae5f66bdc4d22e23e246ff30429cbcbad3b02a62a0a179d4d107130fa3a780c0092c329c2b026e12e6735a75c495b097aa69ebe98a96ff891234ff379511149e07c6e2411e58976ee93fba7d3d570c911f6f208375783ff5d947a3af0c839d210a8e4a8c8fa41efbc57e X = 0x5339ec1f86a0dfd81324fca6a0d3e102b12fba8fe8c1bca45d8ddf10 Nonce = 7c62eb8fd725a453fdb2d1e75bbe22f0c5d27a5835135c788061ddfb Signature = 5b6be6bad725afa442f29ab7d343d2f8b4b4941cbd23d69164b3c5fd3a1b94634e313fc4df8292e038c6e876336cef88d691b894c0eccd3f Msg = 7a96873f0777e8ada9867532ae5f51938bae2d56fb471e0fefa693b71a2aea2571c0108ba59e634401bbaf20a848ad8c305848420cee654a3040007f055d4e975807894b5618b9392363bc7f8c88d526bc491adbd892a93751a21d137ceede8a04423a4d0ca1557bcf334e4f855b04474544212929a81dc71fb3fc41f70d6b18 X = 0x494b68624728aaae9898c3ca22c1bce810a052e25c881a185af43cd1 Nonce = 065a3ebed489d78ad676afb5373c7028f843816fa97c30169149897f Signature = 76bd6ff4cdc4fe37f6705e77efdcac6fbb9d54fc0b220643c662acbf8a124a3640ad73280f305afc2bc3e57f7a2e074081be7bc90b5b1faa Msg = d69694bf9a93ac0cc3915973d40e351247c3bcaca98069cd9c1e7a3c5850636a592ea75fae7bfd38b1290e3f4d0aae8ee689ce4137ea868aaebb17dafb255c4a20e0fac1f4666612f90c46320a62002ede3167a34dff74a306a0842427cb9d2c61599b05c67b673144f6c08232d771f2e0af38253f36e122870e04ebc54a512f X = 0x044b1bcb76db64ab7500741f43989d3d878991788947b679bf22c088 Nonce = 4707e611f7d2dbb66f5ff083bab786a525884b49390213300b088fde Signature = 108a082d2bf6358a737465624320c4fa9d3719744c2db69d18963d75420f3537fa6858657db7a21e72e11ec0ec8cc85a09a0d1a445944980 Msg = 17455bfbb128df0f96544bbf83ca0ff374bc086b2de18f74f59049f73eff3c8ef32a48429a4038256304636f3032192795ba2807407ef52b8d59b40bfd517583f998810279c0211771d9e54f2b84e898f9892ef77beba33ff31a2868693f1f0978b89895e350d5ded259fb1397e9c6989986452a0d77df99048fff84b6eb150e X = 0x2bca3c613be53a6aab121de91db4fa06b468fc6550c82eeec4bce9b1 Nonce = 4b528d2b2bdfa4f2fce09dc9806ed5302e41cc52f35962653d7f222c Signature = 423de9e112ec38e3a034f5d9675c76f9dc8536b30d05678a2963ec1674051e79699fa44de18e36ab116873593a310e4e09dce18b833fc2f5 Msg = de1f9606261ff82218c8c145aa4d5847673b459eb55fe7e6454c0443266bbf800c1d09051f5e3141c4370d1b990cf5fea9d2683986c3bdd2823107829ace6ed7034caeb2f657a07b25b7d60240a0205026c2e3018141d479c07787a14e702622f8e6df709b636c6d3d0b5fd54f5516dbad97038e5c0eb31f54db1264d600efc6 X = 0x366a49173a1783b99550d84c7fa02b6cccab12ee9a306bed7bb81ba7 Nonce = 13894dda6721bf3af8a40603a3d97af240976a8ecb3ead998eee0ff0 Signature = 5f3839eb663f026f792912d1cb0b448f5e2e593139001e839f71c9426b07edb6a034d084a61bf3c0a36e7ee6911948ad8f6e50ac6844b1f3 Msg = c1edd86151af66c6223e413f17e734b2bc024ff066578c55308f1388a91ab87270cd25ca2efbc2867eb715ebed6d10012b6f4808f2de1986ff7f4c369daf46c80a618707888ae3f86e38e7f25d6caa509104d4851cbeefbb75692aad499a33aa35b11409300e495fe007524b4af2c20d33f1c8c04516b6973ac1e07df3f160dd X = 0x841ba91e273f1c57847ad336cea47c643335e68f611482a30d6c0bb7 Nonce = 5ed84fb90761dc03a5e60f3b396d6cc7f8c16c77f065a6ec0049fa51 Signature = 836d84d86271e1648466d1955c2b60b2a04cc021405083626347aef963c7eeb5e06e81d8923356f799810a26af67c0faa18b392258e4a9a0 Msg = 2b5fb613598c02916bf6b4b0fd7a6b5426ac5b56954392fba32de00bdf4b70953be196ad51ff2c097a81e6ce1d17cf837d2444752be92bd4a9d1a8b41327527ff6bdc0e5c3e0cf46f7e37966aae18a29ce1981f212d714dd6c0cbb410d3a5f3d006ba9b593da150ce422b5cc420f3b561bfdf11dcb9910005709eeb129e20665 X = 0x220947396c2de85d480bae730298df67283d0d0694950f5efa4ea5d6 Nonce = 2697349761cc4ccbdb4550bb9ca73654280ade31f577ef86100ff4cf Signature = 7b455fae1002fa87f36cf6f345716225d4aa1407802af4082bfbb14a235d8be4ceb0176f5d0c47c1199afc7e3041c7d7508b9feddcaa0d74 Msg = bd7d69bcc2e4f8a42e627fa21c7fa9fdd3e574b6dc5ad20217e80bcc9997b4c5efb31c7b65dbe8a0a394f0af580387b9917888152dc4f63ce52d3ec4b723bfea8114825f9f1e259f67b5d13bcaa66c97de725fae4ad247bb922497ebed0f092bbac12f2cbd9b71b229087378e8be0626b8d5e8950b0a6e69e05129f0d3842d27 X = 0x42777374114519bf323bd03b6e0ec238660dc863b1a3b85e0cf8f8a5 Nonce = 3ad0d788fbfaf4caef4beec9c1566a8c7a1de26bf75dba82a8243270 Signature = 16a2a48578a0b5b57553cd20005b7e8400e1061c4fef20d033f72f8a6c34d176e95dd49271ee48a3802edf4238401084bc3930201405693a Msg = 7766e1ab7638bcda3e6fdbd4c85b3661acb2763d411376b2eedb4b2c6bff5d8fa20c0ae5b3cbed20796a6d8b81a1096dc36a39826a18ffb897d36bfb16363cca7632ecb71d2f996cf7cac66669bf4c83114bd53be3be3305efc99d22769188f84289cb1d11501f040b85d15890d29af2c8eae614f74beeeeb5fc915afa4322c2 X = 0x364bdce93df0eaad45ee0ef5c18828bfe2e381db607e5b6a77ffc6e9 Nonce = 576f8454ff45df954d123bd1384cbe004413c8f85493ed7d6425bfaa Signature = 09c61878a9917177058e9dff27106bdca7d06c500e09099306668cbf7b8b6c4c5615976d7a735ac3e184cde96154ffc87b458924d4602895 Msg = 84095278f7f1d578e798399af0bc9f4695f9302ea5972479adf90c95fc25d59e576d97b89b73dec629cef05d6173b55d015a3fb1d8191ae540d552409b03a7a8db511bad0951896db949fcc28870f9d17314734ca6a3472683d02fdc8defa7b9d3762ae9357ca2a6ab623b046350fa211d5213787127d2711cbd91405abbe50d X = 0x161fff26a7b9d7ddc15237edbab3c1f99b7294c70feb96f962df8973 Nonce = 7cbe0c1c29b955fa1fdafcab79c02177c15ec5789a4dd53a6ad29ce8 Signature = 0c4d4527815a94bc2d77063ea69049be6a2b3b3a3a0badd5e62a8f9a5787ced7081fad3fe19ab5b9028e9e8df18639e4991ab6e1e243416e Msg = 30eedc9d630b632082c196b969d24f6eb9cf1b1e2c53d244e8d8b50a40982ab53c4d57ff995fa8458908a743890382da6513cfe9c1991824873615a8a16374a5e5dc2fab3f5cd25652ec8aa3939f4884f74ac737989b6ac2e43f45b885206a31e797fd8576357e4b4baa566291815dac2f546f4abf8ba1de1120fd804284e959 X = 0x0209c00edad10594f7cd7878472169d512a7e8dc3fc1cd69285e69d5 Nonce = 36454e085b6b3dcc7c755b65ff46697b099485abd6ceb00cbf5dceed Signature = 45212d1c8c128002fcb3ce35583ff8d08363711c1598307d9ec6a1084858105649db5992764dd32b102d9b9d2bc6af64c6a81595611e3e20 # [mod = L=2048, N=224, SHA-512] Hash = SHA-512 P = 0xbfebd000b2d6cd4ab38efba35df334df721d6c2f2b3d956679cbad009f3dfbd002952cc899cc2356ec8769bd3d1ba5a73023729888da92ca48a5ee94c97f4f04a2e3acb4f33a2f0fb3783c31f2c70fa7c70f38214a27dadec8b12e67996a9e85ee3bb148803130147392dc5253c04d7063535e6cd646bfb186984e08b58b74a7be5b333bf32b0abfd5665360e9a923a0c528ff1c62c7253458f5678528719d436e50148741f45dc7dd2c6cac71c55231f12a83fefd2ed0a33ede1b8a51f566fcf7890682cdc1931dc207c92bf2ef4e28ab31661eeb77f1601eea941c9591f038d3f00d912857db05e64b2ad569320061c6f863ff3354d842e7e7ea715afef8d1 Q = 0xaa986df8a064278e9363316a9830bcfa490656faa6d5daa817d87949 G = 0x8195ad9a478fd985216ee58368366d2edd13c12b3d62239169fa042d91156408b483122f44ed6236b8308a6cdb52f9af3de88ec89e039afad7da3aa66c1976049a8e0a7d18d567baf99fcefe315cada01548386b10b25e52f52ed78eb4d28082e5e1ffee9480c4fe2cc4aafd1efc9d4fd2cc6d155968931271ef15b3240e7fb043a80c8f628befe09d645077c1029d21e0ac8bf0ba9c27714d1b580ede594aa01b3b76f6e745fc1ec07db37e2fd7e98c6c8c6915228e422c309de9f5db168f50249d1be1ed3298090808e2ebb896bb79b8c4cbf94d4c2064e37e612ba4449d7ac210edde211416d64b051dd8046ab041732665411a7f154d31b3e11a51da7fc0 Msg = e9f59c6a5cbe8f5b0cf75008d06a076a6739bdddb39b82143cd03939aa4738a287c2a6f31829bbe15f02cc2ee7d7122dbd132825970daddd8a4d851da86e7edc8940cb1188319218b8e0248a103eae34bc68d85f5a32830d7e5dc7718f74db5e4224c0debe1e841e1eea1a88fee0f85d9fb087cbcee55f86037a646e38346d2b X = 0x6a5b4ffc44238d1852fb9b74e4c1661be85984043cfeee023f57cac6 Nonce = 9ced89ea5050982222830efef26e7394f5ab7d837d4549962d285fae Signature = 9da9966500de9d3b6b7f441ca550233fc450944bc507e01cd4acb0302d72f1f6681e867f7d8beaebeba4bc5b23287604a64cfee1c164595a Msg = 971d16d111c96de0f7098b256af213f4475aef31007e12e2974c5f64b2f335e0183c196c33d50f6445c5f614649549770b1874dd0756a9a8e39971dfecc3f267ebcc1f5301703f88743b0f376482cfc06d5948bd7926d96ec4d731a44b0c0eee5e85da26687265de5a66cb1a73a7e4f3236f60647bee5c163340e19505577cf6 X = 0x9053ec8ab1f9700c2ab59259bf2e07892904f03c844cd58a7ff59c79 Nonce = 901632e0b8ffea7efebe2fc9ea0d1a52442817fe1e1b5455bd39a687 Signature = 1f44f6eac218236a1d99cf7625abcf5c964b0a0c5d88b8d05d74a3c071015cbe8622d2a34fbb5e7cca8c59e828adee71f50524482d9e7904 Msg = 08ea09fa5efde215bd8b3c4d6a9c90ee9387ffb7bd65becdb88b40132c6384106aa619b7c66ca92034d284608593864ce6b92877112aa139240cb44b388fe68a8fe0501ca584f6a2de27c0fb658e72bb13fddb8d039a6bf85d63a6c073b2668013ce8fe589a0150e46d5b1d9b0cbb5a14c100ae4b20d6ce81a987a50a949f434 X = 0xa2cdf2515cb098559fa13cb70b6a897e89df120a971064bb377988ee Nonce = 077b3adce42ba0622772eaaa8cabd16107c92f7a134c715a4dda5ebd Signature = 6c03637d253a8dcd0907d6de93926bdb3e1ea3135a709da2309a8da6236e5163f2c2ebe0eccdbd3351e4285531a4f53e45284e41db37e266 Msg = 957cef163b16d8073d5d3fe158fa0c7338bd107c6a653cb0f11ebe41402607b822abe30e36ca9ee4c9de00cf72db97f57d78f3db49a8e1093285563c68b0f4e124830b9febfa3e75ce2ea59cba2cc6d71e908b5e6d8f463954922b82bb55a69fb2ff143ffcae6b5656143c8b6cc24f57b17cfb020f6e15bdc5f25436d07b7f8a X = 0x15ea86b973ef146f03cc701b17b589b0ffdd318b64827d49ee3c0044 Nonce = 9af96c995f0b7b8283e2ea288e3c3a6f751a56b38041297e2bc34cd7 Signature = 150362da792701694e23f0b0a9b7035437cc8f4faa45c6df8f7982fb6df4321c61738743a9fe78ec76b4952692aaa372d1c8530fba0fcdec Msg = 204d9cde24a2f0de02aff020f6363fd68f70420dc1a9b5138216201363f832da0aa801865a75a243427d9d6c78dc5e6041b27d033660e1e405abe1be27c909994bd6fb57180c3d6b498ce8793bee8ecf51e06b96411d00996209f44a380926c7b195e84e78f01fe02e0bc7032ca462a5182683475222f9dd8f3ade1ab8fea318 X = 0x524a63cc5acada8557609a5f0d88fd3e9c6e63719704cd8bab8fe301 Nonce = 028091483753f5643b61e4093a7e0a5135d71c5fa318d6e8bb0efc66 Signature = 9c023331751c79d5da355bb58e2bbe2e973e3e4b4f52743ce1f1eec296ad0e8ca90627fb7ac4540c9b58a016ee6c4e0a6f0aa1e7def81a51 Msg = 1e4e58afb34c5d6f645a82645be358a2e228cc7b9c23dd7f3aa79595814d054b923b9cbc6c9e6c6f94848c1a4d215679023a96976a44e9b59136241fdf26f8f71fe5a9bf366e4912b5931e1c8f63c37fae2bf1d55ba3943a650bb463cded9a7b062ae55aa57d9c5ceed323fd9a7555e48b834d3ad4441c35d9e07c7c6e4d5d0f X = 0x33b25c6bbbf816addad05e48b72ca560c5191214d903a978b6708a30 Nonce = 989d87703853c4133b6d273686bf672492e90ce2a91b3c72a4188a1c Signature = 0434ef1c127207d0c884701e75d801725c451ce67d2e71534638b2310c625e4a334db07825a46b55da9c2e8a5f600a36b71606834097e777 Msg = 5a470a38b2ebbead08e010efef7461f6f859257d91a61e2f0ba809e28c0ea3d410e4f41477a398d593df58039c4336260ea7d8e98c9d7daad0c31ecd1567c7db730179e2a9a62007bd56f9d9da48deaa657ac92293e5bfafbdebad1afe25c41e1aa09db61fcc191971c37549155b3e67956913aae3a5f6245cfcb9aad5dc1e15 X = 0x13411c1a6fe0063e7f9b2467ccebf2be5cf30e742f9a35d715558ba7 Nonce = 7406254d3cfe3d55267236ff63b0f42b2e3b55d1cee7ed1ca3f06ce0 Signature = 74dddfa35b25d0c0b285a5d21719ee39d6e3f443445ceb90556b0186474865d3ef07f5df49e0a6ebfb5ab5c2ede47c4c6314be4ccf455e21 Msg = 0849d67ead3e8c44ad3b2f949be1cd9f9a4bf8b5785bd00ca66038e9a8b93727a652a415c1d8a1ecfcad77782d87d912623c2fef45b2083ec0f79a264ef7c5bfb76fde5b22b9845392e759a1ec05fa6387ccd2943ef1277c2e060337f82aa562cee5bd7c158258f2e779d51e47e000a7b0706077490976a07763e2efb275b5bf X = 0x5631c7dfd3f5adc0b7b542a8d121a07bb8251b6a1bf3a8cba771c724 Nonce = 9c353ace0ae52501bbb98a2d1c9e28f3a833c2b0eaca49cd12c57ec7 Signature = 2aeb7fce1b7764d32cfb7d85254ceed9f3a6337ee8dab42c8ab7a41517cce13bcb917cdbefe0c566318fc974204b700c5cddc5b2b499a78e Msg = e74639f2bad42fd6393f9b350d6e19cd4c1ce0f41e8c902684ef6f86790ffc8311acd9b57d6521e80339b3243f6ec6b01a06ea899fd75da91e1080fdf06129dd851a895d74b1efb9837289c11d68e1308c47bb8c59d5eb895db53bba29102a5b48b1e75c73387ff22e6c0461196a7d48615ffdb9c8ff4ec6587b4f68d260ad86 X = 0x7319bdf79a4c8dbc115e3780c818f6e2a3243ab47263e84ba259bd3d Nonce = 6defbce0e72f014526c8ab02c6fc320a4bbd85365d99fc5d3423fa4c Signature = 515b9ce53eb10c3e47890556e0f0fd19adb207b9c01f12ef5c6caaad0900e3acc4c378bdfe9cda4db8f8ab54436931c73d8d3171c6dc8bb8 Msg = 4a145dd5cc4a12ea43617ec9790f1038190ed3d8af24bbec14da3ecf5f387ca9764a8b9cbc5f6292a53a9da9533c751140f8da5fb6f3d48eba1e7b98662734d9a8b120dd515408ba756f75a5755212764ad92c3f2263835211add5b4cc0eca8d4fc7a843f49c38ce80868faf8b498fb414d3080ed41e3674e285d3e40d62f305 X = 0x7944fa1a2a938ffabb234ca385916e01a89220cd16f06a474b9d4ac4 Nonce = 8ab9322319a138489eb773f3220d712d05cd14eed9aae402a8aa767b Signature = 5cfd4b9f92ca727d513ac14143b125148655f1642c53b73cc25131c92adef94aae372d579c99629ca0786362cb0247aa6d99957074cd7d43 Msg = 428a20790cad1c7ba82118ae5841bd5380ee50be5b64b8040935ef3d6da37a26e6f02035fb1937c7a6bcd88c894fad7d8aa48abb89e0c64287cdc637454db89eaf0a7e692734c8a243856dd75690bdcefe554e39a0df84e6e0c96b2c5774a3e4e2afed028fb43d7998d3cdc9a6409322cf3bfa4d1e36f5e707203b59c49a753e X = 0x43dea1b4e5c2f22548074d7dddbdcb94a235a3dbbfdb7b3bfc5923d3 Nonce = 5615520867828ae7dbc8e9b116e7661e18f09e5cdae17518ead1484f Signature = 8a96c419e0f391daa29fb162a1b9570f48a00810aa480cde0f27cfb0028ed9165522fc59aeeb79c491a95ed8427fd1b695f3dedf4228a328 Msg = 2a07e28fc102dfe17c79b9368e0ba92414d2fcb407d34e903a0a53370f7d2d33aa13c02e527587718c3b39666125eca2e8fd4c94b9867fb6ef16d555549d8dd0f6e10417ebecf48f992ad84b5d9774540785ddcd264c55796bc2162898ecef4027c34187f8c0b1c20d4daa108b70d76c40ddbebc1e0f50f4dc904dbfbe6beb9d X = 0x5f4f3c4f95efb91c6b49f43afbde6d0f9b5a1324b4926f3276bc913e Nonce = 97861b777e2a8cffc4c2d24e2df9eedf0b65ea2c9373c1085ba44efb Signature = 91a4576931ed621a0342f14ee2ba8fa8e1bbdf894c1251afdf72146f56755ca163f7dc89458a7a75d4dd3ce3adec42b4aa7d04b2858c47f6 Msg = 7e96385816c97bd9de81de30e67db72436fb42faa9b6ccfeab1fa528c69e6351b2012a1097fb86d8c5cc60256ef11be18f16137617f8cdd29e3bab9468c12ae34336ba0e0eb6c828177d1d55b06698ddf753756af830a10ce9c99f1d13682668e3eb336a80618e666280096417c1e2b005b9351f5ea306b8c63fd184a59132b5 X = 0x914e5d6d95ec12443f73c127b797229544971177f645b8dac5f6911d Nonce = 7d00160fa1ebb10b0465321748eba9ca6e1b3b5216c0c51dc34b98f7 Signature = 1bcaa2caf483abc80b75f670252faa2a8e18c32301ba6fc06f37c08e909a7852b8d5c8813e17c040779ad0dc5e9e0556612056835e68d2b8 Msg = 24ed7a16782b5c34beb58bab6a7d2028719f9738e5d1ba6978efac4b53b37c88e7ea02e0cf0fd82a3e50046052a9049541d12993254a46fe401f402d38943e94918bf7a6fecb08ed1309b7b0f2185967ef289a2efa6c2e37a74d6592a2eb7401ca5e98bb8645a94e57499d362e0f3133ef336e119561cee1b558c15508781868 X = 0x3a42f9927b4eb39ee3a910e4418987d1af1ffc1f3d5df0c4920e05d0 Nonce = 23dda49474ec6cd13e1b0249ab24f50e9d69e40c6b5c07430780c44f Signature = 5f4f5449b8d0dda3ac590ba1640df9772ff08cec08528bc2d70d7ac95bea04bfd33248f26aee98ca8596774e95ce685465174d1caed7d920 Msg = 4906dbdd9da6ddffa152fa2e250eead3c6ef708387a3ad64d34a0e057459471f48752fde0786db28a4bbf58114d8dc91b69e56be3c49ec1b9880d9917c73abc895754a60779b18bc951550b957a77c8cefa159908126cc801c665d1b01109ba604bb9e797c7a37660bfc0593bab0924df5806ca803381b24b03de3d03b484d49 X = 0x0c53e5311c104f11f6eba646e4840d1960a92118204a49e3ec8ddec4 Nonce = 3523465a8417b3a05ba1032bf6c42511591f2830b55144f9662bf6c9 Signature = 77475900fc7f3e0b80f3884af8604eef60ffe484bc6cd3de123f795926ca927da0d10b43dc1521bfeb58ff347ee143fc38db451c11a03510 # [mod = L=2048, N=256, SHA-1] Hash = SHA-1 P = 0xc1a59d215573949e0b20a974c2edf2e3137ff2463062f75f1d13df12aba1076bb2d013402b60af6c187fb0fa362167c976c2617c726f9077f09e18c11b60f65008825bd6c02a1f57d3eb0ad41cd547de43d87f2525f971d42b306506e7ca03be63b35f4ada172d0a06924440a14250d7822ac2d5aeafed4619e79d4158a7d5eb2d9f023db181a8f094b2c6cb87cb8535416ac19813f07144660c557745f44a01c6b1029092c129b0d27183e82c5a21a80177ee7476eb95c466fb472bd3d2dc286ce25847e93cbfa9ad39cc57035d0c7b64b926a9c7f5a7b2bc5abcbfbdc0b0e3fede3c1e02c44afc8aefc7957da07a0e5fd12339db8667616f62286df80d58ab Q = 0x8000000000000000000000001bd62c65e8b87c89797f8f0cbfa55e4a6810e2c7 G = 0xaea5878740f1424d3c6ea9c6b4799615d2749298a17e26207f76cef340ddd390e1b1ad6b6c0010ad015a103342ddd452cac024b36e42d9b8ed52fafae7a1d3ce9e4b21f910d1356eb163a3e5a8184c781bf14492afa2e4b0a56d8884fd01a628b9662739c42e5c5795ade2f5f27e6de1d963917ce8806fc40d021cd87aa3aa3a9e4f0c2c4c45d2959b2578b2fb1a2229c37e181059b9d5e7b7862fa82e2377a49ed0f9dca820a5814079dd6610714efaf8b0cc683d8e72e4c884e6f9d4946b3e8d4cbb92adbbe7d4c47cc30be7f8c37ca81883a1aac6860059ff4640a29ccae73de20b12e63b00a88b2ee9ba94b75eb40a656e15d9ec83731c85d0effcb9ef9f Msg = de3605dbefde353cbe05e0d6098647b6d041460dfd4c000312be1afe7551fd3b93fed76a9763c34e004564b8f7dcacbd99e85030632c94e9b0a032046523b7aacdf934a2dbbdcfceefe66b4e3d1cb29e994ff3a4648a8edd9d58ed71f12399d90624789c4e0eebb0fbd5080f7d730f875a1f290749334cb405e9fd2ae1b4ed65 X = 0x5a42e77248358f06ae980a2c64f6a22bea2bf7b4fc0015745053c432b7132a67 Nonce = 2cb9c1d617e127a4770d0a946fb947c5100ed0ca59454ea80479f6885ec10534 Signature = 363e01c564f380a27d7d23b207af3f961d48fc0995487f60052775d724ab3d104916d91b2927294e429d537c06dd2463d1845018cca2873e90a6c837b445fdde Msg = 49707b655b6d168c70baede03866b0fba60239ad4cf82f53b46e11b26fa8f6276ff6687d09e8ed1e5d963c11e4763b2e59a0927f01e8fffd1894a6262327c84bbb4298d7d7fbca660673128bb7dea46178146485539f9a8f88dac761d0d5d45cb557cdac960be23dd9199acd99cb64d1fee2ca68e423461a02abb34c1dc45011 X = 0x62177a5b2f0b44352f643a9e69c1adb4a0b292a5ea52fa8065e94ad043d46218 Nonce = 2bae4225836dcbbcad976ed47ecb5f3fc05439358791be244e74d2cf0617fc26 Signature = 0fdc5a5a4a2c2f3df50c868383ba800396ae25265be1a14762d3110cbeb348194b41841cad45fedea5aad0a16b053e88353b6f0102df74c9fce09e38f5e6c277 Msg = 763c1f15c5dd8a93aac4e048651c4ea84af18aee255b56959eaeb1876699be75271af0da6c3ca936e99be4ff4436410f69ae7018b6c843dce9d8b71a91efa53c39be55f285fb8ad8543952fd3ca89271ec23d342cfd557bfb72db43b434d0ed5b30763037754bb0f782ab08235a64abb7f0a828f892cde7e05e301da7c21c096 X = 0x5d169761a3887a9eca0f7e59d77b75671ae02210006e754bf2f12091fc3275b0 Nonce = 66011bdefe8cc4a04fbd5d69252bb72da8f9a8d6e00bb7ca75719133ecd86f1d Signature = 76e9b6ef7e8d48fbfc43bf465281592223fa7e0d9978392d355868c8a20209bb7f9c8deab51c60bb6f866c76450138e0d2946aca6c5f88dfe35a0c1ba493ee47 Msg = 67851de982fc70f969d82f65d85b0332d667114f27b58bb9e565d2e40ad011983d936049cc97a216260fa2e410ad6d6c98a548759aa8e2d022c1fbc1b16b10d83fbbbd126ec43d5fedc407c831461c7f33ed94740031ecd0f701c7b1df88a249265b3f60c38f4285bbc9bae164bc38e162c235c9a9dfc1b150eaeb1482ebed48 X = 0x4f3e2c5901b656118d88a47fe2bd52f85cbf828dbf9b67365e2013a937f0f2d9 Nonce = 72bd0808076af461353d98cb0191ec76a7c04fbe3a7f793e390cc773434c1d4f Signature = 763e89fc8b2a090b75812aefa55de7b7cd61ec3fdf8730ce16b05a7b9456fd2d4a97086b6717a73a6be6d4a95b8343bd20b0d7b51c3da1d86c5852350871379b Msg = 616de9dd23ebede428e032db7838108a224f7aca57b1df87f031fe1d86083d688c5c3ef078e64d8d5a9e612d3983460ca1f816f787c03ca43a1fd8ce138655df677056364c0eab8e0493c07bd4b2b05022190932de794f195dbef297093e7da1c4304db40b63ca53e1b8bcdad913d7a902af025c367c48de387f1a9bcd7ca42e X = 0x4d0240a34dd45aacaab9e24e4838223ccb759f1d93fa8791f28fc7c2e8318820 Nonce = 325e19d8b7ee8c8d9cb7e70bb5417035a8183bdf73149a45f0e83f3af68decc0 Signature = 748f466b7fdcdfa77017c865a33b1dad4db99dbd63efa1c87345c4833b0632ac0bf9938e7972ebb00fb0a3c0c2476d2509db23afcaecb17dc571905317eb8ca7 Msg = 115f0a8be34e84d09bdcca69d19ce17dd67df739aa4fc6e8077076535f39af8302881471a5fb0e1839a3aa76dfda4bde2f9fa25fa582b756a4966d75320ac1995472271666156ea86c19a239895e5578a3c39b0ba3258827a01df1f30db22ddbc267c9e290d5d457d0a94d8aa73f8e79f3acd31bdeee7aa32c792c22acb807ba X = 0x0800394a2ccdd1f55800565374d46be9bbc1190b55eee26502bf5f2459ac5cc0 Nonce = 617d00444047d8e943e429947d28b4718a8b7603475e5453cacb80fa704f90f1 Signature = 5c8d76440735055c1b36698da73903b332d64ca5603046144fb7668b1acac33711c54efbd492a7147a1c50b287377b52d2193907d5bb636159c15318a480ca6a Msg = 3c1f2b92db1b4315837baa863043a9b4496a78143ca74f6e67181facf50a6e08d27945d00e7b06f9c57c0e2f1527c94bcecea6993175d0f09bab4f15af55ab7aa9b16b48c94a6a99c2d7e477b744cd27cdb9b0bbf810756bc6376fa15bfbea3c9376ca6979752fdb3a655affd6c0186d1a34355daea8cc75acf96b8847dbdb8d X = 0x59edd0348ca6a85c408816549e9c58338ef92f56edd8fa753226acc0e181751c Nonce = 0a96189b8740005f215ae5c5a8aa8686dbb4c353d2c55deb3904bccc4f9a9b9b Signature = 31c1c6aee7ed541a281f37632b27ba88536f36bcd92fcc360da041f4197f7f9545e1019b2a1702b5df1eef4fb7df6a53aaa66ecb8be5cd2e28b353c870e01f41 Msg = ad389f53235deb068f7097780330746493607fdb7e1170bd1fe0da012714b8f1b128c69a53d7dd2646b09720883e2387dd15d46564adff6642372c838287bafa5f4343a27ec8069770e5c367548833fddcc5f8617aaf41289d96dd40f1098ded9fbb110aeb14d69272dfb2dd7d75e7a88dc4147f27c64eb1bf0aa0569bbda320 X = 0x19ff4eec2e47301d0b70a826dad822b609c997bc1b3a9d7cbd3d1d2252e8acda Nonce = 7ff51bb8946842c7e2f7245e73461e2b0820528548f7ecb53bcadc7a20e826b7 Signature = 2f9484aaeda9dcb88d2d3644db2c58eefe2e7695a6c8be9abe97173efc9c0bc30166a7bf4e8bda6b86396943a74a8ebfc603a85ed287bf3f5a30dd0bbe49cd8b Msg = 12f9582e3a1a76f299d72d9b1502b99060802660226bc47b71e54ec9388eac325902acbe2bd7109e19f377c9d2b4d280cdfaa48888b9cf4ed06ccf5ad866d6932d402592f6be6e6876db5a62beeaf373b60238ab96829243759bdb586f45ec4ae2cb22248ab0b6aa7a7583a61dd3b8f119cd840479a4a9af8a439db904ac14ec X = 0x7142b195eb2417bc234cf32c6fd7cae470cb48c74dbdb469a264c1988eb3e52d Nonce = 1043805a13045a36e1b6498db97d163571c61cc4a719e506173b5e6df33fc81d Signature = 38cf6b8cbae82e6295f83316a9c49d2dc7c92cb90b19a2c2d45649949354d930356a5850d07aec6e9d4a4d7f79d9b0352b087d7ef48394128c5ae4993e8259b8 Msg = b6ac84c49f6bd601d5868ba06d49b8cba87a9d6e7905247541fd332c2b0374cf57d4a0dc0b5a6c3f8f7e24be3a1eedc4a8c575847c02e4edd4745040685670058996250f73e298a43b391a4ad567f0c9bc4b6abf6d1e5c56b22f4eab36aa1a812a1dae8d2873cb2c2a521d320019c7cab1efb11fa4595c534ce527d43ba605f7 X = 0x1332c3c6e2d1b7b16f501b6d48c7b866628f0c82bf33354535df99a843dd68ce Nonce = 167b97578e52869f49730df464f7e8d786594bb830d72db9af2cc88324ded288 Signature = 1d600a745a1dec933868dc535a19ee9f1af8bf09b5abee15dc4f7cbcb95ac8c523b81097d583342ebe4aed364a7af9882f74e64518aaedce346c91d6d7ac470b Msg = a92e2ddbfd18cd307373fcb39dffc33e0b91a48c62071f2f7a8e50dbf2c290889307975b6acd642c8e3d3444acac98c22ed06551fec5dc7c9f2243b681cc9fa4fcc12c318237e9a5df0a77ac22402039cef31b1e623af58212a22e7e60419bb36b777cf6ce65dd1f56963eb28b7706f137c0f7363a002d827e45badc20233c16 X = 0x119ab8a63a22a89baf4eb8f016dcce9423d5f40a677b258fab072a8cb622ebe5 Nonce = 77cefd7a6b0fcd0237ff8f51c458e5e8a79116eba6f11ea1af7f29aa608393e5 Signature = 34a65e99bf01698b5a68f215b9c292115d17b3c202ea1fda17fcd8a0cd74b6367e67d442b8f9ac2974e84ba65aeff0df5f83c271ece792a8dab9c4aee87bfea8 Msg = b5aa1cfe2348d57f0e5333fc70276d2418ddda49122f4a88e8010f6f78dc829ba5c7cc68db664080945c43eeb705c2ef13de6e4b8f4de1d04fb33d5bcd7893d8ca8bfde38c9feca6c4ec03b2ce7b35ed60a6a43f7fc9ed08061a099b3eeeae7f0f1516149d175a953f52c8c518f3ad247c9fba23f1f829d5cae62673ee201ada X = 0x4b75db034ed0b84dfcc60b493a00940e805feb78575fd256b24d146b05a9500c Nonce = 654aa8be3b7bfc32f9b560b57a88a8aec1cfda276661283b7f44dd3b0944c20f Signature = 517f7df4831fbd01908b9218b17ae1c40e00c53404b3bd72b64f67cee75215f21903434a727c8ef0e80a43dce2834b807839ef43c22afb502b35a381782bb639 Msg = 27aa81d2bc49601c3f6bceb0870bb55dd10e7ba6d1f8acada70b5f902a0f4062eb93ae72cdfd3f943099cc2a10a3da7bdc9f24b00bf36a29d75136af10bb71ec9c1932058e22ec9c0600d173d37970d58ae1f66cefd27e2905afdde4223979b4041fd7d7166ea326befd5dd896ef47abc6d045c1ca23c1953a6e12cc3c54b4f6 X = 0x7e6b77d4bc9220c3352e91abea67e33a335ace34ec4516646e8a4ff098166ff4 Nonce = 73c28bca3c8067da792f6312153b298a8f714cad70bb2349803b6dad024f6bc1 Signature = 05057a982ab4a2e32238ef2e3edba07fd193d90c5f053c83a9f176e21a9d520803c2b26cf46b7f72691a72d7cbf33653df347f02b0683ebc6cb7ea7e72dc8a0a Msg = 7527533f2d10c18078f5a8dec350cdfad06d3157871e4ff7d7c2b7ab11dff232d34f07699278f075442e1d4ee00cd6e87c1931333841c399576f4e587a251684e731f7c8369f712656bc1e6c2d209f511179da09368d93290e058e0ce9b6530ac6c5e4cf0a1b22d588d98f32b34e85206e09aac04a0e1f2ae2a5cfdac4e6e2b3 X = 0x40792e5ab46518c6ffcf5357f0c5de5d9e2de99c92aebea82a307ab0f5ad252b Nonce = 0c9fe826a7618108684ba2d74f10ca39168feb85f74d2737fd12d18cf27a2f16 Signature = 6aa6c4d7afda30ff2d7178b52a3e437ed5b0745a247c9c9e120bd3e833a1dfac26e0887911bb5edb6a566a2a1276353391b1e4ab8ae0b259c1bbb3af3d85b439 Msg = 994a49e5e8a5698fdac9a7faac01fb09b2c6113a186677676d11e6049dc98c93c51eb5144af181e1efbf44439a13d295653854813671f032aa62258c14195c4864afae0b5d154f97565cef075bbb6d97e34181410309ffe98b45c1f874326343c36c14f55fa058489dff3b49dc7888f45a099c3c919b25edac1706bb90f164ca X = 0x266cfbe6060134ece2c8b9e6aa25bd6cc935e49c23fdd4fb6adb2ecde63a4960 Nonce = 60f8416735fa49ab567c0bf1b6da434e1df41579699c1a92a3e70e1d90705379 Signature = 3cc269bc7b895864a03231318cf39379ae33c7180a18c08b5aef7414fdac058f6a6eb83c5fab10e34f0416628c821a6de0ad0c202443c6df032cc9d8e4948ac6 # [mod = L=2048, N=256, SHA-224] Hash = SHA-224 P = 0xd02276ebf3c22ffd666983183a47ae94c9bccbcbf95ddcb491d1f7ce643549199992d37c79e7b032d26ed031b6ba4489f3125826fafb2726a98333ebd9abdde592d8693d9859536d9cc3841a1d24e044d35aced6136256fc6d6b615cf4f4163aa381eb2b4c480825a8eccc56d8ddcf5fe637e38ad9b2974bd2cf68bf271e0d067d2465a8b6b660524f0082598945ada58ea649b9804eb4753408c2c59768c46abb82e3295f3d9ca469f84cc187f572dc4b5a3b39346ec839dfad6f07d6d1f0e215209bb0ecc05c767cf2e7943ac9cfb02eee1e9ef5946e8ce88316b5e15fdcf95a132ef2e4bb0817136528cfa5dd96532f9c3abe5c421620edb6bcbd52234ca9 Q = 0x8000000012997e8285e4089708f528070c6d7af8a0bd01409e7a079cdb6fc5bb G = 0x778453049ef262147fed7b59b0ee6764607c51e7b5b5fc6fea7a7a7b1dd6bb283f4a9ae98efd3964b1556758cb15b2a53af8619e74d85898bec77d3b3f382494ae5961a13ffc745da386182291519800f99dd710e00aeb15adee088e2798ee2e46f598526cf0f4667055d1ba009750041dc5cdd2725ff1d97dd340c8518af7671b87d39d67aeced84b66f84e0701efc82a5c9ef954ee576d24c385b14d63037f0d866fd424b4975bdd5485ed740cb932e843f906683f7c7b2c74775d901c361b847b519c0da699638da40bd736b783d2710b2c2cc26ef91271bf4e2c1929f876e902e2057164223bc78d6a2b9f6c0c7a7cb85922f7d6c4287ae23861f8128848 Msg = 39f2d8d503aae8cd17854456ecfad49a18900d4375412bc689181ed9c2ccafea98dca689a72dc75e5367d3d3abfc2169700d5891cff70f69d9aca093b061b9f5057f94636bc2783115254344fb12e33b167272e198838a8728e7744ea9a2e8248e34d5906e298302472637b879de91c1a6f9f331a5cf98a5af29132990d27416 X = 0x6ba81e6cd4367798aaab8b7af1135183a37c42a766dbd68cd2dce78f2670ef0f Nonce = 45030b79a395b1632700cbaffead97998d02bed8e0656876fc0174e4bdb96f79 Signature = 059bee9e708b7f20c3f791a640edee964e0aa672893c484799715817b3a8f6d44bd41c84a724cc86e4f0194ec0fbf379e654d0d7f6a1f08bd468139422a5c353 Msg = 0577ee4a9b8dbe3c6fb9725174e89940b27e8a989217b64417e66f396a35e5824f21e58236b27910a3be6b57d311aa778bef63dd025d9435301aefc92223c1aabb03d3d5d385b1a3d1f937f0f1f7f8baba91a011207480b5c23a78ebaea69ae8ad4373b2b052d60c5461111479591f8330123bf74370fba66bc7e2b400192c47 X = 0x7bd811cf6056c1a821a85a3169113639d775247bc6578c9eeb28d4b09503ac0b Nonce = 7ce602ece3f821390641dec7ae01b44df0fc822de1c013496bade2e3e44fff0b Signature = 33c198ea68bec4a7fedaf0309c317d336b97d1eb1f1dc44ebaf5c85c5a3afa985c9b23c13bb607be5473b32ae2b5e8f2a1e18f59df8ca7fd9303f76ed8e680e3 Msg = c643695d29b28210017aa5a7d16ebed81ba00a869d6681d1c0fe90a5e8be9d597329ea15d24ba12d77e4c3f2160bcbe808840c6e77b0528bf9ae588738e22f41910a80a7c6e3340c127b9de17945e7f9229953e2850217b6d486f7cc804e720de214cef02df4a892f7e42898f15caad26bb30bfaf4b0551aeea14035cb756b11 X = 0x3ff2653cbc1f27253400a9b6b1f064247053c9816cfdcb704b14bdece2a8558b Nonce = 356b49268eb799dc4db7781a06be0f8b96d28f6a13b7523c0ecbe70cb3eea1aa Signature = 4ddd2a1f411b570fef6d9184409b4fd55d12c5e4bddc2ac7211235873322155d4043952c108ef84a25a168ea5b64a4386f7a483366054c5dfbfc5fa98579432a Msg = 2f64d11e290275987b7d7430242289afd54f1be028cf36f8f55db54be70b8dd5ad74ae26e079d0ed31a361c116951bde94d686abf15ac5ed1470c3e902461cea8e5d58f407d2e0c072ee61567da7b353f6c47e694cd607f3ae894a9705e8ea2bf9ceec3acfa6d20b238bf0a7a7eac76c4462b7e4e4e868174a88a6a6c9476cdf X = 0x4800e9ecd9bef5a4d46aca60aca96955d8565e1b85d84dd8141d4f597e178bff Nonce = 460410eaeb111a18cf894468e10a88b8de8ef9dfd9a2ea1882a9fb696fd7823d Signature = 4fe6e2a75d9c72e81ac60dd33d31180df829b31a0dbd5fd20b7e28c4fee27d5b3ce4a06bfaf70cb6cc93f33f95a43ad77ed7ad7c77a1674bf849e9ebbc5eda29 Msg = 173c4a23621c32c3e4b157ef96b02fc1bb466a2537d3f6e51a58e510c4aef3aae4bce4c0b4d59bb1c00e7a35f98945ca9d7fdf1f0bac732d425043062bc6d32015233dfb295ae08a324ac7c1e02a117ce436d77d4e46d0b794af04b1db82a2709da1c4449c29ccba93db8ec48eb17921cb389f6e0ae32995d7fee1fa07177a7a X = 0x3e696f226f21916455f8ccc861b1845303867b75303ed92f9ac79088f56ea708 Nonce = 2837f7fa85efafb433093231983ccef5d82080e6063f67c68ff93465b59d581e Signature = 393d681c3edba28f7cb0f30593b94fc15cca659a80cfbcb3b236453722d5b40244f7421bce1e5273a30ec016bb9969b757197987548e434e395ab3de1b0e7ba2 Msg = 7d6f2a97e1eb085cb9e83aa24047af9ba30a05d7bab564a149b9cd2366518e8f199134fc2ca403947f2a614c0363ed4bc1349dc496a8ec74d880578475e47427628bb023f0272208876a3a7333307a596c158eba64ce42a3c790e7167ba4a327ac71aabad2f36341edea12ce5b2b735807b34b714a49a0aa476893578f0645db X = 0x660898413f7a71804432ecfa11cc68f85a34fdf75012c965259ea6ca0bbcd976 Nonce = 4abaf5c6f8e28356fd0dc6f096e9354baac1c2049170b2db05c81bacf02092f2 Signature = 463b1fd6ef2986f75f9620779bb6f47e0beafa9340e3e5ee589d92428acd4f2c27edd33917e49bf771f3fa1355cd3928d0bd401aa7bf0541f3af1643efd7b677 Msg = 7f8785e1c4f82bc0bb75f78d8c4113e0887e761a86b48dfa43a3683b2bb886ba53f5603c8d94a052af3671c5c1e7c232908e10faa6cd54efc79ccfd64811131acd7d60a9309729455aa70443ae8f32a34580f9a1aa7d89e5fa8cd4e95809a573ec6dfe9fe35b1130571982a0dd46eeebb6a16f85ee6314931839e3a4c29dc700 X = 0x4be0926fe24da1667d71d2abc2bc0bf87172c05d7c363a324ec61b4642777e57 Nonce = 057cca710c8e4998e9fe154cc57847bf35a512e6caf3cd338372b5becc66e8e1 Signature = 3165b1cf3ca9bb89154ad684e089364f91b6e5d594526072f7b9db3b2358e71149e1c8c34724ac5532fff1c7d243b486a2cdc0872ab84fda6cf2ba96f958f46a Msg = 3e17ea8b9feb2f4e55c103e58c4ead96b5cb892d0982ab2b0cb1eeb9e1ddde9990233a22588473421aadf52767a8df524bc6e6ed857a9fd5942ef976b1fd8bcad31e403b1febb865d2872a7b34ecdbab8b245ada45243a49c7be67aa09788029779d619de30dead9f7d8c9c42153b865b1a9e81180380e27a305a6392f4b2a0b X = 0x75c9b6c63c80755f7a7bf38eabc58e1bc2e0cc5cb4f2274f2d63058157656608 Nonce = 568b8f5049c2c411f05d74e1781be5718ff921026728d285f2a77025208dbd41 Signature = 11b7ecfeb339d6014948de5ad4c96f4ba517a2cddca611c8887fc44f14ac9a6313287a22cffd825302b0fdc0955458d918727092c7bfb3ec4c3d7a838ea6c491 Msg = c3e1903ceccb2af5b0dc6b1fbaaf1b2e96477e001c43eee3046eed06128c4c81eb2bc917aa8ac30d07e66c9a9469518e3cabc264d6936e5d724a613bf9a44d60797b890cc5ce0d04629e5faa1dd53e7a125a14a26df3cdd9878d9c67e7e18a4655a188885363ddabd73a17659d191e51fafb6d4171ff6c4b651168ce167ada01 X = 0x5feba370a58c16f34e931b65c042e6bfe794309cf30105d2fdac4d9fb3e14303 Nonce = 7ba86d55b8b5a465f661944832862baf5f565ff0d9195986c809956db2872da9 Signature = 77470f0d3923ff407e71a86f0336811bdd63e179891fd30e3452dac1e51750814b969f77c70b5e6ff9350ca25e7d951acaaee907fa7b830a32dce4f91a89afa4 Msg = 4b7c0828b715ec2da1e092204f55ddd65d13f1cdd64c109478d3847487bc48a8cb0299222a7495efffa63ea158253faedcb5314881ab41b5e773337662cc2f50dbccc736974e31b3d080467589951d511032e4cba6647f94c679aa269fca6db92715a4da28ff9803a1dc61675fa5ac114e376fa4dadb37c1b09ed5c31bc5aee8 X = 0x1ba85c9c8f4f4ae97013bc9f7fab372e733f3445fd9a68f8e015c375df3b5515 Nonce = 11d09ab8f3140f98dd4076d398a9aafb9c98656dd7185567a562cd108932eb77 Signature = 1b8b8d67b640afda26fbe67cfd4bea521375526ad58a22d4d97d7af134384f4a66d6c240992256eebe078265c3029a88c34095142134dfc31ff0a2d8bbd609b5 Msg = baea89dcc102cd649135d63a5f52df437af7840d699a9daf131eaac381348d45b4e60477fea88803fca31b54829c5806c703eb8fdf412306ff7a79b55aab9064bc37cb26bffaa671debb74c228ba2d2a06da362f613b78e5b1f0a0b5c5febf6bc326b021bd7fc70471b25e153ea51de1010b87110e01497a7f1ac39cf4d424c3 X = 0x2c0a2b700ea43f5fd589e665817339b60f837ca0b7dbab50d2ca7e4c362a14e6 Nonce = 05c7a20e6e4ddb833c4e30a564436fd66716f349af551e9943bac61572e04107 Signature = 7689b5249f1943e685095106d3f68359cdb76be5d9a50ebfdf36e731575f8bda049da42de51e617cdcdef17cdf6059345b8e181bac64c47123d47b5efe105ebb Msg = b1303768be174d83578407dde1ab91cf021124a34c4a35eafa4512707a3660d1f884fa6c3d7df299598018dca22f273f602bab371592b11f4574885741ab3fe2af5b71237d0057ae59f37b61dfd1ad5ea27cf8f05f5b69f2936ec79d104f4a46c902fb6790dfdc75b9768cc7dfbae011c795e646f9a234728707fb112c461007 X = 0x247fccb44c2c0cb1f1e58d1033eabd203d8d874d0bf18ba70f04b75bd6495bad Nonce = 0b94ed40c05a4ef445309afb5583cba8d411ff4092452c0a064dbbe6e3ccd1a5 Signature = 1800b6bd5c94a031d977b9d017541790a9fe7e414c90fa4d3803d56ef16a647907ece1b64711c9b3eca489e75f2e63438e097498e2890dd0273729a55df0d2df Msg = 25ca3dc8e6ea4ebb936fa01b1ccc08bb1de923be6292421ff9f773af9cc7393510df2fcb6ec188b27c2688c72fdc2ff6c90f0ab0ed59c9c3a6503f53e32778b954eae582c95803c511ff3918adda02e68e2c3e73f8a6ad607a89d8eba0059eb87f4d9b0081f296961ec6ea78853aa53d24a470a74acf16a2f86748a8da34fb90 X = 0x32b6f7ce3ce99770b888c1ef23a86377f3e00adf5dab2e380ef8c4298d20a1ee Nonce = 73418db52c6594dd0956d9e3616a205de8204220648addd4bfd3a9fee412462a Signature = 7b1dfcf39b624d64db08a3974c8e14173105010f2bd5135e926f2884e30b46fa697eeab669677469f62cca46d3e68c849f447881e2c9f74294f4e8ada4426c7d Msg = d58a8f5ab44f9df9ed936a1318657c324fb1399c251054986d19214c15ce951f87ccb3510aed9085411d9c5a6740df5160f3e57ea8c942d33547317c7a387c60c7ac2f0e14171f0b7719aba76ac418d157a4e3bec6b799b5da10bd3ecddae0857a29670c99d37810349b82b7bb37c0937b0dd2734da08b8b1cb7beecd43cb615 X = 0x23a1290f8acbadc352a282015713d6cf5a88e8901cb9588a57151772619f5ae6 Nonce = 25f8923843d757ee4b7571b42de58925b0c2678ec89df07248b4cf34d83db926 Signature = 1876b20926d8ede78d28174eeb4cb0c1af8ee206fc8db4a8cdebb5dbfb0c15cf231af07aeba99ffd00659394ab6ed19a5e9f9e60e2197f65fc88c815beae7fe0 Msg = aa134e9db73982e7a37a1034aab82b50d5e58e034a5637081dc880a6e265ebc7b353df210304ba00771c5bab445dc6c24999fe8eafdefabcdd46f7a91f30721a6896333c3f301e197f961944f545e4fe0730cd967790504c49b0ab5b890809be5c7c1c3f8a2e52d92a2c199b981b648fdd528e768e6ab392579b54c72c41617d X = 0x02ef078e61df318237c9a217b5ddbda12ab9ffde68a201971782b61b73214cae Nonce = 013e35ddd416e092335f3bb24a5e826e3e06cb90daad599a42cb5ae8da830b24 Signature = 041d229349cec75fb2bd8c35c249f9196a18962ca75ebdb42dca61d21cb0e91077bb7975a544c51bf249dee2359523072863934497d1a479d6e4b245d456eb2a # [mod = L=2048, N=256, SHA-256] Hash = SHA-256 P = 0xa8adb6c0b4cf9588012e5deff1a871d383e0e2a85b5e8e03d814fe13a059705e663230a377bf7323a8fa117100200bfd5adf857393b0bbd67906c081e585410e38480ead51684dac3a38f7b64c9eb109f19739a4517cd7d5d6291e8af20a3fbf17336c7bf80ee718ee087e322ee41047dabefbcc34d10b66b644ddb3160a28c0639563d71993a26543eadb7718f317bf5d9577a6156561b082a10029cd44012b18de6844509fe058ba87980792285f2750969fe89c2cd6498db3545638d5379d125dccf64e06c1af33a6190841d223da1513333a7c9d78462abaab31b9f96d5f34445ceb6309f2f6d2c8dde06441e87980d303ef9a1ff007e8be2f0be06cc15f Q = 0xe71f8567447f42e75f5ef85ca20fe557ab0343d37ed09edc3f6e68604d6b9dfb G = 0x5ba24de9607b8998e66ce6c4f812a314c6935842f7ab54cd82b19fa104abfb5d84579a623b2574b37d22ccae9b3e415e48f5c0f9bcbdff8071d63b9bb956e547af3a8df99e5d3061979652ff96b765cb3ee493643544c75dbe5bb39834531952a0fb4b0378b3fcbb4c8b5800a5330392a2a04e700bb6ed7e0b85795ea38b1b962741b3f33b9dde2f4ec1354f09e2eb78e95f037a5804b6171659f88715ce1a9b0cc90c27f35ef2f10ff0c7c7a2bb0154d9b8ebe76a3d764aa879af372f4240de8347937e5a90cec9f41ff2f26b8da9a94a225d1a913717d73f10397d2183f1ba3b7b45a68f1ff1893caf69a827802f7b6a48d51da6fbefb64fd9a6c5b75c4561 Msg = 4e3a28bcf90d1d2e75f075d9fbe55b36c5529b17bc3a9ccaba6935c9e20548255b3dfae0f91db030c12f2c344b3a29c4151c5b209f5e319fdf1c23b190f64f1fe5b330cb7c8fa952f9d90f13aff1cb11d63181da9efc6f7e15bfed4862d1a62c7dcf3ba8bf1ff304b102b1ec3f1497dddf09712cf323f5610a9d10c3d9132659 X = 0x446969025446247f84fdea74d02d7dd13672b2deb7c085be11111441955a377b Nonce = 117a529e3fdfc79843a5a4c07539036b865214e014b4928c2a31f47bf62a4fdb Signature = 633055e055f237c38999d81c397848c38cce80a55b649d9e7905c298e2a514472bbf68317660ec1e4b154915027b0bc00ee19cfc0bf75d01930504f2ce10a8b0 Msg = a733b3f588d5ac9b9d4fe2f804df8c256403a9f8eef6f191fc48e1267fb5b4d546ba11e77b667844e489bf0d5f72990aeb061d01ccd7949a23def74a803b7d92d51abfadeb4885ffd8ffd58ab87548a15c087a39b8993b2fa64c9d31a594eeb7512da16955834336a234435c5a9d0dd9b15a94e116154dea63fdc8dd7a512181 X = 0x853f75ac81b3a842c999448562c584d1cd0277896ec2f93c05c337eed414367a Nonce = d41b335753e1ff3f828f57b797ff5b2db5cd79f6a1abeaa137a2a830e24ed4b5 Signature = bcd490568c0a89ba311bef88ea4f4b03d273e793722722327095a378dd6f352274498fc43091fcdd2d1ef0775f8286945a01cd72b805256b0451f9cbd943cf82 Msg = ac30fb155104954b9d7139de9346d54ca05178954053fd361c9719cea530d2d2e1737fc46b0ee27357cecbd47e0fd47ada0d5236a9d77dd61a1b0db52e628b14588fdba8774882866b04b49cf5205db49445a8a202a5fc3fcc36efe0bd0c1e51eb08616c4a7afe120077ea08caf167e90446862298011ad9a1f11cefb5f74335 X = 0xd692d2c653bfcab2e7492ec56e512724c912227d793a59882800d37ad260bfd9 Nonce = 39335e9193222c7ae3caf8e5ad77b751e9847c37b9016d355ac7520407c91e87 Signature = 28c6bfcadb5f52324e39903bf7a04faefb89383f473daa432cab9178f2470d3c4e88f65ff776940bafbbfb35643bcdaeb43b25b45de2de3c011ff1449c8b8b32 Msg = 2225031fd26a6bb4fd9990347bc2c8ea4ba45bd75df68476f983dffb5531899f1317d95f7cbb493de45cd2f11904cd5c5d5a748b4aa127ca730f89a928ddcd250a6551c2f7cce109e64d3ab74afb2d4f4f7e3494eb7d557060a1f29ecb5b75f64848370902bd6ae2fbf6802b2f9c37f34836ad71dd2e2abf6a0a47df4fd5573d X = 0x87bd74c5d70a292914d96b47dc5e9e97a6799c3b788014e7f106ce7ce7e17a95 Nonce = 64f504110193cc4a3f400b6fcfd71d64a1e166c048829d23206da12a7dc1423a Signature = 5568d810ba664a08b301266d08c69eacccec5aae870a6d579eda51a31b1846559e818868e06787fb9519b50546ee21d0546e16bb1b5920311ba44769dc69c7a6 Msg = 4b1f9335fdfe88c0866bb648c05857b79c2fda92a987b359282bbf0822db747a3940fee05aeb3cc081231e29b9d460ef30a55f0f88702a4ecdcb842beeb36a976136c9241f2eb5c2d93fe38a1580cd58fb93ed137a7d05ea22d5e87345633a0e393feea616eaf83684c3baca4fc5bf80a87dbec3a9787daccec479661af0b968 X = 0xafa080287898b0787f5d06d5826cc285ae5bee41768098750419a5c8863ae729 Nonce = d23656910f6e8ea72cdb979cfd8c8f6676c47c6161c3aa14f2338392891d1afe Signature = 7ac95d3e0936cde441e4a290711cc044e6e98e8a8de68298bf7fb90eef589eb2140e9de37ec5aeb3fb795b016f51ea3e92d6f198c5a0e5a5d236671c91042c94 Msg = 3b87109bf21571fcfae92b859649bf37dd23d59f76d50cf26f4b2ebf7c5f4ae0b377bf3bf2c7e015a74efc808433047a71bf1ed4ba9025f4561dcb94bef2c2a2c94b3f55ed611c432f98a683abadc2c31d002eaca9b070f2b21319d072df75c62385d7d02897a00f863c2882b2897a331332bb9568b2fdfaccf50b3de4b42e8a X = 0x668606f4a82b50876abd7f3dc0ed580a10344c1dd092c5bc1b26c427028cc5f3 Nonce = a3d781e5385d66989b38034171da11594b20f15733fd4701a63cf24bb58ec341 Signature = 1e219eefd616caac549a859d45186b5c528627573958fe55cf57fbbd1661f7b8b09545843dc0f6299b48f14311503605502868859e8c43867f80df3c2391c762 Msg = 042365b1256931a111facc6c40f618c428801b03e4f222a1e1b7763c3b02a6214e4c517beb587a4ea69fdbd4ea2d5d5f45afded96ddac87dc89955613aeff7644fc6a58bb859a85221318fbc5e175c6985b19a1d16ab6ad3ca8fa1903acca42bc6d9efbe88fd6f2a8650425be97bab9cb670b2e39f36d526278e0bcfcbffc3c6 X = 0x1c08570d1e1ac0857f649e4ba20de0e9aca97374acba6bae350104f1fce20be0 Nonce = 0bc8f6e0b01bcb55a4d134c967f3a9411737103d400a33a968f9036292d6e3bd Signature = e7145c70e0038ae7e7d901b48828b0b8bc960cc4fa29a52e11ffc9ab08eee726b9c54ef6cb3e1b0498952299d1465ed2c5d4e670cdfd2506462466c3b0fcc538 Msg = 98ffb2899f17c80a83e82ca6265e6f361733a6bbc63cdf8880dc756bc768b35b90db7390cfff745ec1b56f1655d8d9a29a6e8a63be0b1b2f9aa7436209a1fa061a7aec28622c472b3d0285a701655a496546e891a8ab29d9f40d2e748d0aa2babc06cfca641b300b7a219caa9e5bae3bf689f60567f922e7796fe47bb72ffb64 X = 0x79885ff112bdb326577abf52db67784768742b36e575f06b8d1e4f0d2d49a3a3 Nonce = 13ab2945ab2a40067a93ed8c1a4b305182cb070022b79a56740238e55b07e8a2 Signature = 4551b096446db6761b708f35209edb91cc51ee4ef96a7495407ab4167a05c791cfe4c58bdbf61caf09a42adb1aa5d98b4c459c0112c57823bc15b5b990d92ff1 Msg = 5898cc0b422bb89f066dabbd30f59e9a35a392bdd7ad315ec8ad32b8f0f3d02864e70ea36e9076c395f0ba9de1ab6080df3cf4a1470e2b9990b8e7614bb8312b075c0b2a132d7e47ded9e4c0a1368455b9d1a67bc44af2f37428f48f7e089ab41d046378b6d48d9cb135eee4574072abea93bda7eb4f15a206cdaf3bbbebd318 X = 0x416634f9b7722188c2a5266cfd9baf1bdd508c0c068010fb228c099fca7cec11 Nonce = b057bf5a5ae4204f941ff5a01560cbc29033dc6a2e06ad168403cbc6512646df Signature = a237d2c3d23706caf004a2e94de29f04c748936b62ab5431fe73c72485814265b48b9ef9cbd8bdf799b70605f00550b81b309c157332153be9707a399fbdd67f Msg = 0418e01236caed0f80241ce8c6307d026f5e25f4a922bbdb4aafb8d9db95a18175f9dcea9acb4d376f36ff7b7cb598e073de95ad2012eb9d11e15cb3941c6dd0dd69422e78512ebffb19cc8a403a9a7d1f1720ab0f2d25627580366093e21ac1537f93de90a94508f1d7a7a1db5a7b13c9fd00b82be044c3a35ec0451c309b82 X = 0x6ad92911dd4fce033d7a50875e4660be08c44957b874339c2a70d915cc03e27f Nonce = 5aed2d19239189cd0bc8cfa3c329748c0555d8eafd5e80ff931966680e3ea454 Signature = 83ee960e6f9026fe2454d859462ac334a13896e75179858ef40e2e9a065c536a7ce8699c6ccb184d4240b8709da11451328cf1a7e0cafe6e1c8ab53d7de67d9e Msg = 92c949fe2342f91a387b67c1b12b1d04d0721203caed593c9c464e5fda09fdcc91d3321d2985eec08ab2026d1ec3fcfa838cb6af45290c08dc30b9c14c4445d783b6f48409a00490f4e308dbc87fd1b2f878385212e1f4c3e1cf81c56d71e73fd7a095b56b4abec15c57107420fbdfa44477078ccf4519f9f6044f0744052035 X = 0xb0d23aab4d95446f8c6c5d496d477dd9486f50b2827f7cd19728bc96f82840c7 Nonce = 17a199bd383a84e22029fb90d5abc9a8a7ccd3f0a33720ca80e3161971793526 Signature = 84cace71a80ed47494570fc84839f2e350191b74f0eefff2d7ab2c689db77bae9cac33594e1934b68f62aca05ca040f3c82110c10b7379878b7894b0919a0f2f Msg = df6a4eb7cad4ff9bdd8356d3568fcf0285c1a4e3c3109faa091b58a9bd907c629d54aa7a23a74870545a0942a2d23914f2f167d96573f06f35ea05ef704cac8014dd21b961d3dacf7b930bbd7e35550f721094c86333e03ed4dab7bc1b6416add9578d279edaee37504fd25ec0c5e8a37ac9ec19bfb1e3778ed6d9c6b6e35ec7 X = 0x679ef48b643be394677d17e837a0be6d4d8027a900b686aed7c4b12634fea76a Nonce = 3cf9da6f182bade870946d3ed3b078208ea8153c45515d64f589bca72b703ebf Signature = 1dd2daeaf3e89fd644c6cc942311ea5056413d8a24087787675ceffd3d6c15e43e12781396558560455c4e70f610522ab2b10fc25343296818ef7ffb0378fa47 Msg = 4f16681eaa5d97673a7cca02ee8a7374b75411e0b5704a947f04d1a5b14be0b506f31c2fa329e3ca516fa4f1626a9b5e080bda7f353f850365eac7c3d2596f502a5d70b1542276c12d4ea4a22b5325b9eb3e942e556769b796c4f524595f1cc6ce17f99f9dbf51331453228ead327b614f4438d35d61428429f78c8c9377aaaa X = 0xe0e576432913bc75a2e0de3b33bf3094148298612a9dc56fedd47aa569af8ac8 Nonce = 53cb2d046b391193efb14a4dfafa296c2ec92293c7b3c7d19a20e68c4a1141d9 Signature = e2ff3fc441db4540194a7f5da1ead849c2c3c48dccf8b2c1b3b359a7b16e16ab52fbdcd5c62a999aab46147fef9e18cbfc7daf680a7ddb892edfa44d285e2158 Msg = 09e48a36523b5289ec41859faa141e2a29b3e88ab2d6351e20de001e6424b85337675f0ce26be224fa4f8df0ef9710ea285635b27b297d688e338b5461820b57be4bee21645b04957ca2f6cd7af9a6a52b3c97c5b9db1c2f7ea817cd6d3c8522d4e6a9de869aef26ec0dbdd269c79b38806927bd3a5100735e6f9f655ca94dae X = 0x7891b05e24823f283126d7d175a4e8c8124b3776f4f296d0ffc4b5e21bb64d70 Nonce = dc24b379ee2d26d5db792839795ad0d4b9622c0e3fd518df541a5f6e9cefba0f Signature = e550dc65af275e47be480fd647366e2b055c79ea33ded4f5a9557121e082af26e26b1a5f27cc6c87863e31ef7f1e61bea476fc5d7c25fdf22fe740f23aa9a752 Msg = 8837bbceef577511f2d0c08f790d5d2e8562d93df3d82dd4c2827cd9a9115308114a18c452db2785561081eb523685ae2b3c8b090e0d44dd40d2fc0cdfc88d6f9063a7707df609edf0a8c55034815ea9f1d8b0bcbc92fba513ba81ee646bf98ad4eb22be26a4582b1be2899c91eebcbc9fba5825e021e99be0c9d28642d13fa4 X = 0x116d1836a131310644aaaee6ac39b3643cd50026a6b486167cb4daac242a4e7a Nonce = 4a6febb624c8ebd411cfb30c6db055dec3d0d17456dc0c54bd1b43531d4f2649 Signature = 7b6b3eaef6cd5fe6daede86d63943478c771582483be0b926ee3022d22ef912e39d928b59a690450d13359a29efe20cb98bfd3fc9726f80e5148f059663ffd08 # [mod = L=2048, N=256, SHA-384] Hash = SHA-384 P = 0xa6167c16fff74e29342b8586aed3cd896f7b1635a2286ff16fdff41a06317ca6b05ca2ba7c060ad6db1561621ccb0c40b86a03619bfff32e204cbd90b79dcb5f86ebb493e3bd1988d8097fa23fa4d78fb3cddcb00c466423d8fa719873c37645fe4eecc57171bbedfe56fa9474c96385b8ba378c79972d7aaae69a2ba64cde8e5654f0f7b74550cd3447e7a472a33b4037db468dde31c348aa25e82b7fc41b837f7fc226a6103966ecd8f9d14c2d3149556d43829f137451b8d20f8520b0ce8e3d705f74d0a57ea872c2bdee9714e0b63906cddfdc28b6777d19325000f8ed5278ec5d912d102109319cba3b6469d4672909b4f0dbeec0bbb634b551ba0cf213 Q = 0x8427529044d214c07574f7b359c2e01c23fd97701b328ac8c1385b81c5373895 G = 0x6fc232415c31200cf523af3483f8e26ace808d2f1c6a8b863ab042cc7f6b7144b2d39472c3cb4c7681d0732843503d8f858cbe476e6740324aaa295950105978c335069b919ff9a6ff4b410581b80712fe5d3e04ddb4dfd26d5e7fbca2b0c52d8d404343d57b2f9b2a26daa7ece30ceab9e1789f9751aaa9387049965af32650c6ca5b374a5ae70b3f98e053f51857d6bbb17a670e6eaaf89844d641e1e13d5a1b24d053dc6b8fd101c624786951927e426310aba9498a0042b3dc7bbc59d705f80d9b807de415f7e94c5cf9d789992d3bb8336d1d808cb86b56dde09d934bb527033922de14bf307376ab7d22fbcd616f9eda479ab214a17850bdd0802a871c Msg = 8c78cffdcf25d8230b835b30512684c9b252115870b603d1b4ba2eb5d35b33f26d96b684126ec34fff67dfe5c8c856acfe3a9ff45ae11d415f30449bcdc3bf9a9fb5a7e48afeaba6d0b0fc9bce0197eb2bf7a840249d4e550c5a25dc1c71370e67933edad2362fae6fad1efba5c08dc1931ca2841b44b78c0c63a1665ffac860 X = 0x459eb1588e9f7dd4f286677a7415cb25a1b46e7a7cfadc8a45100383e20da69d Nonce = 2368037a1c7647c683d7e301ac79b7feebc736effe3ab1644b68308b4b28620d Signature = 4fd8f25c059030027381d4167c3174b6be0088c15f0a573d7ebd05960f5a1eb25f56869cee7bf64fec5d5d6ea15bb1fa1169003a87eccc1621b90a1b892226f2 Msg = 02bb64d2d5032f54f1ac9e9ee164db83af0cb036d88d41e9b2118cfc39d1b4b4dc2c497549c7982ccacf665d1b0011268246c7c17f562ecba25e265489873e0dd9268e9b06880ba74e74b56f50c7324d29373853e3a0f3ff787eba4e5e7f9437f8ec8a5e868324e9c17fb3d0e12de2d31d438c5bf38b27167d43ae4311b11062 X = 0x521f08c10774077ac15bc85f2f6a03d84207b4ed7bffecc35d730cdd1126877f Nonce = 08b161571ed031152677136b54e87119133f7de56268aec07cba07667b98bcd8 Signature = 7a5d2016afe87883491bd6cd166edddf138c1c89961e4af6876be08b0e06ad7434efbda1849dedd0d1aa775dab2aa2b14c9ba0206592fbc34eb47b844646adc2 Msg = 4f1c0053984ab55a491f3618db1be2379174a4385974825fcbe584e2b6d0702abb8298dd9184eef1740b90a5eae850e9452b4e4ab219e187860f0fb4ad2be390ef2ba7d76cdedcaf10aeaf4f25e497b4da951375b687a8d67012d3f99c7b5ca82e9bd0630dffcd635ecd8209cddb872da5bf4736309783345a35376b4fce4b91 X = 0x6ba8f6638316dd804a24b7390f31023cd8b26e9325be90941b90d5fd3155115a Nonce = 2a4a4e014c94d8546c62f0db2fd488f5fac03073a11c3760376114ab3201930d Signature = 006b759fb718c34f1a6e518f834053b9f1825dd3eb8d719465c7bcc830322f4b47fa59852c9ae5e181381e3457a33b25420011d6f911efa90f3eaced1dee1329 Msg = 42199186434d6c55bcef269bee685c4e1580e243027ed128ca99492033a52954bd1ca8ecc5043820725a3c0d71a181a05aabcb4ecda7180d86855e7b4dfa9a44c7af4c98fbf1f0624058804fd8eaae4990d4d7bb75f01741ce36cfc9c137254cab065a4617d0d0cd5f58ea56868a40f3e0baf7db5d2557f4b9775c1820dc1d41 X = 0x46d690ca6b9cc01e9a8c7bfdedc59a97eba52f097b8fdc19bc1f8c0ab5d4bfdb Nonce = 638e5fd0885f4c9f7e5f4e6a103b2d2d9d1368c493f9822ef431f54e65a7a3be Signature = 2551d4f855174f7b28a782b89697d48fbc314cfeb17ec4c9902a8e557cc6f6b9278b786f9e28eeccd00586b445e75f48cf2649f3f1b7bff72b0e767f3443dc58 Msg = 4fdd888756ac68f4c29cd5b1de42756794570ca8f18ff795f6f0fc856772b6a2189b5ed4a9b7547328075b56c28ddf50b84c27205cee57b29d0b387970e89a6a2236293bbc9e399013d1dd3bd5a10ab0d259f7fda704f71cbe3b8b8752806a0c84668d85e4d739cec628dff63371d24a4b14137382759ba400df0e2c25947d18 X = 0x49da89d1673704d1f24ac7dc799bf006aa7d606c590e5e37e38032ec51a70376 Nonce = 14dca45937cfdbca5c799f2ca50de2a44d8051e6d80af242c9f4d614419e6e07 Signature = 4b90993d707f3371d0a0cc87255e99a8fba18c3b58ddddc1067cd394172366cc4b2612d506fb85e5aff9fcd56c09bd12bf60f78ab7dfd021a742ff85dc507ae2 Msg = 8507db5f1df9d22f447c20e4320f90d9b30722197196d1a2418d06dca41b3305f6fbe52ab58cc0b60ef1a1d257fc2fb2062fe6c5f2a25f0293ca39d0c083cfd5e4bdadf2169ad4ed178c88ecb5554ffa2b53aa4398115cde627d30144ace9325b2d79d7dce951509d734afb0ff6d9265b902672eb5884e9d8acff0ea22c76938 X = 0x82ab2908e3d2335e07c1002764b07b1ca46d039a95b59b450b16d37ed4838872 Nonce = 1ea475584982b639ada8c84e51ef72738390ed6fa44395f11428dc5fd794a81e Signature = 1d2781f5f9d08ab2feb1683942c2c29a66318839a7dfef9aee9cd7a89efe2ab03adc7be968502ead10feec191e212ea0e07d449006e7f22ddf869a9fae711834 Msg = c7844960966584c8e3a59dc37df37b7eb3ad333148a32b86c1ec18072f3b316c59cdef98ba4dc46f532a4280200c225fac6cd1adf0a45382c2d88054e447740454976e5272330c7487eb42a095f7314139938c7419193b1c128054c1bbf10d0634e22c6e02d8e12279cac0bfa01d3058e0f8d5547ba0f71529c27e0084d4bde7 X = 0x0c76bd647c6fafe7da1029b9bf36a9f042195691a26f36bbe0eca3d4b1e6cbb4 Nonce = 71e12996d8aaa7cb1e730713fa441098347ca95eb39362c5a78ee6e847469c7c Signature = 09e654b17ab775959628e7cad0e27053ee495bcc29cc2a5e3b029660a77b1330261ad41d6bce6d04d891a43c16ec2a8114e51f0e47b48b1dd1f3d626150338fb Msg = 6f3f74388cc90b29c109ecbda08c79349dffdeb90722974d79d640620949448f66ae673eaf4d4af8c43da673a45ed152ea66fc97166baa7ce8beb666bd57ca43da6801c0ee5a5a9b50c5047935d7a8552c381d93eaf03cbbbb88ed0d3b5a2521b67612a4405120ef0205e89aeb48d577bcda3ad20e0a7cd07f8c9b215c845dd8 X = 0x34c0d0de98c85be291b68a5b8c7fb3536b6f7447e8565ead9b002417f56f4616 Nonce = 8086cc691e7e793a5c2a81bd3d5a1ff5ae261d9336b33f103d983a817f7eaf7b Signature = 43993b68e847f6ba61d5ad4dc8f5ad70dabc317a7b6811c23e7f215f95415ed51ea727afdb907d1d5b2337c1ecea46c71eb0fc8363af23865a345202a762a7c5 Msg = 74a433c2d313f66232324df875b82563805d7ed682b266eaf962375e422b3abbfe3dce7f3c1960a1e4100f333e168d021968b48397e8cce9005e951fdcb096a9abea342cb5b08bab79ef0c431dd3a43de7d5bd6b86bea8872ba038b43a236a7356b03f89b09004ba2def663e6d299763b6cafcb6b150a57f82b890ff6d56f832 X = 0x5c1a80e926de194995195c4cee9a2e874c7f6af0fa8a4b2df5432f9cfc86b643 Nonce = 13dcb7c12aeb75a417a93a22ce94618716996c3350909cfbff6d38b603d377f6 Signature = 3bda5b0c9e3da22f0b3e29356a2f7ddace6e9b24a063eb3f5a7d755f2eeaffb54cbb815320314a06538d2a6740e6bf9d022eac9aa25c7508f659f0f7c1f59c45 Msg = f4eadfea117fd3d670cea28aa9d2602c951ed843e2e8cb2864074c8c9bccb0606ced83ae2980598cc3e1b047fca8659127406d8f59f5b7bbfe8ece6d3e42f87f4e42ebe92adaa1e6e92ced3dcacc2e0b2c98eade7c9c99da887e74db5a59132c1d7df7cde866cb2f3ca750852ba53e265e62bf7a93fd693e4a13751e186e9d6b X = 0x6abf7cc887544bf8d3256fb210848eb46281526b1e8cdf6c9204c4c46a747435 Nonce = 0711c4621a8bcd40ff3e8b95728ce67a000e1fa33741246d420b046bdec48657 Signature = 36c086070368265f736e7bbad54aaf2482d26161f8057a97a4b8cd2b4ddd785531d99d736ea67014fe59cb2212c47eb920f2af44e32b65db15af83cbe8e6aa70 Msg = cbc37afc75177a8386dce2c40c33b8f5dedc23113b4512cb96790f2dd74066103e0c45a9c6176ff96b7d719162003cee10fad6ccc198550a389275d21e708b6961523272ecd5efab5680ed741c2de025b02bbdc56315a442e437c43e3b378e6d62ea8878fd9789858a8c68a504bff49516e762a22ae513a2dceba9253b36f553 X = 0x7c6ee86f45ddf8b87f8884f59aad9e320b73b246a80b26a645188a40a9bca62d Nonce = 685a19da2ee3dd94fe9726a32e712fac05eeffe11e3dd9f60e6f90af7c13e23a Signature = 5645ef65e8e9236d874d459e7a5809923c05d64b22757bfc5b5621079e84819c65f4c8febaf3e9d46581b17685c4f2ec9b956421d034a2c1aaabee94b787a4f1 Msg = 8eb3685c3f406c5615e88accf4c0c7d2071b6c7bde5244994f73dc04f3cc0ab7e2b6664a1994e6eec52b62790a04328e436a2b4af3cbe3ba6e4c8f363a39b2529ef554c0c627f9f6b255928a39a465e60ac50ccf01f32c7ba483640344b6a8f583c90876b84d19554b0a4baabc2c240e296b12c819410cacffe7a7464419bee0 X = 0x7e5e3d7255a629c39f88b6046fe0039159e44c2d2309b112ab05c61561d9e44a Nonce = 3966daabf7854949475ff47f3932393a73f21e275b3baad861a92a3ab322e376 Signature = 27b4e3c3a45efa6131c3d005ca924dff11fdccf409c2a6993fcb505477b6e40068a085bd130c4ec08aa9673c495ba5afd46c9ddad2052ba7ab396329d900d86c Msg = f2b02ac627b3f66baf4ebaa52b899adfd7071af53e78923182d8b4d5f3a9474251308b4dbd15fb6b657be65028a189353912d7c16d6d4989985c15cedc4343f0ceb680617bc7278511f9068abd613718a862513ee514fdf80cd25b6f84c48851e6a7850feaea57ea20deb1123ca4206bde8a93ff999ef789583e2c850d9e0635 X = 0x7e52070b03aba0af4cad1cba0a733618e3adb7de873efba013878fa76331b5e1 Nonce = 57c141f543386db3bd6a97121f93b47e38891796f02565058ec6a5ce65f7a212 Signature = 6433bd33db0ac8261c691af3a27f52cdd4a65d799939faf279ac41788e7528a604cfdcb993382e8fd2db8d90dca80e94b17b432009852cd3f86625159e837c19 Msg = 2b4365a4ac6854c972da7347af1cecc6edcbae9d533b74fbe6db5712163a6ce984f9d7a4c54b44dd7555e5c2d2f3d098f31d517f8ebd330199a54b15297e5adee1bdf391581f1019b1ad72dcccd5484b51d275a368c69a7662e79f9b29c9a3084c94ae76da04f958c7d36cecc5d41d77f2302ff28f2ed9c66a0662cabf51c842 X = 0x35b701b7d59aad55eb4299e0f9e0348baec875eaf62d2174bce92dd23302a81a Nonce = 1c6ceff82adebf8c81bb4842b90dbe2a12c9d07c3a9d4990d44106a1768bb082 Signature = 00a7c664c544cd7b61749410dda33bb3a47c3eb5a9a7be5fba201a390cecfaef6fbbda967b584bd9ec6a0ae76e0c552b3d42bf0e9cf2939caf6123f6e86046f6 Msg = cab1d17666b0c9658cc78cfcba17a08e2989d3c202c8b5085531404d928c618b6e230b25c46a5b58437e4335fc040020ba00c863182325940f00aad330145e666d07e9e9d876137010932ae520d9188ca3d7993c905395219c55846d19b8fcdb1d0c1586b9b51097afd6972ae1472b0e20453f8fbd5d6aa9e4a9a9b3dc37dd8f X = 0x1ca2b291707ce4f70e366ee97b5da158a1c985ba4f252c572f0fb329e43f9cb9 Nonce = 4f1e2aae323c5309b3ee5d3b73e5d4090c75da17765559e118bfd1460c312859 Signature = 7b8b75ac8514c68de0caa98e9de0b9607253d8088d3feadf92b83ffc26e088ce4b10e17ff64a0eb72f70a863d00a9bf331bbb515ba3a9fef72753ad7f0df0be5 # [mod = L=2048, N=256, SHA-512] Hash = SHA-512 P = 0xf63da3be9a9616196c6556f3ce6fd8b98bdda9137473da46fed970e2b8d147387a81922065d528a7d6433ebc5e35b15c67ea35a5a5bff5b9cef1cd1e6fe31dda52838da3aa89b9b4e8d9d3c0732ccc4f238ce1b416c4ca93f2c6800e5f4ed41c4f7615cec5531b98680b20dc63f73e70d803aacfaece33d45fa0e39d77c8508209528b9046b5917010791234397e412d22bc0b8d67cbd1cd28a32c2460a0bd86aaba0eea80e16e3245643171e34221760c203a56b8207a1009e6c1a2f6cda85f85c4f9e410b9499233c0ee072e465af4fb4fb9282c5c10e8234fd630ea92f0aae6b97a520db34475707b79a4c175265c0356ccbca827e3837df3d6d0576d9079 Q = 0x9b7463f8269f0b909abed10991684f36a64ac864e0d6d717c0ef21577a4c3907 G = 0x972a75f606e8aa3a91ff08fd131a20f5963251304e3d1431b712fa0803d527fd710fb7eb27e52904971cd43ca977199a24dbeeb4b7bc2ba075d3b72eb6b2c5ad8f0e8b8f48c50b554c7e0711f4c7416330806672498f430292724bf98a8ea48c7f53d7b31d8b7528b1a6f087d2c27c335202835b1e314225b37aef8bfcec7d80920c4a460a3d68344ded75ed9ee867fa2a6945063894f563b68633b8b39f83a1aaaf5a96c7f422687e7c84cf8fb8cc5f4504dff087bcb26a95bbf8583f03b3a0e43a356b2bd7e25cdddf7a015300faecc6793c5ee99b6327cb8456e32d9115339d5a6b712b7f9d0301acb05133e3115e454d3a6dd24a1693c94aab5406504bf7 Msg = 8ab01510cfa33cfa5bcff003bba39996fa727693abf6ac010bb959b0b59a15306c0c3a1921af2a76717aa55b39fa3723f4c3229ca9acf6b741614bb551cde8a7220ab97d4b453bec1e05a0eaa42e382bbc7b9b84f8237dc8964ee5b66e9b2a4ca61cf675140efef54fb327a665def8d57ab097e8c53c643fcb58209c4215b608 X = 0x5f6e545daef6cd1b8d9848dd98758807236ac0b7ff053b32c703eaa3b1147557 Nonce = 5fe61afddbdf04449b24295a52a1a037d3f31441a3cec138b7f0102db86ef132 Signature = 6a47ea57ceaecc116d7190ff6c6dd9831ab75b4bf6cb291083e4268b486ed245017355f698a32abe9a4d4a7dda7c85950cddc348ab8a6751e72fddc01aa5d1f0 Msg = b2f56948a336982a5bcb4bb5d79e3fe5c36081bd286e6e021ab29b522f0be5ff5e81e638f23d0781c268a89b09332575cb31c0804bbd34c80589fb11570fc65b3f67612605a9411cdab3ac00ff3fce33ab22c46d26bf9c3fc5ad2d9018deb9b669b50fbfbaf8bed6230c7bd621d564fb1af953f0e82c5b5520ab97baccf58d6e X = 0x91e01626208863a954eb8987f8e987c8e6213536bb18f5afe3bd66a525bbadfc Nonce = 6aff566d97cc48ef6bac507d64973c95da14fd704d3a5332aaaca2bdf21e894e Signature = 43704e96cc8d63e6f5b7e118cb7c030d0bd563b8f7a1a304b368a6c66d7e7fa8490da43fd0f19fec4ee081cce25df6b2720b1a76b023c15704dd03ef1c3e48a7 Msg = 9ae8479327b8b8a57f570f6ec76a1ac6f02b198c6048a1f096e6ce5630b6caf363176413d88033b1cd07f4d3960a12dbae8a659174bb87c37aca6ec56ed5a6619b8ba676b650d97c6a21af023985dc361fa234b2b3c17e77703ba99ae3211260da10a60f240eeef478f2641184a281716ae57888117dba992853f494ac3caa45 X = 0x8a5624694a25209a5fb3983ecac3fedf508e0b23e878f60a18ec0e897c379f7b Nonce = 86c3ce567e7995a61bc00e088ff2f2a425433a453252b1a729d8d85ed506bdec Signature = 0091d750ad9a4f29573fd457a5891b68d4b6c15703a2bc192c7c620c4e4c452992c409c8977975a417d9f5e0e2dc70683a53a95662ad270ae35d496567a9a2fc Msg = e5a1a344c25ba0cbbcffe6800135f2ede81049180fb2759fd9e1af3b816ad5436a24faf29cf3ad91cf413332f454f74a9d4f5efe76cf02512c273cd525f04afdb5c24b0588d611d72153680d1e3995e0aa750e9077b0752bd4442bf7bfa8dba38e1c5e7ddd687f55aa54c138c7e6d5f064f3ec55942dc192dd996e553633afd6 X = 0x976fb067157b214a80658e7ed2f566911b35b1671e5c0bdd55ff5811e822bf82 Nonce = 1ef4f08defdb5c59a3df3358e083ce804c969d046ab67f2f938eb1a8f06a5d0a Signature = 443644e127e381b17bb66c53509718a58a30f927425806a62840119e78c293b73f01e5d1e9fdb1cfda25eff3caccf4edf599fea277201cf2b01ffd7cb1a9a727 Msg = b88c212070be398a1f81e85dfd71dc2424a38ae38a9d61085186504f4c2cbfa492b76dbcc051cefde0616a7e3310b4bf17244de7d10f847ce2a9f665948e76724d8f1f4bb3a61919b2ec7dc47ad8a72cb5998b79fe3a156395e4ae88e682b1dd16c52d64cb4b31c39d4a42a21e6242dc0cdbb0acf3d47182638c5f216dc6e8b1 X = 0x02163cda612e84eb5ea9e4e068b14c10dad073409154d86fea6aaede59538d2e Nonce = 42cc30e9591b42486ce9998ab7594ddabc5328ca2e931e08c75b76bbe1f8b978 Signature = 078a7146a2c509b97a6a8c963baf1fbfbd1a2a5aa214a15ea45763f0e7930beb2979cbf59adb70f28ac4fcb69297498f8163764c62b31963da9c8f9c0c43e075 Msg = 4adf1ed4fbb5b82d7a2b1a2938430753a6207da1cc049574f0a19314272f9a80c6a53498b78e5c0b7401ce485fd4baebc966da6c1fcb025816cfae32b58aa87f5e8885054735f93df19ed32c819786d4109dbda047d68c0589330715e10522643bbe27e32c0dc9c58336be305b4c0c981b40e0eeda0de461d8441c02c18ceac5 X = 0x5b44bfbb69277fbe497ec729838886e7a787f336c246551526b660a7603d167e Nonce = 5f02472e007874056abe7194e80845b81baeaf4f6f564d3640373757f4252f57 Signature = 5b201116d8bbc87db99001707b567e7c3451d802fa6c679bf3db3456711a19135be7e4c493fd5d19b771373141294daad97656a3dbe3fd2abbd3b6c62c166126 Msg = bd491cf68b34f7ba9afe0c6ef5f2b7956ef964465f28b2797bc1d6e670a6d81730ee2993d0b4aa96905157025d775ba104e7c19b3b372e852026b1286cbc6a48a10cb9378e97ad966f9cf03917ee8db75b6264e9b0a48a0ae10c2f46444710d4234126ce456b9fd11ab7a3504948d046d5f438d893d9b1052b8fac9547415472 X = 0x609a372d3844ca8224dfe780b425e1a7c00d09957a862de6f640af57c086dd6d Nonce = 8c70ac971b83f159d2e6ec26bca1463aadbc8e9987593f49a9258f7f0de9cb38 Signature = 0cf526d8a0f9c912d143f3f8afded4598b2a5aaf200e0749ea27defeb7f28f3a877a9066f6c5ae78251d9d140bcf39ae912d18bf131bdc7e9d61012daaa4292c Msg = c00a8a2fffd10bc2eab63b8e375d0c10f9dfae2848ba42afe6085aeec26e21af3eaa493ce4b3d95a31fa502a60ab88e805f4fdf889ed91c15421718084cd0d644795749b1a6b183d74782d52c7babf7400393cee698af5dc010c0ff7f5acdf0208f93ee7e4ef58da123dfde7f0a34e209bbaec61007293fd11afa60b6522c45d X = 0x683e924893dbbd751e0a3f910867471a6410fef562cca9f464943abd88e0430f Nonce = 3bf5f524e3a3903c149958d10ae68f0a87a03821445a98b0b9d08a3689738853 Signature = 98fee10c85ab46d334758734819e68b5046439cd0b66be26d43760613ac77b8c665fab98dd437e06a4f877ee218986e37c2cb2d237e598d98f1b7d4e829a846b Msg = 27f01b47d15f7d196f2667b75ed15b89d7443fb4fab068f4adb67175ca70071d52e270f68964f9fb0e0e14ed5d2954a33d93807acf3c82500e8b9f5fc5510cc3bd6aaa1daac8309128ef4c0b4cac026425aefdd7e69c22c32e5f8d2a6e8f2ea291ac33da6c71a1953e443c0ea206568aadef2b96466cbf76bf149d89d86f529f X = 0x285dcba140162fc203651c5ff7f1155341436c5c5c98e1e9df192b3c948a16ca Nonce = 4029e06b437cbcf8e0788a393ba3aad0d182564ab6a53565eec1755c4f4b6e2f Signature = 8dad02c02ad34fe4e758ff5c81d5384c40d2c49d0ac777bad1cdebc58ec01cfd0fe4e1f6875c113f1c17a0f0ed228d44213f8d7e2f15567e57ceb2e8b1098f7d Msg = 73cc5e4a188d2814466941389014ea45a1a06525d2069cf4883ebcb5f22ab128c00f041cf69fd94b33fdade78548f6523c838b87ccd868f3d3d0a9a000f278ba54048b9cadac7a99d98def51713191ad83e5232e3e86497245c80bc710fdd7faaad88ce92c894f8cad3de0075caba337a222cb7a3d7c2d937bcfe4b6e69d388d X = 0x742242f1cde89559dadae5e2cea28cf402c60ea9af2a5282202281f55a0d4d04 Nonce = 57d9723e0d17ed96a3a77ad47be6eafc06a5aa01b59b89be70a756d37dd0df2b Signature = 77236b33b04285425775ee3f658b3761295cbff8e4bc05abdd22e3d78b1b6da243fdbd936ab40459f6843056ca77e125b6ec5ad945041c1f6a2770be9dfcc682 Msg = c0746befd2afc6ca15cdb145c18462c515bd42794c4c7ee513cd9aeb0fc6fc3048b6c7231634984a1be824c775f9c9b028255f5b3c3d8fa08d47aba07755b5f1b5b008933eff35838f15a02ba9366c1036d3ff19e88199ef86a88227272cf4e4e00ffad9c36bebac30578b00214fb29bae43cf555ed431a2f24922430b1496fb X = 0x47c0c6f4e6b56cdf1e1d9b63ff3739edec9c3d5a7c990492a1c72aa1494fcf9c Nonce = 3598a6006fa3f8b8f9b7ff96ba06bf3837a1a1a92892e4a268c75285bfa6d660 Signature = 796d7dba322d92a083da7a588fb6238dc86b1fc5104ed600c9b4c688edf805e9012c1ff4de8ee386b951275e250581d661d030a4d8fe115432288ab0a4bd46cb Msg = b8b915cf4ea3b0c4cdcd8b2a06479e71bb4797294b6c41ca870d3cb2ec2cb5a49f6bfe5bcd10be609ed3e1882a312395fc991345aba5b566e67960b42913db669041ea30c29947edde7bdcfc0896b97660740d6c79f0088665f51dadcfa07f7be44821d60a8ffde4e5cb1f98139ff91c9c6f3126596344c5f7eff40049d3f9ae X = 0x0eb74b5186697af279ce72da74f1ebf59921ed425da0f3eea17517eadddb7c90 Nonce = 37128d19b2108a8e8fdf2cac984d45851078a194bb9946a4db260f27b4650439 Signature = 6b4b0e1e7cbdefedb1df1f529ece47891f7b9e959a3f8556ba4bef7bb98565607e933b44ede6b2e941b60c37dcd1568284def229c0a2bb9093f4829000c4409a Msg = dffd458a808f1889d7f3d6197f0e41920ad731124cee308cb90d2361b23fee969c0e105835549e5d0a3f7690d5862d4cd6ccb33ad18094c85c9650d75b248496390a0b89e7dc7dc0d3a6130dd97789ebf105f8e55d8f0a1162fb3c6b529e2a80dd51e9045ef8ec42ca4bc46abb6539588b531c9799560cf4ea806c3d93d043e5 X = 0x36ff71ed608f351c736042f3b638a89666007cefe8ab487e512d76fedce1ff35 Nonce = 91797ee940a167a57de7619334638f1b3ba63f9065b69f56dc04e4020a1682eb Signature = 3152fc286fed44f28b1af2d537592c5691d6798caed90591b5888b0d6fe6bb077bff61a8676f0df189654f25c5812b341dd17f4f44667789cc887c191bf47202 Msg = a6516019727d95639db038f90306a8d94fac5243dc7b67c3568d63d85dead1cfddbb2b330b619589bd582af15f0811177504fd5b7aad7b298647a3f64797e3da5fe5bf87b65c2ddec576a8f40660686b808ba42e54bfd0e9e48082d6904f8e19050e54ea4797a2f401ff7c9f3d217b526c03be9201c0dc1b0e8e054bbb32c382 X = 0x396102ad116ca2e419b9229667a31737344d0d7854cac8930af18e12a9e2d63e Nonce = 79753fbd43773b6757c01663b8f5ef642801aa5ccbf32082c780f71a22c4cb0d Signature = 7222d5eb392460defe8fe3df18fa534f3060235f1e8dce5370762ec6fc11e6904351c428031cd9af567b1163037a4e376962620c4ec23c43b7105879f95bf614 Msg = 1ffa7cf55f92f234a24bd3296744d543a433c907c1f77d8b706f4b6262d096e2dfe713fa9ca80e68579396fc11a12c0331cfb7745d96b005204e483fbf8f9fdc458e2ca8613406069df5f44918eff8c5f54b8b4d972e07a4b8e06d8426a70874cefe6e93404c1eb381c2d0701c37f85afb1601a09fff8ecfdaf6cb64ad9bd8b7 X = 0x24039963cc5ac26a977728b852414f60a287174186ea812e00a5c8a8a5355daf Nonce = 2ae1af11ff810141c37b1c23796e54f027b4eb7c2f0c412b6c83076de3d4aba1 Signature = 21d70ed955b09ea302fb792978d12501071a2e8e2cc8f659decd3df24e37c4662cdaaee2a5a3dd74a67795f93ac1d8416223836c76f7fe31c72ec6170925fd73 # [mod = L=3072, N=256, SHA-1] Hash = SHA-1 P = 0xfd5a6c56dd290f7dd84a29de17126eb4e4487b3eff0a44abe5c59792d2e1200b9c3db44d528b9f7d2248032e4ba0f7bfc4fafc706be511db2276c0b7ecffd38da2e1c2f237a75390c1e4d3239cba8e20e55840ecb05df5f01a1b6977ad1906f2cb544ccfb93b901ad0966b1832ad2dab526244a3156c905c01ac51cb73b9dcd9860d56175a425d846485d9b1f44a8a0c2578e6cf61947bc1a1392fdd320b16a9d70455fe436f2d47ded8e8e605f7486eb578ea7fc4ffd13c07f9996af159fd411e9451403278dd1141a8c926b35c96384bbd6bee09c46f44c36b1ffc7197f5e925dbe0544a68e6ab8c18e426a466b392f9c27dd79fefa9ca163cc5a375539a8559f277f657a535d1964c6a5e91683ef5698ebaa01ef818dbf72cb04c3ff092d188866f25cd405108f566b087f73d2d5beb51fac6de84ae5161a66af9602c7e4bfc146f4820bdfc092faeac69133e4a08a5b202a12498a22e57bad54674ed4b510109d52b5f74e70e1f6f82161718cd4cf00cc9f1958acc8bddcdfbd1fbe46cd1 Q = 0x800000000000000000000000334a26dd8f49c6811ce81bb1342b06e980f64b75 G = 0x99ab030a21a5c9818174872167641c81c1e03c9b274cfbc27bc472542927766de5fa0539b3b73f3f16ac866a9aec8b445ded97fbff08834ed98c77e7fc89e5dc657bef766ff7fbf8e76873e17bee412762d56fe1141760ab4d25bafd4b6ef25b49a3506632d1f8e10770930760ec1325932c5a4baf9e90154264ddf442ec5c41fed95d11525151dbcfb3758149bad81c62b9cff7816b8f953b8b7c022590d1584e921dc955f5328ac72983ed5cf0d04056fe0d531e62f8f6c9ab3c0fcd44e14860b7311d2561c77c1d32f6c69dc8f77968c9d881ad9db5e0c114fda8628bca0335eb7fb9e15e625aabab58fc01194c81bf6fb2ce54077b82250e57c6a7b25deb6ee39d4b686a5c307a7612b2d85ee92512413dea297e44f317be7ceb70a3328af0b401001a418562b8ffe4e9771b4b4a8e0b40c791349d5d4e459fe620a1a2fc72e2f6ca28567d4c2632bbde1b49864c06bb12619f132c1da8f571ef613eac739f66ab3914cb3fa1ab86e05e5082ebaa24ebeea4cf51beefc27df512fe3fee7d Msg = ca84af5c9adbc0044db00d7acfb1b493aab0388ffbad47b38cd3e9e3111cfe2cda2a45f751c46862f05bdcec4b698adfd2e1606e484c3be4ac0c379d4fbc7c2cda43e922811d7f6c33040e8e65d5f317684b90e26387cf931fe7c2f515058d753b08137ff2c6b79c910de8283149e6872cb66f7e02e66f2371785129569362f1 X = 0x433cfd0532ccfd8cdd1b25920d2bb7396987b766240379035b0e86527ce9c52d Nonce = 40f503abd70fd49a76c67a83e08b062b3fd465ad92be433c080e5f295bb9f559 Signature = 21ca148cdf44be4ae93b2f353b8e512d03ad96dafa80623fde4922a95f03273273e48b77a3aa44307483c2dd895cb51db2112177c185c59cb1dcff32fda02a4f # Msg that produces a hash with leading zeros. Test created with BouncyCastle Msg = FCABA2CF434AC8DCFCEC X = 0x433cfd0532ccfd8cdd1b25920d2bb7396987b766240379035b0e86527ce9c52d Nonce = 40f503abd70fd49a76c67a83e08b062b3fd465ad92be433c080e5f295bb9f559 Signature = 21CA148CDF44BE4AE93B2F353B8E512D03AD96DAFA80623FDE4922A95F0327322913AFF8C187C277143A690BAA5DC4531D467D214F3DE3C1EDCCAC0F408CB91B Msg = 3ccad0018519a898f87d8ce5f28c0d93ab16c51addf4173322cbc49d48ca9ea37ebe8bc9d8c1b3f783f8cf59cf3fcba10a393eb2ddd989ce258e73788ce74b0ce8223d24e993cfeafa49cc8ec1b8ecee017d83a11bb7034c779206c364ac463cfed3047e1a2bf5c591773b1d882b310bfba2db87893c89a5442c0845bf644e21 X = 0x306c1304b380b7c3e09e7a4b489c64a295582bb3e03ce526f13d7482ef8263f0 Nonce = 223e52fc516c0a79f55a5474321264fcce78c050cf79b3d9961b37e24d7f32d3 Signature = 1ef7723345b2013b71104ceedbe7a9cad430018968bb295b672c2b57b9a108b972852da485c0836a8ebdbc4c996f7f6cb65e99391ce06b19a7187618e9a95584 Msg = 1fc98288857fb3a83ab507465a53c079ed66679cafdfb8653bfdebb03020fe86a943182d4f1377d58eca3c7710d32e210d8d03728bc69e1b8003944ffedaa1b69ae6cc506302bd6917019f588cc29501cc8263572ebc0feb153877174bcfdbad4a58659175d2de71d5f5019c46d112b6631cf0c3f912aac83140cd56cdf903ee X = 0x047a5e52039da40523feffe63312887e4d1ecdf64f32abb31dfe680bd1513077 Nonce = 69a22d61b152af35c1b43deda88d5ad456d38df75b318b82712b2690a5f2f647 Signature = 5dd0c7e8a3993b9de0676a579c897ea39943a43dbec5996e58c1985b541d7c1a67971001822a08a2148a6b1adb50274a57dafe896fb04a12a6f99707555306ac Msg = fda9765cc91a9db922aec7b13fc32ac4ec4e3b8534f9e95af96e8ebeab89d847dcd150444868cfaf4213f8d8baa6b1d0886224e2afd0aeb93d59b886572088d05bf721c7adfb54da47c6c4851204a7a92a11deb39ba17cf6c07fb7ce8ba350a99d018d4ea64bd56d1d9f8f7d88157f190fcb372acf6f8d31cf7b795b36c10f5e X = 0x7f6ce353841963c8a6ff3405713e361ef9f1e0765e665195e7c147dd98120c4f Nonce = 01cd3cdd3feb4d1a995103b1520fef17f60cd9370ad59b3efe9383a2c0126f00 Signature = 55c2b27e769fac99b47bc0a54ff1821c7a46be6001ab664fb68fb1bafc04446f3059db42a399c428f3cfbb102d6c0409b06f20068d1ca8cbea4858ac6e5de1d3 Msg = e49a12b8d761ef7afbcb1c377eedf629d08cc509a8753a5b92e26a2397365156e7c081bcb4686695575c6a64f5d77dfd550b04df390aa55e0d051c759f197a751a6041e2dd0959f902f2e359a167d880c49cfa81e7196fa1604ad32a8017071f098d4cb346b39266fbe75659dfc6607bf0d829640782cf3e12e38376c5a99282 X = 0x28d9bc1d9aaba882427ee26c262bd4003aaeba422bf053b0dde14bb6d6d74bdc Nonce = 0650ebc3e21bf1d90ffb3ef5a707013dfce78fbd2c21a0da9c8106d1fa98a46f Signature = 21d34df605237975db31b864f98c9ab6e465dbf0b3fc5868d67cd6cb3a13963b70c48807d62d1fe74d58959347ab12c97b500d20607ed2a95d8a388fee265812 Msg = 28f7a067a0ea7f0a4d797cea3939f66b281ed19cc98b8563ef375798b40614f4dd85ac2fcfccbc5ebf0ac93228c0b72937a481ca4f9df7a7e5d2e5da9af04874dcec35035f6a7db493793aa2361fb66ef2eedb7574d04e2147c357298a2adf99aca1eebe00cefa44b39157eb1e94aa8aa98d545151fbb4de67070b3904cce930 X = 0x0c5088f5d337802770e6f98349d53461f13161020ab9a241efed4faed2e569ee Nonce = 2be962ca1f82b879255e20d6971e633ba68582a5137bc55058fa42b48ddf0566 Signature = 12de252da2593c5969a6496ae808d851cad1ded2959ea89057a92e5ec91c5f95165338075e6a4fea0b238f9fac904b7b33dbee5a552646dfbed827f6d28d6492 Msg = 0e156b0bd84595155ef4fc213dfc7e46bf27a89c275723e0984076b027c49cb2eee6ac866d75333581cca6f897e11418fb37ba5cab1391cd237e2c6ab3f11a055d3bd03f425baaabe5a6a34eba4b118af73edd610787cb8eaf476bd217048208ea4c1d0591372947a1c0ef94696568983424fd1d802fc911e7bf71224afdbdd9 X = 0x2c4d972bb3539876b8f32cc645cff0d4be877175f31a028b9bfe973f0651789a Nonce = 5e12de89504bc84836c14fc47628a517e898fa46769eba2b36e7c69e580a6473 Signature = 5ef5d78c421ae5a63978bcbf7d2037b5022bc47be7b293806580ad5b4de27a4e67ccb2833c1d32c68e91ae3890b4c9a6e5229b22a5799168c0046ead92573c85 Msg = 849c5337d88b3b247df573eb0d665548b6423763d5571f8acb5e61e316d7cdc208cda5b39a1944a717587e58e21b86ed222b8ee265105a32baff3692dcf7b8713d0b539262a5bd9a954cb7143ee66f8764db6236136cb1cb3b34a87cbd3fee3b11288bc94ac99179c681a469d62d9bcd91d40332a650a5bce33b6026884ef94a X = 0x680878e382b713d4dc9bed8b7eae880f1054f58e70cda2717577fed3c63393dc Nonce = 48ea48cad85abe488665eb75359217b63387427093318bdfb5d7d8092d342caa Signature = 11b16351f8f72031ba2a772000ac8726a479e1be4523a9eefabe23947a1df0d92660fbb44e29e7687c10e29de96fa1ab03c087ccce086cddab48ec63774141c1 Msg = 4c37a4c8b41109240c4f53d87277d3c790b2f071105d15aa10bd0f7709da274ccea1961e0b99635b31acd2c80530d2b403d7110ad7cd0e3572518909c136e73e57d38c1c7443e58a257f0736b9f6f51da8fd1ae9213e8193003d69583381f020cce7fc59ba1b1ed5541dbef6b59925750d50b6515a977aa4325d5fade42f8287 X = 0x6bc051fba93b92859a8a06eb361f348f5e50d091c55b998476ecaa1777f26fb8 Nonce = 40c6be904308e25af6616fe77c23e6e6570ac32ba5bf54aa81f6773a5071a904 Signature = 23e13a35777c189ae56509c7afb411b31307737e2ffc8db3f208940c5e76edb30544758362cbb61d66b66826958aca63af1b8ad615a49ba557923959b68f8228 Msg = 443473d615bedcba2c8d9a9a45a28c428d7f1a26ab14705627d9ad13f53b767cbb60be523fc21a99c373bd7761817b314290f2f6a80e06e12cce238954c648ace50f3b0dfdf71dc308e1a8ee1159fc1f19b73ab6015d186d9b6bad965a9ad62e440a9ced13550a444b5f0400b96e2d238e9e3dc6e6de12f44205d4fd57f60e9d X = 0x0bdf6ed048358dcc9a2dc555c3d45ac394571135ab36168d9fc4ffe4a3529a80 Nonce = 63066e05d16e79fd013a6ae456aa3f036e9d58675b3c9e08a412420a64c1f977 Signature = 76bb0ecb9faec7c971137ea6feacf1792073ae80be1ca8ed9cec2a5ca6cd510f34920246730e0974fb0faa57e77fc50ab78726c8e51579a0ef5ebe3fce3ba7cb Msg = cee06f792332080d6e73b3f02f5ec16996b66995beab4a2ba092f40d85c8ac1accf54fba068128c8cdbada209360776a7706455015e73e92c624ada1dfa62ec794cf2a1a9294f3fb55994bc5211add1c685d9a54acd5bcd830d9a4fcff29aec5001c3b2b2a9706046f38bfe48e8522768f1c6f08a8e240e123ed30e20fc46c19 X = 0x530e54bf51b3ea012e76206b5ff53c1d5ae6f3433f2a50b66b6947e84dd52171 Nonce = 4e500b513c2e24ad17fcb8cc0d6a8c54e654e00a892545a33cb5af8877589520 Signature = 6d02536db546f2bb1f65ff0b91b964802b38d171e678054ee41f2b8563809cfa6bc51120e35c955ab8f717f8930d8cc8def8505415cf159d2516f96578842f31 Msg = 58aba24e9481d1151b574b146ac21b17110ed0b9bfaa55a4e2e06dcdc18bd10cdfafac047189f5ba9f10377affb40a514d528a3483fe8e64b831ea0cd076ce583942b938a4b257d0b5a92412e01dfda8217d5f8054596a61d5737d8ad8112ae228220e3bff60e2e891d03d53fb14f14dd91975dc15d6b7bd62e99d74ef3839fd X = 0x7bc2316b6301b772b6742d0c50f2c1c39bbede01448026b6a201793bfe7dc3e3 Nonce = 0c2a0d2b326ad63e869384e3e2e32fcff8db83285fa0a5b9a7b13589a7dd7fc1 Signature = 2c462d49344f3ad03b6798f96452f7d66351cead919e8201b7665c877f8255bb50e8908a1c6684a2caa8aafb432cda4b7699008c72d8d622c3da4171e51cfdbf Msg = e10604ca00728e533621dbb6618b0c877c4902a2ed79aaf40a4daa34d6cc216ad4648daab6cc1e18451bb94e6a1c0c6f9d0d883962eebd507da099788008da23205e3b4e90fad9ae857074ffeac63430c0facbae489c54c957db09d53e12b656cc278615a3a5612af4c2f168bdeb118a42a2a67103fac321adf5688b05848f7c X = 0x6dd500e2aece9ae331df269c26a4e5d58fc6be3963f5002e36bd9cd04c1adbbd Nonce = 65243ccac0a014b9e52638171b4a88b02a8c6e617ab9467da523487122e6650c Signature = 56ab9947ac94fe3df7e35801660f68753b0b620a26594cb8fd375be3ea4dbf05608ed1835139af29a2e3d874df465edd8d6428f40357d9ae4904efe8bccbd035 Msg = 8af31f66772fb0c31a8c5b28e568e6368cb66b591edfb0db867fd99e83feb3638bc80f0b14483d069e8f2e167c8b0f10cd6b45d039b7d6f833bd58d99b00597aeef82fa3aae2e55ded62ab660810de0fe1c92d53adf98c838c18fd76a273ea12119d675af727011869943d765b96ef266270b4f89ac72edadcf707a4a21b7533 X = 0x145abce3eaa8fa6b670afd658ba0c14fa98d2d20e1422367d4455967f9844858 Nonce = 06f085f77088ec97cebe5397a588369e3dc15b70f2a5316a6dd5f94967fe3dbc Signature = 0fda7a8a3e5d324fc0a1c2841cd22f98757a0c6a2a465b0d9d65bda9b23b3c1a40860265229085453fe58487a933edf3c28433694c7b85f6370d9a4783168237 Msg = e2456ef5d465731b976f2ad1fc94634c0569a0ff7566a49d47d69e60b3b6d7eb2ab25cd49c931299796bff7e9774075ea20a972e3949a29dfb50b2b5613b45c596ca5dab282ff183f564a06311a49601a1e8560d43c6a481ce713f46c6ea85bf4c16489fbd72cf552b26516298bc66942a05d5a8e6d0f6a88f3e678d310e297b X = 0x286d3cec1d2ad2a85f0f163245267438f7d7d62149ba9e59a18dfffaefe44358 Nonce = 183ca3afd082bf3de19e89faffc5cfa7dd713a873c02c723279b3091f9bc627c Signature = 778640ce75da584a6a83f9794c4ffdbe30411be43027758c74f89f7ccc7f39836125481e103f7803b2f16d9a4d00f881e0b367024df5822f7cbeb5711e0e4401 # [mod = L=3072, N=256, SHA-224] Hash = SHA-224 P = 0xf63b3cdd646d8e7ddb57216aa6eec2134d707488a1f29cfa9970645f1227ea5db2e318eea5da1687c7ed90509669345ed6134cff32203ab72aecbfa693d216aeb55d8d28a981f4abff07d1319a799be5dd746f84842817929c305b408598af12045daa2f1ccc8be4d81b513c630f017fec1658aca108a1af6120ec05e3018c4253c9dd35bce062b73d0f2a93d41c481a5c43bb97909682d39a9a60dc3c35e36375dec6ced0d2db3ba0d111bedea701a0e4753624977a9e75b70a74e2b81e38a52ab22da131b35416d3cec9663079746a763476e57598142e39861545daaf8d38a176f26c71f5afebd9c5620da80cf3452b55c37c661b4a1ec0351710b9de4a3cbe0b98b4d9ec89128d97aa7efb19db8ba43cc0be25c200f90e1506cb78ec0c336d7a95613d4204e8ed68d0f0a6c78420105a8d2d438fbd2551a64a1a0b03ffb878742f8c9979cfa87394150281998d51701d5fcfa9696a4989fd25f400955e626b1abe926c0afa69aa6981900effcdd030592f82b2042a47a9a5a8cb0283dc4d Q = 0x80000000ba4634b5fa4da054bd0ca48ae490e57711f381193842429159ba7ca1 G = 0x8ad4553c4e49aa24728ab5024417b132d2ca53a55d959458f2f759adb0435beeefa3a2cfcd0038e2420643fc4a4deeb5d9feaa1edf21193b40e14b42982a94f35c58b81147d7189d263c9b12fe63ab9fa5f6f03a2860c186432e3ab04f2ab0f2fb6147bd9bf7ed5d20713b9da21383e2c3a168e7d09d3d8a5a058fd23095b5acfeb864a3306be2425fa1ad32ad6d9382e603b03c68af4af0246397102c4155cba811abf99da7839e77b2eac9970588ca1d0a2361723a164ac9229c2e80dcfa8db4f9e29803effb3168c7fed7a3a6de40dda19a0536af9b5b7afaefb9c70d6ae8df12da658f6236043aea873db29ceb6f07d108f5225687bd0c30e3084e2090b45ae2f92a97b8ecb7a9705c4956b8b31c4a3d61107c84e47adda6c80d5d22dab3d859220f9d5aab13677ae3df168f0c176d176b54506c639853f04ddef2722f39c18e5ce426e14562ad8ff26247af88870efb72c0cce836de8fee67a662378245b502bf1f83099988a093ce7cdc81364c78b1f4a51b800df6137c71d65e6b089a Msg = 957973fc3f3fe3f559065be5d4a0c281cf17959018b9a670d2b3706d41d5812e37301005f8b70ebd2fba3c40a3f377a751b6cb9693e3cb00d92888247d07921d3c1e9257ce08733b8926e0df7bdb6e855f1f851075d4e628d110d42b643b54876e5faa3611477ee68371562555269ed62a9271bad50cc4d46038de2dd41920c2 X = 0x524a7ea5977f8102b3552930477f5f042401165d4637dcd8b9d13df4f3aae5d0 Nonce = 29e4d7790e181b4767903fe0eb37757f33f13337c33588c1fdbfba0e655ab621 Signature = 2e59d5f30f73781d38255b70dedeeb38ae78df4f002c1f747c08deadc6530155615c55b2df0ca28c60a6b385c58fa036df8c4b2f4f1935730bf8f4f0bed13610 Msg = 54071aca28969749ce2e2dc855052019bec27d0dd6a310219311b4b6d822467b22b3f02fb8313993fc77c4af1d76ab9db99b0b2b78204aa45f4032a7d945f93d55bcb8a6bbd47f98299a0929710461419edbe1132dc22575f5afbe7078cf5f05b231000f4a0f9f367d9025ed3ae1786e0183eac93ea96b55304a8c2dbf690821 X = 0x4b2d62d0e7b88436737d03d6f64dd6a6dd0757021817169ba373e3a31bc12cb7 Nonce = 5af719a9e5d8567dc26576782e8f247517fad5ac5de0f7115c5158748fc73b40 Signature = 0debcf6c88504a882a0191e6fa4c774c10858362629428aff24c22e3364baa1553d8c1dbb3a2c1023521b705005ce6350bcf66c093588c35d768fca295a4a9ce Msg = 49d5f20acf1e9d59a656bd163fe46fc868476ccd926377a40ed3d7476e9eb7a8a70c4b88b16e799148d25fa23bd0c91611b76c9665f5722f404fd90efdb8ad14b759c349ff6c830642d51076ccbdc57f152fba41c6a7f3cd3905fa7c857265ffc7596a64dc69490a932b95adbc79a3b4f21b2c6fb5d5835d8bcae5d44d912a0a X = 0x4abef24f715cfb3ba6e39c26b07ca46b700aac69fb8df3c0e09be08df90e44e2 Nonce = 5472e89286e6ccbed316fe7564e3eae899ed7bfc55ca7fb6fbc392d191304bfa Signature = 19a73b049b164dbf7fb2826f4253617cf1c5bb46ffc5204efa00002a79e23c0b7be137c109e68f337b5a21cb591a87af1cb8681419f875ff8f041e829991fe28 Msg = 1190853efb7e04cd4947c1ea5b1b5d9e0ac5e6df1dd050877308f1b2c7e0a4917e588103d28c0f6e8b72d967aa06aca68a986d807740f2dddde7281e550af4f637eadf61f880c7351b486615096f6ba50d8754bbf9ba1c49a3485815ef06b3cd761b5586c3fc2b464c6fe12c160ab0f6f446fabf74212430cec15e75a57b102e X = 0x7b2510c73ea6447bc319de79afebcf45482917042a3ca3c1cb1c97d1a1216b2b Nonce = 0fd7617bfdc671127a1d7465f683b98d8951a741f85d43cf5a5bef9232a16ae8 Signature = 587d7f4454d59418a7527570f28f1b07451f3baf28f5cabe0310c4d79e4253a518839404aaad59ff24d6accec3b7cc6ac7003dd4adf96b77bab068ae72f25f61 Msg = b1cb430c5a1d72788c795ab567a84c7f5977965933a5bf238058f2fc818880d25b4ddef9635481fd9fdd4598aecec3764fa73093a225d4e4ebcf01e4b75bdc1841dc01652c4d9916afa24b89c2d6854b72eaa7b1f3089d1a919210831ac80f99835790ce64abc34270cd4551d31b8f5348ce8a70df60b88e085a984acac665a7 X = 0x403b2137ade39c1e5b817ffbd0bc3448024089fc1925550b5b860403e7ba65bc Nonce = 2c1ca8b5ce7247dca6173fbaf854d00020ded6300311f53ebec8eccef9570d07 Signature = 60d2763f0138076e9e0e20f83e4aa2e9aa352c19ca79e3726303fe89b12e27f207e08d916c8a10ba269dc460ee9d83f86a7b3d98621bb7324a6a7e607238baa3 Msg = 3bb9430eea6979129be745d5ae6babd4966e3abf7d9ee5856f2caae6014cb340eebd28bd9f391eb46b3a2b8a4cdc224e5508532ca08cb104aff677133cf4393a20fe4499967dfa64515455930c659d43bbee2340b14a3b3342d4b9a466b889e850dff4b2a51d389ca32fb6a5f433ed93032be4e563695797b8c1e1e019184172 X = 0x0d3fc8fc4c59971a963e8e41d26a86499c962615c64abe011e88e590bddd3b0b Nonce = 32d9aa04b104b5d7b59a122b368fe0cf476e28098b898662a78efee764545ea5 Signature = 7416729a1f60208b7f837480fba81840e45b338ab9846e9bbb9168229f64bcea58eb904076a3ac6907d750ff6cdfaa465435e9982ecbdf72197b09bb6df1373a Msg = 55a69fc16f6b753d0bf65e844d067859f51dd329279980196063fb59f89bd778a9244f932c2adb6811183612105d1c527e8302dfee5042cfce5dbeab165a396f5a4c21339be1021b7ecec66f2177f94243ef6261608c56919679d44863cf9d2afc6010fc2bf821b931ca3970d69b1e622a908389db5049d718e357071063aef8 X = 0x3dd224f00ee1d4648c600b10ba05ff36ad2c06ddc5a9f0112e0331ae958f36af Nonce = 7969d08c0cafe4019b64ad3e6614be0aaabc2c2be61b3b3dcdd10d5f75fa24bb Signature = 136f93dcc7d33e559b8db0af13e00c7190928bff5086eedfd11706e6f2349ad032b95b9b147c7d1ac2a2f0057fc0538a4b7c9cd4652e6783e5d7e3534655631a Msg = 1567890c69e578a27d6208913dfbc20eddc61f5feed457400693dd170f8067bf290b11150780684c20d5cfd2bf1d536dd3b70025883fb41703436fd09c0a141125784f9091151303ef80cd345e5a7d2854335c2984538c5cd739b007248cd99f1dbcd3148cb0ff0db633f8cafc7a0b99c61e784d0303a5120307d3fb3c4c219e X = 0x3ac374b2a4940d92ab35ebb8e59677fbf95980fe632ffbb1db4f385ee4e13a15 Nonce = 7ca690c92c8d4a3ac1d5255a2e5a12922093b8b2ee95906eab29b67f84fd21cc Signature = 4947d36e7426f1441be5a75dc9cd845450c61104f19ed40ce33e252fa2c26268356879deb1daef01da04750d58e598db47aaaff50b1cf42d87334a615780ff8c Msg = 4f7d894dfb7d82040a9fed6c26a7d27a9a1511388c113c64715a06dc46fcf4f904070a6ed95bdd8dc1730a27645d37eb3b02847cb1c631ec0c67b2ee07b8805b34dd9b84e6ab3f9afb9246994ea579567a8f4af7feb86898cc9cb534c387993c6ec16584ac85bed36bbc2c305770f21163686167dd53fe562362ff549d903539 X = 0x2c14cd975bc163f9740dcb4a5ba9d8529c5a075016e02400dbfede8dd4f0d245 Nonce = 141936264e075533a96952808935238d715e7cbd840c016ee7a9f508608e4808 Signature = 0940724855a0671d60147dc61fd283190134a68c178114d59ab58da73a1c818243f194b97078dc9b84c8e8e867a74bafdc2211706ae110b5aec0b99ede1ffed8 Msg = 9b62a74bc49ef4ff5c62165e7d25521f135c836bc4ef023fb4bb1d6b42c6291071eae0b465c59231cb297cac6d145875fd84f5729f79f92218522b9e55cb70d471030d36291a24925ab731a2d4458cff677079d207ce865b3d5526009238861d64506a92b76baff59b37b863087558d5965d76685f0fbd1fab1b1f9561f8f69c X = 0x70e12e51a254831bdec081a8882e5a24d78b48b6dd163727b93f803734e06a3e Nonce = 5de7fe70b5c60ec0ba66ade4fb6b0c925d1d56d26d6f57c5d12d07b5f6f800ed Signature = 01e3de398b018a694780ddc6ca12b78dc55e7ad9fdddb5a3f5b2cad0103253dd03c98280abe3050a67f88ef29fb214a80124f47321c62e41e3905b8532f4936c Msg = 6c66051e04c2e6aaa43de9aa42cd9f61e8329c124ed3031b67452db4c435db291d756ba6ef90ab06307cb8d70f3496792e633bf5ac985c37c43bdb4e455c7f761a5ee450567f85cc977e968e7fa42a428c1a7e915c82874865631d8078899377255947c344618297b83c96114d11d74d8cd579b553667cac1d97aea4d1684987 X = 0x11d2f10293c3884b1e28a600dd71b2ed37bea133255a0f97e641f9530bb4693c Nonce = 2621703fb8f5094bc68eea72d5b5caf26f8ea3a173158b8d3e7f9565296767f0 Signature = 31f2c86287e572ff4d07421a58dc7b3d727de113769952b6d8d736088b36a82530acbd1c4cd6aa666ee52b0bdc41fc3b239b60d57e279b3f5483c4d54bdd97a6 Msg = 5f8d7f283af00384a519769029d208b61eee0e1cb21ce9fb80e9d8596b894580da7ab3457429e72dfa64e7cb839414de344da21cff55b1b3a83189d208ad2089b35abd78e2416bceb66466762fd7ab9c234c4aec3872cbc8443c92b8ce4ee4595425e746e4b6f7972ebd5d065fb3fdc5e329e8a87ed3cddbe279d57227ae4b13 X = 0x1de925bf532a50dc7a10984bd1dbd90500ec9ad22df0f2d6f185fd1ba8060d37 Nonce = 5f0d6676776f40cfd5ca255fd8e32b10bf3472b193818914876d4c3be68a83b9 Signature = 7187cae836823618f9a6e847055ca2bc38c86e726d02d38f4950eb6b71b36bcb21f6ff4175765430e2dbed342a85d30056b28905744ece5dad79755ee3d7bbbd Msg = b216a035b0ff29feaf7d4c34eeb1604155c90338006753ee2b36062d72f62b524504659f70b976c68952a62c2b9a2a00cf0066a5e5098a632df2ee56dd1a140a98f7b3ac12db3576b610d76563e4621637da1098aa20f3c83247b7278860417cecf7e137194cf1bae12bbc63a7bae02c906d503f694dea3bd534718e37704962 X = 0x3bae9330b47aab85cec948f944ac13221ad35d859de56db56c31aae88345cbea Nonce = 248048e6fc52c48398f5cd2ccd8a659c4b7b76dedf54f3fb90c5bb173c5d24f7 Signature = 67df1d510d063c9067e9759180be470c71fe09c4f133aca181bdb47bb87b20977328b887bf0d520abe6f24aff2153f40de009e2706ae043dd3aa55521d9572d6 Msg = 6c67116fbd21a0e3ed16b3c4ca58ac49661918bfc6a7c3a6acdbcd53dd4087034fca164df8d38f7ef7db03363701409246382ee053c69c84fafa3c77ad2ce08dc7f41c34a31da496d070a99435799f269dc8effd06d31f85879c299cf7241b37b9a4cfd545086393156737cd9da2d282e7d569fcfa5cbde4bba51bd89fdcc913 X = 0x7fa66120c5acd5bac132d07083d07968b210cd9c26c2c56d9b16d98066f5df6e Nonce = 5771223a25f539c80481baebe7b2862156fcf26220d6e953c37f2a22bce77c0e Signature = 7d489ab0d44bc73271ef42e28a60e1b7ef7dd27af4045546047085da408bccc7310151d943f088bb7dfdcd52d82884a7f1ee64d46f9d600d23f52f4cea4d2862 Msg = c8d416c1efe686637078122f798d8804f64a6e85e05f7e8e07634a309a98e92abd54061cccc319f1acd4a087b1d7dbf0b6bf2a09c5dc508ed14dcd5442056eade7691b7fb65b678ec2e137b5fbe875208a427c2a7ad90665426fbcbc7655e48a8965d23fdef11ca8092f511207a607359f94e91b197fcc993ee6ce3c37ad3b71 X = 0x1f4a3cf1fb60360db3790a03fe55194985977c6884a5fc05a6fb5eafd53587f5 Nonce = 589da8a8ac79ad6b62b353422691f35e6474e9c605d877670dd95738b4935f06 Signature = 7fa51231bc845fa8b668393b78a7b0408113fb77c1e36f3c78c67d65715a8b58730c9e3483811c52cf295bad042acb5dd6ee90083857bee95b6392b080b5041d # [mod = L=3072, N=256, SHA-256] Hash = SHA-256 P = 0xc7b86d7044218e367453d210e76433e4e27a983db1c560bb9755a8fb7d819912c56cfe002ab1ff3f72165b943c0b28ed46039a07de507d7a29f738603decd1270380a41f971f2592661a64ba2f351d9a69e51a888a05156b7fe1563c4b77ee93a44949138438a2ab8bdcfc49b4e78d1cde766e54984760057d76cd740c94a4dd25a46aa77b18e9d707d6738497d4eac364f4792d9766a16a0e234807e96b8c64d404bbdb876e39b5799ef53fe6cb9bab62ef19fdcc2bdd905beda13b9ef7ac35f1f557cb0dc458c019e2bc19a9f5dfc1e4eca9e6d466564124304a31f038605a3e342da01be1c2b545610edd2c1397a3c8396588c6329efeb4e165af5b368a39a88e4888e39f40bb3de4eb1416672f999fead37aef1ca9643ff32cdbc0fcebe628d7e46d281a989d43dd21432151af68be3f6d56acfbdb6c97d87fcb5e6291bf8b4ee1275ae0eb4383cc753903c8d29f4adb6a547e405decdff288c5f6c7aa30dcb12f84d392493a70933317c0f5e6552601fae18f17e6e5bb6bf396d32d8ab9 Q = 0x876fa09e1dc62b236ce1c3155ba48b0ccfda29f3ac5a97f7ffa1bd87b68d2a4b G = 0x110afebb12c7f862b6de03d47fdbc3326e0d4d31b12a8ca95b2dee2123bcc667d4f72c1e7209767d2721f95fbd9a4d03236d54174fbfaff2c4ff7deae4738b20d9f37bf0a1134c288b420af0b5792e47a92513c0413f346a4edbab2c45bdca13f5341c2b55b8ba54932b9217b5a859e553f14bb8c120fbb9d99909dff5ea68e14b379964fd3f3861e5ba5cc970c4a180eef54428703961021e7bd68cb637927b8cbee6805fa27285bfee4d1ef70e02c1a18a7cd78bef1dd9cdad45dde9cd690755050fc4662937ee1d6f4db12807ccc95bc435f11b71e7086048b1dab5913c6055012de82e43a4e50cf93feff5dcab814abc224c5e0025bd868c3fc592041bba04747c10af513fc36e4d91c63ee5253422cf4063398d77c52fcb011427cbfcfa67b1b2c2d1aa4a3da72645cb1c767036054e2f31f88665a54461c885fb3219d5ad8748a01158f6c7c0df5a8c908ba8c3e536822428886c7b500bbc15b49df746b9de5a78fe3b4f6991d0110c3cbff458039dc36261cf46af4bc2515368f4abb7 Msg = cb06e02234263c22b80e832d6dc5a1bee5ea8af3bc2da752441c04027f176158bfe68372bd67f84d489c0d49b07d4025962976be60437be1a2d01d3be0992afa5abe0980e26a9da4ae72f827b423665195cc4eed6fe85c335b32d9c03c945a86e7fa99373f0a30c6eca938b3afb6dff67adb8bece6f8cfec4b6a12ea281e2323 X = 0x3470832055dade94e14cd8777171d18e5d06f66aeff4c61471e4eba74ee56164 Nonce = 3d7c068a3978b2d8fe9034bcad65ad7c300c4440e4085de280e577eea72c1207 Signature = 53bae6c6f336e2eb311c1e92d95fc449a929444ef81ec4279660b200d59433de49f3a74e953e77a7941af3aefeef4ed499be209976a0edb3fa5e7cb961b0c112 Msg = 0661c1bf79eed78ad4879e240a46b95a0db2b29bf81263b9b1676daa2554aad7222c9eb7a893048e46fbd2826ab6e8cf42ab0cd631c4c4a1a819560f73cc861a5b6465cf2880a730635ed7f49e28f7b565768f029db2a443ba0a1bd10773f26f752c83da40fcd33f32f78d24ac9820d0bf70dae568a12538affa867160c81e39 X = 0x807675fbaaf0b6d6ba3d82063cc07327cca3f3522d396fe5d2c6599045d668c5 Nonce = 6215e72ef2d6f6e040b7b6ef4cf566a21fcc4f37783a68db445c1ddf3042a150 Signature = 519fe4c5f9b7707ae4b36217ea1707a1871d8fce98eee9e643c45cd3eb50c5d31df224af0b51519e11d8422999b1d3ab0972064180ffc3f1114c9f876a1de3b1 Msg = 1597353f24aaf515fd7c0b0a7453444d5f329d6c3f099113bb3a13309b053e6c123a56227a81e8b1a0c8ab4b46160cc5380df591b19d8a386d29a8e43ccab5d8c0e547fba21bffcf5ef42efb9fb2e9be6297c03d57da0b5889b3b9742ddc2c54b8373fed1f2195f5bb2329a8f1f3f8afcec25eb152e7fa819e5d36cfd3625239 X = 0x169b11d03cba7e817da27d889cdb147ae9cb0459359bbf85a367c64c2ab556ad Nonce = 467e04dcd564f36cfe47c8fb9fa09cb142a99417a61797e047fcfd51e16e3e00 Signature = 0502a6e1d8c8dfdf56eb67f9a6f6605735e4d1b0076c8b08b61daf8e7c2bf2d67c67abdcf4e580812b13d0a4edbae8a2786d6612bc866e3c13bc09f3e96616e0 Msg = 715f296930312368a2a98d3f42810da57115f00ffc4a12029c276b10629e6bddd60bca2c535b79a5f4a006817791f7f3ad2e01a00216672ee5adec579deb07e9d2b0db222c4e01e1f819c1a52d101b1ef678cfca85655dd6b2426f1ac379a92a9c69b0f8987432d109cd9a7bc04ef287c2afb663444688601ce3c55fd90d0fa3 X = 0x4ee80e4cf46b4e072e976893a2d1e34c03d20f3aa1785a74564d6b4654b11a54 Nonce = 3d7728ce25def9a31dfbe442fef8b162b30544065d9cb7bcc4914662a282bc10 Signature = 4c5e990a6e24feddab48d0af4a08b45ae8092594bfb3c012fa1c325c977a3cc0820b6cafa89b41c4ccbec842d7c408c65d4998ab1ac6b6bce8d4d569cdf04726 Msg = 1fe5ad49e11c207d3d5e1923060832afbfc0aa0cb29fc0b22b3be59a598f8c703b9bf2c7347f8abde25677ea9cc60af9307d21d301fdd23c28277fce11400310033962c04ecd377fd446358a3449efd6bc05721b784ddf0e238f28608e86bd4c3d7ac631fff8be0678d37bfbac16b75bc15a50ce1397dd4ba3bffcf94d341274 X = 0x0d690f2c87fe2cebc9f15546f05afaf6dc843b80abd2046f33de30c2e806358f Nonce = 796cef38518aed8644ec5a1b3389da5ee9b063b88e7fb4602af0709999f9a938 Signature = 41a2c955f41413a7ab067b4f50c61e396f9febff61c1500b1a4bc69e50a5193579edd751a9dc2372b40580fa4d538fbe2cda4149f6b11939ddad92c574740883 Msg = a326973093ce502c16473d89ba196507d92281504759cb34c6cc353d45197f915b5e736b8ff857a8b2ec99649a3224f857401898c9ea607e6a2c1d320f27564ccff5dbdacfd87a145f1a029425d76502c081ac0f6a14de5b2cad1c23a61d4e9ec6a04e1a455fd710c3c78c096753c0b7f1511e8ba5f5f1af4f0741fee88b77eb X = 0x37d0fa99e5eed0fb51c6e690f0ac556ae74cab9a84d887a07363599b198475dd Nonce = 0b5c9b613708ea26bea151a0dd4222bb573d950588483483cd2b8ab537469e53 Signature = 73f1922e26d9b8068b68f83c2bd5dbbb5960403b49223c02a42ce6cf3810db663ad30be9a60f6d4227039456c9827d5424858a02a8e6d3891772cf80a5e4ee21 Msg = 7504382fb7fba1dab3c93bd31b16e73d9ae1d027dd23166b3b94c7124183faf3963c420be5205a1f44a9a9026c6ef77e7c4ef1ec4845fef6e5ea2487ce012ff53f9450fceb0d3ac62f2102d717e3287db3714717a28cd8b7fc64556a86173e6e7f479f8a8dcd895429cd7f0f5304ef6aaf275d94a7f4b30acc1071787ca5f062 X = 0x1c21aa2ef3b11d31f3c94a278859cb74bc40daf5993dbd774b32ea3ca24bf162 Nonce = 44efaf7a15a1eb2a7ba04fd4717e938fe738666040b3d81560497ce166f31e86 Signature = 56e21a7ab61f9eabbff47c75e5f68c31873a9e1f2e1db662731182f9a029b8f62f24c52f7baae29c0b4633a3855233180eba80611dbc7e88e23548a520b60f66 Msg = 0c0f7b0f9955bb54f16e4e39ad9bfd1deb04b8e8b38e674da455696bdf7cf28e24114ad00513d8dd4e5c895d351ea913fee516b646820087721d9a0b5ecd769b3825739123544e7058b66d2342b04462d5d173cdb00ef6aca604aaa438b8868d15dd6624abb8d19384db48bdaa66471413a894d3610bc97d848a59e2c69c0c0a X = 0x34651f5844cbf85960e987190eda4ca1fcf32d8cbe1ad08dd5aa36fbd0d42000 Nonce = 52c16c3e7b17f3e73d7965f584bfd7ca036423b0d42cc00e58d1ccbc419d33b2 Signature = 77563b3b48fc9ee0dbea79fc74dd6c69b72c4270918e6a1be2c998177023b40f099cdd62dc044a57ea25d1b5c1f6ed84d11bacbb0975976d5821c414b5416bde Msg = c67735698ae7bbaeb6f321a1088617382a5c92092151ec364582962c9c0ed9ed8fc790cde0d9744d4e38970a8482401c0f61e91805f4984b8cfdf9dc8093a5c6681dac13809bc41d167d3e11bc99698a4bc07fd248a67491e8641081ff1e97871745157cf930195a35a14d0883a26db442e4edb962aa6187b8d1c7791d61bd25 X = 0x2ad20d2e78a9ec234f99a4b2ff52faf492c3e3242ae6c04ea8a37d5f10fce6db Nonce = 654dff8f0500b52adbb70fb7bb7aec4b4820963706964c19c8320e161c3ba365 Signature = 42c902c5826874774550464c4bb736f2af7fd2a347f27c65bae11820eeb752aa6411b45947a43c5b01c2f6cefcd41cab73fcb6ea0f2a35a21475563055316e3e Msg = eb6a0359c6e46e09a42c554705bcfc5c0c022670b2f6c1a5bfe14ea805759ca2256153fdf815057ca9bd5f4cf837e14fdba3ad17612ccd19fde00764ba2e8ecd8f5a185cb26512f7457259c2f0670852741e7393b40c8bab673be2fa519b48a95dee6552365fdb7ddb632b1b33f1a5290b828da5965e82d874f79cdb928814fb X = 0x0d06d405d228c0ed860b9e21bae570a6fd940cc702dd6e9a0846e7b2a4be47a5 Nonce = 521906f186797e7f5ce85112ab2457ddc030d6f34be361929f4d373dda576e08 Signature = 0493db0c18a3882709b3cc9f8dbe05454506c04c3a12a41d599d201d7615b6d87494b4d1b2f3ae22797255a1d0662746352a3d0532290402068594cfe48c23a3 Msg = 5c59b209bbc0a1e010cb108db4101b8e2d04ced91299a8742322102e0d578c3698422b43d19d331608188bed4c7edc03a442f89aae60f4e7ee9b6325de3a8bb702918c21343bc9b266f2ebcf5a620336a7bc99ae3685f19080db46f24a501228c5bbfd9c0b4b0abecbfbd676c359607ce292cffd52d26af80b22e3c4d516ba0f X = 0x4214d55b0a058c3dee2751407d9296168fed9f255e5c68273e1e5aeb3e504e67 Nonce = 574cca3bd87ec1994449da2f2324a3945fa3047791274367bac0f12d4c064343 Signature = 7fc9bab3505adcd1b1c8127e2d1fbcd0e15eaac314250dc1c684fcc47fda299370f2007edd68fb9dfe19a63eee4d5a977291abd235ed26e4291476ca5d0c8171 Msg = c805d18c0bb53d32b57cb652f5b0e5293be492a1c88dfbec5baf47ee093e2df06918994e5cacbc3dfff229abd31fab7a95ade2fb53adaa7dff51f6c8581c69eb5b090baec38607ee9435447ad8137455b6ba179fc53ac094f97e3e29d0724cd10811f142d67d1cfcd5c3d1e9b411dac38f6e1c0c14dc9a50d84bcf00ece8a603 X = 0x3cc7e58577382500cb461c0ab8ff01ece8fa766b66f8be746e347ed2ebc18ebb Nonce = 179c02ec8f18fd88146120fcc51628f23e250ad694aa47bd691c0f442a63a92d Signature = 38208c0985624bb9d62713bc7150942cbc92b8e8a36ef6d1ec4d08d1d9a5715f65d2ba787ed4c08beabf24343d06ed61872d6d684a3bc70307fcb7e20df931da Msg = 9e0c66a4f120e85aea064e7a8ba132cf30a45de2889f3547384e4e84f45b3572bb0423b834de9f2c9636faffdb6331924f0d2f5b6876145d9cae110ab0cf6fc90c2eeff98c61fa186cc3952b57299a73678f4585bb18fbb84ef4166779ff10eed14d47ae528e03298dbb97cf4f88b7e6d0959b5894550a3e2e356947d25ffe73 X = 0x5c5791dd648703f29099736146f5b1b5e35dc71a74d6eed312d37aeb6d389ef0 Nonce = 8327daa2fbd001858dea53d2dc0cb005e0ae5fb15bebc0c5efd33371637ef318 Signature = 4e35f586fad4f512863c485ec61ed01629aa1399b16fef4d80cb332752b1da92262dfe6ac72a2f6044f62698e42dd2f92b1f9a91be42b5fdd293b1bf9a145f00 Msg = ed88d7076c5f6a5e0f947543d5fe746afca9b2c4d06655da4607685c799c210be4aaee0e6ed19713814182c7f7d584ddbed488c8e3239ddd810555ad6316d1db37fd9553ad74e3ceef9eeefaf54563602f5547aad4161e9384edab655a898416db53f71237ac5a1485711182bc5bfff72460252784ab1bba23634a36be77533f X = 0x22b44bd6d23ee65ebc2e88030f837ef65593eeef0966239a92d5126cde867a13 Nonce = 0c37eecd48682f897accf43b3e4a538cccdfd784625a6cc046dc54b093d16162 Signature = 2e7cb404a6daaa8e00760dafc95b4eb5545683224a61a1bcd6128bc4e7ac535e3a70b3a97e06e63b89d56ed5232346461c1a3b6b145d89043a48d666de0256d5 Msg = 9e440052ed927321948388776d3719be068739dc2d6c64c5937176b2005c2d70a9389e6a655663366c0970a8e2e3117ecef257e951ac81c0731dfcd4fbdb1241bc249adde9cb398c7d15e381368ad3d24edee23397c15a5a356e787d8f2fe9be76260bd363e17006281c199fe5b710f9dfcac52895e392f7384d71bb83053ffc X = 0x680883caf23665e813572c1e4230218edf53b3a5167f56a7d80e53e7d3ad1df9 Nonce = 69e6cb5bcf8cae88c96e464a9b26c6e1bbac1e229909e27542278a50c66959f1 Signature = 37c34f9cce916df3deff26be08a4e6bbae0661fbbb5d81d6039f00b1e5632b673f4a2932917e6bb088599a269d7b590769acf9807dc5a9420a95e12c7364c5fa # [mod = L=3072, N=256, SHA-384] Hash = SHA-384 P = 0xa410d23ed9ad9964d3e401cb9317a25213f75712acbc5c12191abf3f1c0e723e2333b49eb1f95b0f9748d952f04a5ae358859d384403ce364aa3f58dd9769909b45048548c55872a6afbb3b15c54882f96c20df1b2df164f0bac849ca17ad2df63abd75c881922e79a5009f00b7d631622e90e7fa4e980618575e1d6bd1a72d5b6a50f4f6a68b793937c4af95fc11541759a1736577d9448b87792dff07232415512e933755e12250d466e9cc8df150727d747e51fea7964158326b1365d580cb190f4518291598221fdf36c6305c8b8a8ed05663dd7b006e945f592abbecae460f77c71b6ec649d3fd5394202ed7bbbd040f7b8fd57cb06a99be254fa25d71a3760734046c2a0db383e02397913ae67ce65870d9f6c6f67a9d00497be1d763b21937cf9cbf9a24ef97bbcaa07916f8894e5b7fb03258821ac46140965b23c5409ca49026efb2bf95bce025c4183a5f659bf6aaeef56d7933bb29697d7d541348c871fa01f869678b2e34506f6dc0a4c132b689a0ed27dc3c8d53702aa584877 Q = 0xabc67417725cf28fc7640d5de43825f416ebfa80e191c42ee886303338f56045 G = 0x867d5fb72f5936d1a14ed3b60499662f3124686ef108c5b3da6663a0e86197ec2cc4c9460193a74ff16028ac9441b0c7d27c2272d483ac7cd794d598416c4ff9099a61679d417d478ce5dd974bf349a14575afe74a88b12dd5f6d1cbd3f91ddd597ed68e79eba402613130c224b94ac28714a1f1c552475a5d29cfcdd8e08a6b1d65661e28ef313514d1408f5abd3e06ebe3a7d814d1ede316bf495273ca1d574f42b482eea30db53466f454b51a175a0b89b3c05dda006e719a2e6371669080d768cc038cdfb8098e9aad9b8d83d4b759f43ac9d22b353ed88a33723550150de0361b7a376f37b45d437f71cb711f2847de671ad1059516a1d45755224a15d37b4aeada3f58c69a136daef0636fe38e3752064afe598433e80089fda24b144a462734bef8f77638845b00e59ce7fa4f1daf487a2cada11eaba72bb23e1df6b66a183edd226c440272dd9b06bec0e57f1a0822d2e00212064b6dba64562085f5a75929afa5fe509e0b78e630aaf12f91e4980c9b0d6f7e059a2ea3e23479d930 Msg = ed9a64d3109ef8a9292956b946873ca4bd887ce624b81be81b82c69c67aaddf5655f70fe4768114db2834c71787f858e5165da1a7fa961d855ad7e5bc4b7be31b97dbe770798ef7966152b14b86ae35625a28aee5663b9ef3067cbdfbabd87197e5c842d3092eb88dca57c6c8ad4c00a19ddf2e1967b59bd06ccaef933bc28e7 X = 0x6d4c934391b7f6fb6e19e3141f8c0018ef5726118a11064358c7d35b37737377 Nonce = 40b5cc685c3d1f59072228af9551683b5b8c8ff65240114ad2dacfccf3928057 Signature = 7695698a14755db4206e850b4f5f19c540b07d07e08aac591e20081646e6eedc3dae01154ecff7b19007a953f185f0663ef7f2537f0b15e04fb343c961f36de2 Msg = 4bfd28a0a79c94dbd667c275ef77a235d8ead7c698d42fb7f7c1fd3c8c2dc48d0dda2408dea56325d69283692a523d281ffea856ffd9f8417eafbea606d862dc5897bdf241f3e8e49aded5eadc7295e5afbf96b3975d0e25daa2433612e120f659036b807c1853c03c90fade2c19dcd923492ecc906cafc57a95da6f20dd59d6 X = 0x95fded7e5e949602c1123d80f89503cc5fb7454be3173af495a18709c1c2506e Nonce = 6bd1eede564ecb1b3fbbf2d96e334ab4cc002e6624e2cb8448d8608fe0e8c43b Signature = 37c3f7556d6e5acf7989f0baa770c2450deebd4d5f58b61e17b4b2b926b58031a61d86365f10ca5e1ee2c4bf276f2374e88b5a2d1acd8ecc11e97785b4fd9931 Msg = e3fc751b6978fcf40f09606ee4263e1660ff20e9c63a7138f078ae3e3e603dfcad172f3c7cb3f3545fc23bc30c37c8439c7b238341f29148276ea2122ea8ed0feacb149de17cfd33b8c9408aee8ab0ea8ba4a2b2ea237418bc3165369c8cd420242f8d32bcabe0c352e21f65de80d587ba2713cea6e53ca524aec365bdf21adc X = 0x3a09006faedec91446995a393b034b0c7ff3fcd05cda2e9e3b2f98e3a4bbb9f5 Nonce = 4212971feb32e25fbb22845ab8c9333cb2a265f003542838a128a25108a88365 Signature = 2d3f3c605eca8fec37a76d606d20fde89cb6f971a44796095a01dcf8e900f5b26a43168334e5b0ea07cfa5978609e86f969d1005528ebb3ee9073d5655d54b44 Msg = 45f656a1ef0e61de46df2ca2d8ea26640a994c30380c0cfd66be3998d89849161bbcf3bee77ad30e769f10e23aad5b4df4edc19a86fbb5abdeec8779b76be279532d7692bc586c62692fa1e3dbcce33ffddc9f97589172f64a48535693ded6bc73b2ca32469d0eaf6706d2a5f58f8d28a745dc328bcc75b3415ca93e29eabb1e X = 0x9f35b1038686bde07a5f517d68f562739cb7150fa47ebaf7ffd29306afd4688a Nonce = 55d1ffc73b52b6364d660fa4658a6351142ac538fd3cfb4eec40ba07bef5418b Signature = 3ced0ea5f7fd588668a41efe0e90954c0930afb6be18d90752831f683cd92a9c9e46ca12941745ea1a12c5a2d609884cb5792f46afaacff07237137400366868 Msg = c737d5ae248a96062d6afa8dcacc0384c5fbfb9d8b6052b52493c60d3edfc524b567b1f896e7447d0e24019403ed83e4889c0c4de57c70fada6c8b5a09904350a44dfaf77d60af62de3edfd8760d077473f26df2837cfc2015f227dd7d351a5350f1428f2699fd3f518326fea8aef98fc4ea673130c8079fac3895fe856c77f8 X = 0x40dbd496fc4644be7ccb24d9dc55895c1b923a05f4da5610589d564ee8aac33f Nonce = aa63e91cb3fa545c447a8b8309a569d48104e14d5d05b8951033ac8a7d711c3f Signature = 0041b1c756dd2e42714f9ee7edce21ea33ef49dbf452ccd9357d5f45ffab08f9102c6eaad38d39c0d036335ae19dd0d75e8dcabae59b120f69cbd2b5cf48abdb Msg = a6fc89a223022ee9e508725278582f56db9cd24c0d75d072a528d0c60f27171ea376e2dc28a9dc0b12e668af77dcbb381737e1ba7d9e80b9bec80bf9061b8fa10e43a7403a291624a600dd4f5c2b50c52d5c6155d52be5a325f6ad813fb3ecaf6d1f92e98cc87c26c68cbd15d548a3782bffdd1116c7c11fcabde4025fec5154 X = 0x1b41c29364947768876ad4e7abcae59c8e61373d25274ba42ceb3d876d6ce672 Nonce = 4c9ace2c908648032151f638e3c909d1f0646fe018a1c9c22a170eff64447fbe Signature = 48bd010c1af77b3c40db50349706d64d16cbb72db51943d345151deacd4a41330f1c4bdb4758ab3b5518d4605b9864805723d33a36116ea650546feef11c4a5e Msg = 2ae4ac7ce29ae7d32490d3a54b715db3f47306f84b59b33b21622a18aa2c060a4434adfa01ff1686b5d1dd3035308e92f7acc76dea969deefb98c2972b42a596e1055a5aa2c661f0b734ba4f0b341c77827d88915a5e89f95a98d63d7729874fce4ff75d7add74f4313dff784e417b2ee1fcd270c038dbbbb96a7768484b8854 X = 0x87980da0684558f87e5864ae585864625aed61b1309c1d5f30f6477f947c44fb Nonce = 25b9d8fbe7e3ab7017f2b1e53da579df460dfb72ba5fe4ae4c85b8c23472bc8c Signature = 6b7ed3a4c2a4f78500c7e947e6175c5ca857c9d613e7790b9be0d14ec8403e5fa116f3de166260d110e20e84eb8c97c3f018178608a2ea3e3e2f5ed91d43de11 Msg = 3eade9a10fb59af36a540170737fbc536e4c5230b8f6c4b216eddd3ea92342123a3374d0c751b24b627f9ead4de26e9a7897d9bc5d58a6a3ac74cd4575b3286ec15f8453224f37179e51d9c4ad8a60bf37d71c62ad7fc53e5c7b12f4aaa2d428e5c889fd7f062c913d9b574f4b5db516c976bad588302f219fd83e18bee8e68e X = 0x6cf453178db0dd7f2f94f9a1f518c622c1ddee46d4b090462812e9f7b862265b Nonce = a3fb61e544d59206d334049e8554d97b6699db616871fd2b421229c28e84f73c Signature = 9e833ec3ded9d81ea7422bdac78422274fa35348e3fce3bbc93b3c10d70b4f1e653756594eac681d48a2358a0f82a10faa7929b00fd9cd4394c32679060f96e3 Msg = 33decfc1e06b92ed81cd30ee3771470b59e22c1564647f1aae8510729715a8ce94624a11554ac909c924aec853df64327546db85d3df597916a39353388a8b3363765281a4352701ff1af43fba6d03664127c15da7b84c04d5409c364094dc62e37983a8eb066880de8136701406e67250679300d2b97d228327c1514c0bc1ea X = 0x3bf2be01d154c23ccae92ae93f78ea36f70efcf7fb7eb43cdcaeb9ffb8471b10 Nonce = a0c97f80ca449fd8f69733e046664408da590dbbab6865c3275c389a478aa248 Signature = 6f77a52169a2e880a3b55aa278f6463032dc5f81c38468224d5532f6a601f2d996b753efb4abbc8c179d03cc2a1a0c1256e23d1fa2e97cfbf55d2bb69812d100 Msg = 6ae5a6da794f923f6d8032549b81d04ae7aa35c2099dffbdd83bb94db574faf8f95c7126db2db60fed50f740e87c359544dc2ebfbcafb094ddca69c914d27e5f3d10fa0ce32d2a1355bcf61a2574c755d7c324a2e0ed6f7719ba2f2c9f113df8d04025f4abd2e1c4b7bc18d8acec9f6d8d797cd7b042f50348eeb3f7a2922da7 X = 0x3b4a52c8b5c386f26ac6ffabcef2df3bf8b25e6108ab540d314dd3d9245c075d Nonce = 39f68875cade6ae208d3043b010541624679df649cc5d97b09a3ebbe2c9d59be Signature = 8636d4d3203aa0912fbfc938be4370077ea9c75195cd2f67e6ee427cde531c4093023d97efb4327e9e886e7b783741e9d2c397af9c67b91cdb8aa27f83bb025d Msg = 86e03bc3f4ddea6a93888ee389b15eb690822c71f9b85efaaffc52e486b1144ad7fcff3f53bf97da2481e85e0983ee1d5279e27a364d0e690f587a31535fb94eece747f8b605724adfb258c9983c9002e0c11b7976627690d58281305ea9308db74c491a28192e354b600e8376811ccefb751bb10c7d97b42ffe304bee97ecaf X = 0x7f56c74b495a12db963e03cfafe60ac95e8019cb212c332d1f19c64615568119 Nonce = 407180cc311aebdc1cdcb4685241597783f34076672362a24a21193c0d45d24d Signature = 68efaa05eb90c48c6a7a45337c29175f8ee5b19b53db4ebd83a02f53c5b2104b145f13f1ae3675c521b334ce6a49fc6f502e3ac6b2b5143be0641d0d57b3c722 Msg = 1d0954ee0de1e9ceee0532597ee434c73fe4f66635f7e72d38b67763c66817f53cf36ca0f613e01896cebc9f77a772607f4aeedd3856c73fc2f19100aa7b540ccd057f26cd9564d673228c68088e5f1abf1254a97ed1453ee558e062711ceb7643b345ad33b649affbe8a62067f9d84ed4c8506fcff578d2eba596a205267387 X = 0x0b48499625f0c2548bf8a2fed1f6696f59df8fbe6eaf91b82385994209c2d04f Nonce = 1c020abb0e1d52b3ad95467f7baaf665e2281f34c342401ef1fb4c1fc2d7b2bd Signature = a67210341a04cd3a4b63ebc7e6208f37e487a8c6f1134cd2601b844d6903203f6b972c622cab48d85a2dde355f947a8151a17a0acf06b7f3659f868d5ece92d9 Msg = 14f566c5fe44aaad6e8b3c627570aabdd4efb7fcfa1ab1bb74f2c6d8795e88233dac4e7d240abd5e9bbd8e1fb03a3bf50c0ca92c9aef1894f2aed600fc5873d23451d3204d75ab9581cbcf82ae8c0df0dfbd3a1f149f70660865726cdc73c015d5ddbf7513eedcd1ef17578d2719fea1e5ba39aef3fa6f00846f0fb8d9a1a436 X = 0x7928d3edc11a890fe332c0d3759bc6ecb822438d7f604da76b4fd78590720ddb Nonce = 01f77e5f125a9a1385349f77d7a32f26b1efa5b0a5d4a212753bb54d300d088e Signature = 12b40bd1c866ce38e7da0764d807ae82512b33b51dc908e5a5b3d7c16f0d08a55caccee2bc85e28d506a9bc6d260dbd08205b75d20690e26aa6bed30d7327099 Msg = 60c29d99753d0847bb52e906c862a1b0628496416c14df5dcfbb5e2804f502cb0a2d163e9bc2d84122c0b3f5d0609b82ac16aa15efd55f55c8caa3d1114ac0cb83e5ff3db12a24b89aca5f0514d2ceb09b14fa916000c0f4deb016db755e88b326172144e4f1a705a800559b3da3c27af55cb32b1147460c31186d99dc1cf2e5 X = 0x3dd64db4bd8e28e701235ad83a5d5e9dd13ee8a3b3dcb4c99c1bc95b6ae25291 Nonce = 453b64f2dedfeb1419b5dbeb726a2c92b1a37ef11a7732c911d9a96184285f40 Signature = 72cf0e18e4bc3749647cdfa62dcbd2513c7c2b1d397c1fcbc7f6a425ebb897ce7b7d0a9e93340941bb55f6afa6cd63f7364963671008ede457d05b6545fab1f1 Msg = b3dea62a20a9ed9da990465bebe18aa71f08f93fbaee4fe5d581ffaa6fd55cbe272a115d7fa18fb9cf5662f595b7cb9bdb97a81bdc078ee3bdceb2c03722610134c3bbfd7a6f8b79ecc6a9a7709265687f9c236fc68b02203ba666e9eced5161de90c110ee7af9bf54d84a22181f17b4329348bdeefbb324962e63569f07c285 X = 0x6327d3818c87e4c99b7e5116fc091a9da1e4c02aab9b207d61e859dda8d859ed Nonce = 94a0f6f58f004e45ce5ffffa6e63abca8daf7768cdafd517f3a5e399828b1e72 Signature = 3ec677e91c63e65aaa174aee2791dc409244cb80c0220991dcb497397a3c5e9b1de0ec466b2ad4ed1adce3bc38ee521803dc87085e2fbfc561d63844c1a9a2e6 # [mod = L=3072, N=256, SHA-512] Hash = SHA-512 P = 0xc1d0a6d0b5ed615dee76ac5a60dd35ecb000a202063018b1ba0a06fe7a00f765db1c59a680cecfe3ad41475badb5ad50b6147e2596b88d34656052aca79486ea6f6ec90b23e363f3ab8cdc8b93b62a070e02688ea877843a4685c2ba6db111e9addbd7ca4bce65bb10c9ceb69bf806e2ebd7e54edeb7f996a65c907b50efdf8e575bae462a219c302fef2ae81d73cee75274625b5fc29c6d60c057ed9e7b0d46ad2f57fe01f823230f31422722319ce0abf1f141f326c00fbc2be4cdb8944b6fd050bd300bdb1c5f4da72537e553e01d51239c4d461860f1fb4fd8fa79f5d5263ff62fed7008e2e0a2d36bf7b9062d0d75db226c3464b67ba24101b085f2c670c0f87ae530d98ee60c5472f4aa15fb25041e19106354da06bc2b1d322d40ed97b21fd1cdad3025c69da6ce9c7ddf3dcf1ea4d56577bfdec23071c1f05ee4077b5391e9a404eaffe12d1ea62d06acd6bf19e91a158d2066b4cd20e4c4e52ffb1d5204cd022bc7108f2c799fb468866ef1cb09bce09dfd49e4740ff8140497be61 Q = 0xbf65441c987b7737385eadec158dd01614da6f15386248e59f3cddbefc8e9dd1 G = 0xc02ac85375fab80ba2a784b94e4d145b3be0f92090eba17bd12358cf3e03f4379584f8742252f76b1ede3fc37281420e74a963e4c088796ff2bab8db6e9a4530fc67d51f88b905ab43995aab46364cb40c1256f0466f3dbce36203ef228b35e90247e95e5115e831b126b628ee984f349911d30ffb9d613b50a84dfa1f042ba536b82d5101e711c629f9f2096dc834deec63b70f2a2315a6d27323b995aa20d3d0737075186f5049af6f512a0c38a9da06817f4b619b94520edfac85c4a6e2e186225c95a04ec3c3422b8deb284e98d24b31465802008a097c25969e826c2baa59d2cba33d6c1d9f3962330c1fcda7cfb18508fea7d0555e3a169daed353f3ee6f4bb30244319161dff6438a37ca793b24bbb1b1bc2194fc6e6ef60278157899cb03c5dd6fc91a836eb20a25c09945643d95f7bd50d206684d6ffc14d16d82d5f781225bff908392a5793b803f9b70b4dfcb394f9ed81c18e391a09eb3f93a032d81ba670cabfd6f64aa5e3374cb7c2029f45200e4f0bfd820c8bd58dc5eeb34 Msg = 494180eed0951371bbaf0a850ef13679df49c1f13fe3770b6c13285bf3ad93dc4ab018aab9139d74200808e9c55bf88300324cc697efeaa641d37f3acf72d8c97bff0182a35b940150c98a03ef41a3e1487440c923a988e53ca3ce883a2fb532bb7441c122f1dc2f9d0b0bc07f26ba29a35cdf0da846a9d8eab405cbf8c8e77f X = 0x150b5c51ea6402276bc912322f0404f6d57ff7d32afcaa83b6dfde11abb48181 Nonce = b599111b9f78402cefe7bde8bf553b6ca00d5abaf9a158aa42f2607bf78510bc Signature = a40a6c905654c55fc58e99c7d1a3feea2c5be64823d4086ce811f334cfdc448d6478050977ec585980454e0a2f26a03037b921ca588a78a4daff7e84d49a8a6c Msg = c01c47bfa208e2f19ddda5cde5833325d16a83fbda29e666fe67ff3489803a6478a5ac17ff01edc7973d15fe4998f63bbc095fc1ac07534241c643a44444dc9a356fa812d5ca191a2f6ed162a2d5fd6d0aa898a20563d993830254db8a4bf65ba86099cc6b58a1bf6ebb01a19c79304308acebe1da09f1753a195e9ef586c7e1 X = 0x9f11370ddb3c43e2f4162dc61f7e08dfc6e86d5d71742c6adcb5340f7bea2ada Nonce = ab53984e0b154992ace73bba548185b49719bcc3b11fb150b5da279529750078 Signature = 5bb50e4f538a6e4638206be119dbf712776154acfb4c06d65d66c802123417397b7e640cd76086d3f640d18ceb26bb53e30282afb17401e7b48aa6818934dc5c Msg = 47e7af22c9298ad3bfef9bee5086bedbdc513d67416d5f4e7981cddb1002cba24700c45dd6d4dcef4f81d003f0513dab4e04eb4c70d944042e1b726d8a33050d0e4f70c0a8341b75fd4e27c7948754e441208eb93fc7b7c37354252f73b838fd02d078c6a1ae073ef1233aa1c8aa2781e193ba2897ccdd8cf617ca23541ce1c5 X = 0x232c1c88d571492779172ce6650524cb6d91174e8a23780d0fdf7c44ffd80c1a Nonce = 101acd88a048a6a87c13ff23225dc2c4d2fe3fff039e072fbb268ef2dbfab9c3 Signature = 6175473d7aa7d5ce55590c952a19897206086887fd84bf2b566926e47981c2a371d7857b6ff06ca67885fa9c9c71b8cc246d0339b6c2725247172a297e26a7b5 Msg = 9311d8f951141713f459eb65f01880b961c0a590b36f785f1aeb880ee71300c0cbc601b3a6072193dad6ddf2028eca4c8bd7b8575187928f84bd69c5dcfb0b9d320003c3a863c09ee503e38abe07ce2e0d46b3cec926231a57defa0aebd1a6e01eef4f9b537ae1fcdf64e01434d40ab5019f3965c735411a5c19941f41febf4f X = 0x87bde6350da15832966fe70300e5dc66b96ec263344bcfb5de051be34d76262b Nonce = 7d1b5d39e51af0c22a56bc57ba6bf8bb6de18f2c256bb2d6fea684add38b1f6f Signature = 66f729716456a2781bdb8578fa18d1e64af0edf8ec1dee0a50d25981912fc45a8c3cccfe6f0cfdc0ac3a542c8e8c85210bbd7f95134c8f035d1ce16f44ab7a06 Msg = 808603f7f8439441277913b21bef4e01c89e4113e07cacc33f65ac9849db1ad1a1cb7dd2fecd88ee4139b1638355c623821309f326c16bc658bb4821518238982e5251f7cd37807292153d2b07dddc066e003c6069c371155d2d191f15111f2089ce423f5c2a1f8534e301313c69623f62ba635adce8551733a82a8fac1a66b1 X = 0x9464ce029452e8602214c5236d9637ce7e59f92536a07ac5ba30f639e09814d4 Nonce = 5c2bb856c4d87b27e01e2ac1ae6f2fc526ab8bb49a67eda5c1d8cd4253610df3 Signature = 98fe587e43aa96f9a9bbe8af404a08b02307b36053db87f6db25a3aa36fcc3db5c94ea70f99f9ff14b8e5dd4a6688398260907176ea80e19c39b14621149f0d6 Msg = ce2aa3ed12c1b8843a3e11b06b5f0e5e63fe8e19c1a38ac446a48eeca8dac6d8b769d7809442c32ac82e93f686ec64347e9444c3f452823c840e8d0cd334b4152002148da16ac8859d189d87d67164c5db16195c081d2edd7d8157e2bf3b97a90b4b4784324eb8ceac4261809f674256daf007c4ab1f222f5fd28398a5b824de X = 0xb887c14673cbc63f04f0839ea56a76154027d7eecf41d8d0b53d4892353ae9a4 Nonce = 49548238215fed6525693bc3cca3872944a97790087fb35f329b206e6046b32a Signature = 54c99b21f28feee27f0e999aac6b49b6b07633e1db18a45952fcf7e73b166bdb7a18588ea1456f67562d677878346fb34b684b9a8a61a721b3db0e95695ab43a Msg = 17b925e2a1a51c2036e225715f2f771d8f0a6d98c7ed9cacf5aa4cd30ab16afb94e21a7c953e01ca211c28782a06073fdad27713aa8c26ae9ec449aaaa8ccfda8c947172de94b3f20b54af98df152d5d3a636c736ff01bfa699d6214002dc76dbb3f3860d94e0e34edaba5f2bfd6b2bf660086be876451a50f6a2dc7c2b098b7 X = 0x0684a8fad551c8d08beb05033185e3b4b6b6f6f4920ef9982d72d0a9c7549855 Nonce = 4a258c125db1f7b775432b53c7a0ff47c00bf7af27abec7fcd42a2916e95e26d Signature = 726e4d3baf00b259f4bdca8b0a5e1cbfd37827c48373ef5029f7601a7769478c903079439ebde1f766d1a8ff33e0f778d77b5e8b7b0d687443c271e8a63b5975 Msg = 1c1169f0e790053cd7df780b5c832c64147694b4a6448ba14a426d9def7ddc78e3ed36a12da81cf9c3f245d64c859b6b4d8121d112851974df178defc977db691234d142dff99bea1957891b5d6fe8a787e96369d93c24682debd1cf3fdb64379b8c1b3b73e1bc2467dcb08b86cbd494c01477be24d7900f5a578930f4bddcb6 X = 0x3fa44778b414ff27436e276ca4904546d3542d128f73c4463c69ff9cea2b7a41 Nonce = a05b9ca1c9532bc050cd0c1150c27bc192154cf64d59dc9a949906f1ded57e35 Signature = 1026ecee0ac31bdcdbd6103b1343f84b441fc326e1d86ad0903d0b17cfb2ff9ca5d3cb2e7c39d87640c4547ac6c33afccbfc1820905ba1e5be5b262313277cb9 Msg = 805baabdd018d9e5ebb4dc51435be632d2387869756d743788442790d55bb183e26655ae3aac86dc16a48ddd268dd15e18d8320df9a1a0a6cb2b49bc701d7a15e3fe8ddd584a75c8c9aaaecd1efe17324d6261881f3d34685b04f62e968505966c9a5feb0c39b5095e5568e40f20aa21cb2505356dc9049ce56182d94a2d94a9 X = 0x770b99935d393eb90b583d1251696007cbeb1b35e6c3f4f9bcb62879070e0940 Nonce = 424a43cfd90f7b84e9e375572f82ebce7ffb197bd3237a353bf15ddc1a17095f Signature = 2d63e6d2568571acfe4a931580a04b974c7aae4ca9aa9610d87be1a91c657c31574b10d14dcb8f079461b29ae1b91ed6c5ef32f93cbad306697552c11748fe0c Msg = be8ca5ed4c22a050d8309c7a31acf667f0c0fbaadc64a34d2b63074a763a2b8db73b24cdbaad26cc6f2c3e90df4b25bfa724fce587faa0fd65ffb719f0a0351648230d5354d721d8fa6d0d686c37f257d7d9dbd15f555d5073f8bc71c92139d1f627d743f7d6586d510d19d0d8a555d0bf79ec70596e712183880c89caf69d6f X = 0x9886138d837d20e8c6be853cd7de1a66a25748c7a33fd55121a27237623d68d6 Nonce = 1689eba0aac66b3d0cca9ae1911602f9638937b6be17c23a187be323d0dec7be Signature = 9c7d40e214082bd5e71f3bf4be99789303f38e851a76f88cb90aff713080c58724ca23be94c624b9d736328b53782b5feb384dc9fe6370016cc3f97d8f48b6d0 Msg = 62f0cb1bb07f6497a1dc7a66955765a9cc403bde03fef4e16b09d7ec545b4c75d08b6e9c4c5af7232548d45445638d7194a199ef1534e81241eaa9c7e767fd54e2caceea4d2f7215d37baad6b05e28ea093497e2e8e1db6e41a5eb13ffa4caa27108f2263a74cf54bd5b6a6b62284bac99fd7977aaa8ffff18fa8a70ab0debdf X = 0xbadece34257da3d7b8713f8f0f9f0107b1909c7f99a765ad8405d8c2a20310ee Nonce = 2d468a99e315c158a1af18abd4d58872d6e281dcd4c9b0b43298eddf346496d7 Signature = 54ff5d3dc8767856a10f54088882e28c110980ef9b204eb5f162dbef73a37c7357ed0748427c089d6395528b2b4555c01b4c1341ab5fb99c64d1cc247a41c3a8 Msg = baeb12a1ebd8057a99a0137ee60f60eed10d26f1eab22ae2d9adbc3e5ffc3252abf62b614707ad2546141bed779f0cfad9544a74e562da549e2f7b286efb615449b0946dc7c498d8f12150b2eacbd27157966f592ad5f3e43a24c60b7e06630b82a4fdb699119dbd878b13a98bf22a7b3dc7efdd992ce6b8a950e61299c5663b X = 0xbd3006cf5d3ac04a8a5128140df6025d9942d78544e9b27efe28b2ca1f79e313 Nonce = 16aedfbe554de17a3e5b83e942702bd60702d9823ba154baa6d1e7e94308324d Signature = 8d357b0b956fb90e8e0b9ff284cedc88a04d171a90c5997d8ee1e9bc4d0b35ffab37329c50145d146505015704fdc4fb0fd7207e0b11d8becbad934e6255c30c Msg = 184e599a4c1de86c4151205754df0b1912c2b3c532552c51a61c6459db98c83e59d4a40806c6a2c6b3fe74e3bb9e720d7d0a3cc11ef88959a8990c0fa057a3915fe0dd9a138aa0ec1cb1ab69d93910d8d6f9e14f3b8a135d3f031a56c76a9dc3aed1962bdf05815c2492d14f2324d2da491810d1672b633f2419da4e7ebdef24 X = 0xa29e90d33f200b1faf61bee5d92ca8a392b1eaeeaa0817cec98b40c97e25018c Nonce = 78e781b2874ca2441e2ce74a2a2a16417b51537eca876831f6593ae25fbd796c Signature = 079d4df14ad703a435b21bc70a03456ca822b876c9accb018bddd674bd6392d76c7765e1f1eddf915a56a57390db45636e52f083ce440766ad4f32580f722483 Msg = b189dd34f58f3efa85b6f97677edfb82664cbe43a2550c336ffa08705bbda2545ef244a275014c6a265971f4c3658e5e8d6a3fafc889f3c4eda6b5616092954b15c60435efd76806e28557c05faaaa8a05c262657840865ff69c511a68d13022a712d35bde138eb7a2f8f1a87b342c7caf388c1a8b95079bc4a8003eef84b899 X = 0x9759c24820670eaeaf92370197d0037f9f71dcc283970f341117fb56a1764001 Nonce = 86050bf276a649b13c18814430eadcff54edf7416f1a8b1559c6c2c808e8dc9f Signature = 9fd105c74a0d36973740867ccc1c731cf1c50c7935d5c09e92f574d7a569157e501f50c32b0288672e02aca78f90f446acf92626365957a375550c77980c3c17 Msg = 42c065fadd56d6a1fe68dd4e86c17efd76d0f9db87036bd7b609159d66847f46de01b8ae43590360fa324559a2d709d45cf01034f5facb7f52324e60dd464a583d42e412659d8420f7265e30cf82bbbcb2c99b0f00ca6a46d28556428789f415000dc31babbd67ccc8fbaa84a880466bca4783eaf00b7f78231c667126433e6a X = 0x307555893610e15549a5bfb2b446251f9595eb0c16df5fe3b784ebfc3fc30140 Nonce = 5359fe067eb9d98ec2217500de743b0dbe88e8d94552b53a0117aac4d3390083 Signature = 6ed82af8e89e38c49a58010f0564165a16a76a2bfb348466d9b4a91e5ce53ab28c466a8b3e4c90886f29986a4d513904f31db43a68ce880311403cc755466604 botan-2.4.0/src/tests/data/pubkey/dsa_rfc6979.vec000066400000000000000000000113731322470703100214240ustar00rootroot00000000000000 # RFC 6979 A.2.1: DSA, 1024 bits P = 0x86F5CA03DCFEB225063FF830A0C769B9DD9D6153AD91D7CE27F787C43278B447E6533B86B18BED6E8A48B784A14C252C5BE0DBF60B86D6385BD2F12FB763ED8873ABFD3F5BA2E0A8C0A59082EAC056935E529DAF7C610467899C77ADEDFC846C881870B7B19B2B58F9BE0521A17002E3BDD6B86685EE90B3D9A1B02B782B1779 Q = 0x996F967F6C8E388D9E28D01E205FBA957A5698B1 G = 0x07B0F92546150B62514BB771E2A0C0CE387F03BDA6C56B505209FF25FD3C133D89BBCD97E904E09114D9A7DEFDEADFC9078EA544D2E401AEECC40BB9FBBF78FD87995A10A1C27CB7789B594BA7EFB5C4326A9FE59A070E136DB77175464ADCA417BE5DCE2F40D10A46A3A3943F26AB7FD9C0398FF8C76EE0A56826A8A88F1DBD X = 0x411602CB19A6CCC34494D79D98EF1E7ED5AF25F7 Msg = 73616D706C65 Hash = SHA-1 Signature = 2E1A0C2562B2912CAAF89186FB0F42001585DA5529EFB6B0AFF2D7A68EB70CA313022253B9A88DF5 Hash = SHA-224 Signature = 4BC3B686AEA70145856814A6F1BB53346F02101E410697B92295D994D21EDD2F4ADA85566F6F94C1 Hash = SHA-256 Signature = 81F2F5850BE5BC123C43F71A3033E9384611C5454CDD914B65EB6C66A8AAAD27299BEE6B035F5E89 Hash = SHA-384 Signature = 07F2108557EE0E3921BC1774F1CA9B410B4CE65A54DF70456C86FAC10FAB47C1949AB83F2C6F7595 Hash = SHA-512 Signature = 16C3491F9B8C3FBBDD5E7A7B667057F0D8EE8E1B02C36A127A7B89EDBB72E4FFBC71DABC7D4FC69C Msg = 74657374 Hash = SHA-1 Signature = 42AB2052FD43E123F0607F115052A67DCD9C5C77183916B0230D45B9931491D4C6B0BD2FB4AAF088 Hash = SHA-224 Signature = 6868E9964E36C1689F6037F91F28D5F2C30610F249CEC3ACDC83018C5BD2674ECAAD35B8CD22940F Hash = SHA-256 Signature = 22518C127299B0F6FDC9872B282B9E70D07908126837EC18F150D55DE95B5E29BE7AF5D01E4FE160 Hash = SHA-384 Signature = 854CF929B58D73C3CBFDC421E8D5430CD6DB5E6691D0E0F53E22F898D158380676A871A157CDA622 Hash = SHA-512 Signature = 8EA47E475BA8AC6F2D821DA3BD212D11A3DEB9A07C670C7AD72B6C050C109E1790008097125433E8 # RFC 6979 A.2.2: DSA, 2048 bits P = 0x9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642F0B5C48C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757264E5A1A44FFE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F9716BFE6117C6B5B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091EB51743BF33050C38DE235567E1B34C3D6A5C0CEAA1A0F368213C3D19843D0B4B09DCB9FC72D39C8DE41F1BF14D4BB4563CA28371621CAD3324B6A2D392145BEBFAC748805236F5CA2FE92B871CD8F9C36D3292B5509CA8CAA77A2ADFC7BFD77DDA6F71125A7456FEA153E433256A2261C6A06ED3693797E7995FAD5AABBCFBE3EDA2741E375404AE25B Q = 0xF2C3119374CE76C9356990B465374A17F23F9ED35089BD969F61C6DDE9998C1F G = 0x5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E24809670716C613D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D1AA58C4328A06C46A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A338661D10461C0D135472085057F3494309FFA73C611F78B32ADBB5740C361C9F35BE90997DB2014E2EF5AA61782F52ABEB8BD6432C4DD097BC5423B285DAFB60DC364E8161F4A2A35ACA3A10B1C4D203CC76A470A33AFDCBDD92959859ABD8B56E1725252D78EAC66E71BA9AE3F1DD2487199874393CD4D832186800654760E1E34C09E4D155179F9EC0DC4473F996BDCE6EED1CABED8B6F116F7AD9CF505DF0F998E34AB27514B0FFE7 X = 0x69C7548C21D0DFEA6B9A51C9EAD4E27C33D3B3F180316E5BCAB92C933F0E4DBC Msg = 73616D706C65 Hash = SHA-1 Signature = 3A1B2DBD7489D6ED7E608FD036C83AF396E290DBD602408E8677DAABD6E7445AD26FCBA19FA3E3058FFC02CA1596CDBB6E0D20CB37B06054F7E36DED0CDBBCCF Hash = SHA-224 Signature = DC9F4DEADA8D8FF588E98FED0AB690FFCE858DC8C79376450EB6B76C24537E2CA65A9C3BC7BABE286B195D5DA68616DA8D47FA0097F36DD19F517327DC848CEC Hash = SHA-256 Signature = EACE8BDBBE353C432A795D9EC556C6D021F7A03F42C36E9BC87E4AC7932CC8097081E175455F9247B812B74583E9E94F9EA79BD640DC962533B0680793A38D53 Hash = SHA-384 Signature = B2DA945E91858834FD9BF616EBAC151EDBC4B45D27D0DD4A7F6A22739F45C00B19048B63D9FD6BCA1D9BAE3664E1BCB97F7276C306130969F63F38FA8319021B Hash = SHA-512 Signature = 2016ED092DC5FB669B8EFB3D1F31A91EECB199879BE0CF78F02BA062CB4C942ED0C76F84B5F091E141572A639A4FB8C230807EEA7D55C8A154A224400AFF2351 Msg = 74657374 Hash = SHA-1 Signature = C18270A93CFC6063F57A4DFA86024F700D980E4CF4E2CB65A504397273D98EA0414F22E5F31A8B6D33295C7539C1C1BA3A6160D7D68D50AC0D3A5BEAC2884FAA Hash = SHA-224 Signature = 272ABA31572F6CC55E30BF616B7A265312018DD325BE031BE0CC82AA17870EA3E9CC286A52CCE201586722D36D1E917EB96A4EBDB47932F9576AC645B3A60806 Hash = SHA-256 Signature = 8190012A1969F9957D56FCCAAD223186F423398D58EF5B3CEFD5A4146A4476F07452A53F7075D417B4B013B278D1BB8BBD21863F5E7B1CEE679CF2188E1AB19E Hash = SHA-384 Signature = 239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE6BD737513D5E72FE85D1C750E0F73921FE299B945AAD1C802F15C26A43D34961 Hash = SHA-512 Signature = 89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1 # Msg that produces a hash with leading zeros. Test created with BouncyCastle Msg = FCABA2CF434AC8DCFCEC Hash = SHA-1 Signature = 98158AC13279EA8059872EBEEA4E5F334208FF361B2898667C151F8CC883E0728C333DB65612570200D7911EBF1C89C2932FB95399CB0CC533EC172B5CEAA08Bbotan-2.4.0/src/tests/data/pubkey/ecc.vec000066400000000000000000002424711322470703100202230ustar00rootroot00000000000000 [secp256k1] # secp256k1 tests from https://crypto.stackexchange.com/questions/784/ m = 1 X = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 Y = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8 m = 2 X = 0xC6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5 Y = 0x1AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A m = 3 X = 0xF9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9 Y = 0x388F7B0F632DE8140FE337E62A37F3566500A99934C2231B6CB9FD7584B8E672 m = 4 X = 0xE493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD13 Y = 0x51ED993EA0D455B75642E2098EA51448D967AE33BFBDFE40CFE97BDC47739922 m = 5 X = 0x2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4 Y = 0xD8AC222636E5E3D6D4DBA9DDA6C9C426F788271BAB0D6840DCA87D3AA6AC62D6 m = 6 X = 0xFFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A1460297556 Y = 0xAE12777AACFBB620F3BE96017F45C560DE80F0F6518FE4A03C870C36B075F297 m = 7 X = 0x5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC Y = 0x6AEBCA40BA255960A3178D6D861A54DBA813D0B813FDE7B5A5082628087264DA m = 8 X = 0x2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A01 Y = 0x5C4DA8A741539949293D082A132D13B4C2E213D6BA5B7617B5DA2CB76CBDE904 m = 9 X = 0xACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBE Y = 0xCC338921B0A7D9FD64380971763B61E9ADD888A4375F8E0F05CC262AC64F9C37 m = 10 X = 0xA0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C7 Y = 0x893ABA425419BC27A3B6C7E693A24C696F794C2ED877A1593CBEE53B037368D7 m = 11 X = 0x774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CB Y = 0xD984A032EB6B5E190243DD56D7B7B365372DB1E2DFF9D6A8301D74C9C953C61B m = 12 X = 0xD01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85A Y = 0xA9F34FFDC815E0D7A8B64537E17BD81579238C5DD9A86D526B051B13F4062327 m = 13 X = 0xF28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA8 Y = 0x0AB0902E8D880A89758212EB65CDAF473A1A06DA521FA91F29B5CB52DB03ED81 m = 14 X = 0x499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4 Y = 0xCAC2F6C4B54E855190F044E4A7B3D464464279C27A3F95BCC65F40D403A13F5B m = 15 X = 0xD7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080E Y = 0x581E2872A86C72A683842EC228CC6DEFEA40AF2BD896D3A5C504DC9FF6A26B58 m = 16 X = 0xE60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0A Y = 0xF7E3507399E595929DB99F34F57937101296891E44D23F0BE1F32CCE69616821 m = 17 X = 0xDEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34 Y = 0x4211AB0694635168E997B0EAD2A93DAECED1F4A04A95C0F6CFB199F69E56EB77 m = 18 X = 0x5601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CC Y = 0xC136C1DC0CBEB930E9E298043589351D81D8E0BC736AE2A1F5192E5E8B061D58 m = 19 X = 0x2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C Y = 0x85E89BC037945D93B343083B5A1C86131A01F60C50269763B570C854E5C09B7A m = 20 X = 0x4CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C97 Y = 0x12BA26DCB10EC1625DA61FA10A844C676162948271D96967450288EE9233DC3A m = 112233445566778899 X = 0xA90CC3D3F3E146DAADFC74CA1372207CB4B725AE708CEF713A98EDD73D99EF29 Y = 0x5A79D6B289610C68BC3B47F3D72F9788A26A06868B4D8E433E1E2AD76FB7DC76 m = 112233445566778899112233445566778899 X = 0xE5A2636BCFD412EBF36EC45B19BFB68A1BC5F8632E678132B885F7DF99C5E9B3 Y = 0x736C1CE161AE27B405CAFD2A7520370153C2C861AC51D6C1D5985D9606B45F39 m = 28948022309329048855892746252171976963209391069768726095651290785379540373584 X = 0xA6B594B38FB3E77C6EDF78161FADE2041F4E09FD8497DB776E546C41567FEB3C Y = 0x71444009192228730CD8237A490FEBA2AFE3D27D7CC1136BC97E439D13330D55 m = 57896044618658097711785492504343953926418782139537452191302581570759080747168 X = 0x00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C63 Y = 0x3F3979BF72AE8202983DC989AEC7F2FF2ED91BDD69CE02FC0700CA100E59DDF3 m = 86844066927987146567678238756515930889628173209306178286953872356138621120752 X = 0xE24CE4BEEE294AA6350FAA67512B99D388693AE4E7F53D19882A6EA169FC1CE1 Y = 0x8B71E83545FC2B5872589F99D948C03108D36797C4DE363EBD3FF6A9E1A95B10 m = 115792089237316195423570985008687907852837564279074904382605163141518161494317 X = 0x4CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C97 Y = 0xED45D9234EF13E9DA259E05EF57BB3989E9D6B7D8E269698BAFD77106DCC1FF5 m = 115792089237316195423570985008687907852837564279074904382605163141518161494318 X = 0x2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C Y = 0x7A17643FC86BA26C4CBCF7C4A5E379ECE5FE09F3AFD9689C4A8F37AA1A3F60B5 m = 115792089237316195423570985008687907852837564279074904382605163141518161494319 X = 0x5601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CC Y = 0x3EC93E23F34146CF161D67FBCA76CAE27E271F438C951D5E0AE6D1A074F9DED7 m = 115792089237316195423570985008687907852837564279074904382605163141518161494320 X = 0xDEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34 Y = 0xBDEE54F96B9CAE9716684F152D56C251312E0B5FB56A3F09304E660861A910B8 m = 115792089237316195423570985008687907852837564279074904382605163141518161494321 X = 0xE60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0A Y = 0x081CAF8C661A6A6D624660CB0A86C8EFED6976E1BB2DC0F41E0CD330969E940E m = 115792089237316195423570985008687907852837564279074904382605163141518161494322 X = 0xD7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080E Y = 0xA7E1D78D57938D597C7BD13DD733921015BF50D427692C5A3AFB235F095D90D7 m = 115792089237316195423570985008687907852837564279074904382605163141518161494323 X = 0x499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4 Y = 0x353D093B4AB17AAE6F0FBB1B584C2B9BB9BD863D85C06A4339A0BF2AFC5EBCD4 m = 115792089237316195423570985008687907852837564279074904382605163141518161494324 X = 0xF28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA8 Y = 0xF54F6FD17277F5768A7DED149A3250B8C5E5F925ADE056E0D64A34AC24FC0EAE m = 115792089237316195423570985008687907852837564279074904382605163141518161494325 X = 0xD01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85A Y = 0x560CB00237EA1F285749BAC81E8427EA86DC73A2265792AD94FAE4EB0BF9D908 m = 115792089237316195423570985008687907852837564279074904382605163141518161494326 X = 0x774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CB Y = 0x267B5FCD1494A1E6FDBC22A928484C9AC8D24E1D20062957CFE28B3536AC3614 m = 115792089237316195423570985008687907852837564279074904382605163141518161494327 X = 0xA0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C7 Y = 0x76C545BDABE643D85C4938196C5DB3969086B3D127885EA6C3411AC3FC8C9358 m = 115792089237316195423570985008687907852837564279074904382605163141518161494328 X = 0xACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBE Y = 0x33CC76DE4F5826029BC7F68E89C49E165227775BC8A071F0FA33D9D439B05FF8 m = 115792089237316195423570985008687907852837564279074904382605163141518161494329 X = 0x2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A01 Y = 0xA3B25758BEAC66B6D6C2F7D5ECD2EC4B3D1DEC2945A489E84A25D3479342132B m = 115792089237316195423570985008687907852837564279074904382605163141518161494330 X = 0x5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC Y = 0x951435BF45DAA69F5CE8729279E5AB2457EC2F47EC02184A5AF7D9D6F78D9755 m = 115792089237316195423570985008687907852837564279074904382605163141518161494331 X = 0xFFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A1460297556 Y = 0x51ED8885530449DF0C4169FE80BA3A9F217F0F09AE701B5FC378F3C84F8A0998 m = 115792089237316195423570985008687907852837564279074904382605163141518161494332 X = 0x2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4 Y = 0x2753DDD9C91A1C292B24562259363BD90877D8E454F297BF235782C459539959 m = 115792089237316195423570985008687907852837564279074904382605163141518161494333 X = 0xE493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD13 Y = 0xAE1266C15F2BAA48A9BD1DF6715AEBB7269851CC404201BF30168422B88C630D m = 115792089237316195423570985008687907852837564279074904382605163141518161494334 X = 0xF9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9 Y = 0xC77084F09CD217EBF01CC819D5C80CA99AFF5666CB3DDCE4934602897B4715BD m = 115792089237316195423570985008687907852837564279074904382605163141518161494335 X = 0xC6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5 Y = 0xE51E970159C23CC65C3A7BE6B99315110809CD9ACD992F1EDC9BCE55AF301705 m = 115792089237316195423570985008687907852837564279074904382605163141518161494336 X = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 Y = 0xB7C52588D95C3B9AA25B0403F1EEF75702E84BB7597AABE663B82F6F04EF2777 m = 0xAA5E28D6A97A2479A65527F7290311A3624D4CC0FA1578598EE3C2613BF99522 X = 0x34F9460F0E4F08393D192B3C5133A6BA099AA0AD9FD54EBCCFACDFA239FF49C6 Y = 0x0B71EA9BD730FD8923F6D25A7A91E7DD7728A960686CB5A901BB419E0F2CA232 m = 0x7E2B897B8CEBC6361663AD410835639826D590F393D90A9538881735256DFAE3 X = 0xD74BF844B0862475103D96A611CF2D898447E288D34B360BC885CB8CE7C00575 Y = 0x131C670D414C4546B88AC3FF664611B1C38CEB1C21D76369D7A7A0969D61D97D m = 0x6461E6DF0FE7DFD05329F41BF771B86578143D4DD1F7866FB4CA7E97C5FA945D X = 0xE8AECC370AEDD953483719A116711963CE201AC3EB21D3F3257BB48668C6A72F Y = 0xC25CAF2F0EBA1DDB2F0F3F47866299EF907867B7D27E95B3873BF98397B24EE1 m = 0x376A3A2CDCD12581EFFF13EE4AD44C4044B8A0524C42422A7E1E181E4DEECCEC X = 0x14890E61FCD4B0BD92E5B36C81372CA6FED471EF3AA60A3E415EE4FE987DABA1 Y = 0x297B858D9F752AB42D3BCA67EE0EB6DCD1C2B7B0DBE23397E66ADC272263F982 m = 0x1B22644A7BE026548810C378D0B2994EEFA6D2B9881803CB02CEFF865287D1B9 X = 0xF73C65EAD01C5126F28F442D087689BFA08E12763E0CEC1D35B01751FD735ED3 Y = 0xF449A8376906482A84ED01479BD18882B919C140D638307F0C0934BA12590BDE # Following tests are from http://point-at-infinity.org/ecc/nisttv [secp192r1] m = 1 X = 0x188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012 Y = 0x07192B95FFC8DA78631011ED6B24CDD573F977A11E794811 m = 2 X = 0xDAFEBF5828783F2AD35534631588A3F629A70FB16982A888 Y = 0xDD6BDA0D993DA0FA46B27BBC141B868F59331AFA5C7E93AB m = 3 X = 0x76E32A2557599E6EDCD283201FB2B9AADFD0D359CBB263DA Y = 0x782C37E372BA4520AA62E0FED121D49EF3B543660CFD05FD m = 4 X = 0x35433907297CC378B0015703374729D7A4FE46647084E4BA Y = 0xA2649984F2135C301EA3ACB0776CD4F125389B311DB3BE32 m = 5 X = 0x10BB8E9840049B183E078D9C300E1605590118EBDD7FF590 Y = 0x31361008476F917BADC9F836E62762BE312B72543CCEAEA1 m = 6 X = 0xA37ABC6C431F9AC398BF5BD1AA6678320ACE8ECB93D23F2A Y = 0x851B3CAEC99908DBFED7040A1BBDA90E081F7C5710BC68F0 m = 7 X = 0x8DA75A1F75DDCD7660F923243060EDCE5DE37F007011FCFD Y = 0x57CB5FCF6860B35418240DB8FDB3C01DD4B702F96409FFB5 m = 8 X = 0x2FA1F92D1ECCE92014771993CC14899D4B5977883397EDDE Y = 0xA338AFDEF78B7214273B8B5978EF733FF2DD8A8E9738F6C0 m = 9 X = 0x818A4D308B1CABB74E9E8F2BA8D27C9E1D9D375AB980388F Y = 0x01D1AA5E208D87CD7C292F7CBB457CDF30EA542176C8E739 m = 10 X = 0xAA7C4F9EF99E3E96D1AEDE2BD9238842859BB150D1FE9D85 Y = 0x3212A36547EDC62901EE3658B2F4859460EB5EB2491397B0 m = 11 X = 0x1C995995EB76324F1844F7164D22B652280940370628A2AA Y = 0xEF1765CE37E9EB73029F556400FA77BDB34CB8611AAA9C04 m = 12 X = 0x1061343F3D456D0ECA013877F8C9E7B28FCCDCDA67EEB8AB Y = 0x5A064CAA2EA6B03798FEF8E3E7A48648681EAC020B27293F m = 13 X = 0x112AF141D33EFB9F2F68821E051E4EA004144A363C4A090A Y = 0x6E0CBE3BFC5293F72A2C1726E081E09E7F10A094432B1C1E m = 14 X = 0x13B9310646EBC93B591746B3F7C64E05DEE08843DE1081C1 Y = 0x1EDCEA63B44142DD15F3B427EC41A1EC4FBACA95E186E6B4 m = 15 X = 0x8C9595E63B56B633BA3546B2B5414DE736DE4A9E7578B1E7 Y = 0x266B762A934F00C17CF387993AA566B6AD7537CDD98FC7B1 m = 16 X = 0xB7310B4548FBFDBD29005092A5355BFCD99473733048AFDF Y = 0xFF9EAE9EDCD27C1E42D8585C4546D9491845C56629CF2290 m = 17 X = 0x44275CD2E1F46DC3F9F57636C2B4213B8BB445930510FF8A Y = 0xEFAD8348FDE30C87DE438612A818E98D9B76A67AD25DDFD0 m = 18 X = 0xC1B4DB0227210613A6CA15C428024E40B6513365D72591A3 Y = 0x1E26B286BCA1D08F4FE8F801267DF9FD7782EC3EC3F47F53 m = 19 X = 0xC0626BCF247DE5D307FD839238D72688774FC97A1CF8AD1B Y = 0x9CDC99D753973DC197E12778E829C804EC1A6B4E71FAA20A m = 20 X = 0xBB6F082321D34DBD786A1566915C6DD5EDF879AB0F5ADD67 Y = 0x91E4DD8A77C4531C8B76DEF2E5339B5EB95D5D9479DF4C8D m = 112233445566778899 X = 0x81E6E0F14C9302C8A8DCA8A038B73165E9687D0490CD9F85 Y = 0xF58067119EED8579388C4281DC645A27DB7764750E812477 m = 112233445566778899112233445566778899 X = 0xB357B10AC985C891B29FB37DA56661CCCF50CEC21128D4F6 Y = 0xBA20DC2FA1CC228D3C2D8B538C2177C2921884C6B7F0D96F m = 1618292094200346491064154703205151664562462359653015613567 X = 0x74FEC215F253C6BD845831E059B318C87F727B136A700B91 Y = 0x4B702B15B126A703E7A7CEC3E0EC81F8DFCA73A59F5D88B9 m = 1484605055214526729816930749766694384906446681761906688 X = 0x0C40230F9C4B8C0FD91F2C604FCBA9B87C2DFA153F010B4F Y = 0x5FC4F5771F467971B2C82752413833A68CE00F4A9A692B02 m = 1569275434166462877105627261392580354519833538813866540831 X = 0x28783BBF6208E1FF0F965FD8DC0C26FF1D8E02B433EDF2F7 Y = 0xA5852BBC44FD8164C1ABA9A3EC7A88E461D5D77ABD743E87 m = 3138550867681922400546388175470823984762234518836963313664 X = 0x45DAF0A306121BDB3B82E734CB44FDF65C9930F0E4FD2068 Y = 0xF039FACE58EB7DE34E3374ADB28DF81F019C4548BAA75B64 m = 3138550119404545973088374812479323842475901485681169401600 X = 0x1D5EC85004EA2ABA905CEF98A818A8C3516D7CB69A6FD575 Y = 0x4008F35F5820F66C902195644162E5AA231DD69C9E1ECC97 m = 24519928471166604179655321383971467003990211439919824896 X = 0xF063727C2EA4D358AB02F6B0BEEB14DBEAF2E8A1DB3208EE Y = 0x427418C015553361769B6A0C42923C4CA103740B6DCD9703 m = 46756768218837031708063422466358611246556475572231 X = 0xDC81D33CA6604B1EFE49386CD492979EF807B8BAEB8566E3 Y = 0xD454247FF478514556333B3901C9F1CCC18DBC9AB938CFA0 m = 3138502977207688322901699644928655553044791844086883549215 X = 0xD932741DF6AA0E1EED24279150436C752AA5ADCFD0698D72 Y = 0x9759B6D2EF21D885E94CDFF219F17004D8763401DAB021B5 m = 47890485652059026491391979477371914515865621847605503 X = 0x571477E9D9F2A628780742257F7250C4224C483B30F3A97E Y = 0x1AD35EE3177D22DD5F01B5A46FFDEC547B6A41786EBB8C8F m = 3138549376958826959341570842566593375326996431013993775615 X = 0x4C69939642792776C826DB8B4EBF4BD8C03FC9DFA2AEC822 Y = 0x29BF35BE52A6036E07EBA5741CFEB4C143310216EF1B9A2E m = 6277101735386680763835789423176059013767194773182842284061 X = 0xBB6F082321D34DBD786A1566915C6DD5EDF879AB0F5ADD67 Y = 0x6E1B2275883BACE37489210D1ACC64A046A2A26B8620B372 m = 6277101735386680763835789423176059013767194773182842284062 X = 0xC0626BCF247DE5D307FD839238D72688774FC97A1CF8AD1B Y = 0x63236628AC68C23E681ED88717D637FA13E594B18E055DF5 m = 6277101735386680763835789423176059013767194773182842284063 X = 0xC1B4DB0227210613A6CA15C428024E40B6513365D72591A3 Y = 0xE1D94D79435E2F70B01707FED9820601887D13C13C0B80AC m = 6277101735386680763835789423176059013767194773182842284064 X = 0x44275CD2E1F46DC3F9F57636C2B4213B8BB445930510FF8A Y = 0x10527CB7021CF37821BC79ED57E71671648959852DA2202F m = 6277101735386680763835789423176059013767194773182842284065 X = 0xB7310B4548FBFDBD29005092A5355BFCD99473733048AFDF Y = 0x00615161232D83E1BD27A7A3BAB926B5E7BA3A99D630DD6F m = 6277101735386680763835789423176059013767194773182842284066 X = 0x8C9595E63B56B633BA3546B2B5414DE736DE4A9E7578B1E7 Y = 0xD99489D56CB0FF3E830C7866C55A9948528AC8322670384E m = 6277101735386680763835789423176059013767194773182842284067 X = 0x13B9310646EBC93B591746B3F7C64E05DEE08843DE1081C1 Y = 0xE123159C4BBEBD22EA0C4BD813BE5E12B045356A1E79194B m = 6277101735386680763835789423176059013767194773182842284068 X = 0x112AF141D33EFB9F2F68821E051E4EA004144A363C4A090A Y = 0x91F341C403AD6C08D5D3E8D91F7E1F6080EF5F6BBCD4E3E1 m = 6277101735386680763835789423176059013767194773182842284069 X = 0x1061343F3D456D0ECA013877F8C9E7B28FCCDCDA67EEB8AB Y = 0xA5F9B355D1594FC86701071C185B79B697E153FDF4D8D6C0 m = 6277101735386680763835789423176059013767194773182842284070 X = 0x1C995995EB76324F1844F7164D22B652280940370628A2AA Y = 0x10E89A31C816148CFD60AA9BFF0588414CB3479EE55563FB m = 6277101735386680763835789423176059013767194773182842284071 X = 0xAA7C4F9EF99E3E96D1AEDE2BD9238842859BB150D1FE9D85 Y = 0xCDED5C9AB81239D6FE11C9A74D0B7A6A9F14A14DB6EC684F m = 6277101735386680763835789423176059013767194773182842284072 X = 0x818A4D308B1CABB74E9E8F2BA8D27C9E1D9D375AB980388F Y = 0xFE2E55A1DF72783283D6D08344BA831FCF15ABDE893718C6 m = 6277101735386680763835789423176059013767194773182842284073 X = 0x2FA1F92D1ECCE92014771993CC14899D4B5977883397EDDE Y = 0x5CC7502108748DEBD8C474A687108CBF0D22757168C7093F m = 6277101735386680763835789423176059013767194773182842284074 X = 0x8DA75A1F75DDCD7660F923243060EDCE5DE37F007011FCFD Y = 0xA834A030979F4CABE7DBF247024C3FE12B48FD069BF6004A m = 6277101735386680763835789423176059013767194773182842284075 X = 0xA37ABC6C431F9AC398BF5BD1AA6678320ACE8ECB93D23F2A Y = 0x7AE4C3513666F7240128FBF5E44256F0F7E083A8EF43970F m = 6277101735386680763835789423176059013767194773182842284076 X = 0x10BB8E9840049B183E078D9C300E1605590118EBDD7FF590 Y = 0xCEC9EFF7B8906E84523607C919D89D40CED48DABC331515E m = 6277101735386680763835789423176059013767194773182842284077 X = 0x35433907297CC378B0015703374729D7A4FE46647084E4BA Y = 0x5D9B667B0DECA3CFE15C534F88932B0DDAC764CEE24C41CD m = 6277101735386680763835789423176059013767194773182842284078 X = 0x76E32A2557599E6EDCD283201FB2B9AADFD0D359CBB263DA Y = 0x87D3C81C8D45BADF559D1F012EDE2B600C4ABC99F302FA02 m = 6277101735386680763835789423176059013767194773182842284079 X = 0xDAFEBF5828783F2AD35534631588A3F629A70FB16982A888 Y = 0x229425F266C25F05B94D8443EBE4796FA6CCE505A3816C54 m = 6277101735386680763835789423176059013767194773182842284080 X = 0x188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012 Y = 0xF8E6D46A003725879CEFEE1294DB32298C06885EE186B7EE [secp224r1] m = 1 X = 0xB70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21 Y = 0xBD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34 m = 2 X = 0x706A46DC76DCB76798E60E6D89474788D16DC18032D268FD1A704FA6 Y = 0x1C2B76A7BC25E7702A704FA986892849FCA629487ACF3709D2E4E8BB m = 3 X = 0xDF1B1D66A551D0D31EFF822558B9D2CC75C2180279FE0D08FD896D04 Y = 0xA3F7F03CADD0BE444C0AA56830130DDF77D317344E1AF3591981A925 m = 4 X = 0xAE99FEEBB5D26945B54892092A8AEE02912930FA41CD114E40447301 Y = 0x0482580A0EC5BC47E88BC8C378632CD196CB3FA058A7114EB03054C9 m = 5 X = 0x31C49AE75BCE7807CDFF22055D94EE9021FEDBB5AB51C57526F011AA Y = 0x27E8BFF1745635EC5BA0C9F1C2EDE15414C6507D29FFE37E790A079B m = 6 X = 0x1F2483F82572251FCA975FEA40DB821DF8AD82A3C002EE6C57112408 Y = 0x89FAF0CCB750D99B553C574FAD7ECFB0438586EB3952AF5B4B153C7E m = 7 X = 0xDB2F6BE630E246A5CF7D99B85194B123D487E2D466B94B24A03C3E28 Y = 0x0F3A30085497F2F611EE2517B163EF8C53B715D18BB4E4808D02B963 m = 8 X = 0x858E6F9CC6C12C31F5DF124AA77767B05C8BC021BD683D2B55571550 Y = 0x046DCD3EA5C43898C5C5FC4FDAC7DB39C2F02EBEE4E3541D1E78047A m = 9 X = 0x2FDCCCFEE720A77EF6CB3BFBB447F9383117E3DAA4A07E36ED15F78D Y = 0x371732E4F41BF4F7883035E6A79FCEDC0E196EB07B48171697517463 m = 10 X = 0xAEA9E17A306517EB89152AA7096D2C381EC813C51AA880E7BEE2C0FD Y = 0x39BB30EAB337E0A521B6CBA1ABE4B2B3A3E524C14A3FE3EB116B655F m = 11 X = 0xEF53B6294ACA431F0F3C22DC82EB9050324F1D88D377E716448E507C Y = 0x20B510004092E96636CFB7E32EFDED8265C266DFB754FA6D6491A6DA m = 12 X = 0x6E31EE1DC137F81B056752E4DEAB1443A481033E9B4C93A3044F4F7A Y = 0x207DDDF0385BFDEAB6E9ACDA8DA06B3BBEF224A93AB1E9E036109D13 m = 13 X = 0x34E8E17A430E43289793C383FAC9774247B40E9EBD3366981FCFAECA Y = 0x252819F71C7FB7FBCB159BE337D37D3336D7FEB963724FDFB0ECB767 m = 14 X = 0xA53640C83DC208603DED83E4ECF758F24C357D7CF48088B2CE01E9FA Y = 0xD5814CD724199C4A5B974A43685FBF5B8BAC69459C9469BC8F23CCAF m = 15 X = 0xBAA4D8635511A7D288AEBEEDD12CE529FF102C91F97F867E21916BF9 Y = 0x979A5F4759F80F4FB4EC2E34F5566D595680A11735E7B61046127989 m = 16 X = 0x0B6EC4FE1777382404EF679997BA8D1CC5CD8E85349259F590C4C66D Y = 0x3399D464345906B11B00E363EF429221F2EC720D2F665D7DEAD5B482 m = 17 X = 0xB8357C3A6CEEF288310E17B8BFEFF9200846CA8C1942497C484403BC Y = 0xFF149EFA6606A6BD20EF7D1B06BD92F6904639DCE5174DB6CC554A26 m = 18 X = 0xC9FF61B040874C0568479216824A15EAB1A838A797D189746226E4CC Y = 0xEA98D60E5FFC9B8FCF999FAB1DF7E7EF7084F20DDB61BB045A6CE002 m = 19 X = 0xA1E81C04F30CE201C7C9ACE785ED44CC33B455A022F2ACDBC6CAE83C Y = 0xDCF1F6C3DB09C70ACC25391D492FE25B4A180BABD6CEA356C04719CD m = 20 X = 0xFCC7F2B45DF1CD5A3C0C0731CA47A8AF75CFB0347E8354EEFE782455 Y = 0x0D5D7110274CBA7CDEE90E1A8B0D394C376A5573DB6BE0BF2747F530 m = 112233445566778899 X = 0x61F077C6F62ED802DAD7C2F38F5C67F2CC453601E61BD076BB46179E Y = 0x2272F9E9F5933E70388EE652513443B5E289DD135DCC0D0299B225E4 m = 112233445566778899112233445566778899 X = 0x029895F0AF496BFC62B6EF8D8A65C88C613949B03668AAB4F0429E35 Y = 0x3EA6E53F9A841F2019EC24BDE1A75677AA9B5902E61081C01064DE93 m = 6950511619965839450988900688150712778015737983940691968051900319680 X = 0xAB689930BCAE4A4AA5F5CB085E823E8AE30FD365EB1DA4ABA9CF0379 Y = 0x3345A121BBD233548AF0D210654EB40BAB788A03666419BE6FBD34E7 m = 13479972933410060327035789020509431695094902435494295338570602119423 X = 0xBDB6A8817C1F89DA1C2F3DD8E97FEB4494F2ED302A4CE2BC7F5F4025 Y = 0x4C7020D57C00411889462D77A5438BB4E97D177700BF7243A07F1680 m = 13479971751745682581351455311314208093898607229429740618390390702079 X = 0xD58B61AA41C32DD5EBA462647DBA75C5D67C83606C0AF2BD928446A9 Y = 0xD24BA6A837BE0460DD107AE77725696D211446C5609B4595976B16BD m = 13479972931865328106486971546324465392952975980343228160962702868479 X = 0xDC9FA77978A005510980E929A1485F63716DF695D7A0C18BB518DF03 Y = 0xEDE2B016F2DDFFC2A8C015B134928275CE09E5661B7AB14CE0D1D403 m = 11795773708834916026404142434151065506931607341523388140225443265536 X = 0x499D8B2829CFB879C901F7D85D357045EDAB55028824D0F05BA279BA Y = 0xBF929537B06E4015919639D94F57838FA33FC3D952598DCDBB44D638 m = 784254593043826236572847595991346435467177662189391577090 X = 0x8246C999137186632C5F9EDDF3B1B0E1764C5E8BD0E0D8A554B9CB77 Y = 0xE80ED8660BC1CB17AC7D845BE40A7A022D3306F116AE9F81FEA65947 m = 13479767645505654746623887797783387853576174193480695826442858012671 X = 0x6670C20AFCCEAEA672C97F75E2E9DD5C8460E54BB38538EBB4BD30EB Y = 0xF280D8008D07A4CAF54271F993527D46FF3FF46FD1190A3F1FAA4F74 m = 205688069665150753842126177372015544874550518966168735589597183 X = 0x000ECA934247425CFD949B795CB5CE1EFF401550386E28D1A4C5A8EB Y = 0xD4C01040DBA19628931BC8855370317C722CBD9CA6156985F1C2E9CE m = 13479966930919337728895168462090683249159702977113823384618282123295 X = 0xEF353BF5C73CD551B96D596FBC9A67F16D61DD9FE56AF19DE1FBA9CD Y = 0x21771B9CDCE3E8430C09B3838BE70B48C21E15BC09EE1F2D7945B91F m = 50210731791415612487756441341851895584393717453129007497216 X = 0x4036052A3091EB481046AD3289C95D3AC905CA0023DE2C03ECD451CF Y = 0xD768165A38A2B96F812586A9D59D4136035D9C853A5BF2E1C86A4993 m = 26959946667150639794667015087019625940457807714424391721682722368041 X = 0xFCC7F2B45DF1CD5A3C0C0731CA47A8AF75CFB0347E8354EEFE782455 Y = 0xF2A28EEFD8B345832116F1E574F2C6B2C895AA8C24941F40D8B80AD1 m = 26959946667150639794667015087019625940457807714424391721682722368042 X = 0xA1E81C04F30CE201C7C9ACE785ED44CC33B455A022F2ACDBC6CAE83C Y = 0x230E093C24F638F533DAC6E2B6D01DA3B5E7F45429315CA93FB8E634 m = 26959946667150639794667015087019625940457807714424391721682722368043 X = 0xC9FF61B040874C0568479216824A15EAB1A838A797D189746226E4CC Y = 0x156729F1A003647030666054E208180F8F7B0DF2249E44FBA5931FFF m = 26959946667150639794667015087019625940457807714424391721682722368044 X = 0xB8357C3A6CEEF288310E17B8BFEFF9200846CA8C1942497C484403BC Y = 0x00EB610599F95942DF1082E4F9426D086FB9C6231AE8B24933AAB5DB m = 26959946667150639794667015087019625940457807714424391721682722368045 X = 0x0B6EC4FE1777382404EF679997BA8D1CC5CD8E85349259F590C4C66D Y = 0xCC662B9BCBA6F94EE4FF1C9C10BD6DDD0D138DF2D099A282152A4B7F m = 26959946667150639794667015087019625940457807714424391721682722368046 X = 0xBAA4D8635511A7D288AEBEEDD12CE529FF102C91F97F867E21916BF9 Y = 0x6865A0B8A607F0B04B13D1CB0AA992A5A97F5EE8CA1849EFB9ED8678 m = 26959946667150639794667015087019625940457807714424391721682722368047 X = 0xA53640C83DC208603DED83E4ECF758F24C357D7CF48088B2CE01E9FA Y = 0x2A7EB328DBE663B5A468B5BC97A040A3745396BA636B964370DC3352 m = 26959946667150639794667015087019625940457807714424391721682722368048 X = 0x34E8E17A430E43289793C383FAC9774247B40E9EBD3366981FCFAECA Y = 0xDAD7E608E380480434EA641CC82C82CBC92801469C8DB0204F13489A m = 26959946667150639794667015087019625940457807714424391721682722368049 X = 0x6E31EE1DC137F81B056752E4DEAB1443A481033E9B4C93A3044F4F7A Y = 0xDF82220FC7A4021549165325725F94C3410DDB56C54E161FC9EF62EE m = 26959946667150639794667015087019625940457807714424391721682722368050 X = 0xEF53B6294ACA431F0F3C22DC82EB9050324F1D88D377E716448E507C Y = 0xDF4AEFFFBF6D1699C930481CD102127C9A3D992048AB05929B6E5927 m = 26959946667150639794667015087019625940457807714424391721682722368051 X = 0xAEA9E17A306517EB89152AA7096D2C381EC813C51AA880E7BEE2C0FD Y = 0xC644CF154CC81F5ADE49345E541B4D4B5C1ADB3EB5C01C14EE949AA2 m = 26959946667150639794667015087019625940457807714424391721682722368052 X = 0x2FDCCCFEE720A77EF6CB3BFBB447F9383117E3DAA4A07E36ED15F78D Y = 0xC8E8CD1B0BE40B0877CFCA1958603122F1E6914F84B7E8E968AE8B9E m = 26959946667150639794667015087019625940457807714424391721682722368053 X = 0x858E6F9CC6C12C31F5DF124AA77767B05C8BC021BD683D2B55571550 Y = 0xFB9232C15A3BC7673A3A03B0253824C53D0FD1411B1CABE2E187FB87 m = 26959946667150639794667015087019625940457807714424391721682722368054 X = 0xDB2F6BE630E246A5CF7D99B85194B123D487E2D466B94B24A03C3E28 Y = 0xF0C5CFF7AB680D09EE11DAE84E9C1072AC48EA2E744B1B7F72FD469E m = 26959946667150639794667015087019625940457807714424391721682722368055 X = 0x1F2483F82572251FCA975FEA40DB821DF8AD82A3C002EE6C57112408 Y = 0x76050F3348AF2664AAC3A8B05281304EBC7A7914C6AD50A4B4EAC383 m = 26959946667150639794667015087019625940457807714424391721682722368056 X = 0x31C49AE75BCE7807CDFF22055D94EE9021FEDBB5AB51C57526F011AA Y = 0xD817400E8BA9CA13A45F360E3D121EAAEB39AF82D6001C8186F5F866 m = 26959946667150639794667015087019625940457807714424391721682722368057 X = 0xAE99FEEBB5D26945B54892092A8AEE02912930FA41CD114E40447301 Y = 0xFB7DA7F5F13A43B81774373C879CD32D6934C05FA758EEB14FCFAB38 m = 26959946667150639794667015087019625940457807714424391721682722368058 X = 0xDF1B1D66A551D0D31EFF822558B9D2CC75C2180279FE0D08FD896D04 Y = 0x5C080FC3522F41BBB3F55A97CFECF21F882CE8CBB1E50CA6E67E56DC m = 26959946667150639794667015087019625940457807714424391721682722368059 X = 0x706A46DC76DCB76798E60E6D89474788D16DC18032D268FD1A704FA6 Y = 0xE3D4895843DA188FD58FB0567976D7B50359D6B78530C8F62D1B1746 m = 26959946667150639794667015087019625940457807714424391721682722368060 X = 0xB70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21 Y = 0x42C89C774A08DC04B3DD201932BC8A5EA5F8B89BBB2A7E667AFF81CD [secp256r1] m = 1 X = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296 Y = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5 m = 2 X = 0x7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC47669978 Y = 0x07775510DB8ED040293D9AC69F7430DBBA7DADE63CE982299E04B79D227873D1 m = 3 X = 0x5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C Y = 0x8734640C4998FF7E374B06CE1A64A2ECD82AB036384FB83D9A79B127A27D5032 m = 4 X = 0xE2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B030852 Y = 0xE0F1575A4C633CC719DFEE5FDA862D764EFC96C3F30EE0055C42C23F184ED8C6 m = 5 X = 0x51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033ED Y = 0xE0C17DA8904A727D8AE1BF36BF8A79260D012F00D4D80888D1D0BB44FDA16DA4 m = 6 X = 0xB01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A9 Y = 0xE85C10743237DAD56FEC0E2DFBA703791C00F7701C7E16BDFD7C48538FC77FE2 m = 7 X = 0x8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A3 Y = 0x73EB1DBDE03318366D069F83A6F5900053C73633CB041B21C55E1A86C1F400B4 m = 8 X = 0x62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB393 Y = 0xAD5ACCBD91E9D8244FF15D771167CEE0A2ED51F6BBE76A78DA540A6A0F09957E m = 9 X = 0xEA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE0 Y = 0x2A2744C972C9FCE787014A964A8EA0C84D714FEAA4DE823FE85A224A4DD048FA m = 10 X = 0xCEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F Y = 0x878662A229AAAE906E123CDD9D3B4C10590DED29FE751EEECA34BBAA44AF0773 m = 11 X = 0x3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D1 Y = 0x9099209ACCC4C8A224C843AFA4F4C68A090D04DA5E9889DAE2F8EEFCE82A3740 m = 12 X = 0x741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C4 Y = 0x0770B46A9C385FDC567383554887B1548EEB912C35BA5CA71995FF22CD4481D3 m = 13 X = 0x177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C01 Y = 0x63BB58CD4EBEA558A24091ADB40F4E7226EE14C3A1FB4DF39C43BBE2EFC7BFD8 m = 14 X = 0x54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920B Y = 0xF599F1BB29F4317542121F8C05A2E7C37171EA77735090081BA7C82F60D0B375 m = 15 X = 0xF0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5F Y = 0xB5B93EE3592E2D1F4E6594E51F9643E62A3B21CE75B5FA3F47E59CDE0D034F36 m = 16 X = 0x76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6E Y = 0xA985FE61341F260E6CB0A1B5E11E87208599A0040FC78BAA0E9DDD724B8C5110 m = 17 X = 0x47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73E Y = 0xAA005EE6B5B957286231856577648E8381B2804428D5733F32F787FF71F1FCDC m = 18 X = 0x1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDA Y = 0xF6F1645A15CBE5DC9FA9B7DFD96EE5A7DCC11B5C5EF4F1F78D83B3393C6A45A2 m = 19 X = 0xCB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED83 Y = 0x58D7614B24D9EF515C35E7100D6D6CE4A496716E30FA3E03E39150752BCECDAA m = 20 X = 0x83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A Y = 0x76E49B6DE2F73234AE6A5EB9D612B75C9F2202BB6923F54FF8240AAA86F640B8 m = 112233445566778899 X = 0x339150844EC15234807FE862A86BE77977DBFB3AE3D96F4C22795513AEAAB82F Y = 0xB1C14DDFDC8EC1B2583F51E85A5EB3A155840F2034730E9B5ADA38B674336A21 m = 112233445566778899112233445566778899 X = 0x1B7E046A076CC25E6D7FA5003F6729F665CC3241B5ADAB12B498CD32F2803264 Y = 0xBFEA79BE2B666B073DB69A2A241ADAB0738FE9D2DD28B5604EB8C8CF097C457B m = 29852220098221261079183923314599206100666902414330245206392788703677545185283 X = 0x9EACE8F4B071E677C5350B02F2BB2B384AAE89D58AA72CA97A170572E0FB222F Y = 0x1BBDAEC2430B09B93F7CB08678636CE12EAAFD58390699B5FD2F6E1188FC2A78 m = 57896042899961394862005778464643882389978449576758748073725983489954366354431 X = 0x878F22CC6DB6048D2B767268F22FFAD8E56AB8E2DC615F7BD89F1E350500DD8D Y = 0x714A5D7BB901C9C5853400D12341A892EF45D87FC553786756C4F0C9391D763E m = 1766845392945710151501889105729049882997660004824848915955419660366636031 X = 0x659A379625AB122F2512B8DADA02C6348D53B54452DFF67AC7ACE4E8856295CA Y = 0x49D81AB97B648464D0B4A288BD7818FAB41A16426E943527C4FED8736C53D0F6 m = 28948025760307534517734791687894775804466072615242963443097661355606862201087 X = 0xCBCEAAA8A4DD44BBCE58E8DB7740A5510EC2CB7EA8DA8D8F036B3FB04CDA4DE4 Y = 0x4BD7AA301A80D7F59FD983FEDBE59BB7B2863FE46494935E3745B360E32332FA m = 113078210460870548944811695960290644973229224625838436424477095834645696384 X = 0xF0C4A0576154FF3A33A3460D42EAED806E854DFA37125221D37935124BA462A4 Y = 0x5B392FA964434D29EEC6C9DBC261CF116796864AA2FAADB984A2DF38D1AEF7A3 m = 12078056106883488161242983286051341125085761470677906721917479268909056 X = 0x5E6C8524B6369530B12C62D31EC53E0288173BD662BDF680B53A41ECBCAD00CC Y = 0x447FE742C2BFEF4D0DB14B5B83A2682309B5618E0064A94804E9282179FE089F m = 57782969857385448082319957860328652998540760998293976083718804450708503920639 X = 0x03792E541BC209076A3D7920A915021ECD396A6EB5C3960024BE5575F3223484 Y = 0xFC774AE092403101563B712F68170312304F20C80B40C06282063DB25F268DE4 m = 57896017119460046759583662757090100341435943767777707906455551163257755533312 X = 0x2379FF85AB693CDF901D6CE6F2473F39C04A2FE3DCD842CE7AAB0E002095BCF8 Y = 0xF8B476530A634589D5129E46F322B02FBC610A703D80875EE70D7CE1877436A1 m = 452312848374287284681282171017647412726433684238464212999305864837160993279 X = 0xC1E4072C529BF2F44DA769EFC934472848003B3AF2C0F5AA8F8DDBD53E12ED7C Y = 0x39A6EE77812BB37E8079CD01ED649D3830FCA46F718C1D3993E4A591824ABCDB m = 904571339174065134293634407946054000774746055866917729876676367558469746684 X = 0x34DFBC09404C21E250A9B40FA8772897AC63A094877DB65862B61BD1507B34F3 Y = 0xCF6F8A876C6F99CEAEC87148F18C7E1E0DA6E165FFC8ED82ABB65955215F77D3 m = 115792089210356248762697446949407573529996955224135760342422259061068512044349 X = 0x83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A Y = 0x891B64911D08CDCC5195A14629ED48A360DDFD4596DC0AB007DBF5557909BF47 m = 115792089210356248762697446949407573529996955224135760342422259061068512044350 X = 0xCB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED83 Y = 0xA7289EB3DB2610AFA3CA18EFF292931B5B698E92CF05C1FC1C6EAF8AD4313255 m = 115792089210356248762697446949407573529996955224135760342422259061068512044351 X = 0x1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDA Y = 0x090E9BA4EA341A246056482026911A58233EE4A4A10B0E08727C4CC6C395BA5D m = 115792089210356248762697446949407573529996955224135760342422259061068512044352 X = 0x47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73E Y = 0x55FFA1184A46A8D89DCE7A9A889B717C7E4D7FBCD72A8CC0CD0878008E0E0323 m = 115792089210356248762697446949407573529996955224135760342422259061068512044353 X = 0x76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6E Y = 0x567A019DCBE0D9F2934F5E4A1EE178DF7A665FFCF0387455F162228DB473AEEF m = 115792089210356248762697446949407573529996955224135760342422259061068512044354 X = 0xF0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5F Y = 0x4A46C11BA6D1D2E1B19A6B1AE069BC19D5C4DE328A4A05C0B81A6321F2FCB0C9 m = 115792089210356248762697446949407573529996955224135760342422259061068512044355 X = 0x54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920B Y = 0x0A660E43D60BCE8BBDEDE073FA5D183C8E8E15898CAF6FF7E45837D09F2F4C8A m = 115792089210356248762697446949407573529996955224135760342422259061068512044356 X = 0x177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C01 Y = 0x9C44A731B1415AA85DBF6E524BF0B18DD911EB3D5E04B20C63BC441D10384027 m = 115792089210356248762697446949407573529996955224135760342422259061068512044357 X = 0x741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C4 Y = 0xF88F4B9463C7A024A98C7CAAB7784EAB71146ED4CA45A358E66A00DD32BB7E2C m = 115792089210356248762697446949407573529996955224135760342422259061068512044358 X = 0x3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D1 Y = 0x6F66DF64333B375EDB37BC505B0B3975F6F2FB26A16776251D07110317D5C8BF m = 115792089210356248762697446949407573529996955224135760342422259061068512044359 X = 0xCEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F Y = 0x78799D5CD655517091EDC32262C4B3EFA6F212D7018AE11135CB4455BB50F88C m = 115792089210356248762697446949407573529996955224135760342422259061068512044360 X = 0xEA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE0 Y = 0xD5D8BB358D36031978FEB569B5715F37B28EB0165B217DC017A5DDB5B22FB705 m = 115792089210356248762697446949407573529996955224135760342422259061068512044361 X = 0x62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB393 Y = 0x52A533416E1627DCB00EA288EE98311F5D12AE0A4418958725ABF595F0F66A81 m = 115792089210356248762697446949407573529996955224135760342422259061068512044362 X = 0x8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A3 Y = 0x8C14E2411FCCE7CA92F9607C590A6FFFAC38C9CD34FBE4DE3AA1E5793E0BFF4B m = 115792089210356248762697446949407573529996955224135760342422259061068512044363 X = 0xB01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A9 Y = 0x17A3EF8ACDC8252B9013F1D20458FC86E3FF0890E381E9420283B7AC7038801D m = 115792089210356248762697446949407573529996955224135760342422259061068512044364 X = 0x51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033ED Y = 0x1F3E82566FB58D83751E40C9407586D9F2FED1002B27F7772E2F44BB025E925B m = 115792089210356248762697446949407573529996955224135760342422259061068512044365 X = 0xE2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B030852 Y = 0x1F0EA8A4B39CC339E62011A02579D289B103693D0CF11FFAA3BD3DC0E7B12739 m = 115792089210356248762697446949407573529996955224135760342422259061068512044366 X = 0x5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C Y = 0x78CB9BF2B6670082C8B4F931E59B5D1327D54FCAC7B047C265864ED85D82AFCD m = 115792089210356248762697446949407573529996955224135760342422259061068512044367 X = 0x7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC47669978 Y = 0xF888AAEE24712FC0D6C26539608BCF244582521AC3167DD661FB4862DD878C2E m = 115792089210356248762697446949407573529996955224135760342422259061068512044368 X = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296 Y = 0xB01CBD1C01E58065711814B583F061E9D431CCA994CEA1313449BF97C840AE0A [secp384r1] m = 1 X = 0xAA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7 Y = 0x3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F m = 2 X = 0x08D999057BA3D2D969260045C55B97F089025959A6F434D651D207D19FB96E9E4FE0E86EBE0E64F85B96A9C75295DF61 Y = 0x8E80F1FA5B1B3CEDB7BFE8DFFD6DBA74B275D875BC6CC43E904E505F256AB4255FFD43E94D39E22D61501E700A940E80 m = 3 X = 0x077A41D4606FFA1464793C7E5FDC7D98CB9D3910202DCD06BEA4F240D3566DA6B408BBAE5026580D02D7E5C70500C831 Y = 0xC995F7CA0B0C42837D0BBE9602A9FC998520B41C85115AA5F7684C0EDC111EACC24ABD6BE4B5D298B65F28600A2F1DF1 m = 4 X = 0x138251CD52AC9298C1C8AAD977321DEB97E709BD0B4CA0ACA55DC8AD51DCFC9D1589A1597E3A5120E1EFD631C63E1835 Y = 0xCACAE29869A62E1631E8A28181AB56616DC45D918ABC09F3AB0E63CF792AA4DCED7387BE37BBA569549F1C02B270ED67 m = 5 X = 0x11DE24A2C251C777573CAC5EA025E467F208E51DBFF98FC54F6661CBE56583B037882F4A1CA297E60ABCDBC3836D84BC Y = 0x8FA696C77440F92D0F5837E90A00E7C5284B447754D5DEE88C986533B6901AEB3177686D0AE8FB33184414ABE6C1713A m = 6 X = 0x627BE1ACD064D2B2226FE0D26F2D15D3C33EBCBB7F0F5DA51CBD41F26257383021317D7202FF30E50937F0854E35C5DF Y = 0x09766A4CB3F8B1C21BE6DDA6C14F1575B2C95352644F774C99864F613715441604C45B8D84E165311733A408D3F0F934 m = 7 X = 0x283C1D7365CE4788F29F8EBF234EDFFEAD6FE997FBEA5FFA2D58CC9DFA7B1C508B05526F55B9EBB2040F05B48FB6D0E1 Y = 0x9475C99061E41B88BA52EFDB8C1690471A61D867ED799729D9C92CD01DBD225630D84EDE32A78F9E64664CDAC512EF8C m = 8 X = 0x1692778EA596E0BE75114297A6FA383445BF227FBE58190A900C3C73256F11FB5A3258D6F403D5ECE6E9B269D822C87D Y = 0xDCD2365700D4106A835388BA3DB8FD0E22554ADC6D521CD4BD1C30C2EC0EEC196BADE1E9CDD1708D6F6ABFA4022B0AD2 m = 9 X = 0x8F0A39A4049BCB3EF1BF29B8B025B78F2216F7291E6FD3BAC6CB1EE285FB6E21C388528BFEE2B9535C55E4461079118B Y = 0x62C77E1438B601D6452C4A5322C3A9799A9B3D7CA3C400C6B7678854AED9B3029E743EFEDFD51B68262DA4F9AC664AF8 m = 10 X = 0xA669C5563BD67EEC678D29D6EF4FDE864F372D90B79B9E88931D5C29291238CCED8E85AB507BF91AA9CB2D13186658FB Y = 0xA988B72AE7C1279F22D9083DB5F0ECDDF70119550C183C31C502DF78C3B705A8296D8195248288D997784F6AB73A21DD m = 11 X = 0x099056E27DA7B998DA1EEEC2904816C57FE935ED5837C37456C9FD14892D3F8C4749B66E3AFB81D626356F3B55B4DDD8 Y = 0x2E4C0C234E30AB96688505544AC5E0396FC4EED8DFC363FD43FF93F41B52A3255466D51263AAFF357D5DBA8138C5E0BB m = 12 X = 0x952A7A349BD49289AB3AC421DCF683D08C2ED5E41F6D0E21648AF2691A481406DA4A5E22DA817CB466DA2EA77D2A7022 Y = 0xA0320FAF84B5BC0563052DEAE6F66F2E09FB8036CE18A0EBB9028B096196B50D031AA64589743E229EF6BACCE21BD16E m = 13 X = 0xA567BA97B67AEA5BAFDAF5002FFCC6AB9632BFF9F01F873F6267BCD1F0F11C139EE5F441ABD99F1BAAF1CA1E3B5CBCE7 Y = 0xDE1B38B3989F3318644E4147AF164ECC5185595046932EC086329BE057857D66776BCB8272218A7D6423A12736F429CC m = 14 X = 0xE8C8F94D44FBC2396BBEAC481B89D2B0877B1DFFD23E7DC95DE541EB651CCA2C41ABA24DBC02DE6637209ACCF0F59EA0 Y = 0x891AE44356FC8AE0932BCBF6DE52C8A933B86191E7728D79C8319413A09D0F48FC468BA05509DE22D7EE5C9E1B67B888 m = 15 X = 0xB3D13FC8B32B01058CC15C11D813525522A94156FFF01C205B21F9F7DA7C4E9CA849557A10B6383B4B88701A9606860B Y = 0x152919E7DF9162A61B049B2536164B1BEEBAC4A11D749AF484D1114373DFBFD9838D24F8B284AF50985D588D33F7BD62 m = 16 X = 0xD5D89C3B5282369C5FBD88E2B231511A6B80DFF0E5152CF6A464FA9428A8583BAC8EBC773D157811A462B892401DAFCF Y = 0xD815229DE12906D241816D5E9A9448F1D41D4FC40E2A3BDB9CABA57E440A7ABAD1210CB8F49BF2236822B755EBAB3673 m = 17 X = 0x4099952208B4889600A5EBBCB13E1A32692BEFB0733B41E6DCC614E42E5805F817012A991AF1F486CAF3A9ADD9FFCC03 Y = 0x5ECF94777833059839474594AF603598163AD3F8008AD0CD9B797D277F2388B304DA4D2FAA9680ECFA650EF5E23B09A0 m = 18 X = 0xDFB1FE3A40F7AC9B64C41D39360A7423828B97CB088A4903315E402A7089FA0F8B6C2355169CC9C99DFB44692A9B93DD Y = 0x453ACA1243B5EC6B423A68A25587E1613A634C1C42D2EE7E6C57F449A1C91DC89168B7036EC0A7F37A366185233EC522 m = 19 X = 0x8D481DAB912BC8AB16858A211D750B77E07DBECCA86CD9B012390B430467AABF59C8651060801C0E9599E68713F5D41B Y = 0xA1592FF0121460857BE99F2A60669050B2291B68A1039AA0594B32FD7ADC0E8C11FFBA5608004E646995B07E75E52245 m = 20 X = 0x605508EC02C534BCEEE9484C86086D2139849E2B11C1A9CA1E2808DEC2EAF161AC8A105D70D4F85C50599BE5800A623F Y = 0x5158EE87962AC6B81F00A103B8543A07381B7639A3A65F1353AEF11B733106DDE92E99B78DE367B48E238C38DAD8EEDD m = 112233445566778899 X = 0xA499EFE48839BC3ABCD1C5CEDBDD51904F9514DB44F4686DB918983B0C9DC3AEE05A88B72433E9515F91A329F5F4FA60 Y = 0x3B7CA28EF31F809C2F1BA24AAED847D0F8B406A4B8968542DE139DB5828CA410E615D1182E25B91B1131E230B727D36A m = 112233445566778899112233445566778899 X = 0x90A0B1CAC601676B083F21E07BC7090A3390FE1B9C7F61D842D27FA315FB38D83667A11A71438773E483F2A114836B24 Y = 0x3197D3C6123F0D6CD65D5F0DE106FEF36656CB16DC7CD1A6817EB1D51510135A8F492F72665CFD1053F75ED03A7D04C9 m = 10158184112867540819754776755819761756724522948540419979637868435924061464745859402573149498125806098880003248619520 X = 0xF2A066BD332DC59BBC3D01DA1B124C687D8BB44611186422DE94C1DA4ECF150E664D353CCDB5CB2652685F8EB4D2CD49 Y = 0xD6ED0BF75FDD8E53D87765FA746835B673881D6D1907163A2C43990D75B454294F942EC571AD5AAE1806CAF2BB8E9A4A m = 9850501551105991028245052605056992139810094908912799254115847683881357749738726091734403950439157209401153690566655 X = 0x5C7F9845D1C4AA44747F9137B6F9C39B36B26B8A62E8AF97290434D5F3B214F5A0131550ADB19058DC4C8780C4165C4A Y = 0x712F7FCCC86F647E70DB8798228CB16344AF3D00B139B6F8502939C2A965AF0EB4E39E2E16AB8F597B8D5630A50C9D85 m = 9850502723405747097317271194763310482462751455185699630571661657946308788426092983270628740691202018691293898608608 X = 0xDD5838F7EC3B8ACF1BECFD746F8B668C577107E93548ED93ED0D254C112E76B10F053109EF8428BFCD50D38C4C030C57 Y = 0x33244F479CDAC34F160D9E4CE2D19D2FF0E3305B5BF0EEF29E91E9DE6E28F678C61B773AA7E3C03740E1A49D1AA2493C m = 1146189371817832990947611400450889406070215735255370280811736587845016396640969656447803207438173695115264 X = 0xCB8ED893530BFBA04B4CA655923AAAD109A62BC8411D5925316C32D33602459C33057A1FBCB5F70AEB295D90F9165FBC Y = 0x426AEE3E91B08420F9B357B66D5AFCBCF3956590BF5564DBF9086042EB880493D19DA39AAA6436C6B5FC66CE5596B43F m = 9619341438217097641865390297189708858938017986426152622639500179774624579127744608993294698873437325090751520764 X = 0x67F714012B6B070182122DDD435CC1C2262A1AB88939BC6A2906CB2B4137C5E82B4582160F6403CAB887ACDF5786A268 Y = 0x90E31CF398CE2F8C5897C7380BF541075D1B4D3CB70547262B7095731252F181AC0597C66AF8311C7780DB39DEC0BD32 m = 1231307996623833742387400352380172566077927415136813282735641918395585376659282194317590461518639141730493780722175 X = 0x55A79DF7B53A99D31462C7E1A5ED5623970715BB1021098CB973A7520CBD6365E613E4B2467486FB37E86E01CEE09B8F Y = 0xB95AEB71693189911661B709A886A1867F056A0EFE401EE11C06030E46F7A87731DA4575863178012208707DD666727C m = 587118838854683800942906722504810343086699021451906946003274128973058942197377013128840514404789143516741631 X = 0x9539A968CF819A0E52E10EEA3BACA1B6480D7E4DF69BC07002C568569047110EE4FE72FCA423FDD5179D6E0E19C44844 Y = 0xA7728F37A0AE0DF2716061900D83A4DA149144129F89A214A8260464BAB609BB322E4E67DE5E4C4C6CB8D25983EC19B0 m = 153914077530671739663795070876894766451466019374644150541452557147890542143280855693795882295846834387672681660416 X = 0x933FC13276672AB360D909161CD02D830B1628935DF0D800C6ED602C59D575A86A8A97E3A2D697E3ED06BE741C0097D6 Y = 0xF35296BD7A6B4C6C025ED6D84338CCCC7522A45C5D4FBDB1442556CAEFB598128FA188793ADA510EB5F44E90A4E4BEF1 m = 75148784606135150476268171850082176256856776750560539466196504390587921789283134009866871754361028131485122560 X = 0x0CE31E1C4A937071E6EBACA026A93D783848BCC0C1585DAF639518125FCD1F1629D63041ABFB11FFC8F03FA8B6FCF6BF Y = 0xA69EA55BE4BEAB2D5224050FEBFFBDFCFD614624C3B4F228909EB80012F003756D1C377E52F04FA539237F24DD080E2E m = 19691383761310193665095292424754807745686799029814707849273381514021788371252213000473497648851202400395528761229312 X = 0x6842CFE3589AC268818291F31D44177A9168DCBC19F321ED66D81ECF59E31B54CCA0DDFD4C4136780171748D69A91C54 Y = 0xE3A5ECD5AC725F13DBC631F358C6E817EDCF3A613B83832741A9DB591A0BAE767FC714F70C2E7EA891E4312047DECCC0 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942623 X = 0x605508EC02C534BCEEE9484C86086D2139849E2B11C1A9CA1E2808DEC2EAF161AC8A105D70D4F85C50599BE5800A623F Y = 0xAEA7117869D53947E0FF5EFC47ABC5F8C7E489C65C59A0ECAC510EE48CCEF92116D16647721C984B71DC73C825271122 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942624 X = 0x8D481DAB912BC8AB16858A211D750B77E07DBECCA86CD9B012390B430467AABF59C8651060801C0E9599E68713F5D41B Y = 0x5EA6D00FEDEB9F7A841660D59F996FAF4DD6E4975EFC655FA6B4CD028523F172EE0045A8F7FFB19B966A4F828A1ADDBA m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942625 X = 0xDFB1FE3A40F7AC9B64C41D39360A7423828B97CB088A4903315E402A7089FA0F8B6C2355169CC9C99DFB44692A9B93DD Y = 0xBAC535EDBC4A1394BDC5975DAA781E9EC59CB3E3BD2D118193A80BB65E36E2366E9748FB913F580C85C99E7BDCC13ADD m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942626 X = 0x4099952208B4889600A5EBBCB13E1A32692BEFB0733B41E6DCC614E42E5805F817012A991AF1F486CAF3A9ADD9FFCC03 Y = 0xA1306B8887CCFA67C6B8BA6B509FCA67E9C52C07FF752F32648682D880DC774BFB25B2CF55697F13059AF10B1DC4F65F m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942627 X = 0xD5D89C3B5282369C5FBD88E2B231511A6B80DFF0E5152CF6A464FA9428A8583BAC8EBC773D157811A462B892401DAFCF Y = 0x27EADD621ED6F92DBE7E92A1656BB70E2BE2B03BF1D5C42463545A81BBF585442EDEF3460B640DDC97DD48AB1454C98C m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942628 X = 0xB3D13FC8B32B01058CC15C11D813525522A94156FFF01C205B21F9F7DA7C4E9CA849557A10B6383B4B88701A9606860B Y = 0xEAD6E618206E9D59E4FB64DAC9E9B4E411453B5EE28B650B7B2EEEBC8C2040257C72DB064D7B50AF67A2A773CC08429D m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942629 X = 0xE8C8F94D44FBC2396BBEAC481B89D2B0877B1DFFD23E7DC95DE541EB651CCA2C41ABA24DBC02DE6637209ACCF0F59EA0 Y = 0x76E51BBCA903751F6CD4340921AD3756CC479E6E188D728637CE6BEC5F62F0B603B9745EAAF621DD2811A362E4984777 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942630 X = 0xA567BA97B67AEA5BAFDAF5002FFCC6AB9632BFF9F01F873F6267BCD1F0F11C139EE5F441ABD99F1BAAF1CA1E3B5CBCE7 Y = 0x21E4C74C6760CCE79BB1BEB850E9B133AE7AA6AFB96CD13F79CD641FA87A82988894347C8DDE75829BDC5ED9C90BD633 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942631 X = 0x952A7A349BD49289AB3AC421DCF683D08C2ED5E41F6D0E21648AF2691A481406DA4A5E22DA817CB466DA2EA77D2A7022 Y = 0x5FCDF0507B4A43FA9CFAD215190990D1F6047FC931E75F1446FD74F69E694AF1FCE559B9768BC1DD610945341DE42E91 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942632 X = 0x099056E27DA7B998DA1EEEC2904816C57FE935ED5837C37456C9FD14892D3F8C4749B66E3AFB81D626356F3B55B4DDD8 Y = 0xD1B3F3DCB1CF5469977AFAABB53A1FC6903B1127203C9C02BC006C0BE4AD5CD9AB992AEC9C5500CA82A2457FC73A1F44 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942633 X = 0xA669C5563BD67EEC678D29D6EF4FDE864F372D90B79B9E88931D5C29291238CCED8E85AB507BF91AA9CB2D13186658FB Y = 0x567748D5183ED860DD26F7C24A0F132208FEE6AAF3E7C3CE3AFD20873C48FA56D6927E69DB7D77266887B09648C5DE22 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942634 X = 0x8F0A39A4049BCB3EF1BF29B8B025B78F2216F7291E6FD3BAC6CB1EE285FB6E21C388528BFEE2B9535C55E4461079118B Y = 0x9D3881EBC749FE29BAD3B5ACDD3C56866564C2835C3BFF39489877AB51264CFC618BC100202AE497D9D25B075399B507 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942635 X = 0x1692778EA596E0BE75114297A6FA383445BF227FBE58190A900C3C73256F11FB5A3258D6F403D5ECE6E9B269D822C87D Y = 0x232DC9A8FF2BEF957CAC7745C24702F1DDAAB52392ADE32B42E3CF3D13F113E594521E15322E8F729095405CFDD4F52D m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942636 X = 0x283C1D7365CE4788F29F8EBF234EDFFEAD6FE997FBEA5FFA2D58CC9DFA7B1C508B05526F55B9EBB2040F05B48FB6D0E1 Y = 0x6B8A366F9E1BE47745AD102473E96FB8E59E2798128668D62636D32FE242DDA8CF27B120CD5870619B99B3263AED1073 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942637 X = 0x627BE1ACD064D2B2226FE0D26F2D15D3C33EBCBB7F0F5DA51CBD41F26257383021317D7202FF30E50937F0854E35C5DF Y = 0xF68995B34C074E3DE41922593EB0EA8A4D36ACAD9BB088B36679B09EC8EABBE8FB3BA4717B1E9ACEE8CC5BF82C0F06CB m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942638 X = 0x11DE24A2C251C777573CAC5EA025E467F208E51DBFF98FC54F6661CBE56583B037882F4A1CA297E60ABCDBC3836D84BC Y = 0x705969388BBF06D2F0A7C816F5FF183AD7B4BB88AB2A211773679ACC496FE513CE889791F51704CCE7BBEB55193E8EC5 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942639 X = 0x138251CD52AC9298C1C8AAD977321DEB97E709BD0B4CA0ACA55DC8AD51DCFC9D1589A1597E3A5120E1EFD631C63E1835 Y = 0x35351D679659D1E9CE175D7E7E54A99E923BA26E7543F60C54F19C3086D55B22128C7840C8445A96AB60E3FE4D8F1298 m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942640 X = 0x077A41D4606FFA1464793C7E5FDC7D98CB9D3910202DCD06BEA4F240D3566DA6B408BBAE5026580D02D7E5C70500C831 Y = 0x366A0835F4F3BD7C82F44169FD5603667ADF4BE37AEEA55A0897B3F123EEE1523DB542931B4A2D6749A0D7A0F5D0E20E m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942641 X = 0x08D999057BA3D2D969260045C55B97F089025959A6F434D651D207D19FB96E9E4FE0E86EBE0E64F85B96A9C75295DF61 Y = 0x717F0E05A4E4C312484017200292458B4D8A278A43933BC16FB1AFA0DA954BD9A002BC15B2C61DD29EAFE190F56BF17F m = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942642 X = 0xAA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7 Y = 0xC9E821B569D9D390A26167406D6D23D6070BE242D765EB831625CEEC4A0F473EF59F4E30E2817E6285BCE2846F15F1A0 [secp521r1] m = 1 X = 0x00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66 Y = 0x011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650 m = 2 X = 0x00433C219024277E7E682FCB288148C282747403279B1CCC06352C6E5505D769BE97B3B204DA6EF55507AA104A3A35C5AF41CF2FA364D60FD967F43E3933BA6D783D Y = 0x00F4BB8CC7F86DB26700A7F3ECEEEED3F0B5C6B5107C4DA97740AB21A29906C42DBBB3E377DE9F251F6B93937FA99A3248F4EAFCBE95EDC0F4F71BE356D661F41B02 m = 3 X = 0x01A73D352443DE29195DD91D6A64B5959479B52A6E5B123D9AB9E5AD7A112D7A8DD1AD3F164A3A4832051DA6BD16B59FE21BAEB490862C32EA05A5919D2EDE37AD7D Y = 0x013E9B03B97DFA62DDD9979F86C6CAB814F2F1557FA82A9D0317D2F8AB1FA355CEEC2E2DD4CF8DC575B02D5ACED1DEC3C70CF105C9BC93A590425F588CA1EE86C0E5 m = 4 X = 0x0035B5DF64AE2AC204C354B483487C9070CDC61C891C5FF39AFC06C5D55541D3CEAC8659E24AFE3D0750E8B88E9F078AF066A1D5025B08E5A5E2FBC87412871902F3 Y = 0x0082096F84261279D2B673E0178EB0B4ABB65521AEF6E6E32E1B5AE63FE2F19907F279F283E54BA385405224F750A95B85EEBB7FAEF04699D1D9E21F47FC346E4D0D m = 5 X = 0x00652BF3C52927A432C73DBC3391C04EB0BF7A596EFDB53F0D24CF03DAB8F177ACE4383C0C6D5E3014237112FEAF137E79A329D7E1E6D8931738D5AB5096EC8F3078 Y = 0x015BE6EF1BDD6601D6EC8A2B73114A8112911CD8FE8E872E0051EDD817C9A0347087BB6897C9072CF374311540211CF5FF79D1F007257354F7F8173CC3E8DEB090CB m = 6 X = 0x01EE4569D6CDB59219532EFF34F94480D195623D30977FD71CF3981506ADE4AB01525FBCCA16153F7394E0727A239531BE8C2F66E95657F380AE23731BEDF79206B9 Y = 0x01DE0255AD0CC64F586AE2DD270546E3B1112AABBB73DA5A808E7240A926201A8A96CAB72D0E56648C9DF96C984DE274F2203DC7B8B55CA0DADE1EACCD7858D44F17 m = 7 X = 0x0056D5D1D99D5B7F6346EEB65FDA0B073A0C5F22E0E8F5483228F018D2C2F7114C5D8C308D0ABFC698D8C9A6DF30DCE3BBC46F953F50FDC2619A01CEAD882816ECD4 Y = 0x003D2D1B7D9BAAA2A110D1D8317A39D68478B5C582D02824F0DD71DBD98A26CBDE556BD0F293CDEC9E2B9523A34591CE1A5F9E76712A5DDEFC7B5C6B8BC90525251B m = 8 X = 0x000822C40FB6301F7262A8348396B010E25BD4E29D8A9B003E0A8B8A3B05F826298F5BFEA5B8579F49F08B598C1BC8D79E1AB56289B5A6F4040586F9EA54AA78CE68 Y = 0x016331911D5542FC482048FDAB6E78853B9A44F8EDE9E2C0715B5083DE610677A8F189E9C0AA5911B4BFF0BA0DF065C578699F3BA940094713538AD642F11F17801C m = 9 X = 0x01585389E359E1E21826A2F5BF157156D488ED34541B988746992C4AB145B8C6B6657429E1396134DA35F3C556DF725A318F4F50BABD85CD28661F45627967CBE207 Y = 0x002A2E618C9A8AEDF39F0B55557A27AE938E3088A654EE1CEBB6C825BA263DDB446E0D69E5756057AC840FF56ECF4ABFD87D736C2AE928880F343AA0EA86B9AD2A4E m = 10 X = 0x0190EB8F22BDA61F281DFCFE7BB6721EC4CD901D879AC09AC7C34A9246B11ADA8910A2C7C178FCC263299DAA4DA9842093F37C2E411F1A8E819A87FF09A04F2F3320 Y = 0x01EB5D96B8491614BA9DBAEAB3B0CA2BA760C2EEB2144251B20BA97FD78A62EF62D2BF5349D44D9864BB536F6163DC57EBEFF3689639739FAA172954BC98135EC759 m = 11 X = 0x008A75841259FDEDFF546F1A39573B4315CFED5DC7ED7C17849543EF2C54F2991652F3DBC5332663DA1BD19B1AEBE3191085015C024FA4C9A902ECC0E02DDA0CDB9A Y = 0x0096FB303FCBBA2129849D0CA877054FB2293ADD566210BD0493ED2E95D4E0B9B82B1BC8A90E8B42A4AB3892331914A95336DCAC80E3F4819B5D58874F92CE48C808 m = 12 X = 0x01C0D9DCEC93F8221C5DE4FAE9749C7FDE1E81874157958457B6107CF7A5967713A644E90B7C3FB81B31477FEE9A60E938013774C75C530928B17BE69571BF842D8C Y = 0x014048B5946A4927C0FE3CE1D103A682CA4763FE65AB71494DA45E404ABF6A17C097D6D18843D86FCDB6CC10A6F951B9B630884BA72224F5AE6C79E7B1A3281B17F0 m = 13 X = 0x007E3E98F984C396AD9CD7865D2B4924861A93F736CDE1B4C2384EEDD2BEAF5B866132C45908E03C996A3550A5E79AB88EE94BEC3B00AB38EFF81887848D32FBCDA7 Y = 0x0108EE58EB6D781FEDA91A1926DAA3ED5A08CED50A386D5421C69C7A67AE5C1E212AC1BD5D5838BC763F26DFDD351CBFBBC36199EAAF9117E9F7291A01FB022A71C9 m = 14 X = 0x01875BC7DC551B1B65A9E1B8CCFAAF84DED1958B401494116A2FD4FB0BABE0B3199974FC06C8B897222D79DF3E4B7BC744AA6767F6B812EFBF5D2C9E682DD3432D74 Y = 0x005CA4923575DACB5BD2D66290BBABB4BDFB8470122B8E51826A0847CE9B86D7ED62D07781B1B4F3584C11E89BF1D133DC0D5B690F53A87C84BE41669F852700D54A m = 15 X = 0x006B6AD89ABCB92465F041558FC546D4300FB8FBCC30B40A0852D697B532DF128E11B91CCE27DBD00FFE7875BD1C8FC0331D9B8D96981E3F92BDE9AFE337BCB8DB55 Y = 0x01B468DA271571391D6A7CE64D2333EDBF63DF0496A9BAD20CBA4B62106997485ED57E9062C899470A802148E2232C96C99246FD90CC446ABDD956343480A1475465 m = 16 X = 0x01D17D10D8A89C8AD05DDA97DA26AC743B0B2A87F66192FD3F3DD632F8D20B188A52943FF18861CA00A0E5965DA7985630DF0DBF5C8007DCDC533A6C508F81A8402F Y = 0x007A37343C582D77001FC714B18D3D3E69721335E4C3B800D50EC7CA30C94B6B82C1C182E1398DB547AA0B3075AC9D9988529E3004D28D18633352E272F89BC73ABE m = 17 X = 0x01B00DDB707F130EDA13A0B874645923906A99EE9E269FA2B3B4D66524F269250858760A69E674FE0287DF4E799B5681380FF8C3042AF0D1A41076F817A853110AE0 Y = 0x0085683F1D7DB16576DBC111D4E4AEDDD106B799534CF69910A98D68AC2B22A1323DF9DA564EF6DD0BF0D2F6757F16ADF420E6905594C2B755F535B9CB7C70E64647 m = 18 X = 0x01BC33425E72A12779EACB2EDCC5B63D1281F7E86DBC7BF99A7ABD0CFE367DE4666D6EDBB8525BFFE5222F0702C3096DEC0884CE572F5A15C423FDF44D01DD99C61D Y = 0x010D06E999885B63535DE3E74D33D9E63D024FB07CE0D196F2552C8E4A00AC84C044234AEB201F7A9133915D1B4B45209B9DA79FE15B19F84FD135D841E2D8F9A86A m = 19 X = 0x00998DCCE486419C3487C0F948C2D5A1A07245B77E0755DF547EFFF0ACDB3790E7F1FA3B3096362669679232557D7A45970DFECF431E725BBDE478FF0B2418D6A19B Y = 0x0137D5DA0626A021ED5CC3942497535B245D67D28AEE2B7BCF4ACC50EEE36545772773AD963FF2EB8CF9B0EC39991631C377F5A4D89EA9FBFE44A9091A695BFD0575 m = 20 X = 0x018BDD7F1B889598A4653DEEAE39CC6F8CC2BD767C2AB0D93FB12E968FBED342B51709506339CB1049CB11DD48B9BDB3CD5CAD792E43B74E16D8E2603BFB11B0344F Y = 0x00C5AADBE63F68CA5B6B6908296959BF0AF89EE7F52B410B9444546C550952D311204DA3BDDDC6D4EAE7EDFAEC1030DA8EF837CCB22EEE9CFC94DD3287FED0990F94 m = 112233445566778899 X = 0x01650048FBD63E8C30B305BF36BD7643B91448EF2206E8A0CA84A140789A99B0423A0A2533EA079CA7E049843E69E5FA2C25A163819110CEC1A30ACBBB3A422A40D8 Y = 0x010C9C64A0E0DB6052DBC5646687D06DECE5E9E0703153EFE9CB816FE025E85354D3C5F869D6DB3F4C0C01B5F97919A5E72CEEBE03042E5AA99112691CFFC2724828 m = 112233445566778899112233445566778899 X = 0x017E1370D39C9C63925DAEEAC571E21CAAF60BD169191BAEE8352E0F54674443B29786243564ABB705F6FC0FE5FC5D3F98086B67CA0BE7AC8A9DEC421D9F1BC6B37F Y = 0x01CD559605EAD19FBD99E83600A6A81A0489E6F20306EE0789AE00CE16A6EFEA2F42F7534186CF1C60DF230BD9BCF8CB95E5028AD9820B2B1C0E15597EE54C4614A6 m = 1769805277975163035253775930842367129093741786725376786007349332653323812656658291413435033257677579095366632521448854141275926144187294499863933403633025023 X = 0x00B45CB84651C9D4F08858B867F82D816E84E94FE4CAE3DA5F65E420B08398D0C5BF019253A6C26D20671BDEF0B8E6C1D348A4B0734687F73AC6A4CBB2E085C68B3F Y = 0x01C84942BBF538903062170A4BA8B3410D385719BA2037D29CA5248BFCBC8478220FEC79244DCD45D31885A1764DEE479CE20B12CEAB62F9001C7AA4282CE4BE7F56 m = 104748400337157462316262627929132596317243790506798133267698218707528750292682889221414310155907963824712114916552440160880550666043997030661040721887239 X = 0x01CCEF4CDA108CEBE6568820B54A3CA3A3997E4EF0EDA6C350E7ED3DBB1861EDD80181C650CEBE5440FEBA880F9C8A7A86F8B82659794F6F5B88E501E5DD84E65D7E Y = 0x01026565F8B195D03C3F6139C3A63EAA1C29F7090AB2A8F75027939EC05109035F1B38E6C508E0C14CE53AB7E2DA33AA28140EDBF3964862FB157119517454E60F07 m = 6703903865078345888141381651430168039496664077350965054288133126549307058741788671148197429777343936466127575938031786147409472627479702469884214509568000 X = 0x00C1002DC2884EEDADB3F9B468BBEBD55980799852C506D37271FFCD006919DB3A96DF8FE91EF6ED4B9081B1809E8F2C2B28AF5FCBF524147C73CB0B913D6FAB0995 Y = 0x01614E8A62C8293DD2AA6EF27D30974A4FD185019FA8EF4F982DA48698CECF706581F69EE9ED67A9C231EC9D0934D0F674646153273BCBB345E923B1EC1386A1A4AD m = 1675925643682395305404517165643562251880026958780896531698856737024179880343339878336382412050263431942974939646683480906434632963478257639757341102436352 X = 0x010ED3E085ECDE1E66874286B5D5642B9D37853A026A0A025C7B84936E2ECEEC5F342E14C80C79CCF814D5AD085C5303F2823251F2B9276F88C9D7A43E387EBD87AC Y = 0x01BE399A7666B29E79BBF3D277531A97CE05CAC0B49BECE4781E7AEE0D6E80FEE883C76E9F08453DC1ADE4E49300F3D56FEE6A1510DA1B1F12EEAA39A05AA0508119 m = 12785133382149415221402495202586701798620696169446772599038235721862338692190156163951558963856959059232381602864743924427451786769515154396810706943 X = 0x013070A29B059D317AF37089E40FCB135868F52290EFF3E9F3E32CDADCA18EA234D8589C665A4B8E3D0714DE004A419DEA7091A3BBA97263C438FE9413AA598FD4A5 Y = 0x00238A27FD9E5E7324C8B538EF2E334B71AC2611A95F42F4F2544D8C4A65D2A32A8BAFA15EFD4FC2BD8AB2B0C51F65B680879589F4D5FE8A84CEB17A2E8D3587F011 m = 214524875832249255872206855495734426889477529336261655255492425273322727861341825677722947375406711676372335314043071600934941615185418540320233184489636351 X = 0x01A3D88799878EC74E66FF1AD8C7DFA9A9B4445A17F0810FF8189DD27AE3B6C580D352476DBDAEB08D7DA0DE3866F7C7FDBEBB8418E19710F1F7AFA88C22280B1404 Y = 0x00B39703D2053EC7B8812BDFEBFD81B4CB76F245FE535A1F1E46801C35DE03C15063A99A203981529C146132863CA0E68544D0F0A638D8A2859D82B4DD266F27C3AE m = 51140486275567859131139077890835526884648461857823088348651153840508287621366854506831244746531272246620295123104269565867055949378266395604768784399 X = 0x01D16B4365DEFE6FD356DC1F31727AF2A32C7E86C5AE87ED2950A08BC8653F203C7F7860E80F95AA27C93EA76E8CD094127B15ED42CC5F96DC0A0F9A1C1E31D0D526 Y = 0x006E3710A0F9366E0BB8A14FFE8EBC2722EECF4A123EC9BA98DCCCA335D6FAFD289DC69FD90903C9AC982FEB46DF93F03A7C8C9549D32C1C386D17F37340E63822A8 m = 6651529716025206881035279952881520627841152247212784520914425039312606120198879080839643311347169019249080198239408356563413447402270445462102068592377843 X = 0x01B1220F67C985E9FC9C588C0C86BB16E6FE4CC11E168A98D701AE4670724B3D030ED9965FADF4207C7A1BE9BE0F40DEF2BBFFF0C7EABCB5B42526CE1D3CAA468F52 Y = 0x006CDAD2860F6D2C37159A5A866D11605F2E7D87430DCFE6E6816AB6423CD9003CA6F2527B9C2A2483C541D456C963D18A0D2A46E158CB2A44C0BF42D562881FB748 m = 3224551824613232232537680077946818660156835288778087344805370397811379731631671254853846826682273677870214778462237171365140390183770226853329363961324241919 X = 0x00F25E545213C8C074BE38A0612EA9B66336B14A874372548D9716392DFA31CD0D13E94F86CD48B8D43B80B5299144E01245C873B39F6AC6C4FB397746AF034AD67C Y = 0x01733ABB21147CC27E35F41FAF40290AFD1EEB221D983FFABBD88E5DC8776450A409EACDC1BCA2B9F517289C68645BB96781808FEAE42573C2BB289F16E2AECECE17 m = 12486613128442885430380874043991285080254917488396284953815149251315412600634581539066663092297612040669978017623587752845409653167277021864132608 X = 0x0172CD22CBE0634B6BFEE24BB1D350F384A945ED618ECAD48AADC6C1BC0DCC107F0FFE9FE14DC929F90153F390C25BE5D3A73A56F9ACCB0C72C768753869732D0DC4 Y = 0x00D249CFB570DA4CC48FB5426A928B43D7922F787373B6182408FBC71706E7527E8414C79167F3C999FF58DE352D238F1FE7168C658D338F72696F2F889A97DE23C5 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005429 X = 0x018BDD7F1B889598A4653DEEAE39CC6F8CC2BD767C2AB0D93FB12E968FBED342B51709506339CB1049CB11DD48B9BDB3CD5CAD792E43B74E16D8E2603BFB11B0344F Y = 0x013A552419C09735A49496F7D696A640F50761180AD4BEF46BBBAB93AAF6AD2CEEDFB25C4222392B1518120513EFCF257107C8334DD11163036B22CD78012F66F06B m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005430 X = 0x00998DCCE486419C3487C0F948C2D5A1A07245B77E0755DF547EFFF0ACDB3790E7F1FA3B3096362669679232557D7A45970DFECF431E725BBDE478FF0B2418D6A19B Y = 0x00C82A25F9D95FDE12A33C6BDB68ACA4DBA2982D7511D48430B533AF111C9ABA88D88C5269C00D1473064F13C666E9CE3C880A5B2761560401BB56F6E596A402FA8A m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005431 X = 0x01BC33425E72A12779EACB2EDCC5B63D1281F7E86DBC7BF99A7ABD0CFE367DE4666D6EDBB8525BFFE5222F0702C3096DEC0884CE572F5A15C423FDF44D01DD99C61D Y = 0x00F2F9166677A49CACA21C18B2CC2619C2FDB04F831F2E690DAAD371B5FF537B3FBBDCB514DFE0856ECC6EA2E4B4BADF646258601EA4E607B02ECA27BE1D27065795 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005432 X = 0x01B00DDB707F130EDA13A0B874645923906A99EE9E269FA2B3B4D66524F269250858760A69E674FE0287DF4E799B5681380FF8C3042AF0D1A41076F817A853110AE0 Y = 0x017A97C0E2824E9A89243EEE2B1B51222EF94866ACB30966EF56729753D4DD5ECDC20625A9B10922F40F2D098A80E9520BDF196FAA6B3D48AA0ACA4634838F19B9B8 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005433 X = 0x01D17D10D8A89C8AD05DDA97DA26AC743B0B2A87F66192FD3F3DD632F8D20B188A52943FF18861CA00A0E5965DA7985630DF0DBF5C8007DCDC533A6C508F81A8402F Y = 0x0185C8CBC3A7D288FFE038EB4E72C2C1968DECCA1B3C47FF2AF13835CF36B4947D3E3E7D1EC6724AB855F4CF8A53626677AD61CFFB2D72E79CCCAD1D8D076438C541 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005434 X = 0x006B6AD89ABCB92465F041558FC546D4300FB8FBCC30B40A0852D697B532DF128E11B91CCE27DBD00FFE7875BD1C8FC0331D9B8D96981E3F92BDE9AFE337BCB8DB55 Y = 0x004B9725D8EA8EC6E2958319B2DCCC12409C20FB6956452DF345B49DEF9668B7A12A816F9D3766B8F57FDEB71DDCD369366DB9026F33BB954226A9CBCB7F5EB8AB9A m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005435 X = 0x01875BC7DC551B1B65A9E1B8CCFAAF84DED1958B401494116A2FD4FB0BABE0B3199974FC06C8B897222D79DF3E4B7BC744AA6767F6B812EFBF5D2C9E682DD3432D74 Y = 0x01A35B6DCA8A2534A42D299D6F44544B42047B8FEDD471AE7D95F7B831647928129D2F887E4E4B0CA7B3EE17640E2ECC23F2A496F0AC57837B41BE99607AD8FF2AB5 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005436 X = 0x007E3E98F984C396AD9CD7865D2B4924861A93F736CDE1B4C2384EEDD2BEAF5B866132C45908E03C996A3550A5E79AB88EE94BEC3B00AB38EFF81887848D32FBCDA7 Y = 0x00F711A7149287E01256E5E6D9255C12A5F7312AF5C792ABDE3963859851A3E1DED53E42A2A7C74389C0D92022CAE340443C9E6615506EE81608D6E5FE04FDD58E36 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005437 X = 0x01C0D9DCEC93F8221C5DE4FAE9749C7FDE1E81874157958457B6107CF7A5967713A644E90B7C3FB81B31477FEE9A60E938013774C75C530928B17BE69571BF842D8C Y = 0x00BFB74A6B95B6D83F01C31E2EFC597D35B89C019A548EB6B25BA1BFB54095E83F68292E77BC2790324933EF5906AE4649CF77B458DDDB0A519386184E5CD7E4E80F m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005438 X = 0x008A75841259FDEDFF546F1A39573B4315CFED5DC7ED7C17849543EF2C54F2991652F3DBC5332663DA1BD19B1AEBE3191085015C024FA4C9A902ECC0E02DDA0CDB9A Y = 0x016904CFC03445DED67B62F35788FAB04DD6C522A99DEF42FB6C12D16A2B1F4647D4E43756F174BD5B54C76DCCE6EB56ACC923537F1C0B7E64A2A778B06D31B737F7 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005439 X = 0x0190EB8F22BDA61F281DFCFE7BB6721EC4CD901D879AC09AC7C34A9246B11ADA8910A2C7C178FCC263299DAA4DA9842093F37C2E411F1A8E819A87FF09A04F2F3320 Y = 0x0014A26947B6E9EB456245154C4F35D4589F3D114DEBBDAE4DF4568028759D109D2D40ACB62BB2679B44AC909E9C23A814100C9769C68C6055E8D6AB4367ECA138A6 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005440 X = 0x01585389E359E1E21826A2F5BF157156D488ED34541B988746992C4AB145B8C6B6657429E1396134DA35F3C556DF725A318F4F50BABD85CD28661F45627967CBE207 Y = 0x01D5D19E736575120C60F4AAAA85D8516C71CF7759AB11E3144937DA45D9C224BB91F2961A8A9FA8537BF00A9130B54027828C93D516D777F0CBC55F15794652D5B1 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005441 X = 0x000822C40FB6301F7262A8348396B010E25BD4E29D8A9B003E0A8B8A3B05F826298F5BFEA5B8579F49F08B598C1BC8D79E1AB56289B5A6F4040586F9EA54AA78CE68 Y = 0x009CCE6EE2AABD03B7DFB7025491877AC465BB0712161D3F8EA4AF7C219EF988570E76163F55A6EE4B400F45F20F9A3A879660C456BFF6B8ECAC7529BD0EE0E87FE3 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005442 X = 0x0056D5D1D99D5B7F6346EEB65FDA0B073A0C5F22E0E8F5483228F018D2C2F7114C5D8C308D0ABFC698D8C9A6DF30DCE3BBC46F953F50FDC2619A01CEAD882816ECD4 Y = 0x01C2D2E48264555D5EEF2E27CE85C6297B874A3A7D2FD7DB0F228E242675D93421AA942F0D6C321361D46ADC5CBA6E31E5A061898ED5A2210384A3947436FADADAE4 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005443 X = 0x01EE4569D6CDB59219532EFF34F94480D195623D30977FD71CF3981506ADE4AB01525FBCCA16153F7394E0727A239531BE8C2F66E95657F380AE23731BEDF79206B9 Y = 0x0021FDAA52F339B0A7951D22D8FAB91C4EEED554448C25A57F718DBF56D9DFE575693548D2F1A99B7362069367B21D8B0DDFC238474AA35F2521E1533287A72BB0E8 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005444 X = 0x00652BF3C52927A432C73DBC3391C04EB0BF7A596EFDB53F0D24CF03DAB8F177ACE4383C0C6D5E3014237112FEAF137E79A329D7E1E6D8931738D5AB5096EC8F3078 Y = 0x00A41910E42299FE291375D48CEEB57EED6EE327017178D1FFAE1227E8365FCB8F7844976836F8D30C8BCEEABFDEE30A00862E0FF8DA8CAB0807E8C33C17214F6F34 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005445 X = 0x0035B5DF64AE2AC204C354B483487C9070CDC61C891C5FF39AFC06C5D55541D3CEAC8659E24AFE3D0750E8B88E9F078AF066A1D5025B08E5A5E2FBC87412871902F3 Y = 0x017DF6907BD9ED862D498C1FE8714F4B5449AADE5109191CD1E4A519C01D0E66F80D860D7C1AB45C7ABFADDB08AF56A47A114480510FB9662E261DE0B803CB91B2F2 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005446 X = 0x01A73D352443DE29195DD91D6A64B5959479B52A6E5B123D9AB9E5AD7A112D7A8DD1AD3F164A3A4832051DA6BD16B59FE21BAEB490862C32EA05A5919D2EDE37AD7D Y = 0x00C164FC4682059D2226686079393547EB0D0EAA8057D562FCE82D0754E05CAA3113D1D22B30723A8A4FD2A5312E213C38F30EFA36436C5A6FBDA0A7735E11793F1A m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005447 X = 0x00433C219024277E7E682FCB288148C282747403279B1CCC06352C6E5505D769BE97B3B204DA6EF55507AA104A3A35C5AF41CF2FA364D60FD967F43E3933BA6D783D Y = 0x010B44733807924D98FF580C1311112C0F4A394AEF83B25688BF54DE5D66F93BD2444C1C882160DAE0946C6C805665CDB70B1503416A123F0B08E41CA9299E0BE4FD m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005448 X = 0x00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66 Y = 0x00E7C6D6958765C43FFBA375A04BD382E426670ABBB6A864BB97E85042E8D8C199D368118D66A10BD9BF3AAF46FEC052F89ECAC38F795D8D3DBF77416B89602E99AF [frp256v1] m = 1 X = 0xB6B3D4C356C139EB31183D4749D423958C27D2DCAF98B70164C97A2DD98F5CFF Y = 0x6142E0F7C8B204911F9271F0F3ECEF8C2701C307E8E4C9E183115A1554062CFB m = 2 X = 0xDE681B2898119885373F7EAFDDF94CA0A526794BDC8DA00E0E463860D227575E Y = 0xB1240D67C641B70BE151A6D456C77BE3AF2997F8858D3E07D862E37EBE0A1045 m = 3 X = 0xA13ED122D99792D3CF188FE2C964EADA77A95CE2D03BF3451BBA94DE3E967BAC Y = 0xD141A90C972AE0DA909A77BB02B973176238E32431CE8F378E039DEB74989A21 m = 4 X = 0x8A62BAE6BE63CE26B48368BE0B0BCA7CC6FC33B81FD685FD1085EE128F242FE4 Y = 0xE548BB18E8E64A4F0B3852962CB58633386C2A79D995C825D434C4B5A727B1B9 m = 5 X = 0x32B3881D7C703DB9BF613F52E9C917F096839835C025DC022967BBD1C9886B6B Y = 0x152BF2581D33558431F325E3543EF6EA3BEB58F793669392DAC37FB6D21DEA69 m = 6 X = 0x917473C20297D8F46097D95932559BEFD24F7D6E12C95EA8BABB446D0016E368 Y = 0x3EC7C0E04474E0F6A26927301E8D82EBB45B36960675119B42726EC10BEAE371 m = 7 X = 0xC33DF0E273A25BCCDACCDF7BCB4E4A6CCE84A1E3BCFA7E9C8C437759E5CC568E Y = 0xD405E69EC2F0BEA7D242BF4D743DC6AF6E5068EED23FD28975519C6821BF8E8C m = 8 X = 0x4165FC8ABBE27583DB3FBF73A5ABE9D1CDC0CCE74C2E9277000E9C37CF6E6502 Y = 0xA9738EF04EADBD7DB923A197DF564B66599FD6CCEFC7C7A61FCFA91F382BC4F2 m = 9 X = 0x2F13E149CD81DCB537A6E319F8958AB924D44CB9AF159EFC4815DAB2E8F085CF Y = 0x6F379F283A2BC73C85EA460C8D055845D65E21E6063571B67B8AE4235E03826A m = 10 X = 0x5A5C7A63CC1B9E39096A23EDBDB910585FA6F243222022C93C80C970869C3ADD Y = 0xBAA2334C228B2FECAF369DBDA74D8580BF0D7332433CC63DFF3E151BC296B43A m = 11 X = 0x990FB8C085D200757024A7CFAC7485C58A1C8479395198D364F0C8A0E4C348D9 Y = 0xECD80E63F368508A38865E3EF47FE85CD685B0A4076E080910B13751F03F87B7 m = 12 X = 0x24A6E34FE7900B720B9C7D16D059639259EC84597E4270071E34C8F4CE4AA8F0 Y = 0xE70C2FEE8688B24251836F55B268451C6B01D780FD6B1455731A5E6E15F3595E m = 13 X = 0xCDFC5A4D7449DFCEDD07A2ADE38F1395AB8925A48573FE36DD716A4D4405F0A8 Y = 0xDB55269DB768F7B843F852AF1719CA940316A20B5760ED9F5ABFD2B22904836E m = 14 X = 0xAA4C778DB565B117FDF8B97F6C7D8F5C2BC8FC8EE1D45E83CB2D5F869278EC93 Y = 0x372143067F83875C493F2BF8C440DAA551261DDF4219EFAB282E842A6F216A7C m = 15 X = 0xC14A79ED434B7275E929BE94C4EC1B6F422D6FA2D0A1FFBD49BE90E3EB3F8EFE Y = 0x3AB7343D8508A4B25717CB00FFF4F8F72EF6BC2FCD64BFA47D2534AF3944B648 m = 16 X = 0xABF3E2095C8B177E1196962459355C2528D607D1C89052B18491BFC67AE3DB09 Y = 0xCDF69F0E228FFE33AF198684EA875DE343ED920E963E9F0BAC5DC96F67B8132B m = 17 X = 0x9259B53230E01F074F99A1F4A66008B8F60B68676F413D41F9C04222E41EB5C0 Y = 0x5DFCF8487290353C483B51ABE397670D1A1F8960A127E7433F28E79BEE22CBA1 m = 18 X = 0xD84EC698A661149A2BDAFAC95546FADF8B886605CDEAC1F65212F06454BE6940 Y = 0x32C3841C5A304BE2348097C85C65513AEDFD87D1DAFE6AEE9C054845A908EE25 m = 19 X = 0xBD2D2DFDED7C89F4CC3338824842C16EB980369A31F69E292097AA007B064D50 Y = 0x3D3C1918E28690722005F8A225BD127BF925AAC8CE5A9D008C241DF1BAF8D62F m = 20 X = 0x6B3CBE572B1A3F5FE5410BCE760FEB5093320591ACB953817BDAEC25E78AD3DA Y = 0xD78BBEBEF0A416D00E855CD4C6608E1927D97066AFC19ABF27064F513833D6DA m = 112233445566778899 X = 0xCC326C5058CC9A69BDF973FC9C884D2CE0FB14A345D75A42B9EDB4E6ADC86354 Y = 0xC62A2257D0E3E8A6493E626EC3EA9D523BF647DEEDDE79E916FD69845DF9D60C m = 112233445566778899112233445566778899 X = 0x37F36537B7C11B67BB28BBE176195157C45B35436A041B8EECA6C890A0FD52AC Y = 0x83F3246923B4D29F14B62292A32AA6AB05EC840877FF2B23EE96B0CB7DC313C1 m = 1769805277975163035253775930842367129093741786725376786007349332653323812656658291413435033257677579095366632521448854141275926144187294499863933403633025023 X = 0xD3A00D4A5C235246E833EE73028521F6959CBFD57F879031C620804A5A15EE4 Y = 0x8607FB8E3DC827E5FBFD3C233B1F62245B2FAA9458DB10605D4D9719BF347320 m = 104748400337157462316262627929132596317243790506798133267698218707528750292682889221414310155907963824712114916552440160880550666043997030661040721887239 X = 0xE152362AF7609A04E311D2B591538EC07211C79668838A25DD52FEFFC0A1FD6C Y = 0x8CFC47460B9A3A66EE8CE497D02C5D57F2AB4B08C7652AB746FC0DC73AAE39C1 m = 6703903865078345888141381651430168039496664077350965054288133126549307058741788671148197429777343936466127575938031786147409472627479702469884214509568000 X = 0xAE597AD61FF4489367D4BD4132CCFD738E53C347AA463FFB5EA193713612530C Y = 0xBDAF81342A5ABF8B9A62CA88D52C5B6F6873678B6FEB0B991C2E16E32FDEB141 m = 1675925643682395305404517165643562251880026958780896531698856737024179880343339878336382412050263431942974939646683480906434632963478257639757341102436352 X = 0x6D68D7E26CA83876F061A5DA7C98211B7295105D95A68809C607C3FA779A0804 Y = 0xC422AE5AB150FFCB160D6B83D500E48074021BC618800E7CA2F97273C6E67358 m = 12785133382149415221402495202586701798620696169446772599038235721862338692190156163951558963856959059232381602864743924427451786769515154396810706943 X = 0x872741C0C28892A29F34534B3BA89ABB6382B033DE51E483DA70495A55256C33 Y = 0xD1AC425C776ADF4392B8CD0F5C0F74D550B9CD491F0BA5FF1A5C4E9F5B6329A3 m = 214524875832249255872206855495734426889477529336261655255492425273322727861341825677722947375406711676372335314043071600934941615185418540320233184489636351 X = 0xBBDC745E6DE704B17131349B4B5B4A74C3F1B010A54F1C7EC609D96C9D26F56 Y = 0xEBE2E6BEA745FA35F13F6A426F08889423B03CF8BD5E71841E4503E8B70D9CDF m = 51140486275567859131139077890835526884648461857823088348651153840508287621366854506831244746531272246620295123104269565867055949378266395604768784399 X = 0x4030688B3171D7822BD5F927E085E90731C30601166A9FEFC4C9910B65AC4438 Y = 0x58D624C7710EF1B32212785F78E90122E4F5E25775C3F702D2389DA9F9BD9EC m = 6651529716025206881035279952881520627841152247212784520914425039312606120198879080839643311347169019249080198239408356563413447402270445462102068592377843 X = 0x222D3259F3438A91CC662C357D35B9C9C431A50E4ACFBBC84EE558229077CE81 Y = 0xBE913139F0196E38E485CCA8F41F27D9F56D3FB403D9262D23ECA130B6D4228A m = 3224551824613232232537680077946818660156835288778087344805370397811379731631671254853846826682273677870214778462237171365140390183770226853329363961324241919 X = 0xBD49C1629FA9DCC53B8081C2E3D67FF2C485F098BFDBCBAAEF356D62C8B937DC Y = 0x44D4FA85987422B84DFDD4C661E9093F95B83ACBC103A5A55E723218A61877DC m = 12486613128442885430380874043991285080254917488396284953815149251315412600634581539066663092297612040669978017623587752845409653167277021864132608 X = 0x783015F0DB4715136551412DE3D34377BDC912EBACC659B73AF67DBCA7971FA Y = 0xA3B84AB91CC6626F90FE059D35727E271C00D34A57FA2423084805BB198A6FED m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005429 X = 0xE08BE120BE2B8213CE99CCE06696936E0600DAA24BD5C4D856C5D4B239187B04 Y = 0x18C3F112709CF6FA6FBDFB3F6FDC64E05B590A9172AA70DCD948D050C31D71A7 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005430 X = 0xA8D03B6C783CF9303A5F7C4F93893BCB358E4137163BD9AE0D69AB5D786C89BB Y = 0x63FB806035A05C6E21D7892AF2096F409D01D23E5EE6B198FDE656052C56BC1C m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005431 X = 0x717026BD0CF7690784464A5ED334B340F164C39D7E54E528974E060B9A1142AD Y = 0xD225B8A4826E44EC10546F07C7283796E0F2A2419C3187A4B018EC116565D0A7 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005432 X = 0x97A507F8CED10A2CDC401206D7333CCFC94BB10A2F0875313A602AECD3548A15 Y = 0xBE70BCE00A9C467E38B8F1FE2ED2B15B1FD659063EB09829680026C3D303B389 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005433 X = 0x553ACFEDF88CB67BA41AFF7AFC10E4033DA5D26CCF37C7A92368C934D8EF1A34 Y = 0x1E894D7A75FF89A7EAD8B0DA5120F1895AD502FD00D14DC5005A6D75FE9DEF0B m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005434 X = 0x8C6125EA1D79EA756B3E0A13F4D9212F7263D76AAFE912F420052973B4228CDD Y = 0x1836D6E2DD52BD45FED4CF30472D71C2A1F19743EA5A4133F136D0BB6F6B5627 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005435 X = 0x38F743EAE098EEF0A1DD876AB112331C136A097509CAA088018E0FB8D168AB30 Y = 0x6CB3B6207F9860ECB83D4CC84E2E3CFD4A1736413C57F05610E0D52F39FC5C6A m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005436 X = 0x6D321411C2E4603E571119B563FDB84A39C2907A5BAD35A3F5B0BB5F4E874884 Y = 0xD0CAEE3B69D88FCAC801D6DEDB772C5A6752FA2E70B7C8462C212DB8767105B9 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005437 X = 0xB36D6FAB2E0A74FC883CD9409838E6488BC7B5A025BB776B987E3030B1C19BA8 Y = 0xD7858284D60BD9FEB433FEA325F820FFD9ED4B702C500AC903B07B17375DC321 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005438 X = 0x4F8A6197415B349FAA6F716D6FA731C6BB28963EC7F8FB1E3B4CAD2F95B87FFE Y = 0x637B012FAEE8D7A75E31600215337B66680E88C87B4BEF37882F7F9CD648534B m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005439 X = 0x9C19D1C857C7A24BCF45DDE3DA816C9310EA064D1722CA21ED7E9FA156273F76 Y = 0x6748E610801EE0CC435B7C7684E186095062F0B0F945797CBA1EFB9F8A33162D m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005440 X = 0x8AAA80C25B0D1C4F9C7ED55490DD1443516A92E78ABCDF5491BC0FFA210714DA Y = 0x5EB51EAB682572B08A5EA638F2389E10D3CB72407A5B8D8722E714DA20D398AE m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005441 X = 0x8F9A9567680E53CD4948E044079747E6CDD08F22F155813DD5B05421A84A484E Y = 0x7FFB2F1EF0BB440BB042069CDCBA4EA8BF85310B4F58C264A794C36648D3A413 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005442 X = 0xA0202EA29D108949C419E8CEC44AEDBB186EB20703DE96C30E7B81F777EF4CAA Y = 0xC558C3FA566D841E5A4320A8AC26B5A33D968FCA0983EE74756A4550A539F062 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005443 X = 0x36F3BB462B064195BFE09D4A42E062D8CCEA8F5F2F0B88D4B9475092C939C9EB Y = 0x5D93510DEA301705972BF4A1D354A89369131FBEE8797461A1F0EE712FA16F46 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005444 X = 0x3DA216B079C4F3C2A5994AAAEA1E5317F75FAC2603BE93A3E4A0D62E2173914 Y = 0xA0B9AE3D930ED404F4297BFCD85BCA2343BA00C81FC2B52720EAE72CD1A0CD28 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005445 X = 0x2F05C2086D70439F241CB519E0DDDAE74665AC2E8C6E37606BE1F5866623C77A Y = 0xE5D726A483CF4659F3EE31E34516921BF55405ADB5891177E6D8921D4CA3A58D m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005446 X = 0x893EF9F7B2A14F17501A5B446A5B5D62B1B2E94ED7162717D612ED6E1CEE4165 Y = 0xB628E67C197A2A672C558764B69D79C2F1F7ECD55EBB3C870E854D5BA861FA07 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005447 X = 0x8EB2D128495074CC7149E19DB2A5CA5A04960EC735A8A6FB77EBC74B2A6BBBD5 Y = 0xE623CA71BFAA48B7E8972EAFACE6561144A5A9CEE366769C8C9E786FDC6EB407 m = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005448 X = 0x891DC951F8F41D80A124A6675058D305BB97F70E3BB2C13BA8056EDD15323006 Y = 0x428DF0068E6BB7DF3B03AA7765B45422995F9AEE89CA2CA1EC400B99A4C331EC botan-2.4.0/src/tests/data/pubkey/ecc_invalid.vec000066400000000000000000000070301322470703100217170ustar00rootroot00000000000000 # Public keys failing checks from Google's Wycheproof # https://github.com/google/wycheproof/blob/master/java/com/google/security/wycheproof/testcases/EcKeyTest.java # order = -115792089210356248762697446949407573529996955224135760342422259061068512044369 SubjectPublicKey = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f50221ff00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf02010103420004cdeb39edd03e2b1a11a5e134ec99d5f25f21673d403f3ecb47bd1fa676638958ea58493b8429598c0b49bbb85c3303ddb1553c3b761c2caacca71606ba9ebac8 # order = 0 SubjectPublicKey = 308201123081cb06072a8648ce3d02013081bf020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020002010103420004cdeb39edd03e2b1a11a5e134ec99d5f25f21673d403f3ecb47bd1fa676638958ea58493b8429598c0b49bbb85c3303ddb1553c3b761c2caacca71606ba9ebac8 # cofactor = -1 SubjectPublicKey = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff03420004cdeb39edd03e2b1a11a5e134ec99d5f25f21673d403f3ecb47bd1fa676638958ea58493b8429598c0b49bbb85c3303ddb1553c3b761c2caacca71606ba9ebac8 # cofactor = 0 SubjectPublicKey = 308201323081eb06072a8648ce3d02013081df020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020003420004cdeb39edd03e2b1a11a5e134ec99d5f25f21673d403f3ecb47bd1fa676638958ea58493b8429598c0b49bbb85c3303ddb1553c3b761c2caacca71606ba9ebac8 # cofactor = 115792089210356248762697446949407573529996955224135760342422259061068512044369 SubjectPublicKey = 308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103420004cdeb39edd03e2b1a11a5e134ec99d5f25f21673d403f3ecb47bd1fa676638958ea58493b8429598c0b49bbb85c3303ddb1553c3b761c2caacca71606ba9ebac8 botan-2.4.0/src/tests/data/pubkey/ecdh.vec000066400000000000000000001442011322470703100203640ustar00rootroot00000000000000 # Derived from NIST CAVS file 14.1 (Generated on Mon Nov 19 10:52:17 2012) # http://csrc.nist.gov/groups/STM/cavp/documents/components/ecccdhtestvectors.zip [secp192r1] Secret = 0xf17d3fea367b74d340851ca4270dcb24c271f445bed9d527 CounterKey = 0442ea6dd9969dd2a61fea1aac7f8e98edcc896c6e55857cc0dfbe5d7c61fac88b11811bde328e8a0d12bf01a9d204b523 K = 803d8ab2e5b6e6fca715737c3a82f7ce3c783124f6d51cd0 Secret = 0x56e853349d96fe4c442448dacb7cf92bb7a95dcf574a9bd5 CounterKey = 04deb5712fa027ac8d2f22c455ccb73a91e17b6512b5e030e77e2690a02cc9b28708431a29fb54b87b1f0c14e011ac2125 K = c208847568b98835d7312cef1f97f7aa298283152313c29d Secret = 0xc6ef61fe12e80bf56f2d3f7d0bb757394519906d55500949 CounterKey = 044edaa8efc5a0f40f843663ec5815e7762dddc008e663c20f0a9f8dc67a3e60ef6d64b522185d03df1fc0adfd42478279 K = 87229107047a3b611920d6e3b2c0c89bea4f49412260b8dd Secret = 0xe6747b9c23ba7044f38ff7e62c35e4038920f5a0163d3cda CounterKey = 048887c276edeed3e9e866b46d58d895c73fbd80b63e382e8804c5097ba6645e16206cfb70f7052655947dd44a17f1f9d5 K = eec0bed8fc55e1feddc82158fd6dc0d48a4d796aaf47d46c Secret = 0xbeabedd0154a1afcfc85d52181c10f5eb47adc51f655047d CounterKey = 040d045f30254adc1fcefa8a5b1f31bf4e739dd327cd18d594542c314e41427c08278a08ce8d7305f3b5b849c72d8aff73 K = 716e743b1b37a2cd8479f0a3d5a74c10ba2599be18d7e2f4 Secret = 0xcf70354226667321d6e2baf40999e2fd74c7a0f793fa8699 CounterKey = 04fb35ca20d2e96665c51b98e8f6eb3d79113508d8bccd4516368eec0d5bfb847721df6aaff0e5d48c444f74bf9cd8a5a7 K = f67053b934459985a315cb017bf0302891798d45d0e19508 Secret = 0xfe942515237fffdd7b4eb5c64909eee4856a076cdf12bae2 CounterKey = 04824752960c1307e5f13a83da21c7998ca8b5b00b9549f6d0bc52d91e234363bc32ee0b6778f25cd8c1847510f4348b94 K = 75822971193edd472bf30151a782619c55ad0b279c9303dd Secret = 0x33fed10492afa5bea0333c0af12cac940c4d222455bcd0fe CounterKey = 0410bb57020291141981f833b4749e5611034b308e84011d21e1cacd6b7bd17ed8ddb50b6aee0654c35f2d0eddc1cffcf6 K = 67cba2cbb69ee78bf1abafb0e6fbe33fa2094c128d59652d Secret = 0xf3557c5d70b4c7954960c33568776adbe8e43619abe26b13 CounterKey = 045192fce4185a7758ea1bc56e0e4f4e8b2dce32348d0dced120989981beaaf0006d88a96e7971a2fa3a33ba46047fc7ba K = cf99a2770a386ca0137d1eca0a226e484297ac3c513f3631 Secret = 0x586cfba1c6e81766ed52828f177b1be14ebbc5b83348c311 CounterKey = 0426d019dbe279ead01eed143a91601ada26e2f42225b1c62b6ca653f08272e0386fc9421fbd580093d7ae6301bca94476 K = 576331e2b4fb38a112810e1529834de8307fb0a0d2756877 Secret = 0xcad8100603a4f65be08d8fc8a1b7e884c5ff65deb3c96d99 CounterKey = 04539bc40fe20a0fb267888b647b03eaaf6ec20c02a1e1f8c869095e5bb7b4d44c3278a7ee6beca397c45246da9a34c8be K = 902f4501916a0dd945554c3a37b3d780d375a6da713197c4 Secret = 0x1edd879cc5c79619cae6c73a691bd5a0395c0ef3b356fcd2 CounterKey = 045d343ddb96318fb4794d10f6c573f99fee5d0d57b996250f99fbdf9d97dd88ad410235dac36e5b92ce2824b8e587a82c K = 46e4de335054d429863218ae33636fc9b89c628b64b506c7 Secret = 0x460e452273fe1827602187ad3bebee65cb84423bb4f47537 CounterKey = 048d3db9bdce137ffbfb891388c37df6c0cbc90aa5e5376220135d30b5cb660eef8764ffc744f15c1b5d6dc06ba4416d37 K = 1bfe9e5a20ac7a38d8f605b425bb9030be31ef97c101c76c Secret = 0xb970365008456f8758ecc5a3b33cf3ae6a8d568107a52167 CounterKey = 049e0a6949519c7f5be68c0433c5fdf13064aa13fb29483dc3e1c8ba63e1f471db23185f50d9c871edea21255b3a63b4b7 K = 0e8c493a4adc445dc9288a3b9b272599224054592d7265b3 Secret = 0x59c15b8a2464e41dfe4371c7f7dadf470ae425544f8113bd CounterKey = 04be088238902e9939b3d054eeeb8492daf4bdcf09a2ab77f158d6749a3a923dc80440f2661fd35b651617e65294b46375 K = 0f1991086b455ded6a1c4146f7bf59fe9b495de566ebc6bf Secret = 0xa6e9b885c66b959d1fc2708d591b6d3228e49eb98f726d61 CounterKey = 04bf5ae05025e1be617e666d87a4168363873d5761b376b503e1e6e38b372b6bee0ff5b3502d83735e3b2c26825e4f0fcc K = b30f2127c34df35aaa91dbf0bbe15798e799a03ed11698c1 Secret = 0xbdb754096ffbfbd8b0f3cb046ccb7ca149c4e7192067a3ee CounterKey = 046cc4feed84c7ab0d09005d660ed34de6955a9461c4138d1131225f33864ed48da06fa45a913b46cf42557742e35085e6 K = 64a5c246599d3e8177a2402a1110eb81e6c456ab4edb5127 Secret = 0xd5bcf2534dafc3d99964c7bd63ab7bd15999fe56dd969c42 CounterKey = 0436157315bee7afedded58c4e8ba14d3421c401e51135bcc937c297ca703f77c52bb062d8ce971db84097ba0c753a418f K = 017b8ca53c82fab163da2ab783966a39e061b32c8cfa334d Secret = 0x43d4b9df1053be5b4268104c02244d3bf9594b010b46a8b2 CounterKey = 0498464d47f0256f8292e027e8c92582ea77cf9051f5ce8e5d449552ef7578be96236fe5ed9d0643c0bb6c5a9134b0108d K = 340ef3db3dbebdd91c62c3d4e1a3da2c7c52a3338b865259 Secret = 0x94cac2c2ca714746401670d94edbf3f677867b5a03bee7ad CounterKey = 04563eb66c334cf6f123bf04c7803b48a3110214237e983bf50f351104819199ef07c9a6051d20758f3af79027ea66a53f K = 2162144921df5103d0e6a650fb13fd246f4738d0896ce92f Secret = 0x2a3a9e33c8cc3107a9f9265c3bdea1206570e86f92ac7014 CounterKey = 0486828c4ac92b5507618aec7873a1d4fc6543c5be33cf3078b22ca72437545e10d6d4f052422eb898b737a4b8543ee550 K = 4c69e7feed4b11159adfc16a6047a92572ea44e0740b23af Secret = 0x4a6b78a98ac98fa8e99a8ece08ec0251125f85c6fd0e289b CounterKey = 046700a102437781a9581da2bc25ced5abf419da91d3c803df71396c9cf08bcd91854e3e6e42d8c657ce0f27ab77a9dc4b K = 46072acefd67bff50de355ca7a31fa6be59f26e467587259 Secret = 0xc5a6491d78844d6617ef33be6b8bd54da221450885d5950f CounterKey = 04a82f354cf97bee5d22dc6c079f2902ead44d96a8f614f178a654a9aa8a1a0802f2ce0ee8a0f4ebe96dee1b37464b1ff2 K = ec5580eabca9f3389d2b427ddf6e49e26d629afd03fa766e Secret = 0x2ba2703c5e23f6463c5b88dc37292fabd3399b5e1fb67c05 CounterKey = 043cec21b28668a12a2cf78e1a8e55d0efe065152fffc347181029557beba4ff1992bd21c23cb4825f6dae70e3318fd1ca K = 7f3929dd3cbf7673bc30d859d90b880307475f800660ea32 Secret = 0x836118c6248f882e9147976f764826c1a28755a6102977d5 CounterKey = 047082644715b8b731f8228b5118e7270d34d181f361a221fc464649d6c88ca89614488a1cc7b8442bb42f9fb3020a3d76 K = 72e88f3ea67d46d46dbf83926e7e2a6b85b54536741e6d2c [secp224r1] Secret = 0x8346a60fc6f293ca5a0d2af68ba71d1dd389e5e40837942df3e43cbd CounterKey = 04af33cd0629bc7e996320a3f40368f74de8704fa37b8fab69abaae280882092ccbba7930f419a8a4f9bb16978bbc3838729992559a6f2e2d7 K = 7d96f9a3bd3c05cf5cc37feb8b9d5209d5c2597464dec3e9983743e8 Secret = 0x043cb216f4b72cdf7629d63720a54aee0c99eb32d74477dac0c2f73d CounterKey = 0413bfcd4f8e9442393cab8fb46b9f0566c226b22b37076976f0617a46eeb2427529b288c63c2f8963c1e473df2fca6caa90d52e2f8db56dd4 K = ee93ce06b89ff72009e858c68eb708e7bc79ee0300f73bed69bbca09 Secret = 0x5ad0dd6dbabb4f3c2ea5fe32e561b2ca55081486df2c7c15c9622b08 CounterKey = 04756dd806b9d9c34d899691ecb45b771af468ec004486a0fdd283411e4d02c2ca617bb2c5d9613f25dd72413d229fd2901513aa29504eeefb K = 3fcc01e34d4449da2a974b23fc36f9566754259d39149790cfa1ebd3 Secret = 0x0aa6ff55a5d820efcb4e7d10b845ea3c9f9bc5dff86106db85318e22 CounterKey = 040f537bf1c1122c55656d25e8aa8417e0b44b1526ae0523144f9921c4f79b26d30e491a773696cc2c79b4f0596bc5b9eebaf394d162fb8684 K = 49129628b23afcef48139a3f6f59ff5e9811aa746aa4ff33c24bb940 Secret = 0xefe6e6e25affaf54c98d002abbc6328da159405a1b752e32dc23950a CounterKey = 042b3631d2b06179b3174a100f7f57131eeea8947be0786c3dc64b223983de29ae3dad31adc0236c6de7f14561ca2ea083c5270c78a2e6cbc0 K = fcdc69a40501d308a6839653a8f04309ec00233949522902ffa5eac6 Secret = 0x61cb2932524001e5e9eeed6df7d9c8935ee3322029edd7aa8acbfd51 CounterKey = 044511403de29059f69a475c5a6a5f6cabed5d9f014436a8cb70a023387d2d1b62aa046df9340f9c37a087a06b32cf7f08a223f992812a828b K = 827e9025cb62e0e837c596063f3b9b5a0f7afd8d8783200086d61ec1 Secret = 0x8c7ace347171f92def98d845475fc82e1d1496da81ee58f505b985fa CounterKey = 04314a0b26dd31c248845d7cc17b61cad4608259bed85a58d1f1ffd37866e4b350352e119eecada382907f3619fd748ea73ae4899dfd496302 K = 335ba51228d94acbed851ca7821c801d5cb1c7975d7aa90a7159f8fa Secret = 0x382feb9b9ba10f189d99e71a89cdfe44cb554cec13a212840977fb68 CounterKey = 04abe6843beec2fd9e5fb64730d0be4d165438ce922ed75dd80b4603e56afe8673a96c4ba9900ad85995e631e436c6cc88a2c2b47b7c4886b8 K = 8c2e627594206b34f7356d3426eb3d79f518ef843fbe94014cceace3 Secret = 0xe0d62035101ef487c485c60fb4500eebe6a32ec64dbe97dbe0232c46 CounterKey = 0413cf9d6d2c9aae8274c27d446afd0c888ffdd52ae299a35984d4f527dcbee75b515751f8ee2ae355e8afd5de21c62a939a6507b538cbc4af K = 632abb662728dbc994508873d5c527ca5ef923c0d31fa6c47ef4c825 Secret = 0xb96ade5b73ba72aa8b6e4d74d7bf9c58e962ff78eb542287c7b44ba2 CounterKey = 04965b637c0dfbc0cf954035686d70f7ec30929e664e521dbaa228065982a58ff61bc90019bbcbb5875d3863db0bc2a1fa34b0ad4de1a83f99 K = 34641141aab05ef58bd376d609345901fb8f63477c6be9097f037f1f Secret = 0xa40d7e12049c71e6522c7ff2384224061c3a457058b310557655b854 CounterKey = 0473cc645372ca2e71637cda943d8148f3382ab6dd0f2e1a49da94e134df5c355c23e6e232ebc3bee2ab1873ee0d83e3382f8e6fe613f6343c K = 4f74ac8507501a32bfc5a78d8271c200e835966e187e8d00011a8c75 Secret = 0xad2519bc724d484e02a69f05149bb047714bf0f5986fac2e222cd946 CounterKey = 04546578216250354e449e21546dd11cd1c5174236739acad9ce0f4512d2a22fcd66d1abedc767668327c5cb9c599043276239cf3c8516af24 K = ad09c9ae4d2324ea81bb555b200d3c003e22a6870ee03b52df49e4de Secret = 0x3d312a9b9d8ed09140900bbac1e095527ebc9e3c6493bcf3666e3a29 CounterKey = 041d46b1dc3a28123cb51346e67baec56404868678faf7d0e8b2afa22a0ec9e65ec97e218373e7fc115c2274d5b829a60d93f71e01d58136c3 K = ef029c28c68064b8abd2965a38c404fb5e944ace57e8638daba9d3cd Secret = 0x8ce0822dc24c153995755ac350737ef506641c7d752b4f9300c612ed CounterKey = 04266d038cc7a4fe21f6c976318e827b82bb5b8f7443a55298136506e0df123d98a7a20bbdf3943df2e3563422f8c0cf74d53aaabdd7c973ba K = f83c16661dfcbad021cc3b5a5af51d9a18db4653866b3ff90787ce3e Secret = 0x0ff9b485325ab77f29e7bc379fed74bfac859482da0dee7528c19db2 CounterKey = 04eb0a09f7a1c236a61f595809ec5670efd92e4598d5e613e092cdfdca50787ae2f2f15b88bc10f7b5f0aee1418373f16153aebd1fba54288d K = f51258c63f232e55a66aa25ebd597b2018d1052c02eeb63866758005 Secret = 0x19cf5ff6306467f28b9fe0675a43c0582552c8c12e59ce7c38f292b1 CounterKey = 046b2f6b18a587f562ffc61bd9b0047322286986a78f1fd139b84f7c247096908e4615266be59a53cd655515056ff92370a6271a5d3823d704 K = 7fdc969a186ff18429f2a276dac43beea21182d82ce2e5a0876552b1 Secret = 0x90a15368e3532c0b1e51e55d139447c2c89bc160719d697291ea7c14 CounterKey = 04328101ba826acd75ff9f34d5574ce0dbc92f709bad8d7a33c47940c1df39f1ea88488c55d5538160878b9ced18a887ea261dd712d14024ff K = 3d60ab6db2b3ffe2d29ccff46d056e54230cf34982e241556ed2920c Secret = 0x8e0838e05e1721491067e1cabc2e8051b290e2616eec427b7121897d CounterKey = 040081e34270871e2ebbd94183f617b4ae15f0416dd634fe6e934cf3c03a1e9f38a7b90b7317d26b9f6311063ab58b268cf489b2e50386d5d6 K = 9116d72786f4db5df7a8b43078c6ab9160d423513d35ea5e2559306d Secret = 0x38106e93f16a381adb1d72cee3da66ae462ad4bbfea9ecdf35d0814e CounterKey = 042623632fdf0bd856805a69aa186d4133ef5904e1f655a972d66cce072cef9728dd06fb8b50150f529b695076d4507983912585c89bd0682e K = 207c53dcefac789aaa0276d9200b3a940ce5f2296f4cb2e81a185d3d Secret = 0xe5d1718431cf50f6cbd1bc8019fa16762dfa12c989e5999977fb4ea2 CounterKey = 048ee4d1dcc31dee4bf6fe21ca8a587721d910acfb122c16c2a77a81524ebf323fff04eb477069a0ac68b345f6b1ae134efc31940e513cb99f K = 10e467da34f48ad7072005bccd6da1b2ba3f71eafa1c393842f91d74 Secret = 0x3d635691b62a9a927c633951c9369c8862bd2119d30970c2644727d6 CounterKey = 0497dcbe6d28335882a6d193cc54a1063dd0775dc328565300bb99e691dad11dd5ece8cfd9f97c9a526e4a1506e6355969ee87826fc38bcd24 K = 82fd2f9c60c4f999ac00bbe64bfc11da8ff8cda2e499fced65230bb1 Secret = 0xacf3c85bbdc379f02f5ea36e7f0f53095a9e7046a28685a8659bf798 CounterKey = 04ce9126dd53972dea1de1d11efef900de34b661859c4648c5c0e534f7e113b6f2c1659d07f2716e64a83c18bbce344dd2121fe85168eae085 K = 530f7e7fc932613b29c981f261cb036cba3f1df3864e0e1cba2685a2 Secret = 0xcffd62cb00a0e3163fbf2c397fadc9618210f86b4f54a675287305f0 CounterKey = 0484419967d6cfad41e75a02b6da605a97949a183a97c306c4b46e66a55cc9b259718b1bc8b144fde633a894616ffd59a3a6d5d8e942c7cbb7 K = 49f6fd0139248ef4df2db05d1319bd5b1489e249827a45a8a5f12427 Secret = 0x85f903e43943d13c68932e710e80de52cbc0b8f1a1418ea4da079299 CounterKey = 047c9cac35768063c2827f60a7f51388f2a8f4b7f8cd736bd6bc33747729ee6b849c6025d577dbcc55fbd17018f4edbc2ef105b004d6257bcd K = 8f7e34e597ae8093b98270a74a8dfcdbed457f42f43df487c5487161 Secret = 0xcce64891a3d0129fee0d4a96cfbe7ac470b85e967529057cfa31a1d9 CounterKey = 04085a7642ad8e59b1a3e8726a7547afbecffdac1dab7e57230c6a9df4f91c36d881fe9b8047a3530713554a1af4c25c5a8e654dcdcf689f2e K = 71954e2261e8510be1a060733671d2e9d0a2d012eb4e09556d697d2a [secp256r1] Secret = 0x7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534 CounterKey = 04700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac K = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b Secret = 0x38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5 CounterKey = 04809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7aeb29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3 K = 057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67 Secret = 0x1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8 CounterKey = 04a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536 K = 2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec Secret = 0x207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d CounterKey = 04df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4 K = 96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024 Secret = 0x59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf CounterKey = 0441192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb9221af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328 K = 19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62 Secret = 0xf5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef CounterKey = 0433e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f K = 664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3 Secret = 0x3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190 CounterKey = 046a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba740f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05 K = ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d Secret = 0xd8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8 CounterKey = 04a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bbf6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229 K = 35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489 Secret = 0x0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d CounterKey = 0494e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a K = 605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4 Secret = 0x2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08 CounterKey = 04e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274fd9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5 K = f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b Secret = 0x77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848 CounterKey = 04f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff0165833bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c K = 8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3 Secret = 0x42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e CounterKey = 042db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e K = 72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a Secret = 0xceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b CounterKey = 04cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecbc3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4 K = e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307 Secret = 0x43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604 CounterKey = 0415b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77 K = ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96 Secret = 0xb2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903 CounterKey = 0449c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa18af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924 K = bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf Secret = 0x4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8 CounterKey = 0419b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae K = 9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343 Secret = 0x4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147 CounterKey = 042c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b0999546cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0 K = 3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78 Secret = 0x1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e CounterKey = 04a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03 K = 1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f Secret = 0xdd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3 CounterKey = 04a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a K = 430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c Secret = 0x5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76 CounterKey = 04ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01fe9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38 K = 1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3 Secret = 0xb601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d CounterKey = 04c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4ebf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051 K = 4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660 Secret = 0xfefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535 CounterKey = 04317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb609420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae K = 30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0 Secret = 0x334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce CounterKey = 0445fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb15c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321 K = 2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c Secret = 0x2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d CounterKey = 04a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef K = 2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b Secret = 0x85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0 CounterKey = 04356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92 K = 1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857 [secp384r1] Secret = 0x3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1 CounterKey = 04a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a K = 5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1 Secret = 0x92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783 CounterKey = 0430f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e025e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757 K = a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff Secret = 0x12cf6a223a72352543830f3f18530d5cb37f26880a0b294482c8a8ef8afad09aa78b7dc2f2789a78c66af5d1cc553853 CounterKey = 041aefbfa2c6c8c855a1a216774550b79a24cda37607bb1f7cc906650ee4b3816d68f6a9c75da6e4242cebfb6652f65180419d28b723ebadb7658fcebb9ad9b7adea674f1da3dc6b6397b55da0f61a3eddacb4acdb14441cb214b04a0844c02fa3 K = 3d2e640f350805eed1ff43b40a72b2abed0a518bcebe8f2d15b111b6773223da3c3489121db173d414b5bd5ad7153435 Secret = 0x8dd48063a3a058c334b5cc7a4ce07d02e5ee6d8f1f3c51a1600962cbab462690ae3cd974fb39e40b0e843daa0fd32de1 CounterKey = 048bc089326ec55b9cf59b34f0eb754d93596ca290fcb3444c83d4de3a5607037ec397683f8cef07eab2fe357eae36c449d9d16ce8ac85b3f1e94568521aae534e67139e310ec72693526aa2e927b5b322c95a1a033c229cb6770c957cd3148dd7 K = 6a42cfc392aba0bfd3d17b7ccf062b91fc09bbf3417612d02a90bdde62ae40c54bb2e56e167d6b70db670097eb8db854 Secret = 0x84ece6cc3429309bd5b23e959793ed2b111ec5cb43b6c18085fcaea9efa0685d98a6262ee0d330ee250bc8a67d0e733f CounterKey = 04eb952e2d9ac0c20c6cc48fb225c2ad154f53c8750b003fd3b4ed8ed1dc0defac61bcdde02a2bcfee7067d75d342ed2b0f1828205baece82d1b267d0d7ff2f9c9e15b69a72df47058a97f3891005d1fb38858f5603de840e591dfa4f6e7d489e1 K = ce7ba454d4412729a32bb833a2d1fd2ae612d4667c3a900e069214818613447df8c611de66da200db7c375cf913e4405 Secret = 0x68fce2121dc3a1e37b10f1dde309f9e2e18fac47cd1770951451c3484cdb77cb136d00e731260597cc2859601c01a25b CounterKey = 04441d029e244eb7168d647d4df50db5f4e4974ab3fdaf022aff058b3695d0b8c814cc88da6285dc6df1ac55c553885003e8025ac23a41d4b1ea2aa46c50c6e479946b59b6d76497cd9249977e0bfe4a6262622f13d42a3c43d66bdbb30403c345 K = ba69f0acdf3e1ca95caaac4ecaf475bbe51b54777efce01ca381f45370e486fe87f9f419b150c61e329a286d1aa265ec Secret = 0xb1764c54897e7aae6de9e7751f2f37de849291f88f0f91093155b858d1cc32a3a87980f706b86cc83f927bdfdbeae0bd CounterKey = 043d4e6bf08a73404accc1629873468e4269e82d90d832e58ad72142639b5a056ad8d35c66c60e8149fac0c797bceb7c2f9b0308dc7f0e6d29f8c277acbc65a21e5adb83d11e6873bc0a07fda0997f482504602f59e10bc5cb476b83d0a4f75e71 K = 1a6688ee1d6e59865d8e3ada37781d36bb0c2717eef92e61964d3927cb765c2965ea80f7f63e58c322ba0397faeaf62b Secret = 0xf0f7a96e70d98fd5a30ad6406cf56eb5b72a510e9f192f50e1f84524dbf3d2439f7287bb36f5aa912a79deaab4adea82 CounterKey = 04f5f6bef1d110da03be0017eac760cc34b24d092f736f237bc7054b3865312a813bcb62d297fb10a4f7abf54708fe2d3d06fdf8d7dc032f4e10010bf19cbf6159321252ff415fb91920d438f24e67e60c2eb0463204679fa356af44cea9c9ebf5 K = d06a568bf2336b90cbac325161be7695eacb2295f599500d787f072612aca313ee5d874f807ddef6c1f023fe2b6e7cd0 Secret = 0x9efb87ddc61d43c482ba66e1b143aef678fbd0d1bebc2000941fabe677fe5b706bf78fce36d100b17cc787ead74bbca2 CounterKey = 047cdec77e0737ea37c67b89b7137fe38818010f4464438ee4d1d35a0c488cad3fde2f37d00885d36d3b795b9f93d23a6728c42ee8d6027c56cf979ba4c229fdb01d234944f8ac433650112c3cf0f02844e888a3569dfef7828a8a884589aa055e K = bb3b1eda9c6560d82ff5bee403339f1e80342338a991344853b56b24f109a4d94b92f654f0425edd4c205903d7586104 Secret = 0xd787a57fde22ec656a0a525cf3c738b30d73af61e743ea90893ecb2d7b622add2f94ee25c2171467afb093f3f84d0018 CounterKey = 048eeea3a319c8df99fbc29cb55f243a720d95509515ee5cc587a5c5ae22fbbd009e626db3e911def0b99a4f7ae304b1ba73877dc94db9adddc0d9a4b24e8976c22d73c844370e1ee857f8d1b129a3bd5f63f40caf3bd0533e38a5f5777074ff9e K = 1e97b60add7cb35c7403dd884c0a75795b7683fff8b49f9d8672a8206bfdcf0a106b8768f983258c74167422e44e4d14 Secret = 0x83d70f7b164d9f4c227c767046b20eb34dfc778f5387e32e834b1e6daec20edb8ca5bb4192093f543b68e6aeb7ce788b CounterKey = 04a721f6a2d4527411834b13d4d3a33c29beb83ab7682465c6cbaf6624aca6ea58c30eb0f29dd842886695400d7254f20f14ba6e26355109ad35129366d5e3a640ae798505a7fa55a96a36b5dad33de00474f6670f522214dd7952140ab0a7eb68 K = 1023478840e54775bfc69293a3cf97f5bc914726455c66538eb5623e218feef7df4befa23e09d77145ad577db32b41f9 Secret = 0x8f558e05818b88ed383d5fca962e53413db1a0e4637eda194f761944cbea114ab9d5da175a7d57882550b0e432f395a9 CounterKey = 04d882a8505c2d5cb9b8851fc676677bb0087681ad53faceba1738286b45827561e7da37b880276c656cfc38b32ade847e34b314bdc134575654573cffaf40445da2e6aaf987f7e913cd4c3091523058984a25d8f21da8326192456c6a0fa5f60c K = 6ad6b9dc8a6cf0d3691c501cbb967867f6e4bbb764b60dbff8fcff3ed42dbba39d63cf325b4b4078858495ddee75f954 Secret = 0x0f5dee0affa7bbf239d5dff32987ebb7cf84fcceed643e1d3c62d0b3352aec23b6e5ac7fa4105c8cb26126ad2d1892cb CounterKey = 04815c9d773dbf5fb6a1b86799966247f4006a23c92e68c55e9eaa998b17d8832dd4d84d927d831d4f68dac67c6488219fe79269948b2611484560fd490feec887cb55ef99a4b524880fa7499d6a07283aae2afa33feab97deca40bc606c4d8764 K = cc9e063566d46b357b3fcae21827377331e5e290a36e60cd7c39102b828ae0b918dc5a02216b07fe6f1958d834e42437 Secret = 0x037b633b5b8ba857c0fc85656868232e2febf59578718391b81da8541a00bfe53c30ae04151847f27499f8d7abad8cf4 CounterKey = 041c0eeda7a2be000c5bdcda0478aed4db733d2a9e341224379123ad847030f29e3b168fa18e89a3c0fba2a6ce1c28fc3bec8c1c83c118c4dbea94271869f2d868eb65e8b44e21e6f14b0f4d9b38c068daefa27114255b9a41d084cc4a1ad85456 K = deff7f03bd09865baf945e73edff6d5122c03fb561db87dec8662e09bed4340b28a9efe118337bb7d3d4f7f568635ff9 Secret = 0xe3d07106bedcc096e7d91630ffd3094df2c7859db8d7edbb2e37b4ac47f429a637d06a67d2fba33838764ef203464991 CounterKey = 04c95c185e256bf997f30b311548ae7f768a38dee43eeeef43083f3077be70e2bf39ac1d4daf360c514c8c6be623443d1a3e63a663eaf75d8a765ab2b9a35513d7933fa5e26420a5244550ec6c3b6f033b96db2aca3d6ac6aab052ce929595aea5 K = c8b1038f735ad3bb3e4637c3e47eab487637911a6b7950a4e461948329d3923b969e5db663675623611a457fcda35a71 Secret = 0xf3f9b0c65a49a506632c8a45b10f66b5316f9eeb06fae218f2da62333f99905117b141c760e8974efc4af10570635791 CounterKey = 043497238a7e6ad166df2dac039aa4dac8d17aa925e7c7631eb3b56e3aaa1c545fcd54d2e5985807910fb202b1fc191d2aa49e5c487dcc7aa40a8f234c979446040d9174e3ad357d404d7765183195aed3f913641b90c81a306ebf0d8913861316 K = d337eaa32b9f716b8747b005b97a553c59dab0c51df41a2d49039cdae705aa75c7b9e7bc0b6a0e8c578c902bc4fff23e Secret = 0x59fce7fad7de28bac0230690c95710c720e528f9a4e54d3a6a8cd5fc5c5f21637031ce1c5b4e3d39647d8dcb9b794664 CounterKey = 0490a34737d45b1aa65f74e0bd0659bc118f8e4b774b761944ffa6573c6df4f41dec0d11b697abd934d390871d4b4532409b590719bb3307c149a7817be355d684893a307764b512eeffe07cb699edb5a6ffbf8d6032e6c79d5e93e94212c2aa4e K = 32d292b695a4488e42a7b7922e1ae537d76a3d21a0b2e36875f60e9f6d3e8779c2afb3a413b9dd79ae18e70b47d337c1 Secret = 0x3e49fbf950a424c5d80228dc4bc35e9f6c6c0c1d04440998da0a609a877575dbe437d6a5cedaa2ddd2a1a17fd112aded CounterKey = 04dda546acfc8f903d11e2e3920669636d44b2068aeb66ff07aa266f0030e1535b0ed0203cb8a460ac990f1394faf22f1d15bbb2597913035faadf413476f4c70f7279769a40c986f470c427b4ee4962abdf8173bbad81874772925fd32f0b159f K = 1220e7e6cad7b25df98e5bbdcc6c0b65ca6c2a50c5ff6c41dca71e475646fd489615979ca92fb4389aeadefde79a24f1 Secret = 0x50ccc1f7076e92f4638e85f2db98e0b483e6e2204c92bdd440a6deea04e37a07c6e72791c190ad4e4e86e01efba84269 CounterKey = 04788be2336c52f4454d63ee944b1e49bfb619a08371048e6da92e584eae70bde1f171c4df378bd1f3c0ab03048a2378024673ebd8db604eaf41711748bab2968a23ca4476ce144e728247f08af752929157b5830f1e26067466bdfa8b65145a33 K = 793bb9cd22a93cf468faf804a38d12b78cb12189ec679ddd2e9aa21fa9a5a0b049ab16a23574fe04c1c3c02343b91beb Secret = 0x06f132b71f74d87bf99857e1e4350a594e5fe35533b888552ceccbc0d8923c902e36141d7691e28631b8bc9bafe5e064 CounterKey = 04d09bb822eb99e38060954747c82bb3278cf96bbf36fece3400f4c873838a40c135eb3babb9293bd1001bf3ecdee7bf26d416db6e1b87bbb7427788a3b6c7a7ab2c165b1e366f9608df512037584f213a648d47f16ac326e19aae972f63fd76c9 K = 012d191cf7404a523678c6fc075de8285b243720a903047708bb33e501e0dbee5bcc40d7c3ef6c6da39ea24d830da1e8 Secret = 0x12048ebb4331ec19a1e23f1a2c773b664ccfe90a28bfb846fc12f81dff44b7443c77647164bf1e9e67fd2c07a6766241 CounterKey = 0413741262ede5861dad71063dfd204b91ea1d3b7c631df68eb949969527d79a1dc59295ef7d2bca6743e8cd77b04d1b580baaeadc7e19d74a8a04451a135f1be1b02fe299f9dc00bfdf201e83d995c6950bcc1cb89d6f7b30bf54656b9a4da586 K = ad0fd3ddffe8884b9263f3c15fe1f07f2a5a22ffdc7e967085eea45f0cd959f20f18f522763e28bcc925e496a52dda98 Secret = 0x34d61a699ca576169fcdc0cc7e44e4e1221db0fe63d16850c8104029f7d48449714b9884328cae189978754ab460b486 CounterKey = 049e22cbc18657f516a864b37b783348b66f1aa9626cd631f4fa1bd32ad88cf11db52057c660860d39d11fbf024fabd4446b0d53c79681c28116df71e9cee74fd56c8b7f04b39f1198cc72284e98be9562e35926fb4f48a9fbecafe729309e8b6f K = dc4ca392dc15e20185f2c6a8ea5ec31dfc96f56153a47394b3072b13d0015f5d4ae13beb3bed54d65848f9b8383e6c95 Secret = 0xdc60fa8736d702135ff16aab992bb88eac397f5972456c72ec447374d0d8ce61153831bfc86ad5a6eb5b60bfb96a862c CounterKey = 042db5da5f940eaa884f4db5ec2139b0469f38e4e6fbbcc52df15c0f7cf7fcb1808c749764b6be85d2fdc5b16f58ad5dc022e8b02dcf33e1b5a083849545f84ad5e43f77cb71546dbbac0d11bdb2ee202e9d3872e8d028c08990746c5e1dde9989 K = d765b208112d2b9ed5ad10c4046e2e3b0dbf57c469329519e239ac28b25c7d852bf757d5de0ee271cadd021d86cfd347 Secret = 0x6fa6a1c704730987aa634b0516a826aba8c6d6411d3a4c89772d7a62610256a2e2f289f5c3440b0ec1e70fa339e251ce CounterKey = 04329647baa354224eb4414829c5368c82d7893b39804e08cbb2180f459befc4b347a389a70c91a23bd9d30c83be5295d3cc8f61923fad2aa8e505d6cfa126b9fabd5af9dce290b75660ef06d1caa73681d06089c33bc4246b3aa30dbcd2435b12 K = d3778850aeb58804fbe9dfe6f38b9fa8e20c2ca4e0dec335aafceca0333e3f2490b53c0c1a14a831ba37c4b9d74be0f2 Secret = 0x74ad8386c1cb2ca0fcdeb31e0869bb3f48c036afe2ef110ca302bc8b910f621c9fcc54cec32bb89ec7caa84c7b8e54a8 CounterKey = 0429d8a36d22200a75b7aea1bb47cdfcb1b7fd66de967041434728ab5d533a060df732130600fe6f75852a871fb2938e39e19b53db528395de897a45108967715eb8cb55c3fcbf23379372c0873a058d57544b102ecce722b2ccabb1a603774fd5 K = 81e1e71575bb4505498de097350186430a6242fa6c57b85a5f984a23371123d2d1424eefbf804258392bc723e4ef1e35 [secp521r1] Secret = 0x017eecc07ab4b329068fba65e56a1f8890aa935e57134ae0ffcce802735151f4eac6564f6ee9974c5e6887a1fefee5743ae2241bfeb95d5ce31ddcb6f9edb4d6fc47 CounterKey = 0400685a48e86c79f0f0875f7bc18d25eb5fc8c0b07e5da4f4370f3a9490340854334b1e1b87fa395464c60626124a4e70d0f785601d37c09870ebf176666877a2046d01ba52c56fc8776d9e8f5db4f0cc27636d0b741bbe05400697942e80b739884a83bde99e0f6716939e632bc8986fa18dccd443a348b6c3e522497955a4f3c302f676 K = 005fc70477c3e63bc3954bd0df3ea0d1f41ee21746ed95fc5e1fdf90930d5e136672d72cc770742d1711c3c3a4c334a0ad9759436a4d3c5bf6e74b9578fac148c831 Secret = 0x00816f19c1fb10ef94d4a1d81c156ec3d1de08b66761f03f06ee4bb9dcebbbfe1eaa1ed49a6a990838d8ed318c14d74cc872f95d05d07ad50f621ceb620cd905cfb8 CounterKey = 0401df277c152108349bc34d539ee0cf06b24f5d3500677b4445453ccc21409453aafb8a72a0be9ebe54d12270aa51b3ab7f316aa5e74a951c5e53f74cd95fc29aee7a013d52f33a9f3c14384d1587fa8abe7aed74bc33749ad9c570b471776422c7d4505d9b0a96b3bfac041e4c6a6990ae7f700e5b4a6640229112deafa0cd8bb0d089b0 K = 000b3920ac830ade812c8f96805da2236e002acbbf13596a9ab254d44d0e91b6255ebf1229f366fb5a05c5884ef46032c26d42189273ca4efa4c3db6bd12a6853759 Secret = 0x012f2e0c6d9e9d117ceb9723bced02eb3d4eebf5feeaf8ee0113ccd8057b13ddd416e0b74280c2d0ba8ed291c443bc1b141caf8afb3a71f97f57c225c03e1e4d42b0 CounterKey = 040092db3142564d27a5f0006f819908fba1b85038a5bc2509906a497daac67fd7aee0fc2daba4e4334eeaef0e0019204b471cd88024f82115d8149cc0cf4f7ce1a4d5016bad0623f517b158d9881841d2571efbad63f85cbe2e581960c5d670601a6760272675a548996217e4ab2b8ebce31d71fca63fcc3c08e91c1d8edd91cf6fe845f8 K = 006b380a6e95679277cfee4e8353bf96ef2a1ebdd060749f2f046fe571053740bbcc9a0b55790bc9ab56c3208aa05ddf746a10a3ad694daae00d980d944aabc6a08f Secret = 0x00e548a79d8b05f923b9825d11b656f222e8cb98b0f89de1d317184dc5a698f7c71161ee7dc11cd31f4f4f8ae3a981e1a3e78bdebb97d7c204b9261b4ef92e0918e0 CounterKey = 0400fdd40d9e9d974027cb3bae682162eac1328ad61bc4353c45bf5afe76bf607d2894c8cce23695d920f2464fda4773d4693be4b3773584691bdb0329b7f4c86cc2990034ceac6a3fef1c3e1c494bfe8d872b183832219a7e14da414d4e3474573671ec19b033be831b915435905925b44947c592959945b4eb7c951c3b9c8cf52530ba23 K = 00fbbcd0b8d05331fef6086f22a6cce4d35724ab7a2f49dd8458d0bfd57a0b8b70f246c17c4468c076874b0dff7a0336823b19e98bf1cec05e4beffb0591f97713c6 Secret = 0x01c8aae94bb10b8ca4f7be577b4fb32bb2381032c4942c24fc2d753e7cc5e47b483389d9f3b956d20ee9001b1eef9f23545f72c5602140046839e963313c3decc864 CounterKey = 040098d99dee0816550e84dbfced7e88137fddcf581a725a455021115fe49f8dc3cf233cd9ea0e6f039dc7919da973cdceaca205da39e0bd98c8062536c47f258f44b500cd225c8797371be0c4297d2b457740100c774141d8f214c23b61aa2b6cd4806b9b70722aa4965fb622f42b7391e27e5ec21c5679c5b06b59127372997d421adc1e K = 0145cfa38f25943516c96a5fd4bfebb2f645d10520117aa51971eff442808a23b4e23c187e639ff928c3725fbd1c0c2ad0d4aeb207bc1a6fb6cb6d467888dc044b3c Secret = 0x009b0af137c9696c75b7e6df7b73156bb2d45f482e5a4217324f478b10ceb76af09724cf86afa316e7f89918d31d54824a5c33107a483c15c15b96edc661340b1c0e CounterKey = 04007ae115adaaf041691ab6b7fb8c921f99d8ed32d283d67084e80b9ad9c40c56cd98389fb0a849d9ecf7268c297b6f93406119f40e32b5773ed25a28a9a85c4a758801a28e004e37eeaefe1f4dbb71f1878696141af3a10a9691c4ed93487214643b761fa4b0fbeeb247cf6d3fba7a60697536ad03f49b80a9d1cb079673654977c5fa94 K = 005c5721e96c273319fd60ecc46b5962f698e974b429f28fe6962f4ac656be2eb8674c4aafc037eab48ece612953b1e8d861016b6ad0c79805784c67f73ada96f351 Secret = 0x01e48faacee6dec83ffcde944cf6bdf4ce4bae72747888ebafee455b1e91584971efb49127976a52f4142952f7c207ec0265f2b718cf3ead96ea4f62c752e4f7acd3 CounterKey = 04012588115e6f7f7bdcfdf57f03b169b479758baafdaf569d04135987b2ce6164c02a57685eb5276b5dae6295d3fe90620f38b5535c6d2260c173e61eb888ca92020301542c169cf97c2596fe2ddd848a222e367c5f7e6267ebc1bcd9ab5dcf49158f1a48e4af29a897b7e6a82091c2db874d8e7abf0f58064691344154f396dbaed188b6 K = 01736d9717429b4f412e903febe2f9e0fffd81355d6ce2c06ff3f66a3be15ceec6e65e308347593f00d7f33591da4043c30763d72749f72cdceebe825e4b34ecd570 Secret = 0x00c29aa223ea8d64b4a1eda27f39d3bc98ea0148dd98c1cbe595f8fd2bfbde119c9e017a50f5d1fc121c08c1cef31b758859556eb3e0e042d8dd6aaac57a05ca61e3 CounterKey = 040169491d55bd09049fdf4c2a53a660480fee4c03a0538675d1cd09b5bba78dac48543ef118a1173b3fbf8b20e39ce0e6b890a163c50f9645b3d21d1cbb3b60a6fff40083494b2eba76910fed33c761804515011fab50e3b377abd8a8a045d886d2238d2c268ac1b6ec88bd71b7ba78e2c33c152e4bf7da5d565e4acbecf5e92c7ad662bb K = 018f2ae9476c771726a77780208dedfefa205488996b18fecc50bfd4c132753f5766b2cd744afa9918606de2e016effc63622e9029e76dc6e3f0c69f7aeced565c2c Secret = 0x0028692be2bf5c4b48939846fb3d5bce74654bb2646e15f8389e23708a1afadf561511ea0d9957d0b53453819d60fba8f65a18f7b29df021b1bb01cd163293acc3cc CounterKey = 04008415f5bbd0eee387d6c09d0ef8acaf29c66db45d6ba101860ae45d3c60e1e0e3f7247a4626a60fdd404965c3566c79f6449e856ce0bf94619f97da8da24bd2cfb600fdd7c59c58c361bc50a7a5d0d36f723b17c4f2ad2b03c24d42dc50f74a8c465a0afc4683f10fab84652dfe9e928c2626b5456453e1573ff60be1507467d431fbb2 K = 0105a346988b92ed8c7a25ce4d79d21bc86cfcc7f99c6cd19dbb4a39f48ab943b79e4f0647348da0b80bd864b85c6b8d92536d6aa544dc7537a00c858f8b66319e25 Secret = 0x01194d1ee613f5366cbc44b504d21a0cf6715e209cd358f2dd5f3e71cc0d67d0e964168c42a084ebda746f9863a86bacffc819f1edf1b8c727ccfb3047240a57c435 CounterKey = 0401c721eea805a5cba29f34ba5758775be0cf6160e6c08723f5ab17bf96a1ff2bd9427961a4f34b07fc0b14ca4b2bf6845debd5a869f124ebfa7aa72fe565050b7f1800b6e89eb0e1dcf181236f7c548fd1a8c16b258b52c1a9bfd3fe8f22841b26763265f074c4ccf2d634ae97b701956f67a11006c52d97197d92f585f5748bc2672eeb K = 004531b3d2c6cd12f21604c8610e6723dbf4daf80b5a459d6ba5814397d1c1f7a21d7c114be964e27376aaebe3a7bc3d6af7a7f8c7befb611afe487ff032921f750f Secret = 0x01fd90e3e416e98aa3f2b6afa7f3bf368e451ad9ca5bd54b5b14aee2ed6723dde5181f5085b68169b09fbec721372ccf6b284713f9a6356b8d560a8ff78ca3737c88 CounterKey = 0401c35823e440a9363ab98d9fc7a7bc0c0532dc7977a79165599bf1a9cc64c00fb387b42cca365286e8430360bfad3643bc31354eda50dc936c329ecdb60905c40fcb00d9e7f433531e44df4f6d514201cbaabb06badd6783e01111726d815531d233c5cdb722893ffbb2027259d594de77438809738120c6f783934f926c3fb69b40c409 K = 0100c8935969077bae0ba89ef0df8161d975ec5870ac811ae7e65ca5394efba4f0633d41bf79ea5e5b9496bbd7aae000b0594baa82ef8f244e6984ae87ae1ed124b7 Secret = 0x009012ecfdadc85ced630afea534cdc8e9d1ab8be5f3753dcf5f2b09b40eda66fc6858549bc36e6f8df55998cfa9a0703aecf6c42799c245011064f530c09db98369 CounterKey = 0400093057fb862f2ad2e82e581baeb3324e7b32946f2ba845a9beeed87d6995f54918ec6619b9931955d5a89d4d74adf1046bb362192f2ef6bd3e3d2d04dd1f87054a00aa3fb2448335f694e3cda4ae0cc71b1b2f2a206fa802d7262f19983c44674fe15327acaac1fa40424c395a6556cb8167312527fae5865ecffc14bbdc17da78cdcf K = 017f36af19303841d13a389d95ec0b801c7f9a679a823146c75c17bc44256e9ad422a4f8b31f14647b2c7d317b933f7c2946c4b8abd1d56d620fab1b5ff1a3adc71f Secret = 0x01b5ff847f8eff20b88cfad42c06e58c3742f2f8f1fdfd64b539ba48c25926926bd5e332b45649c0b184f77255e9d58fe8afa1a6d968e2cb1d4637777120c765c128 CounterKey = 040083192ed0b1cb31f75817794937f66ad91cf74552cd510cedb9fd641310422af5d09f221cad249ee814d16dd7ac84ded9eacdc28340fcfc9c0c06abe30a2fc28cd8002212ed868c9ba0fb2c91e2c39ba93996a3e4ebf45f2852d0928c48930e875cc7b428d0e7f3f4d503e5d60c68cb49b13c2480cd486bed9200caddaddfe4ff8e3562 K = 00062f9fc29ae1a68b2ee0dcf956cbd38c88ae5f645eaa546b00ebe87a7260bf724be20d34b9d02076655c933d056b21e304c24ddb1dedf1dd76de611fc4a2340336 Secret = 0x011a6347d4e801c91923488354cc533e7e35fddf81ff0fb7f56bb0726e0c29ee5dcdc5f394ba54cf57269048aab6e055895c8da24b8b0639a742314390cc04190ed6 CounterKey = 0401a89b636a93e5d2ba6c2292bf23033a84f06a3ac1220ea71e806afbe097a804cc67e9baa514cfb6c12c9194be30212bf7aae7fdf6d376c212f0554e656463ffab7e0182efcaf70fc412d336602e014da47256a0b606f2addcce8053bf817ac8656bb4e42f14c8cbf2a68f488ab35dcdf64056271dee1f606a440ba4bd4e5a11b8b8e54f K = 0128ab09bfec5406799e610f772ba17e892249fa8e0e7b18a04b9197034b250b48294f1867fb9641518f92766066a07a8b917b0e76879e1011e51ccbd9f540c54d4f Secret = 0x0022b6d2a22d71dfaa811d2d9f9f31fbed27f2e1f3d239538ddf3e4cc8c39a330266db25b7bc0a9704f17bde7f3592bf5f1f2d4b56013aacc3d8d1bc02f00d3146cc CounterKey = 04017200b3f16a68cbaed2bf78ba8cddfb6cffac262bba00fbc25f9dc72a07ce59372904899f364c44cb264c097b647d4412bee3e519892d534d9129f8a28f7500fee700baba8d672a4f4a3b63de48b96f56e18df5d68f7d70d5109833f43770d6732e06b39ad60d93e5b43db8789f1ec0aba47286a39ea584235acea757dbf13d53b58364 K = 0101e462e9d9159968f6440e956f11dcf2227ae4aea81667122b6af9239a291eb5d6cf5a4087f358525fcacfa46bb2db01a75af1ba519b2d31da33eda87a9d565748 Secret = 0x005bacfff268acf6553c3c583b464ea36a1d35e2b257a5d49eb3419d5a095087c2fb4d15cf5bf5af816d0f3ff7586490ccd3ddc1a98b39ce63749c6288ce0dbdac7d CounterKey = 04004efd5dbd2f979e3831ce98f82355d6ca14a5757842875882990ab85ab9b7352dd6b9b2f4ea9a1e95c3880d65d1f3602f9ca653dc346fac858658d75626f4d4fb080061cf15dbdaa7f31589c98400373da284506d70c89f074ed262a9e28140796b7236c2eef99016085e71552ff488c72b7339fefb7915c38459cb20ab85aec4e45052 K = 0141d6a4b719ab67eaf04a92c0a41e2dda78f4354fb90bdc35202cc7699b9b04d49616f82255debf7bbec045ae58f982a66905fcfae69d689785e38c868eb4a27e7b Secret = 0x008e2c93c5423876223a637cad367c8589da69a2d0fc68612f31923ae50219df2452e7cc92615b67f17b57ffd2f52b19154bb40d7715336420fde2e89fee244f59dc CounterKey = 040129891de0cf3cf82e8c2cf1bf90bb296fe00ab08ca45bb7892e0e227a504fdd05d2381a4448b68adff9c4153c87eacb78330d8bd52515f9f9a0b58e85f446bb4e10009edd679696d3d1d0ef327f200383253f6413683d9e4fcc87bb35f112c2f110098d15e5701d7ceee416291ff5fed85e687f727388b9afe26a4f6feed560b218e6bb K = 00345e26e0abb1aac12b75f3a9cf41efe1c336396dffa4a067a4c2cfeb878c68b2b045faa4e5b4e6fa4678f5b603c351903b14bf9a6a70c439257199a640890b61d1 Secret = 0x0004d49d39d40d8111bf16d28c5936554326b197353eebbcf47545393bc8d3aaf98f14f5be7074bfb38e6cc97b989754074daddb3045f4e4ce745669fdb3ec0d5fa8 CounterKey = 0401a3c20240e59f5b7a3e17c275d2314ba1741210ad58b71036f8c83cc1f6b0f409dfdd9113e94b67ec39c3291426c23ffcc447054670d2908ff8fe67dc2306034c5c01d2825bfd3af8b1e13205780c137fe938f84fde40188e61ea02cead81badfdb425c29f7d7fb0324debadc10bbb93de68f62c35069268283f5265865db57a79f7bf7 K = 006fe9de6fb8e672e7fd150fdc5e617fabb0d43906354ccfd224757c7276f7a1010091b17ed072074f8d10a5ec971eb35a5cb7076603b7bc38d432cbc059f80f9488 Secret = 0x011a5d1cc79cd2bf73ea106f0e60a5ace220813b53e27b739864334a07c03367efda7a4619fa6eef3a9746492283b3c445610a023a9cc49bf4591140384fca5c8bb5 CounterKey = 04007e2d138f2832e345ae8ff65957e40e5ec7163f016bdf6d24a2243daa631d878a4a16783990c722382130f9e51f0c1bd6ff5ac96780e48b68f5dec95f42e6144bb500b0de5c896791f52886b0f09913e26e78dd0b69798fc4df6d95e3ca708ecbcbcce1c1895f5561bbabaae372e9e67e6e1a3be60e19b470cdf673ec1fc393d3426e20 K = 01e4e759ecedce1013baf73e6fcc0b92451d03bdd50489b78871c333114990c9ba6a9b2fc7b1a2d9a1794c1b60d9279af6f146f0bbfb0683140403bfa4ccdb524a29 Secret = 0x010c908caf1be74c616b625fc8c1f514446a6aec83b5937141d6afbb0a8c7666a7746fa1f7a6664a2123e8cdf6cd8bf836c56d3c0ebdcc980e43a186f938f3a78ae7 CounterKey = 0400118c36022209b1af8ebad1a12b566fc48744576e1199fe80de1cdf851cdf03e5b9091a8f7e079e83b7f827259b691d0c22ee29d6bdf73ec7bbfd746f2cd97a357d00da5ff4904548a342e2e7ba6a1f4ee5f840411a96cf63e6fe622f22c13e614e0a847c11a1ab3f1d12cc850c32e095614ca8f7e2721477b486e9ff40372977c3f65c K = 0163c9191d651039a5fe985a0eea1eba018a40ab1937fcd2b61220820ee8f2302e9799f6edfc3f5174f369d672d377ea8954a8d0c8b851e81a56fda95212a6578f0e Secret = 0x01b37d6b7288de671360425d3e5ac1ccb21815079d8d73431e9b74a6f0e7ae004a357575b11ad66642ce8b775593eba9d98bf25c75ef0b4d3a2098bbc641f59a2b77 CounterKey = 0401780edff1ca1c03cfbe593edc6c049bcb2860294a92c355489d9afb2e702075ade1c953895a456230a0cde905de4a3f38573dbfcccd67ad6e7e93f0b5581e926a5d00a5481962c9162962e7f0ebdec936935d0eaa813e8226d40d7f6119bfd940602380c86721e61db1830f51e139f210000bcec0d8edd39e54d73a9a129f95cd5fa979 K = 015d613e267a36342e0d125cdad643d80d97ed0600afb9e6b9545c9e64a98cc6da7c5aaa3a8da0bdd9dd3b97e9788218a80abafc106ef065c8f1c4e1119ef58d298b Secret = 0x00f2661ac762f60c5fff23be5d969ccd4ec6f98e4e72618d12bdcdb9b4102162333788c0bae59f91cdfc172c7a1681ee44d96ab2135a6e5f3415ebbcd55165b1afb0 CounterKey = 04016dacffa183e5303083a334f765de724ec5ec9402026d4797884a9828a0d321a8cfac74ab737fe20a7d6befcfc73b6a35c1c7b01d373e31abc192d48a4241a35803011e5327cac22d305e7156e559176e19bee7e4f2f59e86f1a9d0b6603b6a7df1069bde6387feb71587b8ffce5b266e1bae86de29378a34e5c74b6724c4d40a719923 K = 014d6082a3b5ced1ab8ca265a8106f302146c4acb8c30bb14a4c991e3c82a9731288bdb91e0e85bda313912d06384fc44f2153fb13506fa9cf43c9aab5750988c943 Secret = 0x00f430ca1261f09681a9282e9e970a9234227b1d5e58d558c3cc6eff44d1bdf53de16ad5ee2b18b92d62fc79586116b0efc15f79340fb7eaf5ce6c44341dcf8dde27 CounterKey = 0400a091421d3703e3b341e9f1e7d58f8cf7bdbd1798d001967b801d1cec27e605c580b2387c1cb464f55ce7ac80334102ab03cfb86d88af76c9f4129c01bedd3bbfc4008c9c577a8e6fc446815e9d40baa66025f15dae285f19eb668ee60ae9c98e7ecdbf2b2a68e22928059f67db188007161d3ecf397e0883f0c4eb7eaf7827a62205cc K = 0020c00747cb8d492fd497e0fec54644bf027d418ab686381f109712a99cabe328b9743d2225836f9ad66e5d7fed1de247e0da92f60d5b31f9e47672e57f710598f4 Secret = 0x005dc33aeda03c2eb233014ee468dff753b72f73b00991043ea353828ae69d4cd0fadeda7bb278b535d7c57406ff2e6e473a5a4ff98e90f90d6dadd25100e8d85666 CounterKey = 04004f38816681771289ce0cb83a5e29a1ab06fc91f786994b23708ff08a08a0f675b809ae99e9f9967eb1a49f196057d69e50d6dedb4dd2d9a81c02bdcc8f7f518460009efb244c8b91087de1eed766500f0e81530752d469256ef79f6b965d8a2232a0c2dbc4e8e1d09214bab38485be6e357c4200d073b52f04e4a16fc6f5247187aecb K = 00c2bfafcd7fbd3e2fd1c750fdea61e70bd4787a7e68468c574ee99ebc47eedef064e8944a73bcb7913dbab5d93dca660d216c553622362794f7a2acc71022bdb16f Secret = 0x00df14b1f1432a7b0fb053965fd8643afee26b2451ecb6a8a53a655d5fbe16e4c64ce8647225eb11e7fdcb23627471dffc5c2523bd2ae89957cba3a57a23933e5a78 CounterKey = 0401a32099b02c0bd85371f60b0dd20890e6c7af048c8179890fda308b359dbbc2b7a832bb8c6526c4af99a7ea3f0b3cb96ae1eb7684132795c478ad6f962e4a6f446d017627357b39e9d7632a1370b3e93c1afb5c851b910eb4ead0c9d387df67cde85003e0e427552f1cd09059aad0262e235cce5fba8cedc4fdc1463da76dcd4b6d1a46 K = 01aaf24e5d47e4080c18c55ea35581cd8da30f1a079565045d2008d51b12d0abb4411cda7a0785b15d149ed301a3697062f42da237aa7f07e0af3fd00eb1800d9c41 [frp256v1] Secret = 0x7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534 CounterKey = 04B6B3D4C356C139EB31183D4749D423958C27D2DCAF98B70164C97A2DD98F5CFF6142E0F7C8B204911F9271F0F3ECEF8C2701C307E8E4C9E183115A1554062CFB K = 13f0a5d81cdacbb52f34834a47747292d2e45282d6afeeca1204e6e3770a0803 Secret = 0x38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5 CounterKey = 04DE681B2898119885373F7EAFDDF94CA0A526794BDC8DA00E0E463860D227575EB1240D67C641B70BE151A6D456C77BE3AF2997F8858D3E07D862E37EBE0A1045 K = 94485a14ec1be67a0b112ced4c909553be4d6e506a4994a39dd10d92bbd1b010 Secret = 0x1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8 CounterKey = 04A13ED122D99792D3CF188FE2C964EADA77A95CE2D03BF3451BBA94DE3E967BACD141A90C972AE0DA909A77BB02B973176238E32431CE8F378E039DEB74989A21 K = d0dc34f3c7788ae000543cdaee667d50bce684957a12cb062c95af2e8de57bc9 Secret = 0x207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d CounterKey = 048A62BAE6BE63CE26B48368BE0B0BCA7CC6FC33B81FD685FD1085EE128F242FE4E548BB18E8E64A4F0B3852962CB58633386C2A79D995C825D434C4B5A727B1B9 K = 13387eee0e51ce0f84f28f339a45c8e8c62214354f04a28714bd4f5fffe474ef Secret = 0x59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf CounterKey = 0432B3881D7C703DB9BF613F52E9C917F096839835C025DC022967BBD1C9886B6B152BF2581D33558431F325E3543EF6EA3BEB58F793669392DAC37FB6D21DEA69 K = 7d89e7b7ff24d8ddba08b88cc7495972cdaa5a53c0df32253d6bbe895a9992f4 Secret = 0xf5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef CounterKey = 04917473C20297D8F46097D95932559BEFD24F7D6E12C95EA8BABB446D0016E3683EC7C0E04474E0F6A26927301E8D82EBB45B36960675119B42726EC10BEAE371 K = 1909e8b5c758243338c4532ecd7a1f3bb7fb5dff03032c018fe91d2c693af985 Secret = 0x3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190 CounterKey = 04C33DF0E273A25BCCDACCDF7BCB4E4A6CCE84A1E3BCFA7E9C8C437759E5CC568ED405E69EC2F0BEA7D242BF4D743DC6AF6E5068EED23FD28975519C6821BF8E8C K = 3b530c6c54547f5a01e9ebcc8baf7cec59db50717aee05aad8e0effe2897737e Secret = 0xd8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8 CounterKey = 044165FC8ABBE27583DB3FBF73A5ABE9D1CDC0CCE74C2E9277000E9C37CF6E6502A9738EF04EADBD7DB923A197DF564B66599FD6CCEFC7C7A61FCFA91F382BC4F2 K = 3f67dc863dd861b84f009064efdffb4510a974411350b8ee948949596584277f Secret = 0x0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d CounterKey = 042F13E149CD81DCB537A6E319F8958AB924D44CB9AF159EFC4815DAB2E8F085CF6F379F283A2BC73C85EA460C8D055845D65E21E6063571B67B8AE4235E03826A K = 7607bc27762d84adb0bb49b7541021ab2fb4530882c90dda763e5b948bf5d425 Secret = 0x2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08 CounterKey = 045A5C7A63CC1B9E39096A23EDBDB910585FA6F243222022C93C80C970869C3ADDBAA2334C228B2FECAF369DBDA74D8580BF0D7332433CC63DFF3E151BC296B43A K = cf84b2ac89be02b0a92dbdbda22a17760f66972a2e02af45bdba493076dfab75 Secret = 0x77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848 CounterKey = 04990FB8C085D200757024A7CFAC7485C58A1C8479395198D364F0C8A0E4C348D9ECD80E63F368508A38865E3EF47FE85CD685B0A4076E080910B13751F03F87B7 K = 5fa05fa24b0a947b7ab64192b39122a4b613aa4525a14a0c87d886347310625f Secret = 0x42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e CounterKey = 0424A6E34FE7900B720B9C7D16D059639259EC84597E4270071E34C8F4CE4AA8F0E70C2FEE8688B24251836F55B268451C6B01D780FD6B1455731A5E6E15F3595E K = d2addc2054a135d90ff08c15c9536bc0b9c6be3ae3d54755eb520d2f47711c93 Secret = 0xceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b CounterKey = 04CDFC5A4D7449DFCEDD07A2ADE38F1395AB8925A48573FE36DD716A4D4405F0A8DB55269DB768F7B843F852AF1719CA940316A20B5760ED9F5ABFD2B22904836E K = 9eb0bbfcb42e26b18656023797a2f29ec3dabbfb0d61517303437785ae8d2d30 Secret = 0x43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604 CounterKey = 04AA4C778DB565B117FDF8B97F6C7D8F5C2BC8FC8EE1D45E83CB2D5F869278EC93372143067F83875C493F2BF8C440DAA551261DDF4219EFAB282E842A6F216A7C K = c1741b1a13f889f22aa04ed0752ce2eb3d8ed274652f1cc4b8f88242090f37ba Secret = 0xb2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903 CounterKey = 04C14A79ED434B7275E929BE94C4EC1B6F422D6FA2D0A1FFBD49BE90E3EB3F8EFE3AB7343D8508A4B25717CB00FFF4F8F72EF6BC2FCD64BFA47D2534AF3944B648 K = 7b23d5214cf03df7c9b466ab18b579becfb860bb59232e73e52c35ba1f92999a Secret = 0x4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8 CounterKey = 04ABF3E2095C8B177E1196962459355C2528D607D1C89052B18491BFC67AE3DB09CDF69F0E228FFE33AF198684EA875DE343ED920E963E9F0BAC5DC96F67B8132B K = 8e5257b71f3d5c9503ed89ae829a6d7ec0227913d24ff58db1729f66db8cd72e Secret = 0x4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147 CounterKey = 049259B53230E01F074F99A1F4A66008B8F60B68676F413D41F9C04222E41EB5C05DFCF8487290353C483B51ABE397670D1A1F8960A127E7433F28E79BEE22CBA1 K = 6968a87c80e9a286057618af02f4f0563e63b6411277be7888865ea11c937bd0 Secret = 0x1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e CounterKey = 04D84EC698A661149A2BDAFAC95546FADF8B886605CDEAC1F65212F06454BE694032C3841C5A304BE2348097C85C65513AEDFD87D1DAFE6AEE9C054845A908EE25 K = 6ac85b3b120ee08ad210ec06cfbc5dd355e0589d1bc72a1bdf0d2f1e721a2195 Secret = 0xdd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3 CounterKey = 04BD2D2DFDED7C89F4CC3338824842C16EB980369A31F69E292097AA007B064D503D3C1918E28690722005F8A225BD127BF925AAC8CE5A9D008C241DF1BAF8D62F K = eca6485c9c58dae86bcf878ea2ac2416958ab9fe11d7d2ff1e7817032c37d89a Secret = 0x5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76 CounterKey = 046B3CBE572B1A3F5FE5410BCE760FEB5093320591ACB953817BDAEC25E78AD3DAD78BBEBEF0A416D00E855CD4C6608E1927D97066AFC19ABF27064F513833D6DA K = d5bc381bd03a90f296da9d4697c552e1a0be6a8b87220f317fe420572156a5fd Secret = 0xb601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d CounterKey = 04CC326C5058CC9A69BDF973FC9C884D2CE0FB14A345D75A42B9EDB4E6ADC86354C62A2257D0E3E8A6493E626EC3EA9D523BF647DEEDDE79E916FD69845DF9D60C K = c2c562835ed929f9bda8e99cc6e3c37501f0dd3871b8c963e0f55acad1d0ff23 Secret = 0xfefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535 CounterKey = 0437F36537B7C11B67BB28BBE176195157C45B35436A041B8EECA6C890A0FD52AC83F3246923B4D29F14B62292A32AA6AB05EC840877FF2B23EE96B0CB7DC313C1 K = c0f58047196666c8ca9d51546a7deb57017aa46f680441de3f64edd361050e1b Secret = 0x334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce CounterKey = 040D3A00D4A5C235246E833EE73028521F6959CBFD57F879031C620804A5A15EE48607FB8E3DC827E5FBFD3C233B1F62245B2FAA9458DB10605D4D9719BF347320 K = 704dafe3d88a2e9aea3abc28992c959cd547f2e11d8bbc73937a6cd04f77f84b Secret = 0x2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d CounterKey = 04E152362AF7609A04E311D2B591538EC07211C79668838A25DD52FEFFC0A1FD6C8CFC47460B9A3A66EE8CE497D02C5D57F2AB4B08C7652AB746FC0DC73AAE39C1 K = c026b625989f1c31e9330792ca6a9fd11896938ade31a91d38ab0457d911eeaa Secret = 0x85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0 CounterKey = 04AE597AD61FF4489367D4BD4132CCFD738E53C347AA463FFB5EA193713612530CBDAF81342A5ABF8B9A62CA88D52C5B6F6873678B6FEB0B991C2E16E32FDEB141 K = 19ee841c07e4874d727e4d56a664cbc0af6238ca49fd54f567c9829299b8dbff botan-2.4.0/src/tests/data/pubkey/ecdsa_invalid.vec000066400000000000000000000443421322470703100222530ustar00rootroot00000000000000 # Public keys failing checks from NIST CAVS file 11.0 (Generated on Tue Mar 01 23:36:01 2011) # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-2ecdsatestvectors.zip # [P-192] Group = secp192r1 # Point not on curve InvalidKeyX = 0x491c0c4761b0a4a147b5e4ce03a531546644f5d1e3d05e57 InvalidKeyY = 0x6fa5addd47c5d6be3933fbff88f57a6c8ca0232c471965de # Point not on curve InvalidKeyX = 0x4c6b9ea0dec92ecfff7799470be6a2277b9169daf45d54bb InvalidKeyY = 0xf0eab42826704f51b26ae98036e83230becb639dd1964627 # Point not on curve InvalidKeyX = 0x82c949295156192df0b52480e38c810751ac570daec460a3 InvalidKeyY = 0x200057ada615c80b8ff256ce8d47f2562b74a438f1921ac3 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1b574acd4fb0f60dde3e3b5f3f0e94211f95112e43cba6fd2 InvalidKeyY = 0xbcc1b8a770f01a22e84d7f14e44932ffe094d8e3b1e6ac26 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x16ba109f1f1bb44e0d05b80181c03412ea764a59601d17e9f InvalidKeyY = 0x0569a843dbb4e287db420d6b9fe30cd7b5d578b052315f56 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1333308a7c833ede5189d25ea3525919c9bd16370d904938d InvalidKeyY = 0xb10fd01d67df75ff9b726c700c1b50596c9f0766ea56f80e # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x158e8b6f0b14216bc52fe8897b4305d870ede70436a96741d InvalidKeyY = 0xfb3f970b19a313571a1a23be310923f85acc1cab0a157cbd # Point not on curve InvalidKeyX = 0xace95b650c08f73dbb4fa7b4bbdebd6b809a25b28ed135ef InvalidKeyY = 0xe9b8679404166d1329dd539ad52aad9a1b6681f5f26bb9aa # [P-224] Group = secp224r1 # Point not on curve InvalidKeyX = 0x3913b7c347f0d56bdda1244a973378ae1a23b6c05f6ea276491e75d8 InvalidKeyY = 0xc5c9086cb4704540d566a9f2cc461488fb80b7dd7384cefea4616c15 # Point not on curve InvalidKeyX = 0x2b27eeb74e93b92f423e8d1bdb6869811746af14c2887a54338f3982 InvalidKeyY = 0xca92f56341ce049bf0300a1cc5f57be96cdc1703512c28b1e07ab6c4 # Point not on curve InvalidKeyX = 0xc32bc4bee87df6478f76cc74552c337fbc00026d74f22068e6a98e2a InvalidKeyY = 0x9c618bec3f89628a61638d69d61824d36070379fa0d2c6d7a63a62e7 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0xc0d570b903d8f1743b3235af72c0772abd5209e96b7d6d43f305d3f8 InvalidKeyY = 0x11fe6013787c8a8dcc19ca6be51aec3dddc5b92d9540a047af860e76c # Point not on curve InvalidKeyX = 0x7ed8ceb65fc7d06dc6f4976b33f2611ef0da9913900c1073cabd3836 InvalidKeyY = 0xe2594a63469d0b84fdd3e29cec8a08427e71c585d9653ab1322dfad1 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x56579986c148519adb29e8d2d374e7ceddafc85448612a297f0f0f46 InvalidKeyY = 0x1d6ac5f9a38354875f1ed2973aa44d7b8ca5e5ad7249ee3bc648b20b3 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1e2412382d3c1b0683bdd152a64a0e1ee06359146872a6fc26584b666 InvalidKeyY = 0x125591c446520d0dcae5c9287c2ce4fb69a1f82827d41f9fe4f29744 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x847ac5c23e0f100fcd9451ab948eaf78eb38aab98060d1539cb485d0 InvalidKeyY = 0x170ca182475dd56eda14e3eaf3f2fbd17926d41175ea272e475e8732d # [P-256] Group = secp256r1 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0xd2b419e62dc101b395401208b9868a3b3fd007ad92adb18921c068d416aa22e7 InvalidKeyY = 0x17952007e021b46a2ab12f14115aafb70608a37f0c3366e7e3921414b904d395a # Point not on curve InvalidKeyX = 0x6f969d90fd494b04913eda9e0cf23f66eea5a70dfd5fb3e48f393397421c2b02 InvalidKeyY = 0xc19ad66d7d6993b792b608879e1d861026805cf6fde1f5d8bb4f790ad1cee456 # Point not on curve InvalidKeyX = 0x8332d9d42b5f48f08b3dd969dbbb28d2be9de30adf560727068e670444f5976f InvalidKeyY = 0x58880380a26a9b3881d189da6b48a11a531c31cefebe696efbd5eaec5917382d # Point not on curve InvalidKeyX = 0xd45779fb33629e21abe0d4a5f8b99f12c71952e53aa4ca065cc393e6300d0f2e InvalidKeyY = 0x6d1a3d5666c7ee9c84c03f02ca2834f5eaf924d6c15536a7b4877481be3fcd2c # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x18c60b77ce23fb3210073ba7dad451ca25bf16c3c1d2d67b2e6eca51f1c77e56 InvalidKeyY = 0x19b47a0fea8c46dc3bd9f65506b281a9dc872d16ed90fd20e94f2fbc94c68d0ba # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x5772caf0d1641479a79aa443fefb222a385b3c481ff51e9fce76ccb513a9bfad InvalidKeyY = 0x110906da47200cb4a536f2c4f601c4ecf82d8dc18405a1cd4746b25a572b46b2c # Point not on curve InvalidKeyX = 0x9ba790614fa1c43816b77729ce03f2cc9666e25f27488886a270b22a36636f11 InvalidKeyY = 0x0a0d36ae87c44c2671a2684793fe8ef2bf6c17411f3fb972b695e30b101b1184 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0xdde744307e7b64098581aa52db5de8c22cdbd46959922e15a714192b7597ecf4 InvalidKeyY = 0x111c5393185604be8cbd53b28d2c3fcb4e853291a5bd82660564e4eeda10924c8 # [P-384] Group = secp384r1 # Point not on curve InvalidKeyX = 0x58fd70ca9e315b2c99152fd3f1071889fcfbe1387c02e6169850e2cba3bb3d21c9f295def8b7680fbca9c43956cfc190 InvalidKeyY = 0xbf7a80d161e429445fb613aeffb71840e1cd7fa9139be4c535c33ae32790f48f6ce4de4b275a55d0b433e86af00766a9 # Point not on curve InvalidKeyX = 0x06a05a2f6a05c7e8684b6df74392faea822f89eecad01e791b0559f6ac650abd85084ceeddfbee85391d5809adb73fef InvalidKeyY = 0x3191a5af6ef4bbad57fe2748ebfe98a4f71dd7b580349d853b9052f326d7a8a42a45ee6e6fd67a49ddbd23b53b92b6d6 # Point not on curve InvalidKeyX = 0x432989eeadbb65d0b11ce46e6049b9c871941a7f4349b30ac0a4e5494bd43cc21608a1e61211f3071c8af12a90475792 InvalidKeyY = 0xbc68ef58e930b4e5a4668d682582c2a1ea1de54589eebe1b754588ba6f14dbcd49b2265a584b7bcb8f7013c6cf7e7880 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1a9e6542ec66d46262c75bd60d9767e114eab403bb3e7576261e5b9a243091b9784c863bbba63cfd3a325d51bdf19eb0d InvalidKeyY = 0x227e025dc40c7025e0961e7841d765d2b59a77fba8dab2150ec9f3153e4fdd2194f775c1b98abb2af9369e4a459cf205 # Point not on curve InvalidKeyX = 0x494c8ecf87e9b7964a1a5736a999828da7904c4345d2c9a521a3d0ae07067bab548a0bca0f90828b678fc182572ea067 InvalidKeyY = 0x15742dd1305079f2b2a8c7f75d191bbca147a7bf111b8d619fb00ae53cf9988084e7c2a90c516c93b06e4ef525e42fde # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x19c0a1c05c945ecadfd00377c81eb4902f40bc3a411c81ab94a444fde37507ee0b341be268da10b6259ac2b5a0965a08e InvalidKeyY = 0xdb9e823dfffde66128955fbd322bac382ce2c2ceb8e11f32f98f09dec41631c22df7ea8838b160adb21685847591959b # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0xc4059321bfc49437084eb6b5c746b52c03aceb7959d72f620b9d668ef2b314ea63fec712262d516ae7d839592f8ed118 InvalidKeyY = 0x165aa703ba328334c9938e61d660b328a6dc672e17b62b550634b862c26f63ee4856bdcc822237c6d598a55175937affd # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x14f96eb9c3623e8ca98edc297f82501d5c6c7c01c11bda6e5e5e166b8525c22c773a5e55fb5a7d04cae08f6a190ad3ac8 InvalidKeyY = 0x47f665e4fb9e9f9e592ac8441e41aeb1c0ed240a05bbd93d6ec260a0644a4d9202aa5a5f28cefde4362878d5aae68222 # [P-521] Group = secp521r1 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x07573e6115674bbffb65097f3dcb05597a35193bf0ed1a4b90a86006eabe5ed638d1e11adb769cd6ed7fba181dea42ffc38a611a6f162fe10b925b80ce9c419ac80 InvalidKeyY = 0x2dbe133e4ff21af1aa50742fc1f7c74cbe8342fe5037c33b961f65b218f947a4acada6d53b1e0bf9ada5be979652275bce77194c8fae2066c5531196aa9997dd2bc # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x014bc514f2b5664a35d1728cc096cc7de2b0391089c014f5f3e4d1048ec5d8497fbe6cfe008b634d708d12bac6aa616c78af1576c0a8676a17a16773ee5a827e3b5 InvalidKeyY = 0x2c027dade98d1a7b433368075e19e8269d8465bbc91c4c3aebfdb2418115d331ea946663713d67f9226f4920c85b0d78c312e87826672f107bcd6c19ea17fff4331 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x259d237214e071f725c77674b38b8b6cc590bed12b7cfdb3d177162afb2a40ab0540f77386ab98ac049711287a5b80891ece13ea34c545c19593e87a15237e2a108 InvalidKeyY = 0x1f33c8963f0981350d77615f0e04e24515a76efc690140272efddaa8cb85b140acad7fc42cf6da7ff5f3ce47183f46e7272b06eca4c74200536223fef2d74e095b1 # Point not on curve InvalidKeyX = 0x089eb672b023d7098bb864bd7789b9f6f4ee268aa9dca6ba3268023b2119be34ee035699d7f1f776ff6028a91824fbfefa22671ed2ce7ffb46ddcece33d1087985d InvalidKeyY = 0x07b7ea0588de385a35a5c0e7dba9cd86fd13d91f71a97a9769e483c2fb823cc3ae9fb9800a05814a25af676f780de1d805a174b70703b51e46455d0eae78b5d7e1d # Point not on curve InvalidKeyX = 0x1859642073e648dd5580346ad5ba9daec8b60d5b574938b2f16ef2a48128ffcadaa46be1fa10ded234d72ec3c38d7cb898281d25264c00d83c2a14bab175ddb9d2b InvalidKeyY = 0x11ad23cb933fa28e00d7d9b0faf78297e4f2b026e6fff74e456b8f2df938e52ceaf98760070c8d22c7f742728434eb6ae6afe7193ee81bc730f5549eebacf7f9952 # Point not on curve InvalidKeyX = 0x176b36128e5a294876c57fac275f388155eb5715c8ace3d90ee4c31b755c8f867327b7e037e7be8f6b521b2674e1786d67294c1f5b098be16102ddd361d92505fd0 InvalidKeyY = 0x0d01b3f053aecde9e0c534d6a518fe24c68ef246b4cff071a3ebbc742152c9d4e872b1acd5a76a42847fe98e9360e7c33ba8575cf75218e89564839ac9f13e6ef14 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x01f26ff28f769521f232fb83e697c9cde606d11383115deef0af16fc05e4631850b57975ae91299b87133fc53bdb424fd8f21b28c7636055eca88f3417d80a3bde1 InvalidKeyY = 0x2748bee6ea7c3b9790fb927c0e691436b946d35b7d52b98398cbcf433683138f48ebe93a007e611f00a73dcfadfd2b0bedbc48bf2de204969df04cebfc1018072f1 # Point not on curve InvalidKeyX = 0x0fcacf322f6be9da5342dae87cbc8cdcb22bc489ca6e97b186b97d2ac02610518b5ee72be37f22825278fb205895f2f823540b91b313abb54a6b41506152e0deec3 InvalidKeyY = 0x187333ce6fe5e6dea5d08d8f5950b5207cb8eb34fa0de2cae5acad8bc8436ff617b45bd8f2975f2762982219b3136bffec3f6c58f8f2cd0d6eb2ebd46467219126f # TODO check FIPS 186-4 # Public keys failing checks from NIST CAVS file 11.0 (Generated on Wed Mar 16 16:16:42 2011) # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip # [P-192] Group = secp192r1 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x472a620598e6715eff9cc022805d8cc8e8219f0e32042538 InvalidKeyY = 0x1971ca86edb3471b2a16b9aae9de90f366f371b26385027e6 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x192a2b854bf4e70d5a8fecc98f43b4a744b26808f8cf4c60d InvalidKeyY = 0x2c0b29190588eabf08dfe160ac8d3ab6f5d5cc73678ebae8 # Point not on curve InvalidKeyX = 0xc07ce28e4c846d7327f0554119ddb7e865fa1dd448ba2b40 InvalidKeyY = 0x33aefa3177b99901d9ab6c12eb0749197420296ccb9d4e4a # Point not on curve InvalidKeyX = 0xf77c2e5946d99932b2a01c1c73a296ecde568978103d8e2b InvalidKeyY = 0xde46b2d5c94dc11b53578eafaa23f96de9747b086979416c # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1016451af3e7a7fa2ce3cf2acbe07fa7fa19a5f14455bf2ec InvalidKeyY = 0xc074630aea063e00bb41e6fbf752dd4f8e5bc742bf3363eb # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x18eea61787fbcd90f73f947346cdf13f05b4170e3e7456165 InvalidKeyY = 0x5514c7b6e0eecc4e9c1ad99710f009a550bf3f952bb16593 # Point not on curve InvalidKeyX = 0x39ed11c88869f6c4705125d9d5fc7c6b1e3d22b2fa7a6b57 InvalidKeyY = 0xd0cf50208f6b1a61ba346a3f3f8f58128c8199e5405a6f11 # Point not on curve InvalidKeyX = 0x87d67f9b7cced918d827ffc086cfd6a181fc61b2f56e000b InvalidKeyY = 0xc6c8d686c61a816d25c085db665f018e31ad6f71ee24d895 [P-224] Group = secp224r1 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x7a9369e2173bbf29589bf47e3ae0ccf47df6d2268c2292f906cc9261 InvalidKeyY = 0x11afc53c7c1b085029f53b41fcd5a336bafb35b89d302f2bd04df44e6 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1803faeef9b40957f59ab97d543f86690afd7471dfb8b04b84ea31085 InvalidKeyY = 0x738cc29474ca048930b7f1a29db3773d11839ed83a6993e3f23692d7 # Point not on curve InvalidKeyX = 0xc01795a001b6b8a5b3db9acbdb55c2f97f4a50aa0a0cfed1d50a4c28 InvalidKeyY = 0xb79dbe52a47a4640100cc939b435377f0bcb8db4ec52ecaadac5d919 # Point not on curve InvalidKeyX = 0xfbe3bff58dc58ca1ef9dc942fd43cdadbd060d70e0b1e6b9583a2228 InvalidKeyY = 0xca844b43c237d497c34b986c681bf3cc54f968c0db74b2e1d9fe9d94 # Point not on curve InvalidKeyX = 0xcbe83c33848dd5a89ea8c45d23b99f23254e2077bd9ab26f6b5bed9f InvalidKeyY = 0xc0d09533d78a96e39028162534d74b097364095e2dc60776938af83b # Point not on curve InvalidKeyX = 0x491e8d6c73708104c9530878f866e585cba008ef70baa46a809a2c03 InvalidKeyY = 0x924a28ace8db9a88f7f874a1f24ac7f0bf56484f2130d5be5a8a1721 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1a89dc6a91002c9d25a3c4621fb5606b52531fd8e48a44119f442f749 InvalidKeyX = 0x62f556641faa83059425026ca18ecbd219fe6d5df3b7713ce8b168cd # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x182a4cee32c06292556f4e29950f5b2db9ad627a56e92680358d6cac4 InvalidKeyY = 0xfa2a87aa3757ae9fa00d11db57089632c4f9e33fb214b9324cf75bd9 [P-256] Group = secp256r1 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0xd17c446237d9df87266ba3a91ff27f45abfdcb77bfd83536e92903efb861a9a9 InvalidKeyY = 0x1eabb6a349ce2cd447d777b6739c5fc066add2002d2029052c408d0701066231c # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x17875397ae87369365656d490e8ce956911bd97607f2aff41b56f6f3a61989826 InvalidKeyY = 0x980a3c4f61b9692633fbba5ef04c9cb546dd05cdec9fa8428b8849670e2fba92 # Point not on curve InvalidKeyX = 0xf2d1c0dc0852c3d8a2a2500a23a44813ccce1ac4e58444175b440469ffc12273 InvalidKeyY = 0x32bfe992831b305d8c37b9672df5d29fcb5c29b4a40534683e3ace23d24647dd # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x10b0ca230fff7c04768f4b3d5c75fa9f6c539bea644dffbec5dc796a213061b58 InvalidKeyY = 0x5edf37c11052b75f771b7f9fa050e353e464221fec916684ed45b6fead38205 # Point not on curve InvalidKeyX = 0xa40d077a87dae157d93dcccf3fe3aca9c6479a75aa2669509d2ef05c7de6782f InvalidKeyY = 0x503d86b87d743ba20804fd7e7884aa017414a7b5b5963e0d46e3a9611419ddf3 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x14bf57f76c260b51ec6bbc72dbd49f02a56eaed070b774dc4bad75a54653c3d56 InvalidKeyY = 0x7a231a23bf8b3aa31d9600d888a0678677a30e573decd3dc56b33f365cc11236 # Point not on curve InvalidKeyX = 0xf8c6dd3181a76aa0e36c2790bba47041acbe7b1e473ff71eee39a824dc595ff0 InvalidKeyY = 0x9c965f227f281b3072b95b8daf29e88b35284f3574462e268e529bbdc50e9e52 # Point not on curve InvalidKeyX = 0x7a81a7e0b015252928d8b36e4ca37e92fdc328eb25c774b4f872693028c4be38 InvalidKeyX = 0x08862f7335147261e7b1c3d055f9a316e4cab7daf99cc09d1c647f5dd6e7d5bb [P-384] Group = secp384r1 # Point not on curve InvalidKeyX = 0xe87cc868cdf196471d3fc78c324be2c4a0de8dbde182afea88baa51666f3cc9993eae5f1d60d4aec58894f0357273c48 InvalidKeyY = 0x187219b0adc398c835791798053cc6a0bcc6e43228ac23101ee93dfce0e508be988a55fa495eb93b832064dc035e7720 # Point not on curve InvalidKeyX = 0x25e5509a54f5fa62f94551dff3dfe210db1bb2bbc8fd4e672fbd5a211f9fd2f7eadc2b83fcd4198b7f857d9a2dc39c11 InvalidKeyY = 0x98a4a13bc2f2d04bebd6d4e04412a9d306e57b90364583a6ec25bf6f0175bb5b397b8cfea83fd5d1e0ad052852b4aba7 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x11a14be72dd023667047c260dd1960dd16555289d9570001d53ea3e494c1c107800dc5b24dd4de8490a071658702a0962 InvalidKeyY = 0x78d65f6975d10df838b96a16cba873b59c28f2c7d05654b8c8b78bd193694ae45d6c6e046a20b984c3467c72d49395fe # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1bf2238026a2489fb6ac1a8d6b82fdb33b05e8d01f1e2671eb22e61734031cc63efbf7e14d23e81fd432fc9935c627cdd InvalidKeyY = 0x6b377c8b187d568b782a28b38a7861b69e3d016f9f9ebb7eff2e7732a5132785b5a32e069dcef12875a995908a8b72f1 # Point not on curve InvalidKeyX = 0xa999b80932ea62b4689769225b3ff34b0709c4e32342a824799ca63dcce1f3ed8819e080fc7fa130c1881c8131f4bcb5 InvalidKeyY = 0xb8c77d0868c2c159e1be6bcd60ec488ab31531c21e1cb8fe2493ed26ac848fde7d27823a9a4912650511a3d460e25ef2 # Point not on curve InvalidKeyX = 0x5cbaa8088b0804fe14c2a6fa54b1adee1690fd17a682ea9ec5202ba7575e217c37e98565b7e95e7c882bb6eef76a3df1 InvalidKeyY = 0x79d8c7e96ae7a7668496317c596b24ebe56e6ea5bc64b74c38867eb2c419d8277d20b9c27a2d5c75d1c7a47885d38d0e # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0xcfb4dbdcb1a8c6e8c6b4a9dd091eed015476ebd20837de1f6261a27999a08cff345f0d4627eb7778fc3495916a6d017b InvalidKeyY = 0x1c08f7a421bc0731321374f9b31ecf5ca820c006180da4c496f29f0d0e4947f368808fd3052ee4f1afb8c2005fd0c0ee8 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x1adaff25f37c8dfd33ecf216691a2107e522c21c99e29a76d8c1757ef84cc37c73ec5c2aa3be2fb0d5f1d372e08fbf9e InvalidKeyY = 0x1f39c8f86a20c130c34f767e085217232599541516e2d79d8e526fa03082bed2a5dc5fde6fd410c30245212e7816dd014 # [P-521] Group = secp521r1 # Point not on curve InvalidKeyX = 0x165252970b786685babd0463f7314275c44ac1b558ab5a8e4bde60a441623b204982dcba2d3c0e7d379d5b637fd3edc0b0d2e0b7a33f7b36c03bb8bf3c6c5469ebe InvalidKeyY = 0x1300db0f0bc9b21ecff15eff4ed3bbe3dc1ac403dc96c89344d0030304da7ce57f1dc757af6816279464c61a0ab33645c3cd6583842cff0928081660b30775f594f # Point not on curve InvalidKeyX = 0x1a39c4c5d5f6af8285931694b030f6b8bbc0a012ab73c3947c72a6210643cc63673947f5847f2503bb81ae1c8b6a0d7cb0ee5675f9027ca75445aee2b6d7beb78ea InvalidKeyY = 0x148beebbe6e298779e59d8fc88cfc28f4aa784d927e5127813894b6d593760608539d2eb9db9cc8b39813a5e5e03a7d39be67c9c8a566fa8d65ff25b5bee83b0a9b # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x0bec1326722dd943f750fda964cb485f31469095e5b4b5c4fa02041e2f443693ac36c09f371aea7d501881fc4e369f68e071bb14c5003b31dce504bd14338eb8104 InvalidKeyY = 0x36cd502b0a4e91e1080a5b94886a819a823687693ce878408b59183730c69e5ab2d6e05ea5f3d32855cf8c7c20da59a28913025a1fa6835a3751ec6da69502f0547 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x3e064e446ce29891240b02948288bedc37a4e4163a78702f942728e2d530cfecdc0362cf2209a706a9d4db24c1dd6aba7ad81d6ddecdf6e12073a1c31e2dacd185d InvalidKeyY = 0x12d0363dbdc4d157afd517beaecf2e6c93896a288c7cec5f9ba9394524fb6d4f647a9937fe440fda73f2e31410517ed5a814eed038356699085f9983f2ea5faccd0 # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x164ce2e2fa873f5648c22ed37f26c13d3da3180a0f6c3aa4b68d0a13293784a5f1356fc2495217065de4f3b504ee2248747ef96180e102879363fa5393fe6fc5fbe InvalidKeyY = 0x23126d6903cbd7735291d77599cfe7f5e45056250c37deba2642dc0b7163ce0cf763d0d353bb9974cf15195c4bc4421bdae274492cfca739a8b8341235cc2268bc0 # Point not on curve InvalidKeyX = 0x0dc2c4a23433293a771300ec79a3cd0f2e627110a97da85a82f4f85e7be9c280213048a3ad01b3e72bf54555a1b5da9945adcfed94ed8f6ed405c77506b5e00f45a InvalidKeyY = 0x18f746aacd6ed4eaaf9b038789927a30125691bc525b29592abb13cf98f64c03cb36a477dc53971563ee74f3a7614677ab6817f6e5f22ceb02c90826a33fe7c94cd # Point not on curve InvalidKeyX = 0x16e0383adc2986d01c18d7bde3b89eb5f732b56a6424c9394ec556a4660c3b88ddbc8654345ba6cff94bb002d16bc92e5907035f933785f633698e711738160d842 InvalidKeyY = 0x1cf24be44e919e1576ecf51abdea113f8bb7121d670b86d8ee93ce1e6f79b17a6394987d74e6787facef5ca655196603468afd76e5cdf54ebb1331ce183cfe28c9e # InvalidKeyX or InvalidKeyY out of range InvalidKeyX = 0x3d68ed9ce2bcb68f12ac37385ccdb6ee445f7b0a8f257593735abdf8bc0b98bc5ab5c5750e2e111fec2ecde6be321522ddc90d2b54634d30d28f43024f76e4653a7 InvalidKeyY = 0x03f6f5f224d6aee43d781e3ad723062a61729a6ed959cd18c75d4982961ba8033767ed1168674a545b0a693d3587fbeaebc9b116143dbe1155ead48de89d980d617 botan-2.4.0/src/tests/data/pubkey/ecdsa_prob.vec000066400000000000000000003250111322470703100215620ustar00rootroot00000000000000 # Derived from NIST CAVS file 11.2 (Generated on Tue Aug 16 15:27:42 2011) # http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip # "SigVer" information for "ecdsa_values" # [P-224,SHA-224] Group = secp224r1 Hash = SHA-224 Msg = 699325d6fc8fbbb4981a6ded3c3a54ad2e4e3db8a5669201912064c64e700c139248cdc19495df081c3fc60245b9f25fc9e301b845b3d703a694986e4641ae3c7e5a19e6d6edbf1d61e535f49a8fad5f4ac26397cfec682f161a5fcd32c5e780668b0181a91955157635536a22367308036e2070f544ad4fff3d5122c76fad5d X = 0x16797b5c0c7ed5461e2ff1b88e6eafa03c0f46bf072000dfc830d615 Nonce = d9a5a7328117f48b4b8dd8c17dae722e756b3ff64bd29a527137eec0 Signature = 2fc2cff8cdd4866b1d74e45b07d333af46b7af0888049d0fdbc7b0d68d9cc4c8ea93e0fd9d6431b9a1fd99b88f281793396321b11dac41eb Msg = 7de42b44db0aa8bfdcdac9add227e8f0cc7ad1d94693beb5e1d325e5f3f85b3bd033fc25e9469a89733a65d1fa641f7e67d668e7c71d736233c4cba20eb83c368c506affe77946b5e2ec693798aecd7ff943cd8fab90affddf5ad5b8d1af332e6c5fe4a2df16837700b2781e08821d4fbdd8373517f5b19f9e63b89cfeeeef6f X = 0xcf020a1ff36c28511191482ed1e5259c60d383606c581948c3fbe2c5 Nonce = c780d047454824af98677cf310117e5f9e99627d02414f136aed8e83 Signature = 45145f06b566ec9fd0fee1b6c6551a4535c7a3bbfc0fede45f4f50387302dff12545b069cf27df49b26e4781270585463656f2834917c3ca Msg = af0da3adab82784909e2b3dadcecba21eced3c60d7572023dea171044d9a10e8ba67d31b04904541b87fff32a10ccc6580869055fec6216a00320a28899859a6b61faba58a0bc10c2ba07ea16f214c3ddcc9fc5622ad1253b63fe7e95227ae3c9caa9962cffc8b1c4e8260036469d25ab0c8e3643a820b8b3a4d8d43e4b728f9 X = 0xdde6f173fa9f307d206ce46b4f02851ebce9638a989330249fd30b73 Nonce = 6629366a156840477df4875cfba4f8faa809e394893e1f5525326d07 Signature = 41f8e2b1ae5add7c24da8725a067585a3ad6d5a9ed9580beb226f23aa5d71bff02dce997305dd337128046f36714398f4ef6647599712fae Msg = cfa56ae89727df6b7266f69d6636bf738f9e4f15f49c42a0123edac4b3743f32ea52389f919ceb90575c4184897773b2f2fc5b3fcb354880f15c93383215d3c2551fcc1b4180a1ac0f69c969bbc306acd115ce3976eff518540f43ad4076dbb5fbad9ce9b3234f1148b8f5e059192ff480fc4bcbd00d25f4d9f5ed4ba5693b6c X = 0xaeee9071248f077590ac647794b678ad371f8e0f1e14e9fbff49671e Nonce = 1d35d027cd5a569e25c5768c48ed0c2b127c0f99cb4e52ea094fe689 Signature = 2258184ef9f0fa698735379972ce9adf034af76017668bfcdab978de866fb8e505dea6c909c2c9143ec869d1bac2282cf12366130ff2146c Msg = c223c8009018321b987a615c3414d2bb15954933569ca989de32d6bf11107bc47a330ab6d88d9b50d106cf5777d1b736b14bc48deda1bc573a9a7dd42cd061860645306dce7a5ba8c60f135a6a21999421ce8c4670fe7287a7e9ea3aa1e0fa82721f33e6e823957fe86e2283c89ef92b13cd0333c4bb70865ae1919bf538ea34 X = 0x29c204b2954e1406a015020f9d6b3d7c00658298feb2d17440b2c1a4 Nonce = 39547c10bb947d69f6c3af701f2528e011a1e80a6d04cc5a37466c02 Signature = 86622c376d326cdf679bcabf8eb034bf49f0c188f3fc3afd0006325d26613d3b33c70e635d7a998f254a5b15d2a3642bf321e8cff08f1e84 Msg = 1c27273d95182c74c100d85b5c08f4b26874c2abc87f127f304aedbf52ef6540eba16dd664ae1e9e30ea1e66ff9cc9ab5a80b5bcbd19dde88a29ff10b50a6abd73388e8071306c68d0c9f6caa26b7e68de29312be959b9f4a5481f5a2ad2070a396ed3de21096541cf58c4a13308e08867565bf2df9d649357a83cdcf18d2cd9 X = 0x8986a97b24be042a1547642f19678de4e281a68f1e794e343dabb131 Nonce = 509712f9c0f3370f6a09154159975945f0107dd1cee7327c68eaa90b Signature = 57afda5139b180de96373c3d649700682e37efd56ae182335f081013eb6cd58650cfb26dfdf21de32fa17464a6efc46830eedc16977342e6 Msg = 069ae374971627f6b8503f3aa63ab52bcf4f3fcae65b98cdbbf917a5b08a10dc760056714db279806a8d43485320e6fee0f1e0562e077ee270ace8d3c478d79bcdff9cf8b92fdea68421d4a276f8e62ae379387ae06b60af9eb3c40bd7a768aeffccdc8a08bc78ca2eca18061058043a0e441209c5c594842838a4d9d778a053 X = 0xd9aa95e14cb34980cfddadddfa92bde1310acaff249f73ff5b09a974 Nonce = 1f1739af68a3cee7c5f09e9e09d6485d9cd64cc4085bc2bc89795aaf Signature = 09bbdd003532d025d7c3204c00747cd52ecdfbc7ce3dde8ffbea23e11e745e80948779a5cc8dc5cb193beebb550ec9c2647f4948bf58ba7d Msg = d0d5ae3e33600aa21c1606caec449eee678c87cb593594be1fbb048cc7cfd076e5cc7132ebe290c4c014e7a517a0d5972759acfa1438d9d2e5d236d19ac92136f6252b7e5bea7588dcba6522b6b18128f003ecab5cb4908832fb5a375cf820f8f0e9ee870653a73dc2282f2d45622a2f0e85cba05c567baf1b9862b79a4b244e X = 0x380fb6154ad3d2e755a17df1f047f84712d4ec9e47d34d4054ea29a8 Nonce = 14dbdffa326ba2f3d64f79ff966d9ee6c1aba0d51e9a8e59f5686dc1 Signature = ff6d52a09ca4c3b82da0440864d6717e1be0b50b6dcf5e1d74c0ff5609490be77bc834c1efaa23410dcbf800e6fae40d62a737214c5a4418 Msg = 79b7375ae7a4f2e4adad8765d14c1540cd9979db38076c157c1837c760ca6febbb18fd42152335929b735e1a08041bd38d315cd4c6b7dd2729de8752f531f07fe4ddc4f1899debc0311eef0019170b58e08895b439ddf09fbf0aeb1e2fd35c2ef7ae402308c3637733802601dd218fb14c22f57870835b10818369d57d318405 X = 0x6b98ec50d6b7f7ebc3a2183ff9388f75e924243827ddded8721186e2 Nonce = ab3a41fedc77d1f96f3103cc7dce215bf45054a755cf101735fef503 Signature = 70ccc0824542e296d17a79320d422f1edcf9253840dafe4427033f40e3823699c355b61ab1894be3371765fae2b720405a7ce5e790ca8c00 Msg = 8c7de96e6880d5b6efc19646b9d3d56490775cb3faab342e64db2e388c4bd9e94c4e69a63ccdb7e007a19711e69c06f106b71c983a6d97c4589045666c6ab5ea7b5b6d096ddf6fd35b819f1506a3c37ddd40929504f9f079c8d83820fc8493f97b2298aebe48fdb4ff472b29018fc2b1163a22bfbb1de413e8645e871291a9f6 X = 0x8dda0ef4170bf73077d685e7709f6f747ced08eb4cde98ef06ab7bd7 Nonce = 9ef6ebd178a76402968bc8ec8b257174a04fb5e2d65c1ab34ab039b9 Signature = eef9e8428105704133e0f19636c89e570485e577786df2b09f99602a8c01f0162891e4b9536243cb86a6e5c177323cca09777366caf2693c Msg = c89766374c5a5ccef5823e7a9b54af835ac56afbbb517bd77bfecf3fea876bd0cc9ea486e3d685cfe3fb05f25d9c67992cd7863c80a55c7a263249eb3996c4698ad7381131bf3700b7b24d7ca281a100cf2b750e7f0f933e662a08d9f9e47d779fb03754bd20931262ff381a2fe7d1dc94f4a0520de73fa72020494d3133ecf7 X = 0x3dbe18cd88fa49febfcb60f0369a67b2379a466d906ac46a8b8d522b Nonce = 385803b262ee2ee875838b3a645a745d2e199ae112ef73a25d68d15f Signature = 1d293b697f297af77872582eb7f543dc250ec79ad453300d264a3b70517a91b89c4859fcc10834242e710c5f0fed90ac938aa5ccdb7c66de Msg = 30f0e3b502eec5646929d48fd46aa73991d82079c7bd50a38b38ec0bd84167c8cf5ba39bec26999e70208af9b445046cd9d20c82b7629ca1e51bdd00daddbc35f9eb036a15ac57898642d9db09479a38cc80a2e41e380c8a766b2d623de2de798e1eabc02234b89b85d60154460c3bf12764f3fbf17fcccc82df516a2fbe4ecf X = 0xc906b667f38c5135ea96c95722c713dbd125d61156a546f49ddaadc6 Nonce = b04d78d8ac40fefadb99f389a06d93f6b5b72198c1be02dbff6195f0 Signature = 4bdd3c84647bad93dcaffd1b54eb87fc61a5704b19d7e6d756d11ad0fdd81e5dca54158514f44ba2330271eff4c618330328451e2d93b9fb Msg = 6bbb4bf987c8e5069e47c1a541b48b8a3e6d14bfd9ac6dfaa7503b64ab5e1a55f63e91cf5c3e703ac27ad88756dd7fb2d73b909fc15302d0592b974d47e72e60ed339a40b34d39a49b69ea4a5d26ce86f3ca00a70f1cd416a6a5722e8f39d1f0e966981803d6f46dac34e4c7640204cd0d9f1e53fc3acf30096cd00fa80b3ae9 X = 0x3456745fbd51eac9b8095cd687b112f93d1b58352dbe02c66bb9b0cc Nonce = 854b20c61bcdf7a89959dbf0985880bb14b628f01c65ef4f6446f1c1 Signature = a2601fbb9fe89f39814735febb349143baa934170ffb91c6448a7823bf90f9305616020a0e34ef30803fc15fa97dffc0948452bbf6cb5f66 Msg = 05b8f8e56214d4217323f2066f974f638f0b83689fc4ed1201848230efdc1fbca8f70359cecc921050141d3b02c2f17aa306fc2ce5fc06e7d0f4be162fcd985a0b687b4ba09b681cb52ffe890bf5bb4a104cb2e770c04df433013605eb8c72a09902f4246d6c22b8c191ef1b0bece10d5ce2744fc7345307dd1b41b6eff0ca89 X = 0x2c522af64baaca7b7a08044312f5e265ec6e09b2272f462cc705e4c3 Nonce = 9267763383f8db55eed5b1ca8f4937dc2e0ca6175066dc3d4a4586af Signature = 422e2e9fe535eb62f11f5f8ce87cf2e9ec65e61c06737cf6a0019ae6116cfcf0965b7bc63aecade71d189d7e98a0434b124f2afbe3ccf0a9 Msg = e5c979f0832242b143077bce6ef146a53bb4c53abfc033473c59f3c4095a68b7a504b609f2ab163b5f88f374f0f3bff8762278b1f1c37323b9ed448e3de33e6443796a9ecaa466aa75175375418186c352018a57ce874e44ae72401d5c0f401b5a51804724c10653fded9066e8994d36a137fdeb9364601daeef09fd174dde4a X = 0x3eff7d07edda14e8beba397accfee060dbe2a41587a703bbe0a0b912 Nonce = 7bb48839d7717bab1fdde89bf4f7b4509d1c2c12510925e13655dead Signature = 127051d85326049115f307af2bc426f6c2d08f4774a0b496fb6982b16857e84418c1d1179333b4e5307e92abade0b74f7521ad78044bf597 # [P-224,SHA-256] Group = secp224r1 Hash = SHA-256 Msg = 2b49de971bb0f705a3fb5914eb7638d72884a6c3550667dbfdf301adf26bde02f387fd426a31be6c9ff8bfe8690c8113c88576427f1466508458349fc86036afcfb66448b947707e791e71f558b2bf4e7e7507773aaf4e9af51eda95cbce0a0f752b216f8a54a045d47801ff410ee411a1b66a516f278327df2462fb5619470e X = 0x888fc992893bdd8aa02c80768832605d020b81ae0b25474154ec89aa Nonce = 06f7a56007825433c4c61153df1a135eee2f38ec687b492ed40d9c90 Signature = 0909c9b9cae8d2790e29db6afdb45c04f5b072c4c20410c7dc9b6772298f4fcae1fe271da1e0345d11d07a1fca43f58af4c113b909eedea0 Msg = 1fa7201d96ad4d190415f2656d1387fa886afc38e5cd18b8c60da367acf32c627d2c9ea19ef3f030e559fc2a21695cdbb65ddf6ba36a70af0d3fa292a32de31da6acc6108ab2be8bd37843338f0c37c2d62648d3d49013edeb9e179dadf78bf885f95e712fcdfcc8a172e47c09ab159f3a00ed7b930f628c3c48257e92fc7407 X = 0x5b5a3e186e7d5b9b0fbdfc74a05e0a3d85dc4be4c87269190c839972 Nonce = 5b6f7eca2bcc5899fce41b8169d48cd57cf0c4a1b66a30a150072676 Signature = f12c9985d454ffbc899ebbbb6cf43e3debcac7f19029f8f2f35cce3112fcb848adbd8b1b4c72b2b54a04d936e4a5f480ae2a3ea2e3c1baae Msg = 74715fe10748a5b98b138f390f7ca9629c584c5d6ad268fc455c8de2e800b73fa1ea9aaee85de58baa2ce9ce68d822fc31842c6b153baef3a12bf6b4541f74af65430ae931a64c8b4950ad1c76b31aea8c229b3623390e233c112586aa5907bbe419841f54f0a7d6d19c003b91dc84bbb59b14ec477a1e9d194c137e21c75bbb X = 0xf60b3a4d4e31c7005a3d2d0f91cb096d016a8ddb5ab10ecb2a549170 Nonce = c31150420dfb38ba8347e29add189ec3e38c14b0c541497fb90bf395 Signature = bf6c6daa89b21211ea2c9f45192d91603378d46b1a5057962dafaf12cb6b237950e0f0369323055cd1f643528c7a64616f75b11c4ddd63c7 Msg = d10131982dd1a1d839aba383cd72855bf41061c0cb04dfa1acad3181f240341d744ca6002b52f25fb3c63f16d050c4a4ef2c0ebf5f16ce987558f4b9d4a5ad3c6b81b617de00e04ba32282d8bf223bfedbb325b741dfdc8f56fa85c65d42f05f6a1330d8cc6664ad32050dd7b9e3993f4d6c91e5e12cbd9e82196e009ad22560 X = 0xc8fc474d3b1cba5981348de5aef0839e376f9f18e7588f1eed7c8c85 Nonce = 5e5405ae9ab6164bb476c1bb021ec78480e0488736e4f8222920fbd9 Signature = 7b7beaf9f696ca1a8051527478c4c075ab45aa4768937886dbf3861893d4cf110a37c5a6f15c4e6024822118539e860dee2f60b8c3f462f6 Msg = ef9dbd90ded96ad627a0a987ab90537a3e7acc1fdfa991088e9d999fd726e3ce1e1bd89a7df08d8c2bf51085254c89dc67bc21e8a1a93f33a38c18c0ce3880e958ac3e3dbe8aec49f981821c4ac6812dd29fab3a9ebe7fbd799fb50f12021b48d1d9abca8842547b3b99befa612cc8b4ca5f9412e0352e72ab1344a0ac2913db X = 0x04ef5d2a45341e2ace9af8a6ebd25f6cde45453f55b7a724eb6c21f6 Nonce = ec60ea6f3d6b74d102e5574182566b7e79a69699a307fee70a2d0d22 Signature = 2fd7fcbb7832c97ce325301dd338b279a9e28b8933284d49c6eabcf6550b2f1efc312805a6ed8f252e692d8ee19eaa5bcd5d0cda63a1a3f0 Msg = 4cc91f744ac858d3577e48813219aa3538dd813b186b42d1e6218376f07cc1cc448ddd6b37240e98bf953f49cf54d65c12878b33c0bf6eb1c60254f0b6fa974f847e53abc56773eef6f29885dfc619e6a48fc15a667ca94001a0c945b6357a53221b0f4b266181456b0d2d25e90708777f1a6f85971c00140c631c1991e0fd06 X = 0x35d4bbe77d149812339e85c79483cb270bdac56bbf30b5ef3d1f4d39 Nonce = 751869c1d0e79eb30aae8fbfb6d97bfa332123fd6b6c72c9cd3c1796 Signature = 26bb1b92b0f01e94eba5fa429271371db527ce857abba13bd1103f64836aba9c63e1252c2b2d72a21e6a41b82241ebe32647e7f814652bcb Msg = 58f43cc1924de4bc5867664adbc9d26b4f096a43aca47c27c52851b006dc2a658919ef9ce5b5ac48372703be15ac51631c2bd84b88f479f113b0569a9a09e230ec1e8e573474c6075284d3e57d973829af35325d9e7dab4a5f9b065155bbcaff3642a82ef4c9b9e127d3575c050721653da3b087d3fa394192897a5519527d19 X = 0x2c291a393281b75264c9b8817af684fa86a1cdc900822f74039dc5d6 Nonce = e2a860416229dfd3f5a5cc92344ca015093a543943a0d8f73bf2b2fd Signature = 00e300c1ef4a8c4ca5da6413856f8981db49de29bdf03f32ffc3ceabf250f18a51ba5f63e1584097841099fa6ae4e98ee458c061d1d5aed7 Msg = 113a2806b052fde683ee09453098e402204155afb3776fd1cad3a9103421d327eab8f9ec0dd050ffcc83f93b34ea707705fabeccfe43ab1a71c95298fd3ec769d99ead1066950eee677d225816e0faad19cf69e1b35d16771689e2092cafe16d7c0dd7b0db73fffb8d0f3eaed83004dd21e753530ec939c89ba25578fa5f785b X = 0x831ea25dbeda33d272a1382c5def0e83929170ab06a629eed6ee244b Nonce = 6be6dd9f6a083915ccba54626caf12d246d3aece0a7eda7d8d85599c Signature = ff1460946e06fb6f5d35e8d2625ca70ffb9b45308e3fabf6ad8351b16029aa3990918e8cb8a388d53b0772e5cdfff49c3405fe0d3a95933a Msg = 64cbfc8f2e2149a31b3e8a80c4a552f6c62aaeb7990b6e0ee55500a9d17be04213406578caf315951086dff5c2af3b5ce17d425d185101ef26f86396ba3a129a4f3f8e2dd595f59efb6c0f5c2dcc394569d7268695e9ac7daa84203f1f1895f1f9e4b514a5c9cd23baa63454710144fe735ad9b8f42d8c43267aa434a26d7e5f X = 0x70f74c7324ef137318b610ead8ddc5b964e0eed3750b20612fc2e67b Nonce = 8e984864f86f7a2a73f3edda17dbccd13fac8fa4b872814abf223b1b Signature = 3b18736fa11d04e27e2614cda03a63ec11a180f357b0b3192920d09c2f0f3dbd570727b14fbb29155538e62c930dd51c4035275c1365dc60 Msg = a10a11c8e30fff118d371daf824f16c08200b83ea059436466a4611ccac93b2dea2de8c1006f946196aef7fe9b0c251a391b0340f21797798278b412ff2b53842eec6450728e2bca062f8337a2c204b9ea04ff660cd4d4db559f2f11c4d8ef199021339fcc82396f7a93926cf5f247e37d8067fe50692de54f102bd5ab51925c X = 0x026be5789886d25039c11d7d58a11a6e1d52cb1d5657561f2165b8a8 Nonce = 0128b8e3f50731eb5fcc223517fc0cf6b96cd1d2807eb4524bc46f77 Signature = 3a6b633f96f3d0b6d54f7fb29ac33709e4f0dd8fa0e51606ed9765ca63e8c119dfa51784decd864f6911f2210a80f8f02d472d88df10d119 Msg = b3f720bf566ffa369259f4361959ae0641d2755ec264a4c4349981df2b02563275b2b9adb5aee47f7a456760a971991ffed6b17809bb9694138d1677fa916123795239353158fc6b22d10f20d26f5d2dcd8c56c44373eea5b93067dba2d7c5318dac2e9e8714873cb1b37f58c011fd14fa1e535554efe05f468bfc8e11cd8b99 X = 0xe79c18d935c2839644762867aa793201f96a3cde080c5968412ce784 Nonce = 7abedab1d36f4f0959a03d968b27dd5708223b66e0fc48594d827361 Signature = d35047d74e1e7305bb8c1a94e8ae47cb1591c3437a3e185e00afe710d9c425c9d5feb776ac8952e6c4eee0ecd68aef2f0e7bff2e49c9185e Msg = 0a398a46df7ccc48d1e7833f8bbc67100f1ef77a62dc78bbc115b2a662f9591fbaaa91ad3d788e2fdd1b3164e45293d4f5686c151296901768028ac80ded4bf89c647ad35f0c7c4cb318c0c757c1d83c44d850e5fd4677281b3f13b1ee54de79c8c042813f9d3312dcc6111a68299cb7e829557d7f3d96e702f65aefc6499415 X = 0x0d087f9d1f8ae29c9cf791490efc4a5789a9d52038c4b1d22494ad8c Nonce = 557d0e3995dc6377b3911546dd7aeaeec62a6d8f2af6a274382fc37f Signature = 56df0ea6afdcc232ceb41729eec00cf906b69b6e28423a36d3c92cc5f4f70fd948c9a147f55317fdea7b8a84c33e721014552d5800d63edc Msg = 8c33616821a6038b448d8918668977fcf1ef5aa0cf7c341837b39bbcc9bca875a3757f4b392630e9995b9bbe4eb66978b877586adaa02f99d2344dae082a7603351d8ffcfca081ab403cd0acb90d078dd1d0789c2eb3185c62bff2d9f04cd38e509e3b83c12ed0a5c6808fc42f7ba5b06acdc496c8ad9be648ee6a4505f8560f X = 0x0830aebb6577d3a3be3ba54a4501c987b0e0bb593267b9bbadb66583 Nonce = e4f4a3280574c704c2fde47ca81ec883d27f2c5a961a294db7cda9d2 Signature = b30b8a0079d9a134b5e1618c2ac63e3fbe0e95866b9dbc5f423f27073dc36746610271ef66e0aa52cc2ccadc5c9b08dc769e4dc4f6538c11 Msg = 94d56535fd4edfe67a0daa6579f9d53bf6b7b8830ae2aeb62892ff59f18756ddf2811b449c7d20d65d54f8507de4e7c50eaa084830637812aa4b250a4d61ab67845be36e4a41cdc0a70f8d6e3a63d4514f0dc197e6486015046a316153d5f3a3a4a0ae1ed7ea5fa55e12e73d333333685c02e0eb636234ea7e6d4b76b4b76b5a X = 0x2acc9b97e625263e8e4cd164302c7d1e078bfcdd706111a13ccda5b2 Nonce = e401fa80f96480d437ed4f61a783888062ec33d530b188fd48016a6d Signature = 28674f447c4742e4087bbccfb522fbad4e18b56031d2ce8f532b078aa5a7a13d15b423dd17771f73cea98d89dbffa846cc209b45c0e29b76 Msg = 5d8ebdf9eb28b47bdafaa36bf0b66a9eaf99b6c83959da4f2b1151b4f4ecd28fb115a64c0cb9491093a7e9b9c53ec423e4c72e7765bb9c818da0e8c428667e44474a71db4867130c77c40bfd8544b2d7b9d6464d2b8e6a48482153256a32437c3a747231f51134dd14c703407e31146a6fcde23bededcf16950486e90ca69ac0 X = 0xf4e873d4fb944fb52323406f933815092b7672221de4d1c45917f3fc Nonce = 5d1476c682a64162fd2fdc82696fc8cab1469a86f707ea2757416e40 Signature = 82982b38ed465138df4018d7cfb835edcb591cb57446ca49d163782b8ef1d7b326cabee7f7ab95b7b98d3c27a069c0fd95a1599c0ccb422b # [P-224,SHA-384] Group = secp224r1 Hash = SHA-384 Msg = 25e4416695f77551fdce276355528ccf1ddc2483821c5d22d751d50111ca2fadc6593b52c74f4b5957494f1df25b0b2f86950d0d19229ec6506fee8581d2dd09d48418b146ff16bd84a17ca0dc83b1888eb407376da6c8a88fa1e60b8c2a2471dfde4b3996ef673d5bde3d70c434dc9f2488e9de16ae657d29e5e59ec922a1ec X = 0x62c572ee0d6f81b27e591d788bfc2f42b5105d2663078dfb58069ebd Nonce = 0f0bb1e428bcdebf4dc62a5278068efc0f8ce75f89e89b3630f102b2 Signature = aac0ea27e129f544abcc77f110e70bbdd5aa3e425dc39d5e8887025d10e5dd06aee6b8419a04aa33d9d5678b0039c3acc3c4b61fe106bfdc Msg = 9164d633a553deccf3cbd2effccf1387fa3177cd28c95d94a7d1a3e159c5e5c027758cc26493301b2f4d141d8d07a5fe5fead987ce5f30abeafcb48c302afc6c2309f0e93d9b6818cbb6972d222cb7b01302dfe202ae83b89f53150ae4a0e2b8fc0fd1091f19b4ab2e6ab213ab322d04f2c5f57113bfad3c5675227237abf773 X = 0xe2f86bf73ba9336fa023343060f038e9ad41e5fe868e9f80574619a3 Nonce = 35724ac043e3b44b73b5a7919cf675190306d26aa67c27c28c873534 Signature = 535147c265af138eec50c7fb570bcc8d2e6f675597b0fcc034e536bc743812c188a1dddf9fb34b90738f8b2e58760d6cd20ccceb1bb9c516 Msg = 019df05929321ecea7ee1de4f412aba1c8d3c24437db04b194a68a0a59dd871be10bd3a4be6edf551350ea49fc7155a4d887e1221486291abe77a30633a4c4f7868fe2df24311cba0c73804883954460e122387ed414111ff96ff1aebac8b6a6491d8a0d16e48a63bf3d027c0f68ee4a4b234d73b412196706af8ea022b4dcef X = 0xb0a203438e2586d7575bc417a4a798e47abc22aa3955b58fc2789f17 Nonce = 408e9c8b1f33136d6ddb93ff3a498bc09d4eee99bf69cdd5af0aa5a2 Signature = 1b5a964c8b1fc634c6e2b82322499df1d7f0c12a4d2a77723c816ab8cf54599a36ca064fae0aa936de5266f87704409d22a15d28c01b7f2a Msg = 5d09d2b1d3fa6e12c10d8b26dc9aabc8dc02bd06e63ff33f8bb91ede4b8694592a69e4ed4cdf6820069e2b9c7803658949e877ffe23bf90bcf5ce1409c06c71d86885a94048b05ac0ec9db193e489a5a2bfa367caf6aa8ecdb032be366174343f6875d2fe1785e8d77334f5f469cec64998e08d3303e5c9a1923b34fdc105d65 X = 0xefcfa50fad6fb2065f9a55f28c0c42fa24c809ccb19b6fc6d8ffb085 Nonce = d1eea821f286eae6ebc1f61b08f9ad4323a3787e94af4c32cd31351b Signature = b37caaa71103752ac559f9eb4943324409ebfa8b585f684dcaa5c4117c28e7619e2944ab4b7be022878c8052ebdf2cae5dff4f976c49686a Msg = 50f6dfc81c6cf189e0a310f992907fe93356cee9dea9a41c7671a8daf3f4cfe0c459ce6122c1e731dbf7593419d7114cb73b46956158a982c5d52c72f43f0f822046093c69aeff1f7e4cd8af00ba655c5baa2e7b6a400b4be1f6fd51b3e4cfb35a69c80a28c5cafb771b6c2e52e0aeef0e3fd045e8d40745f3f8b74fd969f816 X = 0x61a17816937987764cdc064dc7b5b4f5b16db1023acdfe25902957dd Nonce = 44b1fdec2629f9075f89c134ac28ff19bfddaa9db02a5d7f853582b4 Signature = b0f5635d8bc9c53a1d54a3ec63de59ed66e6b2358d4ab7975541432667c68fe265c7e5aba4232deeafb88545a2aa266fb9f2c2bb3f3ae8d2 Msg = e90129ac6672c85bb7b6b18e9dc199c96c81fd65034b53c77818364d512366fb9cd1bc7c82404c451e561fc1ed916c0948f6ac561b33a1ccca093f07684b8c2bafa9e966377bd208556018a5bafb9edcecf70498c7140fe9c8cf3ad8b8c3b0aa489df797944465047465415bb0e24333235fcdd59a98829a3941eaaf62033e82 X = 0x79d5367314ec664aa0f6ca36f95549502a05bf8400bf532d669fab8d Nonce = da529c52f5cc1f435d873109cd991d6cd7e1631d9ff1dd9521dd5db6 Signature = 8e0ac63903f4921755430572c3f08bc272790639bdf1009fe2a9a7146278c841a2d0a270791fe54b36c49d426d67907aa4e4f59c8638ad97 Msg = 3c9a483c9bee33b601549c592a82e95b4319b1e74b777877f0971bcb4273716b268e8f99f876e42f942f4cf08284896bbc1ffbf094ac0956c3cedfc3580cffa8c74fc6db29a371f2da2d05edb9185ece741fe0d3fabfe9d5b4d373755ebed13dc6840cfa3283b9ea46ec8b95c434f253ae86998182e9cc0e95ee64f323fc74b0 X = 0x1320eedad4745121793a7eaf732b0b4498f7cb456cac8cf45a1f66f0 Nonce = 66ed8d8934633f4125f593cf1b1d3745c4db1f15dde60cf46ca1c7f2 Signature = 80199485a3a96447b39f7679cd47412a78675ba17dcbd10465dc5b48a251fd9f136a3cb0dd0bc80659ae032e4a761ba7045da0034553fb8c Msg = bfc073fdda63c5fccaa0ca8770c293e8154e7aec56128bbac4fdbd541d602216ebf7ca1e02b514d6e396f20683802ba3f334310a9226576926e3bb19ceee27738d13377cbafeb09d091043501702a07aa31d1f29d50ddc55adcf16ffd40578e734a4e6cb6535f26ad48e0c62ad90e79720000e87d419e92dca3e11f943655b03 X = 0xe18821329447d3f65ba7279e96bd4624ffa1b32b90f6e8331b1e876d Nonce = a4c1eb402a2fb3af26e0e14a3d2fc8ed3bc1a8b2475270356a79fdd3 Signature = d478b68733d8ad44be46766e7b66af782fbdc7ff7ed0b191176da98a5eae9160ccf71fd1d359d89cecce72ef8afaeee2365f6ba828aa450a Msg = 08079955d1a1f33728128c73673ec9f21a6ce138dcab5adc4dc068e6ab57314b9fbd8b013123b2fdafa9524fbdd0288777a233de8055cccfad83046ada6a19f01c47817496667bba8fc8b9456fc0e044a562d931dab1adcb66af8b66325bdf28d83ded3e2937958ccd19da540d70ef2c189f55a506c9c0d63406394c5bd3823b X = 0xf73e030d5a696b358986d3efaca121cf71f775f8835a21e6135145d7 Nonce = e3cc786c1288ea567836c51d6d69dd0cab5c015987d936ccc3a4beb3 Signature = f1234da71761b7a0f49e661a419d2a739bdc4544bf87690e3d2f96db096d16bf8020c3d3c233894ad8eb81206010e62c6e692a215e088fd4 Msg = 23900b768f6cd42b8a8df0dcbc9cb5daec8de36b9d5c619adcc1ba2b649103d5af123746cdf19c3fd0665a6fb9338156182aa06181e3c6e37ce56979612af2927440424f89cef43fc754854b8a5c43370808cf5f9929cf47712512ce2f8a2a20d2e9f568c2848b27dfbe09142843c83905ffa5da3b15501761b03dbc2c5398b6 X = 0x7a0789323f8741c157a1753ae165ecaf8e8b03a60561f8b80cee467c Nonce = d169f04f05b60c625cda864d187938863964dab7bb3b9dfc04b05519 Signature = e4a51be686a764b709da23ab48b1985e153c6ee238d945e743907afc118a8f1ffe3cd556ce6345bd1a398dd9cc3729b7fd6d8af9bfd82f40 Msg = 1eb28c0bcdd18f73e347f957ece15b4cc83a771b0877e1feaac38e24028fb38ccea8b54ee017dc7c3d5a1327bc6f40b294aa65d7dc487f278846cd101ee84202f14b38aa2c275046aa2577f65ebaea41cd383e8def2fd0b4444dcf426fa75c4082cd7fa035cdb1e0d34a3c79d42130f5b0273eae75bc701dda3aebe7358f41b5 X = 0x78e795d0edb11fd9e28dc26b21e751aa89bea0d87932ef11c95c0e18 Nonce = 36f7c0f76808b826a0a974a1fd6e155e00a73f1d34674a8f88be405a Signature = 3e319444438bc2cc92f323ea842cb402b3c3c2448c89869ef7998edb3420cc38f058f41c31e71f4b1ad488f801111c73541de69fcee60695 Msg = efab51855407438fd5c250670366bca3c026ecec4a59394f00d8a4b51746d0c4564366656d507e3e13e62fe7abeb976b8859895848dbaecf6582f1898ea06f00d4247702ed9721bd375aa83ae4c67c2eaa6e080777ea5ecf2cf787d785389560ac91cf63a52f0373c3185e18a3b8a466e21b61a239f1b77624eb1acacc76c4e1 X = 0xbee02d8bc5bffb3fd3b4c9d6f686409f02662d10150d1e58d689966a Nonce = 59f1450d857b40e5552a4b8cd4ab0df2f01716635d172c1106840f21 Signature = a206d8398a16a991bc217f77f23c6f648384f254f255a8a876404444eb1169cb5b1423dc0bfaffe565ae57f986e00de06405e3e7b605862e Msg = 31c29ca10279a417f0cc9b1382cf54dbfdfc89f2e6ef08c403c11f580cbf8674b141ed1a417563282d99a55fc616d836421cde9424815c95e7fb7668bf3f137b29937f14882d74e034b732d78d91af7721aac4950734f5fa5d4b4d35534974f8cab6d2e6dca75ddb57e99148c8a59df9fc5bcd723e546e8356f671cf2f65640a X = 0xdc0ddf6e501418bb8eafc5d7ccc143369e2aa441df8fc57d5f94a738 Nonce = ff0e5cae2671db7a1b90e22c63e7570bdd27352d45bac31e338debe0 Signature = 5bc0b4998481ecbd3b6609184a84ca41d69b08c37138097f559259f80df8828eb1ca85e46405b94e1a2972c34c5e620a54e2f640f04aecc5 Msg = 8db476f92e332519c1a0ece5d8deded6efbd2d8e8784eea0a6b4c3b4296c35f5f8de4317e5c1627b91fb1973fee86c06e4992aa5a20cb7475c8808ff1da354d07a488dffa7838c6ec1e3f99e3acba831f27bee8434eeda3eb36d0c6df3658883cd40068b1bed841310f6eb38d4a3d07d85848770ff7933c054cd8b34662660b1 X = 0x229d89b2fcf8441ffc95ebb2ac2ef156e25825782044b2b8bd6a3e01 Nonce = 3b18ca6ec8e8e255ac88f64302745ca0b73ff94b2b2d48be95b4aaee Signature = fa94fd8b827c06115c1eefd50afc02ce5926ee0e789667783c01c34bedf766a66973cfc33e4159966c07321a7f6549c3c60e8586ef41402b Msg = fcb272c828fe8fd3c6f8de9410c7b6e2b36717c1b0e5e359e9109bd7fc378978aa98182a9d99961898ed88999b050d3b64d1457d7a899d6d273b9f4dde2aafa36d76329d62509043c338f265fc4c7d938459b7fa3b230a9f6cb632b61489546bb4181a5ad7f0d7369b8caced48eb374b075b2b325bc86add0f3b680cd9e80acd X = 0x97d747068147c0393a0bb5c159e2c9f1bd538f6204823294883abe28 Nonce = c1a2ec1ef16cfd5107c892790daefbed061be78bd8576696b60f64d5 Signature = 18c908541843fcdac99b9ff6bb397f3f8094d16b42670216e4eaa2d7c107a8a508ff57c5d4f78f86cc37e129c864d1c44ed5e73909613b74 # [P-224,SHA-512] Group = secp224r1 Hash = SHA-512 Msg = 7522492bdb916a597b8121f3e5c273b1d2800ef8c1db4f7dcbae633b60d7da5193ba53a63d7a377b351897c3b24903ae1cd1994211b259be3e6ae2cbc8970e4957fdf782c7d1bc7a91c80c8ef65468d4ef35428f26e2940ae8b0bd9b8074236bf6c00d0ebe83f9ddb2ade0f835138d39f33b59f244e0037c171f1ba7045a96f5 X = 0xba5374541c13597bded6880849184a593d69d3d4f0b1cb4d0919cbd6 Nonce = 187ed1f45c466cbafcd4b9577fb222408c011225dcccfd20f08b8d89 Signature = f83d54945997584c923c09662c34cf9ad1e987da8bfd9be600e7a0984ff2dba9dba992c98a095b1144a539310e1a570e20c88b7d0aa1955c Msg = 61097114ff855c3e34a62d9b853f8982d35f29cfa4a89893badbca7849e5fb437a1a38d6451bf0ca5a0d528e352b8e4b57f2ea359a7fc8841d49dd3e570f9b016f14156b0bbc4be822e260bd147ec081454969e11cb0034b7450ef4deb7ed6edb977e2f4ed60121aa095fb0ab40240dc329ecc917f5c64b4410612af065ee9dd X = 0x1e27187134d0a63542adf4665fba22f00cfc7b0a1e02effe913ceedc Nonce = 34cb597deae9a3b1cada937abcd247161b19b2b336b20e2e42ae01f1 Signature = 58177ba46fb291490b39368774accf72736412c1fb5ee0f27b9b1e0258337d78b95a080bfcabb5809bee012501b4da84b8ef310a4628f11c Msg = dd09ae6c982bb1440ca175a87766fefeacc49393ff797c446200662744f37a6e30c5d33ba70cbd8f12277fd6cc0704c17478bbab2a3047469e9618e3c340a9c8caaff5ce7c8a4d90ecae6a9b84b813419dec14460298e7521c9b7fdb7a2089328005bd51d57f92a1bcbeecd34aa40482b549e006bbf6c4ce66d34a22dda4e0e0 X = 0x0905b40e6c29bfcbf55e04266f68f10ca8d3905001d68bb61a27749b Nonce = dc82840d147f893497a82f023d7d2cbf0a3a5b2ac6cc1b9b23e504be Signature = 583af080e0ec7c1ba5a491a84889b7b7b11ccfe18927c7c219b11757b23700035349df25d839f0973bef78a7515287de6c83707907074fa6 Msg = 37a73e2774d3b274db426c89b945696daa96035031f72cea01894b24508c7f81961ec254d36ed6a0f448e11cf7950af769dc6cd2c47e52c6caf0ea92c270974f0214b4db436c36a60fb722060a6bb544462a82e1714f5906ec32886f7d59ebf289541c3a00ec1e004892ef2b1286a0194f55d083c6ec92c64b8fd1452e1c68ba X = 0xafbaede5d75e4f241dd5b53220f3f5b9c1aa1d5d298e2d43236452dc Nonce = 0fbbe7b40136c81a8fb894498d5502157a1cf5a89d0643de92cd38f6 Signature = 24f3f457c7b72b7e759d5a8afbf330e31c5d8d2e36f92c0e79c5d87d36fd1193def34f12a960740fd79fb38bf2b480726ccad540eb42cdf8 Msg = 9dc2046ffdc6804544db964481abe5d2d276a2a9eeec4c7ad40215b1de23561d402db69bd0f6eec2254711eea4487c64d9a6b62c3ebaf5ffa8db6e7e3a6e17154d126967a47a853a6f8339bdca9be306a13c7f992ded7619b0da59909a49b1e0930360e05b47f18628a36d69b2f87f2bfddd6a5d4a72f84dc76dbdd43f3a6a35 X = 0x950b07b0c2b7539a21b5135bfede214733f2e009647d38d8b21d760c Nonce = 83e110d0d1e700d2f36543028737d2a2f1474aa3b4b28998a39e4793 Signature = 2685265bc878e85d10ab13293dec190881a57c4a467f8fc2170432ea80a347bb49036522369339bd6485a967cdda818915d8eb947302fcf9 Msg = d9c6847fce688c5e7525a1098b545cb6c15dcd21a02761fc82fc664372a667390680135f91c01a2fa5430c634b1a6d1cd6002d8aa021e7bf5956a7901c2f81bc25d502ba5f55a55f30c0323dc68205cbefec0538e68654e7b327ac1743641896c3e740d8f66f400902b304eafaa4e0d8cffae140536f0922444cc3216a675697 X = 0x015bd9f5dfef393b431c3c7fced24385d861ccb563542574a5d2a9bc Nonce = e2374350f47c08f3c1359d4edf87e61d1ba4e7dd1540d8d9062efa79 Signature = e12dc088d2bc032bb214c77d0e0fb749fc8e61ebe1ed72996f1084b60ab58aa31e0bba5fbc76855e6549f1036fba0a589aeab978ab01b8fb Msg = 69df8a01b66f04930efd2012ff2243874f256ca8758145d2a9e4ecc84d0dbdbd0dc494ae06db0ccbe819918137c90957114558580d6623efbafdd342b38dad9f08708084d32f874fba04782ce26aaab78de2102ad171f8a8f2b30b5bd3d55fdac5fa3acd6f7def7e61c2533938572b331ba6d1c02bd74bfdbf7337ade8f4a190 X = 0x0a3c259df933247445acffb6d8265b601d597fb9997dc2a1eb4deef4 Nonce = 8bf5859665b6a23e6b05a311580f60187ba1c4ae89e44877fb48af66 Signature = 653675fb993c3fa9e57b32e33029ec230b966e8077c72c1ec90ddefc792723bf87e315147cd4303de7f1dfe95cd7658ebb95c38c1a196140 Msg = 927524982b8d60777c1105c86fac05f634abf58c73f84fb95d81ba0b86e1e43592c4fcad2e395a40fbe7005697d86088e2fb3bb7287eb3f917d4f2dc281f5cbe65d05b4f9623bca849b10a03beca6aa2056a12ebb91cf257ac448c5e9a78f8349a6a29b17c8978bef43a443cbb8a149eb23f794844fc41693f2dbb97181444be X = 0xa1c8ef463f9e7e3dd63e677412f87cf9ea4ac9a6a2dae629da5b9916 Nonce = 82f55a25d3ed6e47c22a6eed0fa52ed0818b87d6ea7950281dfefc09 Signature = 16305a46a3f6f9e216ef8f6a6f5f0760d064a885657c864e1c1ea03558fd97050bfbca6f87e64e1458c4ad80bae26e280356da344ad3b25d Msg = 5f9042283561e7f19a436d01c7ef5a950a6d77ede5629cd7e43c0a5d58e8c5673c37945a453291d12938253c71dbe12c8b022ba7276eda6be034ef5ec1ec77dbd1e08f0d7b8e7725b7ec671c075e008a20f77f4ab266f97079b0aa6337df59a33b881954084057b21f294dd14bcb0869a4a6f1f597955ec7bf9d19bb3537a66a X = 0xfa511dbf6fef7e5e9c73e4555eb75d435f7884322d9faf5d78cacc0b Nonce = a37d665fe4314aa4cd03eb8e6a1f366b43e11fdb419c96b48f787b62 Signature = 05e4909bcc172ab4140be291aad4660e375032bce2d762b6269ba764e347a1c9d3670690e1d8d1d4cd9579848f442199c10526488da5cebf Msg = c2ae5573d3bf396523bfb703db8502fd0760cd1be528f6ddbfb95aad399e0b19f3bd9e0fabdb05d49e3f893dffec5b627c9c2f7ad5f32e92e4e27a38cb5c28657657377fdfa1b66cd7ac3d15c6d49df92d284db99f69744f37dc7cb4e7d52920fdb200a7942623a7057ba82e467dcccaa5da416b48510d8364446a6a5e2a5aa8 X = 0xa58bd53646400a646f0e4208320dc679a9664d1c6bfb27fdc8eac7ea Nonce = 42c5b6f87d3bb1ed74f5ee8398d8f8c61e9e50ffa7a1da12d39893f9 Signature = 5c0e5c6f057de1e99ef5d237a60d7a07fa9a42b120a82f573d9fb7b22fffc0bf550bd2f650fed085a84501cacfa6a1bb984df1f9237eaa59 Msg = 03c1a1cd30a039d0dcb22fee2450a7fa79495a0d0f4f43d2de4d75bce003c0334a8860f5c164dbd94888a9f751235a3e570d31070e3e1293a7be616af7176600585d36ac013600157d2569d491da4b8a3bf3630c26e0b9925412189f50b0ae6f04c86477932e2ecd8c3546106ae1ebc684cc3adb27ed665eddece886adea4ce3 X = 0x64bd4452b572cc95510ac2e572f41136299ff17f6e8448f4ffb571d0 Nonce = eaf76ee4d7e00d13d8a6d03dffd07ad9a8bb6dc8176c9f93059b1b7f Signature = cf5058e2a6cf5e61a138b013eb292f38a1b9f07239ae5941dbce8919d14198621650d985d270bc997da6e78588fd0ef843b874c66a3de3c3 Msg = 888f6d9bc7c86c0079fbfd42d8c08d6958f40f6e570fb0b1f03d2f8f8a63df4fcc87b379a222cf835820a999d34996e08961f13b86b075e7fd1c303cd3baa44de42168561589012f7e5300da4f8bdf470c07119a5d9f7ba7293568cd7c6a1b7fc1e41cda40bed7d46e5a28af67ae2aabfefe67a86a1c601e6f5ee543e09bd7b6 X = 0x7f3edb710df9d982f486233d0c176aa88f5a0ee81efa9b8145020294 Nonce = 94db7ef9a232593091eb9a74f289529c7e0d7fef21f80b3c8556b75e Signature = a971f45bab10b1d16d7234ca8e4ec987da20d9e867f28aa063296e23e38c538d65a7e1a28fd3ec53f015a7e5beb60e9d309f1e3ba4b2c3d2 Msg = 48453340f1317769e6ee6e103153714365731163dc18f84e9f2fa4b120f9c5a9645ee2f9b66c84c26d95912b422b009b64af96aa418b2427a4209f2e7513ba8e43ec8cf20b34e7529b22eb1199545afe9a9f7d9bcb320aec9ee0162f91c0d1dd9674c9c284f25199c5e109f6f84d7ed0d269cc6413edb81bc2c83e37d644d8b9 X = 0xb569f8296ff1d9cc01fffd9919016e5730c1858bdb7b99527153751a Nonce = ae61523866a8f43e6cdd42ba27a34ed06527e8a5842901a64c393f76 Signature = c2732a4e0815f9f785500e80147e9486994446beccf8a6a352b975856ecaece6487d7920e398f7f951ab7c7aba5832dabf03704106ad1244 Msg = 4bdfd3b91d83108409ad765b256e0c9b9937ecf647f8e6f9fc807e2e72af8246178b3fe046b4ea10170450d71a4eec790ecb05f03d7077341de26c4db7eeae24d55c9a9093e837dfdb38168fe8230cb9605825a1282fecd741989bfcdb34678fe077477927f66bd26d003e5dda22043341a14dd31841ba483ad5ce2701e0f68e X = 0x41a4dd8eee39232b728516e2f21e66011e7426a6b25986c3ffa237e4 Nonce = 827d4999da81fa920c8492ccc1e2d5cdafed9754cf7382a859952071 Signature = 89c61da7422ccd676baec07e2185c12e947a2374eede87847304be6c2685379624717ea28422e8d001c090405a130b4ef9f1ac726c3ca502 Msg = e6cdee8558bc1eacc24e82f0624ce8d02cc8d925b4dd3dec3a72f4a4e0fb76076bfa3ef2e2c33bdd7c27b322bdc09bbfee8fe46f75dbd7bbd2af09690b7137943efe21706e0a1b6d3089540fc58d85ddb55ea836616db573e36c521be008893f40a0a7c349602cc178ea43be59d31ec6449e7ff2c5379379f7d7645134df1bc3 X = 0x67fa50569257c8cc89ac0325db4902003a62f30b917f53e4035a7e04 Nonce = 557cb45fd3a30b3bdbf08c56eabbd4478736024aaa52bf8448096453 Signature = 8e92cf7a674aa5f7542dd95c695589a05747431692edd04804299b8faf4908b41f8180b71a6ff10fd51f3d143147af6ddddf7534d3284ed9 # [P-256,SHA-224] Group = secp256r1 Hash = SHA-224 Msg = ff624d0ba02c7b6370c1622eec3fa2186ea681d1659e0a845448e777b75a8e77a77bb26e5733179d58ef9bc8a4e8b6971aef2539f77ab0963a3415bbd6258339bd1bf55de65db520c63f5b8eab3d55debd05e9494212170f5d65b3286b8b668705b1e2b2b5568610617abb51d2dd0cb450ef59df4b907da90cfa7b268de8c4c2 X = 0x708309a7449e156b0db70e5b52e606c7e094ed676ce8953bf6c14757c826f590 Nonce = 58f741771620bdc428e91a32d86d230873e9140336fcfb1e122892ee1d501bdc Signature = 4a19274429e40522234b8785dc25fc524f179dcc95ff09b3c9770fc71f54ca0d58982b79a65b7320f5b92d13bdaecdd1259e760f0f718ba933fd098f6f75d4b7 Msg = 9155e91fd9155eeed15afd83487ea1a3af04c5998b77c0fe8c43dcc479440a8a9a89efe883d9385cb9edfde10b43bce61fb63669935ad39419cf29ef3a936931733bfc2378e253e73b7ae9a3ec7a6a7932ab10f1e5b94d05160c053988f3bdc9167155d069337d42c9a7056619efc031fa5ec7310d29bd28980b1e3559757578 X = 0x90c5386100b137a75b0bb495002b28697a451add2f1f22cb65f735e8aaeace98 Nonce = 36f853b5c54b1ec61588c9c6137eb56e7a708f09c57513093e4ecf6d739900e5 Signature = 38b29558511061cfabdc8e5bb65ac2976d1aa2ba9a5deab8074097b2172bb9ad0de2cde610502b6e03c0b23602eafbcd3faf886c81d111d156b7aa550f5bcd51 Msg = b242a7586a1383368a33c88264889adfa3be45422fbef4a2df4e3c5325a9c7757017e0d5cf4bbf4de7f99d189f81f1fd2f0dd645574d1eb0d547eead9375677819297c1abe62526ae29fc54cdd11bfe17714f2fbd2d0d0e8d297ff98535980482dd5c1ebdc5a7274aabf1382c9f2315ca61391e3943856e4c5e616c2f1f7be0d X = 0xa3a43cece9c1abeff81099fb344d01f7d8df66447b95a667ee368f924bccf870 Nonce = a0d9a7a245bd9b9aa86cecb89341c9de2e4f9b5d095a8150826c7ba7fb3e7df7 Signature = b02a440add66a9ff9c3c0e9acf1be678f6bd48a10cbdec2ad6d186ffe05f3f2aa98bea42aec56a1fcecec00a1cc69b01fcbcf5de7ac1b2f2dcc09b6db064f92b Msg = b64005da76b24715880af94dba379acc25a047b06066c9bedc8f17b8c74e74f4fc720d9f4ef0e2a659e0756931c080587ebdcd0f85e819aea6dacb327a9d96496da53ea21aef3b2e793a9c0def5196acec99891f46ead78a85bc7ab644765781d3543da9fbf9fec916dca975ef3b4271e50ecc68bf79b2d8935e2b25fc063358 X = 0x7bbc8ff13f6f921f21e949b224c16b7176c5984d312b671cf6c2e4841135fc7f Nonce = 21c942f3b487accbf7fadc1c4b7a6c7567ce876c195022459fa1ebf6d04ffbaa Signature = 2e6cc883b8acc904ee9691ef4a9f1f5a9e5fbfde847cda3be833f949fb9c71822ac48f7a930912131a8b4e3ab495307817c465d638c2a9ea5ae9e2808806e20a Msg = fe6e1ea477640655eaa1f6e3352d4bce53eb3d95424df7f238e93d8531da8f36bc35fa6be4bf5a6a382e06e855139eb617a9cc9376b4dafacbd80876343b12628619d7cbe1bff6757e3706111ed53898c0219823adbc044eaf8c6ad449df8f6aab9d444dadb5c3380eec0d91694df5fc4b30280d4b87d27e67ae58a1df828963 X = 0xdaf5ec7a4eebc20d9485796c355b4a65ad254fe19b998d0507e91ea24135f45d Nonce = 343251dffa56e6a612fec7b078f9c3819eab402a72686b894a47a08fd97e6c23 Signature = 775e25a296bd259510ae9375f548997bec8a744900022945281dc8c4d94f2b5bd87592ceab773ae103daebbb56a04144aaccb1e14efc1024dc36c0e382df1f70 Msg = 907c0c00dc080a688548957b5b8b1f33ba378de1368023dcad43242411f554eb7d392d3e5c1668fad3944ff9634105343d83b8c85d2a988da5f5dc60ee0518327caed6dd5cf4e9bc6222deb46d00abde745f9b71d6e7aee6c7fdfc9ed053f2c0b611d4c6863088bd012ea9810ee94f8e58905970ebd07353f1f409a371ed03e3 X = 0x8729a8396f262dabd991aa404cc1753581cea405f0d19222a0b3f210de8ee3c5 Nonce = 6de9e21f0b2cacc1762b3558fd44d3cf156b85dbef430dd28d59713bfb9cfa0b Signature = a754b42720e71925d51fcef76151405a3696cc8f9fc9ca7b46d0b16edd7fb699603924780439cc16ac4cf97c2c3065bc95353aa9179d0ab5f0322ca82f851cf2 Msg = 771c4d7bce05610a3e71b272096b57f0d1efcce33a1cb4f714d6ebc0865b2773ec5eedc25fae81dee1d256474dbd9676623614c150916e6ed92ce4430b26037d28fa5252ef6b10c09dc2f7ee5a36a1ea7897b69f389d9f5075e271d92f4eb97b148f3abcb1e5be0b4feb8278613d18abf6da60bfe448238aa04d7f11b71f44c5 X = 0xf1b62413935fc589ad2280f6892599ad994dae8ca3655ed4f7318cc89b61aa96 Nonce = 7a33eeb9f469afd55de2fb786847a1d3e7797929305c0f90d953b6f143bb8fc6 Signature = 96d1c9399948254ea381631fc0f43ea808110506db8aacf081df5535ac5eb8ad73bf3691260dddd9997c97313f2a70783eacf8d15bdfb34bb13025cdfae72f70 Msg = a3b2825235718fc679b942e8ac38fb4f54415a213c65875b5453d18ca012320ddfbbc58b991eaebadfc2d1a28d4f0cd82652b12e4d5bfda89eda3be12ac52188e38e8cce32a264a300c0e463631f525ae501348594f980392c76b4a12ddc88e5ca086cb8685d03895919a8627725a3e00c4728e2b7c6f6a14fc342b2937fc3dd X = 0x4caaa26f93f009682bbba6db6b265aec17b7ec1542bda458e8550b9e68eed18d Nonce = c0d37142dc8b0d614fad20c4d35af6eb819e259e513ddeac1e1c273e7e1dc1bb Signature = 25dd8e4086c62a40d2a310e2f90f6af5cb7e677b4dfdb4dc4e99e23ea2f0e6dc90ad62c179b0c9d61f521dde1cd762bfd224b5525c39c3706f2549313ddb4f39 Msg = 3e6e2a9bffd729ee5d4807849cd4250021d8184cda723df6ab0e5c939d39237c8e58af9d869fe62d3c97b3298a99e891e5e11aa68b11a087573a40a3e83c7965e7910d72f81cad0f42accc5c25a4fd3cdd8cee63757bbbfbdae98be2bc867d3bcb1333c4632cb0a55dffeb77d8b119c466cd889ec468454fabe6fbee7102deaf X = 0x7af4b150bb7167cb68037f280d0823ce5320c01a92b1b56ee1b88547481b1de9 Nonce = 98edd59fafbcaee5f64e84eb5ed59fff45d14aabada47cee2fa674377173627a Signature = 261a1cdb0fd93c0fb06ea6068b6b03c330a12f621a7eba76682a1d152c0e8d087ca049bad54feee101d6db807635ffb8bdb05a38e445c8c3d65d60df143514c5 Msg = 52e5c308e70329a17c71eaedb66bbee303c8ec48a6f1a2efb235d308563cd58553d434e12f353227a9ea28608ec9c820ed83c95124e7a886f7e832a2de1032e78dc059208f9ec354170b2b1cab992b52ac01e6c0e4e1b0112686962edc53ab226dafcc9fc7baed2cd9307160e8572edb125935db49289b178f35a8ad23f4f801 X = 0x52ad53e849e30bec0e6345c3e9d98ebc808b19496c1ef16d72ab4a00bbb8c634 Nonce = 8650c30712fc253610884fbba4a332a4574d4b7822f7776cab1df8f5fa05442a Signature = a18194c7ac5829afc408d78dde19542837e7be82706c3941b2d9c5e036bb51e0188ead1cdf7c1d21114ff56d0421ffd501ab978ef58337462c0fa736d86299af Msg = d3e9e82051d4c84d699453c9ff44c7c09f6523bb92232bcf30bf3c380224249de2964e871d56a364d6955c81ef91d06482a6c7c61bc70f66ef22fad128d15416e7174312619134f968f1009f92cbf99248932efb533ff113fb6d949e21d6b80dfbbe69010c8d1ccb0f3808ea309bb0bac1a222168c95b088847e613749b19d04 X = 0x80754962a864be1803bc441fa331e126005bfc6d8b09ed38b7e69d9a030a5d27 Nonce = 738e050aeefe54ecba5be5f93a97bbcb7557d701f9da2d7e88483454b97b55a8 Signature = 8cb9f41dfdcb9604e0725ac9b78fc0db916dc071186ee982f6dba3da36f02efa5c87fe868fd4282fb114f5d70e9590a10a5d35cedf3ff6402ba5c4344738a32e Msg = 968951c2c1918436fe19fa2fe2152656a08f9a6b8aa6201920f1b424da98cee71928897ff087620cc5c551320b1e75a1e98d7d98a5bd5361c9393759614a6087cc0f7fb01fcb173783eb4c4c23961a8231ac4a07d72e683b0c1bd4c51ef1b031df875e7b8d5a6e0628949f5b8f157f43dccaea3b2a4fc11181e6b451e06ceb37 X = 0xcfa8c8bd810eb0d73585f36280ecdd296ee098511be8ad5eac68984eca8eb19d Nonce = 2d6b449bb38b543d6b6d34ff8cb053f5e5b337f949b069b21f421995ebb28823 Signature = 5e89d3c9b103c2fa3cb8cebeec23640acda0257d63ffbe2d509bfc49fab1dca6d70c5b1eeb29e016af9925798d24e166c23d58fedd2f1a3bbdb1ef78cdbfb63a Msg = 78048628932e1c1cdd1e70932bd7b76f704ba08d7e7d825d3de763bf1a062315f4af16eccefe0b6ebadccaf403d013f50833ce2c54e24eea8345e25f93b69bb048988d102240225ceacf5003e2abdcc90299f4bf2c101585d36ecdd7a155953c674789d070480d1ef47cc7858e97a6d87c41c6922a00ea12539f251826e141b4 X = 0xb2021e2665ce543b7feadd0cd5a4bd57ffcc5b32deb860b4d736d9880855da3c Nonce = b15bbce4b382145de7ecd670d947e77555ef7cd1693bd53c694e2b52b04d10e1 Signature = 9d086dcd22da165a43091991bede9c1c14515e656633cb759ec2c17f51c3525323595ad1cb714559faaecaf946beb9a71e584616030ceaed8a8470f4bf62768f Msg = 9b0800c443e693067591737fdbcf0966fdfa50872d41d0c189d87cbc34c2771ee5e1255fd604f09fcf167fda16437c245d299147299c69046895d22482db29aba37ff57f756716cd3d6223077f747c4caffbecc0a7c9dfaaafd9a9817470ded8777e6355838ac54d11b2f0fc3f43668ff949cc31de0c2d15af5ef17884e4d66a X = 0x0c9bce6a568ca239395fc3552755575cbcdddb1d89f6f5ab354517a057b17b48 Nonce = d414f1525cdcc41eba1652de017c034ebcc7946cb2efe4713d09f67c85b83153 Signature = 84db02c678f9a21208cec8564d145a35ba8c6f26b4eb7e19522e439720dae44c537c564da0d2dc5ac4376c5f0ca3b628d01d48df47a83d842c927e4d6db1e16d Msg = fc3b8291c172dae635a6859f525beaf01cf683765d7c86f1a4d768df7cae055f639eccc08d7a0272394d949f82d5e12d69c08e2483e11a1d28a4c61f18193106e12e5de4a9d0b4bf341e2acd6b715dc83ae5ff63328f8346f35521ca378b311299947f63ec593a5e32e6bd11ec4edb0e75302a9f54d21226d23314729e061016 X = 0x1daa385ec7c7f8a09adfcaea42801a4de4c889fb5c6eb4e92bc611d596d68e3f Nonce = 7707db348ee6f60365b43a2a994e9b40ed56fe03c2c31c7e781bc4ffadcba760 Signature = 5d95c385eeba0f15db0b80ae151912409128c9c80e554246067b8f6a36d85ea5db5d8a1e345f883e4fcb3871276f170b783c1a1e9da6b6615913368a8526f1c3 # [P-256,SHA-256] Group = secp256r1 Hash = SHA-256 Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 X = 0x519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 Nonce = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de Signature = f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 Msg = c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1 X = 0x0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813 Nonce = 6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6 Signature = 976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932 Msg = 3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee X = 0xe283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef Nonce = ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2 Signature = 35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96 Msg = 0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30 X = 0xa3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07 Nonce = 24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18 Signature = d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884cab46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89 Msg = dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7 X = 0x53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d Nonce = 5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4 Signature = 18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c38718260477c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c Msg = 600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71 X = 0x4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d Nonce = e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab Signature = 8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb Msg = dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b X = 0x78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab Nonce = 295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77 Signature = c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b25484a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30 Msg = 51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b X = 0x80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a Nonce = 7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22 Signature = 9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f Msg = 558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8 X = 0x5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881 Nonce = 2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9 Signature = 2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199 Msg = 4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e X = 0xf73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308 Nonce = 62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615 Signature = 1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430 Msg = f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a X = 0xb20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906 Nonce = 72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f Signature = 9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c Msg = 3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4 X = 0xd4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7 Nonce = d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778 Signature = 490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7 Msg = c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7 X = 0xb58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c Nonce = e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071 Signature = e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333 Msg = 72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01 X = 0x54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1 Nonce = 646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a Signature = b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64bd7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851 Msg = 21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34 X = 0x34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1 Nonce = a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4 Signature = 542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d9626634f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f # [P-256,SHA-384] Group = secp256r1 Hash = SHA-384 Msg = e0b8596b375f3306bbc6e77a0b42f7469d7e83635990e74aa6d713594a3a24498feff5006790742d9c2e9b47d714bee932435db747c6e733e3d8de41f2f91311f2e9fd8e025651631ffd84f66732d3473fbd1627e63dc7194048ebec93c95c159b5039ab5e79e42c80b484a943f125de3da1e04e5bf9c16671ad55a1117d3306 X = 0xb6faf2c8922235c589c27368a3b3e6e2f42eb6073bf9507f19eed0746c79dced Nonce = 9980b9cdfcef3ab8e219b9827ed6afdd4dbf20bd927e9cd01f15762703487007 Signature = f5087878e212b703578f5c66f434883f3ef414dc23e2e8d8ab6a8d159ed5ad83306b4c6c20213707982dffbb30fba99b96e792163dd59dbe606e734328dd7c8a Msg = 099a0131179fff4c6928e49886d2fdb3a9f239b7dd5fa828a52cbbe3fcfabecfbba3e192159b887b5d13aa1e14e6a07ccbb21f6ad8b7e88fee6bea9b86dea40ffb962f38554056fb7c5bb486418915f7e7e9b9033fe3baaf9a069db98bc02fa8af3d3d1859a11375d6f98aa2ce632606d0800dff7f55b40f971a8586ed6b39e9 X = 0x118958fd0ff0f0b0ed11d3cf8fa664bc17cdb5fed1f4a8fc52d0b1ae30412181 Nonce = 23129a99eeda3d99a44a5778a46e8e7568b91c31fb7a8628c5d9820d4bed4a6b Signature = e446600cab1286ebc3bb332012a2f5cc33b0a5ef7291d5a62a84de5969d77946cf89b12793ee1792eb26283b48fa0bdcb45ae6f6ad4b02564bf786bb97057d5a Msg = 0fbc07ea947c946bea26afa10c51511039b94ddbc4e2e4184ca3559260da24a14522d1497ca5e77a5d1a8e86583aeea1f5d4ff9b04a6aa0de79cd88fdb85e01f171143535f2f7c23b050289d7e05cebccdd131888572534bae0061bdcc3015206b9270b0d5af9f1da2f9de91772d178a632c3261a1e7b3fb255608b3801962f9 X = 0x3e647357cd5b754fad0fdb876eaf9b1abd7b60536f383c81ce5745ec80826431 Nonce = 9beab7722f0bcb468e5f234e074170a60225255de494108459abdf603c6e8b35 Signature = c4021fb7185a07096547af1fb06932e37cf8bd90cf593dea48d48614fa237e5e7fb45d09e2172bec8d3e330aa06c43fbb5f625525485234e7714b7f6e92ba8f1 Msg = 1e38d750d936d8522e9db1873fb4996bef97f8da3c6674a1223d29263f1234a90b751785316444e9ba698bc8ab6cd010638d182c9adad4e334b2bd7529f0ae8e9a52ad60f59804b2d780ed52bdd33b0bf5400147c28b4304e5e3434505ae7ce30d4b239e7e6f0ecf058badd5b388eddbad64d24d2430dd04b4ddee98f972988f X = 0x76c17c2efc99891f3697ba4d71850e5816a1b65562cc39a13da4b6da9051b0fd Nonce = 77cffa6f9a73904306f9fcd3f6bbb37f52d71e39931bb4aec28f9b076e436ccf Signature = 4d5a9d95b0f09ce8704b0f457b39059ee606092310df65d3f8ae7a2a424cf2327d3c014ca470a73cef1d1da86f2a541148ad542fbccaf9149d1b0b030441a7eb Msg = abcf0e0f046b2e0672d1cc6c0a114905627cbbdefdf9752f0c31660aa95f2d0ede72d17919a9e9b1add3213164e0c9b5ae3c76f1a2f79d3eeb444e6741521019d8bd5ca391b28c1063347f07afcfbb705be4b52261c19ebaf1d6f054a74d86fb5d091fa7f229450996b76f0ada5f977b09b58488eebfb5f5e9539a8fd89662ab X = 0x67b9dea6a575b5103999efffce29cca688c781782a41129fdecbce76608174de Nonce = d02617f26ede3584f0afcfc89554cdfb2ae188c192092fdde3436335fafe43f1 Signature = 26fd9147d0c86440689ff2d75569795650140506970791c90ace0924b44f158600a34b00c20a8099df4b0a757cbef8fea1cb3ea7ced5fbf7e987f70b25ee6d4f Msg = dc3d4884c741a4a687593c79fb4e35c5c13c781dca16db561d7e393577f7b62ca41a6e259fc1fb8d0c4e1e062517a0fdf95558b7799f20c211796167953e6372c11829beec64869d67bf3ee1f1455dd87acfbdbcc597056e7fb347a17688ad32fda7ccc3572da7677d7255c261738f07763cd45973c728c6e9adbeecadc3d961 X = 0xecf644ea9b6c3a04fdfe2de4fdcb55fdcdfcf738c0b3176575fa91515194b566 Nonce = 53291d51f68d9a12d1dcdc58892b2f786cc15f631f16997d2a49bace513557d4 Signature = a860c8b286edf973ce4ce4cf6e70dc9bbf3818c36c023a845677a9963705df8b5630f986b1c45e36e127dd7932221c4272a8cc6e255e89f0f0ca4ec3a9f76494 Msg = 719bf1911ae5b5e08f1d97b92a5089c0ab9d6f1c175ac7199086aeeaa416a17e6d6f8486c711d386f284f096296689a54d330c8efb0f5fa1c5ba128d3234a3da856c2a94667ef7103616a64c913135f4e1dc50e38daa60610f732ad1bedfcc396f87169392520314a6b6b9af6793dbabad4599525228cc7c9c32c4d8e097ddf6 X = 0x4961485cbc978f8456ec5ac7cfc9f7d9298f99415ecae69c8491b258c029bfee Nonce = 373a825b5a74b7b9e02f8d4d876b577b4c3984168d704ba9f95b19c05ed590af Signature = ef6fb386ad044b63feb7445fa16b10319018e9cea9ef42bca83bdad01992234aac1f42f652eb1786e57be01d847c81f7efa072ba566d4583af4f1551a3f76c65 Msg = 7cf19f4c851e97c5bca11a39f0074c3b7bd3274e7dd75d0447b7b84995dfc9f716bf08c25347f56fcc5e5149cb3f9cfb39d408ace5a5c47e75f7a827fa0bb9921bb5b23a6053dbe1fa2bba341ac874d9b1333fc4dc224854949f5c8d8a5fedd02fb26fdfcd3be351aec0fcbef18972956c6ec0effaf057eb4420b6d28e0c008c X = 0x587907e7f215cf0d2cb2c9e6963d45b6e535ed426c828a6ea2fb637cca4c5cbd Nonce = 6b8eb7c0d8af9456b95dd70561a0e902863e6dfa1c28d0fd4a0509f1c2a647b2 Signature = 08fabf9b57de81875bfa7a4118e3e44cfb38ec6a9b2014940207ba3b1c583038a58d199b1deba7350616230d867b2747a3459421811c291836abee715b8f67b4 Msg = b892ffabb809e98a99b0a79895445fc734fa1b6159f9cddb6d21e510708bdab6076633ac30aaef43db566c0d21f4381db46711fe3812c5ce0fb4a40e3d5d8ab24e4e82d3560c6dc7c37794ee17d4a144065ef99c8d1c88bc22ad8c4c27d85ad518fa5747ae35276fc104829d3f5c72fc2a9ea55a1c3a87007cd133263f79e405 X = 0x24b1e5676d1a9d6b645a984141a157c124531feeb92d915110aef474b1e27666 Nonce = 88794923d8943b5dbcc7a7a76503880ff7da632b0883aaa60a9fcc71bf880fd6 Signature = 6ec9a340b77fae3c7827fa96d997e92722ff2a928217b6dd3c628f3d49ae4ce6637b54bbcfb7e7d8a41ea317fcfca8ad74eb3bb6b778bc7ef9dec009281976f7 Msg = 8144e37014c95e13231cbd6fa64772771f93b44e37f7b02f592099cc146343edd4f4ec9fa1bc68d7f2e9ee78fc370443aa2803ff4ca52ee49a2f4daf2c8181ea7b8475b3a0f608fc3279d09e2d057fbe3f2ffbe5133796124781299c6da60cfe7ecea3abc30706ded2cdf18f9d788e59f2c31662df3abe01a9b12304fb8d5c8c X = 0xbce49c7b03dcdc72393b0a67cf5aa5df870f5aaa6137ada1edc7862e0981ec67 Nonce = 89e690d78a5e0d2b8ce9f7fcbf34e2605fd9584760fa7729043397612dd21f94 Signature = 07e5054c384839584624e8d730454dc27e673c4a90cbf129d88b91250341854df7e665b88614d0c5cbb3007cafe713763d81831525971f1747d92e4d1ca263a7 Msg = a3683d120807f0a030feed679785326698c3702f1983eaba1b70ddfa7f0b3188060b845e2b67ed57ee68087746710450f7427cb34655d719c0acbc09ac696adb4b22aba1b9322b7111076e67053a55f62b501a4bca0ad9d50a868f51aeeb4ef27823236f5267e8da83e143047422ce140d66e05e44dc84fb3a4506b2a5d7caa8 X = 0x73188a923bc0b289e81c3db48d826917910f1b957700f8925425c1fb27cabab9 Nonce = ec90584ab3b383b590626f36ed4f5110e49888aec7ae7a9c5ea62dd2dc378666 Signature = 13e9ad59112fde3af4163eb5c2400b5e9a602576d5869ac1c569075f08c90ff6708ac65ff2b0baaccc6dd954e2a93df46016bd04457636de06798fcc17f02be5 Msg = b1df8051b213fc5f636537e37e212eb20b2423e6467a9c7081336a870e6373fc835899d59e546c0ac668cc81ce4921e88f42e6da2a109a03b4f4e819a17c955b8d099ec6b282fb495258dca13ec779c459da909475519a3477223c06b99afbd77f9922e7cbef844b93f3ce5f50db816b2e0d8b1575d2e17a6b8db9111d6da578 X = 0xf637d55763fe819541588e0c603f288a693cc66823c6bb7b8e003bd38580ebce Nonce = 4d578f5099636234d9c1d566f1215d5d887ae5d47022be17dbf32a11a03f053b Signature = 113a933ebc4d94ce1cef781e4829df0c493b0685d39fb2048ce01b21c398dbba3005bd4ec63dbd04ce9ff0c6246ad65d27fcf62edb2b7e461589f9f0e7446ffd Msg = 0b918ede985b5c491797d0a81446b2933be312f419b212e3aae9ba5914c00af431747a9d287a7c7761e9bcbc8a12aaf9d4a76d13dad59fc742f8f218ef66eb67035220a07acc1a357c5b562ecb6b895cf725c4230412fefac72097f2c2b829ed58742d7c327cad0f1058df1bddd4ae9c6d2aba25480424308684cecd6517cdd8 X = 0x2e357d51517ff93b821f895932fddded8347f32596b812308e6f1baf7dd8a47f Nonce = be522b0940b9a40d84bf790fe6abdc252877e671f2efa63a33a65a512fc2aa5c Signature = a26b9ad775ac37ff4c7f042cdc4872c5e4e5e800485f488ddfaaed379f468090f88eae2019bebbba62b453b8ee3472ca5c67c267964cffe0cf2d2933c1723dff Msg = 0fab26fde1a4467ca930dbe513ccc3452b70313cccde2994eead2fde85c8da1db84d7d06a024c9e88629d5344224a4eae01b21a2665d5f7f36d5524bf5367d7f8b6a71ea05d413d4afde33777f0a3be49c9e6aa29ea447746a9e77ce27232a550b31dd4e7c9bc8913485f2dc83a56298051c92461fd46b14cc895c300a4fb874 X = 0x77d60cacbbac86ab89009403c97289b5900466856887d3e6112af427f7f0f50b Nonce = 06c1e692b045f425a21347ecf72833d0242906c7c1094f805566cdcb1256e394 Signature = eb173b51fb0aec318950d097e7fda5c34e529519631c3e2c9b4550b903da417dca2c13574bf1b7d56e9dc18315036a31b8bceddf3e2c2902dcb40f0cc9e31b45 Msg = 7843f157ef8566722a7d69da67de7599ee65cb3975508f70c612b3289190e364141781e0b832f2d9627122742f4b5871ceeafcd09ba5ec90cae6bcc01ae32b50f13f63918dfb5177df9797c6273b92d103c3f7a3fc2050d2b196cc872c57b77f9bdb1782d4195445fcc6236dd8bd14c8bcbc8223a6739f6a17c9a861e8c821a6 X = 0x486854e77962117f49e09378de6c9e3b3522fa752b10b2c810bf48db584d7388 Nonce = e4f77c6442eca239b01b0254e11a4182782d96f48ab521cc3d1d68df12b5a41a Signature = bdff14e4600309c2c77f79a25963a955b5b500a7b2d34cb172cd6acd52905c7bb0479cdb3df79923ec36a104a129534c5d59f622be7d613aa04530ad2507d3a2 # [P-256,SHA-512] Group = secp256r1 Hash = SHA-512 Msg = 6c8572b6a3a4a9e8e03dbeed99334d41661b8a8417074f335ab1845f6cc852adb8c01d9820fcf8e10699cc827a8fbdca2cbd46cc66e4e6b7ba41ec3efa733587e4a30ec552cd8ddab8163e148e50f4d090782897f3ddac84a41e1fcfe8c56b6152c0097b0d634b41011471ffd004f43eb4aafc038197ec6bae2b4470e869bded X = 0x9dd0d3a3d514c2a8adb162b81e3adfba3299309f7d2018f607bdb15b1a25f499 Nonce = 9106192170ccb3c64684d48287bb81bbed51b40d503462c900e5c7aae43e380a Signature = 275fa760878b4dc05e9d157fedfd8e9b1c9c861222a712748cb4b7754c043fb1699d906bb8435a05345af3b37e3b357786939e94caae257852f0503adb1e0f7e Msg = 7e3c8fe162d48cc8c5b11b5e5ebc05ebc45c439bdbc0b0902145921b8383037cb0812222031598cd1a56fa71694fbd304cc62938233465ec39c6e49f57dfe823983b6923c4e865633949183e6b90e9e06d8275f3907d97967d47b6239fe2847b7d49cf16ba69d2862083cf1bccf7afe34fdc90e21998964107b64abe6b89d126 X = 0xf9bf909b7973bf0e3dad0e43dcb2d7fa8bda49dbe6e5357f8f0e2bd119be30e6 Nonce = e547791f7185850f03d0c58419648f65b9d29cdc22ed1de2a64280220cfcafba Signature = 4782903d2aaf8b190dab5cae2223388d2d8bd845b3875d37485c54e1ded1d3d8dfb40e406bfa074f0bf832771b2b9f186e2211f0bca279644a0ca8559acf39da Msg = d5aa8ac9218ca661cd177756af6fbb5a40a3fecfd4eea6d5872fbb9a2884784aa9b5f0c023a6e0da5cf6364754ee6465b4ee2d0ddc745b02994c98427a213c849537da5a4477b3abfe02648be67f26e80b56a33150490d062aaac137aa47f11cfeddba855bab9e4e028532a563326d927f9e6e3292b1fb248ee90b6f429798db X = 0x724567d21ef682dfc6dc4d46853880cfa86fe6fea0efd51fac456f03c3d36ead Nonce = 79d6c967ed23c763ece9ca4b026218004c84dc2d4ccc86cf05c5d0f791f6279b Signature = 2ba2ea2d316f8937f184ad3028e364574d20a202e4e7513d7af57ac2456804d164fe94968d18c5967c799e0349041b9e40e6c6c92ebb475e80dd82f51cf07320 Msg = 790b06054afc9c3fc4dfe72df19dd5d68d108cfcfca6212804f6d534fd2fbe489bd8f64bf205ce04bcb50124a12ce5238fc3fe7dd76e6fa640206af52549f133d593a1bfd423ab737f3326fa79433cde293236f90d4238f0dd38ed69492ddbd9c3eae583b6325a95dec3166fe52b21658293d8c137830ef45297d67813b7a508 X = 0x29c5d54d7d1f099d50f949bfce8d6073dae059c5a19cc70834722f18a7199edd Nonce = 0508ad7774908b5705895fda5c3b7a3032bf85dab7232bf981177019f3d76460 Signature = acd9f3b63626c5f32103e90e1dd1695907b1904aa9b14f2132caef331321971b15c04a8bd6c13ed5e9961814b2f406f064670153e4d5465dcef63c1d9dd52a87 Msg = 6d549aa87afdb8bfa60d22a68e2783b27e8db46041e4df04be0c261c4734b608a96f198d1cdb8d082ae48579ec9defcf21fbc72803764a58c31e5323d5452b9fb57c8991d31749140da7ef067b18bf0d7dfbae6eefd0d8064f334bf7e9ec1e028daed4e86e17635ec2e409a3ed1238048a45882c5c57501b314e636b9bc81cbe X = 0x0d8095da1abba06b0d349c226511f642dabbf1043ad41baa4e14297afe8a3117 Nonce = 5165c54def4026ab648f7768c4f1488bcb183f6db7ffe02c7022a529a116482a Signature = ebc85fc4176b446b3384ccc62fc2526b45665561a0e7e9404ac376c90e450b598b2c09428e62c5109d17ed0cf8f9fd7c370d018a2a73f701effc9b17d04852c6 Msg = 1906e48b7f889ee3ff7ab0807a7aa88f53f4018808870bfed6372a77330c737647961324c2b4d46f6ee8b01190474951a701b048ae86579ff8e3fc889fecf926b17f98958ac7534e6e781ca2db2baa380dec766cfb2a3eca2a9d5818967d64dfab84f768d24ec122eebacaab0a4dc3a75f37331bb1c43dd8966cc09ec4945bbd X = 0x52fe57da3427b1a75cb816f61c4e8e0e0551b94c01382b1a80837940ed579e61 Nonce = 0464fe9674b01ff5bd8be21af3399fad66f90ad30f4e8ee6e2eb9bcccfd5185c Signature = f8250f073f34034c1cde58f69a85e2f5a030703ebdd4dbfb98d3b3690db7d114a9e83e05f1d6e0fef782f186bedf43684c825ac480174d48b0e4d31505e27498 Msg = 7b59fef13daf01afec35dea3276541be681c4916767f34d4e874464d20979863ee77ad0fd1635bcdf93e9f62ed69ae52ec90aab5bbf87f8951213747ccec9f38c775c1df1e9d7f735c2ce39b42edb3b0c5086247556cfea539995c5d9689765288ec600848ecf085c01ca738bbef11f5d12d4457db988b4add90be00781024ad X = 0x003d91611445919f59bfe3ca71fe0bfdeb0e39a7195e83ac03a37c7eceef0df2 Nonce = ef9df291ea27a4b45708f7608723c27d7d56b7df0599a54bc2c2fabbff373b40 Signature = 66d057fd39958b0e4932bacd70a1769bbadcb62e4470937b45497a3d4500fabb6c853b889e18b5a49ee54b54dd1aaedfdd642e30eba171c5cab677f0df9e7318 Msg = 041a6767a935dc3d8985eb4e608b0cbfebe7f93789d4200bcfe595277ac2b0f402889b580b72def5da778a680fd380c955421f626d52dd9a83ea180187b850e1b72a4ec6dd63235e598fd15a9b19f8ce9aec1d23f0bd6ea4d92360d50f951152bc9a01354732ba0cf90aaed33c307c1de8fa3d14f9489151b8377b57c7215f0b X = 0x48f13d393899cd835c4193670ec62f28e4c4903e0bbe5817bf0996831a720bb7 Nonce = efed736e627899fea944007eea39a4a63c0c2e26491cd12adb546be3e5c68f7d Signature = cf7fc24bdaa09ac0cca8497e13298b961380668613c7493954048c06385a7044f38b1c8306cf82ab76ee3a772b14416b49993fe11f986e9b0f0593c52ec91525 Msg = 7905a9036e022c78b2c9efd40b77b0a194fbc1d45462779b0b76ad30dc52c564e48a493d8249a061e62f26f453ba566538a4d43c64fb9fdbd1f36409316433c6f074e1b47b544a847de25fc67d81ac801ed9f7371a43da39001c90766f943e629d74d0436ba1240c3d7fab990d586a6d6ef1771786722df56448815f2feda48f X = 0x95c99cf9ec26480275f23de419e41bb779590f0eab5cf9095d37dd70cb75e870 Nonce = 4c08dd0f8b72ae9c674e1e448d4e2afe3a1ee69927fa23bbff3716f0b99553b7 Signature = f2bc35eb1b8488b9e8d4a1dbb200e1abcb855458e1557dc1bf988278a174eb3bed9a2ec043a1d578e8eba6f57217976310e8674385ad2da08d6146c629de1cd9 Msg = cf25e4642d4f39d15afb7aec79469d82fc9aedb8f89964e79b749a852d931d37436502804e39555f5a3c75dd958fd5291ada647c1a5e38fe7b1048f16f2b711fdd5d39acc0812ca65bd50d7f8119f2fd195ab16633503a78ee9102c1f9c4c22568e0b54bd4fa3f5ff7b49160bf23e7e2231b1ebebbdaf0e4a7d4484158a87e07 X = 0xe15e835d0e2217bc7c6f05a498f20af1cd56f2f165c23d225eb3360aa2c5cbcf Nonce = c9f621441c235fc47ec34eef4c08625df1ec74918e1f86075b753f2589f4c60b Signature = a70d1a2d555d599bfb8c9b1f0d43725341151d17a8d0845fa56f3563703528a74e05c45adf41783e394a5312f86e66871c4be4896948c85966879d5c66d54b37 Msg = 7562c445b35883cc937be6349b4cefc3556a80255d70f09e28c3f393daac19442a7eecedcdfbe8f7628e30cd8939537ec56d5c9645d43340eb4e78fc5dd4322de8a07966b262770d7ff13a071ff3dce560718e60ed3086b7e0003a6abafe91af90af86733ce8689440bf73d2aa0acfe9776036e877599acbabfcb03bb3b50faa X = 0x808c08c0d77423a6feaaffc8f98a2948f17726e67c15eeae4e672edbe388f98c Nonce = 1f6d4a905c761a53d54c362976717d0d7fc94d222bb5489e4830080a1a67535d Signature = 83404dcf8320baf206381800071e6a75160342d19743b4f176960d669dd03d073f75dcf102008b2989f81683ae45e9f1d4b67a6ef6fd5c8af44828af80e1cfb5 Msg = 051c2db8e71e44653ea1cb0afc9e0abdf12658e9e761bfb767c20c7ab4adfcb18ed9b5c372a3ac11d8a43c55f7f99b33355437891686d42362abd71db8b6d84dd694d6982f0612178a937aa934b9ac3c0794c39027bdd767841c4370666c80dbc0f8132ca27474f553d266deefd7c9dbad6d734f9006bb557567701bb7e6a7c9 X = 0xf7c6315f0081acd8f09c7a2c3ec1b7ece20180b0a6365a27dcd8f71b729558f9 Nonce = 68c299be2c0c6d52d208d5d1a9e0ffa2af19b4833271404e5876e0aa93987866 Signature = 7b195e92d2ba95911cda7570607e112d02a1c847ddaa33924734b51f5d81adab10d9f206755cef70ab5143ac43f3f8d38aea2644f31d52eaf3b472ee816e11e5 Msg = 4dcb7b62ba31b866fce7c1feedf0be1f67bf611dbc2e2e86f004422f67b3bc1839c6958eb1dc3ead137c3d7f88aa97244577a775c8021b1642a8647bba82871e3c15d0749ed343ea6cad38f123835d8ef66b0719273105e924e8685b65fd5dc430efbc35b05a6097f17ebc5943cdcd9abcba752b7f8f37027409bd6e11cd158f X = 0xf547735a9409386dbff719ce2dae03c50cb437d6b30cc7fa3ea20d9aec17e5a5 Nonce = 91bd7d97f7ed3253cedefc144771bb8acbbda6eb24f9d752bbe1dd018e1384c7 Signature = 008c1755d3df81e64e25270dbaa9396641556df7ffc7ac9add6739c38270539777df443c729b039aded5b516b1077fecdd9986402d2c4b01734ba91e055e87fc Msg = efe55737771070d5ac79236b04e3fbaf4f2e9bed187d1930680fcf1aba769674bf426310f21245006f528779347d28b8aeacd2b1d5e3456dcbf188b2be8c07f19219e4067c1e7c9714784285d8bac79a76b56f2e2676ea93994f11eb573af1d03fc8ed1118eafc7f07a82f3263c33eb85e497e18f435d4076a774f42d276c323 X = 0x26a1aa4b927a516b661986895aff58f40b78cc5d0c767eda7eaa3dbb835b5628 Nonce = f98e1933c7fad4acbe94d95c1b013e1d6931fa8f67e6dbb677b564ef7c3e56ce Signature = 15a9a5412d6a03edd71b84c121ce9a94cdd166e40da9ce4d79f1afff6a395a5386bbc2b6c63bad706ec0b093578e3f064736ec69c0dba59b9e3e7f73762a4dc3 Msg = ea95859cc13cccb37198d919803be89c2ee10befdcaf5d5afa09dcc529d333ae1e4ffd3bd8ba8642203badd7a80a3f77eeee9402eed365d53f05c1a995c536f8236ba6b6ff8897393506660cc8ea82b2163aa6a1855251c87d935e23857fe35b889427b449de7274d7754bdeace960b4303c5dd5f745a5cfd580293d6548c832 X = 0x6a5ca39aae2d45aa331f18a8598a3f2db32781f7c92efd4f64ee3bbe0c4c4e49 Nonce = dac00c462bc85bf39c31b5e01df33e2ec1569e6efcb334bf18f0951992ac6160 Signature = 6e7ff8ec7a5c48e0877224a9fa8481283de45fcbee23b4c252b0c622442c26ad3dfac320b9c873318117da6bd856000a392b815659e5aa2a6a1852ccb2501df3 # [P-384,SHA-224] Group = secp384r1 Hash = SHA-224 Msg = 39f0b25d4c15b09a0692b22fbacbb5f8aee184cb75887e2ebe0cd3be5d3815d29f9b587e10b3168c939054a89df11068e5c3fac21af742bf4c3e9512f5569674e7ad8b39042bcd73e4b7ce3e64fbea1c434ed01ad4ad8b5b569f6a0b9a1144f94097925672e59ba97bc4d33be2fa21b46c3dadbfb3a1f89afa199d4b44189938 X = 0x0af857beff08046f23b03c4299eda86490393bde88e4f74348886b200555276b93b37d4f6fdec17c0ea581a30c59c727 Nonce = e2f0ce83c5bbef3a6eccd1744f893bb52952475d2531a2854a88ff0aa9b12c65961e2e517fb334ef40e0c0d7a31ed5f5 Signature = c36e5f0d3de71411e6e519f63e0f56cff432330a04fefef2993fdb56343e49f2f7db5fcab7728acc1e33d4692553c02e0d4064399d58cd771ab9420d438757f5936c3808e97081e457bc862a0c905295dca60ee94f4537591c6c7d217453909b Msg = 5a3c80e608ed3ac75a6e45f6e94d374271a6d42b67a481860d5d309cc8b37c79cb61f1716dc8aa84cb309ef9d68eb7fc6cf4b42333f316a5c30e74198c8b340926e340c5de47674a707293c4aa2a1a2274a602f01c26b156e895499c60b38ef53fc2032e7485c168d73700d6fa14232596a0e4997854a0b05d02e351b9d3de96 X = 0x047dd5baab23f439ec23b58b7e6ff4cc37813cccb4ea73bb2308e6b82b3170edfe0e131eca50841bf1b686e651c57246 Nonce = f3922351d14f1e5af84faab12fe57ded30f185afe5547aeb3061104740ecc42a8df0c27f3877b4d855642b78938c4e05 Signature = 38e181870cb797c1f4e6598cfd032add1cb60447d33473038d06df73919f844eddd16f40f911075f8a4bacc0d924e684a58dd1ca18aa31277de66c30c3bb7a14b53705ce6c547ed2cb0e336f63c42809422efffcc722d1155f2254330a02b278 Msg = e7d974c5dbd3bfb8a2fb92fdd782f997d04be79e9713944ce13c5eb6f75dfdec811b7ee4b3859114b07f263846ae13f795eec8f3cb5b7565baff68e0fdd5e09ba8b176d5a71cb03fbc5546e6937fba560acb4db24bd42de1851432b96e8ca4078313cb849bce29c9d805258601d67cd0259e255f3048682e8fdbdda3398c3e31 X = 0x54ba9c740535574cebc41ca5dc950629674ee94730353ac521aafd1c342d3f8ac52046ed804264e1440d7fe409c45c83 Nonce = 04324bd078807f6b18507a93ee60da02031717217ee5ce569750737be912be72da087ac00f50e13fdf7249a6ae33f73e Signature = b2752aa7abc1e5a29421c9c76620bcc3049ecc97e6bc39fcca126f505a9a1bfae3bde89fb751a1aa7b66fa8db3891ef0f1c69e6d818ca7ae3a477049b46420cebd910c0a9a477fd1a67a38d628d6edaac123aebfca67c53a5c80fe454dba7a9d Msg = a670fda4d1d56c70de1d8680328043b2b7029633caf0ee59ffe1421c914bb937133d5a0f9214846b2e0b350455a74c4ab434c56de65a17139bb8212bf1c76071a37536fa29348f871dbb26baa92eb93d97e923a6d2ffd9be25cbc33075e494e6db657bd8dc053fe4e17148d8cf6e2058164f2b5766750eb01bbe7b361cdb848c X = 0xdabe87bbe95499bac23bc83c8b7307fe04be198f00059e2bf67c9611feaffb2c8f274f6aa50eb99c3074186d8067d659 Nonce = 65a0305854033cbc6fe3ca139c40ca354d45801ecb59f4a923c251dc6b25d12d452d99b5d6711fdb5efac812aa464cc4 Signature = c7fc32997d17ac79baf5789e4503f5f1a8863872bc350a91f12dd3ef8cf78c254e829217809e8e00b6b8d4d85be3f1fd1422e1838a22496df93486bce1142961dbd8478ae844b8dda54e210afdae0d9e930d587c91bb600b0bde7237186d94e6 Msg = 7843f918fe2588bcfe756e1f05b491d913523255aa006818be20b676c957f4edb8df863c6f5f8c15b3b80c7a2aa277b70d53f210bdfb856337980c406ea140e439dd321471407f374f69877b2d82367eed51e3c82c13948616dcb301d0c31f8f0352f2846abd9e72071f446a2f1bd3339a09ae41b84e150fd18f4ba5d3c6bfa0 X = 0xdf43107a1deb24d02e31d479087bd669e2bc3e50f1f44b7db9484a7143cdca6a3391bddfea72dc940dbce8ec5efbd718 Nonce = 798abad5a30d1805794540057388ee05e2422901c6335f985b9d4447b3ef75524751abfeab6409ad6bf77d4ae3014558 Signature = 98744e5c6742fa5118a74a70db4957647a3cc12add4e876b45974a6a8707809f871daadbfc0b865e01624f706b65f10c9e256e8da8eff5a0c83baaa1ef4f7be798eba9543bf97adb0fff8719f5406ea1207a0cf703d99aa8f02169724b492273 Msg = caa83d5ab07febbd2e0fe2d63738b9b7b8752594bea7aaf50345b3d2f316653a8c9222f2b7877b64679e9573e81461a426029e45b8873a575094a1d572e0d32a9f0a9c6bcb9a2868543b7d8bbe4a69a09e7321f05f8366cced1b72df526f895b60aed2c39c249653c7839538770d4e5f47d3926ec0d168ab6a1af15bf1dca1f7 X = 0xea7a563ba2a7f5ab69973dca1f1a0d1572f0c59817cd3b62ad356c2099e2cdca1c553323563f9dfbb333b126d84abc7f Nonce = 7b9606b3df7b2a340dbc68d9754de0734e1faeb5a0135578a97628d948702235c60b20c8002c8fcf906783e1b389e754 Signature = 0d680010bed373287f9767955b5d2850e150b6713b49e453eb280148e45230c853d99ea2d2f8fcbd3ddcba19aeec0af164329763a930ab5452afdb0557fef16ff71810d6343dfc9c6ae18905c3d274db6554cdc69d6078a1ca03284474a94f30 Msg = 594603458d6534974aeeafba919c4d0f4cb6843a3af41204bbb88aeb2fca2772d305163dba863da050aabedbaf89db521955d1715de95bbcef979ecdc0c976181ece00355385f8a8f8cce127c9eac15ce3e958a3ed686184674ec9a50eb63271606ee7fdcb1323da3c3db8e89cad1fb42139a32d08abcfbf0d4ccfca18c89a86 X = 0x4cc70cb35b3ddeb0df53a6bd7bd05f8ff4392a2db7344f2d443761484b3a468a4ee3d1a8b27113d57283fd18b05f7829 Nonce = 8eda401d98f5688c34d8dbebcd3991c87c0442b0379154eaa2e5287dabe9a9e34cfc1305d11ff68781df25d5611b331d Signature = ff2d772786e159448bba26afd8c3281941a4cb0c56fec6f5cccb4c292c4ee0f7af9bd39bbe2d88148732585e104fdb3007a1d890770daa949a17797dca7af3e8163da981ec330c03d63d1a8312c152be6a718163205ffa08da7dcc163ba261f4 Msg = 733252d2bd35547838be22656cc7aa67eff0af0b13b428f77267a513c6824c3dbae533068b6817e82665f009560affcfe4b2ddb5b667a644fc1a42d24f24e0947e0dc50fb62c919bc1fe4e7ded5e28f2e6d80fcf66a081fb2763526f8def5a81a4ddd38be0b59ee839da1643eeeaee7b1927cec12cf3da67c02bc5465151e346 X = 0x366d15e4cd7605c71560a418bd0f382fd7cd7ad3090ff1b2dfbed74336166a905e1b760cf0bccee7a0e66c5ebfb831f1 Nonce = dbe545f920bc3d704c43d834bab21e40df12ec9e16a619a3e6b3f08760c26aae6e4fd91fad00f745194794b74bb1baee Signature = cdc39b12bba30da66fe9554713c05880ddc27afa4d2d151440f124c351fb9496dc95046516b0921083347d64369846ac797d0344e49f9ba87a187c50f664e5015d449e346b1a7bd9427c5be559fc58173651880d5aadf053f81899d3368d6181 Msg = 5a182bd174feb038dfae3346267156bf663167f713dea1ce936b0edb815cd9b8c8e4d411c786ba2494a81442617255db7158b142e720d86c9b56680fb9efd4298cdd69079a28153494c42a24251c7ad42ecf7e97eabc1b3997529b2a297cbad2474269b87a0b1e385f2d7f8b6eb8d1cd75eaf7e91d1acbecd45d7b2bfbbe3216 X = 0xe357d869857a52a06e1ece5593d16407022354780eb9a7cb8575cef327f877d22322c006b3c8c11e3d7d296a708bdb6d Nonce = 1e77367ac4e10924854d135ad2f2507f39e2bafdbce33ff256bcbe9a7329b8d27185218bcc3550aafbe3390e84c77292 Signature = df3182d49ad70959fb0c95bc7312750ce70fc87f1a328d39d9b29ac05d31305ce7209d6c24d13225d9567b489f7a187bd812b05abab0e96de13291e1f0da6479444ed5cd9d959b76f6cb43d394769035364f7c831a104dc7b5bd9b4a8e64df64 Msg = aaa99fb1c71340d785a18f6f668e898c25cf7a0ac31d13c5b388b7233408493a5a109af6d07065376b96f4903df7aba2b2af671a18772bb0472490d1240cde28967680727dd4acd47e0308920a75da857a6eeedee5b6586d45dff3d8a680599665aa895c89dd7770b824b7dee477ac5e7602d409d3cc553090c970b50811dbab X = 0x745a18db47324a3710b993d115b2834339315e84e7006eafd889fb49bd3cc5a8b50c90526e65e6c53bddd2916d14bead Nonce = 11b9b36720abcac084efdb44c9f5b7d039e3250cb1e9c47850189ba3cfc1489d858b2a44df357772b61d919c7e729c0f Signature = 02b252c99820cf50e6ce060ab55bd4f682276e29b4ae4197417432e6a7bfb8cf0bac89dfe105456af805d822cee776968e248bbf7d7028d63177e565c9d1666ee5be4d1ffbfffc9c7814b0cd38f74b98f3f2cd59be42b9f132bfe5ee789cd96c Msg = 1fadfa8254d3a0b82d137cfdd82043d5dc1fef195d5297b09cc5cfb061f59c933451c0dc2a11b4037f34f88dacb803251f8880c4b72585c3c196e6fb23484ca43a191f8e41b9b9a37e2e6fcaab6738c3c62d1c98e1c620bb788b7b51a04f998a510efdba0d3418622fe8ce203b3fcd553b9b4206365a39031797ad11e49745ec X = 0x93f20963ea5011ff4f26481e359309e634195f6289134087bd2e83eee008c962780a679784ee7ac6acda03d663ed27e0 Nonce = 3ad308faf04c42ee5ac69d36bc0aa9a96aacf55ea0f27dac4f52e088f023d206340a6324874ffad169ff80624de24c96 Signature = 209b72f9aae72c4339813573c3a8408a9e0be641ca863d81d9d14c48d0bf4cd44a1a7985cff07b5d68f3f9478475645bf6292e599b22a76eda95393cf59f4745fa6c472effd1f781879ad9a4437a98080b0b07dadad0c249631c682d2836a977 Msg = 9ecb6f5ed3ba666a8536a81ef65012c2cb8b433508798d84708abb06dfb75503886f78384fb8c7a4d2d49ef539d9b8a0b60938c7f07471dda91f258b0d99691b38a8403a2bb3f956bdfd09baba16d9b6877097a9b6213481b47a06e139d23ec7abad5668d21f912fdb70d31bb9adf9b3ce80e308252fa81a51674f88d02db72b X = 0xf175e6ac42fd48ec9d652c10707c039c67c4cc61d8c45a373dcda6e4ca6c53e947e49c24e01b48e7cdf92edfe6d316a1 Nonce = 812dcaa6d4f9a43ccc553288065d13761581485aa903a500a690ccafbd330ba4818c977b98c4bb57f8a182a1afacfae9 Signature = d000f18d3e4c162ff0d16f662e6703e7a6f5bff7a333ed266fa4f44c752415946c34945c342c20f739677186b1d80ab3ae7f1271c89e0aaa238710d039ea73a69110cc28fcf426f2fe6754b63a59e417fa84f903cf7dccb5468b43ff083bbfd5 Msg = e55bfca78d98e68d1b63688db12485578f36c489766f4d0bfaa0088433ff12133aaca455805095f2e655940860958b3ead111d9070778ee3bbf3e47e43d9eba8b8d9b1fdf72f793fcde2bcaa334f3e35fa2cca531ea7cf27fe9ccba741e38ac26129b2d612bf54a34e0ae6c166c0fef07fcd2b9ac253d7e041a500f7be7b8369 X = 0x46c4f0b228b28aaa0ec8cfdf1d0ed3408b7ae049312fb9eaf5f3892720e68684cc8ad29844a3dc9d110edf6916dfb8bb Nonce = 2a9dd520207c40a379cd4036adef9ee60fa8bc8c0d39b3ad91850ac93fd543f218b1688581f23481a090b0e4c73792ac Signature = 94e08cca20fe3866f643f53ec65faf3f2b4d80cd9bcc8ff8f88bb28da9eada324fc2d048908dd3d08a9e0ebb547731bc8e6f82c4d3069b14f4c844b4ca133a9503493265c9f77a7d4775eda67de76798a23dd7ea48e0ac3c337dd62bf058319d Msg = 02c6b3c83bd34b288d96409162aa4ff114e9d134bf948046eb5ebcc0c7fe9dfceadda83ed69da2fac00c8840f6c702a3fc5e6959d70f7e8af923e99e4937232ae3b841ffefd2e62fab3671a7c94a0281b8ea5bc176add57c5c9b6893fe7f5d48ce7256b96510810c4e046168a3c5be9843b84d5268a50349b3444341aa5490dd X = 0x1d7b71ef01d0d33a8513a3aed3cabb83829589c8021087a740ca65b570777089be721a61172b874a22a1f81aef3f8bb6 Nonce = d1b25ad25581cad17e96f1d302251681fee5b2efbb71c3c15ff035b2145d015d18e0e52dc3187ab5a560277b3a3929b0 Signature = d836f52b14c7391744868daa2d5cf27eb9380b9b6176195573d5b04842e9f2fc3794d6cf877feafee63d11b05f6a6bee8b89042fef2c04d4bd6c9d66a06a010514321d623a5f8d57ba5ac3686872eaabca9e0ba2d058ae7028e870acf03ca32d Msg = 94f8bfbb9dd6c9b6193e84c2023a27dea00fd48356909faec2161972439686c146184f80686bc09e1a698af7df9dea3d24d9e9fd6d7348a146339c839282cf8984345dc6a51096d74ad238c35233012ad729f262481ec7cd6488f13a6ebac3f3d23438c7ccb5a66e2bf820e92b71c730bb12fd64ea1770d1f892e5b1e14a9e5c X = 0xcf53bdd4c91fe5aa4d82f116bd68153c907963fa3c9d478c9462bb03c79039493a8eaeb855773f2df37e4e551d509dcd Nonce = df31908c9289d1fe25e055df199591b23e266433ab8657cc82cb3bca96b88720e229f8dfd42d8b78af7db69342430bca Signature = 6770eea9369d6718e60dd0b91aee845ff7ed7e0fcc91675f56d32e5227fd3a4612bbcb1556fe94a989b9e3bcc25bb20ec43072f706c98126d06a82b04251e3ecb0ba66c4bb6cd7c025919b9cc6019cdc635256d2a7fa017b806b1e88649d2c0d # [P-384,SHA-256] Group = secp384r1 Hash = SHA-256 Msg = 663b12ebf44b7ed3872b385477381f4b11adeb0aec9e0e2478776313d536376dc8fd5f3c715bb6ddf32c01ee1d6f8b731785732c0d8441df636d8145577e7b3138e43c32a61bc1242e0e73d62d624cdc924856076bdbbf1ec04ad4420732ef0c53d42479a08235fcfc4db4d869c4eb2828c73928cdc3e3758362d1b770809997 X = 0xc602bc74a34592c311a6569661e0832c84f7207274676cc42a89f058162630184b52f0d99b855a7783c987476d7f9e6b Nonce = c10b5c25c4683d0b7827d0d88697cdc0932496b5299b798c0dd1e7af6cc757ccb30fcd3d36ead4a804877e24f3a32443 Signature = b11db00cdaf53286d4483f38cd02785948477ed7ebc2ad609054551da0ab0359978c61851788aa2ec3267946d440e87816007873c5b0604ce68112a8fee973e8e2b6e3319c683a762ff5065a076512d7c98b27e74b7887671048ac027df8cbf2 Msg = 784d7f4686c01bea32cb6cab8c089fb25c341080d9832e04feac6ea63a341079cbd562a75365c63cf7e63e7e1dddc9e99db75ccee59c5295340c2bba36f457690a8f05c62ab001e3d6b333780117d1456a9c8b27d6c2504db9c1428dad8ba797a4419914fcc636f0f14ede3fba49b023b12a77a2176b0b8ff55a895dcaf8dbce X = 0x0287f62a5aa8432ff5e95618ec8f9ccaa870dde99c30b51b7673378efe4ccac598f4bbebbfd8993f9abb747b6ad638b9 Nonce = 935eeab3edeb281fbd4eead0d9c0babd4b10ff18a31663ee9de3bfa9ae8f9d266441158ea31c889ded9b3c592da77fd7 Signature = 738f9cb28f3b991335ef17b62559255faf75cad370a222464a492e27bb173c7f16b22100ada6b695875c7e4b1a28f158bc998c30e1491cd5d60dc7d1c38333165efe036b2a78db9b8f0e85ee68619cfba654e11ae5ca5ee5a87099c27cf22442 Msg = 45e47fccc5bd6801f237cdbeac8f66ebc75f8b71a6da556d2e002352bd85bf269b6bc7c928d7bb1b0422601e4dd80b29d5906f8fcac212fe0eaaf52eda552303259cbcbe532e60abd3d38d786a45e39a2875bce675800a3eaeb9e42983d9fd9031180abd9adccc9ba30c6c198b4202c4dd70f241e969a3c412724b9b595bc28a X = 0xd44d3108873977036c9b97e03f914cba2f5775b68c425d550995574081191da764acc50196f6d2508082a150af5cd41f Nonce = c80f63e080650c8a21e4f63a62ec909adfb7d877f365d11ee1cb260baf112eb4730c161c1d99dba98fc0d5bbd00dc97d Signature = 81de2810cde421997013513951a3d537c51a013110d6dbb29251410bcb5ba001a9686b8490f1e581e282fd2ed0974b229cab0bbaffe91c7677ec3dd1f17060211a3cc0be574cbca064aa8c4b66ba6e64f3d80e83da895042ca32d311c388d950 Msg = c33ff63b4e6891e00b2349b3f2907c417ca355560544a91e24a7a0ee260d6850aeded29fc0176b6039ca6187e8333391047cceaf14b1077df8f147dad84d36b2dac5666dc2f69dc9b58b88cc73956efdb3b47f91831d5875051c76b0c4e9fc087012a1f03eeee85d6745b46aa50bd9cb0110c2c94508765cec162ee1aa841d73 X = 0xd5b72cbb6ec68aca46b9c27ad992afd8ffa02cb3067b234fcfa6e272e3b31be760695ff7df988b57663057ab19dd65e3 Nonce = 9da6de7c87c101b68db64fea40d97f8ad974ceb88224c6796c690cbf61b8bd8eede8470b3caf6e6106b66cf3f0eebd55 Signature = 17840911ecdf6ae0428b2634f442163c2c11b8dbf0cc7a5596fbe4d33e3e52f9d99e99ad169867b1f39e89c9180cedc2dd7ed67e480866d0474379ea4afff72870746f4feef2153be42f13bf472b1613d7faa5c0abb7f7464070f94d7cf3f234 Msg = f562f2b9d84b0e96a52532c3b43c39c8018c738bd8dc3797a7de7353971b2729d522d6961b1f2e4df3f6a4bd3653e6d72b74fc0dba92ab939c4b542e994e5db6dd8ed4f56f651e699052e791237ae1f552f990ad156226ae8f7bf17fcbfa564f749604f97e9df0879d50985747d981422a23040fe52f5ec74caf1d4aaad8a710 X = 0x218ee54a71ef2ccf012aca231fee28a2c665fc395ff5cd20bde9b8df598c282664abf9159c5b3923132983f945056d93 Nonce = c5d39b436d851d94691f5f4aa9ef447f7989d984f279ae8b091aef5449ac062bcc0567740f914624ad5b99fc32f9af0b Signature = 07d5b1b12877e8cb5e0aa5e71eeeb17bf0aa203064c7e98b3a1798a74dc9717252dc47c7f06aaf1d5fe15b868323bbb969428cf101a7af5d08161a9fd7af212e02e33b6062aebdce4c96bf3a0684b5394cb902ca7c2dec6e2f01f40c4576009d Msg = ace953ae851f571d71779aa120915f27450b236da23e9106f8d0756abdd25861937941228d225d5fb1aa1b1ebf759b1e326aeb3b6cd0cd87edd2ab9f6a7ad67b63d2c501d6a550edb2e7c9d216cc8af78dd33546af64d00abed4d0d2cfc5c9a7b5a055dbe8f7547902d185cf46937314832bc5c602419a82ab83dbd9d3bd5aff X = 0xe6ab171f6937c000e144950801ad91023ae8e8476856c2592d9f7d5bb7180fd729211803d39a412ead6c0be761cfa5d1 Nonce = 05e9718aea9669c9e434f73866da5f252dec6d24c47a1c4ee3233450b6ec626de9746ebe095b285558dfc89fc1b622fe Signature = df9bab9dd1f22ec6f27116f38831cb2089aa78aa8c073024a0faddd9a48e810a5e8e2cadd80fbf8dbd6088c71fe30b5b1e0e8718567d12d18558c57f9e87a755c309e4ffb497335a3adfc8d7475ce8fd882d5dc33a8f5a16274b7ad74bb7862a Msg = 9635ab832240be95301bedb94c5aec169eedc198cbbdfedcf41e9b586143d829b4597a6b2a81902828332825fd84a785f187a3894e21bd99d22c4f94dcf34453fc052f15ec64d1447c932cb38fcdd30b7be851963409c11881438cbaad7e96f9efbde317f2235d66af804477a5dfe9f0c51448383830050ecf228889f83631e1 X = 0x14acd516c7198798fd42ab0684d18df1cd1c99e304312752b3035bed6535a8975dff8acfc2ba1675787c817b5bff6960 Nonce = 7f623c103eaa9099a0462e55f80519c565adaeffcb57a29993f3a8a92e63a560be8f0fb9d23dc80bff1064bb41abad79 Signature = 932ab291950c16b2b19a8036cd2e905714c6229cb190a73b3ea49c48dd8e76063a453c7c3267a57597d2973678216296d17d4c5ddbb9c27beebf526f113b416c8abfad53d11c4224813c7f351ba41a77dd4e77d6e4a65bef2c9f62cc37a469a5 Msg = d98b9a7d4fe9d0fd95de5056af164a8b7882cd34ab5bde83a2abb32dc361eb56a479a3a6119db3b91dcad26a42d2206749567f0d97c34a981a91fc734921821a429f6a53401743a5c406ba9d560f956203abc9d1f32f1a13e7d7b290f75c95fdbf857ea597021461c06a3aacfa554ede3d69e4ff03bbbee5b7463ec77de2b3b2 X = 0x2e780550984f3a00cb1e412429b33493c6eb6cd86d12f9d80588c247dcf567bd04296d2d4b24b889d9c54954b7f38f57 Nonce = b788ca82811b0d4e4841765c71eafaa1e575378beedcd3860d8b92db3d070ac5aef7c425067860fbee6c50cf0c642bbb Signature = 7292b3851870daeb2555a8a2fb198ead78739fcfb75327e5c32a82c6b77d58983e5ad548ccb75dcf9411039c9576d9b9a378c61802d9f1dd062b6e18f16416a954018f77df4df95ad1b983570377d5cfce4cc7861759e802c52f81abc4f49aac Msg = 1b4c754ac1c28dc415a71eac816bde68de7e8db66409af835838c5bb2c605111108a3bf13606ed5d8ade5ed72e50503e0de664416393d178ea4eec834d8d6f15039847b410080fd5529b426e5aadd8451c20ebd92d787921f33e147bcbeb327b104d4aab1157fc1df33e4d768404b5ccb7110055c2508c600f429fd0c21b5784 X = 0xa24d0fe90808aecc5d90626d7e6da7c9be5dfd4e1233c7f0f71f1b7c1c6fd318fafe18559c94718f044cf02ed5107cb1 Nonce = 755d025509b73cf1ea8817beb772ad150b4c17a52378be187daffe3db0158921e5e552d1ca3c85df28519939f3cb794d Signature = 23ff2ffa62bbd427d49995d9c9950116e0d5a06ef076a4553448bc109e6482c5e87d4c833bc88de0bc722bc98cae2e619aea13d487c3ea6917e16374caafcf0321c12a80d28902dd8cd81909bb04b8c439e2491e504756742d0d0bfb15a9c34c Msg = 3cd8c053741dd9f974c6c5dbf8a1e5728e9b5eafb1cbcfc3452f5fbbda32a8c7564dee157e8d902c52514361da6d972934a56b3276e2a9379e328e24282e0db697c5bc29090fc489ec46b7b188325dd4e96494c250de0f4a89fe2ccf919eaefcfb50c288113e6df92714feb7f46e0822478c796d0f4ff3447a32997e892693ce X = 0x1c172e25732555afee7ded67a496f3f11babc0875898619f4519c29321e201e8ba1149f2c20b48e5efba235d58fea7c3 Nonce = 08aec9a9e58bdc028805eb5dc86073d05fff1f5fb3fd17f510fc08f9272d84ba7aa66b6f77d84fe6360bd538192bf01a Signature = 2b4337c3dfbc886ffad7858ae2480cb62227e12205a70361c42f1a5ca9e658ee30fc3cf4030d85bd065edad83b99821f2550cef8574bf17fb3d6b0c9d04ab266962bac3621bac233ff2e4989712d2a4a07171c0aebd3040cd6a32c3bd3efb8b5 Msg = ed955dda6d9650124804d3deb6aeef900e520faf98b1ef6f14efcada7ca2433f09329b70897305e59c89024d76e466b28fe02cb2a9b12e2478c66470259d7c282137a19e5a04ffadea55245c0f34a681593fedc42931d8b3321b3d82e9cc102cd00540ad311ec7bd8c9d06db21bea4ca3dc74d98931ae0d40494aefc2345132c X = 0x5b96555dbd602e71d4d5d3aee19fd1ea084ee23d4f55c10937056762bc2015cbded2e898a487f5482ab7e1e971245907 Nonce = 7ad6f4ffd2b429ba10c6f112f800cacf1ad508cf8eba880893bb9659c1ddaaec57dcdc093a114500460d457bdde324f2 Signature = faea950ca513806bc59028c638d6302ffc86978c3ff1f06db015dd7c4777050186cb8dd871f5e926e1416539c1939c2f2c592240eabb8a1f9878e1b5c9d5d3ced7b3a7ae571f5a86494ed2ca567a36eb72e7bea8934bded29594bccf67ca84bd Msg = ce395b001da2a58e49691605d44af4206306f62f561bf2394060d2a5591a350277166bed043819035f1e60b5b3fb5ae113ddd0473f8ef6b2b050c472c2a264e1d8b3ca82a4f158c40f2d78d9ce5e5ea6de243f2e1f13f47f6c6f403b270912c81c636be35b396ca58468b3fb60aa83911d61441a0528d973bc31f965d4059080 X = 0x8df9c3c710a25192f3dea970910bb3784e3509874cccf4334823eb9f7a8d05b067f2d812d61e878e24b093089a0b8245 Nonce = 258dd05919735cd48627c9fe9fac5c252604aa7c2ae0460d7c1149cd96b7bd2ba195ad393bf392a2499f06aead5ba050 Signature = 413793bcce52eda0f5b675a8d687cce86d5c9e1659b38a89e96246b5e05f8b0934d17dbba3b2ea44c838aa5fd87125d1ce7309fc2d6e3438818a1a29a997410b025b0403de20795b97c86c46034a6b02afeed279aeb06522d4de941bfdf50469 Msg = ffefe316455ae4ffdb890bb804bf7d31424ea060ecacff419d0f7134ff76ad434063c0ec0f8bb7059584d3a03f3625bb9e9f66ace1a47ac4b8f3e76fc7c420c55edb1427d1fa15b387ad73d02b0595c4e74321be8822752230a0dcfb85d60bfa186da7623a8ec3eb1633f0a294b23ae87216b14ccee9ef56418dcfab9427371e X = 0x6002cb01ad2ce6e7101665d47729c863b6435c3875de57a93f99da834f73e3e6e2b3880e06de3e6bd1d51ea1807ab0d7 Nonce = 6b9507fd2844df0949f8b67b6fde986e50173713ac03df2edf65cb339859321cd3a2b9aab8356f95dec62460ab19c822 Signature = 018891f6381ed358b422f79a299cf0789cee783ba388af4d82cbbe17f3709751b7fd9400e9702820c28b9afc62fdf489aef73bd590802b2fd2a65c4f7fec89f9b24ecc199a69254785925f334cd1977c5e1f858bd9830d7d7d243ea707b1af0b Msg = 304bccb718b3a9e12669913490cc5bcc1979287b56c628fad706c354241e88d10e81445a2853e3fc32ece094ba1abc3fdcab61da27f9a0fca739371049fed462ee6b08fa31cde12720f8144a6f00ce9b1a7a6eadd231f126717074b4efb5c72ce673ca5859000a436f67a338d698759f12c461247c45a361fb6cb661fdbe6714 X = 0xd8559c3543afc6f7b3dc037a687bad2630283757ba7862fd23ed14e2151a4cf5fed3d249268f780e0b96b6b46274a2d5 Nonce = 4ad5a92b5b8e170b71c8a7ed419dc624c7680004562b8d16a37b6e639f581ce81d5f0d98cce44d54c4e7136229148340 Signature = f7baa6a5488ab462ea59aa31a36402b15880c68110b6069f51ede0c3b52a7b1e5bf926fdbe95768931b7d5f87058835c28b1c4ef448a432f7c91b98b0c6471691e888211b6af907369a8930859b8cdb2e94f466a44f4e52f46df9b0d65e35de6 Msg = 64f9f05c2805acf59c047b5f5d2e20c39277b6d6380f70f87b72327a76170b872bfe4b25c451602acfb6a631bb885e2655aee8abe44f69c90fb21ffde03cef2a452c468c6369867dfd8aa26ac24e16aa53b292375a8d8fbf988e302bf00088e4c061aa12c421d8fe3cbd7273b0e8993701df1c59431f436a08b8e15bd123d133 X = 0xb9208cbfd186ddfa3efd5b71342ae1efb01a13ebc4c2a992a2cbee7254b7846a4252ece1104b89d13d835911f8511224 Nonce = da706ab5f61531f2378b3c0a2b342108cd119eadaa88b859df64923bccfb0ec2393fd312826f65c15a6587d1d460015b Signature = d9124c42858080c62400e4d4d8136304e03d910cbe9b9b3487f4d27c7e0540a314d34bef8c850045c8746ca631c11c42bbf6424a3b70166fa799f49e918439d515327039258ef9bd88435a59c9c19659f8ec3c8660720b0c08354ff60e0f5a76 # [P-384,SHA-384] Group = secp384r1 Hash = SHA-384 Msg = 6b45d88037392e1371d9fd1cd174e9c1838d11c3d6133dc17e65fa0c485dcca9f52d41b60161246039e42ec784d49400bffdb51459f5de654091301a09378f93464d52118b48d44b30d781eb1dbed09da11fb4c818dbd442d161aba4b9edc79f05e4b7e401651395b53bd8b5bd3f2aaa6a00877fa9b45cadb8e648550b4c6cbe X = 0x201b432d8df14324182d6261db3e4b3f46a8284482d52e370da41e6cbdf45ec2952f5db7ccbce3bc29449f4fb080ac97 Nonce = dcedabf85978e090f733c6e16646fa34df9ded6e5ce28c6676a00f58a25283db8885e16ce5bf97f917c81e1f25c9c771 Signature = 50835a9251bad008106177ef004b091a1e4235cd0da84fff54542b0ed755c1d6f251609d14ecf18f9e1ddfe69b946e320475f3d30c6463b646e8d3bf2455830314611cbde404be518b14464fdb195fdcc92eb222e61f426a4a592c00a6a89721 Msg = d768f41e6e8ec2125d6cf5786d1ba96668ac6566c5cdbbe407f7f2051f3ad6b1acdbfe13edf0d0a86fa110f405406b69085219b5a234ebdb93153241f785d45811b3540d1c37424cc7194424787a51b79679266484c787fb1ded6d1a26b9567d5ea68f04be416caf3be9bd2cafa208fe2a9e234d3ae557c65d3fe6da4cb48da4 X = 0x23d9f4ea6d87b7d6163d64256e3449255db14786401a51daa7847161bf56d494325ad2ac8ba928394e01061d882c3528 Nonce = 67ba379366049008593eac124f59ab017358892ee0c063d38f3758bb849fd25d867c3561563cac1532a323b228dc0890 Signature = fb318f4cb1276282bb43f733a7fb7c567ce94f4d02924fc758635ab2d1107108bf159b85db080cdc3b30fbb5400016f3588e3d7af5da03eae255ecb1813100d95edc243476b724b22db8e85377660d7645ddc1c2c2ee4eaea8b683dbe22f86ca Msg = 6af6652e92a17b7898e40b6776fabaf0d74cf88d8f0ebfa6088309cbe09fac472eeac2aa8ea96b8c12e993d14c93f8ef4e8b547afe7ae5e4f3973170b35deb3239898918c70c1056332c3f894cd643d2d9b93c2561aac069577bbab45803250a31cd62226cab94d8cba7261dce9fe88c210c212b54329d76a273522c8ba91ddf X = 0xb5f670e98d8befc46f6f51fb2997069550c2a52ebfb4e5e25dd905352d9ef89eed5c2ecd16521853aadb1b52b8c42ae6 Nonce = 229e67638f712f57bea4c2b02279d5ccad1e7c9e201c77f6f01aeb81ea90e62b44b2d2107fd66d35e56608fff65e28e4 Signature = b11db592e4ebc75b6472b879b1d8ce57452c615aef20f67a280f8bca9b11a30ad4ac9d69541258c7dd5d0b4ab8dd7d494eb51db8004e46d438359abf060a9444616cb46b4f99c9a05b53ba6df02e914c9c0b6cc3a9791d804d2e4c0984dab1cc Msg = b96d74b2265dd895d94e25092fb9262dc4f2f7a328a3c0c3da134b2d0a4e2058ca994e3445c5ff4f812738e1b0c0f7a126486942a12e674a21f22d0886d68df2375f41685d694d487a718024933a7c4306f33f1a4267d469c530b0fed4e7dea520a19dd68bf0203cc87cad652260ed43b7b23f6ed140d3085875190191a0381a X = 0xde5975d8932533f092e76295ed6b23f10fc5fba48bfb82c6cc714826baf0126813247f8bd51d5738503654ab22459976 Nonce = fc5940e661542436f9265c34bce407eff6364bd471aa79b90c906d923e15c9ed96eea4e86f3238ea86161d13b7d9359d Signature = c2fbdd6a56789024082173725d797ef9fd6accb6ae664b7260f9e83cb8ab2490428c8b9c52e153612295432fec4d59cd8056c5bb57f41f73082888b234fcda320a33250b5da012ba1fdb4924355ae679012d81d2c08fc0f8634c708a4833232f Msg = 7cec7480a037ff40c232c1d2d6e8cd4c080bbeecdaf3886fccc9f129bb6d202c316eca76c8ad4e76079afe622f833a16f4907e817260c1fa68b10c7a151a37eb8c036b057ed4652c353db4b4a34b37c9a2b300fb5f5fcfb8aa8adae13db359160f70a9241546140e550af0073468683377e6771b6508327408c245d78911c2cc X = 0x11e0d470dc31fab0f5722f87b74a6c8d7414115e58ceb38bfcdced367beac3adbf1fe9ba5a04f72e978b1eb54597eabc Nonce = e56904028226eb04f8d071e3f9cefec91075a81ca0fa87b44cae148fe1ce9827b5d1910db2336d0eb9813ddba3e4d7b5 Signature = c38ef30f55624e8935680c29f8c24824877cf48ffc0ef015e62de1068893353030d1193bf9d34237d7ce6ba92c98b0fe651b8c3d5c9d5b936d300802a06d82ad54f7b1ba4327b2f031c0c5b0cb215ad4354edc7f932d934e877dfa1cf51b13fe Msg = 00ce978603229710345c9ad7c1c2dba3596b196528eea25bd822d43ca8f76a024e29217703dd0652c8a615284fc3edcc1c5ad1c8d5a8521c8e104c016a24e50c2e25066dcb56596f913b872767e3627aa3e55ec812e9fdac7c2f1beade83aef093e24c9c953982adf431a776880ae4583be158e11cdab1cbca3ad3a66900213d X = 0x5c6bbf9fbcbb7b97c9535f57b431ed1ccae1945b7e8a4f1b032016b07810bd24a9e20055c0e9306650df59ef7e2cd8c2 Nonce = 03d23f1277b949cb6380211ad9d338e6f76c3eedac95989b91d0243cfb734a54b19bca45a5d13d6a4b9f815d919eea77 Signature = abab65308f0b79c4f3a9ff28dd490acb0c320434094cef93e75adfe17e5820dc1f77544cfaaacdc8cf9ac8b38e174bef11b783d879a6de054b316af7d56e526c3dce96c85289122e3ad927cfa77bfc50b4a96c97f85b1b8221be2df083ff58fb Msg = 54a255c18692c6162a46add176a0ae8361dcb8948f092d8d7bac83e160431794d3b9812849bf1994bcdcfba56e8540c8a9ee5b93414548f2a653191b6bb28bda8dc70d45cc1b92a489f58a2d54f85766cb3c90de7dd88e690d8ebc9a79987eee1989df35af5e35522f83d85c48dda89863171c8b0bf4853ae28c2ac45c764416 X = 0xffc7dedeff8343721f72046bc3c126626c177b0e48e247f44fd61f8469d4d5f0a74147fabaa334495cc1f986ebc5f0b1 Nonce = c3de91dbe4f777698773da70dd610ef1a7efe4dc00d734399c7dd100728006a502822a5a7ff9129ffd8adf6c1fc1211a Signature = f4f477855819ad8b1763f53691b76afbc4a31a638b1e08c293f9bcd55decf797f9913ca128d4b45b2e2ea3e82c6cf5657c26be29569ef95480a6d0c1af49dc10a51a0a8931345e48c0c39498bfb94d62962980b56143a7b41a2fddc8794c1b7f Msg = 692a78f90d4f9d5aee5da536314a78d68c1feabbfe5d1ccea7f6059a66c4b310f8051c411c409ccf6e19a0cbd8b8e100c48317fe8c6d4f8a638b9551ce7ee178020f04f7da3001a0e6855225fb3c9b375e4ed964588a1a41a095f3f476c42d52ffd23ce1702c93b56d4425d3befcf75d0951b6fd5c05b05455bdaf205fe70ca2 X = 0xadca364ef144a21df64b163615e8349cf74ee9dbf728104215c532073a7f74e2f67385779f7f74ab344cc3c7da061cf6 Nonce = a2da3fae2e6da3cf11b49861afb34fba357fea89f54b35ce5ed7434ae09103fe53e2be75b93fc579fedf919f6d5e407e Signature = dda994b9c428b57e9f8bbaebba0d682e3aac6ed828e3a1e99a7fc4c804bff8df151137f539c7389d80e23d9f3ee497bfa0d6b10ceffd0e1b29cf784476f9173ba6ecd2cfc7929725f2d6e24e0db5a4721683640eaa2bbe151fb57560f9ce594b Msg = 3b309bb912ab2a51681451ed18ad79e95d968abc35423a67036a02af92f575a0c89f1b668afe22c7037ad1199e757a8f06b281c33e9a40bab69c9874e0bb680b905d909b9dc24a9fe89bb3d7f7d47082b25093c59754f8c19d1f81f30334a8cdd50a3cb72f96d4b3c305e60a439a7e93aeb640dd3c8de37d63c60fb469c2d3ed X = 0x39bea008ec8a217866dcbdb1b93da34d1d3e851d011df9ef44b7828b3453a54aa70f1df9932170804eacd207e4f7e91d Nonce = 3c90cc7b6984056f570542a51cbe497ce4c11aeae8fc35e8fd6a0d9adeb650e8644f9d1d5e4341b5adc81e27f284c08f Signature = d13646895afb1bfd1953551bb922809c95ad65d6abe94eb3719c899aa1f6dba6b01222c7f283900fe98628b7597b6ea64a9a38afda04c0a6b0058943b679bd02205b14d0f3d49b8f31aac289129780cdb1c555def8c3f9106b478729e0c7efaa Msg = f072b72b8783289463da118613c43824d11441dba364c289de03ff5fab3a6f60e85957d8ff211f1cb62fa90216fb727106f692e5ae0844b11b710e5a12c69df3ed895b94e8769ecd15ff433762d6e8e94d8e6a72645b213b0231344e2c968056766c5dd6b5a5df41971858b85e99afbf859400f839b42cd129068efabeea4a26 X = 0xe849cf948b241362e3e20c458b52df044f2a72deb0f41c1bb0673e7c04cdd70811215059032b5ca3cc69c345dcce4cf7 Nonce = 32386b2593c85e877b70e5e5495936f65dc49553caef1aa6cc14d9cd370c442a0ccfab4c0da9ec311b67913b1b575a9d Signature = 5886078d3495767e330c7507b7ca0fa07a50e59912a416d89f0ab1aa4e88153d6eaf00882d1b4aa64153153352d853b52cc10023bf1bf8ccfd14b06b82cc2114449a352389c8ff9f6f78cdc4e32bde69f3869da0e17f691b329682ae7a36e1aa Msg = cf4945350be8133b575c4ad6c9585e0b83ff1ed17989b6cd6c71b41b5264e828b4e115995b1ae77528e7e9002ac1b5669064442645929f9d7dd70927cb93f95edeb73e8624f4bc897ec4c2c7581cb626916f29b2d6e6c2fba8c59a71e30754b459d81b912a12798182bcff4019c7bdfe929cc769bcc2414befe7d2906add4271 X = 0xd89607475d509ef23dc9f476eae4280c986de741b63560670fa2bd605f5049f1972792c0413a5b3b4b34e7a38b70b7ca Nonce = 78613c570c8d33b7dd1bd1561d87e36282e8cf4843e7c344a2b2bb6a0da94756d670eeaffe434f7ae7c780f7cf05ca08 Signature = 66f92b39aa3f4aeb9e2dc03ac3855406fa3ebbab0a6c88a78d7a03482f0c9868d7b78bc081ede0947c7f37bf193074bae5c64ed98d7f3701193f25dd237d59c91c0da6e26215e0889d82e6d3e416693f8d58843cf30ab10ab8d0edd9170b53ad Msg = d9b5cf0b50416573ff3c63133275a18394dd4326be2041e8d97e6e4e3855a4a177e9d26dfd223fe8aa74564edb49bd72de19916fb6f001f44530d5c18e2c332bce1b7415df5927ece5f3824f34d174b963136b53aef1fb78fb0c06a201a40b2db38e4d8216fc1e392a798c8ab4b3a314496b7f1087804ebfa89bf96e9cdb80c0 X = 0x083e7152734adf342520ae377087a223688de2899b10cfcb34a0b36bca500a4dfa530e2343e6a39da7ae1eb0862b4a0d Nonce = 28096ababe29a075fbdf894709a20d0fdedb01ed3eeacb642a33a0da6aed726e13caf6cf206792ec359f0c9f9b567552 Signature = ee2923f9b9999ea05b5e57f505bed5c6ba0420def42c6fa90eef7a6ef770786525546de27cdeb2f8586f8f29fb4ee67c50ef923fb217c4cf65a48b94412fda430fac685f0da7bd574557c6c50f5b22e0c8354d99f2c2f2c2691f252f93c7d84a Msg = 9e4042d8438a405475b7dab1cd783eb6ce1d1bffa46ac9dfda622b23ac31057b922eced8e2ed7b3241efeafd7c9ab372bf16230f7134647f2956fb793989d3c885a5ae064e85ed971b64f5f561e7ddb79d49aa6ebe727c671c67879b794554c04de0e05d68264855745ef3c9567bd646d5c5f8728b797c181b6b6a876e167663 X = 0x63578d416215aff2cc78f9b926d4c7740a77c142944e104aa7422b19a616898262d46a8a942d5e8d5db135ee8b09a368 Nonce = 7b69c5d5b4d05c9950dc94c27d58403b4c52c004b80a80418ad3a89aabc5d34f21926729e76afd280cc8ee88c9805a2a Signature = db054addb6161ee49c6ce2e4d646d7670754747b6737ca8516e9d1e87859937c3ef9b1d2663e10d7e4bd00ec85b7a97afcc504e0f00ef29587e4bc22faada4db30e2cb1ac552680a65785ae87beb666c792513f2be7a3180fc544296841a0e27 Msg = 0b14a7484a40b68a3ce1273b8a48b8fdb65ba900d98541c4bbd07b97e31bcc4c85545a03e9deab3c563f47a036ff60d0361684ba241b5aa68bb46f440da22181ee328a011de98eff34ba235ec10612b07bdfa6b3dc4ccc5e82d3a8d057e1862fef3def5a1804696f84699fda2ec4175a54a4d08bcb4f0406fdac4eddadf5e29b X = 0xed4df19971658b74868800b3b81bc877807743b25c65740f1d6377542afe2c6427612c840ada31a8eb794718f37c7283 Nonce = d9b4cd1bdfa83e608289634dbfcee643f07315baf743fc91922880b55a2feda3b38ddf6040d3ba10985cd1285fc690d5 Signature = 009c74063e206a4259b53decff5445683a03f44fa67252b76bd3581081c714f882f882df915e97dbeab061fa8b3cc4e7d40e09d3468b46699948007e8f59845766dbf694b9c62066890dd055c0cb9a0caf0aa611fb9f466ad0bbb00dbe29d7eb Msg = 0e646c6c3cc0f9fdedef934b7195fe3837836a9f6f263968af95ef84cd035750f3cdb649de745c874a6ef66b3dd83b66068b4335bc0a97184182e3965c722b3b1aee488c3620adb835a8140e199f4fc83a88b02881816b366a09316e25685217f9221157fc05b2d8d2bc855372183da7af3f0a14148a09def37a332f8eb40dc9 X = 0xe9c7e9a79618d6ff3274da1abd0ff3ed0ec1ae3b54c3a4fd8d68d98fb04326b7633fc637e0b195228d0edba6bb1468fb Nonce = b094cb3a5c1440cfab9dc56d0ec2eff00f2110dea203654c70757254aa5912a7e73972e607459b1f4861e0b08a5cc763 Signature = ee82c0f90501136eb0dc0e459ad17bf3be1b1c8b8d05c60068a9306a346326ff7344776a95f1f7e2e2cf9477130e735caf10b90f203af23b7500e070536e64629ba19245d6ef39aab57fcdb1b73c4c6bf7070c6263544633d3d358c12a178138 # [P-384,SHA-512] Group = secp384r1 Hash = SHA-512 Msg = 67d9eb88f289454d61def4764d1573db49b875cfb11e139d7eacc4b7a79d3db3bf7208191b2b2078cbbcc974ec0da1ed5e0c10ec37f6181bf81c0f32972a125df64e3b3e1d838ec7da8dfe0b7fcc911e43159a79c73df5fa252b98790be511d8a732fcbf011aacc7d45d8027d50a347703d613ceda09f650c6104c9459537c8f X = 0x217afba406d8ab32ee07b0f27eef789fc201d121ffab76c8fbe3c2d352c594909abe591c6f86233992362c9d631baf7c Nonce = 90338a7f6ffce541366ca2987c3b3ca527992d1efcf1dd2723fbd241a24cff19990f2af5fd6419ed2104b4a59b5ae631 Signature = c269d9c4619aafdf5f4b3100211dddb14693abe25551e04f9499c91152a296d7449c08b36f87d1e16e8e15fee4a7f5c877ffed5c61665152d52161dc13ac3fbae5786928a3d736f42d34a9e4d6d4a70a02d5af90fa37a23a318902ae2656c071 Msg = 45db86829c363c80160659e3c5c7d7971abb1f6f0d495709bba908d7aa99c9df64b3408a51bd69aba8870e2aaff488ef138f3123cf94391d081f357e21906a4e2f311defe527c55e0231579957c51def507f835cceb466eb2593a509dcbee2f09e0dde6693b2bfe17697c9e86dd672f5797339cbe9ea8a7c6309b061eca7aef5 X = 0x0a3f45a28a355381a919372f60320d6610cfb69c3e318eb1607db3cadfc42b728b77a6a9e9e333de9183c58933daf60f Nonce = 2a78e651623ba604c42cf094fc7d046629306f508853427ba091448800d1092c041bb2323035fc9d19a8d44950f7dcc3 Signature = 0db0cc9a2bda8dd7e565ad36f91b1c5756d78164dc8a72a5bee4b6bc45ea38c7a16b01d05b1893d4e06b62db24c30385abd383edaeda7d0b8de1b54fcd3c28874fed62ab266f1f84c8ba796a7b54e5e0695fdb43ce7fe90ed00fa468d87bca64 Msg = 4672fce0721d37c5be166bffa4b30d753bcf104b9b414db994b3ed33f36af4935ea59a0bb92db66448b3f57dad4fc67cef10ce141bf82c536be604b89a0bc0e8bca605b867880049d97142d30538fc543bd9d4fab7fdbe2f703815cdb6361beb66acff764bc275f910d1662445b07b92830db69a5994857f53657ed5ca282648 X = 0x2e408c57921939f0e0fe2e80ce74a4fa4a1b4fa7ab070206298fe894d655be50e2583af9e45544b5d69c73dce8a2c8e7 Nonce = b10b6258afdde81f9c971cc1526d942e20cafac02f59fee10f98e99b8674636bff1d84a6eaa49c0de8d8cfdc90d8ce84 Signature = be428a8de89a364a134719141ee8d776a3a8338f1132b07e01b28573d8eaf3b9008b63304c48821e53638b6141f9660b866181dbef5c147d391bed6adcee408c339982c307adc718c2b9ab9e5642d8dedc36dd6402559a3ab614c99c1e56b529 Msg = 9ae48fdd9bfc5cb0f4d4761e28b2073bda05a3e3fe82c212e66701dc4573cc67a829b0f82d7520b1bf11db0c6d1743822bbe41bb0adbd7222aa5fae70fbd1a31f2d4453a01c81e064d775388468be96f6063f8673b7b8d4455fe1bd4c801ad5e625a015eaa4a1a18da490d2af8642201eaba3c611cbd65f861d8e19ca82a1ee6 X = 0x1c285da72a8eb1c3c38faab8d3bb4e68dc95c797082b9a3991a21c1de54759071ecf2265fb1eff504ab24174bc6710cf Nonce = 2513075e02cc7fb3cff7b7adde46da31c5493749b5cf02758bd5b098a838bfd4d5e4c7fb8268bdc37e219c30efebe878 Signature = b3d638b3be45f14f170da5bdc22d2114deac93ab340a25b3af2b5c18584bb9147e00dc6c67a2274f79aa4838793eb63f876112bdca2c725eb2f6dbd76d07710a31f0c16d38430cb0817f320a25a9ecfec8a66137d0304612ae29a6a484fd3319 Msg = 817d6a110a8fd0ca7b4d565558f68b59a156744d4c5aac5c6610c95451793de2a756f774558c61d21818d3ebeeeb71d132da1c23a02f4b305eccc5cd46bd21dfc173a8a91098354f10ffbb21bf63d9f4c3feb231c736504549a78fd76d39f3ad35c36178f5c233742d2917d5611d2073124845f1e3615b2ef25199a7a547e882 X = 0x9da37e104938019fbdcf247e3df879a282c45f8fb57e6655e36b47723af42bec3b820f660436deb3de123a21de0ca37b Nonce = c8c18e53a9aa5915288c33132bd09323638f7995cd89162073984ed84e72e07a37e18c4c023933eace92c35d10e6b1b6 Signature = 6512a8a2be731e301dcf4803764297862bbfa0ac8daed64d8e98b34618ecb20520fc5d3cf890b7783edf86e7ea4075414ff10301f7b4168fae066361376007c1d7aa89a75c87719d0b54711ffef5ef3726f3eef84f7ebc025c110bde511b17f6 Msg = 464f10ec6fb229a51db5fd0e122f2cb8a9a022117e2987f4007bf5565b2c16aba0714e2e3cdd0c100d55ac3017e36fc7501ad8309ab9572aa65424c9eb2e580a119c55777676ec498df53ef6ae78fd8a988130ee0e6082bf1ef71cd4c946021018a8ca7154d13b174c638912613b0bdb9001c302bf7e443ad2124ab2c1cce212 X = 0x0661ab3bf9f7bef51bec7dff758de289154557beb9ce18cc4b8cc09a871e8322af259cf188b593dc62f03a19e75f7f69 Nonce = 84a87137edb6894f96c5a8e94a3765162034feb84dfea94e1c71411170c285a80321ec7999e25861844143209804882c Signature = 4dc9d1b949b36e3c3847ac1c7ed114e1bc9cbe76119cf6fcd3f1b69ee6ee54e3255f1bb288fe2f8bd6d4049a21793c2756a561d647b62ccae1e6df818b1a6fbde66c82ef0ff69ee415f183e7daf76be22630c7e02cd3fd729dfa490f26824584 Msg = 4e3e0fb96320ddccde8b463c273654c4f7164920b1d63430921d2e808dee403e6420eedda0a557b911d00736a4f8798dd4ef26673efd6d190988ad4929ec64f8685cfb76070a36cd6a3a4bf2f54fb08a349d44642b6f614043fef9b2813b63457c76537d23da7b37310334f7ba76edf1999dad86f72aa3446445a65952ac4e50 X = 0x66e7cfdeb7f264cf786e35210f458c32223c3a12a3bc4b63d53a5776bc9b069928452484f6241caa3781fd1a4109d4db Nonce = 2fa266f5cce190eb77614933ca6a55121ad8bae168ff7a9043d96d13b5ca2fe70101ff9fe1e2b2cd7413e6aa8f49abde Signature = e7ecda9da0c52d0474a9f70094dc8f061d7d6a22210d3b69a7be8f389aa666f256322099b87d16ad35357ea856574dbaba348eb40a2830ec5a1130264ac0a8675420b1ae243e808a778135809ece21f42c0c881166321102b4f02df4c5c7ed9d Msg = c466b6b6baf7e6ffa876ec06105e2d43534e0517c07b1c4c9fb67ba81ce09525a7721ec3c290f2b1f65b6463d41598e7a25b2238501629953a5ca955b644354fb6856733a2e5bb8f5bc21a0c803493f5539f9fb83aab3dba2c982989c2270c61ab244b68bfe1b948d00c2ed975e09c29b5f8a7effcad8652a148cc880d503217 X = 0x92c2f7ee64af86d003ab484e12b82fcf245fc330761057fec5b7af8f7e0a2d85b468c21d171460fcb829cae7b986316d Nonce = 6ec81fb74f8725ba225f317264460ee300cfd2f02092000989acbdad4799cf55c244a65c557113328fe20282e6badb55 Signature = cd7a4309bcebc25a8e10899fe2eda5f8b2dbcf329cd2f3d65befd67393e83fba2f8a67a15c01a6ac8314f9f5e87a9dca6dcfc0426bc148e67e91d4784e3d7e9bc3b7ce3676be62daa7f3f55dfdff6d9dc735b5e3e0bbd0785db1f76f7ac065f3 Msg = feac892b7720af80b3c9eede51e923f18d3d0c5de4c31f4aa75e36df7c7c2fd8f41778851a24b69e67dccb65e159dd5c383243bad7cfedcc5e85c8a01c34b0b94ba8e07e4c024c09d279b3731e8b62f9562d3c4f5042567efe42a9d0eaaabab28bc6f11232fc8ceaaf4518d9f3b2bebf020294496b7f6b879e69503f75fecd3d X = 0x15347caaad1067f1848a676bd0a8c52021ae604b79d02775a0459226e0391a3acd26653c916fcfe86149fb0ee0904476 Nonce = 1a2d224db4bb9c241ca5cab18920fad615fa25c1db0de0f024cb3ace0d11ef72b056885446659f67650fdff692517b1c Signature = 87b4de0fb21df38dfc9a4b1e350da67547e307f55b5b9dd6615e408afe7c3553a6e02722847367439e636074faa2182b375d965753b9ed6c6c08576726f8308c2f8dbd2737824464e71265d47907e26f615bbeb8203ec617520d4ecd1851dc44 Msg = cf2982e3bf174ce547741b969403cd11e9553067e6af8177d89511a0eb040db924530bdba65d8b1ff714228db0737c1756f509e1506014a10736e65be2f91980a73891496e90ff2714a3601c7565cdcef5a395e2e0e1652f138d90d61eaa9cba993b823245647f6e07cec9b8b4449cd68a29741cd1579c66e548ca0d0acf33aa X = 0xac1cb5e59bda2eff3413a3bab80308f9fb32c595283c795de4c17fdae8d4647b5f108fd0801aee22adb7db129283b5aa Nonce = 8053a46e875f446056b06d4318fa3e8977622de7207cbf0996bf35b0e9b19aaa507f642bcf0be9f048f1af09806f6946 Signature = a994eb15b64114ce8a9342d18b5edda96a6d76314a5ac03da723699177d352a4a9f3b7121b11a91e43a6af4025da51d68183ae33a888e99aa76882da0a6705ad102f2bbd9572fad0d2e4d6d70151970469e00c5220e59c14724d771c1384b302 Msg = bf9fdd4107ef5a6070108771ac9eee4f0c8043bf0d04db772a47294f4137e2439d94b337114b074e57e0cb78d0ccf352a2833e9788ee2a1a9ffeacd34f38fcefb86653d70c7dadd4cf6548d608e70acdef6c7530974b92c813798add659752a8c72b05e1ad9c65c21834ce6fbe49d8a1426b5a54270794436d284364fac6ec1a X = 0x205f1eb3dfacff2bdd8590e43e613b92512d6a415c5951bda7a6c37db3aae39b9b7ec6edd256609e75373419087fa71f Nonce = ecd395c5d8b7d6e6b2b19644e0d2e6086c912c6a0f5b8ed4b94b7290b65852c9741ce8eeb08d8751ead8a183e17d76c6 Signature = e81331d78b438b0b8d98c1be03385ba5d614af182f1677f259126cc3de7eaac6c19b02be955d936b6bf9c27c6796e6f017c2b7a8e0fc93909762aa9f86f9561e759ecb88f02337b2018363be6095d9e4324a6d3296046686624b5efad6b52878 Msg = 5d634fb39a2239256107dc68db19751540b4badac9ecf2fce644724401d6d632b3ae3b2e6d05746b77ddc0c899878032248c263eda08d3d004d35952ad7a9cfe19343d14b37f9f632245e7b7b5fae3cb31c5231f82b9f1884f2de7578fbf156c430257031ba97bc6579843bc7f59fcb9a6449a4cd942dffa6adb929cf219f0ad X = 0xe21e3a739e7ded418df5d3e7bc2c4ae8da76266a1fc4c89e5b09923db80a72217f1e96158031be42914cf3ee725748c1 Nonce = d06bea06b25e6c30e866b1eb0657b45673e37b709013fb28fd7373afc8277cbc861354f821d0bd1927e52ec083a0f41f Signature = e8d4a31dd0e7d2522be62a32608e744c3775ceb606dc897899f0c73f1a40ce9a8be854cd506e65cd81fd7fa2c616cb7b8151b681b6b6046d3c36f332d06d9ba7751e740631cdb759f88c50a25a8e950d5023df8a15c77243743733c4feaf21d5 Msg = c9b4ff721b3e886f0dc05856ffff0aabb64a8504b1746a47fdd73e6b7ebc068f06ac7ffa44c757e4de207fc3cbfaf0469d3ac6795d40630bcafe8c658627e4bc6b86fd6a2135afbc18ccc8e6d0e1e86016930ca92edc5aa3fbe2c57de136d0ea5f41642b6a5d0ddeb380f2454d76a16639d663687f2a2e29fb9304243900d26d X = 0x93434d3c03ec1da8510b74902c3b3e0cb9e8d7dccad37594d28b93e065b468d9af4892a03763a63eae060c769119c23c Nonce = 13d047708ae5228d6e3bbada0e385afdb3b735b31123454fdf40afe3c36efed563fd2cce84dcc45c553b0993d9ca9ec3 Signature = a0203f6f2c456baac03538ed506a182e57a25151802cf4b2557613b2fb615ebd4c50ddc505f87c048a45bad3b2fc371c0eab56457c4080400fa3af124761d5a01fef35f9649edba8b97d22116386f3b8b363e97ef3f82616d5d825df1cf865ef Msg = db2ad659cf21bc9c1f7e6469c5f262b73261d49f7b1755fc137636e8ce0202f929dca4466c422284c10be8f351f36333ebc04b1888cba217c0fec872b2dfc3aa0d544e5e06a9518a8cfe3df5b20fbcb14a9bf218e3bf6a8e024530a17bab50906be34d9f9bba69af0b11d8ed426b9ec75c3bd1f2e5b8756e4a72ff846bc9e498 X = 0xe36339ddbe8787062a9bc4e1540690915dd2a2f11b3fe9ee946e281a0a2cbed426df405ed9cb0eca42f85443efd09e0c Nonce = 2226f7329378cecd697f36ae151546643d67760856854661e31d424fae662da910e2157da9bb6dfbe3622296e0b5710c Signature = 20dcc25b67dd997621f437f65d78347fb57f8295b1b14453b1128203cda892bcfe726a2f107d30975d63172e56f11d7651cff592cbef75ef8321c8fa1e4229c4298b8180e427bee4e91d1e24fc28a729cf296beb728960d2a58cf26773d8e2e2 Msg = dbd8ddc02771a5ff7359d5216536b2e524a2d0b6ff180fa29a41a8847b6f45f1b1d52344d32aea62a23ea3d8584deaaea38ee92d1314fdb4fbbecdad27ac810f02de0452332939f644aa9fe526d313cea81b9c3f6a8dbbeafc899d0cdaeb1dca05160a8a039662c4c845a3dbb07be2bc8c9150e344103e404411668c48aa7792 X = 0x5da87be7af63fdaf40662bd2ba87597f54d7d52fae4b298308956cddbe5664f1e3c48cc6fd3c99291b0ce7a62a99a855 Nonce = 1b686b45a31b31f6de9ed5362e18a3f8c8feded3d3b251b134835843b7ae8ede57c61dc61a30993123ac7699de4b6eac Signature = 9dbfa147375767dde81b014f1e3bf579c44dd22486998a9b6f9e0920e53faa11eed29a4e2356e393afd1f5c1b060a958e4d318391f7cbfe70da78908d42db85225c85f4f2ff413ecad50aad5833abe91bdd5f6d64b0cd281398eab19452087dd # [P-384,SHA-1] Group = secp384r1 Hash = SHA-1 # Msg that produces a hash with leading zeros. Test created with BouncyCastle Msg = FCABA2CF434AC8DCFCEC X = 0xc602bc74a34592c311a6569661e0832c84f7207274676cc42a89f058162630184b52f0d99b855a7783c987476d7f9e6b Nonce = c10b5c25c4683d0b7827d0d88697cdc0932496b5299b798c0dd1e7af6cc757ccb30fcd3d36ead4a804877e24f3a32443 Signature = B11DB00CDAF53286D4483F38CD02785948477ED7EBC2AD609054551DA0AB0359978C61851788AA2EC3267946D440E8789ECD85E3F062E0713ACC8A1CD6FA22BB4C5F99868D6780C3CD4F91899513F09017E3AD4CFF7A08F35421C488E1E0A1D2 # [P-521,SHA-224] Group = secp521r1 Hash = SHA-224 Msg = 58ec2b2ceb80207ff51b17688bd5850f9388ce0b4a4f7316f5af6f52cfc4dde4192b6dbd97b56f93d1e4073517ac6c6140429b5484e266d07127e28b8e613ddf65888cbd5242b2f0eee4d5754eb11f25dfa5c3f87c790de371856c882731a157083a00d8eae29a57884dbbfcd98922c12cf5d73066daabe3bf3f42cfbdb9d853 X = 0x1d7bb864c5b5ecae019296cf9b5c63a166f5f1113942819b1933d889a96d12245777a99428f93de4fc9a18d709bf91889d7f8dddd522b4c364aeae13c983e9fae46 Nonce = 0141f679033b27ec29219afd8aa123d5e535c227badbe2c86ff6eafa5116e9778000f538579a80ca4739b1675b8ff8b6245347852aa524fe9aad781f9b672e0bb3ff Signature = 006b973a638bde22d8c1c0d804d94e40538526093705f92c0c4dac2c72e7db013a9c89ffc5b12a396886305ddf0cbaa7f10cdd4cd8866334c8abfc800e5cca36539100b0a01eca07a3964dd27d9ba6f3750615ea36434979dc73e153cd8ed1dbcde2885ead5757ebcabba117a64fcff9b5085d848f107f0c9ecc83dfa2fa09ada3503028 # Test a message that hashes to all zeros Hash = Raw Group = secp256r1 X = 5 Nonce = A808BBBBCDB8C60C097DD2839FA2B4DEA13777D27D11C8BD3ABE7F16FFDA4BF6 Msg = 0000000000000000000000000000000000000000000000000000000000000000 Signature = AE15A0963B6E0144E7F801616DBBBF1BB4C4943CA85B0AF9D00F3FA5CACB95FB02032D911851E27F8E5C565A43F54DE6E03EFF81A9BF73B9ACC47B363979F101 Hash = Raw(SHA-256) Group = secp256r1 X = 5 Nonce = 35F6E341405E516C2FD796CA12F039C6971AB7A0F69B254E38CA7191F298DFB2 Msg = 0000000000000000000000000000000000000000000000000000000000000000 Signature = 921D2C2012856C4F8BD1AB9229C302848AB99CFCF92A512BD24B9A08F3C0DF99CE18D76B930B81493E77737E24285D07F2919C98AFE32F2450A28BA50FBE32E8 Hash = Raw Group = secp384r1 X = 5 Nonce = 77294F6D855441C4DBEC66E1494DA0F2C6BFA3FB8518A9ED8D271D72BB3BE45302DCDEE6FF66555489756BECB8BF6CB9 Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Signature = 53C99B5021F9DD7B8D2EC1C1BB17C03FCFF324DED361B4845D9C98E1A3F490C63946BA68DF0FA26AE62BB6E04531581C9D29FF7775BE15F14C1AA86B292F987241E42241E08DBA4229597260A4D9F433AC78F36D772F83499C5E2E3AF68F83E4 X = 5 Group = secp384r1 Hash = Raw(SHA-384) Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Nonce = 6BE36DD30F03CB45B2F20A1F38025BBF7701561C163FBB426CB0B210E601EF85B3E5F60058B706C56575712A05BB780D Signature = 7A5C707564BF8DA1261387DFD5D5ED2A8C10B3AA4D00C9A927D5729E8BB555954F94799B972CD6F976B99703A561A1AD62929113627D363F5765D5FFCEBCF529B6B74D78B91D7A400D7E09C7613571C25E55AC98989635BE251EE123AA9A63CC X = 5 Group = secp521r1 Hash = Raw(SHA-512) Msg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Nonce = 0169EBB978C1B61CCE759A67B828F8213960B2E1D041DF948ABC435C99E1080D650612D1C7284E1B1F1B9D16D477B722B59545407137D0FBC17C05344A7BB2033E60 Signature = 0157BC701722FB4853DD9F3E9BBAE977137CF04659B3CF4BD9A3FF47D8E1DF3D7B9A1E291234CD8AE9C9B9711F22C9B3B127F6217A582A9830D75184CB6A6AC174570164A920D8059F8BC21F4FBFDEE3140CF1033F3AB10260A71CBD32197822C3B575BC44DA681EBBB4612357A1E81670B2A76A35DDA2AAE708F7FD7D66D1EAE453249C botan-2.4.0/src/tests/data/pubkey/ecdsa_rfc6979.vec000066400000000000000000000546101322470703100217350ustar00rootroot00000000000000 # RFC 6979 A.2.3. ECDSA, 192 Bits (Prime Field) Group = secp192r1 X = 0x6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4 Msg = 73616D706C65 Hash = SHA-1 Signature = 98C6BD12B23EAF5E2A2045132086BE3EB8EBD62ABF6698FF57A22B07DEA9530F8DE9471B1DC6624472E8E2844BC25B64 Hash = SHA-224 Signature = A1F00DAD97AEEC91C95585F36200C65F3C01812AA60378F5E07EC1304C7C6C9DEBBE980B9692668F81D4DE7922A0F97A Hash = SHA-256 Signature = 4B0B8CE98A92866A2820E20AA6B75B56382E0F9BFD5ECB55CCDB006926EA9565CBADC840829D8C384E06DE1F1E381B85 Hash = SHA-384 Signature = DA63BF0B9ABCF948FBB1E9167F136145F7A20426DCC287D5C3AA2C960972BD7A2003A57E1C4C77F0578F8AE95E31EC5E Hash = SHA-512 Signature = 4D60C5AB1996BD848343B31C00850205E2EA6922DAC2E4B83F6E837448F027A1BF4B34E796E32A811CBB4050908D8F67 Msg = 74657374 Hash = SHA-1 Signature = 0F2141A0EBBC44D2E1AF90A50EBCFCE5E197B3B7D4DE036DEB18BC9E1F3D7387500CB99CF5F7C157070A8961E38700B7 Hash = SHA-224 Signature = 6945A1C1D1B2206B8145548F633BB61CEF04891BAF26ED34B7FB7FDFC339C0B9BD61A9F5A8EAF9BE58FC5CBA2CB15293 Hash = SHA-256 Signature = 3A718BD8B4926C3B52EE6BBE67EF79B18CB6EB62B1AD97AE5662E6848A4A19B1F1AE2F72ACD4B8BBE50F1EAC65D9124F Hash = SHA-384 Signature = B234B60B4DB75A733E19280A7A6034BD6B1EE88AF53323677994090B2D59BB782BE57E74A44C9A1C700413F8ABEFE77A Hash = SHA-512 Signature = FE4F4AE86A58B6507946715934FE2D8FF9D95B6B098FE73974CF5605C98FBA0E1EF34D4B5A1577A7DCF59457CAE52290 # RFC 6979 A.2.4. ECDSA, 224 Bits (Prime Field) Group = secp224r1 X = 0xF220266E1105BFE3083E03EC7A3A654651F45E37167E88600BF257C1 Msg = 73616D706C65 Hash = SHA-1 Signature = 22226F9D40A96E19C4A301CE5B74B115303C0F3A4FD30FC257FB57AC66D1CDD83E3AF75605DD6E2FEFF196D30AA7ED7A2EDF7AF475403D69 Hash = SHA-224 Signature = 1CDFE6662DDE1E4A1EC4CDEDF6A1F5A2FB7FBD9145C12113E6ABFD3EA6694FD7718A21053F225D3F46197CA699D45006C06F871808F43EBC Hash = SHA-256 Signature = 61AA3DA010E8E8406C656BC477A7A7189895E7E840CDFE8FF42307BABC814050DAB5D23770879494F9E0A680DC1AF7161991BDE692B10101 Hash = SHA-384 Signature = 0B115E5E36F0F9EC81F1325A5952878D745E19D7BB3EABFABA77E953830F34CCDFE826CCFDC81EB4129772E20E122348A2BBD889A1B1AF1D Hash = SHA-512 Signature = 074BD1D979D5F32BF958DDC61E4FB4872ADCAFEB2256497CDAC30397A4CECA196C3D5A1FF31027B33185DC8EE43F288B21AB342E5D8EB084 Msg = 74657374 Hash = SHA-1 Signature = DEAA646EC2AF2EA8AD53ED66B2E2DDAA49A12EFD8356561451F3E21C95987796F6CF2062AB8135271DE56AE55366C045F6D9593F53787BD2 Hash = SHA-224 Signature = C441CE8E261DED634E4CF84910E4C5D1D22C5CF3B732BB204DBEF019902F42847A63BDC5F6046ADA114953120F99442D76510150F372A3F4 Hash = SHA-256 Signature = AD04DDE87B84747A243A631EA47A1BA6D1FAA059149AD2440DE6FBA6178D49B1AE90E3D8B629BE3DB5683915F4E8C99FDF6E666CF37ADCFD Hash = SHA-384 Signature = 389B92682E399B26518A95506B52C03BC9379A9DADF3391A21FB0EA4414A718ED3249FF6DBC5B50C27F71F01F070944DA22AB1F78F559AAB Hash = SHA-512 Signature = 049F050477C5ADD858CAC56208394B5A55BAEBBE887FDF765047C17C077EB13E7005929CEFA3CD0403C7CDCC077ADF4E44F3C41B2F60ECFF # RFC 6979 A.2.5. ECDSA, 256 Bits (Prime Field) Group = secp256r1 X = 0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721 Msg = 73616D706C65 Hash = SHA-1 Signature = 61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D326D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB Hash = SHA-224 Signature = 53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3FB9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C Hash = SHA-256 Signature = EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8 Hash = SHA-384 Signature = 0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF77194861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954 Hash = SHA-512 Signature = 8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F002362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE Msg = 74657374 Hash = SHA-1 Signature = 0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A8901B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1 Hash = SHA-224 Signature = C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D Hash = SHA-256 Signature = F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083 Hash = SHA-384 Signature = 83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB68DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C Hash = SHA-512 Signature = 461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A0439AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55 # RFC 6979 A.2.6. ECDSA, 384 Bits (Prime Field) Group = secp384r1 X = 0x6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5 Msg = 73616D706C65 Hash = SHA-1 Signature = EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443 Hash = SHA-224 Signature = 42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE0601229DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D Hash = SHA-256 Signature = 21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CDF3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0 Hash = SHA-384 Signature = 94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4699EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8 Hash = SHA-512 Signature = ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD7882433709512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5 Msg = 74657374 Hash = SHA-1 Signature = 4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282 Hash = SHA-224 Signature = E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E7207041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66 Hash = SHA-256 Signature = 6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265 Hash = SHA-384 Signature = 8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DBDDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5 Hash = SHA-512 Signature = A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736 # RFC 6979 A.2.7. ECDSA, 521 Bits (Prime Field) Group = secp521r1 X = 0x0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538 Msg = 73616D706C65 Hash = SHA-1 Signature = 00343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D00E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16 Hash = SHA-224 Signature = 01776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E0050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F Hash = SHA-256 Signature = 01511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A7004A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC Hash = SHA-384 Signature = 01EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C6745101F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61 Hash = SHA-512 Signature = 00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A Msg = 74657374 Hash = SHA-1 Signature = 013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D036701E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF Hash = SHA-224 Signature = 01C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB0177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4 Hash = SHA-256 Signature = 000E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA800CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86 Hash = SHA-384 Signature = 014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C0133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979 Hash = SHA-512 Signature = 013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3 # Brainpool tests (generated by botan) Group = brainpool256r1 X = 0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721 Msg = 73616D706C65 Hash = SHA-1 Signature = 3145D09CC6F119C5CBF7DFF330C248108E2DDB190B07488125CD88AE2BE0BB305E13FFB288494C288AE30B6C932E72330541E39A288F658699BC53381951AE37 Hash = SHA-224 Signature = 2BA902B3465D975F99DF5013D9D1BE908F71455DD8B9C3B3867F974C9D9805EA4FBE5F6F2C3534B059EA23FBE783DBAF9B15F534264F43927162956D30FF484A Hash = SHA-256 Signature = 591D196BFD2BCD2AFAF6FC303934EE957EED8593082D9FFAA83893D5F168E56E0DCEE6583F22E2E686CB55ECC66B894895E6D300F8693ACE3DA8C2D4A2A615D6 Hash = SHA-384 Signature = 1F6D853E37EACECC978C75DAEC814FC09317092F4A2B9EC663BF0BC51E57B15A00B76461EB72776236BA54BE13D56498860C6D3C417F07AEB1D0B42E3261B4E0 Hash = SHA-512 Signature = 3861F86C0B5A5D93342F734EAFB0F85757901A7D2696D2DDDC30B38102987BDC0521AABEC38CD35FCC0B0188BA66D9E18DE4F6E8FE9FF5E53569B502639477B7 Msg = 74657374 Hash = SHA-1 Signature = 222F9288B54516A39A0735F69DD83DE1652DD31DEB95FA7A950B2234BAE0887E2DA98516C4B374F9172894CEDDF7208EAD3F6060A2B4B11C96458E209A6AB279 Hash = SHA-224 Signature = 2813785404749F87DE6D07AB80292E86FB9492122C0A35F236880210C377E5BC81E31C02BD457D19346B2DC293E81EE9DC5B8897E4ED1C8B5185B8C39776444A Hash = SHA-256 Signature = 8B75FB302FE9253278815380D1B8D98D3EC3ACA7DB1B4BEAC1ACBE32D1249417230C64E3D5B4EFCF8073CB794322AA35FC6E38DBAC70199AC06034E7259E2558 Hash = SHA-384 Signature = 26119D75A15EE75084792FA79D07660A87A43A0BC9E01CFE6E0D5B5C996CC7141952B973BD81DE39EC7FD0FD0E2C5D8CDE2B70DB933B07028D85A6AC643A8947 Hash = SHA-512 Signature = 84039C443BB9D976701D639B3E4F49762A23ED313BC009D71EF48EBCF317E61306B712F9ADE609D50394C2EEA3380A29029347823216165769E69C7AFB0021FF Group = brainpool384r1 X = 0x6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5 Msg = 73616D706C65 Hash = SHA-1 Signature = 209F80A46A49C00C5604AEF2396C463AB315042E69BCEC63230DA22C980C748C91FA57487A0685BE22777FDC9DBDAC5A7F78CEB52092CA04C4941CE86DF060FF8315EDDBEA744556CCC5D62BA11BE6F6F113E5AD92262884FD33A50F7E58BB54 Hash = SHA-224 Signature = 852CA38D56B5F471B9C27790A65277768866A530759E89F37FBF92C66F0022A40840F784A7E91E32EDBA6E24F9FE6FC62C5DAE40E2BD3B4F566C059B5169BD401CAABA3CDB7B191F2DE9AC271390F689363CC9EC2FA6AA36237B1DDAD7BB34A5 Hash = SHA-256 Signature = 738A695B46D4F93E1C4EAF2B07EC2AEF9B4029A7131C1BE131788D07E09EF1C63BCE6783CA6D2692914258CAF8348246792D75E0363246CA0A973CB475541A61FD1B43B5F606E3C35F85F59B75B076F4C322D736B8986C3D7C52E6981E5B678F Hash = SHA-384 Signature = 7F58979116F712AD482269BC1A0101B054087BDB7F18085688DF7A1D284CA526793400FF547150F2FD3331BAF96050596FFECC3671F57DCE14F16997E54732FA37250EC7068C9475808AA22D23D310CE07EE00DC24C58FAE11FF63CF6C61A016 Hash = SHA-512 Signature = 213AE17E4FE67D867D14B6E58640BCC450F20E507B0CE327C8FA13F7D879442CE5A68526B46EA1B57A77DC8176C919367A09BF974C01D6692DF70B7B79570B48DBFF8E793FF468D46D63B09E9E9D0F44F10DCA4654E736A72C18016AE4DC617B Msg = 74657374 Hash = SHA-1 Signature = 135BF8DD5FF35EC782C471E0828650A8B35C6587EB409EBC7A75BB55F8BA13DE425E8E1C5295AEE390B6072A612F729142590B734F6F4F847BF8F3C0FB07071D5F053307EE308ECE3E027A0EC4D02CC5C3BB985A833616B38719D2B4DADF6A5A Hash = SHA-224 Signature = 514C9D8D17AD45EA567490D21A8E28740C3C9A685D66763550653779A8023C8C9A7DFC1A0AA372D9AEA01F97E0449F4831CB476893F68D841CD4BFCD4C278252A95B62EBB74F7A4483F6DBA3691DA60B0B516A9124C9C8A74C2C5F357FDA5361 Hash = SHA-256 Signature = 04C918A74D48214A976C013D1F861DE877AFC14BE079E9D24064956317AAE7A92B9D5FC3B353ED252F97E2DB5FA1FD747744C79C8FD968F8F0DD5E84F42C324EB59FC579507C06C31A73446A945B65617BF50D170A6449F71C1E8A0207A6BB7C Hash = SHA-384 Signature = 665944E820E0052D34A720E08A5A63508D24DA14D67C88636E1362756ED4C3BFED946532F20E088260C0ED4E714157070AF09D9150C711361A2DD58E148841D797C0D6B98C8D032365BB1DD8C39383F6F7E6E19946143E5DEA08D4EC1FAB350D Hash = SHA-512 Signature = 14AA3D90105782F288176707FBF3B239D1301E34D76018B5194C1CDD8C878D7FF44351CD22AFA130CB3C722A69172A881F9B1E4A98C9BEA26C8750708DF7AB6946FEBA23E328C980942092B8C3F8FE4ECCD24F7B7A316F39AFAB696F30E6BDF8 Group = brainpool512r1 X = 0xD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538 Msg = 73616D706C65 Hash = SHA-1 Signature = 9F359636EA685CBE5EE9C4CD81118880F28D0BCC4F2085ECF6C6ECD12D32983AC47F81FFC6F76C2F76BBA7731EC5758BCC637BEFE3D7193FC121A17E6828EED98164C35FCDBFDC6C7049209FB2237F206EC31DAA9C6DE12E9F3A3E5CDA7845A7969EC82F0944905352328FA94BDEDBFD1BF20FEE91D2AAF67280B8C2CF8097B2 Hash = SHA-224 Signature = 185D75AA7DD7EB59CA38480C262F7062B09533CA294E4CEEC9356076A359828D2527A695002FF1D1FF27DD8A88F5B28DFCED0E2AB964A38F7BD6CFD57C5784A59C07761461DEB3E6561B809E9C76EEE87FD3DE6023A8E4FE3C0E0B35449922345E308CDDD4E0161AD4E5912780FC492B9EBE70E642537F243BAFDCC129415358 Hash = SHA-256 Signature = 4CF9E0866DCA62AF7E49B1BCC2C7DE589238E2C6B592A05AFBFB3B48078477D1204CFEE8EE7EEDF9254FB86A162ED1C87B2892811B51DCF305FD0946DA94F06B086F4908EC8AE3E680EDBE29B9E52B9856C6E4E134810408C062A6E8D383C585D3D5A5D6202379FD765E80C74C9E6760A03DC2F02B8342EBA09BC71DB3F6B394 Hash = SHA-384 Signature = 7FF6052F11A704057815619986D820B357404B6EC085FC7F0745BF2098A06C4CB6624713259281E3EF8A99DBD643BA45C94DC96EFD9577E7C4E5913F888224530A22E727CF63B8FE86F191D198244A12E7BB10E610E4A704246EEC676DCDB4D134D2052ECB067B506A7ECB68AC5C6CFBD36461B79F1C00DAEC826053819C88EB Hash = SHA-512 Signature = 53A5E6AB40FA0092DAA5D57307D60288FD1EFEA3D87CC8AFEC926D5D5850C584BDD24924056670CE54E68C273EEF6227708D052F14AE21F34417279DDE107A4F2445FD8D08F6DF2933D2A16C9851022D7D62C370B08F65282BCD0425CC3938C0D4B1069D430AFA1ACC5F0A708458E821AE448D9036634961709E1AEBE30FAAC7 Msg = 74657374 Hash = SHA-1 Signature = 1A17F1667459C2725AF2295739DB03A8E01D2DF796744D6A0345181ACBCFFE09EDEDD5C38104F4CD190F7E36269322AAEA6CB909AEB580EB80DDF9C90246B45F46084FEC2E22ACB8A73589539AAAAF826CCCA560F426E43B1EED0E0322AE6AD84CAE7B1A313D2DF2D113A36306F0D9D7DC72824DC355AD0323B1FD10742E32C8 Hash = SHA-224 Signature = 95869AF9CB492DB00FE123B30F682E9B97054F9B29DBA6396FCEAFA4ECAA30317441AA526CC5FD666A920072FECBA1761141140CC1EC37C359A51ED3B22742C93C072CAD99DF9397320FF7A4B2AAF699D1657461BFEC85A81A0B194D6669DFA94BA7B7803930289E1D27B7CFE216EA3821AAD80C5E7D94BD8E532678CDFA4B25 Hash = SHA-256 Signature = 0F008D33B72EBDFA4B712B9507E17AE14F228A9E3F3B94C71BAAEB78C811EDDA3750ECF54A70E7F30ABF4B358C787FCFA22631D4D258D023C32464F6C977BB40599024AAF2853937CB04E9D42976CD11CDC3706258571C7383300BC8576BE63B58D247C37961F78F70D38A2E959DFBE4D7E4D83FBE5541AEDD6E2C4CCDBEF97F Hash = SHA-384 Signature = 68A9D5E7EB435DB2BD4EA20BEBBBFD17DEADADC318E88D87C7799B68EFB423BFA48F691A2A52BDD972CDECA3C4DBBABD486199D2D1B33C683CB8C237C8F6F4955C14B440C7FA677D809007A9F03D1F6A55181A9438066E226BF3785FD55130ABB6D13A78FA7AFCCC28C442004C4EC1FBCC75D7C9FF7D64F16FE75833860B4078 Hash = SHA-512 Signature = 582D94BDDA4C53EF4148AA4663D5183F122A5E4210E955E2D28E00C00EFC41FB91B340915C0D8C47A0AE7FEBD12A5C2DF1C72DD9DD7369A818689F5F3D5D1E5BA7F13830FCB00FC85A9DA30314BBC11CD8ECA63D296237ADD513B30C8D9A33C590BE0927C5E879207A3B84B317BB859590832818C0DD054FD6F709C8D24BFC56 # secp160r1 RFC 6979 signatures, generated by botan Group = secp160r1 X = 0x6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD18 Msg = 73616D706C65 Hash = SHA-1 Signature = 00CC9CD383D3EA80ADC9165C25F6F82A2ABB41943E00A74AEB2B96B8F7D6FC03F67ED226FCE0BAA6D7EB Hash = SHA-224 Signature = 00AB01FAF31D1044023725665A95CE1AEF6680CE6E00ECEE1D6FED07ACF9ED7F197D2C29022D1592E5DF Hash = SHA-256 Signature = 00766B26E5C3201982F5B3AB1AC92C018F5A990CB6008C16BF4AB8CF6EE3ED4A821B3A890CD30E2F6925 Hash = SHA-384 Signature = 009AD138B36636B550705112D14574EF6E7996263F00F360D79AD85661B305D56D64A20DA33182E1462B Hash = SHA-512 Signature = 0024A0B0069722A4A3DDAF40B0EE66BAD0B117D658003A6DB6DEEF2EB563115FA48D7E0FECB540802E13 Msg = 74657374 Hash = SHA-1 Signature = 007FF876220B4EAF1E1F9C9694685CDA37B1DF45CA00D2A7917831648FB5A3351C22ED605BA8B8B6C16C Hash = SHA-224 Signature = 00A616A5A4C482D60F44900916D9665BFD090854FC003BD6C529D45F5F70BD6F242981E23A119EEAE23A Hash = SHA-256 Signature = 007F281E95A74F5EF24B40D489AD270284E8E52E5D00F4803ACFD86356DC95E9AD39930C09050C6CCA4B Hash = SHA-384 Signature = 00C114E2B133AD8E725AF43AEFC381BE87063DB3FC00CAFAEB1949015CF4EC9EC2476F3970D3D97E08FF Hash = SHA-512 Signature = 0080F3C4742E7341BE2E4D86E88757AB96F62427B500FD634D64F554BEC04211952798147420BBC98E15 # frp256v1 (generated by botan) Group = frp256v1 X = 0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721 Msg = 73616D706C65 Hash = SHA-1 Signature = C166CA2860656988B707FBCF329B01A4D8A7DC8585F4AEDDA4BF4040B44033F1310AA6C1F323051C82868F29201511C027445D7F2177E4AF42B85089C836B258 Hash = SHA-224 Signature = 21FCFA0D5FA4C22615FAF23F4A8881004A71EE40228FD68E4C200668A156696227987B360BCA567173B8F2898E3522D3AD27EF94DCE5163401D1AC596D4041F5 Hash = SHA-256 Signature = 1E56BDA16AD1CA21C8B56EB11A01C44985A8C71D504E42C554902525F72D975F1CD22B10EA0591A641BDD694EAF9DE6631D0C89425BCAC2AEEB49EBB445D9F05 Hash = SHA-384 Signature = 0E1F2F0E298D5D281B69D211792C464D4AB540C1A998BAB13855C852C25BEF3D0C8CFED46EECD54EF7B8E4F54FD5B58F8FF713D416FEC1214E6CA874D5FBD842 Hash = SHA-512 Signature = 0A818869A89433DB9E5838D6934FA7C15259250B8FE025DB3DC41036B120288A6DFB2464BF9062D035A6FBEC2B8B298A53F228DD7E8501BA479C008B060F0DEC # Msg that produces a hash with leading zeros. Test created with BouncyCastle Group = secp521r1 X = 0x0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538 Msg = FCABA2CF434AC8DCFCEC Hash = SHA-1 # For P-521 signature BouncyCastle does not include the leading 0 # nibbles in (r,s) leading to a 1 byte shorter signature. Botan # doesn't handle this, so this was modified to insert 0s where needed Signature = 019F10F75FA90A9129D596F3461829B3FE24DA8344C09CABA4F5BBEE36F246C356ED95C609E76D2B3B17480D45CBF11FAF395846BD3978657F8932345EE284ED32D101C07B02B74254F6F1C715D1A63B9FAA30E43C72645D20F30525EB88BB675C3BAEE1D20BAFA463F899253F5557033EDFC41F9748010FEDF73612774AC99A3B21082D # Test signing a message that hashes to all zeros X = 5 Group = secp256r1 Hash = Raw Msg = 0000000000000000000000000000000000000000000000000000000000000000 Signature = AE15A0963B6E0144E7F801616DBBBF1BB4C4943CA85B0AF9D00F3FA5CACB95FB02032D911851E27F8E5C565A43F54DE6E03EFF81A9BF73B9ACC47B363979F101 X = 5 Group = secp256r1 Hash = Raw(SHA-256) Msg = 0000000000000000000000000000000000000000000000000000000000000000 Signature = 921D2C2012856C4F8BD1AB9229C302848AB99CFCF92A512BD24B9A08F3C0DF99CE18D76B930B81493E77737E24285D07F2919C98AFE32F2450A28BA50FBE32E8 X = 5 Group = secp384r1 Hash = Raw Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Signature = 53C99B5021F9DD7B8D2EC1C1BB17C03FCFF324DED361B4845D9C98E1A3F490C63946BA68DF0FA26AE62BB6E04531581C9D29FF7775BE15F14C1AA86B292F987241E42241E08DBA4229597260A4D9F433AC78F36D772F83499C5E2E3AF68F83E4 X = 5 Group = secp384r1 Hash = Raw(SHA-384) Msg = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Signature = 7A5C707564BF8DA1261387DFD5D5ED2A8C10B3AA4D00C9A927D5729E8BB555954F94799B972CD6F976B99703A561A1AD62929113627D363F5765D5FFCEBCF529B6B74D78B91D7A400D7E09C7613571C25E55AC98989635BE251EE123AA9A63CC X = 5 Group = secp521r1 Hash = Raw(SHA-512) Msg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Signature = 0157BC701722FB4853DD9F3E9BBAE977137CF04659B3CF4BD9A3FF47D8E1DF3D7B9A1E291234CD8AE9C9B9711F22C9B3B127F6217A582A9830D75184CB6A6AC174570164A920D8059F8BC21F4FBFDEE3140CF1033F3AB10260A71CBD32197822C3B575BC44DA681EBBB4612357A1E81670B2A76A35DDA2AAE708F7FD7D66D1EAE453249C # Test Raw(hash) using RFC 6979 test cases Group = secp256r1 X = 0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721 Msg = 8151325DCDBAE9E0FF95F9F9658432DBEDFDB209 Hash = Raw(SHA-1) Signature = 61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D326D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB Msg = 9003E374BC726550C2C289447FD0533160F875709386DFA377BFD41C Hash = Raw(SHA-224) Signature = 53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3FB9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C Msg = AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF Hash = Raw(SHA-256) Signature = EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8 botan-2.4.0/src/tests/data/pubkey/ecgdsa.vec000066400000000000000000000130661322470703100207130ustar00rootroot00000000000000 # The Digital Signature Scheme ECGDSA, Erwin Hess, Marcus Schafheutle, and Pascale Serf, Siemens AG, October 24, 2006 # https://www.teletrust.de/fileadmin/files/oid/ecgdsa_final.pdf # 2.4.1 ECGDSA over GF(p) with RIPEMD-160 Group = brainpool192r1 X = 0x80F2425E89B4F585F27F3536ED834D68E3E492DE08FE84B9 Msg = 4578616d706c65206f662045434744534120776974682074686520686173682066756e6374696f6e20524950454d442d313630 Hash = RIPEMD-160 Nonce = 22C17C2A367DD85AB8A365ED06F19C43F9ED18349A9BC044 Signature = 2D017BE7F117FF994ED6FC63CA5B4C7A0430E9FA095DAFC4C02B5CC5C51D5411060BF0245049F824839F671D78A1BBF1 Group = brainpool256r1 X = 0x47B3A27862DEF03749ACF0D600E69F9B851D01EDAEFA531F4D168E787307F4D8 Nonce = 908E3099776261A4558FF7A9FA6DFFE0CA6BB3F9CB35C2E4E1DC73FD5E8C08A3 Signature = 62CCD1D291E62F6A4FFBD966C66C85AABA990BB6AB0C087DBD54A456CCC84E4C9119719B08EEA0D6BC56E4D1D37369BCF3768445EF65CAE4A37BF6D43BD01646 Group = brainpool320r1 X = 0x486835945A3A284FFC52629AD48D8F37F4B2E9939C52BC72362A996140192AEF7D2AAFF0C73A51C5 Nonce = C70BC00A77AD78725D36CEEC27D6F956FB546EEF6DC90E3531452BD87ECE8A4A7AD730ADC299D81B Signature = 3C925969FAB22F7AE7B8CC5D50CB0867DFDB2CF4FADA3D490DF75D72F7563186419494C98F9C82A606AB5250B31A8E935619489461733200E4FD5C1275C0AB37E7E411495BAAE14541DF6DE666B8CA56 # 2.4.2 ECGDSA over GF(p) with SHA-1 Group = brainpool192r1 X = 0x80F2425E89B4F585F27F3536ED834D68E3E492DE08FE84B9 Msg = 4578616d706c65206f662045434744534120776974682074686520686173682066756e6374696f6e205348412d31 Hash = SHA-1 Nonce = 22C17C2A367DD85AB8A365ED06F19C43F9ED18349A9BC044 Signature = 2D017BE7F117FF994ED6FC63CA5B4C7A0430E9FA095DAFC418FD604E5F00F55B3585C0528C319A2B05B8F2DDEE9CF1A6 # 2.4.3 ECGDSA over GF(p) with SHA-224 Group = brainpool256r1 X = 0x47B3A27862DEF03749ACF0D600E69F9B851D01EDAEFA531F4D168E787307F4D8 Msg = 4578616d706c65206f662045434744534120776974682074686520686173682066756e6374696f6e205348412d323234 Hash = SHA-224 Nonce = 908E3099776261A4558FF7A9FA6DFFE0CA6BB3F9CB35C2E4E1DC73FD5E8C08A3 Signature = 62CCD1D291E62F6A4FFBD966C66C85AABA990BB6AB0C087DBD54A456CCC84E4C6F029D921CBD25526EDCCF1C45E3CBF7B7A5D8D4E005F0C41C49B052DECB04EA Group = brainpool320r1 X = 0x486835945A3A284FFC52629AD48D8F37F4B2E9939C52BC72362A996140192AEF7D2AAFF0C73A51C5 Nonce = C70BC00A77AD78725D36CEEC27D6F956FB546EEF6DC90E3531452BD87ECE8A4A7AD730ADC299D81B Signature = 3C925969FAB22F7AE7B8CC5D50CB0867DFDB2CF4FADA3D490DF75D72F7563186419494C98F9C82A66EA191CA0D468AC3E95687689338357C7D0BACB3F1D87E0DEC05F635B7ADB84275AA008660F812CF # 2.4.4 ECGDSA over GF(p) with SHA-256 Group = brainpool256r1 X = 0x47B3A27862DEF03749ACF0D600E69F9B851D01EDAEFA531F4D168E787307F4D8 Msg = 4578616d706c65206f662045434744534120776974682074686520686173682066756e6374696f6e205348412d323536 Hash = SHA-256 Nonce = 908E3099776261A4558FF7A9FA6DFFE0CA6BB3F9CB35C2E4E1DC73FD5E8C08A3 Signature = 62CCD1D291E62F6A4FFBD966C66C85AABA990BB6AB0C087DBD54A456CCC84E4C1DD53F822F8BE769F601FC5826B10AB603898374B8501B53D6976BA1AAE17A45 Group = brainpool320r1 X = 0x486835945A3A284FFC52629AD48D8F37F4B2E9939C52BC72362A996140192AEF7D2AAFF0C73A51C5 Nonce = C70BC00A77AD78725D36CEEC27D6F956FB546EEF6DC90E3531452BD87ECE8A4A7AD730ADC299D81B Signature = 3C925969FAB22F7AE7B8CC5D50CB0867DFDB2CF4FADA3D490DF75D72F7563186419494C98F9C82A624370797A9D11717BBBB2B762E08ECD07DD7E033F544E47CBF3C6D16FD90B51DCC2E4DD8E6ECD8CD Group = brainpool384r1 X = 0x60BABEC49D0A4E36328879591B1A598F339F7971E8A1AD35788486EB081C838B5612F6DEBD6B38A0BA720BD857AB2354 Nonce = 43E01A2A95EE7695955334410F32C73BD1394BBF2CD7B8A18656B447A951342C82F52E833FFB3B74612679437C13ACB5 Signature = 2A2676EFF87A75EE9ECBA1FDD7A5437697294166063C8CD90F8AEBA399BF450FFA244C0EE69B3E1FFCA395CD27AFFC6156F6A18906455867EB51EBE46049A11D79AEED1500D1D1A43D876E422C9234ED6F59AB7D336BCE12CED3D7ECBC09CAE3 # 2.4.5 ECGDSA over GF(p) with SHA-384 Group = brainpool384r1 X = 0x60BABEC49D0A4E36328879591B1A598F339F7971E8A1AD35788486EB081C838B5612F6DEBD6B38A0BA720BD857AB2354 Msg = 4578616d706c65206f662045434744534120776974682074686520686173682066756e6374696f6e205348412d333834 Hash = SHA-384 Nonce = 43E01A2A95EE7695955334410F32C73BD1394BBF2CD7B8A18656B447A951342C82F52E833FFB3B74612679437C13ACB5 Signature = 2A2676EFF87A75EE9ECBA1FDD7A5437697294166063C8CD90F8AEBA399BF450FFA244C0EE69B3E1FFCA395CD27AFFC61733F4E370AF3F9A2DF9499F9953E091D7BD28CA8E80FB3B4AAEB1FF324CCDF6E4D7F6B4576071321D8B34C20CAF0CD01 Group = brainpool512r1 X = 0x92006A988AF96D9157AADCF8627169627CE2ECC4C58ECE5C1A0A864211AB764C04236FA0160857A78E71CCAE4D79D52E5A69A4578AF506581F598FA9B4F7DA68 Nonce = 6942B01D5901BEC1506BB8749618E22EC0FCD7F35159D51ED53BA77A78752128A58232AD8E0E021AFDE1477FF4C74FDFFE88AE2D15D89B56F6D73C0377631D2B Signature = 0104918B2B32B1A549BD43C30092953B4164CA01A1A97B5B0756EA063AC16B41B88A1BAB4538CD7D8466180B3E3F5C8646AC4A45F564E9B68FEE72ED00C7AC483D233E9FD9EB152E889F4F7CF325B4640894E5EA44C5144354305CD4BF70D2348257C2DBE06C554492CE9FDD6861A56577B53E5EE80E606231A4CF068FA1EC21 # 2.4.5 ECGDSA over GF(p) with SHA-512 Group = brainpool512r1 X = 0x92006A988AF96D9157AADCF8627169627CE2ECC4C58ECE5C1A0A864211AB764C04236FA0160857A78E71CCAE4D79D52E5A69A4578AF506581F598FA9B4F7DA68 Msg = 4578616d706c65206f662045434744534120776974682074686520686173682066756e6374696f6e205348412d353132 Hash = SHA-512 Nonce = 6942B01D5901BEC1506BB8749618E22EC0FCD7F35159D51ED53BA77A78752128A58232AD8E0E021AFDE1477FF4C74FDFFE88AE2D15D89B56F6D73C0377631D2B Signature = 0104918B2B32B1A549BD43C30092953B4164CA01A1A97B5B0756EA063AC16B41B88A1BAB4538CD7D8466180B3E3F5C8646AC4A45F564E9B68FEE72ED00C7AC4817A011F8DD7B56652B27AA6D6E7BDF3C7C23B5FA32910FBAA107E6270E1CA8A7A263F6618E6098A0D6CD6BA1C03544C5425875ECB3418AF5A3EE3F32143E48D2 botan-2.4.0/src/tests/data/pubkey/ecies-18033.vec000066400000000000000000000047101322470703100212250ustar00rootroot00000000000000# ISO/IEC 18033-2 2006 # ECIES-KEM test vectors for ECModp-Group # ---------------------------------------------------------------------------------------------------- # C.2.2 # Kdf=Kdf1(Hash=Sha1()) # Keylen=128 # CofactorMode=0 # OldCofactorMode=0 # CheckMode=0 # SingleHashMode=0 format = uncompressed p = 0xfffffffffffffffffffffffffffffffeffffffffffffffff a = 0xfffffffffffffffffffffffffffffffefffffffffffffffc b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1 mu = 0xffffffffffffffffffffffff99def836146bc9b1b4d22831 nu = 0x01 gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012 gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811 # Public Key hx = 0x1cbc74a41b4e84a1509f935e2328a0bb06104d8dbb8d2130 hy = 0x7b2ab1f10d76fde1ea046a4ad5fb903734190151bb30cec2 # Private Key x = 0xb67048c28d2d26a73f713d5ebb994ac92588464e7fe7d3f3 # Encoding format = uncompressed_fmt r = 0x083d4ac64f1960a9836a84f91ca211a185814fa43a2c8f21 C0 = 04ccc9ea07b8b71d25646b22b0e251362a3fa9e993042315df047b2e07dd2ffb89359945f3d22ca8757874be2536e0f924 K = 9a709adeb6c7590ccfc7d594670dd2d74fcdda3f8622f2dbcf0f0c02966d5d9002db578c989bf4a5cc896d2a11d74e0c51efc1f8ee784897ab9b865a7232b5661b7cac87cf4150bdf23b015d7b525b797cf6d533e9f6ad49a4c6de5e7089724c9cadf0adf13ee51b41be6713653fc1cb2c95a1d1b771cc7429189861d7a829f3 # ---------------------------------------------------------------------------------------------------- # C.2.3 # Kdf=Kdf1(Hash=Sha1()) # Keylen=128 # CofactorMode=0 # OldCofactorMode=0 # CheckMode=0 # SingleHashMode=0 format = compressed p = 0xfffffffffffffffffffffffffffffffeffffffffffffffff a = 0xfffffffffffffffffffffffffffffffefffffffffffffffc b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1 mu = 0xffffffffffffffffffffffff99def836146bc9b1b4d22831 nu = 0x01 gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012 gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811 # Public Key hx = 0x1cbc74a41b4e84a1509f935e2328a0bb06104d8dbb8d2130 hy = 0x7b2ab1f10d76fde1ea046a4ad5fb903734190151bb30cec2 # Private Key x = 0xb67048c28d2d26a73f713d5ebb994ac92588464e7fe7d3f3 # Encoding format = compressed_fmt r = 0x083d4ac64f1960a9836a84f91ca211a185814fa43a2c8f21 C0 = 02ccc9ea07b8b71d25646b22b0e251362a3fa9e993042315df K = 8fbe0903fac2fa05df02278fe162708fb432f3cbf9bb14138d22be1d279f74bfb94f0843a153b708fcc8d9446c76f00e4ccabef85228195f732f4aedc5e48efcf2968c3a46f2df6f2afcbdf5ef79c958f233c6d208f3a7496e08f505d1c792b314b45ff647237b0aa186d0cdbab47a00fb4065d62cfc18f8a8d12c78ecbee3fd botan-2.4.0/src/tests/data/pubkey/ecies.vec000066400000000000000000000325441322470703100205570ustar00rootroot00000000000000# random keys created by botan #public static void main(String[] args) # throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidCipherTextException { # X9ECParameters spec = SECNamedCurves.getByName("secp521r1"); # ECDomainParameters ecDomain = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN()); # # ECPrivateKeyParameters alice = new ECPrivateKeyParameters( # new BigInteger("4050298667054381376040649773970530311598264897556821662677634075002761777100287880684822948852132235484464537021197213998300006547176718172344447619746779823", 10), ecDomain); # ECPrivateKeyParameters bob = new ECPrivateKeyParameters( # new BigInteger("2294226772740614508941417891614236736606752960073669253551166842586609531509032791476032516821966982891507407145617606630445744825404691681749451640151380153", 10), ecDomain); # ECPublicKeyParameters alicePublicKey = new ECPublicKeyParameters( # alice.getParameters().getG().multiply(alice.getD()), alice.getParameters()); # ECPublicKeyParameters bobPublicKey = new ECPublicKeyParameters(bob.getParameters().getG().multiply(bob.getD()), # bob.getParameters()); # # byte[] d = new byte[0]; # byte[] e = "Test".getBytes(); # //byte[] e = new byte[0]; # //byte[] iv = new byte[16]; # byte[] iv = Hex.decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); # int mac_key_len = 128; # int dem_key_len = 256; # CipherParameters p = new ParametersWithIV(new IESWithCipherParameters(d, e, mac_key_len, dem_key_len), iv); # # IESEngine ecies = new IESEngine(new ECDHBasicAgreement(), new KDF1BytesGenerator(new SHA512Digest()), # new HMac(new SHA512Digest()), new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()))); # ecies.init(true, alice, bobPublicKey, p); # # byte[] message = Hex.decode("000102030405060708090A0B0C0D0E0F"); # byte[] result = ecies.processBlock(message, 0, message.length); # # byte[] ephPublicKey = alicePublicKey.getQ().getEncoded(true); # byte[] out = Arrays.concatenate(ephPublicKey, result); # # System.out.println("Curve = secp521r1"); # System.out.println("PrivateKey = 4050298667054381376040649773970530311598264897556821662677634075002761777100287880684822948852132235484464537021197213998300006547176718172344447619746779823"); # System.out.println("OtherPrivateKey = 2294226772740614508941417891614236736606752960073669253551166842586609531509032791476032516821966982891507407145617606630445744825404691681749451640151380153"); # System.out.println("Kdf = KDF1-18033(SHA-512)"); # System.out.println("Dem = AES-256/CBC"); # System.out.println("DemKeyLen = " + dem_key_len / 8); # System.out.println("Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); # System.out.println("Mac = HMAC(SHA-512)"); # System.out.println("MacKeyLen = " + mac_key_len / 8 ); # System.out.println("Format = uncompressed"); # System.out.println("CofactorMode = 0"); # System.out.println("OldCofactorMode = 0"); # System.out.println("CheckMode = 0"); # System.out.println("SingleHashMode = 1"); # System.out.println("Label = Test"); # System.out.println("Plaintext = " + Hex.toHexString(message).toUpperCase() ); # System.out.println("Ciphertext = " + Hex.toHexString( out ).toUpperCase()); # } Curve = secp160r1 PrivateKey = 1239488582848888730519239446720775754920686817364 OtherPrivateKey = 1255825134563225934367124570783723166851629196761 Kdf = KDF2(SHA-1) Dem = AES-256/CBC DemKeyLen = 32 Iv = 00000000000000000000000000000000 Mac = HMAC(SHA-256) MacKeyLen = 20 Format = compressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Plaintext = 00 Ciphertext = 02b26eafa6b51a39790c32a75c2f10b3e8e89d698a6da2667af153734225c8922800db5e10b73975848cceac0fc78cef589b2e93a81cc204dbc7b9b901cbaa4509e61141d7 Curve = secp160r1 PrivateKey = 1239488582848888730519239446720775754920686817364 OtherPrivateKey = 1255825134563225934367124570783723166851629196761 Kdf = KDF1-18033(SHA-1) Dem = AES-256/CBC DemKeyLen = 32 Iv = 00000000000000000000000000000000 Mac = HMAC(SHA-256) MacKeyLen = 20 Format = compressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Plaintext = 00 Ciphertext = 02b26eafa6b51a39790c32a75c2f10b3e8e89d698aa9467d2b3b27cf8b50794387d9736d99eb055524f926f1b4a60371f016977c0e164045a0547f8bd2bcdb29728183c222 Curve = secp521r1 PrivateKey = 4050298667054381376040649773970530311598264897556821662677634075002761777100287880684822948852132235484464537021197213998300006547176718172344447619746779823 OtherPrivateKey = 2294226772740614508941417891614236736606752960073669253551166842586609531509032791476032516821966982891507407145617606630445744825404691681749451640151380153 Kdf = KDF2(SHA-1) Dem = Camellia-128/CBC DemKeyLen = 16 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-256) MacKeyLen = 16 Format = uncompressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 0401519eaa0489ff9d51e98e4c22349463e2001cd06f8ce47d81d4007a79acf98e92c814686477cea666efc277dc84e15fc95e38aff8e16d478a44cd5c5f1517f8b1f300000591317f261c3d04a7207f01eae3ec70f23600f82c53cc0b85be7ac9f6ce79ef2ab416e5934d61ba9d346385d7545c57f77c7ea7c58e18c70cbfb0a24ae1b994eda8dbc666713558717077dde021d9252b7f68eef0bc369086f6a6cb991fcc2fbcac3671a122ba18541790974cef7420cb53e7d6f30d1b808dddd58a63413f7b Curve = secp521r1 PrivateKey = 4050298667054381376040649773970530311598264897556821662677634075002761777100287880684822948852132235484464537021197213998300006547176718172344447619746779823 OtherPrivateKey = 2294226772740614508941417891614236736606752960073669253551166842586609531509032791476032516821966982891507407145617606630445744825404691681749451640151380153 Kdf = KDF1-18033(SHA-1) Dem = Camellia-128/CBC DemKeyLen = 16 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-256) MacKeyLen = 16 Format = uncompressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090a0b0c0d0e0f Ciphertext = 0401519eaa0489ff9d51e98e4c22349463e2001cd06f8ce47d81d4007a79acf98e92c814686477cea666efc277dc84e15fc95e38aff8e16d478a44cd5c5f1517f8b1f300000591317f261c3d04a7207f01eae3ec70f23600f82c53cc0b85be7ac9f6ce79ef2ab416e5934d61ba9d346385d7545c57f77c7ea7c58e18c70cbfb0a24ae1b994df33ebfb0412ed20e9b10fa3371b64420cb9075da96e37ee2301092f373a857c8f63180bac35e5728890000f19c6322834e911e74f55c8fcb506a9d1533a75e7 Curve = secp521r1 PrivateKey = 4050298667054381376040649773970530311598264897556821662677634075002761777100287880684822948852132235484464537021197213998300006547176718172344447619746779823 OtherPrivateKey = 2294226772740614508941417891614236736606752960073669253551166842586609531509032791476032516821966982891507407145617606630445744825404691681749451640151380153 Kdf = KDF2(SHA-512) Dem = AES-256/CBC DemKeyLen = 32 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-512) MacKeyLen = 16 Format = compressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 0201519EAA0489FF9D51E98E4C22349463E2001CD06F8CE47D81D4007A79ACF98E92C814686477CEA666EFC277DC84E15FC95E38AFF8E16D478A44CD5C5F1517F8B1F30C4363152545731911C03AE45244C41218A63E8DED4C56B9AE2FD7C022C75023D42A3D8D31BE83D80802938B5FEA25DA10323FEAC30ECB37C612EBF00D583FA02B0812F3F52F271B0C50AA2798594AF5CDA577C701F693A3255D0321CDFCC88A Curve = secp521r1 PrivateKey = 4050298667054381376040649773970530311598264897556821662677634075002761777100287880684822948852132235484464537021197213998300006547176718172344447619746779823 OtherPrivateKey = 2294226772740614508941417891614236736606752960073669253551166842586609531509032791476032516821966982891507407145617606630445744825404691681749451640151380153 Kdf = KDF1-18033(SHA-512) Dem = AES-256/CBC DemKeyLen = 32 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-512) MacKeyLen = 16 Format = compressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 0201519EAA0489FF9D51E98E4C22349463E2001CD06F8CE47D81D4007A79ACF98E92C814686477CEA666EFC277DC84E15FC95E38AFF8E16D478A44CD5C5F1517F8B1F3B4D4D7BF8B86834928A86567A7C5AF80538D7F5EFF49F3A14947503EB8ACCC90D916CDC07C0AC00A9D558857F2C2EC3DC5142713F4A4AE0334987BCC3DCE9ABB4403A674F3821124D29D92F184568BA31FC60F1C0C58B4CBBCD6BD588462FC50 # use secp112r2 - curve with cofactor != 1 Curve = -----BEGIN EC PARAMETERS-----MHMCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDmEnwkwF84oKqvZcDvAsBA5R3vGBXbXtdPzDTIXXCQQdBEujCrXokrThZJ3QkoZDrc1G9YguN0fe826VbpcCDjbfCq/YuNdZfKEFINBLAgEE-----END EC PARAMETERS----- PrivateKey = 656008468895526658474428975817604 OtherPrivateKey = 563449446384594847151017584539074 Kdf = KDF2(SHA-1) Dem = Camellia-128/CBC DemKeyLen = 16 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-256) MacKeyLen = 16 Format = uncompressed CofactorMode = 0 OldCofactorMode = 1 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 048c40bda0986dadeb651178b4a8e64b7735fb02f43e621151849ea761a0f79fbb500b76e4eb9cd65281b804406536d04059b60689ed286490afcbf8f7f32dfefff8d37d29d335cb11aef3cc5d65f87571e3c8799974038f9d377a2683 # use secp112r2 - curve with cofactor != 1 Curve = -----BEGIN EC PARAMETERS-----MHMCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDmEnwkwF84oKqvZcDvAsBA5R3vGBXbXtdPzDTIXXCQQdBEujCrXokrThZJ3QkoZDrc1G9YguN0fe826VbpcCDjbfCq/YuNdZfKEFINBLAgEE-----END EC PARAMETERS----- PrivateKey = 656008468895526658474428975817604 OtherPrivateKey = 563449446384594847151017584539074 Kdf = KDF2(SHA-1) Dem = Camellia-128/CBC DemKeyLen = 16 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-256) MacKeyLen = 16 Format = uncompressed CofactorMode = 1 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 048c40bda0986dadeb651178b4a8e64b7735fb02f43e621151849ea761230f2bddf1ffa3262673bcb3f468dd8b92c31a32e23935cfd27dfcc123928a18bbc82bdcada733be6d42119d3fb968ac4b77fff9a47d336fa025bfad3ee54286 Curve = -----BEGIN EC PARAMETERS-----MHMCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDmEnwkwF84oKqvZcDvAsBA5R3vGBXbXtdPzDTIXXCQQdBEujCrXokrThZJ3QkoZDrc1G9YguN0fe826VbpcCDjbfCq/YuNdZfKEFINBLAgEE-----END EC PARAMETERS----- PrivateKey = 656008468895526658474428975817604 OtherPrivateKey = 563449446384594847151017584539074 Kdf = KDF1-18033(SHA-1) Dem = Camellia-128/CBC DemKeyLen = 16 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-256) MacKeyLen = 16 Format = uncompressed CofactorMode = 1 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 048C40BDA0986DADEB651178B4A8E64B7735FB02F43E621151849EA76156865605D031B2DE966E35FE7A8201139C30B19DF8E3CE86657032AE1A1397FD00B223AFC1123550A8ABB3983A9F62C5CC1D9A34B8BD938921D67AE08E07211E Curve = -----BEGIN EC PARAMETERS-----MHMCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDmEnwkwF84oKqvZcDvAsBA5R3vGBXbXtdPzDTIXXCQQdBEujCrXokrThZJ3QkoZDrc1G9YguN0fe826VbpcCDjbfCq/YuNdZfKEFINBLAgEE-----END EC PARAMETERS----- PrivateKey = 656008468895526658474428975817604 OtherPrivateKey = 563449446384594847151017584539074 Kdf = KDF2(SHA-512) Dem = AES-256/CBC DemKeyLen = 32 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-512) MacKeyLen = 16 Format = uncompressed CofactorMode = 1 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 048C40BDA0986DADEB651178B4A8E64B7735FB02F43E621151849EA7616B60902979DFC4E153E419820187D5240C4056F0B59714BFD01F1F7F6F95BD208C8A415DFC474CE1A39D5129B30787338BF3A1607CBEBA9D182EA586917339748BFFA0D4112D84DCFA199E945E0318504B5BA906D70210E5044462BDC646BE95 Curve = -----BEGIN EC PARAMETERS-----MHMCAQEwGgYHKoZIzj0BAQIPANt8Kr9i415mgHa+rSCLMCAEDmEnwkwF84oKqvZcDvAsBA5R3vGBXbXtdPzDTIXXCQQdBEujCrXokrThZJ3QkoZDrc1G9YguN0fe826VbpcCDjbfCq/YuNdZfKEFINBLAgEE-----END EC PARAMETERS----- PrivateKey = 656008468895526658474428975817604 OtherPrivateKey = 563449446384594847151017584539074 Kdf = KDF1-18033(SHA-512) Dem = AES-256/CBC DemKeyLen = 32 Iv = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Mac = HMAC(SHA-512) MacKeyLen = 16 Format = uncompressed CofactorMode = 1 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 1 Label = Test Plaintext = 000102030405060708090A0B0C0D0E0F Ciphertext = 048C40BDA0986DADEB651178B4A8E64B7735FB02F43E621151849EA76132283FD2CF897E305A0517EECD84B2D9022E5C5EB8E3BA9489F090070530B3CE946017112D1754A4AE14D981EEB2B4A4A0216D8DEAB1ED4330B49535A132DB0E9D5BD4B9FA1EB042A323A3C262B95980CFFCF77B23B9D17EA2377D2AD1811CE4 ######################## bouncycastle does not support aead ciphers with IESEngine -> the following ciphertext has been created with botan (asserts deterministic ciphertext) Curve = brainpool512r1 PrivateKey = 7978796978847894400103470063598909318992754342406974939475470191530421638356103244921001321651015274653183103561457607601257178840534133802655904526250737 OtherPrivateKey = 2308129338363763325603164530220543667351108423592731601992535938718831256964324847657313285466745344259451280420400800014583532495130674675477133156417282 Kdf = KDF2(SHA-1) Dem = Twofish/GCM DemKeyLen = 32 Iv = 00000000000000000000000000000000 Mac = HMAC(SHA-512) MacKeyLen = 64 Format = compressed CofactorMode = 0 OldCofactorMode = 0 CheckMode = 0 SingleHashMode = 0 Label = Test Plaintext = 00 Ciphertext = 02407515774fad019b762e2ba4c04fa6ff35ba7acc356a167cdf83747e5438b5494a6727366f4d031f2c676eed78a99bf74da9e4edd808fc2360927d52213997d35cd8371d89195b5294da4f99ab1126c703093361c9f6067314b39b70762b13fff1d0fb5ad043a67074ad89176af7ea7d562a0f8c5b9f721192c5c5d338ceea8d59c492aebc3de551dd9ed6fc346c02c586 botan-2.4.0/src/tests/data/pubkey/eckcdsa.vec000066400000000000000000000025331322470703100210570ustar00rootroot00000000000000 # Taken from Korean TTA Standard TTAK.KO-12.0015/R2 # "Digital Signature Mechanism with Appendix - Part 3: Korean Certificate-based Digitial Signature Algorithm using Elliptic Curves (EC-KCDSA)" # http://www.tta.or.kr/include/Download.jsp?filename=stnfile/TTAK.KO-12.0015_R2.pdf Group = secp224r1 X = 0x562A6F64E162FFCB51CD4707774AE36681B6CEF205FE5D43912956A2 Msg = 5468697320697320612073616D706C65206D65737361676520666F722045432D4B4344534120696D706C656D656E746174696F6E2076616C69646174696F6E2E Hash = SHA-224 Nonce = 76A0AFC18646D1B620A079FB223865A7BCB447F3C03A35D878EA4CDA Signature = EEA58C91E0CDCEB5799B00D2412D928FDD23122A1C2BDF43C2F8DAFAAEBAB53C7A44A8B22F35FDB9DE265F23B89F65A69A8B7BD4061911A6 Group = secp256r1 X = 0x9051A275AA4D98439EDDED13FA1C6CBBCCE775D8CC9433DEE69C59848B3594DF Hash = SHA-256 Nonce = 71B88F398916DA9C90F555F1B5732B7DC636B49C638150BAC11BF05CFE16596A Signature = 0EDDF680601266EE1DA83E55A6D9445FC781DAEB14C765E7E5D0CDBAF1F14A689B333457661C7CF741BDDBC0835553DFBB37EE74F53DB699E0A17780C7B6F1D0 # Taken from ISO/IEC 14888-3:2006, with corrections from ISO/IEC 14888-3:2006/Cor.2:2009 Group = secp192r1 X = 0x444811A323E03C28A34CD859EE2FF1A34D1AAF3CB0B5603B Msg = 616263 Hash = SHA-1 Nonce = 4B19A0725424CD3310B02D8C8416C98D64C618BFE935597D Signature = 3CA29800D425FCAA51CCB209B4ED5D6C352108223143B2EA5A0E8644CE8F768A6FA4D193C726AD08019788E5botan-2.4.0/src/tests/data/pubkey/ed25519.vec000066400000000000000000023175011322470703100204660ustar00rootroot00000000000000[Pure] # From http://ed25519.cr.yp.to/python/sign.input Privkey = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 Pubkey = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a Msg = Signature = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b Privkey = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb Pubkey = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c Msg = 72 Signature = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00 Privkey = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 Pubkey = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 Msg = af82 Signature = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a Privkey = 0d4a05b07352a5436e180356da0ae6efa0345ff7fb1572575772e8005ed978e9 Pubkey = e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057 Msg = cbc77b Signature = d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c Privkey = 6df9340c138cc188b5fe4464ebaa3f7fc206a2d55c3434707e74c9fc04e20ebb Pubkey = c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7 Msg = 5f4c8989 Signature = 124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07 Privkey = b780381a65edf8b78f6945e8dbec7941ac049fd4c61040cf0c324357975a293c Pubkey = e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01 Msg = 18b6bec097 Signature = b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09 Privkey = 78ae9effe6f245e924a7be63041146ebc670dbd3060cba67fbc6216febc44546 Pubkey = fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d Msg = 89010d855972 Signature = 6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300 Privkey = 691865bfc82a1e4b574eecde4c7519093faf0cf867380234e3664645c61c5f79 Pubkey = 98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63 Msg = b4a8f381e70e7a Signature = 6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107 Privkey = 3b26516fb3dc88eb181b9ed73f0bcd52bcd6b4c788e4bcaf46057fd078bee073 Pubkey = f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863 Msg = 4284abc51bb67235 Signature = d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08 Privkey = edc6f5fbdd1cee4d101c063530a30490b221be68c036f5b07d0f953b745df192 Pubkey = c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd Msg = 672bf8965d04bc5146 Signature = 2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901 Privkey = 4e7d21fb3b1897571a445833be0f9fd41cd62be3aa04040f8934e1fcbdcacd45 Pubkey = 31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff Msg = 33d7a786aded8c1bf691 Signature = 28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08 Privkey = a980f892db13c99a3e8971e965b2ff3d41eafd54093bc9f34d1fd22d84115bb6 Pubkey = 44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f Msg = 3486f68848a65a0eb5507d Signature = 77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100 Privkey = 5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef9 Pubkey = 6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257 Msg = 5a8d9d0a22357e6655f9c785 Signature = 0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e Privkey = 940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800 Pubkey = a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd Msg = b87d3813e03f58cf19fd0b6395 Signature = d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c Privkey = 9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738 Pubkey = cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291 Msg = 55c7fa434f5ed8cdec2b7aeac173 Signature = 6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06 Privkey = d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300 Pubkey = fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5 Msg = 0a688e79be24f866286d4646b5d81c Signature = f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00 Privkey = 0a47d10452ae2febec518a1c7c362890c3fc1a49d34b03b6467d35c904a8362d Pubkey = 34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b Msg = c942fa7ac6b23ab7ff612fdc8e68ef39 Signature = 2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c Privkey = f8148f7506b775ef46fdc8e8c756516812d47d6cfbfa318c27c9a22641e56f17 Pubkey = 0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372 Msg = 7368724a5b0efb57d28d97622dbde725af Signature = 3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b Privkey = 77f88691c4eff23ebb7364947092951a5ff3f10785b417e918823a552dab7c75 Pubkey = 74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b Msg = bd8e05033f3a8bcdcbf4beceb70901c82e31 Signature = fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a Privkey = ab6f7aee6a0837b334ba5eb1b2ad7fcecfab7e323cab187fe2e0a95d80eff132 Pubkey = 5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c Msg = 8171456f8b907189b1d779e26bc5afbb08c67a Signature = 73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09 Privkey = 8d135de7c8411bbdbd1b31e5dc678f2ac7109e792b60f38cd24936e8a898c32d Pubkey = 1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f Msg = 8ba6a4c9a15a244a9c26bb2a59b1026f21348b49 Signature = a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f105 Privkey = 0e765d720e705f9366c1ab8c3fa84c9a44370c06969f803296884b2846a652a4 Pubkey = 7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8 Msg = 1d566a6232bbaab3e6d8804bb518a498ed0f904986 Signature = bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f Privkey = db36e326d676c2d19cc8fe0c14b709202ecfc761d27089eb6ea4b1bb021ecfa7 Pubkey = 48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85 Msg = 1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4 Signature = b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300 Privkey = c89955e0f7741d905df0730b3dc2b0ce1a13134e44fef3d40d60c020ef19df77 Pubkey = fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c Msg = 507c94c8820d2a5793cbf3442b3d71936f35fe3afef316 Signature = 7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c Privkey = 4e62627fc221142478aee7f00781f817f662e3b75db29bb14ab47cf8e84104d6 Pubkey = b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107 Msg = d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5 Signature = 836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a Privkey = 6b83d7da8908c3e7205b39864b56e5f3e17196a3fc9c2f5805aad0f5554c142d Pubkey = d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6 Msg = 6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c Signature = 16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08 Privkey = 19a91fe23a4e9e33ecc474878f57c64cf154b394203487a7035e1ad9cd697b0d Pubkey = 2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23 Msg = 82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c Signature = 881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f Privkey = 1d5b8cb6215c18141666baeefcf5d69dad5bea9a3493dddaa357a4397a13d4de Pubkey = 94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835 Msg = a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0 Signature = 3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c Privkey = 6a91b3227c472299089bdce9356e726a40efd840f11002708b7ee55b64105ac2 Pubkey = 9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e Msg = 5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc Signature = f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101 Privkey = 93eaa854d791f05372ce72b94fc6503b2ff8ae6819e6a21afe825e27ada9e4fb Pubkey = 16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5 Msg = 32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5 Signature = d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07 Privkey = 941cac69fb7b1815c57bb987c4d6c2ad2c35d5f9a3182a79d4ba13eab253a8ad Pubkey = 23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b Msg = bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa Signature = 0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02 Privkey = 1acdbb793b0384934627470d795c3d1dd4d79cea59ef983f295b9b59179cbb28 Pubkey = 3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a Msg = 7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56 Signature = be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507 Privkey = 8ed7a797b9cea8a8370d419136bcdf683b759d2e3c6947f17e13e2485aa9d420 Pubkey = b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9 Msg = a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3 Signature = 04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b Privkey = f2ab396fe8906e3e5633e99cabcd5b09df0859b516230b1e0450b580b65f616c Pubkey = 8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b Msg = 5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187 Signature = a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c Privkey = 550a41c013f79bab8f06e43ad1836d51312736a9713806fafe6645219eaa1f9d Pubkey = af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0 Msg = 8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27 Signature = 16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04 Privkey = 19ac3e272438c72ddf7b881964867cb3b31ff4c793bb7ea154613c1db068cb7e Pubkey = f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f Msg = 95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645 Signature = ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701 Privkey = ca267de96c93c238fafb1279812059ab93ac03059657fd994f8fa5a09239c821 Pubkey = 017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26 Msg = e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531 Signature = ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c Privkey = 3dff5e899475e7e91dd261322fab09980c52970de1da6e2e201660cc4fce7032 Pubkey = f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b Msg = 938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382 Signature = 5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805 Privkey = 9a6b847864e70cfe8ba6ab22fa0ca308c0cc8bec7141fbcaa3b81f5d1e1cfcfc Pubkey = 34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930 Msg = 838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da Signature = 2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905 Privkey = 575be07afca5d063c238cd9b8028772cc49cda34471432a2e166e096e2219efc Pubkey = 94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0 Msg = 33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e Signature = 58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506 Privkey = 15ffb45514d43444d61fcb105e30e135fd268523dda20b82758b179423110441 Pubkey = 1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8 Msg = da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e Signature = 6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08 Privkey = fe0568642943b2e1afbfd1f10fe8df87a4236bea40dce742072cb21886eec1fa Pubkey = 299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61 Msg = c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d Signature = d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404 Privkey = 5ecb16c2df27c8cf58e436a9d3affbd58e9538a92659a0f97c4c4f994635a8ca Pubkey = da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d Msg = 56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9 Signature = 1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a Privkey = d599d637b3c30a82a9984e2f758497d144de6f06b9fba04dd40fd949039d7c84 Pubkey = 6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f Msg = a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e Signature = ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205 Privkey = 30ab8232fa7018f0ce6c39bd8f782fe2e159758bb0f2f4386c7f28cfd2c85898 Pubkey = ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37 Msg = 63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc Signature = 9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c Privkey = 0ddcdc872c7b748d40efe96c2881ae189d87f56148ed8af3ebbbc80324e38bdd Pubkey = 588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85 Msg = 65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12 Signature = c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403 Privkey = 89f0d68299ba0a5a83f248ae0c169f8e3849a9b47bd4549884305c9912b46603 Pubkey = aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832 Msg = 4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05 Signature = 2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b Privkey = 0a3c1844e2db070fb24e3c95cb1cc6714ef84e2ccd2b9dd2f1460ebf7ecf13b1 Pubkey = 72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01 Msg = 4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957 Signature = 87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05 Privkey = c8d7a8818b98dfdb20839c871cb5c48e9e9470ca3ad35ba2613a5d3199c8ab23 Pubkey = 90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f Msg = 783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff Signature = fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b Privkey = b482703612d0c586f76cfcb21cfd2103c957251504a8c0ac4c86c9c6f3e429ff Pubkey = fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad Msg = 29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b Signature = 58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607 Privkey = 84e50dd9a0f197e3893c38dbd91fafc344c1776d3a400e2f0f0ee7aa829eb8a2 Pubkey = 2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea Msg = f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123 Signature = 69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500 Privkey = b322d46577a2a991a4d1698287832a39c487ef776b4bff037a05c7f1812bdeec Pubkey = eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f Msg = 19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5 Signature = c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802 Privkey = 960cab5034b9838d098d2dcbf4364bec16d388f6376d73a6273b70f82bbc98c0 Pubkey = 5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a Msg = f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308 Signature = 27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01 Privkey = eb77b2638f23eebc82efe45ee9e5a0326637401e663ed029699b21e6443fb48e Pubkey = 9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc Msg = 99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab Signature = 18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06 Privkey = b625aa89d3f7308715427b6c39bbac58effd3a0fb7316f7a22b99ee5922f2dc9 Pubkey = 65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e Msg = e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a Signature = 01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d Privkey = b1c9f8bd03fe82e78f5c0fb06450f27dacdf716434db268275df3e1dc177af42 Pubkey = 7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf Msg = 331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2 Signature = 4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701 Privkey = 6d8cdb2e075f3a2f86137214cb236ceb89a6728bb4a200806bf3557fb78fac69 Pubkey = 57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda Msg = 7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf Signature = a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b Privkey = 47adc6d6bf571ee9570ca0f75b604ac43e303e4ab339ca9b53cacc5be45b2ccb Pubkey = a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be Msg = ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739 Signature = 4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b Privkey = 3c19b50b0fe47961719c381d0d8da9b9869d312f13e3298b97fb22f0af29cbbe Pubkey = 0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612 Msg = 8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f Signature = efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704 Privkey = 34e1e9d539107eb86b393a5ccea1496d35bc7d5e9a8c5159d957e4e5852b3eb0 Pubkey = 0ecb2601d5f7047428e9f909883a12420085f04ee2a88b6d95d3d7f2c932bd76 Msg = a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0 Signature = 32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09 Privkey = 49dd473ede6aa3c866824a40ada4996c239a20d84c9365e4f0a4554f8031b9cf Pubkey = 788de540544d3feb0c919240b390729be487e94b64ad973eb65b4669ecf23501 Msg = 3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c Signature = d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f Privkey = 331c64da482b6b551373c36481a02d8136ecadbb01ab114b4470bf41607ac571 Pubkey = 52a00d96a3148b4726692d9eff89160ea9f99a5cc4389f361fed0bb16a42d521 Msg = 20e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3 Signature = 22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a9600 Privkey = 5c0b96f2af8712122cf743c8f8dc77b6cd5570a7de13297bb3dde1886213cce2 Pubkey = 0510eaf57d7301b0e1d527039bf4c6e292300a3a61b4765434f3203c100351b1 Msg = 54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575 Signature = 06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b Privkey = de84f2435f78dedb87da18194ff6a336f08111150def901c1ac418146eb7b54a Pubkey = d3a92bbaa4d63af79c2226a7236e6427428df8b362427f873023b22d2f5e03f2 Msg = 205135ec7f417c858072d5233fb36482d4906abd60a74a498c347ff248dfa2722ca74e879de33169fadc7cd44d6c94a17d16e1e630824ba3e0df22ed68eaab Signature = 471ebc973cfdaceec07279307368b73be35bc6f8d8312b70150567369096706dc471126c3576f9f0eb550df5ac6a525181110029dd1fc11174d1aaced48d630f Privkey = ba4d6e67b2ce67a1e44326494044f37a442f3b81725bc1f9341462718b55ee20 Pubkey = f73fa076f84b6db675a5fda5ad67e351a41e8e7f29add16809ca010387e9c6cc Msg = 4bafdac9099d4057ed6dd08bcaee8756e9a40f2cb9598020eb95019528409bbea38b384a59f119f57297bfb2fa142fc7bb1d90dbddde772bcde48c5670d5fa13 Signature = 57b9d2a711207f837421bae7dd48eaa18eab1a9a70a0f1305806fee17b458f3a0964b302d1834d3e0ac9e8496f000b77f0083b41f8a957e632fbc7840eee6a06 Privkey = 0d131c45aea6f3a4e1b9a2cf60c55104587efaa846b222bf0a7b74ce7a3f63b6 Pubkey = 3c6729dbe93b499c4e614a2f21beb729438d498e1ac8d14cbad9717a5dbd97cd Msg = b4291d08b88fb2f7b8f99d0dce40079fcbab718bbd8f4e8eabc3c1428b6a071fb2a3c8eba1cacccfa871b365c708bef2685bc13e6b80bc14a5f249170ffc56d014 Signature = a9c5ee86fb06d9e46b379c32dda7c92c9c13db274dc24116fbdd878696045488cc75a52fff67d1a5113d06e333ac67ff664b3f2a405fa1d14dd5bbb97409b606 Privkey = a75e3b6b4170e444781be4eeac3e0fdaa4b4356f705486bcb071a325ae071fba Pubkey = 993d38a7d72f0aee15ff6f4fdc37ca7724fd1373a3766b275dbc77e647980e0a Msg = 4037866f6548b01cc6bcf3a940e3945aa2d188b4b7f182aa77ec4d6b0428ab5b84d85df192a5a38ada089d76fa26bf67736a7041a5eb8f0c5719eb396693c45160f8 Signature = a5db4d3d3329abe3697959e6b5947ea8601b03ef8e1d6fe202144931272ca0a09b5eb0f390572ea7ef03c6131e9de5f16bf0b034244f7e104ff5311bbf663a0d Privkey = bcbcf561ecc05a41c7d7e55e696d32ce39b4d03c1f5f3f3a8927fe5e62e844b2 Pubkey = 4ddf53fad6a7a9ed30f3afecca136fd7843b72c243090891ae4021a32cadff1a Msg = 6f6716b6784740980aebc3248807e31c1286ac7b681c00b66c88ff7a336d441fa5c3eb256d20cf6d1ac92ccfe4be6dcc41b1aff846d360c243001cabdfbf1a9b240455 Signature = 9ff15115f6661f3211d7a40764967629ba6a5263951bdc3c6a4c90d070f7be00024b80d83b6bc27587fcff5f5ccc0eb3cde1497cf56895147a063f61f08adf0b Privkey = 210532805fa9cc9be916d213cac374e3cd6fc2602a544d0c1ce29d30105d69ab Pubkey = 10699e499be99e2b11b98f6f86b67cdc4ccf69f3c53ce094875647d2d0d0ecc5 Msg = 9fc4d28cfd25e6c0c5e724e19ca39d71e53bf4aa2796c54c3351f108fc70f2611a62e0ab90af6ade5216788e9eb2a873059b1e79d7d59debd68f2d4d80ffe31bf74b928c Signature = 4c2d31d5bbc42e026dc1e079ecc4dd072c5d2cce65e3db8d8a1dd9057faa0371727f727231a0f060fa27097533b6db3b8f6252f2793d75662caadf5f0fcc710e Privkey = 185d64b69479e0ba0a5844a10ad84125ba11c4b40d63eda2c57afc7e019c8e0c Pubkey = a5764f6398a5ae2266a38f9714533c4bbd8d07826f63e204cbac374b0acef1bd Msg = 4a0824fe70d4315413d0a0cafbf4f5fe117d5e07e1c3a4effb9d0ae91490234878ccf6792a91f68c6a520de16071f08abe35dc5ea428f1957b663371ce24c609dd55b8f493 Signature = 43e0387da5ba09a190f6e7b2680578d889769bcc445e5ef571b492871c155c5b9f620bfacfbf2df1fd87444604b71b2e237baaa7ee2093ede4a601edf883e307 Privkey = cfa9d9164b3c4f6f722635d2066cd7ea5e5533d2c74f8add669c371faa476426 Pubkey = 41169a66f9a63f285782a6c2db81cc3f70b3ada21a68c84745c88a74c3b0a2de Msg = 757621b1675db7cacef7f2782587ff3af51a3ef2f4bcf9279c4ce94002e1f00424bf0eb621982cc85cb4d171e564a0c2f6e3567a1aae2cddb7e9b25f47dc20a51050542969ca Signature = 01d7c9b5701af71e2f4877ffc9b7b5305f52816d4458e37e41c7719fac1d76a01fff3f50fe1a5875ccc3fb70001c947a33fc8b207de13572ccdb8ba98933ab01 Privkey = 1acb4a256c2f8993ca24de1e0014606d668b5e756032d269f1d24d351c8eea4a Pubkey = cbbdcd8cbc885ab43a057e5f9579f1161954159e7b562ea26cd9a43c88d3f96d Msg = c46a6d61aa0aed1c1d8547a70b89b7196475d5a4870881b1ecd0f0cb9c745f8a2adc8024e2dc55b53aa5d383a81aabc1a47e8d07d00b7f0b56ceddbfb1f424bb5c02184678a666 Signature = 05aa76f7fe51892303d78914715995e7d768ff7714ce270f175e56af17ae018d3fa939f5f620de82bcd1549687b205c7871203e624238c4e309fab7f92fbaa05 Privkey = ace3c46424823622979fc3a84a7da69c1d527d8312e8fb018375bd3a96c29c18 Pubkey = 937cf34136d9e1cce0de11b12c70cbfb7455448421e92c82e7c40934bff8c676 Msg = a9f137bc9021bf105aee25be21cd9ee5b3547cf10cc5f98476fb588bd70e2d6d6b0834e842e4ee94303cf96b09c1715381b36e14a491b80f895ea421b8ec2b1d3c187e02935c5526 Signature = feb8896dd3fe6001ffea171b37b788a69f7f850193a63406f56376dd263d099aef80ece67e2c43f40eca462c6b71e79406b18db74ae5d49844e3b132bc2a1307 Privkey = 88f681934e33c35c07dc6e5a832942ae3d59903ccde2f76ccb7587cea7ec41b6 Pubkey = 6a4e8aa5adb63d22fd7b14a26fdb03b7c8aa6ccd5a196f2c54b0465adb5092e1 Msg = 6e8bac1f853b81fef94707e18cc61c6f0a9cbc2a41d078dcc83fc0229c7f8dbe6dbdd90854b1f1ae2b9f2b120b86a8786b4e78ce23ab86baaf88754af0f3d88881dae0bc5261bfd038 Signature = 45b27bf1b9eac06b62b686f6d546563b2dfe5b175dbef32bf78c35a16c958a9d4f26d291de9bb2066c0a286113cc09172d40a36d4cbd951708860226eb30cd05 Privkey = 48050a6e0158f6ad253412e4497cff62d5ee555edffe59e4dc401522813295ce Pubkey = 975e010abb9a3e56659137b0506057f283982f886ca172c7bc2c500ed9bd26c1 Msg = ed6eec29fb7049dff707f0a4426ebc8f5b350e95870b9d6198c8139e9c3e1e409937d1a858a0dea482a5cb1a854ed3b5a9397acb63bff6b64039ef2eb1159e99858310bbbd86125c3e0e Signature = 7216ab60c35168187d0fce4753c86e80058d540b76bf95843a5898841060a99a44de6f439625a3f6365f59c377bf45909bbfef5c50b25f3194e5fbd34ea5e706 Privkey = 18d13d0c00e8e3386a5cfb30a9e79fe88b1861ed2d1201eb170038e194770403 Pubkey = a4afc833401876090d9b880c41267d68cbbeeaa38afb20884e27328f3b7f535e Msg = 910f6c272dd97931ac47310d244cadb43251365e02ba9f6a5b3c3226be9d7d3a74a2ba4906e8e71a4bf3d3556ebdfc666cd6b12f20c4a00834b88fbb244575199286b0b9344cf334aff007 Signature = 033988154c5d79d2510be83e778015dfe2fb85b8111f7ec139918b5400e3d656ee80a9f5c9072b5b467a5cc5a57cc8ad1062b5bff10862d9d369dde2cc966701 Privkey = 4adc8c28646a93a817293a14d29b48e2c6d712a68993547a5c5e4d1452acbc3a Pubkey = 7f40473628f23fc0dff0021afd487740d4916a9122e6c97d36433e5ebf04f88c Msg = 09fb5501f1688f80a0ab9e22d778ae130acaf74d7f5185b4da198c6b9edac4302e2b753e578766e17d4056dc40d95cf4ca8bcc6565795e97d68bcda79fa77c493397716356164caab5d19cfd Signature = 6d3b4e90ec408311f9b15b9253d3d95c5d152620c260d56302555a8804a5104ba5e8d29ee108e764a64219297298ab7674bbca784dee28773b34e185a386c208 Privkey = f26e1c84697a4908151b447dcf6c7c7a38b04081db9e7c7738e6fec900bed0c1 Pubkey = a86e1422c1235ff8e1aa083470d5e42288cb007ab50e795dd0b4ff87394966c4 Msg = 54ed47606a1487c2f900cefb6e899dbaf6c31cc88ebe3558b83b93f6d422c31e888e48e520eeaedd7e554a9cd40c2c519d533b6144cee484c389e976b1e4022b50e7dbb87ead7e541a2004daf7 Signature = 44f3344b9566c9dfd22d6198e1cbf95d9e28f2982fc7f166ab25dda30c46f768c558e0394fb9ab3e1d4db4cf487c17641a13f3f48939e0c64827a75103c57406 Privkey = cc0c33f3a86f5a17d30c186ce0f3b740bafa5fe3c7090f143541e2b2c1e534bc Pubkey = 967a71c7cf9b82cc78cbe109104d8b438a8d1fd71d260d029046a9a4526866ff Msg = 1944e5e155d75e0d0be92e1be14cec370ad13791f2bfd40f271214e94fcf213c71bc20d7ce0c7584421ac4efc451883cc3f4956f21f73a4216720438bc38ff2cfdf3709905a50a9d94b1d9e7932b Signature = e277b3dd655c33ff75fa920af1fcc859401e6c7a6ef4c6bfbfac5069638f19ca115baf13c09c82af793facb6abd0cd58e8481b08c1b68ad7a2665c4a614a2806 Privkey = f0bc979375a7073068dba7f6c094db6598b4e45df7d549583c22fded8048fa2e Pubkey = b42b6c57a78f1d90090a7181ab2ae09f426cbc2be96eb2cf27abc70d7d32a4b3 Msg = 27ab3049b5c6351f6cfe38b13a059f5037257ee3d65d6079656856edc876ea081fd8a9480466f8839478088466f51ecbfaf2d65def25f0c4dd8d08588202812232f57945df8a6fa161ed8c0343b583 Signature = 19dbc3027f9fae707deb76f588f9fd07aa8eae29bd4e1d04c2c984388286b3b122248a6c03ed67eca35df4db3dc1e4237f267892518497d9552a21de19b5140f Privkey = 3022975f298c0ad5ddbe90954f20e63ae0c0d2704cf13c221f5b3720af4dba32 Pubkey = b845bce38e26ab027b8247463d437a71bbddca2a2381d81fad4c297df9140bd5 Msg = 9aa19a595d989378cdc06891887ef5f9c246e5f83c0b658710673e4e7db760c76354c4f5d1e90db04a23b4fb434c69384593d010e312b11d299c9f97482de887cecfe82ea723bca79a1bd64d03ef19ee Signature = ae14a860fad0051b3eb72b3721a82f7b9546b2867261e2b7b638979e2561bdeb89b600768f82450a66c8b0481283fa21cb6c53bde350effb68a7d1114bfdb203 Privkey = 0f710b6c481f71449589753312ef64932b4652ebe0e07597f7da1c4f3dcffb80 Pubkey = 6973ff2932ccddfc1d16c4c0da50c8b29fe6452d1ee84d52064ebf3d628d403e Msg = 85d85744ad55e9ef9a65ca91e85c8a4f80e4c58f8e4e9354e833986098b7d9fe9fdc0dedb0d75d2539fba00034fc0c2e84344d1edaa09d4f63d5546d67803dd6b54ddcc0b1d3f2582dd75289e31de42e69 Signature = 02a8d26aee11420fb4f09d1163e14b867df7c6f6c8f8dc7a78034659f0401cad0aa90397efdd0704b798db1936503026e2a1adc297e27974d4be312a3753f804 Privkey = 7a05f121f60112dd16fee8c91bc2a11479f4b67ee33456042c8de167fc588017 Pubkey = b3b05be989cea7197505d4b54335e5e1d77a4b52ba7282604bbc1cf6c4e87a6c Msg = d9c59e8cc4ede537be2122ab492a5b915a9b0a114b2ade356fc0457ef98722d5f567b86211e28369d14168ec4a3c804076e154adc70a668cf64a20d13cf190d115cd688d036e46938251df4964dc3517b10c Signature = d30ce8a322b450a2fb1afd329cec8559ccf112bd83965f9ec4736270a0914e061196bf5209778c9f8ccf39c4668bbf0e1363f81afe45dd74e80d5875ddbf6f01 Privkey = bf381f8dfb5d0c6d64e416ac23e0d0fcb86ebb899b1d146abd911b92a7808eb6 Pubkey = 863fad8d1f1bc630a15f6fe8ecefe6b4497b60b21ae8830da46742045fef156f Msg = 8654f2f5c6dcd2cfcbb6ed8d2bc5fb5fec53e3effb0de65aac507fa56c897732395aa09946d3b6586a92edd6dc99315e1ba74c6a0247c4ba7760b948eb3c0932d9fe1f0e9fea6eb61a548a9ab48ffdf1547329 Signature = 99b75378738fcac8067669e8509b5d2607e1ef76af9004e13fe5d3932df60b168216f58565340fa4d638055a89044ee7d45e2bd082a53382289a34700648980e Privkey = 36983241a0a8e60ce02a61b3fafab15a7313a5a270d015b9c9ec070dc42deeda Pubkey = 6647984d42b9a5b3b1afa3b7f8f49d4c2b05e38984e99cea8fd68235d2ae4627 Msg = cebb9e404451818253c0392a4554ee7323c5d5b8b226775700b806ed5b91337916ea7ecbc3d4103fc65e5372ae7e5f9ba2d8f5aee24ccf6e631ae20c4af9b5f728cdf89e8189def1a5b3d35347aa203525ea1d2e Signature = ee37df8af422f91f85dfe43efe79f62378068ccdbaf3916eecbc3adfed0508bdebaf5ce06b3bc279f78087f0db8db3c6823edfb32c12217830be723d8872b30c Privkey = d06899f93a408dacb41c969718346f1e289bb5ea65e283ff79c705a074517c35 Pubkey = 46bf2a08a076c47d7f11b733f8141c355363ed85d7def26ba6a0ce15ac5f2be8 Msg = 0864c39ac4fda8eb9048597bd40be0401021fd2dd3a3390a8facce984b260a13fa2c7cfc00d192fadf134a0ad5a181ee89eff0c795eaa0fbfe2f3b26115d07168db42ed21a51303b1958e4a42dc065b22ce48f17a6 Signature = 6f89de92a66bc5f4144339124950bdf588144cb372f6736245351c9476becc59a258f9a933ffff2bef4b46cd1057395225799fd09dede6823db0e325dbc8140d Privkey = eebca7966970ee9f2cc4d74c6f1d8e0ebff7c45aebad349fb9f86df628dfff0e Pubkey = 89101e0309f767e64ae9c98c4a5d8d2328fb3ef262d082f49b64ca209e1990f6 Msg = 0fac790adb9f59e5cb0ddcb2b667172f2a21034d93bcaddf188606fa9e776db33a8fcc6bd7f5567883fc0de351aa9afaa36d2075b1ba853bada849b8661d5c8154e7b0afea656dd15e01a9c5ba21589b02f8fc5481c2 Signature = 7d447ee5328c9fe7f11936cc42998754a56cd1d2a6951af4fee7c4a8eb319d4923707c793c55d79067f822d5b16bb5776e38dffabc67237a916a81a63339b003 Privkey = 3820b6b15939d0afe18c9cb3d9a2a08f167dd458eb6c7e3f1558b0c6db4c6890 Pubkey = 80b85c6559fea8b400e1999cc5bfed507ad7fc294cd9ba0ce2dd2584a91089b0 Msg = 3e5ad92d44b40e8614d8087c9c743de0c0861a07f1f5146d71cac2f3740024e841cc2d46027cf5d261d3ee7c1875b39551017b5fb1468114fc3e098a899cdbd558b39f098e156b6e9801ebcdd65fed56dbfcaf2c8c787b Signature = 823ee2c0c8d87faa0ec0141e9ce08b51e57c839792d1fbd97a967207fd415849ebfb5dadb5a1dc2c0a8b7fc63fc354857b8c90c44720e13f45cd01e7aa23140c Privkey = 0d20fa4a37ff30c4dcc3e44ea7ac501137e5807e9781330ac310982cc3d39dbd Pubkey = 67bb0a01bc8617b491eff1a326c1c70f7d0c5b95a5ad48241aedce1c6f0883cf Msg = 35e0f4b4a517f9c7aa4514f03e6d65f19b27c62cc069f6bf07dd6378bd6afe2b766560006cbd5730a00919ed11191fb0c8dac56e153fc1cea4bdce5046cccb717759a4083e1c16f740763264cc804de0d0e1a4b5a23067af Signature = deab12ed82ba94b469ca98b66fa20444b4b7881c4f0f853409c9a1504a5b2b6d7860f26ada6bf73459b9cdb573c8017121338efa60f4148086d7a3a8ed59bb07 Privkey = bee161881d819b370d240d509ba46b06fb828e20310d9f6b309780703e98927b Pubkey = 10854380de89162bfb9f7835a2716a3a6e0265671b250b389d01c3bcc03736b8 Msg = 5a6fe599b6b09b05c0ba6a622df3a92b3d376d24d04ea85ebe767bc2ec4d14e83e6937dc0b914b4809fdb607906841a6fd1dcdf61aaea8f9bb81b2ccaa32df412989ae53646680a71a211c8440eab0f1aec5e4fc00e6a2c96d Signature = b07d072eb3831fae8a06effa9201797496dce126b8e11fef2fa07f664dc5cf3d4bf9c38a8b3c09fb5f14fa2deb219e7d852fdd27c7ba32d309942f2746dfe404 Privkey = 70150e9516164a3d7b7e8b6f255b65cac9f07459b32d11bb94b3d277208abc99 Pubkey = 2328bec8e40351047882e8b43bc1ab085386fa47987e46ea87608814c5da713c Msg = 77be8eceaab431a13c2a28d0d1556489d8c392fd7ae41157f7caf082cb54e45f08626be0076be844d38fde901a5eab0e8832d69dac22fb8507fb8ec4faf7c88fd26da308461afe385987972b5e760a34a5e18b9a82b4aaa529b7 Signature = eda3f5033ea7953a0d583c6457522e84ad78445304d48e577d4d69e8641febe15248d8d90ce0944a8f801d39099bc77494bac4ce2a20b38369c6adfb71e03d0f Privkey = 3f87fcfdb421422a9c5fb98268313c15128c78844ef9eb3b3713fa77b6718903 Pubkey = 533ec59228374bd03a4699e3a8896b86182fcf8fc3085fdb8f5c4671524d6fe0 Msg = c00fed2d689468bcbacccd446e8d8f299e2a86925e62e59709afaf4857469ff1e006d00fa3e18a3615f8f06b6ebdff785dde58851d2c239038a0c344dce985bd1fc8deb4779ae5f8932e2f9ed5990b6472dbe4e6fef6917657e0b5 Signature = f6519d7edb6134111974033f03b8d89e9c76caec8965a8e17cd45fff19de2615d73eccdb4a6664a8f0e23adf98988e96251bf26eb7a4ccaac1079f0a772f9b05 Privkey = 44ceef044ff998d4abeaaf374eb41d086718b63097b1e35f89634c14897132ea Pubkey = e83c86677d03ed3a5e8c95f41f0b325ff4333702f2ff6936f57ff30aa31485c7 Msg = 8d3e2dec4644c7b51633b13e6375ca42ff9138465f43d7800c7313199f67c9cf1b520b1820bd630ecf1c992e2767b38eb5bbc441a4ab8d317db441db35a0fe3abe7a9e4541881c2d7b1a2612306959815d1da41267d9649dd4494ace Signature = 554552d6b790d421d06b0a67f8e002ad7a1ed01c06cf00cbeaec2a268bda29f1183f0ceafc625fa5fdb847dc86fae1a20406e459d4a0177cb515220a568e0800 Privkey = 98ef2a44d4c8476dff05aa78dcf9c6dc086cb2f622a06745d60cbf223faaba66 Pubkey = 42fdb1daa39f0159119beec1bedf6f0394b26a2a29bd1fde081eccdadecc226a Msg = c8b5fcfc3c18c7d95957b668e91c731d50c7fcea4f9575bbf784625870e238df546e2cb1a19d2808dd5b230d3871fdec16100ee1fbf9b722fa3744a750a3b396b05f9c21b8c0f61ead57a78c5ecf72b579cfe88a3f404c8acf524f9ab9 Signature = ab5e8724a3e6ff76058cfb214d574e04d05574ecdd4ffe8c07c7af396e882687c5d79ef1e62fbb4c5f1bd06b9bd897826edde0d111d918e8ef961ff2a00d7700 Privkey = 93a8c792a239c931917c114824a0174f8bc4ebbf98af8c7e321e0f5bea4015ec Pubkey = 9b2eaa8a9c2c25ff4f6e13bb12bae5d06fda0eb1105fafae5880ff168740bb74 Msg = 901bf4e041caf16e04f2ffde8d6fe97e93d0900f6bc0fc09a9a0179d137b4b7788e57eb92766a9c634f35adb5c2988af1e86208f461998f59cfec99204b484fbcad3951e7ee4405523705d9739b44307db03f713fda78db421ef3121b3ba Signature = cfe32c4435d911d772dc0727e78d689d0164c5069597cb441b22c1d26236479f1afd7089121b9ab4f61bbb1fae1ab42f7635a92a53784d7170916b703aa5cc09 Privkey = 7001fa0c4404c28aa5b5fcff30a961f21a22f5b85a9e382e07aea8a8924d0ec1 Pubkey = daebb63c4d8f40ceba8ec35e3dd946a6b75bc74fcb29ade7b55eee3cc3aea5ca Msg = 44f48cfb02f08777a57873855f96be4c0291323f2739b275d90757a15472e5750436e0107408fe3026c00625689983f990eba9becbfce403ccd56356ad2741fd21445dfb23d76112e578b3395cf9d960955f1da8f399ca286f21390e25a59a Signature = 64eac9ce87460618636b41fd2decc1673bfc48c5f479dfacb51e86686407374b1d10bf65d6d7474214d7770c9e5c7f806c80d53d48b720870e5e78f32e3a7e05 Privkey = 3adce3a3d3fbc977dd4b300a74749f13a3b04a5d73a2cd75a994e3195efebdac Pubkey = 6ff19b1f18d64851d5c74845c6407f0bf596a52e385e020127e83e54cff5ac19 Msg = fe6c1a31068e332d12aab37d99406568deaa36bdb277cee55304633bd0a267a850e203bb3fabe5110bcc1ca4316698ab1cf00f0b0f1d97ef2180887f0ec0991e8c1111f0c0e1d2b712433ad2b3071bd66e1d81f7fa47bb4bb31ac0f059bb3cb8 Signature = 7dda89f85b40539f5ad8c6de4953f7094a715b63dda30ec7cf65a785ceae5fc688707ee00be682cecbe7ee37d8fc39ee6d83c64409681708a0898a183b288a06 Privkey = 14803c1f23a47fcdd35e5d146e20ca630cd712c047d5330b652e31857acbc9e8 Pubkey = 36f2d5bd6d8324fa6e9db7f7d854ebe48c0e6299998122e9d44b8adbef54f093 Msg = 555983679d026e5354b4cc055ae1bc14653c7281ec722372f3feb778e841da821b3d0b8ee7a9a9129ea06824be8379fbbdcb0748f423721ccb172a1bafa1d5ae9fc1c51e93d41dd551c3086079b620286c1c40c1223bbcbb76722e92ca21d8410a Signature = 07a7de6ce97664b3ea0928e1385c3309be08a47cbf4daa9186a1b948c86fbba39c4efcfcb7a0a3866bc94c6788ffe6be0d4972e56d0c3292d1cc6e25447b9904 Privkey = 1a61154d3472cd96b328ee674beb4fc86763a969fb410494e0678414e31a46a6 Pubkey = 7576d93ac85d0fc61f258c55cf90bd87a635099c0e810ed0b937258d13b42559 Msg = 64c565efbcb8b9528ed47253f3c6a4035db781d6f0976b5e5ba8447d4ed54b04105293ef4c000d8b2e1b5b75e727e5d2a077743b50d183b491764801a2504d16ee6d7d8ac4fe40e6bfc2a8129c7285a5ac691c35e642ed162cf7fbc64516733a23b3 Signature = ada1666c9c3b8284b8a21c4f2618ef0808a646f3f10941e470f738e1785e2de9fdd9c8cb526f945c7a8c6994f151b7d066581b1d755307947c62befc8ab7070f Privkey = f215d34fe2d757cff9cf5c05430994de587987ce45cb0459f61ec6c825c62259 Pubkey = 1ed506485b09a6450be7c9337d9fe87ef99c96f8bd11cd631ca160d0fd73067e Msg = fbed2a7df418ec0e8036312ec239fcee6ef97dc8c2df1f2e14adee287808b788a6072143b851d975c8e8a0299df846b19113e38cee83da71ea8e9bd6f57bdcd3557523f4feb616caa595aea01eb0b3d490b99b525ea4fbb9258bc7fbb0deea8f568cb2 Signature = cbef65b6f3fd580969fc3340cfae4f7c99df1340cce54626183144ef468871634b0a5c0033534108e1c67c0dc99d3014f01084e98c95e1014b309b1dbb2e6704 Privkey = 8c9f95083075a43fe426d19f1e87719b40043de88eb0ee971f70e10c7694ce4e Pubkey = e91d167aa3ebc23e70aab45dabe905e416262f910e2a955dd8619efc74c24e85 Msg = b69d70e860f55c427ef2a71df36e05bbc43bb2e06463aa5de34419c6a614eea6695335a87526c1226488d842891d0574df343c9c1e17aed6958ecee87474221eb77a599ecb059344c0d052c0002a66e5a6013185af69a01ba5dbc660d36cae235f67fe0e Signature = cac555222dafec76a0b47b9d2c586b3b3b9b3b9c8364beb3cae1e8dd7f1ae9dd74f22b8dd4ad2b290f81351a415a99f030f10778be4cda85d1d353331e70f109 Privkey = d7eb1fba424feed100777eedb4874bf20810ad686b67e31d27ecf610609a33f5 Pubkey = a25acb11a6c825713a085fa754692886a87d07fb9be1a53eb961728bb66c9060 Msg = a1d0f81e3d59089cc2b19e07d2fce43db4cf171faa642f3b0bbde77ae3d53af5c02bf8fc12ffb4e57f7c8a015d6c2d178944fae9f7c8fc969d4b77bea51876ae99d59e94ad2456e0ed72c52cf4e5340da17c44dbff86457a519b6fffe269066290d629fe69 Signature = 2bf719682b07cc5ecc0480f37e9d123ff6f44c26e6958e59f080466f9cd373a16500daf123dc3f1334774bfc9fa84503b16dbf21a815c1ada6ebef4920461702 Privkey = 4f6aeb35fce14fbcbb9aa8a4f6451bf95b98df047fa8c43f1ead3b404d3f928f Pubkey = bf66a9edd09481db8444a176c8ce0578d2934f0cdc9734e86fcaac05bf3330f1 Msg = 2dfbb3f59e19ea17d44a5bde4ad227a1a351dda17af840ee0a75da21a5cca89b6d1c567c333e9cc910e2157e05e86ad5d931145064594c47baeea8663a34649c43e90eb95ca10f7d51597b378a722f1f704adf9f22e9f885b89d1f938006a2efcdb42aaff5e3 Signature = 6adb07e364f2a455cb05867abc511acd9d658977f0cacafc92828e7b724f6bbf98bf0bfb29f4e5e6c74738d4fdd816d9252407ae4f3afc574c4f00614824e203 Privkey = ef4a6762b400975204ccc13abb47344015454906850ff14940cbb83aa22414ae Pubkey = eaca450996f50cfaf2bd7f9d7fa7087f09ad49664206a80bc2e5bbbb85bb668e Msg = a4b63eaed5a64a94f2cad212ce2ae71092fd3ea744f5bd89562b2fc2a6c9e4d7aa27add56264a5a55016610be6c19ff7d4989e9504740853012715a79ece9e12c301b3317c7d9b6730db862a4a1d28058e0f8b5ddd9738c7c62ea572cfe59eae08e2b8b6593b58 Signature = 02697d44cad862f1daf5708205f450d408525b10c01ffd06cfee80374f3db16fa9a49c19a9844b345f2f9559ea74aab173baa078c54370a5166700c6dafb780a Privkey = 55017e5f61f0c5bafbcde6f849f42a31e5e7a878c1d3f9126fc569fd417ea9f2 Pubkey = 66914f74ed932fc881ff0166683f675a7c28a926fddd6469cdb3f28e6dec42cc Msg = 2fc84a0998fa6e168a866410bb68105df249a28cfc76604be94fd7dffff2fc1dedd220199465575e8df860190f16aca4084169be16c6ba32eb67042ffd4f230316a26b2624a42f8f90ad57f6916486fa91fd94ed68aded4e632430ef719446979bfaf345409c387f Signature = b1a5e7c49b8fc6b4331e0416ce7e4ed59edd56300b802e0d72abca4a6fcb876c03bf331579124ae0d3fe43f7898bc87e93fc2da3970fc8638957d18c6613c808 Privkey = 0553fba866942341217cf278ac57cb21acd09d9916cc6af0ac46941ea139d545 Pubkey = 840c66e57c2d4f52a4a2796d2a53c5709b96a628c2e063fe6efd47f283ef5e82 Msg = c1fae6262a0e98a6b1235fcb62283b7f0a097f9d002416d318fefc60c5a1584f900ad0ab26ccfae0d6d84aa9aa2df16d4c117ea2724676cb866d4870a872fc829a7c2a5d21ba83340adb339a34c5184c7f5ead0f077289b33677ed6a1ba34be1994e25763bd1d9faec Signature = bc3364c152ee5c808ac340f49ea2cc404e93517121220cce6f7c30a22500e41bcdb6e820480f8fccdd22ff9ad96da532802f431e94240fb83d4bceaa09b92b0d Privkey = 7a5ac602de19f3c21040bcddbff42f6aee6f95c1b093868f48e50482dbf4f9c7 Pubkey = fbb6c7531cda21e7d17ea903c4d14be6c68b4ca803a16bd87120f5aaf7dce1d4 Msg = bd1685419279eb81e4cf3c909031f0f09c5ffae7e2ce6ba9d96c2bce87b8ba0dd763231001e532c7ddd62103abf701288e19dd8f5302e8f5d31b64cc339bd8b7a95550c8a116fd486948772bd5af8dfd46001c59767b0d6bdce383a7078992d1022fbcaf90710687b9aa Signature = 84101dd4b5e8ca3ed98c1e8a06e11d7e424b0d12ca714ee7374b64c29d51a2021cc77ac75389d9b0a646a447623d7d04d1241866b0ca6edd1b7ac015666b700d Privkey = 50414cf549bcc55b5b6b75ea3782b2ea7c087b6a0106175e469ca2cc764aeb01 Pubkey = d0f30c12e997f96e7aeecd1bff6a012ec388ebf8f3f4af664804d1638e4c346a Msg = 75ad77e8c54b0b05fb2d162e7cadb8a7528081b863f76a441b374469413e5714edf54f800496af0157c17e425583414d4361f2134171c0b87c22ce6820a4850ab49d99a9badce9e36110e7f3060118b3590f82b43771e9fbb081afe62227e024d98de6cdec028d7c49490d Signature = b309800160de43a63a89a0acb8a6050059589b3eaecac20b256fece438042f69415d8a56883ee3836d3134a7fc1de64fa8c8cecc3ce27589f606058820857a0c Privkey = 93cb00d8fe9c9777a683631f39ba0f48761482cf1c366bd863cf715101532555 Pubkey = 87e94a1ea5258d61180cb828590ff1418a87d01e702686ba8abc2692c8dc3c91 Msg = 88d8538d31867813d88fef7228d49a7e950d738396f116dda1025f7913547c5d1dc5677a6de4b4a5880507b361780b61b43f7795263db22ff341645f2f5914fd6088c2811211ed4756ac019a6035d66e3170c1d82bfaa30596b396b3260cc1d10d413dd47ebe6daa0c30dc42 Signature = 09824fa2dfbc4d6ef76a9e4145961116769130553b3edffa50d04f39b8b79facbd237acf71354a53a6e5fee754e823b0b290f9619320a13d561269a221639f03 Privkey = 2b4cae380e95ce694c26ac7957447347f98e31b4bf02d744e131529071e2301d Pubkey = e6fc705a79c98e115b4e28d3aa1506b74ee74276c5fc1109a7f4d89c6fafb889 Msg = e0b8250e27b7c0291dbc47a6da6f1268987afdf0a1e90be69bcbc4370865217830d5208693be7b7045099a22ea27f952eb3f79a9a0f1b5a87b19367790788d34c219c2e2a6b834020fb4fd149dc56b544fddbb42071a162fc7cb33c146cac05a31b183e9daadc616f3af449b17 Signature = 555e45656ba9cfbf5155d0e52576e5197abbbc9dd233993eec2a1ee7f6a86409c0b71b0a661978ff5e0acdc9463dc449906f474f8e79bb86168bf70741e34b02 Privkey = b56491e54999bb5a1715ebfa2feb14a545a3a43c2fdfd4be0c95fc11819ad695 Pubkey = cd42bf414f9bfc72ec069882a800557cdf31bc3464fb102c310e6dbd3ae20863 Msg = eb4418ba30683ec7959bdb1ec7b263f83e81f054ddcdbe0a6738ca7763e246935bac419026c22bfbdd1236336cc16107c53513e3ddf34e120846962c3bdd54f5ad5749597208f15a8bb56667baa895f08340db89b85c435e770931928d8abc99262f839aedd9be2aa138c9259adf Signature = e3be3e71a89852df3cffd72d68207869dd3eceb49b1f029493eccbb932444ebe8c8c6db5f0a5a67e2194408df9841913a5ac1a606896419a668f4f47c56c2b08 Privkey = 6579c247dd2cd02ba2f7d7a950a330752681e92c0dc62984bbea279ea521c381 Pubkey = 0b087bea1a1b3d15805cb604f4bb8d68edde274faf521fe6df50c55f8ad4a70d Msg = df7c552ffc89374b9571a6024a8d0471d7eb6be8dfca6f4166b581b65479015a0568129074cc04d6342c758ca18f7987dec536b7033d5f9681504340e20986f027b8cf1f263be76db3525d173422950ea8dceddc585640918aa9d25ca89cba701c2020153873f46108c772cb388d55 Signature = eccaf801ae0a912e21c6b83a5f0e4e88d4b2713459ff93449fc0b21a9f416050113cbae4e814d20c0a798f76d2f9d326ed83959ea02abdc1ab350a467123f709 Privkey = 18fba60c5026f3c9dd7aedc04209d5260361de400e190aeb60169e05a3367c9f Pubkey = dfff347f3dd255530bf7fb34d02ba486d112bb46e950e2ef80e517014cc95734 Msg = 34f08a804d7829cc3914f000ce1a3288acce2149c8a02086b9f67afccd83a178b0bcfd4970c056997da7dc3d47562f16663cedc52f82d710850cf4050379efdac23bee17c330a383ad137f788473b2b0723603b6deb1fdbf6c523fc948a0ccc4ff100fb946d874c1f990436ae8c4f3b2 Signature = 4bc011e40f0f59c618f6bbe230b6f7bc2f50e3617c7faab7f4c21cb84f77eba994cb7c2a1bf10b01bb20084497fdf0a6ab5d9bcd22c4a2c5a78f79926825940f Privkey = 073cc15b0536285933b2be39253cf4fd696b81610f5dd3adac2e9cbf338ef2f6 Pubkey = 00b551d371544375dac5c4e96cd1f0215207e8e166a1fe49d5b0a51ac18443ec Msg = c285362bc8ef628f7aedf654231ee51acdf2cf69a886b942bb9bfed8155105d9209ded2af24f169ad5fcd451370f5827a85111c7a52e032c5038617c0c0170e2a6c231dc401d12062edb186036114e38793b79089077581b9783f40007103ef17472491c00e7138aecc5084d3c85010470 Signature = 3aa52a83062a8f28a5d6b7607f484b66cc374896b766123126333c579581316c742806f627b5bc55cad705cc1d4782b044080c8ac840f38c0c50d35e345c7803 Privkey = fd894a1e8232203b289505d5c68c68791ffc0e54f2a87530fbba5b3a3f2caf00 Pubkey = e95ab565945c7ae5d533df5d0cccc7e9abbc838e20a0b61c930f5d41d81a6fe7 Msg = 2669624a94f2c44a05b7dc3ebf93e58a4bf3a01c273657e7e7878976f6b6ea737fa3f22cc8365b8b220c007d5b642726a408fe2fab69ebb3bd072b349f4dc3377ee7cc752934254215d23989bd3cd02ce999adec9784993f4c19940815f39c9e229247f5205c36cba44e714266369289b4a7 Signature = f51102219e8804be713e556df4e4afa2f8866fe86541a1c2a0934d24c3c9beb280a70dd8d527fe8b7e0b948214d5f2f9638619914b72d55dc198b0229a848708 Privkey = 18ef464e28f87ffcfa4d3a9c09a22910951b8c719fdacdb56de62c4b406df00c Pubkey = c5064c9d43ee2da75b06bb09c77267dbd0d39128f1cdc6bfa451a03e93af4a70 Msg = 9c825707d9358365ab9d38f7e728d628aa722a4f1a20a38e47c999fff8fc32417fbe072f96eb6a0e11e4da9b6de9615445280e93c77a3634d3d2c6879856c248f9800f60a0d38dc1cea8b7f31f286cb0374827b4c6ba144a6694f2b908ead68d18340124cb59cf1701863bd4f3efc709f3627a Signature = d1e7f16e8e597d428adea65591d551b54b667aff2020c464f7f4e53c4773f70433249a3c71b4d11c89c3faa892809227b9f29ef4f7f5d020d4674d4021359405 Privkey = c911bdf2f9e7cc5fff35c96e15cc12eafd05ab0db31f649f7408acd0cada76e0 Pubkey = de44696cd6bd2cbe9b11a0ef18b88164801a969d5e06ed453eb4008cce9a5725 Msg = 76c471241d17192984b00362696e4d9d4d2b7f839c2064117e50a1598f3a1172b16c55e5396866084752024f3a7eb68bb3ffdb80979a0af6d0f6af26b6f0bc0c0384433bcfd44c75eb654a8a8225cb9c4a7fb3c824c3af6125fd46db287e70492d154632cb8f62432659d958d6281d04a54f5f5f Signature = d584b5da371ae4f5c9859b25f70dc56c1b7b4e02d1ae6636283b1b7b11217afdcdf65d1b49ca2c8ef17966e9bc65f10c310b77bb5df7aff5ec1b379a2ce55d0d Privkey = d3703299c41db36d77dd3a49541f3fb21d0b2bad1f6e074affd96f1c40d0f927 Pubkey = 862c5ef616a5f066fd87758a56ab45056fea4bd33f008be24f7b540e095e148e Msg = ac92edbe22257bb06d94aa950e62d18ca2ac0a8fc106000d2231f8a13b8d7a209ccd8cc49a6cd68a7f36c02fb8f728d15595167f0ba8cfe95c8a1e435f327513014ac428b75d4f72e7c834dd70e1a448f1847d3498475f74e3d9334dc7dcc4fed72bf6c7fe3b1d4f53d429616f1df44f19733158b6 Signature = df28277121eac44630084cce75917ae9f6bec65af5572dc30719bde661cf696b85b8672dd4983cab30bd05cc3a119d7db9babd522d7b3a6bcf3886ecd25e080f Privkey = d411cd33576d0efe9ec413ccdaabd4fcbafec01a3af4b3cbe34f8b05ef8b59ba Pubkey = e870344df98dd3a8702c4519bf9e8b35a9d189e746f7203dbbf9bbfab22d6f63 Msg = 11d2c2a7f0190988126696431b4bbcd90ab7b56a32da6404ae446aa762a4ddc66094971538eeb85bde0470a510be0d6d85780ee730a9854138728ae6816162268da852858eaed4ec74c7ac62e6e7096dc002df0bdf5fa40da565b41d181a3f0ad0c5e0b976743e315d9db8ed4160abe69c13a2b3f09a Signature = 83460d15461d6717710bafd6a47a1eaa900a80f2bf8b8aae2468773614ee84bd628c9717476368ef3640cf760acac83ad60232a76963b7d52588b11dc004d70d Privkey = e10a2f1380c3e4720e8a8707a9bcb25a0f58270d7059cd7626c7153447edfb87 Pubkey = a3c717acab366a40b51187bbf35b2d15e97cfeacd7349c06ef1c91ac93e90656 Msg = 135212a9cf00d0a05220be7323bfa4a5ba7fc5465514007702121a9c92e46bd473062f00841af83cb7bc4b2cd58dc4d5b151244cc8293e795796835ed36822c6e09893ec991b38ada4b21a06e691afa887db4e9d7b1d2afc65ba8d2f5e6926ff53d2d44d55fa095f3fad62545c714f0f3f59e4bfe91af8 Signature = 094bf6f953ca0eb77df45129b7bf10d192cf6ddeae94ad6202b8eacfbec119e5291578fe64a084ae600fe07efdb8a782610dbdb0b49eb5f2a46c432355552f01 Privkey = b2e697b3d3efec976ef3369530c792717bdbb428d9ed0c11ec0ea9b2e5f39f82 Pubkey = c4d2e4b3c236d6c9b8c74fa384612c4710d83aa16ad7ef01fbb7421d4fb3f0f6 Msg = 7b436232ac2111a84059510c48362588fcb7383426be5e6f62f372e4f7cca83c81c2357f9b54f4a15291065b6d41aad1ea93cffa776b9acaa58afe2b51644b97af9a3e53f84e40aa6d86051e6914cd039d4170a9a526dd69955ff507c33f74e2176591fb0b3cd7f00ee418f2c258a9981cccee72f01c8430 Signature = 5047fa38197b8328e78dd8a10e966afb7bd3d43608280f1c257d25ca43bc1c06e94a5747ab6215ece54cdeff8c56567d70d2f91f9ec8c260aa1080a6ab5a7a02 Privkey = 19a679a7a905a1e2b3038e6e418b3da97c3089c7cd351ea07bc8d1af64eacc46 Pubkey = 19f08361f469b4ae1e0ceb94f47a7de7317410a92dd013b16ae0d0532fa4b3ef Msg = 980c7b4d2939061ac7b9ba441117a19485661781a4083067c55acf93026c082a93cc124f095e1b4f2c3f6c135412a5096228e8a071e8b4b668ba9d9644ea9f4dabfc54a9856c3e965e6363395ab709037dda229baf927cd01f9af5e039afc42f3cec634f5d832d2ab7c7cad3ad7b8cf27ebdac698431ad8236 Signature = 4347b7b4f7c3c4dd315b8384a0b0caeed84bdabe24b2915f12512dfd04770fc996a1bfb729afef9edd611447081a5330617eaea1c1dab1bf13cea8997204910c Privkey = f03b8363ee5b0eef7018a49bc02adf731da54ee50a7f03b88a29a2082b189c43 Pubkey = 31287ef5a2e64104ab7790b312f35c7ad4af6beb0d7ceb8a58f36a54ce272c3e Msg = 24191b5464b35ac7bcf4a375f033efba8943b09b9ff0fc403ca7aae702a3cbf396c5131bc008132cf5f12910d586dc1db9c084574a96babee95642f922371c0382ec0402a26feb142e4146bbd3360c2b36834fe45af5e2868d4d56fdd504cebf0c2d7f5791b4429417c8b65a98e0b15c466c137f410524fce737 Signature = e8fa967e6afadf6a877d87e5f5c52bb634b75a7804199a2bc9d027b63a35654d9ddd06830455641dbfb49edce42e20e7d4104a071c2cbbec23018c297ced9908 Privkey = 11086b0d11e415ab1ce02aaf8f0621b54430f6fb135c74f40d38e8c64737064b Pubkey = 7166dfbc691eb8c201114ba0d1a2c7b87f7a1fd8d0b36058b0d7dcabe1ae30da Msg = 4b5b2936c5e360a38455503721078f8adb404a7ee7ecc14801dc87a67a152b769569fbeac0afa25a2070a1686b900ac1633d499808cdb2e81ce3916d5a3c04d19c5bb2699a662b8aba4af94d390bac7ccc8ec910ed2acdf86ebb71adb601877885eef3c91662fc30738e352cc74353ccf8d8edeefacc042c10a0e5 Signature = e907459d5adcd0d0c36418581f19d0eebda7138ebd9faa0b262201f458c856310bb77f4c7de922495dcfe8b248eda2ad0df6a73f47bbfb894baa7d8869875802 Privkey = efce7667a8ef91228caed14eb477a345e5e8239234080848760ed0970713fa86 Pubkey = 9193055a84df1eacca28ce2a08c2a07a50f04c024ecf1fe4a47d2efbaf63ed58 Msg = aa1bc80d7bcc1d94a23a57cedf5027482477dc46b86890bc0e5ac29ae6c91bbc43130348797305f75543580a8a069b348a7bd8fc3e015230b7c1940c7f80a82b12900910dbcf0630da03f081d44c7f955d4a1172f56ecc7c5ac646696bffdf4eb6d88bdd9cc3843528b72583abb3bad02e56ef7646eed5139551cdeb Signature = e5a63124db1696b64140b6e9612fa9587b3eef710109398d44ba0ca63c0ebad06f0a6c8994ea34b3a2af91a89bf41ae614d7727d716fd42f8b92e1ac64fdbf03 Privkey = 88fccaa96ad884d1165be71dd0c4f5f8f4421c60fbfa498bfee9b967462443bd Pubkey = c75cb0e0237b45b8656eea9f3d1a9d4acd01a103aa269bb24fd54122fd81f2ac Msg = 9d0eac98556bfa8672c35705d1d61ac4d0fca19dc0d993015877857d27fd80f74acace666c563485d81e53603a6aef40875fa551cc105f2cc10b39694679cdf4a6b073bc88645fc51a36da179d3d1e3c7722454c5e73577c61aa7d148c4ba50ea46c56a1c3b3b3c470f93100494e08bc5514ac763a85483c42c7cdc27c Signature = 27d3a197cc9994212063bce8d799e77b6853b7355ebe369bcf1889a418a82caa3a7987a663f621defe86b3ac4ad44faeed16c9116ace28fccf915557fa779903 Privkey = 670b30626fe367d8b45f43733d6f25b37eccbcb551963f0ac8b666b48041c72d Pubkey = 65aa4c6d4ba0ab34bc75b39f09527ca6f2425f52415cdffdf2dff273f8ea612c Msg = d00bcca7e184d10e1f1fe420b50639e1d5deba52a751236e68c59bb4bff9802f5fc165ed42fd6d534670a7c6fb60e4307d947915a248bf2f93465c2cb44d8f453d2c015afbc8ed58818ea51726a25177930e9ea192ef4514f4bb0eb4e0f5d4ae3c46e357c81187f7ed174733fff959c3f9fae6486cfa1356a95699211de5 Signature = 1b6b4377d2b98e0f9d24ae8dfe30e2396e2004380d3431488e5843cf8d2d7a0070ab21f8a3b51ce84d2f4ba209f739f922bebf798096693f5622873d79ae6f04 Privkey = 813c4daed67a190d68bb635d73af6da74f32fdf7c48cca6e59262946b8e8c71f Pubkey = a2095457d7697020e2b884d95a96578c2a900a7666ac0dc7bd38f1931d7945d8 Msg = ce54cb0450e689a0dbef785308b3177472fcd6d38203e58a0590b31fa253f9ea590be5368a922de88b63450102684443fb8189e601282003323b89c81e92eaef2b5ddc4a55c53fa3cfad4160248b3c286ff80d31d161b7b8dee713552b56f1507fb72eadfa89054e9d1600ac874c4b0a961004eb6d0d4bfd2ecb9c734f00ba Signature = b446574ff6a4bd2b572e487c4ab443ca641075168aa4e1092f71f30bdb068ce46a395efee1ee660b9fac26d54109722c15cdb791bfb87fff63c6596ad4f2270c Privkey = 8400962bb769f63868cae5a3fec8db6a9c8d3f1c846c8dceeb642b6946efa8e3 Pubkey = 98be21001993a7eb1a1277ff74c15504183d25fdfcc05f0d4dea892f6e301890 Msg = f7e67d982a2ff93ecda4087152b4864c943b1ba7021f5407043ccb4253d348c27b9283acb26c194fd1cbb79e6afc32ff686b55b0b3617218dcf39316b4b66b3c8c0d67267a86db8adf3750801bcf9327d4c25441b96197832b4cde0eac3ff22892a2f0bc17c2c213c02377a333e308ed271658049383b7e2e57b6b8b125512e0 Signature = 0ad71b0025f3d9a50db338414d6d670e7799b7270a8444f6ae7f12ae7eb71bd03ffd3c4f36631f69fdcc4061468ff582ede495243ef1361a3b3295fa813ba205 Privkey = 6288722035d1ea699bc7cfdf18d89625423180b683fa74639f4f30f15359cc85 Pubkey = e17faa019572861a064e1bc571256dea1468f3a48590a89138aaa85925080cd7 Msg = 8b6caacac51d8949fb86acbcb1b99d859ff67c64147bc1216909dcab07ee6ef09f403863327394689dc34abc778fcb5c1f5091acf5a08f9d842211d1ae2eb40be9bb8d6679077471547a6c71ff77b519d4b7108e32bc46251c60dee8e332b6229316e6d57c22ab826ff1bc33f2b0213807c19280af110fd26ee27468201cff49cb Signature = 9dec92b6e89adbe8f4e1b5e93ac4fcf957de7d1970a226770ec4eda647c8e3b3dffb2731a39e16e4a0119d3662a937e560522491ec7a1696be04c076b12e3501 Privkey = 13038a3a65ef32759a9cd903acb554b252de00e7cdb77bbed1970b20680ee17b Pubkey = b6a308e67f9b46c66499456ab5cd135cb2fe84a32eb045358626604da4122c8f Msg = ddf00b4033a2a088022dabe93356432f50ddc6c6e1a659dc1a93124a4c2ffffd182765a2f56c43ea0bfd8de8015060889ae6941c3f3e255d4421a1c36201be846a2738a71f120cad598ca8527d70ff8d5a0993b55cb5153517110a41962daff42250158f2096d1ddaf7186e50298cbe51fcb429cbea411293f8a7bd9cf069fa237e4 Signature = 5261558ecc3c98ff36351f42f504cad4a32ffda5a744560960b4c106e4492f02e20478887afee4f770f05597a7e388caceae805ae351e0e45e8e578e6a6ff20c Privkey = b9de5b063d3ca3a773f114941b2e4227c07511c0f5c06017b9c8845018f23432 Pubkey = 5295243c8646e096674dda15979b322b9dd0faf27d024a0ed5771334e1179ed2 Msg = 9493cc23896b84096046ae1053afe39499e9424254b366fe143f4da321e2dc9e4784208e12a542d899828dde7eff625a7f12416990c2841ffb095bf94c0c610e5a663918b689031ccd6b519349d04de1c212ca2a9d7abf52e1b4fd467bb665b6919ef8f91617e205565bf56647e5f8d508ea200a84467f8fa122e74bc3b9979f1174e5 Signature = 92ba760d14d1415cfaf218ca847014088ae51ad821113a6f8630356f7ba85c005e2330f1066d0df464806052a4174610050462f3e013d702e7c77185a032580b Privkey = 8ff0297cc08842b5e67552ec2843e04353a34d74ef89b8565d97205b74ca133a Pubkey = 0f7ef98c5ba4af984dfb77bc4e537b2b39e6273bb3e7b95fe1b7e6781952bd4a Msg = 2bdc3a486c5e4ea62dcfec8a9d4fcf9ea9490dbcc715615d58490a72ce833fa22387ca50a0052508cf0aff1ca727f0fed46ffa7d3c8e23c5bb01d47e90ff06d3858a557d9926481579daf4384aea50e96ec615d2a3bf3c1122f1f24dd6ed98a5de421883589c213998ca5432373e68bbbe89428ca9885d0593d5e6215116b8266386452b Signature = 0783737f706e6ff36614f850074fca1f485f24fcde2a28af544f37abd69b7a581defd8c771b031e108d19d788c74c5f20bb3f1c21cd92be317bacd8f650b4905 Privkey = 050d553d282dca3269c83c181768ec067b81c9fe0c94f2a0ebbb0c942d0fcd7c Pubkey = 63e230b003c53a5672e832ff7f24430be223e497de840233f595a3e200c7127e Msg = 15e13b8c01004f6aa5b236dbb281677f746d81e548e0aa80f0e414521521d856cd694e7c9152bb5e43776b60f6b560ed1ad3e4b390dbf3e46ef9257443f39c149e0240a02d021e1e3d7d046b26fd004eee7ca16a8059e126c74cb3f2194db47bf60465ecef5c704d2e2c75e2e50060ea2a31cb72b7b3c6b1b5ec72ab38004085281a22fe86 Signature = 3f0e83765b31bbe8e1fb92e9678d6cde571a03ba7f1dcc1128461f708525457f4e0e2353aa2b598c063ff1bffdac916b5a2200655156904b0585577a1628560d Privkey = 69497cd7b4e868cfa0328d92bd6052d772b2767395c14595b279851a9cdd31aa Pubkey = 5d276d626e230d18e7bcd61141cb93c90ef0f79e01321212d838ec71457b1aac Msg = 53cd080a0c61f1a093d3b3a74571c296303f363b4107edbe880b7aa9dfe44ab5d5dc5f74be9c8d876f04d754653491ab51b135fc953f71287b62ff41b67c742bd3445671a9d4f2dc174ca1b0335f78627a0dd4b30650504178039e7393638510ffe84091b57298d3ac9001c367c1452fbcb33dc54a5dc316fb2a5270764a2ac820a0b63fbdc6 Signature = beafa58340960908e8d86e40329e3a4523fc7be770addb86e34c3772f84cd9fb338d1f3b65bfcdb09f35c6da36d1a3adf8f91f1ffd5782cc830206433a08410d Privkey = 2165a486b612bbff529cd00346964a3cb8cdcffa51dc3d524dd5adc5ac936d68 Pubkey = 7ebc839a465e14f5892476e4a13b3988f83b3cd27ef79e193f86fa16f34a1ce1 Msg = b728da7a36167c6085bd2d962cf63959facd95c9ad4542028afba90ec9c6c0760bdae935429c3feb3933e2f00042c672ad2cd7348d92bc33f81751e294ae9171b945b193144ef8acb9a1bd9abf0475ce0d0ac789b200c32e9c9a2736b168369ce5f97b1e8d2e7900e1a759178441f1fc430564ae129bae7857740511a668f32c0a3b077a9d8b19 Signature = 7ec6fba56ba52460a1b4f2738689c1883dda9aaffc8bde17cb6029bdce3a0ebe2fffda55939b70bbd07fdbf6fc5cda87fed8ba58575f894a366e45e5705eea09 Privkey = 1c64ad63dd147034598e128f7406ec0530746ea1c5b72ecf79e888065486fa1b Pubkey = baa6bcc1c3d8d3b11ffc1587adddc58bfd96c2b992b6c6f59fcc50ccbcdd0eb9 Msg = 9ebd8e337893bb053ef2b9e3269df54848494f03cd63576b33e64b1080be4be015264a403fb9602bbf90ca19b241a9b66863909b9008ce1b2ffcf236efa4c2668f0f47db9ff5fa157d9cb605412be7dd8b07ea878cccae6bf50f935b86d19e1b648b69e528553a56d8afb78221ad53307b7a4ec8d2fd4861b55dc5dae8e93ef387fbbe0b4ce7f788 Signature = 7477e54158f13b7128c0a110ca6b65f42514fb70cd5cf28a8b1cc6110ea06fcf94290da13f85a11c2351d3bbccbb4c64e0215d6d0f0099e7f27bc94e949b150b Privkey = 55abbc5dac4128134dc8c6018a213ed4b60fcc8e90cbd41db2d21eda5373e936 Pubkey = 251afaa2646926b2a371f2a09d5865b98c9a5eb6ca047cd0d8ee36e5e0416974 Msg = 47010e1398ad55fabe371dd8648f768d90df4b965a3b396100b303b40a17518bed6d86b09f734ab7c10b5f3a01b53deec5f8534b70c79f3f29b284fdec486f22f44c22ccd5c6463594415267baa611f70b1b316caa1b68b5e0e99b31c5bb0ce13679a23c31a63999698164cbf37d103ba92490188be59937f123043ec786efe3d411f9b0623a6ad972 Signature = f6a61c2e661a9eb7bde182e38ec99af985f61698a5d7fa430d16e3f1a93709b75522320de48afcc595ab209122ae0ce132cdf4b0391746e7ff341177570c8108 Privkey = f2dcf4a1a0d46ddb2d72f8fdd80bbec5b7dea5913da4966c2f4d12c261f0bf98 Pubkey = d39570a25ca59f2257f93f96600df4f63e684bf63ae8dffd914e4629c3d5095f Msg = 3b00e808fca4c11651d853d6b90f952ccf5647e102d4ee0ad7a5d181d5b4258c523cd39e3d9825298d84c8cba09f43dbba119988222c76059caf17b4bf9931c45e617448aeade151181497b24552367e52bc45ac79088806d3368207aafefd3057845dce819d5aaaa77b218e2aed3da76d40c1f07699f8172e4a5c803f7a2aceb9a47a8952e1b2f053f2 Signature = 42882a811dad2d851885e4cbe9044708d91a86f15dfa1d66c3eb304314531f3015208c711b9bdbc5fb233951e569b59d34e415eec4b37ffd374d412c9a360d0c Privkey = 2246bfb06155859e10a748ff8f5919ad5d1daab756f01057b790d07474775f4f Pubkey = fa6349b62dc8c6a2feeef6ffc33ae085c649795c1c9d9898e75c13ae1625db34 Msg = 63ee1c7bbb15cebe1c22532d481682754bdaf58b8bc997ae30a34c9d23c33f1690c346ab0a7365ff62457424b6105f8421eca0ce3c630acfeb9a1cc416390edf4920e22b2367e9fb5d2ab25bee56da03ea55e3f57882d48b89229314d734cb83c79f4e17ee64bae6f7addbe9b525fcd03a91409a2dde907751db8cc97e08d0ea89c4d18718d26d0b897b64 Signature = 2be4915a352f7785483046d8ae9625b8b63257af57c073691256ee076d6e1b972a101f551c705d3f96157c33b56ea049be4af4dc561cbe3c1ec5072d7f134e07 Privkey = c088a3dd2cb8bd5d684db8538dc22473b6f014f64fe86af168b4bb01b90a1dd0 Pubkey = aad615a9c28759f03d373abe666691dead8b84f9b8b50a67f8f0aa4a701580d1 Msg = 74906ae05a5af8e9968b6feb498569d6345a24f9711befb136e6c3b5ed49339e59a7938b4ba1a118f169b9ace0f7842a26a645f14c0ad22ebbcda93e67e4c348efc3d9ecbb1419e6262d0436a58ea82c2202389065ccf67c4f550e45b5f6a12a6c011b2e0a30101d5c62328bbf99c8c95563a6e33bdd9cce72b1f720139c2fd3e04913146ae5bac5288e0e3e Signature = 3bb459d1ac575a180c1728d8b8924970492a0c8d2a378c29d1d41785c8379a58e2ba3606785e1c5da29e5527552bc6dc89a2b69c27fe51ed253a9f3b565b2700 Privkey = 45667d1e7b5910979c4a328317968371c864d564a661c5cce557c9ecc61bab9e Pubkey = edcdf5e1a170e00c8c687e7e9c18f9893b5fe495cd2977ceb7f446c0149aa9d3 Msg = cd66cec476c87c8dbf47ec91dac48fb5b42db1282a573e0a5cf0b91768986608e1d7ebd05f5251bcf8b47a17093229acefbd44beb21c0c0c928dd3cd3f8966ecce6910331c508ea76baf904d8c21f6c17c2c58d00afd3259b8bf794c146b12b995cddd1c4289c5be3168ebd616b384c281ce1b38a10e1807808853c681a640a009b4d2acd7934f8c6d07578161 Signature = 6de668f1ca6f292814625289a0808020c87c89ac94f5b0508e557bdf8000a5ca808f021c9679b50ee2f320064c95a464a8439379828c3b76cfa766455e128c0b Privkey = 24897428ae6546d85b3190ebe3f1f7bf7c712528ac851a588b07d5c8f94eecd1 Pubkey = 5f348fe3ea5b2c023d0af7ede60e55f91aa55199699da15a11c3791d68d710bd Msg = 5201d9725f1dffa1863fa4d84c301861141acdfb64be1fbfdd5b9386db20ef394099eebcfdfecc62c6268607a84d55c55cd0efdc372ecf3067343e7b0731c2685461e24b953f99949e59ba3e67ed0f0848313793962a292c459814c5e28690ec1f45171f1abab86fdd14568b00caf48581115ee5ea83b000282fbbf0c0b2a1116039a35cfa3f201422207a3d4948 Signature = 1b5e75def49f51d6b2de008c71fc1a909bd42ca813298dce4eeef717815d7a6c078c2f3d9a3fce1ab5b3ad8ef8d45cdf2eb4901c32eea2d5e018dcf2833cad0c Privkey = 7b04aca7cf926216cb960a3890786339d0a615967680190123fda3b60c6aeb11 Pubkey = cdbc3e70e4e8fd13d0cce2852a3b9372c3a6160cd6deaba90f9b3022f70c91f9 Msg = 1cb09624b1f14a0260c7f56d8c60b5fe45837114232551ef5966386e0c2b441b75cfdb8df2185785d22cf526fa9df7fd45d9d83881b66c1feee0913e238121eedbb7ab504da0bee8998016684535031991f11bfcd9b95690aad2d19bd6a9de1844ed1362302df4217230b25c0552ce277534c650cae526577f25d8b1fe9f9febca2c814670d4805b21adef852daf94 Signature = 25d2d361751d52b4fe66ea18e4b9866bde3d121a7312fd9e28a1e295e087e3176c94c874a2e81600f24c4654f43d1b67d47b64822648590ce5ce44f3b5ddc502 Privkey = ea73bf64a1a97877c3c3e7ca4644b71aaa66314c8f1b66bafaebd5edfb888bcd Pubkey = caac93902e5764ade47294edd51faa14620940c668b5c1c392a6928325d4c3fd Msg = 362eec68b912852786bb4f9afff9ecf7cb28c9de6b18422a8ca940b0d7e6dcb83aa44be0afb5f1806d43f0e31d71f922f853615a26e287a27f08a04fbce3d45a0c6c311d4b7cb17e425bbeb0a6b410b5d6dbb7ac11df9850a131a691e3b60b0b214ebe044106e982433287595267b031b5d4a09262ded8934fdfdf964d868ef9a2c842f804eafddefcb71d9f16a59bf8 Signature = bd86cb9c70a055279a86a9e64870988b8a7345c3cd2948a0fabcfb38abce3c420b4d5521618e11d2de827d9de569f6bc3be66aad40636cdaa64760ded3b7c209 Privkey = b8123c116b33bad0dcbc2c4dc06a3d66850dab360cdb5a033c14895c4ee31bfb Pubkey = bdca151ba32c6bb31531b05fdf86c6d78c8cd1935611d5ff111a0f00635b1885 Msg = 7970f6666634548c848bb52338817b26a4d0ca68df3d28afff207c2d028067a18e4c9543025f5b0228aa691e5088513151a94494e15d1f54210328e0df159b352c30aaa7a844f18a9f4c395dcbb3fb9fcfbed1103e0706fbf9c35fe2666848fa35dc2cf5227ebee89e7d3bcfae2721b25fdec3d3174ea7ce267a55dd61d58201e96bda303cf418edf6e32fb92f5dc1a0b1 Signature = 9cf13eba3dcc37b8fc70ccb2327436b9f08855e726aa7ed82bd5cb7df45fdf9ec1f96afad193f47572d770444b65b74a37cc034fc514cb3f91b2d8ada5b02006 Privkey = b18e1d0045995ec3d010c387ccfeb984d783af8fbb0f40fa7db126d889f6dadd Pubkey = 77f48b59caeda77751ed138b0ec667ff50f8768c25d48309a8f386a2bad187fb Msg = 916c7d1d268fc0e77c1bef238432573c39be577bbea0998936add2b50a653171ce18a542b0b7f96c1691a3be6031522894a8634183eda38798a0c5d5d79fbd01dd04a8646d71873b77b221998a81922d8105f892316369d5224c9983372d2313c6b1f4556ea26ba49d46e8b561e0fc76633ac9766e68e21fba7edca93c4c7460376d7f3ac22ff372c18f613f2ae2e856af40 Signature = 6bd710a368c1249923fc7a1610747403040f0cc30815a00f9ff548a896bbda0b4eb2ca19ebcf917f0f34200a9edbad3901b64ab09cc5ef7b9bcc3c40c0ff7509 Privkey = 93649c63910b35718e48c590d261c48e4ef8336613f6aa077b462676b3ba8829 Pubkey = 06a685898b855212ebc289915d105a4320d620d85771b8c6b15bf10a1be6e9b8 Msg = 2cd1a951056c9ebae1399b6bd2d82c0ae277856290d06920ac56cac8fb42435101c72aa9c08dd2d12426325562c2f0a49cd821b11b939aafa593b4095c021bcb4827b107b9664d68282888bc4a44af3e3bdc861be6af309044c3daab57b77023dc902d47ebc326f9bdd02dbc02cd540ff81b2ddf7cf679a41193dfe5f8c8ca1aaefc41ef740280d9823e30a354717c8431f5d8 Signature = 6274f2d4f431d5affefa35e7cf584a599017193da99094ca908b75acb608d1bf981857be93a7dafb0fadb3ff0906f48a5ee950456f782c2d605b14095ba0ff0f Privkey = 1c15cbeb89362d69476a2aa4a5f3ef2089cf87286349e0dfe0e72d9e3e5a66c7 Pubkey = 13a882a1064182582c211847e19b4dac59722c9ffd34826d96f33113400fac7a Msg = 091c9b9b116ae83d23d01a6295211785d446b6228dd687ddf79bd0d5a4daa8c79d2cbfc37365f1f285e361738123e34e2bcbfc664ce1253a11d9e4a7982e58cf9468e1017ea14d2cc6d0865d40fde8cb560241e96ac1617c791f0ca7c6410cadf328611b18aef333d8350ac497f0a4ae2d03fdf0e23e426d34f4514780d1474e113583541f3c043672057172618cb2059eaaed56 Signature = 5998b2808adfdeeaebe2c3eac026d3f825f9c7f2af97ca324fbd57aac1bedff78a8ee621d037ee3ad2a712e9a009c58ea3e6f2a828f74b86da275a44a4b1e50b Privkey = 11241ffdf34ae8ab875475e94c6cc3291f0b8820dc85e20f32fc53b24ae68978 Pubkey = 09c045e4bd5137314c0ec1d031faf914910c45a4676f5a3cd8f581bcccb03c97 Msg = 3b89deccb7023e4b2b7aff2c3951870af413a9b04dd86ac78b7c8fd887492d8dde49d8fda149edd54781ae2b508030d14416a9a38bed2b9aebbbb20250b3c931acd4e32fbeeec5a26501beab7268d144fce8951a101c4b5178166fbb5927b1dfb1e1ce90d1d123068e3f472c888fdb01fdf70e7f8de9b0adb284b7119f55354316f84ed090030f9c2662061ca48447cc0aef964126 Signature = 72ce9f91be2e66cfc90f952595946ffc90bfce53087d49e5dd7c087f3faa8f18f2356de971e4429d985a99194b4f92ced3ef47cd7114379e0b3267a9f8b1e706 Privkey = 3bdb162465eaceff98d69c86f70039c517d168aefe6bb101b4f769a86b17c972 Pubkey = d76cb7be74328289fd1c64be747cca5bb30295dfaccd0f2e43f51703fd5d3683 Msg = fbf368feaeba87918b1b8c7b8a26832be6e7fc1cbdb8902519281a0654ec73de0bb07101a9d603f745d4ec2357aee9870cb19a56cb44fbd9c91fc34752612fbd83d6fc1a16bf8a85a215d0148e4af37d298467e5cc486b131352ce092182ce8284159a3812b30bacbff595863811bf9a30a9da494565c3ac1814430018ea0eeed39cdbca27f93140e46949db570bfa2ed4f4073f8833 Signature = 6f1362a402063791f950984f544928e616a4ef79bbeb6854e9615aab9cdbaec483fb9a04bf22de5d97a15bda2d390483c7f61dbee07bb5141fc173b1aa47650d Privkey = d5efe51d5cd8e108bd922fc0ea126190a94628ffa53c433a518022792ddc78ef Pubkey = 426b01cc61ff5e0e724da1d3b297f5325c18c62f64d5eb48d4a5216a8e9a4073 Msg = 9d17bcfe2dfc742f411cb53a94f359c001abf096c741f34af48679f281e7ce6bbd9e87709fc0728a563db2b9cf8ea4fbdcc344c1848e653ce970c6ce29de2ccd520300649adcddfc753971f846aac1ba42ae4528952d94980aa7c6cfa2142907647f894ae974a74d59035a73ef56a10b6612624809520190ace661c3a47095e0322efd781d50d1163598f2da32f31bc9c4f913d1b14861 Signature = 2306f58fcd4cff2222d81b05a475532b8b19dc67e6d78ddb4205a3b7621cc5aef0b393d5d24dd96c88ccbc53a3208da323be4587d5ec067c820f0723aa44e90e Privkey = 18af89025ebfa76bd557cfb2dff148245214641fd5bda159f73da04b08e87c88 Pubkey = 0c584459b9ebcccad587b272160bc60b27f4f772b4321de7723afef577edc7b4 Msg = e82f46652ab914af535d8fb720b557ac95018d9f2a3fcce85771bb40ab14cb9a986e096f3afe5bee829dfd8b97335c536ac971a21655af16a2f8fdba183a4e18564c21492956537a419abbbbb02a4bbdc01481f5c6e658ecf3c34f011ad846f5edcd4939195df85e41303fb9a88fdfbd704396f7559a327318b952b3e60ce8ddde56378579232faf950c78e7f0b17c3b8dece36b788a8473 Signature = 26bb0882297c2c08a752d3981145dcde55893a11df77f8aa4c19d0b9ed6e5220ed12e9fac3af13d0f0c71568f4a547d30114a6599a236806c4beee6765284408 Privkey = 0c93d99815fff8fe22b9e45aa02b3e6445ce1d6bf5a65dce3da107aa1055940e Pubkey = 4d27a47b0fc80800d84d244eebb1deb4436d97633a83e67125ad52ea01685057 Msg = 11e877de58c134eaf4c9f1b53c3dc451d3c055f16b09622725b279768512fe10a7adb0765b689ec21d5b6efaa19f1b9d36254df0a9367f441b26bdb90b28cbc403e5074082fa1fed58e140dac97aeaf483e2c13f3cc560abffaba05b763feedb51e60698151cf56efdf1d37d6ce0564486210f052e937f2ea26f63efa5d247ff188329bb1aa83ce3f4f35a3d7dec14599e5feb7b6d5fe4296a Signature = 7dc4467abcf6431adb7ccfe868eac8cd8a615a0ff65f6a9e338375b1aae3c49a126c9eba79426d1641c6b97c3e92c194e5ee4431efa2439fd450f2cd018c8700 Privkey = 989e99945635192c023cc5186fc25bbaef47240775d15a56195d88cd07c3748e Pubkey = ca0beafdf731d89301f7723c5bb7e5a1c3ff3eab27c97d711bcd76e42054bee4 Msg = c48414f5c757d03c523ef3f3b8510771b0ff3b4b97de279625d349ec185a29927a66b9593ba19338c2f5e4131f1ac07ea46d2c1b6e4ab5229280b2e2bb9d140d1ef7af7b1692bf2d097b80f811adcfa95d5cbf9eee92a1641c552b4be4a0d734f0afd470b9d7f4e45778951e21fc534f200a128b96adb8373f10cecec2dac2996a062fb3c294315965a9d5d7b077c4b013c64a38429769d23eab Signature = aef756bfb8a7266e17d15f3f11ee50ed25be420e95a0742271ebd12294e2cb96ead083b8ff0b829d2edeb14da86e402ef25e6d4a5a7958c184ed10c176cb570b Privkey = 6bdbbe06d9f4219eea6403a357b25e561992fae0f0f614561dd86d23de415a43 Pubkey = ed52dd1cce32d9b485e0940746421d36b9fde6cdf0211545b634044d4b3cb8f1 Msg = 582ada13d69293e49bbd461032dfea1ca2025b52e013a33a0387fcfc5f7c0b8ec955982607fc901e1b7f636a9d371e1f91fe476bdd44856e275d67efa14238164354c231124c84de8f5b89d5a58ea6744b4d3b3d7906905233cce694a64d696f5a7024fc9033b1ce390899a3b441a48e53c7c9b30ba12e7d61f35f15e658c7cc4407e2f689ea8a55d01bf5dbacb11954754f920f09dbd48409bbb5 Signature = 950206605b0f417c90843e2c8d8e66c828bb10b99b36eeeee8caf2e0e5484d93fe02bf533405f4bb74a50e5585fa0daef4821f0301d01b46321baa31e1f08d03 Privkey = d761c8c5a9601b9145b7d051249b004107e452e563100c6c788038c9ee8adad7 Pubkey = e6488775d6407efc7b2bca890a7fc62266fc54cdac893343b4f59a196d948898 Msg = 84ead5eabd2fd4b7c79a9a928ab8ee0a16a5fd667a057f8a254663d56daae156d1a49affb2996137b9d8b340e635732f9d2b4c60218442541e72d2b00e1ee7a73c3f67caa499fa9d070b57d076dcde96b0764723c3c659c7a00c1b78b15ccc2223890b51067fc81e23e9458ab0683ba626a53d0c3793a58a9857bb44b3bd85bb6ce53a85694e7f53cc1bd46d50eda37d81f5381b513d1f38339d291b Signature = 7ab78b64e6db359a2dc8302e1092ed66fa736b536253a1cd90fdb8c10efd78300225e191963599ba549cc859209df0ff61cd069b03d254e6e7d76c798440f907 Privkey = c5e0c7a7bb8b7ca07bf0a05ea67eff6deebfe3714ee3e1a227f4dc8e242a2fa0 Pubkey = 5135efcd9052bec57a4431caabe82680eec0a33afd59b30203b280ba12be485c Msg = 3770a6786652c4b78a043edce07f3e204d81997c42afc22331f75a5494a826d7cb69ab4314a473721058a1839981d5b7022d0cd8670377daf3320476d25b9f559561d66ee0a709fe17361e2a52898f5753c4fb43bd0c98b368f512adc09cd927c6622676926d8c2d91a14aca32f226f70036c1c858bcffc2b59f54c1c37bf81eb52ecb3f00da602c94361b52a5afddbfd7e05036e377503050333be512 Signature = 2e7fdeb3484d0a5e8dce94448979496b0642cabc3733a51f8c3c5c51c19ae319018da91091c2385f2f4e9a59edbca2abd0d085ee40d3f0d42061a5a9832a370c Privkey = 11bb4748d2547e6196be823c9be7aa18150c204b12ca8d73c1bd46b11a54b475 Pubkey = efeb42da28d764966403dd300d9f9451b258ab1c80df06fe5943153f5301cccb Msg = f4b765b258ba35b427525c7f10a46f0bccd357ec1ad52a5b139417a9d3894c512d89eb88e681b1f30aac4c115ccf36545e83f37834c82e8300cc1eb289af4375968c29c0ffefb40e156c20c0432669ac8dc0a83c13b1e855a84ad0133c40c82c87ee1e7dd4084d741c80de8a7a9f7759e843a562099c4d7df875352039ff4d3824651386c97759ff7dba52064e6d3112e080819aee8ce723a1a2aa464d8a Signature = 44c58da49d2365d27029d1eebb3bebf7c032d858aa07e0756b1c26a5412d22691176031341ad37d7bb7843289eb39db491584c1b2a1da2e4a2649c2293826606 Privkey = 7452a00156d794edebff4adb1f7a7eec26217fef67c3d268352b2b5460a7dc25 Pubkey = 5f4dc338cfbd384b5f1c14c226701446b52b1e3e2a3cba1a40ee2825080d1de6 Msg = 8c4ee2867656e33f5269414d77b42d8e4750dba93c418bacca10938cc3b570c6603d52c2344488607b2f934f6d269fcb2ad966219b1ab11472f42c672ce20592490ec5baf6a2d2fc8a3ee35374b1902fdefc7870b1b626fa46b12b6cee241f601a9b3fe4c50812e573e6752ce2c7644e3367a6a6b77758d8e4934b58af23abae8fecac25edd734030ee7cf39907e3eed8186a19a807103a9fc49d38f4c8460 Signature = a8f9fa24a3dea1022e73f0d88b1c37d06d0f0b20bbff0ecdb4a40c86d7e475617c03570a7419d74ba0f1327096bf19f0d0cf9f51d483112f26922378682f4807 Privkey = 880ef106733f04e76195eba280b3fadda0f25dcf96a6a99c8ccf842c68afdae5 Pubkey = 70cee33d41c728ce7b141931e6e8524567d7601eb79f67fdcd07b9d682c650f0 Msg = f4f38d077f2b03da821bd36fde673d666e52f4832e1c0dcfeef049328acb7bd71ad2bfc49c123516e196c470df0847b3848a45a2c69bea03e2afa7e58205b63b523814fc8e242f059c69ff7e40f97be8125b70a54fdaf35aeafac79114a7b419e6bb9e70bf07adb559819600dc25e51b4b700d27ca5472a0e7cbbfd14e099faa3a72002da538cbe45d621ef0d5252ba29d83f8b3ec8389c9ceb6c6b2e8d8a20f Signature = ff6caedd8a468aa07d4c6e7131bbda76182ba958649376e711f44c7bbacba6077bea878ba5949cdeeef05cfd4983b0057d275ea3e18c32659468c30c47ac8f0b Privkey = a2d88f37ecc2b2c05dd6cb3159962c5f646a9815b2fb37791fc7b606e2913ed5 Pubkey = 58dd67d7a15d4ca0341a4c869566cad8c4ee16e583a10b4824173b08290d92d1 Msg = d1b87e9e886dfbbdc8ca8ab9010ecf9bbaf23f72ab3cbe769db1d43c2a474a81651c464e9fb92734634641c9485a0239b3110771e7f75e05252e4d8f4c0aa1ba08626d7e96317c20acde2ad99b23bdadfd6f17468eb402ec5eefa57b47caf972b3dd21d89f0e2989ff87d51ed2e2d639c1644e698cbe0221b8e179f3cfb04a20cb2470216a6882fb4ff799e11536cf64219f0c075176bc7cf0f6c5b7925fcd6155 Signature = ccf2400cd673e1effd20161d7b68a5fb87c1e99d3635d78c2da1b509fac33346c069163a6c46c7826a48bbbd03b05e6e2351fa62bf89bf7ccf9a9024bd157d07 Privkey = 42aafd0ae26df1e7aa0276860d752783af97280439bb23eae46e3f84caac78de Pubkey = daa2350adb55dba9df7d7af5101998fe515d311c3cba3eeab9138233190c3b4e Msg = 72131b80ad599b6f5ff698547d16e7499d71275e4e9b30526a5aac0b0c8b14fa4a540cfb1145fc004418bcd318c1a70e6269a3fb69baed86f363f5b8f97f569c20d4f4990e7bb4d0c39921268d636ed0554bd62acfcacd3b8e030217aafac3044c037e0f94da18c6b9a0932c3c5875d3a93fbdadcf67964eec9ec2be69b48f020f6c9874de5f8a5167b5ee024a2c2efd0cdcd2acd8c1f787814141e30b38b163175b Signature = 116143650b6c133d617859db2429c2913579790b2197d7b7b1b4962b328721032ceeca58b2d56439e233bb84dc525e284ff8df2bde1db4986fafd21b3d7d6a0a Privkey = b69c33b11ba67841c3d4e6f9234e35370a28b47662ac560b27c078b66ab1b021 Pubkey = 9df68e9acf67379261744db5d1e377892f2b692ed5a38b37073c04de5d226737 Msg = f9ea126d3ab21961aa2433900a3982b83e0ef86d52d13440afa4817f9b822fb582cc3932bf450d4677c9188181fe7526ad6fe5abc61d0ae759f215013c0b2b41064cb6278ba7e39e2f4c10d6cc9605b3869e169d7da42e88eb857870fe6118bb02bc08c8055f0c189b62f79fb146b4c543aa30cc0cd57f037e9ef7a63711f66e6f2878931702202702614277d513f0850b758549336b30cf40ab8bd460e60e12deed04 Signature = 24368fee5bd848b4c661a3be4f310cfc436e79ec4a78501b81095fe51614231b6ca1ab1269996ad2e98e299781af8e29804b24fe5679ca3ba650c5c4cc58ce01 Privkey = 7b63613f6dae01cdcd5e6b37686971cd8d8a99542f6329a12854a9d8ff8105ac Pubkey = 72ec43faf34d8730177d1f0743c74c20bf72c2394b8a7d471ffe2a04ab00811c Msg = 1816488f1fc83e1ed5911637dd42ba2077657dfe1ae422ad0aee59df9dd56a2763c2dd0ef61a12bb825b0dac1eda5fbb691c5ed58f3fb325050b4563a4042099982fffa5d6ed742d95823da8e1787cf746ef63b3fbb0e88a6c0beae4f7318366936b4917f507336068b194680900a7bf4a6fb69a5c387b97e31bc7f9be53c2a89e3651ce1de41b10e921b206ebf32e5621ef8081616dcd7a2059437efad014bb8e2c8221 Signature = 76f50b2b9c2ad97bfb9499ee41928ac072da5e8bc71d0212550942332b62e70c8bfe1c722542394688decd917aec8f95353e1d72624b70ebed5d17f6c5497702 Privkey = 3558d3a74395bdcba560e2c45a91960cec6cb3edbcd30e722f7f055210f37b51 Pubkey = 534f43eba403a84f25967c152d93a0175ec8293e6f4375319eadf957401fbbd2 Msg = be75444f9ce6be1d83af622a8c478d510127db56f1de6eb8a5126522b09fdc6ca0862cec0b8b2aafa31c17a2cc477da533d276a1ae4f8e0759d6afa0b17411b5170b52f20547c72f3e88d48cb456fe625b62feb0f81317edf1ec09ece534b9f500d4e1b1bda2db21982aa95094226ee9f5b0a65da83f91121c96b3b4010ae7826c9e80636cba00f70c3c8a279b01b95294cb850f91709f4376662a580b15ac2981afe9f854 Signature = b365b5561a13a54517cf90d88b35eb0967d6d58414b8c1547e693159e01378563654c50fb42323f09dd78ffe28056ddfa54febf44891e8a741b6a1687d728605 Privkey = a35b92f244063a19bb5e3ed4d699ed2069607116d2bd08113f0d8373613f35b7 Pubkey = 7ec93601864ee4995a4f7abcd3dfc101e9e7f369e63de1ae68a07aa7f075b329 Msg = 65cd36dae0168d69974f95f09dd9a59db799f911e1a15b85a00893b8c9a3d48a2f58ac126bfaa0a606c05d94701d273abf7d68817f2c71b1c541795c4f6095e26c9dff803f032f75663fd1698edd97ff3a0e72e1b7c9948b08bacb5f7de502b2fea67ca2fef190d60eae92d15158da444a49d2e9d5a573e8e177e8bbf7e6c49f907136e71d2a66cb07636d48768ff417c8beccf4323181fefb3124e434049ea45dd5019e40b4 Signature = a23dbe3757e478dbc84d3db3a933b0428cedb6b01b86d8d73f3959878dae6f0588f505cd4d39f2ab4677b64805d629652a22529825c3a91d043749fc71f03706 Privkey = 72d4a564ca15499b5e4e75d8ac0f28217d32114a0c649a7c8eaadd0cc78c520b Pubkey = c766bd73837c4faa5215502f1efc90c003f711bbef55170091028a34493408a9 Msg = 6c7e7b62eb244a45d78436e2970dcd6c0f7db82297a86140ea58dd22c2195adbc956d4c4ec05354b21efe24cfcfe10e17622368848180d2c4680cc215e8ceea6cce222161f1e092239253b9746f7887df2425ab5a880bdba98153be786dc838cbeca016b1d06524bd6bfba809a8bb37adab15d42415f86ec0358365ea87b8150b05441d9d49846871485caae6de359736c27189736d8f1765f3e5c5f6b92168396390bee94cfbd Signature = 8fc4f179330b642dd86ca9362651b83b006d8375ccef811d3c6706f91594651df2769953723046ccb9bfe66a667e0d11fc3ea2d8226234fdd5164765260f7b05 Privkey = 2e5aaab298e66c2dc1d77ea7421ff895255f9d900db0450d63f9f79c1a7013cf Pubkey = 0381f3f19045719b9e8ceb562f0e965dc07b09f371a963a281c749c2532f654a Msg = 3df0e54c711e3132d7ae953deb7b66869ee531ee40b63ce693206cdb2f4bda0a2569e913ac3e6532c5d9648efd4627780fb8a31d107e033f054d19ed8b7c49dc407d2e949de25f99307221d35843f6d5eb7de5cdf41b91dbbf34cb6c9c530021014b56abc44ac2300313615608a7b4a235e99c14cef8050887032209488b9eaeaa82c09405fc75bec94dd42d6ff1b599a63ee5742f3364093ac92cabab3035822aa867ae56dcc99d Signature = 7c7430305b361a9e35b2780c4d4408071b2130931d39830ec8d313aafbc83a65dae19cb747d9d1c4ce3f359cc824ea8c92f66a42b8614e7848b884ac8aa4ae02 Privkey = b636a02448003543db864b40b5d8d6dd9ad611624c9b0fc6890c51ea5592c790 Pubkey = 1ef360495968e56e6d3fe740b1c84c4e4490ed682deb4305afd596efb280223b Msg = 4aa85aac25034f614ed44f7adcdbeeec25fcc2a9eea32ab6a8699506f7a1cad3bc892e9dce934e75b0a8cd14642b778599286cfd8f50a9e4f2edf9f9d6291a2e2979cf1806b93ed8c9a78fae199b2854a03ec406ab3f720835ee263fbbc91cb4ef0758d775fc784c7d5b251ac8937919a9e67be88c9e44cf2ec7f560269aa0f1113d91b84401db15a3c48c7dacff4939ee01babb982fb95625c6c3ad78749060551bfde8cce4fb8a29 Signature = d4ba80300d5cb51353c03f28c44fd0a424ffe1e40d78ed7bb1133e8fe4e187505293b20a391da962c6a8ac0acec9c67226af3b6195dabe39b3662294da3e0e09 Privkey = 5ca0543c71f568a00eedf50a9520f4c15b526e3fb0da816c29ea3d50b2f62a12 Pubkey = d4a2933ce19454e331b5280100209a6ce8e569f993c2acab51dbe864c5cb2563 Msg = 4ef8496978d28c10abd54a26356ee55921ceb350dd4b742c4161fbeba8a1601f8ad0484b21a8cf5a294fac00ec8a6f59e3362e47bfae1e28a2e6d017c5caa75fb0f48482808037ca21476954d778ff1a0586da3ef69d6cef6d2d8df4ae7a85442a1e46c998cf407a6ad4c5463a43c248f3b6937fdbc845b60c6d85e0563cc16ba9675d364f525f669aaac95f428bb58205099f9e4a6dbbd0151fb65babe123e5393ad64026935cb488aa Signature = 436823eeff3edce5d8587d68e5473ef3d8dc9465b558b6e8e7cd3137eccc80b4c4e806edf13619d8e717e69f48d7061b68de02c8209be1f7ac26ba8edf606d02 Privkey = 5f87117da9bbb6091c94da6b230b7d8f6de0ed2a076413b92eacdc43abbc6897 Pubkey = aa786a146226832aa73c434b0edc2d41d2558f820ab8f87e09e6cda91072b9b6 Msg = 2297c40a2e8365bae4c5f0630c50b13bdd9ad9770a5d9a9451d00874b023d25ecd468b96571b2f16dcb1b0d3d756c1f044fcddd1c51f27727a0369c9cf25bd6aa59551b5b07cf8f807d92b159198639704740fe6eda0f26dba7e75d4530b2800f03fb6aa677d84df75d68d4fbb64ad21001e3fc87b609b9c251e8ccb12bbca927447e2054e07688eb8a20521a52249e7b943bed60e6a93c01e3eb621f0460c18a690b6f6b66edc6e8743a6 Signature = 0f19e6ea0c05f38185c01c2d6477995daf5065ba9d80173fa6bb23a774dc88b3aae879d8a62471d2d304cc3dc66278a7abcb0bb0771cd278e11e7b932e9f9b0f Privkey = b53a644c92ba2dc7108b16833f09ad5917846437225a773d32d79c97733c0a58 Pubkey = 515818c69c0e0a1706b04143842f3e9e271448fbaf3a899119c32f42566ffd33 Msg = 13036daaee45fcfde0c53e06d05aa9c01ea94a67e86c6c538ccb283b368daf7078d3fbab580c76ecf82b4e9660f068dcbb500b80595017c5be3c448fbd8a17d97c5643197890e167b35345bf65e75b82c8d65229f2f60aae2772581bc99c49d416bc3d78746ef830f1af944f4a6715ab4ffb01591bac2857f1a9c9d1700888780006a31607338f7af7bedf6efe0b57299ac915526fe5e1e101298708c6e61b84220afe95b53f895987456152 Signature = 13d2cbac7976ad27f0bf669ad588efb2c91bab8507d57fb16bfea9caff2b0964e75625c4d808d7bbb78c5b464edffe4949ecfbc8b95ff6fdb1bdca2742068100 Privkey = d27c9eafcf88151990bb5b2fa8443e709b5fd8d78d233803322dc86d93d93295 Pubkey = 08e0eff529776714686196d817fdf71eb5b6e8326516ef489bfe186ac5c5bf6d Msg = 77c35bda32a5967d8b302fa7a47583ceab89c9a609a667b753155fa6996f8631d0ebedfe0ac364c77e85ba37311f0de57a0dc2c1e9e400d58b424a322e1d5771e0a9fd9502ad0232ce544f07d8c66e7c3147f8607ac6189bb69066f2fad631185f457f467eba33228ecc40e894a77b571698a9bfac841a54eac5219da99c6a9125c469a22fe81f3b951433896f19ce39b373fd7e5c7b650a5ef2365ae7510b0da5e49d7c07073cf166a98387e8 Signature = c254e371445633137442eefe40ad4a82e69b1ebf48a685a2bc6ffbac126d228487b2e3537c97ef7410342091962e50c0cb85de7b39ceb41ac4078d40f3407106 Privkey = 70213d3a79c65d6dbba542a3679635003a682af5fa58de6b0d65bfa24184901c Pubkey = 4402fb92cc1249dd1ae1690f03b3ec4f1e9bdab0de5bfd289f10296830fd403e Msg = cd6e1cd9c90f566de043d75d7244ecfdb38e8bde2f9a6cd5a4fdac72b5ede6af62d981918c5e610a38789274fa10e527f85fad209b76ca1c281ad5890f9c96d35de522f1ddccb539b8798a0067acdd45b6e344a5d9a97731f545ffa4b17b875c67b48e9d4c4ba72c98a4505583fdbf1e12f22b5a7a494746cc9b6c1b571906c67fcc883a9c15a3806875b659e5816b4276c3190e25cc1ac3de47bf99c49965388f54f3ef8eb569906c6008e5fbbd Signature = 5b6ce2774d400ecea8a808f5fd0a797ffc6116752376cd7bfa3b2cca3a84d5593f5c03ad3eec1d89532275c47b7ce2a0e9c59cc4028a8a65e5bb9097ea71c208 Privkey = 5d540b3b14f0c0175c047eaf026c9070659ef13e9d28e0c5c516a428269b14eb Pubkey = 1d2d4d551a57c6fb2b04181049d4039d575cf80c0bc6ec7033067f27309344de Msg = e4c9e8706898cad4ac68d73c130efa04a54f8ca25919ea6bfaa54c8c720ced854c5e9509102c7b885aeddffbd1b7f2c5922583677ac9eea9a108c7e83e8871aed5a084f5440b0f391ad7ffc6bab4574af1b96770f4370e8e988e85ecb1a8d6034fc3d7f49f7422023b9dab5d0c16beab5f5d37b0a4d7de197ad87cd4ff8ce78eb12e1daf739d8b47ab380abe9093356db5b59717751a49e1948472fdacc259ffffc8c1dbae592607d4ec71cc6a8f6b Signature = 32527da755312889935dd5ee91b1bb117a5d377dd23ef5b7e15baffae9a54391a3fd234bdce073e098c58d05bf195b4c3cc63972383ba4b51072971aebcb620d Privkey = ca41769caf1717b4e45c93c121dc82a534fbc6ec0986662c3222d71492bd1176 Pubkey = af3f89f6187dbcf9217750c67ef89ed47b039f9eb062ffec9df64ab52b0b45cb Msg = 9de8476c5813848ab1451537841cc178002181a2182af305b12e5f7c3b1d56b22cf46ae6276d1826ec0a8c9a7d9f68083b7225bbfaefce82b3b64594052a7700f309233a79fffdfccc5c21400c91cc0e418d5141d486b5219901d6dd2447c1f7b7cf5a0879e70e1dd658d0f2ecf31ebeee11a5c74440c63b9d8b45318c3465d7ff03365edd0385edf80d4fded51f0f7533ee4099f19e93bc9d08dadcd13485db239522ffc81e2c051f8796d62e979fcf Signature = 5cda872f7ed6d7c90218ac10bee8e214f3b34d15d25c39255ec9e6b0177aa3cb7368d11cb8ed6ff5cf0c04281d06bc4272b8bc09c23f6f4cd5a810ddc7b9c103 Privkey = fedd63ffd4cfbf618894962e121a9025eea318a80a1adf169d6490445d2e02a0 Pubkey = 542f2244bdb7d84b87e628a8e6a12f17bf74a9a6d0ea46c595dbfdc680c04b26 Msg = 2e2ae584641be03dd48f9c618077aeaa18212a4241f0c0194ed23e370d741a3ae11a5fec3b040c16eafa4ac8d18abaa7ce8f286967337189f0495ffdd61995cde31dd8dfc3df5700b57a7a29980e9c823fee85d61451176729e72787c6109b47359b93dfd62e1e5a2d642c057242dae500a94ca1a93bc57be1ade76fe4501c0f6377ed0e9246179aecdd9946b671e8190e1ed23f966e96409b948222d8ea5839de904fc51348073b8f40edbd9b4a4b2275 Signature = ed59d9e23dec3494b0fbc5d10cd02bab86b3eb35abbf9e4d4a926479f134583a44ce72dc4122aca377a4072b7156462b74e8df46b686698636836ef203179c07 Privkey = 38f2184eaa553656ee2902706bcec4acb5af25157ca0f6a2d48de85285fa3bc0 Pubkey = 7ff03fb4c82e9c15d659df424b3e73ed1d78006f3e0b79eb64d98c13aec6ba37 Msg = c2df77c9e479f61983b6c7483ef93fb85a103b213923926523065ebff2257e85427e05cdc27582ef6c16be353a3b250372d6370eecb6c8962917eb656f2641690189d172a111051557abc2494e32cab65ed0633affe92408b55c4ed8af65e2c5e7aab887a3cc8d28c52e9e1336d0b7bb3fe2cd843e7fa1680342f8a4aafa02c4ab252f08c3d46d5f00fd01484263ee635284f6db26d6298de5b0dd238da40a8d2a93376da0302783a0e3be23d9e7f990d25b Signature = 4a6413c2c87f2b3856a8decbce493adeae0c69c94134707fb0f18f3049fd3e3d051abdb9d4bee253c6107c02d57ad7cc9f3101db660afac2b7981938e9564f01 Privkey = 8bfca48462d2536f74b84f6af59f5d8582ff8f7ec28745d672e72eb72e79d3e9 Pubkey = 9d10d275c3d3fe459f7fe2901bce389191cc8483c0f51140d9c62b08fade81bb Msg = 81ee4cb9c45da691dacd7dd09aff59737267bb55c3ade1ba32c17b7d0d2d0c6079c39d5fd5b29ba5f9c1762097709843eee5612bd20bc8185bf64d5c934184e13624e6f877a2a5dda15c0df62afbb97057cc91cac9a18406a0e0109cc39b2e3f812e227a4062d5ef81c92c22a7dc797c845d71eb6ea9e42ec8417fba90a96d2bb1439418330b4bb2f99c6d63d304a0e506dca9653e5de0dd56e309db1a76a0faabab163774f000088cef3d1b7a6cf661d2e1d9 Signature = 44d77e439ef6ca5eb940c60ff8732ddc16269ea023bb2613bd447eba7fd69851226c4819ce8d44985a49f3f41ac7af33c47ffe5f89304a3256e445f8d686e307 Privkey = d7480d4272bcb1557b1bbee04915c126a52ca6d6a8bb5314a0e1a52b59bfc99c Pubkey = 99c839d36d8f5b8652618ed7b0fe9ec3d94efff4c453c540631476a5979bbbe0 Msg = 615cc19f942017365ba8bfa256ceccc85ee289a1c34bb1442acc0716c7fc2caeb76a9de19adec106371e47a30d2e1239ce1f7dca25526d604bdd647659d942bcbac368911349c3b946a97da10a42dbcf3c73416d2e6ba22bd29d9f705672e9e338944cef01ad21f009742e07bcd888ca31e1ee953e8c1b1fd954b7dcf1a0b1d5a069065a66cb721adc020f4efe1abdd16742746939285780d753137ae0140bb410fb6ce33676c27aeec593a88cbc73afd9f40511 Signature = e04dc8442d352173e931818e290858de85688a4649ea3e3c3ae74edaa54ad01b64622ad8a090b6ad60adfd01881882828d39078bb5b2714fd3ea8397a342fd04 Privkey = 3c2d3650735b41ef9006bb45e4be2e0aa5cde851aeac421ee9c1b492d87aa18a Pubkey = 3e46ddce298844fcafa00a1b47eaf3de70596df1bbee3c809d1be7dd94080e34 Msg = 1425d8d218da1a10a80b6a9c3c2750efe41657984abd5100f451ba949db01046b7126be8402334ed57528bac05622553a86b726722695a8fb331d8565417c4ff0f251a320ad06dedbb750def35d521c3c4cd571a45ada8450653d5e81fe0beb53aaae787b3eb653c2381ed55aaf2590ee5ed8b6626f1c4b0430a54f39658624e6635fefc98fee8fc3e1cc7ff3dd420de9da11a62fcae0e0cb454fc6f7df03954291d26202f1b188b657b3bae07389449b75e67422f Signature = 3f2af01ad5377ac39040d41a41e36e7b93fa7235b841791f432ecd7f91a3b21ab7196c883ad5a7db446f6c06672460f3f63ef863d9432be9caeabb79e87e2208 Privkey = 74965996268cdc4c09220bd31ce07b217a03826ee981fa89f3a2359ced095ef1 Pubkey = 4096d027c1c5ee4cbfc04b9d534174029fdb50cf5610d3021ef933b4caf33985 Msg = 45b2f064615bf774fce97f51c464685d7b3e4fefff9231240a719b3b0621cd4ad83305675cd6eaaebff791000b0b1fa31d82d8181b7fe57c5e00cec56ff9022e9ce8db66356e408e3ee262fe627789e65535ef1a63e8fec933be3dee34d2facdb8928cc456abf2f3e8cab47eff1ca42e8b0e48d2c73e7bcc5de3f1056fc523dfef6b0023f32889ed394eeda032abf6bcaadaa7f3ee74118760ab6d91df528bdc5807972c85fa7cb56e387d7332e779e52d0dd7db0cfb Signature = 8c6628344317a63aca6f78cfaea965b3aa5522ce914195141c08870a1b8dacf34b79c7abc693cd9e5ebe1a2e86f0332d2048db3cbdef01687962d6df249e3800 Privkey = 0abf069c08b2691c3a26f79dc8ed05cb71d220ff78f3a5c5780ae9da18e45643 Pubkey = 9ef3b5cc016cc82dbdda705766aa448bd61fa1aaf1170efe9149daa9fe64a1ae Msg = 0d055291b2e861eae19ea0fb2069d8c9eef4f1347f3576d78411ae7c0b1c1caf31fde736dc8accacb662df76b620b62ce90b9f92c83309128621d057cf845805949088e938ddbc3d41c5e5541fec8298687ad2f79acda01aa215d25821436eac9d268716d4cd6050260cb4ef6aada4835e073a845821ff211ae2baadceb6e57f06f88345edbf93bfdf54fb74123b57c0fb4a79608d8db6740889e15733507799f7a1fd3017bcd77b28a2bb6c91ecd154e9c5a5ffa0eb62 Signature = c7566fb3b4d8def667e040f276d3ed98d36dff460126a75b4cc2100386bb01c642f6d8de7e649be6e0818b08d77ce60f4ee5e7717a50884bdee02034ecf1cd0c Privkey = f3fd5ec5e230b6dad1ac3d3aebadc7863ff89de2a1317f424d15989a3efb0afd Pubkey = f99e5d5eeeaed1205cfb5c2cc4e5e9f6b4e7f64129f860104ca6244eb9feb564 Msg = 71f28973ed3df05945fa0bdb23e9beca651d3ee6bf9fa45ffdc6061e42fa2e8d76235f0e9e2daa65e52631fc3bead33da055bb492e4758e598a030a33b3c40b34371459b233ccc043cccc3a3cbce549e20e0b2b43305b64aec661aadba6556b17d76e3bbed62c4a4eac4f88603996752d2363c8d4a2789d128f6e959945c68c30146d194ccb6839ec65344601652c18b0074e2bc7668311697d960c7066597924d704d02a0193fafbfdf571ee0dfe414dc2f52896912bc32 Signature = 44b0124663adb0c73aed49f73403461fcb19111b0ba17aa996566f477e37d524b0e1f107612fc52a7c767b181fbf4d629bddc08f30584dec6124c5d39d423102 Privkey = 738f1310a4e08f917a0a5c1fbaf4ef72f95ee62fcded50868a3daf98856a448d Pubkey = 42272c2c8b08470ee5dd8af8849c01b7508d3a3c65b0330e695c841d5dccb2f5 Msg = f0e7ef6782d04c6943b19eb66ff6226b736e3b0940c09bb126bfc4c4ca7a5e7016c286b7bfd73aa6a79a96031bc81cb5da68cec71a6a0d39780cbe6a0cd4774d3aa06a881610444a8c9d19102294e5f635187aa6f48d11912c7094b38833028d570cb110db60625bb1bdc37affa25ea3c8f8dbfc2514f4365c62b2989a66d27c80384e74ae5fba8c1c2af9c72c4971e64fa6a1dc2517b31ea57ccb0815a7fe2da0f146caa08431d25d151662d9d26e95229d0c62823664123c Signature = ce1e3577b6a21016b9dd0b517baa0ccb107bc199b8bbaef68f950c8ed58013c853b4d338eedc675079ab1390462ffefa6a959b043f8b5651c6ca375ce0b4a403 Privkey = 8841d22aded69c131ef5ee0a10ab0a9b77cb754ede8d257a5372726e2b499c6e Pubkey = 715ecca63681bc6e9e31d18848902f4d96feaf43b95d008642903b1763bc9fb8 Msg = 087ca6be2a950c024b3e7467fe00a7d364555d5dc6770f5ebd260642525bd3c0f965db36d7b229a57421eec64e4d991cdde59123034470553f4eb0be81ad2936c8ca26bcab4e5d79040e29798728601684a468323cf3baae4d948d0a1fd905effe16dc44642088df53f6388bc480edf4aa207d0ed161eda345712b4c00cb05fcf635ec2588785bfb8a27cdc28996a1db3e6787023393c075d83c9038fed7899c55fec307de3249c14bda49e8b895860942c36d640bb893779142 Signature = bb2bab7003f1311be9b8c883fc4fd528adfd51a9c99db3dca8da0fca958da19a10eb22332667b1a0065d3dbc0d06269a1259b6a890484aa2143a52695f145b0a Privkey = c02135e7b65aac72f63c32bf5bef5b68c7f3b8ed56208e59e4752070e9d07095 Pubkey = dcf600f244037a75203ae11ac316e8dbe9986f0dce23473939334bf5cea48b0d Msg = 86d9491350d2566e708ed356185d610c73465b2a5c7012919958af2cf76af995230d360de400b7137170dd0835f10fcbec224ee4e42c7d1cebb7f580fea8ed6223163bacdd1923a572cbb6dc26ca8b17ade68c6d2808c4ca1eca28eae9a145f68d4079d8d59d140e958228e7e99520e342dbd7457a9159740f48bdc27b93bdabeba465cbf0c8df5ef2c0f9386eebe656f5d749d5f9147f525266910d7b80396a90be5cc188a9a945f93e753fc99bafa18ee0a6dff79bf8484898ef Signature = dd5cbae479eb5e229574c21ec3bed911113a57a1916d3313457515d55cc5b6e6ebc52c93f821d13988dbba8df5096d55ff9c39e7f9d561cb58930c96a7a5d60b Privkey = 154a47eba1b8c38362ea61faeb0c0ad7e61e412a3cba4688af0db2a487208b1c Pubkey = 16de2c894a50cbd4ca90419a4ca64942cb14bd335c5d3f4a53e239c280bda725 Msg = bf607e8b6e14d9c8acd96815af0c035ac73c4104c93786ccc1c9f859395dd781900320ebf356aa991cdc9f503fcee9f83675888a7d592002d2a54a573a96994b3fa865538c617ed8ad1ff62018288a674f449be0aab5222f74c4fd475ed6a8dfb27f45287b22b2b6c3bd15179f267d157d7d8a4159679be85b25c2bb2ba850aaed9ae3ae571be4f75836329cf36f412c1c80f1413b7661eab4a8e11b6024244fc62323ff02e38aceb1737bd474bf1e98015dbc788b027bbe217cf4e7 Signature = f4b6eb1a8d950e887fd2f30f70a23b41871495bfa5b8a4ad3996cd9bf51eb742e07f4c4d2da4b01ab087367a50e2b65b3cef514e40d837540b8c89966485910f Privkey = d3028431ce2eef73bd940ab84ca29f13fb26436aa25e1b7bf26cb33f17fdf817 Pubkey = 63df203e2860bac4d352e722c1c91fe3776e1cbcae8553a4f19890260bf0e457 Msg = 086335d61275d168eaac0540477f50d4b15f9e50b9be693921ed54a9941bc40643cda62e1d805d0250a81146bd5fe2d39e81444d21e2b21b031c111306cacbf52717f6fb4cd3416f1215f8dddcedd2f0096b0fcfa0a6cc2cde7a2bab7f1e32790b5361df3671424cc722f231bf71895bcdcb7b22ee074e8fb4a9678504e735366c172f07637b7a93149bb21f38883378a1db273fc23239e35337f9ce566d8ddf3b3133cad7f2ce81edb503ce1d27c5a657160b78dca9aeaea379be9c85 Signature = ce9729a96c3ed28943b27839c73382ecd572960c1f9e90c5eff9dd499ff48f17d25edd1268effe41ee6a81ce48d84de513df9c41442621b2f5491e346be18c04 Privkey = ee8985dc27504440a8758d4c53e4225215797a00cd8631d59bd93bc66f373d5e Pubkey = cd647bb065693d486589156a9fa261437534dc86f46f72d0a800399a7af010f7 Msg = f2220485addfebce02a833aca33381d1df917ed609950ed24f85e3b02b2b994b4d939784e332f41064c8b4a2630ab36961742aa1cffdcb08c144eeaedeafd48b5dbe96bf24350e14fd68286bc08eeaef8bc6ad9e195d1484afcd30afa8ced4848126d56c81b43c27a5dbbdec1a50c11062ce21c61d860c25a862fbb75c3bd51c8dc07636668669bbf751eacaccb3b51d2c0d4140316cfce2eb18d2908cecd5a188679bc5f5de290f548e7ebc57d41b589a24ce88ee48d97e8d0c7c769960 Signature = 5bd60ad5e9bad9932ca9c75f231a76889ae7a8b864b91d1fcba5c5d4bfa1d92838adb974842a0710779b3e3094044909e92c7cf046ce519f4c68e8f19ec03c02 Privkey = 80dfe2bf7387bad4654eb076f8dae9595163e40127f5df492dad7df04c7221c4 Pubkey = d1783ceeb9cf8e4d07764c473fa4061b8274397103f2076d703249d758b8fbd5 Msg = aa09d784bb09dc999931ebb4c00e424cefeca104818d8eaf0661f09728ad025ef47393210571f17404e9aa6d8cbd5fd88cd7dfb8e2e8a108c05de206f3408234a3b463dbe71a07d05587324524b7326ee79d3348ddbed7871b86fcb488031dc9ea93f6b8d7fda6239348a562444faf1e72d31af35443e9df53e762f3e56b48668f9784b3368ab278a48ef4546a26cfad0d0a5161698f26ee8d34fc2b3d6dfb93b009ac296f6afe487ee335eac9f02cfcae5fcbd1a16ba4e71be1b112562fc2 Signature = 27279e3cdcb03ef557a5defc2f6c58128a6dc3f8b0385958014e709c1f61b0ae6b403576f0e454d5e4c64c173138ee4bbd5fe7b60d06c5abe23fe99ee3b46a00 Privkey = da1f868542cd7cce7a5ca3fa3c24081b4d2344b21a157f0264a347132d19659d Pubkey = cb3a25a53f272ea813804468d6500e96a1eaf822705b7790a8ac3e98cc4e524b Msg = c6987ef380d5d0e74196443aaa3a32356cbc02636c5a4b6d62a8114b2111bc1abddd9e44b3672c18b58d4ef591af4562e020049f8e1274688e1f8e5296d2f9252e7fc84cd1d0c58e98f0f160530aa22c871eef652e71974ce91b4a65fc25fd09fa1b6c32086e98ec708d9abcb1d9cc8e1a089ed8db2206ee9570236ad69b3de6821862fd2c70cd83a32a68b0486229553d928de48d03a104e87381964abea76683976d527c84163a12eee0a55986cf1431e9c86cba8182ca94689bacd165fbce Signature = 75c517ade4f08d7746305743d1a776c3c55eb5eedfdfcb5eb1d5634a1bdaf7a4b8d24187d6c8850e3ced6567a03c4c59389a4cf47114ce5473160f230546e60d Privkey = f13daec0ef33ddd133c7d244d10fd27ddb23705280ff5f1815f0f656d836fe84 Pubkey = 2dc7f1367de672c51e005c74f876f982593996873acba079292734c209c2b111 Msg = ec02ff1804b2b309af3158b66272a14a3aad83c41a719846f7088ca9792af575c78913c432759f0b9a748bdc5568496e41658cc1cdb8da6c91d07c3ec2f4af504249b996aa00c0071cdfa793f82d0ec5d267262f518fc029b88e20b6201fb9e05abd3f9524c5da2fa8978ff2efd48120cf00822d1bee90df816125d8edc0cfb5de66d16be63896a412a62b031b7118ac13fe2c9faa6b1a3342f9ccf7884166cf489a84de26b5ce5b21856a3af289bc6622c0aab9f2142d393f5d4b236779dbb066 Signature = db771833f7fdbacdab2b5cc80eed50afdf13783b7fe5e903d5dbb4c2e535316a6eef4c34f004d2b9a4e2700bd6e2acdd564c3c80cc68a303f5fb091cb4340f0a Privkey = 42dc16c57fb6f128945fa101e05bbf548ef7d97726b692fe404069cc57ccefa0 Pubkey = 0a1ba5df523996f954b34ddcfabad3f3dee21a5fa7a4ce322d216bd8ccaf438c Msg = f2714c23a3a6fc11ad15c980b7350fc84217877661188055ff750d82c49c5fef7bc8e6aac574a1b79a3f26d16969c0f406eeab3e9e12850a55709745e30dffa62a69dfb2b64b3c1bd2bc3586e26d4eea714d2a7b71cf79fb8ffbf2aaad00ca3e4f2b6f503cc1fef2eab3656fb44f8d62a8db8ab58f394693949eea57fafecf005f6ebf1287dba4d2d623c02ea171f567e526add20709ebcab962f83d98ef668ebd01ef20488b3665e3a446fbfb13d34050942c749bb2dffc766367fd452e68e5b0c6 Signature = c75977e83bcfe9df7292a860ed972555b5c24416fd4b7ee3285388fa5b1447608e4a347813cfe093512a7651e422e9867db7b97c0b0867f0b8c7b7f4f02c310d Privkey = 90b455c6bb9cec83e137357065339d030525d0ea7f5b923a2d5972c3c12aa37b Pubkey = 5cef038c16bfa4b4c923a0fe70cd7f25c8bc837fdf5a7efb9d95f21b96be925a Msg = c62cfdb9d21eee6be47f30727aaee51f0703789a431d32228533350217a93a18900669c95956f3f2ae90dc745a71e18340d058d16b4c6fe33b64af8dad973fe5dc02e8520705c7a8bb3ccbe1838c6c249337f9b6a4c0e1f8a4e5d103196fa79998923d0422e9d079a72cc2a8f86d659031a607d4cca0b947b3abeeeef64c28da420d05de665a5510fe55f77598ecad7faa0ac284800b53829394c4ae90be66678ff04ab46da265ae06402d8c83cad84d61a051de0260559888e779f74b72a5d71c132f Signature = c9345eec2c4a0aec732386494a69a3fce8b8a1be366bbed1659f131fe97cc037fb1b7c1b68b0f3023945d20090a0cd2c1553a47faec4d66fd816ce121168f309 Privkey = dc185c2ba0b378dfe5dda510c32feff535ca2e8a02434b326e0158bc878e8848 Pubkey = 33d6cc05a434e419280d5864a1af209a2c676814b70f72f8141ac7e0573ee63e Msg = e276b11912cca5a84bba650c172aef3a4d5f91ac722913bb891a3ab0424ab07ea709cb8bba3a3d11f82f51c2af0162a82f7219ce27b35a30507d536a930817e40f85a22a5a432b94d192c3c8911777cfdb7fe937a67502770d6d75753d3ae88229e08f1ed23b4328d862ac61863c063ea9848f8ab96a0213d7b936c48fe754836c98487859d199b3d940392716a1d569e6c0cb1ba918932cf88525e256c8abb11aaf0b454655d5db55713cebba287ae202651ac872bfc80feaa7e00d47c0be38e658f7c5 Signature = f1e44514d2ecbcc8d1a7e84bf584ce731835e9894f88974f098d456b60718f575ef4d8062f2182504250cf83bb2af2a79b1f58a6a97bd98da467132d7bec2f05 Privkey = 90721c43bc366f24bf4e8c993e138024682f1029dba35abeb0d60c7fa710021c Pubkey = 7c63a2f13b7b220a0bb752e3800753b8b6b32669378ce131bb77a9a8d230e9ae Msg = 651c9617cac958c7edd4a5f3fedfb83dc971abfbb69a31e898cca8472ef068034a6d2376ee0e72d0a9bfee275796c3795adac8ebe1d12b66ec268f6b75fa3941154f99e223faf2cbab5b92e2b3ba7b79be7700ef9dba69253cce5356b0c4e74703cfcafdb5546850b46232675c90c02d5e426d33d60cebf0c7930182379dbb007f536163c8ddbbd3157bb2da62340133f00ae2682ec6baa6416b5a01521cc10e04695295f2e5b94c05f00383ffe954830797f6df823172532f98165fe314ab325929af8385 Signature = d2064a6d6c99c6c3f152d2d435f24e34b5459b082ef11e944a77ff54ddf9862737ecb2ac8d54207d36c51ad41f36490a111ba80e126bfecb09def6accbdf880e Privkey = 9cec246758e412e7378b4579eafe9fac5a25d5405f9270b5d7e543414ec3d5da Pubkey = 975a9e6a152caebb2f9dd0deb76dd922b6dc77055dda03fbae9e7c685d073aa1 Msg = 17ec9bd47add6ccfbd787af0d9013e9cc979aaf850e09426d3b28edfd71296eb31ff8b21c5fe7be050f536324c3ec48850e0b508a36bb4cb7e754b327183a1b394d88a7941d1ce8dac62a5d8291874d78485e51f29ed05865a206e52ecb12c5d107d4ff96f25d3c5d181d2c4ba6463600db1cca32857fcf597cbdfb2fda2708a8aba281b43c3d28c4a4e7983361509f61a1074e6f0ad6101c7b567ee4078e9839c47f46531b729ff0efeef7c9d1a8d833d9c0f42812a34187c3a778c165c09d6459c9c7ceaa2 Signature = 9bad1e3b1279ef658f4d071644c63ae2b7a780357e9dc426f1650ec0634dfc520f8eda9dc8f10aa7324c5942d2347ff8802bd90e95fcec313352cdae64f32a04 Privkey = d1403f63202e080525843bde255eeb6b6783c1caae9d6ed00ba60805bed1941f Pubkey = 238aea3ad6d6f27783e70516bbfcca4770366b50ed0fe6a4e966b53af121a721 Msg = c4f17d442fba4ca0df8dc1d0628d7d7f36b60b5758d7c13b80b8f97a62124d96a23b279565495a8accab5997115b13a4ba220a73957eb7930520acbbfb6f54cf68726b6450c6ffa9470b055ea262914e2bc612633f1ac3d0618a23dff188a733d76bcbcc460f52ab61e19938f9c8caaa792c208d1f6c754728905fda51d881a347a53da744d3baadc0a76c474c558680269095f9084a74471d5c09ffc29141b5bfaf4954dfacbca663d037b17ebf9559882233e5ca5a8bf75cca4fc9c5a4109f32e145f3853b17 Signature = 8e60e73c063816795e29f5d64ece1159f1b5d5021a6f8f655e261a4d0026f5b94ff2923250499d995298480512e4126276aa4a226d015a95827b3ce692e23302 Privkey = bdf6bdc31ab0b5313784483abeca6ea5e9cdc68f81b21f350d09c3907bb9b6a1 Pubkey = 03627712b755e5069fb9ab8f9e899724029a7f268af9398821eeec9360c9285b Msg = 90a66aafa5642a98e79f0d88147080167b11e4466518f195cddd8940d12ee4918d31a6d4cb77d0bf5af29983bbe5085610a79daf0c75a78ccbcffbbdab2189c394ae24e265bd8c55fd3f4098e1b175577549518e7a4dcf7452086dd1278dd58ea4c0aa690e917951ef39fcff60cbfa1e90910bab5374928d4722f702bf5ad6028ffda6541fa5ba1a3779ec78b0a95fe3850c748b6c8f42f330ec79541a52a1cf57db72df4f92ce7f748aeef1af33bc5ae0a82c89dff216f23aec168a7dbb510aa632daabcc971b3f Signature = 38fac603ed246f833f1c0fd4585698b0a71305eff0d14a0049b3cef073bd036dd451b3dabadaaeaea2aeaf83d395746f4e86866ada971cbe482edb0419332f0e Privkey = 57b3b14ace1cd0cd603e6328bd219ee7d9d094487fa668f28aeec02b43c909a7 Pubkey = 24e6b6395f97ea0e237186d469b71923d2113adf403beeeb4a2d27909aaf3eda Msg = b2e0dedd802eed996dbd5836bf8688b0d1201bf5442ff9bbd351aeefe1a0c21fea2b5c9fe5edee47e921099b05aedaa80367c1ce08821d783a5b64cf059c0f4335083986a5a6ecff8c84fd40e0ba5dd5e5d2f01112a84ce5cf8e0db78beb182d9139c0b0f3e0060a3fa73869e96423f170df9af1cb9c35566d87dff542223f6d439bdb54729d366aff637b0f36a5d14b15d612bd03076cc4d04c1f25b3ba84e0d1fe474e5718d1a17d5a488465662ee4c3f664b4c9274b649d78cea4e85243f3713239048a908ce3e1 Signature = fc79fdc6d090887a61e43c6b9187b657d2e4d9cbafd6e7caeb7ebdea842825b78fb949d2c49a0cf38b6c73296d82c8ddeb1fe2d40aaddd7964da68acf8c66f0e Privkey = 018a2c3deea50ab506751f9c2adaadfd9e2192121609931684eb265e193e7f89 Pubkey = af410bdddefc644ef12c9899ff71b9e1d0dfa3d69d8c2cd676c1916b34591cfd Msg = cf7813efac12ad1c7c7322ccbe54aa0e9a8ba4fd4345b06e4ce7a35c8b1cd5e3f7f0688533849ba2cf4c75b6f20926a1194a72df0e1b1b34456a2133112d006722fe811d5e40c4121159ded88990c0ac2bfd34f35af4f07cc402e9a381a675d03fec7ec438c4ad9d929aec8f242def023c993c9e8ba18c7428e88fde68a4711e506d7969f63c8e0bc83ff0de4e1336106c05e09d5922400e8a81bf54885667899785882b70f20dd8fb1e75f5855b765a256da4341bf23ea0ffa18aadda381816946001045669c8d04df0 Signature = 7a44e6a31932dee6dc2d8394e29a6551d13e6c6ffdfa218fa5b998668d8439db5e05379fbfa0da5b563ed966435ae2c54e3ad16e1a9fca1f5a157a080704ab03 Privkey = bea445e9b6d3f21235912cd6c42ec0577297ca20a10357880c2b846dd8e2cc77 Pubkey = 024174966221699ea4b0a37e517ff9b16598ae4d4e83bfa3ca50bc616841f595 Msg = 4743c7c099ab815927b3674d0054b6de59af2811abc2cf7fde08f62929185adc238fadd5e75ae3ba0036ff565a79405b424f6552331e2789d9709ac1ecbd839aa1e91c854817597958cc4bd91d07377507c2c8d3c006cfeb6c0a6c5a50eee115e21153dd198ea0a3aff62b7075d5a461788783f050e659c572963d7a59e5afaa2b9c501f43c6ac08ab4797c4566d22b93cdf65a99a2a1d638e79f72b5f4631fe5e9e5f968f6db7a1880df51d8febc14942672f8ea6fc3a72814a44d66d148420a69000f68c330de5b80fc6 Signature = 6964b9c5903e74e99328acef036558eecd3369150a52e2cbad4bbb97d461b3dfc6b3e8455813a4f4bdca46302e02e683ecea1820171c538e54c3de6c954aa407 Privkey = 6447540ed7be0a11c2a8de793d83c6e244983db18d78ec9d75f1729c92e0fdf1 Pubkey = 391212c8edc4d334a5bec860ef0f5ebb5ec44e8bb51c0f6741998959b2b379fc Msg = a4381c7638c48799e9b5c43f67fc3aa3cbb5ec4234f37e70ccccced1627a57683d1e53f4e0883d8b462bf83f1308630368c89b491533ddb8c9a5b9e8155002fdd581a9a5be0e430b9086a6beac4720210f87b14e862d97e5cc69286786a7586723f231ef0e3e1b932dbba3a18a0cb221cb07f80e6a8e1300056c13e702b23bfb3250ec7cc864d5c7ec5786240709c56024ea6be5f7b15a4fa5555e39a744a1dc557df5b948db220b3d5745746691dacb4421641cdcc12e7ec0450293f19ec57b09cff135847aabe446a61332 Signature = 3ab5f88e2f7276b5b6583dffba5639993a905dbf9b88ceeaaaae3335800e4a5f10f83da6d6225a8dbe99ae80075009dd508786b3975113db478e14ba101bee0f Privkey = 0c587a811add88b994458c3c808ac4e3a83afab26d4cff5c961b9df0b5c83344 Pubkey = 06783b0cdcc5028c5638bd748f0bc76f7e94d1aa2015ca948738a3500460aca0 Msg = f56dc6b76076325b2126ed11d1f09decef9d15c31d0e90cdb1a27e089cc56329f6ec3f665eb6739ec5678b3f37ee1fb37deb9e240092b7a88fd25525acd55e294eb1046f9b1b69a847eb9ceb7b1593b9f6978ef618c15de4e059ecc3bfda3297a19c2df202adf72155cf21eabd03948df15198e8a68b0884f93ad5e36eb0983cca30e45a8b4b5fb8136fdea8a3341dd7877540a557debf7530cc33aeeef6271c3f0af6d09787e815f2f1dd25ce4d2fd09ffa9f53081b469c500da4d44180c04eb1869329cbf2d823187e831c24 Signature = 33b4f4274f20008a721d1e8d054a2b4e95327e38bb07b33c4bee7e1ce020a442fb2627eda3b7ac93cd3ab0b12b99935a1a9233111604da4acffb5315b907120b Privkey = 66cf401a2142fcf4a8018046cf4140bca18d76ef6266e7a024757df172a5d653 Pubkey = 67d48dfd23743cc2ca40e4dfd6b8cc5d84be82dd2b1120cc476e6af6f25ecc98 Msg = daa8efb3fd41f12fbc55bd60464157a26d718632d882aedb6bf98e47dd2337879e0b46452e062e6dfbff3e7bca7289e4ef6b3f41d4b03bdc2c842afe97f3029883ed45f6054dde9690649abb2b8dc28f5fe8cecf80fc1ea411bfc40bbf4fd20b218cf47ea8ee118d4d5aefa5c1bfa08a8fb1b30d6de0977cd15e50292c501f2e71ce2740ff828b8432da5a594bab5223760b64792ed3a69dd75e2829234943656513df1a17a2a067a9a8eaa64e19569f46939d34b99271ae50a47d7dbca3620c81255b0e1fd1f3cec851f1b11b35 Signature = d6b0e80e60bc1b29ab8f74808fc460847795ccb887bac0ecaa8e135297a85097712b24b0a1fbaf7a67c5d530a47d0643fc8702c059d215fb112dbe475e5bca0d Privkey = 5dbf885aa598e895571f5f65090b72323e9d70b0f58110687afbbc383afedcac Pubkey = fa17eba76e3bc3ea6dab3a5b120dc5ecb9ae6f00138f7d36dda9268bc4722174 Msg = 1e0b6cf15ce03337179c02d65408df5be9200c3782b6004af94ea4decb257999d6fdff301d11d00c98c372fac0d026cb56dfefe3def7eb99ac68d6968e17124d8446f53e8d2d3dd890d37a23c7e0b83a484b3c93bddf6c118e0281959d27bd87d37e843d5785f4a40771398494e6c4322fbb675c1d479321032148f7fe52564ddf7ae7ac269d0cd2e552fec589aeae0fb93fe3eeaef0856096cf4f6b3497e7235cc8494d810a0b46c5eac87f187e505bb7764f8045c9541983f7b025698009a23d9df0bd1a473cbee4cf5e9488ecbc Signature = e1429dab2e42cd035b7fc602efd6baf94706f16eaf2f8b5fed329239e875605fb172f5dd9ae2bc2eb42eb474567e292f5206e82e694bca0d6d433b867634cb0d Privkey = 84b3aedd4797a565c351de7dfa0700b9ff7c4d7291c8808d8a8ae505cdd22590 Pubkey = d7ad72caa7c22209ec4678d11d5590a6cb28a07117fe5aef57b50751583201a5 Msg = 532567ffa53b5c0fcd29c39499d2e78ecd20e63123499240e775088b394dc65c8baaa0fe8f6aa7e70181f9e10add8b4a8beb0b2ec38a43309f100cd4be91c6f48e79dc0aee93a15c9403773b354a8d42ed48d8f276230fa6de5ada501ee0a653b4458f0ecf6d5b3c33e2141c662f6ea055f741e54586917d2e0c4eb2b56621f9665fef3246f0bd800b533e3bc615c4021f8d0e2ad233a11e7736c493acc31faee76a097dc40db9efc22446eacf1cc18f51fd10236a2f942d0a53c3ce209108b5938c0a9e536b89ef0ad6b405a10f22c3 Signature = 9220f0edaaaee1b876350dbe9266061767b86296c351d4cac99d07cd612c6efb24f8f9b0b975f95c42c5b6afedc892f87efedd39d5160294c27658bdcf42850b Privkey = 6950bfcf480b98ea18a2d5ae5ba6e7668f4c283ff2711357740ffe32cf25819a Pubkey = 8e4c6f233f7b86321c9d6799bac28aafcd2503d7aa0a7bded8722727fbbcaeb8 Msg = a401b922aba57ee0c6ac1c8f1b48296a8562eef137526893886a08306e2203667788618b939864467a31f16edce152a42c25546b640ea8bed189a4f89886a37f106911eae1f50081bf795e70c6504437d2a80cb839479ecbb87c129bcc5fe31d716ef978c206d7f08a793466594f4d75e215bb6374596f8e7d00eea724780943e89bd3863c951bbd24efee23c97c2c797c7fafbf8f2c8b43f37a5f881129a09573fa7a034a285e80dc4ba4bc9564a4dcedeb33167e0b30c5a00b9a109a2231cfa0012b29b2b3450b892eccef0808e503f8 Signature = 94de5df7a25ecd70205d40bc9499fc7cd7136568060a419a93be6e318664bb6dfce60e2d4e633f7ec148fe4f834ed277c1fec4c4e2a86f44c4589c817888db00 Privkey = 61b260f5b848b271ef48e5a56d297432d89f2ab85bd538fa668870d0560220e5 Pubkey = 6086fe8735f399f1af2e395e0fdfb5629ebcb04b6ed4a54a9e47052c6e8191d4 Msg = 2826295d79945f675476bc4d45ef800d80b1f0398e4be60e3de4571ed108df989f032de6c2345d9948d677927ea0b8cf1a5ca36fd5f23c25dc0d2ab5bd565a54af46fd97d338d770e3a7b47efb54c07a1664707771eb4e37d9d70ba779251dcdcd3bf6d1248adec53f787259c4d594d5fd4ced8e3db7621d4965d48298178124931a3d0cd269b2d53b7cd261b96d370c5d9693c8ad133ed58945ee3540e10625d924aeba9bdafc656100aab276fa996b1db477bf85ea559081d5b4c7307dc1595654aca82f7b6d2ddaf7357c15a4d7d8b908 Signature = 9828fec8ff5cf85a98f450770b5bdb4b80daca44379d8f53c91c348e22df64ac48f2b6e2a7b3b642bc8193a194316229e69447ed241cd423d83b6fe7b2d44b00 Privkey = 936dc1cef6a310747f350088055a39aa762d9a4b52c8c8e4c682794380c2725c Pubkey = 03b31800412df4d56f1532c05828c0b72528a67a781bef4c06c1fb6ff2ce324b Msg = eb58fe86c4ef349c29ae6fb04f10850e38c6823dbe64a09a5bf1e0ce600d394efa6fb96ed6a8f2c9d4bec05e6a5ebd5a1bf4d0c51db934e57b79e5c6a879d975197dbb10475f65c7f8a8c6a77a420384b5062a2740f1401740ee0f5e043aad7a2a2b4260c5d907f705edaf65b0e375dfc7b00bd660db6147f2ebe870a0ee18dc2ba3c92b0b76fae2b90932cdb6c149e46f3feecf4c26f0441f3a9e006678aecff8ccaecaeda73a18a68ac988b62e83a9bb5188aede38df77a9a164abbdd9d58e52a6caf7222389f198e85fbf966236dcdbd4c1 Signature = 3f994b8ef528f6421c6a6a22e977ade5cee887263de38b719acd12d469bfd8c3f68e7ac07d2fae80a2092778df0b463537ad3a0551997a3d5b51f832d9c8230b Privkey = f89eed09dec551361fa46f375973d4fbfa5c5c12f1b5e5abf45cfa05ff31a340 Pubkey = 3e0efdca3919fa10d4a849cef1de428851bd08efd248594fd89cdeb9deee43b0 Msg = 4cf9773da05fd322fc147be900ef5cf256c88afdad4b08c230dfc8981fb69f476f7d45ef7c9006bc10032ba53436ac22843e0d76289cf68f9818fa64031d4b40955059aa69110915889f5e22732a1343912581ab3b11a3bae7a471359508596575f888160beef966e5708f0e3147eacfcec1caa3ef240c5e0a14c186546c8eeb64658350b1affc0cfd2ac213af670afca7bbc9dddd28a465b586e69c388cd73478d68efb322bdf86d9213011e711b2b95fefa7bb9b5939761706aa7121024906420bddf1d8800a4338d938fa137cf27e9ffc51c6 Signature = 897e6f2797c3f326d2cdb1d2673d360631f063304580ff5b4eb43d39ad6851834c9cf891d9f0905bf8de075f7635dfca601adc0f14e7b2c76f7571bfa468ed0c Privkey = 400796ef60c5cf4084dee1801c4a1975e482e70aef961cd42e2fd5a3fa1a0fbe Pubkey = f47da38128f2d012cc5797571d479c83e7d8a3409802f9a7d976c27067cbbe43 Msg = c473325e785b27df4471eefb9ebebd6461d570800181100ff36caf3c38f67c1921b157ec8e6126f955aebd90ea3fe5385f8042cd704b27cc1d6978c0e2a296695f5ef97b7c2e16ae4ff4d063c688d7f46e964e1f0a00503f357345977683d6e4c3423d56bdb6ce864b6987e085e83e70c7c1a14e0e413f592a72a71e017d505b64c24f1a1a6b813e064e6e0cf8bd4571d0ff2f267a6a13e0cd430463b6ca3b88f0cd40b0fb83d5bedf6f7d47e170e87d0a750093693eda232a6daf98125727b9588ecb894ae373bae3a445a106306469a4c2cd77ff Signature = 84d3aa3f361844396754d80d9fa05b8b2fa4abf3a0f36b639bee9cfb5c8530a3a9cc34677f92a913c41e800f2e8041f7666d07ed85f16a57d817b1241fc5ee04 Privkey = 6703a6232c5e2e65e0ab3b92e2aaf9f5fbd33fb46988047d6f4d0ff5387fa029 Pubkey = 047cffca8b7b11ac6eacc0eaa0c5b73c75b9c637956973af9d97b2dd5b605d6f Msg = a26b30a769197932a3a62854968d760151612366778dc994576a2e0e0355496b46200e506948a0d102b6651b2e7334ca6c6eaef8bca44b425970a0b37d6bde0da9d3c1b9f51cbb25bc335cd6fa928a74f2c0dc2c6e99d37a12863a474d4df43aad35415ffcaa24d8c29f914572ab2abec3892db49e679c5ea220c2f519a7d033ac1a2c5a467869e30eda3d2635ca863431473f958d552bdc5582352c290d0ce4fa9cfd0ad42799c227ec90b7c9e5db9f5a7b6d569212eed94d323326805f2b3a0010d6c11eb4107c8283037652f50dc067b6dc81f4db Signature = cae96879e5b603be866609d4a053bfa12a51378e99b2a2812e4789267d8f32f473243f8af74b9be73f47dea50f0d165ebf49458b73e53d88580c191a182d1904 Privkey = e0e72f8f178633626733bcbda2ad2a50e653890f15359b6c22fc7345ad333109 Pubkey = d13cee540d84b5667d516fe7ec7239bf8da91546ee791f84edd8ffcf3a083e76 Msg = 791fd613c1095292c8a4a2c86b47ae026155b8465b607dbb416477ef79a297c9d7758ce34af9dcbf1c68474f30909fbe74b7ba429632f2403aad832b486b72c23054ad42f7653a9ddb456cc791f348886a7ae5dcec7c0ba815f7a93a10fe331e903b970f7b5028be49d14bc5620d63792672b98b9488c67ae16646693e112047f0ac8921ff561c92dd0596d32df0a6e507ac1b07de516c98428d570a37db9bcd7c7e61c6948ab3fe91250dd1d5bd671275df9a972f22c2ba36804747aec1ea2416c1f41ab87befde31629b2d43317ce41cda03626286c0 Signature = 14552171b95245ac0f0e5a6e7a2f541721068db650c6dada04c28cab7c49195f6436712144cb31913c562e30c39d8a8549fb64ffea81c7445143b5f23286da05 Privkey = 544dafd9960d829756c6d4b3eadd44375fe78051876bf978a381b0decaaa8096 Pubkey = ae4f6425c1b67ccb77f9aacfea28eaef769c8cacee035205cdcd787e8d07629d Msg = 447fe7344cad1fae09d6a7d05f09d503c1b3d3d5dfa584810c35bc41e4955693706154e2d751b2f1b525e1a14547ba7f8b232088a6fc922702d93a11cd82949c27bed645dc351fb4c1242cf41d01575412e792aed214531d94fd66e03dd32e972fd77f6947a353e1ae5e00f5a6ca77992472f096b6e7475fe534e913a77bcb0d681fdfb3a7a0dcb56d274df4aa109d4a8a37794a9276f50006696ff12ca4d0254039df0fb3f72a960da05c9872f2e33ee81d1cf7a6f48bbce0aa18c7c0f06ba55e67689e0af587b500eab79cc7f9640bca104b7fbf31f08e Signature = a2ae117c8de4ca6d6fe75e466023bd550c26fedd3e74ca13adb625f272e175f14d5df550ace7d82288efefabf96311a123bee23889ad3711bff2b8087946bf0e Privkey = bfbcd867027a199978d53e359d70318fc78c7cc7bb5c7996ba797c8554f3f0f0 Pubkey = 7c5ae3bab9201199dfbe74b7d1ec157125bdbaa4520f501da3f248579dc6c22d Msg = 117fae13e78777b6219f020214c1b87c57046d1c09ce82ee2b5629898d9b0de74a15cfe99f80548ba913d7036c56285a4cba493b52d2cb70d6365ace3da12b1f34a2778af36ef52ab82ede04cacaf2793f5f89831e3b205a9ee4c1d6fbdab4ba4d9fae65dd79a5fe76b4b39a3092cc7148d211e85ee82ab463d34dcee9061d9c21ded2051bbd50b413f0e21a0e48d1ffa8dcae240b3495be25d93151b57aa271ab99aa708ca28080cab4804fcefa929f5f1ef3f4c6c0fbfb40bef7ea1b509b36ba1260323512379d7bc3fdbb5d3faac9b00e21f12ea1ca2e29 Signature = e48615b65633e61993b0aaa1fafb74b9629c384fd592bd735fa1f62c5cad11291fcd8c2e91a50bfe0b03b43502fff3a5c382b9c2821907efc34da5ba054af00e Privkey = df2df8a9d66d5638cdee09324e7b10f8ed29ab91387e3147b7dc03f7cd800508 Pubkey = 5c042e157fb7fb12d4d4fef2847141ecfb57c1253e14eaf3004d6513f52fe625 Msg = 21576615c9346a63dccf0c50ecbd7c6d72ad452cfed43ea73202cc7a98576056b9664b54622905a1e7221720730ac685d3bd3977ec3959d446bfa941e725b6fe16afe5432c4b4bdee7aa0fd8030948ed6fcba7c0bdb40c2e517da97456e74e1f93d5ed676de0f4a8b0aea449404bd15b6da79dc1b813965fe5572410d76f5b5eac663050570311dc9842b6fbf8806aec03151715cacf7f21802e8bf5e98a89c0d7d0d098b73c6efc09962e36b4e030c1a64b5d349f5f2042c74428671e4a2c7fea0caee2422d85c4fcddfed32213859a69955d4e3ebb7e1b2022 Signature = 9a1074531ed43d07bffc7f2b6c13b8838fc75cba02c7d1ec7ba38bca3cef20dc9badf3a3064a2c93b1842441420b6a8d421a960d70dfb7c70eec295f21f83f0a Privkey = e8ee065f9907f1efa2daecb23a0425f353094da02bc2c931f0a587efc0d13de1 Pubkey = c72651b7fb7ac0337a172977496fd7f2a72aea889385835e563c6b6053a32dc1 Msg = a2f0c1373473a305d8f1d99138b06b9a9694ffaa8a88222de9f729bee1305175dfb17001cc77f67b6d40c90c1a28fb226c11286db4a13e45e69211242bcdd01cb6e2c454e76c0cab881b4d2d9d3ab100a5d61d1725d866e4fdb66d93d77f5b308693b9b5a333e57fa25d1e5d2e38df6e4e9ec84159bbee1ffea926836a0101c91483bd5bc88a6f1cc4d4e7f008ad08453a0123429dd335781c7cbf8d685a8999ed1177607004a13c4cb5ea4908c542607d3f2cd6690cf1f2a7455bbd38f538f07a103964317efbcee37eb46931c027cf153ef86e43d78281ebd710 Signature = a510dff42d4559a19a7bf0fe0bea53d3e1f22dfa6be55039895e12a5d07da5f2e37713ccb2eb216011628f6983f871fee286e66fff4be7582c961a1ed7568404 Privkey = c72e67d8c3fec004ff618718a9099eb8ad7b06ff3b8c542a7e8b9847313475e1 Pubkey = 4eb002d3cceb188c6658fec51cb479a65264ac555c75cdc2249cf1ce3defc16d Msg = a8f34135c0132ec95b64b0cbf51d66900143370406791fbb55f2b8ca953cc74a46e08b002fa2da21b951b8871f7a29bc6d38790afc66a329c397d9f9250bae0e30ae3426e08d8ead0179a3b313c908839192f289a3f3b6e960b4c5cebef0a09daa9c7a15c19d4ebc6fc2ac3cd02232e832b234edd7965d687bfeb758f70fa7963841b7859bb97c971bd557bc8769524ac4c6eeb3579793334b522d176bc62f86b4d5c0d4017036d2b6bd4e4384416ef8263139691a8606170d73c93d6417dcc1a08a537c9ed4400471a46f52907b46b10a8b6889dbb4647a8bbc7149 Signature = 2d7bab8ebda7fca5bb3c25f51dc51b73e6ff6a3bb1b52acc7811a7d2595cd6fdaf730494418e2f57efdc5617b066fd7b6207680d94fb8c43d3d4740b41cb6901 Privkey = 696450b557ec3c94cf1af1326475634aa81def3814ff30a02ba7f2044b59c0fe Pubkey = 8584773c566b0eed3f43281705b575a434e47d6cf6b251b89803fef53534cb29 Msg = cc257829f30a5f90dfdbc247d42e388738b76c41ef8a82a5e0225ddf1e386d77080b3b9df86c54b85cdf2c32f367aba0c3b6bf888a5a6903529b6aeb4d5407a10180149114130228fc4356ccf366b77be89796a9e71a0c693f31e584a4f143097ba370363b67b2f2e2fd8d6fe8b4e8dbf0d7dcc1a8360041158aa2aff7e2a325b8e518f193a28bae05e3d52b26621af402026d7f250e86dcee301a58b631eadf4527e958f02a61587f0bb516cefac009fe51052fff53336dbd94e7266d3b43caba8a1b38e5d871c2a24a4c412fff3f7a9a52a8ab23bac9791b2b5a669a Signature = ce8b0a5779f4f5f401e84d65927a0c28df829e95d09bfa97111b8700078ff894cf7277e34a716144d55306fc9e2f64cd287583cc8003be0e8faf26af7640140e Privkey = a8dd35f054fb6ff6f0ab094a0d3d1c262832181df35ccd5192545ebd6a9cf529 Pubkey = ca412338d3814b886d964b71925e1aabb3ffd07834dbe7dc512568882b53e4a3 Msg = 55a7ad9132d63ac161e7adb132b9189fdd84c361c1e4f5419a6df73df4d7aeb29a8dc4bf01490d4f484e2d12077517f5fc7ad0bdeda20a6cb0227942290b08c3fe33ab9b2135bc38a6579a54bd982f7d1417ce867117aea918dbd3dd476e7eb5b5d3c3e48a864a2f942a31501aa2b29b53b80513c95d6a411844f0dedf16a29ac267d331e53bdc2539bfcf32dc9b5d640f1231e2cafb0ae94bb5189426863364262efb47b5b5ccdbbc93324216a799b6f50d3704f15ed59af6cc7d910cf062d1be632dca5df213d487d8564f2b2bd7d818bba27c364013d92d7f72625462 Signature = fa709fbc8382af83d11812618dfaca452eab83e4c53fe9e5858467d07b6767e17975c1e06393d6dde15a34d9473d1cf4d6d8c2d57394520080fac4e43448be07 Privkey = ae1d2c6b171be24c2e413d364dcda97fa476aaf9123d3366b0be03a142fe6e7d Pubkey = d437f57542c681dd543487408ec7a44bd42a5fd545ce2f4c8297d67bb0b3aa7b Msg = 9e6c2fc76e30f17cd8b498845da44f22d55bec150c6130b411c6339d14b39969ab1033be687569a991a06f70b2a8a6931a777b0e4be6723cd75e5aa7532813ef50b3d37271640fa2fb287c0355257641ea935c851c0b6ac68be72c88dfc5856fb53543fb377b0dbf64808afcc4274aa456855ad28f61267a419bc72166b9ca73cd3bb79bf7dd259baa75911440974b68e8ba95a78cbbe1cb6ad807a33a1cce2f406ff7bcbd058b44a311b38ab4d4e61416c4a74d883d6a6a794abd9cf1c039028bf1b20e3d4990aae86f32bf06cd8349a7a884cce0165e36a0640e987b9d51 Signature = 909008f3fcfff43988aee1314b15b1822caaa8dab120bd452af494e08335b44a94c313c4b145eadd5166eaac034e29b7e6ac7941d5961fc49d260e1c4820b00e Privkey = 0265a7944baccfebf417b87ae1e6df2ff2a544ffb58225a08e092be03f026097 Pubkey = 63d327615ea0139be0740b618aff1acfa818d4b0c2cfeaf0da93cdd5245fb5a9 Msg = 874ed712a2c41c26a2d9527c55233fde0a4ffb86af8e8a1dd0a820502c5a26932bf87ee0de72a8874ef2eebf83384d443f7a5f46a1233b4fb514a2469981824894f325bf86aa0fe1217153d40f3556c43a8ea9269444e149fb70e9415ae0766c565d93d1d6368f9a23a0ad76f9a09dbf79634aa97178677734d04ef1a5b3f87ce1ee9fc5a9ac4e7a72c9d7d31ec89e28a845d2e1103c15d6410ce3c723b0cc2209f698aa9fa288bbbecfd9e5f89cdcb09d3c215feb47a58b71ea70e2abead67f1b08ea6f561fb93ef05232eedabfc1c7702ab039bc465cf57e207f1093fc8208 Signature = b6c445b7eddca5935c61708d44ea5906bd19cc54224eae3c8e46ce99f5cbbd341f26623938f5fe04070b1b02e71fbb7c78a90c0dda66cb143fab02e6a0bae306 Privkey = 6bce4dfd53bfa5506f2f554d2d994a0dc40cafcdec7e1be050006e5c5a4b38a1 Pubkey = c890023728d8397070291771e65e034d34d4aae5e247653e4ff4c074591da702 Msg = 3239190747ee33d40bf870ac9ad49d88ee320f63c05257e8ab2c60306597ce76d1f1e792ab6a65caa544fbec20892fd4960594f31b3763ef07d4982eae4a2dbf3377dcc1e3f95e46ed39b7f0222f04bb5c3b434c8f9f310de9f122a29f8241e81e206549ae628d2b8ad768972c98847c1188ad04c835356378bef79cd126869405b129fdbdc3bc489cbd1399505dadef7617b5be5da173d3e80e5838c99e349276242729e0219bd7476ae5c4f81a12878fb483a6c0e9b0df2962eb0bf00157782cf768a1b71c010169ee8522def0024ad7e45775a290639c53aaf48198c42de75c Signature = 99ae6782ff27646c27f61e23636ae1881521cfa5ed256f70bce7ce00b68280ce8e0c82aa765afb8b5a1ff2fe42c57441e458e443dc8b123477ae33d884888c0b Privkey = 17861a8d4154acd4fa9c8fc947c1886c11290be222872ff4f8cd25939e4d1361 Pubkey = 43773f4449065eaebaf8937baf758560b0c4d2de46977839b3b873d5d7d5fd8f Msg = 184df5ea3215ebe180390b0ff042ba2381155a038dc732f76a01c7e70f82d1ccc9de9a0596b3fee447209c992684f643df21f4cf9d179262790e8623e42472dc351997e6da189c07e1e8882c07f86c6337ec0113912cf92215c8de1982b8fc57bfabc55a3e8736f73610429d97feb51d794f505d0c5a0b3abd48ef7f55a628f90b8567a1c15ea9d190d7bf4ec2bc9334ada6cb92808dfc2064836fcfa46b96fd7a5d6f4b054dab09b73595feb89ed005b9ec9d3188121de69696d64e7c7bbdfc1c469faf148c38a7785970afe1acd06a92c99478fe44974e3bb2095e4467e9b2e996 Signature = a5ee024ccdbdd4c21a24709ec53dccb7ee17626dd00a093d0884f5b45c4c9d1691840151c33c8aa07b69b34e16f61647ebe793ae4daa70cff48e6ab42ffdbc00 Privkey = 0a84baa54f11cf17090fec61f3f9401508a3a03887aca1a7939394b1ee40a925 Pubkey = 309a73c62d23d740f2e93c18587ac15e7ec480d25ac0794e10f8cd461cc2b130 Msg = fe70017b14678b0d3ad03e183d6f53314378379ab3da65b3511257b3d54086e86f2031139021391af9d72085ff7c3dc8c1e2d91e53333855423d0f785e2cc5f8b7799fcf1b70e6becb788e53e9020f2995ddb0c383a1f81038fc3d543ce0a38c9c288a9bc4077f4277dcc6c5642263fcfe19688005a603f57675d2434f3ed1f46d32f14eaeb073e83ee7086da2fb67659d3fb68c62320b7727b3b8ea006576bc2c7e6b5f1ecefa8b92e70c92c88951d0c12d91de801c38b7ca5a0a04b4c3429aba86386e96e06afd20d4c5c2fe2b9b4273eb05201a79273abdbeb37ed1830d226b6bdb Signature = 4d870bd53af8f13f214d9934ec903ac48284092cd9b162a44ccec851fa942de715ccda07b7991d712723e7a4d5b4f0374ab85ac3867e0b53ebc46b530f9fed05 Privkey = 38379423dafdbf25e19d7231bddd80b4cefcfe2aed932584dfa0cc3c9f9232de Pubkey = 597e81dcee9448b77de6829e7921c8a390535d89a0849430aed66364ee140d8b Msg = 36125ca66668802906237e63a2fe5ae610f11a7cf92520d19e6690a3adfafd5d07a784bc1a0e185273d11d340d5eff901597dedf450c4699d43f3fb168d557f6c9c03077c3cdc370d34832ccdf2a8e3d75796490ed0242899d25ddf44bfc66f329cf4c45168703c31bc9202d890f3969ffd3ac35a12818dca751ceb8808fe81efa26a5e0d200c5ec1d94a5097ea74b6498fe288f30c48d727e9d3d35c8e12d85420702556f2861484ffd09b4f12265cc9abafeb82cf590028895a7d050ff57ccf5f28022d016ab4094b062e48b66fd36d1e19626e5215efa40fb7e3b7062f81e954830c9 Signature = d8b50a88aed6f2a96d082213adf8b2519f6a0bbd30dd3cb0f3fd3ce1c643fc029946cd43462ed22513f1d65fca24bde3818166baa86daa798792afafe0c1a10a Privkey = f925d274aaf1fe1a21656237385e97f7783e78090c5d4217fece7057c80f426d Pubkey = 3b0fc370be3a4b19a88ab998c59504ffb59a87606338e673df5b3fab4d9bfb8d Msg = 143caafa5f62b13e43dffa49d420fa99f771b1926d40d6cb2bbb427f27b6c266eb3deb2d8bbbd47b8214ad40251cb1907ad65eb94193e54ad85c6700b4189e80f1cc0154c63ed151a8bbbd30e01637ca58e70aa3ee52ef75d0873078a405014f786eb2d77b7f4422f927823e475e05b24245f9068a67f14f4f3cfb1eb30bfede7b3262230ced9e31361db19636b2c12fdf1b9c14510acd5bc18c0ddf7635e003503e6f71e1c365cdfb4c65ee75b4de0694af87076374d631e6c4b8e240fa51dab5e1f80ca2a06c49f42ea09e0475defb184d9cde9f58f959e64092aac8f2027e468126f2fb Signature = 79549a317d10a0be322a94a151ad11e77efc4836cc8006a85081273d7602a638963a9caf19c3edf1e25fad1e9d68701a71dea727da6a5c5bcac9339589224b05 Privkey = 971f806be6f07d41be8830ff8dae704b08638ad6cff722d8432538127b769625 Pubkey = af6ac98dce2078a6c73f6097bab63f205caf6953afa284d042bd50a4fce96cb4 Msg = 013455d049aa54ed995fbd94e6369955495395e4438822259b1060e9a34779042a1a69211f6ea2077399dd234806ba0b353cd79a57e1c49b250ab27106dcde576ecfa115eae461febb12d2da25ffcf17b715f8d95c2f0c425d5a81f700115b70d49e1cfe49fcaa14fa205e28ec85247f1a6e7128bf3bb3060dc08464bda6538540d0ac472093e5a0720fde2f3dc4788e0e9b0dbfe2a2b5f1a0f3f80de984025b15c65af77f671e1c5e2840444de5c7eda025e6dc1a3ff16e26cc54cdeed56be73f9b01ab2b1bc16c8ef58a5b76dd47287807e5c50f0d7c0a5b8120dfde645a012c5cf11491bc Signature = 2037a0a7674b84ff27d0b22f62b4bac65e2dc0f5fdc899feb7800f25c29981dee641c5a50f8b9410970b49d2d53658c89ee16961dccf5391a6918f2a84eada0b Privkey = 2bb0652f8fff6901991148c68a3267877271006ae9589149bb206850cdf52fb0 Pubkey = c03b77be983e74a234c1986496b292e139992eb7529e70b3afad7ae4fdcf8a66 Msg = b923ca67e396d8656fa3dbce8289a38bd3c128cefb30efc1862bb944b4507805419824ce2b83d690ef4cf107492817143bf64c024989af1a7d2e1f5ac97874f86bb0d3773ff840f514d9a1394a3959b011d3a6b816a3fae5de17b2a9ff349863d27fbbb50cca734108751000d6358ca0647a93eb49e2e7af06287d48f2c09d5c1c73e4d8f77ea2bcaa7356795b26728719bed5ffdb821578bd5d66bf92edaf8b238b2bbd7d1e2c30a787f901a33d0a76669a9c3c7f2b552ccb8349c7ded5e1a46170cf28e359e2fdd54b05a562f528c68a56974df82d466637c8e53246a7217e4386801e0e3266 Signature = 4e158deaaec3d88941296af2d27341012b0241d4e0f46e435e375c9875e89f5e32c057b527bc3411af096a77bfceb45b983efe455e3f03155d6bc7b0acc8e60c Privkey = db9b812cb3c7c03b977f487d3d65ccd9cd2f3dee11602067dbfb72b589ff3f79 Pubkey = ffa038ad8c3b378ce75d65844d08e3d6a92d194a1b7862e9d9720d20679b2944 Msg = a70092c7697cd4a209567c38ba7fb71aa8f15e5827a20876923943fd6adc659c9867ac6f58a61dc7cec3d362411682000c1a9ad1295eb8b70f242d86b5865eb76b87e3f2c6941d2612ee3bcde8f19765566733152ef54e95690943285f78b375f4036585d4739deedeef6d946db61ca458ef4f650da963c385e29dfdee415fe495845f55197a870f8cdeb5a010ba6bbb32bf1a588cc774d4890184c4b2924a5b8073313bce226585f1adfc229c90bc6cc9d212e62f05d33bedac961d77cf8c2620e451de817f8c1bb16a2c59ff804b635a73a8cf8c181b3f9401c3b643d18a2f706ea9cae47071a6 Signature = a628a77421b2abab576eed35d2ee3d14561b21fa14a6e2fac263c3eadd79f2fc0669f9429b910b8422b4b29ac026a42e98d181be3507c5ed7c748a1fdcf1d807 Privkey = ce379bbe2fa8abcba51c7a7543de5b7180771b3c44bc6b41892e7b88979bab90 Pubkey = 7f3cff89f41babf4fa64cba33a5bb17f413bbf2a1e112b50a8e9b1f821d849bf Msg = 001a74f095c814d3beed67a8d15fc18efe235dc3f6457812a4039b7a46fe9a0e9de81a7a4e5fbab5ebe9e1e4801bd11b45c9f7ad0636a09bff42164be5749a04c02f0ab61f0ecfdfef799b827da6a274c8d3b39f2e3805a6791287eedb2314d3f842b558b9b489afe1ed37bbbcfc5e60a431d5ac60b39e946d903d6bf6b140e12c7e07f9ed7ac46a3999c6245c8ab1bdb21879a317a3dcd257a5c4f349b7f59e4e43d62d9f1cd16f518f1ca6cad37e2cb20f2598c4134291c6b8a98aae5247e26eefb76aa38c9c8231c17e9dbf271cec80fba5b4a834bd9be81ea841637aa9cdd4c4bf26d7ad24ca3c Signature = da98dfb189385b2c853b6cf375738046a8f27ef27974abcecea1db02989b951fe433a6ce1e225b3fa82032fe060a7d3f6c183fd1157f791a064b407650571600 Privkey = 2b2ee809d647023e7b77fc541f44875a35fa941d37f7c5b21fd34934d2391935 Pubkey = 2c29d53e1bf2c7879d73d20ba88ca07a0b216d7f6d05d93663a65c3d9e10633a Msg = c4147d64ebfda41a1be5977262958104e940c3876bcd5b6956acfdec32c660914d62623c210663cb2cbe6249d7f5274991c60e950e8e2809049953c69581d2469f4fe982c7434fedd9d4e00ae08896d62cc1fb984dd233150cc2483e159cff4097df8c036bb633003abbfbe18c8fa79b5a22270838123fc9be39b8892c80384a385028c1a81ec58c8f21060e78afd2c04bfd2d30ca3977c6edad518cc1e2004cdc14bf3d15f5f528e5af277fa182275870e5c012f5f82fb1afd04edde4578ddd2160a1a3dbc050e80bdd811bc88ead79bf93f010cd0fd4433d0bc348dacfd0947cceda62bfa49711d013 Signature = 12d90685775572c9eabc9be2574ca9ae66f0e652e578b21736cd6e654f7c6b1545883d56bf760ccfc3cf87544e0004c798061257e130030cb997a788369a9a05 Privkey = 4ea18d6b4af8053b885ec188be48deb86ffb2a69a4cec86637bbd7b41b807c46 Pubkey = e5986059976233ed77382c3d9959f34e317962696553e86ed1e5902c4bedd167 Msg = e9c89a1a1119373206ce40ede3b89a82f89462a1dee9e789e9845eec21f571c0faefd430ad338e4a72c047a39a4259580387fb9aacaddc36a2b51e7b60a87ca1321ff806794cd6dd4549a4df45c2dae3e539c4d7d06b6e6e9f466ffca2fa4978ce3dc792e44a6283880cd138a75a226f985da41ffdc0e32a5a85c85fe9a43ae78fcfe57f4dd7540a6dd3924a49ab39eb69950d421151d96b1e4fd3935890f634cd52a73a755f5c2fb72f9cd5a2e67ea930915e133b47cf6b7c10a9d889c6af6b5f1f4f51094d27fbba228ac2268b344027fd49e426343cc0134399b4b510aaea50234df42c37fa1c4f4d0e Signature = 27570c002a487d000ca3928b83cb4319722c46dfb4cca260de790ec0e3c1932688f87362952818b54f51bc7aeeb263f960bc0da8964bf312ef93e81f06c80b04 Privkey = fc1b75d17d3807217351d2aa40d9b04f525b89ed3f5fcdb311bec2aec5cb7ece Pubkey = 55e484e774a4392a9d6eeff835a8fbb232cf6276a89c74fc0d1bb2045a8b21be Msg = d031bd11da308097e3beb6ffdb2600ee6a193ca6d8324501c972b1a25166fa7a369f5bc882ea45612cf02580254d21b40b0363237e835dae2656c1b7f4736e88be53d6b119c07f5729bbd82f67de03588322879243c5990a7e61f56907b24171a57cbb0bbefba2316277af9326f9cbf3538bcbf6780be41825a2ca774b41bdb1cd5c608851ec2339eb2f4feeddaa891a6326b29d97d7fbf311e3bb749c5d4c058dcc14f452f9334991e271c16d6508c818633927f429804ca7a38170f1b9f6bd73ed675e11e8c0d321fac912730b4ba2f7c428534adcaa4dad314c55807e6c642d494c6b2f0e8cd129775cc0 Signature = 9a68d151fea3909893359e60b96b68b2a3e2946f2b47b875398a1e39eb01463d35eae7d976f833a762b51f2726ee0dccad5ce3600564fd9dd58c23807fdffd05 Privkey = 0d0bf4d42ef810b179eb841771de6dbde76361caf894e42a14b1e09787ea3e06 Pubkey = 7171510b43fc17efa80b15e320b1b0a408332542e0d36e4ab9a649cd941b5aed Msg = 8e2179975d0a8e5a69fe875a3cb1e79aec49c3853e30dd0320fe3ebfb638b82f89ad1643036b37e56e0b55e0a9e22a4e283d7a27485ce9102db6787d6628b77913e10896774e495c26e8bab26e7f9a94d29aaa36aec9c26ad3f50e5d8c0b7698bb5f01b876d0d65fcf5e9e32cd7b89829ed05b0b8f63a93858985bc9569fce429fd37a211abed650f585c3b55900443b6c5d6e8a48ba67deeed07b76e969fc88430fce2709c0bb5ce926ab7f44e0cd79f4ec359ef76748883fcc3d026edd06c8b9cba54b990d30aa41f1448a10893fb0539280c599d42361433a34cdafd8ebdd92efb9c38a36daf4c74060c696 Signature = 24446bdf03416a4d08614466fb851db50e91a623cacd1b0b35660f3cf933200e15308708da3499a5ad25f0f0306b7942762e20a765b7ca9b901c750b3a95320a Privkey = 57b5194d26abe4ab2116c0f03d23dbe116d48825a25e77d64648b43692ae25bf Pubkey = 499c02dbad2a4eab3b6ff1aba3944b91c3f273a382c548a6f3a19c83f0a86724 Msg = b4813c9d13215fe9f63a78ff7ac95173eb810b4613f0f48d6876b2bd3b2c72bc7d98cb1ac32bc41ca47f09896f79204ecfb8264ce8f3c3e76dc124da8ddc6e0dfc1e13b5a529f20c82613fb9a82e5f5d77326a861faedabc7325c59af33dae6744025e649774fc4f79134bf9f6e3d5875dd91bc8a14cc36a66283d01d8d108c13327eca53057ba50bf210c19f139de6494982646198a1246c271b0a368c10aab95cd8961235d742df4545be68bd010dc0db23b673e623609e420ee76b1056c520f9ce8fbe8ee1863df97d17b7174636c3a2b612295091948810d1d4b8a5843760a2887dc55ef512af041ec54fad3 Signature = 4c7345960c8fd48a7dead71dbd61908468efa865a135568c8f9ca0055483468617a7e335840f57c6cd8f2c9805cd47a9d7cdfde53da8ef4f1adbb6f698aaf100 Privkey = 068d27b21e2acfcc19c3e9673dd44142d98aacae894930e20ca067439e749a79 Pubkey = e22ddd396f955bb90e284776aa76e921e50699d0ca8914a9b7b841eb5ff47d6d Msg = 1c6815423d1a2c5ebe8828d1646527c17b2006e547f016b5350f010d79b13df4fb8c6ed57ba9c26c3cb0e0a64178b650a3ea5444a4fad5b20a3eb8caa702634011cf7892a0727b6e8150b0770429a37a8a0bb3a7edb891a7c90240bc0360b14e6dd770a990b31b31f33ddbf653988f82742e5eec31b27368eb0e4f1ecf4d676f49214a520d1e5b2bbb59ac2e13267e07a0cbacbed9f94d7473ed697828b0928fcc616ee02e51fcd8db4d8f7533b7b139a05e06f9e0eae32993e3025aef0590b3fbb4292a3ac40765e8584ead00266acdcbdde1457a03b7d57bd5c9e64fb06b64a50f35f0a1ec34b6ddbde767b96ffd Signature = 0c173c488ad001cbb9c43d7b30a7c071a2fdb08cf7f37daf71d7ae7128dc0d43f0f095b2929c54b773ed4a1f0bf0dc4f364f0601e8d5ae062f5b78c05bfbc702 Privkey = a34d52563159e0723e9f3fd133bd96e20adae623f8c798013bc36b441489bdc2 Pubkey = 1fb658e645de6d3efdb083a73fbd592fcd4b800e03c7bd681aeae6576bfbbe2f Msg = 1d215f85c089f35f307a746c66c7c1e41d6ba37730d759e6e5622d6c6a198e40f63d37873b715df7518b3c6bb5e95a467726b97c9a0f8f5dfcdbfd1e0de357661ddeab555042b945fd899fad6d382d7917da9e12dfbda0d69900b3975165a73d0ac9de01fd3048b8fe5f0b90be67e03dc22f653a0a13eb4b0b753f3f3bbf787369ebd8bf5e00eb78bf0b3515a91e68b1d5fc6920bf4f4259f8a730efc7f1016d501ef6fb7cb8366fc8e716cfa50ea8b203cca1a316707e0b0fc57eafce82d62f7ff3ae04ac8fd041b55b19a352a69e6d4b79d0e650175168e34fa3358eac816cecf2c8dd1bf2a589113e91bb818f91f8 Signature = 5fab5a7140d47873684305aa6353d3862f5fc13e54a40c9563cceac8f74008c6c445631fa864e0f1c345b5954f80056aeba25662b78827b5e8e3a9437813720f Privkey = 58dfe768bf52118494b29975154cf452bd9746dc7de1d6bcd18ee6a05acfd858 Pubkey = 0f1476c6cc2a1b4764af75805e77341f14a0d8b09c6a5b2ea287fd517c3fa6b9 Msg = 609794201c4f6faf488790d61dbff3f41b328c5b0695cbe9aa8a136d72b4977b21b500f216e9f32168ada8c13bff25327647e30d8a244d74d88303abc90b7f71aa07ca04d17bc8a0167d6e63fb88baa1dab81d50f1e91f46f5af77f2e8408b826336a35052efffdf4af79596af1bb2259f83c1bc109cfdc3dd50fd96d310f27ea4c6c7690f21815ea92bd79389680cfe3ed40c80181190688d24222d9a1ed52ce6a16b41dbd9107eb6d2e3594e4494d75dd7c089e3b26ffd00d1003c92c4c39ae5382ef9291491a880ca4ec3ac2b86e66719b92b6f7cea2cb0bbb1cf624d0d1abeae556e5f73909dd546277037ec972fd4 Signature = 977137a38af44f4b262abff7e07282433c58926d562fbc6180bde6cd9497861fb6d955cf383d999fa1037b8b1754ce888c9ffc1560a451d0e9db8d74d2940604 Privkey = 5a63ef9bd7dbf0e89fef155983659e8a0a6ca002bc42fad5a45af8e0281923f4 Pubkey = e632f4dc994231cc1790c21afadaa977a589b0eb0da19fcb2792911b15ecf8af Msg = 796bc8361c6e8eec39838b24f53971e820f82361e0510eb4def1db2512387d6bf35bbdfa318879209435d6887b1410b3ebc1455f91f985e0fab1ce1c505c455576bca03539d048ad3a0ed1f11c73bac6809e2ea147975bee27c65261aca117df0fae7008e2c3c130bec5533ab89351c2140c9d1a62bdf688629787f954e1c610cbb75edb86209d7c357cd06ef41931dd5dfd1c7d407fa4ee1ef29393beab5713173802cce2d56229cfa76b601662c4d9a84a4936c52abb1981378b717eb55cb604a68d34f03b219f32226ca0e669348a2d8d2453930eb6e9c2bf66fa4e92c75136e148cdb034130d3f646382e1c71579ac70 Signature = 75461f99650c0368058113a15ba16bd2337b2e633da38112878c4834fac9ba2e307c866c02af79bea33659614cbb4465c57ec3effd4c478ae38a34a05cf1ed07 Privkey = 8b2f06141e401163f90f674b04dc90dcb6dd3386419339662ecb0dffadf2500b Pubkey = 54da934a659119198553fd4566b660d8d610adc3290cb84829c894148cf3f67e Msg = 1deb25d43458690323a7d26a26695090993474f467c6fde5ddb34da945be3cea2f6b75652ae21cbc4fd22763a1b45583e1c3e88bbb5fea2049b7336c91159988c01526824ca3bef16b362b9202b8b9754185bd61bea8f539aadf4a1ab135fbc31d2a8e33178073106cbbc02d4cd0d3c8feaa8eb733084356251795afbd78ac3c4f8a3ba19aed755c646f35569c7a6c675b6d6918e834969aca03f71a2e72ccb17003bb75b62e852aaf58b3baea89bcd64a32eb14a6b9e10de48971e53d0e9ac99a78f42de0382ef0e80ed3cfa343f35e4a9983b9aeed986d3a57f47e5e46d40e9d677302809a2d37e4ec011f051b4d031ed600 Signature = d68e3750dc56432397401c98ff1529db9ed48fea246dd4ed383ec74c1a463aeb784c87b1fda8bbce970fc97aa9807ddbe95d41fb022ea68c1e311654fa1da207 Privkey = dc649fbb1bee0a44814d6d9e9080d5d90c1fc173ab5fefed826a74723a774e0a Pubkey = 0214c89f3867ad2e8870e50f8c2a6254986d9c220e3338411300cd9c6404d4b1 Msg = 328700a8ae581c1edc4e2c00c78bf4606097f9bd75aade205a243c5fd7434d6222da937e2881a2e3c574356d4d5679301da99e11cf749c27921c8caa2ab2a564d87c5df8ecf1a72b680184824f6986022e3fc98bd2a21c3455abf1154954fb30c89882947b02f35af7b1bfad05237d242e2b74832fc536196f2e59d1acd0c1db6f1943d0f6043bbd6a769083ed66ba0e05a50feb0acf72b6c16ba9af039afb7fe2a4aaeb4d06181c5a1878689e67a3f5d0ad39e794d6239a7e0a12ce820c5be60fd5f1dd79702f49d02b79755fe873f5785c72f74625cd7e2428262597d31482c2c0508801fd96319d61b91ba253a5e722f414cf Signature = 0e0c5e4e184375da4ef7e2a2e4888050cd84e2fe21d08e84a852db2be3fbc372c472de0954dcd1dc11aec493c569f40fc6f77f03ee524fb06ec40faa1d6cc10f Privkey = 39b8062da43e64e1676765d62c7fb8e0a99c4fd417d6f7e3319bb13044205f3b Pubkey = 6227cefe88ea4fb27b37b5f797778bd72fdafeadccd9aeb67ad437ce08fba6a8 Msg = 740af679e3069fad059fa4825fa41c59fbd484aa649303c27c4f7a94711c5b713b2a6b8987859e2271a6a71eb0b4a15abde4f5168f6cb9dbdc6a27a2a13d52c9720896a1f4ce3a5345ee793b6cc3ad80d7d58163d5455b9cbd073e2b7adbff95590c7172271bd91fefdbd01657ee1750651036cdc3560b444ca2184bf4f3ea89fc973aab6fb4a8ee5704bbe5a71c99fa3b5ef0d0396249758297699ae202b819690dc7ac4692770346907845e2210d5363adeec03f0fc7761b7e0ec0fea1bcf6b04fc54b3e4c40d19b8fa649ac8479e8f80730c0c94e9f4a1ad506f2bcab0c49540f6decaa77b3d657dc38a02b28a977ece482545a Signature = c5f626490c0ef4e1efc3edeb0cbc3f7de267057fb7b6eb8f0c813584965bc5c421feedf54241cae001ec6d5e25c9b1fba0385e5dbd95a06ec1d8ae519144960d Privkey = 52f4675d8ccd0eb909df0a516648db26fa033ba41d43fc3845896d456e14265f Pubkey = f39e7dafc97b0a84dcbf7fa14a9403ee1fa92b85e5a7e5d05f031b44ddf1f794 Msg = 74427110857cb4af0a3342c2b52997bce1a0db6405c74e9651c5b85979acb071e567fe70412c4e0d8c9fa421914f6a62f2ae420b7b2f4cf80c90574221222288b65867eaa66e7e0a0557a26c549f9a7a4e70838ba4074b4cd7a9d758b378b88dd49441df802a444dcbc30624933b59922f33c20f019fe78ee24b8fba79a682f388505ac9c97f4eb87c611880026b4c23306b865173f5d716abc6cd9a9906db3430136f754129c443b20c42be2fbcbcd44034d714f58a4ba8e756607a02b608ef49648f2ad0cea99e7ab30a8dd7814004f725f49301d7b304dcda625c296d928cb581736ab739c86b469241a8259351fd37b4780a9993 Signature = 4bf668827a720af68898a06ea7b44545a34ca896ecf311feea47e0686d911fadaa03118997153c65361fea15de9bb891b8909872045508ffad0cd9eab21a9702 Privkey = bad73c9fda4ceb9da6c701c2a6e2efc0467afa0a74f8750c52cf1fd4c8e7489a Pubkey = bb0f027a9035376e1aa3206c3d774475e351f5767ef86ef48a72c037c24cce62 Msg = 74b966cb780771aee63d734df3756702d1d5fdeddf32136c6358b836318a4f984fe71e7716adddbd649eba44cd4282e0055d8c1ed2d35123d66e5a98f1c0838ded563b9a20eb8007538fc7b0713e7e485e3c28f6ebc421a29dce2524db7f29205761036ada62e5b0b7d5b7f294ff17f338232fa5fd42b6f7253304092d848f50735248595da0f7ef28e568e9916bfc56d7ed0d811b59d5d891ae43e1b198071306bf525c678c6343998005fbb7869d1c40f8cac807fe2ef03f3d5b933f58978ef2906fccf7444a2936e63d928c690926c9c994ed3d666263e956fdfea27764bc5f74125bc46bc102dd3e5ff93b5e123e4b38bdef697e15 Signature = 197d6b6cc88a98c06dfca0c01225edfe38a0b2289f29f8a44ec0816a952d585e2d59b5b08de100c0606296ccf5e92a99e093623144b8b22db87d929225546005 Privkey = 707327a431dba77639b3966b2bc095f8eedf57f7a200e3b0077ce420389c92fe Pubkey = ee2496910864189fdaa3c7757eb3cda9ab1e70fc9e7f71a38a0bfc845931c95a Msg = 32ef31b64eee700fca2ab21a267f8d9d3bdc689c7538fe959bf713fa995db2c0ad36dde430a8417d437b72c74e26dbe31d93701d4617fe51825cff7a544fc9f44e4345e14b4b11e15f26ffc2af8035f3f970e4dda44c0ebc0363c2b56fde218663bf78839092538fc2f39153d4eb29da0c1a08aa966601cc68ca96e993b01b173a261b2ef327650382f568fe944855b0f4fd9d15e752ac74dcfd37b3786fffcef23339c21e9270dce8891dd5eeeba9608fdc7b6fbcc99fa1b5903daa0968e1b691d19d06f215ded047ef9d76610f5de220f5041b313faf9e96c9fd7db54b5225726af435f9cbd9fd87ab40ce8f2c6940b55f0faae87850ca Signature = fb99029feca387a5d765961e361d7172b98b7e0f11290bb1e5b57b51bc2123d0bce29020392a4fec9ae6a72c4c386cea1857cb8f9c50aa9a76d7f1687fcf2900 Privkey = 6aa5c9f008f990473ba4a6286a416614026661f11e1a24efa81ac35852d1d070 Pubkey = 605ac9b4dbdd5033d6c828bfafa93c0039440aa11ca724ae834043e07bd032d5 Msg = b5165d3963f6e6f9ea5657e9f07ff3a321eb338f9a8c3d3c42306b2b278978b31c623a631be3b04c41edfdeddf538e1b765bc8785401c1af29d0467a64411c497395d755dca03ae3272f4bc1fb1918dcc1ed6f04d6498404a8ce1409d447f570a4359522cc54629202ebe507ab693843141bd5ea0573b20f321a483ff383a46897f5926fe0b8afc25572707b63eeed283532928a4144196497942c572ac547605139256b0aa0eaf04db1a256012ed453b173ee19ad6e9b1af3f45ff3044a641f8c8eb0ac7bb45abbded47286b2a069d3908694ee06f2fbd0ef605a7911026ea9ea3c4913f38c04d8b69565a7027867ab3092d05f4cfb18fc7c Signature = 9756303b90655e935251032ab19cfc95ca1c2a2c3ea28b033bd47066cbd4c7d8982a8b9886f1b9cd02e88a65564da8dcc34f308ba9f10144ba469c2efa49e004 Privkey = 8efb8b79742be21e6d31de678bc81450ba8621082cd6f0003e22861e2291c481 Pubkey = 33381e356c4fd386a3f7b969afd9f5c00d2067b698b3f1f00f3784202d3084cf Msg = 6b750325d3a0f08a147700b51a9b3725571094818ed69d1f761013eb86f323f73c49f5e439877c2783b336d1f1a674ef3e431fc1ae0180082df5fca69f848139fe6ab6739a0592ebd6d4705c7f0136b22189a11d60d4d3c9bc80fe7d7c00952d5742f9c0c2121fe792df133f221db991fc960ee64b9d32e0178e542bce8efa8d03ac8026cd77ba8bf0b24215b9faed2eaec920e925d5ec46fff6bde725e91c8280e4ada232a5433ae9680ebb53eb55553147c93370574854896154514299c093219a111dca4e637ad5001338c6d4d5ee9098c65832f7af835bcb622128423036c79a5737738a7539f8d4a6b8b221b56d1401aeb74d4571bc009d Signature = 923005cb4848402aa8f9d5da74030b009444924c214ad600ddbab4c153a6ff022b53cf6364cd7ee99bef34fe144da964edfc38a0ba633312650ebf0e55a06009 Privkey = ed046d688b2b0a1bc3daf2119dd321a607b16d2a2d1d963add1209c665b5ccba Pubkey = 8734f1ffcbd71cfde290017ea6253e580d59e65b541b46521f5e5ec1451eaec6 Msg = b9cc90fd8de2a141f95116db3b04be83e98522597ec2174964245180b9a473767d6d470a217db5ff5a1ab777e1e28a0b16975e2bacb873020444b47ed8326421b90ebb503688f090c11b3b13617c5c5052c297a41e2893775e34d59ada49d994c0e4a9f5220e9f0315a67705a3ec08af0dc724b5cf67ff34fada8ba7109ed2b5a8907bb403fb1a838b4b059f18c792d7bfec05dee0c9cbbf1753409d7db3aceaf47b4c61398497b0eca6c1f8ac08a7ea1eb9c40bc4e92e888212f7d9ee14fdb73158160944ff9bcdfef1a7469cc70f9474e5f24dfffea585f09eaaab4be2afebbe8e6cf86d35680dc5d1b92913e848256ec736316fd0a2142063b0 Signature = 721bfd4776cfba13330fd37269e979c1d7b6ce54a51b82f456e137378e582f192a12089da5aba76a7b161813dce56b72892a35330c94f7ff21d09cf09e553504 Privkey = 76ac8e570a39b3a0232c45497537fb2155acec3617865ed1df210f00b49d1b8d Pubkey = 312a3ad899ae6a25507ae6e4524e10b63a6e7ae53d9cffd39cf28521d93533d6 Msg = 53ced9db2b479e59d3ed643f7cc3784c24b8bd4c63206c72e23fa850028899a41ce1a8bdc003f12b7c29972c9a08bcd231fe0e1a0fef0bafbfa4e0e027d72004075ba37d490eb9964e783bb98f9e503e9c1fd3d23fb0017cc7c7a9f86d171f041e2355d8c5e6229d34c7eeacb6358cf3060d5d265bae2004a558878659a30dfed5f2ec788b4e14397b5d00c29db5d4ebf16639a8df292a3d24f6983cbca760d903e976f5b698642ba1fed49e79c38f4bb3946efccc9d6aefad336d558f78e4f205422e10384a4e531e75807efb389d2af4cab43825fb87f196a9080769fe7585782970a6918affe10d20d629b705845597418d699de3f1de854f94bd Signature = cf03f525913c44303b2f80079393c21c1158146ecf99636f5d97adfdd9f35839804c23804cbf1e553cfd4b73f689a9143aec298f8276e1e4ee0891f1ba75de04 Privkey = f64a66ba0f0819f3001416c220bf52d860130a19764aa8ab38d15b2aa75ac022 Pubkey = 8125253cd337e00d45b45079b585349561e5f542a81f6d2fcfd985c10feab2af Msg = 8072862ed0ab35921db5ec2cba8e6aedb0441fdf47491006c01e6456ad70fae3c4152dcfbfdbb8f0fddec5e96b12bf67989ba96793f4861a11b63909ce8d19b8ca64a544b31ce051fbc88e062806d9965cbd2967b01614e86b532fbf59843218dc9c19c80315f044731719371092a3da38878bc4cf77de972e860466b8fc45e465dc3d0ebf94bdea60ef0b9891ced41b997b11b31ee4167db60c9cfc8b85beacfe223cc1829213774085d7c06d2b2e632cc21cd9660df47c4fa918bdd596ddf622dcb652642b67527ba8ed15a819a8e21f48d7ee70247f5200e37c259dffd17eec8c232f970cb03182fe3964132993f6ecb7c4db18ccef390c9eb3639e Signature = 4de6f5250822d7c9d5bb98582500b5c085f541ebdc450ed1acaf83684827ed1dc77147aae4b19e14a7dc5bbe1f1e4f5771d8a6e4f2351739afb08c806d558701 Privkey = 8439b1d60aa48460135eb1002cc112792995079a77e6e8ab020b9abaca8920b4 Pubkey = eadc3e0c5bddbc3052c3b2f8b0a94566c2b2c879ed17034ac0e6a45f2b3e32d2 Msg = 5419f6d24eb46635d4a7f8eab803cfd0d04de092afbd86f2a6961a8d1eb8c0d197ba55ee08c991822a5aa702bae0337abd5ca7faa15e1f1ae369946e9b81216c0f5fc22bbd4433c3de93c5caa2741683bbd0e1a78df28dda19174101876334d40339659f021ae766162c6cc5421b79cf9d5c090ed4af07ec84493035bd0b2421b533684295bbe76a70fec596ef8c89c5c9dda3c33b7735d2d2f20b28f1a5402e72d04ba291dd59f14af08adf56eeb086d769c6bec3451891372345fd6bd02dcf95e803af0353150e182e323aaf683e036d9a135d2e6f98cb4d327e2ce7d54247f3592ed067b4ce7627174f996f28165c9c11f07e5ee9cee63851c6b68ea2 Signature = 62da81e16440821b593b6ee6540e15d1aea75d23e0a1bbfedc808c9548f87e8bbf36915a39a74716f645cca5714d170af907576d4f3705e543d2adddc5ff2303 Privkey = 3a046397f0afc072bc7f907c74d38fd1b9afdf27e14a3534768b0dd2df3a1c22 Pubkey = 99cd70ef3be342493393872f54c47deaa081021892d11a3268f3145ed4f3abe5 Msg = f08ddef46cc6c34179820c9861375172fddf774f8dc3f7d64aa432da8e5fae644c0a8a9e6908517d505debd612868ac6daf95cd7e1699750022ccd4b88dbae2bbf73546ee4b835d319a842dae8b9ed683323f31e5cc57919bc9dbe3bcfffb2ada48072697ff4a7d310c91adbca81faf26a0eb7bb0c404ac9d8dfec63e9c64e2f420c07d323b7c0dc3b73507283aeb1cee51db4e1a83a692c7c1ea398f6f30940fab85e2138d4b85aa4e231e5424f5b064ed026f0ccb99d1c85a9eb15f5934a11359d411cf94ae8ffa3361a224f46bab852d184a248b4c31fe3a7e7f5134c051031a9f328a7be4a7cbbb1d8d863a400fd2d58daa44f1b9d8e9ddf961ce6322f Signature = 5024ce60257965687080c5b1fc7d1301c32aa6fcc835497d9cb23a74a6ca2724f55353c1b757827ca5440c9ef8f8c1050913e20aabec35c497b56041b5deb209 Privkey = 124f7416a80453e4cf1cd7b5e050a9761418258bf7d27beb7f23238c4540be2d Pubkey = 0da34ab173990150df7399b6bcddba93c6dbcbf4d176941cb5071e8734c5dc92 Msg = 9dcb9873ff054db11d0a9b19de6885ffba7f0e681cf7fb8f6cd950c48328d1f919ca46054eeee6c9e57843ebdda7b24bc3503c4d612abb1a314f39f58221d2b54dc755acca7969740e7fa8b1a9523b8c7379fd395253f4e6cd054ee24b75613c3581d49e19246a7b3be1cecb334be44f3d626fe3b7b269e628d44580c20636eba2642f2744b959e65757d0ee601843f188e95d17253fef567068a5405a3a9e677fea3d7d55f7ead19a3f30c5f985671b55fa120cb9d05f471b6e1e8d779a2c803a19e6d0d7cd507887ed647c2a95483f933991ed45ae301a2b0e954a5703d248c78810aa0b199cc2bebb2f1d71cc40487dbd42eee0f745f7d285685b1fb31b15 Signature = b0572104aa69e529e3465a6fd28f404a4ec20276a993b1725eb8c5f650b4a216f1871b24e368cc46cd1ee0174cda1b5e4ae2200aa9fc44522d975a9c51814908 Privkey = 25d13b3837601b07a975693e5a33d5337c34c1127fe4c27490612aaf7f642e9a Pubkey = 3a07cd68ee2692d51cfad1a80e7763b18a043c74f4e1b01edc55ba9a9e07795a Msg = 115b3220b45ca8f36c7ff5b53887d47e669b78dac13b98cc7aaca5c2e19fce81ec8617ca410e11c9a9118a668453b329ffb718eaec739172f0a849a0848192a5bdea18ab4f60d8d1a0d338952d77b2cc13efe83c76e8dd58803b1d8b3c9729ef102b20835b7de872bef3010f15a4caddf07cf7bdd222d84b174bc21527cffb1b7ffde81e281d30cb7bce25ea3dffb6ea1fbb06cb70569a95ed1a07e97ca42de70aa218159efd608fa9b0896e0b58518a322f251d133e58c8fc1428ab0a170ed845c75fb403f1ffb97d2d2a6d4f277911d326c1cabbb8516cbc17908ab81ff8d79af44611ea1d05879c1ec81d06936e0f4a0aef6d5748e181d30ec25236597a973d Signature = 20cbf08392fea6a99cf446a95c199caa0c0f9813cc217b8d228e2ed90bab95ea92cd73ac95834764d33e42243c80a7603491c8d3e49ac715fd8a5b9e4789bb03 Privkey = 7b3a76decaea60c41e95b05877a7da82064c27278c8d7df5f0bb95f0ad2d0435 Pubkey = f80db5c28721b1c611bd87eb145a98bbf383b068045df2458d1a6fda099f7fc2 Msg = 375fadaedd9cac49b64e1574028046069f4c83654c8a7011abdb64db16b47fa311798172f9072217b0a6a43e5df6ffcc1154bcec1c68e1d35ec05880d012ce76e4cebf301bb2ec983d00b4a0540c937ff1c6df9441c61bdb3be8e0c7c11a35d49b6f55c381269a0e768efbd453447fe48b75ac39646ca82eca7d149304423491871c10dbcfc5973a57fab8371c30cbc4e90becc0b67152226ee177b4ff368ec879b391eb95e36dcbb07b2c16ba395545d4529f727b1a11ef65d120976b7ccc86af4bd204cb9489c921e43ba5e850cfe59899f1c1ec4aa5c92b6dac6914b1952b53dcb540b409231381568987bb2236bc40895df3f17eab7c0274f2244f958612e88e Signature = 2cd26fb3c4f7440a72affe93564f6f6559adb15cc7a2ba10879fb7d67e47d4ebd02fe4823698a5fbd4a907fd69184c255a170e5f1747fce968102dc219b50d02 Privkey = 5ff8d4052608eb033a5e94b603ce384d8452f60a26498b9112567f3410c18666 Pubkey = c4900de24d9af2482763109926af7c481380fabcda9440c1a53ea1cdc27e6568 Msg = 138c60557c2e9008afc03d45bec71f961149a0835926751c8ff3935c7d652d83e1b0b1da7d5bbe0b8e171a4e49aae06fd8a9deff78dcde4d25b1aa899998a0f99e1df6f9337a3ea2f24b76c317a7014db4e5283191795a70d8821d217846490f958701d39dc2c8ce47d928938874d87b3558989bc77af820979a351eef9594aa5b94f3341eded4ea20b08c3e7c5610d43267818dfac0a87ddf527fbce8512bbf85b66c9bb5d62f0fe84048f23b19604a5c8d82b1f25a8da02731feb2ecae489b8475f7bd326ddf1a08189e46c08cf50538c2a363e2f4eb2c01a204c7ffbc0b981adc0fd997aafdf2a222ee84c309f6e95ec7de4fa85d4768d5c003165028225e22e09e Signature = b737d4e5be27deb6d87729c636dff7a406c013f313c38cf683fe14f75a3b3005d9535d7e5815c8f8b37c51d6927111c979f7d9d81a347aa9cc09ed4e6c18e90f Privkey = eedefc1757e3a7e5ed3946dbedc396a362f683d2c51b0b9f60765d4bfc5134de Pubkey = a9872bc2192fc02b189ceed403ab9f270a032a835fdebfaf1c9d6934ed8304bc Msg = b194db73f994cbdc3cbe630ba72c47c2249bc0592ab547942b1d1b882b44f5b3855e568bdddf92ef05022d88fcfc294e76b64a00e9c74355373763e49a4ebc47243d48a9ad588994a518f80f8615c2b31da587a53e529d435a8697350dfcde02d20cce7d5eeefe3f5ab2aac601259cda38538a1b8301f9832e75ab90f8a932f267eac181003965d5266f206180c6c380ece803577ccb46176bf607159486f24259747e2ca6fb1912db7b78a973b2846387c1208030ee1f400d0c5b5e8bde9635ae55638ba17c734de8638bb85dfcd76629a7f9f40d6ab954d55bf8575fc9c9a595097e0893db5a7b8a6c455ecbd3d22d725e19de2941f467f9eb93d66a0e2bbdbf92ed1c Signature = d5bea8ea9a5fe9ed6d2bf839930c0c6cd5039e988f551fdedb5437e1c1af0ed7b3897c035711c3c51926be8d1b32024d5cd582f5f8369ad84d18b12502652f07 Privkey = 09d22bbaa5956cfacbbf9fd5510975128686c40c6ea96b89ef4c0f0c649bcd7f Pubkey = e559ea8acbdc61b6709a7d83ae15849a6c78b203923dd0a299239ee4886930ba Msg = 1c26a0f3a1a5b2d7d5b297af8a6a689d7c62a25267e197d23becd2f2b816c4de92fbdaffb941c3fc8db7a84335a84cfbc92cb3ac806ed58df16b6b8e119a48df4f27c71e931a5938e7d002734885e13a258a15b6e1136efba72f1d096b689f7618f49c968063e8f991fa0b55601e430eee13492a1b09413eb23813591a7a9f070cc396ca9d1facdd4f4ce37c40f7245f55035e10fad6b85b5f01a1daacc0df94069f7de8f6467f96d1fb98648e8a0520a8cd723c98e9dc2dd4b2934d8228f0ae1a415bd3a7cda38d7a9983ce1af6f8c970a2a591635fe12b917536ef815eaf1a3138d70ce70a794264d7c986d9ee3290445f15a9248f2765271e5a992196ae331abd4164bf Signature = e65275c4328a70ad62408ed7fb1728be87a73a814fee8ebd94f2665c71bc66ab0c1b07a600b30bc081a74c536857c20610384be268d9af3e3ecddd3eb0c14c0c Privkey = 77826ed351a3f09254ae5692885d774cb3f24410a4809fd90f8a00da9aee9903 Pubkey = 3eac8f41ee73e6ef136821f7957a1c27e15638d0e3916e6caac6fb7beb7bcfb0 Msg = 1ff06c0b3999cecb1900a47d267beafbb35d93d14cb2c8925e3e3fe5d967586925ee4baa41998edd0103205810aad5c0bbdc77874476810246d13089a64db576424fae0bed9664a42a491147d1ee3b9c3b1ba4875be15462392540f9978d9a4630ba4c525499751a45efc299ec7d73b17f9ad275ee71a687e72690d7320242d2dc2bd4d5c5cf0f17a465185dcf60f8efff53903f20b0c2ab2192d44368f2f2fb36048af071f7aa857b14ad1d11461205bebe17e02be2e3ccb6092821885c4e0d4811be3f45b1fea088453e022432f562562b43a355cb56270cedb6c2c42dbf9be850e77192fdc65cfd36834be988dbe9a93e2518c138b090fb9da827cb1c91c8fe52fe7c57f7 Signature = 977adccdb829b40bbd8e53856a783db346a39dff62041a2972d29009f1c9ff81b8ad54cb901e497c1d3021b50b6c69ee73558fd7be05d625f5727f9af2ce8702 Privkey = 99a99531c3cd6e3e9c900a9eeb26267e72f09d11b651a897ebb79be016f64c6e Pubkey = 9bf9f8b48a2728e02608fc19899d219656839d1cc1e9a8984df674ec26662f41 Msg = 7a89c0c1952fdc4298dcaea854efc134656be147e9e8e82fc9a449059d80570f75676b81c4a94f76a968200cdeb0988c73f59afc72ad4c3103e19fe63b7e95e140b5cb2efc7b97a6ffbb6c298ddace3be6d2ed3d598b8bdf0c2fe6c97602142a76e978514c196c1b9a88efdc1925fc506155cff9a2f21ab634e2b93e96928a5d8f7ce4cb7326d9689469242ba9c6a01b77496badef87578f5a17284e900a72df141c6199b0e71ab5da4375037617ec6196d4f4e23ae2916a72d0fce796022305ac9fbbbbe4705b340e42b78e1c02bb1001860cdcaf71ed89255dd56cc0b31c59d4596dcef84e22234be562bd801e94111d83a78064c90f9d82fce91f68abb03c73b6bd8d7e02d4 Signature = 0e89da5d949cf2bf40c7e17c2d0f9ceabc88a092eb4d49cfbfeab7c8bff43245c67b9e2e92f9bcb9b34b3fcf8b01fa2ea7a9649f814c3aa98b3dd04540c31d09 Privkey = aa58403e763bac405db065eb11eb6be3e3b6cf00ec4a222b52bff4b6e3d156ac Pubkey = 167f9b9a4665f93f5d7d3016ace6fbd13420b2e51e72bde59eedf26993b66cae Msg = 3baa0998ff02b32b90b51f9a840c7b5c5870cfb1810a9b0f77b55909d47ad335147a991c29fbebfc592e9307175c1964129a2d5efc6215807453bcd726969781222bcad1c99a49748b9ee667c4d0c82889e2f50064c115dbd8fb483d72ab0ccadf76bddb2dc727dbc3fa5c4624c283d8921c8aa4425110dcdd69c05e5ed59b359625eeaaec1e27eafe9d9a5ce736c3f9c527ea547818b9bca6811be4cc15058a6f5b683303b80c90c94a83b8b15869713a66b1e0f656331b286d1ef7698834ab3e138417aad6bb3ab3bd9fc78761a482dfc654f3f8628c8d9fc16018898f1641e8622bd272e38d41706cb9cebe6ee5e173576bf61bb1188cf2f39c62220bba88fcb4de4898b25b04 Signature = 64b598ca5b8f9ae742e46ee0d8c1aaf31458b50c25d267a677e44be5b755f14d51801a30399bfcc38d14071aa0ae93da825a581ab6c20725a0a910b4735dfa0b Privkey = 1044ee3708c0b0e909a8cb2ba2cd0af8d28a5de01d962e826087fb232df7b2d2 Pubkey = 46d241ea0c702c1889d44655824629b67284d4e644a48fa45455d27ac5f62529 Msg = b8a445455fb66e17e3143d35204c9ea93474eebeef93963ee5c1d377ca217acd4ca63e5755da08fbffdbd4352bf165193896c8d6f76bb4cd3bc2d3a476a4e320824a1210ce74d0014d747f111eec310c5c89ed4d0850e811f80a8bb28dcaf6f411df83e2c1dfd90c4ad23561454eb5d756b63b4ea7f37dc5d466c16ef70d11190c4f5316fe2aa8597440e88bbebaeb35ea5f04f07b0339264158ef909ad5163bfc248cd724133e274f812695f290e57176a96b9393d07bb310299f5d2a6b6dd1dabcb51bf29c5afa7ebb0701c6c84767ac137793091fe0ed6e47d780628a32c84f83e00e9c16742a523ecb63c24f4a338ed299a06194924f44c5a5d3c937ff9b0945982ad24a2d1c79 Signature = 7d6bed7f87d090abe013c31e1203903bac9c93445d06c7b53d31d15f970d88647a7ed2c3a63050ba19d68043aadd18bd861de1ac4715b8e828b2b16f8a92b001 Privkey = 95dd1a5e658fa6c8d42507b3e5b8edb5baeca62deb00fc5d4dca8e1ab5835e59 Pubkey = 3a5323dd1e07f323bb6d83e9c2db92a29f62e2e003ee0deacd7e2e4e030d8d27 Msg = 9b7afd48c474604c26367531556840c388668b0f3840063dfc9869ad5b901274b931293d04f3c8e8f7f8eab815a641d7c351284e8bb0437ac551bb29438964e6a7c7ba772344b333f9eda5a77568c8931ddcaf21e32e07b10bf4820fb859bcf87b81c4bff426f24a4d468f2e9aeda8f17d939709970db11df76247e98a39eb8b38f5949f349f2ae05ab48c018517c48fa0205dc7f1566453e105e48c52eb455c0c40802f797b3eefb1e2f3b1f84315aed5b0711c6499a691b74b91f12ef70f76c4c05c1aa1a993e2f3e528ab343dd2368162f4036a61a13a88045dcdefa85d68532275bcf5b8f5f00efdea999a95783175d9ee95a925d48a544934d8c6b262225b6ebea35415dd44df1f Signature = d02a7523dcbd29576ba809b531037774df41734a41175813119c6a6a788cd9b8ad780865678667699ae66d010919a966a051c08163df67a977ee6e220d0dc30f Privkey = 1abc0b9aa01dc57ca53efe7380962b1a88d50a964f5cd98640982c74393f2926 Pubkey = 8d4fd14394d7c1405700306983fbf76ea9f171b15a6b56612a1feb1cbdae5dd5 Msg = da2dd940d5e1db6e80bf7e2b782e7e745cd4fd252e981517975887dd05ac77ed837d082961575efedf301fdf24b70718b991b8d92bdd2e6bee17c8aa4bc694a727bcfc78fd85195c42caf883a2c38d161cadd79cfda9a39110e1264d30bd4c5c4a5876777f233b071b1b0b408935f0468954cc744af8063b004ede56cd981c4dd5608abffeaec9e58f3fafaa671467804b7fa2558f4f95174201f183d80a5914065fed53115b41ebc338f78df050053b8a4e75ea7c6fdc354dad27bfd8a2e66fcd7ae2f587d24be0d4a33da30a220e51bc05fa4e412b959fd95d89ea6ec0162516c096a9433a9e7cf599c928bd5305c2173bf7493ed0c1c603cd03f082cce44237a79ffd8be9a672c2ebaa Signature = f738af2d3e290b3d23d9aff7414bfc5ffa47235dc053687a8ba5c8541b8511f781566cdaa130e0677db55fa8be9d81a092cb58923a8628494d2f62d95c167100 Privkey = cbffce2c9bd3e23e406e5f66e632dcfa726654d29a955cec983173235fa359d0 Pubkey = 49653edd64a55f7cd40eaf3f8e72eb96dbcdee398f34817f2c95867949710b14 Msg = 1ffde6826e4f0c24a7961f191e74cc0bbc928e3f1aec3efab32765c2501cbc1620e7ee6f61fccfb00cfca9fb98143b529bcc8c3d0fdf89ee7c342f101815fabf7deaf9f302a288fe175826d590d99ee6fd92da74f9596b783c0e7d47d711a32f39ea4165e5212431441b498c6b70db3b09d1f4e4a14a6bae39da5088bb85b3285ce9df2f90681af2c74dece439aeb91e1c1b0712eddbee8d72569828f37cb720c509d02aec476070484e9b16ec7179947ac96caf0e1be8b6b74f372d7235fe6e3999df733bccd482dfe2e631f56b582667dce5e3121763adfacf3b18cf2095f7394dee4927fc2bea6b5824d90cd59e854ec5872b4551b02efaba5ad54a9b7a8f6de5d7cda5825b325b076ded Signature = e7ced4fa2a7dff73f1068bbad0ec9a1109043c97a62effa148876f0969ed4dc608e28bce797af3b82532c94dec4d6811b7f563679129facf17bb73d69375eb05 Privkey = 9f91231497484cab39b9e20f861181d397908577bbb2968242d071bca4813ffb Pubkey = 8824bc6cd6a6f15a5f41668f2b3bae8fc4967383078d08b51d6d1b2b93a1071f Msg = 21d4fbc98163c3fb6e09f775c2ab7b18b18792340bafedacb49605622e3c08aa3b2b8d0e0902f361aa1c0f652e2732b10a0c5c6a05098996b588267cc8951a78b5d431e7222bbb508eeef1b5e8b8d01d3991e18dddc6ca8d222ef177ce62938d1810eecf06f4738b28f440946ccad2a12e39d38611bed3a39f93419a179ec2b1b52d5fe5c80c23b84d8803755f5146092cc199b4bdcea5bcf2037bd53ff6346694155f027d8ce2baffe30a5666596c00783aaeade9c77fc8637942ece017d6484c2899b1918d3a480bd5157678d4772d271f9b99768ee1bcc46b2489ae87cd030f47d1333c7672cb902cb4f5fe746e853de57940ba2264d3e629644d653a5b7af78ce64a993f36250f8cb7cb45 Signature = 0a1c706dd8a13077ab18386c65fa97cf9dfc43542d1846ecbddeb7b3c93f3c66f3ccd0447aacdd4dad8fbf736c4ff9dbdb62bfc14d8883e385bce9bac56a350c Privkey = 1e2bd5487c5f5ced461f604dccb4e78eb91608f0b821f5afc4e3e534f7960392 Pubkey = ef825475cf2051a2017ae532f077d96774347d2767ea7b45f9c1b860ab993506 Msg = 1dbbbb13cdad88854b809ceded273343d306a8deabf3ff02c9cec6f002b8e9e10ef5d1b0f5711f33267aa91c171b61e960f740457b81d751a473f44f750a080cab80af7ccca7dffcfac9ee4c39dc85cbdf51259ccd3470d9bad3ad30f4ee5dbd4fac6bd5c6c4df7311a470044695a7e1a7e18572207588afa57eebcd4d575b6d424457ee92465ce1863e3c677cf875fdb98d4078ebe7144260807052577144cb8e0359aa42ad155d79dae3deb99c4632c191c799cbfe587d954787068d663bdfc0fab1334f1876bf498c4db5c53db7b0204ed5a521c62f09eaca8d0189f3b394143f29c421cb5c8d07bd751baf4cbe3bf4be1701df4b2207dfb2904d84f4dbda51cba576d5a5bb16efe698edd608 Signature = 4d33c96a2e3a5db7391adf65c1cc3565fe76eeafd0b5c7abb0b492a0b51e1fa33639946a243b2ddef357552298ce0aa95eac6fbfe660988271877eb2a7da1806 Privkey = f78db14d6d1a643dd7735baf2635321244e7ec8ca72c5c38c98c809db9cb5a55 Pubkey = 5414f75f52f3864afb0c79c2c5c1d06b4bce400fbddf17fe9cfb2a8bac47a0dd Msg = 05caf1b8edc3b173fbc1ed29b95e2bf06d814ba2407d4b31c728d04ec273d25394423ac7d4fff2ca36ee90273093c756e2bd13c96d4a3dc7f5be1759fcd328eb66c5882b58fa4588e5b2a3713a4154a2340d0b06ad019601b0e028e497f898256b028af95cd8168df5e58a57cd1ebfc0a0c91ced61dbb480aca7df8dca91eb16e98007cd2cd1a2045b0e4477d12d5a4072f365426567c9d61577f3485c8f46605e7f475ef04a3948f60dba8c5508d14bfddb9b11dd044ef2d84c16b9a9038d8e78eda43b91297df35f4361a383b41d49677a687d5b344ad1ab0fc73017b3bebf32306fb3fd7b3d5071f3ab5f6e49aa15540cad6503bea7784cf9421801ce1385839893362a97fae121300d6783af0f Signature = d7cbd4181f67712007b7f0e18452e0a024464d9dc9b5ff9cf669d1b91169d7573262f83336b97c861bfab3fcf669223ce8caf319f21d23f1fa331a2d89b6ca0b Privkey = 7dfa328e90a1b849c219e3da832df9ed77448234f0d89ea5d17a3d64e7883daf Pubkey = e30ce6fd5f5800389a70cd117364f59945afb180f229927360b06b4835f8dc91 Msg = e5e495d663f47236714532687a24308f942ca9c33e088f7f106a5a723518cacbbef4a68c939a6950b2dc2589f82d354e575272d42b1383d315ab8a20aa0cdc9d4df678ab3b26612b5dca66e71f9f3fa7d9e731dc481e2bc7127cea3b6203ca6cd8162e90886a73dc46c83ddefc4b9e2d53d29dd387c624e08bd8d53be928a40a9aa8ae8b1c8d0fb6a7bd6dce5f62315b7a2181f627f256bbe7e2a95bf464e6132204c174209629840235b2c39913301a4b40325d118d384bc7ac028cd4f12702e161191b149e4209058a55122bbb8b22b24683ba4f8e2e6ccfc08dc8c8b1bcfb6d60bd8f062196933df319ab16906d085730eba1720d4b02c67daf38cce6aba38e25d68ef95b2f521913a1d77d5eb650 Signature = 1c61d53b872f8cde598609682c79f6c5df007c513a71cfb3a06dcb82d85c4b00ccc40b00e59f595393088b4cd0432855c67a207da71f87e72c409b3e50279507 Privkey = 6ce13d3c2ec71fed83131a69d5d030314ab49e6565ef68163fff09ac5d9b47e7 Pubkey = 9c7b1118fab91e0e7b192a23d95fb877cb7936cc6c8a330592f48e6784edc292 Msg = 10bbc311eb2a765e0167ff37618ff70e13f02d7b0617ae4ac06befbbe149c972a994f680ca4dc9a92ec7efa53997fad356b9ff4ebdee629541d1f4dea62ed0d2494f9ccfdf07a9310491f61c4b3e2700b4a3c668d678329a38c2eff9d8cba431fb959e7f7655bd0fbd77d53bbbc2eb8dc51dd718ed98728a181686be122b844d3da331e329d3959b5923f7734325a021026e2754e17a15108be801465ad958dbcf21df890cfe5d5b883ca43c61cedccbdb58b849ea75374f1e918e803e577a5dc7a1c17936eccfcd3481bd2b1eb075b83237ca6f3c07c19e9af9731267be82d4898eee96ebc900d48b059d51b0dd415b1c890660a88d25f5c5f35d8e45e523e0ce3336923ab43670e35c5057d56c758876 Signature = 608b2bf6f6da05c2ac5bbfd795a2ac32c79c74153f9431dea59768ff4c225e3b693b645a506766b860850ee97ea43032b05b69e56767e8eb9d1918df9afba805 Privkey = d45ee69a5f1a7cfdd0343f8770d1c6bc026f067a70dbe839a86f2aa068c33f81 Pubkey = fc8d9fb0e4f34793090755e0328096e01e281ea351b8d95cd9116e131a5ca54e Msg = eb5ed8ab79cbfe61c25981b9d1d6b70f10b60194b4161fe17d11aff1767994aa0813e9ece2f4c5d531b99e8adf1888c30a63893eb451aaf55acd5a52ad8c401faa88d6eacf3e49470566114fd0c6a274e9544846b0ae9bfa124d7951eb26715e19253ff7edc8a70965776f23ce46031e034a200723ba3d11e11d353d7e7cd84aede267ff64bed418cb9f28c61cd0f63b6ce2ecae14b20bc6bdaed8c428bad18be4b7d66338364acd8042a8256f258a69969b8d3ca2eab3aea3706e5f21c3b1efcc254a824bb4e7ea7aba8827c8eb82786c665aa973821931ff990a63fd34a74a6d8c22a882b0b935152ccb36fcc76f4eca65d67c8680942f75dfad073439c0916065e83877f7ba209303f33548d9e40d4a6b Signature = 156c51c5f915d89b8d1400350f8f217a5c02e2629ede9f4a30b6e71d1ea7a953cc6db31ba5c778c269920b649fb4221c6d38cf2cea2a7de3ad423e04faaa0607 Privkey = 8a76eaab3a21ec5a975c8b9e197a989e8e030899eb45d78968d0fb697b92e46d Pubkey = 2d9c813d2d81e2730b0d17d8512bb8b5d33f436cabaa13e141ca1cb785014344 Msg = c6c78f2e2080461aed9f12b4f77c989b19716780fab60e6ecb9793b4bc7ed69e5f70fa6bdba16e9bd3194969eea6665abfd630deeefa3d717b6d254dd24bc97dde21f0f29f9ed34b8bd7a013380f4f82c984fdbd95af9805b744bcd952c5a71fbb57d11f411c18cc30bc3594f7ad8228cb6099394a1b6b0a818581bdf93cce58f3a4a23e55db3e69ca9d60cfb3a907fb68329e2ffb6c65f1e828d28127109c9e9fb70160f2ef82a2ee9f9bd170c51e13fd3fc1866b22c79fe6d5101217979dbe2724dcad8a9bc69acc42c112dc697bd271eea550e9e50406bfd28245b83b8f012d34db6dbdd55ae6e575745c153d6e7534901027eadc2fcc33a5287ddbca6d3aeab8972294dc6c712b9942547277340e7ad19e Signature = fceecca4b014fecd90b921b0fa3b15aeaa4e62caa1fb22729c70269232c33cef0d0aeea66432c128afb9a3646bc7f03a12774da8758398c2a0dcce0bbbf6740a Privkey = 18a8f93648cdcf47133630af1e11c0ceea3de07327314c96580df775597d7a9c Pubkey = 2912f41ab4c87e3937a03331802cba87716b4eea14b9fba6f546d0ac2c0973df Msg = 592093ac7cd671d6070b0027edac1fb015cc205d78bb603f378eb9f8aa388ca830db3cb23420c7e852db0b55241eb88a02cc627aa94143be439aab4bf2634757470406e842f20eb10f0700e3c2da364f588a8000f23850c12ce976f326d2df1bac13e95020b412b175bf74bd7ebbacf3ae55c0daebb5c010bf804feee1d7d49fae050bea55996f53cfe1f15a0cf20727db4ee311c260bad9682d7b965e27a9491f471d4a473aff646c7d424d5a0bdcbb8a0233f4b3060dd04c98ec98dfd05ec7247884e2d8e152d4ae52b3d5865d9efd6706a60e088e1e7c9f624510abc7a2045a2c7a7588e2535e73191dd5cf05421563f556a13e8236670343cd5ba4d466e245c4ee3b5a41e70c9a0f5e6ea2c559ebe61ba81e Signature = 3b77394cd69f8b45d00cfe3a79a7900628a56518b379ed8a11581fc3a376e5d66807df11e70904f696c741d21d139310fa1b89a93bdc4d2c3997991f5220ee00 Privkey = 206cd2b8114aae188d81862ccec4cb92c4ef5fc78c24435a19f9ed9b8a22f47e Pubkey = 97a67ac2811f529456df532737d76bed7e387da83bd55459372fdfb27ffacff3 Msg = 480c4800f68c79f5dfc0c3666c0ac429b30fe0c5fe848750db2171380b80c8e9fec0a054b16d08674cefe2f64ec28bb6b0596b35235575f189bee259aca766c222ac0a46cf2af75774da4e34a0b54fc2ac49ec8bedf4887cd9b7be4fdb7f686902ddfab04627e26ea2dc3d97d62a4b1546180218ed8fa113334819b5275cc54afdee44309008596507971675e6d8b8a8edec4718f2d4bd735213cbbd18791faa8054174907a7ac17d7143a4757e493beeec4849d0b836f18bb2b3c9016f25af47fb96199251720549f15d149503d41095e25f26209daac39154485c3ded7cb1a8c3e83a52f5a06ec09cf83df00726b7968f64c0cbae299512fb438560f04b3b644346f938ac8e90486614cd844b54eae078bf678b3 Signature = 73a40d9da08fb98ea25b67e721557a1a51225294d316b53149af895fa4d63cb4a3f56f688566ef6da42fd2941dffa06d497aa902165d50213a6214116299a90c Privkey = 59b144a708abec972729a04a6c13f0ea020b4ed4a48298023a568958c21215ec Pubkey = c4f4720092ed6179a082ae4d6145df3771786efca9bd9bb79c9f6667d2cb56b3 Msg = 3857bd260b8aad9d073f06765d37fe893a3f53e23de866ddac33495a39ad33ee9e9d5c22502bc1c4b5470d0e3f3a585223fe4cb93cc4ad2b5ba6d78826a53fc0253dc580a2018cc9ff1cfedbd3ac0b53292deefbc14e589acf496cb5f7670130fdbb6cf38d208953c015a0474675b724bd109f7cb89c33016751fe7aa785d099d09ab20dd5258cd764ac8daf343ce4790ead0863af43121aa527a37a11628f47869668f8eac00d80b6bf9906663d7a2899c1cb678cd7b3eb3bc80226b8b13b6e46877f38f07c3d9c86d3368baac4a6f6b93ccebcec9811474b6a6a4da5c3a5966571eed05edcc0e3fe7cd15915c91f44eee8c149ae451f375518a79fb600a971a39b9433dfa19f91931b1932275747c262eedcbd27f1 Signature = 1a80850fcbd6e643c6ba8eb684dbef7df015159228daedcf0604709186054db185aa7baacb09d6caad01638eff8e468735a60124de0c5376e94340e541a98007 Privkey = 8d1621eeab83270de857335c665bbf5726e3722225fd016e23bf90ab47aeec3d Pubkey = becdbc024dae6a94ed4e29c80f2aff796aed8feb2c1b3790a8c72d7b048a2c61 Msg = 97facddc82cccccf788c31b3305e93eba956f89613e6e53542b043267fee544c2b0a8ae8886a31b9d321a63c27623baefea840b2a8af5b2330193ffb5baf873c335528afeae2160163c851c5a2e58154a1b0569c2d1366c0710437623b0e08c686e54fc279ed4c45f3e856868375f78224c777b13d75de10d79173552425d15a561904155f2117b2f14713eb0b04648a3bdeb3302167d1973e788a06cb00d48ccb269fa71af8ba68eae55dbbfd9594d5c2b4dc13ae0321718561acdf67dc8cfcc25bc46bb66e096a1941d9335207d3f7d11e8904904fabe3a50a3883e7078047df252f38b67cd28a6ac45c7d7a1d2a1de8d45747cf09301e01cdafd0cd99a6e91b704d509fce692fbdef2f71a5ce0b35bc15c65f876824 Signature = e08d6caa5f39327d6e6652ed74dd1a37844b979f5cce747a606f5679f4898bbb7643df7e931b54a2b40ebdefe83003f61ca0f11112f023c6a3e8cc18cafe5f0d Privkey = f2735d50ee3a9a65b58c8acf551663e98809ec406f73e3e7f4e73bc4ea923874 Pubkey = df48a5b94a07af3c2c99b8388762243233c850dc175317d602638e5b86ab49ed Msg = ae31e94e7197e4e4d0239348025ed6681e513ce1a6e0aa0e5b979373912150ef113e50ef0569c483f7568c4bbc4703c5dacaa80a0de4e738383fa1f10d6d4071a31b99e6485143972316c86522e37c6887a1c307b29b0dd6f9f1b438310af9d8d7346fb41f9b2dd2e80b14c45eb87d4ed48e37a5260b52257b3e99787a13c55392ba930c08e0240e960def0c29b8550745cf149dee53a5d174ec065d2d6677dee1fc42057062c34e27ea5dbcdb861b9f670c6032c7846cec8e87a7c9520e27967b0186ee71b77ed6d029bbdd70949cec4a709329fa37fee002490cc1bc4c2df6f763f9858f33d750c5b505a67e237063c0486f9456d3c620d9ac7c98f1381de0effe41c18259504a150d68a6a28b0a3eea803b855315c9e0 Signature = 6942a7696417efaa591b95e11f02d763bef5279b932a8e2a7cbb9f583695c14ce5cc556bec66799b33cb592da4df2735f9eef2c3ceca4362164b6cc93da4e105 Privkey = cad9d21a01c7e1d15df2fbd79c516eb8c3401e9fe28467cc7b21679d4e331a3d Pubkey = a7b55c15d6790b40536fcae5ad2892cd66b18689f499c1fdeea66d4a7df39424 Msg = 70702bf19c919f9836defd7b846fd9992d8b7eb2e106aeb71e60a31b4ea25a41b212dc7de7c91cbd613d58d0595db833cfe7e50584f25569602c7744fa675d156d0f63cd2b7c089c8a00686a437169826a12dc485b38c068a8007142e5163747011a07a415683622ab1e23ce577c732ba14f401fbc3043e0693a9205c19a92298a3d9b08fb7afafae0a9f016bc750ee631a5f5da5db6f9ba2692c74caaaeb4d097e90e3c02d2e3a7fb3aa000040b7c17b74564e646bea16bad611ebc0859a3828804ab4f5cfba417d254515ca3620a3ad683c46ca6267bb49539bb30e369087e67438e9489562750dccba3aa0b1b0a6c267032d20c2adb75e68df1123b5259bfe4eac6cadca6778138a37318adb30e8d669f3bc9692cc74b68 Signature = 31927d01db9f2472f4df6f63c18ebd83c2b1aaf88d580e848854df8cba6395d3da7bd6bb9edc1fce1c7d7e1360558fcddfa93915be076efb8ea2dc5ea7b20d0a Privkey = d9be842255e9a16b0a51a8674218cee7cd9a8bdf343508397f4ddb05f3fa0082 Pubkey = 7931bc6dfa3324943aab183d1285515919399ffe0b710677f0915d3a5be51e92 Msg = ac6c55b134663e41f02a6dcb8549eaa1c013f59658d81d812f95b74009513723671945e1324f90f8a3f971369181b587bab45665f788d663ab78140c5a22c1c18d4afedc7448a748afe5bf2387003c1d65ab18482ef98922b470da80ad14c944951ce4aed37390cce79a8e01b24c7dfc1141c0eca2c7f773ed4b11806a34615513486e4ee11af08078a1b4054cf9880298608dd9b3faa1a242a452fe511604b3102c313d14cc27c6f0f8471d94555317eaa264cdf52c69e18f461e47903d21298716b172ee9cb178f08ff2d3c9c162121c2ed21d8734b2f0630d399146cbf76e028a143f2bf7bb50af0f57b9ba8021d264b00c6662f84c86cb6d5952b3d241f7dc3e700c96616cbcfb0d0e753ffd5d21ee320e65e97e25cb8609 Signature = c93845658c9560d2c0e28f282adbd4652bafd3bb2edec17c94878f7b94d3c77afec906ed292a8dfbf5f8e7c118e8f2ca33dda7909d9b695b8ff5a1c0e97ac807 Privkey = cfc48cc6f65811fe7d7bba85d1cd84858fd6f7edd638f4f552363ee7685f69ca Pubkey = d29c10694c5e8e3f3447ed78d34dbd74a2b301373ba871b5850c333dff7bf8d0 Msg = 8e7defb9d16d036bd642cf226e32773e605361c5ec4b951255788db0a042c63e5a4367d61524f10e6258991325a39ab6b03612260c3fe3df20b34202d34395bd4ed40bd61373df781a4c8bcfbd15301060f07437732333d8e49736322dee6b22438e787d8856b70c26ec57d6dade9c3c28e27220c5670e393544ed095937298dc3adc73865f777e90037bdef834716476d78f4e6cb4961a4c68a8a836338a9f5da179c4d5e93c3f70dd35eec709653dd8de37996b12056d4eefcb4b6b3c13ba984d832275c4386ebf4a8ff7f078be3d428c1e0d9b162381f06a5b7bb12704003d91f25d1d8fd43626ce70fff59d2927768a76bf7f9ef76ff95489f38edcd1c9e9b8a8b0ef66c32805776d5ae9fbd84a7af4fa6563ec70ac5733a44 Signature = 80c5d51e96d1cac8efd3459825e79c1e9f65af701d1d29e1f95b036707113b77984b7b3350f04077333c957f8fbc7d9b040c362651417b9899027cd33edb1103 Privkey = 15c9f7c4d84a5a479041952e6a8cac24e76fd2d275c197e6b521929b43ba6c5d Pubkey = 8633c1829d29091df71fd5c0ef640572e4b64974cd097dbebbcddeba041647c0 Msg = 11730dd45dda80d84d080d92e9bddaeea6878e4a0b3b512d9ea733808e1cef51d49048d6c78116a4bde3c64aceaa52beca86b331ab59e9185c70286a02bb5dd04f5c7f4e9c7e445e77458565f159c783dfd4d976a910e937789d2141d416ed3a7f608d26737a86b20b624e3c36af18d25c7d59b8d7427ec6c4d3d438d7ae0949dd7d748c1ffd6f28e8285d440422d22a3761202e9584f5cdb3504547aa4b685730c982cba213de08020a5e4e46a95fac4b481bea0b630abd030ddd335a20fe2cf7094aef4813956991913c6821f4b5410df4f133fe63e22c08092a0a65972722a27ae42011a807c327b417237c540114eecb9f0e96cda5dcf0246f1d2717f49b9cea9dc6a3da9b396f0270529226f5dcba6499918a6c289fe055fec8 Signature = 1e36bea5a583767ebd80306cab233155b7b42814b43473cf45cdc5039c939744a9694b87220daf4ccd29f25cea405e7c08db2ef17f3f034dbb49cff60283e306 Privkey = 6d2d0d823f294746b9a5512e14e73c1d855b5e4bca65fe817729810cc5ef840d Pubkey = 1b6480a6a90dfb472984855cef6f1ab31eb7b3f13c8ac00fa556d20b53e5ae17 Msg = 8772721f72eaf7f73040c068a7c3753bffca7dc2d0930c6525f425e6005c25cd4c0ff5095c9c61a5d8a1967b8c86010c884e509e6b1670f79046e22979ebd354734090d3ada21435c1f8254f7b5222cd5564f064e977640366449f4e5008f870f9c4840565bf4fb5f574c9774ba2568e71a9ccd82ffc59b694f26e7de4ce2e3fd880a0eef387931333ede00dcb065e6d0f79591a2aa956df1948a265cb95750d8a233b15c288a05487c515663f93e740fb1570fbe4bd80c68e8d9297345a8a01cdbd88f4a39bed9c5ef09f144bce5de568bf3733bc53b2039a29cb3e194501adc1c10e86383aac8b0f85c67a6689bbe1470a392476313439ca88d98c021c0eaec25fb2f9a160ce5c786170be0238fb8785dd33bfa9059a6c3702d0de05 Signature = b515f49eb32ad478692df88f07b7802c6e0e5327aa08a6366e4cb1d1e26f9e65fc81abebe2215d649100f27598273a412b624e842d8130403797e57dec975a0a Privkey = c0cf799af7395bf27bafa36cab437045e39c903bf807548319ce44f287494fbb Pubkey = afbf550ca290c905bdd92fc8831ebe3dfeb6daae4f56005253cc50951e50edc2 Msg = dbe65780e968de9e40ffb57cf59a60fd93b3f9a5e7d8ed5180adbc578ca1bc48bd9fb60a1324c9c2c1141479a0dcf0f1d07e84936526df42333c0d773e3fed9e4038de5b95ad905c92cbe040487bf55e10e1edb429a0ecc4e0e8d00a988a9cd53e2eb372f4fc4cd9537b269ba3a23cefbc8df6476e75434b81d93e8891bf417c82e363f3e4abf80a4f73aca84ac7df6337f536d63d939d92cba64be742221116069ef251abba0b00af01718bb580ddbeb79973ef10a68b4d0fa023d6ebd3079d6b32a1aa20a21e9202f27590c3f0c0cc253073c3f822aac459d39f50758b70c00710a3c98438416508522e512adaa0afd503a7ceb04fb94a4a932ce80cd5a7f11bb861263f58e5749d542a110de7c7689dfcb0c51afa9d54a58ff89f3f67 Signature = 5bba01a4c7b25542d06912de70aa1e220423fdf8338a9e693395cb6f0dc1fbfd018e3c77e50aef90a9080f30f1f5792b2431078fe6e3e00464245e17cd8dc107 Privkey = cdaa50e8527dc7a50fb37e28fa8b9568c37e8567e0b499997b9aed676180c3b0 Pubkey = 7c56e164510268c182b423747904f1d3a5809330f6e1b29266ec46e73be1550f Msg = 94fcfbaaa303dece7b908f874cc5f095061f1754bb35780db666b63ab8290811bf1c521a7f8f785ea270dfb39d0d6ed95ab71955a11ffaeaa268e081ff3e4f2425b41880a987151e678e89111350942d820c3eec36212426663be175e5286b4ad1cc804e3e3a03b9fa3e82838ebbc2615a645f2ca1468ac4a1cdbe523761e83f4381b0c8550ae5e8c8cd1fda57191436e27cb883bc64be86a9dc6110ef3401d88a7debd1b701d9c257a6826cf01e9e2922e3ae577f2834275fb0ecda80ed8cf1801e0bc5e01e26a77c48bdf46a5c4894d22ab53e741827e24bed5f0750ffad05e53f1d5e61dfd316b191d9797ef713131a8b430abe3fac5f3c4a2ca021878b15adc8c5f542114260e687a9d199d230c4e0d3fc696993b59ccfa3ffa9d8d2fb Signature = 137bd10a50ef609384fe668768fb871de741ca0f53ff8477d7ebfa90aafd5e2681fdf1b89250463c15db8e17a58825fe9427de089c34de13cd07bba18d4aa40d Privkey = 0fdea9bee6288f947e0adbdda4dfb2baa03891af25024a5e138ac77984d00507 Pubkey = 70abd86430d7e8d63209c8b373ec4e4b79e989e6725facefbade3c7574d23cd0 Msg = cf72c1a180a2bc37d8478d9a7a39acf03bf2a50790f7902f81121222d31d3ec916f4f24cef9d7c41dc021b0e8487bb892e47305e54520303e89b30b263dac4a9ba375d46c40fcf400535c959d2b746a7fc970cf65b472e84b5f1d0ebadcfa1aed6fc47facce16a366a3b1d6e516813c1960975f8f2b43042fb4eeaabe63c6f65db45ddb7db888a19a9d7ba6ca479fcd70c5d1e970f12c14f4d24fb7e2f357bd3a94aa1b868ccc0847f2eef21853e253bafbf07c4e6176a1ef077167841ebbe5629337157f39f75c71d21e7e96c51a1b16fa8dc60f0b1279fcda2641fc8591e3c492f15bf83caf1d95b2cd91332f1b4202fe72862ca2ea2ef92c11db831d82f8fc3d41fe29a76c211a758e2f71bd89d2c6610f201429f348d56e10e3b7af53e27 Signature = 80c42dd5df03b285a86ac95ce6669f786a978a813a9d7b8c6a23de76fbd09bdb66c5dd1cc9f1a176cba388d5051764a32fa27f0028ba4898068bd01a3ee17208 Privkey = 03d5e466f8298ab5438a30976d1322a7215a642dd5fb4c3f8519409a7522f092 Pubkey = 4b3ed4db080e2a452e16912c14504424920a60975604e4f379258d1c8b193d6f Msg = 1b47b70013cb53e1f8f4971e0f39563ce87edbc2cedd99e5a35585df8b00a852f7b9c97c7e4a5465fc5605ae8c5c36570a99201a7ad6031287ef0c7b2ba6e57b056d0fc8d6ca43bf6cbdab098934b403197b525d22d45e6b29c78f8d6183e41ffe197dae25ba22b06669ae05badd7e1da6932a7d054cbab3f54e5146223ad8671231bc16fe62679bd2817a6b80e653998c4949f81ff53b6173163e11da3e6d3c76d84c713225b4173d6bf06a85b6988a48be4359cb515503ca563f4353f8e7d45e4d94462c89a04a00f1b3b0ca6422d5db029c507d464834a20c78a713661d84edffc496d69282619894437b4487954cbea2aa7261e6a62b6851154a5d25fb6b4f09c59473d385ce03e91ba865eab66c58c0abb0b7a78e4be927e55460ccd70d82 Signature = 6d7e4658f26f337c98e03f13542e2f39440ff7bf8d88f3f6dfa4d64948cd96b79051492fc28f65f2cc0d23a0c4d5e2307bb1c47e11e53b371f091b69f80dbd05 Privkey = 76cc18a1dafffa100586c06a7b40f79c35fe558c339c2999a5f43875cfade03e Pubkey = 4b9da8d2f137dc6c857a99a5998dd89dd5f05971a21e8c776670eb47bc1270a5 Msg = 4522b1d82373f7a318221e7e57617503ddf44fd53997522a1d963c85b708d0b245de372ad52ec7f54f6213d271f7c91d5a1d36d134db389df0b081a06bc0c7a4875f724092793172c9115641c6d054f1d992e0fae4df58695f0ea3449d7a4b3a8857e19803fe49b6d52c9ff3746a574a2756956579f9fb809a0edec92c55e95ffefa3d05f165822f464a21999f29691f6744ac5a3ee49017880645e837edebfd2e0f24997f041145a72e2376ada283186ca2b836362977195baee30a3acc81b243f3ee376a2c4764c783667a4b1177e7951d3e3c7be4f1bd7ae8c60fd5fb0fd91f0c1c14d0d2327e8f20d92c0dfcc53870e9d99fdbf9dd9a17e882509ae7baa8653e39edc8ee569000d624cb93a0754a798d1f811f6a0ef5501a17bcf25fd0f91626 Signature = db74751c66e6b1866044dd9ae99f19e6334f179e79d8b8e0c8cd71d22cefb9eab7e3e7a9c2da225f2a9d93a313d1cbf1b7fe2597b8d702bf3017a6a6bc7b7b06 Privkey = 71ad980d58ad8e7d33306689358936a372d5190b24ec7f9bde749cb81150efda Pubkey = fd35a75fe5abc20104691a24a4659440b55aeaea902ac3be274af27aa8312869 Msg = e87ae073ff5dcc5485a19940e4e3ff263a0618a9025ad4032dfb36d171ce881f71c18a49210eb45819806142e2f00db3041835bf2c3bccf1dba02b8b5a5bdaf8fea316c0623dd48a564ec166f037d587c8c01684e5e5c0ba9dba4d23b49a0309244e282a51408622edb05704747e0cdeec976893777071098972c113a8ab639c31f1613233ee460eea8a8c10e1e6e152214529878cf1adaeaf78cf19bac71361815bf57955498fab4f0f2b7586c86f9f4c2ddf8972f9b9e0eb636d84bcc14385b2d038be55a963702efe225a50bdd0c4da92a2a6a09100ea04a211d396458dceb4487116837d139eb0f122538ed3986ad0af4da2dffc89f3269ca88538086e691e5beae9581e7c63d8e612da2c47f74dde1d94951eadb0df60c3897d2a3095c506093b Signature = 81670b1029e481e9ff3c171f05c16861c846ee79cdf2e21e3bf952bcfac97565f2b1dcedf69d2e7eb35caf5662e8bc671fbb96756a63a596264d1b7f4af97e06 Privkey = 61594e24e75f996b4fb6b3e563f6a4f9915cfa65ddb199b01fed7f8ed7824ecb Pubkey = 8627d2141579cd2521aa076800ac354b9e3a47d71cedc8547434268225e33005 Msg = bc01b08c7caa236100a012a726477d0ec389dbfadac73d5106424c5d1f3d1cef1695cfd93a7062ec8bf1067047854920162f651357bedf1cd5a92ec29bdb5dff716e8f6025515a9549ba36cdc35ced7c5c0c368e6cd92f2f10ae146a20728c374bba509641ce88cb42fff0cedfd9fd67f310f9d01a3f3690eb21db17bce67ae35c4cd24c209f09f044759d8d5a7d248e2bd966524ba8c0c28974726b43bd05de843433cc400598922974623d9acbfdc761c4c04375a952ce54caffaa96acff6d9dc278742af476e1865cb8c20d13d1c1900863bca231e44c6b0d47cb41d510f7958f48f304d03da033484a3e1f273faf6983375b7d3be03d8a0a002def6365beb2fa8ccf1a94987adcd33d0da1177fc5159b6e56d004301e921dbc12ec0a73f413cf2c48 Signature = 6302b3ff2710be306c92b9aae30d23c3d4beff394e63201e6ad11713345c4fcb5cc8d3dd10adfb82bb11a189ce7ec3e4222727624fc17881c14788d2710e1608 Privkey = 54e6bbfbf8c06ff2c066318c2ebf03d506547bf43c2d7a5d4df305a3032b7138 Pubkey = 3b71aa1def666d9188f403f82ed30454aba5bc9f470f6eb988da187c92523284 Msg = 0318d7cb4805af9821dd3f914b0e076fea04a7d2db3a59a00affead3325a2be40c1f87f53276a8552604f228b976e288b9be906a7bd25b2ffab8a8af5d0f6e08786fd034e2fe1eb7ee033979860dd1e5327287e9e615f5dc5a960f17026b56842fc8d44cad002edc8501cfb956001502e4ddc81a7700d9c0be88eb4aaa64a6cbc39de82f13c11086de1a4270d3af97284bac1caef1d3edaa1071666bd83b2ede3962d98b9d93497ddfd8e97dab3089950cf30ed11db77ad1437a0af5889d8efc44e612420e3907267df3acff4bd3fb6e8ca5badf8e72f9de39528653058524456a81da5f84982afac34bef5f71e91f8f90938a6f5f1f287716de56a0946d261e87bc775ce189e41a77baede7320a3c608fc971e55d0a773c4d848d428637f11b4e4460390c Signature = 3df4d09079f830e3f982283681ba37b50f3c73de2c5d22a291358ebb1fb854e510f63f9a48e9fff7fd8311302ea3e969394e6d49c9e3182054942f6a744cee03 Privkey = 6862061be0de9dfd998118204b2b98db3ce7d7e819dbc10794af0ab2b06e8434 Pubkey = 9c5f7c2265dde1b25e4f27ec71580d52dc89f2c3a712bc1ad5d6d69e711e08d4 Msg = 1740dde8434a0d689925679b0c180300cdbd0cf6a89ad8fde34653316cee4c571a4105c9e9e0284238fef2c38a09157c5db94340571b390adfb69ff4c0dc5053253a679d42cc1f1bf1ff429229ea0a5044c6f79564e0dd287f53f015b83187d9ad27d91039af062c437b1575a0eab6aeb8aa0d27b27665d6dea9041ff9963a3118b3298a8544e3fd69ac6877e3e4052fe4422bf03560b2c57ec531ee8b5ff53c28dbde35bb45c35077636e6f841b59d7eb77bc7791b6093858a3a80a3aa6d778dbf53db9d06119c50b71c791c0495c576d1b59d396873ed871485352c8299a359da5ee9d7f36ed1455f89851a30851bea719685aecd08f25562609dd106630735277e1d6519bb1687de8b8c68b9671452edbb3491da264cdfa0017c512d2769759cb925fb664 Signature = 965edb34e8ab8bc3204a3201d22186372de4242600297cfdb57aa1df074ec50ddf10105e9d4c89a266c34db7772aa94cba946429e68ba62bf9a0ac90f5f05b02 Privkey = b2250bbcb268d2477c8312b1900fd99982baa29a68974fbf8778a1228dc97550 Pubkey = 44aa8df1181674b05ade980f7eddbaf3bd7422a920287cb2d2db59a063eebf74 Msg = 7ef0ae1336a6fab37f99da5fa7d0dec7409c072623ead84f241d53d0596b461705fb1b3c537d36b89e8960febb4cdc0d427ce2fc1be58dbbce151e35acd8b6ace40a19822914a4bd8c4af632f136418ac49b184d55193ebcc32d0d798709b1a8fe294fba8a1fe72d976b4400d4a393242311b0f8cc994e89475b0038ae5d8914938e8f6e87c6f50b9d656c45d7b14231efed97f3c90668913670bf5be2efd5c270c7cbaf01e8572e9800978dfe2e10a2fc0440b855629bf9cd409ea941cb69226cac771b15ea77c0326848806ff8d2e201e6e26cd5f45430dadcff8f59c321c1c9c6a29b94882935447d3e6c2e8804b1161576bdf0320fe53c307d9cde426077a7677cde3c1bc83e18e60a0c4ee6dccd877c213a8e4cca640ee04929804570ae1f96157c04357a Signature = f2b8d92ed51ebd1000bf9dd3411a9fa9e7aee54c4c86e24ad0f9ad5c55643a12d680019ca03f216bd4bd32c9ce1cd8a528c3ffaa5d5b1dc91a4be56f0e2c5e06 Privkey = b809361f55cfe8137fbda880fc62cbe44c216e141893346302b336045de21878 Pubkey = fd23e42ff06644ead347abcc1b3e03b0e88593b61254981dd8ae59454e61b3e0 Msg = 17ace197d083aaf1726f53e5ef81b5a8c09222f260ee5f1f5404ab78d900d489688449b843bad3c498aac6d80b4639b76e6e81c55276a6f9c7cecd70b71aaaf2018ef76c0e30154aae86a5c86d4e8d0e4ec68cc427060bd56514f7238086bbef5bfca1f5671b18041838fd013572443dba48fbdd95ca740b0daa4327164a1e34677249708f77bd793e7caa6638b5dc9fbe6f0dfd4120209097209c93cedfaf21b6bf59ca6e99e6209639444f0e827bbcc0a61c3a237ca22a283213223ab658e712c7556238d3a5fe31722d65f5706ef6d64d73232d3043220f14e5cfd3c2c83a83d68e20274b6f96b29de040cec8475030b6a8a87d29808dd381795c3d22acf5dc193b720d95a752d9f123c209ffba004e48dd06dd8c9e172bc9e087d80bc5216c0b0b6e77031241 Signature = b5b5950d3772d2eef88e1b0f5df5ffae2f2103885e71446d346fbb5daef94967a6b7b6e4be885110065876c665b7812de46ad31ec3bfcbeaee13ed0c1e0b300e Privkey = eeef8074c2eb9a1cee2f2d3bb05325546a9fb7cbe44b599461fc5885f5fd9cac Pubkey = 9b892941a0573b7a1673ef480f081168d9b7496a81f9177dc427ca1f84cbbf7d Msg = 9ae39feade905affcbedd2e72a6f2429b3d1108e5bc1a9dbaf490a6299bccd94acc413adacc918b14afa85c78bc168cc00740c3da0e08183915f79b7fe3868ce2a7e886b32ad45009805bfb81b8c07b3b1022420c0f009b889d7fc22fd1997ae34198438ca94778575122fcaaf96e6502c33a75a129a2d0dbb073d93820d9c96683db318990be3fef4cafc890afbd9b1504c7439a08a065e7814ee4f9b6f57ee16baed3f0e3aa35dd23d3528a458919ad77048b4e2e6172346be249a50af02bc6c853304c208ae0ba02771262a0d8a465f71fa0635e53eb2ef0a847d56a0bcd7dd3fe077c92bcdca3069a4a682a2859928315ce3eb445c6072a71492ee82e172a20be0b648b756e6c775376f0c7c3df8e64288089c2f81ce9593c6e08bb1cc1b27fcbd392fc7952c55 Signature = 6f7101984fd6892e2144b7d45619830caeb6713bfab4eebbe217c5becd249bd9d752eb76e9fa995e7c71ff7df86bb260cdda173ff5deec6af204b7dde011de09 Privkey = 61faeb15f857f6557862c8b8c7ef41f80545520996fcc1127b8c2491822201ae Pubkey = 60a290c0fc425a0874673d94f9bb1400f9dacde9954f9f5b05dd48ab747a3950 Msg = 253b566eccb563bd6e480c69739b8e372519a3437254e0e5029cac86c71638f2df2a6cf9e56db2569934deba90db75547e3671747df64d6f2aaf3c110fa67a7094ccbe4cc5355f0d43235136ee26dbe37f4225d3bbfe245595280585fb548f894e86c516102580291fa7a02859557fb98eb588870828b0990ae9d74f3831da58946bc7a5ce1ba498b4e8be8989a3b50d7e8789f56b8b4fecbc2a33bfa3ef591a0fbcd932fa93e19f3a812ae5e4e3b4b242be7705a5874af73be310b0058266a378f23c1348524715b0ccc18d6634b23636c316ba6a1dd2fd5092c06716a717b54d0eb9fc7f636f85bbf225a2cf035b4b7cfddd75351682c0576c6b3ba5a1c0b25ec594e7709dd09a0079772ff3acc67fb6c1b37bb3742b726e77e80561d9ab73160b73362581da5b9c7f Signature = 31f90f50b2dc705f1d92f12ca9975d76f1b2826ada3cc185b0ed6c83860777bd8c489b59855a91f64839d49ba467985abb376c47a4908b271b8f77c58d01fd04 Privkey = e6b9cd4da07cb34f30391cf68f0d87c7cfcf68f810ffa40f9739c95deb037f71 Pubkey = 569ede0f04630b43a04c5a66b6a5636b766c75965984a7477e15491960fdd864 Msg = 69def0523afda696f8448f9c1143abc26533e68695a090df0d9e43d0c0eff43583e6f709d2043c815fbb3f96ba2b0dc3be6fecad5dd38148788e4a0385a9fe7a921fcb8ccee0e4d3aed4bc3d216d84b414f9580b02820c03d92e675e685c4b5851f363bb4df97b417c3fd90022eeafa20dfbe82964f2ff073d255758fbe567c76b2c35e2b09f8a8d7afa32c6f5ad01bc3ebf6e210606db038ecb6820ce1ea4dd529fc1adfbc2a138565ac6d0f4a4109bdd47b8aa6ef4b8bede454680d1dbdb75fe1eb2e548d5de7cb6d792fef3aa0d8480a6030b30f104d7e76b58e9f476ebf2cc832923b50c50c111c3515fc518852323426ca778a596d3195da8585d8c3aa92083313a6e6585b70c98b185b472798a61cde77e62ec272f14b0d9eb4f22f9c7c05817da6fdefe7879a584 Signature = 1e375c94bd809ca0cdd02f89ecec4e437732dd20a0a84b254eae889d8070e682d113b0be22e41e6cdc3be877680e7eeb7f0995e6622dc0b434fb0949dd994b0c Privkey = 4d9044f17b5a0977dc5aa9916a924300a244a1ef7f060277ad4978351ea64291 Pubkey = ab9c0692a606b2567c19c30f9faa3b4cfe72fb237077767b76d3b2ae1490a6d4 Msg = 7c8c7189af67327af1c6dd2c30e975f190e3b38d008b4585167e0d450740d46734587f6d208784245cc5cb062a2a277f17ebb2746f9bdf4a8237ca479ab0a430177e19ed7dd3622576b14cdc08282214fe5ee4d76b43c16ac90864c51be8aed45d7b980df7917f290fdf795846465f27fcb7e5730637944f0577c92f32375e995bc0cda9d7196f2c0c1ac8b80d12a0439963ebd2254c347703575816e7964c13d44d629280c312ea265344de38f3b18d9150f8f924afb44b6bfb9eda513d59e65e2ef18666e6c2a21c4018665befe92cae581d3cb14e23e97d830002cb90931ae0210068af394ebe351be5b817f3674bfbf40049030e4fe505d34a1d502a2c50d8e638e926c230676b7edefb6bec77b1c0ce609325287ba5fdd7a9976987bd07fc6a4344956ebf818f08586c Signature = 6fa48aea4d5b9af65af964cdb709443a11fa84f7d44acddab16e04a6fcefb27ae33c05b36da13c23de517d6e6ac574a03ea630ba4fbb958131129aa7f1354c01 Privkey = 75ad76bb4c0c229a5adc79e444b13f88a96459862c8cf0ba498d0c996af94a7a Pubkey = f074dd2b9c1c309105ec951bb5812a91ddb54023b3809ab379c56af0461af617 Msg = 0ca8c1c74128d74e9d0a7bf8964291d074917f2f9920efb911520567642a50a615abcbd00aed4abbfef1a983cce333e1d0df3e6404fb9043c6803914cd5fffbc66a0790c7878a24089a571f895662a1d18be3f01ff97fb3323334b6f5baf96551448e4090d033c464294d09133b151d5b5c6321b50e2241de0ef6f882889ccf4ad3540d5a1e3f7548fb13be71c16516606e79d0449c2a08e5dc23148843c84e97ed24069161c8e75208f33e95b3e10d1d49a2faef9d986ab62809f62ad39c7cc871f375a4f5a6faf104d7e11b890cfb0589902685216ec07cb8e8e9e7a7c43635e23212b69ca3b7ed54f0b97949e3d9a6662f8e4b3ab09cd495294c331c047d86ee785ff658bcd7fcf9c480605ce05e810068d60fc9b26b5f063eb9000d2657a5094284ac80f1375d0b66d6f5f Signature = 0c4643a8be6dc22f4beb6bcc70c6172ec7608378653cb4e99f3ae795eadf4e982a297609ca7938f5df632b095628cb75062d3d51fc0f3323bfa7b22ec4d47205 Privkey = adc6e9b2e103b62c24ad4346410e83a1a0bd253e4abf77911850c6d9666e09f9 Pubkey = fce316e33c910821beeddd634bedc58ee57999a76ece384605283b99b543b78b Msg = 8cccd98ebbf2439ffdfac41687638faa444e1ca4b63d13e898eaa8355492f28813ab813fd01510e112be106b2045d30f63335d248904d521de181abac03e3d2cb2d16c44b3b012a0c51f9901aef9056c724d7a2c6b2acb0a07555940e4c6e21154890611adeb6489f461d3e5ecd1af5a4d2b0adaf41747436eb414757a8fe4775674e3c6e5de4569d6fc6c788e10905eba32c270a393e6f721a765294e2ac99a9b6e534d3df08d1db97d602ac3195cb0b77f5bd4acaf737fadd6991f0688abc74918047574eac28289739a664e0e0e20574a2c25fde49d14539db1cedd4a9204a70acff0a62c8f25cd768ffab15c4db316840a4d1bc92e212670be07c5bdcf537590607dfbbbb4d9f98b89da0b4df7d88f3eca4814d16bfa20c8d2fa94f9f259f2ee2d3a83c9e4171b1a262c4b99 Signature = cb017d6d2682c9854366259aa35f30d491cfaa930998c297dbddc6aded5b3d401cf76d80d8a2764de131718b6e0c481d7196bc72579716b0c0f6ff053e68c50c Privkey = 37fc1beda4060b6c57883ddba0776c2bcf5ac28a651326021cca97723730fbb0 Pubkey = 7bd7bf1c99dc82e06f08bb454d8fb288a57927e07ff1b12af15ee2c12fbb6b3d Msg = 3dfcac0265a024a83cb932674489a163aac314bf3d969f27596e451733b99deba5eeb779210baf95bf545a1ae6b8a915860693ee890f939320e06a844483d18c6a1bcd03c638bb7d1fe2a82eb448a311b1302ea6428f54a39f45a4d560be1557a2b254c45c137f45cc68356836e21bed0b7f73a518ce09db0be393927c339bf2a4b5987539404ce650284de12e3b553b262efe23848332ccfdc35e791a0ab43f139c71ed0fcb2d173bb377ee46b1a9dca9277e77df855f2830251e31e26acd86763c8d7eac22c882fc174f2b5e75ca6ad1ade03f942bb2a13bf541906159158c68363c7480c5b27a99320f8283a2699d4369c071c50dbd90b7792e4772efbc0b195bce84cc4dcfff7072a48968db69f9feddd0f9ced659eb5db7167f35f988cec114887dcbfdf27d02d300b3e1abec Signature = a01dd65fada27039f168b123419d8abfbda48c572ece24fda06e1a5ec31e084f4ee1cbf9961e88ed51e189fcb7f5f235de1e5b28d08f2bfca190b0f019ecc207 Privkey = 8d42f4ddd2bbd2b827b0a0d31d8f758ebd13a1b9b3712228948ca610bb8858e5 Pubkey = b7354898794f9db0a8af6eeafcdbdf011d3fbef0212ad938a4a4ad27ab16ebbf Msg = e3a2bebc0496d8974a8f4061880369314ed9e440c1b77e26fe5071ce694ffd2136db0c4d5e880e6000083a75c90d3cf72b9cf5a2b1a9002c2701a2ff59b0699a8f42d79dd8a5fb71a8125453d91fb80080a3f0a16584282f17ec7dfdc2e5c69c4d9bdf484d55944dae273f211cfb76ad37da45871365439af35eea1fbecd4ca679b59b5e01bacf49c7f4e5efaa406ba1daeb085482af5ded89dc6885ffbe3d14d2931b83897e28ad06e5564e2789baea81bd932aa279fe8e324b9a8ef111c2abe2f137d4bb50d8ab76cebc0bd982a23919751ad4d49e88eb14173d3310289a872317e4a451e88d54320891870f15b2d53324430877a9fb5b49bb929f211c5b89764dd9c3a595a1451e9f85a238540002566e53a99ed1e6ddc9b4853f455edb4cf1980d56bbdc1313a36e76ea9cbb048a Signature = 70764be39c6dca0f067abe1eca490fda951fd4e9499695266e270b9b05eae706ca8d1ca6a92d7c488ec6ad8ba11457a42a5e31702a9c2bce892dc40535c09f01 Privkey = b62de5a1acfe4ca2d1f0c132afcbdae66fb29a02f297fbc2407fadbbf2454200 Pubkey = b63b2d0bf355f7b6d0bac07403411c40afbbb2f707503b3fc2cee8a1c7d0a838 Msg = e659e51d7b193c4b8e2b3ed73a9d7557ed2bab6153883ab723592f730a914567142b3fa435db3219f83a542dc7a4bd805af666ea865b853146f8e3a9fe870711f90d12b0693492af2a1edf99a16458f781f1266ec437a5296a822ca9d69ce844b5c59097a2a56f3eb8fd273a636116db774300922d45b744657a692f5e8bfbcb06d2422818aeb51e7cda68acfbeda16e7c79580dcccde24e8e3d601b16e063b43a6d0d1407552f7504f5be19882e4ffe32344f5f473e73a8f6ed37b0d8d9e5e0a0dc9828395bcbd8f3a4e3124869249d058be0e045de0b1e12b1c83ba0aa227c95b82bf742c3eac0152b33e6d19be8b33a35bf705daab10622a90aed022ea6e439ed50a9308437929924ba3ab111ad0caa6feb0a6eb165824ebdb0866571efc07e5222ed8686b14d9270bf76b945d52014 Signature = 5cdb00e98de73eab480be42f8a8a6163809a0d37101b6a5a4eed6a0c92030d09a5562c729080ce6f6594c8fafb1f594772db7a90a9e7da15896e82f70569390d Privkey = 9732059d7bf0200f5f30412430336be4ef1e3cae62938ad08729ce3ba714cfd4 Pubkey = 0de8425f5e30b2b8aebb8072009a30cf0411c3c8238f4e4208760c56c33e434f Msg = 1a13e7ab603b48eb896fe17173fb31950b0dcd5a35ffdbe1371c7a5bfba593317589d9652d88797729180b8d0e515abfe6548f160421e537d5c94aef2b34c7ebb097420003bc0f361b423e7e14630a803c118202540049f68c9cf46fae0368d162e400d77bb4523cf6c753b975c245bc99ed2f413a9d06c2da6ce0cc0987b6406b809e8eb319033d2de9131dee3b1b7b5c95d653ced8fccf998da1768511eca4d3c5f735adab96503b3551803e4922635095ef811be4c08a6cbac917cbe6cd91a4ae5a330ccec0e8e815371217a3de62f2d2d61466219833f33447132f4d43350c58cbaf422475edb128c56d80a495726b1fdbc56551eb72d0f4fec26ba8bff5eed6774b85039a5292834b5d1cc1b09ba0a3954d29323673f5e71276a12ac4c579355bf1ecca48e6a716b9fcecdc565c51b9 Signature = fba1749b641dd4df34664bc43c00468c7d75e84afad72de473fd1e9c87da15ea604fc2549a1a867fa80850e9c2a59cd99053886760a8d9764b84dd672676720d Privkey = 9c7f6f379e3857007e2ac6324cbbced57ac9eee4477813f83a81fc8cefa964d5 Pubkey = a54ba396d687634d3eccf41c5782494f5f10a521a1e5d388523d80eeba5b0b2b Msg = 3f2d3072fe7383e541551ea9abdbaeae6a464ae6b9f0ba786a441b2d08da5bcada3c5424dc6931d6b39523e2de0a0c2e4e6b5b8cda925e5eac938416a2c51bf13d49531d7ec7114b1c82feaf90f3f87591e397d02702f8ec1b30d99f5be7d2203e4fe4db2ea47e7b4589d8ac506248d7347466edbc96ea32bf3a6ea7502dd60c9e84902715ab2c6ca68f5b00e1d909d83aa6ab662d8aea870ecd861fec69f2eec0ae677d2995b0ed688faa8ef78244e0d1195697b07122ceaa11f5a6ea58fbdfa2e2ec2df9d18693ae96d47127556e91f0864982c13419b04a63f208e730d26951882aefe001bca3408bd9862748c6cc876c28cac3bb2eb3395818c2091e0fbd7a0b4468c6b0d00cd008c11c3c3ad01080a1f5a40ae2e4b0c3a071efc8e1d1ba6ace6d4df0ff19829b0c680b3aeb759177ed34 Signature = 65685f9ca5982e15a22ba3c83a0348348482dfae57cea178f0780c057baebe4af632f984540a26019a7fb34253c9ece7ff308ada233ce0686347ab5b21ce570b Privkey = a478f35abb73727b6be6ee5e56eec323c9517882fd6919360ebbbf5d5cb8b83a Pubkey = 7a6e266a54d135dda0009ccda8a94a4712ae5cb14761e8436e97c4b7814d8e8c Msg = 0173a34050b43748061ff8f5a3d7c43b6360847786e8bb75e536fb47b645b214f221ba24d83d28bc025024663e534f90f6e83a93d8bddeda2cd8808155652a908c437c2db6f3ed4912f57ca5b97928a73be964af59df4439854bb006fc295a87b7b72239c7fadfec40715509d98579daadfb8d524b4cec6620705efd4104c297144aea722974e12c5ecee5391ef2d93ac2b124e4ac496147c8b70363585d7078ccc53e2ae593350bc25548a0542526ab00afe477a0f4b27397c72bc74a8a8ab156e62b8bb47c3fbb4b34913e459687476bf33142c614702107ffe2cc01e25fa30275e1e2e63cea9168e4a47c02de097d4d853b27675c5bb330b94a974ead85e2bdee8ee17cbb5653346658df2f91f6bd739491dd71988b3a976a3e2e7a9d137410f4acba9feb5f11798c9a43b6adce14365a7c6d Signature = 9d16fd40b9f8dd9b4a1a8c6d703b9fccbb940b1e0ae77a5970374af0cf726f4479fd30d7dff5cf53494d9a296ab6b9e46ea6c136b4db2c71c21b97c1c8254d0a Privkey = ffe825148c0959b3a68de86ad8e8af7fa5e078f363dc124213c90020da0c9089 Pubkey = 139152a0bd22962dd919ae3e0b1620e03c033c2ad0a3979ec6bcd1705e23d598 Msg = f125780d0cd088530f0c87b70bd42ebab56adb5ad4345f929ae5deae07fb55322153a8f023d38843bf5d6a93fe993eee71bc2ee563b25a50918f03efdb5dbf7269add69ded3e66953895620d9b6cf46ba2348f8d66d7f092235e378c1e3edfebeb78084bc8dea013f9933aae14a041948276d01f1cb5834b0e590e13d931d19292bb1d8041ff2fe2e1171a2e0b9a059821d0924dde7f3b1bb59813f5e3c63520aafb8801ba62c7097d4d8cf437a568a7f0087c6ea0fce6e568c4883f1cd12c749d06a6feb278f1086a8b04769921f78a9959062ab06f98ee80c2c7854ffa760f86a89ee1a51266053d195e61bb1dbd18dd89ff394e408ace0f641a395d56118ea72b7d8adf78b1655ecece7e8250e8a3a91cb8fca0d9ce0baf8980a387c5ed4318663280e5b4531f3187c47eaea7c329728ddd0e40 Signature = fe4e89ee31786c0a3d3de3649bb93f0b8aef1caf5a832ec5e4067810705adddf539b8f4e05ad08cf3479e45b42c96528f6d59a4625703ddbf15b63093965d80d Privkey = 49aff421a7cd12722aa84c48c1fb1c5f8d9e277d0a99ecbc9348c3aaa74be422 Pubkey = 88d2c26266f493bc67578ca0b1f51160cf0fdb6a09a906db9faa686f11f8208d Msg = 70a1ac144b75fda75586a79c36fd39cce5f5cae2e6375852d3b62a9630336a293ea6d2ac6e5b57da21ef364a595bb0750f5bf4d2b320676423870e4b8e0869601f16680619048c4ede276da69f205a70176e25ea04bd089763e709ba343fc8831e52044eabf9441e6997f8ba1aeb9ef0f491170667a7f5fc9627cbd0551b76be27283a4b0c5f667846688226a115ee8020df08042b19b59fe551316a6cb6916860b9ecd74154b4051038a17352372ec14d3c957d2ef50ff786189a8aeb9c08f45eeb5eb8b040339974aa9798c425d7becb228c447a6d0b3cef271893e0f7076e223a7e87c6a3d270a033bc97a4565edce0aa91ffc3f7801775a6f29b230245bd71fa034353de372395d1bfcbdebba081330f7c076be99c2cf4867f15b78d52f46fc7391c9cb95e5d64643baffe72a8e3a650667fbb3e Signature = 749181284df05dbe5974b91782a1a76ea08642cb0f0c98db586c575c210cdc8b651bd34b757ae38e4b6be9465235bd0eca430e26c3eede561c6e824dfa200e0a Privkey = 703a6e2b62d0090c61d8659b6a963e03c9d62c1b38f7d70e5f9ff05590cd0360 Pubkey = 370c21de6ef2fab534ada999869c90bc9b92ccbf249b79d39d95441d1ede210a Msg = d42a1756e84df4b4e9773f86f7674a2cd78e71e40aa8f644e6702dfbc2c2c5ca90fc242e9cb0099cc8f2c2d3136baafc0ff695482fdacdef9f565610b6e1900722f435c6385b35e9f6c436ca037e03f64e2233dffa58db3b91cc1daa0bb0c54c8a43e469d2cff7fa2bf8f5d1d877931089c82ed89aba42f2ee2b86e445cfd09f4cd78b35191bf467e784eef75dc987e046d37d4d4e8e9bbe14af80d03a1f40898384b9d3279fac9c57fd9c7eecbe19a5acc15033b84e07fd0e409bdbd5a57f65641183a6c0a8ec426d1f1d223166ff0a1900b2e92b7d85835d019d17775e5093ccd126f90f63cb7d15cbeb531324219cd64ded6714b21a65371af07210dfdf0e4e58ddc7d59f4cfa65c421d814ee2c9bf6dbf64873d579b09ee5dcedd733063e039ac9a5f9ca4c2525a4cc8e984da7185e2d64fad81c8a Signature = e5fd64da028800c6ceed068a5e596f1621c70a8cb138b31b32647eb4b07bd2ecc5942c18844f367033f67398e314ba2c7ccf299c069787777025d845f2aad60e Privkey = 76849c188e3edd0ff5f8fb874dc0456645518445e41a7d6833e616c3c48c9868 Pubkey = d670e2ea07db60c22ab79a93ebf49d22a6245ee3af07b3be584eda694c37729e Msg = 1eccb0bc8eca3ab5bee68c5f8caa34536766c705f50827db7ac375d4fe30b58ffb7e2fe490cc71a8ff86c006d6174d05793ab8a55dd51b06de417bc0ac452cdc7cfb0bb00362b6765d20db23eb1848027064a1d9091d3b10ed776f28b76768bdfc08f0bc511f76faeba76cfc4cb5c83dc9ebe8a8d79edca923eccd524009cafedc90e3ad87d1392e1fccf4e60ccab95dc0ab54bf44245a007a96d46634b1b2965b829c3d7daa765972b54a7b365b6f34d77d7176acd8d894f6b417091b6c00edb7a4e81379988bfcecb692e9c3c4310a7e240e5c1063cde113f22a684a50a112ff47d3898812efb92637072b86163ad89316d221195acbfad0a03a1fbc2d967fe83f84c8459fccd490b9c5b3e55d27e9484e943c417f2128d73701da28f49fd3683f33a39cdee234bd305b9491e2f3eb621be3dd1dbbb31b Signature = 7141399d51daa6eb4519bf3f01b233920fa908fefa612f0cd7d5af8a9a3c44190e3f6384a8d14d37c97030ef5018cf8aee8aeb1569a73d84862a59b7df72fe09 Privkey = 83ae48ad70da0bb3cdf87481ee2c0c8571c2ca986712f8bc2329e9a3e33383c5 Pubkey = b785309000df95f5a04f7d89c4113301057adaeeb29bcd28d99371b537bba2f6 Msg = b7521d3f71c679fa7037fe7488a641f6b97c49454acc8e36b903d8f9ebb54d89cb56efd19e04ba6a7c8f48a7d3ec9decd3f1cd0faf6e978118e6adce9c6c6be63c6a6a1ae21651828479a46bc9a0f7943040f940a0d470c8e577c5d575cb53c1bf3ab1feb050dcb6fef0ba4447f299fdb9f27ecb0714ecfefd74bad7b122a462c24a209848a03389074578c5bdc36396d809b0f14018da64917e6bf87ef405c8f3e333ff9c3baf6339667620794bb4743f0514b5de7d7fdd947a7e3501ee88efad159e33a1072fbb99c7c71e9d13a502d5a07c4f817eeb7f0c5319aa41a96d5ff4f15a73c29b571fe211090e172c8db518624612a5c371a9d7cef6de35ebef96e88e1a78af3bd5dd35251ab54d73718f3e70d2d59021531dc73184f0fc69c2e92965844ec27c1c02af5e9a3469de355db2256e0ec2a4eba30a Signature = 43332351d3fb7b45fcf37c607d442ea80dbda2cb69c2884f424e65ea3a331ed8472d4368405cb736b2d6685ad782e239fe833ed789a2923185166f608342ee05 Privkey = 39e56a65623a0aebade0da12ce1df378bc924073f73a549effaebc465d1a78e2 Pubkey = 83da8ad50bad09eb3e94c725df3cc3a119736adc859ca1a10503f48ff2fec596 Msg = a96dc2ea3fa1351492a4619d9194681f8ec400a97158244482653838ccb7e156a82d564368f83a6ee1be46bc34b817200e8464c3d12b5ef2c50b19565b881c4c3d4563fb947eb47c3ee9c1ee7853269874455bfacba305f307d1ac5309eeae5c07fa5c4d428edbc8b9528c4415243a9ef580aff8fcfb12000a71fceee89de97f90279529bcc822ed3cb34c82ba5fec15f4945663636d67b5feceacc31d25f98aea07f7800d5a1034251cb91dd0963ec2c1a54773a4d96c18357f8d101de58e932f8c6cdde8e3cfcef5a7443fdba7b78320403c0196844724a612183e34bdd808ce7b958861ca37115730eaede1fd0baabe976efefd0365fdf926776c536f47ff80de5c18291bb7e9f1b913ffd1d94468b789752fae6ca897c0cca53ef1e731d00c8bdbe8929ea6b1dce1f31a20688d37b0f3a2b4153b306bdba1 Signature = 398e8260011f57d8ac8c58d5457bc652c7414aaf6fb2f426b7899056605c0afc28392423b2b571f5e6c3c7f6d60245e53ebd03bdc5ad3c1ad8738cb32214d00f Privkey = 4b9921852f409a323ae38175e8d76a211fc4d9c654178eea3baa7a767a6fda06 Pubkey = 4c723e436b6bd97f44af52503b21cc50d5f6ad6cfc8288345dde8054e995582e Msg = 3f33d8fb83e68741090a37bedd745cf141aaaed8c92ffa742a52561777885805ace14246ab98a8cb598c9ce3de9b29bae5fa04b1cf828de11aff80a7ef8a3a38aede4f3c3563a25d049badcad5ed7e47fdbba6e111307eebe9ef4906bc989728b76e84afe808e6653b271e21104aa665f1898dd2aab23090e22b4e344a2616fbd8ee4ad8ed8108395eba817fbd14fec5c17dcf56b8220856b2b833e091407d5089b35ddf34b86ff7dc9fde52b21ef12176ef3370b7f3a0a8cb1b058a51aefff3d279d80f51a68bfb592587b45c5c63a7e4d625b887de486a118316c3b6a238575f92ac5b1c94c3f5dbbd96686000d6d39cccd558d420e4d447a8cbc4bc7b8c6a03af0f0034fb3518d93800f0f713e4b13732e16ada51801d7e559cf839d1058f64955698311399345416850dddcc5601a684fd09e6afd3944f5e19 Signature = cbf1f1642df950eb71fd09590d34c265922c58bd8026bba3fc0e594a6bb1f2b90da3dc1d5f6b6d5b405a896d1dbb71b8685c4dfc444acaffe65ab8331789f507 Privkey = 1bff652a2c8309a393ac11da3aa97fb078bb284ed5e1b8ccc983652ef8556cd0 Pubkey = aaabdc091fc3682354201744e9b73fd2a6cfb281914bf2c70ec3dc1dec7216b0 Msg = 48d02698a97bdcb3ef078dcfcf5750005f1702d300e7e89bc436e381113401f852b8b4acff60ffbd4ab46d202168d98b8735e79cb350e35b070ff6bdcafd954b551969b6b1a70c9131ebd40d96140291d8d2b091540a8b18d8e5465915c25dbc6b5c9a687942533c372c8b4e95a953677169b950edd3464375cd43132ff9bd541ee22bd418ce23195f65d8b289f633ec8d71e1a801b06c3c827f627e723d2199100ce73e8e4a4440e778317a474910793b47b10ffb55db7f281c7d7a033bd80048b82673b87cf95e99422ba628688f3c971890ca15d12f572fa1977a17307069da304ead3026eb01042668890d17008cd1e92c46cbe9c857e7193de3aba3911e4f86fe0a1698ab7cdb9251a8424b2848b96ad81ea239d365fdea92ea5c0473d0a6bb1e371356bdfad2d0350336d3e1947c936fd0c25195445011731b Signature = 93c9c33493fc64172d51e16a0a1cd729a0d99e3cb864e89a42987f39dd8cd26545fdfe37581911e803677da4c55b0a683ddf62b728f8f30685ae58f628ebe609 Privkey = 002fdd1f7641793ab064bb7aa848f762e7ec6e332ffc26eeacda141ae33b1783 Pubkey = 77d1d8ebacd13f4e2f8a40e28c4a63bc9ce3bfb69716334bcb28a33eb134086c Msg = 5ac1dfc324f43e6cb79a87ab0470fa857b51fb944982e19074ca44b1e40082c1d07b92efa7ea55ad42b7c027e0b9e33756d95a2c1796a7c2066811dc41858377d4b835c1688d638884cd2ad8970b74c1a54aadd27064163928a77988b24403aa85af82ceab6b728e554761af7175aeb99215b7421e4474c04d213e01ff03e3529b11077cdf28964b8c49c5649e3a46fa0a09dcd59dcad58b9b922a83210acd5e65065531400234f5e40cddcf9804968e3e9ac6f5c44af65001e158067fc3a660502d13fa8874fa93332138d9606bc41b4cee7edc39d753dae12a873941bb357f7e92a4498847d6605456cb8c0b425a47d7d3ca37e54e903a41e6450a35ebe5237c6f0c1bbbc1fd71fb7cd893d189850295c199b7d88af26bc8548975fda1099ffefee42a52f3428ddff35e0173d3339562507ac5d2c45bbd2c19cfe89b Signature = 0df3aa0d0999ad3dc580378f52d152700d5b3b057f56a66f92112e441e1cb9123c66f18712c87efe22d2573777296241216904d7cdd7d5ea433928bd2872fa0c Privkey = 25b0f0bb3dcb422a6f3c6c220eaadb11dbfe489c2d455b276cefe8cba057f9f3 Pubkey = fe03c9c4394adc74b13f47654bead8bc855958b4194fdab2097ac1b157933c05 Msg = 54d99f969efa8870fc20fa9a962bb372619c324439728af3139c2a07e8c1b29c1e4eedc2d40ba722f63ce37670362af6f5202add668c4fb4d62fa8bacbc7d07ff3bd38c15a01064259cc34134861632967460541a99b8d5182bf59347b5a59879aa3b091a1f3e04135bd6301be5226d4895e5e9c2b15e48e5ecdf44129e6122853a606fc118466fa720b5ab165635c3bde04d74289274fa03547accbde780e1fa0bf2c56f8436a53e73878a424a29aa9de385dba419ae6a5d12e004276152b58d325b302400a55333c38cde4908ae1d0121cbeca950809c543314277c1485e68d9f9c0a962d1b1e0dda1d4a52b56f8308a80b92acc9f4ebc3ed45d91a129da8675621af676703def3b84113183b2e3a8c56157f243f13980f3d1756fea7668c91503d35c839a2120c79ec954fb546d7b542f987289534ffdef62d47fd5ec Signature = da50d5242bf51c3951780cafd926d67bdf5640d5d3bb08433831d56e48e2592a1c375968bb4d2fbea56145abf2d82991363b1565fa1effe214011a686e39950e Privkey = bf5ba5d6a49dd5ef7b4d5d7d3e4ecc505c01f6ccee4c54b5ef7b40af6a454140 Pubkey = 1be034f813017b900d8990af45fad5b5214b573bd303ef7a75ef4b8c5c5b9842 Msg = 16152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64 Signature = 279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc07 Privkey = 65de297b70cbe80980500af0561a24db50001000125f4490366d8300d3128592 Pubkey = ba8e2ad929bdcea538741042b57f2067d3153707a453770db9f3c4ca75504d24 Msg = 131d8f4c2c94b153565b86592e770c987a443461b39aa2408b29e213ab057affc598b583739d6603a83fef0afc514721db0e76f9bd1b72b98c565cc8881af5747c0ba6f58c53dd2377da6c0d3aa805620cc4e75d52aabcba1f9b2849e08bd1b6b92e6f06615b814519606a02dc65a8609f5b29e9c2af5a894f7116ef28cfd1e7b76b64061732f7a5a3f8aa4c2e569e627a3f9749aa597be49d6b94436c352dd5fa7b83c92d2610faa32095ca302152d91a3c9776750e758ee8e9e402c6f5385eaa5df23850e54beb1be437a416c7115ed6aa6de13b55482532787e0bee34b83f3084406765635497c931b62a0518f1fbc2b891dc7262c7c6b67eda594fa530d74c9329bad5be94c287fbcde53aa80272b83322613d9368e5904076fdbcc88b2c0e59c10b02c448e00d1b3e7a9c9640feffb9523a8a60e1d83f04a4b8df69153b Signature = 7a9b736b01cc92a3349f1a3c32dbd91959825394ff443c567405e899c8185ce8fad9500e1fce89d95a6253c00477435acf04bff993de1b00495def0834ee1f07 Privkey = 0826e7333324e7ec8c764292f6015d4670e9b8d7c4a89e8d909e8ef435d18d15 Pubkey = ffb2348ca8a018058be71d1512f376f91e8b0d552581254e107602217395e662 Msg = 7f9e3e2f03c9df3d21b990f5a4af8295734afe783accc34fb1e9b8e95a0fd837af7e05c13cda0de8fadac9205265a0792b52563bdc2fee766348befcc56b88bbb95f154414fb186ec436aa62ea6fcabb11c017a9d2d15f67e595980e04c9313bc94fbc8c1134c2f40332bc7e311ac1ce11b505f8572ada7fbe196fba822d9a914492fa7185e9f3bea4687200a524c673a1cdf87eb3a140dcdb6a8875613488a2b00adf7175341c1c257635fa1a53a3e21d60c228399eea0991f112c60f653d7148e2c5ceb98f940831f070db1084d79156cc82c46bc9b8e884f3fa81be2da4cdda46bcaa24cc461f76ee647bb0f0f8c15ac5daa795b945e6f85bb310362e48d8095c782c61c52b481b4b002ad06ea74b8d306eff71abf21db710a8913cbe48332be0a0b3f31e0c7a6eba85ce33f357c7aeccd30bfb1a6574408b66fe404d31c3c5 Signature = 4bac7fabec8724d81ab09ae130874d70b5213492104372f601ae5abb10532799373c4dad215876441f474e2c006be37c3c8f5f6f017d0870414fd276a8f42808 Privkey = 00ad6227977b5f38ccda994d928bba9086d2daeb013f8690db986648b90c1d45 Pubkey = 91a4ea005752b92cbebf99a8a5cbecd240ae3f016c44ad141b2e57ddc773dc8e Msg = cb5bc5b98b2efce43543e91df041e0dbb53ed8f67bf0f197c52b2211e7a45e2e1ec818c1a80e10abf6a43535f5b79d974d8ae28a2295c0a6521763b607d5103c6aef3b2786bd5afd7563695660684337bc3090739fb1cd53a9d644139b6d4caec75bda7f2521fbfe676ab45b98cb317aa7ca79fc54a3d7c578466a6aa64e434e923465a7f211aa0c61681bb8486e90206a25250d3fdae6fb03299721e99e2a914910d91760089b5d281e131e6c836bc2de08f7e02c48d323c647e9536c00ec1039201c0362618c7d47aa8e7b9715ffc439987ae1d31154a6198c5aa11c128f4082f556c99baf103ecadc3b2f3b2ec5b469623bc03a53caf3814b16300aedbda538d676d1f607102639db2a62c446707ce6469bd873a0468225be88b0aef5d4020459b94b32fe2b0133e92e7ba54dd2a5397ed85f966ab39ed0730cca8e7dacb8a336 Signature = dc501db79fd782bc88cae792557d5d273f9ba560c7d90037fe84ac879d684f612a77452c4443e95c07b8be192c35769b17bbdfca42280de796d92119d833670d Privkey = 1521c6dbd6f724de73eaf7b56264f01035c04e01c1f3eb3cbe83efd26c439ada Pubkey = 2f61a26ffb68ba4f6e141529dc2617e8531c7151404808093b4fa7fedaea255d Msg = 3e3c7c490788e4b1d42f5cbcae3a9930bf617ebdff447f7be2ac2ba7cd5bcfc015760963e6fe5b956fb7cdb35bd5a17f5429ca664f437f08753a741c2bc8692b71a9115c582a25b2f74d329854d60b7817c079b3523aaff8793c2f72fff8cd10592c54e738df1d6452fb72da131c6731ea5c953c62ea177ac1f4735e5154477387109afae15f3ed6eeb08606e28c81d4386f03b9376924b6ef8d221ee29547f82a7ede48e1dc17723e3d42171eeaf96ac84bedc2a01dd86f4d085734fd69f91b5263e439083ff0318536adff4147308e3aafd1b58bb74f6fb0214a46fdcd3524f18df5a719ce57319e791b4ea606b499bfa57a60e707f94e18f1fed22f91bc79e6364a843f9cbf93825c465e9cae9072bc9d3ec4471f21ab2f7e99a633f587aac3db78ae9666a89a18008dd61d60218554411a65740ffd1ae3adc06595e3b7876407b6 Signature = a817ed23ec398a128601c1832dc6af7643bf3a5f517bcc579450fdb4759028f4966164125f6ebd0d6bf86ff298a39c766d0c21fdb0cbfdf81cd0eb1f03cd8a08 Privkey = 17e5f0a8f34751babc5c723ecf339306992f39ea065ac140fcbc397d2dd32c4b Pubkey = 4f1e23cc0f2f69c88ef9162ab5f8c59fb3b8ab2096b77e782c63c07c8c4f2b60 Msg = c0fad790024019bd6fc08a7a92f5f2ac35cf6432e2eaa53d482f6e1204935336cb3ae65a63c24d0ec6539a10ee18760f2f520537774cdec6e96b55536011daa8f8bcb9cdaf6df5b34648448ac7d7cb7c6bd80d67fbf330f8765297766046a925ab52411d1604c3ed6a85173040125658a32cf4c854ef2813df2be6f3830e5eee5a6163a83ca8849f612991a31e9f88028e50bf8535e11755fad029d94cf25959f6695d09c1ba4315d40f7cf51b3f8166d02faba7511ecd8b1dded5f10cd6843455cff707ed225396c61d0820d20ada70d0c3619ff679422061c9f7c76e97d5a37af61fd62212d2dafc647ebbb979e61d9070ec03609a07f5fc57d119ae64b7a6ef92a5afae660a30ed48d702cc3128c633b4f19060a0578101729ee979f790f45bdbb5fe1a8a62f01a61a31d61af07030450fa0417323e9407bc76e73130e7c69d62e6a7 Signature = efe2cb63fe7b4fc98946dc82fb6998e741ed9ce6b9c1a93bb45bc0a7d8396d7405282b43fe363ba5b23589f8e1fae130e157ce888cd72d053d0cc19d257a4300 Privkey = 0cd7aa7d605e44d5ffb97966b2cb93c189e4c5a85db87fad7ab8d62463c59b59 Pubkey = 4889855fe4116b4913927f47f2273bf559c3b394a983631a25ae597033185e46 Msg = 28a55dda6cd0844b6577c9d6da073a4dc35cbc98ac158ab54cf88fd20cc87e83c4bba2d74d82ce0f4854ec4db513de400465aaa5eee790bc84f16337072d3a91cde40d6e0df1ba0cc0645f5d5cbbb642381d7b9e211d25267a8acf77d1edb69c3a630f5b133d24f046a81bf22ff03b31d8447e12c3f7b77114a70cbd20bbd08b0b3827a6bbcf90409e344447a7fbc59bdd97d729071f8d71dcc33e6ef2cbab1d411edf13734db1dd9703276f5eb2d6aa2cb8952dd6712bfae809ce08c3aa502b8135713fac0a9c25b1d45b6a5831e02421bba65b81a596efa24b0576bd1dc7fdfb49be762875e81bd540722bc06140b9aa2ef7b84a801e41ded68d4546ac4873d9e7ced649b64fadaf0b5c4b6eb8d036315233f4326ca01e03393050cd027c24f67303fb846bd2c6b3dba06bed0d59a36289d24bd648f7db0b3a81346612593e3ddd18c557 Signature = bf9115fd3d02706e398d4bf3b02a82674ff3041508fd39d29f867e501634b9261f516a794f98738d7c7013a3f2f858ffdd08047fb6bf3dddfb4b4f4cbeef3003 Privkey = 33371d9e892f9875052ac8e325ba505e7477c1ace24ba7822643d43d0acef3de Pubkey = 35929bded27c249c87d8b8d82f59260a575327b546c3a167c69f5992d5b8e006 Msg = 27a32efba28204be59b7ff5fe488ca158a91d5986091ecc4458b49e090dd37cbfede7c0f46186fabcbdff78d2844155808efffd873ed9c9261526e04e4f7050b8d7bd267a0fe3d5a449378d54a4febbd2f26824338e2aaaf35a32ff0f62504bda5c2e44abc63159f336cf25e6bb40ddb7d8825dff18fd51fc01951eaedcd33707007e1203ca58b4f7d242f8166a907e099932c001bfb1ec9a61e0ef2da4e8446af208201315d69681710d425d2400c387d7b9df321a4aec602b9c656c3e2310bff8756d18b802134b15604f4edc111149a9879e31241dd34f702f4c349617b13529769a772f5e52a89c098e0dca5920667893a250061b17991626eb9319298685be46b6a8b68422444fa5a36bcf3a687e2eccb9322c87dc80165da898930850b98fc863cada1aa99c6d61c451b9ccf4874c7f0e75b0a0c602f044812c71765adaf02025395b0 Signature = 985ca446ddc007827cc8f2852cbd8115ef8c5975e9d7ce96d74dfed859aa14a4c15254006bea5e08359efe2625d715e0897ee5a16f151203be5010418637de05 Privkey = beedb8073df58f8c1bffbdbd77ec7decb2c82a9babecefc0331507bdc2c2a7e7 Pubkey = b27e908b805e296fc30d2e474b060cd50c0f6f520b3671712183bd89d4e733e9 Msg = 35ca57f0f915e5209d54ea4b871ffb585354df1b4a4a1796fbe4d6227d3e1aba5171ed0391a79e83e24d82fdafd15c17b28bf6c94d618c74d65264e58faaacd2902872fdd0efa22e8d2d7ce8e3b8197f0c3615b0a385235fa9fd8e4564ee6e6b1650b4cfb94d872c805c32d4f3a18f966461d3adbb605fa525884f8eb197627396ba4d995d78ac02948a0eaabb58519b9a8e2e7985cd1de2c71d8918d96a0168660ce17cddf364e3ec0d4bd90f2104751a1927ee1d23f3e7a69840ed040b00e5f6e4866ec58813149cc382aebf6162608c79574d553f47230e924a0ef1ebf55d8e1a52abb62a2d7ac86027c7c03cc83fa1949da29e2f3037ab986fd2fffe650e3149babae5a50b1ee9696f3babec72e29697c82422814d272085500fd837fe3c7a973ef4c169af12dd7f02700620bb045bdbf84623f326350570b3cadbc9aea4200b28287e17ab Signature = 8c890cccadc7760e1e82e43c44b3dc0b685a48b479ae13cc0a6b0557d0fb1cbabba63d2a96843412ea8d36c50acbf52b92cfb2dce49dc48af6ddcf8ee47a8608 Privkey = 9184ef618816832592bc8eb35f4ffd4ff98dfbf7776c90f2aad212ce7e03351e Pubkey = 687b7726010d9bde2c90e573cd2a2a702ff28c4a2af70afc7315c94d575601e5 Msg = 729eb7e54a9d00c58617af18c345b8dc6e5b4e0f57de2f3c02e54a2ec8f1425ec2e240775b5ab0c10f84ac8bafda4584f7e21c655faecd8030a98906bd68398f26b5d58d92b6cf045e9bd9743c74c9a342ec61ce57f37b981eac4d8bf034608866e985bb68686a68b4a2af88b992a2a6d2dc8ce88bfb0a36cf28bbab7024abfa2bea53313b66c906f4f7cf66970f540095bd0104aa4924dd82e15413c22679f847e48cd0c7ec1f677e005fec0177fbd5c559fc39add613991fbaeae4d24d39d309ef74647f8192cc4c62d0642028c76a1b951f6bc9639deb91ecc08be6043f2109705a42c7eae712649d91d96ccbbfb63d8d0dd6dd112160f61361ecdc6793929ca9aef9ab56944a6fa4a7df1e279eaf58ce8323a9cf62c94279fff7440fbc936baa61489c999330badcb9fc0e184bc5093f330cbb242f71fb378738fea10511dd438364d7f76bcc Signature = b3c24e75132c563475422d5ea412b5c1e8e6e5ea1c08ead1393c412da134c9a1638284ea7e2ca032fe3d3e32a9066a8c8839903f6ef46e966bb5e492d8c2aa00 Privkey = 354e13152ee1fe748a1252204c6527bdc1b1eb2eb53678150e6359924708d812 Pubkey = d45ff6c5fb83e7bb9669aa8960deb7dbc665c988439b6c9ef672c6811dc8bcf6 Msg = 8e5fccf66b1ba6169cb685733d9d0e0190361c90bcab95c163285a97fe356d2bdcde3c9380268805a384d063da09ccd9969cc3ff7431e60a8e9f869cd62faa0e356151b280bc526e577c2c538c9a724dc48bf88b70321d7e1eeedb3c4af706748c942e67bdabdb41bec2977b1523069e31e29b76300288f88a51b384b80cc2526f1679340ddec3881f5cd28b0378d9cd0a812b68dd3f68f7a23e1b54bee7466ac765cf38df04d67441dfa498c4bffc52045fa6d2dbcdbfa33dfaa77644ffccef0decdb6790c70a0d734ec287cc338cb5a909c0055189301169c4f7702c05c0911a27b16ef9ed934fa6a0ca7b13e413523422535647968030edc40cd73e7d6b345b7581f438316d68e3cd292b846d3f4f7c4862bc7e6b3fb89a27f6f60cd7db2e34ec9aae1013fe37acff8ad888cb9a593ef5e621eae5186c58b31dcfde22870e336d33f440f6b8d49a Signature = de2b46e65f3decef34332e500f2e11306fbdcf1be85a1c1ee68ba3045dcec2c7be608d22927da1f44c0e2083ae622cf3c29d893887994efcfa2ca594f5051f03 Privkey = 7ff62d4b3c4d99d342d4bb401d726b21e99f4ef592149fc311b68761f5567ff6 Pubkey = 7fdfdb9eca29d3f01d9486d7e112ce03aa37b91326a4283b9c03999c5eda099a Msg = 99c44c796572a4823fc6c3807730839173774c05dbfc1492ed0d00509a95a1de37274b3135ed0456a1718e576597dc13f2a2ab37a45c06cbb4a2d22afad4d5f3d90ab3d8da4dcdaa06d44f2219088401c5dceee26055c4782f78d7d63a380608e1bef89eeef338c2f0897da106fafce2fb2ebc5db669c7c172c9cfe77d3109d239fe5d005c8ee751511b5a88317c729b0d8b70b52f6bd3cda2fe865c77f36e4f1b635f336e036bd718bec90ee78a802811510c4058c1ba364017253aa842922e1dd7d7a0f0fc9c69e43fc4eaeffaaf1ae5fa5d2d73b43079617baba030923fe5b13d2c1c4fe6fac3f2db74e2020a734b6121a0302fce820ba0580ce6135348fdf0632e0008df03ee112168f5cfa0037a26a1f69b1f1317edf2a3ab367455a77e00691215d7aa3133c2159d3da2b134cf04f0defbf07a6064011e64dd14d4f8f064356655428804c2771a Signature = 058f79927fbf6178724815c7b11c63baaa90bcc15d7272be082f8a9141861c816433055f6cf6491424853f9ec78bb91ace913a93411b4e5ed58bc4ba5715c60a Privkey = 6cabadd03f8a2e6ebab96a74f80e18164e4d1b6baa678f5a82e25604af989aaf Pubkey = 2a4a3179564194e00100c18bc35351d8b135bbae5b32b28fce1d7b6766ca4b32 Msg = 279f78cf3b9ccfc6e1b01e1a82f50ed172e9a8e1e702bb15661dd7dc3a456ff7a7a7fdfb081db3867079630c7f70fd753292ec60ecbf50632e9aa45b996505c66e6dc3c6ae892e21b6a8705e4bbae8f16a3378554b31fdb0139dcd15c96a8a7e4b88756a86d18db5dc74fd7691197dd88e2c7d5df52b049344cdc477c9cd7e89eda99ccfb1d00814d0152b9654df3279372ca5f18b1c946f2894a76b079ddb1c3cd61fbb969aeec9193a6b88fb7d136c07f9821e5c1074b4e93bcaf6fa14d0d1d7e1707589d77ec1337206e53a1f06cc26672ff95c13d5ff444766931ba30a0afdcdadd2098e9c41fd87a3f23cd16dbb0efbf8092ce33e327f42610990e1cee6cb8e54951aa081e69765ae4009aeed758e768de50c23d9a22b4a06dc4d19fc8cbd0cdef4c983461755d0a3b5d6a9c12253e09568339ff7e5f78c5fdf7ec89f9186a621a8c0eed11b67022e Signature = 4e65c6c1d493045e8a9250e397c1d1d30ffed24db66a8961aa458f8f0fcb760c39fe8657d7ab8f84000b96d519717cff71f926522c1efec7f8b2624eae55f60c Privkey = 0fa0c32c3ae34be51b92f91945405981a8e202488558a8e220c288c7d6a5532d Pubkey = d6aee62bd91fc9453635ffcc02b2f38dcab13285140380580ccdff0865df0492 Msg = 53f44be0e5997ff07264cb64ba1359e2801def8755e64a2362bddaf597e672d021d34fface6d97e0f2b1f6ae625fd33d3c4f6e9ff7d0c73f1da8defb23f324975e921bb2473258177a16612567edf7d5760f3f3e3a6d26aaabc5fde4e2043f73fa70f128020933b1ba3b6bd69498e9503ea670f1ed880d3651f2e4c59e79cabc86e9b703394294112d5d8e213c317423b525a6df70106a9d658a262028b5f45100cb77d1150d8fe461eed434f241015f3276ad7b09a291b4a7f35e3c30051cbf13b1d4a7fa0c81a50f939e7c49673afdc87883c9e3e61f5a1df03755470fda74bf23ea88676b258a97a280d5f90b52b714b596035bae08c8d0fe6d94f8949559b1f27d7116cf59dd3cfbf18202a09c13f5c4fbc8d97225492887d32870c2297e34debd9876d6d01ac27a16b088b079079f2b20feb02537cda314c43cb2dca371b9df37ed11ec97e1a7a6993a Signature = 7e9ab85ee94fe4b35dcb545329a0ef25923de5c9dc23e7df1a7e77ab0dcfb89e03f4e785ca6429cb2b0df50da6230f733f00f33a45c4e576cd40bdb84f1ae001 Privkey = 7b06f88026fa86f39fce2426f67cc5996bedd0cfc4b5ebb1b5e3edbb47e080aa Pubkey = 3f1469ee6a2e7867e2e9012d402cf5a4861497c01df879a1deb1c539830b58de Msg = 71175d4e21721297d9176d817f4e785d9600d923f987fe0b26fd79d33a5ea5d1e818b71f0f92b8c73afddabdcc27f6d16e26aafa874cfd77a00e06c36b041487582bb933760f88b419127345776ea418f83522254fed33819bc5c95f8f8404cc144ebf1486c88515409d3433aaf519d9920f5256e629419e9a95580a35b069b8d25533dfcbc98ad36404a951808e01378c03266326d120046975fde07daef3266caacd821c1403499d7fdf17c033c8d8c3f28f162b5f09dfdaca06285f00c6cb986dfdf5151aa6639608b5b13e78d65a4368585b16138754fbd113835a686cd066c2b89bb0953c24d50e77bf0fc457c1e0fcf5d44da8db9a88f062be3b688d5cdcff1d1c00e81ec9d413882295b341fee8fa427dc109adeb5f284eec202f1bef115bf96b1782d3ccdeb682b69bf92d170c007d5df80e1ed962f677dc24a145a1e4e829e8dec0104e5f78365944 Signature = 42f133e34e3eb7032a133ed781537ec62e44a5ce8381e5e0bf9e13a914a4b2c757811d6d3b1e86672424ea4230d10f7c610abb7069e61e319b4066a2bd7bc900 Privkey = c3f5e149968a24f4de9119531975f443015ccca305d7119ed4749e8bf6d94fc7 Pubkey = 39aaccdb948a4038538a4588322f806bb129b5876c4bec51271afe4f49690045 Msg = c46370e37f2e0cadcf93402f1f0cb048f52881ba750b7a43f56ab11ce348732fb57e7f9aaf8dfcbe455e14e983c248d026a27e7f148d5db5a53f94635702b895127771047a876d14107386c5e0ff8933345bbd7a936d990d33efa28c2ec4e4864ffd2ff576f7c88f954cfc1c459e883bb712dae3cdf6632066f1f4d13a509615b3360cadc5a307f23e52a51b40a6feebe0b18d0e9ee4e348f33cd81a8def222f6a59b12861d335bd9af85cc004be46f1d3a424f4870ae9dc587e5a4ade136b9370649348c33ac3bf1febeebffea37085ed59cac9d9e696470b234609e9a10a9d431ff91e69cb5135fd117ff58a36539744ebe70cea6973c00c7a4d57b62f4a7136d731b8e46ff18ec0ed69070031905075d8541d568cfce6eeb76242b7819a7b6a93552111bb88f165527cfa6966d39fcbe0a7dea008e39c7a3e577ab307cd1d0ea326833d52654e172955f3fcd4 Signature = 5fa2b531677b00b85b0a313cbd479f55f4ab3ec5cfce5e454d2b74176ccc3399c899f9d6b51ed4c1e76185ac9fe730c4b4014044f7041185bc3c85722eb2ea02 Privkey = 42305c9302f45ea6f87e26e2208fd94b3c4ad037b1b6c83cf6677aa1096a013c Pubkey = 3b97b1f11ce45ba46ffbb25b76bfc5ad7b77f90cc69ed76115dea4029469d587 Msg = d110828d449198d675e74e8e39439fd15e75bf2cc1f430abfb245836885bafc420f754b89d2fbbf6dd3490792e7a4f766073cfe3b302d089831ace869e2730fde45c2121ec3ef217aa9c43fa7cc7e9ed0a01ad9f1d2fc3613638ca9fc193c98b37455bf5dbf8f38b64708dfdca6c21f0975f1017c5da5f6434bda9f033cec2a631ab50318e017b170b240bf01eb8b36c7e1cb59e7736ac34444208132a8f59e4f313d65d849c6a4fdf13e20ecaee3823e589a171b39b2489497b06e6ff58c2c9f1dc5d3aa3bd10e6443e22d42d07b783f79fd43a46e1cde314b663a95f7246dea131fcd46d1dc333c5454f86b2c4e2e424dea405cc2230d4dcd39a2eab2f92845cf6a7994192063f1202749ef52dcb96f2b79ed6a98118ca0b99ba2285490860eb4c61ab78b9ddc6acc7ad883fa5e96f9d029171223abf7573e36230e0a81f6c1311151473ee264f4b842e923dcb3b Signature = 18d05e5d01668e83f40fa3bbee28b388acf318d1b0b5ad668c672f345c8eda14c2f884cd2a9039459ce0810bc5b580fe70d3964a43edb49e73a6ff914bbf040c Privkey = c57a43dcd7bab8516009546918d71ad459b7345efdca8d4f19929875c839d722 Pubkey = 2083b444236b9ab31d4e00c89d55c6260fee71ac1a47c4b5ba227404d382b82d Msg = a4f6d9c281cf81a28a0b9e77499aa24bde96cc1264374491c008294ee0af6f6e4bbb686396f59068d358e30fe9992db0c6f16680a1c71e27a4a907ac607d39bdc3258c7956482fb37996f4beb3e5051b8148019a1c256e2ee999ebc8ce64c54e07fedb4fbd8953ebd93b7d69ce5a0082edd6209d12d3619b4fd2eae916461f72a4ce727157251a19209bbff9fbdbd289436f3fcacc6b4e1318521a47839cba4b14f7d7a21e7b5d6b6a753d5804afcd2b1eb7779b92abab8afa8aa4fa51caec0b85dcd0fc2a0676036d3f56630a831ffeb502861dd89161c708a9c006c73c930ce5b94756426ff18aa112fb4eb9a68500b48d4eedbd4167b6ffd0a11d49443a173ce9d949436748fc0634f06bb08b8f3423f4463dba7b4d199b64df578117f0a2645f0b2a1e2ada27d286f76733f25b82ed1d48a5c3898d4ad621e50ed9060daad40a39532e4d1bf162ce36804d5d4e2d Signature = 1edef9bc036971f1fa88edf45393c802e6c1a1631c8a06871a09a320821dce40beca97e53a0361a955a4c6d60b8ca8e400c81340911ccb4f56284041cdbb1804 Privkey = 2dddb6b8fd04fa90ece1a709f8418f2e5d0c9c43afe7cfce19e6ad15a73476f7 Pubkey = 8059de6a7c4776489ecc2e7d707ffce30285bf30a23f78d72db49cfd6ed0d492 Msg = 474baa590a4cd72d5424e51d8257b3d44325bc4c5063a0033c86ebbe99ed7212184c19944d082a115379dd4cece973faa0bca6485bd25f3744a719e70aa0291e1b5a96e637c140616a98263357c76b6eb0083fe51414e386870d0fdc7dd9abe4ff6fb5bbf1e7b15dac3e08e2615f655c3104ceb32a4cc2c9e9c43cf282d346ac253ccc46b635ae040973b49735720ffb890469a567c5824e0c00d7ccd5509a718092a906461c4d6163eaf422418f5fc6e009fc3f529ac61a2f89bb8e0ed45d940c4c2331ff8d8e1d6d58d417d8fc2656a02e8701aee75aed918724eebe4a2cf4744c5c401e217023df68a6f6a0228bd05a679a697d8de7036b9ed269090d3c65486afb91e27954eb15b964665ede7ad008f12fb3a9d0e69c13b4254f43819e0818a4195f68b8a38ae81f3fcb1879c95ab4cd0ffc38e381089260cca967ace5a085b457ab5eb363852101377570f9ac9e38 Signature = c634ea7bf72e895a2e796e2834201415b8b45e05e045559284eb9052c0e84f62a5a9f0c9764f7576788c7228b19ef517c195497325a48a9344b147c12fd75509 Privkey = 5547f1004baedfce5cfc0850b05302374aad24f6163994ecd751df3af3c10620 Pubkey = 7ce620787385ee1951ac49a77352ee0d6f8c5cd47df74e9e3216a6324fc7cf7f Msg = a6c17eeb5b8066c2cd9a89667317a945a0c7c96996e77ae854c509c6cd0631e922ad04503af87a3c4628adafed7600d071c078a22e7f64bda08a362b38b26ca15006d38acf532d0dedea4177a2d33f06956d80e963848ec791b2762fa99449b4f1a1ed9b3f2580be3ac7d7f52fb14421d6222ba76f807750c6cbb0b16f0895fc73d9dfc587e1a9e5d1e58375fbab705b8f0c1fd7df8b3ad446f2f08459e7ed1af59556fbc966dc249c1cf604f3e677c8a09d4363608774bf3811bef0642748c55c516c7a580fa3499050acb30eed870d0d91174cb623e98c3ad121cf81f04e57d49b008424a98a31eeaaf5f38e000f903d48d215ed52f862d636a5a73607de85760167267efe30f8a26ebc5aa0c09f5b258d3361ca69d1d7ee07b59648179ab2170ec50c07f6616f216872529421a6334a4a1ed3d2671ef47bc9a92afb58314e832db8a9003408a0487503fe4f67770dd4b6 Signature = 29df3ad589009c667baa5e72dabb4e53cb7876de4e7efe5cc21ead7fa878db57f97c1103ddb39a861eb88653c1d4ec3b4306e4584b47b8bc90423119e7e4af00 Privkey = 3dd7203c237aefe9e38a201ff341490179905f9f100828da18fcbe58768b5760 Pubkey = f067d7b2ff3a957e8373a7d42ef0832bcda84ebf287249a184a212a94c99ea5b Msg = db28ed31ac04b0c2decee7a6b24fc9a082cc262ca7ccf2a247d6372ec3e9120ecedb4542ea593fea30335c5ab9dd318a3b4fd5834299cf3f53d9ef46137b273c390ec3c26a0b4470d0d94b77d82cae4b24587837b167bb7f8166710baeb3ee70af797316cb7d05fa57e468ae3f0bd449404d8528808b41fcca62f5e0a2aa5d8f3acab008cc5f6e5ab02777bdcde87f0a10ef06a4bb37fe02c94815cf76bfb8f5cdd865cc26dcb5cf492edfd547b535e2e6a6d8540956dcba62cfea19a9474406e934337e454270e01036ac45793b6b8aceda187a08d56a2ce4e98f42ea375b101a6b9fcb4231d171aa463eeb43586a4b82a387bcddaf71a80fd5c1f7292efc2bd8e70c11eaa817106061b6c461c4883d613cc06c7e2a03f73d90fc55cdc07265eefd36be72270383d6c676cae37c93691f1ae3d927b3a1cd963e4229757ae5231eea73a9f71515628305410ac2593b325cc631 Signature = 4c036935a96abc0d050d907bedbe9946fb97439f039c742e051ccf09add7df44d17da98c2ca01bdc2424da1e4debf347f8fff48ac8030d2cc07f9575c044be04 Privkey = 282775df9ebbd7c5a65f3a2b096e36ee64a8f8ea719da77758739e4e7476111d Pubkey = a2b49646033a13937cad6b0e914e3cec54989c252ca5643d076555d8c55e56e0 Msg = 14cc50c2973ea9d0187a73f71cb9f1ce07e739e049ec2b27e6613c10c26b73a2a966e01ac3be8b505aeaad1485c1c2a3c6c2b00f81b9e5f927b73bfd498601a7622e8544837aad02e72bf72196dc246902e58af253ad7e025e3666d3bfc46b5b02f0eb4a37c9554992abc8651de12fd813177379bb0ce172cd8aaf937f979642bc2ed7c7a430cb14c3cd3101b9f6b91ee3f542acdf017f8c2116297f4564768f4db95dad8a9bcdc8da4d8fb13ef6e2da0b1316d3c8c2f3ed836b35fe2fd33effb409e3bc1b0f85225d2a1de3bfc2d20563946475c4d7ca9fddbaf59ad8f8961d287ae7dd803e7af1fa612329b1bdc04e225600ae731bc01ae0925aed62ac50d46086f3646cf47b072f0d3b044b36f85cec729a8bb2b92883ca4dfb34a8ee8a0273b31af50982bb6131bfa11d55504b1f6f1a0a00438ca26d8ab4f48bcddc9d5a38851abede4151d5b70d720732a00abea2c8b979 Signature = 15763973859402907d8dcb86adc24a2a168ba3abf2246173d6348afed51ef60b0c0edeff4e10bcef4c6e5778c8bc1f5e9ee0237373445b455155d23de127a202 Privkey = 4730a5cf9772d7d6665ba787bea4c95252e6ecd63ec62390547bf100c0a46375 Pubkey = f9f094f7cc1d40f1926b5b22dce465784468b20ab349bc6d4fdf78d0042bbc5b Msg = e7476d2e668420e1b0fadfbaa54286fa7fa890a87b8280e26078152295e1e6e55d1241435cc430a8693bb10cde4643f59cbfcc256f45f5090c909a14c7fc49d37bfc25af11e8f4c83f4c32d4aabf43b20fa382bb6622a1848f8ffc4dff3408bb4ec7c67a35b4cdaee5e279c0fc0a66093a9f36a60fdd65e6334a804e845c8530b6fda363b5640337d027243ccfb3c177f43e717896e46ead7f72ca06aa0ff1e77247121baf48be9a445f729ca1390fc46151cbd33fcbd7373f27a6ba55c92cbf6945b09b44b9a4e5800d403070ae66048997b2197f02181a097e563f9b9acc841139258a258bc610d3bd891637356b2edc8c184c35c65af91aaf7b1c16d74a5f5f862548139254ecf550631d5f8849afdb5b64cf366ff2633a93f3a18c39b5150245fb5f33c9e4e2d94af6963a70b88f9e7e519f8fa2a0f2e3749de883d0e6f052a949d0fc7153a8693f6d801d7352eb2f7a465c0e Signature = 552c7347bdfe131646ce0932d82a36d2c1b76d7c30ee890e0592e19f9d18b9a56f48d7a9b68c017da6b550c943af4a907baf317e419fbbc96f6cf4bfad42de00 Privkey = 2770aadd1d123e9547832dfb2a837eba089179ef4f23abc4a53f2a714e423ee2 Pubkey = 3c5fbb07530dd3a20ff35a500e3708926310fed8a899690232b42c15bd86e5dc Msg = a5cc2055eba3cf6f0c6332c1f2ab5854870913b03ff7093bc94f335add44332231d9869f027d82efd5f1227144ab56e3222dc3ddccf062d9c1b0c1024d9b416dfa3ee8a7027923003465e0ffaefb75b9f29dc6bcf213adc5e318fd8ba93a7aa5bfb495de9d7c5e1a196cd3a2d7721f8ba785aa9052a1811c7fcc8f93932765059cab9c9b718945895ef26f3ac048d4cabf91a9e6aa83ac14d43156827837914eb763a23cba53f60f150f4b70203ec1833ff105849457a8da7327661fb23a554164e05fcf0146b10674964be6f6aa0acc94c41ad57180e5180d199bd9102f55d740e81789b15671bbd0670e6de5d97e1ae626d8a0ebc32c8fd9d24737274e47d2dd5941a272e72a598928ad109cde937bf248d57f5d2942983c51e2a89f8f054d5c48dfad8fcf1ffa97f7de6a3a43ca15fc6720efaec69f0836d84223f9776d111ec2bbc69b2dfd58be8ca12c072164b718cd7c246d64 Signature = f267715e9a84c7314f2d5869ef4ab8d2149a13f7e8e1c728c423906293b49ce6283454dd1c7b04741df2eabedc4d6ab1397dc95a679df04d2c17d66c79bb7601 Privkey = 4fdab7c1600e70114b11f533242376af7614b4d5da046ac4bedea21d8a361598 Pubkey = a25c9a94d6e4ecd95a4bd6805f762eb1c457a8d45d243238b1839cbba8f441cc Msg = da405890d11a872c119dab5efcbff61e931f38eccca457edc626d3ea29ed4fe3154fafec1444da74343c06ad90ac9d17b511bcb73bb49d90bafb7c7ea800bd58411df1275c3cae71b700a5dab491a4261678587956aa4a219e1ac6dd3fb2cb8c46197218e726dc7ed234526a6b01c0d72cb93ab3f4f38a08e5940b3f61a72ad2789a0532000fac1d2d2e3ad632ac8b62bb3ff5b99d53597bf4d44b19674924df9b3db3d0253f74627ccab30031c85e291c58b5fa9167522a46746fc307036745d4f9817786e5d300e6c5d503125fea01dec3e3fedbf3861ca2627a0518fb2b24e5a7a014178719e9b345f7b249ce3a413280c8deb674f59a25be92a8ab6400c7c52b0728ae34e22b2ec200c1cbaba2ccd8af29249d17af60c36007a722fc80258a7bebab1cdaad7462a8b7588c2f7e27c6d07afcf60117fed11bd6859e75e3b4fcee3981881e95dd116827dd4b369af069d3c8f2676f8a Signature = 5075c090cfbeb6b01802af7f4da5aa4f434d5ee2f3530eebb75c85e08621f83edc08aa96693894a4277633ba81e19e9e55af5c495daa5e1a6f8cbb79c01c7207 Privkey = 264504604e70d72dc4474dbb34913e9c0f806dfe18c7879a41762a9e4390ec61 Pubkey = eb2b518ce7dc71c91f3665581651fd03af84c46bf1fed2433222353bc7ec511d Msg = 901d70e67ed242f2ec1dda813d4c052cfb31fd00cfe5446bf3b93fdb950f952d94ef9c99d1c264a6b13c3554a264beb97ed20e6b5d66ad84db5d8f1de35c496f947a23270954051f8e4dbe0d3ef9ab3003dd47b859356cecb81c50affa68c15dadb5f864d5e1bb4d3bada6f3aba1c83c438d79a94bfb50b43879e9cef08a2bfb22fad943dbf7683779746e31c486f01fd644905048b112ee258042153f46d1c7772a0624bcd6941e9062cfda75dc8712533f4057335c298038cbca29ebdb560a295a88339692808eb3481fd9735ea414f620c143b2133f57bb64e44778a8ca70918202d157426102e1dfc0a8f7b1ae487b74f02792633154dfe74caa1b7088fda22fa8b9bc354c585f1567706e2955493870f54169e0d7691159df43897961d24a852ea970c514948f3b48f71ee586e72ec78db820f253e08db84f6f312c4333bd0b732fe75883507783e9a1fd4fbab8e5870f9bf7ad58aa Signature = eea439a00f7e459b402b835150a779eed171ab971bd1b58dcc7f9386dadd583de8dc69e267121dde41f0f9493d450b16219cdf3c22f09482ce402fe17ca49e08 Privkey = 2ca7447a3668b748b1fd3d52d2080d30e34d397bb2846caf8f659ac168788ca5 Pubkey = ab331cd40a31d0173c0c8c1c17002532807bf89e3edb6d34c2dd8294632b9fbc Msg = a82bcd9424bffda0f2f5e9eae17835dbe468f61b785aab82934737a91c5f602cb7c617cdffe87cad726a4972e15a7b8ee147f062d2a5a4d89706b571fa8aa2b95981c78abeaaae86203fa2c0e07297406ea8c27111a86dbe1d5a7c3b7ae930904d9890f6d4abebd1412a73ad5feea64acf065d3e63b5cbe20cf20bbd2d8b94f9053ed5f66633482530124446605918de66455e8cf4b101a127233c4e27d5d55bf95bd3195d0340d43531fc75faf8dded5275bf89750de838fd10c31745be4ca41fa871cb0f9b016706a1a7e3c44bb90ac7a8ad51e272389292fd6c98ad7a069e76e3f5f3e0cc770b9e9b35a765d0d93712d7cdabd17e5d01dd8183af4ad9365db0a0fa41381fce60a081df1c5ab0f8c18f95a7a8b582dfff7f149ea579df0623b33b7508f0c663f01e3a2dcd9dfbee51cc615220fdaffdab51bdae42cb9f7fa9e3b7c69cc8ada5ccd642529ba514fdc54fcf2720b8f5d08b95 Signature = f93ada15ae9cd2b54f26f86f0c28392aed5eb6b6b44d01a4e33a54e7da37c38e8d53366f73fd85be642e4ec81236d163f0d025e76c8bbdd65d43df49f09c1f01 Privkey = 494ea9bcce26885b7d17d1fc114448f239f0ce46e5f247b4c999fa8629692472 Pubkey = 6901e5efae57536ba5fdd96b59657359065f25d391a1aa8cdc0d38bb5d53c139 Msg = 3badbfa5f5a8aa2cce0a60e686cdce654d24452f98fd54872e7395b39464380a0e185557ea134d095730864f4254d3dd946970c10c804fcc0899dfa024205be0f80b1c75449523324fe6a0751e47b4ff4822b8c33e9eaf1d1d96e0de3d4acd89696b7fcc03d49f92f82b9725700b350db1a87615369545561b8599f5ea920a310a8bafc0e8d7468cbf6f3820e943594afdd5166e4e3309dddd7694ef67e694f34fc62724ff96ac3364176f34e8a02b4cf569db5b8f77d58512aedabf0bcd1c2df12db3a9473f948c5c3243309aae46c49efd088b60f31a8a72ad7e5a35acc5d89fa66807eb5d3ba9cdf08d4753cb85089ee36f5c96b432b6928352afad58012225d6157f9e3611426df921b6d1d8374628a63031e9ffb90e42ffbba021f174f68503155430152c9155dc98ffa26c4fab065e1f8e4622c2f28a8cb043110b617441140f8e20adc16f799d1d5096b1f50532be5042d21b81ea46c7 Signature = 548a093a680361b7dc56f14503b55eeec3b3f4fd4ca99d6aedce0830f7f4ae2f7328539b34c48fc9760922333dae9c7c017e7db73b8faa6c06be05e347992b06 Privkey = 00d735ebaee75dd579a40dfd82508274d01a1572df99b811d5b01190d82192e4 Pubkey = ba02517c0fdd3e2614b3f7bf99ed9b492b80edf0495d230f881730ea45bc17c4 Msg = 59c0b69af95d074c88fdc8f063bfdc31b5f4a9bc9cecdffa8128e01e7c1937dde5eb0570b51b7b5d0a67a3555b4cdce2bca7a31a4fe8e1d03ab32b4035e6dadbf1532059ee01d3d9a7633a0e706a1154cab22a07cd74c06a3cb601244cf3cf35a35c3100ba47f31372a2da65dcff0d7a80a1055d8aa99212e899aad7f02e949e6fee4d3c9cefa85069eaff1f6ad06fc300c871ab82b2bedb934d20875c2a263242cdb7f9be192a8710b24c7ea98d43daec8baa5553c678a38f0e0adf7d3ff2dcc799a1dbad6eab1c3d9458a9db922f02e75cfab9d65c7336dae71895d5bb15cac203f2b38b9996c410f8655ad22d3c091c20b7f926d45e780128f19747462abc5c58932fbb9e0bc62d53868802f1b083f183b8a1f9434986d5cf97c04e2f3e145730cba98779c7fed0cab1c05d5e4653c6c3f6736260bc78ee4372862ffe9e90371d762c7432781f35ced884a4baca05653ef25f25a6f3d5628308 Signature = dcdc54611937d2bd06cacd9818b3be15ce7425427a75f50d197a337a3b8ba6714ef48866f243bd5ac7415e914517a2c1c5a953f432b99db0e620d64f74eb8505 Privkey = 8c34b905440b61911d1d8137c53d46a1a76d4609af973e18eb4c5709295627bb Pubkey = b69a8b2fdf5c20e734c2ffb294bc8ae1011d664f11afe7fbc471925cf72fa99d Msg = 30b57a389b48a0beb1a48432bff6b314bded79c4a1763a5acb57cea1bfb4c6d016cf090f5bd05bbd114e33ae7c17782dfa264f46c45f8c599c603016fe9ff05b6b5a99e92fe713a4cd5c41b292ed2bb2e9cf33a440542e821ec82cbf665c3f02e3dc337d7fdb58e31b27cb2954541468814698510df18c85c81fad12db11ec6b966f4930da5646b991db97445097da30dab61cda53a41083cb96add19de6c5eec323bca9d3530e38c00b35af7360077601be6ac97f3030f930a27b90fe8b6911bae389065adc15e1882300e2a003274d23182d5efd5ba4b9130c07bd5c65fecb8b5cb7eb38836b318befdfd77de4d6ca0181f77ae5740891683225f549dd8426145c97c5818c319f7ab2d868e1a41ceab64c085116069897bf2ca3667652406155ed0646431b6de1ccc03b4279ae4d326679265dce82048e7298e1f87fcec0768ac0f5d8ff84f7210be54d411af8edea7217f4e59413121e148c60da Signature = 3e0b72073dc9375eedcca6c4fc1cd315938a050c92716bd2284f4629a962beec0b7d7cf16ab923d58f5b90d3901a8e5c75c8f17dab9998e007d8c49511973d0e Privkey = 77a83e18c9f000eeff7deeac959ecba2206c0aa39d2f0e2aed5729482a7a0229 Pubkey = 62b1b316135596bfbca6037ed847c61fb7f09fa36ce90abb7789b86f768b59dd Msg = f3d5fa2acaefd858f1df26e03059cdcbc2468ad74afc993d0db9c4cde4113f8d55c7da71d38ba06520531c61fddb5f33d5f0353be2376e580711be45c0a30b1fa01b55e228c6fa35e3f95b67909fc7df3fd464d93d661a926f9d11f7550c17fbcc3496526e8f10e0c8916677b2be5b319b688f21e81aaa9482e5c93e64ce8c437b9c1e14fefed70a3fee568811dc31cadab3d5b220254465336dc4d97a3bd096b5e065e0cfbe82849e2c1905aca486533f0da7a61f1e9a55b8e2a83262deeb59f2b13d3a8aef5700845b83b25ae2183c0ddac0ce42f8d25674cb0d0d220a6de7c1858bb07d59a3372344d944602aa451d2b937db0fe6feca0beba81721fc361ea7509e2b6d397e1c191b56f54ab436d0d27ab4c061bd661ad1a4452387e8735754d07fa7ef4d4548b172582425b299046e6301b5ba6b914418f149cf722e10bde2e0d41700f12c8429fc897b7819da92292240cd45565458c9a7b29c12 Signature = 1eaad8420ac12c99ac1ff4476678e3cbbe94da6a797f174664d5ee0f641433fb1e7cb2f5613e10805df8654cd8e0d45d96230932bc7f20b04eae836435134309 Privkey = 73b03373ef1fd849005ecd6270dd9906f19f4439e40376cdbc520902bc976812 Pubkey = 663719e08ba3ba1666f6069a3f54991866b18cc6be41991b02eb3026ff9e155f Msg = d5c2deaba795c30aba321bc7de6996f0d90e4d05c747fb4dae8f3451895def6e16e72f38eace756f36635f8fb0b72a3a0c1f54663817a94d4fd346f835ab0e657f001a6f2cecb86d0825bd02639254f7f7f38ca99dbb86c64a633f73baf933aae3563281f4005e2d0e7cec9fbde8e588a957e211068be65b3d3d35bf4e8d5bb3478333df9ced9b2abaf48697994a145e9321499fc5ee560f4fbb6849e1ae8eb3d1de0083a21a03f6a6b28176f0130d3895e50e75e3d7d0947a7bc2c5b9ff69895d27791442ba8d0f2180712b567f712ea912f3b0d92c19342e0106ff1d87b46ad33af300b90855ba9769d366e79425d98e4de19905a04577707cbe625b84691781cd26bf62260b4a8bd605f77af6f970e1b3a112e8918344bd0d8d2e41dfd2ce9895b0246e50887aa3a577ff73be4b6ae60feb0ca36f6a5f8171ed209e5c566529c0940d9b4bd744ccee56e54a9a0c6e4da520dd315c2872b02db563703e Signature = a40abe98fc69da8a1ff9ff5c2cca93632e975980ee8b82c3c376022d6524ab736d01b072f2b681b5f1cd3ea067012ed6d074e949c42327a366caa9e4750a3c08 Privkey = eab179e41ed5c889ffe6aabdc054faf1307c395e46e313e17a14fe01023ffa30 Pubkey = 86f34746d3f7a01ddbe322f1aca56d22856d38733a3a6900bb08e776450ec803 Msg = 971095cebe5031530224387c5c31966e389b8566390054cf45264b44e18964b7be52c33c4ffb259af16283438fa15dd66bc7791b7533ef10cb0beab524a6437626f4cc74512851adcc2fb129055a482c61107383fb7c5241831d5551634eef0dc0b8f9053a00971aa8fa1ae0898e4b481b6707e97c0f942040b339d92fc17bbade74675af243d8b2dafb15b1db55d12415b85f3037291930ab61600ba3431f8eb425be4491614728af101e81c091f348bc5ffd1bde6ae6cad5c15b3aa7358078cc4effb54a86e7f0e0c55e4cfe0a54605ed443fdf2aaba016585da617e77341d52889d75dd540d39fe8b7993ed705cfddea0cb0d5a731d6bfcdb816afaff47e963eedebdf241af5593353d6d401a34f029a8cdeb1904cc2caa4f9635cc2ba6b7b1a29da625ffc383be2f5a8f1fa4f39b2d4b4f4c2d8838ce258a04d4a120493fdf07f68c0ffd1c16b768a35c55fea2cac696b5c20efc10865cde8a64627dcd Signature = 143cb28027c2f82e375e5f340e7fe6e60ce7bd51000b49c74168af85e26ed2ed630ed2672090164cc54b052da694ebdd21a21b3053f4dcfd7895ea5f6c8aa80d Privkey = fbf146ebd51075570ec51ac410ae9f391db75b610ada6362b4dbd949656cfb66 Pubkey = be7c2f5b21d746c8ea3245ce6f268e9da74e00fa85c9c475260c68fa1af6361f Msg = cd7ad4f17fcff73acc402dc102d09079b29aaf2a0f4b27cf6beeb1e2b23d19ab47deb3ae1becd68861ea279c46691738f4fff47c43047c4f8b56b6bbcc3fde0723d44120dcd307a6310dc4f366b8f3cd52db19b8266a487f7872391c45fe0d3248a7abf2c20022d3769547f683067dcc363cd22fd7cda3cadc15804056f0e2aa2b795008c598be7a961805e6df291ba3041c47ff5640275f46e6ae82092d21abcbcfba11e730216008822de3ce462400596da79f7ae5d1df8389112ad98868fa94fb0546bfe6a67aa8d28c4d32072d2eadd6256255f18c2382e662dfa922a680e06a43622c4871d27d1807f7b2703070c83db8dd929c06038b2183cb8e2b9ec4c778d7ecf9e9ffac77fa7737b055feac2e7982aeeec0b72f1bbca2424e1a844bbac79cb2e7400f81dc449d0560b521a7c16bb4167e6696586058a9b8ed2e5116690b77f2a17e5c0b16a83dcbd2e24552293e258b32ba7f844944379342698627 Signature = 6768006fe0f201b217dd10eb05d4b82adcfeb2ecfc8373c3308f4150394811eb60491881a2e53d1289d96478e18a64c34b2a19832cdccfd96a2e4a0c469fdc0b Privkey = dff0eb6b426dea2fd33c1d3fc24df9b31b486facb7edb8502954a3e8da99d9fd Pubkey = c245085ece69fb9aa560d0c27fdb634f7a840d41d8463660fbe82483b0f3cc3a Msg = e7c9e313d86160f4c74aa0ae07369ee22b27f81b3f69097affae28dae48483fb52a5c062306b59610f5cdbff6332b1960cd6f2b8f7b41578c20f0bc9637a0fdfc739d61f699a573f1c1a0b49294506cf4487965e5bb07bbf81803cb3d5cb3829c66c4bee7fc800ede216150934d277dea50edb097b992f11bb669fdf140bf6ae9fec46c3ea32f888fde9d154ea84f01c51265a7d3fef6eefc1ccdbffd1e2c897f05546a3b1ca11d9517cd667c660ec3960f7a8e5e80202a78d3a388b92f5c1dee14ae6acf8e17c841c9557c35a2eeced6e6af6372148e483ccd06c8fe344924e1019fb91cbf7941b9a176a073415867210670410c5dbd0ac4a50e6c0a509ddfdc555f60d696d41c77db8e6c84d5181f872755e64a721b061fcd68c463db4d32c9e01ea501267de22879d7fc12c8ca0379edb45abaa6e64dda2af6d40ccf24fbebad7b5a8d3e52007945ecd3ddc1e3efeb522581ac80e98c863ba0c590a3ed95cd1 Signature = 6b48b10f545ddb7a89cd5829f4e5b20146cf6bc96e550d06f65de8bdae7ccdded26cd630f86c9266bccf88e924033e04f83a54f8290d7f734cf8673cca8f9703 Privkey = 9f32958c7679b90fd5036056a75ec2eb2f56ec1effc7c012461dc89a3a167420 Pubkey = 1d7269dcb6d1f584e662d4ce251de0aba290ef78b97d448afb1e5333f1976d26 Msg = a56ba86c71360504087e745c41627092ad6b49a71e9daa5640e1044bf04d4f071ad728779e95d1e2460584e6f0773545da82d4814c9189a120f12f3e3819813e5b240d0f26436f70ee353b4d20cea54a1460b5b8f1008d6f95f3aa2d8f1e908fced50d624e3a096938b9353854b96da463a2798a5a312ec790842c10c446e3350c764bf5c972593b9987bf23256daa8894d47f22e85b97607e66fc08a12c789c4746080368d321bb9015a1155b65523ad8e99bb989b44eac756b0734acd7c6357c70b59743246d1652d91b0f9896965141345b9945cf34980452f3502974edb76b9c785fb0f4395266b055f3b5db8aab68e9d7102a1cd9ee3d142504f0e88b282e603a738e051d98de05d1fcc65b5f7e99c4111cc0aec489abd0ecad311bfc13e7d1653b9c31e81c998037f959d5cd980835aa0e0b09bcbed634391151da02bc01a36c9a5800afb984163a7bb815edbc0226eda0595c724ca9b3f8a71178f0d20a5a Signature = 9881a5763bdb259a3fefbba3d957162d6c70b804fa94ab613406a6ec42505b8789465ca1a9a33e1895988842270c55e5bdd5483f6b17b31781b593507a6c1808 Privkey = f86d6f766f88b00717b7d6327eb26cf3ceeba5385184426f9cfd8295e2421ff2 Pubkey = cb1d250504754183704dbe21c323d66f9f9011758f6d8dab6f597b199662145b Msg = da8423a6b7a18f20aa1f90ed2331b17b24067c40175bc25d8109e21d87ac00528eb3b2f66a2b52dc7ef2f8cecb75c76099cfa23db8da897043ba1cce31e2dfea46075f5e073203eaeb3d62c84c107b6dab33a14eaf149aa61850c15f5a58d88a15aba9196f9e495e8dbecbcf7e8444f5dd72a08a099d7f6209990b562974ea829ef11d29a920e3a799d0d92cb50d50f817631ab09de97c31e9a05f4d78d649fcd93a83752078ab3bb0e16c564d4fb07ca923c0374ba5bf1eea7e73668e135031feafcbb47cbc2ae30ec16a39b9c337e0a62eecdd80c0b7a04924ac3972da4fa9299c14b5a53d37b08bf02268b3bac9ea9355090eeb04ad87bee0593ba4e4443dda38a97afbf2db9952df63f178f3b4c52bcc132be8d9e26881213abdeb7e1c44c4061548909f0520f0dd7520fc408ea28c2cebc0f53063a2d30570e05350e52b390dd9b67662984847be9ad9b4cd50b069ffd29dd9c62ef14701f8d012a4a70c8431cc Signature = ec61c0b292203a8f1d87235ede92b74723c8d23408423773ae50b1e9bc4464e03e446da9dce4c39f6dd159bea26c009ed00120bc36d4a247dc0d24bcefcc110c Privkey = a5b34cefab9479df8389d7e6f6c146aa8affb0bec837f78af64624a145cc344e Pubkey = 7b0f4f24d9972bc6fe83826c52716ad1e0d7d19f123858cb3e99fa636ac9631a Msg = e21e98af6c2bac70557eb0e864da2c2b4d6c0a39a059d3477251f6178a39676f4749e7fbea623f148a43a8b0fe0610506fa658abd2f5fa39198f2636b724db22d1aebc2ab07b2b6dbffdee8cece81e1af1493ec1964e16bf86ab258ca0feb77e3c8717e44038abe152c14be15660bf93b2d48d92c4ed7074d2494210621bcf204fba88c654d5ffe01e1a53d08f70bb237089dc807216ff6a85dbec3102237d42590778acf6c1dc566d5a2bb9a63bc21c329c272e5965baeeb0fe891de3cc8cbfa8e541a8881df68942e7ff8dc656bd08575f6aaf924a176d663b1a1f43574d11768c701b269561e55438dbebfd443d2115cb933d1cde4a915b54c325c27f499ef02bd012ff1f9a36390922887600fe712bcdc23eb5974a305372ad52951f83f0e58cc49e289841621917f1fcb0235147240dae4cf3b99b6ac6d8de94efe7c4436714508bcd0114c56068ff1b7c16d51bd906437874d6549ab5d8087896872ec8a09d7412 Signature = 2fbd899d72b6d39e4f45b8b62cbbd5f3c0acb1ad8540913fa585877e91ccfef7bee50a4b0f9fedf5cc1e0d1953ad399c8389a93391e1b7c929af6d6f3b796c08 Privkey = ad75c9ce299c4d59393367d77a4c9f8df8dcec765c6dbd25b527fb7669913604 Pubkey = b9910548fe6312a119c9993eebcfb9dc90030ffb0e4de2b7ccd23cbeb4fef71b Msg = 62fc5ab67deb1fee9ab6cca3b88a1df1e589f0fd4a88f4aa7738948761fe84372c5b18e4655220c1d84d52acad32e229a5c756c20fc62fe4b4b4e5fd7077ae4ed5397aa796f2307ceedb6505b39297856f4aeb5e70938e36ee24a0ac7d9868306f6b53910623b7dc89a6672ad738576ed5d88831dd338321c8902bc2061f65e94d452fdfa0dc665cefb92308e52301bd4627006b363d06b775a395914d8c863e95a00d6893f3376134c429f56478145e4456f7a12d65bb2b8965d728cb2ddbb708f7125c237095a92195d92fa727a372f3545ae701f3808fee802c8967a76e8a940e55fb2d810bfb47ada156f0eda1829b159cf05c7f36cf3847d7b21de84c3dc0fe658347f79396a01139a508b60022db1c0e5aeef47e445e66f783e62c96597bdb16f209c08a9132c7573136170ee3ebf24261265a89fb4f10333375e20b33ab7403464f5249461c6853c5fddb9f58af816892910393a7077b799fdc3489720998feea86 Signature = 6b7ef27bcfbf2b714985033764fccff555e3f5bc44610d6c8c62117cb3831a07f4a8bddb0eaed1d46b0289b15de1aa4dcc17d71be96a09e66ba4dc4627c78705 Privkey = 1ced574529b9b416977e92eb39448a8717cac2934a243a5c44fb44b73ccc16da Pubkey = 85e167d5f062fee82014f3c8b1beaed8eefb2c22d8649c424b86b21b11eb8bda Msg = 1b3b953cce6d15303c61ca707609f70e7250f6c0deba56a8ce522b5986689651cdb848b842b2229661b8eeabfb8570749ed6c2b10a8fbf515053b5ea7d7a9228349e4646f9505e198029fec9ce0f38e4e0ca73625842d64caf8ced070a6e29c743586aa3db6d82993ac71fd38b783162d8fe04ffd0fa5cbc381d0e219c91937df6c973912fc02fda5377312468274c4bee6dca7f79c8b544861ed5babcf5c50e1473491be01708ac7c9ff58f1e40f855497ce9d7cc47b9410f2edd00f6496740243b8d03b2f5fa742b9c630867f77ac42f2b62c14e5ebddc7b647a05fff43670745f2851eff4909f5d27d57ae87f61e965ee60fdf97724c59267f2610b7ad5de919856d64d7c212659ce8656149b6a6d29d8f92b312be50b6e2a431d36ae022b00a6fe360e3af65432899c43be0427e36d21cfec81f21aa53b33db5ed2c37da8f96ac3e7dc67a1de37546cf7de1008c7e1adbe0f34fa7eb2434d94e6a13f4cf86a98d497622f Signature = e0303aefe08a77738dcc657afbb9b835ed279613a53c73fdc5ddbfb350e5cff4d6c9bb43dc07c95bf4e23b64c40f8804c7169952e3c8d59a7197241bfed0740f Privkey = f0790d93e2d3b84f61ef4c807147aba410e415e72b71b0d61d01026fed99da3d Pubkey = efdf649fb033cf328e0b287796f8a25e9c6e2e871b33c2c21a4028a8a25a4b28 Msg = 7973e9f32d74805992eb65da0d637335e50eff0ce68ea2d1f3a02de704492b9cfbe7e7ba96fdb42bb821a513d73fc60402e92c855deaed73ffeaf70952029062c833e14ec1b14f144e2207f6a0e727e5a7e3cbab27d5972970f69518a15b093e740cc0ce11bf5248f0826b8a98bde8bf2c7082c97aff158d08371118c89021cc3974ae8f76d86673c3f824b62c79c4b41f40eaa8943738f03300f68cbe175468eb235a9ff0e6537f8714e97e8f08ca444e41191063b5fabd156e85dcf66606b81dad4a95065584b3e0658c20a706eaf4a0777da4d2e0cd2a0fca60109c2b4403db3f03cd4781c1fbb0272202bcb11687808c50cb98f64b7f3fd3d43333bb5a061b9e377090abb1e0a885cb26b73c163e63ff6451ff2f4ec8249c7e152bd03973a1e964e2b5b235281a938399a112a24529e383a560dc50bb1b622ad74ef35658dcb10ffe022568ac3ffae5b465a8ed7643e8561b352ee9944a35d882c712b187788a0abae5a22f Signature = 08773a6a78762cbb1e25fcbb29139941bdf16f4e09a1fa08fc701f32f933edd74c0ae983c12a0a5b020b6bcf44bb719dde8ed0781a8298265640e1608c98b301 Privkey = 4cb9df7ce6fae9d62ba09e8eb70e4c969bdeafcb5ec7d7024326e6603b0621bf Pubkey = 018069dd0eb44055a35cd8c77c37ca9fb1ad2417271385e134b2f4e81f52033c Msg = 14627d6ea0e7895460759476dc74c42800ceef994327518151490d9df23067914e44788a12768ccb25471b9c3ba9d14fb436dcba38429b3a0456877763c49175d0e082683e07a9058f3685c6279307b2303d1221b9c29793d8a4877f6df51587384dadf751c5f7bfbd207d519622c37b51ceeee2c20d8269f8cb88d3fe43d6d434d5bbd0e203c1532d97ba552147227496c87f67b50bb76193add0144df1c176657585408362ca2ed04ad62acf1c25e341dfd1498d85b4b1349a8b0b9b02c43523c55853419bfed37d5a2cdf17dfbf1a3bd7759d6ae180f9d27dcd9a8933e29a7c0a30771eea7c2e0fa242925d2336dce585629057d844323964f6d3d11ff0b3f829a3be8c9f0468a6823d8e70ab5a2da21e15fa8b041a29812222e9c30b2bd9a12d1fdee6f87876e8ce81009637a8bb2236129a47ca74289ee4aad429ffe29f47430241ca8cc3848b7200fd6e1470651a9a0a6f72c9033e831df051408a6260f65cbaf6e012b18e Signature = e33c07836c537d6bfbd0f4592d6e35b163499ba78dc7ffcec565d04f9a7db781943e29e6ce76763e9baddf57437fd9c6b03239a6e6850e4502a356c2e12c3705 Privkey = a136e009d53e5ef59d0946bc175663a86bc0fcd29eadd95cfc9d266037b1e4fb Pubkey = 9c1806ec0454f58314eb8397d64287dee386640d8491aba364607688841715a0 Msg = a49d1c3d49e13c2eda56868a8824aa9f8d2bf72f21955ebafd07b3bdc8e924de20936cee513d8a64a47173a3bd659eff1accff8244b26aae1a0c27fa891bf4d85e8fb1b76a6cab1e7f74c89ee07bb40d714326f09b3fd40632fad208ea816f9072028c14b5b54ecc1c5b7fc809e7e0786e2f11495e76017eb62aa4563f3d00ee84348d9838cd17649f6929a6d206f60e6fc82e0c3464b27e0e6abd22f4469bdfd4cb54f77e329b80f71bf42129ec13c9dfe192adfaa42ee3ddeeda385816fbad5f411938c63b560f4ecd94534be7d98725cd94c99ce492f0f069ba0ec08f877a7812ef27ae19d7a77be63f66bcf8d6cf3a1a61fc9cfef104c7462a21ca7f03afb5bb1ac8c75124b554e8d044b810d95ff8c9dd09a34484d8c4b6c95f95c3c22823f52ce844293724d5259191f1ba0929e2acdbb8b9a7a8adf0c52e78acdfdf057b0985881afbed4dbebdebbdae0a2b63bd4e90f96afdcbbd78f506309f9bdb650013cb73faed73904e Signature = bc094ba91c115dee15d753361a75f3f03d6af45c92157e95dbe8d32194b6c5ce72b9dc66f73df12dca0b639f3e791d478616a1f8d7359a42c8eae0dda16b1606 Privkey = ff0f1c57dd884fbeea6e2917282b79ba67f8a6851267b9f4636dafda33bd2b5b Pubkey = fef6378ad12a7c252fa6eb742b05064b41530ff019dc680ab544c027ea2836e7 Msg = 522a5e5eff5b5e98fad6878a9d72df6eb318622610a1e1a48183f5590ecef5a6df671b28be91c88cdf7ae2881147fe6c37c28b43f64cf981c455c59e765ce94e1b6491631deaeef6d1da9ebca88643c77f83eae2cfdd2d97f604fe45081d1be5c4ae2d875996b8b6fecd707d3fa219a93ba0488e55247b405e330cfb97d31a1361c9b2084bdb13fb0c058925db8c3c649c9a3e937b533cc6310fa3b16126fb3cc9bb2b35c5c8300015488a30fadca3c8871fa70dfdc7055bf8e631f20c9b2528311e324a7c4edd5462079f3441c9ecf55fa999e731372344fdc0d413e417aaa001a1b2d3d9bc000fec1b02bd7a88a812d9d8a66f9464764c070c93041eefb17ce74eff6d4aff75f0cbf6a789a9ecde74abe33130fca0da853aa7c3313ada3f0ae2f595c6796a93685e729dd18a669d6381825ab3f36a391e7525b2a807a52fa5ec2a030a8cf3b77337ac41fceb580e845eed655a48b547238c2e8137c92f8c27e585caad3106eee3814a Signature = d5008486726cce330a29dd7e4d7474d735798201afd1206feb869a112e5b43523c06976761be3cf9b2716378273c94f93572a7d2b8982634e0755c632b449008 Privkey = 0bc6af64de5709d3dbc28f7ef6d3fe28b6de529f08f5857ccb910695de454f56 Pubkey = fb491fc900237bdc7e9a119f27150cd911935cd3628749ff40ef41f3955bc8ac Msg = ac7886e4f4172a22c95e8eea37437b375d72accedcee6cc6e816763301a2d8ef4d6f31a2c1d635818b7026a395ce0dafd71c5180893af76b7ea056c972d680eca01dcbdbae6b26f1c5f33fc988b824fbbe00cacc316469a3bae07aa7c8885af7f65f42e75cef94dbb9aab4825143c85070e7716b7612f64ef0b0166011d23eb5654aa098b02d8d71e57c8fa17bff2fe97dc8193177eadc09fb192d80aa92afa98720d4614817ff3c39d3acce18906fa3de09618931d0d7a60c4429cbfa20cf165c947929ac293ae6c06e7e8f25f1264291e3e1c98f5d93e6ecc2389bc60dbbf4a621b132c552a99c95d26d8d1af61138b570a0de4b497ebe8051c7273a98e6e7876d0b327503af3cb2cc4091ce1925cb2f2957f4ec56ee90f8a09dd57d6e83067a356a4cfe65b1b7a4465da2ab133b0efb5e7d4dbb811bcbbde712afbf0f7dd3f326222284b8c74eac7ad6257fa8c632b7da2559a6266e91e0ef90dbb0aa968f75376b693fcaa5da342221 Signature = dbc7134d1cd6b0813b53352714b6df939498e91cf37c324337d9c088a1b998347d26185b430900412929e4f63e910379fc42e355a4e98f6fee27dafad1957206 Privkey = 2f5e83bd5b412e71ae3e9084cd369efcc79bf6037c4b174dfd6a11fb0f5da218 Pubkey = a22a6da29a5ef6240c49d8896e3a0f1a4281a266c77d383ee6f9d25ffacbb872 Msg = b766273f060ef3b2ae3340454a391b426bc2e97264f8674553eb00dd6ecfdd59b611d8d662929fec710d0e462020e12cdbf9c1ec8858e85671acf8b7b14424ce92079d7d801e2ad9acac036bc8d2dfaa72aa839bff30c0aa7e414a882c00b645ff9d31bcf5a54382def4d0142efa4f06e823257ff132ee968cdc6738c53f53b84c8df76e9f78dd5056cf3d4d5a80a8f84e3edec48520f2cb4583e708539355ef7aa86fb5a0e87a94dcf14f30a2cca568f139d9ce59eaf459a5c5916cc8f20b26aaf6c7c029379aedb05a07fe585ccac60307c1f58ca9f859157d06d06baa394aace79d51b8cb38cfa2598141e245624e5ab9b9d68731173348905315bf1a5ad61d1e8adaeb810e4e8a86d7c13537b0be860ab2ed35b73399b8808aa91d750f77943f8a8b7e89fdb50728aa3dbbd8a41a6e00756f438c9b9e9d55872df5a9068add8a972b7e43edad9ced2237ca1367be4b7cdb66a54ea12eef129471158610eaf28f99f7f686557dcdf644ea Signature = 9f80922bc8db32d0cc43f9936affebe7b2bc35a5d82277cd187b5d50dc7fc4c4832fffa34e9543806b485c04548e7c75429425e14d55d91fc1052efd8667430b Privkey = 722a2da50e42c11a61c9afac7be1a2fed2267d650f8f7d8e5bc706b807c1b91d Pubkey = fd0b964562f823721e649c3fedb432a76f91e0aead7c61d35f95ed7726d78589 Msg = 173e8bb885e1f9081404acac999041d2ecfcb73f945e0db36e631d7cd1ab999eb717f34bf07874bf3d34e2530eb6085f4a9f88ae1b0f7d80f221456a8e9a8890b91a50192deaaacc0a1a615a87841e2c5a9e057957af6e48e78cc86198e32e7aa24dcf6cffa329bc72606d65b11682c8ba736cce22a05785df1146331e41609cf9ca711cf464958297138b58a9073f3bbf06ad8a85d135de66652104d88b49d27ad41e59bcc44c7fab68f53f0502e293ffcabaaf755927dfdffbfde3b35c080b5de4c8b785f4da64ef357bc0d1466a6a96560c3c4f3e3c0b563a003f5f95f237171bce1a001771a04ede7cdd9b8ca770fd36ef90e9fe0000a8d7685fd153cc7282de95920a8f8f0898d00bf0c6c933fe5bb9653ff146c4e2acd1a2e0c23c1244844dacf8652716302c2032f9c114679ed26b3ee3ab4a7b18bc4e3071f0977db57cd0ac68c0727a09b4f125fb64af2850b26c8a484263334e2da902d744737044e79ab1cf5b2f93a022b63d40cd Signature = c2695a57172aaa31bd0890f231ca8eeec0287a87172669a899ad0891cea4c47579b50420e791cdec8c182c8a0e8dde21b2480b0cfd8111e28e5603347a352d04 Privkey = 5fe9c3960ed5bd374cc94d42357e6a24dc7e3060788f726365defacf13cd12da Pubkey = 0ce7b155c8b20ebdaacdc2aa23627e34b1f9ace980650a2530c7607d04814eb4 Msg = c9490d83d9c3a9370f06c91af001685a02fe49b5ca667733fff189eee853ec1667a6c1b6c787e9244812d2d532866ab74dfc870d6f14033b6bcd39852a3900f8f08cd95a74cb8cbe02b8b8b51e993a06adfebd7fc9854ae5d29f4df9642871d0c5e470d903cfbcbd5adb3275628f28a80bf8c0f0376687dae673bf7a8547e80d4a9855ae2572fc2b205dc8a198016ddc9b50995f5b39f368f540504a551803d6dd5f874828e5541ded052894d9e2dc5e6aa351087e790c0dd5d9c4decb217e4db81c98a184b264e6daeac0f11e074cae2bfc899f54b419c65dcc22664a915fbfffac35cee0f286eb7b144933db933e16c4bcb650d537722489de236373fd8d65fc86118b6def37ca4608bc6ce927b65436ffda7f02bfbf88b045ae7d2c2b45a0b30c8f2a04df953221088c555fe9a5df260982a3d64df194ee952fa9a98c31b96493db6180d13d67c36716f95f8c0bd7a039ad990667ca34a83ac1a18c37dd7c7736aa6b9b6fc2b1ac0ce119ef77 Signature = 379f9c54c413af0d192e9bc736b29da9d521e7ba7841d309f9bcc1e742ec4308fe9f7ba51e0b22aed487cb4aa3913b9bebfb3aacd38f4039f9bbbebe1ad80002 Privkey = ec2fa541ac14b414149c3825eaa7001b795aa1957d4040dda92573904afa7ee4 Pubkey = 71b363b2408404d7beecdef1e1f511bb6084658b532f7ea63d4e3f5f01c61d31 Msg = 2749fc7c4a729e0e0ad71b5b74eb9f9c534ebd02ffc9df4374d813bdd1ae4eb87f1350d5fdc563934515771763e6c33b50e64e0cd114573031d2186b6eca4fc802cddc7cc51d92a61345a17f6ac38cc74d84707a5156be9202dee3444652e79bae7f0d31bd17567961f65dd01a8e4bee38331938ce4b2b550691b99a4bc3c072d186df4b3344a5c8fbfbb9fd2f355f6107e410c3d0c798b68d3fb9c6f7ab5fe27e70871e86767698fe35b77ead4e435a9402cc9ed6a2657b059be0a21003c048bbf5e0ebd93cbb2e71e923cf5c728d1758cd817ad74b454a887126d653b95a7f25e5293b768c9fc5a9c35a2372e3741bc90fd66301427b10824bb4b1e9110bfba84c21a40eb8fed4497e91dc3ffd0438c514c0a8cb4cac6ad0256bf11d5aa7a9c7c00b669b015b0bf81425a21413e2ffb6edc0bd78e385c44fd74558e511c2c25fee1fec18d3990b8690300fa711e93d9854668f0187065e76e7113ae763c30ddd86720b5546a6c3c6f1c43bc67b14 Signature = 84d18d56f964e3776759bba92c510c2b6d574555c3cddade212da90374554991e7d77e278d63e34693e1958078cc3685f8c41c1f5342e351899638ef61211401 Privkey = 6132692a5ef27bf476b1e991e6c431a8c764f1aebd470282db3321bb7cb09c20 Pubkey = 7a2d166184f9e5f73bea454486b041ceb5fc2314a7bd59cb718e79f0ec989d84 Msg = a9c0861665d8c2de06f9301da70afb27b3024b744c6b38b24259294c97b1d1cb4f0dcf7575a8ed454e2f0980f50313a77363415183fe9677a9eb1e06cb6d34a467cb7b0758d6f55c564b5ba15603e202b18856d89e72a23ab07d8853ff77da7aff1caebd7959f2c710ef31f5078a9f2cdae92641a1cc5f74d0c143ec42afbaa5f378a9e10d5bf74587fa5f49c156233247dafd3929acde888dc684337e40cdc5932e7eb73ffcc90b85c0ad460416691aefbd7efd07b657c350946a0e366b37a6c8089aba5c5fe3bbca064afbe9d47fbc83914af1cb43c2b2efa98e0a43be32ba823202001def36817251b65f9b0506cef6683642a46ed612f8ca81ee97bb04d317b517343ade2b77126d1f02a87b7604c8653b6748cf5488fa6d43df809faa19e69292d38c5d397dd8e20c7af7c5334ec977f5010a0f7cb5b89479ca06db4d12627f067d6c42186a6b1f8742f36ae709ba720e3cd898116666d81b190b9b9d2a72202cb690a03f3310429a71dc048cde Signature = eb677f3347e1a1ea929efdf62bf9105a6c8f4993033b4f6d03cb0dbf9c742b270704e383ab7c0676bdb1ad0ce9b16673083c9602ec10ae1dd98e8748b336440b Privkey = f219b2101164aa9723bde3a7346f68a35061c01f9782072580ba32df903ba891 Pubkey = f66b920d5aa1a6085495a1480539beba01ffe60e6a6388d1b2e8eda23355810e Msg = 015577d3e4a0ec1ab25930106343ff35ab4f1e0a8a2d844aadbb70e5fc5348ccb679c2295c51d702aaae7f6273ce70297b26cb7a253a3db94332e86a15b4a64491232791f7a8b082ee2834af30400e804647a532e9c454d2a0a7320130ab6d4d860073a34667ac25b7e5e2747ba9f5c94594fb68377ae260369c40713b4e32f23195bf91d3d7f1a2719bf408aad8d8a347b112e84b118817cb06513344021763035272a7db728a0ccdaa949c61715d0764140b3e8c01d20ff1593c7f2d55c4e82a1c0cb1ea58442bf80a741bca91f58ab0581b498ee9fe3c92ca654148ef75313543d1aff382befe1a93b02190ce0102175158e2071d02bacad8dbe9fb940fcb610c105ad52c80feb1ec4e524f4c0ec7983e9ce696fa4fcf4bf0514b8f0432b17d5448fc426fea2b01ac7b26c2aed769927534da22576fc1bba726e9d65be01b59f60a648ace2fc3e5e275789fa637cbbd84be3d6ac24457a6292cd656c7b569a52ffea7916b8d04b4f4a75be7ac95142f Signature = 17f0127ca3bafa5f4ee959cd60f772be87a0034961517e39a0a1d0f4b9e26db1336e60c82b352c4cbacdbbd11771c3774f8cc5a1a795d6e4f4ebd51def36770b Privkey = fc180035aec0f5ede7bda93bf77ade7a81ed06de07ee2e3aa8576be81608610a Pubkey = 4f215e948cae243ee3143b80282ad792c780d2a6b75060ca1d290ca1a8e3151f Msg = b5e8b01625664b222339e0f05f93a990ba48b56ae65439a17520932df011721e284dbe36f98631c066510098a68d7b692a3863e99d58db76ca5667c8043cb10bd7abbaf506529fbb23a5166be038affdb9a234c4f4fcf43bddd6b8d2ce772dd653ed115c095e232b269dd4888d2368cb1c66be29dd383fca67f66765b296564e37555f0c0e484504c591f006ea8533a12583ad2e48318ff6f324ecaf804b1bae04aa896743e67ef61ca383d58e42acfc6410de30776e3ba262373b9e1441943955101a4e768231ad9c6529eff6118dde5df02f94b8d6df2d99f27863b517243a579e7aaff311ea3a0282e47ca876fabc2280fce7adc984dd0b30885b1650f1471dfcb0522d49fec7d042f32a93bc368f076006ea01ec1c7412bf66f62dc88de2c0b74701a5614e855e9fa728fb1f1171385f96afbde70dea02e9aa94dc21848c26302b50ae91f9693a1864e4e095ae03cdc22ad28a0eb7db596779246712fab5f5da327efec3e79612de0a6ccaa536759b8e Signature = a43a71c3a19c35660dae6f31a254b8c0ea3593fc8fca74d13640012b9e9473d4afe070db01e7fb399bf4ca6070e062180011285a67dd6858b761e46c6bd32004 Privkey = a2836a65427912122d25dcdfc99d7046fe9b53d5c1bb23617f11890e94ca93ed Pubkey = 8c12bda214c8abb2286acffbf8112425040aab9f4d8bb7870b98da0159e882f1 Msg = 813d6061c56eae0ff53041c0244aa5e29e13ec0f3fb428d4beb8a99e04bca8c41bddb0db945f487efe38f2fc14a628fafa2462f860e4e34250eb4e93f139ab1b74a2614519e41ee2403be427930ab8bc82ec89ceafb60905bd4ddbbd13bdb19654314fc92373140b962e2258e038d71b9ec66b84ef8319e03551cb707e747f6c40ad476fbefdce71f3a7b67a1af1869bc6440686e7e0855e4f369d1d88b8099fba54714678627bba1aff41e7707bc97eddf890b0c08dce3e9800d24c6f61092ce28d481b5dea5c096c55d72f8946009131fb968e2bc8a054d825adab76740dcf0d758c8bf54ff38659e71b32bfe2e615aaabb0f5293085649cf60b9847bc62011ce3878af628984a5840a4ad5dae3702db367da0f8a165fed0517eb5c442b0145330241b97eeca733ba6688b9c129a61cd1236aff0e27bcf98c28b0fbeea55a3d7c7193d644b2749f986bd46af8938e8faaeafbd9cec3612ab005bd7c3eeafe9a31279ca6102560666ba16136ff1452f850adb Signature = e6a9a6b436559a4320c45c0c2c4a2aedecb90d416d52c82680ac7330d062aebef3e9ac9f2c5ffa455c9be113013a2b282e5600fd306435ada83b1e48ba2a3605 Privkey = f051af426d0c3282fafc8bf912ade1c24211a95ad200e1eef549320e1cb1a252 Pubkey = fa87955e0ea13dde49d83dc22e63a2bdf1076725c2cc7f93c76511f28e7944f2 Msg = b48d9f84762b3bcc66e96d76a616fa8fe8e01695251f47cfc1b7b17d60dc9f90d576ef64ee7d388504e2c9079638165a889696471c989a876f8f13b63b58d531fea4dd1229fc631668a047bfae2da281feae1b6de3ebe280abe0a82ee00fbfdc22ce2d10e06a0492ff1404dfc094c40b203bf55721dd787ed4e91d5517aaf58d3bdd35d44a65ae6ba75619b339b650518cefcc17493de27a3b5d41788f87edbde72610f181bf06e208e0eb7cdfe881d91a2d6cc77aa19c0fcf330fedb44675d800eb8cff9505d8887544a503cbe373c4847b19e8f3995726efd6649858595c57ccaf0cbc9eb25de83ba046bc9f1838ac7b8953dd81b81ac0f68d0e9338cb55402552afb6bc16949351b926d151a82efc695e8d7da0dd55099366789718ccbf36030bd2c3c109399be26cdb8b9e2a155f3b2cb1bfa71ab69a23625a4ac118fe91cb2c19788cf52a71d730d576b421d96982a51a2991daec440cda7e6cc3282b8312714278b819bfe2387eb96aa91d40173034f428 Signature = b8f713578a64466719aceb432fce302a87cf066bf3e102a350616921a840964bfc7e685d8fd17455ac3eb4861edcb8979d35e3a4bd82a078cd707721d733400e Privkey = a103e92672c65f81ea5da1fff1a4038788479e941d503a756f4a755201a57c1d Pubkey = ee63a5b69641217acbaf3339da829ec071b9931e5987153514d30140837a7af4 Msg = b1984e9eec085d524c1eb3b95c89c84ae085be5dc65c326e19025e1210a1d50edbbba5d1370cf15d68d687eb113233e0fba50f9433c7d358773950c67931db8296bbcbecec888e87e71a2f7579fad2fa162b85fb97473c456b9a5ce2956676969c7bf4c45679085b62f2c224fc7f458794273f6d12c5f3e0d06951824d1cca3e2f904559ed28e2868b366d79d94dc98667b9b5924268f3e39b1291e5abe4a758f77019dacbb22bd8196e0a83a5677658836e96ca5635055a1e63d65d036a68d87ac2fd283fdda390319909c5cc7680368848873d597f298e0c6172308030ffd452bb1363617b316ed7cd949a165dc8abb53f991aef3f3e9502c5dfe4756b7c6bfdfe89f5e00febdd6afb0402818f11cf8d1d5864fe9da1b86e39aa935831506cf2400ea7ed75bd9533b23e202fe875d7d9638c89d11cb2d6e6021ae6bd27c7754810d35cd3a61494f27b16fc794e2cd2f0d3453ada933865db78c579571f8fc5c5c6be8eaffce6a852e5b3b1c524c49313d427abcb Signature = 2aa2035c2ce5b5e6ae161e168f3ad0d6592bcf2c4a049d3ed342fceb56be9c7cb372027573ae0178e8878ebefca7b030327b8aad41857de58cb78e1a00cbac05 Privkey = d47c1b4b9e50cbb71fd07d096d91d87213d44b024373044761c4822f9d9df880 Pubkey = f4e1cb86c8ca2cfee43e58594a8778436d3ea519704e00c1bbe48bbb1c9454f8 Msg = 88d7009d51de3d337eef0f215ea66ab830ec5a9e6823761c3b92ad93ea341db92ece67f4ef4ceb84194ae6926c3d014b2d59781f02e0b32f9a611222cb9a5850c6957cb8079ae64e0832a1f05e5d1a3c572f9d08f1437f76bb3b83b52967c3d48c3576848891c9658d4959eb80656d26cdba0810037c8a18318ff122f8aa8985c773cb317efa2f557f1c3896bcb162df5d87681bb787e7813aa2dea3b0c564d646a92861f444ca1407efbac3d12432cbb70a1d0eaffb11741d3718fedee2b83036189a6fc45a52f74fa487c18fd264a7945f6c9e44b011f5d86613f1939b19f4f4fdf53234057be3f005ad64eebf3c8ffb58cb40956c4336df01d4424b706a0e561d601708d12485e21bcb6d799d8d1d044b400064ec0944501406e70253947006cabbdb2dd6bd8cee4497653d9113a44d4de9b68d4c526fca0b9b0c18fe50fb917fdd9a914fb816108a73a6b3fff9e654e69c9cfe02b05c6c1b9d15c4e65cf31018b8100d784633ee1888eee3572aafa6f189ea22d0 Signature = 627e7ca7e34ed6331d62b9541c1ea9a9292be7b0a65d805e266b5122272a82db7d765acc7e2a290d685804922f91ed04a3c382c03ff21a1768f584413c4e5f00 Privkey = fc0c32c5eb6c71ea08dc2b300cbcef18fdde3ea20f68f21733237b4ddaab900e Pubkey = 47c37d8a080857eb8777a6c0a9a5c927303faf5c320953b5de48e462e12d0062 Msg = a7b1e2db6bdd96b3d51475603537a76b42b04d7ebd24fe515a887658e4a352e22109335639a59e2534811f4753b70209d0e4698e9d926088826c14689681ea00fa3a2fcaa0047ced3ef287e6172502b215e56497614d86b4cb26bcd77a2e172509360ee58893d01c0d0fb4d4abfe4dbd8d2a2f54190fa2f731c1ceac6829c3ddc9bfb2ffd70c57ba0c2b22d2326fbfe7390db8809f73547ff47b86c36f2bf7454e678c4f1c0fa870bd0e30bbf3278ec8d0c5e9b64aff0af64babc19b70f4cf9a41cb8f95d3cde24f456ba3571c8f021d38e591dec05cb5d1ca7b48f9da4bd734b069a9fd106500c1f408ab7fe8e4a6e6f3ed64da0ed24b01e33df8475f95fa9ed71d04dd30b3cd823755a3401bf5afae10ee7e18ec6fe637c3793fd434b48d7145130447e00299101052558b506554ec9c399f62941c3f414cbc352caa345b930adecfaddac91ee53d1451a65e06201026325de07c931f69bba868a7c87ee23c604ec6794332917dfe2c5b69669b659706917f71eddf96 Signature = 6887c6e2b98a82af5ee3dfa7ca2cb25d9c10745620a82956acba85cb57c8ec24279fa42f092359a1b6bbeafba050f14b6288209e6ef7bc1e0a2b872c1138f305 Privkey = a8d73d639a23cc6a967ef31bcabb5d063e53e1eab8fcc7cab9bc3a17fde9c2f8 Pubkey = 8daa9f4c8b1a44691bf44521f2f7ca45dc7fc61f6a4ce6f98faa41c2a74977d1 Msg = fd1fac3d53313b11acd29f5a83ac11896dab2530fa47865b2295c0d99dd67c36ed8e5fa549150c794c5549efb5c1d69114d5d607b23285b7212afaab57846a54ae67b9e880e07b6586607cecf6d4eed516a3a75511fe367d88eb871e6d71b7d6aa1367a01421b1088fc2d75e44954b73625c52da8a3a183c60be9da6050f59a453caa53520593671728d431877bfaac913a765fb6a56b75290b2a8aaac34afb9217ba1b0d5850ba0fdabf80969def0feee794ceb60614e3368e63ef20e4c32d341ec9b0328ea9fe139207ed7a626ff08943b415233db7cfcc845c9b63121d4ed52ec3748ab6a1f36b2103c7dc7e9303acea4ba8af7a3e07184fb491e891ede84f0dc41cadc3973028e879acd2031afc29a16092868e2c7f539fc1b792edab195a25ab9830661346b39ef53915de4af52c421eaf172e9da76a08c283a52df907f705d7e8599c5baae0c2af380c1bb46f93484a03f28374324b278992b50b7afa02552cafa503f034f8d866e9b720271dd68ccb685a85fffd1 Signature = c4dcef1a2453939b364b340250c3129431431d5ba3f47670ab07ce680c69bf28b678627c76a6360fc40dc109aa7dea371b825e46134f624572182acf3957e70f Privkey = 79c7dcb7d59a8df6b2b2ba0413059d89680995c20e916da01b8f067dc60cdeb4 Pubkey = 298743c73918bd556b28f8d4824a09b814752a7aeae7ee04875c53f4d6b108d9 Msg = 5fe202f5b33b7788810d2508a13b3114d69b8596e6eacda05a04a2eb597fa3279c208b5a5b65daacb699f144e1d660e78e139b578331abec5c3c35334454f03e832c8d6e2984df5d450ecb5d33582a78808a9c78f26ebcd1244ef52e3fa6dca115c1f0cb56e38eae0e5b39f5fd863dffd0b2fb5b958f2d739db312fc667a17b031c4c9f8c5a2ad577984cc4146c437580efd2152173fe0d5782cc2ae9831a8d9a04177256018ff7631e0b0d8a99cb28f008b320421e27a74c31359188663456d85e098c1ebd281701097b6ae5a871e5ccc02058a501416cb91c12cef5be6f1914370e563f1a1b2aa41f4b8ee84cd32a1d509e529787d14a445438d807ecd620e2fa26de0da6426864784d4a28f54103e609283b99ee9b2b699c980bbb7882c3ea68ddc90802ac232f2c8e84291987bf3c5240921b59cfa214969317673d0be7f34b1ca0e15ea73c7175401ce550be106b49e62f8db68695e740e0f3a3556a19f3c8e6b91ac1cc23e863fcd0f0d9eb7047aa631e0d2eb9bcc6b Signature = 7b7cbe44c771e4371bae13b0722babcc1064155732962f407cba2acd35381d42210bece822f4681121fd4dab745a1f3077922fba1a78045b712902baccac660e Privkey = b9ced0412593fefed95e94ac965e5b23ff9d4b0e797db02bf497994d3b793e60 Pubkey = c1629a723189959337f5535201e5d395ba0a03ea8c17660d0f8b6f6e6404bb12 Msg = 555bb39c1899d57cabe428064c2d925f5fc4cf7059b95fb89a8e9e3a7e426c6c922d9e4d76984ea2383cabb4f2befd89c1f20eaa8a00dbe787cfa70ae2ae6aa90331cbbe580fa5a02184ed05e6c8e89d576af28aeeaf7c4e2500f358a00971a0a75920e854849bf332142975404f598c32e96982043d992bcd1a4fe819bb5634ad03467afc4ce05073f88ba1ba4ae8653a04665cf3f71690fe13343885bc5ebc0e5e62d882f43b7c68900ac9438bf4a81ce90169ec129ee63e2c675a1a5a67e27cc798c48cc23f51078f463b3b7cc14e3bcfd2e9b82c75240934cbdc50c4308f282f193122995606f40135100a291c55afdf8934eb8b61d81421674124dec3b88f9a73110a9e616f5b826b9d343f3ac0e9d7bdf4fd8b648b40f0098b3897a3a1cd65a64570059b8bc5c6743883074c88623c1f5a88c58969e21c692aca236833d3470b3eb09815e1138e9d0650c390eee977422193b00918be8a97cc6199b451b05b5730d1d13358cf74610678f7ac7f7895cc2efc456e03873b Signature = f1b797ded8a6942b12626848340fb719fcddafd98f33e2992d357bfdd35933c7ac561e5b2f939464338c5666854ca885c4d046eb2c54e48a1b5ed266ad34de05 Privkey = 81da168f02d46bb87cda845da43f8a6cba2c016878d6f49c6f061a60f155a04a Pubkey = aff86e98093ca4c71b1b804c5fe451cfdf868250dea30345fa4b89bb09b6a53b Msg = 6bc6726a34a64aae76ab08c92b179e54ff5d2e65eb2c6c659ae8703cc245cbc2cf45a12b22c468ae61fd9a6627ad0626c9b1e5af412cb483eaee1db11b29f0a510c13e38020e09ae0eee762537a3e9d1a0c7b033d097fdc1f4f82629a9de9ef38da1cf96a940357d5f2e0e7e8dbc29db728a1e6aad876e5e053113d06420272b87cf0c40dfe03a544de96c7aea13ba0029b57b48d99dcc6a650492d78c4cdd1b28e1a115a7e3e7a7cb21333d4ff80858dfb67782c16354b8716596560d7d8e389eb15a052a0bf5d16eb54fb3e4973ad4984e72a187f5347d5b262c32b1647e42b6a53837096cc78c2a05ce1c6e12493a03f1a667584cb97f4fcd57ee944c65b7eed25f7ae0f3f6cede173fdfacf5af1db143730d18096664914ba4cfc6966f392022781c66a9417ca2680b51f63e4fba424ecfdbc6a2f01787d0e7484f8a8ab390aeaa6d1f7ed325d82feaa1692a4984fae43da87329b045da8f0a4f56b695aa935de152ce0385153720979a2b7006d405fcb0fba09e23b85fd19b Signature = 4aaca947e3f22cc8b8588ee030ace8f6b5f5711c2974f20cc18c3b655b07a5bc1366b59a1708032d12cae01ab794f8cbcc1a330874a75035db1d69422d2fc00c Privkey = af2e60da0f29bb1614fc3f193cc353331986b73f3f9a0aec9421b9473d6a4b6a Pubkey = c8bfe2835822199c6127b806fabeef0cb9ff59f3c81ff0cb89c556f55106af6a Msg = 7dbb77b88bda94f344416a06b096566c6e8b393931a8243a6cab75c361fde7dc536aec40cded83296a89e8c3bef7d787cfc49401a7b9183f138d5000619ff073c05e2f841d6008358f10a2da7dcfac3d4d70c20d2ec34c7b6d5cd1a734d6bbb11c5fd8d2bce32ac810ef82b4188aa8ea3cfc3032233dc0e2600e9db6e18bc22b10044a31c15baceaf5554de89d2a3466807f244414d080ff2963956c6e83c8e144ed0066088b476ddcb564403447d9159f9089aba2b4d5575c4d8ae66fc8690e7349ed40832e6369c024563ec493bfcc0fc9ac787ac841397fe133167283d80c42f006a99d39e82979da3fa9334bd9ede0d14b41b7466bcebbe8171bc804a645d3723274a1b92bf82fd993358744de92441903d436fd47f23d40052a3829367f202f0553b5e49b76c5e03fa6ce7c3cf5eeb21de967bec4dd355925384ebf96697e823762bac4d43a767c241a4cef724a970d00ff3a8ab3b83eed840075c74e90f306e330013260962161e9d0910de183622ce9a6b8d5144280550fc7 Signature = 50f9f941a8da9f6240f76d2fa3b06dd6b2292ed32d1c05218097d34d8a19dfe553f76ae3c6b4a2ed20852128461540decf418f52d38e64037eec7771bd1afe00 Privkey = 605f90b53d8e4a3b48b97d745439f2a0807d83b8502e8e2979f03e8d376ac9fe Pubkey = aa3fae4cfa6f6bfd14ba0afa36dcb1a2656f36541ad6b3e67f1794b06360a62f Msg = 3bcdcac292ac9519024aaecee2b3e999ff5d3445e9f1eb60940f06b91275b6c5db2722ed4d82fe89605226530f3e6b0737b308cde8956184944f388a80042f6cba274c0f7d1192a0a96b0da6e2d6a61b76518fbee555773a414590a928b4cd545fccf58172f35857120eb96e75c5c8ac9ae3add367d51d34ac403446360ec10f553ea9f14fb2b8b78cba18c3e506b2f04097063a43b2d36431cce02caf11c5a4db8c821752e52985d5af1bfbf4c61572e3fadae3ad424acd81662ea5837a1143b9669391d7b9cfe230cffb3a7bb03f6591c25a4f01c0d2d4aca3e74db1997d3739c851f0327db919ff6e77f6c8a20fdd3e1594e92d01901ab9aef194fc893e70d78c8ae0f480001a515d4f9923ae6278e8927237d05db23e984c92a683882f57b1f1882a74a193ab6912ff241b9ffa662a0d47f29205f084dbde845baaeb5dd36ae6439a437642fa763b57e8dbe84e55813f0151e97e5b9de768b234b8db15c496d4bfcfa1388788972bb50ce030bc6e0ccf4fa7d00d343782f6ba8de0 Signature = dd0212e63288cbe14a4569b4d891da3c7f92727c5e7f9a801cf9d6827085e7095b669d7d45f882ca5f0745dccd24d87a57181320191e5b7a47c3f7f2dccbd707 Privkey = 9e2c3d189838f4dd52ef0832886874c5ca493983ddadc07cbc570af2ee9d6209 Pubkey = f68d3b81e73557ee1f08bd2d3f46a4718256a0f3cd8d2e03eb8fe882aab65c69 Msg = 19485f5238ba82eadf5eff14ca75cd42e5d56fea69d5718cfb5b1d40d760899b450e66884558f3f25b7c3de9afc4738d7ac09da5dd4689bbfac07836f5e0be432b1ddcf1b1a075bc9815d0debc865d90bd5a0c5f5604d9b46ace816c57694ecc3d40d8f84df0ede2bc4d577775a027f725de0816f563fa88f88e077720ebb6ac02574604819824db7474d4d0b22cd1bc05768e0fb867ca1c1a7b90b34ab7a41afc66957266ac0c915934aaf31c0cf6927a4f03f23285e6f24afd5813849bb08c203ac2d0336dcbf80d77f6cf7120edfbcdf181db107ec8e00f32449c1d3f5c049a92694b4ea2c6ebe5e2b0f64b5ae50ad3374d246b3270057e724a27cf263b633ab65ecb7f5c266b8007618b10ac9ac83db0febc04fd863d9661ab6e58494766f71b9a867c5a7a4555f667c1af2e54588f162a41ce756407cc4161d607b6e0682980934caa1bef036f7330d9eef01ecc553583fee5994e533a46ca916f60f8b961ae01d20f7abf0df6141b604de733c636b42018cd5f1d1ef4f84cee40fc Signature = 38a31b6b465084738262a26c065fe5d9e2886bf9dd35cde05df9bad0cc7db401c750aa19e66090bce25a3c721201e60502c8c10454346648af065eab0ee7d80f Privkey = 31010d1d67eb616348e84792b92d5dc128553cb52f6368159fe7b816cd0e7c37 Pubkey = 266543d96787ca901fcff06e6e434491ae0970880a5a187d535edb19db5cabeb Msg = 39f89a5e7aa530b5463d498f8035b9909d55da527cdbd4de6d228379f089e608a9207a2c5b9c42051a60c8ca3fb97a1c06cd747d9d0739970ceb88ce526f971140ea2ec21f090ba075bf8975faa508b1cc10efa494dc172e6d3d3f3f75dc8e0e96f05c0cccb2f96e911cfa7a2c82c9845018bb1f9d75f82e3dfe1139347b2ac058b014ac93760c90f5567ab5c4eba04b49fb09ddadd305be511dfe05c96ebc86fd67b5d0ab57d85f4fe5e2f0fa9d88a68f0f6b6bc8bb944eb3c0b17557e55d5ea187d922a42813e69057c9b6a7f75e49921b7079e58f8a63719ee3e1ad10cf0e8a70c4f1540218b70494bd029ee02ff9727a7d85d377919ec4051479b70f7cd6767723fe42c1c7899c2b7c1f702dd6b4d13b672d488f34a0e969db79cc2cb2524a948a8de4c5b623ecd90d6e82d97033c125637d1cd8c84803d8fbc012846ffe484f6c02149258f9462fa1e99c307dd0062fe0b6f11eee40c2629ef7c0f6a5107259ea5b9ffb6f29f12c32f7b5228cabc986ab66450af9dcc3da09d0e0b9a4 Signature = 7b1eb677c3e5e6a8b4ba69fcb7f6b1870e42a8d58958a35c674e2db82107481c4c7b37f0f689d39d9f51e181b17b1108c15a3e27b29df3a4315dcc4faf122205 Privkey = 8ff2398cd51f51d4c2c57869a2218b8486822031f400729f4ac4d5909c48bafe Pubkey = a5a88704b68677be3d16c3dc0052cfee6e2b30e08609059d4cba52c6d96061fb Msg = 993953e47a341188bc592942e1557af29546e4e9368e2f1a5ee9806e2baf66b6190191fc5d2b7e47de37ff054fb2bbb1f031684ada5d607adda3d65433122fa904e0456faa84109bbc517f8ad39660876382adcfed0f7620cf1164622eacd91eb37a8596462ebe9ebe26bdc1e32cc34ad46fb1cea420e73c31215408e6d35425f44a829b132f631a3f6dd4b873a000667e19eb22fffd5903aaa7d4c8fdf21953c3c6178f5f8cb2aa6bff92894ead835888df060a3c9043026e0e2cef275497e7d105df3b644a98f26bf00105c99413ee0af8851954d65ceb8d79ad3071b8bb87f0b19743d2556ffd9819830b6eebf7ecc7e045661f43570ce9fdbbe2d252406fa90d04236f222c429ec16b1287224ada1a532161ae8b481bcab8d47afb3ed0445b3060fd6759179856f4085c1e585fd7c1409799af693cf427bd1d3dc10b5ae3447a8d2a18dc3a12a6860b22175dd5eb53a0950432e2d7aefece8af0ade3d8567743de43690f2d253723c5d7e48bd30d2937593701cecde9154b7665cb611d7d Signature = 417a647829c92898e520ff5311daa0a139cd8fffcb25a18e6d9b50cb52cbc35424c39ebbb5d5ac6a6d63f1f53c4df212f7025a8aaef8e36493c874c3ce341a0e Privkey = ef816c8f5ec34ef41f68831d90cd29e52de8973782d003ee4edada2ada2691d6 Pubkey = 47f9b363a88a45053a05bb72160852bfe8f7dfefc2f37283de346752caf092cc Msg = 9593c35cdec535bebb6965da68eab0b646bffcfbd04883bc4cef90d5d01f018c63c9b0ddfb3cef5e786284d5218caaaf060e9288952f16301ed8a4c1bcee256356a0c8bda359fbaa2782b10c86d18e20f7a0ec99b27a0b4dbefc0a262a3bf68fe81444dcae5f693eb0f16e6ee03f8fcbf3a3398146d20ec4d2657761fd0320fee7ea703c49a6a543bc9bba911e7925038710e8c36552d476d6027f58b2c52ba51ad65ea4f039c78f96b889102bb4bdd69b68e9c3d45b5176a2d82b0b95dc321016370dae30c3936515db0464c41774301c74e42d89b8bf4b9c19ed554b12febac0f60ddb3219ccc5603531dbf2eb5f293425d72ccefa0c7f144aba89347b296be87ff18994b4a0c70c930f059303b5dd4c8fe1e6bbc3cd68c6c0d84246dc6e6140a2abd1780b13f1594a6019d1778b7cbb3a3e3a34bfae7297f0b3edc376941c32352a4be314b84a9d8d6d7f1f38a0ad3798020aa2a331a402be9c704484744a730cbdedcb904b6fde708fbd14bfdc29efd461d1d0b5825de0bc79422b69a2722f Signature = 65c5d10ea7bfdbb38d55364a9968f82b548224dff3363b2ddcf585163dea27dc63b0563eb1a8dfbee951d3c9b33fcd6bbf0921c3abb21786b229069bd9ca000a Privkey = 45eb0c4dfafa2a7690ef579c095456ceedcd32f0b6144d0c380f87fb744a0b1f Pubkey = fc85632c98384b5f9682aed9cd664cf1f48e588be2d568e5c734494df4c712b8 Msg = 6f66d847405a03d7bd6f8d2897dbdf04e76d7df2d9470a4996b7dd6db88500f8f4f83e960e219a2486e24545add13614550414d827c41a9b08318daf01b15214c64a4266cbf8a5717ada3e62c26729073e16ddbd66f2d520e1e09935de05e4db11c396d477010aec66aafb762e69238d0b9e76b452454bf9e451e76ac79e6990d41b932bc32917093783c91bc9cf0bbe3b514070a1e692ff34fd06b66ea11f39e10af933ee96d8e9b677cb03737e7964eeaa725f121207f9c1b26a96c616df7cb7caef47bda901368ff2ea586e422e65bf21a691bdd2c13e67fff58cfbfed81782049dafa0f727df88623f2f7e8f262daf939542a187b8720a9b6b2b09890e54876b28a43874abbe3bfa981f8138b772c5d51736885f86acac2215a0b010dfc2c6b150845d4f8296252586a3e115f303c3d8a582e20fd2d43f6c446e5d00280ec179823b7fb4c1b0feb94eb4ef1707f5184e3b52461a7562d1f307cb751cdbbf6eae49ffae91862358e74e9548822b8a049fec6bf4c7a99cabbe09206577b657e31f Signature = 55851de8e1092f78944f6c6dd95bf07e2dbc8df7f57ad576829b978e3af58a7a8e94ed4dccbc0182467edf0bad4bae7ca84aa9a0c17c61a9e0ddff1d7525d704 Privkey = 709d2e199006f5369a7a0bdd34e74dc784be33880ea3c5dd10ed5c94451e7972 Pubkey = 06f989202ba2cbc9c150be611262aca00c45f012f89fbaf89f8ceccba0b1934a Msg = 62f003140fa09e0387d187a0ff96c4563df9f4e28c2282c0183ac3eede1312354921f780fca5361d3068d29949630b7530cd5914ace0468d014b6f53d839b82e38817dbf2d8392c3ce3424eab86a24d804c7acb1ce7acfe0a1cda4393924283105da4a7741196e027550047f85b7a0a01d454124efc0e299f0ef9ad14350543053482261528baa56e65999ac802c00a336267c635106b26403c19f391d53bd82861d6d48a4380b3043aa91d649536881204eccb0de20d43e5a3755b7f600916eccae42a0c9053b462d9417a13d67d778264a896e8eaf90baf66d29e5438a716781123a89fa9b8beef91d965af2f4a1a5bd5d2e2aaf46d5c94b7709cdd38d05feee4bfb76a359077c16bc4be9116e69001271cda565bc19bf47d4f986bd9c0d184cd8a3520ca1bdb4b505aaf7cb4ec9f94789779d30714e79116dd5019d59b28b17dad96f4e2155ad9c61274addc6b638109504e9ed19f4eda5377762648c4098224e3391043e4c2ad591654c9e7f974efdf0b0504b6fa5f646cecf44cd372412372505 Signature = 629bf97b0c78ee6a9c8759fbea28224e27abbb6cbe4dea5bb797e6e0fe80c913f953e3a9b623352d13acf4ce6250fb029a1e198d72bd5e7402e60e9e48ca3501 Privkey = 5151617421aadc9c95a442b45e7ff6de06a2c733b85bd789fbad414ee3c91add Pubkey = 14941d559761b30ab0a86d47e0f7d1896b33784527c80af41cb84810cbff9dbf Msg = 216e9d40bcdc3b2650188d121c9f8ef29e914facd022fe01b90ed11225f2eb93538e5fcee5ab8045e9199aa76a16bdd0616805660e247fecd7e22821b69b1f8e8a58ac3fb85691d75d5957a1daf53ff9ee6476d7c4bc541e6ad38e3a34ea90fc52a48b9399f92d17c9bb0d7fc3104c55d0efb4ea5b831ff9490b3f79f4d9d699594b741566f2b50a8fc78cc403fa40f5abb6638a32f449a8b3ef029c402f46931ad2bd3e8e683108714c989ae21689e9c444b9f55b81119bb5035bcf73e97ce43a2218c7bc3e430d1e814f34dee057265d3194b9f43875d8381f525f78576e64ce692584faa30fb743a12d1b77614d2e10a6b856b52be27cdb630ba1f0d3a6f8ea9844542e584ea0a2777527d0c52aca949aacda45ad83d16d5c83d663adb79cad6f3e39e990fe282a14c353aa2379d7f06adab74cea021b8983a57f1d0cf703292eb05ece89c53f3a1265610e0c1ea8ddd444d1ffd6bc3d03f0a6e4d0df5c5b8dc1f95d9f5558b118afe6bea0f6c2931363f03ab34e757d49364174f658efbbf38dc177 Signature = fae4773b334460c77bf01ec6366c4fe61c0cab57d8a4b03909c619e11ee3461c13fa21576f63870e423dd04181e4a7013a7524f246fe33853c674162a7815104 Privkey = 38bed445556de74482bf5fec0506f9af330b151e50d4774dfe8591d7b7e0276b Pubkey = 4c0f9c49a42f4047bfe6885551c5e4b856cf771a67af3f89dbf602f9db9220f3 Msg = 0ff0031df0beeff3710c6b763f9b8ec81719bfa1528ce46519adf3d3412d93fb188fd497d5d17091c0f0345960dd0eb0c09fc4005173665d4d97f95c13828bc76b3492b87a4b64253c8b5fa47aa75fa3b86d5abeea8de5959a602289136f60a69b309e773b2255cde19ed2a2e199c33db11c16ade08a319750b851d92c692924fc9859be523431cbe78ec092db1129210ebbeaa7c2a2c000eeb105ca0301a48f3e45fdfb15b275cbab83ca5c99d737a585320e9e3b317179bd86467fa9694fcdb2ac6ad36ed7144843dbc34e423d35afd7d8972a1c43c199a191abd6ceba4936d395c995a3eb13cb057f88a9dc9490fe98845ee5d26a89fb642a2a516dc3056c54d3637213363a8628a42a395d942b954a89e8ef7a744d8ae5adac88c616efaa90e2077205a60baffede5c87bb14dead306229495f698f3e490616966b1636387d0d86183f945b24a9dcfccf4d36722cd12ebb6bd8e78325752afa2b1abd13c4bdbcadd170869136826242acfb721de5ff27ba8aa0c018b225ed3404803ce9fa2d508d8944 Signature = f702d0d463282fc7fd5f8f9029b89c626cafd83450c3bb9dd8f6589f0c4b4b71f649ea212e5e33487c59c168ea3ad83150f1fcdfe8c53eba65adc2023c25830f Privkey = 055460b32dd04d7f4b2311a89807e073fd556565a4771857d882794130a2fe5d Pubkey = 260f8fed4bba30b9e12ad8523fbb6f57f0a7a882550061f1da46fbd8ea442221 Msg = 7407f96ee3e79c69d36ce1f64e4f188655ea68b947e7e2be97b05ebc6d4439e950276ef3f0e6a03dd48b24f66929b49c1580eb468807e1e7a25eb9b94da340c53f984f8b81603efb61047bf3f14b686d9798003d2f68589a79ebfad54409c71c90ff67c11fbd76cc72c2d145f458e42f88b75d250eadcafe66bf37ffc837b62ff006685b7f85a9d875fc078c82e61fe35d1922527a551dab62f9e477499146bad912203e664c417c3679c02d872abac0032f8cc77f77bfe54d3326fdee9276a48ea4eb251350406882d08c830e7649fe6854558a7513ab2d8d2ac3e5ced8a808d2aee454779edabd1aa63bb19f718f470bdc8451cd9b294941e3497063b1e39b6ca184562fe838cbfeee922de24ddfcf9882c5e615b11bf904817fbd647139db80b4e8feb37f11e1852d7e876db9cb63c94d7ee34192f7200b5bc77a0311ae43b806ebd4c2896c53f58f7ebc1625cb20d7107ef9db0da28788523de991ef6c5866b18d8de83a954d3281e06dbf27c4f2382e08cd0e0f6ebae3f961b77fce5a95a9b0621b756f Signature = 23f4f1627fbabd7891d7d8489631c7231d22de71864e262ab4da84ea8a13a60feac4dcfb1812f1200444b775f121d7266d755ce9b6a9ad796559c0a26b516d02 Privkey = e9f6d31b936942c526e0f9ec4f5a7ac25fa789e0c434bcd9199d720c743c84c4 Pubkey = 32126d26e28231c5b585b13f43a01c6fe542946b07d3a91e57d281523f5cb45c Msg = e88133f3d17642d5c22779a85316ba0df34c792b4efee49ed7dd93ca3322ef47c72e5b2e4595c77800434b60719adf54e4c1a34c89fa1e27ee8d35a0921f9755ac4a77a6c1684ea0f5c8ee5f759ce59bfe8315800a67aa6c64ddfaac92eabe6c2c613779784b3affafcc620f2a6dc5cb8d8dc7d74aa4d79494678494e5e6394c433c14809ff40c9a592d0d694a81103b44531e1f48bc13965d15af8bf3340488f8cd58f09ae1a6616bf85ac9de7e0c6696aa2f1bec15e17a44da4a84edb4ec6d77247788ba0de3ae12a155cbedc0da2f568eef0b75a877ea5b0c2c0d4bf2c61d468a46faadfaece35fc263a9be9987f4f7f78f05c707784378c7b8f7daf9ac3a122aad39a1677966da9ef286c9e062c4f439ad0bddea26e54b2f7388e238b2a64928450d34564c5a447e7afbbedd1085f1f24c11ae084322d1a32cf8aa473941f00d56b1618213cab3900aa606463d9f800e926f9f42d4b082d8c5ec3a4a025b45f9aadc8bcbd17091b3da49e9453dc55e89b5b5fe6b31f5eddad10b6601572568d8e205d3251a Signature = 7e3b1c4c716c808e90b974458915f3b2239c42077119fe270788fae520578bd7da6488044132e1bef23e3b23c34d9c1862744f28fcaecda6cac0fd72b93b6a0f Privkey = 6bf4caaabb96854a38a572f4ce6c7838f7e750118c73f2723582618e2307f838 Pubkey = 08126373d056f00e54b8d43d77c35f5f919833e90d8aafd6c8246d27917ad091 Msg = 4776e9d60085481fa537bf295bdabd8b1cf632a8cd40bce6bd325c129f977000e88468ebf2dc158ac0f207212db00fb60b8ec8bae229372e9a6b01530a7ed1bc9d389ec8913f59030d5b54af56ae1ccc28f37cc96a8e53204e92a677766adfaada99b0281f867f61ac9ff7d972ee3ed427d72faae75d4aec01b5ffc37061b6f0f7e5714c4cf30d5b731b0746065f19e4c8922dde642f80fe24a3c8dcb2e5f1c266e2af6c37decf55a2baa54f0d5cf0839370c3e0b4e77a4f36bbb3162014933a4a4ebcae8c60961ac6dcf134f30828d31402ae74e7e8513c9d2ad8ee46b7a9d53a1f87ebfce04f461bded1749b6fc4c4f25793525692d7a0e426c84e06082cc3e6abb51368370cbb106c7a0897f66d92c9739cff9f2706d6a2980ecea3ac4945f0f47e656bd9637777e853d2a839104327dc049ebc34f049d6c2f80eca99db7b418424acef752260d2d427949323997cd9617edf50d441d0088b1d47912e35cf542315265829f383f45860d3b45e735bb2f8586dcf58db4f2acfb4a68853a96eed7b89769d365613 Signature = d2113f80d6cf928486a250a679d6e74b35ea9d26061fa94d769e1a8fbfa0a734227f55537e4ebff59336db141cf5d6d482a0711f1e9fc72ff70956a11b4fb909 Privkey = 5d9585736ab209b0abe8bf74aca4eea4f6d1650b532550a223e044580f8e20de Pubkey = e77729edfd2144b2b12078765417fa21f1594f09b269e9b6706802b4f3bdfe85 Msg = 08693591e6c58a5ead9c85fe8ec58508f81a3467636c2d34fcc1f466e5c6dafdc37c35cbee35589c6997e2b15448132744e5a1e131bb49bf5c2563f87ead3efe01e88cbf24cc1769c78cdfc167e378215b15859c7a28ece70e188fa330267d3fc57b4ace6c1520ec67875067fd33be86f4a1967afb3eb164c797cf28d8072aa69d82afa38374f8e5797c4c28471b7d69f5b9c7b4acdbc19f3c5c5d400808a982a47837aed1b3841d69890eeb31494e10e3e513d12d0ca686c7ce651778092703fef0dcc0214077dfb361251bdea4364dd41b97bceb0fb1475a50e4708f47f7878c74401e9771cc3fceace89169981aa77250850090d181d8358ebba65e290acb0352bece8c579832a601551816d1c05621ccbbee0fbe39ea2f195393199e69c234c2fb1c37e474840860ce609161fcfce2869574be0d38f95e20f4f8725247b9627b46e834905101ac12b934cbf87cb2d190d2f51490a82c4e810eddb81f956a9f36bda497bca506a49ee9cd47fda5b7f2b884a3648cadd12ab61898ada46ecc970f81dc9f876845db Signature = e7b08e1d5809fdd8529443d65ada5dd655ea55b5415a011393be7071676486d358e8d2a460ebe075b0e701b24c9e3ab5f2b033592d4de3b7f37fd541f6920909 Privkey = 60b142f165114143ca30a604fef51c686436aa1b9afdb266b3e398ccb3c4d855 Pubkey = eaf6c5a76ca99bf7306498888c3b7a1feae98bf8988d7f2e1547f8f53a4528aa Msg = 1815dee1173b78264720d35b7cc2454a000a65fff214e2473e20bc83f3ecde9c04c1e0696ce6e55519dd2a75ce0464bf601adc381e793ecb9f8ce7ab87b6ca2a3e410f639069451978d14873d3390fab8623969713c3dfcd58d86d124073761ee09a652a48767f9646cb726ac454ac9a1bc5faed3026b703982bc2b1e0758210e1d62519230eb2b2f4a486bc55168560c4363df5ff5adfda11ac7ef51b18196c94337c07aef117990f770c0f1e8c0f88eb6ffc40e8ed7c3a80a632db1e7f63b63096e2ac49e57792b31143e2f4faabceae66b27471681c36fc1139007f9b548cdc6e3b8fbbdaba7a8adb843431238bb461ba24f6e09f62c72d6377b4048cb0134c25a5411a20bfcfc13e48d80e36bfb0da7e0185d33f1928636e15dee0e5df8992a16572b13ea8f7cf85cae32d529f66e8f6d2fb2ad0bbfe7199169b2567ba00c781b20a48e1d70df9fa3119cd7e5bbe58884b0b51218940fa815f85625fa203471cee8084780eb0b9356f9f3d4f6df740301d707ef1ffb3519e3f90b8064b98e70f375d071426881718 Signature = a621f084ea1a36ef812a9755c9afbb53dadaae6b3a53fa8344ca40d3612a268a35fed0fd398ab75bcd639c547937c94155ab1a7a3467dd4bfddfacab1655e908 Privkey = 734ba47033c6140232dd4a7a14f1a7743eefe9070bad9662491630cc9d28c1f3 Pubkey = 2fa5df3026d60742e2aff6b57842c7126846c8a7bbe9266efa7b3f2398c357ea Msg = 5d3c659810c3fea52a6df3861e5cdc5b703cc1cef48558c61d8c51d0edea5a1479cfe5063d82ded9ca681e5748887c40ecfb9e1a9a8b7f8509d10776461c3923399693a78189089178d5aabd15f8c846642be47d6d4caf13824edcefb809868fa72ddf035c4de8ef0a9c832264f66f012761ce6955bc3c416e93e29188025ebbb13a553258c1d7c499c9a4aeb10bb36f61d1bb4cec5ae55d175722b9a9696df881951e35200b9653cf6ed4b3d15de087a9d1c319fce8582156bebf3fc91e0e610ff7a15308fd1d2c6069fbbb2947d3110731d245ae2963014bd76dea42db125cecc493c8e9091a76646577729aed4966fce9699fe12e367d665df9e95a9193e1133e143af92f82b66ac7764e5033178690521809a7107d8ae9b88e0ed1f35b1719901b930ad0e1cbce7fb30267b1155204f605f525e49de2988ea7f74be8815177fd976a1bcc126d9c9c135c5b4276d38019c34aefb7a0220f7f5aeff380aed627b070c2c9e21533bb35c08e394c85ae25e6862942599c65dbae5977a584a88180e0c8c71e5a8409e04ef7 Signature = 9bd074d1d0bd28001baf7d2d4e82435df08c4264d8cbb1c381183c2f01223f79f94923ca178cac75564e16c7f56079088f7ed885de4d509fbc78f438fba3f607 Privkey = 45e34d0ef4c196fa6d572b6b1774b5218f7c3291304c13500df7070d90e8039e Pubkey = 13a7304dff423359177abafa5e6508d26769ca99cf8af45c383f3ff634406003 Msg = 3d9ed5c64b75e135df2f5e85300d90f21b363935e2817556fc9311751ba7535477dec8356ec385efb82b414062f35bb6d3edeafde305f9900a25e9813c9ee0237d46409650cdcdb5dfa2301a8e2647f8d3819d86f7b7e3070d33440f82c4054b1ab5edebeb27f95b3c4c6fdd468f21600f03b3494da200bab9293c38d02fc44048e52ff5fd0f7217a04d4ce912a180d1628f368280b6892672e8ff98d4629ac28b60c02a301e6c6026c1b9e9ef21cf0392df225008d5a0e0284b282631ad1710f811615697066c98296519948a7cfed5aeeb454ee7a61cc271bd3d499be17df09d3a0e790ee6b9bd99e1b919bed4a063b8d1a34f1afd2e952b9dfefd770969c8b2fc37977abb0fee6317253a23ecc97578168973334c8f91763ab97f29c49baeee7b35f3ae7f5cd3a4a6e697ef255a3c2ec0c752a3396f69f663ca1fc2b332dfe6c0faf78afe9c68d99571e8e896c5093085e9863a27648a9e58f3a9a84cbbfe2b41ca3633dd5cf6e82cb77cecacad8d78b353f48db42d99c36bcad170ea9e98abb2788c33a3c706268f3631 Signature = b42c1f925f4baccd129efb109db354aca31c6898f4f451294749a26a6da1677bd3a5c04119e35f47319f20cfdfc08bb4528b21009e00bd41ebc0f46863bed10b Privkey = 888ce2ecceda9ca2b948ac1443c2aedd7595aacf36edaf27255bde7a6991dcc0 Pubkey = 016e572b4f98417c6ee297abd784ea48226ff4fbf0050a5ade8806e7046d3ba3 Msg = 5c801a8e664e7660760a25a5e1431a62159fc3f3aa713780ae7cbce23b8564782799bf2be4817ee2921965bab7e1d44833824c1628d42dcee3e46ae42b2816d0a432a1ab0bd21fcf30adb63d8dd76569544343d0035c760522ca68bea72c404edda1e9095ec90f3325681c6de0f4c12d1afbcba2c7871a1b1e1f19c35b0bed9ec2a87c043d36d819396bd5d099e1aa090391297c733f65a8c5d2120c67635316fab25b4d4847a45fc3f76f2e2426dbee4629975062fce14e2189dba27fb1ded2453f001debfaa899c11660612d2ce2ad2f762ea5dee7e71e58adcdcefa79e8e8b27fc4ccf89aabf176b5d34f82dd15d889f9f087dc9ae8a42a72f3b83583616e170637cd1adf38aa6551cbacca3602bdc7ae210c4a446b3af8db2720e549bbedb8bed215ae00f19da29d8fb0b642d27b2d88575f0ee84f3d129eb774d20f537a1c0fdcf717bdebcfe47f8331a341864346fa6a1c6bbfd178819e387a0d5499a68e81cc9f82ad39e31e4dfe71952d5ea5cc8052a3ceed1751f59dc7ecc9742fad144e18dda8d0582e74e39ca8c4 Signature = 99d83f148a236ebbef1cad88cb3c7694f4986c9250e21c3603a0d941bff199cf77d6ce99efdb20533188d68ad133de033a1fb3468abb706d2b8b4fbac08dfe03 Privkey = 617390857dc10cdf82b5c94261f58ce2d44aa2f57d298f08a2d6c74d28147daf Pubkey = 89e0c3e0a0f130d1916e0e3849b7286fa2e3ac4c17bd1f716ee5a72f0257fb8d Msg = 1fd9e7453eaffd7c9b54055622dde170dd58b71cb945de75351d5fceb1f536bde25158f03786155f953dc207a1708f90d95b15aca0aee3097fdcaae85e4ab1c2cdb705c53e6c2ed21a994b304a75caf2ce4fc7d61f561e74e297397e2cde5cc69056940343aa81375d0af18d17d2f34c0a71dcf1de3c4fc488a14c5fa6b3337a3174b1da7958fb00bd5955148221427c60dba04117c80d2488656dbd5343de891287b50ef4df9825eda76b4977f3acd4ab6d3102fa56878306cd76561491bcfdaa1da567e677f7f03bae5dbf4426c3c4a6c3d082f9178b2efdd2bd49eee97ef4dcf3f0f51bbdeffe5ae6601e28019518f827f02e51f6679b8715978bec3e69d577156dd719959371baf034219fbbd17a2369a8541490f6a02013e33e74f4769be37aefa4defb6bfb3f351c2a261482c2fbec49f85f8445456e8f5a474030cd72d095ef6a622030e1e43a0c5debb034731d2f5e8e4ba3990f077d0c162649d1fa3ea4fe1e81d74aa849e21b059d966cbad4c493ca10bafe7a69243e3c0a6ebfd13d697906303392ba65d4fe06b6a5 Signature = 63e90a6afbbbb0ee696bfb56efd679d68a9851a8947640a97f41f68edfeadd216ed8698e2e43c820c9044caa7adaab5b76762b681831a9f760476a8443c43c06 Privkey = 877d017436369ec2453fed46e977d6acc3a7be60d31395ad6e7ea9e07480e4c9 Pubkey = 4e65422fed334a55e8b673893eba7c181dd724dda002817b0bae28acdc3f7fc0 Msg = 4ed3f5bdbd41d0e3b0a8a7fc3752eea496d6141678cbfe06757f61e1a168d761b6da83052f7994950d24626f004fbe9b8c9562e0c955fb3b5c08fd2d3d258393a349030c8e156205b40483038be1959f1cba490a87fe13899e4f3752063b68fe3e1c5071f7db0002f01494b4a3ee2e07992bdd200db4316629ee8a95ca347f0b28d6402a6da8b53e6b32581c3691e11ae9b6e0f0494894e649a92d03eb49c4d6833fa1f54f8dcd91d06936a6e62d491e2cea46dd07d9f02d3254b850bc9749f258a61ad3b9cc24b03287331b85a24143aaf8fcccac5f18bfc72dec75c0233516aa6e4589c78c665a186ed902091df97b0d04e83a2d74d789891aea2cacf813fffb5efaf78dbcd7af54ef55c77b1c4c8ace9e9278adc23d76c779d64b3bbbd1fb33b09836ea64a71e4711e89e8da0f709213342176ae22c6e7852c3973b60d9f98889b442aa48d7bfdfdef64c36c586c4fb2ad2e27ebe479f6d722f069fd6106b0d08975d5f721547c3b9c52f9fc5f45bb45b5b632188e80626518a79056bdc4ee1d2be6c6542a21fadea92c6dfb776 Signature = 7688f3f2401eacaf2dd88e170ff1c4d7e94822a77f6b550b569e82152bbbb434057e01230b05ce58ee1dee5226b5c7cdbe5a8ade3b9465f59aed74145d14330c Privkey = 4f0b3607d70b0f2698327ef4f1982c5b4b94be78f50c76f43bd642f1f0ede39b Pubkey = 942b43089fd031cec0f99e5e550d65307fb6c3e793449fb390ff730fffd7c74b Msg = 9f700a1d2560f69d9bc105bc83bff539e4258c0248602013a959b978a19cc273280d90c0178089578b50518e06ad1eab790ffe710c63d78887a95569144f3e58a8837f93dd516fcddd22bc97a7f14411d424b2e8e9aa7c280119ad94ce92533fc7fea6c66248644ac3e1beef2553a6f61e91b9379b0fe0c68b40681455b311f40df0c97f53fc954242c375e7708d61bad9f51296247274fa01a7328fa5009d9995f501ae8683552b11a49d2638116723b1319450a90138d278cd9512b80ca5792ed16c683bef92ec87884c9f07f137dc47a13146e511065c2e1b4b80efde88ae12e29431beb7aee365c16d80506b99afa6a1406edb061766875832dba473e519dd7018f402eb1bb3014b7cee4f02e980b1b17127e7d25dfe0c168c5344f1c90044f827707dca03070e4c43cc460047ff62870f075f34591816e4d07ee302e7b2c2ca9255a35e8adec03530e86a13b1bdfa1498813098f9ba59f8187abcafe21ba09d7c4aaa1ad10a2f28334ab53996147c2459c01b6a10839e0301123d91a35ced7af89afbac7d9cf8ac9a38ceebef83 Signature = f396a11f2f03c61439684f79001bd4f346a348dcf1d3beb2d3bfe33ea73a5ad4eb97506acfbffb784e77548189cd599f8ccf17355dde80e75024ef2a78d5fa03 Privkey = b8a0010c784d8d002a31da11d022d30188a4197a1d5f14ea4c0dab29a2e40668 Pubkey = 8bdc63e50bede13c91a41e4b4b7857b9e553f484e3c1ec167dc04c281ea86622 Msg = 5c6ccb298be216808b811e56d972f456b69ad39594eee354701ca6b3e38d1f41a359e5512af98a3a0873265fe5191f4f2ecaf66bee75a3ac0b71a4ddf2a759ebdddbd88a6a1c6fd0fcf7d7cb92a84e3307b4a4f98c710abf4f553dee74f652d2ac64bc30f72bf4354ef7e806a19071a051bcfcfb27e37fddd41eceaec1758e94695c670ef4c5a5902178329db9585c65ef0fa3cd62449bb20b1f13aecfdd1c6cf78c51f568ce9fb85259aad05b38c6b485f6b86076928ddb4e2036f45e7b9c6a7ff24ae1776030e2576825019ab463ebf7103a33072033eacbb5b503f53266afb82f9b2454b8dc057d84f30d9d2cb7c3a31a7dbdfba5b8e49231c231396c47ca042c8e48a1a5e3ec9afe4020595390f9990dfb874e0825ae9ae5e752af63af6fd3e787e75e8d8dc4c66302277ac01b30a18a56cb82c8a7ebdc915b7153255a1fedc492e49660262bb249780d173e1fd20d18c4f6b0b69aa2eca024bf3c80d7d5962cc4a129a7943b27f33cc799a36045541275a2cdb92a40e485ba8b737a04b43d29c3e25f76cb3d93a6b94461f88f5696 Signature = b3f6cf4c0e0f9074ff2c2c47e163202f1e9d6ee117cf757633e4abe74423aa70008ada1509ec1dc117c1c230e9b23786f3d0f29b73aa284536e9580106a8a70c Privkey = efc86cbe40363abfbb2a4b1fcce5fd6084da96e7e814de71aadf9a618f303625 Pubkey = 22f295cee727d28d2b9317153e7d9412da1065c1b16ae2a251dd1fb431c62b01 Msg = 9e4fa45dc026710f6bef4ed0f07c544b0bb0d88fa79e7177d8448bc209d71cfe9743c10af0c9937d72e1819e5b531d661c58c63141ce8662c8839e664db79e16c54d113abb02a75bdf11b3453d071825bc415741e99483546b8e1e6819de53017092e4ef871f1ca0d3508f937828a4667db11ffff9416eebb94bf9b84d654603094834a99ca70b90f562a86823624dfe9cb2f9e88c173f13464d4ce255f222db50dd63ab42465734e75295c064b64cc3f15e6237e37f33d615f7c243e4ba308960cfd4393402525500bb7902970b3931d48b35666a2d4d2ab08fa12af366a004346c9dd93d39fb1b7340f104e51fedbb533605b5ff39cf6d59513f12856dcfa198d793b0fc875cdea0741f1455746d8a19c3e9d928f0021b01c25131811e48c3c75c6f41422a8810c6c81f35b454eeae8cd17cf3f2e6f0bcd9f290984f496578623ab8e2738d2d10840eb91d101cb4a23722b72e3dd185440c3b9f44d46a393a34c187a20d610bb698c50531741efe96323512329800772a408065a7ef8e4e4105eb1f5bf6d3fd6b217fd836d89f53b96f45 Signature = f8818310228ca76111524ce94bfcb0246ea63508cee9306592b2f77548edefcf76bd1454508ea715042cec169cea5115ab54235cb1097b10702aa38378028e0c Privkey = 33556c60de2f2c9a9303b99add378592060505f8e49861085a4b15f072a7ef28 Pubkey = 231ec8cd845859f69961275119dbe4f715e5ec5aa98bb8741675b3c2d0c89fee Msg = 96af540ea2b1923f5fd0aad321ac032070c2d65ba13d164e75c3469758fcf31bb31655cb3a721f9cb34be2c90c77eb65be37f606d32a917a4cb9a709ac0705229930ef6eb6fdb0fa3c0fd3a90ce171674ee3ed06354bafc3c7075467a57445b80385640447902be39262894b1f64fea58287dc322d19875972a7c8be91d31f021c70eb682fdf11a10f8f582a126e064794838c69fdf64f5b6e8ba59d48b4384f8e9fb5c087cc7738295cd32344ba3b697ee6b6a8b78ee7a9575c97972a4d1bb18486f9037a0f3c6f471a90f86498dbc0df5232c07e8c01b690bee75302992a7a36fb4437c25a8bf5e34cf7d5b55572c700a079848d381364f9946a91eb1603ff3de5ebdd523bd92564818e237a53e8f522deaa2c29b897e961586e100ed0fc0ad70d160934e694027e5c957920bc0546e901be39a84535597e1f280c222267abe97f41205d8171820dd2faafc0699419321a9160f69b99fd41180945b62d2dd105cc7bbe821d28605e098edfa8b2309aeb0534e756377f59937c67463fd87c8b92ab58119cf4ce6c665af572fbae1de4a2cc71 Signature = e06a7a414457bbbef2bac3775ccad087dacb1fa4bf938894e8c929118e09e678dd19938bc88f43ed0f7d31cc6a0e602c4e4d1fee33d41e74a119fa2d1e4e340f Privkey = 7a5c74314e1183334a4b6226b9a82d70fc2a124e3f87db6a2283ee05b68e34e0 Pubkey = beae7d3dd97c67f6273bfaa066131fed8ace7f535fe6464e65791c7e5398576c Msg = 98bac6724755912992adc2a48b5442376f2d927997a040fb98efe544eb0c8e1866b9616e298d3360316ed976bd946a411fdd3a6b625c0c1a37af0f41cf6569a7884ab8467491a987df3ea7a0b7ebc4692569a34ce3a2ea3503495b2c02d49d7d7db579d13a82cf0cf7a9547a6eaebe68e7267d45a60b8d4772455228cca4036e282e1a1216f34cef7ea68f938270bdb04293c885d005f9f7e638a8b4ead2626c0945174ff2a3e2d6e15a4c0338c09e1260f0928ca9d3499824f3fedc4785da49c5c34a56855e241facc6347a399ddcac4399a8b158198c151461a3b189e58ec1f7efcf2ab2031fb17b6f035ba1f092e9eee2e92c2d6cc2032287f854b41e70fc61c8d11a2e4f0708f02eebd02e8c7e8c7b38a57bfa1a745f3a86c23909f6f89ab16ce7e1813c1d20147f31b4cf2ad0b606fb17e5ac1ab51ef4a7d8093cee9a655f471dc5b146bd1b93e540a3d3d3e2de8105911c10d6ab5ff79c2d06027f7a54561f2071414bd330a8785442251c810e232f83c367f0be7799a93f5238f7f17b5be829fd89123c04833af8b77e5a4363047ceca7 Signature = c2ab1f6f5114a84f218502582c567b37a8bdbcdf6340fa4622873be89106f0a90b4829505f72129df0ab3d8513268774a34df3ad21ce254b464488addd6c9b04 Privkey = da8006adc492ca5dc86c2959437a75deb6120ff787d2ecb9c20c30b52c26bc41 Pubkey = ff113bf0aa58d546f2385d444ecb7888f8caba43a174a89fd6065f2b7dc17bf0 Msg = 3eb4324dbc0149d2e7d6df632bb0cbe9a9f6dfa83e227fc07bde1b577b3611fb921c9f8313f068e6295d4913a8196be530f6a01f57c09c028491444b784720e909ea1fb69c1c1dd6304400327b7731b33cc46deb046cdab6ad1b53f1749a0c65cb9a7e376ffa02230f536584aea243c639103adbba764321649d7e0126f82e0b4fd9dcb86c731cbcc517f2016841e916bcd5fde871dc098cd913dc546284d1b2165c63e88f32a2789a500856371b50d22fb8c87d1a3caedcdfd01ee5f870a53c284181d632ec66d48b6bdd5646ac39c9e75338a520212062bc3466ef5c58765570b905f63a93d07f8f1baac3526b016da799f3e9e03a4f7f81355e0f7a76f30a42b807322051b71c626a7a296d75b9d9d1a23bcb13c9ef48a912dc057325d3bcfb3f9fadaf0c249b102aeb854aa3631e34f69ad90c2ab2ed33bacc40b9ed1037fae67cdf799d5a9b43785961127d62f8e0bc1589fd1a06fca2aea7cfc012cbf7b5b207ddc4e677d8ae4aec100045ce36c00b74d1d28250791236dc5dcc1ed313c8c246172666f75217437c6034acd64198cd96df2a Signature = 1f5375dcb3ad2baaff956d8554ecb424176be9a6eb9ea54e814e0a73df2a5d848ada26ba8e1805cd51c5e16950c1ff7d4d2764daa6f4c7502fb865cbe55aaf0b Privkey = a284e26b97e538839c808d45bde6f012a354454aef81caa8c55914624f2b7d66 Pubkey = 5ae46e34695efaf463a4208fc4e35b81f2c63593238a56f2444b850f058c3c5c Msg = 9ebfe910b50a5cb719d95b961e5905f00ec7943b55468ab5956692017645b366071f8fbb77eb49ec73ea7d64511405b90de22db98c3eae39c4039c7a133430e8010bdd39a00fd1a528b113dae149cfad3ae340da27dcc507782ecd8929237517afe7463eca2473c7acf6f7aa04efc9f266ae7b6d63bb8cc2a438b344827f0713d1f1736f0cbb65b99353f20355fa0230d4fa707328a8662654e83ad0530a10f9a69e17c099e1e2b5db18e5f6f1dceda5883e8cab79701a5e9089562ed153ad08c674f097c28e4d16633e092969a8f0bdac54527c0ee03bc200e5be612e3d1eabd87091101b4962afa07b310806992f373076d76a58185118137c9d26ee2cd4c618c18283dd19f0e7a089ee37305b6b9518a78d8098436ef62be7d699808acecf67939d61b3e02937cd8c5f1e746d4274334bc9c37fdcba234c166fd712893f3a040832ec5425e57d80f11ef9ca5fbcd6c147fbbf5e2fae746e0ddb605867e3bd050483c3cd1329abe57a60bf88898dc7e80ede0f4517de8fc807e888b621a00f663084ff94b99996628f3b11690a60f0918cb5c9a7ef Signature = bf110e2e9cecbc31fa3e0c2438cd1f4321f92cd287005a48528addf76cad8d88bb22719ef91b139562a1511838682674faa9ff7e7ade6c9d573f845036d18905 Privkey = cc97a96301ceed0f922731b685bad8ad4f06207be340f5a44fd187f29903ec20 Pubkey = eb563a7bce12db97f1891d0f610bebd55101a3125ca8dbb50b25a6b5050d3784 Msg = b9ea3b3df7187ea415a3c335e0834e10f440915b2ad41c71f255d6950a4e9120e4d494fd9e672ce53206fdc417d865897b47ac1054e1ca1068195232d4297435e44e1224e66a912d9d7d182946ff5a9f085bb8ba19c54d16b586a9b30461b6773b93950311e1619886f5a5b3f111aaad094bae31c48f1941080968bd0277bb6fa92eebf324b192df5cc969516c78c7b2d12159b4d1c8eb03160c4cd1907f62ed4b854c569ecc481c08e636f44ed7c390e58b5937d2906b2817bc3769dad9da1b0f79391b55942063055da0d6f249a3e452baddaa032998d7f73398ccd0151bfc92c5e2fdfa9b14855e6b0d3746dce248e219672987252ec747df2747fd3fbd8b714c882d707ee302a904950c34754f85350e1aa3f8ea6293cf01f717cefb6b83a22126df5c4f5698aafd06a2244ad7d01f34017ca0ece6f21040048aba6ca4aeb04325b9402bcd43ab130a105788ac3d7b7da01ea9426dd0ea1933a8189933a6c0c6cd648ea316a7469a5fdc6e7c934d9186586097b55dd51ac487bb80ed11d4df8d33626bbce95e4f13bd49922f00c920223f4cbf93cb Signature = ffbdd3244181cdf6034f4a450fdd95dee4971a933f8be022bb0a4106aef39af3055b721881c9b54d1e99b9409096fbe6dc2c9966e3679964bd7ef4c808cabf01 Privkey = 679e3e34773abe4ae25cae7d07ccd0eb3b0ec0a35d570257d62570de58ea2516 Pubkey = 18acffce253b27259579ed9924f479cae312167bcd876edba88b5d1d73c43dbe Msg = fb2b648ebb16688244f78b2ee9a273599d56b6198900d438a9e99c191425c72bec4f235847e18e47f57c3cb396655f778921f908580e8e83c96c108b20dd416678021bca259b98518fabb2d3532e4851d9d52add2542c0cb3efa3857a17e512438bc0ec4762e2f9baba429c03e99bec4038e6b0ca42bff5b233b24c333b4caead2de374a87b2ab5d80d6e49e4456329d51ae973bc83d7862f3d315e514481b12854a9dfc09e7d14f0d022c0ba3022578eba8f874deba4aa8c833f2b132861d4d51e50fe9aa4b787bd2f051aac50c375390cbbcfba2002b80ad00cdc12980f8ba8bcb7064afc04d5c4682c1029b10a6d45fe6ecd704245faf598c4659597c5d68a192cc1cd4fa45e84b549e8e5e67daa879ae5a520a6b5550519876a562ac49c6db0aa76ec69bb64dd6b5e1a3af2e131e722e7cdd05be34b5fcc6259aa124ccf814cf5b500d176be28ebc40bb21f03e24ccc131e0f41daa1ca02e6b00c9c53fad1248614e940d4b237760ab7569a767b7515dd2d623e57a2841b7d2441cf43049e4698d2f9c9eae7b2910f6ad65edf9cb2bdbd9b29f606e0d Signature = 1a51022628ccbb88eae9b21773c3f830b7b6e5bc36c9903ce70fbcf459d6a1ed8a1dceff5b19269ebf5a6fd3d8958860f554461f0e9fc0e29af9b1fb1744a80b Privkey = 9bfa60923a43ed0c24e2f12f5b86a0716329f93d4d8d3e06238002893278c19a Pubkey = fb1c00687781b55b893d6b2f4f49cf5f73d2903c316d1eee75991d983a1868c0 Msg = a99028b0f4a3aa5e79abef6c0df4a783ef470f1a29ba51eba00f6214e840fe19e5b6dc6021ab599bb2ee3699576015d79a7939af823535b630e3938c723f6e0b9229d46bb3379acdba587c238567e3d89bc3bd3519b727fc694fff1118bf22c8bc8bc82c4df7f5ad38de05fe9f762999ecaa795f3ae630a9a316d26dce9f1568ffa3f22b0295214020b3d3f5337c149568192218132a90709279c01d23baefa669e1c4e42038173f1319c212da144f1c4ea4c52c005cbc0b5bc283e74483a0dca69279deb17ae5b29cfafa7d0063f4e1bc93537efd937e58a8aca737228f937ff2a741890e96c5725da11b45c413a9bbb4180a419987bbf046bfd346295d62f081c76daf2b0e1eb4f6712feebe6f0a92e358e7ddb85896507c340a01f68d1b0f085778b7c44b014aa6673e501796959a17a688db0959058488a7112572f23cf9cdb53b5eb4b45f5953ba0c0c690f86bd75e89a047bebaf847c1dfc345a4f3c7d3beec98b84b0219003e819f5c2adb45f8717903d1f5bd5d71914c56fcabc7a290f9c41699c95584d6a3a16340cb17baa1fc5e5467af7ac3221 Signature = 55f202efb2a57be8b4e4fd894dcc11a4fc5f8276618ef5cd34a4495adb016a298e6480a35cfc53edb25ff1499fc532a33061cc01a250458aa5e4f7f16f51440d Privkey = 6e3af45e66e22890c3f3c934f523a4d69427976e6e52625f8bad558993963219 Pubkey = e097364e76ff9f2e1d167f6b20c1bc5830085e7ec993c138f8b1b2175637e741 Msg = 5cfc2f4b559f8205b39102087617f4d86c7ce6cb251e5f89601dfc88ed28e8d7a670ec0087d2ea5d893021c7044da2899a22d776fe90170e51c203250690d37a294555e74af9234cbf1ad8f22cee8974828a0d09e9554b71ee3bcf880ab98325f706272194eb2e80c701d441b5f8668561b88849f827af703ab0954105fd3c54b3f6ec5493596d0e3bc67818048310c4a3e0c556bc80675f201f9bb9c6538a41d99aa40c886fc431467218d819c23e78498aed0613fa6f973e2211df9fb87f44116f3fe4c26d6cb2fa334c87f78c08ca8c9b9041d83a1230677e0af788598a42e44cfdf6964a4ee80e38402ba67c73a581e552baa2282425cb2ca17ca92edfbf98299102fba761b9b71a5452141bb9c18dd95febc2a782de9ceec08bd2ee3f7f0c1bd8946dba99cf9ea086abafd37c9ca60213f0de17c61ff9c391c9818ed5cd8571778b7dcc13224962386fb8ca14f861e99f3b18edac8a5f130f7bfcd45d045d0ff34c81572a512363d6530f93813e5fb10e9cb8338a7f93800491006f4463e89f0ed4530e5f12df674f598904780ad0812b1e3521fcd0f83e Signature = 26ba562e8a4065708207c25e239b780aee38794cf983a37acbb9d557a65ceed3c0da47d17f3e8b8f4eeb1b65a2c182ea6f29623b63bb0f1c72592683b126b901 Privkey = 5f1f271844d9ed5a6a6f209a21408daea470f6fd53ba6479d7407105b7de4d65 Pubkey = 6085d7fb5a9b2ed806c1fd30a2afde760961f7a36b48f4875246e615a2bd9928 Msg = eed6b4475dc263bd2207fe9d41d48282b713f680f2e037384f18b4bf224347f5e4c4b060b808d412eaabcf733dc39a40c6bda0505ce71fa823bd1b1794847678dc034e7999c16369340bc60c64d09bb9187b2e326055a053f8e505ea4196861471622db0e46f0f8954d8a1f07332da4d8ac55712626009912f8a15a9cd63a74a03c92f246cb63cc73f92e51dad1bc9715b1ed3fe5f2e1b2959b9b71e0e37360eb29536cf797147fab10864d6146c36b82335a0ce931408479c7ede484ff73e2dbfffc6c9227e16d7a23f4d90f15584514c39594e17bfbb295de9d62adadb589dbbe0b06dc8dac5b3bf517b24c1837b39472a6dd38931ffbbff5b763638805b4e22321f7afe92cdf502fb63d109ddcd9e4051ad6f45598532be179523710851d3931e887d02c345c79c489fc106a4ae162f7df71ab90b751da7038a6df7616cfc11887e21068fb9e33be566402be504f3fc2742b881509bd4fe6a0fc722649883f8cb655598a15a1d4c229dd86b5caeb711a028defd431154bba46b48172a4d8cbd45bc90aaf874b6085fa284f5fed655ad6fa17d67b3b9a796fa3e Signature = 319bb4deb2178112241b3fb8f46e105c3b8e4ef721eb200d762ef363e2716f2a89f80b5b9e89970890a09892ad6a58808b477e943b3cfa77774a3645bc745f03 Privkey = 048ac9ec3ecb30a3b1bfda9b3b79a48c0793b490879e3c8a5e23ee2babcd9b7c Pubkey = 946c186feafc3580a58ddd526ff229c04720250f4cf6bde0271eef9b12b1c3f3 Msg = d68be8ef7b4c7a4289f2b18b16ade97f4e4fa16452976afb581693380cc54de38a07587f32e2d4549f26595fee2393bd062e9b00bae72498e4148c8b882a8840e15b585c82b5c0defb233518409916615deb3a55a5f84e6b3aab93844de3b1e4d86e09f889ac71c324eb12d0fbd861cc31229540e843a34f8d5be47c0ec0d23df43e06813fca309439904c167d1043c0dcd444b004be1ff27b7862b00eba9433b94b0fcdc67521da0c1d5358636c78f530431164dde20a1cf164f51e29b8e63eacdecc869b41392c667664d91680d9ac516af548f09e60564e814e36e0b563dbae55c627ffc14158a56d8eb3609e174381b21de4ba82344466dd577f4d1103c43c27fb83cb833d87afdf7412b4090909b1dde264daddce967f496bf6f17112bf351e417db5953b13b8f0fcccbf30f5bcf376861c12ef20eec89ed23cf384ee78dc6eb40fd5811a7b23927c13e7dc5da3a921b883a9b2b1155970fb0da7d2993dcdfd4343642a9d5a6347e43c193b5793e4453ac1537aa3d04dc9f774e840934881d78a39ba250438c507250eed2f6e07cc953f783d6b72b1cc619981 Signature = 2ecf5b8a59a8e27d25890a2aa32f4a0673275d539b174afa7b2cebf2e76280dffc338ede85ac8f614039560e2806d9e1e3cf9cce2ceb7874ffe1a7e80cdef40b Privkey = 2f057d20b1678531611f48f003b7d22eba5dbbd7e2dd41b7c79d09071f85e993 Pubkey = 620fc4eaa34d787df675ccbf7e893204828db92ead17a1165ac7fa1ab42719d8 Msg = 6e35f6eaa2bfee06ea6f2b2f7ab15fa97c5180958af2e90af918adfb3db8323f447c7bf26dc534997c38b7fc977f642de288cdf253071cacf3564e3b8ed6dce57ddfba9ff783bad2e76df124828fc1031acfadf01a44d41b42161ad9060301c1af1928b9e5b73b9bd21cac60a842b504dc3cc311c522e3bb048bf221444f53ceb08e77e948590e94ed98f1b604cb9eadc93bbe7431c1149b23193ff93e8569f113e1684d8976ecae6f09e0103614be418a472ef55bb8890d72b341cdd7505b50a45522ab63ed791ce8f82feddd7a620a4f6fb1d2fb0ed0c4560d78446d83b3d1b1bb56b366d196020d0624b1fbdb75ce735dd43e8e8df163c44e236993dca341f5132d825d0a4e393a19d38f61e11e0cf392cb9b646ea23c58099824dd8d9fbe26a49e33b23df80607abf19715799c19acc722ed9bcf94a0c29ad24b78b0b035b3241c64cd86edeac810e66745694b5eb1625060edf2d949de0d34f522df2dc60ae694a193f3b82c1d6f83a0cbb840f46c49a3d7d1cf06deaf96c64f8f9e17bd9ad512ae6309c486d9e2a78dceeca473a0421dd1b643c78754271b53ce Signature = 30df7b0b1c04fb1efa3517e928d6d57c2ca0d07f4e04ffb1f08b4792c5937dd271ccabdc00dce850afe50af5990f224e8420a681d95f9f7f515afec102efd10e Privkey = 3a3d27970fe2acb6951edd5ca90dda0fc6dd229c0a56df6eb11a9c54d242dbbf Pubkey = 564f0dc3dc4720e68e44dd16711e049e6112000098fa62a1b98c288042f7c3bd Msg = 4374f61c2cd88a3b8972249bfa79b36ab69e3ed484cc60e5d9541fa7686cf4eed1210c5d0dcf42dd25972501909193ca76ae6eb7f471d8bd0d5fb5a6b431bc3de0e0318d50514524de87c4b83005dfb41245fb1af79b84a97b83d3cac7ad7a53364e2e9b21c97b769bdc57f0703116168380f3cc883689eb4a7fa3b26dbe12bc28f8c40381af64df4b5361d174cf75acbd46428740b0d1322d32bbe94845215966ae588777a8c05336e352306d49278d328e496db65e9ecf6ce6405ed1c893490bc48c13a134e1fb6e80debe6d32fce6ef74783c8d77980a441a26aeb4fd83cc855352cedc188f5279ce211f744a40b23ce7ff24437a1dd3373ec5b290da1f94f43a07a3ffea5b5f67b52c196185bce9e9a858257fcd7a8ebaf9040ed091face5a155aa447fa15e12122d25e8fc36eaee2137c7b3aa30b7e3ff6cc86b6dcb9eaf49c9576f0f462008439cb1a3aba013e897a0faf994cb7d59ede5774bb144774f73ca30e6414a7cc7c74b20c51a1404ddc419ef7624593e9bcfb37c0a762eab68faca5863443e16edb759dbc8788732b9e4f59c11192c3fcc872af55f32d Signature = 22eb8ea0507349b6a0ace25cf9180cb08e0357b04502905fbe69b4e21b2bd94e22cfbdb851ae716a5c253c70d5e2b24ea78f35bc213292543d94e14110b24106 Privkey = 06d498318da456242b9c3b9ab6d532a128fce044f53882682e9262149c165288 Pubkey = 413517aa63200a17173209a4b3e78ab9383cb4e39efd6794c46a2d13fafa99c0 Msg = 3fe30ecd55077a6e50df54bb1bf1248bea4063e3fa755f65fcd1159ee046efd0eb5f2fbb38b5c00947c97dc879b36b9e536192286086d0dc12053610386174a7c56f22a85b73ff208c5944f393236c32415809da036e73cad8fc3c30378064a76afa930a3baae9aa357061a8c5e8e756a9cecf94b72df43facd88fa49cb4948c6368318a6b1e5cff52e587ecdfaefdb69081f28c2d13bf8eab81dbaa5e3728c4317fb793dd196bca0fe54a6c242cf26e2d129ba0d82a2c3a45bc8d1dfd6f54f8da4f5189c91ac214fdabf4c597381b2e5c40cc71fa7051cf2ea93906a37d57df12d5c7e5cd77c907e442566315bae51a2222d62e3f42d1767882637d66a1d5305ab4010a0e49c57def69dcea839e1b76a41135ba952cc424950e8d3aac19e1d93de7757c15ff9997b3d2a8613cd9a164781d1be331799fa6109cef614305a1958f62903c8c9ea0b23ba706d49c54baccc1e63cb4bf14785fc7b062a9800349bdb0bb927260b677b60f10e62c8780f3ebb5eb6ff0360263d457ab52fd1125c9ce046a95d89d287350c804cfd4ff2b2ddd18a9e13519f20b4d1e051af624640f Signature = 8250f76dc599c5128787e4f6d3da23173330ce3320dba959bd714cc8cc07c67945d63e75662c075e267460ab7bf561f24faae3b41dbf676899191e3b02b5af0a Privkey = 8e8e1db5b1102e22a95c47af3661469f000a33f13b8b87b115d2452a411f6f39 Pubkey = 56d7b3169a95c22998ec937925bd7cad13cc65808cd5d34a6c4da870eaf32364 Msg = b24634fbdd1b7661315d9dc153ba90d66a88622a4158f8bcff25ba9c29e65f297f8e60311800b7331b69fc20c9f85bb7c184bd4086b3a9f9a27102b62362bdb4fa5b201594250fc628fd2e0e0d1be03dcf818c6094c4c29121cb2bf6d908ed8aab427c3771c0c95f0ac1469a0810b603a470282e5980a60729197fe6c20ef681cd1b96932d2058f896ea7416422a7e541f224a5f04253080741c5d4e3eb039db6ba051b4ca5417ce8afdc70214ba4dcc85b623d11e681c6009aee4e6130a83edd0d2c99fb0647e11ede7301ae56b59904ef7025732cde038801ec7e8d90a9a1bba047fe628351b3b89d0bc5ae665a700891f09ebeec05591842adfcc25adc3c71c1ebc4a312e5471be67253b0e9428b0cae37645a0f7ecb89dd79fbd9be2875433667ae07d74a7983c4cea601e72e975c21df993e7fa22a9fabd45455d45e37031558e13a7a4f5f497ea78fb7399f8838c0fd5de4ebb66db290f43a4867d505309f1c1bc27e9fabcbba71302fc1204715ce3fcb0905bfa411c9d1c9ab4a39954e50b8e0cf736c10289563bdfa967553c36cd9e555bc8cc56be594847de9f26f9 Signature = f6ee5e13cfaa362c8971d5a4a879a7e36966525ccd86c5a48cba08d913ece1a79c4cd146b8e9c65125fbadf17bac1cabcde8fd17cfd68fa1f9c44ea61c08a405 Privkey = 3884b8b79abfd3be6c13985eb859ab743f157cd9deb81b2fe97ea4d6173e46f5 Pubkey = bd7fd9a8def13a542ed2f2fb048886885ba9b5ce59cb7019fb54667986eebc26 Msg = 12adafe30eaf2b9c7203ca5d44b97ffed4bf6517a49988e4e676c8e314adbdbe23d8f2d3e2b081a7024fa525ab5aae26e60057c101e8f368d3addb9376c4682c1f4224d7f149a8474bb9a8f663ef210e9572ce829da388d8aae72a467141adc153473be3653baaa64b5b1e2e30683f6f06dac2784d5bbf0d082aab47305ed8a8efd0886ce63a179315225d1e4d4ffcf1f24ac2f464cf5ed3a8b6d3998454f1c02cdbf0a444ee2b59ddbe0a174a0d937fa62865088ac647499957d281c6949803a5fbdfdd0dd9e91b6976861f3c5f2126f39aac935be09f4b9715bd4f0d5c55df73a6b9f2c0ad26ce49d822bf85bfa2346f3165b03859a71c3d2a7b86db6e9f2e5d7b169a910eeb7ef38fbdfbbec43a9a25f04bc3acfd3b0691542ab6de9db6f03058f9584024f9918edecd90fbb85735d6dcec5bd593ae63e2cc96553599a310f8f2009ba95371196b4d5b80e7559637f22926778be5e1ccef5126e2443fa939c2a53dddb04961eefd34e538cd8d7f0bec2bff1ef0d3a4bdd358317637f42d595538c1122251a94e963d1f81e7b9aeb164f95da9a4ed7529b845ebc961b27b5c19 Signature = f4206fcd34502441d54a73323f33a5dbb4c98557319f21246f260ffbbe5844886db567f4b63c47943dbb78fc35657d7c04d4feb042ff8536f672925c319efb09 Privkey = ecd519f287ad395052b0b30deac341d2a9df13d6567c891c813a0c9ca52e871e Pubkey = 8ee94c588e0b343585fc6748fd1b54b5770c64e9937a56357a48d44ae2f51824 Msg = aa71be5f557e10c9fb5f091a3a274453947c07a0e25b26f9509224541dff76f4d96effd0d5a41d319bc9321a86667d55cf49432fb5c3e715388f3f106c9174b1610c8f3075d5931c290099385ce9249e235128e907c53390036fbf5da968f8d012336958de90c5e8e6b1016ad43fb57c8e288dafe14e90e64b63791e5cbe557e02df8ac9370642a71faf851075e5565f6f9a267f4f6b454ce4c5474810b804844dda38392939719793246aa47454b9b0e82e9803c09935d0027f3995cca9713069bb31027f7b2af12fe5feec7eeb06843d8296ec5682262a07dae747ed7bc821ec17018d899fd167b36a7e3773b427499d99dc583bbe4b429afa6a26593953f943e4673bdd0d2a844256131603cd0903256f334d4f8ec82de115b6ca5338c75c8baa44b4ba963c7c78510d8de9b2a5852f42f3463c685fb3a6da61a8e0892662d6a250fcaa6fef74d450fc457b9871d08bb5be3011294ac888fce215d535c3b1a43bb47efe3ad25da159191aed55195469c59093ffb24f65d60c4020bfbe647ff5db7ab8a01d5e487b0b1b64ef25da156db142e6ad872a4dc1ee9ba668465265379e Signature = e8f51be73fc4e0235aa153a2e1b354e9c5d2d33a11ae0e333478de1d8e6c4456d2e250824c3246ca0e8d6ae3e16677a97344144108c13b959e1daf51cf0fe501 Privkey = 193f3c630f0c855b529f34a44e944970f4a6972e6c3859359c2e0c8762ba9eaf Pubkey = 3256f2c82e7c801201210140569faf18507e60338c2cc4118bb1ce605b0ebe61 Msg = 98623f651698085bde02762e8c3321f14da1619b5c3f7c1a568e8c26ff0c62fdcc412475912eb8e8c4b0d30918b8ffeef3509315e58da359cdc2f26bebfb5703953be16b8f3beb1e54a1abee0aebe24e64dbe873402e156f37dfc168eaf8a114ce08a6795d3f64f5151e9a8b8275cc7b49a6b8d8a66b6d4b7632ef80740dc1c1b0a38d1a28f7c1b29fa44541c1aad354d4590c231dae687a2a8fed09e8c1ebbfcc38f347bf06d94577e49ad139f710ed8bb1fd07663c0320846fbb455ab837ef964ae7d4eceea45fd7bd8d509f821e6eb027494efd8dd8e992b88698eec2ebc5e03025be789c18013f201f77aa2d34f5686460e43fb489e08776f98bcde2ceeb9d4fafdffe0375604371ec32f46b81fec474382908e9d250a0ba2780a7d6df407bd2b1eb126748d72511b9b069eb1cd44270f29fe84b9a717751831d04c2818e408f22789376c61c2ca45e32e788ead3a7536bf09da8af4703902f5516a020d89263e93701a2565eef1270418925f35a288e327bab628ac2f0248cfbca3482e265d1621cc343c31f65493f064bad0d7602460715fa486f29426346af53e333b75f5905 Signature = b12510ac5f2f6d33360cddc67291d6c270fd9ee62dc086b38d932d26473fe9a24efbd4248867ea7e915a30c5bfb3b8b19aa01aa2febf0dac6cfd6638a2ba7e0c Privkey = a88ad0048d38c44cebe735ea3802ca576e37121c7d4d760dfd88de1663064abb Pubkey = 14dd8bb306803e5a758ed68ad21d07d88161d50f1c74713777da1209afbaea0b Msg = 2ce8bca26178913b1676e90ffefd945bc561982660e2a75d482ff30aaba1ba43f82d2e6b909ec10fc09789ff5cf32a5180b601ea80fadece6d7e7baeef481dc6979e2f658ae0f6d8e416b93298f7d34031bb76f716ed991a16d09a582e58ba4003ac17be8b4469e1a889b2fbb2289e98af1c6d5bbee77756713c0778b0dc446a1f6c48c4d40818ec799905f069bc95341657ca5d02b7a539a13a02cd0376a50e8343c0dc20346de5275b1dcd4ad7af725131ac75e954825d30eaa57a68bb98dfc41cafe5710556647b387d9b7fd4e47651e5138050798f6d40f4ee7120b58f74da94d73cacbfd393d1347388ee00b79b8dbfeb57814121bdda60c627dce147d4d568d79052e97b9a5f3eb5407cc46461a55e18a960d8094a5fea48b6937529cc4ec919cdbedf9185456dc00e8d98ad1537ee10a057f4eec4b81dc60392fc9188d3e561785965092e44317f2a48e36605fc583fc173b05db9dcbc7557d06487390fbbba77af3a014e1ac35139caa1c53a8d17347f178e1c54d0f52b40e91042c93e7e481d792e288fc27e4c2fcf111fe97d9e2337d2fc1c3098f06684a31d55ebf362c027 Signature = 1341a148da4593c88ebc5a58821eef77f92186390ff633e76207084e7874ccf0eb1f9ec70a3a3f96b58934bcb061ff920124f7e580fa2b0b279583adf9232d0c Privkey = 3f59d6a018f50a822117e5b473609e30cd64920ca1c2750dcb09eaab807a3eac Pubkey = 457d0e59c11f348f3bfbdd3f327de78c0a7577c0aeef42d4c1e56700d108808b Msg = 7d103a6c6ba2d09087eef2254c1c903f067695a54c4515e4d13bc1fbfb54d6e7a167349c14809976da04a7e58d96b40aac3b2bdd14b9b50322bb11645f05e5e978bc7fbd02492ef88f87d668280fd708373207ff670fcda97df8485d5e46dc3bd04347f4d7527eab2718f7d93d132ba7758218894e75a7deabe693335ba0dc73bf26c288bfe9be8a736d75e5e0eaa7bbe8d0b77abdd5146e0fc9b30db9f07cf4bf36260a1f41410331f8b47c6b38338c6dc9e801ffe1d585f9b7fc31e9778bca3027c232c074cb18e5b72997005ffeee4bf37c8f874b1b246a6345415dacaca7075a60443ac3319236e23cf6b7544740807052114984b8d8f7e857dcc6faec8869cf96b997dfa9af9184ad623f1d90b8ca759b448eabfce18c17cfdf9a3e3312e63e5f084cea904c1c909913cc4b19d044a3720034973c7384949bd6f9ba9256f98cd394c566da83c31180109f16d10347b7e3e9dd6be3bd3c77ff1a7996a078dcf89dcdce2d1b615695f4cc9f8f4f2a08804641bca82662ce88faa53145b6a45955aec8cc2af81cccb5d7c64f9ece1c9983326484a1e5ece4ce36544d63735f7776f21a20 Signature = d7425ea194a6715c452ec4f6d6c76e6dd374d3ca7ae7a11995d02b942d4a31870dd734c12fca89a8eb0213eb139c14a87a6a33e818603b2e313023fa58737d0e Privkey = a1212b34dbca63b7093612d05dab7b4cc8f7b676a934ad01f659851b3bb44e4e Pubkey = ba2fccea9a080591be71268d7e951f250dedc00416e5f3f908db6cc571254925 Msg = 07c37c46be3c68d05689577aa64a932b906446b29baf12f6174a6b42bbaefd1f1f373e0bccc473ddfcee1a7f21b96a6260ef0aa1f2d8b2959e71d12c953358a2774cc5e6f379a313e435ed69dfd6d4a59adee3cc7ec4bacbdbb3fee5430b73f6051a6096c60e9bc92cc8fa059fac2a93ef7007d64fbe50064964d5a0ad601175cd9caba453f9103b25485545d301f03c5f9f9478bdf9d414bf1dca3b1c1d9daa9971f9e617fbfaf5b02a7fbd5d4fb894c0975c54592b49a0fc85dd0853f30c51502d98fc1ab85a17cc58961aae9764570ba5cbdbc96dfceb8d11da53364b4025fe0b8ba8a353ad23686720169fe973432ffe291a4b11dedda0aac79a5e42620a64587d2059e787013b40ceec599208f66ed0ca6e1be9092ec27db216ee6dadfebc21705bc4a85aee577e57d239af586efeec22cf38d1cfb3cd74dd0d9a3381aa81e6a297e39b819137ad27d475e2bf54aa426dc29c4ca8176df343137a2d79d12ef9aa7be1cf6775e5d8a4430a85c33db61cd2f35187b4f6ea9ebdd753d1c4ef72471159ff07b77870906496249d4278e3f3ca6bcbf37a265b896539190f9a31f1e7b4b65cd1 Signature = fa93ed6595bc958dc042ce1645167b79e8f6734c46f80f631fd5484908f5e51a22427ee686f564ff982f6ef4d2ca1f0ca5624910cdd63c11a3c2b16d40973c07 Privkey = d9682086fe7dda30b87111060193d847566ab94cfd9c97ab6b43e7a8d3f79382 Pubkey = 8b0b1372d88733ef7233f6379790d1e46e1e07e9d3fb8b0be252ed04c5fa163d Msg = e8814be124be3c63cc9adb03af493d442ff20d8b200b20cd249367f417f9a9d893fbbbe85a642be2701d1d1b3cd48a85cf58f159a197273143a578f42e8bcc8b6240f93271900538ffc187c0afc8dbcc492bcd679baaef3af5088434a94586f94b49970bba18f5ea0ebf0d27ee482aa83ad0dd0ee609df59d37f818b2c8d7c15f0f6f544dd4c7e7cb3a16724324f77d58948f8475a60d53e5bd510c17137c99e1cfa515af9bc85569d212a21190729f2817de8c46915e021df70ff6d60215f614fc21139904df3b292b749dc4dea02518b62d15862c92d2a4c996701cdecaed84ab628ee984fc111eecb59e48444efc0d456e2c852518441c3db7630ddd5156249a28730983838ae59ac4cc7110fd6de68101ea5b2ff69fd364e3c9448defefe175bcbe117cc11b4ff7549c33e1025b6b592048a8e31969e818dcc188bb19d7a2440a3baba4eb1b81c45679db46b31bcde7776757d9931ec2063fc6f1fcd761ecc57a7d030a85ea273ef1825b05092ab9645359a444ff7d166b575fac298308d9faa68463d1d0f7b7df8a51c6815d37159adc0b593224a818321d7219f09686cfc952259718dfc Signature = 1793e497eb521ca74e35d14a63868cbe9499da2f21b4eb5260340fca3c1feca78dbe5b14ac10f3fa76fa2e71e4c91461aa75977e5e70792670ef7ff0e6a28708 Privkey = b52b249a7aeae0fbd94ffcf9a9fde10de61c3f4cbda14b289fe01f82707334ca Pubkey = 735163bfcfd54f9d352e1c2f3c0170c95c1842ccc7421623ae0496980cee791c Msg = 1d445e8ee36f6e1064ee1281e6b4a4cec50a91c2b667c8305d1e9a5f7b73a3445882581fb0c11e64f6ee92e811f9f2d6c59c6344be7691d116dda493cade51c0ce77372b61a7c4fbb633401333cbf71372ad2f044e992ac035f5879c053004f8223f237a24a409b7894f6ad518e046b8a84c3f4c6260e6169fd944d57fbcf9ba2775f2d60ed772c46ccd63c850b80d587c5208dfb1a25878c02dece3e602e9632fc3c2c79b25ab41034c6e26b869255357a686781dfe6e644beba9b627da1fcb5ec0be497cf188e1ef1af0601bf16b2911fd9ff34f0e97ac95a7fe2cf90ea6ced33ccb0ed1ef2d4160efb07c591a5cb16c70ca1694fb36f2ca19eba52be3d4ad895abcada4b36f0261d65f59e0cfd2a6148a8892ddbb45810db3bf4a9e26e92c15ea2618cfeeb462d8628f254f54d2af27113bab4f9a7d06791811942bdc32f845922d7b2ddba959140928f8c28d98b44e1d19b97fd39cc0f9a5236d349fc835ac492192462e40ac629bebffd2eba72d2788b244bb777ad0f7b7f96f23412399fc1d87a1d087ba089027eabbc05edafee43379e893291331b460bfa7332e0842ec2573393de95306 Signature = 6f48a9f7f0fa192b66d12175a333612303e180b9fab18edabebcdf6674fdfcc53607089bf980ce35894c2f9babdc4438667ab3297a6248ec0269faa99c724807 Privkey = 782a93efe0ef06cb2534330efd0e9684e9969b5258123e490239bf24bf9f6523 Pubkey = 942fa1406ee2683e29377e49f7ba757cf50ef0723707d4403d2862257045de87 Msg = 46a4e319a670ac993994a53300c3f79144c2f7fec1116eeeb3621c76ac35da79dbff6e189ca9dbfc9abbda054847b2971b02facebbe926d469eb0a860389ac744162bf6fb13b42cb9bb8c9d72607138e7800121ee0cd633ed535c7ae5f4060bbdd271c9d110abff5e060ea6ee83890b1e92a9256d7b2ba982a3114bb6deffee2696f0a2f9c21aaa5b2defa11aab7076de6e57e86f284bb67f5a49ee685921032c95b74e7e3eac723f175af082c858e0dfa01728c38fbbb4c83581f81ace6c63c6bdaac5620eb9a568e7ebb7b72b3d1a164ef524e7b9f00799ab086715976c14d0df65f7b96bf9ebcda7feeef113422001a03a7633df5e49939a121db899d9b8ac2db4fad0c30cf0b8bdbc9e9802a797c8238e46511ff24068cadcff2448cc0bff92769223348d45d6b6f2c8f1593388c0bbbf44b6ddb50b98cd7f09c730f7de4d008156cb3cde0cab3ad0a58a83954e234a0a8a04b573c9a8e9b929ed38b8b228bf55a3c6e2c6b51f682652fbb708e74640e3313e17b4694d7fdf0111f90608c1b5af422dcdecad9ddb7f50d1bf5bc6378ccaffc3201e6c787b48c443ba240d9d50ff6c0e9df7f1a5b Signature = 93e7405a4044510166c8ac264ce3b5ba6665d68bad458712dc93c2c390568d7402ef7d57f549b8a1042f7f69a679aa855f34f801d57d79895deb8deadb352308 Privkey = 6fe7bcf7a684423de1076fd76da783423373b381329efd6157424ec4b2655a94 Pubkey = 7740e91afe45324f8bb990ca2a341279ddaf232c3bb415f178b6092fba195fec Msg = 0baf0ad440612b4c5a136c3a42be1ca2b7c319862a44a9fd50c4ee73541c5e6457efa81825b6dd4a72194a2968688bd49e5a8f4c04dbafc2e7884c0c70c208d4e954cd1675da8e74c65c497cf9dc69424965bdcba5de52936f925f62e201f99505d3777beb3c2e08b2ec9a873e5a9c21fb4a2f3e861f3cf4d6b5dcd1c88bcd9163539ac62cd0659f4ef232c2ce57fc77f90285eb350169edc6a806ff50f61c7e0beeebecec63bfc9d3983f5bb4b261c746471fcbf2892c6108970b68db5e43c4504ddae2d0ffffa28b6759ae1128e16f66d492ad61e3722c960f88692be81a9f412890ffa346e702c867dfa259703b73f525074f3227c49cec1b645a103bd4471f33f9f1bac327d7917861d0ad91abee60222ea2a3c8cac052ae9a2cbd90855d733d5319133f9541bd0b61f0995268351e2863c1ca2ca51e3c976383f5c4c11ff410036fd51d5ac56b023ce9029c620f22557019ad9b4264ed4d71b434f4a4d17a7d5769fa1e14a69f7ae419ccf5947f8c7682697116c2405f5a1959c54b48f0872f596ed45964488ddec12bdb636d0b349e749eb66092ff4511fba59b5962cb93cc85515cc86ab0c6b2 Signature = 9914cc50fef0935efb89b3d64e3c1c3412aed659b90166222c0d13ec1ce3a68ae6281b7efd9d4ec64b82e73e14479f03fbac8fa3abdb41ea4215c4a4d4949d09 Privkey = dda48a0d15a29eba9a76305d360e466e72d8040efe2e89c04b6461315a9b8bf4 Pubkey = 4f5cc36a809416b58e15d24cc57968cb573b76ad90887a8ef36cde7eca400fcc Msg = f5ac19b81f2111a0db0ae30d1513ed343e7f57f7f77d65b8ac7ce3a601174baed9bfa136035976f516d5a870f45db1919f1eb1cbecbe88ec32d191e9248821a7e7681fe3abec11584bdb33de1b4ca94891eb66dcb8539ac41163736ccfd69abb83814dd38cd60381318728052a25cb665471058650ccc75756dbee688ab826ecad4ad5a7db57e8f65f1b64abff82dd53334b797ac40228dd817f239d3ee804a19aeac8cfe33eb657ec9ce923d6b388914cfba2e72bfc2bc3d6f985c0d97534db958eede57b16491ffb755c1a58d78ab377faec0d311818e899260e3ebd1ccd29246fa82d0b76622b2c4bc52f549fee72a30f554f331f36d2a74d999ec10a08294f002b4361e590279c2fb1bda4312ccb24d75282ce7c061a0ca5520c74f6f6333b18c4b541cb6c51e01575ba80512ffa7ce0accd22d14027c53aba1f7437835f1114d68e3acf3ff8de94c8e4ef6d3ab312c91d02970157508f54a5816f467a214e9b1284300289e65f365a610a8ea284666cfe5518e435bccd21627501c725f0b8eb5725e0e06e0cef5db201b48ec91ebf878dd57ce8dac7334848a1bc82c18b065955e4f59be3398594dc Signature = ce71bc82d531d0f93b57bfdc2f7316cf404ee09af88f33bf806c7cad6b8ffa366236ba74e75c15096ddaa6e3a62a8f5eb1c8c3f6b6c94a6a349fc7c0cbfb190d Privkey = ec57b941adf3ca13e77a780577cfd0df5b49edc85351052da34e99f8a9bf3208 Pubkey = 2859c071978a04b7f5407b6d22401a78efd0394bb966b9a04da6b5ef819de3fa Msg = d2bcbd1bc361ab32c66d72fd48a8e227dc6b8d6b150848ba715ff47dd35c8e49381bb4e2933f42cd26b75b14d9c0039282b62b8556aaa11cd691e828382be306889fc9205137b169d3bf17b7f37693fce286039f03809d7d9d98c8fde46f1101942a279c516706f50191a9112f6a24630e1a26c321e46c9ccc85b6ef942f353a642b9e7ef998c0fce2d3a75b999eeb77f31f9b0813a97e3014c3a86e2558734621a3066dae35845031e35665f1922907dbb739786a8b7658ab60276f2d921d1a51230fc74d19e80184a4f10e9e834abc9a36c429726bc055dc8c063f0eca9c61a8a970bd4bb5f424ee4d04bfc295e3bb1f34becbd9920fe2e77fcf36763f32fc9cfd5e465979c167cabf5a1244b491fc06b8946419046ba516c5b233c414ddefb6da04f2e13daff7a9a0c02a518ede57ad9521de64eddf6f49a9670f632d3f7d42425207d053604fe39d13b9f52c8bc292b0076ea42a560056df25de51ad35881d08543224d7fa5d70b8603ef23ce06339d6cd09e22a95749e50dfbd3b8ad69fd30496b984d1c0a199c8594805f38ba44631a2c59eadc6554d19f9bc98366dfdec2a121d0e4814d2cd3f5871 Signature = 118e1462126b45b8c6803523755c56dfc4e123e4acbb66ba0ba6fe3e053da4119f5719295e0c82ac64d7c5cb1ac898df263ddfd360f3008d91018b26f6a1730a Privkey = cbfd91d7695c1f270f69246ab3df90edb21401101ca7f8f26c6d00f4dcb7233e Pubkey = 513879cf79d2f46df4b85a5c0949eb2116abf981735a303164cbd85adf20b752 Msg = 264a933f7d0aecbac13eef644b0b53dd53a1280904100dbc1ab87b51148998f9da0b3a0a6337f5e3486c2b7e548d211259397aaa194ee4695bf98c2d5f4487699f7397e5d3a7e6d5f628fbd05497c556a50a4d05e2b712cdbc351068e42af19538901b8825310e343e1a17a1867dde0eb47ddab456d316f3521554937bf808ae4e4bc1c3c5b4756e4a165ad9e8827f5316f748cac6998ed2d2104f268407c135e62f26a922460eab6d851639a00e5f08b34765ea0244f475bbfeac183e3b5bd1aab798522798a08ec6bf2257d4692f5b03cdd0a2133de970603e3251475aad8d934af6b2bfc7a650b91bdec143f8ad254cfa506bbff28a03beb659ef5e5ddffe76e23230c4ccd46310b37dd91fa6aa68167f62a55c8a69f9ed1ec6cdb144dd81ab0bcbd62643420bcae67869f64c0b169f3cdf3c905895b7d35b6fafda25ccf23c3d10de32e7f271e300d39597da8f843722ef08364a5f7a105b9655172df7c82d7374f98264c9cdccb496f2e10fd8262fb1a9a9965b0b841ac0d0e9c1a3d9493ea7aa600205b8f900be0d7abb4d98a06583d2295c276318be28d421982dedd5bfc33b8865d94ef747d626af99 Signature = f336137dfe6f42a6669b55f74b80b3035a040367f90656fcef0a644c52272ddc39273cd7726010ebcd8a30a05201ab70b8ff97d0288a2cb94cbc49020647390b Privkey = 51a4197ab7686f82f6003a0c32f39d0f2e47555f4e9f8deee75bcb1bd1ef69e5 Pubkey = 06386df86b61f1f8f4dc45b73edaa841920968bbd131cc5ca1c5294eeed5c8ba Msg = 2aedb7e82f1fe4ce469ada48345d006d1b3bff40eb21867f51fce965640c409ec13ad4d52f891bd79066d6b4d944ca868d8986d242b57eccc4c4a488291b159c8de4392be4b86febaa75eac5d22d3c4f8d6bef79adb9b92b4914d5ea07c7f021e2c29f58d07be8a084100bc152d51ca897d7c131644d0895322e9440a8339e1aa390a7f4fcb51ddfb6df48aaf5676337d87ddd85b1d925e1a9c29fe0818f514ef72f747a674946476907a7ca99e9db8d209641057a7f44a317b90974bc86f9617a968a76a6b8387cf5853e608190c1a79f1e1d686e0de22db6cd9aeb8532c5c85cc90b5a018579f28e502a770a4ec675263d0dd781b4fa53c9dbf8098d57b33ae2afbaeb3e68266ad9aab7174ba68c6479883992670ccf3e5ac6a17e65e31e1fdc85e269c80935ef574f20d239568486e7d94a4f724ab7006098b24f3f61587691435c7f29ce4e5ca71b2b1874556433a358c8c5ef3c880843030c2d13d51b78c9bf1a8824e62e111844396f5af2e25c3126ef3626e26efafacf99830aa41212332f378a167233a0b42213afe36d83dc4582a79693b9d571a57712a08b8566d361ac902647afc886603e24283efb Signature = 2c072969ff4719212a121938b506c602995b4d02a22e6198d6e87dd6ae076225ac70bb25ef8c0ee81eb6fe953df6b1815949e8ed0506cb012e873cd36cd09b0a Privkey = b1119c36118b7a065a195bfb8b79a5c287e09bd287c2daac5e6b01164c5d737f Pubkey = 88f218ecba99e770ed214a8d01a92a10400acaf1f6eed420067e136ee2c0c670 Msg = 8816b1eb206d5f6dcc2e4cc391d23209006de935e318152e93fc8c2cf08e26432bad9adb3203d898df0a2e7f1f83dc2f3ed3205bec8efcfd31adc1aca5755db9bd4efe54cc17073077de4a3fdd11996e84b6a052f034b41099226c9c272eae12528f16581b91b812850c207144dbff3e850cca848ec2b1dd164744d7b59337d7e3efef008162e680bd4a0899ced60b171f8cbeb48c5158df6cbfdb26240881bd58ebb8b6a079587279679cb5ad82f371b53c8013804c35596c887e436d23926f994e09d98fbb8ce2704174ef38b68262a7f1a712da0ef0dec639606814b3bdcaf253ff31c48e8a752c111bd7101031cc3d38efb0c9c7f19c59081584a0e015ee7c75b10a4c51ff543a30e52d5f94d8188c6b08e9df1e84a4e2c807170ac124a771b99465a0d38b1f1c6330403c82543582c5bb61b220de1b9e0ef69bdae26023181ba4cc077a5f0d425732ace132ae0c6ff0bb18baea83e8877afbe650fe0bd02093f00a7b5365728dcb66fbb881f592945058a5b350665af91c557a547250ad295e68b4fb72457cfb9d5ea1a7b2a39c9ab7d7ace0af5d51669cb6c2c4c07b2256d10e5ffc6b97c660006313c4eb8d Signature = 24ec1e54fc7e722d37551d02cf135d33f5d3ff535773e02991ee85ffd3aa29997f9c464470197fee81dce110609f870b27c18dfbcfd9320548525e93148e2205 Privkey = cbb587514e0a34ffc34cbc04f28c9b4f6465f1eb225cca19b864876daef37d7f Pubkey = 6b705d4677d2d849b6744b1ebed167dbcbf645924b1ff2e6360794bdd0e09788 Msg = bdf7d17c706796efd3489559b527b1c0584b9022c9cbda3aac5146da340d9cea69f916037cd21b3eb1104348880fd5c5b7c65ff820f7499346016951cb715d8df2b41c88cd3c66105458b7b590c21c1ae2f6ea9ddea7470f25e02027d171e0e574a2bb21642f8f9da508e21d8e7335b5ace5935299407bd1b01bdd1423133ef045234e701f55549434ade94a60be1e1406ca5c758c36799ce1703084476e484fb1740530aee84266d07adfb4cc689f3265133a59cdf992fbb9a4b12defbe241ddbf65d12b2fbddfc05af0fb8de42080775bad29c6b0459841cbb648a9a95e48d6e36ac514480a3deb4b36554d8da620808ae9d47329710d20aaa6e5d7f547d81ad30f84c0e3d239cde5b169d9ddf294832d67a8060ba329c4ef39be94ac46434dd2185931d1231f9b6df878a5af0831e0e9d8a08d08069ded6a961ef7f39fad501ffd17d6d9b7c654653c1f58fcee1a6cd803d2aef166c78ef5514a3276d6998dc7c09a3fa982e427c785aa6a9e256f7ba72d5a6ba33eb46f1f9fe9be2bfc14109f64773c00c063b4d5cb4f4f8a0beca92a9a016c4f540feea9c3a31e313bbcbc2ff5eca9967857f5f8a909a29d7f20d Signature = 1274d6f356eb641472b6b9e5b3ce65d2654e6cb87d3a83fb49d0f7da9c44be2b532604465f6089d680d2d94b0edd2b6b2b805c5e84c379efc059673d31007a09 Privkey = 8bde3ff61a16995ab9d539f6053219081bcaea1d458ec33684fc1c01fb565bfa Pubkey = cd9d782a356e847b7a04c885a9b0907cc33ba97ad5390d4ea5fee5eb198d08b3 Msg = a1f40ec5807e7a27069a43b1aebff583ef037028c02c859525eb8fa4c3ba95a901ff3aed78c4f87752fb795522f5bf715be7e3defac10fcf17e3fa5c54b20089a472333327252ec945718fb455e3f27ccfdef823d12d406e62a4aeba3cb9d1c61b2b17e49e200a8418f935f26eeb57602c7aa3b3a24f7e6238d3e08d2d609f2eada0332bc8cb12916cb03b0d4f9cd602002586d3e4cc7e0e0381c045ad2e1ee28298ae7fcf0c10f212808565296f158d2c32e8cb28156581af52bfc3470c3c9582138d2255e8426d648ca237d7aad2856f171638558241d8ae3f62ba92db596568edee3ec0ef370f83626aa0445af08f967863660e8fba5a41c8e8ede1c960514a14687a4a81e776ae0e8e777fb0f250d51a83b55f8c1ffdd78df3bdc97ff177afeca046c72d72af924ad0d0ab2bfc11b7f4abded51c3987a8bb94d640c8710e5fc9a4190e8a008363d7419cea17c40dea20ea5156029f3debf05241918f54af5039e2c4cf2ca2e139f60e45cc65595cdf54a67d92b6ac66fc0c5a290495ca57b07ef5750d05f57d87d0c228f7e4e15ad0ba0178730f951c697583481c66cbfcd48032544aa8d50908304bd81940308706 Signature = 7464df0b67eb90b4b73ff082ad0d60ebfe0660dae97069b52c3727223bf70e29e48711a2bbb438f5f8d8a33bb9c48fe7b628fa8a542ff0b5ae36269d4007a505 Privkey = da59bbc523404f07646add7908294977e46645bc8a38bad2809641a23de3b15a Pubkey = b22c0f21aa1c2d45f4b2e56cc9b5e02f9e31a2eaa367ecb482f874cbd8e9fe34 Msg = 097106c3624d774dde2551e0c27e19504e6518cc86369ab26ff810969e7de24abc68b4b53f11d945d49ef078eb4f6ba6bf257ff7b608afdcb30a5c59a756fd77a6c1247f6f2a41100d99fc5206af3bcc6de1d3e4968e28fba0123f6045a1b54d693a42bdfa071b2b914b3c3c0c29b2593d07e8bdc86ca42ac555b7dcd9439df9fbd4bbec730d6327bfae4fc41ed498b4f04a0eb14cee608283aaa6e6aa46676bc88aed5d9939037aad4915661af94bb5f6e653a2cac123287073270e0b13fda1dd4871af6a92f992f539df881712fefb038540d41191123b6b3b4b6ff87ffc929a6be53c6cef02f48f2f0cf2fe64a45fd66025cc2d7ee55ebe2316c000855661165e2a5ba41afc2097957b6fe4c55221204b6fc1f317dd3ba13cac39924026bdb66be4542268875631d277f210107a33767f6d9596e25742d7a90ea791ea4bc9ee84a67fd328b80f791ede96d89663e937f0b755baa9d52bda210cee1db339ff1d3c4b000b653b9bde338049af84364e2177f80dd51e2a1672ee555d6317589f6f1d5abe6c2877358bf94b0b808ff857363fbfbe32e97337e4b8a8c221a9e75962a8dc9b5a3d7ca5f9c9b61c73c1469a72bd Signature = 1472459cbbae2cf21ce44a15bae9fc85dca40b8182da7d52cbf56ed538d18e03477c140a3ddd0efba43c96aa92f5f9bcdf3481286ce762a7e2bd1e779ba99b0d Privkey = 40ea82da41fd15b06ffeb99cd616dc6bc8c1b21477ea239466088e2849bf1016 Pubkey = 5910e580bf412c31a87451d9ddf32b3ab713f9e4a22c590c641c14a5dfbbe0d7 Msg = a06c4e02b83ab7e191ad818cb8187b52a8da004fe838db333c4e02548db6bdf791444642e57fdbc8594e59d7023280bbae82986f399805434bb072c8a27a2dcd5aa62f065bc58b0621fcd365f6cdbf4d57d577d91150301fa48f182f87e8dca7ce45a7d64845ff434d1bab0534ccc83aa0974e88b38fc2508cefcbbc82135b73b384c80eccb8a09e2873cc07129021d81ce129a9df65e613410af950197dbf9afc28edc4e65c3e84da40d2ef841b886bc44719a5d59db2c6dc776401c895e2b3c83783d7817bba68baff59470d6015bba8d975f0eb712f3b8902912805523aa71c90499de689d31ae44e210b8446f2484727cc491b92a8e8b199d628e1df79a28c561e5a7d882e30787d08fb2d5196ba61196309b3bf0c5824a3548c700003fe9913befe12223150012685e90720e9ec6bc4db607425aec531c4fa36086d3b9be391a3f04635a8077a447a16a6fd89afbb9a72d0d355cb0b22d562f43f59d4e37128b3e2d906c8ae23d0aa599c70d3778a076c1a39728f1d6937bd48b978740850566138d34852b63075e89a8e2280edba6f4ee8f61511e9b768e95c78d197b693b109e88818b486a9dfdb74b4c5550acdfbd5 Signature = d298fcc9a8ecb76a98d4a71dfb01d276ab2d9670a95bab34cf1d8364516d1ebdb23903460215307125afd09c758e981a452da95c0ac2c0b958c6917e6874190d Privkey = 28bb81a17d4584754d52818cd0f1f21baa777e695844a15122ac05344dddc027 Pubkey = d5f61d519944d13b84bfa7cd67cb0bea4ef2281efa461f22ade4ba882d11b252 Msg = 92e84c7a55b0bea03e17cfb65f7085ce3f445b1542bae997de5f092a24ff243380286d137091a598f35e6dae1a1c648f5a494c819dfb240652ff908381f32d70bc513100aca16fe7220295b1c71835f16d9310a9d27a04a980ace297d5af3f7cb7c78b24997ccb41f54ecbab507eb73ea6a3ed470e49590509f5d1e6032a2605db87f4a9b9ec91602583f14e2fe1bdb900ecb8971196b55c0d433489f26be9ca157cbd56572887ba859f39674a8e0ca08f2dbb0f27073551d0b1990685178b1ae9e7885499143d9d72c8571d11e0d85bf58df94e2a74d9b6846557f9125ca0944ce5718d2cbae1672ba02b847c17a6f6b445634d2f0175a75cf6883c62e5b521c57141f218b2fb0994b372a716c4a217434beab75740b8e91c622187d03c85da001e00247312a465225f5d6af232064a427d3018700ded774b9026777a5275fc04754606c86600297bf7b71aaff8b9a746677a3662f3750e81b50166f6237000051ffa15868defdf090057722ae229964a4ea085e0dbc04ce1997722c5bb65d2b47ecb746fd83a9f6a69c81545a9b502f5e76d3130c5afcb1c9af99d918740837ce89d7cd213fef2fd062ce8850f69659e4ad327 Signature = 9ce45a07dbd28d3f6f1b35630a3fd56f1d548f84ffb1c6ae64b21498ae38e596916e77f79905e609fb1ae0da36138a80f242122167068092cc605796c5669e06 Privkey = 24bfd4fc45d5093585678101cf563ab8011fd6430de155f2a425f0633ee3b7cd Pubkey = 9cf5c5fc0ccfaeb28a08ba67707b18dc84ea0698ffbdbc169a09c28123e6c2ac Msg = ba54128f45be2001dbb060d5dcc47144997415d4294f6eba8dceba4f6cf2234683c4265f88032205296e9b27d68506232d57b688407648f87ceb342052bde9d0065542ff1715c942027e67482af4bc278ff71966fb3f62a2a5323cb1b4bae1e7b8fedcbc73ea05b4076421b0b4fae8bc3337416a17fe124e7ee465ebb38d8792306429d8279a1bd54c37bee8f9c85eebe3afd1f64489d4e53ac5f50657bb6ffb97120744b75d47c6226d5a9c9c264ee3e6a6ded05062ca1006669118454550010919c2633cf086950345e514af3843148e5c64352e69037dfe60d4a8eab3eb8cb54bd39af2f353d5ded2e2bc8b11c09f612e128c6efa41f6eb2c958087be34c6335a43005d11a9d3b5a529c2d1b0642f77afdd8c6b1d6fb2a9dcb65f42f4eca8ea9a054058be8613667610e3eed8d1df0739eca171954117989d1b12189ab57904aa960b0ca85541746385efa985be9d97b5a9029989a9c71498dfabdb813681f57e276b64db491b8f082a885145469a531b7f9f04ca0a2c2f8dff20ccb99c2861f54e5eafa962cc53eaf18d3d5e50d337af485f19975f05930700a8a7253f11f184130d0aee70969d96fe08f216951d9dced52388 Signature = dc935b60fde44359af8f50ed7f919f483ce3f24e2320c55ba92f3e7617c19bfb54701903ff183b42cbedfef0875f42b12875d36a0aeec73ffd09509d92b28b0d Privkey = 2fc2f9b2050ad7d139273e93e2a0451c7b5cce57599aa6b08d3edc5bb07590c8 Pubkey = ffe5a17880d718cc7988c2fd9825b03b93450ac1deb8fbd1f1bf3b8f87805954 Msg = dc1297990cc027d56d1fee265c09bcf207a9583e6bab8d32478228e0bc305b9818154c338ceec34b04c4ade7ac61dcb09bfac8ade00d1f29de317060b8a4daf1987de409ca2c3fe4380088073ccf485e9a69516b5bbb4130f20be69b2dd6a9b465159cca1ac88b328b80c51b66af7f4c50f6228772f28734693ce4805a4163dff14b4d039811ee3fce65935444a6ea9a72d78b915c9c3b766c60b7e0329e43c9c57ede94b91525ce5a075a7297219772ef3c029649b586a95a73bbdf16d8fc20368de4ba44de1064be5826b376be31a86ca478a52efb98f1fa333157719bd6e0da80ed68d0efeafee5a13bcc3b457525258f1f7e031f7b403a461506927b1e6c7d4a0c8d84b5f3dd0eb8bdb13edc2b514a81d088eb077a52c8a831861feee8110e41a325dce206b2d67d25f90ef57e0fde709f3e5a39c04eed31e57c193b283e2da7279ee3f1eed482b3bbcd373902c1df811ac33e1de06429e8f8443f602019650bdc2ee8d7f650036a7a22b8fd88517511229c729a3269b3a3e8fc72b01b5a4b3e33f5272f3ad21629d08b1f717935e9e104add2f0f2033432bec82e2121d98c9c1a58e0daba25536a1be8e5088347f4a14e48d8e3 Signature = 7aff162a3c0d28dff41715a974af07ecac2132fc18bc43a198fe664659050da19ae22758d52c9cbb94f1358bb02610a8a351c2116279e7245adf69675dfd360a Privkey = 8afe33a0c08aa3487a97df9f01f05b23277df0bb7e4ce39522aec3d17816e467 Pubkey = d004370e6edc34b3e8818667216f5b226b0ff75a58484c8616e1a866444cab57 Msg = 86fb741f1b9708929195031aa1645fb709a8ae323fff85e5470194452e11b7b1279194b5e2427ce23e1d749c3ddf910b017e4f2dff86dbe482c91bd994e8493f2e6824bba3bc7d7a845f217ae9760b3cd00226d9ff2616d452751a90c3d0d3c36d4ab4b2520f67288171bd3a34b2eacae8d44c1e153dda1f90bcd3595dad37713b8d340156ea90a4e135951ba7169ac175578b81e97a541ab9bfb76328798d7d631c14df2ad613e9c6e1147a0e84062ddba035859d46bade5fadd9b32b43dad483c6b8023b32391e51ef1520c68c6191326c494423080c623dc4ad0aa074748d826c29644c38986a77002f0cab9068e6c9ec73cc2e0c584b80e0bc375721f7a8fc35317a5e240e8c66092fb6305b012c70e17aeaff13386d5e28d06430ca585b0c85b274e7fcbb63e3423a982579e5a64a0262c41908e55dbe43dac1e5cc1bb7298be428720a12e3b072559ec2675d457aaf8f13252e28aad63c1513f5f239564d363c8505ffa4e50f6648c1cb82bba852bff0acb030cbe73f059dd87bbd7318c5586e708618a4f4c9f3bec3f4f07c609eebb24ba878c6bf1e4f2d0fd1450ab94e31755217786fb15182760ffbe5a267cbe998a4ff90a2 Signature = 63a8aeac025f2dde9a73286e56c2d62dcb79a241ba0b2e2dbaca8752ed2fc8cc7ab8e6600b67645fb5e818a4e82c29180a6b2c3f58d099cb635ce52bdc157004 Privkey = 6dc7ccf329378e8131b6defcd89370301068946336b0b762ac5ea51487dbd39e Pubkey = 04e90d275e79df5f2b6ef4a31505aac05a69459baf2c581b3ce3db29f0f1fc14 Msg = 20cebbe98401ac8934c3e65a5738cb0ec0cdc75fdb09dc96312894b187c0a46d2c38f4855be3eeccdcdcc56d926a8c08ce6e748e2a858f53532e7e5fc5f7014c8c6f86310cc26efef30ae525a5157940ab535ed8e403112b08e35e2bb3dd91a9ae8f772d2aff37d8c40d2b5cc887a6f15050a0f5bcf0360c3a9d12d5918655edc3c13c86ba6f4a2fa3bfcd405ed38f871cf7dff0f75daf2c321084ee9fa81211adb105b25c2288f0f2f7f93ef656b2de190122e7a4bfd4a1bd9893a8485b509ff0bc46cc961051c1db5a12490c7e741922ccc0a665496470276f69c7b77098c1e670af6b9f851252996875eb8035a817fa9be07f2be0bbb12025e0565414c817e9421ac700373893862f24cb165f9a271a64fd2305c6672c46767f8f075be5d2d4079bfadc3956288b0215605311b5bf32f0037b7c5ad502013e82ae3419d9d8f39c545b5888f47106c94d5fd6084d26034a99f5dcbf26a84eb4ee149c62a0410d8c707b1a9b071f74ed23932585072ce6cbd33d4d54ee917916f5dfc64d26a498018438b455739345dd60ae0f4750625915cc829ab6822d6f05f6d2bda0a7bf5601e9a2ed6de960371d17e6f43709c9678ca743adfbdb45 Signature = 04509db003a1a6ed3fbcec21ac44ec10cc06d79f2714960882170316275df80423a1c1a112d881fc24d2812526079058aa8b608bfc6b5e57632240c636d6eb00 Privkey = ccae07d2a021fe3e6ee23836a711b97b04e0a441f169607572731cb08c269488 Pubkey = a32265e5328a4f49cf06b467a98b9f9d5b997b85dfb7523ca6a0a1d627d32891 Msg = a4bf8297d0dc5e4c92bd00ad5b9c09b1238b503d619116ef74260378349a9282b41f3f4676a6215e3ce6d02238480a96043b2942b3feed12620b1fa97f7703b3eb683c1601bd2f51825c450df4fd1f33b0bf9c23c03223789e06e24cf136d3b557403a66981f4b777dcfe890d2ba96da4a4742aeeddd6a611d05fc215694a5d89a5de6760b1d9415155044c049cb02291a1514faa2e77d2ae33d44585bdac6365bf481d9c97833937eab636ed65742a0d5973b24d54089b2daf084d5414765105e4eca14aaadd1053338a8470505232e4ac633345c5cdee1e4653d1d93583af11854b1d9b65fc20281838c56df1148f35ccf9bfe2f3f80ab73f5b791cbed2d920644cf0316f0cb5d3662b9120647da56afbeb47a952953bc1a37de857e4b39fd92b632b85159f46cd05b6abc2338d4632d48e9a178860de8f65d9bc23f24507b7c5629e0bdaac067c476c9c3941d86f788944d744852a61da716f95f3b04f0783a562941bcdda439590fd186b2a8ebf19a5a7e4f4a3aaab7a87a434524fbc9799c9931eb8ce4e34e99b608cac94ab7e74495668df136185f487d9fbcb6605ad725345403ec57f3f6db364a87f38fea4b4c271552e9f2e4a1be Signature = 0eec754105447f97d4a9cd246c7eede3fd069018f0d01a41dfabca3e90a741835ea4a9d682342267b250fc1c8c547c89632d9f689af536c7929004ded0d96f09 Privkey = db5d5f41fddd6768709747ab8239bb4f42a31d34b4fa88824d94bf78d3149264 Pubkey = 03858ce6b2d24079eead66ca0dfe772ecda9af4d46bc9b5edfdc286b95fe9716 Msg = 67ee03de45c3e7030db5246ee5b51bf298bba3e4d0934937fc12d9a629604c53c070e30d611999a9cddaf2d9acda6a9f67202b352369d48260eebce0e78e4d5ae54f677521f84a7be0017fab278b2b57275efc5fa57c617186fc1ba49edfbd3308634878d864f2da1583ca8d56ce9fae77c462039abc32d0539c0a60b7bbba5029e9329d275683d9c4ce77d0b908ade98b0e32b4420d9aee2cc10e4be922f9572582dd8967141c1d402e215f20aee0a890e2368e406dea11bd11177f2e038aa2f1a0dff51a128d955d5e5f8d5d0009aaa82440a96864d6c697f910d1df230f467f0e02a2e02bf9e45da95f255410cc5aab8d85f449a5de99aabd44fd763ec14629f3dbab1a247bffb7174648e43b9fb1eb0df5e4109b7a88e05512b20865bad39f9ea79d52f5188e7ca5194405bfb1a09727617f3f6c88192008edbc0c6585dbf261f149dffb593d42716e5a5777f5462beeb1e9a56a2c76e6cb735117cc1183a38d1e00b303d174aa9cf5c731b2c70edd79cc5dc96f4018f1d71d7198bbb7d134cd2ff8c15f9a04280db26a8fa9997eb86b133c022eda15d8ad5e77cc9f62615960bac2f9bbc3ebbd198f72c572b97156fa7fa229a98014e170 Signature = 5b3d0da7102355486be4d69cfd65886c9d9c8738b293cafb23b2104bfdac8d7d01298eeb18fde3ded6491d41b419cc663752c4e67dbe8986833d20e4ef34180b Privkey = 7f048dfcc2650cda59491d4ce2b2533aecc89cc4b336885194b7ad917db5cd14 Pubkey = 08001b5d40958bcb270beea9baba3387e3a4b900fc42275657c6c691a2e264f2 Msg = 917519cdb33519680bcae04faa790771ce7d1397c345f1b03dd7625776f3f195809932618b1c64acd93ad000ead09654a33d14f748b46b67aae0ff12df3cc163280f47cedc16a8579034e49884296772ecbdbb71ca29c166233533c8de54012b412ca13cc258f7c5465d83422f524e4c05f806313478319fd143cf5088e69837697d3615d80a7fa7e7443fca65e753ac1b11d8eff3476636ae02d7a20f4b2388dad684002f5ce957caddd2053d0ed533132a81ca19bb080bd43be932028cb5f6b964f008b5b1c1c5993bc9b5485b22bbef701f0a26a3e675ea31122bbae91d864b54d895afdc79ca58d4fe449213353b149f3143b5144d747c5b4697479ae68528485384044aa2c99ba4b17b184e94982269bde2de0b17705d0bfc46d6906a90edefe89195de6bb8f3fb6a374186c7cd086d13d1b3525a3994dc8020e1a00554ac8a82d6047c5bff5e7f12450f4865da161e1a021fd9be8bd33a32bb54a4ddf874512e74b5cfd3fc3cd9ac11edd878433668e3fcc782b97b6d905adb0ebec42c9254ac90f35822c00f97ff3f0c7c39ed3c7cb3920f5608bb45838bb242a52a8637d7cecdcf489fa183b45451c6c9fcbbbf914f5f7e6b223bcb4675 Signature = 583370971d24652ad213c42615911938fa9aa3d9b7196940e6eb08151200c7b6729d1eff8f4f0904074dab3ddda6af1e4e562b7d6220c1a562683beab268f80e Privkey = 9feb3df88c494a99849c6fca194201477a2fa7564e29fb06cb44c1154e8cea3a Pubkey = c35628ca6ee28ec1c239ddc5bba2a9e09e4846816b143c74dfa2aec1f62551b6 Msg = 95fb7581bd25ffd442c3ae38a19bea7349c7b7683ba6767e148f0afc15373f67c16d471781202e6da8054ed7fb9ee204cc0f63c210a670a5f9ced4294588196330d31b8e8392bef6b48fe3c92078fae11284b4c3ba20d937e2719de7bf67c00669ad23e61384ebdf8c6e60735428c084fe217fdb4709ccb6083fc0ae4a05273eef739023d34bb73f662dacdf110b6dbd3e74fc1491e8c96596075fae5c36aabe2a0a53052bf77c4462438063aa7bc0c50ab920c9eb288671560ca5ba7af44a53db2e2ff43ca56069ea5517cb214e76faa53dbda100003c4f6175414041be74de22ce155d2281b6f4035be39841afdb96dd89aa808e6865bae62d6bedd919d3e86510b9fa5fedd1977c4131b2b86e0f48d7215eb13d5498ca5d2368f81895ed855a527124657ec9539efe3b2499a3b0b338262f26340e22554c79f4fad2b4e419c70bc1a2107d206456b6368781be4b5e2c54da42d336040fb7ba49c32d752321adcd92986e78bedb226ceac50292089bb579027f702217745afe06a5be136b3998a3604c9ff2acd6fa3f3f71633d3102fbf03047c5486f84c4dc2447d863796383d55f08c981fd4dd7dc1cb72b8ba4435af6abdd74e6f6e6798f1ae2 Signature = a1c2607835bec1a1d87872fd8ee488d0ae9ed23d49fd6786fc4996725e49b3262118babb4834877c7f78fbeac02df40ab091b8b420dc9951381e3bcda0670502 Privkey = bff68955dd6ae0e8ba85ab0d0cdaf04a9f5befd5ef6014f49994a78363dc17f7 Pubkey = 0ad9493af80b15f07a521ccd674fe9e5212a4a28c17c74f6605ffef78a4aed72 Msg = d8f5650aa3581c4d39bd1b8afc96c1ad7c4bf723426f9d7fabd1a5c8ac1d2fe54a971fac765e05af6e407d7269bab661b3432292a484f952c11095bbd20a15d77c41f8f3731a504d518ee10cd006c96ee57372de5bea348ec8ba159162170c63e970f1c7a3465a3d592e1d56c6540fbdb60228e340909646320c95f25698cd4896bdff58e2561e3b3d9a73b89747912a1cf467d63e41455fda77477f46fe6937bb0e79d92ccd52e82dba908a05a57c7ecf49554ab44c0b718e3bdd5fc0bf7070d9c58f860591c18bca8b3a9a148a06548e0f01602b1e6f686037c94ff732e155d52d5b0b44703b3d11163e3f56e3b9c1b86476e4dcbfc53fa05984e8c75dd21843cf96f9e494abbae7184aa42736633e3811aeff402b2fcb7d7f702e447241e22a58842fd6d0c03d33ff5b8c792200e173daa7b217e4b2f4433e6c020acce501b9323aa0241144434b08e9d2469139ff67342208900546200fd971a65dbd6db6c21e3ef9172abba1ea9ea2a249addf1a1eaa3ce11938b13e30913cd0dad491fcbb3285ea378b8ef9227f3fa80b586ecfeae137066f8448acdfb78d6d3e9ef4a6b362df4241ad9ae253b8e1597d656e000cea447a02fa4933328609bba0 Signature = 9319eef740633ada1af0e137644c61fb3e11ba4b01d3c6f25392dc9367872a23be56310d312efcb91bdbab78a75e576ebe9081972415f562db41baf5e2338b07 Privkey = 1ba919c066bb56e640c3335968e1d1b5bcc093383e2d7cf8b5fff5c61ec47a77 Pubkey = 804c90bdc2b3618b01f075e041fa971b83c5b6cfa3b6b3974f3fa43599beacab Msg = 87c5c75d8ad07d52acd781d1bb95f78c70e21c2dd66f7aa44234152f98234d128358a8aee98ea903a77b441db1447ae6ff3432ddd4570f7f58036122c1fdcc93cb21573739c19ccaa411508e08de2606f3d8f2db89df6a44a46133d57018462627e22f57ef36d1de024de3d4ae41b752df4821155934b447b2effe512487521be0356832a74ce0e2d8301b79f93175e8b6b961b1df637d8acadc884543c6864f8025ececec7c6e4fe0fecfc40dcd95e8d6ab93ce25595384436b598b73c74b03d49ed5002c0f858cfd9d0df61ede937cc41659d6708b96fc5aaadee109e2a68846baf2c246dfcf3d27c28bd1371e35fc9412631442ee75f38c6e4958070a74f6e6a220f75c7280eab4737d97e37882f3624811675f16caf60cb944bce92e75884c56483c61f26b6371b1b51237621a06543eb4abea7becc4fc31dbb5475b3deb9bb3c8992387104830c6072afe1af244bf681a40329c9b37772b09c5e88e78f7dffbc04549ffa13b4144ddfa538fc4b3300540ad830215e25f11446d289f33122c2c880de3da71c453d7e88f7ca4ea3d1255e82f4bc9e5533dc401c33040e16940b2cf9cf21feaca1c2c6c33337cf75e1884b483bf801536d304089115a0 Signature = 503eb7ed6de1b776c952f255bbd4bcfb0e48bc70c2cc2f1f72bf6881479040c47524ec542ae13f6005ca5016b58b736a50898dd0569d4d38ad298630d68adb0b Privkey = 9b36247c17710e95261a7d702f57fe81f2971117a50c87920193b386d494ca97 Pubkey = 29ae39f273e35fb3f611da091600650efbc4fc4d1e7b4c76aced5a83f82634f3 Msg = e8d9d53ba27e98edd55df3c6b245eacddc8a40e3efb007bc918ec5a869178a170bb4a635b7f8f742e37ad45d14a74344a6b522830a522106eb960daf192dc1e0fd70f16160e122516892d0e2abd0d4ae0f0d2e5adcc99ad55302e251b3e7a4d0cb33774a497049905c33de1fbbc1ad2b6c645295fe416b4d12b232efe0a33cd2ad8732eba1c3cb0eaeb0b2a57fa03ec567ca29210bf6ff9542a766f496fe68058aa983806cbe7ab10a47920bac8248818e54a41551c9a0959e8994cac60fc868ad48b5a24d5f24a7a5a3fd90b847e817ad3dd5d0d6f8de2d204f642483bd53585a92ef925415a9b38fbbf07fc0f35e707569cf488b205453ce5433eba6fde8781af72b52bfbcab85ead385d9d3175e21ad3373ad535cf0e357ed6b5383ef3829a9d5095b87dc9aadbe0ca7abadf33ec3b6ffd6eb94afdcc12e8d66a6fc05acf97368db0f69565dcd8fef4d1e49d7dd4ac053c218f5240c812d4ebba440dc54cacddb1c39329e5bd0c3c80dc3259a80f059f94679aa0794ca0115cc62af25e124cb8a9d4160eace6d22c7b1c44544f81142a19ebb02a9bda6429c50e783db4a07f0219e857c8d3c5655a582831c8eabc3f19b59ad8d2c714adeaf4039d5cf70 Signature = 035970a672e93f87eb42cc396f6ea7e1b3dd5c5951572826d1075a15c2d7e454df195b51aae8dc61ef7ab895485f64e5989573d98a062e67ae7356fe5c9e3b0f Privkey = 6fede7396c462033189acd23d2f9d02b68898d35f3a01a798fc24d488de93a78 Pubkey = b34062060b2c20076a98fea939b3b3a50451a5f49f8351c0ad7591dbbebb130f Msg = 5abcc14b9d8578de08321de0d415e3d40e9de31e1888137475ce62bc6fbee8fdd03b9d47c7b88bbceb804444490bf6a3ccb7a273261e24004ea67cefa3d5d173576d01e38f76c1e0e515083c97e79914acf2be4160ef9360bbe986b36e9ff93346b0e70691d934e47f8a503fa933ab2a50426947cda8e810c9ebe3b36982f09aee6092739fa2358b613c7f129db0dcbe368bee52f2f7f1dfe3d2434605b5afcf256071717d924fd0803bbd0dd1f9555ce834dac781df4cc7aa19e7f11da9fb99cb9e6b9e1e6fb4f7e8dcb2236c28aeb6cbc55a130e03c1b17a991cca1b794e6c13732d5b0a66f6eba860ecb98555aa4c218d112b116bce238295de142741f687be0b2487f58ffc5c12a0a519f1e23793242ef857ed398a20699d4351453fc2f092762abde34f4da2dbe0ce2aabaf6bc4c0159f3fe1aea16a036f7eaecd629538f3e0eed83c9a4dc1abc238f90daaf489fd61b34d937b6f4607a788baa82061943dbab26c1d384d8d49f99348800bf361f871f5d6cda18f689918cec31ad158f1863d13ffac5405c162c32de06e32994cc4106f95bb4fffdbefe7d629ec7797394609fdbfeadb46927370a11fb38471540f951b93c6eb238668dc006c21660ba2 Signature = 88a83e2012d209ca03b8ebf6de5bb7ef4ccb5e3df5cac78954aa694930e4de82544ef5083c4892db9f05d77bf63f4fdfce15a4d1c3f85bae8077062bec0e7b07 Privkey = d559580134ab050aca446ea7750ef6b371d92d7645ec7635fe7851100bc4e51e Pubkey = de5020cd21a8b32339decbedff24664d9580326327aedf09c5ec6b3fe5405226 Msg = 6842e3190a110eee96c507d4bcb4c548c3a0ed7b1a8ed77dd93b38613b23c73e830b205e62651921ad8296b08d1e1008ad78f2996e3c7f38032e467cffecd77b8525e243cec021f85296afd545d7be1a62568bb0cfcdb90d614ed798bfb7efc655326816a61082251df01613aac88efcea1e0ea2961b8f921ebe1558dee83374a0113a78c55857ce2055bb2c48badbd3d8f4cb19734d00d0604b619073020d72a99a1923e6160a09946567fd4bda66442ef5a7360786d178dae44922f350ce2edc6af73d1bd80dc03ec3ca7005f4109d10c6d4f7d8fa61735110f8dbaedf91a0bad7d7fb5c04d706373c15c645063ff4b4fbd2d559b0afad432d4c496cd8abfea286fa675dc076726ec522b3a3c2f47aecc539f48a792169c4cc8cd41cd2cb6b63ddbc19373ac9691c2bc2f78f22603d5513715a16d4574e7acc4bea6dcd8ca7f19865a49d3664a210dfad290774b10b7188f255b3be4dc8fa86f8da3f73a4e7c929951df30fe66a17c8cee23e4f2ed2063f0b02ab40372cbe54b9a708df7c48a06566d39b19434c6c766987b3ebb00675f44c4b3c1e9f4504e7a9270589c0d0f4cb734235a58ef074cf9decf3601aeeca9f1d8e356cb2db5fce79cbc36143f34b Signature = 6fcb1ac9290ab767d59b598c9a24ecdb6c05bb023ec36014a40d908ef0dc378a4528b3760d889a79174e21cae35df45d427ba6ea812bddca16e35a69b5e79f0a Privkey = 9d4ce975547876636fea25437c2880c9aa8ee6b270d1b2da197c8d7f95e7dccc Pubkey = bde4993c030477c35890aae82bb5087e914e64b94ffc64e2d7a5a7c919e2d902 Msg = ea0fa32a4a288811301b9ee533fa351fdfbf6bc1d0555a7402767a3a9198558f74bba7031857995b9f326226f1dd5df107b06342203eb8d40c5f1dc95b4f3f88975aa24af8769e2670c46671bebb7a0f1b7568729aee477e8988af9c749f3202708171fd94b337ae67ed21a6c44174014b0b0eb5ba71c277978d488c24c4a7841309846b4e30a4fbbcfc45078d7e14014114b1ac64f7c33c9ac25ea5626c2c819fbaa2a4de8a2bf5f1365d6b70407e8094f99197ce1f0c35e11a98fbe372414ea2064a3a12d1cd5c8df8fc0e79f5b770b58f477f91976ca0139895120e246baab5a026f2d39c687dc0788334b5c626d52cdebe05eaf30864b413eebdc5581ef00d439276e52f479c9c05b116395826b60490b3ce700cc0027f61e46ca2f6fbc2c9de2e800806550afb06d4a08eac7a758e24582a4d6d428b433d365fc31d4444607afb64f15e370794005a3a2244e666d5d4c38ad2009c769a51cdbf738d235942f412d07feeb73b3657d0b0c91cb5940bad6a706e14edcdc34225b1c1f38b1abecb2adcaf819155a94fe190fd556822d559d9c470854d3a43bfb868dadd6e443d98ee87e4d8284f5cf3a6dafaf295b902836c640511e610ae7d0cb1b1d3d6079fe6 Signature = be17444cd465a87a971df84eb102f9c7a626a7c4ff7aea51d32c81353d5dbc07393ca03db897d1ff09945c4d91d98c9d91acbdc7cc7f34144d4d69eb04d81f0c Privkey = 0273868232f5be48592cfa05134e8d5554ed1f9a57bc7e3982a330c57e5a7f3a Pubkey = f172208782db66d466cbe4f4417f6fc477b7349f2a98db56c03a47227546bc5a Msg = f7a1d4614cc64a3bc48f00c6276304f34d4dfd15e0617b93ccef126c5c638c9d9953aabb7df42df4e0aaa7eac96a4b38c7ba758d860c90d05e3d14e479e545f319b0e5a85ad8f0991b43d6e49c24fa060e3e5df95c98d9451ab833e12aa97f404611bba359496265a6db11917d0da5c6a702d0b102de36dd0c98df5b54806ce626bb96374475f68a6060eb350a7d2aae3204b3dfdf9f1e31be81f7170f8a1b9385413ff8f6881e10c1e8da4c88afb50639ab44887aca2abeecedf110d2958c13fd3390d1b96a762d16ce196920ce85f6c415bed545b1445302a6f001eb8d00e97c751887868d481a0b1e4dfa04b6f761086ee8e697b019e017104bafb98fca242e334c6f18f1db5b6f295f05c559361c6831dabc42c2110703f9d1f64e12ddf26a8679854e9f8ef8479e1f12c35447aac02ea7f242e58632cf2fd063fe665070445b80f3dc6a3303bba96e05fa88eec201c5c2d00ca81b8da6969d0a4dd0483b3477d325a71facd6fa2209b48cb4f6525da73c9c05b2d9789b01448e1527e56a09a9bc6136d9837243c2077b925bbb933f8fb1daac963398c5802aeda3bbca8ae3b8f4a9a871f7ea8e2c0ce898c566217b5c06ff55ff9f4fe78398ae7973641eafb521 Signature = 15e8d8dc7d5d25359d6a10d04ee41918a9c9df4c87be269fa832434d5301db022481bfa395a3e3466f9554ceee0532a8183a0d0550e7d1abe99fc694c6ff9301 Privkey = 336a83b55abf4c02e25e540329b5275843c2ecb8df69395b5a5e241bd0d8c10d Pubkey = dd60569844570c9f0a82643f446478b5ac6fc542214231a7ca656a92b5fdaa54 Msg = 9afee8ab482010e29264b406d9b49453d1ce6d550939072182863e4665284ab05d86258e0623b18754c4785238f697f075adfb9e1d31a42e85934ec071ddddecc2e6c2f61334a79526788b4952190716906dde17fba556eea4c8b59727514f6f5615a19ca36da358fae6a6c54f7f4b7a929e31ba7cc71bde7882fa9ffd87300136409caf3ca64eefea616aed58da5dfbf28b668ec1cccffcef6e2e14f8109e9cbf76cfa414f91ac00f48e93eada385dd3d5c16e1a39ea3dd55c761fca361b428f516c05e694fe5c3c345cd94457187a8e604b200a1a0f937ae89f4d6b5421dffcf7ca15f2e2c25378a4113233f7613f4570aa4b909a9135eae4c7b9ead458007ae17126a11d145258af9563db2f7e8925431878b0eeca8affc01ac5913bf5bac4fa3a857c54cc8906d6af77de6b9326b6506151099e87e99b1e819c6fbe082688f34b803d588e416d853169765d62f7e0bdf72c5cd66669a0335562336735e7efb734a2fada327f858bec602d0da08eba4479e7f6dc4def6e4ebdbb730ee91a33445cadc9df52c825ad36149cefbc51ab102033530814bafa7e87961b06367ff896f08ae334a9b1aad703da686706c11a04943ea75e12992dcf6106e372077cd0311029f Signature = d263f56d59cb9b2896a947267c2ed78a945bac5abdbf3c14dc3ad092b2308cb9315c464942a0a20b2024511d766e85c936499a149cd0bbb209150a1643265200 Privkey = 88409172618b490393db27d960171cbc187eaf4dd8b320b3d2f824980043718f Pubkey = ce2e7c5839ef5632a123dc373dc14b1f0505766e9675407604ca7cf54e8d44b2 Msg = fb3e82f11bc286267e123817ad8864e077d9f7a8e7a163ac7eeaf93d55dd111de8083b66b53ce7bc771fc5071a2d7ac2f85d6fc6adcfcec446e16aa1046df37209ad7a29cf9665b439a54d6f8d942f89bdaa56f2f11260cc95993038b0e8fbdb3214f142e6c90b61a1d2b142076206af30ac35784a6dc15a1e79251a8c7731a1c53978038f8d76d70c6c1cdf529fbdb84d1507dcffdd42873dfa6a8fe6bd6f7fd29c80e4b2f933d2b6c9e62c9457e665472655059b63b618e2a9a8e5b9e41c3646173a892b8e6d4bcad6a62a6fccd3455890b58ec2681a95cc9776a9fce83c54a9ef312a331959c7ef3f79ee576eb7b79469c9234b1eaef609884708fe4bb0efac662da871ba61ddabb3fcbdeb8f635657dd9a5d7311e639a824858b9a9868d3f9384da612c7f2e771a46bd2624c99ea2b6ccbca996c1d9c375554f2a551619ce6d5e6e4d6b844a4dbea83ba732331fcf46572c1fb0e257ce1041b265df02e690a92814bbf3b5ecac69ee998766a02b0d2f908b3c15f952699616f2c07d589198989e6056c16319aab6cf8771902c078046a88b2570c13bc5edeba2ed1e3ba131daf94e6891862bb3de7d1063fe405307a5cd975693e9d58e17c690eeef4a2603cafc68c2b Signature = 93b6e29d63945d5c427387d006c7f0b01956a95fc0436ed42b46d0f17b5bb193ea8c0ebbf3d6d13bb539e35c91f3f0f9fa3414a0223c9060bac83653c6fcd906 Privkey = e571189b5cd9e788302de3919d850c227dcbb615022e568bdaeb37ac5b2939c5 Pubkey = edda890f42dd5fbc7316a5fadfbec38556f23f51b8efd2625437f6b5069f1ee5 Msg = b62c867ad6227435bfa6dab830684e38d196e1f861aade0fd6a7699b6d60901fefb2d799c35c6f3d8bb94deee834403981866bab84946ae9476c75e9f1d3602b42cb2db437bff33a775822f0d6a257d4b75400eba5b8abb314b71fc6b46f8a34e861a9a62abf33de8482f63f9d7169e773a2dcebee03705dac117fd1499b68e7414f51ff9437f253a1d9901ec3b0bba86965a19383655487b58010f804909de1ffb2212c0252ddd9bf2a56ac46bd59c0c34dd59e46598b6babd4e5f3fffde55e48dab0398c22af9e26baddf77275e5f017b35a9b8f8435f9631936b391cb95d7adf35d1d8545a0fd066412d508967bbe9a20245a269e3be2777117e75fbac170dba352be69b254d353b3b2cb3b7e21b721aa9fe044f8916b4b2a6f8c28f8abe66ac92b91323ac73afd93dfbeeaeef26d19bd9f67e99d48cd2ad2d3e55e45d24d54b50f44a39b90e242ebe9b42bebdb230c470bdfde1bc7721c3120008477393dcc2e15fd22b251feb0e18b02883c078aee4fb760655a671dc7b8aadb9a562420a3c2efa2d342e1e0099d951b42242984f594e6914fe282b1ee128735984ef93a669e6ecba26c9fcb9f09f09256645617f1392d35908917cb8d29e0897c7503cddd5de1959686 Signature = 7f797a31715d7c356f8f1f783700aa9974bb936d661661ad968c7cde1ac9e767be56a2dd49b9230e90110c67c0ed187cb7e75c3053ece844984d296f0d85cb07 Privkey = 371744ab63c115613929a343709bb019b7357dff72d2a149f1d0f71d3a201efe Pubkey = e58abfad4a13859f0acb05d0e47d59638f7b1b4936100b988d61e6e70e22667d Msg = c219de1e8d7ad8df08c49377396fe7c1f2d57bd2170633a00d708faadee180ceba92849a7778506cbb366875bf9124701894cecdb3385147d0671843922a649aff7c435eb5a9c74927503072d0067978716dc80be1545a2dbf5a1c38536e12bd7720c1965d3803a4e8aa55765192a13b705ca1059ded0e806362fc5bbe6c76a1c9674bb853790f7e90af00753e00436da48cd082ead64fddb689890162082f8482924f33acd604640f69927352b43f64402d27a883fa6b72aa70d241dffaa1701a25cf1079358260793875f76a2978e9f9f9d68634eb3f5f01bde1ce49e5921252f949f082795e4eafed7be5b49a9f95edbb4a13532e3f3b3be62e2652231253a20c1d5477e8f4bc57ed76fa19eaf03a11bba429b6496ce76246170e043bc14f2d2f703d968f1deb09388715c37cb4752da8d464e348e0313c8993e24133a7c545284e3c9c907d01b260c4883f9cb3e3dc5b6f7fb6d75536365f2132eaeddab570e7273afac0bff5c9fc0b820f2078e0336052e1fe7bdec86674d0998ec78da1c3f34751f886727695f35eca1304b14734766ab05c1186306ded9db3eef65d3c0456cdae8181afee04b296c6722a88c7ef3088d26f7fe74bc89cf5285c688f027b7e68600486af Signature = 5eae4ac72af0174ab256527b7cd337a0e5482e615af068db21dae35a64640742604df73fd4ca02ed9515a5608d73195230fadca7b426f02a2fbfd02061af3600 Privkey = 498b6ee6492d53231b3532d193578ba75d6a894e2e530034e21ab8ad8d2c0d1f Pubkey = d124665b28facd2d17946a04dfe3d129a4561a2b24eb326d84b62b422e44dbcf Msg = 0498a59b87cdae28695547e10863bce804d97de0ac8008f3d5fb652c1757419fdc9e0f9736f4c59a34f21cfc74599fa788fcc10c6730c7df8c3d2c1b6a786d1230b65585719d1cb5c490359b94435d6dd671f54d6e9a19b9b5aaad7e0f233f8797df997828d88cd92ef089ef7dbf1e95277894a2f7c2fd0c8e4dfdfa6d3d14589ff01916dbf9ddd811c2f5e01e94298990a145a6cfc26895614c7c963fef308a4e3856c32dd3e359bc56d2cca496ad199ff1a568d6430ac5cd208e0e2d07803ca523e0d813ad3733ab50bdcadcb988aee758ea50439bf38ee649997604f151c602c82900a8205d8f6f670c8684bf5abb5f75ff29a37eb9bf8105199fbbfb4707e162e64c715270f853e648b0aa26fea0f6db562896bf424a9ffcb292fae85b76cefb8bd5a4b3ce1fb39bd2a50d0c9e6d933e167ff629b8a494f2a9b774eb303c781ea02aff1a8afadc2465cc616968015ed6a5a33c3120b945ed5351981e32fb9fb96b2212dcf8fe9ac56e3cf41dc524f800631020b025919178ce074eef078d6842012a276efa628db54058d1eb5b5b705f1e1818d2df5164baabb0c61956ecdb8c706e562fc4fd64052870530ae425b221f89dd6f90dab882e763e7a7ffa141bbaa8bf7a3f21b0 Signature = 112f5c6d3bcb3dd99346d32ad69cbfac3e653bef29c68a33f43231f66cea1d0a195427d6e10c0e77c5d55fe2794287ee32e5e22bafbbd8052ad3606b90f94505 Privkey = cefcfcd1cff4d8910749279131830b1da19dfc5245f78ca68b8c3c1b622b4551 Pubkey = 1d394abd1b4ed1aedf966a60efd3ff882140a7e56b428374ecb443289a9c7f00 Msg = 5ec94ed06fc1257ae9c183ce56271207aca37a23fdb4b0e74ac9307a1bb112e05ed5a5d047c93109e2e59477b03378346422de36714c2961bb9736a513ca3671c603a68c2be7317b1b52a076dae2aff7bc88cd5eea0aa268faaadae539c938bb4fd4b6069b1945eb6af0c9e6c8aa5ee4a4af37e90c67e248e8d27bd7f9589c4d30e905651baf45364fa049957ea5d9b7146ca68204e5e973d0f1c91a1c4bded66115028a71114f0f4f851bd115faeb954e3f71a01470b2481a0098d99f9d74898c8ba0287cc7834155214173d1fcbafcfe9b08250384439476055883833816c9524cfd5744aaa259db7ebd3a6aa20b5a6546dadefd140668eb0eccb5f668db9fc62983df980850c9d19882a17550d5dca3542cd36003a0d03cffb04575a3e8e1d07015c7b30eca9115cd2b72e46dfddf6a4dda1faa2dbdc89000d433f6ec9adc46146d939f32121b99b28983d98b9dde8c3f6e5779f2b0700cb023db13de656e0aed1da2d5c6ba2652343648ad420f6ab9e55a97482a1a22b3bc2ee598629abad9547edb5ff790990564bd871f81b24b12f2bf8dbdfe7a88375fad9ccbd9fc0ba1d3bba5e3c4813c18a0348aad83fb1b82689054d99b4600dd1760d0dcce44757467bec1946406d530 Signature = 7d83ff66ec79307b1c0c093fda3968a96cf6044f5c802888584018845e7caf2a135ac6f1677e84d22e458e227e4f930209919bc11b12f7aaf2b8c94302d64200 Privkey = d107cf26f527db71a206e41d17955321013225bb20f93e12df3dc7399e720ca3 Pubkey = 186bf453c95dc0a2fd589a78e2c80040b3f6ddf9a6f8681d146036cf2146e8fc Msg = 78eb9e13789928a74f360141728ede98389685c836b91fafbf1a7e8c19cfbe21bd3c3d6c6ed83c409ef693f1d735da3fa466497e19f38e30fba2a1023785459070e6e92c1cb7c9bd0c9ba61220157866c3bed2b01e6e6b9b8dd3f0c47c02f181346a0a9b9b5d3d7e18a94d6956855e16e8eaaaab71b10302f35bd8fb1f9b5847304160324926645b0582c2f2f1533a24281461514241db2850ef31c5763b2e3d4fb18fc6d8c1d7e52f7c13392c17e27019ff60008e431f1714370bc0efd9452a61f5c56488d91a185037f1f647f72fa785010d5d78f0a11587ccf66b8088e0e635fff3774193b2edeffd92d6e8a0321128ae64cdb862e631e2ee5ba0da44bbd589dc392b5a113b86a727a8ddb698a334cc668b39b1cde199b88837ca5f00f553f89c622834273641d39bc10c6a24e1eb42587542f03fc1627524ed6b749391f11028706c42364425b2caf20180e1b802c744b49b7bcd9bf7b15c23a0bf1c6965960d341554e1966b6ef82fcfbbe41d1e09d741e309254446777f13c29a67b8bdebc5f7f04d160d60e332e3d0441a0f2f7b192c3e2bdf6dadec2a424f88669806236ee04dea692bd8bb6f91ca0682ece349142575358b9b7be70600b3cb81e1456ba0799fdc01ffd68623 Signature = 8071d97f324f10358f13ac8c61d424b4f300dd0419571c39e40d99aea5f03140e62ab4c97127ab33e98269966ae1d4557e459bf7f597b313f351a20122f0660e Privkey = af7ea8e41c8937a4ec475ad81371a171d3d0f9fd7519a04c751ed4ad8ff8fef9 Pubkey = 15dfc71585bac71ef20f374987c555a3f2f07d6b9c787066c10d63cf06e02ab0 Msg = 05f2263f0245ecb9faeb14e57aca436668308c8125df3116c4ee20501d0cde701b366e2b50a1c5edf484144ce16bfb1f7d26dc4275ea9732e264ba4d4a362b40275ba47377dbc332cb65e2f4c8853894aa878a4c175dc5b3b2a757ff3c8d7de660973b89dadf076e2e4fc76239b7bc752a229d44e000ceb667104cb0746bfcf59d69603ae7fc1bcf11d2e33f61dc497ec1b0bd5e4f1dbef435f2f291f30b00a85e833946c8b10484e4abd7d60bdbb1fe6dff5807a53bb89382153013b70ca08efc91b7e9fc5b5dbbb6af123b57be2e140fc471a45d89fa8284cc27e0a1fe771f55598bbdcf068d506dad0a592179ceca39ee9526f9e4fe47bf2bb14fb1486a677d4d7b99a520545676a0f1fa809049aa2414ae7b817d9a036e5c157886e8341d4e819c092a3b48b3606b03acb727c6c2217d0af30121546a94af6b49caa2a8c9b1786fa0c2a524ec7a023e924b5f8a89a53780c7f8781c5b8e869430caa0e6d0437967e3aed44f45c901cbcf1026fbbd4e3dd9a091ecf8b34f7dd5038e543dc7eb6ad5494efb145cf63ec0d355bb8e172f455d8a6b13dacaaddbc56e47de3cf762a1a738ef092f1436680467b5cd82e9e36e2d2b6842b3bd5dce77180ddaf0b643378e698599dd47f5cdbb Signature = c0f1739167274bf91831c74beb645af790459b28bb3f21325365130f409acb66df1d223759a9758e08fd7253737484e285a6fb47404abe2eba5ef249fd025c0a Privkey = 0c57cbfcebde10ede02d1cb01df360d41f2e66a50443d58b5d4f0828c9a18bb7 Pubkey = c4d761ba189971b9462c61bf46a765f88e2ecaa5bf2211220afb00ac657f7ce5 Msg = 337703243ab5b4e4d3481ee8dd1f4494507174412658a93988b5c30403a7b7ed8522ceb46fa1ee02753a874ef0675d397c575da0b08caa8cee3393784d0f0db8459837af90b9056df4e38e417f3ad2eb1a100ef207ce2ca6c610018021661e307099f2b7c4ae875991140bdd3f0f99ad2c5d55aacb84cc1cdcd579e08072b6951fd45ed289ac9ff7f0986ac88a4fbb9dc9203d9baf180c90edf937258c9d0a6d48e220f72d250c7f2c777eaa7fb9fa11d50a5798772f9fd976b00599f1f0276f3a2e4d988ae92125467a8dedb7a16f9e3a56e8d00662b3eb67a35b9b60e73bd935077ee238df8f6e833b9a5523386826c1f2917b1c3ec98e0a5fde89c48b1d446da5d0c885fef0e374bff30a997c7bafd5e743c85d0c6aaa6ef10a061211a2327c6d84eb747a56e9bf60fcd5b553b798834d0c5ccadb9d4b54e7237d12c679c193a287bb2f511cd4ee2a2d8549b44b21c11fbe5723381c6c5f784687fd90cebc5b495af9e414f2961b06a1c8433b9aa3292bcff4241c227167f8d1de054ba33ad81da3eb3ec6e40a6e26854af349540171b75d75fb9a8d12937827fd594d317b7a8d9f1c2fcabda56375568c3e9e514c2efffc3878363dcfad9fd95436b022e8772a88cb71e803bf90381962 Signature = 8af7bbe01b8ab93951d16fca05a9c967d1c52c974bea151ea72e4cebaa20cc783bb61d8d69385cac5bc6d72dbd162beef1fcb5dd0e0a08b48ca0b9f6d9a9880c Privkey = fe7172278364194bcfefb4783142b79f59d5fd978b1e47c314d78d4cb3f61c8a Pubkey = 2e82cce47910c7e2a79bc1f419dc3c3df54f23291fc8193e8258ccd2fd38d548 Msg = 23509451a059969f2b4bdfcee5388957e9456d1fc0cd857e4f4d3c25a4155d5ee91c2053d558062eea6827950de863bc9c3df9672cde8ba741744ebbddb45ec1f4284570fd0aacd07ea58c581be2afc95ae444e678edc2a02439f387cec982ea3a44814a8a302bb3bfe8228d58de039debdf7c2a7eddb4e71ca474f94f7e2bd89dc65b1610733c91fff89bd499f40154a6198fdf5ec7ad3722d925b292196c429499075be0c5b6da9c090c0791a7019eb5e7366be6ce58ab2f04fecd9127c42718047bf47030691521312c0877aa3f36cc5fbc9caae0fde3945d2a868ee2502a3833208eb850a163cfcbf6da9ee6ad9fe067fe241986fe4436d6ae4edc61561938e2a33f4a33db63f69d3f1a8850ed40028869164103488fb795cd82ca067fe1b4897caa49a7ca9a80f3a8151fd13bbb7ff350e8579f565dc1c4a9ca938d27b15b3f858ef45d3dd78b2c358635356315f55a97528ecfec5d11a5b721503107faa406c17034e601474b3b60cf48692e269261158fc353d4df4274381357790b7756087b00cc79e3b9d28a3f2439febf199e64a8b37c91b5a4334e3354e8faf3a361e856c54bdaa43bfdcd6ee6c9f9679588f6069950832348aacba2bfeebacaa2071ddc7d77898ef0f68793cd25 Signature = f6c2a4296b9a3407c6d7a5679dae8666b503d1a17eacf71df493791b8ff0c0aa8eed36b327a29ab7828f46f22de868b628b1cfd501e8599fa31693b15f61080f Privkey = a951e4e6ba9f1f0b354831c986942448faede37e11b0f247da2706dceef73ac7 Pubkey = 30362014974bf75c8495c2e271e713d57384384d0a5da88edeea79279c0c58ec Msg = 20577dcac89174885eedb062489cd512fa72863ec5438e31e95878b75ce2772aee6290a0ba3c8f642c1d0ef55da8d5bc1484f83bb9876c7a8c0b6b609b94d112a06fc83ce8d2c1e08ed6c735e57b244aad6ecf7075363d565ba47865695c8423510909e0a3db4b61ed7aa67a7471331e83a0c58b8220a6245f65661549c1a12d4c0d50c326fb94917cbd07be51e83fe8bb3e46ca01b0a260daaf1d6abe3703d6a925113bb4d57ea1a48b4c7dbdaa03eea814a4b5f02e1dfb545cc623fe17a3bb18e4373f5f7ec2fb5217d23e4fed54a772e11323e730aad7efca8c464400e7679055fcc125a876ef7b8b9de186e229a7abf191d0c56d91815f67872e957bfbc7634aac403576a58f427bdbb30e8c4b6fc6c447741024ebb503a5a9025124a4887f825a43ee940f210a1bd5ae4f6732d60f95f2b83201c4c6dfe279412d7502a5211f8f48f800db30fc3776c4ed3a38bb4634822c98a6d6dd3233be60e42cca45a3163cc84e9e8da647c0711bc4c6ccd65aa1e972c07404d103e74bcc31a7e2c3eea5ac9257ab428947ab3dd3fb153d90694a4073373c4dd9ceb131154fe877473fd996f424f33e316e4eb02b8c7513be6998e516cbba54d94cd0a435e0ffcc2c0a8ef72b630ec24781066aa5efb9 Signature = 0278c86a15208d9be5b1e1574761861b8af72ae08d40cdcbec354e65a9c3d0a06b5fcbb297d09bef397462395986c3093eeb22644c003c3078178cdf674e990a Privkey = 38a9b2d49ba8b82f301a5772cea0efc2218455c8b218b22cbaa2aad2d7ad3b35 Pubkey = 9df5ea1f78f810a521774602bbba4942f0459238966c8bcd21900afbf3d84293 Msg = 1778167c49b3a44d4a5ba838b7388553b1e13d36ea4f86d30242e1a822a3bbaff5cea63e2ae2a4635be236fef2b8135d14fb621c0bb773c9c17753f80926eb55d0f115bd09a885d844b818c9f04489a331bb5e032b8e58cda36949c5a8d08b55bb8de965e1f90d3b9cfeecfc6ad9a4ee5cb4047e9450acdc64640166a8c069ea849aebddac1ae4afec91ddd17fa5553fa87c56f7e51ec1cd6b5cc23351d057a4ce4a8923c8ae6ac7a8afdcc0881c0e74ebb024ef7296162cb93c68e50bbb074e651ac87dac9ea59d4c3fbf0fe379f3e97a24566ecae54303bcfb6f0cc9f15f6639430e66b19a427849fdfff833df02689e9de44006c903c559183459b9f4a97f54a0f2a28df7b0e9deeda8239d7b516977f5e7d6971b4502e9885f750af8d1a6669e25e77d5f327c77c87a86e0a1872bc96a76060f5f8a0c40cc973bfc7fe6ed9bca78f884e6a2828b94d489d32a0fd337e69db83fb8789afd4e8ef54c22a78c2587468b9ae071bae3b202d3183ad5f0f8e842e5a8de85bfff49e03c8381bca7fd4278ddccaf0134fb5593a395a77a5cbd434593bc4ad0ff4b8400ec674c4ecaf1d57754be0cb2fa9a6441a9abad7b42197ad82e50827e4a4245573a8f0ef87f58228a2867f4b3b834b6635037940a Signature = e19e62ac539a9ca251d12d4c71055b0a3f581d19f2682e672404c78ac1f12bbefc91519276a5cbe16f520cf7a7f687a240f0329157c59f50026a58dcdc50fc08 Privkey = 9a1717873689a03c112dd6b4d76ae73b89b416a598ceec209e27961e7bb1ee8a Pubkey = eecad1e0e4b863291881a8c241db9ccfffe4e55d8b5a42f307b4436acd0649a6 Msg = e26580470901a07ab0931aa23829802ce04da59fdc2f773bc567f1e65b4f2e2d4a1a6aec1f54158adfce9b099790b503a13d22097ae23ebccf923f3bb1986d6e49111a8cf0d4eb8236bfe0d7c9e93a5efc7feb8e6a9cd1b8d921efa21e449ff49e06c1ccfea31f93e033c3c2a54ddb0f653a09fbd18a70b56315f193e7be56e5168f59563821d4bc3bbb0eaa2048286bbeee5aa3f3e7536cf2b750fd322602bb3847ceca39b75474322d76b1de80fa2eadba152d6f8f020d4d931c53f0a2801224d35deb6ec13b014873e689903607de96d9b7a743a887d2f48daf2ed2eefb202abf6082796981123b966e936dcf3483e2d24d694ecb865fbeb6969f347027fb8b175d24a4c045c0bb4ab5e02ddcbe77d4756c46d137b094473a02307a108340acad9d03bae8403af199cb75cae3162f3815813cc68bf2a5e499e594921149f3bbd214da5137e756521559dc80d9a4b74a0f4943022c7cd5fca42315e0bceeae9069615ce67a04382412313a31d67b346c329ad82e742c0a6ce0a6a02454c113e52022f3cc03fda691ebdfe14c53c8ce5ca9b932ca1a386e3eb4e90a4dc6e8ad8533b5af1aaef5003128655ca64f67fcd97c6ac803002404900bc0fae98463bcc31409f9981748789ade2d07783bc32b Signature = 1af8be095538965800d8eff6d723d028d65d0e9c6eb5e9d125bb3b1783f11ef7079a49a807e27ef1260be26a3b231d03b2ae151e49f6f189f15b1c83eab01c02 Privkey = 43bd924db8156008c6b3994a8130d427d514db8a613b84dfb0b8e0de6ac30676 Pubkey = 1b3461c269d5b0062d5df6fa654a2586f647a0684218a06e5e2f7badfb394131 Msg = 6184e6480c42e96cc877269b16371545ff9523c45ea88e76a1348c68ae7f318b088fe4610928239185b6b55bfa0f43644c4a4c97c56ed77d08b1f4aad2f4aa069994abeca96b7bf81b8064ea4350d8a8b02297a51308b61c57c8f1873c6f97007aca3180429e730a6643f28733547bcf7b9adfe327e85736bd04af7f1d9f4fb84a7f3affdf4e22b574ecb4bc8836b10b8453aeaa5c1bf132248b826cc5230f75e075fac9f037561136e00643d08253e7ad652f702c0d15b6d7d48aa6f8e9b5f5cc146e3f156fb2522751c3710041bd922f37a50377e028b0c4e4bc3465d7c84af6a5fb427acb3b41378b102bda46d8f6f203a5ffcf395d435e93458a0b0a4c2e7782fafe119f769f67058c6677f6d10d9cf5cb8748e1805798ed233f6f930eee0e5075bc58b97af9177fda75d53708beb04dc4f19a43e768074609f14065f48fdad5077ce109bacc357174a6b7956f6e7f32e38415be526370fa58c3c0b31f51e6cd4b2cf27f8bcbc21259d9e5c3b5c2946a9fc1b00d9d15c3b7d80bfd9d05db91d249d3e42d8956682044548d83bda8d5cc9212442f30b45cf4aead80cce9b3512c39c5c737d3f8d747afbab265af5eeef8ca9362ec76e943b0a0d7a39f3db11eca14458a7b592e5e4ff2275dd48b2853 Signature = d2a05d88d9d543d94d57ec88ae55681750f20b9be9c1e918cdaf457767f2948dd629e94f068edcf3d9927e330234badc3a02fa5ad3d9d85e948cb0b0cb3cd70a Privkey = 8fb086206dd95a2621f598560ccb281f8273c8fc72e23611089baac89d3c3c78 Pubkey = 20276ef479f4d4523ab77420d424e8819c33c83779ed80c7f666e8f4403f94d7 Msg = f02903ed4266e849a4485205954fffa8a108c323b7e3f84331043514e48556ab019497233a5a127bff3cd7c97086becef538b3f339d7d06e532dc7325e597ae357f816dea42a6a22c79d22074a2e1ad8023c424b7e096e5ad8897b05ef7d00d30a04aaf2981eddff2b347f1e27e20aabbe7e7a9544978e092b00cce420aba06187374ffbb37b4c22d75f04e57590f610a27347286c298312a6c9b1bdf24fbda8513c4f8356ccf757068ffc11bc65113783a5dde7722faf4ceb19fbb62f40702e2c6e6a8bb49ef40446450c4c59a2990944da4744f6ee770b930c246669813ce5a9f5a47dd80388981bfcc3a56b5be2c4c7e659a2e9182dec0aaafe9031aa3954d4fe7c431196a561a5b78eaba64f3db1b586c53b16f679a84921a642c260e4653a61de108ebde6f7053afa2cb3f3668ede121020dd1bace8418aebac3a5bd5142f105ac26fe49e5fb140c19b22d54a6291dfc954670247881646874defad814995519f6260e9774a8d185c37881b4f2543c4b63fbf1985016ab41c4d728cbc90b3ab876267bed41d0c0902f6b50e8fa906fc4788f7b820467306e0fe9e036a0a00f804f91c3ca718b95ff6d9e2204bc3161bf70fcc17b2964b56bc612e29402d96f50986514bc7d831d58e42793786d5806f Signature = a9305e001600d597d05ef671699bf09f0dcc0c44475d3ca31e7ff1bffedc0c67daa1f3b76a035948c59cd87f82453a40950a1c9703c2e7d9280e7303966da301 Privkey = afa1b846c210b52300e97696f81b8ea774d1df12e612527c55747f29c1937396 Pubkey = b609566bbd1947bd7afaceb14389e836227169215fab66851aa5d70d6e2e3b89 Msg = 4cac1b1f4bd48284dcc9afc8b5955b64b436db704b0335d9755cc1f97477f8d323cb6410ef146ab8a9efb9526d8b62e3bbad1f7295f47ba9f0de958f8ec9b77ab42232437ed974856444cd22e20be35e91813bff4b016f810d0f61d89f6b614db33f34bd09985b593fe3e06e065b7bc6cd39d55c2cfbec7b6d59c0b37dd1d0d35135ab1d1b04f2f30c2f04f4ba2b36582738081cf59190f528363db944ed612931d1d514c6214f9ab92abb1833926183ac52fba2a4551e20e4c0ac959a49ddb167a381e0241d40c086e90e52aca017258975dbab2ba451ee539a718f076a58709c6697418d9c6f13e4d391368bf0e8bd8f2932dd95ceaf7aaca1241147d341a3acd08dc32905483572b89a80cc47231468ab8de359dd525a6257cf196c2ecb82fa8a78aa3a851c7c96ca25bf7ca3dcf3ca21453d0dfd3323d5a422dec84316102f684c359f226bb53779c0b9950939281ef79a58c011993eace085497afa4daf64c9687b0a11aa116cfa7b03936241a5567b646e7e42e9fb592405b8fa3c0a821fc3121b45b1753cec9a83947d211a45499bd63790b87f01472fe566d87696efedbb74ed00048c384ba7f027b3aa4298dc4110349fedf52a96cd05d08bd635771ed4510738d8f07a6021244d1903579a3ea739 Signature = 98b0c6313cecaf7c82cbdeb3d0280641c61a060f65e563aa93ce18300a9b58272dc8680b485e8cd11cf80fdca868fab365378384a142727f2f844f87cfdf1905 Privkey = c85913a6877877131001623ccda9cdc12b9d4043b8a83793c44696632cd6421c Pubkey = 9cc67c6948f7bf6e556d0849d3b8d203457a7b61549b36681d754f1dc0841e96 Msg = 91b5009e83d0f6103399c2d3feec0084973a305bf4176ec782537560472db187a11b4dcb4b2ffb7f0644feb394b28e5bfe97247c4a4a231cf6e916bf99344ccda88a7f5d831d6de3d563dd102eaeb108c5bdce44e0632d17e6fa55b18067df2fa8d200a9869f6aff920c51d46a1ced2d903b1d9b6b075facbf91cd05eb41ad811a8ef40d9118261012c72b8979f15153dbb8561293da9f8b77c8ff14f75387536f0036d1713a72ce8c35b1062f2c6732aebf32936799b51c2cbcd6572413e7dfaab8641a02c150237381cf7a14e22c74c6c20009de7d3b7e69cd1b4584ac2c01babaf973c56b3814bb0089720e41968106cf26509d4aa546fcad5534af303ffca42b16ae6c93ee06bc3cace12e4ec718844bd30d2224cc486d106d1c456bfa165ea0120fab3df2c5ab3a523bbfa789deed44032ab0be86eb7cc09cdb7c07aa948dd5277c3df1d9d1843567dec84f9288e085b05ae4b8af2cea5d9a184d50bef85550c836613d5d3af5f9c2928e6a89660fa62719ebff773e46b77e34bc0470da4d2cdbc7071da758c4d39fe65201c88aaa8e6603d0bbe7c3e9b2d9e41b634682092f147341ad6d667f20c64e81a68d629467a54dd86e1ce12c560a6f9b64512d6f3886cbb9f37c37eb3985c8ac38dd6682f48fe1 Signature = 01fccfdb1fb6888b0310a913170f7e366816daebe7650d72513d9506e66f7d62208a49ece0af1871497f4541ef605bde711c9e0a1205ef48f26c03dc1ad4af03 Privkey = fa1e11dc8364208d8e1cb66a361be7e84c5e368166587d4fdb06aced7f62e17c Pubkey = 4d8e6f4b3415df6cedabfb295c1984fd419923c6ac41764e32d22daf372c50fc Msg = 294e63bacccb801bbf04c1f19d0aee16f5650a6e8eea6fe41110663ec01532bd4960a527f15eca4af2f4e6b7b0fc340cf97aa234e92cf7d69d50e4009c2496e3ed4d9aff000f9e185275b817d26a0bab69b7f7ee1ea30daec8bcee387ae46b4b299c27bdc06eea63f24dbee955a6c0969037eef91c34321e3c5c972fde993183b7d23f6e019c3e0cac7589ae4a1521af87ea42df8c22c2270ec23d6d140f9cf6d4d52fac1b9d6c8939ef8131cb62a035c5261538bcdfd6db419a55ef9fe5d7a5ac44579de700858d74a3434844f28342c565892722e27f407d7f17b74a5934be915b20c2400643235f8ab5795f324e33c50644a04033542cb3816d770fa899e7311c14301c1bd0f5aa60a2eb3165680c720e1efa8096fc25d2779275f1842b2db53b4da0ad3e59c07540c28460cec1fdd3cdb7a3478b91a9caf9ac891cdf3aeaeeca9a9656ac1307259922fca74c5cc69f7e25c6bf587973a4b7d3e3ac0635b0db22a0093a79076881c71736ee1d4d45f8ed2d29a0671a64e6ca2f7a5ef404b1edeb842034f571b699bc59e5a37df02054e8482bf1e7b77d8e8397da15d89d7355a5dce86b1683a9ac4e406c08a94a6eb00e5ae16d96722972e5c50c7bee4a84d0697bbe67ceb7ef295f06aaea5abba44466be0f67 Signature = e857db087e28d6750bf54e53797251d8439989576c12da2d9c811a14877c3bd46c4efab861a10eebe7da04c0b0b445c7a390a50c13de36f3a3c7ae0157022c0e Privkey = 24a914ceb499e375e5c66777c1ed2043be56549d5e502a844710364042ba9acb Pubkey = 20d21ee764b1f35f94568200d63bd5828aca8c5d3e9047d23f478b925295fa2e Msg = 3ff9f66fa2646ec66a1bf933c2b4cc0fbf912b4d6db50534257f97d01e698d05485747de2544e9f5a4a4a075388cf4400ab89b0353ce86198202db3a903767b879a2af9daa155843111af15a2bc35efe41bcc92c8207e00113b04f1303007949ffb6ce8df4b0b34248fedf5d9cb2cee94b812ed58ece2a0ce0454cf14c20e49e09fe664d6e25762e87895932cd5cd32eb6a3abb38ee163078c133e93588791dbf6af499a31ea4453bbcc7a85e406c9848a664052f11113fbb4ffa760dee4c261e396942491119da29a33582f821d4125e0b4162f28beb066031a652d05749aa7244dd4f3d3bb15d268328d6a02fce2501815257f8ad5af4ecbe7cb8ae9661e344f9072318791f3e859091121e08aefca8982eaaf66259d9de4f46a31e716dc033d0f95d1fa936b6c6079b137dd1158d1def113018c73f8ebb9807e0f7415404ea9c78544ace7ce463cd1d1c57e31f4091bc091804cbcddad0e15a40ca91acbe1c6224ed13cafb4df2c84ac9f0c3c9b546007d9dd6e524c467072563d4ac0d700cc1bf30febb334313dae5761745ec0a5e9e8815025958f00fa2e58060d7e9a5f2b727f48699f929c8459930892573f784fef5692518b5ca268e2a73ebead6ebdeb7ec24eac92aa7dcb41b598bd6eff3632d069726291 Signature = 3ae0cc7bca8d73be83a9b809b13338c12706aaef75c4d1a478178f9dc565514c7529e298043ea78d21a5a09dd04f10ae87441e5686a933c92c75548427ad3a03 Privkey = 5532e09b937ffd3d5f4c1d9f1ffcded26ee74d4da075264844690bd9c8613994 Pubkey = 5093969f377bec3e35f59efda01ab4186c5d2a36740cf022675e01096b1a3f0a Msg = add4d7a9ce3f63d1f946e8679065545d8c7bf0a2cc3a4c00b8f142f0945ae362c4c9462a7576a4059d57861662884bd80b96d90d279a952eda952d37d4f95cf0d70da98f4fbaca39e169f9d945d41f872397bbdd5701454303d77d31e86348271da40a1b8f1e57c36fcd803e14fa17716c5631efa01d3a795dc20b2bde36ab73ff6a2d533bc15cce22328713c3c9ccd072c3e450d7f22c0c9f94919752cbfe45ee655d1b53676593cdb448704102631caaa976952eaa1f6c2e876564e420f0c646a0f88365f76415b4085f60a338b29c51633e540f0bf32d4087e7d0fb685be88c7595dc531c99b489584560ad8234b18e39a107cf5d842dabd421e77d26ea5e0f1405ce35fe792714eb4ee1a8017648ac1ae739a33d7b1e089105d1e5add27a62ce64154570340af9eb14e7fdfc2f9a2c2fcfcdac3cc4227763f4d629497479f849216e5d90ec16dfa36b72517f7b5486baee7fda4450c352cffbbae73926c843224f8ce44b38dae53f3ead21890b52a7801075291684fd5910ed86ad33e8a007f6c3f85c16b209293740184f5890874d431cd4e0ea4087c49c3471d789c813c6dc9a78699363a1d87197d3b92c0286689311823f4df22ce8035e75732cdea7f5621f67db0e2a4ca6616193221c0aa3d6de50d85282ee Signature = d527ff0d4a219d61f418121206a54ae4985854a310482744486e4d130a7de97c319df8372c82828c936e6a8afd9c5de1828573d8261ae9365b8f237676182402 Privkey = eb36511009d37a9c46c4d1374d0bbd0d9981e78cee7d188c5aab983ec239e10c Pubkey = b1cc212b4521bbe7b19a7693878a558440eec36205d8439d040a46a9902fbf55 Msg = ba2466e56c1df77f22b6f0241fc7952ae9bc24756419a9446dd2b49e2cb9df594e5b6c77a95aa5fbd9dc57fec83962c7751eebb4ba218253f916a922a5139663e3203e3be482be379ca151c463d9ada21446135f356994fa5449f084478f5bb4f5ba6145c5158eb7b1c43c32ebea25e09c900f01ef91e92f88c03c76504ace9646016ffc2789559d0f3cc9d00fb61bdc6af7d3940f302e588e04f79f7b3d4b91a5d193a4f8222bfeb69bf0347d98ad81ef99d130ebc7b36b0783394eea92a38ddd5e7480d2add4e4def53eb99c449bff94e4718b09f2ea9b1f2b886594a95c33a69e0333154e440ab34b7b6c1134d8179b6f0c56251a9ad8e1b6b0f9b8a5c97081a7f8fd05d0b0affc82dbddc8b0c0ab7e833f300626d4b973b3f60feac55571e89cda0f2b441ed2faa669a70d556cb48f9b1d1cbce32ede5d166b1143e264b11ea327681cb559edd13c364bd2baf1fd54bb781807bd59c868b0e4795a779e67f0bd0d14b5a6b9e440b57a5823328b59affbd027eda7dd785079c5f02b5e32890b038730986a39a5a9834a3fed868b6f45cbdd28acb2709aff556263864f9ae1e757b3278c288dbe2932825712773e431f7c29329857fdaea798ed93920893631402e6b13bab62b4855461edb94620f2d1751865f445c466 Signature = 9f583724de552eae82f254ac6e2ed483ec1a07346266735c490920690c1e3fb2a9e9a34194ed6473733b300d4f23c9aec0da5a2022054ca43885a15a2984320e Privkey = 7dbc81902e4eaab3077540f559995c387403cac306d486e959c5eb59e431c0a8 Pubkey = e03066139082f613448bdbc27fe53aa3f88994c31ddce002e36bbb2963df3ec8 Msg = dff798b1557b17085a0634371ded5ddf7a5acb996ef9035475e6826336f64ad8b84b882e30badec2b4a711998752f4a1574bc1f89d4325cf2b39861044dd03691e71d07768b5933a3052cc7c81d571a9de061dc19026c2f1e701f2dcf26a88d3401bc99fb81559dca76d8a31a92044a273587d622a08d1cce61c8f948a34ded1acb318881c9b49f6f37c30a65d495b02d5429e7ab4040d8bebeb78794ff736d1511031a6d67a22cdf341b980811c9d775fb19c6478f05ed98430103ea24c0f414d4cc07d860b72dc542ff22d83845a42f8ba45ca7ff3aab0b1e7de2b1094deac08d16eee01969f91bc16fec29ccc061c54db5345ba64842dacc99ee7729468d80a3f095583d8e8012408519d582cc3ff9a2eb7aebaa22db81ffc78ee90ef4ec589dcce87118dab31a6328e409ad5059a5132c82df3cefe2e4014e476f04c3a7018e45267ec5018ecd7bff1dda9267e90666b6b1417e89ddacb5085943befc7ad2f4df5f1ee0af9431aeeb6b24a5515b93dbcf68640f7daf8c961e567d7534900205c3df2184b6ac2da961c4c1d2bc49b4ea96b8154ffd4efffdc5e55a7119cb8af429e85105dffd41fe4a2ebba48168aa05fa7df27c4298735ff868f1496beb4b2ed0b8980c75ffd939ddd1a17e44a44fe3b02795339b08c8d Signature = 5b7f652f08f229fda1b0bd759377b3fb726c1b9c9a10ef63426d352dd0869bd54d876c3092f1cd411c3757d3c6b6ea942aa70c3aaeb4217a4c7364d18e76e50f Privkey = 91b095c8a999e03f3ed749cd9f2faacc0076c3b477a87ab5ccd6631738767446 Pubkey = dad174d359daecca9c6b389ba096452ab5ca91e6383c6d042a284ece16ba97b6 Msg = 9b0d8b00299852d68bbf497fe603961a485466a99a5484005db73d4e4bad814e8574efd54d648bd5c91ae8483c54b2f998b02e1abd6f401a25526843a5f2a23a97bd589d1f7e1ab14915b1e359a396d352c360ae6584325ae4bb7d624f61255c5c7bf0a67acab46c3b57b34534c0ee8431d260576606cbd84d8d1839e73da6fe4b0b8b78f0f958827c2f1d93ba7a346dcc75cb563dffde26f997598e8b5c2f1617c6fefc9be4b28b5401b0006413a251690d1203aaae4f6d8a3fb21f24009ab3bff13737a8a7e6646c02732d9ec5a4a510469e2d299e4cc1ad6480a482aa956f89ddcccc64a136fb15b876b6ecd88c7c86a4dfc60e666207c604167d163440ca9ab9cf87a5e0f7bbc5517de4dee876c037f8cc9d959c8ff5dbe944ff54cd91a771e29231f8b5f17d61de904c955fe2025dc52ed480fb3cc90f232459c607ef7e2adb52c7482becd67ad2149a4128f984038b58aa90176782393604aac74c18209a3d6a78630c01955a7cece5da8384da3baf63aa2ddf5963fae05ba3b81c6a03d86a00ef78edb4184fdc89b1d6bfeb310fd1b5fcce1e219524a3cfb2e972577f06b1dddeba00865dae4979000c008ad99f3b638cceb8e8c7a0f998d34d92143d81c0e1c096a925ceba65c43003ee18d494d003e9c61f77d65759 Signature = 64ee9efdb0c2601a835f418520641e436c7dd47c333d9fc30cfbb9e390fe764530654708b40b03581899a9ac870efd766ffbb4637152f8ff277964fe35425209 Privkey = 8c568b310ace7d1f0edecefd603a884000544c792565d481c3d3e06e2d82ca96 Pubkey = 5fa6e267c766736841411072d1983d1900acf01d48c3ce11770b26f78da979f7 Msg = b59f5fe9bb4ecff9289594721f2647047b0da5e0e4941bbe57c5b722b476723f0ac5970b4111f893bcaa411f28fceb4f585a2a7187018a904b70ef8fe1f6569a54d00ada37b69cb5e9c9d26c16a903518148e04a1b936a32329c94ee1a8fb6b591892c3aff00bf6e44dd0a762babe89d7060c17b90390d23bf9d360a293b8308383086916e1182b1ba4336f001b8d20deae9a029f7e85397a9ae5cf3ca10c7f3875588b8ffabb063c00ca26f580f69edc527a1accf4f41397b33766bcf6d55eb8de081a48c981d05c066617b80d8f6f5e60e59dd9b930bc4d04586403bb868df75933bdd86230e447036c175a10de9bb39953dcb1966a1f11912078e358f48c5b209a636c7f783f4d36a93ad2cc2e3244519078e99de1d5158b3961e0fc5a4f260c25f45f5e8585e601db08ba058d2909a1bf4995f4813460d369503c6873685ebcd3330a130b75f2365fb2a5a34ea63d958a2a867e90552d2cec8c390084be0c108b0fd2d83cb9284db5b842cbb5d0c3f6f1e2603c9c30c0f6a9b118e1a143a15e319fd1b607152b7cc0547497954c1f729199d0b23e53865403b0ad680e9b45369a6aa38d6685abd397f07fbca40627ecaf8d8d30133a6d9d5af009192751c9c45f77c0bc011268800bf552512730e69973c5bf362ab164894bf Signature = debdd8e5d3112fd77b394aa0e36e9426bac91df126fa9c317cea7c9d45957cdd96a45ae3ad760413ee1205afd71a29f9c3cb586cd2d7cd1e93bc1652fc34dc04 Privkey = 3d09afcee3c432fdfb6bdcead54e3da5b1b4165c50d6d310b7fad787b444d680 Pubkey = b0d9028c4d1487d293ed585a76bc94fffbafe2c65d980c494e141e4810a35cb9 Msg = 767165caae0e578f16537e1750be7de87a789a51ff2de11838f564e2580b2391362d2868a5a4708af15d2e2db7b9be39c16adcc1200b34e6b4d4027ddffc1a2a3595e29e855ec5261b20bd55c428b01309badb59e2ca3edb967fc2f4bac0729ddf54fb6c20057bdda9e7af7cbfc092fba865fd3275b9d3bcb0c346b951d170ac9aa650a86df49855d48a1b37ce56c9f27389f5c8b15f5c2c900c4f107c064f603e4f867ef2e9c10a1b74210e6b89bb011793aa85ded43b51b749ba7f70287b6bc1b89434db8b8c8b5d73b214b41e36b528005bfbfe002e21b1006fb9d24babd72106d093e3c7093b3138aea719d69479084647498cd6c9bbb744509cd7da8dd61a627100f03c21e750acb3fcf4631d7c0f618154d2e5fa6656fb76f74c24795047bbce4579eb110643fa98e1f776ca76d7a2b7b7b8678173c773f4be7e182fd24dd76291ac67d9f26a28c5e3cb025c6813a378b383224642b4aefad0c76a6579517b8f360797dd22613ee682b179381950fb71609a5fb5494d2d57dcb00f26d1e72956f4d6672830e05c01b3779677c07ea00953c6b8f0dc204c8dbdccb381bc01b89c5c261db189ab1f54e46bc3edc4de5ad4f0eb29c0a120e437cd8f37ac67d48c7f0e730278708f02b54aee62b72952bc1c0eb437ca8bd5655437 Signature = 89739fe441ca0ced08a6eb5796e9bdda0e74fb473528fd4907edb659aab44d3343229046716368faf88e85c1644af66ff2dcaf0b17ac93ca13819f3f241dd300 Privkey = 41c1a2df9369cdc927164aa5adf7757136abe51395604266334cc5460ad5683e Pubkey = 40557834cce8e043580a4272a8804d4f926e88cb10d1df0c5e28b9b67e1b63da Msg = b64b14ba77d239e6f81abe060accef85f0442b650c44015efc43a0aa2ba10bf48d3018b1953ddfffbcda5bf3bbe0b6b3e4b0d9a32c6b725bbb231e0a2704471ee8bc1d594f5c54226f5dd9dfa163cfc1452c61f93e4f8139ab4ce4476f07ec933661eae91b6d500bf508ac63e4baaf1ffc8f0007d802e005f1b4fc1c88bee4d5e9e76384f5a7043bd660cce71f3b67f01f6ab844298531aac73a39d045370088855005a09c6d04238ea478dfacad1e6b22b2be4c46b0d59b1eba1f060bf7da5d1566cf1fdb5c543a33926af63f01a0db86e1a6711c473dc795ab283c8d93facfb5701fa2f2f6bb99f9b7e3749b071d58607be44a7089bcb503ec1495b5feedb399961fd3677d7493eaa3b3e9cc5e3642f40d47de9bfee7c20b0e519c4eb4a40f4da446ed6ac7aaca053e759c97dabe0a8ec2f58e7f2f9b2072762f9f794a6a4e36060b8872bd2c18d06a85c2c141a78293773ee8cfbf154b9930cd39da31b497e737a7750c90a13f5aaa147cd0dc4311f2e34941252ef198b0c1f50827e56c9f16f595aced6d2a69346531495a6499774d360766ca9be5ed8881c0db26ed7c5e6ff3a4f9b73cd8b654640dc96bf43bd426a0f28c9b25fa704d62ff0288fcceffaaebd3ea3097bcbbd778420ebc520a417730a1b5b3b8c96cda9f4e177d Signature = b8b2752a097196c289849d78f811d9a62fc767278f0c46628b521f62ed2759d74462a175da22403f15020445cae06da3ed61cca6203b7006362a0e198963d20e Privkey = a00611489467122c4c164bfb6a616e6a619b9f83c4367206b85d3fbec38cd62c Pubkey = 57ab58babb41dc0da0bcd506059aac9f46eca91cd35a61f1ba049a9ac227f3d9 Msg = 34db02ed7512bf8c67d359e7203a2ea441e20e729766c15aa00fa249a3518fc29ef8905aa5b4670958c6a460d77b3a80efcb473859bbaff862223eee52fe58acfd3315f150f3c6c27ff48fca76552f98f6585b5e793308bf5976bad6ee327b4a7a313214b9ae04b9651b63cd8d9f5b3bec689e0fd000dd501770dd0e99b8f99eafa09c396a245a4a96e56896a29b24190b1ef11063f39b63ee3a586b07627dd3500c4e170b835dc0ec236fa5a35c44184707565c4a50662d8dbccfff7f9a7a68d021b4af64d532b7c3d2747418c2d717bb6aca6b58747ae4dd5641d826f79a8a315c38211a538a929e5b451f623f4fcbbcacdb86c8752ea13a617ab414ab653eb2e68d5420df7c6df92438168dcf9c066581dfe7b2c468194a23707de4659bd67eb634ff024741c5fc8698fd4dc41fe5dfc6299b7a08e6ffca37109c0210c8f94ea2d3ddc977ffc0b3794fe6ba4337c7aab434a68ac665484ea8243a84b79aa181ee6ab5aa37a32d879725edc018f8552181816d7d272ca8818a7b92e6ee4454d1f7828dd8afba1a790364b4ff28d84e028597353ebbef24837bc319e1ae8f2b0b6a851b489c3e170eef53e065f7032653cd6b46d8e57e4e111b789ba950c4230aba35e569e06615403407bce0369aaab4eafaef0cae109ac4cb838fb6c1 Signature = c771ba0a3d3c4a7b064bd51ad05c9ff27fd326610fbfa09183039e5edf35472dded8fc2275bbcc5df1bf129860c01a2c1311da602fbaffc8b79c249c9cc95502 Privkey = de1634f3460e02898db53298d6d3821c60853adee2d7f3e8edd8b0239a48cfaf Pubkey = 9dc1465b3383f37de00ea2d3c70f2c8fac815f0172029c3f579579c984a5895e Msg = d10c3e4de7fa2989dba87537e00593d0eed4d75ee65846dab1498b4749d64f40e34b5911c5ce3b53a7e37d2d02bb0dae38ed962a4edc86c00207bee9a8e456eccae8bdf4d87a76746014201af6caffe10566f08d10daaf077160f011feaca25b9c1f6eca9fc53314a80547951754355525257d09a7fdad5bc321b72aa28d1e02d8696d4f9eb0ad3b2196f8bcfaeb1d6148287a3faefef91a7a3e0609c28ce59d0ca14d0b3050dd4f096b7bc2513988ba212128d5026daaa7188846db21c5c1d179ab9487c1a5bd346588127c20398d362d4c759cfab2a677750b9e45676a1e7e092ef02edbf278fb19a58e9bf6c9e996e24edad73f3ce31fa04b6d8533436bf80b4b2f805ed91e7fcda3bc2bab3b2bb157158af0ea8e3f0731dfad459d2e79b6d3715fe7bf1eafc5397593208857e57b7feb2f7387943a8e0913470c161aef4fe205d3637f23177ff26304a4f64eba3fe6f7f272d234a67206a388ddd0366e894eaa4bb05d73a475f1b34ca222bbce1685b1b56e034e43b3c40e81fff79682c19f32aa3f2a895c0709f9f74a4d59d3a49029ecfcb283082b067f1a0d9505750fd867321999484249efa725f52c94c7596206a911f3f505d63f0313254bd445f05be3996b58fe1819af87352e7f0a2ca320d9cc00a5fe77ad41640d50be8436 Signature = d20506eb846923a0b16ff82fb2c3923b00c1b3bcc6e2f6482fba24807521e8e0223f692e62eac993f498f67102a04fd1acf9c7e3888d857c9a080b8af6361006 Privkey = c738ef5f0935281ba625fa4014d4a4d0be7e28fed779a9cf658e21dba43cebc1 Pubkey = 95799faf706d195e544c76cafddf09d02d1beafc42c9d6c9ead4c1845587d39e Msg = 168d0bc5598be02f5443bfe7dfb8829985ca5d282af9cf1b1482602f243d486bd82ba039a0750909e9b3c7d4d5f8b8baf45718af0311854f4d1c7837f31d8ee68d3558e7e51e0c646a4a637596ee90057b01ed0a17daa3950b81ab47ae8b94c17d40746913c46ba1478bfca51b167628fc3ee1e22f2f19d6d8daf93df6540cedb7a859d1a2ba5911ba71766e8b7fce0c0e8663616d0180697d78ce3040d438131982f3f8112acca29ae53e539ff8c9ec4106d132f402018518308485f2aa6c9e8d1e62fed60cb249457db33c6fd1fe07445361f08194a2b5a057cb03cc754e5c7d4a7eea53a7f7d207cacca5e68cafa969a3521dbb810399a17f328ee767cf55926b2bd5f029549d3b464579c42655265398472e1c77cc8dd9aff187f7ac34dd456ace999a736ecca6d405d4922c779c600c47b84c9c1df5e5f8ed3b2811d351339113f8453cca4c4411688cb0388258ebbd1872b83610042249494ed560d4cda6a68455d957e806dd0bdd83004c4ca80774b8a0a1665866f17085014eadb3eae7382fa870deb29dd8c931b53019625740e28392f38575c0e2a9e504fc35bd95df56439a898230a2398cd2225c766ef36f12ae7e49b30a9c0aad469d5895bbf721cc0ff51d840c802d4a7eefba84fe5205a2c2f14011922dde561456f79e6161 Signature = f44371e6c3391639d457ed14648184809411e80a3201f8811670e500fcad92f300aabf7fc68e440191e881d6c3474efd6d28f09dc44312fcfcb82701ba3c290a Privkey = 5fea38739c61ca83bf7b4ad175a2117627b971a634a305a84fa57fecb8035624 Pubkey = ddd14b0fc06768d5104c50764bfd3b952352a34007c50d5ddd224ff51afcdf9c Msg = 1013c60a73953549e5ed105bdea150b91e60ec39200d43721304bfc8ec439d39609613c2d878044a9da01b26d86d6d65db93d91a137e9c4808a97d4ef286a903f3f1382cc6d1294216b9fafc013c86b9ff68b55a50ea3766e61dc1ce38348e91d62ce732c152d766b9335c68d6cad77be2b4a0cd50b9a1ec632ba55648a6e7e11a14c06853c02aec4809bd147a5ddd9fbc3be9f0c8158d84ab6795d771b42b1814a17a3c7a6ca0f4a8f7b3a0db1c73ba13b16400dfecbd03d216650e4d69704a707246444d5791fa273752f59cb5ae9fd416a5186613d66afdbd1ce691a87bd7d8b67190e9ac687062a080d2ec39fe76ed8335058251872839e85eb62f18ece187caba55b5f7d5edcade01cdc543cc677e50238b89c5635ad5c8fc220f5e0be1bc667d20989753a6d616fa69f8b12940b8ca9e2c48577132d8691b053779a152cbacff3b8b1bd7af692e56c73bbae4634776cfc213c99b9ae458df1befc8c877742664b0a0bb1f6915c8dae3b3f55dd75aba6a3bcc4176b4e3ba03d0c1c04c3c6408778b2b8e5a8a3eb52ed32a7428c00a98a589d8ca9390a210f4a7ac004fa1fe4c6da694f12276e320b41b0b59f75d264a396d450b631ab353f1612709e7a2e6a50d01cb110e53040546dd3b1e11d25732813aa76be5e81fcf7a5773f6815bbd Signature = f4e274823f2c396f3a329486aa6410c5ff19266f0770fd04fb14a7602d2b69a4a2b00928e9e1d92389f8033359ed6fb2146467aa154cba597dec6a84173f8d07 Privkey = 60f9a14cce5d43fd9aab4ee8cc8379d575949152693bf29a6790b035e42a44de Pubkey = bd4a70740d5acabe49f9a2152082fa2025330e6440437f1d047f313de490dca5 Msg = dd7f44f9eb728ab48de54ecde6b6184bd5ddd8707545a0129f2e905905b55d3e7fd57e28485d258148f6605e2377d5b267d2eaf4cd4b46e454962219868232b6f41f88a797f9cdd5c39ada51a641214fb9db2c2a9b5a5b16e303575318b625cca970b74348727902a1cf268bd16e107113161c8cbc99303c2b9f235541a7b31e433120feba14febe4bcb0f5b936c7edddd0ecfc72c8d38f64cdb6cfc2910bc29a521c50a51abcbc2aabf789de822cb04f5728fee153dd5501b2db59c59f50cab17c29216d66951019e145b36fd7e841bfbb0a328554b44dd7ef51468c3d5b7d3a1f7b9def58d8cf9d9bcafe92c86cf6d6119e98dba6f38ea57e322ddc9c2198d4bbc3b94ea1329db0d458e01c7081b33925a3e287f599a858c50c3a8f18cc2aa634df63e7f10e403adeab2f41db5578790c3b4f041a8b7a4f69cd6e06215df8201ae5b3e1d1d25a0a39bfc3d041a2f98213ef4141245792a76f06d4de25f6467a0e56f2f5cf69400d22117de7b46149554b70c75b9f99484a4f6f035ad3f10e3753cb14f4f398dcf6a64d10cf6c4fac07c91193cc0f54f0de58c6343e9caaa6b4f475ef91a59e083f9f211f5bc8e7e4516b45cf06bf50beb8fc4ab579d86d4a4190eeac748d06e0852c4b9ba8cfc50dd0a037a7bad7fad55af309a5f13d4c91ed3e0 Signature = 72f54bb8bdd17e9e422cd339631dd39f57355015d4cbd15acab7542efd784a321c1f6125764c0d154045b32e70dc2e03fbfe1117468ac3e73127b5fac8d42102 Privkey = a39053c5c58bf31d462b27a620b0b37b8052c6b1c4102b6145663aa15e978718 Pubkey = 3642ac2a3280dce52ad8dfcfd3709436edc4e7e4ae1b452d9b220780b08679fa Msg = f65540d3abeb1ee5ea987062c1b579516d3c29c39cbc6b09d60e18fe274c2befe0f5fe7dbd57c2d5835229bb754ec4341394765776d6a9178c4e6a312cd74bdbaca0e88270628cd84100f472b075f93692830122f00f9bd91ac582836c8bfa714aa48e977003556e1b696df328ef584f413f8ab614760699c4d147c3eea1da0435835c9bf7ad54606f0213eb74a1b476141506ae2cd124cd51d66e7e7e579560576305c5fbe8430be3ebebaacba3f9989dd7d199f5a455a50cdb3755037e1a70674a4fef40b4a3aaf7bd3c95b1ab41bb206211c3a1276d3e37d8a3a5c3d5d0f36ef5b4f3de26b7f20f6b2900716dcc22ab734ebaf1e8d00020e5f019551653b9c2f70a4038dfb2f12d25d6d84e79073a6548fe15e4828fe5de83ac3d8d98b7daf92710482c37f7bd2431a8114c6137657bb177882d8a3c76babf1c671a7055365fe90866167a2d1dbc870be83b3601f09d4a317ae254cac9f98dcc7aead9224cd9c9d8a200abc80a2dd108af28fd46ad7080ae741b50054b9b9a9201efb7838bc4c5c2cc3d76ba0fcc49c46e792c26292b7d0312aff955a9f8edf0c696a70a614f3553ad3869bfde48d26a4d367b6cec057e62a4e548554b48b53ecda790ba7a0ab2e3de587bdc22b02f5947634d73099f547db22ec1bbf82343f9a2ca38bce4eb59be Signature = f7383e966cb2309deedf860100183aaefac672ca16d5419cd6422ca70e16b3976f5f165afc2786117c868234ba1109ede031f8979b50e567358bd4f8bd958202 Privkey = e0c29df4de45c47539e0896b3a59bc3de6b802fd14dbdc9f25e717ac82c328f3 Pubkey = a69002b0f5ef354ce3b2d6b8d8ba70ab778432b22f144dc9c2eb92d99d99dd2a Msg = 6a37cb4c749c583590c8d849bce3fa657f10009190cad9be41ede19bf2fdb3c562a6101f27bd37f223cab13ced245a1cedf852f551f857aad9727f62c967c0a921df116f48a80a6040b3c723ab5cb594c4507a3d20cd60514e22164a82b74f19dcfdd83c57bc3652375517414af5d18e0a64ccab36699768d07cf40b7063a83e43d5f607964b1bf0840a45ad50abf83dbc849f40e5b4cfb6a3347b29fec50774046a4b50041032aa4d567e8564b3eed1642040682dd8ae7d7179286cf6e1853dc87d27c3e9e60fa47cf8cb2da0181d53eec40614b07331a4fb7028086d0b1ce2e1115b73a162c527bdd7cab5335b863d108be047bdbca112cc6e776bb453c317314388bb9653efb4444bf5cf1ec8da23b711ba71796c0ae02ba1dcc838455078c3897f07e9e13b76e49274c2e207506b00a0b558883aa122b667db9d670508606a3f54320636cd19f973917fb1875f4363e220f1e12398cc6afd79094743338456813a5826ad3f1aba7cd7beab1fe183859c0cc9ef40a5eab912caf515a8d4c3b93d641b7ab3e76b16c12971ace88ff33e5a1ed9b44e45db8f3085dbf070b256b0d7512ee1069432603d73095db8749ca547963bd71a8a684ab8516b146c4187176386afdf6cb1368a3dd8fcb2cfff77056aaf7823f800b266acce72bf643c6d0c28f0ab Signature = bb3b8c5c27591fd8b9c5ba489d6b6ee5b0fb4a7b0de51f1639afc673d0e5f75e313aa7e1d0009081dbca7435b687ccd12f64f74a386e772b9e24781b925c8c0c Privkey = 198b5fd1c03827e0994ad5bfee9b5b7be9966c9c3a267e4d7430343767403c67 Pubkey = 6682c6f1a866b49b2f8ee97f2e532fa91666bf38da1b4dd65543a1777794cbee Msg = 3fdaa15c46f25143db972079d7013c7f69a136f45f3f6ba2ced8b828468eb3daa6b50b4f8d3380fec64a0343be116f6f83b6ee64cc4c1b1d08d54fd42029e4285cfc6c6dd5cd181ab533ffcd411f23a1003da94ec9340e2ec71199d678540d5182e139ffcbc505a170b8f07f4a7e694ca92f58320c0a078564ce9de99b0fa8e66b0d822e467a5aeb83567996a48b89db25cade6457794e5414d67e9d4ab7cd6cc2058bb7a513abd709f4caf24bb67ce1c03ab62dbdfe309ec7db0fa3ea7aae8236f259b922d4536115a63bc89acb2051d09e731cbb0df157d9d345bd9109973c2b594f148efc6f3377de5163b7f69869ffef853eaefeb402e23529594fbd65ca05fe4062c529d8e321abc05200cac1e839e87b1fd3fdf021d68cbb3a4142b69cc3af6f632edd65b83f5aa4cb17da5b6ba3fc03edb17c2a3cb5b04836e7660e63c8a0483e243983371dfa9839f9164ad4da0d5953655e3a9518e136da745737c79243c355fc125cbdcc76aec92216846c4574f4f7f298bcde54fd2444ad3025955c100315de5a4e27c333a00284b2f702fdd3de22ac6c240dbc14bf71e62d131b62f2db992473f2f913f60c916ecf57df5f3f021fb330834395b79472caff19fcfa0a271795c76d69b4db3f85b8d2e5c3441965484dcc39aba59b701274f7fc425246856069 Signature = f454f35b18538f877e5d614a76b5276a27fc0b433f215dc4e963b3f047694c780c515c6ef6fe2db4b009009bc2733aec4fd46e615357cc0bcc9f1f7fc21e3c02 Privkey = 4392f7d4fbd68fe154e4ba38ad5207612a0648556056c39ac116ad468f89bd2d Pubkey = cbeaef41acac02bf1f780ce934aabd631364b369567be1be28e3906f9db120fa Msg = cf1709dc9a0867ee908721b136cb93a84229e83b46204777ca8194d08b7a3ca9c912eb243e5bdabfeed352349d20be801b722af0892238e72edf190e6361f57572781ad3c2590b197357641c805383baa1d4972f76c65448532c110834a0baa8f48863e166b706653708cd4057d3a4f9fcb2ceb4120001277d38c43847d822822b777c2bb4da4015a1c24d416d5062a8718491d855aaa5dbf5579c164d8e524a9f2fa3f22eb09861ffe6ad659fe36eb40431222c22d7137a6cabca8db786e39d81f661afde4e39589b4db4d3c51ca53590a14e115d0afc3a877b839a9638bece80c32c19e51b7532024845f76cfe9bfb2ac05130f6758bf7fe993aa93aa272e4e6bd0c75c14099d43e652a223e5bcd64c362d4b8f4b95e016f9350c7fa74e653525d08011558b2c6e9bf4fdf9dbd5ef9b09bbc846afc2bcbc86c4ccc315f6d1ccd489b0cf8ed0d93f2f532a426265c590ba3a59023347d819d9b281ef85310b05316d46c8a8c0365d068a8708664ea4d77ac0cd150a65a56586babd34b74365bb8fe3e6187262284d64432e4c81ea4c0e57c1d71ae980c7f4d1d871032e188bbf9d1758cdc1dff989f2d1288fef4e205e99e7cbf2cc324b8c93046f476c59d3d0a59db6fe37382dc79c5ec16056ab3934a52f7d2880d0471a377b6a8ae84d56ac22d1d54551c Signature = 86e7ccf06e79362d40cdb7fb75a98978bbd334a1db7590367d60849bd53e2fb1a4bdae590d1f47b5490d8702e7c1a87268b8ee9db612de7bdc2e38fa6deb7e05 Privkey = 0bea98abe7d63f158390ee668aa050e84a25d2893e49fc83f079f9bba6a55a75 Pubkey = 22192ec0d32ef9835665a61bc88bcf4e1604637921152c116af503365bf6be42 Msg = c178e38d4e83ed2be57ce1c3ab64253a8171e610008181fbfc6d752269f7f1c5a9ec62cb27f19ad99ce1f5116a363d96fdc5a42f358b6dbe7cabdfc9f60718e4012c1bb1f842c5560811ba8374a0637747ff92eac21ca65ddeaf43e9989b7de2d432520afee364ecfba4da669ad4893d0bf69f9f81e7df69657be22b92069745f216c242ccd46d02d35616e16c755e0e37f961a6f3637752534f6dfab8805ab759a032a4e7e4c81953325a2f686bb69a029ce4e03becb3605637c5a65b52e331c26c926ed4711a504d3733bb53c97b80eafe4e75ddd9f415362888c3d4d37bae0e63fa11bf755666437d72f58c91d7a2f8cb619b7620a070b26b18b4d50184c5818712110e36d3e2830f6a8576ba57f9cccb8fff4028bf8ef9cb814825bbca827d649547bf6f2bef931704ca7f6df15f780155ed46eaa7ca7d72e22434ca0483bfb2f7902dc787f617eb9bd41ed4520adfd430948c710805a73c1ba5492e96484c4baa7da24c7435c46a052bf3515d33e42dcef517caa45f36c879121078c688dd10d76656a119762b6a834136fa1f8a643224b9224c543cf0470b3f8ee017d620dbdcc84d985154e9d1ae80e5f14387b88a0f6a5c35905aa57fb3abeb0ea6eccddb004474633cc483b56b8a8e20e8f2e09e979aa09893087875c6b117b5f13847ad8fc05604c4 Signature = 7eb3139b880fdf66376a2090818840049767c837f3ad0036b141667052b33609817ca5e240ed8cdf3ccf3aee29274534594db0b4ccc5c6e5bba3280b873f2901 Privkey = c25878b0d1e0925c8f5f04a1e5799080963c413a1399c118afb1687c797f4839 Pubkey = 13ac2cad41908c255f671f93934ae5d7be325346725c8b40dc39ea80d70ddf34 Msg = 6856cc7144b6bddcc4b58954d1a2e7101d6584b5d5e719a0aea0fbbdf221c2a2aacbacdc4020c5c8ce681ff7381acd607b0f5239692335700655be2d94c53d7b5148e92a2bc16338c2f4c1a7d1c595af622c240ce579a5e0f5b651bf562518cec8aa2ce4b4aadb1f2fda6cf6295bc37803b5377dab65c9b9a2949fdd49bf9ddc8f96d260ff951bf8e8ccf9827e6869c44bfd973358cefdb010db5e1fe5dbd9f5d2b2ca393c17d446f637059e692d7a91aadcc7689f5f9e1b3052175d9b6b208f9026787fdb66783f45372a24946b1bd1687bf0cfcc8174ebe4d32e43284fc78d7844de0fa22e2065e07528baabaf015cb34d629c3596ad040de31c5620eb266defa7533ac0401998e5673a754365047debfcf7e137a20d16cdd6a5521982f444cfc3429397c641bd7e74a770bb11fcb29483e337bae5169ee82da9a91adf3af67cd814c2825d29018ef035ea86f8de4c7563aaf66e0c75d17ca68f49f0758ec2d9c5179d01aaed7d4515e91a222b0b06fbde4f07a7d9df2de3bcae37ca2c8460c2a6b3749e9bda36d08e66bcc356b390434b4a18cfa45af557dca3d857ff3ad347cfb07e2358c2acfd5cd53b3b0ea2a41ee5c0802fd473db5f30526334da41eb4bc7518383898a0b7507ad4ca289d66c5e2eb75cf255dff312cb1e04eebeb47f2930b90d5e002eb0 Signature = 06f55198b4191914b74306f38e381316eac40b5b5adb8a312464f67175ecf612e0147b1cef46c2518750a5606bb03bc6467bb9321514f69dcbebce8f69058002 Privkey = 0b2ec62763f687593135da1961ef29a288089696d944b265a5f96893cd2d8225 Pubkey = c1e234fa8bc96d268e7aad028b03f0a911b697715db3a21c2fc7df48ecda8875 Msg = a83434c68693d5fced91bda10213fcd50c48920b90cee9b73a9c61081a0974933f4fdb0a67e671f8351b0ed5ec0fe7b5fb0c87586fe582ffb1bfa2db5fcedd3302428234b2bb0e726dedf45b13a70cd35ab3e299d13f34503508278c4458eea5b7351b05836bdad5b05f60e445fc65737ae27d2e52df9c39e5da0286392d08fff7ecb7066820fc90fc8a44d5616561c50b52714702302bca5874de85dba045045f9f0e604eb86d6d7fbd775f72ea493b2c4ef7c3be16db2ca7e4d8bd79eb20cfb5f0f6f05336b75cc86d219f3b8f2e91ba7d52b64fdd6a6664f04f2fbab758cdf984168691c32f53e8616b49f76ab7b192b900903082cc89656a9705804cc9b9288a3e42170984f8dc454e0864b9341672686a178c060050178a36c6d906b2ce070d8faaacd9a58c794a5ea4108b4a485c65811c2dca2ee7bb10bffff75d4586b990f43763a16fbc0b48ae1fafb08a9a36fa4326845dba5ba2fbd32bbf66505c5e8657ed0107e3e16144ef31fa6aae72e774097483f5480aa45540568fd08cba0d577768004f58ae9b95be374ed7f0299fe721275e476e0b9ab72dc06ea328384e39bf3ac331c625484312cd9b06b15a2954d33e7aaba6be2261886ca811db96b1143d06dd6e0f3cba7a1ae9b94eaf67771bb2d24e2f94de9c470fcde7bfdb32f410198b5aa9698e32 Signature = ff701f34b3594de3b80045f429e5e32dd88d6051d4195f1685be783766e80119368f56b3749725b913f1223f87fb0fb24d9dfa0841d6a0e2eb1fddf775c2d205 Privkey = 8960d7bee8c6b39ca5934d7cddd16f16b3663e6e03e833c057e2181e4597cb68 Pubkey = 43409095d4f50f5eddbd5cd4d2012298cb41a40e99492d5a2db08be5377ea183 Msg = 308d84c7a5f786e563e5c1ea57aab5e555c00997749d15aee35439efa645da2c3967703115c6c63ed7f94785c5478f38467b86e7626e8fffa4d51a2dc45e6df2a35cec99555eabc9f7a93e2e2b689459b4e0c92b351562c417b1997113754ea59e4a91510728ff3071a2bbd1f465a687f67dae955615031a8ad551fe738a260bbc446b48dca1d979051ab5840832e19d473b666217a9183980d6b27e3d3c76d93665ba2393e6ab1a42c3904d4025932d601a202a59a4c49fdb77f0e02868247de5afdfaa1b894208ac00d77c6bb54c6b2a73a47657e44c85137963b57521af20976248eb261482147cdf7a145c3643e29e0588bfdae6a082904853ce5a10d24970ebdfb7f59d5efdd6a5e7e0d287971c846acd54d84dd45468a4110bab6ef8d9a5b4b2426788900b7e1adfe0624344f98fe59ef8a1e6c405b344eb97bb204773744b6a2d8c6e65d17cea07de03b7f0fe49f1a55c33d5f15ce55df7c9561b251c6ac807a92553e1ce917012dccfd69e7dbd038c7eeecae98623f18fbb650e2218a0bc0fff43a75a116448bb7362f527ee6bc8e10761cccf9bcfc0d000f2127b4cc19211d095a0bdaa4e4be4519e6c8445eab9b3144a45cab9996135bf7f75a78d22275900f4ce1f0a9eac136364103062893dad4390422b77e5f5d1d94d7029c6097b35ca64a7a476fcc7 Signature = 7213dd4a79fd54dec0c548ef42e6cae015be77802bf515cd2582768f72f563ebb2da36af4aaeac56bbffc9932c2e24ec95daff00a5f7a0acab9c8bd3c23bb40c Privkey = ef6b9b51fd4f8586ca62658e042fc09a83b943033526ffc326c65eb3a5fb594b Pubkey = 1d6eece805e0887821876b7ed6ed5b0714d646fbecda38764f94c8155e61d004 Msg = a8f3f19665de2390d5cc52b064b4851273677486d8f5563bb7c95fa94db3356161ee622221f10cbb1fa195aac7231ea716d74b46b37bc85a70dba3dfaa1675217b351199e74a971028f729b7ae2b74ae8c6b3a0679c3e3296802844ad5bba343f6f9f7c4661b4a29b44f17e89e114fb220e984cd980e94c3d2bf9873e0605c92301744a3035ef046bad2666b5c63ebecf93cc140291946c0fa170340ce395092deed79841352fbfee03a927eb458f2a633ed3271652f5b0f9960cdf9015d56fdabd89ee71e259af6eb514b4c1bd4a666f5b5a35c90f35b149457af2944dd0aa8d9b542283a7e5412b775e421d2126f89bebc3ca37f73071621f1321eee52e9690486a33cd7ff9c9967fb65ee4e907b6b852211473d21e9d91a93362ac761760e8c7bbea486c3d605f9e11b86136819a7ab3f32f13ffca16817fed197ff880b4d6d9a808f7f878763a045728df72faaa963e4cb1c09cc2b2da920280c8366b7d18bf8972df16cc23448fbe6b2e6e16cbbf0745129854053189637ce115d2398433c15d6f116a205334824af282fa758494c47868ea8f4dfadc705e861aad2eb8ef3dbbed2a4569e15834a760cce0cbbc84b289e779b988346b9069c744c97ab2bf42b086d2fb0a411f5ce99f0819a3086b4fe9d96c7c9908dce28df1ddd30f3501ddaf78110734f9dcdfec3 Signature = 71d171071cd0fea1c6a9cfad1f7fd835e85ff906778bc6345a4dec4313ecc2bff755a717ebd912a5e02840ac073842f9bfcaa58913e260e3c73393d36685c70e Privkey = bad47cd4bd89849067cce1e63c3d91e9b787aea8584edb07f3451ef67e7bd79b Pubkey = ab0ce9ba1d29bdfb85a0e66b76b5e2e05ff732569e4375ccd75098e9e71d17bf Msg = b5a61e19e4863e0bb5f3fab6c4970d878596895521fa1e7f678cafa2de53322fd458a98aa6e35805429f651291b95bd9950e155f3ada0b609159a4abda5990c04bc2e764422fb49ef42f12529ff6f6a82029ff0185662e658f83c546eed09f06b5a68e857cdad0eb9ec4eecbfd88f34bc80990f8644a9bfdde1d9f3a90d557a8b828d5ce06a64e3b238582bb4cbeba30edc49e8122c55e95badcf502cc567869c09e9f46c6ff3f6878986b1de00b72a1858046fcd3a6e9cdaf5b073c56f2025063a2d178bd4c1e8cbc1e6e671aa97fb2cb4cc8a62c20be41c776372c8e7be63b482e6c63fa85d7cffbc1b2820bae1fc128343a1e20fcf1bc3502eee81358cc9a74c72af63530f96a25a604648ff570df1eb89d1fddbab28679ba2e9b41977e9a9c1caecdbfc361a1dd055ec51620a9bbdbbaf718c9cc136d2007710399536d13332485ec38879785e0c9ce9915a80251373990a59bce440326031ab1b458bfa5b8a4793da4ee11ab7af20de2a118c9ae521a417b68207fc885e109d8463e9f022787cc730db0b1faaed257bed901710885b74e994f54f6f2aeb64f0f60b59efbf2e3bb6515424603a113c0b8a31ba3c1e9a9b8118c87ec6949b75f49627ea7b1328889391104d4f4a3892cf00f26a73cda2a40f9b7157afc40667f4a04f647dbf93906b84c9a35164e1bc902 Signature = e5724a1dd463a97d1222c518c4925d322202d10f04cd078e771e0fb3951dbc1493a234460754c3aae3df93008dbbfb310c99592bede735a4aeab0323a1210d0e Privkey = caba8e0533113a4be173408ba83c0db74260802f9186c391402655acde6015cb Pubkey = 2d7bef6164c279fa1028a9788e3e8ee8ac15edcf92a5855062952310b4684547 Msg = 2413a32bca5ce6e230e565eb858493d5d04e6d2e2a7ab1f89a3b423311676bfa93c67daafd1cfc7109e040bac52cbfe07c28280bb6acf6e3a31073dab2965378dd77f61fe9247135c1a631b79ad668c9ea1cd4112d8d3a064cc21df32aeac7dd718b091fb6915b8bc063bb5815c376e01476312a2e5433417a7a9315d65999b02ff464a474a597e53988773670eca46a6e26cf96e9488e9e6344bc783ddfb535e76bb3b9a603ff4c59c7dbe2d8b6198d5b24490b4ea96c95959ffbf3d8218e760daf20e01e2f36c84bb097115abddee92bed82d16b15a9e192e9893ac638461df507207b0cf595884d8a99fb9c7045f9bff7b73f00ca3fd595a5cec292adb458bd9463be1204d01678d2f4389b8720115fa597c402b4ff694b71ce4f3d330d5e2f3c3ad6d96a9b3439230fc53a44794cda595557c406ca1589bc7be81e2d79636033253fa7bdd600c67fc55936bd96ce0428c3eb97bad1de0a5fbb9b675157de5f18bc62a7c22c9483e2802e679b5b8f89db0fc37f7c7150ad5ac8722ceb999b2435e6997217092336ef1c8a2292dab9a46ff8a9e10d3355765cac9d6598770f4f01ea639125fd031609dd1a507d96280c7d01a3ee987e9b210ec8744cd48c74f8afee961e8ef221f826a1fe6e7df0cb15ad7c7ef4a91f9d0f4c2e1bdea635d275fac8c4bc0601f490dbdbc734 Signature = ec35ec32c8a4008827e178492b3b8bee22a4954fc6b25f4f225dd7ed23698900de8156756a8edc35c51d10f82b830a2a659676eac911f960244766e0c3c60705 Privkey = 9bf3fbc7308b46f6036bade0c3ca199fac662b07f103bf75181d52ba6a58be05 Pubkey = 2f6ac6fc33bc060c1dc3cb9d1a2b9115845addb16c4b84be37ed33adb3b3d3a8 Msg = d65e36a6a38195ecb91de3c848b51f639245fa2baba8a6f85947159dec0ed3fae80c5a0f8c66ff24793c89c0c687543bc633547a1f37f730d97012ebbdc7ac339c4890c0856bbfe2ba29b25a7aa6b089c033fecb76db62dd3c00f6421b9e76dd0ea366eb2d4a052ee6cc736e3819191d5ad7a66d2be042cc6539e5f35652b155a727f3888d93f93a9102598f7538a9ab7c777eec79426a6075d6f38d64c485520f6413ff4d358a8a9cbdab01adf4db02adaea26494d1f5d617637f277f8b0e6e7e61e2eeccdd337de2baf0ca264c14c8cb8368000b9c714385f413737d6816e212cae2aecfffc32fd16d46c3ecee6ab074c0d768bdfe99b86cbbc8df9c47cd586d465871268d4a9d1c877236ab78f8859c114e251cabc4be0f8bc25d148c5f543e290745d11803e49f5b53193fe39969c039b3f249b32f2b8598b6acf4ed64d5752bb772ff4ee00ce0f85ecbb4cfc4ce07daf2809868c2903b781e12a274105f06181029e47f2bfb21f49480aa1e444715c0b9ff07ead88975d93585d2ff424832a9783d94906a60f877ae1c85ff15317badca1e61317433c7ce96279b678ec9d174dd0870080b234154f626a53462cfd547842eab8705605b8ee885729ee78d1833aa43f55ac22731989fdeda7dc5fa9c01985f2661e6c7326d346e6db27e6f921fae7c93a2170e10dd0c460bdc Signature = 0c3136e01f9bcd99e10d3d124b0cdb0772bec18a864be81bd1daa44d818c3d470dfaa8ab6e9a761cf03f93ef9cc78291096ed6d10c08fa2fba3bac04dde20f0c Privkey = 64e89304a335e903cb36c0bdf1a6412ef368468006b73d3d2d61cb030cc5f8d1 Pubkey = a180ef3a661c3c479d5f69807c902748e35e7f725121e37a5d91b8bec88d83a6 Msg = 2f51074d981bdafafb02a40fe826c45f3171c1b3184d8c260b82b8411fc625cb02ccfe755dc29dc7895bf759e61b2450da1a656a38d4f70d2ee748c518c6420306e5f01ec7a0ffe0e9dceb93f6c077b12662881584f98ce6ab945f87fc6d123c45d6cdfd8237a1ce3635b623a79d020df44c74b89ac14a321fbf33a8c0a2559fea1c2b156076b813908f842ebe4c2b949089e52b1ae40dc6e4b2abbc439a0bf72369679aab6f4c00018be147f7c0a67b9679ee88a53819c49f7b675e30a8b5af39661ee8db21010411294968f88e5d604d0d88d76a7e4864fad3a56f5f624ba1b34ea9cb720850aad3bd4f0a882a7d25fbec2bb7ca86da616da96c1562c6d6a1abcc641e1b58b2c178e1c3bc8a3b36ec9e144dd2e75b0bc8c08ccb0d6e3427b0322b3d6ab93f3f60b9cc5b61dad02385a14949f9b87a8e3af1e0e0fab7a9a928c753fc6110444af7ccaf8027ed641b9ed87fa5d8e1f76cae465d57a70dad9ebfdd3ce7576ac4de89d98f42e282ad87ad6a5042577cbbbc4d951e2a8676fedc8cb1b1bdf76c3a38846385a85aa24706c20a8b38465fe2ae0e41f78e614b8e9642fe2471a9015747db976e0c7848c23ff3f417cb05a8d5ef40130adf855c998a62104d7e2fb7c0f9aa2a496075623ced2c0f7eec10147ff9608a8a042ef98117459b93837fd1b8d5ef03978eada74cac Signature = 92eb4454814001ecfc18025d6421f64645a5bcbb5cb8fd85c14d772617c503e8be7d3bcf117f5e6801d1c3b96f9090a66ddc67f8cf8ff0f1c125b16b15e2ce07 Privkey = 6f634387ca2c0cb167a740d6afd89e2a28f5307184e81cba3c037046a5ede23c Pubkey = 011f2a9a111c38f3490cad1685be78eceedc6fac4a3221301c69c84b1ec7b3a7 Msg = 865c20a94ac3f2e3bd5cb85bec9d33726671fe01f9c537017d59c8d5106e43360bf76fc06186705980c8a87ba3633a4a170426ecc0defb6db2670f5f592533774cda50052ae597d48deacc2637063bfd519f2e79bac81775beccb1ab2f5b39712e2e829469b75a2d2dbd08aa6d24723404b25eb948a4834c55246c8079a82ec64354e8c2388f8c5a616b3cdc371e6263fabc9f6099219e861585fe82a67d610dd1eb5c81c96b5cb354a689fd8aac8db76c433f0cb0b31cf1d855b6a30a3d2a212e9b4f7d7afe619951f98d2f1ba2c101085ba81f49b36037cd6457a7eaa8f4f3bedf68d09fc9fa25a9d754db65360285412d1a6da53788905fcf4efa8a80cd86ca48b845633d8c31c2ae06f16c4c6bbbe9cd1afb59e101be50e03535dd8a65e45bba46d45cb14badfc8e93ab5267f4e492ab1f9a95e61fcab81cbf2bd867a3ec7b4baa189a0f08567075596129dcf9ff1c502d3279e8aa6ce56eaf134582a9e430a5aa8ca10c3da8bc793d0256ad19aea7149f0ea7ea95facfac1c5cfd29d7a3fe1a417975739e14da8edc819900472ca8c69716328e8a299f974edff741aabc1c074a761b3ec8761dda2e7eed7af33ef00409849d415497c5ed5dfaa2259a31d076398170b2d9d210208b4a4c7db8c626d1c533562a1f95489f9819e4985fc4e1d1a707be5e82b005481d86377f424e Signature = fd17c618cdbb5d459ea2aca886f0512c623251284aae3a83eb5d7f60da1d9b2ba083c455a5e2583a3cba736e7b961ba19c1cc8dd90745da82a15dfc662e8e10d Privkey = 4b2e1ae60fa5d383baba54edc168b9b05e0d05ee9c181321dbfddd1983959154 Pubkey = 36c020b18552345619ef8837eb8d5494840e85f46809343b4d6f406125da557d Msg = fab98b2bbf86aeb05086812a4b0049a1042abb76df9cd2908755706303efedb1ad21e8bc8d7562349e1e98ce0d752f4b3d99e677368bd08c78fe7425ec3b560e383bd42af6499886c35add80a5828b61d6644d7dc443ba2c06f9bad2eccb983d24458f6ada1b10bb5b77172c5cdd56d273d1e41010b25cf48a7d58d7255702ac12f2a6fe2918466395f460d15236d035ae9410ca86c4605128299faaf09015f1adee7768ee1a8f8ca06d10dd7f95c46fa10253065f9d6f90295908809fd779571be29e0ae66e0bcbdeb7913d2bbb76ac302f3452c55ef199a48eceb0e3596c7b4c0386dae7101ea244a33c4cdc830672df83655b35338052307b94d223cab1af69e07f78e58cbb0cb3c5351e3a6b0c4a927f7562c598d2d3df90569f61db1a3cb0140b56ea02cf7745fbeec2028673d67f1ec5f7daf9715f754a9d8ed46a7a63ef722ee0d5899331b63c974fa880429435767f96254ef46c9968f3fedaafeaf3e8f45634b54f5e0a5fc2d2373ab9e98d9acfe3697e642a18e0dfd9fbc2f094866d401f0a4ca2a456edf6a1a77b9c296c3922067eb3d5a5ca0a77f430e4c8611d8f05a1baac1635ef7ba83dfc69d301949856be4d2c8ab61de29cf39250c5794cbf5750cda95d0468afa2b7f23dba4ef5f5295a3bf4140018b7ed061884444f5bb1b7d239312dd739999536c684456ea06b Signature = 2220119e83d69a6a3eed95fa166d1d1128a3f232ca1b78bc94b4d476c4779443614b8772aa2232cb0720a055eb71d8407f3ab19baa1d962c052c84c0bd589608 Privkey = b216cebf878024c20dfc86ce4b37bdc47aa28f29203b5b44925065d993a259fe Pubkey = c36edbb6254a913f08fe259e238780638f72ec0b3007264bcc60a9e81ee9298f Msg = 9c8717cc86fe02480bfd9e922bd76bffee2170c4cb1b13df834ac01d45006086297f1b8a26f2ba674d33e1d162f19367feba97352b7df2e75b309d4b6f8b07cc0eb6777e81e268e02d07f2a08f8f39d5a8320bfc01fc8c9227d2cf05e12891ff4de885a1c93371a0910ba53392aff9ba2eed9a2055977ec4157bd65b34df79372f4d50edbc48924353cfa1692319d88a7a5bb726254c209291e9b1d2c1a6c8236398109c59ed42a0ac9e7633c520734eccfea4fea95a47a8f0a068b4275000439cc97c57871e105cc0790e9dcc9c25d5af7063ffd05c4f3780e7bca4c456d0170da709fc6cb3faa72bdcf562908ae9340aef4d0c8b91f0fbccbcf1cd898b1c716f4f1474c3aa316242abdf6368e57a247ff2fd5ce23d187f694f11e38dfbfbc3d9db20903b4ebb449b9049ee020f6e2f508e8b2b165bad7464dbdd178cbd423233765d371e7ae1c3e878cdb5b824b20cb309867c0e473c067e6744008527b6bc076d077f4867622aeed1c253dbde7c6a76c7015962fb73391698600bb318ffa7b0136ee4ccb07daaf01f40ff9c194f98681f9faef8b6f9e99f95df0080da8966a8ba7a9474c537b92df9799e2fd16f788dad7a7bcc745226e1e6371f52ebcdbd144044ddfe632dfc0a43d3a450923170ebc7ae219e50e078a511bc12ef14cd14b5309f38abd65db2b2a7af2243b229c9fd2e Signature = b7389ee78dd9763f9d2892912edcbe3e8a236b8bdc25f44b9cfdc8c47cd58168ab56eb0402a5bd752ac8f4978d2ea2b65d2fa85265966b9f57227ef4a59ae009 Privkey = afcecea92439e44a43ed61b673043dcbc4e360f2f30cd07896cda20cb988d4e3 Pubkey = d231f69235a2e3a1dd5f6c2a9aaf20c03454b9a29f4e3a29ab94689d0d723e50 Msg = 0b05f89ebb3397947687afbef0ede87cf3810676277037521d952a3bbbbdc8565988a095d8d4f6f59be572d3d821dd789977ef77a2fd7110ceeed9f3756ed8e188267b97a30ef8957c78aea3a2963deca61860545e0c40824881ebb1db10f607e10ddbddce400ea236ba4745aa99a05641976766789ed0da7db55fdab459ebd4b441a6282f7cfd5a20ea06effa335955e5fd29181671bc92c00052f7f75c39277c9a43b787ac9fb1516e996232a509774d1dc21d8c0513f7844b0a5b5f18957581f99044a14223ccda8a284de12fd424265fe57b270215f8fa9ff2bea517934e4800a47d346fb6c361cfbabeffabd9c4164f45156e245c977edb473642c3940be5ad6fd1a7119a7b18e98d6dc843e0d254c93d0146d18e5c62ede1490f89a605eb454f974778cfae20932e95477bd03bcdb97d5bcb76335942e92ee668f231e69c570ac5446d0f774066737fdf49f10ceb1b52d6d8a4639846a3373a7c6f3b4b3159fe2e7af7eee2f0df172d94d255d017651da3009005e5eac3176c09389ee40d70383bd37117eca083598a1801f592d057186e568e247c252be4b14f723ab7ddb97ae9768c2682fd63acc300779fe04e2b88874751346c9e0f97a2a216772ff9625c33bd7e29fed8003a08dbd33b5d17899c943c25e95ad754fb632e047c112af7f7ceba72362e1a3ddd2935aaf7f818a27c Signature = a65545cf3df456b28d83a6d94c036a19d0d29fb065edc27e5e93a1f40279897e1c6f25959a725ababc87cf2ae727f3467b79570e902711917191d9cb0d2d660c Privkey = b834c6e0facbff580dd3b23753959a4c2154c219521b3d27035d071f6599bd02 Pubkey = d1c384715e3b3d02c13e090605534c7db740da2aa560f53200a3ced8beae8cf8 Msg = 6cf147b1605528a36be75716a14b420bcf067c03f1cfe9c4402f14987fbfc9d3ecc3ccf4f8d2d03a55900b8dc79af3b6e77436f69b1417ad4b68fd44e5e333ed90ea7943fbd1122609ec8ff6bb25e42e9914f5920fc72c4d013b6a9685c996fbd8352aafb184c22d9e47871a5280e4ab7dd6a5cfd10a5994a200f670e0b622a9394d4793d0a420e7d8806cb127c7ac690d45a2e94166cea672bcd982b0e9baad56312d2570ddde7e0b9e7f47136f0481d00f66a2aaca4d1b09d7ce6c5a98a76b68cd97d5793968d667073f8217f9054735340f9b149c0dce845b099e88d0709680f0f77603ff0a2331c558fc36d5f24da9a62d69af5190d21b5c857a1e08f014c6d456468665a7f845c66f9111f9c098c68940efcd87b657070cb9164bc9743aceb7439a0d01c0062a11af2e11349397f5d152872b13c5ab32f51cc58f1475ec82ac671561dcbd343cfb3c5f78d0fc73053c6004b0a4ca3f2043ff4b0c54275c4fcb9cadc6baabe57b1d5acd531e972ef9335136cd1d65512ba1f5b6ccc4b66b4250aafa2967dd4211a2742e0f177d8f4063899f61815cbe6d8fbfcdf74812bd40cc10084e46a99ac128058eaf16a49a24b6ae228ecf0109c52dfc06e37d6a333bcb24aba312164c6c0290485d251280538ce9541c0916640e36d6929dcd9588eb99577f5f6d82bcbb198826267e49f5daff2c0d Signature = 0f19b7066d5792328a9800d9d4f8f67d5b089b541226a167dacd439fa485b0025a5dc7f2c7e23fc4a5c6869e7619d356399700c93650e89cd25b90fb9925e304 Privkey = 2269a5d8f7ac2cd9048f5f49e349e5c435a159b319fe3b30bfac8d0d505943f4 Pubkey = 1c817943dc39c24b01da38a487b175482460c609e4726349a9aa7aea9bc0fb34 Msg = 7153d4d9e641aa61920db0ff4bd537a6d6130a396554cc94537698f9cad16b99eebefa5f2776f2feaff6bd9a6904120c67e0883f6b96bbbb195e95aec753b699bab3d03944c13c72fc84e3f2cbf6296f645549111c93fae1a759bfcd16fc09e60bb9785535ad27da244ef2f857f2de99a6e92188890e452c7f5b9e3a4b968e11743b6fc7faf1275e5360a5468941797894d770fa7da364a337302239fe83ae0b0d084aa12acdc63462524e0eb10fefe81ba96f71f275f3449a3f8db21d58749a38853d39b0ad8e69891bd204dfca8f6c239dc9a0ac27f54db4238d4706df11d607369dc7f704da1d39f2e82af8c283d220c12431f56d803069b4acb77081c031ae3319fc77fca7845097fd727ad0d080895bba23e873d2def8cdc216c3eed61b08761bb9ebce0282cf502aaf6ce7e8c058637958c3ea1b72fe6e8df8d37ac055db6992587fabbdc467f52475644f918863af620492f34680f2056cbcab75e2323626c094759c0e0e99ef19759527250646ad760120ba386699d53934f956b8bbc7395bb496ceb2dd223c7b501b92d36a95f8f0a02eb5ba4dddf166b9b95b4a59e72a30c63cf21e6085751923d54b30281e52a09618e6f023ba0a21675e7f989b8991588c96c2b56a78f5d2945a7baeb6a0c1bbd5d95af3ee830f5809c794a15ab4b5f89dd2be2dfdcd8fe0520fda2b3f02a1ac0155 Signature = be0fb3308a076a61a4a92a97f6ac55327190e1341d6dd410d86b41bdaf2d3374093ef720bdb77feb7014e0f77d3b809623c7ca53e2ae4b097113e96db77a2d08 Privkey = e965b3f257356685c98b42b964a253fc495399cc94b099c2445fc81c759c68e5 Pubkey = 689f5410c8e0f4d37bc07c85d7cce6c9b63601f9bdafecaa448a5eed64afc8c6 Msg = 6f20a9ad27e30dac76b30d4c19a5bd6dfd6d049213f4becdd963d72b8b2dad687b003808201d50f7dd6e599ef58ceb6068c545ed99b9e763f9b0ec1db5fcbd7d490a121ecec6bba1eb5edbd6de85364707c55e300c8b16bb2530f70898136689c988591d5391d9cc347d7931061a9b7696e2c9f35bc0d304a81c2cf954d9c3a88a22e1d67bbe0a85308477f62918c25db504e4762f0e3b4246007908ac701779006b77d72510edc69e17d0f6394c77e5551875a446f81233415d0a91a0460b51c413d644e850f8557281c46699e53b22a7c73b068ea38652cff3b0a7b8ba30971eab18fdbbd8739ee1ee0cd5cbfb7d5d41757b6331271fb7809751e203513c9970f66d91bc0ce062f4fcb28be0a699867b79594c6458a0d307acac91f413c4615877dc53e1b018da5cfce1b63f40be1e55274c4374cdfc21524499a683a231adef779d1921440e5d3fdbd5033dc983cfc931abe638c35d5a95869e9fe3d93eb90bd1861f855ce1f608b7bcad6b5e1bd97edc95ed5ddcbcb715d919f5ff77df2da438f7a3a98286dbd5b6e043fc7372f69704f09d865530f4f0edd3300f185b6d73d8716d32d32b1c9ac2ddf4f902d3f216d35a33f368095ded10be94bb53d6f256560fac2f4af0edf5c5c702143777126e7de32d07493932662129ba0e7fc7cfb36fd2ca531646e8cd2211854fc510af3b1e8cafde7a Signature = 8d2bc4e1cd256aad8a151dec010dc93a5e5cca58298dec49cbc9c4717b5cfb5460d430be726b0f302cbd926beea19aa3c93aeb452a44f6007af49adf2f05bb04 Privkey = bc3b1e0bf8d69ea5b4cbbf10bb33fc955adcbe13fc20af8a10872ce9df39d6bd Pubkey = accd2628155919bbc7f9d86f91dafec35c711a78c79ad360eddb88fa8a180b2d Msg = 4c73e04abe0819de1f84d70541eb1bb61c4f42920e1f2d1d9e6281a8a2e8b3eb45537d83969027f99ef0ea27ca085b13f9db480f00c02f3fd7429dd567708953bbf3b9e8e2c6ac4d321ff8f9e4a3154723085a54e9c9573cc7350c09f8973f948b08730373597a5fd0349821ae0a3cd6c84992b189128f3490987e1e9ad4f6574ca538fdfd83284c1eb0953f24c08f74932d4364dbbef922542440dae80424a92eaef27c1889bd08c44f9df03a3af30dffb48fae445e625f4d9265cf387a1da35fe4c231504535db72ea81a186805f856ebe6a6a65241432530fe6c960c5f9be6c22957060304e9dd8efbc1e482e7ddbd8af03bf2382899c986d916611e4f27ae52f817ef01b6a141fe4f685d94dc8cd52830043934587704c1e642e8fe56be6d6b85bf4a6feb2b6858f1f007f99d39ea04c9fe5fa7ef1b91f495ed0e7fa4213dd68cea42b6729f95031907e27c44098094386fabfb04ab9b4de3d6861de462312c59b27c76f7b6a4fc71ea0d5daf6b7320521a67e5cb37504976ad73dae2d649feb75e2eadd3401a7f2f36e16dfbfbdb2af5716cba1bce20cd47ce1c1d7be00697001fbbeb4915aa6e5393b5ab20e0f31f5119149a2cb4c4d452c8156113ac7824f84f09aeb81202e8dd3dac0aa89399b5a38b1e218301960a37d52632eeaefe3687455464288eb17d9e19a3a72ed9de32c17be79a3b9 Signature = 6ef7f0e91f2cc6715f8e5a98574b4400c261a643e0545ff26747f8e1739899d76640b6451c43c1d03a4775b54fcf9bce18ed3fccad338b7764024fdfa2de8201 Privkey = 10718fa6e2d7f6ed38fd66cb6dbfa087e8f1e8a8a24fab58d79d7954b8720c3e Pubkey = 870d4f666d06fda9f9511b58602eec050d754ea6d8e79cdd19f601c477df1aa0 Msg = 41259b6eef13d6ffe33cdde799b995c40be782cf978440b66be51c440582abd42f526696bb3cb92265b1ed0e4bba764cae2839830a252635dc80ce5f73d521b3d6ff03ac30e198ad20567e75a34fa825ebf9841508da84cd674236ca7b43de3564c94ab079408fd94137ce3f90a5dd5d3ac39a05ec86715a8f025e4539a7640ab88836f4efbabd5e1652c49ea21613acfe343a880ee5a42f2f9134ef4e3716b16d134a9c4c71c39b3c1a857d3c89439783eef1edd71bf4492d05fd18673a5242ff4187b9de47ad4968da49dba5a6092e95ea27ddfc7448dcf5972d9d228d63e5291ba6e6fbd07e3241f9366ca4976bb04b22d01f0dbae794fa9c1d9029f88a83602b0e0ec55e22c37b201125cadb5341ef73f6da1abbe2b1c475f0750345b1be4259d8c28531ffe7788667c410dac339918c869b00ab80f20bf7990d366f9b3d5e8eb2f48d7ed0e64b85dc9fe3bb998b1eecd1231e902d2d152e09da2d2592bdb32c8cd2e2c489496b2980c03dbb09ec7f8a4ea2c7020f2a0faa657cd6ced48d6da27864cf5e97eea9b3c2f0f34abf8d87bd2adeb60c7272fc4306d955bdc8023d7d3dc2f3dafe9ebe8a8d138965a7f6ce93517cd2099663f67c34552176ddb595ac6ea5609febcf24c7d69d412709e578670a21ac8afccb8bf2b18ff3af7de21dc71d50d60d37b6ed729db04beff7d34b2920d87551ce15 Signature = e1659186f1f76fe43ac8a11703360fbeff53b5e57b5974aaa08e2575579c27084cf6802e7c206347314475b603197494e7d61fe4b1ee7b78e18d94469352df0c Privkey = c1d4724c6cb1bc6723b2b43034278b3c5b48fed7f8a3cc2318033e7552047351 Pubkey = c27e392e7c3664b9061ea76d2575dd7c41eaf1da3a65f3a986e0a57f6c40c17e Msg = deee99d7a77d4300c17aec1ab323c571c6e9e73a43491a3c7888b76fc03ec43d07af42a05a2aa322d00c8560acef314106b10b9bd12654357ffa26f2390050da63d668c9e2df548f87639e096a35853f82e761fd711d2a265438f5d4db5e32775708150da6cb686a2b4ca211d7f00dc0abcb2ca150e791116a10a5efcff3514dab8ed80a7092c3a015152cb25d9f86ec0d1ca67ddab44d64eeb1f931bfab2ab188956c743db4814808c5cde1b0745b3edd340eb03ffcc80a78f3db310f4f5c20009fc0279c2c1bcb3cedf990bd0e20c6f9fb7515ad6e933b07e99da6ac32b97141187ef63bdb1062e37220a4dcd419d6244cdcc34ea41d0bcbc3138b1d54aefc0190e30b187db073aa7d6cfe04bd3fd2ac00313e3ddd64a181935ca4b8b2a85d36bc27d97b7626767b93ee38def8b6b2c8da9b00263614342faa9d3e738d2713c45ffbeef8c84bcdbc8da4309c8445530f5c617dc866251f548950a14f075aa3117f96e41f899dbe7340b1d90a1352d3b8fb41b79f16a82bc2e4a193b8a7232400996b73b1fc00b2ec1c667577f82824d39fb7f6e7692dcd97b1d8ce94083ca197e9a5d40fadff0b9ac57e9de761c156e6d31d52c332d513e9f58697dcbdd80a5e42c551702c3de7beccc3db845b1a04c8cbd41695ea7428abba89e0dce3e3d9e70230ae9147c2b88559dc695d6809a51ccbc1dd9e089c585f Signature = d37a6ec82ed45ca9b4855de9cb942564e883ff70a79b8e712d5f604ec8974de5363ac849cbab28e7aeeff28ed3f2d14b608b3146c2efe0735ad815c7d75a1a01 Privkey = 37c070d4a53b13be760635110d1bd4f01920225afabec576faaec910f2926d1a Pubkey = 0aa85f2ab1dff895d1fad0c119f2bf57126aab601c528d37698e97702d35f525 Msg = 10c646447f81ad94d015d86d0d98b2452dca60a47ab35264035e33a0942b954e3e23b91d8123b8593c6af7c8d3ecd290e0e5ee36fd4e53b7be633a6cf027a5ac3f0f679eb1bdd210a38ea6e48b0558e303010af474e7f6df2a4e457699fc38e36938b05ffcaa1b694e32f3d1b2cc5d00cf256f12184c873e519089ec1df15b0dc76e7bfe90780df58136fe597fce894ca563e08efa0f2d4d208bede9a874882873d251baf019fe46d1d6504b3bcd243b795351f34d2e7606aa975528ee50d59efb6ee6992a89b2426956c2ca4247e0df0129852983e9767a8eed1bc7335ffca8d0289f04807f67ca7da971f58db8b9bc9fdbe4f83cfe9a00f1ca584798bc71d851ff7cd6c51b8990aaba4d38b416b92240dfb70ee3c12b5e731057762ef90823fbf683ca06d05c20d3ae2b97a83ebe70ae17afff9d16609d546d8d3c74bc281884894f3d49e083f10ae7c11c1dca0effefcfa6e0f1535081fac3a2819fd2e3265527182ae9d391b232bb7542e68455cd267760db652d19e22fb2ed11cd1305ba8d98c1ebf2d1969b24d64f3e319af74e092006d2a3ff744872a20ebf18d17748ab7110805096ea136bce2f968b205e650b803c531d06775ae5ceea28bb92e9a0edec8951ce2009a88ee1b64d9b9e89f69051203384210a102a44d2d6703173b68507dceadd3bf6510df2a5cefd9c80e4f385b2f9e6215813ed32 Signature = 9da60cc4a64d07dee1346bd3d3010995ce2738208ab35b34c2a8fd1787ae3a1e207fe784525154fae4f5794cd8503045fea85cf77fd92f6a70cd0c5a52c0810e Privkey = 1126496a582ce58d3d618dd8a3933547aa7a8a30fb54063b8dfdd31671c6c73d Pubkey = e10229c623fa8ad8982c3e4c36ff52df0f219b57915b6e980e5fe72ea0962e22 Msg = 6a4b52d730ddab829b2a179590cbd4c372498e9f439977c0a10dc13c0ae1736eaaff063371434fd0da80360ec5890607d2fae1c9a2e1ab0b7f3d667f5b1b9c418f18b10c9e6fd669d3ebec168efef44163e577a2ebd0f2cb768f80c23188e86069e4d10f410306cedd7a341a61e0f4f3bc25041bc2f922ed073e1e2f1b709c579d10630f33071754d707894a1c62190de18882c564dc4c01dc545dd8966404ed78fa3267a9469f63b6120abb65f9b3ba3eee28d79c2eb4e7020cc6987dfc5c29672f8c0fa3e690d584fe000c64f352610179621bfd5ff3eb30d18f1a0250416db93b1c1e93cf8a3646517560d1cc8fff822b51ef27b200e987b592390753453ef138bd3d29db7cb1b5f45e4795b89c53f49704192752237c6ab274849f9594ee9777f6efe70483129d067f97199d9ae36090703864f7ca4750a6f3b6ff83824c910484394d1e2eceba18446fe4e994ce07433a740ddd05f0e396d482894e6f14acf7b97bae6c7eb88703039fa785d60a3af78b13243a4f88dde1d998617f2e3fa7eafc2f435dd4ac1ea9c238407aa09b4eea8ed434927b406674ac270458cfb3bf29c347f94559613179b9502192321b88e9af0a90e9a4ab9eddaae382e3734d1415ebe32499c34e6fdeaf15b0d9787985e08dfe495460c54f6743d81ff16881e5e30c51f4b092373783f12423c3e1ae8591130a269980caa1cb5c Signature = b30eb56ca9b120bf849a3a9d56af033de8a590c9e1240c1e36dbc6cf0a71b78a11ec143fb9959a8f25b57711d6a90a67e01be3a4da2b69394869bb8d64b87e0f Privkey = 9c167aff3b1b788f133d422de8ca9a64316409f9e35bfe22032ec417ae9abc6d Pubkey = efb534f0d47c068e77b28a906d95ad8d213a4d4fc1c70542f01e596d57b5f019 Msg = 68ac0fc2b607ba38e377fae845c808c8f9fa614eb1f31158a9620a937d3e301e85acaa69144bc349a39dfb582041c4a197ae99b4d4d59b7a2ca3d16228b5591cbf57c18a781efd19193c47b16c6023a3a8ba3d668f05a37f1e83b0d7febdd10f63e48ef7a20e015b1c6725d4c300a986c60e3a115469c8e52ba05b51c05d0af40d89fd9ed76f36950aee3c7819898a903cfe0361a91c69100b495141e86ee79d63d17403fb1a1629ef63cb7e9d2720cbfff0002b190bcdc26794124dd38d42bcaa7175405eb0bbcf8e37d65d05a37195b479371fa2bbbb167d91cee88235dd72ea88fc73ce3ce43d33b715f25f192ec215dac124899c5e7586e86340d8cbe53735defbe02e4cc9fde69fb9794d1db72b98c0f19766ee5138bbfa78909aa299b4913c499deaf54b4841d5044829984936700dcf92f36542b2fc7e86441b9925f5d0b78c17a85cfcfcb20b0fd751349c27463abde4d27df74265288713f96dea013b945521808b4996b1b2dc0338b6d236efd6d2b27dafda46ec5fa32b965e8bb5e8bb61bd966edeb774681e0ea8c17b8c99fa7d660f0f66c9bc6d95cbd7dc094724098eb05191b53a3df6566b9c90e0d7dff2943848b61a20d48c22b6d3c958e293d709c8f48110230ff51918562877daf6d920c85a82e07c451fe7ae9759c0a77e97bb298b5d0592a41d08f67a4ed5a1bb41e937b6a68aeb38fd5be9 Signature = c9ae67fd6415dcbab292fab394ca6c3b7d90ca244dc6a7764e74fd202bf4b2905bd2030e6beb914c3c238db371b1cba6d9261aa392ec871a4b8b12fe9c1c970e Privkey = e9948805eb341b2867479c668fd3532c309941c0ad4cb2e54231756e6a1bdecb Pubkey = 5447a8e34d6a640002d8d60bcf1ddc711e4c465c94c34b50bdef358960ff81f1 Msg = 91cffd7eb1cf6bd4756bce6a30af9dfba26ddd1cce0394c194a3e39cc3d1cbc221b7eb70bea18d29c267457176a3c9e53c18e47d10a67c464505197702e6b2470d38869db5174b158f9992e4435d02246f540258dedd3ce33df582555a681fb76ecaccb1c2989b177e3b7e454aaa529de59bf5a03123d571df2e7f7cb830805c58b74a653bac0e5a888e08dc2236d6cd496aa06d0d67cf3b335e218c49dedad82fc1be9ef20cac61905c30eb132d739b16ca8a8c906619c0e0d8b33985327e36f3d4b8fda387c186cc50443104db761f7ff9301270204a713e58902101fad000ce931647c577fdec148dca95cdc08918ebed037c60332fadf088f036083ebc92e173b7ddcc30c493f27e69cd17a20d30b78f83a72e4f5a747d86d96c5e1bb7a438166204013e2164d6aabc0d562f54015c365c80445607145e5692ee34f6353077fab7452d88ce3eb01d2b3797dc91b341a3a726301516baae18e851f74dfbdf0866bb2376867de55231e362c472c52116544cd4f81e93571c4ec820e7e653f4e21be0a942576c9de91e7d1251683d859de448f822dcf3d2cf55ede2f9c71b6063d1373061f8f5936b698d1384e65459ea2bc26ec96775ef425207432dda0ac1fe28526c5e4559349c3d8df9918230f4044683cc2c1b858d141ab8d0805bb9336067522aa89c810f3eaa7ac2d8dd28c3751225a19ecec8bcca52439946 Signature = d3dc62d6ce9c766f2abaf9a7fbe09d6bdb07a4747b56080db09beb4a4e804a70d7ddf4119475c7be834f31956f4a71dad029cdf2363dd0365ce22dc27f078003 Privkey = b01753efa73bb3de7aa778be7afcbff66a5d3e2c2f8b5aa2b048844050996965 Pubkey = d0cc6cf109c999fbf6d16f471fafd0232b0a68d4c46406ec7545dbaba8194158 Msg = 684e612f27eead0d34844cc81ba911c28aaf6d66e71229e8cc3462f7c7a050daa30cb74471150f07dad459b5a91358476c0598255d8a642dd7c0802811bd88e4cac597efe41ebd96cd0f3b5ce72db4be1a3dbd6b84f5446e3da600d3b1d2b460a009bd31cacd98a91518ce33e9a703d404288736ccc43103fc69e67974f31652fa3dadef3337f6c897a3d201303c8f03597b4a87c98f291ccd58a3f1e898332aa5993b47fcb5ddaa1c0868b643742d0e4a4b9cd427038b3b74999bc89ac3484c0ca13f25aae8e78ae1ccee6218accab81a4f694f5324a347629d49b55e4037504a9acc8df58c6841dddcd4fc4347f7b6f1fd9de0564577e6f329ed951a0a6b9124ff63e22eb36d3a8863bc1bf69cea24c605967e7d8948953f27d5c4c75f0849f872a3e3d16d422fa5a11e1b9a74df6f38b90f277d81fce8437a14d99d2bef189d7cac83ddc61377ed348b3c4fc09ec2b9005925d04a71e26d641667bdf549294331c6ea01cd5c0bd1b6a7ecfda20b0f1929582b74697cb262c3927d6b223f4b5f3043aa6eb4571a78e9da11c2b36f64552580caa7b5fa6b90f929e0162e608d1240d7242cd2f47025c03debe059b1dc94770232bc6765148480bb1d9f50da1ee6448cf9c88b19dd459932c06ed811c4a64a12d5938bd1c757bcfaeaee8933fe5fff21763de740482bcf1ba59afdc8fcf873c3d507bb394e32e45f736519 Signature = 16b7421227ae09130685cbb1a0c60aa57a5e1afe1bbe6bacea0c281bcc8998e6824a772c3208a6b6b4d236695505c9be82700cf93a783985a39e16e377a7410e Privkey = 4f4b20d899366f2f23ee628f229b236cf80f43ba183177c97ee34829546f1742 Pubkey = c94576641f4a893cdfcee7b39fc21929b86b349976d7b0a46d39a588bcfe4357 Msg = db8ef02e3033e6b96a56cab05082fb4695f4a1c916250dd75173f430a10c9468817709d37623346ae8245b42bda0da6b60462ccfdfc75a9ab994e66c9ab9fecdd8599610910affe4f10215cb280bf8f9f2700a444796dae93e06c6bea7d8b4fe1301baa79ccec769368feb2442c7de84f095e6b3bff63d388cbafb2b9809dc38e9b12ebd039c0a57f4d522e91ec8d1f2b8d23a4a0ae059af85393bb0a15f749110f6774a1fd731a6ec213e4ff435daab546d31ed9ec3b6d8cc2edacebf4facc5566556eea92e5b3f2542239b25e28012dd4ef40072eebf83ed2a255181f3a442189d68c6c609f4dfdf3db7d67d087a2fcd6d2dc50bbfed8bfbbfcb74d3c41f02a87865b13b8efcf5c3581257be0aa913f60c370527bde11a475c136a17c5eefeb03f5bff28693ed841e8ed1f7c29102f5599dd444009bcea6a92d5574152458e0caf8a36aa72b5dc4908a6461c9b741453005c8fbcc68113ae184208ee14b835480c6efafed18a76000b38e5858290f4d51f52f096cbe490e1eb5cacb226ec495a55a7fa457843d57fab67f8be7e209334785bdd665d7b63e4daf57b6e78928b603c8c0f9bc85464733b61273ef9e2b8a0cd7c3bf8ee0a6872e34d5a27a625e35eaf7ff5440b8b141af704df70c9c18623bd11209513192505105cd7bcfa5f0d919da706948fbe1f761f315846aa3b4813dd9ba3d81b9204e5409c0382b6eb Signature = 0f80ff5d17488fe26f93c543b04ed959b5f0643fc61c7f2c3bc60132ba9c6210c8b250ea5e84d07b01de68bc174414eeeb31fdc2ba6823e231e312a91ededd02 Privkey = d2e01d2578b625a7060aabc25765f168c680cef767aa97ca0e5eb3d667474b2a Pubkey = 191ac223575424aa354b255b812dd3025d70ed829e0826c01629f9df3545082b Msg = 20d5dd699b2853302a6817094d5ea512bdf8534504cb289c602467410740ec7eb8ea6442c80f145935068f9122fdf4a39f2010f33db55b814d97bf2e5872329f1126d4eb95b806ca1973113165b116be8716371f81331779dc79a5cb3942081ab5f207f6b53db0e0038107d63ca97708181982dcb5f3b93010ec6edfb2cfd31cab00090b3c38515f9781769686cb17ab81d54a8b775754d42fbad086b80b28d636f78b7eb77ed9ca35b6843a510f0ad0ac1b20267a000301b3c707a20f0214d59b5b8199c2f9ee25d32060ace3e0f2594650416a00716cd3f98604a5e104b33310fdae94c314013cdca5ba2414409eb7f1901394f007d6fa0a29dbe8ec3df98c393c8d72695877cc9baf491ef30ef7db3371608ca97cc621562520ee581d5d1cdbc78232d6c7e43937b2cc8549e6f1e08df5f2eac844fe0f822b2483ad0a5de33be64089490e77d69800fae2589ee58712ac15a3f19e6ffdbca42fe1894e889b94c04b04240dafb0b2730c236b8cceb2cb97afd1d515dc19d1067fd4aba8ce297fd6d110b35a21bd3c075c577d93fe1df77d648f7119492099b017af44eba09c807f11a4c3f4a11a2fff306a728ba78983323c92a2fd5fcc80c18d423426f823a73fe04094955284293f5f6b3ca4ff1080dbb1e4c6f74c1d935ed21e30094c7de336b82dd8200b0d659583c5bfd5470f9db342e70ec4000742c5640a214e3c2e Signature = 87a010394a9f2c904effefca9fb4d5ce13793301a4925ba51db119123a4d730abf764ce065e48d90a79d907d7254c40cc358987a46949e928bbb3cd085dfab06 Privkey = 7cd7ec99dd03aede1ff1073ec2ca7010276e947e2aa9b0e65f877e4ccf1b3a14 Pubkey = e4c39dbe9493176b8213f1422a9de7c74fb6a59190fcdbf637c7ad5ee165c04f Msg = a6034aa3c2484923e80e90e5a8e1748350b4f2c3c8319faf1a2e3295150a68e1eeca1bc84954cc89d4731a7f6512af01464fdbce5df68ee8066ad9a2fd21c0835a76559ca1c7449a933bcb15af90223d925ff61cd83eb935698347a57072709a86b4e5a7a626e07a3f2e7e341c7783a540f84aa73e917e867bb80bace6254705a9d1a1185de56e1a4e78aaf539e749b8f765bd052c4cd15b638bf8ecf87d9814606fed5a69f4dae9da47f3806dd90be64fccd3365cbe9e01c588fe65d6b603280740962aa8ddb95a3f4f674c03bc4043092c544595568270a2c2a8aa06e3f67c31998c50b9a58acad00690d3848114cb193293c8ac21016fd996f5c64214064f82167b2c920cd8a839755852ac77c3d90526dd3adb96837cf4e726f34bd02955cbac5b82c92cf4aa8b54bb6e436dae9bf893ef050c6f135a7e62fcd834dac1d2be8b8e59d696131811701c4318bb6e9b5a20bec656fd2ba192e2732f422963bed4a4fd1ec9326398dce290e0848c70ea236c04c7dbb3b67921440c98d72753f6a332eaad59fd0f57742923fb625fef070f34225ea06c2363d123666b99ac7d5e550da1e404e526b5b229cb130b84b1903e431cdb15b33770f5811d49fbd50d60a3474c0c35fc021d8681819ec794cc32a634bc46a955aa0246b4ff1124623cbafb3cb9d3b92a90fde648e414636192952a92291e5f86efddb89ca078aea7717fc7 Signature = 6f99202770964535e483a0ee01a529442eb321303fa805d475604d7fc728a9103fb7b558b955f4d03719eefaa3b7ed5b0da75710bb98787f5c2282ed66e9f60c Privkey = e3ca3713a2fd412ad5336bc356b77be027d5b70815b3ac2aecd8340ef5f889b1 Pubkey = 1d516cb8bef116a0c1b6929009933f6eb62c23050745fe7e8d3c631623778111 Msg = dd99baf295e013eed107ba8af81121aaf1835a3cca24f8e464b4cfcaa3c7bffe6f9536016d1c8cf375038c9327e8e21b004066f5eac0f76a3e8edfb07be8bd2f6bc79c3b456de82595e2c2105bb1b0aaba5eeee1adef752167d633b322ebf8f7cd5fbf59508fdbdbecf25e657a9c7050af26a80a085b0817c6217e39acd54cb9fa09540fc7bdc5226d6a276d492cc8a3dffc2abc6d0b9fb08cbccdd9432e449821a5dc98cfb3a418e539c890fe5a0446b9f81d306700927ade61cfdcc0624f13b5840748774604805731d92e77d5def66be44cc817946f1cd758196cf480f99e7117835c4c87cbd64077a562a80cf11d8ca65be7a94d92b9ddaea997e93f1448577ed6d8436b2f3144692c1fd7d28a03e9274bc9e8669d8575f5de20cfbdbcb04e9f39f3451d7048375e2698e722846cb4f2d19a810c53d4c1a6c3b770fb402df0530e7b2907223fd0899e00cb188ca80c1531b4e37fba176c17a2b8f5a3ddc7a9188d48ffc2b272c3da9c9b89dfe53f2fe7e3672f91d11818491ace140adcae98502e114f4b352b90e2e7fbd333b2459e7f15dd0764c9c34e4cb7cc095500cda035e8e2e4e3c8fd5df5f3aa579a735dd8a9f19ef336fa971114e46618734a4c13d30c81128ca21def47330103d23d80ffe67421a6ccf9f36a93f05603c599ee10b03451f36b2133c187a79ad9e6fdfbb12595ab73bb3e2e2e43030fd37e591cf55d Signature = b3857ea61baa9e62838c4e3a996502d3364fe1ec594258355073dd10e497c600befb1f8f233fd6e3b2c87f10dcb7261aaf3481bfd0902605accc900fef84d407 Privkey = 29a63dcd48a351771411fddcab46bb071e91498576e8d02f8b6044f5bdd3ed90 Pubkey = 3923fdcc2a9fe5cabf6e9932e46dbd2b7f3632500f9d95552db2b045bc41166f Msg = ff18ca0c204c8386a4aa74ec4573c7b69216b31470daedd96a4f2302116c7955d72dacc88e3714550c09e6f7b9a8586260dc7e63da4c633bae0162e116e5c1797b78d87d47ffeea3d7819df9c852f0ff30936a105d3af5531a8f89549711c14c2d3ee11564e7c8525bd58864009762a05541d8e07ad841a55a6a9a007ef209ccec4b5640babe35651b61df42de4d910ee73a933c0b74e995757e84a99eb034f41807183c90ca4ea8d84cdba478613c8e587cb5f8fb6a055081da6e90220d5d86e34e5f91e488bd12c7a1a6b3c9fce5305e85346658effa810d0e8a2a039db4a4c94965be4011f9d5e5da266233e6c4e18ed4f8a25a57e40a591c7ed590c0f8b1a119c7c9747f691b02196cd18e6945213f1d4c8c9579c6e0a2ac45924128d6d92c8e4c66065320353d48d1d5e13194d905f837078f8dac0b68cf96ae9e70554c14b2fa29b19630e4b0f5d2a767e190efbc5992c709dcc99aa0b5aaf4c49d5513e174fd604236b05b48fcfb55c9af10596927bcfad30bacc99b2e0261f97cf297c177f1929da1f68db9f99ac62ff2de3bb40b186aa7e8c5d6123980d759927a3a07aa208beeb736795ae5b849d5dae5e3573710aaa24e96d5791e2730d0270f5b0a2705ba515d14aa7e6fa6622375377f9aba64d02569a209d33de686e089ec60118e4814ffc6c0778c6427bce2b6b844cfcd5a7ced0e35303f50a0dfe5df5dde1a2f23 Signature = 12bf629593e2caadc910ec40bfe2b7a62514126b16ba3a438d88e2d21f595aaee8abfa4af2ec870361d0ea04dfc8c6a330fb2841c2d8211a64fa1e7e7d273800 Privkey = c7188fdd80f4cd31839ec958671e6dd08b21f9d7528c9159143734f94b169883 Pubkey = 019752ff829b6859b9058d00c2795e835655440675753f37e85eb7bc5839c4ca Msg = 4af5dfe3feaabe7f8fcd38308e0bd385cad3811cbdc79c944ebfe3cd675cf3afbef4542f542975c2e2a6e66e26b32ac3d7e19ef74c39fa2a61c56841c2d8212e2bd7fb49cfb25cc3609a693a6f2b9d4e22e2099f80b777d3d05f33ba7db3c5ab55766ceb1a1322af726c565516ce566329b98fc5dc4cbd93cefb627688c977af9367b5c69659e43cb7ee754711d665c0032ae22934f44c71d31178ef3d9810912874b62fa5e4020e6d5d6458183732c19e2e89685e0464e91a9b1c8d5251e24e5f91813f5019a740a04b5d91cbb8309e5161bba79dcab38239a091f50e099ff819e3a7b5205fe907cdfe9c0dc3ee85e32d7bcd3ce02635e2058388031e317fbf22ab9f39f7f7e3cd1a11a9c1f45f4e1e42d2536c122c591837911847108ceafd990813c2b6344cffc34be37161dd815626900e8fcb85c21afb4f6be8ad01516a31c2a6580315857c6a216735ca991009dbc2ea5034160747a869d5cadb0b47ffbd5d3ac97fdd0526cae6eaa35cff7a16eaf4fb950ca31511346fea6141999a3f754e6281cfba15e8a826932c589c5d247c909d94b4eab7ebcb09077648af065c2d86611eb588453ed7c24780d73c689c8744afd533a86d9ee9e3365732cbd0c351e436f898b7043292097e03e6081a23ac865e19dc8858969b999d01fa65ef200c3f269c818e30b9365ecc683bcfe69c203b4e0ab6fe0bb871e8ecaaae82d3acd35d5b50 Signature = 35c170dd0c6dc2920a595775d8e2dd65243e9c1bf96ef42779001ed45f01b7dfebd6f6a7dc2d386ef4d2a56779ebe77f54e5aecfda2d54a068476b24dbd78b0c Privkey = 38ba0621704d2155fc2f78555196575de06d80255c35e9dc965b6fe96a4d5389 Pubkey = 4388f7f68a9effbc366e42d907015604daced1727cd1d89d74adcc789fd7e6e1 Msg = ed4c2683d644b05b39b048ef1f8b7025f280ca7e8ff72cb7eda99329fb7954b700400705275f20b858cf7e349a3510665b630609c5e2e62069263ab9c55e4123a564dca6348c8a01332075e7a5bec9c20a03807957fefa910e60c35ae579778ce2ce42e6a69a1b647681e43ec4b63bd5fbefabb31712cb3d6419ead78dd41c8a92aaceb63cbfa89d2af39606de010a397e302053a615c16e5e95ad9935c079a0b8103125789471a1e3574f429b29e4d225c7723fbb3cf88cbd73823d9f0b6c7d05d00bdeb0fb0ad3d7132033183e21f6c1e8d8e4c0a3e4f52f5001da687171345c6dc8b42c42a60d1f1ffa8fe3e7bcece59a035878f9d4d81127e22496a49bfcf6bf8b46a80bd562e65255071f9d11a9eb0481f4626d4d71ffc38afe6e358a4b289179cbce9764d86b57ac0a0c827e8ff078813306a1d5fadd32b46a1fbcd789ff8754063eecfe45313beb6601c3a3010e8eb97c8effbd140f1e688311092d273c4defca47da6f1f0825744676f9a280b6c2a814fa47fabc1980d0b37f087a53ca8778f39ffb474ff5f1171b442c76dd008d92182f644a714a0f011e215a78b97af37b33520ebf43372a5ab0cf70dcc1dc2f99d9e4436658f8e07cdf0b9ea4dd6224c209e7521b981ee351c3c2df3a50040527fcd72804176046405db7f6734e85c5d390f520b0c08dcbfa98b8742480d5e46f9be893f6d6614340f8161611d5053df41ce4 Signature = 42bed6a98786f664715f39bb643c405ae1750056460e700469c810389504c51cffd9e1a94c38f692fb316265316d8f4dc3ad1cdd8a6d5991ef010cd1489d7c09 Privkey = ae331fc2a14759b73f1cd965e48514e12b29f63b06ccfc0ad49f36820e57ec72 Pubkey = 08803d48238eda3f9cebb628530121de00f0f0468c202d88528b8bcec687a903 Msg = 5716003390e4f5216598a03d7c430dbf495ee3a7557b580632ba59f15198b6180a42469c237db5bc81f29cfaab0aff3c9966309ab06958c9d7126add78e3b32459ff8a0e0bdef874b58e6083668f38ad7d63aae1f12e26a613348f9f03ea5d205f045d78cc8902d47f81e8b52293e70e86c9803d4dacea86c3b67458ae3579bc11113b5490bcf3e1cd4e7979c264d835161fd55efe953b4c26395dd92ca4930920e904fadc0889bb7822b1dfc4452604840df024db0821d2d5e96785a5c37dbfd2c375983283e9b5b43a3207a6a9b833948329d5de41e45008bcbad493de5754dd83decc440e5166edaae0208f000c5f6d9c372153209e5b7578116f89cf2f8b1004d1307ea79ed37480f3194a7e17983a230465ccc30fcc1a62d280fbbaccf006dc4dee0ea796b81accc61a063e2c083daec039bd9a64a77024af82ec1b0898a3154329fdf61673c36e4cc81f7a4126e56290e4b456819bdebf48cb5a40955bab297c2bbcb018adbf24828660a5d12a0613bf3ccb5eeb9a17fb0a0547db8da24d2efb87ba1b843142a75e4ca0b0a333e4a14fab35a62669329ca8753f016ac70cd997e8bc19ee448aeaf0f4bf3ce5230550578ab64c19019446ce2d9c01a03d889a9909860aef76f067c50b61c3d0f12cc8686f5c31bf032a841015cfeff1cfdae94f6b21dae941b335dc821f3284ce31508f5db5c448ffaa3773e9be1a4c85a1c58b009fa3 Signature = 75f739088877e06dc56daec8f1e4d211b754e3c3edbfa7eda444f18c49b69c5a142db45a0a7650e47d10550ba681ff45dd4463c4ac48bf44b73034bd5659220e Privkey = 82435f39790106b3af72f91f14c928d2465f98cdd10084c4a44d19af71a1927c Pubkey = c52a92646f5adb21c6dde0de58786837f8a3414c09aedfc27c812218a7e7239e Msg = f3d6c46ac5248d5386b6b68462597d647039f544bb01ac2d1067daaaa397d2dbaf125a1cf8fdf280a6afec324d5311f543688a156c849819bb046b911c42ea3ca01b99808c4d1f3b8b15da3efe2f32523ec3b09c84b48cffd13c17c9e26c912d9c3e9346dfae3fd0c56c8858780782f61a4c4dbfff1e9cb4b362cd8001f9cdfeb1a72082dce9c9ade52effc9744688ac0b86c88266b53d895c17ead9e89ed8d24d40642f3ad3b9bf9bbc4dda7966ef8328289fb31e17c81fd028ef1bd9a1d4c792e86ec2dbdce3f937eecc3eeb5188d325941919bbf75b4388e2399507a3d7fb387502a95f421c85826c1c9176c923e316310a4ba45c8a5ef7557cf87b77020b24f5ba2bfd1228109566307fea65ec015019691217bce69aee16f76249c58bb3e52171cfefd5254e5e0f397169186dc7cd9c1a85c81034e037183d6ea22aee8bb74720d34ac7a5af1e92fb8185ace01d9bf0f0f9006101fcfac8bbad171b437036ef16cdae1881fc3255ca359bba1e94f79f645555950c4783bab0a944f7de8df69258b6afe2b5932217195da245fee12ac343824a0b6403dfe462d43d288db31f99097ec3edc6e76547a3742f03c777efb158f58d4053fa6cc8d68b196af4f9de516fd9fb7a6d5d9ee4a89f9b9bce1e4dee357a1e52c0544cfb35b7092d1aa5a6f7f4c7602610e9c00ef5b8761bc72279ba228a18b8400bd76d5b2bfd7c3c04aac4436dae2e98 Signature = 1daa44ef06d4c10ddb48678423c5f103a1b568d42b20cc64af110fce9d7679a2dee412b4980585c26c320dbaa601c472defc3c85415daecdd6d2d9eacac85e07 Privkey = 1bea7726d912c55ec78b0c161a1ad3c9dd7bc329f85d26f62b92e31d16d83b48 Pubkey = c9ddb42106ccef4e0ef4794551d21df94a6306872f231663e47e241f77cc3e82 Msg = b11283b1f0ce549e5804730ac3207ac00332d2aacf9c310d3832d879f9634bd8a58adf199e4b863bb17481d28acb2da0e1557b8336a400f6295625031d09e4df4d319bbc1e8f6e9232d23053bb3ffac4fe2c70ce3077fc0060a5cb4692a1cf0b3e62fe454802ae10b83ded61b6bf454ca75e4cdad5532f20b70654f12ba906f003a8b9e986f15a39419deb2ea1ead7598290eeebf9252b0c27605a7a73a6abebb42271d71a3c197a46bcc8db11d9242842f378364a37eecaa34e982135be34182c69ca8e6e3c8c90e1b4b2b475815a178377ae0165a764c8ba2889b5ab290949d8487a88e0d3d2bc7e2520176aa6ff9ff0c409ff80515f4f0b83c5e82c23fd3326cdd6b76252e7fddcd6e4770978cd503ed2d6b480101167d3f191fed8d6d74d74a2007db1092e46a23ddecddcdb984664047b8dd7cc8a576e1a806f52cb027a9480a95cc44b1e6f2e286e9b7a6bf7b396fa5496b7a5b1c03d9c5c27da1a42990d10b12fb8640e1596f26b366d270ba64f99afffe3fece05a9b0254b208c7997cdb512fc77527954a1cb50fdab1cc9a45162741fd6f9d3fd5f2e382853d7335dba1e6b2959dd86e125e67b53dc8e453c810bc01bf20bce7b618dd5d1ed784106ee06a3ecaf6b3bee0b56833b0b813139c5a696000a449c97906a2fbddc2d9de9406ea282ac4ee5ef8bf3854c74a6b7173dd2f79c7a126f3c7b0433fd4ea26e877a14831dd415a19d Signature = f9b04517bd4fd8ef90f2140fc95dc16620d1602ab36c9b165fff3aba978d59767110bb4e07a48f45121447ac0c1abac585d391d4042041898628a2d2dcc2510d Privkey = d01a0ead9d694833283b9cd7299a7bd75fa90b1d2d7884e4557b33c998772a68 Pubkey = a0f757479ba627efef95d6ec7a931dfac4373df33daaf4ddc4ec6894c8261ed7 Msg = 7627534e9a83d1e406ab948d30d1da9c6a5db08e0feb7fc5ba5cbf76849ee8add4847ef5ca5a0dae411aca097451cb4c2b498c947097407007640dc19ed938e3b91bf51c9581168df860bd94751668dabd721dc73998400be20c9a563d5051ef70e3546fee673312b52a274041057e70848eb7c5a21644c97e448abd7640207d7cdafcf45da6df3494d3585b0e18ac5ac9081cb7a407a39a877705cbaf79a01b915f736eb025c58b4b5d807fb7b7566c5969787c1d6ca4eba97d509ef7fb3550d21d377eceffcf0eb6681895adbd246ee7bf3c935a006478b832ece46de6118b17e466a27fc2a44a896baae272f9ecf018c65cb50cfbfc8d260994a18a832d971928c449675724585131c871533c9897d8f80f9c0416b718786b10fea8eb5bd813a269a1b677b7a2507a44b713d705086530995e59335ddc2855e847e4f4db06c91f1d54023d8a10f69f9e61bdce4b686fb617bd5030e755cadb1f644e1ddd91619b96ecd605b00198b9a6eddb5a84ebd3692b665979766637c677378c1c77041fd4a6b3555c1dc8a83fe9013bb6106cc18a2b037c9377b7a1a5a5d0dcc54918eaad7e32c880767b26fd2ea2d68b0405f5e074f55a19d8a39ffbb7dc32faee6a7f9532aec8a0776c3ff83ae3a4627738496a371eb9e090b74e0eddecfcd41bed0c0ce581275243472d26da8c998e4b6d6b44fc88ba2ab54642225417120294417805742bdb33b7b122 Signature = 9a0ff7f35174ec3f66d22a6f06df60e09c8f623a5aca810e23a88d0e6a31cb6f1ce1c1f9dccc9e1484b68dd004ac53597e29ad6ab72e8ce2b75ad5b80eb84803 Privkey = df648940b578bc31d2a652965f30391caf06d5f251599a737ce10be55f4a9d0d Pubkey = 27de920419c186b01be54279fb8f9be4bb4b2cad75ca7e8f792bfa7bb97c7f41 Msg = 1ae520beeb4ad0722b43067fa7cd2874abcf34dd9237b4478eae9772aea297a67fb79b33070204baee440b9c87e2fbcbeb76801dddea5e4530d89e11583179939a00a32f811332c52291cc7ac91e5a970cd5aa708b1da26be9fe432a9bbda1319e31e4bcc9f1666a05b5c05b876bfd1f766687ccea4e4482e924329aface5ee52e9879fd69b76e0f7e452ec4713bff216d00c82599d27ca481f73aae136f0875c88a66b1b6f34c50523ab602e9d4ebb7eeb9e043a65e41899d79752a279d2ed46993926f3621e7c32c9a9b3b59d8dd57beca39285434de991cbd2dfcbc5ca62a7779f475d0cef2f3e562f29acd474f3c99ec5bd8de01101bed2e0c9b60e2d70fd432c892fc66f8d4619a911b5625163e9a42bf9ea38586d8e764001564d335411225fcb0a06dc2a82da0779a3c444eb7864201b43ebb72b921f34d3c13089df2f4fac366ff1e3c0b96f93d2b4d726a5ce4d6916d82c78be354a1230c2cf0418c78a1913e454f648cc92c8dd0e184645fe3781d263cff69f5c60b1ebb52005a8b78a515c7e8886ffe054dab428e2e221d9d76aff42654168d833b88178293e1fedd15d46cd609483129c4d2d84432a99d31ffe9bdb566f8c75ce65e18288e4df8c16731a0f3fdde1cca6d8ede0435ff7436ca17d0aeb88e98e8065cbcbfd0ff83043a357cd1b082d1703d461881872cdf741e4f99bd146745ba703974be40f579bf5c4dba5bdb8c941bce Signature = 62bc991c45ba9b26bf440116264162c34c88597885e9605083c604b5f5d8fa6f662ba214f76e6cf84e5ec04df1beefc5f25d3a3b72f98b5069831916a6329601 Privkey = c8ac234558aa69816b368b77b7cccb5c8d2a33ec53aeef2ce2287143bd98c175 Pubkey = 5364baf1fdb2c63840b30d4031cf83a2e18e620793bae59d1035c0ede55e528b Msg = ce488d26975c1c9328b47fa92e19561330041b23a0e57a4b8bca89eb5f615e73dd7fae69c2380e3212f9b73341c356db75a6256d7a20a97f759d4cba7197178ea724dd932949360e96c50a4b3ba55a953372c397b0969c2b14d3609e0a852d484df70eaab11249ebeb3237921f0a39a55d7dccfef205d94ec80d9e1fd6a2c1efd29844101dfe2c5f668adb7975915dedd086500cee2c1e233e8e48855cc1a6f287d63dce10addd13cac7b7a187efe47e12d1c35bb3974052b23a73668d3e4c87db4841af846e808672c43d0a1522e2965f083951b2b2b0c409548ee6182f0c9850514c9e6c102f54ba4124c92a90274f405891e662f5ebb3771b85783156e9e5836734d09d1baf5b2134c93162eec4be03bd12f603cd27be8b76accc6e8b8bac020cba3479651c9ffa53ce4eb77a77313bc1265ddab803ef7a6563ba6f799d1ef30ef5a0b412965fdac0b9dab842c78ee2cc628e3d7d4061e34ede3797e154b06e8c66cebdf2ded0f81b60f9f5cdda675a435277ba1524557e67f5cefafce929291dce89ecb08a17b67a60c582b487bf2f6169626615f3c2fe3b67388b713d35b9066669960de4db413cd8528ee56ed173e976a3c974ac633a7134cce38319735f857b7d71ba07f477ef85848aa8f39e118118779ed87b4f42aa358a89f7ec844a451e7e8fc0af418b85bc9bf2f26d1ea137d335ec7ee757b70ae2fdd9cc134932f0e5425bf37fb915e79e Signature = 32250361df6ed283485f95f3d357a4f1c33a8cf91658327cd453d49c953665510870aa454cfa3b83245220a827d0ec7477f9eceb79c4a29f301f953cc8caac07 Privkey = 2c47f2b8b9d2cee9e6f654bc24658f9eaf439c23beaa0a79bf35cc8cd2debaf4 Pubkey = 444af2f34fd32e5a19f61f87d03e107627a3eeb8bd94d2faeaa348b05dea1980 Msg = 044c8faa8c8aaf9f2b8186a6b9b33847ec7b452423b22a91743d2e597ecc1e1e22ae60053e9ee6233b044e775920e4e3d66719901325cfdd39bb532f8aa469aab42e9608c21260c04c27413a7a94e466f63c4952e90ef90c12814b3451b1cad7da9147f8409220f6498cc0a67fef4bc04fc06e1d898a5515591e8be0c43d75a6fe425b7cbefb1b91b1bd78b5bec7829056982efdc5be24af6678006adc6f0446202e7ec3a2d6979cb0df7e25d74233914d9c58b81cf55be06967d3a595c1b9672869994cfba67162833a2143aa91cc93acdafa5b45208df3e88ccc01a2a4d220e360098d9154d225a7ca5f2f1e52b1003d106650a77b283b95e4baf1e7336fa9a747a2b3823d360910412e76db725ce1ab1e1d189d0d3abef82d7666bcf1b76669e0643b44f74e90ceafa0c8371b57c58f3b370a547c60958f0fcf461b3150f848c470fa07e29bf5f0d4b59efa5ab0d0341e0451d0abb29d7414cddc46cc6d74cf3dc233d0d1707387bd8c7780ff78e546fb77294d58a5dda5f05c1297e3d1771156d285635bf7ecedb38a9e5e77449804f3899ea46a50266b255aeb52d18e0fa136e535cc9026f678552fa3ee2146081d999685e24bf7807cc47c130436c544d35b4b875bd8afa312ce3ae17cf1c7f5ea1ececb50f95344720cecf088434ff8e0ba044ec19c98ada7782116304cbeac1c3e35f5a4f44313354dc9a40ece5a0f9ad3a2025acef262c5679d64 Signature = 8554b01d09ed86e61395b91a2b1ee18715c42f9c7e7f0700d79ff9fb5781293d61c558dd5b431c93718dcc0f98fb652b596f18c30f82215e8e63e4f6568c8800 Privkey = 887fdb4870681d4fb06a936259f75cae0517f501af646bc07a4d72bee7fb1c73 Pubkey = c762ebd48b2ce02d06384e38554b825ad322ebea74d259df1547a4d547ce0024 Msg = c5dc779f3f3fac06dd28e5a67e0e524af5b5dc3b34409657b63dface9471e9a41e1132175a0b569c8fea9d2eef2cf5d5962c7e0b6145a9e7a0c1aa33772044f9c3998c5a8c4886458b4e586f9307608361f511e7ab5092ac41ec76e0586ef5b9c236fcf5ca2fc8dd6aaeb789367f2e7c990932555dc52261e44e49423498b524419183b6c1f1d42c45464eccb0c2f7e25177fe5cd463502b403e06d511fcf9dcb64012e0f20b34c2ea7c004d9e484a7ed81f3260c41c8b1953529f47f71e867843cc3c332ad0366a63817ed12dd4730d3dfdbd7572b9ff798045940dd19fad0c8aea0b4ab61c4016de32799c73aa2b92d2c25ee9b72d46fe8f0693c58775efb05e9e17a5c346a81265d35be69a22d095de186066a5c6d8c07a3d38d002a10e5efdb866da4a9bdd54f5092661b6c2d743f5aeaa4c6c318fb59323903057e49c237b45f67542a4f27caf65b57cfcf88b71203d43d7f95322160f95c232dd10abb113b721ddba2226b063229bb44102336b10bf1656551161249786d454f4e0909d500017f6c7564f733c831af4e5ec94dfd3bf8ff5f3021b70a5ca5d28c6dfb8a2c18a1a662a33359f264d169698c1ab55783faca73bd68c0f79d1d04ae0ecdb52ae761892c02493ff35f3d84f66e236fc58134ad6a77d92254905d773900d9ddf2654c70b46f341dacb4793ca51eede45533eaeeb6e3323bc3e6c85a7940651c4f6f98191c618c891ea4e220ea4 Signature = 410a5af3c59b7c6bdb214b166cb79d96f830cf98bf52dad7b6ff2979c97fea4fed5ef7d3d49f03097279b9a099226e2a08dd30c60786254e2da8dee240bfc308 Privkey = 88b3b463dfc30d015eefbbbdd50e24a1f7277775bcef14a6be6b73c8c5c7303e Pubkey = f2b6284c930d4ad32d0ac719040ee7886b34722edf53da801acb5f931969e119 Msg = 17c317fa6bc90c5532328f02ccfb6c099e6fe1000174f2af3a3a9309428506717c5c4335bdd7c367ff4e448a9c047503afba68fd8f7987237be7f7fbdc6d73f24c6421cab422b3fb25f67b2d71042e71570df2af37bfe5c114211fd5524b6c1c6cc52fabc3cd7fb464cd580bb74071cb300f8c9f8a46208e5aa5ddfea5fe90697aa2f14c607950c98f2312a9e16ef6346a8fd129232733827e1501a660c77c29c56d2fdd1c5597f8bc89aaefe3713734fe82858201891a1147efaf1d78a471f920defc880344553eb716cce3260e86a1bc0be28373a6a066116e8ecb10a0c4a70ca2b5364e119f84aec60deced3a4eff1fe688c5e3e251470ab516fa964a4b6f28368dd1e283597934064dc0c5b5691062cb2e267bd15fd422bcfefb83ccef7aa9a2275ef57e473149988c1578fd18708d2ff69f8e5980aa826a82cab7d8b92bb53bdd46db046ecdfc8cd7ae5ce44f3c5b8c0565b5d3c072c76b95ce900ac3ee5510db0e75d3a4150a98f3ccccc69e930c6ba741dbb0eb9fb3196871ba206a58e0dae39c8d6bb72a82399c4b7b9da38577ac17ff1524d653c0bf33679323ca7eef4e9228729031560ed8f2e5193c640b2f5e608075a2ed61428dfccdc00050ba4b99ed6d1536d5ac1e939674b41d16312ae5b07def1bf53589bed4400602ee11b850330f38aad33ef04170a3905c28b50ecc57dccf4f29d0c00f713d32ffc857956588a6326b9549edb0e4fe6185 Signature = 825aff71f79303bf4592bd8da4d7d9437ff267976f746437655988ddcf29379465a3b48c9fb0f31cef03e6368861c369b4364fb8e4b0c72e26a9a9dded1c2504 Privkey = 427d6e423917896831601b8f4e21561db6108571be009e29dca49a5960ff314b Pubkey = 8d9e6360fdef249975df27b3106a71120587722df3270a85a13a8c3bb8c9809e Msg = 9c2cc7f2462e09c4c58c2709ab4259885a4e887d9fa531881505aaf203c163fb3a0dc028f4ada60670638d4a9727a39083bedbaced58edb779e1ce6ccdfb428c362bb1db0c1053006bd8f4bef89a1a9de01c774e357f910e5c39b22477555e5f7c0498b5b28f369e5d3fa42ab360e4f451c69f81ba0f3cced43a559db600104278f868796b2c911b3b032b729f4b22ac149dc467a0cae48d19e9d985b42b62549de171ff566e1d1e9bb8e56cfd1ae8f7bddcfd8a2341827dbe89c882ab3e498339ff681c7dc1104de738b480316943109f703d471ab86e4ca4287e4cd74c312ff7d037395606fb25f871e7277078a787d02f31cc9e815be8600a7c47c6fdd82331ae9c496a547bdb235b8a56d53259e6296124a32c3b625d202419d064b9a4e83efa87f13537b4f513b916a84fc866d8a899804c7833eaa019e0d7e0e8075bd6b5cb6ffc766479f3f6e20e481e6ab27bd808ad906cdcc7827430e312f740f275ddf51dd83248fa057c43c9cb77557b2fd9c2d52824ff9e146deac1e6691d450213bc590a49bec72d52e38f6b4dc6cca951eef2184d2425031ad59b242effa68b6c72c54c9dfdb419c02eb43ef3f34d338d2a9dd03a78cfdd014098e249259e77282e0c3fc1010b02a67ff851e9cfd9749c1cd8f06cf462e6ade995ac466fab5c795e9eff13e55b4350b94c7316aa498df9fdee9958047793e3bbb89fb81da85f4b9d43e4b0d43b381b94cdc9a99d06 Signature = d1c9a01c56e33960f49df37eab963bc5a99f25c600446ce2ca48d9139da5733b718fbf1a987393f6e5823c2d130c7ce60ea3db3543c8854ef12b98d33adde705 Privkey = be935209f62dea6012ecda6a6156cd166a4d761150deed456816eaf0ce78a7f6 Pubkey = d39a89af72293948b13421fb883bbe372af9089c224d42b901979f7e2804e1c0 Msg = 117f427cb68150cafcfa462c42206141427c4dcea1c8eacc2d30bed1e90207d5ae305e1fc16c54e4c54cc6878cdbedc9f51fe18461ec37c557b115d13c8682c4e15f505296a1760e1e75f5ab27a5c15a1357d2c8c40dd5355f7c82fea5d27e28876358c12e9113ee2983ea6f09c64e06e297dd96b34d9b5ed49fc47a8839549c66b002fe945e8f94e7d2315c50ca4dc098be4b3289812fbea96b47ce604540bde0e5ab0b1bc036be9b6a95e09c81e898640c8f05d60ad94218d0e66ceb85a26b78292220bfd061dd073512923b90c79dcf5a1935fafe8e01ef8bf81b4d37c5a571b50c421f9bd2194bef3586fcb8584877bb7e0481655b05c7b643b1e45b04036272841852e31940ef8f3b6d4feb5df079d176f979c18a11a66d1214e52f687e9063c1c2b7277b685d5c72ad569f7873838f910257a053131c83ebce86e69d736362bebc96bbfa35fcba1cb527e748e5f579929fd40c56b1a51a222e863302705c86f7b54ebfbb9482f7e280f7bec8caf3a6b5671ac30cd1be529288797c013ce56bd186de7dfc1828691425c147c5174a290d80cbd59c19da7adf77918882a7b2a9a64e6d76b48b92f2a266eee6e251d2e817652b88b502de7399782d7529a81d0a363996b9df68b15a7630904c8c246081fa4f09299f15757958e089a901c3564615c0f7cf2752b8b9e521338d836e3dae4ce2374642253c4c9831974e5d8c2842f49007b71775093dfe57f44492f0 Signature = 08e098a749fce6d12354395878a8be35fe9edf72684dd8281224899b1caea4ed687785dff55a19989e03636e1666386f22c3f443ecf6fd34d599ff3ec2faf101 Privkey = 6818c60bb6439ac2eee2d4e128e9d8691d4ad5d363fed7d6577a62b6569994a4 Pubkey = 7345ec11bccc056fc4effa3e4ef670996aa26a1bb1b83391babc39a1a59601f9 Msg = b2ae658b3c13c3cdeb1dc993b0f45d63a2ea9abd0b7a04f1f5ce5932806c2ca9b7a204fbf8d066b7f0fe6ae0d1da68c885ee11f6f6db7e8320a2ea650b533851cdd99d903aa0b3faa3c950f702f04e86b4eeb3a1c7bc854b2514fa5b4766d375b4f1ad61075378dd92fd626c2b47e01383ea72987959262c562862b45b7557671413b66614bcc9f7bdb9ee46cbed8965bfa505315090c7204bea89175be5f20802e3deddcbd8dd64cfef7ee6a6e3860ce1e5799df5d810d5ecf32e615d16dff87abd4a636ea17aa4ece5b6b2c046b65b5af749862b45790c39176820b36901be649cf4169df7e923956d96064950c555f45acb94507cfd0c3b33b080785e35c0d2b0addc4c0ad3fb216ac2e601c9c7e617dabda333dae603cc9db1fc62ae4e0e45e3ccdd166a6781e243b7daa138806632f538844ee3d140b7a8bb2b540100778c458e066170705e5fb2c88029098b992c39bc9ff6330bfcfe7752320e6ea0949d2c871aedc187be27fef7db5f72a6a773edde0dc52ae2ed931cb26817b85b1545894d92298aaf87ccbc783e8dd6d16493f56ead2ba852ee9c7d10074406440d2a279abc874f15468dd66a717bace37be7b7055dd9681f8be81329ee7af97e3abc434ac1c93aec582f23fd1ec0fa5aafcf7bfbda00ffa97ae317ae918d349d21a7f4619142ba23dacef7b390ae26a17e2e2962ae27005376b72d4da9e2979653a66325a14617638dbe1a5540b683ac0017 Signature = 1505967a27b9f86e9242444002a1e3197d74ddcd89659ec5140202aac794b8adc193e7d30f3382642990f6fed7a999cac8c61eaa39b7d90816f1d738744be101 Privkey = 6d1da5b483e64b0365990ff09381fb1702fd8ec3a1a369cd52e4c56713a314a5 Pubkey = 08055c261f26e02a658f66d9ba01fcde53e9ade3edc6bf815e4a6802e1677ab3 Msg = 79a2c37055f189f3247f1f8cea19b2ea40d858db1f5d1392ee6d411c7802ee23de52ad02811725a94d76675da89a96b5d07abcee233a1a2e1fa324fff9e78a4c196147f8570b0b13713d96aa5d750a15d7cd162e7ba2e75333607dd698eb4773c7e91f7668ff8b62f04640eb12ecf122fce6b832e0d0df928eefd2c2002364af6bb55291d3f54929085be338342f09da73e279c87c8324555819ed57e78d7ac40951d33f65b94aa1e555e92a063d11f1ff7b12694341e3fe444933d01aa36753ed3cdda890bdf95a8205b5d893221991c795ad0a4a946f58d40a453451af214fd465e28d3e2f0a56aa56def8dc04aad35713abfc8bd7856d5a9dc3f60a3f2bd3e6366f1f244e941d6aea892f6a88931fe1c313e09078e90bc6392d490533c9ea3ff6deaf3aadfa8dfdc4e90f64af47589ea65a87acd2199602351d3afc2103196e0394ed523aa799d31e11d34fff546d44f436b34859f9cfbc9ce403de5a9830ec3d453f0d45970f572c144f191b2fbb2d0ea6cc9c8e24d9c0b2183b278072ebb0be2d70d037fd2e8ec18dc4c9b21abdc6a4ce8d4668a220eebd6934f04baf0e88a488d2dfc735a7c5a70dbb0166a21ae011fc6e7da10fc320336271d9eead510a6f7032f2296692be508021bc98c170be4235f7ce31f2bcd6341163683376ae2c5662cb4770c96e018ef1bf47913319c9a09b9e965ab5c3e97bbc756a5666b4567f2cff2d0c3a6a4026158cb9f90f950056 Signature = a5b8b44a91444c64374b523cb4dcb0cef4ce52408b98126d7e1ae8bdc28cf51470ce4e253e0be62bd68ebf5fa6bce1585eccfa9256c073ee03e54c525bbe2d0a Privkey = 5146f5b7f1baa19fc8cd785c896e0f90f9f659b77b1b9bb4adcab5a6267205e4 Pubkey = 688a8de64eff33ba6bbe36cdd6a384bb67b3f42636db234ff5efe0b31743c7e6 Msg = 97bd99f518ee0788d576d99c043b449dfc242ac5eeaec344a19432b345962ec412ce55362b3b851d98119fceb9328347f6fcc68dbf56a2814db09e9385843a931189ea3e72da9d79a45693053c035701dc5551240f95b303fba16f89aa53a43882b0f1381202c78f9c7419899f2351eca95e20bfee76351c48d00499f591da56a99524bb74fe1c834ee91077139f1edf67315c07a3fd97f80b7c276b6cf6b5cc36be363b731217f6319f5129ba7b14d054c8d81d8e3a3f3be62ac31ff62df6a3b2ee2596969b991704b31c689997ab4628bc2660c67872132e85da0c4fcf567965f1254a8f432692a17bb86cb3c1dcbaac939552f09e50ec5b0de2ef85e0ac253a4165655db5b5c49803821d859c60961e061d58278b827dd4d3bc47f1c22de094906bdbbf3badbdde22ba24255855eb86d1d7f37082059311dc0728ebeaf26c4473bad1fa9e614b533b811b6bcb0650c06d879a5245788f3401b46197300774a9aa73cd978c0530c81a53bdb3fc932414b3e30440dc127441eff1605e7fd9ac8c632e82bf1b453d4f33a57e4b67b0b6fcf6ed5555b5f5a300a14a00d0385a33750525b00edb312c6bfdd64edd3b5316d19f958c517634f013b008936d34e9b5e1e9283a5f0fd7783377c0e5090641bb9d338cf3133acd0b971e537904f17af92911afad72ee97f9a8283a16a7e26ab428416c1017dae9b1a99c4c3320ad163bdcfc328bfaf9b8d5d7d26d41d1ef21a5208f01 Signature = 4bdbd7c64f13e278c23969e7eb386bbe499dbdefc3ff4e30cfac5cf86f216c24c9e6cde20e529d147fb7ea08f2593ad50903b5edbf86b4d28f2eb32ef137f00c Privkey = 5e6fdac9351a637b99f33a264e1287697e2abab0cca16621792484f5606f44c1 Pubkey = 57e5f88acddc8cde7dd07a3146fb1d4f7a9b6383a8f6b2b8d9b07ebc3fc4dd20 Msg = 4d6cd3bc2f86266b8bb1b61d0e1caa9bd2d4a180361aef3a18d390b10f7e860f697e247eb6c3e51d3b976bf0ca183d01a69880f15c94b875668ca30dada0895bedd4d705a0e03304d063dea87c7fdec98b89c06f130dd5bd586b54d9ba737826bb405cd8ac8bbc9500acda3c07461d009440af0b2531e72f3ff5016ae2d86d69b87fb273d1e8dd5f6a264beebb2f885996741ffda277a0fbf8ef08f81f22ee5961d9d3fc938362e1ca12004a91d9b5f7a6833a6c22955ac0cda3390671910cbd51e685fe095973e415fc2db8adf10b147ec7080c3b8ebd07d21bb9556da85430a268eed8486b1e31c94313b01649fe91b222f85adee15eb77707d78ffcb660926544d33be9994a297620dc7aed97f392639053f388b0b3aa3bd0ac5b033cb414be520b43df6826b976890d0c53b97b6c92e7d1a1573d0c7494d747e0cad9bd8ea538d62ad59801ad0716f170193e3009d9959c55d2ff64799bd959359abb94ca9723b5ffc24c9507f8c5fd6e88eaae7a70add84d744ccf8b98363788f0bfb1a02522025751e534710d40a2d38a791194eba293fd2046cc14dd3876d168fc6e236cbe146d6369d225bfa67e53979865f78873a9fcf03c186fa8521f0a5545accee80d1e55107221e21f0f2291c143de023e88d7330cc87d4c51ff29a3090605e9739490c1dcee713495f231c2a36b11ab235547fb6328f747336d9b1ef25a8ab99ceda957b2dccee4075b0d03381b94ae18d041ea Signature = 987e32e00a8a1632f47b503194355c980cb22adeb326b4e3115ecab04b704d186cd92e3c3ac7b4e2936cbd07cb794ec0cfe91a97872ff2b41376f5f18f55b805 Privkey = fcfff0932dc86ea5902a8d33073329960cd8188a075dd0bcdfa8382c20b0e78f Pubkey = 0c9205a90bbe7f2d505e17fa3d080b522a1d7a152cad2d85d31b34a0471c0d4c Msg = 3d4b76122373e212a346d19a66bbfc4b623292649bd0ce5cf6bb135648bd01db7403b3d0bdd1697ff4e6e908904116754d370c40d700cdb664c46a91dd84a358b9d2381443e60f2c3f5640261b6b858ba8f828b0971f4122b20288a26ba2090ba14fd276360cc68679cd8419ae19c6d4dc7b6614c06df5e5c0510e2cb686de0ebd75e5210a215562589b28c9ccc7d272b98bd4bf93495efe4fc5b78defecfbcaa9fe126bad30e89b3a389b4256f6a48a76c345de5a36a1449f08345b9a5e6a001da1ff9cd433709348e9aefbc78ba52d3ab3b46986935eba8ecf81edc43c5b2e3b5eb38d9a165e9e7f72f617605463bedba973ebfdcdf2b0889c71412f8f850c7a3b5518ecd89d2e25c0c1c30f085a0ffe540ef9c0e88fc7ec4af1948a4e6f7a6e256b307a1127b71ba686efeadca0e4860947cf674fced6caf7310ccbaa8d9047daed30fd5585d41ddeae4df2fed4b6228032c3e4ae2380e87ec6cd72e4d74b8b4c3813fb043389391e9c13f7d33c3aab5a78fc4c6a634c61a70f02a940548da177c65df6ab17cd9683f37ea821c740889d82e88c834e7d5dc11662ea78b13c6a4b6218d31784219a4767595b1a56216525cd68938b22bdb1f8c5a7f1701afeb961888e2e0ec0c838cd620cb7dd8a1493a02cd56b545125e4700c0889fa2644e644a3af531d1cd6bc95e5df9175f137f28408cb699c7ae66f65d1d2930fac57ca8a60e6311a4078488c9ea404948a9debeb9d5e10 Signature = 37ddd83f98b057b7cb3208a832c58aa90694563c23548d432291380b73591301f274b04cee2ef78c06d96c3d9b7c17521aae1a8ca50d347c09c3cf703bc8830b Privkey = a1e4fcfde044f1bb0e7bbc631a831a8d07e90ae08a966ad627b620b1e28c42cf Pubkey = 25560f31168bd4b72552ededd08bb6bf79a94063c1f1e1d304869dd1ce049b95 Msg = 8c1454d4e08a1401646bf7a8859e8a145e85eeeb40db38ff0169709641212c81b67390749c01a79807f3ccadbbd2256f36ffc180cf9ba44bf4a7612d441c23b2e25d33c48a73e16ce357562758adb00553c3142fb8176b6ae8fb610a60f923b0911814b10f5679936c3677b70e846e218f587567f2019c7d282a107f3cc84763adaec88993c0cc5003e77af60d67db53f8cb727aa6672de004498c3b3e222aa7082d91f98a1a068374c510ff53a5e559cbe2d6c7c3442d7238907c811d58aa7f5a46b8311244f0dbe1b9c0e944dda1d8010864949c59396c6b346a11f3aa866d6bceadfc909038d22efbc8f1dac810a9f2fafcce7c0389eb0a56c0f68cae24ae3ddbdff7116d2fadeb9b0e7509536fdc3b83e71354da6a1aed16887490dc2f4df57bbaa7244528fa3094b99e867581acef906270b2cf4deda6b8fd9dbb79add7bea8f86fcb1f64dfd50e385b4209ec0b1a9f6d2e519068297a2b5c405c216b4a2ed983ff69c59b530effa60c0367051267dd2bbd1e86a9ab5a114dd4f69b540bfabfe97c0403b8fcbb27625761eda3e2ad8e625cfe4b615b7025531a498918c24e02a00e797bbafd14f9d3f6827e390063c436080688d037a6e2993c56d3a8e95f375c10040bf04f030c972623d9e3801c13b4ec8d01cf183855f5935f10ddb2c54c51c80cbed0c24db56e1ed148931d89161c5ea37c2f9787f88ef7330e5dcd0e43d81bfc8bf23ddf7983cc1d733843a33ccb395dfc Signature = c8001527bd902c15c3dd5ae18180525b5e8202be66711f82885c8222a15f060092a2a6e2f7d7e980311209191b32b8ade48d3ea98cf245f0fad62c009c5a7108 Privkey = bed1bbcae18643d6f6aac34f3d9b6a1478394d02b931cff006d85f21b7dbc747 Pubkey = 4f528b38185a424c6fdece46511a0c29b7c04b32eb0483abb52d5f8eb6b352eb Msg = ff7c6413e618a056de401ee10c40ade3d7c0e6861495d97c2689ec6abb69dd2ae701fdcac8f08331ea5c5f5d805b5789ee5e241ff4ac8b960f4f2b9fef6a727fad86dcd432de9fad6ba45e00aa3687b0ceeb2c0d430b7d5fde63b4f6b982c4f9e03c430abad9044d06dc49e89df481405d8febbb0653e9686948aad2d9072544df9424fd487f4e24ba7f2455ddec4105828c3981bddbb1b7fbdbac155903e960fcd94c0716e736f519867fbc52c51260f571d7edcb081a23550ad8c70bb268864ab276aa2cc2dbf62383bb66030ebe94354174ccec2d2a907578556444507cbf8488bb23c62423a3a98da7cc968f599d3dc84dca3afad7f14ec306e1db534143216aa22ad18074c719570805ea46bc86b71a8ff58e41e73cb29ad5750fcfc9a1c54292b64b47ec9538f53816e36ed0d0c1ae5ead06d477aa975ecebaf62d9023b77e50e7b6d4abdaa485ea34ec766beb1d9ba03c9c067186e2e38266c6e2531e97480214638a2bb31431ac2086797155fc775b3aad8d5a0b904c381edd0c6bc23c66a1904955ed450a9cbd16459c32f5ca354bbc2da7b1a4d814f1b8710aadb2ccc4f397758b7e9d91f3a91e5825ab8682ff5e41702e07841ac7698c3da9f558edd01f86ce2c506bf4c2149ac9c195a59c7dd7d4ecf93c90b4423b4350588d41672cedc8510a7ad53b4b7edcaf23e43e05669d27a1fe97b78730d3fc060bd4edd9872cffb96285351bef148ef783ab392116bd7b907bad Signature = 0fc99dd3b9a0e8b1fc6e635af5c64006b67200fe958f53cce1b9b091a4e70669b593f15594bc0842e5576259f9a6859a0db22d740f9f8024b5baf1ef6f958c05 Privkey = c718823f43db2217c66ab2899704165d208573de60f33bc0b9338d880f193fb5 Pubkey = 2940b879b63f2cb1f6e3ef9c9d333ba91770fe18cc5a347fdf12b0efc5ca2ec9 Msg = 050e6877f65ec726eec701863fab140b994aa1e92a487db1a18701312057db44bfde70911ec26eaa28632d03794d545dfcb2aed4340cab7d092595cd59ed23994043f50ba696e9802bd64990121397286457ae69d76cb8e34d7c1ab245cb07b1b408f2bbbfdf33a1bdd559636702c918f982c2ac0221f7f94db91edefce28118259f89d994dad5bb013c678c1c338b65396b15e8899c169921f278859ce0c856d889b8c63418ebc573d2d625d5b5938839f2b169b6916d8e40dde70d3b72887ad2478ef6fb1284fa0e4fc524e3c6fa1dd22ba6b81def8279f382bcb45048851b17cd659d59409f571fa8a920a20934d9dbe1022d635840965400240f870aceffd5db7c7df08af89e47e1b9e20bb99f96ab073edf53694c7482890e3631340217e687ab27c984b60825169457d435a5409ad8e42da0aa63e20c2bc67bd8b9a267f39673a77f7f3136dc5cb2d24948dbe7bcd7129318c68c6fe95dd4dd4fe942286831ea53352fbb252a1288bcd838921356785d072134cb820f6279cc71461f431be9d3014724321c92fdc576320137705cffb2c23664b705e9be60ae1a190f3e3484f70058e702407b056d7fe5d31cee9c2a6ac6eada3516abc5517256df1243780a03bb00ba00ce248076eeca6fee91d5ef9eb907b801af097f3e9eb256bdcde81efe4baf8189b0399e36f1eaa3ab626617cf3b47dd89caf69c64c5b8f68bd917fe03e4668538460a1be88d9a846cef39934627d474734f Signature = 4c9cdb1ad46509560d871d3089afb8734648201b10acc953e8b61f2cce2dbae0fb9b868ac957432b7222dbf7e4cf0bc75309bea360b263abbde188532dda2504 Privkey = 2543d166c9f5f7427ff3034ffa8103cb117bf472331a73d9a2f1bc0a02a6ff1b Pubkey = 42678cf3857021aa5567706db031e792715ccaf8abb02a042bad17db3d5fa103 Msg = 746d7abf0bfb2662c25ab5c5e4612c306f16d13e44d0db394a0015676ce609784f0323da1dfa94d2b2f1f6e02444a936d019b143021f73c79df9309e7bdff39daeec4caca00cba4ef31c8310c1a08ef4b36f81c377846b5b90acd411aa671ed7af278a24229b7893c1b415d79888d7637f5cb5c9c6c631ae5ffa29f1340e444096ab533617fdcb80ff81da0a7c6c142ee0fe5ea82f68cc3ea38b56f272b0d80fd5f4f55ca9348c161881435813c3fa9fff66a2ee6d5bd3edba0d2f9aa74b1c44bfd0e64678d3715124963ac575ffb09ee16437da484b3ba58e5aeb8ed8c5c0f47b59908fe580f37ec1de266b295d6be85e62358e9bbdc78964fb837eea29fdb7de86cc56f48bd9a3e6e2be51d8a1dcff3ca4d56ea934c682772bcafb51497be5d0f2a23dd4970c02c44c09ad897b4241acd7d6ab12d8f00c9aadc334b431fec5bb69a285b7550a639ece96952682b7334b68c65152e893b1c8100c694d8c5cfe26ac03c1f3914e65c84f0e777290c76f6acce340bff66da7220f73175e94af52f9f19e61f80dc1f35716b3f48dfa5025c9ebef7382e055830f5bbf15c6f6a95032909c892c0f89c8c15fc3ea40a20ee1a4529b521951df44d9d79d74e0c4c2e0fed849b8785206dbe62bfa2ca21087a912e9b184551659cd8a587e95b04317192596bb0b7fc9f7bbb6ee049c8b02fdd758b4e79882073b71eaab18aa293701c17d55f9ec46c52de1e886b6750fb0fbcd64f4568a210ae451e9 Signature = 20ea9368a2ccd08bf9cbf48d4a2f7d03f0db08a54b87679cda03e296af9ef378be9b8f04b4065b009da6db016f3df9db64825873e2fb4de30449915cd73c4609 Privkey = 85e0a80f3b30c20199d9c1ec662e392fdf1546377343f12471db2a0310a705bd Pubkey = 540a3a1d83672e495034cff408e1fbe82e538f0917e8a1c7d17aab58e043d3c6 Msg = d2802f1596f8383b64edbdc594060bff0e7013d5b7c85d830fae11aeb34dd594959da624e044474c5409c0059673bdc61a671ef5b0b8a26f30100b3b73968d8e4d83a72f25b513448d2f6b6a4475fdf89e31ca9268a30705af3f649e3fe01dde0cf4b29ec2da5436444af091d62730acd4cab608f0df26f088c6b9b9673794f0747dab2ce190f90592009fdce5464b3661b7e8620bad65509a6c752b727a8dc8d3efa584fde0272c451d65a93bece4f59d87dc6fbeb451401e3e2e003c6aca7b3d3f92719150c6778f015aff2a59bfbf2e91b21b0ad6877536eb54567059f587f54d4e2a6fe1fdcdd6a7fdcb8515575bcc3705d77859352fa0b044166e3c318846a5df33563003cb20bc942d30391093e8d583e8e64dec570ee1c4138762f6483898d32e2032bde9bbe07ec2c3eb47d96876f0fc0f024d753ceb34ff8480b4cf576230bb8263dd80eeac662eba31d8a61f309e175f4c0143e28a852b1c3061ce78efbd16a2873dd28198a46ec0a800b30dc8a93b8dbb81a730de450b864dea7680e509d800e82329c261b07e72aa80ee16ec375ddbbb6fe3d8d47b0e3c5a9f23c4d20b724c1df59835d830dd22d10403d8f15c102c4b3769c41666c3ab8c7e80b940d0bbb58652d10a3ffe8d44df1012a3ddc4e1c518d49019f7c5d3d9f95ed93a319746d1e543ffa69edb49bb3439f8a325ac6a0cb4edd65ba60080a0447c674faa72d8aebdb5d2544f2f2d847c72c2dfa6057a690adc5c441a Signature = 185ef2246aba2b1a568032c7df93c667799b8a521a6f97321ead5866b4cb9c65b64a1c40b9b6a910e742dc32a7e66d11ea45dbeaacae9f09511b8101f8af0c0c Privkey = 82a2c6493f11ba80e4b8b3b43841be970e2a10a94d2249d8ac6f5414cf5a3cb5 Pubkey = 4c2ee01cdea07db3635f5d4c1082b92f298deb17d0f905df71b66fb2274eae99 Msg = 09854d13684950419e0bb16464e09988905c0217183aa1e48adb147bfcc2eb57c2300b0dfc39d4896655a57ae20415408bb5f2c238013955f0a4fc782e0c993fe42cb08cd8cf415ccbd6cf1cee2e8097f04e8f09ae5da5f415b16c2cb30cb2ab6652ba50ebbcae4a59e31fe11e7ef3699ca90aafa586bb242c89cd2e332b2bfa2f8142accaf436f89b6453bb4805a1e7f3ab6270f0daf89389e717d1b70175ec5707c8f512c40ab924c457e9f0914791750dc292bb27d6f63ba8ccf54b90d3eba7f19eb300d9eb8f3b72032ba93037f552b409b580a5f65116faffe0fdfdc6db3881386c3cbc16b67eb25763d7ae3aac0b85aa1e9aa22e4959609d4381e4b6d7159ff3e3b2d37b640f88cfbe4f8a77f8016457228ba6d3af5c4e33125d48bcfcf3678c163b698e52e85617ab1a75ff20c690ab07155ee757598578072d4a09dfc6c6c094ec048567d513ce2b1834e163df1545319d8061e0e57f58ef041b7bffc4966ac1660331b97abbc97be21ae2bc58c6c3274a8adad5fd2c3bc16b92e1f8de877b6a26f0c6ab7162e8aab93af8d85918c13d3e235a273748c62f0d22cb1c93e134a495b1b5ef8f1a1134512d53b7a211263177f7a60bdf474691f224a3b5bac4006db345ca6725f5ee703eca0dea10d712676f63ef3e537e63abd2608cb4fbe200e15f18209153496072908044c95a4e9c5356aae8ed5f0959eac091e227a0b81f5803276b3b3bf4b6865a55fc6782f62ea6d63990f9befe01 Signature = 68a91d4f8d241c1defbd5ca9e9e1ed8274419506751c967947b10d50118bbfabc765ffd7b31a0167c4fd8b1175332412df19d8aa1a909590861320923dbcb204 Privkey = e55b343a0fa1fb747189cb00dbc3a6aa2dcf5b86e57d7693f307420389761153 Pubkey = 23a14460ea983cf997c782eb4582ab3c8aa6dde53325b977b78e33d2dc5f27aa Msg = 36289b5eaff2a85a7c6d575bd15ea594b2fd8510874a469b52109163696d85b68c5b211d2964efdc66e625abe8aafe4cd9220cdb341107ffa8276ed4b370fe376c1482687167dbc8f7b205a3f3301a1664d9072877d9f98b8f69831301df9994717fc88969242391d9b0517d6efb271701eab3f4a9b1204213e8cd13f9d099048b8207562f2e4ebc653cc65e9d5512d65b41022c79b4eb37298769aeaa6efed69e9a8cb445c7012274de62f509f4e4814adcbf4453b4fab85d7c8fd845e00830ef5b7b1e63c67613984caefe915a548e18e505622cb2b39299f427f4d83983ba2aa00d53bee1f59aec8318c5ea345d294252369792762add3e56fcfa6e7797f028c799479045edb2e205eb6dd6ca04eee56f9496d2bf26099357c973835b9936024911e4655d3e22c811c8d4dbd1b04f78973f077523a389b6f28f6f54216142cb93e33d72b4a5052d27e4911e41e6cec7bebe1b0a5113e6b70b479d2abeedf69b7564e5a573b352d16cec890701bb383d3f6656eda0892f8ccc70940f62dbe528a65e31ac538826c138ac66524e331637ba2d37730358e6c732cff8fee940afd22c39ae381e5d8826739b23fdc1b80aea5a62a2cf0ff1525e446cf31046195051d58503eed1befd793eeae1d5d1b62a5c9845157a095cdc08a1d77ba47e84a5a739980f0f5be7aaec9a215b204b4bb7cb1b386ded58d7aaf7285341907c63336ee3e6ef077ad111b974e7504bd989f566fda1b1b59abaa91c78bb40 Signature = 07266c18650ecf0632e225624ec4c97fc387dc374687a61956dccce72894ee138aabc80cfc90c9eea6dd4c59af4502ee29635a92880786678b14a3931a69f907 Privkey = 3973038fa2ef6a278d3c1cff9a225669e465a69d0750503de748c002dbf9278a Pubkey = c75e77c78149d9d2dbc263ddf8ac4d654d1ff455cb1897e1c3ce31b94cfe3210 Msg = 3392e02f3c84661eaf81a5ff04357f212e92361c5c220739d96b4d3d9c22d18df48be6b55126f581601ffe0da63f38e19cbb12726ca0a6aa325567a003a7849d06783992eb9eb92853297d7228dba980b250bb110f63d0b84670e5ecb319cbfd61278f1f4cabf1fcb3f701f12f6ef8d3cc4282fcbe589eb5659503a2ddd8bba38e5eff092dfaf539fd804f21f73a90adf569a00bf9d25a9ad3a63309cc6093142471a478f0b8992286de023c68efd49987ec270bd946f6db48f684f1c2adeee26d68dce95a55e4cb27bc60523080df6ba2b199996b1f1da6920d1559f79bfde9fa1a02deae1480c76f947f9d213fc43bb2880a1b4d03bb14f5b044a0fd83ce0492f49ca3af25211b86faa5735ad7feaf31a1a7491e708b41829d68e32414f68352b71d1cd23c8e12fb02da711484f6ef97528a00d24fcf91d4e06e9badae9a44dbdb3f778041768d863704d736810400e7f2931efb85c8724a593426aa2af1ec5b664f85c2254896fdcf316db0924e11aae8d683e9a021929d0a9d6fecb4594b1b3fbc16b176d29d1efb1819a4a423fbe0ca0559c57e9e5449f14bce91360dafda6a427ce4a0993dd03082ddee066533f6d3bda5660f42fd7757690d670598ec7096f475a01a519950341a831fc9a281c0947a863f1f6e03bba774de77adc23fbe525cae6ccce47a0ec4979e8bec86f332fc6a5736e3b98fb332e9e8244e68a100455e6499ba8dbae98b92ba3d9c6b4ff980343e4c8ef4d5a4aacf8b1a Signature = fc0c5453839ea99296fffa501d58366628df89f616766942d5040a056056dab18b4405c04abf9059c30868d79c936cccc84c4fbd6fd30b60f8bcbd7a66404202 Privkey = c71cc10ad2d443e025ad0625686b123503e590193a2bc8cc57a7b9b4158de6cb Pubkey = fc06acaab53ad08e9762dd11cd2122b31599bd2598ce6f248795e732219c2fc7 Msg = 2e0846536dc6cce19ccf82dc2d0cd21bd4e1ca7bc317067af8d90ee4818c8518bc3ef960ce112a41d2b9979a282ae13d706a005e0034f06b39ff4b0a5afaed70b561bcceb1bbd2ec19f97448eaed4be620e36a962d878c6f80172b9fad43eed07ff93db9b9ca2262d5a3c229c54e30a45e73660892f048e363f37144ed1921f72992b4d01529870cfe373b7e7cbedaf969269fb70aa783d1e74417c7bae0fe03d951fdb8c71c62e9be7fdd5d233e39f46fed057e49b6f34068459148da3d424161ad2c869508602e9c0bb30bfb88acd5f4dfdffd473503cdfedabc4442b743be075e7c6f610e64ffc2e53187745cd719658fc6e62a5be518437c5bd6a4feba94ae3f44f2f29308e831feefed676909ce5e80c84cbdcac47e47d27c9712a01f6bc5daedc02e6414407e911c0a5a53e5328a5a5fd9f040aa7fb70b79b31cd1b6fd9bd5029040bd22ae222fd2f6870d07f435322639cf3193ca5709b882b07a58f952a9963e568f8c5a584a6b9e275c5c07957a4d2cdaa9f1eb444ed1224bac6563b2f9273e80301d44d50ae383b597213b00da5bf27e5d1fe240cc3bb65aa5030d651b6b5b31761d53ce0c6d74a15dad5479f31c915ccf446659853b89a51a28ee8976853553fd2e02fe7243538d00b4ed07d8b8a80b5c165cd46341ffd8163c555702663a4e6ab2952b7e7443d0f6b123b6946721aa63e87b1155eca8a6a1bc9fd25c6762e52742c86bca1ba9d8370415244f0edfdbe0932b5ca0611509c9 Signature = 2eb33bc2d5deb7f3a2dcc377b0c6a862134bf3191ec40fc128ac28abf2316ef1401649b8f4cfa1a936de79b532dc043b6d36024b4c37bba29290ac9f449ba60d Privkey = 0a4f5e1670f1e24bfa37b73c994330b36e7daaf930161b78a4a84866ff25e3d5 Pubkey = 9dcbba903981594c7b677ea8002001d664cff7ce8e5cfae58840cf74aff0d3a9 Msg = f4b05b3efdcb1d5c07da950c46565528440bb48835ee4c13f43d7a1618de119ebbb259ea7480a5048174faecc1055b32dc01ac7156344321e8eba698f302ee1643b5f04b8e7ecca63b91561ce3514abe7851b6fb17fc943bdc94da308c8e4769fec20fadf4fa8e7f62b6ffb5f170d644ed29355ebd22cb3aa1486b1e367c729dd3f79bcd40ffd08af28cebc8d776e1a483e911d79bc613e09cc621cadeb034dd6f72374771985127f7a3a1aa786a523ae6e34ee433dc30c375987cff50bdcbc997fcd51c94567a67aefb6ef5edf9bdd65964d464be9ebdfb88c0e231b07ff6405c00f82531e961bfc5ead266bcc08718878cafb1d37536f183e48bf38d3f6be900252d1fb419e6a2ac5896039f63c31401fff932ce9814b085ab20416972a2b351c815a62de509674628b0d3566fc9c2e0a9237b93f9bbb2deedf02bff83bf6d868b6399326d4809d0419f31b2f3a481285b94078b47061ce91dad583dd5b13bd010fb30f2495bb70420183a930159e4db193df6acd124423e039a67f15688aec50c5927fb271822aaa66f294bc805d3bc7c8341878a541009f30da99fcc0085079ce7fc55e0011685562abdb3a9471ffde6176300ef5b31e0df609a54a1ee6624070da99c8776891fdf6aa78b4d55b1f5dadfc061add5af00fd3adedb448c559bfff204068043a5d1d6214748628c3ebc5f0224326ca18ef048425da9300133fb695d4f263165ac22f3619d405af271a71a9afb198bf631241d3459b95398 Signature = dcf353b2b99a4ef45f3fdf6528632e8abdc433342476a8c2b37900404a4e333d387814235757ef7ad03858a0f35d4615e8aba484fd64f1112ec1b1aed2cb640e Privkey = b855c81805c7087410e69f96b0240271dc76c1e4ade38c6a9278e3c94fbea256 Pubkey = 6adb025a40260f569884b8cab3752b4f255c373e2b424b6287ebb510fa06fff0 Msg = 85a9bdb70a6c752897e43a91106ee9a99c2ca94ff7b4461a44a39174c17ecd99df46eecd81c3f52513dc9d547dad3721c6d5ee1f8fac0ba5afb3687044739ed535b844008704c09fe1e5d785d4c9c3d0b05889b9c20fc3fd68df12dbeb2c34f6f7ec1c6fb7fa811ff846b5a61fa5fe55379ee63abcd373fed00254ebd06bc8b22f7fbf2f727a5fad88514159e26d78dfdb0957f6efaf51a8e80b585e838b9621d051074a4f5867b4ae2f2ff6d62b85bccec0b4aaa4791637388c0901fd49dcccce7204859f81eefc639fed92280456e69a1509b4b1bd7624447d862c45a0c8b0c5bb2c4ca512cbc037f51b780982b183a5cafa15297585c947a25be8c2240ebfb6868ece5ea2aab2c239c83754c7d594b3725aceef344ba7e6aef49f7f313b0ae82ccacad387a6e9337f05f8c799efe7829b27b4d5b201fd5ae5834351690759f3ea175fd4741be228d807fb54df4a741038faee47edf1f561652598601f27155fc50d9d5011433711c106d4b60785a5cc93b3fdd1dad70c0c8eaa33f1512e35a541745e376c15167fa8f6b3b2c4c3a366fc41497d297357816ae795a804c980e7cbfb0c74d8835d929ae3bb52bab12964566d746bd2c1d132b6233fa34f75e268edee775eb3ce132e6beb2e8d71f0c8762991cde4e26f71439dfa83978f995603861bc0b1d9060bbccaccf86f8745ad96994d5d007d52e83aa5e69412964bdbfbe4780aaa8de41be1298abbe9894c0d57e97fcacc2f9bbd6315d3fcd0eaf82a Signature = 3caa813273e753542ffbfeb21bc3e2cf8ca7d920faac7c49dc2aa9911768c7ad43b38b0236db27f3eeae0b1206001e665a607078c522ed7a9dc4688534635900 Privkey = 95b9c8a6ef80ebd5cbd47a04ca54387373df4d67a2b475597765ac89fcf93e93 Pubkey = f2c947b18adc3ea6a23f7abca364b9853ae85a2b0c8c26f0d3173c2732c3c7ff Msg = 7855bc392630ccf531d3061606ddfc81a0fd9294c54791b5f9559b6827254aa1f25c540b7d7df3ec9cdf14256629dbcf9b725feb3412ebf35f0ef9379e4131cc77e0f0fb6f7459a738361a99ae4ccb2b60a99fe92bd6c3a53d6f454ee9005bcec5aedcfa82347392efcf1175e578396a8d800daba0f4c2cf4d4913b0528620e3baa0f6d86e0628e47c0ca26df3b0c788c4e16557f7fc28df820c12fbb6ffbfecb9829ddb65ef8d63e90d68fc7194b5b885913f08edee84567647ffa3f0d0d325d082600ce71a2345c77d65bd96252003e5c125a718a07370c31b5708075cf1837c6925635cc68dd1b751e40ab608b0d9d8852c18d3069219ef807b76d288f92c29a93e3d75b5b2e53681671d3ae0145ac03ccad3162e44703b0401d3eb167cd8ddc1e1a5a326b728b1e0c00a94d86de61352a661e40897175d28d341e4d1d9962e35f4de18a54017611ad05359ce08b97bfedbfbe3992ed58ed40f517aab01c0fefe8b63643da1a454152730bf99af8740adf98a77b8d73adb08e609e00ce9b1ccdfef3e9a9b05aa56e0bc79b6bbba80dd8e461af7cb202892d89b2d05a4458ab3fa54b474b8f8f581795d6c2739e59d0fe062400bae2d2d534b340bb8e2615777a9a5615bb2cf437ba525e00e7038f22a57882ac520b333e75c3c92a8b9f0e37f671c94b15dd8182a08d7c143e94e9262b3cc5544c294f5f335c2b28ac119fea00f9634db063993988b5f150579c7cc25b6a1fb0dde94804fa6ef66ff79fb9107 Signature = 2c8bf543e2a3e00415ee4f107b2f5a6687176f5d521117759ceb561751bcc77d9b08a6a631f6447cd901de96699aebb168bf97500dc54a0543ef14e4b5a08106 Privkey = b786ccfb586d43b8c46bb97b96c918731bc2cc119277f123671e30148158d2ed Pubkey = 90c7004600f3dce409fdeadc8ed018f9ea263f75160a74ab54f4c2399a90ca78 Msg = babf48bd55ea91bd0c93b970241b529d9db43d4927fea5f1a1f7082dd6cb50a52b094b3129fcd903a44fec8bfdb5c86c002a2a452887ca25a60eceb5e1f9f5c93dc59423c7afe747c6bf407cacadeccf5d787970cb0617bb3cfe7fd17563d3a0dc91631f71b84be24ae800113750f031d01fd05364b4f27f86f8dc3ad7407e1ae9e768154e3dde58e867129e2474547b408217964844858d056b31c374991b7f161f52f088b806e0f313d68a15c5401ed55b2b77deea586cb054dcd71af2ab6ab11e84b30c539345de3eb43fb7b3a3b48987c3bfa70655d599f2e31d12ad23cc96e86d380bfda812feff3dd3024292916907022891e119bfc3ed9c25546cd19fc992d8a61e6059ca3ce7802af1118756620b87a7242bd83897c94dd5a36ed40fc0f34c2c93110b37d17dd96a22062590bcdb546742ef7218adccc5ad28f4fce6ecf705835f4113d82ea533903aec8c3820fe4b4715f37e20cebc1e71519aa0b240b4840aa4fdcfb52467fedd8f4d1f9bc33ee114f3ef85f5fdb09ca884af388ad3adf84c793f386efe6ff8a46ed81e5d45a37c25cd80f2d7363f43ae45e3772c0df89f11447939806c096ef933a13944f0890d887c2e5bbb6b12ea950b09b8fe425289377352f35f84cc4dcd4d7a449489fa9251c03113489225809cdf3cb63475f10d341709371c6fd4bb7a949483d1bc2b31ddf4d963a07de7ea5c3fee9a0e33f0769f2faa40612a546974bde0b7339179e4124a447bd42879ccda5c8ad1819c53 Signature = 52ba9658a1a0b3e98ed5209e393e420066a37d3714daa73d5c671d33075a5f5727fe4e081ee0fa3c2133dc953a2da620291371f00ccb57d8792eb596a2ff8101 Privkey = dd1a9774f7584d8589b19f92ab6939ac485602fe1644cee2f6f3cd60fbd58400 Pubkey = 4bea7d0b0f4bd590f9e3579f0c5fa4cef4d60a49d2c437a0aaead9d43a73d4a3 Msg = e5dc3ed26c1f693cf852465a05e3048b505db5116d9e31592205a9c3d4720bc10b6c20639a0ee2f0e147225b5b19ea511cfba0c21aac10715a2f232f10c2c8aad41112b6b012e75a4155f8c6926253ca2b4ddb7bfe7f86e90a53dbc0cba89e485ceca8fd26e50c7f282a253573cb0a8fa88cc44623e82e8fa2edb6cbc7538ac92c11e4c5b1ea5f68966d15d93c34f396d27572f864382ab76a7be65a557b139766368a207d98bc0c20926370dea27048160363ed85f4099e7cd66d12d0988cfc9e2f16aa565f8f33b39e978c0587371f92db5056317564411bd8a3b6fea09d3487aaf734034918ffed1c9fba7bdec6fe68876fc7360cc5629b92104027fe5759c5ab365354751e7969116c3b9a21b152330a96a9381af730d17822d78ad6ea860006915b5cab447a759372e05d495ebb328e75d248daa02f5d2eb978d2710cf1c5fb824876770e32ca6de2c730564892415bcb53e5981d707add961c5f37fdafa1399af8aea960458d2ca310553f7c9866ccbe8e9d88e08a446872ea66fc308c824514b7dace0334db735e6f14c85b5e619a5d605648a881e876c78dbe0657233d4f7f3bfddf63b445311d6abc476347ec4fb43c8946f9d17c369381d1c564ffcfe2dc7b4726fd57387f0b44db8ef95a0b4e32a7bedf319e53a9e7126c2811f9829d1f4ae9abd9d5f42efef2075f47051c63a4f8202040ec4723686382c6033127c1fbfff4bc82373508752d431dc473f52ddeab0342dc4f5447f8f25738ef65d78556 Signature = 1959bde0a697a63993ec47d158223739fe65871fa05870d7de0d38086591202a51b174d1c6182808c6ce62631d81dba34ebed4af2f29b06c00a57a3cb6663606 Privkey = 66f5ea8cdb95ee1a75e32467d7c83c59447742c85ddd499c43c08673e149053a Pubkey = a8ad04b9c144b97fe867374d4fe57d7ec0c249183e43bdfb5d52644e7fbe1df3 Msg = c0d01dceb0a2d17191101879abb093fb077571b521be7b93a117c696c0872f70ea1139ab628329ee5655fc0aa77e8111d2fc884748c1f267b9eb09dc26f57fc402d61ba36f63f4d589aae63c76eeee15bf0f9e2dcde4e4e3e78fc6c29e3a93f3ff0e9a6e0b356645953890debf62dbeaf4905178d4f0a5a592c19294eeba7c21cf8f1bb3f4512187376de72f1136a48ac2dfaf32d0f37de064592592b6e1bc0c512cf4d2d85d16797853a80933b09c2f7bfb9e54a69e51a8e423a91c3e5fdeb4790533e87a4b1c0e0e23a9db9573ac17ab6ec7014d8b7c4486e15725f8d264eea3050e835ae0ac449db334502a6d97358fa859106ad0f6f4295f2344920adf9355a6949d8d145c25628a46a104ca099bd9dde941119c83820cdc2cb2d09722694901043c37cf0ae879be2030d0373158b9c4b0718298be45f630f6fcdc190f7b2926d87655a18bb797ac50757fcd3655c9e41d5163293d9a13d984f591f75b7e4e5cadb64c4c9fdfef76cab69381d0f60b483f804bb3b33364df8cffacb3c9b13ff4c8d8d4ea40766a7d42d8256c6b1c11c191daba1b8ef21593e47b18858ec19d817358678d8548ff1535d5fcf4414b6a11d34a3742f8d7149fa681383a9408887f1c0a98ed521e72793277824d6f746d49b63d444e312e6d9b986611258196a5b012b88faa29f9a6c67ed25df87b2dbf0dbd2dc3080c5b8d15a37d34729098ed0de92d75807429b2cae5d7283c4e5c9bd196d1ad436c7c34f3c9466e5cb3196b443f4b Signature = ec5c7e8392fa8b61bc829681866e45ac8be4b5b7b6a822c1bcd0f2cc2c8c44c33cf83fa42d43a2f1884141b4a59aaff47f9be07e632e2018759324eac9d14900 Privkey = ed2558e5c56784bcfb4f4ddea3c0dfbef8d96ff1cabf158ec4abe60aff66999e Pubkey = 1edc991012ac6f888fa7e6045777e9ba1d4c03c40292d2da6b722b4ad0a3ed74 Msg = 2c6433e9bfbf4cfd4e071f15ce6b129d780a4b3de014fac034e0d44ef772e2c8b0d6a3481d7b3ddeb237632673553313deac1efafe3702a7a4411e12bd341e8d8e96c59c5e30c36807a8385a538e9b66907d6a528400bd9f95eedc5216b28fd7437d8f4a029fdbdc7c938e4eb9812fec05ea693229629ace6acc7af6ba4c238e7722f312f7896b004922f7067ede106f8e70154d783fb41291f3c7e2e4826045b5741bcb4a8838f87a32e0049704e9b53234c224ff898a756e529134c1a9bf50fd029819b2238b60b2aec1128f34d21f9d66983bed398659d808b67a2e501b5a1f25f71f0f0c1eb2fea0ab42d82ff3bc9358bb20c27520c144cf2116f4a49cbc61994d2d710546694c4f602dc406e0b0c27e5f5e64667e95c2ec9df2d6529cf53622ea10b956b345ec55b6c39a1e6ed88ae66e5b457179425d1a849037b07c46cf5f363301095837ce811bff4960bf9cbd15201c1b6740bd70102140744c3327aca9d6d6d154936798ac381fa639db436ee8165667d538a6c74a233c124bf604fdad51984c4170b8200d2df73c29bb1e376affc314dde3e86af9d2c2e6c3a6524d321bce93e21fc965564faf77d0cd1accb4d7629485f564c79f4d8a2fdefb465454028c6dd1428042805370743363bb18476a3f2320db2589c72133cf5e29dafb7d07aa69a9b581bab5a83f403eef917afa14b764c39a13c0c5ea7019d2fdfbd7f3f7d40eb63b2a084da921895fe48f4fd594017f82569b467ab901169eb5da9c40171d5f Signature = ab9e01166524fd288e5c689e56d730d4983000551030493334a3984e2223dc9f7a5b910c61760c6157990a4c335e348e3a7bc8223e09c10c5e520c8d61aff500 Privkey = b72798b811e2338431256d2480fe7a3663acecbbe6e6c1b9191e9d9a22447940 Pubkey = ce491daad296b55727b09513df02ba5928a371737cd35841e5f735acab7c5df8 Msg = a5d46298b0790610aedc0970fea2a7075081847266f22f12478b93d7e674c6c517f3c14ed061269d170ac31e2a64f9754a565bac1dd9757322c11132e7bbee5f32818e0e3063ab64e552d09b0fd1757639b9b9d1c770016b677465872b669dd48be038665751674dd2f40a966a26748fd3e5dbfd92265eb936f55b094286c010629904347cb4c526e377470aa96e8169a6f211633807a50030e7ff68e38911b3555e728ed8590b2dc45fea69945cc0c9a3d3e6c954b3e80106a5c91d3d22e89e8c0e1de902058e9cd0f8ce806eac4f893ee0429900fb5487b8fd36dbdcb34f2d54fc6cc74a923951b863da70f1b692bf0438484366cd85eeb880b279f8fca9d3242c558330f1ca57c6a58608cdbc0773e16082bca964ddc40347da8a36b2a9328c2f46609e092fd64b4134eee1d099813e1246489e8ee5b19b3d3b891c28f30b38b6a28ec1d3e9b005dec9c63f8b9813bc1de4aaf995f1779dded15c7a430d70ca46e7cafd4e9a543804446ab0807d64f255e201ef428a474dae8a0a75021b62ad3988ffb81cd8221b243085a0ad046fdc16c67f17b9f81820095953a5b98acbdf93ebcf80bc9c99af5fbffacb61a9251c5aafdb22b1129bfc60c98e0f175263bdf93dc9a08b8efc2e8cdaf0f83d6c49ec901645eac5a4ff63385a6f1af2071897662a372219c9301f545a2ebb8f5917db7f29ca13fc861af38d90c35c03ac9184c122e57b057cde426fd76dca79e25e64dbb41c8414a0450da4905b902ae98d2da4ba792801 Signature = dcfc6fd47799fec772c2099b3c6437246c3ad07229fc740e05311a206b18b02ecdb026c926f49c6552e347fd35dfde06cb639a797c50612f98e2478a92aaf609 Privkey = 1fe7327ea907d3ff179b117811d30193fcba4c347b90657feed98deeecda9ac9 Pubkey = eef301b16fd7bf3c7b640bf5ee8700ac5a87169eab5f56015b3f499d955e07eb Msg = 19a832f26fbb0239f0d9d26a2ebded2403c2a406dd1f68318d677afa64f35043316a5efd729783c7f9d18c09824614652091886cc954be9f9312d4586bf36f3035ac703438b0cfe3dec5077813c710d1447561ab6157bc7ad5eab5b0c0afdcc9db77e66fa8071366829c501096c3d3a938218a6e4207109d1eb81f7d88bd6fbb2aefb1adef3594aae57c46b7b984db9468cd962c6184fb976f0e2aa84152deb1c76aea75ae488442943a80ba7d98a28cb864b5e87cdb284ad6e8d7aadc6b75d69d3bd345783b3ebb676ff95d7b4191e599851c9628835c7c01197e7c8f86f9c8fb49fe3e28458ba9b0236219bd46c28df6532496994ac9ba733c0105a02a269a2be8b7cb40074b881602ef9247052de9d637089188bd4c185ccae258a2ae9856a2cbf8451117683ce341f8096e1d91e874c5cb8a4e0939eb77373a9a0eb791645b8f5460472d669d8014681a5e778706cb5566bbd4727d1716b23c620d228b5d4dc2b352b423931f8a7e8fb59edad8ae42458729861a98e0c850a77ed655e7fcfe4fe36f9772df1ac3c643ad31db5630d571df9fcc9c50de7622108411962bbf72defbf49e997059c7311bd9ddd5b338a9851938d37e7a262108a291e2016803bbeff4f9c776125ceb7e7272b51c7c33461d8089f8408d8dda92506d5002084d4f414d8a4d28d3694c88630e31801990d95271cef47aa5c263f97b7daca1788701436329b5bfaf72653c166db087708130c5c0d78cc4e9064f860680271afe4c409853c2fad675 Signature = 9c7fdb53fd606bc7c9c223fe9431e1ad009546d00098812a495197f2541e87f8d6f5da22ecefcbb7da56662a7309d10a6c4a4f7f299278d51bbd11e0cc1b8709 Privkey = 5f9dcd93fb140610b0e211b39addb1eb87ba97804877afbcc381388cad650845 Pubkey = 182a237d878c581933332b4178b67ec408b3194d44e4e69392ef800b267c2949 Msg = c38b874d3ff010fff1a6613bfa134257b24833cb536de3e74992c3cb01fe3bbdeed97dc3c4596fa44061442bd31a9d4aa8c81e34ad9888718206635509b133b1ba69cb1aa0e75c7a1893c080161d26152acef40f6ef4210e952a49828b5cdde804bcb536cdc349a8e831b4b69d3785a76bd9fb27080565972d0b8fbd16f3f960a6bf3ba0c5b9c404967ec1affe59b8c4ecc650fdde1cb06b70595ad4d325da0fab4c5540a7a8d5ebeacc4e99bd0dc96bde82f2bd7d9586308465e55b1cc388d750486bdd5c7264d54f5614d48726d99e44d7778d9ed0323958ab9858e2b25df2bf994ba3e625e2803b6c6931e7a9926f1e61ed862403ce392ab83b7d1b66085dcc06d82dbf176d016d9f44cdcb5072d004591e92d0459ef05a51b8f54ba17251e16621ebb753e5b1590c02d21e40f4b75eee4602860b9741fbbc0d2e385b8daca83cce68c34a99bde6a60d13ba64347d0a38d64b2ade250f38852c4eda2e2e4f303c3de1a8a9d4ab3300c9e63622879fc8537ffc63b18561fa1fff65531241515a62bb9b08b80af37667a601ae04171793cc83b11adf9c30ca9f4dabc7b401e16a1814cfc750248cc2f77e03f9c4334465ff6a2c83cbb56db4b734751043832c4000972ee3232f929f23337eba5e651e34cbddfe68ba219b632e7acdbd4630a031bf1689fbbc7fbbb210dbf25ee87e2ef2b3cbaf8d9ebd8fc92c3a58d3c05b1385a76c87791d7cd3741b71b6c329de9a9d7508a0c156a9521a9020563099a82b8770ae9a944a7e94 Signature = c1915e052b664797e0d5faadc78f2a009d6fbcfde03f3aaad59b9f4588e7fc3b21990c5208d3d76b4aa95bd934e88d3c98c591930a59de2a056701d9f7577400 Privkey = 925ebe04c6eac49b26738d6c1300f31fd4828478cbe97dab18bb889642e1e110 Pubkey = cd7231b6eb74e1fe9f926f00d8de2c513d49640525b0795cab893d0c8929e3e0 Msg = e6c0bad23a92ae8b1d85778288157ac6c617c63363341d777870341bb10a8d3dfc89be4f55ad4f64e83bf2499b69fdf72174d2844e6bd289daaa035fec5bf7cf45522119dc7a8c811d79578c5bb0f6d34db507ad1fb6dbfff997b79dacfb3da50a415e350c998c0a02800aa50ffdfe5f4276d8e6bb82ebf047fe48711daf7a893bdc7537bdaedf3dcb4dec5d24586811f59b25b19e83ca61e5592fedc08ca54473cea2ec121baa0e77fb2d9d765657de67980ed57f2f177858b6decf84ff90212d9647f41eed9b9d0ea3d8d621e4bb4041acc5146e96dfcf14ea962d30c8ccb39ea2be958c9b8774451bfeb7ddce716e94923cc85fbd3a3130780e2b3b2bb76da5341912a4e994cafa19bba19732f2ea402d71d3d8a969679b9d104243d9839c69ee9e955e1c60449788d1f4f6651f4bc9b94d73522ec0cf72cacfcf19f1f03ad6232104b55cbb8b5bb1e21344713d482742d6abc5a957174f623b8495272cc1e2b8315e5c80f947f500c83d8544f7cd4f65348949ef4420d7fc831fa4ae2ee18dbba614925ce1d767c177a626c4527a8154b57292186b044cbf92894253b00fd9343f9e697b1412eba43597eb72a669aaa2d77eacb968c20fe19505a38074158621b606f77d97bc6ebe50e7589293db27fc7dfe631a4bee83b22682a77328c36d9d7d1d891d65217cc47864f680dc8b5fd1a01a0f7c34430f77060b691a1ad213d22868e61bbd38f43f0c8b4da68a58318666c099766170c2db766aaf417f556cc9a0a3934e9fcef1 Signature = 2c4d69bed5ad8b9584d849cf3df2bac72282b5f30de266b14f533ca96e9550c4b854c154bdc17aa880cf001a6454ffafaa2e50178de21216ed126b63f77f2d02 Privkey = 4dd3b478ebdc59472bab14a8cdd0c2fdac5723ee04dd8917c7cfe7a536485c77 Pubkey = 5bccb37e68c234bead49337de208afbaf611811d965859a06d31301247d66acf Msg = 1cdbd28556ec44e8705afda92bd5a53f95d8fe8b0ffe463373633316c52274c11edcd61551e3199e494dff6d906a739e7b324303fc47827e56def0bdcc46b816017c712305370263babd2c71be478f41ce30b1df63bedd3b2e6a519c53df515852c4137bc1aca49bf4c4631fd6564657d11cd83ea73cc3d0cf9e3b3c3e7ca99b4f12a9c9b67c8798148e0a0dc1ef8bf58642a14f97a572135514c10b19aabec25a9c6b35aa4034a57aae1b6d05bde2b6330f251d78db0993f0ca4c26386e3489a2092833b8acbbc4f4917fd3093df582fff71ece219d3672455582609c0db8d96a70fc8aed6798de54bfb2b3ee6c5d328db163593f58019f38f339fd3753f896a4a2cca8c1400a77ea391935f34e2639c560860810bbbe4be1d16e012c11490aa84f2964c877c293b300f43d379f3eba9af391dee510856a4ddcf76e0a0ae06a6a7c0f9c5e3fa1b8354fe8977b4ea3b20661491fa4613ba62f556d5d5da8213d0121de2c8725df0aae048ac891abbc06bdcef3c3effdf5a31749476f814db9457945f0d91e14080056be921a16aa964a9298221b157594973e32969993310c8707e19f3143abc4fda7c8ad0160acf031aba652801aa81a016b3137039e27d6738d02800a93a86f9f5585c518dfa9e7d8ac727f37437e56d2788386e11653a04e165169f903972a01484751e7cb38632590ec80d5fce4541601a0e095785a9ee8d359edf26b9946e798da5998cbb736f94eb713463f79f561759bbcb4c4ac693cabf2e1e036b2d0b0879a Signature = 5788e79e843bde9ef11a9dfac970196a567c6308c348e5174b387795046d590a47491fd71d97aeaa78c1615971b83490e8592820f9592ac76269b9d2ba702901 Privkey = 074d9218c1217e75823c90e010484c2adb88ecccd2bdf0120aa3edffcfcbd4bf Pubkey = 3735ad1919033d1617b85bda04b16121da1d861b404154fa961d4946e55ecd83 Msg = 6b5aa40e9167bfdb847daa7d2786e28e7533e1d6ac53beb6f69b5953795a2bf59bbf7d141926968f50969bad742a4fb579d3250fb1be4c57ebf4f9112c70cd9f72a00db1c8896fe2b5bda7c7030f497c0b001ea25ba0d447f08c36db8b907c2f2abbbb620d3e8a2c66e4171285adcaadd1c14fe239bc595f098396aa8780ffb80fe1446a07001ec234d82abdcd8100793915b0b3f80d84e20e51eabc797806f3be8108a4f437550b06694050a82931ac40c0a48977edf6ced2428d7cfea8205506de86408065d1a19870fa33a7081037b3ee4491b6e7f3d10b14a30c209159a1c81231a35f0365b47d3e0da04a32c95d98333c44f572cdaaa905d069197f6e861b5dfcdfb9db6c7b0d0cb00f37c916a1c4c0b8985b09f334095e1283edfdd4e62a2941099a2b693696604d994311e3d5f6106683e1d7a1c7e53df7b790947a9a801a0ccd484395f6cbfd9ca4d9804f18d52bb0f946d1a89f97a6fb0680a8c4c057b6062b2b9de7c0374879b8a6a6d2c10aef780508eb28bb569a08350944c82f6ef28db2304db697c3ae1af43a500b0b974803e9f46ea2a02e85ed27dda616d24d6db3cc4f5aed8240b1aea3dcf69dee5f14f95e6e72987bbe6189bc2045f0d783a7b47bfc19830bc7f4e798abe90245fbd43f37c3f036d1cbf1e73dcb1d9daa87379b1106973481a215c1f4f46c1603a5d5cd97b7076f1f5dc789aa6a71e72ef54ed328a4ab64340539ffd164d0ec645f322d1bc37112dc08d8c8079d19d37abb2353f48b5c492f806ed2 Signature = b1f71c3bd1b6bec43337e26dee655a8d5f4a8dad84a51184b775b686fad31d8029e3876927f9576e90c3624875fc0029a5c10a8a0af75d7a880c6844a4a83a00 Privkey = d2ea2dff7af0ba2a6bed7f6cc68c0df664a6b10ce801c42ed5bbe617bcc8b84a Pubkey = ab44706344026ed35e21982964f7b4dbbbe207fd27c46799701c19a4d88d1d72 Msg = 03ab5daebc6e70d352977932a03107879bd55dafd0c6ba7ad9697a17b127b3a74a3eaebabd0f8eeebfc0483d63fedde52deb46a3752449c9c4495c51a1c91f57e3ad2e6d01a13d0c470c5291b8e912288340970fbb85787b8b376d72175250e8cd90c07888bfef5ebf5086c8ff2abcdd12d214b9c45d120873b4602e57a6aab0b828d1084dffaa3651ee35662695b7f3433f4ab530c29ac6cc5bb43eccd1b6898b9ef7aec6d5aec68d5c1114bb5df7820966594c994d640891b8f2dc5d25638de43549d86d34306ff3f574575116405b9e8e286ee0cd978a76002c4435feaac6e84eae1654f339a567d8d04fcfa3eb6a04b9adc666021300e9ee5972b3df5d4d0dd4bf7921dc98de82cef2d1b1d61b797fc9968e118484c41342416ddc6adc4ee5d687d94a40ce572f42a2048668c175cf7b1f24c4efd020554fc6f642e14a57baec23e95c2514306d0a6d33648841497eac48eabd96d04731bab08bf5ea9d43e0cf9a37faafa732869d68e7d5fe6954f8a319ef55da1e178e43e84a3b9aa3ad00c29b1d161163df4b79f288e9391d70a2f8813d66622e8ac333fa6aa5311eabec383ba4cc122815de008877efbe6e12c322c975434afad173ebe24203d916d57578bd2bcacc78f6e2564513f8d113a833c2c226eb97ba2e23361a5d02664ab377f964c4300be2d77b62d9240823a09884df307eff3be5664d72d11ad513e1bc5610dbfd1009db39f0cbfe470555ec1b56b871670793d3b704fb06ee950b1ad2a4d7297ca58bbad810c3fad4 Signature = 9abdb9dd2ab77b6f5e1b91ba0b613f5f360efb500d3fe99290ef7ca14bd2b330f405a4f7dcdaef4923d3111d40bf0320353386f634b40de6f04de9190ad51c08 Privkey = 7a60cdf1870460de8ae7781176d5127e71207faf2f210bd4dc547385b667f2f2 Pubkey = ead67a9cf34d0ff14e79afa46f2dc996e9ac0e3e076322fbb4009767b133f01b Msg = 9dc023a525d01ba3513798b738c79162926ebccc0adf1e57ac47c20dea6ce1375c3d2aaa1733b7f0c3bd945c335ff3576112bbdc10b6783ba654e8c61047f2773aa229bf846922a89c6a73d5f1051e8d96ed36d7d6747e063a7ac602f19fc52e021a4bbc28b03514fbd51c7b3fd659f12d547d0592dd09f873c9ecc6439c7e931ad0e4856be31c605def2ed9b5d13c5942b2f325397dac6c9760e9b1bb0c06f713cb920c234bccfee9f0b85dd020f7988f3be1cc66e9e51babe2fee237eb84ec7eff9409aa91c194e30db1e065015955de9746bba03f7edf9a587512409a4161fa77ea62ccf431602dcdcf365ed6bf0aeddd32f7c844e3a34d266e28382f4062fd4d6f8214252104d643a9bfd8071716371ccbb54c8cc8db79add65bcbcea0d080d8402803fe232df70f76577247a63d5583bbd5642767bc63f3c5a7bb3a47eb12984e4541f41fdb55869a08fade66c20f69a5a9de25f6b36ba18ace5b4ac336bb2a8ebf630ad03e8bb8731d01e84b91d024d117459a74892e93d53b61e6b8068e4f04b4181f0387b4567ccd45e1b8718a2d7d787872f3dcf87a15935ad7daaa744ed68a28666a51a10d39fc139cdfe9a6873076f7c425009c38faee135e513207b06e7ba35685f5072da34b6045b57cd5d1b1a1fdf017b8aa8ebd27522bc95e47908734e41722a767905c5ecc30c72481b6c12bf4ace94d5bb3a3155691b7075b40ebf5968fdd903d8fd3cc50b8d6464859b10f755132c6d9b6dad1d6f14c4185b264d3497a4e549877fe946e Signature = b2e08142bdd62b786592c091f5fe6a9b7f30ce134c3b236fbc6dfe6734f88270ac58f6d74b4fd99c22451ca465a42c006db25af215ed241af1189627c6050f00 Privkey = 3379d25c1117cf802ec79c06575d18e6bece4c7093dd43fdee03685c70b2fa9f Pubkey = 8525156fe29fc2fbf661ba50182be20c8998d941493d5933dca4d8b41fb442d5 Msg = 7acdb39f1226bd3abffa50350a1497d761f8f0aaefbfbbbb925ff563e38976aa172d407b61ffdfb1cd538a4cd000b57818a0bc92c0e0cd0a5abfcf578300f5f4e6cefa267275d17845da7066fd4e18010027960cd395e682ad71af349bbdad5ebaa0f11a7761e19ea1bef6610743164b17141453b472ae2c8f36ce6b080f1c0745352454ce5aeae11c9d75de3c08004265fc4ca80d33b26eae1400dfd8977bf723a616daeb6d42199010b73e193ab72a58bdd248a7f4111ca50c1de646bfea7b4d5baf0f93dd973ee93649e21ec0c6c4fcca8cd6ff69df761612021d85ff1fb2a95337da4805a76d347ee71ef19c0dffb59f15f650293abb9721053f7406905ae683f96c83a3a7447b1afb14e1208c639f37a9750ba21da5552cc204eac453ca036282f7e0961093c39ec118138dcf71cf2d28fb96a24962b52d3393f880653bcba2c9b9d57b77c522f421fcf5ad75fba9cf3389b123aa97521713fff88467deb8c8991d4b57c1438170537cb50cdcc657e50e5c480e12c0d44939b6399944e7c71e186c2abb81fc57348836d5e57b72b224a6b71b6caf721aca73478cb6cf5fb89071ae3a398202dbb38c30812563bb9a23406657a956d305a3449a60cc8641b62175a7170c23bd5a25f0f12e15a7ed91fada6a4a2f0e7b155a3d6485ec03ce6e34df7e216240bb28a2dd732ff790d2286e200b33c29a31a5e19ad2cd02974badc4bc22deb7504c15241fc1060c8acef4fbb25ec7602fce36a27bb87b6e6423e6b4f6e36fc76d125de6be7aef5a Signature = 4c36bfc81eef00b9cb3ab514c6d451b993361e09a4be4b5040926feb0e0d9b52f03de468e7bad83f379154bf2c437a71f754f3f40798eeebd62e55f2be771403 Privkey = ef38c3fc74f054ae43e8d29d6ba6dc80b5af848270d4af58844d24bcf987414e Pubkey = 0ae1478b05fb329965ea0fa928dcbe81a0bdbb6ff66c811671635e4388888051 Msg = bf290db3dda8763937ae4c83746705327295c2c248068f5ab85c8b5d756f4e3e34062b5549387261476bcbd1e7331990f11910d11f94607c2b71f65b771aacabdc10f42ae918dd2594ac71051c85b330779c47af00a5b98191b56cbcf7efe41a27e87c677168c8abe9496eb2e7abbd0b1604286ed1a1b18d264d733de87d0d3f8055528c4d426d7f8e6ed024a74140abd354007962a2a97a5c2ff976546a8d1ac4924c09223d348ddcd8710a3799f91bb870b3f46d51f1e7f6892d6b08b991748a037a867ecc39ee8d6462a7614488edd3c2ba615ca2e37854889441b13dc835c36b38653f6598616f35783e2e158384bb931c901b703acb3991fb7aa5ba69d9a5bd0570242961a71a52470315e982e341a61c64a619bd16fe8119aae0d7503ce7d7e926146b91c2892f131669d1e39e5b75e9c72452618099a57dc2ee377be65875ee01bb88ed526fc394e2f5c8127a5f69125e67385ef94b1f33ad52629d720e31c02ae0b582339ff0f0bb07ff2b030f48fa7b692716501ad7773ad3151204a2a540fa9436bdd4202a157309ec36cecbe58b33eff557fd33e03fd3eb19009bd7a2dea9efeef8785567aab2a4c98bd1f2a81011b343a9f20c44c577a452fd54ba21029d4706813b2987c76bb242ab2620843c2260b669ad358efee7f9830dc9c7d478a2de4a2cf8c43da770e288e2edbb6d73bcf2ecb023de6b2dcc6b166e87a385eb0adc305665c5bfa57f250fe223ad7ff4518de39c79e87dc101a9faa6821a74442bfcfdf0a9e63a509e2a2e76 Signature = 1d3ac6b6bf18ab5309148799485b276d20401c6af5f9b2f6032395a3c2f4b673b7140c07cc26f4fc56a5ee00b0746b2a80da6fdad17edd114920101d2c89c30e Privkey = 7e7b39af69380cf44660e2c1ff308334e8250feeb88be0d43aabe5e68b8ef171 Pubkey = ccef9daed92523533d4a2dab6d2419f6d08604db64ce37e32904ac77b9b4a01c Msg = d4a3976dbf8320185667b5a8236640f2ebc9e45e6d5f2a8d92997927dd9bc5db95f44634bd654eefece10d99d92b46715791645004accc6d140f32a1c872e54aa9a7493af94588b7bb400d94d458d43292307c5a1a3882a1c8a6a78d9a945f79d64b3294a28c3d59d82022b009cc4d2da93a16b071c9ab8ee9a3663d72ed344f151d68c666a4b49652d97a46d142a4741127f3c57f1551c40976cd1381a82aeae7bc5adb398720eb433f0899487ed2378446b1a8dc6a33fcd4537a05fb603ec0a90a27532300242b2000108621b65ab000bc06381530f690d7e56f81604dacff1910715040410aa1f944c92dd9bbaa5bd08ea00c8442df94f085eb3de97335b6005e6f84f823d43470ab1c67da12ad449936c6b55f9ffd203dfd6e3f33309e8a9945a59320e66734c79c4814dba5a1c14095c62925a1e1733efd94817a25ef9e479dd9ccde6ca8adb7a8053c1b55134697504af8053d595b844640b61e93168075468450eb5de0358697c104afa6a3796a509c26b4c277c23fff42df146de55e95d0d4b80a7aa177d99227ecb2a0594deedebb9cafb1a458aca8072cc7d77c7175f610ca300efd7af9388346498c22991564500e0b0aa4d2946f18e6f5375a848286f36954c1ca22684c6928c2a25c7fe21aba4a7111d7e05bc8d70b3dcb4f6aaec064845eef5525f85024c2570f3b78698c4bcec0d71aad5378d8819e1fac44ee416370212dbaaae54d2af2939b82cbaae7f42ff485d45b3acc21090f5ba41ec0da309e52ef2838d1de471e0b7cf985 Signature = 1062a2dc9cd5379675c04f5e21338dcfb77dfbabcedd62b2607100d7649a05e80871e96123214f80f4f73b0d9b06e2d31f56119cea69da2347da84a275b7b207 Privkey = a9048af0c20a125f5d39c50f22b805ae742cf64f1fe8dfbe8dfdaa511aaa576f Pubkey = 158655db94b15ca72983877b6db231a5843df5dbca2810a7e496fb59ab7104ca Msg = 8eef2d9f5d59709959c924f87c22789767393a155d5c87de488cef50b7bf7da870e3adc300aee6603b2ef08764d99d9e7751e5dce92aaa71aa18a69cc823134e8552d959a0dbb41117e0a593c31833b6ec2172ddafaf7848ddd18d28d0d4ed33237ec804f65938aed8e8a3280d42e353d01be0187b1301f83d89849067b04a9031f7e0f33e3416240c53d9265ed0663959971f417cb5f210cdc5aebcb5e1db7dfb82df435876a6e98f415b0df869f0d8851535375645eef70faec744ee0dc3acbcb040f68d502c2c62c8db45ebe54854a4b36f43feb49a6d1c2c2ea79914a7c23c60baaa67cb47b2178e12dce76b004c87b7b8346efadf380b9e1e41f63148da51781d75cec040e4268820211f3c462501d80899894e79d618de42461d785aeace53ae14b79d33501ed5629bbdd07128156db0725f5b4bed593a952947830384f61df00ee0aa099099c3cd9765a9c1c7e8a6a83430b8d9867c8e17920ad0ff64d8cd2ff5f114388ce6d43eec1715d035f022fa97969e1a5dd9f58d896b17c1221c9e6c8555597235eeda6ec41b0c117612b00c5f0ed1816b057363582707a8aa0d98d4d4be5e8fa32d6c9d278221ef3067b8ba1516d9e051d2f68b7d1b151f74a3534e7812c051e5f2b63b3035f8e5703b5f68fd2d65bb7565e8aa67bfd2a12caf0bc5481197a9ff89d77df7a0e9655ef029b43dd906d0b888e313ae9d1c7e9368a01352d00c6680dd0f1f574a5877348a7ea2c0b9e8e2727510bf0c9ef744f369eb3c6c4fc16adeb6e1945be8287d0f30 Signature = 18a312b20d86ac339a58ef2b852d467c23bb2cb1227cb15338af07fd04b9a711e856ee5b2c82e366c17f861713d1088c1b2144d1c37d05bdc00d739673852000 Privkey = f8c9183f23105fad0c6e5103358b583288f9ff6c7dfc91106d07987ff69ce1eb Pubkey = 4c79628c958cde0cc3cf686095b8a2f44b7193c616f51b21b670b038ce6f67ff Msg = b1d60595323ff3c844874190e1836e4101409cbceae28d5da81fad298fe47f6bdf44745b7cd0d37131c3ec365b92f5a1a69c09fe2d9e81da10cf19d85ff5ff26f9e7db9f0793b25ab26e6a74f44eb8c4f078eb7ad18e65a16210d5c844d3cef75f1daf44eee558f90e524a032b6cae6c8d23367c28ce1c75fc25ac87433977d597533c92ae65f2913a18907ac7d9543df24127743943fefd9cf83ed833f63ec8367233d897bfa12d466d2c4a9ad70d5a672fc10775ea2d204e636de7010788da271df03881a25c8dfa5af73ee559f81b529b35aa127fdc0ee8fd369c7a0436623986aa6407fa67a1420c46f3211ab84f84466dd58bb79508a1feb0a5a5dc3bb0c1b248098262a064f37bb2f019e290c60afaa1206651a2697caacc3ecc02ecfc077f272e8f75cea71c3bc3356d2b5807276f1955001cfe10a61716b4082bd6f84cae4bb0d9a4b75a4b5762f81079f19d7d19eaff8631c924885bd3a64e129f4cf6b79c7a9829665511e9d85c745eb22c1b7cb2a17a49b6285cce37b3de415940328323efe24a1a07ee87468f6510e42dd206fe7f09e3d433fb52156ae348383115648863e45bf6a371b17e70e19f9627d7f0a58b95c6a4788d5fd7862f1612c0347325b797651be30c3e1e60ea4ae60b5745a38b6a9d4eb4935d6f3cb8d71ad3f39adda5e42e2219de0d381909c9cd317dd4379421a2a84268a7ea7180a64c129be1e5e8fcbbf5ed659e9f7e763ce84f630d5407954f9f755750a6dbf9f7660717de8e2adc1e9ac9ee31654d1837cee39795 Signature = c6a8bc7a0d5c6185b6ecd6033e42321d5c871bf889be72bd54cc0083ed60a470b2cc0fb4682c894c75b0df95f1ecfbba2d5acef3e1aafe54b9f7e803a1d0150a Privkey = 16089a1b932f8d14995688b48dd841edae3da5cfd2cb16555306f3fe8bd3edb9 Pubkey = 9ecd9fdd7e0b923deff5d887b242585d9d41cd2c7c10f9c345b39f633f4ab903 Msg = 58500232388d9aa4b5faf85b0233247e717fd16840de9bfd0ef86e01e61302775513e224125e0d20420ea949f6c26425f70077911f9711310cd6fd8bff27cdea11480c73e8f8b3c37641e7e8dd8607c1640218fec80a020928b93d4d557ebe82ec0bb17538867d2cb14d44d3ea727fdd52820b0da944de21cd5da303d776fe99cbc2648365e6a0a98d4db150842661768be84c68507a5c45d207840b033537786cb21dadad5fbab9c5cfc1e3547de550d313631dd4fbb7ca8f71938627608d2ebf655db4325abf3ed504dc183058f9de1e449312d904c846a184a028f364c028b27eb4946427e31c21e1051df364d499f477bf51e7a8893183e5ecf77d513a1a76b1a6fdfb16be90d74be4c4345a4f9f87ee441a1022d67ee844789f21b0c31adcc0d95663cdfb40a895b922dce8069b932c802fd3ab1ef0ce6bffdcc5653b1cd5257e19a0951687e545faf4aa66065a55c4b4191e34e8047d6a4ab52d1b06c369a426ca2d16b51a0271f27f8d744c711fce3aad9d4ac038ee700e4e971b21ca489ff2b8c778a3721adf47c1ae5a41b9a27fa742fd0f18164ef3c26b8ae7d1fa29b7c0cc4683be65025c96537a12d5fcebbd05e930c3693ebbba0a78adf59d8a3b598a348eaa9f47caf531fe449652db5b20d68994e35afec2c25709055a1de26082e3912d497c647720a3f873621456e6a5b9eb613acb43b66d47d0b954c69e8fbf2c5e634c486e5724930e0b56a516940c8cb0e775274deff97cbb7759ce90a2b93e9efaa624e6b38a39849dca1df612736f Signature = 7878ab741ebae2747c7897cbb1d105482f37be2f5f91795232cdfbccc526608918e2756ddb7536b3680c162cf8a1ef38a341b9362bfe5d468b4bce21df234f0f Privkey = 94d50915144c7e7dd0f85fef87eddc2206c1569ed1431c8c5a153e32e1cb2fb7 Pubkey = 3bb098cf160f3aec3170b57d6add4f56739270e4b3a8ef7966ec30619b299102 Msg = 4d915f27332dd75051719a24ae8d0e9c30da790999e22d9b587ef20321bee4c07d0a12494ffe599f47f96925f5d92517fc3e5f041d0c709f2a9783125eeca6652997201c429aa6f1ce2f07a0d4a0a18cf20b3e9a4f7663ea5262cad8f949411b05ff5c5edd7b30b217d75d8c86c94e5f92c16734374e8cead61b0b27bb4bf5f43a313c1dd5b83e0ea933b6cadfedd7a64aa5dd5b5d02c695ea20e091fdaa72ef4e7ca40f38395be8bf7a255c6d06a632d7d785d9e047f232aa50fa14529f986f9ef9d7b580a03965b0154788822a225bb5ab3438b89a5c28744ab0bc0b2014e5796acb4935a81b02a04632acb88caa7e39e069c7c8e1758291094a53e362fcedaaa583eca766efebf69b38e8cde9ce58e012c60ec88e8c42beadfa838cfe440fa0c01d659c9634576d7d7a2d3a044f99c6e4263d4c0b374a388a2acf38eff29c777e9daa60d598035a7d9edf67a502c3f573207b119cacac3fa71e2a0207c601cc0dd637ef562bacc35c57042738f1f55815a5268082cd6a508292fa29e34e9645d87a1a2b6e58adb7f4a57fbb53e9213ef3dc873f29396258a1ea546fb5952ce343cee9bbb90c1cda72c65a7c8e40312b328e231920c233077dca34d04f9d89daa9a2f43459165fd102ff5643c7175230b39ec7c3c475650ef131609d3220f5a294a403b1e1c42cfa162cd426f0ae43fd6b7ab547a62b7d5f847403c4e5987953877158cfdee23c04f751c7c86d078e824ca63b5e65543e978b6b0cc689ef664412b01b8ff165e7dbde3c099bf4f34ebddcb4c4 Signature = 59a1ce55f5a6badc1b9391263620542cfcae87a0f2b9502250cfe4bdcbf76c461977c334a48d916edebd56c21ce217c35a6444cfbfd3b11a3d48fa2edb6eb40f Privkey = 0d81926f513db4b25dfa1e52b5dca678f828a61c7c913c828247c2eb0422b7d1 Pubkey = 0f32411ef91d4e4b6941dfcaab142ef3bec160983993a5262ccf27fadd2af890 Msg = a93837522f7ec2e93a2e4b4c8b46de926a81ada2d248bcd33b39b6c95fb62a61dbbeda1aa85a21d9b96a08510d8d3a658cf320a10928695999d2c0d605c7f95a12f56a8718507db0f497e3ead613132ab092cbf19d2260358630358d9b26e68d50ddae37c8af0bb7d2741fd2929c21279a78d10e2c5f3c5bf4a42a3617036d54743647765afd8cd910f81b38ced72390630ee68944a37d29c2fecada1cc59ec544075bdbc14c63c6234b884049000c27c73406035604fca8760b49a5e2109ef91285adc4ec48c819d62d948faca90f62cfaef0b07d6fe576d762bfd0eef94cf6b5332c4d422511607f2facc7ac046a59b9617e8383d1029cc91ac592b52084413032be841baa9bf96251a6bda671d4cd4b125da658a4e5a50f4428eebf2614fb0ce5febe80f721a5f4c0325506d27a8d31e33d86253870dd63c08edc7302b280e9b9bdc28beef05c7dcb30d4c162e9be832e1c785e37551218421eec852c4298213b2f27f8f8c706d391b9c69a56db7ce5d81548fca5fed456f2d8afd0b75f79f85868316f4a0921f0c6639926516b3c3e52a9cb22554546ef70e14c77ecbdcd5c0d59a81769b30d5d131f2fb449c996b8de8ac7f8084f8499e1a56f7cd29db6aaefccae8a60e75616a1f702c3bc8deaa1004a8dae0392a59cee54810c6e940eee25fb2e5d573267044b893ffde378fe75ac2613373d84a0ca8187af4a3358e50a994ed03367de645e10390fea4c33bb1a6c0c39858b8db4a69fe894a4223d45af69b36c6117c4dc25de49a63017002ba9ae551ef9 Signature = e0cb6c71ebf8d705e50cad9f0b8cba3ecf4b9e3793400092aa5b121e7dbbc8bea71df29528ca9b47abf87c198a8dc4e14d5180ce932dd2114a3cdaa5552cc205 Privkey = 6c8c53b56bbcb4c0a25dc40c18240b6a5c7576b89dde45ef13fb158ea17f8ed9 Pubkey = 238e51d6a44fa7ac64268801261ea35b62638a006cc452bddb9f16fc5803060c Msg = b60df2944ba015759802d3c587bcfebe521a7e77b9985b761c9676454d24a664af0b0d44225a557512e1c1cd7dd8335c8f6adf928e18f89fd5eedf6f411dcdaf996912e8c3e23d1cb95eca4b9e24e7539c3b98bf3d07ec251392096c19ac5374dcba526132b6d9bb8f6c859ce985d584c7bba5b02a81034b6d8b521bd280e50d77daa2b2413ed679834f8161d5d0573bdd476ac3cd0a3a7d8db45334e89c00ab66bc368a07b423e246434636272aa4e4637a5306b2c3397992781f30238de79ec104acc7200defad960883d391443e70efbd22f1cfceec5112fe9e8e13bb941c083468dd71ffca976cd51ce161793110ef00aff5ee2ccb7706a512b85beb94ac49d19afb6333655cf3aea535a6f9c75e034841e763c5a249b4704e1be78b0ecac6802c343c1b7e7b5770de4c93a3a79c46e6835da8ae5db3838e1796b564a480a4f290b60a1c63a725ff3fef434d2a0b3d8931978742b525c83bae6794ae64193794b370c289ba35ed79d37072a8dcfcadb46d5ffaeeba1bfd4f87d766b504e62b4acdd77446e79ba994d6dbf4765ebd74b0365100da56162c36fe5a95077f6b4265e81796b4a57443782970b96cb4569ba985c55fe3a718380bca39f16624f8e47cc63c1b6fa1bde1aeba9c51f94b702b13108cc1481d42e6fa981e3ebfe064d2dca7420c74595792312ae3fb9101d4b66d9916dfd6c13ae883e661c628228be9794cf60345076db26184b617e272298cd4183f27bd52d40510bb015d2097d4cc76e76c0a62bbfdaf53c7268775bbfbdb8870eb9bab Signature = 4bf1e7d49cd4d5c3c1fd4a4bc48ff6b6e52fd9510a411812296996e4fec56be44514c567d1d33477bd5dc083c3958bd95bfe599c153f21ae26252967b7326003 Privkey = 69b320fbd4774030a29767a0cc1550d10b749b44d619d41dce1146f7ac80a755 Pubkey = dc508a79c6b8ab866cd117a5a84dd9d931fda450bec29335344d0d219216d65e Msg = 217e33f88622c96f8d092c9e26664fe9efc0d8d2eb59a036fa464cee65ce4489caf903dce17afafbc4f18dc9bbfd6c1a4be7b83485a6ca947defb1d35125d0773962a344a38b6dca9a40c31c1c4eb2d7f6818f978e573d66b990921b92b777471a4f6f05477ebc353ace1d86b00cc251777aaf6af3aa1179bff78df5048e5ef29968670e535483568d6bb16da829568f81c799b9afd4aad6ef085252c0ce3ac01ac21a9ea69bd58eadc66968f55dee386b653f3334efc398ef3c37a38ce93b21f107cc54dec26f53fee5604eb09a36afe6b665b6324a84c7da7b7dd01d9278e472f15a5ce9ff0fd93d0aa0604dd2df8d5bf6a912734ec51de77f0ce099ba11670210a6a206106b0ede2ded858a6bc411e7613e6f80e1aa52c323e30fa849951cc9b776e4cc58c90cfc8f442df64151a7fd4a3dd61a4336da21d03944635d3fd667be741ef45b1f7cb276d9f4de8107de64582f7917c6eab38e0a8890a4bee48bc92617a361cc7b1d25e089453ce0a52544f868dcb3249de761e79df63efa0794e3c4618c554753ee281c52ac8ad78d5338f0dac360a769381bb4a39f190b887b4723806ac4a4f2ff304bc6f9337ab54c866e6ba51df50c43eab52e2b39794c9917e0c31433f03681d2f1d93a0436018caaae20206a3458ad6c037acb511ef128f6dcd05305f07049a13b6c6c3c5b8170f158c8f12d46e160931ba18bd59ae129ec07a0655fa482ebbd3b850d36b832bbb775f538e3c1b3a43ecf94ca630ca15d502813eed3e35e8fd23d2ab638600427d1597cb29da2a5 Signature = 697d4d897e0e2cc02bc1c2dda57f0dda620b37e861822bb7f1a701935e959ea0d8453f746fb92c087ed65d980eea1d6fdbf23e99b289aae0dcbb128ef836640a Privkey = 66da8b254a37067378f68138afedd66496596a0585524c716bde2b3124c3e7d1 Pubkey = 85bde28a922ab5eeaa4a6294521a2ccac0ef2303dcdf8c7fee228fb4552012e7 Msg = 3fae36638837d0edc8dcee517e43c488ed57fa6c9853a745aaedfb109ec1409fb8a2fe51d23e0dd9fbfd94f91c18e6114d808901bf617d2667ceebd205c5c66f5d7534fd2ec33dbfe580ad919f504204eaf242af8700b138cfbe0f372919c06b861a27d720d09df20f4fb7b748e718b0fc486dbdfcb694cb3f1420035ac1be55d31f30f997a043d04708a5c542ee37c0f7fe0b3211d18a87033dcb15c79e6681c4970593d32a13c48f0a3af8bfc136e0f9b56a123b86c4c640b650cb7dee9a89e82aeeee773b5cb032fca41c20c407328bfed29244e46055a83114614d3db56581604b115fba14f618e102a1e16cb036ea69df9275b977a0858118c91a34b9a8519bd0dac3b61434ea088f381ba08bc1583189a4a7c8b6ad18f732d74eff3acef4b6904df58c6469432151372df9327ae71a0f356c94468dcfc2e4a5c0e4ec0b166d90cd465f9260ebd6a7a62ce6c715bcc715be0c7e1f28c4456012d33177a7d4113c9a5a22acfaf2d6b63309078fc1b1baa8f36c7e866c1f972a6500a5eea79201651a7305208b6c93c492bc77cacbc99c9cded179e664a2f4e16938cc26fca8b433eb8012f7b3ad19ba1fb858fe4a00fb3d1f8fd0eddf0c37dcdb2e5d35c2546f22e8c0f8ce90e2df8abf24827a019b2c33fc590bbe712f019287002bc2217c0dc0931dc8ed8f50bb442f8b2de27857362ce5a9fd97f0fd1b2b9251cad2a4aca1a94de2e953902d7228142407443b1d517107648a7bab83074987d0978bc61d419bc84591c969c3d6f4e86fc4738737bc0558755c110a Signature = 4082a5bc730fb54b6bd0bcd2a044ed5d3d327dc19ceac8825e629b9e6423cb1c614236f097a6b73d473947cb81c4e270852ee5f13a5b03dc18e1c9c27a9a6802 Privkey = 276548290f3e0f900515dc63366c03fe0fc6ee130c21fb60a4df9cf464797cda Pubkey = 7e2a3578000a087edcc9e94fde509fc4be05ca0dd090df01ae1121123536f72a Msg = f0db442de29a7a1ded550d120002cc12abfff98b1f576d65bde16deaba687e4e0b0d5a8748d7503da2969c64d6a7c28d27b6c93ad257ce32ecdaee375f43fff97c432d453f7196c709c3bdfb7388d4d8eaf139f182940ce17b4552e2d20aed5557ba4d2acbf845730c0a66b45b40950baf6a946437af6c9e3b33a79e04dceae57c2a549542eabd216bf13948d41ffb9483fe29801fc8c1782840deeb3fb4da3192785bca13ed0a9eff57d6136bafbf9dec697b832447b2b6e730fa7f9995bac6b7832eaa09905ee49d465a5ee450f52d1a6d364c618144e886e8ef633dc79d0af893d16b3eeda0fefefd8759f2a0da1930170dd19eb78f0d7a7b74515403375a95bdbcce018bc1edb08d897bb798a95e7e86a52af3d9b8a4a14b0371d63498dcb2016248ebd0be800e9f21d549e5e0e7b4895ca5cb725a0cab27da8a8b1299be38a4260900ae10df5baba11ae2bab7179dd8453969429ccc4d416055f2bcb93c1cac6d7e804cf812df1462f22ee9e833a9769e8e677550402c4094df212fd2c5fcc09a72c7ce0077510073090d0e63db637d43d4c21f8619d34da5db08033f686ce8b8a0821222f95434ac4e6f703094edded6fb1b846e979650979d3c77453f40f7fee7c3e88a96fd1d702e81c2a4f3f3753c7964842dfd9d3958a743da063d1d648e51b210a28ed2487f14d5f1bc6f339b2dd17a661c39736da99e4a4f07360342d237e3813ea3998d66eb31a2d708af065c32b927f757c37a800660674e9717ba58f280eb2aa464fa74402108a5d5662e8d0feaf329687a Signature = 88a146261ad111c80fa4299577e710f6859cf0d1ca80e512a552c725b8384037eecf6465ce97585c9d660a41ab9104e5f7c9b2f8ec6fb21f1ddd50d65b9b660e Privkey = 972c0616556ef22c214868fdd822c55739e1f96a93ae83512afda9ca7aa74cd2 Pubkey = 9e1c6d4107f8ab8161c5db5b88a37ca1de9f4e291367abb1efc84f83f7076953 Msg = 8689e2f95c8fd50dc44664a18fb1a9f2c8f3ee73c0f9587ee28bfa35c9231c75bfd3d9534174e5ad3fa9f092f259942a0ff0ba2ca2cb59043d192ca8e3c8869bedd2354cbc5ac782d727c0b69407f68d1326df65a60c4d32f87f19a10f3d765ff923434f5511d134d397c4fef6bb1953abfce60827c359aa4b54f912aa8b17b83dcc7e3bcbc505ba046fe57c16dacf4ee2fad538bc06817c9b9d8dbc5f9d9bbf9f4a934f14a42c29e0e2f3a49f46b20ee76cfe20dea1e97450eb6a8fda048168dd827810207f005a3caa93ca11f4ee608a7a9355494313aec8d7075afc94c7cccc75c2319bb458c0ce373e9d007f753b33b52793d58496b2d25cd1dcd7832aac5ddb38f4db19c427219e1a0420ead47ba95ab6d89c65939041cc734c08eb6b476caf7fc76c598d947ff444b10770f62945ae65044f78098299e2626b638a7328d1b7daa5889e8db94bbff2ded62e14463760227c3f326ed493565ddf0a1761b8e4bb7d2410fa0fdbf35684397eefea95895889a0a9dffc5e02c092383b7ce74d2d90939916f26b71afd265f8bec74f0de247c9643905583df3cee23537d6b568c8338ce5fee42f7dd15dad5247f009acbfd5d769b6366959cd0ae150f58f7c80fa10d989ed90119372e5fea5da48a4e8ea9c727875dc4a2005b0dc2e3f697c0ce0a4bdb2f750c04fbc0c27d02dd8286e54c9c3959b6ffbdb1de2affe9e782651e5168a500afed037b3e1790ddd593851a6a6ccca9fffb4a99e27df43818871536ab04f14a06a1c7cb47bed6241ce7430ad3e640a726752fa06a9 Signature = 54dd06fbb3d7c63f8cdaf783c2d7bac16b4c826e2d1b1807c84e049f64e271b21cfa3e37c344260287805d718806b62c56b47f6d5c508125c9fb5d5ea35fd501 Privkey = e0405d37893e89f53811d6d446e1f193f51afa1bbba725f95eb48033424a2509 Pubkey = 45104d595e443e8ce654de9d655054bf0a99d35613d77d57454ca2d1c899b517 Msg = df58c4fd0702a20fafa3d1d4fe7d85938b120fc11e8d41b601f0e60e42236a49f126813bd512ee71359061e13eb314d417f56d6d560285fa8991213284c42bc2cef2dc937bdc0b5e9dc2269afab32db30e6849855951cfbc53ecfa01643863e0328995fe850c0db55421bfa564601b8c9db7552c7e6aa7adfa15a58021a84266e9595c65fca4a15fa70f55f5d212c9e277ffb830f4cad1861f3f495a9d672f5691310639c12dcd07e3ef17a23750bcb46b7ad7eac462eb512225f3be7e32f8f4987a11df341166062b43c63ab858a600497667fbb88e93c7e2e0aab41c09c023eb902ec3baf679e25b96e106921a914fd5de200a47889de23e7b65d0ccdf0c29036467a1210c0030309a2d04ec256d5a4d8b97d46a3e15f345b667170803cdacf6cb48add0a13462dd30fa062bd4566641da07d7f61e063686edd96bfe8f97b986b7c0e44249cd2d7317472999b8ee4ea80c902f3b188936712e89d8bf02ce8ae77b6b31abb0632065455ddd9f9d1cd953a4a49aac1a15169e687d4fd3f7c2edfb3aabc3b66155f7d315f8a294faddffdb4951367a0cb870759e85a838af66ba3fc103da2babc3f381696ef8882d85a8278d5fac3a72f16eb119ee9900b1fd986c2a9f94eed8e0d4f273697e4363a975ff6a7b80d5b4ec5355bf63b42b71cd4842401d38b5e00cc97bfda40e456653683bc8e6dade7dcf985a97b0b5776c4d72ca13a1474e4eb2eccfcd428786ddd0246d73a6377a79cb8da720e226c19489bd10cedde74b49fac2cfa207129c6a108aa164be9d809c4d31147360 Signature = 77ddd491ca662ebffb12f7f492d7fbc1a1b447f6c85998f2f7cc9adce67de63b6eebd08117845a0302f7349714ba9db2af58048b85837d7660ec3debeee2d00f Privkey = 5756e752dff69e3eed848e4a49c7a8baca12154f9431dec35626ef8d75a44514 Pubkey = 5910ef00a5b354143c46561da62c41aa13d29c18dc6153bf8e502e0114007728 Msg = eb2190a3219c792b6666b2752733ad9f86fc390155c4b438be196959383b25f3a749530d5a4b15ebe2c18d99178e6d45bb4aa2120f95a352e0406c63ac867248d9efba124231064873c82fe995dd031c7cbc7d15ec191fbb6c474dc4c777e8f457841eb4624841c152d15ede26e78479a6a25ffa335563f1064ef09558b910e2608418820f49554b670c6bab34d1d60984dea50ed6a375f45a74beadfb04bd9300bd594e2e20ea5d3052bb7ddc51a949a0047972682ebe66d38aac62927270de42150d58221d03b8ace3589933487bf23d29c5c2c843aefa2e1ca22f9d1680f80c766d143ce5ecef253a745cb71e72f6504ad911f7cb4a819cd074863a92706929a3142f8db7ac164102ac2ca0d2e19a725e1b5f81f443c73e0484f26a45a3aef84f1f3fa04a4ac695d2dab6efba456a281a3973cc186e680a66df521a4d1f9edf4dfb274a427097bf863281cfb0ed80f8d7676638d6cdac937843efbcfce91de1df6c52b594571b9315600e4b6552defb8437a807ba21298e3d972212ba314692917f40075311acd009395241b9f1b256c515735dc674f8e866d1eeb4c328548aee71231c4c9d5bd22e39de88d19fabf49f0b9869cbf835214b15522a93d3a5007b11f0b50e5228d4eebb4571b35da84f4f687e3f43793d54f3825b37a509ea564bdf217ff4adf6847bbea4316a1dbcc7448ecd5363eaabc128decf054ee1a0ee2d871979f8a63b2692b09f6e986a138e7f68f60aa426a1c9b01a4902e13b17bc8312410c28bed29b601b0fc9f3bc2d223f875251100f869c6b5844 Signature = 8157d8334ded1a32699b350ac0d4120028cd8ef8189448934850e50ee4999d8fa2cd257646d92fba5d662a823e62208ab4fbe01714a848a0b90b55adcd246902 Privkey = b904acb19e5cf872d3640cd18ddf3c0b6657e0117ce659dbf50259015d3fbf32 Pubkey = e04a8aa56d1818483b10d0a7c919e1d5d8001e35510e1ec62f7114dbe81ae0be Msg = 83f4124d5af955139b1bc5441e97c5fac491b4ea911407e15420a0347ed7fa1f8819e36c8ed5740c99d4505a78b619d560749af50b0573510816d61322cda976a5d4ca3205f5f0e60e759a5df1a0bdf36dfe9717906ac57cbfc970ab43b6fa18e6c0006c84fc7254470a0b774727bf5f8e679423a531e41cb5310f9bcbf5a5445ebc39fbd909ce11e97bc2f66a4a1bb6c2f167f2c6e80eb9b8b72df3e8cfd4e51448dc14c0b837f2949693d1d054c8f95bff7f1e364567d034f2223e1594772a43dcfe0597fd6d133b3f2e96ffc5667dd5928f23ec3c750f845993a34e9776159a6830d6fd9013ee7aeaa1fccd69b96df284704fd08888b15b64e2e90d578c5cfc0f95693f6ab65c6947446a857c029c7ca66080b754c7734b78998abe9b7cc6efd09a4418194d88b34ec6c33af630db81de5b99fe65aac8b73362379119c700d107edfc19f270760468ee8e5f155d9a347e57b5930f327a8d11c6674ddd020f9e7d9b761dba5b83a87302f1833e5abd49526d66391e5bf0e35b4453d630bf7d0adbfe501aef81e6c5938f92cb752f5f14d2806f90ae1546051ccc7f913c5d6a38ff3b7b9a23662ef1f00808edb2fa31ecba5c8d3387e87541cd0616edbf3aaa35a537922861f44cbd9f992b8246d9c64c419881701ab43f7fd464210d802ba656d95c0f24a34599b20b1ec20011485cfcb3186b7bcf69d74581a7a3eed6134c4eecd65574a4320d9c57a849c4e78c8a5ce82505004a54f19d4bdc8223401b34946b7d66e47e63cf9d0f57d0945491384bc6868c4b478690e550021df1 Signature = 9aaf8ac97140d5508d58f5ac82b7fd47e6b1f68a7c78a2ac06f0416ef8e991953f62c47fd5fbc6c1e01bae1c92a33ef52b7efa5f17bb8633bdc1aeebce318f0f Privkey = 8a3501b76953603c9033e3bcbf3ec378d257011a6c50b89762d491eaa72c5e0d Pubkey = 778f2019dcd8dbb86c6737cc8dc190c5a04c50b5bf4588bc29fa2a47af252672 Msg = e609f1224a6a451140cbc0254d432ce5fddd08a8e912f81c412fdfd5182ff6ac2f13c576c8145b15f25b409d853f914409e4e02cefc39d9bef4a2a060498570b2d3a2838c9b0b8e3af4fc37e1915f804a80188585b30b68a3ffb2e960c7320e827d2fe36e6a328cc6e7806348adb0b773b784de529bb6f64751b2105859494fd49db0bc7f62df46b9d7ce676975cc5f43856498436812e04f26fb8b8ab7eba12f1d56722eb82ebfafa4735977a26681cb03fa4bc6951ab9cbdf787e3278f2f57f29e12095f8ca2a178cfa7571337f0274237669f97657d4badb39436d786492580fd55d86be3a0cd17d16057017baaaea00c1e14552159bcabc0e666bad3418e4ec13bfe163be256f0c89bc2344a8ddf99ca8160b189875ad322d90f581325281d5389965c0a7b7bcae2294a3cbe35a4e4e83b54c4276353960fad118532d49b7076f25ad190ab5694914f7108b0ab6969a19128fb0aef00e65a04fc832d07696167b9342b355ec57737ca37cbff3bb31931cb58712a4c468952c6459d567a26e79501e4e31b1b0953537632029e9b490f72e5a6e057ddb4b31756fd9704218b1b8f4dcb5430c025042f47169bfc7c80d71cab8ca07f340afa008abbe2e3a0abe141da8d41ca6bd69d36fdb11a41ce0b72fabc00d97ea605270010b259df8e10dd22dc17c13990a05f0233e3ca856b40971cb3e21c8b3950b13fc84e1f266c2a6fbece88d59725c3cfb2225dbc1ee95b686db704fc937b766f0a9bfe95a42b9010f1229c610d7ede095712c8f0f1fb0047c040a870306cd8dc74c4da51bf Signature = a8a309ba52125e76a4a61eb43fd4135c41ab11799b91cc54ffc9c6a20f050cc595b28143c874bdb928beed261d9c0f12aa192e6640bfdad54ba0d478426bce09 Privkey = 42b53652d08b5d766e66ad8f3ebf693cfd77907cadd98b5466df77dfa2c637ad Pubkey = 88463bb8a4b6388d924cb86209834195435d79d77f8c02f46bbd16d82efe42b3 Msg = 9ee913c74ee3c5e8c90d64b8ae3a60049fc765e176060bcd1cd09f0eda60bf23badb8a1caac3d66ebc5268146ee4a54e1eb231ed25eff95b90a6e98337a540a3f48449794a4873bfc2e84728966bb7c6ff676a2ff57311c1c25e15fbf3d40e9f25ab5db91fddb7a0ae436c8ec070754b6d743aa1d6048fb5bd7f5b8e4ccad20328389530f11374a489b1d50531a39c9b32b40369626006d264a99eec4fac1341f4e74679457b418e6bbfba233f1ca158f7b29d40d50301f9d92536fdc5c23fe5dee4d6df0ebf13dfa3754a14c856009adea1dda409304c1f60d25330fb10957947a00508f2fd76422eac694cc39fa8ae7fcc77a02fd9ee5f910d93e8aac68f145dd878876ba8eda0a49fcb209c34ea220d4d0605546fc4a809baf010d533e45d17b0e16a46e91ea6fec2cdc5a8b3ec5014b25e92d8e5c928ab06993d4fe23ac8d45c890378dd133f00edb937c071f75cfc13a402e3e429a848652a175c9b6f6eac86f6188a4448a96ce2872e5f65f9bdb87166c9b87a7e958e80bb6566e3fcf871190cf4a867e612cfc1e4371d2b73d2a0ad0aa400ba69e66336233b0f3c52b8a68bca05125601255046e6f49d688d2db85c7b821270516e3c0613f3f23f9c57cb4c8714285cdf95e106a3b5afcaeb81b72f343e87bd92f1581dcf9aa90a024fa4a1048059e30de8ff0d16794dcd745d2b2d534c520f8278538674a934c6f14a8428e3da018a36e45aa5827cf4b15284346fd69363149219bb0d1bc927d8d193c482692f97dc88d8ed337d0c9dc99c7a5e111dced42250d580e20692bb7b88 Signature = 30c4b99e68ec3351308fbc76d9caf0af6221b596b7017fe10cc633023ba97f023896fe322baa347660610e05fa493d218fa360f18d93e275d1eff666b63db204 Privkey = 14cfe00fa7190ae810888ae2bbd0ff6412cf1fd408a308294383a19453b59073 Pubkey = 4e61afe8c174b6ee1a29fa09cf87b4008139f1070bc8531b6d06f54c9562a4f3 Msg = bc66f801daa829858e740293d4d2187b8e1a5afba5fd67b10956c65346aca94429d32e4cfb3584ab0e005d0dd742781d47e89447c4e1d81bf7e6154f8f73af03361ad56ea3c06000754b9f327d4edeacc4d348afb54823e1c9d49cd8ff2b19f42021b40d580c39ce3d243661b85421fec915ba9dd2762f850bd208fdbf20ffaba56a468660f17c00fb1c0f4e8527a509dd4eec13360cf6e3cac542b875182f2a7ce7be0a33302fe26d3629629384e35c06789de634e90e964fbda8cbba98111e22e8d0762684266aab76aeba4a380778696814a1e311943cb3505892640c44e3aac4530c50ac604a8d2ccc7ceabffea4aa3d7f48a66dcd7588b80209dbc173f0c663e8fc87a36e892ec9a3ff8f60d2e0d8704e5b6cbb873275151ad4cc0057165031905039651ca10a95c6fda3b27827a657ef9a5fc3eb5b53cac61ddaf5a41704c878570cbc3c41c475b117c05eab0bb196bcb7c43334debd64b9e37450d23f5c10161ec5ab4fccd7cf308e2a9995cc9e578b85e8285a5208b9efd42af9cf2ac2b3b7464254889a2187317e32499709b913953ad46f1c23e1b6b56f024c4a7d48461192c01c56c54c564791ec0a67b61acbf957e6d0d7da8053ed13a41893d767fc5737cd195553da5d5b07065f47d72a35c42b001eb6dbd0f8e77a4b76a6266192647f4155ea11bd1237ba77c87c62bf4b01149fc58bc28f0b5a286485d3717d323964046218e70c7e38b7d5e74ba6b12b022f18197d92c13bca89335c856cbc5756aa3b64ec1f46e396b1161c871cd2dfded1a4ec9192742937c0704531c7 Signature = f785a46f69bbd099fa011124ba9032c189742c9e001dbb8781d8223345a9569dc144ca694d90245e0e513e88ab023f7f0f99b7416159758dd034e7a89cff3600 Privkey = ac0f7f0418de67e348fa6d5686c46d21ca72622ee69eaabe00d5c9075a34f179 Pubkey = feabde08f00a2b682bce9d45990bf45afc958339dc44106dad33b2c490ef7090 Msg = e8d0e8325335e0f35a85467beed1e11c6a2078c35ae4a4a10543ede40c1712bc952012d2f8fec105aef7c6c65b3634b4a74b22b498b913507d1f6cfde83858e6830c0af4f464a6899d5c4e279aff36754c21da80a1bbd1dcf46220375b1e112a5a72f1ab6e8f641942f66d9bbdbb179cf0139ea8deb0f4b814f50c513329a1a0e267c4433a233182bc4a2acb2c6d4f00b24094d3bdc0eb81cf37d38260c2107dd9490613d276ee1f72266c6e4acca5249811a0f8a7dae66aedb75c3df4c8ca3cb5d9c567ba541ee5a9140c50587272af34530ab8b08b9ec032eac06039e692630e2d554df77c1a0388b3caaa3be3754a84961fb299e402227158ce363eac26478d479775e5685adbf828bb355e3c89cce241503c15366432ba94cd3cd95479144b636e0de70b3f16d1a3ca518e399009a4c247a7f96367c7146608aacc0014fc35b84af9933f09babb89937abb8ced111891343ddb79f60b78898ab5938f8ba3814bd8002605b1dfd297fa07c475a0d4f8f4451acd707de8af6c0e8818833a3abe5c96d1a8c6c96e2cb63328eba44dd1d34684e412f288e065209d11eb8094d22e4cc802629ccba33926bf1ad36a6285138abee05c5a39a475f3fdd0b3ec8c370cd957a8379ec2cdaf03e895c1ba12b449d6cd8be0f35d99e2b7fbaa92dd54e64e7c35ceb88a71a680527cb373afe14cdd158a0b90bf2daec80d2edbdc3128cd6b63fa532a1c278cdfe0f8ebb4abba5e1a82bc5c3fed15c5795bd9ffb576082cc479fa1b04c5c5afcad269a0f1addfe76042c3a8f1f25377b6cb72ec1614eb6383 Signature = 7591cf8257bead39a1ad3ba1918d518e6724356bf625a573eae501d1af946c13c290cb63156ec9d362726ee50b39fc0a7a2bbd69d4a81b75932a90f8c7ac7d03 Privkey = b5a7c767936380b3e98751cafd3ea89b388a32cf828b321c5bd0cc8dd85baf00 Pubkey = be7fa65f1f6be51027f8b848db7a8c404961bf1e21a23df23bb8ce05850cdaa1 Msg = 6b67c795d66fac7bac8442a6c0992cb5758843b3e3939e3c276c6e9008da82007677bf9e67e9ac5a1a0f486beac0d856191fae25a127392bed469bc78deb0c4b893f67f1716d83509077e4a1bfd4136d03152dcc3b76d9524940a6064c669fbf51f6b91034b6d5f2898678a13a2470f6641ec802457c0102c3ebf6345c327e741b80644b3a99bf72b59ab8016f35d25188a085750dc060e5a8d524ae213f078f288c7b34bc41f3ce356bf2dafdd2e0db4fb8d7c2c319f9906005971702e49ca62e8050540d4121d242f2eeab1bd134e60bf11b3ec71f7765a97c0e098455e59d2235d6b37e7c9f5b21fa112c3ba39e4ea200614f58dfb3eb7b836f0bec1ddd438d1422450ae7ded1df9d71e5d9bc8fa3b6e6f78446ce7c79d0bcfb1c2d26c6fece68682dffc60a9c6e0ad05f2a09f21d7523251cb0c3d08efbbf8ac16339d717024d676024c1ee3c1f62c5aeab7fff937c57454df7bd96f9844a2a399958418aaa6f1848bebf7bf1292c24eb5cd8ea56340c5beb2688024a6953275be6efd1b71ba8be6eb77f0c65a7c5111b96c4c1f39cb7aaf83fdaae8d148d7a8af40ae9e651919f7ce28c8b2b6e45e4d3d56fdd54d00c2412790cbd6f80e10819e0b8f37c84fa004988adafccbbc21c63d6bf2e732d9dd63bd49b0412b9674e1e88f6142f7f867f1f26891b22430423cec4db91b61c2abc5c8fbd46b8b93596fc5160683136e21129822796eb5ea088e0a7d8121b25572e3ec37743d1ff6d8d1c3536439a10e84a665f2c75ee73cdc6ffac4cc28724469f7970b47507df3e1b14d477aec2bb20 Signature = 60e4d23f1f08fce466c9915dded93256b52b327e5f81fbb31d1d10d321c390366ef001fd759aa9d0a55162d5364d918b48c7327e77cf5358bc4319e325cdd608 Privkey = e136f398a605d13457848cead07c7286f42e2f28df8c128a3d0bb72b29aacc19 Pubkey = 6aa5045a66f772a571fe3e42d117efcdf6c49591996186012fa98f7c48e0cda7 Msg = d328579de4c5372f3b382c48011b2d4c6029f904f3a33e07d083d7e2b03756af2c4c97a2d66c10ec4154d874792042b646e4aae5101d501bd1bf6f511751d0aaf821cd7c0b3ee6d0d7c690a2777fe16bdc7e49b7da4bbb4cce3b618ee9b6f2e3a19240cdb70733b984b1c940ec66960b728cbb874b80643123722db9dbbe88322008931b1c894ef5d21099e63e7c65007acd61784db4994a2fb40c3efe9c47fad63763dde06fa017a26b82e71b9daabc4ff0f6c79b8ca7ccb4dc2031bef1087367c7086974a00566de41a71e11d993abe433569892b8f75d7637993245c884478abe3f95f44b0a4bbedefef8906b75e0d34020ae536455b0e06f9bfee11ec9b8604bac2cc6ebe08c8fd5f5cccccbc1617b7cf69a3c512e1f0bdb585df5e12743061f7c2053bc37144361c0b35fd39d56b1efaf92c610360193ec20598b82858050a6d99e082bcefdbd5318ee5efb3b260f3276f3c73f9c24ce0cda33c7acc50ca5dd61bdb85d793825f6732a6e330ce672ac44fe6b2b9afe6e2e965c02d2a1fe0b57cb1b317c1d313efdc356492fe896fd149dae51c95ccdbb7d11f7d610e0c6e2fd3e57fcfef1c57c7119a0af6c7821fecdb89d80302b49fad41743f3d2d7a075154b3143e51aeb947d4b5e8b7e4ca86fec3e80bd9a786e4e46ed1e6e9f7e0b635266d9fa097aa9e20f32e3d2772d7c1f008bcdd3f92c7283c57790c3622cbad3ca35803c45c869dc377ff36bd7c0e6f1bb892f7329a6e08df1dbebc81dc7b115f852e36ae5d928725fa7c6fb9f28b0fb394f9e38fd87625c5fa23aaba47054e8cfea Signature = 75a45c6b9566899829b41ee517b7045a473a4f7a2641439b5d7c5673e00d8f5c066f1291f85deada0502bd16e9709f827d4751f2873862e8219e57746a19a900 Privkey = 97b6702e246805dbcfc7fa424a8caabcf262d466a05e0dd2d4e7c374d57d5251 Pubkey = a716c3d5ce78f4d9c5bee3447ddaf4881c986efdf667ac8977b4fb69b5a7110a Msg = eaa86cf76fcb65c6f9fc208ac36f28b200d3b403aca73207461d8d96afa246d7c69d17a7a9bf77f05543563a7d3eca1d4079e22938aba1f6e9e04b49fbc8ed6f63b599730de9979831c02f8cba61e55560d7110d4c6e61679706a7155d5a673c54d16fe4d228c2eca7546faa1339f26d7a0bb4ee339611afdec9a68f5ff5b5d203b600533ad5a3b368c85da11563f098cc26871e7fa99aefd38cc26151db3b0bae38db6a87b6789e5840b10884af511f3ecb3ecbf94ff86fdb905505a8c34b2aa61ff2ec9ec8febd1dfed0965b6fc5b9f8869dc3a47559974a8822996706daefbc6c5bf984ce06b0d32b31cf9d8ad136aed4b052586dce7073b767b234e4a37bebbc393dd2e0f7d155173548c38a1583ef94e0aa84e7fce04fcc9b4e300ad099449a49232abdcf3d1a6e6fcab696f5996f9bd1b9485d074755ac5b4297fee3124c7c03976a40d570beaec2fac992339f885f74d40ed4ac87a4f40cefbc4864f44c3683aa8f1026e2c37aeffcebfdfe24dd0b019c36a79888203004b2ad83e89221f3f636f455bb64e17d1754c7c6dd7fc09a0d65dddded4622fc4f9fba072b45103435e10220a586f15226d2eb377f4064d3ff37cbb4705a1faaf5b348f8c0ef7fd1564d428688f58f3392967cf396a8ff2fd9e7b517b7d6a5ede7440373d8cc1a839900e84d42254283d9699c7ca37e477692a3494008b80444c5cf614cbbc169bfb9296303c645e2ce28d168dc6cbaefae9c73191f57151aa473009d29e1800b10f4c498609ba11520985c78092058696fdbca9c020e2dfb8a043a3de8e452d58cd1ad Signature = 90005541dcc1d7ab837f4de5393fadd6a92b26a7d93af3f669e0f1bfd621cbd00c8a23056d2da6786557c828a49be1e4021d99311235ac0d4d56eefc7c953605 Privkey = d1528c1406a6e494a02f635305fa74d745c69327fd31b7d2c2623de2c030ed85 Pubkey = 0cfe369cf93daf6d53ef028ddb9f000443b0972fe2532f83a41ce657c1836ca3 Msg = abb3673f3fa17a33a7aff76eac54e7687c04bc84f766651a8b24ba22947908b04ca459feb98ace7cab1e7433a6a6beffd8d9504e2991daa0644d61b8b2e45448f54df8813f50c418b48f49e1034e851cbec3ef0a1850ef726733afaf68e1a461041651c138d54e4ef78187af9a7342f7128727f903bf4fc5ef3e40c64ec26f892f59add98fe394765aaa7d09cae81b9f699a9dd8bf2e2fe8e1ec78fc884eaa0d2dbdbfb8c168833ee0d21803cc35dc628d7c07e04404fb60e8c490a8dd34edbcbaaf80ccdae3f7d3739e0e897023eeb5b1a8c00a9673c59258240ddd4420650fe5771f7e28cb2399f5e1e02ad0b6432d9b49608fcf0b1c0d7c412a445255b8badc5321c24c1ac92c79a0baccb9deffed02d12f5536cd595dc66083b33a3603a9d16ecea2bf38c4f2aaf570f30d21162b2efd7e4d5ebf1ecae9588eee36dd9d3d8e3be7bc6d4bc2185622f11d1da7c49c93e623ac56fee7e3706db8313cf926be92e5c8a539fd16b0f438da8e51a51f2d27640356124ef7be2f91ffa1796a91b12301934ddef0c7938a7a45f36f53b6322d9c8f9d275e1cd2c0f129f8ab8d74155b5d9e5c15c015b0b00003b2bddfa0bcfcc693a1dfcb4f53daec126d1669f33f39ad05519ef7c5ce40e6f4573c247a32c4a0162831352f6d558ff5836a5317dbc4515b3df269a8ac76d6436f264b64561e7968b5822108487b045c92d6c6142a1c2855b38beebd642565123cc827cb1831199e6f12a7e4236856b94dad738f69d1106e7735d711f7c6a3a3378041fc7a21103bbf866907d4edddafa0e7f1bb5ffd41a60d64 Signature = b8399bc3326cba0a93a42497168bf57f9106ee43d39bf0fc86685199dc6e0a13b9c724ef17e7882af8c2eb70f6c9e42dfa2fbf0c1cb5002b58f1086619733e02 Privkey = 512340f961f142d1915e85fe4fa0f551f80892e75accce7cd1869e6e2c9e8015 Pubkey = 0ca02604fa87e2c20506251f0792cd2125856f0ab16d663f2811963b1f2d8172 Msg = af37b2c7587a8d5bc895cd357746ab03552a0a561a293dc7164e39b6a1333a920bb6daca6006676e99bb7e928f9ea391e54802a8d31596289fb9bfe30000cf52ebf0c124a5895bce3398c1bf5356be82619b8ddc15a77ca922494bdb04f5c2e1b6e8ff77ae749faf2b8a41d822c17c06dfb7a5f9434d8bd715ec8778e80b81d2e8d06298748690c6555283c98bb9b19b9246667bc41046ff98c2c35d161e1f4d69d254ec5a076f25bd5c7e2c98ca3c09d80833962cf9660287884096eb30c46c54174106af4e2979a112f3e8944eaaf7669c40d5afb91a024abbeb14664e308903e4d26d7009446ee2e830ab5eca0dbbc513fb4e04351df2f6741864fb2371b2502be43dc15fc04431fff5eb8d4b68d72462ae322e57ba2d4adddf15a1902c2113aebd3b5d612917c1bb73e708ad5418e7d45e4b7280fc8896ab80853ff5f8e98f26553fc78e30b3b0d727bf6d064a8f32888768c51ebb61b2c600b4028a77060febbb02eb3d201780e74566c86a34031836bce9eada81e5d0f33960cb2df08aff3c974921fc9b7d3aa7c81e9c671ed6d33e7ae5ed03a5417d7e5cd6faac91b54b8f792f48283c60647de3da816ca9756c5bfe1bb8b5979e575401bda34e9cbc4d77e711d6b73b82da19da473b55e8e72d341b2d8503e48609be0fe291444c283669e5deadeaf52aa8ec48da83f5328cc099fb41f82becdd58d04b1d66203d737bed06cf21c97819ac13ed711ca217a57cf7d80ff082aa1a1cf8fea555cd2e47e4ddab5e3f9941ad4f775f49419dcadb5b004b68caf45b27ef49ba14fb52b09f1b185be9f9c7 Signature = 6bb4d975afaef41ea9ef085a68c568a05da37ef21dad464ed86ac0d4080e7d0129fb023131eca5f7adb2586a18be40562fa2764ca807e670a0596a5c547bc001 Privkey = b1b636e957574c21a957a45bd195c6f9fe4cc1c57e84134d39b42e1a84329edb Pubkey = 95e77b15dda47caf69b72888dd69961bacbec3bc75353003e8bff0a43ddf4b7a Msg = e25d329cad8364d2dec24373e92d9d50fc7abe8fdc3d0b4ee57e1cfa5b7cd58c23be918f05179ba841b61e180034ca7e74d49b0a1a2cebb4be65344c913c46d32652336e6bda4efa3f58730d39a633a14ca3d9a62abb0a7398cc29aff916eeea2e7caac80845562f73d4030f9cab0bf1c6407f5401513ef87fe6dc099dbc5dfc3352911c07af6c523bef4cca78379659e8803f585904ee6ef6fde77366d96d2ccf248a5320d9b8298b2a73363879107a02b47f57213a85203abbca5a4195f8af3e3593ed2fa3504bb76a3e1be24b66d355662932cb67dc88503afaf762bff741ba1cace97ac58bafad5d36c3aa02e0cbe20e5f3dc8092c512eaa9c4943474aad41990076721ad3f53fb08ac22982ed9b15c751a9e23382f6a69c72e6e244e0eb681e6dd228d3774fccb37eb6232f825d169a2ac8b7e18a42cdaa4f2cf05890bb0c598cf8c31f829ef8ca2435bdcceb0e6193ada7841ee692f30aedf88b627311b138ac78b3913e06f7c321cafb39d901dfe17430b1a20bc437a555a578fa31e4b6807954456bd4b04d5d887987bdf04e0f14af3141b24c3a7b9ac75aa32e2fcd2171a12609e15e73094fd09221b4d27090e73219b648bcaabf3807c9280b6c4ad750a468be0e1ad3e6e63016cb5cec3aaddc5689c2955a2a8d5b8984d7c44376fdd94d3f5ff1298f78172b565913704e90e5ac038cb1720e19b080f81b53d6a45d4528530711b63dfe1e4781c24d74aeb2bd8a73fd2a993c5b0891392196ac32c523699960d8b23e01664cf9021d93928050caf97fb985554580e33336a4563247df59ef6cae53 Signature = 763c7d0d46878e5c7ecf7104fc1f2230e46178a27c75f196169c0279edb01c28fcde3b0d5b8635cfe339fb232774b2206dab8a460ce417abf490bbfa785c0205 Privkey = 10ca413d70eb3db6e337f0f11abc075c95859e825f876176076952d2f1888030 Pubkey = 5028ba38afecc242635f6e353d5f4afd123f860a0425220e966552a057880823 Msg = ea7faf79f6ff5d78a823a754347134f1b3c3e91ce518fdd633feb4f05d125f05cb54336ef560e92deb685112a5ffcd3dfd3964b2758ce4785f6a34bfeb39784f0aee55955aebd12ddda641d05769f74402f706dad201c44c91081c7d7f65e7aa4246de6dc3ed6496d10f4a412060d493bac9aed5be4f6d74229e3c55eb6876e3bb2ed41fa4504b6670dda8c798f6daa280d1aa72021174f6c01aec49b321d87f53acbcadcc4607d5b1e45d63fc481a6d90576c87c1880b2e8ff3e590a96beee1804768c756beb86bf1de8adc408b1b8d666f74ba28630822f92d18b056ae37ce0293ee61b9e80f33ac269671bd62a4059b24f7c1a440807440d5d538a65458adc8158724b25c12127aa0349e55f6e55bc92078fd1ef274c2aa791905766be394a2628f7bbd1a32da5e487446bbefae88fa6cf3f7b499f131fa19313d13b280adca50f77802d17331b381683b5e7edab99473edd31d77443488214135fd6f26445093e9e2aff7d7e892337fdc8779065d4d97d6d673576794958dbfa6c50b1b13ac39607c1e66ef9629761071155fbca6f36eb02ceeae16367feac07476908c847c9a533ef68c94311fa089ff28fbd87809b0d3876b431d9a18b202f9a4049a0577b8177610dd02e5c520eca955e803c3ad4f50976f7c2ea8aa3ee4836a1985df0a4f16ef46981595419897993560af82651c2b494e680b37802e7537ef68a575c34f8588063ee0197206d9a32bb4890e7c216a4d33feca36b549e532fea68556e7540a4fb169d49fc553b2e6700ae42d9a516e68160acf6b270c77ca5ec26e5ad5dc75c2c393e299 Signature = 6aec02dc6bdfcb67f0efc1fd31e23e69e371ab3802505b3201a95dd525417ed1a128db4e182cb37c28f62806667099a8ad480b0ac9e94c2a7d5a0e96e2a7360d Privkey = 1f0a10a2cb111917b9a67a2a1f38fb86f8ed52607d1d653a457d7f4718d9a7de Pubkey = 70c075b2e94c4c02f45e73044f24399741b161feb6f69eab635417282a4a9368 Msg = 4f6a434bd5fc77f0f1b7049c91853ccbd89439962a6078a674b867543b6b7d10552ec1758c5283042bd6b4cea88c9520db04746f089cf3a260fb0f33858efd6f680de5b72d9876324ba590299138f85a76f5be0e05e8859c02b23512559c8beafc9cfe901b283e15d16c792eb03b92880f6ff97aa38eeead3f4fd6c0a9214323aa39a1c16515e30dbd08b833ee40a814a28809c870e1d0a62c37932d5408fc6afc63e79a655c5fe3d4026ef09e0299fbde5ab34fceab14130dc4be007e8e6444d7aaaec62c873df77e8010743c31e8757f1eae9edb5597a1b5d84bd77ae7642e1aca99873a152ffde068a8e4ad9240b903332795e40bb32865e5ce034307a6c9fe339a1c93770df5ca46329f6b09419785cbf2847b0c6832837123853ad952653265c5b5740d194e00f23f9e966791f005f8bf55c388c2be9e21538925f8555e0dbd83be073df765af4940e59a3790b9836bab7909e5676fbf1c2126fe226d781a44330cc01d32830ff8ae00b9792e398c2cbb4fb83a1005c245549a89063fbe06c62a48dac43c5101249994e95e37f24c1d8b3bc673538c46055f800db1c0f956869b6b297d990f44f05b50c7ad6b856f46212858471dd0d39372b0db751573ddb6b5b56ba01e371c78fe58dcd1be53112a6a73da9a6bac75d3c39a1a705a36f640fcfad8cd04077594d59685f6e30de71dfd4a44c4e7c04d6ec7c2e8be12785bb05b29b39151d329f587fdc381c2df0cef73fe0e3fd9208d7ccb6e08d02f42d1feed27561d5e323aa148624e552abe87532de15b7f42c22c98e40525b1747cbd758bfb26fd3eed3b Signature = a4245aa3395e7bada2bcdf1603147cc5f3f0ba91f40fdad8f6d371c3ebefb4c1501d07875b576f40797806a484c7a3f70569e232b0c99d29ca23a233b68edb0c Privkey = 7f05baacf167583cf2fe9562a506991ed987f68ffb71567c7ccce3fcc59b78b0 Pubkey = 0dec3952852b96fd75587e97743f9e41c09fbe6ba981bfceb4ebb8892d986a16 Msg = a27d1eab05150920ded1b1c2578af582b294f7837fe4fb1a3169c25efb70634ba66c7e2991b3e75cc5124826a03e057259b5cb706228780cbc8275c339f8340e402a665032a4ab657827b1c3481f7566d369735b82db7628c022b212730db1e47c9b2d9bc4d81b2342d89c6eafc3e0b6de50d484ccef11238c8e2d240dd595dcef8b2fc57b54ff9a8a74111f61f8a652f20ea012c1ade3e280ecde294c0e35717190162ec6a2265e7e6f3f0704cf8ab1a03e5cc953e2926291ccd4b0590d5c20568f94f9ff0fe2ab78cf9ae2c38bcd491e518f23e9b636f880615fc56078e512d7577e09497c1183453d5081fd4737f280ec5e267c4586b78b70fffdfd730d809df560f2e3772191847bbc3f604fb7f8ca49eed318b5e7d1f2b83a10da0c8594b339b6871a5772dd64168ecc27e240a45c76725e7d55bef37e135e3d9e0e34e36c16e34d77459a552f4074d067a31a3ed2a48cdea4895b10bdf1656f4b7a413c6a088c649fc9d7bc56abf64435491214192a6670cb8b9c917f8e1bc7b2cfce78d28fbc3afc2a50e98213e7e026378e4ea711d151adaaa719beb8974656c10ebc7de46b19ec82951ef46a8c68e7f436e1b3ebedb2d09b0575c9914ead2796b53e0061e212994ac5026aea81ec37c81378f4ccfc467700087968597da38fed52fa48093ae4ba1066c31e3c7d8508095bb45c280120f4aa69a24f3efef1f767985aa1a30e140856f76d1520732878487be53f712dbd7d779e315101588fd7dbdb132f92c27575ac1486f176c790661b0148394e92ffa3ae6f8afb2faa2b7f4fbd0ad91e759a702b3c702b4d Signature = 0deed2df82acf4529c408a02931f676bec5cb7ade84ebdcd578f70f971382cf311bb83097300456a558bc4c09d8983ff13493fd611eb66c043bf019bad6f3302 Privkey = d00c216426710d194a3d11cfc90a17a86212e7a0e54baa49b0169e57fff83d61 Pubkey = cfe6ae8903c6c701aa304695c651bfd850331f9ad481633ae370c86d7bd13fb9 Msg = 82f97841b3ba22dd9a4450837ea7bf8d27a9731470cabb0c2078034bf24e4c1a6290c03f4002b86fa09f07b5209f1f53d0ecf4d9e9223bec125a954551fe8bff718f5e264868e207f701194e41de39971fd385f49a4b4adda911eba55259fc6836653273f656f4af60b20664956d4f2135d90d09e9037d5366a0253444e022c7212af5fd4fccd74237d2885338e2fd721522de6763c2549028c623b9cf387d234ab5e7fcbe5a47c685b79e75a57b09574082a02221df64a2e841618087e722a21bac1ba4f0d7d87bdc510aaa8fbd10757f6c029ca820371fc74c3bc50bd898c55d8167f73ada377aecc91629d64c360c2c241c5cb42e3a518c5dabf0f418b2a7f3d82eefd92026d31e8b8160358eae821f730ecafe7ace647bff8741de2f6a131d11c969e9787cfe6a2fab37bf8d1c7f4a2f364d2f1a76ef046c1843e63ec00cf7920ffaae561e7370b719fc16fcebca3cfdfaba43f4f090c46f477303a660ee88dd4e89bf14b9f804b6fd495cb1412753474a056a0d8931cd9ccbd64f8fcc7a3123467c5d47f690679e8871288093734fd6a1326038658156413696594c134d73887f34ee67609ae8ffb3266c16d87f15345a476f72950c158796a88bbb444f1aa809cad875b85fb9151a0e2eef2e00e80d6b7a9ba406c0519effdd94126232fdf6f1e7b9bbc0362aa77516fdf939e7906aab01307128cf824c102c09b929c9b2d7af8f85b7d7f9a838b2aed0c697e8bdfee66ee016bb1bf35eff6b2f7ef4b91b1fc04fac9f116e2edff40f95c15b77c31ee522f3937c7fa0047d6225e0c8e55e278c8103911feab2b7f4 Signature = 15c45c194297e887029f49d8bdf9d610dd8c34799e1e9230269e7a58928938cf396a02cd42205490391e1c64353fb06b9f8e9b818a9a361c204a386995bf3b03 Privkey = dd123972e628584acc46293b8e4ce2b2dd469cc4ede14ef39521cf08373585b3 Pubkey = 3522f7ae596eedb217035d95395e448dbd6ffbf42585eaeb307026541c78a651 Msg = 2b2857f45280173e2e0ef9d594e6083f1dc7a65492975b837def6cadd8c8545031ee9d68369a9393cc7b792feb98040b21f1eb84665f878537ce412e9db680d29fbd8ffc7731eae91a20b47548996204fb06ad740e78f0fc590b6791dc7a0f2659286cc16d02c5117b565836b4b8738cf40e285c69c50e412911292367352dfdaed9982d0f899a23c0ab51812b3ec678f6882ea427cdc93ab4b24824377054aa25d82246653340078cf11d14a51f0e686d7e018b36741668fce7458d169293361dd16b3debbed19e1bef7c36934e20f33a09ad3e82b53ab4e94c255d041898b97737df99584af14e404058d0c93bcae7bbbc06395a2aefbdefa7b2ed17cebd1513fa390fe9a9b0ce68cecc2b9e129b7a29f49b6d18c28bacd3af39dc39ca972f0e0d06855d57c2b5fcac2f79cb8c05799e4f65734668dad6aa7a43a11856e23b1e732d00e5fe3885b7dad42ec18ac8e096a080f7d55070fdcff607bc0b852d8a080d2a7405d59414695f2eb7fb0aca23c8635742f8ae57f13780316e280872374e6929598d028a33c05d831cdabd029493c3cc859fff1a67d56216f02a2295665365887a350a80afaa0c367a74d3701ae88f59d8a9d3a1dce0cfd2eabe2af5065a1c7fca4aadcf8e51e75612a1371b4dc8ffc0c0b9c4fadb2f081e2e032d96818e55737adde3e1ac121f56cc86fb58a0a582692f62ce58acce17aafec7bcb7e44f839258cd4a851fc01344ee9f1bd03eb94344f4778693c171dd2892b2426a8829ab0cfe33a7d4a36eb4017f7fcfd24134ab8a45f23717cd138aa6000172e37b4064dc9b6d1e1ef3af84971d Signature = 8965a889d54cd8076d35bc2e12b009d56b0704c894f912a0d1d30720c232fe4404bf3009541e8f3283e89ea86f678afbdf1c21c924b23a52b4ca6d63f48fc203 Privkey = 3335ea928117cfeefbeeae146003881bdc8889d6580eed1352370820ad1f584f Pubkey = cb20d4fd7561848013111c3e97617f34181d2e7fbcf1bb2a2cd2e8c1775b8b03 Msg = 0fa7f6a6fca981429b572a6704871bed140dab93ee1992006e9a3bb2e6cc9a09d4c9cf17066b32ff7ef5b6b2e7911178ed7462c4c175603171ca613668b3be193d94c3521e588913b5948b550be99d82d966197d710acfd95914cf3e197536e83e68230dc3d67e67dcdbdee04f0d9c480237ecd28f74338db5f3f697d3d07ff33613bbce542acc9a7fed5d12490b9bfe1d109540f863800dd356da841a45a3cd8a08a945bfa3aa98e1712312c4c0f0d9dd64f6efcf736bd97deafca9dcaa3f06d87f2ed72aeb6a94f3280000c4bf728a01c1862dafd9fc5c7d5a46ec7d3a87af59a11d87f7ff84407d37010e1d946cf225d6b3b1edee2e8bbf1e079e47fb1f66669394fbf2fa68fc56fc89820a6809c251dd62f5b865c547b14fbd3a19504244ffbc7e5240f88d4360f9cacaaf5f82433d3344fcaee0acdeb7beb9c0b3c769eac920ef4f09abc2a2095512045943eccc53b1c03ed24e567f3d7a71977cab9840ce898ee58ed5c73f6adea823394c5c8e3658a6bf5acbbf0055992c312c26c79c5cfbea3860b8764a6d8ffe4491f8a5b8a215e0117a9a68164aee25f8c0bb381195b2400bcb4644ebce1cde5a9a26582cab9dc7f43c33eae350db65aa7dd22a079bdddcf56d848deb0cfa50b3bd732d9da9e8d8ab79e93469de5802b6dff5ac2aa8482bb0b036d8f9d595b8ead94bb8d7418e2ea43192efcbfc05c467bde0a868a516a7c14a889b72c5b73e7d85c2bae902e4e68d1f3ceab2b2773af5bbaee6a00d08063e7833cd4e295347e58f5d1b3397f640c159cc60a674a227b4cd8c10f1dbaed516ccacdd295f11b08147 Signature = f7c39f9247d22f018999247f0e0005cd63076ccf2fee4163421f86407a41698c405816647351c04e93b54415b62fc03fc8c25e20f7541dab03197dc900b29c0c Privkey = 32a1883eff57a3a7ecdb310221ee83c4de92b722159613ecf816e382437b60b9 Pubkey = 82dd1a03e5852062ba4a8b6b3b93c5e9c43ff6995bd2aac72606fac85802c682 Msg = ed2b123b5dd7f5e718e026c79cfa6111924902d189a406ef2b2e56a9ee5573a76ddd1d0629ebcdecf2aaa74e84fcd0208f14eea2e171e7c8608b818feff4dbea52db354227d023250b1f01cb4cc8c52132a98d4acf55a54fee81e094aed66fa0d6b6a200b6b87414402278538b90529a8c603d927eddda97bc4b8cb95d04b5337fa22ceafc8b340c46fef67198d1fd98d89c65cd089e23f53dbdca967798b5cd923205ad511edf706f1225f4648c985e009ef8a2f6a0117cdbe14e75312d8ac1f03d046b37cdee7d69c0f25ccf18145a688a8b3ca8875fe8d90baf86d43969e4d610214f1ac5dbba87a1ef10377e40d7806fd9d23457fc9df29899239fd1d278849681a943ad9c91fd1bbd92b73cb177a878f9059ee07af7a8731613e33d59df3d97796079d5631ed85eb2245106a5ff6a2bca40df5c6e87473b2c08c2212f56fc2933a969a3c958d37c5343ba2760c813a7a5165d231c5feaae62b755df49feca80041a6535f7e03bc48e5f27f9be26ef53673eb7c37a2b64744a6cf17e887734ae010bf40eea03cda212f512fba0585947179640bcc4544b8deb4ead129bc3322800adf98818f99574befd9b0016d4eec81a8e78dc3a2af13cab01649ae2e33d516b9d4208ad6613d8e278c393baa882340ef461ff4f94423d55cf3cedd2a6b56e88365531dd29d68273adbfe369402e6a7cee053da1f100540091a00929252983449024b1c3391110650082f0e7dfddb8edc2042f3c1713c6944ba514ee7407d32bf06c858efec42a78bee97746e5b4879141a13d9fc5cb123b783273b84d57ad3526b7da3c68b839efd23f5f Signature = 8309cbe72f804bd9521def5dad4d8bc13886b1d4f662c9bb5b97ba4790f44b801f3195ead0d4ddb660818ecbf9a683cacf85f1dcc9e82c09116d733658091a00 Privkey = 22ecef6dabe58c0669b804664973e457c05e4777f781c52522af76b95481a914 Pubkey = d4784010ef0403eddc5a62d5d45bb243b80b4b9d69c39ca387c6f5cba028640f Msg = c535c13d779fc0985973d6bcd552d81734e92bdf10994b00cd4d53ce365fad8c7cfa96206adb62d4567be5e46631323853e38ce4bdc16d7b8f632a3ad9e02619eff37174eac3f0bf2f7a7517d4b82de6aa1af0063819d5e1f9278fb4f24c8cc002afb15f334c04fadb00303013c01667f4932a6c4b97d39cd4a4598506c0bd740ea9f11696357d7d17fe4d75f9d74241a7af71f9d869ef6cd695687c03fc34ad65a68a4888a1a74126cb55cf7da9cb4a6717f6eb88484089d2c5189ae381f25e7b3bc3b23d0c9d9f9cdbbeecfd1e72a05e67bb483a9764d9fc75ad69e4ab1270fb40f3958fea4da559b43980b24681313e8591e68546a3bf76ee34b339709295a8d46fb2432dda2f221812df692895e67cb29cbf6ff4502b439a4e9e43639ec067bc90ae814a293a7bd46968e656787642300a0ff2697e3313f6a418d3d12a5f7c51a4c57b63385f2d2a21d5d1d763fc8d1b93c13435f9e47ee7a425980a6ae6f1a9d007607476783c6d0c7887380f868c65b382d4cc8c04478bbd79a1d9a964b78171d6bcf0b8eec50a06a4ea234d1c23465d3e75b88bc540dade74ed42675b07f7cf078211e907f86d0dc4b978623d9f08738af928695e542ec2980e55a1de49e25247fa0a09678118e3930bc4d24b3214d6dcfb6ebdf4906c928deb37bb9ba29c8de1bb9418db718b2853ba57ad8cae4677addfd18b6c7e8c242621b35c7f0efe8dd5eb26ff75fd5748b1d783f6d68a7d9d56da2c1a978ac25f84fbb2be5568d91e70938221c102aee60409bcbec0c82e12ddb425eeb6ecd11551ecd1d33ddae871ae0c8f24d0d18018732b5e0e Signature = 5d0d2af678b3d1b677516d08a79aafd36ec67c14caf5bcdaaeaacc51a14fb805cf2904e8721db271b20df709bee1a4fbfe62565073b2a7e942724461f927930d Privkey = 8de86330b256095e1114b6529bedce182c166f67a91539cebc4bec25add7a4a9 Pubkey = 33cb054b55bb790ac0f3afdd9a6e7c050efe9006c24f60b8044fd08a5c106c11 Msg = 39e61e0eccec929c87b8b22d4fd18aeabf42e9ce7b015f2a8cac92a52448a42fed4cbadc085bbb4c03712ae72cfcb800b978350669b0990084f2dab76eca606d1a49fc55c529e1e7dadf39122dd5bd733893858b0523ef62df4f134cf6c26eed02fdbcb30ce474b1ada3f060769f934bbe686ccebd60883ecec9ce3ffb8ac4a0678cdc5b005ae3dba7e4fe8bc045739957d849f69c1474057b428c5425f3cc2516e8bbe3be81afd4e7b575abe88c87f2f03b56f69f9e3b61b3788120daa495ef0e50eb970a645c13d213c7cfb7d0ad555c920a1e5dbcb46797d939fe0401f547bfd17543221a53010de01f25b64519c8f03963e4b9ca58b0113627c05b9608eeaa7b9ae6305c96188160000ee3a7ade96e0b4bde9d0ed6a0ced765d786840a48175a6e090a38af6adeaa1486a9cb5c8c8c9223ee0ae4c6c02691a3547e32582a5b7059d2ee66fa9cd965615c315b476fd861279cd1dd7607743fc5561296312f11e465ca40bce3cf0b1f1d5a30af6087de4de96ce43965a46c4fcca15f281149b5c1a0c88fdbf27409a134ed4f1fb730fa191816ea784d986cc9ec4b694402de1dcca9ccc64fbd07b07e54e931de827a842460ca0bf6b04ebb571fa77787e3884be22f1e402cf2b8a96a5d39770ec4a843036142a0be970bb1ab165a6374dcf43deb8b9830b2c49db9cdfe4b5242e36f95e0c3e077e8d238fa6a8ac0d586bf61b8248fb3a79a270ab22be8a9da055ff3d5bb2d1ca9bc25f7014b96407719de344c3e73b8c114f792075a5c22fdd416154d3494ec3f02fb112ee5737f70704c1b6b07eacbf94562ca7b90dd84d98c3edf Signature = 6d01d237dd2bb4188d29bfdec387976a71be7adfbf9e23639b216d0aa0c11932235edccb3b42adcdb6291a0d299aed648de8b1957949b9d1cf2e50493030a40f Privkey = bab5fa49187da1cab1d291900019e6cbafeccd27bf7ecbf1262a700516e7c29f Pubkey = f6fb1985ec591f69e3bac807b2eabf263990cdfa09b17809e48e385da065ec21 Msg = 5cf8ff587e52cccd2984f34791ee6843e77017c3b55ad45c44450965b75d836e78fbd7a1d1729eff6d6d340a903f3cf17d9e2aecaaff2a321fcdde0abcfbbcbcc09f4086f812c46efb01b78343afbe48309f917478455f32000c6a69f79fe211b99f037f5956d72275a7fe7b45296b5f739aa451ff0575bc705885aa5631b0d0850bc2b12c4192435ae5d2f52bc54386497c4a24b8b6db516be09d8ccf1eca785bde97e9be1ac064f094e2afcc307c0e06b4c564cd9a9a95305b37b81f434611dca55caaa031e88495d5dc5a04ff5fafdf0a82a0c03aff1bfbf4ffebae71824e35e751b09270007669860b580035659e23ace76b3b369fa306f2bed95799fafabc2e69c141beb0bacac7eaa347e77be5af3fcdbe7b364a7f9a66d5e17a07df6202fd98c14bfee2ca6f0745651f0c8550f9ffffcafb96ffb3f103e652e78f53916cd6f1dd05b3fe99b34201b07eac2652f5253571fd3822c695d265c7dfdd6c6b14a80b6e87183e6e032e5f2401cd238cdd3769bb6e390823438f5673ea9a479e5c63fe07a07f4e14f57757c4d7d22b35d71c44eaad4873c8eca6f6b21dcfa95520ff9614abf7a0e1885309f2ced3bcdfc319363a2da46ded79a5cc7b6f69383f94ab35c250629cb915d667b6281186754895803e4b95e7418289a6ac3bcdb6e1e7f6f1dc38e77d281914cc404f97cff14fb2c4fd81412d101c1bfb368ce59311e892a8b9cdca86936f3bca7ec79163eddf1cee68f49f1ebaa27ec50f490d61601ca35f8d6ed266054aeb9b199f933bffd6e0050f261b4e13d5ebfe2caa6557c32ddeaeebc2a11f0aa233240da1c7e40f76 Signature = e316038d6aa15b1c1b61c1a16b36904fe8a289c8d602becc514d99220086b267859f5bf6e9c0863559ac623a56d7532344e8d2f28b3f9df92089708b1b059008 Privkey = 74ca122ab60de50cdc04a8e2eda45d9631061bf187d316be5b7cc06f020c483e Pubkey = 787defd4fb24a399bd2a4e76dff7d603ed0acb3269813e4df690bbf5b2bc696e Msg = a80b46079fa775f8c1a19fa0829be666bdfdca079cad43d70e0842183bc0db95468a539f0db2aea3ab9c7073b45d228a9bde232897a6eb6fc9edf7365e7101ba97c446a519a3649cf527c8a6de7251b92806815ac2fa0082eff75e2582cbca7e1e4da2a446ea233e7cf7cedfb0e2398eb6e11bbaefe3f7ec89f5d73dd34bd47fbcb4d7b22f2aaee373785651841135cd8661a701b21084a316deac3074e24a2e35a0330f7d1479b932f285277c18a441787224fbbe46c62e834a1851ed237998d48dce20ba114d11e941be29d56d02f7370c8f6d6d7e50248dcd8ec89d3b22f4f58778129fafd4bb92ede17714bf022a5bf92be479f18e63852ecdcf8c4211f530dd30f79cbf4bfa5737f0bad3b0106067f41327c3189e6f206f0d4f3c704bf2bd0b161f018fd21cddfb418bac4d52ef02c41c8792e413b04f0836cea1f86c92e5d5703bee2b5c5899e285992024f64e0d16c60ad0fd92547932d0c5cb98d8da22feebdbba8d1de1e7e9bb219a92eb6c1c698d3b33a37f9b8197d26b550febd2601e7a643ea7e1d9e448ae037f629a306ce417aeb79f2e3ca44d8db3848a811f1846811cbcb874f8af09e0fd0173cf175f304115476bf2c6c2d2f332eba534f46aae801c2692c2d2faddfeacc0f1dace440abc2ae5e5a49d578fd7f9de2a841ad6b6769c32b144ceea16d0f3c0cb3a8ee694c38c28073595096c813762cc2c5ec4b0d8d723dd660853278fc72fd6bd9d1272933dd2a38ed9d04b1390ffe4b294a6fffa721ee3bba33a03a149c4a0345265c01ce015e94db419cff7049852ee000048a85758f6d7b1c59c5089ee018ed09b52 Signature = bcb4b850696011997eb5dfe143f1a3d5628ef1a5407691ee48c79d69abe4d533f817ad7313b5795e46e595f3ae3a9165b1b6fddae86164ffcba376249837f609 Privkey = 65eea9ffb75612bde1d9ba3ea4fb5eda0aa6f2556ab15bf1817cee3b95bbba12 Pubkey = 5b3936dc749b6b9239f15798accafd884c3659ee01b2d17d74fc7da78274e7e6 Msg = c06936323ce3253cac5ab4f6b83270cd4cfe85d0bf8bac1e1b8d5f0b153f541c8e8ed95f28d5c85a2315cd931b7cf3edae50f92830599162804b1363d3ac0da0abd09751023bddc16288944e616d21d91271978bb782d3ebed7fa61284c7490d27593ca8a3d5b475623307010abc1fbf793a816aaab5e0924dec79d60498965cf7f80ab59fc029f782166755b72b869075434ab606cc870a7c0bc8bf29aee033fa9cc122ed7c8e069b547dbae25901b9e249b41fea0bf8daf3826866bcaed2753b5e91ae937e717b508a0acf4c3b061ff0cb9cfd380e2494500951a662fd4928fc5fcaf6c18e84b1d378e49bd9d59686d087ebd552d07fa9ba816fa5402ca9e7252a648d106cfe6c431cc2a053e2294637cdb99d96abe689edabc5ca070f77c1ecd1d52d5385289f17ced768c3971671b9c0b2f855b8461c1e746c7b38f77896b85afbbedd08375fe922984614dd849fe2cb89ae7149dcd1d37f4936e67b1440be72e009398be6f083bf9611480b592fe2f0118e253db5d2e9e4b4541c11da00f7161a736e5f0bb934208e3ef4e0b9a52258203f060d18a195159e5e268aa28053c834f7bd5db9bd71f507d91370b3ffcabbd4acb3071d3f6d52c349acf35095348cebf5a86f8c59ddc965eff610ac425804c0e2f6be42853f5b46434a2c31d9ac99539bfdc04ecf2fefd04598fa63c139ff6c6d88410e73bd328cc4349ab4bb86f2e2ed7c73de96520ef7730ef38345e0f972a84c5388103687e68c50f9d8c9af903bc632d43204062a4f502e214c07059c2cbef72a54110dbf73e425402d17e978ec199b518cec0310bfbf7d9ad300434a4a Signature = baa7113155358c924fed57488a6567f8723850a9f5c03a0d7de85fccd8fb4d17d7753523b00c0d8adb884dc0c8a7a44dc2a60083aa5b3c5b94a8d880f2a94d09 Privkey = 08dabd4e5c119ea907ce45f0a7af9e62c0c3f1c9ec61ad10567d79362854c557 Pubkey = 945406b85d7b32e0b1ab1200b94222de1aaa68624c60bb4716b0bce9df005771 Msg = 6c4719a5a2a6894835c4ac1ed69159e5ebb5692ad8eaada439f79e96684b36cecfb44b89015631663e0644f6c7ab713989d742da27427253318a52432dfab2121d1e9233ead719e2c86a6be07363d002173f205446ca95fc17b24635827fe315f222408e45e833f29ff08ff31dac583a4bec7076d5cc78cfc94451cbf4f7e2fc5b5ed8070f4ef808be1d8a680ecdff59010f39b1de80bef1719f1e218e0ce0a1e393a566c51764d2370d95a61191d8f7af740dc208fa7831b210670512cd73766e609e9b780021ebb20cc8790d8da5f10f5b6a114a1db88f66766501802d9c366ea3fa6f1b1e1e8b0420943413cc6feab28c6b683cd2b333069c8951bc45e8a13bd522578351c882f7c342fe4331b921f533c92ec04a49b292bc569ddcefcab5727f9b5625b167a902dc896d8bc7d8e99920f5db8dd767839c43e3cdf947080dec954214a6fbbe0487a2f32cd17a6b000370bd414484fb73c510ea0124c6cf0fe56c0846a79bfc59779d3b07a1bd2c7fb7e2d0039f0bd21c8a308fb0f58fdbf94efa0857ac3bdddd86d5763e205ee1b221f060cedb8bc05f031b606cc74dadc5db04232748865a73d6ccddb4d5e930d528348c5be9088bfe34458487a67b19a18eca25c0d3fbe2195eb91707b65d9161ea93eddd64a634b23280195fdb0d1388f6998e1858a45b886999b844e6795d83d31837e4411f71699226de1ba0245608000dcf223dd18359b7c6d459a65dbe66c90f5cb8c09122187a3046a16dd179c3f4373e57cf5ee0eab6a212cc9ed8b54bf37f1d27fbd79848e4ec1f567243ab8740a05149d9602eada920a46d610d3cc823b56498 Signature = 33adbfcd4ed4fa67c58b5cb59e16987148697812660b3531ff6a21c749b9601660baeee2489b82b4cde132b6e62f2f90d8f9927860aaad25281d03eb17a9520f Privkey = e0f7d00824c5f3701e5517a4abc13e2f2c0b138c836977843bbd1eeffabd968a Pubkey = 52fddae3e018a68473b3168d0764cfe274dcc834c90a91fb4fe74b939dd238b1 Msg = b39e3ac75a221adcced09a8591ac5e2fe15dfed5b919cbaf14c65eb7cd93086ddee3f7472547e66ddc70062b976297d1a3c170ee525c9c53ba93a4c4fdb23572b7ca6ed13853e70db1d72edeb9944bbc354a520e77ae591f318092efd5e66d9c0981c4a4bda98aa4e59045ff9c4b4ca3acb2ffd893201c70b34a77f24eda54549dc84ad134a35532553815888ae3dd9e241ec4ebbff86f8c1e8adbaac4b91afd18228cbbd5dd805acabf0a1e290ce5dda0251adfb37cb714c139b5a3242d88c64484a37655cc8fcbecffa97fbd14d64d512bf8f6305f89c50922de541692158fb547fd539f1e5877cc649495166332ea2b685cfa3f602019df2ab2c25ed96b68745e9ae89c948da11ad8a830df8b00f2e668192dadf2c5620d35c6e81a2853f841e375a0d9fca2d296efce2ac38d40b030b57560ae6e8341339b3d3c2d061164124319598688fca618fc64c9e8f5f831097a053af19d7dbd61218d926742c2e9a42a79cc1b148912722d8cd5ca793a1ad73b5f141b41809c2fc0530b7630e80390c6b338c71868dacc59bf463ffc489016bf67f9c9d5553c1ede17152813fe0b264b65dca1b2b38e4b809f8c9725ac5b1d8d2e56bec9649fe55c7583ff23b043d6f3768628f1f0516337824a5a56b409520a6a6cb77e4f5fc20b9f6899e00ab22db10d182f09b81e94f3ad568a0b81244df3f1855c6ef222a41a51b62a4649bb82690ab65facac0d81d6fe02601170a8db62cbc5ec9955d7711a1c39656a9f6e1fb6bc183d9bea1503531f17362768bb841f9d21f13a2c991e55dff7f2b336e29eb29507638bdcad7bb31c69e909207ebabcc653ff Signature = ccdfe18ad6d0b65d086d632f83cc46ff3b3f2c07bb8e769d0fb4e82df8a3873f9aee35fdd18a5783603180a95c9f74ced9db5146afcfbbdd40df29e04201200c Privkey = 6acd939e422226cc5443d4aabf58c11af650cb40b9648b4da38b927bff9a58db Pubkey = 4c0b91756b9e206f7863b155ffc5509bb52477ceacd01ca011435153678646cc Msg = 8250d531cf2b66aac2b378d54bc57fd329ad5a414a599255898b3c3b45bf9c0d2c77547566b660eecc76a695a2d608abf11a5f6db3e607fd5a21714b0fad5d814c015ebf48bb73ad75da9c03c4af5489e782b6bf7908a1bd528d7ce788a18ba3528e3537aa7bbf75f6524bbd19a5304ba2a4a3ee58c41fec3132ee6501641215eff746d7800c4d33f52be8357e0ee758041d91cfe43c60c3cedc09b0d46d4cfb9ae2a0239b6f33c6941cff35372670eef5c8859ab65b6e9f7ebce32fa15a9a477aecdc9683a1e33a1edcdc90d420a31e78c153d26020871daa4fff28acc3f11a7206788806b6fa023468ea5a3d186d10f0dd567796663ba37c832fe75aae7dccebf319f93600c46a22f57223812ddd0a68d76baf5e27a9fc8bd68cc10b5b5151d62b41f9348e21b715352f2630b617f813b0c28996285904cf294e9c2856b17ba35f9a82198b8214a035e2896d6568be42392ccef32cd4ebfeebf12be0125206bbe89336d3e762991dfab68fc99dc1649b891383db31fab649e628823f4598cb636a38fe1df73e68d7425fc5d2eb55a0fd1bc9f5ceaabd6dd41f23e4f086c692633dc3c4619a97ab0eada171f84adf20ecc8ecd47c51cca3e59dd809b0aeaa730df94be3bacfd8ee888bba9d570850652cd4d5e6c552a57e9f48a2b06aacdc708d84a376fbc6c94ba6bf64a5f018800a7cc851245aedb20378b329acebb2977c1398082b3a0e5e2a9c2484fa301d3037a8224ddcc095b1dbd8a2315b55bf3318c27810efc3d8e25fa7a8789b73a4f55059080b08abb3699b7b8626cb2a780d97cc1ca8032851baf4ed8b64fc4330865f84ccb12a3dae Signature = 79995877ed24c791684f2984bdf9609c3f7b576c57d162ee622d4ce8f36d9c5573169d8801216f1c46ffe2f6e2c09048e47d4beb997e9abc4abb129f9b79690a Privkey = 4deff647cbc45ecaedc3f7ddf22c167af24e3d63da22b0e6a5b8439c0f3b1934 Pubkey = 0c27c9d77ac8c725bb0663933ab30d1aad09cbcf2cd7116c6085a8499f701402 Msg = d6201ebc21cec1e9bc28f957c9d029cc38f9e85e06dfc90bf297e61f2b73b407d982a66b91e94a24e91d06ab8a5c079d0f69be5788ea8feacebd917291192233862e6acda1e8cf9a48bffb5491dd65af541b6c72af681a81823d98a0abeeb6ba9f95465b8411f99e119cd28479da984259bdf86c9fef3cca34e224691f183cf095037727da9cad29f242f83eb4f736e27fdf67018d711b74c45b2955a6a76ec15330df5bad8030c6b3a88d72f28447652ac8902b5b76cbf6b945ceabfec04a9b8cb30f43d9eb773e6705594f0de1b70f1a20c99fc4b1221f8c81b0bc30da12cd5dea8f4d90f13a811a2cc11a96846aafb4c42a00e9ae7da256a0d22b198afc25cc1041d24e056cf387601d7bf7eb3182d605fe5e63b18d531a5f84e5dbd0184a76c6c467a8263a98b5c005fcb2aaf989f5cbd0a9d903fcfc609d6e57d9c439021cea93e4c4e991f193caf3243770b32578748076b7f4cb97f17c17a79b82253c2423db698cd0a33ab33bb09b0b08cb8ceadca1e29c5de2fc12b2407b6cc5af5ae976dd3ec630d8339b7dd11fa34caac150c7c4791d8c427b0ad92e0529067a88d52011e1e0a18299b969896f8b8360f75c45c496da47b09b450f9822bcbcd43f4293c516802bf747c4abeedfaa3e79cb9103d3770f5607b77516e5b1ce0f64b6eec7bec3c647c006956dc55b6c79f6afb39d1fc3ecf11b974b44aedb72aed1316635083c2124502e5c72d86ecab6ac90243eb39a6aa9cb9480da38e1edb8d28ff90924c05d5d21af5af95957b8020781378711a29d0920acad8ccb39a311693278c9900b470da2bd4c12a01d73962644017b6034713b2a Signature = dd5489fde4ba87d1173d4cee0682afdd4bad80dd770ea7d0dcebaf21acc61dd6324aca295ed0e23a915ecfdad50f175ebc516f1be5b6d87d90bbe38622495302 Privkey = 5a19bf6c941f394e93bd3625fb81cd9da81c9020b1c531257a7b5957bb079211 Pubkey = 20e8699d087ce5e8151d28053dce66c23f28081f35bd26819bbe85d38a09d702 Msg = f721ca3a32c1e81c9c6f46d5e1fb50e7ce2f4e709333ca2b550d5213b6773d670ca59a2b5086a443843ac50813b244c9c9fac6d119698927813512c84fe30a89553010138f91e8176f5cf25789d7281ddb83a246705dccb999c4cd0ae219c645f6d71d451ae1f8d2f9891af8ccce03f438559fb83667b8077fbe435a744af019d6d1399fd2137f5afb8ef3f47bcf735e7c9ed8a54ba0c1c656b6650bb30adb1d57ecd2074639494231a2e9e2f985ed8422ee03cb3fd738c735a1b82806047460ed84f7468c3c64b35db06bc58de4bba463e638a94133df106ac4f470361ccde44157299d225b17798891baf5921986a2bae326dda0b89617c677bd1408ba2748baa67c8a2c5a969bc00cb40dbf490e07e22c913afdde6304a07fc9e60846992456bfb0663a09def68def67a16d29e98c7b55351848a8cf92310c7463c475f249c6f7557fd0d755ca88f877847fe0765756ac34a23f7840d95c3d294e663bb1518b75927c410757e0f5c07c5a7fb215dc7207433ebf791edfcec90e930f8e3ba9dbbb985413c223be87873bd323997581804d8896da386a6e9120050a0eaed31240aa17c7b6694c30cbcc3c6956a6820fc9ab21875533963dc3b0d88358271276c6056528910dd989ae0c330d1798f7d8e7d1184b84a81434325b8c302edf601dc5e6f847fbacbdeeff78c6621d1dafdc239b18b8c1afdcb4b9dabd5d3a92a932ea1599546e625f96d6ec6fb1cccb76b476b330ac59259c634fac9b3fa7de7ae7053773b5befa001b04929f74b71241e1b257696d65a26c1b4ac86b7b1fbd6957fb9b95084ce7d70090f55d44534694305e91769a82941304 Signature = 2a2fd6054ef4e79b72191a0ccbd2b18aebabe8b9a71861ded98b7cdcb6a6255328bc1aecb0c9335721a9a96ee4b5b43f90d322ecf835f78b264dae6e387bfb04 Privkey = b506c01d69746eb4bc6358720e438ad330c88b605aad652f4799573ab0a1aaf9 Pubkey = 7ac8b68863bd69151583789d864a7357e3a045fa86522a9daa6e26fb79ed6d23 Msg = f7fc18066ed04b30e633d9865da3214beca60bd796019cd7ecc91866f9ef2446c1fab06d8651be7f101aec7bb84ee21e71ad020215fcfb36f2d11e4579ac39f8e2b1290e3896d522bcf513aaa06771f86ee228cff3a20a1f10c564339589bba9605344c0a6e682ad5ba40d1041941bc46f98b9d09ca17f8f044e983b8a4908933df2263cf78811c24c8f4814354f6f4c68b7ee7b78308293bf78fd0ff122f095c14a73a59797172ae05cfcec19563eb18d2bc5300ed4bf6bdc443ea9b8bc1cbede94cab905eda5a6a931597de402146fac9cf8cd6a8d104669f913fa834001ca4d090fb7949d3109a63c0549b03f151b7117c4f46974ba59c68296edfdde7692ee432acef7610647e0957865e62c1a0cf05659823a55452dd5e471b31c5a49ab05b5aafd5a0e530e896b58cc522ecf19e52ec82fa147f9e385174c7ec33d1d9b86934aeb4f6c5700f7d5eb33ff73c9fc6aa47df51e09229e6ae894e86c818bef065f825971a4cb90adfefb31ebd9d1b79422dc9868f9f74e7a32cd4071efb69b27233e6e5c60dedcd5321c030a46cd26f5602cac747ee4b522d857a3321a03f403a6006250406361e48815afba77ce08903441845ba87225d8b24046745d4065645a1b98410cac48d137cbbb8ab1eba50da9c231e9acf322a6dbec0ef416a446c3b610d93569fdf45aa6cdc1b640d8f301d78693b2826cc6ed468568ad9a0f94aa9b9fb92f7e78d484fdf5d8d45c991e28074dcdd680d3b1f189ef6bdc320ee6e64dd1f80d9264d83042d2c43d83581ef0394b1b5d1f69f3bbbf04b7c808ba34c1580f16f76537b6a7ebd0a1908be9494d3fcaa9871db15750 Signature = 17a19d2691b7b046d7b19669ad73140db92f0c978c7f61bc3867d92ca9d47580a0380b5901bad82af45f676f74287301980f71871a42261dbe0802950336e60b Privkey = e1ccb80a262ff8af1eda075c972c8e941e77cef57bdb0a82572c28200b493ca3 Pubkey = 3d37e2a5027effdee07fa511e423b2bc56edcea075b41649766725c6b30a10f4 Msg = cfdc5497b023afa62a7fe592caa92b875c7705747834002f7784ff166189398815d4e8a7a0038e1fdadddeba51057327ad1960e859cee56526bbb4127b6a5f90d04d08b15eee66c9ccf88b4b7d1ee9d3b8b8c6f42db3c34e59048a15c6041f142c4079368b7b11e29970118b99e5670ae31fccfdff1399142ee06b2e3e2b3c9707dd64119786e2fab47e0bad2cc8b558d963bb48a49ad2c637dd35b25db54bc5a2630222fa2acece9ce12ab0813077f7659f5074429ca6b494331032ae792a599c425ee297451dcf5ee195290312742e647a7795b84dcc664ddae2a1fbf8c4548a37fd82d810e2145f01df1a6d3bcc42a91a10768e091f3d69329a7bad6c072cac6d89afa31c029056d6b62212165cebcd49ac672e3830267af9f28ea319bd042f6c59de4701e58248736c8d976acf93b99d2f4647a547d392447a48dac11181e16b1501a94c9316e5a67c990b35810b4cda0473a6a4e57614215868e2e002c6058b42e4eeec84139dc19edf5f80aeeffa4f5b07e8fd23139edda31899ebe6fee78643ce686b2963a32072bd3b3bba68485a05c2cc0456c3da50c7c8c651a3066d13a3660bd47ab6dfec49e01557a6742896aa4bc6363a797dbad1a409cd4a50911e70ea007af8e9b1bb7e3ab56215a575c90f739c2d48b3b34694b5acdf07980ae528de0621edfac8b8fa84954d56dbb4d03082b984f13e5dbe9c7112ff9716f55053064662ce0fb81ea35f98fd2cd51137a46f64e0c1caf44e5407dc961760b2597f7f9200617d471340cf15176c3da880fe4e0e93a72fb94926faed865dfdc772e185292c1e36b1211781c3e938e3d4f24e29af517a379683 Signature = fda34b652b79746f897e222d37b77aa250d02c527c4833df80ea41d52189d50700e128b78ee8149c9b19f3abf755acef5348f5fbaf1ceb41c038906ac5946001 Privkey = 4fc512efd86e3a63b395eaff1ba011e1590fb9326ad3ffede7876dcc3e9fabdc Pubkey = 26c2a22f9bfad90606dc613ff107021fcddbec7237066660b488964349e0c828 Msg = 07cd1e9bfa38a7d8853465a93c77ab4f30faf914e48bc4763ba07bf96ba808c1f59ad4ce9b7d921fbbc779659d7ca36edb7dd3acf7a29452a845b49fb6543a3b6c5c1c293aff618485a10eea60ee9649ac9d481e6949967d3938b52fe09c36b9ade07581db4eb542a97f5ac8ac73d3eea184722556760cf483090564553061b90a0b6d2dff4707be763937a10594a82b766bb2cf6daa52fa8d7b48f32127c431ad9aaed3bfdeb99ad42118a1b4de7b992134ed9cdad0b5296d197a485e493ecfeca3653ad2ce0f9241aabc096d7c4ba603ba7ddd07a8b257fe523276417073a65fa4434256fd1f239ec1de5da1a0a8c5e686ee14d9dfa438c53b99c954afab2f79e60b7126f2cb58a26e290da1dccfc301f239748ede7bcf1bb7ccb4720e692f57e53e6f59075399e1080ac8aa9a61a568c4c569d36e76a2d7271f2c44de4e363a8c916a4e446b027b64392e90ceabf6b6071bc47a1379b6aa6344763b2a0e7ff7c4a27bff3106721c253e4c1d67c37fa3d7c1ecd055b8e929d52a8e45ed89fb180f74b552fe06f066c7e4318ca2f915946e8320d5806561472fb8ff7fa8072d8e6fd1ce63cf87382f7b9404540c1d406c70b226853677092645ce996922e7345dc07fb7339f9a54ff07352dd2b993063c2c83d1281a4fd178e5a5f80a5b33c229d0578367d44192e9a4d21e9734d3bda083b70f47103fd125177021df3e53d79986efea2dc04f02c0ac278788319ef3a9132e6232ea6db39ca5870855f9592fff6c209ad2f1c29dd168552898979ecff8c81127248f8310515300656129d9b7acbb7ed1e46bc98c04d1a35b18913738e9dde4d2b065f4184242d8 Signature = 82c824a7d1139ec73ae1d023adf62811441e968287f1a580b859cd66cb33b58e409bdeb2a874bf4c23610bd44f693147f2f7c29d443a905084f3eaafd9330e04 Privkey = 0b7dfad05ba665111e1681bdc0bc8ba973767cb85877020a2dbf918325571d9f Pubkey = 9505d9e86dcef56c9db76f2862b90e1f2773202f1750405e7ee5aed0fc54f8b9 Msg = c43fd34bb1424cca4e4dfba75c28be801844446ca089020885c748382547164a9d4a7f9570d3d171ad6981ab50eeee08a4a6c66d7699d23edbe1faaf44660c72f4552d87d265ace8792823474b90a5d7f7401deb9377627f60b036b36e044eb76bf132fddfcc0ef5704a633d845e962b47517f0baa34d3d6e9a8b9f8168bcdc84c6d2b30c6f343e75357f7f2c0039bd254b244d36cd61675581fb834570ed4113a78e606f145a111992c2c6b61c4267628ec87cd88c36a3c84706e44ae96a96e0c8480318546d6ea6a6df18a2b4f19f8360cfbce4e9d1cf1011ffea5633a66619aa4a65cf69be4459617945e4359a9d43260ca1a20f4ed7c1ae5ffff3bd92294ea70abbae0385b0935cd1c0eb5183029c585a0294b7999e32ef7a290fcb095675dc4f601e8f2c96f35b7349a37057509f4ec70c9f50f6011f1f5e6b061c091d11c0ed5dec8ece881aa340508f696d9e9cc7298e6bccd7c210e2ce0ded83592a3cfa13e8078fdb3258b39f1d11cdfe09670c1e60a3910a4fff51c6c7f7d6624f4c93df8888c526f484f9b13e0a7f62964783978684e292679800ed5eb280e287c7e639e85faa53fba2fa2045ce27d8fb308360726550df9752db305f8f06647970d014691999afa97b6193ffcc6d532f4fa69e133a1d10f3047fc00381f4997bb84e5b6cd6028c62132cfc024bfeb980301f29512bbd109d089ace182cf9c2ffab1b17eb00b6eb46ae198da993f5efe7c1dc22d25047c1ee5246517e7f5758f996abd83f13da22c13dd205ee191b55afd4831ef078bb6ea073a625bc97c81296160bbf2559b275cc37ccf01b91fd87d4d99a367aa9978dadd0689f8a6 Signature = 415adbb2f2b9840577fd1841f9aae252afe8f5a72236017d50db22d228cdee9f5b3e8fe9a17a4d4e98b7341381e8d8625cdcea956d253b74e02dacb84920a009 Privkey = 78188df8c754785621e27ae58e100d5080e16e0a15e277051f95f080900ec0d3 Pubkey = a1bdeee98b0757ba9c2d8409b87424e64e42f9932acfa9bc71fb3f8ca0e11d52 Msg = cf70cca57feb1beefe985ad5af9d4348d3a46a63de1075381fb3639a044fd6e6091f5db9c94d39be0f13ade6d9a074e67ba706b3a8806295f6b654865728c58ca6e9419d5d043f2110814bbf36fc4070e4d9454965c251202ca395efe3fdbd544feb187e34ca3c80795179552fce9aa804430e5b6c8685341e91d5889fbf3f981904620ffe7013f53b939e17443d614e7e6bb57ad674f3b4b001630526cf7302a7d0afe7dc24d6dadef6feba3f96973aa5b8d6275262e430a82f678696971a8b60e38d3b2bcc170d5bc20302a39c596d27fee39e5da5b10ea9f382299e19819717a718d37d155f13923182b5b7a1c54ca109b22ca8e8b26ca5ca3f3b9062219461bace97e890c94e41ca3d84587fbdf6e240c35ccab71d58477d28168e93372686d42aad324a3f16afe0e9b89ee20e485fe6c864b5013ba88399eeaa159835a8b2bb2f25f579ca3bae675c63da1b50d99d4ed978692e5600233f38ab7e7a5ae0fbf8c0b69cc38bd30eabd977efa05ee2c83514302bd40c4bdce7a4110afbb6579c620e97f8cf2e9bab2dcc7c33f196e57fe761a050122894b7a75a929531996ddaad78de1d4d924cd93a61df227776bc1c39fbb8de1c4438868b6a3a2cd94c07b29e3f6b23cc7e0b63689009d9d0bae1606bafc7a808f2d2fa2562b8dc093842c01fdb840da4860aced3fc525ca334edcf65948bc416f98c450f0012a6107dd7f8ede40e1c48c9e8a565a810b9cfd20356db19f1dbde598921332e0d813f0cb87684370388772ff3cbfcbfa299c198c97bfb9617768a05161f4169ff5de5d9f40062090fb882984d9d5c7aa78eddcb9634e466b8853d512b4a546d7423 Signature = b94114eda46ccfc22a4471a64d790892e59c5d505618eb0e701392c709613e2d503a5c2b66601e636a3c1c7d49b1ac798d9089b0f9ccd0579bb90634d0bd750e Privkey = 73cb02b0bf26a015da1dc301fc125d7e6c30b63c9e6eee9e065d4e847132c325 Pubkey = ac9e3dd2ceb9b23e748c04ba7577fedf7ceab9ed87dc430b5fe22eac50950e0d Msg = 0a2b61ba35e96e5819b88bfdb28b7ce02e64ae9cf572b21f13552c0db10f3960d44ba3472f43abc4e6295bdf790bd933ba3975fd4465fa3e2fe2db02b6377752223dec98fcb2404f3aba43265a6fa7976b6c6cb6868b881bd6f3d25cd9d6f70e512f8089c8ef26fd58245053779e59c4725aefa26467c9f500e17f3e1573f1a855e9b8b21925ea0527f3ce8d88fb54a47abeed14f399cc2d9f1fe54665fae0a8f0c68872a600046d1dc36397d310ce393fceafe87c17ebe122fdb543aea71085baec98273f41ac96698c150cf911d0e5de2392d84841d01276aefbfe9995e10a6d46efdc2678d456c9f36b2e10114d1187e7aca739037ea51f85fd62a29429ba529cdd8ad91347497487ed7e8709d4776ef68670792d0615bc96da5178d606db63e4e5cb172acfbc1cbe20269350f1b605f35dcd479135bd30fb4b5a39176cff744ddbb306c9e7b4167de0379a6166be5aaa74d7157fac957d88dc57597cfef23eb5108b3ce53fc632dad1b972a29da5de32d20d8ecede67ff00da4a08a0cc1a98bee7a94e3cb32fee94ae25a413544702c37b3e1778a070cdd4840bd39f5f45795192a867863876ed0d130d46e2913935082809f7e15a496710f255d783da3d016a654c15ff5df907a3ccaf37cfe11c8c3d496507d6760c053820f0f594c3d01ca269178aca525ab2821ef55f92d85fe685ea34472ed1398171064d74a422ec91d1a670618fc9f32424bcb11a77f6fb4e2fefd2c4e8a73c452886e931664d1a83bd927329c04d250b83521d7dc13c91cee1ec050e11d42a4b0c8c069b61c4422d3a49c07eff2905b7bc7f4a5b43e6b0d61dfb50e4eea2e90d298a781d05 Signature = 1a5dd4c891c8e132570187c23b9a1e4b26f05460e875673819396df561c8af0e48333b62c77729d49fc40e174a7f3c21f85ef4d339ceb80bd2e037d803af560e Privkey = db05606356bacf23aff6cddd42b2c694352b5a0fec560aff54d9bd9710efe06a Pubkey = 32a5c7cc4909786b48a53f31093f549a9f1730ca6690383fdb5f14c2666e3132 Msg = 1bc9c2833f37cdf1356fad166768642717701b38a0ab0c2f581a26d222d65ccee4bf0f6dfe64d33bc0239f71d4b82644b01625a1a35fe798676239e0ca779ef23138eebe3bd19de2d8f7c15b4d96f13e51bc633bea5d61225bca1d6339ba53e81f7d8d24c5d60f04ce8c726761d264584f1c7e5b5b6992456c1c76892d6352111e3b926fe025c0009db67ce0ddc7f764e0c9adb0481bc2795484d96373a962a7b74a5596f527a73476498c7823dffa6c8543b07971b5aa271c12255e0918dd73f50c30c9a85ac7c2993dd655da59431263f5914be706374be9c07585c2871328b4dbc39401c95707387e6e069d44b9d8fb058f22e315aa0d5b4f1168fc107962b064f7d845af8e2131951d1cd66dc84dba46d200af4f4c5f51221bc9b2196942f8b40e7ddbc9aeb3d9afc071259513135a016f2866099fa10f4c3b73500bd55c477b2415e10a279ba110d294f3dd1842177d0b4bfb1734dd0ccb7e394b43d16f0b7548362280f434764da57f19ed3e302e5370fba49664c230057433cc647eb27cd2c7c18c7d66906f088246c22f7f790399deb4c5fbb906181769bef5afbe8ad1f5de55be588f52f69c54d4ef5a969a0d995c27407b23edd9243d2499fdf29473b1955c84b3f7cbdcd81b7656ec0be9e0fdb3381356960fd0ca70e7ea74b646fcd313948e6ddb47609476fb6fa4842fa788a0d57be3b0a6ca1819f71614760043ec4904881939968a43b5d1928f84a5919093bc3841588171a9cd390f8fcd61538b54e6ef99770573e1986d150fa96b7a07e1d194af1c0b405500acb3d10e3be647c89862006fa78583e76166842920160eb57f0b2a6edf193c44c5eeacf4 Signature = 53099b766adf2944b6821374842c25d6e67b0ccde9c637fecb11b8b8b07203e3075732805f4f14aeae73bd62e308b5887d689e29cd89b23a476943110717b100 Privkey = 1d139b1ad0c3af1d5b8be31a4ecb878ec667736f7d4fa8363a9809b6d1dabfe3 Pubkey = 2428cf1deb20fbad1fdc665d825b614122df101fbe1473a79996baf6967434b8 Msg = 8df2d2df9b984da84433486a813c98c5973a696c11624610b23aa438083464f65a76796615b728c2ed4e60715855afc239450d5bc0911ff2a85230205c6f1349ba5bd87ea6f720db6ba70b77421788e0c654aebc23074c5f41d2290772140d981a6bc4fe709a268e64172a026b270118b4db51ab6a13c99b063186d8d5b338e977eddc6bb5fd7dd57d9845a3c3fe76177d5738dca16a8f9102857500174f23ff4c3bf3c8536f11580ef8514a409f5bbc9c0296f12e3478d4087f95efaa6c636071d21157bf11774bbfe7693306ca7213da4713ebaaab3554edf08011a5ff73da120375aed19628670f28ab24b6f5d5a1d570480f65d3c152bff1b47bf0666929cb7c99d9033faae8534fc35da730b811ebcc25ae10a195aab12c326aa45bf805c62dd4cd5f868623c04a8e1c6aa72f1ea4400c60867dff622f316434f1ec89503c6f9f65c137b4944cbcb35f086c74cceafa2242acca6ffe611c4b5587f5b75ffad349f00bf96e4a580a875b92654069b62eeac0bf78e5aedd71869ee05b9a94e1c98e35a97800a4a21220b039cd5ebbb756d40b4042e2c84a2ae98182511dae8ed3b89f4fa00fb8ed946316459710052ad4c02f63df05d3bb1ace33672151bdf5dab46c7b583db373899d4f035b6c111258b4e5a9e707a11d215e44e68ef1a6f053809aa51bd902e13ca99c1b1cecc83b9c235c710e797d2b1a249b2ea079b5c1674ed7169f1b6e67f1ac77f86b743298969335a772440f7fbfa72513500d84166114a8fd54139464d42b995530d32370b69bffc7589d6dcc97e0bf17856cc3bf4164dbeccc8a881d414d6a62029276c5f8137c0b3c68bc8f4bd4e7cff65ef2 Signature = dd645e51edab04db31e33172cf27aceeedcc0463a963914a0eac8efd5a34341f6bbc52e042baaf3b40c89a57efb64574e69677fce955246c1fc0f269ef819000 Privkey = 4d22e331e0cf6f6a272db4d20687ffb059f1225d81e41123b8c89b074de76a3b Pubkey = b1e4cfaeadd67b12d7b9dbfc0f88edd0373f9a88c7fa33fb7f2b1e475eccb61b Msg = 9c8e3f5b4d704030e1ba71f02efc4b87d6fffb55bc3d8d03818f915624fcf701c54adfafa2b694b87751cb9f69918c0f050f4c105d5ccb40100b28dfd4f411d591c12019176ac2016bfbfdf0ddf11db8a7e39aa7b9e216f667c0a15fb977eaa9ba3bc455cc58945f3e944b8ac2fbf4d24fe7e1e619cdbeee3e5e12a9a527d28f5fd7cfd9220f1308d897b6d4314a5a0187864a2d621cf1b2844261247bf520bafa9bf226e115681ecd77427980cd12b08c359cecd1de3f5545f807f81ed76302ffd6477f89b958cdf12954cf70c142532993831647eacab0b4807bfdadb4389d7dff2c4ef0ef5a5c61d0df762e2e9080a7181cecd06a53199f0dfef702627adecf5fcd9b3e68c72333161727f871c7d1c43051ff1c921fd53b642238b97880d64e25fac512ab954bedbca540f5b20091ec72e67f88770afc32f2125ca0da4fe87b56aac9177f1f4f67c851725c5e8afe64f664799833fd79100b77ead25838879fff4747aa0d5672ec0a94348134bdbd4bb39b0c67a0cd30602edf4fec6f7af0cc2bdae126cea842dfaa4391dc5ddea938e1792168240c2d8b25352f9f3a644235ce36fefeb6992ad88e287ad2d85bd850396fc2e517a15209f5920ac98c532b1f4d869beb08bb03cf7c91af3ffced68d5fbfef86ff94ece6e2ead3484ce080db17bbe40f1db432ec1650ed24fdd250f3345745c9b7b9198c9109a37261fc5ecbbb12f83a0e1220a1867d45fddfea81dcf75f4ec7fdb5250e57754d6dea270b628a79530ec28b619bca9493e6305cfc4414c1c1de3389e890197c85f28404f3fa96a1e2fd9206b472e8a0a0d32af55606bb083f76a19b8eae3479ae51d98a99a62 Signature = c366b802f682fcd70525264fb1a3cbcd0ee35ecff5977c2a554da939229f17819a961ea74c3d7a7881ac5c1fa16bf984d9456a1388d3463c4494429b1dc45402 Privkey = a5228ff9bbb6f232327eb8d879d7f8b277ca72bae1f9a9d0e260dd90571db4f9 Pubkey = d82f6a6974f51c8808d9d617f4cec2d8a37eb11a14237c9ab9cf11ebc80ff6c0 Msg = 1df7a6835e3310983ee7ec731125f5b5cf117af0e36b3685bf54ace1c48c46300560a45e9f9bdd96a0bc4d14e89d4b5721a2caff6618b182edb1202f3d0c5d118d09b61812c010e8b196344541cdeefe5fd1f961c5dd75459555ab72ef2aa7a759a4f3ad3caed44f4c9a8ef95b76ed9a99b55dd8a260ba08010d29ff819f2af3513c1a640d6ccdde4999205f9fca8857115d8b5db9f70a62e5eea0d5af065de153f2ededeec63e15c8e09a92582182ac07d81ca63ca4aa597a2220e70481957d415264e258bc263e1cc36e53478aac5ca01694ccb09b4ffd84739972c7dccf3defeafdede162ab6c58a1df27371e3f5493067fc9e2067e579623c009fc825eef0e010fd1ccf2a8d3fbbb3156f9dfde0c7cbbaf8433098517491b78db9698614ea40e0b1e6a1e36b900453a16ea276f3442bbd27a7ecb981511f5c9209eb096e28588b65b96b50188c0381ff712bc06b2c655cca0751c095d8016251585851e677434dc3efd087a12680fc22e5b8310a10e32caac9b71c876eed31ef09f7fa012ba08dfd2ad68c1e147f50598e550467ef99f295a318faa507ebe776ce55c4da164323c30a5e72dbe027c3ccf96c70197a6fb1b74af133a8be2b03c1b99fd25b3ced51fe3882021a3afd9229f641bc6cad4e1d3cb6ed9b6b68a25f1e1397289981f78924bff24c8dee6a18a0421fa32ae3ab60a0d933a6af4ff704874b09b0739e2f29d8f252d79055f89d3bff10a22c54ac3d8afeece818353a6abe2b7fb8e8e0da5b7ac1cfc985df97580b18211a4e3edff95afdda061547d3ae0406d3286cd305bdfd2c3abf8f74af9a03420e5b03f825e9c53907e13a5812174be42898645149d Signature = 97650fae3f59ca76477f2547167749c5830248883225e354ff46c7e381965220d9bef2c2057c7d1990f08bca4cfde877fff2b4aa813d9c4b84fb79eced81ef05 Privkey = c04dc09f119d670fb1eae0136fcc06085f290f4ad1aa1ffc9c160ea5cf47f09d Pubkey = ff498ce8c9db7867f6d0276452a466724887e6172f6681671b8ae035f5865ea3 Msg = 1e42297f8aeef29a842e0e21f5dbae068e2c9ddaa6fd348e48881f0d42c50bf0ecf1706b94a5d19817ca02d83e9ab2f99d8bfaaa5c85ad39a150b225ad3eafa067815b74672fe026c3ccc677255440b684a76e128ca2ccc429f152577d25b69f40db582d49479afae680712dc0fd1fe1418839687ca60cdde974140462f96148295df1ce43a977351c77f2f0b09a6b26d6fe965fceae17d7b8620371402428544fdf91690b44e9afc2e9088c83ca48dc8576f628724798dc90323174c44996596502a35df8b982c570a6cb51b9a197d431af33f02b80011567fe50cf45ac111b3d556f8c8ce5ae8c9972f2a9936b1a012b9c339e30c97312b65ea59c100f79d795b8a24b31a0a97dc25cced6b8ff5ae145339a048ca12a579017fae8d5cbcb61d52e314dd7c2e72010c47217b1d06878bf2818ca188e8e307960c1689d7dfc0202973cd29f2f7ba743469e685e0e704b04baca4fab5488448a922eabf40be581c1994d74d13a366ce857fb40a6e05da8553694172cc3fd28062f538250aa8c11f68139e79cd1191ba3314b5cea0864437ed2e4b6fbd75b9ded0987b41c202a58ec0254d9d371a795f1dbecddac112be8d09e2d7b9ca5752f406cffb911ca36450bc05f1ec1ca3ca8d35124d1286c55f10f61334e46ece4183b92219a9dcd0e5e78ef2a76cfe9a9ab3795dfdcb44f63d45f5f48ffb4156133ad2e9950884c5bbd2c1cb8729e40a8787f784969fa880c07ffcc97d5c0d2d488085e9116d7107cd5db16ceccdead55025eea2edee93c1b106427618ee09dc3dad1e05676a2368069c8045c3ebc6c67afa52d59398248efcf15e904c7142304ff61971f4d9bf6460c1d6417 Signature = 4bd19f3d9c5116ec6ae0024d0f246d2ce250d9e0634a232ba06fd3566aed55cbe59f12332cbad65d4349a9d22e7d6e46d2fbdc71d5c8f9da15dfbf17ba225107 Privkey = 6791bd74d3b4620ef5f1ff56406432c26ab646f6d5e9dda6842ed69052275392 Pubkey = da9915a7552f110faea12d47920a09601443d4000a9c7e218d5ba72b74989fa6 Msg = 36a20e66bb29155161ad85eefe893b53ac5ade165f089a77190b0c239dec8a201685b076b4ded4a10aa459b980a8cca47d5f8de4d2a662e446d5f7fb70ed9be05db1cceadd130b3346d9409f9d6ef52824c764ac6fb1cd156dbd6a473ae722d0ebb25638c51265a22febbb14967d6dd8253c1d038895c6737f067c8f73c3c1cbe6cda4369632d7f4c9acebe87d0571c81a58cfd72cce4a5cf53a1e75259f4c993e67efc8d9c3576c43af04a5caf33d856f7f2755d3a975ab2b685c6f65680cba9ac879f3a8c9a4765b879c0ade1e4bd0d4a70bb6f92b24d429dc746cc78f84811f076f32c61e3585cc8aade9b0ca15224bfbfe18be10a33643600f6612bf013f0efcca837246a0ee5b03c02f1573624c4a44a90f9e423d4e56061a71d0144f5a887a8cd4a9d6f247904e26795951959da121c83c6c941e2b6b9ab76209ffe9178591ead68230b94ae97df58f9f172428c95067598ac582ffb950840d826630c4625f5deaddec1305203b4db6b945f991ed7cd3d6fabca51e2166adad0aad5117336d52d59422f0135c8fa8cdd0884be73586bf284e5ddddbcb95b411f98568526fbe71a5592b56ad5a7345f2874db1d57beab43e8cc69547520629f0ee76dbf432a376fad28bfc77e14d840f0c02d478f1e2337c23b89e73e5279108b5609b18e80db0de11cfa94ecf7239bcff59c54118e4ede4fbfc0823ae546016f774c52198a963b5545a3489b89df7626fd11ed4658d715a4657994035d403b3370d14eed9718d598db675f042592fea89056544b32e5b9c8062828aaa3cf59cb476ad36db1daa2482227a9b7afbc153ce93253d1b39da95eb96f83128ff2554a547e34eea4a0000 Signature = b1e8d481065bd5121bb3bf569600bcc26df40c499fbaa954b39a619dc40b9590c31756b8b63f860151694b95765d697b2e1ade0806e92a06c4a559e90fcfa506 Privkey = 234ce4d39b5ebabe9a2c1e71970d718138dcb530cfd296023427d892bf88f8a4 Pubkey = cb73930db421f6d24536837bd0bff6fa75bbd141c98a405d4244a3c424550779 Msg = 77730cf8c8f96b9187902acff9ff0b21746ccaf0a382a7b343d1c72027ae3c3168a73a6b8f49bc8798141e15c2732b6a6b3f757f8a8e86c7a4bacb39551c54874d6bf716897ee4af13253aa5bb79a192104f44dcb3de960745a8e6aa9880524a629fb510a4ce4cbda7e2957dff1d62e705606a2cc84f91850beaac5e5846e1420bc91dcdd2427b69cfa46ae38a4fef4146eae35f9c22e967cb14a1af9cabf83b180465bed6ef2cda382a84d9994aad655d8952e0fbb0f96fc8089f2e7489497facdcd656a8a451b928c11e7a4075072aafbf17d8f1054c9196288ded3ae21f9afd5810a100d8e4d84c4a35a98b30d3e18524438dd4402dfd8e7675f09d080cd915f14af4372f7ce58384972d5d111079651b2acf39d2a167c6a00b2b17ce0b268791bd2be5178fe0f82d64dacdde377a1e8be9e7d8dfc82b08644537bdc870c5819286fd51f6792dc5f67b54be336d44d54febf81b8df8dec5d8686db12f164d0e8ff1aa2c16bacc9806010ec8e91196597ef06a4cf1707def5067a04889d8e48a9bc2c0bef664f5acd1b4f5bc2da7da43dcb5f963245ba552fd493001d870a9517a179c2f0de85be0c682d057488e35c7816ff4ba529aefd7c66091f206f5f4d75cac8bd209ec2fa55be74af231e2f389dcc2d668bf695ed267c3594bad9efc00217c7a0e9e7b6a56a33079a30e73c3733f2d24efecdde87f72f948d277d6b6d5b035b4c53180d23d66cc0ff17c15dd468585e389d91a4c97fd80110b218a0bf7a5e0353f4609d2cf018a065571001c7888555eedbd3622c3b1769cd13f33374772aa6c8a8f588102017d4ee4e50dcbbdb1d610c32670934a6d9e6d9b784bbfe71862bb38 Signature = f6d060ed7d18273f18f7a69cd1d8126e478e88a1d7294ff6040846d46107c3e41a423babb2417139fe587d2910271a357fe5bf57c92ee3a7b77533729d0ac20d Privkey = 103d118c7dd65d07e8d5582e45042a75792417c692001ee6bd9a927b2b3d9016 Pubkey = b45cc94514a6ad672496cd4eb9fdafc1d4a167072c6874dc8ff16d761fb66986 Msg = 5a8ee079186b51cf4629834de0c6bd7334855039a7631d6887652a7728995972e362c1c409f084f5aaf2986ae3f536be0070c4baf459ef60a015ef9d70dfa3ea96711cbb18e92af50c527d7ed457877a07ab83721518c89f7a864191b1e97433b7c6cd634a832e19891e76c62122a49dbffd83498aa416acccb7737fe75f4fb2c35328e6f6ececaaa42e43dba5bc9689673dab96f0befa3c83eb41d4d887b3a117d055e30bb87fbe7c719472f6c7a4cc45f628f5faddc48ca344f77b733c0e3b9f5079dbd07af3a3847af141719cca2f6a766552b45d0fdcdb9868f2c762b6d4933ba10836f95bff71cb88040024c90534c4d7a95a2303b04c2961012af58bc784a96327bbfed039d0802a05262d8e663b78508e92508bc1f2ea2b9be7580bde10a4d663d0d25b0e973b8c5ded59debf19bb044aff1c60c70ea1aefe85f6d15c2c1b84753b59576a49473d65af3ed941a3d514b5c4522c141bdbeed9cb339695b2e02dc07000867f1bf8ed8cfd3b1afe688fbca80e2f9ba5c0b188a19adaff6686ca0ff0edd444661291fa27ca1fc529429a5d8ff79ed2027c60ffe3b2c03fb8a66a3985417ba4ace7d14fd0e2371edf5d71bc02b9052767c7f72c4e6f3f30e0638276b9c420aa4333095d31313033090582e3ac4d9fd3203120ba2514973ab9d1c7fc42290116b51dae9fd579410ae078ed320a5a1b49aa7b5fefcd756395213af8641e29b0ebb5b83e3780e5d10e9d3d11998148f6c6f86c4d4eb252e28c70fa3a55c43d4d7faafcbcdd45ad2637f215e81549eb8a4cde4715b7107207503a79595060b83ace8feb673b997968469dd9b4ad6a7ea81c6e61810033f3edfc137d974209575c Signature = 2fafc13c43afe5054372b923d24f292b283afca3aca3b3e432380684961713c8d23e86b3580495dfbae424b767e4795a0f922f71b50f5d7a369ab8c6e880420c Privkey = 47eee2024dbe09953e981f6986520f666082aa9ef4892dfdfbdbd250d2a1df28 Pubkey = 9f13cd8ebf5080347975159f360296a7164014d8d069e831dab0332607997cde Msg = c133f033cf3bec6cd19212ea47dbecb13f2c6018f9e0878ac884bfb575c0f5d3fc5b4999580eb8acbcaac83ae9ac9b443e6d1cff449c3689b433d50900b2e8b71d00e119c8b875094bdab916adaab75bcc852959d8d759795bbd6b360ee484afe47b1ad28391f25afb8d4e3afe0c5b600498a12833fe2a1a5483df940b173ba0d9d8c4d1321fa4b733334b0f6d878a0e5a76f4f180ac119a82082acb1488e49bbca7a0369c191bd6d0c5d445656821a99ccbc945949eca8136cc6e127d9de92ef64f174a6c04c8b5e52495f0dd674bb5ca128a9209968fd450dce319913fd6a30c3382798163e6585f58ef208be4d0c6a2513a752388397a4ae444838c8466dbc36fbc36ae08bec88eeda131c14d06366b673151454100dea1118150fbe441b1e7826e545d9868242e899f5ea53e434c37936ce6fd06146283e8fbd536480de55a16102c44754bc554d5bc2de2f25e19e567a023df4640e74ff3a49e4dd30e0e2558b3dbc2aab92fdd5e79425ecbc4c699fe1f161965f1d0b45d8bdab52ec9bf7a69d8aa0bd171e755ce7b8d0718f7267afb733efca54b213e6f5adab4c9d76c867fcb69ae05c74bd21516cf342c6161f6fc9eccacf970ebce540cd892bc106c6bd563610298b70968f091bcc6e1f7ab4a5b2c6374a1903f4d3ad5e1bd8643a9c2f878c3d7a4dc49ef3197edbcda7bb91e7e06606087d4e981bfab93a6024977962e45262517f338b6857eec2158a297b2aa91524b677a21aac57be0b63a8074fe54e7a9dc70c5a5c3de728b9c17ec1212ab1130eb17622cd7b22ab6eba9185e8d67be6c47a2e5adc663d4642cc120222e299fe134fd7fcd00adabcfaa642fe2e08dd52e2c3f32 Signature = 5defae0e173ecc18d5f01ec9291be160d5eabff63fd5423f2bc66e3f6408c196353502dcef21effa4b9c14bf27b687d1b6e86b2a205a89eb35c376a3a325690d Privkey = b6c88b4c90fd19a149d381671953b9b16d428f6361cf503a110477e297f8d2f8 Pubkey = 8ebfb084f997b2ea7932a2353b2c8b16bd825e1af587a8ebc51a6c45aea343ae Msg = 7f4bf4f52173eff072f818d0aa97e6935d8baccf4839663253b2414fe6b1f34cf43ab120155a1a3aea7b4819ddd1031673b8a7a6bd0b9dda4adefe692a56162c646180794264c5122115eb90a6d3054f084302dce3d836ac3de820638bd89a86bf0a4c01547cfdc543d676fe1639ef72c5b845c494e07814cec8a47d03df73be4e33c05afe9a190dda043360496be4cf3a6319da9ab06481677f1a4374d60d3d3b6394f8843c869b0f41a1e81c2b1a54bf5aacbd98207c8dbacb36422a3aa013d5e849e044af928545c046097caf149d970215115dea0b5a85401ff672e02ed40bd0f5a440cd56494053c896c3bd32606349f7cbe7ece2a2230cf236dac59f7817965f3fa80fb48aa30b0b19efa9a96591646bd25e67c185f77e21d6630b288d4e55146b2abc15e95088d936080775618154bbdda115702a2afd6fd5f56b923e188833ec448944d30283e337254242c5812d7245a4e92670bce3546efaed22d274e1e6048b5a0f01efbf895dc42494baf1747185cb1a4b88fdf1e6099baabc6a5ab5a2727b1e248789d170caa2449671a8f6e094c11332ea0ac2afe88132c644ff883d0c499ad76a93df472fa013eaa27ab4dad679d2511b5049c4e98baa2e7b00a534891e290265edb076f7dca8e6fef3f433034a16575f0e53da4577e6b13f0cb0d785870d0d098d5d80f413a268ba84e0431a786923771378cd57b8192258e2633cdbe03cc316a0950970526fd3e09376bcef0d03b7074e59a5a84fc64e795a812156d960567650bb1e1424b3cc9a4d99d57ba858dd1a0cad3532e998146e79264045e28ebbfd75a426b0bb851a244ad6be7bd5765af493dfc44ee378cd04daf3917eef2a6206 Signature = 7447a20181b02cf1b6ad529569ce437c2a0508116f50205c41e6378b74fe2fc53630aa0dc4b80c31cb26c8f09bf8fab27e3abc8f1f604a5ec06631a84f6f2e06 Privkey = 7949a9472f725ce7c68d7ea8fc16e13d9e0e0a58f58c24f9228c88e80264090d Pubkey = a370f82833f88b4f5f5310b918e6af93bb724bfbdf3c02c503780b2c83ab6cc6 Msg = 955386b92dd6bf92601bf81e84d25144b5fc0bcd7d23c76e7deb5f5ba6316bb61a5d8e74185b012967f0a4438b531696deb4b8101089e0c0482adf13c0613191b977f77b0419814147f5da64a1d3beb1275b9849d1297ba8532ae0a647a8ace395ae0ed00f67348c5ee5ea19b5f1c5bd2e622818e8adcba3c17c27987e4e3d6d910a56c7e5149d3f5574fc06009bf4dd3e37cfe3ebda2c2116d366dd88ce5ea72ab387490585443b086e8aa38d11d3820b72c658e463cdb59c5393011d4a8f4cb6a195229304e76239fa5e8c2cbe0f39dcad138a0ecb3c51579ec9a120a51607eefebfa59a44620ea5b1916087ea338533fc132ff2e4a43d052fd08b6b1b24fb672f73c9b9ba20b7c1c41ea24d912de9b555b6e5682b970608ff229ad3086f431f9be190ec39224ba2ed8acb4c8eac8582e23aaa79827c44e248c5ba092ddac0f2f79684aa93fc061073e1821a56afb9bfec952df2719a9c7a403e6a93f7a656d74b61c1d19083f8d3f19e659fa2b718e0bd04b693d63dafb86adbee5d87c75b7d129122f178a0e669eb035ca4d8eb45397f1851264e2cf0a0cdd30720c5e139cd6a573f1fa241cae9425805ac79603e8de350efdb0b9bc95ba7b085c1ed92c12acf53f5d4a1137598008f2a3672c84e5f769a25c7a4a16579d86288774972606e4e7d85263ad217e0dbcf343fe554c109c5d9409b7939073ac55a03420fec289b114a5c54c20b45ea69938533ade7b3ae85e1a783dd97897c3ae8254183cc54045c2a18ecbe521691f2619d9b8f1fb347ca055a7b0b4c24f64d1773e01416441efe159923217a84874b9c4ec265cdaab643908068497812c1af15c188071e78f597fedfce91c5d4c6 Signature = e02898cc7c30ee01648247497be8a9c6378593dc8820bf7c17ffcd18118af09879a769f539dd9237e96821166634998f946da65e6dbad8271511669e2d6cad02 Privkey = d68a5e3c47eedb3099dffc804cf19c5e74bf7bf5f01f54d4d91d7574f3d3dc7c Pubkey = 46467fe9ce3acfd0d74346be21c46216db81aece6ce0308fb8dc6386fc3446cf Msg = 596c03d0873f572f45c3b16f0ef4b52ad2bf59ec76d3c0e534d62c1f84164ddaa425fb85c9548485b7064677e99d04c39b6eba04c966397ba6a5f4ebaa69a241df95a6e44502509d6350557ebfea60264b62ad7f74d16e5d25d45970cfebeb33e7b1bac3348dd03a8e99133b26bbfd7aa722c2587f72d5526e980da9eebdf108211dae50bbe8c65f9abee69a1bbf84c03e40448babad03d3cf3b7de4887d2b47737702796482d2265c566b0f623b53c8671bd3719edec0ffd5f49b49b072c1564a57f9bab6b92d1f068d756639a4331452e61aa7b218a88b9db77a19fb82f13e9868edb798d5beeca55d1ab095b316225f3f6390f89578f0160428747bcd21be6ae1d86991b48ef80d569250858febf3276bd5de3db65a245c8bdcf1488c4825968945786bed63f3d13f1409363b948560476858b396bce588e40b311ddfc22ad622ca7d1e69561464dda5009e638aa5ec9f4c039293aaec75001ffc68a7cb3ae01874dc7f39d75027f59a28965fc19530c0752fe99b153da7c0e542bda76ca1e10b7ea158efb4d821fbc65e7271ad9941095315447abcad0880a0075dd04b1325c72633acbcb261fcb407c264a34d70bf1f044feead069af5a87dd352f4bd8110fa178adbd8dbf23c6b575cdd5df22cc9a5cdd37d9c8faab81a4cb3fb5c4fe7ff629dbaa9fc06b80c1fb691c28655955cfe5ca44149b150b3cf140d9acacb14313a72c84098de72bacc0272d79ed6617f72dec88e19b84425492a429ec6d2ec08b86346dfbf20ea2a3619e77b6ac64230ebe25fa0067abb5f33ee49adc7c44bda7046d7f224f2e7a4895683fca8684ed6a031844f5786bcda48b5042394487b52402a09907788a1e140 Signature = 896fc3caba7fd3fc285d5eddddc0120cd46da7c6efabe66b150b002760b8414a89ac9e7f1f7b7c7b33598f61f45718e4ff4ac368ff129614b4fe9219f237b009 Privkey = 31e82bc1cc5ced21cdc8bfc2dbbb976b08780afc6944af7e88e50e67874d84f1 Pubkey = 8df977e2b040acebd3dafd67b87f9216e8c371beced618fef3a496d651a5d7b5 Msg = 69d461b6b7a866e94cd59a5a23bba4a1276602f042baa850d5b29249d6743ada04d3d938219abbc22ada66a1778197f70bf80b597a8b4ae00bdb876812d3ab4ec011df73341c85053eebcc2df0acfc21548283b553ecde0154828ed5af47571985f89767b005b622c9e7c079dde694e49dc0550c7918cc515c274dbd9c5469d2f18ecd90de664e03ca41e53be20b96e25af40c54ab0f7cbe9e05ca3fa5a37c1aa8ebfb6444a32c496efc68157c69f358c15f6ac09d46efef9a685df7e8dd63b304bd3c638ccf532fe901f11cf97c5b1cbed33c70637c721b0289adf6bb6d87c30479fa926e043074302b76f1157d0a81dec493e87a3c643e7a20b7a41525a38db04e78dae5e7797066bfae2cf448a447e9004cce8e41f0987991fad30311ddaa459a2644f4b941c068c0d6c0771afcf42bf9139a684da298486ecf67523bf8509a45ba5cb8b3864ad22c0c6a828c6db72e371de410b47dac49ae9d3b5702b1739b8d760ce98611c07d88df5f04683808a21afc2e61713fc2c025cb25fcc4ee941841083b22f61e2656fb3b8dad41c262c89d2f17610309f2d5c29589a2df61e55149895032ca981e4557e130a237fc0826fc872529861bbb8328d673f39b58b73d060ec596bf22e7ee081f44e92c02a5677679520e2a2b4d22c77f2b212d5aaf050bf2c141e3e28b8571d4321937426235c7a646d647e3efe183c27b7492565ecacd7f43c67a74453f4780e88711ba2dd4a3941b12ddd3909270fb3debd422436ab6166f08c99c886cc0e8e3cecd0642e44285b8864aa416943c5a186974f464535a870a012861bc2e587149cae971624e61c31d8a507e3ad82773e723bcb75df54bef847a407bcb7b1d57 Signature = 240702ac6c68d597d222da949d0c47d16b390a477d1fb579e9d8948adf9b3b6a7fd4458ae6385b7e2b684a05b55c63fa6cd087bb90113cbab8e4af142fcf810e Privkey = cc56bc7cdfa611924e72b07f68abc6ca5b85ff8bbacdff406e51ba720d09a866 Pubkey = 5ffee221ab4d0fe6f4c9346c5e5a4b8a636a6a0badce9667be739f4c9e6733c1 Msg = 088304f22e1a286062defbebb1827a64b76a14e87015e7f646178777aba79704688d7bf32e1efac97a9fc339810ebd3df93e4ea024686953ed91fa6d2ab6e07ec7811a6d91ca91b098db4725df65846a95b808635a8d0c5fe5ace25f0780e896177bc1bba1cdb4449251c01b482f023862f88e072e79cde5dbd6c1d9ad9c07c606f5df85a6eca2966cbfe0a1673968112f26a317053f167f611af297efa802e0a94b3e1f33a27b73e5597abb224115ebe75e294a1bcdcd979255b0a80265c089aaa7d6bed2e3d0c918f56f4a55f448d863365c6c5846fb9b2b9bb55f6b7c6dff5847b71bfdd4bb5b9bb2e4249bc0243a02ab4d22ba78a43d182195aed78fece84cb1ddaeb9eff68156045b2932e638d7731d0e8b4c9c8c383b0d6d392d21fc640762c87d3692b1810bcc4a42392ff13d45169ecbf0135055093105098c869b68887e934e2b9da5232ac6c9373800f70b64ec64a4aa0ca044c0777ca3a3acaa138c14249672a55b24ddfe4dc357573241e14ad0ac16475a8e3867886d41eea35fe7932ba9aeaa0c86c9eb6db7808049ade7b5cc1a40822c66dea93ad22d44b9e42904b5b83684ae2931fe36c608ff7096f1b09f811b02672804406e08ed9e7745676ce047f0f7f64708e49bb78754720b8aa226f5556abf05b56584645292dad08e2473639a8ce5475e0ce9192f8ba2dd32ce14c91975ab602f7c13538c52952d0396158c7cc6b942be7d923eeb523a73b5b411966d14ac96e5b096a52932a416292eccddb91071c88560e70ecd4fe2fe24d523fafcb98e4021502f4190a0515edcb24019eaca09ec2615a9bfdeb60eb354c84a1f3cec7ffd7e65a5515d47959a4c4ec48d8021b1754ae2bf84 Signature = 9b86a192b64f4f044ffbf87b41c7ee52f7a721aa320e7bad6425995990315cdd502be4e1116019d131a9218d19614ad95543b1889af0a97ed4d256dc33d76e08 Privkey = 7a57f2dda0ad0338ab9a13c9a3497e9c75238c1531589789227cd2749bc6e950 Pubkey = 6f738dc5e7d9e240c9f4d0c06a5e021747568b69a75d507a2e0be7ea613526c5 Msg = 8c8575a11d2ff2c238e419ccb00633d04e8b8bd7742901d588dd6a2f00aa12f08ae41dcaa9338f8c47e95312192cf6b245a00ce688a029da56dd1b1deb0d34b5414fe1c21d6b63d06b8534ace8e866c933fd7c5a65eda95a1737a9ecdb17859149ac696951b82c230e8275e96dd02fd455ea675379e67ba63484b6283831fe3ffe52d6ec49b709106705c9d19b859de9fd200887cb44d8fdfe6961fa4ca2340944c764c704491208257e735482af8cb69041dde685241d3fbf46fda057248b8987be1f80b54eb54009f324dc450e886e79f912585b91c9dfafe9012262c471403b1e8b5c31fc5375a1ddf99b68edf9ed70af8594f7d84b2cc4911fe90500c6eebfbac085553550e35bd2e52514e979e7241e9f8e34cdf8513abe72510dff3cfec7e2bc6488641cfd0a65ae0e09ebe99b15b29d45ea67a57aad554d4f8bfce1386ace228839e3a8a534140eec3d37d51be361f5ea1883739f56615f75b055a06a91471be98bc9453783c358382bd0555ae9eb0bdcd66629a611fc1a11c653c82214587dec12ba120e2513070fe69e982f7a80ad159f6a325d977d01d050d116a62a4f8acab6c3d69ff6c878213c60a94845cae106de6c5d6fe2508d94565b7ba75d58d1ad47d76a20defa7568cb7fd66f57cf3774a21d3ffa7d8aa6d86dc284b70e0f17e7630bfc10cd1fc9a8d9c592d39f24a7b5c8e8aff353577e6ac9008690c7a159a7e83be5a6ae8fca9644bddfa37a92b07055f9fac9fa97fb3e8f5f4d917dda5c6dc6ea34b64d302405bc38062e07ce93a1a88aed5fbaf995a09b45b28ad4a6b273dec1413c5404529d825b5edc2e27a390eb7e8c2b43905e116d887ab5fb993dfe150ebdcf817ae62e03 Signature = 989123761d93563278fd0a78aed64e2de6f4a700fc9a70d2187748ac06d9c2c377d1995f89c7727fe2f120784e4171c42d6353ac3d4e3f620c639c75786c460a Privkey = 32ef6d789a1ea393f1bf9f11de34f57d653c4e77d51e6050fef4e8d7bf183db5 Pubkey = c1aa181e620f60525c2b17da8d290bae5d339e17eabceab58cd76ae066f41179 Msg = 11a9c3c1ba7cfb61ad103305c25886de9f8815c6c21f17a8733a024f9497da0540db3603a671aae837dbbba19e19f82ddfc8af855980a70125fc61cd7ffd10777e366e5e9569927af0f245d4f39b3fd0f45879c253401412855e5761905ed6ef318b6a06ea6e9f906f9bd016bcb694a0df65a016bdfe845a09f23e5086c5aaf375efeb86da51239ddc350bac0cdb03b874db1507e6ad4e2c9f46028ca2388363541493b6cb92c1dfcaa3efd68c6b4e91efb46751d23f4c48a973f0a5c7c6fe2a1269d2a69e9fc4ab8ba3b92f796449ba3dc70245ed505cc0eeee1636647a68c7679d0b6d651bba35c29b81478d17ca3685707ad616e6e5604381f84ee52b25ad02fc0dfb85432efb1fecd090c02ad002c1857fced88fdfb2ff26dd0f5018fb47d813581f6508ca637c7365177c513d1ee05879a65c5b676b3aa873a1935c5437eadcb66dfb052a5e7c3e81d44b3daf698f42244ee2ee4b6ed2b7e6e56e61ff9cb45e719fd746198bf2a7de6d25af3bc6c7b0ed8abe3cb389afd84ffa2a230d93bc0c29d5a9419cbff11b7883329921480b5844655d996c7cab29dfb2a3927b82ba7c306c4577b6f8b5dbe2afaf9bf14a8f9554cd01a69a991bf212828de1e63172e833de06698cdb3b28716380314572bf5bcfd34ef52a6fadda87babe6bacdb20ce63c725cb0ff61fe30c1b51dbda2c2625f99dfeb029a3e58cba7d01905111caf42f27025e720e18eeb07dae9155c55aa300e22eb5e94dc7a0a84ee67d91a960ae08ca632dbb1737fc9a43dbcfb3a879eb9fbffd7299338e264bc1237ab6a5bc2a263cfa99e8544439d96331639fe9408e54a350610ff01de3f85799adeb73d82be938074dea858ea636b63abd Signature = 88f3a6e0bbaa3e060bc9d91fe2968c61126b20317f59842e4ae48711cdbaf62c6c0207405d1c4849950271f0aaa7593091109e478d13f356964f7dbab729af00 Privkey = 0a5525a4598f60992f86ba1ab9eee6e2675622f943284fc0553e4446ac5a4c53 Pubkey = db60d7ea29f8d60dad33d02ec5f42232057bd1c4bd6180a242cb7ab6f4426781 Msg = f787321b42c08d4052449a488593d885b4e0c34a5d64149fa8b9c85ee54bcbecb50909b2a86b88258a10e07e8f8c2d068a89fb165a6ace7e64998ba57d89d9bf2b8b38a1f6d8364aee05ce3348bed48b88c2473bf5f2665f51ca073a5305358eaad4365d58b83bc9814e25f54c37cd9b68a808a57d6c2d7d7b6deb5fe20f4f96fe725f8de65c29a4f1ccefd7c2c6f2fc0116d58676acbc58691c79c2b006785a0975a31d8d3c949161596a068aaf2226ab842550e9c0b2610a29531d1f3f7f00826bb6c7dbe04e28ae1b9ff6f888a49d82812f452e1b32740b234ddd9642e18f32ad9a9af7f8952528674a2cda25b4f7ba867007ffa7f78f163db8f36914956bfaecd50f6d1af4ee133275a8eaab94bbc0ae52b6d9b2832634232ec0e8b5f8022d3ef1ead9b79ef9a16564277194f2380d9021e1f17b184b8d3a7a34d15139a39c7728c22e1a3a67a27a6ca4b8a8a0636c6054d0f741f046673619fc6b070e62ff4862f59d269007f3431339637a89f564c0db3d9bcfcd19fc25138ac66d474d80f4ad79f6d1e7844408e88034eeaff4a790338d546bfcd7424c119e211f363cb89c888749346a89d32f023bb6b0366a1ede4325032aa35f52e9df938a5027ebee9688ae480dde1a9c9b42d1a9c08f719223dfae1cfcd49dd1053aaa381c24cc9c7abfcf8f6d86d6af72eef05304412f3db2585aa9e0f3a4f1b6d710d02ab11db1fc90ad4de25d04299f3129c212e9cb73c0047953455bf98ec8fd2674e47b949957deeda018badc9f2f68a1b18ef5c583b095e08dd906da5f220da029b9c400e3ca91c7cbd87f3430c742337f61cf54745b0622bcb90762c6bafef87e1ec888c364fad646c33acc22af5438b84cd5 Signature = 8fa6b0aeac71132ad882975868f1bdb8c11f1a6c1b9c54594e0e46286ea6c9a5d6d5b0eaeaca9ae3af74e72326b3b6f2eaa893c0ec42a49c56ef514f75c77f01 Privkey = 2d5ddffa2e58c90451ea05de47b8c49234e26ced54854e3acef11d8ee6852da7 Pubkey = 7bfd1c8a4a0bbb4606d2e5bc090f56b20d58f2204b6aed831d3df4d406b47605 Msg = 4f1c5b4e6fac3baa3e9010f3bf293c779e61fd7bbe05a586f5aaf08026371627a209acd188afb2dbe0311547940559711640f78aea9a62818962f445a8e7ed6fe6c5f49162e7435d1b625b88ba39dab0ad56fd2c0ad6512661362bf78afe5a1416b647f3b88a056c9e7289c9b0cc3afb43402198563493e737b1da052506b6c9306d75ad6693db6d1571f96f6f52990c4df19665a6bb63073fdd9f55596896a2e9c2622f2b0c2cc99ddd1b649fb0318058d74794e38ec657ebc82abd5bedf8b3f4bba3bb6c9935fdf6826502b769046b36d96dc695d7c85404284d2a2ab7fcf3b02f68a1493dd383ca6339fac1cde47f53c5e026d0869faffe40abdb98195230f17d0cfaa533315afdbfe7d1afc3a615b4f75090233a503f8861e32374e1ea9557674231d9d737d477b33ff82ac0b2c0ba93c11fb523e613618ed370524a60f4d4c83694c033606d1d069d544dccd3900c37a3b3363efbcf6697f9f762b33b1294583953fc53773ef56726eeb470ebe92149b73648a16161d494120a318bfb080cc38e4996f4b263ffe78c7877fe13c2fc55219f44260e8f253bdd379d870e6c91048b1d8d4e88b88218b2b049fef53b2ae1f8c921ed2bcb434669e3975dcc3fe4520ca8024842f7ff2ba1e22cfeb5d4c9e435eada601ff183b26364eee1faa59d19e6aa4f0975238496a709e46bf68336b068bd80b346f11faa3817a07d1cbd84382b2102986f295a1398077ba291d6b5f5bd860ec6177273468f0ee0f2591b575c4366e189b224e9ffa35bc78a4aa8c06954fe33d080ffc0b23e209fd0e79421f1bde818a86890cf172236db211657d1003119fe91d4e27c524ccc11fade0a25f57a7a1d677e1da0b9c043d02fca38 Signature = ced9d61010339c471ddf9fefcaa82d1eab3a2e0e60278553b4dd9f395be58149c91594e5618b0b10bf3aab94f159b530f64463eed66fa2ace54fd92572a06a0e Privkey = 4df5e11dec80ecd882837554fa3135b9d5029df42027aa3b3c929246329fee96 Pubkey = efd928898fa144c2d1c8334fa2e6b5b6a325a7102a2c344a145541ee9a6c046d Msg = fbd6f371b4c8b152c9ce0c6396a77c0fe480bc02007f336ac58fd4addda9d69855ac9e93a45d3e350f41ff502aa1d8fe159ce89b064802a0a1890f6a40a7ef57c6e5e5ed040280df07e7f48fe819be63176710757cb6e440b4f78b5759dce028bf585b3c3feca1cf5981dadadfd27ea124af45ef638542a8617ff49f9470ac2285943c7c3b1163b903955ab99b6eab17f4d49ffa87207abbfc111c4b91f5413dfc9bea31843d115ddeb1da40b45f58f47c417b5e77d5818934e730eba9c4557bbf48cb7fd4e664558af4fb44ee3d94c16e883631f38476f4837db94d54122fa134ca51a525aad5e24b76018fee9a2e8f60e2bb48d24ab8b146f84ffa9820120e7c50d45c0cfbe35c8c31419b078e90712cfe934c3be3a94ff2158873aefe34dc6e36902b1675e1a47cb608dfe960fb4da8d2a8490cc38ebadc73a1003c4941fda8fae944a1de8e3b10ef6d9e67ceec745977d333ac9e71214121ede8892295e27799f206675a9d54ac12159d3a1f954fd0eeffbd30a31904fb2eee77a8aa9dc4ccbbe2851096146a4ce0e81fb9c62498dbd83bf83b55029a5e900086b9531ce3247a98f8654efd8fe7a836431f75daf0868f0108326e23026d2db4a72124ec4e39d4bbf3d846c9f51ca3cc31eb1d02c2ba321e4619f2b659c0bf0fe5c19b213f3c79124f3643f74dd0ff9ce5d27727be6c6958159c164404f43301fe1742e279de9efd441e73e4ea7a842587a79d115d36eca9c03c90ff0d147474109fc20a91d7b3cc22ebcbb8c7f71bd61e8cae47c5050cec1d4849a1d4a8e7a6f845548437706c25331c9e57c2cc6da117f2e5a0f4b368c4cb206265c4178e0655ff675ffc1d4c58eceb9edb4da3ad2c5f62cd13ab48 Signature = 62545e6c07801fde95b461e2e753c4b6c84c25124eb330a2725989d5e340dcef0c7456d4c7c6a178a221b6328348253db787a9e5510ab9cc278515ae3e58fb01 Privkey = 85d32330e2e073a46030ca0ee2df2f8eb874a9fddf5624c8031775111f11eea2 Pubkey = 6ea7de2ed5ea5cdf50bfffee77f7bd2fcc21d48666bb1f4890c76a69cc7ba4e8 Msg = ae6107f38ff94ed0327903cbaf6c3e3a3498c47abb2989a8b37b3a19df88c6de790accb4b7258177b9151d1fe04063577d3c3acdb4c929968afdad6f252a67ed4ca89d060f1a4653983f7ab58ddb93e2878fbab0637dbbeb95d25c5986839de2748d9f34027aeebf1d9eb936cb6770e08d45b8095bac9cbb71db14e8a34222b1f2237b9f0bc9766a231a6d102799f7c081d500fbeade603cdcdd7d5b965fbace4be5c2cd932dcf5f6ed31722f41d5a363b34babf3f636fb303824aa701dfe1d3e41263078c1ebbdcb1f73f1245b83e3fa70ab8e3f1413e6b06bdae022b714d60a401d57480dc64e7aac6d3de85fc94d853ca13b7e67415579d5c672123a5af194bee14ae35dc2724ff209f1166638661f881b1194aa4e31b42a527964781591504ba76103f97b7f5520315473ec94bb017a16667b22a8576a7cc2ac0b7756303c756f0ddaae9d0189e6c8de349f91957c72a529e9f7e9b9456524840ba02344f55ad3c11a0b259901439f2655ab9f8c6c8e8e960c057d9c7dafe425c75d4a33b801d4547cd0551a6802a8005dd72424764dcf57e4aa22290ea4f5baac51d7939c05342882ee14380ef2d4704b41949b2282a1e1a3fa7ddea9fe83b9fc51d4eefa2ebac722e4c0a7c599b6925f01b8a2066dc0c26f92196f4f503e887c1e6efb093f1531387bd88c691997b9b89e3cdf7da12d3734183a4b6126be9e0774704b529659b5548f1b87512cc1878ca4ef55990b483c9af6aa97635f4f07949727065abf21e21e32990b1a7d07d74e02d9b07ec639931bf9e2ca3941f2ba6b5ef14dcc2a247d2117e9cb41efa3fcca24716641452beed2f92657c2fb731f0b94e8c892a81bba91f639df43796acd3013ac044f608 Signature = 414363fead6e59a3438ce5a3a277d62bdd00fa2efac6463dd13fcdded93a7f108ae1f528ffc8ff4eca331dab91ae5b1416e2ddb73b6daf853b03c81e9936560a Privkey = 66590d369984c6f5ad3a89c78ddfca10a0a7657995dc0188b6b57ac3164731a4 Pubkey = 98873ab13346ee48677c4f8612db31ebd13db58b2b034fd155afa8720f4e93e8 Msg = 2ec1c6b0829737832c9c798a92eb490b23d334c3bbe627cb582d17a9e42960efcdc7d34750e0b4aa864c204fb8d62b47992e91dbfcfd69f51d937dc06c48c0ad43e8598371cd0e3bbce416bfd44b0944b993aa2993fdea487134cde42277723e0683ec98e69595e9b7b14c8cf9617a1e30ddb8060eacba48d88253b165336108de0cb02ff20f5424b567830869c9b4329c9945f0bf2f3c7acd1e774358930cd890fd9cb864d950935ad8a4a3beccae8f833f6356191371c32633dcf882709b0d98bd807b383aed8d7bb097b6e262ef700c9d768f4b5690e3a1a8f21755d658db2d1bfd2f7071e0caec7c2c5381c5ef5c2c2281c6bcedc867390b90f3b27b0f0f64a33658578a5c0d66e211e6fff6e86488acf82bc0f5e2664b83699046037c0d33d340ff98ed6263354c24273136ff0e4f0f233a6c8254fc0c90764330e3b1057b1e666d5ecd5a2efeaa6a105bfc858431b88ed7fe551eb32ac0af27c66a9803a3bcf87634c66c7066dd0197a3cbd2d6f4e65cfdb8f3daf9f3ca5c4f4e0add45f5541aa18d041f706e4fa87c34e9a223d88572eb50083ee8c7c475df568bc73bd08c0f0deaa374afb1c178d0dddb236e15a8bc2385ed3f52b8761e637887407a20aec3e99ec830dae3167ef0cdb3f3ffd200d83b75b749690b9e25e2171d072ca56f71baecd21f7d45a12c91b2c0fb3fea3b158e54648284bb0095b36244b0b121f9f1384ce9004365e7772fa30828250f51985f1b17b2d2f80a33e8fc6d8565ea15cdaacd42a87bd7c9408b1fe1c770665bdded754bc2ff2ef91b973a86b99f1059c6f227246a698b38541509dd5449fce60d386224183b7dce1b3884f7bae1c2e4eb594510b5ca585279d9041df8817b0619 Signature = f0db63a1bc7624161ca0063853b2dee45fccd22471e012366f868a4a9c74654e13f1a315ad83916ebfb8dc31a420f83cf645c4c9d16bb4d5d99d23c7b43e2300 Privkey = 41cf071f4842ecd494191b8cf28cc0923185ef1b07458a79a59a296d3549822e Pubkey = 6dc8e446db1da353b58d0c45d8b4d816ba59e25bb680712d62d6d3dbf78d0698 Msg = daeb5f0e84f1590bca2b9d9719ef5d1cfa79e0583446332f18e9e4feb0b1f15340297ac9ad6724c85bb16558ea54eb5d702a47248badc6252a804371b74cfe1062d1dba1ec68fd1d4dd029cb55034bbf61068251eff3983636f6debd5727be91993b3e4d0abc96ec196421a47b7893f83986d6c0323f0d19aaf2cde9d3565c104c9d3176ecb5ed5e173fee52b5a0c42b6ab2fcb1ccba9649c2c67c520e9b96cea693df3e58609ad6a0bd522efaaf03858d245dd0a38f84a2fb1020f4dd97c3aeef0e24477d30d256701e900bef26a8a6269ab660d74293a2bf1d20c2cfaebb7c2820f5f5b07453bb69ee769b52391539f0c606d22eb3923ee6f5a1d46050af90f011f851ace76327d3d18c48170a9a25b04b770fd938ef8a30b7bd03391dd36c516b62f0cb78670740e00e69595c418d967253820b754c4fd666e3cce16ee0c94183bbea706fe298e1c99ddb821217ed9008cc8e8b83bc8b819915b07b146fe745024ac3c46116cb4cce5e32ec5d7524a2388d9fe297eb02811af4546fcd5860e14c0d13f03dd75a4249615900078a3c358c5342962bc1beacf68c246821a459ab5321ec9f574f49d10389f40f14ddfc8513ffe3deaa7336035a675fa5858b490c5d247780064adbaf75a76335eec9ab918771b0b1df5147642aef4a166ab172ed601fed210f6c0cffd91869f7490b57e7c65241863e7e8c0a26eba63b5342d0fd8214ac731e1c438d0177115f6a19e0935c7af6bc7dbeb75511d9bd8e63e3e2f47ab0dd1cedd7b180d74a4b44d461197aefdd3620465166a39b45395043ce8874cdd72c602bd3d2eecbad3466b5cb1aa41ae92a8afef2d764cec0c449d27efac437938f280bea9c50a582e57c27f9b3de872f0c Signature = 41052bc417b24dc48383966af0143f9c0ba85bbefbdaf791b16a4dad1f570eb80703c0a2cdeb2f7ad6dcd3fa7bdb5c225e869cd8fb278dff0667d38accf3db08 Privkey = a2c8e161a8d9d6e888c3d09b0b972737307a2cbd2acd7ccd804d2431ac6c58d2 Pubkey = 3a325775886732deca406857a8056010aaea2875545ba6f3df30754571386992 Msg = 83a3bebcac5f28c5433e3c4f1e7bf5d2e4dcd2f5e59dbee0a83b07025715350746f85675f1dfea374aa7d794287b892ef9097ff6d2e122f0a656fba0798cdcfcb3645dfcfd788c740c0fd04520e7a06a02a05829630a2bf0cdfe2ecca009ec44049946bb1d2326ddd61d7ec640bf69eb44fb23cc1ff478c570c75db7e766e35b7c43db73680d1407a94399fb621baf3845745c1c4ed0b9f0b485be2d53c568545ddf18775a837a05d9c9157b084e8cd01fc324f07f116877e4075dba2432c8a7752e9e939586ad93f0c0aa5edac94b8d82e5449997b15b8c8961589c442821aa83b60239ec5f158c3f5e9ec5bea5115d5fed61918e8fcd5bce61c777f20b6bfe803a69c6fc794ab8c57df271da863872a61335b1fa29f4608ff037f712069809ca642a0307c79aa92e10cb893a29d17201a0b6d1b46a7212b3baec9703c0b0392ba6b76e5c9c10f83599b81ea22283f9547aacdaa7f30896d1ff731e11fb9e56ad06030417119805bab63521496c3bb92a12f5e55afcf60ed4217737f3046b16ca506657a6d696d75a6d8e18e9efe2b08c8b1fa0728238e27cfb322166eee4ee76968b777b50ee6a2b804e1e9b46016620132b6588718d978ca2c0026979c400d3c5336751210f0b00d269ec8f4e2f9559e180332dd270e50cc9465c5558936355521bc3c9560fc19ec14242121e6bb2fff8f50337fc264acf1ac1704328334b3b52cba96d9303b1b5db859dae31d80f1711fba251e10b4d122128f9faff6872d0c0b81eef59541f832b0a9df3a4cdd591c87736b1aecf242c275a10c3fd67839dad4ef399b9494ecd77f7ba5b5d4f2ca304e5b22921307cb18fa64aa3d01c4411c8369ccede465ee369ee637d43d28826bf60ddde Signature = 560d01b94df11d83347752ff51b3545ef55c5632ae7c8efb11aadd8312def72562e8f5d75ece10ad46bc96c860deece39e634a5f50654d4cdba84a8e6f70240a Privkey = d3d188b390baccd95024526146b82b9184e197e46a9340a0e6ec18bf75be7fc5 Pubkey = d8f794948aa6986100214e9b7b9024420806b4c67846d5bd506113b353a2ea3d Msg = 5e65658e420375433fd7c1f6be678841e58104f10b4c676359d84fce7992f5c57557d738f830b505fa0c2b9eabf8d1a9f81fe8f315d662e2b84ce95299ebf4e503b5e1f7f8cdb668ae733f3d0cdd4c742ab5f272bea4f18d183e8923847662f9a39cd4b14ec76d11032fe573c26201aef66601cec683e34b89afd964e987801c706a85e27bab33701cd109bcf07b27ca67f022c494a04cbe5a9c6d63aad936cdf1a180fd05865198b96f06a78da95799d3aa4df3b170033c69e8fb04288c3546553b579c0ae3938062d3d8421cfa66268529bec0271e53b4ee7d099e7148a802df80fe5eedee1c903ae8ed4d640ead761262dd4014f25f9397ba3f1c08d83a3c485cfb55f89919aa972d6b7e7711be9e30c1eb96a0c3845309fb23dbc75b6991dd6e48cdde90e04f228e8ccf3ba23f2747cfb9d3381a9305f816f26cdde41c0220fad228ff6a8b095c77b6bae8fa3368142724bf1f5e0f6fbca5320c215b6ba86b91e3a8acf750e93fa7eaa65c4f785ef8421a19c1e27bc24b428e08a90242abac9bd4aa03c656f8f46dc40b36152c1bd0def1acfc0da10a2fa1dc3da7ace5a8fd76227bb1a602390fe57afd32efe281f2ea6b2e4d2545cb88d2308d72691c9a52b4ca25231a0107f25d117cc935397621c683bdc8f22e810340f2cbac4ceaa3468665261879f0074200743e0de5f3e58308b98b04b8c7148a4e004e667e832b0084b5f2bdc6fdc959f2fc28a8d31d9a9e78e5d5f9c0b119e5ff1f68f7c0daf0c0f16947cca5b7ced09601e2ebed282ef2bf8fe9a27ed27fc5bcda8aed6c71bee3e7751004472689bbf6d9d07952a242ff870d7c3f5e1ffc2c1f40fc9ab7579b392b554f3dc588c03ab957431fe5d02cbc711ad489fe Signature = 16976b267de96e38dddc8478075f6bdd7159e56334b2d2d1920946294f33cd6b7f9c50f8057f496cab5d94bb4dca262f9f0fdf9b1b64741f4b722d32efa82203 Privkey = 61917a975cb7ec564c708a565388c57236a66b697dcd5a7f10bae671572ac7f0 Pubkey = ecc0f0b99276e528f82b42f2efce8579f83e638c6acefd072828c04e434f55af Msg = 6e970e0b1c92a7f496a82d8ae80cfd0ccef1d2c799d41728f35ddcd603b421c2a5ab3b489e78f4b62297de437c5ad1a9683ff87fa28eb3cc38ce242af59419f9fd43fcaa54fc398992f8c8e31f2b33dcccd0ee11ba7b388e8d2a36ead067c6beced5890ab7d4a94f55dab92128a0f814c0e68971df57bd5078a7403175c7c2fdd4a52447153ab37456729aee33e5fc93db8e7f480309875ecf6db07ce7f3cac5de49e361275ca50b6b719f4b715b3e30863cbb3b7164ba9eb96ef3304b19ad4d74dce4bd25e77bbbbeff1ee7d1fb55b9c4f7fc4cd9bd55108afcf99c1a41cd6f6b1adb297b106c8ba24e3134f87dd8efe5cf85492291b94d6600958c28b9122fe6e01bd3e329e42d1926b89f7a8c40a49867e5aa3ad749bd98dae7d006b453609e7dae26364d9172be7283330121ed2b4027e0885118743a6ea0cb7dc27409a9b2820bcc242ea10a00937bf849201e0fb6199421f163e9794f2dd4b332014a09d3ee8071da787747f990f5179919027ddff7cab0f55e9afa8eccb16cc2dd3cbbead7ff7ec818c253393f748741f55407f7408ee33a42ae2d6ecb3fb600a71f30ab630606e553b43678e59854f3a2947bcf4ea0fcfedc314d8370d1266395fda3c9105e975952f60e3086bb82481513d6fe8adb4f95efb9a95b66d480d2bb171078cf40684ac69a789c7fb7fa425333d705db00066755df728de02df25bae34f1d7d49caffc51e9ba2b10b98fe4cd9d22b7764ed931edb5f0b554496e995391e0af0b8d1c7a8295a8d15a7c6556d29cb19e0855ca505ad01d2aa30928a84bc48959576d812d9b27b8e88879faa2806c0841360ecd0fe83f5b848fc12f658f1e7f40e561c2e78d3b0125210a92061c2db21ba660e8608ff5 Signature = 6abb3e377b5c80b74f77219c1a9e096fba0eb68990817acff12dba7f61c77ccf595fb6608552003cead06ca1317c9cd51ac4724b29f40921fb92843376876401 Privkey = 7ba25f2797a2836f379d6bbcbe9abf4f2def5e52f72bd9e0b006571022fac2f3 Pubkey = 6c2ed4e8c0124d5d0540796d3945d1de71aa6969e6abea0f1b0e6fc429c7046f Msg = 171a3409878097b3b22b2c00660b46e542c2164c00bbee54554837940e70f03da9916a40f9bde8288f45e47bef7ffe4e557cd4474045e740fd959d984f4ec81da88d44a373c1eda0cfc6b08e351373d3b82ab0902df8063fd908e703e0cbec410ab5cdfeaae00188ce2ad42b8bf04f7daa5f0ee333a6f9311b4ad9810952d5d5a64b20f37e845415fc3cdd616febec50db296fb3f3bb7f6b366bbe52e4897a05617bf7c981a62edcbbbe5da4c39cafa869aa2b2734e6cfed90ed8be75949390ee44566892455b890cf568b945aabb758d3854be6539f3b86bf01d188e48cf2626a0d7d381703be6ed1290dfb947bc2e0f83dbc58703080d7f5b9ef19aef930908f68f0c80010a9401b303a9f6da805bb8a0ed0f39413eefedf919ffd8ea6391bf95d4229604e49457b8e23bec611484cc7f9832dd95bdc3ad177c050f4ab633dcdb3e691f5902873b38cb0720b9113357fe0cfb98a68cccb5d5f0809d59a375cf7b5a275d43c4c34ff68e448526e8e1aad44e20008a232afbcf532a42b50a025a1b2ee4e077eb0125a593d51a200ec20d872c05838ad36aaaeeccc3ed9ef41f6d122670217d5c08f6e13c172194589acc3c59f7ef790c7c85aa6d5eb69d4c89a72f5e7c9246985c1ac0c5d197f76a73e3774839d4aa2096aca190a30f4aac54057b64f358e0e06400c0df2f876412d34484c4344f4d7c866517d3efba4a90fa7144c9ba5db3361db5769403ec81626a511f93e30f8586eadfcafd9a36ecff8d24b42079ada8e579ac30851177bce9038b0e1300072d68efdd723f6355064843275815a66b9d73a1299aa59a1812f6452fb4115ea2b1f9ff4a99690596e3f2022d81ed874dd67e6189ca0e68b9304e993a95b66665e0d074c Signature = f1f590a907ba980eb0d648ab4ded5f92faf7cb851d81d858a78fa6b77cbbe12f64d20df52771a7d5e539a152d731e1903d4211fdcfef9a48b46c8fd5394ca009 Privkey = d1e1b22de5e04c9be4651dd73995a3666cb5352c65ac7b7051b366fe1ac0c310 Pubkey = 12fe56f1012d5c12f135ed5982f382ae5f1143bc90e8cb8c93051754551ee90a Msg = c7f218b5aa7aae1799625a56c4d7d7b02637e572f1411a6122f113791aa3c628e819602fb4f0335a6123013fa64e9fdc4e4ae497bd169c2fa77bc236129717f462886b410893fa7809cbfdc892223b40ee041ebd4ec7ddab55be6081a1646643a9120baa46289acba15b3b48af3b7adecd69f43eede79d9b1957e1d8c3129e0fa0579d3d395370461b0e1255c9caa94e4725601cb9d0e2d60244d15b64e1f7bc9015590ad0991f12f8267311206e9eb5d16add0ba5218fce5fffe1c9ce5ffe1f731132f4b12cacb02f97451710846b7f824f4fa9e08919266469789c00ce0d94d38fa8fec3f51f2f886e9db09b804470b19ec9e80663f155b4984d2bbd0b2ce99302e06c64444b696e3129fcef34c3dd00f7ab5beda747a3fc6339192b740f3569b67dbd6ffa39e271faa400d9616bff86ec49a659def2e7f5d451f2a2b35e662a6e7cc22f1e5cdcde8a59988135b7e76562743c1e6a099901b3ef97cbff23f209bd7088c2f03245279a1dc78dddc1bb0c1d35100357882126b328d3d94e0871b60be253fd1b6ecf03c1db731d9eed0edf2b2643230780a4d66e99179aad1b82402e55f6d785ebc80f8dd2fd2beb09f31035df62c17f428ed0b2d56508db31e6d2dd5fb69ebeeea3257070cf2fe67d42d28816a55dbae0b185db4421bbfdaefc79c08cdc1accf71642562ec70036da2bbafa4a891954c4ee4049b55c640e91930e39e3ef1018dc1647f26942c6dbdf4d56e41eb2c898c821fac17cc273e8e4aa5608a812cf4b82f96019c252d56e7805298ccbe8ce40b0bd0f933b884c0faf97a958b20408b8a5297cce5527b2ca212806e72a3264457a7fac8662b82ca233e1c7758dc6e4f1b9995863f25f747bcee43b639b1f8f2026d2d2 Signature = abaab4fa6aeb0a0b34ee0d613a0af049edb4cedbfe9d3bebe9c00618b115b9d1fa524ec3495e1330b0936181eabb14299faccc40eaa8cca57ed324b7a6420c0e Privkey = df294e477b1b91c5ac5b98c330d222d7cd2d53e7d0bc0ca403df4ec75327a274 Pubkey = 5f0bd22f2f1896d1563b4f6940c7df89efc258c0ff6c2fcd674daf4f59fcdb60 Msg = 3e42d668409630cbb84812ac7ff1154f70fca8bdff3f1a040fa3af868aa1c4e91508b1aefdf5c3a8b4b077a4d162d2c05bd364fbbe8c5a08314c2e07dffbd6e8dd2e08a0dcc96ea92ddd4c97f79db9425a6c6b34c46043d09a68b7687236a918d21a561610a13ac5e446e0881bb26cc8e28aad1654f867ad82ae33f8f7a78a65be57699475516a1a8746843e93a1a294354624fac04d452ccfbe4fdd92a951aaa07d26676d5cb077a5000d439c124276c0dbcf86e7aa153cc24b5aff677c6badc261c289f4a4ae519b2e2fff312fbf0f5b4c4698f6aedd8fcb1d2348942de3fb73ba27f6db14c2f09180356e5fcae1adf65e22425f8c27f19e989483506e5df57a1b613a22e345038b3ea91c0f78ffff46383f38c72225358a34570d6f664a17454a151613f01cba777f62ec831875ec5e27d257f180b6366cb183107c40f50b01b2b9bf91b3b5549ed931a3537aa41689f72b257a6aa39cdc6fcedf143983be5bffe3ae2b29f82f882122d66a7925f5a710826c0dadb7e4fa4ec079ba2e76dada433f3077cb1ef74613fc5dbf8258b6da7c73c866372457ed500f97f9907e1fc26353c70ba3bd9c36151d46865d2c65986562485cf8421febbe777c73e6cd0026d66d35128b9f8f33264aeb56bd3e4b8d1f5266411ef3b23b76b36d4c9df3c512fd560c2be52ac523c19377ad2adc0e8c309cf5bbf72d9eb85d65a94847d497d8d102424fb84381666ecb1c35a3725d7d9e9284fdebb6b362aa6a9c6fb37aba87357f574c0e63b4497d498ffbb7d0692d784b4b18ce9f9150c146d3d18c382eda04938c69d0778f2902d5235a5652b97cef6d5f60da6bd7ed4ff97cd94d4939caca3b6baa3cfdac04cda95596f467cbc6cbcd9264167743eac1 Signature = 9945ab73b58562b355dabc4e2b6be7e05f37f89571440ccc32c1a94737095b7866747d21007000a0f0e351114b88e0138b55df44fe72ebe9591410e707fa9d02 Privkey = 70c6859f08cf42b4bda9eb62979dffb7cb08eb3dabe93fe94b01384617cf6730 Pubkey = 401c9e2033e2259fb6383b3e8b9e17b3f2062746bbe648cf484516db0f2f1b06 Msg = dd0609ea159921395d11fb2da8ea4f747d7f74b58052e01cad40a271fa0bbeed91020f4f0c0846c4f07778a6aa768eb51712294e9e1f32a602b152514f5e6d39f9e08f7a7812bd900c10a91469e47e8a78e54cd4bd7cfededec171ef373f1c4f9bbc2c81402fb14ed0bfac8d043f117d6124521afae0916a510d568acfa3aa3301bc979ac28d551dbbea6ceac4c212aa8c8492b3613ae7395dd4125fc4c25d5b4d99230821d4b17ec2ee6be7d604195a2154333b973526580ca7ef9e30c6c1dd42ef2afe42b11b1aa49b9ccabaca17091eeb380ec5e34ad1e3827cc60dacf144286c7892590bd2671a8dc5f3a702c1de7cd3b42c1b150b09c3e58ef6943b45d89d41df361f1d5c25565591b6ac8deaa73676531f6e5abe5804b0097f8d45ea2939177333cacef12e4b71fe4936bafe00747a8930bcea55b8fd84a01f6df84e7acb931fc7c01ddfd63deec3ad3e69dfa2b73550583d5747eee96c5536368797e247f23f537d79079ab6da314102c7443d41960e3a3d8c359c4a4ec626fcc44e110ea744d417aa850db8ecdbfe340a962db0d8c57dc517be8b40d14de97b1e9e0426447fde0a04e50679c53ba1aa3cdc38c7ede6db6c054b1e9ce7deadaf93ebdd470791535f3ecfabf3416355f7a18a38afe6bfe507ef08c4373a4a69dee1fcb65b1631a0de1488649d0bb2679a9a45f67820b2a4a1e5a548072da7032d172555e788cc9860ebb3c0c359493751b0c2c950a7fcf4803c147f9340fc93d85f1efa57b39081b92d93473fd23516c4950ed4b29a2ed3a042ae3d92a1e52cb709636fc7272fd747208bee2b16d191e4c6deb27672aa34e43914cff2055ca4ee8ba3e1dc58a679c7f7dee2c1d53e28750970f57d85eab1c26b89bb73e0b1 Signature = 0f03a4f15c339b4f7b88b4e21ad9e3d6bbf3effb7b678ffa500d47383b71a7454f62907b56f59f9b9af6d5b2a0fc1c737a64105195089899f57a2c9dba509e0a Privkey = c5962961815b57cd162403ce08e4105ddb8aae2d3f533fb49cc236b5ff504d6e Pubkey = dbade72236ba12d4977ba46c364bb69a887ff402de91d47afa9b93c95be71e7e Msg = 4ae4148d79ca9425592aa240bd153424a3bf4ae27395872ce5728ac7613596a77d5ce8565d8d6e1b5935b3906cafe1ff888ebc9815e04a624dfc4c6907b85f6f1a0dbddff62e9151220d474462cb9f13d89d3a93a00ba2b60f7e7ca63da17a6379d673551e790b5911727c906dc94f86d8277546c1564a45573a7743bb8a138cde87b3b2f28e5e245940a51e7c458cf8c5f0a70275962553e0d2390d171db44c2f7a5c9e9f93b90f7a5f54f191b0d875bad7e0beb980c2a3365cd7b9208724f4654418117e16ef7134e3e2794b6f9e80ecabeca3254e704c21b7ad30c5dee017ea2533fcd94251e55ae75a8cc6db6674b39c88ca42006043d6bd9b00ecf64ceafeeb402b1f22fd891f2d11c515c1aba6a2d4c0bd2181a48e43fd1c0af91f9b7b7d37f3dcd9e4c0a759748467d348a8b116df6a4eacf178aecccd3066e92dca45da7a3e319f3771eb3490022193c5b652f045687e1705f2e5691c134be4006353d7ecd0e918d5de0f3b87809fca4acfab94e1148ff7cf07f7cfd0c745dd2be01a24a5e069280698bc3f5400a6dcd08e44595c0388e44833768fc49104ee115bdcb02bfbda179d164ce969936629f2335601b56fe8f785cca3805f0403872c62f73c3ce80563d070e976d8ecc51124e2cace7ee18699047cb0f8fb8d9c59b8a60d12c08a09fce58fd92cd36db6a8e89d118cf88a92dc8a2600bd95f5a8e85db5cdbb249ca812ca209c7618051c4564a3a0e192b7e45992456c87d17412c11adead526ab8db21452f7471d17f2ebc90015450edf4f0a44fb2f4905f74d70275ccd89b93a650473c02a7da0cbc67915ceb7a1ea59fa8884472dc917ee9d246339c5926843ecf53fafdc56a695601a276c23a843e4d30f89c97c9eee6dfc7 Signature = 8101baef004eb6f5ad4de0979ff36d3439b8212bdc928942e431915b3fd18bc2ad67b26f18941dcb16d2c29191421e779fed622fd9f582644eaadb3fe5c09803 Privkey = dee6866c7874c127029e96e025bffd35fcfdf4dc36966c15ee6293368013d379 Pubkey = 08c94da351bb2bee72e6e196be748807583762c5296e05b1e529c47c6bbacec6 Msg = f1aa1977f5311b538b940ae442a3abc89aaccdcd0a79380a24258d4a9f1ce638fc2f5ba2e53f8e1fa6176f178d9024a77894c28cad42d629c793d68a02be9411b527acadae7e5c3851babb45b5fece329e29034cd42571083727f35aecad7c9be5954ec64e8f6ecab7cc0590e54156a4e1a45303849f7897e72cf2fbcd84f56c72f941dbb0b09a32e6386fbe18a43bb9bd8b793e4b9edd532103eab54d627117d28139b64e60fb0b81d09001bb2404d925e265babdc69f96b135e9e6ab7febb1ed3075d6aa2abd2bbf9b65fa9b3b7191ef37b633605910ee88f66eada79f00f536d380b82f2f4b5985112de004a56603f4436d8ff300f42bf5acdc7a4bf1ea9d4196c480495bacb0067630fcc000b4f279dd3f30f353276092d152c3f43efdc041deaa0bc5aaaba7f8bbd85e69c13742d678dbb65360aaf7b548a044c0ec60a57af650bc31973f832f961265bc2318f80775afd51f55194c42423f7bf4e0052f98cb206913ffea4886ecd27a4179b13773f947502e181bf1a1f2c62c6f08c20359f06df2b18127043b1070d0194ef5e5bfd37d227984cfb10989f21c71ad0fe3b81227d3a71789455eda383c22f4d2fcc72579f465e066f3d38befc024efef6c2e329649ce434d627367a900d07fe6234235c84656eac5dd0d788cf4cb31871824d66ae4bc89edeba1b36701298453e8da1e69cfb868095c3be6ed2182da1cff4905afd20731ac1ed984164737903c7d8bb0ad16aecf2fae337404fe35664515d93b701e2f878664454c0decd1c6558adace3cdb227507a51606f0a54df8dfaa420205dd57c65242ff24a405ef85c92d602886932b35fabe9c3bcebfc6235639e873fc2dd084c52cd6a7413b831d1cc99931373aabd847620eb69bb0fa Signature = b78ebd6d65b175d4bbd3d9a2082a0efe6e991cb2e403521eece00f418f2e956b66907880658b9e8e47699653d159132380d9ce1109af9c2757daf4cdf18c9c0a Privkey = 523623555995baaf2a27adcb1ebafaa802d23ef7abfa9775f2c9bfa07d64e0ac Pubkey = d34deae6523e619dd1bfc8f3c4ca4b78b368c0f720035e144c3f2fc105d4ce21 Msg = 0553e69ef211652d62bf281bfbdd37be22769d819746361c7d65ddd0fad677cc0438b301d1514578e0da58e55f729fa8e66ddeb7f973a818d24ed8fe027b8491179d07773fb5d2bb96aa85d6b3750454e50de91f9b88aee8aa68e6bb53edc66677b41e601a46ab4bb1e656e7fa5f0179933680a6ec9504275e7adf7a3248e63a0fc9c1ea5ae96cd0c65a89a77cec2b1fd8f4537e82c1c488a69a0ef64f58734d9e73478e1d1f123114ef66085e0ba319cb810b66af96d1308b1a2bd92ba2c265aa309ecd5557d402c3802cae8d7e95007fe610c2aa75fc66196c3fadfe997d6d5998e18d260e9da31da9218cbad103cbfc2c7547765d67e81f24ac83022ef51c6cc50864366a35f6b9b9af94e84caa9fd3d767c831f0967a61462fbcfcc803f12e3739039acd5dbe9366f05a33dbeaf360e2ddcbe5c443f80ef2ad62e03c1d5b70cdeab4a7dd41553064c8d152709deff82076b9071192376f51d4c2c71a84e89f2d9401320c2e459b3e243cca7c26fd098c264ac88ef638921d980b0ae9e512d372037d81adc48126d7c9e4b5afa57ec265d401b9653e928afb7dff9b48e295e470d6b52e88b39d0a40cb8eba249f8b13d81113db1d3e01ef75c722f269488e963cc8182704f8ca018e73dc0714e9a9fc79bc4363c28cb3984374f73b2aa8786e74e0159507a29883fe0ed1c600f525885f2f10ea006c39e59b925b765b1ede534257a1f40f2846584f069746b52f5600430a2863d7936095fbc22a6ada674d41b374e2b8b9a19fa712b5944533bb6d6ec43b89d4971b70205a6acd72a899da12618204db0c3e8267b845791693e0ae6a35f14da1f8f4dd174bce0318fb5a00f672ede42304cf04a62760577590f27e2dfa6e5e2795d66053b30af7f1bf Signature = b1871729fec83aea0aaa472b700acd094813fb7d57b909e0eaaf21ee931847addedd2be8533d0c305cb9cfe5080e76c2808b6e51c9826290ddb7b94b6f7d580b Privkey = 575f8fb6c7465e92c250caeec1786224bc3eed729e463953a394c9849cba908f Pubkey = 71bfa98f5bea790ff183d924e6655cea08d0aafb617f46d23a17a657f0a9b8b2 Msg = 2cc372e25e53a138793064610e7ef25d9d7422e18e249675a72e79167f43baf452cbacb50182faf80798cc38597a44b307a536360b0bc1030f8397b94cbf147353dd2d671cb8cab219a2d7b9eb828e9635d2eab6eb08182cb03557783fd282aaf7b471747c84acf72debe4514524f8447bafccccec0a840feca9755ff9adb60301c2f25d4e3ba621df5ad72100c45d7a4b91559c725ab56bb29830e35f5a6faf87db23001f11ffba9c0c15440302065827a7d7aaaeab7b446abce333c0d30c3eae9c9da63eb1c0391d4269b12c45b660290611ac29c91dbd80dc6ed302a4d191f2923922f032ab1ac10ca7323b5241c5751c3c004ac39eb1267aa10017ed2dac6c934a250dda8cb06d5be9f563b827bf3c8d95fd7d2a7e7cc3acbee92538bd7ddfba3ab2dc9f791fac76cdf9cd6a6923534cf3e067108f6aa03e320d954085c218038a70cc768b972e49952b9fe171ee1be2a52cd469b8d36b84ee902cd9410db2777192e90070d2e7c56cb6a45f0a839c78c219203b6f1b33cb4504c6a7996427741e6874cf45c5fa5a38765a1ebf1796ce16e63ee509612c40f088cbceffa3affbc13b75a1b9c02c61a180a7e83b17884fe0ec0f2fe57c47e73a22f753eaf50fca655ebb19896b827a3474911c67853c58b4a78fd085a23239b9737ef8a7baff11ddce5f2cae0543f8b45d144ae6918b9a75293ec78ea618cd2cd08c971301cdfa0a9275c1bf441d4c1f878a2e733ce0a33b6ecdacbbf0bdb5c3643fa45a013979cd01396962897421129a88757c0d88b5ac7e44fdbd938ba4bc37de4929d53751fbb43d4e09a80e735244acada8e6749f77787f33763c7472df52934591591fb226c503c8be61a920a7d37eb1686b62216957844c43c484e58745775553 Signature = 903b484cb24bc503cdced844614073256c6d5aa45f1f9f62c7f22e5649212bc1d6ef9eaa617b6b835a6de2beff2faac83d37a4a5fc5cc3b556f56edde2651f02 Privkey = 03749ca20458a35a37a8d7a26f959f0d59f6dc9973fa363c1ff8ca4e638c2cd3 Pubkey = eaeb94f406bde6a7cf8bde2adf3081f8375b87d9335d496c71d042cd2eaa166c Msg = eef5ceebd0445e9c9181aff9c6f2660128fcfb63691a42cfa443d6a649efc5fad8c20803763ee97d1dba08e63e08a2616da05077489f2fa2c56b7534f9402619251fdf9c320de7af109e2fd8b2565ce8a7524c9405ec0f8fcaa7149a6d210efde83b111cf82dc0835cf94f20cdb021b73bd262666555e6d62707b46ee42fa900b4f4f705de33d3dbdc68a88d1a4d0ae933566db6c6237ec8abe1024dac4b7f46d407be16594d9046c7312dda6614d9bcdb01fb8324fc62b8eeaf0abc23cd570e304fca08e88c735e5d31592409ceb583862e6b0a767729f7556fa2c053644d36c8337c0274e749202982fb4a171acac196c02b7f16a8da49071c8ab8076dd5d3abadfe3af82ca85da02dcc1c4a6f2e1930bee2009eee0d971e40dd12175c8d00694f0325a3b3133c0d0bd382a5194fb21422ce67c78a5a6e1537e3b97d5e204e5d195696390f77d19024c1bf6b5125a0cdbf7b9880036181c98e1ac2e5165bd496cf997451a1c12102e66946b1676abd4cbdd2c11673f4f2cd5f3c9a434d747fa05b40fbc72268b4eb2842e4741f51b7709b6accc47fcaf70d9c1c4c35867119d81cb3ff1f16081133f1659aed85f63bc901989e2617fcce153c2978d708fd02449ae4d538d122ddb8527c0a76a102eeff6edb65dba298d3c217f6551814eddeece1aef5f371a54f12bffd6b4961819a0f244ff0d7d8694c14422de9822c13179e4eeb81595079b9dd2ad1e7c39bd303cc44ae3f3634881577a266fd6bb7917812b999dc809dc09c3d7019dacd28e43013a2f9e4f94bb0bf7124ef091783f796397f6463bf1efb39cd46f3790a1d9b6a7c30f149b5e66c2937e39cb9744ddc66ab561bad4e6fa8534d69883822643d63d8bd7b181621a267e955e758d1792b44 Signature = 78a3877e02bdfd015e7f86a327a48cc3a5230bbdb1243f1a8cf227f78ab5e7680de301a915dc11b336fb5f6566848b42500adb5d673969122ba8f0053cd3060b Privkey = 53cbd6f68cee27b9f7bc059b803b447949bbc9c5d5a38652d7789ca15420dea1 Pubkey = 6116990b5331e2165f82743f01d8e7bd5d7088b30159833fa7b939cfb1cc04d7 Msg = 306f8e1df0a4ca78bd77e8e1191c94deaa82648355c2aecb7e82fc56d64c504619247e7cf8943328d11f3db4b1dc148e8ef6f6c3bc355969662a281a65576391242b7bd5a62f8fa7acb604e3a344ae1a9d732a254315f31a0464c1e6587462d29212c40e5ecf061e269aa0b90390ba41040721684bf2aa9582d83066221db60d0f7ae2f149a36e16952704fb1f3a982eac6b4583665c63e5a8996f24a566dd506a33d4ec8a02b2bd34b714c745000c0128a3c89d942506d12f4beb900e2903cdb34b35ca9b6d3ad9b350ac99f41db3acfe7fe55a28c0f006b844c9dc4853fd98535ada79416dca5fee5803a2d9f5d68e6b80539ff302e973f24e9bc88b7c4194117ddb9f932b32d5ec74868a13631ece68814b931421dc890249570341f4b423e86e8ee081b22702f649a6c7a0b7bdf5fb756202bd10b0bb2215c7d6597effd852f0b89abec15ea82257689df81e338254f93e81cbf061729d483eb5cf649805d78ed892dd0bd248ca1e252bea51847e1e82d39af58050dc4afbf9115a3a60493e8c0ba2e86e0898cd0d430891b9eb0a40f87431e25f41538a030f884fab36ad11165d267e8dd94dcb05b93a5ae77969430e1810134e157251b982df343dffae6123a99aa0562d5df72408f1a6e29c4059a5a8aaa4e621528fc63a9cbe1f4c0fef25fe3f8e18157774097a9d91020a9006b6c860ec1ee10d521d203a1f8bb82561296faad4b2203da53b207a459b29c18bc0649332b1807c13ca61acfaf90779febbc7f3242164797e6f572cb15a9be5887343455e26b910c8befee42aeb047f9abe6b3750dbd7de99202a0bb576ce1489e61c1f5d27c6792e63218edbfdb9b3dc515b4254d82c859e52ce6bd7ad296dd0e3709d4c466362f90265e99da7d0b701 Signature = d82504405ff16ba6443dc482367263a8e200360acaaa83fc4e4b72bd249f16103ec7e5a7e9ca17198f888eaca16b740cc3f5c3b7b617a34b9491c3ed76aab30d Privkey = 8b6574f6d7396981e223a4837bc339c3fd659419845a2121bf85be2e695d860d Pubkey = e3811aca70634f5a9ce4b592a17bb5cfda53442422e203cda9504c9d65b263e8 Msg = a48aacc0495fa0f1259b27865d3d75dc52c2c828ea8c4c2ad78577072fef7270f6a4d582bb7b962f4c3fd149a60a06bc8efd2970ef03148ddf6198b9b695a69fadb5340951cb75398ac51a4fd55430378cd5da8885210bfd2146f95c627632fe8be06de01a7c27b89deefd67efc69c9b5c62b38108f776229143dae660c10cbea3cd4f7ee53dc3692ed01177e4a6f7e424b5666f7f495f2a65602c7d08c5d572234a567cb6c38afd79cab5c4036d62637aefab5588769a448ab4c65e24554bd4158050e09eb58f99ab40777b0356709b7c025ae5ae5422acf87444931ae4d9a8b3d94476881128ba1eb7328fafc75f6b9dacc96d3b6487ddef7c59262dcada426aacb13922935411566235e058372622d885bd0cc04958dcfb17e08fcd7f147e20156c8e26af85530f5511a68db43dafc4e6a23f667df3743eedd71a3f07f76f94d1688afc8463bfa5a439ae311469948e7447064f0b0506f36719c13466a1b98776d967ec58208ba674037303dfc6190da783ff27303b86b5fc3211f01c915e83a6ad0121447911cbe1cf696f618f60236643f2e94e155db657182944c1a43bdc7bd5eaf3481fe1284092cb3789a892bd79a111fd410143cf91ae332860b1d29aa041d177b50d6cc2b9660d328c0f230a3515e6a0d688709c0cd347ad2ff32d61d1e1e9ba76f81e873a6c420f1707f3841db5196cb53f506f0006352c7c44c080f3096801a57a49cfe84205bdd7a9801f843cf26b9558a2db788ef1b237915d587b9ba9779890f61fdc91e03e4f4cdbefe417cc22d522a86adddb53f3747450ab62b576565db32e0cd44276547d9a16653c279659dd4d17ec04827c533e33390fe94f793509256db67531736ab3fcee2a301ac3f0a24d3b108d7e75c32a5aba36d6 Signature = 2fd0905475a2cec3e76f9909b8afd83beb8daefa77afcda34cb4f11728ef15fc9c1d7f6f6afffc28f3874f913e17980f0e8e3d5ad23951df2b32efaf6219ce0d Privkey = 29b2881b8caadb336e7880c510b80085f4b1221860b301eb4525650752a6d289 Pubkey = 0c5c44ed29d21bcadee21cbde61a9cdb6d5936009ba2f5b2e777c924ddfb6751 Msg = 1974a2e2b47949f467a931d1d9dd5ce116e9f5030ad09a8cc728d1aeb148bbf9acf59874da80e708d53c668f2f14d7522071e909808427b2ab5a05f8b94f21505cd26abc53458978c784d479ea6dab105c4f7984a0fb9790e50624f4734b551905aa5ffa60184cd201cf2b26c9795da6e7e08d6a0bc7722400fef94fc21038be89d34bcd14c427b85b6866737196152d4eeb66d05b245ae84bdc7787c14a8bec2eea5360f042433d70794467d47393b93757f331cf2b53c660d71c29582aeea79b12527a28b0c5e110df6f854eead9a2b00d42542ca8276bb8bf988baab8565996fee50cf31b2459c4c50ab475265e83e2285d43fe1f752a55b2dbc49fca04a810f0413bf6bd81b79ac64ee1f89b97bd7d26d62512273e24a6bab2d5f7d2226baaab7b111209bb03733d8a60dfa31a516f4a8c7699d8285c1065159a6c7331c1defb47a30ef5858c50b7d045124a09813d1cfda5c9cc3bb5bfae73c984197f8f857f186c41ab87fb7962b631f4d007cfbee221fc6572784a551194c19777b08e6b596757e7cba7a0e27fe453f90dc59cc08c6472431c020e8dd0917590e79c1f207383afb39076ad24da8ee52486739453a2590e51bfc89b13c2033cfa5f8903cbe9961a8598ba556232869dfab4d56edf4f05e8b77d05871895e63b5351f76cb2d2c8385c109d7306192a25446e4d62dc7d624f0c6673986be0628b2c2d73eb941d35a3433090f59b28a5979d56dbc9fd6973f63647642cd903b0cf7a6acd330d87e2292710de99e0c179ca78929ccaecfaedbf2742414f176b6090c0d59a9db781c9967e28fa4e77d2a082e42f52169167e92d4fdd82e2cc05dd9184c7dfee490a237fdad4dfebc01868e0a4353a2954d090928461821a7a848d1b60817fc3bdefa1 Signature = 99e996e85a494f1980cb07de9ca6165e7de104d39fe3c3226735c5daa569516fcaf1b6e4dfad0d389b6db0ec8a8f20dd2c602656b5e761c8f3a6558382151909 Privkey = 42afe89dac83e7d38996c0dbce0c9874c00927babd77ca8ceac34e564474282b Pubkey = a4c5f5e3803f0a03d5c1c906caec9cc6d2851407f1ca29f72a45f233e6656244 Msg = e710a163ad2885aeb7658eb374f118b76842ec36ef3b010c3c6b9559e8b160c2628ded0b8511eb4907180da4b621e9aa4a322288888a1c09130f69f890597a9293e74f9289bdaa5c91b6fd24aa044ab9fcb3402f7abc48d2ab7b3880a048daa448645ad2ecb55b3caee2d68a8bedb5d1865d5e211de39b0eaf22e5daf10f7168203aa15b85aa47bbd3cc4169cbc1fe80b4700b625871edabcd4fe74a3e965569ce245cfcde4209cc8abcd6797d44185b4f96c0181bbd27008783e9358a5394fe3a34a06871d379da35b20bb57eef9e5524ee7912a6f41b4a1f684c3919cfcdc00f4580baf9e09d316cefa0f465dca5d8eec514e95e5a57bbcd27e41f8119b264ae14a319d8c3859babf1f4a6b6b77e442c861d6ee28ad12b82362e90db0c3672b0e0d9ff58146fd159aa8fa99dc755fc85b90cf9419279c0624b93e75eda0ef7c09695ae93bd7282419377b76ca8bdc0521cfee6f6d729c3adff894687b177ef19529a6bdace70b685c6d7a5d74a08e2a9e724035975c80d18cb369470de7299cbd6b0a27c9232c7eabac86d5093a65ffe0b40d40befe80b68cd9dce1ea1e657e45e9c499d0b690f74455fb47096ed8c18d1517f90442901a6c410b7f6415f20ae48c58ade8d675b6c058df16ae7698fceae95aa771b4cd88a0b3f22c51f98c71c1eb46b264bf97a300ecb1fd26226ad8e87a058cf3e708e260f566b685314045133f4a5e8fbc34561b9a0f1ff9339f55231076b736b6e11524319a272bd4453a0af1493daa09167e84643d207a02fee98fb223b01a99aa5cef2b7001e470f6f94a5dc208edfc0cb8cf3114a919600f061172f0efe039036bf4dddbfd0d45f91443bf26f8e15ed7db8e55f086a4a4583f4bda0f556284dcf71292fe70fcaa8259b9faff3 Signature = 4fba2d6cc1b7193d3562f8c8bfe6905c829db265a5427c5c265714785b83f69514c5e30e28b56684c82dae2637581bf3f4ef271420bc7e6010613a38fa101a0d Privkey = 10f009aa887d91ced809afe192d78e4799d9037762f4a9d3a429fde0f39f7b7a Pubkey = cf5116b921212e9b78829a0263463691c6fbccdc0c118be141c96f8c88053dd3 Msg = 2edf14d6cd56896eeaa770211c4984bed80eca8d6534d5d510884f55f11f99ffa9f89b586ffe7b1ec7eaab6a9dc1a24a3ee3c7a6ab44ade9917883264ede2f1361be7d7a3817f29dec9581c319f18f95d5be26d9118be678340037a68abfc5efbb9a3f3f3878aae3721ffef5bb6a26c7b1a3a56d2bda6c6e860eb41fd8d8371174d91c74c5eb67c3855c630d641d2e571a9a51c6402cfe1842cef38980cb8d0a64bcc89be3189e6811f47e8f4d0063a5b1601f44fda20c1c4c2fc49cbe27a4137dc4638c2ad2d0a5474747229c568e3805431fa36eeba785f7b97844b5e319fa6a09cc5ae8403474bb91dd896c1ec2bac73d2e505efc62bd502b5ceb08d16e832ec5dc4f98b51b9d0738b9fb28f3abe8966bf22375a0b22c471a9e58e3fd700de15c5296373c1bc9d4640eb7816e1dc9c8ce8619a81183009ec974871e8f0a9772ede0a638b3574bf75d8f55987f3cfa6fec68970bfe00b23b59fb5bf4996ea5d7704fcf2effcc0fd7f3d8e6056008097f26caffd5415a282a276a9b2645e5cab12968872eb052f4d7c10cc7c21d5161818bb44cc856b0de769d559c55df64ad9adc16c0ac65838f660da81386b70b93525ec2f40f6f63f8ea5d4830b9646c46183bb4e6f27047bda2a546bd34bd4db5fb88fd8ab7c75f652e15d5aaa6b46a8acf6e448bf2dd64dee3c105647c7f83ad200d8097c444a158d85a54f0e5dbb12b43de943af1a81856ac969f52a0bd454381bd265041a2691d1a4a0d819fa79092c8803521fa53689ab852f1fbabe00c94b7f682d121cff54391322529c8d5ad7bbb98eafe300ab922f1c89240a1e633cf56a7b02f74a29214e569a057bd585e404d7cd5352041456e6cf90c15342e025670f4fccdf98783b6853214cac3fa808a66c27b653c Signature = c37bb7b73b1105be086ff3076972077262df4d7332f608c7b2b9d978d474cbbc271046080035f396ee36479b7a6711c68e2561c741c0ec5fc9eca1734e811f04 Privkey = 4578c65a7ca48f2774050a7b0ce7a4fd5ad4e696b2b8af2396164a1c7e1b7bd7 Pubkey = 15bf9dbd3b8173e6f03dcfd575d909845f038eaa09c5d908fef908a97458b3ef Msg = 506f32b96814243e4dd8870a8fd60ddef09bb8c563151070d9bcb2b160a3eabd71a044d71ec93fba95288ed6fe1a7b921651604307d65a45ec5d3f2631ace40e58d53c72e526886e16972f6e0db94d57b55634fd39d55e9bb7f212afab00f7746409267e8d565ff5c2257333c3d04152174fe12de6a57bea057dc219e2fba5f191ed8141c018969de19472d6aaf763f19ec554702bb3dcbe13ca9b23b2418c99e71838a88cf454728cf9208a16c84ea39829b4ba9b4c77e176112bfe1bf35f95c4028c7db80b36faa29d2b89e9e862f31000065f139b3da77d9d868530574b7e391ed97b34f878164f6b8d87b406c7dc7860a5175f920e5a62dc1fc82ed8452543b107360d35d2b4c4239eab466d32bfda34f51037a6fae76f6d8b83e8f7f489dd4c1b49c38f53576e62172c17dee3665fde8cbf015af9665b0f1da2fb77b134f04be271e402f31537c2fc05c2f9b6fc3ffe47de3369133867c69d10e7f537bae4567d468e0f2ed806fe335f939c75994f363ce3b70daa7d5bd2317c833851fd8cc97251ec419023d9d0174d84d5609a6918a1740eb1e309bd127366deb9c5ab12992e9902e015fe58d6adbf52d22a760acd63e1edd8f138e9fb0137188601e1978e7d04fb2ada2b2aee12f49f2836c6842d88cf48c866e3d33fcd269c275c89c25e3669ca90de7b67a7e7a382cb7efa47e9c2bf76571c79a25085ef020487152f06bfa133015a1b8f1c0f6a9f0eae1ba62bf104f1c16ac14e1e96c4ebdf061e0cc7101d38da7e9e0994daf0f322aa3cfef91b616c2d000689ab18ed45268dcd275094f656ba3cf515261024741f7444ab7fc4decce16756032a1be270ff0b0317542ba02662260a376fc912cbb029cac54515f5a551364f6a99ffad0b9cbcd0e693b7a521cb Signature = a1c242b45e94fd180f054c7101e55b396568f483db6f0dfc4168b69b59d385814c19eb3075237d1fbb1feebbfea50c56813c8c39c22752e02db7e57f3e3fbf0d Privkey = c21e70c46ede66e68a8873bbc64ba51209303a0ac4fc49b1d83e8193ad46c037 Pubkey = 9fbf80a42505d2c952f89f4558c3e6d187a7bc1ef446b2e3732343c13b33d200 Msg = f55aa570ce4fc95f73f51720d254e4695fcdc81aaa040130c7687f039b8ba59ed857ceb29c121025a857feacb4a01f38e01178310ae6e35c998ebf89dd79057b4afc6db340601c81703c87a8c40e5cebb0441df78a6de13a447cb016c65e741bb7df304d83056b72c682c731fac0a0c70b7811ca14a50154613099c2c437521c404b6361de3621f8ea56b08ebfdb07b4f2bb8ba2ecc164336da8efc942766ef0c74dfd3b49e087e9a27ae54a7a2b98281b9af93dc11aa2f09224ab5a730f0218f4a6e1ea4885a77fbd93a1c58277d9e01be73a25cda918fc27dddb453a5da6902ad02ba05775c67e07bea4df86913466744365c1326e0ab5e1254c17967447d591ba5ed1b63a42543b87fed41459a089bceaff219802a87a872a763e692333ce1cc7397825084b2b831e93d80d6737f32980f2f3ae82c62190fe3fa700c5b7329d6d50042bdf831f37548fcc80b11f57cf20f67a3bb651a7beffcc48b70d17eb60f7259cc53bf7ff6080eb2bd0923b0483aa3065a8955f01d23ba80951e0aefd2a9372191572bc52916aa22a2aec393767fafd086839e236fe0460ce6d639c7ce69fe7f9d3aad2130573443570443be6bab93a06a54b8ac29bf33ff9949bc92158e6924b6b68ecda5f6f3aaf42b3d22df6d5e67d5cb3ab71eb8ee0b0e66732e1daca6cd60d9aa74305fcd570076d228d446d5ee542b10488bf8aa988f451faebe74ab669d604d9ddb15106620ea02e8db38ce639b5747812bb9048ee8bf72b1a951a05dffac95417cb43b06dce61ee3da6f2832ee83b2e7288ddd62eeb5893f7f2f6c8090d99e336c9f9069e1815985841bdd505b5f83d895e879593dadee72ceb9765699bf80bd06a5c55331b2545527d0c7caece96584ce3ec7fe02260f20b8a1c0635763ff4 Signature = 0ae343bb84e3a299078e2434ba220022f3160f968ac04482bf8cad13b423f2670f01fb5f7b32c597520f84607e0f79c075fa7078e6e69d3cec319265d466080b Privkey = f2c10577f7df77f0c1157a8c331a7bd2ae6386670eb65f0fae122331690f828a Pubkey = 0d4c340fc231aafb3b6f74b89bcef7eeaa0b04f293ec8544247bfc3f2d57c1e0 Msg = 38ea1e028a493d1c60ec70749f14d436eb3a2b2de54f213d01a645b580430ecd8ece6b5569cc017a4943e5595c5ed6e48c9443f2fa5eb2227ffe56d211f269bc8f6fa9ee8cd56f6b8470539208afe29ab0a195044d957b31f93e184a9cbef1a14e14f808bbf589ac7770084f998e1b254da59ca6d3e62e7be1790716d2560f015f399cbbce48cfd0391ead1993446f6b2493977d93d7b09a07a79a59ce15dce7a1da9c646f45af2ccad55ba158e638c4a30c5d30e9ac6e3a3339c243426d86491b2d92dac1478e8d74ff0bf149bdb5e09e3fb6b8262eb0687981554ae2cb47196339079da0a1a57239c19bf781f62fdaf4e31560a84317ef030492cf1bb1305ba8518ebaf2b434d3641672c8f6ea2defa696dc7e4f39efc08d288d1c966a6c7148c012eec439f7e12dbab5b87cfa44c9ae1900f8386f24444e1092b23a274c138e95c661e9377e8ad2d1fcaf1939ec9a632a873f7eadbe687b4a033b92a477f2e02e9ed92ce4f95cf170b3901518a062143e56db054df4e4431544785a6dfa24eec0f0de7a699ccf286dadfad85903612250764f25cdea8127d0078d554825ea6e7371c438bc46f29fb8937f8d9a39cf8849052d43ecbff6c4a3762a5f400c1514e85e91384fef9b40f4314e223a9d68c526acc70227d62b8b637a342df113d318202c51edd3c1efd1ff20b1ff078b32068e794d928133037f1e3a34689e629e43fd2b8e88eab50d7e7ab0647014ab5e4ad582006567eff72b5af2dac536892ccc871f8a80b5cb79d90bcc6b77d4cd08f876184ef58c064ae430bb79a6b9e96b0ad87368aa838a8dccffac0cd8ce9ea0d0ec4c4b0f42673416659c984992cf53b1e445431007640d47ece26dee4a2943aa7097dd356cff4754f21ac07f6b3f73c469055512f37aba Signature = 60b703115a322ab892c276bfd18f70a9eb0c7323e2c0a6eb5fc7e330b0bc3b07a578a082846264f032c6191d040bd98e5d5a4d4f076fb9062acd36bea40c9102 Privkey = 041a97906b5956b9d340f2e0d7a1dcbfefe663e9bb4026f8cc1ae7e2a14de27e Pubkey = f382d32e88c3a72c7caddafcf8aa699e21db7a6bf4edd6e49a005aad702e6a79 Msg = 71a75957411544975a48cf103aa1f8e2ad15244459cdc0e336966eb8b26c97f2169e5d78537037efc077e86f06e05e9c1dc3418288c0a2be6ba34b3a04ab20bae7f3621094b87d78a7eacb864d4078cb4efcbac5add937a2c6012ee1a8b256cc276b65d5e92b4d00b9b11fad884991dec4c1cb9dce1863c8b0a210161ae6b3f8bf9cc4dce4adfdc8ed57d83e95ab9dd2d92658dfbd3afa99e3f8951e2ad74a148f6f597eb2c945c1f1b94461ae0745481fd0edf838c6286035e36f011238875dbba2289d3d6a3942a7f9554c644305244ddb77c117cb4b56237729dde428b8bb42df9ce29e144dfc96cf6c6767b1ee6d053ce4f8bb2056ab7810aa1368a8910f2f69e061c19d8847184fed534f98758d703a76885f91eb752a21954a10c6f6b4da10464ded36b00089f662915421bfdad496753689ccd03b624021080761e68176b10697dac878e4c3db2fd0b28c655335d98016f19f265bb0b2434cb4637844d91ed0ce05ed2591fd998965f83f3197d10eef448850e792032724701da305cb6d794669483fc3dc6f686b183e2999130c8fc0058dcabbc9188f26b2d63ebd6cb1e18a097c7704a59b5e187e0142593b7083f7400afa9b1bf0c1cc6c356bc4334af772e67153b45b331b990920c24eede2c6e323703f52ecd60735b23bf22b81ee775927c37e53dad7596ea65a73bb96775f3b87c8b3c088ec695bc3a7502c0c510f020bf9aca3cbb7a2c011c67ff27d634caf1dcfc58e5e397e6658252272011c8ffdd64230a93241fff68372c4ba85382bbb229309652922db68836631e55be69ab6adb8e4335357fc923efe154afcc222d60d07f56990a3e5a214b227aecff2cd1bb6f0c79ff545f70a616141a9d53f922a02443f7d2a4689c35b095dd394d50bf49f9680a5f7d9 Signature = a23f032e6692a0e8bfee5b2d30b414cb16c35ad08da31f696d461a02857822c4ef357f0ccf31025a4dc95ced30a994f41edd1d087afcaaf3e8e875708320f80c Privkey = 4bc5e05aa003a4492f4bad102a5390f7cebab3d3eca9152142ad5ef7d84030ae Pubkey = 6751d3ad8bb6c64d6a17d7e447a27da22f5f0403f437bac9449f13cc853dd840 Msg = a8f794db1795667d28d24b70ac2200a6239a34e2438ced1d03f97ed48beb4d6bea67c14338f7736419dcd2a2a7973726572e6afe7edfef22c99be8b069f04f6dc61a13b343c6e585abad2214d85c36f02996fabb46bb91b5176ac708e49a0b053017048fbb55453f2b8208d6678d1a8cf6a1ee9ad7a91e380325635d1e236a6ca1d6cc7f6b59f2a2bf184f5ee451d6799f69ba11a0cd6bc04be8a351a80e725b5fc4563e45bd4749ecbc45205229105b9de73261498527f3d4ecfbb583ff532753d07c38526bb482d171a261b9cf89906a7dea8cbd7e726ba31ea68803a6b004f6dcd19e671950463738cca78bb0dffa3d6457e4aeca657ec649b97ee30e97c8cbe6ce43c2aa9a69958e9dc881e4aa7b3278074e787ace5fb601d7faf7ca5103ecbbd3bd554eb1b066f8296d2cc57e8c8a32e9c0e6a926964d6df2d8645864b322c322f1ca8073cedf2b556711a7a20b77c0a1ed277a9a6ca2c07154e863fef5a404e3e89f0d7f30f218ec4de7a53aeb9c41eeaaf6ce749649c9998fd62bcba2872338e19c94e59dd5e2dd776f53719d21746976932ef11abf7a32ae6b0744665d0e0ce513955a9e68531d8ee4de9a8d35ddfb88eb5a486ad63137e8892fd7c689d4f9e7021b1173bb3752a5eecf2992e3fd4642263c7b3d815c29b466ab69285ffe4b8dafcbf3d01d635553ab7575a7a3471edc7be412d3d01e6fe8e3cdc3fa04d2a7599381e22bba49c5539d79c62b52bb0eca33f74255e41a9526a89289b15f1850d9afa87e6b6fa127101c1a6d88d433e0c86aa60bba8fe7100ed61d5a9d00a00764513eb1c7f5f5c3b3efc4532a36b407fe2d17cfb4e6fcd6049cff3a355623a3a41390ea48f42120d897949111be3d169b2d2ef45bdb894fe20b1a95ef66149427a9d8f80a9b2e Signature = a24fee11f7ec6da3e9dfaf6c858ac004b4531abd1c9d3bb64f40dd247f00359350e43b2d4b8fbec5f6b241ecf9f1101485cf418735b05f712018335b20068308 Privkey = a3bed9fe2354bd2860149a3db75a85b129cf83e9d73e6317ba7054521933f896 Pubkey = 5ac03b4f13d91d066b2ce359e9bb1dfb6bfa5afa382fd1ccd72aef1176079f89 Msg = db853808686d6d21f4c57b541e5ad63394d465e60078643cab1e065c9f306c500078f0cc41ef0f9542b5fe356aec4777ef8a95554c97b6a44099e9bd6404fb0b2e41f91914b074d12237cd442ebd40b51b8bc8bbe437a2c53332d2beb2281bf7324a0cf5b741bbf98d1eb9858be926e915a78e8d314b4144f3d20dfc6cb7f48c23af90f871c6cda90845a41aff1707a87b4e5516f18e8bd7683cfd74070803e888338c9a18f792c8d3a704170ff982bffc9e8ec9ea5d1a62592f1688d4f2b01e11f9f88774c47ac1d58f690bcf288cf8a473d350a8239df9d3a62881dadd338531fdce7615807ce965496d6f35d6c042f0ce7f21efe5ce6425185941ed5636b8ae913a75d21ab9dbdb3c3b6687a45e044938a9f1c13a330ea9761e283e61d4a320e1f559882f34b607fefe32c343174abcdc77b065a92904b42d961db8ed916c01464ffd43f93c1077f1df7ee65031cfe05d780d01d08ee036f22a2b0512193b0c0f3801e0a0208eef245c9e519352d2b0096382f2cba06eb2a01dacf619eabbc883c5d4f2fd7c3423179c0f5ffdaf8cafff5c46b34a09c3c50e2949c06000207d70d37d65a743075fdc2be62d412aa63e363706ca90e6ef44e152ea4dc5c2893ecd08d796d41f172254c3d1d14bb067b53a0897bbd73c9954d9648b2af10d9c2703e38b6c62469f6f958a1ca0a320c12339e90cf768c87b4738c219f8093bff4c2cfd29459f6d3281349378e915a3b0e724c74d2bd7a851ac7c6b48e8afc7124fdcbcab5ff80d1dee30a6c024cb4331972366ebab26bbb9f608caac7e51914df058b9b3745d98c5d27e97105475ec017377e6316198ece4ec5909f04fc27e7b382e66adb62ac8a977f376fd5dae434fb55175249ca1ab6bb02dec0696f089be3454887a0c32361d172bd2 Signature = 33bc1e0bf1b493e0cfb7ea40480a1423e091f7145745013173787df47a10db24c165d00596fab70e68c94c104e8a7407cf695cd3fbe585b5b176b85ccca4fd08 Privkey = 88a24f0df3ae2914df79da50ecf8ecb42f68c7baad3b6c3a2e0cc9c25d09d142 Pubkey = 12e6603f713b2305358568710018685e141553c47591396fb4259e42dc53b9c9 Msg = 654e9edc69fe634c2308ba8c46a955e882456286eae3593cae739c44866c0de9edcbbf0db1c44149668467709dc9706298dd2eac3301dabad5bd8e93c5e8a93f194e0fc1d9f376c144c293aefda086b2218f2e9dfd7c2dc52ba33eb229dcf7bb68ce0f876c5fd4e81afd80169f73cf264e5dc0ce16e1b876cd11c7ad89058ee0820c40005d01f119f8be6f1afbe24ca4aedc18e97896827c3ed67fc45630e7903b7fee9c990e361937bf4ea0a4d8d16cf6d9cf0381e9065e3625148f8ae0491a0341d0ff9f727be1f310ca1ec3f0104aa054321784dd24d53c985b28d44082f8e1c108a44109638ff5116edd85aeb86b6ea512a19b602edd9d211070d044af5bedb6c8527ba3491e345bacc130b36960282ae737b85c769274f0f7c588f40e6625b236bdc1a3b87320460eeeada278124b5668874f39f59c2e6aa208c3b6a9b845c4d0a27a0546786fa13e51cc98b73fd7ee327b6215ec6b629f4cc7e4bd3c0a3db78a21fffe24c70438716bc37b8da7c5ff7c3688a90339c22eb50b7c2cd36b68831fd5939175689bd3e22c3881af337ee14435709e351040ef3da955724e51c24a5e2c09f891808393fbf8ef7f1f5f0298deebdcd8d666cbcf3e866c718999ab6b1feec9c47e02e7d63540f89963d542c5d01fb6fc30768968ae81b20c354b4000c132774764d6d443add64f6dd748f5fb5b7f6eba401db4318be993989fcc2577961fa5ad31f6a2a9d6a755285865cd5dc3a88cfb5aba7d923baf78b5d131b4c214df55b6171f45209e21ca6645490d3a3644dda6dc929c7c409576d37164755ef8aaf3dcd4d22775ee7dea0e565bd54727921c649bc51f20c1f68c1fdeac455c67d71a1cb8837f4691448bf0bf044a46f1685fbe22b1e01877f7477d3499408c4c316510ce2e55b98005 Signature = 1707cc009186bf3f03f7bb9e3cd4cf6b737b7a6baade7fc6c3ff5c1225dbb2baf54f47c85eafa132c31eaca03e6aec1447733facd37149b7c6cf0cd41f611404 Privkey = 184d0ce2e9db7f257a8bf4646d16d2c5efc2702ced026b6906d3c8c0118f2261 Pubkey = e9dab8fd9d94dc9b24cc79c635cc57ce66518982ba3e2447240741bac0730ec5 Msg = 6a9b876b0bf4189b3cc15f9eb4fbe7932b5577892a22200ce107156853d6d3ca363f025ad7a2d862aadc742d9415bd8d1fca13c9dca3586044e55a8cf5dee1ce564576e3e8e365540546501b34ca675cf200e0771a818c73d37fcda8cb15e48d5a0b9ea3beec0ff6610b2a8a214ca4f7efac0e71381052d9bf3c00c329593474ebd0a687a0b41d144b5e7ab1412b970a74baba4d274bb0dbfdb02b11f7f63964ba6f3ba0ad23341d083b91a4308239e33d50824396126588de72a2390c1c0fc06747c28772f630bf4d143f7a1159f028c093404894e6d16f634635d4fc330f3d7a7313ef756f5d49d8f6205eb1c792a9495da131b43345a0090c12ca56e6adac5be0cbcac3609d69f72415f6c37f3cfb2cf76b3e65f3c93ac92b63f2baa466249075bca69d4c1d1f3ade24ab31effcb90469c24bb410ab4723e1b7e1c88b3a36433563f71a99aad58fe80568f9c102da89bad97963e77d6622483166f3ae261f32a52a86101ebd645f6142c982e2cd3625cf8b46b9b2891246920f697fcaed397cb922c274945167a0e619b0b506377606db045783b0b88ea04e932d21ffc064a12a40ebe9b480f1a2c7ddd395a9b15efdc495c9714f36fa996f79f8eb8efa52d99a24abfef43b32a237c5bc0018da3b162f59b8d3d474e2ce08fa8024c58acc0a99ff614e6cd7fdd9ca4e8f41a1449aa618d03337e8a374d56055b207a9dbe69f5948f901ca7db0410f01aa373d9e0227623599bc212845b006e942fabc582cd726db5c443eb2dffbc9e3e7f0e5cb6744f7ad716050fdf2c60c7c77c253ab745db9c8552655683ea7ea680aa4af34df1325c29b8874b61be23de4ffba25424f4619ec682c26b3a67bda9bc4c94b79a9fc4d82d340495b437a1cbd6b60307cfcb10026f964a017623e33dbf233 Signature = b1e3bf5fa74d7e442ced9a98d927d8c45e0e64d874f8ea5920a360a4bf42d83ce18a924ac796e1a77d1b0208294b50f822177fdbdd458c74356fcf6bd7945106 Privkey = d02bbf70d51351e3b47ad8e5ed263dbf556d1498fa9bd5dbd99fb4269009dced Pubkey = 8ce4b59f94ced6ec9614d67d3066d9d3a0df7a46b37b4c1725ef1e57bc68a0d1 Msg = 554560f7a7fd1ae7758a2fce7d780f6b3f043d3af89d4f19ef573c34997554df243faf2aaab65b2afdd28610d4a51e9a4b464db6db09ebf73b7d24054cc9b12814bb29ee99e1a73bd603898360f9dcf01e670836286f8236ed8cef075f3d563312c16c73fc37eedf252f8f42d30a13e7fba3b165238c7f81eaaeb53190f3ec3b5d63f0ee03e3987e390d1d81e8277e9f6c1ee6ec4ec3fa0d720e9f53f9c26f04aa2ed2b5ef3160895999eace29cf5dc254ad71106bb7e8bc29a5b1d2412593d08194e88e1659a73159a2a22033ab066e8d3d8c3bc86b7b01de81a8c66047b07fe24ed240318ba37ba3efb6cf632604ca4f446a75fd8e70c453f0c60ee16ecaf524e703f47df5c282ca3289b3af61dee4709ee085323b1e5c8a6bc0766201c635031446891f3494e9db20dd4e9e0838249a67e138d13ee2c96f61e771061542aa16ef20d81e3a0f4e4521a6cd6c92fc26feef03b66c70e035cafcc19c96fb9d82918fe197780eff0eda6e2512c56e2a73d77032b768919bea9772f5989c8b6c65c3d1e97a2180cc3a37579da70ce9806ac1285a3eab415c0607d88cb86542eab90b9d2d67fafffcad23a714000ee59ed68c956e81c445428882f97af74db362e45c0d1bd8856eed166e4aec4bfdf95eadb251e2a1ef804852a9ea77d34577fe70831a928b101b60ac613e7ba2e6ba0a94013a64c2f8219fd30bff409099667a786f99327bb03e2f2187f445b46beedab6d325afd904e39543e93f4b6c5443249d744b2d1a43e141e4768bd40aabe4057244e1eadd9daec175719e51a093ace32fe82b2eacb5ecb0da6c1ffe98c8cee7886e301670dff87113efed4282471afb6b8a0fdb505e2e8e7dbc1a08a22e9680bd098bf1275802bdb459413a3b237d7713a1bbf597e6adf2b60eaf823791b3 Signature = 6e7c66acc954ffd9dd4c1c6335ab4fe79dbbed782c4a47ec30d848d8bb2b4f1069dc62e522a1e8017f54a6345e1728c073af6447856d8c1ed35878b571e5230d Privkey = aa0fdae2a5a4c9c04521913004cd89efbc88b2dadf5abb246f3ca7f6923544af Pubkey = bffcb17c35c1304cdd9d624ff69bee60ec7c9ec327d12350d70fac12b47cc25c Msg = b14184cfdc4a5f0c7f83f94a832f588507e2d72a89329870078571d208a0c4960c2fdc4c236cf88229981d12b10a1b6884c8650ddaf1d4b2eb981575b1e019fe3f60423676f8856a992cce36d6d0a3d026631c8c1e1ffe34134b296f40842b6df4f86f833e0175bae50e86bf856d1ee79925f434b8bf2c84519f1f5d25386049ce3ca61777e30b700a602d395250b60fc64ac6f8db027e8da8b9550f24ed11a11d9f9f9c5e0af145b8659751ac6b55861f6388a64336b31efe45c0802d76a53486a81eba07314b4d961c141ab34e2f76edac0e6de31422df792af081e769c7ed05da9a5af2fdf36f141769908b700937f0e1068c131f176eb96c67afdbe78f40d86007fbcd47e49e2e4c4ce049936adff1ce3eac42b96b3429b5626b1aa62acde07f45a13ce1bd211f32bd7efe4790c8371ebf87c164477a5c9fa3e78c2f88077b097344cffa031c4429c7f42dca07737850ee7a769b36d0f0625adf120ea23ff4e393a4fdcb6558dbf9b266a032e3b0599b9d6692fcebd815a3897607856325fcd0115dc310db3a8792fbebd399494c8371e585727b3d632414496893d03813ba1f99661bceb9dc18ec5dc27f52670318687769fc678ddc7e40227c200522013f5c0eec0e4781e6fc153a0c2f4f3f95e517c8419924ab39992af8c19465057f134486696ba7fd4651768b4e749ef36f02444617cf97f0a423e4c13b7b66ba2b6c456878b0b50ce2ee5ec564ed8854f782aa1d1c6aa760f2522c7d97b9b1abe0ba810959d7aa403a99375aa3e39a115d1fc6fedd002f3830a50a837dc720329ec0c73d5bfd500385c736838287e19201525d189c3a084cd5a3f359875e3b8325289ced18b63b00ff9cd070c3e67444bd3d8346174085cc45135caa0c67b3226e4a52e9a1c55aed7ec5fade6bf16c19 Signature = f937298969ca34d97584448907358b0f47841f3023afc7ef7681521c5be0f5e5628a8f607e2f31636ef63646b0e9898a72ad355706d2c8060fbc640efb3d6605 Privkey = 7162fef0aca4974b094a6a08054395f877ff9433f1e33e20e88eaa90f938997d Pubkey = a280640f139f45c35a4871537eefe6ef9db02de785ee9fd54f805fb57d3746ef Msg = c90f450bda1c6efd8d1278debd7ae03e2eac2740a5a963fcf96c504e31d4d6fcc5e2b52a2518d2741c55e9591867b2423228f9c19f33c6f38705c62036d480ff53df12077e38fdb073c673105da1e11619ba5321a71b5f4993234a11948ea110cfa242bc23fac9aae462606e39641ca7147eebba1eec553fce94e53e4e01b073dd780a2ff678b31572ca11ee0877e756bcdb6653e5e1b4cbfb569a9d60e3ee336182dcb9b25d1be6dbf9b5c7146d775585834cabde0278aee5d57c85e983f84d8833a9e15bcc11198e1c1da6ba59282129f1db966f5460c8fb6530fbc3a98a31fc0f4e9b337366eec1dce108c826d49045abfa12ee88797f08f0683fef77edaa3543b91cb118e424d9c408da547431125107d9b0744c2443ce9917e1e328d81850babbc94d920a1d06e524dbb6c23dd82e1787822d71c4cdc409ae85ba4deb581f934748f75e7a769b9d68c4589e594e65cb6c8f4903ffbabd5a326e89441a542f8ac264ccc64e95a8982a710b6c56ff7d10916afc409ea8a41b74679dd6a766f59c52b9305ba733b13c9e811ee13083925f4200682bd05dea339532522970aa149d004a2ea20ff461e9ec0f3b62565c1a106259c836605cc27cadc9515cb9979e89af287c027d75edbf87d5cff63a7fec9bd10e7877ab9bf868d734bd3a2374cef7025cc4dab710e254806685a136ecd03e36770346513a15145b890eeef47b80ea08e46c81d202e533e9a06a38a6f76ef57a9c736ec78d00b808e3ffd9c79b9dc7a2e589907656c932ab8a8b57da1a495ba7452015e7924b5269ab1f67bdb43a35831487ab9002f52d78b134cd3751925aaab0b45c8e6b0f2bf0cc9a4659317108fba9136aabb0921a58fbb9b50e51243f9b531847dc9657e96fbaf7aa698fe6fe44f90590144c70337250c58bc5dd Signature = ae161cce95403384b65c6bc9b393eb072564c35f3a6c04fa517ab068bcd23767cc0c8edd92b1a13ae9a9ce4864137fb89c1f37b748cfc9134b6741ba1b22280d Privkey = dea180c91b533aaf736bc5d3c8e474d5e5d475b75b92cde6bd1d10f3b8f55ad4 Pubkey = 30b20fb320b00e77c4e0a8eb3730af3c0b1c5f5ed9ee2b0562707e4f55c4938b Msg = 606144b7d4f96bef7f112b6d41bcb500d2136c134ceda220e24d0f1524eca12c30f2b102c7f378d6bba259c5b4a5ef8ec9309d5c8da7e8d2ded3792aeeea2108f77d66b23045938ed64751f20d48326be2fb99628cfb1873d7dd27581c105ec13249a952a50784b8b34cb3b2c1a004fa8b628a0767fa9abf058d955df85d134a0fc7f4b7d7fb0c8d31bce345dd0a4282145afb2ff19751f2cc3a1caea242baaf538749bf388000e3dc1d739359dfebae64ae1e10fb6fc17cc9fb950535c2de129587a86859b7be36dfe9b6c1141b25e0915c8d4aa1cceae7046b3d7cfa940bc98d4d69fc5a30dde1dee42fb5272281bf8f8e7f3e1a04397fb4f3adefc57532ddbde36833a676e6f39c82aff6bf4832ec971e03be3829c02a203c82d9eb8c1630ee9693f45d26f5f51a3103ca64d468eceac1b29af4c42eb216d76ec8994836b4bec76489ca5070680c2c2eb457210a77c47fdcbf600172073a53f1453bb5c80439c882f0736de40637b4f5ab1f761ff355c6e9bd4abde7560d5fc113c830159a1b77c4e87bc2c69880a40c5805ecc8aaaf57575bccd8177fc6b83569233c0f5ca223ac4013ca106cac2854706aead714fa29f2860a5f9753268a3671d9f59cde6048cf0b8986050f7f549e4fd7557f2fc3fcdccddcefda586a64b3006e5825f27ca31687caf663bd90a05b1152d7c88d7f1051a9d791748651d888a6a12f22d6c8c3f78c2b86eaf5394b4ef7eefb89797b25e542dc93102d021a1d0bed6a7dcdd8102b8f0430a0bc21d904a3c9346c018343dd9937cb35250007a284825db08e9a11fee31cff7a314c48c42d8b314acc27822af03d1954c7cc8bf9ad4e9e98f4ad4efb355288daa8c90de9037e64a7861f5ee43ada9f0fccde34d0bcf50288550f700f215a7944a5380e2a8e3f04f2b4f5 Signature = d083333fb84e79c9b33e55e8192d571ffc8dc50745b6b5fdd8c44d92a63fd178c4e57c2ab3a1211c0ba2d39da30b06629d8d1cc1d9f2593263d524fa5a2ebc03 [SHA-256] # From draft-koch-eddsa-for-openpgp-04 Privkey = 1a8b1ff05ded48e18bf50166c664ab023ea70003d78d9e41f5758a91d850f8d2 Pubkey = 3f098994bdd916ed4053197934e4a87c80733a1280d62f8010992e43ee3b2406 Msg = 4f70656e504750040016080006050255f95f9504ff0000000c Signature = 56f90cca98e2102637bd983fdb16c131dfd27ed82bf4dde5606e0d756aed3366d09c4fa11527f038e0f57f2201d82f2ea2c9033265fa6ceb489e854bae61b404 [Pure] # Same test as above but with Msg replaced by the SHA-256 pre-hash Privkey = 1a8b1ff05ded48e18bf50166c664ab023ea70003d78d9e41f5758a91d850f8d2 Pubkey = 3f098994bdd916ed4053197934e4a87c80733a1280d62f8010992e43ee3b2406 Msg = f6220a3f757814f4c2176ffbb68b00249cd4ccdc059c4b34ad871f30b1740280 Signature = 56f90cca98e2102637bd983fdb16c131dfd27ed82bf4dde5606e0d756aed3366d09c4fa11527f038e0f57f2201d82f2ea2c9033265fa6ceb489e854bae61b404 botan-2.4.0/src/tests/data/pubkey/elgamal.vec000066400000000000000000000234101322470703100210610ustar00rootroot00000000000000 P = 136550132129373534922507711226759804754619982886933552169144285816422961826670939809191792098144910680550713812844380006313555117122165428748783786608271022403942873493436560444821356125311154291882139133582532448340435515492341806441259053210325586938723802483143283639706381254257990493250497160336192135319 G = 13 X = 1510837665211600837455333225484573368412905214721958306259132011740929687444 Msg = 02AD1D776D591520E4D8BEF8B21CC2F54FB4EB788E52ECEBE13564435DA66284D51A6A6696E615EF599786CE4CBEFAFF066E0A1CD8868454EB5CE0CA99241B29E1D1492CF2712C2C101B3F3779034683AD8271098C2E3FBAA83901A97D9645FA5815AF79F4F638ECBE09020003F434D708914899C668F34830E70F4CAF0803 Nonce = 0A5842A8D0C1B07E5DE6FD3E0C6B1108523D4D35417F Ciphertext = 5B99F58B48F3D473327075F2FF4EEA3C8C1FEB0B241F042864610D6FC512A81F431A965724195DB71C3B84B6B9F1DFAE0DAE60E7CDA957703D10FCCDA45CDD0EF8C8F76AA4F51F3EDAD8E5085B97D69523A3EAC89D67CDFDDCF0A30491A98BE2FD6C5E69C3A2C95300B9DB4EDF2111E7613EF7B2CA430D0CFFBDECF6A7BE592A853B404B6910C48A0204ED3430691E766FBAF21A428B9F833C5932C053C616EEB59850150A22331A8FB5AF2065B595E4F08881B1DB7CB85A28A33F4449890739679CCAA431A9205210995BEA68759B475BE4183A975C9D042FBBEDF589AB6AF017D7523B2CC90CD63526BC584F1E9EF42ABAAA9238987D7F73B94E323C6AADFD P = 1541287358797997024335652872773425159872421808416662301794871595911973385718041854467851087853175356350298847849929853669980047096240555092681165983790725605204837589691602540741068782404825906414885161661820441988899240406981724303 G = 5 X = 1344717445208905302019700797220481877896877304443340806021921711564 Msg = 02C1ED6A171875F055809F12BC61829961CC740935C6DCC468FA663E8D1A7DE9E0555E3EA99476436743FC5C76D3E041055FAEB7641907F8E2F1F94061B22E72B7CD39EDD7A6367828CCDC000301CEA7D91CB1E8A3E20DC85FAA23EF6D08E6 Nonce = F42F854C10C9DD14A6712594A31326A1FD2CF5 Ciphertext = 9E47FB001BDDB12F2D8E0FA5501A7EAC1B185FDFC7D2FF3E4461B0D75D626F5156DEDD4D25F13C6C1F5F9A1F916058045705F5E82F748E9B6F0DC95D572B8DC2770159092EECA13946F0522FE2A859705009B615818A1B4F98E8DD38CF00DE746ABD5F3852D93F8D9299DE18EB763F11E41A8B9660C5F056538EED431BB8E2199D9012F50C7FBEF5AAD35ECCD7F141CD9AC6553315A2699D6718F50EBDCEAE62A11ACC466E8533EDBAF13C15B5532B323EBF283B108F892DBFCEA21231DFD548 P = 13232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223 G = 11629401773565540073100961473632977008134185076958364415809981826641612629974728305105606061133984394938666464842000720534465163992699133277631369246002549 X = 175607362627753240470186183617696577774 Msg = 47E586A7E7D98C116A6F553F652E57BF Nonce = BEF5E7EFAA76C52A8ECEE604EDAFD31B Ciphertext = CD70DE085B0C586B4E64097EA3AB4CE0B60A71B0F640FE4468F4F940412EDBDD9035EEC602530CFF81B2CDC35805264A866E4689DDBADC3438575B6337118BB23A5AB7710F85F2A4E1E0DBEC5652FEF73C868747ECB7043BA08241A0879A2DC588D3EC14ED552E62B1B111646FF4DFA9050754240A46A840EA5EB1D97712F2BB P = 13232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223 G = 11629401773565540073100961473632977008134185076958364415809981826641612629974728305105606061133984394938666464842000720534465163992699133277631369246002549 X = 226260657342880764984259695048075261500 Msg = 74BC8D009250F4CD2E08BC556EE01449 Nonce = A2951BE393736E39E9D209FE978C7546 Ciphertext = 6D6ED1C6E519C628CACC7981A5BBE487F6E013B26448D711911698CEEAA4F746182A716602183A746FC35B022BD7B27EF079F7164309653D148D0CE91907FF6C4A9001A0CCA2A0A163F3F93200C2E40A957919CB84AC35B928E026F1827E6D4A9B986B592BE39861538414D5EA6980248FD3C3C0CDEE372F392D5AC46DB8EEFB P = 13232376895198612407547930718267435757728527029623408872245156039757713029036368719146452186041204237350521785240337048752071462798273003935646236777459223 G = 11629401773565540073100961473632977008134185076958364415809981826641612629974728305105606061133984394938666464842000720534465163992699133277631369246002549 X = 190989497955271245954961490592364802400 Msg = 01AFE1A93EDB9CD3E3715523C952478D Nonce = 9500DDCD404618F64A2063BC19941A6E Ciphertext = 0636C3F1C63C54CAB4B48B6EF0ECBFF00BA6AB70DF4DB6266D0785351B37279D41D957D16CAB48C64035DCB2A1CD75BAC298C8ECAE8057D87071EADAA5DA6E2B69B5F353B5753F7E24DA81ABAD40059CD73CFA6E78CAB1C7DA418D55E5DBD42FA4F2B876A25B4AF63588C80E0DB11E8BAB1531960E951C08C1A68C8FAE0DA87C P = 1418488780399624169246918906980830188668962659968489177172519612007411971965075884911751185624649475197807409457369163882960326663412481439463507475025544888587052733646843233033458377686354235239579046252542291754237282749312023983 G = 1351977104923085061876231022324913317418268765766371251774974499254352282996737121345129752664271877383194755574993089982460597274051441610498438524702048238124542105329402087161253933648442955133245175046317041420863434958965806440 X = 5693645782587047029911723275175292231768316497 Msg = 58E72BD0F04B11 Nonce = EF07721FF6B28A8A3B4EBC95C16B13A83649B7 Ciphertext = C7B6ACADBBCFD3A34EDA31CE9CA7F7889FBB2DF5C6C25793EB974591BF0EDE93637B6A95E8075BDB2A987039D92487665465C98AAD0C123FA00BB9736170E78069AA32DFBEB07099A0B7D439AA807A2D3D6F9F913EBC673F9F8CD5D3C0E9DD0D988EAC4D8204928C2DA8ECD1FA3A598FCBFFEF5017DB8542D123CF69E8C92EB956F10DC995AE6B6564967D5C12A07BA35607C54CC3F10A36FF3603DD7CC1490664610002977CE8C4A4EFFBD1421C902D4D8DFF81D014E1AB55F239E0F2FD28AB P = 1418488780399624169246918906980830188668962659968489177172519612007411971965075884911751185624649475197807409457369163882960326663412481439463507475025544888587052733646843233033458377686354235239579046252542291754237282749312023983 G = 1351977104923085061876231022324913317418268765766371251774974499254352282996737121345129752664271877383194755574993089982460597274051441610498438524702048238124542105329402087161253933648442955133245175046317041420863434958965806440 X = 4008521039270359712424267366152273661245582878 Msg = C37AA41207A357DBCCFBE93DC45C5BD91D29FD29CBA29B26AC437A9B560C3BEA Nonce = A36338E4D7815E6A4B178E951BEF073C6D5A7F Ciphertext = D824C94623313298600CC20203F8A40006CAFCFC8F883C99AC09DBAE4B95E6DB9FB5737E24D9D7E39B603893076BC81A2BC0C0D608B32B353972B57066535DAAC49E3F7F2A0E243618EEE01C5AB3AFAE1D55E3A1DB33CF713E5187AD51D55144B1A108354ECA651E55F85F253FE73C1C15FA5EDDDA47467BD0425F09E3C4156548E71896659C618B84FD72BA176E2DEEECD8B15F2C05F870697EA464B88273742BD6ECBA5164424F34EBB9E13E31683A16712901818C7E5F502720FBCB075EA1 P = 1418488780399624169246918906980830188668962659968489177172519612007411971965075884911751185624649475197807409457369163882960326663412481439463507475025544888587052733646843233033458377686354235239579046252542291754237282749312023983 G = 1351977104923085061876231022324913317418268765766371251774974499254352282996737121345129752664271877383194755574993089982460597274051441610498438524702048238124542105329402087161253933648442955133245175046317041420863434958965806440 X = 5316253934868425065538718034591876558413406625 Msg = 36FDC0501B44AF Nonce = 832BC01DB63F958D47B6962AEAA74C0831A6AB Ciphertext = 62E46CDF100BADF4419215256BEC8427DD0388D1B60B5A8675532C0934351BA0036AF58032AB6C4DB829F1A0C8217FBF2CB9C10A5C60FF285919BCAF238E89FBAA4771CAD13D4A69AB2C1FFF0A44D2F9287F1E70D58210AE859074B3969EE800A9D1507BA48582BD1E03CC234B0CB11408BE0932763EDC99CA4BEC6E496A452237F920972C629714EA2F1FF212460C23B66DB56BC73E94743D32D2CD3536A17A136F56D7F7C24E3B8F102F48BBB21633279D3E584E71DC37B436104CA69A6BB3 P = 178011905478542266528237562450159990145232156369120674273274450314442865788737020770612695252123463079567156784778466449970650770920727857050009668388144034129745221171818506047231150039301079959358067395348717066319802262019714966524135060945913707594956514672855690606794135837542707371727429551343320695239 G = 49567166504681114998529684425585849617514862026978329597099192087961538717407709177883083441369264146939535263894140299406849834767828526204179623557679393249247253593623658376992386256295047165071989556654741504656225128772294708626157371448610928885819291350567633953878147205134001752476855481804967677085 X = 3756315909532643155590215634844150624450334340186095 Msg = DF72B687F62AFEA3A51195EE876E4C87708F7ABB8D2D5DD72B68256DAC6D Nonce = 0B333C9C486C5F3A96F37D00133ADD18113376C9BE76 Ciphertext = 4156CF437A39C415B212AAA34C9AACAFA3F3113F53BB75E0BD3D759089E21754EF89B4BA1A8B37E5EDA13F8A2F87D16F03F3B6FE19A5CF799B17D83F7B5E9A225F324AAD7D46E80A1DAFCA337A3F500930A7831D1F3785763EB9A6994063CED033177E1CA2770B751B3053C1445ADFEAED790E49E4685A05B9563D1EF32BD321971D541B525D648EA7C8741D8FA7E46293D46A0F4345BE73EA4FAF1E4C16BCBE11C53BA0FCBA2975BD37F11FE5ADA8731CAED3C403EA6E43AE47ADAA7E28433404AD3ADE6AA8E12BFC374BADAAFB167F3AAF91DC6F8398003E5F8528E8D4773F800D48C8EDDAEDD72A3870E97679F946CE27FB692BC11677757A28F3899A3DA8 P = 178011905478542266528237562450159990145232156369120674273274450314442865788737020770612695252123463079567156784778466449970650770920727857050009668388144034129745221171818506047231150039301079959358067395348717066319802262019714966524135060945913707594956514672855690606794135837542707371727429551343320695239 G = 49567166504681114998529684425585849617514862026978329597099192087961538717407709177883083441369264146939535263894140299406849834767828526204179623557679393249247253593623658376992386256295047165071989556654741504656225128772294708626157371448610928885819291350567633953878147205134001752476855481804967677085 X = 4304232149632055597449717737864742436448127103739097 Msg = F73BB7E5C8A5619380 Nonce = 0AD9527B09EAD1E59B4A1CAF58C861B69A856AB8AA80 Ciphertext = C9881464A37749949D66D75CD9B7A8ACAD33DD1FAC7561F684E9CB5343D2ED15969D7EDB4135518B50F0FEC9A9559C1D5E44DAB42C14BBDE2D2711EA4D02D7F27D1A9BCFEC9E8B73FA64BA3C54707FDDE7D5BE695E17FB9D259FB576FD4E57D66C8F727DC236E2A6E9FD01709D34B8D09F7DD3890F003EBE616042B4E0A8A00F6C3F34DE7E002FE72A84AF8D014D64E8CD08B9B56CC3A6BBE6F966B92105A92C5ABF4F2BF735670622F6213FE9739FAD65692E1C0EBF708A47E18600A22972A5A3DA0F22D11C581D46F734151A083FF757E961351EB183B467A859FBB9ED1DAC396FA405701FD6E3A62EB126E93648C3C6DFA9C4DBF3C005880F4799F66B310E botan-2.4.0/src/tests/data/pubkey/gost_3410_sign.vec000066400000000000000000000014471322470703100221300ustar00rootroot00000000000000 # These values were generated by Botan and have not been tested against any # other implementation. Group = gost_256A Privkey = 0xFE406F383A54127453AED406FA9A3B610B28F89FC918C07A5A75289E97B3A991 Hash = GOST-34.11 Msg = ABCD Nonce = 3E0A6097034780CCF32885B870F84B0AA20138BE94A1AA1F77F8997CAC25C58E Signature = 60053488E6936975A4913083FE16A0CF620FA75732B563AB65B82D37A825BE7D0965C38281A01D23FA5F5D332B339EB2602A564563C005335269A2E811520563 Group = gost_256A Privkey = 0xFDCE35FFFF3AEF1C3AB247F31D733490B4029E699FC2D1C24B2F7C526CBC1445 Hash = GOST-34.11 Msg = 33C466741BB472998A27E26E7F77EBF3 Nonce = 6844F464FA0147FB7D798137680FBA6EA2E709814E3A8B70EFC26F446DE9F94B Signature = 5E39519E12B5208B3A0A1A1CDD44E2629F0F76A51DFED8484A8B67A2E46D5B871AFADA58E26D1FE08AB4D2E67BF0FF8508870B417D6EA1224FA98B3165D8A032 botan-2.4.0/src/tests/data/pubkey/gost_3410_verify.vec000066400000000000000000000020131322470703100224620ustar00rootroot00000000000000 Group = gost_256A Pubkey = 0400B6F1D75EF48902B0C2302F52CCC71233EC55B903061673AAA586A2B5864048EA2675E8FD8DB1FEDFC7DD40E3CF3A319EE3130E0BE9FDF994B625BC1885F271 Hash = GOST-34.11 Msg = Signature = FE406F383A54127453AED406FA9A3B610B28F89FC918C07A5A75289E97B3A991AA3CB0563295A3E281BA368DF8471DE0A4150B3CFCEA575D8A9CC9779035EC36 Group = gost_256A Pubkey = 04BFE0BA366BE575E45C5BBA339C51ACD75D517008A9D3169E3CCEA6EF08046DA74312382D835BEEA1C561A75AFCAFDA0F75A4E5D9787F9DB2870A032AC1D90465 Hash = GOST-34.11 Msg = Signature = F3AFCBE1398DDC01F0A9E4B45397F3ACD8F343399BD2805FB6293E9CB871123AB7AB61F33E0B70166C355963BB80B8F6DF54F7F6A43872295CD42B6ACF7DF678 Group = gost_256A Pubkey = 03773DC3F032886D56439A9F17490B680570043F757252C1F60819D6C30DBF1469 Hash = GOST-34.11 Msg = 00010C0300000E1070DBD880386D4380E954076578616D706C65036E65740003777777076578616D706C65036E6574000001000100000E100004C0000201 Signature = 66ED09C0A6C97E22CB4E66BCA61D2082FDF6924F3A717C43B531B2D43FEE76DBB0F490A7901B009CCDF87252EBE1790A9AB1A6A444DBACA3E264AF21D18B5E83 botan-2.4.0/src/tests/data/pubkey/mce.vec000066400000000000000000000205411322470703100202250ustar00rootroot00000000000000 McElieceSeed = C9A3649B5AC1AAFCE2E15B8C74FB0F2C776B10AB6C52F69AEB70700341479428 KeyN = 1632 KeyT = 33 PublicKeyFingerprint = 2F5C0F9FF3E46D40E21AA4165B63DE2780F424438F9106D9C798801B7FAD05F5 PrivateKeyFingerprint = 89AFCE27857051AF842A58FC903324414470AB0876A9FB8F739FB43485823CD9 EncryptPRNGSeed = AABF99BAD11411A430D0AA2940148EE67D77DC44BE8734DA4A8B274561CBA2EC SharedKey = A656D63F7FC8EF345AFBEE89B121BF5E45D301C5F5FF17DCDB227D84F22CF3D9DED9B00F5495B81CA41789549691BF4D6CF3E7069857E1CBFE9D63855949A89A Ciphertext = E053B0773BDADE3C7625E108CC0B3746C36386E283F931970B7F4FE39F24498248458891A7843A843C4CAE3CAABB4CD0A80B1F944685A09CFFD944BFC9E41473769B8310E0BEED9E6C174E3C1E8A9E84A54C3120B5440B1F0F669830FAABA53FA2F00FD45CBC0522E647A5CDDC9135E805A88DCFB97ECAEEA2FF9577B2319F3828FB31C7D6470850DEC5B919FF5F3DC21C0BEC42DFADFDDE2675E03380222A480D0002B1C9D70F6C0A6D8F452FC556EDA9753C71BDC2DD530CE3314AB515F5118AD338A2165ED13DE0626707 McElieceSeed = C9A3649B5AC1AAFCE2E15B8C74FB0F2C776B10AB6C52F69AEB70700341479429 KeyN = 2480 KeyT = 45 PublicKeyFingerprint = DDAC6EDF03B982E85FD60414E6C608F88694BB0C0FCCE99FCB044838E0C9CC9D PrivateKeyFingerprint = 1949DFF555144AA0E2ED17CB4A3C71F4D7EEC1CCD9A3199D11E49BCA7FC81E4E EncryptPRNGSeed = AABF99BAD11411A430D0AA2940148EE67D77DC44BE8734DA4A8B274561CBA2ED SharedKey = 8F533C41E820EB0A6763FCC6AA88FE4FFFB2BAB1567639E8DB0E239CC4F595A1C6041B4EE3362D332A87FD81B9A81E413D4168CF67AE50519D2E5E698990CB0D Ciphertext = 0CADE39676249382B1216579A4E4825325E13BE3198EDF913C4F35911DB3DD7CAE7D42158A9DC7599E2324B04A164E247BD5EA0CCDF964955AFF150561FB8CBB8A3FD712CEA114699FA2CEBC2CE837B1115D3E93819BBBB01785007B5380421266D8C3D2B802C8A4ECD5207EC675FFDBD8499A344E29E781A4E15C973D03130819D9B238A2596F68A59ED6628E49FE4ABEBAA5A0D4EACDA4DF1816F1C82F44025A2734FCE26FB7592B0BADF4D9FEDFAB37D54F2CA92D65A876D0E0F18A2FB586A80BD647D465190290FD856B1A8EED967BD77CD1637FD11655D1B135591A2D52B2D83E4A48B5777BB18D0E4D5E6392875AF9CF13B36AB4BBAE80073C8740B4987C3B28AC7778CFE6CDCE5E1ACBB05BB9E142B7C2239E1A41152F3617052D6EF96186CB6C2B4F684438CBA4F59954465466CD67E4457F McElieceSeed = C9A3649B5AC1AAFCE2E15B8C74FB0F2C776B10AB6C52F69AEB70700341479430 KeyN = 2960 KeyT = 57 PublicKeyFingerprint = 05707644DAE98856D432C24C19C41CDA333E36C04C81413E2D15E88EE129B4F7 PrivateKeyFingerprint = 7BA1FEDF2E520945EC0321CE84F2A07B8407FFEC42EC715839AC0941BA1E9404 EncryptPRNGSeed = AABF99BAD11411A430D0AA2940148EE67D77DC44BE8734DA4A8B274561CBA2EF SharedKey = DEDFB2DBA755E94AD609F1DCA7F81D4BC5A39A4E07BF108D88A031F9E4CD2F46708EF1F9FDD27AAE56318928A5D89FA16C5F7F8D6ABF8019B549139E25142D2B Ciphertext = AD9D75F29BD735082E95611DD8C1B9897FB35ABBA968AE8C66E99CECB679BB19344369404E73BA5C6549A8BFA25A2C3F90D3DC3C82E3B06815B0F02E013B3A9FB8EA9C38FEC8C61E58D260989D774DE0DBC8AE27A4C0B2AEAAC2EF43589A2F66D07FDA9B288C5F9DE5E9A59EB00A4C0A69581F7997830BAA9C6D77816DD78D574AD7BD732EA5A7F44E31FE6A30E4CC34896EB45D16C5227F3E31E1F3185614F5157F4D2B3A4B765BC9E3C24EC6D0AF02EDDDED78FB3874F0DAF7FF960FFF7E9445EEBE049200A43412AE99E16CB11BC7BD86BD61A0DB0402092E1D77153E24B5855D736125FDAE5957FBB79F7A5488CF53912681C80E58AF5DA31326A525342A60FAFD1B06E350A01209F7F77FCA2D66B13F17EC8880247F1B975F70A3CC96B5B90F418DE14D445BFC4897FAAFF52931306E84980B23F5D632AF0437AFBD4E6AF672B51AA2862BBDA3340EE77F2FDC4BEE06DB41592136549B55721CDD14FE06F475175EA15598EC65274B02D7D183A66622 McElieceSeed = C9A3649B5AC1AAFCE2E15B8C74FB0F2C776B10AB6C52F69AEB70700341479431 KeyN = 3408 KeyT = 67 PublicKeyFingerprint = 87D94945188A898EFE3F62DDBB083DED2FAF74D83614F811DEE44ED1195B8DD4 PrivateKeyFingerprint = D774748F55B9678D21A4234CF4141C073F5A389D52B64497E517EEE447B1762C EncryptPRNGSeed = AABF99BAD11411A430D0AA2940148EE67D77DC44BE8734DA4A8B274561CBA2EF SharedKey = E958F5A7EC2E284927BA6678169343359FE0768F9D1B2C0BDABA2D6E22FBD46BAE9C9FF0DA8238D2AAF9A125CC60F2FC757C47987850293934303D206DFBE06C Ciphertext = AD9D75F09BD635082EB5611DD9C1E9897FB35E33E168AE0C66E9DCECA679BB19344369484E73AA5E6549A8BFA25A2C5F90D3D43C82E3B4681790F02E017B3A8FB8EA9C38FEC8C60E58D270989F774DE0DB48AE37A4C0B28EAAC2EF43589A0F66D07F5A9B2888DF9DE5E9A59EB00A4C0A6B581F7997838BAA9C6D67814DD68D574AD7BD732EA5A7F44C31FE6E30E4CC34896EB47D5685227F3E31C1D35A5614F5157F4D6B324B7E59C9E3C34CC6D0AF02EDDCEF78FB3874F2DAF7FF9607FF7E9445EEBE049210A53412AF99C16CB11BC7BD8EBD61A0FB0402896F1D57153E243585DD7B6125FDBE5957FBB79F7A5488CF13952681C00E59AF5DA31326A525142A60FAFD5B06E350A41209F7F77FC22D66B12F13EC8A80207B1B975F70F26A400CCCFC8A4AE20053EF1F8A3E7D2099AFE09A5812D50191461CABADE85E2249BFC78509CD45655AA1CBDF37707634F95A3818629AB4BA13AA3C2D78937CD05B38AFA01FADD1E7C558A5BEA03A022E7A61A7CCEDF3F78C12C888DFF3442033797CCECDC6A7006BFA1E5F17F23E4396DD5E18A324394E30A4B508D511E55C14DD89296085904E280D1E71970E McElieceSeed = 31C9A3649B5AC1AAFCE2E15B8C74FB0F2C776B10AB6C52F69AEB707003414794 KeyN = 4624 KeyT = 95 PublicKeyFingerprint = E37CF72DE6ECD0E540316C1F4BC6F0391983D4E7B60C8ED13DCA801EEFA9A4E9 PrivateKeyFingerprint = CDD13DFD3B067DE0A50D37C7CE97CF30E5024CDEF6A20043C09F81219B14B03E EncryptPRNGSeed = CCBF99BAD11411A430D0AA2940148EE67D77DC44BE8734DA4A8B274561CBA22E SharedKey = 8102784D063499813404A5FBEE50D64122E2C46217C9BAA76AE9021479B0E36D026809C8AEE2443772CEA7C13335017F9825E8BBA67D13786930C474771673FB Ciphertext = BE6802091325EF912BC47FC694A0E26F015700F5987C057A70F2D984D3FF589FD6A3DC541912AF4DEA19F6A1C155972578CEA9F5C3A5AD02F85E28E5667FF129222A9585B85FD25A956A572487FBF3B62BBB0A96D360336D4DCBBBD194FC352837028C97F63C6BEBAC5D76A36968DD384F9F884594566E833AB87A8B9EEE5AA0CC9F0D45BE5E61C98C57DD52487F7EFD0AB085EB6D2DA652F7F1BAF6700EA52265412DBA0098B8055C82A46A43C7E89734371ADFB0FFD24D450BE5CE2477BC79BB2F6D85017289C582576AB95CCA9D3B10C4C60111AC9CEDE47294F476CEEF7611A189A5866151A6BA5EB6C362FB6F5A32CF930EFD9ED0CBD110D47060330AB71D9AB00403BF1CF7CDACFA2B1F373FF11B05E3820C93F6BD9D118161A585587A91AF356EF8254CD4CC2CEED87DE3724DDD5F2BDCFB0B75D230779A0D9E4AED49D630ACCFEC81DBF94064A21197BAC57AFFB2D82A637F36F7E64B7336B98288C65EAF18E37B0F8C06457BDA61FA3931480296BB32AACCECEC08E0FF6705352EA69BF12E64C1E6F837E857465148174915E1F1E7714739BED8133FB638ACC6F0D49392080B9E54E7386B430F6BC06DE38C2C92C351B7FCD7F247CB793DBB4E9430F8184C50213C02A9B32B7034A6E30B59CEEFCFA57DB0FE122F7B5A1B9D3EB290BCA9FDB9A2DF9C1638CE3AD84CA2267613D503F210A1A23E5B98B1CE1314FACDBC9C2D45278C312F9CC1A00CFC5086676ED2E9A67965F23D157C350DCFFD98511A4853F3BE54F5109B3D9C98EBB6558E14A427BE6AC73158454E5DDFA402CA3C2E45 McElieceSeed = 31C9A3649B5AC1AAFCE2E15B8C74FB0F2C776B10AB6C52F69AEB707003414795 KeyN = 6624 KeyT = 115 PublicKeyFingerprint = 29A7BE3A3181534ABD5FF006EB8D5CCE71FDD27E0FD62E774A3C75C20BE84268 PrivateKeyFingerprint = AA75AFB38ADA856FBEE6C973D53DF0AD07395C54AE83805BE59D57112A9EF6A3 EncryptPRNGSeed = CCBF99BAD11411A430D0AA2940148EE67D77DC44BE8734DA4A8B274561CBA22F SharedKey = F50F3E58A4788C03C44DBDE2C61ACC97A7CA8ADC6CC1D371416A7D6250BB3DD7526C55E666C9FCA31ADC5FA79CBEF72AA24B5BDC5F2E7AD255A0091A0DB7D127 Ciphertext = 4A69DFA02182A20C59FD3D1291D110749C4BA57F38CE66D90485588C2CC4E1548180E9CBB58517479B978DF62A9B4E583D2D1C9BA3E61EDCF4D0249C54160E8547B8A91C5A2FE0E00FE95EF18FC865BFCD39EEE81DD79CAC36885AD2454FCFF4AB740CABD34563E08FA203FF96CEEF5E4FBA43DEC6C316E503B033DD4034F0E432DF646833603EEB8693843727F9F007CD78300A434BD379AA64BC1E1A04282C0BC23ACC6316DBC4919EFD123E4C87BF45F56E43C440453F85F93B014AEEB36CA0DCF9A7543C16C47625057B22A5E6E5681E3C2919225466DF16A32D32D475DF842E4D85C23DD9BD49BAC8D759B96FCBA00086095B7E3CCA2FD30AB884948003CDD64FD1E68AA7B36B2B740BAE029794193284AA4C1CF6DFC2916D2EA1AA20B64A81EEEF815456E260B77DC20C900F874E47962B0995E33A0832ED458EABDAE495B21178EDCBD3A973668E9C8F171139168B1AC442A387C9AA3D1ED9A6583A807BBCBF1A1A94E04B7638695D6F0C09F18B0732A2B5F4111C0D5F84E2F175280DE43525AEE72C036932927B3DDC4FD526B9DBD117C9CD37D64B0F77C103644FD7073977BB69F7367417E79D6A901686DB00E8E7C16C889E566CFB44D1C66E9C84251CB9CAFFB6FCA9B88999B08F8EC6203DEAF668E86689621D5BD56A1FB89623E2388FC93A92F9269ED2ADB70BC92E5F77D1DFE8805039F71A8132535110D1F1E4384BD2C21817DBB7D03DD88035D154106E2E3F7E1C3D4BD15C7F5AE469AC8BD016F98C9B01A66B8D8A0F72C7C9C176C2AEDC967B9AB4FCBF0FD99D0BEF8B151B224DCDA3691885414BC36B3707D2C97D44EE9F83A4F2F194E57533B16FBE673176E1FFC21C9F9A35AB35BDF94B9FDDDA179D035AA282DEE80DBC55489C6DE676C2B6D24790CCC15044AE952CACE8E7B4AA75C51632ACB52F75EE6A660979C46E89354C92C1FE60BDB7140BAAF7D22CAB8FC8865A1FA070416A28FEF51262E27E5F7C06CB46D68682BF2731014BB17CD18940563818EBA720A85A78E08491E7379E071A7B92253DF2BF6A8C14473D7247B81CBD565057BBF45116F1AD2045C6685257C39B12764DD0AAF8A9857D35960E41E44985DA2CC4E4A06D26157E01BAC866E40A3C1B28DED234129B89DEE47A2E22724F766876E6986B8C65 botan-2.4.0/src/tests/data/pubkey/newhope.vec000066400000000000000000015627551322470703100211510ustar00rootroot00000000000000 # These are the first 1000 test vectors generated by the ref testvectors.c DRBG_SeedA = 934D60B35624D740B30A7F227AF2AE7C678E4E04E13C5F509EADE2B79AEA77E23E2A2EA6C9C476FC4937B013C993A793D6C0AB9960695BA838F649DA539CA3D0 H_OutputA = 8C3C44328025E08CCF5A76025EF2DF7148BFB664743651EAA9B549A3C508B55B DRBG_SeedB = BAC5BA881DD35C59719670004692D675B83C98DB6A0E55800BAFEB7E70491BF4 H_OutputB = 676FAA35FACEEEDFB541E134FE15714628F696978E3325388E048DCBEAEE0668 SharedKey = BEBA8E1E8804DE1B1153C24C0C307A02BD2D83142F612FDD8D88B1FB3700B932 DRBG_SeedA = 0FDBB1169F785669A406103336A4A1D93FFA24269970F51601DB5338AD82D46DC7300E2D894B0EAA40A6AB254506D8C1176A33C4A1B2879604B1B80DF48D31DD H_OutputA = D1779CF8560DE6D5EAC725A8660C4D7C5DB045894C52DFD279ED0888A5EA2157 DRBG_SeedB = 0D399DC91D8530B72C5D9A9920F33B43331B983B95047F96B5B099BE399355CE H_OutputB = D946D5B6171DD0CE325BA12F804034C039A8AC4B0439224DEAD9993B6062A176 SharedKey = 1324791A9C521B01A348B3B511B11EBC7F67696DC8E77D9AEC5494138D6CCFB5 DRBG_SeedA = A4A7B2872AB311C10099A164BF35251C75FF6A3286DBB3B96263A9FBAB28C2CF887E86D0AEE471D5ECA9546DD804D2E527C6BFD60A41D27B7BBCB55766D18E19 H_OutputA = 0E423336471DC8877EC7FF8B0A27AA2BE9A40726370BD7CF7771A2C1CD9D031E DRBG_SeedB = C8D726C8ACB5239CC321E097C0D4036D2EE532EF05540A30138179402A519040 H_OutputB = 5006DA107F709CFD86AB2FE3A9D8C264964522125D2D1A789D71811F75E14639 SharedKey = F807685F5B7522DE4C4B1F423E7D3A067B3695CFB11FAC988358017373932913 DRBG_SeedA = 66F34FC79B4586DB587F616DC8397541E5B6C98126D46378894B0471CE84A3B0E722806952FE398BF6B560D8107411427558FB38F256CE8651A39609FD69AA0B H_OutputA = 613A76F4DEFC08C4722BE26D0878EAE9D0E966C85117D588EDBC68B94600CFF3 DRBG_SeedB = 32F3AF5940961543C7960BEFA4701501AF2B73AC675441D0A9067A0DB2685E4B H_OutputB = E09EF607F3A7730094B4683A8006CCD8BF1B4C9ECED9087F88872BF0BEA4EA62 SharedKey = 4A16A9BC8E8547F8B56686EF03750555320E7EC2F52D3CE8187F568B4331CD41 DRBG_SeedA = 83C2BAFACEE02B502C8587D6B109F004B3A8744E65A289F1392A739AA281CC61D7376752007C144781EBFE9C23E2BC27FC79593F4FD17C1FD50AA8B3862167A9 H_OutputA = 1EC19202EBAD19D0BF52329B556B9844132076BEC4841B3B49329C8F8A3184E3 DRBG_SeedB = 336CC1C4BA7C138CB6475370C7A81A1CB6A2FBCAA3676FE71909C6BC65A9B733 H_OutputB = 9E4C6B6F645AA1DC4095639E9396669C1CDB4003FBBA5019E37A2B1C953D018A SharedKey = 4595767B17CC5C5BD4FBA9A38CFF14EEA2BB77AE63B65117009D1D09C3C47940 DRBG_SeedA = 0DF32710083E7EE32D8B40B3C31C57BC818BD8EA613EFDD96F2E9D87607EA8540F528492A760AE0870F6CDE8ED33883F15768D1C39CCDEE4EFBB2AFE147BB9C0 H_OutputA = 72F0F02611D23B38BDD4CCB70A9B364EDD15CCABEBA99C210BC12C47D2225724 DRBG_SeedB = 3D5F737397FC86AABF86233C98B191A9361DEF657C715E6AFF7E62F67B2933FD H_OutputB = 5326F21BB8B595A2A010B47AA81DF95A0FA7B160A3B88F82A5ECF6E736D4F9CD SharedKey = 944A9D3F382BA6CCCAE33654D9A920E923F1CFD56FF6D2844DB51CCAE7AA9174 DRBG_SeedA = FD47C8EDC9B78AE4154B39602D32125E413470CC3B5E41B28B8B39D72389470FF7D02F1077BEC3CC03F6D27DDD9E409066B15B41EB5C49B8CA7387C61A3B7B45 H_OutputA = FCB739148109838B17A38C4258D75F0E6D85B66B3801B1BFDCBDE0A1D48A71F0 DRBG_SeedB = 7E5C0F8996A64EC68DE2C0335B6F9EA38C554B1B5F2DB888BF06FDFB4235A129 H_OutputB = DBEDFB724DC3EA7B95C4FF3781202CADD9F65CB7F238AC98B1FEF38DF7F1FBC8 SharedKey = 727410EEB8B97151D9ED0F02FDBC38E9D9E545305B97C61AD5D9C65D94444E4D DRBG_SeedA = B127529F01BB9EB0F11D7DB6CFC0ED2238E4E2D417BDED7B0AC2C861CAC534F0B7C13A00FB292C4E5794AFA517941522248E20A5A73025DE06F051D6F52D0808 H_OutputA = 71A204B1990EE5D13BA253A8EE348EA01AD3B20370B06D4AE0C0ADCB8496834A DRBG_SeedB = 542D152B8D814CD242D0C9EF218ACAD18D8BC0970484CBDB4B0C99CA2FCDF181 H_OutputB = 8E2F927417FF5A48364E89C22D756247674A59117E40447B0A9DBF95A3935581 SharedKey = 515D934A075849BB01F661CBF673A9E296EE3E89E37A051B3CFAA2A8CCB13664 DRBG_SeedA = 9898F7F11FAC8003CBAC2312A1789A8A26099C1C5722635B8004ED8CB6C9F30D2EA18FA409C2FAD612B035310526B821822C248E6CF949DD1B453E2DDC2F8B7B H_OutputA = 24CB74C3B651EA9C8A9F577AB38002665164A94B157941D0421ABBCA6AF6139B DRBG_SeedB = D03E194142FEF6B814277615A08EACD6E39437211188A9AD23BDD58C4F577B49 H_OutputB = 97C97220D2BFF81717A4E78679D15F24CC96DC2F45DAC40B158436CDDEE914A8 SharedKey = 5FE0FB14171697582C9637B52A19165FB1D0C9354A76635A38330BFEDAF4DC54 DRBG_SeedA = B89BDE2F230C0893CE8CB834A8FE577804A932FD4AEBC8B3D4C0C1F5B8C3991F8C80AE323023708D9F8392C5E54ACE379BEFF2520CCBD6C3FAD525050EC25DE8 H_OutputA = E4FE0AA85DE9D286680B0974976BE868036762CBDDFD792655C602F0492F5AB7 DRBG_SeedB = 0E15CD8A7E796F6845E39090E3E0A67AA9A0D5FA2AEB7CFBB45011A345901A11 H_OutputB = F9D292E11EAC3353B2E29DB7C0F402A766039F92E0F1C87A28AA64613CEAA414 SharedKey = 27C3D5EDB674D7969AF4FB51ADF6C5D22204B4FC912EAD1D61944291B0E63231 DRBG_SeedA = 09A9D2F475D33617F9FB43E91D5DF668D95840249780513F1F73EF88CEF40668C59E1DD02572714257AA2C04526B8B627A4010267A76104CA9978FAC97C8645A H_OutputA = 38F06790B97D96D29F7E5FFEEDAB40475A1A5C10A1D57DF80498E3D40C4780DF DRBG_SeedB = 34E1E6FCD22242D0E889565784A3FF970D9BE2F15E44CCEDE09BC6F57F36AD8A H_OutputB = 20471B6D9EB13152F821F27E52EBD14FDA8DBA1CAA0CA38B26C71EB7D3499EC7 SharedKey = A66E5BC82A50D50992B879B3DB23FFE23D6C35D2766FBBC4C66E537482689BAC DRBG_SeedA = 8D86010C465835710DFB51CCFCC62470B4DC10EADCE7318F3E3C1CD59CF8365C871F7D42557614A607D43CD512A2FD4D8AA49B36B6C991B35070AEB17468175C H_OutputA = 8D50BB6C757D107ACBD3373B7D45400CDAA489B6097CD43CADA6AEB10487926E DRBG_SeedB = EBF73FFC9389DF5862B4C334BB5FAD19025A8BFC1BB52A1A699BE7E9BBB3D2CB H_OutputB = 9245DEC3286493E57071172B19C9D9BAEA91870C861D7521B9D773078D720096 SharedKey = CDC5C133FE95FC3E86935204BCFB20C9659BA7EAAFEBDCA2B21D5F5036C145AC DRBG_SeedA = 939E819F878C479261BD421318C6C08F52857FBA42E3A560A418A7287C799A52878C43387BE1A90BFCE43382FA27EE7E02FE6189902DDD5ABDAFD9B407B07A0D H_OutputA = 5096AF60E8284126C3F141C7204808BAFCA653CBCD99293F31F7F9AA4A010F96 DRBG_SeedB = C56354FB4E95B9B7629661F59DA92963ED4FB0480B6E7E240A8545B0636D886D H_OutputB = 43D6EEB94D2AB80E9EE82E25245FFCB7AC914E480A2D437FF916493675C360F9 SharedKey = 3A8025A05DD2676956FDD651BAD1E5E64160FB1E7F2BB5E5EF2727251C61A3EE DRBG_SeedA = BDA036926A7A4B5E6E02723D093F51284935F2754F1470122C8374A3BE97A8D5185F8B72DD7EDC4938492D7B89014EAD5068611BB0B6CA255D77D711737960A4 H_OutputA = 374AABC92AEEA6722F9984691F6C02251234F0493AD5A7E5E3B94BDCA45918DE DRBG_SeedB = 518640B6C517F81BF7AD2D6E2809F6EB218B1A1A3EB0FCE32FE3B14D3FD174FC H_OutputB = 2123C2E2A62C90D8E886F7C027D24814A060CE557969EAAD0E56642AB8B82BF0 SharedKey = 658C03E2AB48C5A180FFD66B58B42CBF83FEB28989037070B902D20D13FD45CD DRBG_SeedA = 1B9E273F8C433F7F197DD0E22AB7BACA75A86237DEEAEDE890027BE0C23F7DF9617495FF0AFE5A85A8D4EA56A3A2DD772929F13913D47975795C49BACE6B2850 H_OutputA = 3D8685E467B3DCFEC45E7E49BBBA6614E17EDBD3B5C83E1CE3831B9E972AEF6E DRBG_SeedB = 660C140DF5B9A8D5A5928FFE1271F5B6BD02A804DF748720B9C886F199B94F42 H_OutputB = 1D31562A5C6160E31613A90DCF6EF825AAD18476D95A7FDA6E11522A1D3791A3 SharedKey = C51D9BDBB9DD71340D70F67D23BFCC661ABEA2B3EADDB23103CB57F9CE4E3D76 DRBG_SeedA = 6A10EED1A24F28699C984ACCA8C2DA764F3DDB8620A22B53F88FBFBE017329DF54B4C95C79E3D158DE62A941FA5CBA3B90DAF1CB1AAB8FB3F08A1A416C506C24 H_OutputA = 33AB9140296524A0C695B274AE0D7821FA0279ADF1BA4CBF4B22DE9AE0FF3219 DRBG_SeedB = 86D83C3C160BDA29533090009155F0A66DF71D1D348A032ABAB2B2AF169B5324 H_OutputB = 64E0816AEB10093A9BDF30BE0D5955D55337046883FDFAFD50D97338613A2141 SharedKey = 7CA9ADA2C4613D06698D18C1268CCF1C387DAFF08793347E6C78129BB928FD3D DRBG_SeedA = 6FF67C01343F7446F0A31D2AD80C2858679F1576EDEDF3E560C339C92D9CD1BAC4FF7478ACBB0FBA47B0FD928798C3A7A0C8D0C55F1C5267C425ECB79C4E9378 H_OutputA = ECE42E963C427BC3998542861B90A725FCC31893C96B5B201B2995AA7BDE6D03 DRBG_SeedB = C7EED0E3F94099410D16637486D576F26FAEB80E09DD2E8CA26D06B177E02EA1 H_OutputB = 5313E2E2D0A9AAC08DC09561E735CA2A0E831E8E192D376357394D905984C59E SharedKey = F06E5F847267C6A23ACCBBE4970BFB52EA9DAAD8061991DF899CB69D329A1493 DRBG_SeedA = 8603B8751A9F3F62E86353DB620B309486676110F1C2E9795F84960403343B0EE5E506A9963F00925B6674FA806BE5BAB609830821992ED69809A25AEF4F7093 H_OutputA = A65F7C3FB99CCBA9C3BADA25EF64031B2D67A6FD8DCF4CBC1B4200B900E445AA DRBG_SeedB = 67C22C3F35B76EA08286510F55396C14D26874138F1720AB0C081BB153C009D8 H_OutputB = F8A9FF5BD6FDCFBE0F143287FA605979E5901B14DEBF601B3C3098EEADD76AFF SharedKey = FC328010AC4AD50D1A8BF90E11D7A9FAC5602C28FF2882B225DA9202579A9789 DRBG_SeedA = 35D92C7F7465B4FDEF6903C37AD5A05C19F4EB284BDD293B775F343504321062BBB1691CE249987BDB6ECB8FB752930F2D329B7AAFD52C26973317A2CB46F475 H_OutputA = 7955CB84EED34219868BF08828BF4C808D0614860508B473B556D2A627B1D864 DRBG_SeedB = BCEBBE5750032EF2FC8406479E9118B48CDA81D30BDAD22206F3D507DDF2B2B9 H_OutputB = C157B9E08D4FE4C63CA106A1CC59FF404716BDFF4A29CFF3687F05929BB1AE40 SharedKey = 9AA44A1CA5DA1B84CFDB09F9B2CE99A467F6941589C15603074F1986E2FD27A2 DRBG_SeedA = 8318C7DF1C1F413A935069950AF52417F9C1E946D91B9337F24FABFE6AE6C1D70B58DA98C15C16A565F396266DD17CB4D0510A01047BBCAE155FADB26500B654 H_OutputA = 255B7565F7DB4C9124B42DF326D23DD618D551520A49616545CC82171E2CB33F DRBG_SeedB = 2568317B7D2DFAEB3DDE5CA803AD5197393ED7BF9036F3D11C03D3B8B8E50B59 H_OutputB = 8BCDA9EBD9E7A05B36BDB187BAE18D6BB9DA5BED19693CB0555F3B974E58621F SharedKey = 11CDD48583268455A6B85884E34773E69F3A6ED93D6006823F2B9573728E09C1 DRBG_SeedA = 92125B3276635C6BDBF5BDBD65F066ACD4945A74E8197309C064B37E30306B2ACA4EBF8BA47F844DDDB0276084D992F68BD20BA670A4BDE9FBE9FEB9C1245363 H_OutputA = B3ECC15ADEB1445184C9BD1AF8913CC33414E4C0485436DEE7D7082C62C4EDE4 DRBG_SeedB = 1B03E736AFA3E2A261BA908C6F3E85304AB7C5FA5D47E787F1A259E7A16D2BCD H_OutputB = 0ECC65AAC28C87D1A3EE721E4FA12C02E90A0FDB490853ECC924442C8300461F SharedKey = FB24DC44BE2DCC4D73FA5B54D2098D9AD123F0371FD9AE2405084C82B50533BF DRBG_SeedA = 829D81E848C7C965E242A3E8ECA0CCBF46FDCED1C104457C3FA3CF45EBBCD4EE384519D671E1269410F8F6FBDDFAA50CCED5320F6B0D43385BAEF9CF5A4D45EB H_OutputA = EC4B31C3B6BD639BC4902143C11AC1831E958FFC02376C97D927C1F75067DEF3 DRBG_SeedB = DA142A78026091CEBD96C36743B363322232B19C14FC9AFF45EC013D0C1D34E0 H_OutputB = 888376B0CAFBA2946DB008949C7863723E326F13710BD2F423222414C4695E71 SharedKey = 1D52AB9CF1581460F7305EAF3C14D377D0B42521BDB208E0E64A4718276F961C DRBG_SeedA = A90AB426900A2D149C3D5CB8C01D5803D76C57C924A9E22B667B9826EE45C417EBBB086F6E20AF9A409515111BFEA4F3E9552012B21C98357EC5DB986AADD8BD H_OutputA = DE6732DB4D6628CEE5063B6EA4A89CC0E572EB647F8792A2547FB3A9F1E6EFD6 DRBG_SeedB = 7CEFB8E1E0DE9794699BC1F55B2DB125FC2C1B697DDDCDC0DBA6941AE52070D2 H_OutputB = 0E536D6E8A8D768F72AA3C7A41103DAFE49AE7D728CF9BA80E6016171F8A3A83 SharedKey = 10D4ED2B02351FEC0CA9BCE080920167170AD83E7ABDA7905D283EA40560AAD1 DRBG_SeedA = 7C310741D98DEBE7552776355F7069E05A359C34E288902CEE26BC3BF165DE529C4702B1E83192200EF2AC8661BA7D7F8482E41505A9C987E3DFB5348987DF28 H_OutputA = 622649667DCD09027EAEBA95426037AED220B5B790618F41102FEECD2E96A7C4 DRBG_SeedB = FFAA130D3725B0E9FC85F45C2810402556FF2849673F36CBE3422E142D2545F6 H_OutputB = 79AD6E4C6CD49BD492166275B3B41A82CCC2D8A3263AF7F1D4A1A99ADE5459F0 SharedKey = FE4C76A24287334E5044D186A1F162C8B78480384315237A99BA0BF6D6AAA05B DRBG_SeedA = DBD70F15D762DA0D99B52E54B3B8B33B989E6697C7D7CCB780BD471A0A9CC392D4D42F2E734779824C051BEB451F3FDBA518FE074E2C4DF8E73BAC1D0CD6D21B H_OutputA = 983947B8D59E1D7F60B371164BDF1D808ECE88E907B2A5D8BFA0A775070C6CD9 DRBG_SeedB = CC2B9810F977AD86576008F3E1489C517658235C59FD2A3ECF33C7E0073015C1 H_OutputB = C68B0E644E35AA4AC8B2EDBBE5324A142F346C0AE6F3C60211F61C9FC44AD91A SharedKey = 5D8901603BAB18DEA29341542679FB50E888E3B7838A725A1A7C549BC2F196A5 DRBG_SeedA = 2AB79A013DB383D77204FFC48FAA8B0B4C915500EA7DB8A56A65B807FC65D87A4DA0AF34911251625AE402E2C340496F0E816FE81F126AEA1672B48F57753756 H_OutputA = 522E6D7E285ED8C23C7061490A319E056751F7B69428521E84C20232DCB81DE2 DRBG_SeedB = 761F06C548F5EE31A665AB86AAA1FBF2F31FF68379CAA71209BBF56ACDB4E643 H_OutputB = 0D74BC2B4F5018144A45F50954E190B376026D36F17548726FC9FBFFA0E61726 SharedKey = 13B024F804EF919622CA3053FE25AA566E2CA59B4F039C641BE84201DDEB8B8B DRBG_SeedA = 513144CD4C0E1C2173ABF7AEC4839D746F85CBD6C5F52940E4463D8534E9F288A660791A3C554D49AAA42711E1CF4E9355D1510F6749D45625F898C8A6CC835A H_OutputA = B02C91D538D5525203815862400E72DB961C5616ECC02591FB8FC31A8638A140 DRBG_SeedB = D14784CCE15521F4A3F69FD8E95345BF1124D36C93E08EE37A7BBA7318C4A0AA H_OutputB = A0FAE41A6FF2C1BE8865227D5FCF4488F5B4EEEC60555E1904895B1543744098 SharedKey = A45D23F858C3D0C2B44EF76BC5B3B8ED78DAB3AA9D7B98FBE0A430381E3E05A9 DRBG_SeedA = 77A0C06927C115DDF145430A81257E652C06FAB5F69EBD8391EBF9927BB061F294465A2756F7D4684C0708CCA90BA820364C1AD03E061D2DFE3184E20B19CFD3 H_OutputA = C8AED8262BA5CA06C8FBE19164C4B3CC789709C0FA35C9649D91E7E7BDA04054 DRBG_SeedB = 286335F635A380EDD0EA0105E85745EE8E38DAB3379AFBC6189554899838EE38 H_OutputB = 9356996C46442EABD4057BA5E3B4523396302AF8BC8CCA78A6854A5A02B93949 SharedKey = 52CFD009708CB43CB382260BB09C4E93F7A37252989ABD98853C0614AE589BFF DRBG_SeedA = 741C46653D33E7B3B33EB284C47A7F485E6E0A0C2E38FD29D5952875B9601F53FCCAB5E30BA77A581B9E36E22E0879FF377D8622B93E880DA0A08DA0C8B734E2 H_OutputA = BEE8894D3BDC65DA125901DDADD0B48B6206BE7A864123E116AFAA4B8C6C8758 DRBG_SeedB = BC445D40211291B0F5789CC2E9A72456B0EB0C87E904C1CCC3E44F2B4C6A7E62 H_OutputB = F45F5B2645528096A53167730B6B62EA400123FD315D26ED08D7F07F5096FA68 SharedKey = 356C8E465A1A7119D3A1C4154B02563038DF9106C2EBD5519F91E01927981CD2 DRBG_SeedA = E9D74525829E0C5114A4A8791463F9C751B9F56412F85061B00092F9BCCE31FF689F19230BB32EB86D1EE933B2F6CC6438E6B15C2D47A8B35C17F4BA99E3CC2C H_OutputA = 88A16FDB00B35141A5F763378FDA51A4E1E64E65AE4599A8D984E876F4542780 DRBG_SeedB = 399EF5D9689D145CE2C835F15DC7BCE2D759495D2CAD273537A2B49C3BFFE251 H_OutputB = 3494A1DE5A02ECA5301CFD9EFA55784AD13C7EDDDA58A753ED10A1EE18E885F9 SharedKey = 43B2E3F33DAD3D9A8FB8BFC044A3AF1FC43F1F1BC00FC291BC021BC950DFC5A6 DRBG_SeedA = E2DA86CF7FE2DC3E7E751CF2204DB047CBD21E56D133BFE36F1E3310278FDC1B804E9A147273D538191BBC2217DC8F71347AD9F791CF53EF69755FD81F845A3F H_OutputA = E50B09339AF621EB85F4DBDD2F9ECDF721C5108412547A9333329E4F302CA84A DRBG_SeedB = D4715F93E11A45EF0D9D90F5D0CC3FE3E21899BEF98C7C35EBF955E0ED933D32 H_OutputB = 4CB94281B9161DB337AA5D43D6ADDAE28CB52986A42C78426EAE482BACB5F0C4 SharedKey = EFFF52D9D6AD62B812290BC570DA3B2C391E9B549FDE37EED79971743755790C DRBG_SeedA = 0B303D628A50C2BC79127581AD5DB86D0768E3931AB7BE9A95C20AA73E04CB7D3CB411977371DF48FE178623C085A21F81F5C6232FE1F4625BF94BC0DA6112C1 H_OutputA = 3B405020E210807BA8E3539665CF422C8F96A00806AE2019ACF5F35E4B2FCD92 DRBG_SeedB = E5EA934510925DD64C0FA40E2371EFA24E4C380C7A1EDAF944A5073C41E9448C H_OutputB = 1004469875B457B615BC9806C0E7F730D25C2815C7852203258DD385F9B0D0FB SharedKey = 8395DC4C7FF4A481AEE10510FF60BF00BD26E46CEE1FB18F606BC97FB3F6442E DRBG_SeedA = 5A9AAD611E4AA9E39B47C134795D95155EDC945FB69D070646FFF9D34688F413DFC51933D6C24BA869C402E199EE9305C264E2309AC02745AF7BBBCFD15750F3 H_OutputA = 763E66D24596536B7AC199085ED6360BFB8D247CE247D222072EAB315CC9C523 DRBG_SeedB = EC9E82EC39F8AF5EF54A1E14514282F39C2F2014A4C1EDD86D773CA6962EED2D H_OutputB = DBB8E00EC9DB510186CD9AD926A5FE2C933276C7FE360EEFC7E63FC9AB75AF53 SharedKey = 3E7ECEA0F3EF19DEA8DBA04A485263F32E95551382B82B553F9D990D26A17CA3 DRBG_SeedA = 67260A49B7F9CE6B497213A5612061481F99AB6B3E237C1DD2F942B0071B206C139B85F5D8CEF4F0364294AB6BE8CB90ACBCC8EA4C3F4411E05D568293892A2C H_OutputA = 49BA91701C51E7A33B890755685B75913521A921284858F28A66FFB381F1FF7F DRBG_SeedB = 2C8085B4DA0A5267170F834DA37198D3C64FA71E4DEE5370808880AC478AB17B H_OutputB = 4455784324559A61B153A58BE07A119220A4CE6870D9AA177F103B1379C2AF18 SharedKey = 16A5CC618CAE699DC151058004A64C7B8F08D925B24FCC31282217D1252C93BC DRBG_SeedA = C543B1EA6C2A02098FB7C019D4500396ED47EC0D19FCD9C096EAC9ADFBDC7F7B65435CF9E77F58495C6C852B069CA5C762E26ECBE47073AD20810366F527F696 H_OutputA = 9259DDD328A6A5D0DDFAA564190F9DEBDEB9DE2A38955449184EC489FCCE0E31 DRBG_SeedB = 3E8A0A92614798510649838DF3F8C7B98F19790507F0FA8AE5966824419B4EE5 H_OutputB = 1BE091B016E1F1944B2B48EA2BBDD07F6B7F065343D768CE604247D99848F55F SharedKey = 0C2A3E02E048B08E6E609C003DB7A374D5FC87D011B763F7DDA2461041E97797 DRBG_SeedA = 9594488CB4FB25106445698F562F90EF659C8D9646AF7504F729FDBD59DCADF90C79C178146E7EEAB754B3AACAEB7C8A9A9898A193DA2A85791EAC01BA790144 H_OutputA = E51E4F705840469F820AD32E803C8FB25C752E85C9DBFC600F6AC5A0EBA08BAF DRBG_SeedB = B1F9A6FDEA596BB4F5C290C0A4AB37309612CF6C94B16D4BBE290D0275CCFD2D H_OutputB = 2E5B9FC559273FD0657F7F36166ADBE21B59ECA30DB8CE2473932219810D4CB1 SharedKey = 98AE8DEDC52170CA077AB9077FFD70ACA4990CD40EE358187054009058D935CD DRBG_SeedA = FFD96DAC749CD5E05CB0AA39618487BF6457F6A9BE8F4342385200533103F7F29E9B6ACA565DFBACB335B5FBC8EB297946B937EB8D84BD2AEB91C9BD098446C5 H_OutputA = D1FADFBBCC7D34EEFB4EF90DA9F92A871748A44402422162698B1F2EF105D3BF DRBG_SeedB = EEC468A7B575E76EAB0D0B868C02EBB70570C9357B885A2689BB35D81F540961 H_OutputB = C655658E173FEB8A899C8A953B5B8657481F494DD01BC77FCCAF4328C53FAF83 SharedKey = 81239CF2714A3B049CCBA4C13EC5F65F3C5FA17C13FBA899B1BA142027A57802 DRBG_SeedA = 7C2C134A5E89CB7019C5B39BBAB67048F4DFC509BEC94BB9012BCF2F99A9C72937EDEBE77FFFCD9D686F669438ED3013FF958DACCC492CABA2C1B5E2F32E3742 H_OutputA = 3F002E58D1DBF719D221B405AFFAB36B413ED332B947A44C9237FD67D23169B7 DRBG_SeedB = 6A9BE0836A98FB0C0E570469B46F753AA41E60A8B13A6CC3A044BCCE1337C55E H_OutputB = 9C6E9A81C4166E4CC35F30F1DC39391B0A98549BACCC5FD47271BEC46FAB5956 SharedKey = CEDD48EE5394EF0CA73EB15DDCFFCE4287D9601EE2B862FD86359128383EEF12 DRBG_SeedA = 4447C5EE40A0C68CCD3C3A0F3BA2F80A826E6ED2CCDA5DB325EBE7B4D9C0158928C286D0660509F1691BEC58AB37A33678CBB94BE1E9CD9DCC83550E8E605F65 H_OutputA = EC5228F4EAEB8175AEE37BC1177157B47CCCC4FBC9A7756B5298A39566471820 DRBG_SeedB = 08681516557453B95D85AF65ABD828530CFEFCCE93CCCD3B3D9EC2D77911896D H_OutputB = B1D81915B2B8D6EE7EAC1FB307E098C5B2CBF1C545E64BE7DD4B423697C6E149 SharedKey = 6A845FA757A21364D58FF514D9F1E2FA216304299E749E14A2000D8E9E1714BC DRBG_SeedA = ECF9962CED33F2DBE24BF4B86AA2C448663A81235635F1C8E3A195195A0FD038CA0D9257B5B445F1638CB335C760762C2654EDB431017A5DCEB37DF0BD84F3D4 H_OutputA = 91A0CF654A85F04EA33876A0BDDA183E838AE4A423A5CFF36F0FA83ED401BA93 DRBG_SeedB = E1C54CA9E871B2E699FBDEB71AF2AFDA0971CBDB0DD4BA6EF2DA9ED06D9F30C3 H_OutputB = 36C9132A40C23E7F5FD8394D7F30AF2CDC07B79A34E71E2AC051F2D45350E1F1 SharedKey = A0A9C0073F82D0BC0B3145B0113FDCCC1F8A5DBFF786E521B94E4169CA64044F DRBG_SeedA = 413EB10388D27F997C0BE4099BC3F26CF5B6571A9BA697AFBB5DA313240038D627CD9C4823084376EBD4A5CE4DCC3C5A3FF698A50D9C20803D6E0B71A163F9E8 H_OutputA = AA0C0BE046FB7D338E7A8313FD9BE2179EA6F227B11096B9DA71E70BF0813536 DRBG_SeedB = 60A6AE29B22B1E63A510966D540BBB07F25A0988213B5206506CA6CE8AE47C80 H_OutputB = C43E09DB3BAD6F7C13A5C9D3DF3874BC444558E5933E3D7C89ADA14E8C34D213 SharedKey = 03520836702866BAA23444BADD5EE273D34F064BDD8CCD81D423BBC92E370BFA DRBG_SeedA = 1B8C374B2D8F37DC25DCD1A594BC937B1E1E6AA4C2ED68DD09BA9408ABB19F63DCBB1B6F1338B6A6EA4F1A60AF7ADD88E9FFAA974E33B12198E233A94C09D1EE H_OutputA = 57C48DA1C2B779ACE213582A79F3E6BE38F8FD3026998501B413B417F8FDCAFB DRBG_SeedB = 66A159E10B85A09FF9A2FD4742753EC7B0DEAB2E5D00FA8D539A6E473FD092F6 H_OutputB = 9AC6D85CE34AAB9F76B41D7D0F5946DF31B838512E3738E8C1179382C884D167 SharedKey = A7D241804E1EE22ACE5EC2175C754ED2FBEAA16BB2026CE0A45AC8464229FDB2 DRBG_SeedA = 9F1F2DEDD323458627EB6E03D9408B35413B4A9E1981F533BEBF5786F010B33EC95EDB20B79A81E80EF6115E96DD54247D3B75F95B6298B02F0212492EB95C11 H_OutputA = 11814F759E1815111D2AD132AAA0B66A08012C95234DC4B5B5C7616149A0B077 DRBG_SeedB = 925D0C38FAE328C9D4682FB07DF4B7B2BE3342F53A5E06D8AEF5A7AB20E3AE52 H_OutputB = 5B46A8E7AC1A24337E42B36106FD7B1E158D24F1F2AD7151B1CE3C1259EAB559 SharedKey = 9DF126CE6BD623BC64C545C26145CC19422388CCB5BEE661DCA8565A86016435 DRBG_SeedA = 838C6D05FA1ACC6F2F9C2847C240A2DBA83DA038FE0E6F1AE8ECF1BBAABFC8C96BE363B2D28A3336F9C0F2C880083AA19792A254B898E59B47C112EAE3AE556A H_OutputA = 0C49742E93248CFF21D73EE92BFBB9055E73EE2DB0D66323EB4FBCDE5287D474 DRBG_SeedB = 81A919643371EC3FCFE85582B0325E3630215F8F94FD3AA3407759E6A063354A H_OutputB = A1EF90914D56F37E4E9EC38944C6BDDA6252354EF0A739E95EDF20D0B5FC9336 SharedKey = AEEF4625FA71475E7836C8A55E54F357743936BC72C5CC32BFE3870D250733F2 DRBG_SeedA = B24FD8A6B3DA46A8FAF7AA621CD969C7214477071144F88A74F39A9999B139E36C48E9590906207E8863F3228E20089B55D7E0F69BB7F6296A40E509DB6F9926 H_OutputA = 3B3E484606CE2B29EE96202409E4DE2B8E97A3A6B73987F506324CC1CED15420 DRBG_SeedB = 549EDFC757A16F588FB4427C609C2D1FDC1ED7DA64F00576D1C42FC888840B24 H_OutputB = D107AC71DA31D545CFA4781BF706D14236236C759843C3A0E3022FDAC53D6903 SharedKey = BB37B17FB66D1C0687B85D4C0CAD9E51CFAD69ADA2C8D913B6D07A14DD17778B DRBG_SeedA = 6E06E665786FD63898E1604A9B8BDD81AFACD73399E8F05875AEB5217F161AC786828409E10445EA9EF90E08AE9A9FAA654DFF00CCA26FBE2FD24CB3CB1379F5 H_OutputA = 20B80F16A3441ACE6E9B63E69F2179C7F7144D1C53379EACDDCB24014B57FCA4 DRBG_SeedB = 149946AC35F1224299D2627412317DF2915DD23587C05AB61B1A26FF2E7AC628 H_OutputB = C49AED09E937832445B418A9AA68FB60CE1503202815D39DC421F7797434CE3C SharedKey = E1DAD46681A6BD563F4CE7EA22B4ECD9059780963ADE8123A0A22B2150F7B45B DRBG_SeedA = FCC60ED0BB94032B5CC4B12587421BFCBDCF23AC0E80833DD8C5A87561068DE056079ECF0CA6CE1E3FC7CB37C51D9A0EA90A51EC2EFE70C6F8D4DA7254A3F845 H_OutputA = 25FF10EE1BE399B21EA5E663A5342A23A96C5E7BDADA9F1E4EE5176DA4B39764 DRBG_SeedB = 5099AF290FCA3D6C1040E66D78C3A3EA81106C952129AF78968E0CE60C2E5B82 H_OutputB = 1037D5A52DCCBEEB429D12CA90DC1CA4816E00940089D0C2D8F7DC21201A7313 SharedKey = 9FBB13EF32CF525BD519EEACD0622D6A34A28EFF638F5FD210C2A2C95628CEA6 DRBG_SeedA = DE4B3441819D47524FA4701D792EEC94562DA373EA973A647F63CD447F96822AB54055F8E47F3427DE8476336062D30D4D47DCAC954D50A2AA234CE1CE5DE77A H_OutputA = 08075B71CEDE2F3456A819EEEE0DAE673D9547986F359346200271D41B44CE17 DRBG_SeedB = CED3E34BBD6302C1628ECDF6E1F2BA781C6C932DE5095F257F49EEC064531329 H_OutputB = 94E32D704FDE33733EDAC6B6D0C08E4C5E755E394DD8BAAB28B28ADF98C6CF64 SharedKey = 0B7E69B49D4742132E353F68A4449E6ECCDF4EA121FE67931A1C45ACCE360EED DRBG_SeedA = C5DFADC6056F7E1D91F1A7BF525B0833DB5227C421DF46FC9C0B681472195A6DC219DE86CDDD63187AE335581168FA41C9346595CC2B34505C9EE03754E0F4BB H_OutputA = 10785105E9B02F0721C8E7988A76C888460B55A93EF65E9269C49A82DE77E131 DRBG_SeedB = 8BD6617679D11036B14546529630F810D1F9C0AF0FE4DC9F3E8195190FECE33C H_OutputB = 365D382D029CCC30FCE97C44EC2999DD1D76DB9F4A288A7A14A204855104F1F5 SharedKey = D2B68C3CA9AF7A087CDF94A9BDD47130120FCCD24787B0C4B5ED96672502097F DRBG_SeedA = A33815C0B72E4C6764FC1B4C66A9FF0355DD15119C585A6B76FB16F8A9A9EDD979CB508F2C485F76CE144DCD9056B7F46A7C94420E5998E5B5BC1046F3521CD3 H_OutputA = BD471BEF67BE0FFF6B0E8C5C0A231320E09A6B77BCB50F86EDCE6E9CBD35C21B DRBG_SeedB = 698CD1944F02393F153C7865BC5D340D6ABC7F90BC2C368880DFC851AD428780 H_OutputB = 199FF6DBE627138A3751D0E8159400C1748647B9889C8C2AF909E322D7541AAE SharedKey = 68CD9FA0D5EB9C7D397763FECFF214DF2ADDCEBFD95D094325EF5D17A45C0959 DRBG_SeedA = 4C445036E5F1C37DE77940B73E1EE0EBDCA13F3928191BCEAA66E900B3D62C019A9B5EE098D669C43E42FA1AB4C6C59BD7B99B03A9CC2D5A89E382D405988F9A H_OutputA = 4CA2124907458EFFCE2CD303B76D03E0B07ECE64703A63A9558F9537F7095CCD DRBG_SeedB = D30BEA847B969895C121F3F3813CB8050DC69143EC604090BCB3BF4FA76EBDD8 H_OutputB = 3821D32400740FE00A361908E38BF4787CD16FF4CB0F78CCFD56C46C185063BA SharedKey = 4A197352FB73453D06F89A85F15F814C92B48F2A934E14444C12A934733705D1 DRBG_SeedA = C5BA05D16B5BC3F2D6187A307DA3F91DEF01855656C593FAAC24E8091073F5A23E96D81ED0A9A04D123090EE1871C2CD87C50B84E3096DD8A0F6F567980A1ED4 H_OutputA = 788E0540C46C14A2272567EAAFA39153E2EA53D068B6057CB346AB0B52BBA790 DRBG_SeedB = F3CD3FF98280C50715084862C47B62FD223D6EF3B7CD21A97E06BF0D14499B98 H_OutputB = 19A0C9D1FB76600C225E169DE3552EFFB311B5137AF903A4D12470D4A051F700 SharedKey = 6BF55B06BD8402D90DC321DB5C274F33C44A3999FA2AE6C12BA4639D421B1A13 DRBG_SeedA = 638CB690353A465C875B397767705B7DB95E3C20361192B8E603387743ACA8CA9D1928C3B243598B0DF2A1756ED1969C14BDBACBFEABA59FD138E9B7E21DE9C2 H_OutputA = 668DB708C69D1B65A33265E26648E8EB5A656419D7BCDF67DAE5A94A8182B530 DRBG_SeedB = F56DE1DF2A6E11C2AB111D9F2666C30D2D3B74D294531A4E514F191E4BE97172 H_OutputB = FB291A4338295334291CB7B05F7D9117E71F59B40ABD1776842E46DAA8368206 SharedKey = F6E8670F47EECAFA4FD03983324A3AFEE4F15F14C41DA406637EB7F51795EEE3 DRBG_SeedA = 8B46583A951C444AB1E71D19EFD50E3AA4EFB5D7DEC4D618E5FE18D1B6AD77464F044F746231895F58BEA66886351CB5D77E6DF1EA890769E4337349833476E7 H_OutputA = 82B4108C953AE3592E10A111EEF9D666F7275935D33E7289107D9734C67F10C8 DRBG_SeedB = FB31F3607EE508A777CE31D5892EA1A20A8AA07BD4C6A30189225E42835E3F17 H_OutputB = 50EA47F1A50CDBE915DB0D3FBAD823CA07C6A36701B7C80D587ACD1C0377595B SharedKey = B6D167985E198A8BC1E27791125FDBD049E403546D1EC3CC9CE2D7D51D517410 DRBG_SeedA = 20CFA0FD3C321AF77C4B79984394AF98D245BFCCE09A946D719B3FFD558CEEEA6377C8CAFBB1CA1516CA57ECDC58BF5FDC5DF1307A91AD331BC47221E1CC7018 H_OutputA = 3AC95273F478E16A16B78083AFF8F7BD0652FA93627612BA66040B4A3D2892BD DRBG_SeedB = F70A8BEFBF63991F80DDE8D46BCC36233D121483C381B70D86DC958C9B6BE077 H_OutputB = E2CB7C9CC1568F84A818F37484A3EA63BA9B6CA4ED79DB0E05B01328C978056C SharedKey = 3C5F9B3E0D06767D00A67F16DDD0A1CA84B12A05462F69EC8F0C321749F19594 DRBG_SeedA = 23EBEDA1083F30151C4FA2504F16CE1789F8BB84BB7B67BE0AEB10A9AD764B655EFDABE926A6272768EEEE912D0B62A19E1AE9C3A05A9E4F0B7CD05E02F5559E H_OutputA = D961032600AC50ABE44834AE49623EA58D0E2BCB0F0062ACD7F8803576062936 DRBG_SeedB = 82EB3B107CE9671C5667D491C50A703B54C735DFEBB2FC0D1085BA395B29CFFE H_OutputB = 774B41CAF70AC759093D3AAE99A853F0C2265284B51E7CC0BD82CAE17A045F78 SharedKey = 6AE1AA13F0736B90406A3863F29E7417F5DA329EF0B5C452B8F5778EA11BDF3E DRBG_SeedA = 0C003CC01FED61BC9D48E55AC1B5D56B8EA23AC5B4A817459D7FB6F4C9F773F9EDB133C5F7751413DAEBEEDE2824812C469A863FC3BCBE03E6B7949CCF2731F6 H_OutputA = 7EF8CA6F7C9F90C71898B6617826945BDB0738B3E8799023AB8638688A05EB1A DRBG_SeedB = DDC3D8BAE3F4C857153AFD17A4526CD7DAD71E0BED4E375295278477FE2F25F0 H_OutputB = 4C3E088712A2976A4FF4B1719470709B317FC6CCC033FC6A89295F72885640D6 SharedKey = C50D43C0E78B7576BB566F0F229A991060D9A4BF12614DCA9ED13406CD3FCF83 DRBG_SeedA = F277E6D794560D815262CD95BABAA390DDF03DE94B9BD89788304175BDDBC639DBAC22F8D1A1F6548C1EC2D3096F9218A930A6E854A0A5814B0DF176B9C35851 H_OutputA = B34325DEE719043FCCE5845C3712835578A571006D2EC0F662D9DE081DA662BE DRBG_SeedB = 52191AFFE05CA1CAFFFE438374452A070E127B1D5D47BCEEFCB19433DD34CEC3 H_OutputB = 5B70BE7028862C872F83C8B5D1BCDA8BACC55285E326B73BB060C251C3493761 SharedKey = FC2937D5D6C44583AA4C567C47D1297885C6F4C57B2AA1F0E6301E9FB58C3990 DRBG_SeedA = C3FEC37092717C2D2DFB0572AB7AB058F743BD6933F1269318021D5D0C9FA9BEF162611670CBC201D496FA5CFDC0D4B036049EB3DCFD916BA823375023534F36 H_OutputA = 7D9425967A29C534EA8504BA9D2930E441A38FEEE99975D490B47B00B9D3D03F DRBG_SeedB = 00160E467902DDD9AB0F3AFE6A7B8ACB225C8B8D923426AF11B5B61E64C37654 H_OutputB = F10C1E187FFC0E3D7B4693BAB0765D44502EFCC8B52B8D7C12044F91EEA3A376 SharedKey = 45F44CCA70A5A5198F9E6358BC5FA847A8E5A2D73465F3078243EAB466D2E9BB DRBG_SeedA = FA74D507174580979077AAF4971A9C97153912F3CB37E3B49404189CDFA6CA38C461AC7631FC2479D001871DEACB128DD4E8D7FFD9A151D0EBEF47FCB43BD2AF H_OutputA = 10072A41811CA544930CCC27E6E91D578B9EFCEF6081F7EF72270D402EB4360C DRBG_SeedB = F0E96E82711A07D64D4234D5C964C838C0C1448FDEBCD8203397FB36D3679DE9 H_OutputB = E905C6395CB94E661C6883C27292029076F5B4FE2F960B51C33CD42764BD7ED5 SharedKey = BC2D56C9344C15B38151C372B895FDA34A570E8956F75F191327656954E0D787 DRBG_SeedA = F65EA17751432A5DDDEEF6A96E373E4322E774D2F94C88C89E22489A76C3A808E1559385BAE7743E489DEEF253B5DE2E9C9BC7D1B12A338ADD4FCF81586696DB H_OutputA = 0E388DD962FA1CE81659C8B8A8F29B101500EE6D8C457E20433C991706074AEE DRBG_SeedB = 2D5A8E911FB66ABB5A8170E88A287F6DD0C1764B7B6E6AAF9EE6607ED87BA89C H_OutputB = 081C8E9B616082708ABE7FE5E24174B9C6254A19A2BF536DAB191D925745B4B1 SharedKey = 2A0227AB048B8AF850BE15B3BE4D6D6E7EE2DF40EA5A633EF1688A460FE7FA30 DRBG_SeedA = 73AF542785506B71A427555907D32D8B33B3262EADFEFB718EC3449C7EDD19DE6726C3DD759634C6F7856C43F1B5911836258545C55CBA7009120665911C906F H_OutputA = B7331464FC1EA4FC8A0DE0856BCF6151E487584C4CDA9433DAB083341461EE42 DRBG_SeedB = 88B1152E8835A93C471DD3F67D8AA78B6D6A8DE1B3838D8C7E21396A3B2D7477 H_OutputB = 1E0405A628A2E2B6B0BAA5B30A5C5555C5B144CC88695131EFBF3274935D164A SharedKey = 438F87FAF53FFA07DC5AC7F208E65DBA2D190B0D0D95F83A4C1271FD11260979 DRBG_SeedA = 6924D4568DEB30B12D14D13696EDAB9F7911CB12A175F45F192AB5BADE3055033B3188B708131A14F9E9AD24F963E2B677F908CD2C1F6CD09251F48EFF9FFA4D H_OutputA = 2D891F321E23BEB8DE8827B5C74FC2AB5EC5591A468D5E2A6FC8CD1158CCDC03 DRBG_SeedB = AFC1EE3EAEB28EBA31BA6553FE1BB0A3B37897C34C2F8F6E57904FAE490DC164 H_OutputB = 9172B58B7CAC3E7361AC975B02AA98A334E8AE9422572716F2186CFBE4BFD25D SharedKey = 25C4915D281B5461FDEB7D85F3E5A690D3EC601A54DE16D8B342BC57A1C158C5 DRBG_SeedA = E19D935E70922C9BFE88729BBBF42CE2C0A5B077E25438BDE8A552141467FDABB925EDD69B21550F713F30EF34DADC7AD1611DC400FBD309B8CC1B9FD4DE1200 H_OutputA = 7969E588A919380640CA771409A182C96838E7982D77CA2B9A4D935370EF6E68 DRBG_SeedB = 6CE8F477D60B4728528678B8AF9C24A08665F5B1B9B27F25FD3795FA4FDDFAB0 H_OutputB = E9BCBB8548523E0C1B75C55649EB0167AD0ECC959C8A6AA14E3C5283737F4224 SharedKey = AAB2AD51F35C7B7BD7720690F02529B445D13A49E94657A4D47D742E31D3967E DRBG_SeedA = FC647920DAE4FFDE09CD90D5830CB25D8197DFC9562209FD54DF78A9E5A86E579295654C0454B1F516746605631853637E4E9AA93A49463A324AA9F478C9CBD0 H_OutputA = 5DD10978F515A71F041BDD451153A30F67C1731479A6E3CADFB11A5B5B4CBD96 DRBG_SeedB = A64F0C9819B4464EDE845E60E768C29D1A14CE4868B43BF1FFB04715C1E108AE H_OutputB = A6B5DBAEEAA65260ECB8E549540DD1DDACF37C7D06D8D3C4C68F57B28D98EE2C SharedKey = 86177DD342A989AD71A11130F3DEE6193234FC6B2396D1966D1D7FC87455D191 DRBG_SeedA = 2F1F238B7AB7E54946968B1F21B6B8A534B942863F164974BBBD731E69C069178DBCD802D16A94593002BD0F34C6DA88BF4FAA9A6B2828A1A0F2C43D50E530B0 H_OutputA = 80E630E3A266E6EDBA29710B9CC062AABC8D636A5BF6805AD540B610133584D7 DRBG_SeedB = 19DEAE977AEB364D723180EFE1D2ADB5AEE8AA6BFB611582A0773345B7A78A44 H_OutputB = 8BC14B370888ABA7B013C3168C92E2516DAE962D35B3469639631A9810C95C49 SharedKey = BA9BC831164356236C2B5BD178E7E2A63B0506D35D222DDAB8125F1CF8509D53 DRBG_SeedA = 723F5A2C08623C9FF3E285028A2D600E05A8286280A05F0276681E1CC44E556EABDD7735DC09563D58085E9F9C6BF41622DFF41B2BC94F08125DE97200B141AF H_OutputA = CF62BD6339346C641264CAC69BAF8DB8BA9C242168AB9EA03CD95E991C9A5DAB DRBG_SeedB = 239425524F77FF7B1627AD7D214A7A4110E1C1DF0AB0FFF7F01C0CE9E7ED1984 H_OutputB = A54983B7F376837E376EE91419E0D3C4FB332F3CBA0B19419BAF84A6E55AFF3C SharedKey = FD008009A77F718266AB307AF37A0EEE09DD12E6FADBD93D30C731D203549088 DRBG_SeedA = 874ECCFC40E180E41344CF83B750EEF7203A235EED5CFB57577C7B80AB8A17966AC56F6ABDAECD2C716C5BEF9718D3CA246323243D85B121291228C9DB0B9BB5 H_OutputA = 136031C5024FABF919079FCF4AE0FEEB5981903507C8AB6E76E6DCFC1A72FCA8 DRBG_SeedB = 0E3A8BBCF9385B2C46DA01E643CB927FDB0751825895504D2B4FB0BF10928743 H_OutputB = F0AAAB684F21C6BB7D5989468C0325552458B6F849D0F50F12D20016060869F9 SharedKey = BEAA3C87777121037C204815D1B8755FA93FF5CF17E7D60A567FC56B3726B886 DRBG_SeedA = 0346893D9893F2C886AB407042272ADF58C211817807E8EF977F5D755739EA99F47E91500361DD66DB339DAFAF2535DBD513D6BB5F1AC8F10C43C434788D0E4E H_OutputA = 1F1FF01D9A068F0C10C55FFE240EFE924BFB59075E54D1388F054442689BE50E DRBG_SeedB = AAB4ABFDF6DED2EADBF83C366466DFD838025F22CCDA2F8EB9EF5218BFC55FB8 H_OutputB = 12B38A6EBCD4B429CAA881FD4834520D2338330D4A4DF7421E3326DA7ACF70D0 SharedKey = 9916D05E2BDA82EEFC22AEBC943CA1E18945E7274F12EDC786B2051D1BF55399 DRBG_SeedA = 9F74AED00D11B7AAAB42CFDFA633113224B4CC19DFA52DBD77BF30F327D990762A7B12E914CB26D47A4E1918ED21686BB684B568C38E267D29B87C4566B7D2A9 H_OutputA = 03CA28D0AE036A788828FAFAF8A03BBE0548BEB6F379E287F1C28A835EAF35A3 DRBG_SeedB = 3D711E2103680DAEAB54D16DD283E884A0D9960A161E38A47532DA04A73BE1CD H_OutputB = 2353ED9455FF2DE8AC8C16E4CAE6322E304F575E67519EA1EA6D145AB8419A7F SharedKey = 4D4007EAFC3035FC7682B9B09AB943AADC45A81935EDD2968776085D94C3B65C DRBG_SeedA = A4D3B9AAE955E0DE1FFBA1A75D3CB53C347270D1A8CC7ADCF719765D6177583F0E5FCDA245FBDECA0FB1E11C19CD64BA2E8031453A271F7BA49231F798494A75 H_OutputA = E04DE9E0DD7C277AC8C3601CE1D15DF954D8D90015C0F28EEEF71EF894C6A5A3 DRBG_SeedB = D352C300C9DBABD4F1B035CD28F891A7BD83E05199F40D4CE50D9705B7A63CC5 H_OutputB = B9DD099EF0483CC9B7A1D31B454FF6E61CD84B94FB2FC310C47DBCCA7DC1B262 SharedKey = FDEFC2590011541FBF1941A60D2FC838828F01F86687798B6A512A59DED8B0A1 DRBG_SeedA = 5C0712995786EAF56A7EC1590E97BB9CEECE37E9C6874BCE357D2FD52006C31FE443DCE55238F18336B354ACE42C083E7C6A37E29B8FBE1742D65FE3FD41DF8B H_OutputA = ACED92A99EF758C668D1C5BAD9D48330D2F45AF39C9C275380F96AC05516C7CA DRBG_SeedB = 9804A08E08F77A600D65492D7D79DB23E63D20C5A8D325E812E4325C89F2B4DF H_OutputB = FC70FA74A55D9B18DE7D668149BFBF4274FD8B7FEF1D6D61F1AAE7BE1C54A1E3 SharedKey = 10F2FFE569510E0C54B5241F37B085B48F1C927EABF1D11C6266446F963A1C1C DRBG_SeedA = C02A045DDBFD2B20290C02000DE6315012587A7B5E2EFFF164AC96890D60E570185AB3734BA236F3CB86CE7A28D981CE6D94548DA78F5B8B08AE65C2E9583F90 H_OutputA = 6B3E57A943EEFF2FDCE406C9613942F2C8A685EE2D1884E881D3E07DCE73AD82 DRBG_SeedB = 6712EB222D5B550FDC3A7328B0B3FB3E2AB45650F3E6CD4AE83DB89EE0EEEB2F H_OutputB = 147F7BCB5F6D2C0F767F210B0D737B633D1B58C3C89E146B5098B9ABDD2E0C8F SharedKey = 5C523AC6E963025014FCB36BE94D80A0E1356014BDD60F5B3A5F994359E05BE5 DRBG_SeedA = C6AAF89B784FDE787AE0021F6B1ACBAC739E17B7C8C28458934E9AD06B04452249FCED0218E8D683360888CDD30E4AAF4C6944A0B6FC49830C870E5622F47F10 H_OutputA = 28E73783A4DEBE3B492B746D87F2A28C8E432E2C2D160BAAD4FB9EF5D1DD3CBA DRBG_SeedB = CE53DE10705280CE9467F3AC743847435E18BC64481775719A6C2EDC296863B1 H_OutputB = 0993743E1412F43F11705109957E127E797EA09CFDD62188BEAD80C7D0345F67 SharedKey = 472F5C0CAE17085BB97BEA9255F1E13FEEDDACDD819E5710A1D5ACAB070A1868 DRBG_SeedA = E706D0FDAB5A2E18810CE6241C6272BBD2A01D08D1A1B11CBEF6DD54C095EC8ACCDDBE4E647584935C38B4E5C1E47193CCCDE45C68EB3B8D406108953F8212D0 H_OutputA = A4CC0F9291C2BB6E6CFB1755A46E65FDC6628974467ACC5E82EB3D29EBB4A3B2 DRBG_SeedB = 2B57346E07BE206397FE953B880040629CB2F574D9FA31F7AAB9F1C46F9A2728 H_OutputB = 8CD2FE4B94BFDBC49B347E2A239CE3E26852E8887BF79D17D236920170570A2B SharedKey = E1D91556C3E05AB3CA9D0168326A91596418EE0A3755C084661589271A9ED64A DRBG_SeedA = D794E00EAB92C2B84436187BDF14550DBADE0309656EC892AEEFCFDB5437B7212704A4AE3CAB0DF8E5B66F26914AB26EBF7EC8F99A5C7DDDE951832F227F5B3C H_OutputA = 376ADAA8B0738770688CBDD93B6126A8D4651A6589CBC355512F3285A6F857D1 DRBG_SeedB = E7E4FF9363BD26E85ACC075DF75D9B880095199344E2D9A20A4CA1E455C89C9C H_OutputB = EA52EA3906C765BAF3C92F6C499A0A06586A974B8F7C4B78C2012D37EEB2E6CA SharedKey = 8F7C1AAE71C51BCB58C9D142245DC1F204916E98453944D6B41176431C6AF16A DRBG_SeedA = 787F0BCB1C1C4E3FAA637801312A60FFE84063A7C1755EF41A0A1FFADF3955E38B5DA7A1EB3E4AEEB8B0AF1F6952DB3E0220A2EAC7BCE28A10028340D8E63F67 H_OutputA = 8E951C172EBDCAD2CB49F68415FF4037B973FD78BC3AF01DCFB828AE2E4ACB37 DRBG_SeedB = 1C7283797EE1143FF38D51F28C53FDA90B809BC860A97E4461E453BAE4E15E64 H_OutputB = 561AC58E5793DF77F4AA79060E7D20D69FAFB496464E6D1C56D2747C52CB4F60 SharedKey = 1CA76D0A5864F7DE831BDB515ECEEAA695D01BA49ECFB6CB1EE98085BB098EE9 DRBG_SeedA = C8D26CB920B4F48EB69D9AAD4350C6F1BE1510BF77D2AD37CA060EB059F9127BD09B4EBFE15674AAC52ECA99EBEAE91C515630600CB483E6DA88E1950ABD89C9 H_OutputA = 465B9F7D9735EC4FA2A7890B37F0763ABAB085204EB6DC62B9B6B915394FF88D DRBG_SeedB = E1479109C05B657CF9E71C9330BD2B3221DBA2DAA4598715234E39B21F0AEA54 H_OutputB = F3F3CDCBE9E94C57FD9A88367DC9D0F7F6AC16997FA2E3CC87E4F1B48DBD50E2 SharedKey = BD0E6670E96D1B880A58A1CF9F59A652E142945645759A1095927AD69423E0D9 DRBG_SeedA = 8BE32BDBD246F4E913E9033C87F0204135AF27618C81FB3D24705F12E125E434F931E1EFFA27BBD85D321A611B5B6D083964E12DC7F1B2DC0702F1CC083CAA5B H_OutputA = 81EA91A7B8EA045A7A17C67D529F995E4453805DB92E539EB8B066212F7EFDD1 DRBG_SeedB = C7DB12F2D870935FFB1EAE95A8458C555BF42A54FDCD050F149415BA5CC56D91 H_OutputB = EEC9ECC6E72DA3264FACA0A07E5F6CFF96C1CAEA9A6FAC3165995176B88949AC SharedKey = 40D46BBB90397B31AE6872C5956F7EE1013019A9B77FE4992D94C7C3943E5ECB DRBG_SeedA = 96BB44E712F75BFC8A058FE29CC8F4F268FD78CD5FC6A2C4876807EF599010FADBD3942848A4A2B02810F22E246B2EE7AE94AFA3661B55E8DE4014D6ECAB03B3 H_OutputA = 6838567DAD1701BFD189C5F4DB5423BD822EFB8E4610F9718AC077F225822F2B DRBG_SeedB = BCFF93D9DC8473C82B2E995AD9DE816C0EE1065C23BB330A7EA26D0651DBFBFB H_OutputB = C13BC4DBC9E47004A510370ACA79BB2DEAC9FB428E825ED3FC60C22B48B726CA SharedKey = 655AFA5B24FAEA6FAB404B4D37D2E150A15A7BEACE3DC2A214C7B72063EF3CE7 DRBG_SeedA = 3F34B7226BC084CAFB96115A33A530E8AD2D6B27F2B962389F8EBCB57331579E33311DB0BCEF25F54CBE0AF0090EB879CFE686C2012538783EEEAF365D553873 H_OutputA = 70B2FBD43CEC40436A36859D4D1DFC78BB72821061B3317D082C54A029D9FE42 DRBG_SeedB = E416D766BE92F5B44FC1FDDF4940DD4F3A317B959EE77EDC0BBE25271934DAE1 H_OutputB = 5FA1786D3791360D794FAC510351EAB948BA4F5897A847FB3EB7E61ABACE38E4 SharedKey = 038490238D02DE93FC1B4092FB721784BAED376987A3C5ACE6482321D2A015AE DRBG_SeedA = 8ABE32658462FD365B76D5B30D8732AEF70BF940A93F0930C2618D4B11F03084672A73033BAE780EE4C91B641780F81669FFFC353B926B792FF2D8DE34D06838 H_OutputA = F73E47182A0DFFB6967D3DF675416E5E7CCA9BE03BA777ACC26ED5DFE85752CC DRBG_SeedB = A21FCF0853FEACC488EB65705BD333D6F2F03EC92ED7F36DFC29510BE2ED6AAE H_OutputB = DB11A40B64E88127FC07A6D239855E1E7EE688D53424C6B77E230988B137927F SharedKey = 221D2D42344ED71E577F9D98E550FB51C67B89119BC6DDF1C268D4B519779153 DRBG_SeedA = 297D369EB131C02CFC4EBF5A9F3D4BB9C0B58D33675241D5225A485DDAAE8356F42A0A5A05FF3D1C431DF74B9512EF158BE0AA87C44F7C9DB648F6E575B150C1 H_OutputA = F0A7BD695F1801858FED280455AEEC550078FB36F22B347B16D15CD0A384C742 DRBG_SeedB = A76B09CDEC6DC92AD43F18FEBC91F2EE9D29C9200C215DB6EE809452602CD119 H_OutputB = FD8F14EE5D1E6572B4D4759DFE6B4C446A888D7052B9E69A7DDF78DAE375F57D SharedKey = 51D7D053BFAF3CD3982822B542637B47B06940C25EF06D806344D17175030D2E DRBG_SeedA = 15FBAA61ABB5DA5BA546095DDCCAB71664F2B02FA01C089E73D9D3B79ADED30B3D3ABAC1DC193D42F837B33FFA661FCD581B46B6E26D728DBC699CF54A98CB8F H_OutputA = 435C0331D987F72FC02C5F958D40DB75F58D8BB107BE0C67CE9284D31A95E62C DRBG_SeedB = 9DDB4CADF45AC859DBF20D51A2CE134364C4D695CAD458612ED1A562D36ACDB7 H_OutputB = DEF201B8E724F4D3BE9CAACCC0FBCA92BABFF59B18FFABF99124C471A029BB56 SharedKey = F1CDA7048D20FBDD53095C12B8F591F3D073822506824BB0D2E73DD93DA998B1 DRBG_SeedA = 90EB2980E3012B6610E05E2572C241E917E30DC2301F67E9E1DF29CC15FDDE842355004502D680CD588CAC0609E6F44F4ABF439A01715353E3C8D1A72C6D71FD H_OutputA = 12517BD694EB0B77A95B0E561E56911DEE0E5DD76967110E751692B4E9715EA3 DRBG_SeedB = 734DE97DE8DA2E543D50BFC1D59D413B44588E414E2E38E418F9572D98B4D09F H_OutputB = 41BABC079D89CB17A540E3C30D6149F6F77B9952E3C166E4B02A2F93E3C57273 SharedKey = 7C3B2B43EC67E99D75F443AA73774C6C6A2D914EC7527E43734BBA15757B5F09 DRBG_SeedA = 272A96D4DB762D4558264AF7F0555DE822A94DD2434F39D489246ABB7C2B24E3A867E1C4F05E3B30DD5231580C38F74EA0E1FBE4F5F05EE06CAB377A31F05FFA H_OutputA = 94D0C9DAD247EB34D43C6D08E38AB1F7914705EDFD0F7BC014EEACDD74370A90 DRBG_SeedB = 67733CFC6FDF8D271E589C18230F49510868A6BBF44077138A44B7301E6938A0 H_OutputB = 81A48E92347B9A80EDAF310F2DCEC913E9898171BC92DF3DE444126981DE74AB SharedKey = 910725D0AECFB337445A6E21A096FD3BEFE82BAF2E8446E2A1C49C2290B70376 DRBG_SeedA = F593E741A069107F7481D373D5BA4B179211A1A224CC75E4878DFBCDB03483BFB9A006B7BD921F7D403C9C4B8F92E03DA172A49987AC299736CBE3F6DF088582 H_OutputA = D5229B32346CFB297E7B92B7909E138BEF37920637831D91A6691F558F5861F3 DRBG_SeedB = 5BAA7971F3283352BF7EB3B4CB4C7CFC5AA69E29A619765015E704DE7D2F4302 H_OutputB = 5611F8DFE2475176D399199E105ABE3EC83348F1720FE5B631E6AD8238AE70C0 SharedKey = 9C2C5F82A80EABD340CCD97C027FBAB942F3563FD2CB27B542811679624E3CAD DRBG_SeedA = 68D5BADA83020AEBCCA6C65C5360D47EA16283718C4C9ABB715699A0BD94A1870D467C110F82127E8E1180560737F10F8973BC1E69E72F12335C8C5F124918A5 H_OutputA = DD425005E02F2F8FA08F618364C34DFA7A2AB0AA55176A8CFB076D6F24D34F34 DRBG_SeedB = C26D76EFAB72D54131F0FF2AF352B74E694C323D6804FA2EEB8B289E88E78C3C H_OutputB = B75D73C3CD8D53C18C2C3A1604F01C7D581333833C79E67959895DAA316EA7F4 SharedKey = 6912ACF31754CCA6CB55FF2894DEB1FD8FA604A3E773E4A2D078E7817BA73970 DRBG_SeedA = BCA4EBADF4A1ECBF5AE5403F3B239DD00C3399861C816345C9446C3307D79D2104BE9515F8A534E8CA33B995CFB8194AE5372FB1679D4473FB8628BA1C4B51CE H_OutputA = 8D63065011C53063871BF1149165DA8140BBC4EE33C1905A809AFA1D3ED61C53 DRBG_SeedB = D7EB6C46B7641A6FE1F969C30D6B8821008D3192B4AD934EF7B27D22DEA69FEA H_OutputB = 3EB504B0481CF1168A54EF8D453BC1558518EAD2DA31CBB052058C77FD6C9D9C SharedKey = 3A5115A0A2A6FD41AD779B9395AFF3B1D75739EAB1E5375E964AC40B28B4E529 DRBG_SeedA = 1B5BE663E55DA05FF2E7719852A49E4D4D851ED737BB4A9FE181776A3557CBD65CF2838A03DEDCF33A8EB72068B54457859A67EEBE5AC74DB3E3F0232ABE1212 H_OutputA = C8AEEEB635E1209C7C5F373D99FABA7784119943B956A81A02FDA73248072838 DRBG_SeedB = 6E4A1FAC64A8BF54BEC93EE10B7B9C0817111EBEB0886FEAC6EC17ABCF6C6029 H_OutputB = B552EE381CF7ECF7BC93F62460ED06EB91D7F65976BE6F03EC48111A244D6214 SharedKey = 2DDB13C32D9EEEEC5A2DAB7A2DCC395DFEBA05C5314B551CCA7DD3A72EB79572 DRBG_SeedA = 7A5D1CF8F1435869FF14FB3E897EF263D1E1CDBB168FF72DF196AA5E77C07F875CDCA7C0C0A3041D95BB846D0474360206F10CF9A9AB0CA1DA5D7330A0259D50 H_OutputA = 0B9CA453828F146A34A4B7C91E3C4C8D1469AE878E71AD425288C5C99652E250 DRBG_SeedB = 3E496CF19D2DAF4F2F0D9F911E3BFD7464766ECFC3753762D0D7C1D957338450 H_OutputB = 94BE5B3017CCE2C0E13BAEDF156A650CA887592E0A7479FE6DD979A5292531ED SharedKey = C972A4B90F18E8470C8617D19CABB200A65C91698A264F27029E314BB70A38E3 DRBG_SeedA = 835010E134891A40E6D75AC16279F3827280770B169F366D99DFA7696EECA29C8CB58DBB2641DDC8895974CC28868E0029D68F667AAD1D34188263C463D76FD6 H_OutputA = 07BF49FCFBEAF9B9A2920ED775C92E5EA6CEFFEE60636A8E7F38E751B474083E DRBG_SeedB = 68EDB7C2DC4445B92BA74742F0406E7CB1A4806107F15050D30EE02CB2445989 H_OutputB = 0E1475480F296BF987E166DB38A11E8BD7A194F920BCCC33DA9A27065D6FE35B SharedKey = 002F3EE4A5345DDD2C11C3791DA211F329A4986887E13D1B9963AC0648B60EC2 DRBG_SeedA = DA292914E6FB7E324C4757EBC2B1D807B1BA1CCCA91EADD36C9888ADD145DA537504CE9FDC76FBFB31FA939020F283ED1EAF8C965FA1D3D7C6361A255B02A9F5 H_OutputA = 051D04509D94CC5FE8F2648092E9F083E236B66D101EDAB76AD7E71FDFE98B8D DRBG_SeedB = 976DFBCDA06024F40CE1343D82D861E8CD8255DE9F84E6B4E3CAD01FB33D420D H_OutputB = 761297D67505AB211BBD727705C485DDBEEBD4313C8A52BCFEE517F07EF14611 SharedKey = 760909AF718258FDE571B44E32288ECBF0778EA2D0347A1F638A40E700EE7753 DRBG_SeedA = D5AE7F13588D721BC7D2724738473EE7030A46C6605CB692ABC35C4FD048F5F82251AB1D533D915101812CC9D69BA9BFD6028A52E4A8CFFB52908D4F425520F5 H_OutputA = 369EC2D3F2BAEA4C19299215C17887CE445DCDB8B6044FF14BD0AA4BCC69F632 DRBG_SeedB = C59CE97323D686F1CB185704669AEFEF1621E2A527BF469194EACD4DE3273DE1 H_OutputB = 29DEEFF2D08116AFF7C1D8BA4BE1D9E2938578C23F47D5C472B7135D21411855 SharedKey = 72864802FD9708C20B2044DB9735FACD838C73ADF9CBD4BCEAF148A67C8E40CD DRBG_SeedA = 5B7D1FD23D05D670A05DD803ADE0FB9000D21A29892F401D27879EA8011240103D12B58D4E3735B8C33C68BDC1819FD95EBE94E61893B595CA7A31C0A3957B5B H_OutputA = 27D5FEA5F87F5714B6144FAA59FE288CB9A1AA637E7AAFB9DB6D2AE992A6451F DRBG_SeedB = 10F2300A6A9C62C85D8E767679BFA65225FDAFCB6156C3920F715198F13584AC H_OutputB = E5BBA5A8BEE67F8831879DA7B9CA21ADAD9E06684B563ABDA82D9C6387DBCA33 SharedKey = 6D8B6C97261C723AEFFFAC3EA8208B0D5B8E8E6949C116F7E0E8357286E7E7E5 DRBG_SeedA = 18E9785E8E02F7D6BD66279F2619E0F725519F15B959C4B7B208CE0968DC58ACBC8C4BC162EE9132E5C62182C7DCD5CCF2D0343F7544ECAEF1DE15A01AAEBD45 H_OutputA = 1EC5E1CD132B2FABAEE12A31AF50AB36E15E87C8874F7642E574DCF8717A14EF DRBG_SeedB = 6C3BF28F26369F258D6674F236ED298D923E145148178885EB33FDF82F238DD2 H_OutputB = 9CC4F3BFD36FE88546AA47F1E30375104E407D39B415FDE9230917B0DC301AB1 SharedKey = 38373C9153956A644995725CB3F2999238397C3E4F7B02118AF05ECECFEA6275 DRBG_SeedA = 05CC37563645401CC9D9F408C05E03228038240AE745BF6B0DB2C742CA004649DE92FA3AD4F4D51CEB1CA7D83D064F3D2F720B49AC8C4034278BA8C847CBFD18 H_OutputA = F43AEFB008F706D0BD3EBFB03EAFDD8CC3B988727D32CEAF60FAF24421DDB130 DRBG_SeedB = A313B0B4C58C162DDF2396D7FE122F573ACDF351471FB53ED150E2B2B0B763A3 H_OutputB = 2C59D9F76C624A675493C0D63D0C213E10F6B7EF3EFA282BDEF51BBB5322D923 SharedKey = 88F725E2FF9C2B45438D65A5BEBC78DD53160034FDECFA13907E3B382F85E7F5 DRBG_SeedA = 7CAC87BF8DB77912E35871981D2330664587064A446D1F80F8C2B7A5CB65554CD45983498052BE2E9381767764A839A69806BEC94B1673F3B41F262C0AA6E7BA H_OutputA = F589AECE54F7B8586A85EEC88E4E83B3E6FC7FDDE4E64E25BF24A7AF277EC0FA DRBG_SeedB = 392580BED820DD30D348875E9A42747355D3F3DC712D011104928A096DB68BD9 H_OutputB = E4BD88455FF623E1D2AD86F5D09F43ED7D47C95E93512471031A8F88990DF3D8 SharedKey = 6CBD7AC87C8896AFFDC133257FAA56C3D3644DAD0E7FE3FE312A4D4B91CB16A0 DRBG_SeedA = B5BE4CB277E276187F5B0540074ED8B0BCFAECA22A0243DB65579775F9FBAA636C915412A8EE4805A41C587B502D7E01B4B36314EE0B9CACEB64CD6D8FAA1B8C H_OutputA = 1BC25D015B9290A0C2950F5651CA5E777BA900133469275C9978431E2DC1F759 DRBG_SeedB = 80662CF4F0DD3C08C891BED64E49A61B93DF929096EB5CB5F3F8E80EE2CC9DD0 H_OutputB = BB6023DA47AB6D6744D02805EA3C7998E2DCD9A1A5AE99D5D84CBD78968F610C SharedKey = 892CF8FC4EB565A64D1BBE77FF4E73D27F670F204DB1A6139E0D7808BAF783E1 DRBG_SeedA = C8ACC5FE272616734101CC8AF0F1EB72DC4A128EAC30F67092BB988DDEF0047BD0276E607E4CFEAE17204B94DE29FA584803BB4A2A86ABBB80B2C5FA5C9859DF H_OutputA = 625ACB1BA64FBF7458E45D3B108812335FD32F9814F27BCC6C55827911D89AE5 DRBG_SeedB = 38EDC0B4AAE41EFF559BAB5108AA0B6E8D61E019C4E311F1C449E5B94FAE2B1A H_OutputB = A6882197E771807CC30684741593F1E19E96EB9A48303F1C5D3054ED530B565B SharedKey = C70DEE2E269210D124934CD26E3DD734EE38535EDAE70CD455C944F1EC71A125 DRBG_SeedA = 36965FEEA8B3B34D76578D53F3E98A41402A69786AAACE35BE064998CCA3C8F0612C8CAA57061ABF7333556FCCE12E0A50B49A46D1D123907B18D3DC13FC063C H_OutputA = 4F26C977D80131CA44A52F7EC2226968FAA4849C4B927EDC1D6AE361ED31182F DRBG_SeedB = 6B1A768668A8E0382ED925E6C605324E47940A7BF101295CFED44FCD2B0CED92 H_OutputB = A88C38615606FAE157F9A625497E5922AED29D51E330FE99B7F217D8AE6AB837 SharedKey = 0AE535EBBFDEC214F58735BB923CE3A3C63C3C15794A9709299A4CDE6945FA5D DRBG_SeedA = 3E9FA8B3C22B64A808EBF50169F703B8E6D7DDC661B6F3733E8AB294676D3FDF25DBDE7718145F3E7E75374D9F711D6E22B33BAE0C2273719E1C0DDBB5DCC437 H_OutputA = B0FE122397A85965B6B28F070632112BC44285A3C7EDD0E4526E8658ECE3E0D3 DRBG_SeedB = 1E5282CE55B1AD42C8C33B303E9BBE2AF81E40EAC6D59AE49C2AFA1CCBDA564A H_OutputB = EECD4DCA55D302E8DEDC8B1DFEE6C913AE4FF64A28F73C7A4F5C3C56441DC459 SharedKey = 0C043E2E74734EAB043B9131D218FB07D92EC78FBEEAC40C0E02D1BCFB73A1A3 DRBG_SeedA = 7A88A2B8999EE44728FB17013650F883D31974404BFE166426D0956C10C6DFFA906D4A0F7EAF7A79D413992BDCC759D30EE8ACE9939237BD306704A1E6ED457A H_OutputA = 222F889B0A2A552E84A1CB7679C31496973BDB3A1B6A28DF7648A392919BB3BF DRBG_SeedB = BBF624D6D17CA3FF0E052AA215030856A8AFEE89719DC8824970CFFCC0C9B0ED H_OutputB = 79D70AA3D964F823112A863A3DBE82A3AAB4C0F622F28161E6E182AFEA3EE826 SharedKey = 6285907A6535CFFCA588C7E92C6F7D9BDD38C22296E615BA120356E080A135B8 DRBG_SeedA = 00F500A386F8B6886DE58C547ACD33C6144C39E63C7400CA880468BF979DFB5A40385665F01DCA64EAFA0602367403570DA8B572AE774C4CB4857FABA3256C77 H_OutputA = 76A84824776348B219710BB67EE76FBD30125DDE27D200C1A514EC5A9FEB8FF5 DRBG_SeedB = CDF63C4D38CAE0F542FD6CEA7CE1C3A122F65FBDADF8D9636871D6E0D1AF1D26 H_OutputB = 4A0328EA309196E345C64B231163F7CE164C6F13180DE7F5FC60C9207F7961E4 SharedKey = EA76D9412512602286F0510F5BC6DD8325AB24513E80ADF47F2A5214A433A446 DRBG_SeedA = DCA53CC19BC246FBC2DDD0C0B294813073FDC259D579C87511296DF7A9B13C7AD07C55CD4649271E2D8FB0736F5A2301238A65BF49D3D0D78AC3225A80A8E941 H_OutputA = DB5223D3D357704C7C9814B2417298730A7F4365ABAF9FCA1F49B3F671DACC46 DRBG_SeedB = 88363F9559FB4C7DD3E67D5199595F437263D673666E4BB93B6B93F0A1A9F6A1 H_OutputB = 6DD2FB55C0CBC352C15678EACE3B7F43F4C54A99728992C71743A4CBCF6D338E SharedKey = F662028F7CF7F1B6A848A17D2F5CEA02AF5489FF4AB39767861149DECD3904FD DRBG_SeedA = 2C030C496804489E92EFDAB1ACE22FC186B3240BCB0105CC53821B6698C010FF80D22E25AEC21D104ECBA32D88FD2DE2E2F3722F38D9DF73A73B3B224D980B75 H_OutputA = 3F299EA0D08317048FACA1567415FF77E9E3623969BD2526CFF49DF229711040 DRBG_SeedB = 7D5F1C9C6C8E6025C920CCB895E62AE654438D2E6408AFA4F842DEC76F380634 H_OutputB = 69459D366B5A745DE37D9F9DEF81EC44F59CC97D785A71AF6AA0DCBF1B03E09A SharedKey = 1935A39FE2C8C944D63E13B606F7DC5879C1F3A97CEED60B5EBBABF5FE1B45D8 DRBG_SeedA = 394AB61228A70EF86744669170CBFC3FD321DAF8754280163C80AF8342A84D763F35BACED70D7D5098FD2D7EDC1DAC268A7719D42577D62D17552E584BECC245 H_OutputA = 9B2955BA22684CDFBF9B66FCF15AFF0770026E5D15C972365B957B26CCB5745D DRBG_SeedB = BB94853AC590B2BA471532132EE568A8D3817DCBD70092E6FE53E5DFE8F24573 H_OutputB = 6E9A1F5D38C550E423B7FCF9ABBB608FC4CC3FCD5E04D65D794DC265E1F0494B SharedKey = 3C14EA7E3DA9D9CD972F65366DFB794A5386F5544F05744C6D38828EF532965E DRBG_SeedA = F0A03EAD674217C4ED28915C5F9CE33CF21080F404B98BE3C844380DFC7DE89C17D5DC25FE1BA309ACB3CDBF74CFF692DC1B04AC862862F8ABEFE4586477B941 H_OutputA = 12593DEE32B5859363F582FD90ABE545CD9CD297D3A6C7E611E0C3F064345860 DRBG_SeedB = 0FF78447E79556B399017320D7B53FBD00D4BCDBFF49DF9E652F0FC017ED1421 H_OutputB = FE32498317F50F2356F8DA5850501B376236FBB1BB33989FC921B6A94A3F1695 SharedKey = 28CBACAECEE6C184DB2A61BA8C27BC3BDDB124E4A1F12FA004C6B480D4A125D7 DRBG_SeedA = BB47E214BF68F9739F5681038BFB560B8EB5D04B283F129136D30E44EF89EC87E6D7DC09FCA6F1757F2346E6186478EECA8D78690EB1FE3907E18B2ABD391588 H_OutputA = BD31AC26BC492033A9A10FFB16AA3D1F301CD90477F8E8D1F83E062E27DC8C20 DRBG_SeedB = B07BD1C6FB25747D3AC9C72941A1D780A1B0ACE421F66A6836DE0A11AEF5BC01 H_OutputB = 95253C33789FA0C6E501DFB4AC00508337D8560C0724AA288C5794635D5D43E6 SharedKey = 23B7D65FC8430509C814F2E1D71277B456C11219A8C3FB59D8ECFA6A6BF7A7A1 DRBG_SeedA = E92ED9697E1E494C31F82239ADBED45229A7766D989055AF2EF6C1B2782C752C6573DFA4B70505CD53D55F1215975D961889985298717F3D0B1C0EAC1CD4F7B3 H_OutputA = 2ED1B24E0DDD6DD2AB84C02E19BF929A3D5706CB099A4F95A832D80449B8F261 DRBG_SeedB = 177A51F41BF3C3C01A4CF4D75DED1DC3FCD7F13C886E9B7A2FB65A1C0AA12C7A H_OutputB = 7826C31C1044DF37092BA4C884A006DD6532DDD15B978DD215918A1714E82751 SharedKey = 8972DED5E0A55F5399037797F1BF027B39548734919089E0F6EACB3ABD2229EA DRBG_SeedA = 06E501D431CE7F34B2B303E9FACEB24582CBABB4D04D716D20B8F428BE078C9D906D62F952DA2581CC68B472BB22C2CB68FAAD81376F8EDD09D3411CCE294B88 H_OutputA = EBE87ACF585353451D2E701D5F8BB9A8F99EE1084F065B0D24708E3577843988 DRBG_SeedB = 93D9EDF19F9A2EC5182CDE41ADDFD731D7606E4DD6BF7B7458B98AB944B0CA77 H_OutputB = 08CBCA979D5B42D65885426AC49DA8B853625193B7B0F0AC27FF1DF86D8B34DA SharedKey = 11980D2422D2CD334961B020F6D1B025CC72056D1081905224DF391CB2821AF1 DRBG_SeedA = 60EFB290CA3C4251E1092F38DEC8C9A1AA12430BF0ED5091C4B184877EBB8095383F60F32E1D2F8440486CCD93FD7098C5ABA74AABA1EE44343259D5DBB49646 H_OutputA = B19AD952956D008B03975EAC6BB714937FBAF9791248ED914E74A275530093EF DRBG_SeedB = ED6B31EC77B938F5180D4F79DD68EC2417F81EA46F49D3D858872F71EF5F0F2D H_OutputB = 841F4D3BC25FBEDC8DC57761D98EEBBF9714BB5C28AE464841EDF0130E1869A4 SharedKey = 9B8718428BF159FB57C571C512D3FAFE30F91A7A1DF493979CD8BDBA24798C9B DRBG_SeedA = 0BF3B3C4BE4C987A8B6A326D1CA936098B0AA5640BD02CD41E306CB92A8222F7613223FB6A56016D56AE849DE8BB8A23D572E36417460DF4FE89CC49C060C046 H_OutputA = 13CDE2D78CF98564C5FEEAE0F01E8DCC33EA8E250D3C29DC15B433F112E81D16 DRBG_SeedB = DD5E118B79A64F6592E0D2EDE82248A5BCD0CBF1592FD2E122841728E4840DE9 H_OutputB = F617EBC72F62E396D7133A8CCC1E8FFFE0A1994849DB7A7BDA0403B6EBBA911B SharedKey = F1774C20A494810F941F2FCE6064DB5DBF09BBC03DB58339347480157AC3AC01 DRBG_SeedA = 9048B8E8AE71C37FBBCA27528A994E352010E1FFBB6F1B366ECDF6B952D6D834A366EC07BF49F3885A83F915D377BDF01E1A955F1A7A183AC1145D2A7173C826 H_OutputA = 2FD465B37E2C068479C3BC7DE52C6D0EF05AF18F07B1E166C449957392738A47 DRBG_SeedB = FEE6DCB717DAE2EE30D69AC7F0BCB47B4A9734148C75039E6A806118FDD0E532 H_OutputB = 503037306F6E4CB5BFFF093DA9B18C2B5A618F129AB21214EE843D4453CAA211 SharedKey = EF2AD9A800555B3FB2C0F01313FF0B5497CEA673B9259E4EA73A873E60532634 DRBG_SeedA = 22ECBDEC338D9E5EC300C221142D6B23B0B3ACD46E533AF3227E243E25D4B871AD705B6148ACA9BE474ED35011DD0436281F90D255D12F563786E69922D38BEE H_OutputA = 11AD9D610BA252AE71D9A9386C9AE68B2AF06DE16359A1C500FAC80A7CB8B2DC DRBG_SeedB = 78124A96D8443B643163300EA840F8ABE1ED40E0CF19853D74D8E8404B014DC5 H_OutputB = CE831CE3E593EFCAAD0E99242E975712667287AC418C919BCF80529DD653833E SharedKey = 11DCD99A526196ABD9DDE88A6FCB44997FFF2FED645868C9B91AA5644672DE0E DRBG_SeedA = F1687CC2F072BA2BE271E3E10A57AD6761F41A9F77474F36D9710722D281277A17FD73D98728F747F4FF5FACBF15AE89E9D210A8F97ED2A76B591A2054ACD0C5 H_OutputA = 70D5E7D3EAFA5956025B31280610D1C66CD7336DC29B0B0797F2246CBCC35BC9 DRBG_SeedB = 6EF20CE9E47BB8435273C9BE5D376CE276461018C9B6E3F5E1BC4E20F3E84666 H_OutputB = 56D52D3D22330DFA9BBF3B85926246ED66A84875607333084116FD8F1E3CD772 SharedKey = F83115185CE9DE2A4BD6020DCC5A2ED5281794E2F15D50A236309B0A1A29636B DRBG_SeedA = F7380E7F1314C549B173ABFC30B47168E1549B392500E2838EFF4F69602E9CD16096B999852E19D9770D9112A2CD4EDA9370E85E7C25BD56B44FB0231465F71B H_OutputA = A8968BFF61C7497C1D231B788AC9D7C2F0B8D3C26B3EBD80E75EC26F30A63992 DRBG_SeedB = 786AF4BFF2F17771C0412D79CA40EC043C54F70103B2030C80704E1DC0A5A9B4 H_OutputB = 3124E214A46A1F228E15A1ACCD2768F3D9F6AE88835CD1F7E5DDEBB14A0C669E SharedKey = 7FE98AD4B27C92291717DB6C2DD5C92C2A11AC9E2E9CDF07FA4169E582B86B5E DRBG_SeedA = 9DC7D8C1441737A3A0EB3E9DFCFFBD7B7D0BD21C28D6BC7110BF80BAF2FABAD38A469FE16A414F694C3F300D0559A08BA7088362C064D38D2E49D4343E017F0F H_OutputA = 0795F5A160251CEBB3D5439101759DF167E3B0C60BB89D4C866E25072EE8EA71 DRBG_SeedB = 66CB1762F3E2FC4EAC26A7085208F461A48E5CC937B26E09A2AF1F579417C021 H_OutputB = 82DE176FD462776F91B3C3E65E89A538E16B807576DD3921AEDA105AACDCD187 SharedKey = DE11247582125150CA19EFFB450EDF730E587E68CDF8751015650783E1E28415 DRBG_SeedA = 06F6EF29CFBB196944EAC5FA594845050B7CC728F495A1D5948568A05587D12ADD54D4196AB65FB74829CADFBEDB429A964FD51A3119C4F09DBE729856999CB2 H_OutputA = F0235FD624AB74528BB9E07DF8F01969F9378870F77C273971F93EB13CD801AB DRBG_SeedB = C41153395D14C5FFD559C433792870805DA8ADBC5868FED3BC21ABC53AC5B37C H_OutputB = 3BEBF96402248CE51272836BE0CAEA9E32F8B470E1E13ABF858B2FE9BB6087ED SharedKey = 6B1513C772D560BD1625F9C0B2FA7ADFCC3C1A6EFA7A72B3EAA4D51F19164BEA DRBG_SeedA = 10C777D8504FA6B2C24FFD7179CAC0A40E799F9C4E8BE63E80003E8C03531E3BB55798A11C3DF5BD5D1E4F7886CE0C740212D395483487AE97A6D9245BAFBDB3 H_OutputA = 4B3853826161A2CAF87F8FC6751B7D90FE47F6FAAB65B767B2F952420F004B58 DRBG_SeedB = 02D6803B54CB9C2735250BC5DBC7E62224BF3C9A215F96DB823CCE11DD92A266 H_OutputB = E69EF4D1A787A9B41F5715EDDF5989F9BEE9FFF5C40822E2D898571B9CB25EB5 SharedKey = 939EF43869DDF8920B781FFE5EF139DCA03CCBFD54250F26E24E05B768A5B111 DRBG_SeedA = 4FA41B7011E4E0AB7498B5A29E21E7A9BB35583BA478E38886EB5DC6796915AB0CD956FD4C5992F77EEFE9042FF7DB6B57C7E81279FA70093FC851AD6E675715 H_OutputA = 21FE88B37A32B2CF60E78420331DD9BE1CBDC250869298859ED24F4783082442 DRBG_SeedB = 45FCD607F00BB02E87CBFC8B9B4474483CF0A3007B7EF59B0D968F9BEF455000 H_OutputB = 4A2F7E33A7FCF6558D7C8FA13D0F494A3F59EEA684BE48D3B24AB44E838D2368 SharedKey = DCB8D0A17291BBBA73A7B0A0F4681224A3AA2F61D795E8D338ECA5200E73DD42 DRBG_SeedA = 9BFA416EEF85F26E636380968C235024FA4AF88352806EB6B3A72C09B6EC00BA936A054DD3B7AA2E37606A6BB40DB21525AEFBDA20DD6EC9F982F51E2DCE0387 H_OutputA = F0983DDC2A10660B0AC01EE0A07AEC21DFEC8947EAC8CC9335B66CB7363339E3 DRBG_SeedB = DF4B5300D2B8A317F8EE10CC76FD4EC128BC914B59C9AF2EB52F6ED0AD1099A7 H_OutputB = 1D048AC0BB22394F6234C2F28789D8C9057903DB49A0334B6E6270FADBF1FBF5 SharedKey = 17CE645471274CD38A31B953B8DF608F68174ED4CAAD8DC4B20F07DF47AC108C DRBG_SeedA = 919FF45694F94F4695F3D86E74122D9A3F9E0400C5381EA9E8F1E093F41756317B7E4CCA4B36E33ACF4FE8C511C581256393850C6AED7C355DD9754F4EA6FE49 H_OutputA = 641B234E7A734F3B27050D1CC327808168BF85050DB75FA06CFF42FC7E1A0F1D DRBG_SeedB = B6980952D07552FCDE47F708816193E791ACD9E2B172014B8C84F3FCEB52325F H_OutputB = B6349A68DFEB2EAC9472088298BD365930210B808AE94FD9ACC06C148C31530E SharedKey = 67E16739A1205AF0BB82571568503E1DE7609A48A143C85AE92E36328C12F8C0 DRBG_SeedA = 269BAE1068029E1F0A0742F3890CE78E62E96BBD7E2EF5FD21B5E7AE38F504E430A78AEEBE45C2C73C02716F8E86FDFC18683DF0F239C79E1D6354A45CFE197B H_OutputA = B8AAC2516E2FC3E8B5CCAA2810BD7F4C8198C71D7BD7C21C4ED8B29121422E9A DRBG_SeedB = 821C15A35AF09BA7896CA776D25C0486AC25498608658C5D567B10713955CE7C H_OutputB = 8D4C591AF5B65F5D824955A108F52DD4327D9B7E30D74F782C8CC4B31839EF51 SharedKey = 72CEB1BEA0E15CA29C260987647FC8AEA1EEE0633A60A478BB3D3C5D126BC317 DRBG_SeedA = 4A243A0E9E1F93EDFB856628DB25C11B5693553D5ECB2A18EF548DB064A4D9DA25B6198976D265B2870F56E9AE3DDD9FF4E5ECEB89DA0053347C023AF307DC9A H_OutputA = AE23E78D69E52ECEE0AF58706C391B09BBF3AB600E2E43C6AD0C28B8E8767E26 DRBG_SeedB = 828BCB5DB6E33A7250D957FF5BA30010838A273B23B4C9E73249E2DE1CF66814 H_OutputB = ADF6797135DA975EF786BD203277AFA2AF2158947CF923F3ECA5D34C9BE3EAE6 SharedKey = 58C1F862B7DFEFB4BD0775091B1A2A547CC5310213E693B6D0C6E297107FB93B DRBG_SeedA = 7404BE01A8C2C98800E41D4AF14B76AA5FB1518379B3472F8A981A3026ACD9247331415D6B64DEAE8C08F0975C217D70ABF7DAFAE2D706B7B3B59D56A6557AC9 H_OutputA = EDEF1BF01C4D03981F697B51F46F88268D25E5CDCC523E774B51B9159F9F84F4 DRBG_SeedB = 7E5884116F61983CE6A33D9F3ACE6529619E2FCC30EE24C6552F54B68BABE5A3 H_OutputB = 10B1A471EE1041F46C2FDA002F9F4A3AB27853B135CE8A46A9FDDE5618A15F6D SharedKey = 2C289887D8DBFD89AFBAB3B46E63537F38BDAD53E02B34005C499843CB99E5D6 DRBG_SeedA = 5369A0458B8A145AAB098A008B58AD5E1DB6FBADE9AE7AA8EC8BE0111DAE259173F6AA03BC4878002458905ABAC974640DB8AA5E8C6EB19D387C35CA7A01D9F8 H_OutputA = E5CF04069F5ADE73F6E87AB16D32F110C55DE820826A1BE6EB60A1CFE13F952F DRBG_SeedB = 87DF21B96891F0C1DB2340D6E310F06D78A946E767372E31AFEC6C53829A7594 H_OutputB = BB78DAF2C3B2201724EBA8A344B880F56F2D9FFC83FAE3F311BAAC33CBCB9FB2 SharedKey = FC1F97B7AE8B989599BEB74737F69E31994E9638DBD1D4824C076C23F79E84D7 DRBG_SeedA = 19B8F637086F97ED0358485FF9BD30BA75305A463B0F9B6070086641829633C88485CB2458E9CE12734C09ECAE86E53BACA04CBA2D3EF2C7DE288605C4951D3A H_OutputA = 11F97D8E4536DE0CF3843E036BB1DE931D35DA71922B404A184B690AF1646FD5 DRBG_SeedB = C6F5F7E5CCC814CDBD0E98ECA1992FF15B6D0B9D2FFFAABB271F7B45B3A24F7C H_OutputB = 57CC3BB4349D79D42487BC31FC8DD3BD2C5FE039A2E388AC677D96529BDBD679 SharedKey = 3CFBE684778E4EE1D1809AF9E8A347B2E6E8904AB5336B80F8843BF296E4B553 DRBG_SeedA = E6C1B374D16915DCFFA19E6730A52CA2BD18521C0755644DD38EA823FA8368A5548B1BD338A2A1EDF2424798381AC255C2C57345748000F0B18E4F0A498D1059 H_OutputA = 901DEFD7DD497B148D0F497CF69127A823DB5D592222620E9177DCBCB4E0BE5B DRBG_SeedB = 635513189FFBF07DB2AA5B39C47DBE058D0981AE2FA52B8C372181F3EAA64D72 H_OutputB = E8F5E75EA11F3624DBF1A5C5D92FE6BD1ED057ACCFB9DF9D5CF75263C9D525C8 SharedKey = A55DB5C866A0D41909198AB2DBF3A268F6971F1176419A7CBBA8A55900BFB0F0 DRBG_SeedA = 3E5107C3C5F996D33382450915614C4232C6156FCED6E7E007438A2DEE4D34E83E3C27E9E501D8500649A29769C50BF511E7FEF252AEA9DC88DBC7BADDDD3760 H_OutputA = C82CEE685BE86B632B4AEAD4ED1EE774EFDDE52F80FA373B94E47CC2A4A82C90 DRBG_SeedB = 2178E223DEEB0F558F7EC82DFA13A2C5A51D254FF4F92B3A4F3B4DB84143C166 H_OutputB = 748FA8C924EFF94644BDD01B6211E37135D744CF013ED0AFEBB0686C008E6295 SharedKey = 5B84FCA3C5A79B251733CEFF76FBF8CBA8B299FDCF65F2E8C6DD248C5B025410 DRBG_SeedA = EDE68569B474D66A513B73AAE0340559E63F570FED5285D0FB081CB9F03905AA15AB430C9A1973E4212D4B04D74A9104323D0CF0471DA6F3E90A7695126FC116 H_OutputA = F35DE4C189F2FFA60004F31BCC1A1107BAD6739E6F4E5596F1D0D59424C4C9AF DRBG_SeedB = 43D48E05CA1218FF20EA0CCE232F2AB4FAED0398577DA4F54F34B917EA24AC2B H_OutputB = 9990692EEE78B16E1BDE2D53B5BF0230EF9C758D786AC2F0BD627F3B5697E6FE SharedKey = D16AE41D79B726449E016B6B0085AFC691AC9FCA372D188C461815C40D55BE1C DRBG_SeedA = 8EE3549AFFA345FD87E28A8EEE1C82125DAD5FD5B73FED7D9ED40815771FCA86C21F654A6E02995BB9B42B351565EBAC9A830DD76FB15D4649B45ECEF657CA29 H_OutputA = 3AF42CD1A618449484F2D5A6BABF592D51A70FAB2B385BA59436350C43D963C5 DRBG_SeedB = 65F5A2EB7DDF9E4E3F4BA4A505A20FFB6B994D3939CC42A0AE4F415FD1DD329E H_OutputB = 36B928051BB855205227F549047DD1B06799582D7805708108916A07FC0FCD1E SharedKey = E3B4BC8527436F898656B4A91E79EDABD4C465FBE71A675EE4AC69E4768710A0 DRBG_SeedA = 55E8F4705FC2576C74A362268B23137177AB8818DE133E90CBE3BDC1C5A5A23EE184F482E602E75240BCF21B84BDF42D4FB6368986D374186707EDE2FDBE9015 H_OutputA = 03F561F409303C8FA3EA0CDAD2B57ECED7FF4934B52B41C9DBFA338ACA233310 DRBG_SeedB = D70BB7DEF6FBD5ED19693D4269879179753968980784B50147B85574A4980E7E H_OutputB = 30D0EC5C13223AFE5904905BF5EC5A83F873A2B03E426CD0C4F0226B0D13E881 SharedKey = BBDCCD4B725EA4138FC6059D67C42127C75906D97CCC1DD4615C490F8B9BBBE0 DRBG_SeedA = D3C7E881B66F467D8EE510F369236913A3C0BBDAD68BDDA364FC8313D9741E2CF289B162157B9CBF5826A4C9C95BB0B83A263001B83AB448E1BDEFDF1E09BA7D H_OutputA = DD35E75EDE252F46E572C0A24BD32C9DAD15EDDB1D115C4327302BACB4A71B56 DRBG_SeedB = 2B8E2DA064A82BC74A95E79E53D530940337BBDC59E6D0F5839A94B09F29D8D7 H_OutputB = B7710E49E3EDD70FA8B756E3CA0D1071FFDFF11044D4F508CDA920382F505C8D SharedKey = E059B959671D07CD1B59E642898E7A61D6A49C1C6598860E793B7CFE5EF0BA98 DRBG_SeedA = F0C778FD8AFF3EFFD38F26B5D08A6E79F9E3C55E9FDC2E31C4F97C6FEB2ED8375FA9CF6446107D25D00C76602A22547C1A61D66F4901F8C3ACAAACF4DBE462A7 H_OutputA = 56B081DB3B1D667BEBE80620C86D87CCDFB788A3765896A2B66BCFCFADA66BFC DRBG_SeedB = E61C5112C732CF6A1A1D963F4CC5F90A7815AFF3E113033117107553998F59A6 H_OutputB = 35F68A562328D27670082A6F2733BF01FF748D7B8A0CFACFC6B99CA7ADBA96E4 SharedKey = BCBBACB7553B70313270C923E12E96F1B0866C44A73EC94C63DBEE20F10400CD DRBG_SeedA = 26CDE9B02C33A0D563D37EF243056B1306AE90588E9ABEF48718C070E5F2D25F993EE1DF8F59BDB0D507A46CEA1D9C621D514C93D1C694A7347FEEF4FCD93F69 H_OutputA = BD9B9A4A846CD1C9778309F841B39122E6EE6E4EB48B04963C4181968096C508 DRBG_SeedB = F27422BFB389BD41F7F06C9590598BCE01A49E6019F7B776B45D90C4E1EC1199 H_OutputB = 285A89FBDDFD2E736010E9F705717C551E08B09090C8676F2C4D00161B677253 SharedKey = B33B67FCB754EFC48BBF36E8EDC6DAEBF9D7078ACA96E25AA8C65868BEDD6F0D DRBG_SeedA = CE4D07CD5E5F5013A424B4ECB1C3A45C63FA433F7F1A9EF996636CC50B80BBB06AF91B79313B8A838C919388FC4B57D850C9DC24AEB463EF7DFBDFBD46E366E1 H_OutputA = 1C2F4C4B9965A646815D21632F71E5181EB4F42E93A19786A33BDC74EC0D7A09 DRBG_SeedB = 96FC453FB61C699A92F312F4C229A55F1B1EDD779B6AC6752A5E24A6A2AA4ACE H_OutputB = 2E7CC99CCCF85B88541DC8D2115895BDB37E5B25B576353622EC08AAFA326DBA SharedKey = DE539622BD131B172AA7FF72E84BFC2765667C9AB9B14B95EAACACE3DE3B7203 DRBG_SeedA = 5C98E72F4BDC62F67BC9166546C477CD8D670D64B9BF18CE5316274A0BC88F9D081D099CF0619100792778A42A6E526D5B52BA97AA58DD25804C13271C94AE2D H_OutputA = 3CFE5706FA71B6CF856F25782A4F3757E8A62E4BFA50D27FF7B33E7ABD6C655F DRBG_SeedB = 98ABE56B160E66EB22866F523A5367A8C9CFB1C41D93569626D168A2E17D4022 H_OutputB = 8C241A497317E5D3F00543294472B8EFAEEDF675ED1C53ADF75CADD43B1CD80B SharedKey = 02D9BEAD4B2EC8B9465E6FB0C1C6E405A5AF2F0A6B7AD9A0350C9CE3BFBCEB5B DRBG_SeedA = 4D91681A8AA958DC240269CCAFFB4C915456F85374217833D169265011DAB58EEE6FF742ED5E07C547901684A3F314A5C649EA4F8AC0FF94E905EF2459FAC33B H_OutputA = 5ABA41DF818D7CA8C5A73ACD69593720BE2FEA25827BB48A7AFA8ECDE86307A3 DRBG_SeedB = E3AEA8F5EF7634D3611CFB73AE7410953C172787C74F99699DB9E78400D73066 H_OutputB = 8A248488C6A4469CC2486D9F1895291CBF50291167FA76A19805798FEF8FF1C2 SharedKey = 7F6765DD43BF86B976494D8F91569D1C3BE252542E7F1823B4E89790CE3A94C2 DRBG_SeedA = 8A48BF90B53B7E71C1B6B8E09EA2058F938D21161FD902BEBFD262F5B0559A6E640B3ACF559EFBD4AF1F0A6A13F74065BD9C4333A8763D5B492D28311E028891 H_OutputA = 516311C2D5CEAAC19D1806C3E3F177B33647E85B61D68B16A6583125399295B6 DRBG_SeedB = 93464EFE9C6898A6A044BB976FC2BA83447D3E445623F9712EB684CA36701FDA H_OutputB = 05C4445B7F7DA681758B20CAC7FB371125AADF28A9B9D10093E200387B6F9F45 SharedKey = CAE848F39FD4058F2FF71ED86E5F464420E61C0CD59F0FE7C965F427F289DC76 DRBG_SeedA = 7C73B49ED2F62F923A8FBEEDB896C857366D71909BF52490292BF2F00FA1051DB028483E34ED85E7F429EA9DB1227EFF3F4A027845552D9953E32648FB5DE3EF H_OutputA = 75724AE94CE56D3D49F6F54405E98FA5735069C687B8D3D8E238084C9DB7FD28 DRBG_SeedB = 8D338BE09B4090AB3D1F1D2633379A5F4C200F5E186CE89FA4D4CCA468E222A0 H_OutputB = 374F60AE799F701965F70EB1AC0906C36FC7FEF0F966E1F06AC919CA3C60A222 SharedKey = 756FC3AAAEDDED2F8222EB9B903B6866E67A09AF9AE949AA03339C4FE8F1557F DRBG_SeedA = 32E2749DBED271F144E809205040D407442FF4B23E333428A7CF4C688DEE7A9A834D80C62DA6F4937341E34BF990AE8B943AB230C9D8FEFDE4645759253D91E2 H_OutputA = FB38C72F2AD89E0A2D17314CCA6AFD67CB0E6527F2B3BDF4907B05092D7FAE9A DRBG_SeedB = C1ECBE823B1334F56CE159CB97D46304A016FDD35C34771E503D4C720EE102CB H_OutputB = 128E2A40ADCD628171C3161018E17A2422BCC81051601C4FFA83356CCA06201F SharedKey = 68E2C868045A065138B4F6209B2963BBE49D4200DE1C6EAF09BE5F4C3DC3C9A6 DRBG_SeedA = 06A927E9571F08FCF14ECF887F26168491E819C6ABFC7967A14DB46282D82040DF389AEE04759363E2F77657C44FA731A3DBE882CC470BA3E84E344B00B669C2 H_OutputA = 5206849E6E7892352DB3B5A17F071C3C08CEE86299DD658719D78F9D747524CC DRBG_SeedB = 64AF04D2A522D26B97B130BCC0F0A32854C9B1CBDE06D2235C5E6A4EB7DF1536 H_OutputB = 373E444EE0CFAA41B735FB99F9D0B45D3B31726B28C5A2B2C71E04954262821B SharedKey = CE03374F41761E070A96C3CB80CF7B95E2B48DE4B6014ED45931D18D35E9496E DRBG_SeedA = 5AAD7CE3A68D8DA2E5AA6BFE715E0E0E971A85663C432626A4C2BDC56731626599CA95170D2A75EE48A66775932974DB8ECF3462B8F3ED799508E916420D8114 H_OutputA = 9D80D8F9D3082A79F5EAF8E350784B1BE8E3C4D53A64DF619AA991D4974FD550 DRBG_SeedB = 8C5B6DAD8E85E4197A777D8820DD06136B04BE89AF6970F6F1BA62A8F5E31140 H_OutputB = D32D22865627F84565F0400F65CB17353D5EED16AE09C0500EAC155CEAA44F1D SharedKey = DEAEDA83EC832A58DA0D302ADE2C7DA5755FBC521D021C3D606E7FBE573F342D DRBG_SeedA = DA15FC3617D0DF580A5881DEA853948CCA27A8A9F5EABEF3A640B0D0072855EB813394F9C6496A3E66808A74AF6C6485347F0A9291A915AFD9521360B4A35D92 H_OutputA = 055DB3A727C9B589AAE0BD5E33A6598FE82DC5F804AD264987A272145B6B27B4 DRBG_SeedB = F761713EA75D3C222B745EC3800A70BBBCB0D65B8E31E43BA9AFEBEA6BB5A7B6 H_OutputB = AC4BE554285043E6C04D4E8C024C6D94514CB08B29BEF759D67B16682F5E44BC SharedKey = 2B61A0B23B404D39FAB2A156D998BAC703723FD59817BFF9E18ED852DB4DF0C1 DRBG_SeedA = 70BEC461E6B7DB619BDDE6434B90F34A812DE4F691AA5B8D9857C198DEF89B9778F20A23A218F9F6D7635759A9C335C6CC9D97EAF5245E9E7CF822BC30096C7D H_OutputA = 2B86086A7CDDA79F93CC5B418EE3C56487CB9BE9CADACB5EA97DCF2715AC25A5 DRBG_SeedB = 04728EC93B48C8B4B0BFE4204CE5EC5E8C8E2B4450050E90196C34400FA2E909 H_OutputB = 9C86C6FC1AE3EE8A22D45FFEBBA5F736132E16A8751CF42D0D3DE700BC43E76B SharedKey = 53F17AE3B890607145147328DB2F30F2393802F319CD2B6B15D1C051E1423E5F DRBG_SeedA = 7135994A4EB4F65174A171B1C4ABB0AF52B33171F533379F9E682EF9784CE38E6860C79BED2D69E26B9E8D516305F3A63E20E9147EEE664D037253933872827D H_OutputA = EFEFFE5E439831D6D359B965D1791E78B2405CE044FDEF787EC8F16DCAE294BD DRBG_SeedB = FC2F813AD4E5A8A1534563275CEECCB5958F31A370FB00F72A7EB5C12FEAF65C H_OutputB = D878DF3E2F8C3900D30BAE66D110206D1FF9B3291D28FB96ECF22712E387092E SharedKey = DC4360AADF092424DA81C5B5C186F0E42F70D95CDE3B0946E860DBAB385BE037 DRBG_SeedA = 161C7B850042FBC20634F5CC098CD8CC2A985AC4BBF3D7DEC8585324AC8EC347421A9AE92004FB81EAFB6EFBA603E7D0C254F7C6D0E9608CE0C16468B6D13EED H_OutputA = D5DFE9A5D11B60351FD475CAF83202E5AD51514B053AF961F7CB6DCF95F5EF22 DRBG_SeedB = 5AD4D1CB7858415EED815F9AD841FE5DDA85C76BAC7ED2D5D75438986626FF53 H_OutputB = 2F2C5D1574C1E5909998A7E18BAC6192A5A1CF48FC7E10EBA3F77F091FFBD4FC SharedKey = 6671DA071990B3870384E30ABBF43458C8E9AD687C08EE88B1FAA463F357162D DRBG_SeedA = F4F85041CACA38155B193B40C0D1D7E3D65D2187F6201F556D2A1D3AEBE5E4A94AC5A69C3A3CA71DAA38C36B946F0904FFA2DA415A05736D124044D9A9C570B7 H_OutputA = 3DE17FE9D74C81381B646FB0D33397CAA99F481FE8951AC4346F8A8F9C65A332 DRBG_SeedB = 0258C7D1797381CCF592DB7FCEDE0773ADCFAC77ADBE1DC521647AFD86B427BC H_OutputB = AF01C707D78876319F52AFEBE7A7FDA8842BB4CDBD6ABE16A7F9654B98C63AEC SharedKey = E97FF83C6EC8E00CB3900CE870D3C22313709B6DB3E06D8350BDA678CE9246A0 DRBG_SeedA = 528E456E002E71FF48C4FF5063AD02708FE1E848CF1255EC9DB41495B8B98182CAF765A962B0B9E491789679A0D07A32E696D1BFBD5240D40F94331D33D3B354 H_OutputA = 355373DBCAAB36F3048DB7654A20CB466CCFEEDEF6AC26D834FF56535AE71822 DRBG_SeedB = CC63C66C14D663882211A0CA52484DA2EC51C98468F97F71BD4B7108DEB034EE H_OutputB = 8F89427B7508C2B31752CB9296C3F36B41B799368EC281B7014F27601D745566 SharedKey = EF6A4F0B8E0875765B8C03D105E97DEDF1AA980261054E5F29457A4F32F9A7CF DRBG_SeedA = 3F96440394EE8EA7ED20D6BBA2750559BA00D71BD62363DD5FE8223710C36597C16AB7A2C92C3CEEAE0E1ED2902C6AB07DE64D54F703698017660CEF9CC7E7A3 H_OutputA = A3DA301266292BA7ABA8CF54397D5C592C981191CB26B3D86A41FDC33A123C22 DRBG_SeedB = 7DBBDC601C202270AE3762DB99BA7B7062E025329CC8F1BFCE78CA6ECFCA299A H_OutputB = 43993C49173E5797C667A6D3282CACA762C41003342A08AF508846ADC8A10DAB SharedKey = 989A7293FB3F8C8F5030E4425BFFE1118D7CB949D5D2B2599A8B778CFF65BB45 DRBG_SeedA = 58927FA95E638D7E6715168F066A7DCF7D1F190448F7F95629E0595E1B7657272E645BD3AB9058832FAC7F048C1691F3D12593DBC78F51FEE5F394D37493E78D H_OutputA = 7124093D5A95A7CD3F87B37D3E973B3C20807378C352FFCCEF20E151F4CC188A DRBG_SeedB = 9D2DFD30074D028D3143B26E738465124EE6167E5B8747E376EEDA6B3C2E501B H_OutputB = 71B7B2CD744F8347C13B33091E073AB9BE010BC7319D0543307042AD282AA924 SharedKey = 898EF9E0B29D1F80F78AC809D7935DA5D3196D278DCFCAD71E5ECE51268B7664 DRBG_SeedA = 414E0661BCE82462AEF8AE211704FC0F0D54C75741A15571799052EF5F3FA84956421113E2239DBBA431E6DA5DB7BC40F7DA8DE8C8C9DA41F0BFFB1F2C79613A H_OutputA = 72D03A100361BF9DBAABD227BB4C75F0D12E7EC29FFC912C3E61658047673D13 DRBG_SeedB = 2C1BF1515D19D719E48F4D776C5F8192AA014873F0CDF7F4125A2AD62AF7ABBF H_OutputB = 3CD00E797DDFC856F1E11288EE2C6ADFBDE1905C1D6477C3D89C919C51CAE3F4 SharedKey = B9DA1DFFBDAE4DBCE8BD9B780ED1CF4B91065324D2454E3D73D86D05B00A4BD7 DRBG_SeedA = 9468207CC7655C9937C92638D7985196C30A0721FF686E2D26ACFC463F85BD8EC7E809F7DBEFA26C728075C089A12F88D932FC0DBA62357EC682A1B05133A54A H_OutputA = 99BACE61913B06F8C38580E55358DE18D5E438FE4C72F87C8D2E026326820DE6 DRBG_SeedB = 66D86A761D848D7BC564045788AAE5BA8C8B70EFB97DA2A69EDF522D1DC932BF H_OutputB = 8C7628307772C2528E89D15EABEEA8E2D7B03A1E3308DB4174B04D2E3C893659 SharedKey = 685D0A642230024A12D19ACC1506A656C245676FA8B7F1F06D99A901B1C8FAAD DRBG_SeedA = 4C78914CC4E928E4F146BB713F444DDB49F24747798A7776B8863D767B291754171626879598B805C463AE50697922DD82EC7E71D8E58822DFDB0ABBD48389C5 H_OutputA = 94F207BE3D52D6120C673980027D894914301837B09753A66FE668CC7ABCDE7D DRBG_SeedB = ED3DCB87624D9C3937BD871F47BBB97957F89CC945D4EDE3B40898D76F5DF3AC H_OutputB = C4EF171DE7D16C27DBB24B173E28E0762B95C39FD05629D639FDC2970296555B SharedKey = 274F7427DCD5DCABC7ADF7A0D538B70EF3DD8F617E3AD9F733B930199AB3FBD8 DRBG_SeedA = B6B2D55A243BDC05C03AE488EEBE6FF720F6D77F2AA1BB4A18754441CAC5178392DFF2EC34011D7BF010B283D6B2B940D1B764D8CA7E650AEBC04A52C706A7F7 H_OutputA = 87C5DF28C01538383EEE0E29489139B0A054922F32295F03FC769CB5E6141F04 DRBG_SeedB = F978C09DFDAEBC9F8C68A316EACA236B843BEE7B99F58F94B2D77FF653CD5766 H_OutputB = F6844D6A87489B3D2A6D576F7948D0544AFB1C5AF2642774B3B6ABD6A6753645 SharedKey = BCA413C9A99416104FAA5E1A0CE1D2B32074CE3BCA33704067AB9A1BD0CD502E DRBG_SeedA = 4FE4D4D58573D86FB81A444A3634A6469F6A2B268E67DF27DD97B072D025DE723EC3C073ECBE4A9A0DE8F8C9F76F0EAC8A6AC25DDE832AA6B143E76231B306A1 H_OutputA = 5AAB1B69815E88BBF6B72454D2880FD0AF1966A04BBB8274F3152827EE920D9D DRBG_SeedB = 5D61774CE6062DBD2359FD40926A0A6E40BF9DF7EBAD2154CAFF5929EC3A0752 H_OutputB = B4BAD884B115EAD5E15A6A3B7E4771482D6239840258CE731692E9CD812A60F3 SharedKey = F363853113DBCF11DD97D4FF153E408137B05C74AE2CD1A02E74944597335FCF DRBG_SeedA = 48EDF1B4710E7C395BE299AC94FEA0A25DE4A53F932E58C275962A087606DBE1C3BB58C28773F42F8C9711252D90A4D297039987B6F7723EE75BA754EB7B4C31 H_OutputA = 70D7D6885E8978F7D1985AE4851F32F05C015DED87DCBC7F185ADDD73C04B3BA DRBG_SeedB = 239E8285E0C8F1B256CF86BB884E44AADFC48C4294146594DF81E372F80EA3C2 H_OutputB = 9B172058A1D142138DF716EC8639DC9A316CB1634E6D58682C4ADBBE91FF61B0 SharedKey = 7BCB271F85CE53F614C6A4A47EA00C6DE31D59A1E29199AE5CA6E77D1F5E726B DRBG_SeedA = 5BAE28F2BBEF5679112D52F6DA1EF1E9C82C9E56AD228994C92BD0A12F6287755123F44FE1F56DFA3F628A69C42DDE3657D35FE15A0FC00A5B952990A01F267C H_OutputA = 13A4E67D59801A8D970377BD0845078B1EE4E1B3F2577D60E02072AFCBC8F5F9 DRBG_SeedB = 593CDA96275D0105DD3C7CDC21AAB58DA4413FE9234424ACA3E461C0C0EE0E45 H_OutputB = C14DEB777492AB9EF70E022E95CC1091059D2CC260295C6976011B1E9572F3CF SharedKey = 022E33A793B130DB04E9FC9D12EF4D050C33139BFE2BD315194E308528FD75DB DRBG_SeedA = 316484A45673C20F8F88D729684FFC7B881A74B673C966766571E70815CD793299F4768A96576144D01E5CDF0A55E1513F505AD76D37A3370F4B9F113C5D0C9B H_OutputA = 258A5A30B0912648F9A5C3D4D40AF4B3D9154377C3BE19E22655B42C74906E2A DRBG_SeedB = 0DA885A61580BB9A518AB95A9C33B57BC518386A1040FB45DE5B5BA143B700B2 H_OutputB = 11AA7D094AA47ABDEDD52B291DD1070911A68262227643CC68E79E41C3CD3608 SharedKey = C0617357264E35083EE05489FB67EAAA80FC26F8DD4BC42CA74823A9A6DE033D DRBG_SeedA = D5177FBB57744C77B0EB4670A351122C3175F5AA6899638559F69F06BD23CB01FF5C76140330CC9DE808EB382F8AAF699C9A5AFE63BC255381A1029B0D0C944F H_OutputA = 6AA5AF99CA274DB72E9799A19EDD9DEBFB6EBE64EFE65F75672AC325C3DA2335 DRBG_SeedB = 43D0C291BFF715089664C4FBB4A149760590ED95B650A649AA01A8ACD3654A7F H_OutputB = 32FA03218FC05824A04B33F7465D06133877D985B8527961231DDF2CC9F3079A SharedKey = 3BB16E53A6491046759B30E8111DBFACF0C241674FB968D16677870C04D57B50 DRBG_SeedA = BB0B281F7DE478ADE10E5F5E824658E180882F4CB2FD8AB6F60112BFBB0DAD4014D227D8A384D8B535154EE04C5567239988EE6ED56B8DDF7D199CE8AA449210 H_OutputA = E0935B64BD903F4CBAC4B8EB3475DD3F1A773A1A8736F8AD333F6F0C7EE84CAF DRBG_SeedB = 4876B9F943D3607997D629000EEA0FB995BE0A85E2FCCD8F5BC06254B3DE75A7 H_OutputB = F6721AB75F1D3B9729F8124C28902F3F5D965D0FA87CE1332046052E10BF16D9 SharedKey = 48FB867437076ABE43704C6BC27C388F61D51952B7ED8A497C1BD25B196A870F DRBG_SeedA = 23C3CAC043EE62C5411B0B3A8FE3ED862D46E41BC5B9FD8D7838BAE68D8701FC1B1C36F788B05B1CA1B97062BB30185D21989DAC46FB7CB9BBAA234401C02288 H_OutputA = 38EB4848C1EE6263A76EA7272884904BE6CF4B314623DB894BA942E2B8335724 DRBG_SeedB = D6D9DD3547198C9B39A2557B63809DA8BFD127A116290CB8EE6E62BDA58D81A1 H_OutputB = C71BA02F9F9C9DD4110AE64B9DC8B2FC632574ABD05D0DE639445EB6DF5CF713 SharedKey = B6ABCC50024BB7B34B8C6551B05A5245E0E86C5E1A97FB0536427EA8BB548119 DRBG_SeedA = 4C4F38A565FA359A1B94984CB761489C41C572704F97A9AAABD45678ADC6DEF4758CF50CDDCD1AC5ACB80B60B74BD0201378202EBF4412C10DFD12514885163F H_OutputA = 51F228013AF21ED326A1422472A1FCFC46CC68690001AE93FEE3D4DE721705F8 DRBG_SeedB = 43D4A848C1CC4AF8A2A73820CE8F52F19EB2C1C3C07ED56BCBB6F7EFA54345A5 H_OutputB = 79EAD43BCB3783CFCC96949CE04F4ABC4A1556C2DC89E0F42D133E970806EE29 SharedKey = 9D21A30978066C19EA9C09F35F56167B1274DD750C1F5543DAAA5EB536661B20 DRBG_SeedA = 8171BFA4EC66B5E9F554F28BE5761FCE941333BFD0046E4B187879399F255C4E002C8DF8749F6662A2706052F1BBFBD906EAEF396AD8BE8783D038CE1AD73BFE H_OutputA = C97CCEE8733F4F694EA0C61F7EFFD6D5860A66FA3851B1CFA9AFEAFD60BF8D51 DRBG_SeedB = 033BADF354FC2885A0CD1C88C2E7DAAC99B47DC208CD4C298FA406789F4CF1AB H_OutputB = 72D74E97E650F73D45EDCD3A8ACCB4859A1756E04D15DF8287BD71A1BE60C89A SharedKey = 8E774350DAB64A8C523DF69FD7BDB4D026383B72598D7EE569ABE6E910659B97 DRBG_SeedA = D159FEF506CFBA7281DCD5AC4477308D2F836A2A1B4496501D6BD6084DD4A959DF9655BE60C46E84DDD9CF7F5C57DC3F069A681A1CA82DF40F5182B4516ABB6D H_OutputA = 7E8D71A3CFD01F9FD956B84A143BB0AC7E8AE177B077CA78BF74C8422215DCAB DRBG_SeedB = 5499F13921EDA1EABCBE6C88520E5206E8D3500BC5E81A5BC4CDC2D580A006AC H_OutputB = 5C2595C6C9049CC060745A689E1D690531547DC8E0DA49AB8CB7EC3C49C39795 SharedKey = 60D3678FF062F89EC056204DCCB2D822D9BFDF7F968780F1F3FBA3807B61CB67 DRBG_SeedA = 96379C83EA9F6DC255CB76420418D7B9B52482E75F56B4730E42EAEA6915B5B650E052187DF7111E91FE5368C52180E4B50D387674174D801C49574629BFC418 H_OutputA = 54D1B205052A10C2301683EC63CD053C5E6053706DDD6E13A844457E04620073 DRBG_SeedB = D607CECFCB62D1492A8F30CB8EFB69B1A5ADCAE9442C0011869F8644F8D43335 H_OutputB = 6EAF552325F91476077B0961A750C1EFA9BBA78BE8BAC42B37C254F06E66D1C8 SharedKey = 1F70803203DC3B3D7335D4D16FE847E4F8FACBF470107180A690336AAA6BE0AA DRBG_SeedA = 1A719D33830BFD4DC9F7D10059C8A2313677E1D7351DD6D9168FC66D01429864AB9D2E49EC2E83A26231F065941FF95DE3490738F88A12B1126A396C951A3854 H_OutputA = 9FAE54206C67CF9C695E74A65B13C7FE7D1450673C730E5AEF542469A08B8751 DRBG_SeedB = C348DB722A3F4F1EE46EEC46CFD58E8D4B5155B7A433DBF6D76A18E9CFDA4923 H_OutputB = D613675CC9A374352F9EEF01F46DF9DF24020F8CA8B454E0BA04435B1BE105A7 SharedKey = 458BFDBA0594B0811823F5E13F6444458957117530B1BAEA2574AC0FA301DC4E DRBG_SeedA = 5248EEF3D20EBD5CD0008C0FC57B7717F7F129992E46A4242210A1607DEDB4D67AC4CE70129AAE86DB94E9C741BE9A0C1549655E74C93932908DFF7DD8FEF33C H_OutputA = 6E624F21E559EAB6E85A3A183302790A67BB9F88E91A560FB0004611DBA63E7A DRBG_SeedB = 9952B587F09F12F2064DB02381FECC850C7B71CCC9285A06DBFBBBDBDBEC6F80 H_OutputB = 86CB655E8332A13FA80C33006BF47FE1B8E9042B7E4159953D6CACACFCD0FE69 SharedKey = 2331503904F442D68BE70B866C5D5E7E1D30356C5832A4CCF5659CD3903DC05B DRBG_SeedA = 9CA8C549C3ADFDF6577C63E99D29B7A4A95201964673618620AFA96AF0DC990DA5F4CC2C6336F994E2A2A8981D68317F3105887878BF1D38B707644B45475375 H_OutputA = ADCECA0898F82BCF0C481A3AB91A38A9EE7FA8B8E937F6FE8409933D92589B6C DRBG_SeedB = FDB9D99329E1244F55BE663A3187F42DF3D70163A7DBB2141237850972F28D3F H_OutputB = EEFA3D6895C3A9ABBF8BDB2BA6A8A67221A7E6C2156791BF714AE01235C4DC8D SharedKey = 7FFB9F7BAF051BA0698F7DDA276B6580E85EBCDAC0DBF454474963EFF5607B01 DRBG_SeedA = EBC98CD5FFEC8E12D66AB73194FB96B4D0251B75109F45471DD00F6347899E4E98912C406EDDB166094CC504AC185D691F7E817B936BA5F4AEA2B8039FB82668 H_OutputA = 234CEC7BA098439C9665C4D7F1DF1CCD7F4974CB134E99AB67325BC0DCF15F10 DRBG_SeedB = F25EBD421F3FE9C0191DC29DBB5A2258B8501E78B566829A6125AA65B4E88FA5 H_OutputB = 54D9C120F30D0C04F39792006B29AE54C34567FA83CBBECEBDFF6A528E21EEC8 SharedKey = D7E1623AC21B48050BC5649F5FB2320D782EA862A9C69D2E9222BB4627CE93A0 DRBG_SeedA = B919E8DE9C2DC8F4309B5AF6824BC52B177EE87A9F99FD96375F18D7B40C272B2971B27623803C8118DFD9A7E90EFFE188E2C5AB9B7A0AFE658923F40C786598 H_OutputA = 9D0B44BE05656C047DA7FE8A2581F1618AA091C69DA8A904E8E9F3D88989C42A DRBG_SeedB = 1FA44613F952D35127864C2150FD2D5598F8B6EE10E32EE8C218235420349C7F H_OutputB = DBAAACDBFFFEADE99666D30AB6759A72608D58029C61F0DBE6B3143E61673F1B SharedKey = 6D1B749DE81F346EC8618C69B2FA749F8A04CDF9EE65A048F1F89C1F14E04F3F DRBG_SeedA = C13B1636E10372EC4FD7BE71F7EADF46865E87F91F49FC9C53999F51D8E81BF921B1B88AAA5E5E05AB6BD35B06A8653E49AA992696A966165E45C48B40843505 H_OutputA = 6B0013743A4C85C83D5849913B03469E7E431FBA3F984630324710E8C15343BD DRBG_SeedB = 3807C677DBFB910339DEDF5A98031B8DC72E2AFEF3C67DE45773BA97BC10696B H_OutputB = 558458AE648EDD1CFDE02A437553823FACCBF9189CB39EE72730F3CB95143FDF SharedKey = 8848B285AD4ACAA181D8E3D54F7DD81078442C7A28A94E274E6810AF8AA5A32B DRBG_SeedA = 9C0745840892570538F2DC7D13F3C4293AD987BBB7E21861C215CE0AB7B0D46DD88A11BF570C416802BC944C0F0D7B01E439F4E7F86EF43500448E1DDD618F37 H_OutputA = 4F35425699D8E4AB4FD57FDAC654A0D892908E75D5354088BD054700534B41FB DRBG_SeedB = B484D0CEA1AB3C1051A97ACBF73D42EF9B8E864106745AFBF55C884573F94340 H_OutputB = 6D9D0DAAE50FDD4530345B3B522BD55FB2D8716FF37640BF1F1E30507853A1F1 SharedKey = BB424F12F54308FA73F2F03A223066B88596BD30256173792AD117D6DC338F1F DRBG_SeedA = 715098DA388748B3600539B4B61BAB38D12745C62D7A6BE197F97D8A68C0FE60613CD7B1A74C5F76DE39F27CADF91F752427E0BE44A56E901B901C8BEEB7D65E H_OutputA = 8B26B36F1267D092573791702DADB92EF7B83641FDBA4FDFE7DBAF2510EA58FD DRBG_SeedB = 35E27A09CBDAB54DA578434ECB1B1D2B54DB4AA12357ECFBBEC96F669A383B00 H_OutputB = 9100262D4F58FCA581A4FB4AB114DB6C66D972EBDA9B2E2883E3C4F7EFE4AE9C SharedKey = 3FF329748149E4D1421C1B73FEF69E524FEDE0B7772A07EBE756E96C42722C81 DRBG_SeedA = C4E04E295B1DEE9DFD3CD4F199B3FBBBAFC3892B8D57DE40A8D8405A9D08D5C2A6C38B23F67C20F13080F3B02770AEFA3357EB631F69BA4CCECB5263D248D6F8 H_OutputA = 59C804228B314422B9373632558F243D0CF62D549DD69BB7E33101DD002CDD4E DRBG_SeedB = 1F573FB6FCE3A24EDDF22060142A573F844EAFBA7572F7B29A11DA4EB894489A H_OutputB = 3C8B880C922695FF474F57AC3842C9AA764E7419DAEBFBEAB793A692C8622C8F SharedKey = 221B3A86E163CAB8828CEDBF4527BCE4D0614F14D540A6E2F57D43A6F68C3E05 DRBG_SeedA = 04F9A4E40A9AF7DB4A7D1306A869159010E41D2D733705DE9FA572EFEB939CC75797B385BFBEBAEC0895946A13F4C76279C11BACB8DAB849D4D3626BE68B5F77 H_OutputA = 11BE2A0BE2E53D84A2928AA1F3BDFE25F524ACDAC72A33F240387B858A554A54 DRBG_SeedB = 221881C09251789454900DCAA8FAF5CD556BC17A8CAFC1443CFCD4A84169BD8D H_OutputB = 6A17E9739301AC386116C4DB4C88D1CCF37CD43D4505D9CA5DE4B42C720B26E0 SharedKey = 8AC84A0FF867F5A0EFEB885D1C44CA2ACD92F6067F108110100427F57C5A6EA9 DRBG_SeedA = 248EDD5406A28C3843E3D7B6BE77C71671DC826C8E7398DC19AF70335286BF616DC2D92E3F469DFAD032E8424B1BA710AF3C8ACBC8817E29258BD282080369D3 H_OutputA = 977A7C767296851B779919C3143A5B7C76B2E3203E6073A7EA48B1DEF94FCC41 DRBG_SeedB = 46ED41404374BAEEC1364FD937864EFD40DCAC7B3FA07270B4708E1DBFA82E26 H_OutputB = F3A050E41164125D38A26DC551BD759199F69F60340A5974E5D75D83D079CB9B SharedKey = 5EA71D7F774A7FD4EC07356C778C4283FDD03C8EE49A015D6E88660A5CBBDD96 DRBG_SeedA = 702C2FDAC5E9ABC1065EFBBD1B564FB679E69085CEF8C53781433FA9B810F0B3CCEAB954F93986D0F161D4C67683A9C9DA27597E740AF0B84D5B618698A0FE6C H_OutputA = 329C26416B318A6C138EE96B1A046D71D9EBCC000770B20C14C1793A29DA9246 DRBG_SeedB = D4651FAECB70986B44D03B58577750B8290CEF3D447E553F79346A126C77D2F1 H_OutputB = 0949C692A5139D01478EF24804BF620F769B3C7C55E910DB321A64DC7407D7BB SharedKey = 7744F73FCF51D86EBB2AA21C1373CAD58E40F6B2C0C705227D81579AF1E1BD20 DRBG_SeedA = 38419F2CA7239FCA40BF91FA247F4BEC9E2655CB53502D03F8EF4D8401FE15F84171A8D267211D97D97D326588D3F627BB2C962BB81AB9B693C6E5EF4ACE40A8 H_OutputA = E0C1973ED475439C33D3E5DCEC4D0F717DC09BBFBAFB907E6C7CA25B1A90C19D DRBG_SeedB = C055244577647EEA2B0D9785A07CB5E98EB1864AD3DCD3219341B12A8740BA16 H_OutputB = CFF8D682E2E6B8720EF78590A9EC49061D8702B7C027C6437EF5E2EF95F06E49 SharedKey = F97495029FEAECADCDE06FE70F56DDCF3078A115EA94605FC4B59F4FD194D31A DRBG_SeedA = A0260DD6CB6A766A9E3677CE0804243FEDC845635417E97DEABA85509B697022F05D27CF568779881AFE1FCE6C853F9768D7423D9358A4149F1CB70B2B29F50A H_OutputA = D5323DA58C5749790AC1612D10348195A539605F50147678D16236C8EBF4C1AB DRBG_SeedB = 1F4AFF44FBA6B16D54FB354F6EE59D9553F358CF2809175E814FE4E3C473CA1C H_OutputB = A7C88FCE7EBF8F8D959ADA26A133ADF6DDC5FB49B41335FCCBA8D0FB6E3A2651 SharedKey = A96E70457E5F5F84B2737F8F221389800C0AE42BF2A692A76786D0171351F8DA DRBG_SeedA = 69FDC180E986FD072D970ABB6EE25A309DFC8109E40BCAE286F73ABCC0D81DA2FAEB958C9B740D9F62540F85879A7303B3EEEAF907D6BC585778E36F8D3736CB H_OutputA = 05260D90FA235D306B100F953A86EBF1A369B5BA07BEE200B8C696C2769412A9 DRBG_SeedB = B6EC99263C9ADF6CE9898D090DF98BBE62B72E11C3EF694D3BC910ABE8DDE287 H_OutputB = 6D98F18B2BE2CFF576373569DF5BFB024F474D0A3B6D868A4F3B948E65B68E77 SharedKey = 0432398A903BC0EA29FC00C365BBFECC36E2CD2B5B0B5462A09BEBE16DD5C057 DRBG_SeedA = C59CB9F5B135D1746FB10509B9798CDD04583DC148C1D8C80ACDC457C6E9A6AA45D30B1519BC80B076EF9307871C0445C14E013B73B5E47F825E4A1BF84DFCFE H_OutputA = 835A56DDE4EA3835781A48DE61CE08F244C20C0E9F28E72DB6FA6166C030767A DRBG_SeedB = D5A401611CD2313941FA397565A4DC67F1E9CFFA04D48ED8ED220054BBB66F4D H_OutputB = 531DBDB665935D835C12C985347CFF60158952B9215B7043B13E7B5F14B6E389 SharedKey = 1A2866E6EDE99816A9A3BB8396B785451A6C9B373415C9BDF3A636FAAB6DFFDF DRBG_SeedA = 38341480500B8EDFBA0D38035BBA7208C62268861CC097B68E4EC8E4FC962EFBB9A0424BB01631B99AA1F05E8E214C87786783244F3C4643D5CE29BB0924EA83 H_OutputA = 44C4694E74542060C397014CA118C7638851117B55092F3C919AAE9F03DCC8F5 DRBG_SeedB = C5EEE29CDF1555F348F5469560151F1123FAECEACD73151F8CF2B828E63D3693 H_OutputB = 2571E123F976A596B102B67C8F446B3A444F9F2CC53162B5D9EAB3B99310CD14 SharedKey = EA96D885B69D18029DDAB303AE991F5420967A9EB1DFACCA24940375FD530F0C DRBG_SeedA = A907A9092C544622752923C2DD97833D38FBC6819996F3C9F8B7692B15E6A9F10BBB6B9854D8641E5018746E5C716F5930D01859AEAB453BB7FFAC9EFFE84A0A H_OutputA = 3BF1C77DED07CEF6271430A9F35744087F6654EC9290211621C19BD82AD87372 DRBG_SeedB = 452E8F95A748A8ED0CC8C22FE00575647B5D05A2F9309BB02E4D9E5F934AEBF2 H_OutputB = EC3FE29F04F36055052F2322A2294BE55ED4EAF620989778E7CFC75DCD271460 SharedKey = 340D4F777EC85D0BE4625DF62FFCDEA69AABD5616F09441AC6AF26DE9B4727CE DRBG_SeedA = 466C0BE640D8CCE099F3397AFC3CF4ECFDB1B98963201C1F1440F5AF00133AE8C05ED83E0D0E0085EA27743061F1FC170E5566B5CD8B55A921E0D33AB8076D1E H_OutputA = C8CE337CF0D44237EB5C740F669B62B2D0C64C9220A079F42B7AC90283F5146E DRBG_SeedB = A2532E30D7DF3AC2DFB5915C3C8DBDB64B42F5CF92D9AD88758B8D555D830B2E H_OutputB = D91A16E1D74A3EA91305F4170924281C1E93A4E5386A353B6D75400CBF8CB8DF SharedKey = 463EA7E67BEC78B407BEC0CF12D0D71C93A5F2C6D921CF2A75BD84245451BAA2 DRBG_SeedA = 6A34E5B63BF89FAE1FE752193F504BECF60EC53D4A061B75CA75CC5D436B07C119F74F7E8F150C54395E07B65410E59A31427166137E38F3E47326A1FC34E7F7 H_OutputA = 7321DDE0DB3E1BFEE4B6F5DDB00AA7C52990632734D9AA2CC8C4E62EEA5449F6 DRBG_SeedB = 73F56E4EC75F54A09580D794758431AFA91EE0D7A836ED9DF92B8012E316207A H_OutputB = EFB25979CAAF935913202DC19116BCB2470E5C2E1196AB082391959F56791902 SharedKey = 51B58EB6E36EF9440785A70064E9768EC1120BDA912E56AF56A87616BBC2B3AD DRBG_SeedA = 475EEB4138F26AF9B49D011983777191A1BDBEE90C3398CD0BC1F0725FECEEAEDBF1F01CA117DE58E8A7678DF833066A3A19A69D0CA73162530F74369F68F609 H_OutputA = 1A5CBCB8B3F49D6F9A77D9B63067A1FD2550CBBFA814122150F88974309BDCB1 DRBG_SeedB = 2645B9B41977077932996911F90A9865758865B00A282785B86D53B742B48F8D H_OutputB = 1094431A75FED5A83FFFAEDDF820B1562B84E6E621C4F20CDFC57B741CFFC069 SharedKey = 11DCB4B109CC905ADF4C19A974C0B5A51E426AAC3791BF2A5EB4C7B539F2B5D8 DRBG_SeedA = 5DF7BEF83404AFBE2C69C41F6B2A831301AF3DAD8DA0D5D932AA9F7C8198A83A345610AF59F5D3D2AFD43125ECE063AEB247510760F2BA64EFD3FA7C3F45A062 H_OutputA = 532D1B1160AD31B89AA3DAB063E7253A10DDAF06AECC161C885BD418417A35B3 DRBG_SeedB = AA322B3883663DE41958068A360EA3498DC19A92BE208A2BF74FCEE733793B35 H_OutputB = 340F59F41F492E7F4340EEF69B2335B25C7102226148D60F8F02E46991B257F3 SharedKey = 39C3760766FBD6B6A3FC2037CB5E38AE1B81E7FEB4EF9023E0C5842909DF0A33 DRBG_SeedA = BB1C0595A5D839FC31BAED45215001401561E72E279F960E7765027456F2370CBBC32F41544CF35BE16020EB999B85687BB0C9D0C33B4BBFCE24E4933BBEDE26 H_OutputA = 81B18DF24BD92C373BD05B1A6C394E9EEA5D01C949EA8163FE39D60BA3F57DA6 DRBG_SeedB = 337931460C053DD1D7FD9D34DEBB2E6AC42408D53FE9C91FF8F3FF9F722B6670 H_OutputB = 626EBF31B2640FCED5B0203D4C8A57CB0CA40258D065DB2AF1D9B4CC7CC3B649 SharedKey = E1C21990BCA562E2170368E7A3AE8058762E22A65E8C8673FB4990124A3C2AA8 DRBG_SeedA = 889263D53FEDF02CA4949D7BAFE8C9FDF66C1B657D97BC0745E5349C82C1AA5BB147B5A675B810C13073EC4B9E37EC5DA374E1FF610C2D6CC628414026EC5126 H_OutputA = 93B5ACDD867FDC12E334AB313F3CD10BF87F4A11B126A6989F47C553B0375420 DRBG_SeedB = 6A72A49BFE43E48C3909C36AEAA2DC0E5473374A55A22862D650DB5AD8ED9720 H_OutputB = B834751C939CB8D11018175B233007FD4268260DD132F08B3AF6A171CCF31C0A SharedKey = 00313B1E0690F52FBF7D686C4AD5DF82511F647F47DE21F2DE47A8FC910A6508 DRBG_SeedA = A04C92E62F9ED799A1026296E529FCB960C2413689A086B4CDDDC0A482E32203864153759B93D60A721C54F37D7B801FC11726E811906455B148A80D23323E0B H_OutputA = A1773CDD16581C6852080A239B5641C70CF7EC78E3626A2CAB2109A40B49C347 DRBG_SeedB = 9035FEDB812EE17D53436763547056A0925095DFB6691682F3DD3B4BC8D35780 H_OutputB = 1031B9DCBA1BBD4AA2A36917088419C9314349A279FD4C549805A35AD54F8FDF SharedKey = 27FE0D1C59E5AFE7625F661D1DE19DDD5175F9C687E3A992F12896D3FA382116 DRBG_SeedA = 151C21A8A67693DBB625EE5687E89E6C74580886651A0DC450944162C9E36FD5B060C0428646DEC99DB5178241FBC2CC79E35A7CA6F2B57834713930A9D14724 H_OutputA = 61494BDE8D71E1EE8D86D8E2B62A12AE141EE16616ED6D2B66CC00B8462E9565 DRBG_SeedB = A78BDB354E9929093EA7F2E27485D5DA2E81B5131B7D8906BD0F3B3A38DCC54B H_OutputB = 1623B00A551EDDC42DFA928A9C9E1030A62B728B11DED36428365362FF5940FC SharedKey = A8636FB30155C9D4D136ED3A80F52B7ECDE3E76F85336C8C59F81D09C8140F8D DRBG_SeedA = BB73A96696F6DA912C5181EC741A76F0FEF8A83E998146006FC19E57F0C1E6AEBF1BE540729A8857928CEFF49B6FCC5337D2EFB77B7DB09C9B894045B674ABA5 H_OutputA = ED94E727B9DFB1042B68452F21C9669F7639FD0061A6724356090DC01D00158C DRBG_SeedB = FB8BB9638237E1850F4F3C1043AB603BA7AF2B83AFDB89CA0929178267AB2ED3 H_OutputB = A6BEBABDD56D1D5E0015E0D10CF5344671433256A28C2E49A97EA31C95B3448A SharedKey = 6FEA949DD6FAEFE2486977F644A0781779C75585FE2E9F03DA11354720BCCFB5 DRBG_SeedA = FCB84997096C50F6C48CA86C0F28BB1B52934290D892C05D487D32DF630219A75DBAD5412D599A4B1E34C0D4F7DD6AE80AC83E55CF665A06B54C79926B96C7E8 H_OutputA = 137B08CA5B2063193BE9D94B28CC4F914BD6CC04C5F3CEDF855D10828F6F0EB3 DRBG_SeedB = 3F2B13B45EABDFB2E183FB5E953E50C6D74E3DA80666CC553E88F9BDD4AC0C90 H_OutputB = B5243CF99E49789B31A36E66F4427E4B54D00EB2966079704574C815FCC78B2D SharedKey = 17F9252524210E7D73A5BE4C9E7A3573EC3EC199893504111C4C077CAB81E708 DRBG_SeedA = 1747ED300F46FC828524FB8AD5446E27B29B20F3BA0C2A4EA3F0706B775267DF3D81E47C4438600F9923F0A17ECDE7E960E382464EEBB5EC3A1DC50A9B46E8D5 H_OutputA = 246E1FC6927EB49406A9CAD17E08D1DA5DD83B2473B1A669210B4219F569646A DRBG_SeedB = 171A41A2784BCB51966A065B4FB97F5C436E42760E2EE9B2F5FA10B28F03DA4E H_OutputB = 8D33085A123814B0C68553589B5B7DB90C2A021B72327D518A6570B088EF5EDC SharedKey = 05E0EDA7342C9613FE6422F49D8210E02862748D49476A2BFE62F2705991847B DRBG_SeedA = E25C1D51D43B6433999657D35AADFA601AE08905B0D6EBFE86B058BB9EA0997883D7DE45645AE981A56C7BF737B1866335C3FC7B3434FD7D5A2CFD79AA4E108C H_OutputA = D48EE6AF8BB6B7CB30FB5A18C7E18CD68BF62A7EF1D472707CCB4C295F968EBD DRBG_SeedB = 782F7746C8E3D752B34B38A63E6440D4FAF27EF22D91937717FFA1A0C61A3367 H_OutputB = A76CE38D10304B22DDB4C567A9227F363BBF7FAB1BBBF66E0FCCE1C6C378AA13 SharedKey = A4BA9D4AE239234553C1DB4C5ED46D844ACE16CACF7D8C03DD1C6B289E4F4CE9 DRBG_SeedA = 8E8194127055DC66CABE10D69CC0E3F5664423AA64AA630BE4F4B36615AEC13EC1A94437E36BF8F99CA7B5CD03835FA33DA4F5BAF9685E5EF8B503A42683A724 H_OutputA = 2DD7E5D605F4051E02D918AC7F06349CB68A0892E688926F18D35B34974FBE8F DRBG_SeedB = ECB5A28F30B1FE3329B11004175F183859BCCC6CBCD3B2C53E6F1B3399A246F1 H_OutputB = 3DF1CC7FABD5A9BFC3F553E6E7DE898D2AB2E0450E71EE812E1019F624A24743 SharedKey = D5626F5D78302BAE79A7006D93DD4C0B476A5B2C5D9F69BBD9E2963516E31278 DRBG_SeedA = 68E0215BF04753FD7159490612A8FDDC12397582E8EB40B8A8259ED9B31E11719274382A301B5E7C0DFF95B260B067334CB3BB879102A00A99AA46FB6278815B H_OutputA = C304B9E1BF43E94DCB3110F6858AF7F3B43F9469CD23C853B2542DED38E5C3F2 DRBG_SeedB = B628C098C16076684C4F4769F95E7F84123C56CADFEA557F04E2648BA09D3A23 H_OutputB = 2BA41345D0FD2FD760178258116BF4BC541FBCB81CE8D50B7C92B482F62E6EF6 SharedKey = 6EC8F5336B59E0A111C27FD6D0D93A76B4B7CE7AC094EF76866A9BE18E744123 DRBG_SeedA = 08DF54FF805F88F942997FE62F9C8D203B7FCE3DFE1D45A6ECE776A2324F8E848545366A957029E3A714895E6C6403079D2B1B612DC992EFF8DB788AC44B559D H_OutputA = 495DF5B780094E6CC7536F5EE0027D9AA7295CA2CFF6F93D83E22DA695A9D61F DRBG_SeedB = 615F08C1D650EECCDE818D99BB341218C265D11E7CDB71D8432BA171D9830FD1 H_OutputB = BF40F9CC12A3F2F8247C215C83D1FEAD85B123F8A3D0BEFFFF3F63681B5DFF09 SharedKey = A13B4B01515C0D71F0DEC6B2868EB749D366C49030B0EEF721EA650B87918A96 DRBG_SeedA = 79BE77699C257ADD2342D36A758E85FF66846F836F06482E4628DBCB75E3F51564AF71803A304642AA03C3CF4CC0E7818C5513C572A546F331EEDF45C3F4B894 H_OutputA = 34E85D148126A45F8D3AFFA771E91C0328E74EB5E097E6780CA03632AB8D56FB DRBG_SeedB = 3AD6E6C1A63F7FDB5F4B075E277E2959DFB421EF949B65236489E54F57F4746A H_OutputB = 18A03D24FEC524D90C380003AEBE2F14A067F054897964550156083C48E52E3C SharedKey = 3B0491716B260AA320B147098D0BEAA9325B78BCBFB970CCD7EF5C6C5CC769A1 DRBG_SeedA = 4F8E3D18BC857D475589ADFE5519E528C8DC7D19A5F283F4DDC73D3C88988926124532703E59D49B48DA2A6ED0689BE67C26C190A047743478076E5739F28690 H_OutputA = 8CCCD7548A56095A658787FE70052667A75C48E1B44E4C35BCE7F8855A5D799A DRBG_SeedB = 5A6284901DBA8EBAFA0129C6A06D5CB671006DE9A18971987CDFE6BB9980CB05 H_OutputB = 11FA5826D36C93A1A8E75FAD090D575C56E67F7AF93D8E57FA011363CB8F1419 SharedKey = 2F50E05A04DECA4C1C3ADAAF8E976695AB33A5C06B4059537775484C9080BFB5 DRBG_SeedA = CCAC649FA19A636D1653D9255E357B52A7948D6D8C6A3140F13DD61501A49494B442F68590C53B7BFC8DF9AED121C08550C47101077EEAA0127AC692C603075A H_OutputA = DC0AB8AA2D898E7B1F8863ADE500B26A2844FF736F7227CCAFE23C7FB94FDAA3 DRBG_SeedB = 7CEB439DC7C7799BCADC11D118557F707918ECA1882BBD42A60A9194E0072064 H_OutputB = 92CEA23BB6AAB6A6A0DAD22F3D2C741B14BE808C618038DEED906CB202D35357 SharedKey = 689FFB594046FB6E74415163F22463804B989921E584AF4376D9C11789DE8A05 DRBG_SeedA = D67C0014EE161CA72DCFCEFE88455C8ACEBDEDACC36590FBC27581F467903F578F095F03B70FA7A4B8188BFC581C945D834C614E0942CA28C853155D7C76E485 H_OutputA = CF9C306CADFAE6C98A57EBCD1AB262DE7B6D912FAE694A427E10A9587D867B37 DRBG_SeedB = 300E8A104E2338112D578486F431945250E96A8E59A99D1FA826E934AF4BA9ED H_OutputB = 91103B53875F9EBC23FAA47027E6891CE8BD28BD406367FE1E3171430D82B38D SharedKey = 99F4EBBFC3966EBC6CAEE5A6E292492D32ED79BED7E3891006E1AE6E635DBB07 DRBG_SeedA = 00D9ADFD98419DF88FA297CDF31A77907D14242D768C228A72BA3561E5522C61C4B9AF2FE243034A5C2AC72FC68F523405756AB8101DDB04193375F653F5DA04 H_OutputA = 1940FB4423E9F59393E0020DA32A6FE8F6F1A2CC5E41CCD3EC30D432B7A059B7 DRBG_SeedB = 075431D0B5D4C483AC9F1AAE759B9E4AFCD0DD53C2B0AA09432FC68D9A72D1FE H_OutputB = CA6C5105C5819C9120E4807BB9DA5E09FA9B92A478C35D7F7750A093CC603D7C SharedKey = CBFD28329293D9365063E91797A3FE82C7381A41E1C6BB93A1308D15850C93F1 DRBG_SeedA = 169F49A72874EA013A4DFD44CB3F3F7079B3AA4C45F86378C97A34482B652BE31669FA408EE5A09E26C05A1B4BB0384D6126A803DB19E716F15B155FF1B0DE18 H_OutputA = 9A8DCE41C73C4D13B6A9311E84309267A226F765179F6851331E81D99801C60C DRBG_SeedB = EEAE5F92720CF42D60379416A3FFBCF1F5FD4A39221A402FECD30B82D8F133B6 H_OutputB = 670F79F30FBED0891DA12F3B54C219F7A2F33B29414969AE7A1A756A23BABD81 SharedKey = 4964492B61A7B06ACE3A995A72E6AD28EED838F0E4419916A3E7EEDDF691BFD4 DRBG_SeedA = AC6921C8432E5997A080B09DE22938BF1ACDD5E8BE9B731F28FEF3DCC34FC11908D6FE698073E9153D20C3BDE6F88476C0118087365160CC0555228DE605C916 H_OutputA = B815E2670FE7465F0DDF702FC93D551C82ABE2E3581FF5397712DB2F0A89BB8C DRBG_SeedB = 10262754984F095D19CEB4A63A472B1B00EFD8838AD6A4BD68F580DB6A6D559B H_OutputB = B08B430DC630283CB2E388BD7F111CDFAEBF8A1AA6EA715957FF558A4723DBE6 SharedKey = 9E35602D859C9B5238AE4818268348E17E2A1B0C7EA692F08A69C9B39DA59C50 DRBG_SeedA = E94A273885D9B1FA0FAFC37DD5676FF188B9E624F257AB7EC23DFCD8550328C2DFFFB225E3A375AA1412374287553723F1E160B275BD10D1078A057E6A028504 H_OutputA = 7FD68B30D6F39315851DDF2C2B86B4EFDBCA991A1EE35C079DB9B2B79F86D8EF DRBG_SeedB = B49B46E7C52F86147EA62A6AEF5F236AFE95179C5AF21676FC04E69EE8225A89 H_OutputB = AF8AD643B482FF4AD91BCBB02004CB6B19736BF0B711EE3EE9C156F34EA0F6E5 SharedKey = B42D460476FB59BF51097015B5302F908EB5FE4C7D316A6A3511A77523C78491 DRBG_SeedA = AB7989F8909EFF2990FBB2A5B656D5C1C5244CC09B461F93C86CE2CB321018C18AB56E18EBE7E41E75820E86073E8936F439979B820D12E63387D13AC5EC25D7 H_OutputA = 726280AFB8D5DC07070B741ED76E6D21657B38422D60273D1AC8B1672DC49837 DRBG_SeedB = B2F8648D3C21C259E1EF92D7582BB9D424E29C694F277E4BC5A823810295317B H_OutputB = BDD605B105043AE3763D335DF92E78079217497472DE7D9AFD5F7D5D2883FFF4 SharedKey = A5300F5517B4D7C210075774D7D7B8CBD792471EEBA9F053CC4EC96535E8E751 DRBG_SeedA = 613D883CAA2CAAA22D4D0FA27AFBB80A41E924921309EA378F789E5B873835F4FBFA7D0C7E39FFE56E8876C448AD9B187250645A9785F918E6918E3E46C8002D H_OutputA = DCC3E4357183299C8182A5597C868C3906D45225E486620354E6B4A4C4F72ED4 DRBG_SeedB = ACE93EA5CEEFCA56DCB5A2944DDD3C70FE683188BC759894EC7343382A5C718F H_OutputB = 13F767BEF2E6C01F9ED7E464EB6905364A6B1A9EDAB7B36D81670D95F24C6B36 SharedKey = 32BE28C0A1044D7B05CAC14D9E91D9B412E816C992709F8C2049FF6BA6AB13D4 DRBG_SeedA = 0675EA607ABC774EB18B526023AEB9E6E1204DE6A777694EB871D8B90CF59CE19396396741BA5B3E13336BDB2C8CFB0DEE2B95B4F635F8EC19E832615646329C H_OutputA = F7B159884FEF1AD98CF2B1E504240F0042E61F4C7434D432E09F2F0773646414 DRBG_SeedB = 9AF97BED6130DC96814D694D3C3E615B8D7AA616F8184B00553241282088B4D1 H_OutputB = 5AC4281F3DB05F7B3C92CD178DBED9A6E0CA8A8E5FE4514AE323D1176BA7CAE9 SharedKey = 5E99CEABC51CCE66F74FC5E8F4C0A8FFFD60B25EF309FDB5699C69FDA10DDF9A DRBG_SeedA = 58A825909F88B48237A7509DC47D6F9B7FB654DB786BCFA7B285CA3F9F4066609FDA1D86A0394B9C169B479B39716158F2A84236AAB1ADAF88D81E4E76B0C5F7 H_OutputA = 2EC52BDD30BDCB0C8A50DF076E01DDA56C241BD731942C0F2462F6A75C7657CA DRBG_SeedB = C95798631FFF94910BC43A706FE3ACAF27454A5739B31C36144EBFB73F6B6DAD H_OutputB = E3D83B948A3C15C282BBD78D6F444438725FF752717788CE428BE60DAD3BE11B SharedKey = B57C7FFAD490D6DB7D76C4549A269F91429386FAAE7F3BB623856BBB226F1369 DRBG_SeedA = 96F495627DE1A497970F5974CA3062800339A2F7EE956681323DA51B9A3E7C3D352768C22659D4A850A9A3F5136CF4AC46F1609BBAEDB7FF040D811BFF07E081 H_OutputA = D2E3F1135E268867AB11FCB9BE3DD52F9A032FE516D4FF89836DB49BCFE64B69 DRBG_SeedB = 2B5318086A280E771710F877F856C2F15CBA25F0849849A9195BFA5D690ACD08 H_OutputB = 9C23E2D3E597E2651969EA669693389620B347A85139FBFAB630694C1CFCF635 SharedKey = C8B9E2C54FBB000F98B4AB776AFEBAB49BB9CA2F736A0147C5E7327542E6CC1C DRBG_SeedA = 2CAF626A17B2953CCCB38F6BD59C65760FEF560CAA59AAAAC09C6B100BAD932CE35DD3777B4B9506BF9DDEED1C29B7524299C445BFE7F63A30CEED1701EE0E98 H_OutputA = 4C57BE9B1DAAF6043799D4570BBE6EE0E295E1232B15A0DA46135A930B954C4C DRBG_SeedB = A04BD9AC955F362272ABB18EB4CD90AB1800CF8611EB3FCB24F493D5BD07624A H_OutputB = A5BF33C41A76039D9D0BAAC07D57E20439FFF4D03FB85B9DB80FF363553DE3E0 SharedKey = 1C9361687209B5512FDA34C50722FA9072641E49EF6118C50E4BE08C0DB9C1E2 DRBG_SeedA = 1A323D5355173974E63D2F388D338EE41BAD1CEC65CF0924113BC6E0E1937FE5171E10AF95949E02D88D1F5281D4CD00A9F1B2E7A63B8948A7D5DFD08252693A H_OutputA = EA5799D8BD3D8933911277A9B6DAA78DFABA773E383F603D13443539F0D9D020 DRBG_SeedB = 10B5D34AE56BA089DBBFD52C20D6D53D16AF81B0A389D541EFD339829CAA428F H_OutputB = A93944829E22EEEB94262604D0CF85ECD224E122784AD0041F3E44B3C2604B54 SharedKey = 49DE0ABE639C12B901491036742FB39554B6E31D0AE596E97F5B21B33A886684 DRBG_SeedA = 095CA45C9E4B4809FCA2380B6E9E3516B6FB85B1BAC69BB3E3DD614A1633139DD536E5487CE69CD15954481E1E1A449E5D34B759DC919BCBFC802D03990F0EA0 H_OutputA = 95B8161B724E5D8ABE3AB67B80F2407CA3F8A25E24AB04251462954A651B5223 DRBG_SeedB = EA3FD7182B26A684E70AB69DF02410AC5DE7BC8CF8B7AB08F7B2B99D711B1F01 H_OutputB = C2DB87734B7EDAE91DFC293A6F1FAF53678D859836A5BC7BBFAE7BAB6E120303 SharedKey = 31EB5A441CC4ADAD4078C2CC471E614C6C61C8643899BE2AA2985BF8E7922AC4 DRBG_SeedA = BD8DC4BA269E669F11315364063048ADC59213BFFEB50C82A479AF7E9F55383A36B819AB5056058737B42F5347DFFE27429696B4A12361900C2F22E98EB747F2 H_OutputA = 311C3C77834F62945AD2AAA25F447A1F3D99123ACD4DA34FCB62581D310BF2F3 DRBG_SeedB = D488EE926B8EF7336EE0E5106C332E997474EF61D0276D2A7D0B1953C67C3527 H_OutputB = 7C6D3069547243A5F0F65E58E3C0F87C7FC30D3505B5B77DAE9AF3762A8DA49D SharedKey = AA75D7CF19C6315E1EB0CD47567F2F089680D7DDED8B4F70E16B40D65665A98B DRBG_SeedA = 857EFDC7520D5CEE171B35FBB9B017C4549B587DCD3FB12CF5D4939DFF0C22CF299895262A7FB92C77825106BFB0B3A422EFDDFB786CED573AAA279F0C9D1422 H_OutputA = 579E41C01DCD1184F6964DC2BA1397D3664FE75C7F2F36D4928D21C35C1C8813 DRBG_SeedB = 11B8CFF63E792FC0BBE91C5E72B629EA12D908D998FBCA879C2A3FF5A2FDD22D H_OutputB = 8F62A581FF18BD790A9A56A5AD76DE889E141EF4B712E0D324AB3376D5369697 SharedKey = 4EA5F236788F478FB147AC514C74632F62C62A9130837A287D125FAB0647FE46 DRBG_SeedA = 399F12242B3CD214C8C5A2640CB4A0A2A59623160B94AE01F1271ED7E0BBE0612899087A39DDF8FA3FD7B3CB8536FC523C242FE9B8087D90985D929F0CC43173 H_OutputA = 7394DB4F9D8A0AAF751EEDFE1385DEDC2CACD257A34BD647F43AD724A7749C9F DRBG_SeedB = 6551FBAAE6F600E6253AB63862E22D6CEF64143CF64C12049A662E21B406432A H_OutputB = E7528671DB18FC68920F47B8CE99E3F3BA86BA0E761322B1EA7C585120E4B7DA SharedKey = E2CE41BD90A960EE72676DE6F85088BC439B7CD8633EECBE90339F215D3DABCA DRBG_SeedA = F66E9BCA183ED7493C14E4284BC036DB92DDAF15A86C251CD48B4BA4E07152D7A38D85E0D26D35DF69FCFFC9FF17EA102462F66412105561C9D82D682B68687E H_OutputA = 5917C7D7017FEC8273D206B6CDB38347867A23947EE6C9866F2D4A1A70193623 DRBG_SeedB = 294BFFB6FE7F922F01145B0CAF9C3C964824EF8AAED0BD265865D469BC17937E H_OutputB = EA662A0E7A5661E698AE3220652002CF3F0800F0A3F10FBEC7F572ADA0571276 SharedKey = DFEBECBF430BAD08FCA43D410E83426DC1613C4401CE7B15764DC2520E861A8C DRBG_SeedA = A1E5402BCAF12611847630405312E905DA2302368A899490DC4A45D449214F90EDD873A982FE499FC6310942D654BDAC5282AF5A194610CA3D1F4A81F8131882 H_OutputA = 77E4A7187F01189B1CED4D632A348F7A3E324FD7129FA20A2250D0E6047EA7D7 DRBG_SeedB = C00041D5B855346E2D5C410E962DF227D4B57A3563F64871CF9348EB730798FD H_OutputB = 4FA61A16D82DB35B90CE76120472D6E4FEB832DAC06876560238B9D27E83EC04 SharedKey = 7C6959357BA8897AA91481993958A4071DCD607397E192B7D3E34CE51908099A DRBG_SeedA = 26C0CEC27D038CDF8963F464CD9C2963E9632EFB547BF98747F8A04213415BC9220F6A7DCEF9DE186C513BD0448D12C53B34DABCCEBF3BBAC2228BC3600DACB3 H_OutputA = 8A3D283BDB183CD79AFBF924D2B25BA43436F241A48EB9E79AA517918E78AF5C DRBG_SeedB = BD118FAE786B4A5DC93768C5DA37B1DBBC5D6EE217716C18FD5AEF67406030CC H_OutputB = F1541D8A8968CA4558610CA4B1B62CA3D91400486AB3B8306006016157F6AFF2 SharedKey = 774ADC07AED1226A7EE3D85302FBAD8AD0CA9F2AA0CAF601F08DE390190E4B92 DRBG_SeedA = F167C65CCCEB1444D99D915012B077D59D40AE3038506B3984F2BED7B2CF730F8EF77CCA97A7AB27CE2E77D972A9A9A23D22AF51D40F32C497F8BC34FBDEE8EA H_OutputA = C49063FD4AA44677305B5AB5EDEDCFDFC69A7337C80CD74E38CCBC2E6E97499E DRBG_SeedB = 039495887C9C169B213AD0B286EBB1948CC1712ACEE1633EEC463136B72E4899 H_OutputB = C2F5C9299379049CA43672BF4D2974372672007AC52B8D4430E1A59E2095B05F SharedKey = 191F98E0D4E0514879F0C7EB64D1575CB10AE6B94C40FEBDC4688BAE648F3D4B DRBG_SeedA = 7FDD6686EC569323D44CAE93F8314BDEA4AAE4F1878792AC7DE866CBB01C9025DDE4CD545489BA26E21765FE6578BE95DE03887AC2366E9AD9E959E6B9C6DEA4 H_OutputA = 82964D767FC7A9FF5D0CCE0DA271754548F54A247472C2D4EFE6F897C377F665 DRBG_SeedB = 847C326B745A0B4ED759D6FCBFBAE390E4C9C2D4FCD3D6782EDF47AB58618011 H_OutputB = D6FCBBD2C4D52A797843F67FC30BDA69E0B564A1ED59638A79E30C5DEB7902D4 SharedKey = 828DB09E7F50FE2A30AC43761B99358F32894DD22B8DBFB83D18329D50FD46EC DRBG_SeedA = A6A71B878931CE79F614669BFA0DC9F827892DF27EE14F2D177519CF04B8A8DD228C61B459BD4869EB4ACA417F7334088F3C4F3576905E017DB6E0427AA6B96A H_OutputA = 89B2BEEABAD4E9AE6219DA631AFBDD9CB99B4FC63DCA618460F99C91B3FF527B DRBG_SeedB = 9C1BFA74195491622D43316FF58600684BAC06DDE608E3138E53DF0241736B10 H_OutputB = 0C0257145C32A22BE9230D7721591684EDB5D3D36CC958AF0AFE9010763F922F SharedKey = 3B326280E75C1FB87CEA6E4692ADA567517CD8AC0E4A3C1CDF2CF848FCA934C9 DRBG_SeedA = E2C3DB667E621587CDE304BF841A50F59B7527098304EFA6B15C4AC6A02209A5DB3633B90DDDD49C88151CAF63F49833DF3145B00D9005C420F0CFD416ED6E15 H_OutputA = 4B9FA1767AA690C505BA90E197240BC4B1900373C035723341E56A41272E6AB4 DRBG_SeedB = 4EE2D7CA9094A9EC7425233F1044B1095BE4BDFE45FE6BA8F0EF09F57FD00387 H_OutputB = 1044564D9D7F70C4E98DB4AE51A615F744A7566B00465A5B87E80AC4C1876E6A SharedKey = EDBC611A338922BB1F561AA8F32E37079E2A9D977B070DDA5FA6C712A8FA0449 DRBG_SeedA = 3D004627298D213847B62F2C565E3BB990AE616586DF89D8183AE868B5106B0ABEFAE13BDE14D3E9C52DD81589523FEA1AC613FB7A869AA3780A1859A18A2126 H_OutputA = ADC2FF1915D0A7DA9C3DA7C6FBECA7DF436D174F57C6C7B2EFF7A9D6E8EC7084 DRBG_SeedB = C52DF2F9BAA7F8B5D2ED1DC3B07645CCE9740C4474A979496D94066C46F4C178 H_OutputB = B6CBD6357B650F5F9FBDCD5C1EB6A6553FD4354FE71E1123F65DAE8B024BC774 SharedKey = 2264EB549C24F2BD68056A6942AD6564B1E134B1C7586CAA6FF7ADF1CD976A38 DRBG_SeedA = 33520A25922708B545DA729C6698E9843D202589BAB40C88F878A00293AE0FC1F24724C1614E8C54F5F9DA03E0DDED3DCD32FDB73B2E17968C9D2119D7C567BA H_OutputA = 84A060469FED914154A95532A952347DB0A0CA420A2C6D8BC8EF3FACC8D4D441 DRBG_SeedB = BE502F5DC5B563BCECD020F3C67B28BD3A9F06AFC06267B48AE2B4340D444A93 H_OutputB = D23A964FB153E7FBDFB52301E37C2329E2AB83000CD9B770B8CEB8BB75F6BFA6 SharedKey = 5BC5A5B7B0E062C78F766808609D0EA5994F92D2C95173AC554951A8631B577D DRBG_SeedA = E731B127975735BF64FACC78D380C1CB51A89D4AA9CAB27952D5088E596317B660AADE3564465F22A8CB5B8A713B49A7E96C56DBD5911CC417817FE26098476A H_OutputA = BD1A9CC49D39AAAD38644841BD1FE7501D4499354F03A11BEB6137BC900FF731 DRBG_SeedB = 0E7217EE6E130AB8D043686B849CB7A1DD7A2E0ECFF140E389B13FC7C6F4C27A H_OutputB = 5C151AD1F2AF18DE94B5DFA2407BDBA8BB4E5BEAD2DFFE64DACAB7346AD4A377 SharedKey = 33BB2D0D436CE3EB929CB9DD999D3F5AD478993111C12F16C3AE8A1A1D939C2E DRBG_SeedA = F200EEABE9CCD8D2C3E4ECD4A56E09A47D809DFB1EB106370EE7CC6D6C40763AD8FF0CDCE728C545021E95125B9149EEDAC858B9402C6693395FE667097A2541 H_OutputA = FF082AAA45775E6BB1841C58419E07F939384F19CD499658D277A942E8786F39 DRBG_SeedB = DC94873A1C490933CCE8758190CF1688ECBFBCEBA52DD684CB5D283E3AC1E62E H_OutputB = 9CF52A9A24FE51177AB5AA0EC672E6FA4AD8EDB4A334DC60A7E53773338FB299 SharedKey = 33EC13181D50329DD3D30FECD9FB3088AB4328D3FD7F8F0AFC975F3E6592A683 DRBG_SeedA = D8CFD831B4D22190B0A8760C6B6D0E67DBE18C6A6F0B91CC872D0DE0190596162593D322614B70B68FB090DF1E28834E34CBFE3159E55560E53999F9D64524FC H_OutputA = 07C7F541DEC64BDC009444BECD2450A341C96FA0C3411D25A58D1C81C34615DD DRBG_SeedB = BFC9BFA0777D467FB1AE5B854853AA7AAC85E37B9877B47BE16197B677BC69AC H_OutputB = 3FA2FFB55DF8443B77E5F3333828553A0385AEA1FD5171CCADC8AC6D4C9699D3 SharedKey = E061AC2891E010CC3E77AAF04875EA9442C9E6AD78729967BB10858D170EDE95 DRBG_SeedA = 3038DAE482FACF9AAA99B8317869CA9F9071BA81FDD357A54B184E8532492A7482FABDA1265C2C94DEA0C7DC43D8F9958AAC2C9FC26932B3D202F6084D4FCECD H_OutputA = 252FBB403CD79A495FCBBEBE03BF54DA86027B76F6DD4758AEFD6F29C399E49E DRBG_SeedB = 7751F3F084B2583CB2EDB5EA92B924F619B00EDC11AE112254E8DA78963B162D H_OutputB = 7D3291D60B55D8FCA8BDFACB5041A791637F255718AFA56BAAA488FEA4E6BFD2 SharedKey = 9A38FD62DF1A9172576F66EC5F7EC1C9C00A391700879105FF660F26C6744C0B DRBG_SeedA = 28E8A806124406BE79A55B92E6EE1F7AA7AA488AAF2829EB935AE11B55C3D9FBE67ECAAAA400EAE549ABF79F79F14A77A5F72314A84143A12BD97420BC4DC406 H_OutputA = D6A6DB6D77995EAE00F84BE52F3560889D4949A962B29F0B95BC1E911FEACA97 DRBG_SeedB = CF8CBF2CDD604802CA98D7E761F586E17D6165E9A789DEEEC9D153EF148F817D H_OutputB = B407FF91A6D3C0AFD695B30782427908A8F598ABCE0399AE6222D8F8869E6F72 SharedKey = 702DC57507C5FB8380524AB8F6B7BD477A5EADEF8A1C78818E9D0B4BE91E1AA8 DRBG_SeedA = 60F19BB39ECAE35CC5909AAEA8E07D7BB754B73158ED1E58D50CF4633D683178A33BFF06525AB31BD1447222EDF76C004F76AC89821C5EBDF23B869F05F34E8D H_OutputA = F1104109A85497FD05B5C13EC681432C69923B82DC84110C12BCE610DD49CCE0 DRBG_SeedB = 391867DFA1A5666FDFFEF94A40237D5CB68983ECFE6F8ED725A71444BFEDF7F1 H_OutputB = AA9DBDAAE9AFE11A0645AA58A745B9FF11977A4B9797410F010814276D033724 SharedKey = 4448A7F8A16C811B69C074B51EAC530F089DA36ACEE969D7F1EADFB904EE54BE DRBG_SeedA = CDF7BED078D06A4C82E15F06E6B88FC6A1BFD35CF87B8352B5F0C118DA869B7A0FFA86BB4E015FE800562DB9EF25BA1796509E3F85757467EA54202E82182579 H_OutputA = C1BF1040047D4F099F0F7404C562E5A58881596F1661C4C38CCF5D67F92D3538 DRBG_SeedB = D353B7F6D079C4E20BDCA1895ACD162F758D09149F1D1C972E054638F4E426D0 H_OutputB = BB21645271C02A1C52BFF3984C4F818FA19075E4E7E3D8028A18BC482F22B6E0 SharedKey = AFB65CFC5B6FC891539A3AD9379E6841EC80F9FB485AEDEDAB545B61CB279CF0 DRBG_SeedA = 22ECB2BBBEF13297661ED47D0F2E80136C1F962BD84402E9FC84A938C3EC909F6413ED4EE8F6934312BC850AF701F492F91BE68F126E27C4017E5705CA39C4EB H_OutputA = 20244692EA708EDD8D8A15D1A7C09230ABD22744D57B78ADCCFC295088488BF6 DRBG_SeedB = 03AC8A463A420A4089415BA91FA97DACABB4D7C97B97FA5CAE70F4BA6F06BF68 H_OutputB = 519857A724717699CEFB624FACEAE70FD79C575DDF1F8DE6CBACCA5A2C1D0033 SharedKey = 36CB5664D698F69A147B670906C531D702F1AD0CD46ED84A07B641B64ABA832B DRBG_SeedA = 22F66534F88FA86BC53E6435675DA555B4725306CA612694AAA7361C20FC2250A8EB9F22CBEF6AD8CF331839533CD1DEB80BE13896EA275FDA0FE7FC3EF084C5 H_OutputA = 9EC2A883540B5940EE789F358050DE777749B3198FD4CE40F523ABE2ABFD4B30 DRBG_SeedB = 215EB87A8AFC0E0C99251A1C4087FA7D81E9F3CB7F644C1038BCD0169A60CBBE H_OutputB = DE64D1530568FB30ADDC4205C72004F6226F88072EDF60D3F3DC249B029DD14E SharedKey = 2BE123934CF034ED8200884FA6B3B1A9778F1FE65299B4BA003F5297EE9597AE DRBG_SeedA = EEC89704344804412AD282D3262FE806CBD05A819F7F4349AE155817ACACE7C9F139B1F38A0F9349ED92F04CADBB716A174616F379CDAC1CA929C7788D15C2FC H_OutputA = A75AE9B47D351C64D434691CA8776A699ECBA9A25E5EF685A05334A1E7360F9D DRBG_SeedB = 85B98A20556E7D1409F672C764A4F0457FF099EF2B777495F014C09481AD5BB0 H_OutputB = E5D07AFC9241F9E7ACFDEE65E2AD0AAF02CC63934969E4DBEF4BDB0445618112 SharedKey = 2658952F52B4C863C8DC5E03CA2E0D1446783099E9FED7EA30E704ADE5FD697C DRBG_SeedA = 00DF95110DF8F7A6AF7CDEF236E80A2F44701F2BE4C83765710135C77A9C9E5DBCD6D526D4E79A49792675994509C52B66A06B7824548474C768D8DF64B94CD4 H_OutputA = 9F102FEF1AFBA5C1460D70F7D76650501E767C14D9886945560B82B382B167A4 DRBG_SeedB = 3E28874BEE349D57DC01A4FCF3032E141650B31BAE0F7595A442C2AD4FED9443 H_OutputB = 1EE24CE241F4B88CC5114D714B19AFCEA884C4B2E2B9C07850DF60382DFD87EC SharedKey = AE7949FF5719FC09C13BCED2FD2C1AF8B6F399ED38C699549F5F95B28D7AA061 DRBG_SeedA = EFBF4865E5C0680DC649A6DB9236E6A1A0D05F1D9B1F466BCCA0B6315588861B815D2AE4409EDAFDB10193FDBE97C8978E929B3BFF1D6C8B456EF327BE6F25DD H_OutputA = 2C112841F78D7B14F6A01D445C07D9387596BE98A990A6F7A88B1B7EAD7A7321 DRBG_SeedB = 0A88A11E152B53297DCC3376DAE706412E0AEE885E680074BC0E5730838C1B56 H_OutputB = B17C3FFCB181B93B0671827C62C74837DEDB717FB5698C5EB2BBD2316BCD381F SharedKey = D7FB65B802419E4D205B28632D392A6AB7813225EB28412C070CD2A795B85229 DRBG_SeedA = 4CCE92C8F0A03A05EDC3FEA0134D346E92FDCE7362679F77BF8A5B13204C4308C7008F5745E69D0E379D15794A73EE9B854F0A7AA19EC240AAC477F700A7FEEB H_OutputA = EB1B0D9F40A00DD816A81520F1F7426D14AEA03E1E7C3DDF0C66D135825524D3 DRBG_SeedB = AC8E5E1587D1B7199843E588D4D51D3109793F40E9F12A4651B234F6AFC8815C H_OutputB = 6BFC6D75630AF0F7B4BE3EA175C72D17AA9B60F8FF6D6CB754C7DF1AA3539EB3 SharedKey = A6FD9E11F3126D8E27C7DCAE879BBA6BA4DEDD6559F07EA0B9B9C44D55DE6215 DRBG_SeedA = 92CEE2A1EDE0A4DB78404ED182544FC6A6B2B50F93084CAB89FF2DC0B50A047AA4CC2AC16EB41E00D70EF34A21C50774E803E800A5CC8C07ED528BFDF57E69CF H_OutputA = 6FEB58B70C957325704D617A345416AFE3E659ACBB3456C244040A05E7233959 DRBG_SeedB = 2260E8BC84A58126ADA2211FF7133CFAED0929A2812BD6BA8C71850093FA760A H_OutputB = 8BD8EE94DE39886F9E03D1783F35685005EAD58D114A115631CC3FEF7C6F5A09 SharedKey = 644B9C7B37C844974FDD65FB13842D8BDE3C0205D3E895113D974934BB99BE18 DRBG_SeedA = B2918DFE295A62BEB9C693D55B3304FE03FFFE2FBD7DFC05DE83C7762E950F45F4BB0EE9AB02784851ED620E800F3E8857AC693F7BEC07B7CA58790867C70287 H_OutputA = D0B17241117D8DC7AB3A34CC05D05C9F3C4EAC76A8153C5E1D6B281AC89B3FB8 DRBG_SeedB = 675289E5CC6D7ED1966CAB59CDB0761B4419ABBD9F92C8D342439BDF5D855585 H_OutputB = C35D4E3E2D50F96A7E8185435BAE8432CF45F46B3CE17B7E177D47E9B9817915 SharedKey = DC3BE5561B594D62EC4AA2EFA7CA8563D5A42C731CF533E20DA3D6391AC92CC8 DRBG_SeedA = 6550B24F6AE4729F4D829791C2672204E5C65DC02A9856257A292DC27626224912CF6C4FA70F7BE10A549B0B1141C8D41694DB6148C2FA296FAE6779B8B60F2D H_OutputA = E7CF64C7A488161F8C8AB8A246C485C13B08A712492779BAC057DC14868C53A2 DRBG_SeedB = A198E4AA2A969220B408B970F70BEADC6E2FC4FDD6C34A1C17BDD287CB2607C3 H_OutputB = 8D271223509E0370F3B3E6EFA69DEC914263D00F21DC056AE3DFFB6D8F92D785 SharedKey = FD2D339C5634FD958F8701A9F0D94305BC34A3E7A6BFDE848B11E083634A43AA DRBG_SeedA = DB74A009FB4F83107C7E19B924D1B4C14FDBA59F5B6EEB913BBAF4E06C06D0D82951F6B89AB074A9BA16130783DAB5B8DD611DF5A7210F0152DA48CAEBC2D837 H_OutputA = 620BB3FE4D449C437A1289A9EA8E882E9B3E9C93AEEC33F3B19968ABC344CD08 DRBG_SeedB = 74962629C5034495A8F7560892F6C2261824776A59277E82D2468C1CC943B29D H_OutputB = B06AB2519291AF9112D1AA7977C0C0EBD1E609288DFB8189FF32B13BCCB66B9C SharedKey = 208300DEACDC5A412DFACFC83D03FDD73363971D08D62906B9279AEF43F2613C DRBG_SeedA = E1B36FEBC5F20174A35E7902ACBF502BDA96C3817C7EF044763DCD740CADDC4D916D85A5B14277A11E1D2A63C2612DB429C84D8E0B76C2CB3A1BB9E347600DD1 H_OutputA = 78AB7B4F5265CAD84DB0B9393DC49A2DFC1140AFF0B46001711B9E50D8FDCDE2 DRBG_SeedB = 2C3964DAADDA3EB1346178C4A17A27950BABAD46176D21BC5489262B702F0127 H_OutputB = A6D8CB3A44B4CDD4FED7771ADEEE0A0474019E23433B018255B26D2B1FC2E4CF SharedKey = EDE54EE7739CACD7946C2A2BB8F58DA061720986AEC68D64DF0ED3D02AA1D5EC DRBG_SeedA = 94E2332EB7FBFB17476F0A83BCFFDCB534774E1BB20F0A50BD32B491976DF72252B2A500A5ACE818C9F14DEDC65AA5DF4D9A1A2BE1F9E6DD51ADE6991314867F H_OutputA = 5180CF98D991D0D5F46243A38352C404E447F965D7778393DAF3D1416FF19516 DRBG_SeedB = C46015D87EE0076632759301678E1F0BA6E86C192979B36480A211DA0C9883B8 H_OutputB = 0B938EF419810EC33AEB10580101B045605DD41422FD77C189E6B6FB85102728 SharedKey = DEFE556DCF3F27034503E0B9C7B1A6E35CB60B458F9FE0EBAB3E0A52C0830BE6 DRBG_SeedA = 113907A8817FE093F2ECDF80AFE5459E4EE136917A0D2883A7C4DADBA929FC3291A564C4B3F72A5C15AF84895C6A7CC3AF65968523C1833B1193BD01302996CE H_OutputA = 00D1630C41AFE3EAAE112C2A32819BEEA5C98B1134B19EF685C75B1626B82B96 DRBG_SeedB = 9D1CD26AA66DA2F1E1BA78A47C0CA7AD39E5CCCA6280A72FE946E3045B5D87E2 H_OutputB = F3C3F32E2083D4CE59FAD9760F053E51FE2E7F933C476EBA6E5BD3FBF6628D94 SharedKey = 1111BF14A82B4BF053DD729BB5FC5121CEDBBA42EA63150ABA7934F171F7A960 DRBG_SeedA = 6AEA42939D92DF54CB08CC2EF7751FE3338C1BBD1A90D4E8F00137D67567071664C605AE1CA9AC85E55670FB96F4420B5CEFD16D2235F66236312FDBE6015E72 H_OutputA = 215FF9B9AA225A26585CD246A7E5A02BD672B4533E84740F07B01100334ECEAE DRBG_SeedB = 1018DBC80A958ABB5D48BD5FD3287FAD72978BADF5AC8A6AF82B1B1CC317DB11 H_OutputB = F633B0CEA76C3B161B8CF4CA9DEC919CBBFCE4EEDB68DB56FFFB0890AE5294C9 SharedKey = F46FFEEE6E81CF175DF52A320964C8361556CC3D8805411AAB110A124309017A DRBG_SeedA = 947A168CCA502D5FBD6A78D004CC5CD4475E9D9BB0F1389C7E24AD1DDB23A329C5EAAB07FF76B3E2316041842C26C49905B592D1303AE3F5DC26AB676BC96CAA H_OutputA = 7569B55CA25293C5C4D23C644D8E4B708189F861BE8A4E220A960FCAB2558FF1 DRBG_SeedB = 41823F94BA4860CB6D212B7CF486F5369D691AE2B30FA8643D7E8B9C2835FB99 H_OutputB = 3810BC90DA4F301CD41EC56BA21C03E4BC0037FEA2C18551778B3F0AE57345A5 SharedKey = E382934FF4E018876416F688082B1F7429D25F92CAFFF1BE92A4E35BFAF7B696 DRBG_SeedA = 3F96196994456AEE0CBA53AD21CD580C0F930F50BEAA100ED5096E8069F9D6BD5F655442D93F91CEE0F31D58FCD39F92A65A936341D47341CA0616A2E327380B H_OutputA = 93ABCA547D629F45E0FBAD11F944295C4ADC155CAB714C03F4BB487E3DE219E9 DRBG_SeedB = B20AFEEE80C9B6602E05A28B8E3BF3FFFE7D6C8B795882D5EAA1BBA48D640C8C H_OutputB = B4E675009076469B27E0CF6CC148609C7512E54104993D79661D6AAF908A4A02 SharedKey = 4865D762420341D198CE0EA0D16975B45773EE36A714826EECD5B846970E5D1C DRBG_SeedA = D5F57A91AB116F024A5CC34BA689D66E0C309FFD97F77A96C13D2C37ABACC8BD095E50638980DD3CF43512F12D4D3F189331984B11C8AD63CC09D11D358067D9 H_OutputA = 3A7E1D8FB7F4952844F1E28CA84AF8CE21D00032A9CAA78CCBEC9DBA2C441B8B DRBG_SeedB = 314DE09F803C3EB25AA39DD9E6AA6D37A87648D1B272ED2C118F939CBE16D7F5 H_OutputB = E05CFF51A556053F69B3503CDB4F6F203013153846562C1451C098C161128DE7 SharedKey = F5FE22D08E323F460AA27DE216C31E0A9F5BFA311B9F3436E0A42AB76D02EF1B DRBG_SeedA = 017F97755AD4CDABF76B4F9750CAD9CC59002A7B58A5DE825BD5EEB96173C7E238D262A207DD07B7C328A4637BFE6E6E13FAF81B60D37CF29701803E460FD9D9 H_OutputA = 6F77AF2984F006AF7F042E3A9EF05B54CAFFB04FE75E14B251C8A8AF0AA01AE1 DRBG_SeedB = F18CD2F2904A2A2E1BC94014B7AF3A7C0009962B43AE145BA568C675BFA621E5 H_OutputB = 1875F160749E191F22DB1E0F75B39E8F8B44F0B00A3F1215EB9CB35EBFB72735 SharedKey = 4CDE89F251F3A1507AECBC317AFF52CFE8671745E588FB392CD10656906C714B DRBG_SeedA = C07047FF5E6BA9E6A6A76B471C3425A60D68BDAAA5FC79FB8F64957F1B415EC4F11483459CF43D00E29BFA23A45045203283E1D89D3BC8E13C44C8BA26A41A0E H_OutputA = F546F94186BBD17E40080EAE066EA252100809F8E3DA55851B3F5B05BFCF0CE0 DRBG_SeedB = E933AF495A2E200BBFA5A6BD5ADD27029D3B2F5D104E7B4A6FB1507367287376 H_OutputB = 098D24BE421A8C7F071863D6F32B59CC92A68DAA453E94AAAC19F0BFD773CBCE SharedKey = 8260DBC705203AFDFAB8762DF5D22D298049EB7C4A55F3E87142B94609E31AF0 DRBG_SeedA = 1DB4160BCCA1C6387C0C9F7D877050B4ABB7D8AC23E3C3F19BABC252BD862285FC98004952ADFF3D7CD667BC230D0CF6BE99A5A5C6E139DBBD8A289880B4F793 H_OutputA = CA092833623242F93B863FF103BE6659C02DB9ADE90ACE91F583A14075DADCA3 DRBG_SeedB = 52ABE67333B1DF58A94E46BB48DF063199B823DFA9A9CE6BE4A4AB6971626BAB H_OutputB = C616F8984907C1A68FDC5453D499E485A841CE7BA821B8A533921385FBEF7A6B SharedKey = 088960A3BEF27ED744F6DFF62E384805DB437CEFF15BE0A55A66BDB8F77ED42A DRBG_SeedA = 6161B70E786D637E280E3A6E441A65FF0570DE29FF780D409BFE592FA0C7CC0EBE6A1C4F8973F2EE757A99644AE1CE47CC641290A89C8EDA476BBF3EED0B6536 H_OutputA = 596E44B8A1637177A83728FB6955ACDB5F9B4F893AD955A600555400EA4A3BC6 DRBG_SeedB = 1608B32EDD315C8ABE329F6C6DBBB79F91B89736C770A1A964845823777A5B52 H_OutputB = 8FED5B59D16960DD6CA31B0EF32784A235F20797495195FC75923F1377336562 SharedKey = 84318249AA5B42B6063D600803C7CB5A7D61D56E96B1C1F07BC207CA1E610578 DRBG_SeedA = 9F825477670DE65011307CD5152F3656B8DE14FD8BE993DA10351351E7C118670FA3EB09D6AB4ECA13E1E388A4A19DDACFB129637DBBAAC1EC9EC8A0A73254BF H_OutputA = F96D83A4DE1AD6ED6B3DCEADA962F87451ACDC8A0EF56A8FB495F126D7904859 DRBG_SeedB = B00E428617F4BF1245ECDE9E736F177E355DFD84A373B5057453D4A1BADDF087 H_OutputB = 7D9529B39E83EDD89F3818A6BAADBE458EC933864F3BC8EBE3CFE6953948B24B SharedKey = 4E742E9671F3344A9E79E26F7D67F39B7E6FD735AF600195D5204F09AC4CE976 DRBG_SeedA = 85AA99B1F7F92B0A3DB0509B05052DDD766A1A92C18B2FDB002C59B4FC2A0C6040E612D68E92A6C120F4371BDFC363DACA1C2155166C296EFB15CF29141D82D5 H_OutputA = 15C03740AB4958E632E12C48336984C8794B647757053B655EA459C808EC9279 DRBG_SeedB = 0986AF26B1720F73F0F881752246221309086EDA823933D28823809C4848EDBF H_OutputB = E533291C0AC1F8CBE55BA84268560FC53116406620A39C4AF404B2485AA35D46 SharedKey = 523C16ED6A0437FFD3F6B864B85B29742EC572DDB325BD88307C890A0C7411EC DRBG_SeedA = 1F3E8C0D7BD965A359519FEBBBC68EF9035A1600E8253B7699F3A7C9C26FC56FEC6299EB9EA77DC8F799A3E4FC34DEE68EBCF7DBD2A6A7123BB1E28668A9B78C H_OutputA = E823DF2A8A7992D49CFEA70E0398267E003A9A1B2A9AF37E7D50D7970BE6C3A8 DRBG_SeedB = 764CE5E50EEF3CA1F2E347E382D8A02429090D75DE95FDD6CF7F5EA4A960E222 H_OutputB = D9C5C069C9652A7F698DDFF12ECD12B9F821A22E91199E3C32B3BC9424CF1D8D SharedKey = 7449CE2683AB93F61B5407190DDFFCCDFC99E0A7AFD7A6541FEAB1BA73992A6C DRBG_SeedA = 88B6843F284735B025E829E504E1BE4369BD3964D19EBCF3EFDE0D502B6F5C4C80D4CBAF90CB38839AFB14C4DA9C0291704BFB907FAEF980AD8C975491FF68E0 H_OutputA = 2BA640343380E20A4C137EA57BA11A461706B4C7147AFE0F70F6EDE99CB8DBE3 DRBG_SeedB = 7AF38BEDE3DD78175A060BAF933182FA25D49EA8557EA078FF77213A00FA1B11 H_OutputB = 0587224B60F5A1CE98C1A11081F80CD9583229AEE545E1675F70098A060B9A9A SharedKey = 2A9EE590257F7A061AA929D354236EA16CC7569F46D6DD004EC789818EB69095 DRBG_SeedA = A77E22F9518485F40D2B9153499BACA51BFA2100805DAAEF5A8D31C94074A43226F356BB9BB7D740368B75962EC123D0EC37CEAA545E5D8252C20AD6948EA549 H_OutputA = 162353CAFC4156FF80B3B298A86B844D0E08160E82C0F695712539E673F9FC6E DRBG_SeedB = 659993C9C369A11144C05BDC07BA105EB28DB1D56EB6A2DC5D27D34E1951E74E H_OutputB = FCDD1AF41C3FBA13AE0149F72201547D0DDE72487C2334C50B2C553F990C9750 SharedKey = A9D7B745847687A919CC57766204A2DDE424C7860A4E34F5A2250C78A76B3733 DRBG_SeedA = 1F23FA10C164F8DDB0EB60FADDD33AAAABD31FB9CBCB1561CE725E07D1273A8AF2CC1A94C57E5FDFDA76FD380B0E9B16B6D38383C627BD53457F4BFF8422E6A2 H_OutputA = 21CEF2961E02B62B594CC323FF606F2BBEBEBFA5B9CFF821997A1F04AAF7062F DRBG_SeedB = 399CD6C5C6CCD43FA8B4CB1B8770656FAA7353E84CBE89B6F6B4855A7B95AFEF H_OutputB = 41A48B264417FC06112AC08DF50CE2D2F4A0E7CB4738EEAAC3B27BCE7B84BC58 SharedKey = 96007F4205FAF0D5D9A9FA6C769AEE3089BC23E7E618D5ACBDD7CC813154D437 DRBG_SeedA = 61974AC041D2BD1EC709C1636A9D610AF7BF2A91250F46E49284EE5C883D50D6E454E2F7E1B21733CE4957BD25DF81777D466271E2291043254B9F12373CD106 H_OutputA = B3907F505FFF42029BFEB0D05AFDB76A24555C1406648F63680082DD66046118 DRBG_SeedB = DDED90BF1A25EBB0EA28A82627272CA86D20D164CFD9AE4E414768BB02C4DD7E H_OutputB = ED7E08393F6DAFD2A3A02E931F6E62A8882B77E0ED3BE57B123C4555BDFB9DB1 SharedKey = 697025D73166952CF2EB9E05D92CF57F4DBC4F91F75974A1274F837E4D55FEEE DRBG_SeedA = 4D24E8631221076B4D4ACDA2CF0A0E0F73F784A37529BD2B87FF081262B1F6C4CBD6474DF571FE9E5ACB5C071CC09A15D4783A5B00DD7BF93BD35563A13ACA4F H_OutputA = 95C13D15D73776B1CC1AD6A23BA92D5C73766D87544507156B76481C8C043DEB DRBG_SeedB = 77A913C8531363C22F1B5E83853817F7B8DC3EEBF7502094264FF39B2BDE9EC9 H_OutputB = 5C6738476943B406A16496ACC1F233974E6EAB19631F507285AFFEF927C56F1E SharedKey = A0F78DF524621DBE498407ADE8CD50A9535A34B864B84454C8F00DC20A06DD96 DRBG_SeedA = 12A2C5777AC053AC2A5201230527804B80103BC690333D62201D0D931D81B55FA4B8DAE9C70C029B3CB3220F721B4F763EBCCF1E25AE1D04BF2451783AD06A77 H_OutputA = E277AD04995A7D14A55753980942C9E08BF53BD4A623CF5C9E0BFEC66C2894A9 DRBG_SeedB = 36220070771AEDF5D0BDAF3BFDCF76E2C06AE63D59B7AC579056F78AB5A0798B H_OutputB = A1B2355787C7F944C757AF6039F37B9FD8837AD3E64E8BC9F9DCAA57CFEC131D SharedKey = 87C8F428F05201931AE4C811A37342BC9E37BA36DB0B69F94891476DF2E359AB DRBG_SeedA = 67B8BD743BCD13279CDB4D9E30FE50709E3160BE8E54A02A60A8EAFE5A03C56CCF1851D5223DA8FB8A09791A0AC27A386E218566BFB21687D4F24069D1CEC12A H_OutputA = 9BC5983D99C94B5853C0910BB21ED846125F02DB6EE109763DE0547B8AC3E425 DRBG_SeedB = CB0BBCDD8F2F3D98B9DD11AD6EFB74949BDC5A0599339145BC6C32180A8B43B8 H_OutputB = 8C30FE1C29CF99A58145800D49A2014755AA76B1B88C6A24EF9CF4D021DCD3D1 SharedKey = D32FFB25989772C69997F28ECB471DBF4485A276D94C793934AAB16E80AB78E2 DRBG_SeedA = C9A84A28FB25C3C52A55FDB06C6D52051823230B788A800B3D69520B2D6119D69769A0E9B789DD7E87862055F324B1CB47664D4AB5E613E687AB596F7555722D H_OutputA = A8A7FA6EFF629C9BA3280C0CF5E54BF297155C37BF6EB90E9BA2A9CD383D7F3D DRBG_SeedB = 42324ABE570C7610DD31A17023FC0D28413301B3ED2BBF1282CDE6CA3CA254DD H_OutputB = 58D5F57BC2ECFA7E2974008F28B6634D2F5508258F7D322033D0BC4E7FCF4189 SharedKey = 8299F16BC494C74AEFD7762F44A74A3DB4673BE7D4850657157BEFB873100D8D DRBG_SeedA = F7862544316A76B9F0EFA083C36C8E24276B6DFACC553B03C3F8DDB5107AD4CD70BC03AF3372D644921BC117014C0CE03EA656AA963A2727AA916ADCAA5C90F5 H_OutputA = 6748AE47F5A967590C4D0C4B5817BAD85AE06C4C0B89076A564343B30A18E0FC DRBG_SeedB = 31CA425389045D4359E9DE901B10375609E7847FF0958B416FC3F7C2BF945C65 H_OutputB = AC79B9AC3F76A1E957FE77EC0258F5BBC59A1D890DBA490C6254A53D84B15787 SharedKey = 960BA3A6C8951FAEF2B2269D4C243865725A12DCAD09772B03A21328F7BC3C54 DRBG_SeedA = C8FD466627269EF5588F5656D39069A0F096B7545216076B555AE053455CFD4FA018079876AB34469C4D56856D1F02452CEB0FB7202AD52FF9E210A09D61BDDC H_OutputA = 5309642C50CD973DAA606B62ACF89FAF348FBB2F5689E548763A0EC8C351D1EC DRBG_SeedB = E9EE11937653738493127A3C0A8AD0FC978034B87C8235870C09A6FA2A10779D H_OutputB = 8B7AF60F42B271F3E32FBB52893224F7497871E9C4289DA10E8D09391B47407D SharedKey = 580061F80B0A84FB164296994748D53E7E1BCBF906A8264CA198B40E097CB455 DRBG_SeedA = D87C3C76600C345930672A628506719724A58C5708BE4664A4BFACEB6DF2EDCB7291A00F9743C181004D07CF6FF34DCD5CFB997EAD067FF87EB6ACB32580A6DE H_OutputA = 9788EACDE8F1D8FD2B2DA35857E6A7D690E05FE7A6803250BF030C1EE32024C1 DRBG_SeedB = 9F5A15F5AA06650C8069388111CA9CDDAF62A0E8C783E6E15B56FD7FE35A6C84 H_OutputB = 67D3F3C86B6E40E8A1EF7F3F87E4F9BD58A9DD7705DA976C3023C14768683154 SharedKey = 4367B6D0BEFAF6315C83A62471D86FAAD39D1359929D6C65A6DC097B432A6001 DRBG_SeedA = 999EA2231CC98A08C69F597F7D7554BDA3C922F1DA6FFAE4ABECD729F8586D7E6A7C6DAF2795EC0EFFCDBD5D3CDF50307E6BF8C01FDC8E3A9B4E4286EE2BB234 H_OutputA = F6EC77698FA7E90C41404D0BFE4138772366F247F5A61907C6A854D4060CD224 DRBG_SeedB = 5D273805A2E3738ED30F1DA35EAA49A968A1F0E869B68F3F3B5467006156E721 H_OutputB = 50DD2BCBCF81425EB8EF8D1C96DB0053FD3CB6555866A94C1A41B5C50E24AEB3 SharedKey = 03DC2E742D5A1EDAA22E71259546644CDEF303890A6F3B99615557745C0D3943 DRBG_SeedA = B2CDDCD427676293367669A87EB7B12DB88176DF201F03C559798747F04BBA0DB231C040551F4C4354428680D4AAB6793A04E77855690662824F8249FB5024FD H_OutputA = 92EAA1127CFC1088415A00C986C64B1641F52D211BE9243FF6456FA703834211 DRBG_SeedB = 672C52C164DEBF9B10FCA7559565DC0FD7AEA315C1FF6A0F285FB62725F1138B H_OutputB = 9E2E1E34F1038A770ADD65A041702D61BC33F0616CE36CCC40850BCE46F2F07E SharedKey = 5F5409A1627C2C8AAC4D35ED7B8159C45705B5922AE69CF80220A6F59A949CA4 DRBG_SeedA = D3CD31EDAA4507A00CC2F95B36B33E4DEAD5DB3ACCF7D6DDE2B77FC98FAD56ACD4F2F43A56DCA97FA1C0396309E4A3502180338296ACEC00CCE1973EB56EA51A H_OutputA = 8F9268EDC02F9C042AE1C00E99A43B20110888EFA0F277A3B6128270D8B4611F DRBG_SeedB = 22164146D3B1502695A4D35A88A05FDD74EDAA1ECDF7578FDDDAB6F753205477 H_OutputB = 0906882F35B12C4C021D43A3E8B2CCDB1DF17229F6A83869EA04FEF4C5A50FF9 SharedKey = D5B8C5E104F1D00D406FDBA309B073F0C8ACFE360A31E07DBDAC4E99DADFEEA4 DRBG_SeedA = 4650BC6EC0C0127385B3BE5FCE28560EEA9B5E3ECEF8DE2B4491A4C91785AE0B9A8C74542EED9ECE2C971CF67CF9FD753A8544F3B695DDAB327F49047358C55A H_OutputA = 722F182B1167264FFA63FCCB4A22785221AC1BB488D1223A26ED33C8AC545E17 DRBG_SeedB = A591B8F2FF4B9591CE01FEB3EA7F208FB6D280A3FF0714B15AD3F154725587AE H_OutputB = 41C152D1EAA9C53479CB230997AF5B79C9B894229710D4195FCF1A4C74C2C215 SharedKey = BD01DF2577008C8CC49F98E4DC2234D79973ADDD7CC81B9BD20326552A63578D DRBG_SeedA = 812422CA72C2DC30305B5151B5A88123D198DFB09C773AE54CF239A552A51E976F19D273915B5ACCF3DCCC9B2FAEF2A1925E972ABC8CE64AFCE69FAC61F3714A H_OutputA = C729A8BDB04D80150C2AD804C9053ECDF8CDB5DF0E88B51FE02BE620D1FC8BC7 DRBG_SeedB = C454957E4A0B400EB3AFB079697A455737FA698A6A84A2973B60F8FDC3E94636 H_OutputB = 292C35F3B4C81C4A05FDA93E49EAEB1884DE5C405F923F2C5F421C5A0F897E0F SharedKey = A3E55F6C4E86DF7906D07970C49F9F04818314ADEBFA4B52198CDF8EBA273B6E DRBG_SeedA = 8AE391FE69187ED0D173CC6247B6618282ABC6EC286687F6F6E7796D9E7550C7B5EB38C14359BA71B510AA9DDC588C7C7062343F80C15AB2D38849F1596ACD4D H_OutputA = 59293A335227728CDF7E051B84C6194ECEC592A3E8153DEDC78F12BF5DC4572C DRBG_SeedB = 9F76E74C3F8C436BC23A5E3CCFC8A506E80C196546DF62E551F26CC2EF34BA1D H_OutputB = 2CFA883D1262229BB3ED52C22DDB7CED8862DC57F11FB55EAF0DFB48E31E031F SharedKey = E610C3EBE7EA007251506076E935F5EE23E6A67C44890A4F81AE615736C071B3 DRBG_SeedA = 070A2D1DA7EC4A60FE9BE7C181F96868FC2DC0C9AC59CE9AF9761F1413DBF813FE62676DF43B70818C3F2B681A09CD670D896F166FAD1B3C7412DD98C8A01C90 H_OutputA = 219CDAB50983860242CFC5D5495E3110431BA49D7DBA7744F67C32264259B90D DRBG_SeedB = 72A2AC7825B90928D694BFBC6D910FEF61471F7EF7F16E8922F23515DB8B0577 H_OutputB = 3C50FBE863CF33F5C0F4D2288A75064C65DCB741D2CE12CA0B80C9D1CBD0E703 SharedKey = B477F3B80FB48FA6D929AA01586B0C090FFCEDD8548B5ABB3BDEF2CEED532727 DRBG_SeedA = 04222836C4844587E80BAD0E0DAA39605F8D8671CE84C32850D0629C25CD6807AA4BFFF26A57582A8CC9BD2F97E598B22607F9A2E6BA8255FDD4F5A1050F38A9 H_OutputA = EC27355DBDEF33C2BC91751F60F993D8BEB976F596856D1A9F91D824002C35B2 DRBG_SeedB = C46ED3EA2E30B7519DE9B44B9307545BE4E4919C1DC0CF1D377DB060056C441E H_OutputB = DC57A441390DB42F6ADB9D601173B51589A257928151A93FFB9C5E770DC50F64 SharedKey = 7C81FEB4C49807230DB0E12B9C14E792966D3CEEC327DDDB7179FC6BEA28BEDC DRBG_SeedA = 3735C12EE3AC694739F5297C13B7031437DA73E2EA72DF6A3B2BF3015FF2B4E280F497088B1A2331E943DFE45A14583A5F4281B3E747E6CF8A0E8C1B20BFE8AB H_OutputA = E88F507B1CF72423D68C6A8ED112ABE96B757FAAD569964E7AA940D647D79998 DRBG_SeedB = E79783AEB01D6F01EE1F47EE66E80F434DA5FCED356E3D92371860C922201B22 H_OutputB = 754E91D8B3583F270299B7B97A9B03E4807D6D668C9A766BDD20F500950E10D9 SharedKey = 872BBD45C392440E0894D9D4226E32E92367F58932819793412834568AA02BC3 DRBG_SeedA = E61E14A2031B1B594849AF8C79B61AD17EC4793C5BCDC9E8DCDFEE61AC5B47B7C61B6D13B4D6B3671C389483055F7BA1EF5D5DB0723B9280F21273A064319D74 H_OutputA = 1E3E17646FA03920E2CF239191430597CA456A991E25B302A5900C1A00C0741D DRBG_SeedB = 571D42E519FE5390BC1A8E8899EE1D6E88E6029A709574F5A2D15E0D568293B8 H_OutputB = B301A0D9BE16644F5067B41E40678CE54A1EB87116AFB4E3E383F2A65715DD0D SharedKey = BFA42774CEA60771330F4F607BF595B92659987A3C271222C016F4FDE857EEEF DRBG_SeedA = 25921A5F9067917A09DD48B90AF4BCF24D2762483ACB4D86C302666B77092497FE1C4E4B5601A73DD96DF72081782489F807A8B1C0C501AFEBB3C4A84C03A5B0 H_OutputA = DB537F1688F1BFF7DA4F7E8E76190E25A3C0992742A29120D38E3861495637F9 DRBG_SeedB = DC36B06A8037A4A87E915D41EF8550436B0E1C6EC6B6561382379B92D5C6107A H_OutputB = B11249DAD9C8F9C76DF950E48F8041873EC67A637AD86B1E6AF94AA0317BAF96 SharedKey = 3F97DEA860AF175C1637B8ADF3A317AB0B451AF07182C6F7DD48A4647D2CB005 DRBG_SeedA = 66EED1873EA2B0C49BC870431C3A726F5D30894F65A6B36C19EA4A0E486D048E00658CD36B8F101248E6B3BE74BAFEE6DA831FD49675EBC4D82D4D27B44DD4EB H_OutputA = 4D2B53FD09C1A83B9046CCD668AE6EB0FF9F52FEB12B27AA1261305A6D2B9B80 DRBG_SeedB = 847919314EFAD18717CE03AED97B401AF66456CFD21608A14C6BB74723FAD8B0 H_OutputB = 87BA1A3C8B73D89FF577B74869A610A7522C2E9FC9EA43D2AB1B8E11CEDB3983 SharedKey = 0DA8110ACAB1D86851AA45D9B2DDEE795727C7C72514DB8242287D7E96E4CA0C DRBG_SeedA = F3BA65C6B6E91ADD05C3EF583914F9FFDBE246FECE0A1280DB7A82E73CD25E3BA67B6574F00E954E0D22490A91EF3A5C272F2AAA229BD522E265096E9C2A1BEB H_OutputA = 9E15BC0F139F16741625CF66DA396D7D857FC43444C6D905E0C44249A19D175D DRBG_SeedB = FAD071C456C621E888435E0809247D80EE0458BE013D742478B5619C86666E76 H_OutputB = 1D7DC8666B6A865C20C72670DC1F01B02C3EF42ECF24D3CC863398FE339A6A57 SharedKey = 44F8DB13469F717CD464864EFAF25857D3460919F6EC9324E1B3FA7BB3748E1E DRBG_SeedA = A02EC157B9E0D3314BF81D95750F166B3010A2EBEE4759F6A2C74B413082A3272B5BB928A0827DA60290D01FC6DD024B538D548E9354190973076ACD4FE1029A H_OutputA = 2FA30C163E8DD2BA7860294C91D7245526654CF6015C3E6E7025C923FE2FF75D DRBG_SeedB = 475C4B2FA2826B25E2A86E1BCCE7C25F1C59BF5C14E5A6BFD0669688179A4E24 H_OutputB = C9D9C35BAA93375B1DBD21B493F2CD42DF1C38D89B30C61BF9235613081CBC27 SharedKey = A850A9FE332326317AD3837E0D944117AF5940FFB865E2E961CBA05ECD75A6EC DRBG_SeedA = 05E4D8F56B5457DF618878B82A1E395298431C7A6AEE6E192E90957332C775A0584288034AE690DBF61DC3DDCDB2F939BEA09932E744268DB6F91CD52315D072 H_OutputA = 75B152AA2F7216FC1DDD249FD07C8464802833193CF385173CA252457D6A5855 DRBG_SeedB = 2A7CF849002AA454BB4327B8CAB827998FD09A7FCD36B3B126B03C6AC1073253 H_OutputB = A7D5D8267C5BB7B0B89D6599A3875E499B757ED6C925055A659B3E08002992AA SharedKey = 2EE3CDF0DAB84908F66C05A6A7D2775758C2810142D18669602785157D8B4C23 DRBG_SeedA = ED280FB095D50613EAB390E42EB088277A8B65A7A512D6400E66B190D91491C27CE52513B86CC3B27A76BF66F471A4BF70CB7A364CC3125A1847F9F594BA7C27 H_OutputA = F34F994F57A6F6A1DCD1CB7D2E5B49BF0652C0ADAAFEDFCECA2F36E58146905E DRBG_SeedB = 61FF4710E3F9399CA2C53628DE80C546DD404242036FDB2ED5B12784A7001540 H_OutputB = B4FCFB9C01DE8FFE44944CCBDE2513F52C030798FBE7A1EB45318848AAF646CB SharedKey = 41BECE988804C8822E003B70144FDA60A6A4DBCEE6D477539876C02B44BA0234 DRBG_SeedA = A3BD1C99AB0A2F1A10033CD2DCFFDE8CF698D009BDC8F8759A06C8D7105EE0335FA018D595D9077FBA2D141BEB83535584C0F71C1B2C86E6DDDFDECD790942E2 H_OutputA = 062B265DB93A156F0FAABED694F40D5B27BF39794C3F08ACE06C2348C3380C53 DRBG_SeedB = 39177D974BFE480F1CE9CE6BBF273B90AAF12E6CF4B6539BDBA6573D47560B47 H_OutputB = B4E2D31E98617B03DEB3658E19FFDEBD55EB32D891755029A41A30BE0540AE00 SharedKey = 3BB277CF4A40BC1D32DA558A3B991B386FB05F02FA9754F5A44F2F1C3B0ED439 DRBG_SeedA = D05547521A262DBC7E2C4A17185FB2D34CDE752B71C9B5D57216BEDD66D8AE794E14CB3A54B6DAA6ADAF13079B0180FE901E83BD66BFF49FE36AEBFCB998A5B7 H_OutputA = 2556550A955828DA11A70C62FA2257789F28DC34036824CC80B96D5F01AAD083 DRBG_SeedB = 0DCBE81240051679E8966AAE6ED43706769EC06FF042456EBACCB7169A61748C H_OutputB = 0FFAE30F6F3BF89AAB2FEDDB82051587442358D38DF8F6A42E616E696DD6B85B SharedKey = 5DDB0B9A5A1510D0A904E40D71FE1ED886A28CB14A006A0DFA683EC6DA3ED5AF DRBG_SeedA = B216E6E0FA3FB8F80E07AC2A4AF466E98360E5BA3BF27EABBC85E8C2E7A488723D8E942E014E46B14E308A660C2D3CA9FAFD3BD612F585CF177575D10CF59C2F H_OutputA = 7F0045D7CA82296515A1E8FA13FF82FCBDE2449AB2FF9CB5BC6E00E1F905136A DRBG_SeedB = A115EBBBE0086F844846C83CE88936CB384EDCA588DB7FD0A1F705814B973891 H_OutputB = E569777DEB4CF5EE43307F7F376C2064D0E17BF8781B88A0A442C1B31A7C697E SharedKey = 104CA2B609AFFE6CAFF6DDA74F3B03C3D92E11F11739A47DCEA5D5944302E05B DRBG_SeedA = 3089BE688698B3A4E2B6716D7D22E1A063BAF08124F8E4EC24D7919300CA48067A78F48E865910AA794F2652460ECC440D0D0CB5740DBB439760A06DB4ACF512 H_OutputA = 99B9E41B76537B2F51455D169BF01B7490E9A9C5B84606376D085BE326F71440 DRBG_SeedB = 360173F56E888DAB993583498DB05D2F799D5A645379B122F2CC5B9BA8FEA7FF H_OutputB = FFE874FD3BD10D27CBD5528CAFEB8D14A941D92A16FBC4C2A52FEB2B636447C8 SharedKey = 92EFA2F3541C58D4F69133A8336426D46FD8D1AACCFEB642DA6E899A2AF80077 DRBG_SeedA = 9E39CC2819EEC9131CEF7A51AB33FE145A53F2328C86C93388FBC1E336FD0AF45681A4EF449EA58780F2FF97E7EF558F9ED3F868FC049869AF308DE87838E40E H_OutputA = D61F88BC646DBB28E930A870D28B3E45D20051ABAF5D1251E372E30E7855DC09 DRBG_SeedB = F38B82EFBD69E5207332151891B3E29D89D0ACA39DEFD2409796C56640911A0A H_OutputB = D8FAAAA8E3D53B932FD30896B328DFD48399AD87DB5305F4A67490B4EF0086E8 SharedKey = 522BAE8D21CC95A666F9EB3CA17E1D295BAD65B748BBBAC1D79671FB401FEE61 DRBG_SeedA = 51DCDA165EC4A361D64E60ED7222E939622D1C2868FA223F1E3DA6198AEAF62A27473F528F7BEFE920D2801378579D597055E28E02E98B7F1837F0249EF4AC4E H_OutputA = 5C19566C8820FE7F049393B285080E77F56EA676B279645AD764276DF75688AE DRBG_SeedB = 4DC0E58DA32F72368C1E096C8BB62463CEE9CDF7B7BFCFC1C29CE3D043599FDD H_OutputB = 87238BF06F092BDEE318F5221EB958FD0C050ACA579CE0C54CB917A1F994D7A4 SharedKey = 8F3BCBF037C88F6547669698B4F7453EC5D933A48F22BE5A01589A9D62EFA7B3 DRBG_SeedA = 37C4A16C32238B40279D693942FDB5941336E86288065ECAE73A49F4B2CDA841B48D59504BC6DD8959732307B74F882430D129605DDB2F07E64D12EDD0DA56E5 H_OutputA = 065F86E3FD4D869FBB60A3CA26228B386B3D82C83D857FED4E51787364618482 DRBG_SeedB = ED30F39D3A3D5D0AF7291748427E682A2F9479BE0386859B77A1EC9545EF6584 H_OutputB = D62C64AC866BE8A03F30BD8550D88E2AE97265DCE9E8E848BCA5C98C4730BFBE SharedKey = 79FB8051AF0A2B2A61CF6200F0E44170C56B32C5C00DC8478E92D54FE2304286 DRBG_SeedA = 3398E26DC70B37C03E0D27C5398BE80476C37F19B431D827899767FEFCD36C98E694C7FDA699A672A75862FD25FAC45865FE177C7EA69C19EE5E71450BA67D83 H_OutputA = C840FC01BC3FB98124F30AA424EEF19CE7FC50FD5630E1DFDD78B6CF1628888B DRBG_SeedB = 3093E2A2509307A3D90202C16B67D6F67A5F17020A2607E30D5576DBDEF06EEC H_OutputB = D85558E19836E001D3AC9DF34DAC8005CB8816558BD00BA5BA39BA5A6624D2E1 SharedKey = 3E7F0661872FE7FF521F42159CB9800B4B99F933CF210193B77C074710BB562A DRBG_SeedA = 1EDA49354981736862B991780F627D9BAFE6348BC9F6AB6219E14B2BE06AFD43119CE3A9E8618EE08080B54B3F3538F9940AC4F385803644412A9C6C089B563D H_OutputA = B5BAD901F37288D90981FB87709FD00FCB473160E085B44F4B748739E0542220 DRBG_SeedB = 30536E2242E00BABF01B10F4C2790E0D690AA019513F6761FE43C2D03CC46276 H_OutputB = 36DBAD306099ED1B4970C38388F7851A1E8B03601C7145C38BAC57D6117B86F0 SharedKey = 6B2A3794381D8CB110E691A38E308D4DC2B023AE65D03893609D7BD5CAF0B57D DRBG_SeedA = 31479D16F563BFE61D97FBD70CEDEF9AA4F03222E231E6E47E3B18595B5F868AC9671C314ECC69DAE2F47A7F364B597568C1C176564BB9A6FB02EB668AF19B5B H_OutputA = C3FACD0118BCA0ECB3214E30637AEC2A306C204193B17133996BF1F66D06E19F DRBG_SeedB = 616A188FAB6CA14B7E7631AD750663175ECD211DF3F687AA1DF2771E40778612 H_OutputB = 6C921279FD2723568AB6538E21CFD263A019232DAC111492ADBCCEA01715B0D2 SharedKey = 01485E195A9B8558AF9669476E042FFEA8ADE5867795BE565D662854B52817ED DRBG_SeedA = D3FB1D3B0F4E54501DFB0C36ACFE9072B3923CFD7CC97C798B2BA0F8B4A3167E191BBE114DCDDB884034DCE9D6818B71C7C155D70D9A80E3686B3504B3AED1E8 H_OutputA = C03790D9C046EA15F22B6660F11BF90C5820AC5CED296F3A0A4CC22271535E93 DRBG_SeedB = 692B22EEEE3B674F0212623DD620C8277DE184EB8E98A2F1F7B04F231A08D51A H_OutputB = 76B323553972A64D52DD7B7F9930AA20602C3D5E1EB874A1BAF4F283CF0C9E43 SharedKey = DD18911E01B0A3239FD29A0E6EA3A8AE34C4AA1BA717B25AF31A79519212A46E DRBG_SeedA = AA2F1B1A826021771F181E41F06FD8B669AD61BF2A525073ADE0A8C380AF6CC6DA18AB303ED6FA532480F2C9715265691F5D91C38FF4413E9B55E45F2FE909C3 H_OutputA = BA2BE704A6E4DE1F0AB2F9997C9E34D719CC9959B4D457763EA415A4BB3E5C56 DRBG_SeedB = 20D7A01EE2F02A403E0A5C8F66AB9CEC3F656E41B4BE6DCF2DFA627AFA3CFFED H_OutputB = 89B2B88DDB37A0BBD0A9A31E621AE396ED2414EAA5D23DF4427327FFF55CFD7D SharedKey = 2578B01316A0AE3131CD5E89C4A1C71E40E75F2CABBF887DD452F656768E4E16 DRBG_SeedA = C55295A24FE3273C72E398400C3A21DA8B05F90CA307B8BC584A73D2F45F7EF0ECC91E44D0CD764458FF781AA3615F4618749497CCADF593CD8E20DA0D731D7C H_OutputA = 378172A00F9134948F6DDF4B7927E386A4AFEA7BB759C0013C5C78C5D0A92B2A DRBG_SeedB = C28412BAFA7496CCACD31299829A3E8015B96CBB0F2CE0C582EAA8D267302D96 H_OutputB = CB04C29309C230D7A85A07FC5F1A21D5A01967585A6C534EFA680DAA241D0FA1 SharedKey = 535D91188E15936E2127B166AC6545EC686E0A527B90506E82A1FD38D7C883A4 DRBG_SeedA = F82D850C5C99C7F6DAB956BC34C4EB7CB1D6DC9827F53DF7A647C3A05A375FDD0B670EFA40C197F4447CB3D5AD5D972DC15DD9AA43AB50553C7D69A6668F4689 H_OutputA = 3D994A7DD3C8C1FB7AB5B76FFD7BBA2D8DF8BB105E9E57244D9F23B763C78A6E DRBG_SeedB = A420D2436154C0D993DBDB171109C8EFC4E8833C5A82F714A5DE72C0778F47F0 H_OutputB = 04004B3A422EA29457812CC8FE03212163B639A71DBA0C2CAE3ACE4969F0CF9A SharedKey = B32064A6AC9F9129C4FB66D47A312465F02927FDF728DA431CA95C15706163E7 DRBG_SeedA = 27875028E7815E7B03024EE80DA1E1D00D33082A5E87B0F377C5A082C47BB5F658B4DD0A30FD18EF813F9714040EB3DFC40A1E02672EDD694589921510AFE100 H_OutputA = 9103BEAB843113861FE8B7B7411E44EBFA22CD30F6523F483AADC14F07013B84 DRBG_SeedB = 0A42C83B8FC2A8B2BA30B0ADD98B5F97B525C301205746CA37DD26039064388C H_OutputB = 56CBABF7A83948830015E93AB7C18AE1F3483751D2808717F2F3167357C053F4 SharedKey = 67468AE29B63EBF14BF069A20F2893E77BA5B5F789DEE1C406B5A3235CE45712 DRBG_SeedA = F902EB5AE952CEB963DB4731A1CF7D08B37F412DB1827E8D97858A75CEA4037CFD2B84BBD354A034DED891B94A59B59C06DBE82438951035D7B7B67B1E49B50F H_OutputA = 521B474C4287CD8AF1E40BD6C3C1C5BC63D90A8C942C774C35D2932A8EC85F67 DRBG_SeedB = 2C8463959712A8DBDF683874CB756EC7814A4FF89C5D4AFF98B4683F6C5CBA65 H_OutputB = 9AFA9CCFBA8A40FC74DA7ABAD08F69B6A5F9B2027BA6068328E7D415D8443A37 SharedKey = 5DBF96AE2484808DA457FD821742E77991FECB0B8C673189AFCE5A50423D5C24 DRBG_SeedA = FFB35508B293608116A52C0F86556AF20156CBCDAED0D6E2A240F6AE5C3FE3B394238FE3F953894462F2A55087AB4A44A729F2C54FE7F5D731B6C5D754C8D30D H_OutputA = F3D1E2193B18D4AC02FFEF16442B4785F83A60EA0324F0FC2B78BA9854C36220 DRBG_SeedB = A02A2DD455B720041F45E16ECB6D4564A8711F01FE84BC86433337B8088C09FD H_OutputB = AB8B7D73543CF4B6E37AD2953D2B86D710B7C7A70B7EE43B4E3AAF0CFDF8EAF6 SharedKey = A1BDF15B965632EBFDB6CB6CAA522D12897D3932C637415BCCC24E73EAD070E5 DRBG_SeedA = AB717811DFA9CBB5E41BFB56927F8DD7616CE398C8D2EBFC1CEFC4CAF3DC7B3C1022615DE83998E77867DA6A1844348C4F25262646ABB6682317847FC1C1FD0F H_OutputA = 6FAE035894FC8021D509F9E734D7C21CB798CD06A0160E0F3F572E9D23AE948C DRBG_SeedB = EE47FC6E434BF7E00CC32E81D015F6ADD4B4F6E46638EAE947FF45B6291CEF6B H_OutputB = 67E09C1568A24FF574BC9111C3E1058B174257F7221363AE31B93DBA6E537727 SharedKey = 71B9C6501626A3F94F33B0263DAB2519EE7CF5E29B1C591C1F8586148BB4338C DRBG_SeedA = 13B4751D991C5C7888D4C649C4A708B47E6A87BD53AEEBAADCF67BE1F90B68A0347DEEB68BDC1022BC53ED3983811815B7F5B8F11BA3C5E89248239EA7167514 H_OutputA = B37AB96A8B5C1C807B5B29CEBD1793A45C0D56A72FD77F03FF43DC27EBC28521 DRBG_SeedB = F93767855A038A85A90CF0CA7AF9C908531E9889D713A3F5BE598714982EF2B3 H_OutputB = 6DE212C1000B607BB36A78D153826C26CF47F43BF1E251A098DB393A4B234533 SharedKey = 25FCC4B0BAAEBEC637181B7E081D6916D4A3933826FD4C1DB1364C723F204ADC DRBG_SeedA = 14CB258CB6B41A92319A10C3C08F6540A4922B663B2497F5690334B8EB0254D4593AB2CA40FE7DD0C09A763ACA59C427E6B49FBE59BA48F26DE3B5C66136F244 H_OutputA = CC01921EC47C89F46A2B29CE93780C5537746865BD6257253935EEC32F73D698 DRBG_SeedB = CDAF3F494357927A71044526B1933EBF83ECF274A67E2F78BFCAB03682A7E1EB H_OutputB = 3C41AF062FDF73558907B59A8F6C53EF45A20EFF8A06BF3E83EE8493C46E920B SharedKey = 31BD983E66298B2BEDCA6B086E49E251AAEF8B94FBE5CC08ED21D7B5CE97BAF0 DRBG_SeedA = 298B64723DE4D57B2526B3C1A23342BC41201068424CF57239633A16452C831EDC38E7B0F95C9D7467BF53AEA9182B7133A53A4D0E465B5E86E56C4C0378AE47 H_OutputA = 49C8B8F48AC9B3479217F5D5E3BBDD672FD8C0681D3A5F914E527C8195192F2B DRBG_SeedB = AF8B8C79BD10E5C0F73D980A22A22CA39A00E07511384205AAB023CE4FD84E63 H_OutputB = 079174CF95042F27A843A5B02866348E1B4D43976932FACAF3C0224BF6B359C8 SharedKey = E29290E141A4E6ABD849977F1648DEFA927E48B39D9773DBAEDF07EC76850AE3 DRBG_SeedA = 3E109F444BDA7513C545D0AEA5792C4765389BEF204696B19081C2BAEB6081C51579E45EE5345DFE35ABC58022E1AA28571D3C21BFE29769319BB39F6C80B65C H_OutputA = 5B8DFAC7F4138665EC33E2AC23C4964475885914B4BB28DDC60D0C243DA558BB DRBG_SeedB = E751C80CB0090E38739038CD9AD9EF33EF268B32F2C33AA548DBED605C78E323 H_OutputB = B319D60B098A8721DAF81C679ED8FA74B5BE1E6B8750AAB808CD1573AC1A6B72 SharedKey = D1FFF0F1DF9EC426051799396F1C238B6E0350F44EE7F07FFC8896B0966B8D26 DRBG_SeedA = 1CB996FF05844D4371513D121001D256DF2A244EF4D618F0550957E20E354A66C170B0E5E3B680B055AA817BC0A6B511C33C18F2C10A39D98680CEC56B291C29 H_OutputA = E37E1B5EDEB95F70BA5C59C56A7B7673865A94034507D552DA705E0010AA706E DRBG_SeedB = 56166334CB543249AAEA40174FC0040A553AAE60EEB875B718B9F6ADD1D743B6 H_OutputB = A225B81CC7127913495E1F1528742377796070345BED4FF912DF149CF2A6F8EF SharedKey = 09168698CFCFF5F9E62B6CC63E443F4486708E8C91E433B318850BCAE36DB958 DRBG_SeedA = E789BF56BF58305913AA9ADAD1E2899E24F005A1D81CD16CE850818666638D38A79A73A6F2185977397DF755341572E388952C26A79FD30EB6BA343A7955FBE0 H_OutputA = 11A5C5D4FE0109AB4AFD64F104A2E28E80A1D75A0243A702928F33BF7E9A6056 DRBG_SeedB = 387A3D53C7C54F26DCC1D497B1DCF309E860D36A616FF29530CAF2D5BFDA6CCB H_OutputB = 9678912C246A127336459B5CAD43A918575E1E39BE37E345C61E64609B2294BE SharedKey = 0D0AFDE4BC6E07130E22FFA522FCFAAC5693C583CECA22A741BB920C536530E1 DRBG_SeedA = 558FB51CDD8AFA020CF0706A1DC24BEC27E073F616240E74805BFDE39E74C371779E7A6921BD348B0B6B8CDB16129A85C03DC22B38116A75F46A77600EBC67FF H_OutputA = 712064A7D763A3CCCBA7AF2AEF544C0156995A7BB6EFF5B4596457DA4FA577A0 DRBG_SeedB = B24933E4E1F23AA311899C2187D0570A33833D2FE2117EB78CCDD6A6C43DE0A8 H_OutputB = 963AE0219B12BC582C835EC7600335E147F3DD3BE97B94606213E7C75FAC31EC SharedKey = 28984723F1816315AF417D9C19C3605DF530C52C9DC7F06D80E2830D837B7AFF DRBG_SeedA = D49AF78A97A14DD557632E1BCC4927874BEC74BA268E7D3A75171A3018987A57F8B73E91A794E0F8E915C981339AD632DE480B7B7FD34A0C698FE78A9DB880D2 H_OutputA = 6B909BC7C0B1867B24565182F046F2C7868E6B278AD2AB6966DF3ECDB2E33DD9 DRBG_SeedB = F1802E3BC7164E505DD4BD23CC554BBAF64B3F50D16BA904CD1A017FBC3CFC1E H_OutputB = 85264FA1DF63D8D180405E96A3997A04FDA11AD2C36AC15CCD18353063FFEE43 SharedKey = 1D36C3322849793522AB756E7EFED2E943C9D8D7D0E4FB10813F78909DE1BB3E DRBG_SeedA = 603873619781DFB4B02F8C1D9897B35E9C9D697F8CBB87706C43FFDBFC1CB7D3511DFF5D042B5533CA2C630AD11D81264F51A930CD90020FB8881433713B165B H_OutputA = 9FB5382F0063A01924B3F51F91A7C7D870B9F3E6651E8E3FEA48E3B46003ACF9 DRBG_SeedB = 392F3A2381A3367999B9EFBC1062D677586AAB796AC5EA414C22A59A18335202 H_OutputB = 2B3FA730077E61B2BC5E76C097AE8638F4512F2EE316995FA730D0B293CEE52B SharedKey = B5137232042E8FB2A46592FABF1BE4878FFBCEE5BBA12C8A317206BC3C9DEAE1 DRBG_SeedA = F0977A087D30A4311C3016881B552EB15E73183ED5A030328641E416315F00CEC00891869B3C032EEE494D020F446E470E86AA09B2841CBB22DB3E265A559FB6 H_OutputA = 76F9980A0658D8B8958BEE2D0ADF33BD8080AC84C233A751499253BA20DBD4E8 DRBG_SeedB = B4376A897251EA852B42F5BD72F385D7EA1A3EF2FB86FA854B4FAAD6129F6F22 H_OutputB = 6B8CBCF3E5F15646E98944AEB4C57E5D97B6994673CD03C32BEE029DC858CD30 SharedKey = 79A68FDD5E260FABACF08BDC300C31E7F5357F1398EFC001D9993B3CDA633B46 DRBG_SeedA = 332532CB03B16B11E880642089A1E4EF52C0C427BDBA6726F6EA90F5687C587AF724F3FAA647712AFCCF578A96191A3CDE4C330A56F2D70DAE12B9A30C0F29EE H_OutputA = 2FF2F47B825DF1448A232C9FCE419EA83363CEC3A3E148F8B4997E6CDA7131BE DRBG_SeedB = DE04A35890A12F96B23066B8C58FD22DBC8943C329B5CC22A62C29AD09351DCE H_OutputB = 2A320B418FFF05DE9F3707BC847670FE3B22658D5BF4B0A55F4CC1F859DB816B SharedKey = 373DFFE491C39287786DC850E4707D79A2EE2ED0F9580D527DBFEF7400D82FF6 DRBG_SeedA = 82B9F67D5DD0EB3C42344F30177CEBE0E7CFEF9FA3DB6F8D059966C9D2331D610B68D64EB75399D431023309C3F5259B096FDA9B7187854CA1DF8E6B34ED779F H_OutputA = E299E78728A6069BE4FFD39226385AE149A4EF27C50FCBDC32D209918A061C6F DRBG_SeedB = 93BC101CCC57A02C189FDC3B297D60EEE0E253D26B7A0DA4C997212D8A985769 H_OutputB = B79925C47DF4ACCB116641334D945E62DE150F2F89AFA46158D5039C5122410C SharedKey = 4DBDA6EBE94F456DAE69EA33342993F953FDB33B35C1A78ACD0669B4DD49D508 DRBG_SeedA = 02A52F477472ED9DBD39B34A98225C2757F7B8BECCF999148913B1F12E09EA74854FB16E2EE4A32628E63F9B901167D21E4BE03CC7F72E6BCADBC6D16DBE02DE H_OutputA = 1D8E4F6E378D3DF779A07D92797D85EE82D00ED6C5F16968CC4B78F175DB0C2B DRBG_SeedB = D561CB3F6ACC0B389E48D31536225496786938D8211629F9192DC963CB7DA199 H_OutputB = CB01D1B7C0490CB1C8A871DB5A682D6F2C61EC70167BA2057866E6F702B45EB2 SharedKey = A5E2FA1D7801EC501ED994801289260D93E4739C5C7348F6F64943A392940210 DRBG_SeedA = 8C666D679CDEE9BDD4D0BFC93ACE1D1A7A00D6C10AB00060DE79B7800CAFA2B734CCBCFBE048C46E449E62F2812CD8C9C1D4A445A863B0AE06C6CE92CCD1FA47 H_OutputA = 34886A07320C4847175C574E8A192D64BB04BEEECCD6CC4E30E4DCFEF8922D39 DRBG_SeedB = 86954F6D7750A61BA2BC7BB801920D771A4B2C476D08030E984CDE45E8D10D51 H_OutputB = 00316C9F5298501FA0AD61444D5C7B19BC7D1CD1C3D314703B3CB4E14E57D4F0 SharedKey = 9B53312F615FB5C2BEA02E5336B58FEDA39000271C72A4408470798A247A51EF DRBG_SeedA = 18C474B38C0DEA1092883EDF0C2795F332A4435080AE331F71682D4899CEB389BF75A783A8E81ABF5E7BFEB952144192F134A2576EC38D355AEBEEB875999F48 H_OutputA = 81FA72FC54723256B5F7CFFAA76641495084DA844ABD224EF98D0ADC823A236A DRBG_SeedB = 1E42CB762128495425B3EEFAE94AEB8C55A0378C6C91C4194836384F8DF28682 H_OutputB = 64D21A981C917726118E2246583BC27BDE6B4505D7BB884831590A2DA707BB31 SharedKey = 650AF4F07B82697870C6CF379CEFBE5C3C6B3123B38246A3835364F25E7BCBEB DRBG_SeedA = DE8E250661384FE51671C978611B841887528BA4B3636A084DBFABFAE57B8C1CEFA822A20890601B0B6338E4E1B1A6C53E8B9CB47A9BA5543C62EAA61534BCAD H_OutputA = DAAAC1E2A9297440FCE71628D6F9125CDA8344ABCD166D2FC9D1716F68B01BEF DRBG_SeedB = 172DDF8B78AF47921975D49361E9CCB65811FD26AD8E5842F79663EA4B788B85 H_OutputB = 7C664FA7D49DE9F3A799F3E785FE4BAED8F8CBD4041FAA8B8DC79DEDDDDFC33F SharedKey = 81A7C076AA66B3CB27009C5D51BC4D33A5D8E96398DF979D6D53C0A58832712A DRBG_SeedA = 2B6D5A0E2493362BF8C01CD2A4C035A63D89F1D28E1E4AAEB0DEFEBD8D95722D2DAD94D05B8DF8088DE4C7E374C19F5C8198EF6C44FE7EB55B65E11A434358B5 H_OutputA = FBD58B35983C83892025421435F18A6F40E7196FBA7F2D8202064DBC022284C6 DRBG_SeedB = EA1B064E01C222368A2B745304AD3F63D89ABEEEFDDD1425E0A7694F74B4F2D0 H_OutputB = E208CF3DD87705462CFD34ABB2A4D838E2F7ABF7FD0FCEFBF918ADFDFC0E9097 SharedKey = 6ACF04B2903742F06A256CB31FE5001AF523E47B25D08AFBDF8D3DF3055A50B0 DRBG_SeedA = 30390E2004E862C4426AD6D2622355E7BEDE1785229787C31566B07A1312371FAF7BBFFCA5D788ACCB761E4FA76B67B31CA546CB060BE4D7D6F76F4AAEF1BBF1 H_OutputA = F01E3AEA6967AC57ADDD1B52A17F41B2C1C98E1A456645B2FB7A3398D02D43C9 DRBG_SeedB = B3428F276A3C567192B2A8D57EAADED34E3C12E391C93B5667E048AC01E3FD3A H_OutputB = 09F9AE09F6DC8B50CE2A56137F93FC35EDF4C6283EFB5AD4C2BD07A60F99E731 SharedKey = 52C7E106CE19932E874AF45732472B167FD85E0014D0F50B94E1D0115AEE04CE DRBG_SeedA = 039B4D40A914AF7D707A7705524D5A423E6569EB4C8BB9670E09257B10C307232A5C6C6BE28C7C7A264073DF67A7AD155CD21FF82B1AFCF778CF958908C0C8FE H_OutputA = ABF850914F142CB0AAE914E88E11974337D4498B1828BE55C67E1C2FCC7907E8 DRBG_SeedB = D76CFF104E8963CC5773FA00F80DB503B471320F3AD55C7EB947FCD4C4906043 H_OutputB = 6B15EE5E4D1638C6EB3905ECE49945E7EF65863FA2EDD71BBE536C6A74733783 SharedKey = 87B53559B6BD1E7F2A91703BA782833816A4D0C102A8CCB2B1A841D94D2D3B19 DRBG_SeedA = 9D6BABF1D6B41008D136F0595D01312E0137C9C680F261A5B7219C19299F78DF8CB255044E0A6355FF7F0D1DD7B758493AA5BF1AFA0EF8C5772591F5C25D47FE H_OutputA = 2257EEEA22C35F9F0D56AEEB6396761368ADC46B8CD39A0DC250B25590617F05 DRBG_SeedB = C81B252E54F2C4619CCF13A163E379791F5122B969F13312D7B03DE985AA45EB H_OutputB = 6B0F2FAA74EEF46B585E4B02D5435667CA24B8C7F4E6A7F482A8CBC9283160C0 SharedKey = F3B41A9EE0FA8989C4AF983C13162FA957C930474EB5D8EA6BD90B4B36B1DDBD DRBG_SeedA = E33E6ACE99D15B1440E128F854142CF0D96E18FB23BA5F79135172765568DAC1EAF3F8AF9033AEC01654A4389F8214E4DBF30367C4244035726E4E28700D4754 H_OutputA = 1421AD5B94BAD12FC0268AA2C8A598D5E0110A1508A20A5FE9ABAB2CF184CAB1 DRBG_SeedB = CC4A2F4D6FC6545D2155D96D07F6C32AEA32068556D8B8C0CCDA2C19CB1B00BB H_OutputB = 36AFA5ABD71732621C97527C63F72AC089415207D9A6F8F8F3813BD0F0CAEFE1 SharedKey = 49EB1B1A5E5E773EC44EE809AB9BD5380BFA0B3FB00E8B9BE1F6FF04CCC515EA DRBG_SeedA = 1E6906882F5430FB70FDF5951DA0222E6516C5B9A26707A2E985E7193E1989FF15CCB1C827AFECD7C24682F6A7F026BA82B7269004B0AE152826739443370896 H_OutputA = 997AD90840100B97F8FE6414FF69F8B85012C9E60C9219E0CABA0D23F44B4798 DRBG_SeedB = A330DABC6F8DFAEB21D47354A0C9CF113A41D9B5DC993469C9B1B9EC84700F7C H_OutputB = ABA80DD82C11244FD75443FADC43459BF04251330ABE584FD01F965E2A9AF81C SharedKey = 63718858AE5FE8CE2AC8BE92C38C530E757724707573FAD5B98F4AEC1DE79BAB DRBG_SeedA = AF66149F08CF8AA8A466EFC2E959892EED30E83C743BF9BAC88244FC011B87A37D78B8322DEBCCD4238E1A29556D4B30C9548A6A653DA82081FF4ACAD6727738 H_OutputA = 9B8587C825F55A55355441A0747D7052CA197E9CCF28DC08F62C1344616030E4 DRBG_SeedB = 7E33ABB9BB265066E66A692AA4988DE829CDE22E687314244EE068AAF46C7A5E H_OutputB = EBFB1E1B0B49B7DC83C82EBADC17A3E3AF20882106CF186455C56434A65BF7EC SharedKey = 77CBB005EA8E0521E3C123C52EE5E945A5226F206AADB51D8398FDCCFFD5C174 DRBG_SeedA = 7CD76B33B8836F5155A4304E017FDA3638E97AC36158114064D7FB38AC535942B6D416DF8571A50CA391BABB06CBCC81138902BE64D8F12A1729D900E0BCB7EA H_OutputA = 12C0AE18F92E022AF088415F38718D7F1FD29CA627D624E224A263AF20DE2C96 DRBG_SeedB = C65E158F1E7F72D1A28744043366CFAF2FA42DF50BF9CD6A4ADFC2AE05801F34 H_OutputB = D8056B8BA973865ED6E3D433C9348836680F5D77D2A888DDF1692DADACC51E2E SharedKey = E01D541A126A3BBCD87DC9C61371C9E5373EF5C2AB351B4BBED3F2FCEE73568E DRBG_SeedA = AC24EA59E6E3CC92965AA0791B66C9E812FF1636CFB54C09B5A24BE7CCEDA56197B2835D61FFB809F6F0BDD59665965387FD9D24CC48C21346756961AC74AABB H_OutputA = D68838E68D0B161BCD000B7BED2275635F1F2B04D90640EA6BD3EC3658B6D5CC DRBG_SeedB = 14B03DA6E294903A0ED7C938073CC1652BE42F983631F31AE56A4AA8FA1A2308 H_OutputB = BD2FC234347FC3D6511E712F9906BDBF83E35525C6D33B6FF459CF491C2ED865 SharedKey = 0C117F3B50663CE83F39F6AC33C6593683DFA0D300366FF8FEA8557EF72A2461 DRBG_SeedA = 17FD7697334182A66103493C5FFD9F8E96FD0C5E4F6F89A8002F965A38BEB72DB1D692C8EE2D63A46754B405523C14743F3CF4E48B9674D24860A3EB99F240D2 H_OutputA = 1C6E18A773C03E142BC595B50685B0F69F678EC49D95209215F514CA1AE1C156 DRBG_SeedB = 1967036086477C8BC0F4C75913398302DEDCF1354E955FD2AD1C1A89DC93F36A H_OutputB = B5E58702E46D4A6D5F824C46FD2DB7AD71A4F328451F3D6220847E174145F0CD SharedKey = 9BD209BD6282CD153EA9B6CE5623F6CC7443369105A7565C20BD9458C388F979 DRBG_SeedA = 79308524993A2797B45539E40AFC42627B1D77EC7FCCBBDD2E7A20A1E0BF2259149ECB619CEE78931D92C79BC02D900EF24BCFEF0193A57310B1CA30B1BB1525 H_OutputA = 4B73718204AF81788139F4AC32A38E13366D72A8CD214CDEA3E5B37B555AB0D6 DRBG_SeedB = B9327185DA36BB90590427FB1E4DFCF3B86E5C183373B48E3B34A848A194136C H_OutputB = 7D3040767AAE584819F66A4E3AD85B8CED913A9A8D59BA3329D6182475482488 SharedKey = 99C2710230BDE00491BA46AFD0BB1CBA2DFD2820CB80C926B82B9C079C9B679E DRBG_SeedA = 7E4232B4D0D78F536C250D98D5E7E00D2BE80B5F69F639BCF7D0C42BDD9790A2CF26A9AAA3799B43AA2FA083FBD2314C4546825CC9B24A9C2CB17BA8CFBA1ADA H_OutputA = 8A8AE8DDECC0DE22F8F2DA1246A39882B4B6D1A6D2DA427AAA87D0114EE7048C DRBG_SeedB = B614093561EA9AEC3DB548E44A24291CA2F62B9565CED2949951E69718D1C6D1 H_OutputB = 958C168BC6DD1A996CA6C3E7EE69CF350909AD3128BF41651C1FE659CDBE278E SharedKey = 302FCC6C49194583B5C3F6FDFC5B2E38D35DC1634C6F799F7F8981558FAAAC49 DRBG_SeedA = F0DF44E3EA967AAEAE7E4F7B097C94482BEA07B0E0A44925E4DB47D7A7BCF5C1835B6AD570B149E04D5065CA13E8AC91CCC1E6F48F4E321DE3CC770CBB1340FE H_OutputA = D28D1933584FF14F4DFC4448E66600058D2080845C6F5C1341CCD8344F8E09B0 DRBG_SeedB = 7CC3A0CBF647CB4C646CE6CFDB9E7F2DCE6D12B7DF7D153C403F45B98F25E558 H_OutputB = E2E87A20F1AB9A160A8DE626B304BBE7890C2297FAE65450FE6BC432D7A812D6 SharedKey = 79A3510001C0847A3A76DCA9D08ADE479BE2D6EC4C2907EB90FC34D7D05F632D DRBG_SeedA = D929785918D9F3C938DC73BF3867EF7BC8EFA91646E671A116CB07CDAA7E13C8A9BCAFDC03246D51DAC4F5F82D83CBBD231FF946B846FF67918A4471EB15DB42 H_OutputA = 51B1B65C27C0B5FCC9A71B9445436F187889496C0825F7DC8C712235F415A5D6 DRBG_SeedB = 45C894F46493B7272931B21F8DE683ACE3F09816FA371873DEAF33ACBF5F603A H_OutputB = A44F9A3026BC95F165C9FAF13B5A6091D245A4EAFE2ED4F82D28349BC7820B7D SharedKey = 05C823E8E52125AD569C46CFD2ACFCF2D99D4CE250534E31A0D185BAAB49E42B DRBG_SeedA = A3CC322DD76722758BCA58AC50685860F47D4F0F2E3CB4A0996943894502FB3179DD890562953112B70D98CC78B99EBE2B9F344A70530CD83E094CDB944288BB H_OutputA = 16FDF702BF700D29B8731DF1B310B1D0C50AA9330A353A6E8B16090A308628CD DRBG_SeedB = C822DE60CCA284567356164F2B55F32F126C3C4C95B7073134A90520504EB02D H_OutputB = 8749C6AF116F31B06FB083CD691AA101D6AC97FD75BB96133BC89E14B680BBCF SharedKey = 810611F5A6C019F9CF237A1EE8D20C4F5FE009B677B1E28F24BF2801B937F866 DRBG_SeedA = 73F215D7A0F0E04F2C5F512A481D329CA1A2E79911E7AD4FB66AD6ADBB2EEA93A69EA992E3B8C5B88EDBC7188B99CD79B3CEF1E3C4D3C9AF9AB8858B26ACD9B0 H_OutputA = 6D518239CE4109F2F115B3924798D6F656EDD359B471A61BAED62D08F22A7663 DRBG_SeedB = 0372814A859697CFFB0D676F9F811A64EF642A0A5AB1179E19AAEF4744312D32 H_OutputB = 5BFBBFBC735A9CBF352284D035CC1C3EA09311417F3B9CC2E55E79D085DA0A8D SharedKey = 002F41A6352CD6B930FA68B85C50A21CAA01E4F2B1FAE3D81949CCE1D249E221 DRBG_SeedA = 439F3499413B5F1BBC0B1950D2A6C15A55A0CD2245E5E8DF98622D0BA9AE96F8C0B01FACE2A998866ACC2F8EF30A968E10E0A6C8E062302170CF0078F4DE2EBB H_OutputA = 3907BB7DFCBF4058E1184E0B12635AFA9AC8B0A9AF0AD5D9BC2985FFDA0135AD DRBG_SeedB = BE55D35E72E37FEDE92E952A198F8C5A343FB972A2FEDD1B932D3F52F304FBD0 H_OutputB = 3C605A4DF4AE2B426454F689638A270F9113DD27F8F8A4C9E639C61934BDA417 SharedKey = 6194E672CA241726E0008A8166684D6D02DE705886F9364E806F8824341FA0E6 DRBG_SeedA = 1C6DB12F59365709442413BBBB616E9909347585A8F2AD3A1CCEE79C33F52D781C0B0184020AC476725E8D145D4D0394A88FEF14D74D53C5D9B6850F343921DE H_OutputA = D603E0989D3C1E5E4632AD4E10D51F4B29E3F72B4D399D34A79582B5A9612E4D DRBG_SeedB = 17B599FC5C73A09931CA8F544058A9B05B76D0C235E7FDBB9E78A303AC07D2A1 H_OutputB = C95578ED8738F88A600793167BCB13C21D10C4744D72C5B47CA3081DB5C0173F SharedKey = C1F0B5A2F2FB990ECC2FF56C6DF6C43BC223F4C534ED843C026185852394E315 DRBG_SeedA = CBDCEC74241E3B045975DCAB4939B96C641657519DA25EC7676408BF0B2CC3DB5510CDC906F0AEB0CE7F10B931138E7D22DF131DD702DD3E83FC85489A6FFA3F H_OutputA = AE4F5DFC567B41D6EA39498ACD60369361726616E6DC970CBB3FA1D61B77678E DRBG_SeedB = 3C07217CAAF09A305855BDCDFD057E8D5C8BC1DA02628E286347BE6875E50CDA H_OutputB = 5B9619CA6B1CAB2D39AF5C2C5BD6AB4CCD633635E80F9CC11243D9113EB3E1DB SharedKey = 97141E0E8D111D0828EA39E516C6FB4AF8CFB61C6E4CB28ED556A376D56ACD27 DRBG_SeedA = C68904937140F6CDDB65E0B65BBA710BEC2FAF27CE3008DD6292E210A248A917B10E0D66288C7047149326F9865B343B6819EF3BA47FD337DD6294F7FFC460D8 H_OutputA = FE62A5437541F48F05EB00C640B72F4FACF0D399BACF3A19FE5B62E60F1BB65E DRBG_SeedB = D9FB6E651DD280C5C7B84DE6914FAB06C6AD583C4BAEDFB5ACA44753F94EDE9C H_OutputB = CF74FB95EBEB5F2A6414BBD1BEDB1F954FD2E5BAEF95EEB339718D5C39F6C982 SharedKey = F0661894E05D1599D8D7F0E38D8C4B827F30A985D8B10FD7078D684B55E7BCFF DRBG_SeedA = 9CF2D0E1F467D718BAABE7541219ECB5F2335DC5D970509373CDC2A6321A2FE4F7BB8604647F8E3415B5FB595217D0087715BA0DC19F41F4B94F73FDF4291408 H_OutputA = 625FD4DDE081833746458273943208A32DCB0939C9A892A4FCB2D2EDE743AE4F DRBG_SeedB = 4330D48437434A96D649C4B37FE7592B11BE823E76E5361CF2D25BE1C3C07AFD H_OutputB = BADC965FA530799060F6F6EC4577B0E23CA941029231186B829FEAE22C05D715 SharedKey = 2C37A9070756D041D257BEE5B83560DA4938E3900631A42BA68B086E22A24595 DRBG_SeedA = 2014BA30956A7C2018E71060D12D9481F6AD9C4CF4C24212A30884F0F2664A71A1A1367B9B527B7B665A848C1B847AA13CA412E273F6B99722BEE5E0FC1B3960 H_OutputA = 79129C30CDE8A8BD5E1DB2419D35728806D403DB2F1057128AB9642F15477151 DRBG_SeedB = 207B17636C2249F437307F521CAE1B6973C0A12D8CA962D9F31AC14865590F11 H_OutputB = 1AE7CF74C1890A86D07431239658D4AB9D126BCBB6383C24E1E80D4105FDEB84 SharedKey = 613173B182D44443B0AEBAB1C59B72C06F28893207DAFE3EB722683C034C633E DRBG_SeedA = 4C05F3C6E1DF81757D054BB3E7D5E1BCB35ADBE88E0910EBC6FFDD821167E7E4A0006C6502281F8C011EEE48BBD7C5099F4F7E5E29CCBA354D8FFC704853FA2F H_OutputA = 1F4FC9ACDAD35FE1E89DF67E49178D596F2B5BFB72F63EEBDAD76B0789388039 DRBG_SeedB = 73B2981D568247D240A4D2C8C9DAFD0F4BABF25B12BB3E53667FD12851FDEC3F H_OutputB = D5DEB9DE4CBF9B7BAA4AB52A3363C17FEE417B75821DC0F25ED5978DEE3AA78D SharedKey = DC91377DC362062C94FDEE67DAA7B434790B0CFD83905EB12CF8B3B1D84AAF47 DRBG_SeedA = 8694CED852C4FAE730BFF069F8AF5B72E20481507409EDA63DFECE65E7C73E999AE1F95F05202A9EEAA5C44A56D353BF53954C9C1060C378E3BD042ACA1B9084 H_OutputA = B148CE1D92FF4628EAE409B35D8FB8CA3952D8DDAB707BE8D96FFE5B1373DC3A DRBG_SeedB = D74FB7D8BC588FDF62F3AA8EE579A539BDB974FA35E0BF39AF1088063CECB764 H_OutputB = 9F0ABFAE4734A8435C5D2316282171E9AD2B6FBDAABDF8F8A435E2A1F0FB981C SharedKey = FF06FC735A879BD45E7ACB2EE58E3DF7583D32855D2C6C2D8FFC5ACB89CA42FB DRBG_SeedA = 00074A1331364A7365F7F54C7FB0E4D3C7217EB8C1059913E5A0416D8C19C2A5AC7C49E003439413858C9A71031111B7F2D96DBD36E59392456B06F52D40C424 H_OutputA = F95439B2CCE9FB709DE22BE98526C2D6CA280861276E4C2FE795B06E8DC1031F DRBG_SeedB = 448579B76E41F1A6C9B3520DD03606BA5E6562C7B7EE2748A12B3E9664388C8F H_OutputB = 7B3678EE0B01571154E9A906A81ECDE1031983A75D050DB2C058D56100BE0B7E SharedKey = 8E66042348A062183ECC09E872A3E2E36F3DD97C727BA4107E7838354A3B10E4 DRBG_SeedA = B08B53F4CDF5D4CD28CC1602AB1B254BF6EC6AC82C8F6689427E265E5AFA2D49FEECDE7F89D27F78894E57A99A2631D7C0198ECDF7A2C4F42216B8FCDFFECFF4 H_OutputA = 0AF6B700E063D6DD0EA2F878F4C9620BA1C7B076C6B52552D848D73A0B3C79B3 DRBG_SeedB = 3038689B9D85AE4B810EDD01D1BA6975EF27AF58F02CEC98499A855DF7CDFC5F H_OutputB = 751D1AC52BD9B22CEB5AD7937799A76DC0BD2DBE12563E042CF0B61495109BFD SharedKey = F47586B17704837FB7AD6C20061FD80EAEF68EC9EA5F60BB6DC71F51B19E84F3 DRBG_SeedA = 4BC8327AEC2E0726138C2E519B5FA2A7B4241C42495633474A6ED00C6ADB2A8D416D5F0199E01CFC060F58D95B98AF1141D35E75604A8B9634346F37DD5F296F H_OutputA = 3EB668E6DBA11199E089EF93EAFBAF0055CBD30B1B59BC104E366EE7F30B90AD DRBG_SeedB = 327CF113EFAFB84BFC1CD83F3E3959599133CEB01E74578A94ED5D9AFFFE26B8 H_OutputB = 48FB96EFB2F20181D09583742EFFDB8310A75601F78192D7C0C72EE157B5C21B SharedKey = ECB9809D555B3CC5ABF42AFAE3FD47BAD2F880DC54A147C3F3A45B9B5A8F4F0E DRBG_SeedA = 94EE4898CD480086B75C679BC3D34B630F99DAADE18E30765CF98886113116316B9C68B8D67EDD18449E0F662F000DED1CCC86E56400E166815AFCDF4268C599 H_OutputA = EB7EB4B147F831136835247186C6EF6FD51C4FA5C7EB76A26535053C77073A85 DRBG_SeedB = D1E73B24DE2D127F1E4C2127BABDD9DB992AD0A5B42977E066E99F9DCC77100F H_OutputB = CB42A643B407B716D913671D9AD7056459410CE26580BA95C7733C0D9792EFFE SharedKey = 95A5D35ECB5470830A6335E4E7885F314EA9FCB7B2411D6845D8B0442FCA31A6 DRBG_SeedA = 2538B2A856B54DD634BC593C670440149EE9C273F3DED07AAE5050E7E92359458861C65C17CAE10B02F472D85B042EF8A23C7CF8CC48DB6F61DF09D535527099 H_OutputA = 21FF5D87278458FEF607E858929C5BDB4A27FF1910D46864F2D8A0CCDC2AD83E DRBG_SeedB = 898E73117D8636EE6AE8B8D7DB1442DB182419FBA3660886CB8E1A4EB225A355 H_OutputB = 60BA66EFA27D62E4C1D50589F5215FA2CA89145FFE5B8D2C7BEA49CD7820EC49 SharedKey = DEB0F6EB551A9EF5591BFA8BFC32277E40D59CF692CAA60DEF3D19F2C7D9FAF2 DRBG_SeedA = 0111466AEE9FEFCB91781110631452E56C7C1852676ECC66E689C3FDF699CFC4904C655170F463FE22BA4E559DB7FDF2AF69F3EE4AF5511152FF20DA7043F837 H_OutputA = FA6767E9B07C4CAAB80D5986BD720EFCFF4FE582C69DF1F4116B4408D5C0802F DRBG_SeedB = 2432B9732B0891B8D9253A906BF287912CCA6F80207D5EF0FB8C8F7C594FDF41 H_OutputB = E1EEB2A7C860501D215AB1C7241E4EB81C15E043E0212ED6B98B5023BE700F6E SharedKey = 648428F759BE9C3F9071F4A52B41384D4B8C94D02803079C5D0689C0566761EA DRBG_SeedA = 769D6DA2BC9753B4F1B26DB2D6EA22F57CC8BED84BB28568637143284854EA69C40D223A1E0753A16563E295635641E54964A7F9D39BD1AD61E72EE1FB795D67 H_OutputA = A01905C134D0A772DD64552D98F2FF72D0992279CA85CB2475EA8D30B73D3522 DRBG_SeedB = A2CC29EEE712B47E4F0168ED303EA7EB212AE59D28FF671323DFDC03310CEB8D H_OutputB = C55379C0EE9D492B006C5916FC46829E56EE2017FA0B4D35FC9D8C5CC0BB22BD SharedKey = AF9300A2C5391D0ADE6D98021098048C6DDAD703F0EA97572FA03692A035D032 DRBG_SeedA = 025D6973795791F8A923456968E756FA9FF8E939094828E0F66870DA66446CD4465E23E0A222BDB9AD8F80590DB5C59E166BFABE22BE94F0CE98E1015FE7E717 H_OutputA = 7C61F9848E30C8D1CDAB2396CDB19C9B9B601A5D47CF30B91C8D1B40027D76C5 DRBG_SeedB = 5A37C33D44E161995A152161A24EB0EA5ED0E7F6063E15DF0DD34FD1CD5609A6 H_OutputB = 0BEC4CDC17032752EF00EBC6C77214C9E11D31E1C9EA02F7AE85C5481AA0C6DD SharedKey = 709387183695D0E1A85BEFAF5754707B282324108A29D8BB6A160515783C2E9A DRBG_SeedA = 4151D5C759205AA62906AA527B3A0F68A18DACE3248DE888E6EE5327201CA3C4F4C32B5FD03E2325E1941F7138A5D0622895D0414D2826BE21AE2542AE942261 H_OutputA = C8577F8A518746C2FDDEB2E46A5DA6FC751CA8A251C106482F16192281D15ECD DRBG_SeedB = F97E6C2B1584A9F78C5FD036C75CB59CF80545812B7D953EF66E1F3A96F8E913 H_OutputB = 0F563AD7158648F8A82B0EE40C69ED1EC4D9F5225B56DFD84C3503E23B427077 SharedKey = 84F436B6EE7A59381629AEFFDBA7B95033EF677147945AD61DFF16C44AED9762 DRBG_SeedA = 158FEDCE17BEA77CE935FAC82D53FB79D747A54F32BCEF6E4260283C737BA396BCE3789E78164F0D725FB7834163A4A6F97DCFCE79CE6E5FEADE869A4564D36A H_OutputA = 11CE2D484F76C885C0CFCF574723181D8BD225E2C05B9FDAB3BAFA28A271B342 DRBG_SeedB = AE6EDD363095A206F8E80CA011E3189F83D9CA62EF107E0580C39CF0462AED10 H_OutputB = 9A8E318E61039C8D70B8D7C98676D59268D69BD83EC3128D764A13B2E65315CB SharedKey = BD8EEEE0713CC09C820C80426399A53F5E671B608035D263222A6A8478EAC18C DRBG_SeedA = B4D22D660D24B9A23DC96053ED7BE33C951F5D6692915AFDFE386114532617C01AB8A81B8DB4B9C1099316117CC48AD592EC488ABF6075612730A82FDDC6AD46 H_OutputA = 571770D17C96C8B6D26CA8D6F8352360449C7E3A32039735CCBD6F3DA5D1C8F2 DRBG_SeedB = 2A9D5BC6E3C1145859E8F4CDCC450C86238583A25E035E71E6096F5BEA526C66 H_OutputB = 50033BBCB1AFB10CE1B9229C993AAD603086DB2D3B8CE3C11A1B37D00551F5C3 SharedKey = 1623DFCAE3B157DAB117EDBBFE62169D3B6E055A70B1BD5A7D17F8D9412B7535 DRBG_SeedA = C0B78148D2E08B87B67DBB783DEC40005A191B426D72BCFA3FDA5BB563E2F220F7098631042A7A72A1CD000D6D34C5263358E46A3FC198549C5A99B535727D60 H_OutputA = 3779A2B2A92FB36E39562347C9FFD42802603B2B5D72C72823F92B84A09BE461 DRBG_SeedB = 619B9DBDD8F8693789C63DB76C86D91E65A91363296604960AFB09A203F6BA60 H_OutputB = 1EC85BB685585243AF2CDF60F45ECAE920418039BACCCF34D696C41251604B0C SharedKey = 51D094151494546E28FAA1F78733F2611E7F9F63239A587C733FE99FB13DF85D DRBG_SeedA = F1BD6630AC8CC86EDA41554E09E7E5B57294D992C6FD210EE3BC77E68391EA3185A23C1E859678C1DE495F8219413B1C1B6C96E311C11EF3A1A60D5122D4B3A7 H_OutputA = D88A306B4C828A5254EE3A46858E7BE79D9668779DD95FD7DEB35DB6951025CA DRBG_SeedB = 63B5590DB4C9EBE19D719FAC27AF6ABB1465EBEFB912109E74334EEBD39E253B H_OutputB = FDE5A6A4C6670D91D497B17815557803BC790A3D29F3E5FE307B7501FF893EEC SharedKey = 15FCA5B9FC10B22BEBE0B546BE3FBF46C52FFFDABF73A06F2488347DDDF5B327 DRBG_SeedA = 9F2A542BD27105B0ADCEDF78D7964EAE2FB5002D618889308906D997A72F88433AEA9F23305902FC9877E6EDC7D998B46A2ADC8F3B384F699DD0825F0926E4AA H_OutputA = EFDF0978B17B92AA6F2A032A7251B8DE072F2CA44EBB7BF7F2901982049180BA DRBG_SeedB = 68446D172803EE3EB1B87EAFC79C0A830989E32E13A9B6D5E9CDB30E95E45A98 H_OutputB = 875B4F94A6EEF6DF5E3C97F6A3793F010CB648D0A48C9A7CA98CE602A4BA9A8E SharedKey = E6CFDFBB9BE558AD626D3755402EEDF3DBCD70059263D63171DB62538B051626 DRBG_SeedA = BAFF88AACAFBDA19A7CB24AC57D893DBB7B515626A669BAE41D7EB0A59F625A75DCBCC4D55AB96DD1F7EA733FAF20CA8F2C741AFD017349A6F69EA8D293094CD H_OutputA = 16496B27A85B9AE6CE3928C6295CD71C8D4FE28ED28D7A5DEE3DE78D1083409A DRBG_SeedB = DF32626B3A25EA4F3DF053A532632EDB2DB27F7CFCA508C5E0A1461F7F42FA99 H_OutputB = B405B1116CCD87567A9AF94D2D7B44D28B3478B88D11D70CA757B7003328482C SharedKey = 892740C66EAC6ED70573A382E2048F32CE4E17CDA8486F1C8AC2F0A56A7743EF DRBG_SeedA = 83E5A56E2784DC5A2C3D6E5B40412935E3DBC1297C50DA799A431C4CFAB2D48CB30D9F912556B74BE184005B3895DDBDB60A57D8405CF3385A0D313D32CA2373 H_OutputA = E0B22AC748971EBE33B51D4F4DDFE69E95874CFEC482090BFE4EB028E5AC004B DRBG_SeedB = 15BEFE165648A5C07BD19BC87977B8916F8B4E93F26844DFCDDB77D4E5395A42 H_OutputB = 62D2D03F311D142B3573CD3D42DAD15EAFAD44D70A42017A8E40C28E0B538A11 SharedKey = 8F09CEA7CD72F9F45DED24110706AC7D40409FAF801B94C09BE5BF9904C226B6 DRBG_SeedA = 7CE40F4C6633F5A07104212AE0D32832747FCF5B616E0C861A939A4024B4066DFF4C7CB39181B90350114240E39DC1E354CBE2B558723D1E7CEC7FC918D83BA7 H_OutputA = 201089E3C4622D66498F55E62F4C659198E311C269EEFF9D2FBCCB4FF1119D0F DRBG_SeedB = 886880FD857CB4EEBC450497EF54EC3087C6593540E7D55250A7FC7C94C8B1B1 H_OutputB = 81ADDD09F00DED04E1F5D164F8D146E1181868A2476631273D73327840C8B345 SharedKey = AD25B34A7EB64FD1A65071289BED5819A7A7312F3F7210D3C6BB6D2F371A41CC DRBG_SeedA = 4B92B5C47D38FB64320CE8B37738AB67EC58D439C170DD4E9DC3B6E41F74E510E88143CC691884AB5759183150C1D31AF03614532F074C313F310462CF111838 H_OutputA = 832C6B968EEB397C7623C5E5F35C65DE568182F24C001B108573C9C20619A35E DRBG_SeedB = 65A0BFBF21591F06B398A69B6ED159C02E6E0EE0DC7CAB1A1C9F0FF5DEB4F713 H_OutputB = 21897F4308AF918E294A59B18BA7A3FF4C1F806F3FDBCFEBC4DCA9A228032446 SharedKey = F8D08C0FC670B4FFCBF0D1C3684B42B32596B29A2A508D8E4E29380BC69FF5D6 DRBG_SeedA = 329AA6F31DA70B81713958175CFC61D92186B116F4050990D7BA2E395366B38EF684936C9655870EBC5471D02E550E9B3B309003DF98E86AC2B88F1CC492BADB H_OutputA = F1F82D6BE10D424CAE3FC1CB743FEC154D12AABA1491BF5FAEF09D0BDBF03FFF DRBG_SeedB = 126994A65A1DFBFAD18E2FCB9068100766C9861129A869295A19719769FE38C5 H_OutputB = 08F95931AEC652D7D862B0BB0CC42B37B8B76B9CF8CD91C39C76992F5F5C7D54 SharedKey = F41EF6C4FA74F996F270E91D546C56D2CC7F60A7FEB7F17BFD92F174B126868B DRBG_SeedA = 03AD900A4A9845455E4C9B83C46F53C196996CCEF78AB34FE64EB6DD1A0DE3ADB020255C3770E9BB37308262C1E297027904DB5ADD3B2C6742E03A0094BA7766 H_OutputA = 751EB5C2C442E738418F9F1B07BB9552503B9E9BC95FB857530661F133D5A7CD DRBG_SeedB = 9ABE1CFD5A278220A211223AFF93EF2725E0A864F1B0E7EE705BA6AF445F71EC H_OutputB = 43BEC690354D91F2D6A4FEFA9E4F31217DEF72C6DDFC4CB82CF7DE110361F0D3 SharedKey = 6B9DB2E4429156614E122B7EF1B467302FD3C93D4CE4618C781E9888DA6DC4CE DRBG_SeedA = 592684FE9FCDCE485308114BE64D036DEA8C46657151B4874698985D15135F39191610F82BF8031A8CC08624850DD09DAFBE37A1DCA1F0971B672D38290C7E4D H_OutputA = 694804DA439B1AA539B7497731157CA4B2673E5260096AE02CBC91A2A117A29A DRBG_SeedB = F15814350A88D3D3544154084EAB4D7F9D93C647F762AFC9062C7FD68BC89D12 H_OutputB = 250184498DCA0A92F5C898FB41A1CD857F62B25D8D161C8B73D0F319354C18A8 SharedKey = B48939386CCB37D1B0C9AF15F8BCFAFF01FD67E313C9D529138BDA61D329299D DRBG_SeedA = 037D90BB60AD551DB37D9388A8A1955D2B483C66B5FC2562E80ED1CABA09688A331A50A53EE91BF00300586794C586428910FE8E61EA153E0BCD887554EB25FC H_OutputA = 085D9ADC348D9CB77B4A775040232AE246A871BA8AC5BE468DF46AD4DAF06F75 DRBG_SeedB = E9563E6CA48379502929B0E0CC78C4E6BC79A9B93C809F580372D7334D31A1D4 H_OutputB = 249C164D349350C45D0DD3B45B7C158EC4A2E53672C38A2A14FE69AAC500E47E SharedKey = 4DCAFB514DDEB8E259ECA9CB9A672C981853E1FD5A5D96F243FE3CF95192CE9C DRBG_SeedA = D813AB242317BEA7EE3FC7A8142014AD645909C2A5E16D0D25F817FB3F7ACDAB8FBD01D7A729BDA5BB9F2A5015A645D16DFF742BF8538C906960E3A339A00E61 H_OutputA = A4F2573DA475DCA8F273B26815366B66BFD2C988B97055AB8955BE79B5A69E6C DRBG_SeedB = 13F9A0C328315B2AB48D2E00B39F0F7F6C4073FCE1205822147123D9ACE031AF H_OutputB = 1958A0F70965B8411598A0128F766736C6C9334A5432EC41ADE00B5E300937CF SharedKey = F7E68F32B5B8E1838A6350C0A0ABE3C2C03A504EB93675C36DD4C7FAB2F08F2D DRBG_SeedA = F98C75793D20232E93A94DCB5C815510AE90612BE4AE476FDE1CA0B872D9C45EF8856FFEA9BE780127D1BF985BB172F2AE6BDCBAC70E5974D1DDF8BED05C6C58 H_OutputA = F9BA8BA9089BCB90027CC65106D4EECDAED97DCEEA67740C1408F1438B2150DF DRBG_SeedB = FDA737E6C1D89D0B754FD5C6A42A66DC399D223BEFFB8D58F3E7E17A7945E4F6 H_OutputB = 351F159AD1F51276839C42A95CB82DD6D724EBC4C5EA2547CA897BE093311102 SharedKey = BE5CE468618DBA46C44726DEBB4FFC36FCC52B6C51F39DACA8F6FFC6D7D36C40 DRBG_SeedA = 7E6F52670306D0064919E4EE43576617156778BDD38EE1FD11FA83726E2215E589B5E91794DE7AC8AD5BCE4DBEAB282DF2131DFC8CEC402F642EE87D041A5478 H_OutputA = 376AF67589B65530C7F441B7B2FA830322E2A9EACF0E029A82A9C90386525F2F DRBG_SeedB = B4175D68135D0BDEB9912085A51CB1CABB73D561D5F17B323834E00A947A3E59 H_OutputB = EE3E33870FF2A92FFB1B18C5ED8EBB9CEBD1C2262760E9B0D04FDA5356B1D03A SharedKey = 577F71248B943977546E7610D5E8D1225727D10643651438A8E3F530B5A1A7D7 DRBG_SeedA = 273C664DA783F7A03B907995603A309FEB1CC24F9B2E70CC26D8A690D1F8148955E66528B9D1A43E2EC9A1FC692B2345F0C4E1E6E0AA781609BE2C758F29A0ED H_OutputA = 57043EE97DCC65A1CE32853AFFBAD9297189AAB245688DD15FEC5DA52B5481A2 DRBG_SeedB = F57662F8EC1E9CBDB854F0CAB751B994F871E7AFC19BEE266B06F85AB87655FA H_OutputB = EFE011494CB93EAB50B73C381AAAEB8ACB1F8C328AE920713A4E216F1CA1F45E SharedKey = 6CC7046F457F7F0F4EDE743F25CC51ACF214BA3CB460FFCC679ABD8BDC33D3E7 DRBG_SeedA = EE333FAA86733DA4BC7B5DC935A7B04C85B6DFF740B5E84C642ECE0A324C730F72E27F28CA455C17CE1D53FC7F35EDBDF613B9CB918C23180A43533BB20DAB02 H_OutputA = ABB5E8C52C650379516BDEA77115C1558915D6B0AFFC1125085B43EE353621B9 DRBG_SeedB = 63B0A7C7F05E4BE29A7AAE7095592474B7D6BD2A4026FA65ED7FD8535AF4BE54 H_OutputB = CC7FE8124275C7C440F27CA4BC4A77B89DD2182E5D337992BDC01C0B61604483 SharedKey = 06F27DB5A951F59CB6D89FAB48A3DEF536157E6FD1881A15CA68AAB711037567 DRBG_SeedA = 2AA2B11020914ABD97AB6FF9D92AD8199B69FE743187522BD20E4359339FB15EE1C8D1F9E20FE71B565E048BF62FD55717F0D3DF719DEDCA0E0CD83A8B892A0D H_OutputA = 875E496F7225CE202D540AF85B636BA3B6EAD6EE18FE5A0CEB223CFC53275110 DRBG_SeedB = DC50BCEA1A70D58F8CC67D061A3CDFC38D3BE1335442DBCB23B08FC44E5F27F6 H_OutputB = 49BF878389661277B0CC1D6764742037DB02ACFE5BCDB4A5EA84E504C5B939D7 SharedKey = 480975831F3C775A52D310A95C4C823B17B2F3BF4490C72DA61B22760F3B18E6 DRBG_SeedA = 8498603A1D94AC3379F08E89E904EC06D28A563B8165E063777CB65467C8628A9F759E8ABE6C2787F428A271B438E8B0B2B89EEBB8ECCEA9E0FFD1C776F177B9 H_OutputA = 7AD16C8DABD295749A997916091F899BCC504E23345454AA243D8AD077D778EF DRBG_SeedB = C05EE43FD0930B3647520EEE8D60C9D4DC83919F39E0F635B903E20546DE3CD6 H_OutputB = BD715F29BDB501EC926D06C4B0D856D9AD85C37B516E3A24A859C0D9809E7D02 SharedKey = F7D48F749CCA272CBDBB4257858A6128C09C4B8CC965ED572FEB5A67F239A430 DRBG_SeedA = 5CF97069689F618499A5E623F2CA04464BE918E08A4617E97B8283B1F337207AED8D6C8E039B805D644A10D64AAA02A4E6512954D9270791B6C9533B5F05F294 H_OutputA = 98B20FE1FCC95DA504AA7EEC66AEEDBD9B888EE2B45E056837E1EE28F4B408BF DRBG_SeedB = 4C529028EB72CE780841C4BBEC275F985C3E9F0E4347E5A3A4DD4537815FD51D H_OutputB = 7F6759CA5B692E2A6447CF6175245305C6A4255955AC760CCA0CD94542F2FB05 SharedKey = 8974F6FEE1D920412D76F108F873F6D2F2BCE0431BDC9544C33CDEC5931C0074 DRBG_SeedA = F39B4EC01196888A02702FD5321D85E6DE39B6769200A5528086BE703F8D3895D77EA73D7F130D5F502358D74AC1AE3D77086CABAA06FABDD2964E379EE4AFD1 H_OutputA = 564B72E953BACB85532A26A7BEC6847CD52C75725B290CE87EE3A497762597B4 DRBG_SeedB = 79B40917BF03CB92DF3E5ABF0A6E437E306EF6024B0555C5D08E6A2A0CB6330B H_OutputB = 1F5689C97D67066C8B5360AD08BBF7219954E858B909923246C2B00CACB64BCF SharedKey = F0CC1F9F230699E93F3EC68E59FB5E92C494D0F4E5475BD5C55F0F2F8D4806B7 DRBG_SeedA = 0EFF0C7ED129E8B442A4161F040A52D5D821103E0A7B2219E9F1FE11ECD69304A887FF3A809D6F1FCCF6FFD7650F18A4286391688F2DD02E62504778B25DF8EB H_OutputA = 8E50B6C97F752F285C02B5E0D87D538F488329833743CA2B531A2F1C3FA1060E DRBG_SeedB = 1134AF2FC4BC01589F11F10A1D02557FD7C9BC6240B0CD5236C275B848151E88 H_OutputB = 44F715F30A2D07D5139FA080877DADDF8F3CFC8957D18A1D8C728B115A8EA7F7 SharedKey = FDC4F2505E75218CDAEC0C8DAC365123D8C89502E1566FF2B07D4CFBECADC868 DRBG_SeedA = 9B04194A9775BCC7E84FBE81178FBD2FD7CFA957120443DF8D5B6DC3F1A94775C2869D5ADC1DAE9032767F1A20C7FD20823394F22786256A853734DD49E68387 H_OutputA = E3D2D573FD46E3B23ECB44530543C1A630797874862B13D11F9DEB3DAB909C04 DRBG_SeedB = 16426E4FC95AE3BA7401812A280898C77A9C687F201D4E026FCBEF4FF5D75EC8 H_OutputB = C4B033E690803D64620B7E014365F2ACBF19B67BA7B65DCBE030499A4D1F9211 SharedKey = E9183AFC6554ECD505D1DBBAC0AABE1F7958D9404F62F694DA85F22BD2DE195D DRBG_SeedA = 5A50FFABD4BB09AF5F52A936227CBAEDB3D6C6E647BFDC120ECFA05506E03DA27D31D451EC2AC6E43F6B9BC831799E2B8ABE752C7C38724C8D8264C82F184B77 H_OutputA = A664E705EA5A91555356CB387CB13AAE306FA9EE3B21B087FD50D30D47A027A8 DRBG_SeedB = D6B5AE88695CA7A7B7A803C49C0B6E6CBD08F83D0A33190297B74E7D1F0B3093 H_OutputB = 52A7430BE561A1F85C24591F5331C907B2F3B44BE937CC6054B6F1F5C1CE6AFA SharedKey = 5118E3E997D65F8E5C006D333507175622F3950E578119942218EDA505FA645E DRBG_SeedA = ABA0DBA66DC317ED0F11B91B149EF74864AB438E8F9ACEF44609306AF90340B63C1CC967D32B5C8CEE470748EB409CBD2A2FE7C59B35E5ED71E277C4E392EAA6 H_OutputA = 2D0867940FD4186EBEF2B821955CDD608CCA0A5AAF5952CF82E3ED833CDCE084 DRBG_SeedB = 11DA2B93432533C4D5CA97F00A1771C946CA77E88CA5EC5301B6F128CB49CB88 H_OutputB = 5FC9CC5B8CD11B2F60DD70F4B839A52454FD102974330A6883A2C15704B44604 SharedKey = 3E678666F9873607DE28BF6DB6DA88506BDEE46EB40D877C6B87695EE9C9787B DRBG_SeedA = A767432702AED40077DDB6E0ADC1ED3027AC12E2AB05B404575CDC839ACDAB4E1A45F793D0375A197F96E6D659CA6ACC76C79ECDBF9A8F54B63710FB980005AD H_OutputA = 8618E183D620F557524B1183100A2CD487EB132B24977B756FDD2CFA5CEF1336 DRBG_SeedB = A203223586E38E46A392A2337BA39DFDD070E274C1E3E402F78ED72F22EB2A0F H_OutputB = F7CC4660E4481E6332756FC3142F3FC893E246B2AC70B306AD33DF4C6CA5C41C SharedKey = 5E6BDF05CDE8D1FDCFF8E3269642CC12244D2CDA8E0D416B268647CB58235B9C DRBG_SeedA = 9FDBA85F420DE3D9838642514CC93AA483C94F38BAAA5C66ED81081C67642DCE381C0E4FFC19DEC09EE5291E6E9FBADABE853542CDE3C68A3C75EB56A562DD52 H_OutputA = 3E4BE0CCB67E982C993733EB5318D0BA7A089FB5307451F6E6BBF72C47CFC73E DRBG_SeedB = 9944198ABF5CB0574EC79838CFDCF96263DFD1C54DE74761A8BA55167F45DDA3 H_OutputB = C0EC164616FCF9E65D84171C12B7058CECC2AFC4CF6F99D77C9FFD1052E6DC56 SharedKey = F7B764CA6495AE23FD458C08EFD052C73F225562E2E95CF118B13BF66B23F6F5 DRBG_SeedA = 4DB14EC9AA4A23F9E9941959C3F71445A6866EEB89156DCF755C8E78E226FC2C119E06682F9B79559A1C5CFEB2B341FDD57EE6E33148FF81A1A53E03F0548A19 H_OutputA = A846C4B3664622CDA8E2DD74548706F9C6867854B916A413DC22C89F5777CD9A DRBG_SeedB = 9CD6CD17B7BB34A10A26C367B96439891DF53C6520D32B3EA1AA69689C457B4B H_OutputB = A8D3F1502C550F62C3D42F93C4BA65E8B36522F6EFBF657C7E15C4BB48FA8F94 SharedKey = 2F989DB82CAE83C6DDE10E4F497E87A74D29833799EE639A8F626AFF31A4614E DRBG_SeedA = 0396BF83375AF4C5C8E2CC8441D3D3B13C52BF584089178CD4D257BEA84EC20865032E029B8EC33B8C04D24022010C391CC4D5B90AF499691E26F9B85462BE98 H_OutputA = DC14D6883970D3BDE3349BD5D338B49D753F0CD7E4AC03A90CFF3AEB5B28B214 DRBG_SeedB = 821D7D6658369E3D4BE407A6C0526E4595F070A21E4557A7369E09E66A1B896F H_OutputB = 23CEE4EFE8E6646DB4654DC19B2ADEB8A84D4277D2A3EABAACCD1E673E3CAF28 SharedKey = 759ADD41FFC0E12C846EAAC6927B51B3ECE9773EC69584316F08465CECC40E14 DRBG_SeedA = EA4469ED576EA3F24F516AC9B25C9FA8021A099A774A9745C78CC36824B4D08AB28741DAEDC5B149A822B955A379B571DBA67B902A34E987F8FB23D0BA7DF692 H_OutputA = FBE7DA3986FB9EA0F2525995AA048F8B758348A646B65D5034BC8C7FB7CB05DA DRBG_SeedB = F936EA1015C58EE007C0DB72D7A057A248E7175FE3EB9F34042C9C8FFA0B1918 H_OutputB = FF9F83F5774143978CA10B1F69DEBFCDFE4951D125F37D8C29F2D09C3F55D010 SharedKey = 0FB7004456E06AC4DAB8B979534101ABD87DD73A1324031F7AEE7BB3253C8144 DRBG_SeedA = D520339A0EC33D3E474959377EF9E0124ECF9F8A4682E3C29CE4F8D17E69C99BD350C92537D44997EAD89932D0DEBCC8A7DB8F28030C4DCCD799814A4AA0CA73 H_OutputA = DB2A04EA78E6DA27E1C32DAF05B15619DF31112BF9B90BC6D5B13CD293258FA6 DRBG_SeedB = 913199CEC7F90BBB5E66A3F1291727382970192278718D0CDB220379B03B0946 H_OutputB = 1A65FCCF3AE9156CC8C79C0DC482294A3D341963EC308CDA8CA993BF5F05272E SharedKey = 1DF8D4F663F710D30764C0B3667851714221688D8DD0072E0C8174DB16631F8F DRBG_SeedA = 5FFEE63CA9385FDDF9606749C1545166A4534DBDDDDFD83E441E1BFC47758864C11FD81C00F2F1ABBD6A056C1B72001D87EFF418A8A60088E5396CE594FE39EC H_OutputA = 59ABD251CF75C8FF8517B754F629E194A639F0B3B1907A6EBDC9C83F34674AF5 DRBG_SeedB = 7361B129404D3702AA164D9882CCA154ACA8B082D48740B290A060C58B663606 H_OutputB = E2892370E0F79D87743CFCAAA3CDA52405651D15F1DA865B708CE5679440F3AC SharedKey = F464D41046394D3FE3899AFC426C3EB23FB643C5C2C260F86BD00439E2DDFBE8 DRBG_SeedA = CD6DB0724B736F707DB4D6CC57BE988368F70481D3E8B0781C69CAA67E0A5620EE5646EC7C87089F75A567362FAB9B39C2E561E7ADC9ECFE5B39790D8F2B85B2 H_OutputA = 391839A1F5C6F33E8750A1793F46FD8A34424B62734754B8A1622DA0FC7AB41F DRBG_SeedB = 1F943851D572B460582D39B484696EDD34B020A46BBB1E4718197C011F9D7BD5 H_OutputB = C879AC64F1A20AB4710AF664C7520ABAD9C6EF8C96616C01B681AFE9F80ABC61 SharedKey = FC1773FE63A8C81687A7B18A948A8687D1B0F836B7DD14264B435A160A4BD183 DRBG_SeedA = C73BE02A6ED7FAD6A8FD9515B378BE3AB967252CE28B9E4DDA383BDA863162BBDEFD4B4F0653B8EC8A40E76553D34CBDB1DE52446808CABA5BFE99EC1A3782F7 H_OutputA = 9AE7D77C913367103B18C6C5FFC77337CFCFD8D45C0FB366A5A8C4BF00ABF714 DRBG_SeedB = 65078A6F2471419466B576226D323FC6331D4829782B40276A886F9EB4305118 H_OutputB = 940CA4530DB4B326858BB6AAE2EEA161914912E201C45005EB5254A4A7A39A99 SharedKey = 0A2E36E4F9B5373592298F31DC86919A14177D475EBE574BF77D0FE1D78CD87D DRBG_SeedA = ADB6190F008ECF328D999849BB334A29B8A8DD254613C711D43AF44793AEF960B2AF7815DDC51A57EB0B986B13ACC996F3E56AA2BD29E97D93AFF6A6148CE5A0 H_OutputA = 8DC3A616027F482DE00AD49938F4D90CD631EF48B41774023AB6FE96FC1F44B9 DRBG_SeedB = 03C7037A3B15095469B0B18BBDD71BF87D21BBDB9D67E1DDF830CE73D8225D2D H_OutputB = D415EB5ED9B5B9D1349D1A2330588B8FF4B58A995FCFAFDB2DC60D4C1E399480 SharedKey = 29E0B1ECF50485A6E8972C0577C4D6836905D3191BC96C02FE151CD2AE48A6A0 DRBG_SeedA = 9EBC0E4C53BD034CEECA3C38AD3DD29609FF846AC99FD52DA5D7F4735B0709749C687448758EAD5F18B316F92E3DD6773F7D02A2C8843746974A652764C25F67 H_OutputA = 9D5FE1011F1C8BA656D40291E035BFDD2213652D1446BD6FD61E2E2700E93435 DRBG_SeedB = 64B59FEA62FCECEFE6FDD6250FCCAA7625816BFD0C7F0CA868194715715D009A H_OutputB = BBBAF61A847F23C64A19AC5C52D93A3FFDBB86400F5E3741C9CBB734142B153F SharedKey = C66F5188D07C476501C4646CF321134736128F2F859102CD073FCA0C65ECC9AD DRBG_SeedA = BCA20E6CA31170A32FEB78E0F040A8F2DE62877033772681CC44F3805CFDE6A0DD505FD24C4AC13DE0D3F9E0815ECF2391F135242FFE44B7B03460678B40F787 H_OutputA = D699ECFDAB955AFC34DD43FF17E3541D9684889EF8504167B4206F022C84B623 DRBG_SeedB = 7AFEFFAD10A5BBA785050D156100A0D2B556D401FD7D13051D0F8E463CD73CEA H_OutputB = CC3998955AE6B6E9D28A789470C89C882B6474C03B4ECCBFCB0C2F3799ACA94D SharedKey = 49F543292E46A7EFBAAF23BB5DCD28353E39A9596C020916C86B97C97A5CBBEA DRBG_SeedA = D082FE6986DDECF3C90AE6BF024A58B3167F37A6193E65AE3796C534C4197F038BEC77BCB35E228304DB83A52339B98EDBB8D103AC39F9C00A53E93CCD773FB9 H_OutputA = E4328D04DCF12F04F5990DE4CC549B2E0E75CC030A099BC764F0F6F4BEEE9DE1 DRBG_SeedB = 028ACB89F81D2F18F81757D64447CD006B9FC86CBB6974E5523576645FFD0F13 H_OutputB = 1B92078EBAF76F257A7F439937AF92D1A521651052EBFFEBB4B258D6611FEAE6 SharedKey = 895AAC32723CD4035395F284CBDEAEE12C6963D6DC9495832758AF7B0F694FAE DRBG_SeedA = 12E0D83D3E2368344963F1849DBA1E2C558868832AE696807F3D82D34D64285DC04D42651297901FEE98DA5BAABF8A7E84600ADBD7984E7F9FBE18CA9E096DBE H_OutputA = 2B0C9BEC9314727AA67FDE9CEE065C5BFE084724FF0A6848B61F86ABF922318C DRBG_SeedB = 31019EAE794BE1183E8DFDCA3D6161EABF13551B31171C07E80AC3F7022BCE53 H_OutputB = FF770F639A0E4862961B978873DC184E40BF9A00581DC15BA66259FCB3CBB734 SharedKey = A4FCABA54B84EEF15C6D5405BED231D9F8C75751D78B5AC89748AE9F34407052 DRBG_SeedA = 8421229C3D4082EF7B1C52CA0FEC0D5A4E306147B42F92A3F49BA4E801BD0DBA4EDB25AA491CC285C2CAA485AF0EFDF142C98FAEBE15E387220242F74C4267F2 H_OutputA = 9FF27A1D1EF838D1950CB5C10EEE405582A6FDDEC4B30A7817E3EBDCA32CA777 DRBG_SeedB = 2AA33CD80A814498D54B92560C080BEFE3D72575B5DFFC7D10CF073749AA33BB H_OutputB = DAA972807A1605EB686A394F9A76BDCCBDD47E4328D7AE12F2ADC3FCA24301BB SharedKey = E811B55924605063CA7D6F75F4E248A3A64DC12EBA5A8F47781F2478DE774E74 DRBG_SeedA = 2660766EEC92F8F1FE84D13B2E5526FE105155CBDCB04B3D7F71968ED4B49921AA6AB84C0F31164D0EB566DCF271B176AC760B6D3554AC6BAB491B1DCB65242A H_OutputA = E475DB79A813C2A8EE5505BD46A70102256416BE17208B2DEDEF0053CC81131F DRBG_SeedB = 21E05173A132356C3F9D4A4A6A0CE8D1412587263657967DBE5E073D686CB4CC H_OutputB = 5A3ACAE43E800FCE18A1285193E733E5D3C47967BC16ECA32AAB1F7473DA0538 SharedKey = 1A1ACDFE1B54EA72325434542DB58DA8FE9AA341ED74DDC111AD9C54C8327423 DRBG_SeedA = D443CB8B58B0CE868EFCADAB7491F313250B2DC4CB90B5887E5C057A454237F9667930620C6F952D726907DBF0D738F1084EDEF630DD57369640CF921C80B625 H_OutputA = BBB9E7D4F1848D4B54FE2C63950A63CA1300AA8F9037EBCC51881CD92397493F DRBG_SeedB = 862411F6E07823EF3935577CCC4702351B8AE6D048C433B86892AF4ABDF3241E H_OutputB = B3B5DCFC57F5C719F2F725FDB17EEED01025D366A2D93A9FD820FA7F60E3920E SharedKey = ED8A195E3CDAA29D5FFB5530FB1241323E7F494A4737BF0FAA048F6C29CEB381 DRBG_SeedA = 78C83B14EA077BA06C29C03406103E53D7ACAFD30BBA2CEFBE5D483EC284351F30AD23F69ADAEBA9C5B722CCF3A60A7070AC133F071381D83EC532EBDE1F99B9 H_OutputA = 709AA56073CAE6A5ED97CE81EA44AAFAA54B377AC5C44C330BBB0A2C1764DAF6 DRBG_SeedB = A3E79354FAB80987D378FB3E0BFE2A8B6F272162A085F277B64D5DEFFFE45EEB H_OutputB = 5EA39750E7DEAC6BA06D2B0D5D6D9AE4048062B42E3F089AE364BB3533BCF408 SharedKey = 814B90C03025F27FE42E773C71421BE0BF589839626D432B013F77F5E4141004 DRBG_SeedA = CC886830A99A7B749773FBFC46A224C1F2ECEB99ABC25314CCD38A4A8DFCE4F1766A540E4A76CF43946090891AE7DD2B2622107E46F540CD2BA0262F77D2E801 H_OutputA = 218C02BC6F66EEB174CC735F2766F7DDB8036BC3B943E134349049D70A5B9128 DRBG_SeedB = 3B981616FAC23FA132CCDA2DD2DC7E99004BE510BCD4169484B13895132E9D64 H_OutputB = E4C91C4CC4F16BB52B3E97C4AD4374A92F6DD7DB58A45F02EDA4D1691D007914 SharedKey = 98E0D7CD54FF2C0C806644846AD381336CEE06FEA06E870CD400D5DB4B587C38 DRBG_SeedA = 50875E3949A405ECAEFEC5EC25F467A29B54393787D3C2C4508A147FD22F9CC7AC94DC4FC8BB09F6320052335F22C0F8A4BAB760F3A29EC3E75A00C918EBC997 H_OutputA = BA271740EAC32914B487EC69EBAEED4137F67842585A686C6A849B7C0D8ADCD3 DRBG_SeedB = 1A1CF31FD96AB47330AE953852A4BA63FD5E8460FEBEA5219D823144021CB48C H_OutputB = 40101B2B58128932AA702D5ADA8D5430B05C153A0FD959BD7A237A6771529E3E SharedKey = A2089789C1C8B46BEB213530A172B82CFE82E6CF17C9B4515572644F399C5677 DRBG_SeedA = 781AF8861D51B068BD186E73D94635B7CA6AE21DD36F4DD6C945766F517632A246E61962B2C63EF11E152E4C7DB8F8BAD0F58BE33B29BBFE07ED52D4917EA37E H_OutputA = 8AC2225E4A1BBD4FD363D800C9E78BC5686B864D111AA3EF0DC8682E508A5D46 DRBG_SeedB = 88EEC92D324E1DA2F9A203C7546E745B7D72400CF85181D10325B516A165E787 H_OutputB = EE15896D0C4DB7155DA61C7C7733C326FA9C9CF2085B954924DC962C07D0B8D1 SharedKey = DCAB29B30296549B6F9EAB30633ECFB89CD6CEEC4CA5BF8CBF64F89347C5C064 DRBG_SeedA = FACA416F2DC5D6628B6C8ABBD70929181D620C7AD0002CBB444C3AD5F2F359C6E7E900323C3185CDA87BCCEDB244DA15BD635E8E718564CD97D4FF9C40E5FCE0 H_OutputA = 6B89C7F35B26398E7EFE63D4B3B23E1FC485D05242F381077A07E99A7D59EFBF DRBG_SeedB = 46592A0A9E7EEA6FC513AE82C4E6ED05C0ACA5363CF98A2C4124DE65E7F13363 H_OutputB = 2828F6E81FF27ADB94FDDBAF6D5D3A84901396871CD30D9D25F79969B7E4E4C5 SharedKey = 6DAC617144600F969452DFE601070DE026BA623736836811F96A7044E09CB3B7 DRBG_SeedA = 6A8BEF0108D3E1C1AD3AC23DB6178AC5AF6CD2291CD7B8689182B950221BC6096AD7C3765FC2A7DE9D9743BBEA6B787ABF5E72D3A99BA249914703F51CD021AA H_OutputA = 4CD83315D8E1E0F7147D21CA5CE84C49A5BA36554F341DAEF72C1C6F9086AD8D DRBG_SeedB = 264288E10281807E228DC872526E9A89F75F88F201F8B92D512D2AB02606A8A4 H_OutputB = 74AD3ED3B7B2B3F5B047EAC53C58B70D051FD84605AD059C6A08A46B92688646 SharedKey = 4671BED9A7E192FC48F8014516407EE058EEC262697E5CB56A687C1A4A060830 DRBG_SeedA = A01D64A42859320409E723E25EA17B1F63ABF7547F97B8EAE9402EDD4DF11BE73205875BE576F07544EEFE5960B70071DFBA99BF296A2EC0D412ABD195201D58 H_OutputA = 69A574161282C1D83678AA7E951E22C75B5707D52C34F231916BAE2CC6472446 DRBG_SeedB = F43F0711D69D24A1E67FE6732E404E6028C727F436631FC09A8AD348D7D63B69 H_OutputB = 9E70164A65082F97802298AF4F0B85BE92A781FFCE56EC220FA1654FBBBF8B34 SharedKey = 53ECD264DBFA37C9960FABBAC5C2D0F93D21996E852F0E89EFFDA330F6EBADFE DRBG_SeedA = 8DC14EDD06800CD789D0BA433C4813DE5F29E55D5BDB9A5C2BD88972B3CDB25804B922FF40F8365195122B91600BF70B8ADAB90502D8692A9BDBB2CFE0912C9F H_OutputA = C8A1D6C2CA4385FA84EC5E913715C6205EAC5F518284BFF8CFA396E901672FE2 DRBG_SeedB = 0D36D34867702C9DA0164D8F2EA18AA97447C056474C2A89899DCBD4E08CBBA9 H_OutputB = BAD26C9785371567ACA8350FAFB574B3708BA7CF7E2D7627D1F44323E85C0BE0 SharedKey = 58B63125E133F269150506233765B9AFEF2EFE241D30A7F7B3B377F27499226E DRBG_SeedA = 6453E8FA07E16E64E0F54BACD579A64725CD5EDC8875D35386A5E3D73256672F0AA06D284CC98813026A8A7C46A3F4152EA575A50EBDE465FBBB2C3B53F61919 H_OutputA = E471EC8365A167DD99380D532E183CF7574BC22115F7F3C15CA178C68DB117A7 DRBG_SeedB = 1770ED4591E5CAFA79A96E8CC779AAF91294FA4467D89FB58CA1AE194454BAE5 H_OutputB = DBF0FB0E9961D5FF1F35D73B1669FC6E555B10FA4628FBFE0F36BFBBDE7FB89C SharedKey = 5371E5B7B489914AA0BD025D3DDA666651505CB55486247D6FDA281FCD518CE3 DRBG_SeedA = 67DBD78BAA7C9189C39CF014A6EF3F7B9090117A778B2E68DAF60F9220734E7D8F840869A31D6FBE7B5CCF16E18D0807FAD7A5A4441A18548E3D39012BAE9E98 H_OutputA = E2A149852C507C1B0E33FD85BF41FA49CADCCC673DCD1A255A3A9DE8C4BB42EA DRBG_SeedB = 28B330E58D15EEC8F91CDE9602BD1E00D1C10627CB6AF60550A781B4358BF8E4 H_OutputB = 894D947D7014ABA023B39A23D4A545CB086778BB907F85FE313641E5EA5AAE10 SharedKey = 47C7E4BAD51A44C3829188F9C6FAC25A064A9A5B3C3C08610D34A54EDBC9AC11 DRBG_SeedA = 181D713E6E759FC24BBBB9DB8C309194E02180A6DEFF9980358768E6CA157DD10124E6C1855BF202DC324B5B89C092688F5A955D01281E9AF2FEAA307EFC6F61 H_OutputA = BD2C63445ECB2D8E05060E0DEB24FE5671ACA333D80A0C5ED977E0B6F813B30C DRBG_SeedB = 3553B78E57D82BA9C4835B0B18C848A69CCB229B1FA5BB8ED92AFF1481A555FF H_OutputB = 88EE3C59DD82FD92CB7A29CD7473F78CD3FEC0957362D525243CD19004F31618 SharedKey = 1FCED0690C244A792B080D9E23C98CD2F14C41CDDACFEBA8A45700C0600E0CCA DRBG_SeedA = F240414C960F4E38CD2B1C64CE66738FCB6611D689CCD6B01BD8BC92468EAE745B3A9C96A7060C54AFF27C03A5E7D3280C4E67D72B0F03D8B56D770226B39DA0 H_OutputA = 7EC25EEA2E470DD39E3B4954E2A7F11CD212BD6A371FA008A11ED5C0ED77E591 DRBG_SeedB = 550E06AEEB7485FA6102A2A3CA13EE6AB748C05EE55077AE2CB69B23B7F9E8B8 H_OutputB = CE77121147B466F5C61C64739F0746B50809FB63CC089ABB81F2D18BD0C78992 SharedKey = C591251373F16733CBB5A6A04D84AE785AC6DE199008C61F80B9BC5056C203CE DRBG_SeedA = 6E6410D8877934BB6B7AB937B6DB034626F2BE7750E7C1B4A43587FB1BCC7890C08D9C7DF69C715C20936DECA9ADA384E637DD3215181735D34A23EE77F4F092 H_OutputA = 681706EC0367E3E3798756B7A13BA48368A01B33C8F70E75B10AE0D0997E0410 DRBG_SeedB = 9FC88CDF52FBB83333B307C6317F43F492D99C4CE9431136FF947EC3E384C9D3 H_OutputB = 4C5DFC63BA6FB2A49639C4ED024E6E60513090EC9F83384EB7968A8A160D6EDF SharedKey = 3F4678E9CD9ED1090CD9E0C669F4AF5B412A24CEA2109A43CC13FBB11F8DED26 DRBG_SeedA = D8C78DBEEFB91CEFC5EC4056DFE6FCAA30BD764224B9607A6A95CF67A4628A78FBF25693EEFE8F03E6653BCDA2A7A2AA179FF17E859F9E2A83B7B2EA02B49A79 H_OutputA = 4CD0FD57221966C1E401606AFD2E530E9C54DAEE6B2BB3A320B32FC36A01129A DRBG_SeedB = 61F9CB69DF56511D33B7B7CD876A75BD25F8E15EAD37C636A7C54FC2DD4C58C9 H_OutputB = D48003B198B8B8027467A7351D9CCD70D4A4E9B30F260019A1F3B36729A30288 SharedKey = A3B2701401241E0AEA44325A93F01AB8FFC54D3B359000BCDD275DC6C9F87AF7 DRBG_SeedA = 35139F5DE1F5AB32E024B75D8F35B874A3859E49435DC06B5BDD48BC7FF554EFFCFA0D5A981F9649B0B7F17ECA1229BAA570F96B6D8C735893C5014D7F7F8B2B H_OutputA = C3605A8875F13F4F8489B79DCC2627A8A69BC18901DB7414953669F9E8927CAB DRBG_SeedB = 69B11D7AC05AF05288E06153D4B189B7D5E96C3C317CDCBD6AD8ABE1C90F90F6 H_OutputB = 268DB8BFED5576B1EDF984A16241ADEC7569021145553EC8FB894687378DD685 SharedKey = 4A12145C821EFE3E0987552E28577857D5AF8E7D8A75CAA98F20842494749D32 DRBG_SeedA = 52148B1F548D1BF96FA01793AA75F409D880FD3CBAFF62ABE528A10F56D21ED3D49CC5C0F83BB442BF480264A794958502F97D250B692543E36B027D2DB19F7D H_OutputA = 5F13746042B25AFFF831B0346219FA41A848455EAECFBD18A41C2DDC94D59187 DRBG_SeedB = 7794AC2AD364DBFD4586221EE15710CD99B7929C91F6C0ECD7075CC1626D8427 H_OutputB = 41443F6008312EF75952B32C9E15E59F36239510739FAC2109871ECCEFC3DA20 SharedKey = 544368D002BB70671E62800FB26DD5048AEAA02F24D82F800A355385D1CDC183 DRBG_SeedA = 765DB695E749EDFF6E5A78397BA2EB744CCBF8828008A972AAB61330D56DA2F950541C38CE79CD0EA65CE5FBFA200397BE8D58CDD75EB7BDED567F4B10E4FA18 H_OutputA = 3065E3E39028EC06ACFB148150D7AFD384C9CEEC66E5B324BFAD203AC61EAED9 DRBG_SeedB = 6988FCBB33E06395C651D93BEE2EE794EA8923C86AE4653EE48081F073BE82E1 H_OutputB = 0EFCDB7691389A2E33FCA8F3FEEA80B2102F3DA0BC14763F787D0BBA5977CD4D SharedKey = 99BC4C118942D1BE6EB93694F4C7EFE7B4AD22BD56D84531B9E39A421EE7F1DB DRBG_SeedA = 7BEBD7989D50D5B4E00150B050389F4A5934B021D4A1FFC8AC9DB2AA221FC6E1B891E4C81492261749057371C942B7AB253454620EBB13A0861995626DC36E79 H_OutputA = 9F408E34196A6BDA3D4F6619B47CDF78F3550D86E86A511053B538B15C5360A2 DRBG_SeedB = B105034639CC754A070F1EDE91D2C947833A1DC3175CCD1BED076739A393E5CE H_OutputB = FAF2165A56A33EFE75264B10DEE27202B90DBF5F9EF360BEF4D1B2A8D7FD3AB7 SharedKey = AD0D339AF2E37048258E068657B54396CD9910296C7D2C443C909C7ABF9A8C71 DRBG_SeedA = E12932FB66611B31C3A0F1A7EDD01DB24925C5EEA9EA70F802ABCC020110A2462C7C15E5B64DDA426A5C6EAC43084D239D0CD1F9B900C95A6D53129425F748DF H_OutputA = 7AED2E2EE5AC482E986D0031A77ABA6759B639FE943E59CC4DA0DC416F8AC3FE DRBG_SeedB = 5A12EF8C5DBA38719C3338E5CFFD27ECE4B17F14EBDD361EA4517626A30608E7 H_OutputB = 97BDA66D7440157D4CA193150E69845C2A81B8A64393390866539D72E491AF08 SharedKey = 99AA17494B13B0119BB340F3E8B1D5F64568399E48F343BEF89E9C3265EA3CAD DRBG_SeedA = EF487B151FEDCCE4A47B0577B6243D6230BA1D38338D1B825094B03F23EA72202E4585C4131A943332C42F94DC1F986CF9EFEF7602D64C2D8091BEB6290AEEDE H_OutputA = CFC7F9CC4B74F1ADCD6878A8C5F19F018690C08A6A5DDBFA1546458D7E2AEB73 DRBG_SeedB = 0D86F954287C23E92109F6CD83C5EF0EC07B4621737B26B85A163F3536132C14 H_OutputB = E9D122F27F73391462DE1FB463AA070FDBAC669892B636F0D46BD3CEE3E5CF76 SharedKey = E6D27F4D7C60D8A7C2BF4EED99696AD345171DBCC65C0CA98F0724AC4D4BA9F5 DRBG_SeedA = FE60E704C3E22F74E8DDDB6FC127CDA6936DAA4BCAC0D21B8FAF66A62E7AF7DBB49394401281A116DAEECE67361E28AC6FFCF0A1BB74AF8E1F870C59282CE061 H_OutputA = 7DA74DBB80F81BB973B11BB0B263FF0AACE624939CFFA34D1B1A635E76FAA494 DRBG_SeedB = 3E35F21A80477A0F467FA55495A4AE9207639B576DA62342E2ABB1D769BD3B94 H_OutputB = 0CCD9946B6712A0E608D8A281D5202113C040D7D161FE458385133037B1CBEC9 SharedKey = BC055DF4F45B8ED6773E4AF60852E6092C925E75A16D2B185B4257072FD888DF DRBG_SeedA = 6BAB12526BEA44D3193AB8BE86BF87A9ED346C217FC7FCE2CF32B0F1DC687C85C82AB854090909AD0C3AF08228969C3FBC909AC47D400192C594E70271F02FB7 H_OutputA = 500DD8FAC9C5A9E0D8BF99DE0445754E68E9BCF59CC0C98B3ABFE1589D8882C3 DRBG_SeedB = 01136FB563CFA9137CD127F5EBE9F1643C3CED5596E4213E2965985DA1D7CCA9 H_OutputB = A4729E32BA82346440110F75276D1A923F98AA3EB4D85601A22D92DEED2CE07A SharedKey = 6D303BA524CA2F8DA3635316566E34FAA2BC8474678D89500BA701DB1CE50206 DRBG_SeedA = C87F943E278A3AAA4164D50030ADD7EB99C0AEE7C84E247D5C9C47B4A4FCE8C7763EAB216E07D47580DC3C4E50F406EF024C0210AFF51AAB5DE78FA7BA3A8DC7 H_OutputA = 51C8457DF48936BF2FD08F34F18F200242E82468E2BEF772679EC49E373EC60A DRBG_SeedB = D2F6E6AD11359CE08DAF23A853139EDF1855ED7E699A8EE61F7AB3DED68A79BE H_OutputB = 54F8007779C8BB7F1DC2D22AF78C4486F5DEC1424D4524088A9D1370D22BF468 SharedKey = 99624BA785214809698C4D39E8DB045B5E2CCB96D96633530F81C558968D1BBC DRBG_SeedA = 945E31E979CBD645B793FD7230C7774A7A1FFB5872E8FAE031C265556C6AACBFB2BE3FF189979D47CC72A81BD518AE402FCD72769C74D3FB25EAFC904EFE59BA H_OutputA = 4362F734DC411714D21075E143613DA355DFF12114EB790F29695014ABDDCBDF DRBG_SeedB = 70B1E29776298D8A7A6D4923CDFAECB90F0BB9AFFF413EFBB8E8BB881A761236 H_OutputB = 7B4144CEBF839445521C125EFF71DB24FD8C84CD5863852B84C19DA618BF70AC SharedKey = BD5DEA6757F249CDD824793427D8E983CEC901279B1636CB0B4B710188EE245E DRBG_SeedA = 4F8319D4C74E642B3D797FDF202AB983DA93D30A6B8AE723ECEE72C01EFE386F96BA163FA4DDB6D82D546061DA743451B11CFBB6A3175390E9302F8DBC429447 H_OutputA = A7610E6F75AD80BC43DEB11F3A2174C6B26B4C48106228561962C8DD2264B0ED DRBG_SeedB = F7BDE0B94E36CFAE4EB3423D1E8EEDC861931630E869323669CC314C309E6087 H_OutputB = A5D75E1978196BF825828EFCEE02B5CE39BD1BD373708886451EAFF77CC35B78 SharedKey = 6A9A1C6346CDCCC52A29E70A2B310A8C6D5E4BF93023AF359A7E24C19BDF01A3 DRBG_SeedA = A59A62A4DB8FB1AFA8A1A1A28DD867F7EF6F1EEF53641A342A75BE6607214050BD20A46B470F009D46928DFD1DE052FDD2281A4F4E9BEAEE90A3F64CAEF670CD H_OutputA = B59C280D4280CFFD14B801349A72A932EDF93A4B58C9622D926FB9EFD0A4969C DRBG_SeedB = 021AD3AC4204CBCFF2A1CD7EE782F42AF7C487CE81201FF447C653F65AB065FB H_OutputB = 0A58C5B15580FF8C79AF42F52BD7981656DE35A0707264F25379859AB43E3079 SharedKey = 31EB450E4C1F440B953BD23A99480FC10578F0E187B0F52451F67874E170FD15 DRBG_SeedA = 1121CFA057957401E9911A195319B1AC50680F49A846796FBDEECE8FDC6418D1866638916C32D4B1C921DDB3740B67ABC10A26E2DA1E74B47D6201036E17DEFD H_OutputA = 25CD45D2EF301E4B4BFAB816B5A9AA577265961AC973416A47667118590AC883 DRBG_SeedB = 2CC82B884298C434BC7E9B13DFFB8034DEDEA266F62294D102763318E617EB06 H_OutputB = 298E6AA41E9F6F3648E3E59BFE96E147F0B28504553CE6E8F3B3B252A7A17625 SharedKey = 17DAFC043F4B486D217776FAD9689389A24B03079CCC6BFF26CA88DA3DF60AF1 DRBG_SeedA = 7AD0D35FBA4629DB25E9550256DBEE1E269028BE89F426CBA9FA3C44C1A363BB45C2CFAED61D721A0529524658E86FA97F6AF3FF77194777432CE668464A7E97 H_OutputA = 87A89F6B70085A56B2ABE70B61EBA3B095046F005DA554BCBC25B25B03E66263 DRBG_SeedB = C288FB789CEAD9EE6BDE0687C0105A207B9ED7498D0C06B2F9C7F6CCC9133F5D H_OutputB = 36ACD704484EF0671869C81D730E37F37CD601D4207818EF534928427D4F1CF0 SharedKey = F5ECD326F31BBCCCFB5BF37F7D9A8E22F727F674685DB0F9CED1F71A0CD1C62A DRBG_SeedA = 41915E3B97D0F844B854A44297C9999ED2F1D6D5BAE31799FFF0ED5B7AB718F795415628920F14AC6894E8246C306995D572CF4FC25825B43B2596A0A19819E1 H_OutputA = 411D1D73D726098E7AA2FAB11997E623A14317453A0CF792993551F762F944D2 DRBG_SeedB = BF9313A94E700D8DD15C8CC5F39DDBAB978C62A1BFF04ED90C2FDECE6F68DA16 H_OutputB = 64D4B5FFCDEEF4A645550110820C52D725132BE5A0A429137103C5DCBBA74834 SharedKey = 637F8C80D11A6A3E78F59822CF64C78E253849C63FC22614B79396B67F96124D DRBG_SeedA = F5AD64EB8834EFED265164B59A079FD1610B149B0D82B5086B47235D2CBECFB059EDA5191F3C45FA0863E41CC9DD8861AF7F252E749DB72D989CDBCC4B2F3144 H_OutputA = 3138BF04D91B5C341521F9ECB13F5A2578814CBC6B845A16080F000AE80FFB4F DRBG_SeedB = D39716ED8E8C23C360CB18330DE319AEFB5976C9A46483B3B820F423031C4BCC H_OutputB = 8235A208BF1DE607716EE4D18D2905FBC919010E46F41D37E2517FC7CE83FBB7 SharedKey = 8ADBBC3F1C91D014B341ADC3165AF3C002D973DF2396828FE99AE418ECED992D DRBG_SeedA = 21B35C5E1A6A28ADB5B48AD1F8DB82A7F35372958FA73E32584E5C778FBFC1FF31887BF6497CF50DFE14BCB14CA3981D74865043D74C1D52A32CEE63CBA1B7D7 H_OutputA = 702BE356A11AE7F13FA31358F69BE3F1BF4065B716D508C028C02C5C0521D4C4 DRBG_SeedB = D075EF6E7FF3324002AD28E6C41ACF5687F907A558C06C0038A5CD6FB4DBECBF H_OutputB = 4E325B4AF64E9C4050B5F008354196487DDAD0702EAAC1F6F42A52FF83EAA9F2 SharedKey = 0B15C87335E234B9E87DFC45EF95DA1734C22D48263C97D904AED8582CD00437 DRBG_SeedA = FA12473BDA030FA6DE7F58811961F520F44CE8D49D8C041341C0AC751CC503A3744F097C35DD82C84D7169396A508EF05207F0596BB2CE9B25F4AEC1721B5A72 H_OutputA = CB822938F7487A19BE4F9E3BC33CD6776BCE6ECFDB8772E3C51206333011B4B2 DRBG_SeedB = F2D4576C55B14FCC16B1D7106D0FF89262DC776BBCDBA6D9734FD78F16EF54D3 H_OutputB = B29903DB1F4D2D3EDBE4720E1025A5F1EDCC2ABD52838DBFE8963B8627B18A28 SharedKey = 957E62C9E02E4DF726BE891F74EA0F4F596EB67CBEFA0ED78DE503E477488F03 DRBG_SeedA = C9638A918BD70A6F43961CFE743C3340316FDF2119C3608B07BF7D6225A58AAF0BECF9B420A8E4EAFE5A9683E74B904DDACCE04B678911F5E141D8C7F9C0BA59 H_OutputA = 3BC095093706778725163036E9483FCF1E0C7742AF261799F5949F8FAF70147A DRBG_SeedB = A02DE805453B53216B28FB955244E4FBAE1773A92EEAE90304B009EF1347EE25 H_OutputB = 68DDB077CB74636C0E848F34B9A076899D3AEA7C13B965F9E1CEEB447605CC39 SharedKey = 555811F1577DEA6B2C03ED9D8BFF910565D8F2EE93DE6E7BE4B78ABA4A6E427A DRBG_SeedA = 4BD834258962FDD8DEE24B57E73078C788E4CB0BFB3339235721B8EE4BFCC0F1898F3CA28DABA5500AB6E1B6F00060998C4F4C83BE90BFB098FDA1BEA2E44B40 H_OutputA = 88978F7C405E992EA3BC6B0B9AD614405C0C9067FD1BB6BDBB0FE4E5234C927B DRBG_SeedB = D2ABF45D6D4E651092AA4417C06EB1C999CFB13D3A9074E8D571FD2C0F35BB15 H_OutputB = 248E357FB999C4C70AF78BB9F8E320600EA27E52B99D74BA3BDA018974811D7E SharedKey = 6CAF50BA567A883D5C1A0087E9DA4E3C64B63E125E956664AB98932618F6962D DRBG_SeedA = 7B7A09501B13C4CE6705F0365B886D6248157E661E404040A47C56D641BC7628F27374CB55384C304FA56D390891BECFDB530372C4DC16CEE45CC7142C421EF2 H_OutputA = 4C5063FF86A67A23DB22C402EA563056BB892E2BA088DBB2F3F671DD3C409AB3 DRBG_SeedB = 512FAA1465D58518DD6592D8D12569BCB1CFB0926B7F13D29FD38CF8352DBD50 H_OutputB = 896311E377C654F26F7D9CEC75583EF47DDF5A28D192A9FCC4053AD4D9F5EF45 SharedKey = 5520636B398CCB8A01059271CB0C40B3BD0FF2E0ED7D8A6421BFE54F1FA4DA6D DRBG_SeedA = 9481B10044F56A44E079E76A7BFBB99A34B469C7ACA9E89C38AF1B24C954CC7CD98E6DF48F0392E5FE4752F863E5BFC5C0E3112F10492B19A9954AE1D7BECC1A H_OutputA = 172C4EFDA87C6B18A71512D539C9ED4E747216372F879782D4C40CB0650C950A DRBG_SeedB = DE65EDBEAF328AF28DAA9D9A57DE3101A7C7E448EDC635A8758DD48F668E8950 H_OutputB = 51B3F458C32E1767F86774111D0096DFA11536D820C0AA08FBC444D71C381634 SharedKey = E713C3033CDD8D772BC45E646B02CFDC15C8366CF83DFBE38BE5CF2C4BB877BF DRBG_SeedA = 336B44302B6D6845AC62FA61957B84C2146F5A18A80588915675FF929F5DA54249706C6469AE37CAF9E838AF3A8B280106FBB3A7BDE75338C984132E4FDC2A88 H_OutputA = 749F54E0A70A57CDF4BFB2A0C5FFA954EF06E1BFA21469C0DADDDA719C906EAB DRBG_SeedB = 6FA2C9C204EFFEAAC34EE375937F232777A6E0C6D69449C6EF88636D0ACEC7F4 H_OutputB = D5807C166F209B43EAEA4D2562F32BCCE7FEE1C0B15E508DF95943E435C662FB SharedKey = 039F8686AA1099C193EA10C22B3E632489703D45445818A58230D0DF8CAC7630 DRBG_SeedA = 72834DD5FD0644A95AA08036BF7B3318096CF9BCA39F2EEB5B502D09E440A731D4EE220C969E6ABBABFC0A33970FF99A371A29D308B0E5D66E18FEC889F69D10 H_OutputA = 215AAF4DABF749C77C1FE864FDC25D9F6F71F70CF9C099A83B35AD0714AFB2CF DRBG_SeedB = 778CF95337441D8FC2661D34556F6CC2A7B1F708C383B49377241505FA3B19EC H_OutputB = DE7709848CD88A8BD4730D578B1ED78C2D73984C1055F237F8FBF900CAACD33D SharedKey = 1FF59E07BC4F3AE882E1D173B5A901C832050BC6B37C7780BDFE14D956982F4E DRBG_SeedA = 51C83D0805CAE1535BCCF9C86690587DFFEDEDEF76ABE4C986F127DFC05B73D1638CBF7BEF57C9CBD9676E01A09F017A00EB26745DE59C108493595683435BC1 H_OutputA = 83CAE6AD393BC5970F259F3E84A0EAF044A4BC537ED4799FB6BA4EE84592098C DRBG_SeedB = 7A876CFBE602DF8FC87B5DC950D8CD284F8E60DE0E748523F597792EA89242FA H_OutputB = 8EA576BA3E65FCABF1737D482599D60C09A546BC99D9BFE83019E0D0D5B98CEB SharedKey = F6C1BD1EE4DE80D01123115E013313591A8E0E0D856D7478BCFCD942F58DA714 DRBG_SeedA = E212580A9CFE662A16734368B941386A7C681DC6D0CF4A2950F18FA4B781F00FB72830E4ADF5406A6601A3C9C09001404817336185BD729EA806F0448F651AC5 H_OutputA = 6E77D2A2A9AC30B0181CCE7841177445B333AD2340F1301F14161F39A01864F7 DRBG_SeedB = F9A3B72A69A8F15E3C39020A44151111BC40AA80B560D6C65F2688EEE5C1693D H_OutputB = 27061EBE29FB705CAEF2362DBD3476E679C9E9FFB6E3C8EE2C170087848A0B1A SharedKey = FD999BE13A9B7810DD8B91BF9FCE924AAFFE6D7A6792E689B0BEAC99A4448BD4 DRBG_SeedA = 6EA4AA9FEA16FCC433DDB4CA982BC6978A98D1F5DABFA18577679FE9C6EDD64CFFF2FE27628F97994483760BC47448333CB51624FC2CBC9EA8D3F372AC685099 H_OutputA = 110E877D89671C35B14F0A7C1BE88D0C677EEECA71F7E1D7B221DADC295C803D DRBG_SeedB = 2853662585F41F68A7DD670331AA164747585125240F05DBFF94B6B1A7F0CF0C H_OutputB = EEECB0842B24D2BBBF6E64BA2481BEB1153F98EBF855AD40782D9E57991DD53D SharedKey = 532F2A2F23E4081DD3BA6E9048F5E6DA32EF3C94D8A88183B1498E597349153B DRBG_SeedA = 16C6E211A47874AB6D606A8AA2734742CAB68A36300B161C820BF9FE762A1CCBCA94DD9894B8F0072B80C6A2A9D941DEDA79BC1F1F6E611AA4266AC6D3229A26 H_OutputA = 05DCCEB720067319D12E127E580AF930D046CEAC5BF4E5495499A86B2FFC2F3D DRBG_SeedB = 427CA0BDE8F4A17F8D22079306BB8779236BA825670967CA34D70A692048E335 H_OutputB = 7417524637DB1B4EE968676621013FDD9B215BEDB5FE8DF28ABD03FE7182998B SharedKey = 2424BEC2A16BEB78DF26193DA5F9B4238B0EE55D7340B0A09B24C4F625DB4979 DRBG_SeedA = FB4063A137DE53BD4D18A8F6282231ABEB217B8128F5E7C0F556F9A0A29081B8EEEEA4388B6B8DCE4E78D077AF41CD895EEF4F0AEE352FD7E0B6AA4C2B117ABE H_OutputA = 914E7FDC73D4693EE77AFBE8C2F61763EA06BCC37868A5DDF26D9F441BE17EF7 DRBG_SeedB = 2CE7A82496B83BB50957E2F30C3A8F5FDC8DDD6033696926AE95565D06DACC70 H_OutputB = BB04AE20723D536B1E389216DB9790B06ECF1512D08667298C3621ADDB977F5E SharedKey = 814239DE1C9D06A58810F35446C3FA62AEC19F51897723BF38C1D36834D2C2B4 DRBG_SeedA = 483B8D9B2BBC81121C2F26EF426A021DD0AFA46DE09174DB59247FBDA6C9DAA85AB554A357B27EBAA0F523C9F50956E2D54BC41C7EF7910B5AAE76570D7B37B4 H_OutputA = A1906378D65510B086FECD9294D5369C645BA9F26CF78621AEA563DC5CE754A1 DRBG_SeedB = DF05FB8D8D639275DD37205FA82C1D916B1EB21E1E6B66D25177F667F1C7ACBB H_OutputB = E23026C1A1F99AA1D60ABD7022962CF8F4B0162ECA72461723F6FBCD3F93FFFB SharedKey = F52E808E0231FA0E31C39C51D6AB6B91FA4E4FAA6487155B6B08E41507F0718F DRBG_SeedA = A971E76F06E4999E14311DCBCD19D54EE3EA6439BEEAE1881AD0D5460DE04ADB75AC91A2CD623CAB25257997A5BE4F488E725B1A3B1824E952DA3955639C0893 H_OutputA = B3592F9559E2E24E21789B0A9A60869ECDB4837188156D5613FAE5EE07AC573A DRBG_SeedB = 30F86622A886B493D1B322BF037E358A11D3D858479EF3598061EA1DA0CE6BD7 H_OutputB = 13319DBE598A321D962CC57A16B8ACBBF7EC540ADA447CD5998B3F035567E377 SharedKey = AF608D5E6564F7BC0AE2DE129B071E86A3228132FACE4E68213AB5B5CEB1FFE2 DRBG_SeedA = FA131A28E63085926D4A4F7B1649E264FA03F409AA24915B4EE839AE5B093BBF643855EB3C3ABC6A3833E9D8367FB6751859ABB1BB0259293CACB58D3EBC213E H_OutputA = 59932FE9289EC5A8598F755E13DA5CC549F4C1FBEF07D2B5FF6B780579D25957 DRBG_SeedB = 0E8C4BD57A7E4213383C2F701B88081EF78B14616CC65896BEDB7236C0B42B82 H_OutputB = 5D58027BAD83E2A3CD4C5C3F8C93889FCBB2C380F1629E597851F0ABC5E4CE46 SharedKey = 9AE9B1247957406C648D1B45594DF322F2853AB1CB178648FDD953DFAF2B8FED DRBG_SeedA = 2494E7555A6DCCE8355D5CEBC483206DE92BF4ADA79C3FD2D923C9D448AE618C8C862F8CA67ADCE3F7ECE56C975FE2FB2A4B9FCE20374393D6BFEE4389AFD342 H_OutputA = 451A19F9D0C3FBD38C9F8B774426921255F762C52CD8D01A40D126E23C8C4BAA DRBG_SeedB = 5134C6FC223CB0154AF025D372C2F2B23FAD80596FDD040036B82C3ECE083AEE H_OutputB = BFEAA07F38CC61E5CFA1E6699E507D63DA96E9BF7FEE1415863D56C077F0BB46 SharedKey = 0A22869AF4C4391F78A6A0E5EB7C4CC74BF8E0C41DA527B4B80E246CC70A6B61 DRBG_SeedA = 547C1E5392B6CFD6BC05B490274E7B3666B20DCD0E79446A906D31D1AA369C69AE14DC31F2AFBA6CEC3D1353FD2D38CFB27662BB948461B5F1526EBDE4F25272 H_OutputA = F30B5C43D55022D57FB4E29BEB978FEE3FA852EE07C7A8422EDED15950F7E20D DRBG_SeedB = 8CBF016C1B2432415E0D285D6CE8D8983670652071A69AE9BFF63A9E7D5CB557 H_OutputB = 0DB946CD1B12683F3AFB7013EBAA6B5F4314E79F6745EDA69C5E683544456555 SharedKey = 03CCFAAA27A0F53D4A06C42EC259C447302B80E5D92D2986B7B9ABAF3CB3AE08 DRBG_SeedA = AB7ACFA870CA59C0B6CE14527FA4E4D01C2B8F05FAF7EE4340CB3CEC79F2A78C3ABE54788FBF055C29A36F23905B469F0749231CEBC393959FD0E7438642DD32 H_OutputA = 0B33DF53D0B3018CFFEE73B329AC5C90C9FB9C4B102E340AEE02FB845A848EFB DRBG_SeedB = 8B995515EFC99B5476BA0E5D3035CFAAD9274D73082A32AB604A7C50BED649E7 H_OutputB = 6AEBDFF802F8F5CEA0DF640B78CAC4CC038897571AEF4CAC460E6177EEA966FF SharedKey = D4648F016399C88A4FCE819BBB7977AACC1B04B4CA465DA952BF7E742616D93D DRBG_SeedA = 9D812C23893AFF8D7FA4EAA1849D807A37779AFED1D48FE43270DF0892A0D0177EA716A44BD30C75B5B8DECB4BDC0CAB69949DF603BE31DB40D6655D3E0F38D3 H_OutputA = CA06CED945E73BAE0E54319EEB51C485F2D44532A9A772D7FCCCEA15A0E13CC7 DRBG_SeedB = 737B1FD9F8C03121AD6D6B556E4A583B9C2C6EB033CF24ECC52EB6D407D2653C H_OutputB = 2DADE4AE0A6EE3920683AA2848F4DF547A710330E3F941AE434E567AF33517E1 SharedKey = E44DE3EC2148003ECA44933702CED0639D9EE0D6A4F978E07BEFE4A3A7879FA0 DRBG_SeedA = E6F868342225E5E49945D00B4708607A1B4407110B3C2685E60C3F845F184282EEC95BD3B226B92D62E3B52E980CD370724902D50C21192278F4375E78420454 H_OutputA = EF71672A0C4CFD9E15876B3D3A7C8876F60CCBBDFE0A1A836DF743DB2B109F97 DRBG_SeedB = F88182C0F6FBE80B33C0F9B2E1F2E38062E29ADB17A2B26B5A3632A2491DF75A H_OutputB = 3DD673B54ED5C353DB3B17197B5E1F7C7801290E770AD9C89D8E73427F90AA7E SharedKey = 5D0F5E77526DE56F4089BF54CAC427A207F962E2FC3B4BBED074803FDB0EE0DE DRBG_SeedA = B437AD6388576DD9FF5F9D7F524006A4314426201A072A2C49B185C66FE587902E8BB5E1F7048B59FF7ABAF122CF7AEE0943DFADCF19347D5DBF9BF90D9FA448 H_OutputA = 94DC547C6B2D34990531213478098AC808557CB057AA478A80CFD7AFB949E35E DRBG_SeedB = D11B1099ECC6DDDFA6E8BF0CFD5A44DF890A076940496170E140C1F32517C73A H_OutputB = 12C1376ED46E838A40ED9E9E93CB7DD4B42D9E83AF860D26ACD0CD1EE0EE8D4D SharedKey = CA31E0E4D8A2E5EA204247BB03C9BABDB095C82FA78C6EA1EAC8CC9F78F8D1E8 DRBG_SeedA = 2814DE9F74BABD5A6CA92F92A53B99C25469C8459C4C60FE63A40A46C648E1E19072D8727194E3FE8F78DE5F853EE6652A5D5CCF2187858097A8599A7AD34769 H_OutputA = 4AB39E113012F0294F47555262A0D91D6BE364AE62F780215A183D67263E1828 DRBG_SeedB = 7052EB411B7782E07A7ED18E8034F82A23485D4CC1645EAA6B21755945B11F2E H_OutputB = B94EE0F72BB81DC869EF8D63EC55B40D1E6098E794BA26384D9FBE18FA7345B9 SharedKey = 429DDFADAE564B587825C3F644DBAD17914BFF60841E68C7D1F27871D7FC5711 DRBG_SeedA = C7ECCB2C7513FD343F3F9A56687D6BC93A78D3597BB2C1D214C82556C13E4DFE72048C797CA0CB9B776F1C3A43DD5B3DAB6DADB4AEEA8326025AC7D5F9CBA6CF H_OutputA = A48A2AD4F09403E4467035D8D3B15E2AB62AF2A2CF1A2D8A19A063279B886B86 DRBG_SeedB = 14C89D8BA124DC069F13CB6F289F0C912F5B60ABB55ADFFF7BADCCE942421E0D H_OutputB = 25DF5C4A577ABDF927F6F641A3EA1938051FEE99D2F730C2F45D4395D13C8D6A SharedKey = E81F8BEBB0B308D4ADC52C07A9B1369AA7C36AB86C270809F74ACE236C56378B DRBG_SeedA = A6698F6229C49043F0D505BC6466BC48FC9EC47D09BEE226FD3C9DCCAEB2416AFD2906574F099964CFD71FF9A1235E68056A3F4CC4A9FB07C26321031C326258 H_OutputA = E9596AE933D8D970305547D11154DBB2E5543913E4D0D3C38F4DF7A0E69139A2 DRBG_SeedB = 40C077345C94D43487DB427977A15699DD3F8A05D7F67D1971408611EA341BF1 H_OutputB = E09DA720CAEF4142221CF1871F2A0EA536B6E115C316961944FE1CFAD5DA4E80 SharedKey = A510AE2FACA389261DB2FF3D7666CEDED7A2196BED8540232AF76E48A79650B9 DRBG_SeedA = 7822FAD76ADCE07399FC6BB6975B51117FF9916FBF9EF2117B720C60BA6C75E78AF4BB16EFB0E00B6C46573C5201A9FFF94CE2A016613332AAF33E457BB8EE48 H_OutputA = 4F5943EBFD4DC2304CB1728588D6DF5658E7D303E08F83AE9CC6651E23EDF3C2 DRBG_SeedB = 241BD5AC6D4585A9EA2CA484EC42A903750B8531279E50E022F5E280380E4555 H_OutputB = 595E3CAED31FE8FE7A9C430E5025947793AB113CF22670766ACD8D7A1D3125E1 SharedKey = 70DB482EA9F399B840F908285E53069969E3115F1A31891F55445E7C6BA7639F DRBG_SeedA = 385751BD7C9DD56B0CBB767F26E4C276426CC2188F6171B23E20BA9E662BDA7194915D1A4A53FF5A90F294682987986E3B69B86A9B6509E021C2D065B166B3D4 H_OutputA = CDDCD715DBF74AE2B18AD755A90F83CE564426B91922D0E2553D2A312C5B2371 DRBG_SeedB = 274FD414630E59DF05674EA1D46732020A5F9494F20D507D8B23D857DFDCBD0A H_OutputB = BB39223D2CCE8031DE18C02FF7416BCE732BAD272A0C5D42880C9C75E02D98AB SharedKey = E80D31D951DFB3389598BE18CFD83D1771EB111DC392B70888F9E11D7D8EF592 DRBG_SeedA = 33E3D7D0524BE2C6DB7766679C7C41FC387FDDE7573BEA588C31EFD30D022EBCE28EF53ACF14D185B0CE2FCB71DFE2B61689C8B6CFBDB235566F7D522FD7483B H_OutputA = 98684A83B34AB9F0CBBC4476CF653C8048CA9322B6FEA9F5003FE66D9AE3ED12 DRBG_SeedB = 79EEA1D63B5D8AA7C347020A2AD7B1A1765D9BAC50A10C98AB78DDCAE7D6C4DD H_OutputB = 534DE5738DFC3C6CE0D177983BA4A94001179E013BA4DB73524A5963F74B697C SharedKey = 6289A0B03B94AE8D1DB2BC5D5EA1138762675538BB4484649A008C9BD458F190 DRBG_SeedA = 58388DE2BAAF7361A15F1BD16FC01267856CD4AD79B6153E426ECB99338DA9D8CDB5182B7E9888B6B5F9E573DB9C2BD113F3AA952574B63F4AFA52DA85193977 H_OutputA = 304D0451C66D73730473E4CE9755A07A630815C801F2F43C7259A1D95BD52E3F DRBG_SeedB = 00A21AD8F839C00E40EE75F05CDEC9C21DDD486A145ABA59C9AD9CD4957D678B H_OutputB = 807527B46F29EDDCCBC757EF05DDF38665E68DE581A852D0B62BE4AA7578CDC5 SharedKey = F5CA5EAE4CE3A21DD4111F0BAF52642CD0530F64766615187A5060142B8FE3FF DRBG_SeedA = 3CAE99D73E9DE9571B60BB43CB3CB749C44600E82F7174C53A50DDEF794266D7D1F39046E7E1FB2A939F95D66988505FA1AC14BC6428EE69821A31401EBEB429 H_OutputA = 7BFAED5DCD8F8D822BF41C1CE3D27A3DA7930B15C2DBF4812042FA81447A1B87 DRBG_SeedB = 2D5E21D40C87059718E106CDC939FC06DDDF4FD7E4A252B1E4EA543000B64301 H_OutputB = FB78DC6BB00D84A565E62F381C8EAA158A04165C97494C2DCD34CB8130DDBB36 SharedKey = 18C08C72B3040CA27487B762175EFA299558DEAC7C260BCC954AD03CC49C6EEC DRBG_SeedA = 13DABE3111A5D55A8A2F6ED64444AA6F3509FF2E446F6262724CFF6234F612CF22A920D6CEB42BB11434DE359D39E48BFAB09892923C59A76ABE26AFEB66233B H_OutputA = 47EC4134FEBBDC6B5D949D7FB082C635056E971A1B89885A65A10ED2FB784355 DRBG_SeedB = 61560A812A6B5FB6AB28FFB9A3775F0BE89DF3164DF9EE72D3B5F02750C59CF7 H_OutputB = 2FB1B6713682CFE2C60B341ECF1BE8FB4B9D547F3569633E33D8CB16523AE5B0 SharedKey = 0A2CFED2975B7056BC3DEBC9D1C1FBE0335C128188CEDE1C1C86FCEC115B6255 DRBG_SeedA = CF230936B07552884C62FCE327E5B50E02A2EEE3CE5EB1110C087D7BBB1016FAF6A324C9229484E9EEF474473B2CE7699DA893F49F5B0FAB8AE2EA3519711752 H_OutputA = 8DEC6D93C27F06BE36DC361D4951A8196B981186C569A75B180964C48B588A96 DRBG_SeedB = 5F2F6F05E2055C875D408380BE5DCEBEFF3AFE6CFFF0F7D081ED1013E3870E8B H_OutputB = FFBFC0785F20C7E66256273592F730065E3C5E0AFF97A3AACAD00769AA6B6300 SharedKey = 14843E2F69295570BDD273DAAFE159055415DDB1C151D41786B8259CD1BE82C4 DRBG_SeedA = D66221E35FC3223767FD49E70D3D20C6B2055DA543EC3AEB0FA5516C6B476DD3D980D3747E375E96D84A48A555DD75C826686EA6EB398984974FD91D0E8C54FD H_OutputA = 2C1D7C19504C27C3EC61CA1EFFBBA564A90189994877A9E0A7B5EC216708FB2E DRBG_SeedB = F95FD9B931A162FF7D29521685CBA80FEBEB819FA43BDFA2B6FDFDAF43AA1E98 H_OutputB = 3C989A12BFBFDEFB4FBC12397FD9936757B5B2B9620F19C287791D7520D0B788 SharedKey = 5E8984DDE5EA159863B732194D1A184110F65C9E940AEE30B1A849C2ED1425A7 DRBG_SeedA = 12FFC89D0F8AABAF70656A320C1BC06A7FA6F961C067A6C782B3346582E8AB39D64AB19B08BB3353BDCE04EE5F70A69C06500ED8D637EAED21AE6B1C945345F0 H_OutputA = A729E44DB0FAD69730B36B5165ECD7AC640CDBDA54B10E34D0A1791A2FC43181 DRBG_SeedB = EB0564B7A7586E45713F27EB92D2F15932E35D2354626223721645395C614635 H_OutputB = 7E283FD2C7723901D4F3F2767583BD286BB9DAD57746DC5A245F21655355E0E2 SharedKey = 9364EF816BA285AEF9482F7D46ECC75912FA66DEE9B2CC5E3B0E10F4576D5FB3 DRBG_SeedA = 4BB67F1A802AD54F805C1D6F3E280A1E2B7AFC69ED273D6C5F5062C5B41C67D89C9B655BF6BACD513A3C060FE68D61B4BF88A8D3F7E425ECBB5D2C4CA35E159D H_OutputA = 06D6C588D29B940A1AFD422A23D5D8A0D73CB8C3794555C916D2CB87A0D3D097 DRBG_SeedB = B8363A378415AD8687F2415300E349303A5C5705D0E84EAB10F879416551222E H_OutputB = C67A2F50A35B2D2BFB35B2713AE5F8EBD33C0A3AD7826FC5F55C46B4F6B2CA75 SharedKey = D12F389FEA642CB382F0C8AE41F967E9BDB62CB9B1938871580F37B3CB7A4B1D DRBG_SeedA = 830D28A2D5FC8E3646547A46EF0EA27F97B96EE665EA96730175652BD1E59EC04F213036BF603A3E626625692EF776EBB2C3E72136917804F05599FBBF68C094 H_OutputA = 0A7E500EA9CF89043DAB0412AEAD46853F094270B0D7C67B8E13C4DAE6AB6BA1 DRBG_SeedB = C974744BB0A6D4EB23B9EDE7BC84337EEA52FD299C1BD85AA0B316036DCAA28A H_OutputB = 27B15789A85FB2C24D7D36714639C04AB22DF7BE4A9BEFA375F3F73B43C7C476 SharedKey = D5FCAB189F0EE0127FCA2A88A4B30664B232BFD39391BF1DC67FF5804DC4A758 DRBG_SeedA = 0165A19DCA92009917929B0CFD9BE5142C3A8D4D884685C1494795DC485AF41F1B9CB96395D962DAE4E3B55D7142E947201CF8A4C50CF8BB2BA4427F1EC9E08A H_OutputA = 228CED22EFE9D17B748D23599B435FCD61276EE40DF6EAA546312E9859B71D82 DRBG_SeedB = B94E189C86C005AC01D7DBFA876919D802485D160DFB023A9BA32A3EB2BECE49 H_OutputB = 6BCF89C11AED86FDA75BCF13E9547622B66A4CF70A1CD505FF0B01065AFC0F2D SharedKey = D271EF6C0917D0B9D95C6D9E344378ABD6C3313ED415EC9D25CAECEE5984C355 DRBG_SeedA = 07518F8C5A6A11AC7AC65459B701DABF147712D3B350F34CA163C9AFA95F31BEBF3E96C561B2A1B4976EB383963032AB4663FF91E577FB2AF1DDDB9F05C79DC5 H_OutputA = 9CD1E8835E5EF047C6CF3D2972AF020E1866613AB99DBC61665E474A34918DF6 DRBG_SeedB = 94CECC97B8781136562005AEB785D57CEA07ABF350816469B23752B59C367287 H_OutputB = 2AA7CCED0932A3692FCCFAADBA573992BEE55A639FAC9389F0A93C3B56A11910 SharedKey = 607630F7B6BE2967C41B9D779EC7484C21FAE67B76130E21DE2FD50FBF33B0EF DRBG_SeedA = 1A748CD4279D96FAC92A445CCF49A0C11D5E4EF42C00F7542ADBFE959FCE0A8CCDD236575ADC2CB2E87C413A514D213EE6402938138BE2EB30DCD12CDDE66265 H_OutputA = 3E7E3A9B389340C90DEC12ECB3D4FD68E9721B0432DA062A66E532ACA2A4C6FD DRBG_SeedB = 7773F6373B643B421053A45DE1F63D1535A1A4C7F4282A96DC7006F16BF69AB6 H_OutputB = 02A35E57086FA9313931C10C590161655D0C41E16D40D3AB3E92A2DA44031409 SharedKey = 945F6E8217E611AF3BB4A1160CACFE8AC16D5818B9734924D936E215411F4479 DRBG_SeedA = 151D9E371D9BA65F15B1710DA71D7D7948D6139AFFFF5FA5237C7CFF12DCB9002C403ADD898EDA29621FF6B4899F85A7A3F68B988D9DB9FB3285AC2C0F483ED0 H_OutputA = C276CA4B9CCCEDBC6450EACFEB4502D7096F902F318AE95359EEC9F617A8DB7A DRBG_SeedB = F21D36FC2C4FA61ED6A7873971AE0A710B0FD99D45D6997692B1570051885583 H_OutputB = B0A29D90639B2A4804A8CADD7E1E0A000446FA0C5CFE9AEEBB811C6F8B57D1A0 SharedKey = 4FFDC9E2E56C49EDA207A5E702C7AD513E41AB09B36E415A38F24AD044E9C537 DRBG_SeedA = C4A90CD579A722F40628A0D6DFEBFCC6718EA8B9C67909D856522957414F7D11BEF6340E49C9000894D53BF46CE119B67A28189A98F30B80FB7F59E8DF91D051 H_OutputA = 0FBAFA0D4CF0AFAD344C82C531D7842A5B700A2938C0077BEDB555B06EBF5529 DRBG_SeedB = 480B568E508A2D64A251C1CD69FF8FD8AE3B26079B382608C7E8410D7F071F1C H_OutputB = 7F0D1E2D2BB976682041ADBF2CFECDF46C20D28E09DA7BA3D243141B161A0258 SharedKey = 919A50C905314AC8D71C174CE835E4ABF1440D3F9B587C038DEDC7BEB886FC91 DRBG_SeedA = A9BB707C290F2B1E93EBEEA65875A00A2EA9F6F8ADD6650DA0ED408617DC89CC405E8D5803096DFC69852766956451909F29399E73C273BA644071710108F127 H_OutputA = 73EE9BD7EF8081D5896ADA96545289BCC9BE84BF8D855D5E43040A191547FA8E DRBG_SeedB = 5FCC868DD602E0D708092622E79E904B7009DB28F81E6FD0318FF1BECEAF79A0 H_OutputB = 33746EF65C3DE77D8E9CF8E66380093D8B07BAFD12EB7A89AD9D0077770E115E SharedKey = C45FEEBD853F6A7AA0866905DFC38846B6831ADF684F23EF14EB41A1AB2BED3F DRBG_SeedA = 1B28D1DC06A8896E110719CFB5FD952E454C408D99898B4E158078B9D6DC50839C5DB6FD3E35623E20045A71CEB6348B45B0487928D39444D2357718CACCE436 H_OutputA = C0AA04D7098CF2B589ECDA51E10802CF8B4EA16559C27C4E88DAC10D43B963D9 DRBG_SeedB = B9AC03BCFDDB8359E998F95D3C04A2FF1CFCF89AC1191DC31DE2E261EFC5D8D2 H_OutputB = 163CE025D74ED55B4A89A3D6B4B3FB369D022C344CB9E0A5D2493EC99EED32E9 SharedKey = 12A6B8B9C4B76E714ED393DA9D8D2556716980556C1DB54C4681356444DA8F8D DRBG_SeedA = 84B9A7EF4B198732BB4D11C4AB21A800764C12615AEF853B93A2F72433B18B33D681BFD756EA303EF4B895B47080B1AAEEC17F252831FDDD97CB85FCB243EA25 H_OutputA = F6A3B6453B3B1486275E5A0A877EFC9626654088E34689CD90A6DAFA5B5342D4 DRBG_SeedB = A59900545E371E39A5347F423EB1F5C788AEDC2AF0E835348CECE8D32B06CBD1 H_OutputB = 87091FD02A53490E915F9BBCD41BC7A97C3CF149E0C0075610FED07B1F0475C7 SharedKey = 0B4C30F206479E2FDA9198D10FBD8275A0A2A84E0C1CEC4E9593BB8D25E5585C DRBG_SeedA = 75A3D49844115912D6BD60E556748D757879CA082885F8B61610B3639D42CC39782DEEE21C0B413B40B3325C3FB10421FC4ADF1265A785CBBC551FE8C751B64C H_OutputA = 265BA6277C9EAE7B9ABECB2AF174F58C96CF766B13F3DCEC7EC7587BFA2F560F DRBG_SeedB = 6CBAFB094F99AFE87BE841126AEA19865811F763D4EF8CA78C9B6A69DD00464D H_OutputB = FEB1497533B34239EF6D0730D792D8D04828B6AACA3069F491ED7071BCFC7346 SharedKey = 370CBF74102A3D6B0FB10B9C7350E2A7EFDE633182790EE7E9E4936102577384 DRBG_SeedA = 1EBF7C833D5A8A0F45B96C53943963FAC46787C13C9A80220F97FEE3B98420639CA7B697048E3A257258F59611EE1EA14C5816D41BAAE8AB1792A3E8E1614D65 H_OutputA = 41E9007E68FBA90C1C01DD718998427AA623F95F22B9AE40FA56A0898067128F DRBG_SeedB = FEE9ABFAA6676BA90A7AFCFF96E7D6323DC130F6D0A7549427E2D7FB8A2FBA65 H_OutputB = FEE6EEAA8CFEC7FEBA4205413E509C0AC6DD02A4868CF0666DCE7D591F8B8BAF SharedKey = 7B668C94A4FF47AB78B7499E5CE7D8EAF19AAED6D591A98102FD1214157A2419 DRBG_SeedA = 3293B9896B908D45556320E0974D96DF094FCA9FD14A4912BA3F1EDBA2544E4EC0F93454C9B231E36C7CA0E899497620B7A8025DA9E5D2881FF84EB9B293C4F6 H_OutputA = 80D3D158C7E997B56D2638EC5EC9763E21F906A2D6A445404AA22AA72DD49E14 DRBG_SeedB = 7882C12B136D2FCC2B0DE92CEFBA802539F5EEC89D74D1E4C78E10DBAA936118 H_OutputB = DAA1FB9965E44F9D56C8610AB1AFCF71AF94DC3F9AAAC33AD7468A6F077D3AD6 SharedKey = ECAD64D2F129D8578713E32A1AE68FDD437A6BA467AFD67328C3AF7D484E0EC0 DRBG_SeedA = B80480F2ACB379B53489530E570BF79B5B80041A0FE6CF3899C485D48412C2B04E2FC04383779DDBF2B89B1384238ADA37B577E477673CE64494BA596D692B6D H_OutputA = 60040ED48F8B4C7D5CE259D1F54B57EC19F3FE8F229FBAB8E39B0B9371431249 DRBG_SeedB = D8E34F892589595AFD9101696BE39A8C512AA59B6A3623A37A9C4BB752A4270C H_OutputB = CEAA6E78E9786CADD1762252B386C0C3DB0A85F2D77AAFC951C32BA89909CBD4 SharedKey = 4CD70B427981A95C16331D5C6E71C74CFEA4B1B015F7A7A5F8DFF086C066BEEF DRBG_SeedA = F13D064CABC58B6212358B0951E4AAE1A045F30792915E3B8AC7B08BA6FDEC6D7B78BE78B968963810A388E3B87AB6A0878FBBFE68F23D57A3BA9C80411CA3C2 H_OutputA = 1874F1809C50B303E86C43BF2A5434DDDE9C86327F211F380E4CFC8BB57DEA17 DRBG_SeedB = 57C0B6DFA1DB000FE0EC1AAA65164D38A6FE13C909209E95C45849AD0E770353 H_OutputB = B6F3B6498342D6009D27B69B1FCE85283AD21BBA7F9ABE9830235A3F7252138E SharedKey = 891B08B7A8DDDD5841706030C6951B6C5CBC834DCE37DDE176E666901AD71721 DRBG_SeedA = 62B3BDDB4F99814C3E5C809128F4CFDDEA8562816424A1805E58E2154AA7D8C24AEF20215D95FAEC6EEF54E39DD9543156496C41FB9FDF6899816D247934228F H_OutputA = 1479EE3DFFF0CEA9B54F6262615518B07F483B13A0DCB38CDFF3EC9A4DEE2963 DRBG_SeedB = F0AA64BE7101B8339D005250DBB18CC1625581CAFDC823D90E71970E70FEC4E3 H_OutputB = 148795A026267E5A15CE5911C7162967DB8A092910BA552A1F3D61CA1FA40294 SharedKey = 9423DCC0BE795614C932AC90E02E2ED7071584743C2899439E486C04F7C157DA DRBG_SeedA = 8C1B5E8D7B20281EE09F5B96B348E76BB8486FEFD0DD20CF9A370DFFBEBA9E34D9CE067901295F0820922015FF1FCB9732780AB3BCE3F73E0EE13C46D64FBFEA H_OutputA = FCCFBAF5391DAA9A4956A1B6747738A6480FC56ED55D23CE368BCF0C81B84F7F DRBG_SeedB = EE7DB8776F0AF941EB79323BC85CC1001CB7B06362498E5E93C2D73353EC0C13 H_OutputB = 57B6E42F91E37BAC18F0F3CDA1183E9042027D4BEB9346A2D403C911F7CD21B3 SharedKey = 6A25547EB5A46C93C007852F96469424A01B914645553B78F5F1B50E2193DE82 DRBG_SeedA = 6AA1810A5F9E25257FEECA64523E6031DAB474BF08A878DF679204708ED220C9ECBD7EF800748E8479072DC422BAE83BC61840A368E8F52F5D02B5C1CC7FA950 H_OutputA = 80FD79EDFFBB03AF05328D6FE5F847932910873937D21E4DA17FA1A267F5EB9C DRBG_SeedB = 530FA0934497616A6DD2C93BE411FCE82238BD80AE2F01F266C0ABECB5CCEE2B H_OutputB = 561D325EBBF2502A6B556ADF943FCCD5860CE983A87DBE0930901A4DE2ABAD57 SharedKey = 5F37B16DBDF2F0C4ECF7577298E17E06EB55F825BD7CEBEC2C1C43DE5AA9AC55 DRBG_SeedA = 3476C391B795EEFE5D1F2EB8F47B6DEB61FACC1CC006434C00957ACBDA81B406728548F4306EF505B52F6B443D122294C281B223269330004F58AB2C1B7C71CF H_OutputA = 5A32B97F50758127073A9FBB754DDBEABC1D8466A49D5476F1736D3745D2A645 DRBG_SeedB = 15D66C4C22107C02C054BEBC283FADBA62F79E589BB4A0D906D418BEA6CD2A04 H_OutputB = 6D6BA2825E3C43BB495FB4C23344C4536DE62949C055C13373892B7FBA8A4D03 SharedKey = 6A21EC7B48A17900B1DC59654FBB6DD1243EA29355A30529B05CD646D5C0FF1A DRBG_SeedA = 345B2F9C24A5D9BB9DDDEE2D53313749486C9C5A901B9A18C2868A4D64473735154345402F049B96A469B404FFF1745254412C209A19593C26DCD655C5BB2FBD H_OutputA = A920195AAF8480090B992DBC2BEE898A1A2AC0E09A1C41CDE3CF8988266B6BE8 DRBG_SeedB = 24DB6238BFA694C35FF0C95AF343ADF437ACEFA0CA757B4229C1BB93379AC4EA H_OutputB = 22391122D1FC1DFE7B9FF99A4D88A59750375A0DD928DCC8604C2A485FC4067F SharedKey = B0C201C44417BC27918FC0B14F0BBAE053976B6DBF7F3EF0E19C4CD56D0357B9 DRBG_SeedA = 7A270A27ABC4B6125D642912A9D72ECCEA4617B321647E60EE1EAD143855198BD9FD173593C2002A809B4016788231EDCF5F9EA0D5A179007B078A670E12C018 H_OutputA = 9BCAA0396AE81D0FC982365BA20B09F576C414F608CD57327947F984DDF0E456 DRBG_SeedB = 69AD8EFD18B50440BACAE9C331D103F7A00ADB23650DF6F3FFBEC46C238F4E06 H_OutputB = 155EC1A667B10D425036364DB6547C2DD4393FA7137B7EEE3F889E4676C4F3BC SharedKey = 9A25D4A3B7DD6A143A490685B376B4412CA83F29A932476DF3DDBEA855D1A92F DRBG_SeedA = 6CAED48CE625AA81B288D858EC7C7D4495801744139CC02A84D76A67AC2A1E232466A240AF79C7457E0832553DB7148FEB1143413E5AA3D823159227C6A3D55C H_OutputA = E1F4C31A20CD2670C942679C3E99771A3E94C9428BDD63D21434D584628AA04D DRBG_SeedB = 346E402099AFD80FBA16337BFF42885F7BA0E94D9A45001DDD6221BEC8D2C9EA H_OutputB = ED1394A2A45A135E39C3DEF32C58B45D02BE9FB94D337032F652A7430EDD6F05 SharedKey = 60CD81EAF239BC54A90A4FF008231E7F187F748CD4DA0B1505D298420A45D2F6 DRBG_SeedA = 75885C827CC716B0100F2A16F0D2B662A85083D1AF6DC5C2CBCAA3E9118E5882E86FB7966DCCA555A6897157594C50EDEC4339C12F7E215F0A822797655B2D19 H_OutputA = 0D2EB69427D6FA063E02296BFE6A406FAC66561696FAC3B2EC4D73E84B38FFA9 DRBG_SeedB = 27600AE30D1CECB00E8AF55F4B4B49ACB24EEF4B2695606C60CC9884EC62B375 H_OutputB = 91C72DA54B5BF7C4C0CFA9C2DE538B75D9C5B8B8F1AAFF69EE9D85CA9BCBBCD4 SharedKey = AA01756870402AD4C96A71C43358C550E69EACB828737B10D582A7CB3B8118B2 DRBG_SeedA = 2069A7A41CEA57DC1DA4764C1D1E5FD994C91664EAB33D716B7BE8B02FCD0D55AF10EA939B700AC10AAD3E44B76244A5D10DA08BD6D4D7EC9414CB3B97A3447E H_OutputA = 89160D9AE7B39291E16FDE4DDFF636B60CD3CB6381B30763C30404AAD1D1C9EE DRBG_SeedB = 68E2A545DDC7D601F07ECCCCFCD15E375772A38341EAE72CE78080703E147425 H_OutputB = 8DFBA4DC3C090E63DDB249C4181A5998C00A498A1F969BA945728393DF77646E SharedKey = 63D2FA110AB1CE26A4A21CDB390E038120992AD8374826DFAC609F9F28D59BE2 DRBG_SeedA = 512A59B6E1BA442A2E564B51B9B79104806430FE71EDDA429221151697F963920E6C7B12E5AEBD81CBCABC5E03D65652878FB99D6D8CC3D85590B4F858F14A89 H_OutputA = 9EF1787F6E192F432FCE57E01F745EB92B1B659870769430289719E275F6C2DF DRBG_SeedB = DAA05087F633A356623C2E5824C31282EBB6697496A5D889BF3C768B9E8194BF H_OutputB = D09E283FF921A4EDE33DFAC9C808C5FF4F86EEA39849C3B1FA1D8D5E28B255FD SharedKey = 1540A1088752D38A1D722972A9CF9A0FDF9E4FCFDEA261818C104B5F4E6BA7F2 DRBG_SeedA = 695142A410A437094CA59E52610DE6FEA340DBDF04B5DF214613C0B7FD6DED7B03779885343217687131D4047C604D6D3F9F1C49E8938327E190BA1A145AA949 H_OutputA = 3EB47EDE34009522B7FEDBE38137A5E1803C9C90E53D35636DC895F0E628B44C DRBG_SeedB = B1EE78BD4CDDE9980FDEF40A848497E27BC70F908300AE22F42893CA0916436C H_OutputB = 6E9512081D64711A8BF9C3AE0C4D13AA847FAEF890D866504F88D26551B4EDCC SharedKey = 410466ECA5975597B779A59C13B1F7A7EAF749DAA05D92158F26068E10AC1E77 DRBG_SeedA = 3B2ED16AF1FEA8011F7ED041450D9036E783C19D0C7FAFCFF16A89AECDDBB70CD27CF63F90BE47197D89E972F5E62C4A8101F8818328A8C35ABA853F55FE7B22 H_OutputA = 87CD0E8AA903E8C5D5D80ACA05117E4840DCEC94124E1727E1569124AF50C432 DRBG_SeedB = 8660711B05C939D3624A2EEBA211757744A9417C0B9C0088A478EE7157B36C27 H_OutputB = 08B661A6B164C44D83E0E5F59EDB508A9C4E0F00290C172AA33509104F87056A SharedKey = D26A1B62AEBEF0ACCB043412FEF8C9BA126DE918D6DF23304A89239223561553 DRBG_SeedA = 0E8D6A8FCCF7F6CCE63C8F5DD9BAD714F43182F09CF85ADBFBD84AD0F82AAC3BABE1D783ABDDE6B444F327EFA3980663BEA84964497DFDDA23BCCF39E323BB56 H_OutputA = 9363BA317F617662086C4E3A74EC3C5FA8F61125A9D4DCD580983F798EF2C566 DRBG_SeedB = FEE09EC0D289E079F9A300429A4ADFB969A25881F2254ABBF4983B8108472A78 H_OutputB = C2AB4B26CAC154E8912CD0F34E30D67150802A3FE44FE535D1CEA0959B977E77 SharedKey = 171F5270855237AFD830F33DE7EE06764DBFAED688FC770603E668498B03FA21 DRBG_SeedA = 479A41D57AE7EB90B1529E3BB6827606C4EDAAD71F99D28DD4E21FEC0BF4C88FB568E75896437ED09A60409E80B225E693EBFABA2221AA87751458237051AEF4 H_OutputA = 07477793A2924F17FB0DE0280BBE7DBA5282A441F9604D211C6ADE1189ED33A0 DRBG_SeedB = 52F41C9861F513F1A3E3538F96CF4A2D14DAFBD228369538A0A22849123EC847 H_OutputB = E534FB2843058B5391BF50C144F6A9238F27164780F9A3EA041A906F60E7E972 SharedKey = 44706981F27BA4DEFE7379D7B0FD39C46BD927B481F50DE394F8374C43A81FA8 DRBG_SeedA = 925B33C802994A6EC700B55EA3D357E957EE17A0AFA012C298285C6155BF524D8680AA267A0DDDD6D61D2898FB3081A9D935CE61FE71E6BCE9E243F1DBEF1C1E H_OutputA = 41342458F732DBC9A7070827FD974BF2907FB206B95C6D5B07A5D15F50CFDE50 DRBG_SeedB = 6F546FF2257FA710D5EB907F07FDEE2DB1BA6CC0733410EE6456C49AE3DAE5FD H_OutputB = 95C1416FC6E7510A9894A21A8501D51A66445FD5F4A5C819CA43BAC4F31CE51A SharedKey = 740EF8A7DBF38D16A67AC589A812DDA3E1CE18F730E4C35E88D7B4F909BBBAD5 DRBG_SeedA = 63427EEAFBF1A8B3067FA002F2539EA78F70857309A3052AF11DBF502244C659F59E319153A79F8926C753AA6071EE1CB70C2D7CDDADED1765542FE7C1563BA8 H_OutputA = 30F71EECA8C897177474F99A32A3C8F6BB56A6BDD89AC1BF5ACE6136B94100C7 DRBG_SeedB = 7B9DAD792D336737B707FF304B809CC39B6916CE8B24D97CF7542C7D6BEA6646 H_OutputB = 80C2B7D809B745D9B663B6D0F0463796EB81D672566BD50E726D6E1F80E47229 SharedKey = 78186B248F5B951AB5DC9150DD25C23F4279FE4CF4DBD4784B903FB3A74F2A99 DRBG_SeedA = CAA17D5207B1CAEEECE48A6E78F1B9B717D8DF96591A617DA15E28FC56CED12A7068AA4284C5BE00CEBBAC2141BFDF9378DFAD6504559C7C51DF48B418DA2F2B H_OutputA = A1FD8DC3FE62E043DB453A1F26C98B37E08BDEA81006DED67905C69069B7436A DRBG_SeedB = 308B2F0B87F1A5BE42AFCE1866A6EBDA5320B41FAF566ECC93AE61DF0B4C826C H_OutputB = DEB55B7FE69C972F100B8AFBA2C881587EF06D64F09BBEBD46DFB55CB6D5539F SharedKey = D6BECA57EBB42771BFBCDF10598E5042F56BDC7909D45A48557B08E71762C06D DRBG_SeedA = 195D6C079F920767E5E6C540EE6B960EA67A13FC13B9F91BE2B8F19FA9BD05FAED8AE340D27D304B523CECF9CB925BDD3B0B9DA38D770019AEE6813351B9FF0C H_OutputA = 309789F0C990D77732986EAD83FD70A29051FCEF3D569B05EDA2DECD1BC2B3DB DRBG_SeedB = 7378FF9303285926C2EFB534C52852E073E9E62CF37A58624E4DABBD3E7EF29F H_OutputB = 152D26741A8330D7CF152C0E8383F302842AE7F1248E27111CDFA8DAD0E4EC4B SharedKey = 56DC6B45848BA22DDD2627F545348022AC6F51262BF33FA1FF43F5E8C5FBB710 DRBG_SeedA = 1710ECFE3024E36149F8F46D4E976AE8300247A2C9753C04DAE399A4FB29E88612046E9CF12C148B19F368F67319D16F4F24A81C015463367944A589CB0CF263 H_OutputA = 94CE824BB46D1D219B0DA4C0BFEA7E3C37F12C46E164B066BEB26399A7B550F0 DRBG_SeedB = 34A60CBD707C581FB335C0BB9FBA5301121576AE801CEAFB544942A2D126F806 H_OutputB = 80219FDE3B3755B65DAEB01813B237B03453B28BBF6B6D3255E2FB06115D9DF7 SharedKey = 5AD97D7D16F19CBC9DEA212FDC2581F2286A71152C588A313BDD41C1CFEEED15 DRBG_SeedA = 76C124D8100DACA6E7CEAF2BEDC202936B2CB99E1F18DC943FC4B29090437775C0FE8E724D86821309B356CB4A7F39EF97F10980E95E4732D587F6900CE28256 H_OutputA = 2B93558F48A90837138F01D826A45748480AE40307BB14C53FB3A1B4C53055B0 DRBG_SeedB = A26E875E473E700E5205C62D3DB19DA0795B479813817343C939EAAB96B748E4 H_OutputB = 9A4FED73A27DDA8293472788E2A89BFB0503D59FE70D343032E7F77E97A385E2 SharedKey = FA5226721487732EBBBFB228216B56D7F91300817E562B6A3F4AB1E052A6B30F DRBG_SeedA = FE1163F6EA457F14AE528240C68D87A7003C50994AE64FCAAB40E54CCDAA2CDB3B5F797545B4601F78BF4CB45C7B0351DCC65834866B7C7158044FC18DFC2C11 H_OutputA = D61A51A459E45C2D342A2E8568EA10643DDA9517D8E4E1938BE092D005CB3026 DRBG_SeedB = C7FEC74548EA7D1D1724459150FD9926E49BF3D27DBDB9AA4387AF33CC3838A9 H_OutputB = 85D9E687D1FF868EBBD598BF9EDCBD55136A02F2B7E8B866B83C6AC69D6B0092 SharedKey = 686A6A968FA8D350E7FAD391E4655E075EFA9A2DEF562FE436977735E05279C2 DRBG_SeedA = 32F42F6E60CD0D82461B364BB3C3402243DF5BD7DF57071D4AAD8ED5C4DAD29BBAFE9BD8D1B1859E3ADCCA119EE6808E19831228F23421EFC2B61AEA9156BCA5 H_OutputA = 53CB12A34229A9F3F4D152E0256FE85252419C68E07DF09B8CE5B34A2E4EB1CE DRBG_SeedB = E638EBD9D752B27EF70D6B3B218259EA0F72C9C8C3DBAD635066EE6C9D16D9EA H_OutputB = 8798A8435431B93FD60E7EB2F9EB22BD7DDCC808214F58DC3682ED1D6559E204 SharedKey = 1B45FA5EAE839A27825D96CE013ADCB56BC335E46908A9E818C0CC2375830270 DRBG_SeedA = 9D3A0D39B92142FBDE234EC74DD73F4B0314A411B067E43D7A8CDF9DF429B9CD30381780BD1AB3E81AD31FEA896A22B1E46DC0FAB0A2E8A61F224EAF1CF6DDE6 H_OutputA = B5029042CA3E7F88F01CC1AF003AB86CF424CEE47647208BFE0717984C899D77 DRBG_SeedB = 3A2D3A5433591EF5C587512707D7D18BEE453F5FFA10DAC564EC87DE621A5312 H_OutputB = 0EB9E5619EA1FED823EAB5578B1D1AC17B445F138AC2ED5DA3B6E24D2EF4FAFF SharedKey = 10022CC9D1C4A41AF5FF00AAF80944C0F4D8D39F7E9904CF6D311AB7E4C68EDE DRBG_SeedA = 292A4C49983F176CFA6A8A70A4D249ECF28E27481F53D544D5A77ED4EA9214E7175DF1DF734F3001A828A1A53877F791B20239AF7A0CD6B44BDE8E1F0A8023F2 H_OutputA = 1720B440FD1AA1D47BF012BF3BA9FF1D81535DBE328D5C18197E95DBD6A1882E DRBG_SeedB = EEB3613D5131442DA0C7BFCFC3B9F463BC4223F1172A05FCC728A051956E7890 H_OutputB = EB29CA215FEF38722F2E3F0EA5CCB2C81BBF1F5E9E0AE96EBA1190BCAC93B731 SharedKey = 707617632AAA7B279E75B0A421227FE03D6C3D37E9DE2E953DB4EE267FD4BC82 DRBG_SeedA = D752A241F1647C76E772969AF46B1735336B97CBB010766DB05F6A58A3402E5FF8807CD73BA99CE2E9C29BCAD6D26F7FCBCEBC8E800D5C0F48BD2D038DDB9908 H_OutputA = 0B0352B1A9BBD5E38B6934F0E6D20E24773974211D45166D87084B79F0A4C12B DRBG_SeedB = 69C46E70E800B1A80EB7D0B21714B39833F057AE78AC52D4922B7ED6F9171C10 H_OutputB = DA1021D1264C22A5E906CE3B5E2873F9B8E466F05D688C2E66EDC877FD9DEC39 SharedKey = 3F31C2AEB0AD7800413BFC18E60F17B3B03C466DAE5A38D79C9760FEBE26DAA6 DRBG_SeedA = 64FF7C693F22DA0D8D271C4A07614D861FA623104FED74EE49A2B96E1339442A771BC0911E252C794719921A933E8946C1C7D4E30702E079FAAA790FB19060C9 H_OutputA = 41D258A16F5F50DA28CBD90483ED6FDFFF881741BE6CBE6129E86800335B84E5 DRBG_SeedB = 2916515823FFB262B19FB497B613C12854F74797A04BCC9F8C11A3169BE9565F H_OutputB = 497F9DDD85B4C1D8859CD61D43D6EC6662E066D1DCF51A581D03A7DC9656CC20 SharedKey = 04F403A575DC9543FC6B2B1C79BD8B0EE7F519DFC01DB17B27C5FA0C2867D411 DRBG_SeedA = 0629E05A8BFE2F3AD56ACBC7E538694689954BBD6D101614FDD223BB5A84D175E5A6BB373D46C5F3E5E931868D57BE211B1DA17261C8F6B339BBBEE6FF3B7639 H_OutputA = 6FDF1556BC1063BF74EC73A787DC72B11A8C15E401F6E302E3B61C98A080CEA3 DRBG_SeedB = DA2824CECAC55F45728D9B05B681EC1BDEC16E8293A8188A089D9AD28FE755B8 H_OutputB = B9FBD93A5F7681AF954E39B62DF230478002EF13D40A2C23AE2DC8E74576C54B SharedKey = 1739384F919494D90C21EE91ABE81D841E3ABEBE7617701C139E487079FE9173 DRBG_SeedA = A9F6418A4DB3820C5622B6A06E21EC9FD729CD8CCE5EE9B2D0AE42AAE3DF1723814195C3D21A21B870F2500C387EBC1F7B9DF4ABDEBA5AC51A71561E6217A756 H_OutputA = 9E045837FF9EBE9C7DF5953343037C62E27C2FF29B4E99C3C44ABD73EB8E0DC2 DRBG_SeedB = 9629503B4DF35BDECCD3448AA819171D32EE3212BA3172A2842A7C45FA176970 H_OutputB = E1AB35230C8AD35E521EE4084FCD8D0C2BD1255E0C3E12C6AD7BD0E2F6CB6745 SharedKey = D7BBEA8992AAD5AB488C19D3D4DF5E804131E714D21CAA96380A9CA06F9AD512 DRBG_SeedA = 113B86304E5FB3A1E98915F979B0DC897EEEC966D1085F56B891048B22F8F5361883E64E72150DB06F46CEFF009D5BFC9B9C563C3CC78D67017FA9FC3B852ED0 H_OutputA = 3254578A7D36C9483FCBC0C0C587D67112C8554052CF4DD03CC350315A245E29 DRBG_SeedB = 8F0C0799AFB740DDC6BCA7DA5514580601230F5E86ECEC5C37004973AC05C7D3 H_OutputB = 0CB983E5B81C09C177A813CFFB9B0762A50144C70FF5E80E423134B408F30F4B SharedKey = A568F0539009451F1BCA57872D25DDC122F5CAD95746DDE34A15F39475B63600 DRBG_SeedA = 18BD42E02140E6903C31F23FCB1013CFB99B984BE54920222F09B060CCDC06CF51458FBB303D3CAADA95BD0CD20A2A76E7D3C15238453D236082DFEAD76843EC H_OutputA = 2BC8498F5A89AC5B49FEF39A5B96A6003E76BFAFDED3536C1159623854CCF17E DRBG_SeedB = 5429C3D9326AAD9535CED2AE8A6799B8EA466122D72F006407A612B8BD12C638 H_OutputB = 3E1EC2B1A5A1D4CCACB9D79ADF04E308017524B795F45E6D96F0C46DA4085B4D SharedKey = 0751B90778DBDB730111D025997466A98B0055DBC90CEF8E55A2D10218BFF823 DRBG_SeedA = C17E419E81BC430CD2798D99BC162FF15E70CCAD3E3D7B0D770372161E0292AF784ECDDF6F320E76804B92947E43FD69945E94E3DA7DC31E62F322C8DD98EE6A H_OutputA = 32D6529772794CA8191F408DFD3E67228DC5BD93BF237BE390A348341456CEFA DRBG_SeedB = 3B7FA85992F9B0AB2D7992CF68BA9743B8B64C6D9AA63E06F35EE27408C4AA8D H_OutputB = 4626D88FF8F9C63D3AEAAB313977FC3C504B2FB4BCA160552AD9A901DD128489 SharedKey = 71A6D66F62A8C09B65E175A4D49DA8A9212E8E098E5F40A2D85D9B24E295AA81 DRBG_SeedA = 7C328694B676ACBA991BF7077621770F2B66BED53A556D6D7C0DEC2AAEF519FFAC2C425B98B0E7C4DF95898991794EDF048876589FC5A7789774AD2E77C9765E H_OutputA = 3F6E6E627EA554FF7B6452F901871CCE11E7B6F4BBEC1FF18B5EFF43C2CD676E DRBG_SeedB = EA679B5DEB3B7019ADEA5D296B59BF305AA1CF110700850F970C401AFAD91A88 H_OutputB = F6B1387E6F345908701CC61AB352F775CB52F4C57F984805864FB666993B7084 SharedKey = C08BC67B648014FE17373609FE89C3B41CDBEC1DB4D067354054A0AEA3DAC816 DRBG_SeedA = A28922C1F945F71C4341CDFFA2EEB4E4E0798EFD8209A0B2C8A4799F389C0768E29D86F116DD7C156E8817FA004B2460F019DCF076290D37066F81218D46B4B8 H_OutputA = 63789524C97BB3F64FC0D850A8EBD72050BA6549501B061500AA31672A2FC192 DRBG_SeedB = 6E0348874633508D8B4B7755F8D1F269F564C94083200F7C20D856111BB9C050 H_OutputB = C90A5549940DCC7EA1AA6A356C14BCC2D043DBB03BBE731FE3AAEAD8CAB691CB SharedKey = 148A9024793E8E7806A9A260E7216CF60BE47D8BB57BD6267C42C73DAB3B0FB5 DRBG_SeedA = 74F32A98377F2B09C5CCA3917BA8BC8641BB318B71D01BFFA48CD8D9163E6DB4D056ACB4982590EB5A5865315BCC1F6EC0FB211D6C9E1D78D78F1F344916FED3 H_OutputA = B0FF2F100E81240A21EC2D89DBFF669546BBCB2CBBE7355A14B94680A9A8FC68 DRBG_SeedB = 1BB18D987C52E6476D32D6CE63B3D06FDDB9EBA08F257F6271D93905FF04F709 H_OutputB = DCF7673CD1B4DCE1D835DADB00E32AD56A7B6A9967C9717F227CFC75B56144F7 SharedKey = FE01EF275C4D289CE201CF5DE9C284D94E544D35F0B57BAB56D18A1E667B7549 DRBG_SeedA = 45DB64BB21D41FC1D23ACAA2B2CE460DFDA4287E515E285C0D0A919BDA2AC867D0135AD98E67B6EA387F6AF1FA8CB1F3F5B0F290C009C2BE048B8DB4837FBE7A H_OutputA = D566A0041196BB47F5553F335A0C09C4D137DDC544503CF2606A826AAB573BD4 DRBG_SeedB = AA6B6506D330A6F18F5B471879E692A73D5735A9C8CBA4C58849C4EB778CA7FE H_OutputB = 0D3C28658813944A660853F5A58A3BA3D92945DCBA8AD4EA530602A977E162ED SharedKey = 004006418E74235511C8C29DB4064410D9C5BE4EBFB44AFD6B0BE2FABCACDBDD DRBG_SeedA = CC6C6528F7B500F6B207DE9B0E853FA9C64F977D05053FF9F028A4E3EC6433452B976332EB883210535A037BF55F6DAEDB393261385D0FED8791E7E73C625B31 H_OutputA = 2A634198029770B5E2361F72AA067750AFA60F0FAF08FDEFEDEE24DFAE6D97C7 DRBG_SeedB = C44EC4B7551E4CF5270829C67B7EA91FC6E1420CBA195847C3A8EF0CDDFDB0CF H_OutputB = C6041B2F610392D1AEE1C965C6424656056340CED546E56C48D894A1CC096FAA SharedKey = 1AF3E2F19043E81884EB7D498762B76EACDFAFC269656EA594B1157B5CAE1243 DRBG_SeedA = CAFE207B6B6A69FCF2ED0D85084D2F6393E8DE84E4807532567B630B3E52883DCC58D570A6B3C1ECD298205E930F4F63A68D198794CDE33690A806E315597B51 H_OutputA = EBF7BA420D9BFDFDC1046FEBCCB87EF1A30B2BE6EAB449F839FBA0FC6E8210D7 DRBG_SeedB = FA069691C8A536EA39F7E6695F6AD58580AADF96C02832A0E9663AF3FBC73DE9 H_OutputB = 7BEF46EB008BFF13F3C3DEAF8F4246F579E24C0C8D24B62375C67F5B06E8127F SharedKey = FA01E6DE38CA2E1DA454544B5D1F1AF9038DFD3F097B989661B10DD82448B957 DRBG_SeedA = FF0C617B3D2FA318D8AE7812FEFF85FE3B897D92078E76B1B10719325DC268DF789B4885DA24034038116CD5326685CB03A69C2F1DFF3A3935ABFD8F9EDC5425 H_OutputA = EB6AC6D9FE7385D22BCA30C2C2F1A9A26BAC17885F1EC0C9BC61D24D6C861701 DRBG_SeedB = 888E0D816E9F7CBD33C173712940B04B3077AD741D1B9B2D10950AF1993E5645 H_OutputB = AA52CA3C8DBFA43D9DC0B80F08A2A8F6D53DAE798EE1311A6886AA8283BF2538 SharedKey = 502A6EB066CC60C3DD27FB4D38455518701D6DE0DBC2DEF2AA24EBBAA9E15255 DRBG_SeedA = 8F58B5D41591120A55FD484A7B6676DB061C261B0FF0BD554FDC55178D0F9E8CD9D65A0A2EC8760003CB0719824C3ECCF39B5E2F0E792B9DCAE1B8B267D4E4B0 H_OutputA = AC3BB0BE7923CA350FF8DA4EC7DDCE8134127F81D27E9FE68E033B2E80D27EF1 DRBG_SeedB = 05D169FE72F5365BB6849EC8E0B537A0BD362030FEB42B526D7ADC12004568D9 H_OutputB = C2377F46D979679D0E760A5032CD7F59AA8D14C4F7F32ED6D5F13ACAEE3E7589 SharedKey = 9EDF5D5007884D188B3F06AA40984CBB8066F996014E77798F2D61F8F0C68EF7 DRBG_SeedA = 23ADBDE2BB0D3617507B643DDE356180E4B311771C784FBB786FAFFC6D384FE0D64E4DCB3099C170926707036960B33C9131FBE054B9D9EF7DFFC472B467913F H_OutputA = 0F8827C495AAC6B45EF5BA472BE34FD3D00335F484E77F35578E5DA71F382B55 DRBG_SeedB = B7765A7F93DD805329685D7B3BB4E36652DE6917A5F788A07F9C82F18B9D2B40 H_OutputB = 771EAFB019F47B16F686928B116D14F7B29966B0A28FEAC02FE7C8517EB5B6CF SharedKey = FA8CB105D93B28E88EDA6DC0C185F1BB4C4D17F5DE4E52CE1553D22718BC3EC0 DRBG_SeedA = 4644D44CF60FCC343152F2EE17106C07C687BCD8DAA3B8B2A90053A5339C708DD38209DD2B1BCFAE346EE86775FB5BFDD7FD96D0F98F798CEA6601A7A4A77E43 H_OutputA = 50BACC98A1243E9AAA3BC66E74C1FC8284186BFA9595C43426050DDA4CF2EE34 DRBG_SeedB = 383412EEAD74F03B01F18261DA22FF2D87AB629F085C8C3E35284538E607E460 H_OutputB = 3B29C33E7ED7EC081699C54DC7A60A78D0F5C5B8C0B93BC7CE84B6EFBE2EBF7C SharedKey = 41E3B3AB8926025A9CDD338BCD0600FC61CC6B8E5D850AC38E4E40285D987C94 DRBG_SeedA = 08728D22DC1F1E9F18B15D303AE8C6A84B6C78CF249FF8F24F20055E78AC6E8008B1FB4521EB7084463F0811938891C6BD37371E9055EF654F5E416E8F0738D6 H_OutputA = 5FC38C7FD2FC812A2F47A2B647844E9EA8559AF72B507D26CDC7F96155622111 DRBG_SeedB = 839424A2A8E083F0A86649BBC7002190B3D0B2D7242757224A97EB5827703C88 H_OutputB = D11576346731D460A89D9F1622A9286828F95B4C610FA82CE692C9933D4434B1 SharedKey = 8CFFB6A9219C026CAC33880CA1BBE605EB90514200F7FBF7BED7FA718059CDCF DRBG_SeedA = F996F40342EF7DBE63112383635CF8B18D979E31526C3B8A690167BC849A1A77F45EF33DF9F6569C2959DA17A9380D19D7A3E5679C04116014E2BFBE3296B453 H_OutputA = 1859FD8CB2E2CCAC204CA5F6F6BCF64DA0A3B350B7462B78BF739AF13B0F6BBE DRBG_SeedB = 41E61A9AA849C65E0A40037CD2AFFB8CCD759DA7F197A3441150EEA6A360A756 H_OutputB = 1CB45F0C34035421CAAF06DFAEE4F7F365EC8F84FAF5F760070E1F0349BF76C7 SharedKey = 1E46E1286F36B821751FB460029522006F77A1A001D9BE51003DF62B7A0D872F DRBG_SeedA = FE5833A7742C9EDB6BF4E9D0732D052958196D9C6783EC7A1D9AD6076F9C59D9FEC725C5081032EEBFDBB0AE0D6B5896692CED2F764E026BD452C9E88EE1F7F2 H_OutputA = 22A6028441D055C00AB9B2BB9012D1B05D4BD9836D25253C120C3BA634748797 DRBG_SeedB = 7EEBA4537CBA9BB0A96D9B16BF2F4EB6F45143522AA7128F17755E9F097D30C9 H_OutputB = 0B958495D291A297B340A65619FABBD38473D946605331A9B137C6821CD38207 SharedKey = E98866CC7DEE1F36436229127A6197685DB40E3D8CEA55DE7E0B9421DE450BF9 DRBG_SeedA = 7A8350BC5B9693B49837FCDD9FC41FCD42FE8B8C456B0B2A6B123F98E4691C4729D24E858D5FE59DC273D27E590DA7516EEA8D017E8D18B09CFC8FA91F1FB14B H_OutputA = 0397E6B45CDE0897008744FB089FB6D26C22FDB8E82E497043E56BD840A6FA70 DRBG_SeedB = F6862541E78B43A16B313034FD01D9BAFBF972CC17BEA551F0E75961461CB696 H_OutputB = BE21CA66BC946063053190025F197E78AACA9566B79C8113B86AE7EDB359C555 SharedKey = DA6BF2530F817718A2F6148E705F9D1115EB8985743385035B5C46A67F598835 DRBG_SeedA = FF64FD2CDC975C1A6126AD7DD4E951119074A2CA3A99AF70BEC8ECAB44A371223F301542B8FF34F61BA84D8C354BB65735F0BEA1A1BA858224288804356F21CB H_OutputA = 13E41F243BD00CA61CA2BD99A0D039767F1C1727D190C0F1ECFD8271850836FB DRBG_SeedB = 7140FC987289D2B5ACA7D974DA37AEDEEFD1639A0D7DAB95944F1BBFEDEB7F8E H_OutputB = 5A077A5D5304230BB2BBA83E2CB6E135929BD72ED5B7BC5F972932BAF9C504F8 SharedKey = 015B4BB77EED01731EBA876A6B9ED402C5EABB7A0E892C9EF7815D75037F8F86 DRBG_SeedA = 3B657999C1EF7F8955154D77707A98C2CF4FB5008D7A1F1D4FDBA2C6EDCB76EBF17CC709E75EB26FCF69A53E2CE74409C3D66703074C4672962541964B5D72AF H_OutputA = 5ED90D97E98DBCF04D79CD602979709D78852D0C6C6993464CBF1152D49D1FB9 DRBG_SeedB = 4385C08500DA04BC707DE59F5425B9BA2B0691E82C77E41350A1813F1A0249A5 H_OutputB = 785AB27E96028C2FA93CBB89813956C6C3BDE09C185535C561F54EBCFBD391E9 SharedKey = 3E2A7B0564397F273C0A88325F05C44183D1009679ED71DD404EFE8D88BBE446 DRBG_SeedA = 2A1E181BEF61AC23242A57A6FD6CFA9BEF02758D51FC06F5F06E9950D328D3330816CFFCCB6B2EE2065B90E0BA1EB3F15B3B0EBED0625A24BC7CC4CF374E963F H_OutputA = 987D758ADD260D87F35053C3AE7602B67B45413231081C0C893B1B9208C8C271 DRBG_SeedB = BCD77B83FAAC03813FF1B9B657B194C971CA986B8DD52992A5C61AF81BA4CC0F H_OutputB = 0C4079F8DFD6E7D0DB67FFC018052C0AA89F2E8552978797226A820B2A0E0116 SharedKey = 367B7166774CE67AA509D9B9FA6890AF2186389743289BC2E2403900374697E8 DRBG_SeedA = AE344B25A268DA763F1D2EA5221093756FA73B2602859A62AC04089A14848095F454820014B7837DACD20BB6DC83E1CD293D18FEA679907BDDBC63D7557B9942 H_OutputA = E99D32C7E09B4265DEB55D53D5A9096357DD24015551902AB1E6AC1E4204CD78 DRBG_SeedB = C8CFFEA23AF722D12C153185F0A1F8616BA13AD08B7DFD49CC7768315D566BAC H_OutputB = E3E138B26C61A4C7B10149E5BEA319323ADFA41E96D732F7AA320C186F5F28F4 SharedKey = 4A27CAD56A48237D5E34AAD0E1AE3DA5EB1EBE71A3E012BE48FB3AD24F777967 DRBG_SeedA = 2B730E3FA6C8EA8A48CBF2E7E5B4227D3E0EFF09007BA4B3A768F52F4CE2E2F49BB4C94DBFB5EAE8A99C0D94B09566EE995DB323613D0F3980AE4693C80E87C9 H_OutputA = 2ED33D408BCD920C566314ADDB7D85A2400A159385E9E19BA0F2B8975C7E2BEC DRBG_SeedB = 0E68F0104EB03075CDA6B691C67F5031D0D844D8860E0B9DFDB1A2329912933C H_OutputB = 5CBD803921756B679E41EDC87BED1C8AB7E0309FF6D69342601CC16E07A535CB SharedKey = 32E75EDB8A8BDB555B59B5F4DF61FB4332A4363826FF0FD5DF1F3CB30BA47C1E DRBG_SeedA = 6FE4E7F816703A74C43AA4818301C4CF76FEF646A59E63BFA11B93FC4D67339F91A74651665F4642031CE1C9929AB1E58D0270B344506A21AB9B029D6E7CD6E0 H_OutputA = 9CA34A47A2C0D80911B619626B56D21192BF2660C7BA7A89C2EA27A3667E7593 DRBG_SeedB = D24F6150206260E1CC243E481BF017A6395357EFFF319A27AD667A577FA2D238 H_OutputB = 71B21EC44BAA71E25B927BE33B0A218A7253C76D42F6854A774A45DA9B1B9A9A SharedKey = C4FB088B9AF4C1E263F10AC8ABAB0B53B74840C22A4900CA853BB677DFBDD0F2 DRBG_SeedA = 9A084D87D7881B03300D8606240689EDBBAB3004356D040B12535F4057A56B331E984153D3B9D6A6B30664FF2B92B2CA7A5BB42261C35A51823E1D0CD602C200 H_OutputA = 8F4AE462A2C24B0EC5D3D84726A57238FB38E0D2951C6DA40993F74941D7FCAE DRBG_SeedB = 1AA0C86DFE4500EF3C013CA07AA4C3151FFED1FA64FDC486819C7286CC48918E H_OutputB = FE2B6C18795CD0DCC4828876A5DEBFE6D23D6D72C660428F34622B982ECB23D6 SharedKey = A608BF23648795CC236AE79CD3EAF53155DD63A3BB784B1813BEF8680216DE27 DRBG_SeedA = D7656448BA98B7E6601DDF8E9F4812C1BB718CA6A935544BE24E8F42B539168C40AC3B568F5C4CBEF91F6A441C2590877A39A75700BAB47B4CE38969AC976BC2 H_OutputA = 252F25F77D6112159CD3D080CEB21F548D77CC505CF18AB543595202158A92AF DRBG_SeedB = 3130C000D5660CD3144159C853367E800ABBDDCCDE9BF565D9FFFFD2391EB243 H_OutputB = 9623BF1F74D6AA8FBC0FFDFFF735F9FF1FB54854ED817F6ED0C2E8471E769C3B SharedKey = 457289E604908C04DBEFFFD58151C4A6ADBF7398ED69D9016DA5409B975B3863 DRBG_SeedA = 3EEC23C71DB84F2BAE4E3E9504C6223AA6D64794DC82323C8ED5432946CBE56395FD26DFD2B4795DF6BF12AF11495B21A1B34093F93A49958F566912FD22DBB7 H_OutputA = 50545746D64ABEC5D9B8043D0161B4A110CD218C207775562E54420BF864E50E DRBG_SeedB = C38604B5A384614CA730CBA0F51FBBC3B724D14B1E12E2A6697185EAD5BD272E H_OutputB = 684319A500C6B5D481D02105963E9016D6B41DE262C21CCD0992A1A4666EF8E6 SharedKey = 73CEFED13CFBCD21AD684A6165A2C25CDBDF2C8F8B026B4E8CE94A42816FEE4E DRBG_SeedA = 47F2F776A3C41F68D55B3C6EC619E6D62065328AB5CA3CE989C0B51583FA28E910991453F593639935E956803B0E6936C3AA49DB79C14CCE7DAA87949CACE370 H_OutputA = DD90C764BA018AFB9B366CF09FCDF5185979C83C651B91DB838DBED365DE70CF DRBG_SeedB = 797E48F12FBDDAC129657CAD2C47DEE77BC21EF805A5EA4A9472FA9D2D695F8C H_OutputB = 7DD6842B533F3649A32EA6904CA7A90FBFEBBB838A46D70CA4323DBD64C600BE SharedKey = 56BA33C186EEEED8EF041563BD8851AC9AAB384B8F309818C8AE21F07091A28E DRBG_SeedA = 1E7B154350468D0222E1FA8136405497351266ED492F88C9F7D6C97F0227CE5206F4CF85D1F56CE4E879717C5CCE3616F985409794D3167CCD913389F8BE8B7A H_OutputA = 8F51BA7CC224789622B884EFC41228B24DF2B3AF5AA5E0EA9332637970DD573C DRBG_SeedB = 21748553D33BD525417CEDF2A0DC5673E7BFF10A3A7FDC9C069B2480CB89126F H_OutputB = FD77FC2676CAF8E4DD03003FF791E6C0383B5EA31029ED3F95A011AFC33A5B98 SharedKey = 324A2E7B52318D6A559AF02EF0980B4C6AE6BBDD667B5CEEC9C09347750F71DB DRBG_SeedA = 85BDC8010265564FF48E639DFF17D2A6AF6F1526BE11086B15461971235F6B34D118507F8C08E13F68B55EB06E13932E5631C388A783A34EF79E819FC3A4CE70 H_OutputA = 49B24FA4DF11359BF52C75C6F6AE815A8261F10DA3F8990DB0D34343622909AB DRBG_SeedB = 17953599EA095112DB451D3A4436239F30DFDFC19AF256480097B4195618DEF5 H_OutputB = E6E65430AAB2AC20C3BA755E2772B541368729B1088C550647DDD508802ACAED SharedKey = 8F267C4B85AB4F8FE30822C970D3873D1DD99A95CEB3E2E7EB65A45A84131973 DRBG_SeedA = A6334F5E8A1B651FB2FB36191E5475528889642D141054E77B00F078442FC38DDBDCC54A51A2AF3A698CF7FD02DF87B0501951EBA6A0CB28971A58A238CD786E H_OutputA = 82DA56688CC89DE562AEFDB4041671AA7C5E4A3B49D174327F019CE64666DB43 DRBG_SeedB = D379FCCDD8DB2B8979296AFB1D5D0A960E417C90FE4B1F837042EB4803419DE5 H_OutputB = EBABFE72699739336738E44A12BC9C0607BC79B795D9A9D0F1EC58420551F0C4 SharedKey = 39341933DDCA8D418EBDF92C16956C2E31922F46E79EB461DA9BBED571B850DE DRBG_SeedA = 94511A4B0036E23AAA3610300F526C58C6F39CA95BB406BFC0EAE3C7AF99BF2D47B854D97001DB8FC6EB1DBEF058718EEF13102A03F9C3480327A68645D3208E H_OutputA = C1CCA91E3C7A4005FC9F6B29C2AF034EE9546B1B458BD862DD186BB41F2226B4 DRBG_SeedB = BC9C9E337625D6281DA0EB1E247BF7A47CDEB3DF9BCF7C99D425EBA11DE4D16C H_OutputB = 9C597ACD8C84984E11E201FB1C83CB903B1EDF61D35FE86747D76D3243E5EC1F SharedKey = ABD349E2C548F199FEB51A798066CE32670251FFA235D4E9156BC87843009068 DRBG_SeedA = 7B844B6E8905765496CB7FFCC8A5ED45A6CE2A56EBA15666645AF38F0A1A372878BD0A3543E3881042D5E79A8C59067648E2AA3C929AC8AABB6A4E3C07506F80 H_OutputA = 17E777143CC41D5E6CD7267F4171BF0E320F03EF63C15483EF3E9342F0DDD4EF DRBG_SeedB = D6EB101720761AE984AAF16305ED814DDD3C9FA7E48D261E6B13039E29CE19FA H_OutputB = B987AAF043BCC778DBCCB302603BE17F451B4AC00C9AB0FFD5741E5D7EAC3D88 SharedKey = D5B723E0BD43BE35FB7B04D9ED70BC931C210F464E2A4124C8DB0A786AB6A850 DRBG_SeedA = C72B9448E055FBAE11507598E0FB03C1FA8FB47E851820B0CDACDE463CE3E174178D1C36A3BA10C87791ED64CFD52054197BBB82E8B58A42C3CB818698F8CE77 H_OutputA = D9798025DA58389E7CD7AC4E63A6CA0EEB8315A29D0FDB7582DD3BFEA9FD8E9C DRBG_SeedB = 486535F6C41CFFCA34E9084E401FF0A4CC6CD434BEE4ACF09596B94B0902DDD1 H_OutputB = F92A3CA50860FB5D1E421AF5242ED89A899E00D45D54DDDC169CE2D87100E8F1 SharedKey = 7071465DFF3E8A7B3170F34109B9E6C85C35FD829E1D111D1C3777CC8008011D DRBG_SeedA = 67AD36DEA536E4F35B66F4DEC59BC0C8F2384E1CEC11E55612A3C09725F4A9BE741913C190197B2FFA737434C3BB84F059E72484AF53AA1B1B8267500B37A334 H_OutputA = 6231059625EC2B5B627E26487EFFDD1018A5FFFCC45FEDC346701E2AA6ED36AC DRBG_SeedB = 38B9D53CD9A578F16046CF309D85DB381360CC392EA99551CD0DBC05B08E689D H_OutputB = F9E7E21CAEBD4107D53CE0A67331935DB3D4C26F009F09E1D3ED7B1DC7CDCE6E SharedKey = 39CAD4F75AFE9848B443E91B3DB9B670DF6F0BB467E3410D2688D8AD21E33330 DRBG_SeedA = E184744F81C6099EC3A3331BA262275A9A4655E25C317B099CB2C715B9E480EE33F179EBF5EA568ABC3BCAE13A4210E4D116CE461DC0D98B1FDEA5D855B8EDD2 H_OutputA = 4B4A91C1DA454756300189CE5ED2B689BCF7D4ADB990DE404F179F4B34C9737B DRBG_SeedB = A03C2F3BBC9E547E8A212A6EA0FD1B3A9A7AAC5063A84523119321A8BEF47EBF H_OutputB = A177A0363EF2228E569C90006F290E1F47B9C42CFE52FED315AE21D8750EF7C8 SharedKey = DD11D20249FB34AA87EFA1A0EF5D17D2300DD24ABAE20700A2E4D5EB521F248C DRBG_SeedA = A8A87075FD5B2ED8D561697F9151E770C7826C39E81C6B0FBEC54CA618C080E2260D623A30CB0A7AFB735EADA193AFC4E3BFD388F03C66F3A746DF7F9074CAB8 H_OutputA = 666116C291DF7D6DFDFA36F023F27DA3243C2B15CB00560A27087CDEDA7F2F92 DRBG_SeedB = 5AEBF45DC871517C77DA8EDA211C644E88D132CC1BB7AE154B970B302FCF058F H_OutputB = 7E91E3000D342792B7B3604E0EDE93BA14090D493321035748BDE8879F9863B5 SharedKey = C4061CBDF52A2D59C1F98E4A1D994ACB4D11639DFADB5F98C1DE18D35BFBA7E8 DRBG_SeedA = 876191A226A3DCE381D6998EFC9771849296631F59F83A3AA9052E1A27B8443293FB48AC65F57E1D571F0329E811CB9C5CA8EA92C2A2C6FC058DB08D244C9BB7 H_OutputA = 51965F9AB9F2C4CA700F8D1D651E5BAE3C44008C37E62552B3D8BC00B0766D48 DRBG_SeedB = 61F7307120E2FE55A8A28092801F90989FF40CC688B5938B4EF9185AC027C9A9 H_OutputB = D4FB77A25A99CF69F7FA7192FA283F113EDC50939F26DFE4E606BF4CD80E314B SharedKey = B9E0A44C592677CD2FD7B4FFE584EC1F81A622AB202B4DCCC03BB4FA317FC552 DRBG_SeedA = 878AA500ADBED4D93C0C6C9680A22F2F0C25B70B3EA74B5F64A3BDE8CB83B4E5D42B5A77504B26DE9095FFAEE7BC61BAB4F28AC9A0FCF6E733D8AF1366078E54 H_OutputA = 5CCB884450B6CCF52CBEC2DE1C050949F57B368D0C33BB94C25625AD4C3816BA DRBG_SeedB = E8C90A25762DDF498B2C0465A389A2D12307A85AF33520949904FF7B7228A7D1 H_OutputB = 8CDC951D36D58FBEBC9EB8A3F9772C9C02EA5A70159BBA5B8331C6ADF47EACF6 SharedKey = 526E125B464A5EAD8403463F307E31F489F64DF1B5FEB787E85CDCA34E39E4BD DRBG_SeedA = 25B3800C16297F4DA95085EC48E7A18E6173D95B7DA96D9B637A67532D8F7BD892D3F0C0FBBD7A99F369DD4C2F77AD135B98D55BB6B6D54647D620529CF21532 H_OutputA = 8C061201112560E5387FF6D90905BBFF3FA8F225BD5EC35A59C20BEAF1033530 DRBG_SeedB = AE6941FBAA3DACDFC1C66A49CEF43985E9F900F1F4430A559F63A15F57080D76 H_OutputB = 12A4CAABEF1A348E75A363CFA7F587AB92395A07E5E74ED5315550C027E93049 SharedKey = 0D654B36360DE869C893B036D348E16BA4B095E0FC0C8A3BB709063A8374DD77 DRBG_SeedA = 2A92C61BA3297085A84A5DB052D0045347F0C3795805BD4ECBEF7F58964BE6E017ACBC037B9887ED7AB4BB100C6EB956549F13EF8AED74C6C34C06772AD7A9AD H_OutputA = 309F13665EE249FEE0CE184216EBEB201DF5A398E0380DE6F47BD502C4711352 DRBG_SeedB = A6CCD779876D9C8C21112E22D83FFE5F1014AFE4465B5D2938DEAE82670A055B H_OutputB = 01F4206B9AF94FCAD6C56B6B90E206A92FEC03AC0F4E224607C2E98CED7FB0D4 SharedKey = F484C899469DD9DBEDC47A5C4035C9E6479DEADB80C9150D5934DAC9A2D6383C DRBG_SeedA = E57EED6DC63E8E86B7508A9BEDB78F24D26978C49A678AD6CC0C371B9E760B5D73BF8D21AC24B43AE637791F8B039CE1532711279CB9A7A9F0D0FD26C9F7DC02 H_OutputA = D546C097C6C56167DDD9A8BBAA758F64400296F2E8DD276A59C7284E44C515CE DRBG_SeedB = 2F47FB890FA37F5829303A990546585405DC58FB1A3CEC80B776901211140746 H_OutputB = A7030097177B6D8CEEC7D1C7FAE9A1DA797B0E5F5416C08AC46F57CA212CF874 SharedKey = 5C023141D4D98D466DB67DBE6AF38C7B1D4B630D5F421FDA7CCFEAFF623F7C5A DRBG_SeedA = B03BFF58964E6CB62A9E0E8C3024137452742725C80CCFD01C549FFC173571F8E44A1B39FA4E15D08E75C8BB3565B25CF49D9D6323C4DF4802A86552E97CF9C2 H_OutputA = 887907AB392B923F3C48495A7C2C76E3F9753E97DCA42C010D5991AA614B332A DRBG_SeedB = 22D73B3E750F1CBC83F11F49A01D9A611E13BCD1F676298436CFF18F39048474 H_OutputB = FF6F2AD852D24C22498A341291A2A96A1ACEF205A83DB14DB008C76EB53BF281 SharedKey = 6ABBDA67B3D8FCCC1D7C32CC2527B9F40E460E167F321E9EE4FF1759FFF6712B DRBG_SeedA = 4FFDA763BBEAE60CE2D5E993A7F3292438F191CFD17C6270763399BAD5768E372DF086B944CD9D2F2FA73A812E7D3F3E11F12DC4486767DBD108F08071D6C2EE H_OutputA = 21D82706B1485B408C56B7E3BA693D812A8FB6A6A7FEDD1AE34BD4789D1C7E33 DRBG_SeedB = CF15C978727D53C2E81336A58A05DA11FE371E4844141A0D2ED6B15A4210F7DD H_OutputB = 53B946A64531AF2AF2F59DF12148F4E80D74477A7E83DC846FB2E72C194B4018 SharedKey = D318ABB1C92E62E10D9096E73B60FC5D0B93F013F6915D34972B2C60D664B38B DRBG_SeedA = C0B64EB1C14DCEB3B7CC62D1997FC4B999EB69ABD5206B9FC58FFF60645A662FAC3A014A9C075F5D6F65939D5B122F0CC6979A48CD61023E212AF725107C878A H_OutputA = E532063768F46C8FCDECF03A6DCDC57865E4D5EBAB57E7C9BBA13ABCC0ACD71A DRBG_SeedB = 4A66E9F2EB5D49712EE198775015F823FADECBFB38E93AE39C49A8659C37A872 H_OutputB = 7A527D25C52A9DA21815FA4F0E1F9C1C05A374B293C638360BEB97F20EBA23EE SharedKey = 0F4A3A2D2A319AFD1B9694161CD9BD68AFA917C053D4139E3DF65F50324ABB62 DRBG_SeedA = 4CB2E9531C701825D6AC3E5DA0A605C948A9C8E720AFCE7B5BE72EA3F45BBD1FBAD39C216608AF416A8FC0DA2C3AB40CA390BCBED86419DA5B42755B152DAB25 H_OutputA = 6F5CE6CCA6D74D54F44E2B1CB9C23446F968B068F96016A1CE5F9325DB967A91 DRBG_SeedB = E01360606B57E5666FDF60C5D7BD45F367AF6FFE913513141CCB4FFB9B7595A1 H_OutputB = 8443949D54311A488DEBA2053E26EAE8067650CE452DCCB9B8E8A51EAB35D1A3 SharedKey = 65AFAAA8E694204C12EB9B5EFBB565604DD383B6E74D60006436940E4AF7F86C DRBG_SeedA = 0C60DFDCF79E777046A60BC6BA5B487AF2CDBE5446C55288F62777311201AEFFE4865461DD5D6DB5A6CC2CD5E3BA77638E30641B62E271F1402A52DFD0EDE4CA H_OutputA = E21D7D1EE962F7D5D85E4A9FC1DB79BBC00FF006A6BD22859692F24B7F5939E6 DRBG_SeedB = 333F7E43F06FEB393158B8C0AB45B6301D0D6134D5E74C2814ADBB3518F0F8E3 H_OutputB = B9814222FF782A7A093B3EB710E1A0EE3535860E897C118B0BA8F15312FAD479 SharedKey = 45753C7AD3FA42CD43D8DF4F4E8BBD791B7FCDE42DCE6CE11ABA2D5CB5611070 DRBG_SeedA = 42E14188173D9CE0DA4D1D1C85B4F96B4FB781B8ADA41BA22A6C0F98B7E4C154A93F58F7B1FE0D103AFB43B7D8ED0531CE586C19A6F97BB9A612A25FAE4B407C H_OutputA = CD7246E4D7497FB41B6EB2AAE9B956A1618145BFED8ECFCF3802727D723E6362 DRBG_SeedB = B09696968E7C3495D346DF190DB6891E4B1DFC4CAFB637C6AD49C0C06BECCEC6 H_OutputB = B1E5BCC935D43B612F8079AF3502C03F51AA22339387D5043CE302A48F3BA744 SharedKey = D0E5EE16FB3E55D997359E875161C481CCF627D85B4D61E656FB3046CE96A1EC DRBG_SeedA = CFC4649135453DE3D87FBC4525151247AB0E85ED8CFC0357F3F7513BA42511A09399859AAFFE28E55F4AE5964F550F8E051DAE97FEF5BF731E3B09F2EB393B4F H_OutputA = CA6041529EC0CB89A04652B6ED99EFE045E7B96E8D16DA758EA2BF33445D9822 DRBG_SeedB = 30F3D9CE03DB365813FDFF4234E02E4A215CAA73575BB0FAA7A1331655DB82BF H_OutputB = DDC9F57929A6307F4CFBAEB245D83E994943C857FCEC3711A1F709542A68D39C SharedKey = 57A58C65B7534A997CE4F7E5C50BBABE2111FD93BEED8FE12290D32E5430AD2B DRBG_SeedA = 7FE11CD1C0356FE9C02868C0C9766FDFBB73FA0790539FD9CB33A9FE7958CF67870F532E83908D2C4F964CC3A80E36A488C4A6A1BE4113F6FECD62C233B91CEA H_OutputA = B0E282113BF22DED1E0F0BB0322A0E1FCBB39E41AA8B0168C514570FE995310B DRBG_SeedB = 04F19EC69652D0A057B286F095FE46B9C04E6D8FA15000A28602498FA71D6316 H_OutputB = 526BFBB60348290F0AFE1367596EB173EC52FF2C0956707FD468CAA60C178607 SharedKey = 7F934F79C0A501731CB9CF067D6662B77CAB80595C8E4D72A31CCD8CDFC53AA0 DRBG_SeedA = 40AB43A2D10ED674687B4D874876071787896D4AD1A4ACB3FE8EBBD7BB849B247A2D2C14DEA874E99FBFBAF8E59AEB5C89FA9D78AD40FC338EC187A8EC0F69DA H_OutputA = 3427AD43C43597A5447069CFE8D61161F9B7C0E040F17BA79CA48DD635834E65 DRBG_SeedB = F057DFC0E570E1D5F7EF21E56C7D62D404122C829011157DDBC1E325A4AB20C2 H_OutputB = 677FC54E27F24B56A13128A63FADA2F51DFB1875832FFBB5451B7AB93EDDB245 SharedKey = DD898A717F4D9D0C8D5F0816E22DD2853F961B868EE0FD6C53789477913046DA DRBG_SeedA = FA74F07D43ADDE397DB40F173E15BD80DE7D71945E043D58C4259F7620554BE89B11F5D959129F5CD161B8F78F16796726CB814E1FF9EA312CEE3CC638307D0E H_OutputA = C82BAF33502533D83FE0F540A5FEDD1EA66F59C77B10B16C199AE814C1F0EF60 DRBG_SeedB = A8544BEEECFAE1FFF70AFB6C8A99861B1706700B8F9B41C6212F1AE3358B8392 H_OutputB = EEDA3D83D830CD7AAB65268031B839B80C9C312C5DDA0117CBE570DF7CEA552D SharedKey = D0E84B845CD9C6404ECA1BC080A946ABA92883131DF0251EF667BCDC8F870CAB DRBG_SeedA = 13B68FFFAD773F6614612C283353619390A2879684A7091D0B7DD950B2E948D246F8ADEFC5848A1CE9039AD2BBA31920A67960EE034B2383113CEB5D0BECA35C H_OutputA = B62BDA82BDA91EDD8D47270950D75C0A1F989C19372D0E30C2F9C76D7AA1B72D DRBG_SeedB = 0C1F22EF501FBDDFC15C4CA8F19BA4D8D2528437A5662FE27929C3583545824D H_OutputB = 321F347F22ADAB26E6FFFE8EA7C908CD8862C353CAA779D3B3F4E7DB2FDA654A SharedKey = A21459E210BC96A34F6D0DC1834DEBFD1AE3AC14FE8CF436317C4BF0A620705B DRBG_SeedA = 195FB2D61A5EDC0A7A1383822DEF67B3078C13BDB8DBC893CAF6BFE4AA1209C820CEA19C3C886DDFD4B454E66E388D1F8BE56B0855D22F9AE79EBEE993B25AA8 H_OutputA = 4297E8AB45FD89B43549B0BAE384E461D4632084AA24AB5BDB2205798DCE42CA DRBG_SeedB = E239AB7B2DECC255CBBB6CCB8E7B6835F4E5C5C4F5F7D6995E521D516121F0F9 H_OutputB = D871DD42EE9CF633F5787E9AD2F3EE1AB92689E74EE600205E6042C19D4B5D58 SharedKey = E0A64D2CD7A3683F1CBE6C342BA2DEB8B7A092C7F024F1110736CD0E0005FB4F DRBG_SeedA = D75705601D29720F524F01A0116201D05303D606E3C367F67B1509A4C0D0BBBCB03EDBDAE0B719F763F69F14AD1F08766B3529EAC8947FF1F838064C66FD1AD1 H_OutputA = 3BB73C378F04FA1F4BE2E9EAA956C88DDE92CA5D6C478A68825EC19C4B1625E7 DRBG_SeedB = D7B57ABDAA79D66BE3F8C0C8E266D3DA69E1F857803F5B2D8B301F394A1EA1AB H_OutputB = C45D8D358A9C12A327E0BC5B32A745A8E23D35BEB9A1D82CFB74D67696244C28 SharedKey = EC804C177742718E928AC6727D293C02CD89798013D88211BADD083D16B72AC8 DRBG_SeedA = 0F1A890C38A1EA11FCAFDF39E2EFDB34D4F90D1624C2F7F91DA182271C0DD2F22C0A96D75CBCD6F679063DEB140B99DCFC9B6FEDF4D1101F98C34B88721351DC H_OutputA = E1DB9B271912A3A2A78EBE4ABAE734160D890FA930BD79E34D97C7936CBDB54B DRBG_SeedB = 587E26931391EBC75CA5C1FFC4ABABC6BFB339B75F3EBD17124058D1660DB188 H_OutputB = 56D84099B21E87D29B3F0AFA8F614FD7239E2633C05B8E2B362A855355D73A9A SharedKey = 26D6A721BE1D790B8265DA91ADABE1EC57FAC27CE3EE415F4CC07D1363498E7F DRBG_SeedA = 4F02A914D3249E34B35579EB3426C0868DF32C71EA6D77E3EB2E2FE8DF18F894290E9AFED89ED3DB09AAFE7E1EFF88AC6C61AAAF392D2006038696B0DE617935 H_OutputA = 756D2D7465423EAEBF7748BD16FE63C00CBA1765598954BB7BECB4789294C8C8 DRBG_SeedB = 3C39372C923A70FBAF98A4CDD07BD0C37BE285F0F274F6C34ED52A81F24ECFB7 H_OutputB = C6C7039E830BE3BED52D6306C86A07DB752B308B8A3701F7F1BD1206F03591C8 SharedKey = 417BD85D8C24BB5F4DF3FC4FAE733BC9BE98E0D4033DBA99B7C1229DF65924F6 DRBG_SeedA = BB2123BA8CCE9ED613D54C00089680FEF18078B159FCD64010BEA76E78A9A6D53CEF8F80642842BC299D96025F529EA825F918D0050A83C070D59FBF61F92370 H_OutputA = 43C051C1B58FAE4FC6984F8AE78E6431DBDF33BCD7E1BBE4D483272F3F62B659 DRBG_SeedB = 24E6DC5D9155318AD661193E86A3D17659C624B28E043FBE13018DE564C7D3A0 H_OutputB = 2142ED1691300DC8FFAC04389D40360796440682EB477B8BE6F9AB38623009D8 SharedKey = EF7913211724F492E8B997E188F9B783D771643169DE9B0B9D07BA952ACD7D40 DRBG_SeedA = FF5653E78D4E1DC3427314C7FB2BE22B2264A0F0A0A19C42F66CC14DA6CAF0777A72F936E6C921AA505878D0E503D10114350DBE50E43AC77CA6CBC0F37AB641 H_OutputA = BBB6D5A9F55E8305D642DBAE256655C31D861A78E505973DCA843AAB121E8FCF DRBG_SeedB = 2F255BF6794CF8F168208A19A95BC97F41446E5F04D93C07939DD8049C591249 H_OutputB = E4B42906B6A8DB5FBB277BBC5296F28F72D74D5271CAC96A6E4B8C6A03FBADCB SharedKey = 98B2AC11C9CEB56420912D25255E46635CC910E2D5943CDCECC013E21D262737 DRBG_SeedA = 803981F67D3F31E1423E41747F0DDCE61DCDDF262755B5B0EB693F6D1F10437960E78328E1DCC03DB3A5D5A183E0586ADADB49690F5FEE2C9CCE641BC28291E3 H_OutputA = 266C48A10E8FD23EC79DB72692BE6E26F34E50044A43A37FA10C3FEAF8525293 DRBG_SeedB = 0B50754AF7B0FC03479F2523BFE51E73F8D215DAA1D4C7DCCEA6E4F17CDA2851 H_OutputB = 7633FBA0A981469B1E37E9830A6CEEA470CBAA1BC1C4954E5C0A0C1BC3AAE094 SharedKey = 076A0E0199C824815F1339E0F8332A74B4CB8A73990B83B3E7DF8F1F0AD95415 DRBG_SeedA = 928200645D8C716702889003F130F7CCD41E7FDB19F69E54D790E363F520580AE9BEC4E655F59ACF27E2EDBB740E7F89A5772A5D5E8CA65A42AEBFB55EBA3AD8 H_OutputA = 7C93217D3693048438284885E57B28EAF675FCCD87395676DE5FA3321A82439F DRBG_SeedB = AFC2F82EF6A30FFEC051100878E3547939A39E8FAF915F276207D19D7DB3B150 H_OutputB = B47E5B4A62BFF66FA189B2823933C1374C861AC5FFCA741D1A25243D85050B86 SharedKey = CC452DC04F65141DD31C0EEE26B15C0E80F0E3A764B803657E2FB8A7AA45C3CB DRBG_SeedA = 989BEBBC14A4253EF5A44809DF2FE85D775096EFF43C353D8DD8288591B272C65FA61A5F5A1E4EA1DD6E470AE3DB726280274578E35CC68DF5480EBBF153CC90 H_OutputA = 0F474C095357A58D65291DF35C589FC340E0D6B13C3904991D1A8BD90D015314 DRBG_SeedB = 2C869CC1545F79C37021D4D25285141277DC1D9E54570AFA2C02E69B159B6301 H_OutputB = 95BFBDCE75CF943B3B44D0E8679EFDD84408EA5BCCD414FB2B35E083FF408B92 SharedKey = C263758B1466400C96F0696948A366CAC43CC8A522D3B1265CED1FDDF2EE38D9 DRBG_SeedA = B8BB5D4CEB44248C9FA9A0143D647276FF4E23F9F4682B10D92723A36EAD0F75C8F1E8E8CC8A3E4CE45FFCC9A30700FA1479C303085E1F884CA2977EBA153386 H_OutputA = 7367C77FD74FEB08D68C83921D5989D07DB9D6ACF9775B4754F30E9FD7A6F298 DRBG_SeedB = 45C53E0265AC64F600FBABFC9725DD2D6DDD5F10876950D6D8C7E42C5D2928CA H_OutputB = 948A965F4AD552BC965068481B1AD4D61E7B988E8CECE03674DE7313CC553A4E SharedKey = C9C8C61701616B0E2043EDFE64A7AC3A988D1758A358F1774CD77CCA0D184C80 DRBG_SeedA = 95557D189F666F8B3BA34E5804B50FF90519D1E1A4F09A3DB9954F05E95511040A2D8E9EC5DB2F1D800311DA866C0B90810EFBD198CE745B54E5B1FFB8C4B016 H_OutputA = 2A7C11A0623FBD8E9964090A1F8E858F3C7F032BD5F2A515934444EE72AA319F DRBG_SeedB = DA50B464C93B63212793B76ADE8B990181B18C14CBD2CC523F395211196CF015 H_OutputB = DE34DB46FEAEB7A9C67206CFE3B984F8BA88B33531860CC394452D8DD63C85A7 SharedKey = 70C3F7913BE6CAE36F7CDE3178D1C5528EBAF0023913459E9DBF009B5D13B938 DRBG_SeedA = F572E5304F9E07E895B702C9C4EF55D5B35481167BFA1432080695BD62191E508883E3F550A9B41ACD9F4A941F055CCFDF060ADBCA4342B1893916773CE5D4E8 H_OutputA = CC282949A59350CC371665D5C94D9E3737BF4F0AF39D5CA2FA5C0A678DC40CE9 DRBG_SeedB = 27D997065E5EE01682FBD2388EA79B985E10D85D1EB4DA48B2BA4E429ADC885A H_OutputB = 9093330328077CE40A1251C416BE44ED73C6D6C2DAA0BFCC7AD6A88BDB1C8A3F SharedKey = 7D6A0A9F2A55B864D4EC485036476D9551001B5BAA401028916FF3A5CD8B7259 DRBG_SeedA = 4FEBFEDDD122382AED173AEDD1087F4590288F92495A7376408858F316824F26E5ED9B4C61E8A8168BE84CFA11C4009B31B4E37DC66549CDEF1CA422DCF05887 H_OutputA = 988CBD5B311255A824F955C6F04513D889273D1B8B052743726A8C87CBF1E26B DRBG_SeedB = 5226FA74A70415941B034B3E93D28088D870FA775588B47D2A79E8BFF9C320F8 H_OutputB = 4E3CFCC52F1375B43E261F8AE04FDCE4F5677BA8D691B176528DA0E416867739 SharedKey = DA67899CF0DD185D16F709906D827544601DDE3E5E36AF41DE36EF6D89C5F653 DRBG_SeedA = 9D92DB6D6D90F8AEE05236F99E8F825B7E3BBDE949D17D27479460DB3F69370B306822C5066F41449319978FE1588EDF2D1B896B8A78D34B79A7190CA91B0708 H_OutputA = C63A7CE050BF38CD17308B3A6F13C113505925CAEF93DC8557C7FBA8BB03906F DRBG_SeedB = 0EEE466CD3F3AA5A48B2072F1C962A70B5D4520AF9882C725295DC9900E8B074 H_OutputB = 136E22C36840E9F3FB7965730548AEEFC2CC099DA9238C75FFA07F99ADAC84DE SharedKey = 4F03830C8467EEA4D540C0E4A611914B357125A86CADE1C8027ECAD0C8D28957 DRBG_SeedA = 64402BFCE621FBA302E8B476B90DF11FB20C2D8C47345E581778E073960FE71AC47F2DBC3523C03EB1943AC2FDFD4FDBE1E3ADA27F2B101001ADBBE01ED8218F H_OutputA = AE3BAF2521A277DF8014C66886FE6E4134F2841AF869561F9F3DA22A7E8DE9D2 DRBG_SeedB = 7ADCCA33015F578E1AF81E4D543B6D88EB401810EFB044BBF40D413B1BB0B99B H_OutputB = 36639A6D2F5B4FE78271918BC692565FD62E3236B731440475F794F736D4BBCC SharedKey = 3A09E4697F6B06E0065B24342CB8007F69AE9BC4375782300EA611523781C666 DRBG_SeedA = 7D156E541C68822B765277E0FCA10C01BC0F6F64ECB844AA458118975975DA7910BAF261B900EFA2EFC5103C28268B888625EBE7AC68163CD68031DAD13485E0 H_OutputA = 818D0753F17DD62C0A12E20C73062C8270615FA90CC6638E99429E3089CE2049 DRBG_SeedB = 407D898ACD8F55EF3366A73F96BB2A0EBFE517DFCDEDBEC7A9BB79CFFDBE9D6B H_OutputB = 6F6935FE58DD4F4AB281700184CC9058717128BB45502B39B2D84E14EE6E1331 SharedKey = D1427F310B8029551722D65CB4DDF825600C096D4EAE048076C2515BF38EBED4 DRBG_SeedA = 40308CA45D1E09624051A32C2D8AF5E6064B56B46724D03ED521BD078803234D4F2BC4224AEA03B3CFF9A6C7DE4AC6D3753D5908F4A7F6B6298A9F536DCE2203 H_OutputA = 68E9F06B8C7C50432701759CD3BD19CC60519EC8C35CFDFC74957B4785926C81 DRBG_SeedB = 23CF571ECF6D337BF57AD1552054CC48666BCB7C43239455BE75E4D1F3342217 H_OutputB = 227B1C0102B5ED7A745A2AA84C72B2F4A1FE2EBD5C210F3613B01D551860DA2B SharedKey = C7AC9260A0519D5826A2A3C5045917B90CEA3EDF02BD0A4CBCC2B61BC55A893E DRBG_SeedA = 297110F1F3569663A91477948C0676631B913AB0E7651BD7A31A5B0DE496AD3C3E0EFACB0915EB2D1F989A57A55252E8A3C985C0250321668A09A6E755718CF2 H_OutputA = F03F1593647FE692E7EF8A1BE4EED0E4936CDE86517100290FD09471C2B2B48B DRBG_SeedB = 76FD51A291A67A012558F008A9C230C21075EF2DCCD5A146C1A8DA1973940F93 H_OutputB = F86981B3F3C11BDBBC0D450DF58B1B7E0BD9616AC7187EED926F38C0EE72357E SharedKey = 81B64E977EBD0F0134974EC62BC66091E41B263D0B68A2894CCE6CE306699546 DRBG_SeedA = 02D11691CE81205787210544C039A09E47094691B95FCD3EADD0EE693E744BA2AC012B81B0C995D20DE84AC0F5DD0246874FDA2B25653C03FDAB9B5BE58316C9 H_OutputA = 6D5E2C08A9BC7005FC4F3272D2AE8D8D6E625CC5F5FC32E28F37498A4D99E901 DRBG_SeedB = 44F45578F8C8EDA6D3ACFB3E031C96D22BF13E02069F6546DD08A43200AABC68 H_OutputB = E3AC6E6F4D70319E9E14A67DED4C06BCDDA418DA893A72A7BCDEEA3E65BAA402 SharedKey = 7E7220F94C2C5964CBCAE0FB6E744E0CEB599114B8302291CF57C5F6CE6F5C11 DRBG_SeedA = 5F2CB89152971F9EA869170AE77801F8176523E4784EC1DC4BD15C1CA5E6733D7D20FAE02CEF49080FC1745460608EE8C9699EF5DF1BAF067D7DE3EF43DA0213 H_OutputA = 9356A53A0824E712F2A5B4259949FB70C737CDBCF884CEF5035537315864A2D5 DRBG_SeedB = BA14069EFA114E79D6AB6CBBD5A986EE62DE3EE61F790D947051D90EB3DDCEBD H_OutputB = D95AE2FC3D06CF8D9023B4F6B848FE66E242D8ACC5B090DACD91209B254A7D05 SharedKey = 3597CF44E6C0DA9E38BE0CCE455288008DEFFD39DF5530C5257ECE08B44DCBB6 DRBG_SeedA = 36B29E60AFF79AEC12CE9752AACC06CC284F3B5383C151BE122091511F9A85ECCAF0E7D9AB2C12C8FFC3ECB6474A0F34FA2EC6D51F59AAD515B95CFFCC36B469 H_OutputA = 5F8913BC68D2A55DB4DF5D8B57C4AF34453A94D1A7AECD541E7FB851C85F064B DRBG_SeedB = A9A0D31128173A658355858DB65B695D81EACEED97CF77919B3D6E11003FC98D H_OutputB = 732BC74A709B51C34D96D951B51FBE139C81F6BD05DC5F0091D86831D5BAA391 SharedKey = 17B2B3D7FEAB1912FBAF3DD1B59B67E785968191718CA872602398E5DF3A25AB DRBG_SeedA = CB2091ED13014CE5E3DDB31DD861AF6C208979AEA6AE886BD88A7A682D67B418633D7BBC7127EC7EF9E97AE9E9C311A94FC93B11BCE2BFAC3BC79F7D93FEEBCA H_OutputA = 1413469A45898569EBA35C87E25FB701C9515C60D47A24BDCE9CEF043681B5B3 DRBG_SeedB = 9597E8B0F156373EBB00DBCB10E35860DC8D39A58246D76360921935DB4974EF H_OutputB = EB3AAEAB3F2B150524CA9C01D5A1AEFAB31A6162C7F9284790635556AE735585 SharedKey = 745E7193EFCF4B7B11FBAE849E4CC47823529B521CD244A6BE05823700DC2070 DRBG_SeedA = 8FB5F2FC53F4EDBCA9B1C341F01385BA1FEE0B18F53EA601B80B1E712CCCA9E2E99B259B5CF7BDB641C2F1916923221F47AF0679AFCE0AB99D643EB745AD3D8B H_OutputA = 7E003DA953514374C93336C138ED699D873FA5107E6FDFC334BF4C2C2C6C1DA3 DRBG_SeedB = 2574BFA470E474B844A9C007143FA674FA35C7935BC082342DFACFA8A96FAE4B H_OutputB = 0C99D2A06DCF07A8D139E6CC0479605C463EFA8E310EDF638F2739AFBC68E428 SharedKey = F605DA97E9272A9F97F5AC1C66435159FD096B80054BD0079AEA7D5506F1A5A2 DRBG_SeedA = 3A844389B78D6EAB3B12C72993614941F192EB6273A6EC41D7CE328CC5218A83F1C3DF009B8A3000624C6C619049E999C0F3D6F5881788D05527E4B0F9ABEAC7 H_OutputA = 3574AFD22D6F74174FC3BF07D3F847B8851EFD6A1E1D51B1B27366D9EA7BD672 DRBG_SeedB = ED2C9D9FB14CBA6750917336A1D1B84308AC6630109DEF335CCAF4C4445F06BE H_OutputB = 2440A41F4A14D5A5E1D000384C370AC432932A19A2A5C42171C4C3C220CBE601 SharedKey = 5E907AFCF5246244F60DE7E8682E23981AB293A0D606BE31E1AD69750C1A0FF3 DRBG_SeedA = 7EE69402E5391C4261416B88E02E05A602DD59A82EBFB474139A6EC1C5367DBCC7E8C0D2909ED2E05F3538B9949C317A425D3C8166AAF7983D36173A519C163B H_OutputA = A99A7B3EAFC2A2C06C80AE0587D0D9EFBA52254F2699774C4780A3CE0DD58772 DRBG_SeedB = A4B45A83D6D2283D136A23D08735A7F7B938E65A4A5787B644E277E26F99ED41 H_OutputB = 25CE842847D5DC940E79F85E02BA6C893E3546D80BF71262FA24590D72DBF960 SharedKey = 525AAFF58B9ECEE61DD91DDE84A5D5E5D4E94776E328C489ECFF18D9325F92AA DRBG_SeedA = 50F6FAE7F94BC90FB8EBC7B4C0841AFF264FDB10BFD1A47BCA44F5DE082EF2CF06895C159FA8D8C96EB6FE0B0114E201B92F4383CAB121D826AE37791E8F17FD H_OutputA = DC404C3115FA86821E624D4EF6DE62D977A4047F242207D9A78CF30C7B20E8EB DRBG_SeedB = CAC5DB627BA5784105AE303144FB8D1F3AABCBBF818EF55E09DA91639F0F4CE5 H_OutputB = EC1E7339BFD586AB61F3C6E3854C60931EB00064A62328CE2C9C282C3702D6A0 SharedKey = 803A3F221616FECB9F432254864A49587271FA3E7B4699802D9E7C987A35C851 DRBG_SeedA = 1713DFEFD8BC5B1B42E461782977CA45072384E678082B1F9C2EFD9154A4EE3E42ED689029CD5E0DE0E6F5E3BB3351A5CFC8DF9203C67813EFF705BAC3B32033 H_OutputA = 5049B4DF9D339D7FB0C493141E43FDEB7B1CE64F35B0736A0B4B17069A1FF702 DRBG_SeedB = 3BE032644CEDC2A6DB57F36F8A482E37743DD0B27CE07422F84AD85DBF828546 H_OutputB = ADE3EFA7BBF4C624DCBCB54A36DC2229B2E9B11C759A5F8DEA21166F622DA3D9 SharedKey = 00E3F043ABF99A0BED8C882896D34CEA91E4B830D2216FA903376A388B85E7DF DRBG_SeedA = B47A09AEAEFBF8B98BD3D2879608F11BD7D9B40DEC5162CFCD014CB3C7539517CA8D160A1E35C3906EF0ABCADF9CFBB0EAC312C6933BE3985D1CAB5293C1897E H_OutputA = C66B3535D6D9C83045F0B60513920236C5DE3CA86C6A00AEE4017EC37B742380 DRBG_SeedB = E397E17405BBD32B77E57591EA018EBF6136CB12703772EE7B6DB813D1B99A01 H_OutputB = A5EF90AD7BBFAC13C9A85D7FE3FAFAC7C4C1CBA9A9E40977F6C4057A1093408A SharedKey = 8964C2E1B0659F59FB15F6A31C8E6E84B8A3A8B7D25DD9ED53945800EE1D9F4D DRBG_SeedA = 14CC69A80913DC32776968BA2ABCA40F16B610520199BB43416C83B0D05A6C8BB630F966A2B74F664D1DD6E1CC01BA25C4C6C328C0872CA9E0AFF9A4CBAAB05B H_OutputA = DE2A7EC28D256375F08C759BFF20A919924656664B9649DE9C7E92DD5D8D2756 DRBG_SeedB = FD1A53BC2B0A57EC58FC9F303394844BCFF9B4B64D4FE9B934B0E99FA7ECE633 H_OutputB = 36B7C5760AD81C2035EF9D4A35ABEDBAFB1EC55A26B5F175D618805B4403313B SharedKey = FF3A52C9457277E35606374FC1C6D6D8B58EC5CB15EA7FEFBA9C85B11C996903 DRBG_SeedA = EE6525579DB3062FC0D3E71F79D9F6FCE7C4BB654557B57E4AC6AF5EF27C044C19B3A20A06C256625DDB888F45A3B9895EE2BB0C4D9B08AD99BD2B59E9440242 H_OutputA = 1265F37A949CCE754E12282B9CC53785C372BD3C98280822CF41263EFA2784E9 DRBG_SeedB = D61C72F9B331883DDDAA3F97BBB0FF4F94C55727C719A6E5AC6608B313BB9B1E H_OutputB = 9D45A7BFFB420BFEB49538BADDDC6B8CB9E21CA13EFC25C044D1229AAC1A4EE8 SharedKey = 217DD40B736174F8A7F3C6195810E4CAAF3A158D896C8D82CA69FDA625586773 DRBG_SeedA = A58A8F5FD672A97B4D65BBE3F52A1FEB8474CE95FB1E676529889243842022741C8AAFDB4097C65459D5CC1D7C1F3F74553DCD3FC11387678248FA5B89911B46 H_OutputA = 2F4EC87BF2C82ACEFE05A695A16740B5237BC917EC9E13A68AF5F542552C592A DRBG_SeedB = 241482793531046C9C927F270251F0FA0DB8A6FD9E4B0B5B8C262770501D813E H_OutputB = 2F42BF1DC1AC11728946E3C6A9FC848B6858529933562B90DE94C4BFF2EBCA7D SharedKey = 5AE2BAFE751F12CAE4FE601CAA0D9EC92A7CFE97A86B87900F940897A205DC80 DRBG_SeedA = A18E47E85C1F5050B390EA0F9EA0279B8DC1789BE0332ECBB1446A321F5E8EB9220F2D34A73B25402A354DDAA1C205E98D3C3BD34B594D81955570E8320E69AD H_OutputA = 0849352ED670C88FB21883A667255D40965555C03E599AEE89D7E38C3F93F6FD DRBG_SeedB = DAF83DA188510D2B2F62B4E670A1B94AC188E6DFF3A25D15410FAB3035CCB3E4 H_OutputB = A24104A9861A6005D4D27F703A22002DE156242F43C6B107190B805A2E317107 SharedKey = D89EA0BFC94D56125C75E06865CD386800B9DD1A1246A6D9D82C2C9514736E2A DRBG_SeedA = 1DA507AA065457D21436F401D15A4F4B305924175421360CD53986B73ADD94DB593A3AFD62BFD225C9734F13D869468B478B984E46D5905D2B3217868452328D H_OutputA = CE0BA2F9CF22A1A290B437665A6D63D3E3CC078B182D5BE0029F094047A686FC DRBG_SeedB = 501C1EBFBA822AF25DECEA304F30EDBD983E66885F00E14E5B1E61B03AE5EAF4 H_OutputB = DA35FBC8DA387D3DBF8496540657DE88F2D98C2A2906621E825C4557494F3D94 SharedKey = 34A27AE38DE6532C155DB72937F3619850F26574D28AC7A0EE2406510BAE2A7B DRBG_SeedA = 0D9B23A25A3C575790C10E78092482C06911005B068659724DA15A057E284C264674BF8662D742CD239714F8688A87C5A8EF15AEF4C9CDF710719D3031FD22FB H_OutputA = 55E7B17B376A8386FDA95879E5FBDC9045BEF70483DDC3BAB5A91FBBF2F0DAAF DRBG_SeedB = 02DA6BEAEBB80F740F935329D3FF01F1FEBB799903FBB772AEF4547630B1709A H_OutputB = 5C9243B6B67383C5739798AC385EF0B78B6AE571B4B0515BFFAE4474498758B1 SharedKey = 4DFE6668F74A66968D8649E53BF519B81097FD76A6A2DB5C8E0B0087DBF7D048 DRBG_SeedA = 5B13E1A47DF6A7A96ED60A46390FC7D3BD5A65C160DCDC15DE12D7490A6746D16641DA8C1F211A9921D26AA0485BDCE60FC831890BD3FA5EC4B9D4CC1BF3C7C0 H_OutputA = 80AB12C0B14848D0FD751270A9AF4B3567775ADEE12ACBC2A7B15873699A1609 DRBG_SeedB = EA547A176A57D40D3C57A3D219CE276EC1A69F12DF7B3541A9308B3A17A1B66F H_OutputB = 381413823DEB96B402C834BFACB1F7C159B0BA0D1BBC0C7E71E0237E3B0F3E42 SharedKey = E851C8733BED0C113D018B1B1B6A76C0CCFEFB956AE1D29531B2CC33DE4C914B DRBG_SeedA = 90E96E3FE492FF8D908EA4008DBBA6F6217CCE3E0E7CC839AF34BB3BF6E6E0F6B871DE7F4B00095F0188AF8EEE7CE0D7FBC897E3BFE67BD014BC0A046DF7366D H_OutputA = E5952A292E0FE3D736A86A4DB58D94A3631BF129ADBEDEA57F5D586F041945DB DRBG_SeedB = 38A17B2025B8813934415DD414D71B9D4F11A5B63C71A085A44DFEBDC448BFDE H_OutputB = 8E9909465B9FA099432791368F121E5A11323789AEC8FE16E31E863AC2E6D995 SharedKey = BE6CE32F975DC6B3F0301BDF0998E98659193A2757ABC441E555CA618DCCAB28 DRBG_SeedA = 47A9A52C3B7DC60B4FA11CA89D58A817A3307EDFA38596B627ED663E1675EE8736F102A2CDE55E12D406C55D95C09443E6D80C0D1B76BD7072FDB149077BC20B H_OutputA = 078C999B7CB9FC3656831AEB3BD5EB41A97CB16A934F8C40880E0A177EC0DF6F DRBG_SeedB = C280A17C9253E64D1C1D0E191846907D7F02B734E76D798E5A3A38EDA93BDD99 H_OutputB = 865DF18C7237EF908E404F8F5954059E81831FC2C51E2EEF23E38C3C98233D8B SharedKey = 2CBAAFA2EED57763F6A2D6E88BBAAEFA342E545FBEF467D7F64310F59B532FE3 DRBG_SeedA = 6B363339762B58F555D3E9E3303B88AD7766E17C89F73269812D096B353A38C63A5292FEC3740B1F9C05F5FBE1E348614083AB13ABBE9044706E4C5888A4CC97 H_OutputA = 12179AA4DAB0FFC70B2EACEF283337645C2996E7CF959DF5D99A217BE4EE4E4E DRBG_SeedB = 554831A011BDCDD3003DB1C435E327BA8BF4196609D8DB0D9AA317F10245001A H_OutputB = B931B6D876DF1315A33022FFD7A7C107438CB2EBB2836C264595E4D7870ECE92 SharedKey = 453BFA41C31EB0BB725567B5B2931421B9690CA3C6B923194F23FB555E717673 DRBG_SeedA = F833B65686E6FEA81C1FA5BF83E852C5C46551C0355C26846BACCB30C4909D0759C25BCC4AFDCF34010646A12D43011387C04505904AF880790A31500CAD5A0D H_OutputA = E7A833E34A7C3ECB04069C04CE91F38556BA2BAF5713A93A577BDD8A7C9A2E46 DRBG_SeedB = 657F08F4FEC43B5D06E11B88DFC1B75136E6850698C895F278D0A28D0653EF3C H_OutputB = 55AD341031B604EDA94F44832575B9C3442948BE16050DB549BD2D6874586854 SharedKey = 394A6303F1F87D2971D2A6DE3CB936C673F01E996AED0A57A1559E14FB768C0C DRBG_SeedA = 8443B8BAE6921E63611C8F304EB4B47243413664A724BFBE33BBBEC6D1263970A0249DCF3AA7739E301A1E568FA31D5E9C8910A9BC53FFCDC44707817BFFA871 H_OutputA = 9B08C086348BCBF5600C46A525882E91352EF37F5D5466396661F2A09D79C7B1 DRBG_SeedB = BD2A17BE1BFC0F0787C58650E23729D8DDB50241AE9EAF097CEDAC88985A2B4C H_OutputB = 8BDF29DE097663A6CF01304FAE8AAEAD20D9B1EA92F10517107E85729AC2A862 SharedKey = 65A44E6A6E33414A79317BED746C21801FB6B2BD635BDD45E15C8A52673F09B4 DRBG_SeedA = 1C902246674CCD613C25D997BB6090366D0D6CA195243F9CB8A40610D326B2B10F60C98758B86144E612107CF454330FD83BD0C4B6586C264952192E93147739 H_OutputA = 8E27C98DEEBF7AE036E4BEAC79E6B8C5CDB36AC202C313249A90223992F88562 DRBG_SeedB = 931B1F3D6448540C787F2A90E4D05AECA4974F92B63239BF4220429AE1BD2196 H_OutputB = 6AD9C9F6F2FE19916F10A48CDD63A3DA11CCD76A3BBD31DCC91A7447C9017954 SharedKey = 2D90D02746CDC23C5882A7DD3BF1B54EEE01112E1E5F89D5C0DBA1B1B9C6FCA2 DRBG_SeedA = AB0503D9C86C3A82BC14175BFD27A6AAE0860509C566BA536570BA241D13A5B1EF6362F71B11326513AFB5F380C678F843E9E4246153E937D6D74B91546FB689 H_OutputA = 2997AFE8124FDC9959B59165AF0AB15702D47D307693047C43F232256CF3197D DRBG_SeedB = 267863A44131505000EF95769428A3E7073B33D9BDC8B9A4652DF1AB5B1EF6B7 H_OutputB = D0200C774574B5FD8578D3174B4A21D8634BE44AF45713A7F4DE093E667632D5 SharedKey = 8BC80830843966AB9E34B2CC077875569A8820E010FDA97E37BF2689BCAA4E90 DRBG_SeedA = 70A888B222922BDD1A9CE62CBF8EFE2DAABF95DE930117971511D832881E24AE60C34A1F1A5B930B1922816DD76EC11B92178C80FF1F034E44A2C463338D367F H_OutputA = F812EB0C7FF4338DC3DDF37BB5A9BEFAF5CCC6987E31E9A84239C7485BF0DA73 DRBG_SeedB = 52F2E61C7435065BBC22364C3F4A28EEFF215631F852ADCB2507C89ADCAC636C H_OutputB = 482C76EE6381C69F90708A5B56362DFCA0DBCA313B36854683FCE5BF7CDD6278 SharedKey = DAD8D867FCBA85AC01AD8961A6A00063C19F5FD49B89F1217A803EAA020225E9 DRBG_SeedA = 5731D98E53F2266A28586097A8A3F15D3D9BDF8BAB20846FDEA4B272E6E307E3679D362B0EB5675F78AC8968CC6BD559317F15EACF3656B8F2117B30C9A9877A H_OutputA = 3CD3C44FC11F0A77B0DDD9986B1CB1E61C685B909ED4AB3AD3F0C23A1CE9DA45 DRBG_SeedB = 232BB0606F7E29C9FE63844E32AEFC48D5EBC9CE85F35E8CFF6E57255A18554E H_OutputB = 0675E5CFFDBD50BF5B4489CEBDA7A5A41866ABFE9E2630ED0E7B47C6B4ED6BCE SharedKey = C177DED4067BA51D91359BBDC09738CE5489806B8864F05A1685FB83CE30D7DC DRBG_SeedA = 5D15FF099435E2BD14B09640382E9DF781C0257067DDC283705508DFB59C40B2ED6A18C10B7C9E5B9801932B1F0CE11A502AC9E7DC0AE4AD182D6A2FB8E29D88 H_OutputA = B899B7BB7B156C3608F528FE94B24E9B45119BBCC1D4F251D2E52AAA45CBE569 DRBG_SeedB = 22E363397265BD869E57009966A918D6D2BB582E900A4D5D49FAD68333967EE9 H_OutputB = 914548EEAF22D055039F670F8C5E7C870BF9D88B8B38C1C721B4E372CDCB9F8D SharedKey = FA16B39E1DF174A7563C2B941E874BA8661D707B5E53642511EA0D87FA69F753 DRBG_SeedA = CCF8C638A726720E88004A547613705C472CC5C4D91F4CBF0DA7335FC83981DBC7B737F5FDC0E1133AFECE8C5942F301C8D627FA904A09824B1BD7259B614F0A H_OutputA = AA7D2BEFEEE1AA2334922F0B1FDE2A632F096CD99D0B6ED74AE20062FC906ADC DRBG_SeedB = 44DE9D7A5E1D61B5F6E327D0919DA6287BB809306256E51F2F7B82A0D593BDF5 H_OutputB = 3F526CAA635A734843848B727FD4A1E19B0269270D02E17F11CC1C6ABAFCD537 SharedKey = A896F0C6BC2A6F2CAB312707182741040D36BB3CC2D91041CBFA2FE538D90202 DRBG_SeedA = 935B91AAB53253DD1B79DD86D7EC8E5B425E020A92619DBC483D2737F676DC3761D07CD70C858F3062ADA0866ED913B889BB2ECA7AF51BE918776790FA650D3F H_OutputA = 02551FDD7CB69E9E7DAAE9E3656432C0ED2751B44E104B4FE591864577023530 DRBG_SeedB = AE953146E36B9E285CC56661A3834C75E3AB6AE85AE391C267275DE6525DEDD8 H_OutputB = DBD60DF2A0706A8B3E23467C948DF6883EC458ED545F7CAB2829B7F6961F023F SharedKey = 7781A984E22BC16580AA3681A7FAA8011642DA149F76AE82A123CC4AB47C7DCB DRBG_SeedA = 7A69C1C15A4490C581ED37E38B079CF74D42FFD7835FAE36F69C084911B82D3F9ACC21D00C5DADCCAFA0C7610CB54B9A4723F21FFC27F08EC791791936F86EA5 H_OutputA = D47B36AC23369CC436298753A3663ABFB6255DF89B3FDF46D57A6CA03BACA20E DRBG_SeedB = E5242CA847505BC2280B4BD5D5C427AADFEB54611AE66D9C2AC69FEC916A0C6D H_OutputB = E14302BE6EA3ECEBEEFC594B251BCFCD87516DF656456F3A7F8E169904AE4E44 SharedKey = 55CB66E1F17A08352E21AC7584AC9CCDC0DE230EC11B1698530AE4068EB8C557 DRBG_SeedA = 7CFDC4F26FAF5A010DA8D9B70AFAC6B12243284B34A1F2431E69143C0204612045775AB09F04CD1A96BF119176A002497EDB2AE93D7CD97A7E89CF79601266AA H_OutputA = BBADB7C928790A9E9E45F6A2E557BB9907C1A67381F5DE9D7E3FA412B2104940 DRBG_SeedB = D67F0D4A2F85F20A2B3E3F86FE2AAA1C9A245E8A93657A7871EF5BC94C423ED5 H_OutputB = 9954836C1847B6EED8DF2F7FA166DB24F264C4D432491CC30CDF00C68BA37226 SharedKey = 519F9322421D664537D55E532707D898E7EE39D4972B3EB9E5645D96FF1C2191 DRBG_SeedA = 23A3F9B69886705F67736A6315D18D8BD79234B52689BF1B0E60365DBBA311668D51AFF359B1AD3C23BEE683B62D74A954372E2F2EC82EF8BE278AC14E30E750 H_OutputA = F29F080AE9F8DFA0FCF587D73F3A03665CAC2A23AD8F9CCED3D1D3043B7AEF1D DRBG_SeedB = 1FFC4D2092C5D2AAA9EB4BCB5C337DA561860B03F1945D12722BD43CB1FBCB4F H_OutputB = 9EB80D8393BB669E1F6ABC269003D0D58668B67086467BD93B3321D470976053 SharedKey = F2F94034BCA15B40F5DFD48B3A232528C9A33376BE0CAC4FB3258889B005656F DRBG_SeedA = EFE5A9A20197E3A6F6D6B0CE40E188C394821756821004859F0D6C7D2D773FFB619AC4EDD7384DB994EE064CB8CAFC1107745F16DFB46A971C741EE8424E343F H_OutputA = 571BEE127C68C13B7D0D782B9668F51D85EB5030FE22CCBAEE3F28C734BC2121 DRBG_SeedB = 266CA119262072F6B200CACEFC9C6DC3427CAFD520AC78417BB3871FC3F477C7 H_OutputB = 82C25F4C43AEA12D45C25B4A7296161C730170BB19982C3F6740193C7050545B SharedKey = CCDC80555D62FF3CFA4B0746263BD2255643AC870DD5A56D0BD7E8A000C931BE DRBG_SeedA = 9C79EB27FBF9DD25A21A755A446FA4491D0204AB6D039049E630C45E72421DB85E6D8DAD3A5F0D017B816061131EE927E7B36A096FFCDF4D9050DF04BD9B9F6D H_OutputA = BACBC55AA9FC96DA798C64ABADCA8018E42C4CD5AECEBA20951B436C13AD4815 DRBG_SeedB = 039DD287F70F278C6A9771A7BB2AE9A47CE0E9F2452EB666D988627882F9FC32 H_OutputB = 691556DB01E8BF757102F852E7EE862A5E41F6F4B75BB6A09DC414F97AA62DED SharedKey = 4E7EED012A849985E2617C41A3D9175CBE071E09034662263B2BDEEBA5D00DA9 DRBG_SeedA = FCEBCA2E16C5EC9D6FC7410F29C905C6700105CE9E0880053ED85BAD478861AAF4F8E9D4D816D8979DB36501D06D249F382A923487E21B36A138A5A7327C7A75 H_OutputA = EF92777A3E2D4885384E6CC6BF23EABB0F205A4D1AA4D0AE5FC8571F71890B9B DRBG_SeedB = F9774F201732F78933A9BCC02A7EBE4F33AB42E161808849245F84697DE51D0D H_OutputB = BB4CC7DB99CFA4C56587D57B47625E8AE0B61D1058B164296ECA72825C323CC8 SharedKey = 67CBC981B67DCB3B47B3CE668A8A32D14A851588FBED521701AC4CFB04FC832C DRBG_SeedA = 4B94A4D09DC39C90A30953678063FD60BE41270983DC5CDF7C11D11460B89D2AE454F0880CD4D0F6D292DC3015E0DAD06FA4AC5D236D686A172AA49C9DCEA2E2 H_OutputA = 88FD0E3A46CE2F2990067BD439D6B5ADDCF51B3C1B10833B26A9F37BDC659F07 DRBG_SeedB = 9780A9C1B0665D821D8FF1F09D6ECF3FD3D37E5E9804D8FB092679C85FC1E5C6 H_OutputB = B20347DE2206551CEB5C6196D1913131B207AAC5E9BF4E523FACACBD15CEFAFB SharedKey = 4F9731470F7802246D5488B4E211299BF74BC379F1C5A9E7A2795206E2ADE802 DRBG_SeedA = 02E47DD39CE359F84A4B1C90050E5A4783A8F4C00FB34E3C79C7D4242C97F973E02D4664F5D4ACADBA4E074A922D69376673AF440C27A57FD0272FC180334DF6 H_OutputA = 8458828E58E5E8DE57540A913832E77F9E9F885BB563C9B2A40573E2061E78DC DRBG_SeedB = 373EA2F7581189FFD21FA4940E1A39786BB51DA8AA2B0D452E4965F66EBE9F56 H_OutputB = 5699531CE23FA525782ACC7BB7E82C0690D23E2F24B8328CC02A93B4661C2ECA SharedKey = 20F294468719F268C315FB6641FD22EE3CAA7C404AFEBF3FD089483A3AAA224F DRBG_SeedA = 10C8C56BFFA889D3CED616B471B266DB676294E18A314A6103141087396872F63F463CB3F852E14D2936FE315E70D710BFD51B6061FABA77A81DA80AE4691C01 H_OutputA = B0EDFB95775EC7BFA68C778CA1294C480E6A66E3B8FDD3BB68C45AFA10532B91 DRBG_SeedB = D62B51C9FB1E91BECF4D5403698B12CC260C70D8BC9EDB36325AE8D3746F100D H_OutputB = 6E01D1BC7AF23FA8A35797A775C104D0773441452C59584BEB9D4B5FFA8C97D6 SharedKey = C5E20AED6E907CDCC2296EDAEA7F9F60F38D257BFA3657AC4AD3C6B125D820E7 DRBG_SeedA = A1081371E46D767AB32C9408F8DCF97A57A07C8F276DA8931D96FF008C258B4667D04C6C3EF175B2EA02C87A992D69B8557A82D13F3A656D0D3DBCDE8D53FEF1 H_OutputA = 956DD2E2D11C049EBBBB9852EA324ED3F5A8710D9D2CF385D3112A9961DFCD2F DRBG_SeedB = 0C2FB7429BE6F94A550BE0F42EDB75EA7F3C874C660103DA7DCD66B251DDB150 H_OutputB = 2452D6D23995693D289A1FA55ECD2AA58451B46E3F7A97F04807426DC8545DEB SharedKey = C232105A5F38FD62482713F5369DB52196A8BB4C816080866D878FE08E61106D DRBG_SeedA = 3D11D427021B58F3CFA6B3F132EBCD15521B75975DEEC55117D5E9BFB31B819AC1EB5694F5419D342DE48FBF4D17872E4B7880A31746F5704064B57AE7D82D1C H_OutputA = A3F5BAC439D6D63EA20928861AD7B9DD05BA71B65DEBE60A4F2DA5C46D88CC7E DRBG_SeedB = EB44C596B6F017C66CCB854B24625E3DB28F766787B3F8E2908061E36354AC7F H_OutputB = 6B3904819EB16510752AA38C2C13501DB5A5CD9BBCD3A2B1503F4ACD3E0168E0 SharedKey = FC25E24E3AEF040926EEEE6DAC839C5F1564454C31C1FB1466242BCF879C251F DRBG_SeedA = 6FCD70154BE0C269A9BB13D1A25F4CF0337F79FC5F051FC9E23BFD793F2B9C8B81359627FC99C564C7E61A36D1CF213003A659E162060DB272541537DF90D9D0 H_OutputA = F8B44BA6EF2C4D4FBDA8A44EC4894AE31E38F756EC71884EF37ECB4F367E858D DRBG_SeedB = A382E155AF8149F8DA04702643CD1F878C40829A1057B36E9971B0E15407CB5C H_OutputB = 8890FC37C5892D7206E1F52F70829EBF0FB76EC40389231C59861F98E15D81E2 SharedKey = 3EBF5C25181BF84D087F3CAC574E3C4A6C4F2B1E6186D2E2E0E96C73D689E668 DRBG_SeedA = 8D7E8619DCECCC9137830B1C5A913BEEA60E9843260E96447B1EA46E3C806FB389902B424F21867A7C95D61A42290A925B4A73249EEE739619628441BF446FB2 H_OutputA = AD2F3A5144A154DA42C647933A14AD91712AD788D11B9D4A1A0EA51AE628DEF6 DRBG_SeedB = B49C05ED423C09279DBF618A1733BBBBF63152E24EE2EA47C9B42BD24C4285A0 H_OutputB = 0C4E142B1E692E25FFB1E522D45DD5BCC47876BABEF77AFF75FCC1BB66CE46A7 SharedKey = 51A2A74C6F52F7CDFFD8DF2D570F1E1FCA7EAEFBAB7D0E4E36261E7EFD3A3E45 DRBG_SeedA = A317AF79F55B9841C6584838BDE3D07ACFA083BE9CD163C3D0407C9EA86B0BFD416594D8D28EBDE22671A7BFA9357B452696EB812E2DC1A08C5608D58D188BB6 H_OutputA = 58DB2BD32A75B70B412AB55847389BD8BB4E7D11F50F90BAD51C6522A2ED5B43 DRBG_SeedB = 638E44BD2C8841578F706C81E90F39893AD8EF702D4D7837A8BB4F35ED5C8367 H_OutputB = C86ACFF320A1CB75FB60AF44745E6B67CBBA41B2662186A6BC6E58A295FA8FCB SharedKey = 55378D5BF6F834D359C07AA7500D4F57B2E1344872D390CF81EE0D55CCABBD7F DRBG_SeedA = B4DC0704D243BD4122C3FC657642B89B9F629198420E5E431382D7585B67D2C1F8AFB6737618F1DFC0724CE5B5A2FC4080D67E05CE21A6BFB85027C91B0A40D7 H_OutputA = 3260350229A03EA92350037FA4AAB6B8AF10903C4FC0D5BEA0704A09E1B825B0 DRBG_SeedB = C631DAC70236A7A33776332F3FE4279FE322D582DA461FDC75D43097B482FD60 H_OutputB = 5F2586A998C85E7A022C016D97A47C81BF7C59D0E512CE40E0454D07AC74A728 SharedKey = 90A24F45E140C7197A3155B62F5709ED0DECEC5774037F48606A1F881FF76B27 DRBG_SeedA = CBC86F9934A7BB510A4A8EE5DE61298BAB6CE683364C9CE1B36BD70F871238432E2692CD10977C883BA406DAA7208C5AAAF0B5F9896871EC9EDEB00756C45406 H_OutputA = 427ABFD8A50F041C50C000F8ECA4D76DFA4CB8259E3CBDC82C1508AD337E007B DRBG_SeedB = 1D050B0E45418A59407BDF2F5A2B10F08FEBCA747411D72A5A13AD9B7425CF51 H_OutputB = FF90285C806BA38493D3A8D64201E41A1A5C44871989982ADEC6579B72F06790 SharedKey = DECD2DE60275AF9214E20D0556D9A748A51631928E1A5AA8A58E901E09C9B62E DRBG_SeedA = C5273C3786A18927DFDFE2DD5A902D4BB7EAE8169382B8170D535B7776074267490DAABDA04F58FE20E2B2FC3D9AF1717DB96C740486F6CF6F2FEADEA2FC8E4E H_OutputA = F004A1CCBEA80114775978676971A58B918A5B314FE79327A2B3D8DBFD390D86 DRBG_SeedB = 58A330185C73E68E10BD4B3C43A4F1E0B5272E21232D8E6A9BBBED263712763B H_OutputB = 70EDA508442367B1A4AB1329F3FDE039788EE46D029A4072C5D8A241F31AAF89 SharedKey = DE4C9A016E099ED6D3E9AA4A680F4FAB6BE077F824D998EA7A762E4B098E6019 DRBG_SeedA = E7E98A263C9F01A5DBFA66273DC04148DB16EEC1D501690D7988C207F4390A1ED85A6A79827649F60E6B4EFD4CA28D0F0DA03043F45D8A8A59A4B1D0DA846D00 H_OutputA = 8A8B74E3337D531DD93E7780BD9AA304A6C066543494A9CFB236F3BDD630CBE8 DRBG_SeedB = 197FF4AE67F21F8122813B6968A3292B0994A86B8ADDC4668F99E773E8121B3E H_OutputB = 42263B79B47C4E9A32878CE577FFF163F5847CF7FA47CDF83E8F3D751DEEE06D SharedKey = C1483E7ECCB308AF4494578571F94654A2241F190F20FBEB12C63A9297364B5E DRBG_SeedA = 8AFE7417FCF3DCDD69D8777AC3D22EAD995A829E25838496002F0CA115C052E0D292C53B047AF76529A50B30F1E26420BBDE1501CF7BF10072F9F3722F3BCCDF H_OutputA = 9DCE7EE35054C1455FDC2AF05F3DF3B25D0F37B1B373D450354F31801EC79F30 DRBG_SeedB = 40D74BBBC585A32817223E348FBF42D73FD060EE5F25C6768EF3777D9072DF69 H_OutputB = 73DC97D3DDBB41F3387F80CFFECCB4AAF6621CB934716F3B968CB467F9FD512D SharedKey = 35A491815C242DF132CC0DC78EDB05EB4982A03741FC37B1F233F47FE13CCFE6 DRBG_SeedA = AD7A5072A07D6205D3DCDFB0ED9683F5A98E9426E91710C74B76D8ADE0BD709ED494908F6489D90C01F3691D1052E4FEB8E234F6686C5BF5AE2D9242EC0F5B0C H_OutputA = B72432133EE97945F2AFB25BFAF67BD859765205D8E5E072EB837A99200A4080 DRBG_SeedB = C3A959BADF9F90546AF2F32EA0F3E6A3855C89669860DE35099985DF4A994F77 H_OutputB = D922358F878423F65ED6DC426E0004F1F4CE498A8F2F116D64A425158B08A1F3 SharedKey = 35C22BE378F931AA7C301BE24E443CD4EDC058D6E7B7C4031F347C7D8CC88399 DRBG_SeedA = A4CF7CB570EF42A0E5DA3E8FDA171F121DB716A3DF8875266831001739890D00117A96F93D6B1741CDE3944360E65A2959D8BAE991304564F47E136766A46382 H_OutputA = C9F31C1A0B52D2C2200BED05E817F68709A58EA8188185C93A628CB2DAC5A5B9 DRBG_SeedB = 45D14DCB89E98D2708661907028325BA4528598696B09FB73B3A4A9BE63E93E4 H_OutputB = B122F0D2644C0223001194BE1E55706C7F1E04A086F35A5D9420A713414C6750 SharedKey = 26AC51520DAD66176763F1D03810E8F6B8695B6009B5BAF1A1E45A8546B9A6FD DRBG_SeedA = B95623A3D666BC82B1A3B8DF064C2AFEFF9C6D6D39DDBF6014ED06A671A8B3F81E120EF99FCD13D9A316B944E4BEB701A03921294947349F8599831366ACFA70 H_OutputA = 417E7662CC10FB79947AA5817636E48A8A5B45BC33E4D47220AE7719553B0FC9 DRBG_SeedB = BCBC06C593C8B99CF93759FBFC5A4EE7A552738FE50FE126F287A76AA6B2E5EA H_OutputB = C415A0AC8DC3AE69320E085C32E460407F9D67F3CE2658C27DFA98244B9BD10D SharedKey = 10D7EB958A4A20317EB7B07803D025576441BDB233A59BECD43C593907CFEC0C DRBG_SeedA = 57E23294E8B8934035B066EB4B1E786BE27040AFAF11B909722FCBBF69212180872A9BD3E58C858F5A0E8B36037356004E7217AFCE748D50BB31D435FE5554E7 H_OutputA = BF4766E43924CC1048DFA744DB2EEE7A064E930CB7EA4AC38920680ECD392343 DRBG_SeedB = 93CC0AC8086E9D997AA91DBE5E380E562BEDC5765637DA8BB19024035BFD73CF H_OutputB = 10E3A56624FB1B86B73FF31C9992B0351A5476B6FFB92B79B4C5813F6A95B379 SharedKey = 68C5DAE338040076D7E4DAB787B51718DE6D1AEAA96666C6DFDEAC7584CB6474 DRBG_SeedA = 9BE6C0E2EDFB0F019751D3ED22D008590FDC3B8A09444308158D078EBD66A4DEAA605F03522836A5CFC89662F188BE46DD37925F38A5DE4994382E0C6F27FDA5 H_OutputA = 39DEAC91B2A0B0F869751514507B8DA50C0304790CD9575A4373227F9171CCDD DRBG_SeedB = C4067F8CDCD82B460536B2A8177771E87534AA1DF97243E9C8FDC94F4C3DD587 H_OutputB = 1ADC861B4CB53258AC17E3D4BB73E0F40D4DEED81B743456ED376EBCE91C9F72 SharedKey = 96D28D18D12EF630ABECA81E1E3CF6F2217A31B8155FF2A9C100A1B04562CE22 DRBG_SeedA = 2B903D7F637D27E5FF70E0CF0079741AAD9A785D1E67B749ED8B48ABADFA73512808DC5D75443514B967F25C7071284983D61D109D991CCB6690EA1A20754382 H_OutputA = D0D4AC57E049C4EFFBD94073CC6353812BDCC2D743E6126A305D58EADB9A3676 DRBG_SeedB = 8B3008384A127924B24CD96BC45A3BF3F4EF52F353F2DB6EEEEE560304C70759 H_OutputB = 02945A51C642CF1F6148C05A1992323D5661A66650BF5D1529C1190798DE29B4 SharedKey = 9B16CAF15A36CB1284B368708E5376E1204EFBEFB907D0D50AB935796F22B4CD DRBG_SeedA = F033757F8129EE4CDF59330C152FC09B4D70B38D7D152CDBE03F260C768BEA28C0812FCA8113F55392ECF5A879D12A84D2B4F4D0398BC18837DC2887A55317DA H_OutputA = D3836F0B19576FA54316116DAEE72F444074E4C5DFC061BAE823A7AF2C3D406B DRBG_SeedB = 2ECE8AC539D26BC5808AA9181630304C2277EB8DA9EBA0300561BBD6DCB26C1A H_OutputB = 4C806EFAC86FF43E09B0619B562690DBF9166F71D10474E9EDEB477B6E030F6A SharedKey = A23FF6FE63C730841F3B1D0AC624DEB976DEE7C40DCDAECFE3D581B6D86A2397 DRBG_SeedA = DF73A716CD27CF06DF753CE6C65912B9AEBA9DAB876CF5A42BC709E073501CB7FC9001E374F2F3D3429AC499859CAE27BD0CC75C326492C73528A6C88C76FE20 H_OutputA = BB6B4F062C36D91BA55D22054F6FF0F4BB1DE9053092D2964FE9F212395E5051 DRBG_SeedB = 6A4F77268F63C7800F63B878FF1C31EBBE60B40149244684E04273F33CA21C01 H_OutputB = 319CD696B10AB00DA745CEDB0FB11C94205C7BB4DCDA68D9A6250AA912B70C55 SharedKey = 6EFE86841534C7E6AE995517633AFE0A283236936C58EF9268A5D5F9546F9961 DRBG_SeedA = D77379637DC7AD86FD5952F7C4BE6827AD735B39E18A30F0EC765BDC7D570C60569B8290DCF66C08C3DD24A79048C4E386AE74187AF83EEB4C2C26AFF9C9E5A3 H_OutputA = 69A6C5C48341F8F970BC29B5919CF18E1108293E8791CCBB862270715AE6EA84 DRBG_SeedB = 5CCC037F1E45D378949A7FB12D1E56BE3D4483075D965EF982B106D2AF3379AF H_OutputB = 822796B07007A0A6AE2454ADDDAED78412BB5D8B6668256E4ADADB286DD5CAC3 SharedKey = 841F0006B71DCD811F2FF5EF8847185FD616029D0B080C84E6037A14F12BDEBF DRBG_SeedA = 02E2120B0DC677334FB569BE7E18986B2CFD3C759C3ED6E1549E245548C7CBB22561E2A88FB7C4E11CF566B5EF7B463490E013B6AC4470A5F303A17BBC540E5D H_OutputA = D20DD57769B94E129C6AEF5CBECC1A09FCE7437B44D6640C1C875E652B0823EF DRBG_SeedB = 2C73951B3A9D64A1FC8385FA59758517149874C4D85F83556698DBB57BACED51 H_OutputB = 0BD26E36466C08E987B892BE225EC0FE08BBC34CE79ABB850AEDAB9CB47B9A73 SharedKey = 9DA59F4B7393DDEC09F3A7BBE71E7F9EEC6A840ABD37FDAE98BC927425AC5069 DRBG_SeedA = 50FB6F3922B28184D33D93239D00F9835DFE1D7DFE641D8FF8BFE806614C27DB57DDEBD1E43694881D094FDFB357558ED0917A46A157F9AEE0E8A11C781DBA20 H_OutputA = F0A4DA23FF98EDAE63F998287AEF06A8448AB406E8B3E309E8C165FCE490C691 DRBG_SeedB = 7529D3691E8C1791359650D1A95799436B4FA007F647C65F479CA7A00874EE74 H_OutputB = 3ACC6C855A648A65AABAF7439EAF3F4F303CC9D01E9C53F81F880FE8E04CE2E3 SharedKey = 9E90F908A900C7432B9D752B035385F5431B5364FB12DDDE0AA2B97A9762A0AB DRBG_SeedA = BDE87774B722393AB7E7E75EA8A582A7C3E0D5B5D7EE6E0CE27CA04128ADBA797A4981CE9AC596D57EE9317171822D062A3FC2B89BF3FF2E5E528ACFB54C84BD H_OutputA = 353037BD609464AB5AD72017A5C6356F7FD3EC361EA92D9DE1411D9C9ACD25C9 DRBG_SeedB = 7538A37B813256246EFF8F4881CEB2FA0AFC6E26BADEE436E6611D6DFFA60A0B H_OutputB = 334E882C716698865825174EE3C45D049F2F5D6BDB3004DB9EA2A0F0089E8F2F SharedKey = 96A2CE62273498ABE66305FF6732CA3E3AC9A65BA179AE21A6B2096A42056D01 DRBG_SeedA = 04D3C2DE6467259D7D927BC9D6E14168AB8D37DA9D6F9BF8463C6EC242FFF6A9FFF3306ABE535A5C2BFB689150B37F26A7CB4B816EBA9C8D8C3D12437AA3E16D H_OutputA = 8B3C71CFA42D66BF6BD20E307F1CD945E91566280DD8DF7CBBE87903921E7CB5 DRBG_SeedB = 478225EC2389A8F2EC741974A9A1DD1A204465F259821EC3D8F472A2B7E36536 H_OutputB = 8A6641A3A87587F1725FB356D31E99E2A36FD37B51560FE4B6931EEDA25212C2 SharedKey = 707EAA215925F1AD1E20747D0D449EA2E9F827B7B74DEE697F2752EFA384AC0B DRBG_SeedA = F8879DF7B3C45CF9355D5936163AA23EA02AA66016A7F5E43B2F9884D521B4B82B148C6A02D69506DDBC1F76A660CEB71298BABCCAD38F769AA0EB729C5DA325 H_OutputA = D70CD34262EBA5F5094886507E2ADE56AD2539D9CC103A286265374A718B85E1 DRBG_SeedB = 45D5DE9A626E6C0564D7981BC0800585D43B4CD0985E46E318D5D5E096AC4607 H_OutputB = 8EA9B4115ACE9BD8BF69403C54C1D8A48528029FBA11C1348B9FA8B22FAE0764 SharedKey = A1EA21DDDE0DAB8C18E4C8C70C7154B52FF37ED5970BD4617256C55B539481F0 DRBG_SeedA = 3EE9F03F94DF3425D1D840DA67C121ED0630DB1E93E0289F1B0317B0009F088820AFC1525635290EE0780D57F5EAE6A2DE2951A22DD153D0C901ED7801CFAC99 H_OutputA = 972BF80423D207936B44FD227BD6A642D60F122509337ED0472D47EFE7EBCC82 DRBG_SeedB = E2F3049DDF0735502F4EFE0B02D9C9FEF91A2325B5A2BE4027D73786359AEF8C H_OutputB = 93B31A621D18436BAC1A02BC2CBEAAAD676DCDB7D4C0F42D936682FD04E4D8A8 SharedKey = 67CF4BB44B0C566ABF1C325B754B9FA84AD0125A20BD38E64CC0D7B16016D3FF DRBG_SeedA = AB70DDC6A02703B86D58D12B13BC654C2EDCCC0E552A163410EB25651E975BEE71CC9A112CD4FD23709669A77029476B02A27F6C6D168DCBB594F1C77ECE34F2 H_OutputA = 33D101C4876A911B180848A9C1D2390486A68168454AE88D823DD31217C79EDB DRBG_SeedB = 395A793692033A8C407722E4759DAE2271F35DE44BDDB87CA44AF0083885D6A8 H_OutputB = D0A2B115FE5A364C1CE7D2496BB51EA90600ED1C5633EAA4895702E19B22BACE SharedKey = 1C68F5822DBDE3A4278C5F51837C3874E1E547F92AD3886BD0DDB32B7AFFF30A DRBG_SeedA = C48AE99B5028F1C0250ABD026887234F891866A493FE4F7302A06AD0BA3FF70E3F1FE26FF4E08BC660D4B767665819D2FB6E5D25DFBF89407061AC304FBA0C4D H_OutputA = 5F1EF027D7F742177037A2EB4DB7801251DD0DF6CCCB30A7712C166F27E86F09 DRBG_SeedB = D055BA279930F803B767BFAABD18C6F92A63714CC5CED409102962F443245945 H_OutputB = ECB904C17DC482AFC16C2B5A00C965891EC8C170956C0A025D1FDD3C15834E1A SharedKey = F4467DA7CB9956142BACA1A580120A078CFD6CC9D31B4B7259FC164513B5AC84 DRBG_SeedA = 9FBEDE90DBD8178145057A280BE919A26158A79B1A7B6532D140BC6DB5B8BC144CF406B52509F359C21733C309EA7116329C6ED3075C781899CA2964439092C8 H_OutputA = 261417B722506542D6A09385673A67C10A9C59D8AC8F197851AA4251EEB6EFD0 DRBG_SeedB = EA450D197F3B78BB01A0B2DED309D6A2C03068FDEBB490755D4EA2B3249D2058 H_OutputB = 7DE086929575C6091006B5605874FD9BF577E9E224A39989E6DEAD32F888F1D1 SharedKey = BF7662BFE1F45B28D7334F81D42035D2CD0758CE8F00BF45CDA1451BF6DDCBE3 DRBG_SeedA = 2D03D3E94EFA85F17D9C7101AE1B5D4E8755F8D3A01EB6107F57990BFA326A8F050E0EB1AAA5C95B5AFAF5C1B347D6CF155CD53A9E277DD832E14333F65FDB96 H_OutputA = CCEBD2A1B54F961FBEF500261FB2DEC47967C9FC8396AF48554D6BA188EABCAF DRBG_SeedB = 468BF012221F8650A488D97455C072CB01549D7CB9E77A68DC4779F763E2D2A9 H_OutputB = AC437E08E8C03AE9934F8B40DC68E5BB43AA50161C4F5464E95E12C7A30EECB3 SharedKey = 4186B80390E12D38A87A89F32A0B6FEC5D9D0CBF6A7A28E067C5D31BB207466F DRBG_SeedA = 161758E0742321FF5E3AC1D8C6CF63E5B95138D8C1D8DBC8108396B83388DB26F0B42413B49C5A40CF6E32FA1A1D517D0FEFD4FF55E6F7CBC9F5FB66A156B0FD H_OutputA = 8CD033528425BDCC41C735A8AC650A149139E8D28D234B1E0086461FCA0A0516 DRBG_SeedB = 87E555ED94071FD7C164ED1711F4BC67D3D268B6E6BC883CD1E0065F65328158 H_OutputB = C5DEBD2F02C46AFE6C5D1CB6A6A0871513D2884BE69A1BCBE956C5A17B8BD168 SharedKey = BE160E7C6D33E9CEF5135840EA646881701185A9E244031AFE44DDD1C9606A4A DRBG_SeedA = B68B64503EFB90A2538162967EA71F50AAC96C10CB3637D62A7CDDDBFA336D5BBB421FD3E6389982F39CD877C690C18D50D9D1047B104BB4A53D766007A0D162 H_OutputA = 443FBE7B73D2DD9E8020ED9D7B7463EDAE4C4F83FC16647672D13662554916B8 DRBG_SeedB = 551FCB31AFF1106EC5CECE013160609A3C68AAC2AAA6399AD7B0269C886A2F97 H_OutputB = 36AC48E96DF8E1553B06F992B4487E59B36898B8D78E21638093EDCF6813D4C0 SharedKey = 17E23C3FAD94832B49834BF45297B4C200BCA4F0730CF4F5E3B76CC1CC5D909C DRBG_SeedA = 443BE3BA0C6C88C1DF9A9265E38370D8AEEDD839DACF215C9C9B76B6DC87C02E6864C24957B578C2BDA06459B94324A9217B798229AFD9196A8AFACFCA198C70 H_OutputA = C7FEB8679F68DBC0310E19D3E88B7816165825C5409E272769A95E8D8A1E90BB DRBG_SeedB = 1B8162F4DA8FFB38091446FA344C9EE19F65312E49A48AFEA9087A0F3E39A2CC H_OutputB = 88A3DA7CDD299944AC6E5AB05CA77E0970AE6851DDC860D248AD67BB1412AEC4 SharedKey = A2C099FC0134346BE519BD599A51AD7EFDAB981ED0458BBAD7B75D7D88AEE7AD DRBG_SeedA = 13C017B2FE054CC8948E9FB94EAE0F83ABF4FC2F0CDBC4EA5A98A696F5E248442D9597CB46693DCAAF1CA08518F38C34BBD66BFA976B11541C28D9E5478B3DCB H_OutputA = 9300AA84B29B10B3148389124D175DCB536087785BD77788846A856D739B3C69 DRBG_SeedB = F5281F3AE3486A64609DDE47970ED689FEA7FDEA7D6918CD237E05900C276653 H_OutputB = 39513A05F1DF4CBD008A4DBE05AB71EC3346F10BEACDBD9A0BCDE7C5485DB23B SharedKey = D895DCEA005B11DCB872C0D3D60FE44DCACC77D7EDA50D03284BF5032762D421 DRBG_SeedA = D4E5A7136E8C5F41A334A2CCE916DB8E5F147BB2593AB9A87E4C1E0F5BA9A60BB3C0B301F9526CD0BF4CB21CD68552B9E8A2A07B36705A36A17A7AB8B35DED2E H_OutputA = 7A44DF3280BFF4F8FBA03A5BD1F17DD4DC5D20F323A179EE05E9A3369839A754 DRBG_SeedB = 6E4BA5AD36313E8AA6940156B612815218B9E033B0B63ADED4D521D02260B743 H_OutputB = 63A0244741E26C020500F97C288011A4A2C288FDAD55D4B82598F23A4557DB61 SharedKey = 9C76295954D5990B330513FCF2D198F698DC2EBD25FE943EDBAB16ACF03B6962 DRBG_SeedA = 037803DD97F3066352EBEB96E37F81576EA43577E5E2048425F7586DF7214FD7F9B511AE21215B63B10562AE50C183C9E0E9A45A9B0A61EBB24EF8F4018E30EC H_OutputA = B91276F5B1BB2A492319ECC1ECCF39071F98471188D76C6F0398CC8C3BF07B07 DRBG_SeedB = F637A9995E7234796A76022E7917A0840E4870FC875632157DA4925D53E4E828 H_OutputB = 42BA05AB8C244C110A6BE8090CA33BD8ACE3FA77EAB11501809FDC49D1AF7608 SharedKey = 3C4D85F1243BFD013F8AC8800A9AFD805F4CFCCF5C5C8DAA251737EC6F56DF3E DRBG_SeedA = 67E3DBBB1D06FC5AA887DD37DC06E81E9CEC5A28142918AECAB3C07CE5DC72D0DE07C733BCC68DFBA9C244BCA9CA034FA04C134F604CBEAA076DD7FFBE036362 H_OutputA = 86E37B92E158360B5963C35DA408867CA5B4E8BAD3EFC1EF8571054AE74445CB DRBG_SeedB = 29DB5A417860D99F869E2DA12FB733D93D8C12326FC896F0EA6774B9A2D346A6 H_OutputB = 7A9B23B61C47394AA7EDEBBBAAB0C3DFEFFC8E25B5C7FEA42C476BCD6713A380 SharedKey = 482DD4A128F22E610A5C01640173E61AA68D7D87A5550EDAF6E1BA242424BBD9 DRBG_SeedA = 885E0DDFA98FDAF48BC6F79669D099BE678BD1B9054D0881209E47493B624C82E7F764B346525773FBBFBE0556A4B22719970480B7DD124EC2B50E7FBFEFEC26 H_OutputA = FE12249851F2695FB2DEA3D66590C7B42E06397773986A7394D7C91D2E8A88E7 DRBG_SeedB = 229A0D140C714E594FA1F2F5183BBC48D7ED86185AF2A212701AF68D91B6EDE1 H_OutputB = B19C5BDA8937E775169F41C02F565489AE32FDF29B47502B7C50B8F394F0CED4 SharedKey = 67C62AEA6C9B31AC3B3483134A3B3BC532313077F091175EEF8AECAFED54D87D DRBG_SeedA = 57FBBE300B98DF0A079DB17EAF2C8D402933B7B34CB15A3B1F3F2DC880C299E401A5EDD6FC720EE72155B3E8D9FD5A25C5870EBCCF1EE052ECCAA61F5484F18F H_OutputA = 05C6334A4D0131815204767F5C34DFB279280FD3E3BC74F2599D2CC5D44B686B DRBG_SeedB = EABBD8EB008AF47339D36C89E1DDC6B0782E4D073F5EB416C4B90293C429CA25 H_OutputB = 895A70D70BB3EE4927E4DC4CC52BD9C9CD39771C08765E219CF00B2A3C15E2FB SharedKey = EE1B4FB5073D161A8D3F15C6573B566856734DC55FD53449D2448BAE36F6C832 DRBG_SeedA = C216ECF0861847346A8B1E857AA4EA8BF7C3E63AA3EE88D8A96261348EF2072DFFE61142F6C839C77A93CCE7B56905E88F55F086279E54C536ADD4501739BED7 H_OutputA = 15A2E188C3A10FCBEF0BF96C34CAB1B3D2BE93B325D6467E057EC4A7B6D91519 DRBG_SeedB = 33465B34D30F8E2C688E339B8ECE85E2445DACE5FC05A423E65BCBADDB9ED869 H_OutputB = 05B0BF6E49231298F70B8B9EAF250A13F71D39C381691A6DADFE3E91A011084C SharedKey = 7FDE0650123CE724A42529343A6F6C4ADD4589635404A754008EA6EAD060A890 DRBG_SeedA = C79E937F21AA47F90AC04E7939258439F0824C1E62184F519BE697D79AD24AEE572E443242F05D3549DAAEEBF24B1CD97C347764314035AFA3FF3CD282BBA000 H_OutputA = 3FD670947C502E9F4F5C7F4A29096EB66CB7A1BC22D18286C17D9D2AF28EB6A3 DRBG_SeedB = BF6BB54F17B9A54DC92FD7A142D60809CCE650030259BD03BAAF3FE37DE7D85A H_OutputB = 4159AFC6B867ECA75AB04B27D372DBB070C69503C5BFEDB8168ECF24750576E8 SharedKey = 45B45CA5F5DCD99D12F9D1139A2189CE9835DE1EA150593B7CF4CCDA7687EDF9 DRBG_SeedA = B1815C74867B8314E30D67C24059C3ADC454AB0170C729BD45D0DD7E95CCDA0B1D603F4318EE7BC20EA5E89776BD83FE63914B6D656D0B6354B487A3FD1FCFDB H_OutputA = D697ED3ED42DD3B181579B9EEC7B7133A4F5E4B677A078B3589A84D46E42A73E DRBG_SeedB = 974053376B60AD297FDC0A7B08A1BA98D194558171F66273F423969A9FADD8FD H_OutputB = 5FE3E2391497FAE4DB54CA9BFE47F30BC3662F9744C654CE27B2CECC931C0B23 SharedKey = AF81D508AA16592BEEF0DF0BFC23BA362AED356BA5E0100C8D69FC614D1B169F DRBG_SeedA = 03CAADEDF388EFF0B466BAE40A41443619A6E75C2AC4202B5EB5C411E255793117BFDB218633DB2800F70A82054CCA61586AC11886A2D287644B54B5B0BE1054 H_OutputA = CF597A511B82E563D89BC551E0728746E190CCE8E1541DF0857E0DFF243EB817 DRBG_SeedB = 088ACA8A7C8EF430E083481DE8CA5E26B89A5826904966EAE8973DC946C66C7D H_OutputB = FB946CF77AFC523A8DF07699D14AEBC396F1E0C5D6C3367D29191F98B846B8EA SharedKey = B4EBA3195069C347B274EC9FDC8045142EBC834525455B44B51408111E271778 DRBG_SeedA = 01751421B4232485EE19678C58E2B5879BB9F062A714AB784123FC2C717A04459E5845F59E3D904CC370A1335600024F134AD8E806FA567A527FD2D124C6298A H_OutputA = 3057E54AEF6BC59E4F372AE531F2A4C513EB0A4AF3F6A536E7789D37840A6652 DRBG_SeedB = E53C353890031BEE0EF3AF5322F86207C43E14EE1DA8C6A534626E7CF63105E9 H_OutputB = 2D4942FF43E9318CEB077E251C33898C1A7A205681575750CD6A56924D758AA6 SharedKey = C9D99BB79D712DC947C65B6CA8B2DF6E5D3C254EECACC84046976B52EFD9B156 DRBG_SeedA = C9525C3517D08B3BB5DD68079FEB98B1D36D5CF957E72A30120CF7C8A2B95174BFD07D50D887513A32F4FDD03A36583608E1AC3DEF23F99879FA4F82A86FFB00 H_OutputA = D120C4A122506DDE271FAFBEB72E5AB5CFED9E4F0160D070717CA8210714EE56 DRBG_SeedB = 31E2A37079B8E771D04675DEB25D480F4606E35FFAA3FA084F73024B8F244AB2 H_OutputB = E121E5B7E7A2D82B1CAAE6BB5F1D5A84430F35D0138D7CDA8E106C8670BEA71E SharedKey = 40B64E260C2980084DA06C392C2E240E79817BC7DDE4ECC885A84C4ACB2DAA56 DRBG_SeedA = DF5096974A9778D54278073E4EA179BBA949E4901F45A3C820D38DAC4CAAAAD82D656F013FF3E22F23BD802F8844E4EE55176A93DB5ED1D11E644FB54AC91993 H_OutputA = C7D4E190F72A0A4BFAAA6F827CC852F019BC7D9D46E9D780C092D1822373A9D8 DRBG_SeedB = 7F473EC6D5254387F507B6EE418CF305EEAFA863EBEB7D653CB3FB99A88D34E8 H_OutputB = 7774E1FE29B8D3E5AB7B48F3DC7D03D731E716D3F41F2D5F50120ECEFACCE63C SharedKey = 7FD884FD20D74B0F50F45D872576961D55EE4615432E0A00E1F2613E34FFB705 DRBG_SeedA = C73C4614D75116D6DC03C9B2BFCC1D3D1F6C5C61F59E1D997F114B90617BBE33BCFEE28E7609D664F74BA4233E6730ADCF0A2C1B8994AEAE341948F901042F8C H_OutputA = F598DE62E3CD5A4B34AF422BD0C2128EBF37131094D069EEB9DC37F494B67A15 DRBG_SeedB = 67202DFF84D2DFBC848A06BF87B590CB97254D931A131E8526D660D6E8D8E2EF H_OutputB = A6A0A426277CCA51F8825C44991AB42CE61EEA01A79E93DB529C5DE10ED962A7 SharedKey = 85316DD6897EA9B5CA3E0B7A69EE97B6187EDD6C4345E1319CC338287AADE421 DRBG_SeedA = 71E1494D671CBD0018CFBFF3834B59E30C1403658243D055140DA8E62D12B2DA136051E37D570B55C872C3AA57CE76C136ED8B3EFF619729BCBD09AF074BEA3A H_OutputA = 95E3AB3654DF6FAFEB1AFF63BB710B3DEDCE9CD4B3638521640D6A3119715BC1 DRBG_SeedB = 0DB24EEB4140C93B20426D72450354F2A31B921053ACBB18DC8A1177F4DB6C60 H_OutputB = F70F16BB9399D4DFB081950D02EAF74627FAD818310FBE74660264FDF9BFB906 SharedKey = 603D1E636F7D79DBE036F44659B5CC93653EB43142157D4A98CBE0D02D57F266 DRBG_SeedA = 74B41B3C101641B96A979C7F144C224BC8A4ACB93829998E3A123813974CC98868A3A0D19071ABE715B6C7F93378019CB6865E0359D9BFCE9851BF24A107797B H_OutputA = D40304C2E618A9667A05E32FF5663AD6831398B9D88B3109557B242F9A0347D8 DRBG_SeedB = 9B95F8C5883DC0C126D78EB1B24B7CAD74185EFC0C33DBBC3EDB922A1F14B55C H_OutputB = F488EC29BB34BF77A8A651890A4769F2D276FC7898C2F84835F4A2DB487A8786 SharedKey = 5F4FAEC812D4E66298EEB5388D8995974356F2C4AF0B9715282590453C9E6F52 DRBG_SeedA = 063C7CF2C4C4C1B7BFC7F49E4CC19BD6C6FBFEB907AC7B88AB8DE1B7D07EADEA244136FD2513CF5ABA219AC898D7BD12B7DAB17A7AF36A4CAE3915BA0D221835 H_OutputA = 4452CFB9E62B84701C4EB3F19FD2AC8640C475B678D85B16F161D29658A49F7A DRBG_SeedB = C5BC8F8D453098A7F819DE9A25D53AF5FA67A830463F1D0194E46DFDA51D6129 H_OutputB = AD8E79A542A8CED97BD72FAED69FD0EC2AF6F40946B1AF9E3A628EC3E862D1BB SharedKey = 4F0601BEEC1C639E5AD89F4F6308E87AFECE327AC1F46A341A14E8CEC7101CE4 DRBG_SeedA = A9FBC4A505DE996909E57BFD7E0F6A15E170A86A947175756EDE5830A73280619E8A9A38187102EFF8A1BE9D9D24FAB5D2E9B1DC75BDF3707997B278F70C9423 H_OutputA = 6F931CF772B95A58ADB70BB0EB84A6E02285DDCA6672657EBE7DE5C0399D6540 DRBG_SeedB = 5907690DA54CCC5A635BD90DF8EF92E8F4AE1F027CC3D9F23E0D82DD89E94D27 H_OutputB = AF0EFED1075CA43E8D1D36A191AA76CC68C1D9CC8A88284ACB975569503BA24E SharedKey = 0FBC9328C54A7741A0EDC7098F5D26692BF8D9E91C15503A32836C0AAC69E054 DRBG_SeedA = 29D7BDCF59064D29F493425A8BDA790B15C5DAA0EF9B42994D18D7B179C8D180998B40417DA2085ACDD46E45638EFCF5A76361678A3B94FADEF97D39B0C1749F H_OutputA = DBB4B21F4DE9B062B9115522429E8924ED971F4A663BEF7DE6A4BBD106F1EB88 DRBG_SeedB = 82410EF48483715A7D94478FBAB50CDAB01CDD2337B0CF933D8745C593F8B869 H_OutputB = B3C31E0F20D31EABE2281E7B480DC3D445CC6C3F739653061CC985F734F87D4F SharedKey = 9D433189F8A41B0E7AF26B1B3D21631D9143FD05CDD65A8DC4121C94183B4775 DRBG_SeedA = DE248E9367C80F5D72F53806166666B0B7D81E6E39F8897FD01DA944936CC221DA91D890A8CF6D3702179ADFA3BE58F531871ED7DB51BBDDAE335B17FD0A0FDC H_OutputA = DAF4248152B520F6764D8A5396D8F564E2DD333D882F58597E71B5A025305F47 DRBG_SeedB = 73E9272E59BD16984E9076ACCDDC5C7ED3ED4D6A72BEC54C90B04FC8BB5B072F H_OutputB = 03D0B873B2091119BA385BCFF98E2FA0D2C1FFE5425F6C7766FCDEC5F0863109 SharedKey = 281308C682C781CEC23A5E8EE6D1503A9B739025D03AA75DA42AD7B9C95920EB DRBG_SeedA = 7A5FE299BBB2DE8877F9CBDCC110706BF8A6DD987FB509C79556C98D14573EB17F1F04834CB76C1CA12DAA9AC41C76169B9D281E752E048FEA1A0476AD4B34C8 H_OutputA = D47803E4D67F2B53A8EDC4CF24B43E5CC045BF26AAB2C763B2A4FEE32BFFB4E9 DRBG_SeedB = 09E75036224215F85CFC2B5B821F35506C35B4F89EBC522445B4B5B6759F7302 H_OutputB = FB8C39156C15469C4E18CA5BC8CB704F1BA0DD67DA1F45B7DABC3DDF2A9C17C8 SharedKey = 7A68F9248B80D8409E1B3BC9CA2DB13722EB9BBD1F5E431F54849EB35797211A DRBG_SeedA = D0E5C83F3A1AF745830CB19A58AA7FE9F3DBC2851456DE402CC1D1EA23812D55334D4C207AE6192200AF2A1AD33A12FE5D89E4AD083F7B9DD4C6EBC5FDEAB6AA H_OutputA = 388D19ED5A77FC8633FCB405E32E0D1273C4885B15ACA0B98B2F6DD24E16D03F DRBG_SeedB = D1C4D96E645EDDAA856EA9C554012C8F77982377968911353DD5176CC7B55B3B H_OutputB = B31B63872F312E7A1A74E640B2766C8318B9EF52B37152EF4A4C5991A9002131 SharedKey = 38BCB24614671137327DDD2929FF398BB4782281C3D9325A2A415029580FD4E0 DRBG_SeedA = A89CED4BBBDFAA298FB90FE930451FB8679BD3C867823BC02A4FD2FFB3BA5929F2B6EC930DF95105B08ED3450A5E22AF967ABF7E052E62FC8B8E1FE1EB7A184F H_OutputA = 3A89417F2B4F69C9B11CC34AD706942896DBE611CC2A678DF9983835BFC65EEE DRBG_SeedB = F41F2194997CD46CF60C147122419A3BFB811B21CC05E6EC333F5E6E19D7D911 H_OutputB = 06560BC036B5E75815E61B7ECEB36A9859A0E11CA6AAD0081AC265BFA5CBABE1 SharedKey = 6DC99DFE57B53B9C7E0D247DC0EA0E3D7943A0EB6AFF8380C7B9784F9B539760 DRBG_SeedA = DE977BEBA96D338632718B85BB669048C9F657635F3ABC6CE1F4DC5EC5B00B2A0EFDB4D916D8F1CEEBC8558D12B5DB0DDF13B52D3B6469B5A810F49D1A577FD5 H_OutputA = 2C213AC0FB7FE75BB42E510D6E58EABEB17BD05AE05452D94005006C746C44A0 DRBG_SeedB = 0384488492DB8F30BB9D5B66DC2F153551575B60B2A70B7CC3963DAB2E8AAABD H_OutputB = 8577E382569B01FA1F719194108930BD9416C9FEFBBDD69F60D3BBFD2601DC62 SharedKey = 4CA56BC148B958E94B7E5A04708B3973018F8D9072C545B9EFC21A7BE7EEC50D DRBG_SeedA = 8AF2FEE30C10FD7793124A3D2F4EBD5C9C988616D61FF851AB888AE37635B416FF6A9F146F9BF30533632E2BAC45DD0F7BC155CA307205C98F88380E83638011 H_OutputA = 67B9074EA25B8E5DB6F183DA2C6A2A1645692D8C8CB8D75F28BE87CFA8C86353 DRBG_SeedB = 1FEA0F129CF88E6C816603636BC275B0094D9C1E91AC74E1755E1F9229F5F48C H_OutputB = CEE2EEE8C0A1C649E0D6A93DF7FC2622DE62E09394931847FA19E3F894E6DEC5 SharedKey = 2D1CF3D425C7C4D84FAA31325A8FB870B5557F46F2F9C8FDBEAF0569B24EDDF1 DRBG_SeedA = AFAB0A241987B56203554B5B298605A7AFAE6C17064DE470C35746C2B162537D0B3D5D09B7CFFDAD244F9416659C5C05C096E2211B081A6AB80940E4D53D9784 H_OutputA = 656EFFEF046E6B75A848EC1D817DDA1F5EAA3F9596B5969B8CD7F7954664A5D2 DRBG_SeedB = 0D4C8B8D2CE21F38A74B495388930EE91D12FE63E635C8628BCFE3CA07F17AFE H_OutputB = 3E2BC56F9D46BE0E3E8788473990A58A7CC0649C878A3FD5E02EC2C863B313D3 SharedKey = AAC80EC259B99D3A2D8E4D0B20DA7985E01A99DC0D48DFB4E631A08D9C88DA57 DRBG_SeedA = 515AAEF6A71FEB5B6D320DBCA028AB215D462FB24823EA91093C6C826CB4D0FE23E0676B36E661718CA4B9B9898EC6336E88B8E0753A3EA300FAA53635E0558A H_OutputA = 47DA2AF6119286155CCE40A84F10989A92E1FF083B9542B9C769DFE62CC28E60 DRBG_SeedB = 97F0B216D3B79EF4720EBCEB7AC8D01B5FBD00599739465C11C1FB338F3C0713 H_OutputB = 73E6518B264A6B4E63F9C5B96D2D1F1146FEFB961172564B7E2C2DAE687B8B7B SharedKey = D6EBCC3E3D8FAF516E7FBB62443B7F491B7AED965D65007284901D5BE705500C DRBG_SeedA = 299FD47494C941B5281D29B6588BDF0C2120797AA235C4FF485B18DA2B908FD0B4E1057DBBF9BDB8263349966D73643A7C5ADF842E8453428DCA023CE6515C80 H_OutputA = 6509757563176D8D90F7F8DC2715438A37D6B28649295EAD6CCF52506576396A DRBG_SeedB = F655F7349A410A4DD61344BC9E6862451C98F78CC375F68A55A64E8EA9EB41B0 H_OutputB = 742B5CD7EEF7CE2D71DF755A71CFF1E44E65AD4CF390D42232120094EA73D530 SharedKey = 853FDDC416B06CC71F4622D0D84A65A09F1D5D0A22A84D56373D7952B74E205A DRBG_SeedA = E115E1F6F6D8EA0153D4E696F1100375820628D3B6658739A9568B5FEAF527C13E4D9F35B12708BCB9814B16A1BD79EA55132BC89F378493AB1F5EC3BFEF44F7 H_OutputA = 82CE03095FA372FD190FCFB15A7033C12F6F13AE6C6B21404FBFD3FEBD41C0A8 DRBG_SeedB = C6590C93FDF9BCDFCD8910DAB6F3FDE0C49684AD9347C5A60C960061705077C1 H_OutputB = 9A3BC6BA53EDFACD5309F0FEC966B49DC328AEC7C0392781EDE79369EA6A6D2B SharedKey = B17BBD11BE1085EB9B5314D536C1E121FAA426A43594B01E44767F9EC8F92E17 DRBG_SeedA = EEB5B1DFECDC27901C2F36744EE970E9FF12D7B3AF6AF1E959639818F685F6B2E16F70396B4C67B0FFCCB19D85BA28A242FFD82B816952669B9B26D0FB3850E2 H_OutputA = 45B310787C2B9F4708C004C9E429666C40968F97AB70EEBFB69330C1A18A8C26 DRBG_SeedB = 5413D8D75132C8C20F1D52F1F17B759EDB14A183CAFDD6070FC6AAA49B81C6A0 H_OutputB = 9BF13B1EC6F36C1DC439CDF9B67961563AF914C65357D85B8F3A3C56D6734ACD SharedKey = DB3078FC8CF1806882E1C9D3CE6014368FEDF3DF9E8B785A349E46C46F7A8D79 DRBG_SeedA = 6AE2A1907C4074AF8E6549A8E3634277177F53C6E9DD75D66B4F690C4FDA7E1C28C607E45C57897659D9185810326EB37942D36BB5D352FC72B575986C1697F4 H_OutputA = 9CCCFB73E5D6DA3C9F25AC6E84F889D113627E34719E92F58246886D5A76C891 DRBG_SeedB = 976456A435F069C6AF01C972A1820C483278A7B54FA25A5990D5FA0609A53B27 H_OutputB = 74EB4BDBFC854BE077977BA04F1D54D0EB9D62769F8F22CE1647D6414AD583F1 SharedKey = B6043BD94A2CBB59BD455A5AA8B5FB9BD383CF5A37457D8DEBC72ED2811DE012 DRBG_SeedA = 5F80F683B0D44AC33B7F6AE5213BFFDAF946C34196A87E54D6FE03DFE1A97163B5174678991C233750EFB169AE89210F2BC5DAB27839EA1ACFCC99C5DF124980 H_OutputA = 1A6DB10466D9B51614BF3366033EE1E69EF4F790CBC78D26CB15F87A6E368765 DRBG_SeedB = 8B9526AE7FE4F09EF082D0A5CF87F775359B0B148314D3C51A5E43E4EDBEAECA H_OutputB = BDED48C7EE32F1C202894905838F8B75936008D8AD9EDF0A23C22642CBB40D7B SharedKey = 78AB390E6E46E52664570978E49EBD28DD398C5192BB9A3DBAE29AF1C1C88D1C DRBG_SeedA = D4F4A9DC8CAC65111D701A41B6F9897E74D2AD2FCB66CD1569BC40115419E69D1D2C9217C15E1F8C2AE9858779FF85914290E31FFC1DA9C1B4B73F68F4C70A9B H_OutputA = 2B68A8475E8D294931BC169743682A54776B472F1F170AD20DCFB44B67DC2DB8 DRBG_SeedB = 872AE09BB9CE34046DB4EAD6904D6C8A127590AA047424455375D5967856C9B3 H_OutputB = E2F63ABE8248EE2003B32EAF93B1FBB646825BAC0762CD2F4117805C59D8026B SharedKey = 05212B51E972F003EA860F4C6AFE627641FB9D2CF2FB860F168E08C7A41DB5D0 DRBG_SeedA = CAA9C2191286D3B0AE3DD9E1B526F5CEDCCD15E98B04721D806C8E39C6180F84231A8C7CF12C84A9A0A994DDAA9284D84C4D6763BB1264A7FBD868CF3F91ED34 H_OutputA = 310D30237B308BB39304033A7D4BD047AE2E32386EFBB51599E8026FF9C5E11C DRBG_SeedB = B9EE7F28FA941E2DD9C06CDC63E4FADE43485D0167E756F875085FD4FDFB0139 H_OutputB = 4E745ECAA29BD84481A256E81D07B1C90378C44AD9DD892E19AA776FBB59B9A6 SharedKey = 4CEA7F374D3B1053D4451E155AD97BDE071936A4C8512E2E537E8A1ACF30E02B DRBG_SeedA = 42CBF00986B35CEA7FD53914EE48A91A590350EC536493F294B3A5ED180DC71FABA91B9CE3857F77274D38604A1B41A2B4BB4DE22FA221F496743DF13D80CBA5 H_OutputA = A71EDEC9AC1349A8F83237FB0BF8723E4579E5C93B325BC563DB103D2F2BE374 DRBG_SeedB = 473CA24CFFCB32DB736D38378886224558514C9F89F37BB1ADC863E64E4FC70B H_OutputB = EF9807863B090374FEA92BCC4EC5C293EB2EC643A13DB52CCD6F20CC06320B93 SharedKey = 2E7CD5FE4B1B083C55A7E9F0567C282D4B5EC20FDB3A2AAA2116FEE92484860F DRBG_SeedA = 516322B1836A751312F3C6092545E7F3E89DE8547512BE31E0177E898ADF29CB1BD53AD2D2D86D676DE282C738439466873870D804B7DEA30B53C1ADA8D51048 H_OutputA = 3DAD4C3974FDF94C8C8C1B6F58CCBC522507E085AE1B0E5B732DB670560A1D37 DRBG_SeedB = 4F94CDF94121D91AA52819593A3C972B1A233C2C7377818ACD51CAC651957957 H_OutputB = BE93E54FCBA0DC809E3846ABAED62F29E3B95D68EB78A1A94F1CBD2901ECCF54 SharedKey = 2885704AEB906817859B0D534F5DE60A7015B3D5D6AFEFB1BB8B6FB6A6F17657 DRBG_SeedA = AF5603556927F18356DA73187BEB0737E43418ECAA31A4E9CC6F8DC7782A7C02447E9B91554DE461063F80209F39A9A1EF30CA0303902C336E62840C082EE281 H_OutputA = E726C9EB2F3855E58807BE2DE6DAC0E6A9AB5F2916D7BEBFA017E90C931F7B48 DRBG_SeedB = D0E260822D432AD3D8E60FCDD4D519C77D65DF27EF51AD49204972B0204E4B2B H_OutputB = AC46A86D5C9F59F087F90D38FA4A97054DAEAAD6A7FBF34EB7CAD05BD2282A94 SharedKey = B74B767738D294A8979E18C3DF05FE3CDD640299CD87E86A26ECD252CA6518F1 DRBG_SeedA = B609955144AFB6426A07D090727C77AF2A01BB68B28F83CC0712EC65516AB5DC80096BEB5D16FE444E16BC9D56ECDDF80883567C7F0B723846600CEA47AAF9CB H_OutputA = 566C4C5B1B19BD10B856E75087DCAA90B0BA47809E2BE502A739FCE91A8B1C6E DRBG_SeedB = E786A5365C77D387B0A3EDC0340250294EACDBAFB41FAEFF3AE1680331F3DA78 H_OutputB = 5E2E38A0DA094956F6E753E8B0043FDB8244B409432D6D72A724061334A4C1D6 SharedKey = 4D62E3468DE6ADA3AD900672CE9D9C900C763C56EC22EA53A567EA6C9A5FF23E DRBG_SeedA = F8FB2EAAA88FB8FE029FD9EB7E6EA61CAC2EF4C35FE78A2CA89244B44F1DC861D5FD8F2C9D6D4E6A5A8FD4AF59EF4BD62AC2919D8CAD3A95BD7B9B8812EA9664 H_OutputA = 054EF378C139EA58547360E0734E624749D4F2F0FCA9284F73C22BC942CC0B71 DRBG_SeedB = 3B74CB10DCBE269A949F367AA0A2259968EF2AB99317FFE508845DC1E71B8D78 H_OutputB = 6A6069BA6EDC8A5A3760BEC55316D4A7FFBFD385F5F4F13CB84D0872F8BACFEB SharedKey = D30A413D11484487DEF28778D46DEE8BCBD65F05AF1ACA4565D96752E494E1FE DRBG_SeedA = 20C2F283F16A6BBA76165738980A13228C77FBCAC17C10C6C14363368A3F398F8A8744A791A4584A80CDC5450F91514292722854FC1BECA8C47392151FD1DD02 H_OutputA = 410D9FFDD05A62BC482707B2B38218D5C455EAB7AB66BE16AA5FCDDF20C5F59B DRBG_SeedB = 537B5935E569AAD1935A694A006315F51AADDD665229DC2BEF5F200FDC9008F4 H_OutputB = 125B3C11A7CC015AA9D8BEA640B55E3C9F3421CC6CF6029564AE769A3BCE90C6 SharedKey = A5EE54D5C0B7F172DD9D02EECC581443A48FEE945EC3ED0CE85B5A36FAC97A15 DRBG_SeedA = 09DC4F91098CBF0D671F88CB4460CC8F792AC4371B1293F45DF74F8CE35E8EB131A3ED285142003D6DC00DD9F996793901130C2E16D2D76C069331C358951196 H_OutputA = BAAE7AC8E7FCE52C562FF460F1B732E280A8F40F14252F09829D4F9B37F6F0FB DRBG_SeedB = 131E6DB0FFC47A148EBA4D91993BDF81B530111C183FFB049611CFF567243EEB H_OutputB = AE558517AE12199C719424D32E86A0AC8B178756FFD1E9C362E16F4F74A67769 SharedKey = EFC7BE90EFC0D3616F636CE735B92991576D1B8FEA49B45F4AD22695C8CB864B DRBG_SeedA = 7BD35FD674BF4721F4B4121CC2F192962970A559AAE00C48957E9C2A0CFA9EE59DEB665A0470F853FB5A4BBC376C55EEF69C845360B622BC91F3464881A286A8 H_OutputA = 146D6E679294531010DD90A54F88053905B0062EC3C23EB03BEB587B1F010526 DRBG_SeedB = C98AEEEE600877C494B1433C7FFE979A93CE3D15EC2A931BC94DF8C26CC1947F H_OutputB = 30BB46AF14B8D115CE3A225DADF866603CA381E68C4CF83C288AD388C985AC0E SharedKey = B713B2545F3ED619F7CA020D903840AE184E978636FCB6CA19CBD7300A8096AE DRBG_SeedA = 3182B2C3126DF33576976E221BB594224E084CF06957F5A3EB6E3A8498B7C14803C3484D3F3E266669F7FB5E2A4EB6E0722D582F842EEFCF7842DCAE9858AE63 H_OutputA = AD7A6CE111A1DCBA7608DEC237BAC86A2E091953306978D9E3F7D82E2CF0014F DRBG_SeedB = 4E094DF378139EE89EC3B241B48D0FEE318A67CD178AA05B06B70BF3C5665A91 H_OutputB = 7A0DB4171FD434871732CD5E48CEA17B9BBDD71050C4CB99347AEF75E678F677 SharedKey = 6E73B74E9640BD99CBD502807241AA7D6D15CDF4C589F230C7BF6F2168C9FAED DRBG_SeedA = 9C70260CDDAC1004E9665CEFB39863565C1ECDB3C5F0ED0AD9E0A38EEEEE6571EEC709CA439C7E5E344B92578182EB3CB18C047FFBBEA3FD2D13B8307BDA8532 H_OutputA = 1C8F375C403FB4C90A805E17F519651F10B8C2C0870E4B5492B447AE420B12CB DRBG_SeedB = 03B711C47510D3106D1AE0FA594B46811575AB01D8E68E26C772DC4C5FC8FEAD H_OutputB = B79A7843D6D87D23C15C9F2B1853F19EFC9290D290325209B07FEA27ABD3882F SharedKey = 00C444B489365F7B53B19B5D541C3B33EA68AE548B015A498D86DFD5BE38281C DRBG_SeedA = 9A5B40C679B804B4BA6924877E590F88D54A69B1B9B03FEEB5DB6B52179D6A1D6C9CF3A396E08CC727FD72B8612D381AD3F8D6F8B5051C7333437C3626A7C10C H_OutputA = 7E861CE57C17C1B5768C015302B8422103DB72C780876FAFFCD5D71702CE8190 DRBG_SeedB = 4EDB28CEC8427827879B37FD9DCA2CE937B82AA04980A4DA87DF7EF903FC22A3 H_OutputB = 3C06033A7C110175FA65C1D67E29FCEBAED4583AEB757F37CC24C96AA4BDF582 SharedKey = E7D2A2A7988E3086C98043F7681DC7CF39716AD1A51880F572F2D3E35D82D7CB DRBG_SeedA = D339352B1121D3D5556BF1DB10D84904918EE31252B69960AA84B94B1838C8F08BEABAB23F8E088AEC5AFC8E8F3A0054462FF8814FB5B77E86486ACEADFECAC2 H_OutputA = 302E5C9980FD8CF4AC06AE2B7C971C349FC5D428FE393A23F27E334373B8732D DRBG_SeedB = 7616A8624177B2D479BDCE6DAFBA5DEA1AA1D82A497FAA2A154B1D7D8689EF28 H_OutputB = 6294509A5FBC6E59AC60792E924EBEA66966F9C13371343E0E98DED499B8E5C5 SharedKey = DFDCF6A6CA908757880871CF410E5386EE55F4633453705778B4B49496317E87 DRBG_SeedA = 60C463F0205D3D56ACEAFDDFA5C89790072A0C7E24308FA4B6B3A006CB7BC7B6EF21FEEA8E2FE4A67530E3DCFFA11325A782A0514DF1E9E38C6719E869236DBA H_OutputA = C3C70F17FC095380C95B493E432CB6155B8290C9FB0AB2F7B0DDB97CE9F97CA2 DRBG_SeedB = 73F0079B7BD604746009FCC791D2AF360F3910E2639110ABC5A81416566EE555 H_OutputB = DA781BE02071BA2976C1F33A5F9C95E7BF77B7BE9F2D87AE0849BFE1503ABC00 SharedKey = 58202A3903A0FE9B46C727D5C149B94FE7F9A464D0A3CE8ABB5DE9DFB229D1F0 DRBG_SeedA = 2788E7BC41B927678C4E827F6BC7CA2F4119B981701213936067A4B6490837CE32F9C04740EB2C5CC3B37335F60E7D1C5797547D6DD2171DC93A72FBEF4F6D50 H_OutputA = 6CE3CF8B83B066613451ED12A63F71AD9FDC23E814B9388716F6D3F690A44958 DRBG_SeedB = 831F711F366A31B3176E3CB1F6A680E9C828040E588ED072DDF4F091C4F2DA78 H_OutputB = D7050FCF573BCAF27A1A6BEC34064132782D08950057641F2910470EF50C1BFE SharedKey = 793C966A248A06731264599D48A90C804F3F034E05FFD92E9E3B7A676A8B8B3D DRBG_SeedA = 3122FF338EC4BA0F043EFAD0A2292683ABAEF3D3F395054FC7A00FBA50BDBC8B36176825479FCFCBE702126ADD1E1E6FD1D895F7C9C3864BB59EFFBA1449E1FF H_OutputA = 9476177E6602741F30C8E756D0822380E58D07306C882158D7B92360F1F34199 DRBG_SeedB = 33ACB057C1AA56FE398EAF91406F61E7D6DD59CDD1E2DADDB216F26549A9713E H_OutputB = 364F534010EAEF517487B72CA8954798952DF96F962A3CCAA183327E49A4A6D7 SharedKey = 43160F33AD3DC1AF8B72C4AB7708B3A53BDBD2757F34569B42CDDFD520DBE506 DRBG_SeedA = AD7BE15E971D326A5B33F310FEE3497F9B1121DCB4B350AC30DD594B4BC702CFD3544CC3C3FB1355E68207589E117A7415835144A3040E2542B10953772FF528 H_OutputA = E27EFFEFBFB644BFAFBB978C103E06A9EC830861BB74A063C21A2F890E6C05EF DRBG_SeedB = 1642D82BDE5979D791DDB04CBC57C56E2462BB953C74A00782DC23D435A0183B H_OutputB = 95554E695BB9D0756A0D9D3DBFCC77EEA3398885F8134C7ACFF5BF8679A21C5D SharedKey = 252CC959CEE1679525AF8888CDF47F3B43549354052798143A160F8DC6F10A09 DRBG_SeedA = 4930C0B21358E877ED3600079DE5ADCCCF2F630EBE4033FB44EF22939D2D7B42EC10817796BFF3E01BEAF5F515045FBF1AF6E5399A372DB62B221CDBD1225CEA H_OutputA = FEB588B6FE007DE171675AED289307E43177C1661C3FEA6A39E08B4C92B22AD7 DRBG_SeedB = F2241110B71FD39123810675EAD6378E8AC1AE843F828629F27C328280704CCF H_OutputB = 05265CC6E9649BB50D4EA9F4E4871BED9EF627085CD967AD0E7581B24189937B SharedKey = 213CCA507117BF6AB0669C7FF480C4984E4B684F7D91824EBF15E5050B60FD16 DRBG_SeedA = 8F62FEEE486F12B4CF2BD5E30A8A71EAF6F83BF7072F6E5848DDE18D8D36AD5BC012F9F4889D1A384BCAA0B0269260BDAE9E022E1E157AA3E7478F1F2B83EB23 H_OutputA = 7B8FABFF4034B724F62757BF351A570E28CE0182E40FE292A064DFF44A377853 DRBG_SeedB = C0344E39359BBB0A4A395F059CE586F48135A9CFA81A557FB2DEE5306F8C8D5D H_OutputB = F7DAA8FB87C1886053CA7A1ADC032A62A7022329EDA7374E4ADEAA7716BE4246 SharedKey = 1A4DDDF01F1737ACEEE10E167DC505D411BEB948AA7C5017F0203527FA4FD592 DRBG_SeedA = 42DBF2EAB9B1E23D9956CA74E7242BB069071C5D3673F7D6A8BC593CB49800BD9B8745C3B8BF2ED4EAC62A43160462338D3BC096306F82F93069B308D88FAF5A H_OutputA = AD6BE31C2E0E8136ED983349EF9C52CBA6EDDA44AA061DBA0EBD55B5230FA1BE DRBG_SeedB = 80C81429596F7BB0B0FC940F3A8165D1D7C5B3E94224F275C6A1945366A75065 H_OutputB = 7CF8C05D58EE37E8FD784CF44244052164FF0D3C8C1760D2606D3050319F5826 SharedKey = AE28D635A1DCA14B46313CD98DC659DA426D2D34ADE60C6D07B47955516B7EEE DRBG_SeedA = 95E4074C52A01185F77B1D010C4E2620F394BF7C9273A59305588917486DBBFF98A56A3846E1187834DC60C210F6A8C89D88B447C6C675C2EF274A860BD415E0 H_OutputA = 3FED467BA08FF57697E33FD74AEA44F476C169AAB84D7930072AB39C356E9DAD DRBG_SeedB = CC9AECA1E7F657273ABBD058AE32F4CABBDF4FFA2E5A613866592DFC1A434231 H_OutputB = D894A59CD022B823C655B50374475E2E6C34CB4D1FDC68556D4868AD4141BFF2 SharedKey = A9F46E86188ECDBCBC332DFF2722AAAC8256C5097C36790A489F3FE7BC72EB7A DRBG_SeedA = 5C672FB268F1F3479EEABB93220ABB8886A0D4EAD169052DD7CBDFC14F5CD55DCD0ABA60899F566F6AD51556C07F9AE7033E9D29EF2D114D205E37C6A805CA56 H_OutputA = DAD23455689B0266F711EA9EAA85EBD62331D8A8EAE42141B25DD802AEF65096 DRBG_SeedB = 6C73695ACE5503E4FC9C22C6AC786BAA6B14208C74030D9EBEF3CF2B23CE8150 H_OutputB = D8119D3498BE426B778AE52776541A4513DA498B5488BCE8B9CAD7A129CD14A9 SharedKey = A7BDEA5B4115194AC0095582B9FB04B2DAEC667046E3C6CB8787E0195E1C6749 DRBG_SeedA = D4F256C4A594D2D2CC0F86BB4E6FFBC85893BA4BCE187EF22761560494AEB7DB397D22E7CE31E92415D1FECA84B063E7E1C401A0841EACD751446F91497ED5A9 H_OutputA = 0E83E2CA3BFB8ADB441E19D6899935A1378ACAA411BB35DA929675E9D9C25A5D DRBG_SeedB = 5B416D3CB9D3407823536C642467B57C51DCBD28C630C5B8E443F20A0382DC26 H_OutputB = 87D0B226BBF6E9759D59855DEFF41890679E3D28B999535CF3163E37A5EAE0C4 SharedKey = C5036D5A6223010A0EF37202E8E867D146201295C25D2006B47522144C9389D7 DRBG_SeedA = 12E271FB40C23FE5EE23B02027F077DD5EC78CFC4516046DC9FAA163C048FA4C6A6E74721278B1EDD5A1B6E8F727B685E10622915B239DB752D0BFD6028647F2 H_OutputA = 4F76C3C7F6EB5751AF1DD37FB07D5D8C11FFAC043C023B26364FE0BB8BD220B3 DRBG_SeedB = 0B2EE1DE3E8C23A2D9DF6E890D29CDAEBC873E227D3C8D7C78C169B88BDABA84 H_OutputB = EDE17DACEA14B670D544E06BFCB292314E78AC3F91FAA8AE0B179094F12037AD SharedKey = C3269DFE2972141F40BBC5610B72B3DBFAC73F2489955203B6517D4BAAB17C1C DRBG_SeedA = 2DE81FC95DFD7686C5062ECA433B2995ABE8035F83AC521D65EBC0FA0AB74144E2EC9436C05CDF5396D81A2471FFDA0F4D89D23FC5138EA28C46912FA152A7D3 H_OutputA = CB468BCF296A4916AFFC7B86312F5AA409B46D5D7EFAE66C93B52F68DAB978F3 DRBG_SeedB = B9A603CE97E0AFF647F822471BF643CA6D9C9EBD8FE1E8017EA8A3827AB23FA1 H_OutputB = DA0B7AF22B31B60E9E224D173CDEBF2DF4C813C98CD19FCAFF413B71C7D2CDAA SharedKey = 79951D4285D639614DCD708B280BC8601FFC594358ED11306194A46C5E48F4E1 DRBG_SeedA = 9FB737735926328C8D8F2EC263C0061ACA17FBBC777F919422B2ECC4E6FFB539DE4C8548FD2E3FA636D44867951352E69D86422BA7DD90F227911D53282AAD57 H_OutputA = 749A886DB32E74B63CDB0AC650724379468F95926C20E9E541F175AB2F41BBAF DRBG_SeedB = 1557AFDF111DAD39B6F34BA2D751A6068290BB163B3B2EDD47E33E3992D9D7FF H_OutputB = BD0BFCE551B5AB943B2A08EDE98DF938B3DB382801D1DE6EF0CDD4AA9EE5DD45 SharedKey = 1AC9BA17CB75FDBF0D96A1B57F9B1031E2472E489321FAE5CE4957531F42D979 DRBG_SeedA = 9C3413435D175AD21C40C822559B75E079ED5CE4E0A1495E7F60D2ED028F92FBBCDD7388DB58A8A84509310D0579DEE22BE97C19F52182595E2F67A5FEFDB90E H_OutputA = A1E37FF175CD555C19156E12E15AB0EC51CFBEF9E6D3F7329E1BCE9B4DAB779B DRBG_SeedB = A925E4696C9582AF853977E8D77A3DB1AEE0494EED87CC5401DCD565B71DD866 H_OutputB = 5053723DE5DDDC419EE7BDC8ABCC7F0DCE8A74C1F28055D3688127C446A14503 SharedKey = 543F94B5632BBF7A4BC0D09925BAA03E97C6EFF35FDE8E590C423D6F08DE041E DRBG_SeedA = D3F846E3C1030EF8B6A552A003A7D7A7F96DE38C1859BE35B7115A08A5895789F57D684C4C9BE77CAF722A66A7795FA891EE19A825A295F3B81710DD67109394 H_OutputA = EAC8629EB83954A81E85A089A1A1BD21EF86AD8749F25E04C55D307367F3D3E9 DRBG_SeedB = FCD10C17EAFDC1BC151426A92DA86CE3EB3D0F9AFDB6BFBDD1024E3AED386537 H_OutputB = 00BCE40A9B6FC366E288FD052EA444633DC57102D11F7130BA95E8741BB73A0D SharedKey = 22D066A817D93724E30493F734C854D8F085C35671CFCDAFE0AB81ED4004E3BB DRBG_SeedA = E018E674C966C3D037721DEFB1D26A38D432250ACA814E286F6D1DE5A758EE46691D96B8A9AA696714F9C9C828A36D6197DE27D070EC886F1E37CE2DEFEA368F H_OutputA = 9AC5FB541FE0D6C6D0712E8AE83BAFA5B47A7C08BC9F23F4CCA4295BC214B2C9 DRBG_SeedB = E987866B21EFA0B1A746CE08E2625ED5C1FB0EE66F81AE5DE2E558217D149F00 H_OutputB = F5427C7D43409DFCBA7AF2DA7F7916EF5D0F6C9BCBADB29DE2DE7D0E522DD3AC SharedKey = 6B6E655708BCE9769107DC41DE011740DDF0332D46A8D1379897E1096E49393C DRBG_SeedA = 5790BA28998BFCC2ED05F6A9CBAC755886FE65853CCE6E85799D9A2003911F3085DF41E6C9AD94B06C707D68F5ED19D10F7E35EC112D6508BD909AAAA08BDA3D H_OutputA = 1AEE123BA5D2E7630EA3D0C4E86CDAFD59FB170A9EC8D2B81190CC4D2B80C9B0 DRBG_SeedB = 10AB8BF1295BEA0EEA593EE265F819D56CF1422CF39CE8DEEA591781016B5140 H_OutputB = 1CA8F844C4C2730750DC884DD434ED98179E3AFDD14A4C21569D43E8E75FFF57 SharedKey = 5B49DFD08182D4D4AF6621A71058F0A0BB1DCB6896084012EAC4CCE71C03E0A6 DRBG_SeedA = 8318DE4819294932C659B7577138D7B8084321B76E71F9E863C76DAD150FFDC3D09C077E6678257CACBB56E1FD57D2AE5BF59A379D8D0CFDA629E4BF82F1B6FF H_OutputA = 3941942AE6019645666329620B037586DA5A13D3ED691F39BF01194916878966 DRBG_SeedB = 5E698A326B47F2141D4A4340C8E660A7B376BF83A0153A6ADC89E5F3138C043D H_OutputB = 158507FECB1FF491F2418078522235E55A384811A46E3EF67ECDE2164E8422BA SharedKey = 748BD4AAB088EF35A42D284B0C68CD825DDB8463E2045EAE9D7E5FF6DC1684F9 DRBG_SeedA = EC60B11E35A8CFF147714AA873AF7808F437F445A40AC931945F42E24FAC56A35F20EE95837222FC0DE2ACFFE7F52A746B227D0B9DE22B6B49330A2091314D34 H_OutputA = D3F9B57C624D14AA925A7CB2C6004354AD9BEFD4ED4B2643A70ABCD928E6FD66 DRBG_SeedB = 69A4A028C9C2A970D81D6B4DF08A4B6FB6891275F119E8596E9479755B570315 H_OutputB = 117DD1EA7708EC327C8AF5B106A9797C8029B4DC36B685E0282A4B10219AAC10 SharedKey = 0FA801F73BA636650F16A0405D32739CE8E672532FB2356A301AAA878F4B0113 DRBG_SeedA = 84DAE4ADA1854B764300EC730BE18DE91A73CF53541D608E1A1696871B45E4EAF7867AA029E759378388A749E1C853DC02407D80B5FCBCA497F240F699860087 H_OutputA = AEA9FFD3C4D9765908DDFC45CF65282F95640AFCE67CBE4EAB776F552956C274 DRBG_SeedB = E83EAD491D6E248E877ED4E028B2766FECB3660EE45B26B3BC3DD5EC2EFBDF21 H_OutputB = 153E446B72B8ADE300B3F597EFE515798F525F00BCFEA45A5F545F09305E00AD SharedKey = CE7C8E3B2D4A89ED48901E6FBE4C8B25F572E291396A0266B2CFB462591BC456 DRBG_SeedA = 48500C791F8C5F898E33DD0C97BCD29905F1AEAED456AA0BE68937EB356F1A9197DBE98DEE0EBE048527A4F039BD79A254BB1697D79ED91F12B32978950C98A7 H_OutputA = FB0AB8257E10794C84BA2094F4B20471BE4E3C70947BB118092C9D8D325203AB DRBG_SeedB = CBAAC08AE002C95D01ACEFE4B326A5FE5BD98C7AD56068A78F4094D3447767BA H_OutputB = C0C2FE77BC99FB965EF6F05D51C79EA535876FC3A9D38CC01C92EF32F3E5CCC3 SharedKey = 29EAB1FDB54B83D201AC16AA49D03D65C2EA701513BB23A4CCF71520E66FB3DE DRBG_SeedA = B2B85484D6B006F42A41D5B4D318B4FA11490DF3E0897E9ED84EBC5C18B1219FCB901069E1C18FBABB1696D9698E1ABC0E41B4DDDB5BCDE4DA612FC0D29318B2 H_OutputA = F0164C05343E08359E1AD4CA0548058904974855ED5A99AB26513C0BCDC22253 DRBG_SeedB = F3D6A1F0FAE07D0F3357E3C48377631FFB1752C7D08B8048649A31C256EF26D0 H_OutputB = 7F84C03985BDF6D64A76636897A8119593EC38783073737C8C5E0104BF41A393 SharedKey = 4E1AEBAC2DDC6D54EC1FB417635E51BEAF518DE57981F1E3412DED2552EF61F2 DRBG_SeedA = 274B1239985C344067284AD33D21FE61BC1D0569F82B4339EE9BBDCD630A288F11966DB8E74CD2607331D032C5591C1CEC57483D482FB2BE383F8C27127BB22F H_OutputA = 07A12D99E9C002E15656E3CE2AA8FC24683913A70DF13B039A5977FA7A4CDC10 DRBG_SeedB = 2099529111B80A71F7A89FC56D9A8A50615C2FD486B3173FFA03338C81209DF1 H_OutputB = 2EA843852F53979879EE6B2EC5EC09732D12D202D6F8814C758266328D27ACF1 SharedKey = A8B24CEA80FAF3C324EEEBED88CC6D4EBD4371C2BC78C682CB264460A25D0A14 DRBG_SeedA = 9C44444671955112C974972AEAB07FCE04DBB5DB4A4ECE586002705B6AD9F77C5799F5C0AEC33811508FFED3BA6F0383057D8578E7D6ABC0E7426ABC0DDF5560 H_OutputA = 24EAE0585218704F463EBB017AD70FA5DAC0FD2216E4A2769FA0361D5291CD33 DRBG_SeedB = 3B1CCFA7CD8216DD0DFDCBA72E3A39864492E35142D5FB92B207F6E1798F3632 H_OutputB = F0002866F1C6A86C8A5B20253309800934AEBBF131469F61287F0F4215456272 SharedKey = E0750BE063572A62C0ADCEA48A66E5FE4AD1F7DACA479F3B93306186CBC627AE DRBG_SeedA = F4A8958D9DA399C41DC0E8F3190DEF0F5F7F66DEBA9AA0C4624463CB5F13C8D189D16CE213A5BB6FE5E90E8A60C9C36DCE4F003CBC8004F4A08BDABCD76C0265 H_OutputA = C41DE14C6E3CC4ED99B427B7B3639E7EE75A45E2C6481456E2F8F35E8895DE41 DRBG_SeedB = 24EFA64F662A2695A1EBA8069E4181DA2AAF1EB70F9554FE0E05ED3CE02240D3 H_OutputB = CC3198922805B153C2E85D50C7D9DE3FADE71F7A7CDDD77109A5547E0CB03BFD SharedKey = 624E8204D1E2C01901DC89081AFD988B02DCBEDE97E618BA3014EB6A474D64FF DRBG_SeedA = 09438F9669C84FC9EC46781F13DF53B09B36D9657CFD2C7E8A05537E25937CFC0F09D6EB4ECA84C69DFFF0CCF7031FFF5293D584643651D97A597FA096CB5F02 H_OutputA = 5D61F740492504D1F2F05497D0E83E471C9060058078AE12AB5D4BD1B52761CE DRBG_SeedB = 6CEA0612554E5C916E1E07045759F87BB6F4CB6FA711328DE868A968A0C7CECC H_OutputB = A8B4AAFDE6D944D7A49252087A8476B87BDD3B4E6CB5F6FFB8BB1A4E31114C32 SharedKey = 79C6221D5E0A53ACF849AF512B627F02DF1686CA11B6377820CCB1F10F5F73D6 DRBG_SeedA = 51C83C235EA9CA9BCFFAD40861910B7D0CFA8AA0169A65938D98F99600A3A5430B00977C4A071E2E8C72B4676519EB818615BD90C4E7DB8F3A265E12239DE829 H_OutputA = 59D52A562FA16A27815DC09521ADF1B526BF99F06294D4BBE57BA1DAD9C8BC76 DRBG_SeedB = A7613BB891CA83B32C06A4CD777D5FDDB98124E6D3F990EAF5DD340C7B56ABE4 H_OutputB = BEF9213EC79C7ACB7964BB1A3E0D5217BA79B7F0B6116EE3B2BEFE16078F0356 SharedKey = F833FD6A82D237BE07E80A984E0854D470077CA2EAA0D4AD252F70405D291D2C DRBG_SeedA = CEFA0C1E13D2E25D1A166EF7408D21D2329BCB3A84D9D0484695FD006D05D0BBD290C8CA8197048CC883E5911E4BF5FBA412CB7215AB040CC4C7E82A7E67F269 H_OutputA = 0D58CB529A9249916ED84F7B8FD8B939DDC6A0EA8FCCE11512FDA6CFD721811E DRBG_SeedB = 186DC0CA083716C1FBE0F9DDB5852C2DB3E9B9BE9AFD09E665276D0D85773F70 H_OutputB = 7D1771DEB573FEDD1E5DFD7C9558F0C5BACC51831580BDCF6AD07E2B61209436 SharedKey = 0E92119FA1F2D07D5F6D64CE36E3E64A08AE4B4348A3C5EDB7E85DB888278B1A DRBG_SeedA = 4E8C44892C35D682154B4E89175F4182DC7FDBB8D831A4239EF72321B071438BA270637A0105670B9036B00558BC2562911EB35ACB3683DF0319333655C4E35D H_OutputA = E882DFE3DC314207C5781712686F95805F0006F44EC27E0C25FE266970723C10 DRBG_SeedB = 33A92A5FEB35CF2BE98E9855EC2ACBE3B1902FF879BEDE858DE9BC8CCF329BDF H_OutputB = 5DB27085087B57D3F2C1F66B2EC0B22AC5EC935B1AC037EA2A23347DBB14BCEF SharedKey = 1A80BEC90D1DCAEA03D753952506F9EED1B99597192E3F0E46B3301F6319ABB5 DRBG_SeedA = 37128A0596E437CC1B88DD46BC49B23DE4A548580C3C9A07666FF5EDFADF98E4DDD20FB013E356C3EE7CF71B7F4F25992232DD13FE320D112CAAC175AA7B8B2B H_OutputA = DAA5CF113D3FA0820BFF77B60AC1854A41E372742D77F18E4848A3BBF409FD9D DRBG_SeedB = E64743F8EFD60E6A807DBEA10A69D3268F108F884AEA52C69583E604AFAA7CB7 H_OutputB = D290DF48820BF9C3B7FC9071600DB7B81E32B86EF1C6D2D1BE149A25503EE44D SharedKey = F1D958049444681B7295B02EACA4909A29367C2AF7C0177102A30ACD41EDC28B DRBG_SeedA = CE95AC8348273E2354AD85C42D79A0ACA91B3ABD153E4239CB945E096F568A90ABC07F37E819C9170AD309EE36D1658A15530CEDB094CABD976207FB3CF9F4CC H_OutputA = 4CB3EE7C78204580CF4D66C57B79253760BB2C7FCC62A731ADC80BCF727F640C DRBG_SeedB = 56B9B2A37852EB82E76CA0A74A5DA5021E5FC29329813CF198E75319110AAB1E H_OutputB = 01E246A5E13BC3A18BBDDFFDCB901524FEE64674B5DC330CBE4B50262E3FB58E SharedKey = E8CD5DAB06D3FF056C422D87C997B63466AAB4CE27266D0AD2FBFE19FFE3F420 DRBG_SeedA = 65E85002A0F0F09F67ECC276EFD57DDDC127FC5075F7599694D1BA954A8331EC0BF909DCB81B449EDEFC161DD8F6FEBC8F43F6A8F632972CEF068F3DF853A2B4 H_OutputA = 44A37FDF80AF38DC768609D79AE6CF42EA3F71BFEFA3A46D915E7081D06BB1AD DRBG_SeedB = 68533BE1CD3245D65B3C81343AE5284C2E107D472340229D516306937B1EFD58 H_OutputB = 5954F322C1455FE12A5C59D5EFF475E46605E57AEC86A5A7CBD5A713CCF6EFC0 SharedKey = 2D3CB42F7EE95D727A20927A882857535C02D855CF5079DEEF0D1A31789FACEA DRBG_SeedA = 448297FB50905BCE5F4AFA84BD431B0EE6B48900BFA409C925FE90E420728F05FEDBECEB7CBE1B333EF380040688EF1A611567F9898A7C2FEDD4304CE23EC402 H_OutputA = 2C093847B606270DDA70A4DCFD97A3010E932E2A1D901C167402FFA1BA32713A DRBG_SeedB = 3C8049FBC5389610819811983EE8745F78B589B828E5502B19B4703CBE704597 H_OutputB = EEE599907179D75DEEACD634E48CDB6920517616EAA99BC71FC0502AA5DECB53 SharedKey = CBFA475E26964425A281725C3AB2C1C3F4AD7D9EE31B96FE41596D012395CA7A DRBG_SeedA = 3A81AAE4F828A1C0C02D33C8FBAD7EF068EBAE5E337992411B20699C1FDE67DF7F72694046088240C3B7A7EA55EB599C06A1F127364382F98FE4FED3D1A3BEF6 H_OutputA = 988CD4BC51CAC9EFFDEDE3B9B90090E4D1DADC334C161421EDB34A177E482A0B DRBG_SeedB = CC8BDB8874876CC42B9E1A0AE2CC55D2D79E6402A7DC607907CE04D826E2A4F6 H_OutputB = 100D9BB66588CA021CCA953876E89EAB5D33845FF50ACD76374A7243B7FF824E SharedKey = 608421BC459836183EBAC28DD187DB8726BE4B0F464D1ABD18FEC83C9EE9C5F5 DRBG_SeedA = 8FEAF71760D856710B05507A8E4CCD7ADC3A213B4A8B83648653C49C512A4508A820530C9ADBCF0066657243320DEA3353855E7CCE470B19552248A67AAF1F4E H_OutputA = CBA5A9DA4920F2D8B69E7C191AF07BD935E92ACC1AAA0A1DB67974BBD78ACC94 DRBG_SeedB = 3AA72FC3F607654AF86E7E53655242026808D0D9DFFAFD658E5B00901B3162D9 H_OutputB = CF6E30A12FD3AD01ECF72E872092406FB5766025989F73922E99868D8C7C599D SharedKey = F47F26F89FC5AB4C3401A9B0E37186BA70FA00CB175E8B39EEA35849E58B21CB DRBG_SeedA = 98480E7A1E7C7A51A1A08CE6CD7C57C51246D6FFA334BB6B9AEA2C933C4678E830776462AA88338FC25691A8978C62CEC1DABBF91C56353C7708110EB1BE7F5B H_OutputA = D38333F9C117FC7EF02D99ACA98E9C436BC84229EADA332CB565977FE6D702C7 DRBG_SeedB = AAAC71731103D13A78B25F1A3CA99DAEF4DDDB85C37067D4F7014F097DDAD412 H_OutputB = CCBA9F12DF8118D1DF45371148D41B65D56D212AAD3FF3FF71BBB7C713D56020 SharedKey = C96CE0ABC0EC2739687C02014C2C5224BAE0EFB9156630CDE3A61F6AEE3928DE DRBG_SeedA = 3FC0FBD127EEC8823390BF3B145DFD3513FD54D954B9D09EF809D2BA0B6EA2F784575FB3D68A0B4E54CA0A0DD3E4F8D1D4A00FCA92A7BEA9716F26934DE580B9 H_OutputA = 79EDECF88B5841F5EE3DCE14D46A0DE1936F3C64842AA6B59E2DA7B561C3144B DRBG_SeedB = 81529CB2807D3753DB4CB13E149EFEEFCCA203219D3A97F83693D17FB3EE932F H_OutputB = 128CDFE787430816EE4E6611AAFD465F1EA5DC148309F05F20D09078C23E2A5D SharedKey = 5105D4C55BB9B1C2AE7B81203A28850C89B28C5801AA423383708BEC0177EE8B DRBG_SeedA = 8AFE5E39A6054EB1ECA0F5F96441F50C3BD50E7FA2D2CFA18378544F1D8ED1CE2D77CD8620A697D9F844AA6C5874C3604B62B4086991B783B680D411AED29E2B H_OutputA = 83025E6C7E92DB712DF5741C3F4E0D2CD4631C18F5A81FE65A2A0B48D1B5B03F DRBG_SeedB = E1C087120DF7D7E81A16737ACB3184F12EE8A8D80F3E323D6CA598D78F976FD3 H_OutputB = D261FBF21A7FE23DDD855A09DA31FBEB95DB5133AA5E11016B65A86F165C09AE SharedKey = B39BE6A45D19B70A28283AC68B7B9D8B639F5AB472317FE97AFC04DE2CA58226 DRBG_SeedA = 49BDEC0983778096C1A2DBA30A6983E0EECF6786F50C4835404DCDAE5BEFCF8120F74403D17FAEE80E44343BA96D6EFBF24B169CC2BAF62BBEC94A14298C9038 H_OutputA = 12F1F57F43F3736BBBBAC3373EF36CF14CA5864714D8B778591988E7ED9DEF95 DRBG_SeedB = 2C1DF4FF2CE9A85CCB4D8048718BB4C40CFE4CD83953F075596C5F31D3583228 H_OutputB = 1F6B41B1EF73C9F14A8A21F9D1834185613A5C74D8431F74A55515884051110E SharedKey = 1CF6D516E0A31F05CE3E0E07234D9C372E1E288637730579725BF9BCC016E28B DRBG_SeedA = 046E4BD035EF1ACAD1BC3DE9AF6C207C4D24BA91FE7895E5FC90BFDBFD670A0250B531F72247467FAB469899311D307231F758FA2B3FF6F5CEE2FA36DF93FA52 H_OutputA = AB42F06501D250717B3E3865105B5BB059F91C48F7D367DECF0E4AF8E7C69828 DRBG_SeedB = E9D38B9232853A5F7952ED32A0AE7A5253403605C095A6DC1B5C3F6E7A5C538D H_OutputB = DF2D12A7F577527DD4E6FFDA2880F329BF31DB9030329AAB5DD60DA67DFE9844 SharedKey = 36741FE3A13DE35B37E89539511C225FE1936EC17DD2504FB6C7A4ADFED6D98E DRBG_SeedA = D1ECEA0D1DE9E61BA117841EE612CB43CC033226A7F8B86058EF97939D80DCF96FADD81EFB8FF5276FDEFD9913126136B417A762F6D3952560F756294C289267 H_OutputA = 60C58F3DB4334A315D99212DC89039E3D753C9AC0D4AE40C7996E5768F054632 DRBG_SeedB = 6FF05A0DA2F74D5D7B01757457B152D4864B54583AEAEA04E303CD64CF4E9139 H_OutputB = 258279A000FD709FB83635F38B2FACEE3511DCFD6649F8E2656162E777315D26 SharedKey = B48B2AB2EDD8BE4D2FC024F80D8B61DEA103DAC5012DC4814ADEE9612CF6BFF1 DRBG_SeedA = FE03CF52C2B8E9F959837F5C7AD0FC85862596FE76106027D2E04CCBFA1C508EB745B1CBB1E586A3BF03FF6EA4C2F6891D5986021A41EA46B937EE7D7C9BB066 H_OutputA = 77128D2314E1C04E8BDA78DEE81F6604F917A1A59BBCC7CC4A5500E74E3FDC67 DRBG_SeedB = F4134946731C393581CB2762DABBEE5DCCBFD986279DC14D765576BEB227762B H_OutputB = 52BBC9EBDE46F0677CBA6ADD1D70C2B52751DF000D486E15FC551F1A0BEBCCC5 SharedKey = C24C29316037C1A719065CAC422F5741573B7F8B7E10A03D397790A2DD7EA735 DRBG_SeedA = 334C37DD1CE6D0EC727FE6B9B69487282D2EEA62DCBBBAE58397D8C27D9534E24CDC5468A0C07B88368BC23856E5C5EC095796D0BFEB454112C1C2CB216EA3C6 H_OutputA = D64ED246F601A5E49EC6AED2A3142CA8E06E18A73B3BA207558980FB00388F95 DRBG_SeedB = 8A594AC2B1891758E985E17A0DE3341D4AF9F2F875333691FBA457A596D3E816 H_OutputB = 1815A3038202FF835054C7CDF828653816B88BA5D31F32581D4A1CB6CF4D4B07 SharedKey = BBEECA4B6D49E091E84C6DB56F845A738AE2445BC21D02BC066D58DF6357D32D DRBG_SeedA = 9EA7828849C502FC885AA96CA765B9BCC9A024D66E566C3ED68BD71B8A60D51CEF01F2C0B7D8BCA8122F8A35EEE85B63D33D3C4808C5803E913B711C251FD91F H_OutputA = 4F3FD49B4B309E582412EFB5F01A17988839A11112F599BBF90087805246864D DRBG_SeedB = 97514B539389F85E6521C2DF177A28BD26EFF1BD17FF07348855E00FF7DDFBB2 H_OutputB = EAE4726CB6D5CB3BB8737415E3476B0D7DFC5023B700176B96ACE2AC0C21DD16 SharedKey = 894A0920AD08F81088A1FA13F32F5F12C762368A358223430EE01FC3D036B73F DRBG_SeedA = F4AA9DA0F1E81F13968F76C895B02609FD164D1E1B94AF6096D5208714039406E2666DD711CD0120E4B51BE1FCE4339652E5B2A0950EC14C63DF3B6FE5166444 H_OutputA = 36A5199A11DB52D0983372218FF09AE6F7FB3F398C464E896F70C5E69561803F DRBG_SeedB = 3D651A2E8A57CCD3B3B1212C6A2759EE14B4207E926178F6BB849AEDD0D57118 H_OutputB = 717641892DCE7BA3585458F1E1CDBEFD16EA250843DEE37AC485F70C50786B01 SharedKey = ABC97909B1124898F8A47EF99F142E887C907E896AB3C5F289AC8128DCC3C022 DRBG_SeedA = DBD0992CD32DDC997C47F6334D7D694411ED479E06D486DB5971788948CA6C88D84244C3107638B5C90265C0F0F76223F00205078CE1860597A8F00F8A8AA66A H_OutputA = 84C54B948C97D1ADFFBA4E8BF12A50CE02CD99AE7739F708F89E949A1FB7C424 DRBG_SeedB = 12F3327DFBA528AA2441E80418A5FE703E2A93FA1F8CE6A3D56A61EAD4BA817E H_OutputB = 324A1C5DC030215A9F9DEF5D58BA5E225DA831CDBE3EA029D748E61B5BBB8C31 SharedKey = 6438A6E671BA26648B45054E2A6A940FB950FD74D49793F1CA1FA64CEDFFA2FA DRBG_SeedA = 2167619EE7ADEEC8505B9FA23A86858CA60D9AE641FFD97202C2758966535411BBC1DCA0C6AF864076AC7F0D48D8B80FD7AAB5417253E72354B773810A08B24D H_OutputA = 50DDA3A5E50B411BA86DCD4E4A0A26F9FC58F64E7917DA6E2CF48B79CFCEA069 DRBG_SeedB = 616285AF19AFE9D1923E9118CB1CB009E5A4E71C954FEE0A17C81A8791CDD90A H_OutputB = 448E14868CBDF586883FE581399BB1AC9FF79BD7475E230237C29C9F6766D883 SharedKey = 51A869275B6B2F44C75F24168022657A73F3B30B10988426EDF5F44799B93239 DRBG_SeedA = 305DADA081D223D4BA4880D2A18B7653F254E7FAF0D2ECEBE7E627AC4C1945C8DA660596A491594ADA2227479A169363598283E415BFFAD80AF5CB2A3A62536E H_OutputA = 12C962295286EC7372804B9ABE1DC5245CE39C5042E467C591B4BD1DFEDC2C1D DRBG_SeedB = 0330573CE4ADCB19A5BA90FA1E09D740F6594A37DE9F3FD37908D4BABAEB35E2 H_OutputB = 90E1FC994E52832295B3097D99F1DFA42BAEA280427457FF64CD7C76BC39AAC2 SharedKey = DD610FBA4A0182566515D580293B1B4DE05A50A08F4A41DC00016037CF38CF81 DRBG_SeedA = F0C8E886FE47CC20084F87021FED6DB9EBFB426CBDAB1DA2E62B73F696840F35620CF2282E00584BF86DD709867DB52656EFD52F01C7645074009CFE2F2FDAB4 H_OutputA = E569AAE8545B31A9AA1BBE11C3F915C220A5352557006F6C6AF5477C56718132 DRBG_SeedB = B6E1BD933920AF65571F4E236B4BB60FDDCE429867C302FF7284D514CA35140E H_OutputB = B3292A7E5C27787603F80C85521472AD4E2AF84420E99BA45E68E7E3933EAB81 SharedKey = 812E82809BAAE8177FAA83A01DC09A27D7637B18E2C6C05F0BFD15632F37603C DRBG_SeedA = E8E10463BA7AF6A72B037174A9908885544E3869D2A7047E500F7BFAB175B8071C76B5BE5FD046C2DBBC25C9B7DA0AD7302B235471373804BCCAA60520248909 H_OutputA = 42436B05DB55894E376599FA591E0B3A94918FDF0BDCA6E166B8D1AEA1A5BE66 DRBG_SeedB = 8F9ECCB617962941BA680086D147821929BA1A83202350E3F07A45347F0D3461 H_OutputB = 1E7FC9F18B760CD4A2E24DF9AB53163F39A132ACBDCB2C0C863386185581026E SharedKey = 118EE0F16820645DA369D479E108256ABA694F2A1490441341E49B381699DD11 DRBG_SeedA = 317B55D90E97F3C15A04F987D0FFD4031E079A7A63D90DCB81258C55AB532584FAEA1F97FF5F6C77F23979DFBA8DA2AAA9FF5682353ECAFF54A9E6639E7D58B8 H_OutputA = FAAA3B2C370025E50416EB36E73675F78597D9AC21703FDE5494CB9FC282773C DRBG_SeedB = 45424756E11112A4DBD4CE623676C380E2F8E7ADB91CF79EAD10449656FFB524 H_OutputB = 6E21F56D1AE4DD23D8EF6B7A22A4225830F333F16A0F15F2DDDCE3878A39A850 SharedKey = 36D22AFE5F44ACEAFA3C7BE7AD69CA0B91B2D6857B156C7771BE69109A0EC5B1 DRBG_SeedA = E76E0E295226C443697A311C84E2AD3321C13DB098B625EDBA9D1B82EAA2F5A46F820B0F7C906E69C915FEC45A8E2B370741251AF5A00585A12C83841D99332A H_OutputA = 67A3E1759787EC829C10B084A335AFC13C976582A37B23DEAB59A94C7D43090D DRBG_SeedB = A7BD2D5F0C99DEF16A734E802765E2B5BC53E4FB56793B171464AF7E573E0485 H_OutputB = 9298DDB7015A60D52993BA9CCE3930BD815A1763C7B95E3D26DFD891531630F8 SharedKey = 3E15CAE8717F81BA4ED64873B5FE51B3AF453A819F1F82AEB5F032FEA14C5E9C DRBG_SeedA = 5B9A36385038BC2468EAC493D6A15ED283951AF6EF2F12581286A215FB7C98CB387F2D992C0D7B2487AF9A29064694C70D0E26D0C2BF2610C12FD5338E77602E H_OutputA = FEC9669A383435A134D07611AF5B9DC3EC7DA43CE0E26BCC9BE9BB282100705E DRBG_SeedB = 1A1E034379E2D4215AB8A4ECEC78A3F43B00B51F93AF474B1038068A382CC5A1 H_OutputB = FFCE04ED83D98BE3A810E34892867C727CE1206FA22A23A73C0B8A9212789944 SharedKey = 2C5DF498956160DA2A0604FF17645D54F73A048B8C0E16C54534EBD3408A3764 DRBG_SeedA = 03320F43D6B74BB3A39688A87D2B300466CA6810FC744411C37CDFEF5D0561B3413CD6CD62D20CC85EC9AA5F8EA071CB4CB5682838C7E3C1306059D4714C6AE0 H_OutputA = 5C95A935EB2740A8632B5F4BB85FB1CDEC3BB7FE5AB443FAA864B287787D0F63 DRBG_SeedB = 4FBAFB8717FAE32902FAD12F8AD6B6497CA56F71E7B7FA1EDB2AB6A070D268C0 H_OutputB = 2475905E1FE3F25920AEA1134AC3639DF8D683B3CF708BD7AEFECA3601C491E4 SharedKey = 3B3582E29CBB358B70281E1E559EE7F01827E9E91133A2B1CE08DCFB018AAA83 DRBG_SeedA = 47EDFB4F718B35D375D513479B3D0C4CDDD110FDE55B74E75E0C99C0011D7B21A3D19E958940F2A32FDD86C4C3EC03C6D61FD63551063F585FC5D33DB3BD6621 H_OutputA = 824B9627F2A5390864A60BEC2508F1CB25C8520B4838E71EE1D5399CA542162E DRBG_SeedB = FD50268FFB42122F8902600A1F139AD3D275CB98DBAE24703DE175B8A3A45389 H_OutputB = E27A68FF37B3DCE99808361D7251424EE0B5931FCE80C5A4E0520531AA20D0DD SharedKey = E05F038A1BCBFC62858475C803817E17F8F8BA9DC68FBD3446EB98457782E28A DRBG_SeedA = CA4ED6ED3322E7E57FD7BBADD38B765FD2C271D295B4B075ACE3BD387DD6AB58D3E48EF4AF1A545FD4E7FFDE1FFCF29B3F2E815081F50FD56D9668E9C1F85223 H_OutputA = ED7E77AD32EB7DB223EC6E58869B0653A7B80323CEFD7E0C825D3F9A55E4E431 DRBG_SeedB = F563A9A9F0907196F24D2C3FEA279AC82F3DC45AB5B036E2C0DCE678230AA6AD H_OutputB = 84261E580BFF71089DFAB1BC9A528D43C5B87975F356C656DF0C74835FC917F3 SharedKey = 1E4A1E2BEC5E0E845757FCCFCA3CC634CED70AF43C1109194901BF3212353083 DRBG_SeedA = CEFD8A688BF56AB75AF165374FDB6D406D99D76E47064230EC1D3F7C230DF12917E4B671806EA3A62B24B79AE2C829D470271A05F7AE00B868B2EF4A3D41D67D H_OutputA = E42033CF0992C6D3EC93275CD4CFAC4B94CE199EA1A46B311A9DA9518921020A DRBG_SeedB = 407C0275577A5348F40D43E37CAB67F473BBB20AE784208BDC036BD3243F3124 H_OutputB = CED67BAD9C830FA4AA9CC47E0B93C378B5AA3092C6D6A4353A0D48AF1854208E SharedKey = F7F3ADE99AB10360965033166AFCBF4B9C2287317497ABCFEC690792786FDFBC DRBG_SeedA = ECBFCBCFF82DC939775C46BDC15976B845B4696199CDFB132B64A5B1FF7DB211C80AC92C82FD8C85F5E7CAF2A15C7E58F0784DB2343324EB33336BF0C3746876 H_OutputA = CD14D5E2F513FAAA663A2DED057311A6DC90AF2FACADD380FD911526D261A09D DRBG_SeedB = 1B0D2F61B199F7E90D27AD87BD35F0429A1EDCEE1B8E5360296D8862AD6D5BE7 H_OutputB = C5C719C43F7E7AA0350385519BDB024CC4E73F1C29E19A36C87FD9FA0F5B2D9F SharedKey = F977432BEF96B791CE85DD2C4FC444C571473A77C8CE72081970A765AEBC90DE DRBG_SeedA = A51D4E6D84DA07C0C5D5DFB4122E9F2FA85392BCBA2AE0262D16B865888AD1FE02D1DACAE3BC644DC7D3578B50C7574ACED7A46DCDF1A5C878D7C69240F68186 H_OutputA = 3B711D9F12CE0C41405C5B532F69110A692E0F8662F753360FE0C3212E44CB76 DRBG_SeedB = F4DB6432DC27B616229D49783A9A6C45B0D37B4340083EC6409BC850999A33C6 H_OutputB = F8347584AA7204B33F79A9754BA03026542646A58FD70A4C381F8F5BC5D98FBC SharedKey = 3FEF20A5DF496DC4C6BD95EEF728FF21226C5356AC06313281B751ECBA3FEEE8 DRBG_SeedA = 757E6CBFC27E2701466F6DDBD45F48052E5FF5C0D11C13FF4BD7764557D6085F6D51488B23EC954F8D8F864DAB58BE769A1B72614D8846502EEEDABB728509F3 H_OutputA = BC546159BE3DD2C606568C6A833E0842436902E2A0E35E109F1956BF836DEE8A DRBG_SeedB = 9CC583B6EB1A9C07BA02C87B18A7132C2EFEF3C63B573E401FF6F30D1F713FBE H_OutputB = 74AFCEA4367B297790E1C8A77582F307787FEA1F11FB4E9F0F9E9AD09D9A506B SharedKey = 6A61DE34B7A3CBD6FA70D9D4449FE981B7A8FD3683939FDA1A2332D0586E4717 DRBG_SeedA = DB3F788F5FE8C064CE937CFADEBFA93D568C1B0E00E0EBEE6AE93FFF9FF95B26606523B4A3A592240AA1DB242CEFFAAFDD0ADC18898106F738CD9F341AC79C1A H_OutputA = 7CEEFDE0713D09973D8A54A67779DDF4EAC7D95BECBF41F688E112BC2190F24F DRBG_SeedB = B6FF52EE8BE8EE1F6F97A01AFF5CB9CD0127961A04558F15552AF66E24E099F0 H_OutputB = 981D8533F49D46F0B236F4EE3E76F5749A63788473870793712DE21CB334031F SharedKey = 88F931298C9E6D5E1E7786343222C3B8125DF4B5357727D4F8D7D650C5AA95F3 DRBG_SeedA = 4225C918C88475366A3F6B34BD4FD7E10B1A38527DAE12A2CEAA0C137D06F80C902F467DFC7C08AE368D1D4254D6E9FE5653B8619A87B7B3A91190DE368BDB31 H_OutputA = 8B12836EABFF1564A467E52706B1AEF88014712EDA1F0AC3BC38982AD269DE6B DRBG_SeedB = 80A568DCDA1AC6F6CB37EDF5DDDC183D5DF2E5E345E3D222D80208FFD5733C89 H_OutputB = 630537A451D20876AB78DDB3E3BA499027A08F03E04C0B1CD121C0FBAB4271E6 SharedKey = 8F1FE2526CCF282F284142E2245E2454E7F8D22B325FA2B6B1472CF24D8E6E6F DRBG_SeedA = BCF7B033BFED21238388C169196BB20DB0C80BDE8860E5CB87071A3A49E01FB90AA97494B056CB1BA8865ACDE6B54E6D5AE9A7628A2B01C07D4B907093279675 H_OutputA = FF1CE60445799C2382B2BF5E45C627E2A1D03C955B07D9A1F02D321B03C62F19 DRBG_SeedB = 0041BF61CACB651E39CFC2155C29F3DC869D3AD12851AEA147C074E3E66E280F H_OutputB = 2A18DB39D80C35FCB1A6A63256B3BB05580A78B4D031410BF23EAC6D9CF80748 SharedKey = 9AA85045B44AD6ADFC30F4F7CDC6DFA4122D7B3249082FF6AB4C3F0DADEF5A89 DRBG_SeedA = 598E02F4B2436D444C491ECC2C809622729E65C933F4CB519C3B37C86FDEEB7C76C6CDFA873B9E37EF8BCEC0BE36AAB664A836A7A8C16BE988756BEFB24A64DC H_OutputA = 4673AA63640730C1A945B2D0F7E9D94DB05CF8B530F395A8B498C4C13A2BE97F DRBG_SeedB = CDDB6B1D8B2F806F1D242502751CAEE31123D5CB8012A1F9F66707A135DE878C H_OutputB = 85340686FFCDBB2A81E056F72FF11983E001A8296F574F432651A669B5D0FFCD SharedKey = DB61B2964C32A0F7635C5B191FC8A96209961D786D3D19CA1F0E3ED504526ED8 DRBG_SeedA = F8D41A358AE50ABEBC11F36DD3B3F8430A7E4EA0DBEE21350374189FEF9072B1A3BB60A4061BDC62637FB82AC2051719D6D524FD807988F8C651A2DC6093F9B0 H_OutputA = 826079E5C40EC4F4061F9580C176930C81B19A6517008E1AE049CCE5B7DA69AD DRBG_SeedB = 8CFBB3651CADBD2A11F704AFFF12856D91C46D5DF1C29F1CEF40939303F3A63A H_OutputB = D3B7EDCFDBBE2155B0B25FB5EF52E0365ABD004D237E05DD221584C14CE5768D SharedKey = 6B0C4546F72C9B8F213279880EECB4D0C7B83330AAA227655D96010578B317F9 DRBG_SeedA = 8A26F89A3DE9C3EEA647FBB795B1BEFF070E12D1354DE1A007EE47AD728D11404D1861B1CE53887CB2981D97EC8E025F2B06E0763B08CCA6E6E834EA3D34FC35 H_OutputA = 6D42FDD9F797AB8DDF09DE5DCDF4FD2B7A24AFDD6B3D1BE954FB9A9C9A6A10AC DRBG_SeedB = CDBD5B29676D6381ABFE5613A89E661D3D2494D3E5D26374707F5E60CDE8D69D H_OutputB = 141B1A3332ABD6BC2E115473CD5EE0AF3CA4C4BECD7B8AFBF3B9B60A3C83C286 SharedKey = AD5FFC2D7475371A3582D36921B337AD253AA766B18DD5843C28C286C4F4E1A9 DRBG_SeedA = 19CEE4D56B6C1A3E91FB42DCA127DF4A6A9B05BBBE02A79490C1B32B0B5102117404A3B0074E97CAE1483C4390A172817F232326892A898ACD34ACB67FA0EE3F H_OutputA = 6131146E1B81073C632DC2DC72E1482D900FA308CEA6E445149271220B27994A DRBG_SeedB = 532E2774CC7A1F574273FB1C29391E13387209AC6258EF181940DE61DF9A50C4 H_OutputB = D7FFB3ABF3569F5C1FFB6B77839AC44E81F33037D27CC5EBBE981E5F83ED2363 SharedKey = DB71282B6CA5D92889ACBB15B64202B6E092EC55166FBAA3420F8B99CEF46F1E DRBG_SeedA = D323D06413CE0F8F30AEDADF1B59AEA45871F44D0CAD916C7F26E9DA1D39262329CA444A1158DC6308D4D3181DDCD4D7DBE30101C1FD1545646FA54EB64EF3AC H_OutputA = 197F58C8F43F71D2E7A11CC79EEF6657054AE74D0EF1F1CB47DE24C84D5B590F DRBG_SeedB = 962ED5E0A5B24977DD0E6542ABC510DED98CA237F8B29372C37F6D290CD0C09C H_OutputB = E3040E169BE2DE95FC4D55F027C3CBAC7492EC1D56EEBC966FF479988657352E SharedKey = 7DE273041E8CEA6A1F2DFCB6108A3AE7A2D70DC0AE1EB89E5825EFEAEFAE9249 DRBG_SeedA = 996C4BA69DD185F01D49C90260F447D4E19789958C1A669582623C6EFC22D30BC32564B5E36896739399665AD7D2B573CB970283D7955B425BC0509B9F979387 H_OutputA = 1ABEF613CC58E4768E669B4FC8E1993C9715DAB7B349227236E258C24305B709 DRBG_SeedB = 99DF17D13DD44832FA5C0103CBE120B01B33A071904A0965970D0F7DA393541B H_OutputB = 36ED8F13F05FA687E6F9735F9E8A8898E607468F089FCEB085B4C34FCE1C8848 SharedKey = 44C32A2153CED7FD45AFFAA75C7E177EAFE13336329A7CD887E99690DCF646C9 DRBG_SeedA = CA9AB360630C0FD0DFC2D235B73ABE519F059C831A18AED18723A167F5907DA6F46EF8DA946CB485AE27B9C4E53AE79517548C13F237283C01E2AB523125F3EC H_OutputA = 1B9029B11BA84951DFC514CE0842DCC2BCA7128CFEFC820DE5E4C2B8953EF8A8 DRBG_SeedB = 3F4FA44B10A43AB88737ECA6279BB585E28E71D40828A3480A8782C5ED5AF12F H_OutputB = 6B78A461CF9DD350C3D9ACA73A552ED59F7410BAF30FA294C6CC5775D8261218 SharedKey = CB148AC2059B95243D5F8881C235194DF7BF1D5C83989067A483EBAF6C39254B DRBG_SeedA = 44138EC58E86A071014DCF0615BCF2E17ED917E9469AF8D156C9A3FEE2DE6A9F5C84AC4313B654E8A5A17256B39880402FB7CEF957E791366F4F7EDB26755A19 H_OutputA = 17FFCCFC1550B279BB5971FD5A06828084AE09201EFD28878E21DC02FC451FF4 DRBG_SeedB = EB5039DBEE3DFC6FC8BB9DB4ECDDE565744CF3915F67BB0C2837702D2C1684BC H_OutputB = 54FBC61DD86861132C6B98BE3E7C71DD7F32DAC020EE776E310C9508533634DE SharedKey = B00FF2DF73B19A7431435AB33D4FB86B190553DF2E80D000EE6312D9158B74E9 DRBG_SeedA = 96046E215DA75E553892B0617AC05DDE6F87EF55657A26132838EF889016EBC4FE6D7FA305EACC102F5B29143485B0EB47D239028B6A2A7588B7505C446372D3 H_OutputA = 95E577B3C506AF22D29F6F4E001415DDBFEE5266FEC9166DE4645F0B5CF5B356 DRBG_SeedB = EC33FA3DF333CFCAB101813AB4AB06529F915956E9CA04EC5D7B119123F61A26 H_OutputB = A1553D3F3992B3D8D6BA86FAFEA815459DF12F5E5ECDCE2EDBCD0380D05FB5C8 SharedKey = ED2B2598CB7FF7BFCEC1DB0038BB0BB9D2AC6F0D9D71B1EF170C06EC9EDB9669 DRBG_SeedA = 936348EA99C7E031673C6F4C191EEB821A53616A475051A53E21B731CBD9FD6C68886D0FECEC03F70EBF59724ADA0FD93E781AAE8D6C810B951FE0C9788F8906 H_OutputA = 95CE5F3894C76D5B7FE793B342E8946BA03778DF772E3312A4A08A09A3250E08 DRBG_SeedB = 28C62B9F957041B4CA635A9ECAA6AE680C671CA67DD51FCC6FF3BDE24EF1F070 H_OutputB = 0558737F6BB37CF3462C82FB90A6D062C3F7A9679CB561CFBA196E0A312FC724 SharedKey = 3A4C123A30DB2B4E64E1E89031710B881F643C98E17D2F1E8A6EB15CAEBB9AD9 DRBG_SeedA = 5F0CF18D68639C2048D51D9A226BDCD3B8F5FF46BA548FE476D854C98C668AC0CADA49DB9765971975820EF9B1D3EFC27E986A3EB874F82EEAD61FB398E93A55 H_OutputA = 557CC284BDAE6FD9924DEC18FC039C43BC1CEA84F649B43FEBCF86C30AE2F122 DRBG_SeedB = 0EEA3CE940E0E7EA2251242EC27810CB7073088F80F8A9F3877C7FE2782FEB9D H_OutputB = E080E2C137B4647A6A359401DDBC456EA3F378F0C5245068815960EEEE648A3E SharedKey = 4A48E388A3A2144AA00C721FC3C3D676CD266ED5ED6D3890B3DF24C36EE27BBD DRBG_SeedA = CEB66392F0E47A3DEEBCA72F1950672B6551B6E2F60D3B9A6F2FB1660A9E0CCD6D8B0DFCDBF8155875C2D61A3582A8A4F6B3BBDD9E00272136FFBEC8775EB065 H_OutputA = 9EC9CB2D8D7CE5B5DB72930341C830FAF918E56744575D15F054D9516EA43EF2 DRBG_SeedB = ED5A29BCD64B1F14F11975D83555A6E93C378E995015008C48AA09DA1D89453E H_OutputB = 99D46A5B18BD8B443E11C080D618DF1A918F6B1287B67D8058A27B28D6E37EFC SharedKey = AA17556C3CB5AC09432EEBF0D490E38602C2919D1504A987BB2084C63C9DFEFA DRBG_SeedA = BC276513C574986A2663A62AAD94DE507AC057A0D6E4E0592F3D88F0073B7793DA739C7E6CFAB6DB331D24E809E02F1B8DD1DE1C3C4773C70D85EB97F1A1C10A H_OutputA = CD0A9875F1C1E187D2BE7FC2600CF2DFAB2A4346213A95424318B9449B8B789F DRBG_SeedB = E75943151194D100A9236F496CB143895206D6D78EC5B1F3679680EDCC0B3C3A H_OutputB = 56FCCF1E49986F2605EF6E31312E64F8642FEDA1FD41284F34B6E509A8032792 SharedKey = 7280AC61EB0879E7950467DF2109EEC770246996F6CB93B309418F664FE887BD DRBG_SeedA = C225DBF64FB791FB89CC0DC9C23BEA7D0BD315E72AD829FE1B5ED77D52C031F99EDF430BF61C4DA0CD4BBEDABBC8B8C4CD3A7D761687DEF36F58FF38078A27AD H_OutputA = A088DA078BE03C3E14A4A58351DCD7D262A66B97B043BBA34F47E22B1A7C7E69 DRBG_SeedB = BD4643E0DE2FF1B7DD9D92A0558D88CEFC20E23E20C1C033A5BA95F965BC051E H_OutputB = 7DF475C8F7417491B46C58DD2E3299A7326539B0808C7E9A4F0E0918B1DA2EA2 SharedKey = AB10EA0768C69FEE89EEA1E71E6AC7B65E60955E25A41B4F95BE73DC5163DAF0 DRBG_SeedA = 6E1E02C661A5087EB6CB7546CE87E44697C323CA68A2B0272D51ED029D1EC0DDF07E6F0C9A58EB19AAF7DAFB2724302427ADC8726A03B8220A3A30ECB119C3DD H_OutputA = A68F4A0FDC3803F70825169A6B1DD1496A125D56344D858EAB07766E2DCAF903 DRBG_SeedB = CF10E58E5DABB141436B76EB312DB4F92AA50747FDDCFFBF68569E046FFDC3B6 H_OutputB = 0831F9B10A7DB0D0B818A87FC809E75D8E0766496A465BDF57DE0E03AB1A2BC2 SharedKey = D615BB4275349E1E1639C992C5FC9D3894811EB4F4A4F87A3339F1B25F902C6C DRBG_SeedA = EA25D61F7745CF91C7C1C9CD47B96BB7756220C7E503723F96299000DB657474F43C6549F147BD76FD7E0D5D9B8AC9F9E38C04BB7BD494099A36E7976749ADF3 H_OutputA = B8B16403213F105BB97F3BA6E8B779286160216D70DBF1F7B11A88B5135490EE DRBG_SeedB = 3163211817CCFFB183683A8F22748D54AE51BB1F2E65FB21D38C466A5AD351B2 H_OutputB = 4E5A06610D389E3E15C283BBC46EC483A257CE14ABC6B0126857DB3177F47CFB SharedKey = 0225FE06A73B937B907B3A373035A01DD21BB56A7F9B1BCECFC00B77B0A8FF23 DRBG_SeedA = 8DADA97C46D35F71768B34AFD46EBD40D73B2A5E22B427003AAB5396F4A0F948A3C35574D712E854B334F48A91FAA8A59A1E5A686A68585097384A83D9FC3391 H_OutputA = B2CD76DA7B86DEA3F98DC7552985A508070117FAD42368927DB6912F6EAAE1CB DRBG_SeedB = 3C6A277066A3313D120AAAEA4ACA53FC5EA65FFDA4A1A14E9612355152A2220F H_OutputB = 19C0727AE1AFE18F8A3DD22CB1F6230A70F7E0A2105F2AA6B0709CCFBDDF11A4 SharedKey = 63F7B3ACCEDF1ED1E14D99EC0818397A7A4E5447F2AE3FF6A440E99664ACEC53 DRBG_SeedA = 4218BAEFF599B3614D6568F9D5972338D3DEC119B73E7FB82915B3ECF35D139D7C1AD3C925CAFCCD81B883A61BABCCDC269661FA081768AC5B1EB1A36DF5E542 H_OutputA = 60DB20237267F98CCFE28061338E2EAE1FE7642AC72927F99FF158D0D7CD32DA DRBG_SeedB = 560182139154142A024084075597624C1801AB6D369E1A47544C9CBF9168602F H_OutputB = B286B4C1EA87FD9EB06B4BE4AD005DCFCED23E7C4FEDE63DC1AD9FB8FB8033C9 SharedKey = 6511F8B0405E656BB0B11660A88784EAEB8EB2468B33531A1C5D8DBE3A6A81F4 DRBG_SeedA = B44550FDF89FF8E677A4C6CF9F77141E18AEBC9B75993BC60FC88D582EE29928697CA61B20FB5FFA28C6AF48CCADDE1B38D80BD9A8F925209F8E4E93CBBBCED4 H_OutputA = 3B43BB7CF68D17D5542504295BE6FB6B6F79D988CA9D2A60B867A712B4796A8E DRBG_SeedB = D9464020EDF8C278F06D14E8DCC6814D13D3CE664056CD8CCFE4E981BEA7BCAE H_OutputB = C6EB64E91B18DDB65234455BDF20204F4D07BC57836E16BE22D6B888C1F265D6 SharedKey = A57ABB5B991BE5BDFAEEB615C5A498166B49869B07D10648AA4C90C19895E03E DRBG_SeedA = 6DCC158F2ECBC0701FBF313FEACFED54CA97B999F85861B88533E9C40196C8DA9CB043072C41F49D52F213222DC6D7946DA6F26C9B22E54952D2D7F06BF5C25D H_OutputA = 4A9FF23F31B5A69039240E78F9AF6210D83F2D9DDF18D46D97FB7C9437D7D55E DRBG_SeedB = 87E1C25D108DDA5871BB6C728B8AFF43667DBF59E2F1239E45D1853372914461 H_OutputB = B44AA17222F0C3DAEB7AB17BB07E08C4F7A4A9D4389477939B4499438CBDA299 SharedKey = F95EFFBBA51B678B82D37C4874E634152A78D4844B73F6EA2547979C024893B4 DRBG_SeedA = 09CF02C178F0CBA73176AF71DB8C20AB6BD6B2752568ECF69098FCC21CB546E3E55D8EB2000AAD1B7CDF0A079BF83DD7B843076CEC1750B700A29EF0663004B8 H_OutputA = C5C49D334A9631942583D77DC448453903F9C4F9698F6E4773AC487CDF965896 DRBG_SeedB = BF24C747C718F576C5CD1EFDB26BCA5FEFCE7A4DB9EDE731570A578686326BEE H_OutputB = A043B9992B421DA6FC00DDE1F48EAFAD9CC9A6309EB583D24CFA7949B71331E4 SharedKey = 8F9F660C5A489D882A5434E28A7F5B0202DC3D3C8DD3BEB6DBB864E421632617 DRBG_SeedA = F364AFFA77C27462A8BC7B5E236EFCC3DBC155E3A108DF6853FF69045FEBFF9D9287777DD82102519CB8E1F74CF83C73CBD265C664B2C069DD92674666A73E90 H_OutputA = 990E0698887FD831631AFFA27F8AAE65FDF85F2A75EA11A59EAE3143AE559886 DRBG_SeedB = ECDCB647BEB06C5E06868A7AC77C6F17082C8E3D664F9E89D3F3FC23BAD66CEB H_OutputB = 85E695B4E723CE6B7C281F8C8EBD5E79A43D1B13BD0B9B28DA251ADA7FAA1720 SharedKey = 9285AC6C826329BE8E0160BA3A987EA5236283A7AABCABDB0AA1720FF8DC0482 DRBG_SeedA = 949EF2EFDE32413318CA5B510AC45A4EACAC90E757FA42EFFB046C6BD088CDDB417CE5BFE8B220DA6A6F0EB32D1E0ECC39165930C82C7D0D50E2B60720625080 H_OutputA = 1A0E0509B5C0C761A09ED85AE5EDDBA9BF045561E9863B73286AC7AD5E432B33 DRBG_SeedB = CB4FA9C23526B6C9ACB344641D43E0157C9BA8768A8F747DB7F98123E4329661 H_OutputB = 432B5547CCC923D0264C0DDB9DE4B047ED61166748F90303B0B36E058079813A SharedKey = 2230A456AA53430DAFD050E069E85486BF5C7DC900E096A6EE11FE9FE9F43149 DRBG_SeedA = 0D9C182ED1F056AA91013B72AEE6B521ABAD2424C89C571E99A21B3D6C1D63538077327ACCDE7EBE69A514FB4365C438E0C1CBF65EF93B814A4B769DE58EAD27 H_OutputA = 047B061EC8D51FC0E8F199F3EA34A229DE214DC44EAB8CDBA23EC10DC71BB57C DRBG_SeedB = 055213ED901E9C8F60955085A99420253441806A6F49A6ABAF708A56983D167C H_OutputB = AB6F3CFACA4C202DB1096160F4DDF89E66D4518B1A033E73F4565FFA0FC83A35 SharedKey = DE9DE05DCC93D5B337ABE5D5756B7F0E0916E7CA136BBB4AAD0C85360318EB63 DRBG_SeedA = 082433406540C4B2887BA502DBDE30D9B658BFAF55783C726304BAD34AE6B27EA2AE5F4A100F9DC48896ED606F84C165719B37FD1AE2FD106742B8EA4AAF8DD8 H_OutputA = 3F4B57283E3A1D53CB374089EB5BAE9EE48CB48F0B4F4807E97A9E4731228691 DRBG_SeedB = 32D53F6BAFD6A0925CF8FDFAFDB4E20BBBF9466E05AC5D3690A5C2F6B1EBEE32 H_OutputB = CF93A9C675D1DD353F599579290DFCC4F99AFEE3BC7FDAF182563571610A5F19 SharedKey = C931699545CBAB1FC086711D4B92C45C950DD42B6508B043E06AE73422D2E0E9 DRBG_SeedA = 80A52F8B1FD07C433BA0C44F691B3F91AAFE6727F73AFDE90B325E6C2EDDD671AFE182C350EAA71F5B8188405DF3E65B307F6C79375E30A28AD0DEF62E9DC71C H_OutputA = 5FBA1C67BD6D4D66A1D7AE7CBFED829D586CE30C8DC2DD9C67BCA6592A91BBA8 DRBG_SeedB = 53E2402019139BEA146448E3FD61431BECF7A20C9C427C1D72A337527FE54FD6 H_OutputB = F8A8CE4F02D60D377BE136764D4287F771E2F972D48FE17B7730D77670B3E11D SharedKey = BE63A3FB338B8E83927653E87723063292961A5BB5E0F649DB55A9C2675B4118 DRBG_SeedA = C109B29369D99A77C4D9477FE35259F1E195FD1DD24C3222CF0AEB3C6D395007AB2A34D7D59A6E475EA71964414FF02AF5519305C6C5B8E066A97E8E3FC83918 H_OutputA = 7E77BD15151DD3F76123EEA4350CB80D02639B5621E106238104497BB9034A3C DRBG_SeedB = 2119580F61FE70C9EA2D2E82D1186FE556FE2BADD11898256BB819C6BE9E4714 H_OutputB = 3E1DEEE9A7F40C1FA8D46D10AA2658A85D268D04497991C4AB948627DAF0899B SharedKey = 09CBC97AE09D06E2731EAC28DDCA47CB88F98A7D979347F463D2622FE8A113C9 DRBG_SeedA = 4FF8AFEFCA37ED0A2F6DB8302CDD2409EA573FB58DC65C70A0EEBEC37A6E1F48C5A1310DB8B441EADD336BE9C8C34135778BD26E59DAC4DD0A1882C7EE89EB50 H_OutputA = 57BF2A09356341C73BC8EEFCB193C25AE7CB3994091036D88775842EB086BD8D DRBG_SeedB = 357C5E700335E216E3C1A076A68FB764651EEF87C5ABAF51CDF5815E2256177C H_OutputB = 7440D735DAC909CCB34BFF9A97E5D897AE45E9ACAB74F97129DA0F7130B94C0A SharedKey = 1D2879FB2E7A8BACFCAAD1A33E9AC675F0A89138AD1B77D3453436B839877307 DRBG_SeedA = 4644A9C66C42ABC577846508DF7FD65C4FEBDE56D198CBBF68DA96173BDBDD0738734BDBC4359106B83AB5B99108D59369C2B01BA0F2432ACBB5C0AF4CFFE69E H_OutputA = F918F1FD5EE3BD57625F86D6CCA6EBDEE23563C749766AF18456C84C1F6A882B DRBG_SeedB = D3131B1282F4F075563E8E9A79A563B6B82A0C0F192F6BEFAB20B6905D9D67A1 H_OutputB = 389EEEF8101D4457467F65AB5431C0ED02BC20B6B65D765D7074A6B45CB7A2DB SharedKey = E63A9A63030C3396C9D0C88EBFF0C45DDFF10F3679D00653573AE72DCDD8CAC9 DRBG_SeedA = 8ABA7337722F2AC30C2D7236133DB377CE338F8F09A4DC47155D253B8761142D91389C51AB09A6D524F42AE86520F7AE07497F8DBEA56BBAF7C635FF366C6B9E H_OutputA = 359A4E1321677B880A0FF75AC8AAFB02BC1E9A4059E08D27AB74176B399D3308 DRBG_SeedB = CAB67A5244C83B4DDCFC0616DC53FAA5E15D5076B3CE2F96A71F14D74F0AF449 H_OutputB = 399D55181CC2A8A90F539FC5379297E5E219D1A0863D1C21933C274DF29E8E30 SharedKey = 1E1573886E3B8EAED6EED915368BA14D957FC3DA64297074B94D6C6E4A2F80FB DRBG_SeedA = F56E40B0E5859A06BBEF857DE11A0045DAC993B732FEF9620364CF91395F398BB2982FC4285AD937775785614DA30DB6280FB6486B9064F63590119722116B9D H_OutputA = A485C8DB0768CDD6FB2AB0BB37CFBD5CE5482A831590D44DC0917D5E38D92C1B DRBG_SeedB = 5171E2F117D9D252A12AFF68CE03581728508A035EE82D216179AE26A6B125C5 H_OutputB = 8DC5D0F9E0EB443BC6481699BF585D4366F4D11ADD4DF117A6EEFB18FBC6A955 SharedKey = F756D68FE65DFD45304C64823A966CAC0DD5E4F787DBF904E14CCE68976ECB3A DRBG_SeedA = F8154FF4FE74F225C3319CE6B12D158AB15F5F3AB4F1E6CEB8D4C9B9861C048DC9BD5CF326A9CC32FC1911AA494BD613EE6CF89A1942D199B914D4C58729DE49 H_OutputA = 0053DB8505A6B8E735A402A1974E5F1788FA15F6C19CF3E29E78389A4080DC09 DRBG_SeedB = E9D5E9FD79CB7311622972407FCA51F9E9F423822CFC7AF65AD7B8819B4BCFBD H_OutputB = 4E709F0C5EE3457E10DF161F48182A2AFBBBB8EE060B6E0ACEA7DB662170E8D9 SharedKey = AF492175D0DA3209570306518B97848D77ABD727F021BF1E2672D0896117C181 DRBG_SeedA = 7A6CC1DB7A4046E4B52E58F50F0CBAA22B39FA8BE6A044A446433F6F0A0ED2CEA6332471594AAF45177C85B9968360D101627DBCA0E9ED299C28267A2D38C7DB H_OutputA = B44665C056B6703A45A7D47DA038A06B8C9081B9E94A71CAE2AD243D11EA1A36 DRBG_SeedB = 347E9D9F90613E54283557069EDAC54FA77B32B7CE91E2061876B98FAFCD9DB7 H_OutputB = E8323A7F9CD517064199BF44390F764AC651C92BD25018AF9D843B7E93171CD6 SharedKey = 7535CCDCC8011D359117E0A6658D779F069B79CF5F79EDD3FD6AA562099BD8B0 DRBG_SeedA = B66B5501939032DD495013B3DC7A6285F3CFF4ADD550C1DB0981E903AADB834D2E5F79CB3028F0E995B3A9B06D48828B1D04D55F9FBEF47076D4C5C3CDBA8C9C H_OutputA = E2177FEC661CAB4AB1DEF32F6A99184D0C8B3F2769DAD9495CC726FEC7E5A55A DRBG_SeedB = 3D975EBC482590090D088A8C8E98854665DB554E77E6734F4C5B750E2142C079 H_OutputB = 573899CE509E9D1D7056DE884D388148B4C84B9F8809929F9EBC0A07E399B982 SharedKey = A943A51E36F26C3B84E431F28B0ECF46C233A4AC32C18C85D062131A3C83C2EA DRBG_SeedA = 4CC113FF3655DB1AFA397E9125A41A2BF7D8C8369A69AE10AC44BBC48E09F12F5D4D28C106EF7BC4EC34708718BAAFE9C1BE4DC7301B36F38863B7E9DFAF368B H_OutputA = 435D84318A9A29BB907E0E3173C9C1C47620688A58F5EA557FEA17BA0FF5297C DRBG_SeedB = 893A08FA1F96FE7E69005B11075389CFE69B603B1AC4999FFB2316B3E2626BD8 H_OutputB = 02C2BE491B0AF0AF9C3558605D79703A5DC4D94EB3429D4719069B7A6905D041 SharedKey = E26C412E1D9DDCE5FBA411C9047610D7ABA0DDA745C3F5F568D82F84591A6011 DRBG_SeedA = EAA74F2D258B1537A0D5E070CFCB6D85B4E2FA04749B9ED835B9F1698BB772178689F95618132768D6B43E4849CD32017722C310F74DFFAC0F8705D0BBA5BABE H_OutputA = 2D66E9F20354E7D7FB9216524A59FCE6DC9AC0825CDB8D77A1A8D01115F6EA2E DRBG_SeedB = 9BFE229C8092DDD75C920669C6B68C43E9199E55F95CAC959C431645529E8495 H_OutputB = 6A1E39F981E666C161FD8151C7CD2BAD033189BAFE371428C43DF0BA0F97A3F9 SharedKey = 1AD4281C471F34DE3157D201141E500FDC50C264B08A5647D755703B18D5A9C3 DRBG_SeedA = C64822291120B9F16DAD9CF34612D19D52045DDA2805DFAE4AAC0E4937F6C3F655260AF34A2A3E0D31426E549FF4FEFB0139E7F1B90DE87612E4AE92008AA473 H_OutputA = A48DD5515973EA9DD218AED9A209D8566F61BE184D8D962ADBA18E8BDD4F6999 DRBG_SeedB = 7DF8BA711E6524B1B64F42EB065ED024790944F9782C34D556106A0DD4F9183E H_OutputB = 13A9F9BBF202FEAA041955A048B36CC43573F837ED7F8411F6448BE008AE2005 SharedKey = 29CDD7A311AB4B8EA9E2DEF9E52235B45125C366B51756B41B113B4B5B90756A DRBG_SeedA = 8506CF4E4EEED61A3D9D22AFA21CB18B49765B08227ECF55BAF38F66D0A599283CCF6CB5BF679AD76B53F59B36A9B78675390F18EE649FEA75329F3997736032 H_OutputA = E1177FEFA208704765314DF739348D7D63E536D46E1E8EC9D6B0486784F1AE3F DRBG_SeedB = 9DCF3662EE546C7F1EF12A60926B2F091D686768ABE1C98E1AAE205AACC24084 H_OutputB = 4D543C19217F7C4BF67A9F68AF96BD0921AB17FEB81C277544FF722B00DA746B SharedKey = 63C9FEE6CBBEFA98DAEECCA88838DB2A69726F30DE99376391C381CF64640D92 DRBG_SeedA = B7EC103CB5BD0774CADE11E2488DD5B0078201FB1629B46A046BA319A1826F36D7854091B22592BEC36A003D586024E015FD4A705739BEADB6CA7F9BFA7216EA H_OutputA = 3A70E6C479DA4E1F4ABD1124613C8A21438AEFED100CDCCC3EFAEC983CEAD0D9 DRBG_SeedB = 67F2C753604EC631DF992B915CA54AF27C2779E3A43EB10BE99C3989ECA334C6 H_OutputB = C72E90311FFEC0D2E8B1D34135A6AEFC23C18BAC9BA7B83E89C2AF7251965700 SharedKey = 2C9D27B37C9FFF1612E534E44D86D4661BB8F67FC7728F32865870F498DBA637 DRBG_SeedA = B1F985B86537068140A85A1B6955FCD145CDA8B318CDC74814113EF0F71CAD999A0FAFC287DBA94B5D32C7045028A56024AE6E600DC8252FB09DFFA467D2A2ED H_OutputA = FC918E006C24E383AB755694BE5C53F929DAEE6139225A4C5BBE09EEBEE6FA3D DRBG_SeedB = 6A2DC86A2329601D67CC73F469960527897A797B0282343C57C87374836D3395 H_OutputB = AC03424B788430F85ED4429E8A520400A69EAC0BF91E6CCBB73D0D9C19224092 SharedKey = E083954DEE0AB10CF689C61A6CB9DFCE2CE631C751EE37FCEF56550AFA50EB5A DRBG_SeedA = C02A60B715C99ED4B6B4383535E7434B6A458238627D0EDBB9B9243C256AFBDAA53704A647083D38BB8576E63A785266D54B4BA3C8086F90D0E1D0DF3BE8C6CE H_OutputA = 2E0AC0268F5D6A74C130A4A6BCC584C497F9C046DC321D6BFAC6A145B55B2E9A DRBG_SeedB = DFDE13D9AF02B2DC8CC825F7E56B6CE504F6770ACD8D4357FF7B3EECD0CD7671 H_OutputB = B7A28D550568CE64B9C3CD37B03217B04D610126929B97E7C7340028EAB2CD39 SharedKey = 25B99CAF20B99929D2930C4FB0479C72D54F5268289407609C6EF75C253749BE DRBG_SeedA = 29E2596F566590E1DD2C273A7C7D0340B0B522A3A7BDFD37D0FEFECCC4DB645300894790E7C83F72C6F615555019C00C2CEEF41D1B5C4774E8C1BE131E2BD776 H_OutputA = 05AC35035D1FF6A78A2137433A041863599B016342B108307D99DA4ABCEF70FC DRBG_SeedB = 12EE34C3D5F558D9B3D7859F2586C3C2BC77D750B5B069C571967A9FF6878BC9 H_OutputB = E41DB31A9EA8ABB38DF7C14D0D4F1654FCBC4A772A4A201ED2E5628D41E0F7B1 SharedKey = 1A45E7B53F3770B5CA730B23CCE0CBD62DC3784CEF40681862A1ECC1BB869977 DRBG_SeedA = B271B63939AC72583C3B94BD57E2CB6F1A4D57E3F2766EB9618F2928134C3BC37F868C9418FFA97DA5BED94F51F99D4D8F8FE7E10BB01710BF741646FEEFBED6 H_OutputA = 11143327BF17BF4F396645B3A7AB546BD8675E82259F62082716A2ADECD15F4F DRBG_SeedB = 8B9790C809E51BBFAFB7E69E77BA0EC0B46CCACE8A55E3510958C66171403C57 H_OutputB = 7798EFDB6B34489339869D37AD93F64FB8C57A10A74FEB9D45902FD361320064 SharedKey = 47FAAA2CDA0D01EE260881BC32868A20DAF5E40F953BDC5CAC64A54EEF750991 DRBG_SeedA = 3FB3EDD963D1583C5B1E92D580CDDA5D03278DA5B11B24359750D856E1FDFBADD94773B5AD8E0C23E883E4E57AE6C9DBDDA3938D10A182CD0175197C35FD3D69 H_OutputA = 54FA7CEA3C7D332F4EAA47CB1526B0F4E77784F3F6B962EF1B9FA6FD5DE04CD4 DRBG_SeedB = 4D2BFD5F0F06C5C9B74E36980586AF88F12DF0A474FCF98C5801753613EA9A33 H_OutputB = 61C6740190D1CA2AF81539BDDAE7FEA9086DCA9D766914A1E4A8BCFFBBE7FC2A SharedKey = 7F7F6173FB9500E6C493E28C628E9580CCEC310556725E23A2D70EEF609412E4 DRBG_SeedA = BF79961EED87F31B53E2C13801B6FE908EB875952603D5ADDB19F3E19A4C08977294BA3D874F61433E3ADDF237D419AF51CCD1B7A5AC3566D0968E2BB4CF024D H_OutputA = E97A9DA32142E6142E92F0F8AC29AB7310A010AA60081E79C7BA3BE4C636A33C DRBG_SeedB = 7610CB8530C7EFE537CBB4192C942D7F13695D3A9BBBE620D23EA29BF9E44F0A H_OutputB = 22488D36EAA1E5C41564CF941A862C8D56AAEDCCCF42C9B407CE51067714DA95 SharedKey = 1D0D600047AC9247F21BAFC22C5A7EF2F755F4A4CE12C03A6E8ACAEB59617279 DRBG_SeedA = 96EC69E62BCAA3D09779DE69675835385BCE42D799E32C0561BD5FFB7D28896BC8C93E0DA849EA527EAD4F146D826BE07A60FF4083753A5801E4132419143C21 H_OutputA = C20C26E8FB86E4C6B254C5B8E2890520BBF1907AC1CA8FF4225415D955BCE52A DRBG_SeedB = FEE1BE59509899D760D7BED2403058BC1CD1350F7646692790C7615C3785D742 H_OutputB = 69597DC8E4B3C60F9662B12840BEC6AA66E7BE59A0D322FB6D8F266837E023DC SharedKey = 1B19F7EB2D7719EAC5D230683EE541515501E02D9439AFE7F3C1195AF5BDBAFA DRBG_SeedA = A24B502E864EE39940B0E226925C8F540652097BDF84AD8668EFC6FCDAC7755E76313DAAE1FAF0A4AE32BA2C4D626D4EEC6ADE93049EE5969B728D45D3739235 H_OutputA = 561567DF07B145DB7F3C18E529EE8D79946E9C9B11A8F3C7D73D09287BC87C86 DRBG_SeedB = 3BEDB438433E785F3A9E1975A21B090D7A8361D1FB8720696CD9D21941531F2A H_OutputB = 9CCE717E03B7960172DFD7BA5644B547C7338D5DFFAD47B62F4E15BBEC728E74 SharedKey = 3606521FC9A72D1B34A82DC897C7E0508BE277F408139358074A8E69875CE0FA DRBG_SeedA = B142900FE681621092B79ABFF1334BE8759AB87701C3DB739B29E75B992A717854368BD1F4741D5C05D1A0A888910444E8EB0DC1D5266481203816467155742E H_OutputA = 8E23A21B836C8AA583E9A57A458AC236BCBC0DA7A9BE06B5A7BC81E251FDB0EF DRBG_SeedB = 8002F1C2C7403965C4B57A284C476FA68CBFFBDA80F080AF1F9DD87075532D48 H_OutputB = 1053DF96F40A055434A74B449D418BCAB0C5D15AD25B0E552A2D649463957BFA SharedKey = BC18CF2C2EDBC615A275D78A4CCDA3971B7012B5ADECDC51341B0540C1106D50 DRBG_SeedA = 68D442A1B8BAA4AE31151EA84B16960CDA7B30CFA35AB30455599808F7DD005439AC8DB781B297B859895F56CE136741BDAE9962EFE60D8E959D97D4A76651EA H_OutputA = B56D91EB8541AAF9C5CE459D6FE6718BEE2300A792CEAB894DDFB337AF84E06B DRBG_SeedB = 16F73EA01E9FEDFBEC12558840EFEF8E7297E2BEB0B6A1A1A6434843F5010896 H_OutputB = DC83C9EF2658799FA22784FE6F0F2DFB231AEE4DCF18DE0CB593AEBF6462D7A2 SharedKey = 28384ADAC1516707C094034191F2639CBDAF1D66CD3BFE1AC6FFB264D3409B0F DRBG_SeedA = 2C29E032228F4BCE5CE98F76CD6163D9F3132FF01CE9D3BBAB885126B26D5B340D520605F2B558ADCC855356C4F03002B6E1E5E9DE8193670C5F7C1A358AA0BD H_OutputA = B0291E394C3CF2F3B06A80BA011FB5E2633C067E0AD6FB6CFF632C997A727A88 DRBG_SeedB = 39436B2FA0FD5F71215B90A87C552EA9BA9705D818BCBC3E5374712E1AF06AB4 H_OutputB = 57ED4BA59C860F8B200E78988ED8F6D4AFB204548B973E486F1EB265E98B33B1 SharedKey = 7C855DA0D59B90655753C9A0AB3EF7586174E0694307A30473A6488EA05CBF60 DRBG_SeedA = BAD68354E3BB4504750BE157EEC9E582DC29C52C589D5DA1A1798E7B4EDFAC47B4151D2B2528C6E947AC3D20B2EC727B66637F005CDC4AC95876124D5CF0A6FA H_OutputA = 36BA727568B566248662F2BCD2E3184239D604A9F843F36E43C59EBFCEC84272 DRBG_SeedB = 0C9C92F0139563F3DFDC0487EF2343548221DAACA9F39A21856C0A9440F19214 H_OutputB = E5C60B7226500BD5FE7EEBCC37CD6090719E5B08BF4B626F198788AABC72072E SharedKey = 719687E157CC5F802573061616D1751D35D2B0749FA93FDF04F4C1E02BA44328 DRBG_SeedA = DAB2FC8F3A692747CF9A6A1ACAC976F2855D990ADD4F45EB6DFC9490520854AED139BA426C774E5FC5FFF58914B7F32647B3F96C102EA55A2B6F1FC9F33D4568 H_OutputA = 5910E9DDDFE7408D53444089730CFC4B38141045609145BDA1AAA6E75AB0F345 DRBG_SeedB = 00418CEEE50F581D72539C8CB8795E2BABF824B51679EB3BF0BAACB7B749C45E H_OutputB = 2ACB714379067DB33812EE63D9683808E33513AE0A67A198DC7D3D327E873249 SharedKey = 28E8DAF1DEEF156A410F26D54BEF7777DBCE961C73042AF45861048D62CF78D1 DRBG_SeedA = 83BD166E737CA8A328B9BCB0FC4577659EA18FBA2A9A7E8D9507098FC58DA4B4674E454E4F10D460B7696CACE2D3F8E7DC3B88E33DF9009A0AD75B57255F346D H_OutputA = F99A2B194BBBF5B6EAE8679B41B19C7EA2CFA8F0712DFA277F4B7E0A8807AEF2 DRBG_SeedB = F306CC2A3990CE6A60320451B90A6A4E78493E37A828A108EF532FE1FDBE7C8D H_OutputB = 17A15758884156E7F868490F73812D341992DA64CF4BBD6589530617CE6B2A57 SharedKey = CE6335F9944F04E6012F63F44ABA1B21582DBA3FF7DF40BFFEE2BEB42E55BA51 DRBG_SeedA = 24B8128CCC5DCEECE225EB04C4DD0F4B2D1693ECD431B20588908C983A20B0B45C853668E88DE0587DC5F639937288B829AAAD7AA29B4F34004A41787F32B4E7 H_OutputA = 1AA8C6CFE9B951A4C56255FBF019CE1DB31E23A7DDCF77E14BF8E6EB85C6080E DRBG_SeedB = 9E6FF25F981D544280AEE22D4011E67B8485FD25D8269367362C9C637A776873 H_OutputB = 7FEA7BF062838028896DDA7DACBB5536658050A4E605C2898F06229468EFD7AA SharedKey = 9C922A65F751095B5DBC55A5D60B87B9FC874D9A9F72CCEA99E62C13760ACD15 DRBG_SeedA = D54E0B6DEFDA2EA123F4D5813007C09FEE4307513D2320654DEA364274DDF519B69FCA89BACD89EDE64E1C9434A97E0255C159055016F687231F5DA465957C23 H_OutputA = D029C72BBDE675EBBBC215532C0A969FAA26B94C0EA2FCA322067D754D6CB43A DRBG_SeedB = D525252DC5168E1BB69FB296832E3639A904735B90B7E5EE31BEF01379C844C7 H_OutputB = C0B38FB3C12A8EE38D223368961EB912D4539CD47FB34D99168F4BB2F5A19C7B SharedKey = 877129BE50DEEC366E722C14D6D6B6F1B2B4413965CED9CE189B220A6533F19D DRBG_SeedA = B17BB1510B8A86520CAA8481B895EFB78B18D5D5A596674427ED5B7A5856B21738A38A889ECD7A1C77EC2283E6387848E6BCF2D8713A39BCBB02A7DF2D995998 H_OutputA = F08DB2A71A0BE7DCEF571EE3734290A84E8A61D357547A42AB7354B9751E45E8 DRBG_SeedB = F4F1D638E14B974E9CBD72D0D46C72986D8312E58D44C180ABA39DCF82DF738A H_OutputB = 26F81634E7DA3B766778B0174C134BA68D6583DA60252806B65F813C1615E966 SharedKey = 85B246C32E9B9A9E07F70A5EF620BA79ED09EB38873E3BA908FF00B919DFF424 DRBG_SeedA = 7FE90BA3C43A20E17D45522B183C41648637A580EAAB49BDFE248B9CAF18AD795CA1BB2952AF6C40A9929445803B7E962ED9D7F101FB6FAB3BA1AEFFCAA1FD52 H_OutputA = BD2AADA767257A44574EE16A54FB97224424BBF7E05922BFA80C27E0DEE6BC7C DRBG_SeedB = AB71B7058455A8DE5F66486486E7E2A9A94F31168F71FFBF29D112CF511AEF42 H_OutputB = 6B8417C15C843BE35D942D75C320E0EED5D45734DC7FDB3611BC394E9D174F95 SharedKey = B8B9DC2A44E549F77272FA71DAD7554A25FB4EA29242E1D763B777B8403C1CCD DRBG_SeedA = ACEFB43D82C8358B5AD29798980658526D4271AF30EE3E91FD25B2ADE6DDED76C0D0D06B6CB281FF918665EA7658A59E37D94FDBBF3E4AB170F69B2F9F2E6029 H_OutputA = ABB06F382F3CD5EB28A5B9AE229F7CAE74E6F00FD32A76043CC2D887DA45483A DRBG_SeedB = 69C77ACF2413580631918EBA697EFD2B5199EA530F865A64345F0CDF2AD0AC98 H_OutputB = F126AECCD5F449D7062338F8BE5024B386E89568E7AF9960D3C7B06F5B0ED770 SharedKey = F9D03A5E641387CDA4CB147C4D43EB2EAD7ECF9366D4CEC07358FDF78DBB264E DRBG_SeedA = D425B7C1BDA69C14B9FBD0F73587406AC7DD1B97031EB6FB88C3DC172F4E2003DE7171D9318B58FF2C6FADB5C3076F57C0F1A7A8784D75BE96645EABF879F7B3 H_OutputA = A191256C7AE0826A2FE76B3EC0F41E2DB1C7A4BBF3F467E01D266E7414BD7538 DRBG_SeedB = 54D5E3AF1CB360E07E45932D683A59A8AD04B5A82B655859403BA3B6E52CB0E1 H_OutputB = 2F081F6BCAE8F28EB6798F0DCA26A449BFC4E93AB02B6B0177F8948EF5C0916B SharedKey = 98E08E4EF0C1EBD900FB1A1B7739EE649C4010F3E7C60DBF47D70306A2D8A49E DRBG_SeedA = 781B48F1C64CD31A5255B4EE2CF2CCD33060341B5D4312E9162D7DC57CAC708E94DD30C448A1D853E2B949E7BBBA4290917BD1939F4DC6A917CB212D12971984 H_OutputA = 42BD858D830F93AECEB83E366F331027D7268E1047E90A3BB0FCF86B31761373 DRBG_SeedB = 6A500D13287458807360693A89D8D5AF46F8789A9798D858463108091F8F2150 H_OutputB = 6BB5F77C2E5721C762E679B8269B9E103790CB1460FF3BB50C88CF364EFDC413 SharedKey = AF0807E6DD959B76BF2073DDA09B732075B99783D67E46CA1185F07AADFDDB2F DRBG_SeedA = FABD7E3049364D6DE24AC927B0D80C2819FE30ECF2C01282245B5D2B726632E64C371CB0BBA8658391EB4FDCD3944B4264D4DBAE494A922B94730C843017C604 H_OutputA = CF0D0B74132B793A6837C777C84828E28EE65B317D65573CAC7D12B0D408A3AA DRBG_SeedB = 79F86BF042F9A00DFBDF259508BD857DED81F4DD35D4DC8857B91EB8BD38702C H_OutputB = E9D20E726E6E6DAC5B50D0328F3F8F920545EDB64AB0D22BD38F3CDD9AEDEB9D SharedKey = 99E58FBAD7A28D3FD0CDE66A3BF71CF057D489A8490B910A946C37ABF9D5C72A DRBG_SeedA = 069415E793C624A95DFA02F036842EB23A005C6A94470B91972ECA3528BE4DC310F94056F2B9DC15DD54967BFBCDA799F6163294D1E568FAFAB8463B61048E20 H_OutputA = E4EBD7272189A5C8B425FCA14496D28EF60356D1A9CC7F1E8CCC457E06A8F1F7 DRBG_SeedB = FE09292520BF18E38E6D2F555EDD54F144A6BF94A959DF8A43E9A1830B3C0E91 H_OutputB = 4F5EA124FADFE4533A374C85F54762DDFF80ECCE9CB5F316562CB597817919BC SharedKey = 890C60D22FCB4A95D0AC32BB4543C9F8565D8DD32AECFC2027DC3546B4F9BF1F DRBG_SeedA = 0CFB18C209FA393332DC27046645766B89488B89A803A10AA7853BC6CA6274E0032969E4FB63D60BEFDDB44B4DD5D019B8A13F93D8DAC189DCB6620122E5BB32 H_OutputA = 5BCB3B12A7BEAC1CCCAC67F62108B70ACAD9FA89042CC7EEF07273C440522CF7 DRBG_SeedB = 27AA6B37856FF205908A44B343909504A7801B29567A2BDB3644337DE986A797 H_OutputB = 3966BDB03E374AC948F955857B02FDFBA02A32E616843BA513816C4FF9564E5D SharedKey = 9CA681FEB9E2EB49D798F7429E9159D42B36560FF465C8A98C6D9A7F40D59F8A DRBG_SeedA = 13659C14C102CC0F67D703FEF32161B83518DE8157E6985DEF3066C0B037345B8C66BB1DE3E6EA30A68B1D126A4750A47E192CE998B69743F03F26B04F3BDA29 H_OutputA = CA029396D9994F03CB8F3DC73298251CBFD1B2CC40C4F6E31730FE4AF6EDE0BA DRBG_SeedB = DF5EE3915DD4953AA1CFF1C2CE0D6612BECFEDAC3CE1EE619ED41D2654ED1B54 H_OutputB = 908414A345C291179DBB508E40E39F35EF1DE076C5590EF85127C7CF5C2D17F2 SharedKey = C8C633A24C13838B72E7C85D0FE68B6F0E53655F1690A8E2A96DCDABA9AB022F DRBG_SeedA = 739FBC24E5EAAF185F165A76F5347F589868C93C47F1FB9FD687612674FF26D76D156E78FFD233E52496CD80C76697A14EE20A255EC1294F16FC8B9B0221A570 H_OutputA = 69813B61CFEEF3BCAF13E8AA3DE8ED8D4783A27736FE7402AC017CB8E5DC1237 DRBG_SeedB = C19C5F6A60DD1579A8D15193D3F5491809FF4E38F2E656F5096EE19316116E26 H_OutputB = B2A0CC0F8BE911581B4A8D40A23FD9812AD92120514050068EBA0EF851242CE9 SharedKey = 3880DF58F3460D4CCDE6FBFEF7042ACF2AFBF6B9B509A6022EB54038E49E8AFE DRBG_SeedA = AC6790FB98F5F016C0486F0988C3E023B1FB025FC5434FC23867C51CF14A6A265475FCB233F129DBED2F887AB131DC2E311291C66FC2278B014B340A62750964 H_OutputA = 9FCD72EF89E84FC4300901B53A87B7690F23842390C3D50065831581A3E7F803 DRBG_SeedB = 8F346907519C45991D1286001BDA091C022288DAE8B4D7B2EE77AD5C37C7A1CE H_OutputB = 62E6ED836E88C7A2280683FC5D845532B564AEAC4855F50C917FBA8F84F54F8D SharedKey = EEBFCA2A02852C8C205510B44AF31E079AB0CAE480CFB88F59006C026FE9CAE6 DRBG_SeedA = 23107BF9946CD8C9604606AFB687A5DA011603B14F9E50D13DDAD126402838921A20824F91A3A51D7A394AD599A626833433FCF437717D7B31B84A12AB15E4DE H_OutputA = A41F5DAF5AF2BEB7318AF1C2776810D2ADAD870C5A5AEA5337AC38A2705A3F9C DRBG_SeedB = BB2D2E961D697C50ADD62389DAC67B0250F4C71BC2CE9372236A120BB876D56F H_OutputB = 2EE1791D1A08777E1DEACD662218EFDC69C996CE81E34CAA7EC543DD2C07080E SharedKey = 89BECE81FD30CB50963B619E1C2D160E7068AA4ABA3993A41B68078583DDC4CA DRBG_SeedA = AF813B84A6C7BEA0F3BEC0F4F499867686B9C368654282700B78EDE731118F94FAABD567D127DEDCE02CD995EDBC182213C5B0D76BF1B5F3EB30ACA88D3BBABA H_OutputA = 3490C136AB1834F48EBA2C9735A462B192B45E05B71F9C382BD1546BE32FE344 DRBG_SeedB = 6DB428E88996C72AD4638C5309CFA9F062BB05A2605A46902A1B67C19E16255E H_OutputB = F0FD4F067A4C0CC6B5327E2251D959A6C9FABA712BC8D65FE32E4C87763EA7A1 SharedKey = 598F8AE2DE9076C5627F7E2D7F0F01E9E323A3CBB2A1161A15A608AD8B613F1D DRBG_SeedA = B394533AE57436E7D22DE41CCD3BB5961DBEC3293AB12280D431C3623079DAFB9B1C89B477488982A92A893F26A761C87CCF544765CE7760718609DA6E06B85F H_OutputA = 85C302789EA39BD7324A27166B9F2D535E5F1B0D301DAC0E8C9D7EB27CF8433C DRBG_SeedB = 734C4E90D251993031AB3C99148403EC4A301C8B04482E7072F923D7FFA380FD H_OutputB = 3AEC7A31813BE53B03CA422115FD1F97403B9206391D6048180BBBE0E4643C61 SharedKey = 37AAA8E26F4ED19ACA82E17EE5B3C5C39FD8074C5C026981A1D29B7E72724275 DRBG_SeedA = 67C2069E60424EF2E6DB7818A3106D9CB2521A31E741AC19E4E233E1E073BA619F713FEBEE2C24D1DB111236D359B67786C3C0EE589E20D3ADF86A8761DFBF02 H_OutputA = 4B1E075CA073D7A49C40BFA51E98794ADEFE2139F1D29116D7075F7638A5DEC0 DRBG_SeedB = C1B1EC11400E04320F0A6D4DA68CDD7C7C5B137D04642217A829377006D5343D H_OutputB = DD8000F4DDD25B346466EC835143B8733F44FA2BD8C55943FB7B71C8C743831B SharedKey = 90E754AE92C4BF2065FE3C6EBC9F4F21DBD75366E8CC26CFECEE918F6C142994 DRBG_SeedA = 9D0F594ECAB68E24B7611F34B4A4EBF88D07A892814BA1CCE717CC7B5E13E28F759FC9639A53EB58B4BDF1FD882DE20ED8DF8A8307E30E9304046DA083185214 H_OutputA = 4FCCB66D012082E914F8BE0E33017ADBBF05FA96E118E3CDF43DB06A6E2B252C DRBG_SeedB = 87612542475CA64E2ADEBAAB27E909A47DE97BF4533BC64D0413DB93A4FB5EDE H_OutputB = FC66B656839C486683B87DBBF1A83173A74A14EC823A4E77F408032E58A702A1 SharedKey = CD557A5685D5D4852178ECEDC610FE7666C37B8B479055867B00AF3DFA2D9FF6 DRBG_SeedA = 3EDE1BAA6771A71C3CA21D89F9957F3BB552F1E9F3C2715DF928C34BCD4196353184E1053398BFEFB1CCA9B4ED281C285FD7E331322DD0E56D18DBABADE575DD H_OutputA = FDF85F5EB5037FDD2C42EEDF34BBA2CFF8145F25999526C909BD2720D4A0EC13 DRBG_SeedB = A7FD4951CD4E23103C1956E51F0C7876C187C899D20BBD3D0A7249E9044719EB H_OutputB = 67A457B45E883BC542FCB3686932832D86262DCFF7BA8FA405CBFC8A28F1C873 SharedKey = E69B62AFA4688684B86DDA5C73DF110C20A53BBADA7391053650E5D6E0B9C3DE DRBG_SeedA = B7DB187CB4806B989DC319DB3A8BF732C0FD490247DE53CE60944E294A90F72E9B8BED4AD6429D6D7E48AEFCB6A281ADB7FEFE434DE9378D927F53C8A572FEF2 H_OutputA = 6A14246EC2B29B6D25F8DB70F1407C78901583018811E2F74C4912FDB01F5F38 DRBG_SeedB = 43F987CA0B123EAE34F6D5A2EC1736312E06D3CF741ACF052C8346A7299B293B H_OutputB = AE121A543E2CA30AE7E4D11D391B4E5A00BC7C4B505F8BEEF4F80A01728E6DC8 SharedKey = 8288957CCE1F00480061FF1AB3017423A700116BF1722C6E78479B4E7F34514C DRBG_SeedA = 45A3050815EB3D9F857D67211A620C37D4A076F0C6CC8DAFDB361DE5F65478CE3B40C18A8D20BB8AE5793648C5AD914831E47450DD1EE104CE96A3C8E1B41366 H_OutputA = 1673B3043FDF38838FD73485AD36445D3904EB3D98E2BC2FC0CDC40D3EDDC9B9 DRBG_SeedB = 493455CAFE34441E716162DE1146C8965045447F7AEADC2B4C4C1671F368C465 H_OutputB = FC8C2120951BA783E176968E947AAC946C059E70FBBA45441713154EE38B3BF5 SharedKey = 6F26615EE619ECFBFA94C60621B03FB43BDC485A38BDB5DC33F57AE6610E4C41 DRBG_SeedA = 840E670F5CD92EF58D8EBE6E984C5745C9F1104396A85FA829F99F423DB269BD1C9E8EDFE80977C925B99DDC3621A38E296A301FE2343FF5041E869B721AA19D H_OutputA = 1C1422CEBD6593587CA304CC18374FB2944D80A6330DA1132C105C6D4AEE6F6E DRBG_SeedB = A321788F1032F0921F7BB7E6BD7DF3B4759EB588D6F58F5A5400F5AD250E50CF H_OutputB = 5F039E52429D7D1B8EC57CC722F5B260DE91BBFFFCDC2D54C3E0224AEE91685D SharedKey = A69A5976CC3DD097CA99A1F21351CE7C73F9E83541D5F9371EA151FC7228CA4C DRBG_SeedA = 24C6991E6BD26F267D25325CB7453106D9A62A0D50B18A8B005193C0CBC114BEC7E77400AF99ECB7A75CEE1ABD56F121B6851439A167DAE89072A956714BDD53 H_OutputA = A19ADE52088328F59EC1C11C31D80B6F54F4A881AD4F6E8E20959F76A4617A95 DRBG_SeedB = 8BA0E8F4AD04CDD671162C295294CE7DDDA791854EAA46BB7A05783F556EA91B H_OutputB = FBD0E080F05353E84270EAADC26E4BE040857719B218CDD098EDDBE63B8C47EB SharedKey = 9D94E6CE1DF6A2E731B59E412502508A460A98C1F0120810CF7DE7D54DDDC65D DRBG_SeedA = 59A0B1EF7EF633DCD492C786E8C186498DEAF7D0B3C2002875422D2D4946918349C82600A69F2DA8BF5B70B0376F421538918CCF479AA163A8E45A6038057032 H_OutputA = 6FB982A97524B292B7225B751C9FE5F77B2FB0484C967816243969E2972181EC DRBG_SeedB = EFB607217324B58946DCCE9A3D1BFF00C5E87CDFB8EE2D6E879BB1AAEA6E6A92 H_OutputB = B46D1CA74A3F22249733E2BA7891D92D72145FB1A3D3F366D2141533C62F90E1 SharedKey = 144F275A5AFC6DF0D582D06F5764C9C293317767B4C21B080B96F2D65301CA7B DRBG_SeedA = 0AA5E02DDAB8EF027770B41BE3BA273DEB1C01F7EF65960FFC550BCE9E02576F827148BB1B9CCE0DBDFFEA9D07D2EBB31EE7D168A1B8A78A7899BFB74131303A H_OutputA = C82C087B02B0FC1B6D9C2BB3C96C1E817609235D218C9FB2723BCD1C49F22A14 DRBG_SeedB = EFF6CCF26A1EAED56CEB2E78EDD46837977EA2B04EA936A1FD642E4C4FF65FF9 H_OutputB = 1E62730C7CB6B46237A5B8B64E9447994CAF48BC754D7FE73CEBB7C49BB1E223 SharedKey = B3D619A91DE6C9B533A1E422B165B4C45D50B97E9730FCBCFF75C18C1C762083 DRBG_SeedA = 5A50883E6E22D1C2B5C3714C139789DB4068B91C6A0E30254062471DC30EA0D208C9927332C22FAD883AB2EA1783AD18FB47CBFAD044476CD936C2C4923DCF88 H_OutputA = E6C3E6F8FA50F49D089274AA8A6FA1D3D4030C13EC9D3799A0194C2CCEA10202 DRBG_SeedB = 79AE615982A6910628F14BCC7F15EE67387F44BE397F3862DC42CB2BFFAC4B70 H_OutputB = 7C6A52C981AF791D634EFEF906BE134E250C2E4852F90235C63385A612393D80 SharedKey = 636C4ED984C1788A15CE90A874CB53EE8D4C1DF78CA3EC0FB0E053C3A76347B1 DRBG_SeedA = 9B3DAE818179D24CC73689E980DCC142468E512CEB0FE2FBDBE3B53E054F08629BCCBCE775B2EFFB6456D49C909437D3E0CD94C7F1F7333D521F0D171759223F H_OutputA = 2C136181B454B945FD3D85A397664413F3C37AF24C0F64B5AF090F138BAD4CB7 DRBG_SeedB = 70F5A4A67D460BF7D14C76E766544FC73996CCC175546CF96692F5DBDDCD121A H_OutputB = D06DE8E8DE01A54790497D28037206CCE88E979A07E1FA7232D1D357C2080E23 SharedKey = 64F19A71628474347A9B5D3B8AE6503B772B8D26DBC5C553C6A73A0FD18EAF65 DRBG_SeedA = BA371EB1415FB409E684BDE9519D1E9AC727991C840CC0FB8401E5B40CE7FDFA775676C646F9FE0255DFC0A49DD0D8A8A43AFE51477FF8445EFDB69B7C9C6D56 H_OutputA = 3D25E9EA41BC34F4D69FFBDAC49CF5EC735B99FDDEF3896F5452454F4A41069C DRBG_SeedB = 0C30FE1A14E6E52F432348B9B6257A7DED4672AE8512C7C977CB6AE32CDA75EC H_OutputB = FC175D1F314D8E3D367E61D441D37774753C45CBE228558563F1A0F7B18B7DEE SharedKey = E1162E7D90C541307D791806920A95BC709FE43E54AB31C37FE0BE7ECAB09944 DRBG_SeedA = 63A5B7ADF8D4BFCED4FDCD62F1877561D3877100B72B4A4DD0A0395A70C129604114FE25EB3955A58B2EB9873A666454F4778588C62280436C49DFC304B23800 H_OutputA = B821B9D7EE630DC2AEFF4FBF103167F1E8612875CA3D90279AFA0ED31B1CD481 DRBG_SeedB = 611C7D9588DBD37D04BEC6326891529ADC8A51FFAAE3B5D8EA04D5E3BA8D0F4D H_OutputB = 7CA34FDCE021C46D98131182DEF6B601CD8F44A84AF2E7908B1BE7407073E8A0 SharedKey = 8356D55A14B0D099822FA67EA371CD0024BC7FE117E7530E4B030CCDA7979EC4 DRBG_SeedA = 63C73754A99BF5FE32F42183CE51FD92FF95D1CDE012D1CAB59AC86A4FB863EA104FB2825FACEA701165A1E490AC21AB803BDAFF42F409ED644B2410BB47F154 H_OutputA = AE17C252C310A92F01678DF4F25A086C33662899072D1CBE654181769A9BD5EF DRBG_SeedB = 282A89C655C0C762ED77206AB2306336C65A3D44698759F5B7BE0A5AEDA0CAB7 H_OutputB = CF2AE03850F4609055591EF9993878238E8A594C479026597E9579A1FFC1BF8D SharedKey = 482579DD43E68E29A75320A1E29B1E13E2CBE03574A1F424D814D7D6F48B9475 DRBG_SeedA = 49E2BD5FCA2514F7B552CAD92A315F4CC55EDA9399A67EC4E283E2FE6F01C21FCC37E6921D03C1975A2D36B9278A9FE6A4484997C9FB9E9E5BB96309A2631264 H_OutputA = 5C8AF650ECAF6D45CD9E44292B52B44F471010AF48F28651A5CC12376EA4F4DC DRBG_SeedB = E8EF02F06FDCB5F1FFC7AF844FB9E92340F05B577D467BC299DECC5B06998681 H_OutputB = F62489597DADBEF00B326AB42F3E6F585D1FE37516B6D8DB89030990DD8FE3CD SharedKey = 0B821BB33E112401FB17E7B642A9950914B2ECE24FE7B0E7D18AAA7F4E0D7420 DRBG_SeedA = 79A35A388C1B28F489E9C458877AF7FFD51F4621EBC4A68CF338CC469A82725AEFBBC7FD7505E23CCA669F648BB0FAE59C9151DD495FC923635AAA4B341CE8ED H_OutputA = DD6BDBEA9A80F5A02A6044FF120315B2B98167C0A9EC162F16B72AD338B1C148 DRBG_SeedB = 9C77DAEE53751C844D98CC80300947307F2D5FE9B94E6452B7C762D94CE1E676 H_OutputB = 67EF6C68FDBB68424AB757940F2EDB1CB21F8F722BC21A060C15F8077478A753 SharedKey = 44F563BEA78FBA0F2BA8008BD1D5402CCDF6556CA4AC868AF09D0C67446D485F DRBG_SeedA = 4498B07B816B6F608854DA26FE25DB3EA4CE2B360FF9CDE761AEF4220285395DA578CB37FD2999FC87DD6AFF96D8C74ACFFE5D3EF20C29106F9C4C212A66EC3A H_OutputA = F51DB8DAEB6A3766526D671FCB712F457CB9BF12E2E634A430596E7F1E2A39DA DRBG_SeedB = 1E01AC3F346A6A3127E75F3B7C8AA49EA05CC4DA779E0D08726B98C4E9869296 H_OutputB = 5E48E547309C69ED01FEACB66DF825C172DDEDEF38384824420C399A3E4E3F69 SharedKey = FCE4E496FBC256285297BE16BF714679B424379D045B3A5E954AEA996293CE88 DRBG_SeedA = 966D242F9E042B47E165F181F9BC6E83B534F769C0A34044788C49F372D025A4444711AF39CE3BC9839AA095AEC6915C7A13803D2C10D861747C627D240D5674 H_OutputA = E282BA082275E815A4825E4AB996612B37DEC9F293842B1DEE746A8D4D429970 DRBG_SeedB = 908343780C84EB7275079A8BF3375549012A180E95FB2FEA7FC96823B9F5F8CB H_OutputB = D5C3CCFEC39F434E678A6BEAEAFCDF8F8B2EDF4D671BE943D7F8EA8AA61051CE SharedKey = E419BBB2F803ECAC56EB4BA4C6E72996030E70A29839646BCF990F8553912EC6 DRBG_SeedA = E16E8E8C01657E9B60B18AF70DF6FA3CC6F49F2C5C4121B55D033782E7C8190D4DE7394F5EF13D98707F54C88B6FBAED7F713C11BDCC0FF7E5F76DCCB4092F71 H_OutputA = 7E78997292F645895E9B5CF75ACF6A8F542B566501EC603585FF40BDC6484504 DRBG_SeedB = B0AC85D66C4309F317965468921B74E3CBF544F429A80C5C8B11EA0EE6C97869 H_OutputB = 0313227BE22C28359CC643B1A6E3AF15E9297B5ACEE78F25146B9D125AB8826B SharedKey = BB3E19F6F899F7000EFBBD10CECD84E1E64A241E0B6B9EA5A4236DCE00BB18F9 DRBG_SeedA = 59F0F7ED9FD0E0FCBC34BE0D255DEB1A9515733B2177E365AB60EDC904C2E345E5647C67F3CB594CCE419059323A531F4688706F055CA9EA9091CC0836D3AEC5 H_OutputA = 0A13746ADECE1F5C9A542B4E0937D4D9E3C45392B041926D8C45CF6A6CBD50E5 DRBG_SeedB = 6FFF0918A8B17BB4ACB43CABF5ACB7B1F713705BCF61C6226F9679A66084D5E2 H_OutputB = 0343363774163443090A752219415AE53D50B0B1CC7F1BDECA442A2AB7E75427 SharedKey = F18A332CDE03AD83E23AAC8C27AB1D8709762E6DF5A3C297D86D685382D0DA9C DRBG_SeedA = D7D8EDF8C90AF47D8898BE6EC447ED8E7AB63133C7595465C37139D163ABF567EA262E82C836313BFC7F287EC29D53FB5C7639AD8404673EA02012AAC5E94B41 H_OutputA = A661E6ED75F99B020FD67A543AFA8B20E88D12D50AB19C2F6439D9BC99CD4C0B DRBG_SeedB = 2E1D24EA419399FCC8DEDF74C7D717272F06986E89987EDC215CA123AA2B60EA H_OutputB = 6E0B0F342ECE0DE5A41687068123F22B5E69C7F5205C5145A7EE9434C7D3D536 SharedKey = 5603B20A652A831AA732E02E68540B42E46261100D7C877803ED9E2CE3222D13 DRBG_SeedA = 7E6D69974C670D179AA9F0B2E3D46A5C034EC803F8A401AAEA31BD3DFEF22657C3FA3B6EAD2AABD53685CBED8A11D81D725B175D8CFB1CD4408B4E747DA9FAFA H_OutputA = 9ED0983DA20962BEF8AC40A8393A8D675BE474CDAFA3C51EDE50980FB2021051 DRBG_SeedB = 3EC22EB470CF9FA172E2C4E49CC6EBC2B6B13275B70449308874E9B691299DF9 H_OutputB = 32E2A7E24BBF5E790A87CB6341B88051926D9B3B4A45F902ED4639ED142F6B38 SharedKey = 449293CBA32097D7A360406526E8DC42F0CF354A4E9431A362F562F297140D89 DRBG_SeedA = 2ABD604D1B6ABACCF3C6BA365E324A23876A9BB78115C08C26B126092831C29B955553CF4AA2CC46C5F0F2F4EB3480274DD6997AF11723626AFEFACD5D25F1C7 H_OutputA = 77A646EBB79CD3A3B6F1AD01EDE49F96A1386C43429E2DD9F4CEEFC95BF08957 DRBG_SeedB = E97BA5B0851E7CC98BB3C9D273EEE4B113D0E86B22240A1DC009DD3B3F7E5702 H_OutputB = BAD2056F1D4912D87BDA722405C77DC3D4CC28A773E2EC0063E5A51C8269CDF4 SharedKey = BCF664C0B4B8A6D8ACE874B31AEBC5A4BA08C9011A9AE7DF5AD79842F6B11866 DRBG_SeedA = E038452B725F25475ABE833C8A5FD3D4F889AF913743C7EB7F77E0CCDBD37BCCDF7014BA20D8CC7FA5F341B0A25BF8B393C94D3FA915B6DA9DB5410C6C51D4F6 H_OutputA = 4156620DF4466D8B240EEF87FB52C71766AD47B20DDFAB9B3CE1B3990C2ECFAB DRBG_SeedB = E568D2E9B47C20FD58EF369B9E9AEB4C605A3A7041F064422F81B2E0CA6E8CE8 H_OutputB = 441C7774A9D538918D38A71A7ED90752744D14077B55D0904D612CBA9DF9A640 SharedKey = 648B73621C58D1C7D407F6E2FD28B6D7D3EFEFD7FBB0B41C6068005814116B95 DRBG_SeedA = 8344A6D9C2BF7A810751349BB4CF52BD6E6CCC72109578D5F4D877F9041AB427C8866C3E906BDC2D4D373B81D2153601DB1375FC255AAE06530C8323238715F2 H_OutputA = 5539CA4AE3237AACAB25DA8CD15FE1042EF55A38DFC37A06EBEF4887C5B4C891 DRBG_SeedB = 1E453B823410C6C9FEDD5E0DEC38EE4C6EA4DB3154C5A2E64FCAC44B54174B14 H_OutputB = B8EFB7276FBD04263D232882AD2B53A4C1D6BBC6F2042B76E149FE9C0A6920A0 SharedKey = D5327B1FB15C29AE9CDEA99A8FF3A2171CAA59DF14646BAD76DF6EBD983EF6AA DRBG_SeedA = 61E5EED6ED0FD0A025BD9DA2AF5A9EA3E1C19A1D817ABEEF05941583C0D153635B1E6718F2FA8D1615BCEAFDB0659A533986CBA79C6658F149E0A1C5B4042905 H_OutputA = 654C9237AD6FF1D09A372A8F31CBE3633960CBC6BFD2C828E185880D9543BC77 DRBG_SeedB = B4E7D98C0FE7E122D603674E4B6D1871B3D62D828CF73A3052284BD16B37B2AB H_OutputB = C8A963FE6684D55553F6F8BAF50085D5684101C5F9CAE59A3F481216F8E0B5C6 SharedKey = D7B9C5A2710373051CCCFCBAF3CE044433E66EEF343E9339E5D52E06E651F9AC DRBG_SeedA = 3446807E23121498793B6865D7F840C96203E339BF2506BCCBE4CA4028F235D472BB6861B2A78AF3F69EEA3BAC261B4979F753DF47D051B7393E46AE84C5F719 H_OutputA = BFEEACCA26EED2453139E6AC0E881141B173557EB98306D95B912085346D3F1D DRBG_SeedB = 59BBF443854FCBFDF7F242FD1865370CB44F931F47417DE6DA881D793D8EED75 H_OutputB = 59117D3BCEB840CBF9D5C1D99A4C569E9799EE6B3F5C41726E2CAC9E31E3F225 SharedKey = E5D7D4CC7C6858B4F8F6AF06867047509499D5DEB0E2B07FF20174397C2B7147 DRBG_SeedA = 4181C82AD9B141A42CFA2B7BD047EE63638125CC3A93DFE0C042CC1BE151AE28A68D3601086DBAE48D1A516147CE7CBDB61FC98EEAAD136B106C3FE41B2EE7BE H_OutputA = 462020071EDE53F418F1A13EC75A5DC0AA6174D66BA2F03B3CAF7AC90CB9493E DRBG_SeedB = 94850F4AAB51A8CF64CAB1D24805E3C2183D0CF7201419DFBFDFEDE3927A3D95 H_OutputB = 22DA162064B2EC71185A9919AE8415C29317DD93CEF177C15409D2EA5CE1160C SharedKey = 5B55B18D674D99E3DA55771ED3985B0B0DE731D4AA12EB91A3088B629664398A DRBG_SeedA = 0E8A0134237CC74DC38A87D96E2370F7F6D2051802775715D9F6542FF173A545B5A3FD9E3844BC71A90D1B969429AE63F67AAE007286F060A9EBC680FDB9CFD1 H_OutputA = AFE4F19F9F1EFEF0D5F3508702E9599FACF5ACC58521E45E7077C74EE04882A1 DRBG_SeedB = 5045EE8BAE926505D6C7D23D7BFDF4EDCB5BCCCADD4DFDEEF301AA2849F7E3B4 H_OutputB = 6CBE053B876C3F83D7EF46565A98204AC9DC0F1B671545EACE4ED79C2CF196EC SharedKey = 91CF522D21E32EDD3DEF5B79BBA8E19FA895B1E1E645877458655E31470C7878 DRBG_SeedA = 32ADEE0AC5A9F6A28ED24CA76DA854C0C1A2220B82533E213284263C8FCA0D3A81FD885ED83CE3E6723BD59DCC49D9F9A801C67DD18FD9F0D5ECE99EA0BCF8AB H_OutputA = 177EC48DABED5082BDD235898D3E7628C7A6F3A73BD1F7C35E345B0481DA4036 DRBG_SeedB = 8DF0A537662AA7A7811DE9C529177D416E7DCD556FD8913A4730F69472FA23A4 H_OutputB = 4165F6F8447EEE69D1C69F9F9ACDDBA0C89883CE189ABE9868A5E0963E9A3D12 SharedKey = 44D3774EDDC9E285A543C1C1DBE63B47788CF5EF08EF5D35576F79831860D7AA DRBG_SeedA = 8499F35E49445CCC584D5AEC213A0CE239A1464945C4CB0FA5D62CB1C060292636E415415A0A206385C675B1CA8857DF042A0791B4AE75513320FF3EF06F55FE H_OutputA = 827DFE1F0E0F5F12B7ABF8B2FB285ECDE566247286989BEF2FBAB77D28133FD8 DRBG_SeedB = FB3602E44294CAD6BEF146377FDCF99447ED32D080E3353BAE0BC2F31BE3B85D H_OutputB = 8B1C0135881C7772C481B851235D5B957B08080D2B967F1921402779D4F70D56 SharedKey = 10DA4D167B3C39042AF31783BD0750E16E7B351D43000557CC54154618A4B04A DRBG_SeedA = A668A946C7F47357E9AA10BD6BC9CBAC21302198BB84DD2EACFAEBACEBC4B880CB22F8D5E457B17868FED296828C7B79DD6916DFCE1803D06E8FEDAAB264864B H_OutputA = B0F55496DF6105BA32137CFE872D4F26F5D01DCA97860EF347FC6965C07B95BD DRBG_SeedB = A03538052CE9769094F54B4818BC64B4F3A8ED5A017D5B337F443E2D6F590D6C H_OutputB = 8809454F84240F3A41F976890C6BB2BB533BECFE552A82715DA6889C2728EF56 SharedKey = 4F5E0DA953931ED14AA08BA42509DA1860144FD258ABB8710103D78FA728A0F8 DRBG_SeedA = E491BB1703AB6DC8F3B49E2E83CA56D34B98BA72ED162235B5ACB619CC7437CADEBACF6AB8B8075C3F52EF483FBE8FF1895076EE3472C2756AC8DFE1003BA065 H_OutputA = DF40E6A6130C9D8CEFF70EF0BE0D46C762F2177148304C6FA78DF15DD7180E5A DRBG_SeedB = 3FE597B526A010F863108A6225DB6728CE9D39A988CEF6AAE3FF27F90CB95289 H_OutputB = 84CF10D7E5EABD8BA4DF6AC7D46A0E77DAA079C6EE91ADF4C26DF5BCA2C2C77A SharedKey = FD396B414AAC2626571C6F03A63D694C3C2E6AD52C809BCCD4DAF2023AC0076D DRBG_SeedA = 9CC69D88A97B1780020A9DD94662B32DDA75E73B3566C6ECD6D55CE20703B4398FC70C507C22E822EEF378916F73FB4974B2262EAD558CF9FF9995E1873CE8ED H_OutputA = 0E2B0338852304730957B882FCED126400217421065D105BC953EBA951084F56 DRBG_SeedB = B19C94C5E79914D62004265107492E2528F1CE60FB543648499C9BB8D4D64882 H_OutputB = F98C39D7E55072BF712C065670951550F147FD40FAD41037CC24A214527CEB45 SharedKey = 550048838376902E5EB831A737B4792463970521A3EB091213DD92F3E9F8D552 DRBG_SeedA = 3FFF8D8EFE4BB607227F7C640C23A7E8DE1548FD2482E558E6D1A7228B3D4B4BF64F4477E6D658F8A2185CDF8ACF3243D365C0C952FFE2A8D04932CBB0CAA4CA H_OutputA = EF24750A0A5FE48CFF24EE72E918A5F2E0DC4FB0D28E22CD5BC8A7A7007B6F47 DRBG_SeedB = A9F02E2F051F2E650333D4F2AD7FDC140E500AF663EBFA39960291FB78602C70 H_OutputB = 98BDD07181C63F0980028142E7C3BEDA08CB63E970B15383CD3743A69C44F189 SharedKey = 7BE87DD49F27306E926C195F5528DF7D2B1F5D4290B25F9EF583031570F53F28 DRBG_SeedA = 1B176B6B728FF4EBF74C49156B3E0D5D7C9D5B89902A853FA83F992063938FE4CFFEE511E61EBC1FA2150C3BA45366509A9EA2966F8036852DE830D5B806F0AE H_OutputA = AB91EC21869C9D5D275A19CD647A7865AB13D4A75EAE31AAE8E91CC55C178020 DRBG_SeedB = 3C05379CD47B82C5A48281D772CB668209E126A8B9E8A2C21F5DCE0163ED30DE H_OutputB = 8A59D4DD498190B431211F1077B1A2A0F847FE72C4959615AF164F31B5EF314C SharedKey = A993F4354A9D4E3798AEB8364BAD27DDC79830065F89BF06027D09C7D27EFAC9 DRBG_SeedA = B83434EEFD3E01FEF97B78FA3D1B1F9B6D5B8DC86FF45E5CBD1E41226AF0D8124CA1C3C25E124A13E46136BE3AA8B816E21C70DB9F32CB10C8AD015BEF39A38E H_OutputA = 33F6E7DD3260C730E1F28D97313D892A649CE85DF443DDEECE26582CC6EB1052 DRBG_SeedB = 31C7BD31CE9BE01568A9E584C0B7896C9728CF35B745AE30253942FFB8DC65EE H_OutputB = 741F4FF18477A79F1DEF49721D1C9534C1BC06B8B9A6F1FFBC88BF454B13E6E4 SharedKey = 1D3229C7FFB0C1F11C1F30808273AFF42DC153F37416F140D548FB6EDAD851F8 DRBG_SeedA = FC168A27C0B4BA2624C5D7662102A02A97BFE4128FBD1A065C02398109A9768DEE35E8A07DB198EF9612867EAD222ABF21043FB904C8BE766251BCF3BCD83174 H_OutputA = 8A80D0F145221334650272CAE910C463621E1287F4B22C4D73BF2B6D4ACD38F5 DRBG_SeedB = C6ABDC2719EBC62614286E369FE83B27C82189878B625ABD5AE4102DDD50A5EA H_OutputB = 5B251E0A87137FE3DBF4604CCFE29CCF2885DA20B36D8A1EF8A1805C179EBE36 SharedKey = 04C576AD52F80D60EBD4FA667CC1A3CEBE910FB5CB1F6390AD4C68C2B6475148 DRBG_SeedA = E38455CCBB7E676C7565344359737D79C47EB71DEFA14B226094A3220D8DA53EAF0F16A947E194367EC0D8B4D7FA8331105B14DC721C2E6A2A402FE19BE8A37D H_OutputA = 59BD987EA6E3D11CED35A38DCE9D97C6B3702D81B902B4BE83432B6F236719C2 DRBG_SeedB = B511B9791ACBFCC7865FA6E6DCCB977BC78F47127E2EF37E292BBD0BD6B8FDA1 H_OutputB = A8245E15278C21EA1548DE311E4196437A1487FB8A471C5BD95B7304D12B537A SharedKey = 01780AFF20EB473134A85CAB178E04DE030F065640F74D21AC912CC1D3BD2245 DRBG_SeedA = 2B3EB8A13F92FBF41D970A4FBC905996CCD50ADA1974550E1D77C2F1A228F3F7C6709BBD5FB0FF513F02864D53CCAFB2E5D74B1AB7E5DC4A87F414B081BB66CF H_OutputA = 06F4793F2CB5DB35D0508C0D0D0CEE6ABE78D52D848AFA953846383FC71F7778 DRBG_SeedB = A7EF0C7BD19EEAD821B0DC555750E0D2009DA5346A5DBF1D5392A07638077508 H_OutputB = 5A626780E5C0AAAE825060C04CE7ACE312DEFCED505E04453A7F99C839CF933A SharedKey = 87BE1CAB71F1EA788C2CC9C54EF4C81DCA8B643E966E454197413B9B1CB7B4A3 DRBG_SeedA = BE59D343616199498736673949018D1766AF589B04F71965D2DEAB5E58809E3D7491A24E627B4F507A3DBCBFE0B391C38B1529771D8CCED717FDDF4A8FB4F098 H_OutputA = 1289E8E80D743A7EB8B321304CF86D6E217F7DA58C573D6507B1C804D3992801 DRBG_SeedB = F566B0F15FFCB34B45A541DBDBEB411629A1156DE2A5F95A79D037A4BF531DE8 H_OutputB = 6263C9FF0072C2DEBC9926C53693B721AF08A60B36F987001EBC554CD2A31404 SharedKey = 4E7E72CCE0C7522508BB82873799A5260FEFA137A2B0935A6C04CB22535948BB DRBG_SeedA = F23CDB8855470083651FCEC71BFB1B048A97CBF2AA2BDEBD9F961C1ED37608DE6602CFDB60C477C564E0FBAE4AA163321273E7DA7D2B34E3D381CE359285EE48 H_OutputA = 0E8773BD7A879CA57CEAC3127C9DBA94540EB54E309B0F41E790F1708694A13A DRBG_SeedB = FA35F0E4507738CCC19060A4A7F1A5979D75193B7AEB4741FB6A9E9CA4F8AF3E H_OutputB = 8EB29A39E0EF52A3431A95E59F346E55D4414FB54A64515F1A69074A428B7009 SharedKey = BBE774D3E1E8B31254926C839E0459023102FE654EED9E2D262162EB28836608 DRBG_SeedA = 422522A8523BAEF0155BA5878DD3A907F85283FCB4735CE48FB798160E1D1DBDC87781F1865D13677080D79F893F783946D064A6BDD39CEAA211DB1B191D06E2 H_OutputA = 2DA5E08FA9071BF485AAC7BDEA5C1C16AE661DC481C92F7896D0A30A86255077 DRBG_SeedB = F02003FD171A386835F874EA373F78D47264BCE84706545D83704BED60A3CD4D H_OutputB = EF85732B003EABC503C9BC8DC1B2C1AE76323472F69767D8EE3E70D0E07DA4F0 SharedKey = D9D432F54B7C936161DA1E4D09CA0E2CA569EF80A8C3CA9552AFF7D87B3A0AA2 DRBG_SeedA = E8B1575ECD786E6DBCBFBB7AFFE2DDD335AEBAFF7651276D4A77D9F3373738926DE0B1EC1BCCE1ABA74CE3AA4FB14D7F4A53EE260481B1E1396A67D0EF295532 H_OutputA = 19CA4EDFE642D1FE1ABCA36FF63C4EBBDC120A28C223A10F4556F7335F73E2C4 DRBG_SeedB = 1D4C1A79D40048FE9165DDD476FD89EBAFFA297286AF7A31B1BBCAB343F139D2 H_OutputB = 5E48CB07EDCEE70CEDCEF6A411DED4A5E0C7FB1B8A82EEA1BBEB98C803581705 SharedKey = 9B273EE349C3A4B9D4BCE49BA793708C78639D93DBDBF7EEDC9A557471E1E7D9 DRBG_SeedA = 9D5F68F11311CEA2E0CE64FAAC4C9E3DCA7CE0D971817A96D035424E3D39B58E7F54EF49BFEA513E80DFE6D4E14C0795508165077DC537DC6C0DB3EB1FC607FB H_OutputA = 7C130345D2DEC448DD301E1A6988D84D2F3FFE181F43645F636E39B72564BE2F DRBG_SeedB = D8CE01CB7B12E858F421B9852D31E67D1B90449929B8DEDD50D5A5BDB52D69C1 H_OutputB = 50C41AFFD8004BD0C92630439F1DDE62302EF034BBFDF23BA49519B4BDAA0C13 SharedKey = 3733D2277DFEFDF1CD530B91230BFB3626368930DAECDF33C7B122198D676FA1 DRBG_SeedA = 138602F5CE55F310D8D105F4F613D8C5A3CF433072928127B3C9025EB98BC3B727990CFBC906369F9660C0206F51F4190D67F4B7AB806E92F5FBEBED5758F179 H_OutputA = DA0F56A5971F4A5287ED5D1067AA7FD6D1765553EF9BC5DB1900427FE44214C2 DRBG_SeedB = BE6293F2ABB73266703AFC19A785CF8D8088B62455739674EB1C8C502E1FEB7C H_OutputB = 7FF14D676BCEC4408148C1E942B74ACC6F6177D966C02A748E5253FF896BCAAA SharedKey = 0E443F3CB3B4A735D9260BAB601BAF4FE8FC940C494AB95382BD5501B1A99AAD DRBG_SeedA = 488EE0A2C40D115E0E3F056548E7099D77BE89A4FACB477A9C92DE786FD6039E0915937B047409537B6DBD378E9C91D54368CA8D0133F4D87622B31D67B0954E H_OutputA = F35D95853602A50F8B47718C7A5D4C20AC6792463996CE44964E8A81DCFF2496 DRBG_SeedB = 03A23814D3093D725CBE11198BA9CB840FEF52BDF3A4580E37232499B7720A87 H_OutputB = A83D6CAFA262C3C79ED81E29BEE3B83E77A69E0151E57E49347E36AAF867EF86 SharedKey = B19E265157722C8CC30B19F2A80315B8B83C622E404F52FA0DECB66D994C97FE DRBG_SeedA = A3686035F8207B638FC35C8BFBBF06F3BBDB257A6E013EC84699CE933248274102DD6AEF5FB82347A619BD15C0DF138DA5002E007945E87DB8EA54F6A0639D35 H_OutputA = 506503B382E12B70CCF15C39D28A7601BD12966C471A1469E331A001038272BE DRBG_SeedB = DE743C6BEB0C4F8DB755AC584B2CBADFD0E217726511DCB7737119BFF830A1F9 H_OutputB = 59C81830CC17E6F00C692BB07563BAC6F6442CA8F04F678662BBB51A040DE7D2 SharedKey = 0530F776F41590C4E6ADE6BC92454346D3034823EF05C01511AD7931B23C9D5C DRBG_SeedA = BFC2750520F8BBDEF11B706C43EAD7F79091C22D65DFE2C85188265CACB81164B15A60B3A15F7EA720FC71AF9A93B7A00B3A401C64E91B42625646C9DCE42194 H_OutputA = 4D00A2ABF0336C06BE3538CD1BA4C3BE925181C517F4F97EDC39C3813B1F3CF2 DRBG_SeedB = FE3CA15C2D3AE9A41F84F65E599D00E05633437DC49AF5A0AF27E36FE7A8B569 H_OutputB = E3ACE29A123B0ED7387C40A9B9142C1D9C931DF44251DCB5E93B91D9D8B0FC7F SharedKey = 47B2E4EBC2B66F4E699986BA7CFFCBED39AB0B2AA9444EB70ABDA8E7785F3FD8 DRBG_SeedA = 5079985BCE00B5516429DC9C313D3F5684C8F3614DC8F0481351D6BF642016663312D7B2B89FAB6A5F87C6E823F2DB1A43DF50332C9FD1F54CB1D1CBC23DD553 H_OutputA = F9A79283C3BEF4D27A9394D12F327FEBA621F08D093EE7CC28C23D4D69F32752 DRBG_SeedB = 03EA73734DF48EBB3B7991C9A95E2A32CCCD7F99C171BCD88B29CBF5188631C1 H_OutputB = D915B8FAEFFBFBFFB642F2DD001BD39E1E21897A59C5595D1319DD45C88F8F13 SharedKey = 4B3B34063A380C6B42F1AAE04486192E5A6663D3AB6EA0BFD06E29A07AAAD6D9 DRBG_SeedA = A2B587F54AFB3C69E8740092ED26839FA79465D91B9F113013544F84ECF86279276C8802E5C1ACB6403BDAAB3595FDA8E2F82BB9CE2D3D0BB94B1797325C5008 H_OutputA = 6EA11816DF1D4D939CCB358033B9C318804CED56C2D59075C9E4B5982D87D828 DRBG_SeedB = 9069B066FC495CBFC83DCCA0E092D54670FA72B0DB59A2A4F95A1AA3B2944758 H_OutputB = 98FDC523BDC0E65DF9884A39EB079A2505CFCAE9E7C98E35A1FBB36B7FB1BA52 SharedKey = D2CEE1309FCA1D3FA5034A4BC6DB536892EBEE5DAD2BC3781E2E4B9FBEC35986 DRBG_SeedA = 662F4D6D4CF134230FCFEF61874B09733CC2D8765C45008BF87339191816BCED4543D21D764FDDFCFF31F0041B06AB160C6557FD93E846ACDEE6701FFCA162D8 H_OutputA = 038D863BC73E32DDCA11770C77909950BD7ACE02563D8E00A335941EE4084A93 DRBG_SeedB = 3708240F04F1A266F6AECA0AC66EC8391533083E7666C8FDDEB7591926A112B2 H_OutputB = 0BD952B00D7F9BCAB739AB07870E9176C9675D47B3696B221FEA688431F280E7 SharedKey = 4F3C6028BDD4C89F07E46AFFAACC4FA362665ABDADD82AF6BF39DDB7CDEC90CC DRBG_SeedA = 7E71EED63D3F22AB7359272214C8B7AB4C2D83C1B7A34DBFEEF703A8793B271971A923B68C6E46997CC6CAF456E1195D83E709DB44991750EDD8029415007A1E H_OutputA = AC9E6804D743D23040898D1E2CEC8DA338D9A6F1E01E107DA03C9AA51604D72B DRBG_SeedB = 26C7417820B32BB18925D6E7CF991D656A2A5C6F2EB862CCFC7480478CA4F256 H_OutputB = CF5282E1F4F8F79C459AF2B6687F2F2E96FEBF9F186EADE0AB40F49C19391FED SharedKey = D6118693EE4E1D0266CDA1B631258B5D0B9B17E2954E2F4C291A8164F3D55BA5 DRBG_SeedA = C38AF827F0FFD88499D87BDA1F58FEF20F0640E134069B0E1DC8F7D5EDF91FB27DE2449DDCA9D131431CCB590A0A9C39FE6B8D5CC74A3114ECF5B7F42BCDD810 H_OutputA = EC1A27498B19E8882CCD38DE6997C0A2E1BA6B085369E4D766FFE2D4B4C06987 DRBG_SeedB = 62FE5B9E5836BB8391A42961C1572CAC7F274E5C92000DFE0D27865C4C95AB19 H_OutputB = 781A323247D3845D58C897B2FBE8C68B6AD6CD2A617D34F945345E67D90F60B7 SharedKey = 15E3EA8C23062395DB6190DA74B3F51146A95CA0A59AA5989C375B29EBED0C4B DRBG_SeedA = 756A7276B744D4394718CF3AEC4148CBA6B9E2B7C42B5C96F8C83E6B194D29FA052BAB8A76EA0BDC4296D9A9016135B692E34254F5F0E3C27F7AF1432F1B13F0 H_OutputA = F91BB11C8F22C3E66C741EB77814115542F89D6B713E555EEC4C60CBDF7D22A7 DRBG_SeedB = B9CB37BB611540862150594C56B61D7DDBAB40A89FA0F1C7FCFFF31FBDFF0915 H_OutputB = 9CDDF3D5784D5BEADA30A03CDF8CD67C988FD1D5FC281E81E5129D4C7F55245B SharedKey = 99376A9EAE03265762AD6E4276316900C0075BBC6844D72A408E7CA2472A2C7D DRBG_SeedA = A30D55C6CBA89C56AABFC3BEC86D90B2A1A5DA01396D941AC6E038823D5224F54376A45A4464C78CFF0FAD7F0A06B16E78278C846A49AB7AE7D79936C29A7658 H_OutputA = 77DB84CE51FC329DCB7DB1628902CC74F552FD642C8DFDBEE69171EBA5FCD4B6 DRBG_SeedB = 197EB3D6A95F2771B4BAE51E452C7693FE6503476C3D578F5F6CB4354E072084 H_OutputB = C3AE01F6E7C21ED9FC57B78AA4B61A8347D5EAE08F5EA84BBD0EC45EFAAB05CC SharedKey = 4C77736025A9FCEEA8C2695C06ABB1A5E2AC362E52B1091361FF70F9E3FCD947 DRBG_SeedA = E468393FC7D56BDD98F95AB874134D830DD02F1766AF7C761699CBD84EC2514D1BCB4C2673DCBE6EF04252BD0A0D337E73FFD9CC764E75C6C8659C077E1A3221 H_OutputA = C0218BBDD935DFBE1CC3E7A812959A683CA85575AB0B0E4FE9AE1275A3591F65 DRBG_SeedB = 691DCF93FF47ECB9AD4BD358DE29E9FACE6DBA6B41264DFCF772798E3A1FB926 H_OutputB = EF41088860C773F80D35B5B455F03A126EA2BF9FBDDF63608E3174ECBE114FFC SharedKey = 195D4173FF312CE3B2BC53D562D927292F3B73A5612DF12A1CC5F2132B849400 DRBG_SeedA = 94B1127BCA3313F868FD52966D27760BED902A9DFBA9FF1AECCACE5879439158379D51FAFBA6B39DE774F1D90EEFCB941C6303124B1CBB7F41D4F7CCED27C332 H_OutputA = 37A6A49845F39C87B48B0B605A54BCA818F06AFB80696A8E990D731638EC81C8 DRBG_SeedB = 216D1346B06FAA4A2CA2C190F83695B855E6913C969D20692085A8E443887376 H_OutputB = FC42AACFCD876C83A648330EF905C93C7F2993EA3A95D50CFEC74F47A7EF4730 SharedKey = 7DFF884FD3B38FA66F6FAA91AEB5E1EF9D60452100007D09522AD90270AFE789 DRBG_SeedA = ABD520120F20348DD12649B7286C585A6053B89CB7C0630354B35CF53F086801854240798103791700F6EF7CBD48F8131D64BF1F715ECEFDED8ECB983C8A6516 H_OutputA = 20F0AF97ABF99A61F615AE65429A7BDB9AA38E7E8CECE51557EE92C82FC58481 DRBG_SeedB = F5283D4F593FD0DA1DD4A47BCA55AA73B24C270B94A43BE3CEE1BBD4DC199805 H_OutputB = 433DD30B56CD29F429FDAA1AB910949E2887E83FFC130BC5C1C24340EA0358FA SharedKey = 6D82F70F8E809A3328EA73D5A73C290EFC04CC58B426588AC51632A85EDF43AA DRBG_SeedA = D8EE299B120C721E565E8D7A769591712F007A91F404C0394DA7EF7DE470C81A1E5854C2CF72FDB683E176BEC57D705370F48B4FE7FF74E5EC8ABD89E8057A8F H_OutputA = AAD6B62EF768C85E2391B45697E5B9B1C3B032357983810C135C75104489316D DRBG_SeedB = 687C154E0BB8D217551EE3772E82ADC50FC166423876CB4D6B1BAE71B82B5CCE H_OutputB = 6D933259010CCBAC1319A0CE4215171EB237068A002E4308AEA4903E7DB63ECD SharedKey = 7405ABB1343896D4E90A062062009C9D8DB5712863399F8AF3307A844D32C42F DRBG_SeedA = CD2716C16B64954F63E5C8F8F6646A9BBEE637D279F4D3F9EC0C8428DE8787DC7FFEAFE6D3DE19C5DB554CF10EF06B22F8BDF70950C7584E96B4ABF00E67A324 H_OutputA = D6FE7E7D22670967E82AA68F165015C500CDCB69554994596715D47EA46D84B7 DRBG_SeedB = 16C227A929C9DC997780C394C946E08A7CE9BC61FCC4968B0EE37D94F97A654C H_OutputB = 89DC19C9088E33F24EED65BE6E7EDBEA3186D63F3C258D999CED7050F60C7079 SharedKey = A46F6AF70782CDDAF325588C0E51BB2E2401306B9F0DD4FAE86C09B63BF11E24 DRBG_SeedA = F1940DED8C7E711EC8E55A038D28FC4D95060A862774DF8ED545AD7EBF27CCC1930F89C130DF373479D336E5F364DBF7D9F598A2045D72DE0B26DFE071DD897D H_OutputA = 0533E622D3DF4BAB2EE10B3751C60175A9960824A9210E77C43F1BF39B6801A3 DRBG_SeedB = 2C3B8B1935DF54121B6C42750214A979507DEE82FD48CC7A6FC7BD9459B4C8D5 H_OutputB = CA536570331B519CF1E37BB685B82338EFF18D109BBF7A20CB661303FA85C8E7 SharedKey = F755FFADC248437904A4E608A272D5C359567DAF90A5A16ACC1CEA0C23337B56 DRBG_SeedA = BCBC510E7BF5A418C95BE42D2339C625F887BD6ECD8B64E66C48ACCF08772C1E855A7C6B3F80E6AF5CED850BA373741425CECBDDB18C5D4CF8CECF31945761BA H_OutputA = 681EAB63A8DBE4AAE73ABF77A801DD78A1AF91B061D54E460646EDA49A728EE5 DRBG_SeedB = 338B310E4A696075E3F49291CFFA290BB8757C959BC31C88C1C7F944C5598B2E H_OutputB = 8C033EAC0759AFBD3AC78DC64BABE3B0C2BB4BDA5518EBF6BDC2CD17BB673F8A SharedKey = 0E16312DF3B7F81DB350A4CD09CA2494891FDA5371D1A7A72824ED5A5276CE2E DRBG_SeedA = E17D8C9C00C61710113D80D06BBD0760CF97214070A1548B4BF94EF8EBF555F9629D529172395E7054F496F9CC0E29552102F83F82FC492581FCAE01B4823A09 H_OutputA = 27FEBF2F30DB511D2418D510EB2C08B8801FB70956EEBF805E50BC0FBBE681BD DRBG_SeedB = 796A26F083E58DD18F717C87A268285C1AEAFDC95B19739DE6BA4FC6D264F214 H_OutputB = AF3794C4DD8C703AFADE4B1B2DD4FF342E62155B5B5BAD7B583A21665A5D665A SharedKey = 5A4BBADA1FE99200B937241CA4EC4AD81403AF838537CFB7A64FD07A6267F50A DRBG_SeedA = 4A15C22331EEF350962E92AA95BD780A9FCD6A7A2FDF3742E99309E6BD4A034D6EB9A7F766BBCC54E26D551B037BDB0785C4BD3C02A9786A60A0AAF427E3CA2A H_OutputA = BE61BFEB5B4213BAF48323ACDC6EB5BDD2126F7708BF8E95BA2804AE63E08406 DRBG_SeedB = AFBBDDC02CB4B58CE9F8F0690823B675DDAF0F68299C60F97686B0B4D858A6BA H_OutputB = 0B0880556E3E1A75F89F05468DA8316F5BBC2AB0BF4C4E3FEA097F6209E31C15 SharedKey = E82495121809951A6DE94C45FE7576DF0BAF493E462964F00BF04CCAC4F9F218 DRBG_SeedA = 5E68F261DE9B20CC6A6563301EDA44E69BEA53DCEC74A249C269FC2DFF394EA95EAD628BE07127C3CB4736CEA24557A9ACF26AC1E686EA1C5D499BF365B5E7D4 H_OutputA = 9E1A9DF56062FAB1254F922C6D4CA326560B52E0A6A6B56F08FD2572BC765C20 DRBG_SeedB = 87A9B6CE030A132482FA203070C780425C460C60044968FD9C8C2B09432A3351 H_OutputB = BDE24DA4A919C0D84DC712B25B525F127441B8BFC89A187DBDAE06E1A1AD6C45 SharedKey = F5DD1468D1EE56CFBBFD883AB8D65C9BA7A4AEC0998C090372D6BE2504039CEF DRBG_SeedA = 1445B17725DE136329F026574015465A40FBEF3AB0D8694F4C172511BE4701753A20689FA8FABB9BC8287183A9C1A675DD7984BB4C5B4E79F0845B172DD8BD5E H_OutputA = 97EA4963BA7D2DEF70AD2AC2EB27D36EDEF316AEB43AA2D5FED8926A1DD5B1E9 DRBG_SeedB = D0097A9B7BEA0A72DEAF725889DE29BB6A006CBBCC03D4A9B10B975C81CFF3DF H_OutputB = 63C526AFFEABB6DECB89D5E6BC42AA9DA0FBADB3FA20C9BF98D12D8D3C492CAC SharedKey = 415FE7B5F24781EA18B88B954BCD376E432455A8471CBD2DF4D66764D95FF30C DRBG_SeedA = 754B2ED8FF3FB94C57F9E474C76A56DBA24C4EB7EDE79C26D91C42B7A471B17AD273A543219D29EA8674B30F681B55F62F0411A26D1539B2FCB3A95F23B74C8C H_OutputA = 9F9EE57B796C07E54B4CD739A90447590831D3E28AD08BC4D416F5813A0EF257 DRBG_SeedB = 3573FF439324C171D54897F7720F4F3C8AD9B52F2159DF1F923CCD268746515C H_OutputB = C2E16640F08BF2518CAA0E8F02ABD902DFA9DD95E656B075AB04D62DA7CE2FBE SharedKey = 9AB0E61A289692FEB8C810FB6B5D7CACAE01111D8FE3A8ED6CB8E1F782375FEF DRBG_SeedA = 710CBCA2C7F04CD81C1F774AA1A8638A4747FC689C646E01DB6B9CF5F6A3BE4653A22F24B4548E31D0E94B4B09D873640DFB4FE4264AB4930700DC5E439C9542 H_OutputA = 1C1373D13790F7C7A769CF94E9D2D10D968EAF646E1A35AD683E606A8B3CD7EF DRBG_SeedB = 46AEE325BCB0BC2CADF3257162A8A736ABF559356E36A34337595C5B14B3E4FB H_OutputB = 74BF36C64E77D20B3228BCD4284C6ECA15F01F6A1C6949C1A6185448DF761B29 SharedKey = BF274A528DD50CA73B590CC81B2DD8A4F0D9EF7BF15FC0FDC6F3EBC4A225B4C0 DRBG_SeedA = 8D43C57E1899B13D1E17172030CC4A6120A526186946E0693BF2E37B7B3F240F5DF19B52E6DF2ADD319CA8125F6A164DD945D91281AA8FF05D9442055F96635C H_OutputA = F79F9B5D393878064F433C5D647D59DAA367F112AB0C5D5584EA81ED30DBF37D DRBG_SeedB = 3BCB6A2FF7BFED5C22D09990B6AD0E726A3BA570574D182BF4A6ACFC217DD445 H_OutputB = A129CAD6F0004A1C036BD970A1DBAFB584580A99A5B9B7354096CCE12DC32EF4 SharedKey = DDD97B5AF1BD7F34D32A89BED5DC67D927FD0831C93A9FE49F3C663D850E2120 DRBG_SeedA = 6B7E64ED1CB6F2A8EFDF7BC1E72F05BE076CD3D8B1B9E2DD1A3CBEFCED6B518F44EE3BB9911C1CBBC959A7C765977595B9CC2D1D7FA41102BD74025F6906290A H_OutputA = 38BDF27729B2DF80D71B13732EA71ED7CFDD679668B8A39862307DDA8BF8FAFB DRBG_SeedB = 61E7C641FA84FAB3DD7E19CCD734A02D9FBD33C45804FCE5AB023008A1CFD0D5 H_OutputB = B6CA7749C9DF75A6692ADCAB5266BF81BB5D38EE26D03AB1D8C1EE7D1071D6E4 SharedKey = 3C606DFA04825BC036BBE0794F59B792F25798D07823EA5913F91145F0FFBC61 DRBG_SeedA = 46ED69E53E2DF617B869F6F3D8C6FDADD531365952884DBC2AF76A0394740F91A6E904CA2D3E44910C66AF0665F5EED3AB7F923BA01F74632365075A208FF8F4 H_OutputA = A0DDABE54B83B98CE536E72DC80814E6063AD831C91D57A01D423D37D32C40A4 DRBG_SeedB = 39BC024527495C8E06DA42AFF0DCE8FCA8905448AA57EC5FA495BD842872AB6C H_OutputB = 6E169602EFD54B7361FCE481FFB72BF1F1C9AD849F5D6DFEA0D4D95A6CF2B572 SharedKey = 5D86C98C9382E61F6ACAF38F15E936282C9F5BC146FAA5013FC0BE7CA7406D84 DRBG_SeedA = C029195DAF0BBF626E15CBD38E1A6763F2BFA9EDF4A5B3F878648CAB077EFD0020D2BA0E922E73802F41D7523966E9BE0E7B6876D6AA345F626875193C5C9679 H_OutputA = 12034D2BD7AD5C7AA76BB000063DE289D6440242F8A86EFBDAA286B7EB7F3D43 DRBG_SeedB = C1904301EFC135D4F63170466537BBC857F0385FDD82ED6FAFAC7798062A67CA H_OutputB = D344C7A27FE472ABAD79B471B165D7302C605B3B5CF33B02353819B1592ACF8E SharedKey = 4CCC4584B0D52A83C36D0E08B5D00A4E21FD591916150CF9ABE6D1759B496506 DRBG_SeedA = 5AFC3164CC57446E106353F0B3F24670B9B8C59817775EC009FB791625E61EBD5458AC738EB097F9B1AE737359E53B19A5CD39987C78C51544F0E9DC22F11821 H_OutputA = C598C73469CCA95964133DB095C0D7C3C7F928AC7ADC0F63C325EDD9CC5B5C05 DRBG_SeedB = FC26F54DF2387AD072E0B753C92CEBC7673B9B80673E2DEB1B41F25FEE10ABC3 H_OutputB = D10E17A5298EDFE3D22C897CC46BF320422AECDE8C8D425AAC46B38975930043 SharedKey = C3CAEF2C15B914D4A3D5DD23EAE729C7D9DB6E6A67825EC273FC50BA288621FA DRBG_SeedA = ED829E6A3DEDCC20FAFD3C483D01B74B4159E0046BC94DFFA85B3BE3D0DA7BAA0601CBEFA0C234EBFE407A76DE3D2DB396B549472DF56473CCDE8DF44B81068A H_OutputA = A885C0F98A16CFC1068135B7B1FD7EE134F04AEB6B7DD3864C145E11824BECF2 DRBG_SeedB = 787E2C922A0C9DBB656F1F94967343BBCD34EC686C745641643C95157E5DB204 H_OutputB = E85080048D785C07D6E2639ED174AF9E06227EDEA856218A6FC7816EEC1DA343 SharedKey = C699DBB2AEB1909FB9894540FF5F7E9EBFD8CC9663595408F455C464027B0FCB DRBG_SeedA = D9850F8FEE7D52AD85F6A17D141E737EE62E5D4069ECC33289403C2C11D22C6A500FF5DE06893337AFAC3052F2680202477764DAA8F7FB93E93ABB8868BE05B6 H_OutputA = FA3EFC4B393F8050B2B206F39E9930CE1BE763E6C7405E2DF2A6399E67D81F47 DRBG_SeedB = D0A0D980B361FA6CF39B225344E1DAE71DC3F4208C47DE5C5637A58C9077036D H_OutputB = 52B0B0A675ACB93321C17FE9324DA6C0F5C7DD6D2DE774FDD84A65E3C1293EA6 SharedKey = 89571EE30BBC754E6C42D95BC1FEF2909281F2205178D52A6FD671ECA96AD59B DRBG_SeedA = B559076BCEEBC85C0EF0369533C65CF6CDCD3DBD4E27694FF04F55636EC45A201E49E1047F98BB34C00C166A1F5B9185B1950E90AA9335E938928F29B16DCFBE H_OutputA = A8D682E4C3C1FDC021AB292D2E4A8FF834D63BB7EB70D1ADBF668501983261C9 DRBG_SeedB = AFF0D557F22A0C9E19D15FC98414AD7A66D09ECBA346EA445718E678D6BC9A4A H_OutputB = D98A279EC6EF4389016BCAB689B948D95D22D125C12E8D51F54A88E92D645BED SharedKey = B3ECC9134DA0D700C1CCF3C88B22F95E9107706DF2240ADA4CE31BCB2F3128F0 DRBG_SeedA = C9ED10965AF8F8B8BF2D992E0E142CFD70DBC31A1B105A4CA1CE662955C2FB4653A9A56B35A557C9F6611B5751E7B47EDA0804564E699623B67F4E3A1B92257C H_OutputA = CDD7802682C603742071676934D995C2AD18CCC48DF05C751F5F07B013784134 DRBG_SeedB = 439316E554D55F5634F1F3B9E7C461C00F1695BBE34B6ECBB345AD3EA4E95A89 H_OutputB = 52280A3654C4C21274804BDADC3EADAD7894FA24ECB1C5870F49B7FB06B69997 SharedKey = 0F362ADAEFD35DAF8E47B01E1C53D5422B8CF6A172701D563B60B4F5BE110529 DRBG_SeedA = 73954FF5B8AEF404428BE2BC3C97CD727AB123984BECC9E0A32F86CD6FAFEFCB2C0A1DD8C7F04F9ECCFC37A7B181DC7EB914EE8A80B1373474499426CED24A38 H_OutputA = 93269B40DC5E91F19762B78519C791F012659D2E831F890B389ECB41CA30DF08 DRBG_SeedB = A91339C314971A96EC61C2A6268EEBC6D6554B047F9E91A8C8700651DB4E8C35 H_OutputB = 582EFBE0E3F5998C49F69CF6AB95A44CBEB9E61AF3F4913C01D1F664E9C86903 SharedKey = 0F7676A6FAB0DE573B8A6A7DFCC3C920668B6370F0EF9C6078A3410874C95BE2 DRBG_SeedA = 022EE1C37A7A1A49B4BADBF3D1032C61025ED214B9718341CA33988C6BB67435EB21CE737DA62126559E7E0E772C21C3AADFEA344F2E6A1EAA6EDB82BB082E4D H_OutputA = 27AB558B40E24A17976413BA5D7BB74B90C2C8A4C1215DDBDC014BE8D2F00417 DRBG_SeedB = 91511B69F8FD104BB89EC61F6CA5502A27E7355129D75028F6340C0DF2C02C63 H_OutputB = C20EA7EF723DB579BEA72FF2F754C40AC4A6FFC051740F09B7FB8E1DEE53655D SharedKey = F956DBAF1FC6A1C406E5D325F9AA0EAD3CD07ECF4F829BDA48469F91015706F2 DRBG_SeedA = AFEFFE373DCC98809D131C8F8615FEE1354D2DBD4C7448A3A3E0A96DA29276F325E063D0397C99C8182A3001A15F89CF91C87193E796C306010A16615EDCF2CF H_OutputA = 98716CE9F32D150CB2E668E5D636004F4C1A6227CEB0AC0697A457A187F53F38 DRBG_SeedB = FE194B43B89B134210F6DAE3BCE274EBE1527B9BC40CFF8575C5799B33D1B051 H_OutputB = D0C780B1278F94725E8AE6C5AAE45A8A42885A19A4F68D254C04148C5C4F67F6 SharedKey = 0024C8B4FAB1505ED5A8CFD144C0FCC9FF7A0E90B56AF48FAB63DCAA8CF6DF1D DRBG_SeedA = B1DA6ADBBDB0BD1047A7BAE4091C2CA9F33EA91112792F0F481F39CCA2D125FA071A2D3DFE6ED07757DB71F8856F0FB7AC06AB0F6CB85B66C0041FDF392A43C0 H_OutputA = B040FB1B004C6479AFC2C934762A67015DFB96AF5DA29359B82F32D1AD10459B DRBG_SeedB = 7C467A1E2EF2A15C82F6B08CB7938CADF0B77735DABDC6E01B819CB96FF8BB67 H_OutputB = 5B6E72571CBD04760C4D45E5E1FE7FD9A4D00EB0C00A48B72F0FCA6AA126A394 SharedKey = F4A4B65B3176150BAD32243356901FDA7F1D8DB3C0FF7B0953C35E2D85756A20 DRBG_SeedA = 9C739BF3585DE3E97413D5C4A9CCF1F729AF37592E36FBEE17829121F488E268D7E2E79A638138D586A1995ACA16703BADBC720ED0C81013F327F3EBC586028F H_OutputA = 22C41D979E839B6D8A599AC288C8852FAF657AAA51B1D3F0D4219A24E4684C8A DRBG_SeedB = 8699ED5555BF1EF3198BC58D0EB5A727C627C20C90415DF957DDAF1940340AED H_OutputB = A91E4AFB2CA77E0F9FEFE82194173B7B397BD83EBCBB78BF9E82949D49B112F0 SharedKey = 9A9145A3FC6038B7A9416BF6B1CDF479D7C36811C96A0868D326CD60CD8881A6 DRBG_SeedA = B9CC68631353256AFEC0E6689A10CE89C2A1E0BD4425911AA4278D1A198FA3E31A9EC87C16460CEAA0E1B2A07A6EC3C4591ABE7659C0A01DC46D89D7BD1A139E H_OutputA = 2DA1A580984A9E3D4A6624801072902BA02DD0DC3221103998D532BE8A7DF00E DRBG_SeedB = 008BF89C3ED499B8856A10D2983A89087A450C5F8A6349057960D2389D385BFE H_OutputB = B3991D81C125A606550F8639970748148BCFA2C870FB97A3CAF2734AD761C1A0 SharedKey = 59B3EDD88C78018D878CBD8B1DAEFF8B65EF9612F7BD63FBDCD6935D303A8B94 DRBG_SeedA = AA9471AF248BD2B2E3A131A0765B82D781E4CEBF480647BDC9521B190B14263E44BAA2461C65F196BB45D3E016670FC57D322E38477B23A18551E8E7C701B64C H_OutputA = 293668E742A361981AF5A20800224907E83FDEEF481ADF81A3B5DD1736C4A67A DRBG_SeedB = 0B24DEE08AA5772BA7433656E2AFBFE6E50E7D892DD166930F3D699BC690623E H_OutputB = D8B5D1581DE58035A89C3D900F620B3E2E7B64A3454E3A4415940B848D52BCC7 SharedKey = 914A7E680789DB0B5112F4D103C876C86FEE5A40800061CAF6BA3F7F6DF4C34B DRBG_SeedA = 9FC29549A52D3EB2382B18B2EBDC619446B794ACCA81A07136FA50D00E7D4E50CFEF82F4AC628B5831B693278065198DDEA7003CCEF0C8BFDCF8185597A2A39F H_OutputA = F4794EB47AF8E49A08A7CAF5BDE2175C432E9330CFC53BADE56034DFED0B3185 DRBG_SeedB = E5E1188A875DC53AB5F08D7F9CD62F258E6DFAF4E0D73AB6F55A075D026B454E H_OutputB = 9640D79B7E1280EDD6B7EC6AD3836D5193B94691BD3DE657AB4942BBCFD2B84E SharedKey = 08000FC88A8CB4E906BCFB7C1E9201431F45E9E3F06997FD4212FA56A5169E3F DRBG_SeedA = A173A490EEB5208EE82F4B77ED340C7F6B16FB7D8B4657B23C3400839272E363CB0767B7F23DD3BEF0879C89031B24B8C3F8FCDF07881175919A012BD3C70958 H_OutputA = D341391E67026E883732F87599E0F3B9EB3EF2D6E2360C2ED78A0BCBDC58D32E DRBG_SeedB = 80C42CDFD150244BDE27C3D4B03C4D29B75AD785BBE631F62601704DC8048AE2 H_OutputB = F679350566CD2A3AC2D301C78C6EEFD82262753FEB952E3F2FC6579949D6AC49 SharedKey = 49573346E9ADAAF8090C5C1825CCA640D6AF8EEFD94B4D3C4DBFB45E38672873 DRBG_SeedA = 059FF6B44954E7AE43FDEA3ED53E31338F99121B824D5ABDE1D4B03560B2336052FBABBFF8BFC4A31F756A19543D03B2E7A78CF875591CA510F4AA1EB9CA75F3 H_OutputA = 426900BF34374C2CA8D5150BE7D043CC50336A34F2C1E76848236C56AD4F0C81 DRBG_SeedB = A2D42F8F128FA86B75526EE3B036164C672678A0314DAA3E6DAC46AA59F49A95 H_OutputB = B10571EFF7F358998B770CD2919A87FEAB63D6B391B9461DB1F0827C63240027 SharedKey = 3A68D7BBC88616100E9C2B69EA6C4B7749D4E417598BD7070E4051789EB788EB DRBG_SeedA = 327445BB783E620A8FCE5F3C7612C629C211AC6E4D825525788A2884F2682101EC5D7EB9ED7FFE7DF75C2D37E6F2E6D37770AA8B81D88B86F5C2B7603452BC3F H_OutputA = 52C48E904425FEFF0B3BEDA02D8831CEEB5780A000B88AF192AE6118ED80A88E DRBG_SeedB = D72B97F4AE17DF639F82B12BD197739C2A56FAEE9B3DC8B0F8F7B804BD068334 H_OutputB = 95006141A16C0F8FB88766F846377B901BD7E3B3A0A3F876E8FAAFADC14BE0F0 SharedKey = 3FD91BE39A94BDCBF4485ED8D8EE8EBAFC7587B96F1B1CBA36144EF6596E7BC9 DRBG_SeedA = 5F543F4FD21809305E6A627D3EAD7210D1629A46D5412F2809050FC7C9FD8FE1A7A383232744C07BBF9049691EC7A943242D83646D7D174EF96391136591D729 H_OutputA = FCC37C9DB0B9A97ED1F9B76CE0F3C015505CD1EFEC4177337F0235F63F6EECCB DRBG_SeedB = 96FBC2E07A327060B3FCE336547F7EE397E95B3E02F7618D86E37D815CAA2614 H_OutputB = 95FEBEBFE1BF6138831F57189FE5023D3F263AC7657BA615EF678F50FF615412 SharedKey = CF97C0C3DD59E29A325CC02AA4BC7F67F7E3E8CC6B538E36CCA1CC86958AD9F4 DRBG_SeedA = 96DB79BBCC17F9CF1BF09B394F08B1F9C664B21B4255FC6B1254E90593A950C64FDC5474305BF0E43A2C04C08065F02BD1E594C649AB1D4C1C93E2638416251B H_OutputA = C654D995077A8FDA9133CFBEF0EE2ABC01709DB18A6536C8A39CE81E7C35B7F3 DRBG_SeedB = FD1749955D2AE018EA46AFBC03AF7489B2BC7BB8D5400941E7B3A5AC66CF8299 H_OutputB = 98EBC78A4134CFF05DD1DE90C6B6F2AD9AE93E13E599F8BAC5C5FAF179368259 SharedKey = E2A46F56DF3609C2FF7446D4951134CC9F99F6D37A0BF0451F7594AC3F1583EA DRBG_SeedA = E358BE52869D8DA3FAC90AAC27782A587F4B0C098399A7A49C3019E12E6A37168F7EE79C123A3DBA712840A5D4637A5E5711E9C9FA984112309DA6E62A33FDA6 H_OutputA = 63EB0F510D5E597141CAD222A1116A7396FEE5C015F5A54078C287BE379B26FB DRBG_SeedB = EC86AE6C090458A7CCFBE1659DD1F4B61FEB9CD22E1AF109872CBD8CBD7A2138 H_OutputB = 4B0576CD218A2F58CD230DF9F70B7C861AF0DAE2EF77EC35857EDCDE01A98EC0 SharedKey = 802AAB5865C403851F36B66ED57F43E01135BA5C3FC63953A1E9BCECF9E93982 DRBG_SeedA = 52F31378045FF6A87A7C5A772C2C9C54D1C491AED6C14354A46DEEAB9D100718C4C59B48495E1C4BD09C50892C40C7681788907839C813BCE3801B76F0A7797E H_OutputA = A8B90C847915569741D6F51E9E212409A0F7AA9A1E85B499A655E0FBB0B6E157 DRBG_SeedB = 3B8ECFA8B1161C02A8FC0BB273DA6890A355E729B8CFA6F5F5C7B1EF91103C1F H_OutputB = A2EA5D2C92781C00DBCB7BB2BA98C07979D79791EE65F2EFA46B3A10A93B2BA8 SharedKey = 5C345DDA006BEADFE3835EE186FA7632A1AE517144BCD01BC85D38959D82BE38 DRBG_SeedA = EA9F73D36FC35A7397CDD658E5578EF5E6381E661B238E6A7B8455158BC8DA95DE7EC6227F18292FC2442C7DF4FBBFF489A2618BBCD9E27E3BFAC2711F4E6883 H_OutputA = F72BE2820950AAFA484B4C8985048BF636371F919D4C609FBB1730964CE71312 DRBG_SeedB = 7973288E189CAAF9457748E7C6E8EE8CEB84D0D53390287AA2137F5434AFE3D6 H_OutputB = E8EB66F196D62787A929A0CF08E02318B2B99281E8EF63D30ECDFDE246125D6F SharedKey = 0F9732C60E3CBC44C4C10853CB15D843B5C130729E76921F3B5281860E54DE00 DRBG_SeedA = C687DD9ED38D4F87132CBB69F0A5D2F564EF41C1FEA8F7C2888F8521AC6FABE52425D45507812974E6F1CAB05228162C5CC5DCF102F4D4A21757D1ACE42CBD7A H_OutputA = E9EFB06FDC8A2AEB6D35A6879836ACFB32D80845B0E3CFBC7057D9842098751F DRBG_SeedB = EA5C80A21882CE578C6E5F09BC182A9CAE38A242A2121F17AEC1A9498CEA56E4 H_OutputB = 998C48EEB183B41B250116DB48CAF68CE6AFD664B1DFA1DB52B587A64F2495D0 SharedKey = EC5DA989DAD1E4EE55E72810F552A3C93D7C90D8D0CE7744DF3D62C0AC19F1F0 DRBG_SeedA = 847460C48CD30FC08361ACD6388306DBC7E87D8388FF3C76670D1BA3DC99190C276A6748986C7B29D8C1426F30AF8919BF1E7DFC5B4B3425964BC6A4480AF4C3 H_OutputA = 8B7F2E500EF305BC56D68561D698C4314AEF76DAC1EA76BB9F17A8DCFEF52D56 DRBG_SeedB = 28B3811766894B9BD6423C6CD15CE0A18BABBDB3940B081271F7172B597B20FA H_OutputB = 9A77E33CFBD124AD952F22F4A6264D627A8D066256421ED9B825421D273E5A5E SharedKey = 47AF453AF2CE5FB4241FD0477CB701F62F702DFC3169FEEFF7D1E65F94993CEC DRBG_SeedA = 88F4821450C59158B8C6B8CFCC419DFECC918BBB2449C61AB24548BDD51181F09772EE80B21B3D592333BA049F48ED8D13836C642C0FC7963180D3CFB70C6EE4 H_OutputA = 08D0DA8DE2B89A98C28ED2132DD678FD931601870EECD696A2281829C4AAC3AB DRBG_SeedB = 54FE86EA1FA94FDFF77B7BE4BBD39B2FB22567872B04E4B2A77904C09A8A89B5 H_OutputB = 8F0051010D2E93DF104CC1A0DB10FC89D999A6BD4866CB5D7F9BF21718103661 SharedKey = D6E1D78584878407001E06917F70E35E9491CA0AB4FE87D14B2537391C62690A DRBG_SeedA = EA4A4D05E03F9190BCBD0DAA1CE0411F0E94EED0BFA8CB44D269AF312B2720B249BB944E04433E20DF55397726EF27C0DA794D3FB15841DAD59EAA181D3F5DCC H_OutputA = 077A1D0BED3D64EF2E823489451690FD4946EC6DBF3BD2093889EE77D05C7964 DRBG_SeedB = 77FB8E0E6318AA458E2DBD627C79584F4574B5D7B0A07B634EC401BDDF3094FA H_OutputB = 6180A3460C4FA68ABE8533A4690F457BEDC37DD1C1A46CEEFFD997E3A057157A SharedKey = 0187FF7DBEE093FD46051F0109EA9BAE038954DF1EABD0975D5DECB9256C4EE7 DRBG_SeedA = 65473D186D3C229ACE53F480C885BBE3A8F514687D6820A9EB45849A63EB66BD83A5735C0A36A652A1E9E264EEF08017D9142B22FF28450D30B9A874E1533243 H_OutputA = 7093D0B49BE072C831D18FE24C0F21E2AF10DA7C19C8930ECADE5542668065D1 DRBG_SeedB = B0F6B7E2DE15A33BD7C97AE4CB54C9A8CBBB66F8BF35EBC43E4E12815FCCAF4D H_OutputB = 351BEB0BFD1934A1F32AFA7F488131052D4040D6359472C9F9DAE12643A2D0AE SharedKey = E634911E582FC0FD12E93A5A8461E8F6B316CD996406F18943905B0CC0B19EEC DRBG_SeedA = 59972B64901EE9669BDE4E83FBB87ADBA162787021A2B7616C4E0BBEA18C01C9D78878F23D459E4B49AD752F5ED03C15F85C608D2411DFAAAF69196F8C36D5A1 H_OutputA = 3ABBF9B576E38B3F49A5389D348BC79A593740C68D9629D08C31A14AEC366626 DRBG_SeedB = 019BD2893D436E7B4A3FA3D0CF7067F053B144CF8728D9DE505692F958356437 H_OutputB = 984CC6EACE028B5E3D3CD283C81F06DE4BC92FE8AD30C3FBE5F105CA9CEB1F43 SharedKey = 636C397C590A2B1F78849DA2BEF179E473F9282EA80A06D68FE80C24A45E32D1 DRBG_SeedA = 4826283693004A624A87157E55271B26617475D3FFE694D629702EB03D0492C250EFF6619F7E562ED8C0A295E2EB2B8C8F82951EC1640A0BB811F9596272717B H_OutputA = 8F72D1D363750F208C4CE9F09B31EE9AC3ED3A90C3DB71B2E4AEE03E0467AF67 DRBG_SeedB = 27826FB43F05A712C83F5130430D0730581D74C64522F14B56D2F0CA97EC5991 H_OutputB = 8CB6C6AA5218C0269221FBC98D9B372B1A21D410457FED4DB391E377BA791030 SharedKey = 5D1A29684B79D22F5376771C689D9823BF537CE006EEF1201FD6A8F8D729E32F DRBG_SeedA = D691DEF9DBE8ABACE4EEBDE4673C41786B5A445C72E5BFE0EA6410A76E3BA70BBD7001C51AD3DB5E9DF398EE055B0AF20C545282E0EC4816073D002DB65E9549 H_OutputA = 705C9E79334B9E5826A12160863899409E950CCF8D18A75FCCE8B2F82DF9E2BE DRBG_SeedB = 4D2FE247FE52821F540C7028790DEEFEE8BD2A0C25E8E5BCA7A981FB7BC871AE H_OutputB = 206921516CA8BE57F74A2880EF36BAE31DBD9B970F5B481C5D570E1F9D84F204 SharedKey = 8890B99C9B3692125F2B8F89F85F3B197A8C1E13C70635923A7BB365CCAC65D4 DRBG_SeedA = 7FD68F0B6BD72EA535FCE8614F3AB5D22EA7E9954018632F24E014B51C7F89199F34117354C8A4B7D416A06F0620F7CAAE0DF433C2BEA5D55BACEE2ECBA285A4 H_OutputA = 7D1DCD660074F332B0A32B69DE81EFE4F07219EC5071DB5E7EAC9C1DB7AD8063 DRBG_SeedB = 9711E6D9D8FF718A5106C7FDF5E583797AF962DDCDF51453C8D64CB63FE1740B H_OutputB = A61C5C6CABBB22CF2F05B2F9712B9E2CB9797315CF154AFF461E3A5992B024CE SharedKey = 40E5C7ADE253AD392D241C5DB28B238E6EC3B99EDF599A3EAC3CC78E7D5FF041 DRBG_SeedA = AED06944EABD58E098BA2FA0400BD823672D95624009414A06796D2C9EAEEF2CCB5F104637CAE0BF248BAB579FED6AFF798D6B443F712153B8F75C9F723D67F1 H_OutputA = C383DA32DA4C4AB779C1DDABADD1C5FE20C6E8A133EA18954D12E6C734E3A977 DRBG_SeedB = 290991B0A837D95CA818588CC2044D24B56FCD31DF34288935DD851C683EAD56 H_OutputB = 9462E1FE2AEEAF7289C1AA6319B922A7856A5F6289AF453F0D5D68E4853DD84B SharedKey = 5677B07BFC4584BA66E8460AE43F750E9C59D45B2E7748B2A810CB62585E5A5A DRBG_SeedA = 051C7F21FA849E1C415B51F57D9C5F53C62768C6965C180F43B35602E3843ACCB22BB4284E887FAD89A1FA5A16F0BC8E6B961C074DC254CBC1E40C60C1252A48 H_OutputA = A28694F32E0CAA1D59653008EC958873166F66D085980422B12A3855F15C72C7 DRBG_SeedB = 442885464A4225A702933F0195D9635E0E8AB1A43383E4134F28BE5B5EAAEC27 H_OutputB = E54316341E515164A2BC7685B6A11A6F101647D52FD35A662D56446E67A583CA SharedKey = 02F28ADAEA5F10AC9887DE17CDF6941889697908FE3B8D5B75F8A0657ECFDBB9 DRBG_SeedA = F0098ADC49F473718502069FA5C634731C910E163913638BACCE386B6D88065A5C2B9B420375744A1317AAD4712A10AAE4342DE15D845B0497447507E059C181 H_OutputA = C9A9771D6F9739C1A5CDECE3AF787CBDA3A5B82397C1630C12CCF3E5E76AF6EB DRBG_SeedB = 3EF0C653E7BBEBE4AEAFA2136D0380FAFB72C471102427CCBBD251254F988651 H_OutputB = A0D41D9AE73FBA1F29D1759E8ACD107CBDBAABEEB9C48126913AA34CEA727DA4 SharedKey = 47E39A09B0EE61ACCC2AD050733C48EC1B0AA9B3666F355A7DBC6178BB7B129A DRBG_SeedA = 66F6267A01189CAD3174A5FEADE0F407475ECB9695A8DA008B5BE3391C8EABACC39F0465B31DE142E5AE003863DC88B08911CB57A7E9DA150CFA0CD556227BAF H_OutputA = 3A6356B261CA3B78E6144795A6006C04E9017B5F65ADD58D8886C0E31730D22C DRBG_SeedB = 1E1C38D1190096189D7FB3C33798178AAC04BB1A916688F4CC156E1248C1F962 H_OutputB = AE4E62AB19C48272865B60F605382EAB568F94853120B3E44BE4CABED7A87B88 SharedKey = E1EC52CC8B3537C54AB73DE45D0D26E4BD3BF0ED7728A0CD89098C448EE12025 DRBG_SeedA = 6B3C2FD37DF22051B2C122B88FF325C4333B264073E44DBF7EF934B364522F839CEB1958AC7229CA93BE56AD6F5D3EA6312C5A1711998FB80CE2D7E668B78AB2 H_OutputA = D69A7C57468F3DC3544621EA1D34595D1497B70A93BF9B2C50551BAC596BE7B2 DRBG_SeedB = E811BA4BA6EBC54F1DDE537E7E5765B6D246B7A774D9B9DB5957950611B92149 H_OutputB = B74560166A0DE1BAA6EECF489C4CFD2B450051A80A5B26AA77DB538BB9301EAE SharedKey = 817DA1E1642BDD142A1FD7DBB7A5653E037CC91DB5AA87FFA2F5E0E1400D01C0 DRBG_SeedA = C33273CAC810969CF42154761D2D8EA4D93559706D8542A364928ACD2F06287E64960312B23B0D1A2C59B0A183266449581A9F6F936B4CF701A353B7749FFF39 H_OutputA = CB6E20C4F74B42207AEDA4B4561C8214760855FC8A755FF232861A9217BD6640 DRBG_SeedB = 2CC3EFAE932ED2F48C9CF297F76B50C0BDBF1F39C426A23BF70F898F2D33C508 H_OutputB = 79546E16DF1E2A82FE4227BB4668472A7E8F634EEF71FBE7225271C8ED250927 SharedKey = DFB1783803546F0BF9DA26C4098252600325E54E2D580E3CD98195FDF1BE126B DRBG_SeedA = D7FC43127611BAB9D4862CDDA1755CCE73C9027D9FCBC8568FE3C5CB081A7122AB4B55AE3D05F5CEDF34B8981EF53A730DA1788D580FAB001377EC16BB1CF380 H_OutputA = 765F763A93276672008231745E01D15D9E5179AFD70EE8E59E82EF3ECAB6029C DRBG_SeedB = 34D5EA4A8D3442EA01F7621CABC92B4855FB238C1982B9621C24C99505F54570 H_OutputB = 00D469897F031E341EC33162A9EE823DB1E1593B95AC1946F84DD6983185C4D3 SharedKey = 08E6F412E23855DD27A77126A45795A83E4040E6A0F61ED55330C79FB60F930A DRBG_SeedA = CEFA4C1F0DEFFA9F1464D4C814F6EEADD09AC1E3168FA9BF04D54B08265E3DA9291E4DAD6F00D59105BF35784FEB8D403C8D0DABCD6760470FA29BB37FDAC505 H_OutputA = C2EBA642A682B3E42A48A298545BA6458B12F1747BD1AC2F5C6306330C1E6585 DRBG_SeedB = BD22E002317101614664B170278339B2A32AB5BDE79C2B8512048C0AE3574A13 H_OutputB = 3F3E42B3DD5DA2CFEA7BB5B36E799122EC677D82EC1D302EC2FCB9983822BE37 SharedKey = 45E3E7337571207B76AFBE47FB3AE79421DDA3F5928A0C4A9CF129D153BE9146 DRBG_SeedA = 39F242B854FDFC527F90BD6CC679AD15AF276F886FB2205D17CD347D28686F9A9B106A0E21088FF587370AA13FA951EA98735CD3B5802CDB08ACA96043571280 H_OutputA = D1A5025F990ABFE76F033F411ED4BEE95BB7D05F27BD515FEFE269C8978B864C DRBG_SeedB = 29371BECD139B6DBB9DD964ADBD1A9BE533ABDCA03231905A2EAAABE6FA1ECE6 H_OutputB = 522754BD1EAC0FCBB7860B55B409F61CDAFE7620D31288B851415BFEE635E97D SharedKey = 7D9FDD8A0A538824306BDB5025B69D3343661968B483CD0EBC682319184C6488 DRBG_SeedA = D6E25734BB642F409DEDAB111EF22D87FBBDC616FA559EA265A33858EA49B8FBB66CE4A186291240410AEF1E3B627C02DCFA4AA59673D328FA2F17B47BE62BA6 H_OutputA = 6509AC61BE61B5BF117E2A7532145C601274FA2A05F885FC21DC20084F1D220B DRBG_SeedB = 6CDDE3D8B0273D1F80D135F13C3A457AAB64F1628F400A6C8AA5CE4A8C9D0748 H_OutputB = 93AE85458CABAE621FF68DE31606717DD455BF13BBDDF6CE9DF4388236C3ABFF SharedKey = 5205B0EC6DBB988C01F2154661149A80A043D07EE028326AF43A0E6400F7EA5E DRBG_SeedA = 90C5ECA0A79EC2C6B027281F38078A5B05292C5951AC4BACAFE8C56284094E57C9122FA9B9D65754A864A153D6273959DDCE75C54651F5C720F9601E2516194E H_OutputA = C90417278D0C97C4433C55FD17C5811A2B62BED8FEEB036840BEB00DE8A575A3 DRBG_SeedB = 43FE782FDB6AF0A6E4EFF95D46FADF898FF09802E116F477655FA670F2209BCA H_OutputB = 22E79A3848AF9C1F163AC8085EA6BD35C76E5F786BCAD6CC45A2F91DB482EC92 SharedKey = 191EC604D2FF847CE047032A316531705370BB8BF9A383E22A9F077C7B77D797 DRBG_SeedA = C1104CFA1B6BF573B6F3FFF7621FFFC321064C90AB1FDEE9427A1D768EF35E91EF980846C2E7CFD314229EE8A0149E3BB1FD90AE8C658AF32501FD2615DCB468 H_OutputA = 055955277096994F8B0B2B3FA0249AC0A9341B4A11DAB83820D7E1A43C281739 DRBG_SeedB = 49B62F1688685F588D3EFC2CC729DF3A8E9386631B9F554DEE7DC38EFF565C58 H_OutputB = 350BCB775466F3269178C891876951425D66D8F2C9952AF08FCB8B3BE5B5DE29 SharedKey = 8D481C9A0A5B92342B382B36E3A68D194E3665AFE0F9291AE4EA9EDA7DADB8F3 DRBG_SeedA = D5A9E5F62BDA175D773646D05FC4D002E37F723E1D9C81A1455AD3335FD7F799120A1A6C37099AEEA773C1E9E055A48A9557D5323A4ECBCA2E5508BA936C66E3 H_OutputA = 8CC56F64F084DD1AC1BCE5EF58EF71C8882026506F957804D8300AEB7E860931 DRBG_SeedB = D8038BC3EE724AF38B5D70468E5672282F510CC592BB376241132AE81FF5B513 H_OutputB = 71D506BDE76723E1104F23D180F57950D697B7F64C3A104C51D2FC77E9A08F6E SharedKey = 0BF3EF0BE21931299168A5C8FC00548CAF20A5EE150DE865B97B446A5130AF9D DRBG_SeedA = DB3F3BB235715141375845B5D03D0378CDB31E317265470638C838C03CDE232EB984AFB8C8F5BB30AF35BAE85F8B43DA1D31159FA7373FDC1C0441E557F7C1CB H_OutputA = 83C3E2004569A344634329F6F31854737180A1D84750503DF0DBF7FB4D9ACB67 DRBG_SeedB = 8E98CC35073ED6B173C125CD74C4C17E901CD3304AB2E508619FD9EDA980527C H_OutputB = 269001C21B4486B1851A9594E1174A1D3D93E7B99F703DF59CF0F98F421B13EE SharedKey = AE092F1465130B5EEA562383124D69A6595D8E934D0E0351C61987647957C77F DRBG_SeedA = 843AD63B2ED7B5B61BBEBA589A937C2C0E830F9674E99D175545C7A227852E85D896F7CCF9391AACC1C5B46B71E83C63644B502614CD722D6B3330409D88DEC8 H_OutputA = BA98D755907DD3B9E2C77BD211958AE9DED7BC6712FE3A2F01EE33B5C9DAC2BF DRBG_SeedB = C2CCF12EE0E35100594EB1A1B81F785DECCB44A497DD251E82A59EF4FB42F5C6 H_OutputB = A15150C70B498BCF34C3B3380D1CA933757751A6910F5A62F8BD70E7863BA0A1 SharedKey = 587602E78C419D40BEE45E0896D7D85F1D01480979F8E8A7B8147E5109286B76 DRBG_SeedA = CCA8CB57D63C3F0B0BEABFA4C4E8BE6C5804793C73A1DEC360E40858606B851817EC5F4A7F4A9C8CEBE025023D517615F0A0D278A93DA3F90B1553684EC8D4CF H_OutputA = B9B125C511509628B622B9C37ECAA4CEBEAA97F145447C9D7CEF1FA02BB612C6 DRBG_SeedB = DBC9CD5537521A5738D4EB3062ED3502E2CB6735FB8117C6D2B220223584D937 H_OutputB = 3C079D40A07E0C68E0E2D2AF23983B718B93AA496AE19305930AFB01EFEB7CD9 SharedKey = B125D7A89B1DDF6B8915E0EBCB7ACC89F7D400382BDDE1A494177B00C724E4BD DRBG_SeedA = 518D90702369AA21CEA39DCE60D77B5CDBC82539581429DF6BAF8CB138F538C06B7F09ED67083DCF5C92D94EC8E307AFCE2BF382269EB0798AB6CD16E93305DD H_OutputA = A14E169F6470B6688E78BBED01FCADF1C731E18D9EF607B5A3DFFECE0FB14A7F DRBG_SeedB = 8796A4E692DC0FB284897C0501D11C9140E0173A10350BEFDF7E4A074CB16F45 H_OutputB = B6D441F6C09A38FD6F174014F2F9A35D6959CC43EB187D6105DCB2C68B9DF116 SharedKey = A3F0D7FEB5D6866BB0D9A61AF55B10C9DB3CD8230AEC0416F933A181AA6FFC06 DRBG_SeedA = CC2970A65626E8801CE04C5B02F6C874B6771452CF6C72ADDD30BFF530E46B36AA19727B6639371AE010D6CE219D8F36B169EF30EC31BCC75FB005E1E8E22733 H_OutputA = B748C89942CC39FA9649BAD2832A80DA246CC92DA1D9833E71AD3F9AB6A8EECC DRBG_SeedB = 319E22DF74ED9214E9985941C965138FD99B1869FCE48685143D09F94A26C393 H_OutputB = 4E0D8AA031F500ECECD08919F2D5FC4527D5DD26FCDBA1374A981F5226F6E359 SharedKey = 49F14DF23EF208E3784E55AD6D1EDAD6E45473DE49C42D360EFC0EF711E28E13 DRBG_SeedA = 2B999FB5269DA415B480AF74EF95032B6EE337F9218B55D44949999530CC389A90CEC486E1A802A47555726DD5624F12FFC3BFD9B670768E81BA12E57D30021D H_OutputA = 24F53E4EA8BB507B8E81ED631CC7A79104327C555AC10E73CE8BA609A56F69C3 DRBG_SeedB = DEE73F2DB309DC6AC11252DD2ADE4AFA66342393DE62772A8140CEB0CDA12E3A H_OutputB = 9929FCDB6024AC11AAFA9AA8FB856EE3AEDD97B18E108BD4C2BD7CB62F335DC9 SharedKey = 13EF42982CC4BEE55BC95FBCF2847487DCBCBC9F861F54429D7981607239ADF1 DRBG_SeedA = 234167E3FC1D1D000435BA2CAE5376D8529B3D2F8B2C06D0F4553518D7FEFAC195C04B23A16F037C11A0FC259BA0FA5ACEC9CE3EDC85A75569FC29EE917CE1BB H_OutputA = D02301CD8814BE97845B0AF2F8CD15259E730A7F69FA122068D1F266043B7315 DRBG_SeedB = 108C2811D8AFDE9B13E889647539B3272A89CAE61A14908BBEB8B11E3E63876D H_OutputB = 23524AEB71FE9130D55FE40A010478EBAE3157D32D58A3337D4B09A32A772D8E SharedKey = 2E737B1F0E183A546B0A6BC310E18B1476F0A07CEB4A9FBC7211CF1EF1CB685E DRBG_SeedA = 7DA25B5DC5E93CC9E6ED6D7454E1280A95CD3BE1A5E69F8E0FB7A494B36B986E9391E8A5CD1335FFEA6C5EEEF472CEF5C8F02FA837BEAE3E678472A2C0E02407 H_OutputA = B10F07D061C264838E1AD03DB4CE8EA4ABE8D9733D896AEA559FEABF9A62B30B DRBG_SeedB = DDB5A75423762700867A542092D06F073F0A6C319EA84607C12747A49699448A H_OutputB = 2BEFDF791F253FDAAA5253FB45E152C24CEE998E01BA514D1DA725EB0E6EC189 SharedKey = AACD38C5789D0A263293886155B06C648C32A9D2107D6498DC0933EB8D43AF25 DRBG_SeedA = 1ACCE370CB7837CE70BCD6D1E8890893C0B8A01465D0003B275C9E35074E3B1010C57619FF4838666B2628CDCB548A213634222F0E934374107ED68C8E8CEADB H_OutputA = E48B333ACBB6DE43ED81C7D48A2E48BAC8DFA7DD36E0D6FA9D66911CFBB152B7 DRBG_SeedB = 4F217E12F6B8E9215B5642D8E2193C7F6B0FE3EC1A2F01B956688926B167F1AA H_OutputB = D32085E30FA62B93BFEC5191E2E71184356A4E420D039838F9289B54014DC3BA SharedKey = DBF7859724753E9BC9EE2AF1B9019AFA5983791E23F0E7001D0E050C855DE3E2 DRBG_SeedA = 3DA7A933F3F2706AC52D3CD2350377F092BB76FAFCABEA2D49EE92DB33EB3CA8029EE0A205B27E1B15553F53786504C323E0657FC0AC85A269D43D81E33E0106 H_OutputA = 61E861966DA66227162308D293B8F44D1233CA10F23CBF304702221EF22F5A28 DRBG_SeedB = 0E510BE24BE0F8094E8AE6AD93007DEC3C0209C5503F4751C16EB0ED1747EA55 H_OutputB = A0AB2429CF091BB9C65412224FCF944B4B5524AB1CE975CBD2D25903B191FA72 SharedKey = 8F1FE745B2E63C3B17285BEAAF48CAD7B4E2223A95D383BE0895C93A0CD124AD DRBG_SeedA = 18142E458FD5E799B896D5511F9F54264A861D5A1FF2518552F28DB19C11EF0E437BE291545103715FE157C81779E6C8AEA0610F9840B6ED63E57E436FDEF797 H_OutputA = F2B201658F00F0C47A2F59F84665C3351CB30253EB084FF43F7620125B14EC15 DRBG_SeedB = BD921FEB6E795234D79BA33230E0D3F82A93E83535C312AB5F78660737B2D048 H_OutputB = 2C6602853A54FFE54171EC9337A75F32D337545D97259352F5D299DAE2AEEDD4 SharedKey = C09A16F40F5EDF1F1E58913F942999E80388EFDE6471F054398177508892A4B1 DRBG_SeedA = 610E06AC9D2A5B5A171CC4635E3FCEBF49E8DA6990071C4D34A008A731F778B94A574B8D1C4D84C76C9990B38F036936DF4B1A5F5C6F0008C26A5121C7E488A0 H_OutputA = 53459DE753F345F884A1DA161AFE3293BF36A09BB8C933F77B193EE512FEF206 DRBG_SeedB = 569FF8228873256ACA5509C9FAFFC4A4512852110BB7E032A6CF5D42B5E16BA0 H_OutputB = 7C089B5B6DC5C4534574AA64D62EC698D9D1DF519C41F34FCFDC6DE6BA892D89 SharedKey = BDDF81C1416ECA169A150772C1A00FA59E33A3F488FC2E0C5A88CD4177E05CCB DRBG_SeedA = 9BF94BCBDB6C0DC8E7B367CDA12168585D121278EC8A3213C7859102138E914247959902020748BF7A0D3E127C36D5E5F186461DE756A6610E74C4B9FD0B66E0 H_OutputA = 4B0C9CCA190D2DBA1574594840CCB3E05F480835CA40F0699E1FE88669BA41F6 DRBG_SeedB = 9CF898FC5D7CD607E17B59276F9F75ECE9E5604B7994453A179325EEE16A2315 H_OutputB = AC64E3A2A806A34411BD5134DD56511FF804FD1F7645FE88CDA146EBEBA86BF6 SharedKey = 6664E32D3866CE65B62D625AB9566037B130D0007C08704D2EEA6FD57C1A76B8 DRBG_SeedA = C2DF8EDB8DEF256BDDFE079679BF4FE1E19038E1FDC8CA78F72F324E46F4CD76FC832612CF17052C3599FA0CAA69156C3E4A86C712F7C9C8FA0A338DF83C61D4 H_OutputA = F7FA0E3AC4DAB7B5EB881578CFA656D5797074737534E713D3D130627FA08BEE DRBG_SeedB = 3DBC36F8E7D22C44A2F0E089D17A2FC10AEE0AE4389217E13CA1DF1A48441CB5 H_OutputB = A98611FF27483A06A6BB4EE146E7D469A19F12F04FC0A09DAA3C3A01C2D79F1B SharedKey = B5A3430F816451D9694FAB89B781D3566F3AAD7DF6A14BB1B7558583C8EC4E5A DRBG_SeedA = D3B95AF147E2B50074662F8C2663269BFFEF91EF54480174DB3BF290854CBF2D8151820B9249401DF27D1672D8901BB4D8581B883AF36F1FA30FA06C5D567111 H_OutputA = 6317D8E3BA44908FDC9660143A2AE0F5FF47220610D705394203487A6B1CC875 DRBG_SeedB = 4C0CBFE9C5DB7EDF496CA89527619BF6DF839F951B1704B845B939ED630E9708 H_OutputB = E0F5FD0A72E0433317675902C74AC99C2A8F92AE986CA166A9E488C9150EA8C3 SharedKey = 489B9164A933A5018C026A3D10009AED485F49EE361064A70B3416A92E216168 DRBG_SeedA = B205904D6C2A0016E67B22E7189B93DCA3A37D4B7DBAFA279EA71B4F0A72B457CF590B25A10B5C6C63ACBD96AA819487CE1C705AAE4BD8A4501C9B48FDB681B2 H_OutputA = EEE3159EA5231D82776B4B901A6DF33E7689F82CA9B82744074726A557DC4FB0 DRBG_SeedB = DFB106260EDFF646C4DE13E8F137B22573F92CC8C01BE7429F721B72664A45A4 H_OutputB = B72F95C80A35374C7A97A71F09C2493843975372DE85C6E0FB3717B6518206C6 SharedKey = 256B44522F56FF04041923869E75D8C56DBC5EA762F59AC1D04DFE2FECD5D346 DRBG_SeedA = 1CAB3950CCCD60CB629C2C956CBF8093712FB308813F297A354EC0BF0509C49B967F7FB65509F95459FEE94219A774750D8359FBBE7D8209D875BC8C239190DA H_OutputA = 77942A080580A932E5BE1FA4ABB36164E6481D3067D95C90092B01EED4BC8BA3 DRBG_SeedB = 27D6D6A3685C200BD9A51C47A1B47AACC1ED158EAB4CE1B4B3E9FEFF84416875 H_OutputB = C937204F870A48C46A1B92D5F252D702B66F821E97DC016B176719559D17E22A SharedKey = 9A792653886F2FE4B36F42A3C25E61ABFF6EA54A8A8C6798C42124A71F2E7828 DRBG_SeedA = E4153C7C0E464EECB55AEC2E3D927DCEBF3024A914A95773297638F0649DC990FA52DEA81D55A8EFCF3568D05A185EC7B9BFC03B94AF2818C4B5D34272CE4B7B H_OutputA = 4A90DCAC7A0F9CE9934DDBE30A807B0AF4D73E6067D49D85E4A6F280967B37E3 DRBG_SeedB = 02B47072E4EE61CEDCF0691CC87FA0E1604A850703960D14B668C3D401851FBD H_OutputB = 4D73BE162722BDFA465283BBA2F422968681353919A2E50ABA4DCF7A310D43CE SharedKey = A1282E4008B6BA2D134AD0BA5D2A2CCCF3FE4716539D39994DA3E051D9D156DF DRBG_SeedA = E21DA7594675A8A07A7CCF55A881567464C19BCE3F7911F1E6B13D967655E088C3106DCE216C0D8BACEA8D1818351D9C8635867AAE3EE9C8F0768C538F8AC0BD H_OutputA = D3587AE1DC9A0A0083328E22DBF5B39A862C4B3B938D6603D81E3C56DF752483 DRBG_SeedB = 100A48AF3267E5FCBB4B31436AA37FB5C0D7C83D3069AB5A0E226D40B75342CF H_OutputB = A7259F9E090032031A96DF2704F721A97BAD7C5108A7942A64C324BB8DD5436E SharedKey = C6D0AFC66FBD23673D248DAEEF32A309DA199A466FD3C4234403E44E5CA392F9 DRBG_SeedA = B9BCF8DEDC29A28987906C444DD55988454795031C268FDE1500E6A9B10DC64844D9389E117C6B7A833D9C8D07E53D5233A5D7299BCA71BFBB3F9DE5F9D8478C H_OutputA = C1E8127A1CAA5365C424C6987ACC4936A8F92666D4E76BF9674EEFF29D2E023C DRBG_SeedB = 3536BB138B15CD11297AF0AA720DEE7DACDC4D73D6AF60F406577CE17CE9C0EC H_OutputB = 0B7DA1E3F69F9AF41C9EB2991D3A2A380E2A880CE9D8AA63CDCECB3A39B6340D SharedKey = 7099E458967CED25CED283DF7A98E0D6A89FC8DF308702A70BA399BE3D39503F DRBG_SeedA = 2FFEF732071294C2A43ECD6A02EA6D0D55B2BB86A8B08064625E041DC6512C0A2FB6FA3DE500EE80461FBB990033CE481B95D203E5F9F33BDC3BD00D0628541C H_OutputA = 4D3C073A7638102C7502A952E31EBABF41483CE066318A5F27C0D392669D075D DRBG_SeedB = B55A9E3CA27EEA79012DDB1BE8F0C8964DA632FF7D3E6B4A969F0FA432AE6099 H_OutputB = 7C79176EB7C2993A6ADF49006BCD25F80477AA32BDD438CFE94516C32B854327 SharedKey = D4E5390A9132FA5AC059632A4CB2D5330142ECC730709E891E4411E7EA161C7A DRBG_SeedA = 67E64EA7FC3B79E0103E0C0A56CA000B20B84F6CEE2C466E42466A64D201B37C0E07C15680B9797FDCB58DB7ED259105AA7E0CCD2C21EF7B98BA60B402203ACF H_OutputA = 3C98972091B1B0146B8522A006C629EED3AC064442CA0155F1E105FDFFE7EC32 DRBG_SeedB = 1BDAAC602454785238B86BBD4133B1153EE3C4120140FBE17767A89F2D5008DB H_OutputB = 43B6327CA6455A9EBA9F2F68FD3DAFD20339FF39E637D45E57F10BBEA9CF3AFF SharedKey = A0926796926E43FB95A3804FC22CFB5EA3C72428C5CB672E0CF9C54A333B2710 DRBG_SeedA = 031DAD5CCD6A8D84EE6AFDADED830105696C83645951A9C239D7F43BDD719B9555C86D63379DF73CCD61F9FBE78396A083338CE06C72D664876AA9009A7D8ACE H_OutputA = 5591C3A4ACDAB6C3EFEA624BA85EEF9EBA4192A4ACC6A5658AF4529080794C20 DRBG_SeedB = 4374D1E4D4EAD24168AE613F4BB3C63DFC38243E6E10842B46D8B2DA6BC6C015 H_OutputB = D4C76DC5B14058CF67CB135D9F12B98F8D6B2724021C8ADE914443BACD0B8FC2 SharedKey = 334C71286EA1CB7DCED9C08AB848AFF24F70011C2A7C68E493E8708340C7A9B9 DRBG_SeedA = 57E280042CC0B86280358FCA5C9EA1DC995B355D5F0415ED20CFF848F0F761C48EF0F55A974616ACAEF06033948321CCD9142053108A889CD29872B495B2EDAB H_OutputA = 24B8AE6EB628EC2FBEDD4C05B9881646D114A1C3000C23E06FC4BFA8DAFF04F1 DRBG_SeedB = 39D1E823C76899CF9B42A46E9C81AB374FD2E1504306F0F93F6B2F38B40C0794 H_OutputB = 8B3157C9AB8A19A4138BDC761D1C8B640D70AD753D69A3249D9E3B16C89CC503 SharedKey = 6B3B789D2D417D118370415102D7F27B50E82CE3383A2BFC692FE9CDFB21C957 DRBG_SeedA = A8128C9A8B5ED2C8A394B4193CD1FC464C99BAECDFB7B5C322A92F0A2527455F899485873183B5820451D44FFDD07F2F9C82CBEB7DA03F7713B0BA1380BE1DED H_OutputA = F0E4597B3C5E4DAE3E2E6DEF5E9CFC5CAE2E4BDADD1FA5BF885C47EE8A2277CB DRBG_SeedB = 4DBB3BA93DE9A4877FFA3F07863A3377B71FEE61A0A3125E5DB7733656592C35 H_OutputB = 968BC21F8FFDDA7C3E743BC634682654483134FCCE638019A798B4D8E54BA0A7 SharedKey = 8B7DF90A7795EC0C31ADC5F512D0E57009265BFF258FCD2C95A513283254082E DRBG_SeedA = 104BE8330539A2CD286FC7F5F50F5178BA92717F439B8E23AF5656762FE91B15483EC712C482942A50B12075569566EF6833180F568BB8F76699714C52E062E1 H_OutputA = 69F787A07224A2C05979FBA1CB36379EF8FBD401173BF33D718F2336B96B11D7 DRBG_SeedB = 576863F24BF10261C26FA1574F00DE7A7810EC853FFFBC276829BEC4A012F083 H_OutputB = CB3B21346B96263B4A15D800F82E42A8AC9600F6364E5CDC695FE3A32A88A937 SharedKey = A8AC8DBA8A3E3E2015E4B8A2EFBB25ADE639E03DC6CFFCC3FE72E26A5C4D4C91 DRBG_SeedA = 27EEF015D23BE2923D9B1224ECE8AC05FB41F2ECF6EC5DC2B14688B646728D18C97810BBA75FB40CD972874FC1E89632B1884D188B650B2341BE449B206E7BC9 H_OutputA = 29E31806435157C286F119B4C325755A5646E51A8B10DD8FAC8DC98841F92C67 DRBG_SeedB = A56ED6416685C4DC0A09E76EF2E8279AAE8E73F98467D4D59DE4D74B37DBA57F H_OutputB = 0F3EE2EA65E2ABF78D96706091CF4B10F7342989E462941BFE4E7DDD7DBDE98A SharedKey = EB9E242DA82EDF69EBA391BF8F55C58317165BBC7F1D489F8236F1AD65BED1E1 DRBG_SeedA = A4BE9916F682290EC6537232CDE4005D79D9099714F4D22FB49BD6CD4A2E1B1E766012DE1062F30A1EB80930D17D553B6FE8BD36B2B735EEF8525C525D3695AF H_OutputA = 7942C2C045024F9E52433D9E96AA94A8C2C1C5D55D6CDAED211FF29A345D76AA DRBG_SeedB = 3BD2E4F7FE9E5CBE045EC9B9872F9348E70F49FECE03C386BA6D9BC5C55A07C2 H_OutputB = 48E078916AE37DC49A4A3DDA1925BB9009E3C6248AECD885B7ED265A2C0BDC76 SharedKey = 30A123B53C60197E6D38A7799BF59497DB9DCEFEF5FDE540867343570A83A3B0 DRBG_SeedA = 88F779D6AE56264C535CB878C5B26692484DF0114F943DEED60D29A244221BE81EA36D6CEEEA9985BC7F99C9DBD3FD0C87F25BA8038F1024CA2CD5BFB35BDB48 H_OutputA = F891B73195BB8D054AEFA86760413B433EE952B581A7BC029C48EF32577CE75A DRBG_SeedB = 7FC6D08EC7B13904AFC60A8000682505793714373A60AEE1936CA315284234FB H_OutputB = 45614CE6E63B7733E47DAB1D5490F4204D65F68E6385AF7F426E57557C1298D0 SharedKey = 742891B49C97775A80E96C20B3215DBCFACF990EEC9C10D0CB801864F6578E04 DRBG_SeedA = FB4AC0CA2D6F0017BFE5893DBB16724F67EBA11CB4F211199C2BC5A2C0E1054F05FDC5D45AFD95D68DBD047DA63EEA0047DF7FF7019DC1C46B5A51A93F4D74B2 H_OutputA = 87A51487FFDAF0B7DC2F3CA397D6007ABA91036D12E76D2077B096CE2676F03C DRBG_SeedB = 7CEB6133CB1630B8DEDE00A498FAE2368CD882FB5E92F2DA458F62D91F342375 H_OutputB = 209AD326ED4788B73FC2839EAB02DE3760E7C71135A9C3D4A2D5550FAF9996C7 SharedKey = FC843FC6C8A3A3259CDBB0E868A2316FD9E7F533726440C9BCF769B9579CDA0D DRBG_SeedA = C9CE39747C47C07EACE38B598B0685C01AF55C63520AF6966E0672A0FCD4B4DA751C7810037FA2CC14FFE5CBD02F4CFE100ACA65DB14EDD7A3C77117E56AB50F H_OutputA = A401EF02580077D96D469C400AB6EC9EA0409099436FE41D77D19F50C2E0DC7A DRBG_SeedB = 9312EDCC1DC56116EC4AE2832026A2BD5263B9FC29F8882D6EEB976881DBC6E5 H_OutputB = C70B84CB072B30ADFD4640282BB977E7C54C640408C5E67831079B541CB2D0D6 SharedKey = 7DA229DB4D427D6C61A1659DFFF958B88A38B7EF05BEBB445F82E6D56E078C4F DRBG_SeedA = 6FFA3FE741ED7AC26CD2C828D70F6D611F2D961E2F8C9741FA84C34F308F0669D33F0748B5498D8C4C83C6E8D027A223E73C102C7B711658699A217F88E35E69 H_OutputA = DCA5662ECA3B8BB6E43A1B869114347AA3AB2AFFE3D7E04D75F028C65380E0EA DRBG_SeedB = 8E4E0A2FFC721EA09BA3F6BE5719E1179503F9BA7F22B398CE7052F69E457001 H_OutputB = A05EA683D523A2B29E2E6563BD1432BCEC977E1A44440645B59885FA925B2265 SharedKey = FA8C2FC006B4AFF7D0CFE5DD2E3BDCB60B06913A6C0EB6FAC4A81BBB4FB1C0BA DRBG_SeedA = 6627BAD476018482ACF05BC9D4E41BC0FF80BED54C3295DB855F6B26649CBABECA28CAD6C3D92D88B0708533D317FDE7C07A7D0549A69CE122474FAA01B77746 H_OutputA = C5E62FE2A47DCC330E712E65361020F7DE49EBAC6B135EF90FC157BB1F3238E3 DRBG_SeedB = B0BF40FCC811F316C8FED408F1415F6200EAE4C89FD9B1FEA072C168B172F6E6 H_OutputB = 4603A16EDF0EA9407649BF6A67AF1E1672E8B5ED883F9099056208908FE1E49A SharedKey = 68B8126C6FBC797F39C5BA9AA1A320C9EF4CFB8FA3B4DF45D4F4AC44AE5611E9 DRBG_SeedA = C4482E4D2D963703E2DCAB6ECA357078C19755DAE325D8582AC935A07F6BDE5FCB5E18F11FF659B89730FF5E60A80A16EF462FEED7A4A93B9B2686E34BCC86EF H_OutputA = A9C3D2013ECF908E29075F82D574ACA8094C970439EDA6E21DEC572B4FCFF9A5 DRBG_SeedB = C45C630FB36926E0721F18E03142AAE0136901ACA1ECC591D70424A696AE15F6 H_OutputB = 2F25FCE30F09DCE2941795007EED365F6F7F10761AB8A21CCE401428D226134C SharedKey = 48B9B26DC426E8584A6C7F164D0C1172B34A88AD849ABC1EB0935AAB02588AFC DRBG_SeedA = 5C4F28A0919CC7F7846EBC7DACE225BD65A6085D6B7DD36FD060191B58A69E9CB7D5FE66A9862BDE51E322AC52016B1F4F4610D95E49094820A0C1CCB37F71E7 H_OutputA = 4BE33D9CE3D2194E8503DB857091E925325ACB1E15AD7CD80A1890A64C1A990D DRBG_SeedB = 8FEBC8E7B6E727AC039F3AA36EC364BC715017FC3C45AD8908D354EC49D55521 H_OutputB = D972559F33778DA40BDD680BBCF20A93C84B112FED60D9DE9DAADC69CCDAC997 SharedKey = CC98053DBCCC2404F5674AB3E5B91F612F7915264A7E2EE2C9EC7BA9462E0054 DRBG_SeedA = C8D16C2F13B2AB38DB63D00811DAA43ECE3D34D3B5625C634ABD802216D9F46DBDDCB00154253D70C215721F81F0CDC5D237A5DCB50D85127B189A8D5359C4B4 H_OutputA = 7FE139E76AEE44E5F13C9BDDFE0496C89DABF81D5C13A6F390576B7B883D137D DRBG_SeedB = 353CFFFA07B02A6A2003E2ADC05E1A38BEBC2C0A252F41EAEA9CA9E089549FE8 H_OutputB = 96884795C775AE16BC183C6F75494A40F0808F76582FE409E0611113A9F4BED6 SharedKey = 18E5E47F9530E3FA871353905AFBB85D07E761169347D1C37D1F42266A249A01 DRBG_SeedA = 28F5AF2C739751B0456A27E8DBD9EB3B1CD5AD428A5E4D1EAE560684533309418066548363E32CAD882B02C96433C6EAF1B58D881B2CBAE294479BE53621E9E7 H_OutputA = 5DF023A7D30B40B011A4CCAFC5DDBD82876A26FACAB130F2D66F77220F7684BA DRBG_SeedB = BC99A55160B11224D8AF0F3654A41B8205F220178A4E5F1E0E81B66777C42658 H_OutputB = 03179B2A4BD115641F7380B67741B1E3A42A893AA0778342A7BB8B094884F93D SharedKey = 4A1B2FEE00C344A77E1B2DC51E539F3B7EFEEB1457B90B9497B8F702B3E0DEBF DRBG_SeedA = 5C198AA6202F93B62220E4B068E656ADD0466345E4CE93DB47A3ECF3CCC6A3FD2C2E956113AD64E91C23C04709BCFC41B25640EE71DD5ABD41228D876F61F99A H_OutputA = B3C585036D259A6F2520C9DD8940A9DE1FD9647AC755FD7E3E53DC7476ADA3F2 DRBG_SeedB = A653FD30BA8ECD3BABBBF363746B1934EF51E7B8302A06F7262124616670877B H_OutputB = 49A35ABEB203C6E50D8D701E6E0A52B752A649DBAAFC75F60471A3DC1175C65E SharedKey = 92682521CBE42E9BA91CA6BBB9FEDA0FF76AEFB2D16EB105E290B54FC36E1928 DRBG_SeedA = 2C78428CD077EA13FBB0FAEC35FD9DA41F5754AB568EDC399F985A2CB185246F963C8E664E454D410A518EBDCAF991FFDDDB41233BBA764EF440898857E182DA H_OutputA = 5A485AA61F60CE96F1B29789E118B0ED9E071886EBEE69348A86736A247AFF66 DRBG_SeedB = A52A2192DBE71EE105CEE3D648DFBD7BC8899ED9BB5CC0F3F8002F782E24A5F4 H_OutputB = B1F04DEA6F90F9938643E8EDC7BDAB8D8215F35D2629D28CFC12189A9611B4D8 SharedKey = 7AC03506A2413402269ACD8A9D80886340E960C9AA1A845D471B09C948950847 DRBG_SeedA = 9985BEF6FD7515A5669941917A610D102266450CA6DFADB9396B5FA16A0906429D016386B160862366CFEAFD3AAECF4521F573792BBFC30951EFF03ABC88E9A6 H_OutputA = FAD641C6E9C1E2902B0339E398711F727E4C8D0115DC8ACA845973C6385BC974 DRBG_SeedB = B9776AF77132B90146E94914EB4550E7264B15E3F9AE9BD31663EF95A7D14110 H_OutputB = 0BBDFF0CA1518B38ADADE77A769AC5224DB746F7984393B3EFE63AA170416473 SharedKey = CE168454421F59E61D172FB1BB435C6654C5DE42F65EB91974A6B29BC7C403D7 DRBG_SeedA = 3286E7AC67557CD343CA5774AB3E92A863B32C262043C5384734ABAEF34EF8FB77A869F80B4005A02CFA6AD76053961BB49D079F47BA50E498241F7EF4740E5C H_OutputA = 2E0418D80563C8E547D0D30567B3D302450A7F15CFDBF129D8E25F86A65D5019 DRBG_SeedB = 79A043A25F81231EE3D8565395AE17193964F6B3B325E699A560E064F5D6000B H_OutputB = 3FCB8BB97718DEC450B8005B754FBBC9806E0D626B7FD4ACF3ECA42DB5338BE9 SharedKey = 9BE3B6CB06E6E45E3FAFE3B03500D4AAF921FDC5CAA8FA82CAD75DBAB9F27F48 DRBG_SeedA = C5384C35F61F42B03B806EE5779F3B71811ECF402D0D1B51352D3603A43611F656333BBFAD6D0FBDF13E50F4B61BFC4F8A9D083E39B6671CB93EF5036E3C9CE1 H_OutputA = A327C57C3D5ABD84E0E0474830D4DE3185CF64409D68EF9B5FA8138A9BA17B96 DRBG_SeedB = D3DF7508DAB27DF65BC97DBCCB6DA0238E21F4BF77185770195017995FCD34FE H_OutputB = 3E65DA23B5C1ADC40A7A83196AE1380526AF25F4489927F9D60CCF759D6C5667 SharedKey = 3087FFFB7A9A516A868CE9BEF004CD92E7CE2E829271870327E5BED575C476AE DRBG_SeedA = 01588F306E271C6D403C5B798BF7AB5B42B8F62330A3FAEB0262ABC1267A3A6C200563EE091C7B903B17D92CB4C45F30FC54C3E355306BF40EAC91718432CFA5 H_OutputA = 0400F8B93397F468F0A26095E4E334AE377AA5FFC5168A9CE60C8A61B57E0F08 DRBG_SeedB = BDD2E158484F95AEAA84A5CB2580CF68C2C797643093C721D7342BFC8D740C4C H_OutputB = 6C618AE1285CA4692D78A1803691311CA353BC27F5E8466E06E5338BB368861E SharedKey = 13890C59F4FD9CB4E30D653A9E6FE424D194504C3DF11853F342B1EE68724E65 DRBG_SeedA = AE68E0FD2701B8AFE80B9257E87341BA858D0C68A9CD0363DF8E73198D7A691EB1CFB32865DD25412335D7D5A52B266525803107A68918DA26C33C8E42022C64 H_OutputA = E66B02E9D35AB8A0BC6851E75F44F9D49764413F74FB18CB8C742859019793C3 DRBG_SeedB = 8D53AECB922EF8A23BC7087E7CD2F13A9766E1B2E3E8DF3531E2284858468E11 H_OutputB = BA98AA2DDE5D8C88C59EEB50E5A47315363531BDDE589C133F5FD822C77DAF67 SharedKey = 28C0C6965B3633D2E79DD3DC908154BDDB11C4FD342A6F4CFE23FEAFE8D21C33 DRBG_SeedA = 104184DB8DEEB8E51350163290C6BB8AB1AAD3BBB5EEFA01382EE2218FB54F7A87CBFC7B615CE06AEFB4DDE975BB19DB13332E93BE7A31562215CFB675AEBBFF H_OutputA = FCFE36E4F289F0CEBED88284DE1F44F4F71C8177AC19FEEA7DC3E392F438233E DRBG_SeedB = 63058625F451A44B296FADFD4CE6A41EC78CFFFA0DDB2E8622EC8C5B92522D70 H_OutputB = BFFA2852934EF1C6CF42745CEFA62E5F8ACE73E6CE9A9A7D4FA1B3DCC046EFC2 SharedKey = 3178AEF61C91D8045CDC88C43FEC501CE3A2D1ED9D4776059377789600976DDA DRBG_SeedA = FD082EE3024AB92EF1B91C6779976705F49AA03A5DA8F34A74F8C625A24284817DD6CB0A5FA2F58D68C6640F46106A470046C98DEE92F418E874980936C0404B H_OutputA = C56541B2FD5F53EF96944600716CE46DB79A6301D4C8E34D2028B08DF3E8D964 DRBG_SeedB = 8AB3611C73183A6320692C4E7D3AFE214A2B6A1FCB9581904D0F43B1612C870F H_OutputB = 44335F5B9D3F2BD136D368A1D3802FB8B33EEC193BCCFA75FCA275E4CA5581E7 SharedKey = 6CEE8BBD25B54EEDBCE2428D08C50E7DFAFCDD187947ECDA5B3146E0D7CE08B5 DRBG_SeedA = 13C4A22B1C54073F96B390FE67CEF332D53D5AA47719B14FB22116730DBBBEEA5D2A233C43BC420A4C27CA9863A1E7ECA95740D43C2C99241B551BAB4CD36DF6 H_OutputA = 04004069C39126D4317CD6C7150F0720C2FFF695D5DE298A1FC9161F174CF504 DRBG_SeedB = 2339B6BE3CFC8AFEBF218850D8585328D72649D30DCDEFE17ADAD235E859EABB H_OutputB = 985DF8F2FFBDF4A5A4A7AC2ECFDBDF2A3F0334E7E56612376153522470BE70DB SharedKey = 86181432F7CEDC871432C1DCBC86A0F34CABC8AC636A8B99D92DCA3D99825BC6 DRBG_SeedA = A18DD1950CF63508255A8D68260F66EEE7CA6BB45372AF992208EC62B1612775C173631AA4E8E4E9F2D8CD62CE6D234DB90AF753AB0D243DEF910AFEB78FCC7E H_OutputA = AE9036B200519A18B15E995A28CBEC234FA06542D277B3555392A7E33BE95221 DRBG_SeedB = DE4AEECE1BD53138EF6F647B35D82DEFA2A9C57AE417381FCC525460504CF3C9 H_OutputB = C84B3DCAF5AC517BBB28556BB8A22B91FE485E890646BC84D7DA7048C6BC5BAA SharedKey = 39EA479C5A773F2B35D7F29562ADD11DB5C072C6D78E72B18B15CADB2E679533 DRBG_SeedA = 1E7C4ADD50FF415813CEEA37766ADE0E472B8A4CD91B36C151365650D3F977E90612022BF09C302AA629E59657E780863D8202C87AD103762622FA3D4AAAB4A8 H_OutputA = 83AC8DF774EEEDD1A158E3CC2A3EAECB243E14C1BD7F63F556B82CFB96EC786B DRBG_SeedB = 9057635D4B6FFFE534ED8A15E1072ED32F9A16B20F53A292CB570CD9FCEFD6A0 H_OutputB = CE039C97F7BF8BC01EB25E65CFBEE6DA51066A5AEB9C5B3C1E7B525D3EF9A522 SharedKey = 71A056B1366641EDAF482940347484E28C0A740FDE61FF135FF2DA22C95E09F4 DRBG_SeedA = B54FEB802D588B3E1F41E756EB8CDA8A641ED6545737DD7863552FDB2C2E503A0FE961AA50568E48804C7020C827070FDA319675A6AE68ED4DCB5B63220049DC H_OutputA = 40303DB4CA0CEFA9E16E7B47C0ADEAB9F6C86096877A7820C346FA3156EE9392 DRBG_SeedB = 3DED2B9619C7632368799ECFF23058D54DF0F244EFAA546CB7432F73E1468C81 H_OutputB = 2F4CBFD304F4CE0F4CC365F2284A8F70C17EE26E474DF219EDF9B0493062363A SharedKey = 128855E60183DD73256511B482B96F7D9DADEA11BAC6DDF1D602865D27108C40 DRBG_SeedA = 2BCF0D2EB396223DFCB3E36F3EF774A10B776523722AA2010D4619F4460D706E68E317E295F8ADD2B91ACE92CE284275F56A6EAC99AD22F880C7C7FB4D482A21 H_OutputA = EBFD440301246C836615E759760C50993236FB5C477CF589A635881ED4EFB12A DRBG_SeedB = 3E00FCC43EEE0D4D2DFE80CD05E2C1657DA3991F36ECEC6FB897763A360F0ED5 H_OutputB = C7600C4CC9CD2236572B363DA5E7A17AD3823780E28BDE387DE879240D20EA3B SharedKey = 79549263337E9ED3184CA83A848DC9824432D59632BCDB4459EE5DD3B775BCEF DRBG_SeedA = 1180E78B3545D536F7445F43DA2FEA0685762AC533C7A2DFB6D2DE1BAB2142DA9EE59983D3E6AE95CDFD308DC135FA02DAB2AD2ADC48B8822ADDDFD00B9ABED6 H_OutputA = 71C2B437EF2BC7DD3882E4D2435A8FF2B611421405187B031AD71927B1B357A8 DRBG_SeedB = D52EB2FEFA45C646D21E0F244AA4BCEEA4A660E4A02E6015872E88C4282DB008 H_OutputB = 75541BFE9007C8C52471269E322D69C72CAB8347DE68B8CAF057B818445F7EBB SharedKey = 830DCF1503DA5D92A83DB92D6AE94BD77C4E95E80D97A15C2DA519E6DBF23A65 DRBG_SeedA = D28307026E3081B4A999280CAC0B53D9E6044EE87970BB4B8D629BEC8CEC5B42A0E4F2A120DF32EA1CFE98DDE1D0CD8DA7765A2AE35F48C2791010EE13F21B9F H_OutputA = BF8CAFB3CF72531EF9B66923E39958527F87F0597CF8E4BA9C0F916B3C7D5126 DRBG_SeedB = 2B54293950F97BFC2537664079A0245CA6185233DDB5E1DD7FE8943C41229D02 H_OutputB = 07DA295448575CCEF8DE44B4DD74DD63C08F7AED6A6441F64C6FE8377494D110 SharedKey = 1DA1DE1D0681B1C904A4D39D5A08CC17EABC05B567981A6073C4DE8694F4A875 DRBG_SeedA = 0B0CF2B34CAB13532E2DBA039B266897F6E85FF652158265711A38F403199BDD76D497403A18D209B650FFC920A69C562AAD4DA10B3E6662B08C8EAB99CB7B66 H_OutputA = CB3EB4C62A9DEF819E7F4F7462A94DA83B449E3629B1A2EACACA30E6856157C7 DRBG_SeedB = 598EAC10E383279AA0E6D82E861785581F69AAD1BF65306E446C0CD30507ABA2 H_OutputB = DF91B1C84FD3849831FF8AD7263AF3CB6B2B8CE9EC7580358E7B195933D116F0 SharedKey = 19116E180D1FBB6AC345439BE4FAB1CF7998577C61979749ADD8DEA00AAF50E3 DRBG_SeedA = E3A3B2960576D937945186A65BE72AC3AA6A9BD634ADBC5B6CE041538E5F981B8A5E832575DF3474CF9BB3A02FD093B4383B0BB297CDA2DC90C9CB5EDDBD02B2 H_OutputA = F127BEA6E380FD310BE1120931EE4A7EB436D636783A08D0DD128217315C9FD4 DRBG_SeedB = CECCC674969BDC0DB5B98244A27D8B076B0C33090632105D0A7617FEE2E9083A H_OutputB = B30809A5DA5AEE7A9C0BE2BCBB60D1647197E12F84C3CA49B69363A7C6792533 SharedKey = 530F6074CE3C9B5197C8286042C9B93A31E75D9341B2650F8A988EE0133380B5 DRBG_SeedA = 66371300463F06079B3240B670059887F190E7280EAF2522FDBD0365723F40AF030B7937D450C12700A64CC2723685E8621EBFD952CD73375334918753AA26C9 H_OutputA = 58A3A1A816A8B90F3D4009AA8B79DE4DED483B7985CADF764F71A149EFDB81E8 DRBG_SeedB = 6030BD7F891A07763D7133B3BC8B5636126561F45A2C17DA18E0DA4A097BF644 H_OutputB = 3E709EBE9DA849054EA79B9C20169DC511D4AA23970ED34D25BB6A4DC295937E SharedKey = E6CB8B3280DCCA0AE8EB09352430A564DF1BB3065807B6B1D36F2DEE634C9839 DRBG_SeedA = AEB991B8DA4E0B940BF24FCFE5A617DAB030C961463115A660A08A6C7C4D55FD0EB8902AB8DC296F4B2C0D3082AB031A3B61D276483C57B608509842F51C0F1E H_OutputA = DC2899E0D1C8A5D6D1D40D42DC91B997ED73D88B87FC564EE2ACA6A3BEFFE40C DRBG_SeedB = 0163FCC84715DF76D9FE408D5D2912AC7B69CFE406791D5CF07676C86048A042 H_OutputB = 38A8D66F7619FE264C4868A6F6664C7CCB11C302025FB7281D487E61256E8F25 SharedKey = 1521268CD630568713F668E561CB56664F9430AB0709C36AAB3E12F542600717 DRBG_SeedA = 6C8FB5803E4F6DD2D7939C465CFA94B58BA9461FC2A843C6B3532096186D3E71938DF376DB93282AD74F4050EE3ECDED01FACF77144803E79356A812AE6C41F4 H_OutputA = 389B8280CAC53EB8BF534E38AC8C497AE567219AAFA8BB86B146283D9695A793 DRBG_SeedB = 938BC6C8D1472A4E23EADCA7F31486FED30BECFE38FC6FD42A21152A18316ABA H_OutputB = DA744F7FF2B93F29752E094F6EA1223B6CA9CD9032E4DAB9C7F6F703F4828CB9 SharedKey = C7ECB633C442F3A5D485E496BCC6AA0891127C6567BA79A172464D746B1B0A61 DRBG_SeedA = DE475F05E26AEE192154E50EA139E608FE2E87F21F356BB8297D81D28E22239F030FA0A8A0F12B243CD89B9E11F2CF9AD857E35CB52296DF4F8FA83C59C37F30 H_OutputA = 0DC8372D807FA24F1669FD56CA2395BA1BFB47A40476D09340FD4E228FA20CDE DRBG_SeedB = FDEA7A47324F69D1B8619FB787B1924D0131A67F14ED813645A36105DD2D9626 H_OutputB = 93B70189E59AE84151A29860DD8E6E1D7FB81000244298951456DAD35703AC6F SharedKey = C557AF89BEEB4EB9650BC96D10C29C20D1DCD5246C31E27CB18B4B96C4B4644F DRBG_SeedA = B22D273774A9ACEDE4CAC5F1957B8CB5E40E3FFC7B17FED88907EFDC1DA55A685E3E303EC62C358A5C146DF4421F4A009308F9BE4AC4D019C2E6DB719B25A281 H_OutputA = 4D75DE6ADFEE5415363F1138D8B538E071BD9411A674203EEAC9E071183ED192 DRBG_SeedB = FE188C31CD4157189CF859C0CFE88E1B22159FE2BDA5E4704F733B7E637C3D7B H_OutputB = C21697007965452F09C7C24D6F5CC9311102397A6C49C2689108EADDB5E81AD7 SharedKey = 27B384A458D63496B4F365BF18ED28367A132809E8629AEF999D72F82377A2E2 DRBG_SeedA = FEAD471C900CC0385F8BAD0734891FEEA90ED828FA962042CF2A12181C1B826781C4290611F2CA33F902528508AA8DE13D79DA9D03B51AC82BD16BA9DA92B7D8 H_OutputA = 6D00D43542E690CD34CCDBACB518D0267B557A76A634173FEE33A13AED7041D4 DRBG_SeedB = 0CCB2163078C49635F430ABEA6EFA2A92A98607666F814C0ABC3B04E3616DF26 H_OutputB = 9CF017F37AE524E87FCF8E4B09EBD9825BF7702CEFE6464DD4E003BFFD35A6B3 SharedKey = 8888E1BE8C774BEE34C4EB143646AA49E11D95918EA5F68896EAF5ACE664EF90 DRBG_SeedA = 9136C66EB3D4640E25E1146DCB91CD91DBA82843F498F18E6D1C33F4197B172F57DE89F652C2FB8DA1622D329DB6DD55198700CBE3954C36726D10200A154FA5 H_OutputA = 073EF4D1809DD1224E7B2C7623F11913091BEF85998B37AD1C91350A4AC98B39 DRBG_SeedB = CA0CB7B56F450FA1081F0EF73818AE9A39BC18C7F3618FBF4CF5CE4EDAADC1CD H_OutputB = D9E98A811DD5D1D93B228546BB77D827F304084009F39B6058C27DE7B91FA536 SharedKey = E725E87DF851D8297E712D8EE1A8ADE27F9C91B9480D5C648705E3852F0DC665 DRBG_SeedA = 64205B7B51C6C2DB7477D3BC616DDD2A0787433032EF2B5ADF0F681DD3478490FCE3B9A1FCF2F3B0762F753A74C0154F50C4E2088299411A3D2241865DCA4A56 H_OutputA = DF62BEA5323449610718D291B4FD032347A00918D1B7734FFD4B453E67F54B85 DRBG_SeedB = 321C2D160C46851D49B8C4AF35D759F3EEFC65457B838D8DF9D0D376D0C19472 H_OutputB = 451164D8272DB8780910C9731ADE49D44CA741267AD339674493B7BC71EE53C1 SharedKey = E47572333E630A9F0AE5A21F0B39739016E8B8FFC562FEC35C43AC689619B77E botan-2.4.0/src/tests/data/pubkey/rsa_invalid.vec000066400000000000000000012403131322470703100217560ustar00rootroot00000000000000 # Data from Google's Wycheproof RSA signature verification tests # The valid signature is tested in rsa_verify.vec Padding = EMSA_PKCS1(SHA-256) E = 65537 N = 0xAB9014DC47D44B6D260FC1FEF9AB022042FD9566E9D7B60C54100CB6E1D4EDC98590467D0502C17FCE69D00AC5EFB40B2CB167D8A44AB93D73C4D0F109FB5A26C2F8823236FF517CF84412E173679CFAE42E043B6FEC81F9D984B562517E6FEBE1F72295DBC3FDFC19D3240AA75515563F31DAD83563F3A315ACF9A0B351A23F Msg = 54657374 InvalidSignature = 52f46d508e31f030b17c537888585f919037562e15f1924543601a41f9b701ee416ad73d6576b4eaaa64e685289dc478751dfe2d7e588252bfe2d43f4b3a31c6c6c39a9df884a2fc2e45f09c2150a830974b1c9d26090830b37bf06f1d57be1da34ebb016e9db7ce2c34e94872c89567ff6f2ab35a1a9fb6632e100c7d7af834 InvalidSignature = 3f34017b3172aaeec72d208308e9b83150699f86634b948847eab56f0169fef51b5636a96866f4f0f4c649400489e047803a91f2b2f32ab715065e20770c4e2788946b85aca5c90efdd6a9458dd9b6f797f96a3de88d2e4896afe147d8c0389943828100061903a30eaff1dadd98d3e49dba56cdcfa5f215d9c615f974f4a0bc InvalidSignature = 1478337676aa47ca72ea7557facff06f6c777f56063f4487d345e43dc56a6bc5f8a891085d53a32c9d1c3cf7f469e7f56847b0b1b9b5b784526078271f21d0550afc40f81e2b8e8dec851d87511cace965edceb83cb96c8d6616e1ee75bb22c54412fc942a6f71c9fc609a31a69d34b774a97c1ba4f85cca28d9993db8543f75 InvalidSignature = 77ba423e600bdd761ed10e7c00698a87fe1322f5f42b2902a0be7a24b1cf44f613fa55edeb2ded0475f8e1a13e5368f9a2bfc4f2f926ef289a2207bf3689fc1c8ec3e5463064a7f51bbc993966cc4016319b7c95f282372f1ff848d7fca753a81d905b3341b0fbf60ba186e750f3171cfc84288eff8742bda432bd6c8dc04f9f InvalidSignature = 9460ee79bb990bc3fe28cfca92363e6ff6900e3b61b3a402f06024a72b7a65d62094b4419e93900995eb121327f72b26b139bab3e5e2bd0c82e0cf6357f3b16f1c1dd4407a9a820f20e3baaa2259614d9ee3e015e1c1778befa13aff1e545ea1758cba4713631d63180a91b52df394294441642964a024f45b2251c90e002ec0 InvalidSignature = 96ac043d3cada45aed0dbdc4662dcf7855553a5effa1077048b51c7e9bfff7c2bb3486ea42894d4b4afb26a3b3bd32cb68d5c4d8ca2622f50d8c56fdc25baf83b9909ecb096419ddc13578dcc8121007f7204ee82c517ae03de70fa23ef2390602029a0cbc8a96c5b781d857dbf12802aa561f5f41ea35aa0babb91b9f891762 InvalidSignature = 2a70643572a7cda975d9e2c0827837e60eaa78c297b1ff75b84f654a91fe33294ccbeda52676ece50fcc03018151e66c24940bd0574ab85a6599231d587f4a6e0ae841cb6696e7dcfd182cb75001304e36887bc4fe3b373828f8b0e62ac2300a626c9e6a2cd05bb7910e74da2978dae1948f855b3b455cd30367160e21581cab InvalidSignature = 27778e39b45dee1e7003f1d315d3466fc111791187ddc056784c158df92097e123021e11918b6df8d905304db732e83d904bc914271b03def4ee129c3fc8adcc4f81b690e09e70e46c8b920093f304e64ecb7358740e976d28538a9eecf09ec1e1cd47df9107968207b21538cabe076bcc07c3862c46a793fcf638c70a972885 InvalidSignature = 3a879e9f883b158908014f3617cae3315d47afdadd30840494f68d91c04dfe81bd16a40c7d21238cd1816928d989a232a3492325ab0f95d4426e3fb7d58c9908191dc557d8779dabb282287b7860c30e0796283428e0276447235809882ee990deb0f4312c01e7ddf0690406eeacb660acc6957bb670904cfd8d04df5e3ebda2 InvalidSignature = 2b82155f363a3b283ae455f59e41c29dec2fbd8c7438b0e347aec5b38c7c895cb7d326870e4fbdb935fcbb561f223bd926dbe8b95ef5eaab27920dbe30c641e99f526a9bc356af54198b459b59383135a82cd5b6edab7da0b1a51d939b2f9951e1432d637c4f04a3546ed9c890143ae364602b94eabdaa2a45e4bdf0b5bdfa71 InvalidSignature = 1dda56dc953aeee7fd76ae7166d92ab9e3d1d9759e76f8f1d7634a73cbf69e39d8249153d7c2d83c9664db13552f0c78df34b8a67e7b6c10bcc61b5ead7ba62ce0ec7ba8ac78d146f7e4cadee6f6250e0bc3100660e7afbe3afa17fa288d97549b4c8cacc00ac5c942673485739f89c9e5e63ad2be97a8f2313f5c5b095e7542 InvalidSignature = 692c143b82196a391a3546607336e6f3bc047412645cf0def0d62d1b42234c14da138bb7f451b45073bbda2aba23412e83bc40d4e7de3e0684f2cad7d059f2d6831aa3d2ece4964ca75cd41dce23c5ba495c15345b36947b4b5a051fe1b84e148b5ae21f112d2245b1acbaeef9dc4a0c408829b9d2b1b5ab1d3a40af0a27b99e InvalidSignature = 66c31a45b2287425a20f65c3eba9cc58c370882f5fc62921935491fbd516df9baf9b28304a21d9008b61a92779ecfb3b0c03f6d74354f5159956e3fc1d35bd7376289378f05d7a71e05ab32794f2566a54635e8dc64740acbe10a293ceddbebe8499b520f406023a134eb9927ebb788b92488f036d109ec0a40ac52372e847b3 InvalidSignature = 7b85536bdcda4ad3fc40129f2ff9dc85d9ec049913784064e7358686640446278a2006d93fb33429407597e5d8c783e3f7aee8a7791d69139f3c802a6547f01bf987415eec2447b0e8c4f3aee7ae2085d141fa34ca6634bc109dede93285d5c40cfcd98bd47ceb9cc1890dfff53b7ebb8038533580c7a67fe14c0c422e20cd64 InvalidSignature = 5d77fba3cbb1905d83aa532fcc3227a95d7931bf0c2ab51f8118824de9dc029bd2470adf48b41c694ec7359d00a1336990c30ee368dd40bd681ba74794415d3997e7a756659397bf6abd44ca91c12a8580a3f5d1cdbc7f3be0c23c72334ce9b1419e6540dab73f5ff8ab57d0bbbe92b688bd3495f9344822b622042c2491bc41 InvalidSignature = 7b5476fb78f389d1131764e7a13322f86008924c8c098f6d74f2df4dcc5a504cd786b3eaae33295cd1e87a2bbd1a06cb385674d465110a9a990d52de9a67f1c13ecaaa86383d489423c084fae9ecd2e9b109f4f04b8c013e3409128f3a079c068c1ad27bc2a20e76ad149325b7b0f0bd804a4e33949a98aac49076260702b0b0 InvalidSignature = 6034e1253e4860a29096e392076794cfcea166a30b340cc09f77baa5952c06d148bd89b750c3112930ef210a50a7d3f6569da89912b5e50e824116e73a15536958f75779506d07e67ec9c0cd8de4b51dfbb0fe56926feed18ffbd83b0cdd50d56326c54adf97e629378ae5f0f02fcda3da1aa98cb1d1990946edec711a85a0d8 InvalidSignature = a44cd265e1ecea83fc74e9eef746ef173277cc96f69a1798590ddee7ce5b5c34a82ad58a5c042db19005e04eec4159900ea764c0d008c52b94577d1c438661fb767902d9d1bbd6a90bdc4df685ec5951eac81d8b4dd36bceef7b6f919e85b6c994c7cf22a804f15cebe63b77f47b3bc2c2aaa68c6362c27a574b849efafe72e9 InvalidSignature = a160aa43f4873cada34bea5ccd2be9dce07940ee1c08eaad524a5019993bc753ce92cccada706b483f106ff20b327b35e7c83955ad3bbff3f26ced3489877d1b5bf285d61afcb30219c02a440da61030e301aadb901a525345d1a651a21c31a62ac9fb71738c3e215a8941ca9a3c4910679c5e774530c28788f6eddd7a31c024 InvalidSignature = 1369c78f816a9baf027e255de0c258125be90f35b8daafee87f2ffef2d465e0694af4401cc5cdc7ca78b08d5688ceefbddc02abc5495d47c6829d696f8370ea427e7e0225eaf22cda720bbb5881edd16b19bbf2ca86654c65b4ad481c13fb38af00d77922f46b311f936c51f4610f6bdb514b366aa05f029c1e63e3cfcf9763d InvalidSignature = 41d4c1ea43cb207af8bfc1552e31da7ca5744b68c4e00c3bf55f4edd4c81e91c01f44fa05290dbaa1fdcdcc775f6032a049b4965345c16aac6994b06cda9e0387dbff96cdb115e014f69bb057faca2f618c70a31edd0beaef7acdcc0fb7c83b2f07a8b9de48aa04b7c973920af5b8dc20aac343251ddf4c2277985c3db1dac2f InvalidSignature = 76bae6c330b9ab33aa9f2abe8559c51fb95f953a75e48053ab99078069214b509dd1b5080ac6819e32912619372d71a9ff1a67449dd699e5bc6ec0e18d1893dfb5bd571d933926d05b0d9fd7036ba4556e209369d1c57ec49cd9075e583c257c6fd4899c2a8bbb157547812cc692f264bf54712c71ee090b974d99b4d1629696 InvalidSignature = 3480a5c22f092f259b5bc4fdb9a33c044c24a645b57d61920effde1dc0bbfe53738023f16025841f9323b40f72c11091941bbdfaf7c2fbf77ad6626dbd6a3b7abb3ee916d96a922b11c86ce80ee67dec619bb98e9246d35a33b11b3a4e2a3a130e8b57ed4bcdd4b4e73aec3f9e3d50d3db5e29cffeb186846c72d09468d018ed InvalidSignature = 5b3d3a198d4b36c6d9641db181fff59407a25bf1571f85e47bad1eaf138079872b93b9eb51aae09b48d6f4ef56badd96a6584277d8f3c6e4a4e11275f72021b50a1665ddaaa56a2a7caa7da6b4d502c5214e17042811154d411dd2197c250264bb69ba43adf668d4f7b81d932afa55e378214bb19ddeb431f702a91dd11e23bb InvalidSignature = 1cc5577d04e34550e7f3d136064547efa30b9413e2c423b5a320eaaaf11cbebb91e13bbe3874e4650e057a8e38c8a366c473f35e0de82b22f846721a09e3f279ebdf54c8df395a9041333f09cb7bed5291bc1842857c4ce6ad5a1c2c476c1efddd5fe42824c25e0581aa7bb8f621d3b53566637c6266bb1bd0a5b7fb79c72616 InvalidSignature = 6e56d1746105344b34fb8299d173f4a5032cbce3556ca9d1eee35f8b31818efc121a1a9599c24fef8531243016dd6288d67b4bf9fdbf2c90fba5b1661be03531b5e15385ea465d1376010f0af761e8fb1afff7823dcef8dc100d97c192e9a7d03c82321d83fd8ecf67207c65cf182e1104ec5669536070cf1e3fe73c5e27edeb InvalidSignature = 37a413f9202591b8860cd9d68515ab522ae800e9a71793b479f1fb74ab8c9b07e72fe82dabe1189d028b813610e5e57c055af2d32837551fdb0cd93d7669a3c02a14c460f4c92136a4d11cfb7dcc76401bb5b699fbc64d302736d68c3591ecd59220107cd63f55c83edd38c4568e6f7749c0d9baebfb7c8ae1bf2179101745a9 InvalidSignature = 9fa8aac224bb50697103d457e7fc870853b23670ee5b8c7395d68ed82b30db18ae34a569abdcdf19238ffca8f5e435327dbe605bdc1a6dd3eaa3c2beb33f00642984a2034bf3b3e8de3ec7009e35069d5b27253c4aadcb4f163148e157252e3b9334abb6cf0299161c12908529f52de9416ec6218af7a6963fcc987c5024ea71 InvalidSignature = 0f50bc6b1b94aeb6805dee51c92860693de47c4925ab90b57a46e0485a9afeed45083eade73bee684cd07048e632d1dd24aa2efc42c1f85e4fd7b7058dbeafb53a3d5b1cb1e7dded3352c3c92ded891839263a501afaa78fedfd04546c43d16f7a52b800abc9ab1ef827ae0eb19d9b52def2435f1477a48dff61800b4db830e4 InvalidSignature = 03aadd447f36952dfe73ae89e5c656b7d37ec92535e547cca62a7747f3831f2f613c7dc094f3d5c4c6b9e02b21ed4626930ef3948b42ed41f4cf468d2474acadf1c75599c5619e4872e6d3dfd93abe92234165135ed265e0c0f64fddf23e50c1f9fdcede8778a8ca008ab00f8afa887da3f4699df9f1140953232f36d035b03f InvalidSignature = 31afd9a0d827755352b16de04de42e98a8c72f08919ed475530a00c762b8a03bde22634dd856a7eede4b4947d780cb3efe55775e16d7f46f209dbcb5569b2d9469cc271aa850f74960f7c741928055925349821e32e1e0fe5a040010a39a4b6a343f7f35c204106b3617e528a99dcaea8a93766adcfe7be31cdb98f7f7f14669 InvalidSignature = 16ac0aa2d727ef5fbf0305259ee6fa40827c92419f819673fd64cc2dc2dbfe7ce1cfcf06e26d45f59cb3d9afd30d7a6265863fe856e0a0b1b9508b1e7a2dfb0f87f5ebfc444bbdae504abde7daa33bffb991551940df682c8e2c45edef0563b34d4f11e1955e83c2145ee321165517d1532abd64dc613a280fc30670bba1f898 InvalidSignature = 0fe0c75dae62462e66e7277b03c9113727419f7d4db7b2a567c0c189fb6328e1f73d5d44e2196b436f4c2f0f12950d419774c8a51c55f9b2217f904c4f03d5f5754174719dfb85f62795ef75e6d54e703bf231fd8472250f529f85294f29f6c5653ef585079c3b3d8f931da80a46c8afeef37696fb0e7986d413bb1996b8ad57 InvalidSignature = 9ef993e6ccf015b0b0de75b51213a1c3efcaf66bf83655287484ef28d984806226a7af1704fa6a7fc02984b44449f83ae24761021e49ba6117505c1e609406b002215de27d696643c3354fb48e6c64e7300944edaeb96e4872275f75532f5aab94358d4954522fc7903439e99223d8124e79a3f519050b6b576b77d5abe7c3e3 InvalidSignature = 97c602416f2131d34f2a57acecf26365a30c12f77e5beac095533848ce227302092c6f44b47f011d6eb0a91f8024d1935d8bb274c42b57875115a94281fd3cb198f9334758d3200c1c721f6babef332c02a89968a7089f7783993bdd54f809f8372437798d2364040c1faabfb00faabf28cd6ae4ffea29ae2c08a6a7e6074700 InvalidSignature = 2a970dc291a1dc935cca6985dda703bcc1ece2e40817ce8fa79b6e8fe84e113686e6e65570d46bf22147bcbc389cb5f86f92dc185f556d15e7614cef119fcd7305a31fd2f8710812f35f9f0bd8a1a6e5be3163de644370c67181b7575635dfb9f717f78631d62db714b2a19cea7079ff13c8926ae0c601e4befb6541b02a7e20 InvalidSignature = 6e16d110235cd11e32b114ca9dac0cd6a1b041a6d2c61941d49bb458241281f62a4e2b1bf3cebc3e67e8c062ec67a51a599a553b09732e23e1d09fb2b20be7fd311a7122414d535651718a1421d4239276c227b96506729a09e3ff2779dd1c79de4d402623039b826e2bb4d26d1b56775fce14ed0203a9ebd8f042d981705a77 InvalidSignature = 0716d252488e08f10a25cec94714e6105bd4e13ff019431190864cb0f4378d315f4bd0fdf186e1f2d45a6e97eb04fb2013273e178ce4f82a0b67bf9d021b1d8ab73d753adf2073ee1ad6190b2163139db63778a3670b7cce23f45efb601bd59644a431cbe534ecdf4c4c58ed02ed03863ee32d296b5736c010305fec655b1a44 InvalidSignature = 03e52a2ed638bfb9184a0ee3698502af3a19bb959a984957de5101e6f7a62cccc2ec2a6293fa9d76fabf3ce7e4bf35c65a5f864bc003686a1e05b57c5af6ad588e05a5225479422d7b78c5bedddaec7f4b8c1e9ab7478c1ee253847324e025434b76a01b82a40123ab31ec9862c6016885dc6cbfe97801503369fd3688bdaaf8 InvalidSignature = 5df1c4a701c6fc1f2daf6f4538f29c3452667424c05edcbdaba4a1678c8b5bc0e89656a0e48aef46642e0bb597813688904e9d74cbd377a3d9d2c965bd3ed06f136f10367ea3eecf89a97508389448a31ae0e79ed3725d0c4e99a516daa4116479bc53da5d7c2f26c7ec6310d4cb4174bb781405630a9b1c147b0e1da3a7faf9 InvalidSignature = 3e43837b92ebe4df08586fced3dce46aeb2fdb6ec2bd0c58e823f6e6363b9b676786929d13ede60a8d8d0daaf71f0de8880ed0fdac8706eb2f324394145818b641d1049cc7552bc6273d86e901099c78297381faec5c518fb6de429700f3bbfef76cdecbb60088b9f2a77d75b8ff86f06cf23850e3183a267c0ea34f4f839015 InvalidSignature = 26d20fecdcf0b7d6a0472754aecbe115c39d580ce9d78b67d1a6395aa6ce6689bf6d0d96545341fbf04956a48c47f7d30bda017acb1d8e24ce596aacd3e05b1afa571d19f5316142557f765e4c5d080bc5336b79e2c02d8833d076ac9d7794ffbe85c66d0db97e1f5bd2ecb46afb15c19a8fe083fa593420e996a483c2a3a766 InvalidSignature = 1163082ba8d48352df7eab96a0067539faff24374a630aa4393461a0aac716606625d706699dfc22cf3aff89fcc278f83a0adac87aa0bf192dd86a97031515de1933a23849478ebed20e4203abfb47345bc18f38da5d45e829997b10107c536999b2ce10b2781e1db03e10cc2bdbc2e0ff4c3db5d271ce83c1e7e267e7c1e107 InvalidSignature = 0ded592bef1fa809841e0d7365e66af12f4239be0928656e7c49a043b9f2b18b9bd2dfe93a810c6e6c8ae6cb8a5c9d6e9d39a96a10b3bbdb92a7b8f575c2db4841c1b628160f956f54e0c58d3b6fd4d640b0a06d39476daba7be04b63a75f38bbf7517d9751d2b12d2dc00e44de7263275dce6b0c0af65d3c04878d6fc1be2ac InvalidSignature = 95a42e5d9bd9ad5a8579444e8167bdecec16116a7900117b298c82d5560f1d16e9fbe963764727fef9111f2465e66177b576bdb8c70a58e3df6ff69edd2d6827c97d626b09c24cc49f223cd5d2db2916c54fd8f2ac7301723449b1823f2ff48c56849f7d608312d4bb7a97f90ba218f99cb773fba0a34909618f5d25854d7687 InvalidSignature = 2344c598a8905b350f20de5cf0cee60253729a54be45b0b19acc109ac15862efab2e7c96e92bc990ed6959a40d725c24c25c8d223a46f490905c1448d8dbf7c9c427bc2e896bdce6d2c1daabdc93ce177f9525ac69d899bded12443338834a16d885456057461740c5140cb9a89a017851f9e99e38c1727fe5ccad9a7a8709d6 InvalidSignature = a08cbe4009080f73cef03116ea949d1dbacce7025f7f61040fb4e052754d5b2d74c2dd06c0dfe1d09b97aa5739c809bec6d8cb27e852e9fef353bfa32964b99495a6dc63d6ce77460ac280c74c0cabdef794f74930f7f8827af1c6690d22ec2df3af497837bbe900a890e3feeaca2c0d16b0017155390ff0396a35ecb62b5992 InvalidSignature = 500df36bd7d0b56642e2d5dab6e4ec0b148e7b8673cfab40e45c5dad5efc469b3321ce027a3a7ff5689366a18a32267d161a1266491b055f11557c35bd0d4f43df11b8a26f7b13c54be423b87b30b1dca956151c3ec3df03b30918a413179b0e064bf434736b323408e3f1330743c8bdbbb9d466dc1e21710c12e2e3b638b172 InvalidSignature = 11a382fe570e0cfeb515955b70ec89a9353cda0c5a5d3cfa3e16e41340eccaa18ba21ad87c4a54a7131c4a7cf9afed68b1c1645568bab9b0fe7dfe0437abbe1fb6cf06bb690f46aa2eca034093ded661c38954341f3f35abe484015150307ecafd06d4309836771dfe29bfe56350d68725e0cd02b1479c6f99eeba2d59f40626 InvalidSignature = 110f3f188df46da58cdd46b5d460ba3d2f8d00d907289634d52a3ce693eb232cd6db738c48c8aa22d923d4f81d55925b3d4ff29ad9869f97a244d37b860cbd4646c6318c041729a7aaf473b61a93cccd62fe223d1be00364f03d722f43c7beff98c3fde573e7e6a0ce7d4a2a4bcf279765e29769bd4f884ce41fb808ac3d541a InvalidSignature = 470416ee76f0bbdbd2812b533813e4463b799f4036e6955f3e174f6287e3c73d57c32875607e2eaf06d612cc85170ba5df31286edb645ae9ceb9e62064050f3e7f6b36fe8fdae7a3bd89b6acc523c923b9d3f3e5f57d80c9100b39dde75caf46adcae56668149ce0b80762bc459ac598241dd79c6b4fe0220ad53e3c591243fe InvalidSignature = 100714ee0d38c541c2632e96885a7ce0afcb22f0cbd84c556f19d1b44bce75a8fdf141e975dda1812b4465050d4615a51c3b9816606c7ac88d6b684df938e7a8852835dcf5bf0ee45f2e413290691832095af77eef0e7a86f72167dbb03758e68561f7f06afc6e902ba19fad57e00cb43c0fb2a5ead689a146c79c9e6188bd85 InvalidSignature = 44eaf5ded57ac5c25c17eb31c2e071400b46b9022641347b2edb0b14efbd4eac5f71e4bfbe791e164c003667387e57ae22c6b00e69971d7245e381f6459e5f88d9dc0fdb385b777fe99e5e4d79aec057e41a1e457fe2b91a5f4a8878d2eaa1c3ad8393d281eca07ebd287364a19045029fa7ed0e62a21e5e42a88a52ea4abc8b InvalidSignature = 654b1ba6cd1b13e112c5bbcbae8ea2094a1c6f8c6bb73c9225688aa93fc0e8d326e411bdf2bb8de3951b2f55ccb19d4880a93ed1519021ee8bef1b04997a31e53586c56587e3554bec3c606125ce719b96223fca2b55bed5560ff51ad4ef8018d648cd1f4c6354e0fb920fcda79ef68d51d7ef16ec93e74aee9ae4ba1f9f00e7 InvalidSignature = 04aa2d0bb7edcbad611d49a58b687bf4d0e7e81ce8c05def3f61fb7f5041706b61fcffb3fcdc839b3957a64999a3c800449df841c5a6d5af4ab03b6271a0d573cea8d8c23ba9db1f5d81ad3b58998c56193ea2445a2f0dad9cc0b91d853ab984436b698d31d1caf62c59009750d2395d875811d3919bb8ebac3eb65e0c19e34c InvalidSignature = 4bd7c5fde38919661cf5784ed09aa3abebf7c16b8a70c3ebbff8f8727cefb3d2532229adefbb7432e38b1cc13fdd2c05202e8f3d1b669256ef34e4c2f091d724e06e019104c0656bf3bea6bc604e4343ff6fd7eabd29a33ff8391ab4b761bbf83141fc12c6ffece32d3623a01d0dfba0dbcc0eedcb042cf33d915cbc41ddb1d8 InvalidSignature = 441c9007aeac4adb44dfeca1e583e31e3bf948eaabb7864882a6f178f8f6d5abfe4faed96df55f71652761512223eea64b571735500379e2f8b5d92c1c9a95a0276edda1f9902b8a3dc6941e2a09ce5a382c29fd4d4688efe0d532b6430bf0a2bd86d28832da4f6e4c2013e31267406b44f60d39d4e21049e25ff7beada5c2e5 InvalidSignature = 3a95f36a85061148ac22700478bcbe609b6148abadac9f4e53e24ab9aa2c712a3fa6a869cce665de06b0049959529c888145f9468d245c1098b2cfa74ca99e3b2de839e8a1cd3b3ca5a56e9b9d047ba758301ec42f39af26e3c514a9436115f9a446f8f6ec11351ed5234eb63dbc0ea434119042fd0c929d0f54591e1899c0e0 InvalidSignature = 4531b3c930bce54375573269f91d5c2decaf35ff71b27938abc4ded9c1eb77c1244af6d660ad21d1cb224f2f8b791e331597b0a8591844e5c292024cc4994dda105e693b0b29642090b502aaa44e3adab3308a66167e2313b8c6dc5a63777959be1730d69bef6c0e8116898f4fcc05611af94d5e37ed4ae6e7275c40ab4a47d9 InvalidSignature = 0c783603c7af53df27538b983fb7368e9f62d4552f008f2920a21cff3186d2ac7de451fe8c28b71d38c657c41c79174c84004deffc69e69cebf2aba2a43ccbf052f6fbdc3c9d3683275913c4583dced686291bd1c0217a015d9ce732eb410c8b27f2fa7c9ff516a81577490f5bffc8121c7ac674caa464956942786c5dca6b4d InvalidSignature = 1fb1960934683292a4c92cf3d582cd5fe68888a5b0f6c2e64538289da7f96a9efcc36bdbf1fdc0cc0b3b36c6af608309de58c6151112f3a78599ade4a718b359547a4cac9a020e5e7e7117d1bfeb3ec21bfe9732825e624b27ddf8a946eb858b30461706f769a54b0478e0753388951d98129383590186b80836608f7e06c72f InvalidSignature = 7e4f953b288c20fd5bec56a00745db9be03590efcb637e2ce2119a0a1846e9f38c0ebc5f2498ebde6217d81c9939b6d6a6f35ba54ee50d6313d3f2579751e7ae8d31ef4b0e99ca2e96c80459a7e5ff51f6f31e9c965be19097de13017c90037aa482d197c986f50bf2d5e1acb3f3024605e46d963410a4a623c898d0d773a78e InvalidSignature = 03e121f5766771a65a400b354f78ca27c9a04a25d4ab80fcd6ee91bbca3baf27752abe5cfb7959779644c064bdbaede14847fc035a3a19523d83cae3c31a64ef7538805e398e196ed8ee9ef6b3f58f10e7e16c95495f82ba430e5d997d16556444bb1447ebb17829ab879e61ac297ebfd4b94aa99b68b0b498d8e434d4fb3c6b InvalidSignature = 90a5d10e2e19f7e016d5126a3d3eb91432611ebfd411b07a4be15aa48c39df33f3a2855f1e150ad34c7f83973bd73eca6575dcbac4086aa0a38db3d6e6ee2e9f419768493fb4829f1f6d67f80359f82d95483d6057de17fd388ae46687c429dea4d9f7a286c95fb1b9df0f1ba40a4263307789952b1bd07cdcb3b5cef10d9d2e InvalidSignature = a88d38e8c765b7e439f42294e71c1689a318ed5414efdf474196989829d4989fce8910798f4d7873fb43d3a501fa15c8019813104e4699597246db66f96c838e45aa3596a1d26cbe9f6ee91c077422953b402f7e11f8768a2f132295bff79a0d10ab843cbcf2c921113992336638f4052446f52815328ba4946510a6b701d448 InvalidSignature = 34508ce63c502b3f8185f7cc61c724185aab2c1bac68cf2a7e7f4234edcc0e38cd15f73e73d02431c62c28a2241f629382ac5e9329ab71dd7e9152b10bf86b550c855aade6a5941ffacafb4bfd57066bd6e39bd0d8ecf57ad9a6f3ba48831800bd8e6e9773a0ba3770cfb9ae329bb4451f450ee35796b5578104b7ff5ae2dc31 InvalidSignature = 7f642b5702c331dd76b7ff66578a2c0547d91c556b7b9751443d911729fb5ce8426515ba068e2839cfdc956eb813c25d65a2d5213b59302c0ed5e6fb95c49002edb1605f8f622912fdc309d92e6e3f188ba19e991fab0a7018ae4f6e70927d91cffec51b2dcc8113908faa1173ec9ed72350aa93a8cadef8bfa7305bae22bdf9 InvalidSignature = 0abb75f2fac084da0b99bc823c021c4872e23302a6a25e400b6f25d60f7c903899a69dc548676106b44f37c1e6d2604eb995a16880a2a8e2cc9e0ccb2b984ae482036f69a6ad31a2b5836e73e0d30c3e10f8b93c7587d7c0f2371183edc3b8cd0fd7bc325b1cf75e1079f8d6df53fe495722cc1ce707cca49bc6f4ed2ca6c4f9 InvalidSignature = 3507fbbb0ae37992789b22c27dc2b5ecc6c3a2cd555ca9049388e1b0c84c14c4f3a98d14d7f80ab79d68d2ea140ceb7967171cd153039e98c703b4ce434a37aa6ec7e13f06a76ae3a49057394393e20dff96b5157fddbb39faa094b4598c41fda2410510490c54e5184264e74ed7a734cee0d5c536ce68f76509447ebccacea7 InvalidSignature = 5edc1fd6fd901165dce272e6c5d4ed3fae7917d28aafa278c5bc5eb71a5b467100b9f3afe956e1d61ba2a3936bde573f92096c4500e62d49479f51b0350a3586fbf216f56b23cd598118f6ee26cbaea2ba3dc373a0cb789a8a2da057075f063c703b12e772e35db546ce0ea3a803d61d2623bea3f1d31e80f8f5b4b410d70677 InvalidSignature = 493eb9e477f0a6e8e92c8c8b10e2817c3f6061248c3ce16347eb21c35dd41906add2d69f5cf6023725e9dd5183bba8d2bbf7be5899c84ec089472477ac016d18bdbc04ef27d05c6c21867bae6adba66f1336b5c8944b06a64558982fd07d51edcc4efc4d1f01542094e6dce82a063da4a68aa92afed00d3ace9a9bedea086c61 InvalidSignature = a173341d877e70d384521f1832878599bb93e457cf78b0984f130b9af16ad90d0ed8c58f8651d05aed66f359bd20022fd71139880ec7b3896206e662bd96ba49f9976e0170884a5726dc097ba3c66227b058a9189b7868259f71b507253761b5d634abc8dd27c6bdde54e1062252bd0a1e4aa829886ca778a3f914174094a81b InvalidSignature = 0775598491297eb9004eed66234ded82e047ea2f06837425e6bd27f33b1373667f3ff4961d60f85edede88ec2bba2680151da3763f0df9785b31771da7e643862ff9ba944ab54bb1356ee113e420002a873f1eb381660f3eb84b1d6b25ccb8b82ad12ad0a449c4de205144873329e80ae8a84d1d3c1660b3303cbef28b48a553 InvalidSignature = a73df043d06ae53a37773016a4e21d3f1093c50e079b189c4bd7db3e2e9875b14e5374cb8e7394a9f1b45c7e4e9dd516198bf5055b30ea4d205f39fddaab3da0cec63524bdae2ae166a3874c59057d93855d6e6314fc5da8111ff58666a73c00a105311859f27d2fb92f507531b9d681e219861e4f0b2b979c185af2690eb4f7 InvalidSignature = 17e5a889b8139593e192f7af684c918f2751f157214863f88984ff3d8c9e381d1bee5ee788fc82869f4c3d8483e3c17c873a850a7a5c85e4518cbd8531b331a308a0368a868bb7995ce0f8a7ac5ba53b88c31c958dfabb36ed461472505b598418185b864f381342c29dc80e55ca7c2095e7788e7e8d385d61de605f74e431b9 InvalidSignature = a659f7c44e4589e9f6658b0b57e82e65d5ee9fbe2376894f558a7ca4b6e3c5032f953d1dccfb9b76bbc53dd5d1a52cfc092c6ca279b37c0a43c99ec0553d7ef4d9bf9361a1c4a3fb7496aa58c0af518312e18819fffdafd1a230a38440a6fbb0e69babaa977b8b5fe08ed7c6d59c0391ccd80b42a0c0102264b0ed6af8524e9e InvalidSignature = 83fd4599a47bc0852ee1a12b2d97fceae6d8442fd089df1d21ecc252a410982410bbd2cc6bbca219502c2934ac593a09beefdeb54b0692b3e5724b79b0f5c53541b62b0c4bf80a658af71d5964fc6a1fd7823370d00e24dcead4bdc86bcd883fe3f48dc7f8468ce99b7580306007021b68b48ace274e3c09a1b5e21fc7542ef0 InvalidSignature = 4bab6fc6948143f8ec7c8ad86a0c5cda5bd8151c24ca7916857778729c882581603363fde0ae2a28b6f8f2c8ce8d5f6b6e731bf8ef735bd31318069544295b54b04ff2abd1e11900373931164586d7c830bae704f7314eebf1d32b3a171274ed456e335d2a0b998ac441053ef096a037bfa6e5cdf3835c45ede383f0ee8feeec InvalidSignature = 5770bbbb883f93f7c29bdab32e496f2e9063110fe648705fd0b1dc927052fc9ace9b36d898d19cd4f862b777b7c790d767b8313f735ff567c34cfb31f29644540645beea182cabdf789ff9ac3f68cc20444af0b9d4ec0bc8992945063fdb733cccef7590a10bdf491bc21c38f25ff65a581b40343e30529c3dbb71f62189ba3f InvalidSignature = 359dfbf40d3c2383f58bef1d518abe9852ca80d797393e4e1a9380ef08aa851d585213e8897c6f701ab680b0f63ccf5ea4216331918ca9a984fb6ba549f4bd066ec1fc4f1ed053fa5658b01df674a21322ba7e21fba6cbb3a8eb5565fb7bc269f99c65981efa650dde613ccd6d3927cdae45922d94dcf7ca5188bf5acf84035f InvalidSignature = 24a61067121e9b4363b816b7c5750584c23f3c3200ca929fdedbe95d7504c56ea7dffd762074e44e96e22147943f2b704003967270b2be1bd1baadc3861c4cae91bd41530c67220349db4481d324d9927d52fe85618ddab2598996c5813f3299e1afb020b24003fa94f94a0c6c02b3183295e0de79eda021dccc5539cd7874ce InvalidSignature = 11b8d1dc2fa2afbc32f048d7454ba032b432a2ecd438506aa72c697a5c118e9e231a0c6b6340b5564402b7e837c59dd36f726fd626621b8f543964198484087eded70e7bb1dd63df2cea33198b9d02dd28e3b8bd006ba991a8b3bf06ac928bef45cba2362f2e11a5fbfb0310e84e8b7ba1e17c315adc1f34519134c36689619d InvalidSignature = 8748f029d5294dc917cf4fb347e0046f903c088fd976ca97b1322738549df7c56cd67349d66596338fe418b29de9e8af8872fcdbb55e1a6f74e9965fe7a365b846b667d0ae50df23083be73cceb59db545a3e1a560f6ce0e9eaee57b5f95b8487a3987c00f364d0f148ead6d7e6a37b05456b913b7a79c0547b80da2a2893881 InvalidSignature = 2bfc087003f3b98f0c8c5273de34f5e4d5047e909cd80e222072f6a7926ced5ae169131342640f2be11bde2f7565c3c63d0335614dd278915514de8421f4521f0138109a5c9778f86647b8a42815b6b861f173f5a6df893873f99c5e62bc3c086150e3b7d7abb943ecbe5806068abc433e9052d9bdfa19a58d19da463dbf3b23 InvalidSignature = 0fe03eea6c50ab664bebc7d64346762aa29b08b61f2877973cd543c9533c9d0451db8d836eb46e8d64283306efd7ef6387cdc3c794f7474f2e7d51b9df078095adc85fb810cae52434c9cee5048fbff72610778397fd83204f44bb87f7637373d111dd16e18287bd9ffe816683bc3663f586082fe0811ff6a06c0264b67f7716 InvalidSignature = 748b9e64195314003ca31f726bb3d3294abd8eb376365acc5b1cd36934bbe1a9bae99ceb7c1a40c910bca6007ced7961ecc9ac74c7a6424cc87b6b9610320ab9c5b527d986c6e8ed21e677bbe2ee7752e2dbcfceecc2dd6da3f6c6b9c81435e9e060dcd67ba834729761dfc9570b79bb1b8ead7bc1325c2233e445eeed12dcad InvalidSignature = 7379bc96dd40d37a7f8e58f87c10fb94f250a964a55b2abead479b368e60e442e6eb864952308eb45eef1d318b6a5ffce634fcb886dbfa062060b9809cf89a09a26fd334ca22a1917fd219900ec0c68164c308cb9cbca3fb2b89ed8637c5540f7a5886ab1e52c503e20edd6316e41c746e53917e107ef5308590800ad378ac97 InvalidSignature = 4a2478918565be6b46fe61e5f66cd1befb7a3026b5a1502e9a42636b0b924a02e85d7ffdfd8671b1d6d3e604e3ac6a5302db4e0ae0975d0661efa018d6ba0c632a6381368dcb75926542c74823a8c6d8732619764d5a61062fb3b17ae243bd691c97c8f9821af9526abcb522ec8e9dca32de1989e576e336af9dddc3e766541b InvalidSignature = 5ec392c91cc165ae59013337e7f7d5f2f9b3a6d45b6f6beee6dbf93e7b9607900f4672555a57de6e9e1aee1fc9b7adfc0dc00e122e84b0233c0d615dd0d79764fdc9d1b0e541f2de0083ab479f313a07f55f51390d1c2274858b219b1ec0601b82a2f7648ae95ec17099067a173e3e83959b6c06f149af0e4610761aab5be1a5 InvalidSignature = 6173aef07a7057c3e97f6b7d4d7266918876f9fad86000b4c8ec7f83ee491563115b0cb5d580df8c97feb0d95866eabb79147926f5395c5189554749f4a2c75c0d96325971635be029062e1f27536c5041bb42f42e1fa10e21bb8e9a2e2502f2a7299dfe3bd8720ecb8a57238056ab0eb546de8dc0e56b317c73ab1e19772596 InvalidSignature = 3b80c72f3b7ada8b38b30527bca41180b4a89b066f44a17b9df5963dca46517d9160326afee7a34b650b9e7746e764958ce6a0a6268481a8df40e0a95a81ab0f0bd20c050becfc0c4b03ebda19749a4a1dd3ce925fafd9a4006a835eedf221a6ceab6aac6bc74f743fe171ef8c01935f8901e1ec9ff6e33ae8311851fa14a65e InvalidSignature = 4b0eaf3ae1c7a3322dcfabee0569aaafba51e0f34fa6afc325bacc853ccd2daa3dca56c918325bf553af02ddd19fb597c368dd18892d52d9e935dc51d38347ebae2a7f90c78504355f6899ab4452d5f51d2025381d81042a08582dc50bc1078246ee69652043bb747969a7450659e333193990f34a8ce3f036221193e700489c InvalidSignature = 1fe7b390bcbd5bc1904e676111653e14e581e7817b45294bb790e4e62f3010aaaa77e246b29729f2b7da65a2f437b8d9c4fe3b26baad367a19fd7b1758d04c2f788c45e5309a833522b46d7255dd5ef70ed006ef966aa7c648bd0b893b8e1566961c16e9554fb729ec81819f1b3da890d413a153f487c030c7581da9531bf134 InvalidSignature = 317379f37cb7f21fd03259a27db3575d491a248df82e67b39d4956a1c619094fcde001544f0fa70c64dc0d0440fb21d2860a20a911cbb397792bf3eafa5cc050e78b1e7bb29d041cfa0287bdf54a90a7a8bff5c870e898fe34bb522477daf8e003bc22891b789ff215869cceb92610c4b03210d19506058d941e6fce7a3cd786 InvalidSignature = 2de802ddacb7e47e27875943d5098419bca3b170bf74f1c4b4a8ac420d4469d9aea97592fbeaaa1dcb5fd20bb97afc5f7abae17a9bb85c5490db97010c5217c88f9f52b5e209cf5fba5f0594f4e4450114dd0348ece336870a1333f7660caf959056ba13b77d35239eea164ddbc8808f8e7e1beb070f551b6e95f90d5bdbd925 InvalidSignature = 24fa27f7c532f1d58d98309957a42eb0be15acc0038c3a012b3d5a7ff7e0d13b696f16fb8eac88ddead2a40a9686ca361fd72afbe4dbe4b3ae6d9ba390564723dff0f45fde7db6ebb83bc16573ef2d21f51689a7ad4b8edfbaea1f0674e438680c6ab19cb5a1fe2e90a7082a6217f0f453ba25933b25a7cc65e8562bc78e4fc3 InvalidSignature = 1a9fe9f10dcf04f35187f5298448adf2f48ce7f0e556d699a42f721289f0439048527c3fe0751bc871fd7afb3d70771c048f5b319a40154451e3a3336cc6169b73ec5dac98b8f57710b12bf81cdf07228483e66a38f543ea03f9480875eb9b0d27d5fb7d53c43106935de0e416dde4cdd33667d730b71e30a63cfa86d3f9de11 InvalidSignature = 3ad3e4ec3636b5eb8aac2161c04d228491ca0d9da2abd69d8904054373940b39b5c025c011c9b9508a25ec25b24a0837cdd6a27cb5c8ba3683d90ba5912ede9a21f2f7e851dc49dfebea8807576be703a6a87ca44c370db76812b9929a54fb8e2259453ccaf47da1b8ddc5b7322c20197604b9e028ec00bd7eb48012274d5b81 InvalidSignature = 778d93be708d56defbb6dedcfec2a917a3772b2810e26143db1f9d0f26c4fbb8de8db5818aa32ebb2cdcd7960e593ace2c3c3eb682c930cbffcfa6b34438ee2a786a9707d5d10902f7f4d8fc677106275fcb6cb08f56f341e0f52af590e0bdfa2f2bf95693265e87f5046bcf3e6de34810e8eaa479f3afa2b0a98b175007c209 InvalidSignature = a3e0e0cb9f7cdf8a2b95139f7c475f274bb63252385f62e66f82158f429e74d83df9ab1040717d34b6a5e009b6ac95960826ee83bb298ecf900425ff03a8f156053b57eac6086d61dd3a8085b84c83bebbe3270164e3147ddee8966a026796401fa48da70f5d949386eccad26b0016543f3f90c8ac2874100dce13f03845509c InvalidSignature = 84345c9d3de7b5da2156d3669a731c4baf6726c4c231bc8bcaef950d7ac37ca8d86e9c9558404f313de3fdf09024d25491b0a933cc3958033210b1c4f90070ddd083005873762566ff2cd7f6915b4cb430f5e7e1bca8c2ec32b4ddee48aba667f9d614a27c3bb40c6cb7f0cd77d3d17257f197974d1871cc09c9583cc6af8e15 InvalidSignature = 227aaebca262d2189c479ab46d8715a34100bc1975c2d3991a4ade27376f068756cc9d89e903713bc28394d202d81b32126d7eb09154261841227cba6ea0a60d0ed9302f816fb4dd241dcd2d746d5c1b068c42c0b2bd567ef799cbfd0a83e8a30c4fa2f7296dceca38c36ab597ba992f658ef7955d32d38847870afbca35d836 InvalidSignature = a4316d438c7091b3bd5ec09aeea9095cb5046d8f08642b087c34985c34377bdafe74285d00862fba20572ce7a06dfe62b4fc08704d1cfb161cd88478e7e1c5451e0bdcce0fdd83c0e37fba5168ae03fcf4ccf60fa12c9b0acb39fe99b06933b9e0774f41151e0564ef805144c0cb76101672c287912197155d91bf036e84d1ce InvalidSignature = 361f80a57ddb48796e50b3e6467cb00a9e1e193330ecd2cd6a31f649b49eac27e295450efe03e09e59f1829cc661d36b0fe904602c644aad7ec8cb2ca3099078b6d4f7b9233dc159fd1a6189451fedbd176e436f6605f2b889fc7197ebb520accd7f90e543da44453c7ba1948e83e31f5907d1989d982acbb348ca2216fe050d InvalidSignature = 674c01596bf71fccd36aa81b000be007f6cff713e5f6ffe58b25e790f9a1f6542ba3f68e1eeaf1bb1ac6c3d55aeaf08140f6cc3d0474f6bd87ee442568346553ceb34efb5301a4d3a5b3f28a5fb038ccfe8444524d18adfa042aa1685fc3a5f9005da5688853b8660ba74f0e32c5be38c743b0048ca9b9fc19a35a5ff4e2c48f InvalidSignature = 07ba2b5d519b1f60dc455d6ad90b4135cb45c5da5a2a2c9b8cb954165394a0f40145ebf2b1a3ff1d47f5031d542d25041fe9b6d78aab623c40eedcd8467618168ad02af8a696573c5c63cae0b2c26583b0240848d663fdd0195322bc2c8dbf9b5db2ff9cc3e75e70480e51da0d6dd402fa87772ddef5256467205cf41a42d18a InvalidSignature = 9fd302307455d4e946c1ccee65b0941c3550c823279cc52c4f29ecff72a12ac40ef6b7e37b7dd774b7735bbae89b0792908bafc47f0b0a11637042fc8541b346151bdadc3990e64b6d1807dd0e7f9266ceb3f686a9813341f835562d3c8c84868a1f98db97d3e695ce4a25fce80b828d010d6323120362ac48700abff8a7116e InvalidSignature = 247aa1cb69ccb72795c93809d7c3a5e52de98ec5285196058a6ab18ec2f5d9fef5545ab5df923f63bd58f5f247b3d824bf161bcb56d325d4e2fc7eb3765dd81b5580422abf2a3bca8d8af94cf6a9a3133b1494f66d5cbe938d30b9308b5ce2cc6d3df37d3299b6a7616d40afcc7935d80225e1a89a7a63ebff13a66e21280a6a InvalidSignature = 6d6248f823020a9604bbafe5acc103d9bd020624585c95805533de22afa3b6b1b511f8805296ee4d3e96d707c91e55df8959464ddb6d6a3d62b1cb248754302b2833406300f4975d913f1b90f95e3673e2c57d6181d73a360e8c818b8a9dd1e7a4fdcd68683f11dd47c2d395f20b0ce9c59eede6ae6aa58a707c4ea8d1a73a9a InvalidSignature = 941d41c39aa8bf3879d16cb78c5486589e7b97e56a0249c4f613060d26b786598fd2d34bc4e99cc8888137975937307d6a328059a09f3b994bf955c7de4a2841a0d10bbbebb2db3b332656f258c66c8d50cf9155ba94e1cb21a78e6147af76958ddd997665b6d8f67ea8f5e1fdbebd7df635f20494489c895d33ae4c7f248bad InvalidSignature = a32afeafa2c3b58bef55776ef6daaac6647485dde100d968e0449d1a2d5a121807ca2fdd70e2e9cf524cae4f263e11837000df85f0886b718ff45cd316c8d031b746dabfb956dd6118a37e0dabcda1ce9c728afd9a5f2448f5b15d27982218888d457752485119f53219315bf63141c9c0802327226a096403ece022cb27c0df InvalidSignature = 6098a732419cd71887548ccf4fbf3edeaf9fe7b220bd747ae1b995b746de1f4d7b48c73ddb71903f50ccf7c93be9c8219de5a75ecc302ab50356069dfaf642f32ec580a283519fbcf04784860b0660174dfb7e1e527bb320960bde8f6c605bc3c1055b878d2adbb44e1b6c41add15cb603345c4fe2d1c0158fa03f21b4c015e0 InvalidSignature = 2f08cdca4d621007acd15b1f4e3c39882a8aef706878e8f101e7fb250798a3528dcbf4d3327ceb0754a2ca0850794094dde8a875cb947d624d386ddb9593259c53ef2311260ac3c9cd1277050ec98d105188f590f198ba908ddcf3f9ed18f5a96cc6b353fadde007658f87ff4c201db7621d69c8278305f3e9f2041a2dddfad0 InvalidSignature = 10078ea73abb9bbb879c9d8139b1758170fb73b34f39cdc83e6a725439e315a5cba4421fe15e8c80d8fda0a9aba9a12c23aab41f7328d4191e6c7c3a53a505ab518dce078439347945671ab06a2cd5375457b3bf181c40a1a4be1ea8305c9a401488532c7cdc1150fb9c46a2e846ce4a2fd9ee863d0b0b8af7f10360acc47f10 InvalidSignature = 69a74665f61787b54b522937c534e95e91917f5dd4fa9e3472add6e21dc033a275408f35c71ff6cc029e25986fe6dced8ed053a9040aac32fc444e9252d2bd4081fe3e51ace15a0f694c0b8953dd6afa7f8cac67f4d8e17513b415c14b439a634274893885907e2ea428a6e242154a58a031fedae31c73df7cd4e2f5591496cb InvalidSignature = 8f3b544724810d462cc9b19f356e61efe7c192dd63511a9f1f63286ca81f89477c2b464f8e51a97ee138dcf8c6709d79a78591081384af7cb5e182c9867b826013e6191efddddcc39909d3ffbb18944503b69d774c959831a8092f4790a4933521100c3e9741c3b58e1d24b75425ee28fde4e40c249b4dccd726cb06cb9ad2e3 InvalidSignature = 3933d6937e977caac37a07a5c4ae503565af57e6c4e830004147f8bbf6784f79666d89cb4cac60e3f0aff2d5ed6a182921e490c958bfa49c86fcf0270914c102275b0878f01795c7a2f44a8a6f5306aa67a81f9294089876801503989e749d152c3e34906291f1f54bb6232fdd3d51e807f70927bf38ef70bd2ba45f0323acf2 InvalidSignature = 7b2f6581fb0b4f913ed38c0ea20dff2bd60723f2bc3f1022ceb946e48adb75b1e0be031dd8b706d82967f93c6b6ba496d8c4b49aea9970e139b18fefdce30a4ec04f77625eaca4c7d1265cebbbcf53b63a113cf06bc50e4a416a771cd28785a0075631a3ef60c9212e224aaa063e7d8109c27e248e6422b26acd02ec012b7bf3 InvalidSignature = 4dc9e86e076a395b530868d9fec9f858bd6e8c10cc1e32cae7653abb3f23991c677e970ee468c7f35022f3241f5d35673a8cf4ce9134b1e63a994dc7abc8cf4b9dbbb126b314312539931a0163c911f0234f5c3f683c9376f2ecaa3294d71a1274f6c63b84ea8faf826eacb05e4fa5459b787ff384b2cfe0f1f4c755f32b5c50 InvalidSignature = 7b4b34bc61b0576e3f940e1d5a281bde047ece50316cc111f08b7278bef71e90029db2d63b64268edbfbed464d3c3dd2b9341c8a51fdbb5bb1ea44d86366c0acbfd17515300a50195a9caf34b2b84ee641a405864a7b2b91ed452052f114459a316d6afa8e93134e655c0d8befffe5fcf4d48c9e43cfa593893157d6ade8d04d InvalidSignature = 8bbc9167821885a728260bf9831120ecc42c14b2b07854169c86421146367d1bec66d8c3daadd115f16a29754e7fa8fb70a63966f7838484615d4364311b6c3f6e73ecd8ced0adb52db2c374297119f5fe571bd5396529d13b7225e87db5b5b0df38e4c56f2349071b09ff5c1ded919b398d4aff38c6ae29af6f6ff99d3e8836 InvalidSignature = 8d18a5e0a81522b56eb9e4f43bee15475cdfc7881006150cc230e76028283375a13425fe5a106f2626346a65817010a5510b157b234a16fcb9426909a524a288161537be91ab13033ed296f5f8c1e5c3bdb963f12d7b5eded46106f7c2dc1ae9c451415303cb7e6a3f59809b922183b9638197909d5730e5b1e89705fbbe8464 InvalidSignature = 51640e26e8764936a7d9d709b3e0f52a5f1843453f2c6107a8e7fd6dad8b1c02ecc71659cd4134be952c03ee83c190bea4ea7260e5472c3cdf87b6ad45b5c974957ee9b4bf6f30152c2d939f722cff32e5482db96f3e283532b96716d3624daf16767e0ecdad16c97e56e4e076d64b92af329d2d6a2f8d14b59d1b84853659ab InvalidSignature = 9080bd4ac03b7ecedd45f8165360d4848bdfe1c9212ee1a4debc1aa92886cd7947a2df5435789bbb0b3e8f78815aac80e2cff14e1939e9ec32f42e7c29ed4029c88cafb64e8523dc85217c40d1bba900468a69c5bd4d12ac67401698fbffaa5159907ad459d3843e12487b3b2315c585881bc42e45543f7cf25110ab7e0a19f4 InvalidSignature = 5f66f645307346216d3ba9c3d8b29e96270cb3b2e686a676fe975c10b8c26fda8d8eb172628bb3dcd726160c13ab8c5afb1d6ae943ea4c18d00465d97c0d2bcc27a63c18457ff8d6e3f5ba373b4be7b6f4c610f83578613f4fe41a40d86230afce0bb8d4496425a5bf0a80c6b1b1e2a981cd44c31a9aa603748c3d2fd2b85478 InvalidSignature = 8ccff4ab4fd8534b6b50593f775bf6684391225adc37745e7ff25a4c4baff78a252aa1177ea3f3f09d2791da50ba19cef40ab8915379f128bba3271069cc2c02725e09f0b2cdfa0d313eba3f5a7e231588fd617b7d90b285e88a944d7d0a7fe9cc558dfe8103391ab2e6fbf762d829a55ed4486b5d888957078ffcf49e8ec352 InvalidSignature = 694b90d259b8dbe290f5851ede2ebf3bb718c1674ab1d3b7b6418e8ef7ea0760bf3ce69d98a7a3baae5aee488cddfb877972fa88ad05996879d0ce15aca53591423bf1b1b3ff02f823cdbb26bb80e3f7b83c3b7ac01ad7806335f871cd7b7e9e64708c200a9cd092589131aeb7db15655174000cf7db782bd54325ea956a1a15 InvalidSignature = 888cd9bdece5ceeef0fea92727ef1a1d996960f3f551bf108682f8103590323669ba1ab48becd14a49b87a900434d0ca7670d094b08b2f851834757bef580d2d3278d85b88036ea90d4c2a673dfafeb0c3701332c2b77493110d9b28dade7e985ec27240c90498372fc00ac8e0e5547e4d59cdd19022b8d961f3b63630b5448d InvalidSignature = 762c745262627d0df634d6cce41fb8af3cb855fc2d974b8093b035e9d11e510b9b7e7d61581b8f262fc1c4b8a6da3f6d609512e32f16416c7449c623c1773417032ddf2a559d7eb3af129fd02f83b5e35f5b5c065b1e0bc6481f38b6361f0b018b5e7166e8e67dddcf1550222f125efde241a27b0e7f670d15346dde082a8c4e InvalidSignature = 27830ed405bc9d34009ec6258b766100273b4dcf2a9b3cf6ae31029837c6e24cf6e819734c1fd10c2c23db34d227d98d3498850f083ecd78b648baccfd4647a572607dedbc2b8ab7a595c0594ece904380e7f395ba4840a81367e99275cde1064fc6f7fbd564c5f26ddd0103991ae8262eaf16623685b43f77ea7a05d080166a InvalidSignature = 4cdfa8cd615bcdefa253d75212e4ed0a1fd60841656c6a749690cb0c6c3cd723b518560c3b11a734010acf6e38f0526338351d9b58351826b360c851d3c86429f38eb689e8555aa2a23157e197faebdd29bc49f84c10dacca655cd5fa50fdec86a72f0ff1c7f8feeec31fee188fbfa72776a7b5cdae1c1506830bd3a00181b13 InvalidSignature = 024746d8dd71ecfe33cf0ad7ab8ddab9dfeb5740ec47b8ddd668f07b8f7610f726692404ac14c3a1947ff4246fe0a9e216131489125e71df68d60930fac06a20e948a3e4948aff5e3f9772155f8bd6772b1cefd8180ae719afc061e2f0d68a69769930b8d90ca4ecd6c7b20d04f0cc939502e698ad1c500403763c0205f6870d InvalidSignature = 3a152ced8b5e0efa33cd57d4afe67f31ed3b9fb22e7b0ff32795cd9510374fa09fc63a3366465f83ba4d44e36418a5c1d171b6ca05d8c74a242983d5e5912cd05bdbd75fcfd5b4eda7cadab21e6dcefca8e2ab7303871ef360beff45564a01bdc887d9e849e407c6aa5b12055647f6c9df49758d1272f7cb476f51088e21f246 InvalidSignature = 3765b8800e6ccf29544d834034e39f8fe7a2e6dfd7e6b4a8f81df091bbfd7aa17edfa6005024fe04d35c340a2215fd3f1cf4b4dfdd3c8ad09e6df2c2256c7541e19c2e80051d1ef5df5c384bfb6be88c4415eb2740db2d9fb3214890a8a0f19146dfb7897bacc02700a89139dc8fb21b2a7bbfbd43604d7f384cc00aecefb4ef InvalidSignature = 5c5b097c21ac2eb156de39d1eaebe3b96082f54b0171469a94edf7d2027ebfdebc0837f766cfefec577e7b797c7a082df2ecc826e55d39927b01c2da26f8f6814ec993e3b93ee87a3418322b65ac652b3bba6d34373a13fd40b66be489938fadf67bbda762f6ee09a1ddc41382051d4a9a946e0df832bc65b7d5dd58cc5a402b InvalidSignature = 0ede4ac9ffcb6d3d42c75cf73303a28ba6089941f68dcf392a75b071f6c149a109cab95b80a679ca3b29ae44e51c18a2db4c72211ae6b959c7f22e854c45f20f5560446f33be4819f08d981d2fb176d48039ac4acd28127d593f9e219ad40e2a5ee911b334b3b8bb290f2327524e3faae2c028745e03d58882bfe503c4ff04b2 InvalidSignature = 6c0b3edf5f6e5d3f07057d0b752e89cfdd1c289ad18a0ba94670cd36547734e2c7bb32dd49709f0f7149944c450c23b7f2d360e3602cad5ddff7fd9d711eef6dd4c32e66c4433f041fffefe112024a655bc5bacbd0914bbb2b2a41a91b1293fe9478ddca926a13e6131cc5e9b70625eac1e533ce8171a2dc7b2c4a490e966445 InvalidSignature = 1acce04e348a5c8377c54d8ddd8ec2d8c5cb9b195863c32eb716745f3462b5f249b612aefb31ba484949d0a0cb5cb8e1f06c1cec58fe5ffff6ba796218c46c3e527c7ab0c4276ccbafd133812faec33721a08542e7e3a34449bebbb28bd0f28994c6801ba5c971991004e31de8f728f6bc37a4ec7b049c1f2dc64d4be9415462 InvalidSignature = 61a4066d0b64964100ecf583325cad10b53912aba1bf3606720d2bdd8e21120bb0b5e4323987d96039819ccce0e5e90854bc0e5c239ab198f75b00355a04e4eb1f855f76697cd65732820575306eb9323954bc5913568a7278fcdeff8e8acad4481e3559f8c44a0be3bc02bae437c3146e4516632b3fe788c3a0e44171155728 InvalidSignature = 979a313677883b0980997f1cb525f43401739945860149dcad80f602df8abed4fd85bcd6e174d9183a5a44008fd77b5a5abcffbcfd4f47ccd2dabef963d9b228310d99000ed0cebbf61438cbe586985bcffb3923a8467a97ae791d0b04925c0894b5a41583d6de72d4369f481f66abce41a577fb128fc0b0aeec746ec089d834 InvalidSignature = ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a2300000 # Based on SigVerPSS_186-3.rsp # CAVS 11.1 # "FIPS186-3 - SigVer RSA PKCS#1 RSASSA-PSS" information for "rsa2_check" # Combinations selected:Mod Size 1024 with SHA-1(Salt len: 20); SHA-224(Salt len: 20); SHA-256(Salt len: 20); SHA-384(Salt len: 20); SHA-512(Salt len: 20);; Mod Size 2048 with SHA-1(Salt len: 20); SHA-224(Salt len: 28); SHA-256(Salt len: 32); SHA-384(Salt len: 48); SHA-512(Salt len: 64);; Mod Size 3072 with SHA-1(Salt len: 0); SHA-224(Salt len: 0); SHA-256(Salt len: 0); SHA-384(Salt len: 24); SHA-512(Salt len: 0); # Generated on Wed May 18 13:42:19 2011 Padding = EMSA4(SHA-1) E = 0x90c6d3 N = 0xec996bc93e81094436fd5fc2eef511782eb40fe60cc6f27f24bc8728d686537f1caa82cfcfa5c323604b6918d7cd0318d98395c855c7c7ada6fc447f192283cdc81e7291e232336019d4dac12356b93a349883cd2c0a7d2eae9715f1cc6dd657cea5cb2c46ce6468794b326b33f1bff61a00fa72931345ca6768365e1eb906dd Msg = f0b83b8facf6698d564bad334fe494aba3eea42f3cfc378455a989c4317e0f610c160a67527f5d010fe49b3fa6696516c757f3a99b79f0c641c68bb47e3fcb2cb01b22a5042246d5e9573c74c5d9b543e60b9e4dbbf3f36c44e0d410c750da3cc510abd12ca5cc0fceebb75912fc2e38e953cea30432e77e45408b607377e599 InvalidSignature = 7973359908f1cb2f7eb31e19f7655e8117261e17c43c8ce5b12bb861b541fea168e077b41cf11a95ef7a80edf5f5903987e59d4b9f115cdb3b6394eb0dcb6f5869be0f896087bec612093965ba020449eca36ea74acffe1eb9f42e4ef03247cccbf99557073ad99a144172669e49296980c9aeb5fc7fa64660a680c320edb20d Padding = EMSA4(SHA-1) E = 0x90c6d3 N = 0xec996bc93e81094436fd5fc2eef511782eb40fe60cc6f27f24bc8728d686537f1caa82cfcfa5c323604b6918d7cd0318d98395c855c7c7ada6fc447f192283cdc81e7291e232336019d4dac12356b93a349883cd2c0a7d2eae9715f1cc6dd657cea5cb2c46ce6468794b326b33f1bff61a00fa72931345ca6768365e1eb906dd Msg = a4ceb81c341237facdf5c8dab1f5fdd725985939df0b623cbb08f714affce42d016ab4b7b78ac7625037a466b1088fc762bc5fd7fadb8afcd89a82b314ff44d5b5472d1a258510dbe28b871c750d86c9a8043640f451001039a3e700b29a1c54272dcc4b64493decebba1902e64f0a665f39867cb3b5ed0044ebd1036f159430 InvalidSignature = c12ad0a80b116cd65a8c81aadd81f05bde5d6adc60e4deffa3d7c68ed8df5314c98b70979c4ce5f9e1c3f0e52fab15725c4f22dc0c4b182a1d7cd81dc24f54e768dd2518a6cee3952922e653b8feaa32745f92ea01907aa4ff2c5f64ed9bad461e2825eafdc31158fafd38afb39fa10f5f833faca076c8771cabe406be6df648 Padding = EMSA4(SHA-1) E = 0x90c6d3 N = 0xec996bc93e81094436fd5fc2eef511782eb40fe60cc6f27f24bc8728d686537f1caa82cfcfa5c323604b6918d7cd0318d98395c855c7c7ada6fc447f192283cdc81e7291e232336019d4dac12356b93a349883cd2c0a7d2eae9715f1cc6dd657cea5cb2c46ce6468794b326b33f1bff61a00fa72931345ca6768365e1eb906dd Msg = ada7d6e417da2c55aba768f60df46b73496cc07866c7d2193f4c5c728e94228a4a90df7e33ce7edbabf78c4bc79dee74a633cf1d015ddd92046bb54a5c1f9bc892b76fbf9727dc79a0a7d379336d386082bcdb0df91da90813ed2421711710542d236ff06c70b0f932bd24ca7beeb1fe870dca9175909e4313da903df504e8f7 InvalidSignature = dd45ac85aa560159b2b9890cd61b8c082bb02b55529afec05e7f3fc1d73e30a09e0a7a422c20c074bd25c1271924a94d7576d99125d9200e0190979dd4238db8bdd286eba5d3e46a48fa2b18e43d7926aca3312eaa93970797c20c7e12a64c47858d1deabe5260620f01ee528d63e073f90f5044ea92804f3c1500cc2b958289 Padding = EMSA4(SHA-1) E = 0xc35377 N = 0xec996bc93e81094436fd5fc2eef511782eb40fe60cc6f27f24bc8728d686537f1caa82cfcfa5c323604b6918d7cd0318d98395c855c7c7ada6fc447f192283cdc81e7291e232336019d4dac12356b93a349883cd2c0a7d2eae9715f1cc6dd657cea5cb2c46ce6468794b326b33f1bff61a00fa72931345ca6768365e1eb906dd Msg = 68a53131f6499d299801d88d6dc311a138934f1f58a5057efac2e6738decfab97645f20e052db97ea8ab4be35f0ecaad70d4cfdf5ccafe5a1175dd5e61b1e64eb398dab3f9a55984e219b0a5509ef2ad0c2b4aecb9278fad06d119b828dfd31b8865922ab8f9a5c5ac15aed927bdb0297361684f5504e1fd409e4389c9bfeba9 InvalidSignature = e955264d644003b69f39f955150a7f42b629081b5c13787c7a9e2c988089b5e550ad4bc14e7e71c441ddb69afad39c56f811327e25270443cc0976adc9ff392a9e1dbff48fd9adbf6263be6e78d7b95feffbaa2879ba8b75e67a97aaad39d9211e5610ee369777d3f8ffe373f9d7d2984d209a9399cc1e105ffff0baaadbdd25 Padding = EMSA4(SHA-1) E = 0x90c6d3 N = 0xec996bc93e81094436fd5fc2eef511782eb40fe60cc6f27f24bc8728d686537f1caa82cfcfa5c323604b6918d7cd0318d98395c855c7c7ada6fc447f192283cdc81e7291e232336019d4dac12356b93a349883cd2c0a7d2eae9715f1cc6dd657cea5cb2c46ce6468794b326b33f1bff61a00fa72931345ca6768365e1eb906dd Msg = 340eff60922f2d65152cde96f5729fddc554434d9aa32b596f7fc543c86c53d796a9ee585bbdcabb8e52bb134146f84d0100201dfe007a386cba81c428a5a00c9f8f3a79ec33edbe400d1852876d9a2348cbdd89cd5a147885dfc0fba6c479dd1668eba98cba1fd6f306fc3b0f0f0dc9625d847851d87f8283968bd08af266b1 InvalidSignature = 4d744a1aad0c4d76512902eef63753ec58ec3f5e23f91889fd6705bb111db9c688587c320b52e65939c69f2296d9a4c01bc450513486f86a861e706abe25b40a8e3f517ab58e99ffaf6b8c4efbf44ddfa9150349baf5daf0af17cecbbd99d0f5af871ed8b10095b4a0d14d3c8c4ecdf9e52d361d21694dbd9bae7fa395714d9a Padding = EMSA4(SHA-224) E = 0x6a3db1 N = 0xf650d9f361cf9cf7c1e99b028f392d545b5dc5999a09d22913a106412adca99b3686b3f8ef5178d1bb9b1504503a5f866b563a58c7dc42d8c8537503be0c181d6d050d47a869bf7830f3c85f0e5fcc910deffe1d914ae2f8d77e66e444c579e99770043af2c7f7d89458730e716f80ed5800f8f9751f6f59bde63b6515c96fa3 Msg = f0b83b8facf6698d564bad334fe494aba3eea42f3cfc378455a989c4317e0f610c160a67527f5d010fe49b3fa6696516c757f3a99b79f0c641c68bb47e3fcb2cb01b22a5042246d5e9573c74c5d9b543e60b9e4dbbf3f36c44e0d410c750da3cc510abd12ca5cc0fceebb75912fc2e38e953cea30432e77e45408b607377e599 InvalidSignature = 6b5a094e74c5c34ceffaa51dbb15f02689e1c45b620e926f85882800dd4662c9412f1e6a54388b51a58a7d3791c6ca6acdf03ecece746e5e3189ebdf5c958ec0233758f126e4455957b7f6450f65f61f1202f569e1c95e36207916b7bd22f530debc965dd5ee543d80e14b19341221b294d2f4acf846a63705a9479b49fde460 Padding = EMSA4(SHA-224) E = 0x6a3db1 N = 0xf650d9f361cf9cf7c1e99b028f392d545b5dc5999a09d22913a106412adca99b3686b3f8ef5178d1bb9b1504503a5f866b563a58c7dc42d8c8537503be0c181d6d050d47a869bf7830f3c85f0e5fcc910deffe1d914ae2f8d77e66e444c579e99770043af2c7f7d89458730e716f80ed5800f8f9751f6f59bde63b6515c96fa3 Msg = a4ceb81c341237facdf5c8dab1f5fdd725985939df0b623cbb08f714affce42d016ab4b7b78ac7625037a466b1088fc762bc5fd7fadb8afcd89a82b314ff44d5b5472d1a258510dbe28b871c750d86c9a8043640f451001039a3e700b29a1c54272dcc4b64493decebba1902e64f0a665f39867cb3b5ed0044ebd1036f159430 InvalidSignature = 1db247c271a11b2d41205d1abafd433be26e273563f636a3a46191fefe2aceac656a9e91cd58df247a4feda14b006e6871896f1f3fd84a4c91e85a82d88314011b85b3e0432c07fc5f16b0d10fc56e2823bee8746f1ad6cf4cc4603bf1046c98e36cd373d7955ec37d86916bb4cb5ed4d43a5a12720ab9ab7f18a17ce927a286 Padding = EMSA4(SHA-224) E = 0x6a3db1 N = 0xf650d9f361cf9cf7c1e99b028f392d545b5dc5999a09d22913a106412adca99b3686b3f8ef5178d1bb9b1504503a5f866b563a58c7dc42d8c8537503be0c181d6d050d47a869bf7830f3c85f0e5fcc910deffe1d914ae2f8d77e66e444c579e99770043af2c7f7d89458730e716f80ed5800f8f9751f6f59bde63b6515c96fa3 Msg = ada7d6e417da2c55aba768f60df46b73496cc07866c7d2193f4c5c728e94228a4a90df7e33ce7edbabf78c4bc79dee74a633cf1d015ddd92046bb54a5c1f9bc892b76fbf9727dc79a0a7d379336d386082bcdb0df91da90813ed2421711710542d236ff06c70b0f932bd24ca7beeb1fe870dca9175909e4313da903df504e8f7 InvalidSignature = 468a0a4d9887dc8de86672bf5888ab473fc58cd681de1dd4b9fc46eeb32b184cf25877be736696aaa86e9707e6afe57ea1f9ea493e5f72473d7c5e77710e15e325eeac1a1c0a82199fb14f3f090703e9f14d0b0acd556bb4c242eccbec203664d8c903bb90210aab8f61c1de2391cb77f93c8cf6f5e3d1fb621c4109d5d089d4 Padding = EMSA4(SHA-224) E = 0xe887c5 N = 0xf650d9f361cf9cf7c1e99b028f392d545b5dc5999a09d22913a106412adca99b3686b3f8ef5178d1bb9b1504503a5f866b563a58c7dc42d8c8537503be0c181d6d050d47a869bf7830f3c85f0e5fcc910deffe1d914ae2f8d77e66e444c579e99770043af2c7f7d89458730e716f80ed5800f8f9751f6f59bde63b6515c96fa3 Msg = 68a53131f6499d299801d88d6dc311a138934f1f58a5057efac2e6738decfab97645f20e052db97ea8ab4be35f0ecaad70d4cfdf5ccafe5a1175dd5e61b1e64eb398dab3f9a55984e219b0a5509ef2ad0c2b4aecb9278fad06d119b828dfd31b8865922ab8f9a5c5ac15aed927bdb0297361684f5504e1fd409e4389c9bfeba9 InvalidSignature = 03999476730932d46eaa5205f422de58c5d517a2d15fd449404c52ce7f0a3636a323aa681d79bffac60e8d9fbd6e62e299368cf8dedc3c1631d347cdd518e0a18b7e146ff913f191c0e772fc3e50a4424845d23d7e10e038f9fcee9e9a2fe4907ee597e3c589000644d65cfee60115dbafd9a8348df03435224e1f99d04ceafb Padding = EMSA4(SHA-224) E = 0x6a3db1 N = 0xf650d9f361cf9cf7c1e99b028f392d545b5dc5999a09d22913a106412adca99b3686b3f8ef5178d1bb9b1504503a5f866b563a58c7dc42d8c8537503be0c181d6d050d47a869bf7830f3c85f0e5fcc910deffe1d914ae2f8d77e66e444c579e99770043af2c7f7d89458730e716f80ed5800f8f9751f6f59bde63b6515c96fa3 Msg = b3e512b4ff753fcf01b6e6d830915f93cb99fbdfca3697f3140371e8f2743a78c4bc6c05f3eedddc266295bcb95adc926be598875604d63c250ca754814b2d34cceef506122287043c7a3cf3879150ed35f0386483323664da662a1849b4ab90334456c1455b66ceabc78686847ee32d9382847f3707def29dd8a33c34f7dc15 InvalidSignature = 5432923b53dc8ad5df6a5db2b04506b42afbf29e31086fb3aa7b7b7a041940466a6535da54329c1aa5cfd328d4cb622398bb572354eabb3c1a59953c7881d1b1603a3f0c5ce845dda3bcf509c9c7b7f61fb310ae50101d08062eb2b894d12602ec28e7533251c0987e4a290e5affd0083b2216f26a55a732432268bcd1982ef6 Padding = EMSA4(SHA-256) E = 0x183a77 N = 0xbf15c7a344db52c3da4c73bbe1aa9e43a24cc3ccdfa6dcb994e29846401f3d5ec9138756487def58d4bc5082baa8e93c840405d36ef37f59594d01f0665edb27cee3b6b647437405652cf809200597b0de806ea9ae20799400fe24bb3496d92e65ab5718c61ea24e302b2414f4a6ac1c99a4177de0f83882d638c46c95e2412b Msg = 14ccaca3e4e313a960023ce1ea1335a9b29b47bdd7463466cfc7bdef08de6759cfba7f5072825c5da12fe45c1a9c523186e036b79ddbbcf9910f32a5aab1c5bd2d008b9083d6c7e9977d688680c3d2cb6051e1b88c382b19edcd86fca6b7cb68f646d94c6007dcb60a95cf4564b13fe1099552a9ea86092da9a9c2de431701c3 InvalidSignature = 93e0eab6ad774d35fbf94f2226072c7b6dd9edb54377ab7d8c8f8c1f125b62536334d953d3c610ff9aaf04b1962cf30ec213a6022ddbdbdad67084db957853a4d35eb644e1dcf8ff82b26a74738271b2394b5a063de453ae5c0968034dc7ca12f9d1c11ac213e801794a00eec5d3ca9469a47ba7b932259be0aaf13d41302c05 Padding = EMSA4(SHA-256) E = 0x67109f N = 0xbf15c7a344db52c3da4c73bbe1aa9e43a24cc3ccdfa6dcb994e29846401f3d5ec9138756487def58d4bc5082baa8e93c840405d36ef37f59594d01f0665edb27cee3b6b647437405652cf809200597b0de806ea9ae20799400fe24bb3496d92e65ab5718c61ea24e302b2414f4a6ac1c99a4177de0f83882d638c46c95e2412b Msg = e5494be79aa11936c226d26f260c2a8baa36c7a4d2a9eb068640528812a15e1d716f71a6cbc29a0a3cd47589d7fd4c4debe1824284e8322835ee13e7153c9f2208b7740e4058fa8503dc4656aebd3ee0fa60fedf7e907b85752b66cdc21b540c31881bc8004c7fce9ea80e7fb235486b5f1d0321c68a0e44cd5f15e21f27c402 InvalidSignature = 983e58dd64d1dc369a71485a497f9242a527bb285e5039e88f997a30fbdd32f3022c453218e22f0180c3f753bc0d6e3d695ebde88e8963571adb68510c1e40d84ac83785cea9ef84bdd3957e98d718c7a97b22f692dfa9d1273a97ce9446794fd193ec3d9354caad1b7bfcddf82505f8a963f7759d108b7a67a57aa7cce3c84b Padding = EMSA4(SHA-256) E = 0x183a77 N = 0xbf15c7a344db52c3da4c73bbe1aa9e43a24cc3ccdfa6dcb994e29846401f3d5ec9138756487def58d4bc5082baa8e93c840405d36ef37f59594d01f0665edb27cee3b6b647437405652cf809200597b0de806ea9ae20799400fe24bb3496d92e65ab5718c61ea24e302b2414f4a6ac1c99a4177de0f83882d638c46c95e2412b Msg = 3620220deb2101077555298267995366d834f856ac0cb687151af5d3581bca09d5881c8842c9050c37a67ac7effe2fb44dbbb5281d05e5aa9db682043b0e1a9aa1a92dfbefad92b64748156f8f5a6531726e2e06a8ef82c578997d2c7b2d292ea2699f8e7a376fadaf2542a1d015be865135aa19d6325383afa92e729edfbe6e InvalidSignature = 3e9d528a7bdbb9d1083384e67441712645c2aade8ca32c8c5632ec2708b6b9877dc4cf4803b6cbe533fc58db7ab01019ae879cf746dbca08ef39affbd600562ae99613d76183554e712e90fdd4b37a0092a3ddb3bf2835e6fc6ee12e7b355ac006e8e5725d8773d856360bbef7a896fc66594b1a4f7ecbd13ed2c02b76511feb Padding = EMSA4(SHA-256) E = 0x183a77 N = 0xbf15c7a344db52c3da4c73bbe1aa9e43a24cc3ccdfa6dcb994e29846401f3d5ec9138756487def58d4bc5082baa8e93c840405d36ef37f59594d01f0665edb27cee3b6b647437405652cf809200597b0de806ea9ae20799400fe24bb3496d92e65ab5718c61ea24e302b2414f4a6ac1c99a4177de0f83882d638c46c95e2412b Msg = 75d462568edb867e996ef0197de4685fe3528225985d2053364c38970162d85b0f6a67f5ac932d1efc7e16a6e296b26621a08175c1926e9fb5a99912bab6595b82b9829112b0e3d069b113e962376e58dbba5a771782cff161bc1678f2ced0bb15e83b9289dbb17c272f714cc46fa21f59c8959162d34b3183ae373271514463 InvalidSignature = 97828f3a8b864a95c19b617aaa5744cb09c3c37758349e398169e2e8344eba663f9dc871f744b52b3f15d07875ae8706e7bb849e0828e6c9228cf43e742fd2c233f2b31a67365a12f0ebc2d9d3369232c6939cb9e6e80b18443820773ff796d2d77d633f1e240a2e62625ca6e85e85105a9b9beff0c6d86a112f1e9aaa551c88 Padding = EMSA4(SHA-256) E = 0x183a77 N = 0xbf15c7a344db52c3da4c73bbe1aa9e43a24cc3ccdfa6dcb994e29846401f3d5ec9138756487def58d4bc5082baa8e93c840405d36ef37f59594d01f0665edb27cee3b6b647437405652cf809200597b0de806ea9ae20799400fe24bb3496d92e65ab5718c61ea24e302b2414f4a6ac1c99a4177de0f83882d638c46c95e2412b Msg = 372c9d4b73d3d7527d991817dac22792b1a2926824a8a30fe09b9033f324f259df8d78c3ecc8dd93c2b31733369ad2f365fd1cf4ff946246e6919b4df825c36928458bd5d4ae4fd0532748fbcd0603034ff5117f1ef6011c4ca58bf78abd0e4a3dde3d4bd48e1451587d1239440da2089811dad129d567da3b60c8fa51f5bb45 InvalidSignature = 7ea27bfe422507d9f40f5200ba8b68d92147611c63825aa1aecb3268893388be452de5c3f9c6d224d5633913d5f27a33b669550c5653315fdefb6032ca50f781e789f148f2642aa479aac4f85454425e570cb0cba2a1a8586178a48127897003be424eb86d87a2c5c95627dc4407f4800536567337d88d1df3b369b176a21c6e Padding = EMSA4(SHA-384) E = 0x35c661 N = 0x8b71c2bcb324a3fc23d292fb4f18cab5140d521013361a07071bc788859cbba33fc226b2cef9c1b3663d307acd3e4d8eb7acff63d048495a2d61fbeb617a42c4f424a347673173902cd1cb11780003e715662d195996fbff55f6b9feb54a18197e6848aa8baa15fa020cc54e72ec976d766ed63ee4e00071a11e29d7baf30e3f Msg = 78b8e34e3d1026e88148aff5a05d5b6ff747113148cf47665fa1c842f6a2b4f0d783c8cb4097dfd08be1b9530e72fcf241f278c81e7cafe3ceaf95f7810194539e57d3151cd3b89a2fedac3928c61e3196b8cadfb2323b35fac38e671b747ae7145b8d94996db82fb5940e0eb402c91440c48ee0ca9af2452c063cfa8ca36c93 InvalidSignature = 697f7422aa7bb453c6b7e5c3c1f5a44d4631ceb0b9a9e77a0ffffdadcbd50d8f69a2fe23ef495191dbc4df75605198af429807393efce5d0742c6cd65ea4f6e60fb9de39faf141f6b9f2339bfdd95677de6ac7856b183ca7c2e19fcfefa916858e7e41de93257e8771e361d056d5c96557c655e1da2d4906798cc4b93509b0af Padding = EMSA4(SHA-384) E = 0x35c661 N = 0x8b71c2bcb324a3fc23d292fb4f18cab5140d521013361a07071bc788859cbba33fc226b2cef9c1b3663d307acd3e4d8eb7acff63d048495a2d61fbeb617a42c4f424a347673173902cd1cb11780003e715662d195996fbff55f6b9feb54a18197e6848aa8baa15fa020cc54e72ec976d766ed63ee4e00071a11e29d7baf30e3f Msg = 8ae68ad40631981d0cb68428c642fabc658ddffc1761e4a436fe5c90bfbe4b7e07f5bf14a91b6325c32d5130625028293ab85e7c9bc8d850a07ab808aa0277100cae33d608114a16fb60275bd41c5cc3caf1f1024fdffca93f9772a95e283d1201da8f210b5a757a1b18afb204eebf107e0240951bed79397c1d3278c477c60d InvalidSignature = 7c17bf8aaeafb9c97966d905205b1f007a1379e5fea9418bd6decab846bc4d430de0315c5b2195ea62900b34b7d37cd6dde7e37d9361073942976215e7183e4dc876d69e1eca9cc3786d2e9922b71333ae3f0cacbe173a6346c152273556b6bdd1afb7fe01fcda772362fe20be34bd4c8ed9b16cbcd3db910a0d89a1859a2539 Padding = EMSA4(SHA-384) E = 0x35c661 N = 0x8b71c2bcb324a3fc23d292fb4f18cab5140d521013361a07071bc788859cbba33fc226b2cef9c1b3663d307acd3e4d8eb7acff63d048495a2d61fbeb617a42c4f424a347673173902cd1cb11780003e715662d195996fbff55f6b9feb54a18197e6848aa8baa15fa020cc54e72ec976d766ed63ee4e00071a11e29d7baf30e3f Msg = 5ec0479f0010f6f12a707ab52bc4ba883f29ea19617d02d660216fc535fd08af94c54384c17ba9fba53687792121e734a2c6be98f68d67ea5e7f502be450f43fee9d094e1472fa6b2f0f9773b2ec0c383efa0fdf702c5e87fe36692c02954bca95cfffc5a0fcd188ef85126c872c10dc3a4c46b87862cff668cd218f37d2f799 InvalidSignature = 7202f1ed02d85d82b574b06fa3de38a0d19b80a612f470f22b4eb8a032c15be565bcfc7e9780d35f1aa11a312339554ec51e690287ad57acff359fdbe7cdfabf9770e9b33343cd8aeb8b2ddaaffd1d2308ec9fa28e5dc26abfee5c5e8470adf13380e7aefef727a78dffaf32bee251ca8bab4dd375d2a9e6c470943bdb58028e Padding = EMSA4(SHA-384) E = 0x35c661 N = 0x8b71c2bcb324a3fc23d292fb4f18cab5140d521013361a07071bc788859cbba33fc226b2cef9c1b3663d307acd3e4d8eb7acff63d048495a2d61fbeb617a42c4f424a347673173902cd1cb11780003e715662d195996fbff55f6b9feb54a18197e6848aa8baa15fa020cc54e72ec976d766ed63ee4e00071a11e29d7baf30e3f Msg = 3de862f4efd8bda0f2f8254f730e5a8d5baeab4382a6c5371f99c9d684e9a13208da934744f5168282abe584723b53231fd6deb122000681153960a84bdde601be499174493f2a77188c5dd45ce70fad431df1be276b55e3062b41da32b4c249497b8303687e9e879ce2b2ca99da3636afcc0df2f9af5a64d8b895f49f35df13 InvalidSignature = 26068d35b77ed46848c6006fa718c92ea035464018403019929daa2fb8af505ea81e7b0c1ffeebd614d006fc6c445febc27a562ac6bae807a52d2268690d26b1510c9c1bcafb16626212832b1c5f8a24630c16849e6c5dae23d2af780f34095ebc298a0cdfc3dab0a853148b74b676baa2b23bbac4c64b7354c3f0e5c901fc09 Padding = EMSA4(SHA-384) E = 0xc78d0b N = 0x8b71c2bcb324a3fc23d292fb4f18cab5140d521013361a07071bc788859cbba33fc226b2cef9c1b3663d307acd3e4d8eb7acff63d048495a2d61fbeb617a42c4f424a347673173902cd1cb11780003e715662d195996fbff55f6b9feb54a18197e6848aa8baa15fa020cc54e72ec976d766ed63ee4e00071a11e29d7baf30e3f Msg = bf087ce3582a9462c3706a2eb7cafae1b9b79c0185138977af309b428a29546c4973223d64b5e1b03edaa2230464ab52d803bf862f669f0a7751d0dffef09fb00f6b63085eba02c3a5bbb6c3908111e4d7ef3f31a9868c58517c255b140e23895817c5ad0ce0fd85433a2f7522ca357dfda5a669bd1d584785da231e952ce8dd InvalidSignature = 17cbcaab779fdd6aeac8f0b90fbfe96b6d7231fdb550f2caea85eb9911121d7a0e956cf11414bb111d1d0b05b1404d480d6eccc65c0d301207ebc1b150247809f4cba9ee3b5f759c59602b1e63594ccd374d509a7c135a68c6013ed73ddf68cba5ea31087af451832411dca910fbc2aaab286b3a9c95b1655ab872e8c2766d0a Padding = EMSA4(SHA-512) E = 0x7b8267 N = 0xdab9c7d28a2b1e4995c12bcae3c9f580a2dd5372441888dc83aae5b515ebce3b95786c43b5811ebaee6ad90bff9e55ae1edccfc0fcafb4cfc43743749307ec0c36886c88a174d0156a2f88a25a5c594c558bf1a947335b1ab02e77bfeee5ab0cc25455819397f74d30ca31074d4612d9d928b66477ddf7b83c0cf4ee279c9071 Msg = ca69f73a1e17310789a65561639b2b054aaed69622c4fb345b1d255172cf68c0bb73450f5d1ece179e930ad161b69b6cec449e9cefc2d334c2b3fef7ef0e8dabf0ef7a703a8d73507a6c39171ed446651781b201dd9c5770b4ea34c72f440fbdf2475e04bb4c68daa49aa8dba2db721952cdd96ef53acf11b82a8e683a57371d InvalidSignature = b8459c62f5dc848a47e73837c3fb1b5b96c6cedc1cd0e08d5bccb8a0fe4e43ee03180a9457a8db53c16ab994e959bc59d29d3b15749a8e9cf43cbe81d13c3b2e0d55198e0776ddd2915e25f59b17e914888e10809016afa90fe24d6bf9aef635f291f6df2a80b777db31783ffd7148d078ee82ff15b4b83298c728fcfe80f58b Padding = EMSA4(SHA-512) E = 0x7b8267 N = 0xdab9c7d28a2b1e4995c12bcae3c9f580a2dd5372441888dc83aae5b515ebce3b95786c43b5811ebaee6ad90bff9e55ae1edccfc0fcafb4cfc43743749307ec0c36886c88a174d0156a2f88a25a5c594c558bf1a947335b1ab02e77bfeee5ab0cc25455819397f74d30ca31074d4612d9d928b66477ddf7b83c0cf4ee279c9071 Msg = aaa280f51dfd88d1e7c7f08834ca69d75e4743996295858e950b3c5c922013d377d1247551430e36d4aa48805069b57ae07b788ae5110919b27c8896894e52bdc7bcd3195b479bc77c9cb37e9cb831cc974f0aa2316f2813bf61bc5924d0d619ff2c33e82351550d4864d98800fe0654ec8da2ea2ff70906238080ad4bedc66f InvalidSignature = 570c0eecf611c34433df2f79b602ab96459bfd22a27b4acd07584dad4957af8c322ae98c376312c6b9330e50546a148734219636dd44de74106663e576ea85f8e02d9d03818f42134fc90c78fe94f06c4367e5a6c11357bc3abfd313c40a25986c083210a066985da3653eaf4581912f5396e5bd15eedc2d7fb9bb076ef85c14 Padding = EMSA4(SHA-512) E = 0x7b8267 N = 0xdab9c7d28a2b1e4995c12bcae3c9f580a2dd5372441888dc83aae5b515ebce3b95786c43b5811ebaee6ad90bff9e55ae1edccfc0fcafb4cfc43743749307ec0c36886c88a174d0156a2f88a25a5c594c558bf1a947335b1ab02e77bfeee5ab0cc25455819397f74d30ca31074d4612d9d928b66477ddf7b83c0cf4ee279c9071 Msg = 512dcdc30e9ae2b6e44a773eaffe62b10050dd2a12de22d100aa385d36c10cd7251bc3a03cc34fb513374032e912dd1550e874452772eed3c9eba67f84b97c7e4d50257ab154c5db0ffdbf4505c0cb61282c4ae1f812d7be13e81fc4a86ff2512f949a5a57946bae40649b7feb50541eefe208066d05051c456a49358a2b97d9 InvalidSignature = b19f58f4374cc02135eb3aae5303dfd5e54b68ca90daf44e2ffb4dcb65ad49eba624688b7c18987177573ad4299c8cae53fd2ce2aae3515d033673155f1e5849b874f6bb28f691a0b920aadc7cfd5218fa2bbe60513df35f50bf8afa968c7f3a821ed9f185f23d020598d745be5dfa74b4ab25029bd47000637a2868438a6cb6 Padding = EMSA4(SHA-512) E = 0x7b8267 N = 0xdab9c7d28a2b1e4995c12bcae3c9f580a2dd5372441888dc83aae5b515ebce3b95786c43b5811ebaee6ad90bff9e55ae1edccfc0fcafb4cfc43743749307ec0c36886c88a174d0156a2f88a25a5c594c558bf1a947335b1ab02e77bfeee5ab0cc25455819397f74d30ca31074d4612d9d928b66477ddf7b83c0cf4ee279c9071 Msg = aae7e01a6e1a1070fb04dbaf97684bd0252aff01eb0715f899844d8887246a723fdedc7d3bce9dc9f02b59600b79d10efa008173ae7c80569f16a93c1193f83996cc3607d55ed95589a22661cde098c996bf859f8100ffbbcf6cf955ad0baad3b99737dfc3308cbdd0518adb650368aa025153adecfb58d02f6f84fae4f44ae5 InvalidSignature = 2935b15fc9d8f8dacf912f828cad15c50e66745e08107bb23c419d7b177940716c04774898be1db3b175daa1cd1014900e7ec64705a1a145789bc3a7a5d2bb5a5956cf66a55b258913193aa44d29a731c33f1b7f04cb9dbc55f351a12ad77796502876fdfe47330d501c52fc87c5fc9d114756ba496a3742d5eb38f8835367c9 Padding = EMSA4(SHA-512) E = 0x54128d N = 0xdab9c7d28a2b1e4995c12bcae3c9f580a2dd5372441888dc83aae5b515ebce3b95786c43b5811ebaee6ad90bff9e55ae1edccfc0fcafb4cfc43743749307ec0c36886c88a174d0156a2f88a25a5c594c558bf1a947335b1ab02e77bfeee5ab0cc25455819397f74d30ca31074d4612d9d928b66477ddf7b83c0cf4ee279c9071 Msg = 0c5f5fa28397254fc62d7e2cb124b769873cdfe37f66713d7f7a3432272c6029113d020a57eea15156ba2261b244e91a9b8f41ad4e6dfeafde3a616d34c93b80549f55a1e35f10bee686494dcd587fe0b01b38f9d882a020816c7434decf1eff5eee220c2ed3b8bdfff9ba980949c1e250478c6f268ea1b8f17a362e2e2451ce InvalidSignature = 2596aabc2978bd62da57c486172a2cf433eb145835059fc035bd42886500156eca00554a989d19b6bcc4f640eb7cb5cb634dae38f59b015a01ffea0504847c643d525b910f61c2718f4cbb076e8af82183661d6c7e06dddfe1579ca2d6dc7e3e056b0ff6e6806fdf419e984018e2a1126820fbe966c52f9d8295a2a9cc9d0e0e Padding = EMSA4(SHA-1) E = 0xa4822d N = 0xcef7d8f114854a2a681fe6ef600351b20a9d992010319590ea20f4152565098aed46b75330cac1da85652398402dd9bfa04f4e6c63f3cb6a30ee169b243a5ea0757646a47dc51db6af86adaf9b700044978da876d49863601d0c4ce7629decdb7485df787c68e250fdfae9d77251a315f127a93dfb024c040e274ec658e2c19d Msg = a4dd2d68a6ccaa4d2218c34c89fa1b8b37ea9a61fa121269d10222d5f3a55b051374a259e3e9d543d737b2a02b38f44827a7bee3a28f3dffc5038a601110cd97a3f0a8d7b780d3036cf5030bc7ca1179f9fc5847e57a5ff4ddd7b8d7ac4327b2dab9078a2b7aeab669b980376398ba4736532e34cbbbbe6fa1e774e0cd26b17d InvalidSignature = 97a9b907731d605e40d7df6a8c813e3ff319a02074a966782fc2ef7937d0e9710e4473cf0703c23de5a1d238aaf38f6c5882725fa386a92f50c213b25385bd1d6b481708959677f7263bb8766049c3a24022180ac7db049edc37f19c1cf1e613a6d295190fa86b8f52b52e989507ea1368637cf6147de89eb9d840d5a2fc23e4 Padding = EMSA4(SHA-1) E = 0xa4822d N = 0xcef7d8f114854a2a681fe6ef600351b20a9d992010319590ea20f4152565098aed46b75330cac1da85652398402dd9bfa04f4e6c63f3cb6a30ee169b243a5ea0757646a47dc51db6af86adaf9b700044978da876d49863601d0c4ce7629decdb7485df787c68e250fdfae9d77251a315f127a93dfb024c040e274ec658e2c19d Msg = 8e1451587d1239440da2089811dad129d567da3b60c8fa51f5bb4544e0f5ec936f165efa3edcb346b7974b67daddb2c73a7ec7da48ba1ef7d4b2a266d11d7fba593c3f60f11032790dca14e5d783eaa02c2d2d52e7ca2a2163dca9ca3b1ccdf0546e3bb41e157e851623ab399034405db35c52cac55ee879a91fa299a55a9ede InvalidSignature = 9003fc803fabb16ea2318a36e3e00b8a0d91c882b3cf11ac778e445cb5189b920e7689b865f1a323fb28bdeca4effd085de9611021ae95558db37bde3ce4326a1c931a60afdf03c3cb5a43465242f82a6b27352e1fa75af4e7bc1a93e81b2f3fc07a4312174b8888e4fbaafbb204880f3188e3e739223a57bc9583e6f125f597 Padding = EMSA4(SHA-1) E = 0xa4822d N = 0xcef7d8f114854a2a681fe6ef600351b20a9d992010319590ea20f4152565098aed46b75330cac1da85652398402dd9bfa04f4e6c63f3cb6a30ee169b243a5ea0757646a47dc51db6af86adaf9b700044978da876d49863601d0c4ce7629decdb7485df787c68e250fdfae9d77251a315f127a93dfb024c040e274ec658e2c19d Msg = 6bc3cf22b29b88757a39072df815b59e7a4f01079344a7c8786032cfaa33bf54d5c605c6f82f9205c76357d14e4c6783d61bfcfa0ce0bbd9605739f0ac05bdf716844882371cd2317d93d727cd4512be6d77897922e8c93b95a973b6fb2ff725f5a7a03eb589d16263708e18bf293db90709ae6d1b845a55dffce80ae1d7f647 InvalidSignature = 1a73d7d3cd4dff2de010d2ab176ee64db3adf4b1fd07cf37caf19bd223d6c343e7ef75b14603ad9e0a52b853516cb43f262552d2e25f72c2c3119f0ff5b516dc8dab8417f4aa2a85b812e8600b7cfbdd217db95e9f889cb648e865215289d88813af6c562b48ab0a2a12c18c7ff927d020329cd53635ac5e7c1c7fb6a9139566 Padding = EMSA4(SHA-1) E = 0xa4822d N = 0xcef7d8f114854a2a681fe6ef600351b20a9d992010319590ea20f4152565098aed46b75330cac1da85652398402dd9bfa04f4e6c63f3cb6a30ee169b243a5ea0757646a47dc51db6af86adaf9b700044978da876d49863601d0c4ce7629decdb7485df787c68e250fdfae9d77251a315f127a93dfb024c040e274ec658e2c19d Msg = 63215755a54b4a68ef26d1cc120c6b5a963cebe706dd6e6c8f409065ca66e076d5c29154a83f72e3a685209c7378793206025575ff1371763ae6aceca48576d64d8f8562bf39c90e8f93a30d310d52ec1039ae75ded218d429feb1f830d0ca3cf4119c4792403930cfd7c3e6f5d0dcd0de685db04e234bcd86100751154ec4f0 InvalidSignature = 3cdefbd51d9d74dcb34cdd5dcb6aa2329c38b72bef3fc30c5559e564fea7df8edde691f7793fb37e4ee8e363884493e21010e67c2b1310297a967dc852f94f1121456c6d83afc935586927cf1b5a1a927a221a05b133dbf775797c112dcece11232566b64e27bbaaddef31ad704f8b12d0e41571671de1e0fdea873a02cae156 Padding = EMSA4(SHA-1) E = 0xcb82f3 N = 0xcef7d8f114854a2a681fe6ef600351b20a9d992010319590ea20f4152565098aed46b75330cac1da85652398402dd9bfa04f4e6c63f3cb6a30ee169b243a5ea0757646a47dc51db6af86adaf9b700044978da876d49863601d0c4ce7629decdb7485df787c68e250fdfae9d77251a315f127a93dfb024c040e274ec658e2c19d Msg = 361f28f34dbee24034e03367b6b8d34df3738ca3a86b9ebcb09e639bcb5e2f519f4a7a86fc7c41556404a95dcb95e6149b7f5b5ffbdd026051100f8f056cd00d8930d83596bc5c73b8fedd590c2e07ef48bbda4bfd850762194c9d1eb068e4b1fcbb8928a2e5fc4336b6178402e90086030f509035c9756a113a556f53bc33e4 InvalidSignature = 5b594ac8b973c6fb485d17268619b26c9948ff142284487a2ba1ab3e65d12af9e589f8fc0f583bc1136a2744be1f325f43e0b604a20c229996471ac2ab69860439a57adf60257945f4197e57b7c6711057a695f13d4b44f04d7c2bb87bd492fb0c03006c184628bade5c168fcaaba94fcfbe0911cf7e0b514aa975922e4a93a0 Padding = EMSA4(SHA-224) E = 0x412b89 N = 0xd7147d934176601d8dc64f372838bb46bceb7ed10e6dbd3100a46340d889b8e5ba3d69fbce0f4c9fa2b4df614a14fd0503dc04d6ee671cc6283d4d37410b6d0a74cc39b3d83728ca561c99d920e80f1d971e927456dab06cb9bb8600f540091f96d3605a8bde99e01cd977aaee7dcca20c328af04366bd5975c623785839a355 Msg = bc8e2a0b7a699afd26236facc6780b4ccfde98a8f30b86c23bb73ab955a304f02fda526dc537247f3727c0a41eb0a7a920b3c713c26ef2be7e448fc416c190a027d9a4940170ad48b62074b371369b3e09fdd427d6405124c40a7c4aa5b0e72ccc118647d71d1c9ecc94f3a16810d053b34626acd8898a3c34906712ad78f3dc InvalidSignature = 70c2b47c69e68df4ea95dcb48bb3609b98805340d4336d544fa5d628af72583ae86a28c043c5aeab389cd7c23f2e164ea32ea83b5557cdf1421e4ed72d27ebc6e645e4743771dca252726cc6015ed165182c90e972f6c6be11c81c1f68083f58ea100ffa61aa0d7aa83fb4bc7df237dff22dc03093b65d78eba1e57d4344798d Padding = EMSA4(SHA-224) E = 0xc9c009 N = 0xd7147d934176601d8dc64f372838bb46bceb7ed10e6dbd3100a46340d889b8e5ba3d69fbce0f4c9fa2b4df614a14fd0503dc04d6ee671cc6283d4d37410b6d0a74cc39b3d83728ca561c99d920e80f1d971e927456dab06cb9bb8600f540091f96d3605a8bde99e01cd977aaee7dcca20c328af04366bd5975c623785839a355 Msg = 370bc75902d814961b5d55a3ca12334f31df07648182a82c6d308033df7fe64fea83a8de0137e64f661f27e4e42ca6b5c1e0edf9efb2a58182b4ad85677369a3521f5d25f8ecfa837fb7b72832ed64797aa9bb14091c395559322c1f55720cd956270eb650bdf73a4e6d2efa1b1d16a342819a3d39870ab1daf22589124477f8 InvalidSignature = 3e18333b801bea1045458e538142886d338017f2d8e35147382668c8a68596bc2ac5bd7f781ac756e5cad5114b4373bee0758fb1b3a9a5d59d6e5345187797b9b08a9ca87cb039b36923e8be48f6839c00a165836f761c4afaef61da4b4f64c426c78ce22be51774ffe67cc1609160e0369cb894f036642be789875b8e8e33cb Padding = EMSA4(SHA-224) E = 0x412b89 N = 0xd7147d934176601d8dc64f372838bb46bceb7ed10e6dbd3100a46340d889b8e5ba3d69fbce0f4c9fa2b4df614a14fd0503dc04d6ee671cc6283d4d37410b6d0a74cc39b3d83728ca561c99d920e80f1d971e927456dab06cb9bb8600f540091f96d3605a8bde99e01cd977aaee7dcca20c328af04366bd5975c623785839a355 Msg = 5d85ba30feae44c6de674c4ea2495d3cbe892394f46f18fe1a0a601d1d23f01d466ff68bbc08756a4b1e308363eacafc64e42b2c183626ae817058b4d67d539ec8d6fccc09f531b00f0daf2716f833096471e0fed083e19485414f8f04b855816822929aee5dbec0b49b91e2c15ae08a46970ab2233e92d9ade60d56afbb3feb InvalidSignature = 1b5f06f3c6969fdec39025d409faf8a800ac771d5bb821cb8ebe5343dfeb93dd741ebd881dbd02d029cc5e76381b451aa6e2effd2a1eb0291f002e3cc4909cd78ec5356b11756cdd06db3f74eaf18ba49f93f7fbf56880123eabf41bc1f9695675a491b140944b737df538bd7da904f72f469c890d05d858d145d59ba152aa19 Padding = EMSA4(SHA-224) E = 0x412b89 N = 0xd7147d934176601d8dc64f372838bb46bceb7ed10e6dbd3100a46340d889b8e5ba3d69fbce0f4c9fa2b4df614a14fd0503dc04d6ee671cc6283d4d37410b6d0a74cc39b3d83728ca561c99d920e80f1d971e927456dab06cb9bb8600f540091f96d3605a8bde99e01cd977aaee7dcca20c328af04366bd5975c623785839a355 Msg = 70bab1b9866237e8f5609aebad3662f5a64677221a3aeffff2a3254d7ee00b026842c191eb6e666b40022ec6597bb49dd25692f82575306d1dc5d9e78d1e14a6416a3187350a228605758c81a5221e3f52a922b0c8255176b6dceca56f2208c7e27a2a24ccff13402c02dda4f8f547e10e874ed36d11fd23a531850f8cb4906e InvalidSignature = 1e43dc1fbe0363e626d5448f3670a100ba199095d3d8a81944ec33c269ca5e2df4256dc5749b2add1accaaca0c3bef0a901fe895baca9eaf1e521ea015dc4c2bbd334a0d86a5ad65789adeda378a34d25b11d731f3950581f99a9aa385f2d6391cd7402406ae72962fa438cf12d9aeec557cd8aa34ef483ee3aedc1737d748a6 Padding = EMSA4(SHA-224) E = 0x412b89 N = 0xd7147d934176601d8dc64f372838bb46bceb7ed10e6dbd3100a46340d889b8e5ba3d69fbce0f4c9fa2b4df614a14fd0503dc04d6ee671cc6283d4d37410b6d0a74cc39b3d83728ca561c99d920e80f1d971e927456dab06cb9bb8600f540091f96d3605a8bde99e01cd977aaee7dcca20c328af04366bd5975c623785839a355 Msg = 5623af60bc0fd288d83dff1c0a212b5182b5b7134a6e949c876fac46fcfe7d9dcf3407b990f8e9cb772ec7f5ed2bee5f4e6c3b87ee8839d85a64897fe0a6877a516c2af1053d2cca20406b7814ab9013677feeaeb773ade5fb2d27b50bb892916333e0b123c6e3ae5bdbb54c868a579654549831ad1538eaf2344e91861de70a InvalidSignature = b1705a416781943f623d7e766fe1824bbabf15760f3288280d36208d6eea1fe8d638a9a5a7095845cd1870459a7f05023950756d01b630b1dae3818383c5f5a78b264f191bdb28735f350839ae58490b5fc13ba6794a9500b956782fb013c28726bccb0b19489e7244eef84b9262c603851be1b885c63c4d1b012e1a87aa30cc Padding = EMSA4(SHA-256) E = 0x4065a7 N = 0xd40e4a247dddd8dc32a70a38d287f3fa23aa016b77c8e8e1a98c2f60967a2b7a38f8614066031fb6eba697c367e3430cd8d924bc9eec28529266f690d538ebb4b0381b8966e7224e3c526122afd181d6e3bb6145a5a28d46dd36c1f1da823e0ff38b439c7638b44a127b072543f18192efde9cb381b2e98f4f5fe854e3391275 Msg = 9299311456fe2ddffb3d231e14afdb0e3c906ff1fc554f04ef3f87b023314504c3bf9563f387707afcc4f575a920f673f1cab637d5c9f1208c901d5bded2f057ce9722797b90741248a7f18e3bdb74eea34b6a78fe90d9ac1950a27b791003b4fa4a5fbfb6c0428d280fa0cf92875d669b3a121b3d530f91deaa9c77bd958502 InvalidSignature = 70d2c3138dd7a07fe22e8e3d2335e0a2c0cef949373f53d4d242e4027c154574f6d18014252cc10ab02ec1ccdcd3dc6f7c3d131346e76edf38ad66f36fec73e93df7f548ed7ba1759fced7b15c8cef2875822a6ea5b215a5cca0009fdb64f622eb1d9e27df411c3a1b916511dfd51da873d14a15b6d87553a2546ee15327ffe1 Padding = EMSA4(SHA-256) E = 0xbd23bd N = 0xd40e4a247dddd8dc32a70a38d287f3fa23aa016b77c8e8e1a98c2f60967a2b7a38f8614066031fb6eba697c367e3430cd8d924bc9eec28529266f690d538ebb4b0381b8966e7224e3c526122afd181d6e3bb6145a5a28d46dd36c1f1da823e0ff38b439c7638b44a127b072543f18192efde9cb381b2e98f4f5fe854e3391275 Msg = ca2932d61c66292bb02e7e64a1c6b40438e4fb91af640ceb3a3c55dc48b256ef05cd4b8624090b27dd4e30173123782a75206bd90ea13e957ac2f85b9087d389085ae5f03dbbff2a3233d62dd38960217e39816fc222e71b677f3353ae185948d9ba493ceee4cfdcb9c3b7d1106036925b19857c534ecf24095c4dec2acfb0d4 InvalidSignature = ac59e4b969236d714c59cc4218a7cc02cb31d86aa24741ebab2b02deeafc350c9d533c8eb3d9a5f53317a634eeeb05e0d6d292fc52aa3b5469168b8cc79b2ddcfe9be2c42adf62dcbc568387422851f334a20b2994b47fa43615cf5eec6eed3a9954d7716526bd96d26118aa85e23c6c82278539874324822b5975c1370a70d5 Padding = EMSA4(SHA-256) E = 0xbd23bd N = 0xd40e4a247dddd8dc32a70a38d287f3fa23aa016b77c8e8e1a98c2f60967a2b7a38f8614066031fb6eba697c367e3430cd8d924bc9eec28529266f690d538ebb4b0381b8966e7224e3c526122afd181d6e3bb6145a5a28d46dd36c1f1da823e0ff38b439c7638b44a127b072543f18192efde9cb381b2e98f4f5fe854e3391275 Msg = 1d4b556abc81b293c22fadd2b48f26da8699c9f56c8184a6ed813e8d39d8c68cbc130928f38b89327f2f0aa678838ed303e984bc27203dbfdc0a9f7465b21dd8e08de7ab1c005d16aa23ca9137c54f0419b01d2c272de741cecb98d6615d4100b14255badee918886c93555b995b4fb5ee74fb0d15b36c75ea4d8f7ad4e1184c InvalidSignature = 425e7ab27d14c8e05f82c9dbc8e660e0f0622db0426a741ef7876b749ff467f0e58043f1664de21881f63c0809527abf401038ca92000ca0c0f6d22d630c995fab4d2661258fd506cd77189d88c4541278cb5a3e0ac54e7dfa431c4700f99157da16e4f87b925368f537362dbffa9dbaec7524de3a1b1d9824ce339788779a15 Padding = EMSA4(SHA-256) E = 0xbd23bd N = 0xd40e4a247dddd8dc32a70a38d287f3fa23aa016b77c8e8e1a98c2f60967a2b7a38f8614066031fb6eba697c367e3430cd8d924bc9eec28529266f690d538ebb4b0381b8966e7224e3c526122afd181d6e3bb6145a5a28d46dd36c1f1da823e0ff38b439c7638b44a127b072543f18192efde9cb381b2e98f4f5fe854e3391275 Msg = 99331af1b3c7f0f9426b4e3d9b30d371f7762e171c02e13b39514561112bcfbc5b7b91a0695d043a0979047fa9901c62be54044a667d68c34b19eb73cb236c5157588811194660e2daa69c5c22ebb0b4a11b5d33cdde7be6cdd5f796962c18fa5473062c0ba98c5a7e9a1dbe506c15d0697442ba9b4ea30c852c6fb1b86e5922 InvalidSignature = 04dc5d566e302f6f1fbc45e4fd136449c399519bc02a212e1df8778d8fbf166a72314260ced82b30950a342b1cfb81574ce652bb781f6c0119a1ae2021cad521887916378c848dbc573c3c7b8cb4f9421d4d79cbf3fe69cf78a0da68c7e704c19b8b9716e415e2c3f8c8533abe3590c3d25f2ee7a5cc46e0bab7492d52db0d4e Padding = EMSA4(SHA-256) E = 0xbd23bd N = 0xd40e4a247dddd8dc32a70a38d287f3fa23aa016b77c8e8e1a98c2f60967a2b7a38f8614066031fb6eba697c367e3430cd8d924bc9eec28529266f690d538ebb4b0381b8966e7224e3c526122afd181d6e3bb6145a5a28d46dd36c1f1da823e0ff38b439c7638b44a127b072543f18192efde9cb381b2e98f4f5fe854e3391275 Msg = 6be1036d728dea34e224ad9218dbbd012cb9175b25f819576cae945081ad2249eda7ba2f7896815d9b5ae36638a4e30e8914af99579e78496c3280224a9c75f01da9fd8bef8b925a1b7e901604ac8cd0064ee836ad15a41225c87713f22e1fd0e12ef50a3f35c43148d8db2ae2bb61508cb1e9b9912446ba81b8a1ade12bc9f1 InvalidSignature = c93724236f58ae9eb0f9c6b4d9326bb17cb53b2433c2b13d8402ec0b4455d7e1ca8d5ffde7d57bf5d7152de6abe3336ddf781b849fa821ec8079d9ef7c9272c91ff24908f79a9a62e88d8fdafe3aa67dcb1759ef54cab03f5644fda4debf537ce6c14cb2d35cc276c9dee09adb0ef29c3ed15189295de153bb20b08c80e7d348 Padding = EMSA4(SHA-384) E = 0x53722d N = 0xcfc4fc3458c4e37c95a3d489a332e08e4019e477c85645c0fe24e25b6fbb2b24dc123ddf9f3220ba965dda6c97856b4821b3f7052453cd6ec8410f9fcb47cd2f4359d896092f8c944b9517c046adedc002219936da1276ca2e7cf43b344d96cf31313fd766f5e84af1d36afd6a46c45c140841579d1dee3907414118e382855f Msg = 40d5b6a7c87573de1cd1960a16abed930b5591fffe17bc7114d1da7048e1e3ea6047e7792007ebe4bdcff3e995da603a1c147cc51a7f543814d5c6c5076fda235d6556d519f78cae552c7795eeb806867e23b8d98a2869c7fd5c6c2ad510d9841d7728431b0cff43ca2e49958b0d887f17ca6cc3b8daa424b9acf4271a8b8817 InvalidSignature = 09e22f6503b81ee8e29e0b6c969b0ab7dbde242245d806ff55891541429a85fe05ca8d21be824bb985ec0aa98d9263d83f8f3ce35f5fb67969e0e77014d9b20936c37348b337fff3433bab7fafcbc429a341371048138bc0726a19b7a4e3c765e89660400e2cd7e1154039fdd8c7d8f0b897f442e5c9bd04d49e1116937a2045 Padding = EMSA4(SHA-384) E = 0xfb045b N = 0xcfc4fc3458c4e37c95a3d489a332e08e4019e477c85645c0fe24e25b6fbb2b24dc123ddf9f3220ba965dda6c97856b4821b3f7052453cd6ec8410f9fcb47cd2f4359d896092f8c944b9517c046adedc002219936da1276ca2e7cf43b344d96cf31313fd766f5e84af1d36afd6a46c45c140841579d1dee3907414118e382855f Msg = 628acb4da4fb0c0b2a632800b3d4f47bdfbb3ceee7c211f48af460924b22c9bdd986ad1dcfa789119d7c83f3c6d4439d4df6042c6984eb0480a597145362f95b775166aa0471eaac9156e0255f86bf77d422376a2bc97d2c6bb9e3979537abb322321d7cac23d7e5ec37651ce4b011105d88fc3194586e7631796ba5786987cf InvalidSignature = 5b9cf3df0c0717027ad0acf508fc0ff4d11ffed402e355675431b8fd44e308944ace9cd66a790ea66f25ddcaa43a65b50304da9d83b7702fd3e9e65d8ec2d73c9669ddbad51814a01a0a306442ae736ffa87fa8bc38cd1484dce14c5474b578ea26d98b47da09efe294f1664c9d9a41f23d8be9aaf3c68c475d793b6c6f8a311 Padding = EMSA4(SHA-384) E = 0xfb045b N = 0xcfc4fc3458c4e37c95a3d489a332e08e4019e477c85645c0fe24e25b6fbb2b24dc123ddf9f3220ba965dda6c97856b4821b3f7052453cd6ec8410f9fcb47cd2f4359d896092f8c944b9517c046adedc002219936da1276ca2e7cf43b344d96cf31313fd766f5e84af1d36afd6a46c45c140841579d1dee3907414118e382855f Msg = 1d39ede43551c1527056d10ad3c7ecac54574d9a989e7b4f010d6df2e827f22a27ee5035db9c2b346894a9c9bd98d4e4d93c40da8d9bedb884486ed682884bafe9bea5ef812618ce78c6e69da8a2519e19304819c70b46aca5eb78e3e1d51e096a8f333db05750c8abd4cead1e4d2b821d19ae7fcd574ed56bdfd1408f7831e0 InvalidSignature = 8a547641db63e40de38a4a9aea327ee84d158e974329a15ce2478d2792fdcdac0d0abb6b61ac8f9bec9acb780298be56975c476ceb125e394b3d16562b03e92fa5f392c72ffcc0b3ebfd67a4c6b80f5652a59bcfc170a7f46c214c099ff287de1cdbbb3e410ac8d27d72c2c5357005a8262f322308bed50c3b67960e5fe0d980 Padding = EMSA4(SHA-384) E = 0xfb045b N = 0xcfc4fc3458c4e37c95a3d489a332e08e4019e477c85645c0fe24e25b6fbb2b24dc123ddf9f3220ba965dda6c97856b4821b3f7052453cd6ec8410f9fcb47cd2f4359d896092f8c944b9517c046adedc002219936da1276ca2e7cf43b344d96cf31313fd766f5e84af1d36afd6a46c45c140841579d1dee3907414118e382855f Msg = 26f567e1af866ce7a2dc22e0a2596df4c60d343f4a91b5d485321b021b5252d6740c1ae06d175a3a4dedb7c7fa2c66b96d3c3e56633212fb55f43d61ab9e7e1f2d250770ba3bd0373c723140dba3b0c9719118413ecacb4fdece5816777350b837885618feb976e557b2b8d4ad88f42cbc54e788452187d8060894aae99970a8 InvalidSignature = b7a051f79fee95c69277cf8eadc867497f28bd9f66df38de5bfee5828de89d9b5bc3ac72579c86abc405b36f5d7ea26b4fdb88dbfbcdc8b756c80b8d0ccadd8e33ea5b5e4bbb9e8a45ce61b4dbc61f855f864d46a2599e1ec5d45901f0e273907a220c00863ee69c74cd8e07f29dda0ed6d519af8c926c2b2b648ea1e9ea06b3 Padding = EMSA4(SHA-384) E = 0xfb045b N = 0xcfc4fc3458c4e37c95a3d489a332e08e4019e477c85645c0fe24e25b6fbb2b24dc123ddf9f3220ba965dda6c97856b4821b3f7052453cd6ec8410f9fcb47cd2f4359d896092f8c944b9517c046adedc002219936da1276ca2e7cf43b344d96cf31313fd766f5e84af1d36afd6a46c45c140841579d1dee3907414118e382855f Msg = ea567b6c6c27320893fb1b63817714739f7169e43e069bc47de660806cf3ea0f710b6c6deb21db4b1693f2052fb778d4d8b7c545bda083e978b5b24eb209ee2f8b4df5e83ce6642cfb43c1fa206dbecd85dfbc1432998fe13a7081e5e0a8999cfec41dc5a89d55150cb2922c9cbf6fc870915739e51847158bbed52c3ef772be InvalidSignature = 0b9e0437a57b4a927e26bddb19a0736ce67ecb210e79f2467a00113bbb773be9da3a1071c0837dcce41abcebc59f5387adf9402e50ed6cf884ad007c12c16e7a97323c150d7acd7a456348fa803d4fdbaa4c9648724d2e68afd18f9b0d4247502b71578afa6d25335565a47b9780687d1997e30ab5ca2e60cb00de5b4a6b757e Padding = EMSA4(SHA-512) E = 0xd8c34d N = 0x881b4401521ea4b72e57a9e3ad152536b2cc0375c5930e9699b8bfc3d16b8c1c3b37de3847438203b6664ee1b00fc7bcd03ec3c240a2cef3f367d8269bdb65cdf4bfbfc56e8fd82cc93ff90c91ce78c402da1c59037997baf56d27abfbfe9d0731b8def029501df0d83bf0fd2234344ec4daee7759969ceb5e24cc00bc12a437 Msg = 541b21710c8956949458f4daac99d96f59886119deb5ee78e861c88c092b287767ec8f84b6df5c6963059ec912c727fd4bdee21470706618f37bca93c577bb521237cd692b110f78c43ee22c5f830b080811066543ab9db74306ba135c757aeebbc68228556696491dcc680a7a15ad17f8ec76133eadbedc40ca3f11b56d8bd2 InvalidSignature = 286dafd4c04495f875456be6adcc9109def4903bdf2972abdef455aac0f814bd71144a0cdc87406d4b08de70aeed47073b70b8cc9332b7965d586af2ac4112bc07680aa9641beaea7f5e1e7e6cda80e5958ce7487e388aad7d3027e769ac6be260deb48f7eaea1f30e411088c684d5291618421212ba18461f87371fd171b25b Padding = EMSA4(SHA-512) E = 0xd8c34d N = 0x881b4401521ea4b72e57a9e3ad152536b2cc0375c5930e9699b8bfc3d16b8c1c3b37de3847438203b6664ee1b00fc7bcd03ec3c240a2cef3f367d8269bdb65cdf4bfbfc56e8fd82cc93ff90c91ce78c402da1c59037997baf56d27abfbfe9d0731b8def029501df0d83bf0fd2234344ec4daee7759969ceb5e24cc00bc12a437 Msg = de1bc34f15b473167a95e1d754f43d94e8109d9c9fc341ba64561bac4e9a8ed67f3477384c396a9e9efb3e169722cba779fef240c41bdeef9f168a5379b08354f021f011f2afcf1a227e81e07daa896a3d939149fd78adcd1f48e4796bb4edb5f88936c3503d2bf4cfc7b41c4cb4ff43fc78819d920237bdab9332056acf5261 InvalidSignature = 1c6399bf074dab80478afd8cd35b217b9f4f7d10f871dcace4bc47c7afdd37da23b9475c7990f883e95db6e4d0254306ba9e95ca847ef6dec86c6084ae78440c2308f2061a8111bc4df3ee133fcc00dedcf8a30bf5adc7979d37dacba566c22996c06ab107f2bc7a0c05bda7eef7742b4abaebb442c11eb41a9f32f57f1698ff Padding = EMSA4(SHA-512) E = 0xd8c34d N = 0x881b4401521ea4b72e57a9e3ad152536b2cc0375c5930e9699b8bfc3d16b8c1c3b37de3847438203b6664ee1b00fc7bcd03ec3c240a2cef3f367d8269bdb65cdf4bfbfc56e8fd82cc93ff90c91ce78c402da1c59037997baf56d27abfbfe9d0731b8def029501df0d83bf0fd2234344ec4daee7759969ceb5e24cc00bc12a437 Msg = 810fcfc108d1c958f62f7a243aaa72420befba69dbfb68278682716dd092bf4e0e74830423d3cd34ae1f5a738234ac08573760f3bfc1bd2f5b4089354e9a20c1f213c7d8ca703d0ab85c93f5700c3e0a2d1f6b94a3c892f5342e4e3366136cb495b44146e5f141637baeceb2ed794ed0f66d80516f5610027a1669710147cab0 InvalidSignature = 525206937a5a77259ef4249350f89d92c1c63137e4b191812a35b53a7cb5cca52b5f697fd302e39a9024b009ff6357d998b2416993cb72c5c836b5ba7de736bc8d07020cf9360f7655443a0282c93beb40bb46a4f5ef7b76590433dbde9914d9b9c455f9353da45cd4192feb8cdce2cd46741682162955ac6db834a42d2f92b5 Padding = EMSA4(SHA-512) E = 0xd8c34d N = 0x881b4401521ea4b72e57a9e3ad152536b2cc0375c5930e9699b8bfc3d16b8c1c3b37de3847438203b6664ee1b00fc7bcd03ec3c240a2cef3f367d8269bdb65cdf4bfbfc56e8fd82cc93ff90c91ce78c402da1c59037997baf56d27abfbfe9d0731b8def029501df0d83bf0fd2234344ec4daee7759969ceb5e24cc00bc12a437 Msg = 44faf422f16b794a9763181c52dbf3066e43ca91d724142ed0044e33e88a93212ae26d289563ebedcc6ff38a0e9bdad6671032e82832e3d6967f7ec2dfb9cd185247af11ced9227c7b4ba2bdb9ccb216563fb82504e10dae0a2c559b39fc0c4122f162e58614497f0ebdccbd3cb4a24ba2960352527aba3f95d57cc5e09b7825 InvalidSignature = 13db3ff9ab38305903f54095045fd95e687a79e764311af09b3c6a265176099c3547187832a0b0d318b0ce9c58b20b67fbf0a8fdb05a656edb46128aa45e1caff3c60a920c2a500ea0c8cf5eb4bcd9a0fcb5acf7ee33268d351aec6551a73b9f9b10f3c9c0214ab549a71a7e248840b09257be2fe15dcbf5766d13f2ef762c97 Padding = EMSA4(SHA-512) E = 0x7afd43 N = 0x881b4401521ea4b72e57a9e3ad152536b2cc0375c5930e9699b8bfc3d16b8c1c3b37de3847438203b6664ee1b00fc7bcd03ec3c240a2cef3f367d8269bdb65cdf4bfbfc56e8fd82cc93ff90c91ce78c402da1c59037997baf56d27abfbfe9d0731b8def029501df0d83bf0fd2234344ec4daee7759969ceb5e24cc00bc12a437 Msg = 83c53e873e548de19a44fa2d46d1db3377b21c0196fb92eb35428cd14800aba0923bf41b5d6224dc6e79439538757c9c50ea2ca721e339d4e111a5ecc42963e86f8769b4af1706346b757685d753b485eb1c8f9514d6009d294dbb51a06e04b302f1c4d99c3bdcf17882b9828b3228f5308f6c53d59c8f50f43cf5894698370a InvalidSignature = 3c0a78c3f98cf8ec68834879eef97b990a69c670b3cf987d2836263e0b5c33d9207e7521c6794258500a586e309aeadd641ff98f4c55a8d9c925e4bdffce15a31c31a0751db6f99c8945beebb259207e4ddcea646e96c57f565f08e87cf83a6e7c1e54dfb4eba57193b8c066a2c5085874446df40e401def7cbab9390c130c52 Padding = EMSA4(SHA-1) E = 0xd64215 N = 0xab2781536ef9ff9714f72313939513eb7c4570b7cbb1f8928576f7c9f7fdde20f5ba770c0c5a7e7857c54335e167a78bf06cea5cd2a1bfafdcfd673a7cee4a2fca01b60c3dfd78527bd1b147dd01426b7f1fb6ab34876f922dce3bbfc60d4522b6ccbf080aa72c688c0a4214d44b371008ed235902d3af3373d20ec2f631720b Msg = 541b21710c8956949458f4daac99d96f59886119deb5ee78e861c88c092b287767ec8f84b6df5c6963059ec912c727fd4bdee21470706618f37bca93c577bb521237cd692b110f78c43ee22c5f830b080811066543ab9db74306ba135c757aeebbc68228556696491dcc680a7a15ad17f8ec76133eadbedc40ca3f11b56d8bd2 InvalidSignature = 80e1846ad50ec6ac9937be11c1d589041fc970344d5997ac3d9f6ed5735392bd5dc3dc626f5b6e49842d79c9cce21527808d8c3bd30048e1f07567c84eed704a8f201ce840efb08e3c860d15db421ab4998f4acb43280e8445ed25b32b6e62ef7b47270e94cfeff31603e609a99814369d2eefeeb88c5bc5a4a8121ecbf37900 Padding = EMSA4(SHA-1) E = 0xd64215 N = 0xab2781536ef9ff9714f72313939513eb7c4570b7cbb1f8928576f7c9f7fdde20f5ba770c0c5a7e7857c54335e167a78bf06cea5cd2a1bfafdcfd673a7cee4a2fca01b60c3dfd78527bd1b147dd01426b7f1fb6ab34876f922dce3bbfc60d4522b6ccbf080aa72c688c0a4214d44b371008ed235902d3af3373d20ec2f631720b Msg = de1bc34f15b473167a95e1d754f43d94e8109d9c9fc341ba64561bac4e9a8ed67f3477384c396a9e9efb3e169722cba779fef240c41bdeef9f168a5379b08354f021f011f2afcf1a227e81e07daa896a3d939149fd78adcd1f48e4796bb4edb5f88936c3503d2bf4cfc7b41c4cb4ff43fc78819d920237bdab9332056acf5261 InvalidSignature = 06e5620bd595f0e1a70aa5d73bafea42eac2a131120919903ad4259d9b2a744d71d22fc2ab36dc1c6cb0d7e9e77335a433b5c4ea285180cd551214022be3d4a145b371f3760c0d0135972b95eb593e283e04c7578d1dd9f38f3f0aed08bcb60f80593aef3b14155ac0eb98d54705f24ba75958215e308949b62f4545e48ed938 Padding = EMSA4(SHA-1) E = 0xd64215 N = 0xab2781536ef9ff9714f72313939513eb7c4570b7cbb1f8928576f7c9f7fdde20f5ba770c0c5a7e7857c54335e167a78bf06cea5cd2a1bfafdcfd673a7cee4a2fca01b60c3dfd78527bd1b147dd01426b7f1fb6ab34876f922dce3bbfc60d4522b6ccbf080aa72c688c0a4214d44b371008ed235902d3af3373d20ec2f631720b Msg = 810fcfc108d1c958f62f7a243aaa72420befba69dbfb68278682716dd092bf4e0e74830423d3cd34ae1f5a738234ac08573760f3bfc1bd2f5b4089354e9a20c1f213c7d8ca703d0ab85c93f5700c3e0a2d1f6b94a3c892f5342e4e3366136cb495b44146e5f141637baeceb2ed794ed0f66d80516f5610027a1669710147cab0 InvalidSignature = 0c18050560c400fe3bc390fff314aecfc926d45d5dc310d1a80ecdcd237d2e97a2a3283c99bc49baaa147bbb82f0e4834f2da7d9ca29bc36fe43033adc0e56bdd1756664241b16664a52d6383cf545f3ecd25be6d450bf82330c1fc020d4f89945186e5347f657aa8cb364bddad0c33f7d94b652197432108dedaa186338d290 Padding = EMSA4(SHA-1) E = 0xd64215 N = 0xab2781536ef9ff9714f72313939513eb7c4570b7cbb1f8928576f7c9f7fdde20f5ba770c0c5a7e7857c54335e167a78bf06cea5cd2a1bfafdcfd673a7cee4a2fca01b60c3dfd78527bd1b147dd01426b7f1fb6ab34876f922dce3bbfc60d4522b6ccbf080aa72c688c0a4214d44b371008ed235902d3af3373d20ec2f631720b Msg = de225e04afc5701bc2c40ac3a9b972fcf04db86353a08db32dec588c346587736463231b39c2a8e22189139f31cb3c9b17cb66dd506315ab9ba7204dadc506142630859bc4fd694dd68da327f46c9abfee79c68602477a4a52c401ff9518edbe0cd0ac0eb73c5c63ca15e0e45b6334715d9efde5d11465983b8a25295326e37a InvalidSignature = 0a2d99a4416e30969e2e6c5cf94603dc1f94936974753ef5513df8e5dc6ae6768ff5b2ba3231e51b45da4dd90233fd136d59e56a2a96c886b1edafbae485c9b6084c88fd09d691c2ebb157f4f71b2f3cbf9290123acf50e4d697bba9b0022f618627a2646ead3b93067ccba82a4b43f8755a5393e5433a00398df0837d5457ae Padding = EMSA4(SHA-1) E = 0xbbb2f9 N = 0xab2781536ef9ff9714f72313939513eb7c4570b7cbb1f8928576f7c9f7fdde20f5ba770c0c5a7e7857c54335e167a78bf06cea5cd2a1bfafdcfd673a7cee4a2fca01b60c3dfd78527bd1b147dd01426b7f1fb6ab34876f922dce3bbfc60d4522b6ccbf080aa72c688c0a4214d44b371008ed235902d3af3373d20ec2f631720b Msg = d4fac2af4fa7a3934afc123e9f3dd0be328c0cd6ca67d6a31f72d67f34773e26e6abfd18c533363e24e6f0cf6c550f75b60883ac980bbf6b3eaa6c07bd785f54a596c90dd531ae76944d993fddc18dacf9833ef3542681e689a102d1bf5235a638438f5727abf584c2b87556998b34ab2685a773a5c1065926e1fea7e00ea763 InvalidSignature = 5782dbf7e801d74532c088c294b69811a6e37e1d2969fadb7b7b18073bcd59172a1a2b4d19eea6c2abbeaddaa80d88a4b21be6abebd040151bd0f258c11ee06bd81db342170f7b68f0716cd1eeedcaee764fff9023d1fa6a8371946b789673c7debbfe9ce63fde4f233f476e80ecbf95920ef19bb22bdb006e4fc9bdb556aede Padding = EMSA4(SHA-224) E = 0x6ba2f3 N = 0xdda48fef7ea12b75d0446ac178e988cbfcb7da998c00ba51a5529cd97cc47f03772e1686fa5c43bb9ea4a62726e95889011439cce1e4b3be4efdb0f1fedd03549ec4d5c93fd6f4fb0219dfbd4b43f1b38428e2bde0cd562a999c77f2e5394d1bc1f375d63af7bfc73571b8c777966bb0fc75ec8167c46972b7844e981b90e2ed Msg = 0aa54f40506682881b5ecb5301199929f9fcce361428134b6ba26e2655b016f3de8686137521d01be574342087c2f132b54b5b26812a2e99a77e2231c1c8bf26ba947301855ce2a40fa97d8b727b56516beb32760e0fe05fb81eca9e46d4ca7484183f94e8dd5f2a8146cf1c2a0d719003257dae229ed3a785ca8ff64b9edee6 InvalidSignature = c8e2f3ae12071b49736553ef634fee2fcd61e4018fdb452d663c3b07432cf1f00e3e59b016663052d92b6311c2ccd3aee1ad5993b2d4660fa79ba5e8bc5df304e1abc9bf06848c487b81e7536e5f13e1db8125941a168fec73fa3c3e8551da2444cb0bfeee2ab9ede128eab718f373e56348500dd4cee900f9ac561b03d5248e Padding = EMSA4(SHA-224) E = 0x6ba2f3 N = 0xdda48fef7ea12b75d0446ac178e988cbfcb7da998c00ba51a5529cd97cc47f03772e1686fa5c43bb9ea4a62726e95889011439cce1e4b3be4efdb0f1fedd03549ec4d5c93fd6f4fb0219dfbd4b43f1b38428e2bde0cd562a999c77f2e5394d1bc1f375d63af7bfc73571b8c777966bb0fc75ec8167c46972b7844e981b90e2ed Msg = 17e9517428239fcf87fa7f461e833d45b9282a255daa9451dc67f5a8a6d96b23e26068b8bd41ab7e02ee6f11ec88e23838a2d8c57d48c1bdc03fd8b9438f9e8c9f3f87261260f3b91a4d5f1a4330dd693dc8c1f4316a9e59554671ebbfec1b57770f1588cf885fc7f79db927cc841620f1234e7a211a136cc3032606bff8cacc InvalidSignature = bd83d910364d07022f775c679110bfbfff38f00f29f984b9f951b440ae9c09477128dcfb0dc6da7c0f214e4c79a73314d7fddcef277781a70ceefd81bab2f9ded7baef76308cdbfa0d2a0244cfefb7c90d61c1f8fa557ebcecfd481a8e7faca060df6af93486acec7608474514b39ae002eb7f2e4a95ba1799ca4700cf92461f Padding = EMSA4(SHA-224) E = 0x6ba2f3 N = 0xdda48fef7ea12b75d0446ac178e988cbfcb7da998c00ba51a5529cd97cc47f03772e1686fa5c43bb9ea4a62726e95889011439cce1e4b3be4efdb0f1fedd03549ec4d5c93fd6f4fb0219dfbd4b43f1b38428e2bde0cd562a999c77f2e5394d1bc1f375d63af7bfc73571b8c777966bb0fc75ec8167c46972b7844e981b90e2ed Msg = 6335ac2fe053d75f7e288705ae77431bcf2e0e29973de9bbb5a89a12b4dbac1a233fb79cf30ae1b5205ba5879486d32e48acd8f5ac9040ca49a579f0a46cdaf466fce3e2bbe2c7b8f82c271b80c12149e8f4894f5958767c36d50115fffb494a7697bb69008490524dc4962b3bcf3455f82ba89e673d94b8c65fb9ea8d330205 InvalidSignature = 8324e0f771e2425b09a6be4945bafcc30f21f6c85cb105ff76009c7c79a8cf6908de6952fa9226123e145186df7c57ca40819a5ef42556bf521771979a5d32f743772693d0c6ee9055f3f613f79f91f46ef8a0817f39bf75d89fde5a62c377d0da29c6418641591c37abd0314bd8ed8f25d4cea6ee00802ab5efd0f683a85f50 Padding = EMSA4(SHA-224) E = 0xb4c049 N = 0xdda48fef7ea12b75d0446ac178e988cbfcb7da998c00ba51a5529cd97cc47f03772e1686fa5c43bb9ea4a62726e95889011439cce1e4b3be4efdb0f1fedd03549ec4d5c93fd6f4fb0219dfbd4b43f1b38428e2bde0cd562a999c77f2e5394d1bc1f375d63af7bfc73571b8c777966bb0fc75ec8167c46972b7844e981b90e2ed Msg = bd550157371c4ec71c10cc7cb467ae6b6ee3759c82efb9ded6ea26b91fc3c5a448c67c7817b5d9250e1b0ba38fdd312c4412d8a9be14be6a5cd7dc196f7aa4f19b1c882b81f1bbb99a953b3766a00f1fc77acd3ca7716061e108085a5f92a22380002a58bcf87eed8a27651f81d7cfaabec45f3d872b262b2d25b263373347a2 InvalidSignature = 9cad4b858d9670d68592544e11e6ffe849051f7d5a5732aa20c2b3d6f8c9648e52a45aa02fc27a4f3614c27d1f9eda37477d2e9f5a323e3ca10998f13d56ca0b46b0a4214ab31f124f81e6448f790d027895b401a11a7f75a82cc06f5417eb82511f5674a36187b2bc3d122f992fa2a85ec2bcf91bcb386e5320dd502e3c9dcd Padding = EMSA4(SHA-224) E = 0x6ba2f3 N = 0xdda48fef7ea12b75d0446ac178e988cbfcb7da998c00ba51a5529cd97cc47f03772e1686fa5c43bb9ea4a62726e95889011439cce1e4b3be4efdb0f1fedd03549ec4d5c93fd6f4fb0219dfbd4b43f1b38428e2bde0cd562a999c77f2e5394d1bc1f375d63af7bfc73571b8c777966bb0fc75ec8167c46972b7844e981b90e2ed Msg = 36337dcd88c66f37c4e3e8a05123aa0e2c65afe538cb190ad6066c49b6d4fbf4edc6a0cd4747b026deda2e47eba33f10dd29dee0a85ad1b560d0dc940652342ba29e36b59165591e219862675be2d74d2076b525780a650b2623ed3b809464bf7d41a84b10295365b4a4eac848e8580b1ed29b7e4fe4be55518a0708cba171f9 InvalidSignature = 148a9f6732c77152223c8f38ead0016ec9cff52302fcca9b4b99ce1f1f093276ac2235a82a6197301ef73f63989600a160cbaaf830a2e4cbd0872bdfd2fbedc2f0afa66c5cdf9cae8062f31d97b4b6647f59bf04a9f1bfe2c55ac4e49142659a3529550be59fffd8669cfdca9e58895caea6676edb17a709e5ba4f01b4343fde Padding = EMSA4(SHA-256) E = 0xffc8ff N = 0x8b72cf259d853597bc0c4b79f21061a3ae12f6e8eb5bde829633ef207aa282fb47bd574a4c6983ffe5687d1e4ede14db5ceb326717af8985c7778888521b4a431b1643b80df1f039601b4d5d8773f91c19239be3709d625174e05e946dd29d4cd58e9aef28946c8811dd1fdd84f9eb2176902ef2a710bb76494c65c37559dfdf Msg = 91b07ffc7a0f56dfd81fe53414f6fc57ae6538492f218cf75f2021bfb746603019414d11bfb216a5728deb2efcc211b0df1d32f7476af8db3ededac31fb235684d119edc243477ca30ccc0ff9da03029ef7784dff43818e2f650b4a33454a80594e71b6392dfa0d57ca30aafe1d7824b473cd6091cd11493ef3f5866e073e28e InvalidSignature = 59811c0f93c7407546a19bf0dccf244b1529c1db5b8a6feb9e4182f4c2974810a97dc85f621a4ae43e45dab7af4fba76412dddfe380785edb2e24493670aaaa9a782f5effb7124bc60f254fd25b11b125584952d32e1db39567e82bd34eeb1eafd3ceac1554b368f61d77762ae3e672c053d20a3af591b9bd27441e7977c0fef Padding = EMSA4(SHA-256) E = 0x6e7fdf N = 0x8b72cf259d853597bc0c4b79f21061a3ae12f6e8eb5bde829633ef207aa282fb47bd574a4c6983ffe5687d1e4ede14db5ceb326717af8985c7778888521b4a431b1643b80df1f039601b4d5d8773f91c19239be3709d625174e05e946dd29d4cd58e9aef28946c8811dd1fdd84f9eb2176902ef2a710bb76494c65c37559dfdf Msg = b1913763b5afa5045396ec7a4dd1fc472e92ced0dbf79abc6b8d499d38132dd23680f0ac8447cacf41d9f7dba16b694c40faba9fb68d64b76bbb347ead6cfccfffe48994b4fdd42bbdb37c0fc0e674b46a5cf9b20506c8264d848d557fea9e93b4c5e9646d592ce06f2d645cd1ca874653bf7551f1e82cd2b8f03c6ad9157ce6 InvalidSignature = 411df9bc426d5bf6ca6e12c564ffaa52b1770cc96bc670e9726759b1bef233a7b6ad24d79545eb78f3a1318881bf65e886563918521350e125b957eabea89d0e487f7b963767bf1725c6a4c6544c734600669699ec2b7fae5a01433dae3c148d5824031209c754fcfb0a2d9702bbcf17bf35cf9f07b73ea6a732c3531a229471 Padding = EMSA4(SHA-256) E = 0xffc8ff N = 0x8b72cf259d853597bc0c4b79f21061a3ae12f6e8eb5bde829633ef207aa282fb47bd574a4c6983ffe5687d1e4ede14db5ceb326717af8985c7778888521b4a431b1643b80df1f039601b4d5d8773f91c19239be3709d625174e05e946dd29d4cd58e9aef28946c8811dd1fdd84f9eb2176902ef2a710bb76494c65c37559dfdf Msg = 58b262cd0a0859381541e24340169e9bd8b3dddd52c5644e31d56ecb2bd4f00387f721e3c9c53a52916e7a1fc15e6e37de126f1cb92a6c924ec0ea9cecf948a696d94804aa5ccb9bc0c2dcded52af0fda9626c5865fe683a81a7b3c4e5b617274e02de17f4f5947c6ae60f6ac5a2ad53004cdd7b9f68e1ad9332d22d5e34e4ed InvalidSignature = 56ea3c128c5d3c6342c45a8eb5275a518ba00aa2a6e177fd855abbf35386835773299af0809c049c48ab18b50ede9cf2d84650dc33b75d11e6e607c5e05d3052c0cb513ab62114cf9d850a1117ae655a3e5b54149b7089aea33d38bf673d04868ee314e858d981a31967178471ed93d350590fafa337deff21c0468aefa4bca2 Padding = EMSA4(SHA-256) E = 0xffc8ff N = 0x8b72cf259d853597bc0c4b79f21061a3ae12f6e8eb5bde829633ef207aa282fb47bd574a4c6983ffe5687d1e4ede14db5ceb326717af8985c7778888521b4a431b1643b80df1f039601b4d5d8773f91c19239be3709d625174e05e946dd29d4cd58e9aef28946c8811dd1fdd84f9eb2176902ef2a710bb76494c65c37559dfdf Msg = 45b73d8ab4f335e03c0154e92e467bd390f817285b83f64de72b594fa3f34ade09be2f9ad1b5a08e65e876fa963824568d744b9304c288a4b641913d13ec80db39c26e04202444d0147ecea86929114e6a90df1d9292a893ff28930c2348cdd0bd0921500707caad3109857a0fe1eac30f94fb4e6dbbfe20aa2988433acedbc7 InvalidSignature = 66090f92daa94f0d03bc2cee8b21140d5eec31bf90d096ff8e3f23bb29662cc36925e1db46e9c91de5bccb209f9dd9d7ec8e3f0496dcc72191238327eeedd19c40325f74e04636457485c6bab62d1a75c78dc8e841d1f2dc33afffa9acb7a44ad4bd5a0038ee2fec8c5d2e060fff412e88f4dd25bb90e2a3f46a6e378be209d4 Padding = EMSA4(SHA-256) E = 0xffc8ff N = 0x8b72cf259d853597bc0c4b79f21061a3ae12f6e8eb5bde829633ef207aa282fb47bd574a4c6983ffe5687d1e4ede14db5ceb326717af8985c7778888521b4a431b1643b80df1f039601b4d5d8773f91c19239be3709d625174e05e946dd29d4cd58e9aef28946c8811dd1fdd84f9eb2176902ef2a710bb76494c65c37559dfdf Msg = 61bd546bc549b962a8868d7ec803b95674a812b4593cd33e98294a561b84d13e2848008036e2218d00f3e4a4d95155f53f4f0a07b23ea157c7336a42780b6024bead5ec2628f8fe50f7c2748ad9450b4ea94676a195769c1409da8106c0cc3ce4874d4f8ee57ebb3fda9bc33ecd494db9eff92a6369013c52cef6e8aa18de284 InvalidSignature = 1ca0b712162c8f1ef2c443d7caab390e844e0859d337dfa4c42f17afff26fea832ab4d7bf1154ccbb88f7220bc0fb6980506d39b8f8126acb1cb56369f799164ac9ab702074677abf3d6eea003072b49f70f3a9d11bf3cdbf5f4b6adae5c5b6cb4b75af5e1a8865fc1bd9b09ea35a5274c4e3d62afa575bf85bdb4d87725ee84 Padding = EMSA4(SHA-384) E = 0xd4bcf7 N = 0xecd6bfa6bdfd753f6f856db12da04af254dbf26e56623f86c06031bdd60124544ceb56e4dbec53740d231459ad3767bd202f857e88e4d767f04574329aa51c414f4d4c52edd021850cb1b6a4bdc11be1ab63b9da3ea1e80db05eb8bb4f1e801fbe4b7a9d53226dcb8a4cc6fb954a6c44802011ea4745c75ba6d82b50e3243aeb Msg = a5e2ce04a27a898b29d3f51c2cdfcfda59674975a94f4796361ccd7e4cb3b8eac263ad398b2650d08824b6bea0791c9c1338d9b70bb0917275eeace50e8306cac187e89a30dd38f391b9ec3dbb60c48d802f39c93edfb10eb107f44e0be2e33e4753686fba26a9baeb9981e2a41b3075495351f369640d3293708f016b5bb70c InvalidSignature = bef3928d30828d0f473d1bcadb04c4bc636362f82bfed5a3f5caf3fa1d50fcff15ceaabfde593f997315b1163c03f80c5f668e32edf24cb4b9f0ea069f9cba9ee4c234cb3044222310046bdb4cdf003033de6a483ffd36f01b1bf205fd79b58394f477d4eb88f6e4e2b2d3aaf56a9a44c1f5a377ecd755dc71812e205e0cbbb5 Padding = EMSA4(SHA-384) E = 0x59c0d7 N = 0xecd6bfa6bdfd753f6f856db12da04af254dbf26e56623f86c06031bdd60124544ceb56e4dbec53740d231459ad3767bd202f857e88e4d767f04574329aa51c414f4d4c52edd021850cb1b6a4bdc11be1ab63b9da3ea1e80db05eb8bb4f1e801fbe4b7a9d53226dcb8a4cc6fb954a6c44802011ea4745c75ba6d82b50e3243aeb Msg = a8a186db7f996a09a652fa6c82eae8be7886d7e75ef46dc2308faa240563781b419283730bf74a7f020877162b016bdb2e3f1ec1c3e926cf67d6152153ab0830ae447d5302566585ed527b68198cd38a6d9cb6e78504adb06014dc4b590b919b597f1d814affe3a3cff6ae6c32d248549e6648618e8d2bed8511a6ab00cb3be5 InvalidSignature = a5f4ea68ef0aeb4b95f166f500ad95ed68e876743add1cd884c92e8c1e5dff02e3c5631e244efd8708150e1bc1f848d338bccd7d3c74099bc4e88618349fc3e51b50c311eeece26f21b63fb3d20ac52f4f20889f148bafe24ffb5a5e913b83849445e163c4b0777e78cb1420848936953a58b73d61a74ff9e195fe9c8a989f79 Padding = EMSA4(SHA-384) E = 0xd4bcf7 N = 0xecd6bfa6bdfd753f6f856db12da04af254dbf26e56623f86c06031bdd60124544ceb56e4dbec53740d231459ad3767bd202f857e88e4d767f04574329aa51c414f4d4c52edd021850cb1b6a4bdc11be1ab63b9da3ea1e80db05eb8bb4f1e801fbe4b7a9d53226dcb8a4cc6fb954a6c44802011ea4745c75ba6d82b50e3243aeb Msg = b47e91f13b8cbabb48637ddbf28ad8a44c9c823df2932403e146c6298c3187a12c759240571f4d1dd4add43aaecfa566876a9d612fe223427599a3163db33ecad31dbf4b7fcdd1eb5a4b70075f709ee6c56d57e58d10c6d15743b99579d65315527e0059dc1daeee81433b8930f529eeafae991033a4777a2e4cf2ed68202f4b InvalidSignature = 6cb1e5a178a8f5331e7b93ade2ec62e75613f5b93b1c82a3c13f0d950ed14f1f679cdb0c3d11d431005f4152e7f19347f0daa308652aff6d7d2c162b6486cbe8588ee1e8d3a6e8a5cef12ac61c1f69ef88ca70c8c600820075fe844a6e4d003e722586684566b17b51438df5e9ee2a5272add516430beac83704ccfe9f3e32c7 Padding = EMSA4(SHA-384) E = 0xd4bcf7 N = 0xecd6bfa6bdfd753f6f856db12da04af254dbf26e56623f86c06031bdd60124544ceb56e4dbec53740d231459ad3767bd202f857e88e4d767f04574329aa51c414f4d4c52edd021850cb1b6a4bdc11be1ab63b9da3ea1e80db05eb8bb4f1e801fbe4b7a9d53226dcb8a4cc6fb954a6c44802011ea4745c75ba6d82b50e3243aeb Msg = f5ab2af81fa31cd0c85348d948475b195bd3a5b26c4b7ab71376d83edc4149b74ab10b7c1b1b6fa9ce977f2d63b2e321626306591e4174393bf287ca6ee7420d84467d90a628423edb05787bce6cbe71d2f89aa4237fd3cd6e8c1be59410f180ac54c65c47325f3af7857aec12deb4b0b379aabc026f5f1ab52cdeb6d72420b6 InvalidSignature = e1c4ae4f01ae882268b35f11cec2b112816063506ef8d1934ed7f3ad76b7a12a663fb965321886fe7eaf05abeba8bb57e44c9937ecf0515862246f737abaa80a127ba32e78e650d236653d36426589e728387f1adb8001b9f69007d5b2d504ef5c534526a60f6b53d006c7ed0230a7ec9c09d80eb22a7bdb07f354a0292c0e22 Padding = EMSA4(SHA-384) E = 0xd4bcf7 N = 0xecd6bfa6bdfd753f6f856db12da04af254dbf26e56623f86c06031bdd60124544ceb56e4dbec53740d231459ad3767bd202f857e88e4d767f04574329aa51c414f4d4c52edd021850cb1b6a4bdc11be1ab63b9da3ea1e80db05eb8bb4f1e801fbe4b7a9d53226dcb8a4cc6fb954a6c44802011ea4745c75ba6d82b50e3243aeb Msg = 31aea9d1beb7bc4f5fc7f5a49f8968654fdf7c2d32c84199fa87039773021fe1ff6815c44216df261ebc81c7e2bbe2c7bed2da697bfa8c16688ef6a598afc6d94ae76f2ba90c7dcab66825e182162118a0afbb5dda2727e423f1156ccd6a87c5fc74e08f5b613e440d140a79e762ce60dcbe4692b816b90b12f889767bf90aac InvalidSignature = 103aa0873b0d2045b0867c084fa7e253c0119c91ad3c8144156b61f36fcda4a5578f515bf70167a1aca05b8fd168287bba88558932d54b218e822bb8c657067955c78ef3f97f3fc73d1c9ad93c31123cd519a17a82c4afd2bf915907433be789b302a9cb7cef11e93c07d35961ad827971221a0a3b26eb74445e6ea0db338b8e Padding = EMSA4(SHA-512) E = 0xebb1eb N = 0xb0ec8da8b8d87c94443202a94262afd545d9187d5c45111e7b246da630b1aab516133d6d9c8dbc98ac27d09843f452063f2f577c997e56da01f3861e123c842ace49ec71622c3d6cf54d13bb542d9a55a0be0fd79a65c4f72f1539026cae2e48026e3282e24a8c31e3e699deabd41d31461f6a7bd59978dc189077d46f9ee27b Msg = 537427fc226d46bebf3264621d7aa97b5686a277ee579f745c1e5955c6f4d8150dcb945c09a4db50160372aecfa07f191960a6b2648373e82d1ff892c7cdb73b5ca2c2bc2f61201123ee73658106d86ff62e0f01dbe9dcdeb92eaccd0d197ceb48e1f7451a0adea6f0dcadaebc137c24f4d8238dddf0a1fe0934bf2e1e41f0cf InvalidSignature = 4ac98f889b20bec85506523c1f6603ef0acea62d294e4f769b3a4be02091c246b186d23e5f22cfee7c3864f19f414c2760b30a725de04ed2bcc93cf871adfc94ac9a1282cca0d3670ea27a7ebc146d3981c6a705fbc7738f96adadf5411b44eb1c41ac19fac996a35a79ad34ec1d6d10ab062bb59d92bd9cdad7500864c6721c Padding = EMSA4(SHA-512) E = 0xebb1eb N = 0xb0ec8da8b8d87c94443202a94262afd545d9187d5c45111e7b246da630b1aab516133d6d9c8dbc98ac27d09843f452063f2f577c997e56da01f3861e123c842ace49ec71622c3d6cf54d13bb542d9a55a0be0fd79a65c4f72f1539026cae2e48026e3282e24a8c31e3e699deabd41d31461f6a7bd59978dc189077d46f9ee27b Msg = 3151fcca24364d0fe8733e86e2a6806c6c935a3c27249dcf92aedac8dc76d22ff7742e5cee57711778c92afdcdf36e26b8448504ee6ee48e9eb25b9e495e9098d494ac4ddc4c541f499cdb652638b611b0353090ac125ff1fef8564a78419c57f038dd65951fe06e8377b986947b407579eec1a60a16f540db0931921027deb4 InvalidSignature = 9875f7bb194c63b53a38a06524b2d1300f1b3db33bcbbc6fafed33ed7f49ab2bfb0a4a085bd4e43e43515519aec4f05578bfd9639eeed5c57f4eff0f0fcb4bc1d21ff0d18a671b39808b72b26651c93515ce97358b850840a7fe4c513a05476ee447e464183793f92aeb1a34b8560f590e541c7ebb504f6fa839db5b59a92faf Padding = EMSA4(SHA-512) E = 0xebb1eb N = 0xb0ec8da8b8d87c94443202a94262afd545d9187d5c45111e7b246da630b1aab516133d6d9c8dbc98ac27d09843f452063f2f577c997e56da01f3861e123c842ace49ec71622c3d6cf54d13bb542d9a55a0be0fd79a65c4f72f1539026cae2e48026e3282e24a8c31e3e699deabd41d31461f6a7bd59978dc189077d46f9ee27b Msg = 390fb4adb6b1b14c59872d1584b5d1e2378fae4a3efe1923a725b9457944de91a3dc14323314f923c85b4bf14a4f45c3d8dd2c9702aa25ce39b249eb8330fb9874bd79ea59bbb2e5b6f45843f37f357152e4c2db247ff6693d2a5c49a51668f090fa0b5b9070859b0a9b7b90e70e49f58be9999c0b4535fb9ad319e845bfcda1 InvalidSignature = 5df6894b07078bda9a4b3da89c7e92d98d66d3e67381adfb8e1a2ce8cf572069a42d1ebd39cef5bceb399c8e0823d25b594dfaa8bcb270a9281384b62341e91bcd9b25252dec25aee0c71085fc21cad423f65e144eec0d3e9a700b8bf7e92ac06e33ccc70f2bbec5f7e355fe444abb0acef58cf978e10a4a953a6ef0d48214c5 Padding = EMSA4(SHA-512) E = 0xc1ddcd N = 0xb0ec8da8b8d87c94443202a94262afd545d9187d5c45111e7b246da630b1aab516133d6d9c8dbc98ac27d09843f452063f2f577c997e56da01f3861e123c842ace49ec71622c3d6cf54d13bb542d9a55a0be0fd79a65c4f72f1539026cae2e48026e3282e24a8c31e3e699deabd41d31461f6a7bd59978dc189077d46f9ee27b Msg = 83d4b9b338fda00d34270963c6f35c854ed58ea8fcc7ffb8da3fa3f00d5e61a7586ab86de17ea8563880d0969554d44e614f01a6f8ef341caec9f71c10c2eed06c82723993267b7fdd35c3856ed628c1b840524b41719733a6231b18e1fc3cf6c7052d40d45de02f2b2f2a59d9e122855a8ecabe5eb7f1a6cd35570d087213c2 InvalidSignature = 02908246b1501dba9daf82750fddb095f66ef66e8b26fea97ccdb120a7c9f5ae0faec977b37d2a7c3c4873fe98139d85e2daa02bc9df1213f78c5417552cddf3844952a4295a6babd59822a824fd3404296532a2e8dd004244bf95ad2282319ac07e31afabc092c25bebd23d29d748e60cd6f8c5fc0f365390169b3a8da1e38e Padding = EMSA4(SHA-512) E = 0xebb1eb N = 0xb0ec8da8b8d87c94443202a94262afd545d9187d5c45111e7b246da630b1aab516133d6d9c8dbc98ac27d09843f452063f2f577c997e56da01f3861e123c842ace49ec71622c3d6cf54d13bb542d9a55a0be0fd79a65c4f72f1539026cae2e48026e3282e24a8c31e3e699deabd41d31461f6a7bd59978dc189077d46f9ee27b Msg = 3150fcd0fee48e6e623e34a588a99cb5c202bd0ad8bfc863a0305b33ce05f8470e11b7aa504d37c66320dacbc6dd3255bb8eb6499cf0baff72be9ea7c43245e5adcac8bf31486cb9d1fcd23e5d456e420a563a26c536acdcc60ae54b67972bf5370399d74adb1590d45b83c6f6e938c6d8e2b26af8998640c29d99e8603b93be InvalidSignature = 73e59071308a443d194c43ba89bc5700e0932699b8923a2a8491db20433d90c80289265cfce1cf419b83873bc5adadf42dd26d367819ddfd5110c31e7c1fc7b86f94e782c55023e21694cf05eb08eee9838cb35081847c7472840ece7252c2404d66f173f6c6c74db5f9d247d93f1ed077f37e574804a7dce99c03f393149fb4 Padding = EMSA4(SHA-1) E = 0x645c29 N = 0xc4b9ea11f21cd93c01f56c4219db7d2e52581a6c968705c06588c036b6f51a27de43ba0006d6e54d9ee20dd8bc1c4787b4c45e9545cf98c7872100f6c3492f5c3f1ce2d28caf10fa611cc4a4ec94543fbb872ef0fc8bb9558360960e4e386874d3beef4e9662e8779304e8d09bfc290a6fc19e9908e8eb49336ef02224107bd74de231f2610d76fa834baad342e87f5ffbd56ee8b459702425109af864401b713cd9e96a01137a860c3079e13704d3328003136631062b198be8d644ed99a0c62f94cf7971a0f2875592f35e362abcf2845a11ee98e5f01a515abd0d03646da28123b45cea4cbfd7de9bc399fd9f05349a2d0386516f70f5c9a9970d3231ff73 Msg = 6c0e15a99f9948d41980d7a37a327eb280c70a6b7b9f6bce01460b6ee29b5ebc5e32bb8896f66ac54113fe8da013e465b4463dc1ae68e9cba77ee4609101d65b6e3ee517c0fdce2f40613488d20f3892b99249ca07ff3d8458d4a1e7c0264e3902fc3d5d03f69d997e32229df86f9fc1f773d78f6fab91817d12ea0b5753efdc InvalidSignature = 573cbed450f945f56497273fc3c1731d6198067ffa30047e38d1e6afe0aa643ae051b6a19ed64ec81a7621045492cfe8ad18c98e58b6238bc77c24186290dd990926a9fa6ce06eb0891db942c07b44fd00457cf277b12dafd0d636766456254b02087d0e05253f1fec4cdcfd65885340b6c6ee46bea267aab3895cca4ac8dddf15ce1157603f272551c47d792709e94a894b236bebda73af22d840c34d59e5ebfac5ab3f52cfa43398dc14113f45f5ea5c1f1539dbb7cf70bd632931fac73c26bd28b9301338a22aec43b8f7564736543af56198f962fc30369b50caef1eda10806fa70dae5c072f7f4ed1fc21e89d7986aeda084b5c4b8e51a2d9275ecb38b1 Padding = EMSA4(SHA-1) E = 0x593d67 N = 0xc4b9ea11f21cd93c01f56c4219db7d2e52581a6c968705c06588c036b6f51a27de43ba0006d6e54d9ee20dd8bc1c4787b4c45e9545cf98c7872100f6c3492f5c3f1ce2d28caf10fa611cc4a4ec94543fbb872ef0fc8bb9558360960e4e386874d3beef4e9662e8779304e8d09bfc290a6fc19e9908e8eb49336ef02224107bd74de231f2610d76fa834baad342e87f5ffbd56ee8b459702425109af864401b713cd9e96a01137a860c3079e13704d3328003136631062b198be8d644ed99a0c62f94cf7971a0f2875592f35e362abcf2845a11ee98e5f01a515abd0d03646da28123b45cea4cbfd7de9bc399fd9f05349a2d0386516f70f5c9a9970d3231ff73 Msg = 064206831cd415425cdaeb49ee727dc90e74917f55a723883a340877d85ad1a5f264f2c834d824c7bbf207cdd8500c9d11ef922569564f55e211f2313f6106250e321a99e64d1fc6eecf11c89edadaf4ca8a736bdc2b4cef61a9eef6c747dffd6494c51fbb9ccfe6fb5b5161c977ae773f2e7b7a358ce100bfe243eef67521d5 InvalidSignature = 385b551fca5e32d9e3ddb5dca31464b14cc4303688c173a43e13a8f036a9c9184d5573122398ccfc5f5eef01c3a0b29d25aca8e388f6cb84720bd6bdf32da681d431b6de9feadb4631ae7fb1e2aec9a30b99f82e620246357c4588b0b975c0a3f6797b71dfa741dd0150f9b614685accbb7609a5c511be4d522631c3f9c84e308c6e7034fdfd78da43eac1d45983c653eb57677d71309588cd18b6223024c2289c8ff5bc62cc7143de19c446e56c0e95245e84899972832beeaea36e5010e9bd7df8ca0bf464bdfea13ac4ea1e57ffe8f7f65a5e66bdccba127f08fbb808d4b9a7288b7f3f2a42233de496833cec587f360e135a7051a0a9fd24d9bbdf0fa10c Padding = EMSA4(SHA-1) E = 0x593d67 N = 0xc4b9ea11f21cd93c01f56c4219db7d2e52581a6c968705c06588c036b6f51a27de43ba0006d6e54d9ee20dd8bc1c4787b4c45e9545cf98c7872100f6c3492f5c3f1ce2d28caf10fa611cc4a4ec94543fbb872ef0fc8bb9558360960e4e386874d3beef4e9662e8779304e8d09bfc290a6fc19e9908e8eb49336ef02224107bd74de231f2610d76fa834baad342e87f5ffbd56ee8b459702425109af864401b713cd9e96a01137a860c3079e13704d3328003136631062b198be8d644ed99a0c62f94cf7971a0f2875592f35e362abcf2845a11ee98e5f01a515abd0d03646da28123b45cea4cbfd7de9bc399fd9f05349a2d0386516f70f5c9a9970d3231ff73 Msg = 624ef431a1c81e279c7f3e37609ee57c27c44333ceaa3e7a8905c658d6ae62feaf000f4c04814b9768c56daa0b90370ae83bae7f3f5929cf469aa9cd1cef6892feeeb50bbd79feb46f9a2fa265b23bc75ed3f772fa6a2f157221f44b85033319b6e18c74b4f560041ac62c28584b163af153c614e82577d374634edbfb34ea1b InvalidSignature = 3162cc1bb742edb6bb18211dc80a5fb1ab196487117080580c2f28059c64fb5aeddf40d98b2cf95024f8dd9c1698f06572f7f1682b67868749d33bcb678a3dffb9e4bde290d256c7090212844ff279906291002bff161b30e256b7e57a65f5c89273956a0a92e1482a90dc8fb2707cb3b64497c6ed40bf89c5b73de759a8a40e2f95943aaf6ba80946704f9171eec6d68c11f4158bc29141bc1b31d8ccfc62e9f4221dcc4451fb4c1619765aa230cb3c487bc9a055f61360e9c42e938f16e38fa4257443b0939c7d5506c4652c750f22788f6db34b0df54c8bb1ed75650f7434779041abe1b70c403933beefb3d22892849e00206d01ed74fe1376128a41e19e Padding = EMSA4(SHA-1) E = 0x593d67 N = 0xc4b9ea11f21cd93c01f56c4219db7d2e52581a6c968705c06588c036b6f51a27de43ba0006d6e54d9ee20dd8bc1c4787b4c45e9545cf98c7872100f6c3492f5c3f1ce2d28caf10fa611cc4a4ec94543fbb872ef0fc8bb9558360960e4e386874d3beef4e9662e8779304e8d09bfc290a6fc19e9908e8eb49336ef02224107bd74de231f2610d76fa834baad342e87f5ffbd56ee8b459702425109af864401b713cd9e96a01137a860c3079e13704d3328003136631062b198be8d644ed99a0c62f94cf7971a0f2875592f35e362abcf2845a11ee98e5f01a515abd0d03646da28123b45cea4cbfd7de9bc399fd9f05349a2d0386516f70f5c9a9970d3231ff73 Msg = 6305a7c4512d7d903eae65dc8e629c81060da681eaef9240659a7ff12a025f4e5cd3fb8cac07388ec1b79859dc3103c8bc4cc880bff8df274b1971d16c9699bbbeac6d3c8e8938f83c160a57e31473363c6a8bdcc0bd352f0d42a5278bd020844f3a03bc40db07387872c3bfed3173335010f77b35671fc075bc25dcd0d97b0f InvalidSignature = 40e1afa3895d938a9738791578a343c96095db0e72025dc2f80fc94a64143425abd96b9a3b5d039a5645c2fc6e70bef64a3deafd9eb6dec041c49e04f86d038a61719364d4f3599f13a8ba047c2f88a9638c75176ec15b26b3b37530441a120e8431ceca4c63c592789a1db9bab49959d593b273823bbab46b5178a8d1a79e7f93c03bb0468d5f64e5a0f5c607f38d4106022e4eeddb34ed457dca40a4f25fd9cb68d497b42d961091e4a06e6ad70a2b76caa8e267d54f8ea9aee85d4f8fa510b5ea8ac9b458eb0556566e8a71145a733897e0098dcb540dc4247a0f5f8b1e9735a636a4561e96141e33d3beb629eb90613c0d23f8330d3ceefb11e19518d219 Padding = EMSA4(SHA-1) E = 0x593d67 N = 0xc4b9ea11f21cd93c01f56c4219db7d2e52581a6c968705c06588c036b6f51a27de43ba0006d6e54d9ee20dd8bc1c4787b4c45e9545cf98c7872100f6c3492f5c3f1ce2d28caf10fa611cc4a4ec94543fbb872ef0fc8bb9558360960e4e386874d3beef4e9662e8779304e8d09bfc290a6fc19e9908e8eb49336ef02224107bd74de231f2610d76fa834baad342e87f5ffbd56ee8b459702425109af864401b713cd9e96a01137a860c3079e13704d3328003136631062b198be8d644ed99a0c62f94cf7971a0f2875592f35e362abcf2845a11ee98e5f01a515abd0d03646da28123b45cea4cbfd7de9bc399fd9f05349a2d0386516f70f5c9a9970d3231ff73 Msg = 1c9c81544661aab0ec7f6296572cd608cca51f55b4c47c48fad5df9fb5a6acbe07ddbda5448ea920570d463d62016c03a5bafc61a1c521657dbdd6afa863a924c0f1bee7b3ac168524b9116f103132aeb17823d2a2caf92b4516b83c62101a6d10828c00d9e27a46192acc13a7e4b16fb7849b8efffb8b0319898e3029d38701 InvalidSignature = 7a5da603b9e8af2fe8787abf9496c27324fe31e2967cc6451898587da67c337cf03cea8a528465649f76da77ed4b23b956be317ae3929aeb0664ad06a6bd83a9228c7a31f14fe54b879b8019e4622af59d31c7e4924ebe0d6260ff83013f2f684dd34671cdbbb9b9937f5d8cbc13d222e3809a757d4168d7210039fc4edde9fb23e27363848664ba10a750a7c3f3e06559303762acff5c1524b369f5fc8b0768c4c465a88720cdbba36ab49cbd6a95d4cf15c45084a84d7f88ab61d1546cbe1d56ffb29e9ef80115f67c8a962a31c6d4ca742ace4b53667ff9bf44f7a1da87648153e26080560bfe82204bdee00a7db0b14be0c00eb29a4e9311f620cb81e314 Padding = EMSA4(SHA-224) E = 0xb29bc5 N = 0xacfdfb1dcb1459b489cd4a8c9fab64a7da4f044bef1c506f0872e9476f3357abda509d9fb1db6a4f5306c40c058826253171cfedbc160776a48ec35b655bb9963286b6aece1c77dff987a0aae9720ba035dda67f317101bd3cd4e6caac867a8c38b87067938e96e72df1875f94e43e4c06f7a86a1dbe07836ee69763eee29bc13ca906d7740c29e651872a9ec7c6237f7c8290bb0800a030b323d09e7c903751d21a224266f9d6c94c17a4c0cd8175ea67b9d9020f2b3f31a96206084cddb2acef70b11ae25a46c4f6817c4813466d7cac76b27927145bd499ff87f22a946b688e980a00a3d54c72ab9c2c88a55a3ea4c6784068673532737cbe4799e98bd711 Msg = c9a121fa15bffefb864fe3cfc2b1bf775886be3ff5151c40daee3c288dccf43ecfc02ba0cf8ca7cf9d4d206ee15e9947cd78f08f501eb36b8d3835b38bfee1f52e17cfbd66029513a6b66046988543e80f46ce1a3db3e30a2610c5b9540e7202ccee33d842e971cf89d0cadd4df0646204388167229e54238cbe14c450c44e6c InvalidSignature = 7d081b0e38d73256476358c013908f3497810ac4bd5d76252f3ef440c5742ea552ef5348eccf6ef13afdf616288dbbf05a5b25e66a8745d9ddf66639ca89366e28062529e80b655b0268e922c8d77eb8ceee830fa14c15238dc1442dfdaffbf92436c794c24f6104374bf131616bcf4cca12608cee203e7eb0eba04556a0a0ac3dea9fa39dac8082e39f9a739955e036d0636008f5c3c4f823a5e6e5229fde6b94f986520de9b9a77ca34ccc0236762c77e33e105a9346553dc0e4469d3929ec38e8813a551af26b0f7d9dbb12d40b7d9fe195948e1ea1245362b01faeb4157605a9ab5158a7bc4df644f12121b03ee22e9f23fa5f40067b333b865bf3e41244 Padding = EMSA4(SHA-224) E = 0xeaf989 N = 0xacfdfb1dcb1459b489cd4a8c9fab64a7da4f044bef1c506f0872e9476f3357abda509d9fb1db6a4f5306c40c058826253171cfedbc160776a48ec35b655bb9963286b6aece1c77dff987a0aae9720ba035dda67f317101bd3cd4e6caac867a8c38b87067938e96e72df1875f94e43e4c06f7a86a1dbe07836ee69763eee29bc13ca906d7740c29e651872a9ec7c6237f7c8290bb0800a030b323d09e7c903751d21a224266f9d6c94c17a4c0cd8175ea67b9d9020f2b3f31a96206084cddb2acef70b11ae25a46c4f6817c4813466d7cac76b27927145bd499ff87f22a946b688e980a00a3d54c72ab9c2c88a55a3ea4c6784068673532737cbe4799e98bd711 Msg = cd69ac8d1c46f54d46cc9aff98e078521357a36177b91392a0459abe15351993df43f437976bc32ec3f34b7e63a9ac11c66cdb5aa2ed533c64b70827c56d9d849e53d653fd10501278b370e1c1f399e57bbba2ea4ce6874c34475e171dec8d6db3a33b2875be04c10c14f171dc48a795da4ede579d2a158bb7fb84d745395317 InvalidSignature = 5725c1ac60b2d610977fae6c52a94155d687d575aa2f5cee817dbf77e1ed692266c0ff14a2105b343dcbb075c43ee6a839a64bd1d151d3801e62f9d76c8d94787c29d1e88ca2ea7f23d7ffe1aac3d5072f556a8087516df5dff9fcde5b0e849d08f1b42707d2cda2eac462bc8810737e03d47dc8240db73c3ccf7106886f8ae9c4c36473493cb5242e2d70bd5c36be35ce1e5aa5286d6439b247fb64ba06af222b133f05d39e6a44a1ad6ad567b9e0b5655486af0b9cfef1d714f311dfcd983bd90674f964f64243be02feb3a202cd5f945505826fda112bba3e5b837bdcb9e974953ee7b1ad7a6e21a0a64268d52eaba083c6719632c21e6615fe4395ce3f53 Padding = EMSA4(SHA-224) E = 0xb29bc5 N = 0xacfdfb1dcb1459b489cd4a8c9fab64a7da4f044bef1c506f0872e9476f3357abda509d9fb1db6a4f5306c40c058826253171cfedbc160776a48ec35b655bb9963286b6aece1c77dff987a0aae9720ba035dda67f317101bd3cd4e6caac867a8c38b87067938e96e72df1875f94e43e4c06f7a86a1dbe07836ee69763eee29bc13ca906d7740c29e651872a9ec7c6237f7c8290bb0800a030b323d09e7c903751d21a224266f9d6c94c17a4c0cd8175ea67b9d9020f2b3f31a96206084cddb2acef70b11ae25a46c4f6817c4813466d7cac76b27927145bd499ff87f22a946b688e980a00a3d54c72ab9c2c88a55a3ea4c6784068673532737cbe4799e98bd711 Msg = 23708e055e891826f8011b1f48a1c7ad24b5d008f9c91ec31ab1c5f358cc3793d389b927102913a04bc78c800e96153e026bc5ec067b85177e650defed730fa7c71cb11f80ce41c1e9eb24a9bc121008759f7cca6475547601fbf0567f6447d9a4346035d7ff0a507b74cde17b9b20d2265bdcea3e3ff1a84b7a5872352849ef InvalidSignature = a8cbf34ffefba916abf4961a6a1032c01bc4aeb8278ba42a18f4f67fdfeab49ebb05cc289aba475a9667649c6ecf6a8ca17ad81f17d5109807c2b260ac440e134e55ee429213cb8e8a2314e7049019fe95ba36e3ec1ed1e77108e4fd84abee28423996e3fbba3d38b285a055d6390d3d8f5b21415e6874ab37423efea5726d47bbfed125494a2164eab12394f89843f8d8a5bd3bf05b31b598e4caa0ad2a8cad4826d238e4ab8d005379f100f97398d896684b08753c89863c224d65a475443d51a91ed668cac691ea7030aa737c3eeeb9db33cff17ce9a8e399bb2b3cdcf2444567398db196fc86ba76114dbd13096cabd692b083fea1c7a94e6564c2e8c093 Padding = EMSA4(SHA-224) E = 0xb29bc5 N = 0xacfdfb1dcb1459b489cd4a8c9fab64a7da4f044bef1c506f0872e9476f3357abda509d9fb1db6a4f5306c40c058826253171cfedbc160776a48ec35b655bb9963286b6aece1c77dff987a0aae9720ba035dda67f317101bd3cd4e6caac867a8c38b87067938e96e72df1875f94e43e4c06f7a86a1dbe07836ee69763eee29bc13ca906d7740c29e651872a9ec7c6237f7c8290bb0800a030b323d09e7c903751d21a224266f9d6c94c17a4c0cd8175ea67b9d9020f2b3f31a96206084cddb2acef70b11ae25a46c4f6817c4813466d7cac76b27927145bd499ff87f22a946b688e980a00a3d54c72ab9c2c88a55a3ea4c6784068673532737cbe4799e98bd711 Msg = 0af6365d6065dfc44795d87a8119fb44cb8223e0fb26e1eb4b207102f598ec280045be67592f5bba25ba2e2b56e0d2397cbe857cde52da8cca83ae1e29615c7056af35e8319f2af86fdccc4434cd7707e319c9b2356659d78867a6467a154e76b73c81260f3ab443cc039a0d42695076a79bd8ca25ebc8952ed443c2103b2900 InvalidSignature = 3b32dab565d2f0a5ac267ba8fd4c381f5b0c40f20c19f0dc7b236232a8bdb55c1c33f13f4f74266d7628767763582bb0fb526263e2a4521e09a3207ee5fd7cfdcdac85ccffe3e1048f590dadc19035bf2f3b5b954e8c783f6bd3e99d98930aea8eced5e3119331be1d606410d16d0e5ef069179cd6b513b94b36c1cfe6ad64ad285e818b58c4c89bf9330c4bcec96d08ba21a35cd4851da1f405d928df3fcfeb85108171bb4ae5b0310193bd8b5b861983b7a2483ba6bccfbf2d6e15bac1e2f2f8363c6154546744e301fd2661ebb3a29030d269c8954ace992b075c63ac12a992eed4956cb2a48495d82c47fa68e66740d38a80caa69190b19730ed7d72835b Padding = EMSA4(SHA-224) E = 0xb29bc5 N = 0xacfdfb1dcb1459b489cd4a8c9fab64a7da4f044bef1c506f0872e9476f3357abda509d9fb1db6a4f5306c40c058826253171cfedbc160776a48ec35b655bb9963286b6aece1c77dff987a0aae9720ba035dda67f317101bd3cd4e6caac867a8c38b87067938e96e72df1875f94e43e4c06f7a86a1dbe07836ee69763eee29bc13ca906d7740c29e651872a9ec7c6237f7c8290bb0800a030b323d09e7c903751d21a224266f9d6c94c17a4c0cd8175ea67b9d9020f2b3f31a96206084cddb2acef70b11ae25a46c4f6817c4813466d7cac76b27927145bd499ff87f22a946b688e980a00a3d54c72ab9c2c88a55a3ea4c6784068673532737cbe4799e98bd711 Msg = 4cde2a6d9ecfdefa3c631c95aa9933634ae12668db8b53a03f80524b8130208816cb7d2563b492b68033d7e43c6a3408618a67f93946a521508884d77c6318e91b4a5c779c7fd40841cd71d7227ab56e767817760edba9ce2290f8da504b341ee2c1910b5018ec18059bb21566b3febc1112018a6232a7cd3cfe77fd06cfbc4f InvalidSignature = 4151dbee3d483d20b57b51d80bd2d382fc85575fa031582a88a135b2615c0a079bb08c2cb7ba6020c35706aadfb6bc35d69ce4df0b2e5fca1ea62a807e9765501571d6d123ae114afc19b26ba4b5db1b0522859d2269117059651053b9d72cc253c90285652a7e3094dce3eb5c9ef5fbf35eb268e3b8fe693c2bfc4bbb8682d709a12f3038fd04629bc48ae13ee91112741dab717c58856cc4215eedaeedd57edb2926085ebc05d15038f0deba90b00e18e710e64d31ff563a1ac88ecf9cadca2845babe9dd26771f0a629976fe13ba14f7c9ca37b98bb3a9d96ca9d72273da78ff3b17f6d7aa2645c42e3251e9161c958bd6f10d20f08fe2437aa79d73f9081 Padding = EMSA4(SHA-256) E = 0x10e43f N = 0xa47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b Msg = 7518c85b67e7aef7f26bf006899faef76e076f0c6c946e5dc9c83521771a6d298a9cf5adefdb314b5a07a54d8054c22b879fff50ba552c218291033c918401fd611a7447dddad4815e0f56ded825bfe256557622a385de4b4a69e265c1efd259e2da6db19aac3fa0e5ca2d42fadb4e24c271fc078feb2be10b9afa256f228844 InvalidSignature = 992d48b21bb3d2219b44e8fcc8633cf3aeb591de90f4386496ac7ecd284cb63d7dff81a50b8c4fed9f2ef737692ea6be05248ca138947b49b4e7f3cce6640e049ac2154c40f57e22fa14f97e7a9507e1dc98b206ce6ea0e180039199d1be0a15d1f5093a459e5101aaca2a23cb1f59cad2f1fb99dc956b9d4344bad2c1121d63b915004acbfc7ac60ac9a7b0b1c6812b30bfe087f7f0c7d1625f9c4f458515e11478e3604aa39d14d08bea30b01fcd6189e6f9b701d360e4714d45556b29815c8d8fa8e46e10749ba5e8d445a4c0f487e70ab5890b7ccc1651282a54e87e7db4bb2f7d4a671e71c43c55cf6486416f171d1955037474d06a71dd078767848e5d Padding = EMSA4(SHA-256) E = 0x10e43f N = 0xa47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b Msg = a3bf44cae8aa8347fd07d84a33eec5dbbdd7b6431368887c988c4be779c5473dd8c33ec82a35f1d3dddfe55f3eed67179b87ce86a4a50088172538fe9d1b06c6ef6897eb3c8e3618cfc21353ed4343e7fceb09a2eb035441cd5c8829c79b81582dd5d69ae85c5a001bd8e98e069961342a2bee00ad2b8b91015ac5cfc1f0c2d9 InvalidSignature = 877f20eed60f8ce286108a5dde9b6828b37e3fbdb08fe153e591513897440f21f81214598fba08ea077394ba8c2a44aa4f0d8f3a5fbaec3dc69b3bddfbe28397c90adf35d08ea771c7aaa31eb06413c1c62b77618af940f4c71859fa4384d29b48e5cfc941d69bf0a3804d2008e758742b8ed68754bc71d231623d181347c36833a7d7160f742a37ce7d432d748e514aa7d8156b50c532151390d086cdcf9d59f122c6d97f4ccb737289f7b00a237cb6b4aae6ba79d41ff73d019a26b59ade04c967356e2aad52f115357ffb7676f190db38dcfc98666e5b258559c8c85fa32942cbcb99d757e8847e56a1687b3302415698708191b136d923349b02fe38b6be Padding = EMSA4(SHA-256) E = 0x10e43f N = 0xa47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b Msg = e1c46c309b6366fb4d56ac08c9393cee9a7c95bbe7b7c0e79a3d9187c0f42bc33364c28a770da585e3fe7b4901a3ccd037dfc42aa65a3470521ddafa835ce2d16c92ac670bd4d086505e608781736dc4dd64cc5080ee19e586c8fd1d737dade5d378b32f1d5df1e8dda0e32a125024b2d53334943c18782d7e69825a580093e7 InvalidSignature = 8ed1f28fd16d45d416a21554e104c006fd7868e5895e8b99831ae0938135b543610df64a8c3574d08118bfe396f9a5609a8dbda21b9a8530ff0ba90e629d6abe30d2c1b590600db971fcda80e6eaa84017e209b9bd3b641f3c81d5d27f842bec8019790ed99a0e5db4aedc1c070b047c19410cbc56e9a0ff12d8f6e5d7371b1011ecfecf7be7a74f94403590a52f95238dd69e0b5f4c1fcde97ecfdb1acc3803e59ad8b3088b2bc509e3dd12d40d875625dc8362c579176799c75e4fadcdb392c68f401f68d854e46377f084c081f9d83743039f6934722e30ef3f0226bc841d79a4eb68c5cccbb6ae0e9200444e50ff0d0953047ef955d2d39a70c3b837c5f4 Padding = EMSA4(SHA-256) E = 0x10e43f N = 0xa47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b Msg = 925d59f953cb3ffb6d5a3a55c079cb1083997536e33d7c8aed50ed76aebcde459938f79229613200c70dde2ceddceae08c10608aab9e30ec51842f14a65e5f8f553471da3497881927ec400b4207ef3e2dfc2b7fcd318c9520b8b22f69dc8a1a8efaceb7be93cbad569e67db062362913005dcff902018ed22937fad405fe84e InvalidSignature = 62b07f6d1b8f13651d7f22ce2ce01061090029db5af7dcecfeafef20621dd9e254a0fb914f76a3d79662257489cb8122708583d30778791a77da83c7bea81140c61e4d0484806e20fb85f24d1bbf774ef2ed38809c9b14f2a58c6e8649b760baa901544522ed94bd405c77201d07c8d12864a8d1e97a4d322c29994b214fc83c2ecd5c955b9bdec424e7ca5a1325ec0aae4ab0c202b980a2187f096aaaaa5e85550ebd325799f4f30ef2ead07e79c7a475667f5965e6b50269513659ab5962a391c43cbc3a3da34c0fdd1546c40ea7e2eb5352ce6a06ce6a6385ca0ddd5d162c137836df9ea1f89cfa00c3eb1671a43bd625526f3b6ba8e48a7a2d56fb4f01c6 Padding = EMSA4(SHA-256) E = 0x3c6cd1 N = 0xa47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b Msg = 08d3ac24a595da811cc9bba78828f1452ff390ae653f22d1ad91ef6b22aa7b7b15a44ff7f83efcbd7a755eccf4541eb4040c7a4b774749a26dba3937b7f95c6c8490e3383d4f291dade5f35a65b1f6615fd4998be18bfd0ba4bc3a2136ceec909dbeef513d6f6689fc4202b9a3e78134877374d76ab246f49cbe7a8f65d034cd InvalidSignature = 72ea7d669ac699a149c13aa168eb3e148f590bbc0424951f1c3144c541915573ecf05cabb5275488c98d0ebe55b1f1af49ef8cc72cf00e849897c6afa53833caf9ffc00eb84cfe55b8277e93a6ac3e04b111c9d07ad62082ca32854c40de1e0956a18f8460438484403abb91e6fad12b28f114157f1b6ef563d2fa438ccb8a16aa3afe6ec5e98365c30d9a355e7e14b039bbdecf59f91248d0f1e317d2e3c819096ed68cf98361d7f9310b354f4f45e2f7c4dfb82c218cd438f3174a6f017f0f148a71c40ad5b7e2c8081ddbaeaa764d601bb2e075eb3618aabaa4b5060022c6d23ef072643686a759227daef0331b28ee76da4ab3b5ad5dda8991b9937d1a59 Padding = EMSA4(SHA-384) E = 0xcbb343 N = 0xcb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd Msg = 329b4257ece34ecc0185031b0bc665c9c87ac66ec01a8c69281734d2076e97b0977d6c6cee140f86ddd0818719a4af3798b9f70f3e78e8f1b9e54917aa2e5d4a05836654ba2968b795ca2f9f621093165672fb77aa4d20258936147c2c8f8208445837f59848e1c7ef1c174c30309acec84cdb8c4cc0bd6c5fb39bead7b88d54 InvalidSignature = bc7b0631f92c7dfb0e3e8694650bdc73623d0356ad2897aad8eca32ef4531263f3219e0af3ef2fa3b8a3eb878b3f9c293c634263bab59b1dbdee04afc3fe39dd8bcf22a0052e6a081d3b68399294c8c6aab199beefc49706eb3436d95bd3e655d21cbb0fb3488052df8819594ab0f9138fc5ad4e9e3521425e375684d94dd74b9a3a7a858aa1023e967502a38b67ed3b8b8f6086427e8c8b4ca608c4b394fc8dfb818daaec3d4f10e77f51d80c0a103569dc28814a80eca64100d9fce5d6b9081f871bf8aae624f1786151290c86dfac7643b21c74f4f5313bf8b7693dabe4c816d7d309ce27f4b08b59d6a26795a9c2278ffa2185a1af12257a5a6de57c1a41 Padding = EMSA4(SHA-384) E = 0x24f1bf N = 0xcb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd Msg = 3cbc49d73addbe2875dde779689a363e42cf88b3e13ab520fcfe655ba246268fe32bbc3dcdd8b8809aeb4d95271f5e9aa828db969bdf4ebafa9fb1e7b5ef83705f611b2027ba3b7f0b52e85148be796015adef7b901084bff97e87151ed666fc16260d8932cb6eab31da61b4b3bfaf15f1246969aa157fb661618defc543f8bd InvalidSignature = 37c9ca333ade423c46419ea16c5d79f56165a03bd5c674fa0127500a1bd7f5c2d21547d7bb45f558b3b986624c8eaef4db101e4092dda2b4fe48811ef7fa694c1384f460087f81cac1861425e44b86bc2fd825eea94b645afa4afca29f632edce048aea9e1365185a60821e4385de7d7435ec00d307d477b2e6a6e3cde0f340c71d2c59624a7ac8cfb838f68b436c403ab3b45f9a19a0a14ea8f47407b7e25e51a498a902ed8eefe9c493421421695a6d17a9cd5b76efad7b39b8d584cc2902c03422f06af528c6bc65bcebd8876b5f4d1ebb68ce22af5de05105837c15f5ff5c4d41ed8019d6a0448c94675e192a51d5eade91d2237ed57773cf3b37ba3da71 Padding = EMSA4(SHA-384) E = 0x24f1bf N = 0xcb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd Msg = 59632917bcef9eaa6edb1bb6013bef9e5d285fe212c49b44ed78f129ca804141a8aab16a035aa1d25ed2e25c1fb022469fb8ab0882d44e7f4459994a158c5175e7651c54c5937db266bf052c0215c8d764010f2941364c16c8f553797a8cc6b63c1dd19daaa01892af2beeeb5271c89ad38af10cf7f27f51a0d3857ca0878a4d InvalidSignature = 77a69f4fbd9456eb8cb973e2623d8ea83df850f3c7bc7c8f976728f11b2daa6204ec45e15cd36dcdba5d88bcdeca490bf488a32d12be8c93d9fc63d2a91fcbd79b4bed113dd98bf5b93673a1c143828f47935aeeada7938c65717fb8b370cf649134f6fde56602ba7d6f890ba166d3fe1c51e7471c98b661a6022d7d1d0caa5be5d140e94e70cd1478b9b33622ad69559e27cd6878925cf07f37f5dbd1ae457eea785053d06e2e4d010fd885b897f743ec09c2b06f774407123ac30cd91f81080845f885062fa4be9da31f4e6f626c61a7fefbc123e8b7b80978682b773b5537b2366d1118f506464d27db3991fc2af283abbed6d0c552120f82f906c38c2e0b Padding = EMSA4(SHA-384) E = 0x24f1bf N = 0xcb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd Msg = b9403622a632794f7cd74fbba93aaa64c8d91b63144fe7ba23305c4cd135652d7a995d1c6cc2214e9b24696e976358e1bcb7514ea8950d5ef38ceac01a6d8671bbae8d3a0810cf7a76809625b53b360de536e56007bdcd72b15a60bd06f8ec27e6486f836264ac5973b37eeaeb0c6d6fab1e7fa2170f507fc763654c7f20bed7 InvalidSignature = 81511a0c2eb37d5c6fe2c214c55d6b0e5fcea17242d5a5a9eb4568ac1f0af9b8912498ead877ca43cf9e19c743c3d8ea6f4e67301de53ebb81a1a3eaff67d72e450ffc6646b6b45ce8826957b9afbb13f571c38852c3eb384f6a595538ebf467414f3522471147f2ccb347284d0873018bf6329f33e0b49f4e86338b423a1027a6c4718187d19281aa896a286b6c89622e4cbf4cc6cf4c3ad4443516aec8708006dcbca5f42c9b943fc8cdcee23d9099edf61185635b53ad4d8853d8a511cdc50e189cc8929dfd32f9dcdcf2754adcc19b855f41d25620b65090180ece407427e9ab602a38f1f289eaf3299db856cc5bbda17de17a74bace89913813d147d9ac Padding = EMSA4(SHA-384) E = 0x24f1bf N = 0xcb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd Msg = a95ece434121269f4bf036395e54718c9b3b247de3534fe147b7b540bfcd2fd81f6e45e54848ff209b81f986b49db65a54a2366d9e7acb9d8798289c88dfbbf395bf3d4653a187d98685a753c8e933c281eddde013b6489555101abc4357532af497ddecccf263d1f242672904008fcb0a65405da9ce6ecf9a65b3295afe9e87 InvalidSignature = c878b4b14526efdfdb99f7287c0e871ef6c0aa7b4d2ee29299a782c8391ecdbbb60b8aeaab5343dffe7ade8af07156c45b16842775cab5201b3403dbd6bf0769ab5533d4c40deddb1eecfd8a46b933627d0d25893f0338e6dabb2a778649ebb2193a9d7c99d069c6c209b4436eda411184d99be0f80e3b293b5ede00f58ec4922fe8e1c6de04e58fd443d1cd96fcc9ca4bfc23343532a3eb840fd5c197e7795f2e3982a928e602b1e8f5cca7ea20da049eda313b1ee8d4b1a8e7960e4cfb5b16082ba73060f73c02716324658d3f00a3ff0a78dcbae103d5048e75669053645156f6640d4f6d1645d02e772dd8e70fe8866cad5ec2878ea6fc5c47530bf9eaf0 Padding = EMSA4(SHA-512) E = 0xeac839 N = 0xa677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb Msg = 9c3d5d23d2746d15d616bebf3cf720c6e6012a71cae22002f5021a47d0b8636ca3bd201357e132a680fc5dec9b28a9db932d08ae8b3d3a37d7e2ee754b342a69b94fec26b50412289bcf77e6d4095faa545f15a16783d22eae21e18464150174e6db0b837347d440307655d56f0409db307f9773e81cb19282a93c9ca4c3b135 InvalidSignature = 98657fd8163967fa7d263bd45bb890035adbcdd1645fd48b28febfb9b4e15172540e38b7c2f673c40a205fd40b08b60b4b81ed6e236cdf08f0d6b11f50dc74c60dc466ac372e0f467883aa9a398f4aeef87b040e14a51502dd467e8e8dd89812dfaf6b1dc1c2f6c28448af084590c05aec499dd3b148e66f3d71cf75e239db6d21f4074b8bd9a6bde5ca668634bd47953276ff2d0ebbe01afcfe0e381903736d6a6c672a45fba4ee326e342dc5925169517c5f57e9290724576a225ba89cb4dd091f4e6513be10dd4181855bb4045d6ef6437c16d3b5589ef9d6836682711c7d66025ae37b525580f0dfcf3db7fe57d7c6b15777cc41600307e58a1721b6f7bc Padding = EMSA4(SHA-512) E = 0x8d8853 N = 0xa677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb Msg = 7759420c8d1a39ba0e3e1681d9b757fcf30cb40d844f4a71224ff998520e0bb44c761611ff4723a455540fe6b8ef32e3d5a23f8da0206b57987ad2ff4c9616ab1ede493847350dcf1b2ff9b98e813f74f8b68c0615243091501f7f28416c77e174f8a32b6cca3e62e7379ca16455c6d8e3b2651eec45e148d2a4c9ba3978767d InvalidSignature = 91ce8e921f85de845b9bf7503dc65a328224d15b23e8ea65dc3da6d804fbef196c305e0fba059a7d842c8c0f580860cce77652d4dc779073d6a3b0a92bf2dd3ec6c0618da1485036fd594bd962f7b5a1c61d53f1626912c7e312aa83eb4326288a52437c7387916bcb11084a40c219c84cab2ff66e83143f858647f2dc914da0c7858ba39aa8ad8147ea5c9c52069eb2b2ca941d8a5023748dc401e7664500846c85cadf0287e39b8b8b46794a82bfffa752960ab3b9eaa02530b5903c24aefa108f10aee35b6a8a3cdf8795a182e5c04ed36bb68c18785623b42f0979fff319112e1514cee51db437ee32289f61ded61186c6ed44ad722d18d556821f888221 Padding = EMSA4(SHA-512) E = 0x8d8853 N = 0xa677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb Msg = 864f4f5890a03653d08daa83d9e2992fab3393b7ee152d6f7b8ea3ad1ec9c1219a0e0365eef2fbd5d7cbf3a19667d421f3fe46688264191b2583e484d209ebe2975e4603dbd94015e633febaa43c615aa5cc2cbd69fd6ad9db970ae81bcccdbe8026625adebdcfbb04ad12f589c70883c9878fdf2a46e750a4b15f03807a2d5e InvalidSignature = 245fda2e66d2bab102d0da4098d751650f5ef4738d14dabe866c782009ead9d6d05d43ac0a3014a382d62ac971ee19798f3b8ef49f9bc247fa07b368ac2d0e8a4fb210af5acd87b6b512e135861b30103403304732a10b75c9a149552d1ccf0f9912968c6431398b7d48dff48cc7cb7184e76a0ab94ac9a6b0035b91b3eeb2d1326ebddfc13250224538c143fc0dfa3995926415a658db8e6691504050a1a30e34b21af8d12707bc4454f174385cd84c729e2ddfc5cc9178812059b5da4a1a605a2a81642ccc1bc5cf953965f705673b12c5b46ac8c1a03c1001ae4df1c39cc83cb54b10cb7d33cd5108033c268ceeebba6c6ada92882f46562dc658d3525574 Padding = EMSA4(SHA-512) E = 0x8d8853 N = 0xa677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb Msg = 71abf895e56ba8f6ae8d0e9e6690c09c759270a73db8c1aa95d05980793537fbfff3472c8d2c34de4abb7e64d216cc952e798314034197d50996a2dcbf4c33485e0b68910baebf0e50ea29bacd3060372bd47b13526ec04bdc81b90dc95a8ac2743b814cc5b9ef8ca9633628bfa4248b55eb7f2d9208e114f4dac69bfe27e472 InvalidSignature = 243c570cd1bd85522e64817361cbb949c83876d7a3609513aebf506fc06750ba38e820232c98acbe00ffa50b36c538560069fd13992ca0df7d9f6d956b883334f1c3af8a74adeed5be15b033d85b207be2fe600a9902d699ccef1f4a8d588672c446401eb390d174d572b918f9b349e2e704775300023850a534cd14e0046e385181d345a01dbd230c7965fffd71d4e9f9bd274d2ef46c556c7332121362e71706c39f08919efa3a4f2f142150c8cef4b30ef788f6fffc2ed2aca0262eba873a251795845da526b78e2b24d66f21d40d5fcbe5542a7553a9178be5a9805bb53579bd108cff733b37640789318db620a6a94444e9203923ae325500b676b14798 Padding = EMSA4(SHA-512) E = 0x8d8853 N = 0xa677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb Msg = 4b648de2e390677ce1727191498b76d2d2438d0ceddf3db502ade5c5fd815bc70965d42f9b8d04eeb38986445fbe7dd580177c00d0f8a36c24740be3efbf656408e6dd73adbd45b4c7196fb86f40da17b29e91bf91ba518b4c68ea18e13fe7d4cf4d71571f0a71f7a58bf59684f8d5bff04096f2380b8e3b03f14909d9e92c3e InvalidSignature = 277fe81a1540341c9c04fb5d3c8f70c1e72f87fa7d04b93ee54d56d1184c141ec4e125e2e5cfd0acff1055c76697a1c3079c371cce0bd84ee4437bfa1806aa76df2955935331915fff879d87c7372e75e5e8fecc906f9d34a5adc0b75409a87fb6411e2990cd237ac8223f7223444f5d527a115c85b9ba10287f3e825e1dc58eb37c8a9ca055155ff6a5aaa6565690dceef6f647729d071cdd9f0688c7fee8f9293abe658d0e1ef855c86a28d8d0f8f82f72173186353080b84f142f965907377178fc1ea00819d81afc2474becf79e1e3b70c7c2a8407d50795c3131bb6df78720c31b2f8c43f705464d8982043c45f04e339aa1c6f4e26aa7092b3e6261299 Padding = EMSA4(SHA-1) E = 0x5f8d03 N = 0xcd2cbe024059e2c019529e157684eb1e2cf415a71b002cc643668da85f752ef64cd8cacff6bb79e246f7b8f731c9f5cedc2a879302b51273c83f81f9a377d3e450bb4f4662ce01a010a6e68b66fee35b62d9861cabe56f6d262cadbeb44a58145a0f977966ab74f662674fd92f165eab397e1a2829aa2a7b9cf7c4af5db31119741d416308f3cb5aaebbcb5309e50820e7e1482b9b3a918653d9cfda6ed1122488f435dd54a418e922147be2f6586bb9b759c66b01d0045757302ca3835a68a67f36b33738ba9f8c87b909fe1ca5e5bad207cd0273ccc3b44a6185d32b065b64e2bd42b6c61f08b268b2b7e91ced5962e3a7d553fde91b77eecbeb9ba63e0db5 Msg = db14289f5550b770ac30ad0aa53124753741e4a49c7f1f54a8435f375a5ebc52b1a352a3c0a6f20805c3185cf7621de3de7aaee8e7547da478923662c16fb5e1944876fa765c4d82f6d057723df63045e7ce66a211cd2e3bb3de56f531a77b492c0d7cea9efa2ea8265d5294a073c465f946f51a41739ae1022fa638d18c7652 InvalidSignature = aa194ead943a93e90f29a3e853f0a4d44b4dce8b55d7fdb1de01d2d47bcb18b6e6e81996c5bbb94c66cb276cf3f3b35494cdc229278ce444a001f61669b57a59755b88142e50337a8653e2a413a7aa1602d6dbd56d989c2195ffe82e91fe0b081ac9157a0cec6bfaf770c10c971a76d11940c889eb9e959f14f41d0b765babc655480b3f32d4ce3d660a134a2b34bfae2f40968ce313db34e0138bee57c01652a90f91fbf6f0052db494c514df087d76acc769a3e220c394763468194bdcc7262103a8a73ab621b0562d2d164c8ee1a00f0cc4f784042c144e3d36b8c300c74a1b368f569057da0f77b33daed667c1154119f68672000d25517046947a8fe644 Padding = EMSA4(SHA-1) E = 0x1fba25 N = 0xcd2cbe024059e2c019529e157684eb1e2cf415a71b002cc643668da85f752ef64cd8cacff6bb79e246f7b8f731c9f5cedc2a879302b51273c83f81f9a377d3e450bb4f4662ce01a010a6e68b66fee35b62d9861cabe56f6d262cadbeb44a58145a0f977966ab74f662674fd92f165eab397e1a2829aa2a7b9cf7c4af5db31119741d416308f3cb5aaebbcb5309e50820e7e1482b9b3a918653d9cfda6ed1122488f435dd54a418e922147be2f6586bb9b759c66b01d0045757302ca3835a68a67f36b33738ba9f8c87b909fe1ca5e5bad207cd0273ccc3b44a6185d32b065b64e2bd42b6c61f08b268b2b7e91ced5962e3a7d553fde91b77eecbeb9ba63e0db5 Msg = 0709dcc9ffda89add8fc52fa355e059f570a0ca433f02c10c8e5730bafeb6b40f4b39485246011bea78ea2fe5093d2f033047276b77c458fec98fd7e1e466629aa40e2bf10d3159d4ae5e1735c3695a22de661e995380e41b795eb0591d40b56d1b8adbeeabafc136809f99f80d0b57decb7c346f6acedeed2e326e8301bc091 InvalidSignature = 15b86cc61cca52c9dddf9d8ec4efb7dbb8a7f02a4012d896fc127cb1fc383c304c8859cdb07478719d3554e65b306166924d11c1a14d85699ae60a33f601f7a24b4e518c406de3cbf92bde58926d9d93b21c76e1dbff98d5677562769e6514efa4bbc40e12d191f54a33dc1c9361eb1ff03613555e873fcf40fe6349e10d188d0d1d043078e02ff8f1c736cd7090961fde243c15694c0d76b0cd1e6633538c265f21b41cd11708613b62b11808d1f74d927c351a63c8c4f18f5930f39fca55850a787301b2e4eab0f94f5734cba5e0eb76bce60d673fad4c513012b4e57a8b2c2837e0b6355a9a5c15774b0db8636a7b8ab28c36c05832a42ce697ec58447ab7 Padding = EMSA4(SHA-1) E = 0x5f8d03 N = 0xcd2cbe024059e2c019529e157684eb1e2cf415a71b002cc643668da85f752ef64cd8cacff6bb79e246f7b8f731c9f5cedc2a879302b51273c83f81f9a377d3e450bb4f4662ce01a010a6e68b66fee35b62d9861cabe56f6d262cadbeb44a58145a0f977966ab74f662674fd92f165eab397e1a2829aa2a7b9cf7c4af5db31119741d416308f3cb5aaebbcb5309e50820e7e1482b9b3a918653d9cfda6ed1122488f435dd54a418e922147be2f6586bb9b759c66b01d0045757302ca3835a68a67f36b33738ba9f8c87b909fe1ca5e5bad207cd0273ccc3b44a6185d32b065b64e2bd42b6c61f08b268b2b7e91ced5962e3a7d553fde91b77eecbeb9ba63e0db5 Msg = 95529308ed9bec98a8719b3fdd942ae81c6646210efc7dcc59754617c48a42af9c67c13156b988e27509d29faf4894174bab0537cdb95ee6d5a2def345d2124ba2c65370bd1e902692f44e70706decba5a8d2c58ae50ef2f04f640b2599e94116d1650ac69f28ccec5db1798692abb3b12b6c26bf8e9b810ae1a733e49165167 InvalidSignature = 93c5b49a3055f234442d6e4562c99d2233a8198291adc95e65bb76d320203a1a4d7921393cfa03aeaa9c31e6272b5192e3058e54dc5cdc7f467af1b073e6d492f614448368a0cb0338f8e37088e080eb2f6684a1f5cdc24ed7b4e8c62ce9e62e06361c21ad07fb78d853d16b6ecb84c6a158bf6c24bc484d6aa5abd48fb7eb2264faa361caeaeec78a2cdfcdc6011487dcf3682c5e07f0640d1d88e09baf838a5671719032aa1772fd0ec75d61047477015548aa7896e60a297a27a627976050fa6c7978e582b3be3afd708bfcde276b2b3f9c188f4b36d3eca90707fef76c367483aea08b6dda88d1b85bef098d191b1a687d322edcb1fb5cd860749f69d8eb Padding = EMSA4(SHA-1) E = 0x5f8d03 N = 0xcd2cbe024059e2c019529e157684eb1e2cf415a71b002cc643668da85f752ef64cd8cacff6bb79e246f7b8f731c9f5cedc2a879302b51273c83f81f9a377d3e450bb4f4662ce01a010a6e68b66fee35b62d9861cabe56f6d262cadbeb44a58145a0f977966ab74f662674fd92f165eab397e1a2829aa2a7b9cf7c4af5db31119741d416308f3cb5aaebbcb5309e50820e7e1482b9b3a918653d9cfda6ed1122488f435dd54a418e922147be2f6586bb9b759c66b01d0045757302ca3835a68a67f36b33738ba9f8c87b909fe1ca5e5bad207cd0273ccc3b44a6185d32b065b64e2bd42b6c61f08b268b2b7e91ced5962e3a7d553fde91b77eecbeb9ba63e0db5 Msg = d42084ee99cec1a57097b804c48e454b6390dbf2796f18eabf509d26f0521c5a7d71b20381a978a7f75e555e2bfb16916edac0020e64240c8579b52df11297c1c424f810bdc8a38b179ad253005e44fb4cea908f6b40b9d598fa02d254eb04901303fd1f35736bda3712daeb2bfffa126588f4a2784bfecc619b2e1f01268b50 InvalidSignature = 493d0c02c087149d5f597e97709c55f6aa70defbbb862055b31dfef2cd3fb1debe9fa9dea81d7986ec7e5073092c93afd19ea34a268f9e3c4fc8114c4215c8092d60eedf26620e2a79c70de5caf85a7a256d4903e4f224b602758cddb457357b14136b5b3d7583d0d6c9e426161852df57ef547b286797e1f2f7f6666f6d333d46ec59a7bd17adc444b66369f4be27400c4142cd53eef28b6d9fecacea6b2f2d5741a68d89d8de8e56cbfce25d228b6861c641250a264c182b61025b5840aebb92e694d4e5c14f009ebe856d274872390212a1f672f74d2462678f5a416de1cafc3df240d667397870f2da461bdc4c7f2aa10cec20e207de1fbbb9b52429518c Padding = EMSA4(SHA-1) E = 0x5f8d03 N = 0xcd2cbe024059e2c019529e157684eb1e2cf415a71b002cc643668da85f752ef64cd8cacff6bb79e246f7b8f731c9f5cedc2a879302b51273c83f81f9a377d3e450bb4f4662ce01a010a6e68b66fee35b62d9861cabe56f6d262cadbeb44a58145a0f977966ab74f662674fd92f165eab397e1a2829aa2a7b9cf7c4af5db31119741d416308f3cb5aaebbcb5309e50820e7e1482b9b3a918653d9cfda6ed1122488f435dd54a418e922147be2f6586bb9b759c66b01d0045757302ca3835a68a67f36b33738ba9f8c87b909fe1ca5e5bad207cd0273ccc3b44a6185d32b065b64e2bd42b6c61f08b268b2b7e91ced5962e3a7d553fde91b77eecbeb9ba63e0db5 Msg = 978a26632c48c15a2cd0c7aa5b3122630eb304c228037a6b489144f34137e4a1cb1bf57678d6be6ae9d607f941002bdeda9a6f1f376992493a16a6fd97d71eab894b279ec4a53c39aa0cf480c1421fda65841214bab23faae5b009427c0cd67a3ae165e3f8fb624dd83b3746c43d26dd173994ac9927a815b12715cbd61f3494 InvalidSignature = 3075ce37cae7c511a64b3bc91e2146dd2fef25f4955f36848a18a93a0fe5a16a2d1d6d793c832198ca457dc53ea65757775437efa9b7a05cb1f5cab3c800474639a333d22930aad70a3435d2446a4e3cc38d61167004b8b1426a2810e698153dbc4847e45aa98425746ab43a24f919ee841842893dceacd96f705aeda8f8591f27f0108ab4e36a570054a0498ce2c2ade3d457733890e280c236a4931fa8fb708cf2c8ab202b0ef09e35ad425073d2c0ba6970c5c45912d0c2b12011a9d9fb131a4d7c35d17bf7fbb232f4fe69cef8779a2031aa428ce4e2a93479e318573fba4326719dc8ac3a86412d4cd8ee4fa58282d4f6acc3581198eb7284da3f5bfb92 Padding = EMSA4(SHA-224) E = 0xce5fd9 N = 0x9e88e71138328da718c664b03685764881aa0145e8b23d2fe8cff47658334196ba8df505a8002d7692434625cfd29130ca11efa90102ac5690b083585ea3bcdaba216eabf0ce83e831db6b74c91105afb5edb4935691c656e24e3e4a6cd20d0a8cfb61f5509a08364b1db31a93eaaad4db58670bf7e8c8b259474f3d58a94c0ee7fd7c173e0f2ab7946dac5fa81c6046035a494fd430d0ed6719f21eccb57d09654a8ff28104eb8db4f56329324692509e8352127fe7ce230dca3bdb074063488f8282a70c1397a2ac18dffaddfd97c884421a7b3116b5936013bfd3d47f008c0864ea14f2141e57b753020044462b114ab05f121c7c5c4ecde64d0d0f9b58af Msg = dc0d4efdc94cbf64aba6f146d6ed0498804ff9a6d32167fa41db6f7f1863f1e6568e0049bee4940e2ba37f0f2507a3f7b2c961ef6ee5557bdea1409e02cb4545294259e309b8f5580fb50d17f4df4688917a64abf42b01ffb30185a280b552b9fe313f12d4504808ffe584a76cfe5711c66ae8208d78d54d680226d1bcaa800a InvalidSignature = 8ca41de999fad3704a730c9541430332719127a589218401dcbf2e5a8c863027d4cf3533cd633dc8c394c5b9915b5483c351e3ed2622babb66458afab9f102366cc7e0b34dcad351431571df42b6ef28b05c5a575a813f9e44b49e8aca9d1b129711a1fe318788bb1c349c8bb6fdcd5a6c0e97e1085118b28c2c9d06b35aa833855e181e41d726935d587390d816e377718aef9d05e5db52e0ed50dd3963cfac3996d660ea2f150f0a1aa1731e7ab91d0a6c0fb9d5f15103483a313ae765c09fd6758ff796d4c0ee197b3cdbf35ef71b60b33faa4400657b2bf910010afef34b080c29cd9f579d86f5895823d8e353da50b64c68acfdca4ab279393588c6b5ad Padding = EMSA4(SHA-224) E = 0xce5fd9 N = 0x9e88e71138328da718c664b03685764881aa0145e8b23d2fe8cff47658334196ba8df505a8002d7692434625cfd29130ca11efa90102ac5690b083585ea3bcdaba216eabf0ce83e831db6b74c91105afb5edb4935691c656e24e3e4a6cd20d0a8cfb61f5509a08364b1db31a93eaaad4db58670bf7e8c8b259474f3d58a94c0ee7fd7c173e0f2ab7946dac5fa81c6046035a494fd430d0ed6719f21eccb57d09654a8ff28104eb8db4f56329324692509e8352127fe7ce230dca3bdb074063488f8282a70c1397a2ac18dffaddfd97c884421a7b3116b5936013bfd3d47f008c0864ea14f2141e57b753020044462b114ab05f121c7c5c4ecde64d0d0f9b58af Msg = 17fcb20e72096d78a07c5d090a29dc437bbcaf6584948be11fd5d71092b8b42596263b60b986058401d3f18ad2f121971141462c8a731e9c8f9b3bc4e28705f6d6500236b03055a95393854a1d7180df0cdae02c25d36c661660e2ea1ae2f42f1da390f921b064d0e0e7a2b1b2500003b2b104cc1c5c7e25fa4c56ec007087b8 InvalidSignature = 63b99f6a1c8956f79494c9dd30fd1b0a6b7d761226c2f1ec44bb23a3e225a7780ffd19f99f951799145cf429a78e99a9f9444d3f56c5d3bba3489840cce156a12056fedf211e8a5ca2f60f27dae0888d06328773956e87c36731c094aec645eb8934b0f6bdba17ab1b5cfe3e6ca66628b018574fc0ee4c8bc7a257266f7b53a0a152dc9ec640c844c0580685b3f0d54884e0c3cfdf4056fad1e279dc219ff1429b8dfa436069b6b3d3f600544b80144cc3fc062b3e9c15d864a6e91ecab424d320d39ae7544f34b8a69b1ca4e3688870c6d1d2593997b6f00baf7268c76d10ab4d2ff013ef3d65a9e8c28e199bc1a402a0aa71cdc03f72e70f64b967411e997a Padding = EMSA4(SHA-224) E = 0xce5fd9 N = 0x9e88e71138328da718c664b03685764881aa0145e8b23d2fe8cff47658334196ba8df505a8002d7692434625cfd29130ca11efa90102ac5690b083585ea3bcdaba216eabf0ce83e831db6b74c91105afb5edb4935691c656e24e3e4a6cd20d0a8cfb61f5509a08364b1db31a93eaaad4db58670bf7e8c8b259474f3d58a94c0ee7fd7c173e0f2ab7946dac5fa81c6046035a494fd430d0ed6719f21eccb57d09654a8ff28104eb8db4f56329324692509e8352127fe7ce230dca3bdb074063488f8282a70c1397a2ac18dffaddfd97c884421a7b3116b5936013bfd3d47f008c0864ea14f2141e57b753020044462b114ab05f121c7c5c4ecde64d0d0f9b58af Msg = 2aea505ee5eafc92db8ebe83a69a9a320d433ea7cee6e5409bfa7b48624402cbd14934a91a096aeaf3eabc51e1f36a34b73a7b8b59a0a346c6bb6ae456148b4140939aaf5e37ea49350aae8430555e072c105dbd399cd8289fb5f1f820a21ddc7daeca983cdc4658a7d7dc431828405474ab2d65f6444c8d2ece58ac49548044 InvalidSignature = 7a3c88d70e8b6b4e219d36092d2be71a3c552e4ebe60b97550ae55f4e31086e9bc952c21f1744ddb889269eb68eaa32af69c493b40d48ec87e458dd1a23837b2588441ad74f34906cdecaf8307a236b03cdd26bd6e3b90646807c4aa184701a259356c62aeab3c32a51b8cc7b1721db8b591e945aeec05aca5c45b054f0658cb3102eedb7919c657554e2a2ea7a074bbe0d2ec7aa7782f9d4dcd1346c36bc7a2c7ce5682fc98b27f03121a5f72e91b7f5816bba8dd0dd271a1881ce4445be719f11e8bcdb56363c001895039064593742c6e52bacf993c07509f9d1b32956757098ef3f7974e6546f9cceb9b83256c01134639afc7f69012fb997123a5342d5d Padding = EMSA4(SHA-224) E = 0xce5fd9 N = 0x9e88e71138328da718c664b03685764881aa0145e8b23d2fe8cff47658334196ba8df505a8002d7692434625cfd29130ca11efa90102ac5690b083585ea3bcdaba216eabf0ce83e831db6b74c91105afb5edb4935691c656e24e3e4a6cd20d0a8cfb61f5509a08364b1db31a93eaaad4db58670bf7e8c8b259474f3d58a94c0ee7fd7c173e0f2ab7946dac5fa81c6046035a494fd430d0ed6719f21eccb57d09654a8ff28104eb8db4f56329324692509e8352127fe7ce230dca3bdb074063488f8282a70c1397a2ac18dffaddfd97c884421a7b3116b5936013bfd3d47f008c0864ea14f2141e57b753020044462b114ab05f121c7c5c4ecde64d0d0f9b58af Msg = ada0410f05b7cf29a83853cf604d9aaa0500d631feae43c104b90bef287e681d1887084b9e01b5306970358910a16fb254e0d073a66ced1ce9286ad478931a2e6bfa67fd16edf56ad3ef8243027111964d02477f31c0153eb912978c8d993c302c6328cd7662d6fe6d1d02a43ca6c67f79cc03fca791024effdf5bc07076164a InvalidSignature = 65523c77ea6db320cd0a7446cdbfbe998d603db4ab460f1725c494ea7bebca929cf6cd7e450f606249afe326ae09e6b0f5249cfd9d73eee00739d969cf35a2eade7f31c541bbd4b6632fef95f1a1ca0d90fdb0c4870bb97c2fb92d1ae09cb700ceb2e633c6e08a7c43e7f5ffe77a2293e959b280d9d6b37716e85e214f8d0f3cd719a3ebe652d62d9fbec1a5dbce479119e4028f68d26122d2eb44d9546f5a71df22dd03e3f9db6c470c8d9b96b460cdf9ac2c948d7ec1999a9b6d965e4e8b5ce40f643ed3124f2fc6501b2c7dd4802df3a18245fdef253d27fcda8f8cdace6af41d4d4fc314ef336881047ce5abe0ab699a9f1c89533baf45bc7bf9b2eff6e4 Padding = EMSA4(SHA-224) E = 0xb62585 N = 0x9e88e71138328da718c664b03685764881aa0145e8b23d2fe8cff47658334196ba8df505a8002d7692434625cfd29130ca11efa90102ac5690b083585ea3bcdaba216eabf0ce83e831db6b74c91105afb5edb4935691c656e24e3e4a6cd20d0a8cfb61f5509a08364b1db31a93eaaad4db58670bf7e8c8b259474f3d58a94c0ee7fd7c173e0f2ab7946dac5fa81c6046035a494fd430d0ed6719f21eccb57d09654a8ff28104eb8db4f56329324692509e8352127fe7ce230dca3bdb074063488f8282a70c1397a2ac18dffaddfd97c884421a7b3116b5936013bfd3d47f008c0864ea14f2141e57b753020044462b114ab05f121c7c5c4ecde64d0d0f9b58af Msg = 8ec0381566ab63122b5c86430e98681f333d7a27aa6e6625a1f0eab6d8d4e7065557b5db5806bad591263bf49152715a7f66e0520c9ce492a8f58dbdf7dbac2c7e042eeea399a90dd498351306777dcd610a164f39a60f384187c938fb6f08cf73904b572dac59445c7b1dab544db30142f0c3261bd40ea1d26d462eced92376 InvalidSignature = 46f71aafa2017f6103d036ca3b4adfb81eb25fee2ccebff2f49dd9ec7f7a3bf75b927819b68452a2e8c2a08e960c44d695b1e443babb4a271699319f2ae805e1bcb721482e004f2a281015682638673f5759f6bbde92171fe5f1017e6e9d06403bfda82d63d2f31f597d2bf8ce512a0e6c9cb3afcc7ab658bdc238da5980d175b2a7616aac43b317272ce3779a56da46ae1ca73666843e06b7d2108e3b3dab6a19d1486227abe853573effcec8cf4a7bf9ce07b6c617017877b5c839618d595227af594649b408a42399bb80f4f7e872c2ebd394d105ab64ae6047180ef16a6db3b2226c48947ba2e029a3da43f2af4d35aaad42f7909d11017edf506e066a07 Padding = EMSA4(SHA-256) E = 0x33e58f N = 0x9c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f Msg = c3232d8060a3e3f8687dc05d8879004bf5c3a7030336bacaf4d9ae8c0daa21c5f09bc8a225dba963fa568a038d7fa91b274dad04cb83dd3b0f35900a2b88e46550b9b3133b61c30e09f73d2b4d9661fd600077f7f8e409d2fc5c4f2e97baeb7c8c84d71bc9bd9bc13e66c31def4590bb48e5ee27b1dea6556356d5407ac89dd2 InvalidSignature = 21bfdd610a56fb8b3fba9f3841e7ab9cb2b91d16c7bc3ebacc266271e05eadb6d209a043a29d542b57ad832a3ed03933088abd7b56b86fcc295a95fa66e27f5b9b2c919b82d4165e2bc42b9e46eebdc7cddb29888281250e6954190f8e13b6d9ed6906e8d603520deeeb5cfe4f7e932c88ec1ee2dc9b971a0288bd71a45ce6037d8d7ef2325ecaa573c57ec753916fbb6335e9ab5cb695ec0579b511074a6cac3b21584e5e4532621451641a4a09491c77555972a5d42a627f50ffd490c79e32c855aef0e2859c933321341731e796b2ed4c6c50a98a3f3c6995bb6bd53e52c531b15d042061186677f9158eeaabcf302626c8ee639685c832cf3bc4357cbca7 Padding = EMSA4(SHA-256) E = 0x33e58f N = 0x9c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f Msg = 0d8235883f37654b35d3566174cf731b5b22a54ac15718f9d8e2415c57b42003d80dc2537e920b37dc9fb21312de8dfa39190f20024c0f9299ffca24d0d22cab795a4b6d132b35d6aa36eb6df856ad06d0257838bd14ce11e6bbb509346d0235b710d7bd462b6b90664109566e5e5ca7e8efe97a39d6dde085be09f2cdac2b07 InvalidSignature = 6530d456e14269bf37a95ab7b2ca4f534a47135052665a2b64e9eff970a9566ff0304029d2844d5649e643212aaa7f1f9103bd5288b1bebb7797cd8df3393373852cfc7001a4257499fbc92444609e0afea095927ebb773b7b666962faf0686a8b173f446fa562e82be1467111ecc38697103cdc1e700890b60104eb35575d25b9565098544a2e26003b3150c9a579c534a44bd0c1569b58d871d6a5af51b5ecf3cb2b0650793ac95a44596f86723c31ce4b3b1365dd61d2bbadf394b16f734608dddf991595acfd0aba42a12095966bc005c67b60776ba104c9681efd38d2e91fd3995588d9ce244c6bdfffb8e0086837946c35627a09a2f83b325af71f474b Padding = EMSA4(SHA-256) E = 0xbaa86b N = 0x9c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f Msg = 84b1e3cd7c5d6011c581302e03489fd37aefc841bad659fc81d796c6ddd6a1cd9199f824bada3f70b29b40e435ba306fc2c53333440f233af2048d6474b9fda447c87c6c625a56661a85216543d9fa9b9835120c5ddf6a4242d4da438b5d58c06ee3778fbc042e5cc4e7db9b75cc87c0c2e76cb34b6eb47e39f1844969ea3989 InvalidSignature = 1864eb619e358d7e0340b582288e3290d5f8caf1b6831bfe5978f4ea56d15762247bfcec56e2a44fe11507e5eb6fda0706b7287b09ea770d577cdf660c523a76e2e70952177f0260cdba51efca71148e069ae6540f5c4722a4b4db6336168eea86612b6b4ecf8b5b2e1adf3d4f79c3894c617ae0ba56a930c658f0f55c0e5f2719b4b52b7785c30489ca13c9799ded9144404409f284c41530fe35967c2d844dcb1d2d80c10a985164466ced3a4d74573b175ce7288418b39962d4a34cfbdd43ba5a6b73af0f9ef55946b61bc7d5c0af9ab0e99bc0842edfedfc91e213f021842ccc785cd73a5f85d8aa8371c80151b836651020e71c524f92d3c654fef0b37a Padding = EMSA4(SHA-256) E = 0x33e58f N = 0x9c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f Msg = fcef065e293ecd29ab52046c68c6e940aa0e2d5fce5d4a2b40c516f2a7a198705c301b95218282891098dbeed1c73765105db8532e87ebe53772585115b1585f03df272944853a1e143dd34ddf18d2e1b13ecee7eed464584323cf53dcf6b9aad74351a0f90e9ef1a08b1313f98363bc73f897a4740c5d8c4a1fa37f64386458 InvalidSignature = 00acfc93e41faf5004cbcc252da290b9cf66b56a6a4849c572461d3212cc4cf1021eb96e8651475fac7dc87faf3a5b52923123378c18cb83906d1ee6e53502bf0e89ce66f3cf5a4b7cafa13f2d97f99498c0052fcd640570e5e1dacdc66e24c2a54f02bed338a26748fd17c07bfee5492c4dbe4dfe111932e3153394721b0556a440788a2bcefaa2765ade916653f4aac20d5ea587fde0fdc255dc32c5aa52b05e3ac2db4d7c3a8b02ee1733fd300801d1bb8e8613386f3deef8dd497bfe803523491ab88553db60b03d29c55ff52e71c546873cb1b52bea1853c8f0070d1776545557becb6a11310acfe1be060deb53d16f0dcbc396c1d30e03c4c069c3ad48 Padding = EMSA4(SHA-256) E = 0x33e58f N = 0x9c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f Msg = 79220b8d86942a13861560882a66fb4c5c926a661b74ad2586790a0636a802d9d1df8320dc5f5fb8d18afdbb72ec4fa45c7903b4df15fe950d5a063e1195be16c311d85c799986c61f3831688a436ed809992e903d2a34932bb6cd5490d7bbd374427209024a878697a66559197342308a7d51c0ddba39670817c7105a77df58 InvalidSignature = 54835466397784e6229228ea1e462b37d77757ba17a6624fbd3279408e89fddab2234f5ee20b56cc7095dcee3cf033e4b04cebb9771997e3b9f50ddea290080888fb406cf1af4b2d14c12be788cbbc6454c52276bf64ac3b3158049cc78986e38413bb09d408f04e8234228a9403eb901d6f2fb21887996fb228c292a2aa99fe8456172145939606eba9cfaae694e5fe824ffc3a5547195e24af5039aa1f1dcac9a9cf54c51099f82cb1a5aacd8c9419d1c7ce880366f1276fae7b9e1848e9ceaa7ef7244e5cb788f524bb50231ef4d81e14d59d3f884dbff575e953a145fc45f7661025e1f6fd95874eba803de03b5fb0a8f5eabdc739fbb91c45ad1c29128f Padding = EMSA4(SHA-384) E = 0xcfdb6f N = 0x95a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395 Msg = d5f5d567512a899c0168240b319e6abcd8b92a8d6e20b9d3ff80a0447ecf92155b8ba15f5743b1c798592c5ef806f7c6a39ea597e116eb0030c354b2966436f93563e52c205826486dcfe7d88c4b2d18d78b4d59690b5fa734cef0aa4e5bf7ca8c060a965270d267a951bd409275f2f99b058a9daf08fd103229daf54ebbbcce InvalidSignature = 672403ce06f1ab0ea42fd043666e4623299fcefead6cd204599102fc8d543d3bc93342fcaa1262d52e6ff344febda6faa57119ee7418cb78a893aeb245f618c072214e9740abfab998a0896a1c9066a823dd62b5ddf9e9fbd7bd6b68437eef595e90e725180b3cb12301a989cb78ea2dd48730521caf4b2754679c4df2d8e2c12b8c8e55f1327fc6624d85555558fad198db6973ab155deb56cbcfcd44d8a61f90400dd3760b19aaba4dc167742bfe1da0d9ce20036c284729e16b8aff5b6ac3121fbae8cd55fc0779fd0ef7b382c85db88b2ae79270b1110875923b2d72d8ed7d37e2bdf5396b158a89fd1ae95c146737db028ad6cbeb0ed43edd421197d23a Padding = EMSA4(SHA-384) E = 0x646e91 N = 0x95a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395 Msg = 6ba3f34bde03e48259723bd599464274df4de2b6f3bfc3b06970b507234a4f0217fbd5e352eb5f783d7138ed204685e4e43a27c71d25e25d4821be9c50f6adbf58d66f98b44bb326386d7f6ab658d177c2dd87c9b8787cd70182f4eb91a83a32b49c870f0b0a26b5d1ced6f56364705400a0c961cd9fda461cfd1e9ced483c84 InvalidSignature = 236f23de25bb3694f5ad9f09224f5ec1e78cd7f371ec50097327026fa53b1689a95eaf54738cb75e5abba87a964d32817fd5071febd84d60c7b11d95e33a7f90f22259bcafb9425cc1a79305a00a1b8ecfc3bfab326b6463ee57d1e435db91f45cf4edad0f9ee50dbe42130cfd1bc424906deab4906571688d1a514d98dd074139d57304c0c2d8a87ef5f8766486da8df827f9e0c81fe3465ea52d1984d738b9fe9368a0d05384e9cb298330671f65fe52062a0d3c4af210ad471bd5ddf9d72787f40ede3b77297c1d3a5b29ccadc574e9001bef89e4ac093986bbdf048d7b63bcc072a3cde800eda63bfa8e068fff4cb9f15b5f98c255fcde6d46f139e4d30b Padding = EMSA4(SHA-384) E = 0x646e91 N = 0x95a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395 Msg = 599d4ceb774e4906332eaa216b2fe8e1fa52506f381baa87c34319cc80ac425fdc9ab0af581f779344d71896cad6a5912fdf268056d63a8e867802726c4a3afe64cfa9f5f4febc1e99f36e96c7e56a6a2b58746533940527d05535777bc4dedb76a6ff6554d45ecfbbeb72cb69447f94752703c9d73b517b2b417c85b202761b InvalidSignature = 0745457af52fca56abd808f094951d3eecab89ec10b74dd49d51a9241c3b85972755a1f80bda2cc96cda7cfd549eec820bd2f99920ebef1d10722918adca8d408c3c883d7c257b117842420afbce88159c7ac4f4bf27f039c24c19dd275643d0ead111d5f04912571cd3a7d40e3f83c32b44762eb6d2e2de22ac006643c498ce55f6116463336cfcfd0ccdab250e9931fde68c9796e05b012adfb76359491f26f69ca9d06b43843a4976f2b017643e6cb80b8dba2a01f1b01231ace075ab31d40319b30ad738f62d2b8a1f43ff1bf67f83330fad67f94a39c2c51db23aa775aa43b708ef25c9c62eb565606e4f5002ab15b00dfa829c99e3dd96b454c7448174 Padding = EMSA4(SHA-384) E = 0x646e91 N = 0x95a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395 Msg = 73a125e5705e14e15f2446fe326f563785bcde93d2ee46abe4efd9668e9a1e089cd9656b0a0aa08b74a87449ce279068551f3edcc5ad3744cd17bcb5c0aee2b98df92e97f10f61d5eb4595fc7109899b610e3a8ebaaab3800c7c25af2d513aef2e48a7f28d3501c6ac44d19f82dfead791d1fa3318ab606889663dde3d4bceb3 InvalidSignature = 7a7a4e5b349a06dfdbc9ab958d5fb70b650b1eb2f7eb43cfdd7508062efc9ada3ec0739ad95b2066009f760c8c5030e909189f36b0f7756a67a69a38d2db57d0708a4a2e295b165411b2ebce13723bdd9194afb288452d49c585cfaa3148f5f5464145d2d673cb1803b6ade6003a9f25bf27325f8bc4b883ec7cad37eeecde9ea1a62d0b30da841e2446706e72ac2588948b15fd9ce09ecaf105bee8bea71622e2c58ffb9eae9bce35e9caea8ccc7e0c8593128a6656267ed088bc26347b7b249ac45e06f68034b6d39a4e2eba8c6f5c878450654bf36e5e73468413510e7b50d0e63de67cd7ba35d4f2afca5b460cc7277f04faf2fb03fd7c8995c2fc9b7e6c Padding = EMSA4(SHA-384) E = 0x646e91 N = 0x95a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395 Msg = 86843b3170034a9f8ea79a39657a5e7460c50ef75c800dad690c8818cf25a1e85012cdccad1e7a886c4cf648d7478c334898f044a41bdd5526b4fc7d5e3e089c79c43034c2f4bc7b69d0f4ae83a73da7534486b2c865e29d466f760eaa5f961988042b12b66c58a00f9c5d137183bbf8083199eacf4566ab53a4c073bb719487 InvalidSignature = 45dd07f00a1727f2e992cf0fdaff0c233e6a6866128416456fcd2db6030a4f3cd216db9c4cc2bc7440e06081595e9c51f3c81af68166f6b9cfc0ba4491bf1835b1c946d69d0a6b8c39e1eca84a3bf91f7a299cecc1d98e6fa2ec56cd01ffa04d37423933d746295ce669cd8974caed44f45b88cd7eaffbfcbc70353a3b45c53895edb4e6b19a65564ea3ed404506a4b8dced831c2174995b4455797dd2fa3430f575c6ee80b7d74149746b415ffa6613fc8404ae9e5625e1b8e2b74125b341bd1cd8ce2e87c06114f162fe464d299aee6ed0fe70cb4de523c5b0e10f1f8996f3fdfc9379c3267c268cf29823af84fa756b99ee42f4e0ab8b691e5145f43e38e2 Padding = EMSA4(SHA-512) E = 0x452b3f N = 0xa93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3 Msg = bdd8719841159aba3f353440ef98efa92cc503da8d00745bd12094c3809bc971cfe3907dc4f5c2ee9c2e172e6a61e8bb0028391e1277f62199777d3d76915d5258c85d9bdf4dc1e0024dc8edae0e7944af3a9f0fd47b13584e47397c5afecddd2032e0d8da451df7383a516703c52bac02a440931a325168b83ad16a7409a27c InvalidSignature = 2e7b28803bbf9d58be8219ace68c020a42a4b42e59c2c2e0faf56ca17f7c6f3a427688f124481308e249e4d579f576dae5743bae68b349f4d04bfc21d60a969b965827a67025bd8220603763cde90a42b4308f2c84bc2c4c8fd5de0efda349e9cad1f47140d01fd27021ddfe16873067213636ad961cc85d79a87231e1019ac4bedf9630e2c31f4b413d98ffeee53fd46ca6d62449e86fe7692b59feb18bd9296291d1bda77bb9c7cbf15bce21aff1c6f1ed9cc95a87378b13eed54d7b54835160f88f7ec710c87eec07c2239b7001bcd4a8428a1a274d1c78d89c2153c46f4ec997df9a19838813cef1381dcaf97bccac39739a3142aad21a966da1be5c471c Padding = EMSA4(SHA-512) E = 0x452b3f N = 0xa93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3 Msg = 3858011a054c52e3b659066f55f219dd58464bfb22b8c55dcc90ffac24f0e141f60929f28b8e0c2c7069204378ae790504cd1295820b6f77343381e73388ca6fb3ffc2b888ab78a1ea797c8e751dfd02734c2f715e2cef4fa109aa6d9f497b85f6a29314058ade67acefe4f95229edfc2d2d6836bd038d0e9a7a42e7701a3bac InvalidSignature = 311e1025e0a8820a5ddc4f632628bac218baa94fb32c709ff70db3ecb3a1957e31513fdbcf15d83927f5840584af5ed90b350833f50cbeb718b12c56fc260b41ef627776bf1c0a67f39be26cb0045e6c2b60216338a085cd867bc5d9e744a27ff77baea199eeb669a2e0096256d081b2313f3b79ed180712ef56a0b549eb299b96029fd93e4f68bee5a0e6c8ee44ddbb06b8843fd4365cbabb229d2f8f2a9881974adb406e6ffb39eba8f20da38b558d0069f45f91c85debf6872a4ff36d5a79284050faf42b78b1770b176c88b7fabaca9111e511dc73a2bacb30abc3a841bb5b0f0b844e756dbfd3f5db458c47861df00b085a06e07ab4e788a080483ccbe4 Padding = EMSA4(SHA-512) E = 0x452b3f N = 0xa93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3 Msg = 6883a018b48af70d2875a7f5cbb5a303d7338b6d76f988c3cd2f787f394a4bddd880aced4c7fe4e6bb5efcbd1ad422f6aca84fbbc568262bd45e1ef4a0c0e324d227fa3cb442a48638cc06a93cbb867b0cbb781629dafa2e49851ca29eb345505b60d22e753dff97a6a60be2b8d49739005450a829b7cd75338cbab0ba8b370a InvalidSignature = 15be3fb200858d24ddb7586470ffe706eb299da157880a68aae79ff20aa92eca298eec75ac4ada285ecabb10479fa593ee72c585aba707f45599de0dc792c6e3390da5729ae5506100b31c617ee12445093a7593bbcd0e5a155fb9a41cf332c9d65b0d8f077fb417f027eaf728c5c326bddd7be7bf3e69a165c57759337105b94623ee203641ed2bf58f1907e3413b00e08d54a10bb645175449f02da9366b11952364c0328fff018723c30625836a0cdc7a13c220428d03efd625fce63f022b59508fc68ed4d16294111fc391052705ec115da4ead8caf5c50af586ba4dbe1b29d04452f947b5fe9e16a798f5d00094dfe2ba910e6449bd52d3f938c045ca9b Padding = EMSA4(SHA-512) E = 0x34ddb5 N = 0xa93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3 Msg = 20075fe0b26832c234a861a77078a8e9a42be3862ac4d0d058541566a68385620e6c9fd4b9ae5770d7bf1a83cf840c2c981f94c866091aae8a600f1d93822e72bada029e7dfaa9d889ead78fddc01ea32d716cd484e7d57b2e549278d5c54a6beafa91274775af6312d1a2b3e45566b72ac97392cc88889e0dd7a75fb37560b5 InvalidSignature = 9166e91b18c8518760131ea0eeecc443023b61148a1d42030ed09d509d4c02cd0068142fdbc6e56073a68f5a942c0c93a7f90882f160522ea005f4afd34453c8c1b1d3a4e5204d0f9b797bc00b84d0dd96e311394f089567e45ecd0c795be010e7fb24e46a2842e8c7dae9d2c760fa09e20a29a623e6c53e3c436d809032b99ac4a81e63ba95a356f86a62dd6abbb0aac1d0759e44ccbfe225f5d206aba8dc7261daa9451ee1ba04de1172ad80c08f0709d2012ad8ffc8c5152508bc1e18ab53cde79ca50da9eee9b3b5229d38015f7e18f03612ad6270727be16fec06a5d9230ece777ff6936a3ae8f3a631e3e13f930256c3903d963ece49c5a10b5a6da47a Padding = EMSA4(SHA-512) E = 0x452b3f N = 0xa93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3 Msg = 46c4bea2eae66ba40f3a6223a28a9756d7c980ea6e4976e2342e5fa1cc238a45af4bda37727a270048a6e15fc798f698efe7f60e682776140b5eb201a4b77682f67b3e35003c9c737f54da6db48ee07a672259af2ce712b1e5c4a2c788675033233a31c31d9391a3be2c9475f1d21da34961eff443ef135ecb48791c019be200 InvalidSignature = 85f33d22d92f3e4f31c5fc0f17df916ec770903445f73536bef61966918efd0b380b9933d2864dfa10f5613d8a232412e5b3db44717eb576fc180891800c5d11597d2d09e477d0392740d700408f3482da6f8d9bac4da6faa220ca3cfd2287f5ed8654bb8dc8ac45e09e52e93bc78d8cb4e08d76e15cfa78c51852c93d31d64417c29aa7e22411746c280e3e275f71c4742faa0cece8e540d1b8bc393db120fc14244a2577650b514c73dd1e5391da76aaad375f56a3cb4e0ca942bbbb542213b5a38445cde0dd9eed4f7515c6c58251dc94c25f7dd929d714b2060da252584af84b82013f924fa91700d92523d69c96e0b0f68203a977affa92574cb241c0c4 Padding = EMSA4(SHA-1) E = 0x89e29d N = 0xe3db9f81f57c99898c867221eb20449ed8b05c1c7d6d0388cd5bc691b84cbf9301b52b60f34be1ea5be12b87cc185d92451037ac2b2f79d1bc43d0736108b1eac5f5a52b4037825385df38966d15562cebd09d27c8fdd3c9bb09c0b3d77b0c05a1fc40b1d9d26bcc8ad35b321ad5866f500bb9196237a4f4f2f282f9091fe99e39c37b862dfc8a22ec487d6e36be1ef8276629b60d845d92524e97d6d52689924ff354a594ccafe9087f5ec6a988c2dae41d2a400d2c8c039e3d77ce5450ccd826468fcfe65718d292e7765f0185df94d5fa79c1e99a8b4f823b19475c6004c62c0f7db056fbe167df368ab8019d58b89d7d3790d427844684b147f962ae37ff Msg = 70b6c465d2899b32b736c17af293c562a096d03c5dbe7e08b8aeec3be41c13c0b0e9543db8915397ddc609b8f4581590bb585359117db02066c63d81706182b21fcc14c3d43a6a23ce38ec67e4904d477a6e1be9aec19463d2e4bc7b1f7eacb0a7a72d7f8c4c85df70d4910e2c03148fc51f4f749c52d2d9e45091b159393ac5 InvalidSignature = a231e220538d59cdaf54f6eae7c96f83a3d95b55be54989c1a20ce18f7ffa760ba26879120a2e617b560bd083662d9e95636f1a639f7db31f4dd74ddd891ee6365d5ead006a746a90457cbd4a1b7e9c5df710c81454f68bfe8421cf4468facd85413fc3db970a7a0682ff1377e942c5e5ed4b6b31de3f63a05a8a26f365a355f021380684179aa99996de99e7cc22a5a370c3fff56647f33d1bd1b2948cac297bd622289c1797f2de3be4598593ca4748eb8f74d0b7199a763eb1801d60d09f28bad1ca1b6a3244a7bbf9a1270eceaed2324f604134f404b6caf3c969daabef4e294fcf1603e0813fe20b88aa36b534ad6e79d1967ab2ff4e70b672c642fce46 Padding = EMSA4(SHA-1) E = 0x2db7c7 N = 0xe3db9f81f57c99898c867221eb20449ed8b05c1c7d6d0388cd5bc691b84cbf9301b52b60f34be1ea5be12b87cc185d92451037ac2b2f79d1bc43d0736108b1eac5f5a52b4037825385df38966d15562cebd09d27c8fdd3c9bb09c0b3d77b0c05a1fc40b1d9d26bcc8ad35b321ad5866f500bb9196237a4f4f2f282f9091fe99e39c37b862dfc8a22ec487d6e36be1ef8276629b60d845d92524e97d6d52689924ff354a594ccafe9087f5ec6a988c2dae41d2a400d2c8c039e3d77ce5450ccd826468fcfe65718d292e7765f0185df94d5fa79c1e99a8b4f823b19475c6004c62c0f7db056fbe167df368ab8019d58b89d7d3790d427844684b147f962ae37ff Msg = 47091ec16155b1e4aaac582b5f255e06483ed8844621dcb92c26ee62cf98bbcc61bc0af1fa0fefe478d0417089be4ffc0623cfb2831117e124ec909fb22867b2ed5485b12458c26604fb5577aea88f450c71ca1564549c6e2dbd50c1224d965096da794807b79230f5357b87f46987a90130b0f31271d127f1a21612498eb06c InvalidSignature = b31a3134c6ff700b8c9390f1ede010a1404d0f297ff5d322dbc3e3e9be541f1aa4667aab8eb59138bdcd1d4e064e9a284c503db86bde9d270d417d3c98d1bfe67cbbbbf7af4021879e02609573070f6c5d5930e65d871d72197e57acc9fb69d09b9d41324959c291cf49c581f49681c3ce6e3d22f0c27aa5b1ca3979c930587280415ac38ca66ba295ab5b8b78b4cdf719c81c8b762935be3845124a5506815adf7d289ad030962a4b16cd53376888a266e35deb0012612731b8c284cff2e71c8d09b2c7b2294881d4b7df459608778dd31af8eb74dd587c687c1a3548c0aaa003867db053add678f6c1500f9f9a5132c410f77219b1cfb7302365eb6fc194e3 Padding = EMSA4(SHA-1) E = 0x2db7c7 N = 0xe3db9f81f57c99898c867221eb20449ed8b05c1c7d6d0388cd5bc691b84cbf9301b52b60f34be1ea5be12b87cc185d92451037ac2b2f79d1bc43d0736108b1eac5f5a52b4037825385df38966d15562cebd09d27c8fdd3c9bb09c0b3d77b0c05a1fc40b1d9d26bcc8ad35b321ad5866f500bb9196237a4f4f2f282f9091fe99e39c37b862dfc8a22ec487d6e36be1ef8276629b60d845d92524e97d6d52689924ff354a594ccafe9087f5ec6a988c2dae41d2a400d2c8c039e3d77ce5450ccd826468fcfe65718d292e7765f0185df94d5fa79c1e99a8b4f823b19475c6004c62c0f7db056fbe167df368ab8019d58b89d7d3790d427844684b147f962ae37ff Msg = 36af136c05bbc41ee57e94a1be10cc6e33555225797e1c2d6ad3ea9bd5b0355619ce6278f2c43cf792cea184f4cc7bb36d8ef35d844ee143037e86f34ec57df0f444ef0d841d071aa236a5c2593a57b4b3e185018772ebc593864c0aca0e65e9ef9721f263cd0bcf3c3e0823966146b82ed770da2df024fe4171a6a8f295d68b InvalidSignature = 7f3715dba789c233996dabefac36c3d860c9dbe64e58f940d5d3eaafc668cf9761e2341d9bf28a3c3ad67071fa2d875a440df5faa250a89cd9c9eaa5cbde311589d4a443c4148909d6cf69ca0b150d7ce46e7e50128b942d896f9fd536e311e569415b40e405c3d36c89464006305842f9e9ac24bc9a543ebc693cdc99dc1ea4d88b3387ac8ec899a8b7471259bf1d62fb1f15e6fb29a08b30696c4d07e27517bca5bfd22c3b1c7c37d0b5b24b4a796ef4d6589f9b8a0a481db4fc66b44adba4d83bf1cff377ead44109476d71f34a8ac63303b3bfeea171aadac84c0ccd59addb5aa923213422d58d914b65a1705fb884e56ef51472aed15050bee268720c55 Padding = EMSA4(SHA-1) E = 0x2db7c7 N = 0xe3db9f81f57c99898c867221eb20449ed8b05c1c7d6d0388cd5bc691b84cbf9301b52b60f34be1ea5be12b87cc185d92451037ac2b2f79d1bc43d0736108b1eac5f5a52b4037825385df38966d15562cebd09d27c8fdd3c9bb09c0b3d77b0c05a1fc40b1d9d26bcc8ad35b321ad5866f500bb9196237a4f4f2f282f9091fe99e39c37b862dfc8a22ec487d6e36be1ef8276629b60d845d92524e97d6d52689924ff354a594ccafe9087f5ec6a988c2dae41d2a400d2c8c039e3d77ce5450ccd826468fcfe65718d292e7765f0185df94d5fa79c1e99a8b4f823b19475c6004c62c0f7db056fbe167df368ab8019d58b89d7d3790d427844684b147f962ae37ff Msg = f5353bc971efc542fe9df930db581a158f541d68c465153b58c2ef1bb20a5f3852841ac6acab46a237ea2e39c1a43ba60577201a7fc254817f64c5627dc7cb07ac1e5adfd1ea7d2056c3ffb09a556b468ca938cd78a63d0921d76b7c0f6eba8b2a8964dd88b5520484b0d35f1074943e4c70cd485719b81a64a147311106160a InvalidSignature = 5f9603f7e564519597548787a74e66635267d3cbf5c26dd9df7ac1069a712bae0c1ddc1523d1751610ae85b1f59192674a46bd727bbf0af902f204c7eba4c6fdae5f84c0d16ed0b8c000517b446473fbdc07c74af0ac6a66ac648c1397c42bb9a74db27dc5605c62e40e5eee1c9021eaa30a76523a35e6ecf513379c0e6e2dd2fa38611e91007f82a3b37d84a6fbaf936286f195e8064e172e8bbbc22d4c15548d0e39b1eff14d1b0ba75c4e1d0acd16fb8566742091ddeb637aa2767e5bd859f145c135cd60257a8c84ef587dafca0d97425a1016d6dc8c3f7eaaaf8d74fe42fbb64958bd00adf03db43920d9831ac49dec2cf534d3cce2dcae9a102a608c5f Padding = EMSA4(SHA-1) E = 0x2db7c7 N = 0xe3db9f81f57c99898c867221eb20449ed8b05c1c7d6d0388cd5bc691b84cbf9301b52b60f34be1ea5be12b87cc185d92451037ac2b2f79d1bc43d0736108b1eac5f5a52b4037825385df38966d15562cebd09d27c8fdd3c9bb09c0b3d77b0c05a1fc40b1d9d26bcc8ad35b321ad5866f500bb9196237a4f4f2f282f9091fe99e39c37b862dfc8a22ec487d6e36be1ef8276629b60d845d92524e97d6d52689924ff354a594ccafe9087f5ec6a988c2dae41d2a400d2c8c039e3d77ce5450ccd826468fcfe65718d292e7765f0185df94d5fa79c1e99a8b4f823b19475c6004c62c0f7db056fbe167df368ab8019d58b89d7d3790d427844684b147f962ae37ff Msg = 1bb027c0e5d654997de7dc160b71e063582c0819ec8ec76d779ae1a86ff92bd7fb4b92c310bf5f23d9e1ba115db46cbb5c01e95b79ee8d699fd2260e9d48b3dd13836bbe92e1012affc2279e389a5149fa45bb08039bad957345fefc78cfd74e2afdb998b463c116b5302ba5e64b1677fca1860ad0bdaf5bbd99715749b31f92 InvalidSignature = 9d406f9da2fd0e203c0943427dfe1074258b288266dd3d85b1ac5f104d50f303f3442cad82b9de40188e972a0895d91db3d5a8b9588da7f63bfa99d79f98a03a3bab502a7c269a9b85d9d57cff86908e7d04f5ac2757e6492cdb3f76ea9e5fd8c9b38bf0828ace69ec8ebc796f0cb9df24714a1603fccc04195512194705ce2144f636ef56600df40d6f472570ccdd57bbe0b550c1378202185c871d03fe22dc0b265910f63cb89bc34b4d71eb4379ff32c6e8aec0079315b896cf015eff9799fcd285cafc50d15b8b35b0216c535df9b5b39067273037444fb4ce65967ade4df30d3aedcdee30a7497013055bf63b6271d30b10566d2a767f3574f9c2446ecf Padding = EMSA4(SHA-224) E = 0xf3e453 N = 0xbc97958f980fc043630735e36aef0f278be381655bc6a4940864e6925d31ff1c9392ac5fa44b06af295818f03948a117bc7f0fe8f2f5dc0c1cbd9d1819913f13c0765f41c17a62a9fa70422578c86305c0e67c56b2d555fcc12a84c45ca00502b692d8790a26bb73a8f2df1fa44cf910ca45e8ea2c665a9b6d266c2c4c6075c55e686511683cf75bbca9573e8b79f01583d57bb21b6e8f46215962b9b3cb1e57ea56221f6ab61cf33f969babe3b5a1a98a76387144cd617751ffa012d8e7d1471b264c274228e2bcd549468a57316f392c75625435ddbe7dd3dc40544f4a9bb9cf5385b255ba57769897203a7a3d0f2808e05492b69a58483f5fc396e6523da3 Msg = 2e90050655247289b29aa75e121c7c129ec0fc935dff0b42fa684c49c895412f035fb4aa594e56b4a853a7e00aba15ef0f5a689e490f5dc30e6a919879a6a157b2de90076f7e6995bbf82526f7b8ceac1e59e5b74d19028f828aba7fa38bc573c37760c6a29cf15572efead8e1fdef7253253b866f0540cdde328da54f2cf5ac InvalidSignature = bbf53543a9dc4a94401880f3906d0c33a64337feee11dfdec2ef8d2e6eacad082438f9bb7549a9fd26c53231a6ed6dcaa88cf1e5ec87305425ffb3ca103e825546b53b379d8ef5a1f36b998620ef909a6306ed091fa28fed1ca6459a5884cafa1ab74086f7589d7476f8cfa2b4b91368301357110e48863a2b452b6d76b3073253ea495dd6c9978bec851e4c635a37e6dcf714d09d3836e87193405e60db2612d4502a685e6671eb03fe43b12993e8ae1c965a1f2559d3566e6d69cdec42ccd5a3046fd106e156de5f68adba7d664af89728775b9ac9ec89e8ec1185ea282f8f97d72ca8cb0dd739386d0cf6caa06a4c074a270863baafa918526aa54c11cd67 Padding = EMSA4(SHA-224) E = 0xf3e453 N = 0xbc97958f980fc043630735e36aef0f278be381655bc6a4940864e6925d31ff1c9392ac5fa44b06af295818f03948a117bc7f0fe8f2f5dc0c1cbd9d1819913f13c0765f41c17a62a9fa70422578c86305c0e67c56b2d555fcc12a84c45ca00502b692d8790a26bb73a8f2df1fa44cf910ca45e8ea2c665a9b6d266c2c4c6075c55e686511683cf75bbca9573e8b79f01583d57bb21b6e8f46215962b9b3cb1e57ea56221f6ab61cf33f969babe3b5a1a98a76387144cd617751ffa012d8e7d1471b264c274228e2bcd549468a57316f392c75625435ddbe7dd3dc40544f4a9bb9cf5385b255ba57769897203a7a3d0f2808e05492b69a58483f5fc396e6523da3 Msg = 1ffbddc2a2c8bb9fe7a45e4d5532711f07eb17f5676425a8fecf8ea88ac51fe351436ce9b6f20a4e0aabfe50a43a76ba3462b709542257cc6037ac5188e2847d23eb16fc46e6399b96b5d4f15a4e9645d5bfe7acd26f1e7280a6f4bb804f386a3dfdc5427c2db24b34cbc8789ff7398691088e2709d1e26005244e309b95a472 InvalidSignature = 82fbd5a6d937fa94eff1c0d9abccd9223bc63a600023b18c3be059d1e73fa62f1538ddf45643dff89a2d8f0410c10761933cb2d8d702a4b6582fe349481dfd185f79a36f52a7ce776de58dad1edaf032edfeb7c16540eca64bc5df622c05dd629be3404b9b4d263ecf706c364b0bc7b14dd0346b8d2515f81b1f50ef8871ac11ed33973b992deeb601b2f34af381e1d74091b6ac5d7b209d728bbe17046f21692af8948b3bb194349dcafb2a580a5ec120af999a3eced9c1edd2e81ce75cee9f1636351a04028a5d615cd992c467b607c1d929db0c884f1fd0688107bfec2428adc9d3b40b13d9f4f240893a5477f1de626130fbac9af3ba9207bc857fd206c2 Padding = EMSA4(SHA-224) E = 0xf3e453 N = 0xbc97958f980fc043630735e36aef0f278be381655bc6a4940864e6925d31ff1c9392ac5fa44b06af295818f03948a117bc7f0fe8f2f5dc0c1cbd9d1819913f13c0765f41c17a62a9fa70422578c86305c0e67c56b2d555fcc12a84c45ca00502b692d8790a26bb73a8f2df1fa44cf910ca45e8ea2c665a9b6d266c2c4c6075c55e686511683cf75bbca9573e8b79f01583d57bb21b6e8f46215962b9b3cb1e57ea56221f6ab61cf33f969babe3b5a1a98a76387144cd617751ffa012d8e7d1471b264c274228e2bcd549468a57316f392c75625435ddbe7dd3dc40544f4a9bb9cf5385b255ba57769897203a7a3d0f2808e05492b69a58483f5fc396e6523da3 Msg = ebcc2ba94d3b4e302a8ce315cee44fb966cdbf2820d06a4c8c461660486bdda6dcb4315de3631eee6c58cf669f2a5428a476a2e4c077dbc3c1d7d0e49dc5c50c5648749920d354b8c6191ad84a22805fcc9f469bac7b77fbf3b2ee7fef66186d1e30fc464eb478f80178cd5516f65ec4a6efb4362d03c65cea7f771888766131 InvalidSignature = a2a119edb1f0e2c961fb423717be75cb4f9a944316ce35cc7eadde725add5022ee9e09ab57a784c13bb6f9a42ee82379ffac286cb44ef43576b69ed532a67c3a32f256acad415278fb3a9b331695915a70e7ed56b428cb1328cbeb2ac6a7ad62ba529bc8e4211676b77b882897261fb61c0356b3f12b2583a0e90009185c48466ce5363ea3b011b3f5bf5e5f48099d376e5b3f9184847b2d6fe737fbfb7a9aff128dae37d4bdd133eef084f9dc964655583be8595515268c5d8e91198ef9464093b8c156173fd19ee0a28661bcbdb5c163e1be9064c925813a7d18e43c6eb8a3dedefc82df4544663780c580572a08e607f21235d327f989847df98d1715c1cc Padding = EMSA4(SHA-224) E = 0xf71807 N = 0xbc97958f980fc043630735e36aef0f278be381655bc6a4940864e6925d31ff1c9392ac5fa44b06af295818f03948a117bc7f0fe8f2f5dc0c1cbd9d1819913f13c0765f41c17a62a9fa70422578c86305c0e67c56b2d555fcc12a84c45ca00502b692d8790a26bb73a8f2df1fa44cf910ca45e8ea2c665a9b6d266c2c4c6075c55e686511683cf75bbca9573e8b79f01583d57bb21b6e8f46215962b9b3cb1e57ea56221f6ab61cf33f969babe3b5a1a98a76387144cd617751ffa012d8e7d1471b264c274228e2bcd549468a57316f392c75625435ddbe7dd3dc40544f4a9bb9cf5385b255ba57769897203a7a3d0f2808e05492b69a58483f5fc396e6523da3 Msg = ecaff1782bac0b38041634cc60fec76f9a24158791bd0f88fc734616feae166afb121df6a949f24c6a02143cd939213ca2b9490e98e0019c01a3fc2734d157a0679c1456c255c9d2b87799ff96e7648f5c7a3b99cdb81787c2e0ca2fc32c3540d855bce09d5af793957eaa5fc08ff82e706ed37358ccb710e6329878d3441910 InvalidSignature = 14d88e528c39ffa8e3e1d60e24159bf03e6e768740442360d19070b036448264496ae1fabf81b37042cad4420e495cc74b8fe4b28c09d07df1bd55cf88aa24262ec49f9f9285c02a33c64d86bdeca15843c9c65a6745f6bf7a8216295642232c305b183eb5d6b0ac0e37309481f194c66828ee14f6a626daa91c6f628ea134d27ba7e96c4146dbcac99b34fa708a82c51c1d669f93dadfe926cff24c25775567d94f06c61110676a651655e67f3fd8d20ef0884e112638113f06002454e3b88971758e74e56d70bdd6b3884aa633968a45bf1750fcc203623f59b01460f350f2bfd36d9280c1b9eb99b7655ec2fbcafc1ac568361ab3de1c18cf99aa6ba3032a Padding = EMSA4(SHA-224) E = 0xf3e453 N = 0xbc97958f980fc043630735e36aef0f278be381655bc6a4940864e6925d31ff1c9392ac5fa44b06af295818f03948a117bc7f0fe8f2f5dc0c1cbd9d1819913f13c0765f41c17a62a9fa70422578c86305c0e67c56b2d555fcc12a84c45ca00502b692d8790a26bb73a8f2df1fa44cf910ca45e8ea2c665a9b6d266c2c4c6075c55e686511683cf75bbca9573e8b79f01583d57bb21b6e8f46215962b9b3cb1e57ea56221f6ab61cf33f969babe3b5a1a98a76387144cd617751ffa012d8e7d1471b264c274228e2bcd549468a57316f392c75625435ddbe7dd3dc40544f4a9bb9cf5385b255ba57769897203a7a3d0f2808e05492b69a58483f5fc396e6523da3 Msg = a3069d04fc7ee84fd9eec56da26a0ca4130e7a8fefe1051ff3ff6ddf09f8147cbf730f84f7177d6ee0ab17db257b091b64fe01f3e1b7859d7c598911e02e4183feb9342dba9b924ee3b3c773698950f5caedcdc3cedb586174a216312c450bf246223386abd1cef8cb4ffbbdd65c883a2f2109871e162773c5233bc855061cd0 InvalidSignature = 1bdb6149e68a7cd3a03c9c8157eaec117dda194131006faf90e3e52f9ba4fd5181740fb59343ebafd2792ab4c04ffb3221548b203b8173afc77e59922734960e2e8986c598a872bd47312435001cc8d2d9123b010e09420a28fc66ef6957c319fcfb0d770bb155ab2ff3b13b634b91a9c0bdc183a639ecfbc2f326865e4ecbd0a15ec595e2c15ee96cee8154c96e0c5f4296c5d16821e79da890c0bab335424c7c5e856381194279266d0f13a4c608792f2e42ede2e1aa05b71862570a39780a490b4e66011f10a27176699c169b2878d7e97b416647dd798ac885c614d925549731be52e059e194a2384e9686d0f372a6cf338bdf13fd4525f4d56068a8fca8 Padding = EMSA4(SHA-256) E = 0xa54611 N = 0xa6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775 Msg = ba85e1f4f9203ba8d3eef645d7923e10c614080149cc5ec6e282f70b23d30bf91ed665fc1c00baca924539a1508063cffc151d78bfd504943e220037cc531c15dd5a9545bea330458440d13f43444a8a806c7174e805753f42097269a28c4231df56975648d246229327e6a716a49a493a612b7c2c235acfd581742a0d452653 InvalidSignature = 90bb73e761dafdac0b38e4ada5deb5f713ffcbe119ee7af2152ffb3664ed8b7dc11815fdd39f398050ef8d901f836945a89dd0c71ace4b60979ca7e426f676ef3653d7f5045afbf7f38af3eefea2bb2a34ebad8ba029874995d24e98926faffcc79f110ba8f9de35b48829197634f0d842a8ef0dedda72807df0676e08c6b8f76124ae2994151c0379c21dcf3ee33297d8b13eaa74511ec7edf8058dea5d5ee4a6d6701d0700aed62ebe6d69dea7d0b79d01fb5fedb4e291542592e977fd13ad1d49d3c9cea4abaaf003764ad0d3cfd75cae41fdd740e6c17b36831a8f88fd8f9432f45d2bd529291c58215c221d546d71e78a4a4787630af5692a43e1c83af7 Padding = EMSA4(SHA-256) E = 0xa54611 N = 0xa6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775 Msg = 284748185ce9e8eb0f872623d43950277e53f59b362f9b40ca2db01548f7c3c3cc0af4379672a9915fd4833dedb2915fe6ebc375e281a138c39f3cc249db65f6e1b81e1dbe6f4ecd2befb90f20222ec013720238108cbe2a0c6315cb77781937105aae10fd683e681bdeaee193109112aef09c2dead65adf4d812178f959454c InvalidSignature = 49193eb45d4d355537d9bdf3bd2bf0fad9d7e33241172d231dea6ca7c9d7bd2bc3ed85285bf01bf379da0db4fc04cb7e53cbbb38695fd689bb73f818bd4e3fbc042013f8e002beb92847dd0d5fee9867cfa3fcf76f3f648cc36f4a67e295aff914f796cc0cabfd4396fc6cf171f468361ad6ecef2023b0a23884880a17ada5372c7cda32cc1e3b986451219d7a171e6c6d5608c3dbe55403b4b42f6eb3f87948d0d72f51de963ed80033b42b5e7ba76c6fc5f74b9a5249b60bb507dc86ad53f5b9b710652a2486a3cded83e447a4c114c4dccabddc51787c19687548c4ff157d887c7886b19ff85543c7f8340a6fee320ba49e02c463c8bbe10d45805c67cb6b Padding = EMSA4(SHA-256) E = 0x5bb217 N = 0xa6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775 Msg = a3c2ec4c47f444bec34c15ff25f2f811fa94f9a5bf05a5de982a6458451609695174a8a68c25a7a9bc2b181290c646ccd5dc8e92ec9e71b17c69e70f64eaf56cf48681e85cf966c5643dc46f5ead99b9596a966a98fe2bf8433fe5935b76f965f3c121199eb6a69a2449be1d79f01961ef05b735aa6bfc3c547406ed13023edd InvalidSignature = 039c1de64720207c408ea9889471fda297c7b3828e46831ca5ee60a938ba13a7ac524cc394d5ea12d89c2cecfb06ddcc6d86994ebfaf84eb91f39ec470898d89cbc55a12dc47e7be7e0f389dd12c5e59a32d5ca6a37a3e6456fbb8c8c8101725cc3d529f5d1be12de765750e5ee632e43031656442ab0e49f9471cae87dec5751130a2622ecaeba85ef337fa31c472d6a9696231123db350f5a390c8d7ce1f1a839a4c674aee4e7af60ef62e689117fe645e4c322f20373b9fd75dc8606e70d659094f2d2c98108c6c32576adda57ac0b30c47dff442b0901448c68aa1afee4879eddd84d9f2f954971249d87811219e433f3d0d5adff57133d0e9c12f82deec Padding = EMSA4(SHA-256) E = 0xa54611 N = 0xa6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775 Msg = a14e35290344465d6d2f43688a663ee418f80f13e1dbee22ed4641aff65bb28a1c0985b8da3128be39070c1c43bcb417bb5a0cbb0beffb217eed3beeafd1691c420358fdd1fdab7c29b0a3a7b723356a3d5e609dc986bd42e8495807177dbe137a0357fed1f2f621a7f1af11cce5e96606cdb3c104e95c0d93223d0415a6daf5 InvalidSignature = 93775fe8676f4e6ed580f3db99e0697e15f8e0ad168a9321cfd004e6d0bd555bda6483f51b1df63ad78f28a3638e70d230c5e654eb4c86c2c1889a06e28e2a640210523b90fe14019d03d0a3b14c7608614fd88a84ba2c68f7c0e01f9502269382367a07f2d90ee53e15abcd584c56de4602f7573f493e41670026fefaa6e12c615d19d1b2ba25cd0f48b6ab20a8bf809dd15ad9172bc8823302993b51f0ae5f89e5c05ee0dfd91f8926abe7fc64c7694613a996be5728ba3c6a4d2387331c5d3b21377f9734b587fba180577aa6cbba1f4a2483e4e46a5d7c355b4088063d32a10c99bc654677eb08a9b57ad40d88d378a8111678e8dc60be3c789a0639c056 Padding = EMSA4(SHA-256) E = 0xa54611 N = 0xa6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775 Msg = 555400784d0566105b91dca7f4f0849d832d51f0a3c7d3b9925651fae271199672d014a19dae9ddab1719376a38dad2001a60e3d27f51a74b6ec876e421db7da4b5845b56f13dec8dd0f52720d39eaa7afcffd39e1c3be56a4645853913b3da7c833ba3b2afed0e1c8b33f219abce33c75ef436b37fb68684506eb2f37945206 InvalidSignature = 6dbc3049603abc4677bfce12929bcca60bff5350809ce3f98259ddb72967faa076bf02206c9bfcecdae3421c66f2eaf846b4effbb5e6d774e000c1f1f7c1cf409b98f5e0ca13cb2dbc5b1692c6bf7e54a743e4b24c53451387f277aa66e16da87246d3ab7ba1fc5ab1a9029546098d12d1a45293860e2c8f4838148c89921467285b0f6c916f3b0bcab98dd01120055ad1acf9ce18a2f276eb15aa6f9a0fe05652aec728f831063fe6c7985ce3be11377703f76b4904d292598abac7be35bd1409dd7096fdc851abd2b20a1883f4f915309ecf507ce76dc9a75b36394c6f1fa6685857538ff3b847affb483a670969ff59c8de0391ce73bf1e85601d6bce92c1 Padding = EMSA4(SHA-384) E = 0xa26a2b N = 0xc5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023 Msg = fbf1f99265060ab82e3cf1a3cb86ea71748f05c4d69e79c209bd3b61c11acfe1c8ad5f9aac1b0af7b5db7ec31997c9a373d56ce472d6b177cebe3f3a81f6ec7a33cfd2b5f668a5a433d14478e4708d6504a4765d44a9591e00bc906e717f42a5249e7c6dabb384c692676a4d95dadfbd0f464ab6b6df19bd86fd5585fb7c7a6c InvalidSignature = 89e152374ee953c4d9e69e29c3100f0168eb71d0f5ad31f6eeb52ab6caa465ac028b81478947fe08765d77dc9d4e75bbe2cfd14f25124e42f7bcff6512193cfe3ef9dffbf07020cc5e4ab0b0c44fcc4b2bc8285f16fe08be89b432fde26b0498c9ad46be8bca8e1354c39b571a8e30f07aec84a1fc9d1a8e239d79223a6af22b4abfe36ac108291503a4f557a7bae28b25ceed47fd5b81182cf391ea409de7ba1eb2b404d4468eb2b47c2930845e2e9199fff4f0c838e3bd5f3a0bc798fd6fa4be5e962070cb45d01a84170638fe2234e8df928777213a87be0adee56b8ae514cc05c5d52f872416b1ea2112e76c364ce82ca33027e0fd1f8c0424276659c08c Padding = EMSA4(SHA-384) E = 0xb2b5c1 N = 0xc5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023 Msg = f2280564177a0b97e8089b77d7d0cc8ed54849a90d44a7dcd319f5c6d70394169fc4494e348e90c81b2333f6863b1cedcc26672517b2bc7a5c4fdc77917179d41a364b3d844960567506b4fbe3df01cc85fed8e9872bf1fa82f1c073abfc48164bc634b96f732449e0f9450f55832432e818c47dc777ee632c46c8408f6ca9e2 InvalidSignature = 7f65da249423b1406aebe4ca1253075588b101d47207acc5dfb7198dd45548ee71ffbc1bce87e7befd256ae20250208c451bb3a4dabe87c0dd67601ce21a49b1fe723b224d02c7304876e5b2f6804f76d1d57fea8edb951b536c372929863cca988380373af61402e746f71103a9d012d0db121c4e2f636e44b6457d16d12e8b493bdec5d05fd311b502e56ae99071d9bc62dcae68b27f8db50d030963e2dab44e4215be69694a55bb113a8c43d3c2412af0ba055ca740ca628a6254add0e0cc51593cd9a283cc70303caaf8e543ac71bae196f208cd4c9373e2810c94029da46b78b421d6aa8bb00bd83c474534bbaf9629f53bd2df3346200631f7cb9ed4a6 Padding = EMSA4(SHA-384) E = 0xb2b5c1 N = 0xc5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023 Msg = 55c50839aa7d0321a6a85cc3f55ba7f6643bc6a18a8faf73ae9a70d4e527701b7b65f70194f5f0551342eef2bb116eef94595c159154d8966fd639fbe0de525fe96af5db8990b6419bcbf10dfd930f98f230048fc5cf1ca4b0d6f883fb75d308687d0bafcf76dc4c06ec6efc0309125b4569c8f7702906053741b4537e147b7e InvalidSignature = 0b853828fa2089ce0d1955d52b20424748a4b227b56c557ad63782471cd0462295cadd808c5250ed2f11e7d2754c8734fa9d13c8b96496eefa515f3f127869bf42fc8c6bd0ea0247863b9c56747d15b16da322064f7cb723e2eacb4457c241b3f84a63b7bc307dbdd63b4d755b9b4a6c0b7590e5c1c7c5dbf9ba61eabfc29a21944ca6166e56e01a42a94b5d8b898c0fd073b03ea998f35e26289454012e62bb58222fe9a03c9b0a562b9b16602c7794ba835245a1401b8e3ae28e00541cb7a9aa8335de46d063739e8c71999b65f7c8fec3701a46bf3c60139b5b780bdd08c679117e14136c84c93fe403efbf346213ef4c85bcf3e2dfd44a6b616009ff47b4 Padding = EMSA4(SHA-384) E = 0xb2b5c1 N = 0xc5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023 Msg = 71ff5c8bd950fa414c774075da8ef7a1a58165bf4fb7670cb1f5c00cd07fb1ce0c80ca719babffe73623fef91298c08b12b35e223bb527a3685bef5e3f04a94a63153992eb9d83511435c89a322b32bceddfadc4a96cf943468bfd510ab55fd1db8851f7b26cae084c764561238d75bb9ccbfaad82250672b34f93ed19daf8ea InvalidSignature = 77b82998fac61f387b1a3264bd695ea3fff605bdcaf4c2d3a57f87f3f425134b16711c7812ef1a6c7a5d191fed835b90769883da3e7dbc81e141e3a477cee00b1283e80dca67998835ef33480caeb10f5eb02374cc38129156197e81ffdf36a09e4c22ba30adf9760c441b9691925a2233138f93bb0283be4affec35094f9866e1de3ba4a7c3ebacf88abdd8a1034e968d104235a805c372daeb7b7844ff292bf1e02f3fe8912a28d92e0724f285410161f4fc8c9ff8e0ae91feafb890de775f874de9c8fd990fe77c21525d55f882c432060da56561811cb7fa2a7ba4ad907faa5453d1c2a8834eeeb7400f17445d59a3344fa64db8ee9e97020c5158def04a Padding = EMSA4(SHA-384) E = 0xb2b5c1 N = 0xc5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023 Msg = cb254c69cb296eae328fafd8354396594c74e8f9ee4783289bcc8a922031c2f517353c2fade0359ca8713a9ea899907dace6d272d982dcfe771de8803d28f707ce44736583fa12856bacfdfe90cb32e77c4b26eefc54afa4243b221b93b0b8b3f9393731d6dfce118426401e7743453fc48a2d94e026c6c1aa0c808aac32cfa1 InvalidSignature = bab31e3b71988cd3f2a772cd0e33b9db6d7aea6b6b99f631a0259ddfe9489bc662d9c6c9e03916592f212bd4e9619148dcea0b58b475c72dff8815aa3f274ad19d19126d67dc6d120e985ce16a3aeb64aadd785657fc0370c701ffebf71d83260ccdd9da04a8f29a69a01c3a9a6d2bd942c44d5cb91fcb44af60a2b8e2c94cabc23ca04ec6d3005a82cbe06546c38d4fedfc56d549c785a2e23b04ae0135b03a17d63ea504c51a0d129c172ba2ecea5dc6b8db4cec7b7a4d021da03ebe8cf6cce67b8e032b4ce780136afb144e5d8019e7916932ba87c7d9c963c0f51d62c873af41396d87877ca5ae888ea7d322faa79345080fb9d2e6dd98b7b219b6662114 Padding = EMSA4(SHA-512) E = 0xaf8e8f N = 0x9d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7 Msg = e74ded82964ff874c9e10540c9f1dedaccb376b882e61f33eb5afd316bafbb01205f7c8673ff1598edc179a74d3e74a1d7729d16ee08869be5d8356c13afd855254eb4d2b8b55f7528a12f88a253f2f48193df61d7f5cd9f495ba34421bb10979e227cad8ef93ed21f880f2bf3b8be99721d26df64335e08bfe82f03bd5bcb91 InvalidSignature = 23cfae518dad78ff6540e64f54ecb571ae4fa33fcc57732d8555cd25b44b46f46eeb109f91af7d08c89e16f4cf6aa119cd9633515c55ab3fad64c8932417ca945be3e26028b752bca8851567da6408e211df8fa215a8ec07fb6faac5cff26d174a1b5b7fec9ab12c128489c4ccaea60c1347b8451bce07ccc9c21e90c2e5dcbea4a292c16d60ba66ca4e5ffd6c9cc3b8ce4ebe39df418573e0e9f42ae09875a11050a434538790c5c700b5adbbf700db2a93f3e5ac4c570f8543f0a1c1d664f29d161b064a0892db495b68da2454eb983db0fb3defb0f688b67c8506c20dc7997e0bb51854a85af613a3b9a0ca3e746f3d8393b62106c58f8ececb502824c478 Padding = EMSA4(SHA-512) E = 0xaf8e8f N = 0x9d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7 Msg = d122c9b539021a26f4e66a823f29791780a879da291b1858dea5baf0daa906408fe0a5dd8ca84647a49fe61c4d714e8b46eedd0c7d60874e2f1b1e715155d0762f38f2f45336fc0ca89dd49edf6b4fbd1263f561a760045c78eab8903007ca5ef85336625453425d4707bc72bebe83962c2e494271c4966a003910b34166fbe1 InvalidSignature = 57619bb864865b005fae1cb334fc5e60a23cb148e722a781b1da7e822b849b93fc502927ce9d72bf8d2f809ca6afaaf268133a7820ccb1e6c5e8a7252f67f41c8c67f97d19c718b15c32a2fd4a98c69ea535b37d6a1c884409603c80e1aac8ca32c48ad5481ab56a02526a8f37b884f15585a4989f0a7c7f3afb20718f143c4d49fdafdd33944445d39bf857f8c03e4132b1a00d52064f60172b44b67919610f2b69fdb7a51b69087915f76a2a0896fe53103c81c27d00b8c805b42d2adbd31b21d1773bc1f96b3d5f9352f224cf1ab93c18cef97134fb3cafbda7b8e4c301981ac4027486d74d1308c234f84a13cdf0e505d02c3f1f2b8e9984d6b2fdbe0400 Padding = EMSA4(SHA-512) E = 0xaf8e8f N = 0x9d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7 Msg = fa0e2ee8d953ee3589be814638512966d3d5e1b4ca874079170f9fb87db17e070dc7249eef6f86ae5f816af4f6c4cc8d2b61810c19971aca83b10b7d15350d0cec5fc0a259cd9502e27ceb1a8af378da53beeb46001ecfca1fffb3ce472a888b9fbc4a1d9fd7e3d91b974ce07d48f5f452d6678b08842822f5e1ded49cf9b82b InvalidSignature = 2fba3258af60a9c026bacaaba33076b21789358f63d709e4b2374c7e010a3f13d77d71aa6a70a116eda22a652706ede6234e71bb688c32697087a0c12c422e98cd6ea530ad7adf9e293c5eda311578cf0cd6b2cb32c9342f5e2e2f3fd8b27fd8b9bd7beffac03adf6148e72d9775c27ef90aa232f49bed02af05a0d1567817116a9abc0b81ffb02816ec6bac841e559fbdd7c2e41df9e4b66f76729fefc844d6dd6a879441fb212d4c065ebe6af9365fb2ff053433aca778d3a667c901dfd7dc35bc2518640a79aaeca1270646464ca55b872017a51cff49b56b53f70324168da72b0b5a297b790c89b1f71fa7937eb1e514d77f33284765b66608010c324013 Padding = EMSA4(SHA-512) E = 0xaf8e8f N = 0x9d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7 Msg = e25750b83c69e4e14cd31a1f366d7f97134201535b3601fe9deca9e874e68051b6ee3be3eeb5d7800dbbe43e5c6e24b0b5965468f3f04ab9a71940c20dae70a73eb2e122a630803bb9217253e28fa967bcfbb59385fdddd5d02a6f14793a5461de6be77c4c20089ab8ce6b65b01836459139ccdef9a3e3da7fe5dde8a2d25504 InvalidSignature = 5c3ff26414d2af68f316f7646fe4740d571d7d08a4553c250b6abf0187c2ccf16ede3ba33acf57e28b20ecfcd0c77815d280c08ef4bc76aeba9012939bb53a5c932ccada6323d8de5b00439032b0fb57c77e64423a50d480d9364356e0b3b841cc8a61bbff8f235aa8247c4df7ac1a31faa85a855c76109cc0a8baff6b46feffa65ad576eb2ecf1713baef88cbf8a9d939558f95677e749045a06b8da3fddca07b8c6e25499c8d2dc6f2e152b75a9a85af85db7c84152291bb03a6ecd65a1a0209d8291cca9db5648acebeae1faeaf488c49183b0433d74833812ddd35ca6b483a9f24845f10c11a18152c9d3c8ce5209ec4d8c10c5960cc5889950428e557e3 Padding = EMSA4(SHA-512) E = 0xfd7a0b N = 0x9d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7 Msg = 2288961b2d0b66e75dfe4079804a7f99cd9735db1bb50721513a3f611e6d1ca8ea636c5f0c685dce3da191de4cef70231415c219ac1e7daeddf9db01d967b06a2917fbbae80ebbc42f4d041cd0ae511e47101c32edb3ac4f6fe52fbe7fdf0821c9ea6ab329c626d11b4bc1ba7351ca934ece6aae483e3d0bef48601f789eccd5 InvalidSignature = 394ecbdd1159193f00fcabfe13f1ebad7d74c0fa954dfe2fcea5203b54c93e02960490f51c155da452cb451aa012f15f27c9ed603014eb88b714cd3232b0b08caad1e18f80cfb81345a18c4419b88a429a4f69c72149e96acb7f4463deca7105938d51f2a9169297e2462dcf4eac45208bc509cc3e85feac0e51b3bb32974ee82fbd23b3e2dc06da6e7f64f917d00befb181b264101de55cd90a86e0fdb27b3e9e8ffb458b39b1718e20da779408de3abc05f98e196f5f92f4dc22b34a39c28aaed5d44ba5fc8a50fbcc355bbeada239bb664f2d8e32fd53a0f8a0ca081276c32cb61c74fa9523b1d3f6a795dacab8363680ef62a2a964f66e3f5c0ef5d663d0 Padding = EMSA4(SHA-1) E = 0x0a673f N = 0xfa15594057e21dfd0b41c921627809dd454b519cc1c4ea39883814f9cdeff4a184d10f641a5ced9a80de1623ee7f86567d953256f48dd68ccb2e8362173aeaab3f11182425924334f9b92092c0fdf1e3b4c17b5efbc0269a7d839683470112c425c4d77b8835e6a307d0189223894d74d809ddba7260fa22cf3eae11e58cb94bf61cff8faae7cf17643cacd709725814ec9c365366b3a721161d8c2092681520a23e888dc0fecdcbe61f0cf27f3ae99ebab6a459331cfb3626fcd34eb124adf5ad5cf6ab5af05e0956391cc6debbbd0d6270b8412f330d469c41b26bc0f261b9aaaf4178b55b21af6ba12dcec1b9c58e9eaf9747e37cf50878110aec5630fe3dd77217c35e55c48896207a8586354d058dd7028a386e474b7c736283c45662c4810f56c6d0ec8586397d499d59c0e0a8d640c25bb91f3fd2cc74801f2526f78ae49f42b279a1687b9a8e965b49fe10a2360852000f440117b84dd8cbb793c27f124ff88535a25ecf925d464efae566f81c8f43d23b646296c087fb56589ecebd Msg = 348d8253c3fd1e0175f263081c025ed1d2f48d7498d39f733d417ca7820e857a7b091d573816685fa581525eaf92d4fda8627339edec0913c667c7898dd47bc613d30f963fba521cf8e8fcc74557ec82b371b32bf8255647d53950f441e2d71ec39260f6201165a036cf662c28792ec8bbca573400a41076345f1ecee46121ec InvalidSignature = 7247182f6a34684402028eb1f0ff8ad0f16343265ee6c6f7cc8b18f2ef9d30e778c9ae49bdaaee7fa1d4dc17ea4a1a11a63d29ef17035fa41215fda41d36edc7a0a672649c3b05ca07d09644503abf99df6c7c31f516369044322029c7ba5d7220be8fe46a0a03068b7a8f1a145d0aa0aaccc4405fabadef36354ee749f59c26a0f7e0bcafeca1ecc272c2c83738b63f8ba2c6d1553b1b326de49dfeaab0f50c344ba311c5842f093ef8b906fd5e163180484e9517c363217e9057a933f5c21029c00bb1a93698e417d33b19583d3dc4774f381e434e4a2c35dbd3f3829f4da9c0d18a702f54d73f201dfae3c298007ee87bd2d017b8aa9411c2081ec04ba3bde24cde89cf743fa7f627c7420e4a212662bb160fa5cbc93b7b7585c53a4d93dd18124851b95bf00db240a0850a89bb1d291944947c0d8206d6c509b7b27d8f38a339eccd3641b291dd569bbd3bed6cc18f57890113ca5f3aea7af7b35880fdc0e157f941946e742ab61b5a9de3e18a5575680a869fdee02bec97a726d99d0703 Padding = EMSA4(SHA-1) E = 0x0a673f N = 0xfa15594057e21dfd0b41c921627809dd454b519cc1c4ea39883814f9cdeff4a184d10f641a5ced9a80de1623ee7f86567d953256f48dd68ccb2e8362173aeaab3f11182425924334f9b92092c0fdf1e3b4c17b5efbc0269a7d839683470112c425c4d77b8835e6a307d0189223894d74d809ddba7260fa22cf3eae11e58cb94bf61cff8faae7cf17643cacd709725814ec9c365366b3a721161d8c2092681520a23e888dc0fecdcbe61f0cf27f3ae99ebab6a459331cfb3626fcd34eb124adf5ad5cf6ab5af05e0956391cc6debbbd0d6270b8412f330d469c41b26bc0f261b9aaaf4178b55b21af6ba12dcec1b9c58e9eaf9747e37cf50878110aec5630fe3dd77217c35e55c48896207a8586354d058dd7028a386e474b7c736283c45662c4810f56c6d0ec8586397d499d59c0e0a8d640c25bb91f3fd2cc74801f2526f78ae49f42b279a1687b9a8e965b49fe10a2360852000f440117b84dd8cbb793c27f124ff88535a25ecf925d464efae566f81c8f43d23b646296c087fb56589ecebd Msg = 07dd79fa6d610e1c9f3c64a2b92d1254b066531136df0ac3ddf003927e1f7c58dc37e455859ae225f9d799ee0e7f2bde93357bd53405385e9df717e4e3e35f231f86abdc5cd6ebcdb393ade0b41f9ba3088f44f855021f0e6231cc8f7c489e1b18f557f6b9be32fd149727df72b46a89579c35e2617fc7b972c9adfb12f7402a InvalidSignature = bafbff970e29b56aded354a1403ca86d9dca586afe5f7e268dd12a1915803714b37b5b329fb262df320b7e4ff2a078947eb7e114408bc432b41c899f9f7aa45927763c969b819321cb6a048520a3ce64d66e63c81ef4a48ed269f4108d392a1429877252a589ca0fb22f70088a23d01ef81a65e0dad9e7ae9dfa09c42e2843e7551aaac914e1fd436b811a28b78803f1ba34c7ea254d1d37a33217413a0890856297f81a6172bd6f147f3c6ad818324e5d6e36370c2a52301180b8a3a8b7141119ca6e8b5bd71a77d11c513de82ae3e4186757cfed3ddf17b345e6af808e3b0a6338782c253185c51ed855fb9a03c1c1895ba444fcb691e6578a54fb927b20564e328f175bf593663e38ea5b92ec8f856dca9c42c3ed11e93fae960dc2b0384007292ac2385d12ea05dea3c2a60d5fe3e6de6e8886b1b1258c35be13ff1ddd7e3734923d05eb93bd9035c8b936df2b8c3688a045829d4203bcd178fe1cc9a5724368b9148841f173805b88e505cb5d516946bbb17385607e14347dc5fd98d172 Padding = EMSA4(SHA-1) E = 0x0a673f N = 0xfa15594057e21dfd0b41c921627809dd454b519cc1c4ea39883814f9cdeff4a184d10f641a5ced9a80de1623ee7f86567d953256f48dd68ccb2e8362173aeaab3f11182425924334f9b92092c0fdf1e3b4c17b5efbc0269a7d839683470112c425c4d77b8835e6a307d0189223894d74d809ddba7260fa22cf3eae11e58cb94bf61cff8faae7cf17643cacd709725814ec9c365366b3a721161d8c2092681520a23e888dc0fecdcbe61f0cf27f3ae99ebab6a459331cfb3626fcd34eb124adf5ad5cf6ab5af05e0956391cc6debbbd0d6270b8412f330d469c41b26bc0f261b9aaaf4178b55b21af6ba12dcec1b9c58e9eaf9747e37cf50878110aec5630fe3dd77217c35e55c48896207a8586354d058dd7028a386e474b7c736283c45662c4810f56c6d0ec8586397d499d59c0e0a8d640c25bb91f3fd2cc74801f2526f78ae49f42b279a1687b9a8e965b49fe10a2360852000f440117b84dd8cbb793c27f124ff88535a25ecf925d464efae566f81c8f43d23b646296c087fb56589ecebd Msg = b61eabe9eb62740c500b32e9b049a0652b4a87317e68289f85a1dab5fe47f4818ff8edab0bd1c251f1df980e35d6a35c4306461d428a7c7495c376d9a805866de98f3b8a14c1ce9fb489bc3be71fb56761f2b539b3e271a6cdaff498c2b18a40cccaddae909a5e9fa3f1e6964c8a9d2e8cf61cae5bd6cede354d9c19d5b5c9a4 InvalidSignature = 09b573ed2be213b3e1ad49ab1fcebc2be8cbd30556a3c9ac4eafdffacee20b7c5b19fe84c66cdf57c0ff081643484d5e5ec904de4ed87d7cbdd8e9897ffcade1b0a260f7cec47212e1dd29cbda97c195d0f47ad0e7f8e836c9f870f2e77d8648f517bfe15f1885084a28ae1bb2ac7377274d2be8748b28fff31140887a317ba4983e0b3c94d4c0360e658161c011f18751ca061be384bf09d3f6b8da459d432081fdb22db78483e69df8f37813faaf31a9c766e16fcb8f4a77d18f8a1ee8de88180b9f15d0894ff2a8b2a5f6f9438c605e181fb5807f9dc635dbb34aa5380feb004e16f49b3b9abf5e9e241d66c5e4dd2dcd4c67ff3340e4b1dcf20e070c18bc9f4972b7cc7f8543564fde3b3598ae177e7a97e3371aeff0df98b1852330befe8ef5473f8e5210360922a5431a2914448e2c7db973d6289515eb3c6053a77aa3276c71f8e2692bb2ff86f48fee9db1960203fbbd7259eec3230ba46d4e3caf2c1178fb4f62e516d86af4e92036f7d08a8e512d933221d0fbf520bb904c7c5b64 Padding = EMSA4(SHA-1) E = 0x0a673f N = 0xfa15594057e21dfd0b41c921627809dd454b519cc1c4ea39883814f9cdeff4a184d10f641a5ced9a80de1623ee7f86567d953256f48dd68ccb2e8362173aeaab3f11182425924334f9b92092c0fdf1e3b4c17b5efbc0269a7d839683470112c425c4d77b8835e6a307d0189223894d74d809ddba7260fa22cf3eae11e58cb94bf61cff8faae7cf17643cacd709725814ec9c365366b3a721161d8c2092681520a23e888dc0fecdcbe61f0cf27f3ae99ebab6a459331cfb3626fcd34eb124adf5ad5cf6ab5af05e0956391cc6debbbd0d6270b8412f330d469c41b26bc0f261b9aaaf4178b55b21af6ba12dcec1b9c58e9eaf9747e37cf50878110aec5630fe3dd77217c35e55c48896207a8586354d058dd7028a386e474b7c736283c45662c4810f56c6d0ec8586397d499d59c0e0a8d640c25bb91f3fd2cc74801f2526f78ae49f42b279a1687b9a8e965b49fe10a2360852000f440117b84dd8cbb793c27f124ff88535a25ecf925d464efae566f81c8f43d23b646296c087fb56589ecebd Msg = e594d640dc2fb4d4d9523ea171c95dfc7aa2348ccce403a1487e4bc7197e339c3a832ade3875cec83a730c9f3e0d8988a5b4419cf26e6f3ecfcfacac51245ad57cf1436b0a9e7e38686d93b502afded9c038392fd010d52ba76b69be42db8f28b2c56a0ed7128dcc6c26180c43162498d215626cef30fe10d83cca24760c983c InvalidSignature = 8565680f9957f0dcb540c1cb61bb07f58bcdef54265047d60e438e01f4bd2b589cc067a40515949808b31e9c22042bbfd369610a45850d15d52670666377dcac674a959f1ab50c5f980d8886c062f553450768041af741e3ff8a151dcc37ede167d69fbda25cd17ee649b72e5a0812dc696cb1ec996b0ea9d1cd59680fa9560c3e80851544d8b970e0f638e162e2385f7f4acd701d528e62842611c1ba68d0b5c4ff273976d36787c837d65f355c186417b6c15934ab6e8f9e7d030add664c191ef81852d85bdf1552c267e40cdc2dd6136851024babdb701428a8ce79aeab9d4332a1e1699731f9d43799b5365536bad860eb5b756f2aed6fe6aad16cf4270f76eb631e1b1dd6bc100111a909da6700ce7f917385bba5d9974987728d6bdede768876e241d2bf23de0f3028d52848f15abe06a93dd616ba95724347043a300c09902bca9fdede9a7d29f25afbc9b0e9077b508164792713278eee448000629b1158d2cc65c6ff06ea9a2e95c2874e2c7e2bf872f319c2627e538f9f7434f6ce Padding = EMSA4(SHA-1) E = 0x0c9c31 N = 0xfa15594057e21dfd0b41c921627809dd454b519cc1c4ea39883814f9cdeff4a184d10f641a5ced9a80de1623ee7f86567d953256f48dd68ccb2e8362173aeaab3f11182425924334f9b92092c0fdf1e3b4c17b5efbc0269a7d839683470112c425c4d77b8835e6a307d0189223894d74d809ddba7260fa22cf3eae11e58cb94bf61cff8faae7cf17643cacd709725814ec9c365366b3a721161d8c2092681520a23e888dc0fecdcbe61f0cf27f3ae99ebab6a459331cfb3626fcd34eb124adf5ad5cf6ab5af05e0956391cc6debbbd0d6270b8412f330d469c41b26bc0f261b9aaaf4178b55b21af6ba12dcec1b9c58e9eaf9747e37cf50878110aec5630fe3dd77217c35e55c48896207a8586354d058dd7028a386e474b7c736283c45662c4810f56c6d0ec8586397d499d59c0e0a8d640c25bb91f3fd2cc74801f2526f78ae49f42b279a1687b9a8e965b49fe10a2360852000f440117b84dd8cbb793c27f124ff88535a25ecf925d464efae566f81c8f43d23b646296c087fb56589ecebd Msg = eaf989927d18e789a4c2c889fcf5c21df332e46e2182a365dcb7171006f468472a6f838fc776113eecb0a9e005a644daf581f24d6515cc3d5b1f2af30ecb169ff97a00422ec1b3cbedb587807566d8a01aa9b847981be191a762ed02cfb6ca267ea168745802b478ce58ca32f23d66b989319c236299caa9e707ca07f2bc6c22 InvalidSignature = a5db83aa5318aaa5ed79b8e2f70652e8a7f03edb1280efd24abcdbda7f794f592ba71db3494c2013463a235358c468d0b722b797b51b05ef6d1463203c882be3f2f25bf4918a04049e2a52d6930208839cf3de4b2072671da8ce0d288c9b19ac91b436da8c7d4ce87ca560f16cb759fadfafcf4bface1fcf2d0930ec120b3fef647b1772d3af810a67e3c359f977d9b16ebdd2786d411910c8eb72458eb94017904cc8da37d0dc56b8c7468e7dc88721e66c3a5cbfd729c4506dfcf2bff3206907562b9f8e7536b3ce6d9d607062fdcb06dae044691d40f51758fc0db46fcc07f1a4ced544396698256da55d6aece5b64b72a77d41fa0ee34f998ea3bfc5f79348f46b1b3ced4d35daa3a4ef656d3f039da9d312f36ec8976e5ec1ea2945938232fcf6c47ce1d8683cd49f2b736f6976158c65061326f868fdf87afde1ec7e0fbdaa7c2788acefcbc85d3644e2f9636e470f00afbd86054807d956df0890ca3ac1897cff7f68decc11b975ec4fbf470d30d14f0a88bd1b4f1638596fc54ec9ef Padding = EMSA4(SHA-224) E = 0x16b265 N = 0x9881b3fb6c99a115da60ade6d178008b7e6db8f79fe34fb7e6f7d2fb96a24350dbe35fc9a9742c6d3deede1ee6c04cfcca1f1ce9f1d7c53dda87b149dbc7ac4644e2eb57f211bf883ca006098e0f871155c6c1f9c88df9768c61581e0b5016aa57177438396be35edbc31002cb2bb766c9b9786a81358e5dff52b9073fb7f9714600c0b1dd060ffa1455fc926d30329925bde76cd68a58896de4719eba84529f76de312e9681cc252ebd4c42b51614b172cdc67a5144e7bee75050f7efb904d52b8c084242c3545269cc1193691981670e0816cb82e39c4541bcc7f5fcd27e46df00e7e73946da7a6f8a7026d89d951a8bc8010132862aa0ab872534372a2f3d10d3edbbf852a43ec06a93b3495289619bf899c10027dc2b06daac43342e3200a1f002ad53acc537772f1485d3b517f4686bf27ba47183df94a8cbd9a5bb0659bbbe43beb2eb05d29a23813b0e6ca8e7228b9ce3fe0de7bda5a0c56e9a5ad4e5e4622896c6f3e0269d69bbf0cc1ffc82278ff55168f485dca669868b97f4a003 Msg = c94473f37b3e8fbb10fb2cb105ced77e753b9c4eea71797673151359f641a88cc8cd45387bcd39c0f75ac9a4cc9625a6c7ea9b2bc4920be3c25c9bac3dacabb4b8c40cde99426c6839ea15ca3ca6d8e11ecb434c0f9e1b1701170696ffe58794c0b12fae7ca712f9fe3379ebfb08d678a267fd7b749e905856cfbbdfe4f22274 InvalidSignature = 7b2ba5d847b87118e2c09ad023e2cc5e6f4e0170ba9e02d3c068adf1fd00976b6288f316171d776349dc3570ec1a6950e47094331449a79e74d8699a5397941261d98d6bd5e1f4ee631361b0aaa5e01d25ef71e47d740865592eee53f290a6c419a2153fb7cb373cdaf22cbe638d49492c2cb267be0762995b9756e32dd43675a8029f19f237960334fed8de1bcab36cd091c202bd391c753b7fbd8062b31ba8ddf360f3420d0c99a746fb1bee1ae0ce033794c22c32d8ea8136022647cc90f99a895baa362cbebf294866f3d942a53c789919ff4b846fa1c1d48202c7689f1efaa52036921df7ec58e0b6cb9a5225d89eda78545d6b117fdbc1c726850f73e735d57b8a7355ba6d6ff3c8efeb49a29b85c92d95edddb04914b1c1550e38614804105313660e94c5decc0a5627e0071e13843b7d63a4544a1330a377effc531fdb12d3e9951c4d2c229a1240628d17fb3a7cb410d1b01c827e6672f4fc34b650c3a0f42a1c0d743a1797623c2778a49482d52f37a70d81de36eb6dd9e23b2576 Padding = EMSA4(SHA-224) E = 0xa4bd05 N = 0x9881b3fb6c99a115da60ade6d178008b7e6db8f79fe34fb7e6f7d2fb96a24350dbe35fc9a9742c6d3deede1ee6c04cfcca1f1ce9f1d7c53dda87b149dbc7ac4644e2eb57f211bf883ca006098e0f871155c6c1f9c88df9768c61581e0b5016aa57177438396be35edbc31002cb2bb766c9b9786a81358e5dff52b9073fb7f9714600c0b1dd060ffa1455fc926d30329925bde76cd68a58896de4719eba84529f76de312e9681cc252ebd4c42b51614b172cdc67a5144e7bee75050f7efb904d52b8c084242c3545269cc1193691981670e0816cb82e39c4541bcc7f5fcd27e46df00e7e73946da7a6f8a7026d89d951a8bc8010132862aa0ab872534372a2f3d10d3edbbf852a43ec06a93b3495289619bf899c10027dc2b06daac43342e3200a1f002ad53acc537772f1485d3b517f4686bf27ba47183df94a8cbd9a5bb0659bbbe43beb2eb05d29a23813b0e6ca8e7228b9ce3fe0de7bda5a0c56e9a5ad4e5e4622896c6f3e0269d69bbf0cc1ffc82278ff55168f485dca669868b97f4a003 Msg = bd1449b44548889ecd191d0a43cdffa7e4bbfd95a51946d5d20f2efef50f2f31f9692e4e8f1a0068d1e52d7725a6f44d65e28fcc3da2b855d4826b83ae05ee1ad12b0f3a2646add923097970a7e2fef3258adf0705da607047e028c86a3246778c8271dfd27394d70aab8a5b8f2925816dd976afc666480c7550ee34f03e3f30 InvalidSignature = 22c2fb8742e325e8e59f449ad6fb8b531e05efa5d87cae928a030924bf34029cd25d2794c42c987520d521a2def57c62d5a00b9540b792fd04088b82053fd5fc7d76d3b912086ac718cc9b19b03e27c3311aaadbc19602a5b4c1321b4f7217c5717bb48de800872ad322c9948682794f25a89b3a7600c36f9d460f0bb2186b5a9a049b04c38e9259a9bf8566ccfe462211607a81cad72f3aa2468909b723c67bd5af913fcea3717c33ee8ab529154dc549ba12506227c957b80788a0d7b630e7d735deaa847ab5dc9de4dd90ce57645d1dfc147d5c2c051597fec2697508bac577aff5dc1a43eec3c7b014f027a1640047d42b4ab59709722bf5bc703566abe2e2aad6e9cf9e850247ed40563ad54296ffe84cb2f8ba31386e8b821a2ac29347ce710ac31939bf01ebd3b7b12b107caec9ee01d78cc80721fa75143cae00b7854e64953580213c46900d9837b523fb204cde1048d02e08dd00ba0e505151840f02cccca387440d007a5452ab6bb741bebafc0bf3c78eb1b895e25da60533bbc2 Padding = EMSA4(SHA-224) E = 0x16b265 N = 0x9881b3fb6c99a115da60ade6d178008b7e6db8f79fe34fb7e6f7d2fb96a24350dbe35fc9a9742c6d3deede1ee6c04cfcca1f1ce9f1d7c53dda87b149dbc7ac4644e2eb57f211bf883ca006098e0f871155c6c1f9c88df9768c61581e0b5016aa57177438396be35edbc31002cb2bb766c9b9786a81358e5dff52b9073fb7f9714600c0b1dd060ffa1455fc926d30329925bde76cd68a58896de4719eba84529f76de312e9681cc252ebd4c42b51614b172cdc67a5144e7bee75050f7efb904d52b8c084242c3545269cc1193691981670e0816cb82e39c4541bcc7f5fcd27e46df00e7e73946da7a6f8a7026d89d951a8bc8010132862aa0ab872534372a2f3d10d3edbbf852a43ec06a93b3495289619bf899c10027dc2b06daac43342e3200a1f002ad53acc537772f1485d3b517f4686bf27ba47183df94a8cbd9a5bb0659bbbe43beb2eb05d29a23813b0e6ca8e7228b9ce3fe0de7bda5a0c56e9a5ad4e5e4622896c6f3e0269d69bbf0cc1ffc82278ff55168f485dca669868b97f4a003 Msg = 105741337cb19262c78a1bcbc04349775ec4f32f55c18fe1eb3ca645084c85bf8d1c3688e736ae09e4024887c5897205947fa666b8819dd3c69bbf5c9a0ddde2a74f22348b524778e60907cd6d28d32e3a2cc699669bdb71da8d5e22626ba00304f7ef808f8cc57876a740e4dfa7d2baf8d13a118a97b385d01a6bdd89ed36eb InvalidSignature = 96ed1422c5acf21998993a4d30cee4897d490c8de002f6fbbc3bad70e6c44cfd2232841becbf2cfae42df1f1d91fcfba8b81f19d3fa3364b569e444f6f18dd860beb641920b7c565217ce181b637709bf9a6121feccd49f59675cad5d7b27956f142aed71c962cd23865281622d22429f288338b095524b397030353f590dc11a4cb9810cc247a0c8a816b41683a64651b1c60be462d80e5cbcf025fd0181cf61c2d9a63eacc2de0dd5637193598120b8c6d60b6c6f1228735fd18a4fe3f8f63ecdb33924eb7b809bb66c458d4b73106b6a23a7fc685df3978ba9cc1e2371288f0195b6d73239fbde260bd92ab838f0bb80735665a68ca5e426678fa6ba2f29a9374dd7bed51f3413fa074965e56f3687db310c0b3c69e3f37386ad5e6de25f3faae6212b3549d87e39a6cc9dccee9ea1c8469704f79e88089b3c1d3232adeb99bc0c0a2b34094ddb3006cfadf826e1e2a6aa2a3cbee334bc4f5fd019fcf8eb61b0db6e38e611744515c58619d46a39afde9677189066f55e4f78c39debf7e59 Padding = EMSA4(SHA-224) E = 0x16b265 N = 0x9881b3fb6c99a115da60ade6d178008b7e6db8f79fe34fb7e6f7d2fb96a24350dbe35fc9a9742c6d3deede1ee6c04cfcca1f1ce9f1d7c53dda87b149dbc7ac4644e2eb57f211bf883ca006098e0f871155c6c1f9c88df9768c61581e0b5016aa57177438396be35edbc31002cb2bb766c9b9786a81358e5dff52b9073fb7f9714600c0b1dd060ffa1455fc926d30329925bde76cd68a58896de4719eba84529f76de312e9681cc252ebd4c42b51614b172cdc67a5144e7bee75050f7efb904d52b8c084242c3545269cc1193691981670e0816cb82e39c4541bcc7f5fcd27e46df00e7e73946da7a6f8a7026d89d951a8bc8010132862aa0ab872534372a2f3d10d3edbbf852a43ec06a93b3495289619bf899c10027dc2b06daac43342e3200a1f002ad53acc537772f1485d3b517f4686bf27ba47183df94a8cbd9a5bb0659bbbe43beb2eb05d29a23813b0e6ca8e7228b9ce3fe0de7bda5a0c56e9a5ad4e5e4622896c6f3e0269d69bbf0cc1ffc82278ff55168f485dca669868b97f4a003 Msg = 6ac31acfb46bc42fbd13c38fc2cf6751b2a6333d3e4f8f6a3338bd6207cd0e81b1f6569ebee19deea20317244c5957ddfdf4bf3c59b43bd1bf542fc0d6a6ad1f6820ec9f7498f56f7e4ca05d2a25bf3f093d9991b39e9a5f164d48660d877976354ac31afc17357bfaf7448285bc083d7f89a984739414dce02bf29bd5f5da4d InvalidSignature = 122cadf51e1f0984907c382090aaa972b6dfcee9559e01d96a212a716f23a10163903441d4ba5004b42e26fb31ca4814212c0936cd3c1100f2e5fdff1fbe177ce0ef0f8cc522b85d5871415fe255917944d20618c4bcbe2cd53b9c46f84e3f18b50aa697bbd8b7282107516af44b9661a86efbae960749514fb39ad06329011ffb94c8e2a1e63a4b49280f3b92cf3add5f1ded63e1b436cb2dfda4bb6b3831c9f352544bd7988495362ba5cc7a9c6059f11d0f7ba99b537974a0d24b8bb6014a98a6122d8f2b6979f91d3f0bec9bfd7c0d10f8b25e432557feb9f955cbb5fca7f63b8157e0f1be7604a0efdde294289fb46a732f636b2b0b33f5be9bce3f2f76b186c5a177458ebbb8a46314e37e2841eb53759d3b4636d91e9d1c814b06d761d4e483a55e5c54507d3f03063c53ccaf57c73f1ef98bc60b7c25b015f6a3bfe81a36b32bcc2ae828da985dd869af8cba37444cc79eb3c80f6e81bcf793c2d08bcdd3e8191002278d23153a8ce90c10e825d545a249dbae6013fa3470eca9b13f Padding = EMSA4(SHA-224) E = 0x16b265 N = 0x9881b3fb6c99a115da60ade6d178008b7e6db8f79fe34fb7e6f7d2fb96a24350dbe35fc9a9742c6d3deede1ee6c04cfcca1f1ce9f1d7c53dda87b149dbc7ac4644e2eb57f211bf883ca006098e0f871155c6c1f9c88df9768c61581e0b5016aa57177438396be35edbc31002cb2bb766c9b9786a81358e5dff52b9073fb7f9714600c0b1dd060ffa1455fc926d30329925bde76cd68a58896de4719eba84529f76de312e9681cc252ebd4c42b51614b172cdc67a5144e7bee75050f7efb904d52b8c084242c3545269cc1193691981670e0816cb82e39c4541bcc7f5fcd27e46df00e7e73946da7a6f8a7026d89d951a8bc8010132862aa0ab872534372a2f3d10d3edbbf852a43ec06a93b3495289619bf899c10027dc2b06daac43342e3200a1f002ad53acc537772f1485d3b517f4686bf27ba47183df94a8cbd9a5bb0659bbbe43beb2eb05d29a23813b0e6ca8e7228b9ce3fe0de7bda5a0c56e9a5ad4e5e4622896c6f3e0269d69bbf0cc1ffc82278ff55168f485dca669868b97f4a003 Msg = 979e87fd762d8f044553a56d47d7c262d04789024fed71fb8bff265b2d162da37fe1c71d731b1970e7ba8972276a6b3db439dd854494ef290972080736cf8515c05ca2ae61759e29e3531ab09b83c34f3496304cae1b0db7a5ca7a41d702ae52e176e05549236757c18520d0aa0a10c0d8c74afe956913cde86f45b11797f181 InvalidSignature = 5a48fe3dbcfdf6b995f849d775ac51e56cde0f0b41c9aca3b035350f3aec027021b3337e4e21653448027ccbd6c83f6036dbfb028212afed26ca99c729081ce742005aee6cc22046f75a6674a4f1f3c1403553c4027137fb27b3804c0c72320d3ef0ef3afe783582947eec01f57a0131cef6781529758e332b162226ff6e347771a4d0a6f8a7244955deb552b976408730153d9008468c13d824111a1f162450c25c365e923ed055b30f747997e49bb5b8af283448b05e1e265366b94de3f55d135c063d45b4a9261fd1b77e295791b8c77ff5feaa146d7c474ef25257b7ce2413a4c0fc422d7f9395f6af256a3c6f5dfbe902ef5f4411034c1e5482d399bb6d462d8e42668715067ead9ad9b6609517ba64c70b3362e2a82abc61710b01132adf39c1a76726d667ac5553baeae28fd36026da0c04fdcd19104b968cf56492229a760509eb615b36a5d0bebddce3071b8dec3a0cc30d887202eedcd12327c798bfa92a0366664e01580840e58a63664c3878afc8fd101f010d8333c725a91cc0 Padding = EMSA4(SHA-256) E = 0xfe3079 N = 0xce4924ff470fb99d17f66595561a74ded22092d1dc27122ae15ca8cac4bfae11daa9e37a941430dd1b81aaf472f320835ee2fe744c83f1320882a8a02316ceb375f5c4909232bb2c6520b249c88be4f47b8b86fdd93678c69e64f50089e907a5504fdd43f0cad24aaa9e317ef2ecade3b5c1fd31f3c327d70a0e2d4867e6fe3f26272e8b6a3cce17843e359b82eb7a4cad8c42460179cb6c07fa252efaec428fd5cae5208b298b255109026e21272424ec0c52e1e5f72c5ab06f5d2a05e77c193b647ec948bb844e0c2ef1307f53cb800d4f55523d86038bb9e21099a861b6b9bcc969e5dddbdf7171b37d616381b78c3b22ef66510b2765d9617556b175599879d8558100ad90b830e87ad460a22108baa5ed0f2ba9dfc05167f8ab61fc9f8ae01603f9dd5e66ce1e642b604bca9294b57fb7c0d83f054bacf4454c298a272c44bc718f54605b91e0bfafd772aebaf3828846c93018f98e315708d50be8401eb9a8778dcbd0d6db9370860411b004cd37fbb8b5df87edee7aae949fff34607b Msg = e49f585eeccf2bf7265641fb8c0f94c717e2ff1d9045aecaa302d285353b991bf7ac5dc93b311ce9078828d268571ff909711e5c04553220f8f80f785cc405ca13e02f0d40b2ee765ba295538521663718eabe5783888c345519077a9751a1285fc236f2a25a8ae44a2df247887451c86cd646d7b3e7a44ee0ef23538eec557f InvalidSignature = 4e85f68a5b06b06a17d0f3f27b3a5a119e7db02abc2d9b4afc698220da11524a885f33cd7a10ae89c98b027b69224acef4713a1463f168c8bef551ef8fedb219b6ad0b3e99d6216643e58a51bb2ae93bbef769614914eab137c1993b149171b8633f4a318f69772996ef7dc3f7748f3756d58ecdc3937632717fb40cb7ed6e5c72e172ac58ec01f4e32fffc445b60f98a628fc1b0fa4cfb6686deb125950b862f347e9eb8120fb2b5aa23d6d86eaf1edebeb133793541c4dbea0f14a9f74733da4ed11d1274d464e09a5780843d6750bace0e97029308287dd396efa0f32628171fc5ec20d3c82619b784e4cdb66cbdb28cdd263a46a3ec63e1cad7659dc3b33801432d2b5b5e10a770083b933a805a9c76cc26c912f952cec5fd8413a8c1adaee80149fa19855315075825292db24de325fa6bf3b4c06652fc8320def4236c088dd5ae43315e03672fb999c354ef61ac380b1b1c96d711fc777e345ccb94536355a321466eedcf2355dd51f688023d6b599390f3aff6201369d8103af926c83 Padding = EMSA4(SHA-256) E = 0x73b193 N = 0xce4924ff470fb99d17f66595561a74ded22092d1dc27122ae15ca8cac4bfae11daa9e37a941430dd1b81aaf472f320835ee2fe744c83f1320882a8a02316ceb375f5c4909232bb2c6520b249c88be4f47b8b86fdd93678c69e64f50089e907a5504fdd43f0cad24aaa9e317ef2ecade3b5c1fd31f3c327d70a0e2d4867e6fe3f26272e8b6a3cce17843e359b82eb7a4cad8c42460179cb6c07fa252efaec428fd5cae5208b298b255109026e21272424ec0c52e1e5f72c5ab06f5d2a05e77c193b647ec948bb844e0c2ef1307f53cb800d4f55523d86038bb9e21099a861b6b9bcc969e5dddbdf7171b37d616381b78c3b22ef66510b2765d9617556b175599879d8558100ad90b830e87ad460a22108baa5ed0f2ba9dfc05167f8ab61fc9f8ae01603f9dd5e66ce1e642b604bca9294b57fb7c0d83f054bacf4454c298a272c44bc718f54605b91e0bfafd772aebaf3828846c93018f98e315708d50be8401eb9a8778dcbd0d6db9370860411b004cd37fbb8b5df87edee7aae949fff34607b Msg = 4621b17cd9f5b623fe73b5fe280ce9ac840805608acd6e41d55ea71132220c0df7e7c4159626f10d71882983f0aa2a92d11dc906c0b22cc028f4395d48f54e12894e33da0f614dd48ee114e65f95c7a7d3585e7cc765c00178d136aa99591faaa35ee6136d2e323ffc855c709c5426b32fc0aa0ac66e90c96efe84414dd5e79c InvalidSignature = b60a4dd629d6030fe6522f6b754f0e751de4b2552c607efccb2f90da91787583b6fc51bcb60ab21938a48ca6ab3ef8ab75b56abb9df1faa4dbd84b412066f3f92bff778a89f7df4f55317cbc40a780fb87f0c844c2d64e232474a3e931c168b330866579685c51a5937a2e80ea2c6ed00fe123f14bbef55c9774bd620e1e821e0128cf49dab6f8853c08801c8a00919a6c013c3a83f999c66a5cb49c91865df60db8be813bc3d8b35d85d79cf01abed2f60f60edc97153780c0c12fe45e5e487fd959393079dbee5af46c0a7c4214fab75c5b5ddd6f0288669e0a9be33f4b5782524e838315cc031d97beb1596026f129a21e961dde6bc34c492f3026af7f503b8ff87b7775619f8d1e17f972c85940affbb64d3310fb9f74d9d16aeb077b8b997b18020eb992ab61322847fe6cb62f73d0abd81633ac5c5be6519ddbc9334bb56449bdf96930d65d8061db8911d4ed6a59ae8d2276d04596a388e752cf99cbd395b837e7c5aee278a7c4b43c78d3d74c88f49cbc8d816f53cca156927fb92d4 Padding = EMSA4(SHA-256) E = 0x73b193 N = 0xce4924ff470fb99d17f66595561a74ded22092d1dc27122ae15ca8cac4bfae11daa9e37a941430dd1b81aaf472f320835ee2fe744c83f1320882a8a02316ceb375f5c4909232bb2c6520b249c88be4f47b8b86fdd93678c69e64f50089e907a5504fdd43f0cad24aaa9e317ef2ecade3b5c1fd31f3c327d70a0e2d4867e6fe3f26272e8b6a3cce17843e359b82eb7a4cad8c42460179cb6c07fa252efaec428fd5cae5208b298b255109026e21272424ec0c52e1e5f72c5ab06f5d2a05e77c193b647ec948bb844e0c2ef1307f53cb800d4f55523d86038bb9e21099a861b6b9bcc969e5dddbdf7171b37d616381b78c3b22ef66510b2765d9617556b175599879d8558100ad90b830e87ad460a22108baa5ed0f2ba9dfc05167f8ab61fc9f8ae01603f9dd5e66ce1e642b604bca9294b57fb7c0d83f054bacf4454c298a272c44bc718f54605b91e0bfafd772aebaf3828846c93018f98e315708d50be8401eb9a8778dcbd0d6db9370860411b004cd37fbb8b5df87edee7aae949fff34607b Msg = 7867b65ed982ed6cdd2d061157be90f85bcd580350f1253145cba5c58946a8a5751c8c008d9df833c8acceee2b0a5a929cd7d0def655f5cb59f01cb4c47b54bae5bde0672f2ce7922ef86d82174b8256a4d0b9a31e72dc60bb66deff2b6b11dd6e5099dce8b7214eb71acd16440b6f0918c0fd9bf2ce43b71635d5eee79d48d4 InvalidSignature = 0a617081dd9794c937e4c7163e2865439558d41e688b230c20a1ea71846643b8321d77cad582ec9a70f40d7a8ed9f722c5b9012f436c7a617ded2ad18643457b6fd33035fc2a2cbd52f3da4158015e01fab55b4e26e2de9602101ddb86e8d2aeb89bf4006933a11b5fbce2bd09e31fda18a82ec405910dd3d1cf1e465c176872da3db1c2b3089b48e768ef155ad5f56417497a648ed0427d45ecdd038d3cc8c87ce99a92f08c7641f7fa39ceb4ec83ece0994ac6848bb6efb4e79327145e5396b10faa1ac3a63ecd4a4a2c9cba946b0e5f185b2cd1a04293ee46393d374db8be0a849377eb11067ead3b76e514551d484d5c51544a1d0da96c17b5b2ef953dcdc1c6d592030e468eb8186a5bf660b71da5d982bc5424cf1a4f8ce952bc763b4eaadb2a3f787c8af01df2f43db5e0ad711824acece2d99d5bf9fdee0fdf1fdd370ec791a946a4b6af20b277479a838776e9c09230c36325b8c8ef84db282fe89ced24b0d7869b5d246fb3c60fcb261309897714e870195b9beed0b265800fc6e6 Padding = EMSA4(SHA-256) E = 0x73b193 N = 0xce4924ff470fb99d17f66595561a74ded22092d1dc27122ae15ca8cac4bfae11daa9e37a941430dd1b81aaf472f320835ee2fe744c83f1320882a8a02316ceb375f5c4909232bb2c6520b249c88be4f47b8b86fdd93678c69e64f50089e907a5504fdd43f0cad24aaa9e317ef2ecade3b5c1fd31f3c327d70a0e2d4867e6fe3f26272e8b6a3cce17843e359b82eb7a4cad8c42460179cb6c07fa252efaec428fd5cae5208b298b255109026e21272424ec0c52e1e5f72c5ab06f5d2a05e77c193b647ec948bb844e0c2ef1307f53cb800d4f55523d86038bb9e21099a861b6b9bcc969e5dddbdf7171b37d616381b78c3b22ef66510b2765d9617556b175599879d8558100ad90b830e87ad460a22108baa5ed0f2ba9dfc05167f8ab61fc9f8ae01603f9dd5e66ce1e642b604bca9294b57fb7c0d83f054bacf4454c298a272c44bc718f54605b91e0bfafd772aebaf3828846c93018f98e315708d50be8401eb9a8778dcbd0d6db9370860411b004cd37fbb8b5df87edee7aae949fff34607b Msg = 4d36eb2c3ad233436923e580faddb45ad35967108be8d99a876745df6213c028929f07d549847b4f9a996a3ddde390fb54aede470fdc7a3e0c7e0688a3a125cf216a3b75b4667586871b0aeb2de3c0e143fab1aa51d54f82f2b5a6d5357de1af42c01074411f28d177d24bf2b2844af6e86469a01b79624f7f35ac30df4efcb2 InvalidSignature = 8138922fd1a87333f1316e207e5851af65f27d9f5cda0f7b7cab0054a2deab0a5c246f1834b8fa0a9ae755b6add3b6dd93c694fa49bea28a5635e56d9841d283320e7a6f9812c102a60fc2505a081ee3849f815191b9d7a6c41db67aa1a053f22d1514226aad3922cb0b5be7dc86d6cd5daf28bada179fbeda50372bcee5fd8b567ca1826b081cc0e6cf58cd7ed935c6922b924bedd7e4f3d48f1995a56bb1d8aff5505ea97c56cdcbaa8e93254e8c6a39db1276c6f53a6551f162f403182b4bca892a6cf527c4f96296b2ce17ffdfa0347d5290940d81ed99a3e8b00e859dc0bcb83e90e9cd9a5b64cb9db1f3f01d26d08835ffdfe4053d9c7920963b07fb199e5c01d44d4182586104850213f8ca60c0081e62b5fecbad7eced93c35a1374d27b67150ddfb44ac68f6aa00b55e38e681b456e60655261d8dae047d67a4ee2c55ecf213571da1df549a4889ea3a285b5b2fe0707d74d470c7ece3a21526f5d4af7085dd11e6af405152a05110fcd6aa06ce93f1d2baba3ed5db73293f977ef1 Padding = EMSA4(SHA-256) E = 0x73b193 N = 0xce4924ff470fb99d17f66595561a74ded22092d1dc27122ae15ca8cac4bfae11daa9e37a941430dd1b81aaf472f320835ee2fe744c83f1320882a8a02316ceb375f5c4909232bb2c6520b249c88be4f47b8b86fdd93678c69e64f50089e907a5504fdd43f0cad24aaa9e317ef2ecade3b5c1fd31f3c327d70a0e2d4867e6fe3f26272e8b6a3cce17843e359b82eb7a4cad8c42460179cb6c07fa252efaec428fd5cae5208b298b255109026e21272424ec0c52e1e5f72c5ab06f5d2a05e77c193b647ec948bb844e0c2ef1307f53cb800d4f55523d86038bb9e21099a861b6b9bcc969e5dddbdf7171b37d616381b78c3b22ef66510b2765d9617556b175599879d8558100ad90b830e87ad460a22108baa5ed0f2ba9dfc05167f8ab61fc9f8ae01603f9dd5e66ce1e642b604bca9294b57fb7c0d83f054bacf4454c298a272c44bc718f54605b91e0bfafd772aebaf3828846c93018f98e315708d50be8401eb9a8778dcbd0d6db9370860411b004cd37fbb8b5df87edee7aae949fff34607b Msg = e2a92b143c8a006cee8afebb663119745d26f4ffacaa535c6165d30a1265d9277164c8d8214977ebc8f2e2bb66311f54e51494d8f16a6822098237a8d6360aa6bc288679b04c634849a720ea1956f5043dd10a723371e6e9ec302ada22b17f99ec80cdbe909aaecc9830221028a884cc8ee5bc951bc8b7fa31f614669edc2048 InvalidSignature = c81ac394f82cb27d75950759224b1787f87225ae5549be13dc1f74326eb668e5e09d03e03ecf039fd08dc301e70bd07992b20a2757b5766bf622052d69fbfbfaca964da33af71c8787eba9ed5caf1bf86e48587d26b21f9f1be601246e1d9cdcea9af7796ae30dd6bcbf1b25734f89e86ae9051c7a2cf3730914406f1541beed812ac6c9e18cfd5bf265523360018860141bcfc51c89ef879636ae2d7f7e41e31337f7afc3e201c6805a76af89dc9ea77413be1f1338e845e9d16cf86e5e04a52d8b579421296fa702ad07ecbfa0237ac996ee2e91eeac8ef48902a76c947b501e265c4b3fbd0c516a0416ea13c79b7e5d5b9435aef3f371d38ff9df8fdded2f265b27da5a84fe5443635e260807db9a1551387e6c9c596498d280d9170daa62954ed32b14d044980eca76a8db63483d8c4cbfa669ec140e7c4a304cc15e468d96fff34d77692581b10e7d25ef075d652758f50e9ac4cf9848466388051518cf93e183f910a4f503fbeb654f4b9424dbadf61d2d50f60f8f02b4ea0e7bc3b398 Padding = EMSA4(SHA-384) E = 0x147e73 N = 0xb125fc054e1b9db3b98212f53840690607c110bf31e18871fdfa13046496a2e73b3204f33bf8350f841ba94f511cbb2f40587b147a820fd166213968e8fff9fa4be4718a672f4e9321455c56d5e4e09d4f8b2c690718bc46108de269857bb4145c86cc75a4bd55f972285e4054b9fd13927574e63690958177784b39b17083bdafdd3ab8d327dbb9da93fc5cf9375205566242bb30246254ddf04c526f9141006fbaffc268bd2fe9aaa19581bb1c19e77264b08670ff3fe2b543f47a7af95bbe94b99300889b8ff07b2a44d5e9e229e33133b58bc7d2b8eb92a3bb6c035f8891d3165284e9ced25d6ef19a8135d06ab889f7627318cb043c89d90667cb92d1318880107ed9b866b10fa9af2225a987827e866c981f0c4424740fa71697ba9933a91c0d1fe83efd8e7d6c8287de72811da7fb4fcbad42637f0df47482119a07af9cccc993537cefe7892054bc2ce20021e9e37f391ee57b66c40dac49a346a54e6416f4e40af67b7190d65f497febd7d54f148fbc4850cd7de200cbfab53d05fb Msg = 643e40f3636d706e1337bcce6818c10a104fcf06ed87f859c8b667534446f43f1073f5e561f45653a0ddecdd5fc40663922245d2fcfdaeede7c4fe4e187b3da70217964e3a2c66f92bc593c60b931f7e0e4bfd1ad94923863979e0a615777097a1f5ce37d55ec9e71eb85a8f53cf35e3ea909ee56cb37eab269db6632284b394 InvalidSignature = 4b1264459b5d4066370a09c8e2047911d542e800c0ffc3276bb2d88c74cd16591c0c1c85ac44e08c74849c2d8fc287f5e4c33ebc7bf781fa0e89b4d7ad8e0a0e4e450c02e48cea826f19a96a9873407d131375e99fa2ad744ddb3972f3ef5e3a5bc7a6dc8701c93821bfb31adca2e6cc8f9fd375290b991e5519efba5fcaeec5eea24b671a6c23b6ae4e203c0d0d27553946d1b2fe55b43fba5d321f0ddc07ec9cf72aa8633f8f666428a637fb2b10e7fe9bb81f24c5b5750036d6898d18ebc358a63803ec2b67f516b36321b343f960a1b8db943ac0440c006391dd64e09f6bc3c1d2e2e2cba781a161f0aad3415a5b03addf637060cf0211a02094a1f7b07d443a7ec958abfe74436330a2a8c7c7ec86f91bffa9c35e1e8d3683307e33f226f9645ea66ab59ece99a0496698ecb8926e4772b307110f64f8fc02ba7076d288d4fc1481259ccbb7eb35afce0269f279f68433017622130f62e91851d14bb7e6bb648c00be485fea37bce55ed78575fe12ac3137df34722c0f2e992628c525a1 Padding = EMSA4(SHA-384) E = 0x147e73 N = 0xb125fc054e1b9db3b98212f53840690607c110bf31e18871fdfa13046496a2e73b3204f33bf8350f841ba94f511cbb2f40587b147a820fd166213968e8fff9fa4be4718a672f4e9321455c56d5e4e09d4f8b2c690718bc46108de269857bb4145c86cc75a4bd55f972285e4054b9fd13927574e63690958177784b39b17083bdafdd3ab8d327dbb9da93fc5cf9375205566242bb30246254ddf04c526f9141006fbaffc268bd2fe9aaa19581bb1c19e77264b08670ff3fe2b543f47a7af95bbe94b99300889b8ff07b2a44d5e9e229e33133b58bc7d2b8eb92a3bb6c035f8891d3165284e9ced25d6ef19a8135d06ab889f7627318cb043c89d90667cb92d1318880107ed9b866b10fa9af2225a987827e866c981f0c4424740fa71697ba9933a91c0d1fe83efd8e7d6c8287de72811da7fb4fcbad42637f0df47482119a07af9cccc993537cefe7892054bc2ce20021e9e37f391ee57b66c40dac49a346a54e6416f4e40af67b7190d65f497febd7d54f148fbc4850cd7de200cbfab53d05fb Msg = dcf645e2201c3144ccded7cdf843326481ff3105019a5308fdcf74a66033e7b92817c4c360ae83324e73cae2edc584e49ed4337e1ac18772ab012f839c03ef36ed12f3d64c7c63ba41f437cba9354d4065e8b8ac53c85c3b7d04b83891e402d392b07922cccef7650d2ac58e12dbb4014003699895f6f9eadd9fb6cd29204819 InvalidSignature = 0e7a238a1eeb14ed0aeef74bc58feed30afaabd466b13d91b72283a694b785d9a31552b60217d9721197409318097335961d234c9cb6a86bdcb72d6da21951c70461858907336f52e82e7d44074980373a5bacd08768ab9665624c8df9f09363daa823948b4b6887a69ab7eb15d4afcffaf8a1499ab12de74fabbc7c93ec60f66b783d8395fdf95fc3b417222882c91b40d249165f5b60b29da2320d2cc3af8a1c148af334c404d9fc248034888fcde6ac99411995f6ee8a1479def7857307b0b40498a56e64929c81d14a7a91477935a37311e30600d418dc07d6af4cd200ae88d5ba69b2e96bcf993d105a18a1f7e8a56b372961ebd729a76c15e4297ae4bcdb5ef2e7242e30ab9dc13442440310de6bdca48b98d67bbb2ab07822b3a9d5345b4509bb3a82c387f354f4cb19bfda50cb88149f0cf4d8a668458309676c4c7a1ae950ef5a5830b4c1d0592ccc875a46828e617608023f1db249e9cc13e8c0a28b0395465e5870b96d68ef2e254393b04bfea234ea3fa46c6d53d3c5d51640d1 Padding = EMSA4(SHA-384) E = 0x147e73 N = 0xb125fc054e1b9db3b98212f53840690607c110bf31e18871fdfa13046496a2e73b3204f33bf8350f841ba94f511cbb2f40587b147a820fd166213968e8fff9fa4be4718a672f4e9321455c56d5e4e09d4f8b2c690718bc46108de269857bb4145c86cc75a4bd55f972285e4054b9fd13927574e63690958177784b39b17083bdafdd3ab8d327dbb9da93fc5cf9375205566242bb30246254ddf04c526f9141006fbaffc268bd2fe9aaa19581bb1c19e77264b08670ff3fe2b543f47a7af95bbe94b99300889b8ff07b2a44d5e9e229e33133b58bc7d2b8eb92a3bb6c035f8891d3165284e9ced25d6ef19a8135d06ab889f7627318cb043c89d90667cb92d1318880107ed9b866b10fa9af2225a987827e866c981f0c4424740fa71697ba9933a91c0d1fe83efd8e7d6c8287de72811da7fb4fcbad42637f0df47482119a07af9cccc993537cefe7892054bc2ce20021e9e37f391ee57b66c40dac49a346a54e6416f4e40af67b7190d65f497febd7d54f148fbc4850cd7de200cbfab53d05fb Msg = f5e7010e4829c855dd6c3c84f57a50cfbe5b3c9fd4c9229e07e4f10d5f278a5e5d9b21ff844ae67418f7e5a8260c2b85c4d42bc29aea60fca1f233092b861e89247312bd9726169d7361322490338befed26cf063cbad3faa0127b30b5eedb7cd1d99bf189a4a0f87712e8a03bd5b635c0b9f014c120c5bd8bae922a04450760 InvalidSignature = 5f231b5b8e5804698ac2931b612c7087462f296502f7cfb95d8547c813004ddc1c01de04ab900a2606db31f98bad9d43d6ce858d7413f6ca48df1214c348725507d86b19314aad2be754a91ba551e156707a991e93f4e49e66fc82ad34d1f36ceaba9b781df4b277f62f5072652ae60a6525f6b28a77e144edcd4f596dffc9cfc6ab235ac406c7d5fe3d364e6c4df5e2e50c0e9931f3ab47fb41bbd0ae196f938168f52f3ca4c6290968306044c236792953a2e84e2a2738f296c032d7a0699849177cc6495b27258820f8476c4b09e85e30515bb9bfb2eea6bb04d90f6561f5bc5123df8e6d276feae3f66367c4481b1f72b38f51529972d9259dbbdbb2f04b028d439520c72abda8f04d7b277831591d2d6b6398fe15fc5cfd0b854f4effa0a77e39c1e596a466e2b184c499e2b15aacc5f6bd4c74a58e346bf6f5aed5343c300c8f71545d95d2276d54de2b6e23aeb8f5247fa6713e0e528e35cea82148ac4c72a654380dff36e4ff0f2b0a14dc271e87fa711e915855efed24eec15700fb Padding = EMSA4(SHA-384) E = 0x9ea299 N = 0xb125fc054e1b9db3b98212f53840690607c110bf31e18871fdfa13046496a2e73b3204f33bf8350f841ba94f511cbb2f40587b147a820fd166213968e8fff9fa4be4718a672f4e9321455c56d5e4e09d4f8b2c690718bc46108de269857bb4145c86cc75a4bd55f972285e4054b9fd13927574e63690958177784b39b17083bdafdd3ab8d327dbb9da93fc5cf9375205566242bb30246254ddf04c526f9141006fbaffc268bd2fe9aaa19581bb1c19e77264b08670ff3fe2b543f47a7af95bbe94b99300889b8ff07b2a44d5e9e229e33133b58bc7d2b8eb92a3bb6c035f8891d3165284e9ced25d6ef19a8135d06ab889f7627318cb043c89d90667cb92d1318880107ed9b866b10fa9af2225a987827e866c981f0c4424740fa71697ba9933a91c0d1fe83efd8e7d6c8287de72811da7fb4fcbad42637f0df47482119a07af9cccc993537cefe7892054bc2ce20021e9e37f391ee57b66c40dac49a346a54e6416f4e40af67b7190d65f497febd7d54f148fbc4850cd7de200cbfab53d05fb Msg = 961d11d02fea2179ead83fa51684e5f4a2b804a898e2a3b6e8c4c91c676c9e761767cdcca9322caf40f19f8478633a1fa716a59463d7c549446d9850ea8761f442f20692060fb6ab8385ce369f33fe3b1a69a89d14578838d0c59a2bb7053877a02683ca4e6b05953afb956493da7a6f8418d36cb54936a814359756d5d06b27 InvalidSignature = 28e4ee2583d359cc91cf56aacc9a9fc560ee09842fc4fd66433f383b67f4356167c799e6446ec0939691a78947c072c1b071ab15c4c4de6d124550139d6b61c0c8370b725a9a06704592975d57fd3d8b3d1867d5d69a0b5580316f211f10ec4bab68a2dfd99cfc31cd3c5c2b87eac54ec482a60ad2b0cb1fe62676e5405459a6c010c1b9e81caba0a82043423adca1cce0037e444572b092c5eb060b020937948ac798b41c55a183af7ff1c118ed778a140acf7f17894ec6d39de22871ee0bf2fc97071a9662663e62609b184b9e78841f0df34963b228b4b13e5a059ed1f113f14ab65fb95d79a904f4d9c47d619a37b2170ab2d41daf64c39117ae5cfc94a79d055b63485c7681eb4aa4e3c044e98b95fcdebb9bc24c907635c77333acda3d5c1fb9c79ef99910b889a1c7eed7953c07ae9d234c3fa53d627b7fd89b5321c2e8c3f9038fa8391095ddaff9b9ca533e42554c83abf026974a82c95c6d55c842b2a39df9c5faf50d29fef5d148017c42bf41e7de2073dcd5d8a6f7029a19dddc Padding = EMSA4(SHA-384) E = 0x147e73 N = 0xb125fc054e1b9db3b98212f53840690607c110bf31e18871fdfa13046496a2e73b3204f33bf8350f841ba94f511cbb2f40587b147a820fd166213968e8fff9fa4be4718a672f4e9321455c56d5e4e09d4f8b2c690718bc46108de269857bb4145c86cc75a4bd55f972285e4054b9fd13927574e63690958177784b39b17083bdafdd3ab8d327dbb9da93fc5cf9375205566242bb30246254ddf04c526f9141006fbaffc268bd2fe9aaa19581bb1c19e77264b08670ff3fe2b543f47a7af95bbe94b99300889b8ff07b2a44d5e9e229e33133b58bc7d2b8eb92a3bb6c035f8891d3165284e9ced25d6ef19a8135d06ab889f7627318cb043c89d90667cb92d1318880107ed9b866b10fa9af2225a987827e866c981f0c4424740fa71697ba9933a91c0d1fe83efd8e7d6c8287de72811da7fb4fcbad42637f0df47482119a07af9cccc993537cefe7892054bc2ce20021e9e37f391ee57b66c40dac49a346a54e6416f4e40af67b7190d65f497febd7d54f148fbc4850cd7de200cbfab53d05fb Msg = 00d76dc429af281012cb92d5f7c2fafcaa73ce043fecfa01088b70e5c46208ff13e08bc12dae0ac6d4d87514872d699ef9e8480dc1908fbf531c64102f5b6fd95893eb370869fd8ea20044cde865b1f36e2b99d24e5208121e6e597a1f04036bb738b6ad22a5a76f648d288882327b03f183e8db4ffb0d0351c776a9fd276dbc InvalidSignature = 619652bcc22cac5046e8eac8694e0ccda00a7ff1afbab00ef5e971a700499b64eabe6f80102687861e7b8466ca32eaaa87e9a0d143f75dd7fde50b0195a035d4db443045416caa3d51410c66137ecc63e6d0568f76769045ecd66a3512b246dfd296397aa41623f4ff67a67b42b9ff692dd4b9e4595aafe2e7166eb02fb3d13be0f22f5b6c716ee0bffc8ec3567e14775f98ef1f0a6b96fe092be0a6d243ff668045d42a72173c702fd0e19c23093497ccee3ecd7c1f9afc876906b498f85c3b3c0a88dd5988a9e6186d3fe635fd7313bde1aeba873901f10f30ccc2d6f91dcaf64a6d9a95028b1236e9b5af2404f4c224388ef39801eb4b50902925741d3ee50a4d309f920f1e823bebac39312243f66a3f0648db6411612e6c881b4e44920c7f19d7fe5970e1508f2d6cf662d313560a5219973e66bc54bbdc7e05ae3b46fa7c70e5af4d4e379a34fb6794b7d83c3edabf36a080b3020beceeeeeb948d36d157b3e2d27e79f8a9b2dfd413655fb71e68080924a7fe8401538a3e90fb1cdd83 Padding = EMSA4(SHA-512) E = 0x08a649 N = 0x99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285 Msg = 4d44665e0e2987cf7dd1e9d6200151f500ea3b85a24f72fb38e5dd6919ff9c486f6a54742f96c6784ff7a70c33ababdc685de48b94694af8ad419bc06a0f6504f79c606ced70026b813b4ec5fc73ed4f6b3f7ff697943303379d959e6561a8904fa0354d2ffd62317d63860a62a13cd77157b7cf921655a53ec3760bf23c8e75 InvalidSignature = 4f48e51a041e40a029d586cb7afd7ec11031f86d7bee58fc13a9227dd209f1d7becf3209cd43055e93165f04f23276d46b0b64669b88c2ba54ad6bcb5e9da81810014e140ed0a14234b1fc0fa4cfa4f258a7b5cf73a336534f37580a3830875f3119092e4854fa80d87833f7e9627ab51e056a8deff3a451e8aad78335816b53ae0d899b0607403bf08e8c32e1cf0baa8fe0d78d1b8d72f85f17c1c5b8870cec499497b42de982408fbadbe3b45a13b4b5371ce2a4d9600b7d14011625cbe73a79313954f4f3ec0b3bf6dc945297325e3aaf5bc89a27670f5b2536a54caea3bc6641ae628a9a4da61de749661a93b6ae68722d10d7902b391f9e9ebf3ab9c186017b52eac6fd442a256fe7c9500165e3c7a402aa0174e6b6f35e4e12e35a9d429b21f6cc98eba73c80ed8ac33acd79488e620b274923e78ce5d91a6196ca59054fa77cd67e0d3fc04d71b94b0cda5478f1b3d69150f40927c1ab392036583609d8efda3fe48643ef2f75f1164ea7f25589b5bbb560c9a042408f85944ca08f92 Padding = EMSA4(SHA-512) E = 0x08a649 N = 0x99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285 Msg = 1abca8d81cc98a5d5020e95080b5fce59ffe70dcff544802c49de7fa99286b3da1d83d60b085e696bc9f25758e143efdbd7494d6dd547ad9f4f047d22d14a884d13c3bee72fa59cd6a98336284fe2075f8d7359a9df017b35ae00db6ddee59b1902fc90bc9ef890c42523b9fc83b4957376d7ab1a5f1c499deb7622f118026ca InvalidSignature = 85e15765a401c10d86acf3a05fab14e05487b793569ae680f77d20c25b1763d184634fa0b01d979dce9d803670d7f9f6adcd59476fb1c8c3aae512f94a9ccf6e573aee6a28c0dcfd2dae8522685f03ecec8c045036d1cb054a086454a28326d5319bc7004bc87c7566a56852558f583a38a4e7e7be7981dcf3ec41c12345f845409792ed87b3f1b8fc89c288a2968e73273a36f2b67258fc67e888608566a23a6a5645328f1edd8c105993b486eb3335232212a1dcfd5da40fb3902fd2cfa86e8588eb3c40df8d9edf3c41934ce91b50c0d5ca1a3840ca40e3c841b39520cb5e5654af3961ec9408d22edb345027eea7119dd552656342e316c60c5f5da028308b031bacc74d1fdd6907bc6944fb856082cb14f12cb509ca4efb516ed0c60896771b478442026913e61a32611dde1a8807f2e1cb76d0c0c69c705beb8fe713e848cc03b1ef8965267cfc3ebd43f0001b33b9e9ad418ee0d592f184d202331d4b51a96a17b014d47138f28caa39d9dfbda60894956d0c043e4292877f044b55a2 Padding = EMSA4(SHA-512) E = 0x08a649 N = 0x99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285 Msg = 2085e8b946d2059752f8f0fee528e7c4cc0ac1fa24532c1ec29a3a92d2681c4dbd8e2dd151bb325d1c4ddf6318689e3c8e458d1b34cdc5409867e26ec20ec09e15a682f57790d9f4b27c83ef197e11c06e65eebc03489de620614263a51e642ef076f10d017a82c4dc2ce1882f93c9b6350fecc5daeb3a7a2031615ac1c29065 InvalidSignature = 65bd57d4a37495d54eec7f6321f7101a4643d9432a2afc8eaa147fb29e7ab1106eb31a6ea7ae3b48e40de63cc368e7a6df4c998259c59ce40b8ac2f8763bee9192417d2020cbe179bba8aee9be8971466f5e53b3f82004ab6aa529d08545bd894435d8dceeb3a8e905916bbdb015bff65e9e792a88e1c8449f411edacba504cd0730605dc83fee64f8dd17f577075694402f1862790d9629f9fa8ac3ab4ee341dd3979eb1715c4f742fbd89ba3b90565ea4587438562493f611d5ac9989fd405a01d23b13469a2a7a85b0047483a665ce3899a412107cacc11087cb2607ba9d04091c418247242cd8d819ae17e49a21bc4f966ac3d37d2a61a8bfeede0f2ef2da3aa32bc38abb6a16a4475e9672c4aaa31d2e8277f3dd9663f3960f16c01998d50a99bcc681ea02b137555af2cdd28ea43281588066bc55c8f7aab45dedfa2f6befb5b13911cb9cec2b3fb07bc00b2dacaff8237201d3ebeac575083011624b4be018379514dec97209faa29b1f93fda75f0770f3c73e700a2e48453067c909e Padding = EMSA4(SHA-512) E = 0xa45b6b N = 0x99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285 Msg = a589c8788c959961fef98694bbfeffce5d69071899ad969ac25f3cb48eea084b1d84a8613761d1e9d626e2d9e4a0c48045b6141a189c84a23a4a7ee70c2d0be2771cf4472d8d275a31095b0499ddf7269313302da6a072e73adf02955b3ee141ba38f351f483605d178a3b3e631d62674d67a579ca212a11c9060fe40187520f InvalidSignature = 062418750845d3291e633e47406480e32fa2980275f2e4ac79d284ad83ed11190e7b85bfd6ed9bcff63345582fccd88a578941abb987d2dcb549a0ac2ed5fe7ce8257bb1e6288155fff3dc9bc1140f2777a84575986360d076605e655c9d73f9bf010a437eb7b280d6108374ce8da4c702f66a9d1d01b141c6a698729d0fcdb0631b21578dded721ef5c490812266cf6f01270a8c6c2f08466c9b3c626c0f1edeb5b4fb32e958a4a388c6c6e73b53a506137354358bd00bbd2058c9c12790410a45f4348754844b357c4e17fb38c8cac87a6be3cd06a08943db0e8b867d473e7d3581ed2a32d25d7b45eecf8fea10d0ade1c888591c71fc86abd1446fadca2881de87a6d05566c5000c1e075b0c1c5481ffb6e982a3f8f44fa8ad0b6a92f1cdedd9c38d326a6efad9d0359a69af42034b7a4ac388f9c7d356edf4d6e4550addecc7192242b3b1fc4164602919d3411ed43e2b394867bf840ea61750bac4f1b72d28af35eb0b3aaf6eed654d1de883240c0e2234ea2ddf6f8934cdcacea802e26 Padding = EMSA4(SHA-512) E = 0x08a649 N = 0x99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285 Msg = 70a4a898028568699ccd8a53288a747851884db2971ab17aa116a909d422dabc242efcbd2a428ee0777ac8cb294fd25abc17334222cf8cf4151986c4ac81094a2c04af0821d3784eae54bf5b226a6cc5cbf66c1b0f9e5ec8b8cd8f3a90fa29442e2ea7c10fc08c7be963554b3b64ac81292cde85870c8fbf343aadb5a916a273 InvalidSignature = 078843b04c9855e60b0965970e3485a8517033efb57b773150483e7d79a549d217159fc194c78d1d7eb872ade231d1c95dafcb7d5292d7b113a99567f492cd846f88cdc1d035a04ae6a5ef28a8673387a2479c3e0c5a1204bf13602b49097fd4bec16284566c36e45ea3963567f36daee1ee86697137cb258258b5c318926fed505cd6784ccc95de4edc2034e64521276f9055824479b4abd51a7315e81e204dc00f4b077f26ea0a7256bcfb0edf88624c4e3a059914b75ddfcf945c5620eb6b06b3011e4babc26857bdd9bb065dfde515c37eaa6ad83590537566680ad1d776067827288c80497b76c489cb39762dc1997faa41086b1e377d3c9cb29e4599dea3b123d850463ed20087fa744a5481a4537a6252aea0bc18b2bc962deb589ae53a88239eac7e7906f4b16e68c0e7de2478c4e4da869008a65455c691547b16a9d964fe0faaac4abb22309e0753408e22a8668c0e96681f0fedf3adebd7c3c6ea0b452e07a6d94d9437e8b03e7b26203aff7c1706b58a20568642a8719b9838f0 Padding = EMSA4(SHA-1) E = 0xfd157d N = 0x96410d900ffe9a71d348c210c0dda7ee43f92e8a31ad876255dc540ff239c236b998ef9375e695992aba77861bf8f1cd966e3af1f9ca874618d35ecb494982f7c05df134f5ce5853d410e670e0972efcce2fb14b2ea6974d4802ddfb5915d23752480f5def2e4a858543918d5fb47e837e5f6564abba60745d0ed710b713dea6b4302a6b56376679435ecd62b9a03c5c7ccea920fa64715c0b554b5108abc20583c1c87c81e20b0ccded165e581791bad0760140540a8c18b0a1adef5e9cda29fb959652cf68b5da128484e0c837c6cc017a7741edb301891e01fc28b8bebb1167d07c2993877a62a8bf82471e7130416fd825e5deeee26bf9e3e5b9d4c8869240fc2ea09ab7547668deff741b9dadc6304c467ca896794af09a1f22eadccd526c2eecb7a3138d78d8a12b0afc2132fdf5ac6299433dcb72ad40a183d21bbf5e3fab66b1b961016d9bb5af818ee381653c3c7216e308bfd19ad0224051e4b569bb27471b9303eb9c0d4a0f684dd86b1cc91d13c025aee06c97ba89e02b0bc6ed Msg = c6542c0b67da9dee6338cdc0ff704346fa13de2c65be53a4b5e5dd5017cf2f6203e2ae021421ddf017f3186a622686506733498688c4f79a2d734ea614d52378e9b79cf117a79fabddb78adea47d2585905ed5bc550d126d4c4e1a2bc600e75ea05a5fa11775cc68de0a8be66e7e082e9e1bea9873a18a6639fdaaa7d258645c InvalidSignature = 4bbed79b3dfd054836d6b9af30b0cb202eea9d5a038c5a2ce9dd68bd22ad74050bf6f95634c28955b539a3dfbe80a4444ae2aba1cfc4f337abfabf55b65a89ba6a5fcbef5b62a4bae5b4c51a22953e89b71f4eb8469966e51f1b2d232e4de3d0ede3d929ce1e90abf16a4f89cd4b102c48afae0e039ef8f36c0c20513f0a79c209f29747757aae8380993cc1d427c8902507e038cc5c2496102b2d1ff0b7f717dd8f083cf313b82f9a4415dd03603b73d926c677f1cab07dfac0f8305d53eea8a8cb789da3dd34230f592334619f487d7ee85b099f98d4f557dbcf1f23944e73e9a3b762c82e1f45477c91507cfa8ee11a944c7de8dd0c0e786daeff11275085c8e2d2f4fcb9973a62c5b9de61368b517b029164d0f6c2e07a3fdefbc082275f5e726ccb1bf084650e46157caf8130fcc902f49926c36c8cce92db6a3072ec7a4fc7acb16bd7703b936f9ba1db295ea70efe3c5b9aa0515e7dcc2f4a02a96d69591f3cc3c64267e4926e094b84f800155d1fff6b686a71ed9abf5295bccc8783 Padding = EMSA4(SHA-1) E = 0xfd157d N = 0x96410d900ffe9a71d348c210c0dda7ee43f92e8a31ad876255dc540ff239c236b998ef9375e695992aba77861bf8f1cd966e3af1f9ca874618d35ecb494982f7c05df134f5ce5853d410e670e0972efcce2fb14b2ea6974d4802ddfb5915d23752480f5def2e4a858543918d5fb47e837e5f6564abba60745d0ed710b713dea6b4302a6b56376679435ecd62b9a03c5c7ccea920fa64715c0b554b5108abc20583c1c87c81e20b0ccded165e581791bad0760140540a8c18b0a1adef5e9cda29fb959652cf68b5da128484e0c837c6cc017a7741edb301891e01fc28b8bebb1167d07c2993877a62a8bf82471e7130416fd825e5deeee26bf9e3e5b9d4c8869240fc2ea09ab7547668deff741b9dadc6304c467ca896794af09a1f22eadccd526c2eecb7a3138d78d8a12b0afc2132fdf5ac6299433dcb72ad40a183d21bbf5e3fab66b1b961016d9bb5af818ee381653c3c7216e308bfd19ad0224051e4b569bb27471b9303eb9c0d4a0f684dd86b1cc91d13c025aee06c97ba89e02b0bc6ed Msg = c6cec990476cd20d445e83a5ba7ce48e1b4215baa2d13efbe436c86ba9efce0bf9abceaa7a52a509f945ba3c46e77953455c033a429123de857c859126a522b023e5ff83b06d1764ce0b95241fa947aaf91750ddb90a1dc55a649aec46b5a50b6b02c3e292c61168ec377e24eeca38db5ff9646bb04412f78b767044ae293d63 InvalidSignature = 363c8a8e3f251f7c86cf53a34e9da296b478bdd9ff3bcf36921ae36bdaafbd73cc22013fae7d3b0ab840db28cddcf0c122eca5610b1640a5d4658672c2323ceea32609196be2ffcf40488576065cd022c0e2cc22e6103cf93610df661657c3ccbc0357d0ceebb85d8a2b28c6a45b5eed1703a14e1dd28e244882a8101da1e5b9ebd9d10df36ec4576a1cdefa89bd5390957a0d9d72873a9fdf46b67b4f2773f5971052170c71b9aa409e75ca5cc2f0cbc97a8918817be164a820f90a618acf0c5aea19e23c6e5d78465f60ee706c8bf78d38ce3ce4b204db5e3ee35c4dc3cf5d6cfc1d0b17b65b97bf227937540aca0c0b5d2ee7f5fa2ae4fc0a592d9b97f524a7468910e7c1d843b8fecfc48f7e2b5355cdfc7d5359ddf065031730915e41126b7dca03161b45493d641d50276cc1ab05c2f2abef4761e0a99b7f34f35d5621f2cbf8490c61d035af3c40d473192977dd7bce01bda6fab5d363afc5d2e2cdccd6721a6469d68e5523b7d6c30a9b91363dd2e90ef7c51c001f956d7dab72ac5a Padding = EMSA4(SHA-1) E = 0x4f19b7 N = 0x96410d900ffe9a71d348c210c0dda7ee43f92e8a31ad876255dc540ff239c236b998ef9375e695992aba77861bf8f1cd966e3af1f9ca874618d35ecb494982f7c05df134f5ce5853d410e670e0972efcce2fb14b2ea6974d4802ddfb5915d23752480f5def2e4a858543918d5fb47e837e5f6564abba60745d0ed710b713dea6b4302a6b56376679435ecd62b9a03c5c7ccea920fa64715c0b554b5108abc20583c1c87c81e20b0ccded165e581791bad0760140540a8c18b0a1adef5e9cda29fb959652cf68b5da128484e0c837c6cc017a7741edb301891e01fc28b8bebb1167d07c2993877a62a8bf82471e7130416fd825e5deeee26bf9e3e5b9d4c8869240fc2ea09ab7547668deff741b9dadc6304c467ca896794af09a1f22eadccd526c2eecb7a3138d78d8a12b0afc2132fdf5ac6299433dcb72ad40a183d21bbf5e3fab66b1b961016d9bb5af818ee381653c3c7216e308bfd19ad0224051e4b569bb27471b9303eb9c0d4a0f684dd86b1cc91d13c025aee06c97ba89e02b0bc6ed Msg = d5054ab2c2e4fbef568b1f7d08a38770ea0b6bb589276900157bcb06c27809ed6d958e0083a2bfa81f593a9772375b47688a05a388ca9f041d2c5c5e9375c0bc230c60e9b354e970f73863c7dd08b7c828836f605a35be8bd803c080490402283f9245d519a17f312850237510bea2db711f3255c70fce7f8f257ed2acccd81b InvalidSignature = 093d399dd290391ef02593ae52e54d5533006b650730fba61170c31fc6d0e2c53751faa31d904f4a96348ad8f36ffe8892b846eecdcc85ac1a739978707fb2b4ffa98106fa2e55953911140fcdf41ddb1450ced819ecc4d723b842a88b4fd9b5a506d8a0f5bd6b629d1a2871766556889326d1c9222c98062ef6903427f13d5c55066b5693e85d749961c53304895e2343fe953fd30d4e8e93c952438c2a83b8590f3242fe561ccc2d4dc393d2442bb57c54276813cbc3317a6e93141c32a240572e52c6eb400e8869005148f66c7b04391e285605133cf8ea5e809777ba22323506ae5ece5f9a55d812766ff3c9d784a979eea3391d47fa97304b719ab7210f1b1be7ca9846cba4b3fdfbbef0127efc2b1f6acb0827b0bf48058cd26d21344ef9a3d34f62484db350e9268048fa096415f833e97114590c7f1f073b562be552cfc2168a186e941b70e8f3fce84dd437fca3cfb191ffc174194d1f448c9270b846f253923c00f73932a038bf97fb47c3ea8bfa39bb2070fdd50a13649f06ad0a Padding = EMSA4(SHA-1) E = 0xfd157d N = 0x96410d900ffe9a71d348c210c0dda7ee43f92e8a31ad876255dc540ff239c236b998ef9375e695992aba77861bf8f1cd966e3af1f9ca874618d35ecb494982f7c05df134f5ce5853d410e670e0972efcce2fb14b2ea6974d4802ddfb5915d23752480f5def2e4a858543918d5fb47e837e5f6564abba60745d0ed710b713dea6b4302a6b56376679435ecd62b9a03c5c7ccea920fa64715c0b554b5108abc20583c1c87c81e20b0ccded165e581791bad0760140540a8c18b0a1adef5e9cda29fb959652cf68b5da128484e0c837c6cc017a7741edb301891e01fc28b8bebb1167d07c2993877a62a8bf82471e7130416fd825e5deeee26bf9e3e5b9d4c8869240fc2ea09ab7547668deff741b9dadc6304c467ca896794af09a1f22eadccd526c2eecb7a3138d78d8a12b0afc2132fdf5ac6299433dcb72ad40a183d21bbf5e3fab66b1b961016d9bb5af818ee381653c3c7216e308bfd19ad0224051e4b569bb27471b9303eb9c0d4a0f684dd86b1cc91d13c025aee06c97ba89e02b0bc6ed Msg = 02abc5271d55129fdbf1fddf59f4b99d904915bae196adb2f0c06237b6b10919d259606920f246de8d892b772abac5627fbb041d219c49db87ccd32919e079d18a909fff680263a2f14c17152934f4ff29390c78bad8816d2208f5453e0741c4d1586a301c0dd1b3af42a9017eeaae3a37ce1412d3d2be2f6c7ab1d34eaec8ba InvalidSignature = 70a50b8a4349e57d7c23f990d33d0b1cc5074aaf462529102a1010575dc25fe90a34414ad4f3bf8e203af8fbfb68a8d10db1bd240052c23a4015fb2ed9760f8aa1bf13a0765f907c51037095b2537fa0e72901b76a945fb6094aeb316554218505c53b4aafec448eefb53d0dc4b8175a07f241d64e31d848cc3526e7ff6421971995d143fd3b201f2933e323ba7a1ce81a49c94e45c6ddf3f5cccc2473edd7511d5cec51aad62c4ca0366b487c8691bf2aed919611e7792fbb8013f4a11d15508890a7f1bec10a182d23f187e3f5642868f7a4d237d944eeb0ec3e8a045812fd31625978eb7052df5f1a26d885049b2fc74064ac9486e2f40179d6ea6c0a68a49ad384fde8a37f98a37f96b494651f136d2addc2a3d73ea694436762c02189953f9365a19a488b79458884079e8a94d09250fe8fea7ecba1777cf44289b38fd2e556958ff7170d36b04f7cb76053a73c78cfefaec345728ab66aaf62e7467101ff66b643db74a10d9844dbb3475f280d0a85302c459c67d9879ad44649101304 Padding = EMSA4(SHA-1) E = 0xfd157d N = 0x96410d900ffe9a71d348c210c0dda7ee43f92e8a31ad876255dc540ff239c236b998ef9375e695992aba77861bf8f1cd966e3af1f9ca874618d35ecb494982f7c05df134f5ce5853d410e670e0972efcce2fb14b2ea6974d4802ddfb5915d23752480f5def2e4a858543918d5fb47e837e5f6564abba60745d0ed710b713dea6b4302a6b56376679435ecd62b9a03c5c7ccea920fa64715c0b554b5108abc20583c1c87c81e20b0ccded165e581791bad0760140540a8c18b0a1adef5e9cda29fb959652cf68b5da128484e0c837c6cc017a7741edb301891e01fc28b8bebb1167d07c2993877a62a8bf82471e7130416fd825e5deeee26bf9e3e5b9d4c8869240fc2ea09ab7547668deff741b9dadc6304c467ca896794af09a1f22eadccd526c2eecb7a3138d78d8a12b0afc2132fdf5ac6299433dcb72ad40a183d21bbf5e3fab66b1b961016d9bb5af818ee381653c3c7216e308bfd19ad0224051e4b569bb27471b9303eb9c0d4a0f684dd86b1cc91d13c025aee06c97ba89e02b0bc6ed Msg = 6c0b6d2266a246feda6fa5cee22c2f33ed9d643c1f6824d9f327719225bc7678cfe4c85cd210ed4077701b0b5650418177a74c71b8eda3306e2ef3474f5d326990eadea84a9686e822878c932997298e01f2b16c42e019e21bdfb67b3df5478df444366c97df1bdd23dc82ce23abee44d3a61e9484e88ed642634197b52dbece InvalidSignature = 06eb0d95a988e9433b48167603df82c4f951740ce47671cc3374f97a1f168fe834c3bb88874f06800e9094578f472b99fad53282ea8964d2a890e50d1ab4c61d91be1a2c734845cc47e637c89d8e9de430bf3872561a91183edf79740ce9abbdd3c91d418f86dd560fed0cee7b6042faa0d8bbca105cbde474f091ff3688be6cc76ce7b4add80fd7aca06b77de4d0412f78245c422906fb36e2afd7f1cc66729483262e4f459dcdafe2e217bf07ac96c0b33dc98c6f2e20231454bd261692a06ca2204a1bf67b39fb6c8a7f86dfdfbbb1448af119419d12a9e95d237a8abe0513aeb7e157a4d884ce29a37c97f07fc38b14b12101dde27d416df512cd6ff2c7c10a4e724c523c78be5c2d4e6a55060828e2c62ed4766c4354c27c2f776bcd97049c63cf017ff787fbf4724150a86501e32a3a187cdcb79dd81a4bd7a516279bb2abe28f42ee1fdc8ec69341cbf1ddf67592197b2c2ca9a3f031ea1150da24ece48f6a13e6452c2721adcedfeffe5aa7804b682a34c7f0f19a14860ffecbecf12 Padding = EMSA4(SHA-224) E = 0x8c6e57 N = 0xd636bd164a6ba07108e2c93f58e061657bc5cd2dfe1a72e75b33adbdef50bcbd74ff0f6f074dfb0f9f25879d1bd6cff2d8bf354dd37f89c638921071af961ffab7559189bc18cc8a8e2a1867721eb914077503adbf08986272034bb1dba9333a886962cf19a8580b25463b0d71d3d41d0bd74c4f77da0bbd85204aabbc01506737503b3b99e0203658136cb8ab0cb62929b7c3be4eb03c947c85faac147bb148086fd59a130e545520c50e2841fbc0734b1ba6f98514cae15d7ea3ec4415fb20b7fb1eaca5db849d286414ef718f3d20dd68dfd440e042f84732afdd0f02f98f925a0f264cd37c67620285ca59be9e138a836730e87ecd754c7fb28ae75f8e24e6d14e41ba339bc801459d2b76d8928f12e8fb7dd3314fe4640f99f6dccb0e16be09b796d791ea0ec92301891a2f702bb6de46ef69b484449e23ae8cd247e7ce10bf3be855daae033d640e8dfc0e6f12abcd6e0479b29439d99ab135aea06178174a1b7048ada5645182fac8e018584fa4250e6aeb4317454e86598fc4fae0b3 Msg = de53ae1c40bb05a44519e74e9389cb49f1c5523fabf9ccd038d2fe401bd8236c07ff300346785cf25ccde020e72dfb5cc9053a9489d0f647f72f1e3c0f3c3775201ba05f2ed31b4b945c8921edfaf55335c9d4112c988bbcfbfa329c1a9b98d571d18797be73499636ee6aba6f95c0177d39a91f5cfa94168e5cc3c7049e4f76 InvalidSignature = c9ad9f25b354162889ad72cdb4f4c5bc67a4b96fa69082aaaa0f909ddea77cf2e20614bed058bc2acf435811bce36c8a30ce05bb861356cd79553077c69e665b2ff6908a083c271483c5d7fc670592f2dbf8100c4e5e1854920ffb11f635bb4db239198f405bdf1c91fc69e9e92a6565ee56c9a72668e0c116793cedf6e2e36b60d22a5993851dd99e6ea0ab1efb70637e648f2162ba9ed07a5d1acdc396a86552b3c7dccb61592c321616a9fbc61262bf0b8ea67fd823915bec5e37096fc3202df2f1f44b48ff99a7cf0caa2b20e5693ee2627d4fd11069c59fd7257d1983c06e66bfc230f21a4884ce536d0025674c2f9227b1db75ac07478c3971fdd6f039fe9b27e6b8cb4ffeb1ff4b23b75af8b4036ef26e36a22e6248c8c1ef879c2b886e830140a9c11c95000e70727c4b7c5d3abfdf664cb9d59c579bd2a1c1ce24e5d446645a728b692b30620aeaceb5ba230f2316882a0436881bb3fc3c25291db297eeec590c6d9ebdcd7f52bd79ccd80ff0b2f30979a9111adb165fb701b9050c Padding = EMSA4(SHA-224) E = 0x8c6e57 N = 0xd636bd164a6ba07108e2c93f58e061657bc5cd2dfe1a72e75b33adbdef50bcbd74ff0f6f074dfb0f9f25879d1bd6cff2d8bf354dd37f89c638921071af961ffab7559189bc18cc8a8e2a1867721eb914077503adbf08986272034bb1dba9333a886962cf19a8580b25463b0d71d3d41d0bd74c4f77da0bbd85204aabbc01506737503b3b99e0203658136cb8ab0cb62929b7c3be4eb03c947c85faac147bb148086fd59a130e545520c50e2841fbc0734b1ba6f98514cae15d7ea3ec4415fb20b7fb1eaca5db849d286414ef718f3d20dd68dfd440e042f84732afdd0f02f98f925a0f264cd37c67620285ca59be9e138a836730e87ecd754c7fb28ae75f8e24e6d14e41ba339bc801459d2b76d8928f12e8fb7dd3314fe4640f99f6dccb0e16be09b796d791ea0ec92301891a2f702bb6de46ef69b484449e23ae8cd247e7ce10bf3be855daae033d640e8dfc0e6f12abcd6e0479b29439d99ab135aea06178174a1b7048ada5645182fac8e018584fa4250e6aeb4317454e86598fc4fae0b3 Msg = f3946c8f52f20ac9a630dee2da5956e1ea487215f66a78fc97c5e9637339b3cf0f06a81ce58f2f64b75e3a22226778977691cb6dc572fc9b3a5aae88ac94907373e8d7127b64ec79975d613e17b02adb9c4d0a532bf74b198145b22da6edb288c541e0ba3bfaa7d2ee353d7ee0bbd5730485170f5080cd3d138ddf9a89cc81d6 InvalidSignature = 280e4db5a0f01dbafe7d3cc64c1e76769a7fa877dc4d26c9e0d5cc9782119c8d9662ad25d6ae59fb990391bb1d3b5947809ecea7887cc99a47aa7275cadfef9f82161f7a3054923fa825cf16bd189b41c75d348c4d457ef7ed989c100c10ee008df13ddf6ef9d52bc537f86105976d47188a289fbae6231cefc1f7dcd92865df4588ada4eea069ecb1bff0b5910ad7fd02879caf4c61b9fa9ec03dbd93d61ccc8b5296508ac655d2df9ee68d3a0a1ed43eb7e77674286e4fd74c5f8ffeb9c21a6971a64e92e164b0708c092e2f6fd6edad762642416b7a98339deea10d9d0a0b3b4d191b75dcc3816ff61e377c03b29e883a99b6bb9871950be37bf921b0989bc7ee9e01b1c3b2fd8b428684e0b5409e432f6df104aa0f76d38a8b3bfe715322c7fa59c113b77436cfb5bb799baffdfc74aecb38b139c0937669daf7dc4f1c490d7a8e17c867ad834d6105319f6ed99e3173198ca7635762f277bf76be3bd5d605dc02d01abb2b3a36bd247c0ce3c84efb56b0b6b671e865fdddbdf27b402f0d Padding = EMSA4(SHA-224) E = 0xb98e6f N = 0xd636bd164a6ba07108e2c93f58e061657bc5cd2dfe1a72e75b33adbdef50bcbd74ff0f6f074dfb0f9f25879d1bd6cff2d8bf354dd37f89c638921071af961ffab7559189bc18cc8a8e2a1867721eb914077503adbf08986272034bb1dba9333a886962cf19a8580b25463b0d71d3d41d0bd74c4f77da0bbd85204aabbc01506737503b3b99e0203658136cb8ab0cb62929b7c3be4eb03c947c85faac147bb148086fd59a130e545520c50e2841fbc0734b1ba6f98514cae15d7ea3ec4415fb20b7fb1eaca5db849d286414ef718f3d20dd68dfd440e042f84732afdd0f02f98f925a0f264cd37c67620285ca59be9e138a836730e87ecd754c7fb28ae75f8e24e6d14e41ba339bc801459d2b76d8928f12e8fb7dd3314fe4640f99f6dccb0e16be09b796d791ea0ec92301891a2f702bb6de46ef69b484449e23ae8cd247e7ce10bf3be855daae033d640e8dfc0e6f12abcd6e0479b29439d99ab135aea06178174a1b7048ada5645182fac8e018584fa4250e6aeb4317454e86598fc4fae0b3 Msg = f3328c688ab764f3f497a8b5403683408dc7a888cd043a39c922ea4d66045fdd26afda37f1fe1a3216967dbe8d1d69bf7fa7ea1c07719c123bd2cccf666eda3c98ade11a616c9a50d9f27e83e3252be8b3fd09568e3a2da0d1527e2135ae16985115eb376169aef64591f32dcdb6936233b24e5fe9c5b588958a486c5b2adb9a InvalidSignature = c8a5f44532aaab2c8d64485004e0e1cadb033d4b4c456a01f9a0f217fd7fcdcc0ecd6b788cf3c7db5e39012540ef2d692f04ba77da29b34d6c817dfb45e0a47ba5da8e7d96f5f929aaf85222d2baf9e7dc8756dae01f7881c99efaff21e0dbe554ef9127e6b30681cc21c1cd9d7525279f793eeed2926f18060c1fcc3538c63515dbd8ca6607cac1f65ca8a3ff9ef92b7a3ef68a5ecab366085677e7134b7c32b99a3056dbb8b7cc617e3d3a6d1a42e5aee5d24632919dccf6826677be8633819c27da66f0eeb3048cff202c42407a74469c114d496270e3574c5a516257986a234c1c6e48e868df31b6f2e6352a1d838ec8b582174e4a493a47a17c3ee0be12de201a9d60df89a9db145094d04f9637026d3a64d022b02b052e3e0cee55f73b729b09f6cd7f84f7abc1a357cc1e10b5a6cea2486aa8fdb0d36cdad9b60be1c6dfbd646c003647f57071cf6791f1e5e386ba876ce1afafe636456647d4794a0b932e8f4d600f85a2e6a485e9700844a1354fb6211eec8a25aae2ae91944e375c Padding = EMSA4(SHA-224) E = 0x8c6e57 N = 0xd636bd164a6ba07108e2c93f58e061657bc5cd2dfe1a72e75b33adbdef50bcbd74ff0f6f074dfb0f9f25879d1bd6cff2d8bf354dd37f89c638921071af961ffab7559189bc18cc8a8e2a1867721eb914077503adbf08986272034bb1dba9333a886962cf19a8580b25463b0d71d3d41d0bd74c4f77da0bbd85204aabbc01506737503b3b99e0203658136cb8ab0cb62929b7c3be4eb03c947c85faac147bb148086fd59a130e545520c50e2841fbc0734b1ba6f98514cae15d7ea3ec4415fb20b7fb1eaca5db849d286414ef718f3d20dd68dfd440e042f84732afdd0f02f98f925a0f264cd37c67620285ca59be9e138a836730e87ecd754c7fb28ae75f8e24e6d14e41ba339bc801459d2b76d8928f12e8fb7dd3314fe4640f99f6dccb0e16be09b796d791ea0ec92301891a2f702bb6de46ef69b484449e23ae8cd247e7ce10bf3be855daae033d640e8dfc0e6f12abcd6e0479b29439d99ab135aea06178174a1b7048ada5645182fac8e018584fa4250e6aeb4317454e86598fc4fae0b3 Msg = 783379f295b2bb2e1dae5115b34c991854a517403a1c741d00f0c700080d146a1a2812c34d0a324f2b2cdc5f1085fcc4d3a0bd89a8f194e24569815f44489265c933a8df64867d3139ebe66d5e2c56ca8445a452dabe0eda2e377d3755450bafce7cc2aea2cda6ba8e13f6a964e8b012afbd5301962ae8ef038243f104ab872f InvalidSignature = 330d94974270835358e4ad6a73a3b1686782706b5fcad43d7e5f66d61b7a3baa859fb58fb3aca262d4751d1fa766128f961b3a3380c83d3f9e250810b304417f6477446d288f07713682e3c9f476329df75db1e4ff0432c3f1a7b341348899288c056120a3a3844d1efee7e1427ffb533cb1d453cf308654499f26e16500d2ba52e94bd0c2b91e4f0fd747d73e04a81665d1e9e8a7e2b1ebcf91dd85043e20846908b2ab26a8f01a8a3662fa413046c68704d139616a4835223b04221e3fadf5a06e0b1eee722298e287932dc676a5038efb6c6035d1e064bd0255361a74e4f8efaa754a27fd0385b54ca4a4ff16422f427ef482393b1df05ce03fd30d82419a78dcc988e4dd2083bf97ae09c26a2b52a10de44dcf9ecba2b24803e93ad9e3660cdf00b1f65bc59b8a831461f92a263fae7278c1e421c80186251d33b7ebc14fece0135f39b3f9c8631e49e2069e1675c724c542b803398e97975c89b7a92649b790b1fdcbc1cde0fe5dccc6b82058067eb227fd6c60bab33a8c5ea0afee1617 Padding = EMSA4(SHA-224) E = 0x8c6e57 N = 0xd636bd164a6ba07108e2c93f58e061657bc5cd2dfe1a72e75b33adbdef50bcbd74ff0f6f074dfb0f9f25879d1bd6cff2d8bf354dd37f89c638921071af961ffab7559189bc18cc8a8e2a1867721eb914077503adbf08986272034bb1dba9333a886962cf19a8580b25463b0d71d3d41d0bd74c4f77da0bbd85204aabbc01506737503b3b99e0203658136cb8ab0cb62929b7c3be4eb03c947c85faac147bb148086fd59a130e545520c50e2841fbc0734b1ba6f98514cae15d7ea3ec4415fb20b7fb1eaca5db849d286414ef718f3d20dd68dfd440e042f84732afdd0f02f98f925a0f264cd37c67620285ca59be9e138a836730e87ecd754c7fb28ae75f8e24e6d14e41ba339bc801459d2b76d8928f12e8fb7dd3314fe4640f99f6dccb0e16be09b796d791ea0ec92301891a2f702bb6de46ef69b484449e23ae8cd247e7ce10bf3be855daae033d640e8dfc0e6f12abcd6e0479b29439d99ab135aea06178174a1b7048ada5645182fac8e018584fa4250e6aeb4317454e86598fc4fae0b3 Msg = 1fada40d53af0011403e97c01556c2228c6199fa27625c9eb973120529716f2273f6fb70ef8771cfd60f658e028c2ac9f509f3f51dcc38b957d05cffb1768c4c7477ea4c621debb23cb3fd3f873a6e1f905d897caea7024ec7f494701525e8f92a18b9c932d836627910a7fa2dc654ce6445a2b8605b800412c50180dee84ad2 InvalidSignature = 4824ebeea84b2e2a5044c5ba673be3122e744ccb4c431aa01a70214f371ed9b4aa65cf6311d844f0eaa02ac85952b480422f57aadb3be1e3abd83790637bba5b16da395d7d748a572d495287c9273aa090c395dfe35f581f230f9313b551e03746f3830c7cc0949c5b0d1dbdd9a87d315a8e62c5e4fddcf377730012e223279c2550043d550a6ca67fc3f0905ac71e35b596cba990e183ec0839f3c39846a10fc2f9a5a5868d224b1cc6ffccdf6e86f571bcdcfdd5f1cf5a48d3354c78ced64d212f62b8d0f439782e52cd32f500c8bbb71ee84432d0b81aebbb183a3c716d41ce0b0c31d198f96c813d8f0a3ff89294ab6546577119602c7424e933b99f7990a88d1ab6a8de43ca838527f49b610666e0985ed691e5d0f04c0f75ecd3623617999673a30487257a49db23de7b92c25f22bdc2cc167f20396098e924b2316a5152d67780580a77d886cc0abe4b17cf3a318b8e92fbbdd83e99a39cbb3b74c72dec839ea47f534235b1aa7ab5e7063e54cba623a2ccb730ac6f68e35a9bbad990 Padding = EMSA4(SHA-256) E = 0xefabb9 N = 0x9c213ea373631f572e5e46225b95a0f5ea8ab0a5ec7090a3b0181c5906dc22fd1bd73d11471242a2ed1824e601017f5b5354b92fdb43d4da00a82427d05366a4d552c40d69d200485d5d5db83cf523e61a834b40ccd401087fbb93d81dbed7b2ee2381a1241ac68f2afc02157ee0c73cc66c02a6c6eb2dc35145ae55d7708412a3410f204c492376d6315cedf253af91f31dcab34f72c206ad81e800509864fe9255d046ac25dbdf4954d2350324722e73c1f25d089f87542ad907fb37eceaefb330f4325e97f5eabc04096a8fabba978589e355445d9543274c1c38ff849ba8c2911f07030634c132ccaf4e4f57a5ad9244f5df0ee25af8ef2fc7b29fdf7cc18404e20efaaffa451ec41ab838d594906ff2cad52dcbd0e9a68ef7b06c253710e1318d09ad07012767a89124177df50d1684679e14306889d9a7ac5143d4861b7d6ae77992efa73e0aba9da0ad9a6888bc804dbd07bc26a8a5dfbd292a0efa96867fdb92e845c36e3433cf292e0e31662480257fcf466f7f65d814bb3e33992f Msg = c66e28557124273e4a1fdf519ad9fb646e761b648fec6c9ab4667b2df7eb4be8863aa53e9bf9af8bae0fc09de94f7373dc56fa4472b6b5c4235403a26c0e59557ca1911831ca843342acda7dbe72211fb5351d9a34205f0c77d219af5b0331a2126b94ec1adfcdbe70bed6f8018b2eef61db2b6dbf7292fa19a9655aac13fc57 InvalidSignature = 89fb67fcf9eb4bc9c6ee9713ce1aab7dbe72b9c2f92bee7295521e2c9b1380b04df669f2a8cc06fe94d3843c64d4b4ecef511524951544b2d6a0770543bf45166fdef8cfff91d9b95217f1453ff353d9241d3d755b805a1e2ef9980782afdf3a9f3074f460dafebcf939b90e11e870f39b3d8221dda98c3b0d26ff5b953a4445bd4e63d915bde34f0ac8ba13b604e3bd5370142610064a12217a82e9f33f7e5e92d9a46d6bfdff3868923fc86d30d722e4f6d2e03cc08631f7f13a319278ee76ec014214983b011b5fd862fe189e84ea67499717a406df4d0bcb56b312f035be828f0380331503dee9b303a4f96bd687dd36fbc43c53a65496766ac2e0d6eda7e415be87abee1283998d56b1c54cc5f9bcb08c0a59c070c072ba260950c7500868808da6a7c0ef773e3d2e6d06a686cec36bc34a8ef7f24d26756e485dfa4b71db26174db3ef1ea61e15255579e63cb164eb6eed538c87ac43f7df50bf1ab83f2a85e753ad6e3611d36f2137801e03fdbf58d8e1416c008cbd7c49e0a44859d1 Padding = EMSA4(SHA-256) E = 0xefabb9 N = 0x9c213ea373631f572e5e46225b95a0f5ea8ab0a5ec7090a3b0181c5906dc22fd1bd73d11471242a2ed1824e601017f5b5354b92fdb43d4da00a82427d05366a4d552c40d69d200485d5d5db83cf523e61a834b40ccd401087fbb93d81dbed7b2ee2381a1241ac68f2afc02157ee0c73cc66c02a6c6eb2dc35145ae55d7708412a3410f204c492376d6315cedf253af91f31dcab34f72c206ad81e800509864fe9255d046ac25dbdf4954d2350324722e73c1f25d089f87542ad907fb37eceaefb330f4325e97f5eabc04096a8fabba978589e355445d9543274c1c38ff849ba8c2911f07030634c132ccaf4e4f57a5ad9244f5df0ee25af8ef2fc7b29fdf7cc18404e20efaaffa451ec41ab838d594906ff2cad52dcbd0e9a68ef7b06c253710e1318d09ad07012767a89124177df50d1684679e14306889d9a7ac5143d4861b7d6ae77992efa73e0aba9da0ad9a6888bc804dbd07bc26a8a5dfbd292a0efa96867fdb92e845c36e3433cf292e0e31662480257fcf466f7f65d814bb3e33992f Msg = d69fc30f760dd6025878a1ba227e9be2a73cc19466bf386f53bb34eadb8018e72229df8c8f17ba4e8a9efa4e84fd31e93894948a3151a4c38d6c0e9d0054cf2c1ce99b66cfeb80352db2c7ca6f201b353cd5ed3228a116467b3fbe0b33407dc84c45c1453e7170dec81eced5eccfa0ed3b6692345298d620a59d0edd7b2c6ce6 InvalidSignature = 3000b858d0217705959e33771853c39faca2f07db5600ab6b937c014433c030197a7e7834374c5c0ea66bee8e5e90e7454601e9fc994076758c8a06157c0f23332a9f36eeddf0779664a20c6db9ee884fbe8f845bb608d06cc027d572a0625d0fd548bed10ca9ffed8bacb67e6ded629cbdfc37b4f03e9a56407441d485eb26473ebdf120c4dad7a727c8fb254fd927b1fdfd1f76860f2e0106405f248d950950f87420900277ecbe5a2c7b77f7789da11ddc5b77ba7b6d8ce600e967d9abfd5648fd4040172416508e871785529fc3acd8d55ab05c5a761e2bf77c4f63438edb7dff5770e13efe4dd1e5ee625a751ed75b4e37850655a3d6096fb71ad2dae705a64dd41c84d1ed2b2980f5d80d35f6b7a4bc537b24a0a45200be4bdb71f1936c4665fefefda47752a383ba6ebb3b767c5c76b8adc0cc31f5dc9c17dc67467ae649442bbb9aa2af633f9a7559dc531658429f630a3b4cfeef84f8768554422905fbe86a6a4fb41a477907c4a51a8f0dd5d9b459ec4aa698f2e4d34c9358b85e1 Padding = EMSA4(SHA-256) E = 0xe24d7d N = 0x9c213ea373631f572e5e46225b95a0f5ea8ab0a5ec7090a3b0181c5906dc22fd1bd73d11471242a2ed1824e601017f5b5354b92fdb43d4da00a82427d05366a4d552c40d69d200485d5d5db83cf523e61a834b40ccd401087fbb93d81dbed7b2ee2381a1241ac68f2afc02157ee0c73cc66c02a6c6eb2dc35145ae55d7708412a3410f204c492376d6315cedf253af91f31dcab34f72c206ad81e800509864fe9255d046ac25dbdf4954d2350324722e73c1f25d089f87542ad907fb37eceaefb330f4325e97f5eabc04096a8fabba978589e355445d9543274c1c38ff849ba8c2911f07030634c132ccaf4e4f57a5ad9244f5df0ee25af8ef2fc7b29fdf7cc18404e20efaaffa451ec41ab838d594906ff2cad52dcbd0e9a68ef7b06c253710e1318d09ad07012767a89124177df50d1684679e14306889d9a7ac5143d4861b7d6ae77992efa73e0aba9da0ad9a6888bc804dbd07bc26a8a5dfbd292a0efa96867fdb92e845c36e3433cf292e0e31662480257fcf466f7f65d814bb3e33992f Msg = fa0c34ce3cf0cf6e48488b2b8671a94ded157501c6e728adb3930d81eff4e34fd788839caa22c2f78ddf9989d25b83ee79252743f7703780370b9808df93c37fd4e76bdc00dc60bf5332b30407c71b98290b978b55b45567c1b3d3c17c66440df80f35b7c785706fa22920c4af1c37f404af0d02671b490a577305d251d62da1 InvalidSignature = 60b39a9806dc82244820a8221985f08a775fadc715fac22e856abeae07223b0f7093d3d835e41a4cc1fcd239d129879f70e94014b5c46aa2919f3e13706979aa32172cada7f326423035adccb6096ca44e2f09146b38642605ebee531ca81badb5f5977c01ec2015ee7cb9f7ce12e0a3f586baba7c37e5bbc21e02bf887f672bd1eb17a7c785ad9020a22410068b879a0143b735b5ec44d224f0a095e239dd18d84d99eec82a2d5c3bcef4648772e337dc7b99bcc98bc33ad13ba1ddf36a43dc83aa29f4118db6b0899cd3a8f016fd0c456e80a654a86e0239c8a1e76d0293bf7f880e6ba3b2de37f6f2a6faf551f91ca685d3b26398b734de2599466a896c829a4949483c04cb168d0ae8721cd91b48780f495cf8093b52dfcec7b81370904195617df9b13ae1f06672690124a45c2c34cae84dea3d4db663303af2abb591db41c14ff93a491c008c0fcc1b8c3a00dbf3b0a7796579dc1c2279985b1231c9d2a10c46eb513c8b29797d7aea50b72224bed04e707ad81dc033c54849f0b7cc48 Padding = EMSA4(SHA-256) E = 0xefabb9 N = 0x9c213ea373631f572e5e46225b95a0f5ea8ab0a5ec7090a3b0181c5906dc22fd1bd73d11471242a2ed1824e601017f5b5354b92fdb43d4da00a82427d05366a4d552c40d69d200485d5d5db83cf523e61a834b40ccd401087fbb93d81dbed7b2ee2381a1241ac68f2afc02157ee0c73cc66c02a6c6eb2dc35145ae55d7708412a3410f204c492376d6315cedf253af91f31dcab34f72c206ad81e800509864fe9255d046ac25dbdf4954d2350324722e73c1f25d089f87542ad907fb37eceaefb330f4325e97f5eabc04096a8fabba978589e355445d9543274c1c38ff849ba8c2911f07030634c132ccaf4e4f57a5ad9244f5df0ee25af8ef2fc7b29fdf7cc18404e20efaaffa451ec41ab838d594906ff2cad52dcbd0e9a68ef7b06c253710e1318d09ad07012767a89124177df50d1684679e14306889d9a7ac5143d4861b7d6ae77992efa73e0aba9da0ad9a6888bc804dbd07bc26a8a5dfbd292a0efa96867fdb92e845c36e3433cf292e0e31662480257fcf466f7f65d814bb3e33992f Msg = 9b7687dcef6ff9aa5af4570ef50b98f09d6baf4bec99187a6751b0b3f927c9d1a16e7e56675944b09460c2bb22e5e3887218295d3d1844fccd5be3286d4fca661e4124018b7f1b503fb9a73b16ada3fcf1042623ae7610dd5835e3759a89d51b7ab723e54428a713c3c7ad97b7ab03d584f64fa728fda5a46fa959a26a1d1279 InvalidSignature = 6b784ee0a868b7dba298549130204a5245f830a89388dc8d320203fca4f8a1acf33777a43e1b0bc00a6d7ffa6fc1fdd78f4b2edd65c28a2b3932388900a0b5b76b44cb78458b2adf23a19c978620050dd0b8fbeca50e8cb1559a85ef0cd11ca38264d381414b6b1c63e16ea415173895430f1b1f42ab1b0280a31d981c402aeef3e890a936d6b182e83383ba75b27a1799353dfa37faa7986f4dbdb14da99ef18787bac6832464235660b6669eb74a41a9260023115d97bcd14f8707b619b0ae1401a8502a818cc1625646ec58f76e529ceada77b25a5a9e328991b0aae5e8d0ea06c357c28b63f101cb90d0b5d0d9d8cdd606d91cb0b7cfdfd33cc5e4268b78b84827e87debfc38a70c9b86e7be02462a62bef66664162216b2ca06ac1b8f52785d3115e08008d8c44a77a4221af3df45ceab9c6744427a9a8d019a4ddda659c0a5d3bd7401e09d143bbd6e3867a22a26bb09551b91488be53f561b1e80fc2ad649d043b6aae138737d0c6d7e7e38be7c263a536278c6910fd9414f43e858b1 Padding = EMSA4(SHA-256) E = 0xefabb9 N = 0x9c213ea373631f572e5e46225b95a0f5ea8ab0a5ec7090a3b0181c5906dc22fd1bd73d11471242a2ed1824e601017f5b5354b92fdb43d4da00a82427d05366a4d552c40d69d200485d5d5db83cf523e61a834b40ccd401087fbb93d81dbed7b2ee2381a1241ac68f2afc02157ee0c73cc66c02a6c6eb2dc35145ae55d7708412a3410f204c492376d6315cedf253af91f31dcab34f72c206ad81e800509864fe9255d046ac25dbdf4954d2350324722e73c1f25d089f87542ad907fb37eceaefb330f4325e97f5eabc04096a8fabba978589e355445d9543274c1c38ff849ba8c2911f07030634c132ccaf4e4f57a5ad9244f5df0ee25af8ef2fc7b29fdf7cc18404e20efaaffa451ec41ab838d594906ff2cad52dcbd0e9a68ef7b06c253710e1318d09ad07012767a89124177df50d1684679e14306889d9a7ac5143d4861b7d6ae77992efa73e0aba9da0ad9a6888bc804dbd07bc26a8a5dfbd292a0efa96867fdb92e845c36e3433cf292e0e31662480257fcf466f7f65d814bb3e33992f Msg = 7ad9bf1f36f9897d2844872e582ab3513cdbcdb437ba01eb610ec49f8bfbff297eb26f5f84e44bae2a7c286a438d1b6130891db65fb5b3ed12d9ce42623cef3f83cf908d49a9c00bebb30d1d08a5a647e731c1fa037d3badc7d77e3096a5a83d0e9aea518e302db9f552fcf0ad589e28e93982272afce15408709e122f1d714c InvalidSignature = 177e1c38251b8e9b406597ed90d09f666cbcd89f6863811fe7ef2df91a5333930052bf51c35aab93c77b4b6f8dd31b01e055303bfacdceae9c3a1b9af278100c11ed167acfe272c030dc358cae5780fcec0f6bc581e0c3b0b45a7272aa92707659c2b818709e2ef9ae2efd6b841cc82267f384cc8c87f66909dda9ce58e2e7c35e68c0c43973e9fe024642f04ba2b25d6dc956bee6dac19391f5a2bd5ecc64afd1c25af65ad8b4189aeded9e496a73e62e648cb1ff789d01c1610db96564b2b8fb42846ddbb1073f1edf6b807dc9635bc247628726e7d428562a48e4399846660eeccf851a47b7bd1dacc9bef14e3d0bdf7b22c7047955380dc3a1ef6ddfd9533a0bb0f511811ca3488076a4896a95127028dcd23829987680829d80d68c98be2a7dcd7c891fba6e46e4f99d4966c9d7db1975b60b4fbc1252c93a96f0919d5a4177bd578bcad8656ad596b173414eaa135c462cd5e1f783fc96da55bd41123e58b892618dc5919e4bca146fed14bbd54601635e69000b506044da3aab706848 Padding = EMSA4(SHA-384) E = 0xdf0ff7 N = 0x9e428342d2e3633965aecb89b0ed65c619c47fadb9a9017fc18c3d1837e5f6b4d0fddbf05bdb00b659bac9645f02c78f05e62d0cf57b977345eff5df2066e0eb2ae3af57ca3d0fb0f6a475fc36dfc6e5870b3ac5d850e2849fc32c9b16ac3b68d2f815e8c44d1418cf51f860356b8d409f20210cb01c2cc7e109ba76f6c43f2096876d4500012d8ed7dc1c35d24eae1ecf406ce3ec92606623adb8b9e17c3677c1fdef1a54d9442a9d990c0733f03b31633b11fcfa8c9f2b1114f307a811657e33d285093f4653b3ea1eadb28a792c835f975896996bbf029d1f688ad2e0b978888b07c3a12303fed92bf3fc6db29837ddc7c71292abaed99f3a0d7e60b15d9f2cd08d15318d70d35a7b7ff2fddb22d89cf261b8ba64242ba4616a93ddce2015977421d25f1b3825155746bc13f92a6097f7f66e919505af07706008378597af3e70c7fda3e9c99a763aab19ba3f459b12e8c1ae404d5091d802ae0dfd6b3619b97d3d964daf1de600b7446f8a7bfb3f4956a6d1fe967089bebdcc9b4ac7b905 Msg = 6c2956c024c46d04fe8190d0383885e367b0485a0512aec52c9d48809f9c8a410a952ced8bc4d1b070c7e74c439bceb104c73ccfb5d7e0a81c0c45a9c452fa3a4572f094c58923d2bfb97c4b031ef620fe0401113c5724952b5ae529229cede8a129685cdbfdab9471be197681aa4757dfce5ec9a278c1b4e3f0f0a9c163ad72 InvalidSignature = 1d096e665bdd8042e8f4ad8710042a3e0f26f95ac00e285e1bef437622dd6f3341a2a1840a09f680c982fba7a69e14e5e1b0d199751863996843696fe4eb46875b2ca707937b36bcd9da782039345424863af7275e002b25f913c60e56814ca4fa2b32769340dce790bc7b1d2c479a4ecaadd87869f62605e2302cc2bafacea33205c943c6bd60aba0cab77e67e220c615007479705df8bf41cc164d39e09b8ad34c4bf7b542bdf74b91e53f7ce30b9e9d29a1660c1a2051168927e422bdb9a8255db120adce8385507d0631392b62548bcf40527c265c174ed19ad00d9f4ced6c9a2f620f6d9b1f0bb605650e03baa4da21eb4feac20034f64b16c3c03b1a35f890c8dffb6540dc892dd3aa8942c88e3733173b9ba931bff106020bf3cd9f797ba14e9231efc45b54acc2aabf4caa189ec42493801000016b85b42c8ae0b40495ae3a530712bdf5d33f09660903b1605cf62a8be3773556f25d08c0a9d557229cfdb289618ea3dbf3390f9f916daf6b7cf909b541a72691b6f9b7f56becc8c9 Padding = EMSA4(SHA-384) E = 0xdf0ff7 N = 0x9e428342d2e3633965aecb89b0ed65c619c47fadb9a9017fc18c3d1837e5f6b4d0fddbf05bdb00b659bac9645f02c78f05e62d0cf57b977345eff5df2066e0eb2ae3af57ca3d0fb0f6a475fc36dfc6e5870b3ac5d850e2849fc32c9b16ac3b68d2f815e8c44d1418cf51f860356b8d409f20210cb01c2cc7e109ba76f6c43f2096876d4500012d8ed7dc1c35d24eae1ecf406ce3ec92606623adb8b9e17c3677c1fdef1a54d9442a9d990c0733f03b31633b11fcfa8c9f2b1114f307a811657e33d285093f4653b3ea1eadb28a792c835f975896996bbf029d1f688ad2e0b978888b07c3a12303fed92bf3fc6db29837ddc7c71292abaed99f3a0d7e60b15d9f2cd08d15318d70d35a7b7ff2fddb22d89cf261b8ba64242ba4616a93ddce2015977421d25f1b3825155746bc13f92a6097f7f66e919505af07706008378597af3e70c7fda3e9c99a763aab19ba3f459b12e8c1ae404d5091d802ae0dfd6b3619b97d3d964daf1de600b7446f8a7bfb3f4956a6d1fe967089bebdcc9b4ac7b905 Msg = d17e77c2ae30cbc6e50616bfa30d7c59b961fe99e559e5b653ff642b63c3790aad701493435e7b0535eaedb45b23855c4ec662b5b86d0547ce03fa801a7bbb047ec1d14476f13c529dc815f4735872f75dff8ac5ed991a3a64f507b4758644694c5bf6fecf51d6552488d7a673130ad1edf4bef20d47eb361dbdd1eefd4cdce2 InvalidSignature = 1739c5a5949f984829c5baee380da556de5b3fb39deeacbbbaf1409828c92df1d00149aa41195fb6fac035df1e9ee276df3d508928240bf0932a2f9224fc5aabc4f9ed4c413309c993536c8cd0d0551555a9ea8797a6f7ab60eada0a969f3687ef75669bff8d597aec3f8d868dacd1ddbe5f819817a8093f63a4127ae39e8dfd70c38fd1e56c8bb742ad9b85d61764c391050467d18d78ede56bb0f598823531a64a4d33ebda0a0882775a52ead6c404913e0ba876684321132069e420a8cb44b1f7b5d0ae431016eeb137c9a78a701936d5b7879f3f9a1d679860949b8d266c3676f46617add4bd8ad742d95aaf4dbbe6e123898240d123ce5c804bf448904945a928a897baa37aaca37ab1fc53f7c0f2a7de496edf5377dce9ed73f8321ab09083057c44529f65ff0846cda76c11f579ca00e4ad4e768ae3e19a7ad0a3876a0996bb829d03e9736d63e886bd2f9857d3280f1898b51be9d95e66a479faa76bab6bc991edde71a715846ed20d76cbf16e4e4fdcf6e91136350c8388a4db005e Padding = EMSA4(SHA-384) E = 0xeb8f15 N = 0x9e428342d2e3633965aecb89b0ed65c619c47fadb9a9017fc18c3d1837e5f6b4d0fddbf05bdb00b659bac9645f02c78f05e62d0cf57b977345eff5df2066e0eb2ae3af57ca3d0fb0f6a475fc36dfc6e5870b3ac5d850e2849fc32c9b16ac3b68d2f815e8c44d1418cf51f860356b8d409f20210cb01c2cc7e109ba76f6c43f2096876d4500012d8ed7dc1c35d24eae1ecf406ce3ec92606623adb8b9e17c3677c1fdef1a54d9442a9d990c0733f03b31633b11fcfa8c9f2b1114f307a811657e33d285093f4653b3ea1eadb28a792c835f975896996bbf029d1f688ad2e0b978888b07c3a12303fed92bf3fc6db29837ddc7c71292abaed99f3a0d7e60b15d9f2cd08d15318d70d35a7b7ff2fddb22d89cf261b8ba64242ba4616a93ddce2015977421d25f1b3825155746bc13f92a6097f7f66e919505af07706008378597af3e70c7fda3e9c99a763aab19ba3f459b12e8c1ae404d5091d802ae0dfd6b3619b97d3d964daf1de600b7446f8a7bfb3f4956a6d1fe967089bebdcc9b4ac7b905 Msg = 5c5ff1160746c63bedd787e27cdd9f581f2286c7aa3d42aaf8ab2e84d221fad21321f33e0acc841520f7fdfbbb8094de62e2aa2821084f392f5f0714ce2fce58732b5b732747a2122dc99cdbe5a34a5ff000f84a951dbfdd635a4d9f1891e94fc2a6b11c245f26195b76ebebc2edcac412a2f896ce239a80dec3878d79ee509d InvalidSignature = 824b73c9a5008b6bfeec6696ce8c3560d2da11f6dde2f8bec7b1d447820171d46f88654b30be09bd7496739c86cc393cf06496c7cc203cdb739a0b7abb5bf82d043bcda57b6a4f2d2c03f813cf01c4e68e2a2ea5a2199ed1798c017749e35cff02d0daf19521ab65234ac7f4a2e904ce4f7c2d559537ec161b6ac5895677ee9a3ad1e89330a02557845601ee76e5c4086d8a25bf49b27d7f23bcef3fa74ff1fe752069245528f9b3e5774591d855477bdd7df7b76258f3c654840ce0c9adfc4e8de5c20cf619e7b7ff6e9d3d4c6503551b38134d47c6a944afb84302db1ac48b54f980819393142c23cc6bd4bd3ab519d42d9bfc9be75df722aa6336d341d9703874e41ae2899248a939b57339d6ae6431513d6aeddb91accbe990491c0c1c06af81167993eee641ca06a1fa6ecedfea2162edef08db09adcc235eabc7f511c8aad8cb0f9f9601e400a258afc1b249b47130474747ec710c26e0528595c968f8076354b0ba5f422d417302d47572cb2394d373c17096edfa8b4ebe2d74a9c8ac Padding = EMSA4(SHA-384) E = 0xdf0ff7 N = 0x9e428342d2e3633965aecb89b0ed65c619c47fadb9a9017fc18c3d1837e5f6b4d0fddbf05bdb00b659bac9645f02c78f05e62d0cf57b977345eff5df2066e0eb2ae3af57ca3d0fb0f6a475fc36dfc6e5870b3ac5d850e2849fc32c9b16ac3b68d2f815e8c44d1418cf51f860356b8d409f20210cb01c2cc7e109ba76f6c43f2096876d4500012d8ed7dc1c35d24eae1ecf406ce3ec92606623adb8b9e17c3677c1fdef1a54d9442a9d990c0733f03b31633b11fcfa8c9f2b1114f307a811657e33d285093f4653b3ea1eadb28a792c835f975896996bbf029d1f688ad2e0b978888b07c3a12303fed92bf3fc6db29837ddc7c71292abaed99f3a0d7e60b15d9f2cd08d15318d70d35a7b7ff2fddb22d89cf261b8ba64242ba4616a93ddce2015977421d25f1b3825155746bc13f92a6097f7f66e919505af07706008378597af3e70c7fda3e9c99a763aab19ba3f459b12e8c1ae404d5091d802ae0dfd6b3619b97d3d964daf1de600b7446f8a7bfb3f4956a6d1fe967089bebdcc9b4ac7b905 Msg = 6a798995eaee88b861274398cff6d0411e6995d5fa4fb92fe2f7d8c57f3bfbd335bdc7b6f971f495625c0147029b2671f6a68befbcd6b77645254b774b36f046e5958e7b593fbf99316583ed916d35b9c73abd9224ad08070a6bb58347e11175a18646adb260cf09f7ca2f522374e361b9ab9586d9db922a5a527eb21a4647a7 InvalidSignature = 62f35bc627d3cc3e8ff8c9405295f967d95abb90ff3bbffb536f4a14d05d6ea88dc092a05a46847baa76837383e9527bb267ed8db2fe4a94d47dfcd8e23eda67f75a4fc9e276dd3006b0cb5ac21ca483a8020b4df3485c5fd6495577d29d32c6d4429b042f3be4675cb56ed5d3178aece1e8c938106e5b8c1111f2265f6204fc7ab87860301a1b15577c605a0be4931048753762d7d4c2cfbf3e873ed63b2ad9669971a32be0c8246b862cd882ebec164adaf79e37b3b07c9ca193887f370573f2fb9dcd9b3c9a0a155d5d622e1196216474fa2a0982dab39e01d6654ee4b36817bf5f0eb0ef0c65b7dbe1dfd6a6524df99895ffbc264b93bdf61502b7e2c9bcd63e7133c611f5ea7e3218d001aeab09d891c045cfdcdcc049e5cefdeabd617af83c96e29a90133d29e4a2e6dffb370bbb64ffee31e3a6bf9225df8fcc0c0ccc7606b3dcfd883c3950c80648049673cc65f0e443edb63b26bda9b554b2996960c7ddeabe849e871199fb54566913a7992f007b54fa8aefc7f95561cc030e80b8 Padding = EMSA4(SHA-384) E = 0xdf0ff7 N = 0x9e428342d2e3633965aecb89b0ed65c619c47fadb9a9017fc18c3d1837e5f6b4d0fddbf05bdb00b659bac9645f02c78f05e62d0cf57b977345eff5df2066e0eb2ae3af57ca3d0fb0f6a475fc36dfc6e5870b3ac5d850e2849fc32c9b16ac3b68d2f815e8c44d1418cf51f860356b8d409f20210cb01c2cc7e109ba76f6c43f2096876d4500012d8ed7dc1c35d24eae1ecf406ce3ec92606623adb8b9e17c3677c1fdef1a54d9442a9d990c0733f03b31633b11fcfa8c9f2b1114f307a811657e33d285093f4653b3ea1eadb28a792c835f975896996bbf029d1f688ad2e0b978888b07c3a12303fed92bf3fc6db29837ddc7c71292abaed99f3a0d7e60b15d9f2cd08d15318d70d35a7b7ff2fddb22d89cf261b8ba64242ba4616a93ddce2015977421d25f1b3825155746bc13f92a6097f7f66e919505af07706008378597af3e70c7fda3e9c99a763aab19ba3f459b12e8c1ae404d5091d802ae0dfd6b3619b97d3d964daf1de600b7446f8a7bfb3f4956a6d1fe967089bebdcc9b4ac7b905 Msg = 1470f2d65fd72258e662671936f46a2af03f6000847eeac83d673afa7e5b78314be1643a0a523c6a8bd6e035478e34fde513c6280320b175328bc190427ad7e4c1d38fb0bef4215dd2a5850f624adb7a1e5e09f7cd1ca6d64d7f17f6d56df7947e2fbd61022598d7c3b89ecc0f8f2648a20672946cdc9293952b8455bf9ea0ea InvalidSignature = 99a58b0398830437da35a7689255de79718f66c91cb07f9dcb33293194f1dacbbba05013e8df993f06654c45462b3723c59c269df07a5ca742fda3236ff32bd98be7cc2e2e7d5c7f88f409b2a0b9ee85bbe33d0e84823fe6ae1b4e38292075d0315959806254773175de32162b66c7c68ae0a4eee7b1e947f20359a83513e3bafc365933d32557551b9d3fba183736201decd6a1e1616f18c6264db3e905f36f98c4818b6fa54051e95feada6c642ea1a3fcfee595a172ea05ab7051001a55958c3a733e69161b441fa1c97ddb07f9d73da7273fda4e4b3a0e5a96c2d0e462348ed05fd5a23a52bc6e08a73e6b7c595db42bf36e2fea5120b605ce1e8503f34b676354f8f861f6185d1aedd915d07f978366da1a7d2e4a220c43babb4d60d2a543f0406fbd205b8c6a759374e8f17c5c49efc0c0a2f327eb0c0c681483af84c88eed6da33e222fc8937ce9026e8533950b684bcfcc7c450ae5cd750a737f718c201d33625a95a4dd37de920ba97af7dedd961d0e8f5b61f9007013ebdad61044 Padding = EMSA4(SHA-512) E = 0x098ffb N = 0xb43d4a446de45aa8f336b93a4c5923f3a5386ef8dd1e94c42300de0880e9bd0828fb32e36e4c50cbf666037a8f2e05f45773896c10aea975b3dbf4c4cdfc24a038c5c06d361baf84c38fc22c03a36b9dce38e090111d9c1323d7a77d3e04b713faf740965a9e1883ee3775489ab514ce480786f9eb741c60ab896a9d6eae3a53ed9268768c21f79e30759e0b01ab7fa224ea8229c293780058f258e9226d7374ac425ef1d2b6e06e5b263df0c6d66c00ed26cbf246a5af0a0163336886ef8d929b37749a08f0ec1db05973a8afc81778b6cc9106f92b1453f1528697b1dc8dd0b255e801060fe179b2d10a9c4c3e13f3c56fa6d55166f6461af4aaf4f4168fd5ea6dadedaa3f9f1de4de993d8844357c0af79a090ecc80570c641545beb42a1248a52de612f2e0f8834496331a7354f7eb91a1943b5cb3b6cf198451735fb554922f04f009a52a15d99369adc2e46b09bb871f4f3ec1905acd792b8c81a3d74b316ff9d20b93f48817ae618677dc9451f582ec9995f44552f4244953cde83f11 Msg = aafe2e086cd97ad052b192e43eb18861ed6e2a27cf6e7d7f16e767020dc8acb6acfd1c7969ef0aa3504bffe75605b07aeb9c2e77ce9f5d832570a7adcd48f197ef7bcedbd4fef3a8fa26ecac67b20d373d0caa9d8fcc8bdc737e9a7e58a5dfc19a00aef6540b1f2776c9bffc17c185df0c46085fb9fceed22798a83f57e75d7b InvalidSignature = 2b6dcd7b7b261f67e950ce9ccafa8675e2cb70f971917d557bfe8fe87f81f4370a04e0b05bcb96e599483c18c3a4ab39dbd1b74098461fcd050139fc8ed16a62ab95c3aba51e23e03ad615990450bbc60bab43c1b8f4b965b0d6ba86b0600cb360acde39b9958e12700ae7a9236efff9ac5f43a44f7ba0110b4ea1dd9993a5b6fc5e748ea2e4085db6fd486061a56925d705f3ab1340149d7133c02075330f9e8ba591b361da737a69c5a5ff7267eedd23c1a5cd450c339dc93f72c6fdba6dba2efd896f1436b8840422c15b932ab9699296596250097aba06f69e6c5a3e4337e9c7a52cc3d80ad07eec1591d5270f32e6cbf633cbc37924c041696c2ee60463087d0d29346e2c3f8eb86021dd8b37b5bc3fa3078afb5105aa6b648fd6b73a3defbd4f35e14276891b5c6f9fa1394b9a0ef14cc1a6227c7bf682bda835f8b6b6d8e9c8ea7c0d5ca3213427f8dd8c91c0096d5c64df2f8e0484bbee604d41b009fe43262083edd5479df5a491034452df9f5111623d87413b50ddbe7c5b0e948f Padding = EMSA4(SHA-512) E = 0x098ffb N = 0xb43d4a446de45aa8f336b93a4c5923f3a5386ef8dd1e94c42300de0880e9bd0828fb32e36e4c50cbf666037a8f2e05f45773896c10aea975b3dbf4c4cdfc24a038c5c06d361baf84c38fc22c03a36b9dce38e090111d9c1323d7a77d3e04b713faf740965a9e1883ee3775489ab514ce480786f9eb741c60ab896a9d6eae3a53ed9268768c21f79e30759e0b01ab7fa224ea8229c293780058f258e9226d7374ac425ef1d2b6e06e5b263df0c6d66c00ed26cbf246a5af0a0163336886ef8d929b37749a08f0ec1db05973a8afc81778b6cc9106f92b1453f1528697b1dc8dd0b255e801060fe179b2d10a9c4c3e13f3c56fa6d55166f6461af4aaf4f4168fd5ea6dadedaa3f9f1de4de993d8844357c0af79a090ecc80570c641545beb42a1248a52de612f2e0f8834496331a7354f7eb91a1943b5cb3b6cf198451735fb554922f04f009a52a15d99369adc2e46b09bb871f4f3ec1905acd792b8c81a3d74b316ff9d20b93f48817ae618677dc9451f582ec9995f44552f4244953cde83f11 Msg = 32aabc83e58c61f89b6812528be8e61b9e9d381526e6fa36cd144bf1cbcb4cb75dab30be72309301a7d70d88758306e9a91ecc0f1583e23a869c9c47f6c7e832027f6fd99e38dd02078a7ca0f99208522396bf2dd8e7b7bb070c74436d1cba4b096ca05cd06ae605a3c988227edf935ff24b38f7d5da1fc238acfe6e9992690c InvalidSignature = 61a6f61268a512a0304fc5bd13cb236d7415793cc35593f0d523296c9d7ecdb8209165757ec37db671cbd2de9ffb35aa24262a8cd7d60f52975ea64162beb6a14b0c6379fd11c246098f01b32fd46cf5f23356fddb33a7ca2690d92c70f5dc87dff321bb0b33b5e3fa7254954d45ec8deab369807683f07c6e03853c3482841aec307e53eb798b23c31f2570cee10340becae99e980d12f5d95298a09e3c4d3e9d557e3811a125aa41e8c9051aa0930441a5ceec751e1d73a37373b15cfd142b65164fb923b05b55f8d643a38648d54186b5c21fb785ab7f899b3615c8a003d4a37651238ff0e4a598661a79739005f7755ffea700a70bae33b0ec8c3b63064aca6ba4ac029e2d7964193f187ea84f964900acb3700e72ae6e40ab2af3886bc5a1b935959e95c338f9948a749c8e2d8abb91deef6b89fb21877b4a84a27402d98718e32ee051655e78533e928ad45f9adaaf3b12d9bf987955cb68ce67ffc7abb8670b80abb91d7e41ed85672fb8ee2aa54cf1e642839c7199b251bc1a887e06 Padding = EMSA4(SHA-512) E = 0x098ffb N = 0xb43d4a446de45aa8f336b93a4c5923f3a5386ef8dd1e94c42300de0880e9bd0828fb32e36e4c50cbf666037a8f2e05f45773896c10aea975b3dbf4c4cdfc24a038c5c06d361baf84c38fc22c03a36b9dce38e090111d9c1323d7a77d3e04b713faf740965a9e1883ee3775489ab514ce480786f9eb741c60ab896a9d6eae3a53ed9268768c21f79e30759e0b01ab7fa224ea8229c293780058f258e9226d7374ac425ef1d2b6e06e5b263df0c6d66c00ed26cbf246a5af0a0163336886ef8d929b37749a08f0ec1db05973a8afc81778b6cc9106f92b1453f1528697b1dc8dd0b255e801060fe179b2d10a9c4c3e13f3c56fa6d55166f6461af4aaf4f4168fd5ea6dadedaa3f9f1de4de993d8844357c0af79a090ecc80570c641545beb42a1248a52de612f2e0f8834496331a7354f7eb91a1943b5cb3b6cf198451735fb554922f04f009a52a15d99369adc2e46b09bb871f4f3ec1905acd792b8c81a3d74b316ff9d20b93f48817ae618677dc9451f582ec9995f44552f4244953cde83f11 Msg = 1a943837eb6a0bfc1f7ff310c143ef836d6c2ddf59eb2bb9941e1c8590478dafdf3d48e73a6178bcc7d40f6c9ce765fa7fd32182efab5dca698e0519e421804c9e3c93261ae482e8697a7821aa3128c8cdc6b5889c6bcf5bfb04205a6e95e6d4ddfbe19d94db6fa88ed9f6d8f30a8214dfabaf9a6513ca95d4e633f1388c056e InvalidSignature = 1f105915ef819f8a2464f76f02f389a2a299dc8a0a5ed7028681a6414e3b75efb80c06d8a64cbd843afa275e49b57b320ea1c65b776db4bb41dce07dd7f4afb653e3e0b814d678c481a83e74e18ec1f6b2933470c98e7e5b12ba594a9412a52393165cc2d570724b9280d20795b0a4eea2025bbb02bee259b842d1f8e315dd94857855b37dfd498c64035de39435a17235d45233e4637b7b6d3fdf295ccfb82133ef2d97d8b1edf12e4ab4ec12950180e80f2f2e43acc2942e34b15bf70515be21004e2f5b4f2e272cafe84cdef2941036a23ee99fb141f6fb70d8c09b461b503632bafe36a9a61ce7a148e4d3e29468c1a47b174c2befdf47b00d2a271699cb723fb0833ca94fae4d1b5c3633f4ab1277f16ff4ebededba2eae21f1b545ae74384d85d0cd5567e3d8e7cd89d03df9834ff544b21dd0b99d9dc35cfdfc9c116903316225e303198f18bcba8b8480a586f452bfa4d57ae7d6768dd72ccb96849805291bf9d03052895cc6367ce97fef83363e8e8e6123b14a9be0698ff42e6222 Padding = EMSA4(SHA-512) E = 0x098ffb N = 0xb43d4a446de45aa8f336b93a4c5923f3a5386ef8dd1e94c42300de0880e9bd0828fb32e36e4c50cbf666037a8f2e05f45773896c10aea975b3dbf4c4cdfc24a038c5c06d361baf84c38fc22c03a36b9dce38e090111d9c1323d7a77d3e04b713faf740965a9e1883ee3775489ab514ce480786f9eb741c60ab896a9d6eae3a53ed9268768c21f79e30759e0b01ab7fa224ea8229c293780058f258e9226d7374ac425ef1d2b6e06e5b263df0c6d66c00ed26cbf246a5af0a0163336886ef8d929b37749a08f0ec1db05973a8afc81778b6cc9106f92b1453f1528697b1dc8dd0b255e801060fe179b2d10a9c4c3e13f3c56fa6d55166f6461af4aaf4f4168fd5ea6dadedaa3f9f1de4de993d8844357c0af79a090ecc80570c641545beb42a1248a52de612f2e0f8834496331a7354f7eb91a1943b5cb3b6cf198451735fb554922f04f009a52a15d99369adc2e46b09bb871f4f3ec1905acd792b8c81a3d74b316ff9d20b93f48817ae618677dc9451f582ec9995f44552f4244953cde83f11 Msg = 0b03b1950e6974afd60ed2ef4d40b3274e825b24c327a4df0a208af79e13ed5ff3ad9354a1386d93c5701bc8a492b14992b7bc04136080b73f52845f6ba451f205167650c0a4cf77f15b07f7396c5ca7657fa29592498b43956125109a4fa4f40ae66270b3d524c523789f6554f43ba78f8216be8a0b4cecd4f676f3723e70cd InvalidSignature = 5cfef1fe1cb83d283a0f55ff2a3005b5c0b6626696de1b2e4033b6fbd69ab4990bd5d696d82b4418d7a996ff4c47dda4031bea00bc24d7cf866295668b340664c0479b9084001ed293cfa845cc4c7f57b0279c47fbc9f8702ae11e1cf6daa9e2c73e80b4fd14987b08ae56d77ab30a1a223d9220b7e1a43d3d2a5bd83833167074756f9513a2b74c6458c5e74c25ca56165a10eccaee5443e1e370c44714c3d9a3bfe653d8222dd633c3128eceead38f36f4141657f5edbd469a5ff0733828e6c4cd35d50c8903ff5d70136a83e7186135069d962ebafc9d0280553ac62d221e116f77734e20914536dc5e367d8d3188f3f4e45d80970c606461321a4136ea0365324d989a1beb81600afe219cd18429a0931e15475e6d35e04b1dfa2aa605fd3dd98345f57109528d45d60239e50442889fb8fbdc3c61c9c6c40ea0e531ea1e09a20216ea87d4c5d7f16669b46be9665308532328e62d2c50028c0ebba52b14d66a4bd0849a5413a0a7fbd770015ec0e38215898c1662a0d1a5eddfafe67c0e Padding = EMSA4(SHA-512) E = 0x49be93 N = 0xb43d4a446de45aa8f336b93a4c5923f3a5386ef8dd1e94c42300de0880e9bd0828fb32e36e4c50cbf666037a8f2e05f45773896c10aea975b3dbf4c4cdfc24a038c5c06d361baf84c38fc22c03a36b9dce38e090111d9c1323d7a77d3e04b713faf740965a9e1883ee3775489ab514ce480786f9eb741c60ab896a9d6eae3a53ed9268768c21f79e30759e0b01ab7fa224ea8229c293780058f258e9226d7374ac425ef1d2b6e06e5b263df0c6d66c00ed26cbf246a5af0a0163336886ef8d929b37749a08f0ec1db05973a8afc81778b6cc9106f92b1453f1528697b1dc8dd0b255e801060fe179b2d10a9c4c3e13f3c56fa6d55166f6461af4aaf4f4168fd5ea6dadedaa3f9f1de4de993d8844357c0af79a090ecc80570c641545beb42a1248a52de612f2e0f8834496331a7354f7eb91a1943b5cb3b6cf198451735fb554922f04f009a52a15d99369adc2e46b09bb871f4f3ec1905acd792b8c81a3d74b316ff9d20b93f48817ae618677dc9451f582ec9995f44552f4244953cde83f11 Msg = cfecd702ac5ea7606bd75b26b2746b7b5db330e92085a40e6ea56a949a270e633d548d14d7b518a9b96e157c22ce6776a823ef81d9d3524023a8fdfdf16c67e317b6966d7003e51ec5080473f147401643e1055424aba1d1fa834a7a4ce563bc26b9fbf3bf6f9726594e31f1690980c2f8947a4949351829bcde59f4f2ba8956 InvalidSignature = 1b94c923251a32c3cfe4dbfbc78e577aa9953d6f47e38a8d3e844a985d60eabd69696f968d5a9f476baf15b2d1b1febc95a2dd133a870b14d67a3cae49b3d473afc3ace7f0b2884da88494c426b9adcd1b40d5efc409622788faec52a6825a1325e922bde9d1be6de33e1ac05ad9ac5d222980696226fbbe191581b030a82219c951c25114ea4412b53aa411a107927c03084b986ecacc7c2f36df1817228060737c58bfc3823f7d16630949b186c195cc34f1bc829dcafdc6c735affc008412b96e9f279474e515fbfc598886fbf622e5367235c4617daca77f2cd1d5644ce32cd2a7104501391685ad7cd82e0d21bf085f58dd3cb1d11005f2adb0e9f962b65526cb39fe1f34acc2d1932bea55bded8690826c8fe817511a850e7aa8fedb9b1a83cb2b05b58b302c0b9feadf2621c1412c789d2ca5dec04d028797781843c19c4b8e7ecfaf14dd46fe4c4375a9138fb058e47bcfdcf18c563a0d54170283c8bb2f0ed2b801e28afebebcce9e1f9b707bd1fd67a534db9d9ac61087415d2b1d Padding = EMSA4(SHA-1) E = 0x6a996b N = 0x9004e5334381fb90f60926f3281e51d363671c87bc10554aff5f3b4391d894a94866de27900bf627d468dcf19a826dc399c0580883c945688f3795522193b0887f5eb29bb7be2b6ab48abb2e86b8a3cc6dbd2aa3522c0fa6f6493679a25b1933de78282b00fb5e6dbc58246a26805eb61cbacf492ffee3a21b829e3b776dc814b0e1527565f713d8f761fd58b9ca1f20b79d798f627b77a1ed7d53dd17f429a738e3e4e86cc4da308c60e55b77f2d180e96f2da0ae282831d5ab523cbf2aac900f6c304366738710152efa1094232dba6d405381223f3c687dedd2d856caab657ad0a1d7a67f01fffe6903f173faf1476b8ca656d4d9af713b4f80860be5e79ac3bf1b507f46a19bb67a90b273a0f0d416c479c8d75c6c99943ce774928fddedc00c06d7acc68ea15828de379ef436ecceec8bb22ea984eb1af01dc3efbaefd031030abff09bc464235f407c8a9033796d87bb6373ba6eb6ee143a79703a8130b8e29bcad3970c69001d80b4dac9e30fc616ad9bcc215fc20109aa7788234099 Msg = cde63c4c124da95b23a8323a5db03714557615226da75815a50f2cb4b45d15c65826e032ea2cda6535df3ff48824f5820a567ae54e8a1c8427186803be57e423e1a701e39eb54bec11fae32b7a852fc092fbd01720dcd454c7072df5228162b2137285a8577065b75e0004295a5a4c94976dfd010a23ea4d2ce665d00963f83d InvalidSignature = 6ea308d95a963e1fd18edbd6829400071e0f144571219f6909024064b28f72a8c0d6969bdfb705ce06b36c0a9d65a5c9331cc146d5f2c2eb96226c5a09957a945461a74aa20e966334741f4244311e2ac70f0329cc622864cdf614631c1e2e545564a682ff11dae5f8dfc3fc1428a2f028ab3f957cf970cd22e1f16e8e42f5ba879bc5c26c37aab6fe2b3f5b9f842c158515611c41e25bdb2e20962d794ebe1d626a4d36c07b63354ff9c333bba44129fa3210d0a0e10453efa17e053ca12513e0803c206a90edabe604f633a1d722363a2dbfa9b6b8862f5e2f40cf57f5c668af65fb7292c58c6750a6630159259c26a8ead1e4ac6dfffd96234978f15b9c9d80fe21b6ce9aa1a85a7f84f1954044bc13b42e181a323f2f9a4e1d7272c8731d14651d5302ecad25d7f1231b3f686690e69c3883614d8b85b6568b788d874ed737aaee11a11d7f9a8c67479662c77308318fe8bd5ceaf447f9592396ec3261f2b91ee25b54dffc269a9e7f965dc00d586da77d1a40469e68b0ef5d4f660c935f Padding = EMSA4(SHA-1) E = 0x6a996b N = 0x9004e5334381fb90f60926f3281e51d363671c87bc10554aff5f3b4391d894a94866de27900bf627d468dcf19a826dc399c0580883c945688f3795522193b0887f5eb29bb7be2b6ab48abb2e86b8a3cc6dbd2aa3522c0fa6f6493679a25b1933de78282b00fb5e6dbc58246a26805eb61cbacf492ffee3a21b829e3b776dc814b0e1527565f713d8f761fd58b9ca1f20b79d798f627b77a1ed7d53dd17f429a738e3e4e86cc4da308c60e55b77f2d180e96f2da0ae282831d5ab523cbf2aac900f6c304366738710152efa1094232dba6d405381223f3c687dedd2d856caab657ad0a1d7a67f01fffe6903f173faf1476b8ca656d4d9af713b4f80860be5e79ac3bf1b507f46a19bb67a90b273a0f0d416c479c8d75c6c99943ce774928fddedc00c06d7acc68ea15828de379ef436ecceec8bb22ea984eb1af01dc3efbaefd031030abff09bc464235f407c8a9033796d87bb6373ba6eb6ee143a79703a8130b8e29bcad3970c69001d80b4dac9e30fc616ad9bcc215fc20109aa7788234099 Msg = f676f3723e70cdcbc7609cc1f2f3e4216feaf83d52d6b2d7691f6741cd4b1ac3b87df03d963ce40d5f76bc3323c53cb3e7f0993bafb53106dcc67800b811362b5044f0418291a39b56afb951922135a388ba319833618ae48212da0ff425a6d465d3d9c828f6713c55107963648f37b8fb4fa69a05612739040b73b6a80fd486 InvalidSignature = 6a2a7ff14c4028a67401ae18a6e3450913afd048f363607be81edf187790a4aaa57eeff802050bcdd6c4bfb921df1a24d62763e1aee6f8878bfbc70c26eb9f270bc898753f5583d5c5b40ac32e7c4de0ffb073c076d5e750b2c0b0754a7491bea420a329ae68f5c5190c74a75b7db61c84f2e017deb4ea5d9452679a54b5b7db1ff66c7d7a929cc3d78357ca68e39d75f1e92d32cad5bc11080b054044ed5fc351afa53b294165510cca83dbd91843297d9249ccfa692b82d75345823086d9234f5e2e0dfcc6fa194868c04050e6e80425a71529ad672c6e3b32f6fd606cd84ead5de2512cd09891cac69def77d09cddd0e2a6383d1b60ae831c05be4ee5836e1810f60ad16bdc253fe39e1fe10205ab6dbccd2971d7c2807411742358d7162d95dcbca5a8924213113197424260ac81cd999ef505de9ac531ce803026c9e9805ac84e0d6c94f51f79ea750ab29b384059843b22aab802443df06bfa1adcb6aafa5fa267a7bc230bb26de37973d6d5cbae0b7a258ac96cbaab35de8d418dd7f5 Padding = EMSA4(SHA-1) E = 0xe22ca1 N = 0x9004e5334381fb90f60926f3281e51d363671c87bc10554aff5f3b4391d894a94866de27900bf627d468dcf19a826dc399c0580883c945688f3795522193b0887f5eb29bb7be2b6ab48abb2e86b8a3cc6dbd2aa3522c0fa6f6493679a25b1933de78282b00fb5e6dbc58246a26805eb61cbacf492ffee3a21b829e3b776dc814b0e1527565f713d8f761fd58b9ca1f20b79d798f627b77a1ed7d53dd17f429a738e3e4e86cc4da308c60e55b77f2d180e96f2da0ae282831d5ab523cbf2aac900f6c304366738710152efa1094232dba6d405381223f3c687dedd2d856caab657ad0a1d7a67f01fffe6903f173faf1476b8ca656d4d9af713b4f80860be5e79ac3bf1b507f46a19bb67a90b273a0f0d416c479c8d75c6c99943ce774928fddedc00c06d7acc68ea15828de379ef436ecceec8bb22ea984eb1af01dc3efbaefd031030abff09bc464235f407c8a9033796d87bb6373ba6eb6ee143a79703a8130b8e29bcad3970c69001d80b4dac9e30fc616ad9bcc215fc20109aa7788234099 Msg = 51ec15201bc61b8d9553c9cd3e64b3ee762865243508afc9fccf40a20c0e7664d7bf7576b42877f9d60263067fdba03671b92b68a600e7be409535e9c344c5a7825fac8957a8b6fa9771fd7d4502ba36863b5cac557bd7cd78c03f33b30f95a53b16e1e16d108098c0e9c0bbf9a2aaf59ef81f79ac4027fd8c96850644368f67 InvalidSignature = 71721988738850d97a12fa89245a87cf3b032da83b7561c60e55473c5dd8a8d3085de931afcee9a401f46d227370b31dceca0231d4b13aaf293f0f2bfd742a996b655b7e363110c57bebe9b86ee9f460afc2988940cfd56c3e4b30c6dc990089e525b77fbb633bb89d38aae143eb6dc6e3388b01f7ccf51637f0955cc3808fa8a9a61290a82c5f163c4b10fbd1abef65f85e8fe8184ca9b0bee0ce173a6af19865ca32a2a9a0d7cedcd4989b32c5472e57d025ec5106bda37fbd2d7b69c0528ebd8120bc9d3dfc08018cb0107cab8bb70a277e58c9ccc7a5f6c92fe791d68384f3fc5ea315e37c02fa83c019b59060bf0fb2d033b8f5d3a7e2549f5aea22d8cb323bcd4f0c3d9a9d5c1ea256241a22c3311358fdf04f23c1313335159ed156bbcce4671bde5e78e1e6ff11339bc64d699ef36826940064db7580df64448764e84dea828d0757d533d62617f5db658810a092fc2ed35b9e08d45f85e6720f58f290442ecd44ebd0aef1db6bd1c76fd81e674b1f9226ab143b765618fb243bdfd4 Padding = EMSA4(SHA-1) E = 0x6a996b N = 0x9004e5334381fb90f60926f3281e51d363671c87bc10554aff5f3b4391d894a94866de27900bf627d468dcf19a826dc399c0580883c945688f3795522193b0887f5eb29bb7be2b6ab48abb2e86b8a3cc6dbd2aa3522c0fa6f6493679a25b1933de78282b00fb5e6dbc58246a26805eb61cbacf492ffee3a21b829e3b776dc814b0e1527565f713d8f761fd58b9ca1f20b79d798f627b77a1ed7d53dd17f429a738e3e4e86cc4da308c60e55b77f2d180e96f2da0ae282831d5ab523cbf2aac900f6c304366738710152efa1094232dba6d405381223f3c687dedd2d856caab657ad0a1d7a67f01fffe6903f173faf1476b8ca656d4d9af713b4f80860be5e79ac3bf1b507f46a19bb67a90b273a0f0d416c479c8d75c6c99943ce774928fddedc00c06d7acc68ea15828de379ef436ecceec8bb22ea984eb1af01dc3efbaefd031030abff09bc464235f407c8a9033796d87bb6373ba6eb6ee143a79703a8130b8e29bcad3970c69001d80b4dac9e30fc616ad9bcc215fc20109aa7788234099 Msg = 2f7ab138cf776750162edc63c3b5dbe311ab9fee2ed4e51aee034572c13dc1bce31b9ffed2707440052c8292db804351d24346a7f9953a51a8c249a56e69a7d34bdd6a6b1fcb9c1f631d8ecb171f70b2fbe01f0a02dc3ebc04d78865b30c64a0d087ba879fd0067798c9ab145fd9898df64ad12232f018e36b0cabba786f23ab InvalidSignature = 765c62cd7e50bbbc4d7731e53fb468df256b53bf41a49c8950339f25a4a8ce8a6b31672e1ee72da84195fc3c679ce107dfc76dbe858ec2671d7a54f23d2e57aeca984c4973f79358dd445ac0575624b6252bf48ed74f7081cb29e2da05aca46749d4977173be27331cef847dc7ec7748eaa0a903643f45f69a61602112c412a46c2541dbce865cb30e87a4002de44aa9cef0b06b9a1220ddcf3cbec46fabb0216920d787c0ebaeb6823f11180de58e6cbb4b432391af394b5936e6132530dda9f13a5d8914b2f4c097b01046a60311371c678e6a04b0fc2eb03227686f67503dcded15873d57e9e8008d07fbf4bab4273f61bdfd93181e3b0c37ebe146226ba1730a731a01eda193eca6ae77c9085d74195a3e8b8036dcce07250d99d60a1c6a6f3c02abcc902e26f37bdc979f82312131d0d00264f798ad09e7dceb29e0994d527e15442b877656621427757f507799453559037804ad147ccea6fceb522c6ddbe8d90b0d45c80cb5e155068daf7043c6b37e7e17c49a22f7ea0421c8062a81 Padding = EMSA4(SHA-1) E = 0x6a996b N = 0x9004e5334381fb90f60926f3281e51d363671c87bc10554aff5f3b4391d894a94866de27900bf627d468dcf19a826dc399c0580883c945688f3795522193b0887f5eb29bb7be2b6ab48abb2e86b8a3cc6dbd2aa3522c0fa6f6493679a25b1933de78282b00fb5e6dbc58246a26805eb61cbacf492ffee3a21b829e3b776dc814b0e1527565f713d8f761fd58b9ca1f20b79d798f627b77a1ed7d53dd17f429a738e3e4e86cc4da308c60e55b77f2d180e96f2da0ae282831d5ab523cbf2aac900f6c304366738710152efa1094232dba6d405381223f3c687dedd2d856caab657ad0a1d7a67f01fffe6903f173faf1476b8ca656d4d9af713b4f80860be5e79ac3bf1b507f46a19bb67a90b273a0f0d416c479c8d75c6c99943ce774928fddedc00c06d7acc68ea15828de379ef436ecceec8bb22ea984eb1af01dc3efbaefd031030abff09bc464235f407c8a9033796d87bb6373ba6eb6ee143a79703a8130b8e29bcad3970c69001d80b4dac9e30fc616ad9bcc215fc20109aa7788234099 Msg = eff93ee57b47accf61e80d26313a106abbdbb1397577bcc221de8c7da95a191a4e3f32b701c306551110e98d0798557fcfa92f0c18414c45fc233422e42a2678a6de5c25f1458f8debfcbe4b18852c207ee3a82f0764106d26bf1853bd5e48d63ffd44981274506037d113c82caa9b3511b2a20c0b891023e6d9c176fe9e871c InvalidSignature = 78f7ca725ce380711afccd67be0156c7e5aa8b8f981c802ef0456000b749c0e10e8a87a99b0abad80425b5a142bfed87bd8672701808435e8f06e28b3547a943fafe99d13fd543d56876ed0857f85ba1c939fd98e90f4b8ad864d4aa47fa4c509f73ccec5f7461e049ac06ee8d52cb64b2b1fa941801648f2ddd5a371202ee74b5b0f95313eef842701dddcf83c2a6114675ca1eecdf564a6e5a3c44c34cfbb34d1683859259d42e94c133543fc84aa4a8a3b0b98ae355314bb774d7ba6cc5bd24faaea141276e8331a68f0b4a6a5e5ccb50d78028bd9dcfeee34dc7134f7ee2f94f3be443c0dc6156bdf5225cb489e7e70acc37f35e09668649b5942a683dab9e6215ff075ccd6c3f0be3a43aca525843477a20289b03e5f4f17e12af80158191eff3e1b7f4bfabcd8d681db7050153a9beb739ffb48cd977fac9d4ed74b0c85bc5b446b3b7c5824f84e58a8e41cde59e0ed3642607a897e600742f3727deab18f6d051c0e4c092b6667b247dcc78e1a00bd12f8d9e47fbbaa9edf6911e7d94 Padding = EMSA4(SHA-224) E = 0x026a07 N = 0xa5ca328ec852ed50cd50ff2e2aa25a99905b8d8dcc6aa2f2ae651da27e21e60dcec641be2f850f603dd15c763b1f7868dfe49392cbf0ed1410b151c501a627994efcae1a332ccf0d37b966a99f4d6b72659cd9044a72b97ac3e00e1b752bca194066c60dbb870e8205b0078551a41bc7a36424dcebeb26e55618f9b27c630a7c0f5bd23f5175621867e100f63d8c07d9392c5638576b66bb4bc89682c66ecef97f378595ecf10406fcb75450bdd7ff558d9eb2e76ad4fb7c92fe5a946cc95bd14f81f7fb7e6ba15fcd5c73b5ff41588a5c8acf1ed1dcae4dde453411ec26fe8faa3640dff3e153ba39c766c9f99c05a023bf45a19b30889d710c3fb528fbc147fea1699bc38d3e41d11bb1faab7d9e850f0c2b0893b5fe3a2039e6d8d90f280faed4d7fd34dd2a886b7a0bf8889bd75976d4ce412b7301e88eaa8e1e9bac6d0a351e7c8391b744035f2dc1b8cbde6f99484770b81828d6e1fab40a7e0d69ed798de7c2f80ac750c8243af4b2d4986223d9a33a34dd2d6c36b624545f6411d3a7 Msg = ed55f2cd9db6bbe81dfcd809973b5c0262f804a9cce01d2d17baa1aac19aa4fa0957eecfae40eafefa0bbf1eff0ebc5221b2f963d4243b12a74d19ac82055dde2b83adcb0f186b5c401ed9d7ba2b81b4ea8ad4ac71eb111225596866586d60285ec176ea49a806a9f71c6f5d4ff873cfc768dcab299d65d698c5d701ce3a737f InvalidSignature = 1ba90dc10ff5825cd6042dbfbfd6bc48ed77e1a7e2e6ef0a002484e21a38ae123111dca0b9e34f6d8fd547ee0da1d44f18b84edb71923d07e67ddb8ad0aa44336551248db0200310016a81372d5906295342a84d9747123bc7eefe47a8543b849b13bffb9c9a292aa5ae809f09ce36867e584aaf8b32524dff72db7849d1ef7b22efc1475e67ea6606c8e0f4c96f7acc8a745a47a13c0030eb23a68b664c12387a3ab8e438545009dd2824f1c1494e064e5d400fa4d81ad3e024e4491e7521b410cdbbc6955d3ca11b928a68da56ab7346beabf14b2663b45d62903a046d3ca1707c33014da7e757ca5aed8fe94f7aed8c586ffffd5287c8d63b6cfa0b41f5cd1c66b0c56bbc293463933fe3ee5097876cb4e34f23008a3647f446046f1b75e4caff3a3172a58429562c0e51571aff92b927c38585ce81be9d41395ddabbb6be7f17ee8903a6d824dcc3cccab72a9c3af12d5e7185eeefeb01a1513fc9996504f6857723eef630a1d993ae22ae308a955bc01045631f26308014d8daf1e0cc32 Padding = EMSA4(SHA-224) E = 0xe324c1 N = 0xa5ca328ec852ed50cd50ff2e2aa25a99905b8d8dcc6aa2f2ae651da27e21e60dcec641be2f850f603dd15c763b1f7868dfe49392cbf0ed1410b151c501a627994efcae1a332ccf0d37b966a99f4d6b72659cd9044a72b97ac3e00e1b752bca194066c60dbb870e8205b0078551a41bc7a36424dcebeb26e55618f9b27c630a7c0f5bd23f5175621867e100f63d8c07d9392c5638576b66bb4bc89682c66ecef97f378595ecf10406fcb75450bdd7ff558d9eb2e76ad4fb7c92fe5a946cc95bd14f81f7fb7e6ba15fcd5c73b5ff41588a5c8acf1ed1dcae4dde453411ec26fe8faa3640dff3e153ba39c766c9f99c05a023bf45a19b30889d710c3fb528fbc147fea1699bc38d3e41d11bb1faab7d9e850f0c2b0893b5fe3a2039e6d8d90f280faed4d7fd34dd2a886b7a0bf8889bd75976d4ce412b7301e88eaa8e1e9bac6d0a351e7c8391b744035f2dc1b8cbde6f99484770b81828d6e1fab40a7e0d69ed798de7c2f80ac750c8243af4b2d4986223d9a33a34dd2d6c36b624545f6411d3a7 Msg = 7046b5c4ed235e49275f2c98490a3e6bfbb72a0b2b30e4ae0d68e20460b17d0df42f9b2d698d8b8239ee3075f927628fdb2b918f78c6abb9cc8f40708218e5077267d6d569aadf8728267cbaaf713fcabbe172e48d44fe63edd18b596f5fe96bf5d5aee375e22100fcee5790f3509cc1a2c11535f210a354771809e6adf052e1 InvalidSignature = 9f26df018bd94829168a13fe22ad206da944831f09c2dd828d3677a1b4c436400687499a710eb2aee5a4823ee0d1acded86de2ecf51d2b32408b7a0cd8811ffdfbc044139569527befbf52b244e919e4a2a22d2405576b72b4d2b44731a57ae4d34d618194193e1de8b72d141c7805b46e9b46d404462f50df48279302e47b090efe543039071aa8f7b3a5a62eafa8f98ed681cb0f11b018e2b5d6bb1a634ae242269b6dac07f1d1db4e8216a2ee91aeba2c13501fc3fcc02e6dda680506efe6cfed1b5c6efbe096f25d1c98725435004854aaf75fe0ce9138b5ac5027f36dcf8220c6868a74b7d89ff26193e00fbeb581f0173fa5578ea7884520b33767f5b060b823843e715050fb569e0630e183cbb8ecc404b02e33ee48f552eca84a2c0160fd6ec008dcdd7ac0ece42bd3fd3287069e195122662f09616a1245d331edef4c11cf2f9c2231ac079e6604b3ea2893ea1f511cb2e1f2d790fd009a18251bee4edb52393592f590edff2c8d315d20286d99d82520c34378d7f46f34fb20d2a5 Padding = EMSA4(SHA-224) E = 0x026a07 N = 0xa5ca328ec852ed50cd50ff2e2aa25a99905b8d8dcc6aa2f2ae651da27e21e60dcec641be2f850f603dd15c763b1f7868dfe49392cbf0ed1410b151c501a627994efcae1a332ccf0d37b966a99f4d6b72659cd9044a72b97ac3e00e1b752bca194066c60dbb870e8205b0078551a41bc7a36424dcebeb26e55618f9b27c630a7c0f5bd23f5175621867e100f63d8c07d9392c5638576b66bb4bc89682c66ecef97f378595ecf10406fcb75450bdd7ff558d9eb2e76ad4fb7c92fe5a946cc95bd14f81f7fb7e6ba15fcd5c73b5ff41588a5c8acf1ed1dcae4dde453411ec26fe8faa3640dff3e153ba39c766c9f99c05a023bf45a19b30889d710c3fb528fbc147fea1699bc38d3e41d11bb1faab7d9e850f0c2b0893b5fe3a2039e6d8d90f280faed4d7fd34dd2a886b7a0bf8889bd75976d4ce412b7301e88eaa8e1e9bac6d0a351e7c8391b744035f2dc1b8cbde6f99484770b81828d6e1fab40a7e0d69ed798de7c2f80ac750c8243af4b2d4986223d9a33a34dd2d6c36b624545f6411d3a7 Msg = 2dd8a30ce4d971718b9c3a1fa33512f0677cc1959abdb2e682b10c7735ad1e6c131a008e9425779e44b71ae90ba8b31cb230e85aa39e1b8cf04c8ef897d2cb16057a439ed8f435e6e94bd16b8a189ead0cf6194185359f21cfd38c46d4a7a57909e0b36639ae71f2843fa8cea7ed994c7eb69b72c7ec054e282d4e887496733e InvalidSignature = 9aa4039c0c5a617c1ba2d6f71362ca1ee76f6605ded0b51e881a5eb800297b4d74de776851355cb744e3f7976b379b54a56f5cf705b9e080924acf12d74e064e3a4571432096c63b9be3301cc2c8d91591dbdde6457ec79aab96b9a9132f7feea63fb5bcfa192bd126a0ed82b0f3779c17a5769733bd06185950f3adc8bb62981c33c81e40a6fc5c87a2733a938054b0db4fa79b63b822c0b69cdf53676bebdaa8889b181b0760b7cb11c8c1c89095f8fd76c4ee02f5d0a4143895431de8b538efc6160e0f3ef8d3f2e1fdc7cc72a568934905c2ca598e36482113b8592849dc21943f5b3025091a22bbd3b8ebdf2e966bdcea2350bc2ea59413abebb6b2cc332f3dbef652cd90e85f860d843f2459c431dece9c432ea5b6d7f361eb851ad5b03667c7134f9cdf27f575f4b093693f35ea7f2d7491a597302e2347c182dd0b07401175bcd625dc66449ebc201441fc132d1a5d5eab92ebb759f9931c28039434ca7cf249c9c7994aeac06c55111a73a8d2d27912ce9219142ff1daac82431a3c Padding = EMSA4(SHA-224) E = 0x026a07 N = 0xa5ca328ec852ed50cd50ff2e2aa25a99905b8d8dcc6aa2f2ae651da27e21e60dcec641be2f850f603dd15c763b1f7868dfe49392cbf0ed1410b151c501a627994efcae1a332ccf0d37b966a99f4d6b72659cd9044a72b97ac3e00e1b752bca194066c60dbb870e8205b0078551a41bc7a36424dcebeb26e55618f9b27c630a7c0f5bd23f5175621867e100f63d8c07d9392c5638576b66bb4bc89682c66ecef97f378595ecf10406fcb75450bdd7ff558d9eb2e76ad4fb7c92fe5a946cc95bd14f81f7fb7e6ba15fcd5c73b5ff41588a5c8acf1ed1dcae4dde453411ec26fe8faa3640dff3e153ba39c766c9f99c05a023bf45a19b30889d710c3fb528fbc147fea1699bc38d3e41d11bb1faab7d9e850f0c2b0893b5fe3a2039e6d8d90f280faed4d7fd34dd2a886b7a0bf8889bd75976d4ce412b7301e88eaa8e1e9bac6d0a351e7c8391b744035f2dc1b8cbde6f99484770b81828d6e1fab40a7e0d69ed798de7c2f80ac750c8243af4b2d4986223d9a33a34dd2d6c36b624545f6411d3a7 Msg = 5707c0d7c2a388eb7bd51616c0f33a7197f4dcd9b7cbf7e8a5f4e6231d4cdf75b325bdddba9a026365201c502c5ee79e713f74ae6445093924206889277f54e9db26525a8d40ad878bf7bcfb8543679239ffe82d5042cfaa82ec4914017fa116153107b6033f914034837f7f9349c333375fc1c0426b53240981102b75f5cee6 InvalidSignature = 01cdf5e7f2702e03c7b98e8fde047b8a7df698ce37a51e3931b6b8caac44278d216326644d28cec12a63b8e58359856317a6a5c7ddbf32fa264feddda83540979d68dc4ea92d75dfeb073f0550712979030a23de1c39e28f4abf7064cb0ee1ea19f1c1694747a53de50caee9f346c24089389f6c37519c7509fe4922fe510b31399dec4e079c0808dd4bde6e713d2e58a6b54dd11b6ed8796dc793265f1edab0a2e5dede076ce9a93e112ba3e2e761c8d530871f14fd17a5fb582946fc40e951b2f35651cc9bfaf8a46d82d7e025a4f1f86b9805c9a23178539885288c873e102c4cf500c612db01f6e6a6b9c7239a0f0ddb6f4700fa526336a8e2a1851c08291bbed4e01ff0bf5e9d3278bfa88a21e8f78b360d31ecfa3fef98a61aeede752e93bdfacfb5e7a82c3e25759a9921b96f94cee537e127bbae2dcc4ae6a8cc93416160f59a3582cfb94d914d42ff8c68be2c91c5fdca7946130821df910b64862fcd14fe72fe31d35b0504eb387915cdb19d64a7c330c1811950a1cad3977f9ea8 Padding = EMSA4(SHA-224) E = 0x026a07 N = 0xa5ca328ec852ed50cd50ff2e2aa25a99905b8d8dcc6aa2f2ae651da27e21e60dcec641be2f850f603dd15c763b1f7868dfe49392cbf0ed1410b151c501a627994efcae1a332ccf0d37b966a99f4d6b72659cd9044a72b97ac3e00e1b752bca194066c60dbb870e8205b0078551a41bc7a36424dcebeb26e55618f9b27c630a7c0f5bd23f5175621867e100f63d8c07d9392c5638576b66bb4bc89682c66ecef97f378595ecf10406fcb75450bdd7ff558d9eb2e76ad4fb7c92fe5a946cc95bd14f81f7fb7e6ba15fcd5c73b5ff41588a5c8acf1ed1dcae4dde453411ec26fe8faa3640dff3e153ba39c766c9f99c05a023bf45a19b30889d710c3fb528fbc147fea1699bc38d3e41d11bb1faab7d9e850f0c2b0893b5fe3a2039e6d8d90f280faed4d7fd34dd2a886b7a0bf8889bd75976d4ce412b7301e88eaa8e1e9bac6d0a351e7c8391b744035f2dc1b8cbde6f99484770b81828d6e1fab40a7e0d69ed798de7c2f80ac750c8243af4b2d4986223d9a33a34dd2d6c36b624545f6411d3a7 Msg = dbf8391b3592af32c893b92301064edea2ef6c38b976ad33d3481a806d3b4342ab3190154d3ed24fde0d1d862e7fda52039618530c92237616595875821c379df738bad4545ae5dae9e79fcfe69bc0f613706bb8c2c19eec03af075516c41a6c26d66060342e125c51eae60810a029523b440e6ec54c461b0011d02910791338 InvalidSignature = 24488702f736a23bbddc56d6472b083d92a76be7e51ff787153f3cddd8d0ba1b7ba56685f678a159f8e63dc611ad4fd1ed9d86e597672f6a11c5cda9f55f027053f1596448da8233d2a19b0a4de8d179403b9773517c0a26dcf00637a90f0832cd3918d35fe8e1293176dac33f6a0a562adfafcc97d7cdf862d338599d8bf94fcccc58b0aeb6542e9d6c65d2909e5b258f32f17231a274f53024751b871cce290a976ed98cc394a5cc5b5b6f5c6bf0ae9a21e2be3d1d12f30a295d84cd8a686fcf61883037ceb0007d1a443eba92f6105d1b282c326a3cee65c45b5fc53dd13909dfa97ddb46f8c6889c03776deb2f0220e5f2e86b6407dc1935352a13086e1301d2a9e015cf3ded7360bfd5b0eb29367c69f1fd2226c5cc869cd03e08a689396f1cdc332a4e4b150c700a9795d32e356391f2696d4f8f3ebd6c817a3920f243c4eacd373c6acaeb9ebeeddb06457ba31ac3ee06cc681041fd0354edf9098b2aba6d9e766b15383b274a88f2ad864c7bc15c912fbccb81ae90411c07e2571cca Padding = EMSA4(SHA-256) E = 0x2cc92f N = 0xcd6141e4c8dc6997fc65300a6e2c746f391022f15661231a832be966aa498e678777766944db54a599cd6ddbdaf7533f429e6e1197b7eb061913f50b09be04ab70b1b702fce9ada279ea8089677a37701e64190f243dfabe7cc254f08a6143c9c589ac4a90881c0d2b62e98013e92d049ee9ca11a425ad450ec5a699ae17672d86efde3fbc81203f2b500ef41746b9e9af2642b30cbf75e7889e500836d6dd32bcc5d8b69021b764a591d6850776cddf0b7240c75dda9e2d197f2cd9c6787b16445b55eaeccdfdd17fb72d7fe5189aa1a2a6ad06b4f2bfc8f6c91c3a2a80a83a3113e0b420b70654d6a5075d38d9a12d1e0fddd2cb23b7f3ef949991bf49048dc40020dcf042caf00883363591dd6a90789ac212a0ced95fb40bcadaac2c97ee7ff302c37cf2aa7298311db85a2d4d1b9f037023c21bf2e9b9abecc780a70cf2a54002634272d7dcf25ee4c7dbb04437f30f50bdcf4962d432484a5dab7b60b31d8025b984c821fadbf2b623f2f92a6531dce11a1f252e603016078f3986e081 Msg = 9fe9f933b93d5c2ab2f681086efb04090c809727697da534e65f35266cfd10b2adcd261cac582e4d7feb8d2653907914b23c5ee4014a80d94d28e3fc475168b48c7b38962a11657e60e3cfdfa61d4557ed75ed8728a9e6210b292b421310bb03c659f74b3c504be7de4610dc6e89b1fb48940db7e7821d34aac9d7a0d82452c6 InvalidSignature = 4311cc3ccb4a2215d64184a22d0910e2f32931be4e1751b85746c5eb69c2a388d6cfe8f0f7d492085e2debbcdcad65ed588103df67099d5c9aa6c7940e777f9141f6d00f2c30c749228656cc473dc26c3bcbae8b46b9752a29cd0de51023e442752dc6493981089ec6a000bb53ccfc7f48eb320302aeb13ec9ca31446a3991cf78406a6d7d3591d8bcbb643480084e663edda49cb7549d42108383a813ef4709135dc9be769d8573ba947382d63e817c4ca51d6672b1a061ccfb1362723b35d18eaf713c86c9b8fc38485864bedf5d4376575025b046a803280c20fcb2e243b39c5ddd52c2961dd7dccbad7d0daec3575ec564ef268b9d0b5f4fd1decef2ad8f22af11169b471b602ecfa961d5f59df6103bb73c75557b93019dd0ad4ab1ce9c1ba466e01aeaa5beca934a4ba25f5dd3290b211855ae55e730245534889bff626bf53cddc2e8163f117c4d2309db4771f06fd326af015cd46036b457ef1da7b6064497e322644897966bbb99f98e04a91a7240f12559ac4446a1445f1e378b21 Padding = EMSA4(SHA-256) E = 0xe6f03f N = 0xcd6141e4c8dc6997fc65300a6e2c746f391022f15661231a832be966aa498e678777766944db54a599cd6ddbdaf7533f429e6e1197b7eb061913f50b09be04ab70b1b702fce9ada279ea8089677a37701e64190f243dfabe7cc254f08a6143c9c589ac4a90881c0d2b62e98013e92d049ee9ca11a425ad450ec5a699ae17672d86efde3fbc81203f2b500ef41746b9e9af2642b30cbf75e7889e500836d6dd32bcc5d8b69021b764a591d6850776cddf0b7240c75dda9e2d197f2cd9c6787b16445b55eaeccdfdd17fb72d7fe5189aa1a2a6ad06b4f2bfc8f6c91c3a2a80a83a3113e0b420b70654d6a5075d38d9a12d1e0fddd2cb23b7f3ef949991bf49048dc40020dcf042caf00883363591dd6a90789ac212a0ced95fb40bcadaac2c97ee7ff302c37cf2aa7298311db85a2d4d1b9f037023c21bf2e9b9abecc780a70cf2a54002634272d7dcf25ee4c7dbb04437f30f50bdcf4962d432484a5dab7b60b31d8025b984c821fadbf2b623f2f92a6531dce11a1f252e603016078f3986e081 Msg = e62f04e5d82cd16ea4cf1b3e74e5882a52a0929a9b3d9547b1e32642f1cfa739e5ae18f6ba4a3028f469ad6660f2e8714a52acb9f11e482338fae30a9eb9108470c6a3e63ec2c28a8b6e3fcfc8cc2562848190bcdd7ec2ec3adf74973c136a3df13e4abd4bdbae1cd1a6788295b9668566f5e6aa46a32b291f5b80f1b125dcec InvalidSignature = 8f20b434b6952a0647610122d5f836965ef69c2717f288c226b1c1d87d5313daed259fce61850a70781244954402a0c210d1cac134cad6cdeaa670cc7e4f682cc26b2108eee4aea7abd8477e5f52f6ee539d9e1799580db1c3fa5b7ba018c16bc3dfcc67b8ca016d5c26554422a74593e0e056a239fa731ab3e780aafa711a762e174b487f95194f902bc7186fc77839e2885ac0db328c71f4060eb8ef7cafe109cdc8e4acb5c21bc964feec80474daf737ea08562888b4296f041581ccde0a2fd61455f6bf56986dc0506f4e6f6b55b4b0e7ece521ee8265a0e63fa87419032c28cf0536cae35d0ed9941027ea680c0785a96d075de14f2a09f36ffa406a954f7d3654a78a968002bad6cc6639fe8fc0ea7da6aa900aebe136368ea8c3417f20af01a0ea5ea485416d577931f9f942d1c6a440c1d6f2edd5631fead4c21f71297e0d8ed753be4100e5f8d6d7acf7030eb264b4edf13c1a5b9c12280cfb5fffc7d691bbb781f5acc4b55f64cf28fb8ea764d79ddad4a0a59e562e45093ac7ad8 Padding = EMSA4(SHA-256) E = 0x2cc92f N = 0xcd6141e4c8dc6997fc65300a6e2c746f391022f15661231a832be966aa498e678777766944db54a599cd6ddbdaf7533f429e6e1197b7eb061913f50b09be04ab70b1b702fce9ada279ea8089677a37701e64190f243dfabe7cc254f08a6143c9c589ac4a90881c0d2b62e98013e92d049ee9ca11a425ad450ec5a699ae17672d86efde3fbc81203f2b500ef41746b9e9af2642b30cbf75e7889e500836d6dd32bcc5d8b69021b764a591d6850776cddf0b7240c75dda9e2d197f2cd9c6787b16445b55eaeccdfdd17fb72d7fe5189aa1a2a6ad06b4f2bfc8f6c91c3a2a80a83a3113e0b420b70654d6a5075d38d9a12d1e0fddd2cb23b7f3ef949991bf49048dc40020dcf042caf00883363591dd6a90789ac212a0ced95fb40bcadaac2c97ee7ff302c37cf2aa7298311db85a2d4d1b9f037023c21bf2e9b9abecc780a70cf2a54002634272d7dcf25ee4c7dbb04437f30f50bdcf4962d432484a5dab7b60b31d8025b984c821fadbf2b623f2f92a6531dce11a1f252e603016078f3986e081 Msg = 5df6c2f15c25e0d72a7ecd6aa3b480949f979945db38f4b8364e7ef720d847a14f04d9ebb350c9e5adef8bff7c6e8acbf89778048296e3d03b5a0a42743eee2366e9acf223720929cdc84fc2065258faa7d2e855b58f40e291b3efc06ef2ece1086ce20e94d5cb2bf2d3c0bd2aa70fa916108f3e5c6c3076a021d679f73b6863 InvalidSignature = 44444dee1f63274ae503afa3c982b96eb60fa8beb0d4146b48473f816946274004d0cea30c1b70d1291caa38012f848815d33e105bdbf2840a1f847cbc353fb8a7688db9e27f9ed3ec0c649aa7650f102374936dcffccc5848953f7dcac50974bd760c4931308c7583b76510eaa1311d14ee4d8cd7403df1b0b7e97aa7acf6279e4849e404217b8fe072207b1af48a154ca91316a1957f25e82bf30468a75c51fc7031253f492e75bbb656bd291110fda322052324bff373b493c713bce00276854802a46fe05f4952d6e80efb1e12a9d6122a554a6a73225586fa690ae4e809b74999317e6fbe1229177bbbf8760f7cadd715fd1296664005150bb38663a890a765bb4646f4b383aeb1c7702fa2092299471df682732df8835737d3ab842ec83c3f2021aa6a618325fa36b4ce34dc2a8a40d5bdc95ba621af1ae7e3f65a61d61c7e0c8e42fe0ed054f3e68f8f8f64a21f7931abe603e13094b9730c1dc8be5918c7386dbfb436570cdc2a3e5e4ae1c937a654eef7354273c4002ca6c79ec273 Padding = EMSA4(SHA-256) E = 0x2cc92f N = 0xcd6141e4c8dc6997fc65300a6e2c746f391022f15661231a832be966aa498e678777766944db54a599cd6ddbdaf7533f429e6e1197b7eb061913f50b09be04ab70b1b702fce9ada279ea8089677a37701e64190f243dfabe7cc254f08a6143c9c589ac4a90881c0d2b62e98013e92d049ee9ca11a425ad450ec5a699ae17672d86efde3fbc81203f2b500ef41746b9e9af2642b30cbf75e7889e500836d6dd32bcc5d8b69021b764a591d6850776cddf0b7240c75dda9e2d197f2cd9c6787b16445b55eaeccdfdd17fb72d7fe5189aa1a2a6ad06b4f2bfc8f6c91c3a2a80a83a3113e0b420b70654d6a5075d38d9a12d1e0fddd2cb23b7f3ef949991bf49048dc40020dcf042caf00883363591dd6a90789ac212a0ced95fb40bcadaac2c97ee7ff302c37cf2aa7298311db85a2d4d1b9f037023c21bf2e9b9abecc780a70cf2a54002634272d7dcf25ee4c7dbb04437f30f50bdcf4962d432484a5dab7b60b31d8025b984c821fadbf2b623f2f92a6531dce11a1f252e603016078f3986e081 Msg = da1721b3190694d873daae06b0108945c693ed88ef850c8cff3d7003f58c31f2d0456b58a4fcef10ec0d39f822e1a3538d6cd86c5bfa8a7def2c68ce7c3d4a21d38aaf4e79526a2bfdba98ae8814d556b660b0c6a4135cb44b18a8010c1530298befd5dec1906cf04de8b3700b318915e8785edef559e8f9ba0a17e4cc9b4cd2 InvalidSignature = 509d9b9af57ce731263300032280ae4bc353189a6d25b50b66834b2a9e7626937578c82f33c0369803a2b97d71093e79e656d56bea286a6c31276ea3796d0684a30eec606665b829c82621bc6274e93b4f1add1be8d7ceb66da8f1f6eb7b9493669925a8b3dc0c21a4d6cc19840b71a0b312f911a328c7e58735cec47303065e6fb01457b3d97b93814cb6ae6f42b3733d2101159b08bd33403e22b9f0a288ec02d386a59c4ddddf9c83c3154ebfbb81914373b91fc187dff00d93b8ba344aed763362c67a623c1b90e7d6b781f3688254c8a013976cfef38f8cb947e7704ed5d6cf4b2480a956c0be551e986b5a054ab59b2e9b979062fa6ae9f8204e09a5962a8af893215646b91aaa2743df1745449a30fd13785b2c4b839617d380b1aeeb4296908fe494a810a6cb80d723ce74716f89f7b50770b577dd5dd900529d6d67323094e8d46c60539c9c9dbf44801cec4082f6a73910ec452a2fada90f2832a3dff07fa1f0ffa1476994e20a335d69e671366c95a2cf4c16dd4043e57501184d Padding = EMSA4(SHA-256) E = 0x2cc92f N = 0xcd6141e4c8dc6997fc65300a6e2c746f391022f15661231a832be966aa498e678777766944db54a599cd6ddbdaf7533f429e6e1197b7eb061913f50b09be04ab70b1b702fce9ada279ea8089677a37701e64190f243dfabe7cc254f08a6143c9c589ac4a90881c0d2b62e98013e92d049ee9ca11a425ad450ec5a699ae17672d86efde3fbc81203f2b500ef41746b9e9af2642b30cbf75e7889e500836d6dd32bcc5d8b69021b764a591d6850776cddf0b7240c75dda9e2d197f2cd9c6787b16445b55eaeccdfdd17fb72d7fe5189aa1a2a6ad06b4f2bfc8f6c91c3a2a80a83a3113e0b420b70654d6a5075d38d9a12d1e0fddd2cb23b7f3ef949991bf49048dc40020dcf042caf00883363591dd6a90789ac212a0ced95fb40bcadaac2c97ee7ff302c37cf2aa7298311db85a2d4d1b9f037023c21bf2e9b9abecc780a70cf2a54002634272d7dcf25ee4c7dbb04437f30f50bdcf4962d432484a5dab7b60b31d8025b984c821fadbf2b623f2f92a6531dce11a1f252e603016078f3986e081 Msg = 697e6ffd617d01d666fb1c069477d3a5b36b45a00ad2175e73e622a3b52e68b50db84dbe0ea40472ace247f1933b4befbd96f3124374449b73be194924c0177a4675e494bd0594a3708c64449c1dabc16f070d7dd256f293869d36ba72f3236c3b3c9c4716aa9ab3da83ddc55a24db63f146fda95e800a8cd20de3bd48d072d0 InvalidSignature = 359ac6731fdb0c3360c8c24311e48e84b2ad4d1b19041009e5fa2d6b94ddd87dc9be9206633fa87059d184dc583b9f24e6909fd5a533da78e1687b1c01e4c5a5d58de0aedba5d7b19b268957c9e79bb631bdbd423e3a267f9ba4a1266e2c3aa80929e5f7260ad9681af2eb2b8936596e3b1622e076b8a33dd86ded2b06060c8e74b1fd0f2ca88a8efa3c462b1227f8cecee0f77ef17606c218abfddc8cfdf990102524ecff3118f81b48adf286d6b21cb8dd815cc1235289ac15f6dbf420db9a608ff26667d7c80fd56124741bfcd47b42bdb0c17d66bf45b2f88d633e1954172ff808e7904db96d3396fb9f7d0da5742a937691fceb97894ac6774aa9daa7d18d889543cf3a7ad96d6a6e6feb4ee16900ad070ecbcd165bf82fd075046478c42fe8584023910c320901b22f3a4690597fc78b49cc2aca4e9b97bde0e69d62c9fe1ad07b5f0917e175d01f1fe5dbaf8abc3c71efbe0b55ea48f23601eaa5c70fdc841be8d1b89d01cb922e9ce4406747114fa05f55c73922fb28a42c2138a5c6 Padding = EMSA4(SHA-384) E = 0xe59685 N = 0xa458e38be5e581c433d88dfe24e7e1bd0713bde19fd7dcd794b4fc97ac6546fe7874ab10783407221aa6a526de912097761a1f0a10166cb368f5af6a60a944493173f9d9e04a9061109131de32ddb21f06c571ea83aa42d9c172d0ccb79fd0bc421dca68179ab6329d0af92b8d2caadeeff6c0a46a6bccdbdc46e7afdfb6dd8b1c20695837cff9a153b5ad8b6fc0344006c3916aad0f6f19d84fe8b93bd6627331283c090a7096af3139c714fa1045ce449ac953d7068db92ecd2b687b0902509cb5ac0bcd16c9751afc847d0164f5add3c038efb41e7ba5fdf8567446aea2c9d7252320e5503ff0ff236871541c2590a5d4c1ba9a315f885d732fbe15c2f5bd5d70b158fc33e30a44b25cf56ff600003369a935c2e017a3984593b2beaaf9af0e6a5c9d19bde051ef1fc5bcd63391488f410e8a97cda45bdd9233e8401b5f5fea4b55d091605700a903615c5f8b6c18281b5f3d77b85f087822ae5ea14ca26795504abd011f42de239f3170afda6ddf17f69470d46034aae629f8ae2f9d0d61 Msg = 6ec1913b9a55cfce3baa6a742498e6712109949f2e5e66fae70e01624090149d767ce89c46ed39ff5c2945db0e8422ba4a8154e3cd3b9fdc96031a2e9b4b8568bac3dc66f2c12cd3d3e6a6ed33fff2882329c6562239b665905a4ee965f85e3c22dd9523089a51538829b634fcd0fee494480f7f931f539ebb5bc41d05604622 InvalidSignature = 1fdb03e44e04d5823751c29f4404de6859ed5ad1fd7942c6387494327b3fccb98d662bd6311edc0bf49cb4d1014c6f2fed8b5238493bb4db23580f10763707414e3c87a663d664cae71bb00c2596b2515d711f1087125670e2c58f7ae57686f82da409c79718d942fa05545518055a256e007ef761d4acc33984a629ed548005acfd79e0cf151376798eadcf978729a3e18b9603b7693e1c923cb86b52199a360c88e9ec5303afa6e60e47f45719e93cf2e7a53530b9c9a2ab3b2c8b5d7d6d7971445c8a1494bc36363ad58a1c1f4bfb86534cd84be778ff4ef4a410a73c9d0ea327d30548977f2337a74641ace92c749ecd54af207c4bc29d446eddc173934bcd3e998da643261275b1556063dd5c1821c43cf2bef36eef66e514d72462043fac5d568d1be6d57e49f40f30be88c7b4389cec090ed954f48fe48aa26ba39dd739c2d0097fd31330344351a3e941bd633952ce99039e31056097d00aef49218c2589212b44bdb12b6edb68c784b8f789f370999f71eed9c04d6dd2d4d0723d2e Padding = EMSA4(SHA-384) E = 0xe59685 N = 0xa458e38be5e581c433d88dfe24e7e1bd0713bde19fd7dcd794b4fc97ac6546fe7874ab10783407221aa6a526de912097761a1f0a10166cb368f5af6a60a944493173f9d9e04a9061109131de32ddb21f06c571ea83aa42d9c172d0ccb79fd0bc421dca68179ab6329d0af92b8d2caadeeff6c0a46a6bccdbdc46e7afdfb6dd8b1c20695837cff9a153b5ad8b6fc0344006c3916aad0f6f19d84fe8b93bd6627331283c090a7096af3139c714fa1045ce449ac953d7068db92ecd2b687b0902509cb5ac0bcd16c9751afc847d0164f5add3c038efb41e7ba5fdf8567446aea2c9d7252320e5503ff0ff236871541c2590a5d4c1ba9a315f885d732fbe15c2f5bd5d70b158fc33e30a44b25cf56ff600003369a935c2e017a3984593b2beaaf9af0e6a5c9d19bde051ef1fc5bcd63391488f410e8a97cda45bdd9233e8401b5f5fea4b55d091605700a903615c5f8b6c18281b5f3d77b85f087822ae5ea14ca26795504abd011f42de239f3170afda6ddf17f69470d46034aae629f8ae2f9d0d61 Msg = 89008623eb2864cc6d698bd707adce222f5e7f02f128282d42017bd892678c1ca0e93e9e92e9fb6f45a0a931e263d97cb2244180333b6ceb6b67b00d7c0f613979ce446f782f4639e8b56ed3251f118e4ae9457647169733332d012de38216f4bbb680dec481acf2ffafc404f969de22a0b6732f554212ce425d5582ee461513 InvalidSignature = 52c068fd97c371bf7ad059310286d099e9e1486d6bdd9aa324a51019afbc5b502f1b9f2fecb23560b7a414d0e9e6fca69f4cacdb5228728c77e7659139ba2de38fd74b98f7d70ab4cf61655b84be1473db8b29563f2ad053a89369bb58588874d8d49dac78a42c0ab78d5dc739901b9106dda53c670c2e0ef47a45522af0e3ea7d584c6d1b782469cb7e86b0df2ea67d50ac4dd491e5248974bbc3caa5523da1809f93656706b72f9d7d17ca19d3ee4ca5942f9f5da16db8c25aaf911d85b6c30066d42b7cc6bf33672323177994b95932c224a87a3b15c7a74bead04ca432e933ca26af1677e3fcd67c3ad3196aed8319bfda468b753db289f6009972fe0ac34e7cc2c0c9833534a88e79a6ba7177ccfee0012f174e7e63e63b8e9f6bd24133b2685843ac90aa83ef81b421a202758ba48cd95c46b52192bfa52242bb65a00a21e72f73a5a8f3100c5f8d5fcbc4a5d3ab17a2bd7cefc23126f93cddbf575f22e03c7b7c2e5086992f712bdbfd155b07d05970d8e56c8da399defe061a563036 Padding = EMSA4(SHA-384) E = 0x2fcbdd N = 0xa458e38be5e581c433d88dfe24e7e1bd0713bde19fd7dcd794b4fc97ac6546fe7874ab10783407221aa6a526de912097761a1f0a10166cb368f5af6a60a944493173f9d9e04a9061109131de32ddb21f06c571ea83aa42d9c172d0ccb79fd0bc421dca68179ab6329d0af92b8d2caadeeff6c0a46a6bccdbdc46e7afdfb6dd8b1c20695837cff9a153b5ad8b6fc0344006c3916aad0f6f19d84fe8b93bd6627331283c090a7096af3139c714fa1045ce449ac953d7068db92ecd2b687b0902509cb5ac0bcd16c9751afc847d0164f5add3c038efb41e7ba5fdf8567446aea2c9d7252320e5503ff0ff236871541c2590a5d4c1ba9a315f885d732fbe15c2f5bd5d70b158fc33e30a44b25cf56ff600003369a935c2e017a3984593b2beaaf9af0e6a5c9d19bde051ef1fc5bcd63391488f410e8a97cda45bdd9233e8401b5f5fea4b55d091605700a903615c5f8b6c18281b5f3d77b85f087822ae5ea14ca26795504abd011f42de239f3170afda6ddf17f69470d46034aae629f8ae2f9d0d61 Msg = 6cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f1d85 InvalidSignature = 8fde6a6c314b86ef918ae2d2adf68f85e330a8a1e3486bb3003fab3a52017096ebe000a4a7e8d05df6fafcf4b01940f5e322b7c64a7fb5949a6eb356e905c96c6abd9ef18b4ea9fcc3836dbf6b24979b9e6fa6785e09db540c079a0e97d3adecf6158de9750df9598ae8e7085140328c50beb09ff37e10f7fb11691316db255b6e9be021bec7b0a967589f63d6dd7a43aa0901cc83b8a8954542a41284f2fc381cb5a6eb3625099c911bcbb421b35a70ef5275f2744ead1813873f1d0333060d9cf2ffcee888335b0aed2428362358f7d1aab34fffc11f27ab3cfb8b5390e7dfde1fdd33f2a8b8171d865bf40a8df783e216112b4d416b31f33cdd8c905133557b074cffaa14c73c087e6990c9bb7a36998459e4758ab07c85d260849c0be374a99f3b8b23b97fa5c9dd6206ed21e2bc54fc256e080856c3599772b00c4c5799daedb1a6674625029da3e17ce73365675c5f3a71398f4a0c4f609d4f4016f554cb2424e19c35ca2b0649a210edcb6eca7ac2b31ffff175b25d77b26933e52787 Padding = EMSA4(SHA-384) E = 0xe59685 N = 0xa458e38be5e581c433d88dfe24e7e1bd0713bde19fd7dcd794b4fc97ac6546fe7874ab10783407221aa6a526de912097761a1f0a10166cb368f5af6a60a944493173f9d9e04a9061109131de32ddb21f06c571ea83aa42d9c172d0ccb79fd0bc421dca68179ab6329d0af92b8d2caadeeff6c0a46a6bccdbdc46e7afdfb6dd8b1c20695837cff9a153b5ad8b6fc0344006c3916aad0f6f19d84fe8b93bd6627331283c090a7096af3139c714fa1045ce449ac953d7068db92ecd2b687b0902509cb5ac0bcd16c9751afc847d0164f5add3c038efb41e7ba5fdf8567446aea2c9d7252320e5503ff0ff236871541c2590a5d4c1ba9a315f885d732fbe15c2f5bd5d70b158fc33e30a44b25cf56ff600003369a935c2e017a3984593b2beaaf9af0e6a5c9d19bde051ef1fc5bcd63391488f410e8a97cda45bdd9233e8401b5f5fea4b55d091605700a903615c5f8b6c18281b5f3d77b85f087822ae5ea14ca26795504abd011f42de239f3170afda6ddf17f69470d46034aae629f8ae2f9d0d61 Msg = 4621b17cd9f5b623fe73b5fe280ce9ac840805608acd6e41d55ea71132220c0df7e7c4159626f10d71882983f0aa2a92d11dc906c0b22cc028f4395d48f54e12894e33da0f614dd48ee114e65f95c7a7d3585e7cc765c00178d136aa99591faaa35ee6136d2e323ffc855c709c5426b32fc0aa0ac66e90c96efe84414dd5e79c InvalidSignature = 33bb9affe18723767ee34d8e40982c735099ef1806d8720e71d16fc2d6617a8cf301e992b6c5fc567aa971285cdb372c1934eccb1e83a6597011ad091aefc40db52a7cce970e3e2eee817a727beb9e5d137e64606279c36341c4a7e7488cea8c69af8a3e8497fcbd7679462a1aa15ae4b0d8ea321d4f7c54c75dadc64318cc99533297d9f5bdf4882e64ede175f32cd20081f996c52f288bd56dbc63fdbba190f1167081c95e37c0dbaad3506009660a3fd10d992a2968bfda881cec2cad19ddd852ab579abad0a9cf43c10b1758867dc0f25317d630fd154caf9a4b057d2abcd933748c7d87686c7661dab7b5990f32708183e494b243b862f4255ae02e2d2bfbf00f13d7cc2be7e1f16c43c94b500898de9afc7d4aa8cbb56a4128ec0159a1568c0ebdb819f49ca06b0f0686dfd920d6eff0a3a5e1d913d4ed44f9da20572c132965a958a139207e8900cba4d6b1157a57a4414011b412888cd1935c01e630410607db7852c174dc32b6312d22f541c453ccc07f7689113013c367f4889a7e Padding = EMSA4(SHA-384) E = 0xe59685 N = 0xa458e38be5e581c433d88dfe24e7e1bd0713bde19fd7dcd794b4fc97ac6546fe7874ab10783407221aa6a526de912097761a1f0a10166cb368f5af6a60a944493173f9d9e04a9061109131de32ddb21f06c571ea83aa42d9c172d0ccb79fd0bc421dca68179ab6329d0af92b8d2caadeeff6c0a46a6bccdbdc46e7afdfb6dd8b1c20695837cff9a153b5ad8b6fc0344006c3916aad0f6f19d84fe8b93bd6627331283c090a7096af3139c714fa1045ce449ac953d7068db92ecd2b687b0902509cb5ac0bcd16c9751afc847d0164f5add3c038efb41e7ba5fdf8567446aea2c9d7252320e5503ff0ff236871541c2590a5d4c1ba9a315f885d732fbe15c2f5bd5d70b158fc33e30a44b25cf56ff600003369a935c2e017a3984593b2beaaf9af0e6a5c9d19bde051ef1fc5bcd63391488f410e8a97cda45bdd9233e8401b5f5fea4b55d091605700a903615c5f8b6c18281b5f3d77b85f087822ae5ea14ca26795504abd011f42de239f3170afda6ddf17f69470d46034aae629f8ae2f9d0d61 Msg = aa4a6da9f73b58f5326d587572aed18ed9a79f3dbc6959510349d2d8d3eee6d76ba8733e4c03a51a9d9d770dcd3476fb7a03c807924f6ebeb83dc691e9e654895fadc136b5d124e94d3e8123efa98f4cb2dbbfa8204d798895f6a9bde8617a524d02617b7aca5ec809f97f9e1e34a5e849d78a0aae8c0316631d83431986e19b InvalidSignature = 950e4924b04152a1bfe6f36351d637ac802b08344c250118aaa7e8c414f39f559761d458b7744d952edf9851197b2465c46aafa827ea0610f85fadd7b41418b04c1e335fa084fdc84782e1f51f90df0eef306d9b9361a1e610244fc5dc609a9f82f670521f63b3b3ed8e1a48a630c55dc9f73f16bf49478d8410434dc0da78ef840a4bfba56d5770d084c90d7ffd198a802c8b90a8700b96a0f2f50c994af7d44b3e9eabf9c7b5d9d6b7da0d64b623293b5b7e2108d7085fe7f70b29b98c3bd575df131da4b78a50dfb6392d0f37295908170d4475d7702ea3abce584efbd4b4e37ab760c1641548a79eb7f27c69eb4c78113bc0c22ec2d2a9a244ee6fee9aaf57f71aa9dda726bc0dd580673ff2c69922dde0b4ebb92653fd324077040fa00a280454ea879147937ed1f53ce26422f4677e0125cd49c2bcb9a88767e0e67ca51f6472de6cf32c7b0ab7bea63253d8fa031a938621a026a92384bae79594a8c9bddfb06fa9c58c5a4a5776cf65b1f5d346da7deab2154e45440b0405d1052405 Padding = EMSA4(SHA-512) E = 0xb3f57f N = 0xa3f2235ad2053b4c83fa38f8284ed805421621fe98845fb01b689f5b82b32511b6d16173e7b40a66a3a999c189beb9e06822150ac8be677186370c823b5277d909de07564e281cca2f13873d9d07b7bd85a2b9ac66f4ce4f5e38b8e9eebec04c8caf311e375d69e80851d559b8e90e85ba6b96476790f727c25aa8163062ec8543fcc7759be62c7768ecc37f340bb06102762bf0441ca1aa2c7a81bf37dc8b27439d3abba93812c9bb44fe4d6a94baae709379f5ce5d0c8f81d00086b9caa3026819588f491b525807899cdab33d8e992150d2b105d3aab615217c6a3d740831c7dc76faabd9c9b9817ead0b494566de1433fff5ba4604c6b8446f6fc35e746aff84ff8bd7500410d10e82bf4c9036489de47dee9a327a5c4510d8561321b91d55559a4cba85e0c361767084b25217e8a63c4e151a1e88689feecffd16fa0a65ae41d2babca99cf1b959c3c076c0f75974146f2cc494126fbecad4217b9aaa00f169fa512527ff5a0b50da46d6be870ecef2af7a1e6c4556f6f7a0a00b9f47cb Msg = 31e3e05d7a984db4da8696db9bdefba791358c70fdd8330db060f4ff748674eda738b85129ec30707934f48f1a924d643c8e77cb9807a5ba9cc74677c85a8708581f19ec239f3408c31edce4f6706317440e2f00e269bdb7d77ee6435dab610e8ac18a962f5a6164016dd642f61f44a9f2dc3b79a3a782eca9ae5ccdfb220be5 InvalidSignature = 4fc3232b033b22a8406ab979cf0bb66175b523285eb8425d2e80113b2bd28f8f364a6487304650789c3ec0f2e1ecbd0c919ae8d46c604534aee503dda653ed94582c93abf67417412080871e193faca2ab5be8944663415475f3fcf6086592418b6b845d5f6281943b19dd68c0a3526b39d8d225a97c5705b7b9d2afffdc2351dd95dee2eace1aaa8bd9643fab8e764d6a7c66499f74c944f10afbfdbd901b385388696d536fc9ca5b68b933784f646773e99ec2bf312883fdeb9ecc3d6e46094d87802cf11deb8e8293ec1ba76711a4b49db5d2a443324783cd4fa001b92a46f7aae084bddb30af4d23c6ec6faa9003def5dd59d00c225ba1212ad0b58fec5b251200ae135345ef141106d3265d9e8019a426f652b91ec32c8658869aa10044997f22f24fa101d088379d60d64830f7948a0bfe1c348b90b28dee91bc501556cc1dac0d050fbdd2efef2538fa4f182d7908ff754ab84c238d16a9b10b0140e7298b026b4830ce14f3caf9e72daf32a6a785360816c70989834691133c7a918a Padding = EMSA4(SHA-512) E = 0xb3f57f N = 0xa3f2235ad2053b4c83fa38f8284ed805421621fe98845fb01b689f5b82b32511b6d16173e7b40a66a3a999c189beb9e06822150ac8be677186370c823b5277d909de07564e281cca2f13873d9d07b7bd85a2b9ac66f4ce4f5e38b8e9eebec04c8caf311e375d69e80851d559b8e90e85ba6b96476790f727c25aa8163062ec8543fcc7759be62c7768ecc37f340bb06102762bf0441ca1aa2c7a81bf37dc8b27439d3abba93812c9bb44fe4d6a94baae709379f5ce5d0c8f81d00086b9caa3026819588f491b525807899cdab33d8e992150d2b105d3aab615217c6a3d740831c7dc76faabd9c9b9817ead0b494566de1433fff5ba4604c6b8446f6fc35e746aff84ff8bd7500410d10e82bf4c9036489de47dee9a327a5c4510d8561321b91d55559a4cba85e0c361767084b25217e8a63c4e151a1e88689feecffd16fa0a65ae41d2babca99cf1b959c3c076c0f75974146f2cc494126fbecad4217b9aaa00f169fa512527ff5a0b50da46d6be870ecef2af7a1e6c4556f6f7a0a00b9f47cb Msg = 691c263b523e54312dad47dddcce9bfb7275a61a9ab5fd0736f73a89454afd4e0afa31266b64916f97086ad0ebe0a22b17f1f9cc7c1f8fe7d945a7412785aa2dc1dd6fbac8fbb92bc65301a7916e7632738543dc874e10386616cb100310a857d4ed665f33acd54d03b495c9962020face5a0ab183eb88e42591305fa392ffb6 InvalidSignature = 0c42f7dfb0a5b5d439d505310f148a0721670d81c806bb50bec20d941dbdfa12980b2326984169ca4a3943ececd9b1527dccedcaefeb5cf739e0112ab9410396e3692163fe2a74fb8d530c8d805575e101b4ddfcfd7f14a8ed95074a516a1ccb0190345a79ae0e83934cf09cd1617ca471e10de6bf512ccb5cbf9a87ffb65f032422dece63dfc0247f54c9752b2e966c904cc203362d3f680fda66b17f761571b2984cece2f4575064b47d78afe8d683554da1f132e8bf707f850f97310cafafdf374835188983bcdb3493ec1479aa26fe12b504a32a8e9b31a1fc821fdcc8b7a2c6405d189cf7f644e5f47bed54c0f1b03ceac14b19f13a25ccf4c779a052989a9e966dcacf29ee5efe93e1dcd5fee4521faac968652353e5ad9e0ff2d4622e98cf7fde4800ef00981d76dfdb953ea9c599a1c07611876d11ce94e9a421cfef3aec08145703c2e6a878112959696ea54effd9c3819d0f6fc6d722a26ba044d16cc93359e4b6df565b43c354abd105a638aa1e1d6cc7fc9300165c57b41cdbe2 Padding = EMSA4(SHA-512) E = 0xb3f57f N = 0xa3f2235ad2053b4c83fa38f8284ed805421621fe98845fb01b689f5b82b32511b6d16173e7b40a66a3a999c189beb9e06822150ac8be677186370c823b5277d909de07564e281cca2f13873d9d07b7bd85a2b9ac66f4ce4f5e38b8e9eebec04c8caf311e375d69e80851d559b8e90e85ba6b96476790f727c25aa8163062ec8543fcc7759be62c7768ecc37f340bb06102762bf0441ca1aa2c7a81bf37dc8b27439d3abba93812c9bb44fe4d6a94baae709379f5ce5d0c8f81d00086b9caa3026819588f491b525807899cdab33d8e992150d2b105d3aab615217c6a3d740831c7dc76faabd9c9b9817ead0b494566de1433fff5ba4604c6b8446f6fc35e746aff84ff8bd7500410d10e82bf4c9036489de47dee9a327a5c4510d8561321b91d55559a4cba85e0c361767084b25217e8a63c4e151a1e88689feecffd16fa0a65ae41d2babca99cf1b959c3c076c0f75974146f2cc494126fbecad4217b9aaa00f169fa512527ff5a0b50da46d6be870ecef2af7a1e6c4556f6f7a0a00b9f47cb Msg = be0f5c666c1d2c480ab93ab82e2c7d5d347ab87e9937ff72a59b77574dd95d0757ad4a48bf34b5435a01b938b96d186f502e8172d72c0e79f19011260c1d107288c30ee81b710c11742cd02f1e5ee52da870e3d7039af1472bfa879f09e479fe997a31ac487c3b98a061080526a6eb8083666815e32baec29b04622c0ed79e91 InvalidSignature = 64e703378e5e73cbe26a01ea4b21e926501266d634a83b2542985d3405202f38504917cd42363969d5f65bc7a1db79dd1f91c49407be518aa77843d14fbe7ee49715ef4457c32eec47f03020209b761ef1be6a12f489030ae585214a7a9429e60618eedf82eab01e3d7b39de7e220540812e1b6d0b88d200699c17387c1deb893c3012f4a340bb86fb353825f772efc4afa625784aeba437d2cf4a09e1dccb7e224385b03a40be52557005ed9023c0aec390f551de23d590cacb7c3b5efeb6c878b44524613bf5293fd5cce9e486c2552be609993dd15582df09aff677813ff5d2c2a8c55460912107818b29ed76601ad999902a461b06c85da91376893b9dfbcd8d50e135ba39a4c1daf2c610f0efc8717842d40caf59bd2f51fef7962d1a936a3a31705febaaedf94083748f2f3cf3fd2ed498490b8e6b20823f7ab78c8fbf518945d426cdca11e4b3e6a8e5c15bb3f932d60e0eceea2c3e6bc72255a4ff248203b02e268794b09cbfe4891b3383ff7e845c26a01fc9c4ecacd267ab186a4c Padding = EMSA4(SHA-512) E = 0x453aad N = 0xa3f2235ad2053b4c83fa38f8284ed805421621fe98845fb01b689f5b82b32511b6d16173e7b40a66a3a999c189beb9e06822150ac8be677186370c823b5277d909de07564e281cca2f13873d9d07b7bd85a2b9ac66f4ce4f5e38b8e9eebec04c8caf311e375d69e80851d559b8e90e85ba6b96476790f727c25aa8163062ec8543fcc7759be62c7768ecc37f340bb06102762bf0441ca1aa2c7a81bf37dc8b27439d3abba93812c9bb44fe4d6a94baae709379f5ce5d0c8f81d00086b9caa3026819588f491b525807899cdab33d8e992150d2b105d3aab615217c6a3d740831c7dc76faabd9c9b9817ead0b494566de1433fff5ba4604c6b8446f6fc35e746aff84ff8bd7500410d10e82bf4c9036489de47dee9a327a5c4510d8561321b91d55559a4cba85e0c361767084b25217e8a63c4e151a1e88689feecffd16fa0a65ae41d2babca99cf1b959c3c076c0f75974146f2cc494126fbecad4217b9aaa00f169fa512527ff5a0b50da46d6be870ecef2af7a1e6c4556f6f7a0a00b9f47cb Msg = dd1ac9357850544f391febbba214bc7b034f30e99b2229ee00db8974c1ddf31e49f6d53606eca6e7cb596cac73b98208c8c29878a3f4fba6547017df430d3ac7d8a99a4b99bd9ad8923449cafa7e2b2813e03d8e520e336ac0fb046ba0f0a83752dc205d77ebb88a565989ff7f894142ad512714f19859a40d2458021eadc7d6 InvalidSignature = 087210ce149329791f3509b67df8ce6fd0f75b86500780f9b16f451b8179d8aa69bf64416ac5c7cfc0695a775fa30aa6183fac051642e4e8383e8a2dfd8a93523e1de54478489caf0b35efab456123b771db81c734ddd3545c971b5a85663c9dae8970fc15752b843e3ab11d1a660cb8d4f63ba5a0c8ad3e7e2f21f7d70c5cf9753607698022e7f379dcd5fa5c4d7c66a71efd3f845567c360f704bd3679633310066a20050c056c8ac025f7721573a94dc91dab73c4f9b4d74ec24114d35b806562ccab94d598e46d2e915282a6b84eb9d545304dbc72f67957b6391a3b4e779a8db79d2f69316b28046b41c6f7a3fa1756d85e6c74f45a86aa17b2ba0d57d5548fdeafd33c9b8308d12c49ba913fa1d01178b83b7c99abcba31b3b92a014343ee67dbbb15d63f165495973fbd7769346f4b4a82a573a0ad36a8ba55de22bf595d368c3807d22828bc5da051a5ae469729e0d3f1fc9ce94d1d754703ee90fc9a7683ad88a2392241cf508fb6dc485652b8d8bf6dbdea987ecdf71948345d771 Padding = EMSA4(SHA-512) E = 0xb3f57f N = 0xa3f2235ad2053b4c83fa38f8284ed805421621fe98845fb01b689f5b82b32511b6d16173e7b40a66a3a999c189beb9e06822150ac8be677186370c823b5277d909de07564e281cca2f13873d9d07b7bd85a2b9ac66f4ce4f5e38b8e9eebec04c8caf311e375d69e80851d559b8e90e85ba6b96476790f727c25aa8163062ec8543fcc7759be62c7768ecc37f340bb06102762bf0441ca1aa2c7a81bf37dc8b27439d3abba93812c9bb44fe4d6a94baae709379f5ce5d0c8f81d00086b9caa3026819588f491b525807899cdab33d8e992150d2b105d3aab615217c6a3d740831c7dc76faabd9c9b9817ead0b494566de1433fff5ba4604c6b8446f6fc35e746aff84ff8bd7500410d10e82bf4c9036489de47dee9a327a5c4510d8561321b91d55559a4cba85e0c361767084b25217e8a63c4e151a1e88689feecffd16fa0a65ae41d2babca99cf1b959c3c076c0f75974146f2cc494126fbecad4217b9aaa00f169fa512527ff5a0b50da46d6be870ecef2af7a1e6c4556f6f7a0a00b9f47cb Msg = bf8cec246224e055e794d2f3f3fb3b1f77982a3f8f2544f4aa66094dec01593ad090364312f5cb79ccedadaddfe962e1941920fc83c9d6c2b4f0710205065811cb173878bc1607ea0d734379d7ef7b09bfb01104d6903e4fbebb567d0f794e43f8487b2c2a2e9c8ef14d1bbda4b8907e408587bf5024838510ef4325d10143b7 InvalidSignature = 92579093d53403c964f045fb794065964cf98f2dc9236347bf5a757342a546443ec4e7c885f930e1d4691073a50bfbfaf7fb71ee7c8f7981ab009924c1573f6b92bfd66f36e22d5de5e707d87247ef2422270b772474699ae77d771c4a94caaca81d123380aa09e447f1384af3d8ee076ba0592a9b0d5e550a16a9a63482a09ca95425a05eb7c02d3727f2eb64e7f74b03668209e1a32b722d36e8b4614451b22576b4645f23ad95392a01d36f30e55958648bc6f7245479f949821985d66936c173fa5a9f0d772ccfffad1610f8247a2e598f5f7ccc258579ae46beadb94e7b8f558594f2f546aa3177247ebefcfc99f306fce40066b3d72900cb312be0a58062c36d1b2d6a47673b8599b4fae469865059b6e38e1d6f0c069df61268d38d885dfa42d0dfc9659bad6637fe76865f509cd3b2abab37d571aedc5068be59af0f7678ffa1406ee263e76265723fd4db14acf7ec1bef3bdce0db1a976e30f5f4a36e65a2e8b3ce8bc9e6df970af5b149a1d30958c7ef79802a6728ef1b0ad47d79 botan-2.4.0/src/tests/data/pubkey/rsa_kem.vec000066400000000000000000000440171322470703100211060ustar00rootroot00000000000000 # RSA-KEM tests vectors from ISO-18033-2 # http://www.shoup.net/iso/std4.pdf # Test C.6.1 E = 65537 P = 74100103850091296168511028051948833436338123529747970640732238422269665602829 Q = 79461607023043824134896992211543210236933205105414344240218914846895267687977 R = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 C0 = 4603E5324CAB9CEF8365C817052D954D44447B1667099EDC69942D32CD594E4FFCF268AE3836E2C35744AAA53AE201FE499806B67DEDAA26BF72ECBD117A6FC0 KDF = KDF1-18033(SHA-1) K = 5F8DE105B5E96B2E490DDECBD147DD1DEF7E3B8E0E6A26EB7B956CCB8B3BDC1CA975BC57C3989E8FBAD31A224655D800C46954840FF32052CDF0D640562BDFADFA263CFCCF3C52B29F2AF4A1869959BC77F854CF15BD7A25192985A842DBFF8E13EFEE5B7E7E55BBE4D389647C686A9A9AB3FB889B2D7767D3837EEA4E0A2F04 # Test C.6.2 E = 65537 P = 74100103850091296168511028051948833436338123529747970640732238422269665602829 Q = 79461607023043824134896992211543210236933205105414344240218914846895267687977 R = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 C0 = 4603E5324CAB9CEF8365C817052D954D44447B1667099EDC69942D32CD594E4FFCF268AE3836E2C35744AAA53AE201FE499806B67DEDAA26BF72ECBD117A6FC0 KDF = KDF2(SHA-1) K = 0E6A26EB7B956CCB8B3BDC1CA975BC57C3989E8FBAD31A224655D800C46954840FF32052CDF0D640562BDFADFA263CFCCF3C52B29F2AF4A1869959BC77F854CF15BD7A25192985A842DBFF8E13EFEE5B7E7E55BBE4D389647C686A9A9AB3FB889B2D7767D3837EEA4E0A2F04B53CA8F50FB31225C1BE2D0126C8C7A4753B0807 # Test C.6.3 E = 65537 P = 74100103850091296168511028051948833436338123529747970640732238422269665602829 Q = 79461607023043824134896992211543210236933205105414344240218914846895267687977 R = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 C0 = 4603E5324CAB9CEF8365C817052D954D44447B1667099EDC69942D32CD594E4FFCF268AE3836E2C35744AAA53AE201FE499806B67DEDAA26BF72ECBD117A6FC0 KDF = KDF1-18033(SHA-256) K = 09E2DECF2A6E1666C2F6071FF4298305E2643FD5 # Test C.6.4 E = 65537 P = 74100103850091296168511028051948833436338123529747970640732238422269665602829 Q = 79461607023043824134896992211543210236933205105414344240218914846895267687977 R = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 C0 = 4603E5324CAB9CEF8365C817052D954D44447B1667099EDC69942D32CD594E4FFCF268AE3836E2C35744AAA53AE201FE499806B67DEDAA26BF72ECBD117A6FC0 KDF = KDF2(SHA-256) K = 10A2403DB42A8743CB989DE86E668D168CBE6046 # Test vectors generated with BouncyCastle 1.54 #import java.math.BigInteger; #import java.security.SecureRandom; # #import org.bouncycastle.crypto.AsymmetricCipherKeyPair; #import org.bouncycastle.crypto.digests.SHA1Digest; #import org.bouncycastle.crypto.digests.SHA256Digest; #import org.bouncycastle.crypto.digests.SHA512Digest; #import org.bouncycastle.crypto.engines.RSAEngine; #import org.bouncycastle.crypto.generators.KDF1BytesGenerator; #import org.bouncycastle.crypto.generators.KDF2BytesGenerator; #import org.bouncycastle.crypto.generators.RSAKeyPairGenerator; #import org.bouncycastle.crypto.kems.RSAKeyEncapsulation; #import org.bouncycastle.crypto.params.KeyParameter; #import org.bouncycastle.crypto.params.RSAKeyGenerationParameters; #import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters; #import org.bouncycastle.crypto.CipherParameters; #import org.bouncycastle.crypto.InvalidCipherTextException; #import org.bouncycastle.util.encoders.Hex; # #public class RSA_KEM { # # public static void main(String[] args) throws InvalidCipherTextException { # // Generate RSA key pair # RSAKeyPairGenerator rsaGen = new RSAKeyPairGenerator(); # rsaGen.init(new RSAKeyGenerationParameters(BigInteger.valueOf(65537), new SecureRandom(), 2048, 5)); # AsymmetricCipherKeyPair keys = rsaGen.generateKeyPair(); # # // Set RSA-KEM parameters # RSAKeyEncapsulation kem; # //KDF1BytesGenerator kdf = new KDF1BytesGenerator(new SHA1Digest()); # KDF2BytesGenerator kdf = new KDF2BytesGenerator(new SHA1Digest()); # SecureRandom rnd = new SecureRandom(); # byte[] encKey = new byte[256]; # byte[] randElem = new byte[256]; # KeyParameter sessKey; # # // Run RSA-KEM # kem = new RSAKeyEncapsulation(kdf, rnd); # # kem.init(keys.getPublic()); # sessKey = (KeyParameter)kem.encrypt(encKey, 0, 256); # # RSAEngine rsaEngine = new RSAEngine(); # rsaEngine.init(false, (CipherParameters) keys.getPrivate()); # randElem = rsaEngine.processBlock(encKey, 0, 256); # # System.out.println("E = 65537"); # System.out.println("P = " + ((RSAPrivateCrtKeyParameters) keys.getPrivate()).getP()); # System.out.println("Q = " + ((RSAPrivateCrtKeyParameters) keys.getPrivate()).getQ()); # System.out.println("R = " + Hex.toHexString( randElem ).toUpperCase()); # System.out.println("C0 = " + Hex.toHexString( encKey ).toUpperCase()); # System.out.println("KDF = KDF2(SHA-1)"); # System.out.println("K = " + Hex.toHexString( sessKey.getKey() ).toUpperCase()); # } # #} E = 65537 P = 164595018656847388234196458295155176106758058516345827114376462850563872821063372112958430530617671033588730874556123844100607371610222357044282210077745438573569464675422956060816242459751581224391340938674316979740379513584046730132237584210162428969621574895730609832661623255469386625333399495443111996269 Q = 154815693339461674971201202928063553732348769555838450004553011845712199598612461913292296568174793540787763943903927157071815682359748526650950854481712029197298601776364230444684691118479599447186381098181319184319389074673921642098571884038579323293539363273392989580933234215294363547330708372978868708523 R = 0E37156BA7E268DA28FA234531267352ACCBE1238096B46D1BCBFB9404309BF625A2EF0DFC7009DDD032A86BACCE46F105FCAF11E776D0CF8D5C8B6ACB2EA8A493D352C1394CCA37FE91A97A06758398F7C041BFAF0216B9DC9872223AE6031D995C15DCBE8DCEE7EC01FBDA1E485FAC4D3645C47617A03E941AFB0017A6BA48FB00F24F036A52029F0F032288AE9F010867C28C3FEE0A1289F2FC2302CEABC7C41441526BAB5F0B697A651C440B87752945944561471FBEEEC0E65F17B190F2C504B208674A9CDAF474FDF8F61371696105642E8FE700157C600E9E722200D371A5A177C98098F681632C1BFBC84DC7DFE8889E256DCDF8158277DF25B7ED28 C0 = C03666B82F2E0076C9CF78056F3BE5549A2BD03349D0D52160C3D9C1C2B46FB4E65642B340EE73EE73D301CE8DB75A5CDF5B972011490758A1E0314E0E7E4B952A546FBA6EE8AA7370B6773D6E591D2561148FD049E571A5D8AEAF2BE9EA90F15FFE2736D62AC13BB6C2BA0FC993E7CD72FA890E50DBF27554D3BF7F1B913107F201C6D9EA3E56C53E5683C763C0E7E23F1CD416CBCAD7A6A688AB400CBC5D87B1D6DD3612E2615C87B398AE42B43FD5CEAF762033AC3860C38E96CEF3E5B1180C0EB5DE5D33138131A78D12B4E826ACE6BE2F1954CD56716D3BD7FE23C7187EE40E34BF5CD0F01B0F9A6DE390830EC71CB9021ADBCE5AE761E6A1439E157E01 KDF = KDF1-18033(SHA-1) K = 2879A51427541B4CDAC3AD823C75FB2B4CF895BFC8F08DF4F1355CCE27C5A544B3701E91D4E6A8FB9FA7762168974202D6719DA117AB506386F6BAED09F1F8FB84620684AE4C962C05CE130D6BA770F1A54CA8C68CCEA59702DE33DDF456B0F34813CC8BFE6999C6086B5EE96122669EAF85FD427D6EC80250FB86D39AAEA752A57EDE4AD5802B709B536A42F1C9285BAA73884DA2E22204C0D60404DE70E24D03BBA5ED3A453782D0B49800EDCE562FE2793B6C9AA59881FB29992BDA65C67BF2625EBCBC66EE87F734C95DDFEC808EF6D44DD9682801F26D0F91F60F85F01A1A3D197CD13DFC2B174F4BE14CBB14A5946F8E22E9AC492472707DB684B85E0E E = 65537 P = 165682553981176118532729182146905998679943181743603610826612411317699124590307661258927675906473733978600336684278647483508039146807670237361320224284884260137823150284470410159567305207616168401019780840936247120935592214517200106038748853738693679377569061489838937379549520603546589138787128041588064878139 Q = 143206712570371537550995404277407237228050083266520061998580639832334534746420654502869922349173806485254421425144895914807064547119687982721578817558387859855456340407418648913018484932412203528851361523506272199499411641260838497681809120731343660418816310306493100346440107882636773330640419989066678161591 R = 28129474639D1203418D213E86445D947F72CAB0D8E7A3C71B1CBA0CDF73374290CEA1ABE108E4E449030D1E2C6606DA563BD752E8541B5B6E450542CC77DBB0A48B7A336E8733D1294DD656B39D8093A20DE7756F919BDBDFCE659AD4067FC25157282CC278ECABAA203831CA341189E4EAEA006703CF08F9A1C03ABC5A4FA92D40ECEF8CE50D4F2F26CCDC73628BBE7434B2726FEC43DAA57E84B506BDB5B656E2D955D679B250DD4B3338F6AA1987F8583963F714D42D7D44C5AAA6ACF0167880FD429C7F675C92FEFD372DFB49856F1D56F975D15C5DA34A9934A9BF5F07B4C3FEC7B5D28BB9B84C0F56DC699AE9B41E6BBD01AD1AA716FD5D8865231325 C0 = 1581A71B5411C07F1062F6C1336C5A36D2444635CB8F054DDFCEAC9DB1A0669C8E39305ADA0592D11950BEC110E864909102E43F83898D24D27F8537938AD0F9C944F263128DD43A34983D87546642494E1E9CBD2439D9F1BF4B82553C7442F59CC6D98FF37BCA1734F2041F448781B98E50C7B00CD6156A0BE94C54558B1B70CF56D525FEFBAB6791EE4DA16702D55A6E1A29E3C0F63197AB9C8C0F7A1678F786AF06D35E411044FCCFB5DEFD231BA565DA4E53AEEECA5A73A2A51FCC31504AA0F532B9EC9D9CF9DBD2B2F292EB628F698C407E8144365ABE978F746944E195E2CB0DDAD492F2DAD02C8ED4DAB0BC238902991C873E3DAB6F942627F35EDF5B KDF = KDF2(SHA-1) K = C5A2D782FE1C4214AB97F236A798AD36B64B0C8409AE3FBC59410DED70093FB4F7BC38B94E2678BC053D9735E09E6202CD477C74B101800673606C8C1F0A929CA3B1E34539DD7DFDEB800B42CF3DD6C14256C153682E9F84731B8261A8F45C2A6D2DAB0998BA7D3DBB29135612941B4A4585DBEF739A96DEFCD2B74CAF01A5E0909097B6DA509CD6943E89092E68D28A680CEF9C66D3CE9FE21361D29A555A9512A9C2E41C9D544286D4D4410CC88BB2A10E482DE0D4E6B315FF59C89DD10E94D627551409034786E6A2D208131F373B65109B243D470AF4CFC6A553899CAA3155A2175AE8839A4F055EDAECA1BC2684F939DCEC78EDF7FB732D7846B3A18625 E = 65537 P = 179755607498698915156472312052390412374888590078375696682532716957195195099259588363411397567713254275286890726691187860893111162737997682002393982240049851937818640585805951138169144697989793856350446557625052761041597980829377580837366042983675457609703917876740065059607053414664192851238580007259316720001 Q = 148719184858104886900273938140975358813632106139149548242878818497931617501707960253163319706085166733518552164915488661596182276698642829123689633530834640799438040580668970280384710610904953557835073384753529961289979742647223109396909547559071386644256344079306844126126599542442383558280600414522015893031 R = 3EE2CB0B6F63517F3CF563DFD42996FF6AAEA37C2C0DC534A394A5D993B4E5CDA2DBD3BB775BADEBFF1395F07D3C8EAA9E48B826350966613493FEDFC713CD7ED56D67619E01C87B7F077F463DD786A54AB94D69A7F4A0E2A1FAE9AA6EF3BEB65072752129FD50E69C7C83EF24185D0F6ADD80010A48C8209DB8F623D32758AC839CCFDF5FC9D21B300422C3D259E6BC93EADFFBDCD00233AD9A599852DCBB511C3553C56CD70638C208FAF37D1EF166F8578C6FD9989A1CB6CB2FD02A1D3678A955F17E8F9E3F102B04F809EB51AC2CE2F44DD71E6E92435BCDF0B390689634068D17FA5AB4ACCBDCC836543256557F5BEF58DF0FF610ABBAABA5303FAE786C C0 = 3F2F160FA19409E3053626B32D1C2404A01A036C05933E2C698FF22584CCC85FB07E022A346D229084F9C4DB15B17C6ACB2FC7B987D1ED0E276525113856A6A2924EF4ACC9094AFD0B27814CF3003964D3A2ED6BF9E2C1259DBB3866E8CC6459223B059B52F826CAC8FF8639522D1B96891033637A351236ABB4090F8436FDD57E5EDAD304E1910E31E2D4141CB418507256A5D4DDCBCBF460BB7331A54CE595900A7D4FE8BACCECEDCB7285250A6294EF6E6A1B1D07D5B22B5DE495A081404DC610F422066B328A200314F5E4061D772FDFF8754FFD843375BB83F19CA5D92B057556F9C90F288008E4A493AFB48098E5BF16A0566C7E7C6AEC8CFDD2993DFA KDF = KDF1-18033(SHA-256) K = EB904FC37892E8154D04243A85B4B4ECAAA57C4CBF270DABAC718FF187AA0850E0F2E7E0BDA0DE2F906669C4735F236CBC4B8B295757C92A76FCCD7E19B66B18416642B63477978DD21950520CDE6982AABAFFDF311C9D9D666841297FC6EBAAD1A303DBCD9342D524A860FBD9459921A2ABD9C7A7A76C5976FD825D1F190750BC9AF86E93A710BD1F6423B24949F74DD3D47055ED7AC2FE0731B95A1F6CF800DC6B01FAED1FBCFBF7739681A091BD71FF348DA6F873AEDF74DC78BC51E0BC12A7D961467349ADAA903B377439DA8B89B59D1AEAC218171DAC7D0161652876840E83ED257E7F442720C7A95C789C3BF71491ED9FD614C2F8361449DC828989F6 E = 65537 P = 174046890283469981585949748084588782939194923413091656190673083567523094911170964227361574020858404084585662363904510122441927570563481403504090513712717690123363848523867890907908094889910522763278946428974722067709246573085561453779287668510821777191086478423606338468569126373720116453187524405485772061839 Q = 159886943456237230511782182155135817897256893518822406366694405173420983366707947079250785226814562408785742924747520534652016503484243119104833754434242033432495210989066912519012696876909415983027430528396497006208411998289498383728139997758102585880193256248894236292500748201796836402007794726533935272231 R = B4CC3C096FE80BF1E684AF845BFC800D062C150008FEAD3BE59EFA151CF17396CFB3D46BBC92E0CEDEE58430C6D2C44B58A9C2A03C2A5CFAAF46BF1F8D1DF41A5371C04060688448DFBCA47D3A15B3C385283427ECCEFEE78C66491DC6760A2F455DB153C26738985841A47049458CD4753A1EC48519030B6436A48A68E8534981DAB1AB0431DC4A7CF587D09EFAD13406C51C74D5CE8D66525791A2D8A916908F691CBC7CDA5205C2D63B7CAD7FD2144D2DBFEF8D8078F87CD26A6F4E5AAEA16E5FF5EADB0D9D4F9CF5C66BF9B433499B69CF2857EDD03600253305E7D2FF94C3E2A8083B423484781E7A05229A58AC07911811104EB8DD0336FA576F5A8B35 C0 = 49913BF2D62222EAAE1DB7F864879777BF4692D9FD37403F7507825ED715E87DF6D635170A4F55045B02B3464AF353B7E2E601640F44E280B1E19E158785C24BFB9762A5BB8FB00809990CB9E4F1771F1E522A89EFF67659CB8916B1393E19909C480EF38C22A3170C28C0C4EC60C1CEBA00FD740B3AE3AE7DFBBE142D251F4E985B95C37A1516840F2B942D18F2A0E652226617D46C4629419DC46413CF0D084AF8E02B011B2C12996187EB0550918F9AAEA2572A0D57E5DD2A115E51B9826F7B4C3D55A68F97F97F69800577104BA96AF2D6BA5093A614299F0D9DB12B9787D30F78958EFB5351E4C947A6C5B7C1A6575A6DDA273067FC6775DC421BE36F5D KDF = KDF2(SHA-256) K = 428A41D3DD6616E53FA74F810419051EBDF681B3714CA3F26170C78E17101B5C539FD6B02446EA3F7E3F4C769A0FC8960DEACB10FECF7AC1F4EEE2FDD0BFF8E84ECF02E7137C53C9B003DA9AAC897A6BC53590013037497C78C76FFA6DE9F663023430DCAA9BBFDBECDF040CB6A53233517604CF130F27BC3D6071160A4F3C7BF3025B391B75BCE68978D22530047C88210EC3B7D5C70B818EFB918E9BE81A4DD4E43C3C2234A0EF04840DB4092FAEFE6B216DA7E153B8D3306583FB2605635FC7EA829D28C78DFA6A268F83FF0C7413203C8E4D0BD6804A81C6E89B7D6CA75128BCB08CB6034FBDCCFA21120A03419568588842C76E020A0421A8A87E64251B E = 65537 P = 146322265547229421453860780971902143051303041033416042645882020825094157913878642939804253448552439940923642759323031670253155786844025280534330614230541220963959783346500062839405049709904412394986928442891456821174158709683716293283651651769705737708866705750158297813695995634661647418391504788057547514647 Q = 129767039082616161544399761373644746030229222410917829012071323664225125630516983958202525186512259379284360095733938992803044795665548845422328358269410402137832225443746550997158014332624820747790487469585420099915597895802412802364656829129766039650228465555912059986552091776600128100526678441920008253431 R = 0A7DDB169851D28F0A0A330F283AB8DD63FF201668B17AB9138E4BE781D7963376A2E242C30664182422338704FAE793C8E474577EEF7382AD46635157840DFF73D0E72FB3F248F5C79EEFA759379D3CC49EEB8B4755EFFA61905A8FE6C0A20A6791D5DBB56DF9D974B9EFE0AF7804092D80FAC58F37CAD6367AB5BC3C183998DC582CF2DF7115592A23E58E1C40FD0CA76E6C3EF2620B4A4451FBF0379305E6333B18C95FA97C88F0AE985D2F091F2B0359000EDD5A67356BFCCE6B89ACC38F99035628A9D8FC946C13399D9813650ACB2C672C01B43FAD68785063A74FCE2B134050606B92ABE1E1C00685FE2C3E781F458C525E017BBAB8C3FEE99E4C78E9 C0 = 40B5857B61D2A93B5CF161082FD038411A66F050D67E7F5311259558F5C39E2A28B4A11EB589751604E6DC7C1BEB202AF36DDE8E989C7D417FB57B463992A87DBF6156B6D6CB1859192BF24880DFDFF029B59E89E1880D02FE034F5FF7A6EB261D246BA01EA99ACFAA63891D8D407696AF6BFDEF8E8ADA674B64240B9DA8158D8702CED3B1C53CE8873A211846C78731E1749FFDCEBE7A82C06FB29D9120C1BB010356D4706A0CA63278D54F1A4B4AF2235A960376ADBFE1009569F47BA0A238356137B48C898256117F5649DA7CD3B37E07146BE20503FCBBB7B56936F55E644274DB8FB223EB742F6571C0F138BF7D47D7B22B74840F7C25D6303EE509ED90 KDF = KDF1-18033(SHA-512) K = A7578BFE83F5DFC954AA77B1500223ADAE95732FE4E0F9A113BAA64FDCB9B6DB90FD0F5FC368A03260F6E6D9B7A09690CC3CDA377DF6F610305ED5B1081DF74FF652624969959528610D7213673B1DEE617ECFAEA5C2B90A51041AAE90C3776BE3BAF8C34F3E3C6697BD68C0E30CCF2017C3D1BAE437FE3986F24CE169FC45C5A66D77EE3907F3DB528DBD1130B50E5057ECD6FF0AF0A60B0014D530893C86E09E6A648BC90FEB05C25F2CCD5E86C7528592FF327EDBA50B24B70962C9A3452C95A112422DB2AABA0CEA6975C618B416D5BA9839F07EC6EBE546FDE124E3711444E163C3FC35E3C556225DB8D4609D82A464F8A25B947FBE07BB33AB68CCE7E2 E = 65537 P = 173466727612170665053230974561284992669615075850373117935328353815057776125036931883590530932574436808197614319625448483719789159280294890998552972249170781694144018291911167398959048875645193355003315200680151736397370782143501256220377331633473554658664634675386428423257172040331555908065971198679611755071 Q = 147514752710875817505922751816319995058312482129669054703409146925442819936600608407673355354605646058684922838932503269856024866278652403898079964020914797278930030920509188075473372339780176843394194955659795410885348609060042900468496002515833355095851932369334931994425808408373828494286063225583413423723 R = 5148AC6B207F40FF0C045F542B69D66DB95FAFAA8BFF49C586662300106FBBF820D2C419C9BEEB826D3C3EF1E67036A448BB5B95F0EB4B50371AB511638AB7FABA8ECC386E9E5BB54645CE111F45CA78E4188BE7B892FDC01D04E92D89709ED4F19A8C4226C929BF150D8C9E4AA1B9FF15A515A248467E2220F9FC1A04414344299C5A6FCC08212E1613F6E67337B9CC972A0D5321F387E6803C702FCEF97FDB160C828524D22FDF78C1B5DF05393EBE29100A5826780D28E2F868139D97D43F6D5CAC4762125796043C8680171F2F1E58B286052350FEAF221371EAB7E24C5AD9F7EE1E9C722CC26963BC51D2C39688E987C2BC0407E33FAB1EF191322C4E24 C0 = 20BF68E7E981F3BA049692825770D1A98F2E64A5676207AC292E0287B7654315CDCD18791F2A68AF1AFAB550D4BE19345F0B22B693C90C79A4C88D46AAEE16A0D60A8B7520F8D80258B35C60B331F927A0E5045AD537116E77F887431966BE730505B951A81D34C34D5FBEB22D1A498C917C4648173EB5EC884848CBE01C3294C3C32EA6219A5E7B11BD53D4FC25B27A9F980B3E41022B4ABA0F92EE0A7B005F8D64229CCF0B44FCC21DBF64AEC354FB8F2140BD25AFD5FC9AED9EC7E53356CDBBCB556757BFAB594A5A13BAC870079F902AC310CAED87E57542DFBD0D9DE554B19DFB37FE04B7912B263C08B089E3A0EFD4DFA5E88995873C581553F3FB98A5 KDF = KDF2(SHA-512) K = 487A8CDECF57A062E9FCFDCC2EB966296DE5874CEB725D15A17EAB2E55F622BA01E3863D7A8023D84BF043FC067F0710DFF710C0E7E4BAA78383894975050A43AAE975A755657828EA7B421E2E131A50CD43908AE9D8B7C3215BF6592F93D4D3DB0E15583DCBF91AB3DC300C73319DDF273D6B3169B4B0F8E1209361C7191B3D455D52C7D1E94B2721CC8A3BFD22301757B04676B192342643995D940E3C8D393A8A2D0A6F20D3DCDF112B9DDE4AB2D094BA2E696D23BD4C0BFD97623FC1F950D8B9CE7686AE70C5E0598DB6CFEDD7AE5370BF152B26DC5AFAC08DD97D4F8BA358D08E6D430B458B11DB4278F8C84DE7A09C2882CD7AE0C36F1EF13F7C6DFB95 botan-2.4.0/src/tests/data/pubkey/rsa_pss.vec000066400000000000000000002362371322470703100211460ustar00rootroot00000000000000# Based on SigGenPSS_186-3.txt CAVS 11.4 E = 0x86c94f Q = 156338023434107979514651798338563729249637525912770090189351441368020822580195477433999745376342560769338444087025460664195379900278296370069437383921420298228076331163131415651674241580325904029529616128045922103438679524384712750110560116385373016303987411746090738658853448866856795937640033117238282529951 P = 159091101059309944675449415093816973225018412330812326122276608906226478900324531221650142639015227567363097556108175722263356910366474614050971930072283120034761496108797309092812361209374083446121533016294833574983047736398746485174145216858529564223319486591370822604882909167368622594449311655525194716337 Hash = SHA-224 Msg = 37ddd9901478ae5c16878702cea4a19e786d35582de44ae65a16cd5370fbe3ffdd9e7ee83c7d2f27c8333bbe1754f090059939b1ee3d71e020a675528f48fdb2cbc72c65305b65125c796162e7b07e044ed15af52f52a1febcf4237e6aa42a69e99f0a9159daf924bba12176a57ef4013a5cc0ab5aec83471648005d67d7122e Nonce = 463729b3eaf43502d9cff129925681 Signature = 7e628bcbe6ff83a937b8961197d8bdbb322818aa8bdf30cdfb67ca6bf025ef6f09a99dba4c3ee2807d0b7c77776cfeff33b68d7e3fa859c4688626b2441897d26e5d6b559dd72a596e7dad7def9278419db375f7c67cee0740394502212ebdd4a6c8d3af6ee2fd696d8523de6908492b7cbf2254f15a348956c19840dc15a3d732ef862b62ede022290de3af11ca5e79a3392fff06f75aca8c88a2de1858b35a216d8f73fd70e9d67958ed39a6f8976fb94ec6e61f238a52f9d42241e8354f89e3ece94d6fa5bfbba1eeb70e1698bff31a685fbe799fb44efe21338ed6eea2129155aabc0943bc9f69a8e58897db6a8abcc2879d5d0c5d3e6dc5eb48cf16dac8 Msg = 5c61546b848a36e8e51f8beb1140823dbd95b06660924d16fdf9a1c33ca0b994c0745e7eb5be48ada8a58e259cf461a95a1efadb0880d1a6fde510d9d44f4714bff561e81e88d73a51ba23e8ca0178b06698b04dfdc886e23865059ca29b409302eb44f2e9704b588767327ec2ee2d198a0cba0266f2d39453806855cf0b0cd9 Nonce = 463729b3eaf43502d9cff129925681 Signature = 134e6acd94b76a86e7ff730f064a3d480d1cff1687b993163ce09f21d494a4a15e6d92758a93f7c83ead21c4ca290f9478241c9811c231f32d9d17e0b479a9b34cad02e5bbdde6c8e4ec4f35f93524f8afde49e6a4740bab2f2fdeff3fc5d92a1b50adc7af964eec82fb80be24092ab28791807c664a9106b5df3296747c014b75d69d181f2e58dafbbf9127164f88c862a48d5e9edcd6d2b2cbc20abceb0e98c7e731d27c8d04fad95ff50dd64af20e6388ed74b9b3cf33b4a316b0c752f33697e5a7445ae2f726f30333f107928872776225a3e0b1b14a7e84f9a695c7b3910330d225b4834110b54d6b05e69df6b7a2c9dc352942e3bce970cec677253230 Msg = 7540edea54a4fa579684a5b59c51eb20e61106f82157917c6173ee9babe6e506b6198d8af24e709dcad6ea372684d2e335635c1569a43ebec3da121e506afcd9f43c8c4e66b7e6247ced2025a912eb50c43376290a248f5467bb0c62f13b69ebb513b2ddb7c9a31334310f2a2ae27e901bea1add0dc1cc67d57ca21095437463 Nonce = 463729b3eaf43502d9cff129925681 Signature = 45541aa65fbb0773b1434c4fdaafe23fe800f78eba900c6104a6f0e76dc08daedc28a3380c8078f82055cd4a20cf30541c32d9ac625378355c156880b35a29645325d488f7a0d2de7df92cf9bccdf851445c2b834ad0e6849a6549db72affa7ce66fbbfc5bc0194504a5fb031267b6ca9b57f583e7e11c927e3dc203f7d6d4b9df675d2a302231400008fbbd4a05e17f88bea074de9ab8211a18dcceae6c9fd8fad96ce0626eb25c9ab81df55ba4d0a6ae01eb25a2529e16c98ded286cb345d4fd59124297ba9b3efcb67884ed853ea96d74e00951987bcda54d404d08f2baf7f0d7ff13d81d1fa20cde1d21663684c13ffc7164448f4e85a6c811a850a3faed Msg = 840ff32993223efe341eeb55558e6ab1fbae15d17bcf0731edfd32d4dee0ac4145e04accb88c7016e03d27d72bf670dbc08fd94bb8134d2e8b66302fc82baca10ae445c0275bb43aaa42f2ee841693f3fe4955dcf29ff93a3bd951636a919b72ba650d8f4757b1717a747320c8b479009c22b20b913cb25ee59dbdf72bd921bd Nonce = 463729b3eaf43502d9cff129925681 Signature = 07f07ef5e793d59b0c3f899dc846bb831d88dd4d2d8345ad2d726c5c532d13e05b26f0fd03b2b9bde7b6d5b6febc8fe5d3228887eac443c99ec39fffeb939785f87be8a93e497cfdea3d8d06356518a5254c5946236458b29f1cd47e97718c805b167791d10f9304328635330116a2aeae1e0ecc16bfd5a31356d06892b8ca04aec27a417320be7bf6fc1083d70fa522c23850f5d6beda1a251d1a5e71762bc8fd5f16ef0c7a961f4858a5b760a8032f3fd6bdce2ed26351f2beab8b89d9312d88736ee5253a9da6753283e5b3d0d9cdd3e19ca0b60b9fae3e3dfd67831df72ed9611d5f2b3ac256052a207a5245d2cdeaad0d1266c7177b1a0844d5974a8a41 Msg = a5fb396eee4045f886191f7ff9ea68aaa1bcd8e781903b6071f3ba2b7cd35cc08691cdb131575d9502ac4b45c046444c1d1f279899cb0b76a20883bd00972148704a38aa8f5fe61efa0c52bdb45b33f4c83892342fc8d0ebf3fdeab49568fccaad4e04c3d0fde97bb660bc4e9cd23d8ae830a1230c3292a9acfb787803eef72f Nonce = 463729b3eaf43502d9cff129925681 Signature = 4428c389d0c80a9320e4859e41cbd4a47f78e4da5d1c0644ff50bad172de9ffe74d84a76d6de4f72bbe34d7dccaa03e1324041cb98308d73dcff0bcf7ffc35936473cf3ec53c66ea8a6135742e0ea9056a4897a7cbd2b0654b344786bf3047d122dcbbc4bea1840e84bce066c3385dccb021a79e8de18dc114a40d824141d8331a4df6901b3409c30552519b097a96ded6793cbb9ae18bb9a4185b6f4e83aad6dce878c689bf595d272719b9f50b3ede1803dfae6dd3f54e4ca9c458c14463f4f19af6cc8127bec80a6a9e5a5fe0d3e14dfcc6ba052750ebbf84a652adde9d6be68d5b134cd09bb94d0875e5527fe3f3fa2a516dc05c14fd5516dff2d434f0c4 Msg = 6e891589d71d2eff6cb986b071a31e2696d8ce671fa18c244267eb33d0c8e24018ebcfbf0910bb24966be0575f3268628df5786dfd2e6deda219661824c5029ccd6b6b90a60093abdd06bdb46aa74039f2048784eccb5dcb020767a7ba3df2c755b4f0e6f8143cfa093326afdc2b2b138fb0049332a0e3262bdcf9c8d9573b2a Nonce = 463729b3eaf43502d9cff129925681 Signature = 01909328c24dd0ef912040f61492e3711243f8ca1262067cca6bdab165efe4157982323f13152999e9f21e6852d8c2efc4130e2c46a38446aacfc59fbca5d1a38946923b7e08be397fb787bc79a71ba08fc2b693d1bcbe897d1dface2858ba80a086a0e0a45efe66fd5350add819fd0dc1931d3eba2765f84f147422f5330d0efa0cd827197a5d89e2dd62db9051d5df8b9680169f349086dd038a9ac62f9941565b3f747d528ec4c36e9c948ad3a73240d07ef14b354ffef1b1965a9aafb13d0fc88a09707c6a0ad3028d5a5c6efaab50aad05304b1d5b2930abb8f58c0188b6a94231f8698c96ddd614343a0218494dfff9a293dfc7d5c3b5afbed8f079458 Msg = d66747638d8276920352b215158cefe0727a5e2b079d892cbb969f265d470ca2da354dfcb4300322af374699ce963bc17d51e95910c548456c8d9b8f04a300ad08c74602d825fea7bf32d56aded7211766d1b9f70b580a97b5fe67ca78dba1f1c6e7d87ae3a790a79a0c07912f98c76c94c2770cdf9cf6a8fcb3abdf9f3616f8 Nonce = 463729b3eaf43502d9cff129925681 Signature = 85f296084bda823556aa369e5cb19e10ce6e982a6d10a85ba6af6d3fed8f2c05599faed069215cc9eed9e72a4fe510a6c09ff721cf1a860e48cf645438c92c5c86d0885e7d246ccf9d0cfd8c56ca8d673b7094a3daa77db272d716f31b1380f72b50378f595471e4e481851c57a6b574bfb3fc7aa03636632045fcc8e9cc54594759f6014b527877e605ef60cf109b4ca71e772a99acfc7243318655ec50f74e48485668ed42859ff2c5934581ba184d926c8467d7c35257dce9964049568a990f65d591c2db86b48a7256da947fd7d978dd6734bd8685025d1a87e32f52a0299394c93e6d518b18e0b8db1d763f46905f405df0cbc8455e039f173e2b68c9de Msg = 23d92665e88a4f6f732de384034d493d5df37b767a8260557de05688e8d60dcd0eba9cb8cc4bceb174dcbd3c0ab5a37db3b6ecfb6a3d90a4f54a9f1117e11e0c08b0114f22f2d98fdd93c0b9fd95d37c0ab2f00701431f1449602525e849570df704adb353481713969a148546b680424c30ad24a75bb6ad616a104bc2d562da Nonce = 463729b3eaf43502d9cff129925681 Signature = 8beeb201aedb9fe7d535fc7989713062497a03e18ef9977b98a93f18f37545c38f5e5206e2b5df7f4a41ab9e0675f7d46d172dc3af90fb7b1a6fa6c986b803a7f2ea4ed217872cc686165b1278450c23c329ee2855f65e651c3db085e407bf3e3a96eaa833ba2056a084031546cea2f454f7acf84c3b90fd7b6210ef6d1ad71ed1b0049262f5b4e3ca99d10a3307752b2ad8e8fbba3a3e8432bc966553901e87150738aac9170fab1d27219274ec528299f8afbbd861ee837f2c86ecce7e73c9b7bd6f6661d1efe3fd2ff7b3efa0d1fc7b84fefffa14b55a2c5fe3252cae0cf0da6e50e3d615f86ae6721aa5e29ed3a1c71c243c2529eef483c56b902e93718c Msg = 40abb42db34067fadb5aacbb2fdedd2d0324030bb75ca58f2e2ade378194b2c5f51ea2892b337ee297c77b03333b86f37581d7d77e80c87494bae8f0d22c4bd81e7525685c3b9706e1cbc90f2bff39d6cf6553eab29d41987c0304b14a8fc48ea4f96450ae205a6ca2acbe687df2a0dff9199fcbbc7bb704cf4e5b035184c4ec Nonce = 463729b3eaf43502d9cff129925681 Signature = 54bec66241dc197ad92e695526b3b6a030216b48af90d93c36b2d70644e40cda2cb259f27ca9d141e5753f938497e84208b380ffe1788701c71d89bbea3edd352dabd32d9425edcf9a33e185cbc4031aa6069863fe47d499536a59da12a8bdbbf2a3a9f0039318d066f5117bbf6fce4f6752088ccc3a081d85da461a8bdcaf349fd4054f76384e668d00a6f747688c8420c7e452b0736ad62e1738a3f10cb62bc7ddc12fa670f858b2d5def9a42ac8f2fc91d488738a7c23168f51ddfbdae6a5d8ee1fc561cc3add4a7e14eb103bf9593cebf391c1f7a07d262faf03d47d07424ffb3a916a9564652a1be020a0e922e99a57da1abf931f74cfbdd484c0a9568f Msg = ef10b03c04578bd5f783358df367456a73de38c6fab2c35405bc685e3d4c4850f2cb387ac59e1612a44e5e78fce6f8be299d546832b5b970b3a3da8e1a70abb6165f72e14dd021104e64e38ec662f576f65ab776640803d2d17abdac6c75ab82451687f804b553d8db0eed57b9a3e39ac15c8878fa714882488938409b24f1be Nonce = 463729b3eaf43502d9cff129925681 Signature = 4a183b82616f3bbc27a146710b28729161feb17900be62e69eed5d254d15f34bce52d6f3deba89a787ebeb0611e240cc23e16add3796d4a29783e2cbe8797e066cecbd66059c394f0e2f9e377f1ffa194fcb895e1c48874b9b6430a13c779f5ca29e3f42bca4b916710590ab6501809d645a4885b058dba0647971f04f6f2f4a296c45d89dd848b7c2f8777ec50846c97d35c12d54ebb6ff167327b1d4daedf4468031b59057d57ceddb79fdd013167ee6e46d9130693322c3ae6702901a1e90bd4b621d141977d0680acd524921bc540e34ac640ace02f89d5436808283e026e138ba3a5a4310fe1e048833f9b581baef5f891f9cdb2f0673bafa11ceabc7d7 Hash = SHA-256 Msg = dfc22604b95d15328059745c6c98eb9dfb347cf9f170aff19deeec555f22285a6706c4ecbf0fb1458c60d9bf913fbae6f4c554d245d946b4bc5f34aec2ac6be8b33dc8e0e3a9d601dfd53678f5674443f67df78a3a9e0933e5f158b169ac8d1c4cd0fb872c14ca8e001e542ea0f9cfda88c42dcad8a74097a00c22055b0bd41f Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 8b46f2c889d819f860af0a6c4c889e4d1436c6ca174464d22ae11b9ccc265d743c67e569accbc5a80d4dd5f1bf4039e23de52aece40291c75f8936c58c9a2f77a780bbe7ad31eb76742f7b2b8b14ca1a7196af7e673a3cfc237d50f615b75cf4a7ea78a948bedaf9242494b41e1db51f437f15fd2551bb5d24eefb1c3e60f03694d0033a1e0a9b9f5e4ab97d457dff9b9da516dc226d6d6529500308ed74a2e6d9f3c10595788a52a1bc0664aedf33efc8badd037eb7b880772bdb04a6046e9edeee4197c25507fb0f11ab1c9f63f53c8820ea8405cfd7721692475b4d72355fa9a3804f29e6b6a7b059c4441d54b28e4eed2529c6103b5432c71332ce742bcc Msg = fd6a063e61c2b354fe8cb37a5f3788b5c01ff15a725f6b8181e6f6b795ce1cf316e930cc939cd4e865f0bdb88fe6bb62e90bf3ff7e4d6f07320dda09a87584a0620cada22a87ff9ab1e35c7977b0da88eab00ca1d2a0849fec569513d50c5e392afc032aee2d3e522c8c1725dd3eef0e0b35c3a83701af31f9e9b13ce63bb0a5 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 492b6f6884df461fe10516b6b8cc205385c20108ec47d5db69283f4a7688e318cfdc3c491fb29225325aeb46efc75e855840910bbaf0d1c8d4784542b970754aaa84bfe47c77b3a1b5037d4d79759471e96cc7a527a0ed067e21709ef7f4c4111b60b8c08082c8180c7c96b61c0f7102ed9b90e24de11e6298bb244518f9b446ce641fe995e9cc299ed411b65eb25eaae9e553484a0a7e956eadf0840888c70e5ca6ebc3e479f8c69c53cf31370ab385e8b673dc45a0c1964ec49468d18246213a8f93a2a96aad5a2701c191a14a31519e4f36544d668708ff37be5481cb0ffa2b0e1f145e29f8575dfa9ec30c6cb41c393439292210ea806a505598ebdf0833 Msg = 7e6690203cb068b8530cb1ff4eeaf0fc69a4e304f556072dfeef5c052c886c83e7f58a3dbe9a58dc0a808ccdcea9f33ae2a0b6395153dc43ff2510e78f40a4bf8328d7a4a596531ea683fa1e0683e2f033549e6bf5b7c06b097e9b810de74ee89c28febbb94b6266713c855bbc21c706a5e92502aa28bb8d662287396d2570e5 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 509a01bb0360d1160ed3ff33432291cfbb63daa2933819600db7dd825aef13dd1e9a888a9fb6fea93debd4cf4bc77129b06dd4727193d7e8a2e5aa5a6020b64524e93abb0406f5a18f74ff0aa804919df4072e319ce8234431c94e8eef8c5ce813a07b2f66dd6a032c3e69a3c58c6b54acf08bbbb019df15f3abd22c67f3e2cbffe99887adee58a39cc30ac45a6e6e59283ee0890aa87072a857845f5cf3ddacdc776e58e50b66e95eb13dec49ce45505c378734e964e8095d34a01317768b7b9fbef6eb24b08b1bf0312ab51e0acea4a3dfdfa6fa7bb115b8b685d354841d1901bc73cc655ae246a5453ea8d160610425c2c14969bf22a7e11e663cff1501f1 Msg = 1dce34c62e4aef45e1e738497b602e82c1fe469f730cf164178b79fdf7272c926d69bd1b5e2de776055753b6f2c2bcbf52795110702a5bdf7cd71f6b8ccf068ee0ddfb916abf15458dd9764f262b73c4c981f5f64de91e8d8a6a30d961f3ab66fd92b6d159e6c0db02d767bc1f8499baae7df9f910338495c8ad74ee807c6443 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 1bd79d25ac6b0f242f39555c85d858c23680e1ebf9590d05463ebc58454a7822cf0e0c2ab9872b6eac5ae8ce3da773d6b2039e9b26ce751dadc48579320ea63b978b0df038191d9128102128a365c01d9e2b43fe2b5ef1ce9ee8f4a1e12caef1bbe7f3a8d1a93c9f399753bbfd60d22d8f39206a511ea448dc23cc0e4fcf0b77d3f3fbd9188b740de3f85009de94ee157dbf7edc3165e9f69b59db37f7fdc507496de8941a2a2628774b06c8cab034bbe3d2c04d253b5948d6e5712373ada99b7f860612440c5eed81efeea18d76329dc30bd9fcc500e92315677142d5e1b6b45ae0e6e725122f046c9a544ad1ef1ddc7c6b2a7809715ab75ef870ee6670627a Msg = c32976432e240d23df6594f2885f00db7fa7e53b7aa84ef89798ec149fab74828b86423847f64285b7e210a5f87e5e93e8c2971ee81bc13fe060a8aa840739a3d6992c13ec63e6dbf46f9d6875b2bd87d8878a7b265c074e13ab17643c2de356ad4a7bfda6d3c0cc9ff381638963e46257de087bbdd5e8cc3763836b4e833a42 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = be69c54dad9d8b6db7676fe74321a0aeb08d1cc17f6607e87982f99489344e99378c38341e0e605b8ff903c74a973872a9880e05a8ef0bd3e6049931acf152dd54fec9105a57b73f77631db736b427f1bd83275e0173d4e09cd4f8c382e8b502a3b0adbd0c68911d02de17fff3d927e250e1826762efc0b895dfa502f18dc334b4c573f99b51b74fdd23009861028f1eed6875bf31d557acd6de8f63fa1274f7bed7a1b4c079f5a9b85bfab29f552c7f647d6c9241563fac123a739674b0ad09c3f94208795d9a50529d799afc597e025f1254995f043234891620b10d5c5569be14b0f463a495f416024618486c7ff5ec775cfb46fbdff5379c5e09150b81a3 Msg = 218551f425b3557d09ccfdecc9ab499085bd7fe7d60820be626c1a9aae293f5734a2f60fb661313dd15a9f22d5742268d4458306f91d65631b4777be928beecd4af733a416e0d8d94623d1e67bb0e1ceba4a5204c088e98895201953646477f58a0d6e7ded3834998faefcfe63686e0a5f5354a8d2509675f87f6821cbbdc217 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 96a269e0ca4af626aa8b7f45acdaa76d5dabfea5a7d762ab39b138dc7575fe196aeb182bee5b18503969b5ba111f057ccdbf292d7488173a4a4dd04e62c254d502673d5a076d326c66c9a71a3b83b1005c6366f8a0902987dbf08cee7562d0abffbdd661c3525be8e12dfd73ed31efaa817f61e7fef700a3215e77b6231d59c098fa455b69ec6e658a66cca2e8f2e090ef704270995170ba9a1f561b848676804413645a943d883191d95b024d6ffc9cb611c68f3319403bd7c07ac6694501368e8147a256e928604b63d50e2c65f3b2c30df1eb0363e29fe448f94b6907cdf42fbc9c27b31a43a8f5c15ce813f9b20d16da6c298843f052ed37678b4ef1d78e Msg = 06b76aaeb946fe6867e4716a8f1ee8d61c483ab345cbf8e5b2bfab5ce0bd5c8bc6ee5a1cb96837e28dbb140ffdc61ea74cd059342dd49dbce11bdef09f10b0a638510989fb02490fd66679acbfb0d04652167ce8bc289fbad760973196fa8283a405015e48bb3dd98c0e28ab9e83069a76432b37b97006c9deb55e878f21dc0a Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 65e2358bafc9fcb65536a19d27f710596cc31f9a8328cf9de21257506047ab1340a74505581a54f258bcbe0c1520f84ebd2e36913560dbd71574e3738428097d6b819e6900f27df159dcaf08c6e1591b073bfefe3da6bc827a649e0bae9c52fe9ae180d1efc01e5a38adef102c6d106af12163b1a0f6d1543ffce3980ca0f8b70d38007288d47bc565e995b8c21da2f959c928aa2f8574a660226048dc9dba59526a30e3274808683b41c0cf086ea5afc48eb294a88c4b8b7383dae6469e8483345b1daf1d2801bda93ff91ca75dfaa8dd5d47e73cecf0efb0629fda16c601070bee2e8cc0695150739202e3be270b9801d085e11e1df07f9a4cab54fda23da6 Msg = f91670bf6b8bf5c8c75056d844168fc6ec0c28d09400c1df11c7ef0da9e04664c854b7e8f4e01dd8035612328c4107759bc894aaa9d50ca5cb7655892983f68ab28172f70ec6d577d4de8c93fe2e79749ad747eec2ddfbbecd89cc10c70b35451f6448f2a083452ca2ae6b0382240e4c4f01eaa4c661b7b181c8feab6bc22a1b Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 2eac03233c4e24b3328447cc09661c259676b569e6a0848b5a193065296a59e3b6d35a2ecd91c6cefda4f2bf9f2252a27334fbbc2d79e450d44bc282f7d7321b46f82028c154f30f6d62edf3672a1019d914ec617aab2d007f844e63e295bbd8f66163deb278d99d66fddc58cca2b911ce0af95265134af55a4b786cc214fa11ffa29bcdfbed12c5ce6438e9b6beaeffa3587978a83409c29f115423174c05cb8c30198da8b193f9446b9b49f7e3e2862ec9a350e8441ba4e5550e87db54712865fc2690a5938aebb28409b88cf0d172111a74f678ee0819ff8bdc22b08fc6fed37b676d0705396f3247a267c60f7ccf1fb260c0c2e924c1ef5540eb6125f3b1 Msg = 64e3f541453170db952c09b93f98bcf5cb77d8b4983861fa652cb2c31639664fb5d279bdb826abdb8298253d2c705f8c84d0412156e989d2eb6e6c0cd0498023d88ed9e564ad7275e2ebcf579413e1c793682a4f13df2298e88bd8814a59dc6ed5fd5de2d32c8f51be0c4f2f01e90a4dff29db655682f3f4656a3e470ccf44d9 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 76c297fbe302f686377cb155ae8a2b65a6c577af303035c4a755fe67014c560476e7a789b8f2195b0f80416f5f33b7fdccc380f988cebadb640e354bf5679ee973a1e1485b68be432b446ff5949504515a65cddb0faf6dcd1e1188656ce941af3ddc8600cf0e4087ac8382f0d5061d3d05f58c9362eb88f30a724d18a15ee68a60c5e4dedb4084c9d01522999092094c85622e67a66ed034564ac286b0ff8791e9933a23f83b4a88d2e79e3a29d6a3f87e63bb1a96a6bfd6898edaa938f74c72d6c10cb94d055ef3fda9e6dd097d52738754800ed403b1444195a311fd6962007999e31edcf2870d1c3ae3b3646bc7da55e5f1e6627e6248839e8f70b997fc1e Msg = 33ba932aaf388458639f06eb9d5201fca5d106aaa8dedf61f5de6b5d6c81a96932a512edaa782c27a1dd5cb9c912fb64698fad135231ee1b1597eec173cd9ffd15270c7d7e70eced3d44777667bb78844448a4cd49e02a8f465e8b18e126ac8c43082ae31168ed319e9c002a5f969fe59fc392e07332ba45f1f9ea6b9dd5f8a0 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 2891cbe23ccf10c396ef76a5840adaad6498b6fc8c6a2f6c26496cb428a9221ed59b3645f9a25f5747feda0f51b45319e0978f22ac4facbc15db9a4e5849ac2a1404aeb6c00e5eed3c07eeeee2435668fd17f16ab244c9d38f9ba0de9d3f3ef0d994094e92e327948f1409ef827752344a1375f608dc3cafe74970745a023b320b3bd3171b62a68a5ccaadbc64b82cee4b8a81840ed8b751ac66a29eb81fb819ec54c76b01c7b412a43ea057a80202f1c3c06a4ee60547c13c6c2fac34a5d5aae982b9dabd119b470829bd77a560e0973409115bd1ab5bdc6bb46fe4048022b0cf4fc6aad4184c28621ec6f82edb54733c902620bf45f2517f24902e56d58038 Hash = SHA-384 Msg = 833aa2b1dcc77607a44e804ee77d45408586c536861f6648adcd2fb65063368767c55c6fe2f237f6404250d75dec8fa68bcaf3b6e561863ae01c91aa23d80c6999a558a4c4cb317d540cde69f829aad674a89812f4d353689f04648c7020a73941620018295a4ae4083590cc603e801867a51c105a7fb319130f1022de44f13e Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 2ca37a3d6abd28c1eaf9bde5e7ac17f1fa799ce1b4b899d19985c2ff7c8ba959fe54e5afb8bc4021a1f1c687eebb8cba800d1c51636b1f68dc3e48f63e2da6bc6d09c6668f68e508c5d8c19bef154759e2f89ade152717370a8944f537578296380d1fe6be809e8b113d2b9d89e6a46f5c333d4fd48770fc1ea1c548104575b84cf071042bfe5acf496392be8351a41c46a2cab0864c4c1c5b5e0c7b27e7b88c69f37ffa7e1a8cd98f343ac84a4ad67025a40ed8f664e9d630337de6e48bb2125e2552123609491f183afd92634487f0b2cf971f2626e88858879d45a29b0fefb66cd41b2e4e968385bd9fc8c7211976bc6bd3e1ad6df60856985a825f4726d2 Msg = 8925b87e9d1d739d8f975450b79d0919dde63e8a9eaa1cb511b40fe3abb9cd8960e894770bc2b253102c4b4640c357f5fd6feab39e3bb8f41564d805ceafc8fbdb00b2ea4f29ed57e700c7eff0b4827964619c0957e1547691e6690f7d45258a42959a3d2ff92c915c3a4fb38e19928c5ce3ddf49045f622d0624a677e23eb1d Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 43ef93d14e89b05d5e0db2dbd57a12403910646b4b0a24d9b80d947954591afa6e9809e96d7d3e711003ee0a9186ab3d8e0b4d3425c6da4b5f7899537e737b71df9ed6355529aace77a7cba96b5b0a86399252f1286a6fcab180b598455dfe1de4b80470d06318d5f7a52e45b6d0bcc00bd365819a4a142b83072775f485f63c8004f53378a9a0d2345d07b1b326238ed070d1e69fc0b5cf853a807cfb723562d1f5682482e8a4840588bcc7154ce0740c768616cf04d7aa103642917ec5b4b514a3734d9e0c58427cff42f27f43fdfc85991e045acd17af6fba7bdab818e90eb4117684e89f9163dff7b98b82a08baa2b49acde480c5702c335237d1be771b7 Msg = d0eb4623eedbd97ee03672f8e4174d2e30a68323ce9980e2aafbb864ea2c96b37d2ab550f70e53d29cda03d1ba71a1023de78ba37dfb0e1a5ae21fd98b474c84338ff256b561afc1ca661a54d14db2e2661315e13581731010f6415d4066320519a363fdd2dbd5919362214bceb26716d3b188a39f32950cf5bd87b7b193307e Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 213ea3fb11cdd71bd5b839de8a598b6a142023825e24db7cb1a4459e78092b32b07643c7270839f247870efbd320b419ff3b1914c41b6ca4bc3cf17017d9a94d86f0f022f4495666c4a89f08e216a161d4664f2d616fa4bb2a17ccb85004e63f488ba29564ca136aa3a6f9561f85cb550b8cf8b0a85afbc8aee2c76891a53e7cb66e36f8709e7990d8de8d0c73865c1cb44727f18c0faf25c53f15e070c430e73f77b1e9c8f8ec13114d7e7ac790ade4ec6f1de0cec13f25a48d534965a8ede12090a928a91d5a1f214aefe6cee576ad43eaeccf635409a8646853d9cef93c9c04a884253380a49e682bff0750577c5a80becdef21a4a9793fabb579eb50e3fa Msg = d58e0997224d12e635586e9cedd82dddf6a268aa5570774c417163f635059ea643c1f24cabbab82eac004a8b9a68bb7e318fc526291b02040a445fa44294cf8075ea3c2114c5c38731bf20cb9258670304f5f666f129a7b135324ac92ec752a11211ce5e86f79bb96c9ed8a5fc309b3216dde2b2d620cd1a6a440aab202690d1 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 4385e67819283d81eab2b59357c51ce37b5ea32b76af345a457e5aa2dd61113865a587d2c8a8f1c8825281c052a88fc67797adb6251d28efb911564671affcbfc7e1a3c055dce8d93497fe80da459647ac71f17e9aa07d1aafd5260ac284d622a03b6670c55b0d40696d436c638f9b48bd08f37db4eaf1d9746d2c24de347dcca0a62df244bd2a554bd08d047efe52cb1266ee5988447e1b2740f960d22e9ed3f2573ea8753a60d306d654a26503a5416a4439ee44aefe08cfebbed56585eaa01a64bc812f589da9e9d51849b4d4feea04e2b03c4d4fe516decea1e3d9e7e35bfec17d7b2c218d8553bab921eab6410ad30cc131579497d186fa25cf62521fe9 Msg = 3b9dc97a36492a68816aff839c135da2d7dec5505ddf496670dbf0e0f6b65ce9352baa38dbc09a9f41f8f0e1f0ca1ac56552126811c786d7a4ad37dd8b4b9f1ab760d655a112b6148b273e690877340ebea10eb46bfe139926d3be59e8cb63064aa4147a9028c6ece75fb0c2eb03f4a66c3481dc726d38d37eb74efa131cf1d4 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 3fc0e79913fc234e4f271cd6f5aa63bcd00e0c4fe2242815645d384781d5a00485076bc011f4412457bb7a2cb2695abfa18471ff6087038d585f802995159c8beee7607330759f310107c35b4a6a9a48fc910f45f70bffed1281f2215af34759ab08b68acd539ddd37f98a528434cf11ae0e85ef221f7117c757d970f3181e9ccda927469aa88de59ceae91c270818137761e56d75a3c01ac128b65818f28dbf7dd268337356e97bd104df6218db3b1292ec2652b62e5aeaafd905ec8fe67d6ed42e805048deb55cd9d75f818236687bc5b2cf33e17678c45a9b2144d58a4c77c163e57c1ee42cbd92bab46678092aef867968d8e6a387f7cef3920e4ee046eb Msg = 93ebc05837d0d50897a1d10bf1b08a6a767e52bfaa887da40d631d6cfb0b1011d1793d6e51731aae48a872056dfc659e8d21b0d4e5672ea4d0d59f62a278a9acd3fb1c9d60787a426e8eb75230b43d190ccc33b6f9fcff862cb909e0f324c203e19ae64c2b86fead527a285a027f1ac53ba965cdaeeef7326a37e44db7b866fe Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 19b1bbc3e4a23b44ec429dc4479f3fa45da87037136ada535bb325c0c03193a2ed8216a9621e9f48ad2c53af330570fdfc85fc1dbb077105af39e8e3a9faba4a79ffe987e1a37e5a49c60320d086e9292060e9fe671f1bfa18ad79f1ae559551a1d5520f8164a877b3fe1938fa51cbe8b5110a332c500585d288d8b30855afdddd233254f62e56eda75ea6854b84bb05e5b4497aca3d20baaf2d6d228a400135ecc45161c3f2e7258f8e4742aa687bd9f7a4468a61558fa0ddf79e5e0ca51ffaf0151bb255152219c76a08c3e46557ed6b1415622bdfd94f733ac10d8f388c0ef646d8f5d71a3205307db703d627287e2b7be15c33fff19147e5daa36d4252b1 Msg = 8bb56404897a19140d112d939f73fd7d18a5d107aaa20332209664a0674cdba64eea4fa48adcc791fd0ed0da385e206d3e5178108a04cff85466ac9711a5d4b539e625c24c39c26b17cc706b345f40a4d0f76f6eb0d78a2f76acd52c2108ee9ed411ae09d87b50c9e3b3d5ed9b5da64956017cc724017dfe0fcfa806a15c728a Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 12f03c6f02b34f921831df384cc6e30d0b64f8ed133133ff190caca2503f1a4f4f721de6824ffde125bf41ae216e5feb8510e4d6337cec56f18550e78c69b1618457bc1b604d109e526c788628391ad8c29ad6c5da268922a55e4eb3053415a9de109112b5fac1f996236f46ed3a6c2f845c36bab09a4c21da20b17d2590c7b058fec130fbec4856ade373b6b0773994bed5ac7a420a09df8c1de246ad453dc8a62310accc9f0bdff16104dfd74c7752c33df20ef08c52d0bcdeacdf2a31298a3c72bb7397c3f9306fdbec45287688877fd6c965b8dcc513c9bdefc2f9ee7e92bac62438e4d80bd3ee2ca50a024d6fdedf39266480b2ec77eedea6b64a9c58ad Msg = 35ef7f038e9b98a421b9f6a129ebc641596380ea1648bf9fe35c50c71ddd8930e8a9dc5369a5acda365e5e5f0af1b477be2956ef74e8b25516c806baff01bbb7f78ef5ae658b6852c0e26d6a472655d2f2bffdc2a848a252b235f73e70b975e74ae7f39bea177616a88b4a494652525ade6d9ceb1831389fa0ec4bdad8cb5fc9 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = af809f10fd160a88d42dc9d92285e2b2afd8162c38eb91a6b6273a66c30c79d7caec94a00fa732710d9f751219767185da5064ce26fec0647cb0670ecc68f2a601390dff07ff0237f284dd4fcb0b11148835c8114c5a15c513713dbc16286707eecaf2c450f588fc96217d34f59e0c716c7348270041b2c4386f5a5877f7fa48510cca8b07b70490f9eee957ec0a52ab955a3f1054695a7f5806f705fe3e9802770d591eddf2a83fe03d8adbf553ae59528051218db1f3fd070f8e1d3d4b4083588cf2710271ecca5d9369468d045b0f2e0ef285f9cfa65a04cd223fd84c01b8c740a4e95b9fb675c0d7c470b3598d06489bb7d6722eb72ab8120d7f0ae29a06 Msg = b4422216f1e75f1cea1e971e29d945b9a2c7aa3d3cca70bc8dab8e61e50d6b038f9f46fa5396d5323f5b2c7ea880e12e6bf96ee37889d6a2927a8c285091907d6841dbcc2c1ffd725596055500dca177f62486cb301612479b7c303a183e7de0c790a933856a1f05b338e84c3ad4ccbdcbb1bb9c6c596cd23019444045fa7953 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 0f31c8fb4cef7233cc20bca20eaa5b42a9aed4a4f40855e2c518501ae1cfd71f98bf9ffdec1a74bea75bdf90b9c67c5824a7054ae57ef49806359ed64b2c5efdaf52829395fe426c802665bd7530ca3cbb40d5f29367ea55eba29903e8eba5df7556b5527335ac06a211c597e916fd6978ea5bc6daadccd4fcbc61ee64aacc902f652e545ef48579cd523944461d9161a542e2e7bd2a1da72ec9a751651d184fb75b16951e1b5a98107ab3ba680df0dd06131a9318e47e15326f27fc34dddeeac89b11236fdc9b8f799828dfa9714e6ca3982d8f79efa2a455e6d73421a1c933c92902790eb79adf0e4fb6202b6a0868aecac2208ab673b249a826646518aabc Msg = 882c97fad763ca235b162fba88fd714d023bf7380133681cfa9e6a8d7cdab00b58853334044bbf3741fcb28cfce201e372517b5a987f52f2ba96d744620885707b234157b6e5e00a2d11ea8147829d91dbc0351898d16b7ba4523c5283c6eb613b2d49cbb5d93482677d5e023087503f83afaedbc8d0bc9dfff7211fa7baebc6 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 0c4850b815169cda5c11f77bee14ff2fa1399af8dba09fb9485211ddd458e4152f966b2162cced299e496ca0c6cc891fce52fde9be554aa213c9f9dcce053452fe0702bf2e953ac6490c97660d8dae7ae557d94e4de409100951bd3f8be77ad5e6a7f8551190a1f2ede40fa5a12e5d995c7739221fd9be3970c05dfc990a103db1e9dff25e37234be4f70b372a4071a9c921a34de8f6c56f1106a2431b2fc2d60026c7f2cfab11ee75afaab90d72dc8e15c6d6ddee0d4302341f107c541b23368995b6e95a0efb3624e70e7980533a4d6cd823e26072a4bc88f2c01349222472ee394b86ec83f4fb9df8fd105fedc77d28b7a7e9d71451219eb42c25764bfec6 Hash = SHA-512 Msg = 5f0fe2afa61b628c43ea3b6ba60567b1ae95f682076f01dfb64de011f25e9c4b3602a78b94cecbc14cd761339d2dc320dba504a3c2dcdedb0a78eb493bb11879c31158e5467795163562ec0ca26c19e0531530a815c28f9b52061076e61f831e2fc45b86631ea7d3271444be5dcb513a3d6de457a72afb67b77db65f9bb1c380 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 5e0712bb363e5034ef6b23c119e3b498644445faab5a4c0b4e217e4c832ab34c142d7f81dbf8affdb2dacefabb2f83524c5aa883fc5f06e528b232d90fbea9ca08ae5ac180d477eaed27d137e2b51bd613b69c543d555bfc7cd81a4f795753c8c64c6b5d2acd9e26d6225f5b26e4e66a945fd6477a277b580dbeaa46d0be498df9a093392926c905641945ec5b9597525e449af3743f80554788fc358bc0401a968ff98aaf34e50b352751f32274750ff5c1fba503050204cec9c77deede7f8fa20845d95f5177030bc91d51f26f29d2a65b870dc72b81e5ef9eeef990d7c7145bbf1a3bc7aedd19fa7cbb020756525f1802216c13296fd6aac11bf2d2d90494 Msg = 9e880ce59f547d592c309c22a2974ba5a52cf1c164f2d8a81ebbd4ede6e326dea33d9f135a4e0947b0b9c267aafbaae9b8583f5ff215074ca1e82f3601ad71fc455a3b6adc350d0bf345223e3b06548cec613a390ada9319e70ce7a5e9526b4e8dc82612ac72524cfdba05d0dc201037492d277834a843b9f80d4564253bdc7c Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 8c4f819e682081bb16ddd459662a8078bca4793e18110033539460b408c0af747ea5d941f712691f5d9ddb643166fd965f5b51b819d55141d67c1553b27a4682e67d5555b64d7cd3db7fc5c2e701dd26e422af8a1fb52cd5f5a09e0d6db900a992f318deeb6f6e39dfd6af44cb217c6854089ceaa16e3f9b100ef8e78f6b453458b8ef6d71493e7c6e45282c617fa87ccdd4a0f2f9f7166281806fb41d0fe188e00c40afeaa07d2da09a2cd78052f8d56b7af40d4c7314ccf02e490d5e2123bf676f2bcbdabeffcf58792998dd0f67ed24e483d8976b00d6151a6e0ba740bdb57c9bc27fe5df9126a47020075eb222d5ca2470724460c5adf067b5750287cd00 Msg = a6133ca436d3f2e0a6562f138975bcf785cd0c3b58b7671d197b483bc0c003a6e947aa39d5d93229b27ed2dc1cf0acffe34fafd30f16bcc7214e074c9c02c1e5c4f2f47da68baefe5817611f82328a7e1d7d91ee7b96f0128847982b4ffd902ec07ce01ab0d2ad882189a583c4219e9bbcbe7935a51d4d25d5ccc27fe19bbaa9 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 20ceee0fd620160ef6a40966fa4ef3d8f68c002a66d0103eb62a868a7ad7dce9523a5b83607b8cd0ca54f833f3a68c9fafa1de7fd723e22a0f724dfca1fb6bd1a88a7dbd17255ba1e06102c2cddf584f511bdd09e132b016f867896a592a28c53c70752a0b10d86bdbae9503928d2e0203ab8f845c1f77adef2bd2f4e126066fe15af4a5282d5d9fa73bec18d2e6a5969d766eba55c0bb95e13671f82646c35b31d894e7f95f2fd35f60d88c3e70b20f6f387326400f0a825bb9517df88bbcc4798861144782dd92ccaed36aec47d5365d3b61a495339ed58e2553b74f06a295ae47a309d8477b9ca838e77094718565903432ce243c9dffe6dad464cd5ee279 Msg = 6d60a4ee806bf0fdb5e3848f58342c0dbab5ee3929d2996e1f6aa029ba7629c96cec6293f4e314f98df77a1c65ef538f509d365ebe06264febc3666755a78eb073a2df3aa4e5d4606647f94cc8e800be22141208036a635e6b3d094c3a3a0e88e94bc4ea78bc58b9a79daa2869675c2096e22a40e0457923089f32e15277d0d8 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 912fdcc5719a8af7389db8756bb0f630a4c78a1bd1fec7c4a6f3e50924a9818c9eca4a4efbaf9e8bad55d6468d83c54d0450b53a267a50685e7fb93550c2ef3554f69b4e49d3be359bc0b88f3e753714684ac047b4dfb436140b13129fc4bbfeed86548500d487094d222ed4e249db0a46b34ba5247c1b86e8650a703c9d3e0374433d3af52578d35f0f9108439df0701188da206b579e1712811c1e33b3da32f33acc9cd0bed60cfe977a4a6c6aa6498ecebab9be86c216a7214eecb13c2b7d4d309f5488012056905060c3eabe90f36b01588acb328869034e00bd19bf5c1a44d8ea2a89b747b2875d97047c53f2903f67b5a60aa87aa70a9479735198a508 Msg = 1aa215c9f16050f31f0ce5adc8cfa594e44ef29087dc23ac65ed2a2595ce73c0959410618f5314dada903c01c4f8d5058f52d902b9b25cd281ef2627a658a2d672a3f776f726742a994a31bbcc3cf3ea1fe551047a1d15b6a31be52307302334b8b6112fb243398c62220c046903c9ea9df1a0be50851800d659ae4241c0be81 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 6ba800b8692ae568344c448094e3e16f50dc2c53edcfbbc9c7be9c07461c0e0686fcfed607af2a66291fcf8e9653fb3e9857b208ba210100df9e6c0495ab4d13f1029089cfea49a6be8b62036f30e0d4e4c1d95a5eb9580397d3bcf65a9311c2d8de249c2d1d7472369537cccedf8a7feb0c170eef41341f05e7d17caac4261b62498776a5eb1d9ce7e4746b4849f9021f0aff917179750253c719017fb5dd6855672eeb0847ca075e589e320f356f49872455b30f8cc1a3a7e1a4276ed6a909be06bd9f89c3494ff7db432d0d4d3f3ccb0be71b0bda4f66ff79773004905c6102d964b3b5a5e28e4578840c0e488b7f2b4f31066b61e13821e88a0ddd2b1c2e Msg = cce6ea5a46bdd6805160dce409d1023cd71d3893303ca0497f392d5c5f936fe50ee2ade61ebd35426edcf00d597a39062dfdef62dfd9c9ccfdb2eaa9e3c1b6a03278e35a7e69d386476421212bdf7af4599bae5e49850653abdbd9a59d8f5a8220f0b43fcd875953c43f96a7e6ca6c0d443f9b0dd608ffe871fb1fd7f3c70494 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 9a465479c1474c1a54f16f309bd87b0c641a458d86173a4f29c2829fea0410787a81b3c1360cfc525d133dfdecc13acdd5199954dd8440739608545724cf1270caa39a221e9c6bfba399b9b05e55708875bac1578642ba7211260662299bf5ef68a39594e38faee14989ac5b2daa13211ece394cde46afa1b110bb55f631bdae5b848dfdb8920d7c74eff82ecdf59f2c6ed9b818c2336364b2a56d34a22ac42089dc5730e8e57b356cc4822c1e646268dc6a423e034b8b1512d41b88c70b27e431d68151e61a4fa5c89f1e90d621e07228c0346ca46f767a989f1b0d007237645d448030a7fe45ee0f46521272a8cc453a835984f8268752bef801b6226140b5 Msg = cb79cee1e7c3546750dd49fb760546e651e2a42ba4bbe16083e744bd1385c473916d273e9566673e98995903b44590e7acb580a02c6fdf1552af51716c134376049817151ac5823bb02633ed8cfcb697393397a14f94ca44f43c4a9ca34d01fe2ce3e88bfc4a6f059f6e1fe283927e9fff45335793926a9472787a653d9ac5b1 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 7cfcc23518bc137b94dbc87e83e5c942a5297ab4f70a4ad797b1dfa931c9cfcb30449ba3b443fd3abf4d350b80feaa9687b39e7b5b524ffa35063ae6b4e12a41fd734a24f89c3652b449c2154099a1c7739d5db77ba9de0358a69ec99bcc626f657213a256732631461851c919a93b04ad39800f02d0e627cd01d4b80697a9a1fb0d71df4f32ecaad3f1d5c80cac67a58c71ce81e23fc8a05ec840019c834d78ee1955c5e41065b323d01fdbe81b768448b4a7388886c9740b1541ecd8454f73ab64f90dd46cce6a2329beae9f3ee0bf567b507440ab3ca9de2e855374ddf6e105b3d0b33a138d716d138ce9f9570797a82eae557cf321fa09b862e31ee8d85b Msg = 3ddc491798c6d8c2d6932502e14ca0d6cd90016c219438427268a38b377c84d4d862b2e708d58ff055fb39defde7050c0462292183ebb83543fcd4358a8f1f8835e172f20776d2b9415d9f0773b50f909170db7449573867944e090f8cda53ad7de0f1003eb08967c241be45eabea7a99d42802f1be1a0218ee7abe2e364098d Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 68a46140382dbf84b1794ce86937812d8220fc59e83dd1afa087efc41883616bfffb8283bd6dd5ee1930337951ded3be23fdc657e1bc07f41b539eb779ec98f436b367259b6841e495bf84555aff07674c9fb705c85a9cc1fde4bad40506e3373cc3a490daada1c10705177c165719104daa8ab675666625335e09a24f7a2363d7b3b878f34fe68fe01425275881c34b60ee78fcc0a54d56ac8304fc7a4bc0d5a447ab89b9206401e3c445bb1cc8e0c2541fe0f3634bb49d5af3a1b7c2e7651d208392718311247f0f15e4041a46301b93da2cda7af833d80191565833926a78468abac9eb4b02c5f047ed38851c3ed7add4edc05e8407481b8b942ab627e03d Msg = d422e63e3c65eff3ee15c7eeb2ef0de7ab96a3c37e2af9c2b71d8ffa6842b504122796f5c9a5748f94b535b913851f2d64cce071465ad1087ff37be97c5d5b3038b8e2145f0ec019b22b6286adafb91a67613efbbbc633efa5f32bceee9fcc380c7cd48344c85af7111e573ec99364167efec5492297a7dfefc4a692062f9282 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 2bc6331715b62972a0a5dab2138c5663b0e33961063ce973e68e1ad172723bcea293f7ba35af24504cb2e373b11f80b49f79d3905e0aaef838fc7c7fb5df49a322d7c3daa294a1a0a8b71a52e2c5dd94575f319c64ef9f6fc6bbb70c0c97fa12ae78f73234aaeb93df299f81513458ecd243fca5284f44a1afcd0575dbf5f81d406236ce315e98ba4c9ef7c1d43896af3b5d172e7a786fc58c4220c27b56e5c7a9be49a40b49158305034a295a6c5743cda6c2c69f7ac02f87ed6cf7b4e989ce8218e5e7cbdac12fe7de3a5437170084ef8ce33e3530392c25a58ebeddc086685a4dfb9c0c5b91d946df65161ffbf82aa3d6a80c7c07995aa3ee06b1800a54ee Msg = 6e87214fc1a8b0116f04a45a67e101ac75e9933366c532f96cee4559c4c085b695d1046d1c806d0706d18db41d7812f5273393980b5dd1e936c13d273dacba35c446a3929e21108b361355af2d41cc84447dd5787dd21a1a7d5c188a355ddb2ec18e08a790b32104c6720535de65b6c2946e5fbd024b96f5096ade6cf2fe700b Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 802db067a8d90967c2860c9076c1a0227560b59b66350490af1153d20b31840918e7d7262f633d37880a153b1a23e40d3cf9fcbd9c1610878b6317d9d1187f80074512524561f1c0f99f1b2ba168a15eac098b2b20673ac63f9b002e60887ff296d1212dc696450e7bb14a3efbdcdbc7f4ae2210ed35a3bf028d3eb99ab696f63a2fc69d8cce4b45846ab88943f89d588a72f00f15e1ea16d99961084542467b8f998c118fe76a2a326cb1ca3f9959c06c810a004a67cb0655f8c6202ff5e4ced43c4d8e0c3683d55607d4ddbcc0d9dd4e1783b58f51f95e159fe593066cec53b544f2391cbf0e3dc4172afd5ff6de23088404f7a496bbc6a4ce22826204b6aa # 3072 bit modulus E = 0x1415a7 P = 1825499549064545501002814752867303197574562922695361759109406159330584064967398311210633222088128608648132123109528103883217852707804429376215461146343928188715788414753586514882360939028551976899909107588192744855121888611864285665379758638344821704975194841674455178833534368304433882122253575672965991425746004201077023469323804296141584892269607798120744155913889681140792424300544033273884707054117505961458853525824548423772867055435252788293862905325989693 Q = 2083911535573720425754297793930303097427045611940553511621384606605330401568389655153758329867757501869779281401894629931181352401340586070168628965272579883930189757958134081840842397489768834642797826313735049301214445866929651170358938475330247827122082324023853743929818143594090782803702383413243694275307174336421563143271986683539534462779273993122904937067239610316755588123775626801488367650795574231544353899738861546922696554795936876810882155266613607 Hash = SHA-224 Msg = c8ed14895c80a91fda8367cf4aee386b8a378645f06afee72f7c94047fddc7aef84c26c83fef13bf65a3c7750c91967ecc02748fd574b933d5ec21c01c8f178afe6c3356789d0112178e04c3169cfabec6e2621b334f3c6705fc1099a4bd3147a0f7431a4fb1fb80b8ed26a0af38ed93428057d154260fe98854687661919e4e Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 27b4f0aa139565fbd7860760610f6866d5b5f0d777921f06f5053291123e3b259d67294ccb8c0d068b8dae360aad2cf7d07296b539e4d2e9b08c343286d522f7dd63c6620e8672be492f3b039f73d88ab9d22a5463cd1f07d688e8ba3fbad531b0c3870ccbfebb596ce4ec643d309744bdbd675d5841284cbac902cfb70ade6d33946d8dc6109bbbc42412db25b8c62222c5ff94f8eb868982265392a44e807474910b4b39558bbef33197907178ce146fdd7e94092ad58bf41a474e626136789fc2fe6374a1b5fefddd5fecb7f8ca5893220d1ab9e822c3ae8adda1ebaddb18a6a12bfc165d12071441a991377cee6dc8e50839497346fee13f12c5b7b6d024b8ecfdad80d5ef6e9e4996ac21c4eb6036bb51f5be5e38f265181154000824e3c1f231d18589ccdaee90fe307ba56324318b5358468e9f3913b83ab8b34d949629ed7839f8da85bdcda52f3da5a419f777b3860dbf2ffe28d96244312549528a20cc7399fc010844365806167fe43235521c909587c2c7b8db4e296dad2aefa2 Msg = d04be758e97644ee60a9212e5eb81a1088041aab31e428b0cd4a8437a9a3f3bedafe576e747182a1fcb84ca21f20e3b3a3a463559f55a7c3e7ff5ec0cb096192019d444fdf092a57cd65de22fb76203c4fd33d8da246e3de2b7532993bc216d02b6fd5819306e419bdf8ff365a8478b173dad0dca281840881f6294b6396bb80 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 4aba732c6255f0bc443939c131dd4ce64478d4f58dcbf1d73f5f0e660c492315e987cafbc83a1a0be3d359a960783d293d375ccc3ec0d82c72abcacc339f1b42207a03795be6808ba06a891e3b4251e1b3001dfb537252572a33b4c52846dafefb24aca53fc08e63c39da02c4138b3de9510fb790f87566cd14380b138c728c243543b89d1f916ce27cada85fa32d8185deefa25c323c65c7ed578ca57276b66744a7a1a78e66d4e570999d17015bdbdd8d3d6185a3eb1dec8bc3a1287a2e235e4f116a8b91d06128d36b58ed4c9a6ed84773dc49f755e2e27a6f1aea31417069bd066b848095c002f22dd6caa72957e21a1e640f9ab9b9180df8ef8963e3611df2693a7ed064f348221e7edb1a5a81acce24acc335c6ee7d4f1af6d68acaf15d77e128142ca9bfc55a121b1b13fe5bafe2e4d6a5546b8cc631bb9d304c0e9f3d6d5dfe833c346965f0103698d34a51bca5db266afded271d8490645b3f63efc991e01683211f9482d214cfa9220f7bc81e8cbb4d118a2c306709807c070c60d Msg = 39d8ec4816fa9365cdf299ce60053b9c1e99540ed29d2d163a249718ba5337ee527e222fce8eaab13ca6774ca306d9e1f22f5c9b37479d7511c05dfd6835d4575b9447847a82dde536fbaffa95391e702bd8695b45377fc067211156f9adec8d3d6286d0849fd607a23a69619f68b350afdda3d564347afd2390dcacd5842799 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 0df81ec6e9c2f0ebe824c445009902cd55e2718523546f08ed13faf811ec4e57e6f5772037e07025c3c0c99cd9d6c885682e0eb904a3314b825948819acecd195c845a81e22ae62c13251823d6ee386e0be17a604bafc6497b7a6cdaad1a33cd5ae33bdd50e62063bddf6d12b878b31d3b7d490ce86810f9d456739bcebde592b07808350aee542455d1761154188e6e02cbda795e48e4f28acb819440bcd8da53fdf19808456898a18fba517af06b51156129b0b8029547ca9bd9436a0673e5b5cb995340fc425fecc566acc99884e0b4fc87248f5b35bbf08b0dfd0b9ead06737b67c85f94e1eac8802fea1b1dcea446b7cab8a45b25429750946bc8b22e076828a0a9718277568b9b7202a8cc3688d44194e834e0a405fb9eea46bc7e94255d600ff6c95a46ebf46449510fdb39b6ce05a20ac1832938b659318764dc0b7e4a0215fd253f5219296fbc82f03a7b95a12628d219093e2cdac42e20eba3dd5aeeb9dd7bef5d647f151b04ab85c48970cfe73ef9fc3e7d1d8a138dec3f5d5fb5 Msg = f7b22de3bee8295c4d8c8a94da8cd704c5541c97214390bc6f5c75baac3f40458f57fa4e0c54e61f1cdc64a6c07d151143e7409cc05874a7e5576f0cf6a53faf1571a757c0cbc4bc9b5bf0e17053e7a374a22992cc6b9f014fb580598e6476b31168fda5e4340c5b5371f8eaf1f495e2dfee9e224a6357f136de704a7a622d76 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 727669abeb6bcc9502d7e88162f4a6c1dfe1a0f5141d3763e0f7e16744f9063874f153cc2de48784de84426b548b03e05a9074cef6a951640eaf9b32014d97cd9f3a828b45def13527f72a3e5e5adccaece82212c016c28f9f3312853bf52062e719081bc028f70831f9fc9132e8b63824e37c7cdeba463f9034d815683e27750cb9b383c3420f122a3b7fc6e9440925a77d766f93d586161e9607beb8a6e4ac72c32ef7b69ed52f5077a881dd0e494591e2ba552b74731c18cece9905561459f4553d49acfd6cc6be027833a220429d46bcb88dfcff0d2c5cb567371563b4852b7e628c4a6432af967e8ed69c9b6428ac552cd370922a0a4b01ef1bdfdcbc9088cdfb6d9fe326bd6b2bb1fc2acfea3bcf60d1fac5880b0510736b7e201ee8f6bc6332c0756315789700350fa549009d16e0bac084bf6aa3492f63367819506bf0c4f9c232fbd7c4d4ad663a7566108238c31fed887f368666dc75a623f222d357f8e523ff084111be4db6baf444f191ad1468d077349fef8a22f3fa56085975 Msg = 8d48fddf28b05b42c9b4df4742ed8e735a140a6972165ca6696bf06ebea4e106f44478243bd1efa44c2b7a7c951c88f2962f450d8bc664494b671d8e70577163b86ab560ab194ee17ed5ba02389bd0c713c9489a25307dfb3f6a7273166d13c9a061be79c1af0262275ba7bf7393ee58998819fa897c2e240f1cf903f71150a0 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = a1a4d16956d718830f625f06c42e99189e36a80523b25f0c9a7bb85568ce76d1e85e437db0a7728b8a9c90d25e6f38150208debe54e1e3f648ff01798a8ce132e4b33f3d26fa8963771440fdc4f5d852117b3ccea975da10e5d4f27af1bec1b853b7b5c9b420012317a6c33b2596dbdcebf97bef821b3076ce86345309b6bdf29a4acd391d3b2e5c4a6866136287d17cb0e2d4d6a6cf89d64272d5c01849ed57fa2842074d3b7734c4c92be50a922d0517ebb9891072b1b47a710887004b238f90079d10fb2cad7f5013e7243089f3c601865c6bce1cb8d0d669f2bb709253e3f1e421936f6a1643bbbb7d503b0631f7e1660382bacf4680de8d70e24abf4450510e6b40475bfc9fe547752d0d5f63f40f62f4dcc903fe6d260fa45a1b85a7501065aa1900a3f841e54c136d686fadbb33b225d15ae6fc348be57fc9ccbfdeb57d5cbf53e3479d9bae9f4ff859cbd3fb076073ca016ad94086700cc85aced83aebb4254b0cfc814585f930dc623c7f85e89de6a554b9898918d7cbb4cd2db075 Msg = 4753183ce5607fa03636db2fdc84722aeb9d98a6ed70d0282aba3571267a189b6aa6eb65871c5dcc59dbc7db8973c7c355ba2a2e94c110d1f4064a4087eb07077e67b0f634fc10bc6ee9b8b8e1a0a20bf47a14f2c8aac75375704995978fa0b50a003096f1e8df99fdc8766eecf34a2a4f461d9991133fd5355ef8175f4c2bce Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 2e078b29b5288a77ed25ecececa645f6d9298e4294e3ef08173cc37ccbf727ac9b092cd27d6fbd378fff7b1061b56ed5cf077fd1a227771f58cbb2c1195a01f830f0366f989aa2d0c486d441e112daeaf83e85958f65a9e60a1937d2a7022781fcd1a83b3f7641a743001ebad53a4669405603ba0393bcd94f64324f1b777068a3ab101a086a6972b2c11376307e7d2485fbfad85be7171d20a5251cf9a5f004847d172c77bd80fbac0870a0b6bb9733537ca72bb6eac351c21588287c317625a25f416129e6f53c607ae08f43e5e0339740775a531c720f3f731840184ac7cd3b1f7bb820ff30ba7bb120b21b4bae7f9d7fc34d7418f700b142cf8fff43d81599236ebabe93d2e89f4702fada8742dc3bb4bc8fc5e55b4f874ae59f5dc9636868828efbe1025a8ca5c61ed8cc832686d5d00c08775590b316060285dc5bb9d32c90a474a727ddba9e7a8b7d69bae555604add9de0dab0eb0d551bac067c0088523d134b2e50dfe3ff73eefed934c0984aa4a5c563b862d46ed957ec3446fd24 Msg = aad03f3aa4cbd236d30fcf239c40da68de8ef54dcb36f5a6f64b32b6acb6834e887c6a35423f8bccc80863f2904336262c0b49eb1fa85271ef562d717b48d0598fed81a9b672479d4f889e0ce3676e90b6133ee79cdea5990e2e02db7d806db4e6adee5ea76cecef9119e8393eb56beea52d3c08ebdfd7677d5a1bbc5b6543a7 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 1bc325412cc952a8dd6918db8fb08192cdf81bf4111cb5f0a580a82d4dd2e14d7445eb7cb94cca6da06d2b5cc43e6ec22a5c9c845d99ac0353050c1374866befd9b6b849cf3b0efcc644ce17cca0dafcf7700c9c7d870c1e14511651b1d03a535110139c53b55938cc4a471d756a55b50d1bd280c324ac4dbaf526590c48c197573f3a91c70373ec62bd168288b0d163a09e623589d1ca5a70d17aa54c8627c7a64d921aad12626f7d32d61e8f14d0aa97c2d6502021e70855581f5e353e27f96efe1bc78c7fbaece66a560b93c0e7365d97dc4c729235484abe10bccae99fa8db9425614b673d5bbc188ea8f465424f768d8031f7eefbb698f058e1578ac41426739410aa7eacf796f43a4e4b2b4a463984d3d17d6d667cd15bf2e2b487aec3493440794c09908545f416b701a130f08027b8bcab4dc4a78cf4a55a688b2e1ca3a73a08ff0ed890bee4a0fa858cf69142f2f765400e7c29c4b540530a054641961499c709dbb4f36e7e75a5993cb3ab8cd4c886f6a3f5e3bdd3d68ef0a77750 Msg = c828eca460b39703696750999e23486a432d80000882d061316b2e3ef4512d6d22d2c49a0a1551399b5addbec8d5a21131bcca3cff9f7a670ff80f075403a85276cfe4f6bf95ed0a384ab5450f707f6e3c31a21364ae897efe95ffe5b4f1a9e10c47d42147de72608a5e5e943b9de869aeb58ded015a068d446a8540ddc63b02 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 799450a1256d245df0bb7d5290abcefe69d3b0e3b94924072f2d67d53a966513955fa7a01b830ba2cbbb056716fd605a0cfdc05f8ff58d88cb1bf32248f117de41ddfdc466215fa4e704096947a2dbe836a99071ea7344be0ffc782d14f995e4bfc74dc3ab1fa96d7223ec456497a2f51e1eb199f0464d415aef00f841e39f4578a0c26d726f3065ee687adbe40207801857160d440151fa374257eaa3f777337d129dc8b8c701eed56a276ec90c03df54305f300ef8c51155db30b68c0b06dae4c4aa07e75ef0fb09299b2b04d73d0b3e874ea1b6ac4e16f1bed0cd8dd3cf958a27e14e09705d4f0e10f8d46c75a195380126b437c68183e6bd39097e2f45b1184f519b2eb101110db74519016297683aca4b461cec1d92a7e68cbf30c2bb0d96c3b33dc62d278b9a640478258c3405a6ab5fcef5280408d4573b7ae42408b9c40483768f16a01c9ee4163b325bbb8e377034fd31c787cc0db8a53f6c0ce93e7d854411a136e1013d69fd03a0171176dc0712640ef2f792c340eedd0d07a8e6 Msg = 87edd97182f322c24e937664c94443a25dd4ebe528fe0cdf5a3e050adfe4b6513f68870cc2fdab32d768a6cab6130ca3455d8c4538352e277de7d923d7351826c9aa1d2cb52b076c45cf60cf0af1eaa763839b9ea1a4e6ec68753cce5829d333ed5ca6b8a4a6bdd6606fae5a0b05641680eb1fd7a975bc97e49137f3ace86edf Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 9cba01f79f3551acfccf56e74428e270949f78a00b4ff3507ef180ce4c78ef4c53f3b7347ee37633c653aaeca834fc004385f87798922c53f8fd741cbce15de8dcae8bb04c7d481a823eadac7d4d4546fa4b0cc7e25e67b166edde4b6f66748017a4dcef85952cbf37e802fe534ecb984cb32f446c02ccb60e257a18ac368c2d2ed21975093499e35880930f8529790c1c7762ae11526e829dc0621ac904b822ba4815d8f83ac8f0fb0f8fc11bd33b02aff4e406f8fda5efabf39e6641a791cf8241b0946b675fa48d07e48639cc1ecf420380b8581a539a4de60adb0da22e10ad41f8ba6af40d11e2720086a63db72a5d7fbe97929ab23cae1d75c485d614ca38094baca699e47200f7a792292b5c7ab95b960d6921f8beab94d26f9629d8702c40df696787a6fb6ab9d6f3c1240c2fe58c565c9328dcab603897693d9dc7dcdaf500850711e6f30b5d8498a38e348469df79c3628fe1403a7649e82f06161e0ece42479a56eaa845f0582cbf817d4ba7dced36e93a6dc7dc7362f658f06461 Msg = 02a1a65f8af90a298636fe8fd31164b6907d74c8d38a0ef59a8a4eb80572625cc28398bec829bb544823a06ee0e4fcbc13397811f62d08662b2a782213604899406ab9d2292f288d22079b848b209af2471f4052700a916948650e86739b870964a0312216d5f8dbfc2c16593a8ce55e1577f113a8ea5205d984396d8cebc8b4 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 740eeb1c71940ccbc041cf204469bd2d6a461558b1d15c9eb23361cd55e1ad418a7d2851ed3d44f9c02881a22f9e4be042d451998bc181887950da38246dc1656243db15fef359fe50d2af8711b3973a57763bfc3964cfe3c911b937572e639aee53a98752598c4b15dd53dd9355aee866d5f1e48137c12c342e8f274690b7b277acd087f293cb8b8c9a3e4b3f0277e831a6864e503f925557511e57b5285221421879696802066587ce6f993aacb70dafd39f63f09cb3dcc28e56782dbfb8b4ccb1b19876101573ee9678a5f6265f808f75e7711946c27c7a22dce9f592acddac81c67afa17bffb766058e2318a1211079842bd5fc58f9cef4b50ff0ee1a293f80ac1bf2eb64ce4e1051e1abe55ee067db6c24130f0bf4c134b0abf1e2f4465dc50fd3799f6dc206b9a7d2fe34b4f4257065d7494ae733c28d70aadb057ce1bcff36edf9f9ca6908cac2141845310660ab759d1f3e651dd9fa8056a624efc714f51f3a4f85adcba68f4a58e3a956af93a5a52f2b89f9c914b48e8dfb919cfc6 Hash = SHA-256 Msg = c16499110ed577202aed2d3e4d51ded6c66373faef6533a860e1934c63484f87a8d9b92f3ac45197b2909710abba1daf759fe0510e9bd8dd4d73cec961f06ee07acd9d42c6d40dac9f430ef90374a7e944bde5220096737454f96b614d0f6cdd9f08ed529a4ad0e759cf3a023dc8a30b9a872974af9b2af6dc3d111d0feb7006 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 4335707da735cfd10411c9c048ca9b60bb46e2fe361e51fbe336f9508dc945afe075503d24f836610f2178996b52c411693052d5d7aed97654a40074ed20ed6689c0501b7fbac21dc46b665ac079760086414406cd66f8537d1ebf0dce4cf0c98d4c30c71da359e9cd401ff49718fdd4d0f99efe70ad8dd8ba1304cefb88f24b0eedf70116da15932c76f0069551a245b5fc3b91ec101f1d63b9853b598c6fa1c1acdbacf9626356c760119be0955644301896d9d0d3ea5e6443cb72ca29f4d45246d16d74d00568c219182feb191179e4593dc152c608fd80536329a533b3a631566814cd654f587c2d8ce696085e6ed1b0b0278e60a049ec7a399f94fccae6462371a69695ef525e00936fa7d9781f9ee289d4105ee827a27996583033cedb2f297e7b4926d906ce0d09d84128406ab33d7da0f8a1d4d2f666568686c394d139b0e5e99337758de85910a5fa25ca2aa6d8fb1c777244e7d98de4c79bbd426a5e6f657e37477e01247432f83797fbf31b50d02b83f69ded26d4945b2bc3f86e Msg = 60402ded89d0979afb49f8508eb978a841abc2aec59cacef40b31ad34bac1f2d3c166611abbed1e62f6b5fbb69cb53df44ae93ab7a724ea35bbee1beca74fc0188e00052b536ac8c933bf9cf8e42421a795aa81b1bc6b545eaad4024161390edc908c45aae1f71b4b0228e3104048d816917cba4ae7f2afe75e7fcad3873241a Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 5f183009708b379637dac2b14293709aa6d7e86c267a0b690a3c275031139891267c64e5edecdff14c2cc2f2d985b62f900aee6e04ca51a70a5f946463691cf16c2d45547c5374f15bdb8881641d3040ef57807532cf5b2ced07623d0f638b39ebc2f2ce283eea2247e1df3af5430554d1d4b88b7b21622993419971b7d0d5449122a10fc31b2ddcc53ff751ff4bf4d336fac667b646780272db89a3ea4226afa20877bfb86ba3ff4204e5cd56e13a1dc9d53f5c9465b97a182b2bf671512ef89e6c3969f97307a3e4beba39a78e0ad1bb9799cda92976ca39d99db4ac149c84bb9bc8997e8d5e056d67ca23fe4be28e66c4bc00a25d65bb9d7d623fea2d3b9cf859dfd9efa9e52268bfa297afb1cc2883db0c9c42fc04180e2ec6f49657c7008e4025061f896886613895a35bc2d3655a8f50a9fca2ac648f352eb06bfba2fc340aaeead4a8457c65e2e8fdba568c60a6d8d381f5d9caa30127771f4a94fdb8cde7be4fa7b4f89fe379dd3e1ca66ae1fdd63bebdc0015448e61ef1666594b8f Msg = 2f03701c2fe07d47f5fa2c83a8ea824f1d429ce4fa1df2671bfadd6234ca5775b8470249fa886dc693d2928603b2a3899b48062a9ae69e5196da4ceb1d87b5979dbb46a2813c76369da44bcecc6f20edd753a51099d027e1610712ad98cfb418a40643100b2522ffdc1760454b4c82e59b09827e4102177e462a3792edcada61 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 8291bc1be9c981663156ec80c1ed1675763de06199b9f2760caaed5207fb4b3d6037bd08462b100bb1767e3340105b1a68728bc45c7d6fd078dc1b5e7cbfa193006d52f67e77fcf809cf26172a46db384eaf552a5fb8e33840fa3ef3d6b20c7b46c32ef019e8d15dd38eab66f6e40399ad0bbb07f94b8c555196901c27e2d4573958f53060d800cfff40c602308044b75d6451801c688d276525c3fee17a6792882a074c8a41420109e2511418c9eeaf3ab47350dd8c2d3e066abeb7913e08f0a40abe71d397c3dddafc41fbd04cc8fa3b0641bf53a90031b61a2a9b63d8ed8aacc9b301593c9f425105498cc4f84627f4950758e01a291b9b1a33ba918aacc172b68c9fb2c767c65910816921281aa8e5482512cee686e51cabe88e18f923fde170a506ba3c340fd1d68261986347d30d124931db2ce17602150000b794c050e137f4ebd45cc41f70ef3df1656218ff76f2e75ad96e4167eed524fa2ed9fd1a0cf76926f382ffb16124dfc87bb1a4110928d5b1cd3b16204ceeeccb7db88fce Msg = af90f131f9fc13db0bcebfae4a2e90ad39dc533f34165e3262bc23ffe5b20450538669bf6a5210e1ffe4a583381d9333fb971903a68aa08901f14c2a71e8d1996e59889a36d7c20cc3ca5c26fbcd930128541a56a7926a8ae49a5ae786c4ef2de6527549c653ce6440c80b1ffc06391da65b7dc39ff4643bf3fe74bf8c0c0714 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 8c45e38eafaaf10a710e131bec63e51e67741774a9ddbfccdd131a123ae2a03067e7a6a92e653a25178bf527b93d6aa83fa366a2bd44896baa8b7f3f54830e4d9f5632c2d1bcae2aaae8c55782132aa7279cf1cbb6b7a81e4965ff84635c296c5ac206a04680e91e7b1ee7e5793701b1feb832250010d4ad4017c1608de8f405014ca73c39adae7c4adcbaee35fbbc71151cf955acecd8083677fe49ececcb62353c0a89c9dcb9c507979b56bfe060fec45567517c05f29e262df50767df7547630d8a7b32483b923bb1e3d510422dd4cc2d61a647e4f9636aa7587d4f8ed84b6174c1fdca9a217d9b907972a66c1f5a2ec2dadb60b93b515bf74072d315d17d54d57d721c8f4ce1a43eedf2025e51a48e9ea28160cf300d7a26010383c3280a186c44a53b7188e6caa364bf4dbe0baf4dcbe37d70e3a475cfdae339386558ccbc119873b1863975e2300ede1e420031b4cdac567e7b9c5d575c8bae27eebb37097050acdc87008ca2380f5631d190029a1d712acda147c5c4378cb6eac81731 Msg = e57debad3563fa81f4b9819405e41f98a54096d44f6ed119dceb25f8efe7d7329054de70173deb344c59a710cce03b16af9d168f6745eaf0eb07f80916648e804941ce7e583ab0a8a43a4b51844850edeaa4d7c943135efa9e770e9411a2411c586c423fc00353c34483f5bff5c763079f7e60eba98132213d64efffa94af7ed Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 851dcd2d4e1d34dae0fd585af126be448d611acaeacfa34f1492aa7d1caff616707dc31b05186cdbef769479243afb341577803b579e105070ad5406a6744f56e55f569370b9fcf6ab10e1aa0383f9182d451afb41358a2f8c29d1a571e11c404e6870cbb04f6ef30414d9b6d7f1416bacab0184eebd8deae72f2a48bea3a7844a8bf472a5f8d349d5973ffde3b1c40623dbaabd6f681485a9691c9be12618bba393b396f41cfeb89e18e378c51f147c7b0ededbc403bb1306454848c9bdb89f947843d0aeaadcdf09bad99efb76e742322521929f034dadffa483958df58a71af7da45461fc408c7c45973fc60c37a6358743315169b3100d4cd54f810d6e0369b9847ee38795cfe58443019523c3c9003edec4cdaa70de31d00958653058d8509907a5149a9f81be0ed028724f7232b57f93dc62ccf093a2635ee1e5bfe6ca9ea017ffab79182eefff542d278c471e1a2b34231700423bd0e757f6a572a14a99c90329dd0701f347d8a679cff25fd6b0d380ee5dc330d6ff1b4b1a347fc98d Msg = 28db8ffa55e115df7f188d627cd291fdecfbeea1109e1155e0aabc2157f7fe2a1284611e190365d2fd972d2a23dc793a5f28d4aac4100f5fbb2eed57532220d5d8d774bfa7084b44400249c19dab50e6c3c3af15966a960af1e2cec1f697a694a35c31a5a6f8ae7b73e148f09347004a3f54e7a82db390a0aa4fc526e95d79af Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 72c5555111eaef954236163753674a6ff81f182cbb379bfc6b548a52f9a5f260a0ed58f562a6086cf5ed00ed30adb023e90076a8adfa17cfd7d74f1e7b1978b210da847eda6b49891e6bd3fc6cd4c87b9326e8481a16c66e40021e5f878c303d3d8532bd7d966513717d5499865b2d03e378e76f7940f0448ab4d112e3c52cb332d340af122de3ee849f2e2544a40691ddf701d902bfe629766b36d82449286fd03f75bb2632dd61d6b3c6ce1c9ea8e5aff92ad2ca95a950eecd998e495e90e1f0966f922b7fb3f03380385f3b143ac1960c3bb688adbfd91d8fe1a1c32160243d3bd231a31c95dd78b6648c1175fa9c3c1244b1fa34d7c6f3255853ebacf5b3ec19b864e0a4eaee63fd719c21a72fc25b30b03207cf2aa45fd15d7102e5bae90882d00a812959593031ea3a436898582cae5eded5c7ce43de3dcac30b8690631e8db9f7a0a7f3f67b7524db275aafe02448727ff629d13afa94801d37526fbd9176fc4c216211037f8ec26b4f2672975887d70bcdbeef1e6ae99edbfb6c9a9c Msg = 4839d71aabdad8b15d9f37c3d37a346758d8941b01c83909e460f589855ca0e691096865cf62698353787e7ff517561801a6ca98304f6d11d76065e75ff17a8ef5c86d9582798be4ded181424175721afac7477e6309476c14c5e750576ce3cbdc3d8db3ae68655b6674eb149fdeb1f3a903b4d5823feca1015722cd55140224 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 796ac3f6adf4eabcb7a528ca63a6168ca6d31d5e357ad7a3fd180334a90d22bab20b762d767a6e3077c2cc8732784e81330041dc79068d50753bd4109c9c6f9ba03b5ac44efbcc23ecda27948511645fa17897dad7c122957ae56bf4ffe3d7bef85010b33d3b91785b0427417d94b11f73fda90e6a8748e6acc1d2d582e8836bc7dbe196876a9545b2a3207c1d4ec28acf8fe6f24c240b56ab3b4e4313a3d951aa1a558230e5f1eaf38cd7fd9b393d58d359f58f4ae51dd3971b418c5b81d0707cd9e2c33a148e492e74bfdd565eba8b1f3935e37a9d1a8764cd30497066e3c4622611fc14c45bf46fc85b3ed3f6c9d4d65e9925fe4b85ed30ec35ffc69c5fdc2bfa35d1bbdcb20e399cf934fe938f4c5798cf091d51100b4db4be42e81901e5dc79a98074119b7980b02821f4c3ff8ea07a2fc09a701978364bbd00ce4c5e2e45629526e34a3652719d27a47371480daf52fa49844f6495f35e6f5e3116c00b27042b3cead283bfc577905f8be87f0d5daa13d1ca74203a9e0d9199e885f4fb Msg = c0b8b24f4b8e0bf29168ba73aa912c97121f7140f3259c40a72a6d6f78da2dfcabfcda00bea48459edaaf7b5fb5a9aed2e6d97959c393cd1a524a269c15e8c207cd09142be4f7e7d5016f6f19c735b8ab4c0f28e96954172af3cbcf29d65a161391b213dd5f7c006c294fe5016423718abffc8546ba373cdcb5a053196573564 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 8503b85dbd9eba8d6fc57c6ae2103a78df1fff3600585e3e18f6ba6436a3acaf8e49fd12dcbb37c25b4b765037f545c3da8c39ef6842bc9ec264af6f519272f3d8698ef2ceac55393baa9846a7961b738e41f6360053d866763c824bc5873da14a28eb47d68d67f0cad7880853aeb561045f757a31d9f5c756f54d793637d721c88fb1f60126d3d16478f1fc15e0c4edbb531c2ca2e2fd9e8dabe1df2c09fd55bbc724ebeba290a7646249cd779fa1a923909b29345e54a2e25dd935bf0612a5580018b233d765a6fae3b46ef51bd8325912f439a7dc40148fdb754e2d866f357b8f0ebff6f18a6504ba31d10fe45226c88c9207b9be3c63261d75270466b43c271f75b1ab3c1d6b5a00dda8457b4d5c2195f320b0bd545fdd0679c84483c14a46b4d43c8452879725aa91d01fcc2c3867391c72200ca5d628ed9b566389f02fe74ba2a428a7ba31c00ef6b8d38c6b82b7379d2feb11031848fec0fac5b6091eb7607138bf0b96c3d2c174b5713d0dc8470b532eee6ea0ca1e8ffa3b15cbe0bb Msg = 4935eaccd2af7c5b99405471bed9b21da8965004f5e6f2a6b7ed3ee2dd26cebcef4d845fff7c1d5edc94093f88de7a3aecf2bc3ecbd8c435f56e0b89bd099de7ac5f6c4377a5eb1c2ff4d801b8f159547cad4b4e60cad743f8e04627f61e1652e9354d8024710d1cfb2969be365a77f2bf8fa63b9e045257270a96c572ad6285 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 66d1cea94b9603efad92b6ca8a1fbe0c6c4b9dc60ec0ab2c33bb62d27a100e839378a39208715de2102eae384ca407e92787ce1118f91a0ca2640a5c93fdb78635bc91082c99968ceab289890b3ec210d6cc6f1cf7e0fbe2dae88155e88f2fb7b325ab5e529e4b63493e551c53ae38c3fbfae49810050a81cdcea627da21b63224612d4361b9df19761d6ead44488dcabb50127149f077c2963afc049ac8837ff2c29e6a35593e22531ecc2e9ef8bcbaae4349bd7227ff3e13b31bb929bbd49e50059f28fd9ffe8c296a056c2760e5f6d8dab43e9bd557793f0759ad8e08b5c3773a305a0d316ff9bd07b43106335942055adc461a4346f05ab455780f32027de8b8bb6d4845bb24d0c5a21c293d2b0740e8d06ef5fb9dbdacb4fa1c6225fd4e19dae69a8e2cbfdff1ef8b7f21804ead0a45274c735fccbfa1d60bf497a3aa931bebac2e0c8beda9af596dff0cbe11e8d4602d36b2f6c6f5bb80f12f4b9daf2c0748f591098ea63d3193f50a1f4737efacb62ea85fb6fb212b3ec8effe788e55 Msg = 3b8a68da11b61b5fee1c2ca00a6aa35bbfdbdd42855b284320ec8d0c1848edcf6ac850427d8479eb57bcbe9a11771637886974bd561a5387014592cb717e8364a8183fd4ad463c89c980215ff629d867956ee5e75f71f7a19ea7bd589d7efb915d44dd9789448bc1ac32fdf7a2c911734db2dbc589a83c1a61dab6bd83907ede Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 790058355d7ab9eccb46ea12368f3be9cf6b895e1734eb20a13c749557b9fecf92b316870f0f765864b607439ee5f7e510e2c83b2756a0d9877b48e0cf257b13c997b9dc70421d2d87c9b9e5625c36a17e21e20ed389657a3e544c677464eefff08a9ee4adb091a9fbce7626cdc127b5cf817c2a5f069e32c720bc2041cd21a6bae816dbbbe28552d022b7b608fa99da4d217dae8a69f54004fa3c004d50540957648296e14cca729f791b38e3645204c2c6d4cb678b0db63a181b40cd9851be84629a068415d54cab5cb5244c8dac8dc9799a0df1b58cebfbcd8377a391778869dd275e0dc8305eb0351d81e3afa46719355eee4f90894f7fed662dd3b03270660adff637b91e18330a4f3a62c914f0d32b4eb6a30b79371ab55190578a1e7d43294bb0a721def7dae3e021981707930bd9b5cb58675851c83acf330c6ba3aecb3a890ad3c151a1e2b583a7dccbf204850daa9f4679e759ec056abef7ba4d6e0bdfa57a5c5afb6368b048a2b74e3530bfa8991c55de7cc8bbfa990d118ada80 Hash = SHA-384 Msg = 9221f0fe9115843554d5685d9fe69dc49e95ceb5793986e428b8a10b894c01d6af8782fd7d952faf74c2b637ca3b19dabc19a7fe259b2b924eb363a908c5b368f8ab1b2333fc67c30b8ea56b2839dc5bdadefb14ada810bc3e92bac54e2ae1ca1594a4b9d8d19337be421f40e0674e0e9fedb43d3ae89e2ca05d90a68203f2c2 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 9687115be478e4b642cd369392b9dd0f3576e704af7218b1f94d7f8fe7f07073e3e8e1186fa768977d6b514e513459f2373df6ec52e3de9bd83fcc5cc3e6b97f8b3fb534163c64f5267620700e9d8c52b3df61a7c3748ef159d6b390895afa3af59109a5478d016d96c49f68dfc735ba2aafd5012c13515ed6644f0d4109c45556e14a3821e1aa24beb8a81a48da27f131de84f7ba51581d81b8ff31ba92b8a1fde867f07e32e6c2709253448174dd31324dbc32b05f07587f76a9997decb80f38d8c13d0f6eb3c10e3d96a2293f7464f1e04602ef6e84c2d0245d7db256a67d132a47cae9abe06b61a8968f50a1749995dc15ef0dcb1d5f5959e4d454c8547bbb4d195698f484617bfd122acaae2d0e8c76d28b24005ab03caa781ea97b1c4d9396a16f7998eee7ddd9de4cabe57032d9438a5d99c6b34a956122350263c7e998bc61dec91381012e686d079e39e96b1ea4bfdb7cdf630ddb422c6b580e5506c9cc3d6c100f2041d17ceaaaa54589249f04a1370ffa3bf3ff1adeb890688698 Msg = 752a9916f449aebf814ce59ca6e82fa8038e4685419241c1488c6659b2ff3f7b7f38f0900a79c77a3b57151aff613c16f5020ad96ba945db88268722ca584c09b4054a40c00901149bb392f0916cd4244699a5e6a8c37e9621f54b471166797a7b58502cff4083140827052646501f5b5f1bc0b4e129147d7cc157cf6e73ec58 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 6646a88ee4b845da4931274c23840dada6145fe0af954829d1d56661546a25e46316e216bb6b9446b368884ba14969a6f68ccbc1cf5b4e7a6d3aabec67f64963f63b088fa817c855d776ddcada57e5daa50fc1c877389c3cb9d99095a869a963bc91ec24b2422ef6b8dd18fd20d2b215fee6e98cda415ae44d2d2616fe1708292a3ef50a075170b3a7ebab02918ab0301794c17fb35e2038f369d94dd49569c066f7c392889dc4b878c50c7e52586b5081114d202338d23304f16f912d519a9ad21baff0e3d21761f373d08421e10108a983048fcb90eb2adc7c7f12ffa1571b091c781b255a77a880e97975f14f42baf5aa285ecc142157c3e1addd6aa0c09253a11c59144abd3b1e212d89e27ed96fb75756afc20ec67423b151194cb0b0648c659987a5583cb7757779d8a39e205e7101a5351ce1af2c9c6b0847cca57af52593323905e3d2297c0d54541a0125621640fe1deef13e759f8f6c56a2ec2a94831ac2c614b911e79edd542fef651f5a827f480575ae220c495f2a2842f99ec4 Msg = 0403ef219938b8cdbf85d3b88cbb9c60d174134e43a7284cd87936d37456cdc3c541b4566b682e575dfc7d8f883fa581b9df7257bc82bc1bc6a2ea2a109bb5e6c5022fac1e390306cb40fe2196cece8143a10af3ba1273c368ec7a30e27e021dcbef6609f9d2be41d3fa5e54fd90a0c83862e40b837ed4ac8600edcb31283bcf Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 0a217503fc4870481264d8308292c663476b25f8dec08ea1d1276f0951ec6df27aae3beb93d630bf8fac08b6cce50bd92994851b4f310fdddce8e0d6a8b7a1e866a567b298c5577dc50d8a906ab1be880084e681b26456279149b4b85201621c445de13d127fb77e7f236c39df34052b4629572abe1c02c09eb198188003dd852f88f4f767f1000458680258fa4b63dafc761822ca8b98c1a121b72b1455393bee416d24051290f02a28a7b49b18b30ccb29c26fbac991401a3a6fe01fcd0608920facae9d5bc56540c80f4740af02c9b7a078958a8d8a7a93a5e5b6d2571f49d775ef7c35a6d674290b52cfbcd67277e2b2e829ec437fb70e90537eaa6fe4548551939bfa98fc98e235b264aa6064a505a8d67946e2c33e5c6f0f34fa86ba65715c258f238b69e4f6e36d86a89822b4802d21ba0ba760b2f3a5bd061f50aaadff12e0d86627294bd0c4cd1085b5dab6a6ab30146c9bbb37de3ac5c4f8ee29736d46047e450cfdcb1279e4ca83ab69e858741bfd01a779d475dfc0f71c621d78 Msg = 453e0835fee7cde81f18c2b309b804c67b9fd9e96ef0a96e3da94b640978830e5cd1c8940c3d4af763f5334a7caf2d20f0b82541b3434fa138016b92dcf14638817a833d79b79bc7a71223a7e0144ed4977bb217ba8d4f07d7adcd38832c05b0fc61c39a0dfcca3f32971931fd8e6dc9b81107d44c77af8a62d5f9c0c7d0c75e Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 6ec22bd58c32d41374c017a77027e770f678fd81017e20cdaaab48a8324b050749e5d864082f1f77fecf67a59c2885e931c3c2f58130fa6806fe1ca899045114b09d09cf9c513ce1109d2210511a3b2e93af511badad2716f48555310e6c5f547afbdb0b9a684491ff3588df933d6b04dae8883f5f8aad62a4570646f72f3656c4a7085623f5152164a81a06ccb59ca478c5c2315414550b0ad8eecd0328b2db01fff7db0f26596c41f970d032925887f1c8a446da889be64d48925b9c6b79a3d897700ab40af20b451aaa6b427ed162864db89f7824b6ae9b475b5433b865335d6f91491c1e32f635cb930dec1aa3ee7ddaa08e8ebd67b6b11a46ba049922446fa69f1a804acc29f6cee487723f2e61a40007865d80cde0119f3fe6e161a339487f5789e1fd23ac0a63b4673969fd8722e3edc9439778928f09610cbefbb42fe6242c73b68d466cef889da156d9d4ff888362db4cf9a941e80f577c944b79fb27dbe0a6967e88f1f67b91b0d38e083fc0c0228cd49d27352521312163f90fba Msg = 9aff46c14fd810a039c0a62eda403f5ca902ac41b8e225c6944748a36cb45f8a769ae2a18f713d362206d2af4a1742bf3b1de8e0de69a7fdbb72e66e1c6ed82a6f1f0138edf0f6677940643fcbfe5337cd76ac29456af902b5656dbe7f4c24944d36ab6db07dc39b081662c8a31dfb2c29b4ff04370ea43f4ac7e57adf77ca2e Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 62a505b3f3adda45c6badb61b464a28bc45d4c66159a34b63c1cce32604242eb8fcd9ac6929ec6ee4ac1144932d725cbf4638511464ec70dbb5543a4487a241396adb804c9794b271f9d35310ee560368d949a20a2b64cb4617fcf63cf7b60978cad734650dae86c7e51b766522ef0be48bceafe2030564d5b7b17ba125097bdafee48e4df60fbb7ac2d9f14af9a270c2b7ef18cadac45b9b54ef230794339d279d72ba48783bb09b1d1d5c1c65301276523fe90e63789ffbcd489e45f8aa9cf98f33de8f7d9c5cdd21a9ab2847896de6dce0b92f07b1ffb4230ee71ba1fe8048c22dd38af80f8762e747cdec6e99f1ce0d1c743ef98ddbaf7c764412446dca58e6ff5ac0dd13322649acbc96f1c5e0bc58d1a8211853a7d2f51538c5e5e803de0b13044608d6e650bace12945a7008194586e3b74809714b2a52e9f3824be41de9fec3f36175a289baf9fd68b7e92f3754e00b41782d055faa65433c25259aa653fda069386b083fb31aeec8e30c769553f8f0389b6e6d4b392cadd24ce3f74 Msg = b50bf2767250f14fa7b6f5ea21a54da8d01e91151eb491107fd88b2d4a5aa157c72d89ba896b87e0fe989819442bf0213e4aa7fde8d6b026e7a70ae965193a0e1bc7f8b8af96298c41f60d154164ba678333c903958d4ffb50b50f57ad8eedb6da61a6398ddbbf9c9955bba6bf5991c4c6615df1cde156d8e188003dcbc3a399 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 1f068bd083a26534040f41c1387e71a8c00370c5f1c958127e0bc721751b5940513023fad02a6101bbcefaaaaeea2875952bf859d494bfb23fd89149d91290359ecb44ecf2fcaa5775e2e61e5f8d5151343576fe9c7167e919a5d081dac6bb8117229c420fd2b0fcb521f4e72366bfb443e688a65fa392eaa5115c292ab05bb4db65468aab267178653dfa0a5efc960636fcce86433528dbce955a0b1aa188ac33ea128206ecc0feeab8f7df6f8c381b10489c8cfb2d02459e4cffc16f43a66aa4eaa19bc518ccfcf9fc1e4861cfa13e9b41fcefade2cd2ebc001ec8430a1cb949a0f2f876badc568c703e4209e7ca16f688ba9705c14fa1c882e6c4871b9deff31521d2d418e0342e189c40ed19c1b6f4320d89a36f78eca143d3c16dd3eb338c0743646fd314c725c2d36a13080bfcdeea0e431de71d61f652033a75424fe1e1586695c3dc463ad553c1cf3ab24a41ff4e031f9e0c2cb0024cef68273ea3b8c1be9d923d3e9c9686c41977ac7be94a6d23181936131c17a39a898c943dcc8b Msg = 5ff000f84a951dbfdd635a4d9f1891e94fc2a6b11c245f26195b76ebebc2edcac412a2f896ce239a80dec3878d79ee509d49b97ea3cabd1a11f426739119071bf610f1337293c3e809e6c33e45b9ee0d2c508d486fe10985e43e00ba36b39845dc32143047ada5b260c482f931a03a26e21f499ae831ea7079822d4a43594951 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 18cb47bbf80bad51006424830412d281c66ae45c0b756d03e5d8d49f73037968d13df46ebebd9b5b4c58b164d91d0608e8ebe31d8644cb0bebfaa8e2ccaa1f5746ac8f3bc02ff6930e219f53fe13fc070f910ba1cff0617aea6eb312c1ef285869746673ac1348e89c3646f583d7633f5a2341626bc2e7e2087ff9d8f13d573dc6455dc0068c7ac6eaf5b3093b081614f7b252170c4893891e469121fda655a2a55d67f5df0ff6e29ce5f9b0c3a1a88342140ead748edeea9706d6570e900f1cf3a9adcd7ae64f207585417946b104b3990d1a2d950e0e6a5533d3cfc8c470250e4c797273210f248b8922ab00422f2ecf85aef73587e8c5cd1c2ee6ed9509508409673fe07ee2c462c52d091e7a795d8d3c55fdd5a710d5450695a5a31ed76f115e71a73c6757d2def7ef472571b0bdc7558c71eaefeddec946860b0c77936db31f2001d0499a381e5018870b41ba04c8d42ec0dc55c9fa2af237dc1c405dd8f555b07a237cc50cbce46c3016118cf4ea06c047599283ad4719d647a225206e Msg = 531dc2b8566e01a8bfc580da607ec212fc1fbebd5a2590d897046f0ec069df20a1c2278ad70006642d9ba28625d7c1efd4473b68f38fb064346d762bd2fbd5376c2e77de13a31a32a29b88264d44c9f27d3a97b8dc4d1267ab85b5e05c6389575d6a98fc32dea5dbc6cc1a01034a42e1a000b8f63ae720a9a7511474872a6148 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 80baa663877615c2e7ca9dd89958a74e54012efad55ad05868dd74b0ce78a661e2b893c3ac1fd837f282327efe4b041220942649b5472c1ac702070787ae5549398a57653d5fca69cd5446d63f6e9d0684925a235acc96b8a10bdf14fbe209fcd4930b5945910d84b08867b2055fe8eb1d771b753759593b90d6aec5ef182cb33bf2fe29e8c67ea4e8433ecfa3f9ba4ce461f0ab19997f299e95409af97bf57e2de410ef7538f699f385c1abafdf9337f7f9d268da87b2b389131fe3dbefd8c67bd2a158cc4e04f9ab7fee2a58d74d063e6c16958a90574e3e4cb881d32c3116987e46bf5bd44f80abe6b9eb717a9fcd4c0cfe80dd2ca62c33b5dd3a59c64810073e0476085ec7b76638983291b69559c815cd3bb87d4b07e24c6b9ebb7028e800a04f09b110c167f6ee3a3bbb73695d89bee92407d4adcea3eaa47811e23f8c7f2fdfe891f8cfc071cb984a63846b95ec04d6261bb1c5980018feee15c4e7bf632dc8306128fa22c47decfd9e8b099554f17253635e6316712e0b95efa3fb00 Msg = a454391a7c3695486c337a41c2add417d8e9e9c6466d2ebb56ad5f97b9e7ce30784cfcd82d6066e372a3a1639a71a9369f2777435c87d100fc5e6638b3631a0bac639f36429b4594726613e5901816cf3a29f9228b96d66090844c7d0026d2e327e24ab924afda6554c2f74f0e69c2e8913798ec3a61e4e4fb6838ee08f89dc0 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 261180717edd905b647bc869f5259203811606221f545a3aee5fc123f297cf7d8a7ee6cee3dc8f97d24284ccdec2fd4680f1428ee75797e0379512aecb9fc1667523413e323c4bd7dded5caf9e5c606e5ee0c694d4d1b5a1f1cb613b980129f64146e42e8261c1f7ef5603954d34d56a50f7431beee5ab291a4759168655a5123640d596b744d97979d39f874ea7ff13a7466a7655d02edb492b58049f2208852297eb023e657f3240c5da9a99fd377728bff3cc073109c31712d94bc24e08c433533d4b86a73b58fbf2c598ccad78d46ca0a055601850960195aac1364dfaddbd06f14a78aac2ab4d374505cc61fc72c1050647d95a733517b709aed2d896721e7484208501480058fa4f6044302dd705c273fa7fb42eaeb02d025092b252e16d270d88dab6f68fd7ad571011f89627683e029d1bf1edc149d47452ebe87ec68679579940f5aec25999b0dedb820a5483ec6901abfee041c03b1a7f743548a2caabca613ff5d9f8fd7c694af12b29f2c2468eff55f9e008757443960fae459e Msg = a05e5782a96ee6d6f10be8830d8c27c0acf272abbf77e684dd6a6c19e5398381e5d0400d3a21927cf904cb6e8e425c1ca3ece04544f25d6c40f0c640d24bc45c807db53044adf63fea835d8cb93a0a4e55f760ebe4594e247051d38d8c34c1413b0ec1d30d3a97888b2fa7c3d59db8c08ab9f985e8d4411635339be95d1b0299 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 87d80275df7b196b7e1d0a41147719d773edd80b5627301a500d91665ba86076e6a31c8f3ae86aedb643fe2af223976ea4eb3d4dca2cbcf81ffd14b7ef7de3ee355a8d0f4143e5b0f0a0950a42811102e602cd214e1c945c47e8b7b66d507103c3456f404f9c48aa7fe48dee0aad05e599f242adcf8ccb0cc9db3a6c244a913551ab595600ecfbb67c25a95b54f4054397abe47650e5c4991edaf1441ba9c8e3fbed904ffbc977142ebdc84769865a215158d5b052e75de318d75012172e28c31db2d8bd4edca787216dde2a7387c543f162fc91924918fd6c845bf1ebc0220a1027fb4227340ca4cb0f183e5b34b1e7f93e14fa57bb9d2d2ea53f86d838bcbe3f055b473b0b469afd2960c0d76ce2c30f3d49a3b29065bb9260248e728cbe328bdf502b109e1f20b9d037860cf9e261611b4cbf27ff9b5bf425b2612afc7cfa3138f78ad26077cbfb947fb2aae6f4be85ab2d1a15860839b822dd03a1a92a19a5c7244e98bdf561625ca2a8df410ff855752ebdf3d49f5eb98f228acdd52791 Hash = SHA-512 Msg = 44240ce519f00239bd66ba03c84d3160b1ce39e3932866e531a62b1c37cf4170c3dc4809236fb1ade181db49fc9c7ccd794b433d1ad0bc056e14738e0ae45c0e155972a40a989fa4b9bcdc308f11990818835fa2c256b47ee4173fb4fed22ccf4385d2dd54d593c74f0004df08134eb8965dd53a122317f59b95d6b69d017958 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 8f47abc2326e22cf62404508b442e81ad45afff7274096b9a13e478cdd0a72f99a76bf517f1bb0f872a523d8c588d4402569e948fd6a108ae1a45c65830828a10e94d432765314ba82ead310fc87ac99a5b39f30ab8820bf69e6934a9c1c915c19f36ea7717eaff7af67b4991315b1873ba929bedf18a975be808e7aa14a6726126c79cc93f69541c5cefdeb5b67ec279d8f5a446583e4b4faed1685140ee4b3b757c8ff4a1ef9cd76a88e05319ee62003d2d77290c94c579b0ca2ab0deb3176ef10a3fdb85c80ffbc9e2a665a23744fc836f9a9a103cd9fb756952356a2f1acdd68a645e20179006558b5d4d0b9b0bd3adf5e290f49dae60b9d19920953ea8bb237d5b3dcfe149a60f12a4ee3a889b33bcd3a3b753d610757cbcd093dd5a734255333689695ab636963e3d215a8e77ff31973718a4944a1e9e44f45754d39f6fa431c53f9a2ef36e16a5f70636eb5fba54e15c20a714f2809a7cff4b8dc1165f836607eb5a5a3bb0c4567eee26941fef46fb41e73b565c0cf8c72e404221264 Msg = 06d5534b7769256e8cf65c6ce52a3e86965a1fd12c7582d2eb36824a5a9d7053029fbeac721d1b528613e050e912abd7d9f049912abeda338efa2f5213067777edd91b7576f5e6fa7398696599379ed75028cb8db69fa96de7dbc6de7ca128dd51ea334e8cd9cd8fdaefbf53fc825eae836b6c6cd70039a77e420d999b57caae Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 913fc118d5ac1edffb4b8fcfa4e85986b46231cef3dad911d5e9534cc88261f6b6969b75a3f25d83ece7ec2034b01d3b2be6c5bd958cc4afcd44839e3953f01e4a15ea5ef6e1b4b0e8ae90bdfd404199e8f86547f67ff6b84f2162c4311cc9eee06bfb2fe46198afb9745d9c443833bf2387eb92406a6339521396f2cbda55d98fe64074d2f2e27b8bc6a79be3d1cc568869b0b50fcbf702b0831668fbfdedc2d1b5491e8ec623edeb60ac870e6e8d058593fbbc938fbf741700efc2b2467e7eb254ae008509e91607f8e50aa16a4e851abca7c8d20c6ff61cfee6c1fb676098e5cdf127c9b79538fd1e6c014161054caf43b734fa69fe06a00d76f710acc198f3da906a7d2e73a2ca882526cc354dd7630a303d8f32c655b5b33cf78859beeaba3f9ae052c8d7471cd2bd9edf42fd8f70c3b0aa79c076928068ca9770959afa632ca6aaba6679e45d6888c50125a73b9deb00d42a125f25df5434beff0d5b0ee13a16b17045cece0f2da7577d79d7cd75a4b6c5bc345f460a173487b51bc6a6 Msg = 756c51bae61d75e8cf44930e1781dd6b8db6bf8b1f68b4ca4c685d14dcb2d4eece953eba92149f36788df34769987af5d53253b6ec1b4cef117cf9b88bcd03e07ef6c3301ab40ff4133f54b8512ae550e88a931b4a5a7e88bc1e2bd806c7d6266fd709a5e8c56d2a88a3e1ea38fec984b006a842a2eef29b34961bfdb468f4ca Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 735186ebf08d505161a8bab36786138414bb5ca2f4025289af237a40f8d0963df9117b619f83d9a98dfcf74b8f001a4a742c85ae018c3b51f16eb5015ba7027cb9a0d0b9e6b65c08ba58b671a9b3dd62107bbd5ae932784d328cdb2e1a551eb67e9d33ff1cf9bffdb223afd75d3650459fdb58143cd4490981efb0b3fe36f642e1837a5d95c3d444af73729dd1a5e9937b8114a28e065d1081f061049e650e45ff5ccf75c246e2e9433b27e79a1b06f7b6b57f9b009e97168a61297cfd0a8156d026a6bf8c3764d0b715c619d856b061df35725498d86cec25f7e1da65b99d9ecbb9a1a6364252e4790d97ea0ffd6234b515929b5ef22676c243d386ebb90a22e67a0e1d1094dddf7721099868c31326814887b646ca52a2c4bcd43f7c71399e7d13e19de688ae5c20463df5965d8255a3e6928d614b601274b757cfacdd4002d9ba8b248ae700d8776475d79d0a55ed4241c9919a3c44dfb9a1f5d0fec7ca341774c596144c38174af59af6deb8937a7d14c459b5d768a977445dafee1a4eeb Msg = a9579cce619ebade345e105a9214b938a21f2b7191c4211b2b75d9d2a853805dc8f1eb8f225b876ab857938bd0ea8cc2ff1ee90087030976e3f46afb9f1b1bae6d3874dd769d0426ee7dcbdceb67a9ad770e1781e34b15a45f656328c88ff485c1b2a083056d195afc5b20178c94f94131761cbd50a52defc8502e22cbb6f42a Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 603ff63ff638f1ad410e266d82a04c6d475416a0470d97f483c0c99e8fc7212d61e02cc8b4493c9a9dac711d2a8edf196a26563866d68fb04849e82db0f9741f721f2ba4e9db62f6ecfe3b87ebe7feed0c9e2dd46c3f9252d4c122c6bf1bf4ce215ba82fe7c5a91249da70dd30fc9c8ac8b3bb2810b4ff38bfacc13fd41f6fa26507a055e0f1242f18ea8ed8a702d265f893cb4eb61a3dc8e18777157552a1c58db14349a0d0a2a900a0a1f4de863fbadb063ad2a9e526a0a8c3bdcfca5524c181637b1c4a574809fb45b2e4f06f3f89f4ccfb30217b32fc484bb908276d659a0d9a3e7e3fbd46565a0924f918b16b2d6527ec4b5d1d6ef6d6720f3e00485e87de61ed49ed13e85ca6a10d46d4ca4839f486621cca48a7f955a878c4785d55de96facbb91b6ea12e9e4fe4beed00141b0372a3812465e65030f4fb8ddd58701aa3da27d26feb8644f7c80b8ee2a3c3b20a516c7f0b068b503fbb65d3f3b84b253466a887314aa8eb9d85cd035bf8dbb178ebd8d5496fd1b68432457c78c69cad Msg = c3287c23b613aefc2425a8b8317d647a447816bac56d0c99259bd9711f5fb2b13eab18e8a0b3b81ff9e98f6cda2c51c4343c0c1118720884c0aef32dd3903ac9e5ebbadb3d7698fedcc56d79bb78a71453b32c2a62ce4000ed4da85581120f3abfd1aa2418c51840d4a18c0659ca2d11aac3bd2e2ee879b3b3604112b24df9ad Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 878b9a443921bc7d720e3e288e8f39e550113e01d04fb1635a26f796fb8b161d5b758cff914a2441d8350f8d3922aa5615edfd86501c9a05c210c93a1ae04ff761151dc8d652fb5509ed100999d2bf6e40b1bbb64cf6c5d8e067b445daf567137cb8f0863996de8de9a647f982c9e21a787ee8d72657a2dd42ec9fec49ea1c3345cf004e94594a064b6b6b222845d64c935b539d3fd2d535fe0e47ac6746028e748556c2d88e4d40707e74a1c0cad5cd95dad263efd3ca637ac6b8f78ddf7ba81e443b836d85a83dbe843bd6271e45d842e1bb241c9c18805f37bc19838ba2bc6cd38401dce0cc9780306ea8a87d43110b3e395bbfb81c3ba45ce1cd71596ed27c03e2090a7ee81f60119e187adff0d96acfbaac38f7cb503039ead9cf9550ded5693d3c257406dd0bc061d451bd81d64f969b7c2b84619f0dd82481781eaf5b8fc82a3ac5b9fc20b42f86d4225a435b903d2258f5cf693d1b5c6a5d144f7f4eab9e70de2f3879f68e4c1c7a38dda63e6186534fcd78d58db709bf57a78a848c Msg = d54c51f90b278c1c602bb54a23419a62c2e8527229352ed74a17eda6fde02f4b0b012d708515a6215b221d2d291b41cf54a9ad8d562ad16156fb3017fcf2cdf6832fdfa21015cc41429355dd0aa80e09bd2612c867b6f4aa631cf93828bc8492665dd157522ee6c53d06c7226cf0ea5a24e7eae904de7ffb9804aed22a453d69 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 265749f7afb1e1d16492eebcee9f5004234e1dcb95b832d14165992f4d1c49d518ba15a6b3adedfd803287cf60ce8c915882e2c78d69ffc46fdecef008e5d7f146e38f268efe49065ddb6fd7969a842189b9d7b3ccb32d62aa05e87e932930f7a1775c338736d9bc8f36521609d8be0c29fdd1728430a537f0a2b9b9fef2cd9f0946c221c08aaa0270e3187ee5c518cfeb00169e7718b01ac0faef097e9cb6a4df3e87a5548a6c3d9f1ba230ee1caa01297e5f17d1be1d776552f36638cff13ab73a1058fe7c1eee28c76a145e9ff9b17074963c22c6435b6c5a619a6f39df94ce348b244320b207a9117e98b9aa5a8c58516d39c71878c4ecfd741ce6e51222fcd92ad32d70c3b92cbbe301dacddf2ec3aec21fdd38a7e110f4f5448577b9546f1a7cd71a35670c1ca47a9199437cbbc65926cd17dddd2c0c3b1ffebe682be616e638839744a147ea897885afefbe6f0e37d4e482dd005f4ff199d0d033bb753380780c90228a87d14d8dbfb829a195b5d8b2dbd67c9eedac48ae639c158eb3 Msg = 57724b7062193d22f2b6bfd18461d87af122c27bf06093a5dd9c1d92b95f123971706cbf634b0b911ecfa0af6937cb4b884b8092bad7afca065d249d3707acb426df79883742c7752692c011042c9dbb7c9a0f775b09ddf950fdceffef43c9e4fc283b72e7e8b9f99369e79d5b2998f4577536d1dbdd655a41e4e361e9fcb2f1 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 84a21a5cc060d141ba9caeca77fd04be8ba8270235e9948d0706dca77413ce7f0811da8b2f5372f8ff5a2eb2bbeae43752c5d1c1e3877992a49574899a6ec9d2a9483156540322fdaa66eec4a2601c281ea5ae996190853644b48231bc22729f32c2188e5f5f7b5056fd3e99ccca3effcb9793343f52a9ee60217d1c492102534a334c1c60a9c4ed63ae861bec7de9898c2dde026d9a029e7d9fe44d552cd3763b8ec3f4371f4e682315657d72a888913d15e1a84a981b3d8d437589a6deb37d14e86aaa365124bf165045040b1f959accff35565205d0ee72bc56d273d1973410774cea7735ca79c6bcb256b54fef0172e058ba91619c66bc45e11b6bcc0f68b529ec3a4133598bcf09c9c4bb0f874c7095f3ebbf85a5f669bb3717eef929fb1c22943268c310282e8842840aecfdc942a468045b02595bb16336634da20ca0b8d758cd30a2b7a0bd0e3e2a6f30f36a1422adfed88e211485066d6c0fa5c986f1dc5b4c1d965021dcc24b3f729f07c02b47af75d01f49da3dea0f1bdd6b4c0f Msg = bf5ff776122898e22333fb6da96d2a87a3e6c4e63f28fe7afbc8e8a40a3af2a3f9e9ae4f9287d70901a293f23579f55b890dc67da47b856a9d88ac44637e35ad5d375d7e4d77a8bc7a7f25c80edef3d5bd8b049fa731215b80ca2ee9ee6fb051326e8c6d0b9e11e3d7ef3957fc452cde868706b512f2da33eab4f7fc71b66a78 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 86ece9321faf1387de6afa7b1e16c2127e71e6472e093708f0ac4b40e6efb30eedc546907182798535ad6b88ae4a6f8c4fae429d225058294ef76d44ca81defdadd12cea16c58c660a4d158cb6728545307f5a6234c3aa16ae6d989b0b788cc4c18b08c89b57fe302ca6560affc57bd533bdec6ae90fc37167c4355b07c6c7c7aa2bdaf96002832d62c2dd090c61cb8658ecc0e224964b50b9abf1b4271869a8951d81cd5b46af4ead70b0454c01a7229ef2ff27599c7370e747988b45b9a8148575d73014166082947c97e8730d5458ff4a4606b1185f1bfd476e8fea2d1d7fb5d14a061f90e438ce5e36b489b5873b7400ed779ec82adfdc2d9314d6e6547dec3be9853359821e6f6d853c2292f1731789002033ecb46cfc3a7f197a18a677574fcf6870d7e47db874cff258f0f6589386fd9667af292c315ffd849bf71749ef1b4fc5a3fdf39e2782f986bc8f523162c0016c51702513ed17c8f68672cf425fd6ef8b6c8e983bd2128ce4614085e7fb216af7ff01501941f23ffbce556f14 Msg = 61b6dd24903672621810cbe3342497a6b298b524f7cd50e342914f483596ecad9122a2b341094dd99ad98d4ee1546b040d233f06cfc8d10bd0d5be4b3a5b1d9179a663924327847dd5b25bd380ea4c7965f9280c7d845074dcdd1ebc367b8020a2a8e6689e7a5f755304fe1a1bcd832d418237dd08e71845ee13364231dd5d82 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 57d827593ad09f00005ff1ba4521a9ab2717fe34d7af12d7ef5dc07814cb93257a2903cedf0a80704b16fd8aa9dbd06fe3d96fcc7be3843ea161e80ca56f3ef6f760dfc7f1704ed4a50142267b87d244c71fc72102112fe4ea801c82c631edd9d917808c0a1f1c81a9de859dd87569898cba76b35702232aa492850739ec0371b0342318b92eefc45e6ae8547a604d9a15c2829ea85533d6d23fb61ef569be63779d3d2c7cd3bfbc26df02616b7bdbbc0b4e2b5ebba7ec93886a369d10b7bfc0e7f56e7b7ccc814880baa634f4afd874a841d40cdf9c8f117535650b55129b8913d53417bdaf163d68e7044ac011a55ac0e1afd9279d46d31ef83a0bb4a7dbe70bde4b33396750b676576497e202e40cd1401fd6cb08878a6c22db61404b4c2aa88072f7a4851d9faaf016a60a7a49147fc234ad67f8375a90069c274aaddaea43df6292ccdf7daab5f5113070f8ca5e7f43c791acc7e1737cbc311bd5714abb66561703b9ac3629bb10bd1b7709f081840eb3e939c69657ea8f7cfd596b0265 Msg = dcc271b1bb2e50ebc23330be36539d50338baf2e9d7a969358c677e8bcbc7787433615c485c2bc2e670098128f4caa411b9d171392adc6ac1a5b297eec4d5b0f06d96cfd1f26f93fe08effad5147f0c3924307a2cb54d95765942e607b040e6c8b731f6372a22ea697a50b98668c9a5d004327e230b7fa1da23a2b964f29b826 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 0ac938ab04bf4efa587e34143436ce608ad089420956a72b23103fea769c03f02c3a0db764cd5bf3cc8518565b7efff70c74cc653665dc06e7f1d584e967ba193a70f5e3f7416ed0d4d5dc0e761b24ac8a8be172eb95691f02244379c9aeda8a9f760e061fd476b063b5ededa56bed819fb7136a4604879a92b2cd35507fd49b7d478fbd24c764aa5bc535a6abd7bff5c7692035620597f6329a454ce9188731c4e74d56c5bdef11372540b958cf2f8c42cbdbf915e0c07c77f04b05d876afbc3f2c205a4048826319184d650a243d192fbe35a163ab8ea84a001dd7c1472988a78042cf9fffd96f6948f0e692fc3f3b1c9c13de4b7a021be25c80606e1105cd56815d27c45fef995b1fea36e2e12aafc4a69924785c4855c50c61b1f43be9a1adfd8d7ff2ef5240dcfe5ea4613db4ad085bb0a6fb8627b1ed94dd164a4d9c4c9f375983734f9d2c35ec69d6d7421157d8658dcec1bf6599ea94280a63422376bfabf1b9f730292c498c953654401743c9e6bc499446759484d93e28d5f9f486 botan-2.4.0/src/tests/data/pubkey/rsa_pss_raw.vec000066400000000000000000002035771322470703100220200ustar00rootroot00000000000000# Based on SigGenPSS_186-3.txt CAVS 11.4 E = 0x86c94f Q = 156338023434107979514651798338563729249637525912770090189351441368020822580195477433999745376342560769338444087025460664195379900278296370069437383921420298228076331163131415651674241580325904029529616128045922103438679524384712750110560116385373016303987411746090738658853448866856795937640033117238282529951 P = 159091101059309944675449415093816973225018412330812326122276608906226478900324531221650142639015227567363097556108175722263356910366474614050971930072283120034761496108797309092812361209374083446121533016294833574983047736398746485174145216858529564223319486591370822604882909167368622594449311655525194716337 Hash = SHA-224 Msg = 3BE4397C9467EC90F5D5640834F6E9FEBEE4CE2477AA3F385CAB9435 Nonce = 463729b3eaf43502d9cff129925681 Signature = 7e628bcbe6ff83a937b8961197d8bdbb322818aa8bdf30cdfb67ca6bf025ef6f09a99dba4c3ee2807d0b7c77776cfeff33b68d7e3fa859c4688626b2441897d26e5d6b559dd72a596e7dad7def9278419db375f7c67cee0740394502212ebdd4a6c8d3af6ee2fd696d8523de6908492b7cbf2254f15a348956c19840dc15a3d732ef862b62ede022290de3af11ca5e79a3392fff06f75aca8c88a2de1858b35a216d8f73fd70e9d67958ed39a6f8976fb94ec6e61f238a52f9d42241e8354f89e3ece94d6fa5bfbba1eeb70e1698bff31a685fbe799fb44efe21338ed6eea2129155aabc0943bc9f69a8e58897db6a8abcc2879d5d0c5d3e6dc5eb48cf16dac8 Msg = 352588E858A377CF7AA3A7B4C969FADF083DA395D9AF324797FB7348 Nonce = 463729b3eaf43502d9cff129925681 Signature = 134e6acd94b76a86e7ff730f064a3d480d1cff1687b993163ce09f21d494a4a15e6d92758a93f7c83ead21c4ca290f9478241c9811c231f32d9d17e0b479a9b34cad02e5bbdde6c8e4ec4f35f93524f8afde49e6a4740bab2f2fdeff3fc5d92a1b50adc7af964eec82fb80be24092ab28791807c664a9106b5df3296747c014b75d69d181f2e58dafbbf9127164f88c862a48d5e9edcd6d2b2cbc20abceb0e98c7e731d27c8d04fad95ff50dd64af20e6388ed74b9b3cf33b4a316b0c752f33697e5a7445ae2f726f30333f107928872776225a3e0b1b14a7e84f9a695c7b3910330d225b4834110b54d6b05e69df6b7a2c9dc352942e3bce970cec677253230 Msg = DD3FD17C5565319EB089D1EAFEA73ABA534E922F296AB3CF00B391ED Nonce = 463729b3eaf43502d9cff129925681 Signature = 45541aa65fbb0773b1434c4fdaafe23fe800f78eba900c6104a6f0e76dc08daedc28a3380c8078f82055cd4a20cf30541c32d9ac625378355c156880b35a29645325d488f7a0d2de7df92cf9bccdf851445c2b834ad0e6849a6549db72affa7ce66fbbfc5bc0194504a5fb031267b6ca9b57f583e7e11c927e3dc203f7d6d4b9df675d2a302231400008fbbd4a05e17f88bea074de9ab8211a18dcceae6c9fd8fad96ce0626eb25c9ab81df55ba4d0a6ae01eb25a2529e16c98ded286cb345d4fd59124297ba9b3efcb67884ed853ea96d74e00951987bcda54d404d08f2baf7f0d7ff13d81d1fa20cde1d21663684c13ffc7164448f4e85a6c811a850a3faed Msg = 8AEB397CAEEF53A464E0FF076D1D701718BD0274B5126E2EFD0EADD3 Nonce = 463729b3eaf43502d9cff129925681 Signature = 07f07ef5e793d59b0c3f899dc846bb831d88dd4d2d8345ad2d726c5c532d13e05b26f0fd03b2b9bde7b6d5b6febc8fe5d3228887eac443c99ec39fffeb939785f87be8a93e497cfdea3d8d06356518a5254c5946236458b29f1cd47e97718c805b167791d10f9304328635330116a2aeae1e0ecc16bfd5a31356d06892b8ca04aec27a417320be7bf6fc1083d70fa522c23850f5d6beda1a251d1a5e71762bc8fd5f16ef0c7a961f4858a5b760a8032f3fd6bdce2ed26351f2beab8b89d9312d88736ee5253a9da6753283e5b3d0d9cdd3e19ca0b60b9fae3e3dfd67831df72ed9611d5f2b3ac256052a207a5245d2cdeaad0d1266c7177b1a0844d5974a8a41 Msg = 9BB1157B339EF98723D727270395665B23D7BD5D13AA42023801F208 Nonce = 463729b3eaf43502d9cff129925681 Signature = 4428c389d0c80a9320e4859e41cbd4a47f78e4da5d1c0644ff50bad172de9ffe74d84a76d6de4f72bbe34d7dccaa03e1324041cb98308d73dcff0bcf7ffc35936473cf3ec53c66ea8a6135742e0ea9056a4897a7cbd2b0654b344786bf3047d122dcbbc4bea1840e84bce066c3385dccb021a79e8de18dc114a40d824141d8331a4df6901b3409c30552519b097a96ded6793cbb9ae18bb9a4185b6f4e83aad6dce878c689bf595d272719b9f50b3ede1803dfae6dd3f54e4ca9c458c14463f4f19af6cc8127bec80a6a9e5a5fe0d3e14dfcc6ba052750ebbf84a652adde9d6be68d5b134cd09bb94d0875e5527fe3f3fa2a516dc05c14fd5516dff2d434f0c4 Msg = A5342517A686671C76453B756A4E61BE619E7A68EF41D5CBC008FBC1 Nonce = 463729b3eaf43502d9cff129925681 Signature = 01909328c24dd0ef912040f61492e3711243f8ca1262067cca6bdab165efe4157982323f13152999e9f21e6852d8c2efc4130e2c46a38446aacfc59fbca5d1a38946923b7e08be397fb787bc79a71ba08fc2b693d1bcbe897d1dface2858ba80a086a0e0a45efe66fd5350add819fd0dc1931d3eba2765f84f147422f5330d0efa0cd827197a5d89e2dd62db9051d5df8b9680169f349086dd038a9ac62f9941565b3f747d528ec4c36e9c948ad3a73240d07ef14b354ffef1b1965a9aafb13d0fc88a09707c6a0ad3028d5a5c6efaab50aad05304b1d5b2930abb8f58c0188b6a94231f8698c96ddd614343a0218494dfff9a293dfc7d5c3b5afbed8f079458 Msg = FFC14E45C7FD4F307529008F65328934ECAAB1FDC32609E7EA4F5272 Nonce = 463729b3eaf43502d9cff129925681 Signature = 85f296084bda823556aa369e5cb19e10ce6e982a6d10a85ba6af6d3fed8f2c05599faed069215cc9eed9e72a4fe510a6c09ff721cf1a860e48cf645438c92c5c86d0885e7d246ccf9d0cfd8c56ca8d673b7094a3daa77db272d716f31b1380f72b50378f595471e4e481851c57a6b574bfb3fc7aa03636632045fcc8e9cc54594759f6014b527877e605ef60cf109b4ca71e772a99acfc7243318655ec50f74e48485668ed42859ff2c5934581ba184d926c8467d7c35257dce9964049568a990f65d591c2db86b48a7256da947fd7d978dd6734bd8685025d1a87e32f52a0299394c93e6d518b18e0b8db1d763f46905f405df0cbc8455e039f173e2b68c9de Msg = EA0AA4E402FE00E7EE77275E27E243E2BC1D040AAB8BE87D7F0E4382 Nonce = 463729b3eaf43502d9cff129925681 Signature = 8beeb201aedb9fe7d535fc7989713062497a03e18ef9977b98a93f18f37545c38f5e5206e2b5df7f4a41ab9e0675f7d46d172dc3af90fb7b1a6fa6c986b803a7f2ea4ed217872cc686165b1278450c23c329ee2855f65e651c3db085e407bf3e3a96eaa833ba2056a084031546cea2f454f7acf84c3b90fd7b6210ef6d1ad71ed1b0049262f5b4e3ca99d10a3307752b2ad8e8fbba3a3e8432bc966553901e87150738aac9170fab1d27219274ec528299f8afbbd861ee837f2c86ecce7e73c9b7bd6f6661d1efe3fd2ff7b3efa0d1fc7b84fefffa14b55a2c5fe3252cae0cf0da6e50e3d615f86ae6721aa5e29ed3a1c71c243c2529eef483c56b902e93718c Msg = 37460715E3EB395DA56DEEC4C8F1B72BE0762CE3557848B24800486D Nonce = 463729b3eaf43502d9cff129925681 Signature = 54bec66241dc197ad92e695526b3b6a030216b48af90d93c36b2d70644e40cda2cb259f27ca9d141e5753f938497e84208b380ffe1788701c71d89bbea3edd352dabd32d9425edcf9a33e185cbc4031aa6069863fe47d499536a59da12a8bdbbf2a3a9f0039318d066f5117bbf6fce4f6752088ccc3a081d85da461a8bdcaf349fd4054f76384e668d00a6f747688c8420c7e452b0736ad62e1738a3f10cb62bc7ddc12fa670f858b2d5def9a42ac8f2fc91d488738a7c23168f51ddfbdae6a5d8ee1fc561cc3add4a7e14eb103bf9593cebf391c1f7a07d262faf03d47d07424ffb3a916a9564652a1be020a0e922e99a57da1abf931f74cfbdd484c0a9568f Msg = 4CA7A46C7FFD74809CE760076554225E5D82114AE403EAA520BDB3F9 Nonce = 463729b3eaf43502d9cff129925681 Signature = 4a183b82616f3bbc27a146710b28729161feb17900be62e69eed5d254d15f34bce52d6f3deba89a787ebeb0611e240cc23e16add3796d4a29783e2cbe8797e066cecbd66059c394f0e2f9e377f1ffa194fcb895e1c48874b9b6430a13c779f5ca29e3f42bca4b916710590ab6501809d645a4885b058dba0647971f04f6f2f4a296c45d89dd848b7c2f8777ec50846c97d35c12d54ebb6ff167327b1d4daedf4468031b59057d57ceddb79fdd013167ee6e46d9130693322c3ae6702901a1e90bd4b621d141977d0680acd524921bc540e34ac640ace02f89d5436808283e026e138ba3a5a4310fe1e048833f9b581baef5f891f9cdb2f0673bafa11ceabc7d7 Hash = SHA-256 Msg = B98A0D22E837B101874A5F0D7AD49836E6273FC75CD2D073DC81D96F05F58F3C Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 8b46f2c889d819f860af0a6c4c889e4d1436c6ca174464d22ae11b9ccc265d743c67e569accbc5a80d4dd5f1bf4039e23de52aece40291c75f8936c58c9a2f77a780bbe7ad31eb76742f7b2b8b14ca1a7196af7e673a3cfc237d50f615b75cf4a7ea78a948bedaf9242494b41e1db51f437f15fd2551bb5d24eefb1c3e60f03694d0033a1e0a9b9f5e4ab97d457dff9b9da516dc226d6d6529500308ed74a2e6d9f3c10595788a52a1bc0664aedf33efc8badd037eb7b880772bdb04a6046e9edeee4197c25507fb0f11ab1c9f63f53c8820ea8405cfd7721692475b4d72355fa9a3804f29e6b6a7b059c4441d54b28e4eed2529c6103b5432c71332ce742bcc Msg = EA98CE315C7D231FFAEC41AD0F4AE3B6C9C540B6780A88BF1A959222183163CE Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 492b6f6884df461fe10516b6b8cc205385c20108ec47d5db69283f4a7688e318cfdc3c491fb29225325aeb46efc75e855840910bbaf0d1c8d4784542b970754aaa84bfe47c77b3a1b5037d4d79759471e96cc7a527a0ed067e21709ef7f4c4111b60b8c08082c8180c7c96b61c0f7102ed9b90e24de11e6298bb244518f9b446ce641fe995e9cc299ed411b65eb25eaae9e553484a0a7e956eadf0840888c70e5ca6ebc3e479f8c69c53cf31370ab385e8b673dc45a0c1964ec49468d18246213a8f93a2a96aad5a2701c191a14a31519e4f36544d668708ff37be5481cb0ffa2b0e1f145e29f8575dfa9ec30c6cb41c393439292210ea806a505598ebdf0833 Msg = 3BCAAE6E49258FD7D17C28DDC004F7A77802A5A38EA8080E94474E03BEB4E204 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 509a01bb0360d1160ed3ff33432291cfbb63daa2933819600db7dd825aef13dd1e9a888a9fb6fea93debd4cf4bc77129b06dd4727193d7e8a2e5aa5a6020b64524e93abb0406f5a18f74ff0aa804919df4072e319ce8234431c94e8eef8c5ce813a07b2f66dd6a032c3e69a3c58c6b54acf08bbbb019df15f3abd22c67f3e2cbffe99887adee58a39cc30ac45a6e6e59283ee0890aa87072a857845f5cf3ddacdc776e58e50b66e95eb13dec49ce45505c378734e964e8095d34a01317768b7b9fbef6eb24b08b1bf0312ab51e0acea4a3dfdfa6fa7bb115b8b685d354841d1901bc73cc655ae246a5453ea8d160610425c2c14969bf22a7e11e663cff1501f1 Msg = CC28AD998F6E4DF7733FBCA8A3230483F1CCFFA159915CF22D19B40F7FED6921 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 1bd79d25ac6b0f242f39555c85d858c23680e1ebf9590d05463ebc58454a7822cf0e0c2ab9872b6eac5ae8ce3da773d6b2039e9b26ce751dadc48579320ea63b978b0df038191d9128102128a365c01d9e2b43fe2b5ef1ce9ee8f4a1e12caef1bbe7f3a8d1a93c9f399753bbfd60d22d8f39206a511ea448dc23cc0e4fcf0b77d3f3fbd9188b740de3f85009de94ee157dbf7edc3165e9f69b59db37f7fdc507496de8941a2a2628774b06c8cab034bbe3d2c04d253b5948d6e5712373ada99b7f860612440c5eed81efeea18d76329dc30bd9fcc500e92315677142d5e1b6b45ae0e6e725122f046c9a544ad1ef1ddc7c6b2a7809715ab75ef870ee6670627a Msg = D5D001E9A8082B255D2C8F3B77997A34E32ACC55023FF9099F87EFFF3719AEC1 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = be69c54dad9d8b6db7676fe74321a0aeb08d1cc17f6607e87982f99489344e99378c38341e0e605b8ff903c74a973872a9880e05a8ef0bd3e6049931acf152dd54fec9105a57b73f77631db736b427f1bd83275e0173d4e09cd4f8c382e8b502a3b0adbd0c68911d02de17fff3d927e250e1826762efc0b895dfa502f18dc334b4c573f99b51b74fdd23009861028f1eed6875bf31d557acd6de8f63fa1274f7bed7a1b4c079f5a9b85bfab29f552c7f647d6c9241563fac123a739674b0ad09c3f94208795d9a50529d799afc597e025f1254995f043234891620b10d5c5569be14b0f463a495f416024618486c7ff5ec775cfb46fbdff5379c5e09150b81a3 Msg = AE5B6699E43FCACB572417FF49ACB1FBCB7B73CC045096AE0A676F40E7BD9433 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 96a269e0ca4af626aa8b7f45acdaa76d5dabfea5a7d762ab39b138dc7575fe196aeb182bee5b18503969b5ba111f057ccdbf292d7488173a4a4dd04e62c254d502673d5a076d326c66c9a71a3b83b1005c6366f8a0902987dbf08cee7562d0abffbdd661c3525be8e12dfd73ed31efaa817f61e7fef700a3215e77b6231d59c098fa455b69ec6e658a66cca2e8f2e090ef704270995170ba9a1f561b848676804413645a943d883191d95b024d6ffc9cb611c68f3319403bd7c07ac6694501368e8147a256e928604b63d50e2c65f3b2c30df1eb0363e29fe448f94b6907cdf42fbc9c27b31a43a8f5c15ce813f9b20d16da6c298843f052ed37678b4ef1d78e Msg = 3E87CFC5163486DDCFC3678256BAF802DB6457CDF392EEB255D17BB5051CA083 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 65e2358bafc9fcb65536a19d27f710596cc31f9a8328cf9de21257506047ab1340a74505581a54f258bcbe0c1520f84ebd2e36913560dbd71574e3738428097d6b819e6900f27df159dcaf08c6e1591b073bfefe3da6bc827a649e0bae9c52fe9ae180d1efc01e5a38adef102c6d106af12163b1a0f6d1543ffce3980ca0f8b70d38007288d47bc565e995b8c21da2f959c928aa2f8574a660226048dc9dba59526a30e3274808683b41c0cf086ea5afc48eb294a88c4b8b7383dae6469e8483345b1daf1d2801bda93ff91ca75dfaa8dd5d47e73cecf0efb0629fda16c601070bee2e8cc0695150739202e3be270b9801d085e11e1df07f9a4cab54fda23da6 Msg = 05A556FB8AC90F7E1C96271DB34E3E95F153DAFA38471A74D12B63C9AAEAA50F Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 2eac03233c4e24b3328447cc09661c259676b569e6a0848b5a193065296a59e3b6d35a2ecd91c6cefda4f2bf9f2252a27334fbbc2d79e450d44bc282f7d7321b46f82028c154f30f6d62edf3672a1019d914ec617aab2d007f844e63e295bbd8f66163deb278d99d66fddc58cca2b911ce0af95265134af55a4b786cc214fa11ffa29bcdfbed12c5ce6438e9b6beaeffa3587978a83409c29f115423174c05cb8c30198da8b193f9446b9b49f7e3e2862ec9a350e8441ba4e5550e87db54712865fc2690a5938aebb28409b88cf0d172111a74f678ee0819ff8bdc22b08fc6fed37b676d0705396f3247a267c60f7ccf1fb260c0c2e924c1ef5540eb6125f3b1 Msg = 24087E491B5D75A864A79E1A5C9EFCBBBD6BB465B257A7F502962990CF599C6D Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 76c297fbe302f686377cb155ae8a2b65a6c577af303035c4a755fe67014c560476e7a789b8f2195b0f80416f5f33b7fdccc380f988cebadb640e354bf5679ee973a1e1485b68be432b446ff5949504515a65cddb0faf6dcd1e1188656ce941af3ddc8600cf0e4087ac8382f0d5061d3d05f58c9362eb88f30a724d18a15ee68a60c5e4dedb4084c9d01522999092094c85622e67a66ed034564ac286b0ff8791e9933a23f83b4a88d2e79e3a29d6a3f87e63bb1a96a6bfd6898edaa938f74c72d6c10cb94d055ef3fda9e6dd097d52738754800ed403b1444195a311fd6962007999e31edcf2870d1c3ae3b3646bc7da55e5f1e6627e6248839e8f70b997fc1e Msg = 9541F5F2CB2373C393177C7DB1294B4AFAA9FB9589E4A9EEDACC6AA00B5B6986 Nonce = e1256fc1eeef81773fdd54657e4007fde6bcb9b1 Signature = 2891cbe23ccf10c396ef76a5840adaad6498b6fc8c6a2f6c26496cb428a9221ed59b3645f9a25f5747feda0f51b45319e0978f22ac4facbc15db9a4e5849ac2a1404aeb6c00e5eed3c07eeeee2435668fd17f16ab244c9d38f9ba0de9d3f3ef0d994094e92e327948f1409ef827752344a1375f608dc3cafe74970745a023b320b3bd3171b62a68a5ccaadbc64b82cee4b8a81840ed8b751ac66a29eb81fb819ec54c76b01c7b412a43ea057a80202f1c3c06a4ee60547c13c6c2fac34a5d5aae982b9dabd119b470829bd77a560e0973409115bd1ab5bdc6bb46fe4048022b0cf4fc6aad4184c28621ec6f82edb54733c902620bf45f2517f24902e56d58038 Hash = SHA-384 Msg = 1C389ED84B9F252BEDDE76A9A694986FA130906633047674C9A44E887F359E1CFC19D2D9A53A8FDFB2F826D813CA7A58 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 2ca37a3d6abd28c1eaf9bde5e7ac17f1fa799ce1b4b899d19985c2ff7c8ba959fe54e5afb8bc4021a1f1c687eebb8cba800d1c51636b1f68dc3e48f63e2da6bc6d09c6668f68e508c5d8c19bef154759e2f89ade152717370a8944f537578296380d1fe6be809e8b113d2b9d89e6a46f5c333d4fd48770fc1ea1c548104575b84cf071042bfe5acf496392be8351a41c46a2cab0864c4c1c5b5e0c7b27e7b88c69f37ffa7e1a8cd98f343ac84a4ad67025a40ed8f664e9d630337de6e48bb2125e2552123609491f183afd92634487f0b2cf971f2626e88858879d45a29b0fefb66cd41b2e4e968385bd9fc8c7211976bc6bd3e1ad6df60856985a825f4726d2 Msg = B76CB8924CDB20834BECCB61A1DE0620545BCCBCAEA0F0C6369B9F6F04D5A414F445EBBFD5C3369861818C21AB01535E Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 43ef93d14e89b05d5e0db2dbd57a12403910646b4b0a24d9b80d947954591afa6e9809e96d7d3e711003ee0a9186ab3d8e0b4d3425c6da4b5f7899537e737b71df9ed6355529aace77a7cba96b5b0a86399252f1286a6fcab180b598455dfe1de4b80470d06318d5f7a52e45b6d0bcc00bd365819a4a142b83072775f485f63c8004f53378a9a0d2345d07b1b326238ed070d1e69fc0b5cf853a807cfb723562d1f5682482e8a4840588bcc7154ce0740c768616cf04d7aa103642917ec5b4b514a3734d9e0c58427cff42f27f43fdfc85991e045acd17af6fba7bdab818e90eb4117684e89f9163dff7b98b82a08baa2b49acde480c5702c335237d1be771b7 Msg = 7FC88822B36D8C62C23B22126B95C197228B5DDB7DB1A4E6BDF8A8AB1963E7FB658DC7DF61DD9041BD3CBF6A71F561CA Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 213ea3fb11cdd71bd5b839de8a598b6a142023825e24db7cb1a4459e78092b32b07643c7270839f247870efbd320b419ff3b1914c41b6ca4bc3cf17017d9a94d86f0f022f4495666c4a89f08e216a161d4664f2d616fa4bb2a17ccb85004e63f488ba29564ca136aa3a6f9561f85cb550b8cf8b0a85afbc8aee2c76891a53e7cb66e36f8709e7990d8de8d0c73865c1cb44727f18c0faf25c53f15e070c430e73f77b1e9c8f8ec13114d7e7ac790ade4ec6f1de0cec13f25a48d534965a8ede12090a928a91d5a1f214aefe6cee576ad43eaeccf635409a8646853d9cef93c9c04a884253380a49e682bff0750577c5a80becdef21a4a9793fabb579eb50e3fa Msg = 82684C6B7585315949D6F617D605C4B32966887B10777AEFED39612A4888770690E4E10ECC567F34C414517DF83EF3B1 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 4385e67819283d81eab2b59357c51ce37b5ea32b76af345a457e5aa2dd61113865a587d2c8a8f1c8825281c052a88fc67797adb6251d28efb911564671affcbfc7e1a3c055dce8d93497fe80da459647ac71f17e9aa07d1aafd5260ac284d622a03b6670c55b0d40696d436c638f9b48bd08f37db4eaf1d9746d2c24de347dcca0a62df244bd2a554bd08d047efe52cb1266ee5988447e1b2740f960d22e9ed3f2573ea8753a60d306d654a26503a5416a4439ee44aefe08cfebbed56585eaa01a64bc812f589da9e9d51849b4d4feea04e2b03c4d4fe516decea1e3d9e7e35bfec17d7b2c218d8553bab921eab6410ad30cc131579497d186fa25cf62521fe9 Msg = 791B2E85CE94ED41696C3F67B484E0C533E2A2ED197EC3E77C4E045C7564B88383D19043CADB418D484A4AA5491DD5A1 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 3fc0e79913fc234e4f271cd6f5aa63bcd00e0c4fe2242815645d384781d5a00485076bc011f4412457bb7a2cb2695abfa18471ff6087038d585f802995159c8beee7607330759f310107c35b4a6a9a48fc910f45f70bffed1281f2215af34759ab08b68acd539ddd37f98a528434cf11ae0e85ef221f7117c757d970f3181e9ccda927469aa88de59ceae91c270818137761e56d75a3c01ac128b65818f28dbf7dd268337356e97bd104df6218db3b1292ec2652b62e5aeaafd905ec8fe67d6ed42e805048deb55cd9d75f818236687bc5b2cf33e17678c45a9b2144d58a4c77c163e57c1ee42cbd92bab46678092aef867968d8e6a387f7cef3920e4ee046eb Msg = CE28BB7C5C7E9345C7142CB28C1E287AD4322A3D2942ABB6EF4BD253393A78D0A818B62E78E1A52208BD379A0D272A0B Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 19b1bbc3e4a23b44ec429dc4479f3fa45da87037136ada535bb325c0c03193a2ed8216a9621e9f48ad2c53af330570fdfc85fc1dbb077105af39e8e3a9faba4a79ffe987e1a37e5a49c60320d086e9292060e9fe671f1bfa18ad79f1ae559551a1d5520f8164a877b3fe1938fa51cbe8b5110a332c500585d288d8b30855afdddd233254f62e56eda75ea6854b84bb05e5b4497aca3d20baaf2d6d228a400135ecc45161c3f2e7258f8e4742aa687bd9f7a4468a61558fa0ddf79e5e0ca51ffaf0151bb255152219c76a08c3e46557ed6b1415622bdfd94f733ac10d8f388c0ef646d8f5d71a3205307db703d627287e2b7be15c33fff19147e5daa36d4252b1 Msg = 7FAB07BB71F97DD2E20EC95903E71D7A27F3EDC7977F01C2F763714DE7F57DCB6177CC2719528406A17E206238D86101 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 12f03c6f02b34f921831df384cc6e30d0b64f8ed133133ff190caca2503f1a4f4f721de6824ffde125bf41ae216e5feb8510e4d6337cec56f18550e78c69b1618457bc1b604d109e526c788628391ad8c29ad6c5da268922a55e4eb3053415a9de109112b5fac1f996236f46ed3a6c2f845c36bab09a4c21da20b17d2590c7b058fec130fbec4856ade373b6b0773994bed5ac7a420a09df8c1de246ad453dc8a62310accc9f0bdff16104dfd74c7752c33df20ef08c52d0bcdeacdf2a31298a3c72bb7397c3f9306fdbec45287688877fd6c965b8dcc513c9bdefc2f9ee7e92bac62438e4d80bd3ee2ca50a024d6fdedf39266480b2ec77eedea6b64a9c58ad Msg = F23EEA94865C4561490D33660541D0997B4C3B050B76006B3FA469AA65C46CFD8BF3A0747653F88708F26A795FF8F727 Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = af809f10fd160a88d42dc9d92285e2b2afd8162c38eb91a6b6273a66c30c79d7caec94a00fa732710d9f751219767185da5064ce26fec0647cb0670ecc68f2a601390dff07ff0237f284dd4fcb0b11148835c8114c5a15c513713dbc16286707eecaf2c450f588fc96217d34f59e0c716c7348270041b2c4386f5a5877f7fa48510cca8b07b70490f9eee957ec0a52ab955a3f1054695a7f5806f705fe3e9802770d591eddf2a83fe03d8adbf553ae59528051218db1f3fd070f8e1d3d4b4083588cf2710271ecca5d9369468d045b0f2e0ef285f9cfa65a04cd223fd84c01b8c740a4e95b9fb675c0d7c470b3598d06489bb7d6722eb72ab8120d7f0ae29a06 Msg = 99E52CB88A11A829E0928460EBE93845F06556A854B948035893258BED10428D99BB6EC91E8013A6CB67ECF5EB262E7F Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 0f31c8fb4cef7233cc20bca20eaa5b42a9aed4a4f40855e2c518501ae1cfd71f98bf9ffdec1a74bea75bdf90b9c67c5824a7054ae57ef49806359ed64b2c5efdaf52829395fe426c802665bd7530ca3cbb40d5f29367ea55eba29903e8eba5df7556b5527335ac06a211c597e916fd6978ea5bc6daadccd4fcbc61ee64aacc902f652e545ef48579cd523944461d9161a542e2e7bd2a1da72ec9a751651d184fb75b16951e1b5a98107ab3ba680df0dd06131a9318e47e15326f27fc34dddeeac89b11236fdc9b8f799828dfa9714e6ca3982d8f79efa2a455e6d73421a1c933c92902790eb79adf0e4fb6202b6a0868aecac2208ab673b249a826646518aabc Msg = ADE1DD1962D7AC1C9A7577D87167EC252E933029068BAFB32B37EB828E5D69C864C9999A26BC2A6BD0E595CB99D11B6C Nonce = b750587671afd76886e8ffb7865e78f706641b2e4251b48706 Signature = 0c4850b815169cda5c11f77bee14ff2fa1399af8dba09fb9485211ddd458e4152f966b2162cced299e496ca0c6cc891fce52fde9be554aa213c9f9dcce053452fe0702bf2e953ac6490c97660d8dae7ae557d94e4de409100951bd3f8be77ad5e6a7f8551190a1f2ede40fa5a12e5d995c7739221fd9be3970c05dfc990a103db1e9dff25e37234be4f70b372a4071a9c921a34de8f6c56f1106a2431b2fc2d60026c7f2cfab11ee75afaab90d72dc8e15c6d6ddee0d4302341f107c541b23368995b6e95a0efb3624e70e7980533a4d6cd823e26072a4bc88f2c01349222472ee394b86ec83f4fb9df8fd105fedc77d28b7a7e9d71451219eb42c25764bfec6 Hash = SHA-512 Msg = 2F2D33AAB9C36773CE676A4C61C1E50FBD4F40BCEA18EB45F83E5EE9D693BDBB8CFFCE61A91E0B11FF88C49CE778DADA0D367C7FB6205D26CEE33B19AA85C969 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 5e0712bb363e5034ef6b23c119e3b498644445faab5a4c0b4e217e4c832ab34c142d7f81dbf8affdb2dacefabb2f83524c5aa883fc5f06e528b232d90fbea9ca08ae5ac180d477eaed27d137e2b51bd613b69c543d555bfc7cd81a4f795753c8c64c6b5d2acd9e26d6225f5b26e4e66a945fd6477a277b580dbeaa46d0be498df9a093392926c905641945ec5b9597525e449af3743f80554788fc358bc0401a968ff98aaf34e50b352751f32274750ff5c1fba503050204cec9c77deede7f8fa20845d95f5177030bc91d51f26f29d2a65b870dc72b81e5ef9eeef990d7c7145bbf1a3bc7aedd19fa7cbb020756525f1802216c13296fd6aac11bf2d2d90494 Msg = 916868E821E6182A843B6F4F36F9952C7481B96B96EA49B092B60DA8A08703DFF7DC026FE2150D36FC804340CA0A0430BF6FDDD037D83730F850592F0D486F22 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 8c4f819e682081bb16ddd459662a8078bca4793e18110033539460b408c0af747ea5d941f712691f5d9ddb643166fd965f5b51b819d55141d67c1553b27a4682e67d5555b64d7cd3db7fc5c2e701dd26e422af8a1fb52cd5f5a09e0d6db900a992f318deeb6f6e39dfd6af44cb217c6854089ceaa16e3f9b100ef8e78f6b453458b8ef6d71493e7c6e45282c617fa87ccdd4a0f2f9f7166281806fb41d0fe188e00c40afeaa07d2da09a2cd78052f8d56b7af40d4c7314ccf02e490d5e2123bf676f2bcbdabeffcf58792998dd0f67ed24e483d8976b00d6151a6e0ba740bdb57c9bc27fe5df9126a47020075eb222d5ca2470724460c5adf067b5750287cd00 Msg = AAE8B7A9DDA5C8EDA8F5D82ED5C652B98E0C8428AEE6A4E687DA60ABD447EC343D8A861B2AA503FA14782EC43F9E346E791782635D42BB049ED4DD6DFAAB817B Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 20ceee0fd620160ef6a40966fa4ef3d8f68c002a66d0103eb62a868a7ad7dce9523a5b83607b8cd0ca54f833f3a68c9fafa1de7fd723e22a0f724dfca1fb6bd1a88a7dbd17255ba1e06102c2cddf584f511bdd09e132b016f867896a592a28c53c70752a0b10d86bdbae9503928d2e0203ab8f845c1f77adef2bd2f4e126066fe15af4a5282d5d9fa73bec18d2e6a5969d766eba55c0bb95e13671f82646c35b31d894e7f95f2fd35f60d88c3e70b20f6f387326400f0a825bb9517df88bbcc4798861144782dd92ccaed36aec47d5365d3b61a495339ed58e2553b74f06a295ae47a309d8477b9ca838e77094718565903432ce243c9dffe6dad464cd5ee279 Msg = 4C0556F5999D6B2E7111910D5348228591C16A9F09AFE69AE59A70EA90D28CDC69E3AC77B4B191FE97887A9A7FAC090669EE764D0C900F4CCC94C8F5CD2241FB Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 912fdcc5719a8af7389db8756bb0f630a4c78a1bd1fec7c4a6f3e50924a9818c9eca4a4efbaf9e8bad55d6468d83c54d0450b53a267a50685e7fb93550c2ef3554f69b4e49d3be359bc0b88f3e753714684ac047b4dfb436140b13129fc4bbfeed86548500d487094d222ed4e249db0a46b34ba5247c1b86e8650a703c9d3e0374433d3af52578d35f0f9108439df0701188da206b579e1712811c1e33b3da32f33acc9cd0bed60cfe977a4a6c6aa6498ecebab9be86c216a7214eecb13c2b7d4d309f5488012056905060c3eabe90f36b01588acb328869034e00bd19bf5c1a44d8ea2a89b747b2875d97047c53f2903f67b5a60aa87aa70a9479735198a508 Msg = 4E219E05B859DF532648B148A07ADDD0AAEB261E59CDA8BFF5FB3241978780DC64FFB8E0332B43DAE340A906DF383FEDC0EFA6E975E50D26337BCFF221D661D0 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 6ba800b8692ae568344c448094e3e16f50dc2c53edcfbbc9c7be9c07461c0e0686fcfed607af2a66291fcf8e9653fb3e9857b208ba210100df9e6c0495ab4d13f1029089cfea49a6be8b62036f30e0d4e4c1d95a5eb9580397d3bcf65a9311c2d8de249c2d1d7472369537cccedf8a7feb0c170eef41341f05e7d17caac4261b62498776a5eb1d9ce7e4746b4849f9021f0aff917179750253c719017fb5dd6855672eeb0847ca075e589e320f356f49872455b30f8cc1a3a7e1a4276ed6a909be06bd9f89c3494ff7db432d0d4d3f3ccb0be71b0bda4f66ff79773004905c6102d964b3b5a5e28e4578840c0e488b7f2b4f31066b61e13821e88a0ddd2b1c2e Msg = 7D37045D48B16FB8D10B4969AE038708437A6E30A026703A70E9C35DE7F9579BE3B000322B1A415F38BF4B54F372669FC5333560BB731917AC46926AF66851E4 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 9a465479c1474c1a54f16f309bd87b0c641a458d86173a4f29c2829fea0410787a81b3c1360cfc525d133dfdecc13acdd5199954dd8440739608545724cf1270caa39a221e9c6bfba399b9b05e55708875bac1578642ba7211260662299bf5ef68a39594e38faee14989ac5b2daa13211ece394cde46afa1b110bb55f631bdae5b848dfdb8920d7c74eff82ecdf59f2c6ed9b818c2336364b2a56d34a22ac42089dc5730e8e57b356cc4822c1e646268dc6a423e034b8b1512d41b88c70b27e431d68151e61a4fa5c89f1e90d621e07228c0346ca46f767a989f1b0d007237645d448030a7fe45ee0f46521272a8cc453a835984f8268752bef801b6226140b5 Msg = 9F39085803C3CAC4615DA8719C4AF00CCFAE1FD82F06A4C422B335440B9965B32FA486B1375A87BF7E599C0A13430CD06013F791697AC66182627A062B171D70 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 7cfcc23518bc137b94dbc87e83e5c942a5297ab4f70a4ad797b1dfa931c9cfcb30449ba3b443fd3abf4d350b80feaa9687b39e7b5b524ffa35063ae6b4e12a41fd734a24f89c3652b449c2154099a1c7739d5db77ba9de0358a69ec99bcc626f657213a256732631461851c919a93b04ad39800f02d0e627cd01d4b80697a9a1fb0d71df4f32ecaad3f1d5c80cac67a58c71ce81e23fc8a05ec840019c834d78ee1955c5e41065b323d01fdbe81b768448b4a7388886c9740b1541ecd8454f73ab64f90dd46cce6a2329beae9f3ee0bf567b507440ab3ca9de2e855374ddf6e105b3d0b33a138d716d138ce9f9570797a82eae557cf321fa09b862e31ee8d85b Msg = F8A9720A5BD7C9F10BAEF267BEF0077BEEA9AB0C0C76B6AA9A709859FB91A790EFEA2E28882735F8F4569E72F1AB8C3DB7DA723373605A0A328B8F897019E069 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 68a46140382dbf84b1794ce86937812d8220fc59e83dd1afa087efc41883616bfffb8283bd6dd5ee1930337951ded3be23fdc657e1bc07f41b539eb779ec98f436b367259b6841e495bf84555aff07674c9fb705c85a9cc1fde4bad40506e3373cc3a490daada1c10705177c165719104daa8ab675666625335e09a24f7a2363d7b3b878f34fe68fe01425275881c34b60ee78fcc0a54d56ac8304fc7a4bc0d5a447ab89b9206401e3c445bb1cc8e0c2541fe0f3634bb49d5af3a1b7c2e7651d208392718311247f0f15e4041a46301b93da2cda7af833d80191565833926a78468abac9eb4b02c5f047ed38851c3ed7add4edc05e8407481b8b942ab627e03d Msg = 9C3CCC15CF6380248847B0E517872BD5916B35BADBE00C1BC07FF097E05AA8F0E55815F94BBE41880BF47C5EAE2DFD7E965CFBD3C517B79D918F7FDA65E85056 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 2bc6331715b62972a0a5dab2138c5663b0e33961063ce973e68e1ad172723bcea293f7ba35af24504cb2e373b11f80b49f79d3905e0aaef838fc7c7fb5df49a322d7c3daa294a1a0a8b71a52e2c5dd94575f319c64ef9f6fc6bbb70c0c97fa12ae78f73234aaeb93df299f81513458ecd243fca5284f44a1afcd0575dbf5f81d406236ce315e98ba4c9ef7c1d43896af3b5d172e7a786fc58c4220c27b56e5c7a9be49a40b49158305034a295a6c5743cda6c2c69f7ac02f87ed6cf7b4e989ce8218e5e7cbdac12fe7de3a5437170084ef8ce33e3530392c25a58ebeddc086685a4dfb9c0c5b91d946df65161ffbf82aa3d6a80c7c07995aa3ee06b1800a54ee Msg = 9A74EB387E7FC9F85E873F7FE45B92F1CC7977140836B2BD827FA9F3308945051E3D1681025C7B257BF9A0EEBC376411DFA7B70C9E3FE20CE5F5458B4970E053 Nonce = aa10fec3f83b7a97e092877a5bf9081283f502a0a46b50e395ab983a49ac Signature = 802db067a8d90967c2860c9076c1a0227560b59b66350490af1153d20b31840918e7d7262f633d37880a153b1a23e40d3cf9fcbd9c1610878b6317d9d1187f80074512524561f1c0f99f1b2ba168a15eac098b2b20673ac63f9b002e60887ff296d1212dc696450e7bb14a3efbdcdbc7f4ae2210ed35a3bf028d3eb99ab696f63a2fc69d8cce4b45846ab88943f89d588a72f00f15e1ea16d99961084542467b8f998c118fe76a2a326cb1ca3f9959c06c810a004a67cb0655f8c6202ff5e4ced43c4d8e0c3683d55607d4ddbcc0d9dd4e1783b58f51f95e159fe593066cec53b544f2391cbf0e3dc4172afd5ff6de23088404f7a496bbc6a4ce22826204b6aa # 3072 bit modulus E = 0x1415a7 P = 1825499549064545501002814752867303197574562922695361759109406159330584064967398311210633222088128608648132123109528103883217852707804429376215461146343928188715788414753586514882360939028551976899909107588192744855121888611864285665379758638344821704975194841674455178833534368304433882122253575672965991425746004201077023469323804296141584892269607798120744155913889681140792424300544033273884707054117505961458853525824548423772867055435252788293862905325989693 Q = 2083911535573720425754297793930303097427045611940553511621384606605330401568389655153758329867757501869779281401894629931181352401340586070168628965272579883930189757958134081840842397489768834642797826313735049301214445866929651170358938475330247827122082324023853743929818143594090782803702383413243694275307174336421563143271986683539534462779273993122904937067239610316755588123775626801488367650795574231544353899738861546922696554795936876810882155266613607 Hash = SHA-224 Msg = AEDA4A8EB649E61D0E6CE82C1EB88D3D0C779716BBA3C671347DE80D Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 27b4f0aa139565fbd7860760610f6866d5b5f0d777921f06f5053291123e3b259d67294ccb8c0d068b8dae360aad2cf7d07296b539e4d2e9b08c343286d522f7dd63c6620e8672be492f3b039f73d88ab9d22a5463cd1f07d688e8ba3fbad531b0c3870ccbfebb596ce4ec643d309744bdbd675d5841284cbac902cfb70ade6d33946d8dc6109bbbc42412db25b8c62222c5ff94f8eb868982265392a44e807474910b4b39558bbef33197907178ce146fdd7e94092ad58bf41a474e626136789fc2fe6374a1b5fefddd5fecb7f8ca5893220d1ab9e822c3ae8adda1ebaddb18a6a12bfc165d12071441a991377cee6dc8e50839497346fee13f12c5b7b6d024b8ecfdad80d5ef6e9e4996ac21c4eb6036bb51f5be5e38f265181154000824e3c1f231d18589ccdaee90fe307ba56324318b5358468e9f3913b83ab8b34d949629ed7839f8da85bdcda52f3da5a419f777b3860dbf2ffe28d96244312549528a20cc7399fc010844365806167fe43235521c909587c2c7b8db4e296dad2aefa2 Msg = 9C60A0C81349CEBEC934B101C9A3D0154E230F817A24A1479B29D2A0 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 4aba732c6255f0bc443939c131dd4ce64478d4f58dcbf1d73f5f0e660c492315e987cafbc83a1a0be3d359a960783d293d375ccc3ec0d82c72abcacc339f1b42207a03795be6808ba06a891e3b4251e1b3001dfb537252572a33b4c52846dafefb24aca53fc08e63c39da02c4138b3de9510fb790f87566cd14380b138c728c243543b89d1f916ce27cada85fa32d8185deefa25c323c65c7ed578ca57276b66744a7a1a78e66d4e570999d17015bdbdd8d3d6185a3eb1dec8bc3a1287a2e235e4f116a8b91d06128d36b58ed4c9a6ed84773dc49f755e2e27a6f1aea31417069bd066b848095c002f22dd6caa72957e21a1e640f9ab9b9180df8ef8963e3611df2693a7ed064f348221e7edb1a5a81acce24acc335c6ee7d4f1af6d68acaf15d77e128142ca9bfc55a121b1b13fe5bafe2e4d6a5546b8cc631bb9d304c0e9f3d6d5dfe833c346965f0103698d34a51bca5db266afded271d8490645b3f63efc991e01683211f9482d214cfa9220f7bc81e8cbb4d118a2c306709807c070c60d Msg = F1946973783CE9B4475C4573189F85BC9FC2AF3F944ACBF8278445C8 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 0df81ec6e9c2f0ebe824c445009902cd55e2718523546f08ed13faf811ec4e57e6f5772037e07025c3c0c99cd9d6c885682e0eb904a3314b825948819acecd195c845a81e22ae62c13251823d6ee386e0be17a604bafc6497b7a6cdaad1a33cd5ae33bdd50e62063bddf6d12b878b31d3b7d490ce86810f9d456739bcebde592b07808350aee542455d1761154188e6e02cbda795e48e4f28acb819440bcd8da53fdf19808456898a18fba517af06b51156129b0b8029547ca9bd9436a0673e5b5cb995340fc425fecc566acc99884e0b4fc87248f5b35bbf08b0dfd0b9ead06737b67c85f94e1eac8802fea1b1dcea446b7cab8a45b25429750946bc8b22e076828a0a9718277568b9b7202a8cc3688d44194e834e0a405fb9eea46bc7e94255d600ff6c95a46ebf46449510fdb39b6ce05a20ac1832938b659318764dc0b7e4a0215fd253f5219296fbc82f03a7b95a12628d219093e2cdac42e20eba3dd5aeeb9dd7bef5d647f151b04ab85c48970cfe73ef9fc3e7d1d8a138dec3f5d5fb5 Msg = 1B6E8942B3D468D48FBF13C1ED25337B7FE4663330A9E3327B178CBA Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 727669abeb6bcc9502d7e88162f4a6c1dfe1a0f5141d3763e0f7e16744f9063874f153cc2de48784de84426b548b03e05a9074cef6a951640eaf9b32014d97cd9f3a828b45def13527f72a3e5e5adccaece82212c016c28f9f3312853bf52062e719081bc028f70831f9fc9132e8b63824e37c7cdeba463f9034d815683e27750cb9b383c3420f122a3b7fc6e9440925a77d766f93d586161e9607beb8a6e4ac72c32ef7b69ed52f5077a881dd0e494591e2ba552b74731c18cece9905561459f4553d49acfd6cc6be027833a220429d46bcb88dfcff0d2c5cb567371563b4852b7e628c4a6432af967e8ed69c9b6428ac552cd370922a0a4b01ef1bdfdcbc9088cdfb6d9fe326bd6b2bb1fc2acfea3bcf60d1fac5880b0510736b7e201ee8f6bc6332c0756315789700350fa549009d16e0bac084bf6aa3492f63367819506bf0c4f9c232fbd7c4d4ad663a7566108238c31fed887f368666dc75a623f222d357f8e523ff084111be4db6baf444f191ad1468d077349fef8a22f3fa56085975 Msg = 6ADD0445E16D808DEE92250294C7A520C2CBFF38152F958302FDE8FC Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = a1a4d16956d718830f625f06c42e99189e36a80523b25f0c9a7bb85568ce76d1e85e437db0a7728b8a9c90d25e6f38150208debe54e1e3f648ff01798a8ce132e4b33f3d26fa8963771440fdc4f5d852117b3ccea975da10e5d4f27af1bec1b853b7b5c9b420012317a6c33b2596dbdcebf97bef821b3076ce86345309b6bdf29a4acd391d3b2e5c4a6866136287d17cb0e2d4d6a6cf89d64272d5c01849ed57fa2842074d3b7734c4c92be50a922d0517ebb9891072b1b47a710887004b238f90079d10fb2cad7f5013e7243089f3c601865c6bce1cb8d0d669f2bb709253e3f1e421936f6a1643bbbb7d503b0631f7e1660382bacf4680de8d70e24abf4450510e6b40475bfc9fe547752d0d5f63f40f62f4dcc903fe6d260fa45a1b85a7501065aa1900a3f841e54c136d686fadbb33b225d15ae6fc348be57fc9ccbfdeb57d5cbf53e3479d9bae9f4ff859cbd3fb076073ca016ad94086700cc85aced83aebb4254b0cfc814585f930dc623c7f85e89de6a554b9898918d7cbb4cd2db075 Msg = 95450629DE2F5ED5E3A586E4D8F0A8D048BE251F09956CF19010F862 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 2e078b29b5288a77ed25ecececa645f6d9298e4294e3ef08173cc37ccbf727ac9b092cd27d6fbd378fff7b1061b56ed5cf077fd1a227771f58cbb2c1195a01f830f0366f989aa2d0c486d441e112daeaf83e85958f65a9e60a1937d2a7022781fcd1a83b3f7641a743001ebad53a4669405603ba0393bcd94f64324f1b777068a3ab101a086a6972b2c11376307e7d2485fbfad85be7171d20a5251cf9a5f004847d172c77bd80fbac0870a0b6bb9733537ca72bb6eac351c21588287c317625a25f416129e6f53c607ae08f43e5e0339740775a531c720f3f731840184ac7cd3b1f7bb820ff30ba7bb120b21b4bae7f9d7fc34d7418f700b142cf8fff43d81599236ebabe93d2e89f4702fada8742dc3bb4bc8fc5e55b4f874ae59f5dc9636868828efbe1025a8ca5c61ed8cc832686d5d00c08775590b316060285dc5bb9d32c90a474a727ddba9e7a8b7d69bae555604add9de0dab0eb0d551bac067c0088523d134b2e50dfe3ff73eefed934c0984aa4a5c563b862d46ed957ec3446fd24 Msg = 7ABECE8FA64C7DF77C226D4D7A5D56660E18BD6126A2FEA2524A962B Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 1bc325412cc952a8dd6918db8fb08192cdf81bf4111cb5f0a580a82d4dd2e14d7445eb7cb94cca6da06d2b5cc43e6ec22a5c9c845d99ac0353050c1374866befd9b6b849cf3b0efcc644ce17cca0dafcf7700c9c7d870c1e14511651b1d03a535110139c53b55938cc4a471d756a55b50d1bd280c324ac4dbaf526590c48c197573f3a91c70373ec62bd168288b0d163a09e623589d1ca5a70d17aa54c8627c7a64d921aad12626f7d32d61e8f14d0aa97c2d6502021e70855581f5e353e27f96efe1bc78c7fbaece66a560b93c0e7365d97dc4c729235484abe10bccae99fa8db9425614b673d5bbc188ea8f465424f768d8031f7eefbb698f058e1578ac41426739410aa7eacf796f43a4e4b2b4a463984d3d17d6d667cd15bf2e2b487aec3493440794c09908545f416b701a130f08027b8bcab4dc4a78cf4a55a688b2e1ca3a73a08ff0ed890bee4a0fa858cf69142f2f765400e7c29c4b540530a054641961499c709dbb4f36e7e75a5993cb3ab8cd4c886f6a3f5e3bdd3d68ef0a77750 Msg = 8784AA5409021414341AB20B4F4B8E400D219435BB99603A990DD5A0 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 799450a1256d245df0bb7d5290abcefe69d3b0e3b94924072f2d67d53a966513955fa7a01b830ba2cbbb056716fd605a0cfdc05f8ff58d88cb1bf32248f117de41ddfdc466215fa4e704096947a2dbe836a99071ea7344be0ffc782d14f995e4bfc74dc3ab1fa96d7223ec456497a2f51e1eb199f0464d415aef00f841e39f4578a0c26d726f3065ee687adbe40207801857160d440151fa374257eaa3f777337d129dc8b8c701eed56a276ec90c03df54305f300ef8c51155db30b68c0b06dae4c4aa07e75ef0fb09299b2b04d73d0b3e874ea1b6ac4e16f1bed0cd8dd3cf958a27e14e09705d4f0e10f8d46c75a195380126b437c68183e6bd39097e2f45b1184f519b2eb101110db74519016297683aca4b461cec1d92a7e68cbf30c2bb0d96c3b33dc62d278b9a640478258c3405a6ab5fcef5280408d4573b7ae42408b9c40483768f16a01c9ee4163b325bbb8e377034fd31c787cc0db8a53f6c0ce93e7d854411a136e1013d69fd03a0171176dc0712640ef2f792c340eedd0d07a8e6 Msg = 5C03727531A9F2331D6A62254385601F5A049865367284ADFCB8EB5D Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 9cba01f79f3551acfccf56e74428e270949f78a00b4ff3507ef180ce4c78ef4c53f3b7347ee37633c653aaeca834fc004385f87798922c53f8fd741cbce15de8dcae8bb04c7d481a823eadac7d4d4546fa4b0cc7e25e67b166edde4b6f66748017a4dcef85952cbf37e802fe534ecb984cb32f446c02ccb60e257a18ac368c2d2ed21975093499e35880930f8529790c1c7762ae11526e829dc0621ac904b822ba4815d8f83ac8f0fb0f8fc11bd33b02aff4e406f8fda5efabf39e6641a791cf8241b0946b675fa48d07e48639cc1ecf420380b8581a539a4de60adb0da22e10ad41f8ba6af40d11e2720086a63db72a5d7fbe97929ab23cae1d75c485d614ca38094baca699e47200f7a792292b5c7ab95b960d6921f8beab94d26f9629d8702c40df696787a6fb6ab9d6f3c1240c2fe58c565c9328dcab603897693d9dc7dcdaf500850711e6f30b5d8498a38e348469df79c3628fe1403a7649e82f06161e0ece42479a56eaa845f0582cbf817d4ba7dced36e93a6dc7dc7362f658f06461 Msg = FE4E3058D1A16D919F4DB974797ED586E68FFCAD2A895BC6627BF649 Nonce = 3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed53 Signature = 740eeb1c71940ccbc041cf204469bd2d6a461558b1d15c9eb23361cd55e1ad418a7d2851ed3d44f9c02881a22f9e4be042d451998bc181887950da38246dc1656243db15fef359fe50d2af8711b3973a57763bfc3964cfe3c911b937572e639aee53a98752598c4b15dd53dd9355aee866d5f1e48137c12c342e8f274690b7b277acd087f293cb8b8c9a3e4b3f0277e831a6864e503f925557511e57b5285221421879696802066587ce6f993aacb70dafd39f63f09cb3dcc28e56782dbfb8b4ccb1b19876101573ee9678a5f6265f808f75e7711946c27c7a22dce9f592acddac81c67afa17bffb766058e2318a1211079842bd5fc58f9cef4b50ff0ee1a293f80ac1bf2eb64ce4e1051e1abe55ee067db6c24130f0bf4c134b0abf1e2f4465dc50fd3799f6dc206b9a7d2fe34b4f4257065d7494ae733c28d70aadb057ce1bcff36edf9f9ca6908cac2141845310660ab759d1f3e651dd9fa8056a624efc714f51f3a4f85adcba68f4a58e3a956af93a5a52f2b89f9c914b48e8dfb919cfc6 Hash = SHA-256 Msg = 75BC51E0223B63C41E3080CBF15E2DF6512D7E55128D77278391450281414D3B Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 4335707da735cfd10411c9c048ca9b60bb46e2fe361e51fbe336f9508dc945afe075503d24f836610f2178996b52c411693052d5d7aed97654a40074ed20ed6689c0501b7fbac21dc46b665ac079760086414406cd66f8537d1ebf0dce4cf0c98d4c30c71da359e9cd401ff49718fdd4d0f99efe70ad8dd8ba1304cefb88f24b0eedf70116da15932c76f0069551a245b5fc3b91ec101f1d63b9853b598c6fa1c1acdbacf9626356c760119be0955644301896d9d0d3ea5e6443cb72ca29f4d45246d16d74d00568c219182feb191179e4593dc152c608fd80536329a533b3a631566814cd654f587c2d8ce696085e6ed1b0b0278e60a049ec7a399f94fccae6462371a69695ef525e00936fa7d9781f9ee289d4105ee827a27996583033cedb2f297e7b4926d906ce0d09d84128406ab33d7da0f8a1d4d2f666568686c394d139b0e5e99337758de85910a5fa25ca2aa6d8fb1c777244e7d98de4c79bbd426a5e6f657e37477e01247432f83797fbf31b50d02b83f69ded26d4945b2bc3f86e Msg = 3F97F731DDDB82DD9D22380DA0F6C5EB61F13A9A16481D95AE47F3CCA0BE2D05 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 5f183009708b379637dac2b14293709aa6d7e86c267a0b690a3c275031139891267c64e5edecdff14c2cc2f2d985b62f900aee6e04ca51a70a5f946463691cf16c2d45547c5374f15bdb8881641d3040ef57807532cf5b2ced07623d0f638b39ebc2f2ce283eea2247e1df3af5430554d1d4b88b7b21622993419971b7d0d5449122a10fc31b2ddcc53ff751ff4bf4d336fac667b646780272db89a3ea4226afa20877bfb86ba3ff4204e5cd56e13a1dc9d53f5c9465b97a182b2bf671512ef89e6c3969f97307a3e4beba39a78e0ad1bb9799cda92976ca39d99db4ac149c84bb9bc8997e8d5e056d67ca23fe4be28e66c4bc00a25d65bb9d7d623fea2d3b9cf859dfd9efa9e52268bfa297afb1cc2883db0c9c42fc04180e2ec6f49657c7008e4025061f896886613895a35bc2d3655a8f50a9fca2ac648f352eb06bfba2fc340aaeead4a8457c65e2e8fdba568c60a6d8d381f5d9caa30127771f4a94fdb8cde7be4fa7b4f89fe379dd3e1ca66ae1fdd63bebdc0015448e61ef1666594b8f Msg = 265CEB296122E60849B31997774536F9F4C505412A37BE00C1D3073AC1F2802F Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 8291bc1be9c981663156ec80c1ed1675763de06199b9f2760caaed5207fb4b3d6037bd08462b100bb1767e3340105b1a68728bc45c7d6fd078dc1b5e7cbfa193006d52f67e77fcf809cf26172a46db384eaf552a5fb8e33840fa3ef3d6b20c7b46c32ef019e8d15dd38eab66f6e40399ad0bbb07f94b8c555196901c27e2d4573958f53060d800cfff40c602308044b75d6451801c688d276525c3fee17a6792882a074c8a41420109e2511418c9eeaf3ab47350dd8c2d3e066abeb7913e08f0a40abe71d397c3dddafc41fbd04cc8fa3b0641bf53a90031b61a2a9b63d8ed8aacc9b301593c9f425105498cc4f84627f4950758e01a291b9b1a33ba918aacc172b68c9fb2c767c65910816921281aa8e5482512cee686e51cabe88e18f923fde170a506ba3c340fd1d68261986347d30d124931db2ce17602150000b794c050e137f4ebd45cc41f70ef3df1656218ff76f2e75ad96e4167eed524fa2ed9fd1a0cf76926f382ffb16124dfc87bb1a4110928d5b1cd3b16204ceeeccb7db88fce Msg = 39AF1277679A9B1CE976601F0EEEECB20A513BBD39ECB6CD74ACC4012A9FEEE5 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 8c45e38eafaaf10a710e131bec63e51e67741774a9ddbfccdd131a123ae2a03067e7a6a92e653a25178bf527b93d6aa83fa366a2bd44896baa8b7f3f54830e4d9f5632c2d1bcae2aaae8c55782132aa7279cf1cbb6b7a81e4965ff84635c296c5ac206a04680e91e7b1ee7e5793701b1feb832250010d4ad4017c1608de8f405014ca73c39adae7c4adcbaee35fbbc71151cf955acecd8083677fe49ececcb62353c0a89c9dcb9c507979b56bfe060fec45567517c05f29e262df50767df7547630d8a7b32483b923bb1e3d510422dd4cc2d61a647e4f9636aa7587d4f8ed84b6174c1fdca9a217d9b907972a66c1f5a2ec2dadb60b93b515bf74072d315d17d54d57d721c8f4ce1a43eedf2025e51a48e9ea28160cf300d7a26010383c3280a186c44a53b7188e6caa364bf4dbe0baf4dcbe37d70e3a475cfdae339386558ccbc119873b1863975e2300ede1e420031b4cdac567e7b9c5d575c8bae27eebb37097050acdc87008ca2380f5631d190029a1d712acda147c5c4378cb6eac81731 Msg = AE9FC61D437B87B94D6799ECFC8F78BC28D4DDD3A59E688F35CC322544DFD717 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 851dcd2d4e1d34dae0fd585af126be448d611acaeacfa34f1492aa7d1caff616707dc31b05186cdbef769479243afb341577803b579e105070ad5406a6744f56e55f569370b9fcf6ab10e1aa0383f9182d451afb41358a2f8c29d1a571e11c404e6870cbb04f6ef30414d9b6d7f1416bacab0184eebd8deae72f2a48bea3a7844a8bf472a5f8d349d5973ffde3b1c40623dbaabd6f681485a9691c9be12618bba393b396f41cfeb89e18e378c51f147c7b0ededbc403bb1306454848c9bdb89f947843d0aeaadcdf09bad99efb76e742322521929f034dadffa483958df58a71af7da45461fc408c7c45973fc60c37a6358743315169b3100d4cd54f810d6e0369b9847ee38795cfe58443019523c3c9003edec4cdaa70de31d00958653058d8509907a5149a9f81be0ed028724f7232b57f93dc62ccf093a2635ee1e5bfe6ca9ea017ffab79182eefff542d278c471e1a2b34231700423bd0e757f6a572a14a99c90329dd0701f347d8a679cff25fd6b0d380ee5dc330d6ff1b4b1a347fc98d Msg = 16C19379E92708B872DF9B486EB72B9922AE6D79C8CFC803B568EC88E9AB9ADB Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 72c5555111eaef954236163753674a6ff81f182cbb379bfc6b548a52f9a5f260a0ed58f562a6086cf5ed00ed30adb023e90076a8adfa17cfd7d74f1e7b1978b210da847eda6b49891e6bd3fc6cd4c87b9326e8481a16c66e40021e5f878c303d3d8532bd7d966513717d5499865b2d03e378e76f7940f0448ab4d112e3c52cb332d340af122de3ee849f2e2544a40691ddf701d902bfe629766b36d82449286fd03f75bb2632dd61d6b3c6ce1c9ea8e5aff92ad2ca95a950eecd998e495e90e1f0966f922b7fb3f03380385f3b143ac1960c3bb688adbfd91d8fe1a1c32160243d3bd231a31c95dd78b6648c1175fa9c3c1244b1fa34d7c6f3255853ebacf5b3ec19b864e0a4eaee63fd719c21a72fc25b30b03207cf2aa45fd15d7102e5bae90882d00a812959593031ea3a436898582cae5eded5c7ce43de3dcac30b8690631e8db9f7a0a7f3f67b7524db275aafe02448727ff629d13afa94801d37526fbd9176fc4c216211037f8ec26b4f2672975887d70bcdbeef1e6ae99edbfb6c9a9c Msg = DB1D37A3469D79E9FC0C5D594340E1B533FBB1437F92F05B37F80CAFBB18BED4 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 796ac3f6adf4eabcb7a528ca63a6168ca6d31d5e357ad7a3fd180334a90d22bab20b762d767a6e3077c2cc8732784e81330041dc79068d50753bd4109c9c6f9ba03b5ac44efbcc23ecda27948511645fa17897dad7c122957ae56bf4ffe3d7bef85010b33d3b91785b0427417d94b11f73fda90e6a8748e6acc1d2d582e8836bc7dbe196876a9545b2a3207c1d4ec28acf8fe6f24c240b56ab3b4e4313a3d951aa1a558230e5f1eaf38cd7fd9b393d58d359f58f4ae51dd3971b418c5b81d0707cd9e2c33a148e492e74bfdd565eba8b1f3935e37a9d1a8764cd30497066e3c4622611fc14c45bf46fc85b3ed3f6c9d4d65e9925fe4b85ed30ec35ffc69c5fdc2bfa35d1bbdcb20e399cf934fe938f4c5798cf091d51100b4db4be42e81901e5dc79a98074119b7980b02821f4c3ff8ea07a2fc09a701978364bbd00ce4c5e2e45629526e34a3652719d27a47371480daf52fa49844f6495f35e6f5e3116c00b27042b3cead283bfc577905f8be87f0d5daa13d1ca74203a9e0d9199e885f4fb Msg = C6F5BFD09484D621DEEB6172098FB9022298898CE1DA03685F7695E32B739BE3 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 8503b85dbd9eba8d6fc57c6ae2103a78df1fff3600585e3e18f6ba6436a3acaf8e49fd12dcbb37c25b4b765037f545c3da8c39ef6842bc9ec264af6f519272f3d8698ef2ceac55393baa9846a7961b738e41f6360053d866763c824bc5873da14a28eb47d68d67f0cad7880853aeb561045f757a31d9f5c756f54d793637d721c88fb1f60126d3d16478f1fc15e0c4edbb531c2ca2e2fd9e8dabe1df2c09fd55bbc724ebeba290a7646249cd779fa1a923909b29345e54a2e25dd935bf0612a5580018b233d765a6fae3b46ef51bd8325912f439a7dc40148fdb754e2d866f357b8f0ebff6f18a6504ba31d10fe45226c88c9207b9be3c63261d75270466b43c271f75b1ab3c1d6b5a00dda8457b4d5c2195f320b0bd545fdd0679c84483c14a46b4d43c8452879725aa91d01fcc2c3867391c72200ca5d628ed9b566389f02fe74ba2a428a7ba31c00ef6b8d38c6b82b7379d2feb11031848fec0fac5b6091eb7607138bf0b96c3d2c174b5713d0dc8470b532eee6ea0ca1e8ffa3b15cbe0bb Msg = C4735094FFB49DBFD20FDBD0BBF0129806D408F97A9F36C04F836AFD149D6E70 Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 66d1cea94b9603efad92b6ca8a1fbe0c6c4b9dc60ec0ab2c33bb62d27a100e839378a39208715de2102eae384ca407e92787ce1118f91a0ca2640a5c93fdb78635bc91082c99968ceab289890b3ec210d6cc6f1cf7e0fbe2dae88155e88f2fb7b325ab5e529e4b63493e551c53ae38c3fbfae49810050a81cdcea627da21b63224612d4361b9df19761d6ead44488dcabb50127149f077c2963afc049ac8837ff2c29e6a35593e22531ecc2e9ef8bcbaae4349bd7227ff3e13b31bb929bbd49e50059f28fd9ffe8c296a056c2760e5f6d8dab43e9bd557793f0759ad8e08b5c3773a305a0d316ff9bd07b43106335942055adc461a4346f05ab455780f32027de8b8bb6d4845bb24d0c5a21c293d2b0740e8d06ef5fb9dbdacb4fa1c6225fd4e19dae69a8e2cbfdff1ef8b7f21804ead0a45274c735fccbfa1d60bf497a3aa931bebac2e0c8beda9af596dff0cbe11e8d4602d36b2f6c6f5bb80f12f4b9daf2c0748f591098ea63d3193f50a1f4737efacb62ea85fb6fb212b3ec8effe788e55 Msg = FBBFEE13A5ECA26C5691B0DADACA0F81484081B6C77D37A75CDC5AEE9073802C Nonce = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc Signature = 790058355d7ab9eccb46ea12368f3be9cf6b895e1734eb20a13c749557b9fecf92b316870f0f765864b607439ee5f7e510e2c83b2756a0d9877b48e0cf257b13c997b9dc70421d2d87c9b9e5625c36a17e21e20ed389657a3e544c677464eefff08a9ee4adb091a9fbce7626cdc127b5cf817c2a5f069e32c720bc2041cd21a6bae816dbbbe28552d022b7b608fa99da4d217dae8a69f54004fa3c004d50540957648296e14cca729f791b38e3645204c2c6d4cb678b0db63a181b40cd9851be84629a068415d54cab5cb5244c8dac8dc9799a0df1b58cebfbcd8377a391778869dd275e0dc8305eb0351d81e3afa46719355eee4f90894f7fed662dd3b03270660adff637b91e18330a4f3a62c914f0d32b4eb6a30b79371ab55190578a1e7d43294bb0a721def7dae3e021981707930bd9b5cb58675851c83acf330c6ba3aecb3a890ad3c151a1e2b583a7dccbf204850daa9f4679e759ec056abef7ba4d6e0bdfa57a5c5afb6368b048a2b74e3530bfa8991c55de7cc8bbfa990d118ada80 Hash = SHA-384 Msg = 21C0316DF6363E99BD8F20A07F5DEB2C493AE3243C442F047713A448AD9038A8E6219F31671A4A1AB362893CC7F9E321 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 9687115be478e4b642cd369392b9dd0f3576e704af7218b1f94d7f8fe7f07073e3e8e1186fa768977d6b514e513459f2373df6ec52e3de9bd83fcc5cc3e6b97f8b3fb534163c64f5267620700e9d8c52b3df61a7c3748ef159d6b390895afa3af59109a5478d016d96c49f68dfc735ba2aafd5012c13515ed6644f0d4109c45556e14a3821e1aa24beb8a81a48da27f131de84f7ba51581d81b8ff31ba92b8a1fde867f07e32e6c2709253448174dd31324dbc32b05f07587f76a9997decb80f38d8c13d0f6eb3c10e3d96a2293f7464f1e04602ef6e84c2d0245d7db256a67d132a47cae9abe06b61a8968f50a1749995dc15ef0dcb1d5f5959e4d454c8547bbb4d195698f484617bfd122acaae2d0e8c76d28b24005ab03caa781ea97b1c4d9396a16f7998eee7ddd9de4cabe57032d9438a5d99c6b34a956122350263c7e998bc61dec91381012e686d079e39e96b1ea4bfdb7cdf630ddb422c6b580e5506c9cc3d6c100f2041d17ceaaaa54589249f04a1370ffa3bf3ff1adeb890688698 Msg = D45309ADFB6F4521B86E6DD17D5E289FE6B15E5A46110240D466651D858B153B5B82956FAF74B643B08DD5A547B26291 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 6646a88ee4b845da4931274c23840dada6145fe0af954829d1d56661546a25e46316e216bb6b9446b368884ba14969a6f68ccbc1cf5b4e7a6d3aabec67f64963f63b088fa817c855d776ddcada57e5daa50fc1c877389c3cb9d99095a869a963bc91ec24b2422ef6b8dd18fd20d2b215fee6e98cda415ae44d2d2616fe1708292a3ef50a075170b3a7ebab02918ab0301794c17fb35e2038f369d94dd49569c066f7c392889dc4b878c50c7e52586b5081114d202338d23304f16f912d519a9ad21baff0e3d21761f373d08421e10108a983048fcb90eb2adc7c7f12ffa1571b091c781b255a77a880e97975f14f42baf5aa285ecc142157c3e1addd6aa0c09253a11c59144abd3b1e212d89e27ed96fb75756afc20ec67423b151194cb0b0648c659987a5583cb7757779d8a39e205e7101a5351ce1af2c9c6b0847cca57af52593323905e3d2297c0d54541a0125621640fe1deef13e759f8f6c56a2ec2a94831ac2c614b911e79edd542fef651f5a827f480575ae220c495f2a2842f99ec4 Msg = 9C5C399FD6115C1F9D292ED3A6605A8B1B581417FDC3B33C45B8237A6601E74A2F83D74799537DF1E155953EC0804EEB Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 0a217503fc4870481264d8308292c663476b25f8dec08ea1d1276f0951ec6df27aae3beb93d630bf8fac08b6cce50bd92994851b4f310fdddce8e0d6a8b7a1e866a567b298c5577dc50d8a906ab1be880084e681b26456279149b4b85201621c445de13d127fb77e7f236c39df34052b4629572abe1c02c09eb198188003dd852f88f4f767f1000458680258fa4b63dafc761822ca8b98c1a121b72b1455393bee416d24051290f02a28a7b49b18b30ccb29c26fbac991401a3a6fe01fcd0608920facae9d5bc56540c80f4740af02c9b7a078958a8d8a7a93a5e5b6d2571f49d775ef7c35a6d674290b52cfbcd67277e2b2e829ec437fb70e90537eaa6fe4548551939bfa98fc98e235b264aa6064a505a8d67946e2c33e5c6f0f34fa86ba65715c258f238b69e4f6e36d86a89822b4802d21ba0ba760b2f3a5bd061f50aaadff12e0d86627294bd0c4cd1085b5dab6a6ab30146c9bbb37de3ac5c4f8ee29736d46047e450cfdcb1279e4ca83ab69e858741bfd01a779d475dfc0f71c621d78 Msg = FE0CFAD776EC5DDD5412B680BC101EA66AA81E37BF97DD33C69E2163352B10BFDD930B7DFA00132062138668739BFCBC Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 6ec22bd58c32d41374c017a77027e770f678fd81017e20cdaaab48a8324b050749e5d864082f1f77fecf67a59c2885e931c3c2f58130fa6806fe1ca899045114b09d09cf9c513ce1109d2210511a3b2e93af511badad2716f48555310e6c5f547afbdb0b9a684491ff3588df933d6b04dae8883f5f8aad62a4570646f72f3656c4a7085623f5152164a81a06ccb59ca478c5c2315414550b0ad8eecd0328b2db01fff7db0f26596c41f970d032925887f1c8a446da889be64d48925b9c6b79a3d897700ab40af20b451aaa6b427ed162864db89f7824b6ae9b475b5433b865335d6f91491c1e32f635cb930dec1aa3ee7ddaa08e8ebd67b6b11a46ba049922446fa69f1a804acc29f6cee487723f2e61a40007865d80cde0119f3fe6e161a339487f5789e1fd23ac0a63b4673969fd8722e3edc9439778928f09610cbefbb42fe6242c73b68d466cef889da156d9d4ff888362db4cf9a941e80f577c944b79fb27dbe0a6967e88f1f67b91b0d38e083fc0c0228cd49d27352521312163f90fba Msg = EA26FBD222BBCBB42B654DB29505E5629DE265D609253C546642D278BB1BAE655347BDA6FD072145440E88596805531E Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 62a505b3f3adda45c6badb61b464a28bc45d4c66159a34b63c1cce32604242eb8fcd9ac6929ec6ee4ac1144932d725cbf4638511464ec70dbb5543a4487a241396adb804c9794b271f9d35310ee560368d949a20a2b64cb4617fcf63cf7b60978cad734650dae86c7e51b766522ef0be48bceafe2030564d5b7b17ba125097bdafee48e4df60fbb7ac2d9f14af9a270c2b7ef18cadac45b9b54ef230794339d279d72ba48783bb09b1d1d5c1c65301276523fe90e63789ffbcd489e45f8aa9cf98f33de8f7d9c5cdd21a9ab2847896de6dce0b92f07b1ffb4230ee71ba1fe8048c22dd38af80f8762e747cdec6e99f1ce0d1c743ef98ddbaf7c764412446dca58e6ff5ac0dd13322649acbc96f1c5e0bc58d1a8211853a7d2f51538c5e5e803de0b13044608d6e650bace12945a7008194586e3b74809714b2a52e9f3824be41de9fec3f36175a289baf9fd68b7e92f3754e00b41782d055faa65433c25259aa653fda069386b083fb31aeec8e30c769553f8f0389b6e6d4b392cadd24ce3f74 Msg = 56484B3F998CD1B34518D8B613F9F1B91F48D7DE00629DC8DAE589C129CD4E0739715CD67D1E5E0853FA7C82C5E48002 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 1f068bd083a26534040f41c1387e71a8c00370c5f1c958127e0bc721751b5940513023fad02a6101bbcefaaaaeea2875952bf859d494bfb23fd89149d91290359ecb44ecf2fcaa5775e2e61e5f8d5151343576fe9c7167e919a5d081dac6bb8117229c420fd2b0fcb521f4e72366bfb443e688a65fa392eaa5115c292ab05bb4db65468aab267178653dfa0a5efc960636fcce86433528dbce955a0b1aa188ac33ea128206ecc0feeab8f7df6f8c381b10489c8cfb2d02459e4cffc16f43a66aa4eaa19bc518ccfcf9fc1e4861cfa13e9b41fcefade2cd2ebc001ec8430a1cb949a0f2f876badc568c703e4209e7ca16f688ba9705c14fa1c882e6c4871b9deff31521d2d418e0342e189c40ed19c1b6f4320d89a36f78eca143d3c16dd3eb338c0743646fd314c725c2d36a13080bfcdeea0e431de71d61f652033a75424fe1e1586695c3dc463ad553c1cf3ab24a41ff4e031f9e0c2cb0024cef68273ea3b8c1be9d923d3e9c9686c41977ac7be94a6d23181936131c17a39a898c943dcc8b Msg = 831BBCF3D043DC3B106448A0A66D5ECC71F336DF707179586E61E512776D6109662470140BF972CD55B0AE964C5D0F8C Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 18cb47bbf80bad51006424830412d281c66ae45c0b756d03e5d8d49f73037968d13df46ebebd9b5b4c58b164d91d0608e8ebe31d8644cb0bebfaa8e2ccaa1f5746ac8f3bc02ff6930e219f53fe13fc070f910ba1cff0617aea6eb312c1ef285869746673ac1348e89c3646f583d7633f5a2341626bc2e7e2087ff9d8f13d573dc6455dc0068c7ac6eaf5b3093b081614f7b252170c4893891e469121fda655a2a55d67f5df0ff6e29ce5f9b0c3a1a88342140ead748edeea9706d6570e900f1cf3a9adcd7ae64f207585417946b104b3990d1a2d950e0e6a5533d3cfc8c470250e4c797273210f248b8922ab00422f2ecf85aef73587e8c5cd1c2ee6ed9509508409673fe07ee2c462c52d091e7a795d8d3c55fdd5a710d5450695a5a31ed76f115e71a73c6757d2def7ef472571b0bdc7558c71eaefeddec946860b0c77936db31f2001d0499a381e5018870b41ba04c8d42ec0dc55c9fa2af237dc1c405dd8f555b07a237cc50cbce46c3016118cf4ea06c047599283ad4719d647a225206e Msg = 90E5E51BC8FBD4A4CACE8F89398D89E445E2630E6B75C7D5111E68B5B838C0C8BC31FF5F47C9B043DDA56317A31FBCC7 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 80baa663877615c2e7ca9dd89958a74e54012efad55ad05868dd74b0ce78a661e2b893c3ac1fd837f282327efe4b041220942649b5472c1ac702070787ae5549398a57653d5fca69cd5446d63f6e9d0684925a235acc96b8a10bdf14fbe209fcd4930b5945910d84b08867b2055fe8eb1d771b753759593b90d6aec5ef182cb33bf2fe29e8c67ea4e8433ecfa3f9ba4ce461f0ab19997f299e95409af97bf57e2de410ef7538f699f385c1abafdf9337f7f9d268da87b2b389131fe3dbefd8c67bd2a158cc4e04f9ab7fee2a58d74d063e6c16958a90574e3e4cb881d32c3116987e46bf5bd44f80abe6b9eb717a9fcd4c0cfe80dd2ca62c33b5dd3a59c64810073e0476085ec7b76638983291b69559c815cd3bb87d4b07e24c6b9ebb7028e800a04f09b110c167f6ee3a3bbb73695d89bee92407d4adcea3eaa47811e23f8c7f2fdfe891f8cfc071cb984a63846b95ec04d6261bb1c5980018feee15c4e7bf632dc8306128fa22c47decfd9e8b099554f17253635e6316712e0b95efa3fb00 Msg = BEBB6C05F3377AC2F571C8904A0E697B1E68CBBF83806E5F119AFB559E65154DC5587A38335C533A816803C24CB74BAA Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 261180717edd905b647bc869f5259203811606221f545a3aee5fc123f297cf7d8a7ee6cee3dc8f97d24284ccdec2fd4680f1428ee75797e0379512aecb9fc1667523413e323c4bd7dded5caf9e5c606e5ee0c694d4d1b5a1f1cb613b980129f64146e42e8261c1f7ef5603954d34d56a50f7431beee5ab291a4759168655a5123640d596b744d97979d39f874ea7ff13a7466a7655d02edb492b58049f2208852297eb023e657f3240c5da9a99fd377728bff3cc073109c31712d94bc24e08c433533d4b86a73b58fbf2c598ccad78d46ca0a055601850960195aac1364dfaddbd06f14a78aac2ab4d374505cc61fc72c1050647d95a733517b709aed2d896721e7484208501480058fa4f6044302dd705c273fa7fb42eaeb02d025092b252e16d270d88dab6f68fd7ad571011f89627683e029d1bf1edc149d47452ebe87ec68679579940f5aec25999b0dedb820a5483ec6901abfee041c03b1a7f743548a2caabca613ff5d9f8fd7c694af12b29f2c2468eff55f9e008757443960fae459e Msg = 97B8C54523279BBB4A554514AB3369617671007268940E1C159E8949C92B7990D31EFFDCFE78A9446ADDE37BA92ED793 Nonce = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 Signature = 87d80275df7b196b7e1d0a41147719d773edd80b5627301a500d91665ba86076e6a31c8f3ae86aedb643fe2af223976ea4eb3d4dca2cbcf81ffd14b7ef7de3ee355a8d0f4143e5b0f0a0950a42811102e602cd214e1c945c47e8b7b66d507103c3456f404f9c48aa7fe48dee0aad05e599f242adcf8ccb0cc9db3a6c244a913551ab595600ecfbb67c25a95b54f4054397abe47650e5c4991edaf1441ba9c8e3fbed904ffbc977142ebdc84769865a215158d5b052e75de318d75012172e28c31db2d8bd4edca787216dde2a7387c543f162fc91924918fd6c845bf1ebc0220a1027fb4227340ca4cb0f183e5b34b1e7f93e14fa57bb9d2d2ea53f86d838bcbe3f055b473b0b469afd2960c0d76ce2c30f3d49a3b29065bb9260248e728cbe328bdf502b109e1f20b9d037860cf9e261611b4cbf27ff9b5bf425b2612afc7cfa3138f78ad26077cbfb947fb2aae6f4be85ab2d1a15860839b822dd03a1a92a19a5c7244e98bdf561625ca2a8df410ff855752ebdf3d49f5eb98f228acdd52791 Hash = SHA-512 Msg = 08CCC9FA3166CF6815240E0DBB886EA054210FA9FAEB57D3EFB0D310AD93AD693C07211872EBC33B7A8E4DFEAC5FFAE0EC1D393E78905BDF3BA6984AF5904D3A Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 8f47abc2326e22cf62404508b442e81ad45afff7274096b9a13e478cdd0a72f99a76bf517f1bb0f872a523d8c588d4402569e948fd6a108ae1a45c65830828a10e94d432765314ba82ead310fc87ac99a5b39f30ab8820bf69e6934a9c1c915c19f36ea7717eaff7af67b4991315b1873ba929bedf18a975be808e7aa14a6726126c79cc93f69541c5cefdeb5b67ec279d8f5a446583e4b4faed1685140ee4b3b757c8ff4a1ef9cd76a88e05319ee62003d2d77290c94c579b0ca2ab0deb3176ef10a3fdb85c80ffbc9e2a665a23744fc836f9a9a103cd9fb756952356a2f1acdd68a645e20179006558b5d4d0b9b0bd3adf5e290f49dae60b9d19920953ea8bb237d5b3dcfe149a60f12a4ee3a889b33bcd3a3b753d610757cbcd093dd5a734255333689695ab636963e3d215a8e77ff31973718a4944a1e9e44f45754d39f6fa431c53f9a2ef36e16a5f70636eb5fba54e15c20a714f2809a7cff4b8dc1165f836607eb5a5a3bb0c4567eee26941fef46fb41e73b565c0cf8c72e404221264 Msg = 965C6E9BD272CF2BFEBBEF63049467A4E74166ABAFA333CBDAAD0A0E75BD7722F9E14B419A30F493A1F2333B78420BC77E2A4DD727D8B7F12EFBB6F49CF89A1B Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 913fc118d5ac1edffb4b8fcfa4e85986b46231cef3dad911d5e9534cc88261f6b6969b75a3f25d83ece7ec2034b01d3b2be6c5bd958cc4afcd44839e3953f01e4a15ea5ef6e1b4b0e8ae90bdfd404199e8f86547f67ff6b84f2162c4311cc9eee06bfb2fe46198afb9745d9c443833bf2387eb92406a6339521396f2cbda55d98fe64074d2f2e27b8bc6a79be3d1cc568869b0b50fcbf702b0831668fbfdedc2d1b5491e8ec623edeb60ac870e6e8d058593fbbc938fbf741700efc2b2467e7eb254ae008509e91607f8e50aa16a4e851abca7c8d20c6ff61cfee6c1fb676098e5cdf127c9b79538fd1e6c014161054caf43b734fa69fe06a00d76f710acc198f3da906a7d2e73a2ca882526cc354dd7630a303d8f32c655b5b33cf78859beeaba3f9ae052c8d7471cd2bd9edf42fd8f70c3b0aa79c076928068ca9770959afa632ca6aaba6679e45d6888c50125a73b9deb00d42a125f25df5434beff0d5b0ee13a16b17045cece0f2da7577d79d7cd75a4b6c5bc345f460a173487b51bc6a6 Msg = 131E6DE48524AA7A75D5AE8D9E9747AE77671AF712B4AA387CBD74C547D7B0246A399E0C7DB7E6E8FDEB058B85F0BEC08F9914EB17D4862A98E8A28869F8E67D Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 735186ebf08d505161a8bab36786138414bb5ca2f4025289af237a40f8d0963df9117b619f83d9a98dfcf74b8f001a4a742c85ae018c3b51f16eb5015ba7027cb9a0d0b9e6b65c08ba58b671a9b3dd62107bbd5ae932784d328cdb2e1a551eb67e9d33ff1cf9bffdb223afd75d3650459fdb58143cd4490981efb0b3fe36f642e1837a5d95c3d444af73729dd1a5e9937b8114a28e065d1081f061049e650e45ff5ccf75c246e2e9433b27e79a1b06f7b6b57f9b009e97168a61297cfd0a8156d026a6bf8c3764d0b715c619d856b061df35725498d86cec25f7e1da65b99d9ecbb9a1a6364252e4790d97ea0ffd6234b515929b5ef22676c243d386ebb90a22e67a0e1d1094dddf7721099868c31326814887b646ca52a2c4bcd43f7c71399e7d13e19de688ae5c20463df5965d8255a3e6928d614b601274b757cfacdd4002d9ba8b248ae700d8776475d79d0a55ed4241c9919a3c44dfb9a1f5d0fec7ca341774c596144c38174af59af6deb8937a7d14c459b5d768a977445dafee1a4eeb Msg = F072D313B131D1633E498F792DC1C1455816C04C4610FD03BB565FDB41AB92115FB9D09B80BD45B97F726454E487ACB74400009DDFC2335E3C63F252B800ACC7 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 603ff63ff638f1ad410e266d82a04c6d475416a0470d97f483c0c99e8fc7212d61e02cc8b4493c9a9dac711d2a8edf196a26563866d68fb04849e82db0f9741f721f2ba4e9db62f6ecfe3b87ebe7feed0c9e2dd46c3f9252d4c122c6bf1bf4ce215ba82fe7c5a91249da70dd30fc9c8ac8b3bb2810b4ff38bfacc13fd41f6fa26507a055e0f1242f18ea8ed8a702d265f893cb4eb61a3dc8e18777157552a1c58db14349a0d0a2a900a0a1f4de863fbadb063ad2a9e526a0a8c3bdcfca5524c181637b1c4a574809fb45b2e4f06f3f89f4ccfb30217b32fc484bb908276d659a0d9a3e7e3fbd46565a0924f918b16b2d6527ec4b5d1d6ef6d6720f3e00485e87de61ed49ed13e85ca6a10d46d4ca4839f486621cca48a7f955a878c4785d55de96facbb91b6ea12e9e4fe4beed00141b0372a3812465e65030f4fb8ddd58701aa3da27d26feb8644f7c80b8ee2a3c3b20a516c7f0b068b503fbb65d3f3b84b253466a887314aa8eb9d85cd035bf8dbb178ebd8d5496fd1b68432457c78c69cad Msg = 67166711C3E190D74F2B3A11A2B066B741E411403D5459C8A2C4338BC7446A2F8D2325B88F1953C0A70F2604F0204071B41AA9D331B483762D72D61CD9649B79 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 878b9a443921bc7d720e3e288e8f39e550113e01d04fb1635a26f796fb8b161d5b758cff914a2441d8350f8d3922aa5615edfd86501c9a05c210c93a1ae04ff761151dc8d652fb5509ed100999d2bf6e40b1bbb64cf6c5d8e067b445daf567137cb8f0863996de8de9a647f982c9e21a787ee8d72657a2dd42ec9fec49ea1c3345cf004e94594a064b6b6b222845d64c935b539d3fd2d535fe0e47ac6746028e748556c2d88e4d40707e74a1c0cad5cd95dad263efd3ca637ac6b8f78ddf7ba81e443b836d85a83dbe843bd6271e45d842e1bb241c9c18805f37bc19838ba2bc6cd38401dce0cc9780306ea8a87d43110b3e395bbfb81c3ba45ce1cd71596ed27c03e2090a7ee81f60119e187adff0d96acfbaac38f7cb503039ead9cf9550ded5693d3c257406dd0bc061d451bd81d64f969b7c2b84619f0dd82481781eaf5b8fc82a3ac5b9fc20b42f86d4225a435b903d2258f5cf693d1b5c6a5d144f7f4eab9e70de2f3879f68e4c1c7a38dda63e6186534fcd78d58db709bf57a78a848c Msg = 1A74F52FD69C05D3656C9C8B17336DB77D470150B4058958ED96299198CB62576F6A969CB0CA3D3EDB736D9DB69E3642CD6C7A74C1104E1D347DF0F4F74F26B9 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 265749f7afb1e1d16492eebcee9f5004234e1dcb95b832d14165992f4d1c49d518ba15a6b3adedfd803287cf60ce8c915882e2c78d69ffc46fdecef008e5d7f146e38f268efe49065ddb6fd7969a842189b9d7b3ccb32d62aa05e87e932930f7a1775c338736d9bc8f36521609d8be0c29fdd1728430a537f0a2b9b9fef2cd9f0946c221c08aaa0270e3187ee5c518cfeb00169e7718b01ac0faef097e9cb6a4df3e87a5548a6c3d9f1ba230ee1caa01297e5f17d1be1d776552f36638cff13ab73a1058fe7c1eee28c76a145e9ff9b17074963c22c6435b6c5a619a6f39df94ce348b244320b207a9117e98b9aa5a8c58516d39c71878c4ecfd741ce6e51222fcd92ad32d70c3b92cbbe301dacddf2ec3aec21fdd38a7e110f4f5448577b9546f1a7cd71a35670c1ca47a9199437cbbc65926cd17dddd2c0c3b1ffebe682be616e638839744a147ea897885afefbe6f0e37d4e482dd005f4ff199d0d033bb753380780c90228a87d14d8dbfb829a195b5d8b2dbd67c9eedac48ae639c158eb3 Msg = 62A49345253DE751C8EF3BB40F35B737D17372CBBC8EBC8263CE85B2B446D9D2E534C9C97ACF16C806BA67803FE90342497FC617311D7D8A501967B82524414B Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 84a21a5cc060d141ba9caeca77fd04be8ba8270235e9948d0706dca77413ce7f0811da8b2f5372f8ff5a2eb2bbeae43752c5d1c1e3877992a49574899a6ec9d2a9483156540322fdaa66eec4a2601c281ea5ae996190853644b48231bc22729f32c2188e5f5f7b5056fd3e99ccca3effcb9793343f52a9ee60217d1c492102534a334c1c60a9c4ed63ae861bec7de9898c2dde026d9a029e7d9fe44d552cd3763b8ec3f4371f4e682315657d72a888913d15e1a84a981b3d8d437589a6deb37d14e86aaa365124bf165045040b1f959accff35565205d0ee72bc56d273d1973410774cea7735ca79c6bcb256b54fef0172e058ba91619c66bc45e11b6bcc0f68b529ec3a4133598bcf09c9c4bb0f874c7095f3ebbf85a5f669bb3717eef929fb1c22943268c310282e8842840aecfdc942a468045b02595bb16336634da20ca0b8d758cd30a2b7a0bd0e3e2a6f30f36a1422adfed88e211485066d6c0fa5c986f1dc5b4c1d965021dcc24b3f729f07c02b47af75d01f49da3dea0f1bdd6b4c0f Msg = C96F6869B95465815FE7BA63407B5A7A64DA3002922BEE7C3DE14813B79D86C9BD887151989D3AC7CD2C88848168EFD63282D9EF40343A6A6C2C9231C9E0B9F6 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 86ece9321faf1387de6afa7b1e16c2127e71e6472e093708f0ac4b40e6efb30eedc546907182798535ad6b88ae4a6f8c4fae429d225058294ef76d44ca81defdadd12cea16c58c660a4d158cb6728545307f5a6234c3aa16ae6d989b0b788cc4c18b08c89b57fe302ca6560affc57bd533bdec6ae90fc37167c4355b07c6c7c7aa2bdaf96002832d62c2dd090c61cb8658ecc0e224964b50b9abf1b4271869a8951d81cd5b46af4ead70b0454c01a7229ef2ff27599c7370e747988b45b9a8148575d73014166082947c97e8730d5458ff4a4606b1185f1bfd476e8fea2d1d7fb5d14a061f90e438ce5e36b489b5873b7400ed779ec82adfdc2d9314d6e6547dec3be9853359821e6f6d853c2292f1731789002033ecb46cfc3a7f197a18a677574fcf6870d7e47db874cff258f0f6589386fd9667af292c315ffd849bf71749ef1b4fc5a3fdf39e2782f986bc8f523162c0016c51702513ed17c8f68672cf425fd6ef8b6c8e983bd2128ce4614085e7fb216af7ff01501941f23ffbce556f14 Msg = E9E139F80613C4E930D37A8A24AA832AA7DEF60E81571E17F814D6B8B7EFA1CF4EEBEC6266B10A438C3C010256079B0C203AAE2E09B800EEA98F170F7184B917 Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 57d827593ad09f00005ff1ba4521a9ab2717fe34d7af12d7ef5dc07814cb93257a2903cedf0a80704b16fd8aa9dbd06fe3d96fcc7be3843ea161e80ca56f3ef6f760dfc7f1704ed4a50142267b87d244c71fc72102112fe4ea801c82c631edd9d917808c0a1f1c81a9de859dd87569898cba76b35702232aa492850739ec0371b0342318b92eefc45e6ae8547a604d9a15c2829ea85533d6d23fb61ef569be63779d3d2c7cd3bfbc26df02616b7bdbbc0b4e2b5ebba7ec93886a369d10b7bfc0e7f56e7b7ccc814880baa634f4afd874a841d40cdf9c8f117535650b55129b8913d53417bdaf163d68e7044ac011a55ac0e1afd9279d46d31ef83a0bb4a7dbe70bde4b33396750b676576497e202e40cd1401fd6cb08878a6c22db61404b4c2aa88072f7a4851d9faaf016a60a7a49147fc234ad67f8375a90069c274aaddaea43df6292ccdf7daab5f5113070f8ca5e7f43c791acc7e1737cbc311bd5714abb66561703b9ac3629bb10bd1b7709f081840eb3e939c69657ea8f7cfd596b0265 Msg = 2CECC7DA0F707B5AB679EE178583D8F960AC59A800C979CBFB22EC06642798F787E1E1A7D73A5CE07136B684C3BF9E3A31EF653AF23C72C7A9FF3E8AD7EBD8AE Nonce = 2d0c49b20789f39502eefd092a2b6a9b2757c1456147569a685fca4492a8d5b0e6234308385d3d629644ca37e3399616c266f199b6521a9987b2be9ee783 Signature = 0ac938ab04bf4efa587e34143436ce608ad089420956a72b23103fea769c03f02c3a0db764cd5bf3cc8518565b7efff70c74cc653665dc06e7f1d584e967ba193a70f5e3f7416ed0d4d5dc0e761b24ac8a8be172eb95691f02244379c9aeda8a9f760e061fd476b063b5ededa56bed819fb7136a4604879a92b2cd35507fd49b7d478fbd24c764aa5bc535a6abd7bff5c7692035620597f6329a454ce9188731c4e74d56c5bdef11372540b958cf2f8c42cbdbf915e0c07c77f04b05d876afbc3f2c205a4048826319184d650a243d192fbe35a163ab8ea84a001dd7c1472988a78042cf9fffd96f6948f0e692fc3f3b1c9c13de4b7a021be25c80606e1105cd56815d27c45fef995b1fea36e2e12aafc4a69924785c4855c50c61b1f43be9a1adfd8d7ff2ef5240dcfe5ea4613db4ad085bb0a6fb8627b1ed94dd164a4d9c4c9f375983734f9d2c35ec69d6d7421157d8658dcec1bf6599ea94280a63422376bfabf1b9f730292c498c953654401743c9e6bc499446759484d93e28d5f9f486 botan-2.4.0/src/tests/data/pubkey/rsa_sig.vec000066400000000000000000002367571322470703100211320ustar00rootroot00000000000000 [EMSA1(SHA-1)] E = 5 P = 29325971601394553435876545177861015867159370596202565748032715224855053574888335295064118595233157878850644746476053 Q = 36340726116985810749584556273749590346658800038386619768155308882211829358443758608966414537457415767576889158645019 Msg = 4161436445664768496A4B Signature = 3A3B7502D85F05128CFB74608205031339753DA50D0DB7E268C3951F04A1981EDE22613BFC38DB9FFEBE183A4F11B0B0F8D7BEB668F7C1C385A801C2DDD7C08CB2E56082F80AD1105E930ED96DB6A0309639A51F5379B682C7F75C601BD4ADE5 E = 5 P = 29325971601394553435876545177861015867159370596202565748032715224855053574888335295064118595233157878850644746476053 Q = 36340726116985810749584556273749590346658800038386619768155308882211829358443758608966414537457415767576889158645019 # Msg that produces a hash with leading zeros. Test created with BouncyCastle Msg = FCABA2CF434AC8DCFCEC Signature = 39ED15BA0A0A5546A634A8D94CB9750FFB968C4DF184DA76B6ACDF89D8E0C37475E2DB053F75DF9AE3FB317B199E4ABAD3C9279EEAD5481C8F3B1B5EEBBE3A95137234AB8C6D04E9ECE72A20DC7759B1836F392B99F5F095A4591639B63B6999 E = 79 P = 12623509009920451943188704532558549088394176932350155718346677596667742587560163977859877379200333095446158075633025630956096613873547787137410366502605473 Q = 10058994615186918965498012083239602676614988922192055472853974106579876551963188584799215667527538830845937432743673569788902953125963992649722735254207979 Msg = 447564652C2077686572652773206D79206361723F Signature = AD50D554C24FDE2B4D312C64D17B25F471C32CF76E54430BE37CAD31E6C961C34957AB1B4D1D2AC6782B4A979118CF7FE58BA40FB0900C2C2F5BFF26134C9489136EC16EFA0E82A9B01F1C6AE744E4D4C4D126FC6466AEBA86353E83D69065ABA220F460AD4AE3AB3083732290FED091D4675864EBA47B0DCB7C858264574360 [EMSA2(SHA-1)] E = 17 P = 10002655533675276326522128880559641932370641109150447995603867356727032045040680432848877732167453689694822248994651490544213986150493848856123611098294339 Q = 12005330954562639995221894882003776938159599218137691173964065786708881184324553451214616695634579231141110098304810361965328707486525561932025199747497107 Msg = 447564652C2077686572652773206D79206361723F Signature = 4B9BE36BE0AAACC62FFA857A34D8032BE865C0D757C7A7827AD5D5C6DF6C5FD6FD32A2EB0E851A0D04258FDBB94849CA2AD78FFA2CCC56070219B8AC198D0F98165956D027A6D0325619B8C1458F01EC6A34DA517D89F3F3046AED0F169A2797442FB6E586C6099B7CBE4F07682ACF751E291123AC5DF312088A9D84A54A7D54 E = 3 P = 11354882100554070846945886900376612381887314805411070198522440388172296396406644529348891872648788416575191510588439520855710095973876911507316156834254673 Q = 10687737242282843192095607811890713955659800468199268748136459497625221382958514322218211132968287288921196315666568919382108442603024400591730617353751213 Msg = 616263 Signature = A6B496F4A802AF9092F1F561931D84DBD0B943EF34C102B94DD51AB01E1054BC0E0572A1FB2DB034569883F382B74E449F6C80C4060FBC0FFBD3A9CA9D66685B90873007D207C1D64C692D0111157BB976A4551E72DDC83C767A9D75A4746C519B73CE52C2BFBD1C3C431D254FE8BB4308FEA486787F239FD2944390DA49DE45 [EMSA2(SHA-224)] E = 65537 P = 38742655571027337732590697775562527787685054348073330903082201415142049797052751106915225917602744711420916944587807 Q = 33427298155532707750203812574326597534760535485859299274616347317226126635675443082765626826520683819004681558425779 Msg = 7072696F6E636F7270 Signature = 0EEA6057C2FE9892BE77B7A7E38E00EF2537D4E8EE7F2B856CBD4B29C7B5E38299D02B2A845991C2A8F4AC6BFA5E58A34139716B20CDD27471F549037D07DB76A02C3372AE2FAFDA3BF1414E9BFF71C0DFA03AA0409D62CC9D5FEEAA7B42D52A E = 65537 P = 11214790861004342822506118878814784785917107288703472067327212998370774850005382865710114237083092526164901137786001727279475242636900431653154293583787661 Q = 11768251918108231511863695124801091673207253889872064192248972175890689639293691357404865738963709684551575951535362217841167719004542508270414639952738357 Msg = 7072696F6E636F7270 Signature = A10AD2439FA7F9638298CAD2E8BD18830A580555F0D0A71CB2DAAB2392ED61FB6C3659FA706D434C7F373761165580D9E3B4B72423AE3C27F71C53DE3DD812BB064C3F52A86C2C5E42BA10BAF4C90E2064D988B56C59186B48D16B151FFDA0859FE41C585D388884EBF6B2E570A69F5EF5B5D96E005BF353076662F7697DEA3A E = 65537 P = 11927147185250531206987241706428012001438427688835269930657010265855292253406995277006096717210427278224966416052253284496721639239568141610954375253320707 Q = 10836458460108962062993235628889331808256805788287588018158928377261570112701766305689178952411665100022906302213864907659310729201014252881563934382899713 Msg = 7072696F6E636F7270 Signature = 85EFECF3B1EEB4386A61AA4AB0D0A4335F64C56C24C258AECEE4CA8547638F52858FFB7842EA399E3EC97C882891E9B52A76D3A4B76BBB843D6165EF06181BC887B342900C0EDFD42EC355967AD052A76A760EF2130499A24FD9A059C79C334C586AB44C400278C5DEA17BFA9CC5127CBF392DC74B65458627A34437A8AE9FDE E = 65537 P = 1516810177539519585301330717684777752482359812340022580381674009725742724820762577664930613278162722103182359451964232072207143816619390658527862564418379901293650987439888615814359093369248021600858013452909163099144615858632738967 Q = 1493161983989237875032350952962770123912178537458211274114724378655283242413761932100230574082012556870216386204976993005824967598672396017415429903010202357020450400323637777331010081324783170783016718161385756969922786209178767457 Msg = 7072696F6E636F7270 Signature = 7F721D5DD07950287F217BC11C130E32567BD45E538A1FAD278CF25A66150448B486BCDBFC4AD3FB81A4EFC7E6081DC6613982940D1149C514AF67351B9E096C8977B5F9776BFEC7CD70C56C666C49BFE9618F4ACF281F6CFC3B2F5B91BD7CE3DBBE643EF0B5BE9CB133CD3C22A2355CE87B10E538A4AD3A098CC7E7125409765F22B5D78D5F3F0603EE6721C68C2D5F22C84B7714067BDF28B82091CD1B9943F9D619F501F5C0D418425B63AB2BE2DB5A43BF8455E6ADB7B60C86C606699D69 [EMSA2(SHA-256)] E = 65537 P = 36900438017424661513776212904206040445069678275252812845498873915150944630262472896392696742072655445587132877805751 Q = 31093761722620297310575360505968760824752648930872832945782295003888632578706451997446499334789184230648525221335179 Msg = 7072696F6E636F7270 Signature = 38FBB52FF41301D176F11DD6A536AEC2161DD783C455556CCFD51468292C8C68AEE955EE4947DFCE5D090A5DC81A7ED925623DE7C52A4872303002CD89A7A63798F29D13337274AE0F59886A62EE58FDF73CFA29DD7B1BF4CA8A23B803B68E67 E = 65537 P = 10732389574817401806637686712161900114928972500215979222308570112587692145162015022684003335540509041586909242055958940177920989586889270041600055471282943 Q = 10769364274008399181732148993301462059651684437607442862712318378134077080555690235928579640575611566791696227797400720228812659174026533784108358550035787 Msg = 7072696F6E636F7270 Signature = 1891F9604BC85FCE085AEC5C8221D0E06119A5B1E1D399764CEF9BC732F01A3C4A29D31FEA4972EFCFA749A900CC8FD1238EAA90B7B04F0A092BBC90E5C01B5B6F7022193290CD2237F6509F84150D542842BA98157D1C69C067DB357F52013632F6961533D7672D05394E76C219EF532ED1BBAD1A5AC7AF5A0CE36C1173A8E1 E = 65537 P = 10690382382368032875579095382645347750341732642602000986206771425073053009539096711057580462525647610059311660787427236189391663589206723284390279824133633 Q = 12465063692198957247771393717588965337498133363400712536396235545873826015792546875726509525466012204938021910914284755118206924338864529489571179583908461 Msg = 7072696F6E636F7270 Signature = 86E1AAF65A3C352A514148D8C3B8CBB77E7C59CF001E2AA7850CBBB703D2684160A362ACE39871EA60207044F9E266FF9BEC03E647E0A30B74CF24B45161619F1DBDDE0FEF6B491337EE2D66BF2E9E5B5BB8E4C568D580C8584DBD4F758194523A34218631978DAF8BF8364D6C4399063DCBE866029E6418F4D0BE384B66AF19 E = 65537 P = 1414073567114035614599519009667852352119591928203783230535378386566111017682164209943651582776933751686957932978385945440908660908405210644986463345054864787210924210285212935312701273765554022043880049502358394925180144264624455209 Q = 1270884860370894871136235405295670217179772083043995301293906130441676478739615259391136504018465670216723544700486039526986593146533123495228829286866064748331069638992550428012741729185283097805630542778324497745982213828342372279 Msg = 7072696F6E636F7270 Signature = AB183E642A3A50775FE8F158DE2085CF02C1F78A55DAD193D1F0F68DE45BCF8AE6812CCB81D476C27D4ECF63D9F1D9E9C5EEFA269CE214AF5A8FF24D933DABAEC2080491DA4BBB9654473C06A6BAE99095C247515611B5A45D0E02E8AED9D708D20E823288D5761ECF80AC72D307260B94437474923AA53D34058147709CA35105B98C7039D1ADD75F0E38FEAE7E3121331937C0A013991776987522E43AC1072182C98BFA3D28940D03B0CF0533E41A42DC574A835BC57D77396B43D4A007A4 [EMSA2(SHA-384)] E = 65537 P = 34290111644017464246476261017124406752239127307866392601052842903987872756111263040683814291774168790526863157190441 Q = 32373321219780996775202420673396049060814782471232760490462150501000305150218442890517454747053021887704908949557013 Msg = 7072696F6E636F7270 Signature = 36495268E4297C9F416915F3F9057C1B772FE6ED204995A2C30FBBDADEF3CDCF38420E3A110141BCC8BDD06F688B139E6D8BE97CF3201E48585B4391CE9CF2ADB91B5C20991B2AFC5C6A6F5E845E055971631E066391D962FB265FF3D90F3530 E = 65537 P = 13213155532871956710809229620859561347906079336449188923833354883861052067311866160332716570637188316306626222911970163016385067614222699697090437238562711 Q = 12185156278018102975447783982153530451807680551726018411071351165113119244051458368868894422374103672897189920999528719181936818289310742199446421617088921 Msg = 7072696F6E636F7270 Signature = 09EFAA53EBF1FA0A23B84EA68DC7292F235C7F2A2EB555FC85F73A11A7A3785AF4284BE98840A4F6D289647B04FAC1D867EE0EFD1E95E060FE4D2D766D11B03E678607E474621A0F521213914600977E8F3F31FB0E678D1C79079ECF39F5EC6FD2F62480C0C3F1DCEE06139ED661B33A32CCD1B213F7557F6CF87A0425BBE88C E = 65537 P = 12952742658236652615348661349246884821752599711563809314432328674968095150316884243716297973397616286897162089776315412332947992701095291901851152930362821 Q = 9830505301525797220711630419142003334791877337080642109589443464252360756034303307099848548291752308175110195029200931063137060871894680408049462326517033 Msg = 7072696F6E636F7270 Signature = 858691CD4D14CD74841AEA3CF1564734D939CB7D8B4341BA1F74D88FDA993761AA5D850B258BDBEB228BECCC0F6B6C0EF96A3DEDC43A7078BF05D9FF4EA0224184572DEB43D77F0C9162CE69192EE3E50402579317B56838AEAC091369F216F19D271E7141149F1A5760071A65F08515D7226336C9C5EA6CF35691B1C92451C4 E = 65537 P = 1496095022899443806644540526469585838063915622587527932399222478039240464518682521467290188589439685495049363264071340579959570216575584443701932226942022311826188618174882121293794043011152239566530964931439147137098511748641151303 Q = 1472283917569855432213111541685536987891552375642799084362818565904526275910010360079491316063471371578362830703201009076277230977991342215489595776129268725287500669150636519486708584629905320052183034866908758819712406192489818079 Msg = 7072696F6E636F7270 Signature = 9A399CE7D50ECA7184290BE01D43FF7D570F0A2232D385182AA068EA0FB097691C197B25ADF909397CC0648AE74029DA3477DB95CA4F3328E5E4CDA4A4BC67BF1D34020C8D9AA24B56861B036592D207026CFE4AA04B0B2ABDEF3911320D948776304FA648B60A18F7D07018804476E904213D09B1E99C31E66A8F37B4BBC1A57A753069BF9024C3636AD3690CC1FC1E6DEA4211F5E49F7F1DBE2B94C31C19B0DFFDF41949D1AA6337BDFF1336486FFEF1369C3770C837FA2E1526B93A64CBB2 [EMSA2(SHA-512)] E = 65537 P = 37476694786555707297177914353871207560156025277069749252132005756365596630232190444029611516538177896718501392985821 Q = 30254230875344623998299155826483344751489824106839975499429661968183354399662224725617681048222653377712768414144341 Msg = 7072696F6E636F7270 Signature = 7F175F5E66601757E1B0ABC051602FDAE2B652B69B551BB35F8C6B295F580DD0D27360E91B8D53184D3E1C1606690ED84EFB9C2A5122936BB94C4ED7FA49D40195508499FB87249BC1FE07DAB217970EAAB46809BC6925D3AE54ECF6F62E76A9 E = 65537 P = 11691612764489083516866735827418350400523918209738573349053358794166200372698431579590337273059283212578170510315136198319332779613574089694096022693040221 Q = 13326070037543981344788456214595684331432839912109235938437141575579469154548391328746138452903396979201386956607520330145333474531715616884370806349832189 Msg = 7072696F6E636F7270 Signature = 786C58FA17D5A5A5B411B0A85F3306062D27978B84C9ACCFA79665E1C951AFB2746CD0FF036160BCCCBAAB15E7848E8E8582168804B0520867AA15F44456B018051AB290C9FE72AA121E5A1CF88B761C9F73B81F329B76DD2A4FF2A7F7905418B3343136C524089D368948CB9223A2FBD35C14A3B994BAA333F5CFD60BCF47B8 E = 65537 P = 13208995026411542755984756221491120571432270306172384187506730690656429235850903578554598991580466562304863043882628875497025730933229435976102274733934589 Q = 12676614920243943028593686318019785566853821184472305644278400797455015985983346273102494277756998071370962956022149553658212324260317038787749226922754481 Msg = 7072696F6E636F7270 Signature = 8DC903239378EA69E965121FD519C85D1D136D67126626EA93A31EA3706410E420984A6443AC8731AEC98BA412CF4E2B39F2BE7308065F7BABAA15D25E126C996D7244D499C5E907B58441426A407F001F62AAEC4274EF84AAD979FE504B05E277CD1B06A74DBB838EB7A20DC34D19B2CAB5206351AF53BB968651CA4116F54B E = 65537 P = 1338196225967835515327683287337059307394012807140804470661081631567228866932117740832973828845391999092031094073649283558772582900517601774827371480903034647511795785694845439715519131501416899208199884923718317285623052073623919109 Q = 1230750235930523558307236321284100548115636187714970826267882300302842003242893725006489197235484585035369839291739102285556872873017481732423196316497798817770846788336723752577834182175286170699419893169642033901972265672269798991 Msg = 7072696F6E636F7270 Signature = 3697C05A657A8904C792E750515BCB11751D2D4C4C1460FA6055A10A2C5F2320CFF2D82C0CF086E2E213CF5C4A4BE890F5C0A9F98789710646A500DA83333AE1CC6A24E99167B97B7E7EC06FDC789037DF23F6FD1608695643C7D7C6462A0B37AD926FCA364A826DE539CC89419C99397C7FA1F1CD244B0C7D3C27E77B6A4D4806E749B1291A23F8F3E6873BC8DE349F871530AE11CF4EC42E27B6E3BACAA3DD6A40AE51463EDE39B510E94F0A177328F868C91B5C35F13AF0FEF0AA4AD88B4D [EMSA2(RIPEMD-160)] E = 65537 P = 33925778159875562458694815508122384232436989268432608178008054088773285675555263909583338719156234691017896174716511 Q = 31928768699290115217580104651693808267293870535040276334137349936791479211682915717928689548108025065615319966500069 Msg = 7072696F6E636F7270 Signature = 3D2F44712403CAD3F07AC10278811EF59DE6441522F323CB3CD1C287B233B5FAC7EC2A3398383FCD4A0AF6E404392707C72B22CA1C503C6FAEE3F3E992AE9D02C38564173CB492C9ED2EAA9664859A06EBCAC73836DC80F7282D604A43B41BDE E = 65537 P = 10681623795147072587053027475359572444943548375054652906343105969497961014724114293460791653556273861724667571868042283680899013569862548384311644556671057 Q = 12015822310483455235239634990765201859532699855613240093419019830938321918233763222336962993429962389416919708755785144483121300344148848746192876221966673 Msg = 7072696F6E636F7270 Signature = A10E2A0C3743B0C8E9C4BA0AC71A60A368E98F0BE67623A22FBBE958FB590A31E2E07B016E55FEDFCC8472F9CA002BC6F0A107FD77E839D77D24E65B48AE6688AA1309C3E8727C62337792DD430FBA8ACBB1B3F730C8D316F66683E13D892EA35E57E145E1F54AA0B786E19561BBB910C4D7997D88852923C5D84DFFC9EF8644 E = 65537 P = 12351822882290888918456218539373133978735503354715922644743560708378472514830890735731670917163863464256599907112793391676223123404599297741165488503024869 Q = 11766904710783168539513536529589907136789223174697434763482944816537165900301609658768786148815790268770347357953086231292155512720455372343943953791435263 Msg = 7072696F6E636F7270 Signature = 2AAF175A74264765198AFE9556BA61BE30069B909D8D13C31B7EB5051ACCC2BCD80D51C0D04070A7C0BDA0E9C2F88E531D2CD0B27DABA850AD37F7B7390914AB1E40EA4C27F700D91C6F17D177FACBD439A98CA75CD8B4D1DEC88A975A03C9727A75815A47909D490920CD9C9A7C7E1FBE63F7BA724F4985B84C283176E0A28E E = 65537 P = 1499776769820164661720270213001575952876279152091341596038908785682622179119584524264076668547113668314340469445667002053176362116171707271790199251992652069943488147776404891202756507625631394754713686927107372430689554562176179783 Q = 1207575106661317856418257614084066098845829109346417040472090905332905253696663718020118533361529845106338373254491724217500133281490864910490557046154217231575724915477802429923401695137792296128382845094046965590817607803668648659 Msg = 7072696F6E636F7270 Signature = 86BC93AF170E1C26E10914E9D403FBC6B5CCD3F2B5EF2E2D94118E4DD024A82095EC8B6F71BFF2CF91F0528CF7ACA12F2C74DCBC01D1DBD52A87A369AABE406F62F3FCC975826EAC8F56D3482E2FD396D06F5BB1CFED3EC5B3C08AB318FDE17A7807054BDBE44EB0BDABCCFE3A627569B58EF91FD8BC9E06B2EA40AE55E3C124418D6CD469F8F9552176B0229240660325E452802CEB3A01D7269460AD098FB25A8ABB98F122F3ACB84B7158954DDFFC6FB3EEAF3615877D7BDE533CE8A6A8BA [EMSA2(Whirlpool)] E = 65537 P = 29947977861141250899850358204141043436981128922935572414249070541949309302039598504288894650237262528309132513166331 Q = 37752607136256522947769517114772757019509564157670668652447888365515650114182146294333882801869084942840587190556251 Msg = 7072696F6E636F7270 Signature = 79C185314A87A5518D05B68A26889DA466A04D66497704D8FD0566B263F9FF4250D214B1A27EFD557D79C9EBADF08A6715183D0225D45CA81A643898572B24DAF7FCCA7856F36D0168EE480A89E15836B7235ACF83E75A83628424E7B058A61B E = 65537 P = 10175698379228666150774506438616917100308422399865868307252716163656230024725451206646629669643961215746153174978220919164554032224962258306884437538964883 Q = 9730493820577523702047295819670681114428223432429279126086889204372240793538883794859009533012783065426248982012644347167106443725448675767019230317571209 Msg = 7072696F6E636F7270 Signature = 2B7BB8B433BB6696562290BFE540BAEA1EF89D22DEAE1B5EAC8EE950772D0AADC6234CB598CFA9FB2179AF94D320A177A8468C5AB8EA7AD71A14552001FC4FC578E0A1D1BB5D862B35EFC075E49FB085F3195CB1D332CD07881978BA4729B1B3C180D8D2FDF63D3F7E0E9C6A93B1AB70323BFD3203520F28AF06E1CEE43D6C54 E = 65537 P = 11634296686883884530640104219461335769230368243774842268498412764040396779136014101925455282992044359003320731050130697323160988197852577790825454622062877 Q = 10860202286434899216950782173930690376348674016912571693705892897444210580259616617442548989581977336943534467669951513990216491504507942335237169369691863 Msg = 7072696F6E636F7270 Signature = 2402FDCA5051000AAB63E930AEDB1DFF71D8EB1BD0AEF2E9038D62E90849B9890BD5460C8A4B3611C05F967E53F4E789DCDB0A1855BDA841C4DC92056B8B49F8056C5FD2651AD2ABAB6FE8549331912CF0C0142590357964879E5C875143D589B5D7FD5BB210A51EE77F3447092ED2C6BF16FD8935E9A509371CBB790B1AEE32 E = 65537 P = 1249966052460181285644355634657456785875165989971610847326413386275162653639596449854996947775921003586204236142526358436157885593962008839873890449699345733185093150655911168918032750954191780384168174874361750036324305597935433861 Q = 1302197084325114860503571762578878829170827527881096037330701664998121219239361504632978080198138497781777579586991404853883674147659059912687285753739213050937612378438960126169835446607986664267643217894513328249437171134331915421 Msg = 7072696F6E636F7270 Signature = 7748BFC3043893FCFBF4CBDD3F9BA00F995DB6183C39777D4545CA57287EDC6D5D6B620AD26EAEA1FE60F4B809831614CC4D78A209BCE6CD712D4D3CC71623962F4EC7FC8519E861206E26AA9B0B6FB1E16D0816E19B00F63E0701189688214FC063CE6835D1007794AE86E23A515C261B54E5F963FC519FD8F4FE26FBBF7A445CA379857CD037753788E1A278F12BE61EB62AB7099FED68E8CA78F2A5D35E873CBEC10B612FCB5A11084AF8D99A85EBB8685D54FA4E4EF5362A421D760346F0 [EMSA3(Raw)] E = 65537 P = 12377144646356224624596263554992383162179533087246757961391106833734655490472026997011067052758136539388192903512338816330957435076958184717404692304837563 Q = 9654381659336904071273083680269262791097161331660286797761753538541043598813985323765139909863025057496380615772065406695744753227554731965415335502792951 Msg = 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9 Signature = 0E5FEDDAABCAC45E40ED484C89742408A1225204246EF04BF0F5FC87CF97EBB68EB3911E548240B5528FDA1E1C6D1DFFC2A70480466900FA7524ADEBA694B291CDCDF2560D9D6F70364AECF20F504876AA1DDB8C69897E52DE92A13FD9E4684AD9EB8256A5723B1CCD34D4E552D9E2A5FA8B48FAE13AF7CAE023450D65731DE8 E = 65537 P = 17699943356121302118233607435079526847022297885997750099787763703555828385066089411833038353423100938836155597490143053 Q = 19826633571172214607942110069368216581583552862543704379849517932549732941227829465769515005294350754717865760053739267 Msg = 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9 Signature = 01E6EF82D25EE46471883D373869C553A54E0C256968958FBAC41D79C571940E523B96494360EEEEC45DA943F94CE44DDBDFBF141E8F7B251E44EC47B64DDEEE2873C4B78A849242F3377F135EEFC9AD4658061F575516C7B19321A3120D0BB3B11BC7 E = 65537 P = 10102291200464255172601221877135905161140769680411173186058445237579345533001840681362155270695169400621673791710178583571477917543379742925120057367880063 Q = 13251818761749410179384234747632839463427321795839089616607966450575029584418979966311891629938137605648897309184155313972929174701092826293781972937927207 Msg = 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9 Signature = B2D322A392288D260F4D0AF6A3412A3F11B97A141367559FE3F2BDEEF208E14F2987E63B5C6A856190B37BE98A36A217AB8E49862427851A2C0E3FBFB8B1A2845A14DF7170B045833A8B2CC663F481432E9B4B72E1AF141ACFF368C8DEEFECDBB35598BD5B815C3B26BB496BCEFE5CA308D56AF870F3D92CCBCC9D3642FEDAD5 E = 65537 P = 11863574151841645121301415877438334947517760762684043570592952690667149577625920055630213981216159572642785184034757164554812640963831165922903998054563867 Q = 9817764775702978000699023606280662852733008137031492625993585955328395052748704568985204014798286479837482638252419941598815373456272692379677193053312029 Msg = 3021300906052B0E03021A05000414C26EDACE80B947FCFF75EC4CEC1AF0D1872674A9 Signature = 5D71634BD519BF992AC97451C3BD856735498D963A37FD4E5F36E4611EAC7002CE762607EFAA8A50FE0A054084E5DA46B99AC242733444087F94D7EF0FE1B0297EAFE035D13B4AE75BEF37B5BCDB2F38C2216320351E09D277B3D6AAE701236550EA44B8AFB6A75B21721CA5C780DEE262440728A245036385CF917310DA42D6 E = 65537 P = 1422064891756056272868071850854138550958747901117148299885823769659499056545577782040579846214974477700743029489106099274272480285263745930122128288770185488323618039679372315001850671777794638716832373749899985679638124073237081603 Q = 1300628500736091066469357724169131719350514861299470388096939255066412050709233427616968626428593634705346577805388370355000102457363511590933692484313315541407002266425280856998283235828574817936622468549120250213614058588223640999 Msg = 2C88F626457046190AEB16FF2A499DF5820240A5248074445B2D54DDF0C298F57BFF Signature = 0EB5DC0D319B97F56F1C71E381BC26F40012054BB9A597484946955886F83333D21E916D60C3FB667869383CF9AAF6C0A98641ECECCB9F3BD71943696A78609E6324386B2030D2B2DEF1692677E205282617AA40EBAEB48C86B884CF51884BC807BE2D7C83AE3C671DB24E141B76646F0466B0DBFF20362991D465F7A0F7B4324E54092A742E0FE4C66A200AF324706B7D1BDE1C0371AB5FAFD58EBDE5555D24DECF399553C94E45A3E5B3F491BEF76EA9B08C41C2F233F13F83C99D6D88EDAD [EMSA3(Raw,MD5)] E = 17 P = 13029564622157791280616891297384459345543528892729268050647908228725108502227809382105716872483480064224030258864846430267698903993578412414816903162894041 Q = 11607519244599001458239888881356890329831441554346650600093035021905318722027819107556373878744770935515508357488960347997325733372608114236427580844273703 Msg = BA34C71DB7D125ED4E6B3A246D6F235C Signature = AA5E96F061E0F6FEAEEDAABA83BEA346BD4129B1F9F8380E8CB1E61860E47DA5262F0A2ADFECE7DBC02A53FFEA0C24EE162ABD8B818D4C125BC8351CCE0FA7C533C18EC7264593C3CB9201A5C0889DBB211CEB659135854C6510F3FE96DFD5A172D1037C4C7B1CFA6BA56529B6C5FAB72754F6518E114CB14F1CF63AD12E3B2A [EMSA3(MD5)] E = 17 P = 13029564622157791280616891297384459345543528892729268050647908228725108502227809382105716872483480064224030258864846430267698903993578412414816903162894041 Q = 11607519244599001458239888881356890329831441554346650600093035021905318722027819107556373878744770935515508357488960347997325733372608114236427580844273703 Msg = 48074445B2D54DDF0C298F57B61D89EEABEF Signature = AA5E96F061E0F6FEAEEDAABA83BEA346BD4129B1F9F8380E8CB1E61860E47DA5262F0A2ADFECE7DBC02A53FFEA0C24EE162ABD8B818D4C125BC8351CCE0FA7C533C18EC7264593C3CB9201A5C0889DBB211CEB659135854C6510F3FE96DFD5A172D1037C4C7B1CFA6BA56529B6C5FAB72754F6518E114CB14F1CF63AD12E3B2A E = 65539 P = 11168521151320677223099520289134966992601683145565112324637158550596009851574902780470217910694744696561366167142428802151936571560468174927200445940567007 Q = 10816600553880350717053882598790014485729013898038211768326616483120925479644757202271963372888531979499482994517188419156745487931465261875790739449743489 Msg = C61622A7CA43FAAB319B89079435C5140A43A230FA910398 Signature = 9B7456766E6BEBD2FA31A294A7D797A7FC221272DB54574324C4B801BA61474C153CA914A4E143F0B3F776CCA3553E2A9BBABC4C4B1ECAEEBC5A2D6D70DF76B6AEA42A9132C166EF7A11EA39C7052189B471EBC8A263382BD9EA1DFE196EDE6F2E92449CFFC569530AD0935389A714581B53BDEE5B73BFF906E55A290E25000F E = 5 P = 41311212887527321296910690083438901468198028425035176153039485803775274600339249686546137105271904468806369569532459946754590481495604261708658552107802377 Q = 42829447304025485409915772919380166854730012266060668582427765680605609407608485444903654931988417858022487454898986354396591573297070321595151319670379879 Msg = 2831303238206269742074657374206F6620504B4353233129 Signature = 0484FEA19814279782BD0732A7A7E29738B2B2DF0D0D2928253921990B4F3908F69B968FAF934C227FAF39BD35DBFD82F1C9BEAE66C4977E3AF69E0567635E18A7D831D5C66A75AD8D80A6BC994EDBBE7D6F7FEC327A1E2055AA81720B33653005C2CE87DF23E4A286D5A3CFF376643B969134C49E6929CC69A23E4137CE9AC719 E = 7 P = 56502443330109652012896870230918313280459003062299720262927311511926605991383640715495987844171899211289224946511255965967340402875433794406795487624757349 Q = 73578537452157693283231642645827270120293041340648216676812169482811807949806959672539137255855767091341745810986440757513442020612487911929786967013604091 Msg = 2831303239206269742074657374206F6620504B4353233129205075752120 Signature = 13AB41A8252B19A23ECC3781A7AA969ABF929AA562418750B9347F140F2C6DEEBD760C27F650D403D4BC692B1BB9C99B0A8CB20D75502C3B451AEFE81BB1278E23A4B7F5C3C438064CFC25890F68ED689EC7815F015C018BDCE766EE3A4A153519020BEAEC16F56F5559B8413BF0C4240645D2D8EF69B023639B336F1A2BD2A622 E = 3 P = 100105190655880613526906871182857362781101316149110875040056075087834316244830515596846408696768017631747666578303928711549135992557123893901488804437048809 Q = 87505326188471078453642832214207735276976488958911502452583708791637904447911246482791600127524020386147294087583259280622610769702631671804240507562602451 Msg = 2831303330206269742074657374206F6620504B4353233129205075752120 Signature = 0F017BEC0E1206F2F7BD50500898EA57A1E798FBE0D8C66594F85064E1CD7FF6FD528D562667C9B1D75492B83131CB1262906ABD657B3B15871CDE20F871D81DE98CDF6FD87C5753A0A9E8C223BA1F1761273B9BF8756ACBDC0BD7E6E1CDCFAB3C1722F1B3053ED85CE3CAA15A843112788E779E463BBF51BE3B51243CB14E6FF1 E = 11 P = 107304626108204522797343576791067207674137385684926834447166228043898744098849309658395882841000638879557805589763538898524768732146465167916348068742644931 Q = 122898736307782687638032995621837068944394692238271920897962723305458885787013604775683437162169612247714741385692953103776328837938931275692031599018249399 Msg = 2831303330206269742074657374206F6620504B4353233129205075752120 Signature = 38DE0D39AECE20C3DA94E1B869C09F04BD22C072B1DB012E986DEEA9E254A5DD5E6A946901EFC92A5EBABE010603125B60FD594A3D974986F58F6FC71447333427B1FDC960512C121E8C81F0354EB956698EEE49A4F989390950B679E03A0B6D964EBA3829C52C989A1ADDAE430D600188F1A215BB306EDFDE6E512E23F113C52C E = 5 P = 142382474831103350965198261039493660182684647144054268115539864228139684454577808385021853875960363034348415466818036752700586059563484330090984730204416497 Q = 110388045236737901697454183037730543122795238849967531837037661799768634764847803431752698556717108074918915921205421335903511188911570867395478174657786723 Msg = 2831303331206269742074657374206F6620504B4353233129205075752120 Signature = 192283FBAF7B9018D464D30A428689046AE3E25A499F8E437096800E09F4883BE72626B9C0B50E982C5D53B6C733CECB6FF5C3CC2958BCE854BE89AA1D166361ADFC0CA4B23D7A5D404B0F75ADE3FB134C965E427233F743925AB36DD45564F07FEC46F424A61977645E0C4D275A2BFB65A403FE14B20210B0CD3ED319C9D31420 E = 29115 P = 2248799505770661724938813445456667365329686243722367143419772250218914329308629009399918288741261238283310599222022599278196007356285274958577172760406897390545735372932091739959696921421139673013709008368458594104886834298201355669647542445320664207472693942294906919061844996292955105757838550281946311693400318202697189287295539697390920041505007750105724478313556859907375861309482250947611753957139154639954395831518389550631317305548684782134331825080243557 Q = 2202246626453634427990543239857045321569536135331564676695302154745101045943787221623965844905956805511657988016271218099723231745952458510284098724054085984249936487583429275220855716776597673378123548112186672956810286728043102750319584617573057937024349744117768217790432698368984584844795326385765843463046872396316170276636851577177665213767991628352853455571735032279994626500671870333710256782439458813563045527296654390106887801396712535561502995976841089 Msg = FBE8B752A6BEABD3A15EC05046AEA5F90F81052F20E37699 Signature = B9E0BBF9A5691B53FBAA3098F17A1B31574BD00740B3D9D45F46CFA2C94FD8E7B9EBF34F95D5CCC44096688B67918B1775911C79C56FE4F56783E3293D1F4D7BC75841C53B8A17D17D0976F7529D9A0561BE5F324DF73CBF76C2E23998BC05FABB44F37FA9D68D9257399CA3CC7BAE7E3F49BE111599B240140C51D5FD9FD961B40E685D538B0D320F2CDDC9E443F27592C545A52A581B9C748C18BD6DE658468D627645674D943597B06E6DA782F5AA159B0F5FC8E350A71072587CBD92D4D20B3BA6C218BA6279D51DCD197E19228AE52452345D0E12F0322CC51FA416238714EDF593DDB2908A118B6F8935A85228F1AB5E773A1A423C3BCBA82793752646FAC7E99399F6D522285CA9FED460B6711C042B28D3DC6590CFAA6B5FFE1CFD779D8DCDF3470FAEBECB2EBC67D75FA38EBAF10096CEBDAE5600F246AA4F4EC3A2E432F6FF43909D3E1A70A2887ADE4E2B4EEF1DE747521D34E8EA5F5309C31A5210163B7333E8F769FA00D57DB39E197FD32525AE843CCEB8E3008213E91D9AD2 E = 28609 P = 30713721502546792009569437684655791032651902151805416822847877314068941375274504013962324311043883041624133529890476032694779734453859537979153899846313593590617317794011333098807890060286828821229596004698599505923766352810131400037110586886153718420003477006675621862441302731554647471021776938143897868628222196113554006892025930227077136107720909052650406921489756265990721303310168662772063459947852563636145471059151399285507791075760514927822828251320632219315279557919978092832680623597667312892493237476876837938117004459142738095462373380252724125993953065796452197485310867243565620349408625834563894036403 Q = 32223924283050128517931494104263889474220504057338702132610745949194011162619307345899782844934616030119748960801978988921577436331860329124377174901689014865540805921405518118520895078106856045928071624606062456249102949883605631289382564999409546836927196166450496329570105147124420803999939981354710474652789122596248315518645751157374699392733211803293593169754998821503832901347782186365455553481942027434619452198578715941091622391280282654230559330049736742367719066954095242864262475021751768355533044621313175006422476858038429024171438138216629916058032347601938861615897483466952989228432113728073067833733 Msg = 42B91186D4E2FDB3AF12017F1E50FB837B66A85E9F380BED Signature = 66D7F4CFD58ED769DB35057730F8CD567F4DC0643AA7B058A3C00EF862E798261450789B7DBF1FBDCD326FACB728AD2D919629088331C238FC7330D696C17BC80B5C6A8536735FF14B4E8ECB1C731B97E42F02C5F9CBC44FB8C243AE38AAC12DEFB90D9F33C7B3668BAE8A27B0BEF6195E9AD76CCE0735F6C2A0F12A45C9603CA024238ECE7DC024E85327346091164E652DDE7C5657CBEE1685C48A527CF6C3D3B76ED292E8490CBE2030CAD2687AEA0727540813C3F262BFD5785C0BC7A6F727548EA03ADC2AC1E295F46D9952C0B6C0BD1AEBC96D013799825748E0A57F02908040E755E7CA37B07CB6DC976EDEE64E08DB90D87AF61C00B0502A6C8FF2844D198B3B19F0A0F1460ED2641E73267F8BD6FC5053DC9086551034ECB563ED6C5495A72C89708EAA0618DA075DE5BB465B8B4CCC3248E313941B9C799DE4B5BB0AD1046D839520B51E29E1177FD53B44FD0834DA24A8113D309913FFC6C0FFEC978EF2BA005FBE22BFE5311AD7D1386132391B0D97FFCBF470C417847D9584019AB3DF80B75C7E7E7CC34957DC74FEFA831B389A668B0D7A17DCE93B82A696BC503B468BC698F507DAF9544027541FC7D7C96705FF72ED2FA504BC1FEF7C53552394A4F4AC6BE14DBC761BAEAE84CD00AA304E3437E625F9B9A334EB0D94EEB1CD2E7218E4746A60E4B2C10F80119C93185913DD13911AB4BD8673CC63EAD100 [EMSA3(SHA-1)] E = 65537 P = 23443439767333138692938389505422341860387525814723848738690073331642118819681 Q = 23234950162188993388155927630085331316851060055334470382368804331834850828939 Msg = 45766572796F6E65206765747320467269646179206F66662E Signature = 0610761F95FFD1B8F29DA34212947EC2AA0E358866A722F03CC3C41487ADC604A48FF54F5C6BEDB9FB7BD59F82D6E55D8F3174BA361B2214B2D74E8825E04E81 E = 65537 P = 97275951885168599140238038120787693449121090243265140997942777398030699928031 Q = 90733938513086078955986841984824358234035964765276905350626699509098131819443 Msg = 74657374 Signature = A7E00CE4391F914D82158D9B732759808E25A1C6383FE87A5199157650D4296CF612E9FF809E686A0AF328238306E79965F6D0138138829D9A1A22764306F6CE E = 17 P = 11016163637474066820302390975549886181099228518830768603640648873155204881587104654921145848526585545778089665179260246654794241103772100366027852042282269 Q = 11467303671973198002966968552401437726088142243869081560317300150520447487950355294881725329031248121968610083485837008554944359981159358914095392843507293 Msg = 7730307421 Signature = A372D1D551F9260896C2513932A0828748086C5AAE2E8B5DFADEA3250E9A87483C9DBA5D6F3513202510C2970624C1EFDE858C432DE7E50ADCDC7D639C30AE8D9D3B6E521AAC286D8613223066559148E6B06EFCEF9799541447C468D6B49ABDE9B51B14B34E475B3D04A6747DEB2CCAC5400D1032DD977C0A98D79A74EB38AE E = 3 P = 9578903947833638265885301669622256833570742263284023794709048140382722800646670072341694305423268897179927939851783575647402034856714024302214311745639409 Q = 9650312740088480596837864858144252867783701613394406302461730869237993514195686989668307281184369417481714782998172854683687641043509314364586499964708833 Msg = E2F47650BAC3A1D9CCDC6753657921E936AEB6EFF779C707 Signature = 5A7889FB6097AA10EB19E3321EB68B3E7435A0527443031D628796341BBEA838622944405BDBCC2C5AC8374BFE4B7C3AF7AF411C8DE0EA9EDA138EF717CC000CBF58F6545CD370FA3449AADEEE171CC2332F1D16ECA9C541B63BD0961C42A3C5EEBDF807E26C27B9DE6CCDBDB5308F768FA2EAEE7AB314B5755DDA6FD8C98922 E = 7 P = 16144034743727050546831832169628316925231568215175552041798163456804330937120791998925504149830104557214870627609351722587075941223525342334068971869478111 Q = 13955862823778441100165552543277032564359947041041995957362507143304868115105227500234767869549036765911800570640813296336752778490714112501713876165449809 Msg = 948A0A6D4266A31736E4D21B35AFC1CA445EED34243325F5 Signature = 010EA1CD6D96BBBEB61DBD9C70CE736EEF845B0D27BA07EE618475543F5B5FD8F956A88F1B864E3432A6E735F0E9224456D06664B03A4876E1B3153B92079C66C8FCB0CEDC9C2D9488D8905986342625AE9DF4D2B1C3D5C0AC3969230C3D8A20A65C67416E9DDEC21B6245E2ECA3C89F16B0317605BCDE9F1A46256AF16832FBE8 E = 3 P = 26051747290618968923464264082462247969991542213090185595633404345207924651358622528559203743860954707853805736919763699299338026033642436479315804428425853 Q = 26280317426813160368825841472848135098988570783681954000282272491138021774932320682277644731515495071629489308940717426232202095607622532422899188985279769 Msg = 9B46DD4D670326C11A839BEAF363C9349874852B71C5A201 Signature = 01960093BE44CB5219ED920E4BACE3CDFC31BDDA56A767BDE821154F69D241E8E45863892060A44D352A6432DC3FC4741AB0FAAE841B92DE7008B5679B6837C78E430E1DD0318C104FAE4F9996F032A92D4506AEB22AF83BF3082746883AB49E77C81679D41FF069CC0A43C0ADDA09B3D200B328B824E4EDF5C7E2A4A59F8051B8 E = 7 P = 26997945947601534824645912031534336752741628243393360311150643437863423024726644835499058447334803680127885127788191906488771562739354425641343764464617053 Q = 27779094296209621527287405855390430199275695901267533877524252900503269329956810397905533791869889774496412272498095504626303325321870281923743689794281321 Msg = 83EB45F909EEEEBEC2E205EDE6BC207FF3A2A260525E7360 Signature = 02586DDC48C9F8438597A6C4AC61F78D07B0C61816FEAA5D9DD834A6CB340B23B3877FAA840BA56858E6B7818E00C6E5F940CDB95493F1A7786514B521926273AC8091AC065F90D4B8D516D7915D121DC267B4D6A79CFBE8CF05D0460EA65BD6AC0B01BBEB557045393E17661B82E2B979B60ADA61A22BBACF1A3FBE6AAF30FCC4 E = 17 P = 4504173304054060288974038034960604888275329240260610122529 Q = 4760351443628736535486765005952819108859317154050053456109 Msg = 68845691824234716895205753FF Signature = 6DF86AF03D8EBB9E1E416FDFE3B0EB1134A43F48B01A23C67B0F24F6CE004821B26236EF605D16935BEDBF3B77A130BD E = 17 P = 5302059783871094749166532057672506750267895630491674459879 Q = 5627102272556795221533693072206792570337194865676608617561 Msg = 56897071727374FF000100 Signature = 4DD033341024AADEEF6B8BF6FE342EF0E2A2CAC804E6E25CCFBA4AE924891E00BF454CAAB41FBBF27163815DF9C04582 E = 17 P = 10688456918242347168952057530328608654007166829427538005772817321211684713745122895180676903686057723602218730490340887346562426634705196969886116533551671 Q = 12317099050977964889925058247487762348779176472320259995517390962538819986624481038023470521804052151604755535951798769688147039101863976597721493852316281 Msg = 56897071727374FF0001 Signature = AFDC022281E69DA16678E3845C6C7575B9DB42200C325D952C8D0855597E441AF79537C6BD105FA5AA72934905A1C23AA4DF8C3147FB18FA83DAE84148A177FFD0A0D00396F38FA3305CF6620416027753B394839C5266011CEE41B0D0782068DE94E01199749C2D1D48D8D4809DB0743CDE6C6D8D77E3857203CFA1D725340B [EMSA3(SHA-224)] E = 17 P = 9758966558755165470389472069713928591013557396972595144169571611858368887161033149801285940784816379567871594502091962693655782287652429809833235706245507 Q = 12598434076498069053479387212899169946221335037529449058439253324447946057344228633079860425249029396145320651733998005914719062107456392204291912576986529 Msg = 56897071727374FF0001 Signature = 9A76D0EDAA507FC833583DC916C1B5DE02795C2922A723835A0AC0089023F081575CBC5D67F0C38BA5B89AE4AC79981D3CD123AC543DEBCBB5882C50D6B6D0B856EC3A7EB7047E1B08AD7B026CE9A5514B674594EE0A612A8D446BD0DCCCF8F7F0F7E470B4CE3756D37D513C459915FFB11EBB9AB94E2D9B8D564AD96F7D779D E = 17 P = 165275062281166427869119241289272507031597934229360606001644708185525478681468463208605983647501226993728204483388720213866461997607650355801770765461168512088269322340056017325262835138857912935176296793489324188507063271961542803915017967567707230137097183130776663730038378218451497936798610121138361905437 Q = 171702619881331992283348313869045011005852750055590074232381993437725041523039844513142534504315649641098351316212060346572041310744328538798852093144310147833770683170419958224929184910351703076744777643716419431719027058584418238949594579648972349234462772302729188655853829142525730391461737802407205727611 Msg = 56897071727374FF0001 Signature = 836AB5223C9725BF1AB607BFE7BBD16C465A7A24486C530FEC82CA26A480224F73628BB0D73C053BE7393DF94C41BFFBACF6B0507F39BC68FA235ACD9AF869CB6C264B024B3BED49D18CAC30489A08FCDAA72C7F82C901EBABB08F6B40934529F434E56B4FC29750945818C4342DBD1D2C3128BD9F2816D1E08681AD804CF848EDD8D664746D2B9049EB3303594735DE319D48A9CBE32E5A112215CFFEC73B56030D7112B694EA78CC6E83B95895A2BFE3E970EB020E8861280575A00B7E42C1981E51AB4718E12E3027CC674885679E4F7EA4C31DCBD3B348D53C45D7916C5659B43A4B6906198D7CB248B47349D8093F79B27657979874076A678BB0889697 E = 65537 P = 12953425976394912429374423754113579628514835529815680554108305816892864384987108132291635182445543728893390175795841005615344413681798441427208974751718239 Q = 12050531213826593984792671369399566384384636165678418732202708271123516548056832627823188413221768313844798076662781683091277875335417319987183638616676979 Msg = 56897071727374FF0001 Signature = 19C615462F91B29EC0543618B706BD4E18B39DE21560DB412A8184903FD2E2894CC2E52F797C5E969599F6D15F7A82904A01AB63F2ACA89B8E34D59775578D9F2C4270876A1D42A0AC8CB6924693445E5843C91913A23C3E0C68ABB5399713DBF93C81C615A0C1CF0E02EDE73DC62460F1B43F542AAE92102DD62AD73012F48E [EMSA3(SHA-256)] E = 65537 P = 28073761027596176818273133531175012766615221786736967452315971872890397800391044593708325054337716710794457780350323 Q = 28376480946069603139561128774323915552469745784555061415385017851901461037645335422805165977050764493699630122976363 Msg = 56897071727374FF0001 Signature = 3147199EEA41E1CBB5175ABC5B3E4B46F377DD5A42F20F89A43B31CB953E92AD92E984B1D9236C676E157828E17D3FBEE4DAADF779E66047019E82CF9E532EC360B33661E5E5BAA44C6DC20A66AE11DC6F9CCD375A9136267D8249FC83A9815D E = 65537 P = 12548469512475210662420806214774094620195176907021934303054246379755652472160755374949525613970387188102747009600021261537992707522296421237735925202868631 Q = 11450843441323910528819022878602392785471371748591881910292094592003031455689735867582381833502112447949779055140516381891027256162967721404737248444058539 Msg = 56897071727374FF0001 Signature = 0B68C0B9B359A872FE695EA4731F498EA19613A09E0F1D975A04593B8321755A5E1F94E0404F3541535B6499FDFDC664BC29371B62FE14822E7F25010D7B16D4348D6227F5E8AA16583FB520F25A34170FEF10249B37A77AE25DCC7AC85000AD932B4D39C990E33099ED27C737EA8C3E4C070415A47CC0BD844E0D6EEFEFA88E E = 65537 P = 11087054765005800103888948650962983210646931532273854440408926345735168247875396819077559229008685473965803577908759801011160174205126413393370263926349573 Q = 12716516379304890027860407876068984562873192401106556043555385902644997734347476240343762218381680211618213773352076421869453460584489795774320590078003807 Msg = 56897071727374FF0005 Signature = 028A1A0E630CD515EED94B24594C07829F23CFB22EC6DF314E5D24728B1397FFD7FA1EDDA877FDB57CBFE73D41E592740E9251CE704A82372DB15B44D15C1334B79AF6D20A360E8BA354477046912F947D5340D8F110E7A5E64AAC0F895CAD2B35DB85FC7AEEFD28BAE65CF302B99AD84724FD37FB2EB678DB629F75C9C6E40B E = 65537 P = 1178406731575038829853726311917412876603908146715375661818876297660960199892505426806499233207846042906264429980426565173334842567409995073865789534084855060992173419987333326602292183641206311445356164316301213150549264990514542587 Q = 1378320896807534050929301373186662222686458777477196223129892898304364245429282929080520404560743534320183182125184182016454386198259379672329605097467311417711892040868310563187190779760946485400821319749306602303289863477031385851 Msg = 56897071727374FF0006 Signature = 71B5015C75ED97DF66BD0FB333AA47DD30412C460F4D82398614033A9569D4ABB02F68D22F4616997559B71D51701F68A6DFBD6429DD768A1B590DFA1A32A25D01272BB983F74C69C48C7664BB727D04489C8446C521637EA72A9BDB833CE59605AE91AF68912E170DA30A77CB9EC44795562F7229353669E1B978AD0D3D6FFEBC2AD021E85BD0A0D34E7AD960F82039BBC25E6D1ACDD2CBDD04EC3B476EB2A329427EA9AA790EAD220A4BE3AEB19C8BF9F6EE1A02D1DA08271F6C87C02F9234 [EMSA3(SHA-384)] E = 65537 P = 32971991333271161338505494702878862100489762324072692348588291610239952953209840758320432984708996443247062384208849 Q = 33062782038247106971088772016040107972245147472391230280971338950516123260148656458931584714467171374545541402157699 Msg = 56897071727374FF0007 Signature = 03FDD5B68352FC18CE2388AB9258FC1A1152DFD9F5812F629FDAB0989F6AE97BBCA165072927B366660F836010CACC18081975605DF4D3EFAB865138B519689EB7F7EDB590CB7B82405BDE01054D86C683543B973F21CBE93BFF59042BBDA578 E = 65537 P = 11921346556469747668289370965376832340910197091992767491365129866812133114772653650577167259045066019842985221007000839049275688169842940636385017225110437 Q = 10984249058520861025806048049505932236947806107984715113830923739838211464283567306250678571137159662575767869786097865940738982838325899325157498480530771 Msg = 56897071727374FF0008 Signature = 991FA0B96B790DB98E66BB84C3D84838D38C1DEB9CDAEBB0CFCBFAF63DDC8870C0255AA4E4052479378D63AD887B48F22A66FDD7559A034EC965C962F13AFB8CAE32A3AC2F505434F1B97FF510F7CB2480ABBB7D509D8EC55F047B7D639992333DAE23FECC4FAD5F9807AC4EC2BA7C085BBC1312A3E4817E004DA7C23732E8F3 E = 65537 P = 10446191406397802247185870337079102172711041044436099817253264917300370577770336088073490760392100244563071355818919455781466053080964011640432539884209613 Q = 9981671855683310473214627935539575680984828926898911789598147620419575813140629931654539620050154882690628069842184057619784221531148611557047251607058737 Msg = 56897071727374FF0009 Signature = 282DCB360669148813D0CC36AD7C0E6A6933F884C28F55780CE773C1159BC7F8CA99F54B0635D11E41BDBBAFC5BC729268EAA710EF2CA90D961D1F96CF77D5BB50DDEF241DCFC1D3AC570A163D64D1A3261395647191400A11D5EF6B870513ECB8FBE7B13691BA8A5DC6D2FEA1EB73DF82098A9094693975FD3D2E0B49F64EEF E = 65537 P = 1510549417854877747825576581081732477700111419938615613983962109662062335330017466956858125080365659309927796925935417755723535731495303933901035999764977863833078372000009310743596462234093697446861626949002711920840605877230757677 Q = 1458049578283339865423285246477229647780331978350471208882083558016892029486833800393886610593440339895221992399747494918400335844710675420456789057533481159248152868175464119165613815097070691743727137182716423523814454452278800887 Msg = 56897071727374FF00A0 Signature = 152485EEA76BADB8B133FF9D2B8F43349E480AB3B882A3229D43B271F43C69279B8662C77BEFCF09F34175897A8BC3FEC48E2B58F418ACBDA52EF5D0322602E3C0C0F20814734A37A754AD9B5FB2B74327786BE568C423698AB88AA0AAE719EB5BA48051A285C0A4F1CEF5798F76943EB5AAC8B129BCDEABE8B7482D75C20160FBCE19829CB825681A63D6AF61041CF0A19B476FF2684AA6A6F9330C36283FF23ECB15FA0F549033C4F8A15BD133219DB07CB730402884D33447013D462C6E70 [EMSA3(SHA-512)] E = 65537 P = 39260164823044347049559843214890110455523386170656544785033043140193564144004385280580363620038060286824132528359527 Q = 36962035243386756345106905450087414296171176744214757742250021657246238205023199468147453436540590274360418434282959 Msg = 56897071727374FF00A1 Signature = 945DC6D68E264ED1376D3CF50260B752D2B5DA9B7BF0DB8A8AB4B943C18B9B323CC4AFD35B0210F4D43409FB524839FCAB8F19E781BE1E203E6B0627CBC3C00E278B245178F81C6EC22B00D7C984E667D6003DD904C12165402BAEE44B11BEEC E = 65537 P = 9661135950116315539515451640981180869630858345924084493706541309032255383533772898042880372432338001201170776812272367362361290511668336960987074656816001 Q = 11497512449252464505399480477876115154244266229987766998043719286175927123078537014093376513968469370409306182616815376737311758890618524522046489448455173 Msg = 56897071727374FF00A2 Signature = 8A2D5F07061B9EF41748725E734DFA29EB0C2FEBE912FEEFC93227BEC61219A7C0E9B1284E85A8070C1FDAEF50C8E7D1DEBA8FA8DEDE8838F82B856F7250C051847AB885210BBBEF0A989E90FBF5F1B77F57ABFA9E86978BCA1D224693BF62BF3A10E4959E2B2F28A08C900687C293CE27DA9D167A68005469F5CCA3C94DA104 E = 65537 P = 11076032638188385019848207800165348636110417917130495893852455627578698362638313549065335962389217533557161938635625881541334178828771816365418722734795977 Q = 12771621871865791371091988344703766235920053814145692802419058648874577926135371462643659361015621494836747573372151872281774079198448234056278606493554209 Msg = 56897071727374FF00A3 Signature = 7DF777BCDE5CADEE9CF614723B6102645ABF38E273B6A0ADB5E60EFA49C597600A4D06E835FE868BF6E9576E10699D74EFB08A6376FC817626CD3DF600AD4C6F34D9CC760C862A136BCEA29333240F4BC36BDEE3E4F80F761B85AC1CCBABCBA817F0891F7A6DF06FAEBE2433E3DCF57224314D6D65C20D302EC1CDE1FF59EFE4 E = 65537 P = 1175299264996447722245899360421432565447183761006496847244045661192372862980712539749387091606803032278966350864422661092332131443948678411382829893199990941227814880161384898392929239336451429269492688256603287672272651007253432749 Q = 1426989628843661253583640984294540950996140935488691951439282220015602864573764248494097561856713219516277017402292174665406312589729039755902746528895232100768150884804146876822694902032532421820502309406306091978959642797902807539 Msg = 56897071727374FF00A4 Signature = 52472933FC6BE8007BC4F7A53AAC7D76DB1205594B4E2CB930DDCDE2E965901ADCE90495AA29EE6ED685975FB8D84CD236207DA6FDEEEE753A68973F767C5D8D453FF329FD90F0699041FB81033A3DF80C5425D83F0FA459C333B0770817E9D6AFE326B2CBD1C1678683431C2BCF2EC8DB9726E1AD41DE56815535F36AC428754733B22B02894720838B318BBFF5FACF5DAEEDB9521B29B30CF6F8D5DCE0997CF5A4432C8C5C4484555F8A07CA71A033548253B7D7A22210A147092BDD64026F [EMSA3(RIPEMD-160)] E = 65537 P = 28810981759281935603985024851811964742087082557770824103731114996318624260496913929540541170306698904278603576145271 Q = 29294311751277679671079429335930388092172077199880309437831806791152386892298786037164207155956736923997090458669973 Msg = 56897071727374FF0001 Signature = 62FE375B0F9F593AC338DF86741169D0393EBA1BFAFF2DDA8B02A34EC08E4847BC83292F7DD1281599EF071497A867BB6C4861790DAFEB5B4174B147082CBB3FDCF278E4643243BF1DE9320739060BFEF4AC92BE9DC12777C1DE9219822FF1FB E = 65537 P = 11188055485122325272866867462211364830753736783738611384964124686771289360587823319352667615192874283062587220840821310899874887065873506360398088494408527 Q = 13065350354571460622289143927808756598365617843953652701226817198123675745335695762211588785754677199731595689072110154288483858200012700984882671888243819 Msg = 56897071727374FF0001 Signature = 0E6949B11261FBA40B41E589C155774F7E0A7E901718C2C9ED4C50BC89EE3251F6B16AC403A66CA2A294C13C6C700D07452D948225E9A6857C55004E6ED89E518F4C528A272157F5C038AC64B827725EB0EFF5E19140CABCBF07785D7D8FF3851C77FF60437F2D738FC112378E7AC82BA0B276A5AE141AF41540333C286EA170 E = 65537 P = 12258456531968539845158924415511460871891866365110065980017448161060846588851600545657318428515354542127798147493409152368592619747771655194252705368509059 Q = 9594582446351128346795867126404821944392833125013793260900469971672174859993373867759343753539681207422054034324225270399949789784413918079209800412363077 Msg = 56897071727374FF0001 Signature = 435DD05DDB3322C402751D5C3B9E7DD9B27CA5E995C79A40C9C888C6CC97930F3F5BE4CF5E4433B65D73AF28DD123FA6048B34BCFF6E79829CA6A502F5E613A165E3820730997C31E8897BA183921AAEC105FF5CCD7F28FF480B0E663B904C9548300B75A5946334A1F9A8AF34E54E60A3E01E6DB3C2D7BF7F20244BF7FC5C2D E = 65537 P = 1332414773462244345287452808343335233085319446006195144197509760072289459257240880605326415066992615354347362012923882740319578634383514958531290919338694117135874729396074367358963312366961122024761221913384789492569888218889897849 Q = 1314795837618713069258674746380422189419344375600466758282785046440835994844973589678451612271662103698299114978842599413683589951215453704525546244803395931336492951115264695075210241119805463884289097491701511590073665198187932849 Msg = 56897071727374FF0001 Signature = 7ACE3D8BF8C940BEF17B76A53DEF9EA42E63D3576A7A3CE873FC46B584592C082C2D242DCE37A8065E623556004140A2D403B424415ABB6850F950C121051DA747934444C5AC065D457740D6DBC984FB0D1660F3C8E43DBCB19A09675C14788B3847159E92A19C9C60E1727B159D386E75DF3EFFF853C94E4826CEB185071A2B16C6047B21DE8E0A0394B934435C96548644FA0514390B7EE6C61244789B52FC0FBFFBCA8BE54B6C3D01EA14F2E0E086DE8657F02A4F3513F21930A5A5F53C47 [EMSA3(Tiger)] E = 65537 P = 32631492140153322637585648564563279120918521201288665579705656902595827172687842562885397479939005094102333506611817 Q = 39162724656922322351082077025123484322639781910080179352369911199916517553165320253263971785803972536077240149541431 Msg = 56897071727374FF0001 Signature = 3F0C903F6AC0AF457FB343220D55C7DC8F365D3BAEDE8710E17142F0FB3706017CFA31EB0139A2A83F9F9A4EAB10471511AEBB2950EE163F86A9B28EC43B0883D2B9DBF13837DF288DDFB3845B143532B84BF275C356FC05D9EBD77749C960BE E = 65537 P = 12158654678169091650490415669116684328906635803580218958206112297098327411035340897063717752690747310459184926298636024603487949254717361395603397645587051 Q = 10249092300045023519002601220673737919279626089680327379914024204585346713441242098019215182953625015242094757934588033693064852013617202932837905787954459 Msg = 56897071727374FF0001 Signature = 62078993638B876ED29AB7F0B8649D23EA17C96A1F595BC1F3CBD82E49A65EC58A502B4669B14C838CE9DF16C0931D797CAD9C7F03518DC48E7D0F7FFF383CADBED76AB47137CE134788E2A2F6A64B84C69036C26D767B58D54E1430CEF5F9462719491C57DF4EAFA6D1644C040B9D5F25EC794625D3FED8977FE3F4FD23F5F0 E = 65537 P = 11971544123366343666684354853406327812514675062345667572164032146593763260364820773415289066744017135855986720089591529330424839669640161061809626823413973 Q = 9720074001403023247443092491064384798772672002666476838855362128057218690708080905133082220041439945136451759042300373227795429236658029401312890694089287 Msg = 56897071727374FF0001 Signature = A1B330515B11D08A3B35FD60C48C07A524AC4230D7AE83FA8ED838590AEC2AE80C44D099D665C14BDF5984003C102555B82F6E65C68B304D22847E74C3676391E91BC7194742109237376448E72CCAEE1686E2F12A0D46E81DA7C1AC8E401835D19345ECDE4886F427A93B447916DE746D9988D5B0EB54C49F2F6647E77BDCA2 E = 65537 P = 1167421701870821515413433195830529422760643355648210574275955577563504995018282395144285922008056560280441363824762060206459194962811346217758801875469823173373950550783029605967491860108483744807232730730782621906868510926852332267 Q = 1317361364859314272965882511506015740905998703892518529440770677694975987162437790709368319674657443319522624967086315303391931706721950737251287996496863199426001799963290391769674180019130691453745657498922402120734449103407001553 Msg = 56897071727374FF0001 Signature = 99B2E121ED6D820EB555EBB5A6C2A928184EAE6D7AA0132E036414D5C2B041B7C0F44D9AF89556050CE96B077CD3C11165C0B55E5B5A345212E2A3A6DDA1E04391054C9EAD2397586254A0323DE007E6280780A9888B8BA698462C468B6D2FD345D8755898A1C82AC326D91602759166344D24590FD8D8D8C76F2AABBEFBCDE24B047178F610F5520862FA5F4D0C7CEE698C207E88B219A553DBE1C68D270BA2D4B1E3353E88BE249A3A1D4593153976B0A0E09AF561711600D616BF1BE8AD57 [EMSA4(SHA-1)] E = 0x010001 P = 0xE7E8942720A877517273A356053EA2A1BC0C94AA72D55C6E86296B2DFC967948C0A72CBCCCA7EACB35706E09A1DF55A1535BD9B3CC34160B3B6DCD3EDA8E6443 Q = 0xB69DCA1CF7D4D7EC81E75B90FCCA874ABCDE123FD2700180AA90479B6E48DE8D67ED24F9F19D85BA275874F542CD20DC723E6963364A1F9425452B269A6799FD Msg = CDC87DA223D786DF3B45E0BBBC721326D1EE2AF806CC315475CC6F0D9C66E1B62371D45CE2392E1AC92844C310102F156A0D8D52C1F4C40BA3AA65095786CB769757A6563BA958FED0BCC984E8B517A3D5F515B23B8A41E74AA867693F90DFB061A6E86DFAAEE64472C00E5F20945729CBEBE77F06CE78E08F4098FBA41F9D6193C0317E8B60D4B6084ACB42D29E3808A3BC372D85E331170FCBF7CC72D0B71C296648B3A4D10F416295D0807AA625CAB2744FD9EA8FD223C42537029828BD16BE02546F130FD2E33B936D2676E08AED1B73318B750A0167D0 Nonce = DEE959C7E06411361420FF80185ED57F3E6776AF Signature = 9074308FB598E9701B2294388E52F971FAAC2B60A5145AF185DF5287B5ED2887E57CE7FD44DC8634E407C8E0E4360BC226F3EC227F9D9E54638E8D31F5051215DF6EBB9C2F9579AA77598A38F914B5B9C1BD83C4E2F9F382A0D0AA3542FFEE65984A601BC69EB28DEB27DCA12C82C2D4C3F66CD500F1FF2B994D8A4E30CBB33C E = 65537 P = 12146034249554145542967338889878776764939246364802861330861080201238096926804104003153442046392435544402345620344102051987796266798293816215528466432287811 Q = 9564395117825677551724771409358234023229478264512493437902803500827457520617460086946869608799255872545145014212820989813822296572301340377134455614577149 Msg = 10AAE9A0AB0B595D0841207B700D48D75FAEDDE3B775CD6B4CC88AE06E4694EC74BA18F8520D4F5EA69CBBE7CC2BEBA43EFDC10215AC4EB32DC302A1F53DC6C4352267E7936CFEBF7C8D67035784A3909FA859C7B7B59B8E39C5C2349F1886B705A30267D402F7486AB4F58CAD5D69ADB17AB8CD0CE1CAF5025AF4AE24B1FB8794C6070CC09A51E2F9911311E3877D0044C71C57A993395008806B723AC38373D395481818528C1E7053739282053529510E935CD0FA77B8FA53CC2D474BD4FB3CC5C672D6FFDC90A00F9848712C4BCFE46C60573659B11E6457E861F0F604B6138D144F8CE4E2DA73 Nonce = A8AB69DD801F0074C2A1FC60649836C616D99681 Signature = 2A34F6125E1F6B0BF971E84FBD41C632BE8F2C2ACE7DE8B6926E31FF93E9AF987FBC06E51E9BE14F5198F91F3F953BD67DA60A9DF59764C3DC0FE08E1CBEF0B75F868D10AD3FBA749FEF59FB6DAC46A0D6E504369331586F58E4628F39AA278982543BC0EEB537DC61958019B394FB273F215858A0A01AC4D650B955C67F4C58 E = 65537 P = 10972281733721469524084771549551785620979339676894970406797556170887325088723362684594505739512627631033120507767556741232087880262332653543240135472549739 Q = 10414531519564479866584671841927244673773564454190580684485065625568372711876795366773126934682192430160377469095257414145433715697256731767977580401016623 Msg = 859EEF2FD78ACA00308BDC471193BF55BF9D78DB8F8A672B484634F3C9C26E6478AE10260FE0DD8C082E53A5293AF2173CD50C6D5D354FEBF78B26021C25C02712E78CD4694C9F469777E451E7F8E9E04CD3739C6BBFEDAE487FB55644E9CA74FF77A53CB729802F6ED4A5FFA8BA159890FC Nonce = E3B5D5D002C1BCE50C2B65EF88A188D83BCE7E61 Signature = 8DAA627D3DE7595D63056C7EC659E54406F10610128BAAE821C8B2A0F3936D54DC3BDCE46689F6B7951BB18E840542769718D5715D210D85EFBB596192032C42BE4C29972C856275EB6D5A45F05F51876FC6743DEDDD28CAEC9BB30EA99E02C3488269604FE497F74CCD7C7FCA1671897123CBD30DEF5D54A2B5536AD90A747E E = 65537 P = 12146034249554145542967338889878776764939246364802861330861080201238096926804104003153442046392435544402345620344102051987796266798293816215528466432287811 Q = 9564395117825677551724771409358234023229478264512493437902803500827457520617460086946869608799255872545145014212820989813822296572301340377134455614577149 Msg = BC656747FA9EAFB3F0 Nonce = 056F00985DE14D8EF5CEA9E82F8C27BEF720335E Signature = 4609793B23E9D09362DC21BB47DA0B4F3A7622649A47D464019B9AEAFE53359C178C91CD58BA6BCB78BE0346A7BC637F4B873D4BAB38EE661F199634C547A1AD8442E03DA015B136E543F7AB07C0C13E4225B8DE8CCE25D4F6EB8400F81F7E1833B7EE6E334D370964CA79FDB872B4D75223B5EEB08101591FB532D155A6DE87 E = 65537 P = 18750372315589011966809342966959173632224003368786599298500826640670402352786269961378825532226121920802585549877542477327157446102927320926731199343122897 Q = 17528931448707367061046762330636227103712357416213685486625350842223724624236877855492943799601867554957185739461234218879065971784361700089167655797702777 Msg = DABA032066263FAEDB659848115278A52C44FAA3A76F37515ED336321072C40A9D9B53BC05014078ADF520875146AAE70FF060226DCB7B1F1FC27E9360 Nonce = 57BF160BCB02BB1DC7280CF0458530B7D2832FF7 Signature = 014C5BA5338328CCC6E7A90BF1C0AB3FD606FF4796D3C12E4B639ED9136A5FEC6C16D8884BDD99CFDC521456B0742B736868CF90DE099ADB8D5FFD1DEFF39BA4007AB746CEFDB22D7DF0E225F54627DC65466131721B90AF445363A8358B9F607642F78FAB0AB0F43B7168D64BAE70D8827848D8EF1E421C5754DDF42C2589B5B3 E = 65537 P = 18750372315589011966809342966959173632224003368786599298500826640670402352786269961378825532226121920802585549877542477327157446102927320926731199343122897 Q = 17528931448707367061046762330636227103712357416213685486625350842223724624236877855492943799601867554957185739461234218879065971784361700089167655797702777 Msg = 52A1D96C8AC39E41E455809801B927A5B445C10D902A0DCD3850D22A66D2BB0703E67D5867114595AABF5A7AEB5A8F87034BBB30E13CFD4817A9BE76230023606D0286A3FAF8A4D22B728EC518079F9E64526E3A0CC7941AA338C437997C680CCAC67C66BFA1 Nonce = FCA862068BCE2246724B708A0519DA17E648688C Signature = 007F0030018F53CDC71F23D03659FDE54D4241F758A750B42F185F87578520C30742AFD84359B6E6E8D3ED959DC6FE486BEDC8E2CF001F63A7ABE16256A1B84DF0D249FC05D3194CE5F0912742DBBF80DD174F6C51F6BAD7F16CF3364EBA095A06267DC3793803AC7526AEBE0A475D38B8C2247AB51C4898DF7047DC6ADF52C6C4 E = 65537 P = 23317769080042579483979410069547334982340385988414999350195919737682803074318822163162336750705582344709097840085771328091505049180311156519568643721259091 Q = 22715354219792243654040150359134261097458516304943617682746546962551737776583314079844579168354161188665864193114840281840975337261953823680558154430944849 Msg = 594B37333BBB2C84524A87C1A01F75FCEC0E3256F108E38DCA36D70D0057 Nonce = F31AD6C8CF89DF78ED77FEACBCC2F8B0A8E4CFAA Signature = 0088B135FB1794B6B96C4A3E678197F8CAC52B64B2FE907D6F27DE761124964A99A01A882740ECFAED6C01A47464BB05182313C01338A8CD097214CD68CA103BD57D3BC9E816213E61D784F182467ABF8A01CF253E99A156EAA8E3E1F90E3C6E4E3AA2D83ED0345B89FAFC9C26077C14B6AC51454FA26E446E3A2F153B2B16797F E = 65537 P = 23317769080042579483979410069547334982340385988414999350195919737682803074318822163162336750705582344709097840085771328091505049180311156519568643721259091 Q = 22715354219792243654040150359134261097458516304943617682746546962551737776583314079844579168354161188665864193114840281840975337261953823680558154430944849 Msg = 8B769528884A0D1FFD090CF102993E796DADCFBDDD38E44FF6324CA451 Nonce = FCF9F0E1F199A3D1D0DA681C5B8606FC642939F7 Signature = 02A5F0A858A0864A4F65017A7D69454F3F973A2999839B7BBC48BF78641169179556F595FA41F6FF18E286C2783079BC0910EE9CC34F49BA681124F923DFA88F426141A368A5F5A930C628C2C3C200E18A7644721A0CBEC6DD3F6279BDE3E8F2BE5E2D4EE56F97E7CEAF33054BE7042BD91A63BB09F897BD41E81197DEE99B11AF E = 65537 P = 23317769080042579483979410069547334982340385988414999350195919737682803074318822163162336750705582344709097840085771328091505049180311156519568643721259091 Q = 22715354219792243654040150359134261097458516304943617682746546962551737776583314079844579168354161188665864193114840281840975337261953823680558154430944849 Msg = 1ABDBA489C5ADA2F995ED16F19D5A94D9E6EC34A8D84F84557D26E5EF9B02B22887E3F9A4B690AD1149209C20C61431F0C017C36C2657B35D7B07D3F5AD8708507A9C1B831DF835A56F831071814EA5D3D8D8F6ADE40CBA38B42DB7A2D3D7A29C8F0A79A7838CF58A9757FA2FE4C40DF9BAA193BFC6F92B123AD57B07ACE3E6AC068C9F106AFD9EEB03B4F37C25DBFBCFB3071F6F9771766D072F3BB070AF6605532973AE25051 Nonce = 986E7C43DBB671BD41B9A7F4B6AFC80E805F2423 Signature = 0244BCD1C8C16955736C803BE401272E18CB990811B14F72DB964124D5FA760649CBB57AFB8755DBB62BF51F466CF23A0A1607576E983D778FCEFFA92DF7548AEA8EA4ECAD2C29DD9F95BC07FE91ECF8BEE255BFE8762FD7690AA9BFA4FA0849EF728C2C42C4532364522DF2AB7F9F8A03B63F7A499175828668F5EF5A29E3802C E = 65537 P = 23317769080042579483979410069547334982340385988414999350195919737682803074318822163162336750705582344709097840085771328091505049180311156519568643721259091 Q = 22715354219792243654040150359134261097458516304943617682746546962551737776583314079844579168354161188665864193114840281840975337261953823680558154430944849 Msg = 8FB431F5EE792B6C2AC7DB53CC428655AEB32D03F4E889C5C25DE683C461B53ACF89F9F8D3AABDF6B9F0C2A1DE12E15B49EDB3919A652FE9491C25A7FCE1F722C2543608B69DC375EC Nonce = F8312D9C8EEA13EC0A4C7B98120C87509087C478 Signature = 0196F12A005B98129C8DF13C4CB16F8AA887D3C40D96DF3A88E7532EF39CD992F273ABC370BC1BE6F097CFEBBF0118FD9EF4B927155F3DF22B904D90702D1F7BA7A52BED8B8942F412CD7BD676C9D18E170391DCD345C06A730964B3F30BCCE0BB20BA106F9AB0EEB39CF8A6607F75C0347F0AF79F16AFA081D2C92D1EE6F836B8 E = 65537 P = 23317769080042579483979410069547334982340385988414999350195919737682803074318822163162336750705582344709097840085771328091505049180311156519568643721259091 Q = 22715354219792243654040150359134261097458516304943617682746546962551737776583314079844579168354161188665864193114840281840975337261953823680558154430944849 Msg = FEF4161DFAAF9C5295051DFC1FF3810C8C9EC2E866F7075422C8EC4216A9C4FF49427D483CAE10C8534A41B2FD15FEE06960EC6FB3F7A7E94A2F8A2E3E43DC4A40576C3097AC953B1DE86F0B4ED36D644F23AE14425529622464CA0CBF0B1741347238157FAB59E4DE5524096D62BAEC63AC64 Nonce = 50327EFEC6292F98019FC67A2A6638563E9B6E2D Signature = 021ECA3AB4892264EC22411A752D92221076D4E01C0E6F0DDE9AFD26BA5ACF6D739EF987545D16683E5674C9E70F1DE649D7E61D48D0CAEB4FB4D8B24FBA84A6E3108FEE7D0705973266AC524B4AD280F7AE17DC59D96D3351586B5A3BDB895D1E1F7820AC6135D8753480998382BA32B7349559608C38745290A85EF4E9F9BD83 E = 65537 P = 23317769080042579483979410069547334982340385988414999350195919737682803074318822163162336750705582344709097840085771328091505049180311156519568643721259091 Q = 22715354219792243654040150359134261097458516304943617682746546962551737776583314079844579168354161188665864193114840281840975337261953823680558154430944849 Msg = EFD237BB098A443AEEB2BF6C3F8C81B8C01B7FCB3FEB Nonce = B0DE3FC25B65F5AF96B1D5CC3B27D0C6053087B3 Signature = 012FAFEC862F56E9E92F60AB0C77824F4299A0CA734ED26E0644D5D222C7F0BDE03964F8E70A5CB65ED44E44D56AE0EDF1FF86CA032CC5DD4404DBB76AB854586C44EED8336D08D457CE6C03693B45C0F1EFEF93624B95B8EC169C616D20E5538EBC0B6737A6F82B4BC0570924FC6B35759A3348426279F8B3D7744E2D222426CE E = 65537 P = 34472526763890390288206268539308085903500826068946415175646574850209502483532716992653604714106737320646902682489253807427935226872727189953234681779534229 Q = 27599170874329569456630424115782013194441466052868928529420085446218294009948526736605009344913617322036736152527213282609802036063571741794421046662794161 Msg = 9FB03B827C8217D9 Nonce = ED7C98C95F30974FBE4FBDDCF0F28D6021C0E91D Signature = 0323D5B7BF20BA4539289AE452AE4297080FEFF4518423FF4811A817837E7D82F1836CDFAB54514FF0887BDDEEBF40BF99B047ABC3ECFA6A37A3EF00F4A0C4A88AAE0904B745C846C4107E8797723E8AC810D9E3D95DFA30FF4966F4D75D13768D20857F2B1406F264CFE75E27D7652F4B5ED3575F28A702F8C4ED9CF9B2D44948 E = 65537 P = 34472526763890390288206268539308085903500826068946415175646574850209502483532716992653604714106737320646902682489253807427935226872727189953234681779534229 Q = 27599170874329569456630424115782013194441466052868928529420085446218294009948526736605009344913617322036736152527213282609802036063571741794421046662794161 Msg = 0CA2AD77797ECE86DE5BF768750DDB5ED6A3116AD99BBD17EDF7F782F0DB1CD05B0F677468C5EA420DC116B10E80D110DE2B0461EA14A38BE68620392E7E893CB4EA9393FB886C20FF790642305BF302003892E54DF9F667509DC53920DF583F50A3DD61ABB6FAB75D600377E383E6ACA6710EEEA27156E06752C94CE25AE99FCBF8592DBE2D7E27453CB44DE07100EBB1A2A19811A478ADBEAB270F94E8FE369D90B3CA612F9F Nonce = 22D71D54363A4217AA55113F059B3384E3E57E44 Signature = 049D0185845A264D28FEB1E69EDAEC090609E8E46D93ABB38371CE51F4AA65A599BDAAA81D24FBA66A08A116CB644F3F1E653D95C89DB8BBD5DAAC2709C8984000178410A7C6AA8667DDC38C741F710EC8665AA9052BE929D4E3B16782C1662114C5414BB0353455C392FC28F3DB59054B5F365C49E1D156F876EE10CB4FD70598 E = 65537 P = 34472526763890390288206268539308085903500826068946415175646574850209502483532716992653604714106737320646902682489253807427935226872727189953234681779534229 Q = 27599170874329569456630424115782013194441466052868928529420085446218294009948526736605009344913617322036736152527213282609802036063571741794421046662794161 Msg = 288062AFC08FCDB7C5F8650B29837300461DD5676C17A20A3C8FB5148949E3F73D66B3AE82C7240E27C5B3EC4328EE7D6DDF6A6A0C9B5B15BCDA196A9D0C76B119D534D85ABD123962D583B76CE9D180BCE1CA Nonce = 4AF870FBC6516012CA916C70BA862AC7E8243617 Signature = 03FBC410A2CED59500FB99F9E2AF2781ADA74E13145624602782E2994813EEFCA0519ECD253B855FB626A90D771EAE028B0C47A199CBD9F8E3269734AF4163599090713A3FA910FA0960652721432B971036A7181A2BC0CAB43B0B598BC6217461D7DB305FF7E954C5B5BB231C39E791AF6BCFA76B147B081321F72641482A2AAD E = 65537 P = 34472526763890390288206268539308085903500826068946415175646574850209502483532716992653604714106737320646902682489253807427935226872727189953234681779534229 Q = 27599170874329569456630424115782013194441466052868928529420085446218294009948526736605009344913617322036736152527213282609802036063571741794421046662794161 Msg = 6F4F9AB9501199CEF55C6CF408FE7B36C557C49D420A4763D2463C8AD44B3CFC5BE2742C0E7D9B0F6608F08C7F47B693EE Nonce = 40D2E180FAE1EAC439C190B56C2C0E14DDF9A226 Signature = 0486644BC66BF75D28335A6179B10851F43F09BDED9FAC1AF33252BB9953BA4298CD6466B27539A70ADAA3F89B3DB3C74AB635D122F4EE7CE557A61E59B82FFB786630E5F9DB53C77D9A0C12FAB5958D4C2CE7DAA807CD89BA2CC7FCD02FF470CA67B229FCCE814C852C73CC93BEA35BE68459CE478E9D4655D121C8472F371D4F E = 65537 P = 34472526763890390288206268539308085903500826068946415175646574850209502483532716992653604714106737320646902682489253807427935226872727189953234681779534229 Q = 27599170874329569456630424115782013194441466052868928529420085446218294009948526736605009344913617322036736152527213282609802036063571741794421046662794161 Msg = E17D20385D501955823C3F666254C1D3DD36AD5168B8F18D286FDCF67A7DAD94097085FAB7ED86FE2142A28771717997EF1A7A08884EFC39356D76077AAF82459A7FAD45848875F2819B098937FE923BCC9DC442D72D754D812025090C9BC03DB3080C138DD63B355D0B4B85D6688AC19F4DE15084A0BA4E373B93EF4A555096691915DC23C00E954CDEB20A47CD55D16C3D8681D46ED7F2ED5EA42795BE17BAED25F0F4D113B3636ADDD585F16A8B5AEC0C8FA9C5F03CBF3B9B73 Nonce = 2497DC2B4615DFAE5A663D49FFD56BF7EFC11304 Signature = 022A80045353904CB30CBB542D7D4990421A6EEC16A8029A8422ADFD22D6AFF8C4CC0294AF110A0C067EC86A7D364134459BB1AE8FF836D5A8A2579840996B320B19F13A13FAD378D931A65625DAE2739F0C53670B35D9D3CBAC08E733E4EC2B83AF4B9196D63E7C4FF1DDEAE2A122791A125BFEA8DEB0DE8CCF1F4FFAF6E6FB0A E = 65537 P = 34472526763890390288206268539308085903500826068946415175646574850209502483532716992653604714106737320646902682489253807427935226872727189953234681779534229 Q = 27599170874329569456630424115782013194441466052868928529420085446218294009948526736605009344913617322036736152527213282609802036063571741794421046662794161 Msg = AFBC19D479249018FDF4E09F618726440495DE11DDEEE38872D775FCEA74A23896B5343C9C38D46AF0DBA224D047580CC60A65E9391CF9B59B36A860598D4E8216722F993B91CFAE87BC255AF89A6A199BCA4A391EADBC3A24903C0BD667368F6BE78E3FEABFB4FFD463122763740FFBBEFEAB9A25564BC5D1C24C93E422F75073E2AD72BF45B10DF00B52A147128E73FEE33FA3F0577D77F80FBC2DF1BED313290C12777F50 Nonce = A334DB6FAEBF11081A04F87C2D621CDEC7930B9B Signature = 00938DCB6D583046065F69C78DA7A1F1757066A7FA75125A9D2929F0B79A60B627B082F11F5B196F28EB9DAA6F21C05E5140F6AEF1737D2023075C05ECF04A028C686A2AB3E7D5A0664F295CE12995E890908B6AD21F0839EB65B70393A7B5AFD9871DE0CAA0CEDEC5B819626756209D13AB1E7BB9546A26FF37E9A51AF9FD562E E = 65537 P = 52947746764625581581348920222190760350826515129407851734553526076761620388920106361523893976287895417489630792692839842095214530982547020346909719722571583 Q = 44362841550817081081358795270317605045639904422908532427762156610780062654843896617689855009062394727899772229844572756933778128117714080394699975327483961 Msg = 30C7D557458B436DECFDC14D06CB7B96B06718C48D7DE57482A868AE7F065870A6216506D11B779323DFDF046CF5775129134B4D5689E4D9C0CE1E12D7D4B06CB5FC5820DECFA41BAF59BF257B32F025B7679B445B9499C92555145885992F1B76F84891EE4D3BE0F5150FD5901E3A4C8ED43FD36B61D022E65AD5008DBF33293C22BFBFD07321F0F1D5FA9FDF0014C2FCB0358AAD0E354B0D29 Nonce = 081B233B43567750BD6E78F396A88B9F6A445151 Signature = 0BA373F76E0921B70A8FBFE622F0BF77B28A3DB98E361051C3D7CB92AD0452915A4DE9C01722F6823EEB6ADF7E0CA8290F5DE3E549890AC2A3C5950AB217BA58590894952DE96F8DF111B2575215DA6C161590C745BE612476EE578ED384AB33E3ECE97481A252F5C79A98B5532AE00CDD62F2ECC0CD1BAEFE80D80B962193EC1D E = 65537 P = 52947746764625581581348920222190760350826515129407851734553526076761620388920106361523893976287895417489630792692839842095214530982547020346909719722571583 Q = 44362841550817081081358795270317605045639904422908532427762156610780062654843896617689855009062394727899772229844572756933778128117714080394699975327483961 Msg = 328C659E0A6437433CCEB73C14 Nonce = 9AEC4A7480D5BBC42920D7CA235DB674989C9AAC Signature = 0BC989853BC2EA86873271CE183A923AB65E8A53100E6DF5D87A24C4194EB797813EE2A187C097DD872D591DA60C568605DD7E742D5AF4E33B11678CCB63903204A3D080B0902C89ABA8868F009C0F1C0CB85810BBDD29121ABB8471FF2D39E49FD92D56C655C8E037AD18FAFBDC92C95863F7F61EA9EFA28FEA401369D19DAEA1 E = 65537 P = 66218349306984889499512380229028590914939577178499155486386600131076010558406347627863063671804559946177893962014452065585708095420741539901319996632905027 Q = 60538225181015072084609935128982168843796735821199260439826605002195709240782723691950431953163713417611480156811354608332166461443651611592637891780251227 Msg = 0F6195D04A6E6FC7E2C9600DBF840C39EA8D4D624FD53507016B0E26858A5E0AECD7ADA543AE5C0AB3A62599CBA0A54E6BF446E262F989978F9DDF5E9A41 Nonce = A87B8AED07D7B8E2DAF14DDCA4AC68C4D0AABFF8 Signature = 086DF6B500098C120F24FF8423F727D9C61A5C9007D3B6A31CE7CF8F3CBEC1A26BB20E2BD4A046793299E03E37A21B40194FB045F90B18BF20A47992CCD799CF9C059C299C0526854954AADE8A6AD9D97EC91A1145383F42468B231F4D72F23706D9853C3FA43CE8ACE8BFE7484987A1EC6A16C8DAF81F7C8BF42774707A9DF456 E = 65537 P = 66218349306984889499512380229028590914939577178499155486386600131076010558406347627863063671804559946177893962014452065585708095420741539901319996632905027 Q = 60538225181015072084609935128982168843796735821199260439826605002195709240782723691950431953163713417611480156811354608332166461443651611592637891780251227 Msg = 9906D89F97A9FDEDD3CCD824DB687326F30F00AA25A7FCA2AFCB3B0F86CD41E73F0E8FF7D2D83F59E28ED31A5A0D551523374DE22E4C7E8FF568B386EE3DC41163F10BF67BB006261C9082F9AF90BF1D9049A6B9FAE71C7F84FBE6E55F02789DE774F230F115026A4B4E96C55B04A95DA3AACBB2CECE8F81764A1F1C99515411087CF7D34AEDED0932C183 Nonce = FBBE059025B69B89FB14AE2289E7AAAFE60C0FCD Signature = 0A40A16E2FE2B38D1DF90546167CF9469C9E3C3681A3442B4B2C2F581DEB385CE99FC6188BB02A841D56E76D301891E24560550FCC2A26B55F4CCB26D837D350A154BCACA8392D98FA67959E9727B78CAD03269F56968FC56B68BD679926D83CC9CB215550645CCDA31C760FF35888943D2D8A1D351E81E5D07B86182E751081EF E = 65537 P = 106371131238996201552453980874610989946813024716722445842408152891368839125454489600942277239535313381924436744966779801576106830418690757378911573621372213 Q = 94283645475135667806671154963754310629766271954157398151751430322380692807932982647513603066143205717148426973447556747230175281773727249810950269829764423 Msg = 8D80D2D08DBD19C154DF3F14673A14BD03735231F24E86BF153D0E69E74CBFF7B1836E664DE83F680124370FC0F96C9B65C07A366B644C4AB3 Nonce = 0C09582266DF086310821BA7E18DF64DFEE6DE09 Signature = 10FD89768A60A67788ABB5856A787C8561F3EDCF9A83E898F7DC87AB8CCE79429B43E56906941A886194F137E591FE7C339555361FBBE1F24FEB2D4BCDB80601F3096BC9132DEEA60AE13082F44F9AD41CD628936A4D51176E42FC59CB76DB815CE5AB4DB99A104AAFEA68F5D330329EBF258D4EDE16064BD1D00393D5E1570EB8 E = 65537 P = 106371131238996201552453980874610989946813024716722445842408152891368839125454489600942277239535313381924436744966779801576106830418690757378911573621372213 Q = 94283645475135667806671154963754310629766271954157398151751430322380692807932982647513603066143205717148426973447556747230175281773727249810950269829764423 Msg = 45013CEBAFD960B255476A8E2598B9AA32EFBE6DC1F34F4A498D8CF5A2B4548D08C55D5F95F7BCC9619163056F2D58B52FA032 Nonce = 9D5AD8EB452134B65DC3A98B6A73B5F741609CD6 Signature = 07EB651D75F1B52BC263B2E198336E99FBEBC4F332049A922A10815607EE2D989DB3A4495B7DCCD38F58A211FB7E193171A3D891132437EBCA44F318B280509E52B5FA98FCCE8205D9697C8EE4B7FF59D4C59C79038A1970BD2A0D451ECDC5EF11D9979C9D35F8C70A6163717607890D586A7C6DC01C79F86A8F28E85235F8C2F1 E = 65537 P = 118724228726107084933673357665229442161382145102711792353890330967978435076443563173490456195787258321089074786404235270441682268529681386854189215962537691 Q = 111028334878452985473644527762523767795944882393420846192472211181507747267685923591727882840961887488829968428906720070723808587572733436074949968172511341 Msg = E2F96EAF0E05E7BA326ECCA0BA7FD2F7C02356F3CEDE9D0FAABF4FCC8E60A973E5595FD9EA08 Nonce = 435C098AA9909EB2377F1248B091B68987FF1838 Signature = 2707B9AD5115C58C94E932E8EC0A280F56339E44A1B58D4DDCFF2F312E5F34DCFE39E89C6A94DCEE86DBBDAE5B79BA4E0819A9E7BFD9D982E7EE6C86EE68396E8B3A14C9C8F34B178EB741F9D3F121109BF5C8172FADA2E768F9EA1433032C004A8AA07EB990000A48DC94C8BAC8AABE2B09B1AA46C0A2AA0E12F63FBBA775BA7E E = 65537 P = 118724228726107084933673357665229442161382145102711792353890330967978435076443563173490456195787258321089074786404235270441682268529681386854189215962537691 Q = 111028334878452985473644527762523767795944882393420846192472211181507747267685923591727882840961887488829968428906720070723808587572733436074949968172511341 Msg = 04DC251BE72E88E5723485B6383A637E2FEFE07660C519A560B8BC18BDEDB86EAE2364EA53BA9DCA6EB3D2E7D6B806AF42B3E87F291B4A8881D5BF572CC9A85E19C86ACB28F098F9DA0383C566D3C0F58CFD8F395DCF602E5CD40E8C7183F714996E2297EF Nonce = C558D7167CBB4508ADA042971E71B1377EEA4269 Signature = 33341BA3576A130A50E2A5CF8679224388D5693F5ACCC235AC95ADD68E5EB1EEC31666D0CA7A1CDA6F70A1AA762C05752A51950CDB8AF3C5379F18CFE6B5BC55A4648226A15E912EF19AD77ADEEA911D67CFEFD69BA43FA4119135FF642117BA985A7E0100325E9519F1CA6A9216BDA055B5785015291125E90DCD07A2CA9673EE E = 65537 P = 145944642495047970227466613734349629255343540073855558870352732098662102916564982961518190338528157149961995311060708307518356558394237017861854292310484074777485853223344178810064674444634051391215897807026231654615448012433580801389368805589940939055216467316156697831245282887397148877131331934832361698283 Q = 143469182311575243542235467792602778379077898970799610045213895234115725019110716139320906495130549004081072001994697570980663341363111500415373296270459390406877457540343121930968023110161112505144834271577932063953096651425939950070551736088707899288307639171777627365285498093078482948934950424689380891087 Msg = 883177E5126B9BE2D9A9680327D5370C6F26861F5820C43DA67A3AD609 Nonce = 04E215EE6FF934B9DA70D7730C8734ABFCECDE89 Signature = 82C2B160093B8AA3C0F7522B19F87354066C77847ABF2A9FCE542D0E84E920C5AFB49FFDFDACE16560EE94A1369601148EBAD7A0E151CF16331791A5727D05F21E74E7EB811440206935D744765A15E79F015CB66C532C87A6A05961C8BFAD741A9A6657022894393E7223739796C02A77455D0F555B0EC01DDF259B6207FD0FD57614CEF1A5573BAAFF4EC00069951659B85F24300A25160CA8522DC6E6727E57D019D7E63629B8FE5E89E25CC15BEB3A647577559299280B9B28F79B0409000BE25BBD96408BA3B43CC486184DD1C8E62553FA1AF4040F60663DE7F5E49C04388E257F1CE89C95DAB48A315D9B66B1B7628233876FF2385230D070D07E1666 E = 65537 P = 11058990257677106728567416105937186715085308710456375792601306502280098635988887667238717006290587419518077081684341390836911377742457083342432042777093021 Q = 10712237750299859497610123088820529960436796483371066064207052073837127000835751900010552681042454496236727480798341670362779502045338590274000339694476663 Msg = 454D5341342074657374206F66206C656164696E67203073 Nonce = 5C7F7F0932FC4FF8555C3875CE3A0F86BF5B744E Signature = 049C40560875766E164A89B2D19D91EF2AABAB4AC182657CAD93680319D8CDBE3CABCF3E87BF41C16013AC4E3D2DEBFB8F89E9E057012B8EDFD0310E24E2BBF43D54B2664DF3AC82D7E8913ABE29D0A022277EB74D2E0C8C5F4C3F46FABB35D932A4A713A82FC9464581D9B1F43A2AFB9AB8177DEE8C38CC9F15A7E8F3F9B4D3 E = 65537 P = 11058990257677106728567416105937186715085308710456375792601306502280098635988887667238717006290587419518077081684341390836911377742457083342432042777093021 Q = 10712237750299859497610123088820529960436796483371066064207052073837127000835751900010552681042454496236727480798341670362779502045338590274000339694476663 Msg = 454D5341342074657374206F66206C656164696E67203073 Nonce = B0E37FD9119056FBC17F9C726B0AE7829350F93D Signature = 82E54D1CD28D562D85DD3774636C65313CF26628076FC16A4D25AACCB566FCC877401BB44DFCB8ADBC6E595D515146D227E9AE6D4D585759F435642DFF2BB1EA3AC72E633C05FB3DC0D8E63395099D5A535DF6EA89341E36D73808D5116299EEC827BB2B6C3141AC0A5698DCDC252B7EDC3A5C24DE75287EEB60F45A37DFBEA3 E = 65537 P = 11058990257677106728567416105937186715085308710456375792601306502280098635988887667238717006290587419518077081684341390836911377742457083342432042777093021 Q = 10712237750299859497610123088820529960436796483371066064207052073837127000835751900010552681042454496236727480798341670362779502045338590274000339694476663 Msg = 454D5341342074657374206F66206C656164696E67203073 Nonce = E4AE5BB1DD6DF73F8F75E441DA531F0E493AC0A7 Signature = 8A64E30AEC76B278B08FF3BF61B7FF439DC2B0F6B789459F1386C0FBF24AF863EFC5A58C5E9CB841EA08D2E22E40293B1876BBB976947038AEEAA36B1751FF9713B9F7BD306D9360CC8D78B7A607F9CA7B4C18C308D85330E534337998D97D6F70F828D6AD1C9C7F6916476127993E4E6F7D596BA6C246F0EB7312A02D09BFB3 #ISO_9796-2 vectors taken from ISO/IEC 9796-2:2010 document [ISO_9796_DS2(RIPEMD-160)] E = 3 P = 13176640956344281513356976392849532512598068945161920056997631118946602896999615353776582205891131806103614584425872495163794790854278317730307910685772081 Q = 13358438383296401212212241736599969968896810298006662295507317025593488175806254771169730332279046987319731418872067829932261464845981989557960242434323009 Msg = FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210 Nonce = 436BCA9954EC376C96B79C95D4B82686F3494AD3 Signature = A4958BADDA6AB0F5E7F544BB1313DB93BB7336053678459A31386D3A9F0A477F37B853DF6BBBA87BECAC7CD2B19FFACD98B40E820B638D5F7DDAAE56FF198EF6AB1002C376C1FFDE03041201FF8E6AF94AFDF05606E10E32F3F6909134864AEBD983AAA2BD725FCCA288DECE27810D34807956DC78F3CFC4EA45A8DFADA4226C [ISO_9796_DS3(SHA-1,imp)] E = 3 P = 13176640956344281513356976392849532512598068945161920056997631118946602896999615353776582205891131806103614584425872495163794790854278317730307910685772081 Q = 13358438383296401212212241736599969968896810298006662295507317025593488175806254771169730332279046987319731418872067829932261464845981989557960242434323009 Msg = Signature = F9DD9F72FAB4AFFCED3B0538C5848B27756AC50CB2890F4CBC268D96C5E91EE88E3B058F2EF6585FEF5323CA4E2C308CC6140CF5F53579605B3BF0CC621082EB77F4A42D3567355EAA151FB4652BAFFE58A4B3107A064669FD4177C8D79F5DE5EEC562FFA2D0F5D9C409AEA0D5B9F8DF493AF2F18F91D828CE32C4CC35C13113 [ISO_9796_DS2(SHA-1,imp)] E = 3 P = 13176640956344281513356976392849532512598068945161920056997631118946602896999615353776582205891131806103614584425872495163794790854278317730307910685772081 Q = 13358438383296401212212241736599969968896810298006662295507317025593488175806254771169730332279046987319731418872067829932261464845981989557960242434323009 Msg = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F70716F707172707172737172737472737475737475767475767775767778767778797778797A78797A61797A61627A6162636162636462636465 Nonce = 4C95C1B87A1DE8ACC193C14CF3147FE9C6636078 Signature = 92ACA17F284261771E4A1313C05104838C3CC91C1CB6F576CF95090A5FDEA51E3C189F65E6BA3F284268B4FF2363B3B912D023A91C96541AC1F9E60E58F6B3DA8DEB1B6941792AA6341DB18488366A5E1E18DBBAE4A2E39077A2B4FE1DFB34A2CCAD1812C4AFFAF55570855AAEB685DA2E1F124FF70F529FED02F515BFD572AE [ISO_9796_DS3(SHA-1,exp)] E = 3 P = 13176640956344281513356976392849532512598068945161920056997631118946602896999615353776582205891131806103614584425872495163794790854278317730307910685772081 Q = 13358438383296401212212241736599969968896810298006662295507317025593488175806254771169730332279046987319731418872067829932261464845981989557960242434323009 Msg = FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98 Signature = 30147ECB074705DDF33EF765D0EE1017D5535AB39A7727C4D8D4DC4242C693BD1FB544ECAE2323D1185BED05C8AA5F699D3AAED41FC3ECF9DF297A6156D6BC865196A619806E3FDFF8A8416D2984EF9E339400134A6D17122FCF0946783AEBD46F11397E66863E7428F4542DE2AE8A307355633F380F937B308C149F14194487 botan-2.4.0/src/tests/data/pubkey/rsa_verify.vec000066400000000000000000004761351322470703100216500ustar00rootroot00000000000000 E = 65537 N = 21294014927258304131040781115311862039488366453689673368700944513219763245673890697163631224238156125681871046912423252139958373673494842188327924075935021260823595479029869879301695218333300648958044759453090135302355875509854237140262345417466491045027237599382640606853811387812108430679944770972979218579912175629350561572866081828240542091504962510426591897021132609200583624897090266070827112815075415286361167712707065872906100580924648432056365602321172274687165761180171037735321703513069879499292378605702720368464285730865976993373285171622065557888622229864086839106896951917341016022559721964253271897757 Msg = 0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0068656C6C6F20776F726C64 Signature = A88A260DF63E7241BFB42C05F50B5FF470CEB7B4E47353C94C0EBF620309841FCD84FFA08B164411CA9D2066FA02D8223AC19250212409E241446C22C9B85B2338E6C8545E722427FB6798EAD8488106B01F15EE3E8574C85DCCFD407FAAD4F705D397551E4BF32CE484DE76514DBF805B5361CB3B1B221FE3AD12734E8542D4B4D53962D0B0A80B11DC789EC08B050F28CB75363B8BD1F545839953271DB7340C749C3B979C0A11C46E9D590446C8D3B75907B3F0B3F164A8F72D302B383B2BD1248E9D86EAEBEBCB0623FAEA616CDE51CFFE5BE3D0BF140F053B05B6A17B6A4F7B733F0042DC9AF4EA737031DB170EB5F691859B5EDA13C82B8EE69D7B2732 Padding = EMSA4(SHA-1) E = 65537 N = 119893703092484949505910087939224352570887943368162884254100835299677466992252964282958222122904137439852217811402556822825785524431976342366635228201325453615333815480375932228941159089934430428976301906105572009268593836870380845342944983495040828580470076501247572469467215357554733094411503190958365925843 Msg = B841D0374D3C86E67B67BDF00B Signature = 1060A74E3EF067A9B17754500B16B8C9F6B3B453FB290C71FCAE779DD37A6B9A24A45D1560DF5E4BC31143E6197AB15684236D8FE578E022495897F70451FD902BFA5703947EDFF0B63BF1140C63AE1C8D369A87B192E8BF6A3D486E909C3979703806010367CA0E0026F8920EA766B7E3759E23954D0EC2F746E6046FC14758 Padding = EMSA4(SHA-1) E = 65537 N = 119893703092484949505910087939224352570887943368162884254100835299677466992252964282958222122904137439852217811402556822825785524431976342366635228201325453615333815480375932228941159089934430428976301906105572009268593836870380845342944983495040828580470076501247572469467215357554733094411503190958365925843 Msg = 0F1D14F9 Signature = 7D4F2EE63FF4B46A09EBB8F9E2F58B4634234B890F7270FDF3454CD2EEAF1BACAC3516BB5D0F678365E5226034032D6AD49069ED9C7B8BE471BFC6D9BBE3327CBA545675212A5552948524E52567FCE84D9D211191AAB864153C08DFC7576703C21FB9315578A0F1C167FF4D2B810578DC98FBC1235A4CD62ED89BD092C31C00 Padding = EMSA4(SHA-1) E = 65537 N = 117873507567337895619658208679670925101378539654498066355113315112059799053003859776302497045938816878795017034893432557427285474379889211548804214301617169867599046479911599286664540733604522194941039104579220235811693184040720386906708801580081293183820229901159859136387878000483153929553556411647637914977 Msg = AEAD5A03023E17D894226CB2C7C77D5D4341E8BF7F1453140D58B427B40B0B18A9 Signature = 27ABB6E27D9DBA0F9E5DB3607BF04E20112150A779EAF67D4AA76D50A6060F7003BB33BE5A580789E567C3768AF938BDBADE712F7344B72655118636095EA8D697888B9382BF3030D56A685079980A992A9BED3AF0DC81AE4316AF31681A3BDD78CC4E83FD3C227A9984C261ADF36D201AA417243A28BA47488BD81CB1DA63A4 Padding = EMSA4(SHA-1) E = 65537 N = 119893703092484949505910087939224352570887943368162884254100835299677466992252964282958222122904137439852217811402556822825785524431976342366635228201325453615333815480375932228941159089934430428976301906105572009268593836870380845342944983495040828580470076501247572469467215357554733094411503190958365925843 Msg = 6A4BAEE539612920ECB3075EF6C31BD7EEA01F43 Signature = 36F7211C290577ED0CF54007551BA65943C388BF2AE58F12E8BF7B6E7339348F2534E7515232D0AD72AD8F6EA173FA3D21DE13D392DE10C457DDA7C569AAAE170C8806A3ACA457461EFBAA7EC870947ABE2D5A91821B9254EA34A74E95E7648ED98A7ACD2300D4FC88C8B968E0AE68DF9BFF849E53AF03A2E12965C1453AAFC4 Padding = EMSA4(SHA-1) E = 65537 N = 142827179040201930130129453963840750538620744427112921609232633077545705669555537375335626346255551646557899683797424190277107859970432546267654200388915589143829977650215992006588223561006749124827885807954027706624977201425591213477691544644089252839017126048324124185680925726240972874426438277384617501237 Msg = 0F50 Signature = 707E1B680D4D7E2CD102ED7AF2B63AE63CAD9266476418F330FB739FD052A7774A0182624E81C3AD14C12BA5BA1D99315217D84EA1FAABF4A90E7CFF1987535146D4944AE27E2C84F313E5E5A22C5B86A88333DBBC4D17425F180C6B0F4BFD3E9F03DE21B422EC125DA6FF2835A93CEBED8C1283568E04BB634CAC410D144B91 Padding = EMSA4(SHA-1) E = 65537 N = 117873507567337895619658208679670925101378539654498066355113315112059799053003859776302497045938816878795017034893432557427285474379889211548804214301617169867599046479911599286664540733604522194941039104579220235811693184040720386906708801580081293183820229901159859136387878000483153929553556411647637914977 Msg = 5C3DB99915C8F7EEACB045ECBB7C35C06D4ED5A96AA9025A49093B70D7C2EDD485930D18DEB57C0282563F2B07FBA63245FDC773CF851985475DFB4F6FA335BE1B4C2C28A294E84E50172AA585B382BE1E1038FBD02F2BD37691D85A18346AD04CC81948698FF248CFAF33E222EA8B5FCAEC0E5AA8F753521EC47BCB756E05CF95E4365E06A69BB6C99A34A62939B478AC1209FFACC49BA4027749801D4A9F583395B34340 Signature = 9705B191BE8BD52D3E6CA1743DACDA5EDC1C7665B6EBC769A5983BB74D2F52C79F94954DC8CAB9A44FB3B387A0FF2843311CDA640DC39BA975518B511DF87064B17709804D707DA08A315F14D24CF6385310A62D7F6C47689B66C4A12F449FC95796F1821EA6838DE2941D0725B55EC860CB553B36878C2BA3994DCD0A8992FF Padding = EMSA4(SHA-1) E = 65537 N = 142827179040201930130129453963840750538620744427112921609232633077545705669555537375335626346255551646557899683797424190277107859970432546267654200388915589143829977650215992006588223561006749124827885807954027706624977201425591213477691544644089252839017126048324124185680925726240972874426438277384617501237 Msg = F1FE75913B7A152626C287B1287B6ED4A04EB546950C0414B2D7AAF82DF8F255E08E20A2CACD2399C4304FD9F77B9CF8B2A244C15ABC25DCFE1B144F2B125AF791B05877E11BEAF3ECC75FC9 Signature = 87337D2D71F36C4452216459D55586634D755C84D9D8F80D058E029A1CB61A6D4819E3993B623AF90FF915AC585AE6088DF7565A2A205D6282252EA0863A7F12F07A06189F2E2C4EC6B27EBDF3955ADC7C85B803C612D44B9EA5D5FC0B7F15D8AC704D83DEC3D8F84808C2AA5F984FD06D1456B4EF875C33A7346051514DCECC Padding = EMSA4(SHA-1) E = 65537 N = 142827179040201930130129453963840750538620744427112921609232633077545705669555537375335626346255551646557899683797424190277107859970432546267654200388915589143829977650215992006588223561006749124827885807954027706624977201425591213477691544644089252839017126048324124185680925726240972874426438277384617501237 Msg = 04F7B2C9BEEE7F00FD42C651A3492E6F61816AB3B0903477CFB49B2DDE8AB64D898019C6C937FE653A92C1BD992A3304F357 Signature = 14949A71A7AF9EC4364DDF90E5A7C4283F8FEF7DD3A544FFA4B1BCEC5FEA6C214FE7C9105393E72D308CA0994F6F900479219439B8FDC850E15404C024AB757BF7DDF35B0CEC668AEAAAB5039EC81F739C160DD57B26ACDECE905F608AB0396F9DE8F99A53F765D37FB625C8E90C68B4E5B32AEF48C0FDA39B7314FCE942A9E9 Padding = EMSA4(SHA-1) E = 65537 N = 117873507567337895619658208679670925101378539654498066355113315112059799053003859776302497045938816878795017034893432557427285474379889211548804214301617169867599046479911599286664540733604522194941039104579220235811693184040720386906708801580081293183820229901159859136387878000483153929553556411647637914977 Msg = 71D2C0843ACA68C291953E66 Signature = 4C22BC81446B062A561D9A922E959036E7763B0803DD84168C48AC51DBE79A129D017E22BF9DA19996C09BE7369C4F0808ACC2E708DFF48AA2AD41EF78F5F97B914FFE079BE9F9D30E67049BA28BEE714FE622A18A3524FC7E58ED7C451714F14718F4475814B6D9A6590845D9CF6FEA2DCD313CFD580B47D5BEF6960CB0E463 Padding = EMSA4(SHA-1) E = 65537 N = 118325216784138576928663205991913551509467682454344354700845118251718322925715329792999462630555914469943870869734614072789281058584985975285521715988924664768201330923551590045084966763856526589357351321070058281808367878672484954643315491816159591677428680677150214756146555087873428967903226383610237192289 Msg = 9D5116B54CBA7970742B66BE6924D122A1D7E570F037DA06B29A2B34175C8F9428D1E8E908EF492892AFD6B08019EED0123F32B74D04324DDB98171ADE66347C1FFB56BD1B05E1CECE2ADD838BD95CDEB74E36A51B69F2602322593462182437AF357BB63EF748F45CDDB66BE5357E9701C8B21C6613857432CB99C91CDFCB7254D087B361CCF05E77AF961F023E83416D9FF539A572A5C89117FE1506AF66335321A0CB7BF096DA0590D2E79FA60DD7A38B9DF2D352673F5A31A873111E3C8D Signature = A73BC3BD89ADF92FF2B8EE3B5430849301C322074696BD58FCA3D0C113BC9CD79D6D822FCE31ABF1C276C1272D045E5FD92BAE9FBC07EE54742D3342A2B03E8547B1DC94E86C5D08A13708780952498CE3EF3B07710E5777683C9630821248A9D38BEC8AB7C77DF1CA6E695F0289443C13A8A4834D97CE6DCBB6782A70F866B1 Padding = EMSA4(SHA-1) E = 65537 N = 117873507567337895619658208679670925101378539654498066355113315112059799053003859776302497045938816878795017034893432557427285474379889211548804214301617169867599046479911599286664540733604522194941039104579220235811693184040720386906708801580081293183820229901159859136387878000483153929553556411647637914977 Msg = 75352B85B47E73B18E8CD9608354ACCA4DF8E2B73313C681A8119D6578CAF8F9A52EB4710B97D334D2CD49C365BC0E0BB89D63CEBE3EC62055E7948C9DF696B406EAB60881B0371F5AE092D0A43ED9AD307D026B2CB6477AF5ACC32919D470C39C9BAA71B0FA78F8687BF762C399407BB39C59727AF3B61DF3EA486E473D4CC8D67805E8810F Signature = 7F51B49FA57C4EC7AC72A90C9EBB51F6E21E3B6EE67E6DE32119AC9FCF97FB1909F74491CDE182ECBED994B66EEC44AC817A8F620444BB6520A3A223BE4AFA78B50F11C057FA4F4835D55283157F5C8AE60A2A46D0CB9D4BE3411FD3505F0FAC5202ED1C0629575B59001488B30E9F12E738F2B388C7EF8A82684CBA43115010 Padding = EMSA4(SHA-1) E = 65537 N = 117873507567337895619658208679670925101378539654498066355113315112059799053003859776302497045938816878795017034893432557427285474379889211548804214301617169867599046479911599286664540733604522194941039104579220235811693184040720386906708801580081293183820229901159859136387878000483153929553556411647637914977 Msg = DA40B3B401DEED4DBCC3848CC729C8B5FD169A140914C40FEB752E2D3F2F7EFAA97CE26BABE4099BDBBAA522BB09DB37A1D06CB53A3BF7D621 Signature = 328E325D4F95D0013019B97F5936EBB347F1E5B01A559560518C1C47DC04434392BD2168DA08668E4EEA9A06A5CED7C9076BF7CAC667503FE6B7903953958BABB31EE9B29E356274F7136F35F5224A1BF50F3663D002B6220C3EA8572C1368D11D3C6DD6E1F3D700811257EF8B46246C2A6A975C08DEA782003F5CD45703FD22 Padding = EMSA4(SHA-1) E = 65537 N = 119893703092484949505910087939224352570887943368162884254100835299677466992252964282958222122904137439852217811402556822825785524431976342366635228201325453615333815480375932228941159089934430428976301906105572009268593836870380845342944983495040828580470076501247572469467215357554733094411503190958365925843 Msg = 1C79CF64CCAA6C913ABAA5A555558BC251 Signature = 0C9485139F787BB6EFBF23783CEC74A53DFF16937FA6E76BF120D15ACF87D8480B7EACED7B44ACD2A87C92A3F5AB185B81664AE248C7557C2766656C05A5D206DD110E0E97F4F63364BB396F8431ECA2352FF84B4DB5F54FFAB155768624489FD6E7C40282D1F9D85674D21E01571FD24423461F3D04D9595C43BFEB8EC586E3 Padding = EMSA4(SHA-1) E = 65537 N = 117873507567337895619658208679670925101378539654498066355113315112059799053003859776302497045938816878795017034893432557427285474379889211548804214301617169867599046479911599286664540733604522194941039104579220235811693184040720386906708801580081293183820229901159859136387878000483153929553556411647637914977 Msg = 3096922A62DABF6B98A4480D2F86629D1992FFE1545869DCE5E69F810EB793C5ABFFAEE2EEB846644C8BE8E31942BA16FE51B7988F355999CFFBA28CFB9DDB1B5F4919790B7E63E37F00289C6CD42F56F7520A2DDA73AEA4BCB2D10053AB9720B201D52AAE450BF22AF2C4E3AC Signature = 43F583905ED6D2D53045C60E472FC1FED12EBD88C190EE810F9576E262F3881FBF006211DD5943A48BAC7FF21C4317BC28E4968C98FF6E0F94C055FB104555C1E7B533F9DDC49D200CAA8C2F62C5EDC6A9E9E76290DDEBF38BAEC88EEF8B32B3DE804FF19627C04B13261CE2EF2101619CA1D6BDF3C5C7DEDCF21E18726081CE Padding = EMSA4(SHA-224) E = 65537 N = 1119428424680318589795586141715055386037310539168633265412442840203765459121933347087296271503409502653361538704886463270098037299029844742790141591500136266254978458765667228024346681193517777869473504834168226149066540740737368233 Msg = 7072696F6E636F7270 Signature = B7530DA7632263B5AA4B0DC9FCBC3BCDF8B44EE2B4BECFD90BDEC108F50EBE325BE6F4EC8900BA1C345F2B6F59FB625C3D99BC6F04D99704144B05C2ACDD61927D3EBD886650E933774DF72EED0A5A3AA2810C17B56F877D989AF3A469950D0B Padding = EMSA4(SHA-224) E = 65537 N = 142174165576626153607372698256305864594569560870673901094361474985698454475214485624030333494656951630915262404286478231307463911538888475540467821962421907280313609332673779512118006700905686743737304610222644814866475509553933039345450808232667589081836829812676481228393243702748665205665654871209739761413 Msg = 7072696F6E636F7270 Signature = B4816EA318CD92A64FBCF77C4E42E283534B2C500652DF6D88FF24130EB5C84350E9F52E4822BF60D7C4AE4FA11C811A7A0B4DF93C0215BC9B3D04337BC044E1994959D67E0E33121C9CDE1C50699B6C00966160F51C606334E15EBF60FBB8C76EFBBBA51460C75D30DE0F47863A1020885F5A4DF8AAA397C03AA409833380B1 Padding = EMSA4(SHA-224) E = 65537 N = 164630263456117000015160044780495067044400405934160102582785618595264737952704698446678826348962937504290398007242147250281882539141663012582798644838997102553201425043459343724571036706353816116380999797810738720665186291265346946839405585633428066468495857110767903684090495610399584127282529381812835202843 Msg = 7072696F6E636F7270 Signature = 4FAF0FB7EEBB26B9BA778D092B42CEECBBA36B4DBBBE35C6B383439F23F2062642CB3D091BA77C4E1C46280E85C8C40A24FCEF5CDC9F4E383A54B19BB3BCD8B5DC28070CD5FFCA1525F6A655CE672EF96438F375E6483ACEB338180B24FAD3E4F67B58E246D0BCE09DFEDF5249F30517DA52FDE9340EE69B1B1316B81C2E2E1E Padding = EMSA4(SHA-224) E = 65537 N = 2355338321894907982973449118532423046219855162684189584952364211024673239817984981221497833678417989141255985955373046108907439361208943134690142558869693319622720590693426934116543610706035829016468114721654712491555448755290947614168151367749236215414971936091383086872819572125926710274100720750822329346281157144216251301323577911043671958085809035421923499439374332063412011968019314606534545270261694061177194156135267601999819371566580234100693210082572199 Msg = 7072696F6E636F7270 Signature = EB6106EBBC6F7F29B503E7AED4CF9FD01F75F2C11433DE73188AC19A9A41D59F995107AD9F8B657B0718226245A4C149E352BF5D129F53971E30A4DE702876528EA67A8EBFD096396B7229BA9D6DA710DB37613F5FB1F3993B391741CE8E11EE0C324E3F33CFBEB78DB0F270B0C0CC7D3497F8594EC262D88EF9E03EBFD9E26ECE0921006C521A4B1B41D75BD79B5534B183893A18FE183DCCD1506B22E0E7FEF53E56B74870B62EDD262AA45F3FA9CBFC18045A549D5E202D2D20E08322799D Padding = EMSA4(SHA-256) E = 65537 N = 959053819830657172479959445338239092546325203345907250825111845392833871445800392409753005065793320051134954211866734053526672830216705155840103275419514948544834171669678800877679307554229024265360880082897478182110972147307503999 Msg = 7072696F6E636F7270 Signature = 73F68238B7F19889120893C903258DBE620171982CAD9D155892CDEFECB3C153224D8A94BFD13B4691A4D51175756186AE4F689B6A1A1432EA255C0E8DD844E9C055397090C110C632EB6E24BA5ACA380239D399BF010E1451293DB948D4274C Padding = EMSA4(SHA-256) E = 65537 N = 137126460274256653495503845615308970580703338943888033622233416638897981837645329990830646815644138206816666356100904616855829630528272075841659577079660881561538319561195872899967484040091088853712853721738321400822852813349942750220659315350946835604178720157749806025740852968661234681914747446252028384687 Msg = 7072696F6E636F7270 Signature = 3CFA8F2D410D5BE87DA2B644BD6615CE3588C7E4B261F05C18673F24CB570355A7F5D41BBF62F859BC0CDD5300CCA3DBF2B2AF13DDF455DD6D919811836B22BD4280EFAD24DF30EA185D7357C89599CF0C08A22F4D03162295379E842215DEBEA0DA0AE985F355AF392DD0F9F8A6A1F2827AF781630C5D2A2B917C5544B3206C Padding = EMSA4(SHA-256) E = 65537 N = 126006263967583916685699969820130107481805287310155583856753083161341066900427337638894279209853492976803801580045932978846612143886893466294502409849740589461924621064167764049479934551356205760630996888983236964271640321672661343631339668444656679188756786625965068033966005693955734364699441283621584593211 Msg = 7072696F6E636F7270 Signature = 417D26DAAC12A39FEDA2C17EA2ED932AF9544DA11E6BB84B0E9D4758A57FBD9878457171DE72B888EF7AF40183EE7FDF81044512232D7199C11CF52A53CDE62022352EA747292FB3187EE51B2A17E9AF8DABA658DB6C4A5E4F07A5CF2E9203295E59B1916F526C1EF8F84F72CBA70065EFF5D4BA0467CB77165BAC3ACE21462D Padding = EMSA4(SHA-256) E = 65537 N = 1535994647682156830025146305682101430588289375419325461493523175508757972443324873545542328575190898826304246979581796262102498557618669521756543193269936823644479735896765838890964884124308327752058628049476464897754887083569303596310112393952040793116800877055887644586747764213582584023175952242678031352275706621766526669304089776603910618106590459512947849911677482670963369198089945159909074168533868121597987806983779179387965117313926634389182597522052737 Msg = 7072696F6E636F7270 Signature = 7BBB18C1CA207CE639E323DF26B14475CD407995EC612F6D53ECEE977D4400E4BFC198ADF8B40BFE27363241A1F9541F01677AAD98F87E93998935146A8F77E7FFBD3DE59A2E22E5766409733F06EA2993620A27122B71C4D9DE755E70C703B4EC6AF5F314E0F720B656FDA93E2B3EE9A1688D711174E0D72D0D486DE36DCE1F9DA031EA46FBD6156B1E7A65A25B42696C9ACCD453D8E467313DA76F70DB225D3C44E133E65E8BCC177D065F53BB81AF13076AB0695AD2205040CD9B4DF851FD Padding = EMSA4(RIPEMD-160) E = 65537 N = 1135212553663584107314884133903187560403335585911952823156526296864447161004392018898893032642166251226831665007577277923094954883708599671228168609227001559862376751252578968570215347155172780962891797718925202798410837303642875271 Msg = 7072696F6E636F7270 Signature = B24136372B7716310F83846719F61CB4F86B11855BE752E85AE6DE9CAAD99746693B255666DFEB8C4A709C93A9DD1B2A08A9BE75831DA000AFA7D6230212C40F0DA59AB8B6291D1CC1DBA24D86D92FC318F764E905E0BE2CCE73E074498A7DC6 Padding = EMSA4(RIPEMD-160) E = 65537 N = 94613803059245341252497110282782662925799518731465926298638967391150899050152239186296389621503521594231856243228621541185833920341908796798487566480908668936175536078268049764050980212141375485417177323511561382225676330608341652891466096188553609446126690072281497793677143342992312930024319534872689932413 Msg = 7072696F6E636F7270 Signature = 0795B1835ED3412E4EF2DA7DF692D04E959D5204331C6CA3D978F48F319A79B3A1A51CB584E56B0572853527B1C2F99CA3390C91E006466AAD7628A0FA48887397A865F864D6921575CCF186D3FA569EAF9137EB626A9FB920466FC042AE9B6FB6B8D7EEB4F8193E7DC175B9093FA3E49FBE4D6D472F3F38289A755933234C46 Padding = EMSA4(RIPEMD-160) E = 65537 N = 166491552086320183954109117201818925417708116521858997163635089758714667741158710546579775119315514403338381116959375892471167456748571789122139698283057392753591412506812322815960183332817324693008323699161200640504727783703125815414659382732082432311164083612050255705351127025931627573927283095843563154197 Msg = 7072696F6E636F7270 Signature = 375AC6A2B3CC508CDE09109C1FA52980098EA989C2021CC19D74097A7D67B07F599F3FA0C65B02BDA6FCCBA9219D33A1F07219B616C30B1D455311726FE2470F63B86A02DE283391272D85B77C6D834ACE4246B692E1B4B512D5E72F3192142E765E38553CD3FCA435D129C7543F777997D8715A2CBE2B15A5659CDC67DA72F5 Padding = EMSA4(RIPEMD-160) E = 65537 N = 1701550760793421862543562289931026945394881781447262972888516885584876436247030582756068401883540332824266791335242161375224480335226475621762011038836557438486994223355586125107160686772929148665772020114806515137374005081042904112745447320291689531965352389072090097529696081399233391439242320144394058920893342027979668204812408099791474966507368371676137037366817304246182026179444421945259005812216012619671229384439063712942602208902904719453381421672196363 Msg = 7072696F6E636F7270 Signature = 32631E346368C620BAF6FA5475F04B56FB60BA5CA67D1E3E22805ED5910ECEE71777FE19827983151E88AA1F9E57E96FDC536CE2F927AA3B34A94441E72FB498A649864488D976A0A4AB7B6490451A4F4712A3AF3587579A791CF8CB18EA4AD388B5C34F6BF54E9CB0F4AC5EA21EA2AA42A2266EA755D5EFFC02FD41C583E1CBDA53C1821BB79FB392D68A4524B0F65EBB64FF6656C52BF54D5774DF2D916C9B793E206E0D5351D7B4D18DE3CA4CCFA8F7A3ABFB36048C9297F7512B3FDA70F7 #ISO-9796-2 vectors taken from Bouncy Castle Padding = ISO_9796_DS2(RIPEMD-160,imp) E = 17 N = 125242242467304226980818040029626771449089399969616333381049941622953718673240322529328207020354780888067722576207206966012991943446137640922660671107037754599453565985942582513009492907982173446675216454634592761000191710251638590123948630732326307922952494464857505415177402322499891218582307842351942219477 Msg = Signature = 8df6d3e7d4381ee36ec8ec7c1067db3b28da9e06a31b16ebb30c004dcd7a7904a799445d57b4fe90fb697b1e747c38436edaf64584b61dd1c4ced18f4098a0cf0a50953daf56e18284f42826e00e8bd009003e475904da186acfe79c578af3b093a32d0f8ae8ec46853e803ec2b6cf09d8066d3d84e2862853b8a6d9ec66b9ec Padding = ISO_9796_DS3(SHA-1,exp) E = 17 N = 125242242467304226980818040029626771449089399969616333381049941622953718673240322529328207020354780888067722576207206966012991943446137640922660671107037754599453565985942582513009492907982173446675216454634592761000191710251638590123948630732326307922952494464857505415177402322499891218582307842351942219477 Msg = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F70716F70717270717273 Signature = 2486dd61e560e661511db92f41045a87cbbb78ce577d28da533bc15fdf9cbc2748311a5faa6501270b46414ba3549de34160c1ef18eff339eeeae2c53f7ed4a5fddc19c5b3f5c391e8efb5548555d478f0698ec351f6a4974c9c74f0a0eba9fc03db9253f41f02ffc5f03cb9d1973946993aa3f831aa1d9e73a783e67bf7695d Padding = ISO_9796_DS2(RIPEMD-160,exp) E = 17 N = 125242242467304226980818040029626771449089399969616333381049941622953718673240322529328207020354780888067722576207206966012991943446137640922660671107037754599453565985942582513009492907982173446675216454634592761000191710251638590123948630732326307922952494464857505415177402322499891218582307842351942219477 Msg = FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA98 Signature = 3d853e02ccea35ac803227458aaf5c964387e20390a476419e853ed415b3ad2ad750d19b4e4667597c1863ea2b0aa35fdbb4de589c4663583674e2c8d15d07daa54ff389ae96d78cceb2b5a50b649362357042b2c40d780361b7f6f089c7e27e92d21db1b3e3d368582e3dfdcf0312f727743c09c5c2cb3c0552b78db71be278 Padding = ISO_9796_DS3(RIPEMD-160,imp) E = 17 N = 125242242467304226980818040029626771449089399969616333381049941622953718673240322529328207020354780888067722576207206966012991943446137640922660671107037754599453565985942582513009492907982173446675216454634592761000191710251638590123948630732326307922952494464857505415177402322499891218582307842351942219477 Msg = 6162636462636465636465666465666765666768666768696768696A68696A6B696A6B6C6A6B6C6D6B6C6D6E6C6D6E6F6D6E6F706E6F70716F707172707172737172737472737475737475767475767775767778767778797778797A78797A61797A61627A6162636162636462636465 Signature = 5cf8d66c115143929ce7b568c14fef2faf5fad18b19d94b128be1f49dcc2168d51777fc23e448f84b0253b99fe735f2102314533b754b1ebf08a29085e9392fb6f4550be8948e7b9a55060b74a87d57aa6d82475176d2f7776d873afc4349cdf207a90304469f6256d83274bb698c6dabe9b209b8e6100f14d1ce290eaca175b # The 'valid' case from Wycheproof RSA signature tests Padding = EMSA_PKCS1(SHA-256) E = 65537 N = 0xAB9014DC47D44B6D260FC1FEF9AB022042FD9566E9D7B60C54100CB6E1D4EDC98590467D0502C17FCE69D00AC5EFB40B2CB167D8A44AB93D73C4D0F109FB5A26C2F8823236FF517CF84412E173679CFAE42E043B6FEC81F9D984B562517E6FEBE1F72295DBC3FDFC19D3240AA75515563F31DAD83563F3A315ACF9A0B351A23F Msg = 54657374 Signature = 68ea71ee1911687eb54b3d19cedcfd44719d0b24accccc59bdafd84e4eba48ef0be7f115e7073f9f273286a7dcee3b94cdbe208e30ae496987479d3aa12ab0e12685ab592d7693a494e6ad27d526ed3ab5912c7f81e09983931794c2165c22fd859e0f9af1a93a4dfe144098c562731e6059d236b52cb865996c87a9baf7f103 # Based on SigVerPSS_186-3.rsp # CAVS 11.1 # "FIPS186-3 - SigVer RSA PKCS#1 RSASSA-PSS" information for "rsa2_check" # Combinations selected:Mod Size 1024 with SHA-1(Salt len: 20); SHA-224(Salt len: 20); SHA-256(Salt len: 20); SHA-384(Salt len: 20); SHA-512(Salt len: 20);; Mod Size 2048 with SHA-1(Salt len: 20); SHA-224(Salt len: 28); SHA-256(Salt len: 32); SHA-384(Salt len: 48); SHA-512(Salt len: 64);; Mod Size 3072 with SHA-1(Salt len: 0); SHA-224(Salt len: 0); SHA-256(Salt len: 0); SHA-384(Salt len: 24); SHA-512(Salt len: 0); # Generated on Wed May 18 13:42:19 2011 Padding = EMSA4(SHA-1) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090c6d3 N = 0xec996bc93e81094436fd5fc2eef511782eb40fe60cc6f27f24bc8728d686537f1caa82cfcfa5c323604b6918d7cd0318d98395c855c7c7ada6fc447f192283cdc81e7291e232336019d4dac12356b93a349883cd2c0a7d2eae9715f1cc6dd657cea5cb2c46ce6468794b326b33f1bff61a00fa72931345ca6768365e1eb906dd Msg = a4daf4621676917e28493a585d9baffca3755e77e1f18e3ccfb3dec60ab8ee7e684f5cde8864f2d7ae041d70ce1ea1b1e7878cbf93416848dbfdb5214fde972e5780cb83c439dfc8aa9fa3e2724adbd02bdb36d2213c84d1b12a23fb5bf1baae19772a97ef7cc21bc420b3f570a6c321167745f9b46a489ff8420f9a5679c1c4 Signature = 319c62984acd52423e59a17d27d4eca7722703b054a71a1ee5f7a218b6f4a274632eaf8ef2a577a7e8a7f654b8deb1ec9b1e529cf93459cc8af4c6df6fffabc3edded0c421604ea2aae35836b05fd9de7abd78540d45fd6d0ea714733a3427b00d9d6404db8ede4a27932b47d88243eefcbffe1e55841823def30c57de7562cf Padding = EMSA4(SHA-224) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a3db1 N = 0xf650d9f361cf9cf7c1e99b028f392d545b5dc5999a09d22913a106412adca99b3686b3f8ef5178d1bb9b1504503a5f866b563a58c7dc42d8c8537503be0c181d6d050d47a869bf7830f3c85f0e5fcc910deffe1d914ae2f8d77e66e444c579e99770043af2c7f7d89458730e716f80ed5800f8f9751f6f59bde63b6515c96fa3 Msg = c728846980d2461db29343acbaa0e69e8a7ac11456cedcc190994d37178f0964acbefa5ca56f5259e54d1eff0bc91ee5eabcd4523a4edb448c187ab784857923427e33472146ed25a4a2664ead3eaf5ff04c3dcca86e3ddc88d627f5f5ab961a72af57b25c20c08bd7dc431e08c843158571250a09f4ab926d1c7d7ad3cb0950 Signature = 46acca5782d216e2f3d6f874a38b49b35c1e7a26626c9ad8af2c88a0e1d89495c02e1c476b3c8c86b0c6267683a16b3513d6ae5061a8c0557bd3cf0155df16369364da81bbf9f6d856b65add3290f5a7dc6e975812d1e680f7f24650d5c3f15ce90836b47db064b6494a68b95539eb2d5909bb033999c423ab14964a64c42efb Padding = EMSA4(SHA-256) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183a77 N = 0xbf15c7a344db52c3da4c73bbe1aa9e43a24cc3ccdfa6dcb994e29846401f3d5ec9138756487def58d4bc5082baa8e93c840405d36ef37f59594d01f0665edb27cee3b6b647437405652cf809200597b0de806ea9ae20799400fe24bb3496d92e65ab5718c61ea24e302b2414f4a6ac1c99a4177de0f83882d638c46c95e2412b Msg = 0b95962764ca7454c8212a4407782e6174248c5898db391d28d2a42f35228f1da3701d49dccd2cecc5dbe45af23190881601adcbbdf841e23d666f37e99f476289a1e3ef07f7af616bdd087609a409adf958a106c8a1e9096de7b5097fb96aaaa5700fa14d0fa6bba16ebc21b6983fda07719091239cd999a29ba12e5d389dfe Signature = 7287a0b4db04c8c795018cf818a170b152309ee195cb239d22c70eb248e1db54dcf0c0f6c8a311bd07c7051218e53c41e94d0c67707d0a69f5bd9cd1abc5e01cdbe70d4abc75a8536bad424d94ce160d71104b89d920fbdddf8da741178bbbf315c3e9fa9cfdaacd41a55a86eb143c1fce55f0bac0b5e08c9dffdad05485031d Padding = EMSA4(SHA-384) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035c661 N = 0x8b71c2bcb324a3fc23d292fb4f18cab5140d521013361a07071bc788859cbba33fc226b2cef9c1b3663d307acd3e4d8eb7acff63d048495a2d61fbeb617a42c4f424a347673173902cd1cb11780003e715662d195996fbff55f6b9feb54a18197e6848aa8baa15fa020cc54e72ec976d766ed63ee4e00071a11e29d7baf30e3f Msg = aab88ff728c8f829841a14e56194bbf278d69f88317a81b4749aa5fdbc9383486e09bff96a2c5b5bdf392c4263438aef43334c33170ef4d89a76263cb9745f3fea74e35fbf91f722bb1351b56436cdd2992e61e6266753749611a9b449dce281c600e37251813446c1b16c858cf6ea6424cdc6e9860f07510f7417af925574d5 Signature = 657296e902331b8030a72920c6c16b22ea65fe18e7e10b7cdbb8a44ef0f4c66f3e9c22f8f35e4184b420ad3f1bdbc1d6a65e6230abca8a9bee10887833dae15a84bf09a4542389c685fd33e7385c6001b49aa108f2272a46a832bbadc067ff06b09b2f5f40c81cc2acac03311a3945f7a9f2ea81213ba9ba626d6a7ed49f17dd Padding = EMSA4(SHA-512) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b8267 N = 0xdab9c7d28a2b1e4995c12bcae3c9f580a2dd5372441888dc83aae5b515ebce3b95786c43b5811ebaee6ad90bff9e55ae1edccfc0fcafb4cfc43743749307ec0c36886c88a174d0156a2f88a25a5c594c558bf1a947335b1ab02e77bfeee5ab0cc25455819397f74d30ca31074d4612d9d928b66477ddf7b83c0cf4ee279c9071 Msg = b80271b3ef26efb5b0ca8e809b61fdd209337ac23fbaa349e84c8900c2fb072b97ba52f76fc1d00004322e1676fcad4140ffbc026b72ccdc01826013c53c63b421adbfd560482b1e1d884489fbd6e06597ac9fa1bbfbc347d5ca4147a72017763f25e1d62a84a718e513fa5f94b63f47f6814a26991c2f924a6c5423d06fcb79 Signature = 2db61ebaca89ecde29a2895f21d61220300f01d117337ba992e0e5a65d6c4a6bd537f6f74e64db2ea45c8892114d2d5450d9b9eb38dece3dadcbe91123a9ef8288e000bd3fc1e140d2499a7fdf44f3382e71d4def1baa6e40d8b70334906f895055295b8f37c779969975c11b79e2184321a883e1abcbc100273187ed1480a70 Padding = EMSA4(SHA-1) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4822d N = 0xcef7d8f114854a2a681fe6ef600351b20a9d992010319590ea20f4152565098aed46b75330cac1da85652398402dd9bfa04f4e6c63f3cb6a30ee169b243a5ea0757646a47dc51db6af86adaf9b700044978da876d49863601d0c4ce7629decdb7485df787c68e250fdfae9d77251a315f127a93dfb024c040e274ec658e2c19d Msg = 6509048df94c808fcd84fcf16aa7e6735f95f111884c72d8905c0af9b59c861ccb1a03f68458561eeeb5ab1c3d296bc3cb3564c25d1a2475a84aa501141c309fbfc37b38c5811533bf18038b8982ac2449e1f25facb9a2ec735d0edf2fa7f80648ecb27a442f847546954e63d5196e3cdf81e410fe91b4e4f97e8cbc8ea6a7f9 Signature = 7632ab719f25cf1d3baaaaacaa3fd102e519e0e2b6b153aad715a71582a5d36990dbbf807f9a71fe0390ddbff757de055399673a1fc0ca3e1e577ab380061875d5a3a60da90ca74eb437aa73910f128fb014a2b2cd0194e6a40f6a2f2697e2688f899e685f28b43f523d59f55b9050f8b7f11ea5960d9aa03fc5c94321c5a732 Padding = EMSA4(SHA-224) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412b89 N = 0xd7147d934176601d8dc64f372838bb46bceb7ed10e6dbd3100a46340d889b8e5ba3d69fbce0f4c9fa2b4df614a14fd0503dc04d6ee671cc6283d4d37410b6d0a74cc39b3d83728ca561c99d920e80f1d971e927456dab06cb9bb8600f540091f96d3605a8bde99e01cd977aaee7dcca20c328af04366bd5975c623785839a355 Msg = b2ca1c4b7d1a56595f8fe90c3e460b151c08ef26ebce3c9ea384bf68930e5c20f4894b78c4d381dbd24d6b5015dfe2a0413d5cbb9c695f580e7a3cdc789bf97d47568fa74913569ebfdbbd66b3623ee08c459135df9020778883bc86fa968e31d3ba509eb4e2bdec4fc24516c1d6061b23a7f85c5b4a67453829a72fbf060385 Signature = 435ae89ed7ad4138aa8b19245dff3153b82971b6ad38233d39d34e9e388da6155e1c353575f74eecbabf1db03821dd38fe6047bf5027360f991abd890de235a0c1b545b5487d0ded6c4557c7ef74e12524534dd666804b861d4a778e42969a32295b63d1d70a105287b0ac75494e2dff1094a42118ec8d9b4ab28ee5cf746eaa Padding = EMSA4(SHA-256) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd23bd N = 0xd40e4a247dddd8dc32a70a38d287f3fa23aa016b77c8e8e1a98c2f60967a2b7a38f8614066031fb6eba697c367e3430cd8d924bc9eec28529266f690d538ebb4b0381b8966e7224e3c526122afd181d6e3bb6145a5a28d46dd36c1f1da823e0ff38b439c7638b44a127b072543f18192efde9cb381b2e98f4f5fe854e3391275 Msg = 9872df5b9025393394ae1b59030765ba60af6cea40fcfa1867b397422ed607a528bd147804688ed9b5148f08d10c03d337c26851f51ed3d369163418a67fdac018233a036c13eca3aa3ff61fa4434d2a9484995b017c3926e252870b06ae5d0db3cbd8668ece5b79ba56d70844544aa7bf1d86712bbd34f91c8e1884180a9775 Signature = cc7a427ab109f85f16832c04bba7a0eebfcf4e236c7507b337fa9e1d437d89c908685a5bafda8e26e4c1027a841c809ea0693749c2461c834aa0a2344a2a332dc3a3440d895087278562a7e91114a052599de0aef06787aac8963b8ed2a97db088b808f0b91c17c91e24448b38fcee4cf0c76f4aafa0c61f380c97afc4dd49e1 Padding = EMSA4(SHA-384) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb045b N = 0xcfc4fc3458c4e37c95a3d489a332e08e4019e477c85645c0fe24e25b6fbb2b24dc123ddf9f3220ba965dda6c97856b4821b3f7052453cd6ec8410f9fcb47cd2f4359d896092f8c944b9517c046adedc002219936da1276ca2e7cf43b344d96cf31313fd766f5e84af1d36afd6a46c45c140841579d1dee3907414118e382855f Msg = 489a093a195392c15b4ab965677d572888209e061834592ae55b7562daebc1d1db41f2e4f058ea87a69a3a98b2f5e59bd83267b00b82f5c3d65a0703fa81149559689c8912b96c0dee321ee0fbb4df0a769775cbee4180d1a7f7ffad3df2178889b61012c89fa1bcfabd6d2789e2cddc2bf8d03d099880bc21d9674ae9665212 Signature = 71fd89c20c030e2f1d32c9b3241f008daa2502d220a9ee24dfb937d6d0a91172c686ebe146a0b4aa881042f0645c65f3241edcaf3e6e5e2eeb1196bcafdbecd04bdec6d84aa6800b344a93c0e2243d6450adb68bba8168ac8fe713cdcf63956e502c04a5ef05ae603fa38b3ad50156598de70f740e35e5a175a6f045106a05f5 Padding = EMSA4(SHA-512) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8c34d N = 0x881b4401521ea4b72e57a9e3ad152536b2cc0375c5930e9699b8bfc3d16b8c1c3b37de3847438203b6664ee1b00fc7bcd03ec3c240a2cef3f367d8269bdb65cdf4bfbfc56e8fd82cc93ff90c91ce78c402da1c59037997baf56d27abfbfe9d0731b8def029501df0d83bf0fd2234344ec4daee7759969ceb5e24cc00bc12a437 Msg = 56f35f42516bfca0dc1d2d727a4fb6bb2bcfba68417c2beb6f07852723fbbc8c15fb7283204b6e0c52934aa53fdf6b6f9ae9378c069b81cb29d04887025ba2cc7d4af3bc456c6231da108ea4e3107c4ec50ed58c74fe4e888ae4671696df58dcb66748b668d3c1599d1e61360fead2a1d5c5fc3234ac786bb9cd489c8491c604 Signature = 2ce4a58678ab5a9def663e03397756e4e6e345199657e2526c8515ef5c705d3db2775a28c2c65599dd786682170e36d502242837e688fc6020a4239ec7380765724645e97f4795fd0e50c257eb5c5b2f4332f6219231b44b3f5bb4605f45b901dae7af47300bb29478ff22b7405a383b20874564def9f3b470ce46ac6e560d83 Padding = EMSA4(SHA-1) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d64215 N = 0xab2781536ef9ff9714f72313939513eb7c4570b7cbb1f8928576f7c9f7fdde20f5ba770c0c5a7e7857c54335e167a78bf06cea5cd2a1bfafdcfd673a7cee4a2fca01b60c3dfd78527bd1b147dd01426b7f1fb6ab34876f922dce3bbfc60d4522b6ccbf080aa72c688c0a4214d44b371008ed235902d3af3373d20ec2f631720b Msg = 60e8b840316f75535b1171f6ea36c7ea71ba2e1607e7201f90a03b3a3edee73e576139fe389f17d59a019d82144ec036e16731ece43684f9e9e192e42e431c77229cb1166c87d1502f2d52b48cb903e6690c90f271b1a5df5c13568871edbfa74903e733d510ebeca3ff58345c5dd820920f11cfb840cafa729e4fcd10c617f5 Signature = 500d43a05b3083bf9720d59e24856d8429d95fddf3caea9968d30962e14473b60017ad57f07086bb0f3ded5aaeb2b5034ecd541f64e7bd40bdd25dbfb0b1d46fc69c79a8f833ee3c758033f3a48a5d79ab0fdbedd726491880d5a13e6a545021125a0fd695b0d266f9e527237e119083c4b175abd8391ca0bd26cb84249bf1f0 Padding = EMSA4(SHA-224) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ba2f3 N = 0xdda48fef7ea12b75d0446ac178e988cbfcb7da998c00ba51a5529cd97cc47f03772e1686fa5c43bb9ea4a62726e95889011439cce1e4b3be4efdb0f1fedd03549ec4d5c93fd6f4fb0219dfbd4b43f1b38428e2bde0cd562a999c77f2e5394d1bc1f375d63af7bfc73571b8c777966bb0fc75ec8167c46972b7844e981b90e2ed Msg = 7490b77f604083c6c88c5571a98ab96a8ea932b9b3457eb269791c6dbc350c775490d6c7995fcdf41b0695a5308ee348dff88407fcd1a1f7950741938dfb0f6a87d75e1405226a6ad192e0f79d21a1a9e662c3cc1e16d93909fb75cb68e4eb13d50e574deeb2e192b5d73f4f376a7cf56c90f8f25f3bb1e18efcc0fd941827dc Signature = 7434621457f9841573fefc0be82779d44c687d15ab75a6f284bf86b1e0a31647b0a8f5aa8d8a8aa216647f7ba802724406b18ee473724e2fa9ede3cae83130487cec4145ec00d4ae5e0542f2a1a7be491e59bad6e05d0422e87e98ba5ce9ceefe43c5a96a94f260035d7e7131dacbdbdf7beb0a10e8883ff272884c602ce11bd Padding = EMSA4(SHA-256) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffc8ff N = 0x8b72cf259d853597bc0c4b79f21061a3ae12f6e8eb5bde829633ef207aa282fb47bd574a4c6983ffe5687d1e4ede14db5ceb326717af8985c7778888521b4a431b1643b80df1f039601b4d5d8773f91c19239be3709d625174e05e946dd29d4cd58e9aef28946c8811dd1fdd84f9eb2176902ef2a710bb76494c65c37559dfdf Msg = 343d565d85c1a326570cc4062d617711e00c7178ef5b52aa16ead8bf222353170306593e2326ba13f6f4b62ad3406e6e02fd990b1645788b7c9d0c3e557986e08103ff76fc1869796e93c636fdcf9875666798594c40aa87d0ca118a6182df77d5bcb0ccb99f989ee6715af45515db6e35d1d62a3a55d0e737f94f6bef474723 Signature = 1ee5c565d81347bfe222945008daa3923e88e273d537b4f993197f8e2cceb60f477cd53a63950b9c0aa03d559fbe940a506be4e9d8a8f5335ddd514483a79e81e24388e31c90ca6906be6c314df7904d6a7961832c2175edfe0f41412bc042d646edf6897979ce0cf0f30cb36ae22fab36ca815ac5288ba7b3b49fc109aac798 Padding = EMSA4(SHA-384) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4bcf7 N = 0xecd6bfa6bdfd753f6f856db12da04af254dbf26e56623f86c06031bdd60124544ceb56e4dbec53740d231459ad3767bd202f857e88e4d767f04574329aa51c414f4d4c52edd021850cb1b6a4bdc11be1ab63b9da3ea1e80db05eb8bb4f1e801fbe4b7a9d53226dcb8a4cc6fb954a6c44802011ea4745c75ba6d82b50e3243aeb Msg = e302eccdfddf1455a17fd2870f737f23902fd1d8ab6cafc39bca443301ba53afd79bca3aa52399d5f701c4460ec0b718d6efdbe3187f66cdf16c775183a0623fea1448047138ec2c0695c125ecb04846b032980f5e473eb3f44448d3178c9d8d05b490b5cbe5b462b882f1ad110bd7b5064233e7e58ce07c8e99e0422747aba0 Signature = 032678e9feed45edf12af67a5fda9d1941f2942512adf95b04804eba5ccf01f0b37bf9e6a2e01b482ac1afec7684ac896b0d8c4149338e3936422cc7058114faf4dbbf7bf3c330f3f1e8e16a4bb755ce1dce34fee376b6c58e352f88e6ec8f60c5319d45fa01d46d7fa5fd2eb7ac453d1b3d34c17e2c9cf3b851be7b734c733f Padding = EMSA4(SHA-512) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebb1eb N = 0xb0ec8da8b8d87c94443202a94262afd545d9187d5c45111e7b246da630b1aab516133d6d9c8dbc98ac27d09843f452063f2f577c997e56da01f3861e123c842ace49ec71622c3d6cf54d13bb542d9a55a0be0fd79a65c4f72f1539026cae2e48026e3282e24a8c31e3e699deabd41d31461f6a7bd59978dc189077d46f9ee27b Msg = 5b546a186eb7af3e5c1270c3b97904efbd1189b79b17d9e10f24ba6936af5524a3d3eaa3af52c15a10db6401ae880b3bb2ab5876dfca441225e85ac57306233eceeae108a01f7fb2523dc92d1c6bd9751c21d173a633d023dc0b1ef27e35aa6a0322b710e825d28d48c2070dad2854e526fc5e789958635b5b1470b7fe44d4ef Signature = 52119892d0cf2f9d556c9119979ed9d9e49cfcb4d634b951e7dbea750f97c1bcd2b713cde92ae5cb91979711aff3891aed1f514265d0ee7273630fdcde3818cd5ce63494604a89dcc9745d0fff9bfcfdada043ba2e669c9a51121fdc0a7adeaf132476815afb47440f3e47d6508f021938596e61be6a982561855c29447f89ab Padding = EMSA4(SHA-1) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000593d67 N = 0xc4b9ea11f21cd93c01f56c4219db7d2e52581a6c968705c06588c036b6f51a27de43ba0006d6e54d9ee20dd8bc1c4787b4c45e9545cf98c7872100f6c3492f5c3f1ce2d28caf10fa611cc4a4ec94543fbb872ef0fc8bb9558360960e4e386874d3beef4e9662e8779304e8d09bfc290a6fc19e9908e8eb49336ef02224107bd74de231f2610d76fa834baad342e87f5ffbd56ee8b459702425109af864401b713cd9e96a01137a860c3079e13704d3328003136631062b198be8d644ed99a0c62f94cf7971a0f2875592f35e362abcf2845a11ee98e5f01a515abd0d03646da28123b45cea4cbfd7de9bc399fd9f05349a2d0386516f70f5c9a9970d3231ff73 Msg = 7a884d5e7edc74c10c44418e47ec7d7dd66db0012dfc8a200ee181824f2cbcc8dda3301f01fe0914e2574baa4cdcb9a9afc7f63a6b90eab14a6067aa4eca0c57aeb66a181b9d664c47fcde68a80290467a8c37bf0354f67b1a65fa08ead35c2af4a8447253215412441b44f0e5c8c9f93da6bcb87db2782785d984c5aaaf72e8 Signature = 8103b5648993736624556e994e052f6fb9b7dad36bbb845bf788a31c325f02c6f13971900c08948f448438472230ea69a6002f52417b53e1d32954d96dd35443ccd459b98d4c211c2277b54b36310cbff6da97298cd6ef261a7b4f7027ee11b97081cc710a7a3bc65714e1c69cb37bc844023691ec9f704d57357eebec21a27f6e624f46d35d88a64cfded5c5fbce3e97e71bad21f8d09f07de8afcb73e5d165999ce7fabc8fba8100fc7efa85acd447afb593b97b8e86ad24c1b93e2266d9cd433331c6c9395e1a7a4431ec46d57d53a37afbc985db7e4ee32d34da6da2727b930fe6ce8d7429bc04ba4877760d73fd1ee9c8e22478737c73405136a4e3d5d2 Padding = EMSA4(SHA-224) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b29bc5 N = 0xacfdfb1dcb1459b489cd4a8c9fab64a7da4f044bef1c506f0872e9476f3357abda509d9fb1db6a4f5306c40c058826253171cfedbc160776a48ec35b655bb9963286b6aece1c77dff987a0aae9720ba035dda67f317101bd3cd4e6caac867a8c38b87067938e96e72df1875f94e43e4c06f7a86a1dbe07836ee69763eee29bc13ca906d7740c29e651872a9ec7c6237f7c8290bb0800a030b323d09e7c903751d21a224266f9d6c94c17a4c0cd8175ea67b9d9020f2b3f31a96206084cddb2acef70b11ae25a46c4f6817c4813466d7cac76b27927145bd499ff87f22a946b688e980a00a3d54c72ab9c2c88a55a3ea4c6784068673532737cbe4799e98bd711 Msg = 7ced8a54c8e35ef5c87d03ee6357b658e2e528eda55ad30f14c88d0cd9895ea04ddf8fbb2fd703859c73cb9f3b07f4acb9e4a311753465f87c25c09bb74a0ebf633e8b7ec28aac4a10c8b22fb9098058c975a9d5a431ce9cf78627cdee3f5f3aa852a526e8c3004d0dc6e22544240164fcdf62c29a19b6006e32ea29e631fa18 Signature = 8c074bae48454875aefa2b7ea090d11d8860d7cbee5ee4c3ed02cb45aadb0b4516872b0e4521789d503b4e70092ca2a0c7a88efb7d74c63ce8dffcf06995af7c9567a8df05a01b243c5f3edcfa3922d06967bec9d0faad2c84486dd38602a416ef253e4a28f74ca290e4d743accccd204d8b136dd197e7a2f25a2707f339c6ba444c19bc047dff0584c479ab07c2ae68f219c3c430f19cae3f711c0efab8d09f85ab66ae948c357db67078a359b9c746d2d66b31486c83765ab097b540b5e6f626c9111a295855dff5c2acea102f6a29b9569909dad0d4c79a941a3e71b3137dc68ae2296b6f8175bfab205432e409be9075d12580b5c14924dd53c3d44745d7 Padding = EMSA4(SHA-256) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e43f N = 0xa47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b Msg = e002377affb04f0fe4598de9d92d31d6c786040d5776976556a2cfc55e54a1dcb3cb1b126bd6a4bed2a184990ccea773fcc79d246553e6c64f686d21ad4152673cafec22aeb40f6a084e8a5b4991f4c64cf8a927effd0fd775e71e8329e41fdd4457b3911173187b4f09a817d79ea2397fc12dfe3d9c9a0290c8ead31b6690a6 Signature = 4f9b425c2058460e4ab2f5c96384da2327fd29150f01955a76b4efe956af06dc08779a374ee4607eab61a93adc5608f4ec36e47f2a0f754e8ff839a8a19b1db1e884ea4cf348cd455069eb87afd53645b44e28a0a56808f5031da5ba9112768dfbfca44ebe63a0c0572b731d66122fb71609be1480faa4e4f75e43955159d70f081e2a32fbb19a48b9f162cf6b2fb445d2d6994bc58910a26b5943477803cdaaa1bd74b0da0a5d053d8b1dc593091db5388383c26079f344e2aea600d0e324164b450f7b9b465111b7265f3b1b063089ae7e2623fc0fda8052cf4bf3379102fbf71d7c98e8258664ceed637d20f95ff0111881e650ce61f251d9c3a629ef222d Padding = EMSA4(SHA-384) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f1bf N = 0xcb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd Msg = f991a40a6c3cda01f1a2fed01ca0cf425588a071205eb997a147fa205f3ec10448090e53f56be512309cf445b3f6764d33f157749d5199c7a09ef6246bd5c793b85d24d9093c4d4b318b48e11727cc8bb7aa5ec8699aba7466e074e1887bdf2a51752ec42f16d956fe5943cbcf9c99a5e89bfd940c9fe447fcf3bc823d98d371 Signature = 6b42514e88d93079d158336897dc34b450e424d61f6ddcf86fe8c9a368ae8a22c4ee4084c978b5169379da10ae6a6ae8cd80028e198cd0a8db532cd78a409f53baf7d231b545835b0dc06d594d76868d986889419a959268fd321bbc8bad5e800e452fe1a1a2a5a851d542494473deb425171a2f37ffc4cf0600a8d561b20f777407bbef1b596f92e518c0929e8bd52b015c2718d14443a56056f65015515673deef32ae5399ae71f97873ec1508f8c41d6a66a13017685134e5425c4b580a7f6986c26fb272f0ed215d6698dcec9e7c5258173b295b3611869254a538945de952dedf291837df0d7a205e1b76b01140df4edce3afe7245d46ee3b292bb117b1 Padding = EMSA4(SHA-512) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d8853 N = 0xa677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb Msg = 7811a407fe653ad2343d83c0499fc11e2951ef0a4791a3cd9a06396be5f72e783cbbca2cc47002babaf09cdeb70194b532ccbfd24691ae8eb598d59f2e6becedcb4296a1debf417eeddb4d74fb217072091a597ddd0893ff02d6ad61105098db2e90508bd4b8bec5d6e7deab9e651dfdb8210532955e1bc788a908d7150ef8ec Signature = 3ad1f0faa9a36586154a382a1f2c10e819dc318a68be35f54f95401b0ef2ba5cc895f0d6bde28c8d3b364f60de03ce75a7af29e5807c1eec4cd70624756e2631eb46af010ca8cf93ee7d86a4af3ced5dd2a8a41c1feee6b4572070873939ae7a2ce75193945937461d0064eeba07760c495c5c70bdb04d89951de3f96525f8e44612493d490731e7ef7679a24b0b1e2b24c8003c2f94114e4193d6e54c0af9e870530b008530210ac0b0e4c7c79f379384e1bb319b5f2a0b622517ae5d27f0eaaf7958cb0b41849126075092e86e7e7be5eeacef9a8e3ec595432ef619858fe0d0517871b8b495c01af6f18d4e6d250dbd19280ef4f8a37d1b59a48fa41b831d Padding = EMSA4(SHA-1) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f8d03 N = 0xcd2cbe024059e2c019529e157684eb1e2cf415a71b002cc643668da85f752ef64cd8cacff6bb79e246f7b8f731c9f5cedc2a879302b51273c83f81f9a377d3e450bb4f4662ce01a010a6e68b66fee35b62d9861cabe56f6d262cadbeb44a58145a0f977966ab74f662674fd92f165eab397e1a2829aa2a7b9cf7c4af5db31119741d416308f3cb5aaebbcb5309e50820e7e1482b9b3a918653d9cfda6ed1122488f435dd54a418e922147be2f6586bb9b759c66b01d0045757302ca3835a68a67f36b33738ba9f8c87b909fe1ca5e5bad207cd0273ccc3b44a6185d32b065b64e2bd42b6c61f08b268b2b7e91ced5962e3a7d553fde91b77eecbeb9ba63e0db5 Msg = 4f9a34e96e649f8928a7c58a0c84d1bbbee1a4c84a69c95db7d4ab8ee06905777fc19b1f8bcd28a3c41b97908c547590f80aa74927b05882d2ea36872508decfcdcc94dd53743864a8f475ae01843c3ee45a71b583b9e4f24a2a827db40acd26624489e96e60b815fdbdc9ae131a0d0fac5b6ad3088a53f6461df7383477b9c2 Signature = 890bce2539c7bc657983af81cff87ec799771438f6dcf417e01ee056270a0ddf6095fcb94bac89626101a34209c1bbe3d3bd301b3e8a7303cb7d5fe193b0d6422e1feb6eb1ea8f1f37b29089b54633fcabf23a28c9ca422de4f7851f292ddfda0d550673961b72cf2dad77b3b66c9f3bbab643e80c569a6f651be3c6496caf72478cd437fc85a57a1cdc78d8029b76a804d04013f16cd6b469c69e29d07409aca30c719c8659454fbd9da60a9f62165247db74d18799eba33508667d1b645268ba39d74d7d954bb41d607fb7820960687b022320e6c9a3853c2fae535bddd915347405f525c8ab40edbc9b7fc6c62d2373c0cc7edfcc4c956615cc08d49a4273 Padding = EMSA4(SHA-224) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce5fd9 N = 0x9e88e71138328da718c664b03685764881aa0145e8b23d2fe8cff47658334196ba8df505a8002d7692434625cfd29130ca11efa90102ac5690b083585ea3bcdaba216eabf0ce83e831db6b74c91105afb5edb4935691c656e24e3e4a6cd20d0a8cfb61f5509a08364b1db31a93eaaad4db58670bf7e8c8b259474f3d58a94c0ee7fd7c173e0f2ab7946dac5fa81c6046035a494fd430d0ed6719f21eccb57d09654a8ff28104eb8db4f56329324692509e8352127fe7ce230dca3bdb074063488f8282a70c1397a2ac18dffaddfd97c884421a7b3116b5936013bfd3d47f008c0864ea14f2141e57b753020044462b114ab05f121c7c5c4ecde64d0d0f9b58af Msg = 7a27b3080a30aa2ad290a71e7668133943e04af91676a0f37996a20c106a9eec34f365b0dd594fdfc57f80a0cadb6a2a9485937b798d984d9d9273465e90f96feffaa6e742099dd92c53ebabc49f0c780cf8b0c1d300bf5fd9879abc355ca443f463011503e89dfe4f3370a72a5d010df1622931eb761a12759d9fd85c76a652 Signature = 085c5953fbdf2078040447ebf7e351fa0516a403067570eeb072d5a2601db2e550399eb8d1f5a5d35174468490a1ce554422d0966bcc3dc42d8ecaa4a3805d2d642c9279a4a30673cf495a15fcfdf04d408631a72acc94ff85c8002bc084f5d35c6a2baa6734e6c411e1b89d4be6aacd6f4277b37b179b503e023e95babb1e4254b702703903e3157ed1ff8b7f8edd498bf95b50ba4b10f244738e259315a74fb479c2accb01634a856b3415b880a2441ab6f9f5f810248c0b1a74316600f013a85d52a870f8c926680a45f8f7fc117e6298c878667b1059280bc52e129c6ae51f96c0eb3348aef9c4c8039e7684294cec1392ca1d9f1d1a67822ea936e360ab Padding = EMSA4(SHA-256) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033e58f N = 0x9c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f Msg = a6a2c5c8718c64105fab8d44fc69d334273aa71e7475d924ce625cfc61944aeab77927eb202f6a33589939da64b375d3bd22f61db010183d053676ebdf3af50ce33c05e09cac237d1e5ea27ceae0acf2120b84a29ed80d702d759019e098ba227314e40eadaa98d4fb215090589880796f1cd7130476c2a6904633ee2b56a014 Signature = 8ec5b4e7671975686b72eb3930f77ef3622119d0b2ae0618fa52c7410519c4f846c986001d3d82844ae4c13e99dee463448a498a652e9b725ddeb6323b83d5521637be0dee7b224c50dcaf6c7b9a2d26f9b0aad81ac6e4651f241d7a860b51c96ebfc3df978c5373b7846d3139f509dc16726f712c0e61af620b2c6db0955d0ae9cd4760bb9de6151e04bfa19df4d5aca2576f91ee7aba9eb446fee77c604faa5af87536f22fa6e239e898de906642fc6594be9328571b35a3a8420ac697ef993016f78def8a17d13698cc4c1876ee1006d814dc60161214a8f8b6f2a345c8b0c0fc645873b6bf9d2fbace2246f643a6d3a2e0b88929623a2e2a73823f6e325a Padding = EMSA4(SHA-384) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646e91 N = 0x95a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395 Msg = f3169de46af85cb510fbb4cf9c0aada9f875301ceafbc818f428a59679e1e6cd203d18a97e96f979efe082e8c43a252ea4c354872caf42e4d99aede1281b5cf8fb9d25f43f6a33a8cc09c6e08ccabb98e09f0e6c3f2d9d5021232f811bcbb4bc4bdfcfadf69d91aa701d88a13ce3f84f75b168b36c9e60c3936c725d9a177780 Signature = 47b74ab96c333f1b60313998e9bdf5e313534c96c2f7b139f4fdc8295c8e53a1ae275b235a6931c69690ba8f1cd5bf9d3e1a6f8a23c9f026a592ddcfe35dc498ebef292ed49a87b4813ddcf04cfae8aaa6978f629ff58f24960985a452a09439a3aa027668055ac5900d62f5f584f8bdfaaa72489792fc32b6adc9d289dcbf5bb9a278ada1392b42a4e5b9714a1c3af00f937962477fe72b820dd4fce5cd2e25e6a56081d6119df474b7b7586b801680c4ecf9d067f584d79a9cd0f451aa90644096bf9e80bd469727ad7b7ceeb9cba63de2abd423ea96675d8fef64130e357a5d2f67da0fa528fb3ddbe2fd553033e517533c6d1c301c094ce0899bcbbcd4f2 Padding = EMSA4(SHA-512) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452b3f N = 0xa93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3 Msg = 25e9e6c39ee6f5c455d81f868713362929cd68ae87300aac2bae94440095ec56b7e3e7f56a5b0d197fd89c94d0e2d048087f6296504b4e1a2ccbda959fffd42a96361bce842661fa493c2ea25831286b19de93198c5114463020ba5a23fd3eb78a8b8a34337179cd79acde996829c7fc2293031d816ae19afe553b7bd2b9b365 Signature = 2e0b30ae35777c9f951b22740fccb88fdfa94e7d139c9eb105be1a1ce542f6efdf4eb3d1ab0b2342f8e354a0878e31f0bdec1eb67ed19491a086065af7e5188ed0b95e0dc88812f66d6c726fd672e03652432f85a9fe4766a7c315c0c695fc37c45ff5441d3177c4181f01c243ad3c9614e4c6f4f8b879ca8167a7790aca6b34c74936cba58e64cc4e32ffc8ad6c09c48ac59f1eb18dd11871ffccae98c465abd5885bddf59dcec5ddb31ce4ecd86bf6af207373a912b2717e726ce9ff555f3502e8cb83e287cf0f7c938cd4b26f075fd50e4127555ade94c974a4cf604ea5c5d9e94ce91fcb9a2bfc8743c06e69ca41ef029881c3d64078cc6311c694dee627 Padding = EMSA4(SHA-1) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002db7c7 N = 0xe3db9f81f57c99898c867221eb20449ed8b05c1c7d6d0388cd5bc691b84cbf9301b52b60f34be1ea5be12b87cc185d92451037ac2b2f79d1bc43d0736108b1eac5f5a52b4037825385df38966d15562cebd09d27c8fdd3c9bb09c0b3d77b0c05a1fc40b1d9d26bcc8ad35b321ad5866f500bb9196237a4f4f2f282f9091fe99e39c37b862dfc8a22ec487d6e36be1ef8276629b60d845d92524e97d6d52689924ff354a594ccafe9087f5ec6a988c2dae41d2a400d2c8c039e3d77ce5450ccd826468fcfe65718d292e7765f0185df94d5fa79c1e99a8b4f823b19475c6004c62c0f7db056fbe167df368ab8019d58b89d7d3790d427844684b147f962ae37ff Msg = 36724717ec13584b5ae5c9816118a0f5596e1d37a88af088936baa875434720d6c2ef9553a0fb060cd7d3897f7ce19b3a212b8da6753830a5d1b6fbb2f37a4c072bb766f35469801d9878c3c23005e4f8f0a92fde71a5bfd15420ea136fbd5b7ef21a8ad043f79f8260dafb50d37d691c76095e75067e02962e96e818e076eb8 Signature = 748b86aa568fd9db1c804ff3921350353a4e68f32a06066bbbb3933e630fb57db6ae097d26e167e9e7a7e594d30e5cf183347b691bb991e6249ea9f3b6b3ee9830b57e208b4f69b861febe5bf2a56c0f886ca715fc790e0112348436af22f56aaed69b9854ac1b4cdfb84fbe29a3faa7df9570e71950fff8d9c6d5138cb4ae7c6aa58e616a858ebc367a3b2fa813a95956bdf75d4db0d1ca3704fcd49a234fb6f0e9c5d17e220905c860da62eeecdfdd9beeccb3a43e86f5afd98e3003d523cd491897d3629c39ccd15f154554c369e6f03bd0afb92e5612d87418ef1844e812b12f718cedace11d61871f6337f6063aa41f542cd3b9fff2ddd8c42a9c9be792 Padding = EMSA4(SHA-224) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3e453 N = 0xbc97958f980fc043630735e36aef0f278be381655bc6a4940864e6925d31ff1c9392ac5fa44b06af295818f03948a117bc7f0fe8f2f5dc0c1cbd9d1819913f13c0765f41c17a62a9fa70422578c86305c0e67c56b2d555fcc12a84c45ca00502b692d8790a26bb73a8f2df1fa44cf910ca45e8ea2c665a9b6d266c2c4c6075c55e686511683cf75bbca9573e8b79f01583d57bb21b6e8f46215962b9b3cb1e57ea56221f6ab61cf33f969babe3b5a1a98a76387144cd617751ffa012d8e7d1471b264c274228e2bcd549468a57316f392c75625435ddbe7dd3dc40544f4a9bb9cf5385b255ba57769897203a7a3d0f2808e05492b69a58483f5fc396e6523da3 Msg = 0380169fd5b1da966bc268e6c705dd0d05716455d6464f9b30f06655442e7ed4b1734ec6f78d7ffe2e840278f8c5a697b47feab2f44e0fcf311772aebe33190afbcf8c1bcb92e65f48812b9ab520dc1cb3dac942b8a3273fbedce21c387735fe4a5b77a8390a384021818c56e660a7226c4aaa0d0b8fbd743d085ea89a43f839 Signature = 329eb5bce7e499c789504948fc2a7d71bc5ed2ff9c408e523d97bbed7756024f587cf4875f5849e7571015a2abe6547cee2af4a01ec0b81eb8144315aa316dfba35b6763701484bb081596d250d8548fa2fc562e12e823bfa58c31a66e914307ff886caae281eeed9232b68fe47164a87c0cd2333cf69d416212af17f2aaf869b22d4525456d29b437802348c258e7778774a9f88451452519cfeb36c8c95a6edeb7b0d472981e34f4aa31eea1e7e13cac78cceb2133fa29e03507b400154fafb55f6a86c85d4b8fc467caee0c75e5402bde718d3773a3273e59c1f1f3a9c6d57f0b46902cd346e9f2aaa20b85811340107c5c9745d73abf4a74ed3a35ee8b47 Padding = EMSA4(SHA-256) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a54611 N = 0xa6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775 Msg = dc4c136c805849fe77b4b381e4c6b22a3ff69947a9b5aa6b7cbe42cb279c50e8396d0b6ebbe5e55cc396ba66466e4e982e81f63bac0895fcd0aaca4b57fb6802c4432747b28099b368ae5fb4ae459c2fdf04aa6a40ed0c2a9091a418e08d2669a555cdbe0c304d498d840832c35484397b071d9c0b6bf73be5f937fa6b5b7367 Signature = 723f89429e5f8443defd528d57798d67548279cd169d185a0052e09472e1b37c313250136b2a5f8910e31229363515ad674ca9489d6c7ca7974277ba323110c152f664a79cfdb3453d4cfa6edd124f81384daae9b06f24f3599884e13db024393b5e211ca352149521eb37d29902de0c4392b44bcdf79d2f3792cc0a7edc3995aff9629719507a2bb35eaf2be9a88b74551a068e6e556d78f1662f0a78cc29be00acf9af7ba491940b8a731a3af7003654f15205c6171d009a015b68d423166e971cfce113bf2c7edae6af28a500d43e2f3bcb3b8dbe940eb0f8bb1a077bbfeac4cd20dbfe058605c31b3d1be79aaf1d051e27daab45597ac2838763e49caebe Padding = EMSA4(SHA-384) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2b5c1 N = 0xc5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023 Msg = e4ceaf62ba10e317e1001d8a6a008843880790159597ffaf56ef666d8081bf747ba650fd6591d3f15a81d3b7f33b59490cb8c88ecb1b06e4dee6dcfb036ca0eace8a117ca79282cb12883b1133911cba91a883be1a93702d6715e70c4266965f65e0b88785fb39ce8f7b1b4132e818be9d3f894d8ae786b37be64f454355eafb Signature = c269b61d34cb9814934aa8d2eac38f5d941d7b69e1e0cdebea5f275f9fc4a94007cfde1b33a0f9cec3d2b60c6b6675d8a91e7a3251d78c31943524ba75824cff10dee098205f0c84d0f941bf1098785597a88c10058f2c857f85e53a205de7cedc10ad3f1d2abe3cf7c61382c14eeb6d7b409f690f9690fe9b72eb84619fc1f95a8fab7bf9a35248d7e1c89559798c0958a75b85fcaf143b41c3a23864a548026d57209ef64c2d6d61bf9ac15257a531b10fcc06fa97fd6e3fe1a882bce6fd2b8eb5a6267835dd8eb0b5e3e21350f6650de66d27c719980e98ed96006115caf94c061fd3669dc64653843853269b1b6df0515cf67f3161024ab3cd99a4ff5f16 Padding = EMSA4(SHA-512) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af8e8f N = 0x9d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7 Msg = 19dc8b8a9da18dcb3cdcd54fe19fb766a8635ede3904bf27550dcfb5ae36f4a6fc2bbaa54d8fc80e9c411252a6de509ef987aeb74ee4c5291868caa05dd70596c506852ef1e313600db46457a9a49317c47bce632aad4fde01968d709e04b4eb9df653ef30a3550bb7be332491f9681b32c824aa7667448f351e82ed18c4e9ef Signature = 694678413019405b4650f73897387df0a9a0744c345e52c02dbbc7d0083c71e0304d0d8cb47e08ac78ca34bcac209679671a036e1262285bddcf8d65082d8f49db6637bc2711f2ffcbebc84b0a96f581bd2de0e53ca24c715e416cb4f4da2eb4a4d0df893895910cfa4c346ee002f35792cfc066f25f048934b911dc748ecc88f709ba96f320b3f4ac84b740d7ecd32af63a833612a6b153e06f082e25b195fb0498e57c0e284ae03fdb27124f3af34b468ec03c8f9e2e4182a8d0d18f10221f79c13715be8ca77ce322f81f7555a57fe2e759f280d2a095d33ccc89ae1629b6386014df1215bc21cd8385548b1a149f57f2cf8487a6867a1bce842240050763 Padding = EMSA4(SHA-1) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a673f N = 0xfa15594057e21dfd0b41c921627809dd454b519cc1c4ea39883814f9cdeff4a184d10f641a5ced9a80de1623ee7f86567d953256f48dd68ccb2e8362173aeaab3f11182425924334f9b92092c0fdf1e3b4c17b5efbc0269a7d839683470112c425c4d77b8835e6a307d0189223894d74d809ddba7260fa22cf3eae11e58cb94bf61cff8faae7cf17643cacd709725814ec9c365366b3a721161d8c2092681520a23e888dc0fecdcbe61f0cf27f3ae99ebab6a459331cfb3626fcd34eb124adf5ad5cf6ab5af05e0956391cc6debbbd0d6270b8412f330d469c41b26bc0f261b9aaaf4178b55b21af6ba12dcec1b9c58e9eaf9747e37cf50878110aec5630fe3dd77217c35e55c48896207a8586354d058dd7028a386e474b7c736283c45662c4810f56c6d0ec8586397d499d59c0e0a8d640c25bb91f3fd2cc74801f2526f78ae49f42b279a1687b9a8e965b49fe10a2360852000f440117b84dd8cbb793c27f124ff88535a25ecf925d464efae566f81c8f43d23b646296c087fb56589ecebd Msg = 744a128d95416147b635c3ad244f885c5440759bc98dc446382a6d0ceb4ba4db6377a39741dea91267ec43395a1eca8bea152dd016e9f0072abf75a02a9e7beb737ee4d1a0a2bbc2ab2875ee54df77b8c758d96779406a1f53ecf4111236c1eeee885da179369e3dcb11e234dc3998cb313202cabb3a3878fcda71c66bbc7ecb Signature = 2874dcd9997e8f60ed51f9c47246cf5d919cc2368ab2b5d6078ff80c78e36dbc9722c94c0788858cd5e46150c9734df75fc9da2ab6bfdb1c6cd7ea6a181489e5a7c4b499733e9663784e1c87cb79f90d830eccec4824f4f2565d885d31fe0897173ee3ae61d19488375ac3917652ae66fe56e683be86d7a8445e62ab134f3cb1cffc931fc04689fa317fab58c150a94a555e023088d410b316c4e79c1c57f90ab86199c26555b34d44397e11e9f9161984317ef5d5c489b501a1885ecd25a994583c263b2f2c415b7ba7faf237bf58471dbfadbdf09bcb0de1d095b5aeb3f20af46113bbf9638c138a2ba78683b69c8652ab401c3beb2bb06ddedbe61dcf398578fe4c958465aa1bc430140b68f0ce34e4c964b541e6d66825011a4bc367d95338fe6256c29fba249d98a1ae0e4db55fce67775f2cde1d8661b7753f5c5b3a476e7a2c94941e74fffeb41a8a3d38e2a8c3d9bf373c7a511411e211bd4381ff30d36ae66fd29c55345ac6b8fd07d0b91135fc6c190861aad1b2d5448bff181e7e Padding = EMSA4(SHA-224) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016b265 N = 0x9881b3fb6c99a115da60ade6d178008b7e6db8f79fe34fb7e6f7d2fb96a24350dbe35fc9a9742c6d3deede1ee6c04cfcca1f1ce9f1d7c53dda87b149dbc7ac4644e2eb57f211bf883ca006098e0f871155c6c1f9c88df9768c61581e0b5016aa57177438396be35edbc31002cb2bb766c9b9786a81358e5dff52b9073fb7f9714600c0b1dd060ffa1455fc926d30329925bde76cd68a58896de4719eba84529f76de312e9681cc252ebd4c42b51614b172cdc67a5144e7bee75050f7efb904d52b8c084242c3545269cc1193691981670e0816cb82e39c4541bcc7f5fcd27e46df00e7e73946da7a6f8a7026d89d951a8bc8010132862aa0ab872534372a2f3d10d3edbbf852a43ec06a93b3495289619bf899c10027dc2b06daac43342e3200a1f002ad53acc537772f1485d3b517f4686bf27ba47183df94a8cbd9a5bb0659bbbe43beb2eb05d29a23813b0e6ca8e7228b9ce3fe0de7bda5a0c56e9a5ad4e5e4622896c6f3e0269d69bbf0cc1ffc82278ff55168f485dca669868b97f4a003 Msg = 68b59f9de0146fa3a964bf399cabcbb685145fc727e8f70a81b925d850e13362d52b09ffd8cf52c4eda4db56f6913bfce944b9f8d4276a181e909a880f396dea92efc6a83a8e6889842c5c835c9592d1e2f8cb456ddfb5ded064589ddda2b295286b9e420e39fb1bf566096ad49f165cf7965b54fcf72185229e28c0c307488a Signature = 0f49851133f72670c3aac857def0e20b2c3199cbf04fdb2360afd48a5f4a6d371cd77167e87f34daad9035afa520688f0705931f987f0a9d33dbb7d89a0cd4b286cef04c07b8a5b521ab7881d8a06b914cf416311e5dbc77637a8dd5752f114b3fe65e03130c603ea641252e1efda9cff7477054552174bb211e556eb27e5d9548a63545c01939e63568aac7295c87583578a4a46cb4a53f3e830ae9d09ba135800a97668d9844229b7e7c38e7df08bc9bc7f2ebbe462a43d224c9de34b386e67280350bd9f8ca05859519e07210cfcd1d3983b1d75aaeb9b9fed2d378f8ab233e501353dc8c35e7b573dd041924029bc7efc6a02aff08e2bfb1650da656c0073a04acfd2f3a09b4c41c857622d7bc42b81596157e61a2b8f6174f94af672de4b59e77d805fe5e62987afd740d34ae1e35b8c1b682996935258cf627b6cf85efb758f2d08507047f0aeba1127eae29fe00ca8738562eca3d55084b8c011bce7baffd902921b9e0de583f8979b97d93065f266a7eb546899127b8c287403decdd Padding = EMSA4(SHA-256) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073b193 N = 0xce4924ff470fb99d17f66595561a74ded22092d1dc27122ae15ca8cac4bfae11daa9e37a941430dd1b81aaf472f320835ee2fe744c83f1320882a8a02316ceb375f5c4909232bb2c6520b249c88be4f47b8b86fdd93678c69e64f50089e907a5504fdd43f0cad24aaa9e317ef2ecade3b5c1fd31f3c327d70a0e2d4867e6fe3f26272e8b6a3cce17843e359b82eb7a4cad8c42460179cb6c07fa252efaec428fd5cae5208b298b255109026e21272424ec0c52e1e5f72c5ab06f5d2a05e77c193b647ec948bb844e0c2ef1307f53cb800d4f55523d86038bb9e21099a861b6b9bcc969e5dddbdf7171b37d616381b78c3b22ef66510b2765d9617556b175599879d8558100ad90b830e87ad460a22108baa5ed0f2ba9dfc05167f8ab61fc9f8ae01603f9dd5e66ce1e642b604bca9294b57fb7c0d83f054bacf4454c298a272c44bc718f54605b91e0bfafd772aebaf3828846c93018f98e315708d50be8401eb9a8778dcbd0d6db9370860411b004cd37fbb8b5df87edee7aae949fff34607b Msg = 0897d40e7c0f2dfc07b0c7fddaf5fd8fcc6af9c1fdc17bebb923d59c9fc43bd402ba39738f0f85f23015f75131f9d650a29b55e2fc9d5ddf07bb8df9fa5a80f1e4634e0b4c5155bf148939b1a4ea29e344a66429c850fcde7336dad616f0039378391abcfafe25ca7bb594057af07faf7a322f7fab01e051c63cc51b39af4d23 Signature = 8ebed002d4f54de5898a5f2e69d770ed5a5ce1d45ad6dd9ce5f1179d1c46daa4d0394e21a99d803358d9abfd23bb53166394f997b909e675662066324ca1f2b731deba170525c4ee8fa752d2d7f201b10219489f5784e399d916302fd4b7adf88490df876501c46742a93cfb3aaab9602e65d7e60d7c4ceadb7eb67e421d180323a6d38f38b9f999213ebfccc7e04f060fbdb7c210206522b494e199e98c6c24e457f8696644fdcaebc1b9031c818322c29d135e1172fa0fdf7be1007dabcaab4966332e7ea1456b6ce879cd910c9110104fc7d3dcab076f2bd182bb8327a863254570cdf2ab38e0cda31779deaad616e3437ed659d74e5a4e045a70133890b81bc4f24ab6da67a2ee0ce15baba337d091cb5a1c44da690f81145b0252a6549bbb20cd5cc47afec755eb37fed55a9a33d36557424503d805a0a120b76941f4150d89342d7a7fa3a2b08c515e6f68429cf7afd1a3fce0f428351a6f9eda3ab24a7ef591994c21fbf1001f99239e88340f9b359ec72e8a212a1920e6cf993ff848 Padding = EMSA4(SHA-384) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000147e73 N = 0xb125fc054e1b9db3b98212f53840690607c110bf31e18871fdfa13046496a2e73b3204f33bf8350f841ba94f511cbb2f40587b147a820fd166213968e8fff9fa4be4718a672f4e9321455c56d5e4e09d4f8b2c690718bc46108de269857bb4145c86cc75a4bd55f972285e4054b9fd13927574e63690958177784b39b17083bdafdd3ab8d327dbb9da93fc5cf9375205566242bb30246254ddf04c526f9141006fbaffc268bd2fe9aaa19581bb1c19e77264b08670ff3fe2b543f47a7af95bbe94b99300889b8ff07b2a44d5e9e229e33133b58bc7d2b8eb92a3bb6c035f8891d3165284e9ced25d6ef19a8135d06ab889f7627318cb043c89d90667cb92d1318880107ed9b866b10fa9af2225a987827e866c981f0c4424740fa71697ba9933a91c0d1fe83efd8e7d6c8287de72811da7fb4fcbad42637f0df47482119a07af9cccc993537cefe7892054bc2ce20021e9e37f391ee57b66c40dac49a346a54e6416f4e40af67b7190d65f497febd7d54f148fbc4850cd7de200cbfab53d05fb Msg = d55869d6623971fa7c90b597b40354195106fc488a46bbcdf84812f14a4d4ca93b7a0dd0c1352eb387d2c8d29e6f8fe5701c621ef54020ae2938bc8abd40946f0c97fe2352de24ff18c113aaf3da0e276ed2281245ca1226d4f93103ce96f32e32f8645a7bfcfce618a7bba61b0c79e6357077ace2ad393ee1d498e4e71613ef Signature = 9c2d846eacd75c81b7cadbbb0667f58ec2158c64ddbbc2af078082aea4047e30a59e74c3b5a58be9553253a7d8bd4e527a0daac1bf03f3bf7ce5cd8d20443eee2ee89a78c0692c08e3c452aa48b5aa76b31e00518e435fe8e7858229891ea0c16529ab09e3801b07f3ffbbc54bd821714ee90788d61f60a819d00ff40914e7aadcc596bae30253f495adf49ddfec4532b824e8866e39406c0021914f267e424ffc589440bd847baebf346608978bab8ab4795199ec755ac6151bf9466c5b085812eeda9f16b4dc22fef2908231bfc31211293374ce6f7d681959455c4cf0b6660895dc128a5bdc8445a0811f2e372123e5a21fc0638da5f26ae270930d2e096c6aa2178a4d84040e3de195cdbcd6940cbac0df96ae273a232a4c5a3fc2a2bb7e7b12e9c49d95ea2458cc7cf23ceaa2c8ce423327de1ffaf6ea6413a8843316418c2ae714fcd07f75c0e557c71229c137e0160eba1c29f2098245a8623ab1e05612485d0764448b2149ba1931513dd31b7ceea80549c26ef166d0e3aeecf7bf61 Padding = EMSA4(SHA-512) E = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a649 N = 0x99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285 Msg = cc21593a6a0f737e2970b7c07984b070d761726296a07e24e056e68ff846b29cc1548179843d74dcee86479858b2c16e4cb84f2544b4ecdcb4dd43a04bb7183a768ae44a2712bf9ad47883acc2812f958306890ebea408c92eb4f001ed7dbf55f3a9c8d6d9f61e5fe32eb3253e59c18e863169478cd69b9155c335db66016f96 Signature = 0aa572a6845b870b8909a683bb7e6e7616f77beff28746116d8bc4b7335546b51e8006ed0fc9a0d66f63ce0b9ebf792d7efd4305d7624d545400a5fd6a06b78f174b86803f7cd1cc93e3a97286f0ea590e40ff26195aa219fe1510a016785223606d9311a16c59a8fe4a6da6ecd0c1d7775039290c2aaa17ed1eb1b54374f7e572db13cca3a638575f8004aa54a2fa98422fc07e43ad3a20dd93001493442677d883914dc74ec1cbebbbd3d2b6bad4666d91457b69b46a1a61f21298f1a67942ec86c876322dd366ed167814e9c8fc9040c5b4b7a859bbd880cb6bc241b9e327ce779e0783b1cf445e0b2f5771b3f5822a1364391c154dc506fff1fb9d9a35f80199a6b30b4b92b92619a40e21aea19284015863c44866c61ed904a7ad19ee04d966c0aae390636243565581ff20bd6e3cfb6e31f5afba964b311dc2d023a21998c8dd50ca453699190bd467429e2f88ace29c4d1da4da61aac1eda2380230aa8dbb63c75a3c1ec04da3a1f880c9c747acdb74a8395af58f5f044015ccaf6e94 Padding = EMSA4(SHA-1) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd157d N = 0x96410d900ffe9a71d348c210c0dda7ee43f92e8a31ad876255dc540ff239c236b998ef9375e695992aba77861bf8f1cd966e3af1f9ca874618d35ecb494982f7c05df134f5ce5853d410e670e0972efcce2fb14b2ea6974d4802ddfb5915d23752480f5def2e4a858543918d5fb47e837e5f6564abba60745d0ed710b713dea6b4302a6b56376679435ecd62b9a03c5c7ccea920fa64715c0b554b5108abc20583c1c87c81e20b0ccded165e581791bad0760140540a8c18b0a1adef5e9cda29fb959652cf68b5da128484e0c837c6cc017a7741edb301891e01fc28b8bebb1167d07c2993877a62a8bf82471e7130416fd825e5deeee26bf9e3e5b9d4c8869240fc2ea09ab7547668deff741b9dadc6304c467ca896794af09a1f22eadccd526c2eecb7a3138d78d8a12b0afc2132fdf5ac6299433dcb72ad40a183d21bbf5e3fab66b1b961016d9bb5af818ee381653c3c7216e308bfd19ad0224051e4b569bb27471b9303eb9c0d4a0f684dd86b1cc91d13c025aee06c97ba89e02b0bc6ed Msg = ab73de454dec96f7e9435a968b1ec3a7b5ca806cb1384c0726461de1ea409e4d17a7e06961314c45a610dd48c7778ccfb75b0b16d177b55c6f92c642b804c775b9774d8cb8ebe334c4fd458a9168cfc883cc342409ae73f52cc0071868635e92ba6b8d76fa22420a6b8ffa2591f874db42a5655c00e76d1a86594a2aa1664ced Signature = 518da26aaed8f7d3ae91b2556e71586e97adedde3f4ff3e641892c19d5a5419c96214ed32f9095960ccadf7464af214c964fca23df2adc194049ff1f7685136a2a7e033f297b224086547e8169b115ea7796b6b0aaf4d949de198f9404acdb2a1d229db9e05080af35910e805efd6151e632e28a057de7ba7b01fb1f4ae8e3091a720eb7dc2ca1e2d7705195feb9d74a58afdfb3530d988df70adef2d474ae1e33c9c2b762a7222748e6b9aef284c543dfd8fec4474af4298f1372d9ed79e9f920210d7b8c43abc0a22acb6bcbc75607c53af746517ebc5fd1f8a560d64595ac7d07066222c355b211fd4891b8ca3b92b00019d32c4a9b80f2cc52bd70219cc473baec785349dfdb0214b01ee7e1c618d8c851de0c3c8a9d3c20557492355eb9068163e241ab9f335a2036f0471424d8ea5e80d0bc951fc75087d5128c13ba022d8b9cc02a54992bbef119a34b652c707c2f6d362b30b2e0065ef5177f6b3d3b15d0117f82c54b2ad62b26ba8d9958c2227afcadff47e5e77ae7755db69f6689 Padding = EMSA4(SHA-224) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c6e57 N = 0xd636bd164a6ba07108e2c93f58e061657bc5cd2dfe1a72e75b33adbdef50bcbd74ff0f6f074dfb0f9f25879d1bd6cff2d8bf354dd37f89c638921071af961ffab7559189bc18cc8a8e2a1867721eb914077503adbf08986272034bb1dba9333a886962cf19a8580b25463b0d71d3d41d0bd74c4f77da0bbd85204aabbc01506737503b3b99e0203658136cb8ab0cb62929b7c3be4eb03c947c85faac147bb148086fd59a130e545520c50e2841fbc0734b1ba6f98514cae15d7ea3ec4415fb20b7fb1eaca5db849d286414ef718f3d20dd68dfd440e042f84732afdd0f02f98f925a0f264cd37c67620285ca59be9e138a836730e87ecd754c7fb28ae75f8e24e6d14e41ba339bc801459d2b76d8928f12e8fb7dd3314fe4640f99f6dccb0e16be09b796d791ea0ec92301891a2f702bb6de46ef69b484449e23ae8cd247e7ce10bf3be855daae033d640e8dfc0e6f12abcd6e0479b29439d99ab135aea06178174a1b7048ada5645182fac8e018584fa4250e6aeb4317454e86598fc4fae0b3 Msg = e883d8559b04cb610d3000d6af8887d72bd68e293fb7d5ddcc5762302a7c75afbfc6be9fd035ce9b96ebcc7f9533698529c315ae623e746411fd0b5d230f40c22e7e81914ad4c34022de2ea34bb0160fd4e92ec01e39f878ed208069c0f84a555e3589f4b2ec9196d8928f09780778bd53d23f261baf4b628847281ca83e7db0 Signature = b0e596b45e09da386bacde6ec9c44e8a3aa54ad2d413c941bfa077de7b3838afeea98eb018ed40be73f5f8d617a212bc9eca171781c6ec837769d587450f17cb6a1bf594a620dcd254e0909a9ffac9814fdd4953b885cff3f099ef243206dc3f7c127325ea0bba1ea3341aaffcbadfee4845ebb55e3ad97e78bf41ca41eab4e784b6095be635ba7aadc5b58d702aa80fce64ff6252cda383557c37afa78148879e0dedc6d3828e8e8fabace3885f9f55ae887c44e935386a3d961fa7be2babd8716edb5dbbc0e587ba06a78e3492c6c029813a0dbead055c8d75573d70c3db7a087c8fdbd8c8da35ac2dc15f6e8f21df1e9f25d84b9ba186b3f3c8ecad13eacd98b18cb8ca2e312f1f7c7a719b184a524b003f22e4c504b2c085c85ffb1c035fc0717d1928922964bb837ce9ce4171cfbf09b6580281f7f8c0dfe0008ec4708352b47a0d812dbfce18fc564c6d1b0d5756848b08772c33c9a0052e1d50b4d9cba51e81d75ed097b6c29a0dd6ed5fdb2cf417eb0c1e09cfeac75149a38268821a Padding = EMSA4(SHA-256) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efabb9 N = 0x9c213ea373631f572e5e46225b95a0f5ea8ab0a5ec7090a3b0181c5906dc22fd1bd73d11471242a2ed1824e601017f5b5354b92fdb43d4da00a82427d05366a4d552c40d69d200485d5d5db83cf523e61a834b40ccd401087fbb93d81dbed7b2ee2381a1241ac68f2afc02157ee0c73cc66c02a6c6eb2dc35145ae55d7708412a3410f204c492376d6315cedf253af91f31dcab34f72c206ad81e800509864fe9255d046ac25dbdf4954d2350324722e73c1f25d089f87542ad907fb37eceaefb330f4325e97f5eabc04096a8fabba978589e355445d9543274c1c38ff849ba8c2911f07030634c132ccaf4e4f57a5ad9244f5df0ee25af8ef2fc7b29fdf7cc18404e20efaaffa451ec41ab838d594906ff2cad52dcbd0e9a68ef7b06c253710e1318d09ad07012767a89124177df50d1684679e14306889d9a7ac5143d4861b7d6ae77992efa73e0aba9da0ad9a6888bc804dbd07bc26a8a5dfbd292a0efa96867fdb92e845c36e3433cf292e0e31662480257fcf466f7f65d814bb3e33992f Msg = 3abd43f1d741ddf0b752dd94197ab656288ff465e5dbccec6179f8932f02c248196a5e3f12247c376c8d1e004b87a73a5a64355fbc0731044645255beb91cdfd77d970e681ab70c19a9c2167cbead7a23f6043363c7aff2258ca6723e99aab7abdd322ef0b1ee116aa488dd181eb6d163f4bc3f24c7e5dceffd067f211658347 Signature = 4740115f251b35cfe19d3816cc1fbf02b9a4d9470dc62b41cdb72284c30fffd34e7057559a73b44ac49fa7285f3e9a680bf1949562a47f01bfc55eb7bda9e291c9a5ce1a5d7b619590c0e1bd36943fa41b9cc9b2a3a742c2942c53ec3e45c77176e4bf32b7101ab4b05a996a21fe12921841f8f0fad1e71bdeff5a7f53e8766367311a98b9d8618a6198aa1662e587332c24283f9ecf2bb2d825f597d18256ce9c5864f1ffca37c4ec8df4f945cf22c974f5ef3dbb9f170b3978bddcc91b13b9e8550bfcdb74ac7349d531e1e3280fc005ac34c03608993b7876caf27c8bd5a97306292082f77d9144005bcd1046f27303185b6a7cac539f1e05805ee8d0772f37acc3e7fa0920171c19ec9266c4dd6d9e51766c4433a2831c3e5fb7d84341624ea9a25e1a2eb27ef2c7e8de491d94d8a8a31919bdd7cdf6073a1d88f452ff8d15e57cf6504a81843c24351c61a373b73acd84c76de916f290e0e9bdf51d8ffa63f867af587b5c759111671079ea28846466cc33df7683639d018337ebe13cb8 Padding = EMSA4(SHA-384) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0ff7 N = 0x9e428342d2e3633965aecb89b0ed65c619c47fadb9a9017fc18c3d1837e5f6b4d0fddbf05bdb00b659bac9645f02c78f05e62d0cf57b977345eff5df2066e0eb2ae3af57ca3d0fb0f6a475fc36dfc6e5870b3ac5d850e2849fc32c9b16ac3b68d2f815e8c44d1418cf51f860356b8d409f20210cb01c2cc7e109ba76f6c43f2096876d4500012d8ed7dc1c35d24eae1ecf406ce3ec92606623adb8b9e17c3677c1fdef1a54d9442a9d990c0733f03b31633b11fcfa8c9f2b1114f307a811657e33d285093f4653b3ea1eadb28a792c835f975896996bbf029d1f688ad2e0b978888b07c3a12303fed92bf3fc6db29837ddc7c71292abaed99f3a0d7e60b15d9f2cd08d15318d70d35a7b7ff2fddb22d89cf261b8ba64242ba4616a93ddce2015977421d25f1b3825155746bc13f92a6097f7f66e919505af07706008378597af3e70c7fda3e9c99a763aab19ba3f459b12e8c1ae404d5091d802ae0dfd6b3619b97d3d964daf1de600b7446f8a7bfb3f4956a6d1fe967089bebdcc9b4ac7b905 Msg = 5e91f67cbbbfdfaab386b3ecf5f02aaa92d48ba0a6f06f913b37c73a6a6c2086c3f02600f0d9678d94435a5b79eba015ebfa89595f1eda6b59dfce2b8c315a444245b5a7fea518386080c3c64a4240414168eb271693b240c5db1a8b9d658278a138ac572f4c7911dfe4f416ae1e92965cc9b9f412767e7848d2b344e6332189 Signature = 56f14f6bf965b67d83b1401c8b23f4355c0f9c0d1db670f23c89086ec627df88fba5affc742661b0362728f83c447474348ee700ad8d58fa48e4a65a1d5bdbee40da7576d3b5c7071fbc9d9f98f083a9ad9a1397cf023abb81b2b0998db238a053fc4303c057ea27c542013e5cfab46bccfec5abaa3887f18eaf2878a114e5c2ef6957f4297a7b6ab006920b2c4b0ec53ceb8539c6143245bb357abebdcd699219e5a617848ff3eedb931373d3ec38a067685848c21be6f787f609b482363bf162b7df1db2f579041bf8349c34b88e48a7dabf178a3fff29dca6af55c45b4f94b24c68fde29f25f258cb3c44c8abb460c4276a5467e8547dff71f9ddf806d884f34451cb5adecdf854ddc8004fdb0bd301f36218ac78c37f05000dec91248c16fb8fa24d60b0b224638721f54e87137125bc815b2adab635b596890288fac155b613785cbf52582f81159212230bbd7d9de687b890d409ae477a61f089a174d4dc7b90bd4974d0b79b2e828d35c853bcbc46cba6a3a31b95d631af2af2051fa6 Padding = EMSA4(SHA-512) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098ffb N = 0xb43d4a446de45aa8f336b93a4c5923f3a5386ef8dd1e94c42300de0880e9bd0828fb32e36e4c50cbf666037a8f2e05f45773896c10aea975b3dbf4c4cdfc24a038c5c06d361baf84c38fc22c03a36b9dce38e090111d9c1323d7a77d3e04b713faf740965a9e1883ee3775489ab514ce480786f9eb741c60ab896a9d6eae3a53ed9268768c21f79e30759e0b01ab7fa224ea8229c293780058f258e9226d7374ac425ef1d2b6e06e5b263df0c6d66c00ed26cbf246a5af0a0163336886ef8d929b37749a08f0ec1db05973a8afc81778b6cc9106f92b1453f1528697b1dc8dd0b255e801060fe179b2d10a9c4c3e13f3c56fa6d55166f6461af4aaf4f4168fd5ea6dadedaa3f9f1de4de993d8844357c0af79a090ecc80570c641545beb42a1248a52de612f2e0f8834496331a7354f7eb91a1943b5cb3b6cf198451735fb554922f04f009a52a15d99369adc2e46b09bb871f4f3ec1905acd792b8c81a3d74b316ff9d20b93f48817ae618677dc9451f582ec9995f44552f4244953cde83f11 Msg = dddb05cb9bf10c14e7dd1e9f3b3d2b329a17f31676281011d2783794a432bb347db3525e6be11c471fbee1234b3d9b974e543470135290953673ce3a69b1cb5717dee85947f00e17c29cef0778268eb2207701651f70752aab7e74f6306e6324f2834f22f5c6e96b1a9eceb58aa00c6b57a8e25d6129c8b777c1af2fbf118a83 Signature = 11107c6da7a76dba8ce8de3d5c90c6bccaf33fb9a7ec4d40a97fbcdebaf6e65c095b67dfa171c54a3364a6ded718e1bebbb497d15f1de133b58297e08c1b200f8466579cb8e9c3dbe5f724282e5bb28570a41d8d35ad6e131eb2a1d329d8b08d10faf76fdbe74217a276936b1593b1d3a11891d18641c0bee0c37e68bf75add9e7dcf3b9b4413fa3ec90676038161f68fe3af64d69a16fc22c8ea7c06f86bcbba6679b6fa45858c87ec2da8896920dfd77fd16d953e984624203cc2178d220fa47ba9a6ddbe759db3dc4224c7ccb09b29e200722a745d3329209323a082a3f7a2c624b4053fa42183dd22b7f49c4569f8c3d49515753b993ef8122c36985e96a3289af8d6e22934bbcf7551b1570923158d1b554c13f4fe08faff4898be92f6e66ff74a80b13703e0d2665db715c559e68bead6f6b7593f02efbd68c676256ae8695a51dab90e32986697f4ede076628176ca6b651918d749fd01a16a87adaad4aae93b8c05d92565ec68217aaab967623da3e5a5095642cc17d730a6d959cfa Padding = EMSA4(SHA-1) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a996b N = 0x9004e5334381fb90f60926f3281e51d363671c87bc10554aff5f3b4391d894a94866de27900bf627d468dcf19a826dc399c0580883c945688f3795522193b0887f5eb29bb7be2b6ab48abb2e86b8a3cc6dbd2aa3522c0fa6f6493679a25b1933de78282b00fb5e6dbc58246a26805eb61cbacf492ffee3a21b829e3b776dc814b0e1527565f713d8f761fd58b9ca1f20b79d798f627b77a1ed7d53dd17f429a738e3e4e86cc4da308c60e55b77f2d180e96f2da0ae282831d5ab523cbf2aac900f6c304366738710152efa1094232dba6d405381223f3c687dedd2d856caab657ad0a1d7a67f01fffe6903f173faf1476b8ca656d4d9af713b4f80860be5e79ac3bf1b507f46a19bb67a90b273a0f0d416c479c8d75c6c99943ce774928fddedc00c06d7acc68ea15828de379ef436ecceec8bb22ea984eb1af01dc3efbaefd031030abff09bc464235f407c8a9033796d87bb6373ba6eb6ee143a79703a8130b8e29bcad3970c69001d80b4dac9e30fc616ad9bcc215fc20109aa7788234099 Msg = 6f8c5ab0de743f69bfebc93d28425330dfb2845b644e738731350ffa400cbf91ceac450f5f17e8b502b1d213d6adb71dcdc5b781b02e863863cbca5b6ba1c439ad8b33a6782e7596c630f0eabfa5b0897fca51b319f62092dccd7d12d5b784f39491ec1d33a22e3395d0ea6aec13879c7e2b1b98a88e8abd23a5f1c7863745e8 Signature = 75ca1d0f756cb322ef458d0421af9aa6d0425c52864322129c63ae30e442e03342369283ca78ef95a29a2f58615847bc9a0f73d6ec8213d6863c30b84d56ea31684e6ad27b09a96bd8bb39b5aef2b25d40d3a7e1d47b3bfd6edd5170a84e669b7d5f7e81810280e41089ff7e4bce718b79d116c9ced7dc1e7ed6256a4ae480e9ef3e3af95de3ab5dbeccb5a36e60840b646ad418ed71c548fd68439e8098e63e55b3593a453cf87e9b8d7ceaea8cd8145173a6b36bf4c6d8b7e7231d3391440227ca8388d573b34e4838cd7e0a4402c45bf58c16120b6093686309c0cfabcf7e2f15de230289f59f5f9cf12841c75815b2da9c7d4f76998134d8df282e2a42cceb28d4f29740434422b1a8e7ffc1ef42383c4a31073421b034f709f6192308367d4f7283d068d4f128fa6574a2a305ec7033368923918ace1776cba31bde0bcaa833b5a9bcada359b26157487fbe01bd94169de91a1c45d928ef69de1f91b231b0b43e8d827d4f08ba15cca460525a03c4e381a44c1fac3515bb3d61a8d520c1 Padding = EMSA4(SHA-224) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026a07 N = 0xa5ca328ec852ed50cd50ff2e2aa25a99905b8d8dcc6aa2f2ae651da27e21e60dcec641be2f850f603dd15c763b1f7868dfe49392cbf0ed1410b151c501a627994efcae1a332ccf0d37b966a99f4d6b72659cd9044a72b97ac3e00e1b752bca194066c60dbb870e8205b0078551a41bc7a36424dcebeb26e55618f9b27c630a7c0f5bd23f5175621867e100f63d8c07d9392c5638576b66bb4bc89682c66ecef97f378595ecf10406fcb75450bdd7ff558d9eb2e76ad4fb7c92fe5a946cc95bd14f81f7fb7e6ba15fcd5c73b5ff41588a5c8acf1ed1dcae4dde453411ec26fe8faa3640dff3e153ba39c766c9f99c05a023bf45a19b30889d710c3fb528fbc147fea1699bc38d3e41d11bb1faab7d9e850f0c2b0893b5fe3a2039e6d8d90f280faed4d7fd34dd2a886b7a0bf8889bd75976d4ce412b7301e88eaa8e1e9bac6d0a351e7c8391b744035f2dc1b8cbde6f99484770b81828d6e1fab40a7e0d69ed798de7c2f80ac750c8243af4b2d4986223d9a33a34dd2d6c36b624545f6411d3a7 Msg = e28b42777e68da66c97814b91025c3c4e31310e1c500c97027effc1b9885c55f36b364476895927bcf9a167a79e6932458f4a47bf3802aaa5ca4e547624142d507a0748d3559c65eac7430323fcf287340bfbacd39fadb36dcb5fb2c3d09d93e3f9b9bce4c7c1e154a4e8b68caa92bb982bd7c60fd38841c916a655492a632a3 Signature = 7cf8440fa34025c9811aec02028bb2b7f3674aa29e755b8850b43e0ef297e08925745003740417be744ed2d69189dcffbf76026db75a5210c48f55b894e58b467e415275564e9e919f924b3272ac21aa152b865303975d9c3dc7e0c1fffeb60bb0e7d1e1fc159d85f69bbd19555326f010b3583c145989ff0b37e22f156ea4b67f31b918d263b337d4d505c03bc09109cd563a3b83ab3d9eddbe83c1eab35f2f861bcc8aefacc53d919f9f3d92fba06b52b11bd91adf5f91c883ace20c528a6210d89878ca1495a44dba51e8544300649db46e2a7e5d05c165ca7f684097540264fde41ff4fc9cad42b2a669b9cdd17b168e730a4de41fc0ea8faa07eaf0ff64b3279b2bae262e78ce317fdaba6c2f8693296e2a2b74d5418b5fc7e2d847b5be7595c69bd7c4e0a4367325411d50273ba1708d773fa07209f92ba4d89aafa46a6583412aba1fab691ee1ee0994e65ccbb8f31ca1e3b405636a24648e024b3e523be241919511e044adb3dfdb56836c6cf9f07090b5d1f729ad1d38f3c07eed85 Padding = EMSA4(SHA-256) E = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc92f N = 0xcd6141e4c8dc6997fc65300a6e2c746f391022f15661231a832be966aa498e678777766944db54a599cd6ddbdaf7533f429e6e1197b7eb061913f50b09be04ab70b1b702fce9ada279ea8089677a37701e64190f243dfabe7cc254f08a6143c9c589ac4a90881c0d2b62e98013e92d049ee9ca11a425ad450ec5a699ae17672d86efde3fbc81203f2b500ef41746b9e9af2642b30cbf75e7889e500836d6dd32bcc5d8b69021b764a591d6850776cddf0b7240c75dda9e2d197f2cd9c6787b16445b55eaeccdfdd17fb72d7fe5189aa1a2a6ad06b4f2bfc8f6c91c3a2a80a83a3113e0b420b70654d6a5075d38d9a12d1e0fddd2cb23b7f3ef949991bf49048dc40020dcf042caf00883363591dd6a90789ac212a0ced95fb40bcadaac2c97ee7ff302c37cf2aa7298311db85a2d4d1b9f037023c21bf2e9b9abecc780a70cf2a54002634272d7dcf25ee4c7dbb04437f30f50bdcf4962d432484a5dab7b60b31d8025b984c821fadbf2b623f2f92a6531dce11a1f252e603016078f3986e081 Msg = d1acd4a6035f23bfe67006132a1cd474ef58c0113670f53c95eee57030bddd92e48edd77c57ba8a7cbea1760c8b5b2de9d8881daae8a2051933f128611ad574a48bd417b2de583cb3b048bc2668d120751e8f1dbc01536e650937736668066856501a6ba24e4ddb39f840b42eced1a757141b61b555b5e8334b1bb87177f31c9 Signature = 55613f64331abd971e822cc3d972f67e782b6af81aac0b80e2f6324da6d9f33c46f8b7e24c94deee7e98525aaf4ca6843753df3d444e1e0540f9c196ffbbcb4fca7aad4ba94288f911650e3caf6dd22f87923fa4b12e2d6b115f2fe773af2563cc760de88cfa6e16878dd9c07f0d45b10a224d1a7ee1d26ffadfd38b78004a2045b35d9cb9fccdc715668a7401db7adef109ebcaafc5269d377c1e8f7d4292459c801a93c4d07ef477f87175aa35e002a03c2051985fcb6963e9bf96e28e55eb52a3554475f9095f24a9e422fa84b60590e8b8d6ec91dcf6a584cc8a934e551befeedc0f0f48dadf293f0f9260ee22d72ea46e271045b66516b2bebeed52722aec5f084085f8faa689308bc13fa5b9e5b0aadf2766258e01d4b8ddbe0d328aa112237ec10b115be83fae8a0113f8890edab79d0463c9ec6e2db4504693535dcf7695f84425e9f7b73e4f18bc072f5131989b0cdb07f496f15e562d07f0711cf979f1aa4d140d9783efd6f96c41fe5fb79e5d5d689dd5a705f1ff837754031a39 Padding = EMSA4(SHA-384) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e59685 N = 0xa458e38be5e581c433d88dfe24e7e1bd0713bde19fd7dcd794b4fc97ac6546fe7874ab10783407221aa6a526de912097761a1f0a10166cb368f5af6a60a944493173f9d9e04a9061109131de32ddb21f06c571ea83aa42d9c172d0ccb79fd0bc421dca68179ab6329d0af92b8d2caadeeff6c0a46a6bccdbdc46e7afdfb6dd8b1c20695837cff9a153b5ad8b6fc0344006c3916aad0f6f19d84fe8b93bd6627331283c090a7096af3139c714fa1045ce449ac953d7068db92ecd2b687b0902509cb5ac0bcd16c9751afc847d0164f5add3c038efb41e7ba5fdf8567446aea2c9d7252320e5503ff0ff236871541c2590a5d4c1ba9a315f885d732fbe15c2f5bd5d70b158fc33e30a44b25cf56ff600003369a935c2e017a3984593b2beaaf9af0e6a5c9d19bde051ef1fc5bcd63391488f410e8a97cda45bdd9233e8401b5f5fea4b55d091605700a903615c5f8b6c18281b5f3d77b85f087822ae5ea14ca26795504abd011f42de239f3170afda6ddf17f69470d46034aae629f8ae2f9d0d61 Msg = f6f47d4bd1da9f9fe5b02b1867a323fb96c9d6b14c650f25d3668c6ef930b1ae679f7e3a2e49bffba30482146da9cec4dc17928e7d7adc98ebcd4b52e79dc757ab106f987c27d3b77f4064b1cddf29c0c9adb380b2c15250741f89fbc47ec0986b4f39aee2fa459c206bb838b0cd9ab706951fcd13c3d91417642db2b75c0437 Signature = 5592798437c8c3a7f2d02b41891b25d9b81c8bd63a7e539477a9a995f19438af7cad25645ec908d3fc00ff47a7d2142241241a90ba742eeff3b28889b80209d30e3a610007e646954bc78ec5c8016421ebe7bbabc7f65aa029105c2c1f12fedfcc9d57864c5526018543c9de3fac3ab80fd9c7cfde719c79a63f94f813f86911e21b6de23aae07e77f13905af8f118b53bfb5c7c64225f2f12d0f16b82d6c18450df655176b1f4b804af1cf266640f7b855e2b63dad7ee4ebca63c450b66790c1845c484fb2bcd73eede97b8b722a96387cfe4f2fdcd50e35b4e7de29bc28094d7915f0a56673d668858ef90a58fa76993ba3861d73c10a8d37a88190ac4a99589279b31d156750c275b025e7866e69e796c037629c4d154b0f0435a99af8847d6cbae073b01965e7ae3a0ff3123d81e0ec03858824a3cac04a9c34e95989fd5c82d89ff40aa3cae21e04c68d344eed7bdd61ca92ef1c42ae40b92a66c55e41c0d8802acc4d226d0d684fbb2f7370751babb974c3dd3dfcd6e348a2c22e006e8 Padding = EMSA4(SHA-512) E = 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3f57f N = 0xa3f2235ad2053b4c83fa38f8284ed805421621fe98845fb01b689f5b82b32511b6d16173e7b40a66a3a999c189beb9e06822150ac8be677186370c823b5277d909de07564e281cca2f13873d9d07b7bd85a2b9ac66f4ce4f5e38b8e9eebec04c8caf311e375d69e80851d559b8e90e85ba6b96476790f727c25aa8163062ec8543fcc7759be62c7768ecc37f340bb06102762bf0441ca1aa2c7a81bf37dc8b27439d3abba93812c9bb44fe4d6a94baae709379f5ce5d0c8f81d00086b9caa3026819588f491b525807899cdab33d8e992150d2b105d3aab615217c6a3d740831c7dc76faabd9c9b9817ead0b494566de1433fff5ba4604c6b8446f6fc35e746aff84ff8bd7500410d10e82bf4c9036489de47dee9a327a5c4510d8561321b91d55559a4cba85e0c361767084b25217e8a63c4e151a1e88689feecffd16fa0a65ae41d2babca99cf1b959c3c076c0f75974146f2cc494126fbecad4217b9aaa00f169fa512527ff5a0b50da46d6be870ecef2af7a1e6c4556f6f7a0a00b9f47cb Msg = be2f3e1dc8a3711570401bd535185426944d094e8481a12a438de07d54760c88c99d4fdbbe355d6a26fa56e3ca20ee3f8e8acb98f63d2f3aea14d6fcb6b522d155c3759aef56de3ea0a8f9fd7b111001cf358636a87c765c99c2975bb95063d6ec0b780264ec3eb967b0caca52d10294deb402d3a224bfb9d9ffea41662f18c0 Signature = 787cdd6e1d4fdf9a0d9f965eb85725232a9efcc12abfa1ef25a81e0983111d9000d494fc7d3201eb3bba327302727f7086147a755b4827030c7276536f425593ab2e9127a149e754de7ad77f8c2043267db49f8a35031d83f13d140d5df4d424b47454041a23b92ff6818e749d65d01fc50bebf69152f3f5fcb4873b1036219e22b1e74f8368c8c501ce65f2c929d90a8ec899630e802547a7ca6ef18ab3cb3eb4a691ee68aebeaf1b9c055ad12218039cf480cd8d294332c5e16ebbe6af11f8f4bf49f9b4ed2f511126ae780a3b784be8f4426abd17f8600074483f2af3b71a8964c6e0fa00049a1d940d34cc08839e0c59253d99e90d17871d489674695663626166d36ff91d8c2299a2f051eae2d60e8ed0bc3fac1e490b470c12f3d697f6fbfd880de2e90e9fcbd485fa3393198372fb01e4cec5c15917ecdd42e57c43ecf55a8c0ecbdcef1bce4e36d96d46b112570b53f82f3d2064b08ac78613670a28ea69d79c717eb1c294090dbd561fa6e504d09d265724e37a2dc6f445f6f528c9 # from RSA: ftp://ftp.rsa.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137 Msg = cdc87da223d786df3b45e0bbbc721326d1ee2af806cc315475cc6f0d9c66e1b62371d45ce2392e1ac92844c310102f156a0d8d52c1f4c40ba3aa65095786cb769757a6563ba958fed0bcc984e8b517a3d5f515b23b8a41e74aa867693f90dfb061a6e86dfaaee64472c00e5f20945729cbebe77f06ce78e08f4098fba41f9d6193c0317e8b60d4b6084acb42d29e3808a3bc372d85e331170fcbf7cc72d0b71c296648b3a4d10f416295d0807aa625cab2744fd9ea8fd223c42537029828bd16be02546f130fd2e33b936d2676e08aed1b73318b750a0167d0 Signature = 9074308fb598e9701b2294388e52f971faac2b60a5145af185df5287b5ed2887e57ce7fd44dc8634e407c8e0e4360bc226f3ec227f9d9e54638e8d31f5051215df6ebb9c2f9579aa77598a38f914b5b9c1bd83c4e2f9f382a0d0aa3542ffee65984a601bc69eb28deb27dca12c82c2d4c3f66cd500f1ff2b994d8a4e30cbb33c Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137 Msg = 851384cdfe819c22ed6c4ccb30daeb5cf059bc8e1166b7e3530c4c233e2b5f8f71a1cca582d43ecc72b1bca16dfc7013226b9e Signature = 3ef7f46e831bf92b32274142a585ffcefbdca7b32ae90d10fb0f0c729984f04ef29a9df0780775ce43739b97838390db0a5505e63de927028d9d29b219ca2c4517832558a55d694a6d25b9dab66003c4cccd907802193be5170d26147d37b93590241be51c25055f47ef62752cfbe21418fafe98c22c4d4d47724fdb5669e843 Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137 Msg = a4b159941761c40c6a82f2b80d1b94f5aa2654fd17e12d588864679b54cd04ef8bd03012be8dc37f4b83af7963faff0dfa225477437c48017ff2be8191cf3955fc07356eab3f322f7f620e21d254e5db4324279fe067e0910e2e81ca2cab31c745e67a54058eb50d993cdb9ed0b4d029c06d21a94ca661c3ce27fae1d6cb20f4564d66ce4767583d0e5f060215b59017be85ea848939127bd8c9c4d47b51056c031cf336f17c9980f3b8f5b9b6878e8b797aa43b882684333e17893fe9caa6aa299f7ed1a18ee2c54864b7b2b99b72618fb02574d139ef50f019c9eef416971338e7d470 Signature = 666026fba71bd3e7cf13157cc2c51a8e4aa684af9778f91849f34335d141c00154c4197621f9624a675b5abc22ee7d5baaffaae1c9baca2cc373b3f33e78e6143c395a91aa7faca664eb733afd14d8827259d99a7550faca501ef2b04e33c23aa51f4b9e8282efdb728cc0ab09405a91607c6369961bc8270d2d4f39fce612b1 Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137 Msg = bc656747fa9eafb3f0 Signature = 4609793b23e9d09362dc21bb47da0b4f3a7622649a47d464019b9aeafe53359c178c91cd58ba6bcb78be0346a7bc637f4b873d4bab38ee661f199634c547a1ad8442e03da015b136e543f7ab07c0c13e4225b8de8cce25d4f6eb8400f81f7e1833b7ee6e334d370964ca79fdb872b4d75223b5eeb08101591fb532d155a6de87 Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137 Msg = b45581547e5427770c768e8b82b75564e0ea4e9c32594d6bff706544de0a8776c7a80b4576550eee1b2acabc7e8b7d3ef7bb5b03e462c11047eadd00629ae575480ac1470fe046f13a2bf5af17921dc4b0aa8b02bee6334911651d7f8525d10f32b51d33be520d3ddf5a709955a3dfe78283b9e0ab54046d150c177f037fdccc5be4ea5f68b5e5a38c9d7edcccc4975f455a6909b4 Signature = 1d2aad221ca4d31ddf13509239019398e3d14b32dc34dc5af4aeaea3c095af73479cf0a45e5629635a53a018377615b16cb9b13b3e09d671eb71e387b8545c5960da5a64776e768e82b2c93583bf104c3fdb23512b7b4e89f633dd0063a530db4524b01c3f384c09310e315a79dcd3d684022a7f31c865a664e316978b759fad Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991d8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1dfd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f105acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137 Msg = 10aae9a0ab0b595d0841207b700d48d75faedde3b775cd6b4cc88ae06e4694ec74ba18f8520d4f5ea69cbbe7cc2beba43efdc10215ac4eb32dc302a1f53dc6c4352267e7936cfebf7c8d67035784a3909fa859c7b7b59b8e39c5c2349f1886b705a30267d402f7486ab4f58cad5d69adb17ab8cd0ce1caf5025af4ae24b1fb8794c6070cc09a51e2f9911311e3877d0044c71c57a993395008806b723ac38373d395481818528c1e7053739282053529510e935cd0fa77b8fa53cc2d474bd4fb3cc5c672d6ffdc90a00f9848712c4bcfe46c60573659b11e6457e861f0f604b6138d144f8ce4e2da73 Signature = 2a34f6125e1f6b0bf971e84fbd41c632be8f2c2ace7de8b6926e31ff93e9af987fbc06e51e9be14f5198f91f3f953bd67da60a9df59764c3dc0fe08e1cbef0b75f868d10ad3fba749fef59fb6dac46a0d6e504369331586f58e4628f39aa278982543bc0eeb537dc61958019b394fb273f215858a0a01ac4d650b955c67f4c58 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9 Msg = daba032066263faedb659848115278a52c44faa3a76f37515ed336321072c40a9d9b53bc05014078adf520875146aae70ff060226dcb7b1f1fc27e9360 Signature = 014c5ba5338328ccc6e7a90bf1c0ab3fd606ff4796d3c12e4b639ed9136a5fec6c16d8884bdd99cfdc521456b0742b736868cf90de099adb8d5ffd1deff39ba4007ab746cefdb22d7df0e225f54627dc65466131721b90af445363a8358b9f607642f78fab0ab0f43b7168d64bae70d8827848d8ef1e421c5754ddf42c2589b5b3 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9 Msg = e4f8601a8a6da1be34447c0959c058570c3668cfd51dd5f9ccd6ad4411fe8213486d78a6c49f93efc2ca2288cebc2b9b60bd04b1e220d86e3d4848d709d032d1e8c6a070c6af9a499fcf95354b14ba6127c739de1bb0fd16431e46938aec0cf8ad9eb72e832a7035de9b7807bdc0ed8b68eb0f5ac2216be40ce920c0db0eddd3860ed788efaccaca502d8f2bd6d1a7c1f41ff46f1681c8f1f818e9c4f6d91a0c7803ccc63d76a6544d843e084e363b8acc55aa531733edb5dee5b5196e9f03e8b731b3776428d9e457fe3fbcb3db7274442d785890e9cb0854b6444dace791d7273de1889719338a77fe Signature = 010991656cca182b7f29d2dbc007e7ae0fec158eb6759cb9c45c5ff87c7635dd46d150882f4de1e9ae65e7f7d9018f6836954a47c0a81a8a6b6f83f2944d6081b1aa7c759b254b2c34b691da67cc0226e20b2f18b42212761dcd4b908a62b371b5918c5742af4b537e296917674fb914194761621cc19a41f6fb953fbcbb649dea Padding = EMSA4(SHA-1) E = 0x010001 N = 0x01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9 Msg = 52a1d96c8ac39e41e455809801b927a5b445c10d902a0dcd3850d22a66d2bb0703e67d5867114595aabf5a7aeb5a8f87034bbb30e13cfd4817a9be76230023606d0286a3faf8a4d22b728ec518079f9e64526e3a0cc7941aa338c437997c680ccac67c66bfa1 Signature = 007f0030018f53cdc71f23d03659fde54d4241f758a750b42f185f87578520c30742afd84359b6e6e8d3ed959dc6fe486bedc8e2cf001f63a7abe16256a1b84df0d249fc05d3194ce5f0912742dbbf80dd174f6c51f6bad7f16cf3364eba095a06267dc3793803ac7526aebe0a475d38b8c2247ab51c4898df7047dc6adf52c6c4 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9 Msg = a7182c83ac18be6570a106aa9d5c4e3dbbd4afaeb0c60c4a23e1969d79ff Signature = 009cd2f4edbe23e12346ae8c76dd9ad3230a62076141f16c152ba18513a48ef6f010e0e37fd3df10a1ec629a0cb5a3b5d2893007298c30936a95903b6ba85555d9ec3673a06108fd62a2fda56d1ce2e85c4db6b24a81ca3b496c36d4fd06eb7c9166d8e94877c42bea622b3bfe9251fdc21d8d5371badad78a488214796335b40b Padding = EMSA4(SHA-1) E = 0x010001 N = 0x01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9 Msg = 86a83d4a72ee932a4f5630af6579a386b78fe88999e0abd2d49034a4bfc854dd94f1094e2e8cd7a179d19588e4aefc1b1bd25e95e3dd461f Signature = 00ec430824931ebd3baa43034dae98ba646b8c36013d1671c3cf1cf8260c374b19f8e1cc8d965012405e7e9bf7378612dfcc85fce12cda11f950bd0ba8876740436c1d2595a64a1b32efcfb74a21c873b3cc33aaf4e3dc3953de67f0674c0453b4fd9f604406d441b816098cb106fe3472bc251f815f59db2e4378a3addc181ecf Padding = EMSA4(SHA-1) E = 0x010001 N = 0x01d40c1bcf97a68ae7cdbd8a7bf3e34fa19dcca4ef75a47454375f94514d88fed006fb829f8419ff87d6315da68a1ff3a0938e9abb3464011c303ad99199cf0c7c7a8b477dce829e8844f625b115e5e9c4a59cf8f8113b6834336a2fd2689b472cbb5e5cabe674350c59b6c17e176874fb42f8fc3d176a017edc61fd326c4b33c9 Msg = 049f9154d871ac4a7c7ab45325ba7545a1ed08f70525b2667cf1 Signature = 00475b1648f814a8dc0abdc37b5527f543b666bb6e39d30e5b49d3b876dccc58eac14e32a2d55c2616014456ad2f246fc8e3d560da3ddf379a1c0bd200f10221df078c219a151bc8d4ec9d2fc2564467811014ef15d8ea01c2ebbff8c2c8efab38096e55fcbe3285c7aa558851254faffa92c1c72b78758663ef4582843139d7a6 # THIS TEST FAILS Padding = EMSA4(SHA-1) E = 0x010001 N = 0x02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443 Msg = 594b37333bbb2c84524a87c1a01f75fcec0e3256f108e38dca36d70d0057 Signature = 0088b135fb1794b6b96c4a3e678197f8cac52b64b2fe907d6f27de761124964a99a01a882740ecfaed6c01a47464bb05182313c01338a8cd097214cd68ca103bd57d3bc9e816213e61d784f182467abf8a01cf253e99a156eaa8e3e1f90e3c6e4e3aa2d83ed0345b89fafc9c26077c14b6ac51454fa26e446e3a2f153b2b16797f Padding = EMSA4(SHA-1) E = 0x010001 N = 0x02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443 Msg = 8b769528884a0d1ffd090cf102993e796dadcfbddd38e44ff6324ca451 Signature = 02a5f0a858a0864a4f65017a7d69454f3f973a2999839b7bbc48bf78641169179556f595fa41f6ff18e286c2783079bc0910ee9cc34f49ba681124f923dfa88f426141a368a5f5a930c628c2c3c200e18a7644721a0cbec6dd3f6279bde3e8f2be5e2d4ee56f97e7ceaf33054be7042bd91a63bb09f897bd41e81197dee99b11af Padding = EMSA4(SHA-1) E = 0x010001 N = 0x02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443 Msg = 1abdba489c5ada2f995ed16f19d5a94d9e6ec34a8d84f84557d26e5ef9b02b22887e3f9a4b690ad1149209c20c61431f0c017c36c2657b35d7b07d3f5ad8708507a9c1b831df835a56f831071814ea5d3d8d8f6ade40cba38b42db7a2d3d7a29c8f0a79a7838cf58a9757fa2fe4c40df9baa193bfc6f92b123ad57b07ace3e6ac068c9f106afd9eeb03b4f37c25dbfbcfb3071f6f9771766d072f3bb070af6605532973ae25051 Signature = 0244bcd1c8c16955736c803be401272e18cb990811b14f72db964124d5fa760649cbb57afb8755dbb62bf51f466cf23a0a1607576e983d778fceffa92df7548aea8ea4ecad2c29dd9f95bc07fe91ecf8bee255bfe8762fd7690aa9bfa4fa0849ef728c2c42c4532364522df2ab7f9f8a03b63f7a499175828668f5ef5a29e3802c Padding = EMSA4(SHA-1) E = 0x010001 N = 0x02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443 Msg = 8fb431f5ee792b6c2ac7db53cc428655aeb32d03f4e889c5c25de683c461b53acf89f9f8d3aabdf6b9f0c2a1de12e15b49edb3919a652fe9491c25a7fce1f722c2543608b69dc375ec Signature = 0196f12a005b98129c8df13c4cb16f8aa887d3c40d96df3a88e7532ef39cd992f273abc370bc1be6f097cfebbf0118fd9ef4b927155f3df22b904d90702d1f7ba7a52bed8b8942f412cd7bd676c9d18e170391dcd345c06a730964b3f30bcce0bb20ba106f9ab0eeb39cf8a6607f75c0347f0af79f16afa081d2c92d1ee6f836b8 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443 Msg = fef4161dfaaf9c5295051dfc1ff3810c8c9ec2e866f7075422c8ec4216a9c4ff49427d483cae10c8534a41b2fd15fee06960ec6fb3f7a7e94a2f8a2e3e43dc4a40576c3097ac953b1de86f0b4ed36d644f23ae14425529622464ca0cbf0b1741347238157fab59e4de5524096d62baec63ac64 Signature = 021eca3ab4892264ec22411a752d92221076d4e01c0e6f0dde9afd26ba5acf6d739ef987545d16683e5674c9e70f1de649d7e61d48d0caeb4fb4d8b24fba84a6e3108fee7d0705973266ac524b4ad280f7ae17dc59d96d3351586b5a3bdb895d1e1f7820ac6135d8753480998382ba32b7349559608c38745290a85ef4e9f9bd83 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x02f246ef451ed3eebb9a310200cc25859c048e4be798302991112eb68ce6db674e280da21feded1ae74880ca522b18db249385012827c515f0e466a1ffa691d98170574e9d0eadb087586ca48933da3cc953d95bd0ed50de10ddcb6736107d6c831c7f663e833ca4c097e700ce0fb945f88fb85fe8e5a773172565b914a471a443 Msg = efd237bb098a443aeeb2bf6c3f8c81b8c01b7fcb3feb Signature = 012fafec862f56e9e92f60ab0c77824f4299a0ca734ed26e0644d5d222c7f0bde03964f8e70a5cb65ed44e44d56ae0edf1ff86ca032cc5dd4404dbb76ab854586c44eed8336d08d457ce6c03693b45c0f1efef93624b95b8ec169c616d20e5538ebc0b6737a6f82b4bc0570924fc6b35759a3348426279f8b3d7744e2d222426ce Padding = EMSA4(SHA-1) E = 0x010001 N = 0x054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705 Msg = 9fb03b827c8217d9 Signature = 0323d5b7bf20ba4539289ae452ae4297080feff4518423ff4811a817837e7d82f1836cdfab54514ff0887bddeebf40bf99b047abc3ecfa6a37a3ef00f4a0c4a88aae0904b745c846c4107e8797723e8ac810d9e3d95dfa30ff4966f4d75d13768d20857f2b1406f264cfe75e27d7652f4b5ed3575f28a702f8c4ed9cf9b2d44948 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705 Msg = 0ca2ad77797ece86de5bf768750ddb5ed6a3116ad99bbd17edf7f782f0db1cd05b0f677468c5ea420dc116b10e80d110de2b0461ea14a38be68620392e7e893cb4ea9393fb886c20ff790642305bf302003892e54df9f667509dc53920df583f50a3dd61abb6fab75d600377e383e6aca6710eeea27156e06752c94ce25ae99fcbf8592dbe2d7e27453cb44de07100ebb1a2a19811a478adbeab270f94e8fe369d90b3ca612f9f Signature = 049d0185845a264d28feb1e69edaec090609e8e46d93abb38371ce51f4aa65a599bdaaa81d24fba66a08a116cb644f3f1e653d95c89db8bbd5daac2709c8984000178410a7c6aa8667ddc38c741f710ec8665aa9052be929d4e3b16782c1662114c5414bb0353455c392fc28f3db59054b5f365c49e1d156f876ee10cb4fd70598 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705 Msg = 288062afc08fcdb7c5f8650b29837300461dd5676c17a20a3c8fb5148949e3f73d66b3ae82c7240e27c5b3ec4328ee7d6ddf6a6a0c9b5b15bcda196a9d0c76b119d534d85abd123962d583b76ce9d180bce1ca Signature = 03fbc410a2ced59500fb99f9e2af2781ada74e13145624602782e2994813eefca0519ecd253b855fb626a90d771eae028b0c47a199cbd9f8e3269734af4163599090713a3fa910fa0960652721432b971036a7181a2bc0cab43b0b598bc6217461d7db305ff7e954c5b5bb231c39e791af6bcfa76b147b081321f72641482a2aad Padding = EMSA4(SHA-1) E = 0x010001 N = 0x054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705 Msg = 6f4f9ab9501199cef55c6cf408fe7b36c557c49d420a4763d2463c8ad44b3cfc5be2742c0e7d9b0f6608f08c7f47b693ee Signature = 0486644bc66bf75d28335a6179b10851f43f09bded9fac1af33252bb9953ba4298cd6466b27539a70adaa3f89b3db3c74ab635d122f4ee7ce557a61e59b82ffb786630e5f9db53c77d9a0c12fab5958d4c2ce7daa807cd89ba2cc7fcd02ff470ca67b229fcce814c852c73cc93bea35be68459ce478e9d4655d121c8472f371d4f Padding = EMSA4(SHA-1) E = 0x010001 N = 0x054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705 Msg = e17d20385d501955823c3f666254c1d3dd36ad5168b8f18d286fdcf67a7dad94097085fab7ed86fe2142a28771717997ef1a7a08884efc39356d76077aaf82459a7fad45848875f2819b098937fe923bcc9dc442d72d754d812025090c9bc03db3080c138dd63b355d0b4b85d6688ac19f4de15084a0ba4e373b93ef4a555096691915dc23c00e954cdeb20a47cd55d16c3d8681d46ed7f2ed5ea42795be17baed25f0f4d113b3636addd585f16a8b5aec0c8fa9c5f03cbf3b9b73 Signature = 022a80045353904cb30cbb542d7d4990421a6eec16a8029a8422adfd22d6aff8c4cc0294af110a0c067ec86a7d364134459bb1ae8ff836d5a8a2579840996b320b19f13a13fad378d931a65625dae2739f0c53670b35d9d3cbac08e733e4ec2b83af4b9196d63e7c4ff1ddeae2a122791a125bfea8deb0de8ccf1f4ffaf6e6fb0a Padding = EMSA4(SHA-1) E = 0x010001 N = 0x054adb7886447efe6f57e0368f06cf52b0a3370760d161cef126b91be7f89c421b62a6ec1da3c311d75ed50e0ab5fff3fd338acc3aa8a4e77ee26369acb81ba900fa83f5300cf9bb6c53ad1dc8a178b815db4235a9a9da0c06de4e615ea1277ce559e9c108de58c14a81aa77f5a6f8d1335494498848c8b95940740be7bf7c3705 Msg = afbc19d479249018fdf4e09f618726440495de11ddeee38872d775fcea74a23896b5343c9c38d46af0dba224d047580cc60a65e9391cf9b59b36a860598d4e8216722f993b91cfae87bc255af89a6a199bca4a391eadbc3a24903c0bd667368f6be78e3feabfb4ffd463122763740ffbbefeab9a25564bc5d1c24c93e422f75073e2ad72bf45b10df00b52a147128e73fee33fa3f0577d77f80fbc2df1bed313290c12777f50 Signature = 00938dcb6d583046065f69c78da7a1f1757066a7fa75125a9d2929f0b79a60b627b082f11f5b196f28eb9daa6f21c05e5140f6aef1737d2023075c05ecf04a028c686a2ab3e7d5a0664f295ce12995e890908b6ad21f0839eb65b70393a7b5afd9871de0caa0cedec5b819626756209d13ab1e7bb9546a26ff37e9a51af9fd562e Padding = EMSA4(SHA-1) E = 0x010001 N = 0x0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507 Msg = 30c7d557458b436decfdc14d06cb7b96b06718c48d7de57482a868ae7f065870a6216506d11b779323dfdf046cf5775129134b4d5689e4d9c0ce1e12d7d4b06cb5fc5820decfa41baf59bf257b32f025b7679b445b9499c92555145885992f1b76f84891ee4d3be0f5150fd5901e3a4c8ed43fd36b61d022e65ad5008dbf33293c22bfbfd07321f0f1d5fa9fdf0014c2fcb0358aad0e354b0d29 Signature = 0ba373f76e0921b70a8fbfe622f0bf77b28a3db98e361051c3d7cb92ad0452915a4de9c01722f6823eeb6adf7e0ca8290f5de3e549890ac2a3c5950ab217ba58590894952de96f8df111b2575215da6c161590c745be612476ee578ed384ab33e3ece97481a252f5c79a98b5532ae00cdd62f2ecc0cd1baefe80d80b962193ec1d Padding = EMSA4(SHA-1) E = 0x010001 N = 0x0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507 Msg = e7b32e1556ea1b2795046ac69739d22ac8966bf11c116f614b166740e96b90653e5750945fcf772186c03790a07fda323e1a61916b06ee2157db3dff80d67d5e39a53ae268c8f09ed99a732005b0bc6a04af4e08d57a00e7201b3060efaadb73113bfc087fd837093aa25235b8c149f56215f031c24ad5bde7f29960df7d524070f7449c6f785084be1a0f733047f336f9154738674547db02a9f44dfc6e60301081e1ce99847f3b5b601ff06b4d5776a9740b9aa0d34058fd3b906e4f7859dfb07d7173e5e6f6350adac21f27b2307469 Signature = 08180de825e4b8b014a32da8ba761555921204f2f90d5f24b712908ff84f3e220ad17997c0dd6e706630ba3e84add4d5e7ab004e58074b549709565d43ad9e97b5a7a1a29e85b9f90f4aafcdf58321de8c5974ef9abf2d526f33c0f2f82e95d158ea6b81f1736db8d1af3d6ac6a83b32d18bae0ff1b2fe27de4c76ed8c7980a34e Padding = EMSA4(SHA-1) E = 0x010001 N = 0x0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507 Msg = 8d8396e36507fe1ef6a19017548e0c716674c2fec233adb2f775665ec41f2bd0ba396b061a9daa7e866f7c23fd3531954300a342f924535ea1498c48f6c879932865fc02000c528723b7ad0335745b51209a0afed932af8f0887c219004d2abd894ea92559ee3198af3a734fe9b9638c263a728ad95a5ae8ce3eb15839f3aa7852bb390706e7760e43a71291a2e3f827237deda851874c517665f545f27238df86557f375d09ccd8bd15d8ccf61f5d78ca5c7f5cde782e6bf5d0057056d4bad98b3d2f9575e824ab7a33ff57b0ac100ab0d6ead7aa0b50f6e4d3e5ec0b966b Signature = 05e0fdbdf6f756ef733185ccfa8ced2eb6d029d9d56e35561b5db8e70257ee6fd019d2f0bbf669fe9b9821e78df6d41e31608d58280f318ee34f559941c8df13287574bac000b7e58dc4f414ba49fb127f9d0f8936638c76e85356c994f79750f7fa3cf4fd482df75e3fb9978cd061f7abb17572e6e63e0bde12cbdcf18c68b979 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507 Msg = 328c659e0a6437433cceb73c14 Signature = 0bc989853bc2ea86873271ce183a923ab65e8a53100e6df5d87a24c4194eb797813ee2a187c097dd872d591da60c568605dd7e742d5af4e33b11678ccb63903204a3d080b0902c89aba8868f009c0f1c0cb85810bbdd29121abb8471ff2d39e49fd92d56c655c8e037ad18fafbdc92c95863f7f61ea9efa28fea401369d19daea1 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507 Msg = f37b962379a47d415a376eec8973150bcb34edd5ab654041b61430560c2144582ba133c867d852d6b8e23321901302ecb45b09ec88b1527178fa043263f3067d9ffe973032a99f4cb08ad2c7e0a2456cdd57a7df56fe6053527a5aeb67d7e552063c1ca97b1beffa7b39e997caf27878ea0f62cbebc8c21df4c889a202851e949088490c249b6e9acf1d8063f5be2343989bf95c4da01a2be78b4ab6b378015bc37957f76948b5e58e440c28453d40d7cfd57e7d690600474ab5e75973b1ea0c5f1e45d14190afe2f4eb6d3bdf71f1d2f8bb156a1c295d04aaeb9d689dce79ed62bc443e Signature = 0aefa943b698b9609edf898ad22744ac28dc239497cea369cbbd84f65c95c0ad776b594740164b59a739c6ff7c2f07c7c077a86d95238fe51e1fcf33574a4ae0684b42a3f6bf677d91820ca89874467b2c23add77969c80717430d0efc1d3695892ce855cb7f7011630f4df26def8ddf36fc23905f57fa6243a485c770d5681fcd Padding = EMSA4(SHA-1) E = 0x010001 N = 0x0d10f661f29940f5ed39aa260966deb47843679d2b6fb25b3de370f3ac7c19916391fd25fb527ebfa6a4b4df45a1759d996c4bb4ebd18828c44fc52d0191871740525f47a4b0cc8da325ed8aa676b0d0f626e0a77f07692170acac8082f42faa7dc7cd123e730e31a87985204cabcbe6670d43a2dd2b2ddef5e05392fc213bc507 Msg = c6103c330c1ef718c141e47b8fa859be4d5b96259e7d142070ecd485839dba5a8369c17c1114035e532d195c74f44a0476a2d3e8a4da210016caced0e367cb867710a4b5aa2df2b8e5daf5fdc647807d4d5ebb6c56b9763ccdae4dea3308eb0ac2a89501cb209d2639fa5bf87ce790747d3cb2d295e84564f2f637824f0c13028129b0aa4a422d162282 Signature = 02802dccfa8dfaf5279bf0b4a29ba1b157611faeaaf419b8919d15941900c1339e7e92e6fae562c53e6cc8e84104b110bce03ad18525e3c49a0eadad5d3f28f244a8ed89edbafbb686277cfa8ae909714d6b28f4bf8e293aa04c41efe7c0a81266d5c061e2575be032aa464674ff71626219bd74cc45f0e7ed4e3ff96eee758e8f Padding = EMSA4(SHA-1) E = 0x010001 N = 0x164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1 Msg = 0a20b774addc2fa51245ed7cb9da609e50cac6636a52543f97458eed7340f8d53ffc64918f949078ee03ef60d42b5fec246050bd5505cd8cb597bad3c4e713b0ef30644e76adabb0de01a1561efb255158c74fc801e6e919e581b46f0f0ddd08e4f34c7810b5ed8318f91d7c8c Signature = 04c0cfacec04e5badbece159a5a1103f69b3f32ba593cb4cc4b1b7ab455916a96a27cd2678ea0f46ba37f7fc9c86325f29733b389f1d97f43e7201c0f348fc45fe42892335362eee018b5b161f2f9393031225c713012a576bc88e23052489868d9010cbf033ecc568e8bc152bdc59d560e41291915d28565208e22aeec9ef85d1 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1 Msg = 2aaff6631f621ce615760a9ebce94bb333077ad86488c861d4b76d29c1f48746c611ae1e03ced4445d7cfa1fe5f62e1b3f08452bde3b6ef81973bafbb57f97bceef873985395b8260589aa88cb7db50ab469262e551bdcd9a56f275a0ac4fe484700c35f3dbf2b469ede864741b86fa59172a360ba95a02e139be50ddfb7cf0b42faeabbfbbaa86a4497699c4f2dfd5b08406af7e14144427c253ec0efa20eaf9a8be8cd49ce1f1bc4e93e619cf2aa8ed4fb39bc8590d0f7b96488f7317ac9abf7bee4e3a0e715 Signature = 0a2314250cf52b6e4e908de5b35646bcaa24361da8160fb0f9257590ab3ace42b0dc3e77ad2db7c203a20bd952fbb56b1567046ecfaa933d7b1000c3de9ff05b7d989ba46fd43bc4c2d0a3986b7ffa13471d37eb5b47d64707bd290cfd6a9f393ad08ec1e3bd71bb5792615035cdaf2d8929aed3be098379377e777ce79aaa4773 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1 Msg = 0f6195d04a6e6fc7e2c9600dbf840c39ea8d4d624fd53507016b0e26858a5e0aecd7ada543ae5c0ab3a62599cba0a54e6bf446e262f989978f9ddf5e9a41 Signature = 086df6b500098c120f24ff8423f727d9c61a5c9007d3b6a31ce7cf8f3cbec1a26bb20e2bd4a046793299e03e37a21b40194fb045f90b18bf20a47992ccd799cf9c059c299c0526854954aade8a6ad9d97ec91a1145383f42468b231f4d72f23706d9853c3fa43ce8ace8bfe7484987a1ec6a16c8daf81f7c8bf42774707a9df456 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1 Msg = 337d25fe9810ebca0de4d4658d3ceb8e0fe4c066aba3bcc48b105d3bf7e0257d44fecea6596f4d0c59a08402833678f70620f9138dfeb7ded905e4a6d5f05c473d55936652e2a5df43c0cfda7bacaf3087f4524b06cf42157d01539739f7fddec9d58125df31a32eab06c19b71f1d5bf Signature = 0b5b11ad549863ffa9c51a14a1106c2a72cc8b646e5c7262509786105a984776534ca9b54c1cc64bf2d5a44fd7e8a69db699d5ea52087a4748fd2abc1afed1e5d6f7c89025530bdaa2213d7e030fa55df6f34bcf1ce46d2edf4e3ae4f3b01891a068c9e3a44bbc43133edad6ecb9f35400c4252a5762d65744b99cb9f4c559329f Padding = EMSA4(SHA-1) E = 0x010001 N = 0x164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1 Msg = 84ec502b072e8287789d8f9235829ea3b187afd4d4c785611bda5f9eb3cb96717efa7007227f1c08cbcb972e667235e0fb7d431a6570326d2ecce35adb373dc753b3be5f829b89175493193fab16badb41371b3aac0ae670076f24bef420c135add7cee8d35fbc944d79fafb9e307a13b0f556cb654a06f973ed22672330197ef5a748bf826a5db2383a25364b686b9372bb2339aeb1ac9e9889327d016f1670776db06201adbdcaf8a5e3b74e108b73 Signature = 02d71fa9b53e4654fefb7f08385cf6b0ae3a817942ebf66c35ac67f0b069952a3ce9c7e1f1b02e480a9500836de5d64cdb7ecde04542f7a79988787e24c2ba05f5fd482c023ed5c30e04839dc44bed2a3a3a4fee01113c891a47d32eb8025c28cb050b5cdb576c70fe76ef523405c08417faf350b037a43c379339fcb18d3a356b Padding = EMSA4(SHA-1) E = 0x010001 N = 0x164ca31cff609f3a0e7101b039f2e4fe6dd37519ab98598d179e174996598071f47d3a04559158d7be373cf1aa53f0aa6ef09039e5678c2a4c63900514c8c4f8aaed5de12a5f10b09c311af8c0ffb5b7a297f2efc63b8d6b0510931f0b98e48bf5fc6ec4e7b8db1ffaeb08c38e02adb8f03a48229c99e969431f61cb8c4dc698d1 Msg = 9906d89f97a9fdedd3ccd824db687326f30f00aa25a7fca2afcb3b0f86cd41e73f0e8ff7d2d83f59e28ed31a5a0d551523374de22e4c7e8ff568b386ee3dc41163f10bf67bb006261c9082f9af90bf1d9049a6b9fae71c7f84fbe6e55f02789de774f230f115026a4b4e96c55b04a95da3aacbb2cece8f81764a1f1c99515411087cf7d34aeded0932c183 Signature = 0a40a16e2fe2b38d1df90546167cf9469c9e3c3681a3442b4b2c2f581deb385ce99fc6188bb02a841d56e76d301891e24560550fcc2a26b55f4ccb26d837d350a154bcaca8392d98fa67959e9727b78cad03269f56968fc56b68bd679926d83cc9cb215550645ccda31c760ff35888943d2d8a1d351e81e5d07b86182e751081ef Padding = EMSA4(SHA-1) E = 0x010001 N = 0x37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3 Msg = 9ead0e01945640674eb41cad435e2374eaefa8ad7197d97913c44957d8d83f40d76ee60e39bf9c0f9eaf3021421a074d1ade962c6e9d3dc3bb174fe4dfe652b09115495b8fd2794174020a0602b5ca51848cfc96ce5eb57fc0a2adc1dda36a7cc452641a14911b37e45bfa11daa5c7ecdb74f6d0100d1d3e39e752800e203397de0233077b9a88855537fae927f924380d780f98e18dcff39c5ea741b17d6fdd1885bc9d581482d771ceb562d78a8bf88f0c75b11363e5e36cd479ceb0545f9da84203e0e6e508375cc9e844b88b7ac7a0a201ea0f1bee9a2c577920ca02c01b9d8320e974a56f4efb5763b96255abbf8037bf1802cf018f56379493e569a9 Signature = 187f390723c8902591f0154bae6d4ecbffe067f0e8b795476ea4f4d51ccc810520bb3ca9bca7d0b1f2ea8a17d873fa27570acd642e3808561cb9e975ccfd80b23dc5771cdb3306a5f23159dacbd3aa2db93d46d766e09ed15d900ad897a8d274dc26b47e994a27e97e2268a766533ae4b5e42a2fcaf755c1c4794b294c60555823 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3 Msg = 8d80d2d08dbd19c154df3f14673a14bd03735231f24e86bf153d0e69e74cbff7b1836e664de83f680124370fc0f96c9b65c07a366b644c4ab3 Signature = 10fd89768a60a67788abb5856a787c8561f3edcf9a83e898f7dc87ab8cce79429b43e56906941a886194f137e591fe7c339555361fbbe1f24feb2d4bcdb80601f3096bc9132deea60ae13082f44f9ad41cd628936a4d51176e42fc59cb76db815ce5ab4db99a104aafea68f5d330329ebf258d4ede16064bd1d00393d5e1570eb8 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3 Msg = 808405cdfc1a58b9bb0397c720722a81fffb76278f335917ef9c473814b3e016ba2973cd2765f8f3f82d6cc38aa7f8551827fe8d1e3884b7e61c94683b8f82f1843bdae2257eeec9812ad4c2cf283c34e0b0ae0fe3cb990cf88f2ef9 Signature = 2b31fde99859b977aa09586d8e274662b25a2a640640b457f594051cb1e7f7a911865455242926cf88fe80dfa3a75ba9689844a11e634a82b075afbd69c12a0df9d25f84ad4945df3dc8fe90c3cefdf26e95f0534304b5bdba20d3e5640a2ebfb898aac35ae40f26fce5563c2f9f24f3042af76f3c7072d687bbfb959a88460af1 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3 Msg = f337b9bad937de22a1a052dff11134a8ce26976202981939b91e0715ae5e609649da1adfcef3f4cca59b238360e7d1e496c7bf4b204b5acff9bbd6166a1d87a36ef2247373751039f8a800b8399807b3a85f44893497c0d05fb7017b82228152de6f25e6116dcc7503c786c875c28f3aa607e94ab0f19863ab1b5073770b0cd5f533acde30c6fb953cf3da680264e30fc11bff9a19bffab4779b6223c3fb3fe0f71abade4eb7c09c41e24c22d23fa148e6a173feb63984d1bc6ee3a02d915b752ceaf92a3015eceb38ca586c6801b37c34cefb2cff25ea23c08662dcab26a7a93a285d05d3044c Signature = 32c7ca38ff26949a15000c4ba04b2b13b35a3810e568184d7ecabaa166b7ffabddf2b6cf4ba07124923790f2e5b1a5be040aea36fe132ec130e1f10567982d17ac3e89b8d26c3094034e762d2e031264f01170beecb3d1439e05846f25458367a7d9c02060444672671e64e877864559ca19b2074d588a281b5804d23772fbbe19 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3 Msg = 45013cebafd960b255476a8e2598b9aa32efbe6dc1f34f4a498d8cf5a2b4548d08c55d5f95f7bcc9619163056f2d58b52fa032 Signature = 07eb651d75f1b52bc263b2e198336e99fbebc4f332049a922a10815607ee2d989db3a4495b7dccd38f58a211fb7e193171a3d891132437ebca44f318b280509e52b5fa98fcce8205d9697c8ee4b7ff59d4c59c79038a1970bd2a0d451ecdc5ef11d9979c9d35f8c70a6163717607890d586a7c6dc01c79f86a8f28e85235f8c2f1 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x37c9da4a66c8c408b8da27d0c9d79f8ccb1eafc1d2fe48746d940b7c4ef5dee18ad12647cefaa0c4b3188b221c515386759b93f02024b25ab9242f8357d8f3fd49640ee5e643eaf6c64deefa7089727c8ff03993333915c6ef21bf5975b6e50d118b51008ec33e9f01a0a545a10a836a43ddbca9d8b5c5d3548022d7064ea29ab3 Msg = 2358097086c899323e75d9c90d0c09f12d9d54edfbdf70a9c2eb5a04d8f36b9b2bdf2aabe0a5bda1968937f9d6ebd3b6b257efb3136d4131f9acb59b85e2602c2a3fcdc835494a1f4e5ec18b226c80232b36a75a45fdf09a7ea9e98efbde1450d1194bf12e15a4c5f9eb5c0bce5269e0c3b28cfab655d81a61a20b4be2f54459bb25a0db94c52218be109a7426de83014424789aaa90e5056e632a698115e282c1a56410f26c2072f193481a9dcd880572005e64f4082ecf Signature = 18da3cdcfe79bfb77fd9c32f377ad399146f0a8e810620233271a6e3ed3248903f5cdc92dc79b55d3e11615aa056a795853792a3998c349ca5c457e8ca7d29d796aa24f83491709befcfb1510ea513c92829a3f00b104f655634f320752e130ec0ccf6754ff893db302932bb025eb60e87822598fc619e0e981737a9a4c4152d33 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f Msg = 81332f4be62948415ea1d899792eeacf6c6e1db1da8be13b5cea41db2fed467092e1ff398914c714259775f595f8547f735692a575e6923af78f22c6997ddb90fb6f72d7bb0dd5744a31decd3dc3685849836ed34aec596304ad11843c4f88489f209735f5fb7fdaf7cec8addc5818168f880acbf490d51005b7a8e84e43e54287977571dd99eea4b161eb2df1f5108f12a4142a83322edb05a75487a3435c9a78ce53ed93bc550857d7a9fb Signature = 0262ac254bfa77f3c1aca22c5179f8f040422b3c5bafd40a8f21cf0fa5a667ccd5993d42dbafb409c520e25fce2b1ee1e716577f1efa17f3da28052f40f0419b23106d7845aaf01125b698e7a4dfe92d3967bb00c4d0d35ba3552ab9a8b3eef07c7fecdbc5424ac4db1e20cb37d0b2744769940ea907e17fbbca673b20522380c5 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f Msg = e2f96eaf0e05e7ba326ecca0ba7fd2f7c02356f3cede9d0faabf4fcc8e60a973e5595fd9ea08 Signature = 2707b9ad5115c58c94e932e8ec0a280f56339e44a1b58d4ddcff2f312e5f34dcfe39e89c6a94dcee86dbbdae5b79ba4e0819a9e7bfd9d982e7ee6c86ee68396e8b3a14c9c8f34b178eb741f9d3f121109bf5c8172fada2e768f9ea1433032c004a8aa07eb990000a48dc94c8bac8aabe2b09b1aa46c0a2aa0e12f63fbba775ba7e Padding = EMSA4(SHA-1) E = 0x010001 N = 0x495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f Msg = e35c6ed98f64a6d5a648fcab8adb16331db32e5d15c74a40edf94c3dc4a4de792d190889f20f1e24ed12054a6b28798fcb42d1c548769b734c96373142092aed277603f4738df4dc1446586d0ec64da4fb60536db2ae17fc7e3c04bbfbbbd907bf117c08636fa16f95f51a6216934d3e34f85030f17bbbc5ba69144058aff081e0b19cf03c17195c5e888ba58f6fe0a02e5c3bda9719a7 Signature = 2ad20509d78cf26d1b6c406146086e4b0c91a91c2bd164c87b966b8faa42aa0ca446022323ba4b1a1b89706d7f4c3be57d7b69702d168ab5955ee290356b8c4a29ed467d547ec23cbadf286ccb5863c6679da467fc9324a151c7ec55aac6db4084f82726825cfe1aa421bc64049fb42f23148f9c25b2dc300437c38d428aa75f96 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f Msg = dbc5f750a7a14be2b93e838d18d14a8695e52e8add9c0ac733b8f56d2747e529a0cca532dd49b902aefed514447f9e81d16195c2853868cb9b30f7d0d495c69d01b5c5d50b27045db3866c2324a44a110b1717746de457d1c8c45c3cd2a92970c3d59632055d4c98a41d6e99e2a3ddd5f7f9979ab3cd18f37505d25141de2a1bff17b3a7dce9419ecc385cf11d72840f19953fd0509251f6cafde2893d0e75c781ba7a5012ca401a4fa99e04b3c3249f926d5afe82cc87dab22c3c1b105de48e34ace9c9124e59597ac7ebf8 Signature = 1e24e6e58628e5175044a9eb6d837d48af1260b0520e87327de7897ee4d5b9f0df0be3e09ed4dea8c1454ff3423bb08e1793245a9df8bf6ab3968c8eddc3b5328571c77f091cc578576912dfebd164b9de5454fe0be1c1f6385b328360ce67ec7a05f6e30eb45c17c48ac70041d2cab67f0a2ae7aafdcc8d245ea3442a6300ccc7 Padding = EMSA4(SHA-1) E = 0x010001 N = 0x495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f Msg = 04dc251be72e88e5723485b6383a637e2fefe07660c519a560b8bc18bdedb86eae2364ea53ba9dca6eb3d2e7d6b806af42b3e87f291b4a8881d5bf572cc9a85e19c86acb28f098f9da0383c566d3c0f58cfd8f395dcf602e5cd40e8c7183f714996e2297ef Signature = 33341ba3576a130a50e2a5cf8679224388d5693f5accc235ac95add68e5eb1eec31666d0ca7a1cda6f70a1aa762c05752a51950cdb8af3c5379f18cfe6b5bc55a4648226a15e912ef19ad77adeea911d67cfefd69ba43fa4119135ff642117ba985a7e0100325e9519f1ca6a9216bda055b5785015291125e90dcd07a2ca9673ee Padding = EMSA4(SHA-1) E = 0x010001 N = 0x495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f778a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e582de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a2b8efab0561b0810344739ada0733f Msg = 0ea37df9a6fea4a8b610373c24cf390c20fa6e2135c400c8a34f5c183a7e8ea4c9ae090ed31759f42dc77719cca400ecdcc517acfc7ac6902675b2ef30c509665f3321482fc69a9fb570d15e01c845d0d8e50d2a24cbf1cf0e714975a5db7b18d9e9e9cb91b5cb16869060ed18b7b56245503f0caf90352b8de81cb5a1d9c6336092f0cd Signature = 1ed1d848fb1edb44129bd9b354795af97a069a7a00d0151048593e0c72c3517ff9ff2a41d0cb5a0ac860d736a199704f7cb6a53986a88bbd8abcc0076a2ce847880031525d449da2ac78356374c536e343faa7cba42a5aaa6506087791c06a8e989335aed19bfab2d5e67e27fb0c2875af896c21b6e8e7309d04e4f6727e69463e Padding = EMSA4(SHA-1) E = 0x010001 N = 0xe6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b Msg = a88e265855e9d7ca36c68795f0b31b591cd6587c71d060a0b3f7f3eaef43795922028bc2b6ad467cfc2d7f659c5385aa70ba3672cdde4cfe4970cc7904601b278872bf51321c4a972f3c95570f3445d4f57980e0f20df54846e6a52c668f1288c03f95006ea32f562d40d52af9feb32f0fa06db65b588a237b34e592d55cf979f903a642ef64d2ed542aa8c77dc1dd762f45a59303ed75e541ca271e2b60ca709e44fa0661131e8d5d4163fd8d398566ce26de8730e72f9cca737641c244159420637028df0a18079d6208ea8b4711a2c750f5 Signature = 586107226c3ce013a7c8f04d1a6a2959bb4b8e205ba43a27b50f124111bc35ef589b039f5932187cb696d7d9a32c0c38300a5cdda4834b62d2eb240af33f79d13dfbf095bf599e0d9686948c1964747b67e89c9aba5cd85016236f566cc5802cb13ead51bc7ca6bef3b94dcbdbb1d570469771df0e00b1a8a06777472d2316279edae86474668d4e1efff95f1de61c6020da32ae92bbf16520fef3cf4d88f61121f24bbd9fe91b59caf1235b2a93ff81fc403addf4ebdea84934a9cdaf8e1a9e Padding = EMSA4(SHA-1) E = 0x010001 N = 0xe6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b Msg = c8c9c6af04acda414d227ef23e0820c3732c500dc87275e95b0d095413993c2658bc1d988581ba879c2d201f14cb88ced153a01969a7bf0a7be79c84c1486bc12b3fa6c59871b6827c8ce253ca5fefa8a8c690bf326e8e37cdb96d90a82ebab69f86350e1822e8bd536a2e Signature = 80b6d643255209f0a456763897ac9ed259d459b49c2887e5882ecb4434cfd66dd7e1699375381e51cd7f554f2c271704b399d42b4be2540a0eca61951f55267f7c2878c122842dadb28b01bd5f8c025f7e228418a673c03d6bc0c736d0a29546bd67f786d9d692ccea778d71d98c2063b7a71092187a4d35af108111d83e83eae46c46aa34277e06044589903788f1d5e7cee25fb485e92949118814d6f2c3ee361489016f327fb5bc517eb50470bffa1afa5f4ce9aa0ce5b8ee19bf5501b958 Padding = EMSA4(SHA-1) E = 0x010001 N = 0xe6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b Msg = 0afad42ccd4fc60654a55002d228f52a4a5fe03b8bbb08ca82daca558b44dbe1266e50c0e745a36d9d2904e3408abcd1fd569994063f4a75cc72f2fee2a0cd893a43af1c5b8b487df0a71610024e4f6ddf9f28ad0813c1aab91bcb3c9064d5ff742deffea657094139369e5ea6f4a96319a5cc8224145b545062758fefd1fe3409ae169259c6cdfd6b5f2958e314faecbe69d2cace58ee55179ab9b3e6d1ecc14a557c5febe988595264fc5da1c571462eca798a18a1a4940cdab4a3e92009ccd42e1e947b1314e32238a2dece7d23a89b5b30c751fd0a4a430d2c548594 Signature = 484408f3898cd5f53483f80819efbf2708c34d27a8b2a6fae8b322f9240237f981817aca1846f1084daa6d7c0795f6e5bf1af59c38e1858437ce1f7ec419b98c8736adf6dd9a00b1806d2bd3ad0a73775e05f52dfef3a59ab4b08143f0df05cd1ad9d04bececa6daa4a2129803e200cbc77787caf4c1d0663a6c5987b605952019782caf2ec1426d68fb94ed1d4be816a7ed081b77e6ab330b3ffc073820fecde3727fcbe295ee61a050a343658637c3fd659cfb63736de32d9f90d3c2f63eca Padding = EMSA4(SHA-1) E = 0x010001 N = 0xe6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b Msg = 1dfd43b46c93db82629bdae2bd0a12b882ea04c3b465f5cf93023f01059626dbbe99f26bb1be949dddd16dc7f3debb19a194627f0b224434df7d8700e9e98b06e360c12fdbe3d19f51c9684eb9089ecbb0a2f0450399d3f59eac7294085d044f5393c6ce737423d8b86c415370d389e30b9f0a3c02d25d0082e8ad6f3f1ef24a45c3cf82b383367063a4d4613e4264f01b2dac2e5aa42043f8fb5f69fa871d14fb273e767a531c40f02f343bc2fb45a0c7e0f6be2561923a77211d66a6e2dbb43c366350beae22da3ac2c1f5077096fcb5c4bf255f7574351ae0b1e1f03632817c0856d4a8ba97afbdc8b85855402bc56926fcec209f9ea8 Signature = 84ebeb481be59845b46468bafb471c0112e02b235d84b5d911cbd1926ee5074ae0424495cb20e82308b8ebb65f419a03fb40e72b78981d88aad143053685172c97b29c8b7bf0ae73b5b2263c403da0ed2f80ff7450af7828eb8b86f0028bd2a8b176a4d228cccea18394f238b09ff758cc00bc04301152355742f282b54e663a919e709d8da24ade5500a7b9aa50226e0ca52923e6c2d860ec50ff480fa57477e82b0565f4379f79c772d5c2da80af9fbf325ece6fc20b00961614bee89a183e Padding = EMSA4(SHA-1) E = 0x010001 N = 0xe6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b Msg = 1bdc6e7c98fb8cf54e9b097b66a831e9cfe52d9d4888448ee4b0978093ba1d7d73ae78b3a62ba4ad95cd289ccb9e005226bb3d178bccaa821fb044a4e21ee97696c14d0678c94c2dae93b0ad73922218553daa7e44ebe57725a7a45cc72b9b2138a6b17c8db411ce8279ee1241aff0a8bec6f77f87edb0c69cb27236e3435a800b192e4f11e519e3fe30fc30eaccca4fbb41769029bf708e817a9e683805be67fa100984683b74838e3bcffa79366eed1d481c76729118838f31ba8a048a93c1be4424598e8df6328b7a77880a3f9c7e2e8dfca8eb5a26fb86bdc556d42bbe01d9fa6ed80646491c9341 Signature = 82102df8cb91e7179919a04d26d335d64fbc2f872c44833943241de8454810274cdf3db5f42d423db152af7135f701420e39b494a67cbfd19f9119da233a23da5c6439b5ba0d2bc373eee3507001378d4a4073856b7fe2aba0b5ee93b27f4afec7d4d120921c83f606765b02c19e4d6a1a3b95fa4c422951be4f52131077ef17179729cddfbdb56950dbaceefe78cb16640a099ea56d24389eef10f8fecb31ba3ea3b227c0a86698bb89e3e9363905bf22777b2a3aa521b65b4cef76d83bde4c Padding = EMSA4(SHA-1) E = 0x010001 N = 0xe6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd06c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee315ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddbc2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8de3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6fd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b Msg = 88c7a9f1360401d90e53b101b61c5325c3c75db1b411fbeb8e830b75e96b56670ad245404e16793544ee354bc613a90cc9848715a73db5893e7f6d279815c0c1de83ef8e2956e3a56ed26a888d7a9cdcd042f4b16b7fa51ef1a0573662d16a302d0ec5b285d2e03ad96529c87b3d374db372d95b2443d061b6b1a350ba87807ed083afd1eb05c3f52f4eba5ed2227714fdb50b9d9d9dd6814f62f6272fcd5cdbce7a9ef797 Signature = a7fdb0d259165ca2c88d00bbf1028a867d337699d061193b17a9648e14ccbbaadeacaacdec815e7571294ebb8a117af205fa078b47b0712c199e3ad05135c504c24b81705115740802487992ffd511d4afc6b854491eb3f0dd523139542ff15c3101ee85543517c6a3c79417c67e2dd9aa741e9a29b06dcb593c2336b3670ae3afbac7c3e76e215473e866e338ca244de00b62624d6b9426822ceae9f8cc460895f41250073fd45c5a1e7b425c204a423a699159f6903e710b37a7bb2bc8049f Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05 Msg = 883177e5126b9be2d9a9680327d5370c6f26861f5820c43da67a3ad609 Signature = 82c2b160093b8aa3c0f7522b19f87354066c77847abf2a9fce542d0e84e920c5afb49ffdfdace16560ee94a1369601148ebad7a0e151cf16331791a5727d05f21e74e7eb811440206935d744765a15e79f015cb66c532c87a6a05961c8bfad741a9a6657022894393e7223739796c02a77455d0f555b0ec01ddf259b6207fd0fd57614cef1a5573baaff4ec00069951659b85f24300a25160ca8522dc6e6727e57d019d7e63629b8fe5e89e25cc15beb3a647577559299280b9b28f79b0409000be25bbd96408ba3b43cc486184dd1c8e62553fa1af4040f60663de7f5e49c04388e257f1ce89c95dab48a315d9b66b1b7628233876ff2385230d070d07e1666 Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05 Msg = dd670a01465868adc93f26131957a50c52fb777cdbaa30892c9e12361164ec13979d43048118e4445db87bee58dd987b3425d02071d8dbae80708b039dbb64dbd1de5657d9fed0c118a54143742e0ff3c87f74e45857647af3f79eb0a14c9d75ea9a1a04b7cf478a897a708fd988f48e801edb0b7039df8c23bb3c56f4e821ac Signature = 14ae35d9dd06ba92f7f3b897978aed7cd4bf5ff0b585a40bd46ce1b42cd2703053bb9044d64e813d8f96db2dd7007d10118f6f8f8496097ad75e1ff692341b2892ad55a633a1c55e7f0a0ad59a0e203a5b8278aec54dd8622e2831d87174f8caff43ee6c46445345d84a59659bfb92ecd4c818668695f34706f66828a89959637f2bf3e3251c24bdba4d4b7649da0022218b119c84e79a6527ec5b8a5f861c159952e23ec05e1e717346faefe8b1686825bd2b262fb2531066c0de09acde2e4231690728b5d85e115a2f6b92b79c25abc9bd9399ff8bcf825a52ea1f56ea76dd26f43baafa18bfa92a504cbd35699e26d1dcc5a2887385f3c63232f06f3244c3 Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05 Msg = 48b2b6a57a63c84cea859d65c668284b08d96bdcaabe252db0e4a96cb1bac6019341db6fbefb8d106b0e90eda6bcc6c6262f37e7ea9c7e5d226bd7df85ec5e71efff2f54c5db577ff729ff91b842491de2741d0c631607df586b905b23b91af13da12304bf83eca8a73e871ff9db Signature = 6e3e4d7b6b15d2fb46013b8900aa5bbb3939cf2c095717987042026ee62c74c54cffd5d7d57efbbf950a0f5c574fa09d3fc1c9f513b05b4ff50dd8df7edfa20102854c35e592180119a70ce5b085182aa02d9ea2aa90d1df03f2daae885ba2f5d05afdac97476f06b93b5bc94a1a80aa9116c4d615f333b098892b25fface266f5db5a5a3bcc10a824ed55aad35b727834fb8c07da28fcf416a5d9b2224f1f8b442b36f91e456fdea2d7cfe3367268de0307a4c74e924159ed33393d5e0655531c77327b89821bdedf880161c78cd4196b5419f7acc3f13e5ebf161b6e7c6724716ca33b85c2e25640192ac2859651d50bde7eb976e51cec828b98b6563b86bb Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05 Msg = 0b8777c7f839baf0a64bbbdbc5ce79755c57a205b845c174e2d2e90546a089c4e6ec8adffa23a7ea97bae6b65d782b82db5d2b5a56d22a29a05e7c4433e2b82a621abba90add05ce393fc48a840542451a Signature = 34047ff96c4dc0dc90b2d4ff59a1a361a4754b255d2ee0af7d8bf87c9bc9e7ddeede33934c63ca1c0e3d262cb145ef932a1f2c0a997aa6a34f8eaee7477d82ccf09095a6b8acad38d4eec9fb7eab7ad02da1d11d8e54c1825e55bf58c2a23234b902be124f9e9038a8f68fa45dab72f66e0945bf1d8bacc9044c6f07098c9fcec58a3aab100c805178155f030a124c450e5acbda47d0e4f10b80a23f803e774d023b0015c20b9f9bbe7c91296338d5ecb471cafb032007b67a60be5f69504a9f01abb3cb467b260e2bce860be8d95bf92c0c8e1496ed1e528593a4abb6df462dde8a0968dffe4683116857a232f5ebf6c85be238745ad0f38f767a5fdbf486fb Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05 Msg = f1036e008e71e964dadc9219ed30e17f06b4b68a955c16b312b1eddf028b74976bed6b3f6a63d4e77859243c9cccdc98016523abb02483b35591c33aad81213bb7c7bb1a470aabc10d44256c4d4559d916 Signature = 7e0935ea18f4d6c1d17ce82eb2b3836c55b384589ce19dfe743363ac9948d1f346b7bfddfe92efd78adb21faefc89ade42b10f374003fe122e67429a1cb8cbd1f8d9014564c44d120116f4990f1a6e38774c194bd1b8213286b077b0499d2e7b3f434ab12289c556684deed78131934bb3dd6537236f7c6f3dcb09d476be07721e37e1ceed9b2f7b406887bd53157305e1c8b4f84d733bc1e186fe06cc59b6edb8f4bd7ffefdf4f7ba9cfb9d570689b5a1a4109a746a690893db3799255a0cb9215d2d1cd490590e952e8c8786aa0011265252470c041dfbc3eec7c3cbf71c24869d115c0cb4a956f56d530b80ab589acfefc690751ddf36e8d383f83cedd2cc Padding = EMSA4(SHA-1) E = 0x010001 N = 0xa5dd867ac4cb02f90b9457d48c14a770ef991c56c39c0ec65fd11afa8937cea57b9be7ac73b45c0017615b82d622e318753b6027c0fd157be12f8090fee2a7adcd0eef759f88ba4997c7a42d58c9aa12cb99ae001fe521c13bb5431445a8d5ae4f5e4c7e948ac227d3604071f20e577e905fbeb15dfaf06d1de5ae6253d63a6a2120b31a5da5dabc9550600e20f27d3739e2627925fea3cc509f21dff04e6eea4549c540d6809ff9307eede91fff58733d8385a237d6d3705a33e391900992070df7adf1357cf7e3700ce3667de83f17b8df1778db381dce09cb4ad058a511001a738198ee27cf55a13b754539906582ec8b174bd58d5d1f3d767c613721ae05 Msg = 25f10895a87716c137450bb9519dfaa1f207faa942ea88abf71e9c17980085b555aebab76264ae2a3ab93c2d12981191ddac6fb5949eb36aee3c5da940f00752c916d94608fa7d97ba6a2915b688f20323d4e9d96801d89a72ab5892dc2117c07434fcf972e058cf8c41ca4b4ff554f7d5068ad3155fced0f3125bc04f9193378a8f5c4c3b8cb4dd6d1cc69d30ecca6eaa51e36a05730e9e342e855baf099defb8afd7 Signature = 6d3b5b87f67ea657af21f75441977d2180f91b2c5f692de82955696a686730d9b9778d970758ccb26071c2209ffbd6125be2e96ea81b67cb9b9308239fda17f7b2b64ecda096b6b935640a5a1cb42a9155b1c9ef7a633a02c59f0d6ee59b852c43b35029e73c940ff0410e8f114eed46bbd0fae165e42be2528a401c3b28fd818ef3232dca9f4d2a0f5166ec59c42396d6c11dbc1215a56fa17169db9575343ef34f9de32a49cdc3174922f229c23e18e45df9353119ec4319cedce7a17c64088c1f6f52be29634100b3919d38f3d1ed94e6891e66a73b8fb849f5874df59459e298c7bbce2eee782a195aa66fe2d0732b25e595f57d3e061b1fc3e4063bf98f botan-2.4.0/src/tests/data/pubkey/rsaes.vec000066400000000000000000002334361322470703100206070ustar00rootroot00000000000000 E = 0x3ED19 P = 0xD987D71CC924C479D30CD88570A626E15F0862A9A138874F7016684216984215 Q = 0xC5660F33AB35E41CB10A30D3A58354ADB5CC3243342C22E1A5BCCB79C391A533 Msg = 098825DEC8B4DAB5765348CEE92C4C6A527A172E4A4311399B0B02914E75822F1789B583180ADEADE98C200B7B7670D7B9FBA19946F3D8A7FC8322F80CF67C Ciphertext = A54A45C5F534A6C727212802CD4B2A0B9D0069EFE32B1D239D3B13958BC49711E1CA5BB499FBF7402B6006E654C719C5FB7614C7C00699866B38445228EC7663 E = 0x3ED19 P = 0xC5660F33AB35E41CB10A30D3A58354ADB5CC3243342C22E1A5BCCB79C391A533 Q = 0xD987D71CC924C479D30CD88570A626E15F0862A9A138874F7016684216984215 Msg = 098825DEC8B4DAB5765348CEE92C4C6A527A172E4A4311399B0B02914E75822F1789B583180ADEADE98C200B7B7670D7B9FBA19946F3D8A7FC8322F80CF67C Ciphertext = A54A45C5F534A6C727212802CD4B2A0B9D0069EFE32B1D239D3B13958BC49711E1CA5BB499FBF7402B6006E654C719C5FB7614C7C00699866B38445228EC7663 E = 0x1F1DD P = 0xDA78C89EBDDB277831DC1591C26AAB1C11CE9721DBB3AAFAE8F73178BC2D60055 Q = 0xCDA647FE7D18AE11DB26331116DD7F0C22D1E79E524D6886768260156827C6E9D Msg = CC11049A69951999393D2F48CF7DD27F99C735BC424E538F60EDB512815F88F17B71C27C875D05BD3DDE4B1573C61F8C91AE22D50BC2AC32422C87C34F2B8A40 Ciphertext = 946F392678443684494FA6AEC5A862C2825CB3B27B6FB6EA5E9654A9C18503F41E8D6FD34AF4076B5A703E14287F133E6A2B0222FF812309DEBE733543FCE97792 E = 0x35AF7 P = 0xB6B91AC270B7F066374A83555D690D67F0122398B3BFE69EE955F385A87C7736DF Q = 0xFF43B5A334ED37C059E693C68B9567C41E7EC17A3BFD922EDF50CC000902846A7D Msg = C1BDC66E04769D8D104B4FAC19AA8756FEAB153BF57E3FE305F2A6DA718EA7A140D8C4B5A8FC205E327DCC13554A378F1D19ACEAF5DB3D06266F90EC4C72ED6B5B Ciphertext = 73604C1C3F699A56053A627A46502A67D0B604009F811D2E3A296830F5DE6DB0820EF1288A37A3DD47974D339FD06DDBDCA44C53F3A88765F4532A26DAC97BFF7F3A E = 0x1EFB3 P = 0xDB08ED25044A98F91CDCD7A92FC81C376A51FF58329E2D2EC54AE71C25C17B639EF Q = 0xB99DBF6E1FD6D5A2986FBB818B6887AA41BADE5761C333EE98B095E7D551CC70865 Msg = 6BBB92A591C6A9B612EA82FD766100E7B37D8DE8FACDECE322B20E18D7932B854A5594FA67972B13D79AA9D37CDE29386644D9FCA609A7717C55EBF568687015A2E0 Ciphertext = 50825633A36B199F23931AD09DB38DBC8548AACC6A37F1923ABC6F94CE7256427E98E5A433A7F0FDC6DC8C8519B0DFD94A5A98C8AE80D1B502C0EC3592173DCBBC8E5A E = 0x22E79 P = 0xFC0A336E6CA2935826038319B45E921F77E4917D978B3177D162FB0CF75058B6EE2B Q = 0xB8551618F76501F4518336A579117533AB27866B44A4D15A4C0999D919024F1C558D Msg = 483E61678CFF7AF78306C5E538D0AE750F1B172BA0BECAF561EF7D9C6369F713AD0FDD7C75F56F1D4570B668D45563CE7801BD97C6EBB7C9909A9C454369DEAFB57E97 Ciphertext = ADE77710A5E9C390151CF6E7226E63692367567D1C02A7E5C1554ABE84E487B48EB18BFA20A8BF42180BF0AD5A6E1A6FFC7EC45A4CFCFEEF1E3F3333B85C98101FE8E339 E = 0xEAF1 P = 0xFFE0213AED2397C0663C26A85DC88DD4C95AA61345C4B68492C3FB1F63B61B1AB1CE3 Q = 0xFD1DCC4D3B4B474BF2269DB028091B4A4C8AA244D2F2D9C5F55FE449ECF5D2F2DB491 Msg = BE889EC220BEBD6F542B5FE8E670453333BBBD438EA2DAB4718E72872189FB74E1D1D677C1D458D769C82D8CE7FE163E2384DFE458C39FB5E8ABB78E5D5D3454CEF0AA74 Ciphertext = 4213C1FBF227222B30F20340E345ACD86F90656034F3B318E43D3BC1A46A0FCFFA2E0E699882697025096D999290CC80801E10F5CB9FC0BC52A2170A16B52B9AEEFF6C5FBD E = 0x6B7D P = 0xCEDD0A94A36B76B858DDC6936C74AD06FFDB4924DB40A67A92E1E04B2D8C40F79C323D Q = 0xB78925E051D7502B08DF6E08CCE50079CD135C4E598A0C4401AE7300580ABC4E8EBE03 Msg = 98F60C8C957EE09B5AA93A4F1260143AD426B5C4A3704DBF02006766910247D2629F867B50DB700C4BE6BE97571D00BB201B2B3F3A4D663DF47C0F54BC48556E5EBC34AD82 Ciphertext = 7CB497661BE76C5DF706EB0C0501946ACDC5F29FAEE801A77F8977663C1428136DCBE39A27146272635C3F793546D1EE26850612D784D57C5F3F3F1C14A2DD58E07B06C2773A E = 0x3F5DF P = 0xCFDB1855F00EF13CE24453CA18C30292853D7E67AFE568F0C03E1AFBB68A0FC957559EF Q = 0xBD6E7EDAC9168F48C0B79E5C8DEBFEE0344AFD7DF63632C9F10084605EA7EA2C37DAAEB Msg = F34B51F68AE00AB209B178FA4ABA876F1DCF438016CF7054A4E979B1D239C6FE087E492AD69C47C5F4574DA5C506AB9CE37E6088FC82BCFA7ECAAEC4C14F2C8C7D9144C351D0 Ciphertext = 94450AA696DB0715A5EB2B4FBE5A9CD4B1396A6DD8748359947C809061E13122C5266368415EA7D4AB343B7981229CAC73BBE2233B3DF2F706DC26F32AA428377A0172AC58C662 E = 0x17577 P = 0xC3DFA0C60823C8F5355CA1768BABB4A33C3FFC55CE89FD372F5D9B2B2B49DDD23C669A77 Q = 0xEF50ED5CD6B6BF898586F8DAACBCBD5FEE637F56936C2535F4F5E30B35B9F5DD8B8D6D61 Msg = FE19C87AA946B87FB8CA1C274DAC3D67F5E2D67EF2518BA3C1C6779D42E90FADC96C849065908D836E74F5932536C2CA8F6B65ADCA245F78C6D4F3230D50264E804B460D6C50B7 Ciphertext = 13AF743D2FE2542AE28DB8BC52119F3B563C8D800D88ACCBF66EEDF6C418D9919D21A7B4AEB02882CD8BC201CB66DD81953E27BBC29584148CAD99A4AADB5864B403326A56B19F18 E = 0x3967B P = 0xEA749A2B3E172EDD565949DFF7C6D6862CD6C0926221E02E48A4C57169DB99058F1AA0B1F Q = 0xFBCE4C37F70845A76B894DA16FE38ABA97AC9BB41502DDBB3B8A324D49ED6BCFE424AEECF Msg = 2C6BD8FEDCB431F2F5C4EC93841BC7C96E5AF33CD0A92C40D552F18F27D1021122F184140205941BCD9943C17FB14EAB112BD0298BBD73280611DD873EDB7F8431840D01618564F7 Ciphertext = 06D86CBFCCCD3053F2280DF34E2EE6CFD7C8F9A2C2E1F610918C160BEB3D96C677A44B0F26BF738AE8A94764ECD03AF8F450761CC58698C2D4D62C8357A97EF09811E5AD7272888398 E = 0x2B62B P = 0xB9C09DF3CFC53D3C72EA055D8F4C10E4D477CD657D37F0ABAF4EEA736AC1B2628B00726F0D Q = 0xFE01AC6F0BBE2BA6C593FB96A0C24829183D1D99F5CF39909BEF7B2F0D8859D325689CF93F Msg = DEAEE8D8F4D64EB0D88BC82DCBF7883558A44886105BEAAA2E193ED843C956521F155A750BEA376E179B54465574C75E817B38BC51C2451739DCC8F6A55193076E4654CCED925DFDB4 Ciphertext = AD285E351DF685D52E53BECFF44B24288C323F1E3ECD960D0773D530A7D4D622473222BA35F5078ECD49D2234FEBE178AC099BCAF0C6D11D6309099BEA61DB86AAC27AFC2452034CCD5D E = 0xA57D P = 0xEE13F2AF183D15108C8A537E0FE9B39B3ECAF21B3E29995F121C6C0234FAF590102E90B46BD Q = 0xF369E93A0B0B6F459077A41C4548218D32CB0C2F7E3227EB61E06A2D77D5A638DE0DCAFE987 Msg = BC46B68B8D7CDA2EE172E33D3D4B0A0C3A6174C69920BDDFF99795F36178BE629970182EFF3D3A1D796AB6EEEA3FCCA7AC719436718619D86D8BD6F8F4415464899CCC852E104CC5841B Ciphertext = 5F85961809D44F4D5FA6161F1F69DCEEF6B4D9B1EAC9378595A329761480B9658CC5C5A2E0AA4F63B96E7961AC450C0C37B57BE0956BFB8B4613C9B4FF88C0849E02CFD586AA03847482DA E = 0x13B57 P = 0xF7B57711898D0CD9F7A01F3089748199E36657205D9886C225BF2CB2E592745F139B1C4EEFCB Q = 0xBFAA7B146C59824446B21716A991A09742D9A84B94F7F0A16BF0717B2D9C1A4665C3E8C17E35 Msg = 913167F67F74B1AC7D534A9A6C5DE71227B7F53BCB806897284666E147AF50CB263433F938DD07B5609DA8E0BE690220B57D99F4051AC8D5D67E86ADE626F1EEB0771C62DAB8F4452A637E Ciphertext = 97A5809F41C9AF2CE06CB4E43D96D0762B5317D3DA5B56F38493D4D8A75CB3C7361801887C9210D39B5772BA7F32D302F91CD622CDD9FAB50C3A14AD95824692660D1631AC601C310DB91D61 E = 0x2FF3F P = 0xF6F1763D1518036D58CA36D95E429BB9B47B2C064227B8C8875E0B16326A09E8397EA805DA825 Q = 0xFF0ADACC5EE6B8D4E5E94985C9DFCC826A650A1AE1CE888ACD44D474483873E855FEC4EE7C235 Msg = 92D02535AB6B255F85546AB69CE4223E63F4355ECB57DC8DF1F0E56505721A78233A9D94A5B601537CBEAD6E092F1ED4441B32510883B2CA7C2211D04785E78E5A1AB4EA07E4983DACC4DA1C Ciphertext = E131DB04F4578910C3DB88C909BF429D29D02541219925CB4447493CE13BA756D5EAC4D68EBBD3AE853844EBD5E3914F3001A5B722D4EFE0C1203D89B9045440145966B61D3BA1CED4AD32C773 E = 0x22E97 P = 0xE420CB77F5D12BA62595E0472843C39756E9CB097992EE1CD06F96EFA9ACC96D664764A674C953 Q = 0xE65E2465225710AF7467023D6E9546BFCD04BBFEEEF6A29302B584ED6C9FE4ED4E0680ACB9A79F Msg = B2D4480F64C8E6D357A260031C3940D93380AAA828FC80171DE482B4788AF1373EA3833F2D547B5AC63279BFB8E68A2BF5C9721352F650E0F00E1932D9106235B2A99D74D133374CFB08D9FBD0 Ciphertext = 072FB6A4F6B90C43226E0ED5A5233BE19529055EC3005D161AE60506A98DDD5B5E60C48FFA2DEE0CCD2B4F3F39938D52A5FFD3C48496232C4FD6C05D05E72BACC87087908FEFC6849BD196686D7F E = 0x3EF9B P = 0xF6F758693253F88229EE11BB55982A8D27B424032BDB3FB47DBEE09ED159D54D2B4F3D9B3E54097 Q = 0xD3C1DBA4606571FD58FF9CAE5B0B74CA2F496F444C37BBC0672AE5CC22547EC5CA90837A6865477 Msg = 26B0E340A506CF587FE2AEAA4BBFF8E8A721C5DD9F96823274EC3050C3AE7C04ED8D102044AAA86F4AE7BCDB8D53FB0129B152E4CBEE7C176A7945BDFA561D03554EC6135205A0B0D7FB79B98C63 Ciphertext = 6D48A0CA04F5E1B1CB5C8C58A14A3F79AE1FE20583D6A22BAAD4BE1F9CDE028935E7246C2DEF2BF591BAB9AB2974AC6EE226031207754FF6E0FA032CED158AD41B9183FE13087C5C07624B4192B1F1 E = 0x15465 P = 0xD005A4FCE046350601ACFF864B0D2B2A09E38D5E96F2CCD6AFD0A1C52270FCE297219A52EB10BDAD Q = 0xDFDF0E254343E651DD4EB4B04B881B8274565CCCE054DEA6CF2E24B18B1B124B9C455A898C6D989B Msg = 105D43C035EA626D0474851CA5EDCBA0C4848737F0C24653AC2C0025D0076A7164DFC6BE2F3833D34CC52773C4A9E5C29D18CF02558D3A3A0BA45BC142221933923066F745386E4FFCB12600ACDEDB Ciphertext = 5AD148B4FD171F7CF6D44F69A5A90D96097D20C2119A88692490D9D86F1CF3D00DD0D0D84D71D3634EFD7EADCF1052161608355D1FB00DA6C36679C51BCF079348A62C1D6BD5E094F9CD9095EB828057 E = 0x1D9AD P = 0xE2698781666556447427B2E3956F7A8A9C089021158415144C4C48555C4B8AD95862C275C7D319FDF Q = 0xE7588730EDF12A42C40BF58E0E32E0FEA473D683577C7901F46B26793DD002B6EBA0F9E72D79B1B97 Msg = B31908872EB8E97BDF94B976F04F24546FEDDD4E20D91B6555DD4B4B8E33EABE577AD922C5EEB3EFE8E060EB69763D9D9072F121DD26097B262A765C1556BBA32AC3D80FF23538ED50CD7594805D8165 Ciphertext = 94A809E73195D7EB2155623CC8B383C28B971920A4399787809EC0CC2E6B41AC9027C0B939157AC45936DE7CA116F625C01EE6419010061B8CD2D0A9047F89FB5B5DB630AC86AA5572A81C326B6906355D E = 0x32623 P = 0xC83A47D71C360BC385D1A52A792F209596F5B71A0E1743B7AE19ADEB0C84E3A74288884786AC5F5B4D Q = 0xE72046AFE6C5478EC868F602A71316FBED2FDC8D872D48A5EAAA05235EBFC42A4DFB599C13BC61D8A3 Msg = 5C5CE3F7AE9AF68B16F451F67057F8C041398A53C6FD194BEC1CBBF0F074C2A45C5C88ED48E4A215E32CDFABDA45C92F24F94CED95E8C2DBCFEFF9506181BAAFB8EB6F5688ACFB42C0AA0DD1DA8CF4B760 Ciphertext = 1D7BCBCA46326BB722340D45EAD0825F5FB1D6C9FF3C7841C749815500A227990592D599BD2104F53C9D2DE460CE8078222A3FF34218F89FE0065E4FB852E623024987FAC1AD0A12EF239BFFB8781B38A86B E = 0x1F471 P = 0xFD762F93472C2FC5B3198306AC6E4D18088B0A65AD4975EE26FDC78C52C4B7CE3E754532E95A5B548BF Q = 0xF15450F4E38CB8DAFC3153725CC289DA9F0F218CFC65F6D62BCE770F4D42763CFFADFD26DD23682F419 Msg = C4BD415792D696D83CAD82285A0E7A06CD7F05455653F13F56DC4D463CEE6753B6237B301A5112D7C8995815650C38113272BD0F6AF0D5D51D7E5EFC82B9DA66242B5A71FC6A6C0436DCBEB86A3C1CCDB75B Ciphertext = EBE9C9D258C09B1F708235D5CDC2751923A993A9176241A5554356C752C62F081AEBFF2E133002B1E70F5902CBE6C8DE8B12080FB9CFE04C1E7EF7036D0A6D07CA091DA3B085FB9159BC5107C728F55FAA25A2 E = 0x2DF8F P = 0xC3362EF39B78C21469D23C2FEC1642D3EB7A7B72695A14FD07A0E6D616B0C50884540BCE165971AD3833 Q = 0xDF631F65CDC45053FDDBA18E67E47F45F14D876E4D89101E531303735B38C883621A2CB7C16AFDCBF26B Msg = 50F14DFFF4F8B138F12159A52BD7B22BCB6979062C8EFDA7E9923A7EF43996C954EF15524745D3A3E5BE1A57D416B02F11D9F7BE36BBF56CA3CC22DC27DAADB3423B4788B5DC72BD0E6D3083F3303AD92AAD72 Ciphertext = 5F5BA5370BCD31B61BA12DFACE38C80A3941C76091E3CD629DB5B6BA90415D83EDDE9C640D84D8D671F13974DB70A85ED0956EE53ACBCE54EBC328729630AED05321A2FF3C3FD7F1DCCEE8968F9317FE00FE3244 E = 0x33801 P = 0xED0A07AAA76BE91DE67ED0EB199779B16FCA57E376724DDE07B11C538ECA422B15E20D2668E6E76E6023F Q = 0xF053CA61904163A5AD824276A97ADD3153B473CC1A45C401EA87DF2CC9150B2B8BF817499A2A0E2EF7C3D Msg = 585918DAE91862F4B8AA6F15273D1CDB9FE2ED4D7F0AAE8AB18D2568BB844B37297FD3B7AF38CA29C3FD944DF17C62258CB0A4774FCFCF3D46C1D8A96EC87E935D38D9069F337998C7960DE1BF808940E2E5ADD7 Ciphertext = 978782932C74CE5E40602583D3A3F4C18444692C62F13B571C2FBB0BC3512F5305A90298EE626C3E32AFAED17BC3CD85EA6C05A8F84E8262160AD9486EC5706560769494E0B3E90CA6B752DCF275FEEEBAEB1C78AA E = 0x28F63 P = 0xF69378CC655534C08A24FF41A6984AA981AA71574EFBBC565ABC63320F1CB5A20CB599FEDFD12559C884A9 Q = 0xC954A6E1207C0C36D39ECA530B5496D91A12175E2BD9FDD2DD897542694DF50292D93136252493F5FDF347 Msg = 6D63D56180ACB06BA7DBE50E01F9D50424B9545CD054AFE4BFD6BD4B14B718014F2A9E712B3EBEEEC83B1209F895C709186E9D898CC9CED462168B129534CB241D6C06FB2CE1984D04C2434153AAC472994AA6D3B3 Ciphertext = 4A2046DBC2C49E68FB37D77CFF89E2883610F0076AC081FCB9684A4962BF8A21829EB10E94C35C5816FADD1F1CFC4405FE9833F79CD363A512DBACC6517D98305FB38F17F5F04CBB3C8E944845C3727295CD5A097824 E = 0x3C283 P = 0xD9E9285C4E77272100900893E78AFF01DE4C6CF03EB8B7B62B4615DC09B58DF98ACCA559DE476255363DB7B Q = 0xE756DE8333A525E410D4E896B4E8C4404B55C919BA168F97B6E0B6D1922CC56EF3BCA5991A3D9822EF04725 Msg = 3134FD350325ECBC1E8E1E702C1CB3EFA940122410B2A31BF90B7578D8B5370AE8C961CF2824C5D5A8B298F84CA31F57353C432A22C17C9CCA6501250A6B930E4C043E634CD0308057C0E719E220478022C4A13D27B4 Ciphertext = 3BF6E6EC491B9615E640A19A9C50AA27AB57E3493F96C4271CAE56C377815CCF2A65867CF93277948D6ADBDAECFA629E41E72E20974735AC615692DB76EB7CB83F9388FC86C86C615E13CFDBEA9567A95E2D6B61FE6077 E = 0xE505 P = 0xF0D1129E96239792FF1B59BE8D2B755018BD8CB83DE5D825C04685917762185A62A080DCE9D98D389AF0040F Q = 0xF4227E1F8DE368420D5D6069E03709168A8BFAED59C8E85C8294317C6FFB98332D736540CF888EEF6C0C5CA7 Msg = 72D86399CF78FC56C6E3FCFEB75AD0399692D3864AA1060E5D92473E82BC9950D037D478D2130994A2ED377D8ECF987048E0014A1227D818C5913CC1F8646B0EE10961A3189A031073867D763262BBCCA2FD04AB7DA443 Ciphertext = AEDA2E28A4DBD01A7F288202D1D3D83BECD2DDAC7E6CB38261CAC58F5DB02916DFF53A9FE8EF570CC804209081D465560CFE9563C8A217581DF8FAB4E1F7FC22AB8D89A9D1BD9A78C1AFCA5197BCF6BC9A8D84AF53A5EBAA E = 0x3DEB P = 0xC09753C0621B13376CECE340B0B0048DA5F4BAA4C8DA1F0E7EA92ED44E5DE757971F155A6AECEBE751E485A9B Q = 0xCA4B0930AB38FF92E10A4AAC631797ACAD2924219FBF36E4AF18DC918BB40574B072F23ACC1CC2C4B5ED15187 Msg = C82FA6530BBF74AB38EAB8C116F5AD50AB007BD36E2BF91B9E14AE69CA2639E6FD928FCDBA3B0AE7A1E58142B37167B41885DC2B6E07DB003944BE7D1815F3EC442B47FD4518BF3B31909DAD3D950ADF4FBB212B31C9B62F Ciphertext = 03B2926F1560ED49557BA17D127C669D4DA2B37809F14C0ACEE845F6AEA36EAA118125D94F9D9D017C9EFAC9AFB2EBA7C4DA17B95833CE1EDBD846761E0F7872247C23EFE8B2451CD4F5F84C6888159705A9C4AAFC3489C2AB E = 0xF4E7 P = 0xD8658E89C4E85DD9EB45D4584265686E8D19E9AA823D5C37532C6F9EAE8BE236713DCD3DB23F414C55D8B6D867 Q = 0xDC3A02867F7A3BE96A167491BA202175E8902776A9F3D9A852929F27DEE0FF99F5C321A8D5663F7CF074D7AF01 Msg = A77BC6D9F770F51BAC0612C4939F10AC9F336B61EA6D87E3C5E25B053792D9A90F990A18CFB8208D027D7C63E14FD4076243803D4EF226C4E17C801EAA3265AF361B8434EC8AAC8144777FC00541898C637A7681353C99CD7C Ciphertext = 3CD72CDEA001A4F815D1634599DC6BE03371FD68D30D2AD40FB38E1ADD92057E4481822E5977A94EA02F9DEAE1D59DEC6F9158D45D0841A981D4D9FAC7C766A8F9E92BA06B67AE058CF022FE39FD7373230B831AF141C3CA721F E = 0x10C8F P = 0xD946C37A4DA5F1D01ECE1ABCCA98DF361D2AE47BD1AF421464106FDCEA6DCBECFF3B91163FF9C0AF06EF9FE368F Q = 0xE3D6B43DDFAD06AAA4941129A4FAB542C41BC55834B4D9BA01C5A4BDEBA010B0EA2D125C23396B669B8CDFA5651 Msg = FCCB925AC2AD6E6E5855455E84E266CAF5E6A397AEA993003E80F3F7D3A1B83E3A1DF9F87233CBC3F2969152057EE85254B84260EB6D156DAF844C994F03EEFC0B4446B25D6C1B4C464238871A5EEFB45DC37794DD64E4A8C175 Ciphertext = 3026BC29CE98BE196930D34F12C2DA7702373BF4B15860DDD5FD61DAE4EF0DBDB353DAAD8091BD89723BFAD2AEC3CA127594A9A8F2E7244AD821483EB73B014DB00806A8C5BECAFC92FD79609E7F9469EEA28F21BF4CB1AD468E4D E = 0xD89D P = 0xD65E29ADBAD552696C44154EA2C80C23F49A604DF256730AB1BDEE5FCB9D9C2480CB1EBC78830DCA559F40ED42F3 Q = 0xEEA2E85BCCEB57BA0730F0D01940F79A55B91D2CAFF54B709E7616364B020FF9F640C4AB1884B8EF031523855693 Msg = 702D36984EFF9FDD16A879C177768B4C497E384E657CCE78C9DB496F0898FC3DE110E46A9679838900A5177027E9AF0907A8074BF553019327FE47DCD86E11E4C545D80AC4275FADD2E0909236E55C6846317BED4D286A8B9D5122 Ciphertext = 3A3E20F621512BA40CBFA6CECA990404275CFD2D6465DF62EC70A3CF0AFAA337D6968EBFE5E66B6FF9666BCC800E80F4BCEC9DD33076DEA1033A391AB220DBEEFE6257505F8DA1F61EA0219BE7B93A89CEDD5EB1E6895EE81DF52DCD E = 0x96B7 P = 0xBA0A5FCBF606CCA93394B2874ACD6B27E8A56B358ADAABE8FE70577C37B13EB508278ABFA5C3D055419150FA77145 Q = 0xB8399927DAD237158D4385C3D52A5237BAB2FDE90A50CA601CF8C9A91316D69E8AF3A66DC400F884FFFCCA4B4D6E3 Msg = 1BDAAE1316925E851F9A25903F3551D8EB7DD69B81A63D9574C961CB8A3F2ADAE7341C82D8C60DD6F28D947A40D48063FBDCF4AF69D5B355C0C931850129EB8384CA5B805692EDAD9D5A26C0C9D2A02B195BD8617DC39ACA0F349B7E Ciphertext = 7660C59184EE406D35A4B6909A5711B2F7053F948DE92C3D75947191406959434B529C035AAB7785DDA4B14D9D741085AE1ACC5113AA0A3E93A26845F0E6A25DC88C4865CA046F35A1EC6E8E4DAB59055DC49955021EDF85A50FF3D08D E = 0x1CDB P = 0xDFADFD5EF2FFE2F823AA107FAB9388C6E4614833F697701882301A874CF2D2CC8C5E8D881DE3B1C86D043B0EAEEE87 Q = 0xD5483867A334313530C629B9B6386CC1A385716FEF988EA995DE8987380FDC1F2518388107C939DA0E1F3D869A66FD Msg = E1B889BB7FE5A95A69CEFB78A20C748F3F44E9734F7ABCD7D241E9831DCD3B33A36622F21EE32FF85FFBB1C56A379D8ED3A0CFF791E61BD6E4822AFC05F22E356CB10899DF3B2D5119BD9350FB901A261995D616FBC5F851D0C787E31A Ciphertext = 04D5337CD443A196514E2FF4A3C264481DA91FD1A01C8C819BD376222A824CA6527F7C488493645808577F17E896A6D9A39B6A3E9CDFDCEAC46A2160752D4F30223FBEC4ACA5A01C3AE3CAFC34ADABDF661BF198C7A0EB4C696C60D590E9 E = 0xFE1D P = 0xFC7C6FE9C0AEB5586DAD9FE052587B0174899B7BA9336E1F43AA74DA97B6A51C1095255F88F2518070C79CD3D1753E3 Q = 0xBA97ED086E482E723CF61B68685946173D5E3E18E08755EDF817671144D752D388C6CFFE89E0AA1B0C204E9BDD749DB Msg = ACCD4BA9136BDF04D0DE4EEA9DF329AD891D115E2426A3AAAC41F69F2AE156D01BA34B5B2515A7CE7191A0266A7EB280798D6BEE627B65AD3A8D7A5E94603C79DE429D9EF8BC9C4DCCDAD768D0BE24E89AD29FDE7978651ED712D17F4269 Ciphertext = 66F0DA8E2D30844A391FA9320732CB75AB1ECC4D6694B0775DA41D029A8A8FDD0CC7AB74E52D2E2D522AE7F336D3A7C21BEAA708C933AFF48BF117C99062D899052B2F9CC5C7C86DB7F2A5CF9195A1CC8E73B82ED6F3B4C7AAFC9760843E15 E = 0x2F99 P = 0xE2AF62AD078155F452BCDD17DD1F37F73F22652E4D341AE558A261FD958E7304FB6A7DAA6F1D94F670F2A6163ECCCFD7 Q = 0xE716A2EEE122C98651180F8AFB865C6617389489B69462D9A18570A4DA0A1006AFCDE60DE41F333908DCFD82C31C39EB Msg = 1350D7DD6D558BF7B2CC13628D12E6DA39F925D6F966103BF00529005E6B0A90A63FD58A674467468B065EA3E48636B9B409EB4167443699A47B435ADB68847D1EF00C90BB890AEDC6EB57BC3E8DB01CC990F14E6076AB5E7DFE5B7C5246DC Ciphertext = 46DE5E9C22FBBB39C33457C66F4C447E922EA5B4D822BAFA60FA072B83628D34B27316B8FC418AEA2FA0C6E495C474BC205DC35F32BE6FADAC38D2BE7E0CD1AF1A548908F0D5C1F97ABBC1A3ABC30664E46579E12CC9624DFA7D431D44ED4809 E = 0xE3D P = 0xE7D355D9F62F6E79567C02305D34EBE95852FD5E77123BD392ED843E3D28C22FAFF3390E7A1FF42E453730ADDB98598BD Q = 0xD6AF51AA7C89556E79A491895000665242EE272FE3E18E79A6CDD9B7BA694784BF1A9611C9FB10183105DF0535DA57207 Msg = 8B7800B682AD7562D7677DF8AE845D1A67582F5400D32CF51B044DC7DD9507C5074BE468AAAE7A6C862E7C5267389A93D365CED7E60D70E0FCBCCAEE2ED4CF549B7FE6BB2A3D561AFE19B9EE0D094082921FBF7DA194B884189A659E72989DB2 Ciphertext = 815912EA98FAD3D186E4E778617398B99482FD96B642B5D97C76B401FD028C0925017DA2938DD756289DA08F8409F73E0D382AC7709AD0924AFABC918380C2A5B00804BDEB99B249FDA0AAC227083861D9961EBDE7A64935E2B71271B9558CACB8 E = 0x37337 P = 0xC3335C0E3243BB8172670A390A4C6F1D51CC249F8AAFDC77B53CA05912808CB2A7AEFF1A8CF56129D45C80256C6760E9F1 Q = 0xC8978DAD5BC81B1DCE811A010274BB838F641C996AE49B186018BFE91EA04A54E8488CF31D9E1DD1ED2486CD817CB7F05F Msg = 7EE901DD41DF722A51579A4499C02E981D73664634BD6A032BCECC326E1CE5C7247ABF9E6235877312D282F3D3F6613D3B7BB97F963B4437C69C6EDFB6DDEDD519F72BB99E155406A7577AEBA85390AC7EDC18046D639C70D5EBE3EBD73466DF68 Ciphertext = 4B2E3B069A2B0559A1BA2E50170C0DC28930B7D2F6954DD02D4FBD2D97975D8FF1E2CA851640ED8522DEAC48A7FBCF85DFB18D698F9D3DEFCDDACD99AEBE52651CB2456420497507D3CE55CC4CE411249840D776AC2952FA5011C68DF7353F832FEA E = 0x4935 P = 0xCFEE1A3877BEEC28653154CC1E158B7DF10BB6BC046A0DA3A4BCBB9545964D34BCDB256508D477B4C2DAF0C3A15BF602487 Q = 0xFB2AD04D99FFA45B66A5A60F1F674107A384D121C5B463177FBEE5964A1B3713BFD37CD0517132B74F85B792DE1EE71E7CB Msg = 8E90BB43D3CF22F8A7893F4B36C746259DA901FABECFA8F4667798AB74DAE54C9B2539DFE6B25211EB9A1E169B609B3F84C212B4A568CE1B86157780612E41E90D20B6A1F71507D16992FA88A11D9C897C8E98CBCFE6B265E31A1B242670E23B5AD4 Ciphertext = 54F84FCBF1573D4B08E67172693B2BA017EA34E8D27ACB16C9A43B0CFCD0C7CEC122C1B8ABEE8FD58CF82F98FED112A31FB4DED936143BB442F947BACED07555041DAF78785C63D3B323347F45BA800E78E545FC115D873BEEDEE9AA14D281439141FE E = 0xDBC5 P = 0xF75E869AD89EC4CF9BB028E3A67A40533FB4BDF8E663DC038E70A19C23B37D49ADE4CFD219C3DF67DD18A0CD6869494EC05D Q = 0xC921AA94CC7653F9D02548B5DB56A46FC5304A9308CC0232773537EA52E03D5A2E6CAB5061B5C788B357BFB34C4CA782FCEF Msg = 7B766FAA923F1925F89D91707735570A0E856AEF65FB5232A1EAEAFB1966BCADB826120DE38D46513368A864290B36A5708F970AC9C114743964ACCC95E100AA2AC1A0A4993B34A70BA336968A9C7CCDC264A06BCEA69D47092856FE451BE7892B17F1 Ciphertext = 5DCBA27ED4BA89D25550AE6587846322D73483F60EE2F128B025C496A0440680FB49B49A57CAC9479ED3210A27BC31F06257878FE3278D79DE65C14083DAD0B29ABC32C4C1DF53019267C698438FEE0609C3E2492009F2E28B39A04553F6D6B18D16D867 E = 0x20B7B P = 0xEE50E2D3362D0950E6A79003E342238AD710D03737EBAE5BAAB7A0A4FD7A7F6AFA814E768D9F12B16C52A5294A8652E4BD44D Q = 0xC9977D38FACE5D6003FA12B76880D2545BC15A78FBB19DA19FBDBCB5C5916DFF18A35E10E0479FF9F5C5D807D219F2A10D64F Msg = A298A470C3B161484FC89CB9CCF39F6ED2E141447DF74EF559CB049F2DDBF1DB354864814E96137E790390AF567253B3461D3FE0FD359D8C59268B0E6BB401A17F849414D6B33FB43DB254ED557CF14A97FBC72CE7F13D1B0F607381D009C88C64889BB7 Ciphertext = 6C777A801C39D3E984289AA21D01456AFE5946DA4C236373B3FCE7DCF15621DA90871AF969CBC06E671DFA7105892C89BE8649B3F27E28461D1C02C071C7D319F8F5A3D5A53B1A66D0330579807B7F6AE0C897A71367207A7BD3263B10F4C3824BFD11B8C5 E = 0xC31 P = 0xBFD406DD82D7EB42637387460A82E2948FCBF40F9CBD8025F1B02499ECF9B84D5777C596F3004814F746360BD6F599526E4099 Q = 0xEC593281958D49E5E4D8CA8EC3C68A00A19CB520255E19E1A6813E724A0B7A8C7ED9ACD221997E2CC915570F702A58CB9B4B1B Msg = 06FC724F11105899E12F70570719F342CF56476A1631C7391196F856012032C97B94C10865CE4BBBD6D524316B0A6DD4796F56B62FCF585F83DA7D138EAEA0FBD7E9E7074C5F1D835C267D2DFA369EFE75C2D1AB473A29B035750AB3E048A5CAE8CBB7CB7C Ciphertext = A34426C6435AAAE6C0A176881E4EC4FA6DCF1963761C36144B109F01BAC3ECC7FCCD63591C7086BE2BF77EEEE7B707CB13D19533FB82AF97F80E430552BA461DB9E6DFB37B573C0B8875C86C9060342235A2727EE1B291F9B8F89A84CDE67FD48BDD923AC1D1 E = 0x3165 P = 0xE13F572C3892DE9E82619F265EF1D0E028AB2112A9F6B855883837C930AF6C50DE5958B8EF9E706E8A5BF1FD041FA89D4E1A66F Q = 0xE255C42A2B88D2E4B1FC51167ED335964D980670B30B9EEFC8E896A52DCFFBE8AB5C15D465C069040312DB7B9D9C62D990A78B5 Msg = 62505EB7C1E4AB70E230CF8B9974CC32845FCDC37174DFF0CEFF7BB28FB44D4DC9C326393C4B185E8B2F5E306CD56D33DCDA16DBB33832F3FCB437AD3A31D7205C87BECAFBF42C81CFFB14D4309B1503604015480BA539AA79653455E481A34FD24D6086C04F Ciphertext = 00B5D962C18B90010043C6B3B73DAB6644EBDC9BEA758C890F60B8F5694DB3419C29968AA245CAFCD6784E91608670E50F6C9E726200ACBA8C776438C2D35E6E0CCD52E2B73EC9F50DF0BC864BF45909AFB80AB9CD3DD2C2C1246E7AE78FC759669C43A1D69A5D E = 0x139B3 P = 0xE87416D7D28BF6370DBF37061938D4098CE25E503F6974CBB36494B21FE81AE18DA11C25C0077E8F147115B259B2663733CA24FF Q = 0xBDE29B664ED4544404CFB420E81CCC2875CC6088A82D193167CCE66EFA4D6E30790D882F4DE4FD6852568E8A81B52769C8D4E039 Msg = 5B514F002EEE84D142DB23D38386460AF5EFDAA7FBDE017347A3AE359573338DE196215D4935AE0F8EFD5929FCFF748FEF07FD42C9614635B249130F291DAF70F8193991EB2D7D2B77096395A112C0E792F76B4049BA7037D4CBC4D2964DE324FD456B52E4D153 Ciphertext = 662807DC23C41CA24C64A2E5502C389314EBC3C9949E93DA2D2BDF7FB1C1EEC21619C373948A7C62F2B902F77B7B5BD5823ABA38991CFE6A60C12FAF6C1FDFAB2AF539CACBCA7F805C33875D8985B3C7642CE9551738C214BAF9F465309CF94F91C2029D5900823C E = 0xBB4D P = 0xCF8454329613DFADA528D9556A346FD8566F5B1B42A5EE1E972F0A7B8D03DB800C9A04D93DE07ECBF14CD67A11BE27F8909F603B9 Q = 0xF67C6ED7DDAD52B15215D9A1798A099BCF20B7D65434CCA74A279BD63CDDF9D27F381410167C67294535784F860BF22CFB9E90501 Msg = ABD2BD2EF35FF7CAB549E375FCDD9396CCC9F6D51F390DBB06AFCDFA2690BCF4E7B4EB8FD34702CF7C272ECB64A8D3EC50F551FE8548DF5D58455D8113940E65D8D32864BFB36CD641410B60137DA69EDDA58A45EA19834031E788204E4C57B7CCB300F8264F2150 Ciphertext = 26AB09BA08816E7EE65791E8B5539DD6D19A60A4559315969EF3ECB299334F6A9838502555FC7449D80B3434C4C824805BD1F4BA3537D7C0C8DFE56792AF5664B8337031C393498AAA558FA89278988D33ED4DD0BB896F44ADF623A78F385E135085288BCFDF5E31DD E = 0x2EC05 P = 0xC5BBAA73868BB968A5A3693AE84E7FFC58D7B77AFF05BED1B6D2CFBB62207F95CA33CA7BD29000A1592C9895CA60175C4E8EC9F7F3 Q = 0xFEFA4B1CE3D3A3A00FDA17D05E0A95D4AADC7118801B54C04E06A6D6F417D07322EDA0EB9E8672C3CD2C40D90D50D8AEBD61ECA747 Msg = F294399D778469FDE1D6062DDA214686C51069A8F4EE2DD4056D68E3CAA76FFB149AB5B3F2D0951190411B4795CA893A87CE2832FD728FCBB865491349EF9091BEC02FB4611AEFF9B88E7C5D5E3CB2F26D6311FE4742DC234F12A15DCBFBC09DB18ED8D663EDDF3801 Ciphertext = 6A01851AB2C0F15AEB5F3C0F7C4ED4B80D0DB1075B25352DBDB2DB7BA6DFBD07AF4C262AD0C615E8885EDE377738406391BF6402C3A7EE8BEFCF26C91DA0F4D9FABD4A6F06E76047B87B8EE0A5D9C8A04B174504F1E3C4E6A4DDFEED36FA4F5E78F63ABF4838A89DB8EA E = 0x1B30D P = 0xD0E3CCBAEEF5BA9BAFAD06D5B5C6727D5AB85B23D1C231BC0A18EE4F166D4EDDAD542BFDDFF0A9185F3EC41216768774239400D7567 Q = 0xC55B49B03706EF2293963E81A301DF8856C42FC2C2CB10E1CD36E1F91100C87718D06D20A1C7B0DC125D0029104A6B957513DD1926D Msg = 881A8AF4FC9C7F9C48102D904F44829E80A5F8879B8E65792E36B8F15AE189DD36AC9E976BE57A69CE59BD455116C3E281C4371CE0A89A4B59B12CEB51948FD3CEB67B8682B966B9874A67AA61C497E72AB8516F595B582BB828C94AADCCABB51C00498CF7D5BD8CF005 Ciphertext = 25816413403B2DC77D9345ECF1B02C9A95F715AA3A46E8EB9DAE5E7953FC30BA601F22CD28DE3C0397699C004631FF297CD48985B13629FF9E8527FFDDDEE18E6D371DC0CD75353590C8DF50C09032D16C3CBDBFB72C0272D4816349B07459C2F7020955B6A88FC03A0DC4 E = 0x349F1 P = 0xFD6F20281B82FA202413D8E4C9A6873AC3387FF46DEED6E320F80430A1B8B6BD8509FCC0AD982DDCB2583CFA2EE092838881C8F292B9 Q = 0xD46FC162BE2FEA78106D7111E94AA9CE05067D4577E32400FCFB80085976F75DAD9EC175532B0C2E3DB59CEE5F00B02B361754F27A77 Msg = 0BFEDB7551AD05FA01CBCCD7EFDA1FFE2BEF0959D0707B74047F7CB64A165AFE80737F259D7411D5C0BB7713470325EC4C282D7B4F5CEEDFD9C57383AD0409A76BFA7D9F391BE001F3A3CB535ADE0D2726EF9F7D33D805E6A607B19AA83A7457F3911DAE74145E2FE732A0 Ciphertext = 4685DAE11C6F04EAC0BA5FC5017CAC0F398B0290D128C857D0F791A9D5B0E19329C86461C1D04F08EA31FA7B64B899AF5414C3B9183338AFE87278D74A1E7B2B40A7B2973D2C4F13D848A9F81AF279622E1CC097296CF370634B0DBE6FD31B6763B6D9F22A5CC1E85A9655AA E = 0x38D9F P = 0xF4F791961203FD4D4015567EC4CE6C4C281900A0E73EC013C766D0211F20CD369B698208EBC76F9573942A8FED30CEB201E4508776D31 Q = 0xDEEF6180D28D8B4DBADD5274DE22A249FF83E8A3E77F381B01A455FB3BC461BCCED640A6CF399B48DCC2B35B5250BF82212F49BF0101B Msg = B52F8BF8BF76798AA7F876E0D76D4EB5821186244A5570D26029F2E720B966A610D4275BA74D1C369990F6174F6DFB4090F3C6E98E3A0363019FD98C1EB913F0F5AE47095224064FA01EE862DD089A6A16B6AB78719927F571BC04A2D1CCF90906D93C3AB5BBE89FA368385F Ciphertext = 455F2109456B04D35ADB476EBD40DE17B5843DFB011872A444B14DBB3EF1EDC9508C16DFEC97B29047F46E5837284AF8A5EF12B28CBF61BAB7EE7B92ED5D60B121FA8EC4B8027FE9A63E24E85E4E7E01817073AA40AEA874710452C3C5067106BFF3F2DA855AB7DF04787D0711 E = 0x26B67 P = 0xF160B54868F1B3FF0AD90572170B554F75E7F49A579783BD6338F55AD88678DE5AFF6BAEA9F51159CCC80B84B196C357B0B89F58EAFC55 Q = 0xCF68CCDA550EB334438AF72DE86D8CF18B0D218E1A15B2061E1EA663083905762427533CE71B404B965D37124DB8391638C62F5F747E41 Msg = 41C35AD24402B4D134126B140B75150CA4192AB757E03F243150FFF9B69B721C51DC09716782B494948522185A1EEAF642492DE7B4523896B4A73B264FE8A5739754DE7FD1261047F0446C9B44D85EC72262A03EFE848EF19E471BD110D380C0E555D0E8B8377DBFE07B38A8E8 Ciphertext = B4702064042C93F7B2BE232DC34B8F8EB59554DB7B68B98F1B642A91F1AFA89F6D33BE1DD8B6162767D444B3D8207C578DC83A69F85BDF8E4784A266C9F474A556C1423C54C9940EF602F1063DBC0D6CAF08E05D628A2426DA8CF6978A41D4EA0611FA43BC5C6BB92C39F2486468 E = 0x238D3 P = 0xC607A2D95AB46A416CC4694E087C93E73EBCAFD1738D7B5CFEBC322FE0A1632099A129596C3AE955C77A6171A7BE65E0B9610842556B7AB Q = 0xEDD4D4CA2759A11B0D256830C17CE7DE58E7152B971246CCBB7E52F3863173C1819F633F3AD7D5EE1217F747169718EB8EC14B68DBE6D31 Msg = EB8006B8C13866902B142447B8A360719CDBFB017B1A9473565648B9940A61B495412881BEC7E023B410186C8F57F555EABB860469C22C155546F78C9DFB957707EA6F4E51E79E1CCFC3A8C7CD8B560EF11C28509F034832DD095F3B378BF2AEAA6ECB1813E0462955825A3EC14B Ciphertext = 6ADEE0AECBED2E017022BA21FC0B369E1CA9D7C9A3359A53FDE22A817E0C8A8E4853433CF4C96E20B72F0AE6102065C6401C31B87A7CA48EE75494EF31BE7AB42C7B127E558716CC57E9AFF019AF32FD0CC1C7A09922A46B3DF31C8094D4F996C87C980AAA49A50FB4F6B97AEA4530 E = 0xFC65 P = 0xE51741CAD444F02E7F689DEE1AFDAA02C6F7BD29847F3535C988E7284F6434C4CD8FAE24E04AD8AD605155D264DA6DD31AEC0919B3FBCF27 Q = 0xEB66E3C33FF2BD0F27072C71455B8CD72B732345FA06B94C2F4A3D799C2E12DDC3BF2EDD59B4D4B29DBBB96C3346DCDE5EC1E3B2030C5565 Msg = 7C06B972ECB5E6457E7BC929E2095469A724A641F93DA43EF9C2AAE756D2A5558C7F21EE47612B57DB9104F90C52567DA8E68208D487AFEDD30F2EFFC3642FF010591075AD1B03D543B1E3E025D4529A1D3970BE040AC8CFDA9C5B5B41F2E6E28C7FFE8C2A17123D5CEC05BFA3DBA9 Ciphertext = 4CCE57B3471D119AB5D0D8EDB148B38C48CCEC514E11E6A00C023448374F011C78E2D1ABDE688C3BB2B48733FF9B9523A7AB3B01F6FE116293D8E36080672E4A726E2796ADE6097A2000097350C99E36B584B652880930942A6918BB0DE28DB94C846AEEF8151BEE6A3E96D423B32097 E = 0xC407 P = 0xBE39B346B02ACDF3F067D1CC0689ACA4811AFE9509B1513E9E4B52E6BF648F219253824105114E749DF1857758C5A0C54830B1ED96B15E301 Q = 0xC1C2031D5F29D74B4ACCAB0C211A1FB29A7087BE34A800AB601363662CD998574314F6A60F76EA153DCCE7FE75BC7D13C859B45BED8CFB259 Msg = E2C9221D1C5B3C297E54881C4A484DC88E229A1F89CB9E03A7A836C0478696ED1448636BE98E06A549BAF0BE30DA4AC1552B17211662DA4D945F0849900EA02CCAF1215EE1B631D795BE58F572CA1B498961780B2C50A88C67A3EDAA950BA986193BF10B3DFF1EE9E0F6D8814F4EA821 Ciphertext = 0F19E9BEA836057F18CBC1C1A7ED08DAD6D58FE84864755FDAD69BEC2BD1AD9DDF0097D21B05268737898F852643F3DAE32FB5097D95B4AD70A74EF2E7AC1E7714FA57436A904AE361EDF9451EC406C9B726DABD0269EA5BB9F92A74BA4808A951204A92C6EC3AAC9466F2086CDC4EB279 E = 0x1DB8B P = 0xE1677D97157A28E686A6DA2327E0DB9B1BB00C0A286D2939348B44B14A1484F5C32F1281D92503DDEE248145FAB855F41959C7372AED2D7647 Q = 0xF86F396FB930A154377F68536927C5EE34F9A948AB1887AF13D296505F4762F459015CA892E5D92F44938E3E4F855130A624322F2D0D5698A5 Msg = 6F1FBD316F2B02DD8917432A5E941C511C482F93CB179AC4C7DFC34C334932976A1D8FE9D70571CB02BD8A34125FAF0E0F136E6C3EDB74F3B0F2D8188AB73FB25DA5A3B1D6472B4009A6F53AAE0B58FADDD971B808118230C88AFC628B3DCF85A238053642BCD1F1478BE2B05514A56ACA Ciphertext = B3D24948C2D3BFF08B9B3B11818E0517890DE8FFCB40AB7DD40AC1B0FBDA19E2678C67C53C6C3F921CC4AAF05CAC7DA47B5CBF6EC5731561CF5F42FAA0A394D1CF7FA4874AE7E344883D3982FFB91175E56AC49D21B01859D93787AAC3AC1C24A03D73C93E1E43981D860C7DC4C84D307A53 E = 0x3CAD5 P = 0xBAF9A508017229DEDAAAC51B93F8E12A8C10E489AD9CF90CEB127EF503C1F56158F92972A3748DD4CD20AC162DDC4DA061626176525E9A80365 Q = 0xC8504C3E93C15C6241850609EEAED406F18E0E5B9EFB9FD6BFC0D474D35D7BDAA63CA925B3A1F4EDAE9F9A99C1366D6EF5432188EB672EE86A3 Msg = 6BEB86F20DC86874BC052DC6C032E40E2E555D563D6002A6C269FF9C335680C0BCD901D02583EF30A3FC3E68AB218CC47228EF9E6CC14930CF78CA67F5618323C95605D73BEC5389017B77C300D0361AFEAB7E97D7215A8B826F91B9BE823D2467032EC6A58A9DF42766CD912F6D3EFE2AE9 Ciphertext = 765765BCEAEF80D33430417318FD4775357D8DFFFBB4147B60EC0BB7704E5801A6E329B2D7A39587DE75AE2143671AF854213664583C69CDE7A26BF7F108513B9F0BA6CDF81B28A65C7E2AA541F4BE5817761F146AB1ECAC76EB2EF1D1FC42A5F4D10C93CC2F3D2556CCA71A0215B96257BCA7 E = 0x203B3 P = 0xC9336B9F9A8D36E22D93739B8EF9506C3A9A6BB976ADC8777BD29747FF186681B5E77A5ECF5253B1E9AE531EF7B32EB86FEC641AA718916C64CB Q = 0xBC37BB3C56AF232171EE83DE4113C79CF78E675B7E4E1F4F6771384949382CED626507FA5F489B3CCFD69E18191C21AFDECE4D9A17BC7EACE0E9 Msg = 2C4B930C9ADEBCD1E36957E1817989B56304B53B03C9BA009875825CCCF5B0D77A7F7F76164EB0B35DD262817D8E1EB5C498ACF16F4D4CDB0AF8918E54E7F5EFF050283D533598E4E6CD128E58CDF5417F520F0980671FEF7CE77E75E64EF2261F27BD50ACA5C68D8FE96F33B85A76337556FF Ciphertext = 1327DCEBED97BCEFA5EC0D6F4BFCD98B28AB14C555D31480C81F31E1E0FECC2DC4608E8BED5F2AB89237B3B44C46443C4169E25AEEDE620C7625B18B862614DE26DABACCC21901218D667D27C8A676EAA261E575579E06532DFFA1EC9E18F23D8A94B6DF6DFB5C52A30F9AFD22B6590081DF7453 E = 0x2487F P = 0xDF3FF505147F8C7CD7352E57F5CCC3661B4DA5B003BF7D3DE39761EE8CAD575B64BEB5332DDD4C3ED6BA64162633A0453FE4FBF33AF34329C5759 Q = 0xBBA02FF73B4C0ED4F774C4A878D696658CACEB13F56C9A936193C28F3FA20A4056213B8A7E71023806DB7C0D49161C59E2F88B00604E442AFB909 Msg = A527A2D970C829A7C3E0FD2BFFE9590B3A3C8E05C3DF8EA923AF156DDC30222BB304CFFFEFA4DF81A63B597FF983052C556E69D6CEDEA86518F9A5A301D03E6686D19E346780EDB5DB589C9047C18E6CC6216D4A0C2E14505E744E3DED365DA0F1B1FF00EAD5FEC05E6BC9F7EBE8408AD89757CA Ciphertext = 57FF544A0A4E5E892217382BE63F656D0CB49582414DA7AD5257C09AAC803D60CBCFAFCCC00E8DA84D02AC0059CA11868996F8E163C226FDF23C7C7F7550AF30AADD03A484EA81DE3D6411BA9B0642532A22A57D01953BA8D21814B72AF28EA499070938224BB8F98A0569F00BA55D7D4FE6813D43 E = 0x35AE7 P = 0xCC072B3228FDB247BBCD39BE7CDE954BF98133426E79C6416E8658BE8DF09269BA3E5A5AC0784065895D3E03355DD1DFD7EFF7F0859F317F8A32DF Q = 0xC78470AE335A28BB07ACF2DE39A1C180481C0F5DB37C0B60B97F68D584B24A3C39A4C315D2D2004105D774D966892BB0659DAB963C298FBC7720E7 Msg = 6B18E5D6236AEB054CDE9DBCCC8710E2F8505F7836AD84B4F90BA5E1F96361871DD99AC16913E8168A74A1B39E607B6FC0E47799A5E55970D53A9D5B0708D7BF7FFF88CB9EFBAA18F6A0101093AD2272A1829594206B329783D299DD139F1EBF85C7FDB18330D91223ADAA6EDB317F6C54854D002F Ciphertext = 42F95CD54C8F50ECCE32D08DD5C66A8D2B5D20B3E3A5FF70CB772CB6706120D666EAE0C608E42FBFFBB3C064D7810B424A640EC7E01930A76B2EFD6618A8C967F126CFECDC61476C7BD0981A0C86A0A50B5F04166FBDE23479CBFF6430A6C5D433AD4BD7F0F0C9A47D060D795191FD49D8B71DBF8111 E = 0x4813 P = 0xD55EB495A0EDD8784C918DB2C9905CADB34AA873865B61F959CC39F3944444E4E411CA490B323FF92A47E780BF90FD861EB630ADA012F4B17C8FB19 Q = 0xDF5304947138D4539E8D0DF7F5A521DA90D0A79468FBCE67108DAC5D904ED820444C84FE09C0993DF8CA649AED14E7B77A8C8E96F3EBBDF6FEE063F Msg = 407D8F49B0A0162D162DB9E89547FCA67DF28597E3EDF4024225A815CD16C113EBC2406DD8D5A57C7828E80C81F87F6AAC25E69382C4F23B6DAD015EB4A373D48025188A3861E6DD5B6430CD21EFBC0DD48B80225810831F23F75E4BE2FB5AE9A6191C633F073463FEC87B33C5B03D6ABC3DF825EDCE Ciphertext = A9FD95925F1EB6A3D6D1396DDD8F459FE31135A07BE71DD9449596F457DF174124B2D9A4993D115055EFB664EDAFB73D51992E366D6010299E0CA65EA40CA76AF496EF024F72706C04AC618A50823FC4647868F607B6CC6BB489AD6D2041970074452B8A0826D4BB0E9463D296C0DC54D241736F59B506 E = 0x1E497 P = 0xF9DA4CF8C42981521AE47857D0A58BAA9B0D7EB223646D19E3D1F418B980FA9BE962AFB73619A09D3B308E7E42AA3899FB9194C6325C3AA423CEC03B Q = 0xD6E7608CB975895E638794C140060A7B19794890E373274D24D29B786D1510B923CDD83EE844B78035219E4ADFD085A91752B4A0DEFC8CC3411904C9 Msg = 677C0ABB673F029F63CDC4854CECC572EB8FD3AE9EC5B254CD64803CD853B8AFBB958399D077F8F0F8DF0F109C780B89D317D293953D3C814F8F9EC1E4AAC029B6B895453D951090558DA2614F94DB90ED3E62164D12E2A5ECA60234E153274154B82181FD3B060E84EFB9718F643ADCA016EED2C89D40 Ciphertext = 21E9AACA4B288AD3843FEA09406E17D94599BB610FFB02C86EA9843076DA91ED2CF55EE3D32C1F6C53B5777DDA632D05403DFD77AED342521B988ABED48ADCA7FC1F4E3599949F257A5CC2710218FE6F7E18554C9C26383198808C32B41A4600C19FF249291B788B8C438C999B2872F8CBA86FAFE8838E96 E = 0x12B8D P = 0xC6C04E18BA8EEA6AD830FE2652FF3547F4F693F41B681B516B2F397BE89C2562D259C0FC3698B326290366331582F687C0DE212C30D1F573A5494DDA9 Q = 0xD4D610D560F7AF67828C7602E12EC69F6665DADE3E339619DCCD53518009DA9EB019D4DF7D14D29B1CAEB46AB04A414C50C1073E61BC85310144730F9 Msg = F55E6FEA0FFF7EE032AD7C94208C337EE80B2AA0F4F2E0D066A05DC8FB528EA638539DB94820333CA86D759086CF2E78E9695BED9B1DBF8DBF3E362801C685F688E36D7C41D37BF4B4DECAE1816070518246FF9B73E807BB91B7057DBC74B8991E0B7E1C79FC1C1F87C780D7221FC476494D1F4AB666DB3D Ciphertext = 27B21E28A286DD57100FCFD98CCE8C2ED2F1E2D2108E5A02BF96A0125AF563DA0EED6AF54BB8D0D993BA772079EA644A2884E7160776F31F5F11D7BB47495611B30441F990FC107667F740C08B660232EDD4A83484AE029E34326AD69E01EDE3461B54733580773B1DFE807CB549269802138967F59F59826C E = 0x52D9 P = 0xED557EA9DB53E4E24795FAA88F8414BC67C6354111CA244E2AC0C99C48A0BEF2FA69E69AECC74F5E6DC79B0E2EF849C95E881CE9BD5B60516408D8A8D5 Q = 0xD08480C28C9228B2E196E5F672272551E456E80086EA3A0300D5440978F35420211823516D2D130D444602DBEF4E68EAD7AF41F06E970BC95D9E90BA8B Msg = EA763D61DFA0624CFE25EEA744FF0AC80C5C85C4ED6A7E8C2303A1CAC4010931EF4D9B9414A98ECB5300CAFF1AAFEE877813545EE56F7DD26A6005F142F771F4D3D1A97CA5995F91FEF25B1BB772B12AFC6A1D37A1CDA7175E5CE22571A3F8CB88664A06FC907FFCBFD5E6BF3FD2BFA98D5993BD5D949EE887 Ciphertext = BC9AC00C07CB8BAB375AC69C14556D39DA85D019BA1D776CBC4857546AD44E857E616EC312839E2A9AB55C3432373682255A1CC06BEB9CE7C3973E8B4FC02C1729B992AC40C0B371195E0A5CAF80F074D0608CA75885F63C340C96A1E29237C64AA3D60F9EE59D425D757ECF8CC9009DE2B2AAE8AC3786F639B3 E = 0x17549 P = 0xE60CA06397622C744F64ECF95F3264F1C8C819FE0D596877859DC7DA2EAF6CFE25907E4D018D8FE457EE7113B09AE7E2D14B54A7AD7C1F294FAEA719A2B Q = 0xE3FE78DD4001FC135E4185121D5E8F6BD766DFE45B818DFCC1C2DC9F1E1CD4D1E9F5F7D42582F36A918E7787D446E93DF1CA90AE6A52220D9A1D2683F89 Msg = C0D448DE6D8C704B5AFBA03AFD8DCFE4CDCA0493A9D64D095B0A19320861E5F42B0EC566B82B1BBEB4198815AE19238EBCEDF59FE26E4283E5942CF77CD1B23C5B901A542648D28051B5F994163C877D57FE27BB3D3B54CB929F9F4C24FC1B05F9EE7BCB7E1414DA3843032657FCE85787A1185F2BE2C025D100 Ciphertext = C9E14845932307783E85CF97F3D9FCAB04C3872E5767E04AE1F954E7A45956CC7FBA483DB789136702B48446B177F8D36917674732972990053F5896D35D563C975962C4C405F522DD44E5D0072AE7A403AAA1C8DB53E47E87534148B55CCC38896A8105A583D363D3C5EBBCA3076729F69E1272B24F12AB7DC983 E = 0x189F9 P = 0xC630CD0B8D86A93343EEDDA96B43122C8DC58318F5664950CF34CECDC9EF3796F71675712EDD7D08E675F491EFA99383EF1DDECBA36CFB4F2CEABF3BBD4B Q = 0xF9012CA0D0A2C91BC317819EA8EC23127357B84FF6F4B4995BD3DC6EBFDFFE8A7809C42B4C4D64267CDC77D29FEBAF99355F00B4D64872C7B4A466C7195F Msg = C42CF8F1ABF85A849137F421EE51F3B2237D052E89F62D2F8576EDFBAC6D926285096C4F5AB8210D467F2ABC0A8C99FD39EF76EF51CD479B9DA20F082ED598E006E0EFE884D33B59D5F52E969BD42F7997447BB052F70AE020E7E1FB6E8BDB90E5B8E53AE483CD29970184BA4BE51747BDC1D752B214497705D75F Ciphertext = A2BFCB298708CC1D0F0E5B3817F669757CA02AF173BD04B6C77ABFD7446331E4E7E2526DA90D2E79B60ADC06284F72FF053854CE1EF8E449FFB70333450887EFBEDB4BB833696105AF4109ECE8E24FF9AAC5B16C3D3467B081967C1534782C29205706E199ED51D2FC87832C2ED5568EAD28F668009908AD66834A24 E = 0x26175 P = 0xBD3E5ED73F6D8751F6B7F6A9791AFB12A42AFC6BD4E2F73C14146945ABFD1073BFA87778B6805891860A636884618ABB924E681C26C44D08A6A2354351EA5 Q = 0xD14A005FB2E1CE65F51F36F10C23211BDA04159AA1E25510CC1A7BD643A76B923BA0ED47545161B50AE0E137EAC684D9064E258D0389818695715431B6695 Msg = 01224CC754FC5E4922AAE8D64BCF2EE50D13765F80317818CB3973B187BF3C17DED4B3AF27C938BD0E36F875A6D953808B590444A1B0C161189A93938063C80A78DB5DB689BC4AAC587F0DF6EA119DFFE6CA9B67549005FA4FF451354174175D2AB236B3D6A1E604DF2D5ACAF956AA42B82A5F03DED91DA07039C464 Ciphertext = 466BBAB71EF00D9436CDBDC02DA1C7CFD3D59AB48D60E82A87C39097BCF8DFF3D6807D6DD73CAD16101245515ACD333DC808C9A894B9BD754F6921C518C5E9E16F71B6009B078E15F53CA3400F0BD927D2416BE129DEE6035BFA74E3D8630A70055C229BA3B0AEA304D8F77A8407DD8998E124B93DBD1EAB29CE11B558 E = 0x32C0D P = 0xBFD70BCEA35FB6BC5C4C753CAD49FB6E86985D6F3687AAD9CACA49753676D121AADD87D175D17EE5D80B9D6659B00289EC4475BF003D7D400177012ACCB72F Q = 0xEA764CF0C0D3583F0C4B4F9D096E1E4668439343F9A937EFFCC1A0E589BD3B64F4F14D745FF1E38D720E581A64A3045F70B92A6BF2031E67EFF656749EA1D9 Msg = A4F527A26115BC6402C7DACC1D8925A28D5AB036B56677634DEAE7560EE6F79DF87293564556E155C8CBB934ABE781313AF7DBA88D65D0DEF4975AD6284A5077CA35CE49F1DE12FB46ABBB3072C2B17FDDD93D010408F9790A9D1896FFA362C43FE3B61B6065A09F715E97B353BB471F2AD94F115CAF8A5FDE6B91826E Ciphertext = 80C7B635AD6C6499764DE4AD8F9EE1654FC83763B4097E4AFF6713EF1B3C7D627B291CDAF41D9D8567758D6F9107AF7ECD0021DA4F54FBF979F1C1AF24993B46347008F51BA00F3AE1386B5C9AD29B378FE434CC6B620CB2239CE94D5C2755FEE67621649B526505A49451F4469B29003DF8396C2213475FE7CC671CF0D7 E = 0xD6A9 P = 0xDD24EA4BA93BCCEA6C7676405EA6F04F13838390AFC51713DAFE299D36362C525F6C2D1CD4DB15DA08B743005F46E243BF34F285A9458575DD61C31F12A2DE5 Q = 0xC152185775ADD140C1FF045BCADC81A81DB36BDFB61B6581F78B29B9130F8B7F3D31C508524E0B487F441F01BA831D8C05F23CF47D14B35DFA5402F0A9C003F Msg = 14815E63D355877FF38F110A6B5BBDC86633936B9B28669E66E6DAEBC85A213D40C63080C5DDA21237D04602C02DD480E753E4230206DC216263E56E129566D094D5B574ADAD461C04D3D20145855F94E02ADD5854E89C48EF18330C5F9BBF7D1EC9638E4ABD835755DB84ADE864E3AD2DF04D626E91ABD952EF451292CB Ciphertext = 2A432208D0CC726487A772598BE3DA4799B484D4C28ADF06E2A914BDF7ACF826080BD56DFCBC9C1E8DB37AD3D57E2EB42CC5589E4DFB2AAC63B7F61A05FF744CDF6D68441694947B2EE1003D33E25F706C4EA70EF39DE831B520B39FB7DC02EF7A9427ABF86900053DD316BDE944ED001CAD53F4C6E68C336B3050AF52B081 E = 0x34213 P = 0xE35B81A5A1B6199B689C0484C332C4E9CF8237BA3B3215A3C50B9FA9704BEE13BBF8D96B8FCB716390A4A52D9E0D8066F4C171DE3007C0E3CCAF7E7ED0A3974D Q = 0xBBBDE5B062860702D894E1B70C555330E8CAC1688484C94DD8C9029487E181FD32B3E4A26378943B5AA33DA24676E240973076712FFD89A66A9B58C5BA83C69D Msg = 96BA67D8ACBE483DB6CADA644C2D8A30710395047775A43D5DEC9F2C1E81D2B5D3D926B27DE207A7000189AC87F10ED06DE57793C301A9B05958537C9E5D486B3769BF41E9B18904C5D1EFF9B5A90C040E1E5FF21E872A06FFA9C5F0BE274A346F425D46BD3B666CE2C0D9843DC4067C04CE019FE447131D78A610A5BD648C Ciphertext = 7A7667774523649C72636F1A0599A0D1865B32A14E9C50201849A6DAD8AB96D1CBCE55054BAF731947DDF6645937C9C39D9F11ACB9D2A3DBC7C16EC7CD5CE13AC82C85DDE8213E769A6440B67C1A78A1A8BE142D50A9CF127EA9BE1BA252B21460A4C8A196B50D7DF022E289B6C0977D13C2D57FD0F4F90675C7E8F018EC780F E = 3 P = 99010592955939952524979806215701796367994338316505273190378538719818351907917 Q = 92363400110149466883691311721283715218677143818967206998812216967090300995683 Msg = 01B40EAED76EC2A26C41DF58CC23516E7974537ADDB1D3ECD0DCBAA4F09458AC49675A20D51CC2415DA2992AC5EA983E5EEBB83B9C8C276C68E11158756904BE Ciphertext = 32E6A9BFF82BF351E96292947AC218E977AEEB069D09CF438DA0B96478DF7A1853EB8BA770C16B5024D31B6C2D2F83E867AA37C9AD42E7F13369F171BDF2308D E = 3 P = 104290639198308511609978277729934076143699233816345754647340002533086668256809 Q = 99188084023481930466539770400504565071103168874099815636272276174738388025397 Msg = 01453FBFA6B146374602261D86822493E2CCC960B75D2A124B182EC70F22FFBF673F7E0EF0C54536C76B534DED77E1D044AA30FB075A0D52733C19825E1941C6 Ciphertext = AAADBBBEA2716C35EAD89736AA97A8FFF0078A07F48A9888294929B8917297CC53AA9CBA9FA9D80791F24F749BB1133D0A48C2117572DB73C5813881F4B5087A E = 65537 P = 32397944957062568778782735677392177852211091070956936442912049546612900948126761076138806302631142511286417825681743 Q = 30483380437902645768763174629464025552989822241614160314573305383261575994289009528536212453465743070209775574571397 Msg = 010E1F619D8F90D37563050B014DEB3FA3E9B735F8D28D625682D6A4663E6B334C8B94E91A24BD8F88C29A890F85C9B36F80E8675275C9A8F79F4D5DDDB891294325125D4ACFECD291875BA10C24547BA43CE2F7B1AB9FA84AEC0627A59750E8 Ciphertext = 296F935C38845C940F820C379F8032101EA4003CED8BEEE212F2C6F72EB430C0ADF48B7ECDDB296544D8FAE80E2FFF084671E88A88334EB8E718FE8B2524358CCF9EC32CEDF93087CBD39E784FA66B3BD32A427D69EEC93607A8352955C774E1 E = 65537 P = 32751912271485507869630870075934394775492560973203582026742376285129278528731717520407913766044870609827792097894223 Q = 30215809731457806312132910510610626377642932878024085919364439659567302385541858440831849965579653388774313959624977 Msg = 012E1CD97DB414715594E404B8B0BA9C3928CDC2CCF5F71C712C462B7BC44B90F36869701C7DE17111C575CA752F66AE583371242868409A9486C5104B10A03E780AAE94878F0599547A63C9AAC97802FCE926255167BFE5ED84F5389496760D Ciphertext = 3ACD3EC198014D833BBF4DF281C82C96777C9534584CC926F9DEC42E7C1F846B582A267B95EE4CDAAEA7AA953330BE584BDAF75089FCAF66D386AFAE39C9BF70B9D21C0E4C6590C67302AAC0A8917A3F33A39F7F921820E8DF6E6DF85CD6B6E2 E = 65537 P = 11239208455594220199561761724335933123875940148262933290549565513213918922986439102227235942676016728540285761717013949431378456304479425153593554132406379 Q = 10207229944746281895260108921806548094936186847081942483161680373811942807463343148547471349234226182649131392607422425965930012705401430385789386779980357 Msg = 01C4B6CAAFF5ABF4FA027C945EE26974E77DAF3FDE5F51899CD64DD7DDDCAE09A164D350597E445481C1E8DFA352538ACF03C9AD621A37FEF184D5CE6083D701E8AB5141299695AA577E89FAD0DD849FE04E4C4268834159071628689AFF6982AABBC3D451597EA8D708A2A7E52646C5749207DD1648361D5F5E85F95EEF7B08 Ciphertext = 8095B914D477DE2AE3F2AC7648B32EB497B7C1F4FF298D4B82F0A77298574E94530DD9FF57A205499100D5920999182E1CED1F25971B27C0C3BCB06F0507305EE90AD35A00469341B47A6E2E1BB7DD792F6543F74D1FDC2CDBD433DC7C9728F558DA656E5134FC174723012151360E0310B31D4112FF5CC5829B0709F8EE7303 E = 2147483647 P = 13306243859542517984148257344793888910940556444231185479831989325160112308518678420320476155531731784077910761854431615470590046601498839650190128653586373 Q = 12544786481900314653872114245103002701855029425324053172415999430939582667212012622951185849391771550626344406893276715030933905294276427057485478796892089 Msg = 01C84780E9F341C7AC81703D1E1727D134E08DE7F80636F38284BC4EE3D55F959DA715879A564E46D8BF83F6D6AAC70B8A55F2825B2875DDAC312B90068B25A4323A2BCC9079126838965F0F40261ACB7B0C4DD634C3B3E1F4DF71FB6A969F9CD0CA6860437AC97C10288B514EA51CCAB169A0E52C54C62133371C9DCDBB399D Ciphertext = A22AF2E3FDC9AD8215510CF6B55118A720DE36C84DE8CE00FA769325E03BB0CA81BBD2960E834543443472E58754F9ECDE84D32B4F7CB2C2A5A14A60CA91C9080D3AA675E56E53B2198627938C9B00ADAC3F07A50AB0622833F2DAD34C73D0EC5717613E02A58936EEA60928C1A894C589FE4995607B1AF62C2BE8FD3E8ABB83 E = 65537 P = 12989411720445855195379130098112394118805608713632934538069003218048331962120161822833562362676753511950901223542963132412039411683176299770313637616479897 Q = 12463716606325119282356608588642812207650286345903744180418613656481532769917611200194671027969940773974506753003692684675646845639012295626921168016574163 Msg = 3BA94D8CC1749902F4599D63A527DACA74870714BC794813247D000DCF31BC57E285CE5A1236EFD1956723B800C3C19094185EAAD7C744DA4917E34D3DCE5FCEF4E6D797510B7A5BA67087ABBFB69FCEE5D8A98AD9A3D3B2AEE9876B9358562F460A0D6C4B5D98E3D305D6B944832859CFB01072C6FCEB5D0558BA7D101458BD Ciphertext = 1185126E43C7B5F8D15523E65DAEEB6526CDCF2C8901DC7A1EC836C22CD4C3441C24B16AC8ABC3E00A95C6BD03EBEC74DCA1EBD0DA6E61395452587B36DCD7347184C9005177839FEDA5273007DD0AAC0E8C87A3EEA71F7DBEDDC7FDDD637A2DFCA2FA1215DE8C332ED4BA093B6443C65B32AF294D8A56A1BF8702C1B9086E36 E = 65537 P = 109121448729529942655579737234895224674673385047988084118288915909406076682289 Q = 87327614524398710678961459222446065441241442373553067397959009671294445110879 Msg = 35489193F2E4B7B7FC7A52CB4A3AE2F7F97C02CBF43A60934CBD8AC22159266692767C6C587BAE7B73E63EA470A07EA67927923FEC2ACDDB1ADDDAC75E8FFA15 Ciphertext = 29772BC15B6095A66060CC76884B3E4C77A2330A880D9FE64B007C1DF792CBA5B3422F9BDDF51C48E567F114776566653A7F7DDDB8686BFCEBC94B224D7CB0B3 E = 65537 P = 99696961709331635021431451372570346307372695638294123844289910246014585214677 Q = 98843166251140459381350455308494019406720075342620875274529764264138210572367 Msg = 35068206D5C287A47F95BD8ECD11E557D86EDDC993FCAD94F03D86C1BC97E2B268E637ED1A6B0EE459214E0F61099B74469AD36A3A37217182C42B0C48A4B413 Ciphertext = 261D5A9298BE592400EE703BC27C2A16761F6C855607D9AA62A9B36307FC51006EEE06E59C55C9606FFBCF8DF74A98B5C9FBD17F0D7ABB867B4A7CB8DD5DC15D E = 3 P = 13382703241232033579067245875944151729789989814112534336160941721231954473486436706919526807249646763617103882578575850541499816829940318031851338680577043 Q = 13125264856842772189945745184313539520638397121792884775317257486086623091835930470769837093366916043447359999537079307756936671459051755793135700239676017 Msg = B2207519BAFEA1FFA5561CE47F903CE59DA9FE82DA7D4C867A92F28F180D Padding = EME1(SHA-1) Nonce = FC0DBB14EEF2D2FBD6D75C7D920D96F5057C45DA Ciphertext = C1659606D25D6D3274B0380373D8F0F740EECFBE0E7C5AF20F22ADFE54063E0DB5AA23737992C216A66550E8B0D1730684588B1CA0FEAC63680A7EAC2EB6DD73EA5B2DFDFE2A41C47D28027E9400FD71A2A8109271993C629A39A9B006AA11ABE798FCB1297BCA3B42CE1BFCE817928DC3BDD7661BFB2CFEA5B1C2D02B48B821 E = 65537 P = 109540052440968042921698045789892582895744443681665759042409080417548762872287 Q = 94989729539940729337205201522386254048733728973529732517382043774386971448673 Msg = A3208DF23DFB014D257B4C3D7238A857AD Padding = EME1(SHA-1) Nonce = 0E151CD5DD9014F9BCE7BB3500D1E3A7EF3F36F8 Ciphertext = 374FCFFE225903D58CE988FC469AF9B6D660A90A48FFB7DCE207888D871587D50494260231664CB03C18A427B04BED666770B503B6EF08632A00D9D03888B1A0 E = 65537 P = 376875813744188336444254174392754065258358977261789553032476304099885095852003 Q = 182334861951888732447921403146116780447120952951306907382383467026688268692707 Msg = 8F6B78A9F0D0F35BEFD38B Padding = EME1(SHA-1) Nonce = 25D6DBAA5DEA01099646C5DD25589A10C414B6AE Ciphertext = 0091AA69E80C2690C78B99D5BB71002BDF019B12CC6ED5F7ADB0D2AF7284D1E2FE14E372C71FEBBCE91309D7D18EC979DACCFE11799E31BEFF9B4D25D2B9DEF8DD E = 65537 P = 790816078197252280582277651690857309244386891300287548104691844141717560847863 Q = 359413696455144150319265705408667411425393190887560590834611438719516684915919 Msg = E729D4D596553F96AF Padding = EME1(SHA-1) Nonce = 36FBC9529B999745EF9F19DF5A7C4E783013C661 Ciphertext = 02A9176EF95FD74880B641C1E67367F3780B59456EBBDC05A4B6EEC3D3F8B8EDE063DD1E2300E24CFABF475C8F3BCCF987C043A9A839976ED7B3995752EB3A746B E = 65539 P = 3107302076066166751801914578908051910822149056108712362311484904220784347261423 Q = 1574224726761151474032574427980951789950105943472706068767361609602582513548893 Msg = 45A04558B8 Padding = EME1(SHA-1) Nonce = 6587ECBA1C8A7BA7C2A8B4DAE9D4076D85CAA2FE Ciphertext = 011F8E0F8A7FAF157D2C5938B137AE3A8A2158F9784E1F09E205A7C7C71505E7D50DB8E967B1CC637EDB766B12570328B7C7832DAE3F79C25D14F26DF0729F726C80 E = 11 P = 35120983107766812261428279712000613031111015598796266433322360120215673403061167800630780537321394553476917072410979 Q = 30743741671817967446027282741120369010107722245487842291067113270554532228419162492541831898534812103299456964505753 Msg = F5BF1834145D40D0A09D6331204035F76EB7DC981734E09CD1D755B46484675A447F8E58DDCE287D6B8CAE8BCCE3833A9A5F Padding = EME1(SHA-1) Nonce = C91DFAC04EBDD389B0A172520B3D189C6E19FDFB Ciphertext = 75CBD6ABBDDA5A8DF4470955E212778FD872B0816E659C42F9D796A48ED86EAEFFAE39EB4D25A218A5EB6252DAC6A73DA23B35D967286C673FC9A603AC9B2803A8F75BAA72A22A3601FC0A1AD9923CF8A75B749126E2C98BD3AEB4EE2FE3452F E = 0x10001 P = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Q = 0xCC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77 Msg = 6628194E12073DB03BA94CDA9EF9532397D50DBA79B987004AFEFE34 Padding = EME1(SHA-1) Nonce = 18B776EA21069D69776A33E96BAD48E1DDA0A5EF Ciphertext = 354FE67B4A126D5D35FE36C777791A3F7BA13DEF484E2D3908AFF722FAD468FB21696DE95D0BE911C2D3174F8AFCC201035F7B6D8E69402DE5451618C21A535FA9D7BFC5B8DD9FC243F8CF927DB31322D6E881EAA91A996170E657A05A266426D98C88003F8477C1227094A0D9FA1E8C4024309CE1ECCCB5210035D47AC72E8A E = 0x10001 P = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Q = 0xCC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77 Msg = D94AE0832E6445CE42331CB06D531A82B1DB4BAAD30F746DC916DF24D4E3C2451FFF59A6423EB0E1D02D4FE646CF699DFD818C6E97B051 Padding = EME1(SHA-1) Nonce = 2514DF4695755A67B288EAF4905C36EEC66FD2FD Ciphertext = 423736ED035F6026AF276C35C0B3741B365E5F76CA091B4E8C29E2F0BEFEE603595AA8322D602D2E625E95EB81B2F1C9724E822ECA76DB8618CF09C5343503A4360835B5903BC637E3879FB05E0EF32685D5AEC5067CD7CC96FE4B2670B6EAC3066B1FCF5686B68589AAFB7D629B02D8F8625CA3833624D4800FB081B1CF94EB E = 0x10001 P = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Q = 0xCC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77 Msg = 26521050844271 Padding = EME1(SHA-1) Nonce = E4EC0982C2336F3A677F6A356174EB0CE887ABC2 Ciphertext = 42CEE2617B1ECEA4DB3F4829386FBD61DAFBF038E180D837C96366DF24C097B4AB0FAC6BDF590D821C9F10642E681AD05B8D78B378C0F46CE2FAD63F74E0AD3DF06B075D7EB5F5636F8D403B9059CA761B5C62BB52AA45002EA70BAACE08DED243B9D8CBD62A68ADE265832B56564E43A6FA42ED199A099769742DF1539E8255 E = 0x10001 P = 0x0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B338AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43 Q = 0x012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46DB09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7 Msg = 8FF00CAA605C702830634D9A6C3D42C652B58CF1D92FEC570BEEE7 Padding = EME1(SHA-1) Nonce = 8C407B5EC2899E5099C53E8CE793BF94E71B1782 Ciphertext = 0181AF8922B9FCB4D79D92EBE19815992FC0C1439D8BCD491398A0F4AD3A329A5BD9385560DB532683C8B7DA04E4B12AED6AACDF471C34C9CDA891ADDCC2DF3456653AA6382E9AE59B54455257EB099D562BBE10453F2B6D13C59C02E10F1F8ABB5DA0D0570932DACF2D0901DB729D0FEFCC054E70968EA540C81B04BCAEFE720E E = 0x10001 P = 0x0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B338AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43 Q = 0x012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46DB09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7 Msg = A7EB2A5036931D27D4E891326D99692FFADDA9BF7EFD3E34E622C4ADC085F721DFE885072C78A203B151739BE540FA8C153A10F00A Padding = EME1(SHA-1) Nonce = 9A7B3B0E708BD96F8190ECAB4FB9B2B3805A8156 Ciphertext = 00A4578CBC176318A638FBA7D01DF15746AF44D4F6CD96D7E7C495CBF425B09C649D32BF886DA48FBAF989A2117187CAFB1FB580317690E3CCD446920B7AF82B31DB5804D87D01514ACBFA9156E782F867F6BED9449E0E9A2C09BCECC6AA087636965E34B3EC766F2FE2E43018A2FDDEB140616A0E9D82E5331024EE0652FC7641 E = 0x10001 P = 0x0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B338AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43 Q = 0x012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46DB09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7 Msg = 2EF2B066F854C33F3BDCBB5994A435E73D6C6C Padding = EME1(SHA-1) Nonce = EB3CEBBC4ADC16BB48E88C8AEC0E34AF7F427FD3 Ciphertext = 00EBC5F5FDA77CFDAD3C83641A9025E77D72D8A6FB33A810F5950F8D74C73E8D931E8634D86AB1246256AE07B6005B71B7F2FB98351218331CE69B8FFBDC9DA08BBC9C704F876DEB9DF9FC2EC065CAD87F9090B07ACC17AA7F997B27ACA48806E897F771D95141FE4526D8A5301B678627EFAB707FD40FBEBD6E792A25613E7AEC E = 0x10001 P = 0x0159DBDE04A33EF06FB608B80B190F4D3E22BCC13AC8E4A081033ABFA416EDB0B338AA08B57309EA5A5240E7DC6E54378C69414C31D97DDB1F406DB3769CC41A43 Q = 0x012B652F30403B38B40995FD6FF41A1ACC8ADA70373236B7202D39B2EE30CFB46DB09511F6F307CC61CC21606C18A75B8A62F822DF031BA0DF0DAFD5506F568BD7 Msg = 2D Padding = EME1(SHA-1) Nonce = B600CF3C2E506D7F16778C910D3A8B003EEE61D5 Ciphertext = 018759FF1DF63B2792410562314416A8AEAF2AC634B46F940AB82D64DBF165EEE33011DA749D4BAB6E2FCD18129C9E49277D8453112B429A222A8471B070993998E758861C4D3F6D749D91C4290D332C7A4AB3F7EA35FF3A07D497C955FF0FFC95006B62C6D296810D9BFAB024196C7934012C2DF978EF299ABA239940CBA10245 E = 0x10001 P = 0x01BF01D216D73595CF0270C2BEB78D40A0D8447D31DA919A983F7EEA781B77D85FE371B3E9373E7B69217D3150A02D8958DE7FAD9D555160958B4454127E0E7EAF Q = 0x018D3399658166DB3829816D7B295416759E9C91987F5B2D8AECD63B04B48BD7B2FCF229BB7F8A6DC88BA13DD2E39AD55B6D1A06160708F9700BE80B8FD3744CE7 Msg = 087820B569E8FA8D Padding = EME1(SHA-1) Nonce = 8CED6B196290805790E909074015E6A20B0C4894 Ciphertext = 026A0485D96AEBD96B4382085099B962E6A2BDEC3D90C8DB625E14372DE85E2D5B7BAAB65C8FAF91BB5504FB495AFCE5C988B3F6A52E20E1D6CBD3566C5CD1F2B8318BB542CC0EA25C4AAB9932AFA20760EADDEC784396A07EA0EF24D4E6F4D37E5052A7A31E146AA480A111BBE926401307E00F410033842B6D82FE5CE4DFAE80 E = 0x10001 P = 0x01BF01D216D73595CF0270C2BEB78D40A0D8447D31DA919A983F7EEA781B77D85FE371B3E9373E7B69217D3150A02D8958DE7FAD9D555160958B4454127E0E7EAF Q = 0x018D3399658166DB3829816D7B295416759E9C91987F5B2D8AECD63B04B48BD7B2FCF229BB7F8A6DC88BA13DD2E39AD55B6D1A06160708F9700BE80B8FD3744CE7 Msg = 6CC641B6B61E6F963974DAD23A9013284EF1 Padding = EME1(SHA-1) Nonce = 6E2979F52D6814A57D83B090054888F119A5B9A3 Ciphertext = 02994C62AFD76F498BA1FD2CF642857FCA81F4373CB08F1CBAEE6F025C3B512B42C3E8779113476648039DBE0493F9246292FAC28950600E7C0F32EDF9C81B9DEC45C3BDE0CC8D8847590169907B7DC5991CEB29BB0714D613D96DF0F12EC5D8D3507C8EE7AE78DD83F216FA61DE100363ACA48A7E914AE9F42DDFBE943B09D9A0 E = 0x10001 P = 0x027458C19EC1636919E736C9AF25D609A51B8F561D19C6BF6943DD1EE1AB8A4A3F232100BD40B88DECC6BA235548B6EF792A11C9DE823D0A7922C7095B6EBA5701 Q = 0x0210EE9B33AB61716E27D251BD465F4B35A1A232E2DA00901C294BF22350CE490D099F642B5375612DB63BA1F20386492BF04D34B3C22BCEB909D13441B53B5139 Msg = 4A86609534EE434A6CBCA3F7E962E76D455E3264C19F605F6E5FF6137C65C56D7FB344CD52BC93374F3D166C9F0C6F9C506BAD19330972D2 Padding = EME1(SHA-1) Nonce = 1CAC19CE993DEF55F98203F6852896C95CCCA1F3 Ciphertext = 04CCE19614845E094152A3FE18E54E3330C44E5EFBC64AE16886CB1869014CC5781B1F8F9E045384D0112A135CA0D12E9C88A8E4063416DEAAE3844F60D6E96FE155145F4525B9A34431CA3766180F70E15A5E5D8E8B1A516FF870609F13F896935CED188279A58ED13D07114277D75C6568607E0AB092FD803A223E4A8EE0B1A8 E = 0x10001 P = 0x027458C19EC1636919E736C9AF25D609A51B8F561D19C6BF6943DD1EE1AB8A4A3F232100BD40B88DECC6BA235548B6EF792A11C9DE823D0A7922C7095B6EBA5701 Q = 0x0210EE9B33AB61716E27D251BD465F4B35A1A232E2DA00901C294BF22350CE490D099F642B5375612DB63BA1F20386492BF04D34B3C22BCEB909D13441B53B5139 Msg = B0ADC4F3FE11DA59CE992773D9059943C03046497EE9D9F9A06DF1166DB46D98F58D27EC074C02EEE6CBE2449C8B9FC5080C5C3F4433092512EC46AA793743C8 Padding = EME1(SHA-1) Nonce = F545D5897585E3DB71AA0CB8DA76C51D032AE963 Ciphertext = 0097B698C6165645B303486FBF5A2A4479C0EE85889B541A6F0B858D6B6597B13B854EB4F839AF03399A80D79BDA6578C841F90D645715B280D37143992DD186C80B949B775CAE97370E4EC97443136C6DA484E970FFDB1323A20847821D3B18381DE13BB49AAEA66530C4A4B8271F3EAE172CD366E07E6636F1019D2A28AED15E E = 0x10001 P = 0x03B0D3962F6D17549CBFCA11294348DCF0E7E39F8C2BC6824F2164B606D687860DAE1E632393CFEDF513228229069E2F60E4ACD7E633A436063F82385F48993707 Q = 0x02E4C32E2F517269B7072309F00C0E31365F7CE28B236B82912DF239ABF39572CF0ED604B02982E53564C52D6A05397DE5C052A2FDDC141EF7189836346AEB331F Msg = AF71A901E3A61D3132F0FC1FDB474F9EA6579257FFC24D164170145B3DBDE8 Padding = EME1(SHA-1) Nonce = 44C92E283F77B9499C603D963660C87D2F939461 Ciphertext = 036046A4A47D9ED3BA9A89139C105038EB7492B05A5D68BFD53ACCFF4597F7A68651B47B4A4627D927E485EED7B4566420E8B409879E5D606EAE251D22A5DF799F7920BFC117B992572A53B1263146BCEA03385CC5E853C9A101C8C3E1BDA31A519807496C6CB5E5EFB408823A352B8FA0661FB664EFADD593DEB99FFF5ED000E5 E = 0x10001 P = 0x03B0D3962F6D17549CBFCA11294348DCF0E7E39F8C2BC6824F2164B606D687860DAE1E632393CFEDF513228229069E2F60E4ACD7E633A436063F82385F48993707 Q = 0x02E4C32E2F517269B7072309F00C0E31365F7CE28B236B82912DF239ABF39572CF0ED604B02982E53564C52D6A05397DE5C052A2FDDC141EF7189836346AEB331F Msg = 15C5B9EE1185 Padding = EME1(SHA-1) Nonce = 49FA45D3A78DD10DFD577399D1EB00AF7EED5513 Ciphertext = 0812B76768EBCB642D040258E5F4441A018521BD96687E6C5E899FCD6C17588FF59A82CC8AE03A4B45B31299AF1788C329F7DCD285F8CF4CED82606B97612671A45BEDCA133442144D1617D114F802857F0F9D739751C57A3F9EE400912C61E2E6992BE031A43DD48FA6BA14EEF7C422B5EDC4E7AFA04FDD38F402D1C8BB719ABF E = 0x10001 P = 0x04A6CE8B7358DFA69BDCF742617005AFB5385F5F3A58A24EF74A22A8C05CB7CC38EBD4CC9D9A9D789A62CD0F60F0CB941D3423C9692EFA4FE3ADFF290C4749A38B Q = 0x0404C9A803371FEDB4C5BE39F3C00B009E5E08A63BE1E40035CDACA5011CC701CF7EEBCB99F0FFE17CFD0A4BF7BEFD2DD536AC946DB797FDBC4ABE8F29349B91ED Msg = 684E3038C5C041F7 Padding = EME1(SHA-1) Nonce = 3BBC3BD6637DFE12846901029BF5B0C07103439C Ciphertext = 008E7A67CACFB5C4E24BEC7DEE149117F19598CE8C45808FEF88C608FF9CD6E695263B9A3C0AD4B8BA4C95238E96A8422B8535629C8D5382374479AD13FA39974B242F9A759EEAF9C83AD5A8CA18940A0162BA755876DF263F4BD50C6525C56090267C1F0E09CE0899A0CF359E88120ABD9BF893445B3CAE77D3607359AE9A52F8 E = 0x10001 P = 0x04A6CE8B7358DFA69BDCF742617005AFB5385F5F3A58A24EF74A22A8C05CB7CC38EBD4CC9D9A9D789A62CD0F60F0CB941D3423C9692EFA4FE3ADFF290C4749A38B Q = 0x0404C9A803371FEDB4C5BE39F3C00B009E5E08A63BE1E40035CDACA5011CC701CF7EEBCB99F0FFE17CFD0A4BF7BEFD2DD536AC946DB797FDBC4ABE8F29349B91ED Msg = 4046CA8BAA3347CA27F49E0D81F9CC1D71BE9BA517D4 Padding = EME1(SHA-1) Nonce = DD0F6CFE415E88E5A469A51FBBA6DFD40ADB4384 Ciphertext = 0630EEBCD2856C24F798806E41F9E67345EDA9CEDA386ACC9FACAEA1EEED06ACE583709718D9D169FADF414D5C76F92996833EF305B75B1E4B95F662A20FAEDC3BAE0C4827A8BF8A88EDBD57EC203A27A841F02E43A615BAB1A8CAC0701DE34DEBDEF62A088089B55EC36EA7522FD3EC8D06B6A073E6DF833153BC0AEFD93BD1A3 E = 0x10001 P = 0x0749262C111CD470EC2566E6B3732FC09329469AA19071D3B9C01906514C6F1D26BAA14BEAB0971C8B7E611A4F79009D6FEA776928CA25285B0DE3643D1A3F8C71 Q = 0x06BC1E50E96C02BF636E9EEA8B899BBEBF7651DE77DD474C3E9BC23BAD8182B61904C7D97DFBEBFB1E00108878B6E67E415391D67942C2B2BF9B4435F88B0CB023 Msg = 47AAE909 Padding = EME1(SHA-1) Nonce = 43DD09A07FF4CAC71CAA4632EE5E1C1DAEE4CD8F Ciphertext = 1688E4CE7794BBA6CB7014169ECD559CEDE2A30B56A52B68D9FE18CF1973EF97B2A03153951C755F6294AA49ADBDB55845AB6875FB3986C93ECF927962840D282F9E54CE8B690F7C0CB8BBD73440D9571D1B16CD9260F9EAB4783CC482E5223DC60973871783EC27B0AE0FD47732CBC286A173FC92B00FB4BA6824647CD93C85C1 E = 0x10001 P = 0x0749262C111CD470EC2566E6B3732FC09329469AA19071D3B9C01906514C6F1D26BAA14BEAB0971C8B7E611A4F79009D6FEA776928CA25285B0DE3643D1A3F8C71 Q = 0x06BC1E50E96C02BF636E9EEA8B899BBEBF7651DE77DD474C3E9BC23BAD8182B61904C7D97DFBEBFB1E00108878B6E67E415391D67942C2B2BF9B4435F88B0CB023 Msg = D4738623DF223AA43843DF8467534C41D013E0C803C624E263666B239BDE40A5F29AEB8DE79E3DAA61DD0370F49BD4B013834B98212AEF6B1C5EE373B3CB Padding = EME1(SHA-1) Nonce = 7866314A6AD6F2B250A35941DB28F5864B585859 Ciphertext = 0AB14C373AEB7D4328D0AAAD8C094D88B9EB098B95F21054A29082522BE7C27A312878B637917E3D819E6C3C568DB5D843802B06D51D9E98A2BE0BF40C031423B00EDFBFF8320EFB9171BD2044653A4CB9C5122F6C65E83CDA2EC3C126027A9C1A56BA874D0FEA23F380B82CF240B8CF540004758C4C77D934157A74F3FC12BFAC E = 0x10001 P = 0x0A02EF8448D9FAD8BBD0D004C8C2AA9751EF9721C1B0D03236A54B0DF947CBAED5A255EE9E8E20D491EA1723FE094704A9762E88AFD16EBB5994412CA966DC4F9F Q = 0x092D362E7ED3A0BFD9E9FD0E6C0301B6DF29159CF50CC83B9B0CF4D6EEA71A61E002B46E0AE9F2DE62D25B5D7452D498B81C9AC6FC58593D4C3FB4F5D72DFBB0A9 Msg = 050B755E5E6880F7B9E9D692A74C37AAE449B31BFEA6DEFF83747A897F6C2C825BB1ADBF850A3C96994B5DE5B33CBC7D4A17913A7967 Padding = EME1(SHA-1) Nonce = 7706FFCA1ECFB1EBEE2A55E5C6E24CD2797A4125 Ciphertext = 09B3683D8A2EB0FB295B62ED1FB9290B714457B7825319F4647872AF889B30409472020AD12912BF19B11D4819F49614824FFD84D09C0A17E7D17309D12919790410AA2995699F6A86DBE3242B5ACC23AF45691080D6B1AE810FB3E3057087F0970092CE00BE9562FF4053B6262CE0CAA93E13723D2E3A5BA075D45F0D61B54B61 E = 0x10001 P = 0x0A02EF8448D9FAD8BBD0D004C8C2AA9751EF9721C1B0D03236A54B0DF947CBAED5A255EE9E8E20D491EA1723FE094704A9762E88AFD16EBB5994412CA966DC4F9F Q = 0x092D362E7ED3A0BFD9E9FD0E6C0301B6DF29159CF50CC83B9B0CF4D6EEA71A61E002B46E0AE9F2DE62D25B5D7452D498B81C9AC6FC58593D4C3FB4F5D72DFBB0A9 Msg = 8604AC56328C1AB5AD917861 Padding = EME1(SHA-1) Nonce = EE06209073CCA026BB264E5185BF8C68B7739F86 Ciphertext = 4BC89130A5B2DABB7C2FCF90EB5D0EAF9E681B7146A38F3173A3D9CFEC52EA9E0A41932E648A9D69344C50DA763F51A03C95762131E8052254DCD2248CBA40FD31667786CE05A2B7B531AC9DAC9ED584A59B677C1A8AED8C5D15D68C05569E2BE780BF7DB638FD2BFD2A85AB276860F3777338FCA989FFD743D13EE08E0CA9893F E = 0x10001 P = 0xFC8D6C04BEC4EB9A8192CA7900CBE536E2E8B519DECF33B2459798C6909DF4F176DB7D23190FC72B8865A718AF895F1BCD9145298027423B605E70A47CF58390A8C3E88FC8C48E8B32E3DA210DFBE3E881EA5674B6A348C21E93F9E55EA65EFD Q = 0xD200D45E788AACEA606A401D0460F87DD5C1027E12DC1A0D7586E8939D9CF789B40F51AC0442961DE7D21CC21E05C83155C1F2AA9193387CFDF956CB48D153BA270406F9BBBA537D4987D9E2F9942D7A14CBFFFEA74FECDDA928D23E259F5EE1 Msg = F735FD55BA92592C3B52B8F9C4F69AAA1CBEF8FE88ADD095595412467F9CF4EC0B896C59EDA16210E7549C8ABB10CDBC21A12EC9B6B5B8FD2F10399EB6 Padding = EME1(SHA-1) Nonce = 8EC965F134A3EC9931E92A1CA0DC8169D5EA705C Ciphertext = 267BCD118ACAB1FC8BA81C85D73003CB8610FA55C1D97DA8D48A7C7F06896A4DB751AA284255B9D36AD65F37653D829F1B37F97B8001942545B2FC2C55A7376CA7A1BE4B1760C8E05A33E5AA2526B8D98E317088E7834C755B2A59B12631A182C05D5D43AB1779264F8456F515CE57DFDF512D5493DAB7B7338DC4B7D78DB9C091AC3BAF537A69FC7F549D979F0EFF9A94FDA4169BD4D1D19A69C99E33C3B55490D501B39B1EDAE118FF6793A153261584D3A5F39F6E682E3D17C8CD1261FA72 E = 0x10001 P = 0xFC8D6C04BEC4EB9A8192CA7900CBE536E2E8B519DECF33B2459798C6909DF4F176DB7D23190FC72B8865A718AF895F1BCD9145298027423B605E70A47CF58390A8C3E88FC8C48E8B32E3DA210DFBE3E881EA5674B6A348C21E93F9E55EA65EFD Q = 0xD200D45E788AACEA606A401D0460F87DD5C1027E12DC1A0D7586E8939D9CF789B40F51AC0442961DE7D21CC21E05C83155C1F2AA9193387CFDF956CB48D153BA270406F9BBBA537D4987D9E2F9942D7A14CBFFFEA74FECDDA928D23E259F5EE1 Msg = 53E6E8C729D6F9C319DD317E74B0DB8E4CCCA25F3C8305746E137AC63A63EF3739E7B595ABB96E8D55E54F7BD41AB433378FFB911D Padding = EME1(SHA-1) Nonce = FCBC421402E9ECABC6082AFA40BA5F26522C840E Ciphertext = 232AFBC927FA08C2F6A27B87D4A5CB09C07DC26FAE73D73A90558839F4FD66D281B87EC734BCE237BA166698ED829106A7DE6942CD6CDCE78FED8D2E4D81428E66490D036264CEF92AF941D3E35055FE3981E14D29CBB9A4F67473063BAEC79A1179F5A17C9C1832F2838FD7D5E59BB9659D56DCE8A019EDEF1BB3ACCC697CC6CC7A778F60A064C7F6F5D529C6210262E003DE583E81E3167B89971FB8C0E15D44FFFEF89B53D8D64DD797D159B56D2B08EA5307EA12C241BD58D4EE278A1F2E E = 0x10001 P = 0xECF5AECD1E5515FFFACBD75A2816C6EBF49018CDFB4638E185D66A7396B6F8090F8018C7FD95CC34B857DC17F0CC6516BB1346AB4D582CADAD7B4103352387B70338D084047C9D9539B6496204B3DD6EA442499207BEC01F964287FF6336C3984658336846F56E46861881C10233D2176BF15A5E96DDC780BC868AA77D3CE769 Q = 0xBC46C464FC6AC4CA783B0EB08A3C841B772F7E9B2F28BABD588AE885E1A0C61E4858A0FB25AC299990F35BE85164C259BA1175CDD7192707135184992B6C29B746DD0D2CABE142835F7D148CC161524B4A09946D48B828473F1CE76B6CB6886C345C03E05F41D51B5C3A90A3F24073C7D74A4FE25D9CF21C75960F3FC3863183 Msg = BCDD190DA3B7D300DF9A06E22CAAE2A75F10C91FF667B7C16BDE8B53064A2649A94045C9 Padding = EME1(SHA-1) Nonce = 5CACA6A0F764161A9684F85D92B6E0EF37CA8B65 Ciphertext = 6318E9FB5C0D05E5307E1683436E903293AC4642358AAA223D7163013ABA87E2DFDA8E60C6860E29A1E92686163EA0B9175F329CA3B131A1EDD3A77759A8B97BAD6A4F8F4396F28CF6F39CA58112E48160D6E203DAA5856F3ACA5FFED577AF499408E3DFD233E3E604DBE34A9C4C9082DE65527CAC6331D29DC80E0508A0FA7122E7F329F6CCA5CFA34D4D1DA417805457E008BEC549E478FF9E12A763C477D15BBB78F5B69BD57830FC2C4ED686D79BC72A95D85F88134C6B0AFE56A8CCFBC855828BB339BD17909CF1D70DE3335AE07039093E606D655365DE6550B872CD6DE1D440EE031B61945F629AD8A353B0D40939E96A3C450D2A8D5EEE9F678093C8 E = 0x5 P = 0xC7FBA2CB9FB24C6034C9E239E9350080AC8B9CB2DC8D428C5A1DA727671796791021093809F5F79052ACACA1EC1ED7E019818D8B2D417E8FC60812EE1A67992B Q = 0xFD06033468C106ADBCAA26AC4B6BD24CF4919EA5EEB99458D6E3C758ED606D639AA3D3B0BC36CFCAEC3507AD0280BF6E9F9C3EBCF41A0B33A95CC6EEBBDD57EF Msg = 7730307421 Padding = EME1(SHA-1) Nonce = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8 Ciphertext = 1A025CC4A2C1B8488760786162C62EC677F6546F329D84E6EE0DA11379573D1792526104BF637DE57807C4394C492919021DD81ADECE3530D8D2BC1802EC2E88A46C9C5E8FF11E34D7476530B7E11DE0236992DE29335549447122326366419901CA2F27E4A996512BDC650D76280A54D1DE2BE17D6E59EE1D156745036D8DC5 E = 0x11 P = 0xEECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F632124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB6599 Q = 0xC97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D869840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF461503 Msg = D436E99569FD32A7C8A05BBC90D32C49 Padding = EME1(SHA-1) Nonce = AAFD12F659CAE63489B479E5076DDEC2F06CB58F Ciphertext = 1253E04DC0A5397BB44A7AB87E9BF2A039A33D1E996FC82A94CCD30074C95DF763722017069E5268DA5D1C0B4F872CF653C11DF82314A67968DFEAE28DEF04BB6D84B1C31D654A1970E5783BD6EB96A024C2CA2F4A90FE9F2EF5C9C140E5BB48DA9536AD8700C84FC9130ADEA74E558D51A74DDF85D8B50DE96838D6063E0955 E = 0x11 P = 0xC078DF95FFF0FC15570627120760AE74601094E47D0C879075B1F1A3EC33B2553490AB1484E588C18A62A166876C5FD1F9790C265CD5ECB5ADA8BE03D5ACE4DF Q = 0xCDECBA049D6379CAF66158D85E5A1CA40ECFB849E832109B6E018DBE5F2DC8D863DDC8DF00D93BBAD5AA1EEEF896AEF694D253C11B806547D8F3621F6C0B7041 Msg = 7730307421 Padding = EME1(SHA-1) Nonce = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8 Ciphertext = 40BD2CCDFEB88BDBF6AE80EE37045142EEBA60D51063335F6145BD30223A1635D18C4E67FAD80D158BFA711A6BBCCCE8980A171027083D2D4E6B7DA2C465ADDBD1F44350C51A9E03D808EB5784F0A3602B7E23903CE4530DF3D45829375E11137FCD639874F71E68742B9C145D21ADF4C4C8416B54AC4A01B25AB4CF1570CFBD E = 0x13 P = 0xC975657B7786E7335EA9B72E0DFE6FA895F5F7CE9E559CED9E6C9960ECECFCC1EC9D515BD14849E798B4D699F7C2898B6C256A63EA5F33D2FD77A51232B722A3 Q = 0xD502E40CEA5B850C45E3BDE7E05EF0B13F4AE0DE9D93FCE969E5A119191785A63E5C181BD0CB3F440A1B519B3961B2FB519A8526BF29A3DA6DAC68261F70149B Msg = 7730307421 Padding = EME1(SHA-1) Nonce = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8 Ciphertext = 4B4B2F855CE4E8D5675589DE93335E31C1EC3ADA263855252DF49BD4836DBF293E07BE72C537B9C7685B38F7C838E067BC9172DF032C1F7AE337310A41A5F103B00E662E3F78E04C234825A3DA6D31CC84D591EF5E8FE970ECC2C0B23E28046325D88534EC256FED8C501034F8017C771983A07EB60E396F97418AD903282B59 E = 0x67 P = 0xBEDC7B14D1A21178D999DAAF657792371C8E55D29DA042030BBCAF411D36FDD2F2A1F79DBEF6B61AF19A750562ED9C7A73386929951C9D330789504FB322C99B Q = 0xDA9ACA1C011181903DD4C24863408D49E4E134283CE92C65C842B753FBFBA4634024837D6C1C17C18254BD8CA696F85BFCEB2578BD41B2584F2F47D6B12C18F7 Msg = 7730307421 Padding = EME1(SHA-1) Nonce = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8 Ciphertext = 11C86DA2269774A6F24161A81B25D913B1A8C9F7332D066F96AE896221BF0B3063C2254FF1B082721C18BE2BC3F0B1E0CEC028D8CEF7C762E985A6C327ECEE036070B9BCA0E6E41EF72B8404C7874CBA08E2D05612D69D11DD14C1EA42E605A292AB1C5A19C2F0EF39441225C783BC573775A28857F8AEFFF4C7748C164C8A79 E = 0xFFFB P = 0xC7479D7196291025D82523AC1840AAF09C3FF8844A444A9FED1C63996FD34566B75FB997746D175CB1B253C470AF4CBC5A0EB9969A85EF32A12C75053B8D7681 Q = 0xEC73649E669157A56375BEC8AA903491543605C6A55AA7E4C804A0A8854C136356485CF4595B5922FF408E2A364F19F8BA82D658CD179118227BAC50046802B1 Msg = 4B704138870B4D862914C2DEFB90810C845571168EA5178B Padding = EME1(SHA-1) Nonce = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8 Ciphertext = 6BE76FF2B2C419CDAE62FD76AE165D0096E4FDD44C8936F8D906DD1F9D9323FF76C58C78E2E8A37828C40DCFF7906149BD6EE12A2E23D2AFEFF4BA5536674B64459410580DA9B4EA1400563A24967E0A0CB1D49B40AF76D0E34CD27158AC364726E7B5F10E3C155EFBD7936CE68CBA669D06DE721969E580F05F3B798C7821C0 E = 0x11 P = 0xFAEC2B060722051B29D1A7E1D3E060CE3CCBCB29CCFC68819F26BB7566B7C5BBD02C16C5A99E7F8EC22AA7050175DEA2C6C8939A24FBFD9015DA5C33C9E13985F6E788E3BB02771A4B273B4C9D376E8204E469EE1433CE4ADEE78FF6B0B96445673D5A0CB10156647B5F0418CC47A3469C6D0027D6AAEBC402D2DDBA1DA5B693 Q = 0xD4795D21407AB236151E75957B45907F27BCFCDC38A0D9E322B1F2810FADA35961527F1834B1909BDAFDD8D6B779C60694E36380BA45CFC786FD28C8310AEE6230432FBA0996E87D22F7792D101EA4C171AAE38956762E3EDB2DCC8919BA0269F9CDE6B3D95F6D9EC93D22D118FCC837B2EE5990D6E84CB181D3416FCFFA9A23 Msg = 7730307421 Padding = EME1(SHA-1) Nonce = 67C6697351FF4AEC29CDBAABF2FBE3467CC254F8 Ciphertext = 67114A6F725F764D578FFB44F36CEB3A2B51CDEB1183AEA7201337DF4D2F9A0E7DADE80202AD35BE2C5A209E493D31437189B95C86B53EE4B849536F94782E0335E1501978588A525192001D2D1B1C521A31F94ADC1A3119D50E07318246D35261F44EB0C2677F0E358E486A82E2B971996C926474F3199A4686ABAE7AFE130FBF419FDB7B92CB69D8FCB7FD1536234C9B82409474F9968BF16CFBDFBB57EA34C01436A684B8C521A435462CB6A6EBDB5DA4D97AAD2662738810DBC40C2616D3241D47085D53D92518BB24D26B2D7E8404ABE334E6C4848DEE793F0EB6B61ACAD0BAAFB220CB2C9ECBCF9667ACA41661B21E0A68E187DCBB39C3D7C5C31A7771 E = 0x10001 P = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Q = 0xCC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77 Msg = 54657374206F6620454D453120286F75745B305D3D3D6F75745B315D3D3D3029 Padding = EME1(SHA-1) Nonce = 55BF28124E5DCC8B92E4419464AAD74B9D489259 Ciphertext = 21154AF8EAAB2063615CE16397CB0AE8FA55C94D8DB6A1738F90CE17B1F2B77C57A5E2B7D892FCE8715B950070C2AEDCC6972A5B06BB20607D948FE755E24EBC408456375121DB3A0205F45030DC840EBFF0ED359449B670B3AB77B9E8167658DD73AE971C6B131F77C3A5143974393A2121F2F457146C7AA22DD56A7EEE86EB E = 0x10001 P = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Q = 0xCC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77 Msg = 454D45313A20286F75745B302C312C325D3D3D3029 Padding = EME1(SHA-1) Nonce = 825B0D7E7CCA6E1DE021437268D678C0CB8427D2 Ciphertext = 039FB7DCBC3ED3DC57BF06055A269E47C00119FBF1F55FEF6E4174F9859C1BBEFC40B0A73E128FC5DF5DC6DA3C292BD13E428CB90A181983FA2383B092375B1B66FB2263174CD75266AD03B1DA49FC5BF69ED911017ACB87FA405DC118E8EE6926C7ADE4392802C8CBD26D7534B8347F9C6C40F7CB776857F45EFF31D6D17CA5 E = 0x10001 P = 0xD32737E7267FFE1341B2D5C0D150A81B586FB3132BED2F8D5262864A9CB9F30AF38BE448598D413A172EFB802C21ACF1C11C520C2F26A471DCAD212EAC7CA39D Q = 0xCC8853D1D54DA630FAC004F471F281C7B8982D8224A490EDBEB33D3E3D5CC93C4765703D1DD791642F1F116A0DD852BE2419B2AF72BFE9A030E860B0288B5D77 Msg = 454D45313A20286F75745B302C312C325D3D3D3029 Padding = EME1(SHA-1) Nonce = 20A708C1E55F288CFAE84EE6A521D3268234673B Ciphertext = 80960E4DF6DBD44A685EF7175BDCC12A53EC5DB0C8CD2866D72C120274D0F52588A71E97B449B65A9E0D36AF3A6C3437440163444EA9CC03C26FC52596576B5467CAFB8F171A2156135FD8CE93F7BA2E1418A4646E977DE60B19F1E7140B28EFC241AB3068FD4F0B70332962F253D67B6FC41D60806D0E6B62A81C759C24F405 E = 3 P = 107871498844327805426477824655913535708145675560929640834074979129981634822447 Q = 89025645474364653597761935180174384298516593224911600154441707984529187725989 Msg = A7AAF7FC80A74D35A163A575173A094DB366949207150DBFFF1D0B9DB01A43 Padding = EME-PKCS1-v1_5 Nonce = 77BA577E606EF4A69F7C66726923ECDAB4EFF065BCAB972AD9EEF7478C09 Ciphertext = AF1F80B3057046EDE4EB139FE4954141350325E0D8291D1431F73FB601F57DA605D986965EC3B141E7BD467108EC29003C7F56315E11FA89708588B7A562A738 E = 3 P = 114913762053528544202764484541371154239375052605890158602955949263867389449259 Q = 109894687290635208773391023636177155382452771657661462197086870923571791872877 Msg = 6ECA65B7FDB0986062B70E8C68171DCAF736 Padding = EME-PKCS1-v1_5 Nonce = A83BC3A6BA075EDE453B7338CEE83BB8F5AE8B5968E3A99462181DC4E73F943B66E433F43D0E8E6F08DA14 Ciphertext = 1346A7E48F0ED39B333041451A0A293DBD8E1C906B21200A1AAC228DB8C9FC0A9A24DD2B434E2279051106BD625AE24DD1554704E57EC48D659AA3E9515D2B41 E = 65537 P = 103793652692889479604145227844656792682532170216948642476032852015926228384007 Q = 89173446269849294012890923025703856055134132864455765240993724031379489933153 Msg = 64E8425A6B898502A081B6B78A0546F4BF2DEB85E187ED Padding = EME-PKCS1-v1_5 Nonce = 57893B2A6A4AA7863785AB8FFA68E81F3239BDA659E704833319DF5E3377AEC911AA90F205B1 Ciphertext = 871A94A51ED756EAD36EE976354D2D6DE467CA5B8C9D198FAFA6D5B24BFA674A20F89CF53B85F75F7E17481E212F2BF543AEC428B841C79E3E36CFD75BB7CA8D E = 65535 P = 432415771007597974957624156178799318860712283353308003447560475843063611184519 Q = 206256750182932457424055216578408364078987340514950324865789593945099777798567 Msg = 1548C7CEC500A26A59D493176E3B6ECECDC23FFBC485D75E4E20C978AD14F9C25CC19021C1328B1A061E317559A04326628222 Padding = EME-PKCS1-v1_5 Nonce = 66832C587BB0FC43A7380A Ciphertext = 022092438BAB2CF4A6C50D71EE39419E2E11C9E9644E0B9C2221EF81098FE3188E9BE0E6E27C02A742571C0BD757C6B7F2160DCFA9A734AB6E90BDB0EF27DCD567 E = 0x5 P = 0xDA8D6D0AE1B959B8A446CE3807F195BC6737491490206535AC8F85E5D6E5C18F Q = 0xF74FE3F3CFC5BDF517A50A887676E7CC2D20C509758B7657ACAB73DFDD581D07 Msg = 426C696E672D426C696E672E Padding = EME-PKCS1-v1_5 Nonce = C66FF974AC57FF20D15AADF04D472ECF48F945F50945822FDA962591C160072AAFAC9AB61302ABAD458A2528D610C73DCD Ciphertext = 11F10A948BAE2ED28555EE8B36028C8AE3001E8AE76DA4567A59DD59EE8B490E54617009CF6E346360BE39E22B432DD7B50F0C41BEB1A6DF655E486FD5D822AA E = 0xC3E9 P = 0xB90114E3BA96AD3076C08F63255E07A6BA0F46C0EC9332EB9081EA81100FFF2ED3F886DB2DE1CE4F01ABD44D477DA8E61B66C65A9FB666B1CA8F79FC7B3EF25F Q = 0xE67921A8F5C8C04169E8CCEDE6EE147CB3B1E139BFA6CB6789E24238CBBA10AD522B4BBA6F3B3138C7B038856F01C3735B2B61FDB18A47DB57D5B4B5B52B6E77 Msg = 426C696E672D426C696E672E Padding = EME-PKCS1-v1_5 Nonce = 8D4557C36F53ECB344131ADE3F85684BD10DCE1B84BB9B95A8AAF565D73283C446251D7FAFAF6C84FB216C627EEBEBD0F38C0E4C2849BB5FD95E453C9F4729E8B54E0AA5700EA7ED197A0A64DA43AA33A0D232ED403F2DD5C519FD070242DBA46FAA023D4FCA255AABB85A9AEC28DB83A6 Ciphertext = 9642171747FA6A731DF3D17AE28EC0AA0FB8E4046CDC0170335610B1FEBA96738E4A7FB6BD7761A035B41161696A2270AD429C09980005307A6F154B65F6CCAE0C7C9CC1FC2E61BB52B5AE4AB41618023B673201D14C83DFADFDCB21BC7EF65FCB497A7625E324F1ABE70B045D465051C4668A02B5F38F25606FACFAF62296FD E = 0x11 P = 0xF233C84BB80BD0BCA772A629AFAE474650A81C10B863747364DF21776B1ED91939FE9011E45B6C317F7C913F1A2E9395797C2E778FB97A0B1F57AEF663213557 Q = 0xFB5B0E26BDD59E3494998727361831FDEC1715C0DB65E0FFF318A2BE9B33993B76984F868CA9179807F29C1DE6C5489C1D43C76BBB7959BBF85922016BCECC43 Msg = 4C65742773206F7665727468726F772074686520676F7665726E6D656E742120286D616B65207375726520746F20656E6372797074207374756666206C696B65207468617429 Padding = EME-PKCS1-v1_5 Nonce = 2D76481668E437FBFD3DF446DF2BC5F7F0EAA857CB913E739D5CDB6042D32ACDBD332E5A99EDD3B4B210FC2937440EF8EDA3EEDE33D7B7 Ciphertext = 7B8F8AAC5BBC997CD4A1DE682FBB96AC8E80C6FC2102B1E7926D9AAD97BC10A46F981BE12F8F1B51F9A9E1F8D8B7AED9CC42F2AC0420368341D994D94207176679B5F2187FB6BD8F962B678CC379009D0A82ABB9933093371B71C6CDECEED957EE08962B0A94C7DCF40325E5CE38C61C81D327AAE5E140F345597EE7774B8A11 E = 0x1300D P = 0xE8E314B7ECD4CEDE513D6E229A3A3A0E1D0DAF974ABDA9997E1978972FD0863AFFD6259861CFC26F136DEBD1ED9CB227E091823C21DD79B57E8ECF67B9293113 Q = 0xCE47F1506E6DDA70A95A6EC56E34B9F3F929D15C92DD4AC537162C6E3BD6C4EBFD3C51D08BA61216685A333062EBABA4B5E647C81550C7FBE132A1D48D7EF00D Msg = 486F7720646F2049206C6F766520746865653F20204D7920616363756D756C61746F72206F766572666C6F77732E Padding = EME-PKCS1-v1_5 Nonce = 25B8D6560A33737B64EE77A02D5A3BA53F0F165468CCB98E7DBC6DFFA4C29033A209E8B6821A3A7CF9EE89C02B42CD25F62FAFCE56B80E703897A3299F78520BA251DAC421CC5A0B52E0E4B15FBB1E Ciphertext = 5A188A2132B9331B1072BCEA281DAE53070C0AAB0722D583BC7FE767BC85443B5E36286AC568246781792CE04FCEA86D26124F14F3E8ADB69CF1E8A0A1D86E3E0AC0F141C18CCA5F1B8228AC2996E81938B6593F37A603A41128D4CC0D45361042B5F86539BDBAC1B1867E4FE351F599E955B452F675B0945093FE8310A70C9F E = 0x13271 P = 0xD4AA40364C695FC262073498EAE363EAE585720A8AA211D37CC2BB74ABDAE7A8B6D9C55D5D8E3A0E4D3B39D57D543E8A17F697FBBD45E32EC53B9240188F7EF5 Q = 0xD4420A0041902AFD838833F2EF3AD89AFCF3EF66CA5B20036692BDC45FF861B20BE756CE35DCEC97A7BDD28DBBC09315E5B7E0249E61772436CA728C7639A8B5 Msg = 5768617465766572206F63637572732066726F6D206C6F766520697320616C77617973206265796F6E6420676F6F6420616E64206576696C2E Padding = EME-PKCS1-v1_5 Nonce = 25C23B57F9C9E9A3A2C08F3320214F5365B1A70417F5A6AFDAEFDCF76D4CCA563D9F9625E2BA783733DE9691108973AF66BDE07A7E8854035B972387BEEA4DBD4A2081CF Ciphertext = 985B3B945917B229B8274441C174B1748627F6A83986AAE295745694174928AF8D6E3D309A8FDEB57F3BFB73AF2B776D13278028E7A7CFDD3F489AD3A46B2045409683AABDD1C01CDF60ED850D4C918608ABC5B58C9BE3A438DB0D6D6B9C1019C9498E17233D5092165471B0A1DAECE0A68104539FB85C51648176E8B7AEC1B4 E = 0x1A11 P = 0x32A4716E0F397B9340565530800F691F9E457C2C5F8ABF0A8F62971B89B43584EFCD7EF66765E8BF6B84163D914364F855DF8F6C82DD49BEF76EDB1397257215 Q = 0x360C8C90CA0B2216B342A9681EEF05BB8CF8DE2AB8F0997C97738AA32B88B956D94515E35FE96238974AE8A8F0164E0FBE25C1161D7A1E9D170B821FEAD5A3CD Msg = 4772617669746174696F6E2063616E6E6F742062652068656C6420726573706F6E7369626C6520666F722070656F706C652066616C6C696E6720696E206C6F76652E20202D2D20416C626572742045696E737465696E Padding = EME-PKCS1-v1_5 Nonce = DADE975E4B9FCE8E3010EB1568FFDF1BCDED9A454796A0DFA6F793093A2FBE25813FC6EADC4225 Ciphertext = 06DE6646853E49A067C85492FCA580E49D286981CCFDC4E13B5642489CC19E803A69116BC2D75CD005B768F3FE7AA780BF7E5A2A3EA53085619946DB4B3E9DB7592A8D060CDF185B3AB2C1BD551587EA8AC3745FEF60D945387B27C2001CF7A9EAE9A086AA58B769A59CC4D09BCF9E100ED630EE44889F341C8DCCF52F003CF1 botan-2.4.0/src/tests/data/pubkey/sm2_enc.vec000066400000000000000000000046421322470703100210130ustar00rootroot00000000000000 # The standard SM2 test input, ASN.1 from GmSSL P = 0x8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3 A = 0x787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498 B = 0x63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A xG = 0x421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D yG = 0x0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2 Order = 0x8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7 Cofactor = 1 x = 0x1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0 Msg = 656E6372797074696F6E207374616E64617264 Nonce = 4C62EEFD6ECFC2B95B92FD6C3D9575148AFA17425546D49018E5388D49DD7B4F Ciphertext = 307B0220245C26FB68B1DDDDB12C4B6BF9F2B6D5FE60A383B0D18D1C4144ABF17F6252E7022076CB9264C2A7E88E52B19903FDC47378F605E36811F5C07423A24B84400F01B804209C3D7360C30156FAB7C80A0276712DA9D8094A634B766D3A285E07480653426D0413650053A89B41C418B0C3AAD00D886C00286467 # Same test as above but using SHA-256, generated by GmSSL Hash = SHA-256 Ciphertext = 307B0220245C26FB68B1DDDDB12C4B6BF9F2B6D5FE60A383B0D18D1C4144ABF17F6252E7022076CB9264C2A7E88E52B19903FDC47378F605E36811F5C07423A24B84400F01B80420BE89139D07853100EFA763F60CBE30099EA3DF7F8F364F9D10A5E988E3C5AAFC0413229E6C9AEE2BB92CAD649FE2C035689785DA33 # Random tests by GmSSL Hash = SM3 Msg = 61207465737420696E707574 Nonce = 04B4EC222E5F984A397837C481FC5A81A19B542D694E8BBF2E58E0FB19E92F0E Ciphertext = 3074022039EA73E877679ED0BBAD126B9A61F882DEDC329FAAF5529D5B3EE167B95322E502203A36529C0BF5525501FA9F18F18F1571EBDE47951519B4E04F214560363C35990420FE3D9CB71BA55F7F173911E2FF4CD5239392B91291254C33970E6ABF097D5FE1040CADF4FA9A4E56FCAAD1AD9C97 Msg = 61207465737420696E707574 Nonce = 34B4EC222E5F984A397837C481FC5A81A19B542D694E8BBF2E58E0FB19E92F0E Ciphertext = 307402201DFD5BCA0C187B656EBD41628F6B26A406C2874E659D371258CA60365F644C5A0220239CA0E0E482BD9B3C444EFE4618324D9217DCCBBDF70B477EEF93756A85C276042023FBAD7B932F7321F24737E553BE536534D3B0ADF0D77DC631E50D90AD872A07040CD2F70E71D686471CF0F0CD49 Msg = 79657420616E6F74686572207465737420696E70757420666F7220796F75 Nonce = 218F4211FB45868ADD749992E8C899B28DEF9AFEAE49B19BE0657A481D06D36B Ciphertext = 30818602206838137EABA46E36D2E89556A623EB6C790635138CF7DC50B0B4932C5CBFA892022051532CB347883709856962B2762B047B6EA4597C957016AB1F24D4DCD55148340420DD1DC1C83FBFA04B831B61D39BA2F3B60C9443DCC82E172913F598A7357DCA53041E394D660717179357030E5282DD4E7DCE144D6C168ED42A1AD093E406AC0D botan-2.4.0/src/tests/data/pubkey/sm2_sig.vec000066400000000000000000000014451322470703100210260ustar00rootroot00000000000000 P = 0x8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3 A = 0x787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498 B = 0x63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A xG = 0x421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D yG = 0x0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2 Order = 0x8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7 Cofactor = 1 Hash = SM3 Ident = ALICE123@YAHOO.COM Msg = 6D65737361676520646967657374 x = 0x128B2FA8BD433C6C068C8D803DFF79792A519A55171B1B650C23661D15897263 Nonce = 6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F Signature = 40F1EC59F793D9F49E09DCEF49130D4194F79FB1EED2CAA55BACDB49C4E755D16FC6DAC32C5D5CF10C77DFB20F7C2EB667A457872FB09EC56327A67EC7DEEBE7 botan-2.4.0/src/tests/data/pubkey/workfactor.vec000066400000000000000000000010111322470703100216310ustar00rootroot00000000000000[RSA_Strength] ParamSize = 1024 Workfactor = 80 ParamSize = 1536 Workfactor = 97 ParamSize = 2048 Workfactor = 111 ParamSize = 2850 Workfactor = 128 ParamSize = 3072 Workfactor = 132 ParamSize = 4096 Workfactor = 150 ParamSize = 8192 Workfactor = 202 ParamSize = 14400 Workfactor = 256 [DL_Exponent_Size] ParamSize = 1024 Workfactor = 86 ParamSize = 1536 Workfactor = 103 ParamSize = 2048 Workfactor = 116 ParamSize = 3072 Workfactor = 138 ParamSize = 4096 Workfactor = 156 ParamSize = 8192 Workfactor = 208 botan-2.4.0/src/tests/data/pubkey/xmss_sig.vec000066400000000000000000012614321322470703100213240ustar00rootroot00000000000000Params = SHA2-256_W16_H10 Msg = PrivateKey = 01000001510ac05c24fb139572f8b0d82c0bc403b71cfe1d6551f7ed57046cd8cc62742af719f460378c13d422ba462b9b7bd57218d106e06778afcf9031065b451a529400000000000000ffc7f0003ec2f7c3ea0a6534b1ae2e48145febe7fa90c3b294b75dac6789d794c7c4f9ccaec934457266ef9770b8ecd94eac7f16f14027ef97c4885b4caeb32ebe Signature = 00000000000000ff8c7e5684680acaca206b403913e6f4e43d022e53d7ec4f57c2aa08e0b828852913f3b54af80b339cc1e049296c358ce48caa2c4329740eeccfb981150bd0452cafbca05355cfcaaab3eb224ff6bc5a7b152c66bfb7324553b0a9ff9fba90b157a51d0f50a37691bcb8039a358e3888f5c00348c6cedfeea8f0e771819815f1d6e5166299c70430472b8369e5867a443946aae33e3bea82b2d140c211a2578aafea9bb58c95c3e699315c6231c4c268d20794663a99dc32e338485c6652d466a246029a8e5ebe4c22e98f2729ea4d18f7a2ac38a3315633c2a327837932c831f3d1907ce66b416fe651f4aaef4d5d2ad35b1b0eca8e5cfab493b7aa4e9a249d9352e111c9a2de3788d12a34edb938cf24e2d06f4cdeb940c21e30ce260ae643e9c0432081236f80036394090be3b61ff7c9c60f5bfeaeaf5c89a75f0335dfe30cc6c5ccfd955cec9950d1f8f9f16cbf0f19864940ebc708085ee31963da9fed93ffe6b487416cca53c455dafcba04bc7cd971416e1ae165e020cf71ba21a8122b5df93082b64d59a7ff6f104c9a635791cddda116627b5d55da40eb425955e66245b54ef9c3662b281c35b59147ca446485ffb77068ca7c8aca5f3007d1155ca29ff6f880bdd93b23d0d2f0928a0a05220b6fcc4e44e76cea9ccfa96d3c92e7886a9bd2819c2157298d0da7625a545aef82299da772eade55e02fbb4df81943d49e0c313e981ae3b3a668a33bd779bfbe5d45e944879d120ef66066d5c248015166fbaf22d07d317a045b24081e0ce12487a1def0da8ffc745bb2ee56e3e5b2d9268a0acc83c52a729ba2692ca8e9656c07e64dcc054e65611c241a11d2f83279d77cac8cb16f850e1eb4fcfcf4b7e506f96895bb788185b3b8dc53f0b4da3df8b463b7af8a45058e54444f4c166a0e2c23b2307350ebdf956792bfb709d5f637afae29d358ece09bbd0be3b83ff165f66d0bec124ef3a314c4f64e2a3cf40237bd64f1efef11088b6a7c4fb28dd92eb26e08b17c7da2e5e789b05fa4a1dc625d26a87e2ee855522b0840e98ec62d76f275d0e3c99d4817a3eddf9c9ec5fe8b85f42cd86d61e89820e08f99e69ac16c37e11fa161c8842e6b5bce3290bff331be476b2155a83bc73887380db656d628765b3d5b8015c0f4c6fcd6cfb462e07897d9a26c655b61a89fcdae0a426e84fcf1679e55e139df68e367f25fe468db29444b4e3ca059dba629b9cb6df1d49f5a6d50bb1085661b47f24c659cb742f34566f6b8a8a6c4408aa16302cd640a9c2156d40c2dcc741b62495953b8ca40638d9d047e8feacc29d73a103cad0d44847f5f613340449d23b66d55a69fef4cdab551fc94af64e9604b94c91c8f7174c22b170c8fc81cb4fbf4aad557f3db89ae8f58e856e62043ec7525cfac71e1b3a44551a7604ed142db45452236e6536c59db9ffc400ac1f0134770da6c4e5ea130680168a7a8aaede85fc1c7769ed6738e37285741794b4e8210ee57094197cf8d527f61668f813fbaf3d0e5c45efb9e56da45c73d242bf4d02f23ed07bc738ed87a5949d2a1dd2b90625855a4ca4dfe2d7cb23c83f03caa82e8d283630b49ce2e9712ebb30088f51c30db985c6ae2c87cffdcbf5f83b0e7a7cb867e5f9f2a709243464674a4758216028ac95c9a9d0eaa751b1c165c07d031650df283d064b417426d0c266cd1edc839af118cea4e38748390a7d254e240e01607902922ec7ca0b9d3fe62552615d4192cccfec08fa7ef4dbb08728779dadc586644349e58515a3a513ee689699e043c6efc9dd698ca38be414197c87995d3ea1a5c46176a75dbab3fd8c6d66ac4214466302a9e57e4bdae367a0e7f55fc5e9dd5098ff8489655ad6df8d577da64163cba8bcabc3b178c50a1ad35efbc604664657c9c9f789bb8be4d70c695cca6b80e2e4138da750de37c2926210f736314c55d4732e26c3da1d92d2a54e3e2a77fc009f494d7cea23ec816a62cfba0098188f14587b7dd7f0da3ffd9841ec6afd3472a7c6b1574f3a30659ab78c0c876bc22f2bd878a6d29a223b8eb817f4be3bdd334549849b578ce5476d279ec0d526c7749c595a4c154dcab456f7ec9e03d11a35e4244e94f1a14fca1a5236acc645f87ed561883f87abe6fa8cb75bfa9e7c2d6a8fe71c087a321bcad9fd9a81e1f53cb808264dd703dde6bd43e32f34aca056add0cf3f51dc0d07160129990cb4a5e96d6b20f658b13756fe4dbc6cb06f10ff92798fd68c117a6d1e97bcabc7de3dfad1519c3741a37b74dc32b5820d8c1f1f47e9a634b05c62bbd28a60a4c82852dd2821ad65e7dd9dd822b77b417e4f5afb5b719b3237a674a875b76bf8eaf1f7db4ab9af63b3c6001585920713812fdc7fff02c4829a607d2159005b9f3b7e2459785162f5ce65aed264a127d6d6f8ed5c40a7652a8bc6dc3381dd1004e99aabaced2f4b97fdc338ac77eda3989fa77e14a3371345adefb62ab81b2946f7a9ab4c2ee740fe7bec8700e82c93b7686350bf2134bf3716124e4275cb05284b78f2f08a4cfba1b9a94efa7d0267cb373af7bb10f733cd4eec7ddba9c6a4dc32241b1d562f3e8584e49ae01420fad2255388dd8c296d7afb5e14e0a178a6f3ceb618fd169061d37302b42db4d4e9db95249ffad1bc87097b62814c79bb55d39726346ec17a5bde8e91f5b96158d55fdc5bdafd75436da2ceac5798c4ff277ba17f11a9a2570f406398b0a3d11ebb7b1c4370b0856d9686153133c0d73efaf8b67a56fa31c1eb507e22e5a5e83211fe6b12745671e32ba3c223b4099119f8307988063b1693dc71f0f5885b85e2a05efdb6419cb7fdc6761ba597d752a9ad0b0881bad28d77e1ca2ba55f92159723517205835748bbe057e2120f791261d51e76b21110b17ecaf223e5f463e8e5371a83e872154a592a6c60ec503f2edc56616b4f362fa5626646c4d0146fc33c9475f9fd87e510c4258aef6c41875597b6c09548cc30f2ed3605da62a40b6722a37fb0c6865e3400d3355350cf2cfd7e047760add6b2d56db98c42c8d3b2e95b4e5391cdfbf150a658c1e63d2550d86a0ab759d7700b2638fe04e2986a11561f9b3f7fdd683e3538ea7c7b7369b7ddb689a09ab53ed9c2eeffbcb5c0c424cd30e6b6c25dce71d7dcae4af834170212765942299818f28b64fc09d21893aba6735cc6be0091016c99e5b3812dc8da38972f9fb4c20c8902171c100935cfbf18f74c7aeb9b0304e189a69ad7fd3ecea8acb8600b050f2e3e9f0ba0c2349d9257a94cb1d8f1315ba050caddc6f51232a8978e43ef1359dcb3a421f9489703a85dab43a47df2998932ad1a983057d38c00041dc12a4c3488289185080f5697e34f01e98a47f2af8f0383cfdeb8cfce3e5cc976b6a024f789c15717678f6a47f031046c9010ed06f202035545bf58cc081f510a83ca29cc46a81bcd700418093191d1f6922e9672d69f55d7036daaec7490b72272272c72775ac686717b1e671b5e125e673188edc0a8249acc4a4fc3789e1 Params = SHA2-256_W16_H10 Msg = 078a87923dec59ce843149f5e642a3f921e2e78543132f88ba637a09df0c16552a3037e3eeb3a30fda5df73ae2e0dd3821d1 PrivateKey = 01000001a020196cde3a20c13477ce56de3a7a4381821ea50bf07f0670048a0e1736d22876575fa4f5404b393828f74776a9b9c73b0962069652b088432242e12cf75e170000000000000000ce1994bc37aedd7e21851001ec0f4296ecc3d389263e4e720d05effd60a20a41b90b7e2cc1647319b4b143ceddadadfb3e571be68f36acc8d6c0a0add41266f2 Signature = 0000000000000000d3a842202db1812f8dc93387ea6a78d01211d00911d37678cad55cbc228b2da495c0b88593d505696ef3be99a6742b75a12555bbede5f788d4f4b7dae4e6c7da82faa2d7e60f836673bc0bae8cb75a6a94480970c90a412e49ae7b0cfa63025c1444a746c5bdcf9d8618cece33549043a98d05cba7673fb7e4f835e624b482e85b3b2aff7613cd58f1c8ff2b0e6011e02f5a3387708e8e99970eb0288afed53454df7804b583de58bb7b93041d6c395360d84a9b4c9744395c1f2b05acb932c7aa8279b6012e06347559a89e945bb140119d074c19ae0608cf10d622ed32234d3f739b2a8520288bd1aff00efc87b14f294837644eef5afe6c938229e9ef39c35032e57e36fdf82ca625f4f78e796b6e19ea0825333bf9bab8b280bca94b6858cde824db884f808f3ddc450290c3441ea4d32430fa701fff0d7e51c1ab829c1a67fbbc0776cc47e288e7ba539349741f9ebff591f40f47180a4438c998a73edd087e57325b4e308c2e1ea8097c9718f3547a0876789d0a808e1941fa5cde1523934b08d014ea974fc867efec161ca1591f29b4e34276fe045fbb8aa1fbb69a8693c438d47903b63cb6c9d15988c5025b0d84e1bcdeeef466f4b30373eedddb216bf1ac20e068db89a201706cd1f0b9781944889a71ca92f8b9a86d086ed63eb71b6412f0672a549268418b17f408723facc10a640d3977756f41b2934d3a76a64fe1ffb29456e9634d7b839e3b66a744ef0d4beef472a2817c5e0f10a91119371df30de7dc394219c95ccad24116991d53cd5b2059f48d6ffac08a5869c94866d7932ca97760d55ae5af8a978f91a934e21922f0b9be5227bb9e557d20f6d139d71160f29fbe23c0757e4e4eae8524a38b00043dade86aaae2f3bcff6e65f74410863b7f5e585443039cfa12dc17243049a4f9cc6b68ac0874a62f821519f027d5b658c3e8cb724fe469001c6de151a407cc48cb966fd5df819aea78f3c1b291a453490ead24767a97506d635029d5a1182f05372e5a7ca3b7440446733b500f26e3137ef5e01f145989ebbce7e72681cf3213b599b3d44e73b8fb2b06b63a12d59bc33820af834c9b48e1ffda08727a1a0d092900c91f3df1c2f74264271dde4546cddf687e5a3d7170db4f7db3ff913d96f3eb45f5cacd5400128838625e3c8f852f2b1071d53a6f73fdc7fc67a9fb007519250bf50d3ceec30184cbe4b4348b9d04eda3cca4de611aa9d9e21179f7057d5229fcb8c7599594fdd17b0dad86df88b1d92f29218f7aec8478980b58256d0b3f22a0a738f2a45bd1845ac44e20f18f5619d828e4874e430c0c5d36eb80f9ddd1766782c4e0eadf20c971941999cf3365e28022d13ddec97d9f6c7ae8e04a6e2b50711a6087ef607a14ed1a1245cdd07bebf086f65ca32cd258d4b9b9f93e914a1c493f6d9eca4470ef6655139e3b15d41486fd80e755379442827ce2f73bd1471523e0103ac6564e185f5f81dad524bfa91a311d919b86b4585a171ae240191eaa78320d44b4062bb1bd13f807db23fc2f9849cfdeb6e1023e234a07e88318f1af60a75e7f167be568ed0ebda558b5007a85c3154b6dab837fc9fd3015d4b262502b4518f16621e945d7fe2b5591326e4d94af0f3ef7c289027c8aca22c9ab658017fdf31610b8994c042c501c25f3c84d609d1a4a6c122fee6b63f735e28dcfe66640aa98c9b88594a8daecd724bf1bbaf847764347216ffaae0ac41eeba945dc74af17c463dcfac75279899deebe762f8f0858b2fa2a4e0c5c2de0d20658f0321ab6ecb6db62c67eebe9d3d04d53a987639a70f142250cc1565301f809e35decdcaf34480f139a07781f6b39d4dabe11dafd7c4baed73ae540394cf223ced39092382c26cd968e21a97bb374b466dc34c7b25a93b876b766728f385145d610a3e793d005c88bbc697090523b280b38225576220571e1e7615656583ecec3677627a6a1e298bf4377dc9196f6659ad6f3731d6ab1a7c8e6bfa4cf50550955ebdd47f0e42be07ef4a788669acb8f403be85eab1789000184bad8c2da4011c3fe77adac3bfccabd892bc2a4a08969bd0d01620cbf2a8664d656819cbe30c8d4f71efe0dd9185b9705e82846466da99d06184fb6b8023ae31cc2f1b3e9a967f787645204aa414df00b7ae9026fb9e28ba8479ee2b46dfbbb39ca86b5c360c9f5c512e33188ed2770cb8b03959288bed59011d63534f9094def769f85e9328fc11522fcbcca648ccab654850c34f245f157349ba460f621fee2bfe0b4e6d89e88ab6845e9bb0b6056e653fac558eda8bdd5a3e8c44649cde9b5389edf7c10a2114ca7c6dd2dabee1f4d9a695303a79b4f72c27fc82af6f0c26e9551ef3a489e4f5e2cd9647b75ba75413c41b61121fd7411099fd5ec5fbd87d2b4998af3e484b4b2909a881cf9989f89ae190704dad08ddadfd6687cc273e56a3b13395a942dea8fe26e3d7ec8b0880dc8c51fc850354aacb05bd175542080d0c87cea99081adf901920ea6327b761dea28b61951eaec23bc9dc30d32dd0ed4fcfe39f575803f874d72d71d48ce8f26d47b0cc74881c54f80f41db4718ec04faaadfd93af8b8a258527024658fb28d4f6983daa01558f85bf8c6120d355388c302516d1fda5480961799ac8b5e9b485bc579675f03ce604a103df21cd31add951ad0a3ae1ad1788444997eb12f78ba96e909c74543eb6d0dcafae60796632e6888e3b3d2eb6d6b733aa53c455c04473c2213494570f6c8ae04fef4307419a7d84c87ef8a9ca8dc62177d2bc09fb1362ecf7a6e879b51b0b27b5358356689289d09baec2f204adba0a20c05a5e7c59f10d4c9f0c349ed71b2d08cfafc96cb97de01fbc0484b2a05e93ff0ffc2c7ba974933e10aefafbf440c75cda179b6dc09afe81ae36080510621e77d526d677749b50250cd83eba1c7d9f8b594d711402b10430a22fb83faa2372c1d6c88787bf82007ba5fae0f3f17836f9b2d9311366e3506395f9a0ab17731f6f792c3fb7127bbcbcad9ab39a6e59cb7f0a2ee36e66644d41b84f5dc57d27a69cbd9beb840e5d646e4d13af0286e7d31d9ce93fa896889bac3f124dfa696af3d60737f71fdeb9c09f3d0feaa1fa698291a7474919388b7c014f022d239dccc6c760180bb34078de1f7bab07c46d7d9244cba43c3bbc2c4753868887c129cfdf2857a8e07d18ef99309b85fb08980f4258806d7a618502e3d9c2de7f33c3e267a53b7acb084797c9f346b33a04e32716fd0e85b13ef7796bdaa3dc46ed58a93ab61a516990c04be612f1c7e341c6267ce8b9326efd200b015d2f0c50b8d9cc0217f758659df95d86f2d3372cdbbcfe0a0e1a8719a46e041b9bed9d194b98dd74f3308a7f9c0a068bf554861083dac5b6a594fe83f9111547737fb2d4d712e3aa1bab6820fff37175b28f1a81b06619c99b5a89b0f2c155174c8137a63b49ce94801f0500e0ea53f26313e3dd203b74d409dcb46c2d4cc0c08dcfeefb89ac66d19c95a14feb1bee4a646fd911b # Params = SHA2-256_W16_H10 # Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 # PrivateKey = 010000016b454996ecdc4035bd8c277df668b773c3dc6afcfc5e1f4c62d28a26d03ece20076fa56809e17727a0226e7215c8ff78df6c88da77886e971e1fd1178ee4f0cc00000000000000260ae58601b7ed1b51cadb82cc34673c4e9f0b147716fe311ca6d9a19152e494d2b5cb038cf9a718d96f504bf5574428ce1cf32d6917f8de9137ec2893c87f9a7c # Signature = 000000000000002610fd544f326c5da7e15e53ceb679f40e3a81679a52c21b19b853aaa28ca9ca2eb47df7633935bdd55c837e9f0db60b89c87257e81ceff03c8a9e03003c1dfbfbba9eb39807295ee9bd9e547d08830b216fa2e77581b68e52fe3aef3840266f7b3519bb544b2f52916470ed63edda5a1824208eb1d7b119ec769c2d29b2a8be9ba90a4fe1dfce08cefb86e89f83f5df957928e706fd981c07849412a3661ab3259b8fa055d3e1905cc339fcd0103ba14dc3ce179300f87110937bf1b5408c07756c181c0450605b3027727350201669b935d1d3c4dea5c7e26d09f54080f85784660a388b16ec76926c940b106a13fd9bd8eb23c5a441f167adc967dd9c7f0a9e24d92d8079e802ed0501d5bb7adc60e0c65f2ff3386dad2b56ad30d0c55db7b87d7755110ffc73d907857cbc7aa52515243ef46a7ed18c657c5cf753d377e487bf4bde69e854b2d86ce256b222c98d2f33015d35a01499aa253b3b38d9330db0ad7b5a9e292c24fe80491d9270aeb8c78af39ad23a330da48d388aea8c09e732d5fa989f1a1430ba8ede676a1afd10ca3a4ce3b4c0f22057289a254abfefe7ad053b0cd2632566823a6a077065c60abffdc8524236f0fad0bb5b1a189cf4bff9af7d98c46cacfaeacea51e1479a80b22ed48707f3dcbd39b8b90c759f71e96f110ef86cf7a1426d68327a3701c09e3b8d268999634389e947337d5a5a872349d8550f088d2a4b532d5697ca73ac037cbac462b897cd8edb3765657e21ac4363ec9d0d2e6869fe1925c69f3e01a31ac9b3ed16eed096e770673d429064c1bdbcc70f718c0063d072603cafc25a2423b8b93301ef0bca0c0db9cf98a17e4e1abf2ced0fa10f7e742ff5fd47e6d7a3db1019124e0f6554b2bd7418a0d7111bcfa9dd8258671437ba9b7ffd64c5befecfce7efb5cf2afc2c9a6aa1b7b2d44489aa925fec99f988037fe408c47e26c37449cd4f8b479ea1fb0abae9656be371d59caacf688a3b64b5343011c12829a897fd797dbe760507e2822811648f232aa4800921bb3366597746035478c0bf9d204287a7683c1b1e15beb7eae46080ba55d3010953bd6d550f8b8c1d450dcff3a3417432b669fd40fe8dfab7a96063e3f0a6f36149145ab517b19c9012e13d706ab36d4ff872616e980f65faf1bbc4536dde87204bbb131d515194c0d7432862c0a1ca0f7f3d980bd0e73ada2d6e39c9522a5a79cdad70f5ab0c6c17808ab001ebc3805745e482a8c902cfb3f7534005cfaccf4a919784d2eb502c58a3691fa59e309a1b431e61a59f86990de9fe4b94712f789ad5dde95f24dfcc6caf219a51537652b3f67abd4a1da339e6d1439a5158a318287679cddb73b4cbb67586dac3dd575f799664e159acb94f0aab39ae5b82ece20c687224205b471a7a069da56f65d641bce71ef5dcd9d8c8d33fcf3c9a49067569606cbd197f1ad258ef9e0c1fc0f1defee1471ab0c264fe44b1c53947ed61797ac565a34f936fcec393d31496e77de1f50d59cb39a4f34296e6f9a6381213aa6c217d0427b025271c60477dfe12611de06856c3a557bc0cc6848873dce62002ab642e71f2fbe39ba0b92543a4ba4cd65e48650aaa29a24aa2dfd6d4e391129b62b652ff388641c9e27b7549ea5a0d6030b771cae2d91e5286d0e3212cd4ba4d6598a5427acb776e95263e52a8d51a619aa7db1b7b427d0ead687d3f19d0660eb92c9e41803639c0fed7acadd00863769429398c64eb68a0f7a4df2ec10ba635afb3c6fe3c2aa7e485a53393ba795fb1ab8a3f9994019a8a8cf2e2d990a600c2d926344bb06255039e14bca295d5d3b2bd9825b0b5a8b61103c93d706b32f775921c81c4db37561c03453631ccfb6b88a369c4802cf9bddda1aa2594f89cb06b9cca577e5454405335bbaea0ac51a058d5b2ab4c8f75314e87dd4a03da9ddc2bb5f75812347c275d295558328ae4401c94ae02dc474c84553c3904579cd2070329aff5e6a058dd89e9d32f73c22aba010edc7d86183b1956c5a3269a51b1c235fb51276c6219488dd2fc35ac84e75161a51312885274f670d10b5aacd26359efcffaef5ec45bec67c093073436654f19c6bbfda5dd7fa6947066fe56fb4bac90003e1e14164a403f853f22f36db6080f844a110365b2ff38a4fd3d9b5797cfb762f56c398646e379eccace3ad8065a1fd367c45ace07f76890c48dcec31b64ed9de5b9bf104fbae0f4d398a16ab1c08d8a14d66ba8f76965ac3a34441e15e5d5968a00ea86c25f018735d09631a417041f23b9813b545bddc31aa7dcf3289f6c5d0b070309d9392838067b149a8ca68287b1d053ab1f39047cf60f7dc91ae402ed785471e81b1f88416eba375b0236563710cf55cbcee15a1c862e1643c83c31ab46e34c5263159168c37d3bad13fbf584a4eb3b45fae3d2c716cfdd26015330d1c88c8bad77b40b44c1bc675f64706ae15f8fac47382f0ec15f81d7a88308fa7d873acd162dba5152d27f2a521a2a312d25d3ab4f53e52b5945f2c590562f65f1c506eb6b81e7a53909f1780d76847e237010789dc9f08fa8028a54e2eb028d06e59ee67fc7f4eb6015a69c753d0773cc2c8c638daaa0687c47a7cb741ffb273ccf28c2d462917dbab117b634bfdaf2a3d148e42d029e6bca6e765078b3d63380edb5f1936d69c8722a5566677c1d71eb462d5817a5980bd21d13f9e744ba6d9d4c9d642ba843df7d8ef83378d22e57b5eb4936344a0f5c2ae3f873e632dd8d135582bda315a92adebc126ae1e6add37fad7b38d6b369aec81a1cf2502aa0298b6a342a7107340cc13959a312c194fd1b4480f04c07b1003233fb8d6a2553949c19fc8bf9a9ed77caae26be3ce1ef0ad5b8078c244f37848c0210783ce913533ce1119d26f4af4fa9300a70e1d7bb99a96fe7fa7b1eddfb79dd3ed9d398ce93bce212c26f5c4c69c3d8ea02c86fdda5c050ffa5db5bdceb21a86aeb67936b0c2f749a11890482586b43d4e6aff01f4b234f11510d13726422a3986f18c44cb6a74f0c0bfa49d5cb152d087356ad52194d3293dc730967dd788c617db5b4ee1402f87748353b35cdef71330768a5ccbeb675bb018f99a4a8932f2e0ade9cbe6f4bd3beae927290fbc2a483c6394bad8e8d2808d30f9659160a788e2a990f5999de917b2176aa83e7c036c97208a022404da013cd9af43e58c415e9015d18f43fd69b815247c1c2994ad6b39a291f2ecd9b7f7fbb3ba0020fabfc225e47eb71a70ddc922f8c183e1ec6c5e003041f7015c186b714e644ef1ab265340be3ccc57b6cf4f8e5429162804c52d58b9caa7cf7b6016777d878e1dda65c4edbb8ae6e6b4599f8f5b2f586a02fbc1ff4129fad74c0590a79f010d2de1072c46e0f103436233d59ca4cacf6ec70e36d9b99b90a4563f40cb4939a0d770283d4cc8c66dec6900264da7762930562c8d7c259fd6008564b78ee7d72476ed5751e001e187dc02b6396a335367d89fdac1b56139fb2e3845bd2e7596ecea7ca5f2519de6ea1c7 # Params = SHA2-256_W16_H10 # Msg = 39324feb180aca683d995db187a075a910d0 # PrivateKey = 010000012f4df507528be5a7c45b2d80349336869a33980aace2b6ba6746a12fd528a9acc2eab76bea069fdf6d066f1261acf2456da5c1d4f50b977078c9ce0124a90795000000000000010f16aab1b0d2dc9e595682bc8ec92a7a458898836631130918b67e71556a7388dd15b9901db169687c884731c812532bcc51044126fa96450b7ffba1eb1bc0e924 # Signature = 000000000000010f63c3e98688224ebf136345d8682dbb2f0263ebe91cfa08a837db0667d75515febc012717f613508b8af6af740e8b022790bdf6ff10f4013a9a3473c6158094eeb6883e973272fd15a4606c9787d497dd4cb2c12991fd603cbd6b50f7a9c96edbb0db6aaa9690276ac0c75dd8e28476cae215ad0f4a1c6b46a7b60680b7b520899b2b4b38ff7aa81bd708fe1c6b91eb8ed0afa47724fb07269d3236d9d2f0bbbeb99ae89d4dcddef016d1f13636386f9ed82523b266069d423d74b5bfb3d8ff1460d94b75fe7f3a78592951b8fb502a8f3745a619e1e25599c03bae3b67459e96925509b9a1da4f72ac72d7b66d0410263431dd564bd5288bc68ccd4b74e37a6c24d1cc00a0dae17686e580e515918df41253ce48e3f31430b6fbc7e74e60b3aa09a4fe3efddc4dc44b25cdb20700e2e06e3800b27170bd07cd6d49801b5342bfaebbb9558dd4c3a84c9319f8a6e2b0a30fee11afd27ca0f3ea7ed83bb4c2bd7332c66d3ad9e02ed03f914d4f11a52b87ccc88486a6b9ec354a205b4a1b4268ec81dda640fc2206b9978ec393cbe3abc56960dde24b7ed2e35dd690d53bab51dfee64b907227d09b58a9c5292a7027e3b3a56c18a20c728a099e976f39e4da04412e2bd247ef382d38c92e5376f8023cbc9ea65cb954f49d2af52610de4985e4e13f4f0c491d8b35776f1a38799232004454513b156a34e4e8727020d15e89ae8204543ed361abb431fce8e53cddf03cd47074ab3706240895f15161b3b93c8a3d753ca27cc8308d16d17bdd208071b89fd23d38845ca4d8e3b56f704a601487fe5c2c03ae2ffa39f0bd23a599a27643e8ead65e4685a7789584399171fabbc69924b3de1c511177a38cdabc58b19b269bc764fb469cfcf1d96ba69c366874303b35d6edcc22f649412ce6559bd7eefa2c8e7b9c4828909a44f6c65b8ff45e3fe6d430b908551a11f2e391ab22f3f85b0ad11350dd3ce8cd6de5b33d429dc50e5e841f66c5b5b786698fdd48ccf79cbf12a8aaaf3fb6293128c81cbe8eff1ff81fabfc1f4f2b4810047224ed81bab52c3c6495699015550663b27c1dd6d19e5a4d9b91364a999ebbd9655b9d04426a9f03e775d4b7976e9c8c469de141f4cdf815f2ea95291c50f406d53f74f0a96cf5489d4458fbdc33d96b2b34b762af1db43403fd4b54fcc06de48ace3e258f1b42564cb0ffeda22996831eb0255db56637ab570e8b3cc613a2375405d5dc4420eac68c0714ab444672d96eae060b0b76dda6fe2be153d0c6f0c9a62504e2162eeea528574ef9f5bf61dc8f4d54be89b0da94fb7d1c3de5d6485ab7f2dc126c34483296e1deae012c193074f1a3af6ead477e2e8dfb04438068ca9d51f1c978ff4feeb48bf56ca9acb6f18422e5f318bc714d68260ccbbf2f752f2a00d49d367c346acb1d0107d30f35733403c15c7a4ba29ffbfad6dfaa7fbdd9eec459bcabc070a1cc7758947974f33b780929a7407c2cfd4b7db0be8a3cda8d8bcc14b0d4d74f53bd688e8f9b2408665e932198d3e2a6fe46825da26f59793545855cedaeae49e30040b03f7fcd631e76fbedd6ccd2d1ca69bcbb4e58515320ec1569448a7c558413d50279b0e031cef01dbb05bb9c7aefd1f411b99a7431e1871c8dbbc62c285af4a71c596169ff143f08c321d8a173e09ea851393581dfd02a4419cfa2e2b4a64251c4bb53f17ad04cf70e267172a9b02b20ec642031df2df8e32b7e13fce87558ebeb0d0bc15506c550ea132a9befaaae6b4ae5fc1f533702d0b3cef7874d3d248343947e81263d9506f96245ba54c726f36cc647f0e91a6a7ba21a6d20a472dfe8cb5a7ad68d010d63868a49fb4f52e4e03fd87fdd610c09547ea16b0780696352d9cd9539290bf21e576fb08ffd8eda011b8522a3b867123a8777ff959276dd3b7db82ae7a99e3307d304016f30d21068efd925a0877bf018f9be815ce6f1685bc021ba3c44ff993380bc3a943b358ee01e25c5ac52540e1fc935a301e7326e693f213dbc30393a9df86add34c046c734ae5bc6c80dd1268b45d891034206dab9e83117ffcf573f808bbf90ef14f5ccfd76bdf8e182ba1349312f22295e5a4cdbdf7abb77b5bf29275d9d56fd6a88452b46ca856a77db6d574afaa31b5e394f51cd0a072f7d5b5c6d62dbf84eb58b817bea78b9b67c89641103bea0ac4618d136ea6b695990538499f6735570548519791a6ee68abfcd9a0a7a5195384aa6da6152fe5aa608ddc0701391f328b4844cdf6784e1e1b30fe2467de6685dfcf8a6e7790aa0df1a97275c3e6846f669127330e44149a844a7704e348c4a1ecef3e75d975e370f369a0960cfbc0ff214d75f922108e8755c6fd6f949a18a9fb4b2467d7c3cabbb8ec91a3527f337f66c38877a6a99e5eec5ea288778d1fd23b5f244e11d3e77c959c9125a6a95b4cfbf6636a7e15e6cbf8eb0861db86dfe3ff3c9f8894875cfdb24c236b9f279a4143a6c3b57f730a4c1463a5d7b9e0b51d9acc114b428dd6713d4e86975458ff6f6eb1f972bacb9f11341b84f4150ac515e53189af17269a3de029ed423aaa2d39fc4f72341bf383c87abd106e365921fb58605ede45eaeb9d3419a8765cac5fc86649becbc78a6926ae7e0232c84dc279ec537d3ee7b4651dcece46539507893c5dfe0622e5808bde192d1f149877ce84d6cc218c05eb4b7e5b963f4d5a0c7367bcf6bf2b19197f5dc4220cf8391ec1359dc5b930c6dcb941bca16ac3a0b7c7aa0eee21f802dc2e3c2523dc3a45dd73ec91db603a1cd790ef984a44f676f2cb8155f47472f3c6f88f0a1160c90becffa99c172b870dcad0222191d22617a7dfe5f5bae8802e35375c6f886fba1a94f29329d2facea7ee4f35d3b18f1223f275adbf8c93029b0c3d9fd71e89601676d05a2b520d6ea633ee23d2f477f67bd2930e736655b4cbe2b48c5ffd40854bf7c3718e21f568344087c3da77fcc488f06e25950628c1f6310b61808ea0e5a324aad8e740b76915a1859669e65ad07111a6cdc8b24a603b9e33d103dc451c7b8b2d355fcefb37aeb5f90e822fd12abb9cd29809f469408e73c331772900d0f35663b4e9b42a6928d50b6290a396e8e781f618a7cfff0c7ca361e0f821e82d838866a48eed0b00f74abe781472d2fd0965629b0ae83aff83f2a3a71afa3ee488a6c27a51e50f0e1dcdfed037c6099f1c5f637095e2e3657614af6a525e6d2163d89541dc351acac6298614ac8398f6d04a84b8150f780a1d351080036317ff618f24d60474f201903651165a415e6e3966544b6106cf706089779446b4e16e8db478d2ee6aa20f4be60cb747708aeb99ba01c1f5640d0ef2b9c1c5123380f3483033d0d191a1ba6329bdeb81a6d52734987cc25f380ac6f7c289c347c376f2383db4d5cf0afb6389757bc617fc803de5e47c5450f70ba45bf5587c03cfb0af7666c90957637e084f5719c6343ee5e1d59d54e1d0b3c9e2aca22b110829d585f5c63d701a8b7ad9b1ef0ad9b3842bb03f10795ac060 # # Params = SHA2-256_W16_H10 # Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd3b # PrivateKey = 01000001dee4083a3b5767939ba8f1c38e28fbfb57e9eb0654e0c8a68a62ff71f193604057e5ef288e7bf4513dc3da8807622e808fc7865b8ccae0c5b9005134536ca2f9000000000000002398b69617d0fcb1d4f2a14314e1c809e926c012c3c4f126171acf2eff00271459e89d37e6e96fcec8628c6588bf28997b64e7d1004a457fb3f36a038f1b3722e6 # Signature = 00000000000000234960ad0896d6a6d95ea4c961144f7c30b5b8f73004233729c9ac62bd7470d2df0e65f17cb56952c3f04a1154bef64e8a28bbf371f49ef3862126b956109009b18e65d5cf334d06745c9c5d574828ce7e1a1d6ae1a03ba6875a847be9d7ec382f3f8e3806400bc989aa04e263dfdc12de93dc42cd2172197a273361f35ea015993ea0a2a0ff8ec86b29416501df9d380d6a844c80a1554e2903d8778d3c9909bebfba7853255e2eb377123c00cebd3fd487de40c5a241146320d4edaf51695dcaa1deed3db3bd4953a291ca704ecbeb2ba5994d5142d46e7fcc1e7fcfa2f126b685b491276259321c94b76b8309c5bb9a5957afdbe0ee992abf890bd748a7b28f9a1bc18734afbf2caf15c52a70f1e0aa83b9f606daa3fb1a4d66eb47ab3096149fdf61d29f49b7f449fa30bda77d1efa2ee1730ee8835808ce92f7b4bd4c377ebc63ae2e4e73166eb4abbf5b65a81e0323be96ea48f4fadc81a3aaf8aea0a90ddb6a36078beb38e9f043ca92151872cf976a071d82c87af407400d3f275143eaab72639481effd4d6ba510d3074cea3efe9276f22571ab06719667d391c710453c7667d4b6a8d2f61ed3a62523ceaae011a165cf98f9c86438b764746283097658ba72dfb98637d9c9e3052061fa39bc45644ba4432b7b32cc1c862f7d6d3874a616cf69df43b8f06ba74bc5a54ef87732fb9730b2543332825bf5a35523fb2a18f1dddf51f0261b3a1accf4c72e4d38f4395c25a3cfc25074cc6631ff86c1ffdfb071f1423f67750dda8715d27af25c06feb8a6d24b93ab2b866a61dfecbb03280b62e227608735c15bb6e82f27a2b3b2136c8f1930a43f0ad0cda2255c87f2ccd7a97a448bc466060b69b4f55a84f6c715a8a6a777a9f550a15c44b8073f0722600cf78c50cf08cb38448af8727947903fe7380060af2fac486f282b1c67b500270a5600a24392e7ce8ddaa6326a6667fcd1345de58543028b5f78452e5855c74c2b94661e23edfacb8918d3412753ea42b50f51a63647821e56a9cc8d6f14e4cff470d1118025839da05209a130db48e8d72fddea29336295a3315a4cec58fbbe99132941c491ed1117939396a37826a89fd23f7ead3e4722ec9eced58ad8785f164dfe0a7934de81dedb972134105ca463ccd1dd0ca999c73ce8d2e3e11d30891f7a188c116d3eaacf8c27133b5aab26bc80e9a3446b2ce52ad977536006d8deda901f66bf7c88acf2e54077a6a2e91f3b1b17252777347b285a71b227f724157f56023ad8c7db774b74f1c6ad0be25f064f4d046b55b4abfdcdec65f15a16db418dbdd464033493e73bbf4db38a5b9ce63b89b91b59dcaecdf8354dcd1445f9cb6b2891cc52c8d07f90bb5bc472dfc53d8fc394d2cc23362c0583693b6073b1afdde3a191dbeae5f15a515b9ba7312f66ca48270b8677b71f069cb66d839ac58e050274ee94f9601d8d46692f6ad89cfd82036a8b3e9e100eae5c16741fef31c0be116555205c792365a934ac0fd4e473c55bb8f523139e04530acd43df6ae93c71e00ade65c67850f9693ab8e9c123ec791c3462a5037b4c979c126b8bc5fad839199a41e1c1de10e1af96c9b5f237b1f3c9c1d92d3ac543dc513ad17eae89aaf4e16e04c3ee7ce6e4259b794979b0865c5abcf524ce4fd301e495f81534a91ef4db2b257556c6ae6b820c54e6d3f41c632fc4596db73bbcedeb1ed76780cfb0982a466108e8208794d8ae27524e54b6779c4fefd860d20fb259df45d6226347e8aa9a795f16d23aa7066764ae257b54d4d12b870f74d85d3bb04778fb70f228f10528cae9395309b90deffd9129524606c21048a327720fb73c374016c236394ad76fa3aa0ce6ca4205ed5ecab94c62922554a3fcc37b98dded5f1b26a9efd5669a8134646dbede7b35e02defa8fda9ccbc43f9b7bf9a3c70c7e3cdc2059746fc69763a57d96b086b2ba115d130a0f31705b935c9e64582cf8c16f374879c09557e3ad502f8bdfab6d5c9ce9339848ff205dd6fdb683445a5ff44b2726e25db58dff826d710a342ef5321ce046a6d16615d349150f1977f5161f6794746ab6979a489926491cf58ecba0e5d5d705374a14528ed9fd6ad4be2650c3b5e66e7934faab1ee4036f9d4b8ee89c2b34801b116f14b4db2fa79af77f0e2a67bf8b7b65470e30285ba6262f98c5511805d074f33becda965098da5e56d8319cb15c5561d2993a5600c3ab267877113a2811d85532a04eadadfdf50c2100a7e0ae26af0d54ef7a6ab797337f32fdad6da0d95b0dbb494e4178370a36ba00d10fb035381e459660b397a540ba1095b3bd9965c7112ffb30c3bb90d0530b09a96dc36d2377bda88d9a9e48eeb85740804583f982b7a2dcfa3a9d1759438cf2306ab963f079f7d29f97a96f3d2b75e86e25daa56decf6e7efd71ccf90b948e2ae54cbc8552f67be7f61d99307bc1771d9c49f9e09905d8bf6f36eb013235450e0e181a6cfab34528a541080c0de5429b92ed7fdfe615f78ab049ae5f0b7549c4cd17b0ea48188f24c6f084dc3d48b26ebb06a17240a5301ab84077553b51edb6abc7e94e5791b05f7ab4daf4a903ae142befdb632dd7269931d56248812a658b62cfefe65061c51701234318c8f4ef9a82a4fc50f5f88ed4401d3efeb73d508ed049589ab8cf6b39aaf6b7a9de3bcbae1ce08aee769a6f68f1111faee2cafd566cb32c1b371b1f538f096565af6e17b71c383502c58b880b63f04b8b2a14c29c9c5e20240b8ea1c86a09de9e7d73a1064214361ca6ceaec15a7de139a467367be8968464711546da6d8cea3d00bf2377a503b52ba104bb0059098a2358613fa5d0dc99619049bec6a8d56b245e544eaf1cc82bebeffcd8dcf9357c25f62213e18e6b6a418c1877c13133653beb1249cad10f7669bdc3cfbb7fa3881c0d42c73b2fc864161c56ae9a12796f885cc3d2a2d5edc07d668d06373342392fc036a3baa509486fa392b0c26d9559b23aad32257ef46a3cc5fdf412e5679f91506bc090506a8d1ef589630e5872ebbbf712deeba493966804415d692dbb1bbcfbe3100a738833bcfa6c3405199c965750da0e0c05f7d81ffd570891b9d543362c3c61a0833d18ebd70d696eedcd2962ea5b5b0955b6031e5da0f52d99b80ea6b88c53ee458f2cc4b052aa99b1aff189b0990614cd07622f59358509b22f7da7a830a0d4475fc103b6fc12310d056eb7eb2e1430d53119a5205616194451a65d06b3dc1d898786b2d7d02f62f6948f3bb54ede5931f811cc501481680d20f16763ca232a8edac6a1432c81680bb06e89210b957efb8072bf463b3b5616143fecbc12fb09a367b82512dc2966ed33f795b26f37d7a46a7f5a4c0243e73879eced6149d51146f49b25990d72188d262e42c0944df092c18925c0ab09e2af6f1d828c35421e45bc3e89222f58cf6e6946b1e74d7175989f3ec19c038faf22ec0c14f3004afd1de8a44d048b33887c2c4a634378820601e596d277f72a427d54a1e3b4f5f6c8df0e # # Params = SHA2-256_W16_H10 # Msg = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 # PrivateKey = 010000015be1f58a08d77dd7272a768e065da87a51c1119d1220e0ab474e77d48546e95a26b9b3ea21f56e72f7d3f49d74d9d4b026f02f987f8c14decc283b9c6e37d3a500000000000000e154c8755dae5e932b1efce973da5aac03f73a9a9eff7453318cfcc103fda6e9e0bfc398c78caf8b70f75ad1e0880c62adeeeeab4369e62a984a5f51967c215e60 # Signature = 00000000000000e1c08cb6ec79295b5db6e3e243fcb273ff3beecb9e7973cb6a2981907273d4f8a5e796f071791ad5c7f9842679fbb7bb7f99db19af2f29de4ac70bd9f31e5b1bb38ca3a4a1444ef23cd46ccf998d637804137a59d30c6f2b141d01e9a0a7826ea3f38ed55cb302e97e71edfcc4a3e88a077427b39d0931403d4ab794836cfebd4206c488b829b4ae56c35eceb96974c3496a5b8eb590bb7caa53d824455ef381b02b09133160ca007f4c7c0854e6fcd92842731583b4f0e73f840719a43f45272a6bac1a66df28f8863b566cfcdc7daf51488c6240ce49760394a7ae66719565f030900df8a0cfd234e47144abf73b0dc4611880adb91bfccc6002cbc98ae543adf71ce7c8b6b9f6bdb3d13cbbd4c2f85faa7455c5634ceebc7a23bc4b7a7a1dcebbfc32a8b1efd1ae91dae2b6828e178d92f8736304ae84e07ccc2de6e060dd62fa523d355584cb0a9087c3d71d2c2bcc56301da7533499f934e88cb7b519a7e5dce8b278407bfacd85133abe632bafb0dc0b6d3d0979229ac9904739f516e7c52ab18fe1e2804c73a59db242cd706a755ecdf8873b2c420a1e17904d507bea7a3d47df4753a9d3a32ffbe9ab1da86ae4267da164743d59991f0f67c7fe0daec886558be98a0c4a21178b666e28844569ac4d0278eda83bdc2904612f1282d5350896b6aa3714732ee90054f12a856194acdfac93f789a521e11a01eb6a867eaf8909f6e715b31bdf3ee4f8038b5a30589b659ab193eb039844233432a60f5e93d036fe71899c3a04424ea007a0f7e287ba741d9165ec4245c3fe367a229464d5a459567a08c065144e067f528a1a6127377dea663cfa0426785daa907a39968c496b156ea0770b6f0a0d363e7049878f6ba709d72d82d9d1d0abb8c31566ad5227450cd9eeae55e51b78d0068af91d3b2ee8b491600a86ca2e0e0ef1eab000032207000aa4dd72f7877ee314d436fd8188e5b920794c79c84924b313f0e6f5ea46ea5f37583c4946709c79c26accb57160dd3d2397c10318d9c39abe1f0388425db6e908fb628bbc8e55286f4ef2f47e02cf08ce10951899c47a8b644670927a1db63735193498d5b867a59577b5d19373dc17ed508d792165ec31822bba1e17bc6ca02420730bae568bd95bb1bdfba37f7720ef937c39c7257232c55a8cf33acad7ea1001023640c432b1c4f8bdf693bfeb121666685ec33545dff809d7d4973b7f7a51f57f2ea48042fbe012ac22bf7314c38996153e5c4d48e517bd48639625c2394972a5fc099aacffc4aeceab6803975be4cb06c07ae8e12c1cfc2136b7ef865ad53e46dd54d21e7b0b2cc075a735005a4d532235035ab9f983fc984e726b7d66e1b0a07b3075e2f1fff77bed62864d409e50fe6e8e803c39742075a6488f9093d33147e0300b0580324839fda11a716a04a27481f8ec6f2aacb31d324b3dbe486595b0dc4b092fd7bdf6a02076fdde875398f7f056f007d5c4340a13313338d635b8b2dd65dc1c57e8d0c430e25448058b74e0e787db2b5838c44dd3b467fc8fe2a8dd321742858484ffe1fb74b004dc8d0563d85fb3e92ba9dbf2c72354b395120e22507cf5ecefa9293a2e26cda592a8db60f4ce71637373132e8bc6c83ebe162bfd9269c8b6d31fc264a74fd5673ed2596d16244227f9a7b010290c754752e48f36a7eb4e45367c7f92d5c82cffc50ad92b9839018c029a17f330111fd25bcc412dd4cafb08dd7ebc2780d6492e14faa90c3bec74713651de039b17eb9770935ddf6be87917ddacf0bbd0222ec50a0fe81a9dadedf602b3034c14275fa49a3fcdefbac380d7a4ca9e3ece5bca19e783b57b71453298e39d548cedbe07b512d57ec399ea76d20e14d3709bd8fd5bcc6aa057308b73057cee4e86ba19812e19af12a37318767c6978cb9a61171f0ee7f2598cac49b3b838393a44afc792d86aac1299a88764852958d4e6f13bdfc2c34adfb0b2dfd522981b29f458b64c97e30cb43e5dd47a252005cd815ac5360227bd55e576cbb19294858a4a86effc7fd5eb486f2cec0cac6b3dfb0d43c0adda244d43a2e06b96cd21b9c1b583637643cc4b77538bcb5196cb7babc763af87cf13ffa954e247f2c7fbb87f089a6a63ee14f6d691ce5cec6500acee39c1bc06a51da4733602d50a84758f06a82e53f07a8e5cd2e280bcdbfa84d4d3804d0e9f38c8c4c5c614a89ae6d51a74c63b06a43d7952bc65a884ee4a8905f788da6f36d0790be4b8b4fa336dbb845afd9f332f32db794252c758f4c7f24629783829a9e60d693bde46bae958282247198e6886f58642415c2f1d2c035aa116e0a95126128ac4181531bd5a3abcd0009e34c003c71b1b4b394b488086bc269f285176352cf1a892925f76fe9ea3ffb0d72e9bad0e4c83477f9a72d922dc96893b74228d4afc1bbb08bd97d5b2f5a7ca33e73aefddad59ed9184f9dc7d1b3aa7b174ec81b7fed0159c1dce093c06cb1e2eea45381192c34b0e95f8716b115f5c59b76b39a1ec3b22e2b45f2c46686055c930a13224219fb3933a8dcbd8a2ba865f30986a965502c257b39853a903a1a621cf90302076a9b822616faa4bda00825ef1906d843745d58bf438d3f49847bf3f0fb6f3ed49db1eb774bcaad79c4309a66a317df0697fd31adcc07cdc690c79138b741a68e629fb3c3f7353e8ac36f5d07617fa93a7a063e0c8d8790555792af1125017907e6df4144866cf5dc4f926749443d086187cfdf249d4e14982a42b7c1051be2f851f9d475d1728863b49d3aa03625e86780e0d41751315d6aa55de7e4698056735a6465d36634fee09732c7a93215a2e05c2b602fdb3af68a410143c8f931296c3077ed7f3753ba3199f39436b6f8351ab65f57ae5bfbab6d809a5be7b740ac775ae25c19361342803a3951a49c202335c133532ee1eb3cf07fc98b5f9734241640ea083cfe4d8e0207562de6a13e40a654d9aa6e32a99beb44cf48aa68c5aabf4d8d5f52d628f6a05ef48d5c9ad7c1a1b4bfd9b15ac521021adc96382e2eb5357d14c933278c30b74c5092ca8ff4e36eeba2e6a1f74b8fe7aa047467d0a4a63f90c93c6a369fa6155627181e759cece0fd8fe567ba95b78770638e4220e3233a6ffacac9830eb85448c67f037667fdba4f802095b3d54f3b15c1048056ed754ef3126024ff6e6173e94fe5626ff64c79e5de6b60c391f77ef08e91094a76cb7c6a8abde6dc36b69863f6eb9104d47e91f237ae7373b3918cd02134fa8d8ba870efb0d444ffede59539e102846475ad8a71ea67c0cc177cf950c9437785b2491f070dd8fe6e34a4966f43b89186fbb21bd8ee2da529fee058125cf77115a4f657d1983782ecd5f5e2170ecbd15fd631e9ca668ea1d2c8299c103e13e4a447bc5a4aa114f9ca241e89c4d7d621f0453644feaecfd14de62773c0522345a9a91d7e438c164ccba2d3c7e0402aefdeee0bdb3e0d80db7aee9a10566fb06dcdbf9eea5cde7827e9e8c4be1a88c45eb763cb36f157611d307db92470254702f70 # # Params = SHA2-256_W16_H10 # Msg = f2bf311ad45cc27c6d3263adea0b55e4c856d5202ee4c07f4b79da9c42387d70dd2d529f037bf4ba99356e8875f0c5075a0d89d1fa699710aa5151ae49eabee6b4704c28b45d27590ffcf23074cde0c00e52bbee5fcc00bd76c3efaf71368526c0fb7d30c3a71265b9480bd90e655670679936ae36b627e1bf83c621c3d1b5e36bb928b9c720e8 # PrivateKey = 0100000175f30164efa8f83f3ded130ba833576e92429bc29e19f3e306f937f607f940eaf7791799b7c6dd9e096d4777ef9c1f247425039210a00e1bb5ab8f34c94fb98800000000000000afafce1eff389be71998c3a377fca8fe8c93a6c6008776e2a99bc84370e2603f4862ffe1e5683fb144a1cac47088931f9fddf25594043ebe9d64539b3e579a05d8 # Signature = 00000000000000af5dd0dc911486e96d296d3d04b191f3d0a87ccdad28614b78d0f764b5ab5ec3484d7c601a3533f71453ccba2720dccf92f9cfbaaaa80268bb39c005831538bca339161ceb45bdec989ee3f1b57bf458a015da6327f9d0dee4c12a80597387bf8728dddd40fea699625dc99ef229e15d1ac3eddf82bc87bcf18ed9617479de47ffce788f81183994f67d41a68f75c330b228aa84210cb8ce3ec456cebfb0c936b85ab2d029579c8426eefa0e78384dbc9cf941fb8658afcb63d92db2fb19c387913f047dbdb5a6fc2f697f2f09f003e8428ee67316c8d82d88d1b491d8e87ba93e62107055af6f109c00eac4083dfd0bc93f0b34d8e6290c61047c3a37067ee6ae530fcee761ad93d5abce59b9154cab3ab8b2311faa7ac960f2173dfa89b73ea139398c963784605ae4253a0819c48d3ae005ce87c8055a7591886078901be509d8390466b2eec3b1f3439637ecb1130c273ffb637cd8a0c5a8a9720ad7c1d63f3c08143064845b150c47f55034c02bba352a38145a2c1942fc7dd5f0a52daf08fcbfceaf5fc4a8eb555d10b6f127ddbeb5d89fedf94bc5cef23ae674ab26da9f68eebdd1c90bf9b3826a261cc83020b864b61f0215214d625c23c6b075d9248cd5878cd14a016b8684223155b10288a0029eb3f1ec7430a509928c8d6d1e2aecb1176ea8fe7b5413e4152bb3528fcbd0ad6976ae349c10bd413b74cba663c1c8b30c104853ccbecc579acffdc76c6f3b291c95ca3f6d6055d82cc9e3a4ffaa70ea6c9150c67bc129d206211b76c1129c1a0008a8534722563bca8dcc4e87d96a1e064e701142ec0a0b72184ec8d1446cd1e4fd63694987f24ac79e2fabad9172fb5c2360c997318d695f1abaa10583c4029cbb0e60f033b443198dff7b43ab7017ec3186910ea526c3ad1d1e06aec9e7294f29e44d2c631b1611766df0688b65ae23c1108372f91db5b49e6a02328fc4f50397643c9a510dee5d784ba709362f09fdbfdb25b51203bce6c6c48c4e425fb83118a41f0850de9913eb8645bbb05c889fa61b4e7801ce3935a777d0f5241ad5ed38e3faee711c069bd7c0eacc26a9b7b9a4e59d8f8c909f2848b1eb10e985dd6b283d47df522635bb4d53b5492d35f70c17740cb0d5f1f9c7505d7445dc2e76819638e34fd08c7e530ff5a9b2532c589ea3ce1d455119498447cb75e5ce51c61d93230e1066d98eff254298ca5dc6400fe0ac6cbdd7e07d1a86417c5aa74459f251201bd214127f4615e4ada636006a3dd68b2fbe050c20d2abd2d05daac5fd4d88c8984afee5dc03f58c5fc12d7ae495bc976576685665bd479b4657fd530e3baab3c1f2b122793f91fbf653e158b376161ad530cbf06fee4d9f658c19695fb2f7d266cbb16546e03c086c263483da59ea45b3b2122cdb351bd36654a4e214ca12980035caf0b9a45a3e607602e7f2667a6c51ccc12b50ee0a361b361ec6da8a1e738f60fe6e0c0194eceed892cbdf74c43a6a14ecc9267390c9d6ce10c82f8dd57edeb7d60f50f81b7372a8b7049a08e5db7c1307d3a8c2823851e2e932be0e69544354ca699a9844e24c8382165a9a25e7cc7ad39fc99d1f841a49918c5a3f36d2338fcf4d31c6843a96136952b99ee6a53d650b86585ae64303e4c3f212a02c10503c2adc351ffeed6f3423f38816424dbedcb24d8b12539956c5ef4f70d1d3d32b9c15dd4dffb3e603861bd4e7031a5fcf466b1a08685277cee264e748dbbe19eb9f5f7ae24d1fc4dfd2419d2da95d9634d1a742bf0585d89c6d296503bf1bdcf85132dbc8ea8967f69e204db75a3d810bd775af54248fde8e4d8e65652de327d315ce21792d7969f266a9cfba12da6dcaa173ccfcb63a2e102b487ba32e1961f3b8f327c5f0fb74b16e64e4101d10584dc51e2b430f36a34d642ca74328f03c13e6b46fb65c18840244ca926d927fe87f999ab4fa2f88de789d2933835321729dc788b74ecf222ea6e909c6cca40843bb89a335aa435856df27ec1591818985a0bb0935a5d009de2994247f91b8a5a97952441665f509f0cbb6939796e2c8537d099f8471ec8b2e4510ac572043a4c3c3484eb0db7e36fe8ae05e57672bcbc15ee42c0176f0be46148ccd61a309a7c0444082290531260cb8f32e6a18f30a70081f59034c20decebad83339d43ff76901fe3834c52b36fd3c82049e48176d54acd06e17035c46214e2866b1a02ef56223173d016f761270f664e224e0612cfbeefd3d1478fd1a535de406e2a31acb65c4e7091dcafa8d1f4166817b51950fe496cfe9ce2d511d1ea6b514fde1b6fb69b60d72ede9052cf1aefb162ad460f6c1221201fc68bb6c7155914f08a0e75a57b6ede783ec1cc7a19a2fd108f791d2748b0ddbffff2ec7bfc1512d203c0934470b42bdef71ebbd736afb9a4c571c5eb2fe885f26d0f5f8b2a8201bb1af7244530cdb12a64a4c1d16721ca95c98c40ed2456fce3fe34fcccdc594d886794eee8dcfa9d31b040ca68e0891ee47535a38759c4787cff3d004512af6744ead66e142acee659aa2bc76eba1b3c49cb7db9d1757e2e2754a991bf9b083b78c6a286b2336a73815a3ef516e26f6a4ae0f0d3871810e927279b7fd909b22e9f5c2b5a72e59f1661dc698ea3fcb635005617329380f65e3e4e1ef05ab6cb3c05e22902176726415403294719329bcef1f21c852dd4519c19398303889ddabdbbcd810df4b64cf864e0bc29fed401db91fcf540c63ed753fe83165d19a8bd60d1d0759982868c34fd121d7360e8bf1d86a3ab09712f5002bb0c239c0b006f4e0e5e39576707c7d7293274df1897291a417e1dbfbd08a13cf736333f16acea7cb90cd14a335c9c9e0de8b37708647e3beff2f3d77f5db8c6129d31d4b597adcd757358f8523add98302ccc4e4595860d902af898818784c03e45bc8144b655ccc2d8228d6d804fddaadc0de8034a898fc59945bdaee46dafa9378eeaf8558df7b0d52b4cfac5239456075a269e40a06351d15ece2bcad7812ed8c5f95831d1bb967b48eb2ebba4a5ec794ff486988a2ae1ba700269f42ce4929ad7c0f2cee683587e520520b7587406fc81ef803891f5cdffd7166d5c4b2392dc2ded357f615bffb5a653eaa228525141c2b40bf05b96038e28c042aa27230b0ed6a2697bd2d9956d341b4a65f4cfd5cbf5650a591d4eae44b5ce810f4d043e06c050505cf825d960d8af3b134a7e4d24c7dd08990a65a1e0c281db1885e09d78e73d5f92fb0856b46b9d3a718b9d9e3653c14ce1b46d878478e0d2b1a2dd81419d81adc9db1d99d16a6493ba6327965581b05c13b219c13d502944991e3b6520a1cbf033d0ea4fe07cb3ff8791af9101f7fbcb25d5438ae4dc94c076579284c500641a2e1025e7dfd04d52a9e9d0d985839c718914ae971f6b725cc93074c7654d88013b11e54899a0c383e922c181ff46e8662d20db47bd3fae2585c32738edce1b8255e6cdef4baba1f807bc164a20a7cd98f4420fb29dc996908a3315c2e75f70935eda342aa # # Params = SHA2-256_W16_H10 # Msg = e1868d1872e71afabd6e51c6c154832ebd7d766da303514dc808c0ab7d7697674a03b161c813a4d33a634c70d1d50738d6fb41ee57a4df18a277efac4fe089f697987d7e9ac71c693c82fe6a2bae440a1f34bd2655d958408f7f7963654d12cb1e62b0668eb72c69ddeda3db8dd4b78c72bae5eac282809b4b0b93133984e19edaf96e07e1c0b542d6fbe58fe703adc786a460851e5381550814c8d0a73e294817d6ef343ff17d9bb7ab72dc3a76b538f7ccca6f154b043ac9addc84b8810f970b1c622abbcdb47a0092ed40d5f3b332773e9eaff5df050158e0ff74977074c5c0543bc92f613c4abd31c3366b904121de54212437151d91ea9220997ec3b2e6a8fc02a510a071374d761b23c0bc6e3540c5731a11c90a3f103a # PrivateKey = 010000016595107403cf900b50d100869665b8bcfc1cec30faaf4f3a22234df8329dfab1847e96e1775eff070b701b288f0fab9f8ded64b3875a65c83d3663e3164e9a9a00000000000001aea4fa1266f87447a1c6f007099ccec9ae4b6d942ad6df9f42dca8bfe864bb09b48438da1e2b2dc4e49deda9d2acad4560144877d1f89068cc265ff647a9ec73ed # Signature = 00000000000001ae776264b6f4ee232e3a85bb428ad854a0df286f3cc0d9f111ac92a959f70073f2d3f73a6daacd67a1dbd7ed6b7da4f6514041543847a4a53172972b74259d7ffdfe38358239c3c05eaa01971e09e1f7230ea1f03c299058889cd58645f302a41cdc186e07cedab9b46562ff712d188e63b119f85dbf672fbd04e4c59f59ffbc945b1ebe130ce51fe5c47164a97545f4e194c676e4067df41c3de9cab7424cb46b3837b8306b391ed83422be7c35d37c41bd50a27461b1ea2583c0d73393844cf966d9fbb4a7f43e5a47db9c49b19399adfb003ad39896c90b328be553ed76c4bbfbb3eb5014336be3c6c6452e3502633f7fadbd7338235fd97b2276a00ae4efaed8b19108d558a96575ad12dab0f227eaa42897b78a6d9572ae8aa365b06ee67f1a9e07ed34c9c1aa2a6dd394b0ec05ad3859813f9f6ca56c9d2ef92c5ce642b4e27a235b502a462010788557c7d90a169799dee0f6b63512c9a6d084dd3fb882c5f16405f6d15a5005516c66162aab9298780ede22c051766b3c5049b81626b1688e1509bfc4abca7bfa05611ab5af92d8301cfa776d69d53caa81afb249d6037e1b131af557da7af35d338d40cd98576ef21194eca258c3b92aea61da109d312188f4153f853fc439a954b98ba031e9a159a4a1cc736ad6e10bedc6add8e3beb1b7b7ffd0e867532cf102a4252ef6a7d395b1634242d178746c201906efc124bfe7ac5570b992ab4302c3f6fa5f5e3f0096fc6a44dc38efdf2f454795bd033939279409fe73ba40570c7409d4d34c885a45ff5d527c7f35043a75f0d45da0d15d84be4280eac39d283aea92464f0ec45bfda1c1a7dd868160fac9df0b3333776ae05d05a173a0eaa9bbd9fa7bb14149e7c1e5eadb72470ef00fe8fe91797d86a0ce384a07ccbf462d57219f59a69c47d66e5771e99fc03aa174b81592cf5e454e3bc40c48896c1ce2fd1d27d5be7c79dcc1bd725b87ba9ab80de30d18692c6079afddc08686b1fee29ef15ac5c4daf95fb42847491fe15c5e9b51caf4aa087e756882ad5aacc86c94dec16939ff5b0f27402d8ceb721227943190b072e9307f8b7efce380121df43acc1790c3d1c68b68622f21c3c0027b89f3a358c57a1f5a903de221927a41d60b7cc0bda4969622690cb39f4026f67922b0d6c4e007f6a62af2fe4b6df4ccca323a1a78e6c8bff43cce6fb922b9b8617cdc2f8cf6129447a7907bd2336241f5846911cc1e433807efe68901a467c6079c0fda49d8a3da591846c7d649a82c60368ed4766bc7cce01b34f6ec138e0d2d7ea4ac40bbcb86017ffcef16f850ac25638936a582c9139b6b0a2e1e42e06f79f86241c420b30be6f89c82490ebfe716f70a958549068df43b380a1ebf12005c0774a8136da2088103f0788a75e33c6248f830e834f28db4ecd32e4743d85ee8532440edf5291cae5288573f65b2c249e5ee19470062403bccb53560f484401f2c7c221ea5ef97238029548d6d8a29bf25bb7ea87b64a68557df17f3b19e53a39f2c3ad6212706ee824cff3ed5f6c569c30854f24ffae877ba20fb7b998dbcd01507586117c35ea73cbec6c8040bb0266d2327542726e8149d1883dabfd9d059d5319a9958180843555cd96038c6da9928826bd7e65f8f2d7bdfa29db822664319632a08880e0a918fae873cf8d9006783ca2e781fdba3a49de0d1642899082ef2a67654bef2bfcae14fe3e02240910eecc16ecc9b238bd827fa4bd98c49f9fd7e3ba9c06dee20cd6b5f8d7483a63e37376b506ccb4290a875cdb368bab408e130ddaca9d3ee5cc77356e2c58561630c703665192b6ca93fa80fc4922100d1e46f18305732c927940ddb6b2238f3373950f924f885231f7a4b36b0f60b24c0442a23ca43da8031ea968cf489bbac5d291d3cac0c93d932e3cfa5010812017e9122720c500885417e11b5492fecef94731689124b9a9cccee196072aa0159756c780fd1daa1f7372c1a8d00bfc195854d61f85dfa1eb0fef26d11c3c7103a444ba8a3c33d5479a06bbfb2df9d983f06dd8f34926af134b8205fa7e98852a5f0173eeb52260ccba9aea585d5903110f86ac1bf3cf69f80db1924c9aecca81971b4c8b7e2c572ac5de421c286a42fc194a415a69bc93fc3eeccbda2ba10fc1efa13bbd58d17131dea7b88e906a68ddc6565dca6390d1896174868104a035955360d57485e9d2f007c69695320d27e5c2df8b3dc1ee60ca6a4e6821f8d06f919d4546e7265824d31125cc67c1796c4f3f407406dcaf03e20a4d7b233718f9bd64eeb34528111a2690b1be92ae1b07dda10a3e5f77c9e700f3aa08aa8956dc3b86cd1e995d852f80bc85c5d4fe36f24d7bf63fcb5cfc7bac93e7818c32447c4d20042b2223366427382431fc9a649ed2a3ab8e221b59b34457db0cf5d2f7e085139cdb66134186392cb1c64b1f06d55167ad5f17fb1c6f0dc2066f21cef1a0607200a10a6b69166f111c1760235e68242cc53628fdfc35cf8313e04767523f3131b553c4e5dfb634f2666986b8d17012ec0289383c3b3adb74fe96ccb4ed35347ed768c181e5617ac1f18cb706ebd994e4da300193fc97fbb56a4006e3e950f0817fe788c52fe10ef7e68cf2158a82bf97387892869992f9b01bafc75b0f5f15326c892b2680dc0877f334c15fb987ff2f0b920d5f0cfd2df152e9760f51447de412b745de459af5d0a721dc4da98113b7a3f50bf39346065c7ab3a99b484449b9896b447a80b31ababf935576e43e3ff23bfe292e020272bdc0423d50cd5ff485c68600af6edd37b600eb0cf4d783377474982930abb334de425136675cac4dbe1edabc73b920f64f2e6a9c079170b931e159e17f1fc97cf7f91df75c5849c5f24a032d525fbe41e3b513b29d62bb915cb02b2c303a10f11bb650377f135bcad667eed33248649a818aabbed0ddc043c71a4c6ee9eb5dedf5db782846dab9c740a28119eff00965b3f99ee7738413872f055b1c57000dba085f793906656fdd334418400384585344b1cf197eef22484156d9b45438d0949001ca48bb60896617c76e411e12520cd7c3dc8bef9e4106ba8d6b71ae8fb9889ea64dd0c67821574222a1cb854e0e5599f0dd4c7ed703cde1223b9f6bf26c1b42e7f8e3caeeea3cd76bacf80a066c22b920d088195425014459d5a8378f0c4e702161f5cfdcf1cc070cc1fda4a784f3407f11bbdfc3a143e655aa3555a89811f1769a2d1804c4dd94ddd8cfc58077ea6505a89f59618e24987663e205f4a3444c9536e0ab4a085a3b17f95ae2a598553768a13a9bd43546babe97a8a8862cb0d8e6b15f5215de7d1b030ba6a3aff649af6b12002ff9c455a4e007a9735dd53f01a9d26a779d5307df3494b36cd4eefce69f215ceb2183a9eb21d865ab2b1f2f4d52553ea9bf110c2131e0bf061953ffb73859f71e706905dbc38cd0a75003af8ee3b6ffa6fd4b289c5668b7c903b13e46dd0dd9b0eb7bc8cf3aa8e3987403abd9cea6648d044872d41d575693a1c72ec1648 Params = SHA2-512_W16_H10 Msg = 53eb75f30f59e6008480a5a6bfa28163922b526004a0476bc445b47cf00e75ad85b8f006d1ab92db3df6555a8de91a742303 PrivateKey = 04000004c9167f17a269ac3bdb9f1fc78b64b6b76cf8040849a0509b14024d38a144babe40b1eef31003d5d4976b9e334e4d0bfbd796288336f5e43e7bc9781fcc6653526d950e6ca3caa839135dcb8e0815bb58c7f3984ee8c2ec5da5bd0ea0c0fc003e2cf0f7548290ac48b6acb8722c49943cc275e02e96ad3b57274e2febfdbbf6160000000000000000de3c00635237ca3d284b630bbecc13d9b689a096c29ca97ea5286bd104febfda730673754bffde5fff0e422b1559a915747fa1948a35acae38be626cccdd32950273a643f9fc0fb433b4b0e84e96866e84d324bbd75ac6bb3850f893f8ed2ce3f5b76e1faa9ae5db51598410d33d719d1a3ade983dc930e045e535e5b8114b7c Signature = 00000000000000009f6a7d656a7bfb887f6c70d7224c673b2d3676c7ecf318dd5ca8edc1beedcb190ebbbb531f77884a6ae5e47bfedcbea23e52c6a77fb9d29a8d962fbee53e8d3e995c989dc2854f1c9df441d1b5c1d3fab173210a5c49dcef89ce1d06a6c83eba53391fbc3d7c25154e2eb1f27bb780b6d4f9127fa158295afed23014333a8de65288cff94ddd480ad3538cff53623f57883099e1fdac57a4ec681bf5f12e75854d1734494843292119a3d9c2181997e8b22b9ae0458abf259dadaa04a8d6e9c10a8a79947d1686bf3ff3a5a299d0df49ae65ce5ad85832be92f4e6a2a2d43894325584fad7b80bb71a3e477150dc5a51bd422be97937fe33595f2864de232b3ed055beb31868819fb940378c380ddc40ec067da05580852be80da962e105e52da447464c86b57bd74b5ded5968fd53df6f6d943833dcc4689f118d5983eafda7e86914ef16d76a1a23c001818655cd5c09750506be18a3f5f76e667b17c898b81dd6503b0089845cb9c832846ca591f3b03e03d88ded3451ae3f00a490edea168009062924324e2449970d396aa5cb7f61b44eab48806b6429e615db73ebfaec72599049f7f395c708d0bdfb887b0b54073837d2d202eac2a5fe69040aee763130435e55143172a84e8e016a43e2acfaa94a8606c42e13ae1bbd823d291ceca746d98156335f147c5c1173a743cf172cf1ccdfb731b4f1f4c4f072c3e2c9f472a7842e57bbe4a054d9cdc65a958b5cf24ecdb1b8203fc3628b99968b797fa565c80cd35df2a56a486dafe42fafacffc5f236e7333350f70c3c998e20fc4e361dd1865d09f8a6299239a9713b635067bb453530f4dc59e5c20e2af203c3f590214acdb3f73fb128c3ffb71b074fa5946fa8012c6bb2605888d12c860b35ac2dab865fd7954c1dc26d74a586fbd2a7cde736cba907c5485f65540031ba8665da65a59d781520b24dfe20ac0e7777bf332ba81aa2e938f7d9c8953c1f3538ba204e86704b9928956a6348dc46e5b14e51c64b5e6e86d62563d15e8da02a21b1433f2466932174134bf6d82de59cce449f8108ad7d612922f24931dd2e4912e1ed40488f072d91e77120440a2ad6cf48e059080856044d8696cac7b44810e567d16d19a88a9b99a226e970533ddd47572bd7d3cb5440399a8bc0fc66bb988dc5cac60082de7e760481bb322bc3987a2e7f669b61916006be38e2873262ecd5b940ed9a5409b8289e064cec213b9c593feeb0f00887fc2bbcba97e3bc26d48a8c5e92e793359de780e2d39473779fef268557ad971d8e3584f09e6e2a477150e80569b0651f575b7ca455ff17586b985b6ee538c23876cb82b14c1637031a7f06f26e2ba6402ff84680aa484cb62ab7b94d4ccf9fd61ba948a7ecf7aa218162f6660b30880390cd4eccc27e8ef9466694583eead9ab3626b47d54eb0b9618de704da7c118f0c4f5e382ef85afa0c26173608ce7966cd695a54d369ce9cfa8ec17772f37e10cad3b69c3e7efbb1187948790d2e1f7cde4b6ed230ca5d6d9def974c40a0a93d5bbfde7f3376828c6df4b7dafba91ca99d978603cad8009ad8789eb577dd25ff742bb072255e4d2511c7aa424123c34b7349c0c3c20cf6ae10154a3948005d64a98d40533d12e505da6b44ff76dbbfde61b2696ac670d7dd4b13e2301787b3084af746191e94b86aec5132c0f555bab5a6f37e2b76ac3d0728dd72c9e6a8df2a61787a2d895b62b62b2c863da53ea0c7437533a9f63130a402e1a785eabad4ed3a02e2a5341ec4cbfb87d4b959e8094fedd137f0897ba0700a4f6df1d88a5da36273613aabc977d7902db1913a0685e1849e27796d394324da11ed073f98f7f0eab7e024afb0ffc15cbd345da31d94775d2f347a373391bf4a2ebbbe27ca87c3419784cf20e30449804ccc27f6e8957a5c4b87d3eec134ec2b274c920e9c36f0279d4781302788e83185fd1370127c3552e1ae9943d9f4f763cbb4dd6e481d41c4b475038cf117246bc07c67d34fe36e62cca0288abe0fb67caffd4d7898c1b17461fa306841f63d726718cc2e97cdef5a59fb0c6e297d956992f6f4389d255d0abc977c8476b3ac4f3cb720d66538c2eee105264d17a8c5552bf9abc1f7428d2f92c854aa6bda0a1b3d28ab32c852e3fceedd6d398b99a03cac5a1f0c04eecbe668290f81778a3d859af5f5e482926ee8d8d95bf37499ac1cf66e69717e501a19ac3ba05f1e648826eb06a1b4fc6bc2c364c75a599cc9447c34e15f178c7b540e33a06001b7d0063a3089f250eb3ec55bdf3b2d561703642dda9f9ad978a91a8c21da16b4fd71dd13ad359485195ba46e9d1d10381659b79fa451f6a1038321688a2e01a301c611501a6ab7ca312d5d4219ee6f3c2cd3db3c9c2721b246ec6e5e851085f2e5291f694dcfbd79c549435b0bdd04075d8e1a9f8ac5e22e33dc5acd4d45bbd60bdf54dd9235ef0c8d180ebfff3fbdb003f0bf0b68c4b7d34223bdf7e4732d1a8098bc1cdc97acf37d368a8f1446a28754a5c01d2ead5f6abd138e09c97eae39ecde00207cfae22379e8b1c596631c26d150023eca2b0b8182548821776421a63ccd97d1f1611c27891e30963d17fdf34c8f54948fbd315869fde935ce3e1197436d15c5225c32df5d63fffb85045216413d6e3fe06b07fe29a32b7b91f0b8184aadff05b8dda69dbe37b79a41893fd3f06c033e035e13abd5e56d66785dfe8c8c91ae74c6aa74a12bcbc29f2eff5b64a39d4cb65cfd9a7f9f345dce7aab498cc7ada830cefdb4c4e10e0596e98b4f51b2a9104d91e67b79a707ae93715828f2e15f9ee1fcf16b4b8f386262f890dae08ca72fdad828f9c3eddfca7642c3e0c4d3b3eb140498c4fb2332223214f97d74fc5ddba1ca09de848cc69254716ae14acd4e5948c3b655330c9a33741edcbedb3e6b1e043e2f6179441718a0d7c65e0b9cc8a4c91b6af8bf353a32591442c3bf3454ac1eca2c89a4736e694ac9c7d47f3fe595178e7e41c12df163073faabb647ede07e76da1fe99f6fd135e6e1e22cd7a1533aa32daa42f547909cb2b10bd6cc53fb070e56957d8e8e9a2c02313885498b213caa1e86ba23e387e718c2ef6667818188cd40e96c074c13ebdd604475a3b099af36f40b161c8bc72206157f2e730ec596d84f53eed976247ab16ec34166331664dbdf1bd8d1582261712fb77081bb643c78e0e3ad307313e2923c5e5070782cf77c8fcb5fbdb541c8ae9f622d950cd0c2d438fa12ac859e065ec7aa1cb093aabbfe43cbada0069b4964c4dcec9568397feba9b1d0f7e232401e974fea5307ac99852c8f3ca74df017fbf0a4b937a43dc3c526d8c29a2035e36204cb181dadbfda5886cb26a3fc23b70892ef860d407152cda75f44de85b8f03f2f2a577501cead9226d7fa38e4ba395b8dd9c31803903dd00317a836bc6ce4d24d0759ac628871bbbcdb594cf60f9c605b9c10930f3702b307cdb719c1aec50ea5f77b5ca2c437d02cc4ef9367514dae63a870cf7461b53b17652fb60dd253a62dbb3ffc05705278b27be32f770b5b4fc0c5cf8e3935d9def091cada556bc966532c814561b42cb6accffbc56f86d79911f12e5a0ef61ffbf4297aa613052658407c45d4cb52f50bc4672bc5d7637742a48bc52b2d86428d7b44d8eb69b1bcd1f9efa6030292a931d3d8d53003a3d49405744722b3890fcafae6c510049d67ae3cec30b202e4ad662103f7cc431f2ae584d30ed7b21a50124b20e8c2e6cf0b8d2fe9ab8dd03e6b380c11d24c067d84f3eaf880d238d6f56f19968b9e8dba2b076aa02ada64840ed81b33840f98e655fc6ec343e4c44d4867eb8d6fc12c3d4fd7918a62042cc69be8c92600b730a4e9f59c910fbbb830bb8456c3fead6e5d72e71b017038d5646b4257ae646b31da14dedc55b1b067c015715e3e457a94d5721d6a409224d079a1dc25f7910932a96d4117f9089a33f68fd1cdf6618d4945e6abdf056da941b3b732664cd9221fe4363ab1a1a2ce44c068820e1189b516e42d84abe3cec579b1ea94ca3b868652eb417262364997450a9c07ad6ded5a1c3c86d7194e24f4059296b2828b982f9d1bc55543af47c298e0615c774e12a0da5e27a1d953c81098144d48bffc9ad12d23d334f6f210cd7a5ac6d7015bb7171d4dd57dab0ac7bcf250d80bc0956d29505f341a0475274f12d3d9cce4ad80f1986ee90158a759b6cd42ea8e88a891632132f1962db8510e9f99a5546d6d7ffcc605875dee6094eafa65358b34494b318f33da3338f1a8d5c0004ea2e850c6036b9f641da88b85804c453ba691c2e193c4e9b315ff3b1ef7229857315d6b5ebe8ff10321009ade6bcef945671fb7898f4a4467f9623c0824390e3c7f611882ef8451df8bb2e69cf31588cc29ee8feb08723f4a50c4a97886f34c3758dcc39ffac6a89c4479e6532eae7778127808c78b0e73477f595d0773f7a5c5729966676ab224a94e25d29a49a66376e18448fe297f65ffaf9c108aab7bf2152dbbf6bd22fa121804393b1a36fa50e1742068b7178034acb0b4106c39c74cf2997f414a2772de0aac9832f71e9cbfbfd910082c963b4aaa3ba5ecb27720dd2868212eb94ebe54f24529bf882a99eef6388eebd4732a308d64d55cdf050fdb1563827a0672f3fa22565beed7e0a6e4f9605511e9f61f0e17b471ef1be3de9487b2dc98ff9337487edefaa697da6ce4f125e69733f9ac3cdd7cd4e1d72ab32fbe9de98df74f095528eaa02d27c679e8f5362f7a6fca579bd268ee59f98ac8fea58670142c1cbca1b9fd8f154897c6e9fe399202486f1371c798e09ea1a4c57d248119955be16606c75370a9fd7a5366ad063985efb9df0eb88450db3ebea7194af4a2a64b67d14451712ed92689c13f4c7bc4f5f6818e9f8d421d5769562a0b5b5d90bcc1383ad07ddaf81db9e7bb7bd68fbbb3e41265b15433b0efe5d1c231646ad2c238bfaf801bae8bdfa267dba0150d9797972c7f0f707c91d279f68a53f6ea950846d894737ea19b631fef45176ecdd4baa38c6e27d610aca190998c479eb5ac13fcce0a172c84b4ff728c0af73588d531ed7d93dee0392b9a76c04976061fdd7a35116880785d472de6ca103a1eb1d5e4ff5ebe2f109cc864870db27befecad46f581f2fc80722611fe17155c805daa5da37fd537b2b648ecc9dd667aecda87005ff17b9f96ace69ff68a99392e03a9a8d45d8acec91364725600c4987d91537ab29524c8e9361bc753c6b7571b82c0d7cb4202a6da3d3561564df172382aa27c0d933118d17741a58218e9477439df5fb79134508dcc1ffec43a9b619bed56524cc3b3483655194ce237f68db714a656ad5a2440d019ce27eacadd97b5ad1bd2bfe05ec21a1c08e33c0a423209841784d81f35190b9bc1ca74379920d4339a9439cadb9da5f382889062a36886206fec4aee142b8fb063e9341688548493d20e3746c399b7d40b48af356ae9ba9ded7842b0ffb57c2416330e1c66ca936e6a06e0aa316727810bf94d8b15219d6c3727e569413152d387380862ddcd466b88d84c2ebf2474fa56e9b123a65203aa69f91a6f36c7995b83fa1ab7462e90dcf9adc7b5036833d1d7363126a25af1632fc4f69fe931de37904098cbe9191f1a62001a6ca8511cb8fe4e27904c214e4651e7000fc7af6ae87cc001e3b5d05dd229a2812e51b8d95c74268c5680d0d99b6a911ac29580a1af80297b12eca11849d6182d755d907f1a309ac312d75c6ee772f3cab514c14e6ea3ce0545dccfd273db884f6e4f55c110ddaea33e6e241f638ad5b4c10f9ae30b040d33cc068d7fb756dcd8a55993eb3c8f8fbffa52efcddd8218f12cdf0405277daf7c2f62ff6b2124fd33c852c4bd81d507d8500f7ed6509d26392a8a9a780012926f4f1d1eb3d1fc1f5fdc78e9d683b0565608f3d5c98d466a9545036247285eb8f256369ab2b27e049a46b7bbd5b23239eaff912ccbf77a767ff4ed7227128dbad0c781b15c6e8d78899a9f6a73077f9588209eb54a0d3d16617d139caabc5191231aa00d800c789b9956f52bc578dafc9af4708b70fb99c191d59965cb52f51c6ea784c05d09d0b7afc28c2ac9c7590a5f0dd4f5b7e98049cb6024ce0ccb4ea919354ccba378661089dff22b9309517784388705a4b2c47b121b3e7ec5744d9f200115b46d6086c472daa9241d6f1e1898720d410c96939837dbdb3eb8ac0627e4197b67daeb53757eb33cf716ff14a6ccfa3519d310d96e877be2f47785b81e8520a4c84ae32c21a5d4bac69d4f4de72e2c14d46bf0d14e9b83c42e13e759e30097c5aff66357fadeadbc5d163a5b0f727debfb82cf5e143f7efa0068a975fe8a73656ecae67ebbc8b404ee4db438bd5437ee46357acc7e3522b9e966cd4ab7213ae38c17dae030ad36f77b26b60b44ea1e063d0ace0cde6d7e9e90ec6616b9792de90a4384b331bdaa87687886f516726c88d0beb82603b48e60f32f8c347f6f9de525c9e54069a8d02baf8e876ba0da72051188d140e7b2c8d73dd627003cfd1ef43de09811a29234b7db7ad4fab4d02da2eacca6e37917a7d9bc1191098c1bc11dfd51e3c061e4d7a6b6ed98cb387174dd1eed616c802a82ec4e9a607da2cf6a903eb2e43d16ee3e26ea287ba4408ab68c17566348b34887b8b569b304c490f9559a212b0c9e148d9dd826532f089e5b2adccc0e48ff5343fd3605282ebfdeba215e316e52a5851688ce42e30425dcd3e0245eefea1acf467d8b480d3831c205dec54c9e70928d772cac41d705742a54ca273706871594b1a41eccde4f79e7ffcbc2a5099fcca0c3e90b3607d049a467d041820e7fe8f7ae4585d2d84114594532ce4b6fde6dfe33ad2386d781d0f6bf45b54ebdc2509494ac99ebb684b6e01ee874b0db5f8e643e72461396563b62037e96046e5d1264bee0a082f460fa9d7f5601986ead823251d4a0097fe81414dea7c2ce183748e65cf87e6dab94fb411352fa4dc9cf45f0c1a3c8751fffd4b28279e06502a160401786990eebe38d638046d2411a1b6e881ba8a92a820aed27f78640a9fa6a259ef08a2890bcc4406deaf5a18b09d4cc74a6973ab06f54ea1cb3b0d90e26cedb070077f10b03798641682d4732005b2beffe493e4fb43d5c22fda2929543f8cc891e0c4e1342e60d393b957b03ca8cd7b756e21ee621226e26a49a0b234b7ccd5379a2adf10092f6a624beec4830ba8103d506968aa1cea06698cb62b279f49d8b3abb4f39f4cded31910dcade081ef96208b0b5fed144763d5ab92d615971cd2837c4e01dd35778429de67c117f184eadf420127ce75b8ec3c86a5dd049fd41948dd429ebcfb3783701db246dacee0e4daca304331f5eba3ed00c827988144b7a5b8ac1661cb4df73f96f29aa4906d429711360efa9425ef7798ae580e2e29bd4cde3af0f525fb2c82f9e11fa057d1ab5ca4905563773a32779f321ee31c3e10cc1a591398c8305208a273538590c9da3951d285ffe3e3d8c2652a43ec800e48788b83bc7acc15ab7590a39f0966a1decbb86065b386f7c8c4856eb62e5c57217f6f3add452b548bf918a2efe3affd6b0ebd76af79bee5a079c0c37bad9a8dd2d825b3d11190f45560f3730d73bc76cb7e69f18deb133ba95e7e89203e53e24cf4b3417a5a007cc06b1e49f17bb7550c06724c7ca33bf1c19e3e5d5128003acceb7d376588626d733d91e208f11bb0d2658ad9ca6ea9706e5ee6793cea592120f8d227da34152ab809872f5f3634f7e907de455275fe160282803f58b4d31aa2b53e012e396c27ff21de8fe4f7c7da6627f5ed905ea06e4f8db1b97892a91eb9f4ef730050ce1f848b74bb07ded84b09d7d9646b26bfd24d1268ae60fa9d2c82b50d909c4920c11f0d1aa29d94cf10ad519c881fc5492cf799e37b9ea66ec295181c8061eee7993676de8ed2e052ef966ae52826bfc829f616c2403ec9fee6edf2403fd7544f6116428f9b8f6715c76c4ffadd346dcbc6058eee70c8e8b010a62eef6e4c66c1cbdb44c2d08a800cfad168a55da08ff6978b118a89d939ee2392da2fe212126deb67982acbb304da6612c3732af17e18518ccfd6683850fa0635ad2ee517c5af624e5c9bc6fc793e8401a6f89ae80a11a22333a3569724617d4ebeceb8f4393af9c0712990b2b1c4b3414e681585d4a97de1d01ec3d4764d6162b7448601f93d676cccccf8e8c4a305beae3251cd69a1b2016a808823aabb22717d94e9e293ae3d724dfc09c8c984dfc57e8d01a38575bb3b3ab595b2d0dd046a56c2a2a4414620cba3677ce306505487e43a7f8cc6e18b74b5a2b423fbc493d88bfdce33c0953015abcd833017f0cdec9e2f416fba8c7d722079ffdfd6fe764861a30344c07a65f428c8f254e97df84e570b6872a093dc1e94d842f28252261893aed7e0e6015ebd482fe675960eece62477bc501fb9897803902b4fdab0d0edd5199a11a0d9868304a9ddbb24bbe7312ce2bd5bdb49c96e76fe582b88777f7b8cb2901260d132b2975e3a422c9136d4dc340d3d2cc7c31d651994a94a78d89308a7be031c0425398ebdc670864652648719e286e69dad6b116b99e797ba9e2a69462b7e9247ab7d73210f8d20abb8b0bb7ff76e9508b01d7dde80fa604d0526b389d41fa11c96269b14e1a4ee2f70b6aa60d92a694dfcdfff3f311ef3e249a85bdeb6d2c96bcf4d4b3b92bb1cef4cb75d9a966fc40588e62498392c043ba595f9c818d76f002269a08dfb05f26fd65d45b0e113658e4c8e401cd733768904a20f156e4ce155dad566a6f126647397107e0676a3f82623ca4c059b9c97458b7f96c005bf6e6ccc8df3134f387edcb0da17fc7a7c753a9e2ca008aab80e2529a284f03a1a34921694a37058e8cefa134c9a16a507e98d6f81a1f7e38b7c645dcd9ebeb89715a8ce8cebf4346f1ffc0d2842c4196572a80ed834977a716d33c2911f0b04b2f5b00af1b04d59120d00abb504f1337ea133ac6c79f00ae482985a109c4e0ef9f25169923994360790c0e741147363201455d8c1eb2c7d9b3057ff69294c2e8c83c2ce3d18ad0e8ce6746cb15ac0654528cad71f0c00d7bc372a4a9ff78e870ec6195ff8f18d2cd15bb649d6536cad645339c914f5cceca908854ff15aceccce29963891a8c866290f0167cd6472a558cf25f505f5ba3ae2668e0bcd10340250cb9626cb06c4c615186c3b648146155978edca2062097ef632f21c75942f80aec76edd86f105554a83916706562b0888ff6e7340aecd84f860ade4366fe91fd00cf0da19bf1829f18b5ab7c8692700ad0cdbc3b92c7a56da54252767b3c140ac766c8f8153059b91928568b63f3ce05c08be295174a974254ca9e47ca797f2a8eea73a48d5586f7e72122e03a8a13980d2bbb7a41f63d6e5287ea87cd70ddf01932afa95efaf4aee7d558ce4f54ddf7fc87bf3825d45a91bd47b174e5172568389071c523ffc13b770c52cbffb2e48be89ec4850881c299daa2e7545ae76055af8a7e7b3398ee6327c88d9109e7c5fc38c36f1731ea663b474f42eb9124802047c2ab10c52ff2dd36dad88f13c463c788acd35b705fadc78de635124df173cf7dad7e351714fbdca6a73d97701895581fdb496524c11a1f643d265e5d4806b226cce8461e690f53891f42c15d75556ff3e58d6d6ba5baac7598c49a132030a9a813e55d19ab9da89274e29ebfd29bfbe2d950cde6e0a03b999dabbe45f85a81c2077b2c1219fa6e36814f040aca077c09b5fb3996d0bda0fef0ae0f3135d7cb24f8b8a666d8c5f5137c35653a051b164b6e4514dade0c4efcc141210d1b01edc9b73ed4b9c28051cd42a0fb6422d0e3a50e8769eafc5e75c5b907ad9ec58d378f3381cdc738085c3c257593a6cc81091348057c8e5c92123e389e5504bb3985ff6813cc4be1b4ad3aa61e5cc2c58f97c8adeb6b18d7c58b778ef29d72ce91a99c2fd73743ab30191a8f1e1778ae28018475426f0e2e08613064b3c150ecf18fef43d1c9c2e65e889e910f677efb631e89732899321d37ad38cbd467f6b68938aa8834eb8c856211eef5a663c1529590913216324d1dc02dc2c1b2861dcfb55838505e444928c57b4f2eaf246d23914c0e1bb695e16dc001971214d0eb92881f79cf67e0d94320d0c651e66380805393d34279fbb4ee173505e0e5f9504e02a0ebfea90e4c6ad5726175878ad5f657b744aa26141be5e3bc3a7f19305bbbfa3c092b606d2911cd626cef1be7a2199739e781023189a1393793a66c18dae174610616f58e8de85a408fa9fb8f9feaa864ba2a8ec087f1e82cfb2a49d92cfe2685b28582265cec54710d23958eef77e038b4c7ddc76b19152cc12b7d29c9212fd492dc314a8e0658882d301020128072f11df50fd4306a053817ce8c6ca80cd90a5de5a0b2e6c63be565adbd16f17a38c65030032e7554f94568c2d2704256d1427b11073153b2c2d6dbc090401d10739fc731c0144052f3ea2d96b5510380b9be883d32fe5dfec8a6c9733928aca0040ae51f608d0808fb28d9829cc0f705ebc6db8d7e9295683cb6bac12570d827257f2babd4b35bcf4ff31a8c3687e403ea25590fb88e24e5ecc99c342781fcd664dd6fd32677fead1fd886d0215e7ea46ac12af289cb305c7bf5a70ee27b71997d423398d16c25f3260fcb01c46145ee82ddc4ebea7be9c1bd2046e5d9dfcbd5406cf007c4412e205fc805cd8670f7d4e1a5ea522e896f0556be8baa65e6083529fa261cca7d2e270d4d076325345f846cb0b45d507581f1b148460323d73762d85a4766cbadc7c3207d8f8ec8be8bf2c2e9b6c8dc82671e47d417b607d28ba0dbf09a34eb0b62120b007b6ad5ae73784141594a8f353174663852b749bedf0cee7a6cf2bd53ac735b0b9bbdbf1355930a330c6a20b53819fecee48564cce83e0cd98de9d42b372deb47184927d6899fc820569a2c42a25914420afa324e3d6a9de33f2025487e524c0c403f6ca23b0b65ac6b2106581fc523172e53fbf5499363577fd45b729b9562ed8a0e3e7b217243d87f79aefe8e239a398c4cc56a668f32957b43dbe916ef5effd33942da7f447c77e6f817a8184cfb87f13927c2b55e7c9828c2753e98893beac80a6231b0345abf1d18b9f3fb516bf2b714b484fe3e178c7909dabe12782f57218ecc09beb3ed208ce9a56b6a6555d48b34bcfef6e31534019da1599632c0cb256fa352996edf83078b8d8064e5da6092b85416fe9399cce22d9023f77e1506658f811d23f65083a9a42cb6ba54ff0fbe8ca54bd4a7dfe3847fbe55ec384ff84041c557a1d8c76fcda9fdc0cf7b52511cdf7c409da24fc59aac23313c4925c93ca9ad43ece4b5186afb48a6a25f9f73b7adc895d81a7ce8f0f76e0006da11d0e0299d317ac354adab4098e67a040354970f2eddb9bb738a519a80ef6e3dfb9141d883e48d8672fe6d5d3a6c35a8593a239cc220e977704ebca168a33776579fbdefd185a81a261ce49183a147c9982075c0ad6dd67a87f6ba8a2cb3708d5a770900802a010f607ef0ee240db4f0d39a5ad343f6b592634e367ceb4c28f608799287716da5839c2c51ebcb097371fbe7a6de3ec0d10fb1f78e65423a4c14a9f6fb35865abb7d66e6f46319ca86f8b975d02f554fb881e7a19d47df6725198560ea8aa7e2409ab9fdda1f6982b9b1924db3c06ded63733a7e24327dd3173e73aab8dfdf12b55516eecd24897e043e4d1d83321147c85387720c1111fad5e4f040b46bd14430870b6a791e3e4798e14e8b1e2a700fd6c1f905bd6eb13202c2a92f852e1fba9edce7e2b057b1420535348fbd92704b805e29c6756a7f31dc8317627e67daf0a859c0a195b642b765457fd613dc6aebbae16bb64c82d45e6c391162f49f418d58b42121ea91ad0ed36752785b3d452b7b749a594b6ab9cbd9524f859a472aa3e416198ca8fdb39ac82c407a0e4d156c20e1886e807cb223e1181ab233f1b534285b980d05a8446b166ab179f59e264b56117f8232ff048599ba2869ef66445e4b9c4b248aeeb16b84709a7461b6c61a6ae35bf309786b1c6484076407696199e692175dfc1deea37f5fa5a03eef3f9d9eb0ec3dbee10874739be2d403e0257829d4c08aab52bc1bc287d296f6c27f801b92ee2281a973353e6654c15aaf62d39795b475665bfe5c9466cd8a2c1f8e00f6b8cc83ffdaa79d0bcdfc9d7f79c6b9325853c943a2f2903e485fac4ed8683bbad93e320f16d117420314dca34b248ae1f352651edda74935536d442e7a483766b6b10c8ab951a3c32a0006f19a69e8e0dd5b8a49a852acdcdc4b9d05aa75d73bbe6ad16930ea0a26b9b0af00812dea14f8728f359a331737436ba9921a295b0710085ef1637ec44782c25302e606cecbdcde04784a4784b3111008502c1cdf740b0e5eaac70764e15a069ba6aaf10ea897291ac49083d309807cd784f1b06edc5813677a2218acd7cdc6a7811b6753fcfb80f051eed19117ad096b3d856284ad3330baeda697459e6b40e813da74205f60f181d7a94ab205bb6b0ecabfb225cda7da921c456b8c06c79a473afda3460da0a89a5c335a72ebed849f512334f792af3aa245319bee4506f2e86b00dfdac09aaae9104e772e8c958504031c15d2c337800ca200c624406cc88c6ad12d7b81f3cf2b8f2b3edd2e560b2c7e652aa438ad4fc5175e4c2dc2d9b39dda86a22345cf07585dda04ce82c0e43ca4be95e85e8b7f793e697083194c4f40107605e6abb76e5aebef04ede9812e075851befb7df1c03e981edee8cf9eeb516864841e70a4ecb94053668bbbda535a471a23a6f461 Params = SHA2-512_W16_H10 Msg = PrivateKey = 040000044c6a338d4028ffac0a92019c63a2f1a2e371b4204971fa7a5ad30afe464da5f0763c2ac0890d378898489b9aaa2f81fb5d77664da20a44e49438824942862ee5f9fc9be605403805caf07c38fc0cabc5663a897435a4bdde1e1ccbcb6d52c9bbd6f2e964939842276a8d2668c136a56b5aed7cc2d93fe715bbf56ae6820a34fa000000000000015148befa363c4d64f9071c134d0a2ef31ba4b3f6ad716a53120aee865a34b6207ef0a4df6e4e608cca3a8afd34d10902c4634f082b3df0cd51e44df6c25de9538acee36c9b429bdf47e61cd5accf67a4c379bcf9fe78e611f14cead9db37c672fe3fea637b5ec409be816fd3cf8b9142f44e7116058d0a06bf6ca7aa1e5db9a82b Signature = 0000000000000151b768d3fe7f8566201e891afbcaf552228327854b5386df2cf63bb5af563aa98b8ce86ca627bc22ee8783ca340d144b278bf70b5c9c3a757dba95f482f71dceb4e716cb4efeb326e054ec4c8681c4ecbc98917d760b556f9749e21573efd883bfe0d745a2770166603484d345391782b23a31ff99d8c16ccf2f2822c50e793c6a8981398b314b99caf79b6ee83ea4f89186ac8fcd4ddb46b781b84c8b81168d9eb911744356162dfad5b330df656e3d450dcac6d91884f7c17782ae91377beed49de3a18c8a6a622144bf925bb4501a2d451080d5245862c44bcbeb8bcb381c88e7b9a1708cce578c71e9d1d36f38f235e05614aa346edf239cb342ae6e61de7e20e032d5c2685da71541bc742e7a1d41c656c11b90e9f02480b58b725412c9670c4416f068b304767c41916eb13c3d9cdc1ff1b3c5f2e844479ea3dd9e56dda9b32a89adece8ca707758c0674228642521891ffd855a23a5296ce0f0f8ca3dab681bc169d077cf67efeb5108335407fa9b83477773c3d5e5017182e1156f216ebe5ab2b32d69c6cbb76c93def98c68d82cb1ff554b6c4ead42017af25d5704f87f47e4da8ea432b4af92201b0ef4ba848321dda30f75d0b157fb6707928c14c9cbd2316cd02b6096050ed9270af9a6121631a3ca51e79235a6d7b77fdd105b68ce2289bc120e273722dfc91c59e66c4a9a71a85cc7e937199118ca477267d78649b16ce189eeff2aae10534b97f6f71a907a06f996a035f139a6ae8b8f9a6032a9f4d70af2dcad8b8138cbfb7ec6f41743ac4f6597cdb7100f5ba0dfae2afedc07b08b85462ad3e1759a1593c45ba935b66b04b16ed9de906e19f88a20020bd7561792a5bdb8feba3ebfacbeef3b6fe975de2dd5415981ea40ef4cbdccc9bc9099e730a2744e0d012e1148cee30d83705262c8c62fc2829a24547614302614514a8f5ff9aec0fd76772206c7a23683c88aa2dca3dc6ad63e2560c25f59e63ed09671dfb5244a8733a80c2c88d65c96e1e08d6c9d1da11d2a20df98a217d23a99487a71666ffa6aace87929fea487a7d403fc9b72c5ec276d23b8db4e6f933b1ef2a9dcec6c512ce27b7248e261dab4dd2b6c7f11555f77dfa1416dc0942e1b9c327e3c641e96f0e5899334bb6d2617f502d5ad3f518156281d85858f3433d27c747e9d781895cbcdd0e7dcf01c3bf0bb7ce270f4361b0727a26d529dd1694676720d0ef24650b392ddf68ba17d1cf247d827d9743eede39f5ea7a6bd90d7593e4acd4e48925e0e0bbcc1df9adb810cf2650bb21ce1d6d10d6b1d3e259effda3bf05bbb2e6be4dee78d77573cbc9674336b3e59701a851c1dbf314152561a679d9881df9d116d64a15e3740a7a68ff27ed41df868d18014979d6046e86cc96f60573f7cc07c38deba1c4c53cfc89481aee5adec7656afe6498f1693b244ba0b031493b3f16c45b2fd90abc5fe6d2ae3d4cc312ba56af718293a40598cb463ebcae9b06479f2fc868899ff80d97e4c30e8c9a806349c5477ab26cf61fc791c3a418a50f2ae6387b28e4d45b4aca32ab206af6b2426558799cc383c2ff2dc24b04c37dac4588e09a98af0a4e8a9a4fb79650e57612158a506d56f5ca37023e394b14ef45b8f1c985f0e1fd4186e1c7f4b5b12cd6a3caf85860f362c2d0d275e9e2dbb9836893e465fcd17d7c72778c5e5de114cfe13deba3109034a3a4d7ea3b6f6781ce32b724a13c2b4b84d267b51008b59169b15d0be63e360122a983f40fc9ecf9dda1f2fd63f2c3f6758bb22a13e42ba0757e31aa9f57e4fcae4698b3cf7764714ef71cae28a022d83821192c9d95d6b40ae0d830f8978ecd9e15e5777afa2ea221855b612c5861555d91f0931b50579d7244c6ea7fa90c9c156e98adca51d14708650a2e605b781bfe9ff2f41852f94c5b3440292e35feea9eef38154e412389cb8dbdf94daf29d7f4a6fe4846e197a10eaaf4e5ea1dc29c0425b7fe23fa70b64945748f3d9893480b3b3b7ae66ea480d17079c77d7f19a770bb765c4c0604ff88fae1bbe5be7bcd30dc7fe1b850e97972de1972ba27059f26b26d0d019a080a3b7b4aafff16f1ff00618e00c92fdf6a0e581e994b76f11be720fdf069c5f67c8b003db3fd3f7bcd9e5ddb01c3af0c3e4de107a1263a0ca0cc0bd4dcb89c3cbd6c384cb9ee0a9bee1468297371a9343cb786dab8903aa40920478c2ca86c123cfa83ac59a3a9a683cbca08f7ed3847ebf93bde8fff6e69050ea044986a86321b928c811d12770bf03e7101a09b413002730c2df1d19bdc942cb0572c3155480349eb0dd373f2546bae4b24e73dfefb8234cb9a7d06cc2de0b60dea684abc4d7f8a10795eda3a4bfbf0fd5d3119dda8459df3f49d494f4c74ecd05b7bbcafd86bd35c1e5620341e845973698e9053b95002a8f4e41b326b9ce2127b9991f68ec91bea5d5a2aa0f82e631225dd07c9e3a76ece4d1704dc08d976e973a9d22c7cf710c31ab3fe962b58a55ad368ef257b1288861a5b15abb7d2590191cf99e5f3f8b95e0198a37ecbb25de7f6e38964346315b6a5850473df034e26b51034c7f8f2ad4749d97eb17780d19c1927818c611c052637b7fb04d54593ce4fc9dc5fe94e231bb4b93498ec813b02d1e7c7d6a026e93ec3ed44da80e698845070c3d3c86395b6e669604a2097712fb707c889023ee3adb99eccac74102b28620a1caaf193e1435333c30efcc313b818116597ce9b2b0156317b712983b90c042bf873a8dfee54cc156d8e6aa0acb351515c8142135f0fa7d6a81508a29f3f3b71a0db8cf6dee857d3954bc730e0b79800751160dcce0626f6f5e9a155d5720953e7ff70fe43f9194822fc3f54bfe870689bacae8074a6655babed78faeed94b033e2e44e85e7a071153fabe923955b308f9afebd15990f6b75e230e9e350765e8d95c0bfae33f91f37d32e8d6bf6374dcd311b6752859367c13a2dee77a6dc368433088eeac9deb633d48cbd14b54a7e6be5adf42bcac70f274973194c947de0a933c846000e2e82d305a4761d56373574ce71c57cba096ee424f70894e43d75854fb60dcdcfa0b12cc78b795f9d6666a8e416bdf7de9c7d3097114ee730e48916fe3d3bedf607b02d85898ecc7ac706521c2b0eec3621969fe2c5edf9470381e9ae41dfb14d60369be218540e681125d061d63c8e957fb36e5809d30454f7fdc1fba369a771c8a8cd2d3720c4acef1b11dbc715428f15dc8a2b3a4a8aaa58d67a98f940adad4b8039d593e8f21e99fc2c51ab74e8ecdacac4a618e921ec882c5a978101c78cf28e23550bbed417cba949e80cff013b814039da3dab7ff4bf5e25e2769ebabcec868e745879cbb69da2b09890726ee447e0bf1cb980c07035c8038cfdd3b5c59c3967af0dd546b4be5804a0b34c3f77a0adb47e63bbfa38d7acb97be797b3dd86f7def84c0dcffce4244275b8d638591c51d253f6f9d6896ce28957fb625f6836e8be38b76a2a638e28fe87c9ce317e3124bfe308740d1f21f4d0841efe1edb139448cc992fc17969ef1596cf51f65002a4bf0b8e09224d1f3a8025fc5a5c1429798e58f4f73fe689159b3f123eeead28a2003728c0a0a7caf179848ed6d9fe6b45b952b1da0150fd761fefb335cb0ffef8fce89808fe7cf5efeef0d99cd826d8155bbf1d5ada02e04aace23aec5f11a3785e3a3d5a4346e96cbecc303f83bd7c919ac7972d8e5ee36adec13b437fa179ccbadd3d35a378c3b031d28ab31be2883967541fe7cb18008418ae323b1cdfcaadeb02edbac831619d40a3b453d3f82fb8dd5d15da65f08560f853e523f4a91465c30e18c7ebb0ac299f10fb925421604a6a80597ed2690356017a808010fbd19d8ebb112403468949d63e9e42ffa057561f630e57cb7d87c755bb6f4d09ded6f3714f48eb29f1e0bc242fc71f81910958c2374ea1fc9574764fd1876a9f98361ba3830039e39f68ea9d2b8d6d68396132922e59e3d5e48f4312bbb839a35dc9942252f5361eb25225e4821d26a5e2729a230ef0c4405e76086cf0df4c0d9b9cfeb72443165ce3ffbfac1ef1120fe50c6bb693b95470bc635c6e7abaaf834f0847b4fb8de41fab028250dd13c3c55ca709140d52d067e88d61ec576f99ca5e0ff7a69285ea15ea2598bf5c6c98c74b43b3cc649d769c94fc2973756000b8595a86961745e6e525caeed177701e3ec653657fb4ada370ef51faa838de33b9335522c094a33bb82826d04569a645af72b53583ae6250d100f1729392f2d5c8f02376118a0282c4436d1d675b9aa16f3fe4032cd3981d4f467918f12c3c21002eb84253fb69eafed52dfd9f67f2baa8e52e4ea7108d66b26e0978dfd2664aea69c75d42d163f439e666cd7d1d582769a561c9b63af76df06719b5753c8f138254636769e5b511f8864af99a89cfe6bcf0872fd53f876f972ca32c7a223a5cf23ecbbe07d022b330e72a0b2d1eac618c8a396db5a057efbca48733f54538b0f6c22496070d1b914649be883ec23101ebf3c0dfdbea13c03d28e38450d3abebae2f215f6ddf3ad0373eadcbc8da54ab0be8b082b127b51cf73214899e390c085f60aa2fc68db1b1380199740f4e9999fb24e4ddb645a6894c63980f3b232624e21e42226e8cc97f51811bd0d46d817c96a96b03dfc42b271555dc01acbfc9e500fddfcbb970c40a97a2c3aa8bcba6721a7b9256eed83b3669bd8f882809bcb3e1173de48db97ae52e9af27ba19b34f84f75b0996dfb5761425fc5ec6b96f2ca4655a7d43dd5b2dcf4303ef2dbd4602f31d973d15a97c0466fa17f67c39da25fc2836a3b0de749dcbdcf96d691e650ec49848c5723c6c362419d488a7630d111a9eb41d4f2538c4092c9e8e8f11b719e4fba7d655cf80acfa537471029d02792f0f9749c2b2799afaef8267fe48ed8c5af2d5495a666badcbc3822d60baa4d7d7c51ba293eefbcde42cdea670197009bc8886da5ec19d405a910f5fbfe241555ae2b811aac6ee03bfa413bfda240f8615647dc1bf9759ace8c8c62f5946133be71b0292b6ca0af60e6498d63061675d8b09a3cdff770485037cce60a4fcd93afec6b61e49ad2668ca5c3202035372674b20aa773c11842cfa18c982b450a9adf9f471377a38c63aeb35c2af1710df4be7c69fb023c103de8f30c4daafd0c85c65627e67c96d8b624e8cefc69607230f3ec2476aa3ddb0ee432d0768c713d82581ce5d7d4073305e73ddd503107e89d230f15423fb3d0f92c7bc5fdd53bc19ab681e4e7cc1ca421b8235f5170a9f7d9f7a669b1ae60e7c428eb69334f061100aabbc87615b12f149844144c0aa8c2428c7ba373b15a68273202c9384ae3e01c6c78b160009e54eabd7fe658aaa676354f3771ca69acfe2d2be746632868f7f66a5bac27e0fda9b76e6fc34ecd180e579563f809e3fcb84cbcc5a21eefbb33f7fd46b4873433b22efdefc4ef8b861c5090225d836b93931ee8118e8a7d08178d697c05d2ccfddb8fca05d81fac5f9e20bcb7b2fee6d50d818475d02178b1181944a5d6e6b78735d1ba3c0efa894f817a466b2e004d8687624905e65f9a90e34eeac63d9492a87b9f043b8f1974d7a25606f4d26bafa4d8c7d4106d88a77ed4f88ebd32cd2c60bea229a5f615db12c20725ee7e0dcac27559b6c8f74d4c66fbd29ddda1bf76d3fc6eb8ecb9916e3113e52d6e0366ac9b0c2729aa67ba607dec0ea5a4da91f16656b1d6a705932bd072b257ae39a43c93b48d722c091d91adbbb0e68521b9d4e1a45061176d592a86605035e3c27ece89dbd57203fd3877acb41c58be4969cbbb8e1ed4d17408f138f81ffe85d24390f5cc40d562a0b93bad1b3d38ef1d4b20f9a75a9488d370db9cbbb77e5e85d8a57f965cc03c1e794f73815da18a9c73cc313a0b071aa20677742047aa8f1a34aeffc315a958f3c0501cea4f34cfb8e9768a90ad0d0960e6168eb5787e073b682c8058de75b2c62ebd099471cd21d553e8e1f25fe989a523916a0d02bcdea4db2e202d381a1d9b4e87537d5de8bbe5d29949447d334c70a2024f638724b3245853b64e8e0abde5a4a2374a736ad57695deb7fab4d295d84d18d7689ae1fa2e6ff2fb942301789f1bc898c45ff430fb45dfffb773e1ea7457b6c7fe41668319448fa907c9228f724cb4b91a971dd6e2cae04a2c82341136320a11ea47b605e08ac063ad171bd2b6c115ca3d9da6f9597846398d73c1ba408eb8df9e5f657ac549d2459d3bf480bcdc9fdf6441f3df6398c80d914e41c80d4a06dde9208e5fbbad4c27a8abf1eacacb6c7deaeeb868c40e33a40e51413d3523fd13d60f0c63c4b77a6ad11d26c761b24d7197deb814ad39b908b172f57f70cea70326c3ccca9428535f6bafe629d5467afdfd29ad710f8374e2da76596e6223b289f53be384c6806126bdaf42578dcac72815362f8d896e54240d49186dbc98362bc4bbbbf719f4a8bf668e18184aa90173253ed9c876a15f5474d79115769178268fe7154118bdd38b82e980431c9ed6065566f2067b637ff91c4174c7b3cbd4fa0c26c721f0fbcf906e3a43f38bbe5538af4ee0018e25f6ceb7aa3f39771e67ec0ca51d5bb0cdd736cc2619bbc126bb644db40172cdb9e0ec0b52eabb7b794a7908a0e7bed23e76ae1bcf6e986dda8d7365193d74d34a07f7293a92aca8dcfd5d745bad5b04aa2989f85ea2da3596218f006dcbadc01ced007546b1825ad96018494e98444ededbb00b5d3633251452135a490e5e943d5953c0b27e3982f3d9d0b58037ed95aba76953bf169dc59583e1a17a383578d45f9e4c2a238694055c3a45001946618251b0dfc47c8396dcf2acf1db03ed1c16c0054d30b2fb269277a2c26dec94652b065ae7a3a275a3cd81e554483e3cb564160058df7c5859067062020c65e2b82422e44b6bf28dde736245e32706c3100cfd3ff40691f7ea68fbde1779004c7179ad8c763bd067c30983ba0701107f706016a002cc8b2f76467e34f028559717aac06f44f86c0895d04639ac42f651b9cf18367e2f7ed1a62dcdf68bd2bacacf9d5165c27a15b6cfd1a574da9a3cfc43550e6c8e1f8edee9e9a54234285a8e2e2fb90e4b16133e24ba015d78eededb848e07e924501b0bcb6394c41f0f034ba62274703e294d6e3e1430f71301c9af00caea322133a9d0a124ea77028e25aeae7efd39b5d096188218fc49d8913a7fb3303b57160281084cfa0550dc28d6e98a3879d8ef5e5f81b9ba5a807908fa315eba2825544421197436a507d6f651f69f6c13b09887f9cb35e2496ea0de2a392f319a78aef51763ed1fb6b4befe33489037146762440fc523f462485519dd48d153e97271f5c562b1e3c540910397c39d3ab833a25c144b39c34188b59fdd590d2baefebc23363814a67d253be6c75bf2371dfb0b2d0d96354b24e857115decbc41adf7a53a44e18684c3d2bbcf7e4d2013630173780f046e087c141f8cd90a30cc1a58bb66d71c1699c12bb44c7523e74bd5b743c0508ad663463636054ce257de589135b32944de857cd1b5146f3e2e13ffbb9fc186bda2bb3562870e89d5a3936a4f5190b920c87c2c48bb210dcb72979658d6e4fc3bbcc2a871bfe32d20a87d76a8017375e8bcdaff309e66000d58d3a7081bd94d121b294816782a18fa6048ee51f497d41cde32daa42654508ca0d5fc67930983347d9e6c4e9bdcf4a029740199a80e859ec9fdb7b634deeb6e48b9819d0f5870c89905f4ef3009575d964bdaa588aed4db46424bbe288a145e3c87085a2da3028b044c468a9928e9e7429c4ef39fa4d773d8571af0d0ce64de12ee802a5664c359488ca16f495663a5c74344dd41d7005356200b992dba4546738cf77154e6e66ad29dd9926a142734772218318de087d9330ee0c5c8d56cb830d722be18f5941fa684331602750cc71165c746106709b0c8d1189b7b9bf11fab404ef0a18f255b0bce9522f4cc53c44bdaf0de8f6c20f908cfee22464f7bb49068c9345ffbcfb7fe238e8e65a167d2b60b24736fe4c568c5d73c221ca88d942c967b40ebca6b172f73b86bfd360d7e766a23f87c7e27670dd7b9c0c5e6896cfbacc84afeba25e4a08034b34b3544d2fa7fc12cf51f39bd7efb8ebfeb55124b20cd6c915a2be889fb0c341e72c97dc9db3b7600ea9c39a430ea636c81fe83e5bb0404fd846c03b26577b31ace88b794ca939f228d4371833fcdb0e5654e1829259e8089642458672289d4e7022628e0b040af3f357a98880b52183eb078efc1d5e99ded90e5f010fdadd1cd125670ac68c9412cafaf84f652fe660180049929aaea7d8a5783c915e6ff1177f16dc1b18198a13b74cda6bf5e2b59239a7ba72f25362f594230b2f78000dd10c513fa193d6634c266ba08fd0a8472985e1c2f1bd4e284673703e5ccf4db09a36eb8c68b233b8b03d65ba158e70fbdf0258b335d21df1309558f6b06431027ceb5249a727fe77661701d16660342cd626980ef7f2854a71c5ad6e07a68ce6bea0fff62e95c9990c3b2ae97457c9c8d4fac6cbc98c3f942d1f24c1d04dcd23777d0939d10fea57f465311bbe30b38dbfd3aa2f1f3204636c799020288b27085ed5b532e32b9aba68a10c9e44685a4f51f90d9f0a9c8c479fbafcf5e97dc60b2f0c70532c894efeea6567a3071c38f04f53a29999d55e579dc678c406c68dd8b255cb4bc0c3d502fdab8e52b997f1d8d8e9e85b7cc09e5b9ba117ee1a77e4937485d746cb035cbc0c3df13a3239f46deea6b08072c0dee26318a29ee31e72e099250ee80d7c19b05f75bbcc436a7b2547a7fe77c7b57d37982edf01e3b66437739b51fb14864d822b43a3b15774dc9b6b065dcbc698173964a7e2d484a2e22b3393117dfcef6417ad31b06b559ba6d045774e2ff4d1f81d77d08187bbe93244794f039e825cddff0ec0a4ed5e5c9a63620e8d0145435db53ae54a596b97a3e6d5f2c1199c6e8cbc843cbdee13269bb136d6f93ee06b1d68890a3fd86362b6d08fb2f068cd7f130e59c302f7063d72608fdd2cad0dc4fd4e677a3cb293769d3d0f8716b315e69dc9f4c8cb60009e247b135534b2c1bd8177b8ad132ac1433ceb1f2eb92bb8ba93b45948b50830f8742cafa3e90d3172dc58c1f0444fa0950c153d7083dd0a8901bb4ce131cdec6e3f73539dd0833fb430d1207aeb2d22ae8417bdd780cccbe4d8b6deab4e051786ad114ee2dd8bcf0252833f28df33896ad31f4aeb17d026d3d583eb1f6cdf6f241b40be69776453571969c7c1801ba129f2a740c3ad518bb8092122f97a1ab18ed9740b8acb879eaaf869c7ad8add946ca2b4a427131a7b18059fd52b32998b9651f95ba7a962b5b5c33e885a86f87584487d1584adb33827547260964f4a816f2e2d0940d6cd7a1f5941f3f5b1a7ddd2ce8211a1c80fe5be78e288f1ea263c72297c9590d8ca1dafbbbd1968ebb8663b54b6d31a142d87af5aaea94c368624a68db8e09a804d21a2fae7fedbd79386977884600729200ca79cfa3b1f32fd9ee1f2adf1405039902f71e9ce537cdf80d61a53d4529f320d634349aa45ffcf9b0708bed1ef5458247c378413d17e08078ef114ac2f0411b7c3ce6e061a97b9c98336f374f0e0dbd84668fd52f9df5f86ab7446b08445b3fcfa2ba98b89e7c1f20e857db02e1bdc109c80355596839f366ec22e9dc553d925aa3e1d3495b3278558b1c319b4fc64ac03bc7bcdf9e3aa05c2aabe04db2609598b1b1c7fa91889d278b18eb19db05f2a77dbeff5f3aec80a641b69fe3abea4921d8a6d2f723a97f7950a84958c5976dea6864e673086ec6ba16603006263eebfbd51b47b4815bce651943f5ae8fdffe0a2dc7105c38b005ed2880aadb507de9e2a46394f1397765cf758ea85178522b7167b3a45c39e9354ea7586d3a36eac12aa8a49850b2ac66af649326cb5e42a26626ffc3744c59b12ecebc9cc076d39463714595cc2e27ff9a7049cf8e2cb76996d04e05f57cf8e7803b38e97d24c8092bdabb57f46b429fc71308af2e1b73f8053fcee621088c97faa2c373fc7c4bbc46da3e444789b8dfd9fa99bf87a629c22df163768721d20cdaf18109cc5c82e1a29bf77b7e270b483e631f9aa86fbb480dc59b21c1042ffbe19a45c1949e6b4b3adee303edd8599e04e791c67dc037c5aa3e9fa814002dfa2fe4c2fb129d1787bff913ebc0196a888f5a40ac71d0707095dcd0aae2c4cd435d74abca5600c80ac5b350da5ffe26ad84634aa3c7941506eb81aca8d25a26bb00d69f73295c87f67271df4649dc4bc3d543e99fc72b1afdec923d33da57e4f84c214b884182edf9157b34583892ac487f8aeb3c4b11e608cbc96aa9ae48259d361151fc2b07d19d9a8568044f498afe4fc871c287f4b7b3e24026d894859c534f07b448597900f726f464c9015aae836dd5e073c9fdb7090a446db172e3aba162508e52586a98a1ea571e8a7d6fa28cff1217a732f7cd4ae2a475ec565e0916f1cf0dbce91e8c1a2d41f445978c3fdf9f53502e2bc175f661e9255a878f1d968fee4e4194befc10682a1769d303a4f6deb7836da47931329612c42ff88f80b2be2e6617417f61aa06ace50404273a5645cd7b18406fccfa1243eb866eb6c9ae7a799b060f6c0fb606b35462e77f0a14ce2ff4a387070894f9aa61171f8025ba5853c492a6cfcb6fc1572601b8c055e490545cdc018b109d526a79d8771d3afbea4a52e68293ad16769bfb93a48ba1a64b978855eeae46bf8d9c6c3ab027c334322a6942a1a94b2b812d5d4d9bf9cf9d67d75028ebbba6ef06a74dcb1244b5e7a250d75f8d4d8ac323b08f57dc3191548db362cdb7892a0fd4c5fd47ae4112c700fc9593224b6b2d97b2ebc851d687d8ff49ca16267ba8726a098176412d63c391883709c231f26c0e021d8bba281ed5f83b6462da925ef57479ede0ee297d3508aefe2f2a6b4bc38bb25915f6946ea5493f689d352eab76b19ce05f1c2dcf343160268f5be3539b6ce6f3a1b8ff5d7d57378f5685a357ea58c9f70f50b662131b15d12a365bb07ca27a767be85a8526bb9e6b874317e42e88584c1f2d47b64ed693a6ace208fedfd06f0f9bc6595a155f8739a1b4b1f9c53461e29a60c0eb0e04aa1e91c36f65df52ddd0391751ecc4827426c14023aa0887255f85427a64c57f694f60b77c0f7af61dc448f25c280b13e936c48e7746d15d28b669afb4ef053969a6f162f61c3ab3bca69d8e79aec711512ca1b6af811755e102945bd76d3969153a6bd9c632e82d628473641473dd2f1b709df709ddc460dcee916f301554f50c351d7c6fdbfb9b2b3c20a66d3e4b4cae777b406edbdeab3d88dfaddc48536a16335ac415dafabc43acb44f3cf558f7b9a8940ac9590f649041ef498c02fd84bd7d8c3730429baebf3b19e72cee25f4a453d00b773f411ea244f8eca32e66dd81adad8370c4fb4b1ea912a24cc2de78f851cb989d4436427f421e3b7859cbc79cb3eac59726b734c288a04045bff3a87c43f9ee57388428496e134661f3ff1795b73c65a76a455e86d5a430b52899639d9ae65096d0d491b93e47fbcd493455655f19ce92c17f48bc7209d35fabad931aeb9e842935d4f9d0b00ab420830a24b79f7aed70fa517bfb71e1a311396857b060f455ec79fe10507680d0fb0ed73734cdb6ecaacfd3089d04f860a0d2eff4bf2d7cba7eecbab13bab03a067808473c658c41f3a54eb59e547e8eed24ec6f9c2535f6fbc11e02bc14e8a4b0ed887f014cb186ff25c74f7208cf90140d94aaba19bfce203cd58412995572b8ab630d3795b25452effdb11717cbe9a66eba3f4b4f7c5a20d2ee87c2922cd3a58ffbaec5a0be2ece32b6c514da3f25e861e5bcebdfad31d5f68ad0374e3c7615a44897a277201d3c1602d9409da81c34be710034a5cf36967e0119b368b78ad0c768c82baec16940eda90083d69b3e9085d2d98eb95709f808d885e201f751eecee6d62373495af92d520d564146f271cd3259314659d289bd6c3dcccae19d08f19192b1f1cf9f1523f67886a061f08ed8ae3cd40dbaac2ee0b21bc795a70be0bc3f8b706e5e694f3275792f5c87592fbb8bd3a4fe74ab741d0148d223cdd5f73d86997fa9c80e23676a9bb4a6eb813d444f4d2a6126fdda015db860acf03b724b0e88b3575d62dfa1a6993abfa0fa3f761b7637ebce1a1edddc2b24e776bc8589ac024f640c6d5881683830b37c59b4b7e71c4d4a02f9369410c8157cd7946b237f5a4831999837d8580464aecacabdbc30764f056490bb5b7ac3fecb589dd66e3d23a58c30376cd9cbf9d30c025ec4cc898c0c63ef622cdbfa00539375d944f6cd3e557fca2dcac0d7a501438ee347ae41d5d2ee20505b728e84bf8eb042546c4a3f834db631903e52dfdabe4d80945b8686f2ffd3e995587e0ab78d4523877ee17deccbfa5739b00bb21024cf007aef610eadea09b6625d208d682b3240214b88bdc74522b047387f95b393a699d16281312b13a5d33d382d26e31fa698c0c0c5bb9394496d29a28932a4af2aa05768f1053540870cec1a2f67589221d899089ae8fe84a8964cfb3d4b31fb6d4a4a12914d78f27e810d0edfd96603ec7da581194432bfbbd68a3a8ecc13b97ebb6c026e065cf73f2204aaf96563b526d2919154e6d127689e738a8f4b2682e82deea6fbea2dbd94bfa904959cecfd0d63c591e8306cd67a34366e6f6af2550eedbdb21365320d7978e0554d2822498b07ec95e6836a4726cfbf36924f1a166550bb88d4e1b9d4e69c0f179cfb7db53ffc0befc613adf15ba016b19630fbff2a171dca7b4957b244289afbd # Params = SHA2-512_W16_H10 # Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 # PrivateKey = 040000044dd18664495e800065f24eb4de5c87d19990112886f580eb9ebaab438b880ca702f1de60accd27568c5d915784c8f54461c342bb1615eb1566f6fb19f976eb20183e77c32d9d88aef58b989144a09ef5d1e6d37927865642073b98fb89536eae452b0640e1d0d9149c8b485362281a06ef1c8d0cbfbcc79e0a639472723c40f600000000000000e1d13d4dda1e62bff4d0257ec71945303e4a7c4873cf6498340fbacecf49943fedfbea8d9d270926029cd363a83d46c8f8319363bf78ceb720952e8b173c79eb338342e1b3e757436dfb0db1c42feba0cb03bac504153d4d60edab3782c0b1c288d56dad35ea518867e383af74167cf2e8fa31a6bb653264fda1df6e6ed8563b13 # Signature = 00000000000000e11e3621289519006ad950f59712da0b50814d01d8c5c71204ab07f292595226b8cfba6d9f6f368fc2ee0835659941b0404fc8042b29e75f6ca61c7875eb3528cc3686229bedc1ab3d359781d344425944769b1c91e112873d6a4ee96d4eb7a44adfd69597bb7c7ebee7cab5771695218e80a9446824e48eaa818c75cfff8b670feaf2ef303103f41d2a062e5cbba622c4c74087dfa5b413419a5427b22e5892b9cb36627a0ebc0f74eda32e28f5632f6b796c5872aba88f78a3ea5439e0d23bef359306ec92ef3e0d2235817848c99533909fd23d06d7cab56e12578d88d93c2cf592a63e6132f03e5fb333deb370479e504982105b8b46ac26632d3ba5d8bcaaef0842c3c49c0e51f3f6b4d0039dcbe66d218d146475fc8fd2d2072be8ae28403bef6d2319c73a9c5180114cd23c21869678c87201a8410051aa975d9de3920895ff373a08b4bf967f24a5c356f32fcdb5b3d5d04e871d4ba77ded906918433f894af09a88b53ed13e0e5283dd8d8cbd6dfd98d8308ac382e29ac13a0ac3ebd5ce0aae9b92dd060baaeaf8592f67cfca6a8ffd9b88bebd622b605638dbbeae1afafe127aa70744fd4b82d83d78ac5e488655bb1fdf70963a3f23ff5e5ad0667f838b447b3f0de6855a182892f5bb012a3c8c3fc90b524c17eb06b73dc6ad79d2ed5946f93d759a4a2810cf6fbaadf74f83fec55ac690b51bb8f58c9e1f038b900ca561e79cf9e2c23fc174f4a50191cf739c43fcfe99f32e2310ce4fcdb5761ccee2bfad16f9a2b22f24580d1fe48a1a4dee1b425fce3bb36ba497936e2aa4f1fbb9b5743b138349292860404e43e17491366353a18d6d3da29e638713969ca93d8c4ac1d81887cc4dd6ec49ce802cc4ab61ce427a923ca99fbc24b542acb6ee7b7cb33f233f04ba537fa93f8171393d367377a8b826764ec17dab337e8d8dd22eb5f5c1ef723b99cada4fd019cfb541c2c9f188d4689d5b853dfc37548638f63d5355cb56bddebb3b90a60091c6aa62d964abcf9d65fa08a863c2c4766d173f207c738c234f520909df228d86747af74d8fb8ad17b97737bf989e928c684ecca388e840ee83a6ca0a726c5ef92e66d35c2772c7eb8662fb12224db27d491a1752d9ed05267c3760988b82f4cde5b711f41174a39114488f1f106f0fdeb382105cfc84661e32a950332af2741372799282ba773de7e48dfb71fdbd6bcf01582f348e8fb90ca3894605b272412588f20626ba737fff857881592890731c0fa427a3c53e836bd6f0dc6376860dc9c793107053afbedc83847625ac6b5d1c8ea9da1f55e51f121b76b6bdacb9cdae2a8f2947e53ae7df392c4d72cd1965956177406ba797ee5d7c86cdde3ad6a0f1d23d376de2acd1f5704e40836ddf7ae8e44d0aca3b128adb2b79139bef6900afb0ed4f1c0b6926da56d40dd3c81147584e0d3e35e9ccb8077a86f251021ea66456b4c7e8ea66a586a4de4b3dbd331c7c318dc9c90893193fa65a311ee05bf8b6c40e51dd668ac59a7444b0e35475ddd25d92a5cc5cc31fba8b3ba7e351cf5793ab0260a967c525f06fc4be8c869c7078e2886d94ac7a647a8d63ca3e68e71737778f06c9b63046c4ef36dd0cb57d67e3c6099af449cd0f90018b3089aa73c6c3596fb02bafd97ca4c0454ca9e36ee0f02a858a97c46d1219615b5671546f50107974a279df559931e248da1163fe7c720f9544b3fc83a1bb579eb6f4fe200a714df473aed2920bb2b815b648816ca14afc92b0fccdcefb068d56ac74673fedcb8310417be52502717e455a81dee2bf4422d11277019f51c002dd24c6a2cc815edb06f32090c065a349f5cf17fb7048bae7430888ee2ef1e14ed6156ea42bf4bbf67b69f5df1a347f745928d1384dd923dc2a02c6b6f6b769db5135ee397b62b503999234787b8dff6f81251968f8f1e9b2b4d1223183a9a58aead3f3a32175defdb54346cddff58274d9bf4e6b8b29f85d527f312fae0fd8ab75e0f0d5fa02cf3ec10b0e102dced77a55965428405c1048221f520efa29aebe18604b730a18d7fb440f15d571a80e683b965db5cc47ef96941c7d10ea94521160cd160e18eb6289d5c59da4f27c30aa379b9b2f21b722a9d25314e9ed3477122fa6ed2b5c510f9a7ffa1d875957ccf7f7beef0f0e565ae773b6afff4c61501dcbe9e1482f330593c1916088b61178959c045f16c757601e33ec4dd4ae8b026216f5ce5098f3447af82a61cc65c4a1db1bf63187c681941797c1b17e9e20429811c3e0e8ff02aa68d4f002ac25017bce24d765d330bedfec3adb1ff0763b239260c4efeff33d839b7357cd682362c83802b8ca11c769cded6277e40979f137e1e30c53e0cf0012c7ae556a327d63c64aaf20ffcb9e919e8a516c671cca02fd0223d2482f98ce275f2274f132f7e6e7ad3fc012de20cab3ebe4594e0134ffaaa1de3661e1f1fa49e75fc54614798960e587690184f0feeb5f1434b30858e64b4f50af28dd7f6e7ce65fa4979bd1d1f9ed8ddbff99ef0ac3b62c6ed76b54a886067559c24a92b28eb5aa61f5bf65f38b08bafd9e457d88dfbaa56648c430917b5e7c6522bd471b14587f680466a37cdb8eceba616533ce259b77e167e2a3ee891b8890661cc976ef720016dc872b799b17ea22ac483b7fc6cc896e9a6844a258144cf936c47153e03569e0e2b1ec52340f36a14326b6b07a9479c4739124e257080a26ba42c522af561dc4b54092e68951ffe81cdf9eb286b38e27f347579c5400898d22ae987b5a3a6e2b0fd6e0b407d63613ea87be010efcfd43e83a4211da735d530ce6156e270a8735ecc0cf9f5cedc99453720cc5c7802369b73455276c1850f1ea7d2bd795b6cb61a00a04f6d713575c7fc000627deb07d5e1ae70228222fd65fdd2995c994b579709cfa51f1b04c06aaac3fe3dc06cb1d9a31e9992005bf7079c4d2dfd69504addf3e76c833de8fac7b8123a0f3d89e7064abcca1fbba4ab30768525d66aea8e72d2a686234654c9ae2198f1962d9c2cb7c1343b4355575a055f81a9a0f613e1946f3b44dd12bc40dfed86b73c81c8a3bfc2e310c75e53af5e0438b85ff10d5461882ccc90b475d46cdf5b79eb5685732e3d75cab867327d1003aee4d1325575319129f649a7442351e012e22d47a30bb7b247ac36718851d3d002f4344254eda0b5f500d26f41030febb5b8cce640a22950a876cdec7702a0fcf3adfb513b27b4d795e1d105068704f5044cc00c17ed6f7e10b96a4f0c85d0ed3c9b7c2d9c12c9c8634a1e22863f84ffaf5f974fba95bfc8f8eaaae20e929c7193ec0fa6f217219b84d6b4b57f239e8954947e60c496af4ba34f8636e41855c1380479da3e8a04c2b28a7eb8039388933d9c4afb20ee8208a827a3cfb72dc831cc230516be52be351ca541c36b651870b603349f7bd7c69e5ec8c1baeb661b958400a2dcf1f0530855013c5b0d313a1447030fc702e1e24cca65d748e88c32da0c6944c21ea98fbad3742fefc8513d97d3534776c164b5f459a6bdf74f9bae59be6bdeb9499e045e60bda1308434994c2913dec07999d6e3555b78eb266a568ef460c94a038bff85c70a40ea43da29b7ae2c99e6cdc8bbcffd4ce7ce3550da17453b521c66b86945d5ec2ef19988fa35ee25e9f502dd43e5cdbaefe74974297274d0f7e5178868c7ee2c28efd7b661f7496180cad0cdf15c9623048b9f3d3891cfa8a2dc5369cc61eb0cb43d6eb9c0d87c110c774fad926fa116850007e0b5915e0a12dd42a4a9339f4acaf4bda00725655ce7e6b9e18a518f48f97b7c733c8877184b5ce1ec2a77e89df21f35ab51c73e9bc3d7e092da99913405b38b70d1629846f7d7d8c92f921d5ccc08c138b7c93b52d75641da814dbccc57a93e691c48d7b70c3f282503d2d5f9ad4bf60efbd5961f5a7167cd3a3c37bcab273164628c236a9efab5afa20c81d9d7820701f9a301cd22ad891d854fa161dd8164a2a8914bd53817339bcbefa4300e9f16fcc105a27f769c22170873841a5e97b443a8cd835e958c5fce5b81109b073023664f069ac4f57bb9b80b8693b214d623ced692c350d731dd936f6acb834527be6f5873ce1d1389b78e0d35f14a2f907548c0d5cd407ccdb3f899e193da7c5a42c5fb108befdd1cb9f534136379847b80a77154ecea153f6930d251452a3fcc5352cb38796f80ba1a1b2a6568b295e5931fd02a2bc95182b8620207a7f7ef5de6bacb8d2f7eff14424bbd2732f1d510bf7a3a644e33ae6a6ea9786ec4a9ce3ae5751c9cae3c52f8b890037909253e30b94bb937ac3590e5e7f99cca15ddbb4cd788c7bae1f82370df86d5d8b08ae4b4dbe781604ce00fc5234c7c10424d8a8426543cf35a4a653f9cf25624e79ff5964720b92a44e76b2dbb01aa4ce14b85f6affc8afe47d361906d8d7b0863e9916a9c7202f95f83e59acea0cca4400938822e27c4d91d9deead8e7ef9ca6d73a69f5e260fe200a0d076c26482522a800ec0f7ec13da2f6ef4fd9bdc9c5108f2acbb6edd9c27962376af42dadab18b6626363ca3bd8e37f4143a5a6aa32477952d43559bcd282cf448bebf800f0b3e9806d6a83fe6069879925c0fbeeee431e6fe343665c3e1fd04433eca97d59b973a317b92bc1240e28a76d6871aafe734a99f2232802b831d7335d22427feee436417b029787b34392fc2016ee13777e591d87ff1b2a477d856eed6ffa2c458c26008ca03582a562a2539fcc7c089af82e475500de124be35322dfaef12fd6f983381020b6ab876d5f8883f93707836feefea74b06e18e46a234448d886a0889e57b2a68ec7781b6ca9f34f71785fd68f213cb3fa911bffefcfe7dbc8539b385b2f1eb198ec2f1f6a04a27cb3540d462fc66584cffbd450566a04e6c49337e9b875f7b38bd5ca98b194e34f1ea84382e8c1be06665dc154d5ed3b6b4bf9d43d8d1d24f3d9e11a05e43bdd7986a6180666ad83d82ab321d6ed8cf29560b95dc0704014998f0f5caee267bb130923cc19d6861165e994ad4075d36117e75e2e82f1f54f4487f671e9889ba9a94493f660a478dec7c4e351fbd4867890243a31222a0f15fe4df3c275d576ebdf9c3e01c9241dfd43162e173d4b79f54e139641156e23bcf6004470a136df74a0ef28ffe857bda8028a186e4b2a94fc9a304aebf73fc3f3d98807f7f4848cf5a6fd60b61146a8d669385352189202c83c78937e54e8bd94f92d0c593beae5715d4f67f045c5cd48990813dfc378517f9c193758294b2429641e7caf987c60e2223626c7fbfd4249f01efe16859208242f32298e1eaca879ce32eb28a4466d3eaf360022e1bfc98e3f09d8364c4aee1b8b0b19ce5288aaf852214611ed39db9d19a0afe9918d01f1f0f59513280075b6d1809f39ee92b4f28810a91b18f47fb5de73e52f21017293f6da8126373178ca91fbc6778688347ac41f1752689e528d851a42ff2c1998f5d43a5b79b72a2ee236c810e358361f5248bc93577626e9087e475ac9912d6811afd51e3164d376aae8f1c389c37061dcb1ecc112ccc232508335a8b52d02fbe5d727d13a090649e8d20bc374092a7c2ee9aeb5bb55668dd18c45060187a4ab6cb5b5b87cdaf3cee56ee6c1f20a59d4f530fbfabffe025b6de74e7354d7ca87ca7f5d51ad5a977bf4d78665e0aa3295414c67d9a9aa6edb8f3355cbf42b862ef14940d8d457e7cfb31c81d0193a95206caca62809fcb998fdaebbb872ec8b5f6759d96f085bb7d8f34e04d652e2233c6ad7ce1f02bee19179cee022a8e0636066aae39f6f1ff86986cccadd19e0218f4b2c5454f913aec789c4c59049e83b58769aed6ae93608c2cc0b3fcc2f02498b44523e053d7e5af4770a0c829290378412f825e9f093fb9ab631dd5d1aa2dcd4909c0bb58fa48cae186ce39166f0c1c02cb204e0f13aa63296bbe17faa62fa7bda2b0dded11d26d5b0534ab8d5ab1c6b66ad09f0b2a3e75de9e34a0503f4993f7e34acc65a5799d647d04e7580c0a4dfcf8583353526c00031460ff6efc1be513160ec9d9a4e41581ce14e0a6021544f5b3766ca89e107304531ec5782172e8bf1084e19105be56270018bff2fbb82a4ca0def5b7eaef885e484e2c6e75df0abb5fdd27f5dee7f6681f9165e26c5a2333239be83373a992a8624ae7fcca6772200061246dd1d985b67c18d2e72803990a19e92f6f497347c0fed4245df234a7ca0fa3b06c07feb4c6589af661cff2c008de6af3c7c212798a4051789a958db0c88b83b15a148e64be94f3675e9011841f932e39007224fc7c8f7fbb1740f87f6f0d1fc8be7196276eec6bc4a42ec7b50ee5ce9add0fb3f927e7e4691b875fb5ea7ed03fdf38588a3b140fdeb0d2d26915aa29eb2e8094945987e52bc3957b3f36e471c13c5d7734c731b1a4e9fc44bac2388b4712add69e13e346b43f5b01490a1e03df8dbc8c64e54bda8a1cca814e577059f14b6abc97288d804e43fad940429d74e72c24ba9fc5588afed3f76fea0f69e7d3f9ff59ba9993d837fc328d86bf6855abd74ec68beb7030572977345264f97caafdf1eaab05d3fc58858a3080a8e1140ab258d7f51fb52899f5ef277f4e860891a66fff68cc9c2763762df2614a84b2412df3cac2df2d21ebe506f6b5cc4b514c2cd4706044e7e63b944b70daa84edbf4efbf1e1b741c47ec6505c1c5a1aec2f93a8c4869360e906f8c628ba5e4b89babf7fa2a82889560a7836ff3a7141286b41ef3a17dde6e32da687936de726f06378d1a0cdeaf9a2497040ebc76fdb97bf4eee02b3d9a1ae078f8bc5d66adf7369fef2a0f63293319c015926db0c80f70f00a608aab37afa3efb817fd24edb4cf6cae4a731f8bf0dc73c66cbedbaf544f701913b95cc2145484426ab3d8819bcfa734dcbdea07a4087e2b65f5c505f5d37f88c56f2b0d2fb99a7161f4269d2a60e8b6ad4e526591ce7b65bb52cb949ec9ef619e30ad80bf5046bbec8ef8794287e4f0acf887b9760d4787ce5b4d506b00368fd74a468d9285e84c5c5093f7432ddddc3d5a5121d6b160a7656c7f36edd758769ed1ac919f47b1258a0380688b708db1e4c4582b4c6b8e3a8a3e7ab99b28079d6c8a93c2538ef2d4d205d0f1e133f50c0696ec1c786b05f42c6adc2e64b858cf8d1791d612376ac8fcf5cf2333f5ab39b56de3c9159278a603be24c933df82d8bd4aa17861fdfef8b717dad790fdcee625b09961bb9a830683646c01be7fb3e7927baf45b88cdf8fdbf4dfe83ef449236343a9d588fe970b0178ff7e0e1ddbb3f27c3d235ee55ee70090e12a9c1af5065fa671a6ae614c9b0ed05323576cfea191f97138293cc99af17a55d1020dfa2679776a2396d6f8ad85ceeecb73adee03dd0b0667b20543c3e4004c255d89f0c19560d57e693e2388e3fc902f9f2d856df808aea1f4dfb4855aa5a50fed7ddf99cc1fafa44bd2cd32bdfa63d1a91fbfb1504e72f0ef122ba081531c4a198054efe0732f653471832b2930bbe26a83b4c1dcb3c95269d69f124db4c3fab8b140b951f0380a0c6b002faf4d38dcfed84e9bc361a9387364c3f55626d76dbc7c83f32fdfcdbbe5c445cbfb16bc9b10a9a2ff0a0fe6a6b88b08ade1b142a0e544012023d1d2cb85cf2667d5f79a2355b39248dd9f27741e31a7e608af22a4ba529e5d903e867fb35cc93e6c57ad5dbf046977da331fca2d96b6cd3fdf08f4709203e1b586def9fe3e34c08ba8c21eedc88c1ee6032dad640392ee70ca60b5a3904590784856fbe977fd3ea02f8f3bd32c91c1f9890b59e3512abff08e576caa0fa7945411c67a0aede6f5aac477604048c7aba1dabeea89a205188f973a87ef6af8845498e44853d2453df54b67e63e6b05657bd04ea8680f7efce289bbe234d4ade6e2c5e6a616c1c58264eb01368f6f8714dd013892cf761c2d1ed379ed2f67fe351342dcd8a0d9237282539e0e1f49c09d6d33b49f8735b011bed834fdc6dace26835d1137f2046d9833d2044571cdac0004bb4e47109b1591ead8fc7a538e66a0a8629540ba84726f7532420454b5efccbdea2a98256fe80d20e2c3a7b2063c214b6c020c55fca434010246da3be221576d927965803e93842b088a68fc86d12392aceaced959860cddd60678e7330c11e03557e209e161ec40f8b652adbfa591525477eb9844ddb562b7ac5ed909072a84fa9c62fec1aa93a297fd72a9f662125f922ff622d1ed74da2e5ba44aa513c57950b6dc13a90119429d0af795929c3a044e0449859a91b5b0297ad45a3577d4ecfda0f4f9b97d20651eb886f36051a03477d2c057af64ef4d83a8247669460db796a0a284690e1d3585650930e833e79586ff7cbacf70d5644ca81f1359b0618496ed83f84175f8b2f7ef1ac519b915adec7a22b69bfe160dc8cae69b44147d98c9a962d9d23fc2863777b872aa6f7dfd5b61590575e3e06e4235c92617e840ace86bd7748f8cf6a140cd24a1206ecef694aa73f84357e424b9b6b14342c9444c0c61a2cfd57bff35cb8822fdf4f4602be53f07255b3649eb35e44a04596e3d14802010ef4dfdd0293610e81dfd9b16663ae63549f1748092c3597e3e34b8098b4cef0b4b61764181087663e794b4f47849a67430d31cf68521521d6abe1fe6bdfccb00a9439e76d69c34aa7a7c40013343d4bc536dbeb78559ff049a2911f9e8407f66866ef51d58f3105e93e4427f0fe673dfb319a2788720b2b3942cf0caee1e7d3da7aca3142b2385a123cea6523ebfe44fd14591d062e9b69407bcb91ea3dde2e660ca3e69da3ef2cd9ec062c6c394e67319e27d856d460bb02791dcd1cc04143df592527b88ea4e5d813cb980a430631ed77a7a445b9b298717c2b9b5deda51a2c25a4aa4c81165cd786c2a8f47a85a8a46d3897d240591ca147b0ec73d2a948b32454f4ba79ab0cb69203f5b7b797eb63fd44f754990f1b0aa5b4054651c978dd562417d73d468f7fcc201c0155c7990483f50da15f15f5248ea3edafbce3346d9dca9e34d658bd29d7bc57ffc2c96886408cad12562c177c2931017e53d933801c42a7a846cab05301a1df67b1cfecafafe4ea5a5379506c69a328798490ccfac7804fb286bf1fc4ef83419ca391b5372e5f800d7cad6f2a182889e4a168b02bb888a8147d6cf827ba1441a179439b7269a45dbb4ce9855d2e2a307bc143d7afe38435b8fb307d62dedee377a5ba1e645f427cf0d87f0ab00d7120c22a21e1eb949d503a4669ab0c31e7e2bce2a340212a88e04729032a33c65e746b72699f637e935dae13227884ee9fbf79c33e964df5139b9cfc78e71ccb2a4086a88c66eb053eba503a538ebc25778b1e989b49d5edbc0c4d421790411155883fa09a9cf5d9113de2baaca8f29fb46f7c4c6289cf311ce1ea151d221e3bd6fc4214b0157b99053edca1b420ed9592bde0a4bf88af15536fd8ab43678b9ad80393f1c08340baffb9fbf9ae8bd7233fef8a805341c8cd826a5c6c935e3c70d33164ecdf6feee450285207c034e2065cefe6debce1e8411908e760d8948bd38a79e03879be5c5df18a3a0a2435d33ac146a3f66e198ee282da37435f809ca93a20f9a0260be9b17913fe0ddb3a50f1d58612d86110568f95d508353173e56c400970015218c017c4a500d18c1b960d28a6903c0a839dafa932ae7400b15a773af60fbbea73247d3d22d00c34cac86c608d78a6408383a719c10f20d601893430faa4ebc9bdde8a531c5d43c45dc0989a7f5eaa7c14fb7618c2d90aee5bcc4c4d1b6bc32ff108fbc0710c617fafb788c650dd3b8d233137277fe13f134bd667add16e199991be83df9f827df39472eab2d324d85d20dbaa6fd80fd1156b4cfdc6aae3c6c7bbd08d8402291f1829c3b231de6e6d52ee34c9c783c9bfcdd1fde2b2992d9d279431c5fe9da72e7716940a7edc7bfd762e94b895e78d549d6c8641c8d0ffde41b325ee34dd756007ada9f0c11385f73c3ad3c2f3b11f5ec12247ebc419b2842496cfec4ae8a3a50ec069717e7b13c997d77dbc8cc87435f9d6a49ffa3ed81d3cb793fa43c93ad5010c8bf0559abf55735c5dfde98be5a36e734d04839d875b6663dd60ed67dc83758b82c1798343830870e4e8ef325a8a52b9ee95708d072b0a75b57d6b20de7b571426cef8d09d850beec79dd32ac83328a8693c9f051e5fb48322f0e647c043c7f683f93cff5ec4f27de46dba9e0e08b83e9116f6d312747ee1b19dec6d1766b5c55c1864c24850d861b0748f311716d91aaca6af22be61cc0d68a3c164b5177047c91f5b8a3da5418818142c17b1cdb640d98d967725658dfa53c24734b6bea75ba1cdfe3882eaa7827f0551f3262a22e35e9f4a757c1388f6bfd06bfe216818ef44e79ca36e8a4f99ce84da7450126b7065cff249646c376da7a4d6eb6184fdc26cbacd58b23d308aea4e08dd690df054fedbbc9e654b4815d2d4dfd6a0a4be8135e990395a9826eb5c06e043790d0024044c114d835d71afb5a919871b062639f226c8e4b3391a7e4c33dac007d5f32e28bee03738ef0ca429132e6ce5203f8585f799e9c29f98e5814d5eefb2780f92159cdfdf9ef56f7a5bc9327b69cb199b6983ccc85316f9d477498e9773ff15b27ba3339efd5366723bc2ffa1fd5186976894b5d3e74f65f2bf047d26c0432666b54a6de33543d1598aff6a39e0f4a1f778615031fb8b488ea3076cc56851d383107bba22c8982c1cfedaca2be3ca7a49b51e54200f5369e316aad4536aec02d4d07586a071568bf3aac01d3d8b12d16512dcd29e3c9765a7a6ef5df3d73d3771a10b1c6acf2fe0c0b668ed9263bc57717190c789943cf17b74cd2bed7bcafb34d0e7d023913d383e2482e61de715315f45ed4185cdbdbb17b326949c5624c1bd8daea24284b5bff8b83760437fe10d50658ef3a2f9fbd977ab900ad4d44ed36da833cc3f65d327c679c3470910be5e27a46f2c348e4367308cb54e054a06ffd3f90936060d595c76b26ecdc21e44398429a8d1a0076d2d09a0dd94d4b134871fe6e2fe6cd995629981f53c17e27d0f0e7068462a59bdc373c4febe11911f1aa56493826a9670aa8966d7d122e7a9b14db8931783daf51cd23aa069a53a7a5512c35e6dcd1ead74d28042b25d3b0cd7b20e6180ccd5ed34c3c34c89af5e0dba253faf220fcea859e439a0f0db24fbab776ab01f2e08b8558e857244fbfe21659560197a3ea03365ed502fb5dde82143d32ac1087604d90175f2529660a2ab2df99b965952700554305945118ee42a61efac8c2a714a1b780b9684705450e63a90b3618aa820c060de4582beb1c49a8d5e8d20eca842b407a431ac0dca1fd2791281d690a71aea3f0155f22cf3550a771f7017db3ba263f236dcd8b1e77ae759f84c6ef03d21726f710563c0520a9d2013ceb5e2a6e85ec2c38c7f14aa865e2879c6df45fed4bdce3e41a8a07db90060cdd7657bfa0b1b9abb6f5070f8ada6c297d13700a87f552519154e0c07fbc1ac7d36c0ef74e2e519e9eefcebf9fd2f5323cfe932e549e8fde948a522a335d22bc668def96c1d21da4e7afcb61815f94e73603641c0ab67252b70a66e7451387a743358b91330d5759a2b14121551ecd4c3af0083fbbc75ae0a25ca16a0fb90f522a7926e3c7dc777e992945cd9c8d8ab626a19d2140159410596fa33209ae0ed109a82a569e552926a882100f764ae52f4fff90a26efcae5c74da90cb2ff3ccf4b84101d5bb36e720a982965b0c0792fabadefc8b3fee4c2504f761a1f869572ae296e301067aa1689f38f81a48b6e40f2e9bb68e4db73e8b634b7b34f6f64f407aeacf9fb5250e6a83eff91ed82a62b46fa6e98e1e7cf33560b706a3355713cb88e9c771956507ad3b7212a56c99e5873a233bc7e35da82acdc4415a729483ee770b071d7acd9b781f12c693da9378d645788d5dbff9055b0ae767174414877826fa27d44a65fefec4a94eec3dca385f71098b09d0ccf728edc6e799e3eb0870812df9285014b8d15832209475d633570d63a08c9f0e0849df77a8b10d0e7502a660248ba4878aca7591c3cb7069d0f5741e81fad3003516ffabb4beb207984980f49b0277f199199638810834eaf41dd2735db5f32d6cd8a9ef187afc396bbfb6f7dde1522348853f596800a53d5a75fd3e455cd7be99ea6bcf2e73006dbeabc43a57ae2266e17d1d966c51e29da98aa302faf82ececf31127bb7875390b269a6bc754adfdbaba819943637431efd86a0b02a1509190b6b3c579fb234119fcf5f342fd67cf458f30387dd7ff0229bf713a6550364b1e0cedca6e47f46737cb81476156619db8f636ad0f41ffdea30068732be6ef6cfeaa5d96d23c10a355c31be0a8c5614f9a5a1c26431655945ba6d7155b80fa38e67e762c8b2dd783e92e59bdc033e558d965f9060541e5d2ee27b42b213c87fa741329fd92fb8a3cddb4514b475057f2aa9685a2a7e08f706d198793bac3610d091c11139eef3630a76d98dba96a873a1b38cc90bdd4370ca9443cd66ef6111b17bd36cb01c5b55cf166f5e1d297ca2af47a786a630c2e7eaec857e86513677461c902d15e4b89e7d084ee67e2eab7b79798bee060ad6c95f69d978d698a63bd0bdf8e10f2e082155502c4e85fd913e8a7a595564c53bbf0aade4e97fc626379e7f80083f1db1dd240354798047572d67bf42f9a6bba0d6e1b7a95bfa0b0de59dd249600ec289ae6dd1d7239dac3e5125cf67ae16559959df2460ce3c73c406c10e9e72955a8964add825e4cac10826792b9ead55b0bba04c54b5a81d15b2d3cca8198866a96938daeb5f5f3f1fd64fe332f62d241f0b940 # # Params = SHA2-512_W16_H10 # Msg = 39324feb180aca683d995db187a075a910d0 # PrivateKey = 040000041f1c582dcf6a3a7133a47f3a7146605b9cb4a049781a327ad38dde5f26b177267b65277a3bf86f07af5f2dfbe1132d315f7e2aa0b3c2657be7825f6126573bbfbbe58d6c8e63d95e5c2edcfab5077810df3521abdd172051672cacafde4b2f73c605d66c94aade3cbe188856e236e924f49f866603638cdb1af5ca27496b635e00000000000000c053eb6d680e5d29226188aee4a0e1cfd363e9ef9af143dfe9081065707edff5efb68f4d0abbb0c3121ce18c32cd398b673d43e449039fa0f270d75772fc7a6581ef44a1a145002ec7dced7f7d76dd64c1628c52f59483595bef40d15951234a4cad10130a6fc9e7be663c915b6012f7577b06f119b68e70bb598679600a2a4c17 # Signature = 00000000000000c07ac80f5d8163c8931e61c3bcca6f26c60d7717dcb7e8b1db104a2089eff3b08fcba4cabcee7ae55166153abfd5b024d6d268c75db43538864696e479f46e5e942635525fd811efd5cdad2f74dfe0104f191cee8201bc6980f80eba509172b1d757da113c80d1153ed5188f74a7ec79a6fb82f4789d3c992b2f84f1638522f7252cb619d96c9ea6a34e4799f65eb8668b18f63a9d20aed73683c94e1c20c657fa3b0493a823dd3c244fa4adf51a1eb3d72ca3be7871d7d09856e3cbc67e569a1ac96b9ed165a3f85501473d8141f8f9fa514f6feace4087695a3d3af38829146498d14d071f7f88ec455a0eaee12ae182fc788ad4c0b252727431e5e2200e181e4a5b2b229d5da3f4b266fa32dd0b61802736e5ed176ecd5d6ed826058bde29b834789bf01a1746a219222309f671e31a3528ac1346565e6718925d40245ddb22eb81989e9cd2f1b6d91a8793b862d54e88fd5ce2690d4874f7b59dd29065c9c8e9021368e9fc0afe0490b35e7f02ead1c210a005c862fb3d5e49b36a61d009f585707f99a9f0b38dcf49006f95e48d06714064255dcc3a16b17d3ce547e7c004bdfa2a9556327e85711fff1132f3127f48443e08212913e6414548ad94fb449e0d128a9a4d9f4214c05c7c14238348aaff0fd84425e0352b322d3af15c0b3a9818583f1c92c050190001767c4c8e23b02e9574ef26e1c25f826574f074ebfb6248929d0366382f9d144d629382ed76ec81c8089218312ee59c9d8c0d6790774e7f8159143e87be94e56e55fd45ce5c8242f57c59eb7e08f159e2c04da64d03423cb39bb17665ab8bfcedffa7f2c5ec378ed88900cc2757897410b884bbe18a0f2d3236ec96b676fc2ace407194469621cf12f6c498d10d733610b996ef90b499a24a8b58e1a90144fdd6918d7fa7cc8ad74efe60847dda0258e923bdd11d0f8979d6396d9ff5d557788a541d9c1da96cc477400445a978662fee7d2a300a6f88d183d8e0b7ff5669ba98cbd46212c6d7edd8480fb8b924e23052b1bdce728c20c0530889c8d8361f85bec913c13b040b3a4ee8dee462add931c3399122d55d73471210b779dd04ef8feb63d33ee8d5dbad615aa7aef5f1cdec32811b6543392264b088b250fd450ddc950fd68b92a41652134aeacdf1607ae2360b9e84ad71d4637bc01d773a0c31db317289e02f05fdd2b16841123740fff8c9af4f64185b8929cb5d4c2350f511fc2dfa1678a073144ca18850d2493c7dd00c506324fbb777d6805b2f642350d375db002655d475f8c572b06f88a12789d6435e0a65c7579caf579739889a1d016f07b3b04584ff420acf17a0c364f65e31a04b2a17cb5cbaad072d251563bf68cd705a40546df1b786ff385208df89c9fc902afaef48cc563f146f22d55d69901869158f03b873b82afcb85a2a3b4455267de0233b187f5bed3e3e517311f1105ca732a0c432952766fc773e1301f98dbfeff32251454957c88c4ef82a1ebc26b4b2f98abd7ede151ad07777aac773adb283b9e7e822ede6de05e20533e69c686356b633447cb80905821aa45dcf7b66f9c95c70895e1ddaf811d2d888b6a9f5656a9124016f46581ac8a3d1cba0c747a5814d342c268a63c895846aa18f5ac29ff5abcbf88b081d432fd45da50e24455fa89556dd1c713cc4d374ca7555d02ce71626e9157e72807babef33d24c0cba9f9dadbe0a177fe2fb9d6cf6f7727762c43f653a57d96fcc91318a62a1edd6030c834fa6a39859e66ca7e7036ab744ce0982951953ff737968966d953d56842b9440251b4a56020671064d0d8f873b5d0ed9b4527d47cbabdb4e99a780ba258216822ee9d698427b0efee8916c11a2fc6a6183a8635da55a7c6014390f098fac0cda645a56f5ace35c751580ab1ad148fd07828f155239a4a58955e094c5325fc008c537096911d11297ad3e1622d563e016287c8fa4ee88670d359eab82bd6418063b16fd5e05ffca79079a5e3bb4e57175714f2b60d95387a23b11573107c96bfcec03a7bf11d55fdab53337f8112bf17b61b32042c647d1f34b50240cd8a9fecbccc4eddf66b067a16bfc0528cbf9b5c6e767b2b2eb9db36324350beb61a3c79cf00aa2f80f078d1cc5017b080e13b58e0b453c2bd0dff95d42ea532601b4801625fb0d1170b4eebaa76699f449ab8546209c1bbb6762b6e542ce1c6396f090f8681c7ffa96b198c7aea187383bb05661384fdcfbd7501e7d8b6c2fc8280086de2f59110f496aea24835da2765320303a1e39e0f1a17f7ecfa155931bfb66bf9d68642d8b466ad8543df07925e40127efd75c29ee192adfe2fd0a317c7e609a86c8bf8a6a4235eba4e8e458ce9f37604d5b93ae5ffed9b3e05a5a7945897e054085d53e7dcf29a67376e0df3a6ec5957ad469d3f605e71b04c3581560ea1df3d5f1ae26aacb48af709bf5253498b7023009c631212eaf8541cda822665d3791fa8191c8137db1a9e39f861d9ccb27d9958b0ecafdc00baf982de74abdc519d042219fef5520d36f9fa609f8d3a1dfc5858b3c4a2630ed9861e78714489eaf8afa6968f6f95292d313d313d6f9c785e3b58f98f38e81754d8d9af0b2c1da75c541042798b67eb2ba2f76a079d49f599c08ac8330ca7b9266cefa4fa2a3f9de24c690e8dc2e7cb6366c881fb360d5d3ba15a140bec0bbbd006985c5e89c85cd1fc30f42a80bef55fc7e08fb3a17bb9d0837d54ad46825e8f2890c3447a37a06e91cf6e5d509cc6928f131cd8d72930891c12878693b9848a14f4b00305e9c55b414f91f99adb0c911179933a84295d05cc9f3ca637f49ee5b23279b7437d953cfb4690354907a730f4c9d3cc9334a88d951f5009279e0812effb6f6d0bac284674eb18e07be1e004cb61215bc41e30862a4f1be19c1cd17413a05dbb5be6cd9c915000dfc4c23ff082e659dcdb7a02879b17f1428e565556e9f91f46d4087347f26bf5652fe096fd79406e8c240a4ce7efed953bb90fa6c468d20b6a66529024e59598330151525daf6a4e101fbebaa1dbb6f19f4bc1c54cf1d09c3710f9365f7a879510042218f22a0ebd05a304d33ff3e69a04d399c6f31c207d8797f7854a6004239ad3b4e1de32306979a98d62cbdcbe9240b07f0f9ccc9c85b8bb2b7dc8615dfbed6b1aea086055d2731b829dd994e348148f23b75f8f8ff6c80ca731afbba7db5b572a4e31dfdb7cb19a14e2576e48d498b95b8b43ee4f029a694b644516568e9c1a576582197343a56a13c909fddaedb7eec91d552f071ee208dfe3685fde6a924a20a913954a1919356bbb1df549ad451759e4b231af8b4b05827ba94dc3750cd8239a51823911fb5ea51cc013abb9379c1164d50af871834f2c272da5239b1b8822c454dba30ac720a8084d9c3cb324920aa18c12cccd5d532300e020840f79f5a6f739a06ec77e5e5fea2d1478ac45516564213bd9d5bcae9e533ae51d443971912a1053a13ecbe2106fdd3a93938f1c5c263dff5e50ac59a8c7418b5071ff7de2ea0c90cb73bfb9b6bea54c266fba41b963fd33bd5bb95e5661e3fa2d21c9c9f60f9a9c6fd82c5b91e88398bd144012abd011c105272dd3f41eb81784c49144a2b46a4fcb2e241021d58b819e14bdf610b37f6edac980689338520d2abf57a8a42d9e34a08ad26491031c22172890a7f999f6447c3a788e08b332fe6210b7597e9bbc210cc540f67a946ccdf052888f2cebfca9aac53a9151c93f249c6d6a23c272a37c47e0cf276e580f950769aae133f71b84768b4c4ccf0ff3de463d6736bc2fdd86c892acbc415c412f5640c2ababe9372d4fc942df7a65b08bde25c443a71f096a3ea62fac6067cdd9dfa63f821cf6e7f575fa19e6a2096676dd267132db79e3e2e55c25a02d79d0fbe3ac328a6c4c0cb9ab177388c000f5cefe9adfa6ed40cbe99885aa45134383edbe2c86f247c46cdbbef93a023ff060f45272e051feb9c6eeb6597c36f80ecbe1b5b8cbf77c07f55078e085b47d82bf75dfd25d1f432be9330fccfa67a27063c910e37bbe1e92b46ab3e8d6320240e519f414ecc302603765db5c9a1c1eafa9ba18d26e212fb3f274000aabafda9a1ae28eb8c7ca972d3c20fdd07deb724cf5dd776edd4abd8d39ace572093f02ce835cbc35b03fb2d3f9e4ac384324d8fa96e14dfad179f93a224cdf7232f2f2843a9675803bd8bd89fc35248ebd792c673791c2a602611ff6d54345269d57bbb9514a5cf144f91e9ccc879bbc21023891c0bcabae4215521d613a538d5924878b3eadfaff7b7cfe6af56bda4981323ad7a78a46a415fac1e51ceba9719c535bdcff92e45da127254006d6b7dd20fcc3862800e7b3f876684d82d1e778f0054d6e7f2e8d1b15e5e83ccd15e3e70834b9eecc61ac2f76125c5131b1788e9c44ef7cdefedc40163cf6c9daedc93c09964e9d2035c0f7303769dc20f9ef6c4f7dae9b50e10baca7f129c421b4a8ad8fa9f41a523c7993723f40b57fe06215ed5dfec30c88ae7c12dddcf7ec3dd45a61687f5c25e6f28ce616d303449a2c285efc873f6ea89d2764f6e40692ba654f5227bfd93674199b66f211c497b1bdad310d8aa952d100734f0168198ee008604e298b26dad82d35bc52c162b8639dc62df288d767b7a03f18932ede9997b1828fb478d60351f00a15fb4aa2e6fc5b6931b4f104dfde35757b83edbd6152463236250cd41ea638b969bc5d24abed7b2dd31e668153d6d26925974bd1b673c8db03aa0e8358ed06121db5d530ca92986fc3f48d34eae5edd69bbf856bb4b65cb83f930c62e2bc34d24668c4d85ea0e75efa3c29b2f8507fda199cc55b363bde11641f919b37471f1102ada6f52694e943e2bb03695a4f3d73e2100852e1ac46bedce1fde778ff383b1f323ad66c72466e35d370c61d1cc2a0f92b9fb21b2c82a32df201dde74e6a95b12d5d80e6e4c1ed19e279ed41b92a3517234025e8eb524f1b811aefe7f9e7a9179ce917a2806036fdc005becc5929b6ddec574cfad3f3437a6a712e67d05f755ad159e43a5767f92a5d696218f85f48509b24c72a48bbb1c22840c3a1361d56495a857ce55f7315cafdbd546f4d14c5bbfc883c280d945c99bcc54a60dcc85b23fe6da642c9fe4b9ec42e9c863001442f0c000714d5bc99bdd2f5e45141029602b65d5baeebd9d561f7668e2a6c4f195db546fee9f9c8521a84a7849ca243c54265f833afb63bb2dc68bf7c1db0b8cd61e3e9e6fd75f5dea5d4a13d63bcd0c47372dc29f34ca9a3b41904a914c045a0aa212bdc8d0d675e7031f4e4e5e7f003ac855601be4f996795c658d0be5b3322b3309b41f27a902eed8d53614546a444e7366eaf84b14ecf63a0526ca6d7dc154483ffbcdba85d87c7284c3517c3862bad201fe96110726d05e1f5361168cf5c2330a62a8220ca32b502a70432bb172d25789909a4be7ae5d51a8182b96eaffb546dbd7769d18ea533ef49a73d414756df4c2e77b0f41a214454189ed639ee72d305af83bd3ae1f3edf185532825c76aa5843f0138ebe9e18b288eb26374a28046fa1a8c9fb2b34d5a832ba414f9145d128e337ef4af0482b4fdd933b02665622860d03d1d2b7480b101b834d1bd63de045a9ae43d5d764a4c3616101fdd329e83816f5dd8329e8187b28e9c142456f62761fe1476c88662dffc945c6385769bab24bb923451931ca12a7b67e67f9b4646ffb3d42a01cd242d230b06e52702efa52c7855bd1dfb38a340feb1b96fb8fc6b98ef0a7e3d5e282fb6b06729cc128d73ecbbe6bb20e524e639e872f3a0640ad75ad85481c8fe17eb322f21293268e45a4bb8563e4f674a0de907671bdff36a2918a2bd3788c9f2fbd933e9b0e14a04463c0eb79f21b310c201ad30b357b33b68ce9e59d1346c356c286677af06cd09b9d0ef7cf60d5e6f88c77aa3a09adb28c21b88b8cb363a0c03666f9d7c2981472e36e803b02ee843a654de48a64432453bb96538a080d2fd00100d2ed93a7c3036f026407b723241375654194184c6628b1087b4e2ef4570bb8baa69d462fddb30505a11d0045d0d326b0b38f5655d887a8075689fea2edcfb7f498f94d1814f9453741a786142a89cafdc367f4376cd07e80db78ed3cbb8b66b5231d189ac3b1094e8584221009d79777831760bd706a7c4b4aab7eeec54540dc4de631f12c594e4f6b37db259b7b32a6ca5c4e6978260028b156a3dec5e90ba62ce2de322fa8b4566309543eb6be3cb198bf858eee50b5c2b20b3f1b6c050ca216890e4e45c3220ef0cdd655acfd5a53e9f10a99fc74058946403619911b01f04af0da6a0d197024d580b467b0e3be16cb4584780dd8c87a4604afbe3ecb4f5876af73e64c6ab339cb6f258419808fcd09bbbadb3074006d05cf3af5c475cfbeb6d15a508cf531b27ca9ca136dcd200b653838208ede74b0ca9feaadb8d378429dcae1d326c02cd0ae8bb606c71c503cbdcd0b1c0a846bdc314fb0e6ebe4857719b452425406fe481b9f8abccc8a2c78e086e28def54c8a3eabfe6ec210e991d4419a315cc73be2ce14408cc0b5f16dca83fb340dc46912414fce7159fe6884e23eb7de764c1e4cfbf6cb780e34792161afcef6a14ec0c04a7929e9916852f8f60b35032c4be884004f0877df79aa8c6cdeae377e95c4829b00a94c3bc9bd7e1b17cc15cb87b80ffe6ae8b312ebc8c057c51d0f885871f9c280ac2b91425c866e845ea4413b862df579f88166c28c0bc5aa76a519adf8dd9d66d0715d935d63dc32ee3c144db49cafb2f832c7040ad504bcc2fca3d0a952a5974428305d828cdc2e08115747b8a7018b1e39b5b6cd8595daf3efdb9abc2c6b9b99c438b8163429a8bbea5935cdc04f0e7f13c65a4595ac744e762f4010465492aaca9f65854dface6fe37495ccb5c6f83cdf7553cf2f30a2f0d8c06a8bd48dd9a633d089cb73598693ee945c21b45a83bd5cd4aef28c4671fe14ce2f58fbe31f4d284d8593035d2cdda738532c0a651842a37fa668e012c3ebb4c49f5663a8b3276e9990fd08871866f2cd49f7bcffa48dcd429ca3b93d3f374dde42c53cb88684e806ca3cd622dc7d96fcc9df01f3faf3b76ecbca4b4d954c3961167175608a7c687d7638d008cae8c462b12b4394c36294adc02c2e80aa3e8a70423c8bb9fbad570f1f4e7c4042518b8e1b1e78515b143cbbcd58a31305d98aaa65fe0264eba70df9d8fc0a07402a28517a49ac5cd194e130f18daa44645954e038bb945d82bb4561d59523bda2d3d6b04d31e06521e5cfb3d47516104260720b7f390e0b180f0ad4127f686f3793352d1d3ff079cad1faee065b9e74749a7e67b67eb83b182d3af506cc9d1f8525d12600ff09ff7117dca4d2373a8b4ac5d63017acd62768152ac8f8b06c2e0a87dc4f18ca56549a1989bfbad3c22e4073e4b677bc0f6e1fa11aaa9d566d70e2c9723dde582b2f4b4cf2157a93c784fee8450270431b2a27e4a9ed9c9142808d008c9cb9afb3055dc3763f839ba0b55ced7eeaba113c5a535fbc8062b3a64e5e63bc8b7742a264595d3a29eed61ef599bf320479c2dafd5f44b79937f696d95ed4a108bb708ac5e3f4051aad1393d90d0f8922e4701fe4d791506da2ac475977347222000c17068b30a80eb0ba0461fbe43a9f74f428ea88eb683885baeb65e32229cd56a3d2629560c81963fb54508f74400e37839e32b33edce7e16cc4e6d3d11ba1f4a5d1a63035490311b22cc3511cbf453ac082d16b49a148e1c0f6d77908d98e148e52effce082db04e686d71c3e9ea0a6a8240f18d413be76ec96307f5987836ee04240618001cd309fb86d4d4e55b1617314413948a200cf07804857187554cd5dc8008fa634c879f3831f9f2d81f5296d6b5bab68ccce7c3aa315663c40d4c48c88c65b2b4bfef0296f1c97d0df6874aef21ef8ab734ba842df112fecf8ce8f32637344ce5982d2a13d0c87ca45e42770ca454d60e9d469ee1be3676ad0f10364b02129652050cd720a6b5261d1b2b56f76f7b0164b873dcc1535e105d584363f01bb72a6e128edd9c4ad845a7aa5ef4c40dd73c766f59b14374fb89af6e56143ed8d88578b919eb1aaf04014b1319a2a655ea19e793f89a611adaf76b363e46be6f5fe6342a0015ae594218a85f36aa759609bc9ce364da88bae1c59db42d3a7c8e2798700f1c0da22f2f888c61d1d1b694db20bf76202e9bc8ee681a2a6b5b2ed4ff30a61c1e9f3633e8060246745f91467dc5a07b8c7b0a650e4ef6f30b74a507190809b7e82829049170b88dc0cff6e3e5ae9fbce1a1ef6a9c211ea4d808bf0b699ebc5cbdfdd789ccdc2e01efc9a11b5dda7e0e7cce0c2ba8612900a901c127887e23fcff0134f4a7f103bc5deba8dd85d7199a07f10bbade267536b9a3c2f19d40341979a770dcb00a2b589d6c6a01461f4d44682037a339471b56e24f95abf1e361466068d2fdf2203597e813357a1438a7c27a1ea8fa8bee0ed6a820ceb209a3b3bf36e843e7ed13c9cbdc2407fc2d4b490bb0085358eabb1417940c5a4d27101c8f6231fa78aa9211826533218a300f894084bdf951825da353483ec3ee969be8e08759ca4e08790e86f4275f25847fe7f9fdf3d38d4a9a4cb4bedc33fe59c4a3c9c09e10e6f8216a933d6eddebbade32a88cd9e326e93896256a147ed7fd730eb4a1d5ea44c052485048cd9cf2c9f036e9cc03f517f8b6682ceccd5b02d562f7170508a717396808a1ede7c17a64948de87decb954f8f066e6412784a61e1e3d6d7fc57b8aa75cd643af60bea57fb6ff405a12e52ac1c21e3061dd2b12a9406dd957a0adf660e43d0a22d1e748bedf5d8b6f69fb0088ccbd947c9c9be3d9abd01c318e91cfb6f7989f8c0ba5984b6458dbc838c545940d3c5db1be2ae85a49466c79f766e52f8a41b902dc7604fc5c7cee438c660287ebd725605318712ac0f8785e31df7bf785ad4b680baa7380c99d502f69374727ce333004a2752e365fde31a474048f829bb7a84a308f9a1d4d947c43fbf6f8450b6a1b6cebcc80f8791eed92435da46df1f1217204e821134ae6e2458cda64b751d940c145773160686fe1deee7a8d6ad5bda3d2397e3096e45c3bba6ed729bcba3a7f12e1d9f7096ed1bb321113d4846ddeb1e096d385d10699dd0d97d15b5d272542c9734f4f2d914cc3a0364ec72649f18d25eaba2d97eadf202dbb5f9040c7f1ce3f45fbd5134a3d681e53d03c1fd0100095637b7d7e3e74db03e8d897245273381d1e4905ae5d75844cca4459690926e75adece721bb8789d4e4022503ac63ac9d2b466e6c43fa9c5b98bc080379ecdaeaa6331545cf7914caf484c6cae050a52eadd9bbe7aff6b8f14f54573fcd6ac59213097e5bdfac591f853249296eb915c64e6854b428cefe1e1aade1ab0a33be68304b04dbeffee3a41aa232eecad90ef70e9a5b1482f34714b61cfe8fe084fb7f8b90377cf34264723dbbe36f52f26045dda94e8ff6960fab0652243829fb4dfd2a1c435ae6aafc1ba8b6c7f7372d95a72e9f05b605b7dec2c5000c332a19eb06fd5d2484bdbd302f21dc148bfdfe3d2d8bdd3351b4405df61401b0b4373d0571ab89565b496e1b03a36d9deea0299ba45ded0b840245c1e8d1c8096bb990f00924c1bec923b823695c217e07803a43da8ae62a388c5dcf37baa023336923ca57bae2215f3c9345a000ffb679c1880d883ae699607018ac6753fc50d96acfa6a49771b05db76d095ad1437f1c5a7b2c6663952aa36590851893b6ffa5602164e50ab81d928b39152046d6a722b6d45ce1df7f49cce300c84763471aa0733cc598775fdde14b160c9f53e076210deaef6c89912ec46eb1082717bf880802d1c491a34bf4cf96af41c7f002cda0ede4c0f0671e6138ff1ddd214dd649b483ba12b90a5c254db37a98243b2e13c8594c71d1d5e24689c803a4a677c71839cdbdd5e7126fe5c05fe3d3ad42c27a07f000adc85a045c708f7a5cdcfde27fed6d1485513533c73300696d29eea02954ce79fd0c4418d88061461f03db2eb8c34e7c17ad5d25e37c404f2b09cd6ce875ba112349aa6392a9f4758021d37bc0f4f61e3f190bcf95abcfb548796eee2b9f4f102180e173b562955065ef53b3a349bfde51545c9b92cc25527374f7aae184845df9503b8ece53cef9502e545779a55154aac69b6736a59d2ad2a1e635e7ebba6e36998a211a81e93d1f689131e3a7081d9185737e66cd02ee453d7018aa83c8f42f34c7e332c6888e688354cb08d3e702237f3e17bb6ee835b18aa8c8666215890fcc05ff03edbd335f34982841f0c3e8ca592f5f9f26a8bd4277955078fe81d8b660eb958d3967e6e8fdc72e927acfe55fd57765949d4248ededaab2723b16ca45e9d3ed592cf62a5eaac6ad05c72eae843cb92b07c89cc01b54f919bfd2c08da13919ffb6c2f75b3a6444d7760e5d4b3ac0f938976bf54bcee821fdb1033f907daf21eae80375301eb5e18b6f3cee17bf5e86a9006299c4df79fafe59a251a8e0e1b47cace83738bc50d5759bb4fc7c3e380b0e5b6407767957e561f510d23410a034c06554f4ad40029d8a24c7a853d3946718a1d816b6814d4221ed5f1f5fd3b0bf9f9bf47018ded6e75355882447fd1e295ba2ec53511fea852ced5bf91c534676ab2f5c830b3d004d090e923cbbe5c4981fd6e9b6a4a680c694f7627e2624028df9e1755b98a6c9f69dec208d4e99cbfc6f3c5bd6079eef287c9ea5e71e5f9236fb1c6e42b1159ff8d085b6b0a8185a326de201a62ea9e7c6c5ecdf99dbe4b26a68ae6df8fd29c9ec104d42806eb71e4968fa50ea0b6a0d22097e698b00cae47bb5fd1207a44e8a5a091200f78760f36a1a2c476dd61009819a737571ac34e32c80b165cb682bd3473875d8da407e630b6998c64ec5cb7576b705c3274f3ac770ce1693e54778577d5dca29fd90d4f8e17c4b9bc98a0a8963560004b65dbce46ffc47b7d74662c2670beb54c3cbdff965ff7f62b721bc370b80bf3af92385043bcc35f17a16c80c28e06b11da55124d42d927da84b83c79a45afc6111b0dfc43282f25f0ffd5ea5bf111f6dd24f7ab664469ccfc42108f91ff2358aa39a46d8afa8c95d775f77b6ae58217d84bd63f8c36da2eacc4c413da70c49e53a177a6c663c3fc37974cc5d6125b732aac59bdd44880995724fc8b6130ec085d01b11b92dc663220e3df3c9561a8767ba55f55e0a80d43a7a06ab0375530513b0f18de56320456115d30a3af40a4e0edcbbbfcb3ad9c69094938b50b5095700f27fac981167ea75ef154c9d3387c33385d000c52a934f02a64a0da463084bd675a1ad62838c7099ce46bf087bf5e82d44df1b1b8c3e371fc1e316abbae9678c20a9c4f7b1a6c28ad9bc1990b77df1507f227d8e1c1ecd3174faf27a2b56c1bf9a5bdfbe5c5b74431c607ca8bc55758513147e5d88f9ceb60abe2a026bba7ce2319987fa856b7866a67b8da2a27f4ac7fcba1678079f5d3658599f0d599a36e766052f3b53be43c946201390b6e4ce4a9c97a53ae69f85ac3ade8f60d681fd0a1582815d94c297e9e25e5a7b0e3907c5b62f08aa36e9b069415eca83742148db9515ddb5eae4ad6fad1b685c43b2824b7cd45eeebb35375b30f5e1e22ac9927eb4d02c06e45fb43e8ca59c1e9b0a7a2d3cbbec7ab5dc4492dfb2a7a1227b27930238a83d722ebc7c312565270f477371a3b302b5c54b748cd3137239e7852fdbfc6cea8fbfca4d727508600b0819d4795c3b2cee6fc6b73d74814f3ef4901265a9cca4117fcb57b6942c8272483a6b78cd57b37913bb86342c14a766f59b78acfe76ddf6b6735f19523a634fbb0ff190e68452fe2d544f4bbf98042e085d0303fd34c5661dfd4df82f78593d86731e42b4e829645559ab13f0a327f2dafb5f4b4bcaccfcc74224ffc5f7351b27faa834dedd30ca20e9e9a51c042f9daac07cc04670d5dab41a629c474209c30343bae3a86e50efba6ce500f5a40ad4fd5b6bd2d121445efd07dbf807d2366f8e333ce558981e24084b6ba48978d272928d0ac8560dd11805d1bcb8475e5a7635a63977678f6a623a52a8738792117f81af15ab3f44fd4ac639938c2b2eb15e4cca2369f9ffa63a82ffc1fccb5afd2453931511f96192337ecffa833a5ecd57abd4113a9738ae0ec60e143ac2eaf3c7e8577f4a58f899a56b20944e06f3c65ad6807f0dbf0fe1f50453319be3d1709f2143b6132cf9afbeb6d13a1d529ee4daaf5c9e1878f7f1375d0aa002ce31eb2c278ef4ac13c7db71955e9063a2dc0df214fed647acadae32e52bd53d5c8077853d4c2b8fa95e16d3c8db29857bd756b0e7ede146b9d3ece241781c6ce27bc5eb34a1c832ead7e13f397b149d6a752de6ec9ecc244b5bf2e607c0a6b5a5240e7c42a1f82dd7c9861bc6c6d4ec8ae02aafb61daa581f69981c325cb585298c9eb50741c5c2fcd0d2ed14843e9aa7aecb56949eb18c3fa934706f44c5a2ee4011d3ccee76cd6a662ec6a3f0edbec78bec93601c3429e057502e71c44f92f0ce3e209f17573de5fc43e7c09696ce369bbfb721fc3fc717c87bcfdf563b096b525888b3fac92633730cb17928b0f8d5ca9762811bf2919b0f9f49168a143ab0cec8d2496f7bca4abef3091c0c84be1774b17c29f9541351c0247c8fdedd392e7845fd44ad89408e9bbdfae89c2a229170d36a6f76cf3ccb978ee759f6734e96fec615a7b96d8817fcca6c08bb221d7616ce69c1434c20f7f63e7dd490736f32cfbb6c5c7b8eee7dd2fc6117a40c583f9300cbc070ae5aebfc1ffe6dc64dad4029698bae7ce07e0ff4e65ada4037961bd # # Params = SHA2-512_W16_H10 # Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd3b # PrivateKey = 040000046e4a6d6637da3878f5beac60b6c1f50d2ead77d52c307a70f4cbfae7c2a5ec538b8544760e9576adf6e18f966c07f285970b7f421424a4fc363866c5dd57eed70f9baed4191d5da899d6ce4c525ef1eceeeecc2c6daa114d8b42dbd03662f9589f6e307524e1186d3c327f84d4340a4a20d5789c1ab87be6eaec59afb366be2d00000000000000e96f19f560592d763a02fe03e4a94b3dbb6e9d1aae6e29763a33b080f5909f0c56b3e9149ebbf78a69ee7f11f11a0dd14ee7dada14ad06b0d25931ee403c3efe1fab5d67ae8fd98613204bc033ea316d396bb30503d4d8c2ae161741e2188e054db367c9c891c1dcf4084913c7f50c319960197b59bf54c88c408cead76864f777 # Signature = 00000000000000e911b02ac54c4b3cbb8f89670e816c4f7af63be26aea2b501d11af871a6cf30ac924c4c5c226f74acbeb073b5d2c7f7207c08983ce3a6de4882f8c8bd3faf3a8941a0c3fa4b22e0537600b4947b6acb2962d50c0eae7593167052ea4cd177633897cdef7a031b1796087584ea9cf718161fd4576becbea7023855eb90fe3dfcd01c6dcd9c72c6878bea62cde73295a8db3638883063906f4d0194b6c8eaf74951d1ac559a71c1a5df4b4997d4a1a56378a7c86da704541db582f0d40d599a8aec84b2c99e53ea240212a54eced595fcbcca52238d12b165e0dace6915adcf968ec380677a9da7aa959218bdbed5d1731cb7682698499f4f687bfad8cc8cdeedb14877b54016dd1280febd5f0eb1f380990cff055691b8200a8365bb9429ba74d4ecc56318a92ee80c81cc6a17fd406220798304e98579ce8ef6074a0a62e3a8f1eb852a63f734026c5eaac8347d81db26fa42901c86ab724e08fed83bc0c4034b6ea40dfb3a1aa6801ef25d68e01a1d23fd741068c48ea3f7cbdb2574123ea74de9e68cbe2333efd4a53105ca725396862e41f65076894ec0efd45e0f05f365c736d310752755676335c14e70f6ec81d8825b5b2f3bf5e64d330aa85c90d1517866b4112c09e392492d8c26604264c18a9636183a93613c78781835054ec9c29af7d26acb1d283971d41a10521f2c8b555b2844f7c9ae729e07e48cfc2149174df4981da386f46f2f87de610019cde3b417f681773c0783b93208cc9faecd450f6e3f5fb1ff00c0ce08f6617bb4044f5eed2f025b39a832078df89d7dc74c630e6818dff049c5349226c1203cb998f657e5429b6839e0461fdf02601a6a91b1c074dae8d08c1ca1383946671ff11202d8dede4c19a6d35d5acdf2e80737b5ee4f52ba234714610ab8aaadc59e39de56fcce521a3b31efecab9b36fc53da775bfb12f226ca36bb6e23d5db6c5efbb47e6a59ca1257ed34b86690b7cdadc592fc923237160c372ca241d9c5939c3ef0728062b2c821b6f73dc18b935adb7a5b5b26409a7ed3053301f9a53198839440b20ea9122907b446c39153b0e3ba4ac77d1b670eba38787b5b87e7bd386b6ef7b4f96b7ff1ce0690483672de5389f3f88bc4eb44d53b532fa463c15b86151a17b8309ab71966881657626d00f9d7a7000e7f6b21e1e7623594c57bd6098773b8fc2b27798acf35b2d7bc8aacf729951867021f1565a5e81c9dc8f2e89c870e448b3347dff6811c37b3bfdfacfbcc942fb8d0d51c0c5bfb9c30edf8a1f8cbcd08f7e614aaa2d74dc32627366a4ecdde0a747d13bdfa4bf9ce7591db22f09114686c6a4241280bc7d73c4900e80d1e5d4e382e3e58fd7b58db3bc0a7784d82ae9e4a4acfbd1dcce551560906e1339bc08f002fec171725f82418a109c1c8d4e626d4156c586a6dca7a2002a9dfecbb283a8752597a8adddc0a3875ac61c1ec3ffe3957aede825b2fc714c30ad7461d95df0f03bf12d8e486a3cabc1b455f4a462125b7ecf9a08c2dff0fa51474d620062172f8ff17a75f5c239bd4ad4ccd8dd2f63c80250817f84d4d55025cbb9ffc8fba279043b4ff665852d1b465a9a13bd0f4c4b11ee0a26f330de4f9f6381724a4799232cd8ae52ce9add0d5546b755b120ea31e17738dd7289d747d9f01efd163a20a62548a21bdb45ccdff9c66a08a636d70a220022cc80df1a3b62e397dd0e246433aeb5137df4c7679f53bd4219fb2145ed5b3aa2439f1bfef229bd73da722658761731fd15c793865d2ca84428ca3a62b653db45d56f4e13ea14a2f8d694273362e0a4a256902e26e04b81268a6c0019913e5eb602b0c01b62c981ea40d08b511ead9d95d01456ffbe851d044e308f13b4e3149756e0a59b5b1e6e7f6aced239cdb400aabdda8fa3d386391c9e32cfb4e28f1568683574b88d9ee4401de0241bca99d096fe48f7285053e6b0d01809752810553564c3e864547ebba9ee28906c07c9bfb7ad42f7e3572484b09299c0ea7d38eecbd5cf34d5b459a083192670cfc2130073af56e3cfb79c4441b02d40643b971b702dda1c33afc73c32b548feecb96dc1965aaa4344d2430370dbd383fcb8bdbe6042d1acdfbe486871fb06c4eef0b9b0a65a6d853efc857c4cd08562cf9448ec9cae460de15fd810cb2591d713844282dc7140e0781c4193693b0920426a94b87c011cc943c417b52e0862916c0f6cde68f9b1c9b8028b6ba5d59e74dd5c548330a99c3955b955bb9250a3eaf2c0de9afa240a46c947c3e9469085de51a0284fc942ee227dee85451721805db28521eeb370fe3eb361c0f21871293e7f656711e368be8e5960f89b57b8a4698e6647d9acd2b7b15ab5d545efb3b1e49b3c300820eaf2eabb46f9353a427418c7a2dd993b82ad7cf3d718b1b63ae750dacb1989f175c1d4ba2e036d6d1521885c2ef2483b339e782b3558179ee0ec23747741d7e2df416a570780ffefd975ce31741062e2831f05ea11fe7aa33876c7a0e47462f044f32bb0b5a280a157fdbd69a97593368d746c45dc5e9dbff026434abe289ff23e6a191934b65a658ac6ec9534d6475ac46e23d1f7aed0f0a720e91ec3d5d5433bfaafd1e7daab69ba208ef12ad0d1fc171549b4675b1aa83839698cec02f2fdc1ab9fbd7d74ecba43c65ce95fda376db0083b49d2f75660e5ccd4849a29a3eb1372509bff260db273eb35783c672c9e104d394f7537fe31fb38a648a983b2e156b8030d8b9469c385f669c94337e9d04ea7bd6418ba0f2003f27b7bc891df14e4b0ffe5fd09fd21a370b6300619d0d1876bed4a04c064c10aee05f3e2eef95a9a69eaefedde6578ea415e87c38d6d6d4a19c65785b6ee49dc1c541f5f18110b87baede45d6b1f3456516fa048f977228a230039bd0b960dfbf19912e11d8da699b4287264cec909d5e5260390288fa3c63dc97c8edd97f603bc29fac096ae9e12ac34602b303374e6a49335919fce12d369bfc7c01e9c370e9f01fa90ca69a93ae658c5160efa9b4ab5aef09aa06e6e39d8dbb27da9d572767d2bdf4432fd93c5d709a2a11fdbef51e25cba2e7c43152f22a46ac9b7067b6e85f113fa353d9cc775690da456bbd3974a75a7cfe51a338b97049129360c6f66c32ccd1a0419f545a61c1476f8115e29a1beed5292ec3973f80a349a9f6ac8a14c48ea46fccceae689bd343822a8826a11c215276c0401ee3ef1ba85e46852042a6f423802beba300b280ef6b4255601bf36f08b5e40c8ba39ad35865f5e042c0cd8aba36e7de4744a183a9af5029c52e0c8062e9c7a67a355906b879a6c2a3718104a47093f9cc972db4fe1a2cdc3a5685a9b0ad9e57e528a6f1c563db53a89b5508e91d4894a5f24d3cff90d8ba8fcebdca9e0acbb86e630d00b3ef53c3cefea0b1af6ce7133995dd96bdfeb10625a3647a20f57cfb4b781bd8deee1f98626a91d9569f86284083d04f86100d9e4ff4f38187db8671b2004f7d6f2fa1f165fdd7f36e839d45de519b36b95499e6772208296ca18aec725a94dadee275dfd835e8dd30327a68988e198c05744db4385f28893b3c1579e9b0ee8bd896be452f4d43497e66a9546a20250ff46f43b002e61cc64fb474e2aa338ac5b51114f48acfa7ccc963a2c26e260370e324bc04c1b1ad568c0f5a9df0703d6ad2141eaabdd2859e23a08646809f3cf94040bc42d3a0856d9e9939fb7319cf761cddb6570ec36d7157d2f2abf777697f39c42bbd17d33049bd7d1054b3f3c119933c6ed22ccfaa306a647acae6dc362dd6e94f7dc67e5ec16219e1ba92be21dd417871847d07300e63df90586708f7cf692251aa39d98792250b3fbc4b9c22cc3bfd008535d9efcc198ad9de30ad392ac7029a17ffcbdcf90d7616aa77c706b2536e1a9c0082c2c64095e862c441296b103f72b7aa40e119acc5c01814c11a16e0ab239c6b68648a789c40cdcab3bb6280fc9dcd65c1999caeb83c860e8b4219e4bcae4779578aa714ab54f9a0114faebb9c025998b48af7097f293f56986332947062a3381b0fe3f93b0908bcda36738b70c47ec30444b7c15d0374e60452e5a52599eb502cc125e94bad5218efd09ba1e1f5042342217e16faf0689481594e4bbfaf4bd63f228efa8bd11850bb1db143599de0d1725b21e5b83a76221dd0702ce08db15e1906e5dfdb6abe190fd187923f71bdcbae67656fc84bec2de59aa226fc6502a0912d89073ff1d30a7f1c2aff56ae10b7b4ca3ccb22cc6b5ab2e34a37f6b8540a45c60bf3350184ce41e6d48473aa4b99f71f44981b88154698bee65a377d591b33261fcbddbbaad09f667561a494845993f448f3bcbb08e196fc4d1559bcc444b72f8e80ac6f1dec3495f91a99a65525c2b1e3b17f0f8a5e8cfe064cd6d00d838385c95e347e0c5c38e382801763bca3156fab50ec3f09d70b544b8476cde43facb4ff19ddfbc3ec098780cff32826886d6a6e607f6cf291a0e947dd7d4cb79687ce76945f709819ad50d3b854e23bfa6c6e4484be49f64383b734526bef42a6736cdd833fa8d96985fb63b0359b7492b53f353000e2a422de85bd06dec599295f42a1cd31031b859e948f4ab94e44998ce85f1dfa487f223512a2bcc220c4f88090473b329b3bee662d106bebfbc21ff6450b119ca95e52c00a2770d6c56bce664ab5fefacc4c3b32b0bdd3477bfd8583be77e51ed5b9242af3c2b8fc04d478cdccfe2c6dc35d34b6dd3c8b749b46b6fdaa3f6dc0f129b55a346155e7954a35486edb3e4de3ad330f0cdd0fe4e4d9caff61239e1a775324a03c591eb2fb0a097cda1bda7aa5f00ad11fc42216dd78a0d7e2fd6b9d6543a02afcf9ae26a2d96c69cf06df33088beb56304357f1861349761d459601352a7563bc9d3b9e908215a9d85d3e96769ed6876eeda5a747b1da3582113fbeb6f61feb292357dafad225c4f9d4ea0b039c7603546bca5853be142372bcf1ec46bbebc50ef0d7dc2e46f089c4b00d48ec2b74227b20237e1249a6f5280415bbf105aed6695587d794566411c5c2a3541ef3fbffa8c2613ba794fe311ae9156a2c020dc4b91356633ce917b960b5255aec36f83734382ea89aea7426a668d6bf6af91094bb842979b5ee02a7b730f449480b4aeea419e9686a8d30d1f537ff77f1e916cc8642f0a71dc7e535e750a069531f30ec97b370a98433486ba1b74ee7713b88cf52d2216eccfd07716287724c9f665b3322e9dd11dd5ada7668d2a7b0214933ffc198cb033dcc0fc4c6166acb2a1269da891598172a1b6652d23a605c12745ff1637233bd7f7a4acb9026b58783281485e90da51a19b04d80504efc11bb13b76d64c52264f46ba74578166aa7f5d121d31e356fda41ee32753e3243b5be0ac01e86bee9663157a25ae160941a058a8d35705734368f7c2995144a3817634b82c2b96fe66080d31b93b35cb17924b293e6f3629f39a08ea1d36df97a6464da0bc83cf25596fe9c101c91a9eb2a530b0667a96cf6786839855d02c603939e4d7fab01c90de4bccb184073b2f96bd0b4a2fc6278a61a4c9bb581fbfe9b21601c098ad6ef4acd3e11fa6d2da8db6d910facfb278ffe3b4fe5b61ee5c780261f606ced2ddd8fb530c368e584fbab3bd3dda5846c63094b2e26a086d5aa2e66bb434459ce1819f96b73af15bcdc9e50b74568af1b7990a038c4cf26fb112635823245ab81f504d7dfab160c555763bb79aa335f087443491f3310e2b1b4eff8179a41d3f3250fac8320024bd8d8d20011e781db30cc09c55c1259aca3159a11e058bba27aa31c37c43ff9fddddcb103d185287617e02f2bbc34c18b242048709fee111735cf3afed460e04df94c2176d2343fcbef0606cf78bad866776163b828395f269657d2ecd6de24462cf8632a6a774394aab5ab35024d5993625036dd2a2a277ec3de117c8aa2cf986c13727b5098e9ebea6076f14328a5a40eab17ed80d354df6361554e6db4bf3e9b6588f1b6821d9f13092ae3ec6d0b93cde18bb174a1f02b8b87824220d8721240a7a31075a1fdf1b7c36eb3b8e22ec5fc6abc73e88315f1562835373ea763d54bdcdcde6c250e64d221b80aeff93688653233fd0bfc19299e7853b2b739dad4530a9ac2e3d0bdd5101cf383bd33fd077c40002d3c3572fc0f246db9d8c00072e3dcfb44538224e0a31eda35482f55d247d9adcb40eb8a93ef600cda05c7d6eea5b38321ee95ae33d24f8ddf672f6bbd80017841ba4e2bdca817a1a93f15e9a0d8e2e856d47512ef74995374d1ac74c76654b260067eb499f98fe7c9159cdc8c485b03e157306d6a76ef874570f3694eef32180ad9024af67bc2670f3e2492b87bf49b3b56aaf8a5a04c62e1dfc1c06355afcb96ca4561c88f561ec4d0ee7ee59ff986da49ed1b434c1049043f8b53007559fffa82437ffe74b52d5d82051e686f46e89ef1eb19cd22d31076d3c409e58e5bd5fc83bf4db0a7dae90f488ec10edf5a01cd40400ca48197150a4d4f1c6d1d40db683c037d4eb899210b75e2572ad29283f14ff95a98ee76ce57deb6487e4cf02515d294bf3837ae0235974148677e826c418655ea74e65fd78fb308a7da205fb5a126bf6787bd2b8050eebe8a770232dc9ce3cc6b4a8abef3848cb33f5fef83c9eb4ea5e52c11aa26b75276e2af8ba78f06e068d729bf7ea099e2e560f053c4a2f5a4d24c8d402304cf5aeddfccbecc288008e149d8604b9e83f621bf0043c2792efe9463e61155f6ffab9d5415b16fa792c54f1e4a3c6ee653c245b05693eb156fd221031dee983365105dfa8a6c4a6da41677cb8c6f462ee2b9a3f4b28db6171b0a75c21930e62ae74bb7b02ab9b6299802320c435cc0a1183f67cb3d8f39cc50c8fa754a93589a2cfe8c52f6b8030fcb37d38ab44c6efbf96f6103aca52a131032bbb06d1f8c8acd7133d776f6fc241f176b810598f705b7791fb1ef0697a2be2d44c87d83e3077b8462f9cfe3eff12189a944444ce4f6f990664cbad63b66ef3afd42bfcb6c3644856ac25774a5887e6c5c6095072038a199abdc4f7e48b712d0dcf5fad2c063d77cccd0334c828227b1c84e8d398a57d58c732e5ac54669d98d88363dceaec0240f4e8c409aa48f6c2cfc74d97da274d94bf4abf14e2fa65e96ace73f83ddedeed835c020e6a2fc70dfb489efdb34cf234b8337f8d7c056b4947978fb929d94c5219894fc1827e3a911af2c50178859b546c4c23dbf900ba2d7f90378d27820adac4061e026991aa1cf493cffee21cc1fbd73a6a4ff5792eba491f527f1364eb8bb454fc65bfc594bc9df9139bbaf87078ab45c7b722fc03136e793d9956a3edb71a90404028731284ddc18d079ec6f17d1777f2d8a58f07aa20c552ef1af25dd96d147bffcc7d5b810acc044529805b7f5e8b650c30d06f7b3dc022057286e90d28db14091bf036a4a7b3ca03d4c15716965b6be4c9483d347e31481c12346aa656681ab55bce2a68d78c39f42d96f43aa725963f2b10c2d88ca93ef3c9cdcba0b9a37417e2d06e6b82756ae1afb8294faa5d6ea1bea531661873710c23b45ae697154ce45185c7e5c89f74a0161620b0bb6b79c77f4c2d4ce5dffe39850e3361ee02acb9bae127ab7699f5c2e63c3047c30cba004860f03889ea378fa2f0ed481f1c3de681e3ca1a75bf46e212fc13a9838967263b283a7aaeb822859df5601f5a9c5fa85cb973ddde64078b76ef9af231497e810ad919d4a393aa377448f4d0182f38ac5723eabbf57bd77ba467946af83bb537703bcac6129ed025dee1d329c8f6027a274dfa6b286e592578fac97927361e33e54007d31fecf632f00402b48a124641e0edb48ad00c313c991da58d75aa83d30fe5ff1e23b1a8f4cab636b0d2e702b5e2a528a7ed181e74ae46d7acd3b52e05dd5c47da617040c950ecc4003e99db304e8557104f9c708db847a876beab07e51eaccdcb696deaf228802c4bcd7cb8a1a646dd19f0ef22e6c032880cd8f4b8c89c5289eca27b41f686c24a90f0ad92006febe932ec550ad706aea5aa872d20cabd22bf70c871cb12247b9a82f0490df9683ec72c2dd91dce433905bc38e2e79738330522e7b9a9dcf59c000d77503f347480bad1738e1e3fd855a12f08e8a17b5ee9ea2a17ded76f3d22287ba2e9e06a5b7402c46dc7c2cc2677499af64f23ea6697d0c8e3b0f39ceba58d25f7effa157d7be05b8652246384bc011e7ba41a9cf52230dc30627bc283adb5e14033b330ce312b3c38db84700bbc8b23cfa5810742e7780b928d4b189d6ceb54c749e8b92ac4196665de5415c5d68a51aeabf5fefd9af47ecebefe9e86000d6a738936cc085d6051528c195138bfea0b1035db80171af05c8f85399cbb7ec64643a9a5c15ee1a77c618218c1ee2ae7f81c215b725d341afa229a48942c7737cb716704387b3dbbd3b909f18221b77a9fc84b45c3fcf249811dd7b902a9b79cbbf0c9f14fc5f9bcf2632ffd16a361b9641c766471c0d1b358b58e20e4eea27562ea6d083979fcc2e7298cc83f73864100e8ccbe90b0612cf13973553ce6225facdee75f8423f5500dee821ca24761fd611ebe4429db828ac5d110cf5f7bbedc1f4db430dae6735a89977d68336d814967e98fd6a165ced3c8c1946fd9621a2a524dfad912ebe17c2edeef1715eb6e3c052e7f9ae2504dc93ddb80acaa6868a1fa470faca27f804041dfd3d1a3f033d8edcb23292cd95d1d831b993e859d68cd591587d14d779f71d1deec11d31e78155806d195cd93c0aaa96801152f60f60f83ceff61fb9b204139a7a4d2017731f1fa365be06ead041ffe4fda8a4dd78d83fd65bfcbb5096ae5c05ba1cfa42b6a576d4e89d8bd8b7ecd733f727c115b1c22ab78b77debe248a57c66077d624cd0c9740320534354b50b98e36c7bf34da4d5974616284fbdffda914f63777c8a798755a8de25cd1ccea0843e3caaa04475057a5089b95045bf060e7e9a31e9da715b75231c12b5f8e3c0ea5ec36da1d7f5acc73879cf17bbd5841969cfcf267f80360ed47875426d85460ae1575f343e0b6bed98c4522eddc1a68f3f4e5b0937e4043a217d29b8822f916d40904187d83886b0b59c2c8a3ecdc004cf3d0b42792b4c45d4a4f2bfabffc4e14699cb9785d8810597e372e6fde001afc598916313b9c65407e6b6b6350503def780664e6addd843492399ff0458984adab2cbdd899c8425ba0c87e257c62380ec50b51ce698c46653a11bb482aef1f278d3f93543107ffd293dcd7c7c754bece113f572f667dd6dfacd18b765110819342bc7108d3b3a4aa6a69f066370af22816901a4f987a70623e354c1fb911b3f75a48a98a65621175606743dd8a55fd2f91c0f6bf586aa2b3404443e55c2eedd3cccd74209eceb37da7f03a9b5b8a0953238e446f1d9586c778e36a45c7aa884357b6e5fabf20d0717a0de8cbae0465a747f693425f830ede29786486502dd0cbc0ae7685782c970230c5ce9565973b78a477b75ccfd13930af64d6c6a12bb8349f6a10f87744e2ba12cf05fa1e3f089d488452cd517cf790de663ded8d79e6eb7adf5e113e731b165ef9fa178807f6772b5278ae8d27961127a49174b1f2a2e86cdcbf4006a7c122b0b351af3dcc13a48bfdb6e5deae234bfbf6d96abc0523cb52f060f5edc1e5cf5756a067cca0c5c464156f3388a31e3d4ffdc72de75bcdfbba3f64692db5eca64bc8f24a97b9aea863b10851c5cb21a768e5abb1c571e80231fd6e5f65004dc0e12a97d7c88c561403bad19daffa1734fe20512cd2fded3e70fd3c65a2afc6141839248b05ca3b1b1267eafa090617c374d7b823e0ba7bb491614bb41a84479a1ff999b4cc0d4114d61b292724e63c378a9f27e5e878ba172240efe4089618d65c5f4f34c99d11b2710636cfd1ac938c8c5685cd008c591f42cfb22dd85c4dfdad281f1749f9cb7d27233e6bdc37121f7cd8597d5ba12474512ddd6cfabdc77d3b03dd82a02e256c88099fb51993ef1ec00b70d9dcd64990695c84cc1b649e86762010704653f0c6f498c965caa2266175c56874299dc83b5f43da59fbd2092867e2fd10eefc72cf063e2eee53c8dd043a09a19263eaccf123f2a4090cf4f5b287c049bf3edc2e553d9d1b4bb314b7810104cddaad4dc44c16dfd1109392638a9046d5a679ca0405ee1c22bc3b6c68eb4b915b05661007a5d356babc922f58a0ef027813be7bb79f8e1f42e869faf659cceffa7c847fdb3ae02a9bd89c76bd92363a287ccdd266e7da46e36aeaefade2d03e5eab8af755bbf4e4e4d206c874dbfaa558b8a5d7f34d0f57bc65decc1cdcc5a62a05bc0a596bfaa2321e1414777ad366ece6790c392796e430793f4f82aa43d022f24698b5b684e38a9d7440866cdf7fcfdfaf83ca9a555c659073a363ab0cfcbdc13361ea79f93ce08da7465d3fad32b8ac0a70d437dcd5a1e1212a1a946b9bbe72f3cebbec58c1fe1595ba0dda8babff50e6d8c0928490b28ff4bb2dc15a39ef617c2cf4ecd6d39b67af98ddfc98c121ce89fac795f00c20ca6463987e011a41153c40cbb51a9b03842ff774be0b7eb63ae2bc3c641a748b80eb52422aa26299f1d94f9db51f26f8c2484fa0d823b88261bc131c8be17bca2603fecb6d8d364c87b0269855257a37235f1ff93442a3106bf6d8dfaf42e93109df3464618aac53b0b8317682c29cd71206fb3ed9c3f8223a332a528ed16b81bc6a0d51c08c1a72a97e6629237f41bdbd8388c45f25cccdd1a5f139962b432234188ff02e781cd2838eb9ea31cb280c978a550eb524b89fd23652ab6a86666d68d4e705865b5e3c1dceadd3c44862bc037dc6656eda05cf0122333437407756337215ffb10920731fca8922baae1c72519488466e0d4dfc4ec946c3a2507522a9befa5d7872f5cea889336a209ccf308ddc9863e6f979412e526498163eb7eac429afef79d4f157ec03d11770dc20b106a2c7c3c17ad6b6cb976215b1788783f80447a50ab3855e4b7b271b00d29ca965fb0acf20501ecd5bf9eb319d2515f5e4398f6b803d25cf8f8b8102a9c9ddbf281b60e75a555130c6a0dddef9dbb681c85623de3c995fbc1ce77f90a6a720b4d5e01aec7a745d808a1c8e5e12d6e8b55b6bedd48954cfb642c12506acea06033d5a4889534b028e6e594e25d1377371233d3bde71c8901e7027cf34134e9d9958cbb65d0b401341d41acf677da26d6e586ccb437dcfec469970a687eaf117d777790789a4304495040bfb6b965332e87c2fbfd18ecac6ee22928f95e2af447b46c27c1aceb554e174dd5732b1438f090b5e721dd223b73b4ca9ace83d3250bb19cf1eddd5bf1d86e8a69a9fb6c4fd03f8b2b3c6df29701a9961a046a01f67654e2e16027f1670b5df9b5216339672d1742e6f907463772139b52c3810ff1f6ab40d02e3efbd9e3a9501f4fe3a1354fe5119697ab55d31840faac38686329a95374cf33a8753491e9774539054cfbe203d366e986cd21644e0801044347a1227462c39dd937b339fb27836a9f7cb383b5fdbfce93bb887152bd72b96577262267216d41b3fe09cc8ec386bd480e0c889377356e7ff59880df34d45f426188eca237ad2dd52e914283f298bf66dc718ab71d55226ef2b918502b47f5b521b4db005be9f63fa3c5da3015069b8be1d53ea3fa7b637c811ef9d8bd9b669fbdb37023d1881e124321f97435da9806ff075a470f9d83b524a0b1ca59da3d9e1ba4a6058279983d57f56dcfcbc8130f4384b53ab54afedee8efa9e225003850ba1209018dd928ac25c5c5b3c6fabc3e49c4f7d7d02fb02504bbd006c1e268e193d287ff9c210f48cc1edd6ca133ad4b03014d3ebe0af73aba5baa7891ee659aca93260e0755c115a394224b22b0a36e51d014101bf0d6610641f650dd3d11710af8d43f4329876ab8e0db6f2f3657238794b0850648279114af52454823339faec448edf0fa371659a8db7742a61461cf96264738ac719bef0ac530f4331efa20ca9dfbfba2a26b6e92c20191b48f993674028cf8a906a0cfeef4f8a689e1ff8e8ea185dd79547e9a90eb53b99c7c8a959eddfc358732dc4838eb1af1149f51581c8b9b7ef5f0dcbec3df231bf626c54597c93e8daba5607c70e5fea90098ddf3b124cc3deb1a38ea4c6000268e4198eedd1776549c85f857fc2841a1da8070dfa1aa8b1682a4a85462bbf94570c1a7cb240467283acecee2cf278f04c2b378241cb93038f52f96b0bd50ec53574038a3e94aeb2f59cf5cf0ba3607102f43f2e2105b4f3f6c84db66c4b4d72e38d489c0de9add996ba5cd9d67bda0f7f77f2db1288878ba21ede51cff61933dfb36dbd309a193ba4f42fcadd22eff3b67a780b37a1c42bb8ec017178a4af140998cda1d19daeaf72228e0423ab09727018b303bfea082b4dd6cb273d46c1416968fa85a4364eae48ab5a5565bc4404d3dfec74115181261443c95f64308849bc0c8176ece4ff4269a68a73e519f7a28a014780f31eef1923ab8462e88b2b6a0867a6bfe02def8c9c6332ce86c4f268aa0bcf238b60c802453e7ba5548a44102332380789736619a4ae399d998cb49fd6a81bfb9a57c96c138e4c537f593150b98840b45f0e6cdb3541e0691a805c1eff0203a14565d255f29d2c2c266f75df8a8c705404313c56615231f9dce6f7b89ec4f05a5f7131135ce27a2c8f8ae12ae642037143eabeb4b66cad4a70e14315dff066c5c8edc56902c4f3182baee957067f8dc640150fd6f982a2b0ec1db243b6abe5400ffe98ac190fd16d2389eb30090cd11bdb84155281fbc3574c701004c76f11be4b2276da3aeef8a65a0b627cf0cca01 # # Params = SHA2-512_W16_H10 # Msg = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 # PrivateKey = 04000004d18dcc8dd98a4940f455d2d52281632ab0ddaa1d46ec87917561042e6799492918c994b16a70bf6bcb2dd5fafea015be5fb24697fce355c726b5c71659cecaa65d5dee64b8382775b220032e6c992e3f5cbc3b7513809526457cfeabf3b9f3d5adef4a99e5c47c52ee63736f6d68b0addd4b45c9b47ce25c8c1612bb95962e3b00000000000000cd1202cb6d6097d86a0004eb6e133787f58bd3234f26f33e744942aa34c57b16b6b698a611f8802733f8f1af7cdaf6fc8510b8fc6f15958b3f31d3d8d394412fdf7130aed86eb8b301094b2992f28de77beecf0eeb689f177718d72311f5c0ddb8e81a292210086a11c1ee9f8b75e4c031473a45bb45e6445b97ff7f13507bc950 # Signature = 00000000000000cdf9cd7c76cdae54ff5776cf6cd96276ee646a8b7b722cfcc3b6c2c1f94f83c28bf5281a8804528c58afe436bd2e9bc0743eababcb0cd2f27e9600e333ace5195cd5c566ad0bbcfb3b5698beb3a45fe4c5674c91be6e4e44bf3c0487d7e32579e978c5ac33f71c40b4e4173e31b7e740ced94e2f7d8ffffc02666d0ea61257519faae42f981925ea3b55813538b56b13aa88b132b92398cd563092f8b2766859ca30bd87c912154cdf570026d4b24aa7b5acfcff2271cc55f82d1ef456da55a80960cb1591219ee5766eba3e1ed4ec569a884bddb8e7edbfd96eb53d3e3c4f4903c32891dc7cb92544069ef641143262791889f463e93d89d1f249796fd2311ccdb7957782059fee04b4dc3c5c5be9118c74ebc0dfd9e430d0cdce53a9cc2912504037eb06f4f0272f4e6ecb0c5e2387fa0a6668cb587fe563d2063324ad84db8e65d5dd37c304ac29d49c62435cb570aba57baea34e7c9e8385569b71dd670e2b2f76949bef82464602f0b47e5f94239552ab4ea0cab79345683ec83763468bd10a09b9689752ffea94e56d2c53be074a377690caf68b580a7d93eeba293e83e859b879f074457b05f5c8b79dbf78a94cf0ceb4b3f24bf699adafd1ed871fef51688feb618abb9e4b3b2b6c99730c23612cb119f3b877690ffabee2109e3900d7e25ff5239aff0d9eca0c52b42fc0f0edbafe4619925d48a209e0d44453dd9205c5b31d20002ab7531212ac43585762d005689fcb5d7c5f829ddbf15c1a9501e5e3504f1cd8ec5da77b2005750b15653c3c8735973018add425b03ec0904d6205c48a9e4f87dd3ac55301849eb3640fae2b7a56c1e6e24c9facc6789038a6c30bde1627e8bfd504c10f979038c5a791da900e52da2dbcc902d79c78fd52cbc844b5f3daf7f5ad243153784e6da2730771ce8b438f0cb22d4a46fbaff3a892fe26c43dbdf5a22f17e5f0020fd360252f9f9bdbf11c0101be79371f686dc6e9781adf3b631ac3c3b53d15c43f4323d668ad748190aff45ea436ff6226aa97c853f994ce480b582ce05129730ce079a8ad2f04ed14e3bdcf40b4e4af92c14d8bd58008a97a7cbeb543b635174976621a8c32908bf3e9db3792d2d87f55699c43c9e0d2616c8d51a43fd35734d7847bdf2467dfa31108e476b8cb39e4a6dd38b2b1151d0d5f69d21770653737540fa94b0d45d102b5d42af7c4c0d0a55d74add9287982e7108def6a83a4c697a163cf8aed667f8f664a881e5a255abb452fa0fdf8cd4d2a3a55e7177e4ddfcd4d821343763d96470cace9628d650ee356b8554f803c21c83794c1fa7066d1ee32be2d5a232000abbb24df08403485c9b3f851cba3e2b58f03541d60c1af80f8453f25f70f55dd720becb4dc18ba821779413f89c0ebc2fd6bc2e30751b912d80af53b653acf7590fd567d438d471166e09793a5ed6a77f8b1e5de58681d72da9cf35a34fef3dd296683ca125b3f3ff6406f544543973601e07fbbd435f413a784327511e8f06e4234eb361281f18bf6ced8c2ce961743183adb4b279e05e413213fb80ef11cee93170776c58a91227f9b6d7cdfe1335de95e2788be49d55a2848b5f8e2b32f85eb3ed775be2526392deb7ee35ae7c51d26b1e246b0a149bcee99133be93fed2ffaf982d49fef82571d85aba6ee24480e7058885cc6232c92d6922a7bbd09ebfa9457876d4800b8ac86598c535dcf90801271010e048f1ad96a027e10d27d769fc1afa5d292fd3078d59c675d912eb3f37ad963148517ac8dec5c753f56d71d779f5774ecb1a730f4e0ae46d0740a92433de0711d53ccea7b561fb7a57754afb388c51c19986893cd71a58c96bbb0155130270f299b8d6237038b75f88dc6e7bc281042edb76daae36202896ebb8573d5fa6065f48e117264d0411b2d50136f1aebaa23d28c6cd97b640991a11103bfa5bf17abee2c19d105bf8ff1aa97b95a1e396814523d3f223c07b002d708b971d081b95be594515d462a098725e3928c545faa39a73810854b4801f20276365649f35c208e7d8a0a650090ec9029528e813bbbc4fcd9f5f0e86c649364619d717a0ab779750d985853cd375f39cdd5e6a7f51d36b747d6af746fc352b0bb462ccd99252768c533eb1011bb3b0213fd72b9210da8494d165674ba398d6c1559234943d4776da019dc49ec97517a59c4869fc4d577d2862a83b169e615bcd4bb6695be416334af499899bcbc4e10a96d57848926c7f990ed507c53acc083c6ce49fb45c737bd6b8e4ae66c1b49d70616b4e6b6878b336d9d502789cfb1463e01d471c1ac72973e4c05bcefceb1e5f1f1737a2f76d0a31def935a6d9f3d3c8023671510ccd0b918ae49a92956c0cc0297a78680a2e58a98e4ed7d9e62f7c62cc27b50ef8d370d199f7e5edd87bfb69e2e64023c9bf10805ab730df8325b1d5ad969b2191283dd0705b9118ba13ad9fd84e057adfe1e7636a08078cc6a6ef1210064bf0f9358efcc8af7a61c0fa599339e13a6df798be29c6b41ddcc2f2fa346912cdf18f33e28b5aff239c5ed01c4dc5a37ad9b029875e554a9ca945bba387ac949c122b384bac7656d5ac04c66a9ceeec2ff28d08560ec598c5b4458b79b461df4a9f49da50d5f7b088b27124d864288e6d77d29878e9164aad27cd271881ebc11260a6989fdff95fd732a7219408a002b57abc2e912cd19d99fd35d3a6627c1dc3de0a46d396f841f5a5653d2daf7c357a43d29afadd91d7afcd6e5e9ed116867845cc3326e140533b69fa715416ecca749c7046450114e084aeffc6ab5dd72fc347801ee571c59dd68a54d6149bbdb1a568e7852ca26d792300cdea8d97f6c3b7ba0e395aefd1e7db15e355a384a315b77826bbf59512be978f70db1589865436b737ec4d61cfb92d8cf3532dc012644fd94c2568daec76caa00c5ccdcdf9dcf5638bf2200ebdc20dbeb3d30e1f7e2117e1c3acda1f4f6f21df13c1b8feb3ec3f76765705e3fa8b758cdf16a51157a892d1b276e5a8efa0999869d684bf1f6a996a3cb6ec82cb95b08affcdd112df8598919c4a1400023b7877126c916dca1feaadcaff8d4594a78306d5cec3e6cf2a0ff1e99c053c830fc0fc5ea2993dad43ebb3afa382be573f3b902ab08560a64254cef57b55b96b0d0409291ee21a8d193cc35d418e7685b464df82dffa4ded6dd003cb3844f071c23de5a47bd833f7b9697b6e329314593a82f8a744ce2ce98d71cade5f35da2abb74a118235039f9b9bb58abe70c54fd3925421643faf375440d1f293a658507f05ea5a89c58257eecf04f0b50e90268c51904bb749aa5455cc62b9c0a28dd5adbcd9a3b0d94b84210fb637878be88c010fa73fcd1a92291ef8c6d59cbafa8c2bc25f3b2b6ee857e297f243972af0379a13435a0646f7956d771f930821706388a8366b55a4dc0e95e70a00d858743b9a908f74a482ef20061f199c4b918c6d9c5f5a2b901b6f53ba1672dd39b44bae28e4dfa024c83b16b8f8ca86264c2effa4aec9886f5ede4c2049a5d86436dcf8cd3a89c62d842111762b6ae0e54bc7ca27d2d33db37f23f9d0094ea9354a701a876e469451a5eec377477e90f07eccd1f8d255d93b81260058007a957d5eb977ca0dadf4be94ea02cfdabf3303e1c114885091a8b9b647106935cf0ddd129c7b2f307da12f44db07f0ff12ccdc5114628b178cb50ee520f56a05d2e3c57d202cd4efdf8887012e5ed5a76a11d21577df5becd0643d1ca82c6eff0c1718875bbf51e9d11b76d4b7f04551cc1931d2c76e52b06d3677ac3566ece11d543ac48aa75973d0cc01c4eab8cfcdf7a5992adf97400280531a2651534b2c7924d8743b7493ae0e317c7b43a9f2b8866200645e2f08f7bdb9027a4079f4bee5b24ada9b1bde6fb91fedd9cba3f5008cc1e2b9dc87d86522d637cb82f24eef7145f2e21378f0eaea14074ed559a7d81e442d09b7e1068e2e30cfdfc1aee3ff3c21b1f32e0fe5793273929a35d668e0de95b521ed8a75e1f71a9d8f276ebc5bbb912a8a6d1e81cf7d00d91c5c250b31308a996e4ebd4f2c61859dd5c0297d894c9994c166ad488e48ed2c752235b62802cd2a18e94fc222de4befba39bef14270be1784aaa61bc1ade7676d4d983bfdf9539904514a3c0104cf153129d107bd7bce8c5e5ff17af462d3f7b40b70ee2392825d917c341c2a431120720ceef564f0795bcfb2ff512a7c7350802a686f27553ad9100b5d758bcdd8c1c729e79c5850bf7c35dfe414433af5ba6bc91880a8f9d106b798ca105d27b6d9750b8b42c7cd11f7a9f728637e9d9dbc9298e4fb26ccbb28c331edaf2f3c69c7d05f33e031d0e3a26a8f07cbadf7677a5905e8c35590f576a516d2899390b0e7e597325570ba6822aa241dbe20e18d06722010f85c739e595369c3f7c3decf86d1d94b787f3ae1dbdfd0e0e6c1f2a793a8915cbf38d5c338d4c1423762e01fb32dc3304b90c20d464a669fafc16f5794c5f307b03684170a8331785b94fba4d9f8736e5c8dd97f897a56cb5b76081086221820cdd6655932faaab37fe3aeacbe96e9b061d62aa740a53392d41c494c99f6da4d4a51c4cee9f6bffc03c0f137c0f574875ad59de87dce9618714c560bfb565a28c5601feb6298b05dc965f5411ece6c17544843d726acfb62a2ca22c2490efdbcefe78eef8f45add217c7e269b0de3cbb66f43c232ca3870b72566337e33928d7dd0023be7ccdef4d37a7826d1aef86df86ee6b22c4c124a3cb9f592750c01cee83ef9f2e6a5ab4de084a5e2278fd1d91de96b263df3873fbd1fd0039d93e78d2466b6682249edc922798e1e35cc178193f61c220cebaae28f3d97d861fb7d48b2ec686306fd659c0c820434b4bde2f3c36fa248f4dddbd8c8647d87574ea6e72bade45d74b7716844dc56ab698b61817cc47c7c5627dceab25ee88ec67f50a750bfe4453bbab19552082ebd31e71c6c29301bd99a2f984ebb15468359767ac9ee42ea89cd5318ceeb2e3f912be37b4bea2a3e09326a63980f8313d7c72fe189a82307ca15b5d6656967fd0adc18da006243d312033925875c7978bbaac0612ce41caaf3679f7695962d432928158d1b85cc1d2c6a749c29725b43446478b9d6adbdc45698d76654fd5a0729c259617796217dbbde2b44174e586a351e45759054cd492cb6f349830f32d846a50296ac46dfcd6622904effb778a29410ec50239851a368de5a579d32c35c28e744a5fb26a3eab1353240818206a5ba9fa70d33af667847ad646ca5ed5e2ae87b976070b72cf2e564d77dbd847ea99c7b43d450dbbb3f0bc7fbdb24b1acd8f71b4e9eb32b1d227a735409e4982454a3dae1f09d1eaafc772e0de0c30156cbc0be10f680b5b8a5d6008b9ad68a9dbb564ccea83eaf2c7ceb6625e990c883c3d0262668bded045a4cfeaa262bbac139c97dd0c725616949b13649a0a998f54daed2c208ecb17da79b275357a4e01761af5c28a26d83461630fa249ee22bb5531c8c82208abf201247988871cce931fdbd10ff686939734dfa5d9ec96fab1e64a19df47758611337abe1e12481e8831b5b75905996ebfdafb08c8892552eb0a1db5e615e3450ac617138400bf220fa7f697ea9d40424dc57f7fddeb9a2a49bd3f7295b498b76788e82eec3959158b873faa16cf24c77c40e591019c81a488857517eed9bd988a75e7424d418ded49d9323404811c68099c7329326d022eb93b8d38cfde933b2e4573d98a009c9d60d4c68e9c053d9bcddc5e7ddff72c5a3c182296f28ca4e7d26687bb3cc33a5566bcd3ac9f5f697e72e85f47585e615a2817792241870ddd542fccf98fe930ceb5a71261015a464f7d07d569730d896d85ded7a0df2b6214d4e59a6b11a89bc09c1831dfce60a0cd86d133acf8a1c5c7590429f9e636596e65b57d3e0f7fd770b9835da221c0c7c41c57435d47d985f04ebfb176e1db5c9a2168e283106bbebc7cfde00e333a9ac81b41b364c13beae8c3cb05fa5d5d83ec109d0bdb00ba598a6692ca1835e36843059bb02ea7b9dbe10179f96790d7cfe4141c1d139309b40a4e3d24e8e4af99d9614ec260e444c9a87004cfbef3cf97939394d2142d51e32d1f5f96a190cc7cb46531140c950c2344c6d1244f06ac634547266236ca21c7f6d7157f5c4acc37ca0bce269cfd5c49246f8972ca8a6d5a0df02c4af9d503b279e1e1d6a54c0c76f226eb2db1b7b1a1805d8eb108bd69afd08a07e277df93f2155accd2bd3138fa1bccbe523bbdf2b89406af17d000d2db4e4ef452200b54a8fcb9d3d69c3017806d3463158beac09f2639483bfa4fdf18ad9b24b864b185fa8bf1c09ad3026448c447e60676b69d693bed841b4d31d8a3c66bc593ff2cbe80d4280a5a54d234d621cabf345ed2616c3e6f62b310e1605a5293491106b044d58d7ae3d337714b25ae264baf9d15ba66ebff792cf17e3f7c5ed39a4d868b1a8203e5db8b9abf3e0556b2a9de7efe44bf7c3b7b2730e1b196f19721ef3815c29dc5dcc1793faad2e1b364e7b9cc7058211d46c4971c1f3a47d0e045d87e80c8d10878968a89b85babaed1a5f0eac00af8fa43616ceac789ef44bbd2e3c5d19fc49c7e811047acaf51c3cead18fd4f4e46fd8e00678546bf75f1a59f8569563cd2c5e2a0e4a4abdf5910563d01be76d59b19f5681998a531248fdce07914f316abb2848b2f4bdcf1ab507d368b01cae071bca28bd09b0f6fb33f5ff5416432edb01c9110c9aa43c86011e3da10c86dee857a080dc9d6096ab96eec57801327139e406497d0b8d6d682e45fc7d28f43dce8afe221d054b49402b6d1261e59a722170efa84cd6ad95c431687de0e95f09f7687f4578a66cae36498490b4894d124ce4c324d358e31e5fc7b25f92cec9a526eedb2072da340b0520317ffd13b00f8102f1bd29c9ae1155de8c6f04c36fcea6d82f97d5fe1928ddedf7ecbddb89e0ef6cf8b2efa89de89984bb15cc3172d18a3a1b2543b906b91d72834240d72c1f3b86fe40603b484ae39559a4c97de4d8c837ee88572d364247cae598230d1cfc6c2fd28cdb53cd7e24eae6f0f6e5ef7a0a98118ff2d8cdf5222da6ae88704161a69bb7d8ad6311e4a9e6e04d5479d450b570195e3db7a632fdace0dfbd8c51429be216cc58a085f17d468192d4d964dd545d69c2a73175ed9bf92da8dcf71324cea477492c2083a294ad5c8b14338cce88e44bd1f176643265626b98852b490fbe8ab58c86d63937e7a4a72caa7300aecdcf458d7c21b8870ecb3b54f36e02a0cd4c423b4d36df6b42df81deb9ec27e588cf5ef623997c82272e5ca621a98f59fee8b36c822492629be262f2f5acbe65f5c3707f8ac1dbfe69d64494f3952a581764a36638183e5f03c0ccadbc00a8d524114924a1799fc0b34dd735b9099c0484d8008a9c9b1bf7ef685038f9dcdfc5d63f7966d944abfefd95fe68caf73d662b48827c5cde27cd77015caaac8cf1924daab905fd80d94c4aebbad7f8015e08ea24908746b5173f78b95a44f8bfe98c7741ddd0f10070c377b7f4e3c4d98a4abeae91f0f699a380a2d46e17e10b3da0488bbd6301a741bda1a66b4f5e62a72936c987962066f6bd4e5590209fa43c46c85d921718b6619367073cb2cb1419930d44bb7c6ce36797fd0c1be2c8af789b1f08ed4903b55ef546993ea275dd320105cd4b4660752c8eb15b6c2c462506e6a4292bb439c014289c2bfc5ec9dadf8c929f17c1dbcee8cfe8ba1cd58d72ef7c4e272de898c367650cf4d0b602b12d35847aabd3a2b6a1e4d7ff095797104c2de2613a701ed56289ffd846b89d90edcbf0fdb05d7709c3822f1fa907f33390114bd2d99bfa7520c501f530db275a0e08268bcda54eb1e16b0b7321564c425d2084c14af900288199caa2af3035e7a3c8e48b58268a30f3d92f161f4db4e58fd99dae7c90ad0e5c77182ff4ae4df4b32d921878f4c8472d483a749d39d5eac1051cc500108dac9c63ffa68ae0d5b72c826141422f8487939269b950627554612428fd832336f92b8ff22324ec66145b00b8da770340194cd024b5f9e117d37d72825b621ff50f6d384fb772fb5b209003af7d1e506f9aa90ecda16d3c342a4683fc4845dc38cbd9d788e21f4bb25b72e0ea8717f589f77a181fd0b68505934454704c3bac6390d9dd2fde84c5dcc9d54f1e45d22e0de6a922a781a3817225e2fac7462c62dfea3cc276b412b955da45a9bca36c53cfa44bab5c0e7d1f483101f812e425d11d84a52a4849225a0da73b1eb36426056a84f8be54c79d9af3375637066bf3e8599b86a6e7e8e3684c057ca3fe19df8ea30b893239cfc65fc8eb64ea78a56d07ea1320294c50990774804507eea0f1c83a6e224987d85a332068921ede8564b103b3cf0f56163887a6204fc12a86cde876db16e22586697052baa421b365c4e2efeb72cf4d0699110106eae111c8d23a2dd6eb60aef07f1ff42f59e51a7a8d77fc6bffd131651d9012dea78bb5b2ebd6698ec027787774e961ee11f317690badb9f31a20815a2ad9113b107c15781eb31f02a94be01d5a3da8b6e76c8bd70a3dca7f87d00ed746a2af8b8c87821a3c9dcbfe7274fa8cc3db711222348c6d9718287e22e6e310afd70f09c953922b9aa2256648b531dca37b763804d41d460451c5dbfacd0309fc3765aba713c8c5f8d12ef0cbe11b4a0450f8eae2910e4fb2b2922a2694dd18f8faad18cefc729ea23c11804ec2d82b9a5cbcb57ed06ce0db72621c19938018dd6a21f3a5bcd007ae730d4102dc832c32ea4ef54fe3c47a3561670d3b11f6e8393341ec045e8fe7d8bf11bbef22dcb2f40ba1b3efc4385ac522d8580d25e6392bd9cba963e4f6a54b112d543c255a8db2c1d2e16746781e6dfbab87d71ed73c3b62ace31a0a7236e39db2ce38872a64067b402edb4c86564959d94206d602d39284667cad76b4c7479a39c1ef97122a9dfa0e3e2633b8b9a3d8eb196d8831802b9b17f0a39071954e57301d2fadaa767d8da04d3344efe34a0efe42ec5c787ac8374fb4e9d6475d8fbd0f5de96d9ba79f9dc34436b7f257135af1e9a5978226ee342f08dfa1d6aca16815e5f75c571c4ed57e975ec09d5825fe53552a117d245219996df1d81490f7477531303f0bc8812732bf92837737acd0f3c4c03b9a744d613e28fddf1138e6378e47a097fd69f806b4d91a17a549debcecec08d342bfb32c7984f6cd7afbb2b4012b3555d2ff88c56e90f596b99967326ee5296f0afd403c31a0e10f86717aa8f6dc4e7949c5b9e203058e27e7fc34cca29507a87f72be7489d42ceed220b555ce014887c0f3c5c98aee383ef2dac0bfa98043f6fbac56afa1de332cf6cc4aa310c81fd44bfec49f1a19cc5e97cf733ef545f5af741ff63c236cb6e4cf154cef9b73b4b33d12336d73f3a548efbfa25042a58176a53640550c1c0195167f46a0cb2bd1c56da0f8ebd47ca58ef673ef2c9bff0e034237e61bea0316b1f42cb0686f72f76c29636c97053b87c7b9a3ca188e1b6b0915869f408f75e93cec7804bfc5781c2fd6c03b7860626c6f9975057c71edbc12707dd032ef1e742affa79eabc65ac9e89e6a6c7342f2246b2dfbea036b9f46539a8cefccb3f03a60a661aac87688393e5231b6e3edf5728d16c09663f2698fde94298e6152abd69fa59ad4f09d8a6262d4b941f8bb9500baa6399d2866f2b3996cdd996ab9d2041ae06642909dc2cb20957bc1e5a3e8d7bd4fb065aff6c9b07d13b2b7987784106295260436b7c370dd90cc0f4257399330f10392096f06b2d0a2fab0de3f804fcb6573af0a270930d156f578ac909920452ea5783a1da7e27d230185043022cce31d391bd12e924d1cf49f5069f8e6a1b337eea85cde4009d114f62e2e044b43460bfbef4c37c1a037fd13ef39813a23f1a3cff9c9aa1728d058f694b005d61e5ea463b97f54cd7e2de1a23803ad1d360429b431f0c2354844f89ec838c7d89d8f94a7fd0c46008f85634e4fba550c9feae3fcaee6f6b167972e592bfe81d6ce3a415f167d976de3dd9d33385e1e8843de43e7954fee4abe1a3f0247cb68db4c3898dd2b3f43b80d00d92d47bebd689b14056347fb189a6161d7447b472913752c94b670d2c241d3d7ecf0809905bee6f03ce378704c5d5263f33df65793469634000de17c82b1d19d7daac20db49665412f9af8921eaab729c058bfc5e2a77a1aa319f7e4cb6c474c4286eb12f1ece612cd5d4d5d44647bb1b91316a2ebbeca3f612243dbb9947821ec3e26b312ab995eaf25d5a4b51e8a44ce533673a88a78ec8cb099dd79ab04e9ec17d9a707b9044aff063e70aff4786f16ec16a220049037450e19e46f3e3f44fa416d84fdf13b7ecede25b7a928b453cdf95e923b5b2de5723b67749da7e49b6b24d767df9e1f1a4286565117cef6c9a9e942d0cab9be634b6838ff78ed90951c6fc8a74ca0323a28eea0a862528d4bb786b7b75cbf7e148e5d6930bbdb53545579e4cc5448dc242f8c75d801ba185a0f2b8505593c4503cbcddbd9010096238d07be7bd69e32046cd9fdfe715b1f4b90f3ce221acee8f06e283c5e6cd97208b3404383ba92122bd1fdf8d7cdc344c979ac1c9e898ae968e0d2dcce725f7d091cf81f88a8e67f655d2f9140d5604c7a7f70e6615e0698d25925c2f2d03a1e95471c091119d5cca6facc26367d69dc5e139e3d794c413a414f96552b42366669ff39203e11dcd12bf8a99d126a163a8d6c8ce9cb8fcacee6091c17b389dfbc9eda075e31532eb9f0a4127bc30cd63e6399fcec580bf69a32c83ac0c12bb75da9ddd9b15dece9b33f9ccfcceb80206e5ef327761db31a5f08c04d2602eaa964ba2cecd8d3f48a371993d97c70702e7e89498d8e1424f5f47cb8cb899aed3d19134f7eb64aa7cff9246ad205651150bfc580669b0bf191adfd338044552c02a8b6d49f1a230b434f2d8588ff897defe8cfeef9efd804e79422f35acbbb1a1b177905d1b6ebba7ccabf7e9b3a15369ba8b9f0a1af9b339e3dd7c578c8f1e2eb50f40dd0b5d6826af13e28b52fa7efecb4065f5ef9a2ba4fab5e6f67007c71538eaf12869cc371702318f122ddd5e3bcfef0e2808ed6c8ecce048b7a781afcf2791573872993e288c44f5f97a5858be541a98cec53d6dde784219d422da4365744b44907d78f1c78515d445a3a4689695505c3a666b26acea93f3923a445de708ecea60d7319cabb0e1bde3b9a4b70c7284c55191bfd0dad779d6e7482c09491e6525ecdc60b84a592e09ade84e964c117b7086761ddf0057d54fccf277ca6295fd5f3846ff1b6998bb07896bb97d825046de7f46981a196956b503e8468bccc9ae42cab48b47c7f7f9812af221d3ad0874c80a98df214f89887ac854b05071396d7eee591ccb8c1ac1d7f9f8445158280d908969bf40bc84bbf3108c24c1ea4b5bb68890292d37a399847b664a91b993397f1f1f8c70817f03f135d8c09413ce0568629bbef0fbdd3b2a4a2a933731111db63661132a0209066146b47ba1839cb98efee0c4c7450be477e492bea967c33faccdb0ed94cb8a62d7fa076ef10f6650ff26575ab2ce6896631e7f418da82cf8bd4223aeda497f0d1e11408210f8efd8e0f03fbda18800843ff13afaee2e968e40341cdfb702a9a0c19558d2f5e1c6efcc727aa996f018f7a12db35852e62dbd555d41a2337fdc08de80a758ddf35875b271da0616a4e9124805b167bf853ce8001c576d6299a933c7b32b11e5bd91fd655c503231e0db46256adfa36475efe1a91b7dc28f44c70d779bad2ec63a19294451042b882254d81dab229e2f5bb7aae578b3cd7a3dbcc6f1cf46f91d06c0cd5bd59d66a1c6e1ff45bedd32318dd35cc983970c404773687065bc5e42c44e14bd40917f07f0a3c6d3835438d86be565b7019779b06eedd034b0e58c406e86b83fc8e56063567fcebbf67a3ac030646ff997f24ab7f936866894bdbde9c9828544429234b58eb5a7018e41b8d0e7ea56cf8597c2f34468c23180c27f88ae58a6070ed2d2245f68b64aec9213479b86a70fec268480523d45d851438e6888546be307e0220dc12bf2d33569477cfc48718f9c623778dfea8939b5350652b2f417567078ff1f6ed54e4c9d807de800ef1d323d1e62edc595927d54e005cc805f8be221a00133543a1e35fb94415b8d7bdb413dad921b01f281a0cb30800b41f5c8b25732012163af434209eacb3e82b5faab06df02116352ca3f68a18b18fdb550a0f342c687fd7148d31b5c755810b1e4aea5c8ef7ef0ebb9eb26aec41411b121a9e00c309f5bfe6ccf574464a9f09515352a02c7f574ec94afe23104423f0809743cd375ce042b2a02b376c5ce3c114506ae40ce61a1e1a280d2c63d308a9a8c941a382e2c66fa2ec834d0642da3a20ab71b24d181e09899d71c5df5fee81527ce676462f83ece3cc23a5c6b65780da06aa5255ab944e91eab8db2fce66380fbb44cfd152049c1a90a4b507d463d8eb6f3e8fd3572ee8eff8ecd7fb0c415d827c7609afd5da0b542abaa53648c072c72106de6518bb6fa9c41dbb384b5bbfa0001818082b17fbbfc30eb50dabfdf1448f7701c13a5165dfdabd56147346fe9a94c2b6cd81ff88f974ce48cbe329a6c176525222dec428633016f11f8f85f311e776594678c31d3e0ee92ada1bedb3cebcdf7a0c56f51a3a3cd21adad30d9c66a4e470a3596eb8a5ca06686721f1166761ebcafb650288cda98887fcefdf91b61d4cddc777e2433ef8bb93641b61d3fc068c8df048c77c93142fb139111526e85d949a7502724ade29f02e410ba1e55fe31e3c06ae1 # # Params = SHA2-512_W16_H10 # Msg = 7947c106e7e116b7e97d023498bd39ad62f38f2121e679410445647c6bb250066198e15681c2e887db6e04340e583d6248d00f589e91794d9182c1564e3591df95badd3b5c4badea59ec2c3bb4cc36f4287c709f3f588a9b7f2fcad52013f6e23bd35a681b9731dc33f417d1bc885e61edb535e1609e89dfba159bb31cf570ee577a5eb33271473bf67113aab4ebf9af841b2a3fca38606b4488adf61a3b6f3df95a9679619d10e60992aed38061294e969528cce7edee35acd6c3e66494a505edcbd4bc01b50fb6ab026e8cfeac842dccdd6281b9b701457474d44d571606842d2ae2231839ee0affe9ae7bb72456fb79e1e96d94998fbd7e7f68d2dc0be6951409d301fa2b7721f67b93b96afd509fdf755213b5a23c551c295f8a # PrivateKey = 040000046e51577e15b77d0d8e82adc6cac6dfb6f69d6454661497b8625a269f0ac5c4f58228016ebbfec3eb5df1f011ac1e945af867b4198c6e8040c9f0f1e7040909942b54304cea3be2319c106d78dadb0a3d46b86180ef0aa2bb976c9a05d7458c52e3f182859e51e3aeb3378c6d7ba0fbe59743f17d4ee90f0616003c567d3b9f3a00000000000000403f3bacb4c8ea367ec77d7bb3e8babef4b2c3ac6a59e489d56d969082b9d89f73770b19f0f727c1006783d6ac1e0befe13ea2b520ada00cc0b8f238978678f82f8867a6a15997ed18929bf045a778c2f6d1e73d648eb69f78a7090e3fc48c7879294b74b9ffd67989bdb83fe56daef38b14afd818f3d85241405b74b53d4ebd33 # Signature = 00000000000000408536bcfb2a239d14ee95dc4e463d99a71851f9da94d719b6133c3f4abfcfc7729e9c673d45d8953c3be32d9aa4380605ca3629fbfb524d7dc2ef9ca10ea90350ff83c73c25b5dc537236fe97211e4202a7628d4813264eede8b864d955331d840f2e2e8bd7606f2a23bed1ccfc1926a974dd0944956c07085bb7775be11ea410dd243f5748230231c407f9b6a9e6899b63e7a6fd1f7f8d8111b64d2f1de59dd7a4c7b68f49bc09a60b2bd54159d325f0da270159008028102d3693955489645a05c98d6e994ec20e5b4eb9ef8a8b4a17a5a7fab4606cde0d22263cbb45a3923de8446440e38101bac42b394054b2ac48c5543d21635c47e342c7f0cf74d0ddb7b01f143c78b7646f6744eb491b6f2f1d744f83faa6c9c3be865e29d66bae00fff3c6d6fcfba4494343d928541c4c2711bb9b52e265858b55f0c73ec35df16934c99ea322210e6701202461a601a64fa60290ec3875860cf97feb5b2d47236d0e4e83c968b274b2e1a04849bd790bc53c22ad7e59be0ca1446745002743a2656e55204a07be4bfe1ae52345d83b016916f10c95b83b6bdde15954061a3a4959e82adec855267bd9cc9bbfaafe680a8a5d64d0c48fe5ddb6e101508261e4124309898ecedcde32c208fdb3515bf248ae9a10ed34e7a1eda5731e912d8cc1701c7f3e010e1a83f7190bfad8d91ae6ff91dfca2d7a713418ac4ce35cb3b1319be19e607de01cb5fd7b4d41ec1d06fdbd70eb39edc36cf283b72c0841ec6a62ee880e0e824ce40361884c87bb9f75cc06ccfa55655996cf8e118d2e4a2095368553d8844e61958c2e60e64e0055d490d307e2eef0fb7e29c477f4e7ac0049421118cbfd2d939049efdb111c46171dd9579b1d73dc2c50c515a1c391372d98166c2001da95cdf8add243e958f822caec18674b67a667ad6ea85660e1886daff5f1e8c1f805f9a234dfc02d6b597662816d7adf97542578f12b273aab5937481e1d015d95d65643153c5ab1046f39a742781f292d4a047758fd059d40e2b3e8ae9e06ef111c8b6ec82139b76d4ecfa11ad332c01c350353436f684b426392314e0bf230b111033877062571da2d28891e6bd7427d4ce6fefc6d9b7b147a379404d53944899836322491859cb32407bbfcee76db3df8556db6cc664890b9330249f329abd9c36fa0dc0f5e7727a120a50191e33c3a1368212a468e3be85a32293996f5a08e5417c1c5d04318ef14277174555c7d1e707f0fd569f47230619c88a7998f3be7e35e4fea49a96f0299cc61b9fb0d2ed237892b23db8b75be6a8108975adc078e4d167e131c0fa396668af438e9e0c7e93a2fabac7a0dc283fefe3295998ad141c9e3e61b49d53879df7a97002af7a4f45a44b6694beac2058386dfdb6262fdc9f527336f99433e301ad34e1deac7325c3f408e49bf1c8f168de666a380791a7eb58bb417f5416c3147ddd5a5280cbc5000ef176719e21667571ddb5b861bb568380256a4b8da6cfc9b935f82207cff0dfd9265dead2ab4ec0b0a3239106bbd2ce172bf437f993810fb3f4a2ae025671e2ee055135eb4ee6415f61d0383bcc69cf737e6ddf57f2e679561e57ff670eb9a27987e22f6e9131a051e905f4d3ab25e07a1ea4d6b966e034d69c5a9f4cca45b33115116f7eb53daae39844331c9913f993b93e035bd837e907303f27f93a3f8694e0a9d537762ae13792f531a8c12a63a9344a2300c0f688f1a0e6c1537807952b8c82648429bec3bd75a1c319708dfc4e06f751aa965c929144bc101a8842fb94fb430454aecdb7287490f2a10542eb265052e6c9992d927a5d0852c825fc394393c4e7dbab28ca73cbace5ccb71e64ac2603e2d2a68a108ca34f44e0ee411727cb5402e43db0cc258c5d41f1543b46e6444ea5c54282c884b864a1759223e48bd1b6b3fa86b694ac1763a5dc05fd0243885ba802bab5bed37ad9a8dc40d5d1a5febd0fb64e0af6fe991bc926ffd5b8a30306e37dce4240b3485887cabcde6c33a8f2eb8a2c81e978143cbdbd76b614b95cfe082a28bdcd9fbf7008f4c6aa00003b97f25b6e0d0d473cb2e82eb010dc70e8640f6290b17423e4e29c29306458c6f5b2b5cde1c065e4d412927faa593f305ea41a7d1c88c5c959b9a5a6442cf949704f72aa72edab199804cf6b49d554ec2d2cc23f54a1744472b39dadd3df68eaf17f83ae79f1af994b678749242f289b251205d196fa1a5fc6a96801afe302d149688f46d373a33d1c96f266f724c4c7adcb072cb45aaac5dd50c2a1e1d9794014337219a6d01cfbd680eebfd17b41eda6908af10bbf6f74dc5a7d774e2655c609af69e9d12b96ad6e4eb1e175af302ec2563337c80517250b7d3c767ce49023f3e823aa64f428a40f45c2de20162e78a33e8aa97f4eab318ad5d67d7f75e3ebdb78bc49bc0684753edfdc7a712461a9ba0bd1363a7a7065dc38f70b0d4daedd7227bf47c72515293b7239655f3ba80ba9afbaccd0fdf2b9954e24e71b10f6f9828b7dec051ec6fc7799c8bb94fee18ba796fc423aba274c9e1c920863cddaaad9b4a532f175e0da7c49626c2f128484b3cf8bf284831765a463d70fb3184bca54539f40c303a319d1101d608ff81ae1e75dcc3e635671aa22cd2ba344360d8f642992ee0e61b86d51b05e0f0f53fb8d35252887b7c49672a8f215f5f0767bfccb82ad5040cd6858ed74fdae114af2e3b8541bc627be6a6ed4c3a2ef08628f20197795bef92fa3d87e0db08156df39a162ac58cff2c7542fa263ce183032df1d1024cd6ea6f6f06124eb5147ea475e34ab5532b6dd7384a36df9734c24e84c46032f4185fd0012be6aacf83af1b1fbdadbcc0149e141a3d533b28410300930d6c369f37b42524c35850c1abb9a3e00cada31aa5300497fd66e64f135523da9d1673a53d95de6b8fa499ac8c3417d39a6352c0b4fe3d07569277870af1b6b50ca55888d6ad538ce1ffc38b11e451ee5b958ce06096d4cde8ff63e6b7e4da1da08fbc522c1cebd7b6ad60a00d7e3e432a08f6bb6a992fa1f0f06ed4e44754318ada6e8ba8126ea5906af9088f8056996fbaf528d91b3cd2e0fe5ef53b986a856a84735a2b586cf5dc098a032c8914a2d38faecf2f7c9e0275b44c8b2968b9cf279999a6be707bb8e6b69dbd9eb3760a70999f67639755a5383204283a48d83d97b40d7fbfce668c1aa4595caded17ead40814c6f1743a95e3022155b334a4d4b417502020f5ca6b961f2cf6abcda9a6c33464cf82a47721512ab96e6f54cf40a5c5dd7e6ca140c1248c9a25cd92fbf20968df33e72a263deeed0a6db05a5a9f5af158996cba120560d5da3d89c50e5849a5aa249ebe27aba0ce2e034bf81664c23ec89a002135aae204e3d10b933c42f648b61ee88c294cd7ea415cbdaab015aade49369cf7471ecd7c85758a8b5bcb8f4dc210b5ff589fae2d12a583c3dd906e5a4027e94236ebcc9ce1dd4a4e9f7432229637144aedd220b668ea3ff02b75f71735ba1275c3bd6bc9ec78627c418571266f15048560dc20f21f7eacfc8d27bac7afd4884a54062cc735538d41bd3d2ffeed922cfbb92b86bb740d03a7d0a0b14d320a5b1f8272b217bd101a813962e60588d72f3ab94a4a4a555e7a33df233e678a1e2d581f67c61d1ba0ee4a2882a2d643dc4237d0f904b9b4cbcb1b14c19aea6b468d9d0cc6a852faba8756699f2bb486891c8228de92fa0fba072c171f3e41409e66d58f514f8408ee37789a61a5b80676c4c87d9eb1a47331ffc271e91df821a7c84913ac3a53ba102653b22ea7e2db9d0eeb41d522578367adb846ea1b8618123381c3af5761c0b5ea03fc1ccf00be5b1d6326959c30af31dfd7f551c25141659663d32d713d479385ebd6e3b7162d49a23a4136d9c1ebcb8165a6021d2cd3729c74299932c54554b42f3d4b80dce3979b04da6c8ccfae876efc7ba1926b5d60d96894c52c22136be163c3ac09e9cb259528e81739c8f7da9d1cb8dea50501cec14a8cc7b0f56ca3376e6c857e9e59051f2ac002f3f9a5d74a45b600d76bb51402534843201b10ed0b15d02f5d278f90ec79627e2afa73cf21808474d6140efebf5f2fd06f4ea1e8396a79f6b287034be6ac064bef27f7f259cd0efefc194281d28a60fcb85dcf644d95940c31901c443a2cad5edd753d6186f62e81a1e9809416591cc0abc0caca178f3c589b576757aee6c21bb712a7e25e56093e2908c1ebdd6923395b62394a6d7a70c339abffa956f97361537e0a454dddaa1e9c7fb9f63a807d120b2d87117c7c7082bc9be0d0e27410d5dd95f526f26fbb6c2cffcd1c97575eae20397cc7880442778ea72c040c123fbf1a004bf280869da17d284a54c2241a7e5020108af3a040602b35a053d1ec7189452ffe10c28c71b28505cc238938cf3c95d368103c877660b750c991b4b0ba39295b58f9136169d06947f424429bd868ebd04463f23c6e5e636e279a4133ca676c905fa52597a9abb8a3ad918b071b7555daed52305647ca2fb1baa2fc9ec5ed55046e0a982122c326add501aeef46dd7a106481bdbb8d6547c18dc4ac5eb12214369cd29acd29cc2f7c608dc472553fce765fd9f49239e2d7bc99016e16f194e80f64ef036cf73ebfd7b627c2c5319262abeae5beeb47b138448c59662002f4c1533bcd513afdecb5e8372178f9a2e6ff855333e640ec276c2d9a80dd2aee6630d157177b0c61d0479c55453fcddcce8d2bb9064b1fa051f57a68e3934007c49cf408450a691da854e9eca31451d13ecd0196d5eb6c015ecc0edf636a1b1b3150e6ab7ccb57477e89262c3f330305a593190dad1e2f9b6c2868aafe221accb4cbae4e495ba52ec759a2b715dc1859b09c827f7fbe0dc64d6d943f49d5336ce2acefbe106ca6ee35703a00cd0f6351ff109b10dcf246aff865c750387381d76710d9bd489322b7ae0c64a8bd4cdf342abc69faf545e20a3f4e7fa506cca8cdfa4e4472f0032122bdd6e91935eda4956766af76e2b7251c00fdafda6c4608292778d2f41411ca817929c1359592f30cc1f51c17719ab01cb6596ca7ee6e7ee2b466b399e374e82d873e6fbde8a0fdf93b87f801e98ede35f0339fe9e294c25211541e9d6482e7623dc542513a15ab17704e1f297ed5c32d72b0c633e2c02c02d1315372d1d8a8b2123dfd8cd489e7eee1bd8fe8451d3e03a3d7c57fa9cc3ce192979f7ac214193881d19760ce80aa17bf50c4586c67136a35a6d2e495690df141a4c347ca5a9eb09ad20b050dd89f17d6746e1a34822bdbdfd4a825dc339d35bcf3f9afad64ab595b738dbb457a778d1995c18d03e6ed5ef6bffd8d9eb20a0d5c0fb2868b2c14e7974f8a10810b7736cb11eca51d3b2e06bd5a9169d80c57536528daef43d9cc9b15940996f25261fd9d35f3c81e66e23fe887a294be03aefa66536fc155b2c7bc8092e5d371c690cd9bd9b892e2c2ea0d2bc21cb7f4fe0339d2f6a625ae7fd403b56f9f0058b688f6d4f4eb66f28b9ef9fe09a9527548270dd6fefb7d9932c58b62f5230341a10bbaedda40eb57758b2dbfd2e442eb9976aa16002127c684e3d6e9b589861e3ab6bbde2811ddc8b9ea9b0e2a3e13b44c46cb691b1a984ce49b297814e45b264cdb96d07e3d27e7b3cefc9a35fabe881f43ab6bc277313bf15998cf6438bea4842268344074208af3802365d3a88d0d4e848cd16195a829634edd14a792b13e50d074f847a2eb682a9844ac158e41a0e0eb76a2cbe47ade99f560cfead1c0d242ebc734f8650b7b23f6f428b7f9181e1838fb513b9945ea0776de7d9fc1c9ac0b9db1293595c8c017aae82dcd7f7d1711c5d722e9a6fea9afbc9ec91c98e6d79799bbbb7f09c16d7d63675906ebaaa5bb8f9e4b9b5d172057743a533ebb94e33120f05cb71a6f7aa4e93e4fd223d7fb8ac6b76b63882d88eeda2c7c6ef06893dbe294488c6d8a5a0161ef0b8caa28323f38a1135d61d995ffd5942bda96f03beb07c71f77adbd5e09831444bfc733dd40143ae95e6b638bbaacae7127e485a7625c4812e6a9a9a24e0c2e9ba11c91cdbbae0b5c338138180c0831275563b4df82fdbdfa52de4a88bf158b7e05710ef077939a7a25bb55226cf5e466074218b6493fa459c70361ee90c3536e122ebbcfd7a1995181a52034248ff02c399eb0ab0fc91e85311622e97bc8ce8cea223411055d380f3e70bf513779086d411a477677ff9578e28a688befae362a69134d1ede0ae062e1b99ad9054d35c189f919b581e3f3e0614e0cefa70a092a8ad67650de27ab88a5098feb155c8bbc62b363235367882bbd3c0ec93063e223c511623656f1fa358b112f1799c42f7419f2dfe38253e67f8f9ec03bddf834228e0e7f5f6a4f18ec1ab1f3eef945b68d5e83731194ee567cf9e93f08bb0ba8e12d8a46eaaec95c82df8d2053bddf920277f3993b376f1502fe79bb12f383711893c2478c8ad4e85164ef69a6ead22722f87a7e234dd7ad425a134e0885b68dab30e3ca91d6038f988364e4ca0a7545f09e931b89baa77defd3131bdf1f37710856777be35a92a40a0af5fc382039f938a34a7901c7e9ef824e0033cc953621e9e4123e90a5772c57e0a370135e16c4422f90664f34738c049b34be0ceede32fb20a652d8c860775e669b7ed64e821f2eb75b839eb736923db90a2678ec48a4fdb8c94c12e0cd959bc4ab837e515435e11586206873d0518b57b6d0c98b44547a40f83625402ba5ba7a0cebbcbe74ea8e31aaa25c20328c7e800f39f13c32a190e3e9a1066b07f8604c05e553043008d80898674f3945ac463d2736eda415146d5cbccbfece91334a1fb53f2b73f582ad02a6e12a39730bd2fa834ace6558c8e795b57c9ed891ffb9e586bd21ff9b33db7701dd2ea6905c374805849dadddbd89c4a736804c8d79628ed21f9a3cd6c63460b1b5de423d97b9aef605cdab265304b6cfd8f98eb611045e96019ca88737446a3490c51fe4a353982388fbfb569153410a4e111919d07af328e1eba48e982fc77e034a6e477beac6497f527a73d79b3e9eeaade676b2f92b9e80ea9b972fb15e258d50748f3787d6abdb96c6aebf102cb26de6c75d4231e4639c8b274b3438ffe93b306bbc28474b164e738c5a4bb80b45108cce95b5d58149b17a1a295ee2ae0ffe34aba503f225b131746be95bc65b48a8b4f4e10af418071cc6b0ee48f6ff728569c480c5e377f39d03aa457b7e7f50002ac135e8d5618be6d48e9f0c0e79187de1c61c9748d9a27a435c16357507ae1fc45e7a890f9e11f0504e142e61fb64327951de8bffe0e2f16da75cdf623a1ae1f7e38fe3607678708a5f1a69ee88dcfa16b60b500b33d2ca72bfcab9bac3c9ce54f7744c3da744acb7aa4d463315772b8fca27a5a0772ec84eac4c346f4bdb367cb3344cc87bcaaae1a9b912bb064eeda6dbd258581aa7bea12f75fa232fde881a1c306fae7853e88fe7dd0508f9860b2f01eb4991c1bf5872d338b6be2471acb2b68141cbdcf16114a19e7abeb81025276bfb1991b926adcacaefe8938a207275bcfefc1deda87773ac1327afffbfb3281f99ca72f264320909752be2f04bb29dd68654a60d4adec1fdbc6a73e30b8ba6a6b3612ffc898ffa676fda72bc2d4a81b8321ea0ce71c629486e2a12e977eb304980862827f2a2ac395f8aae0ffb26f3077d3e352838dfcc5a033998776be72ffca81b84a8865d953ff998790f4059b90247e5b86733ebd7a59c29bf08d26b5f28921938514806bd20ed045dda03c2e24a3f392382c27109d7ffda8bf1393c562ac5dc2b47ff471aea7c1c0a1fb82a1cc69fec860a3784ad2ac260636291c26549165c1939bd57a815c828a41a53ae8a984be0150da536b319b2b292403eeb53706581aaa6ce0253758c9c069f5c49cfbef35fee723f75ee564bdf13098caf9f4b6c0bb002c3e63b96ca29043e2e633854c2840e5432d156d94777d225a8f1d1d73ad21475c93b8a28895ddac2a7c30ba512034cd575747de274c4fb98d2ba7ce93727aa6675b754486f912f76be1580c34c4c53b928ab020715fed5697484a4b7876dc74058e94c9c0c2f8ae4245e9367d6f646fb7197c50bc029283ffe5f6aa3ef84ef8eb3e8815a0668a0ff6864375e24ca44bd646bfd29cf79e67379744e5e205bd9e4ebba0a9be6a13b6a29a2ef16bc1e25dcfcb3a4cdcc9678edbb6f065f81a88fc1fa09070a017da1972c5e065a8221f867059c7ce98acf7ae9d1bd53197ea47343e4d369787af6855868cbbf2c4a564d85b5263c4837054572fe77981ea3f5de6c01f766516f7c383d84971d9b23e2130c513416715c5488cedea3218d1cc3078c25b122ac4bad5292d09265dd9c5f0a390ab6f4603ad90f612abec79eb11cf153ada2a5026f3620bb1a89391bdb3e4307a9a40bbbcf5bf3b32330180ff5d51c911b7b8751d789b4ceab40aaea73292c86453be32b93edb49d32bfe1e4ee79fdcdc4eca188143663b6276f2fb6d1106714007db830ff37e7d31cdc6a4fc1948b83b2851d4b39cb03f5fbe9ffb02ec6f427ff52718fd3f2211bbc646c57615066a7c2e05279e41905323222a2abc1b19c438fac7e4184589eec57e32e2b15d0a6eeaa48b0b9b23d5a828a9895367b27ee4f34bae5a4a022bb107e20385e91b0b4ef8a6fc2129d639734c589cb2a2dd1a32396fea21662aa92efe9e5e0c716cd127d5c9aa58b885fbd6e7376dfac7566ac5b8d411f5e3cebf829fa0d2815ba4ecdcdfea5da00ab2d50d283ac931f431ceb723d8a4046791f5a30e27d308f63485abb2fb4da6642b72b55d6e5b0c2d9d0c2b03814bb5e913df9c2447620b5e0293010e42eab83a270bd145fa1e55e28c43555f2ac543bae11b3fa5379ab0a24bc9e7edd6d5455c253308c591b23ea7897479be8276d31af032a08b17f0b68838425f120c419970e87adce4a26c9c5adef80fef2fbe1e89bf21230511a5f66063d9f91c9e2f312f4cdb6c5938071de055db977171552cfbe544745a4db23a52941bb458cd7d756afe8801716d649675d28ca39960c1417fdd65938f4f750ce6b05e8375bd627139b6f71bf4b4697b58fe1fc43a58e1f723aff56c25596ce7a2cb0f75a14b50ac95fe61df760a5094304203266ef9d98d129c6bf7300bf18dcaa40ad1ad66997865cd9e34a7a1d3955ef0bac6aec7d899c8d094deb26ca2ec833d556dad8d69c6bafbeda3ac8aea147d57b155332b6b7df8119b678df2fda1e332ccd2f3a5c44759cbfa1f1e520c0b1f0961b0a4312cb6b816a60f22bf2a7e2f944df1d8cf52b641aa923e72d9b27b2b27f516abf1058af013a4bb845cc0e9ee090864e32e7f8182b2186536add80960c18df22130615209cf46cb8c12ba308f2849dace1d4cb4a93883cf628f00efa00f3aadd4313cfaf235d6770767446dc2a4b2722fd844f50137c2ec4632a014c7f3d8f9cc4ac253d7565759ed452dc8e776f6fff3ac9b92e5f0f206f6835aecb84216d87b46bdec4d080e1af2353e1bdb9093eb4ff7d6e04f7a12515d5bd6d9173de9eaae4f701b34c8ba01ac4969bfa66a20537c61e966275751d16caf6385ab5d6028651a00d298b1cdb1f32a2fea570b742b65f4a2ff2ca2ea45fdd4d990b62a4d57cfea24005686d61cc4942ac04c2f986f7d45289583f4e13b99fa63c1a9497660529a8127b3c2fab71b07d620d99767efdab403883d1e196e3b5972bec6f92d88d4d495680434c3c6fa2a8a5edad54f73b66e5ec8019a64428e7e6c90b298eb2fd89beee9278227b484c0b42632d28fe75f704a86d1fd0dac0b5f8a34cbc61f8bbce2462347d3dc80bc9627bac910d9aa13317eae86ebfe313b3f6fbb77463258d267745567a1c7970c6538b32c0a4c468a1fb7b85bcf30612c56ba35c5d604b2915af7b8f551ea52b2bcf308f8992c8d4e9e3bcddbcfcdc89c237f8bce0fb54910f2291e9a54da9a150db36b3de7b2ad90793265b76f42ca67fbac540eaa7d05abb831ce7c11379c924c656e192661934f4f03da381aafed1c6697e28e348b69fc3295c39d13b475e71b186d9cb822d01eb157c22ae85271678ed6aecb8a4ec3ccf61cb23bde2efd6c4af6e962de8b98597b3f4ccab54fd052d6610c527eff548520949279a60aba81f30919d3fa0ec8de839a1dedd9964bf42999c1d10d79cc48361d942f8fd24f158cf87c4f933b24cc60190acd2b0502fbd1316f624c35f9f8e98bfb01e905c4ffb98eab344ff47ace508eddf340356773fe8c48c3179167aad53d3b3f5a2e0979c4483753ea35b1169050260283af9b65b08d7ff3a085108b298f6cf5bd34e404d510fcb70bfbbbc838c2fedc50137e9e1e95723dce9a9eb5d6202ec5565cfbbaba2ebcfb87592f6349435253756f666595c97b4c9104655943d5dfca268576c4a98d744034fa85b14618cd26126f3d111f8b764492a9469eb0247bf474750b5241f233d8481a5c34c7f0d61d13e930e989820e23ed31927fe0939e9d79420caf5ab906eff9a21809fe2a8206537100ab7658607b4eac57f4a174c601a198048d464229a151593a1f3b82ad54b59415fb8b7de3a197be87d19446c2b2ede81799fd7f2ae9e7dca3f24a0715b7dfe25d4c25ccd57fd20045fdca529b688782b5daf3ded1087a34b7a2364b91b35e309a3aa5e39ba103f43959b7a2b84e1523eb638ca65c73d2b88efd9e2575dc123cd9d8495f852cbae685d4bc3da0f716ee2cf20c268fa52e1a037b0b751464efa24558739d5d88130ef6aca542757ac17bfe911c40e13ea557ca5d70700843ee880d306bb6c0548a58b2cf7c9ef3e88cb19fccbf3f7f5fa4e18a81df03dcdf3e13e242b59222caa59494e3e6d35d036a5f404ab38c845d42a753d8c2a0f918587454d3634b4e0fa9f7f3ffaee1db09d95ee0908523247c138ac27555465e5539f110925c327afc8bc47d81bccbf1ee09e896bf5f887e3e2e346261fbaac3e40f0b6cfb4fd7750fb3e5641bb776c1b3358f5798da66a70c31fd3a9d1c0e64d8d50193b517a168a7e0d02990dc119305432cce667ec34feaf6a36c29aa8e6b892cf474465ae4580a20d2d9adb8a82b1dd611a4ddcb5ec1391068f9d9bb19515932c51e87fc46c18c20dde41dd873240ede20ea0446bbeb5638e724d8681cbe431aa61f6812dd5846d94c0f4f9b51e4e44c7f2cbe3a0fd934a48b6629fb8fb51446fe1234143e821ff25583408716542a29af32af29d875e1176370f7e354b9f77b52fb43f20ea71a780e226a0c1ddd3f9c126de1e10a410f0fc589c346fb9e297cb0b37c98c0ff6acc9141d90390c425dd84f61c8dbb13cee1224763808bb679d2c9b5024d3c9be987e0dbaadf0a89ac9ee137736feccb6a7c76de246456f312ffe0fac0f2d591927494df4ad9f1707ba6cbdf7d9ecedfa10f4bc79a9272fa8ea2231e0c0d3b20cd48b2311d08f99377685c4626177b73004272404b5462512b615389efd77b7bfa050193fe1d41b6e729a759ad21e52d2b642de3dfee08d786dfd88d4420f383a7defb666c64e906fc9ad1578d4f136b56c213e952e7fb814d0cbccb0ae22fae91189db96b57576395647538d6dbb547248493fbd0abfa590b9a16ebab65bdf8fbe0ad5d40c4857fae627109afee572753bcc142f563056bd425e834ba09f5ca4d0269a8ff51fc962b1ae31de39b59ec8f5ecaaa91ff0343737bc9055f5e6ccc1fef8cff795b700796e6d0310ce94f75c21f27e2d6a4589e85cb2c389af4c321429ac9467704e4d4ddb9dc971440c9b1865d93a3eca14b0d17f16ce68f50c7b62f2adbda64f7a0e68e6c5f017af31148880b9ceb35a95843463e8b30a8f97984b01798effde3cc6317072acc621d41923cd8309d75228804741100d9e65b7c0b07e48c9cc96fe6bf891bd7448bdbf388b3005748c5bc31e639172657cd6d16fbc3191362e49654cf3121ea214d5c8fc1214b6797ef7ba7955acc93c8b90e1a155ec55d14612601e983ed18cdb1032bdc80a71cead0840ed0310ef095ab57acf39b30c8f227ae67ae03880b6fc9ffb9a7df4b186af3c8256a152dff1628ff4dd2083df4de1d1c0de4ec998a5339f50fd3a505a8b85f5b2c2c3633fd9a553c4cb54a6213bb383a1114a72f152a79a8c59d3235345e06eb478eb26c86b942c5208419b852aabdc430caf3ff93df9bb91cffdcc52be6d8c11e7f2980758c9a89b584e9b23ca5b64278768818ad432150a8f165f9d2ca8ad6cb7c52c1cc1e342eb4102c16591283e2bab8ad46e9c3f58c58fcdb9a1f3be56ffcf07a48fefb5fa4af4e8b427a418943f047a549a636a0fe68566c7e6536b914630fe763c2bc5e793497a88e1aaf08c5205567160f86e751d24b5113437f4a2521b8c4d4c377c9a39fdc2e440fb8d14ff770d2caca272b4b69cf28a23bfea8bdc66a486dda3d0202fc53262e95ade84e537317b1392a2f39df5994c2814a253646a500ce5c4a5d8091c4ba6dd7de115a2585dc52c2423476e4a44263595e7d1a3a0f2d29fb9d3810300e0b8501f37063fe0b97a5c335d68530c0e353f181ff0d4bd2107bca5600dfa8dc777a73205789a259530fd7503a503b1ade5ccd2f2d530be189002a955e631fb8a04b554a15f4e5a8c69e769246f359158c6e68ddbd7195d680ab06b7dbb77d0ddbffd38ceeae6395b17b1d2838cdd488728d202267eb230bb3eb42bbde9b88b8f9b1e18e5296c4ddc45e9d0b72c565607223f4ed866c862ee6a2d756e0da7b55efdfeffd80aeff7cee4aff4babfe6dee23007525cd3b96257878f65463eebf236727fe5aa142888d36e5d9ca5184c058c7b789b358c088c040723 # # Params = SHA2-512_W16_H10 # Msg = cac4ac80f64de363ea22fb8030e5cb2f78c3935ef64de6a7233ab9e02e538ea1df7c7c7cf1bd6eee499a0f14883305273766f909e6fc1a29ee3adc5cd53fb60cee3f90825b86563d # PrivateKey = 04000004c04666e9dae87ae9c9902e5dfb51b03456fe1cbb6f9cc3ee779d0ce84089d4f35481147e1a11e92db84c2e767364374f72d34e9840ed7e7c4f5b6796a28636299d6cf36f2d6c05ec409f11de398f4fde26fa01cf74d6d288256b0779317aed7d443d3a574adb8f71dca9f1579fc0ec022c757d0a22087d68a006983a0a92b2a100000000000001e39649cd8ffcbf4f2868c121507e0d55f37a4529585f8cd93730e37deb41cab3f89a602e4cc39cbfc39e5948906394c30a9b43e23d3fd45093f5bd3b93d49f1af038f9ecde211ba400d497c7053196cc8083fc53b9754537d3a0f7ff36013ffe55c025fd5740f3d5fbb68c17d90c6a9acf65926bc474762f69a1d4b5f5353a829d # Signature = 00000000000001e315eb14ee98eb907ae9641f8f7e3ce7aeac1ea1a91ec98e007a0d5373b5914aadbf1b53bab5d7cbf351ae26b13e31aed1b51e8779852cb608a056c024eda449bfc68e807ec0d78a7408e7f6e7bcbc83d77168ee64ebb558e552f9134ebb8692d58f74cca5348404432b84febf6726eff437b950adc6a4c31ac5fc59a45ef9af656933cea726b4300c63b6f86c9e3a531e8bbd4c70f9067f811e3e179bebcb551adda6b7598c292d69a2c00f514de0b27c110c3bee84fb4e3b3fb8b9e7fdc5a59584b7b7a7ab5afb8a9007721bbce79a80886fcae251874dff1df7d40944252bc70b57dfc53adddd5b65040eaae3d8c633cd1a169b9237e829657394b6c644fbbbbf26fc5b03cc6bcbb2ad03532b4b01d19f2e458cbc4a9a40026f19e0653856967ec3a8eab2ee2df7a09e2051c7a56b47c486bb8fdcf876d71b0196b1f4ea793563bbb36a79bc621abc804fd99e69681d36ec91f01b0178bb727045f492d794acab282067ef4765f557d885b12c96a0661bdeb0a0ea84c48d5a4ac1e687b85874ab75e1730447453a3bb9cf2830151321e926938a09bed1829f249925d2f76372bf1199749ae738ee5f52c10804a5ec07fa0da06d0d6a51353697ff2f070c367550327871bdc4cc58a059d3495f12558bb0480777dc6d1e8291d78dd511428967e6d42a4a5664389abaf08049668ee4a4fe23e3b8ce4f1317b7d49b091cd39cc8402759f9168178614a83dee3df22f730000e7781635d5f9dc67a780c5a505f0dc5544019f3488b3f5f370f41eaf62a917f3193bccb8001fdb8e271fae6a0d0e35fb56dbbfbf6fef6d6f74fd79ba1c64782217fb105d2559ce9603ad40d0cd690b7e65d0453c31900b71eac81ca7d0f3d038668228de6314a4d241e7572539f9e6c71672574454e2c5ccf04020c9f6466707477b0e9a0af2edc1224463a620622d1102e66ec5d8e8b5f1c6337134bfde6485f294c657e705fabefbd09195f255308c338681d2d4f52913fec03266c028e503ef2804e4fe82cb637b32aee1e9f12440db77576c04672825516c1a92e0a2efb51f0eeaff10f6f7b781dead230c4783ceae443c6bb81b67d85640b11d591ec724c870c0b66b93941004ccc7f1c362172dbd6b04cf2b94f60fabe026b5ebb4573f9f7df8879ff6840afd1df604c2b6180859c519fc3c77613500c64a93a9360dbf97ffeffa02e50d48f0c5057a07b10adfde525c687f107724b10f6994c2ffcaf0d11c3d031991a8b0dad3e913895604361bf9f7aff1057a356638af4394a5b884fec4cdd0aaf7d8a81cc30b3444a3c71cabe9af7e9d9e7c6d9423d8cb48f3ac84fb1731a23705cbab512d24d1f1854710bdeb2d2ad9b245aa0c40ca14506588958fc1f7bef1793b82cc45f066c878e0ce87ac98c17994cd04f2605494a42e8cf9412b21df8d2ff6301c1ce577ae80ae92b58674d9ad854b9554885d860f2d396122a9dad5c04764a9c872ab6392d06fe09bac33e79569a6922cc55f4ef981a50cefa2ba1d36122f195748ac929d28745ded5fc14a88ee751fb6dffcfab76daaec74505adfa633102e3724245e8a1eacc2f1fe0c89e1625b9ce2f027a2c560fa82ce72c3f19127a3048228a304439a52fbc062fcaa5482e04c5a203f52ce16c61013f0f3191e2f060a652b44e26316308b91b9951c434c1419b42675afa5e4813366bd93b3dd2dae6bbf1be7d09dcd390da7500b6edd4fc3974d150ddd95cefd576a3f4b385129969427d80d4de4fd61b679eda7bdaad43bc837a71ab936350627b0c019c91a21cc48cb8ccf2ae0c59123582d66a0db3d02b2941838a7be3a7113bba1873891213a1ad93624674a72e644e74348e44f18b703eae62093a61fbe1f0b25f37806d9ccbc101b8b39f46642880301fe70f2812a2e64fd333383a48c445df60d36d93e9cbe9f766a5c7e68e725346f79dea08c16ad52ae7ed0a2569083081e937ca630de2ce702110c4f0569b241ab893e44a6d5e5b140f997bed7e4e95dfa97d147d3027186e466cf92e1f2aeb8b7155f266e42e769fbca065348216206ce799ecd33b6c17fe4466ea0cb509b9d995f5fe833d5a56d891f565fcdc3905bcf20bf3dd225f85b9abe9435b9bb8e1bdee70c4ab219909b9d6f1b9cb88d2c90371553492c44a5547b1f5994df9b2d9e0e982f7b0293e8701f77ff757bb69a0f4b0f4f1ee689fac86c6cd8aa070371efb1d9a8f43725678af9763bd6a05e33713b56c22d5fe0a06d5a5bf3a5de22cf3283db49608c1c43e4b95597f660593ccd6cef8999589c8702a7d8ee21afc92446a4392f9321f127f813e568bcdacc2c19b7d278dc7170996057c417b3a7798b6c781d51fe7433bddf894e27cb37d04abdf723b74e17c003b85bf21c94b4370e0b88a4dd5da02e7a5c106fe467a03ecdd5018bf0ff030188711f2249ac852c2f7bb6cab0317c21ed43dffc9e0d2330de3e6dac657efe71aed6cd78139f7161576d510d73c1d3b97356798d94bc42f5a10e0f8e06b86a23f80626bb850862df98765adeff79c9fd7e1c73e79b5d0adbc49646551c62c97f9ba2d28f2336d16e22caeccedc8fda0ec1549e915b3f4f19eedf240d024128b15ffb2739fe695ade8289e4a902cb392ca377e25d4c52b9c39952a777c9e34e428e121f911415c20e47852c731c89c28b428b1f51ae086f6653fb359807b6d4d8eef97dc553f27f1d0354839783bf80c197b7f1c2e3073cdc2960472007f7d32fb28a1c73dca9b929bad8a57a01f2616fcac7d7c0d3e91b5cd1b8133df9b2ad7aad66b3871b660966e2157fdad041edf35de35823fe9805ac0cf3b707608d4a349fdf498b3eecf6d9c94aea9608756cbfd899f7faec884b03855e4695dcc33f73eb5bfba273e3d4f8d8b005f1a6ba73564c98f94a72c0d2999c9d6cecfa3978e2fea2c5cf996bdc20c99ed54da9babace79e0068744f778e82e24ce1a148a13a7d2d19fca6707245444575d9fbf12f6d2273f0dc8fc7295f9fef1ed69615bca302d6352a9b07d4ee639e2f9cd30c39951d9da90d66c9070dcc2b9869df2e376f1c820df3020aa87f37b496d26c9e8f4a78dd1a9ecc9df3e2fe9837032e9ef2cdf3ac26901cd2ecdbe1fdc59efe586e3288833764378f7e27849c0f48eb1171de414f5c4834eb694a76c7b5de4c93ad38c8b839ee8cbf0b4032fdd09fab4f8fcb967c94634f2f1c6e37ce78097d7143876c170c8d8a14e05ca3d06fdc281e89b7501e2378517b7a4baa48263ca290d65e8a1d8ef0407b8c1c31fdfb76c5427157b5c25258c2f0c45bdba632be85c7471b6814f15e13c5191440217039b134c3a5f5fb89dd7f40ba309090c2b453481add9d0d5600b11690add80948a72d0aa4079f070452e977759f34feb69e65e97b9f85da6107d6440eaee8b5de6375963ce993a8c8586fd4d6238299384e70b9d872bfe996273b712764c84ebec68320d3e26e567c6b3f48be2e715b283360f5d2be9a0bc8ea1f67ee52f864081389a6bc29ba61218a7f69554dd850227774e33f7b84361bdc4ad7d2fef325e078c52f51f68b45790bc9c51b63cedc4f273beb0238a68d0e8ffff68d999270f4f6586e144871fe9475908bb3d2053d5f73bceadc7db74fe08af1479b7b81b48b2f433a8a242cbe759441c3ef7074965e4ac6466c1c597d26c82c655c85ca800c16cb440b4064b46d3463e66bc577b0016aff890c623875d1f570cc2e91ed9e1aeb3487c500c4c59c90181bcaaf383f7afd631a5738d58300d9b370d3d9fde31e8a00cd14843fb73e7e1ac703c9c8c62b2447931415424e7e6516e78120b1b10caa60cc56d13efde82f2722731a13193586a5d1e38d7dbbee387a94eccc73877fe9131683cfca74e3b8cc8bee3ec5c3eecc3c1d492d19b7e9d1f3b004e6414047b065c81b81b11a7bef605290ab520119cbd030c0ab8bec99501f91a7ea901367f1871666da7478a34578bdf4d1ca26a5f5d39346f66e3101939eee61fb75a39a9e5cb973085fab324342cee75cc9048b8fb679a6cd8c7374d4cf7a004da89b04c63f77e5881f0223a2bc5a32e0f61a3102ffb389505be47daedb493ea86bff68d96993c65e0e12b7cb0ddf6a61fa02bd3bec1bd03281745e63b8d8e07098a1d3161da76c0bc953ef16c065b5f307cc9e51fccc933e19b44db3c7e762b105db6d87f5f85eb7ec62780f902a9515ac5c9cb66ee9a8d09230de2dbb486a51d850709d0484bc907d20c8f0885ce88fb939de487e489a0afc9982212b7b9f7e19380366d30ffb4de09eca23db901ca72112cb777ff83139ffd6e7bd0d87085ee5273afa624a8fc819064d081f988a703539160e0f8d9b169a82b4d8c7c8c0a1738d07981f1a60deca72c8f1385640eae51eaf53f329aff2d6f9ab423121aa673b5f10d72f578035e3cd085c7d27cfce0d6eb5a646a658a4567f4516e2520a10275be998d663bc3d1e4e122b067f551b3ad237435241da94afd0c07caf6ac622d14aa48845121cd923a2c584e7930bfa99588e76877501f39c601da9bc16b36dbcd6f1e87fbdc0f7cbd9298425b12ae6c43dc96d46195e3252f999d1b688548172b6c1fbd3deb8113954489450da2a3683f6fa389f1a2f8cd65ed586b07523cfc5af06bd164b6965c78c7cd2deceea56bad09287db7b32dc79b963dc6270e22f16bc564795a7d9918838daa70f9c7185024ee77af53471384e831ad76d116b5545dd97d7850fffbd360ca5792411483c9ccf97918dcba886191df30d826badd699f5a556212a964de95a61fbed1d39e16e5ce96d6640ad1bd497e1c4ad28e5b5fac8e4ba763787ae66a47ec8aaea40b17fdb53b19fa9962a018431a867dd718c3f098f4e10c7782ce45092c6ea93d2dd139bee66e1ddf44e5262a290f31be60dbc8b163c8bbcb0bea107340a0da4577a4093d789e6c6d463ce14d19dc9203d58d4f77511c3a9f1a1753b76317967574480968ec0e3944b8845d6e5068a194a29a7ad502c843154d30564cc2a46478954b1ba590fd7852dfa21efba1da63895d7094c8c4528c7cf5580ac01ce8b700fcd9f59afaf960f61ca858e21e6d9467c2177260d931638d500cf10bb6aa5383d0d028211876b2e3b904e115f9e944c18496dd61cf1fa690532ea083163eceaa308d76f63d14e8bb568f5169d16656780f5d23b8a64afc8fe80a8a0d168af4b9249da7c88a35acaf403d7578816713acacea6f69253ef5ef1a6102c0bb49b5b8dc03cc4aad1964224ba0531ecb2d1ad96dcadff2f75c8e6624aea4744695821d90ca9e5ebf05e0a549a3522029e18f00f6b559bf4f1b13194e37380fd7d1636a6ec82bc74583c9e4f6905ea07980cd6bd001a4987af019c6d634b657df54085ed72dcc718aeddcb293638c5b1fee237ccc1ee97c2ce72a4018148215f0a1ec148504f04dd79eb7eee9e909014e34ee69b758a71632b77470c54e904eca281043fb1076a5b3b0b2275e3b9abb4fb678f73095808db4a5b39f68220ffb92ca6ee8127dc715e3835102818e7a6841760459b7eb0a344ad86843ebc766e5089540ab92a1ac1037a85343214b18cf2f23b137ac5004e8a7969dc07d945ec7fb70d6820006343629149475ac1d19388135bdf0590d5926787299f68356546002c5c49c13c74d75b6e7b2245cbab31152e470615ccd5cfd91969bcda116a7d75a9241550e676f65e1b6a80bf324c58cdd7f9558818466e985c06d2989195cc9b9983e7c04850b645c6cb11e0ed220ec0afcbe2a94b3e7cde8f047216e562b8589964d7f8ccb6f1ca8d33b29b23257eeb48bd19967ce00e8278cbcdf0827877588263e4b978f62234b28f01b0a684e102e410e1d70e0625f0cdee3d2d45010f716d4689e7fa15d888d32dba8507ca700ebe80898dcdcb1229f4126826e60fbe2331bde2dbfa9bd900ed774c00d663ffdcdc874ddc727dbaf4c21a6b8b7182a2df087bfafdc6a44ddd95af7abd8c3b1c6f46d65ef212442ca960eedb49d439a85f2186f46022d7bcf578b25bcabcd4498ba209728c9ce517eb1ea79f62c7011ee17197b0877cddb49c8f5b17aff7bd2bc9bd63697b9ddefa5b5beb973c814257d3d2796b2165b8f8f9dfa3adfdb0a078dd7903c156fb714cc06f3f4883229d30492ddf3334be28a28f73b654d468c48bb27eaa32bfbaecd67a9cec4f17ffb68312eefdc60bb9c18e87cd219c74b3c6e9d151d4bf2097d373e7f8c60d7fef7d8a70aad84e33fe42915387ebd49310434a30f0b9ed47f7c213315a175899233168373e4e67cfec4800312adf6e1ad429d9a94ae3b3306fbb7ecaa7167c23bd50fa7bdbe1c4f0be4109cd94225dc97c793c1d75556230439c0d187dbfc7eb0f727c14e376f9e90076e6724edec606697c5de05b0560766d918dd82d7fc77e0def112d7dd2718545bee94b9da9aeac5001e8a6d91d85cfc1c79856d7a341a9ffc5a7900d963ac256aa3596c5989a441ee86dff184f856377771fb851510bd640db4ff53a48fe0bb93f018b5a1383c03fdb3cba36ad02f3f2aa275474b1b793b57c25b4a2c323051d75ae0cae3028a67b4b4077c0b8e34b625c628128b1eb32eea418b7306e1a7e47fcf36e787a66cc1560cd8a185acec8fbfe880be832eddf8497decfebe243057c7328f0a58b115bfe5a246ec1554c9c653fef7b0659bf2cc44b4bf319231ae5a4ef128f29b9705cc17808a699c1f88c4b5c02015eba1d4d6d622a07a5ca1f5397b2c5205d5d127974faf782132c70317f9e282a1c75f70ceb01c3c3971e1c9dfdaefed9dfeb5b50d11ed4a99303c32ec32204b00f7178c7dc188660cae8c7ca51d710f0e568ccf5b25e5e2f37bc76cac4723539c13b19326e73db67a3fecbadd9ad330264f22a03f65cce3b661ea6355d2dc118ab1f2a7347b18af0ab0f6ab46a10c8fc0bd88b0a32fc6f12c8606ccf4620a7e306f508c9415fda6d25720c3694e87b332aba99b1a259be27ebb7cb3a111abae11d79c311edd2c3ea82e3e83c0b35c1445c272acc5c94f5bc2cb4915ef978d6306eb8611f1628980a6979c0e6b5029dee52f05daad79dc4fd6ca4daaba9ec6e03e4c1a0ec0025db6855e374749a95e116b1bbc68aebf1f49c26dd194a1c9dcec9bebbb849cf1742c9d41508d77167984d69cb52a837dace1fca426c5b2a0587ba004a8f5a4ebc4eefea24276201a901daf8377c0191eccd823f13b2e4c51e61e3aee426a1b15a95be33d04ebf5426bcd01e0166cb15b03c534f757f45e889cd1683d024480f50c5617e4bbbd749d35c3036627c80d599411186b0533b8d8500c1b97b06bcc3a2dc2202fd25db4931985c2865b4517358d53bcf22255656b3a11f13287921878fe83e46fd5ccd203b937c7d4ee4a7580670d077dc2fd7c9cf14ec99d55ff44936c5f40242207776cc19b1613f56bd6c35d9e5ba6807e2cee0519c7d55aefce82e38d4738e508d1b025c23330dbfd283933088afd5e61f44f9461592fe9877e8dbb86b803472ae98ea3434bfa347bc40c41a991dfcfccdc80b0d070e7def92a326f67196e39d85be71f62873cc6bf0037f597bac5f8afa06d64ff9f0ba4846e8855c4769fb8db096689c16998ef5934aabe1c6c248ca031d0108e7640106d2a2222f2c2c0b32ce4314f404f364a51f1e9a264fc45d8b5d8e44b8278cb5f21e00aa68f6fd0b2c37bfdb34b51a49cb3a753ac9d7d48a5de2ba5a355d3c9cbf9782ecd3765820d5064672fa59cb414bac5d7c3fca2b0f49d80df3e5da7c064deb1f8d45ffe6db5118d1d31d0291a51781e16bcdd7e8846c0bce5a44d4e0e08f8a385e47c8fce494166ac84b7ba4aa690187a0c0f1c69cfaf1a04f8f4ed9dd7f76836ede92a35d2547d7fd4cc1adc3ece791366086b0a4742fecf8bafe557c3bda186cc11877f4bf0122a64d0e7132660d9638981742e52f38a1b97f1d0a269b012d008a2d3374cfc55c17c3fb607125d28c8d61046e5ad3df033936579706ba5ace7113a3bf232bfdf922f464b51acc2177a3710d7283240c79b17fc8ebb685a1aba2e4fdaa44663228708371c86f3eccb15f7c1e390825a621d80855ea74f8ace91a8d9f6ab64dcdc6403c15df8447be0f51d09c26ace86ac39cf2ff7807e0d3d5ca901b26bfc7674072e1929a6b11e68eceef8d7ea1fdf9ce4b16ab31c6676e0c00615bdad830cf26026b2b204812a7fef8db23eff207f115fe95aaeaebf190a4c599bc2a0e8ce858701785b8501183b3c33ba9cb208547ac800dfdb2693e5a9721d62a3b2e99cd4699c21c5d798a8e5a2208dafb6eae926a3e3caf67f707c83b7b8fefd40fbc719e58c986a62e8f26e9928b6169e8e0fff49f179bbc63064e7f6d98ddd71e424819d2bc5004f98093eac1acce6961ed3250ee3a62f59ec18d32235554fb22d95ad678640808ecd101562d4922687d97244b77ceca2b5f63d0c91cd32a3071c60be2498d958315c805946512024f45981f52ccb4fbc3da83618d652d6f73a60ca98379ea608c91747717e61a73511044c979794bb3df93ab23a594f2ce763504fedf205c425e65b12eae8e017d0d4fbb004695c5e409c259d82cb85f7f07ae8c1b6894a001d6f9489c8f676d38cb1af25d7aa975b1527344c3932d7475865f7b82ab1d9f170f5c43d1c19136938c7efd15fa943d7645e78a3bdfe071b47583569ffd672b33f9dafba6ce3250c22c6357c49c2aaadd2c4880349351af19de21c5e48de8ca91020b5cdef43d5e37a2c1fbe25afab36dcfef1248afcf5f24298f9bd2a12ff89e237172a8f40ed0662d20a38990b176ba5cd52f47ccb606d47c230b1b8f5063ea138e5019c165ed090ea733ef59284869094f9fd5eb438b48be91ff28104b862a05b494062b3fb58365e805b1f05cf6a56b5bec4e230613e0129348b5b6253cd2ce4318c1123aa8661899577ea44ed6ec7fccf11b662216e8227079a9fad041872454ab7e7cce282256e62d3430df18f1f81d86b011e1968ac1ad296fe2e857e6eb624219f3d5ac311a75c8e5b3288cb0fd200c9f5f7c49df3ddede95fef1fdaff5f599be6457f1c0156fe9714adb0b853e507a00a52b703a169284f5b5a503ce2d37e3c13f853e7f87120e68c323669fb6c0fa8f34e06498cb1d3590a8208e62f044fd930e196e031a71daf8d84120278a6d00528ec5440e61f4c1a84a9ae4391514c420bc9afed591adcfd02f96069a16b1a77ced3b62eea851df4307f829a46b4b2aa1222bed7a76cd463443c062d05d9e6b1b5413dcb0859f3fc25aaf3251cada740563801acabb4aae7e4fc98ab8e48475a904e005760593083e95f1eb452a9300bb31c6902a4366a4865234951498114a1987ae6cd1ce55489787462f98266fa7d449c3e2f2c0760f2bc939beec05bc0ca002ebcf29cd84ff74e5864543c5af07189d7fd66a0a1fa4b90b995e327af25690b2bb949e7d84b49363ac44c5046cd5e7776ea01b26a8624ccb065b7b12eeb9f1af123b4b098a632df2ddf3b206f421b267e2e33d57191066c302eec891248dc22441af82f64f41afa5cb9207d41095d63929b87a775842a7b5213e177b1b457e001176055e5934e9529a2feae343f3ea30738a5af949edcb7723d5a2025d63923e9c229b8ee256801ca029155aeefaa527bfb85650e3d97d673589199229a917624a102d791791d2a2f660f7a9c62c975c78094ba1c1829f08eb49cca90522889e33646b1142ceee64a3dd82299661792c862a39ba237752ccead65ea1cc61875503c71d2ead43c5fd88cca6a9b139d4ab4c9b43f74ef607dba5290b218f0bd50dba0d86efd5de3544a789ff0f2d9cbb62fc4d92e8cc95b06b512c4c01916574bd0e5619f8a26848210f6fb3ef1ff61e3f4237466fa9cd0232557372f1417790fa219a09a783799ad9c5482fdf156be7fecb2ff1cb202d8d1a06950296eb2924009a63b229c73c81d571c805916bbe1f817b6c6edbc98383958b793cfc485705ed70c6a0966da7a0a5e2750cb541b9a62ca7df7716ca910297d89b4749aae9f73ad2a876e5a47c9a066f21b96a010e6326a31a6faa375a1b7cf99f8cd3a80d687fcd45b7c580f0f4a8d7abc5ecc1b49f6914f349310a02e434de5bfc02a2e8b4811d53e8e782730bbffe2157d74cf39e9331d00e959c4d971e209058d8869a201fa35090d1796063ef863bb3e709544a1a119f6e29861a2605913d3890264efec5e3fdb7c074c469dc7319cf3e99086762902b0ac24b7dbb286efae5bf0a525935d694d39589ae5245f3af21f2d10ec38c85d74ec8ba684ffe45d3b3111247c5587d36edf357394d724ca8c2f02bb6472d093a26cd5be72ea0638d10ac9380655da08cc49ac47bc2fca4ffd3a0d331588d371dc8d18a12d0b1c9447b5ba234c0bc671337d66710e5feefbeb4d354f88266b41b2fabbae24e09c5e6d81394855c9dcb9ea4bf94b9850f948da4fa328fa621bfd148d54f879fa38f6b45529869f61a99d7073ce0cb645396645af8d294dc22f03f25db0bddaf0773e6c6ad715158a0040f4d90a91c8defcb64fe75cfd73405d4b0a7d9bced3209c02516f611f82123aaff020ba4af7140a0979953ad78df953d85f0339dd848673d419789ae9193ba398036519032a1018b1db1c0cd5adc9426e6d4276a6b205b972f9380359397a4e3243d4922dfdd9cc7ec6a79639da287c3f42c966182bb1f38a157abff75b40f430251af0c652842c492d28d0c23ddf0fc47f0ac6341bd4b7379af6ef24504742afb64ce9768649f07d9a7186ce84a8472f382c45784d9f70d2c44ea7d5a22782304e6238d4fcb17e0ba6cea961523a3a15f9e6437fa814e38d1b3e55ee5f0d9a9f2367ea4ef72e0af9de2ded6fb869d9210c04329474960763de9be5a91b16c79b64a11344890bad2beabe5a92fa19720c611f5669475ab5aca482c041e6fb0a822a1b073006c3c3718eb194ba9784ddb3142a5a32cabdad4cf5bf10ccd6a28a4d870194da88a7fc80257aafd57f08ecdda58239f4e29414bc88dd5e1e7d701bd43fa625916c7dc7a59f362f79152012b71acce949d018817b1761a93040732859a1a984b765aec20b6b0ea0d74d770ec4ca90e66b0808c7d713ada381b629b4e166ce8221d8a75f6c33815612e687ee65b5d478512545a54beea52995cc0503187b05950c39b16847950bcfb56d3e103ec73f5f48816f8bfe459765e8cf071e30a5f91401298625ade44efea2027f7914a3e604c4314a080b32d7530d2d6e5de0fe99eea43d13319b1fb20694334a90f1525ae7ae7a06228a8fafed67d1bd89f3e322196be04cac6bcb10fc77d4bd26fef75ce3b21026f6d30f2095f00820313c144591af411b26c8fefce9cdca1b3b48ddfe1d1d7a72fe65fc2bd3273e047985f60fc51b47f2ca01dc978f7ed519af58481b08e06840a6aa3035c460b10abd8499904eef64c573d5e131bb71fe2555eb0c5dcee9ba9acb2628ae33374ed061fc7af668033ce1291b7adf7db406e704cc1a8b15739110c5ae62d4a251f40815bc219edebb747d182ac2082399284d5edee2e63533ca0a23b904cebf5e8e16c854bf17355f8c6c684efaa680ef4747ae6868707da580e2779ab0c7c9b219065c409aa6210a341774de252aefd80e010484b870d1b5a5b1c0d52e36e4915265ebb23753c10570d4526b1f0e8078cbb79340300219ce9bca11b0e8f705822a1ff4060a37d4f4d39ae5572a13f51d2e501f9daf43f582ed4dcfac8c4b863200017571ec9d09bbdc5627ff69be08049595f4cc3b98fec92827268423515e34ab754078d7334ccd6317b123bed65c5c6d7af7a30f21778a3e97a7af184567bfd191b7b8d6608d0f0ef7e74b459dbb5f3c08cd7d9efdc2e59b8348ec5b9e90a5181aaf33b2da7431c367a216c590cc7d691746f65c3acfdd448577cd3cd25a96e0a3a635e61a3cfb451b50f09fb93ffe439326e3edf6738d2b8fcc5cffb9b2e346390b930da33d781306531a9f4efb15eb4b9ceccb39acf827a8bcd705c715c5cf39c4f51afd65ecb055ee33efb5a50c34222bfb657ead15c9974dd63638d94d489a91aec1417a297f02cf8f4c1927fa26e152ecb54f917c2e1bdfd8bd6d99118606f125a010f7d51c2de63e05cf4722515fdbe26560a062768aea2f4eb7c0706245eae752ecc02507fa930a42ebfa3de013468b3f1ab79bc128a0afbe8e26b4ca04857ebfd4c27a00287a65f1eae6851839140ad1171e01c3e209f6d5025f1b2e1fc20cfddcd85ac3e30bf4b2a3733046f63c2bb6e556d3a0221e6ec46a052026b96b2ab0adc7a66d086cf9fcdb2f95ce0e20459f683b32146b5b9f9815ae651e714af914241965adaf38d2e99a15c876249853d09e105e9be4d4695dc28c95e207200c8b3ca04dab410442ce37ec9e22c176a7e19f1507d49800b09be62dd243a94544fa93e4b5be327844b372500a8cd91b47c5629a92ae5e192b5fe92ac13457e8f2f9bd15f5905ec3cab2039c2dc6b38acfb6fffc7e0bf4186813868e8ab7e9929b3261f788eb9b0bd6700c519fa78b81add9d5bbf6d15db3a50ebeb8eb866a33c21202f4101e4076fbfb2ae8e083920758661119fd1ea68a249d4ff777ee3e86f0a5d70ef23f810968e50f0a0a55ea1385b4450f4cfde7660b08669f662faad44b8334d88046cea44d99941bb0e9be97391479b6ba4d6ebe58deddafff1f0a73c076482e7b08564fcceaac78ba96d10d9867771757308197cafd7a502ac1d454ef87093c8f9114433d78d4ce48dc1c8ee8a9641c1d9d95454bdbd97ad485679bf60fcff77d6f05859c5fcba60ff72c4a7a8028f89afdb5740515c640679040342e880e3f138ba3b Params = SHAKE128_W16_H10 Msg = PrivateKey = 070000079537ecee1c0647d04547437ca9ab78625946b04aa7e0c768c2cc3db91ad1e402728fad8d287ff76d6cda969df484defc966c808757242a4b86b76310a2a2909200000000000000dedfb899c637c4cf0853585395a9e9439d306dd639db1a67bbdc07c21d9e050438ce94c8e4326e6c56ace0b496e3f1f862ef0da734329913f045b522068eff33d5 Signature = 00000000000000debdde700cbb43a9be98ff8c5460f50ba66b56e1d12513c1005176e9168914102b9d80c529960b0033c06e68b8121e78abcf83276731c1bfd2d34f42ff4d8d79036330bc32724366c67b8c3550aa3f30b8f3c820f146e92e6cdce536fe87726bf9fda5b9685871c7a467ae9f9fa98adc0af8dda0e122ffac6d5c4197a4214585bf30fb33181b165276f5c99aff3285a46ecafb91cfa96805ebd3d1ee1a75d6eb39241c0e15d296d677cbd9a537ec8cda0f8070fa69d9368eeac5c9d51e5836e1cd42f646c4f165deeb4e4a3e7dcb053048192da64b634e11c048b932aae0c3b5dcc2be1d18f9a20037585fa7dc493fb2f281e585524bdc27bbf080f640c028578eede1508a2867a2445236aff6b2299d1c631bbd63790693df8cbaf1a311f448bfe9fc382636fcd06945e04b212df9ef1a5299695755b6ebcc7aaa00640975f9d32f4b249be0734407af5d80b168cd0a0f5881ceda7bb055ce6faefba239526a5292a40d6e0e2b5ab6c5ecb595c3654754e4c2e5b70e6038be712d7f60edbba1ae2ad1898d116065fc7f687261449cfca4d936e4c4e0599be73ba6826a5d2b715719d8c6445e4ecf852e665028b52d257cb806aad4077c06ff7149eb3b1c489e7a4978ea3e2eb5381790786c4beb4f003b527b7a10e1c675c198bc517f11f12b0a6a871f95b1a804d132e48b57fc56883fe813a6350414821c20251ce26d79418904293121db8ca93aec01a07b2364d28d1bd6cfb3c1a7c97599e70b53da9dc3461e89729faf792dc77914d192a77649b3ee416ed8025797038bf2fee722322f52d96faa6340e8d65e5aefa4b24cd0ab5cf68ea817842596b2a49659dbe42ddc7bb86209d8f0685367bb7b1ccdaa0cacae3704ac6b532226b37719c1d8594921c438c5f1a4435754c1e9bf9dc7b18a0b6332594795dbe334320837bd42d6fc1c78f24911d6976514b71c71bf2fb6f0d829ed650714e3f53b779d7c1c9008dd3b739ed3d98d5d00eeda830e3f36973826a8b06b2f94d3d4b2e8f2b30edc19a9339ba043ec7ff654dc0987df7a1c34ca7decb95ed9d8c9861fcfb5a52f5e73b9aa09fa9cc26e9d081d3ba972a5fb0ad90fa0e53a28ecb9c1f9c6dc2b42b4da5ad877ae372def80039f42f692a4b97fde4458c6b568e61064ff5c3b0461a1fa935641a2e4a97b5575485951efc5a4c6374b537c8cfe5e9858591d87c3e63393b07b4f1cf77f3f01a343a9c1931e7a594518201ed9606cd46ca1cc2a2e5b4bed13594f96cef519fe80f10bcc0c30c6d7236b2046d6bd66d9b5e8c8bb616c20e7ba86deaff2f815fbfe0c3ed35cd901b897bd5da09596c9b63519ce7bfa4f5c8f11ab80ab81f0ee968fe1a2fa8e9870284cf908a85a18ab6d7b3d2ec7eb53d47c34663d6bcb575a9d965027632b9a1bb7147e23e7371b9406d0c0a90892a46efed3a1d508202e2599daa932b6fdbcb99c750d03766a84c427709f701d6bd74b367803deb1a4945643b71c2b11085f9ed4290f5e21c568db5561353734111bc4c32ee9bba1320e4a816846410768cfddc7e5b4d4304072f1f692ef52f6342bcd6f6804fb0e63501db7ac1a2298b47c08370eeb89cb8c33e258bf9fca569696863a7cd69f0ea58b88ed21b81804789f3a1fed2f5005c605d3b408a3b0819acfb3aa963541c6bf7da8c8619d9faa574ea03dd2ac16ae8bdfd451de6244072a7c5eb0ff0b7f0b2b0e9db1f82afffbdee121af10643a275569ab2aa875f34fd80a7a1a8943991aa0ddbae6dd345015f54060b5d629732708b30e65ae556cc6e78b0a5cf5f50af8b683192397671a48e1da40266e06d7b58002263c709cfa0015dd43c904b30a03763721f0a50111c62354ee2525f32b579f01abbcd6c2c2599035037e4e3e02544ba7339f7ecdef49dc6f2cbdfd4cf3601bbd568ab007b59f13bc9c2833bcf8ced9462b922947dcef8bdae028c5b9b7087de900bd1bf1da597a8d2da2b7b1c03f982cc6869903cbc29b0c58a99276ba114023f25b19b60d37cb4f94e825f569299421a4f74dc3b2798efb32dde721b311c65df8ed42f4bb69d408275c095591e02dc591a5ccb9c84d4f01b4b582a7bea8bdfcd65990ae7e9ad063c1b6fb7811cf104ee9b08ab8e46e23f85eff3e63f89af3c924472d8cc26af3e784d4cd6e3d46bb2cdcc0040cded63629cb84bc45428ecfb96fb093ccbd47803bed4d55cfc7830663da359bff981ed072ae96ca0e1361a45d8d14bf41c480371975b28976d3396b58e294c4249162ec0ff22429b34d992ec19721923d06bb9d3b887c4683f60396065aca3502baadcb945bd4f8d0290e3b7bce115eaf33f3c5c961a9c43ae7be38e5513407043e9597abffea615c278572af8c466ab0f2bc4f73f563810d74473a00b1126251a40ca01e7f2038ec4e303b88c6f9e24c87549eeb69aca154f6a983cc8d77d140fbd07c4c635c5202a4694ccf0e94ae9d50020839d59580047c70fc1c12b2d207f5cdc6a377ec8737e1acce80fe3d3293e7c14c8da253e8cecafd1a90370d43f6af28b717121ed5e85bfd8f5911b2054134f3aa0e0c023bae4e5adbcb3ada528ce1bdb3c0f1068bc6c528d05dcee6f7315ff7703f7536b79e33ab34f39072a84514c1ea7b414cdeefb6ea5090674886b42dc2a7014d1452e711e9de4f29e1dd3cff9b8830943d8fb5ef7376bb247082314ddbb4f56218c9bc90eb48e21ab1ff77c786ccaacd8e401eaf0f28c657bbb4c30fa2ff41705a694d923d9f4f3fd6237b619b119129378706c314db3ce4e7955dd6bbc0c7169f876a8cebfb5f6bf0d798eb614dee007df4bba69b48e18365d4243615095403e0ead133cba9847102d83f65c926bd6438b6745b526c55de20b16907a9756fc6ad1dea8dda7cf81b9e15fac00df9c4840b2ded41206e2a492d1e24bcd630fe8a6433ada9049befaf1851f6b1262730ebd2c7c3e2733a6fde3bf6a0af18ae01b0cc736aa0a36fb7d6c4d293ddcae40e1fd725bfdebf9cf153e3bba1f7ac5be393c925a691e22ee692b8986b99aa7bad8d9a932e9d18d34ed1402943fef123b3e7e12fba351dc81e1d7c3cdd3eeab5f9694b1e9d36c3fb0cf009c7d0df5df8ae2cc4ddbcb047ea81c5cc42b3e3b626270bc783abcae0e679b95f034ce29dbc7f4efcc0dddc747603749e8bbca16e3dbc618161ee3431648be4128b864037cee66944e3792e8135e8dade34c908b5249378874fc61ed7541d7a363167e1c73922afcc2071352e03de58810e347cc21fdea5a963aaaf547fa80708164dc98d09502365fd4b4f496fef25366d7e9e6d83310623292da1abac657dd4bfaa88ff69d4e0e421540e23b6fafdfd9f40c99628164feda921f9fdb4d27765095a9fa845628b1c01267edf464577ef82fd0c43d89453cb8bec2186d523e06948a8e6fd4ec9301c30d88e6b6f39764f05be03e36555356220572294da751e4926465bd1afeb93e17f7c06d2e149fdf8d7af284e97c9dca41df9ca90060e68e14d7506fb5921d56ed8e340 Params = SHAKE128_W16_H10 Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 PrivateKey = 0700000718c654baa192a0a438f785f6942cbb325bae26cd4df8f729fd9f3da7446c0bc233a25449dffc6e8df1bd619c99ce37831ca1c4a7c9e897246809923a9973fc32000000000000013e3cf18da047500e7e6ea714198c89139aefa72ff7d7e590c26366e094afe1fc2eb651da65e74070cf608e222a4495d0e15bbe40f3c43e50837e7cf50e703cdef6 Signature = 000000000000013eca6f835778a14ef126b352b524091a1463535d989dc84ebf715116276b6a74d86bd5b34e3b2e921a0a6e4da7d05b04a923a7cf580abbdeef7813f9a9afce3aa1f71d2ef79af83e183120012e07197dc8c9b1ad7bffe5debe5b3a8255b113fed8d7371c19b70580cabc2c73660d0c13e04b9caf89eb5dc0908ab9e19555671d91ceeac473d37c66bc1736a87b13a3e0a670547e3e920d5699e0b74212bde64f280de61df5250a931e93126b156950e2876c729785ac49b9cfebf8ae8b345ad819c0c3f94540608dc441c33fb6ef33f759be6d0d87df90712edb06a484b631c52d6fe3438c3075567dcd07e9f2776c9f31a7acb90fbd4d20523ed8b5c6fe4dd9d7eec148dce2664c80e096c6699de64be64f6c655db514a95e70d097475399738167b2b1c23cdbcb1615d1bc1732b600a177583522681e285928ba13efe4cc5b949105d23f24529a11ee289f356f1e9e66d05637ce972391e9ca8610d50ff8bf1dae7a96e6dc5c7eb308b0d95f3c8c9f1d2473770efb9e8fa4df6889578b6ba5c565149ef428acd122df433fe750723cb65086dfd1b56ff0621cf5cbf609f6aae768bf453e9b0841058bfc2523bdf67729e110aaf83279ceb6fa18c9069d86a4f1edbc017602872349820944f42d74228eb7bca86321c88ba392d87b0b0a015ecca04c57f8e15ed1b26254089a95c3d684d24708c8408981bdf1dffb4b31a467a178a62152a127c708ffda4b82925ec0833205e5eaecc697ca1f989c9a15c0094aca7e53149493af81eace928f0a1a06e477b2242869356d633a3020d34cc9e0a7440652be29c89eef4a6d249bcc784fe22fc2963d5ac317f06485bdefeb07342a655098988d17a427472863ff6c0182063a15065c59c977330b027b8e9869f75ec8a53962f77c8db011dc2dd2fdc118205aa0f32027ee134e42939a60d6db5f23c727c74623ff0688626da4f355c738a5890305e8aaa804620cab165e3c2ade82ac1febe49bd63d8f9d815be02dd6684c4bd61fecbec0a309d30c0cc4f7f09588c6a39c801db86822c8f96a2d2dfb2e7088f439a08aba893b55620de605103c485e3830f040b6f0cca0fa3805576e6903dd22052e6fd456b5d18faec4543452d57cde0fd6a993d057f81a82dc24618d619b9f6c114d587033c7c769cc0f6a1dfdc18d329cae3dd4710fd64b527f48a44ec365eb20af450f1f7715a1e37356ee55d47a813fbd178aacb6a0561adfe72decfb485f033944f268e501902782ca21abb073a16b71dfb063bda60cd8f7db8d8643e24c6dd994fc83c0a39d672942409f53a24a72b1ce1fe2b13b5fd8ee3ac08bec6f9ed51cd45119fee647a951744f6e4590e12ff4d22def1fdcb47b1a9bd6cb8cd934dbae43858b29c74f2c8be7b8a06aa2e2fb65c32e36b375439a41d90d58152132aa4416aa0eb8b5c5e197ab2f0c8b1e195b4aee0bfd2c7dbad5403052c77632f8c68f6eceb7e7d3e3fda36ec41b02c91b6feecad03f48b968e0725d54baebbdf9953cfa115d380948b62a045ad4e03c4b340c23846d400c8f0e9e380d4499e62fa0bc05db160b72eca3475524b56b6dfac5271edb64e139ea7fc2b3c7617c2436aa4727afef1756bec676964d7b4c749d6beb8366a85123c0fd3b9eae24d89677b09a57ca64b49fe3660fe350fb163992f19a6f03952f946292b02ca0fe1329770bf2cfba6581d9f09ad928c2ab185bc5bf5fd365e8b6c67f365b5cfda63687ccd2b2c1c8864c265698caea8b7051a3424129304103dcf59d7292e1f3d1764231a26fc134f4dedf13f9422f10da5e76ff79992b7cafcd2c00035ea987b0e713cf5005972ec678e5d163352bfd0cde361e6e101b72c14f61bd5926f961eb0c3d94d72999fa876bbccd489e5f407c287aa1c5ec0df90eceee93cffc9cb079234f62123e85fb89180edbe6b74ddfc1e910a7d864a133eea7866ee208a24d6ce40d6ad163c648ac0342ba881a2af4069669926c77dd7adf33a5a5108d0662424102e0183c0eead65aa8140405b4a6c705ae1ca4c03086805ac22e46609cfea8fbf1100114bc50ed781b8b66e898697dad68c9c389ef61955fe24ccfba2f5faf8295915f22be1259d7dc9180ab79532a92272e74adc1dea57c5d91119004a83a072905b52f0046a979c13bfc104456603d36ee3bf36aaacba0c8192244c3382aaa548325ebff30e8973f690db4130a4d0d8200df6cb01be86d7e2fa6586a32cb541034e2cd1e87d256a9414c49c88192735680919071d84877dc7045db9debf6acad8aa281da5017ade13aa14179e463c775a1df0163619bddf19ef74c2d3d5877b3262fa0ade9b81c64c0db12a6c829f557d8792aef8163434e2e5500d7e7f6898990f0e813b88191b28f46bd69234649f06ca5d788a936576fbc38f1add43202be8376d1085040cda2f6cad126efd579ab08e547ab3239c72d5e185a3dc576bbb02ece602c3650e93748ca53c60c4252de9e8dffbb0a74cfb3a6a02219b1d5930d297bf92e92b7d2e0bc3eca1f13f54f218ab6f3f3709d71a7c53e54cf0867c8ffa0777b0111adec10689727d25401d531329a8178c4a9567d750c41768f8f3b522ffb035f4ef25f176d5754d41fdb054153995c07b25dd59275a08c20332c06c29c37110a912f1eb699560cf781dd5a555eeee28d53d57ae49466855598e75f33f56228da802be5c277ba1c678682fb5202ed39aa3078dccd5b4a6ca7ac23e45dae6d00a9040bf911660f14bdeb7ef187c910a845e7db8fb0fe9bc5f4028d935c463d69360079868340685d66bbf115b6ae04acc2be4df9103c539891e8057c8c9222ae570a35efb682e40c10028dae43dfda9a35b100ca1114ed17985195d67493e8ab81670491307befcaae25ba69f92f665ea65fb8a5a3fe9760358767e7c6e2baf5a5627892618f1cd786c8987fd17b1f132470b0669a08fc6b9b417d6a36b2f394e9cb03a1bd5d63998b2e6e7913f54789d3face9b8459243bdd44ef3a0b004b608989cf4739ed718aca318e8cdb146dc0daa2283535c9d1b4346d16705be19a39eb2119e1dbda3d2c91202ab3f600ddc21aa77f5c3dfcad53d18a0020ee9f456b00ea60eeaf8f4b5eb4635a21eb7b0a85abb8b645eba29c1fd01d59b64adc8f50d4205bbcfa818d77b6da9273f4de212916cc28f1a7b496034aac85e3b2886e150684fb563d8e337cbf64ebac1a8d056457632d12e5baad377565431d5359b98ad26e85f4c9c89bd7b7e8a61fe166d4aa9c5b23cbaaa568bdb40fd76beff7cb745c0ab9bedd66ed4773428f9878091cdbf7744b186cad4604b50a2f323e0693e842007c3b4b1f71e908da89ddf83af7d9572717d25edb3dd7122dd5a7170f84eaf45f13e81528cfdfe262f59e1b218264037f2523a7107039685dfeda0bc3a9461015e2eff310245fd1299475594782a13658d96cf738852c762c037865cf3ff0f25a82c28d7528906d4623f7d1e692c3ba4d5e7001b10f19cc264a93c59a5737316474037fe4646e81fbf1 # Params = SHAKE128_W16_H16 # Msg = # PrivateKey = 0800000840fb747748992598c9ef276c7a3d4267441b36a5f6a4eaff941532bec21fd5f0b9af8772ab881bd5e7edc8dc9051955dfcee0dcd673c823ecf1094cc9f009de1000000000000125a26b6f6ba6f969c26ff782fcd49c906a8a02b4b4560432f86cdb8772b576b1f37b1519272304ca907bc5bd936a360cb1de2a0317470ed12fd31d0ce1827d9c177 # Signature = 000000000000125a4be9f6c05cf78a850b3e86961f270a67eed71f9fbb1eabdf1876b594c725d8f60ba2ffd24dcbf2bea442413f8eecffa036b171504d693783cb050e35c58f63806d60267eb93548d1d07c4c5ce596e56640085fbcb03e44d83f43fbdd1151e79212e2c4171095ce7550aa8f45a313fc9b28a9070d4c9b447b05d5d5e358c8d206f91f94e06a2bf8e3845833a0016ed8394ea3bc93eb3020c0575177a5d6e0692d784310d71aa016c9097ed52df7cc38ee67f2bcbfb179a0332a996faf50da1efc531d96ab9fcb443997240278f18a8277c1808e10b974aa6bd1995e8cb21d90de4e02298ce070f5e1f146ded1e66153097cd872f7d1be2692b7b7f9e40408f8c15160a7aa87c4041c475891c0197a3d78bd34139f79d6467a744196fe3473f958be7c3e9c940ed925b10f38cdaba43cafe2fd395e32d0b7be90311bd015c9b3ea747bb39a1778cc0144cd64820478305d3c898cbccb7a4cfffdc073c0f17ff292ccdaeee5b9a4f814b266fec7862dc3ad52c0877487c688ffe728eca6415e1def48ba6d8e8f7c9a67edccefde140f5df76dfeb3d583b628e3af28380324c59fc365e9c827adf5acbfab72a2f19ae736129eca8747a261be5c9fbf283f8281efb76dcc4487bcc77e51e65c393d4933d4040e3481f99c477111f832add067ef4dcebe698ca5717702019b3f63e71bb7239150b35d6f2fd7a74d0af0227a45bf541a0f88d001c3415f0cbf4e4935f29410bdd838970810979a1f8ab7d467ec5c4853e6590f8f59c639be04446f3e1c90e5aec65eefc74762bc49cc352ea8285e4387e9402b46796cb9a2db7dee3c6d1f2c40aa2b7e95f5f4f2f2c7e3d5f41bccb2b003c9a797d3c265c9452b9b98ed8f961626d17672de2338930ebca2c53ee39adb7a049ba35d0d18d916d1ae410d181ea7073afb98aac4c63f805f1f67fb390003ee6c57b3f43193ceb8eeb1a22b1488d6c32cfc6a2af3b975b980d26ea5e129a08f731f62a4c9e23f0308e27b0d51a47d931ee9ed71dc7d735e443ae35972aade3e0ae2a6a1f48cb3acc6511590a9fc2ebc9eaadbd5e677617fbf407c3838d1e00c146046ed79dca4825f402612248c86cdb2a38b6ef1773483fd81227ef12ddf9d924f321612281ddc2f02eda61c68ae9673b08a0360cc030dc28e1b7a57e8c5bc2a9bcc0d6927661ddf8e72f44ec2cfe62a3e8b4403c955b6b237f299f858aad53552f780e48a69f946287f81e0a07b9d9306e06e628922822f9b210035a4efa79db3659710a8770da4ca7f943133d466ddc9d22a3d086254fbe0a7f87183f6bd011b166513ce0742fc8549f247bd728208eef6f327cdd583f4d0ee6d3cf4278ac15c48853385ec748ac09f0c282d99c753dd4bee5161a6d0722507e0db0201c8025b04eadf40a1815991fd21d73afc7d7f3b6759f1c045876be75d07ca66380ac8fd1e69fad48500e84607acae702b43bd7c090a4c700af2e7fec6e8fe998947c8c1427e21b211ae4425ad8f001f48f5f7333f69f4e5b1072e85e6d54ba019274d7573ed4d810f69fad90af0820b51fd79a658080716b694742e3ec5332be5465159294d00197b149b0da756eaa1814590c5db6118ebedac265cfc875ae1ffa2fa3efeb20113d3d9d57ccd4e2b2c31e1483b1724701b6f7411f5abf270ebdcfa7f59f9a7938a17e9408010d8b36f3332810733b14c844dd0b51765bb22e5659b261d6a00124361528ac23ae66b3c4904e40b7691b81e4e20370be62ae056b57c1fbffcbb6a0d3ad371ffd5b4cc27ed047909c8e248685175288eccac2e64f39c9af161810da5ad27845fd65ffe5038552a5702856feb23a4d1101ca9765d7e1c4954ba480e920141fa78c40597b2c8126d7a212a6e812e6bcbf2356a9142765ababc33d7202be770dbe14ec2495221699600aae7ca4ea1a513f5af209efcafff7b77f8052f5c5af3f17f2b6732183ae0f020845d12c70acd42a4c42a94322751269021fec1757c4538d2400f56cb581f92032eb4d1f291278918c469c9089ba498bc23cdf4d9e97d4b0025fb59644a56222616643e5dd76beffd78e44126ca00c846b680270c0b675cf1b6a7f226152e92f415c00cc43b3e7737faff88a0faecec8f35f75ed69df302b3b37c6a1126277b72d231b9b093cf76a430c87a3ec88081cc139ceec64b2d358bb3523a91538588a9d6c28825e3b0293f7031580d3b46606c3ed23a13a4c777bbbd3c6ad0dceaf615436e40f25407c79b5b96517ac23343649dd4343378ddb75aa7450b0747121c8acd216eccff4a5fe356c1eb3e225cdc619de63afb55fa2ce5a468ce944d56fd065075675fb25ac4687f33ca92f3587fb61f8b01cba6807b3b7720212ba5537e8b70c7212db1700ca093a02b2ba1dc55523bed2f03cd90d4d5917d59ba959c8e32913b14624f60b8af61a516710d6cd043c9a54fe3d9dd50c40ca3dc6f77fbecf13a9edf8250b3b17bd9ff4ba32afe3770c47218152e8ccf9f05be964e9f14c094fc8fe21b2f454ca6b81079aed652c57fe491d9cf63dc834e169e64941d15e4e52fe3859c49ac4df41cf68e6cccd840e882d053667184a3f3a6f203984040f92dd8639ceb188cd774803bc8f281c03c7982d85f6ffd12823b5615fd263300c4af3b0dab7ef5c1430a027af10f0ab4066b07e6dec3d169c95a90cdcf210b184dd920a95961cf79e6b940954c0cfd0eead98586eb1f58e6eef2036bfb8744d3ec2736ff7e941eb121a9c342fef5cdbdc63f87aaedb7c49fee7d99efb6d1aeed728632c3a0bc006946810d1661470ed33636f227433177a23600306a05b1506936c25d5984b97992f297f6cdf24ebeb51c51fe38f5c90a5bfa5bcdc728c5bfc3188724a4e5e629920821810a8ed2319c0f02a20f9b3cd075c3b5dccd54a4c83a7c9358e4464dc363aa3aeeb3cf53b7916d4602091f6091fb2918fcec29e8dd4a09cee3c349272bf20f209f1a6156d38ede2b1a1fda5e5c1a2b945b54e5161a1671bd75f3a76c44db846a81eee5dcde9a2e14d142d8c8ed82c9792fa6715a496fffc76d5d4c2acb16a94b6b2647bf5032c9ff4ea783229feac75fb0dec7152fd4f2f76fdec37b81eebdd0e9343b36ee1c1d9ab78429b4805d581f4cd9cd845ec6519f72c75781dbff7d6ce407d1be672f9dcc8fcc7c512e830f44aab461e481e1a08a4790aa74ffd44d0c557d8aac3639444ee7ec65e89e990442aa8ee890db44b67f0894f3de1b7edf94b8fdb19308d97ffca92d1a18fda2d8ac59faf0049ac5f643b15a882163e1620e4d0826d495ca7cdecf9ce37b6a7509771ae0d5d5e655a23dcf02cad1dd046734d822f77f3f791ed46e1af1b442f6bc2796d4a1cb69e36f267408772831f123f968d789b836b6c8cf49e2f1957f674b9d8a9f74615f01209e2d3182a44200d356381b1a70caac40551e0e4b035fd948bc37eeec98853d15cadbcc48749c1258b2988594ccbeb5bccdacbaf7f52a68a8dbbc2ac80594f3eabfdd44496c35efcee04d11a28fca8a29b2fd98306caf6cea4ed6c1b96a858a1f08846298e82e3a0f3ed61782940d7e238520aa324db6538ca0930cddc1a47105a20054fed4d772ed7efdbb089c527cb2b18ab1a54ede937a1b2c5d98126cdd0fc58fb29e471495b29166e75f37da7ac5edf5f7c8fd5fad70554fdd0d274783b424dd8a615a3121fb59f616ab3d47a4330eb1b7d51501985417114d01ed3a502194bcc6a17e78545ff9801d34e06944aff5e745845ea611fe3e2f764149903e5908efd95ce3001c85c79bf037b322 # # Params = SHAKE128_W16_H16 # Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 # PrivateKey = 08000008bd46156c87f750bd6653f3418faa7750abf03e5d42bf2b46c69dccb14ad624e948b55ff93824a6d3acbea9fd9468a23a511ce23757c59250378065d48aeab8de00000000000007ac30b42f1877c5d5fd3013781734205c59969113e7941d8bc9df57c7928d9b5c5eb56ea9e196d429352311a9a028b32e8b246ca306046bea3b58cc659d5a28a390 # Signature = 00000000000007acedcaabc7db1b849f611ac87a82af5dbe9fefc4484d617022500037757def1ecddf8254cc4a7ffea0b11ce61ec565ee20790c68ae51b9f69d354de444c6475b4807dcfdb624429e989fcc155a04e930cd830d362cbbb315318888e64eaeb1fa4131c6c547bc3753f2a4a86e6d93c06c34a9fa9d97840cd22cb35924cdda10694a248943dd2efab232c37528a4bba726045c48023fb3b26ba0fc2a9560e545aefa1eb3dcfe7c55f0ee472e5d836dbddb6477c6032aceb039bf0a5fd50cfd75607acdadc8c8429f29e6663ea5af6bce0bca581f72db30fcfee1c17a405b4ad1598ef60c84a0bef6f98891e139fa1933bf42cca456d9e2765a1fdb21ea8b9ee9b0d6315e5bfc54a93bd12ce9ea8202637405754363ed8381102e39913cedd34c84e46ec3ff218fbda7709b5c560cd9f8127c9c9282a6dc1802158b921ba8958b4bf057d119ff4eaa35ec917eff9c57587aba7bcdf93aa2783e58a78809c3c2cd0636d7a5ecd318b10a52203578eb5f6b4c65a9260aa861286344501a3fcfe266b9d65d17aa9ee0c429da47294ceaeb1f3500e69435adf7a421a5f830892034ab4635c9e7133022ef71af7122565a79cc21182adfed9417cf699eea4ad2cbc64969bf28bac9cf098789fec560a0043d5449ecf366da8aa8023aa81ea798ef1c61d0058e51af5f22a4daac8e6bfe7af65f220e1007376d5914b2e94f597dfb1c6cdf4b82e2339dbc83eb5e33158d734058142abb9f1fec3d0945ecdc5b3e37734b2bc01ee9e7d8e61f83764df44779b62adf636c2878cca7739bbf1495cc7de96a823ea5646aa76f954e33f2fb6869802b244e1fa4880c6c25d58bfd261ece6d982e2e5805f0f531e1bdf07b4aa5c0ccc4da85789db7a6abc3d828d0d87b67e5e26e8ef9f97fd3948ac0fbaae4b6760fc6877feb0014af9c66788318c7d2b00a13b1658913634a9c6a4feed7546f625bd54798fe8c6199e231044a0ce4ec4a56a0884fcd13b1ccf8d96f81dc1822bfe719bb99ee36884081612ad25e36f4439294d1b7c6a9daffebe87445568d15a98e1b13f1eb19113c6972ca16481d5f519a6338d6d8b24d7b497899fd2889c1b0986d3a47aee1d1e7095be77bc025d00353c13db90bde19214233334a677d093b88aa71da18e5c9d7fd80d9e588fa33c655e25c5793a4435b26b347a2d72f9dbc12e1183d018fa1e352c2190c0345774bb611dd38392e532cf1f56ff3bd6f6db6586ed52e3423470ee5066b0dc434ebf3924950bab1d955ee0a6573c6e644217df0ea031130a5daeed14a8e00e0ee35f8deb4ebb6619964b6fe93974c051dab38c29ec03fcbb8f863d53d7fdb36503230255082490acbef665e2a9e1c8e9a6e3724b38c237e39a4d618da97f53f102442ff8e566d979b3e44b2e903cd616ac69110d33759bbaef5d692a85964f13135e0016d155e5d6534653bbbef33710a01a4673ff0463fa643ebae71fd13195383abd01d9265fa5b63198715c042fa41913a3359ff63ad3fe4944e332f93bcc9d43b505076777aec57468b05e88634513f9991fd33e8b35c50e4aeba93a6946ac3379b0d29d1c54b909d329f39263f07bedb6390ab2769ef12f2455b70da0fb63b52aae8b76e15f8e6302cac3aa5fe051edc967f9c0a01a78398064ca923ff752f085f992a9255081db655f6ba97c0283b615a5db8b17c63273f346f728643d923037b4a0a82caf210acca8443ebda48d494ed9be5a678c466def1719f9da28c744dac8f4c35cf93997edaa4f38608f1f919a50942a56503d8cd8ea51b62febd08b0001518483a6f7ae2ad3cd75224cd7400e8e551c6f78a1e5229a86878e296b40476b49d79c7cb8eb6e0c63a08da4a2999e72c13c52c9df5c0185fcdd12ed8bd095d9c534f0b5b91816748647c0ed7106770d0b759c8921d9a21f12eab26f4dfa33e94878c94848f0d911f420d48a3b4255b1412ba3c9d8c95e542c7e9075c8f8fbc62ad9ca94936ba8f539a34e205dc9802730593ab0b9b48172e3b58c6aa36e92bfc04cf7c3e450fd4c3db22a23d461c4f582d5ee924ba529c60c412cbf4917f9b8465f5af6e6677f972194c7af2db5c03636567e329206dbf8f90cfe9316a5e261b5c73e8d4124d94d5775f323026d6d109dffee9a19908ce3bf07041f204e492ea0b1f09a1470e3cfe087a0de85ff81392487fa7d69f3acb85a2311f129ca80755450311c6abded684faa0144dbe7b12d8e54c56d12234153c5f89d9945899bb5d7a95a7da13f267952199663c6e325d322a141e498b125115dd6033b349ef17cc35be05b24a9789d133adfd7cf21b5ef8bc2bfc3c7035112baf5a97d3dfb05285fe33c2f5784759fdf44b9dce74100e5fff767104d26733134f375ec35660996164249e3fa1960bd6d7801a3af3cff89b50f881d5c8755d8983d423d96531feaf0174fc115d5987ea3571c230a3dfef5b09912b84add3e546591936aca6b2f24ba152cc8f1d77be7f2b65be491bfe4b90c6420e6a14a36bc36a79334d5422888eb49e4e5af10c29bdb19f2ed145ab4504707e710206e0c5b5a4c7e54a844e9c7cd512870f99435625e1878143b2d0af2498a092f2aa029692650b9d74be64ed969e86ac226efd16535479f763c9fc4bc702ccfb5cec9b4b3ca6128c2d2fd39e651e832c1e6fe8d78021889bbe69ba39ea569ae91c2ee07632a9dd214f84f638a464457a087f895ac1b4c3054f0de5d0ce0dfe0597bfa924d8ba27e971bf6ca25ddfea203015256972f2ea2dc79c0381f5333d9f5cb486082473fb0d1b8824dfe9668ea4805a9f53f2af99cb910ac9942aae971c17f9d15980c2a06629f81e1a39520460c556b8dac34b18a5cfd17d6507615b5e9b18f295767de7ecdfc529b71aad17ee8793cba4859ecfb0681c039ed2bb2ca599e5df104a076d185825474519d34296fd79e233dc59670e3f41a7bdc5af123fea56c7b572290802ba085d0e0dd10e80d8aad4931999fc013d51ed50f19100fc28752a9b99460f47d7447d011425f7a5763ad6ccdde937f022bb3c3e9576063eff60f4364bf2e21276e7bdd36a5830d68e143881ca1cf884df46ee88e26b89c8b052cacf8cd339068d28b3e8b26d9fe39cb6b78106af82b78c26386a50b13ad159404abbdc8d98981396c479bf2014d70170ebdd1e37a1eeea962e6ad2a1882affefe1f54bb8d7637a497e1404fcd84fd6c353efd5e5cc8cd9f79b33cf0b136513efa7b2fc5fd01d63c0af3a86b1b7d0dbea1d017deebe557ef2c5373d70a90ee8197d915f2c0378d8512eae6176778c64f13dc4e12b52689ce519188a157e09a350f0a6a5e3d2904cddd2a10add17a681af662695ec23ca391ff2fdf25a7f3fca3863cad7c2afe2f01cff3250174df53403cc0e5b06d44829ef9afa79d09c11a3c87a851e3ee761dfc15e4836d3f1c915e5cec398e99cc7342070fefc789fc72cdee1262e7b1461be786ea758c5b7f13bd70b4373987fa69dbd762461efd150e8050921eedc19ebad58ad53b39dd92e12958b4c3f02f546e893eb9078945f76cc1a41c2b34f6e74e6d730642389068054f9bcb824dc4da3e611d71acc2e9c26cd4997e9af8f06f1dfeaa61677a262851c7eadfa879475b2b467bd31e0a506829dbe13d587f19376f33d99e5ed33c74797cc38a68a6f4b509e6441f289d39b9b3ecb5391d12c1758e517ddd4887d31c9040e3c2de7db559167543402e1da899ed7a0bd33709386dc52b0ba17da4219bb8df3a263fa677dd3dc1fe16e5739a3ebd9367d4b749cfd9ba493d1c07a1b0c # # Params = SHAKE128_W16_H20 # Msg = # PrivateKey = 0900000984369827bc857d2d241a605141f471b43a6596f233ee9ffb9286fa1416510ce72e9b8d4a54814dcc087c691c5dacb7df69e1581f43187bbb6e989d7a045d4a1f000000000006ba5337c3ce10e9bffa3904848df0d84765b58d7b2dd3dbffcc1acd7747f620f82d69a72f5b43403fe90a88a59b741d2859c7fedc9d29e0b5f170ebe309a2b6f8cdfd # Signature = 000000000006ba5375ba9d68c616c5aa343c64081bbf551e022637ef3aead85d541fa014abb5275e367ddb5f5b14e194807f6d7c859aceac132e2828dc5cad4aec111032a092fc677712e7d12f149e050ce1191ac676b172962560828f43def782d06ffb31495b0624629066f5ef073c19e7701f9179e01357c04e67b0a5d9f2854d8c9ee96a7e2aebf09d6797cedec5ec5602bcebec9af5306d4ea40f2c4c9f600ca9022ddcce4afa978e7665838a97e24a64ceec4ea2013bf502f8f42188242d7f2627c042e25ca9557150ca84a201fc566b8de2dd9c838bb87129882766a68eb866a4a667d0627ed39220b8a48aaa1166cd762ed21b3a78712b62346fb4e510cfbc695a2ebe7e423b89f41a031e7f9977f0616f045f223e7b12e058d1f2ad6478f31428fff0f561caf6f84cd772278954826cc96907c30b7b1ddac7f6e74ac7a486506a18268e28935027323ca940c87e0122ce6c44ae0de5a92a6fe5ef4832177cccb1bb48e1743aa145efedb2bc7c8ed503238dc1736cf37c6d9f85d5edccadc4c0788458a2b0e5d4857bedf7607b4fb02954111148de51bf01b53a1a5f95e76f429264845ebbb40a985d6a207161f01f3fc2638f2593fed62ef1fb1b65efd9ba7f07fa0079d5e925b34bc2a2f032ad948d8fccd3c9fbd932b53efb73b66093588604353bfddc5b2a59ec751dbdd5717ce46bf793345108d86ae5eb77226ff4a0975e91f1ad963f499bc2b802e64826f6790799d8dcfced6e5c0065f88feb68ee0f63acd4affb18a745c11525729d20709212a95ffb32854c88227d46b3b939260e4b3a212f37aec404b21da462d4ed7f1800915c9bd072c33389ac0eb0014bc7c90244778be59df0d89fe019c152e43e288b72f2347c883edb4bcc22ee54df47d1815b22a62b13bc1a7171b059a0415b4e1c182c92637ea91746d492647f551d3c659ad05e0ea1bd6273426dbfb62e3ff7e976a240c5900c88fae8d67fba758117ba36c686a8dffac29607546ac96605260ee623a0a08f1ec627b4f6f7735020e0333b2bc0b44fc6c9a24be2a97e33e6ac5f4dd76c0c52bd5abafd38cb53df8a46d2df74d6949accafec6a53517c0337451c2c3ac277d46bd1a5573f63dd8a4447362a250915733ce000906a914a84ff33a588d802528d71af415ff77d1bea2b18628953c73816cc567cfe86d3f48614236d42d3ae35e70f30a06cac45db38fa8629b938699836cad261372f786136c4062f22ebab43a18c80b9f4be981c3b1eaf16a9edb9dec6e37fb8a6b522a5186524d51dfcc9182100677f60f5f5361713f69786488f95543160bba2f1ce738c1882b046f4c8b7129150e65e420f34c69930aa7744e95136d13789c81ca3a73380509db5681e3ff94edf443ec2eb08dd1595f47dcbb5e7ae55e1654d53105c10ea0c9f1ea61c53b93dbf51485fda0306d559befebde6a9c82f9655bd2bcebe530bcaa42b5a34d8da4f7aa1171a5556e55937e88d92329590ae3adff8b3e8ab3efbed133b705573166b37f2c664c435970222a409ab3fe3616ccd0006e0080055c74991deb8e13c6360ffc251774e13890a8ea379bac2d4eb82f3682bec0cb7886c13110e16532f27442695de91a302007751193f338e1670bd70dcfc3aea65a4ca20733804e1e587c817a570b142d051fd26bcb01675ffcdbefd58431da32c6bf54602db0f167e3f469a323391f4bd8809f432a0267a570ceb9c3497b7bf8f85018e942431a6dc2fff21c071bbd79e6d4eadf97163e6e7d521ff2e220684e88f2cc557b22dca25f34d838034c0149d0089ec1518534a99548f920fc630e4e50a6e337ba4fda22289009e9cdad7d2c10e96817531ae1a4cc3c1e0897713fdf7f4dfee02a7e76ffbeebbf9bc5bba568dec88e56d1a5bc85aefddc10b39766d9d68a8e200e6fabe49a37d64a40750dbf3c0306956c1df039ccc41a1da4f216b800b5cea2cb9d55aee4f9b0ff25eadebf2d58100f92f09f48cf8b513d40ed42bad7ac289f5d8f2ff1dada5befc416e6f9d9f47650c05feb70fc437093ca828853b2fc24fe1948f823fd0f1afbea376b68608a4635fa7edb7f3f85b46631fa626ae4ad4cd9c844e6448693ac672d9e0a4caf3c0ec9cb993a4f0e5f682d177116c02cdcb237639034f32fa9fd5859c9c6b4c60dbb92dffb6379f2717b57ab90a635083354b6f4467057ee067f89aa3e1ca0681cbfc330e95c0137f40c2697902ffda2630dfb344e5113bd906c13207dd54fb55c453416d61132c13cfb835bacd47352a2dcce334ecf2b1e0d2934b7370ca0d015f5a74e0a11e1004637e6bdad9cfc975456217b2815868e6f93a13a431f0c644686e3bb8b7952344c644666c16c7695eca2ca322809f494aabe68e4e0b6a2668c01e016d25740fb40de51fdbd4b640c4b56125a193de75efdbaf661ab72a37868d0586565bdf84db66be56df3544ba1775d2776acd41abd560008c56aac75dffddeffa96d9a3f00e7ad74f1ffec518ddd0f369ed603103e50f570b1e5dd1764d6bd4562c102da047004d55b1fab5fb2d9c74cab4546ccb11c68d42a6058fddc304b576d6766f03e809986a8158d75c738704f6530fdb3eb06a8b87b031cef7285152f5d13d1ed57d8a68598cd1d9bdf5fd7ce0b1225d22774feefbc6971f8d904eb04347c74e21b522fd14cc72f73b3a5cd69f1fcb12c29151f8e405fe8afca33b9b4e2601e6e2f81b1167c5c39896e1d23a670ad3aae6dd2236b9a5e8b74ccbbf47f832c3f8562ae75fa8b840611ba4855361764eb59204a58b338459899acbf14e6714d39b740988cf20431a9fdb9a3643d85c312523bfa1c59af77c71e0ce25733c8ba9ce2820633704a87cffa3dc5cbdfdc931fad83d85a7c126baad7923f0fa2167b3353894b80d8d5506ab1fbd8d15d05c866b071cc58c9fe21264da34c7afc12998e2813d5899d94cabcf916dd7e9888dddc6f2f53e822da12aeb3e912a5e631c56de369a640c8c85f749e6b2d41611d97006e628149c577997f0c4a4416cd59919e39b6a1797cd0472ba4115bf4aa5756e065f3be8fb63b2db86eaeca69db506f55c0a723f40707db73ff1abd96ee9225ee44e2be777d9510159307c6da22f4f200b0ef434f1e4e1940caf530544c8c8a35e49a18866e5145016bdc914c3bd009a8d91df34bd0d6a0ef1989ee50998d53b825302632d7ae7b27e0cb21a62e9de5354522654d1637c42b7842884ec8afe871f9754535279f283160b4b479571ddd3b8a63d56aa00dcb570d99c06eeb3f2b522243bed768ec41770808d3bba0429f8e1d50d406bd50d885d67dc777ea702da338f075c64003d8f4a3852d2b820dfb00b11b20c7b8035b0f1f95e2368e4c42dfb81c86618470d44bbf36c2d48be95e09afa4f2efa33769efe3493b86e80cdea375b9ab723b818c8cce3701426a8062a6a3c3fc9cecad32eef692f7b82ede0d9e0c9b4dd4e6d72fb88a3091611118cbcd25d6d25c2acc4c173858943667996f07b80058a93016b57c56165e73f3424e9c77a157b80264ab6ff23101cc4f16db16c0616203a1c8cbfae8902638d6a48d3f62817e7daa7ca8a6241c7b9b52f737b5b0da577db46ae89ae4441d210fcd8536ffb2cce255dfb588d91afd39baafdd9a4d59f71013ffb381b46e16b6a61925c40638618698612ffcca9dc1f489e0f45797dfe359fa0d3b7e1160c29ad82a9a575e67cc5f1622c9b2a1f542f74a82c29b35a55aa0db16858a043db5cf1b11d456a73186a1cdbfaba8f24943caf62fc60388335e0add28703c9aa13c5274f91c0253f021abb7a47906c5ffba6a16bb6c9997b25fe62ddbd3b841a9a951a01064a16e22fc7408c416af2af09d61d7b539987df00dcdde975017e8f34b79a73ab110be693d65d39fb0779f4f89180c5af124eec27476e2b3109f24e02bb29bf7f7603e6a6e2b77e71b0df8aeeb5d03fd38f2fb1298926145e05f0349f7adb74a7079d # # Params = SHAKE128_W16_H20 # Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 # PrivateKey = 090000098c1d3a0175b8abb791ce2d00a1e34377541671916210170e65f5aafdddceb8b6d2d86a379a2ea2de18d968eec40332ac33bf9ee1f64c7ddd25bf9c985802ef1f0000000000064ecbd2c23d15ecce8a733b5a269d5b1a12fdc31f7c3d8ca01e4eb0188e589e908a0b4278a5119c2ae7929d25cd02d70fe97e64ef0d702a5fa142856a78cb8a6ba409 # Signature = 0000000000064ecb4a168719aa6ed21e23b863054df17a2444b0fb93cc328b8d485ff2fed17e6cbcc8896968eb04ac2f82b2e090ba5df482a628944b4b3d85a4edb5aed933e55236727ca018469c0da34a8ea6de1fb1ef76d6dc3484ede9fe19c8e50ddbeefc993b604f73610934e89917654ad7bf779ba0e92aed4130e83cf803be29c9dba868189d400aee18abbf8106d548837e87413559fa5296229b7aeeac251ffcbd01d301936599d07292d6e25e35233556d9850689819cb4e80dda51f6cb05071f5ba6911ce03cb862a6c4258cc7b3254c9194e56a63d7a348909438c5157b64532c65e8620fb0f8fbd2279bc6b2bc6b203a29fc0f7c94d692e48e069dd6148eef2a260ee0ea42c6308faf8da46e7c76e086c26e87ed45d2860e0220215dc8d8a7ba20ccb6033b5d61694f0a28a0a28eb20bac4d8f235515c4f62536ec5e69aa61458bb6aa8faf374e489262abbba5c44956f424d41aff17cb3b5b39956d469cffb539551c011559e9b81b99c0d58be920df45fa16df6ef4ffa389528e39bb16089b12e2d204cc5ab3ed255596b99fbc34b2085d5c7de70ae2fbc727f3c0520d5a57eb625f23ffe55c47f76aaeafabcce8a3387b47cb1ff0b0959e61fd0e61b05d640251f5e420aa4f99e174e7d79c8114eada63d32a25b8a2aa5103df07b7006a129cf65af72284b2877d7e9dde4d62dd75e897b4097f8070ce9152b7440674385279e8d8e184f684852e47dbc5124e528500fcd340bb45bb81b777aca826efead9b41d4650f980def5af410cef9247afef894cf824e1276b3d96d2ccf4366e4ecc6eb20a30cfef7a4cbe203974b79f81401d181fc31aee7dffded2626e207351e85ba537ba7172103e4f53532d0462ad1948674e7182e46e106f28ee3140522f3d9aa5591f868de3416ddd5974f23aaa02cdc69fd85400fe7771f7b00657265d759f78a66b64fc060de28aa5553377013ab610cc90e3a2ce07c4ed44fcf36f321e1cce41d4ec411f0287cef31eed3f075d4bc0f7d95e1fb5a6ad3178ed206f929c1005a584b215761e19e991d65fb1cd98863422bbadd9ffa283774c4781829b97e2acdb81913fcb27a6e0eaedf64903b9aa8dcb5c6f1ce594502dfb01bee3f4175e4faef17535139067f8fa973e84e35a792b22a83e6defaa6199d02e912a391630a6458354e84b17db2039bbb04cccc9949c7a2985224a5480c33addaf128397d13f7dbdae820c54f167038c26566d1f27286d21aa0b1406357a155c420eccc7baf959ebe0a46300260ec48bf3c027517bd80ff4a04c9532249faaed2a97a9bd0a647fbc80d73aeaaf835c1f445bf6d1dfef01a493f61a261092e84d6106b33cd400fb1ca21ce5955971a6779afcd1089a9a98de6a9669cfe4d5fda6704ca8994c3357e73b3691c7e80c7047aed0724245566b8dfd3bff2f5f4f195c29ec9441dff0749f7b0eb6cb8fa5e76a3b0299d888e8b61e4df587c7ad40ef3c7242f5c0424104971cbf559ee39bc1f6b85ea37bd61a1a8f11ed25fde3a7252148750038ef37b2c180453b5adfdc740fcac9c28fe084fa2f147ba8e440ffd7be0c011b43b506ce0fa11f52204f0e94aaf2d71a4ac5ed206ad1b7d45f67054032d2cf591a5bacf8345835b1aed1c638ed4bd91900e2a76227f1660bc812c14d484ff1bff464e0289f77b1cb1e01e0df5ede77a384858b0392672afc506754d8615c72853cc00fcb4c51cc8a4f0f164e0a07a8f1b1c0a669109ff5b336600b21f86eb3ae94a9cefd979feba585615d3f03f812d1ac58d935537ee09b0982efe2fd26c143d1fab276532ed554c37f3d3a6dc26df2aad6940e03a3a09f12ff81f26169a47eea01dabeca256bf7f790e036c93e3a17d366d818eedac31ab0dc39cead22826c56cd9ccb2e7f462021ad365f73d9f34e964e9efbb3a5df0cb29a24f9f1e81e481ad4fb4a3bca42994622b091701e3b85f9db09727cc07b79bea8b12b780da272102dd32078d94eaf4fe6118b34a6ece4037ec2fb6bd994112b48f0539d7922454635db08124c87c9d4652b716aa450098615c61195d3e44d6fbdbab639135ddb35ca514fd989182dca30423ee062b00dc0b8577a6a1851c0c4c9a7148a4bfb5c16e452dc58b03937526741ec8147f9a3d22243929730b857173207ac5f30ccc0e5d64aff0668f76af2463b1640da43f274fc0ca4fb156fff7a1527bf4717f7995bcd1b89887490b90e5b2cc9c00390d10f5bf5be24429df718332d5a0a74991ee3024d628ab11cf3c13b7f69d758c0dc42ecea7479984efbbe374ad31170515987972030fe57466ea7cdadf8168c337777fd41951cc2fcec58d5b09355220e8c74e7ca478e064231e30f888d6b7a4d759fc77875390b0115e613c971133f9850d08c7493e7401b41c996a0a2af98163a8415ea25db89387c1ec958f882bbcd47a5d49d76014fe36290e08705258426af9bbe0b7e11c1756722cb6ed04b487ef9dab1560d6fc232a1de68b14472562662fc11ab0b028933dc801e451791f8d9bfc7437327c330c50f077156e5c3d2e9655c71a59c2fc92d6e5021cc878d19a4bc5bcc18e619204434e4479a6d7ee2494f6d4087f1182f1a171ea0f5a334c5bb983eace14a2b11f9af65d9328e1aab2a7ebafed79fc2b5f3136d99b238ef21338335e4b544878def8c04502a678ece290da8710ae4376a8608e296795a6fe9a0d1afb720677c0384432adfa1e83f0c863224f34b69b23e5f704b08ae11b9e0c7f2059708d8acacdfac0ecfe97751b2ab94781b0ef5ae36d2e6908a7eb002760c2b075a7061075eed0dbd6d4f8fa5b19665a9113007bff68307e7ae1a85aab1df3a71555bdadacad5693bec505e86a47c64a34d1b54c304cdc9e6a64500609e49043eaf58839ec9826368779731ce006c2ca6b0b66497d8deb5e3a77efcf6ed0af52faf749dd23b0582b476cbad1d40671bfe39d08d355c0b8ff25fe139d686f37f23535b9ecc905129995cca4bc6aed83f55f5e8e92f7fa91988a42f972cd37578e3edf082a077335426af35306dbaea1e0aebfa9b4ed888d98f002c89cacab836891c15279b488a3626980dbf8e1acb8e0c6c04e28c3db71ab0e6262b88cad4a2a149b8589ccb6084c32271044a051c72b8c803697cd6409b2182ca8d17b2d26967d5140c2164f621591774587940f2ed675ca26cbbf34771e30b55f59964dfe1a59d15775e9f97630b48ba75abe5f912ca156ed91bfe3502f2fbfd1b8223e17d6685b463df8dab6d0714246ceb377368855ba9a27db147274f5349287280c390454fd560350d60965e7dabeb4cd684969bb0d44cc82ccb27d5baeacfea85effd48ae2bc956642192f42cdf942a5a00704276650b80d3ffea8445fed12c54ee9073fd660617e394dc7b6538b755fc8ec0b6f35f7b550809dd850234e761525d42b44252e7f7316f9ffd9f582bf96cc63bf8b37bb82511ed143e949643a3d57619b6683bd723de96988e81d4750f3c3da92ce482a389682b7802b70fc9df5d5fc3ffc7428b86920905954489f82c9f40ce6d38a9f9535e4c9ad2f2ad4fae6521ac8a0c00ef99fbe983d7fd0c31b6db71f295a792019fe8066e838d5dc9f33fb927720c1274d645a0e0421e1b50d7526ace23b8f4d615008cc1b47a455a58f0538041b49fcfd81d083ba066d692d1840cc521ec8ef4d10e145e0ed9afb68fe33bb05333443a42f81d99e5ddbfbc407bfed25d8f3479aa56d0ef2e68bb5b717d7d8d21241aea7ada2c58e9ad29b7cc972b1c13ed5d8104e633778d1f70ff5e0a57e9f2aec868a4c7a9335bf1ccb270922583a83488e6c572dd9bccc2e823a1455c3437542f65ef1843eb496027d36531c390f2bed41d17c2539987b1e7b2c2c083da39f8caf4acf08303b675474d7fe1ccaccc0acaf1700f9b5220c22109744e0b40346faf3c6e47a387a3aa8286879c75aa8de0b7e2c837fc42b45717287b8b0f0e534fb0 # Params = SHAKE256_W16_H10 Msg = PrivateKey = 0a00000ac46251f7c4313bfb2cab206d829a6133354301daec1dace6b406f425ccf84e31b9458fa28837bfdae56dc5771e77dea529725265a069bf4dc716510d53c5edb6596cc09b51251091e0220b8c4ea6848c3a03967bc9336d3b72ccd6aa95d2dd9e3bc28ec2796be9630fd741ff7ce72155c056a939bd553508cb3bf661116714b100000000000001834637167425144c8a451fd9a30427d44cdd31aa290b41992e00c7565f50a611f8e645c9ce03482b1ea82cbdfbc48857909cfefa5359beec06cb9a9e53d73365299e82a042fd74c701adea9cb64901616a2da1134b89d13fd0f77d4adb5f3bcd4945c1b15eb30246874563a8541a92f78d712323e74185a710e563e317f657859f Signature = 00000000000001835bb9b16b0826f598c13c13552399648d495f4740fcc691c944d1c8f7bffb50992187da5fd487115700c52afd050fcbc5e6071c3f75ebf4dbc73c8873ef0f59957028f637c6a5448c04d1b0f021456395b37c7b0fa8aaa9709f3c5a8acbf3bc9f2e173a89f8107e03377f6cace66651b57baefcdfe80a3a92047813e9f3b7ff50964aeb1be8b9a003893fce8a4debeb570c7a7a6a5a0cf4504f81d7eb1509296a216812f2cb89729dedfaa35ac441d504661304a6ba0545ffb220229634efb076c455dfac2a28ca0a04944d9368c1c641948e1798b9ed9f3c0a109c6088e0705888a632021837e1ebd67c0c64b6773baf95bddc9454226e7515c0015cc70105336c137ba26758f107c43fff43965e87c0a87407388a7aa477e2d8afcce1a9840681e88e1d4f6f11e920b728fd609a2612be19bf7f59b7f827e95507afd8d88fdaa3de3761ac7ebb53c8557ec06c7158b2e0003303382466968151c91a41e850baa50f1a10813992d0675ea62d43f767a0d844d9bb6f74bca3c8cda7841017319ee90ea2a38108eb71e019d0f62e7799221e801e361a3c85f4a67a6120a2c381b80f7df2583d9253150c68ce8a4f753c49c548c62c819bea0f1b85071188d834ffc087863a35e9db35f7e0cd741bab6093872021b1d71c09c7b98c08e573f40346976a749896037c78434b480c45d83b134b859ef3af5ab04e6243ab130304834099b4e4f35882c070f9835aafd726cdbd61ac419944702b840771bba74da81faf087dbc2a99e14331a875cf2a96e373ed4e6ae725d6ed4bc6757b940472091470ef95025a1c6ce1a4ab2bb51bf5eea7e33d76712b1027002b3402cca3920b2ea342fa9009ba02e8004e98b4bb4f8831580a322fecd84eeb39db530911df87ef56d5f0f3a96801d49399311ca4bc980c19ea6488e920392113e7eacc74340984431831a39d7ff4ddfe503eab6b1faae4a3a17f064c47b111020cec376d1b3d31fadda95532236e0a3a2fb831deb20290caacaa62c48f3c73d8cf9ce5703af1bb59b34bd90f05a6c57229a441b08c744f784542465d109ae61f40184ed55fe5b84a487f61e0d8ec0a6fe0c5963f956a0f806ffd21eb7f30d898ea0cd9f432c3644034b674f7eba8df346a045a93bc7c20da3763c52d62955f44a0666c1fd43ec6bbb526e12a0e80ea5b785462e18ddc1bc75899acfef97fbca423470cfe283a7f49b0d122b94a62bbf01e850b88b5353247356bb99b95b8d790b8011b4c41e9204dd3c0309f4543a7ca7938e5dd85f8101d7749d4df64c5150137172774cf0d9be6961932c7566ba60e1290e4a09cf9c5acb7d32f1439db813e22cf2a6c76a774b4fceb294353d338fca661b7e6bf43fcf3f4571d820d64fe6afb9f233f0db533a69f5ed28888beffed42e22d35147bba8ae4b7bb2d5d0b44116aec5bb803e7e919f66d4e4f066b6971c48a22e52d8cfca66304340157af360d803a102298673a685b85a8681121249ec83ffd0bc288cc605ee97ce848e4fc53eb7cccd70a252b4e52246b82a0cf9d2e6938bb0ea8dc61ce8531bb6b49cd43e22a56d80e6b95a0eeb9b35e0888bfd7f98132be974eed08ad2aa45f1ab0f3a84331dcff8a220a1c97e23976c37c9e19b8e88fd0466c081e66c284ecd4639929e79b30f0ddebd331364bd616af89d54107fcb506ddeb00264e9e083a69800d7c834b7a383cfc72d1eaf44f6b39e648e1159f7d499b07e9254352bfa58cc926cd94be841a2bbba6193bd786b2150bc51a956d58e7e2839d79fc64db16351deafe135118227c497d10cd8c615bf7c306b7c4ca4f7d6a2852f5c6ff419560dd9c22a879ae268ead60d32317307045288dd337e692a57c0b5f15ac5a9934fe0871a87b45f7916233269b2d79164955bb79955dbc84b4d2c6425175df9ce12e4cb4c4660859bc45b485c521c17d2d9e0b95958fa8c6fd30be7715b03436e7d23d6def7cedfd6a26c82b5c6377a37c290c216703844a6b8075918ec07fecbc888aa354bdfb264717bafe113282b88e3ac8cd171957dfbf71743079fab560fbc752b690c7a9505ffc8a5af1d55d310e31c2f8590487c0842f448b3bfea1214b1fa9043ca33d0dd609ca7efb2a391614d02516a72bfc4b1791f6728be2a365bbab2f4c40147d24efda9a70da3e7872d54f99958f944e6704e22c1fc40c21dd4fddc05af73e76c610d10321acf73581091003a1fc8e8fedd36c73be5f5b614f22e848bd996ad329fdc2b1c6541672e9b367d6d7e44d1c9bd6ee70ff0c2640dc9c7c6afd2cc5b5e7570d2802f384793cc3ac7a184762590cc73e671f4e2394f250272f334214ebaa5d7208cb158ce65a43424f5189bdc5fe5b9282863134fa922bc34358aaf0859c28c1f79f974ba521d00a82438bbd6b1e237c9607bf32e889cf6bc707228f31554e05d7c96ab5892665d099b04cee1d68c69a329e20291a9acf2f5c94379ea0adebe998f5a63fd9df3c0efff3c79c2f6b4388de31ff55f0d8cc2b2bd8e2e8ca0cd383c1a40ffb74033fedee1055a94724dc7f7bf128e0a5905dbb0e7ccebc46ed5685e52c5ce279f7dfe54c3bc6062af5fb663422769e5b7e37e2a8bf6df91887794199973a922311a1cec8737a589826d66ee1e18848cf31a211401e17dad96c442acb17baa02193f3353b6b756ded22ab21282a97e83b9cd31e63de3f0742ffd4684e994afcac7bfc79e86fd38cd1e51f8c0295e831fca1ec719d649cd75eeab215fd54d27291614e1da20c14c7de1bb25f9c2cea8426fc7a5ffc0da0d495825f48cb8950fa64547610b8d4f598243672aadcda0db3d6f7e3d93dc9c107ea5b779cb0c7b3c8046313c2df097655ca2dc10e5bee923b26b055dc09370171161f533399ebbd402d0da666c32710f72075457e180328338e23c4836f1f78ceaa3040c4f53dde65eccfc3890b6c08923540417b4962cd26b8b1a8c809b157e1483d385951a1c7ad1a889b3581e368e26cebd9df3a0f2096445cf72b43084c3796a49fc5902191bcae3606e716b2fb7fab8b8fc9ed6f601ed56b56abf7ebc95e2e4d3c1849a55648de5379a57da6c97dbe14a55fb3538c232886899bc90db8302b6bfc59b6008206108d120521adb4e70903f160b5bf1e833a384efb076d4312badafc01ee918a2de237e2f05cc8e48c381d5769cdb444d40f75ada815534626e1945692135cad1937e82fa46c6479ecc4444ce0dfd175ad921dbebb0989e4810777c6980a01616c47151a2623aa059bc59238f42c8956717ac48ca00538e54ca80d7519bcd986610552a6e18d60e4f3820aaff28e08670cf5eb86056f8ca623ce2233f7e65798ff5fd2b9a9e93bba9ee2121030c93850fcef6b7100a926ceae2e74f8af98b766777419d719c917826a8636e9f3181e14c0e4e2c8d2545bc456b867d70b10402a1acf5b02786bb93141f7d0a725146622d6e5bc5f3dfe8ac1bbc1c601394bc536513af5b55109139db2e03b2dd1809b8ae942a784b1a0f000e34b71944e32c24672875e19ce8ea9c35110d3f59f32da1089c12794b021f6c2fc415c23e659594dbc52a35a97edb765fd34747c0fa4d75097ea7b60acb190b2fe39d46448cebd964f2f3ea112cd2fac6a27045e40c1ea69b230922a02d218ee8f208a52360b88c7b5e379343c53f532ed8a6131bf06edc0aca963e74d6841a4054f61f96ddbc446db3cd7cc2454a15adda520a40e9bb6cfd5107a2ecdebd2e7342df3b71180cc2121d2dcb62dd7dfbbd936b6cd2a5eb1c6ab0d06102a3a25ecf22eb5d074f0b6d9d948b79e2c94476b884c82c479bb28305f4024cfa1b99d23a0d34b3afc4f9c9b7d1e142987815c0d5a2857b82ab120d930bf1a32d7e34c0d9c8767dd4250295eb937c8818f20c3eb268581cdb2750907e2cc49236818ac48c19661f9d736b726f4c67b09f6ad0f88faaf6ac21639326aae4816a40b50bf61332a70e38231f4467cda399338329a05897391efc7a4018ea3e2f07629082c7b57419749aa0fe0905bac71b362409ae64780486e2eefc37238f3bcca3138e729a6ea97f3f3434024d6b95701944e53e49cac760d96ce97914ac7865ddc9983057c64583e29d02d915ba0b2481ccee8e7a4b0e03e2a7aeb29d9a1407bd475fef2f3e5aeca77e9eaf4e6b4f37084455cf8713f07cf8b265f542acd262752d4cd77c6579ebd5db53960da23482ae6ce4877dfe859a93b9360e54772bbcd5880cb8fb93c5563e273d61fd65f21000e4706055aa7a9cb20ace3daaf824a716a88dbbda9d3b73291cfa76e216b82168542493c1db0847988400556e06e32d0f079dae82aa5ca60ecdba9837494c832aba58832721231aeeba7083138c3b0230229642dc9441aa14d37acd41561173e5e04bc554d7ec2ce3f491867647ce796db75dffdde27ab8b1d22d32d88cdeba4eda5b20ed205e219391f4de674d279eadbeab4638184e100074d0625fab1bfe0a3edf413371757fb087a33761f2105b9d2c2e663e8a9b10dcca3610cf10e4e1294f625f12ad09c360aa1122062a0095b53ec1823e8a3e1b8f8915878e6ce934cd1be7b0901ed3774ecbe8ddcc458e1fd8e9332f322c1a6a7f3b4f4f4a5b36f6243d93fb10973ff0c602e3ee73a0433a1589ec69302981fc48d80f92ec60c977f4ccf0f97299ed41c58a24220106d6392ba0f0bd775a7b47a14b845bea0cea351c5db170ba114397e2ab7e807e5b19a27a3964fc15d7b8bcf9b33353de74057f816a134756fb74e92a4385eaea3c380fbc69ffc0e749ce1614ce75688117e2178b6f3c41c46db7e6370009695c7ff36bf4864e82b80d18caefc4b97ad3e207afe41fb48b6bc4b75e6afb7fdd891ec6de771c697c29fab10ac6c77493d69bb211a0cd740dd48caf1b28d7c3b376c559025eedb7fc00fa016fb7ebbf58fe14d0fdfc623cb9d3665d5accfb218cdd10c5092c4418e4447da7910083ec5ff160217214bfe23e9554234175231ebdfc8e9da91ce2f257dfc47d237813df8420f6e10514b2cbbf3407e994704a790244fcb0c24664439247e0b5214a9c90bdfcee3cf5bdaaf1869a0d78f840c09ce6c19c1cbd5c3600f1624ac800131a12fb38e7631db039ea82f5890f758f849ee87c4c2cab578598c0ff8abf15aee8ecf69030f3c508a7a4270141c39b7011785fc655b3676f8ed7e6249324950e501c47d216ae902dc6581b3d690c7165fbf67888cd45f9d11e1dd7969ec20bb6c546103057a20a0ce1c55b8be0cbaead099aed2d5a59367733e132c2c3e0d01775d3b192543e930ccc12c67f11dd5cb78820f8e8c80b553dceb043d97ffa6376c2caf0927dee8d1be76071bda1270dbd3efa4f95e3a5715dacd19209ff036b57f1b7bf3e66735d6610d26b19139d7baee616d48d65d8cf035b5d91ac2682a1b04748372c0e1a957f3814698a89f249c202b8afda43551cd4a3e2de0dedd104cb4d2a49ef3301c1991c29da8b13ba86cc176c1fc511870ff80f1e2e88c5ad59aeb6d29673a536e9129a9945838a535bf889bdacdc15a96774906cd4a5837efd2cef39d717da810b3ef33d5f6d3aba2065be99256bffe7b49f10e7a847b9f8b621334211b875aa68ea73f5f0c8a2d36d8a9de2991b0b787295de5217577e38898024e4d12846b4e8de8f4cd73ca8d035bf6fcc40a408819c0f303cec4d37a8616aaf08801fc8d615fcce3ca8e360ea80d9700bdb93b66bb6221c420f3d00bb8f98f34c7e84d6d7f57d1f36c85e8dc1ba5832e191ba9eef7d66e03860e307cd66f0ef044bbc816816f2ce0212bcf064af9a450c74e0b1cc2b0d1631e7d836d1c95678a0151b6150768502d1f0989b578116cf73da520ff7499ec9f92dbbfda21256d109d97c6fa528104297648a129540183a4d9dcb488c69e51eb355f23c41e4d78b9778aba94d3a8e9fd598382039ec81b25830eaddbbeab576fbcc1fce428d6828386fc4f1d1c3dd45d2197776ad7546582837439e8d47fe433a62edd310073fd3c2729bef77bbc951d35f455abfb114aaa248a8f2a06f5e359dd496250bdf85aac3dd6009855eff64c7c247c32a263c23cc90482aebf60644cc4ec0ae5a95ff6e39dffdc8014f3247ff0f821c911373bf03b6ba6f744e49fcf68523ffe360febe7dbb3cd5e7c8ba1be5e3c4ad157ef23dcab2d8ecfa390129e58c2cc1d451a93c232872efcad6ff04ef1de4dc7de774e7eb733dcbe9a82a348d66353c168e932704da6a9ef210fbbb5918a64e775f17f9150d6a70216457f387b81e0e827d723d26e17768c949d09908a2aec5a588b19658db430c1138f618a5a653457ef032d65fa94635441978185f7287c6db837d69512296ac84fcf83637140127180c4c88207db5ee843aa762246c3932565ca4187dbb70de234b8f70ec9d213259410ec555c3d5778239bc8e223b9bf997c6411d20b3b1e9b52c753a48dac7e1db4cf75e3697b765b7665db87c33f8c2ceebefe4f37b3d0dc076f67a6f020b6c953497f46b6ddc0d9cf9221976ffeae5e2bd3c1654bd3123943ea476c5b9bc9f38aebab9886d8dbba2dbea39150fddfb163bce47831e43c18202a6d7e5b4722dd826f1849c845554e6210f2f6edd06a68b89eb922ac0565822e1787665c673f9b85f63f276634255dc9d7ba1f42bafabf146443e594a1d9d676f8996ed86b36cb127ef8d7f1d6de4fd81b5018129eb4bc65e29dcd9ac488d28515f95713b3da40505711bce45018ae76ebaa3737e9bbce7092ccf44191b1c65dc5cf41ad63cccc9d98bd32ac00c7db79ab3b4a5119a76b50dd28f224a60e20f0cecdcbe1e6b273b523a0c56d6f3d879010d31cdeca5b9be64e07ec7768618b5ccfce4e0f79187882f2058cf0e16337345c28fb6cd1bb02a15e660bbcbcff60d150daea562648dd9fb202b2b5ed069fbe47b9deba5770f848e5f98e940252fa95ef558897f4f6408c711945b35a70eafc3caccd2f7fbfd532e8acc0f80ab07e620d46ef78687a36b1bdafd206974ef8cf3f7070f1e50005cb8f6496f087e8058e4b65e0545914d7a4ce79ef9820cc1fdf3dee2e0162419e173ef97dc0cccf4ff69e8c95476744434d372cb7a892532198bb41f82f39f42eba101864b9534fd19b5b101ab69a2f47fc67a5833a5af750e3fad36b9bd9bf5e6f5a32bc7caa1b4bcbcae4433917d7a1978e099315379ceb295f9da99278eb80cc3547a94e68b5e7f47b325ff969d2f76625181a5f7c9787cc4fd2a2b795c99bbbed7bedce7d0bd354c8baa728e2ea2c68a7ff95488226bb514ac10eaecac91347daf93dfb4f6705f78962b908cbe6ea216c345d2b3e3a0d1f0f67f009084bbab4c8755b7fc37899a06d5f503dd2313cc552078da840062a65bafee74e63082b3537101a60abe7bcf8ae1167bc3a71f5d4a701b4bc395a494e221b83ef8125b9eaa8acbfaa08660a32f8c1f08d8c6811d762e29fd64f4266268138a5a361a0a6d26851208d7ba8b996e5f4421d1779a07b96ab463d9cac328d2f8a555e96bcafb9c801c543eb27e289bf07e6fd09bf34c14d69a22b4ee799af2d385ad822a43f20d445ee754a4768c8b9acb22e3937f1346f121beb4092597d1767d24bbe3cc6bd1d91015fe53e7a5251b435f93181e8ad12c932bd82ad91e0357232f8ddcc84c9d703b0d5c9ee9871f90656326c7e2873ad0b27c953b5642fc1688132c7809baf0775ceaa0bfe27ab7f2148f445079e21833ffb3d57d80d7c8be88786799ab9fdca11e8b073f3e3376ff9aa42568655b17f5b2a456e7aac258419070c89ade2ac7dd07e14c579a019fe44a1cb91f4b316914bcb7f4eafd6dffadfe84b679dcffeb630d3bc275a58945c293712ba248559db53e4c4847af3acc1fe4dc2b6fc1bdddb6482458fa78ccbab9096077c2767f8da1d8559624b0154e144e21e22e2680a2425a0b96c0eb2da7198c0ff6e3968c34fe40afe257be18771dbed0ff7acd8044ba2a4f99c69f9d7f2a203c85517a84d90d46a0a4a0d74c7a91cf143be160e4c6e1aba8799392097a3de82634ea95d2c9e4da7473159c689eb05645306d45f4af479401515b1d6fb197028250da0d40bbb350450629369e9d37d347629a25f0afff06cc58d363f38d3dc87c44743bcfb43912d2813dcd1394ca911f9413b60411d9d0df7290b162052680dd75c0734c8aec58a358cb2b1950ff0da463ccdf1d64c1a5e49336a9fe1513d3bd8c2215e27c33b463e3895244c33a15c359e34351fb9d15b02e77d5740e6d424012d8dfdf4eebd472d12e716a186a230787e4bfba306abb19489eb089ddfb5bb06edd2f1069e59330a271bf8a0c225a2dc9c52a2854afd8caafec04beed1c0107d0fe3e315ebcf93aaaa16d1a0ba16a8a54a315d60711c203b84a0ce76ba66f8cf653aa7081c3985845b4baa465d2e6d8863048ae524250587bddda9360f6dcc78ae3cc01f76a0067152a939dd3eeb6d8147252e981c5159c80e5d834bd87aa63ad8cc5eb562045a1746203f1f654aecaa8ca4e5933c51e2ff493f04dbd9185350b9af3a5784d539e06b567985c4d247cca94e833a4eaace57ad8d41820f8c4fa85fcc588a71be10bde65c02af3f2e13a8bfb6ae2b0fb7b2ca16c1b12078d6b7dff7bbe7d465c98674d1b9303237a7832161e551e750bfdf11f2f17938cc3a7458f81061e4f7a13f1c6374cbadf02743101c46dd16b7e2fa0b194d0e8afbfb23a930563b09501b0679e9d615cf7d893304a30f647f2875c1c0271679f0a6d413a935eac173a127adc5527321f338762b18c8ee3530bb2e50f4a369aace58f93122fe0748d1841e1dbfc1f6f99cfddb6267d83126d5375371da6861c98cc94c6b557be6c2904a863ab85abe161aa1945c17395f3a0b4e783eb907cfe56a0bb2bb6532963fbda3216b049d7dafbfbfb31f321b9f22943d3209cc2e86db2a269ef687247fa8dc333c6e335930be4b020ce56d79dda3cc7477ddba6281805522d5ab5e8470fa7ae98a88b6bc4aac86c191fc71c473e6b4aa5d38261d0b847deda346b8a2304a09aa6445acf8f5245ab87234320fdae4d80e9e52658de4f3ce64367c57bcb7d5bd2f3c66396f55474be8efbf491b21e6187c6f7ada54ba7996f70c395ae53d6cb9b099c3c25fa14850a4ef76a4539d873d27ee59e9deddd9a682253993f02fed379dd104a5efbcf9b88c2c6782c671f22d03d1128d8443f451c80d045fc660f70ab10c30396930a914b339795e868c454e57fc38d98a4df19d9a5ddcd14957ccff25aaf2c88dd2967419fcd8da8bd55a41ec03bd3e222a212c7fb7b51e40beedff29f735cb2fe87b6123ae07e5dd9d4652acde00ee0c35f62e32ecb03789eac0deab31c165a912ee3b4a860c9dd93a0f5c3b145eb32a95c91436a5b87a5bfb6e3719094433633449c7628784e023e1e364cf99713505c6933bf5edcf958f0307d6268d265880438f304805be3b3d33c7303643b31ec443be8a19c792da73ac84fc4384619d089b839bde658c241f3fb4e2960ae16c2b1ad97eb1916222f34641ea92ff9a2a4f8260e7ede2c80eaae2a169345f7698bc63e7a2f01b61c0d342f1d451e8db46a16685f47c074dd24b0474c930ff87aa1238d2ce181a441ff9ba0aa170f00bdc4f01c205df48b29c05333261871c0389a717eeb92924104278a7fc92412af19ef7448bfdce9ef110ae23f26b714ffdace10501d4c4c67957947376e8a682992c29dad88a3e1f7c824c70add159c912aafaa12d6e84d11490d2bb1ffd348bdc6948f606bf9a1b5a4b76bd45bb2b5e164991a84c0d2af355d24f82b1507f939f04c1faaabeeb7875220e94b161df90799647dc7b2c4171713891ed332e7632e6a65e8d8bf0aa1baeda2036bd77a1bed91ec072de22646756f2ac854bb5588ecaeb4f6a76520369daaf006e443ef6ff1705e4f46ba5065aff4f8bd59c0bcffaf5d305c3cb1c7cf2b72b25973790f7dbadc8ff82d216a9d919abf1a5f2c9469ccec298f3dd3f9ff389d2a46fbe4a46a0cb633ce627041c943f7d3f417e8c7c615fd87fae88751fbb71e87908431720dec5b183805225db7ce00a3b917da0112a0a0c4383169e9e92464452df04e48e1f837ff63c4b5fabf03cbf77cf8c87d7c01aa689007f4b224a6da77a444437bcb3b1972e2374cb0cf47a2e1719cad192a2624f05f5d624a899acc2aa7688d50f194b894313b8cae9c5012cd200ce8b82d0b0b8f4b895fa53eaac89d6afa393f73233f21f621c509b84f946ee1e2663baeea2f05207c51cd9f983fdc05cd424abe29b9264861760ffe514a192dc42a99f654b74bbcec1a6df2ab79b347d450618f3de60c29950662c679053aa585fc21fe5c401cc9f87bd57f80129dd349e393a6075d0407487f342052b0680184be2eff9f126dfa874d6ff55be5eda0a9972a635dc6fcb4e4c72ace7041a13a45eab3c64bde84313fe2a58647b9cf5e7a64b91a25b51a4888d9a4a6ead20d6c5a1c139dba8e8ebdf47bceb358deac667c1b105f1738190b3605b24f289a4c315ae05eaba1ef07909819ac9b49cab9377dd5545f3e56ed7bd05db0e37fd4ded3e25b7b35a6f8d678f514444cf521450124aa8d0c121ca12787cb2d5c8f7ab4ed26c2ee785d280956872ae7d98adbc04e711a8f28d3e9ba769eab916fc0f27b38a75c841fcd5ce927b24a1d9ce2039d6cc9ec66b3ce8e2d7ac4840698aa82dc152865473e6353dcbddaa1d4b432b7deec3ec50ecf4853adbd4e08a246bc5229605e8643811a9b09f34b5bd4a4a413306cb6f7a4adddb99e6a1816c3573d095ca6da26f7ffb032822a126d68449407ac66abc20dc84321e43d9e015e305bfe4547c0e74b865b2b1acd44574501b475c4e97d22a4cab252f494a09695ed4f710e13b9fcb4355cc3f0f06270f21ffb67a776711e8990340202f81965afee1a6cfed96605dd427559266387bd362ba06edfaa25b9d2b3e8c313b3a172f0ebedb8efa074bed69ef7cc0dc6de3b0aac9049d4cea251e38acc44a683a84a74eafb19c3781e3d3e0fc1413983e897e808534517783aa78fa94bfa84d2eabd1a53d11512e0b307101b5006d7e35f83d13208c47509432ea5ec1bbbca247cf75d24e8b2aa357942aa65f41c557ccc9cc388b6331a5a85f7eb0050f764898c77f7d90aa2a67eb9eb5bb8f4bbf07b8cb9fd3c652aad1e2b1ba5a4362bf3954f0a950c8595e74a5217c8f2a996964f2ace5448c07fe0340bb388e986da83f98472c4db804d201d4002cc3eb4884a683a50f82d69ee991c79c5986cd9df724f2940807eda7aefcfb6bf3c6e928d951144c684b04ba7aefec8b48f42613e05095229e79c0b8555cba27ac494f84d389afed9a697e7fbdf484ab2af2c5122d935efca8aa48c0bcf4658e92dbafbd5ef1d4fa7c52eb8cb7261e1bb33b121d5fe746c9fe450329d3060be735fef6e1f368e69ce3dbb00553515bbeae3cff6f9be0ccc69a4dda7a67bdf9b0053fcf7b6b097c51938555353d8cb6f9551d0e164baef8f1136fcd69296616523b95f2da548d3ef4bbd1f5c0510de08132589f81e997020dc1eabaf99b39558824e21ce040b980b029df808dfde0a6aa4fbb0c3088be9d272f0328e6d98bf531ffd199a420b9e362a4317833f732b706f7f96898c73381e1ae0fee48edf1db0bc873e8ab4933c3130f1e33cc09517cc2cd9816aeb588c72134f470284f736336ee175fc16de0eeff5548b77afee26c946fb8fc125bb3ef0780154c40f2d835b8b51d14e62fa5c9483712afc412c71e2153c605b8a2dc16ba0773a95f062b0dd526e80ed219653e96a8d6f124fb1653e05eed6709d6d189acf7591568d8ab0c4ac004151de63c2841be5a4c65c38be5318752f45327c6371c7e334652c035532ed372d03776c1f2b278967a8b3f235b55484eefb8d11aff1631bc3c8760375357fbb773f3aa0cfa1ee4c7c171a8a787725250925d85ff720efc43052a167b0f6177d7ce7201345217426e567a019fbd157c867a1332129998d38b211802e4a4d700f8d3001e2853eaf4509366f65022282cd64f17c052d42763b36a2411d01d188f4d05c2d63b06f9e6c2ec2acb41cbdde892b84b7b2618957a5c5294dff6b9ed51e952b1514c451cb21d51bd535360df25518e5068cbdf8aaed51b0d3908bc2cf6590831b87b34a0ac0603111b63bf45058e8ff91c14cabeb61778d64b71fbcb714791b56913a3de6d03441c63325ca64ca5538a920032bb1fe792671f922ff6ebee89391354c9d0cf77e9371e889e859b2bde3ce37eebc449376423ff776e358f1f6f1a032aecfac5ee95ff9ef45ac9b693c7ca811bdf2d1310cc3281a0e2088b68d3abbde8fac1876577a5cf0b12b3b2f6cf4ce4af05198c2665ccc7d9af8f69ce4bf793f516468c9521eb34fcf2edb5f41f2fe1c49fbf7c7be7384f75b583b8d3d06c9a3cb25e87e2df5b375b77c650a6feecc3ed96f3c5c446eeb52e2a7b539216bf8c0e284e45668cc2548e5a95ec3f3ca6d2aa3f5507e5589633ebd23345b64b1e3e246415a46b18f89e6857011fd0aa8019f941ae1a5e6be09705a7bd27b8dcf3899d71a2133f07f7de62571e47f98b0cdf287dec098caf492833e039fb4f35990382095cd0c4dd0be29d1fcf9bac3d6a0c8386cbd6e5c1e7cfdc95f3e699540b322344e0f190901e2957cf3b74af49e56a491c70c37f77eab457523d38539ab7abd47176165be5cb3cece13381d29721c5e5985b2bfac88e412a4e688eff3174e5907c139621e02c06952592f0acfe291983942d8300b024d53cadc8bb810e9af7a04470d8dd29a99907cbb7911157fda1c086e39216883cc999562a6a7c4974af3c2f Params = SHAKE256_W16_H10 Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 PrivateKey = 0a00000a1567db3f6ebc94f97e4f0dda7c92d25a84a40c7557037ff2a6595b586a027a7de83f8cce80fa9a9575dcdf6d1afc46db87c5eeb1a683c24b487cbcaa9722cedb4f8099f458545a83b1a80c3e12819df02fd16ca18831f7880776a6a7edb598fbad6340e8b0052175b10b413ac75252497aee63638726f12f4146f1d3d548ccec0000000000000006e72b47219a940cc045736a2f61c1a3aef4462ca66c1757fc15176d85d1a1e696ba325e3cfa6ec2d786763537858d7bb053e63c081d1c1955f7894175ea5dcc36d8e2bc9ad80965f3e1589919d6146da200f5512f22b64b7c2b9da2d42881360a3013aaf1c972a95ac7072e8c576d398f40189a8e982cb8da49775f5c61f579c7 Signature = 0000000000000006eaac5708f8e22463e168af5a4dc8dfee899dcef58083e912e0a617dd4de5d59e15dd97a692bed54c5f166cda125edb920b4a4c12979d3880a3116cb828dcb431a6b20b16418a645265cb0a9b0e334e437f4fa30b5d5f1cc07f798622d72a7c43cd5df94b7a6ad62f41a4c9cd5665708dcadfdcda0b9225dbd38554c6f1d556c8ac8b2d76c8482eab31500e58af8d7ba6e80dd73c2409668ef72a536a9ea5766251179d016b9c347f15547cc3da260b1f91356932ec4f45fd582833d5fd2f3c96d70fe377c3c6e2eec4ee160736d07e5daf926d213f0b14e5e44359f62cdda1a74ca9087963a5bd407ea14ce35ca58e3d6526ed82b103f161108166e06488db790d80a2b83b7f12bb820d97f3cf48ec4b99fde6349864c147901c904ff8451c4012850433e8bca06397b847233a839b204eb3653be0746cdadee320d3f6f6ee3cc279f18bc797a5b66f8e895b98202afc91cb30e14df59df91ac873f919dfacae6d0c236c88057aa23b491d7077511bbe73cad0bedf2e4d5012da795f55d9cba5a5c26aaf3976f15ce6a2b0fd0bf5f2c8ef61608a952850266ca6de86b376f8ce4c877e96611d95ab7fd170274050496989fcc67704b06433f4c61185a6a30ce49180611b138c966acbc3b8e6c10c845cb835d80821d0c67e46d5b15c0b5774fc0c41474e5cb25ce183666805bfc929622c51cc63f1f53b679b0ccf32fe707681fa7ee64b0435771899a8dabc218ce88a7783e65a7d1587fef20a6a5f2d770f4a5813291a62903e643d66283ad9fbe8b1bcc2f356c0b0023604c093a99e824e9479cb7c5a6a75d66dc9d6ffc90f6412dc01db397d5375bece15f50b1af68e0a99f5cbc6567702c3358ee4e1f321e5bc9a794a7b1a5e9102b36552cf35b35617d90a9aaf70aca108b80011f0feafeeabf499f520f2b8b9666a7f767db40fbcf6694ea3b10b80797a1e82f3e709cddddcd4ab86de0aee98fddcf9bb4d23f765e7c63acf1b13a3cb918f2e13da38562f41aacfd5c50ff5dab3125a0e0fb0388c9755efd394ef6f313db8b5471bbf870e6eb6c21efa9c564f465ce3061bac232e630628710c937b249e09807c7ab176719a1ec7b9a8d6e4fc78c0cf2174aba3feee65da89877f4ade70372c06d717c73dc92438c38c40a199aeec1ce25cf6e4bd3571f3fed78a5d0ea28229108dbbe9b1b95b37b87987fb196a12219369be9cc61c114c421be19158e23ce21ee502f8e1749cf6017c483538b35435f4491aa1cf616823ecd2c2abe4d1bfd58d8376c9106ace73c0d21742062e784ae7418869d9a02d8f27150fe9ce0e933cd22d6ceb997c5da20a77951736cdf4bd68d4461a8ae83db50ed09028935c3fb899b166d3c182ca6cd5ff503508a85d4a9b81a544f94fab8a3751dc3e839092ca48e815a1a7996a1f48964057fa0746103baacffc89a8bfe412ae6c6764d061a8ce397879bfaa755661b51142f34f79fd3d527088dc33016ac78fc18f96f755c968022cae7a4ab197eec85b9a7398e1f33af0763ac5c9f760893dc008de9f221a79b85ef6a780935bb2b402023fcbb89e85a3d06d3cb15f8df165b85546885f26be9554c4a33ea5a130a0f34b74a733e628c86be024609425558242fcc0d977d5316b89da48dbdf3c77f1f207862e1f35b45f66dd781043f643573828bd90c1b0ac6d53d0b76df7c130e2ab74b59ea5b63dd49c37e6b18799dc93348914af274b8e696ea289f586bbda0dd7da3d1a3dd4230d6453caa31fb46a4731a1598b411c8af4bb412bf8e9b2e2ca32a9c7f0c85bc65e1f50803b3fe5e0ca30c6d928867e07f3b253c985d1eb12c17b7da9dccada0f50f1c932b6b4fe1e2d400a4e318247e06be0d96bbdbc4c391ab2c66f691d6536489ba26b34e32a5aa2f25fed50e31cb364add7ffb0a4e10bba1cc717e5f1cef7ef2cec413b61fbd5283656eee701fbc9cfdb2bc721daf97a7de8cf1ca144d650fac423589904c5bee08a85e2286f571460c0fdd61330c8f89c5b0ad061fe8831345fefb08314b308caceb95fd2f353da55ad81217cd538bbb3b5b1ef1a78fa59e61435e8c447f37f900e93fb5c653a20cc84c30984e0853ef9df0480c8d6f8848bd33d80c89e38fb7f71556b255fede1a2e391160a68e51d27ff4e40ab797039c28b67934c82c355aaf94426277ed7980fc900a534752c636183db2dc56f7f51a79897835c021e80480437ba173e8d93bf5eb17b3cbc5fb3656878f3c25b5312d2eb5512f14104d1ab8954e837fef1669e3885d5106bd84e6beb078429d1239077acd6a8b9155276e4e37ddf42c11fe0b9a10e1d8d4825aee331cbd66132b6e64ea46365af8423be7e1aeb56ee6b7868e172c169f6ca4f25174d1648add667089094a60969e0607e09ef35ee5f757d69c83e16df8eea601096131b720bc9d1e177ba6a4a8a7a89e46911948daf3409d0f020d62cd0805fecc9821237d46c9641413ca2b1c52b1004040277c03a159eca9993c292bce31c413cda56c7910fc346cb3e9ad9436a8e7d12003db6d36b9f8f624c4cb3b740492c1a79047a8f84733caf3d557c0cc4cafd29b0288d6446777844a4fd490805936d25f8b1cf27fa795df004307ad975ffcb140cda8cbc8521aa70e110582ffbacfd74931157e55317db0e3f1872eefc40c9ae89cf9f60bfec21150caa5728806c8aabbf2f31a7c92b1c854621a15ae8ff0889a83b17ea20f00add93ecc16eabdc33bcb6c2f8deecb00826f2f20fcb8d25c9791cda567d3c5b4b1db0e0da912a1d441c7a2bac2405b9c202af4d3bd005c0abdaa6d201b98a194cc7808c400c347b395bd2d9bc156c363ef61edf41bd38d26b77f18454d2f9e00692f81410043875dab98f1adebcb574479e84ed50eb1b448c2fa326b304bbf9bb5f50c40adf78866dca9d81087a3a5164183676f09a535c5fa6f159fbcf5fb5f47ed5a61aa08908bf27b21b2b37247d1fa83756e8d26ffb97227056f2086e55b3f11f89c01fc614187d6610e5584b2fb7355ec8a6a93808fd69dc8226e758625c1a08e092d8bc7dff82351a9f424c78173b2644499b7577168ee3dbed3b2e57f43bf92e6a2c1c3fef7604690fffa574861f6cd9ac8d2ecf3cb92ea97582aa28a8625290c2492423412b7217dd4bc848c427cb837b871d3e9d46f8f535754de12c6bbfd60f729d9a4daffaf6dbb579db7ee279e7cfb9a881eec04f47c42875517ecf2d3b18282d66a62b6079e4bc639eab1a24f509318e76077cac1b4742ba0a2cb6fe5d2c6cbc19132e94652a556995124368c73c22566d774cf216a873133baa1c4b91a6ef4f0f08579508453a4e41b6feb12c3f6a6bf00b86d818f727a6e67cc2aac8adc87d95bdc0be85a9271afc6bf0f64a41f88709fe8d8321e7986aee3f2bac4ec0051a560f80aaf81e39260c387efa9f7472acbcd81d417c9003dc22e76629d1611e04c2252951ec1f7df7fd955107810892e8188da75eb2600181ea5664ff3377aafb9218ca4d66a3309302355e36cd47d02a963d0b5f3d3306b3fcbf8d99fa515afe7a0769f285329dc6345c12457ab877b20dc7ffc0fb72ce4bb0a5327f1f8ad6bc9d7ef97340531e2ccbbc387ed75ae8d29eb91178616a98decebde1a12abc635b504cd35616921a8c7b42d21f65af7b095d903c35f65614b4f521befdb7dae5d0409d415283d5fc665a7f28b26dbedeb3c5486b94c7b3848ab72f10094260c115700cd7cc2d3c7ed362ee9d764f7317b08444aed240c967d3655c5fd729634ffbf8cab4a0558e7a0cfd58feaa0ff65502b2701ce0d9175439c66f682cea4ea86f70f7339cb2136d9a89779e400991a7e6dc9d6aa79553c40503d5e648b29c66de9199f77635d485bc93f639f333e0aa4c87cd9333613337d13d47262841ff873517bc35b436dcef77b7529e42de2ccfd87b0dbca974d7e8c253da7ba1bad95767459ff3a4034a95d0fbe769753783b1c55ec95f1b1d25c057d54866a2c4fff5c6bd5ece63ffea916d2cab80b205d86360cff315ae8d2f6bf2f33c03ca0ef701291f853ecba987c59344f51b758570900eaac308d903e42b36c202831b3f4404af83bbaf81be794776393a4593674dbad70e650dc5003f1237d997782e08d2d41e2b69626aa3cab29dbe786f572331f2ab7982f8ace0e2b2ae3c0e2220da55ecd13af40d34135242acd9fcc4aa5f011105d1f936f9c0766bc8940bacdfe6f3a44e44825cd4cc98898bfbdd97baa20b6037b4f33f3fe30c99473e0c419b29e55ef6dc13636df4a3f4748aff419fbdf3c8c4abdb1d2544cfad582d19032b7d337cce262a20af30d2f373544887dafdfedf57d475292faa053dbabe458a6eb2161b84e9494c72864a2141bc533bb289e5b22d777e340394e0a202f8a3b75e5759843704e102cce519fe6443b64901cbd7fbb1c53ccaa0e653ed9dd8cd4129e42354e24611881f26fad750e888a2a5d4318b4a93fc9b6ddf30584c263d9940663bb45c7ff2b14d93db2d23a8b08b829ae6f54e286bf5124194123481072d8740e99e7e80a7f16c2c97884098866c3eb4e86778b31007f0585e430250d0ae11b4e1e1d6ab718eb6c9c102d49494b641b2c4d6eb19d0b4dba3e7cca58348c1d5b3c1281b4f03f72f9aeadc3128fe85a7fc7beb4145de53349e7dc2574a2f8117f6d01e485959f3b4d17333c27d6300236bfd240a60ddf1b5ab754fe8da67bba4a5e682c74373ee0f7c339b8a76d5de2e959c8faccdd0dd0939a28c64c5fec6538e1fedbf7d81535a4493b6a5f74a2fe567678d77c914a3910aa61f41baddeca2ff6204a87568244ccf0d03e12b35ae74356ea69024a81fe3e0824a14ff2733c75b9c26fea22f4f37fbdd11590b73ce7b963c606130b2caa9c12675a7ad15f9228c886e1943c870da7a72d1bb655c451373885e8e5c97f1d0593145d457c35a780e13b4fa8426e6ece57bb8eb84bb53ed22058e72d023842dd1b0e7d3249ef5495286a7d2be574f172a3385979b2ffcaec690ca27a9c5158e00135b8a3e30f530e5850067137666801d5db05930439b846276d659e29bc1cd43bfd732e882d655985dd9fd5b11b9ba325ebe090c5d85088782fab7d3c2479b3d51a9e8da746f0d7d8ffae09b960c4c572f919a77cf13f2513919ff34cd1d6a9f01f3b1f6dafa185ed41e2d2d2fab3a39098571133cb6beab127d7cd913bc2eeb19c53083bc09c123b74a7b9006f1190a107b1c389e1d1249853b52dc27628feddb54be47fa0a1926857f3be5875148a163113588bf9239a1d82ce343180ea6cef07ef592f8e50b9ae35fc8b3d97aadcb712be10de51575ff8029ffb5b0f0a9f4a434b1f4bbeb240e1db3d768d4b24349dbd2542b40785872e1d9bdc55250c85968d6806a9d35683a310172d981acb578af037afc20e7d29e6840423526fc16bfc741e769b97acb60e59f9008957e7fbed484e2d7dfc2a3ea0eb253cbe8dd6bd4c2bbcd18974f198cf703bd42c3048d98916350cd9f2340b2a88f237c9524a86655de84d429318e47942761b44c3d2c0f2f7f0fe98c4439dda9d155431bdcbc70488438eac738b345d7b5cb74d40cf3137310ecbde97fba8059a74c1a5faf8b27506556b8e46327eec700c28b8b0a388c86a1bd70a6432146743923f588c220827028b503f9f8bab5b29011962b221ca91efdde1b8a7af52678f173c2ee619253e656a94d5eac25e94bb90b0d93570563f4bce04feb97a8aef8891f93d86624b502f4c7eed03520d0da17d9735b2493e4594d82f1e7755f4ca11c5a7faa50b87e1af3284b553c27b8c5df5e8571040edd83b417a109c6915c369ba899ab55eac0654969c20fa84d8f37495cbf0800c0f4cb20edf0335ec880be95d567045bafb67b1d70cb6c3a5bd4777bb0a47554609436f18ede235dc995170a40d9f193ae4e2b11d6269e57bb5033e4eabe7233b0031e24beaabe65b5874f31322d6714429b809155f52486a748d5e6e204415b0d52875fac8686e034a9f15386c491e97d37c24c1e05ae4544358d742ecbc09ae912451daea3c737cf53ab65a0bbfef6e0e8eecc25deb3a78b541e7e63f33e9ddbd422ed820300bfffb82648bcc5bb0f59afd0139f60ce984fa1bb2027b8a1490314d3f326e884bfecbf5f242f63b2de62de4b5662d7f760f01650f2924ccc2af93183093b4051689af49b6981517856a8f11232bc577e899d6132fb5c72665d3465e314a5d41068972c6f4ae3707bb70f0f3997a402f66933099fb7bb1c1eee192c9c50c93c498a8d0c8033dda44275e14a6518eb512e17fce810fbe958bdb832588f299247e344a4604b55e21e9d13ca00d6dd4871cee9d1e95968739d8ed0ec9a335c8da0ae5f73c1e492986ab536cc292d270bf75cda01e400628543906d58828d559bceb30148cf76a77305fef5b14322928613d7d96ca764332e085e4c5e04feaadebf910258ef86660b853f493f4be3b4106401a094c4dd8abd51713fca5fb6aa90cae468f775b552a2cfc84fb6d27688c7e4ec4a8d28b632a514ca2eba0bc8de9da2436bd1f2dc640628d0394fe7223802072d63a5c687831fdcaadfe6a9f04f1d004288bf5871d5881021437931371fd49766ba9118729c4e70bb3916600efa46580a4f1096facb100c83844311fad7e35bb90d40cf97bb121899ca4a451efc8121593d5bd3b2e2232791689b6bb6635a40141bef64de44da4c557627e45ecedfed6ae1c2d34c890dcfcf7815431c1bdac4ab6f1c405ea3b1040ead471a76b7818f6e4a545ed910837076da270c4c7fc66359e8e76458d6d67102e7149294a8756391ceeb9d4edb7e59685e5f08be576317dea3645a8cc13f81162a38a6be6d283499cef441962d19d88ba4f5803521ab46778488d65395ff6f27dc62cd2deae0d4eac8b6c035cd68e0a2dbfff600861dc92e6b93503edf3b4cb660ccf34e4366d01aa57a0e5d6a6bd45c7f4d98534a50e11eb6bdde81e4d6371d9e2332f08376dffc9140dfa9c84c31ec05577fd27f797eafb5b83476b4dc2eb8fa0a68e488c364b5883220505f29147a46f1ac47c49aa9fc568955c0384d6d3066a799cf0069d5c1a44c60c2cca25ff54d30a006b31266e0925d7058ca21739ae29c86ca703658c45393ddbf9b3c17ea8ec185d5d19dfe35446316344c51a744d004fc6a25511ec94dc630e7cd3e655754483f84dc1610778bc060be8116c10999c8f70d603d0d03406f1c4f748da8e3f1262a317f09ccb6773fc091ef19554d56816e312668aff8df0340bb0f4ca6a2639f64554523aab5bee6922081b84c0bbeebe77dcbc77c878302670bfb11a8e157e00cbc710c879ff2fa298aa90048ca59e1c4385035eab2d42f8e513548ba1449e1ef61a7f67d33df93368119f35dd607699d8e861f0eedcc5dc9ce4c311e45f62f6e28691f49ed0a214dc6191038d5d268fb5aea28edbc8243d46bc3bee138fe32245ec8cd6043268c6c88f4df0c6276673270ae713345c2ba462b117893f9f8dc9437477e8da4d4d5a0e642b7ac83f2594476f618fc4fcf84c66040fefa26d2fc673871a092a083c8b243844c68ed25b4eb558e623f43dbacea2a6a87d687e83b3361232b694742502cc8b1cdd87261d114367bb43785ddb5af419677727a9b8b5ee6f193beece635860a6f8f8649f027f458ad6557956a240e5a1267f9cd879bc2f11a92c9047097cc53465e184fc2af1d3a39f73e152d0d15594a11ebed172cdb008b60324687fec64103b6ffd5a26e216ad128c09e0d658b8ee271cf8713b22024707863179007651dd0987e00f89d3d231a9132828debedcc9ec101e1cdac7aaa20d997fa957476fa26b5ad7d417476482062b6e4c3581b8e1c74b7a8e208b2cbb14ca70f04467b3fd913a61a50c0d6fa546051f2d9b4507865f8a0fc57041bd343df998b184398a085f01ef30d79ba652faba758fb6806c2574dbeada76f03ee6d93ac1a5ea270776b8fa7c071fdb8fe0f0a237e43c602abc75718e401aa3f87faab33693c559fe1fd52eb47b926b222b25d12828bfb073e7987b0eb867bf08910f6c89d44276dd3cf0d901f286ad9e1801b0b7483d98201cf28e24aa6019bd463f8fb31ae28e383e116eba0df9d32ce420e0ea7a74abf65b4f7e83087de124dff73660518b13d5763d173dfcf70dddf01d6d630b62259344069f1d5a7ec5dbd61d1666b3f1e13f7c4f4855b4fe84857b9552396e79ceec049795fc55b73662672c48f6645a83f915c8903ddab5b97b0dd2981b4e0b3e81ec55e2140b4ab6acedc4a967fbf789931800c42c8da0eea1e4eaa6fcf1a43b1d0660f5dd104f2de49614f0a7af9d089145123713937303a6ec3f6291a1d6da57d13792718489b7b78c5b36be93aa5ee2a11d550908e3e8a2d352258813eec92808874c72b866fad7e8bfc4c9e7419105ac1a430e94f66e16afdb5f477d7fb5a324fecde3ceb940fd9f36842a26fd8f0b535bc139c0c18f5948ed4df4f811d63c259fc8092fca49a0adae8af3343bedf26a222bd6b638f16548d1927b78b8cd786b0cb55e94fd1aeae8839a36ee8ee183ebecc89ede3a8f41a848041c81900a4b83cdcd8443955484ace353394830ff2458f52bcfcfd452ec710b0386ab6d08fd570ca72737053ee8e98ea58a7da2630851d6ee39771692cefd491ace5afef9bda3947e1e95dd14fabe0d8b6aeb80b20a8c1b948ccdcf21135047022e31408ea91b58f705a5d653ce5bceebb69ec8ce419f135b6c512b25a6b70b1b089764d9366656f1fc25d0c46416799b59dd478d2d5ac48e4d2b1c116421a2f5dbca011fc40e0bddcd318b8d297797b6eaf06a99c3f0189b4988e6e2d45880b189e898bba95dbdc4ac152f55b5ad7f4fbff7848deb31c793814519117d64ac020bf0120017ecfaf6ce2367a46606d5937858efd75ab4b2f6809f0260554d4238e0048bbe139ae9659bf91a21089682764105a19355d02abd5ff30985038c0fcc2911916df2fb95e33faf35d9fccbb59d2e0690a34b189f86e0cfb987f32c87b23f5fb5ec09f2506e2e72bd8ed67fdf0f6c27bf44d639507adf5267b5b1f085862656729df027f91c70f1751bcbb45c02d46deb78849ab9a1d059b679269530d6c98ad95b9ab68b8654638deccdb6e30484b75b6185eede6ca91a92c41418b3e2cc8970417c20d796f44834c5c4642051b6877c6ffbd37ad31da237b37df81c7466191a1f847f16f2bc220f65ecf2e3ad248bb74f51f7b65b6eaa6b037bf30ee5137c58bd84fe7c6f4ae33aad895515ebd4074b449d2f32d83a129171604b74eeb0851b8656c98354138e9e4bf5fbf70a1496a804502498f46af08ddc6b8d0754bee7fdaa4663de5fce051f7e3d0f04e0b1a3e361c75fb5aa61a5c233cbd22dd2da8ad618ceac1b3a741ebcab50cae5dd7513b0b6c472b514d011bf7d2827a937e0b494eca49f873ad5b85438383a7f9bbccca6cc23e3261ce4ed419ee3a02744e0740a1421d65c985ac48b742be3cdeb4b933e19bb496b26dbb66720eeba19fd88f82490ae2557d26d57c2a23d7c4327b4ecdfa9cc3475ba3132e657cbe02e9da1ecaeb46aafa5b855c6fc0861e27bc19f8a44581de7bfbbd8fd23e7fa38f1abc991fd86ff55e90cdb9e10b68dc9f97aa3a6b4d0a3ab35d01b83e968400789c188f4393cb073e4fe28838ced508d22fd6a060e9db89cbff71a0a9a27675457ebd86aa63654fc3bbad4f9b49a20bf987e66fb3695ae80dd695a6fe3398e0617790dca8ef928b216f0af0e9f83f9747306cc0e687db37ecea8f75fa30bdc327fecfaebb2eb30d3032209c423b55755731e36a6cadbabc7a2097235fc7943e4a32a8acffd295a3a53b6ba8dbfd11ab893b38d7536c2b945107888a9712d562906ba52542c6f33c534a634a9965803a42c226e047b1f1f744e840dfe1815077fd4d9004370ea5fb4d4081ca57ed5e4d34111d319ec695b7168014888705725eea173ba50c5f71c910559f233967a2397ea16b9c8451a306cb20a399a8f12d8d3f16936477d2f0e9c6d7970010baeebaed72b8f53a26e6b27cf38eca4907b20d224a5c743ecf0c720ad136ce8e04e89b545ea8675a8d0749096def012f2f18896a3c2968ed11c61408f038f4addd804a06cb09cb15e12fbdd91551ddd64a9e9be8a19a4ef70fe42fd8278d7d7b95717e8e2f067b3bf1a64a7106b39a54bc508c8944653183c3c54f431b0c5b879a3c08479f3d64c5a549f208f9daf7b662f745c86a4759e708137a89ca6ed72446c49edeb83e81cd1f4763e8e5d70b0d3d89965b42fd575e618b3316ccf98e5a85aa6dab95c4ebd08b84235653f88ab8cc0476dea7a5bd329a28b23a4628841d15ed55bcbd9296537aea5f52a9ac5ffb6eb9cfb3b70bce35b2d605f85ec96dee0315a02e789022371af3adb18f2e71d2a8be1520bf4c85dd2cf5f677d6e500edd654d4f77f849f80ce97488f0dfda811c9caac78bf1b5812451062169c345b870668f6c997de753de22db07caf1a67aea150bcc1c030f0c4e4d4038ad49fd6dcb1251af23ce801ed9396b618989b859ceff538f235510f9e73f327c42b5018a7b5ae238d7add41aed6f075f7f0e5695322a98fe6007da7bac0e86cf40434541c568740ac503c73e590496cc4b908f77fb90d39ec3a34e72d2ac38f35838258cce4ea77b7624782523fcec572e86b321e314b8f8670a1e335cedd583b5d925f8c7ef7e8c359419c0299584c2050f9711be0e161541ced7df8f3d174d09f0d626b74b3b54656ffa7601599ed83543a397f5419da45fc76a02605eb8b54c6e08dc6e4a12ecd51b1cc5c3cff96a6b9106913ce433c0a3fecd029cefd03b81f94f60dceb2e3d3d0dda808ae1bc170fc2845032567c5b43bdcc73d12aa1745ccf8b552b5a8d6371de7e46562694a21734ef59c278aa12b5fcaee248c31207e9e7a52873b3942ca3295fc7402f0c3e414522bc9157694329898c8a86c7a69d5d8ecafacc53c1e1b18205f18b98f390fc02adcd21b4c9145ef30abb644203478f0908eb1761309e7aef66f13a11502e1e178f1fa0c21c39123a4b17f14bf577dd05daffb09850530b0b3bef2f5207e722e67a0322b13f221aa1d39fc5912101112329d8e5a50bc641a1a0933a1ad4f8d3d93665f43fc4fb64c0fd338859c43f15aee18bfc035c3e20ccd0edc15969e282b786f3b2bc88059162727ed2acd73fdf17c6a3f0f142b1059b06c283e35d69681eba84f5515e26e4003e65046d6df0819877bcebc2ada3e802612af86eeb0c9f60ca264f24a463834130a9506f1dd2aeddb7f181b6eb5df03ccb0f3f955fe8ebb81dfb9152ad961ae6cf66d2ca9c41e6df1871518d51a3f92a2a8a12f1b58c37556e3d734109d171a4d9d0de6f868ec431fd78848660ea8f97201ea0393e12175a001eb47c3ceb7709774fd56c6ab97fd3304c6380919ea1bbb6fb0e3e79c0c68a81b92d7e8818ff4ae5b9fbc3cf3f5154af2dbfee8f5c3eab56be7aed337d1b86b4ea669dc54d28192b8e7460f53e411beaee8a1fb3560e2cf8a165ad6a5c4401fc934c20f69d1d00bb0f170f12461ee25e9a700f9f00501fa6940ebf8d965676f7675982d1247031ef884f50e154acc5301da9e032b0b44cf789ad2ba06785cdc26802911679e7cc8f3d961d3170fe25134e147770164933252f92504a82b09cf5ae8aeb6b65691ca54d0a85d2cd2857151c6f133c60f26c6175c9b71e38b26465092dda86c000af2675a621fb1a78b327218e79c8a48f36b3291de7717505921522cd689ed9163c5d52d65b1a512ebe4b2339d14f86a3080fd58c7bbb48483b393657ef5fb1114c9060456ad133a69ec1bb83e78764c58c60edb7de190b34b3af3f9d53bccddc84ca2a0d72d05fd01c130c14e1fff2d68fc4a3d20e5fb221b322d1c0749071142955ee95110a1aee0865030112ec46db133d06ded59b1e20c398f1405a53aba9a4e666b9ff981f7f1de24a3905df7b9b948fcbc3b18b95e2fa3843d6880aa21727c48c33f946a562886dad45f9cb544785b8bc51adef7ebd6a1592bb3bb5b4d191372dd2061704542fcac492eb4fb6f970cf88aeaff92ff2d13ce52ff5eaac7f665548c927196818e21b1550ec1968f4f3fc38d7671996d4b891fc820164525c3b2e4204a98e2b2c5f1a5fc9d1bcd168c11d8832ce0506ec06127de4433c57bcca78d8d32398dc906fd61400fc357853bfd821c3b7ca81ecd19e01d3c227015e64969a275d16410f91c99406d3ccf49b7e847d7c3e549620a0c1ff5593ac29329d114556076ce6ac3379ef4671be92dff105a9cc45ad19a23f2f69ab9c896e25f33bebe4b52c7ee224eeea4fd3378480c597d994609b208558fbe16fcf37898eefb1e7b94140f95b29508d786ad2e46eee375c857d0b23ac47ff1744b7051849a2b38ebea3f175a26ad6ee5b2f7128f674ef22a426f03cb8d256f2939011e7feaf3d1ac542b84f0b0fa3bd3800fc7e214eeaf1721e05603d825ad6be46df2d8abc45e6bac79e9e34cf1970c4a0a89426e0648424751af78440b488df66756af4909843604e9e38a6cd0e7966dba731d494808c3c6766bbb5b545ebb04d7bdd19dad7a83b2bb82513bc1042aafedc433152f13f51bff0f5d6819e63e9e65212f8e119e8ec64bbb87ab1c7e843d10775de8160201d70447be796370e61973444c4feeb87f756b26d421922a7455cf5f0528e702d38e29b2f7bbca19f3ba6c0e04f5530d01bd7f69a4cdab43d957f9d8cfc0d2b07f2d441210776f9d0fcfbdf8e6697cb868f583b62437027164144ca2dedf1e5cfe110baec4573d272daeceb99c4de6e6bb18c9bf0c54 # Params = SHAKE256_W16_H16 # Msg = # PrivateKey = 0b00000bb4b87b847089c9f31201b44ea6c5e3184a0f7ca7c2bda48f4be401c0740c44b7834a14eac37437e594573364c23e624d8bdfbeda6fed404c758647610701aa46c00b19c5e9282043077e91337a154f6335fdca77fd70c367bdcc9f6443a364128645c3aec3b27f6dc099e654e0bff487b7e4f2ce2d3f921ca435a85d50326f4400000000000072402cf93e43ca36666dee77b8c6ae264a39293f7044f07e531d9e1cc38a485a0461a3656784413a1f013b8c72c09e297254849151132378ee2dc03e9f4eafb7d8acf4c6245997543630ef1531ceb471681731266f972de3274d2e43a8f79134a329a0a0901408846a47982d0f225e6e50431436552d72c93fe1ea938cb398ad54a6 # Signature = 000000000000724038f11028f2c9d5fc607db8c41bcb310b0a0af7f122436b643712f7769e7256606293adeca69601f62c4b814d3c89b1e343120f40fa08e62cfe6aad6ed0fb2ade327a60b03ac1eb6b5a85074c4959ecf62fcfc6936da859f9ffa4c87c8acd338f338b9709822ca96b6e660eee58ba602ff3f34365ab2aaa03d7fcb30d2d6238858bc47a67734840d9d56ad991edd6791fa55fe1d76409c4ec838d894f1b629c5e3b134693ef7655c5af27224fcea0e948e357b303a47dd994f2bbbcbc2b5926d32b7f5fcfe227124483fb4419c970ba209fa234f522ffdc1afa08357ebc0dbff2aef784f4bc818a3eb7e08823f1ff2170bce4f76181f0448a4fd6700daa42cc9ad900cd7f080fec30ead0e81bfd602fe0d2c8edc4650a19b851b6dfea73af16372da654d16591e2a82e1e7f5edd75a49640ba94ffb1a062ab1c282c552c256569d0fa5337425972a38d4c432ddf0226aa6d91ebdc4812ef7428e7e9c262edb5394d2361e6765993fb454d87f7707b1ec94b88edcf587ec5c09e5830e9d920c27abe6894084fbbe0f1f002fe334094aac118ad246f723e6b59011b91fce84728379e3f83e9aca87d80aec33c715c95463a16cb9761f1cf3d597917317a50c89719dba472ac2fc0bce668c17e5a17491866e55ace80d4b41ce712f796d20af5034a7be75ee5526f994f0cfd1db703718df5e48579cf69d91f3863550240182ee4bf4d160d991480940873ec82ffea433ee9ddb760286868c56e9b61a5cc54529655eaada67e79a7f6783f79d461315a506866be81c1c83c08c71c71539cac90ac2547fc4a05a35dd8be84879f520dbb2b14b3ef92d253fccd8f265fea78f9e853cc7c62d3565d0175949f0a3c8492c570400d91a517ed9fec40e144f20e36fe16ccce9dc4df5d6ef6abe6c7b73787fab104840e4eb3beff452dd988c2f17a8376959bf40bc7faed8402faad231d772cbfec3fe185690fade9aa857b48b54167252fb8b1ebff9d1b8ac0695ec02cf50bc72bf7bc77fc7dde0c1b7f76d9a15bcf73e0e1487dca81aa40d175ee2ce3eb5441955d8006300b5e756eac6ce647a01706827839dc484579da113aaf2d925b882dbb10fab3db506b6d0cb33a8071c481ac33dd330490a3d5fe274f21c3a3ae370f06a80ece0935c7e6155ca1a67949a4f62b25f20fb6e832b72f4b6318750a3f9dfbde538637d73a4e3caa52debc61f6ef63130b10f97d80e49a1b6174f91e7bd2c5e9e42dda743a87991e982275301fdd9912914a1b3a9b726f878fc013ed767f7c4e96d0e6379d5f301fabcb230080bc58daa8d6db42ccd7b7066df16dfef55a94af9e4771e3fd242716e7a44a6da6ac244ce9b9fb7843564c5a678ae6bdf98fa0f9e86edf67e3a210681d8a0108ae102b278f1e5ec9bf8b5aaede191105c43f5ac7353d1a957f0b6974f1837fa3c577decdde4f68c5e9d0e3aebf72c2e98d974f9e76de872eb148e28bf3d36779c846f149bf3b8105fff536476a389716a43f94ce0523015ab070fb3a249a6ded9283eb642558fd127114f76aff284236ca0a2ed41ec950ba94fe0869e5cb15a33961f61300319ca886c0e95fda75482cd6463088c3ad70c05bad014ed8b7264f8ae6ad7de2d31314a2f8fb244ee89548c438b8b8fd1d880b963e514ebee969a997fa7e23c95ab392cb5fd1c5f7fc3750424f1d4e9be8f47d28a03b8ce45a8096bda1d5cbc4740583617a5036c952e72c1da9ae75f3687504a7d08df6daca7053592c43d7955f5066299eb8e8fea2aba158d163033ca42d508ec9cb1050482275f6ae5e3f75fa454e33ac5dac918775373749ebcd13b8c4e7b0905193c90348d647dd7a92dec44c6f7b6bddc47e4200569e5bfc646541c888426c9166678e8c0387ea07a703a6ac4d0fbc5c965fb902a965f3074594ca7a43725062cbc40c8c1d9133d897dde9a5cec08b1a63a8bef191f47cce7db14afa88e9faed23e1df909d3193bc5ff49316af8d50feb5912cf1bf0b86a26f1ce1ea525e17139264f8c07334f7231cffe14330c6fdb845c89d239ed62e126780377db2f41a12f0d1189726f66152bfd1e6bf381e2a3cd7831c2087fafb0b48ad936003cc161253771b41c78b43483d22b87fe360e749fc12997ab65ed96f4e7b2755bd7efdbcc0eeb9b4fa815aa8fe4a30b8af83b4f29f0ce5343ebf9527c0c380ac6b441fb30d53163cd021c8d311452d6305ca82edd835cf9421066b615b13a0b5ddcc3375b27904a4be5c12a187d135f3eeabf7fe940e5d96c9438c2a8230cf968e94adf082805af21e575cef7d6891ba9bde23824508571cf4e325422235186ee1b4e02a66fc129ce5fd8c234dc0126eb28f44ae39afeea7aeb307afc42361209d7fb8c9a58e18fcec200dbcbca7faec0697c41122353b4e29f106019beb1f9166a389c00bfbb754be10d3306ed9b6d7f65af33236aa9e5c7c2515c62fbf109950550b4d9ecb754035ac98c8a6e488926e35b28d6adeb587c254513fd0437228d9fba3e974a0104f592a13f2e24693c84222a799dc4608e44fcbd340747cd3a037f64a1cfd6b646427f7e5f7c09aeece3ccce31b7396fccbfa723b98339409a0cb15dcc897c00c4963c630032b67f1d508b47952c9fb4a45c8fb59edcbc4f43df276c51c871d56974765d74b4c042358b1d2a4ebbc34974d252d1dea7185746fd965ab4c1b65006fadb5ac3e6d7bd2fe800209c149c12a841379081d1a3cbe88e54906170d32b728f9a8e264fa50cae54ec4247e0b276860b3832e67e5bfaa903977be94fde076aab9dbde075216f48c56ab20fa7433c7868705604b8c0cf4dd49590317465e42d387b4368b93fdbab695e86a5c3c0a766b307c05da721c35b0be58f09b1cf9c2da761e6e20410daf521a6d265a83287f6d5e7efb825f7429204671e404f9c0b21ff1e96a5473252974b2beeb3c09820261726ab08b4e6d06d9cf1049e491bf8e4b5df7dc661af9be5cf3b87c3b080f8203291107522fa4b9ce751bc8b3707f88f6ccbb58f31d385090f61e07b1eb4d9b4181ba209fd19c5258b05584add01c577a9196371b57bf1649046a606b4d73320f47fd7231131fd3fd87cc329336c3c3ac60bb804144649ef3abc91e3f1d7aa5ffeea68af3ebdbe5836cd44f4f33f14fdd8b01e4ceb1e530b9ed01d738d2196fafa9a7b533483f71afa82bc13e08632df2af77a40013d2d681ec545e9e04dfed7354aaf9635ca694280d419ad11bbaf34672ea165bb6802c9b0111d0cb49ed924e09aa936ac2aefe27671ae3704a846649f117ea905d8374cbdf82b8dfe202036a0073886e7403aab39148efdb818cf573140f66fc6e5a8982fff7beb4920b17f02a8f82fa8888919b08f12c60c81d9f0f53f23fdee99445414230d7aa04a54966311b81e245c183c20933c9e458c2cd5a3f0da1505a3dc13f872cdeb2d90a3b4e36e469807a3911989d339817190275a82571af4390a82179effdf166fd3c43e3215368c76acd2a2d5bcf3396f63417a4282f70aad3c8471125bdff1f006bc02c9b9bb7ce7ec08a20250f9f95bd609bc6041d81fc9fff0dc63da26af5114ce716d53cca7e9721ca7b4ceedab329cfa8dcad55602dc2d55eea39df604cd99be2630c8d20a9f27d9b5a0de7701e5f005a118235956d70693ced2a423718ccd72719130a8562355b69602860413d047d031555b79910406246c6f96ffd7bb39e63e3d47603622cb82a93cb29cb45a52792498b20da2f5d1ffa29b72b06f7f81bdbc56be697cac260df4a47afb3d775e7bf7a50d70c4092c02fff9c4e43e2ed32c04884b68821d0faae4752d7fb2c9fb9e3512777105b2b25ee9791ad3b7cd2aebe0e484d8830ad99ea09798ae85b28d1fd358acfd5652e990c4adb3da7da22b50464ed0ea97988cadaa18bf032878cc4b862bae27667c05604cf216be932afe18f5581bee57f0be91f500bc72d9b2346e046f66ecf0ada4f71d04f0fdeef8ef9bb4786753ea4b37401bc19d4640ad85eeb3c12862c854e3b3fa5284dcf3f1d519e6dade241ff3c539a74e648cd631be2dec9f160cc45fc28de369374a386b1efe85d9dc8bd0e173595338dce2500677a3f7e56c59c15affdc10a791a5f0f90d1906d915e3084d73eb295651b16be1b7d44d0ee78333dd0d1336896b282d93e49aa8388b97a641a55849568a5b47a97b2f7ba3e587da9f65e5a63a8ba29a1453cfc256d71eecc154c9eeb40eebefe202795013969e39849075f4939a4b6084def8f8cb016e983143d7ea93eaea22a8af2294fd3ee94735989a99d40de64c45d77a6171e00a9cbe694fcf09dfc1d7e80f918c52edf383f73115fb830dc6310704632d56901e34309f3168af7818432dfbe2d921f282edb1357ce8e0342815ef83c6f05c7b83942bf3d3849d3b0307ba8fc77e7ed04fafd48b69eaaafcc31c74a094c2a78098a0c83711bea2a1eab1101eede24acdf52e771432dc8651e1d38a9fa4ccce9b6c538ed39ee9abc5a66d22b83400a186f56db2fa5deb04d3595c367e23d58d54821103c939e4f17d5ddf8d726e9cd17aff5b9922a6ad342df9b97490631c462daa66bfe160f4647edbba42e63fec6dab3624195272ee365db2ee8ad5373027b54255f29fb458d615aec5aeb407f8ecdbf1d2e0b1c2b76109cb3652fe2608ac5053bba1fa98e703db43de047ea60e429386e75ede88ff1a74acec03160a93ac27cc0039656146cddfc0eca6129a2cbe124e2fcebafee80cf1018d19201a9316bbea7877c4d092e5759230fa0d22491416e8c4e90ab5c6c4dbd8ed497c2db53de25338acdf484d5edfc3dabc0d81e2d635b6a05e6c92254e73fe7e1d928808b12294c7fb3d744709a092b0c551885707b7623aa9679b9ac70cc45ae9e4c95206bed67293eaf6702ccebef0c603c644948ae70b1aa1532b11115359e18ad907f89ed8dff359b599fdf578596c7adad345d779e79290d511d03527481076231d102b707eb5bb61f646ae5403414f959766bc5dab9a010205fb0ef22b821fe3606afc19ea757fb0e8c5336c2ba5698e93e9ec9ffc289ef06072834d0ae5d94d5c8ef07b1cf150165c69d906676264518d94918d253dad74220176500e0d87a6f4a91aa99ba64c1178e8260ef3725329b4647aa96f6a56f2a79b52a4cd0510767224884fe28fe648ee6793bb183d29c2d7a215268a94deeb890289baef534be7a2f221c578e989b079488a1daf5761e331d570617d95fb5ab4774ce626783ec67a48f2220914d1837b4f4ef24c50079b0fb74d50ce65810d9119aa6c0763fd3c73c16d2df55fa67e00a0718f211d8c958c3865a1f7616f5837e1b35771c497a13d193b74f82a9bc03e7d129a826e8aa777f390db65bed87bed0f7653e9d965183ec6ae9b21cf40b16b61eef0a52da8fa1f81a83cdf5a419526f8c06a71b1825104be1577d6295214267c3d5eb11799bfe53ec930b4b537afe1f9ac9770ea8e1a29606413fbd0555355e4a4c5c9ff16dd3420a9f4288a40b3d11c28f77ccba75fb776e13d77efcc1ec413d344c20160c9b6e543103acf01bea82469ee162df30a1230ef8f45859ffb6d29c05eecb9aeb2e8e57e1568f57a4ef20b11f7fc0b8a4626a0061430df5bf5b5501b245d0a598c3dd739a65867effbe1283f2c81535a64d3cde2ba691daf3938df332ec8f38757a687d68d831b415aa6302251829c73c045ae2b7d2b2a78277766248a70633373e2c26db34f9f998d9e05bfab5502e09ef10094c96ca7aeaf9260861059a4dcae0167f6d586a639801f64b7c05a862211546069785c2d5ff804d5e372d9491163e0ab3d4d7f99bac0c96063d2f56b0b35342997164359ebe6ec2804c421a7049571b01df4cf4f78e1654d790565de0646ca91ac1764ee0b294b5c25f509e4753e9d67db7d1f3677af55d7a89406abb666e3cbd575958648638b4a4e657edfea70c05fa6b79f5e6fc780ea4826f09491dd4e5117f06377aa0d21b452fb95d5ba24fe5202e23c1b6290354044553594eb2ac9bd36d45649ef8230dd647f78406137784e86d64e15f9c63f22f0973ca684823a7e9c2097e659b998d182c560dee3c10f00de113713bbe0e959c6fde0f346b3a41313d0fb332cb29a3f8a3c3e0373f7a782a562e317f8954948cfdbd45f2ca2a2dfae29916212574627a264eca38486e2ccb50cbd3eb72306769e0bdf9f4bd3d806ccadf1d98d9cf180ba3d119cc07cf33e383a6ed845f9e5e8e1667e0a57b9fca6de8c77eaa20134f0c9d4e48109c0fc2acc6d65a3a97d0ac10a496f38a658cd45c895f8b11b325b679e6e26a272f1729ae39b806cf364e6d722a1128b0f43a687457812057efe9e0ab11eccaf7ec2146c6ff9a1488326414e46e5c0e92ebb5f524125d6062eb58d9c221be8a588964cddcb856c5a470f2323297d7b557fab3b4ee4fc820df0c138c110438d0965df5887307e5f7b65ebd663a1eee68104bf7004839e42df4b3fbfe1db4df4576fd0a6828ef962b0cff32c55183403e70ad31d3f3f8f14bbbe0ae42445be089b6d7040895b630c3c8f6fb87201f6e0475e29428d5f412a0fd39294fd81faffa59748254706651bc0b6c66b4fe0557ab52ca92dc4330920981b6b39332f05b6adc9553c6859447ff1fba841d5d6ba6dd4204467bddb95b41c62290905e8df5046ca9c5d39cdc5d08465c4667eef3734b5620b045fa78d203e3d6b80a1dcac9b154639f88a058db214df081b87f5f683005109d88d9d3824c7a57a3aa904c8d21508b19787557ef5784d42bed5b252660daa55413864bd8ec6fd1a8d16ea9d5ec0b28c9d5e9da79a46548f425b4f5dbcd4692af569089cfe13b4e6e7c1ed4ff61419855fd8d25fbb052b9e8136b0b1311f765d9411b0891c504f2495431ced6e1b41e58d162953bf627607458ef0713f9a193ace27ba2d5ae1f2d074ab9964e5a094aa2e9511d1e10af43494bd6b7ed85f6eca55fba7c5d4dcc54e107d64f9327cd5f3bf2d7a61f057e055f68985431379892824e745cb23c7f380b91bbd793468a409332a704415b8f2712d2950c9711537c38592b5b4ba622285cc825b3338f176e8369753989718b37af5972a454dcdbb0b2bcbaa4dc25764df2d2c9baf01b068417f69a0a1f3a0d2e6732c9577d5f05d4bf5ac9928788e094929bb7b0cd5d257f0c0dbab8ba06a2a3c267c1ce99f55a9f1f9bb9fb507e81edd03af9e46b6de3525f567349ff745346e127b8dbd93a87ed29a294615b3b97ab4aba06eb356992cf67571861240a0a7a11440c8898dee6f16c141ea1185be36ea533c8fa5ed5b4637641beb4f29922e6a84f78c283b65b3bfb8ed9cb569bf88d88ef10f669c4024039d6a04a4e9e724317e5d21f9ebe6da5465f2ee425f21ee9db17858a1132d382002b9f25b9d0bc105a0b7387e3556bada00705ca9ed07451060ca2311a77ac9bc62a6c53cd255d6d2d1609eee4ff577bc47f4baeeffd3502eecf7420d8313707068e2b1edf4717a63f42323f70a65931a3c08299e93ae726e63f2b374b020d5d3f40cbbbd4d95328d7e9e00a057c96b1200513d93af0340cf8b90e8c138d30d8cd33170b75cc1d7cd440b0414f2f9ba8003ece3e6967132db29265c0b0f76e413b1504c69b2e16055b79e6e534c9d631248a73e2e172932cc96b31abc8f5c127b64fe89d0d256f6fc0676678cbff739d46c98e5d110493d78b369c3eff98f2887b55dafdac803c5b318c35b2d712879f5a504509de6a35780ce916271f3b3ef6bb7e393086f3507c146ba3b6e37ec8157e364ff04c0c86941996d913410597c23bd9c0c4e9eb14210fd054ac4c5f560046e0e20544a1db429d9b823e104e418d6e4135a4da93990c7227dd6419dd975a4a088afb682e0be2c263de14a87ad9158e4c0864cb5bf16277e6a7afa03b20fe888dc75470785d16b5b09939230961569ad7939f4cafd89cfbc9aad6bcf75d67d7fb7d510500eeaa3ca93e20304ecbf6718b63dd8b1aba990ae8ac416c60243a84acdf9f178a23af5dc946974c7a5ad49ab50cd3165fcd7009ed13375cdaf16914b64c970f48666a08c7490754fcbb61e9ea2cb2504a7ebbcc3f43c3b1e7bb57e43f8897940d3ac969be5f435e0c6141a6232cc0fd83e4dd4edd50959aa75a2841b585306d9de325f126f547b7d44860a4fee24c778dc448fbc588dd4572209dcf1b09ade5a0a28858ed7d6b6a0ef152af546ed1c79bc53ad057a4439e44d9b7001486be0dae7389924d93f61421d95c8a46238001d1c6dda5810cb330a7f98f92ad31a91b35cc071b67c8d6d174ac1f19722de1721ea6b6388dbd759e73d44e35eba6d310a426e3bf469601063cb56497cbabb0dc87cb9f8f2181ebd605d3da36a331ca344b7a38b8e0cc691aaeac7f2220f71e1f3257bbb93def2bf87bcc2ea80f4d89774fa7e788b48741e2df058c25f64ed4efc4871ffde16cc58c19a4c14c8a859dfef2d3045bef81efa53534cb71d69814ae4bb37d712930fb7499eafcd76225e602553f466e1b96b0966550eba8cbb432454b6520880a693c77baad09ed4340a525a04d704d7cb4a318377b6a1c9fa0f24d69ef12623061e15c0c4b91e877bbb5caf6d3ee127533c0762565dd3643237c5f66725878827f47eaeef3fa333dda58e330894a3093509843517175a3756e2f3674f95446105f7b195b233ecdad6a21ebc96fb5ebd77d09859b61ad66fece19d4718c71ca6d8465d83611a6c5c6d760e82a3240f57749df0d169570bc9399eab7c75552e49b80db33a99dc1928b387f6c8f2fa233cee544d5a92148a1ee0271a35ce702e020bc73bb3ee5e25468dd832f131cda05f9f8ae8c4187851aea7e11e80d996c2e7c81d294f8e8e939ef8968f0092683179b11d8d34b1aaafd7d21084e981abd89cc9ef92d4794b9ff666ccf41490cb89f57a76b7dbf8018d01a1a219352d9fc086f999c3609afe2618cdfb84d44b67b6f26efb7ecdc998277dbd6f2d4959cce0952460e052c29157ca8d0b2956f24c21a5c3be4b0abb92ab67115b3695a959be7c3ef3dcd51c172dfdb7d931b3025fbaed1f337bbfd51aded2b63c028b1a193792ab4b00b912dfc446f4e6306b50787203d899679eefd86c38d7292ee0f7b5f2e1b4d6dee5cd6a9a3012daa64475c7bc8816d2efe43f04b4f1b256eedbc04709a80d66ed21c53d7023fe938855868ac5a7418707e2c6eb8d0d8da7bfa44f9aee5e27a920a0bc69bd828b34746c3d9f58e7dfb576a0a1597828cbecf04e3afe5fc3b76457137d547951bd3e89d08ffdfdea394b9a27a4fee0f3f6cb5945af9341215ad25be77884ac039d35fd7a5554d334cd1f22e78a655fe5c404637a7071535afda837af3ef79d77fc370f69de5f70faff027d36606d9caa3afca25238e735795f39f004f98a427c2786ca8b48861bd6c6d8a8ae69d261d0b637881ef3bc77f542ced8e7b6a7937cf8a248422836898ed99bcea64adf1d87218d21bb270e8b481b7bbd1c24b56900463b878d83c8957baf4e840d487129f1aa76a5f4b267f7df7f71dfa53669dc4b9d66e9ed4d4c70ab303b9bb16e51fb54445305b5e322efac48ede65c46a19cb58970d06dbc1e8ccbe7b3d1abb2a2c63c74c9732d061bc7ae59130ec134cd63e57076035a1f0be766e1948bc0131ff3acb713c375567df4b23e11bd13d01fc69b5855b2da03a07080a10e78a3321ba1918843e63679afb332999eebe17e72e8e9622cb843d9ddc689800dcedb260cd548bdc0356f129ded37e51d4eab00090f9593cd2ea79205b69edbc472fdcf5c5ac7c7b95dccc12b1b2610d4351963ef13816af6b3a752f206eb04ce2a7360b1b475e56c5ae9845f28b7650d795b0ece997dca59e7ab67a21904c3f8ef2fc1f3aada16db373d7a7f1d65cf9883f6d190f62e42bac2249de17cf6551c3a5048720c90792dc7bad1f3003727640a0dd8603ea7db7695645ab1fd3e1481fc1e5a181bc22435520d3e2d24d30b95694aa7b40dacaa047634a64f075a420b0ed74545644bacfba5c6cc78aaf29aa525b4a8080df1c3760b660caa1ce61d6654e8b8860c2019baab0bc9b17055814682ab9ce20d6610be5d2d1ba4284cd9e6c6ddb9728edb7f3254ad03c739f75e64e54278eabc52dcc769848ce9698f040080f1444ef273735a783668c4199d7ed5e2f3a80de22ae54c700aa02e365f6c809e0347940408dec322b3598c5a1267164e5d870362d745ad398dc0d6c43791861d48202dbb66cdb80537677349cf1bbaf2e2b88ec5a73a695be88f1b0c0de52343c5a25466721888ab5bc63735b0fe0dadf5bdf9ce2e035425dcdd5b96661b01a2806be2af0f983ada49084f64624c64192a69370daa5d0804e149e19344f99df91d741385dd5247db4baddbbf8bb3fda820a46bf1c095fea012e4fc43bb317b00d7febdf44399ba0039b41655e5b82325f7e18d7f01b1646fdc97662795140a251cedd9ab828190242179a72a2f324a6e26c5ea114969d1736b3a875cd5bfd24bd587961c2df39af01cf26fcd0335b57fd404d7599f3f15cd54dc35abb9177653ce4966e1dba3694a4c0edd853be691e51806bf4165aa64ab5d8009613123e32cf72ebedc63c65539c985f36e74e1ded632777a299f2bb30ff75de78f7df1c9a4d9b29634ee7d1ab983cc1c072e85cbad0dc692ce966c310f93906352a7169910c3613fd19159cd31a7fccaa61ce9d03ca46948210f25a67228c0bae65fcca8bea93f6b66c87b8038cd16f09c5ba1c143ffe3fc11eacdbd0beba3703260a0c5e17c0a5a7be337a213567e78032f84ef15ca978e97bb34c64f763d3dafc7fe228d1371bad6bb0accaafbfbdcb31e0806fa0f0cbe2659612698c96cf80bfe053e568e18b7c47a490beae55be87e9c3ff42fa9bca7fa065894f1c27b0da9377f1c8520c551e14506decfc376c909e475caaa7afebd71f015f6992e3130ca1235ebf0a9d012289e70c2400c9a9d845ec91ef03bc3f3e533afe582a909e3df0b46f6b1d16785451a71389123bf67c593fda156513ab053d70f65d13cc364f8a7d3a735e8a2f922db3476f3aaf7fe74b1654318e2a508d9ab1695d481d65a25994b4b6d8fefc25eff62033aa83f547aa5d6337086534c53c904e532a21cb3a378567571cac162bcec05e888d99266264d45b0b1bae706a6cd6c46bbe636ea153c01837c48a74b8568440dc90a556defc59a89fcc4be9d44024ba1c1d9bc944c9ec48d5ce03f2e5315dc9c152cfece3275f673e1a198e00e6a1bb56daa02d19ca1d111c32ad53e6060a201588929c2fa6d88fffedec54f30330976583861fa9c55eba0f2a2822b35c1e6d106dd3f0e7891fb1c8eaced3ab3afabf255a06bc6ffd2caed6c3795b1c81534dd81db3e3048fcae1e552ec66ca25d61d741375d02303193e25c9b54827a8fe3a1518dff6010713297cccbe84c0900c00f37d1bda1d65521aa6c7f33581f62e5823c3f3a91a8562261bbbc7b3fb14941dddaeaf7b02852fea344938a44fb6da983427fb2a543d4e93f9790ff9302ea58cc57cc0de1f7b726bdf7dbe4efe305c09d52a6c58a761f0bb208f756f6773593bed4d04ae60e9f189180dd1891a1d1e64c3a2147503898eabc2a98c99f8cb6c102917ee9b2ab27b1b3bba38423e947ad4c302f095860c6023d1e2369bff7e1845b23d3b84c62e2acc034a0067e8e2c0c694e9a604450988eead25ccec822a71324e36d6a3359602a857ed4c1ed613d771b38056aa845e60fb173fde0faad577f88e96a1fa890b95c8a899de77783bb7335f369eb55309a8c4af6d8f66220637cad6e99fa6eb5416babd9138b7d3a335767c4a445ce9e0a83a34ca8fad2b0f82def34262ab51d57411b1051c6ed183d93c0e79265187089b1beee245ca519552dc6928b95daf9f3283c88c0851926dee665329db4178f69b43b5c75c6ec1ddd242917aa9a8d2d75fdcb6c47920a06b778d51600b0559b68cdad64d7040b4d209feaa0af8615764182cba890b50927e71585d366e174187213af88ed483aac405b2c68904c9af611eabb77e3777c55d6f45d9c5d374d08949564c214615e6dbaa9f49d8e52c457ddacae4d9175e19bb9384ee5b63b057f8d96be76b9f94a5c549da47d566dcb67c5912a8e422d1ab74526a9455c8932c567a6d0ee48b7563e5f35fbfd23160793f5ad5940692abcfca660647b6ea62d9ccf95a283ce641d1784abf518f2c7b7d8a6affb5b6385ebe34e258478e2911fe5ad39b7dc7eab4804392bf791b81854a38f9a8c7de774c9cff06b511aea987f7aaacb5c784a205f7a948c7a10d471ab4e6724ef839ddaecb2892a894b91a6640ebbc89856d36b0adcc354dd411d0af36369a00e8abe3d406945f99360f20d13c2267778e8b4ab1a78e4ea332438055657b31a77afde47468e21184e1be96386d603c71124ad4fe2fd451456e218822ae3f8e2b9faea667c7c7a11b3b405f1f6e44157c0e7bc698f2f2277131b3d17f7c0eb686da2e1434b44bc47d8ee700891e977a3343dafa76e21c5e8902fb3b84d539aa77f84496a49bb0698f1ec794be7de4e4887bf2f48f05f6350bc363a6299db6f47f1ad0f93c12eb0bba93686497ced1395149e3fcb57be15fbed84e56e0431eb0d75cb7592fd85d5a0245d59b4d8b3dfcd0d2a8b8269ad487237f3a33b9c13cfb09293db008f514ec45c8c442bf5cfd06fd30a0b6757e2ca9a89901817330828d87c3112891a9be9ca4e014fc5e2a739e2635d3750b95cc1083b50b230d33dd4ee1efdf2e04a3a5506295815b53bb6f7e68f47ae3bf84968836c0233126790e8459da4a83c182b9829f892b1179fcc6df0338f04403a3558103315a1855676cdcf2d8883ea3fdf5ac7cd33bf129ac22b78e07a9669f723d63a1b13b6502e7868b792db2f2aee1d6286926901b75c0e0239515c1cf960fda4524762dade36f79a1ee91e74fee02b490109f626aefbdf3c28d63a215a6e2a36653eaf7010014d434283cb5c9f0ff31c1ad2976757dd8e7aa7bc46cbaf5ba2a81ddb5c7d0de3aaf3a07cec7313e9cf32eb45af1601b36871484023d9f994bd961525f6897e0f69cb0f9197084cb275d5bd495400ab8218fc8412b8ffda7ab6e7936924fd3447695de37b1895216dd8a6ee42ea851c58e023c841b9b5f10fc73ae3a4ad6dcf9edd0fb6915aa575afdab62c63c57606b3aa507a873dff35f9b7775798aa53d3297a671b0f8f9b9c3fd06bd64c6bfd173dde2aa47f15bb953976f86203709be35dcbb09c9910ca2371a739c602bb924b167e683df4f4a900e0dc0a2761194b543c15f3f969055fad96de495dbc0f79fae9c03e09d4f29814588a009f0d3b81d90c855878f60df58cd916770c743cdd1 # # Params = SHAKE256_W16_H16 # Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 # PrivateKey = 0b00000ba1b3d1c811483c1a6d349425f0a2b6534f0c88957eba643dd847ea0f2d86fd1d8161d0744a5f1f6bbb5912c005ddcf4e2530a97a6a0547d68b911e17a383edca813916dcb79108947bb7c5efa202a28fcd87034bb052603c2791d7eed312ff33938310e6d41cf5b3a29b64e5345c830ff2615c5092eda48eaaf3c406f73771c50000000000004e0723fa96db26ca425671e26422b27bafcc9004e657e0681396e038fef32bbeeea699f6dcd2f2dc3a951bdb2deb46448ab6e0fc7d9030783edab896cd826026c11dd1e582f43a889ccf105ad1153ab352c0f60608851fcdc5ab82a852c12935bbe339cb56cc579a9bf9817a6b35da225ac539d5d39f064467caf05666fe16c72503 # Signature = 0000000000004e079e1aee316245e70102e45291492a424b7b3a8035308e07a4d19d909564605f9d398e018e44947b7d44635ba29a107de685df933720f434790357d7ac079a4e9918604404ccf65fd87c34cd792de4ab04aee495d77d6c2a357bd4fc40dca6dd2e798821d87c74be626485680a94892d428203838485ff8119ae263b7ba0a59e1718c44c1ff3207e3459fdd8dd28fc205e0f67be732a6b2e1b7e8a884b7184e1618894596c6644399ac4b0771f1ebd6883432e065213d4ec7a9714a4e43745cbd8090c55c8a6b67824f73606d41260c2c50b360259ca16fe0014557778298caf582625adcf5841d6aabec234cd6aeff4470d9df161083c3a6525133213096c6ed201e888f111db5b5dbd2ec03fdad1052dee7247ed3a2dd0a23dfda368a59b030c377147c2ebe886bb19e4e37bf900d934e223afd4d1d646086a1107c8fbc67dcd41b719155b81cf755a100338f8dd958a4003329761845f2dec1e8204f9eee6825ebfbcba623599b12fb204e8a51818a7100ef6d0e98a66af06eb60aa4a8d3a2c70f35927a5663c97fd6af4b59b5c2c272a2f605ae50a63ada231cbbc84704055f5eabb1e4bd59d4de36d6163a938e096dda3126608471e8645f06935c5b06c92df3dc5bc91f43d9325ed00b347f9e0af164e1c259f8efe8b9a05d06c1335b3fae5191a0b6d3e8a47bfbefec6a230f34a3a8ebf0ceb0d5f26b8d5fb97abd56746e2970334c6b302fb934d68c7b5a93c867d470b6ad3219de523c6b793cd81f03b0ffce24d083394e270e3b56e04a40fe8fceb65645acd87153fc61e3fa31ba91ed8196eccd6e843d20e0b898d753dcf5c99bf29b4e7244b0ba20cc98fd60d32aed7d12bd00ac785abc9cb5d37aa6bd9c7a5611484fb61fce5250bf273d95985ce6cb83f213c3146624b55ded85801b81adfb1ec4874b6b7fcfc92fce370dfadab57e39dc03b191e4e36f2b3b23776bd517571a1a0b75b8ed60406b8853659cfcbc2c49e20548438f3de8b2756ebc53160c978ff1189a669e306220c17388eafc13c85b47e6459e583f0851c0ca6a9a281acb4b3d959299aee82e62e47edbb28c73d3e27d1863f5e5a9c1f3d4c5544a1578bcd5d994b29ccab2d01f361523e91eb330029f34ffeb19746e6499dd69c8720e5cb96ebd220623a1a546f4f1bb54db0add751c6fa65ac31620c7490c05a3ffa1a032fb93b845efc4f7a2d7c460d9183c39264c2dfb251ed672c7ca6cc947ec21c692ff21c05686c307ea98b76e721457ea0bc386cf6600511a0a9be465318ed2dd304f869624faec0d7380a4b398b1b0be518922cb932a8f6b3a8f87b287c852c02f820a2f589325820d82a794daf339bd9aa2097138e6291dec4e01c7c3da17753cb96d08f31cc48fddcb69063497547de0f22909d59ab405cd0d67ca0f55a69611edaca3e2056f996c14c41ab97fb6e87e1f523d5a58f5a7d6050fbd2df6055a781a1f9e6a0fd821e64e4210546013303399f868493fa0a33e2317e8e58563912d6a546b978961d93a553ed44637e3def482d961aacc43c12f94a4601d25021eacaf3730befb4ead26853fb051b8fd1c6f4cf61a5564a7cc1f4b666cf7d5734e95e5fb602bd7d506cbe9c6fd27b720b56fb03aff94d674dd24689bc8b28271df2f40c5197f35396b150ee157e9eb4caf0a905ad2c4b9ad17e0c64dd90596324fb84b69b6aa9e62dba1968ef296a820d665a4a19ecc53a1c9642761ad5223c4cc490bcc20010333f6dfeaa403b9825d1ca928e1c5472adccc308695b6ad452e01cf9fe565370525b067b9db568ca65fe0ff751b01b7e974829e9dc7631b7449bdf66d015dc43b3d09df24499e193f1f2b94ddd2e35a92481ec7171b60cb359cad1c38f943dcf850be4ba5a415954d9b9efc907f68042a7d2015b4a300d206455026db69097b6e5e986fd4f6348f1017519bfdfe1c06cc6a488f7ef93350125a73d0b4d0a6a85ce5f362173c3dcc7608abb88f79efb695472fa3ab3d8a06f523a73a43b3b1dd64c6df09659480c272789abcabd04f52998d485100541e5587c70d1ec060a51e7382b13fe1f891689960dfaf2c4cdbadc2d4e7ed588d083ba70906d5cdb5ec3bb725038479cf44c833ab78f4b2745def77e46516ca01e40ef074e2531c65698da338192b290f8e12505e8799632796d443d06023d86ddd5a98cc3a52ae46964bda6a75c78b35ae5636e6fbf41560a26b6a0c64ab3c9a66f11f928162526222315099b54109f75b1376b83b457b0263e961388318bcdc39e6f9b6f83db465965776293b3c4409064518a26f9ccbd08ee288663f74229bf6eb35cddc0e97f5a3405e0ac617f8621de6d95899f0339f962452b3494f55f8165f8bca28d65782f793dcc30d0971ad629e1ffff96204147178210cccf60f0c9615c7b1c9c894705623a76e9aa5c477753a625b2b705a473ef67d9af6fce57ad78e582bfcc0d0fa019441a77f5ff0dae520dfc40ca91c200e16034a7bf12a31ea65d2a72ccd78595f4873b414035d3ce43c440bb7caf5f6bfbcf7df55b18c5cb859f17c43a1f18e2a8ac5a798fd4f11f8fb89b439010f9372e613902a602046a2b646046bebd1688625d2c6f739f4a13d98236ae9c5fca1fb085c4b78f544ed1aabe6ebfae97759360bf0db2eb095313b041bec3ada471169bd75dbf1bfbe655afdbaee8966280bfe116389651ab6c7a0c2762d5b47a9c057e4f257191b2e232f1fa05e16c97046b6ddfd3f9729aaa7874daff9fce0f23f3d6b44ec159db2112af06f3af7048aaab1622ead2edaca68c62d4c8def48c79c505aef3363c8a6f69d9382f76c6c972225aa51e7d5221776810842de33a032ecbeeee75017705ead8a5a4617f4a934099959fc5a043ddbda7fbb7138a7f9904514d7f7b5c6cb0164e5aed6ecae37a996dac2e6fcd3c36cd457470b0f605e5c0b6b60d52e6f3955b6cf21ee2e6eb43f2e8fc1ef371ba8853e31ec2411fb9fb4a076b3d528845265d0540549600109ed7a4c9f749b75c82e4520ffa82aba81ac2c0546db8c13473f94df00112873d4080b5652daf356bd213b906e59ea3d3a2512f9ef9ae0a26a92be8070d4c681e43ef21deef4d132e6eb1b970d77f98dd7d4de809dbd60a83d20b638f744eaac4868b50d8ab6c63f01e96f9b5a2b45a3dec6fdfb5bc7195c9f7f5e7bb9d73f664ed4a73a82e9ed9261fad07a219a3133279d20a0b86d63cb9594893502ff1bd2271e068079bd3b597dc77f35ceeccdc8d7979c18b03421f3607b62a58e15a1bb0cc43c2abb3cb677d141d43aefaf668bb23f4dc727abc43e2c032258a940fd03dedb99da5a7ea09f43a8b15db8da7e8279d924fe86f763c14f7a7ffe7d29c922e652bf940d79eaf2514e7121ec6855f0ea04d578f641b0910871ad9135f59d799534ada449c8e342586fad7398768593074b97686e7cd5f984303ba396d5c32000b1daae6491dd86a5b29d78a76658a496ed11eb6ed870b81a6782a5c926e7742566a8ebfec2c967a466b8153d24c60f4e3c7d13e4779f26596b27e24b4198ce2d352c0dfcbb6ff36205b5cd81a29dd89f954370f9cd7240526895f35ade225eedac9db322ad360c309c7885faff40a65f0fa6a32252a4c0110ce72158cf7603af499a260e1649fd141868ed0451851a90864ce14b3ec92066bf8f44aac002d594bea5a37ee68352e184570593ac3de4a11982f2bf7fd8b1719410098b369b4d9f23609ac274449533fa32145bdd435c9750da22abc79eb36bb617ac1cecae3466529ac6e1524ac5f4166cacf2741c02402a0336cf7a2280f54dc6612aa9b15cc807e1cc0affeadc2dd4363e6e67b7fa568cfebe2d61df4501681422797befd50a13561bc9a4c501de922d557f22fefebca109d63d7799463cff5771fdb2688c6951b10d4e4adaa400696d82bba273caf7248112989f78fd04851b020e0a317acb3bcf766d5c7d95bd464cde7572e6a1b978f382c8dfb8790e1c27e01e4db23535d8918901f194b43f822fa4fdf358adfca8e8143a7707850114a1f937571535eaa7069c2bddd80397f2be8ea4049e4079056f6f20011fc5da03766ef98563e5f8419fba32f228b387bbb89edd8076bb3eea1e19a91761dd925e3dadc60b16f02da9ce84756ff34b8e5d483d8ceb476d0b2ef07e1f05578619ef78a576e61eb2ad557aa7943b03546a276f27f8bf0fa30978a0c05d0a852b90ea6d17502d4dd052deed97a9ca47c9bd7a987a25427d75ea6634dd2c5394b2113c2bc2373a57f5ca49339999d19817377b854a935c9ab53f3af8a07bc2091cc74ac60096d3259fbc04a68d3bcb903d1a2237f0398596858d22de07f8fb84192e796694d90127c3353150c059d8334f1ed5fd49cd11c05200735d0e6fd3949e24f2119aad25b2a11922a36e6a29a6f844e2bbee9917cc45947a92610eb19cd41605dc46c667a871735f67d26fbe7c6f670254888332fdce19b10754a249f7c386da9628d9d4256241be1c7308487d8aca85ba93e6ecb7f7a7cb9d77d1d11906915f83354fe89c794a02b6f32f6f7561c60f29cab1a622472321a5962890cf5783b9ab60ff0058359bdcdbc268be76af5eebd5fdc8a096635e5f24d5e4b4cdc263e90a1c3f391d80376f5b63a4d3453096f762a7d1d589455f959fc75f37ae18d6ea24b93b0d1f24efb394762ac3559a86a858ac45c5ef9adbd3b9eba5610fe6dad440a0ab201f61bc4b8b8eb253c8859057ea1943f82576174dcf33c2ea54b6c785805e78208f7853a926586d8f6afbc81bf4a89ef36ee44f3c6de2bb776abae356ece87566d51ed249c02eb76cd9c83b4d122c3dff4ff45262276514cc44a187637cae66f20e5e17ced86e70393eff3352902298a1caa4674880dd299cbf6badc5c9fcb7c73858bd8cfce81bc3a1b13d92ad701ccd61be88c6559d8427ff07551482f25d8ef13493f35f54d40f3a61673bea6c505e4652fe888d57cfc43f88e9c7f8c38344e551a9b102e07bba8b1adfd15b77f976ef5d0fd321416b5204a90add8b397f891ec9f7ba324609f6c151e463a13cd7913d14be5560e8d4c52d8d1225d6cbc329d1763fb1c26cd6ceb548ca7bf21c55276024c0f7a1aaa012005abf91b9bfc591bb022073600b247600b6f4950f92b5ba11cba432d392fe7eec151d938e6bd5e77da32e9ea77debc3019aa98369fff62b629ca87c3b3bff4e3882f167669085af3495c198fba39f8467c8f4fa0f72e403458d93976e3ca05d2a02501fc3b6c8f431deba36e2b91943a5d3826b4c7b60de894db8b70f43ed562d3632ab4f8e22797df220ced93e4a1b735f36eaa0eca6c26318a2c7c8cef120f22a81cceeeb8f110dc64367d08c7ff77a98775e26a45caabadfc0af37fa9b9f5a05fe6006110fdbf361f729ba47aa98a174d82fc02bd59e93e0e3b6b97743b448bb521830c9123d2ee7bde2ed5f3b5e4ff3d82062402bcb3528123d85a29099f31d895072e2225a5ff56f784a4a0248c716c44c216da8192da4dc6d39c2146b88fe8b0a14c4c5f377ea32186a4dc0d4b08a6be648dd8d5862f852bc628518050180d636df9f5d3bdedbce966e992047ed4634f15f36fd4d022f7a36633d4d9fcccdba8875e0a9892bbac28c682d46a70c5565e5bbc401b31c3cb26817fd824df1b291eae2f4ffb31b7c8125bf40bb2e3cf7ea89c93e2cc41031bd4cc843c6b40b9c6977cec941d1db09128f9a2e3a4c455bb87c3c3d1934c3781cdf16cc1c6958ff9b929020b8255cda121c9c2a9d98cdcd5dadb90a60290466435d3f2f6936c54cdd044465bfbf6fd86868d18238d0f3b31a8df94d7cf77efcd7c4e9480bf0d0a18e400db299390f0aea1f65c244ae599261040359294d54df213a1b28a7d989f1c8ce262111093607bbd1df9f650e9eb47824ec6030bc696db32b7c7af6c7bdb77206ab989d911e88eab04f4aebcf467f74adbfec7e3c3f80ab971408de17ec8995583b68a28a90fb10fdc018e7b7e52bde460815c2029a083d58c903134ef1bc4e8eb3cb98bc516bda4b227adcd2d912ee7368bde81e4cdec05e426c18955a38368fa2638bb89e6e33e269405055a6557e56bcbc3f632fdccaed721321c2b7f5729c6b6d755a12584899a542fa9b2940e30932102a0ffa31b45a51febb9a040c375678e4d7f726c10800cafd7cc3ad6c1abf9140acd1f940e616ef2bb772893e5fae04e86f58c7c01bffd63f50441d35a73585b8b2896c5851b7b071cf674e343016984681565b9f125bb848f8c8ae53510e3e1a80a335a9fa549df6dc845813224194f8c1abb2337e3e6f8d3fd3b633f358d1f48a16c7bad0fc943c1af152d9c3361c9373ba39d6b9720803158d28e2d83a27d3e2d9cd3570ba3d3b9b4ab5fa28be38b8d0c41b1cfcbd78220c943b23f676246ced0debc1abeb379b3adc33929f3f2a36a9bc9e0f60391d80554801a6cdf34c619f2a280020047fd162fa4818c107eafb4fe14c80ae3930781ab0db97db0808f0b0006a0aa6cf32d6561e65d299ae13a50e37e39e0f08b2f53c68adb953430827530db9d9bd5fbbc549937ea517d5d07ae147f6fabcfc6945fa3f3178ebf2f8b7fc5f03a98c53665da97fedee688ce906f00bed244aa5033fb85b9c8fa03ac473fa1daa47a89c317f29272dc40d94e63c6f4069d6eb5e20fee01b9098b497d20f51877e02316909089078d35bf27ef489ad6a87d05651030f4a6b5246a8d7a5bc09021ffd7a73bf7e37afd348abb6f771b02522ff418d10f9fbe18dfcef285b9305359ff0cefcb0c91fde6e1b27cc8b74e2f5976b4ebb0627e275b552b099f59f64bc6cc794cabe697dcc585bb8c7996232574d788daf3df86505fccb653534cb50217b64a53f2f1c17b691e2d12c3a80eba1a20630b7db80134ea7fbf6a83beac3b67d8303266263b305a71f835116bd8f9b37e073b41716da53ae47153f71a6c10aa0875aeb3caf4391ca34af288e3dfb1c9416bececf52e5ad87c296ddc9873dbbfbd2c43ed0bcd3ea068b430911d3bc2241be1c723234dce6402f07bdc8c3b82420d4d9002ea8548600f20c18a27fdbf04ab419c049a04eca20a3c99032691ea789c583d773c7c3bb6e92fb9e22b7c67619e8c581647d0f4a744474cb013b05b3746547e0d6925561686800d6f68a1082c5a6209cde0aba86d4808980231b00fa6b6135d69394d7921299e85dfaa8555259048f24bd435a0b0bbb837bfbab33492f609fde61ae1ff03881c4ce42701e3b996ba66d01fc0dbdecf272283a89f7ab49c65036b73f787837e1b126987d3fbbb029d9f018827dc1303d8a630da5de97e7ffbde07d295d717227c5b6a46912d4f9abb7b2caf17b78a72d377db750cd227a70455d8ac3b6b57f124cc34581ec75cd480d0548585d4423bf716af1965e721b121aa2d7cb9f519183b11a03d2029c6fb4ac6aef9cd94a115693c23a1c8f89914ecda477abf9b9404a82a747313a446017eb9506e9873a948ea27af8b40ba40f71ad5c6b6c9465c93f977478c2e0f905d717728ff195347888d1fdf0ad070040e27c3a16f4f8612edeab73b6e43bc3f46c12f491391e708223c677f5b0048eb3b844f31ed46ef60e8e3689fc1f947a4c2db799d6e86846ff4b080ce221091d0579f87e3c34e3f6c2e3307376bdf472ef76f09c07bfd73c42554de7ba281af0a5d138dc8c13f0e7cd935bcdf91a57597cb5f119cc31c960b25c9c2c7f9f9476359be88d8fa7ba66d5bbafbf09a23e3b8072a37a8f33a6bdcb55f5fa7e790c838aa9877c5fee23f4988e1b2cd6bcb631ffb437b8df73cd92f1bc4856a9755ef66aed6c0f78311d16f9d4db1837cc3664e0648a2b2aa92fd0912864130997614decc409615c68ea836327ebdc853daabddec1d274a2cfc05f4926fe96cc46eb38e9348ed88225942fd6d9ef2408ab928f1edc29b7cc37d61589625c26c4f0b946e7b000cbe3d5933435fba1fb4ef1832253743c693853e0fd632aebfa8f21cfb70cd370e9a6f98768ac0d1fb14837e4e9701e4299844258b094689c5fef4d5f43cb96c0db998b04091ae8985af012fbcaee0b3a7650a0866585af7be4649c8202712d3cc9cb09be6bafb6873f5a8895908fbdd5d7a01f407c9d8c2e6865dd906f503b950fec21d04d097d117dd26926bb4fbbd5052a25e878d58366dcfb220d5f9439657b6836a75bce256f74fb1dd6d793b3e9684d1ffa6c67da7decb2f12bef96fd2d20e28c528eda495a407ac0b75736cfb421f9db9e369d2c4c537c510b7b1bddec5329fc8dfb0156c0dcac01bc34e117855c7fbd243abb1efa698e99561d9c5114f6d3aa3a530fdd0c9c1d1b7085c6780962cec216fcd6d578e60055b4025b30b548904faa6e5ad0b877143f29d9e5f3a5f4f655519439eb79f9b595654f6db8a25b526383267708b7b6e623495d933be33e5fde3875007bd2552690308b3e1911d058711158730b04347fca05ccdafeb079a66c2a6754c45244ec7639db425323096fe5ab03fe2354500c5fe30610832696f489790c3ab4c15ce6b03eb0d18a02b91d6d306c6096b4ce74c2156d50db8709b9e30474faefc0684f98b88ac4e565ce4de1cc9d3c37c6fd5d8798a7b41268ce55f3b254f9093ad6edbae41648be12cb7d17ef43931219bd9f4b86ba9234ee654fdf378ace32bf5672d46f9d42c95dd9474a595865c74ce56dd7d6f95690c10908e580c1313a871cc75c130ca539f28161b60e2e295368d2dd80ead1fa84942287fbf65e4573769f316144e60ff6600e03f8eb453fd952145b62584389d66d78f791a8de3e41b520f6a9eba13d59a6f8b1f194d486cbbf42b62ea7294465197c8a101b6e2db05107774f36c7c7524469dff2e841afd9c9bead0338fc902998eead56293616b20e0e353fd5a2fcffdb00ca58ccebb9a75812627d511a217d3a3bf0a86dd5bcc23a0b4dfb887e01d87e05e8721c2ead650131d37d5566d41bc1ec016ea8a78187ae0b9fdfeab903cdddff2dbe4cff33094b02591ae20bb35caefc570380b8586ffbce98803ef372ff5a2357212513f482c7e516504c355fdf296c60022bd9af2eb4624d0bfd4dcd74db66090cd001fdc10e0e26fdf98bea58890e0df8107bf31d3a96ccf6bb126009e9c93feda0ac8986e4c2b966d663a998d7be2d19026ba4841054a315b7adf1762199ed85751ab3aaabc5d1150de52519ad89d3f551ff1c65c3283682950c121efa83a2b0deaa7f362b74aa6bcea9d608b9b36260711237b3ff253a7289b2eee3d8e8ca3e2fe45c145988c95cac22f52d290bf7c8a4662623c144cf3504a7091d97872ac0b6905a9eb67708a2a64568c04a558b8cca5a955899ce8e07f5f59acb4fefcf727e033e5c231d18fbc487d56ed1c38b2065d5eb1dada61d54ff56d567c28c36fa247896f90e4f97c5ea99f815d4f57eb8d723faa467d526cb837c7dcba59a5fdd9a5544c27b72341d2c519d2ef9e4b2795fde1bd368a371e948f6809910623aa8b89a009ed0853990c0e2f7fec9f70575a7a0417ee0077c170b174965844bd101961cb44db1c2ce5de2e9e33337c945304eb861d26bcd9c2d2f9640f25a19ca20789cf41d9d82bda2b40e79d72fd6cfefb45ea002de6a6d7cf42b4e898b5f9edbf19341e078ac725a1141dd0ec993435e4f07da0d6970b44ebd38b9e2e4efa2226d0e56414df6ce8e45eacf792b8f519a623dd7a70dde741e784ce854935a0c0a0135ff02ed414b9538027068c46ce51dfc4adaf3a2923ecc6d93aaf8144394319afdbd38ee2ba4b3ca7c1bbb4282cdefac2a91cb7b04aaf1e44cfb2849b2b3df3aa5fc3ed896f03e7040f2c9dd1bd343c071e99b9de4750fce2b366c7ca8b3706d77c72311674be44bff52e356a49999e7bbb53f05748e8a241c0cfec5e1b1908561eb873400fbf2b3c0af8c993fc4c09b31d77f08c431f3d6390249f9a03043180e75c69a182fb776dc00e3312c3adb6a7be4e8972f9d1282f41577a7d034405abf4466ab1ec1a806828795033d45c565d37b8c0de83c9045d81f8afbc69e7a4b684b7d639c62435a65c3da134fe995cede73c1588772cb709be01c1d6252ba2824f60062c3a9efcd60ac95c0608b567483bc8073b539323781ec30b2c958892378680d5506a02036d2dd49ebeca7d261bb9bc1b8e3f91a602b938c3aac5794bc531a8528b0bd17c32fb674ea5439b9d0a6dcbbdf9db44b87196be5a2dcf1a2ca8bc5e646265738bd48f950c9b3777f017cd836e32686f45dd1cb0d663b65ef3f59e2656016bcbe1477d15e04b5db5b820deedfdc65a1430b5370b1d6febe770353dec556b4e2486752c98ee85f8bec880408d7119d1b437a08e5da9fce2298e04f8ee7f3b749a868163e553d31b811471d77f2aa08a902f96eaffae974db1c131279645838470647d60501459962b4dc9ea9811decef2bf66a9937fd2d3798851a923d854cc4cfe1fef3522ffb26dfa610e5ed93cb35b304ebd42d4b379d12d0333aed7a7233fc412785c610cb93be73a3877fc72bf3493b3239bc402b9714a8eacad65c8f2417ec59722b6abaf7004503662b4bd8c0d223c6ceeb7769948b553b2ea023ff15289066004057fc0f7ba1be0f686a8fb1d87e19465e5b6c9ceb30a741dace7fb3e40c39e0db200c877b7987e6140c6e046b0fd3956153c33a4558b75e728b03f4f1ab29113a11c2ad72f2b6c318bde3166ff7041eeb5d188cf6b787de49954d337794f0dacbd2f216d9953094ecde23ff71b343f3f642ca7f85ad172aabb1f253850e171108934baa4c30e7e08d083d549f7f2d6f9fe458f72947bf7014743798fc020c59a67a9ba00e56a5cb2c52289c5a3ef2908d1cab8c782b8715785142621d2199f599fdcb025300cf4456297dc9221de3af322c01f2ed6798ad12f62ded822e2adbddbcfdc9c138a72ac8cc9997d079043cd80d23f45c2b72d42a3cb13fdec990f675269ccc9038b394ce736eb926f2af255ab556bedf2d5f54e48dc0775e54c8e13a56cd72a02accfcdbb988f6a9792439100ab0fdac8f50a61f901ec43cfa2e6a55ccec5287d7bfb0b3d76812e1cf877185f82461a6e48cd190bc7e3cfb44efa5e593f132f1468ff7e0cc236c35c2c81837b8d9e9cdeadea34736081edf35af77b7ded139d0f9665726e39993d3bd7268075389580033c7d291f1de33be53e033109820427141495ba3315b854f814e492ffaf95b827db58891d31b02105e7e0d8db7cab63218655829800324af354372be1dc04ca359d3b8908360f5806d4da8f86172da7a366f7e2934b1e166d3642ab779018684ce1511d0aa3278f2260cb78936c3bb228639c6ab84d038867a3441d070c0b9ca525a8ffe112ba48a125960efbdd8bb07db48bafad43a7f12fd814bb8c3d6124077b316aeeafb6963b710079dc367a4a60fbe54f29975ce78fba94fd9fa249a6f603b1ed57d5ebcf1468c383d08e94ba98f2f6e303fd2280b82947938c3242b23710fe9b944a0c437806974ccdf7ff01785b95006258406affd5437df789da70dae49ebc58ce80ecaf73649fd9793a4735bd20d26add2a49579b644f82f1ed8e70d32495cdc30584d3a03b7c698ae27a0056c30dff888ba135178aaba241085e2bf31b4bbcf4e53bfe4dcc1d5da234f51a6798ad6599fcb341a7f6b11fb4e353d8cb3b9e5febbc6107b090d19a2681cf7f45d4ea560dfea7f723ab4d4b2869b654321720bbd59798c20477b352145dbafcb901d7ea65ba3a936763b0440ff708531ca93e0c0b195f2bd8027b5746edc0d1f4a8466d64afc01330baa1a1f17e09d5e8b62bc413452524cea5cc1cc1f3cfc90823df5a8111666b50f2b1007871fb284e86e267460930ed5d38bc96afde1b3ee2830a05aa55e78cd7b02042ad8f95fa70b273a27bd496c310d9a9605c81a9236d11a51aeed4ba8a964237796133f8f1f40f3001e2b53bdb73bed87ba01d3251b401bacdf397aa5e91d52a603184709d5f89dfc38d938a6a9e8b0632d03d9c52e9aea221425d973bfea6fedfe29d5eac76a4a37d9217e02b0c4ed730b0b5a778cb5ee22b7780a7fcd05f70d76fb8471d67e4bf3ad18c3791efa87be879ade453881a6944ef9ea9fae22c4a45710fcf8b01237b297589636da181b0509c1c5dd3a17340461c83693c7c8f2072bbb283dfca95af4373d6bf316efb6ee3fa023ecf05264c592851eee9c1053bba506c13c30c588063242feb34a79f18c4d243fce0a0344dcc97cb5a9fba6a10179aa858f6641df50279f7c8c6449e6e346374885ca70e285ea35a6ad973e2c7cf0757d86054262d84d92380cffbd28baa9ea96d34ad5be6d70fddd27b9cc1c5d9daa8a3e4d1fa7d62bdc201c62d028e58d7e07614330cc9f07e4572bbdf353c5a8840647a2d7fac10559e5724199af12fb899a79c7b81c9e75bdf80426362643ea4208400a1c8841477f8491b142d8e5efd60286f1b32f5aa969fc8e015f83b632c1f75a51231597ac532771b97f88b038d998f76a8da41f111d9470522ea56f3e43d7108464d53d04f032afda8e78df5112a2aaba20702a9fe9cbbe96843fcda11f127adfe04d44c3ef49a22a394d0e929894d70740676bc7def72605cbd4d52a5fe530b348443e0e1c920cb22b402b6d4b6e349faf15572eb6db2464fe9c29574bcaa03d5c5cc5ae0cf58808374fd67dee9ed4ad3c5d286b81b76a03f4c61524af2579c36186b232d99c39b25ee077cdb55fe4841ee2c346f03209754b48db237f83bb94eb8ebcaf415666d95918c362dae823dc28b513acce1908fb98adae83fe5803fbbd9f32fe6c4103bb5454d96c276767bd9477b6561a3876cbbd9edd138f8b436afb2197298c63da6ed7b6b899d9b155677afbf8ae28810ee5b3db0acd17d07440ff27d886d2af09905ee3b28099b33b91a34221543e764e912e5931d36af7205b954b3e0d5c5a48ff46169b88cfae129d6c2f3ce72e9315ad809ecb283a46307224fe059c338c47ead6127d478f27b97b4e4039415c13b0e595f70979a900f204fda16bfd920b2ca47a8e6d9a8a7d2b9564f02d7ae258e70067f8802a121b231f28d2b67ce7a74d2fbbd923c8f4c065b323944497326014f29eaaf0bb8f2f05195dd2ae294033dda09775c9951eeff5523dd9952edcca5c912c0cd122c95ccdea47e1845734cdbbeb1a1a1acb722edc6ef594e3e387000b728a93a5829ebbd870344d3b0db439954bc24e7bac7c03b5b77661ad27306339a0cbce98cd9488c5ddbe4f0f5e1f9c62788228c56873924dc4a591fcae3d9367d7baa1bed1cb8bf171c48c3f0478bf99ed0ccc465ffca2d20f58932eb150b8af1c2a641348484871246536e5429e2e4a5ee5e5077b551684c0c8b30be68fd2331d7e7 # # Params = SHAKE256_W16_H20 # Msg = # PrivateKey = 0c00000ccb3d052e7469df40eb34dc2e168d4a475f9c8c74290eba1027fa06e51651541f1a785f946f8814fc03c3b7a8c5768fce5765b07e88dcb87032deecd2427597a7c8bd7c9f265da396a752c9ad95fed5406002db54e13ab0712d236a901a7e51a4f39ba335597ecd4a6230636a9199eb750b58c6898ccda9c92a25d98c5f9ece00000000000002fed0e50bb9360f841b7d7f1453d0c31142501fe08bf8899851aa0370a29d5b5589f505b7d1d1acebfe5a800a5bdda8172433b5ed25f81e8efb7b162ebdd60986bd2f1dd44d045b66a7872e90e6109ddffe0e98dd15d25f99e948c522748fcd23734987d3be62e383e416b44cc352c08c6e26e65cdef46d55f1caacc0c7ff493de3da # Signature = 000000000002fed0dce9bf7c5939707fe23d157338ff42898e0b284cf0bda5ce0fc9f32a74dc8f2a690ef1027d449cbb85901f922aa71c79b897da00ec227120ce6b40e9d05f4ed0febc37f95e5156ed1c2555f8b75daff7caf87a90bfc9953dd8eac8610be473afcbc5e42a14dbb6f7e1cf2edfb50b2b2bd617c4291cad0ce03268ed14a19ded4272ea4db5a0915086bc95a14a8074689e9742a3e3a5c101c32ec78a2ba7438eafe8e0b3907987e57c1916e736236741e3adf2606d6ef4868e741b966ca84c95761504bd0145de589bb8471609d0cc04e2f95ed79719a0597ad302043815f0b302c372d651875363ee502703b500f0fca8e1b64ab85349fa2726746593917ae0bea7e017932e5936695c944c8e913b3ac11f59319b084ece00c386c5f0429c47fbd8937c70d6b1b0af618811fb4fa5158e2be6266ad0ddf8eee1cf5527943363d47302ecf15ef0d5fa7874feda68d33d1afc30bb574ca97a603dba43aa6a0dd79859da1afe75795bfe13708da8de7b98637e0b35c2e9b2d43a3b4fe739bbd15e24c0be1e638f16945469bad8dcd6df4aba48e78d6cd23fdedb09a05fad5a6e45c3cc47897f86243cce5beb7db9cf99c156d371657fc15eb48d320bc78515f55bf8e38b9d71b09dfa6958edae7951cd1ac28f46d7166e289cfe6571f03ec0f83d999d26a2d4099279c9855d71992fda2cb6f0867883abf465a2fb3e592a34377e204aded50cbd3a96331c0638b7c76e02b86491c70c9ebddc40e0ad4309c2246f872afbcc0a32f77b0d241e282025f68c8113a8320aede3e74e144d2683b0ab8bd384e8e019e3fd3b76a374cecdac3417b8a2d52941984cd45550b0829f041e78cce000b7e2ae8c0d8e1811d7c2575c70306cb1ecea3b4312a6d716636e800e75ab8bf76aa7f7dc14cb64af2dd043a18ba938eda609db9978c53278d59f3d7d143eed9b38176e97e1eb74b22f64a3f99864ff9c0a9a0109ed2bd753766254f2339a6b1dfa100b76bca2ce7de085956583906d84dfb50e50d06625df224ceb3e7aaf3aa7b3c7c18e0c6f0efabd56c4707b344061f93c8656c34ea38da8b298aac9c2e9b6b87cb0fbc3bddf8de2687d94f17e09a491c7e469dc390cfb8bb4d362d1b84dd36476167b5836cb128d4294aae456d00919b9790c39b7981cc9e108fa2e528f467f9797ca167e8925ca2833cd46b47ce24f930718d166fb931a05961d879c4e7e3e5b88449444b5ea465c887eb89520ab592697dd60a58c2d35612f0fb10d4436feb861b4bfa194ddcbf227504fd7db971dc80419badef7eccb7b8112e97d40206295d1dc88939ba557241635843eff8fe098617855b2e8e23a98b61732e56f3bce8969f5b35838a5e2c7442fefa27920431fef177c312855bbbf16cd9da3a53bb0da99773a961c7c1509bb4ed01b0e6d4dac7d2af1a3c441c12720ca100b6aa5d0d2a3744587eb50b3a78c38797b80a21bd3906264a3bd34a97c5260ad97605e663dac55cbcd3d64403ebec321e14a6f5d8348a296a68e8b08aacff0e09a60e8861b8f1e6df2d21215b9624571b6538505bdbc893dc01fca013e8f76d8408dc005571726c5b4f2519af6a47ae18ee02036f075b3e88d84e2176bb6cc88f6e306c9004eca6ea0cceac1abe77c1d49e66e599f89560f00d38f5c602035bd4c42225923a36d903f007141b1bc906cff6dab8306689e50e9d27420173f11868bf535e38844ef263ca9cbe97c659b44427f144e4dcef1cfe874d5a3bc346393b5f98a63a4164780eee42e3ea965a278be81b817500a4b1c9bfff3d772bcf2c010b16c4ad66a345434af621f488e68dd859d2826baaf5f3d36c49d5649eeb2386c6ba70cc97e4b5cd9f19e37ae81f6f7ecde08731bd4c89fb219822302d739747c6f313e4bf99fefad97661b9006907f6efd1971d39f061600370630faa53e19a7f2fda402787da7561fbd06cb2403495f751f1b69594f063a2661c4d664f6fd664e2e97ab314b4420d6f3d6fd3603a57b11cb8eddaf52b4be09f895ff462e088bd451c284738d7f3c88a064cf660d0ea278f7753939edf30e521ebc709c01fad53fc93a6d94a10b2c22e5b7c9002844fe08eac67848b347e1d9df0f856bc9a01263ade9c7ac35f68a0e3dc241bc14df34969d510468e5241ae16ab12824286f1d36a87653330e060612528097302940b3819e7075c890af0e6b16ab91784bcdf5761c36b0c2e1f7082ec16b5151468446e253693d46d89b1a341c9ed7e282a89a3f589ab2a420369622bd26fb38fc216073f4b4893108fa85736ccfa4fb735da69f6d951487f651344740d4d607c7243651ca034f30731dbf20025f4833f1c3100aba0921fc627aedb2c1ea6c61861c20ac2ffe1aedc72038e11868de9ac3793f336e9f0795e0b2521520eb17e9d84e1a78c7f8923b4e1dd4e3b103663ff9ab283ef704e82fa1c827b58646fcaeaf0b015cd521f9dd4f96a39600f27de997f53e7e74e7d3c990e246916efc00bf325aa59a0e0ccfb328f3e846ee0c71c3c900041a2ee967c7b7c5a0203695d8069cc193c7e1020d1029db8ca2ede1772015a8da368a5b5135cfc2d2da9a13dc29344c7c808e7cc8f38871dddb8bd5a1f218f3aad6fe499f383914c2126732a1f23f390a79f2e6a84c9ec9ccbcb01f014c9f0e11791ef6be79b8fa8472027677a0ce5e9d0fdb6f928f94c1c18ebf71e7c20c953419ee9b8ac4d2e6d376491ab372f61b0e6f2cd7548d81cca0854a5243f0d23a29ae4cd5abc1cf42f788b9ffaaa427b6886c23fa107bbb8bb9e51fa0705fbb69c98aac98b2066c312ea26e17f8e127f45a2dabe569a6582afa1a040d8d2509c1c4f8d6f37c00a936fb3f0838387f2c0d849dce74de474de5553018c8d9c6781954c14e52826db8a4cde9a6ccffbbb7436d7ac7e78d36ef9747edd9587f308cd4fa4accb0d25f7ec916b4d49b29da1a8864bf9f491e2ba36ea7a45e878b58545a7b0e1ab5308075d799fbfa991c4acfe869ef4ff2fbb00ac8a6b028d19afca281824f4fdb0105afe428603f5a4999e79e599503588709f166c11f56c32aa36e47305325c528436102eef8c67e57b2f9799531994f7eec7a7355d24bba4c2411dae4a3220b07603c7e62fbe248f4897cc484da41f6e833ac6501bff9b94499c0b883071ae0751661d832cf543f333924aebdd9ead479a7cab76b8a27e14248c8afdf353f0371e65e95626cf20e30e313148fd9fb3af4a04c2a17bec809e8b6e56a979053cae30a70e9b5d1ec2b4094e9024deea20bab5ddf328663edf776de75161d2c24e992436b2a324a4d956e9d613cf34141217ceb2851ef1be8adab8160b9bcfe28a06a42d1403c4eea1643950d7eda8284f4973a355c0c2247d4a0280ae72efcc6410ab286b29e7f7136f14fc17486c27320eead362de3d3114042be587c9f428d82fa66ecfafde9a1ed33498759b206ade9f106545c191ef1086524a9617b371f38068f5235f42e8debf4262626999574a92f0e55f18c9e84fa16820cd8cd48c638d4775c050bf9d95ea41b0c07ed4703d4bc33520b9d6a8cc42b5cd9c1400cb07c958b5aae2d76f8ab64ffe19e21829f41c6c71a9bf6a5245b7a96577a785488446ba8f0a66a80ae2ae8a0e63594a72873e9ce4b00f4bf8196ab01cfef7560673b1c591cc2c64cfb1fbc083ee10845e281ad83c9fbe0633cfe39c4923232ffcacc874b5fb3d75ea42671f290ad019a0964808a03b5938d96cbbd505b6a0aeb04bf507ee3894a251dd4aec430834a2eb4b589fc986a3439845157fda93b2d8314c5bb18747372a48af77cff171aa4df60c603b7fe0f6992f7c91ab518f1c26b661757f9126deaeb68316b3e4de097d42c592cdf79c69f247db55e909d0280f59ef0153c4255dbb51eff4fb2f722c7415858c21c4309c54df8cc09abcdfface5cd27aead79c46167f814907eb1c853e9c9905a7a7b99a69eda03863c8e2f2c71507dbbb69584d51b72b668dc57ad5983e8795ead0cfa2ca16c9b037a07f079d09739a2a86d59a786156cf8e2341964899dcce4535322b2f817c7a304aab41fd27c834ecc6835a3dd21d024e7345339875bd3d396cc09cfa7e413fff97afb40c119ffe546026821fc0b217b78793f722bbecd2134f560597a114ad004a8366245e081d649b37b27c621f0c03e66ceb80727683bd479a8c672b514c63d89a7028961a12520b084d091712c1e14672a9e61fc93874aaf36de54b30c3cb42a30df7df4d213afa30e89f773d434ef2d9f4b5fc613058c82bf3c51c5b7bea14198a27cd4ea18d0f8c1453fbe55e7eaa3e15965cba696ca92368041bdb95296975cc4e2e2844358fe20e513a3357363330854f2b3904d9492abc4f9717496d711dca06e55c9ff1c543613e445a503d126fa029bdbc947a753e8c4c83f24a6005f21e92600de2b052e5d9d0cb5958e28fdb2b36aabdccf5aea93f3377849029b9061b3f4bedfca39953f49d61501e2f7af0477662fb94b3788d0e92f590c9db89e73bb1d580685c2228094f48877699f40816e611d816226a7926d3c4f9e0d077c2b3fb4dd676d81f0e3e6148440d6b5b07bce94392f4ae526fa9b7405e34a517945be84d1baea0986007e9e74bd60d07765ca33220ead79beabb629446181cff9065f1ee76286c3b11dde05211492151c6495196f69ac2d6b59b85a5d8e11e5cf911f4d25cccef2d2dd9faa276f51faf30512821c23e36eb89652b7de94d1b544aa972273d74d074ad153b1ff903907920012fbdfd071cd1ac47b95b51bfa928484cbdf6e7dbfe0127ce50ace7b96388a12a7503f8cb3100de6aabeb2a5382a6f7470b1fe38010094ed7ba98ab39f5ffdbd168ecebad25f086726197aad1a25f4cb715e016a8c9ba151fb4e877ccc1bd82bfc9576fcc98149239ccbb64188c80689f21c780fa67c3b43ee52e6569eb38821c7cdc2743979c592cf58550a9d2ca91845cfa46c36ede131801cb3ec87525cb278faa5ef742557d5d83ba9dfcd7ff561edf9ba9c827362949d45af1c342b918809d181cccc5f51f11173bb89fac444e066575d076b38ed374ff572f4576639ee1617b0bb0804709ab50602eed0dc5eb7b71019926441a84bf7794d9cf58807b6253b7f8ac36768b5cf675a69250ab44978260c4f33c6ef5c9747e74647704cd504df9b5126c5316ea1e7440d7693ff7bd4104cebb02dcddae6503650275cd6d6637ba6ed31a99b8bb827cbd20152d93a09cd532c614e894af94337546944f028fc9fc169432ac209b66b541a5f03091e3576f7d106df88fda20fbbc6e430473ed84b486740e0163022c453dcf93f49195dee29c81ea0d0a857807f495c42b6fc3e65cf39e36107cf84cbe4c2a5996934c371adbb6c97603a70e7882991036e3fa28fe6401b2685628e783ecb363233985435f539dadc56d2bf92745338fab070f7e03a40959eeb18f9fe93bdca7d01f8241f1a152ad4bee2c1391a596a80fad6b35f7ba2150521d0c43b9ee5e64ccd59d923b6e10c4d47d70830693765b2b1fa8e2ce371a82f6312d99efb837a935b520436dea4c217c00f9e0225c72d5d3806bb5d5cce539d9dd7d983cabdef2b96ee76cc6486b47b3629bc07e095eba9b73c8cf4681e676b9bbff8455904c49e54e6ca50e60296598b1304932dec4d5b45f182a5b8c7ef644f6a8cea8177f2562047db93f87b6c46dc3b15a2036d35a1118120c70b3853b57d02a143d103a141fab43a5068513526eb5ccd5498723e16fd96e14719092f74565d72159075ec2dcd6ef68da380b5a25cdb3535c92aa254a3a4fe184f9ae553377f5b81ad55c3360f42191b6f5824de73e5d0707650fa637fe5079bf0e603e8dd1b8a8fa230485b001018c232be46cce2396dd77b61c5dfdd2734867867a95cb4f96bce2c2d0be3e6d4ffc77bf03211d9b4e8c4898863c87bc36d3739cb033cc798ee68cfed13e6acf490757bef1cbefe79359cc9a438ec05ff5af76fe55d7c526948f5a40548ff77bce1a7724f16dabc98e93fe11578cfbbb7dbf98c408d2d7f12d5a5aede983f4c820add4644ea8aeb6f9f3215a54da092b9043e2e99dc8a830b90bdefee24dbd5ed213ec66c36ba7c8ac9cd4125e48f6d110c36ffea1999b22a7b0424106b164a313c048d2333ef89737a6e2cfd9029178fc4dd7d4ed8fe9a8c1bfe69f5e3b307ba0c50ae0b8de97b5638c8a3449ae087825f1d3bae025b2b441c7952a2d42df3282451cc26d88e224aef7cfda0e816e6c38bdacbc328394b75363b72fa749c8c0e0b28136453a9cd6812bba967381b8cc6e9b28d51ffc4f4795e14d37822fd97355a11019678a5b96cc2e99902b4d75568fe69ae4808d77be5a77f18351a4d2eee52749ca3ecee5ff28fd57c5786a641b0e25689bee1b902394d353a1a9e324c839b5c9eef606cae5ed14d41361bb94efb51fef11659f23b2fb7114b4e38e5c55ff99cf4d00a315a8528cacba16084bc381415bdcf87590a986cac6a04af50e5e7de098dca9b12cebedca671e82907807e23a67c25488f85b4b58275ff5f0e084f3582ce7f780cf699d5273efb41fc67ef7778621c0c6d0635c3d1ccc266a5a0b5ac5e212741e3ad9aedc4246a875eac0dce620f8a04d34e1841eede4ef9fc7b2e25790c6a120910384d5f7491b22492ac8e09676128b600e1eade226d7a09f76f856c327bb9ace4f297868cb2311f916ed8b9ce53be53919b1ace81558a24c0b86465085b7f220ed3a4a6943e97547848074ef71258f307e7e2909e65fd960cda337cc2cf7df453002bc78a9e58ef1b5fe05082b8a7c0ecbde8ac8488f7063a2300f0f428e5cc57fdbc23c869c61e0868c0410cb0044f4cdaeb4cb8794833cddfe1a3d6ad69405687bd3ef3139bc1954cab24aac1bf62aa21ebaf50faa1bb575ec7cd2aa4f4c80c140a2a2cd745c5edf122aa7ce3a88da76c62bc7a1c10145a4263109ed3b41d64e3cd6d1d1b8163f530b9fc2c951adfa0f0ea8dc2d5f42c7c74591b903c47052099871b8305d001aa50738231bf6fbc318511143bd5c3474af25094bb9da0297880a895b5cb189086d03619f32360f35726b70269aed2101aabea0324544f2d355804e46479e338ecc24aea0f749c4c0cf9e5caf849c309a277663d4e818e212d6a6bf1ca5f3ee00615bdf87b4acdefca69ea0357d396ed7eee6285f4da2bea3b2a3fb3d7af8e902d39bf0fdf2f9e90fac836e5c14b3c03329cd9c4b3328b211159c4563759e500ef37b7f67db42e0a89eae6c6742cb0d1b321bf3450a6ec0315fc0f2840283d597dda13b1fa41de78a318e3500c0f892674d06c0472107d513806665eb5a2d622fa2c63bf12ed818716bb2f852b76ce8c20bb9642c850e07c6790056d39abee8351df2c9a5406dd2ba3ae61c2b35ade189303c632d818035fda2a475a80b77ba2fe5d00d925b3a26a03b5850ae5ebe52447674fc86564ae47574422717811dc88259a4dc87d641b9500bccde6c525b44980c3bb3c9d495ec3aae9f83b4c47e502dbb57f014fbff9b4c6cb9a3e748f8f03aaf5bd2ae4d89a55ba5c6935da005e35a56ed5259c8cdf50e77951d667c4adb54eaa4edad61686d14dae806b296fc679e0c0f50a8a561428efbf384a3c20586da296a7c6b4c4a7b3725517995eb8d5dfc6740009a39c946937f0e99002323a70677e127732c270b4ae3d5ca419e74db48a6e0824e31c8175aff89b7a5ce9fcfab49ef58135babbaf36940915e9aff9c2d250386ee7a5069aee6cd8218bae235f310b616ca8be3db970af083a3ce5ff0d86867a49add5737f751c1dbc6e6a74e9c79512f8a801e46cef7a0e6b5a870f0fade3bf50abe56f5ffb01c27fde0af3bbff18f1cceba11f39e3c23428565243e485e52d0e3743536fb9c33b20bfb6d66c0aef169833ebc060606bd44e5602a9b1cf8f5fde3af3097f78438516b3911731f6fa67dcb245ce27970a968b61761b405623e65b121bf52de561951dcf3d4f964d0e7dadadc5c193bd657396effe000daaee49ebcf13d30a630dd8e9a4eaf8abc35b6dddf7692bcbb4d33e4dd98600686367a3b95b2836cd70da8ca10fb0d70a12acbc1550bd072313e5bcca1755d3357965d04efef38ef7313ffd9a34ab35278e44dfa3b74db94b2236aa0e1358fcb6cfb700ccc0119b347c55d53666c88bcb8dcbb710931bf26a6774821ec3e98140f099fecddb79e39b62f4a7937773f673f5b43512390261f79af40e22357817927c52f326a27b1963b300684bf12dad58ef23a8a04633eb8917e165ccb584b3bba00ac229e73acd93626d1fec31aea4cc724127d8743c7349f7637c9594344698bc7fa027a45fce06485cfb67cc153a5756223c1840429447477b048e07fef083a217169df710fbc403b5281a8b7d44f7226c59bf4f371000e8baaec52acfe971c2f588aa61d80a84027fc15a791c0a33ab2a874fa697ba8818c997548d468796a42a5228806d143c54eae14fb138c2c7725522e94f0b6e77a743853d102ff5e731eec5d395942216de5e91582bb8a2c7963e9bcfec37e0903c067363b726685358ef037551700d7612aa79bfdb99c0744bca3255182795de472307dd3a82b643237e8e2ce2ef030f8fc9627c84df0f1bdca9d64a462d2aab55f6bf21c9925bc11ae652246be3a464a5bdc14f2ab600609ea2d49dd7d5707cd84084424d6ea103c9700ab73d5a1199847f8ba7ae0e191c94ef18a48938e27a6c0619f5eb137e39e475322bfb582d2f1d1ae17ae8ac3a1a74e615f3fcd43e9686528d352656e555cfc7c185323d0f81484d406b7edf541142cb7e38c31b02ab47561d13d8ed5be69e671e9df940fbe9bc16f510d4453af4e6ea562b125c74a0621b484f66c7e4185d4cafed42f292a966a6f016753e7de836108b3a519de4ed3eda1488823428260d89d77f6fa40b0ae65b5820ddcd35c640a53f1e60323586d1f5932296b49208674bcac62a6bedfbb9af2a09e38d92af1331cb526a41a4b1a4c10cfc07f04abdcc701cb6ed77d332654f4ef19f8a4040cb3e67a4025328eb94584f4446825c7c913358fe22b8fc02bb30a14776ea6dde16d200157c1fa934441752c59f21652b0d6b3d19728b3fd595fc6466af28dc70cbce92906d419327a03e498abd038627c05028ace3e5dedc76a7742d2d7a1af6c5e41941ea47b2248d3f21a87dff91fce282792fa605ebfdc93d3c08fc4dc570c620abbc55f8c2bbc955706155981dc4aece6e7bf1bb56189e008bc8c92529353fb19dea3134146eb4c9f45a4a8d74aebe245513f56af9a315dc148336c981e8a47287ba3226698f3ebd02f07da22c3f680874fd1912fc837572771f410d3622a9ecae377760b2587fa011771c7f63cb1f5633aad4514fc64964b52be396a98e289185c713757bff637fcbab2abfbecbb1eba2762c429c408e94f8c51ea37d3ea4d74732178d39c83667a6dfc71fb93533f44bbc85d00d766db3fcd8bb83d8432740719c57abeea977c23f63151b5923f59246e08cb484874f6af89d2114b7f3bb86d5435f440a1488f100fcef0b66d32160b5bddd56db6281dd96456b27543b5b3a817583ddcfd5173d21ee6d7ad3fe55cfe8d8985543c503338e7fc6462ee9b3cc1b83233f9fd9454ba127b771743e76650a5b864846ab653ff61a8fa45b11afd7b445daafc9046655de30f5e2e512bad6a157204483a26e897c5d64ccbe886082f5f82c4af39403aec71373fddf92446a881fd4f631e39e069db6c87db36be8060589dca765a5ec1c236cd088e679ecf898d6cce2c6c99570897a6dcab93059023e89c3033a3c2c9d4b680259310884218c848deb8d7795246a58d1bbaa7c69341e1391419295894a007cb1a28db5472195d08a4231ddaaaa935e081c35b42beba308d29500e0ddfada3d50dac51d7db66a0100fa2ff00b381c2ffd3e0ad524f084a405bb11d41f476e9a6ebe1679e3da39ad200ce25826de710ff1b28d4e472a023f6f0025cef3bcdbe1fc00fe0348f352cdc97bba26169507af9604531e9164ed701400fa0fe9c1fee90187d78bc8829a1a0b71a7ee6c4f1f5784777756bc9d7187c148c3b459bff255c768267a978351283b4ec2c71fefa7a97e9865194b85f928f82efbea290ee411d9401bca6814204d6de194abb6d590266b478adbad7ebf7ec69e9dbdd84acb46e357e23de4b7c48cccbbdb1ac68f438ae0ddf2d37f5572e9e2d61f10d35fabddf4b49c08b1e17233da0138bfbb5339e69319b7d6e0a2c192d26aca9d026c56fbdf9b73c525291ea2e3643fab9f803c28a52df280ad7d994ddc0545aed4efac0ba6a84102b32fbf3fe50ddc4b493206027843377ee867577354fbb3e46f33994d7153561d853546c6aa3dcf7669d2801d2d35bc8a3c447b384cb2256dccd29ad4453356d004637825d697160dc0ab05ca4825593e2c48daf2540b9aaf46c30e1ee3ba72449e939d8ef1a741ed197d63535517677cab489e069fadbed5341c16911ce3c9736647d6a13620de01ae908f721f2c4d6d1c23e6970fb4ebd3cf6ceb88fd813725675f310ca5914755753ee923f5338bc8c3e4849c59ca30c4b7e73df218c409a8ed434c1c250f08d525886982b0f71d860309ddbc83deed5c2465ea6607a6619f1e33c98f1f9bf4837e14d8f9d2b0747a6158a14482dd65f130ec5130664952938ba40b40ef3289790c227959708cbe3cea3ac4cd6bca70174558653a665b04e5c4ae167b914f909be16608ba55f36c8726ac92cb8a3fd9e001225f43c16761b1e6e56f9c5be522cd233826745bc03f090e3a453b4fbcc7b4139bbabc917cef6352b92637fc86a6741658d471ff234396f83f3bb0c219de6125c1241a5a88cfb3a1c874b08f6ea003659b2ee14317bb2538b92f4fab18320d7fe03630433e367f6b64aa36744a24ea306b347bde7620151053660bd99ffab338633a0298f19dc0d7ca7cf17def9017e483b32ccde48fd998a34548421ed544919cb610c78639c32135bebaf0853eac825f1efe6dfbca285450a8979fde21fc3cf564f1394a0b2e18937647d1168e938d77e1cd29bd8cf1433c906c280fe61794253a9c363060e173f6dec8848202817bffcc4cbc851a38d9bf66bfe29da1f2cdd44ed64b1a64e0a8989220da18a32ef04fcbafe1a1cf196c2ef233f9c15d5ef3146f9cdb1df4f4f566b75da4308ccb6ba594955e48714e20960a0a8418d8053fc7fadbeabeef9aebe97ad76dea60f867457676b60d2058cd9ea58934d38d823cf3bb3c1dd8e053655c4d8cbab0400bf7e9a5df2c06c9977e2e7f41a3369a353d2dbd8d2da88b17c7a716b11225bc372e848680a7d4e0a70596073b3c9803cd9a6e2e306ce5cc2937674fc2833914fccf3e45fa7e7b331f9307883d112868346bc2192b5dac5323013030bc2ed64d5b93e8ff61263af97deacf4ac00ae2b5962c56386ab9e170ab77fa2f88a2ad9948da1eda5fcb2806ef49e17cf22a97c18c68935b8a9cf0f6d68359c51873bd28f664d935a43eac727323386788a86bf51bc89290825b67da7dd604cc893491456ba3ab1ff6642c5d5ae5c896ec1f8fbc38b3141fb9b76500087abec5d4acad7d5660828524a8de26562ca15b2f3a9edc7246a7abb716a99e4ee67795c595d8c429aafaff7c4df1dc2b891acbb7b3e4ee3c4bf7e8835a23b9ea4c9d918b074d097a07929e5cbe134b9a7bd5121a02e9c01bbe4d153271d29002bbdf35ca0801eeedc315aa8504b86888ac2f381932f6e1c5b5e17823f5193d9cd969d421a6b58065f2cdc494ba281710d94d4f7a101e628e59da66150daa3caae49a3fe3bb0f8d5940e1451b1dcaaa1facfe4f0c9efee9605799b3b4b64aabde442553d5f13ba02d25469c714b3be46f013fad09c80d82298d9ff97e3391ec9fe4faee239cfab9593263821ce85c57183eb65702eebd087e063243d0e6d620c7bb7ec65ca9381b0bebab22d59eae9d3b8068faacf7e82b01e62d1281894f05682a6037d99050064b7ec3dd0d87b97378dde3c4063f9a72db50395d3447dca20bf7c0c4cb28a80a365551b1921e747365ed3cd1609b1c419b9893359085b8cba2262b347563c6de5b10c6cd72070e74a6e25fce35959f1364a97e23c54e2c2971d9ff35f1fdd6d4de95ea004bbf8ea43d256448368158d0d0df7c3b0ddba63079ccdcee5ee49680eed658b9caa2f8d544e3c35f49a99e313b7f9b3fe51530fece44b78ecea0288865d2b04741a913dd6fa137df2d03c34899244795b71776deb91e290eabdeecea92f0dc2ca7126a4a203653f568f03c810b3442684ed3e8797149051c072d0046f2dc8d26d53379eb21c9cd6843d3041ef82e0e1227ad9916874608b9af06ae0fb4f973d07732866fd20d3de8e8a988e2d307542939516abdc507bd6557da69e59825da70b9e90a47581b965f506686febf8b37f3374c17d838fccb38c4d4c970485bfbae7c6879fbbaf2e2a08a6bc08413884b5dd31cba686d8fd1b1218e56d8b07a70f2de06970736b03d830d0435a47d3f425913bedd66a5dd1ff6dc9d8b41123737b6c90578a7da9aa55e171b86855695ba67bc80682e42b1ff9f4ce6921c6769a9b82dd0085cf39fa13422eb69e21da789c18808ef7768fa3096f9deb64fa0c049abecd149062e5f833599dd2513bbcb6cee263b26dbee22ab5ddad8449bd34df0f9327032ecaa20050ea9ae4bb4ab40f4357b579fd5276220119a8ffbe82b6bef10cf7118b5daca399dae84de792d18e749c56b148086ab07c53f71b5fdd335e94915fd5c713d95024d7cc04bfb562765e8e42d0c524503471b3609f20b500a72b7ca050fcdcbca0283b4ee67a9be5dbac761d9bed47238eacb3a3447c604488457f7f7fbcbc164ae80d968c18ea939f098cff3879d8bf6470e1de722b25b1205d473bb0a0da271fd08e67cb9ea9fc6354ea421cb9a510b241293373c2ec7ef33dcdba9737c73d40b374fe752198638425776d25205ff14e6dc8ac9c2bb144efc38ba17aa35a1e2e7388e4fcad7541f2d06afa4a1f1db0a3536a23dc4289e194596881582ec63bfce9bf6c02da124f5d26bb10e7e8d0865c309ae02129560e5cfd112b53e345c343e42f1b67c92ba057e6146b128a6dc546c103864cc16fae2237318f4fc3b05dce04789e0a23848ee539ec1e624265eff32129942ef308739f5623b51805d9f06d0bec29c4ab0f9ec7493e15d20912e4f27060815d30951fa8157239b49ea44adaf9009d4537f9e78451df8b1f623c59a5471d52823c70b0b5c0ec189809476b713adab94b32d6c2f1483c615c9267e1a7b4d0c444493acb9edaa89a07b80f06351e7d70ed4932720f7f4803559b4b515629569d2a8438a0408dd481413567e000403c43f729d481761965974b773769eafd4160785c33991caa33aaac6e743d4d98a1e389c8f5f5649d23c3a9a3f76fc7a874c73cddbfdd3bf80bacca823695fdc54a8465ced3ef1ecff61870379bdc4b76fb615c59afabad20f89e489e5499f95cd5dfdd5c4b19faa55e004a53b73744b0053a26bf82b2f99702e9acc3f86514f3aff1506e93acaaec6c6cfb80f4316d831094ce0e88637b519da7429a849937ac057da25f895f1a0cba2498dd5e444b4b48b190e95b3466e49af3ff67d21a506b3a7356aea011c072455edc38ba2975056b6b2d75834c9bddafecf0f7c5e8bd3c13d7a6ff1793b4a43a923bb9440bbd21e416192834d39e181e7767cf042a81202 # # Params = SHAKE256_W16_H20 # Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 # PrivateKey = 0c00000c08ed4fcb39756b1b23574e91438371d5aea4bd0a8c477839150c0aa256acae45776f6d03167efd384ba4f85d96b7a08dc75fa0ffee21b09f884b9246426a9fbf7a5b7ac777bb9bb91e5b8a62c962f040c148fcd431d0d9ba8f9941bf7e72a04e6e9717fa02db10a94abcb260c45df9874088f7e84f494745b30ae0df1c7205fd000000000002767374e0200977d4765ae140562c49feaedba4f312d7b25249592539ddaa0d2da235d38922314932f22103372ab72b10061a36c2b6a57b26ea6f0a5a98702345d2109c83f7cb52cc7c685156a8fe0010d360b220d9ca61ad30837049a0c05620c891739b85de6c3bcfb10006d740e3932f7253de58f8500bd943f8c2f5da7edd9f60 # Signature = 00000000000276735b16e63b60a8a948cae2535e9eee904b6ebfa32a0ed1927bf17fc6c8927befca38530bf0d6aaddee3f2a73ac90a66d511417beb9c7a2e517ed199d2dbdaa58b7ce4766ca72d82f2ea794397f348312117d36996392da64a73c97711a9989633c18d93477fd21c1831cb23d42284d84780063024a3edbf3bc6efabd5462223d6f8b77be37829b8252a06f741447dfaa29f4bea860931320dff36075e6668c5c785dc1d673e2f7b234173f9c214d79dbc94a2b35fe0d456523f343da4be73b246bef35962d33f7536ab008a8961a76735182913a5862931c513166f8104bc71473991a86a47e8a6bacfc2b3b17a94a9a57ad1d60583653c20c7b46c6f10c698ce5c81f8a7cfb9d5c79f4096777ced453830024126d2146d3e6a78e8a3f67d6ad35668eee32f4ceb6a966962afccad68ecf1288354176dd9bff2e4607127ab0e55101eaf5e52bd0c431d29ed8ff9f4be2e6cffb84e5c812835d336e201604372e478198508ba319b71949c18f05e4b334ce0f0f36907b36b7996ceca70df5bf387b22748a0322f38cb988a3d50831817931af173c619e913177aba8b6f4def9ec04abe36e30daa9ee1ebf699212b3ed9835025bd1ec1f944fa21889f8ee1928324a4096719aab22df2231715ab7d7cbbc5edfefd60e508c33f94b6cf781c029ef6cbc839b04de3d6e873a0b748e46329fc560da1ef1fcea53351bd11c0a3b610e61f71bef213f5ce9ca88d73aea7670ce6f16981aae5d5ed84125116b71bfe7feafc647017201adfeade3cbbef15d08328e2a2ddde09b8470fca282ca4a665349dc2816497e34812de3ee62534cd19de0e17a80b3df762a4b774785c4d07b40ae4b2b27d5a8df57cc9d49deac70c6e23a6bfc2de57587052d7fc65b0a5ff8eee960cc01e7e150a04d76a5006b7e4ca7c91ff6e50ce8fabf53f921c340ef1cd145c529e3c8538038eba971b425858c46a622c9143b45eb76edf61b6c7e65f65d1adf830803eae5af4d4577c7f31384050655c11938b587c084a4ca5671d199f2418b93f85b44a12f43b39a8e2d8c15ab7041ae16dd14d61069ad513b79347a62e5ca7f04992a2caf0413bcd944149db0c370d066b9ccb90b8035468c0269a8db9c7883f5b6c675e093ed7561835add0acbd0b50c901d8b9d075b9024243fd23338c7a3f36d4d5ea43c227b03ac36adbc53715274ac29acf42da1e63bfeebb11b82eeba361803895e09342dea63a0d2ad5d5214212de1728051a561e0bb2d1caea99b6cf03de32b92b882990edff94397fafff6de8639bce60218382e7688659cd95035545378d26ab5765295b3ce2e8c71b32d42d7b71cc7bf032144701661b2a50a9a868e156c83df93fea140444cd1c9152cab3321793719d0bb133e672951588dda5b5964613ea4151de1c9c72bc4568ff618e927efc9b88d6bf580bfe6b23ceb5a5b05cb536075d0f7ccc4fdfe4ed030f4cefbf144562f07aa1b73f4ba07ba11ec9857d560e19cd2556515cf8e9b9a621b61fd91d37a942a47e51f3a510613bfdf7c0124e55d3f14b22c091f6bf374aae95ad42d85ceb80701a5f52c7462f9e9ee2be2c8c51009b0afc8fed2a4fb958b931b4ce9d3bda0cfaa187622841e8ec54c00186e85a7a1780e086d79cd1abec4ea0ebc29de6272fb5414369350c3210f751daee61bf03c57f79ac94b5cc56f15aeab73374e8690309f64b468e3f2bf63a58cd14b961c2c4a06b9b0c0dc1c927e82818c1f0206fa55ac96a3cabdd2e634d3771304137e394badae1cd373f5ec1397cc0eac0840bee9c1f33f2abc13f6d1f933fd3d4c9c8f93c8bb0ce0b8a63489a53ab27e46afee98355de341fba15a214e20d8f462a6d07d847703aeae83555ad6c0eeba0fb75e47866e6a0daa59ae98d276bf4451e90260f42f69af30fe430e4a8703df9f6fd2112adc13836cd454fb72679303cb191ff128457e378e22d8532fa9a39aaede07bcc54cc5cb9459d70041209a9e9faf14b852341842bc8d6f8d9d7f8c1759166364b24b7bcc0ba79a4139bda0ddd892a37a5d829d93337b2c3e6dadaaef491533311a960ea12e9d77cc70b39f0e77bd64b955ef8c6b6a907d40fc7d1912ec579898a81fcf7c4adf21b3fcebccecc39660a06f03d4ee63554fe44cdf90f4373d4560e90bf3cf3dc749a8bfb5540f7a42621ff819369f471e09c916ae3f3d32a2d0895ca9f3f7aba5fe51f019a89d3e9a260cca83e12f3fd9c09762518257d79808528e09d529d60b5147fcec2bbba438cb97ad5a94fbb9ac95c54b2760afe88fd333a903761e9849baea39c38d4b8a2bd7a60feec562b19ab672359386e0be05019da6c38d2a7e0c7b7c763bd61c1fe615d72f6e55be0c906f6348bd606a77877fb601d5fcb9746bdb93a81efc9ead59b494eb3f77e7e76fb54cc755eac6ae417de77e798d091a995ec11b60df9c2e7ae85d2f3ab03d36f34c0d07438a40d45432c7de2c818a63c57f62df7121897efcaea0d6f6500b03bcc9c7a18d6a0507b3dafd2c8fcb96f02aefdc32b2c49e72c4466ede0d11a805736616eb04bccd4c56659e8332accaffc8b12df2647df4ab3830c0f4a11d7a0d8d73b0aba218477446ee730fb615fea63e91ef0e45d38ac26179de4d64a68fda2a5226be14094ee9eb64406cd50f5d4fbcefcd14a61bfc95240a56b664312ba3f1129ce8ac0ce0026312cd271c9d427f37493e4fca278ad2dd7cefc96460c1a0dfbf341c1053ad66e6ee83388e7606254a81c95c616be4bccfd397af5f8024489a94c1ec56088eb9c63a115b15f0c44e9fa5cac9c8b83d81005ffdcb9452facb7f026a6f52141b546f6b1f6611ea85ab08560c05fe62e3a0ae100f13b144d2542b93067409622dba48291137639678b9516e483ce53559ca97f25670e105bbb7c16ab295b829b047fd1d0ba1025294c85ada7d10ab330b4729f0bb57dcbf4ab7b97a61873947ce2b7bb4999116658b9bea3e8a7513588c5e09b6b26a13880ee6c7f7daef629d9267fbd78115821e7eeaf1d5d7100a343619715180e85b1464c2b7abcd8ae2871aabc6876ac2fd20d41784a0db725251d5644b13fb83c4d7e5119cbda3675021eabe8720be284726ee54acde4eab45495f7b054a8689742475c1dbcfa8651e929f4f23e017a6934110a6e219f8c0c1873eb317a32a8cb39a5644372008b3f0e14f72e8ac797343837eee50281c25ca9859722a6cf5df92e1ef37b9e9f115a79e7b5b1daf142eb65c5085aaa8669622aed619b8fa56736762eb46a0f32c3df3659cbea57a867c31c3dc942712aba6a05a1a4ac5bf03be0555cd4698a5d94814ac585150e8d2d5f137e0c4d99729061c4ad8e7fadc48281d66f56e90ceb059c1dcfe7ca9379446dc5bcb1f57b6d129fefb8b6b6af239618c1cf19425eb91a653857093ad0e651b039e0a3c912e2118fb4ccf96f5a78d6eeb6b3143fc37158723e134a5d966e50ffa7b847a244dcaf20796eb572516c2b455ff1af25ad3b85225168d4fa990162c691fe394da5724e56f4334592c4420a1bf6246a44b7756072b5828ae39c0f92383be6dc57ea17e2cd6a436f66d7c66a1310aef3b20c9b187ae42956db69c7c34a11d72a11e72dd58b2fe85e690f4d5b42dfc935fad7452c6fc54560b0673c00b1aa529d259ea5d0b495fcda36469ee99529dccaa286cfe3933144eea10a531e08459fc3cb20b97826cce0ca633d1d1d7dac634fd0bdd5f72db0e134c3b181c1638d12194b636edc9d783a7c6815c1fa7e0746fcdc32bbf023059be4298a462907c7966908dc5e7b819ee75352dff9b749800261bfcb381039413fb98ba4ab718b42db3e331451f3974c581c160e414c6c0e73809e24ac24d64a53360e5493964ecc26df02d7ae24509e72580b3191c5438455b21908781dd1c748b8860eb4a614ac5b679fc5690307d16079ef9fbefef359b495d31c89c2d97036a00575452db70427022c8956028ae172b09f391e26819efa8f4d1157314c182aa8ff24e1784b0b6199209239e6dfd32d886fd4446231b386e17831a1a0e5cb411afc924838fa87cd4115b1e16dcce6bbef1e4c5474d31845026659b1991e863feb1f8e065777bf2dc5c09c4ed9dbc7ad35c24da7c8878e7c84321b012b6b9301fd4f9f1e7cdeaecc859e3031a5751eea165e5c591b9cef68ccabe8f387bf4b45203a7526afaf90de78442f256528ce388d0bd5ca18ccbea526d9087220f3a8dcdf0a3f0c8288babace9d6a2e5ff79b196e821e61e943e24c75efc44e8f18534567ef126eb66350b820c1284ae7843503f8d39cb5ba1167ae6ef59700131ccd535f09ac1b9fbb7922bf3439ad6c43e346032f88a1eeec3a007d342a6debee379428b527d55d4fa507fce1b240c1cceff3a1a10f75eebe68d2c8f71251d3e2a4d8e12397a5058f24c641477bfd4f390a6e2d4f71d732e0e0ddf2bcde4760dc7b65a8d1916767661a32f7f3b7115891a91fda4af08c1fb7a01e488ac658400efa1750f950213917f93cf4ff15a5a24230b2ff6086939741af3841b8ac14e996698d3739712b73a50b27144db47c468c1111721e16bc57904e3eef77e48644ed06fd997faba9a8082d467bfbba37c74206e7d38984c0a05e2eb0ba0172b87ac47a152f8514684b538de88870b2465428c299e582a7f8f1caa727419db194def4687e874818a10c898d9ac58cdcd9779d83d14ba01b94ad965ae0734ac2fb7209b20d74eb45aa1646e98684a0334692ccefb061cd547d79f56e07a6e0a202e810a7762653419bed58a1af3d31843e21e8025be7d9c4c4b5fbd98a8512462734d4fe8ca75ec2094e4838422d07efaee91ab13b56f7baa7933f7f3a08bc3a3ce4e64b2c44d51096267120ccc15a472050967586ba4a3382ba6f531fdd03f665630ac4f5e0f8c08d2c572a1b2da9f70e607bb93db608f340fe393363dbbc74c0599be9085436f9b9525ca67fdab71f8eac2ba7839f804e123978e511f70954102fbdd74cd323e669b85ec37f5bbc327ec588cf787e6eb3ebeaa6a07e25c0512d6cfba26a491b92b1c2c95335a53501bc59c8d54e1c2c63b17ab490e0da471bdf214799317c735b1d91f13cacb07d62f1dacd5b1a9174d12a73cd1ec55747bf08d1494de4fc3442389b91159946bfeaa938df652419dbd9ce20c227176c7c4c668ebaa9fb4344b2357ce9aabddc67adb5431182edca9404d8f7b0d024b228fb17ce33e0a691ff6d96bdd95921e48936e93dfbda0679f1e4ec758a02d82a6cf83d7d134e84dfae77fefea3b8ab89c70a3e51b579fcaf3677853e250757b0a7f85f8f87318a2763ad368910e55121cef2b7dd96e9676375c349a42878e14ccc93ee4071336a0014a3802d379a47edc60b16949994674ed71f34fd520e99b1282d300dc58886c57c412807e80930532b722eb69833849c5a22c8fb7b0c65995bfbd809923b57321ec7098a9499c92e5abd9eecefc0babff6e3fb02bcf156be5ab0baaa842ec6de1fc5c6a6f086c56bca3a591f8d4767248719f9cf95fe0fafcbe5b04279dfa9105853de889d34455add9355f9bc52d47227b2575a91b60bedb34722df7310cc7b16c17be19c4acf3846c2fc5e50b3b5f133e4b8e349c34eb9da3ed4aed4a979ee8b055d646c324fc98f4cafb635dd9fd72ffbca24b7d8e1b4fc45d3582569c8f34e169cfc736b698536e25813f956aa25f53c6d63896f2d87219f0f89c8b4df342f6ab60794dfcd989d65edfbbf3240e3eb71ebb7789dda3e9c6194e24733787e2c1609d8f771c42e488c57c3a9001ba472b26da3fb44ab2779f56a6a29d410bcb90ec8d62c3e33ecea81ceaa7a436165ed3a1de679cb8ecc728b3d459c38b430c8b3d624990879d52cd5c57c64b4dbe544d0f7d04c819ae905391e1d38579507536e5031bde2c2caad42d256b5ad64c2fa2191ae3fad5656cd9a60bcd725df2ff9ca1371439a8f4c2e0fa33883eda7c988cb5e219aea0fc444155331fa0bd6c3de77a7e716d03bc5b5580abcdabb54321de2f3a6d3079fae99ac5b1ee1dbe6d374f9aa3788ca5dd37fb27158a1ab93040f4b5833bbba3aad51b98fd5dda129fd6bb01fdb2743709ba5f5546d63f073d04159e35f019c5a56edc5bed94cd93c4918e3bfebdb4c2e7c7285f3606d1246d77f2bb9499d9c6e5680bf18228b0741821091566dcc53f80cd268912501b55279cb6b5cbcc8951ab5a66a587770da7acf75a3a9e77d680a17b0d977b2487f1ee5e84c30acc3915d0cf11880cb607ede7c60e70d65aa9c2c55e564163a117b9333698fa6a1da63746dcca6e33ed567a6f3fb89507ab85da0afd68ca33da2cdb1daeaf1383d18a65db4ecfa5ff56266b80166a796cf5f10a4065b796213f9a7f5cfd8720b3e1d9922bebff81e9803cd96b0783c7d9ee5540193266f1653271fa71b9a874c1df031b1f7fd2e9116d7dc81dfabd09cc6d63390638bf63873cae32f7f09317e4e4033dd0c4fbb3edfd023d7403c51240cf0c0bc6c55a227b9b2c014471c8b737486b0973fd8cc5ac36b12285ee680cd9258d1444f68cde4be1c63aee41a54b1a6b136e09571011e9ce8aef70e859f8f5f680f17df5d179870afade4be27df2e30fb809df3c494f6cb02f5cd24a30092dd37b12b39c2217a006a87880d889d74774365155919364eece568884cc49471b40d179c6718c1e7a318f86c5c77d194de9f2283c1ffa90727ae9aaa63e4e249ae5fe4cfa575e5060c9328dfe7b43a2bc6808773ad75b9b03526aa01e136e0a487429e50038893c94216a12825f15dfe51636ea338a0c0c1f950769971d3289c7d64207e054e3751674367467de4d12f6b2258efa0066c5348d4b34547e06007d5df5bbf2da9fcd518ae64d48e1d199034403f9e5ebce4bf3ba70c66177dc0c90cbd55081b056134054487ae9c58b40b76905b57f26d8fa3cd9c81e82ada64eca315aa732235dd55f7dc75ab5e3e33b691dc28e50102aa34b8f9be56a032a64cd6cabb91bd4aa59bea4875df8cb57486b08329000047bd078d8860566420dbeabea47d771c66a3784a148ca521b4fc1b3c95ce5726498cdc12b1c5eeb7239e53476da71f20ebdff8b74e16489daca48930cabf76da099ab74258fa624af8b19151c9d9f9b49bbc11495b51bf1d05929bcd941707f7cd14e9a6ba65c39ed1d64ec94469f245f94777b531733733507015e2fc718ebe455bfd609e1a37ece4e09d217778b95b794296a6c0f42a5456d1204b9b0bc447e8787649a71d276f91fe00d2aa526992cddaf87c064dca16e7d660eab82c15f9814b87c4448ef069fd33e3206bdea0d538945ef0d494d18c8e8942a5b27121a64dbd9964ee516024ff921fb206197ef1b7a48c41098f609ec92acf98af52ecd91c95ca61314c4f4be6e797b1800cf200a315d538ddc4b26d157d9e71fc5c0fc25fcce2ef4a6a81262d42c5195e87f5c3eff74559ead6a51a9209d0fead7c7ab9f69528cbebdcefa35ad152453599e75b14bc0255b3ad2109cf8304daad733c5b98fac72beb52a8d435c37fcb12125f8f876d65d9b515ee30cd71a6cbe39f165ec2486d85593142fe0a8f5aea551d3161f40a2cfac84c72b0f091090224f32291ca47ed6ea52c3c820bb899ce87bc7a7e51b2e7463c1ab6d5ac4aabd599665543c189ac6893a1e924be1e80f8fdd1aaae50e2a357a01318aa09c02e18d964f02c2e2b5dad16ed4827d31be65dc6b91a186199fb2ef50e4351e995f3e5239668ec35729226ec8b3e642859e2ef4531cb4ff1266f32ff567d7e8f76484abd690368c01c2676b828ed8a3fb61eb0a17faa0a2f36e5d82fb1fb76ea06c02dcb8e03593856a6f0add1307eedc7f4c6bca5f6f1fcd53ffa9e8950f0031418242947d39803bd3876662493f9b46e58be4c7823ea4450b2e4e3fe0d3635e4126cd4e9ad816f758707cdecdb4826f69b05a26743c782d0cbe56385f05bc78d2cbe13ba95531e13cfd9c9dda0ff7b006fb7eb196eac51ce14d828ec95f9f4ebe7803d638c6e5e74b334dbb3db4497c48cbf2733a67c49fb1e7f8adb009749c2069bf401fc4dd86e132379dda130e7eab83856620c20079f6d7ecb66d52dfc824f9eaa6dc75c6e01f20fbf87e8101c4a436e77e9198cda7a88aaaf6fc161b8dcf7579b957d7f4822015e941108ca5560a3433a85e6b22262eddfce8965480ee3f282b94b18104f6e356096cb0a8cbf1471f7754a91bf8ba537acb3755e71e380667d8c3bd81ee0a570c2ee4524032f15b43dddf6b49d307719f7c23826dc38a19cc8249f35c51214a3223d0eac85b70a8fbd73f86e112d3dacf3eb75a7af324f93ad366abd8b3e774fc96962ea9dd1cb6b57cb9cd94139b03864a0237a2a73121019de828185b9e7356ee046530193543e0a0faa2af7d543c904bdb07b38d9173d385c705a331a316b19f8deeb9169b21e86f01279cad6dadc2c4c177aed58f86164796f854f7d0f6e6e8a7308a98500003341e9616094c05b78be99623d7b394bc1f1ed3cfb7960a14bbde3826a5440a198f5f70b198705daff651d33cb876b037a2cf244dd8fe9d4763ae57e42f7b94589ea7fe457fa7d29abeddd5d27a7abacab76f17ba1e9b64da4585213dfa27ccc0527e8c07a036b8bc9abf9599b00acb4cc1a22f331400ceb5f7f712c0935f76fccaa2db057519648be2973629da7a324b6a10ac8b236cb4ffabc76fdf600ee4b6863bf54a5253d73faafbb976af34c0e6090526abebecfdb5c1dbc161ae4e98f368dbc627ddab93b90d35a8d4a59facc0e95d18decb16095b035f6e9f12eec7a7d28961a8ea2f630b13e49058338417e2312bb2599dc8c37e6b6bbdff86e6c804cca20d14516460b3ad7c5a31fb6e3ae9d8938aff57cc5ca3fe652b95147224b1838838b0e0349cffaf3bc15aad1acab1b3bb0d49b4b9a3301cd3b7c07154f1a1d6da6e2056860c6903c9e7e1ebbdc0f5d8c2d44812b2034ff9b629b29d80d78b5667072a409f44dd5c5f143b3df8303944bdba98426ce5e2dbdb09eb0658ad406f24a8c73d2f83dd0d4fc617873148fda077284e4fcce5a45004063793f662e147e33297c2abf9dbdabff8c58ba9c1b3672e3aada5228fbd853e30ef69bf994da6f3159be7ab6c50e13b2f179164ae8c74e9b38264fcf0e4735a59267e6358da7b525ec8e0ac1e91b440af86b5668d7cee9611d4847db66c5df15199910e5a18d1f8d0571a0cd9a252eb739dbd67b19b894eafc2327c1b967ee5907c9c634cbe6f86b83b5bb96032979fa998b1a0f0b3a3f3d15e18f2d0a50b14c520c162566bcf9f538d0e2a8fecc3e4a565ff41daaf6170c37f6aa7de37be69b7e3f7a6000b7e44716d2c14765450d5097f8761d9153be8d4dff9ac156be9e2626400f0045a431a9ed989362d01cf9a51d49a5ed4c2319e5104c53fc10f3004376bfc30c49f5144059636bf4b17b2924d357692c14a6560a19228207ab6ed5277261a55fb2e92e01b547737a6384f0bccd6a29fb6b2b5e19020c5979d171376a80a09cf2e273b84552d604dafbb51fed4b9373df671ccc57bf86832cfba7a82ed6d626e2e85c20800bff8c26e5bf1f3248b0a33dbf692fed167990602d2d4c2fb35396e1087617fb1d3e7fb6aa574ec66a89abf3f498a0ebfc444dbfbcb734f17adbbfcdf9741c19267ec5c950df49380a2bc499ca25fc583acf5d753418fe3e049a93e78494e4a412fadfeb04a7aa8382f104e5d271f9f6a28bc6eb770c8a3ec2c768ee0f66c9e67a3bfdc54d6bd54565cd66ac54fef1e6d54d36805c36d67a68bb43d3fab0d345ebc9b772a8267e572d8d155a0f83421f86d0db277e118172fc54fe0f505da9de4f3845c2125a7d8c4faff6705a1e3d9926c66e92bf6d76ac58895868b534f38c1642e19303804320369f3affb12e3a274f7f5dfc8bdb983932bbbfef90950b134ab8aa2623de2a3c15ca61848e79b2451258fc968b0c9c076ad459a619ea4b8d7172b9a48f83c7d7dcbfb9ae4dcb564d5bfb4cf5c6b23a62e6ddc48e897d20bcfce6a9a5f1b9364e0f6c10b790ff4ae0753e247eab92e46aaaeb6d6e63625ecde07f1ec2a5d34d3f3509856ba5df42164b58038cc964de8c3eb7f7d7b14b70fb3ee15d09e175127e36c3a7e0bc4a710ae27753cc6b10657d608f2f60c4380939c8e444ff7f8a728415484d72995d8b2c195fd036bbde8c86b290096d1834bd2eb5a809a30974c1020c7985e6734d098dd3166306b3f3dc001fb8415b7417be581b0ac507d3aae749d6b66d26be7eb296056f5569d6c7e64238b860a09741e018b3814cf00f4d828ef4446769e06c046160ee187154ca53bc335c9c53daef47a4faadb0e1962fa7bd228bdc37f5c4a800099adc583a582b261fdd320c56bf263343e52f21b2a4dd2e92a44d91c1469966a0b02feda9e3aa65ab08b0335841cbb6619db7fcf9efd599eef9ff2b2d619cb13b818ceec59208b21ac83d6dcfc2137da326b165e9964462ad3c219cabab3953d30c3a150318e46c07d30c25fc4e7e19db17070f85ccd0190172c52f9114d184a9ef4a194462ba32ec2a78909668f151b5bc975877cb5f03e3dccc48270d060e4da4392c3cee49cd0dd092075a65baf4c21afa823ece978347b4f57bea680438cb78f4831aade32b21c3b36befad1364ee0376d1ea76f043cf57673d61ec913855da9503faa5df98f9c610d75746cff7de7171fe2d8cd118a7d02c28fb234faf0a6f4847d6aedd8ee496c0fda093995cf7d8809f73c27268f6c1a32eef16143cf9e3336c493577f93801043567d22df747994817c30b2a1f875f09bc18a1f12b423fde70d5a660f161b5022d3586a6b5e2f59d7b8c8152fb42aff0ceeb04ad807b46203478ac94184eb863b91fb55869cdab36e4c556c112a8495c200092ec9a70a216146960dd6aec4da8d88edf9332650e05a0de84de2ca2e17290fe7a01099da8388def9366d91766bbd62f2ab997c1fd0f25562fd5625dceda036588b6734f11948aaf9355d3207b7f59830e8050a55bef6af48777539972f5e049f08d750252d8bfae9557656216a5cc183fc9df428389e340844ea918f588963a95254244187a25ebf22fd0405913f559972e51413b38792875ef4c2e758074055998c6c44a51d24ed6aa71ed7186ee5cf2b9901c31c74a1f7d1fd63bb35682fc1a4f9b7605e87de27f33873e8addd7c8d8c1dcd778735f1715147092e127f5d80ffde38b6c0512eef5f8f86f60ef0a726a5272d5d9ef07c1293c422245da3e626fe00d0d27302fbfd0e435d35683c4eaf2cf686edf7acadb6ebb00a6f856e87f64daa886bfc90cc209d84ca88a28cb4ac836ba989d04acd058f5c5c1ed6d70f50f524d8532bb25a1772366f4b4df2b0d02d45cff002d02bf855943899399b806787a20b96dc40196bc296dd15b5d2deb50c4c49f0bff61b5ce938f601a65057ba74554d6eacf7db29fd449cd58b1b8d0ff3ff7cb17211215c38ceb3f3955109ca169640dac342ad3f0848ad989b113fed77164562a78edac7d5c0c57206c520e3434b19571bdbd42f9086a6e23a41c78f6ce636804733440720766d92637b443a0f9eda384f28defc5e7d1d0bc3b7a3c0bedea59d1b937baa21a990779aa9f21c4a6877a2723b3643d1162b5472121a4aca885e0d3cd842535138ad90c616594e6e994d9549ae82028ed06b54e759169d9662eb9af910ab9d91db034dc78ac8d3496202b6a8d8bb3cc3b0c269da1d1628ea6b4df756363774050562ef4ca2770d9f8b86c5b2d4b76e19eefe95fc21c0599af086e559d622eb3ad1229929d3394e9a17261435936a1314bf976a57c5b211c66e90ce3e8cad1cb728e645818cd9739aebeda1cd9caebdfe2e6614a52fa848ca7ce7e7e1e529e65c9d93e6f8f4cb2df4d305652a04f39064cee90cc13b3aecffa806ad0352b321d45dab22236e93241df56539edcb2554dca850040e8cf0794c4298619ba51084578cf8e631345d8aafe4160844135b56a5bdaea6e84166da96191419ed03382498cb88e323533f103f4041885672500263291c1a5803c5b4ee073c6b683860d45fa3e3c89f74c860fa35445688cd9f79959182b5d606097d9c8ca2ede6d5152b8b1ef2ac0728c6b8ca237efcc21316d1b146d77d4412398d07a65fc588838bc165d2932e906d37187dc67a6f43b773ba395deedfc63424e2ae53bc24dc70ec5df26d2f3264e4bb8470df09acbfdb5904346ac4b7196526883db7304322b6889afdecabc37a8ea981145b944ab7e06ffe964975a8a15a21fb40ac97f027f756cfe118aa4ac5952bedd182a0e3ec286807242900de0f97a02f0dc6dbccb11ee49a84f756f4283e2d47ce9a4d772042f44fa43f9acef004bdfe2c0c5eaaac045dfacbd9e345f89eabaa5811670aa7453f7cc9b226f879f05047bc58915616b2f53ba6a9a3f9a590dbc15e3329b0eb3dd2cb2d1d957125b22ab9cc0ca0ecba9ea33488f663393000408175ffa57f27f08eab98717e0be1a875411eea867630de6461b5d7c80510be8b58c57264f107ce83af6d1c965e41fe04dbd384d0bff066265e1c0d1a0527919b12272bf2c17a92f82ab8d2c67c17e0d5f4d98b62bb5c1c1e63d2ba23445f89d332b4eb5b83400daa9fba51f64ccce6dd52285cb089b56b06d0aeb32be1c25828d8878004429aa04717a0bb0ea8a66577c1a64848ff7fd5d44fee5f50433a8fa149d4cd22cbd7161829f6d1258e0f002b2485942ecdfc872a04052c77ee6f1c94942da5cee29079138637d1e48c9e661dfbaf047c59db3a1bff01a0c03bae59878f4f67aff6003bf77e591877fd2c45f927dd455a27a02d29696fe485b842f5645fe5f7a657b6e7cf9a382c8f6b6aae7c36a40a44296948a4ea476992c17c75cfcac03d1864f85b615976d54a4d90549bc1dd03eed551d60d12e7c6abe12898260da7fecadf4d92e14e30bbeed69f9ea0804d75fca57f651ff52af2bf62cf47c519fbf4b0095c0a3d5b3d881b016026800a658217ef60918123f64fcbba1f0740d9ee446f0e495e27d4c35f5dbc7280ea326e2df7b2295fc9b3cf9322f7017ddc8de3ccacb0b8dc2dabc4ac299c2d596fd7d89aad18138f5289933927930586b2498be053211c2265e99d00e4d2cfd1b0c3d6fd416211376d6842062c5c6a7ac72f9fbe81f275ff563573ce117ad57113949ff23de5239ae20083d7d7695b90951ca14fbea3ff93b35c4ce382fe958171d1d64d7f081f1c6d5dbb19cb74e721b76796531206d0f6f458310cbf7554822972a99d3e787c6877f5785260b47671a268233bca2692ab94abda8eb78a3345bb0bf92b5144c38076849a262bea6ccbd72ff905078d2e6546e64d78ce897ba8cf53edd75f36b0401a0f56adfb0ade6ba3b02c4ffe3ffaabdea339aa3956ba1eb1569cae64abd97193e39d1477827ea6d6e301c456e8b0411f75da3f6b51e87f91c88bce41ba5df1fcd070ab3f7bb91d07f4fd6ae2dcab9a51cf259e4075acc61de002a4cf9c876a82d8dea2ef96c5fff12145c09fad993a6534b7bf8e46487bdceb7bfabfc969f8130b1d680e84d5f969170ff9d9378fef746623862101e38ecd61c5e503bc8729bbda6670f54f3e228a626287968facc1268a67a26f12b253c18b2b557ba07cd4f708b99744267497641799dbe1cf6b4a7c4298b0e908989c6724b4c111b34b999cb868227243d76c6f52d301b253721ab644fdd4a28233630435d3b0e2a066845ed4 botan-2.4.0/src/tests/data/pubkey/xmss_verify.vec000066400000000000000000015707571322470703100220630ustar00rootroot00000000000000Params = SHA2-256_W16_H10 Msg = 0d8a2b78908b8a2537a194af3b98de9355384accdd7d2e3b542e37dab55f0fbd8fe163e261d37074f7fcc3f4e7d1774cddc6 PublicKey = 01000001c9802b0c3dfa2596ffde21b7b9abfed5094d7e936a96900ad7ca634ad7bffeade07f1a46e940a2630bb8da78dfeae742d5a9712e15459d9d51f2a22145f25be0 Signature = 00000000000000001762b20507b3bf51231e50aa3bed990b93493fdec8040ae24043fc7d5a0e0d8744611ec5f883282695c4a181de84d3fd993e24749f6d855453a1507bc0703cc5645bfb281687fa9c9a8375c19dd51b0a62a5036e570a45fc1f3c89bdd1147dd200f3756b6c04634f7d2abb37da79555cd209975824d0363cebbab14d3419e0e99233413c6226e811a1cdedacce918c467cd468ba21a3bf2f3c549bf0d93a87cb0a7f6574d3db01dbfc5d61c8eb60b8b3adc4ff5d8d63d9f9e91d42c7095e66ed1d5bccc7965eda895350c727fe2c8a618d685d338f1d0eac13c41de2c5b3ba27553b60b48bb94b15adf8d2323efd85b2c438102aab7c230e5affb39ad425fa44a093b4f4b935acdf78d4590815c037ac8d3fc63edcd3b58532d24d7ef2d4253a091f43e51e0238d714a60c54b8e3309257a420ab43340ddc6bd8b43f75562ca7b3190a951a038e17a709607069d44aa039bd0ecf5af5bfab596d14f45f53503f4e8b38ff4b2ce13a3d7fec0ffa513efaf8f0b0320ea759fc86674d97b9a959722da668c57e96bb3dbd20d52f14fb8bcd7d130b8100b475268b6e5aba22029e41c7ec444f4002c5cbcb4c948936e07111dabe243c15bf4c1da2ecc5e52d6db94455edaab2f3f5393f4475845e94e2ecc8f02a9db7290d15563bd37e603f29848d36bb726e9d1ced80d9a7e6d23f89f074a2f0427dd07de7db479d2a5d1bf5b130fa0fb59fa21ae7d4e0d1653fecb9cc15bea0583401d582899f58e9a01bbf86471925245a24f7ed2404a686c9985710c580467e76625760ba4a56a1c72cae259acee23a58191931fed954af2778aaa3cf52aa83380abde5600eab7faeaa867875606a610d858472fe05f4c3fecbbc104ebc45c39cb2bacc70f444a697ccf845d31b0e06b3d399a13b25f51e0b01b005c80a974fbbd22da2662a1e2f7ed07fce73b4a2b2ae72df519a4fd30d8d8ce0cd14c8d570e35ba7dc87745d8742c89d47908e163010a4ebc024ffa73c3c026b8021ef2f9f155a7b8801b1018829efc24cecf1d1d3135fd987f3d15cf442b031a99bf069b8c9cd1d1aa6602cddf57723f718b19991ad58b8e87f5d7e67181bd730743b318336e882e50c95304c289c8efd08ff23ef7888fcde315a82fbb767e6be568d2f8588bc41b7ca3cca0dced1046220a69205757806c90cda9e43394c278f4058b759bb0373e240faef13c721560c06dfebc44eba270003ffa51996a6b3f464f768acc0f2c877e3a8d1e42b9a6049a570d768f0e9bebfddf91112101c751c73e15a4e9ed17310de7cb9cc65c3ee3648bdcdeb0de1c2a0edc241c8a2dad563955b72417f2f8a608ecb4b4680366b816307a7b63966f777a0106d14afad60222097eff9257707449827241c6b0b2dc44a32cfac9a5506f54310cdf2806e3017671ac062e91655ca6f0f9d3be4d95921233d77c8c86518b94c319bdf25009bde19d47d5cafa764f802e94f4fcd4063755d3bcc5a6224b33ed6a27d3839213d8804fb1d18e55c64fd070bd2833457d4fca8b78eaececfc7a7fad2bf1fb2f007bde785452562a4201ea524129685aa7d4a6d5063b12507880a0b0c39971baef9303f0f1227810f9f2457f1d1f390f025aaeffe518682739412c797beebe440e194f5ce7ed8a027bcea23552cc1a1c175f7b716117e0c2a64d4ce695b4b55f92d8985b01f6cab96a25476026f2eec69b83fb445875bf54df507159ed00d7b4c020cc526fddc55e73a01f7712bb8daabc14060f51b412439d08fc94e8d90985336b747f933ee4e174ba8e5dc9f049eaaad832f0c2088bb8cc17a95e1dc967994fc6536828300125555b383ea372a65ed9dd5e92348800d800a0ce0db784216ccd65abf173db327515f7a1e4cad57fe33ac3fc99c0ab80d09d31ecbbadc9adcddee61749388a162495a26ba903f1391e527cfef2b696f8fc42e0a0b3f89fc6f86df62dfe564cecd3f33392b1fa8e68cbeea386827db74ae65e15650c3fbb7d9208e2777c9e5b4a2fbc7f9a84037055709912c0db2196fdc8bbada2160ae677ee0b39cf2bc73653597fc51eeecc70ee7dbea5eaf8a2f9a41fcd33bc2d2c19aeda8d9f1200e8baff73a84ecf5c18fa44fc4827c8938c65a8c79afe26a07f5dc8ebfac1dafeb9d2d16cf5741ec7228e21eacc6e00d258c4b0d0e2c9ac9ffa849b09e1c35234f0608841d5b85a5643ffbf6c084534b503ea1a9017aa008f1c8faa780d6a3eaf5bb69481913156989a499b75480ca22b8d3bea6596100a87b23134d65272dab7770a29f8839d09344982b5d4121ac49ce052cdea7ce9668eb4f3db3c178daafc190327592e9a5a8720c583a7716f0ca51cee67621932c9628143eb40eb6538e378214d8371b1634d4f61a16f28ab147c83cf865248bb899444a32a101b92b49d1fa37e732bc3134026b45b30b57cfdd7754f5368ebe2761f0b1cd3f92542b85711d5c6d56086549709c198880f6c1eae322852ab4e7601971006967e0a869d6a0e764fdd870240862059f1532df541f3a60571c2d00da0d4b67c4002dce0e197970f8404eb19dc3f91036a716c285d5a543a818f1cfe85cd760d7168d3204146ad470f033b2dfb05e422434f36eae7bc46d7aa434240c578dc291cdca5bf2ba94832d37b8977d2401d3d358fd54b68f94b7108b48d96975608d9cc7cc2420911c2e17604efdf396b886f60a57278860d84f26ceb28a7a340f36f0bbf91451b4dd5a599eb661018dd6dd3870c510b251d65006f4e51d1909283c87e086ab3cbeed325a628fb8b885890bdc3062bbd6bbb3ebc59da5a906f347192d69fbb76333099d809456ad7a5fd4dc4e0e23f4473ca9167065ccd60a526fa88e550cb40515804465261df071cf8620ed13935a8bc77db8e231c2adb4a7fc1460b014afddf47466d00093882349aaefd7e20449fa2bff1dc215e0fdf65bbc2555bead769b624632211b05c098c932fa0d203fce526698caad71b897d7c7d297c59bd51dc816b00d03fdf10de774afe52655f14a5c00d9026fbc01878436b5560dae061d220cdc8ddfe5a81ab4fc497bda7fa989e589f3dc87514ff57bf59c099d1787363bf16ce81b1e0ef7db27518fa5ce332165ecea514f7720a84382b6f686a919178acc5bc5b46aba93d98f48e65b16a0c0e26c52b7c94319fa210920dd7cd095362032c6c60cc463b0b5f6eaf70c66f3b8bef88f2bba8b14f5c971b12d90dfdec5894a6b030c08a4e2d6094f5813d596b084f018e45abc6161a1d6755dcc9b1d2b8d2a4ec6cbc827267ef79ebf5647017f6843f6022d2de727fdbfe3e2ef74822684c027b9683e384e5f17f29ac85ccead243198d4e64db77515c2fec030cae5537715b5c579468d5f724d57cd3027665f55ac1a656c6985295aed5ffb5f83d7a294754ef6cfaca603933eb642f3e3ba9bbc2b9192b4a24c660470479c8bc2ff2bd371878be2a60bd3c017f6dbe5a4c7e7bd78278b629b57b909090bab7df5e763096974cd730da560de9a1bd0fdccfe9f5ef9 Params = SHA2-256_W16_H10 Msg = PublicKey = 010000014dc6e78c10845a071e9ca6cd1ad0d49a955a6305c7071ef967efbfd317563fc493c6003c3879279fff396a7db158859ec7476a503f0b349b65ae2b01f7c73715 Signature = 00000000000000ff3dcc74254edcfd0e54170dc8ea77fd8fbc6a3107ee2142634ae5f8e6ebdde04342fe40867000150779bbaef0018609d7d9f6ac2752f06e3504f3ab515913f236375401048841133ef08cd02d3c299c55bcc2a5da1d8e8afae90dd37ca42f386c19e75c197f62368e7d322a6b479265adeeb246474c240dad7cffd613db90de9e7fea2cdb0817d4f97746ee8c47fbd24a6e724391a35e36b7d2c023bd2f9a0377da244b1c528119d835e74e85232e7d870e994dc779cf3afc3d724cad973a6b040abcdb9e523e191891191bf3c35bbb1df392e389a36cf716d78ad7d309e0bd0b5afc0754d8b59711358bca644de8709a6d3e6a0e945ce8640b8719cca9587373e4644b29c16cb5d0559b228ba2908157c6fc01e4c9fb80f7990cadbf98f5ece46064dc1f5e5b1d6997eb60f41e0a5d5c1f61203d5fa8b210ba584e3d41ff07aef678372efc1a399f6fa2cd14bc0026697f3322a360b5dedc9019f92aafba5855f433c7393e9ee3f4f901ba8e86815ef0c0bbe48a7267f393c012250419782f966b59e2d20ffb0639604aed8a262432d4655fc4870aee16c3a9330be804d6ff3efb19cd50f26b41417595e4c04046e27f2fc2b8ee9e1b7ff5d57f6baae30dc12e71ad74a5699b0e173a6b7ad8be0c0cd63901dd289337ea7c895ae45649875e2ba9b31722bfc227d8224fd0d00acb6b3bbde01ee1f4dd5eb1c730361f8371e650e3bbc8768edf3c1af17398fcdb824c9e78bbac14b386e0a4358a901ec9bdf0b96201fb791ee8e1f5bf1e0dfcd879b4e33dcaa365e96d311fccaca30b024e4ae6f69381e691c81ac716a7afd0fe413259cd9c4e35e17830250e008150dde9b3e364b3535037bb7b3f69e10ad5bb448920c6abc6ed28bb086f15742ca9efc746b557fa8d35811d5e24a3c87a25c2eaacf70200bd2864cb7e016c607f119e0f19dfb4ab83821903b73888b305223c651a372662717756572c9ec3f5ca8e4f651c37ca090b94ba28f0b012d4317703d15f133fd1e87b65e6101b467fa409b11b54d841eddee638de08609e6b0f6f4f8e124049ea1a68767288d61db374c60a1e55c3594102fad6ee7620cb48ecb874a66917e6981774f9c05d641aba65b4ba6ade7699d6dd905e19c82779c6d3e12eeb38adcac55f7ceb22461ca1b3b97953ccb226514f34b60cad34a26212b205e52dc2bbe52457a729b04501d3d14d6d962a453c4a929fa6532b7972ce58b2d6d1879028f7d8031b19595e4b95ca3c7634f83e7828b009fac87ac0cf6eac2d25935e6807b321ab37846bee245d9a1c82c04ab42fadd35ccbcf4bdeb82b0f203e8cd6b4ac4cdd84e91e869cc6bf30d06073d63d8141a4f06960b5757223460b47a3c31b2b9f5383a0711d8a32ae26ec2719cc60dc42a7e0222f2b12b0d1c232630e77c90fcded01b0603b3286a1f0e04d4fd4b543c748875e7e0fc3fd6438366af05ec36b7841d99693f97c65a924656d580e34e8fdda922e7296c412a7780ed432676623051af946b9750baa31fc9ef0070e542fbf074bbd13513c26335fe16d2a885bfd7e66855049934a43ffa8c574b73cc44f4de42336ff1cc7f85f34cbdf97e8778417b519c3bddd33e9729e62298c3455dbd356efc0dcb3b41a3e00adabf62a6aa32239a22dec7338b1b489cb07cd02c1037e65a65127f5ddb26f527665f6f34b843cad78b11972aa14b384e290353eba7c70b5ed6acdbfd12a731881dd5233c1493f5bbf5e8703dbea39d65952dbd67b4b826d7f8a1171f994a934eeb845b3a27ae313c2553f560027be388c5da0b8bc0d79397b965275890ec2872b223de5701a82260675fed21129408b3cc4eecfd89a617eeb9514087815a74da8e4a573afbc4de0385dcc06680d851cea3805cedf31ed9990b93ba19f84dd07d9a4096bcc13c56ce02085678ebbfbde83714b99d1a1cb2bb3333016ee165af62f902763c68c9ed0826226b5bccbd41e948d9446c04a1a53f55e6f0d660b56cd0b35229eefded6a994306e59c3cc08e415d3959b3b9a3ef09bb1fc70119048febacaa4383927b2ac58c5cf0b39a63a2a8badfdf055d65c0d05d33a33a34a2abd99afc870fd7223c50f7b59ec64760c191fec955f45f8c20875b4ed2b3ff1ef6475ad080506f19b9963927234066ce0e7d0694295206f7669f0fa8a0680088ea4cea15d9486dadd3bccdedea0be8b06bc5926ab0fccb7cb7bf7563b18db0d28785757825f3aebc1bec8398513c904625ba3df8e9327da6ad70fc7656fe9b393e9de47ab9379105b12d573a9c8c4896dcec1b915f7f521534a84e0968c21f85a92de9c857b9de193547ca60fe7405878e79f61bb734acc4c2dd17d4d873fcf2417157538405a93414299be3cfe72a8d94f6b3eb1a9fb712ce46b4af0be8a368e6a8e07392b6ddcc37021bf65e29c306c468eb8753da38e74a1f8e295882e141f4a3b988d1d73cd40dad8d9db80f25fff54d2d047e98272b015d0ef010fd4f75fa492f0b4cdd87124fcd7820558d27cedc6daba8028e5320309e5fbaf63c3c44e9b2dbe2c84be529c10e72c690fbfe7b19ccea9a7e9c295e5667a14a5d2217140e131cba8ec9514b6ee2701e0d553558626d0133d5f52f1cc5b8659ff2d04ce731932ff3b4729a18f145a7997ff0627d4c16c56946afb0f8aaf9c7f10b841196a9fcad11b079f8e77f87f6018e19eb3362a7b57a4f49ca5c5a158935c59a0312275e6954ad18d9c8d8ba43aa1069e1603e8cad8a3c53e284e361987603bcdc7e0adf815a4b94898be36005e927934941e79d9415e36bf761c9f0a42a94834056f02ff15ee5a4266a219796d02b26b54e38c7ef6274b6b87bab1b8fb6a190742ae9be65fa716870fa147a1ed625c56e48e8747a3383cb37dbc03684f9ba976eacd08800944fb0159a3c94f6ec2516de52494e1ba0bc1981d340af5948b1770e4625fc227ccbbbeb49df2cacf633718136a081edcc69f8544c01913ae981a6d11eac42fc7203ca2d0fecc178caa66ff96d3d4b14c139f34ace0a927efb4ff7d6d6dd533c62a2bdbc168279731a8e953cb3957d3a640ab3030963542b6b4ad9cf375e03106f6467345c1ae9168ba9a4d2118b093b4528a878b78058cd2d9fc85ac7e3be64b0d9a1420487560709f220ebdf92f3e3615bc264c7bea2cb2218832ba5034995b2dbf7870688c9dde6e12622686863362d078046d7566358135f6962e574d6555f0c55f3831e989f4b435491b3562c6317fe4506c2fd7c65d0bdb7bb8fab2ac57ef636dfac6c00b5d8ace1191e5cbe3e8eb798fe2a9ed131637404968c770ad38de733e01c6d8e4cc9d0770ce8ad8182d8c5531c9bf9aef65bd2e1efab4de9ff5e3d40ec7f96709986f8b01b7fa69f7024a4e9e0d25949346a430033f91279f594cfcefa07cb93bc8118af2a813bc968cb271259859412c38639d51225b3c278386932f0c6ed47fa45c2bcc073d8c5d1d5bd6ee3c91e7e389d52db9a5f49bb3e5acb5f51ab7341cfeac31e53f8cb8bfe5e1a200ec Params = SHA2-256_W16_H10 Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 PublicKey = 010000010c453405f86998e392032927cfea7d8163910d073e6876ac3238fb5a71bf4f853c7843609ac24f4f42e6a26626d09f9ae4efffa67e63f426fa959268b99d5fb6 Signature = 0000000000000026b6fa65b27c437b4733b101638b66e794fbc71434e86c504045c9e63826080313cb9f1492b422497849c232d261b8e186402303eb5129853c7251d94020179c9408aa788572d9bca24cb5506d8f2cfd43179c6cc90a2fb84e15ed8006ebd99f3d0270ab03ead7cd0b0023252e75d8233d11d663e2977c4b9bfeda813c837361ae99963d0898c793c30ae933ed623feea77f8b99cb900363c7f308261d73b3203c603591b777351b594d2ccb2e08a8b5cacdab4e37e46f48d9ed8881bfae414f90bd5f842782b363bbbbedd802d97b77da22bd2059ec14e8d8f366fd64318e72540a892202fe7cb31fdaaa23a6f7d9ea55dafd2e5b281c3144fdd0c792139c67eefc4ea1aa5493e3cf742a37a3b26dd6818bb424ec3a21ec82e891cd7baf869c5c7c0c6225d3e44871c84292e63e28a8fd88e46513eefa9c7934788c1c17364a99d513465876282cec1d69cb471f7fd409811653c6d449d89ac8ece601a7b02732551969efec7e6e3a5ad6620d14e14a667bc60a8aac1af9f415e3d14ddaa7a54782716256208189d00e3ab612e0726b3f359222f4376a4d09f275eaf2a21a92fb39b0b46822a52beb5b57162d1aff889ccd84606875972164a97ed80a35bd80c04b84b9389e5486adf956ab4350fa609ebeb34e8d95d1737af2125698076d70a0b7e63bc740bb47a552c54acff2b09daeb063f861dfa7bcf4c4d4b12d673e99c83ffe09857c19bd3f1a5999ffae789ac9e365f22f44548f2f3a668c11ee177117b008b9a84a8b26869d95ebd60b6308cdd0299c4e9050ffa19808ec84388075d620311a80f1bb53b26780e68f515c3074395c4efdb1eb4e9aa62d8c5c1050dd4da170f2d5fb4a9b5b0f47c12e10576927315fb8840ca49b412e1b2bf34591b5f2827a8b8d9e69851f58fdd8ec99add99b424a713a9e146b5a208ed085582dc091b24f02576c9a0f14a07391ab8accc34dfff9c04f937231dfe728680803de5d361e9147cbf8447a0a91eb153e09e3414564cc8e464dce04db40763e9d88750a938b215fd398b628522de89327d1723bc475a3e95c132d69381305f4ac6025fc851470e1272564d4ecb608c435bd51df6bf18baa668d831c7f72ac884d817857bf10c673552c9522ca6a9f88ee2ea143fc7f2dd2002e909705b4b316a9642a8c0b2763f7ea0732327cabc070869426e37682b17a54ffb356e4ac47bd265ba5040d10da19e6d8c4415534948685e2fe5d65fc9b18f707b6cc0035206d9dcea18ed9e1e5654e20aa91366253848db46b3dc1bd2c25b464b56f584c67c8c52181bfab96a606a359bfc9787b95466b4d977cb678507d2107cf37d9310b7a486d9ea54fba77c03e58211434c9cc477fa81ccd7145e09aba1fa663989b35880320015530c7300cea6c7c12300db7752d0f292f2289fc894b2eb4c37f7bb7ac1bc25ee449d58fbb88c655ceec74eb2eaf8313b55b2827011021763b1a5bf155120841e7247d64ec9cb4911093dffb646f84167152713e1099d038e0abcb1a2735156216d8b8a4287a83e7df4df597db5985b3503473b50038d45dba22b2a2d28aaf6ff01a3f82df4d3cf1cb8255801970b9be896cb8f376ee4b6a00b625150d021e15adaab08f7241029b39540c9dd812adc7cde7be0e549a48bba4f9783af110cfe2a36ea18f6d9770e5c63b134538d2d6c9325f6c1b694b1a24ce3ec37127707a85a918df93f102c397ff1f813e8a4fe3b6ddbe6667622ba03253d6d1c653ea23c4e73bc302ffba2c76051c5ddb52d8eb5a52a8930093aa5d7c7498d237b9e8dd6c43ab6a5960cf325ad6234f90bfaf87c79aed0fedc9e6f2fe57ea7f5e880b5723a66c1450bc9f64e72f6e4a9721288331b7f000ceeda1399824519e7f3286426c070533375d8576d24de9424b3107037eb3655bcbcf78571265dd738a03fc4955805f41660d85f3c2bca9eee16482aa164559a021515dbaf7141b98d9457977452cfddc5cf0229ce67d965be5a5cebc47df419d4409313d12755c80bef738b9fb50c115bde411f0d14c43cd151db49151de2b9afb6e33ec29ef34a35787297408a2668462489f8e02ea757dfc6104895736af8beab13d699de5cc26555367858e472cef6015f087230ceed8ae2d61688ac3924eb59d9d6eae5d015f794b30b79bbe9cc9e118316acc8be7ab76c47635db57fba78e1fa70b271b1ba0e7584ef271f46df299f9ba1d95e732a7a25ac8c924383517115b262617fdb1c7166347a2af41d7ec9f428358e2b06ee45b16ce7fd4d1ce2325c341f691f75c0dd872af23940b1a3bd02350dd868dda3e5f5e8cba4bd6bcc49fae87b5169632c1518cbe7e7e6a14f36fa9756d71cba466537ee9aba3791266032be762e8a4d4faceec95dc9e0b28ba698c2385c375ac0188054be756357a469d21911056328c54f5c87bc8332c899814c4954abc4fc89a00530c1fb82b0910f560fe981964bf5be98129962346734176b87e6ce3a3884289c8b2ea509976d064dbb340ae792577776297a27611a9289f91ebc059459ecb3b31d606be7e4572876d0c5eebab29e693b795578047f9fa80b67cc2976a49267e5c2e42e1146e077db4bec536797131ecb1fe78e98dd33b49063e2cd4b550c25112cc436c4da4af6e41a2e69724c27eff6c027a5f0e3a20b1aeb10b8b407ba54aa6b3e224c0cc83d2e6c46f33ffae68474a189cf3bfa2b247acc7d1437d15574c35368deec12960f20ef178c77d3297790eecf0d1edc8eb77587773c418a8bead525dd47529e5d0582166a2b8dd5483ff39f2b1d31b2a264317e9583f6ad2fc16b53e874f4862a6ccdf17bd90d6f0519d8d7de7d72ea5e0e2300cd46f2181c261f098ec934679529412d678304ace8ee96edd4ad034ab154dad3877771626ff94a58e2718a18a8fd5420924a9a7972ee3efef1b7e6a61c08b8fa4af48fe9179dcd4efc852160b5bae2837e017e0944b1c0cd1857661fd18c694d463901edf9e753e16cd85bd8d1884c0c271475fe4f01797ea04a1ad691c146e1df60d7681f4a077474e5522c194f597ccd5fa074ff6964c69316deb68a6e3c59e022a0c2fab6c322b84210eaec647c5e6c07f7de89c99179c30431ca3285b76448f7e6ea0d3472655b9fa51036a572ed68b832821715e62b8047a15ed4b6f5a73623b725e2060b70b601bb65c432dd91e153d079f52b2aac7f1597a7e382cae151309bffc7c0f09ebd82c4067f44099d1d844478ce884d92af7205f379e4485d4390e9065488c63a6012f828bd32beddd5d0013ba3ba2045e52f8de951215722c9a5bc09b266e9b15ee01008000226ebf3092e3b4f0181d14cec7a9fae1501d32cac56535aaafcaec5788fac6a9804fad29cdb23b00d01e7b6d9ca3c94ace2f3d3538613d6b539987134c45de4921e915cb5c9663e375d44108207e7cd40a30ae617d8fec462ce546ba290826f947821ea861fe9e81cf6e792767b89fe4f4f775aaca3bd31d3939cf5a7b4395cf84157391dbf78225a1c7dfbd1a563b Params = SHA2-256_W16_H10 Msg = 39324feb180aca683d995db187a075a910d0 PublicKey = 01000001048a2710a8767b85e8854d79bc9633c8e915cea2dcac106e81f9e9c4c6a79d50b972180c8f69f448e5b416158f9f24ae9b6e9a103484ef013f7344c6927ada71 Signature = 000000000000010fb74af4660505cb5bb71305f25f9d1f2f356ec26cce71ea1e5150e3beb541c37c71c200bb585d97ca5d0367334fa9b9c8535ca4595736eee4f35bbd53d9d9e66e1fe2fadac7833bfe3b6cb45c7bd445612ea46f60d29d4b53f21f1dd492bc2d332f63d76bee910791b3b9ac6a737917ec5d3a5fa6290f3ba0355679498721c30430d0983c916ec75b0db1b16ee5e3494b8bfca8d96781d121189e6fed577cdf48baf3d5cd78612d7eb76d5669dc9acd7154a334a762af31055f7941a10efc3512983949ac35abba62ef5d0e210c341b6c70c837dd8ebb7598394ae19878c8a11e38304949b50371709ab0e62f004c164ebf100f99ae80929e92bcd6d2dc16517495643e1ca375eefe7e3e6eef99931da2eb82ead84352fd51364e119af838583eb454db46868a0bbd1ef786abf41f178e94215e94bf95652f68fec88ab3b8eb4651556f9fa877c0459416e6f24b4917c9d97f1315ad7321720034c9bcee34707bfc01b033ce9fd0e75957f364e7a518c9ef061bfc613e39d26c96cc6d2f94516dafa782bc1967771fe14bb28de778dfc3f127f166992bc13e0832e80acde4ee77810a1c44990d2dca56c3b6dfd5c09452de72705df40d96f082030100d9986b9b2819a405bfdebff50ba40efb6206bc96cbe8e9e0f0204c28dce7de7263df38f335223d2af48cb42cb7ec80e5e93894e517194b4103d4ab5e2194e1f7077a8a3a0b1b509c8c48d04b0b1a07714bcf41eb5f8a96f6baf2a54c0d0254643cc71071d9f02be94b1236a6e8ffeccb8c602dc04d135e40374ba493e73479aeddbaa09fbd18a9499dcb49db853b9b39f8dcfada54d2c0c894406edead657c19870d185f0debb9e5e03ae5cd93ff0f60d689a8892994ce4ba65312277ed43259ec9a83c3932332a7c57e75b6eae15f5d0627de0fa9f67640e25fee21b75e376ac95bc1c8a4c6eb8cc11c76f1f22fd7d07d7b35d5316a6de6488eccc16a6ffa4a7d57f4f2ff6c35025bf61d557290412fb74b18b9db50975f4b4f0a0d636fa317b633e4504c7614da510798850ffa1460d0f48f1e29cbf8f5b2e4b2056d915f66f32db958383c650f4fe501cad32f23f1196523eeb6f592c0a563f13539f66ad637f5697e61c5013b8c2c3b4ec350ae3e89005b11cc0e9b43c0e56c9e758b585114282015273e46ad34375ffc4a33ed94eef5e7223da58723a9f8f31338f1d80f45271226e5a5756331838021c7543eb940c25224c04b744bd94bfd62225723e9da77fd76cbe3adf0ee2cbd8b1dd9ab20472bcfbf8d07f606cf35e2cec6ee419bc71702cea32d7e5ab3d029582ad4604795f84879226916fa911d5fd7355bd60f05da7d03915f37d0e7fae4fe2c7da5f218a660194a443192bf3a0685153d20283dd2a4ba581a341d9dde3ef626ffc2f97a59dc5531826531b20b350c7e4166fc417c29d4bf12af09d6e2bb4f8db8519c477246271d9fa06b251c4f9f3d9cb3d98cf083836991e30dacef304d6911075ac1b197acab26902bf2e227d696ade6aa4dfdd35281e7f97f0069e24f1bcd0498514e115233fe93787b745a71853ab7e8ab414585343d848dab5c5607b8e89f379b9bdcd8485d66b7920827ddd4b2b70a4789bb29895af9acecae46a9160270b5518bbfb15a9d647a7cb1ff7bd20c5fa6ad3a36077444b0504b02309e34336f81081562f12dc0dcf93f0d7b4b77954114fe08319c8f912905314e8440039d2c088f778399c7104a01239931d84bb639701d5b93f794d53c713a6f7e6574803c46819851f3b6473736d89684c69a2eac49beaea4e335714bc99f8950d9142c59e3c9e93ad1f74457c28a62e9a445a7bd294aa0ad03fcc4944adc742c743a34fa37d421a32d461f1e31648155001a9f2010057c5274f13b4dfb1e0738e435c125d3d83796d3497a5e860e8ec8501ca976a375cbae0b09537b535645bc6810d7fca54dab6904fd88c6356ed4a3f12a71010db8f85382db284b91bdcf547fd3827dc14b04a0c5b02ad4df7039e779b4124bf0253d25faca04da5c1da7e9d8a1d9e7f7df6bd695df69f3f76ac1c8c3da40d85045d55e463de7d3db33237a4874be6b1ecbb10d7b18df9e979b18e18b5ab05ecb14321c01c59ecf5bb9842ed0b0a683aa7f46f5145371ce01a4dc5c0725054a0b906ea980c687387cbe4052001968482950ef891543f268450fae1b8fdc0d1b6656e252be12084b6377b5bfd3b04c19490beb6211ef877e9f4afffa34e79743509afd8e32d2103b49c39aa637c89ad44c07739294f0e34b2c5c40c3d8a7c36c42c62c6aa85d94544fab9d937ba48a3984aa5a52501e5b01651d0761148c6b4f574ed5513bd8ce35eafd84edbb8993850ecccd7b1ec0c26d6c2e42040d1419225836d25125c77d8d79dacc60b73855850a7152f3cbefcafd7982a6383584c682065234e7b1f414617661e21ab7ecaf6e49bc8a31cd495da2105962c97c29050f8490c7e2f5181aed2da3cd6381ca40ff45c0de62ae6827a95c19076afad17b5c3e29c1962b8a26fcbccbfba07e317ef38b2eb847cf1b2d01350b2338ee6ab2a936f48f0f18b5279362c8839a81381448e709cbfa738559161aafb4f02a0ec9823d0a9584e2441babbd99f7a3d04dc66ec101fc15d975574ae3cff12ae3907853cad7062471913ec86c9a631826c2bc01fa2243ea23823094abc22cd26b8d73db4f7ad847d1a1c27633f0d321a95fe469418963baa65e8140158c68413ac483d1db179da6114326ffd0c8496c78dbf3684daad8587b5fd889a9a78cfa5922e93f6f309f6451c2178befc4e57fc05f04699d01bb272a32d1a888cc7f6f8380e1f736f13e2333d09d96816199588683769786576f8cfd0b7131778c97729a45947da7f4c3564ed27949aa42c2fff70c09b6bf7091a9291cc48dfdbbf13261a55147124915c0ba992472618ef6bbb7e7f12ad5ddd5e89617c63feaf0113c99d548a9f5efd8c366e5b3354c45428b547cbabfae75c11ed91097f56d19422588023333623085ae7bc1c58c539ef0b9561d12d4126541a244944c1fee1d7690f0b4ce7842714f798806f731db6459465d1d5eb8a1b2b8308cbee60d880a5e258ef4dafed37023eeac5dab635fb4fee66519321a67596b2cf5c8e2e1e793ad51d43a65220879b0fb56da650ff8fc0f79f35fbd889bcb103e8b3733b80a6bdb3ec58aeee742bf295b6d6b5e2a34673cf64df71fa4c8a49fe2ec43742e0dbd80eff49d7bd33299e4b6b106ba40adab701dbd84a53e51ac35f1c4eaad4a0ae6b32741bd64c10ebe267a19f84f94467aa1b93a91880a4a607467203e03be604280a49767c8d6c1fb2bf0bde03912396af8d27e97374fa355bc8443e4c128ebdc4b360b7e7eb92f691fa576ab0ca91f781507c1648cc48c8b344a6c6073b4a918ab8a804cbfb731ff93513ee3d430692e7dc16500d471e49bcf87bf16694d5879f16b0ab2fa3c3d824e10482612c0415561744b6b8c547fa1befbdaa1b43c5f162bc5022c45f14eb2f5e0ac Params = SHA2-256_W16_H10 Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd3b PublicKey = 010000014639bdb1988d68d1e5d8a40f197f8bf5452cca12fe6e802efdffd3aadfc10a30fd60f0911ef2e5c670beea26bb16432f850ba97326f016fd124c504ff2c8f4d0 Signature = 00000000000000239a8c3a32baeefea0556a954444367714d5aaec0b6f06177ec591458a1cfc7634e0b13880a079a9903c7163386b98db8c4212dc4441dfa456fe8ee243e7170fc474f15c28d3b63119d97c366dddf7dabf03ed962d19d9f835cd0b2e7e437fa758b1392cb35e7a836443ef670d0aaa12aa5da63313c6a78d48ce25b57baef0b198547118acfab5c54c5ab49249b5d817e5ce232511aed05878e82b4caa11e0f473237338149a0cafcddf92b1576f8a6357afd1f3b7458d348cc1069b34020aba4767bcacabe7a49124e68ba96e4131480ab1151172af53c1b1d6b9964c2b2f94324b155df7a28b45247d0a15f1aa6020a4a67eee2193a54e969de1fafa0a47270583c3f4af5dfe04860fdd532e9b8688f9048db6427bdd8fd2426566602ab534b030be76ebc292bce8e3667df84bccae5653a4600fff0681dbbeb511b4e2bddcf276e70bc1f856c09e486e02820c9085ba3262f080fffdc73da2d3ec73aac1abcf8b1c09d9019538dc176e89c3368ced88eae6d955ba3bd76a5baa5d5037eb80a1dc6e9730713f06c442587d9d33a5c7785414c92632bdd0dab234e3822423a7f091f51be7906b6e69ed81f2c1d400b3c603569136ae589c5808fbe9a4cbe677b378b4a3e7906a336b11f0e6e917cba4b1c6ede0846b0ba4cc61942b8ad408328733f432bfdace672ebc8a123e9034b118c8101b54a703775cd80c1c33db8cffe7bc02a765cd084bd7ce44c63bb544d89e968d752ac9d558b62f4c01c4e557f9b4735900c0435d4a2e230e9b2a2f6e5fd05e5694f3792e1e422a5f8c4ba3f9cbf0c7888d4d57a1c6ae496731da5c6fd0c3c231fd310673af5db29318c92f48cf6177d5b7a6a6e9f77f571573364cce08c6b6b7c8d400c334edf1ced5d28c6527a87e4f5564ba11a7030f90b0538e14e791c2ed7b10e030be90b40103426b6dc612da739a2063e4dbbf876feea7043f6c755e638dc8b637f0cd60862ad20f7c93693d10ce16f9b0a09e6557943532813559ac747b4ebaf9e1e371e4190b06ce4d105222d736f019027768022fb8c691cce42e9493be96fc37b093cba4a25fc895f3d7d9b3a5899010b287a29e18d869adf3248d0b6a23c6e24c02a41aeb42d871761f6c9d3563984b7abb4a0219633ab3fc198181d5cb4814d8fa40d763e6292cbe52b22c7c491788e1040dba0f195f5d36e39f665c6847d5b9c8cd6a39444e302f00e957494191bf7a0e57cfdd2c6571bf30a995b6e756e05a9ae7781d50daa2a98138e5b503316e79c4554e833cc2fe4ed959fe4a19d2f784972a4f6160a78d1f2251e5f398b6006c65a61d68b21301ecc5d5714e8a01f75d40e00cbf2964645b2fe53659ce65e73ebd356f461488437a54f9db408623591379586bc44f6045b0b7425149260d2e5d26be9dbde8fae24dc191e89108b34c8d104a13b73a27cd15ab73b4656f0dc85dd7fde957ab3a63d54f27869af740cacbc78deb09ebbdbed3b22eaee6896892699316a45228497e5241a8137641f1eae8d25074c72f39009875abb2a720eb43cc0672b7c7a9b8c9b9c0b062ee77344a886648d62aaa1293e4ced1ad40a7eeb914d64354dace5d2876b4dfbaf5850f07dc88994fdafaf0c2d6401efb4e3ac75f6112bce3db18c77262e4cc094fe32fa6fda096e95053d8a33a144a5847dd1d67d5db63baee9e952ed20c67e923b70a06d212dd6fe678b9d84b37ee9200e058fc939562e385182fd5495b324c244e4d3d59616bd3731015692058b1cfaf65b8584ccb12574eeacc335f7eb303d84a7ee5852a60993e7bff1ec9f47723bca778262937c90c9f4c651af84b88d66887355882fe915a150d15f39cb1328c808a98f0f78d6f79516ff258cfbc235d733d5837cae4365790e1cf094c2d5d1bbc9d137b1a521dfb1b0f2aafa950c3bae5d4f238e85864c8d3e9d05fb054fad01724979a566a40f936df9606e2d55f4ba513d429800b129508abde28a6443bdbc427a3c21dc00343b84eb3fdc0f32969ce7fe1c8cec262ec7d5a9be6f2d07e788e43eaa05e06f47e3bd49dfc095f2b817dbbc5db9b9eced5e44a9ca7ba17c44c226665a5f97c5697adb1d67066306011f2bce0558ffbc2381b0cd30250087670815c605b3a60d8d1bf9be0bcc8896f6cc77c79f2c821835091d0d0e1b48ee24984b395e728cff8dda73a2cb83c53733cd01aa03c3f6799942a01356e78b5b5c4f9191a07cde6a786b6b7bf288600f19afeb90a4ef5e6ac433e0d59399434139b92c5c6474d28c8028adc76b450722bfe0dd2c6e2b4ff48a8abf5542b9ef75381ee2f39419080f55a26f5fcebeb10e8d979179a27a108866c494dca245b08cfee5a22fa1ff862e01e635cd1192495bf67538c45e0ef8f6b24fa47347eaf4f4ec2c55dd144e0a1ad28bfadda0bc344ec32274d038ad31afde99f94375d0f75638800aa7fd73a84ef4eb4190b1071b16536948336a32234abb17f6758d14cf89b4419ca04e02d64a2f060d9c53a8cd7b0387542bd0d6097739881aa9b6261827f4837366e4a9a47ce78f3c897a65417b94c33fbeeb4fd1b46f1549e84a26236a22e194a6d38502db9723bbd1368c79de84f5b3abffb1264a2a1e3698b3f62e40c22c0c0c653221e301c85de15449226764c493098d3959757dfd4daf6832c062364aa9c32b92e17a433e8f2f00b9ede63115332aee654cebf492f0888d690015e00e06061dddfd5661e28251a9d8e3b135ca8cbf9afb92a66e31d3639f5afe9dbc99157ed09da653b23689e64b87b93bbfccdde12212cded6a16351f2792c62a51cbe7b67ae5a4830252df97ac66aeec95562dd1ee0a004f7483bc171d463f1bd125b4f3f20e5517007e9b84ffb3602178b5e798d9e179fd55881151e13e5e6ba3c7875b49db54e6c19b1321df4eef0c2878665e52005c285333f91025c56752d51f6f7d5f3cadcb1e70c0d5a42fd42d059b164be984147fd546038178faff004aec1c4ef5c1580881a4a48592730f9c6c51759b37c9d12e6fd941f8a0ed1e36484b94478a2051cf953266fcc3ab37b5de4b8e187a67dfcb639f061341b946c09e270ada4dcaa70b16c013348fdecd782f488391c3f400bb44bef747f660ea419d132c2f812a43b8675ed3dc8a54eab3d29a5bdb26899fa4bda297bf4f63400b268d230a91b8c77fc7772d81cc56b163420039ac31c100209cdfe6174b52d8d41d0ccdea6cd45ae2ab8b9f13bcdbcf44495f5dd7ec827213e6460bf65530a2b805761369c95bf7ecd9cad67861b9746f6e39a7ca4428d8327be0c728ce4bce8942984b27c148e15913044e6c106571f7049d5be55f0d9760a14872f6f021e353f6035ca06a4477788ae662275a60c99600590f04873b5768b921b20462ed3ebfb79391c28b5659b82e72225e913516d751c0a638cabba544f589b71ee5259073cbb44835efabccde6578fbd0ee4e79e9b1ef7834656c1ce74f37fba61bb184b56c0e6354b588a558a5d7d1f95abf96732c72f6e110a3e979105c63ba78e03 Params = SHA2-256_W16_H10 Msg = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 PublicKey = 01000001e9e8f66300e3d663aab7e240665dfd0e5c6701dc1e1820f02170cc0527bbc38cadf2907057362f5c09284945ee2f6852a878517b3444898370de4c7f68e27beb Signature = 00000000000000e1c4d25ea7bdd84e7c95bdd1d3479df59f4050e1efac007ec6504ae2129d1c2c9e395de20ae2413476f3178edf23e7fe7d816cb958248ec2994d3a3302fa436648a26886c2745d339e95a199c85595ea4699b378a515f9f4cf14bcc49c5c5693dc3a07c5b3c019da848de6808d1ad430ae98c765fe80fc8486f42846ae1e34021c9f0ee12a97f1d9149e487b53bb95bc51eae5cdcd88976ac845cc3a806140b747f8ae49e43b641a79f6bfd62d101a0a9359f9084eec4e585d58b1e6fd879a075276aa24cb9a9338a7d12102237a4b28ee0308d3f2ac5859b8109cc7b98a58381451409367bf5d2760b8505115261b46dbf1fdb38835052f1cfb07822b8dc21c6312e692bc00d31bd4d3f63bfc9890e6ca5bc4a3f8ee66f44d8298e90f97ef2c433451dd0099fd17395614abdb1e952735c376a8d1b3c6b13d7c843a805e058ba87a9504ecc526e5f87f3945a98b84cb80d55adbd7f6835e3e32a1760b79bee355d59a7484cda1ec3634affc971322d199a189263207ed192b2a97f2a56e241df9bfde52913577f63a99f8ef42686b31a64c5f30e2fb717b4d8769660905b3d57bbf5e6114ee8e4a333bf7da7a44354849d6166c62da0b26e8ac662acdc9eacfd1a82298cd3e1ceecb90fd2fce0c8639cfe768885d1fd3b8de48b4e68daeab8a6a8ec569095a8b6d9bf1f72e0e78859bc7040cc8046ef767ff4ee3429bd6370674395eae75dd016abf7e1065655d77aeb47fc39282a25259e7240a800dcfc9f911578f702f045c531eda7a85e60e26cf109c92ef29ee860b4109d7f153d085b9662ba4632b1f24cd0d8df0342067fb0b7085c79ec30c05cca0bb3ec1f489fc5593194a6100750864e94ca3e6790476d642b1712f4196a191085fd4255bfe94ef581d931f29c8a4b4daf57fc9b91dda3c61e1d00e18f3ab74a2838d767aed7a49ab6463a0b868d5f4c46c6d7f95f531deda2d4db3e9e9c398990dc894a5743bda0556a753b7f6a54ce4188dad5db3357170d98dd687701616e2406db76f13a2a36130e6dd482fb7b991aa98f0426bd5d1a3f7eaf1e499bdc32c2bbc5b06eabffbe05615493916b0f9150ceb70a31670e9c382a789f588023b1b1fddd047f6c3436f382c924a5d7e6ad253a2fe7562f454162c07404db2afe16d57c91d9a185fcb53b76d4c94212243aa596554db71536e6177680c42cd11e61104628ea85ba17458038cea0823410cdf2d98169d2cf7d3cfe8a4cd5841b79b505281ae1288427df488ba17487053dc16ba4f03d027b834cded66eb12ddf4eed57912fa41f04f1055b4a5f9f9578308c7d8f3da60107fa901271ed11b04d94926860a1c8bf116c1edc90f653e4daf52603f6cc221a0ba305344bb551e1c08690efd45541d28f4fb93b6f27faa5152d7db141def2b13d1b02a0f28d92d3064727d42bddc012665fcc4e86aed43d3bcfaa0202099631d5777fa8f80ec287e286057a03630957aa1b76bb670a78312ee249fd7597a71585d30559e6ed65234e8a6aba43c79a2a9a43029234aad79c18e7e21e194e7484eb6f415544c44bf507b907b628f077766c346a06f0cfc737ef182f2effdb32f19057e272ec5c8298385e40895951207c6e4d1f2dd51fe4975d77325f91e38262a3b4653d1784a5bf1a427c76e438d7d5d6fbc08f4ed3d4f1ab0daf4a28d2b32bea5efbdf03c86685aee220eddeda15309b19ad0b73171d80a4f7648107318bfc6dd0f1add53873840a6baa0dd727c064ecc77a7a19e39ab6764fa21cd3f6603e68724f3b0a3478c202a57b7f79c7bcb52c4549546d6c273669a9dac9d8c411b71b7e9d45ec4661d1c9139daf05d0177c64634fcfa6e7e7dba1a5cc4c52fbb34501fb50185776a116df72911f490950075ce6317e3b41addd89a4c16711e3b488a0202baffaf15a00072b6fdd8e78c52a01b91753468049540f2ed76e6333fb80c0d1a49d53859b5b273170aa3b1bc991987c5f9b22732919861a0d9618b34e0dc0f6694b1e5b9bd981a82dc2885ebdf819bca75faf6e51dd9791f963184c407576c04a35281bfed681dbd23a1e53105242d257899721ba6b69d4a612735d1101d3112a9e99e2ca6140c8614ebf3312ae1663b1a539ce4526e3a3baa15cafabc98df07577d88c543ac0236da8e3327f6bc9bf59a4ebd2941accbe6d6890c4df99646ee84a26cb63f80d28b6f4a4f2d14ae159c912bfa9b9222914e47a55b468ee64b1043e62f09a151c195175b153d7356abe67ee54d09f8d5c1a7b384cc6e306e8ff55fdba90f726836ba373cef1d803044fc5e32f8af09f814e9cbfd55f01a942f27236042d11bcc9a09e93e785091b92b03303d69b7c249ab7003a39ceadbb7582a29062994fe936e711269106c0120d34ba05354e2a99af231f938c91b21ca711e86d46091a31465dbf8761985631877af3cfcd05b530124aa955ccd6622ed4b2509c667e2e402c9bce1d5c253a5467174b25759fe8f226f5409dc8de99d71d2628fd597868e5281e7319ad77980b12504cefa058b0dc5bb9027ba5037c7e967bb1467e9e93bb26982267d120dde9256c10e7749afb559f41bbdf322ffd98dfbd3dcfa29946eb3769ae742af4b86039f7512a308b94300b5282a4ab35a02552fc4958e318e92e62d60e9b65a70a239a7f9b67c8e84b15b9e14926d5056cce601a2c3c1dbcbfbaeef241e4f01bd88e48529f5e06d8eb6b2b5316562b30260383aed373b5ff4590c07183470abb34b035ae1164eba7f4c2ba7453a915c5b260b5905d7a6015f18181f61d24e28d0c09eddcb621fad5b6557457d99316a739a635d6d74d1ef5511d14210b4dae8169a7e44ad220fec3e641a20378ebb663758f275480854c51dfc66b1e12f690905c50ee828d1e6368691fe722ee982400c2a0ce5a8dae919e852154e83f586dbf9c8777faf687fc083786c4353a117bbaf000b51beb3683030b0a716f34034c533e6a76a45d45b7e2680911e930a31a69e85516957d2a5a911713dfaf52fa75dfdbcf4af0cc280f6b0e6f2b7835f67146f72555c8bbae0332cc6cb249ef9962fe0966a6e5567c8798963449f5a3d3efceadc005e00de5264d9427c30a6332c0fc45cdf5af855d740904940795eb20c526cad92db3cd76edccfcf6f5b0bb199824f69d4c7e37bfed862f3cfb8182a18ad0b889743482af08728fce463e8960a6f87130096261d7d27a16ef8747ec4146ac91ee3fd1e9823f3158e93870ecf02d7fdb7c4023b054ad2437c051a31efc6b3cdcb8ffe1dab7ec61125410130a94d893a25550a443e2425183abf7c1fa3d12716e26e2bd13ffedaf0b4564b3ccf77498832941f84cdd0c502c985e98726c6351380e41e9adf5a99059c3d5f48d73aa0456eba1847789d87dcd03a9d2f61f2986d3811685fb3ad6587da37d21224d315b5d4a9ad6f34e50872b283255a497c92292fb4aba03eab487c8310d39243fbdc03b6f793be4b8018d1e32b94f73db4be92faa03c96819596137840dff00b4686b92a5ea5c4aa Params = SHA2-256_W16_H10 Msg = e1868d1872e71afabd6e51c6c154832ebd7d766da303514dc808c0ab7d7697674a03b161c813a4d33a634c70d1d50738d6fb41ee57a4df18a277efac4fe089f697987d7e9ac71c693c82fe6a2bae440a1f34bd2655d958408f7f7963654d12cb1e62b0668eb72c69ddeda3db8dd4b78c72bae5eac282809b4b0b93133984e19edaf96e07e1c0b542d6fbe58fe703adc786a460851e5381550814c8d0a73e294817d6ef343ff17d9bb7ab72dc3a76b538f7ccca6f154b043ac9addc84b8810f970b1c622abbcdb47a0092ed40d5f3b332773e9eaff5df050158e0ff74977074c5c0543bc92f613c4abd31c3366b904121de54212437151d91ea9220997ec3b2e6a8fc02a510a071374d761b23c0bc6e3540c5731a11c90a3f103a PublicKey = 01000001608f3f4ee9ebf93c3a1fdf166926042701b7df1fd38a49bade3254a9f40fc054793e35ae8344eadcb817a9aab91213ab583edb4c2a6ed7f8b8113bab4c0b4fe6 Signature = 00000000000001ae4b23183ad9ccb437c405321640d80a8627e3e072936006031e1830cd8236c58d6820e7a3d08d30d516dd0d6c539015685009579fc60e6cc493ad8830adf44ea6c4eac4542d712e02147cfcfbff33ef0a856b959df622a48d5d9cbed93de0f711eb70ea3450741e2fb3271a58507740f157a751dd4f37ea021734bba9913055b280f47dfaf574bb44d54541c2495dd9ace7f6d4c0966d968d0c2bd02a1b91ae45f4f6c5484ab74da19d7dc8f475b24f84f79888ccd3f880ab59beff67715fb0c96805e08e2a2ff725791cd435a153a7b115d5d47ceeb55f2ca5e74eed7971b6428bfb8ebdfe628bb11d5547d3a202ffaee65e5419f709de9cb518c1d3b7d288b6e4efa7a5b0374b357d824f02680f6b6a7ffc6b8981e3b9b7066ce62edb13d9cd0ae1d3913c625dcbbbfa2c738c62dc46736eaf4ced94f07a1b9f17cf762b08f4d023c7bb111abdaf9a1e0db284183337cadebcaba4174e0a267db8ac88cf205c7b1abcffa136095c0bd61a9f2a10fd9a89b8c6950a6df602caf5aa7998fd3e937809dc7f9c6bf3cee9727241453542c472737b64edffb471ee72256736f3e653248edcda38989c9903fe80a1e4fbfc126ac6ccb9fefe13b87b4e76638161554abb9a5fba843ee7ed97bb738d8bdc431f1bf748e24c883bedbd3f196bed94285b69bd11d8ed289edc2c9578bd600c539ce6105752d6d5e47401c9acaa9dd08bef85722625dd0650efe587b4ad847552902fbc6fa870e83d4d9ad8064607ed7ed6279ee202d7968bb4285c8d7ae2e3c8c2b4f0cee43601c44fca1155802ca21acc2699ea57e98f0cc52365132632aa946146ac631877c07f98af64b1ae1629433b007fa95ccea8ddc56241652758a2c92077087e166af2163734dc0ab9be16556e93d3fee5d598398cc4435950758ec22c4901f44627177355f33f760184273dd9aa77caf7d6a54a7318ff8d586cb3457fd08a72d63cbab4436951ba6d09567643c2b6fd860fcc500b7947336565e317b334bb268d28a73380f9cfb90ea3801ec01788fefad33b08b27cedd709718f0cb4e3c5acc14d63f629574a93c548a544acbe6cae470927143ae25c836804f9e12ab4ea820d9c0b5856959fefb9f746c42c743e2ecc785e28e0afefbab74e06433f3f3eddc3ef80c1243fecfa7b4f0fbdc640bd0ce6c342cb568cb7a3e8f2b39a2570ea982cd64609625a3a3deffad9053b4b432cc3eee364d4de5d040237c86fedef2aeca73be050b85dcae32d8e26d124ea9ba9e0885b302d7944237f697bdbc55ce51c3e15e9ced1175cabe53c6fec4f665682ec9519c990918434a62e1ef80e6c54eaf0e8ed2229763f497aefae28b830ab259143719719efbe145fd26974116fa0c23230d658bf69a7e503d2e8d70ff25dd4ac27538c1b5bcced95ffe9d23fdee6b083f038972f0468cd106f43d8238bbeafbd21aa5f3cc9b5fd28791398dff26fe7e108d9ae9f505746d41be44fdfe7d0cd2974a9eef5b943cd4f8bc98eb385ec8f71446772fe19408982e96e6ddea5326a965181eec3a1b9207be0088ad3169b8f29b1e89aa7d7b0da4c788e6dbb329d8067666f18690f125d117f4987bf9fec1f5a6da04a3efb5d56b99c2c6597e71102d3344b863722d164c217e4fdcd48a3d9cd212c9b17a4df5217c99576d2fcb14fa99efd37b4ae1acb00a836055de4e2fdccd8dfb22f1e756e456c10e194e7043b4cfd588f9e2e5baff61fb55c07e4091a7a00a0fdda99dbf3bfb1b0b816fcb0c12d8bf613588f4e6e2859ae3700325e73b0b93ebadb38658362a22cb2c4afd27d3b4336301c0d0972314c9d8f09be16a7b827f56e13704fec5296ac387184d694b4296b4f0499b0353be042a31456f693bdf52e1485b5c516d63db87c252934565c317f6da8ecc3db6c4ad6b120d877c9c8699d478bb20356ba566a3bd16ef20b57beb5a7d72106244498cb3742e79fae13889a1e31f138f883a788416d47ffd789706ba4c364d4118a56f36b89adb7551baafa7b4a8d683efd5cb19c8db28412bff9e2223a10a197119ab851045a941e9014c6532be5cbfba81f18ffe367f342e00c57b6da1e132c7cd8dd976ca8ea5ca9619db0cd24eaf706a17cb5b6ebdb712e281faa9470f97c283903a8cec94fa8854c6aadff95c338727103bda694120948b9af9aa9f4befe8a97c1051fb3fa01b147a7f59e7bbf4f0e1f0f623431385fd0cb05b0e4d26e8499676486d94d89d425c519a87ab13293a6c6a4d240eff93c0344bf4f6de1b152f2b4a2d09a8649dfd073fbe905a874df02bfb5de6ffc9b9ebd176b5c8d645bc7ab8d78686bb4f5a317bea9765cffc12d42266297dce3f4cad034d2dc207c9b9dc98eab98b06cf215ae2835f99e9ff1dd0bc4e8673f3ec55d2adf7455d7b47dfe3af62e608a53538650cd1a6a4fa2dc1623ada894d39a67f418861784a8eca0d1e850b5ea1466c78b4036eb7b579f55f2366cef7df790ba6406943a9f821b6cb618e1ea7199475a1900632d0450c7900ae92da47b42ab4fcd9cff9dd59dd3d1a69df470ab783471d4a30b5e200ff95111ff48b7a1431520bc0f861175b0203bb32d6485093314227503cde739c0c14b5d37a16641e0ff61ec41bbe92984a55d0d176160d0263059f2a88ef336b9131a17fcdfab2763259d293bf0ac2071a10aefdcd593459a4c161301559cf6c3f039c5c781f261474abedffb155053e02801dc9b175ed6621028ee58c551b6dd56b671bf5d4ce4465189026b682d1339e6dad7732c498c02f96614ef7d3df41ef70e22c6789e919bddaea3a3bd00adcfc3e4d01dfbf0e40fe6bf40e547f9b8e28f24b50d5e7c2c464a662235bfed1f150e121e56912b2c7fc09fd696da49d9496fcd96cfb36185be9b9011fbe40f013b2cee4ef9d25147005ad19e179dada468bb473e4a43f6cdbb0fdfdc04884d77f9c7cd0f9563c0252e7a0d7b374044e195bbb936d314478dca4c8e285026b4c0ca7655a3afa74d47182709766b0f6efa3f18cfb52d3f0a559df4b986a9f88a16250109098d3230e9bd29f9a9eed92e087128f64a58e3e73317605d4643ec076b5e8dd4837f459db039c58954d81f8dea78742014896c7636073d7df519472c9a1e304ce6fec058d9561b8f4e42fdba8f634427c51d947d73832e0fc808f3c0f37e11eac4f2da2841b423efb9d474c70f6bcbd7010c97fefe79797b9a1c9ff9e89abf2b9a0af02989c5ba6b3ff89ef2f9724b278095c189d9699480a117b175219249f23e9def6e34672752ddf3007c644e15bf319ee8bacca980dec063ee7853593058b591f2a2a3748c21bb51ed1cc17d2eb13d2b5f14f731a6be1dcf62f96473c5b460bc3884bfdc5dfb78d22539888e1528e40a5310245cbabbbbf39e48e42024cf2a44ad996e99f73aaf46041f9785415f779f02baf442756c9f4a220eb358a6d844ed75016147636e16e01dde46a45d05901e6708cb8f5e72d3fbf15c4a15c7982c8ce5b30b5bc1acddfca0e0288f4dca93ef716751f6 Params = SHA2-256_W16_H16 Msg = 1c281fd8751cf07c937b53d5983b99965ab4ea03399ace872ececb00a38b883a21069b32fa4db96710c7b666044644ee4c95 PublicKey = 020000024e878f70624ec389188f6dd012d47f5931de8b28ca8c6f48010d51cbbfe0e0ff8155dba28e73701e66e224e9a9b2e7a7434baea1a0342a8b28c12ce27452d9f9 Signature = 00000000000000006a3ec2352f3bab2c336c0f26c6da0234e334bc5083c609a873d34515c4ad42fbab83013250fa7f3148c404bcaf6477e1f5d7acda8a64d84212a273b119ea9880b029da7e87d96a74be8ec99dc55a179d9e8be75a740a58cb8288fb4a2559137cb7dbb9878a81e1608833eab7469be1eff560b4b3fac5f7d72248f569350f5cba9d6d3c246cffc16efa0b711013662f8fbdc10ffd3bc64b4d6bd66f68960a61b671bb349e1d6a6322951cf8f6016baf32b1329a803deb7f291e518c8efab10ad6251fabe59ea55ac64dbfe4648000523579c9a99fa517b02554fa9632cfb1fed1e8ceaf0149fcd199b374267b945cde850f40e87fda6db5922eab3c091a441e5985d2d86241284ff47d04c0b46b4dce29759916a6c209e7a0dc951b634da7c2e3064ea57c797220d53e9b51f6f126a384a7931cbc58d5bee29f5fa98f9aaecf2e496b1bd6b8b60c6bc619ff0de99babd335dd49c181e07d19ce9ac8413ae3a7b3c67cd2245d67928dd41f967fd903ff0a63118a8cea87b252e34d15804e2574ddcae8ddedae6ff75d1e26f30b3807b4f42a446a02e3479cbe4e0867e46d0ae138349f8efce11d43b22951df13efadcd86edc81ba252c64ac9d572122e9f64cb28db9c185e82e939cb407424eb8cf5b012166297295ed6fc3e3735cbfbb959c530c1ea6768693dadbe1f0c1aaf8d944c6fbbf53d8526d22dc0c7e2b4a668cd764cb8aaebe9d6736e3a1ada624431f0b76506505c47106532fe4cf65ba009a22a3c3af771bd62ebffb2c3b69ccca6f754056cadb01e59cc7662e4cf9ab1c8f1d41e969358e0d8c88f0b979335366552c9fa977044d28afc8e91ed0f51a5c6b9d6656a4e51e57eb72d8a4195d9571f06789e5e7af7c9e7adc3c0c4ed51d7ec26a533cba6e826331b28471df217d6ab833ba5c8882c7f900d19e51a683120d72e989c3055e27f5f90a841c0fd7b4e235131f4cdd2b52b6f6df72745ed885ddd6e079c3470c9ffd827350afb7046abdb39ec70a9839966b1f6b3d425ada65aca0a78b866cabdec3d6e7235ebaba0664902191f0da0a55acf8048188dbbe9eaa457640d8c40d597bdd9c9d62796ff2cd97778448696714583333c179e1fc2e7143184eecae5eae895c640d35dc4659198abddd9ffd123aa7d51899932d799cd4717ff9ee7871e5d268268f84e8ac5a5f7f324886027767ab4e752da1b8e4ff693a6d03527f78224147590f73bf34c753df920f4e241f338194c66bbf1b376ab47553e40ec82921d9ab25d5c606c8f881c3c70b785368ce8ba9aee0c59d18d39c2974c50a6b266488a5a6c4524e0139c399f84aa2b69711fc42476eaaa1c10584c8e208e5d563eab1c0a19f52cf8a595f17db001e1d3049dd683c26e7c78349b23d4d1000c9ef8eecfec76440a2242921953fd69e772f0ca2c15e91cb3b1b191f9ede0c026f7cbf0ba8784bb26e83d2f4e0833e683d590cba7d0c9400180c396531de01ebfd2bcfa14866d75ced3ebe1b57c7063610baa651b7573922740b5b8ef88667c57f0199fbe418529465d7fdc45fa08ecaa08ddd6baa633b16df1639c099c51225b5aa4c73d3b42f8b3f1a2e882a420ef51838f525acd8dbad3cfbfe870fa7554b6142d4413bfd30c1bede43ad898ec1b40c8cb622552e59ed013c979b98893d9cbd6b9174db6b1966448bfa592ef838df0fa8c5800829576235047958bee7a9e10a6a76584f3054a2d462da72e56d61513db8ec16106b9817a6c8061ad5a6ba9fce07a955079ea6ea30ca51c6dd3901a182d4b9dcf7b8cda6c3419af210ab8c1ea4e5c20ab725809a0aeacc0c564e316e2b8cf5778dca097b42cfc16fa1e3a4b63a66a774511349122570ddaa002a6281a311fc4d8a3a82191255f2d1ab7e6d807fad840e6f68f98b87541696310942e597545b45e9f5e4d7f5830f49839637a35dbc61579304c176ddb5a1c2e8fb60ba386d0578a2f18b297af9fde20b122c21ddadbf8244ea91acf84b6ff6ccd5e3a3ff19e5cab1b467c2ade4e60c7eaf927c944c746a3619d95625d34170d2526296b7a8ff67895714217bb5294ff6cfa4118c2516f8286c6005e2fc57bc9f71ebb232396657ec3c327e64310e06b3a60790df0b146b5231b42834336484f661f86b9fff152fb99024233416546b006b0fd42ba59d0bee9a6b8c111a9f1fe9dc19a14c4b8019173fc0e92d3ff9f695cdbee185445aeffe41b68ec61b94d9236c8c5f54c45727e06ff49dd3bb42ce2e570945bd3cd5286a50416e5573e8d68079356cf61e77d344b2dd133aca828f7bf6d9d0905121af57b023f5fe0541efd6b633c9f04864d61c9096980d1619381ce8f51983a87aa4adc8e9bca920b5aedb8e23023d2d66a27a5764c5ce905e62c0f654ed549aacebce1d4434bf0bf400e267a6563b95cd8e94fe3ad119214d26e4e7a0396d7d7a76f80001a7353344c5cbb80461df9c06f9ffaf765be4d269417e1c877140a69c2feee996bfcdacb01a382ccddf6ec98664624421febe8cfaaf6945eafd6ab4b5e5b0a30e7444035521bda8c1b723f1f6fe9b814a5686cb20b08d397ff6ca077a50c96b2e7072162f6aa0f6995eb67218967a731a5e795b235934067d54e7755e32a86134c27c53d91948856571f89fc76ab9af9fdbf1c2da3e5c4fe01412bb9b7bff8303a9b223cb3646e10a261350340e9b06d5e26fdeed98ddb91cf7dec65ac82aeee673f610699c20701eed7d2f89664808ef016b4bf8e122e3df9033bfddec4a7cb217c60b846d516e7e46c901b395668cee42b43a9b9a352a71cc51ce730e97e384c322f5c4a603c81b29ffd7a4b86bd7316e2ca4f04aea84d9e00caea39e1a1fed6cc1e04b81e1ed7fd044cbca6743f9ad1bca69dd568b8c79c9a5453c9d43dc1326aca885dc76ee5b237da11b3e47c456ea6d133d86d6a52e3b3f3e06ccac040bfe5b37e80964f2a86bcbbeed905fc5d3862d7e16551cf1dc4fb163140e1ad6e04fa0d9663d6b973bf0068bf30d05b1ac8a4df193f2cdbcb46311d81afecd1e22d848004d21c0a95cfeebaf54ebf37673b5f5f324bdd7f2a5ea05735ba954e474f00e17b5649d1014431119360850f42a9dd267ae73755d038d9c708378902652923d3d6a730a8d89a298f035ece61374ab885a2bbfa05cda236388d1552d991b5b92040e4aafd97ee9980e96ecab55cc1100655aa02474e3eee9f91d3c9156503f2f444a3705e1acd53b26ba49a6f7826f3ac48125b49a2e8ddb6dafd2947617ed3079e1cce93a90446f133f6fb741b61e5d5c2eb9942f0a1a0d27218d45b946d57f77ed7e709a86fce2608ed3fd34f75b57bafd97fdf16f6597d6d33a3bf76409d374373de2a632fe40c06f15360cffdd9a14909aae05bed5bc07726642b8e843e3a360e6a0d47c8578d455349fe886051d424365136d75162096c7b8a069cf3ee6f8723be1c85b5e8ec75c35b7eacb34f8ef7084965a6058aa575c496e5862abb1ca84e84b69e4b246fc5d856dcbc441c294ff667ad56960d36b343c71e69b3f820810b6573a66f90d437ffe8e0207a048955ea9c9f4abedea18f9ce48297459a14fc4edf509cec25e66b7622fbc89a93c02a643ca52e4444459103ea1c6d6bcd5fd1df2321cc7cdfa5bdefb0dd94689721b0b907690eb79d91170a60677a87eafb83c986d762b0e768fa5870fc53518ed59036897536c37c7cf0f9315ee799f958cd0a0b693e0212eb95133cd5afcc0b8acf7f748ee8e47b17a323b379aed28d801d340f3c3acd15c3338c68944a993dac7d7aa11f181d Params = SHA2-256_W16_H16 Msg = PublicKey = 020000023e30eb8ca6d95296d17821eab7812699dc7ae1a3ce4277fab52bcf5715e2ede417ebc33bdf87d8db1284d4963168c1033a3b02aad245d8513e0029c64c098773 Signature = 00000000000052f2d003a396bb2b952322b5c0291ca446cae0ecccb03b3994ba6d49de4565828662e9062f45f897f16efc9a9feefcdaaf2407014ee5fb457a894f200baf5750f61e8eec1f8ee647c6212c7f90f86a1cb950361ca3f682a95b20c11b173f91e8210477cda93eedf4638c94c43fdacc2867dab07e46d7c7e17375bb3ff3f2da9a1347cf0163a4a30bb396ad01dd7710ac69431c0e6b0183ce5163f70ea420ed2c4dfca9a7c5be382e86bfa906989305445e19a413d686a083de065bc8e5bf58be2cebbc2864fe7b89f4c2fc5ee9ba88973a28f5cb0ca3ac50d3e81f5cd14678ba7b019b817baaa1a7fd6b6ba2bcae589545d94bc458331c4b281d3ff56768af116cc12de7cb0e4be1ee46358a28e464a9d0e448197526e2b539cdc2042de6f6951914a8ac70b2fc74b7a58c099e97bbdc5506b9cbbc0e716ac005700df7c3ff0cbbe769f62eee44a70001e713e117d868b6a29a96480809eefac13512254596aba8bdf4b01cdf6473a74b4d5b46b9c48a4f56308db1a4f84672d494ef20ad07fffd09554fdedc11a466adebca9f2f4b9186eaa9bbefb332bf90e0e8fec05fb9e53fcc3be73de008275b3367182a0b8761b9a5cc826e92d09141d44d46676c44d4e92d43f165731dabad86aab623d31532c00ee75dc0a41f0d9960faa95042ea90db69b5e76c318d8865b69f32215eff609bae6c3a9ef53be5060896f0f6066e2756c8d8df9a3d89b9ef6122b825aeaf723af282f972dc4ea4f647b4dd5f80de4e0c356bcff7c790b8bac0888dbf3c0de43c1d725ca12c8d5f84e832818e90f2f68e411a00ecdc3fa72bbc917583a00674878894c6840b2efe9f91fe48bb78fbeceae658e8d4908a754386b36e60f8a249fe86f7f78f2a2e717127b310a4b812c133a1043c7ef7d74a93017f614ddf31c5c3bba958dd212d111c24dbbc378248963d8e2c27b4e69cfadecea53650ee4e6b58ef64d2a7379804f74da7c736ccde724795345ccea282c31bc88b9363895161d7dfc9f306a616a90001f4bbe03bdb0136edbe53d8e46badf558be39758d6c010e9335df7846b6a6d67372fef32656833fb9c248b47e712463af02dc5b9f7471b25362070712b2fa2c379d798e6ef590fdf989deb8ec0cc46381453aa6d11d80972f433a0318ec7bcf9c09b02e25970994d0b0e8473d0532032310d2379c7d0d9f7eafbb040a1295e955dda636147fc341a34163589d60b7436e0bd7409497df5cf64145c84247c578167e480809405e70fd513514a90bc7274a24b0e96f790c9e12fc0aed94b3a069547f1fe422c4276c10c433b8b3d6027dd7ca9cf58dc45c5138180191768449144d04dbbb834055533e90616e30276ea0d8f54b28ee0e78c682998d53c3fde48c59367d9e9123e4064d1df3320dcc3757ed8a4bf1bb41a5878e559b585a74565612a38c535b0a7d2c70386c029cdc906827620bc5d2a4d44d534a2ce7fd7c64bdd8ec8fc13d3ce60c801abb7c755733bba4a4bb5523f5bcaf89cd4be958c42cc57c331244e691f7dccb84728507cf1161c06122089c884cc8bc2ea210f98fdc59858f6a46225a18960244e8301d88bd5166affe0027ef507b7e8973e7d85f2c19db660f0bcac22a1aec600cf6c823e38d1e3088bba969211313d0afe8429000aab9161c27aa3c1a0af4dd433379c3319819c2395e41e4ca0f27ca4f6264c135fb7979e8097333941b8b5226e96a57d0b9a786d15d39198b74dc49368656c2ef4cc30002536ecee9895833883bd7e7fc33e4a0e3579f7c942463e3939d1adb4da7639685ab690f1065e1262fbd572230bbc18525910d8a591dd9ad628f46421a72b3b8a73f343d62a31da215a617b0d928b123242daf6608b3473463f53ebe089b66a32f37f4248730512339088e87221a035fb605afd8ed48b0eb30ad75eedece12e5c5c76498b278fe4bbaf7f233fe95efcf29ebb87ae891adf851af3af945af524cfaa05fa5c50b913acb4d1ece8c71c60f5513ee4bbb67c5422234e2371b5393348aaf1f0af5bac5534558acf81273bae97265231dbefc6771ca4556f16b4afecbcfaf3f35bd22af447ba3960a999b8c73a876db02ca54f85abf8830b772e5acca9e172fb6b7d9302e52d7bf2ac55867da091c658b3eb70107a9c55595df7942a29d8562214680607034bc89a39f7dd34befa6d77cb42ab6014837a30239d83b40478a7ba0eae3ae4efc150e8990e47d5032e2100f72afebee3ae13313c0a2d1d80a880f0edd3f36d2c454f082fc5e3f66949f0fdbe1857c3ef4179ef831b246bd3eeb701b8d0dee9c0dd848e80c36819670f56267d1fbd27dd060f674be9bea91bab7367b8622cd32177c03c2cc503453e5d71aab0291e16c93455cb294d2479ab9a02fc1695a76d47d445fcc19608aca014d7d4ea00c17aa31755269fc52676747b91c952bb6ac98525602a888370fa4d8ca35ab45f07d81a9bcd9bb84a8bde63b777cb2e4309203c74baced417b5ac343ac552990990e9ecaa89a2883f4293899198857ef2e3524175df7bc1c89ae76e1a1dc2bfeae4e66e35f9b482967fcf1037ddf4f0f8be4ac7756c688444d9e31f6c2e9df52d4259e43b5617a996a46123730ce15f086edd0dda0e01a2563930c32751b21584ec61785a1aa153d3d3d2656868cbbfbe6bc9ffeaefbed14041d83cb4b2b056fc26587e2f96d38df01f8819ebdc0749014026dfcbe40df123b9aa2f12826ede3a95a1ec1a732621b966d1ff236f34946e7cab66ace3099eccb29f5cf9c097b68193d3e7f2b34f909b4787f7bb577a72eb6a46b38cff72e869cfaf22362491ad4241f86bc3c30ea42d5d487754648c1751bc690dc93e45737406b1870c9418b921fca2be0ee3c4e2d4cee36323dd1cf7757c8236e7c01192540d9125b1c1fbc7cdaef5801758443456b577b49e7fea9d1ea9b877eee8d4010c029303361ab70a231177c95f6629fb3c4b2fc8ebf884ac621c769295a3c8bdee40c79bc96f40fa59ec9c5e2a2e16609253942ca21cf3af4bc172e3914d5c142f3e91d65bcaf254a31f186196b8995625c7b5e8e19b25ca0f3ef08a0dda9d1b95c5fc8530902508c9ead6a9ea5cc1936420169b99913de85dad5c1dc48e124436da31be564b88b679e8b28ce24830140acd5fcd9c5abd5f7d02f7ffeaa5b35abc9ab68a57ec47ac09833d6a675884de7ea76ad663112492c1f539e723e74d6d55684a09272a67bcdb9655678b9733b9e7ca2e28b6c2352ade541179644a15efa2917e80ed7a3e30c69378c12d4574dd91c127033b3ddb18ffcaaebd18eeab621c6cc27cb5498846da7c4f11c0c8fa63db8bf9bb5163622392894d0cfaf82dd43f5652a89fd3218b0422c546f350598e2fd8cf534cb71cb6a43aef7985dfdec764ba0491016b66768ea61cd596cae338995eb719401cfa31235e865a62e1a2881f1d0f9acd2b78f5538924b29b71111634933f6c728e360b1d0d7e36f765caf67747ed08fee48df518b4e8364ac8fa54c8a200af7dc2cb1790381fa9bec1d912dea4c5cad154991aeb36c3e708a66580b679ca7c177f881b760076e8235c074f4d2ea54dad38065ab9c93af0dbe049be4a35c77ceabe34e25db6a2efc52226b9a4542b0ab3f1dc7698e64d1802774d8addb63200f1341652a9d3ca11420ebf0e85a3dd56bc991157aae79d5f9c53d68a26dacb74ab04e3c8e4f7b799db8e146c9bde8bdc41153493969ea2dcafb6aa5d53fdf297b0fdf5a00d345ac0111b220c953aa74e50d0fcf992cd0ba0f00a179d7caf553a2b2c1ab56336c Params = SHA2-256_W16_H16 Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 PublicKey = 02000002ed199564625b97f78ed0d0612270209acb9478085fa06220fd692c348e664d3a3d230def6b5f2f3843e4c0785e7979ac434b6dcc39cfb4781c70be7078425435 Signature = 00000000000036b6831b926b865fc19683807b6241e37b11f4c2d967363fd2e896535f3d2c4f0ce0ded210dc4d158abbb430570b874c7ddbd8bd1a37d463698dbdd146164bc5811429c327fc9e82827f77edd7be211a6da4ccff1418264f2b9062ee961e122323a58b4a0c597885f493c9d06c4c568adab0adbbfeca62794898a60c9cc654f910413d87fbed9db522b5a9b8347e4bef898f17464508383c9494fdf1effaffbf1a9efe10b142c76a1ab81e1e461e6078bab16b835493c232fd1d596ef410dff45ce42870ab73aecd8c9944fb5f65b89da6a48ef6d57ba6563a5eafce62d23b636f9d3a9736b2db749ffabf92d005bffd01043e8a1a01e2140390af36690a2d35d0e3ee7480cf564df6e969a47914d84cca9be5965cd5de1fa25985479c58b6c56377acaf6d886569c71ed12b718ebbcb02dd976a34c1a2c6ac4aeeb9a6177bff75a7da86c2a20aa5f123ad72eb593d1041abe236e869377552ed47bcb82d643a2ad2436d1fa6582524a74cf82df883a768932300d9f3a655579d32d381e73afec82621a768952aabb165c1c0cbefcd2918ebf7e9fe1bcca99b02b6d141239ec991fe8c124ace6078ab6f66a4f8cf2bcb792205197b0778122cf171a6d1b687c1d0906d6ab71ce68a29d19025e36ad538be44a5f8684a87da70f6dfeff94e7c375ced5efaa16aac66412fa4a0a1e55c61b794bf6847b5452a0ff4dcc3f7fa4e54ad306624864d0ffaa6b5f73abf73e255e88862d50ac97893f70253e18a6baa20705648cb8353e8f27b3b730fb2044be1b01b569dc027988821a9cc8c0cc18ac404bf8253ff13d9aa15c4b96d55c74893e0df589e0eb0f5bdc2c92486f49f40e9bef3a9a394fc76fba0e4ece57ea222ab3a1ea9a5209fe4bb83282525ade2920f6c0856b7f13af0c5951c86e6c8504452bb0c65a0b9e5ffe6d841e1fda4ff844296ee21ee7ffebdb8b8dd5b3d9810a07df036d06c24eb326f877048203c7d014b7ea3b32f19407c99d44fe42deb0e0407eb8c6b91e391f7738d2292035ba3bfda117ca959bf763128e6e6ecfbc298ab9aed07e2ef23fe1e4d695ee4641bad821c685d82fa7b4af9b68bd9f4a83aaf26f8f402de4ca5298da9f205947bcc3e7c558e138267b84012afca644cf034f9e92e6c838b3b8236eb95f186c0c1f6e7aacdc18f278f99d909f34db2fb166a87ea02f4e3791eb0829b6362567f23cd5e2f3996f0f0fb00fb67ffada971155f577f9ac09c3ba8859731a03cd225a56a26cf2395b340ebb86f88655fb2b8f5f927e934779971c3ee018cccd565632972bad542d783f05be5a7f786d839c43ba61869ca662b3a2691cdc4ad6c78515b3b989132002b91b6ad7d988240d45db2b4bf7b016563d222ce5c0b050a7a0a8ee234f828c6de38f154a71d3156f0a231cdb43d8845cdc30f351b041bfff0692d532b70e62bb4c9e2fedf99ec0af73f619349bbf75c51f67f2b590d8fdfb4c607ce2fcfd9ccb5b0f821371c788130350b2a840a52e51e5f2d5723dc5d42ca4a5af528ab797948a02d7abb98b49fbb5456dd5fb910a43cf61a013b1511e1b7b693f161d69bc8105464a234f3823f259e7e915e48f2a4a03d6a5ec6d49277d803445699012e141f85b5ef88494098a54e20ed697f2bebc387d0c3de114530479abbe004472d9d50d45804f525c1061e0bc8b82f6a6e0cf07e8494202afcb7daf91163e9afe45cea73f13953c48fe52f384fd053eef87a485eebc1cd2e2345d1c7695c47a57863eae4a620c210cfb6d9a62fd06e5de321f40a2e53f928e710c2026a6f4cd773a682809d87e070ae8823431da7c5a2d32356121b263ca73c6e8cb4b7d8ce593f70166bd07f94778cb2a5a957f45ac61b37aef355a4c378ebe4724e4f05c12177f4937dbc1a8b107eea62c15dd2f62c461f05f0ccd8eb6482611f331a50bb35d5ad0e13616ea5bc42da7901a5a59493d71e4bcaeb805e6e53aeaf5bfc8b2624534b809e2b862af5fd75ca8b05583ea4f1ade004f21327928944852833d2bcdc0e25b04b5053f028bfcec018a47ff5930f84075179f645c2f8e5c2cc2be57b7e1760a425f4387966e009ec2bee3639a761b4caa097909afc2bf944b62d44b15882982976437ae025e549e98c13fa7d4a181de39b391c516b45ae0e1b2dc477140e1428a0243023c66554987c0e6dfd365173c3af6a86a63b1018d1108b89d14057eb6e217906214c68051880654f4ec4fd67b5b8f8629c1f194d75777292128158142d5e3ea381cf1b02158e46fb185526533143153465a4333af1b5b4f29f5f8b188f9e284dcd20803b178f7cf405f0f180d24d1bf9eec24991ed5feb8454e15adf0756d0f19cff1af3432e9058e83c3d12c66d5821e856fce9bc2bebfb8d5e548ae44d638ebf6065b0e4413b6ea700c3fdd022c238933b47059ebc8b27dba93558b1508e6daa9cd5b5ab8f4707cc60550133d762380f55d19541722d55d3fa6cbc9e957cc1ac916ffa3c3071720d4f0d899c6b0b227871c2b79f84ca7b496f8b48b95361ff5da6584f4a443553217b267207c0f701f055edab6a1e4e80008622565da1bbc98246fb76fb86bcde76fba3c08da3062dd78cdc6608aebd40d885af665614ba248864b21eef8c9eaa941b26a0f8c47ff18a3aac4285828790befe6277193a4b47e2190dc2e8fd45983c87e086497e579157ff8639f7ed9ea4b6993569d03c7ccd875078dab10df749cbbe6a89a9311a6c31c3903e71caae7f60c8e0e15e9d07b050ff801e04fd0c9f4252f1000c2611a98862d44926ca467d0067987bf09ba135454888b1a0bd2ca9c979157863697ee34d01fc66ca333051fb44e423a9067ff3dfb9411438f34f7e217a291a389206ff82168aecab1d79293ed26260b83570c20919a587fee93d919194e2cb9240fe44ee12b8887c6b592480321eb81636b4497b9dc8993efbe2d06bc2788b506fadad3a75bc100251180c5cda941de0b416592fe51ced5f30f45502b1a8533520ece25713cf385a64eaa3d7f782de7a0fc6b2dceae210bb8ef3a45c76fc99b6bb201fd5cfeb79975ed5fcec11a37e3009a12773d3ffdda417895e27726a315b12d5b12cac06e630f4cae53d169137759affad0b7779b7290e30db0251d48772c0cb961cb676079f4f0f7405a4a9aea2b40dc1e5b0d591a334dadc8c072ff44d2f451a06b7ccd469be3041257614e0c1f592b3a8d486fe650238a59987c67491d5052b65e7270961ac7bd77f649ec1619dfd18a9023321195f401d830fe27724fc74442cc80502ddba018458f219b0e15805305148ec0a24266a110606b17c2643a83f7ef1b1ac30be91d8792c985cd686adef939cff629ebb087a8cd4bd74694405a63cdc9200cfb4eeae8ad8182cd4b60679ea818785f277e6ff676469ad9fcfbc3adb5c8c3fe5dfb2ce07023a986bdfe6d3e9ba778f32a79ea25663482a8943936821eafaa40dbad5a9ebfce7b985d0ce005ef55fffec94bf674b218ee3ebb5a10b60177fca9a5c1aaaca9c40bf23d065de2ce89ca43a0640a11c92ae9d47088afb58678eecf7fdf8326cd8528d3ad44a8a06ec7a61fd3dc1d106872147b62e11eef38d10c52458ab1eca59f3f3d09a12314ed4442136a18cb498f964d3a6e13e8cf95dbb4e9aa81bd6d55a6d491fe5f478557897996cba7924e10153d0c6efcd1da9d8f8f81c0f74be627efb9149b9e1c4553a32fae92f6e5feb621c393f2d7f52cb36da86730b53c292fdaed4afd2e5f47a5313c3d2c3f04ee9beab7be6558a9d755fcc663bdf9715be3d892689 Params = SHA2-256_W16_H16 Msg = 39324feb180aca683d995db187a075a910d0 PublicKey = 020000028d564c98b0fe8d126d65e7fbe5719481410cf097986b05951ae132e7bd98b319d84fbbd942b1b07039fc41b6dc5538d2e16882fa30ee1312d736b7cf1fdd7885 Signature = 0000000000000e8d75e42757a5ca9debea37a39aedc1ca8d30f89ee5738e2c19e95c5131ab315c7ba022f447880fb8cc87b9b2ce2a98d1e79bd94d8e4c76067b76373743e0788f2fc9d01057751418c8a71289b7ec8c5a4b2b0598f477cb8e55c07ef55fce5a645089e2ff85133f7c50d2109e40c873a72dc6946576e1fd21a0f136b113589fdde6e73fe42cf322b64c433fdb391c910bd84eafdbb3529f2bdb9166e654cb0da713d58f0545b7152d000f88b6dab16b2ef728a1cd24d810a6055fdc268a931f388fd4cc20884852be65e0ab320ed4b6b5169767ef5426ae8482dba5eb66bb9ef0172779dcb82e815d3a7446f4cc916ae4eb21346f5ff6dc39cde4accd7e5becb5c2d653532fb80aa9022292a1febac90493782aa36c4af4e5237154b848f4d9b00a703fd01ce6e2931443655dfd4cb08687245b9c35f448bfabe7e7eccd3e2630a44b80548b2d5c1b6803089c46592c167d1c393b88b1ea4d5d6de59f877d81fb1cd0c82699509d0248debbe2889c462ccfbe9eb3454a856d128b8038f75c48a42dfae5ef51c83bc99f4b715533a9bcc6c7bcbdb5bb66f44d9bc62061adf767e7e0b334c48184e0aaf3f7bf19187cab07d5ae683488e6972793c73c7d5374ce57b5019d3eb2588b98b2e0591cdf05e76bdf8b78018e62bd6a88bc1f732380d2cb910869e05fcf44ebe9a1cc5c01b50bff12efbfeb3dda154923a71b8b6f86469028a6dbe2afe8a7b272530389765832bf33e6373f6baead69276a2c964343e909090b55c07af1f62c20c9d9792678fd5ca50309ea73f1b0e043a93bf8fe674ad71259a7c5ab8e95f44471c10139cb3a36560de58f1b40510df1dea8fce305783a3ded1d6d691591cefce9442260f80e20ef9dbfc56b5b5b7e0ff55d2b23b48f0cba6723233ede6bc77429b76dced0cd6c42749cf289b1bdde18abf5dc996714632494ce8c6af3955a6cbc5916b40c8d996591ff2f026e564cfc558fa108a4612e65e13453df9a47d783debfc7e5a9593de7aaa837d7c59d24b4c236e5e06275b2b7ef10c31125adf9d3c2ac6a7e50e15fc9614f6c65f05ccfacc6939197757be8dc7ac4bc1cb2e7f374e429ce619765a90c76b856bd79b4eaa3894d86b1d10bd5991aff8017eda4922cbed81e20c58bcf7ecb54c6d2778ac4ded4d05baa90597d8ceab540eec853d8d8ac418289123a296ed01bb8d7b45e572f5c0ab7be3a239617c432a933ad46cab933d78c58b0c644c4c6a89568e4d988dfee6afb9532b14b75e631f6fafe989fa193844344e419da3be0ab7879c108abb4b2ea289973f70697e746ffb1e3bfb8e2d32d723d580e229ad3235846eca69694c0668d342553c03c8856dbfcacbc143f167763c89daa2eadd4beb6feff2ce1e057bb1a07c8270c9930b7f781eb9aff84f5802bb7620d6da281ea488d259453eee5c93769ee8c2566dc27c685180d40381efcf368acf5555b0df2f5433d7de1a89eea39ec26a60ba601f0d6d3a4e5928c3d76ad3415b961a9a1c8572261fe340a7b9fd574c9d8a251fb27232972fc21c368879ac78e231430c0c94576079b42fdbf31db8b46bc7492844b426b8d244bed8fa14495c94d6680e76985b5b70bb49f7254e9dfe1f1cbc035f182e58d73ab9111ad9592144483c99c17ae01e86ebc9f70d565f165a38d3195b8ee9056918868dbef05294999b87d7465e8831bee8f05d14a319fcf2ce73566b480d5c84bea0ebb79cdc9e656f494ebe46df332d1abc6dfc5dea75deecf641e93c5e90a88ec6a640f44d9b817d4bafee58f9ac8b1ddff1b98274964d85ca115af3b693f1cea3cbc56a4e348f6126c7b219871e6e6805503511d142ad75379a054c298f5e8b0bdbf8dc118ac19c68389fe2a79979de3ece467e3ec0798e39b820c7278006205dad138ade64cb3e2d306a19782b20d9c33912b845ff25b278b029bcf2c0ac831adc7e5fcfe3011d6452d9330726b56ada097f05f38565478103daaf14997c48132a0c65fcb696d7448e64fb5e3a9eb3d498bd3f6876b22c6c57e5a5b1cf01a3734ff520c89aa14ba717efa3c8b4195571ae38e1b4d707b09951d6b27cc395817ab4a2eede0ccde2a68aa382d217b17efd1ee9563a5172a09ed8f1e94a820b959a60fa67f32010c89c830667d3418cd4b24a01b7335e918410005bd4382ba7c2fc6b49830deb5f944a70d13ce36e8286ea494b94dfec2c7792a950a655a719c7b8f91e881f96452e89be9363d68a1d7e81fb0211da89c2511b44128ae2a8ed9573a8535db6fa4820f410819f26ea71b5b2ca931dfd081741fcb74d2e274281119ce458bcc5f8564bb80707040076acc396b2a13b2325081911977ddeb8821e359cf8461ffa7080e22e45a1310621dcba2034f33bb80fd9bb576259ccfa5b0eacdaecd7b3e2cafc4cfa8ffcb60f2f5f0df6242c528f922931d32b3ec8de14fa3516b0045e43bccae93fc2b4fb12c97fb93e6b9bf12724046b448f2a16739d7433d2c1fd053cb78e37c7bb904a84e63c13b5dd282d6886ae2a3ec9489de7ab9a89885c531cad3ec07015f803b85e5d85b604d3be7cb1269f6683d522dcff97e13f8ff7365b5a7a538a3dbd7142a8bf996cec4cebadad844476531d172cba47ece2f85a091f246599ecfa97773177981caafbaf9739788828d3e203570cfa3be5219b32bd44a54bd8140a6dc923a1ccbab9735c67eef236410d334e33cd388234bde83709e2c7a44dc3629610b78769050efd6167262d9cc2e602c300b0d0baea6f3c99214d75cec807105830078319aec8fc604c6121d1c869fda5a478fd3e2f9f70f55ccf69f20e2545f64a3df2fad12d9a35589792fc3b3c469cd78b81ccac35319039be349a4ca86723b2bbc49960ae1d9d2f763793c1d610a26dc58dd6f7a6de059fa29afef4c5eb993fbf1841c9133dde53f79db98d02abb8a045cb0d79ee5ba4429ec69d73500905bb873fc9e7caab6c20a98e2185219481df31db84de59ebc66c8577c92786b8f90531d775058ba2656f41839217d3f66254f0de8e06b246e1b23dae749924a6545e3663ddda041cb681d8df7cf11bfda1146c7f613efadded327dad3cd121f2e6d4df32ac5958f71cedee7289118e8da4b4991b00a80e4c7e07e261b82218807e7793f1fe127c941613b09ac018cc700fafc5e2e92926169df99f1eca5eadd5ef56f755988896dc000090839c8b0afa125dc52d2337d7274e648ca271d11c64c53825f2021edaafa8bd3b3d43930157431754f2ccb00bd382cb9797aa80be7e3ae63a20a15f0c2d7c5d89c984f6948594d04bcf24982d11de62ad846587bbaece6cfb7f965521b71e0c7c1a49af3d09a8e2d8b0aaed5c04405fe8c4ad15ebb93be77649cb17f7cb95ff7070e752b2c1c48665586ff3e39b5ae4d60e8b44b66f3a074155af5d3a30f8870f8b8d632486834ef71fbef00bb39259def8f2bf44f5af6f7c60d29a0f4ac44b52bf706a5d4e1f681d19b25fb428bbb0e1fa0078b398dc6aea95efbd43ddf22d75ab8017e2c358694c01f84e6eca75376f74acd851b27a0711c5ce8abaf8184917b2eb227e85724a0675404b3903c7d5061ab89d0e6daafc48a3ecc951884de8307182f20cac74b2f9822edf81eebc22aa533e1f2d41c73d175c4e392b640dee48fcf3b975b28aa6806c6887ebfe9715481a45235c6cf9065c98c56cf88b602ffa56303fef5cea8e839fa31536990251d450420b19e5360285802c832717c34f07507f0b7a0671faf22c7b93b7e96eda94ac9b9e234c3b38326654a4ea0d3ab5442d3a1668591 Params = SHA2-256_W16_H16 Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd3b PublicKey = 02000002f321ad06df6f4734eccc6daf83ce1b25dff23e4e2d24e65fe1b41df2e6169078bb7aac42e1466c2482813be086bdebb1b29e9684eb4448e0ad77e84434ade373 Signature = 00000000000055b744303ea6466a1e789f976ddf47f9644e7236b722592d43e722ee6fef812e6a0489262d09ef15319023b59b5ebc0bcaf53785807f69360e8eb20e46b9b904b3aba185e2d26614244d2b22ae4026638c164b1739041cb38df777c5ebf8b725bfee8459e866e9265b5d9adba820d1394b15da6baeadc9e433f769bc9a6d8975cf7b23901905473a4babd12ef91759aed35d5249888b0d7879c8db64441193d0546d647c39e3c8e376321b74f21f72c9761255b35e819e807ef747f75c13b7a26fb036981a8c7b7e3cb26bb2c06c01a8cad55b113e8e083dcc9ec9f5bc89c43bcd6dfbf41fffcb8d97d93408dd9d2d38935a0e8ff3abe106a9d90a1948f4ab57802553a08931e265fc118fed1ad464aa733d80c50cd4ef83ed4f8545fd2f09c8202d26101a567697f10c5a35d79c078d537f887b28cd6e1a88a520ec9bcf760ee1cb8c276d5e7ce8364bb7693297b756cb2e001a44b7aa977086a425da83a33be8831932b06b7e458774fb6ff004111f421010597d4cebcd702f2ca191a53f48e93925516869b1fec94af993ba18caa366ddf336d36beffbf2a6075f9c02444b7a935be65c2fca8fd12b01b6885c05392888d91d8b8d88450206100f9d462ce40064e294ec83b916f120aa82cba52cd471d3396991635ce230ad1f9a3dc2ba851f4fb57282c4b35c1751ce4ef3640892836ea784e3ca347f0bfdcd67b7ffae2a8934943c729ed18cc3ee6a90e0660b9c2a75b188df05ab3fe5ca221f45d8945ae2b1663df2106f14feac2d01378cfe482d1ef774461c704885a47933616747b0a56d74056fec91e17e8fa7f8be220a033d28b88261aaaf0545a9751446c1b8fe3cb4677c011d4b3743911d0819ecf9613d9bbe4fa4fa2949593934d804aac2d1d572553ef03f2ad66b489d69631981fc9185f534417daa7658ca2c5dcd3516e3e4ce3ff62b3b485d893b0af03a68f48ef92732375191dc5061316c681d03b7f55f2fb4ba46242478602ffbfa31ef87ebf3b4054246b6dbf3c22a51f1631810d0a1f869c3c99e733c27667b87aea29dd4d67d0f607c8e5ce5012c5a1eccf700d46c94fd51a0f1e56dccf2d1ab21141f44144cac9447cba1dd1dabc77ee2eb897b665fec7dc7c61e9bed137858dca2f478c0e7f2cb12f74323e0be372ec49a6eb1be5c595231406982a411992b58c29718adf16854ace8df6b6957a9d26701ea605b06ebd1ad221434afa67ce33eb2b58d170086ba1b0f15b6fdc817e13cb0b3766c03f7859bcd8113b25e398c7547fb67092f3e0e9e1714e5ae873e3036568263cbc1aef563cd4f0a7cd33c68db94e5241c69afa9b1fe087c008160338007b54c6ce75db1698d205f7a89abe87b8633e4287915bc6026733b7aabbf63df7ac83a838cfbcbc48aa3198035aeca1b9753b43dde72da64c28d0383ea586e7814b3dafcab480965087326de2a0ff6aa33b636e35ff54d4f931146570ca5c573224a1d44c5eb08056a51996dee669b729a85bb93b1c325c38f91b408558e5196fb31b7e6458c5a679135c19d4d92cfe6480885851d3561c58b049973a52d2ada38f10c8073ac8eb0fa2cb7e2c143c36fc6e451dd437afca0335ef13a5dc66af44c6ed40d8eabc508828a34bebe2ec3dcdd7d96b82009d62e68c523720b9e6882ca3bba13e149c529452726971d7b3055e3528c6c8a6db0f6c3a8d02ec37de4608af26bd121872a1c1bb11c502b3d353e2536946bb22561acff78e6d3e68ab928ff515410c0a0ddf236c21c2a9174fb059864c5e5a0c756fe523b0a77349a3a6e9b5ffecf201eb1c07a33494bfdb985e11ac577ce862efe46d993e5cafe07d1b6ce257a7ef098077d4deb7692f18d503641f26086f60f2a2000f4ff0c8f8acac922e25748d25e6613299196eb432acb22898dd42834331af4c51dd4d53f70a5768d2c4cc20c6cceb6d7052cd63316ef768c3540785b1190296bc651f80e23b943f6e28af06cb3f5cabccb4e04cc6f1f33ff21e936aac1a9cae55f67a69a484b831b8e407099f08f9f8c9feb1a1cad0063bdadc5ce0e3887856f3798769c61078e986f11b40f35007bdd09913d82b20389cd17185e5b4a028d7d41961f2214b3735c98457e9ad04ed2e6743673dfbf663f7d0e2ef31d5b744fd399a3cc2ec6d884b30c8d835ab6afd92d371ad27bdbcdd45d73d6fdc957fd9d704b2f34c1aefad69386d73c4463f12b18279a5893ef2f2d188847baa1c4be19fc2da2d8f32500b1c820ff877ac87f2c570833891c48096855c721988edacb6ea49dd448454ac7fac1a5654d7e95e89993d3f656cf73b2cba6ab042e0a87a29d813da61d1551d6b5cf2de389ed6b65e6ccc57e02d33f9c7f6c330a38172b67f0c2da30f74bc6132a8758c0e2e4ec9fc3af411b3d37bc3eed381a5a3463126895ff853eb019cfe23b7a6c4c91893fc01ef67feb64576aa9b3e3550fef75374796489ff11d905e16443af65eade088831131b03df2b7f48f8fdc2ff4799adfc216c0b8df991b08ab50b218549020cabb981e347024744612938c281d331ef8b2046ed0b88fa74c40fa2bff59f31e2a516b93de52e6a59c83a0c50d0558ecee5c676e90727866f24b2003851467aaab19209d64b1f748c6a1605be061b1f6f296fdbef4f8791d2594d8dc574235c67eef78af1e6771d5d17bcfd5c98be94917e5d9b99256d28124f799aefd6f182eed391926502581613953d5c852181fec2a8db987e734091b2be2e0dd0df58e9159b8af706fcec5fbedecf502e68ae1998b41e3a35c9e523cbee023e6318c6c45fef4a7ec9ca661386ac0f0b956aa47fe7c07976de29dc9b657d126fcdf5a269a49bfaca10bb7663413da140daa6b29a1f84253bdf558b192dcf366c39a58a771ca33ba3f40fadf0642884f9b8740515b9fbd55e021274c9657a84a5472b94e696da367142af9d8afd836dd63f6e9423f81ab161df49c6b8c25e0f58b77c7090f7f3e34e535df4bc98f75d837593f82d567bbb2a8cc9f149a0761620d9f29d7fcf39f5930d799f4c5aeee92502331e5715d18b3886c6a06a03c8d22ac4788d0152cc6b12e80f1023ab91907cf5f9236d6f08b61f389bbebd90297e60d481ed04f0e897ea357aaddb13223dd15bef62f5caaf66b56e3ffd27fe43f02e90a4e8f04bc8c097752bf680fee84c2dea6b7b60d0139859b794542abfa5a0fc4b371608bf3fc16575a03cb292d4854d0c8595ba28970fffb79b6279f7e4595af66c65e3e7607d9af03f69e5f53cfb866b2108bee0ce9b51ed72c5822a3b1fa636609c570c0e9cee161685880ac65f8bc220bbf279bdb97a8d8694e24f0d00be8ff7b644053775340f2c3a084f7db4ad912e9e26278fb85e824b215cc19919247946fc5b2f58b7d705b4635f8d64d258dbe1729a22416239f4dd3c8296bbae087a457579b875410a142f4bec06330040a0de7d26dd394ccab3d51141d44234fe05f115f84e7b9aedd1c8a487484081dde2c4d07f034c17a30fc4da1f8da8f588fc8067dd5fd9e39550b1a5cebe9ebfb022e1c76bb8b8e1a90e32e4d41c65f4adced1448067e8a6a180db370e66dd8e62cc5da51f6624ab7020b1192bf9e7131daf1aa402b3de885a18d483d5043041a2e5e88e15c2848d0c3ee509e5f2e39ee047623de23a541392f21659d9920622d0bf002f1bd99c839207eb8f117c730486dc8b22594cebba147c0a2561e29aa652c364e8198a0c661da75595d2eb248a71f14f213250e558e28b5f03deacba47970b3759e13648b6bd64cfe789db20985f22fd08ae1 Params = SHA2-256_W16_H16 Msg = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 PublicKey = 02000002a417b6b239692d6d4fcbe225f5a8068c7aa947970c21402751953083f06741692cb5f30a388dd81517c600189a5662d1e008434bff3369890757a5df7963ddf7 Signature = 000000000000138ac97bfc0a0e8acc0ea967ad986c13b015158c36e89f0db2efdb93eafa835f846c1ea5e2a814290a0e3ec227b87038a9a7d886578bf655455af2bc5deaa4343c2f1ad442b19674395970078f5527b0c7e5de092ff91fc9fb1e85e97c20cc6561d71920dea17c9d891fcd7355276b6ae3503aa9fd7d9627535cf8f9520a8ab22fb09c258192ff3ef29456e298515fcb85c87bca1c0610e57f6135f29219e44b2c065d0e57e3746b573593675f69eb2d01f1877b8bb70b5ff8d5760eba97fe16085ad6b59d55ac3b16fe36699c038fc5804cd05cb5d7a1d32527c55faecade1d19ef1231c9d8596afb6e94cdafc6dd30437905b9e347b948f3c896f5ccea6252d17f65f7d52c3816b87b7cd75b421b63457e3d3d41829ed2f86218a9650c10a6ed213019dd085fa67860ecbf14fb93d0c60ce6320a71d79ff9c805523c019a506750f7ee435d68b79858be7bb256c6e0801ae25ef6af04c82c3673b85edfcfaf3dca5fcc0d47b5f485e39834c54f38c703ad3eff0328be9007b40be9aeb367c37d8bbe5ab8e4e2601f27ee408d7f0addf43816f6cce10a8e0d0676a1004384d1d1c2f9948eceb6d18af6b48f6f459a58aa3c83abf42c0d4ec7c681e5343dac6c9ebc68d0bb71ad3b7d9129ed2209c94759dcb204e184a62d58a364a76649791684a299ad14ba90808708ced005246abc9bc8c95a223c3b3408dedd220b7ab4defddb2bfc432ea0beedebc58432b7c667902bf5e355f96e1a055914b393ba72030886711991602fa602100fe50a2474c336903cb6672dd0b2214dac4d94d92fce1563ca122ac3d78411abff02d01f29fc1662d615301836336cdac548654aa2f69a9909f4a326bc85727280dbe160c46ab079c368891e0b143c292b9d6d17f4ff0c6e813aeb65291c97a8692b3e03b6b83791ca481c0671c53b30c69294d5d1e1aac40e02a7571359040d141016a49bae65a7152fecc9fe61208b80b2e85d34aa823b941340ad7bf5226deeb1f2c9da84f132cd649520f2754c171be9b3bb0c2cf530229111c38b768f75ea73a8c0d6d88d7ebdc68fa7c5a57594b2e8763ebc70da77dfb9d8f7beeb5507ee1d32513b7d8d868fad9cddd96b73405b03fc51d429dc90ef4876d328526fff1461b95b4fc77be6fea9005fbf08eae63d7bb432bb6bfa95c4d2b3fdea46c785753b954cb419a36e0a17f8b2e2fd87c715a55c8c809944a75f6127b7c804d44d5ba704313450747bd89e9dca72f585fad5600870a3c68dbdce4ae2f767fc9e2734e1ba109693eb8d428bcb85eb559562c3b934212d37dc337a345d0bc90725ec6f4dd430013318191c711a8b52cb105c096930334323e077cb4d2dd9bffab6568ba51c8f3c311d49acba7c5a908897a90b0dabb3b46d77a22696b38f39d7b469a295a7dcbb40ab479b6b69afc0503e536a2e8cfcfba8dc3b544e9145aed715e9ba1970a3d65df05154f89ab754f56f19b2ae540a3af2052ee163a05312d0fce14e2ddd0d15752f796db87b0a729b263c63c6114f6dbe22c239693e4fcfd44093e9e0451ff80462247ccb8de2f5c52ad60b703972831506979d8c1497e6265eb57e9358afb6489c277be3462a9bb5b5e860d1f7128eabac04b96da4804f51aa9059aa29294b44ead3091548b75de42a965e2f4b95f99b282ed286d5e5b62f099df518003488d0b2244d8401569661584c0bc2dd0046744bd2dd890f3323ddb5bbdcb774085942e40f28991e3fcd4c8c9a2ff698b0d14494c003cd71699d1437cee4f03c45ed997d11c45b3e382bbed0951115e95dc16787b84ce90dced68b0b1df42391baf968527aa19d70e39a03fd2d4085b45d5ff610b518d6f6ab7149a8f4f39cf5c9a65625e337b46200de042e3bb20c3b25d0160b71b9a0b36bb9fc255677a364656618a2b60a3557632afb85cf39e4d79b81c44ca54b849a823dea99adce651c9ff78b00356b3b073f94ad66f38c2437ae8d7104e83ad592504262c43426ec29ecc1b4013d9f70ffd05e6c5f6cc9b2b52c035afed293658a980af628ef134b002059a5c5812da4b7c952c29713045c9e9310aa1d1d3abc0a6ce4cb34f550c81c89d3dce7247f9bd71b43f1330a05aeb653bdb1da03ae2a61b10aeb35804940e84a3dd7f9f277a67fbb548bc41240af787ab5d83277134410125df3df10017e5aaf0130c96ad5a69f5ffa2848f9b44f820c72171792f66975c5bfbd55a7e63bb76fb10cdf0c997a0a7da16f57a64d27aa431747450ff64b3c079912d0fc9b91693b200b72839aa3443b46e87346cd2c6ada4f4375237d4652d23cf17c5f9115b1a46b4e6a0edf563eb0a27fa9d8f0601964ef945f68f03e5fe80c64a6409c73b7f3cc8253a41657149605fa7283cc93a9f6d480ed9573fda182c58b41f042a94b3234743acf26532c873431b2e86548e3bb256d293b1e1a9125bbc0b6bdb90acdb9f3d1a3b1e10026d9b29c9a639603c90c9dacf4d6ad395686c677f0d0407e7e7982b709fec1810be207fa99530cd9b59dea0c7cde870728c86034c98d7d57f3ce01d1fc8494c0cdfd14dcb29d54b091c0056507aec6be2cb10a70d0105eb215e682698dbace3c51df6264a44f61cee352644627b91336c84c7a3a46c3498a667a5b028bf7f4281394d47defbae0130d1424456eeb71c2d10c6f8922bf3f6a53cfc6a1974483e28c7196c0f63934688b693ecdf528898cb3247085684e8e3f60fa07ac053134338db2cbf22bd0992ec1dc5d6d4db19719c65d0e64960f5e1d3e7ad8dbabf80c231f0a629574e4bb2d159990c1c30a502b36c7f213ff8eb6f44fab7787b6e1bae2facb07ac1de9cd6edf223d970172f3aff808cc9e29525fd73c7ce913a3cdfa363b600439f011b73bfbe7c90a84338973f87810c8472687454b2b3570bf5359ea1a17fcb749febed9a0f2662d4ab5484472678e719c7d75fb4afc224f8efd256e9b7df7c7a67c1c31537aa4c1855b7337d348c36c4fdf734ebca52bf662a491344ad1b07052170581f8d79c65d416390b7f9bd7a518413a307ef24b0ac54c792aba01d571d366587dd500c03ab14d2e89d1ec80d5de656dbb9981f18686e0804887e4457c2381f371f844d7e3a8452e05e07076e3ed25b87da0ad17a7b76b66f3df617fc5d138fc969e282b59e0beb26f198df5580bebf223c18e18c7d74ce940cce29c74cf805f76f01773be550cf4ee824537e81b362ea4953831ec89893a68812ffe9fbc059380d050dbd882cec0fee2a2ea67fcedcd63ade0293dbbb3a779a5e0d4ab66618216a2e2f34f4510c8e74dcdd04d9a40d7ff0ca2084901a9315fd220fc06bf6e6dc7d56d5b2ef60871eb9740c0b5f8d37ddd64094fedc1c6a1ed616cc2ea27006ca77a3fc75ebdbffe00ed1117a427f6aded45034c1a9553ed0c77c8baa6a354c37f70ed8e510427e342e60a61120169fb721a1ab8ff9d0e6df41c1ab12061d1915ba8e453b74c17e3a7d1942bd5d82e47eb1c4fe1da1c9816250bd4d3347db49bdac18b19b6b3d54dd2a3dc049526df05e70173bae29b96dee388902a0ffc83b383781e3924de31b645c19c736bad29d0342b31aa2c0b76fb3985a127875424285e05d65c2ec481128a28090b27812c48f94a313641fef783c19099ee1bbd00e2c1122e899cfc09e3b438535a726bc1b4b4468c6a1698f271284f84ee204d9cd7d176afc5616724fd66be6526a6415055f94750dea3f32d190c0a680da47ffc024af592b7f8b3221aabb38603df507f699f158cc2a6ed7735e793f0a6dd5ce4cc1231ff67b3c96e Params = SHA2-256_W16_H16 Msg = a04306956ac18dfdcd1226d5cd0b49614ebb0a43166292616ae3463a383a2bf7683fef62805a746ed4770bca969cd2940b3576ed9f2c496a69b7b0a111722e8895a30708eab39059b66eade86c9b4fe838eec9418a1a1bcad3515274525c9e35e35a3a6719c2f4ec3c32b8cc6a796c6fc83b911acb55dd876220d436aa38128ad61e PublicKey = 020000024f2120345df148ec61e9d30a2f5f570d82bb92caa63cc6c0bfa07fcdf9d257b005149f9d6db23142def5dad7b612162c30b0dd83f0df5dcff7ad7a18ffdbcacf Signature = 0000000000004d81c671c3daa405940205fdfcf32b33ad6a144ae4e5d76aba72ad0996a53cf514b4ab2afbb21412036f2fff7303e975ab4da19e8f762938c290d985a75534b9fdf3c311ce468112ae6293da8829a3a34e7fd9ef6425882ee9e9c73b9e2d5e9d232c35584c1a844b0f6e68ca5a1ae006238671835b8946095e1c5209e8dbd895ae3cdca826ec9e9c79212b6940f786067195796fff210646daf38779359f9f2506868d0b665a98b87322078e9c6e3e1f8a9b9dc39961298e93cd8250f9f3500861adfa7bf39a3998827d0c0f1daf417a228deec393dc6b9390279fd028aba281f13e7c98487dbcc1704a5ede5b7dfc2fda2837d7a9fa20f943349b2c7cd7fcf1384ceaa2e6988f20d67282340c594dbac56e45f8a4bba477a05a5e7bc984fd47f39d625a40b6346e92e47ed825c8b982fe498ae7ebac5219e69cbb8dea9cf6f86f08637f2c02b086613c2205997b85db0a9b114325d12d21a2abf8d75d3ce3deef73c40ff738df01146e02f8f5387cd85aaeda11d1b4825cea475db99946079e95908b13ed751076da9a2e07a7fa0fb435b5a17243a684405a2675fe417a0f276faa502bab765259b6676a8f646d1bebe346baddf0080608f4ee03267f7d6c24222da7d0f4c0bcb9dad4644ba92803ffa60b5c21177c3a6d658e0db62f3351f24e39c2610cf7965ba065df68f8b2c2b9da67e039207b8401db24cf3e7d783da3faa05ba55381407c88ac0325d4c26960498fda42dbd62722820eea01d2dffbbf43311df4e1e72a9f901c913e66d7752481a2e6e5dbb35661671956b2a7f9188f704333995bcb37bbc1b9e274dde28a77d7a2cc059cbb59bb124438bb21c829240da0ff342151eea30ec9e90bdae6932312fe8fd34afd7c7d0ef6449462c240ecf89376b5b564f96ef1cbccbb95495fd572cda1e79b225c7a1c3f31b8542b99165995ba6c6275643aa9bc72ec20bf72a7996662b7d06291828c6b837620884c36eb6c7a5210eb8d8d411b755599c5f8b30a07fe6049979b2002ce942c1664f5ac0962c17ce89788760578055e1ba45ce845945e013aaf9135f63b8c8e3b0b3b0f3350f2b6b91733c377d5bb186bb14e199fe052b7d89f2351442025554cc012798d4481c61ac23cd2fa2d20c84ebf53d7dd26fbeba9d590d45462fa3084ae379e50ef5aae0975e11c75e7ca24142c10897684ddd5836760a9e4a4130ade5fcc30ba1343df9dfbcaae81288dcd4b335b9b5b49e76866d840d81a7bfca9007479a2033ccefe7166eae4449e106f232e33f8d3e8640186875e0cd2903136f898e848cdbcebbc1490c89aa181b7c700529aa1759f4b2270c61f95b609d662772f3597c9d328c8ff31ec1da88fb949a7f86cc4c8fc3dc490ef9a97c57aebbf221cee1d520380959d40d625c15e3a90e3a2027c931eece26d0a40f524a2b7145ab6b79d70ee927a0d13453689dd2c53dfbaaeee5c00d07bd5093a1cf638e1b1d846ed73aeaae9a73bebb49e8d6bbe937a5601c89ccf35b8914db8b4a61854c4026a134886551b2f2eda58e80e0a6cafc30aeca92f95039ab8e1b350896be3dbc23b334709512a7727f4f9cfe7b5c448dc795d52f03ba0e40a2e081987a22d88d59bb6f69d5ce22b7dd93b55ad8874105efb1099111c244a17be1cb70a019cf97117f2f91cdeff87ca13c5ea4eda4322427455abf4ecd2353e81ab683a8ecc45cc732f29b71d60db9bd36e39012eb8245fa010d269c9c8b387c6701d522139270caf47128ae3538357e388569ccb4c7cd03a9ea3a0ce120adb60ec40d620f3754a903edd1a071304897ce461d79e84657df80c1d0bc70a7686508c5b32bc93fc17a96e232178f297b38cd2142f41c83c285f96ba4bba5d64dfc0d73a6d811b812f5c175d6dfb8375ef0600971169aab1021d23c2d3881f5c852fd3d352a4eed22ced26554cda94802b5d5167e9f23e63a4a7e470ffe26f74374de52b929465e2877b7bd24c1c7d14a97fa53c47510ed59922073f61b33bf111e4443e11f32ed582e9f9672bda1c444dda1bc3862fe7562c1fa3afdfe143dd3dbe68b429819904e2c930b01efad92aaa603d6c601c2b812d0674a0079ea92671ef523c56b7c3fa6fc8a4a1cf3e6dab3403294bea25c0bedf529c97927fc0388f9b56a1d9ad73196988fe5877c0bc42782644c141f79711c53473422c8274d07253baea137be2b9818ce87aac5b09bf7529119e24be1be2a5cb787cea8c366dc04a70181f0e5a5b4502238cd6b5d7256eb73cbc3dfaa85d5bca3769e14e5641b248e019a7ad973add46ddc8ef0a83a3a5923cebd79ce1d9fc8a6afe17c599355575eb2a35ad5352f8606f927dd6c562a49b836dd372b7153be0515d1b211324d7330ff836e0021546f7d9421b4f55db2b88d1f5d3087a2d177905321ac499170ae211c1d2aca9db23b71302ac57a43b0c44bbbfd936ed9e885afccacb6ee70b303cdb44049290a0c10037996fb0aa5124f15b6722ef69387c3c5c51f428ac0c8a17e78a6f1295c9d8dde55e98ca4d75c52e8241b862c7fe6f37cafb781d3046e0dd0fb7c883abac276432865f43a9ec1711e58ff8aaec489420e00c5fe607e9a6489ef2f59a095f2e7c65c8c59afe0f68d65150882af419f1a52b852a0d61e1b54453958af7628af7536ab2b23ca72ba3032dd1ae411fc3b7a2d182caf1b4da556a4b092b8f8b47d94b9595c6da93ddfe5477dc9ec1476ecbe6049b0a4c5d967ad15495ccaedba70d590768473962a98b49bba61b0eef39076847a5066c1a41b3d68948e63b0aaf69b62609cbea2b7338321a3ca9d8eda2a27ced4318af6e4f76449dbeefa1b905634e5679a5d37d5eeda321bcde68da74c27210158fc7ca6958920a71e3ff181b9d5abef9ee3a19863efa593a77ddd98e7c4d445397e0b0425d5dadda6d788db82974c7a54ff5b225bd47003140f049ffb7c27aa274dbc19b95df270fd88e1509df494a54fcf8b29239cae7886b89ce877e2f186618aaf319149e1ab55d8225b4f1144b34a11554ebfff93b27ca67505b3231d15fb05e1264c404ecbbd9be055c1edfbf516845333e04d0abbd2ec24f6c61d7ab76ff39945cefe745d8ae42767008c6066cbb853616b59872361669d3778d512dbc67f379f2b924ee783beab3609b1e9866c41f27d7ec877f19916a9ed5eeadc014a9e35450e073fdeb5f539609d5c4130bcea26356f5b9d28caa0bc8f55e18b019b40097a8951977f09bdd20276b4bea47e6274645c9664441c63d38da09e3db6f0f1bb9401df3ec54746e8209ba3258cad99d164920f24cf590a7daae6d78c05f08129de76cdbd7eec6c6ecf56a6533d6284476ba14b3a8585f3252357496e3f49ba2ca3bc4fad7f3cdf89a8b4067a4870c848a6a6d401e3b470b95acd21222f7f340f7ac03bbf4f93f1c9d6c38cc2de245b54edd9aedd4677999c33c6b246342205d6b67ebeeef4a67538416f15853696b1533705f9363c3e21fe6f67e0138efae5db722cf9761afbba5a6ac803c3da38d6c71ed874cd1748782babcc260347cb59808c7e13112651d7d30d7eff9a67e7a452c61ce9af456402205aa66c973d0fec242124be20327e3d6a8e8f1cfaad5058ec693b10716ea9e6bd08eb8e0c696a97dba7d3dc2a0f6922da4d9d811c0292b8c5d8dacc5ad4ddc80c3959ab41bda4dcaafe4e5264f303e28c1828988c9b4cf92291d2628802ba47e17e5d695a7fa59c5f5cc7b88d66272751187b0cb4892f6f1e9a27003404957890f74d6c4152ee09999b26bba5e976913a6252dbf3b69cd51 Params = SHA2-256_W16_H20 Msg = 39f9aae727ada93a1b6b33c1ca069c6800ec737cafdce70ad971c3c1ec605c0b0b700b910d8dd384f210c75795bf9591103e PublicKey = 030000030918f68f43288a0a2a3a7f6e05703c8b32654ac493e0bb21c3772bb8f74bef52cf97444a0711cb46259c6114c038a1fd29bd0ff46b32b700e468a19ad553ee89 Signature = 00000000000000004f33faea37e5446ae2ddce3438bbbb0859ad5e883050f457eca89e05d0f7115950afa89ef76ea8742c7782d6b21f8ea27e70729e151dc47d18f928f41e6bf1316a42364326a023eed85e6e2893adc84b5b5dd71d7fb84ed9213b7c789cbc30feb211309fdb830f61142b9c06771812930511db2559ccf0ae6c52dbd3e5332ca504c2d539fd1657f23e7ec2fe02c0516296ac877d03eb3996a202800b7ed9b0ef99e87bd89c9e35fb3fafa3e72587fed3e2c2a857d8364896701c74d457eae2cac2673a5a1ef7bcabd674ba7397b02dc725c511fdd35de6c1cf71ea51e30b29d9f7ca08d4ed82e646e708a80314873c7506a404665d21ff71e845bcd724e8d28bbcdc85a93f18b01eb0917db9418e3d0c6e989eab1852775f58c600d65ddada6f7d6887f7b63388b12b864917319ecf16c49453fbd32b2c1162ff533be08c892558189a20d35a8bd99f0a5dc6e00631abb476713c31a52387d320195e30adf8881f488608f9b062d20fb22df8fb187f99fc6c3ab597c73f3787c8c559bc250afb5bd2f84437e7dff2d99e0082d992994a77e6c78ae20fe0c2aa2ee8197d6f607e178a25420a0060ec9c6d97e2920dd69fd78030bd57a76aaf6897431e2340e224d17d215717e17011c3adf42ccea213f752ca5354ae22f2c2d9e7d9f301e8251b7c7e82befea650f7fff343bd41f700c0fdae1be3c125526558a2f162fdd05f42dbdd5bc8a0566f834a4f1e171a2c989423150ff3b9244b311013612e059beb9f0a1ff065d7fb123ba4cba1a1919ced5ca5cfe329d4a9856172b714ae54098ba3407ad5c64e180e727866baa83329d0e9ca55cbc5874d8f9a87f800331cef2a0fd56d0cdd8c535c10df0658a8a8e54123666a460dde4546f1c237a894ed5acc3b9b4382e8b9e6dd34d95bea81db9f80b1ae1e864f4a88579f4f7e530d150063a78f48ac1b57ddcb0abf734e8bb6ecddbf6bdb672f782ac09e29002a7d42c9ada1246903bdd1c353628cae5cfd765fffe738c4b55c3779dbcb4747c4e7cab0d13d5b14bfcb63fc911e62fee0d5c1edaf748c6bcea6325a57948444b4200dd4bfe952efe135a8190f5de1c8c8cb0ddfadd9252e1b9b3d6db79bfe201d32801529a583d888d8e2d0adbc14817e924a85648a19a78aa0ef010e3949fe82ce65a6d39a9bf14823ff68c0ab2a9fd92861fc8f2d1da4c5c753c28f7b56480b7d868f69fe79c2414e3bc047b74d51d0fec5e1c7060535c1cf863d182b52878e4b5c6775ec83b59e15358cea79608ef9a2b92603397dfbba2dc687878de93e1b55e665e161c3c4d6f5ed189a9ed9108f8dd615903d670714c0197133e642c0a86184b6134b24ba88d2d97f109716dbc34c5b61382a35147cc9b948c8c95e1f8c4369ee5e23b7c2ae45570d9e4fb0c6e5c978d44914d05b47ebf18caa5841bb9b95d1da148604d5ed44b1bcb2e771ab214c936fa859f1cb2ced954e0e854c468d9e541cec40a58ed09007512cfcc9b02394bb1b6c3e28111bf404672a0f4c5ccaaf2a64e171ee260afcf755b8feac5819ba968c22fe6e00f269e1a274a64b11e3f9b8cc36c26bc4a389231c9e673c9f911647f82e1a0ef16dbc2f9f7d594ce964a0227e1298bc2f2e28064da0baa89d9b68d7bc175119cca4a611e468740d73017e52b4ae87ac1c36a4e7be9b9991ba87bc7b3a89717c87a74ce1753b37c37db259dbbf49ff11c2213a498a3daf82cb0f82bf6f4d3b5994d2cf7529b49ba7e506734561590a0187320019703b09167bc61e183a91edb7534f73f32b48fff33b03d640501d09ec35c8e249a36a34da29d21ee8cd0a83f56f09ef07844a4e5a41f720b5a3b32f09447943618a104abf490bf7958c72f23f5a637c7a8bc2cc6103b631f341aa1c2faccb9377e5bf96dd34e7cd882487abd279e66f4b5d9d7c6c795077f17a95bc9e8c0f811ed01d7b439983baa1815428abb0c9c7b6c8c9c352d5552c30aac3ceda7a075c70859755275bc359cbcae0724193b65e8e24294127144a824a8bea30803a2b13a373b9a315827c52e0af3c816a450e5cd24808e12d7bf27a3d4b062b9d3a97d1bec4edba0a5526d9e228c0cdc444007c003bfd79144845195338a044bc72e2a3275edc74a2d7dcb415377f70f5e9b5d9f8e3117980c28010e7b76140a2cf285a16d09d5927d719d0081a563d35b0e93a0423ba8939b787924b0a74fa8f1877b510eeb6a6fa27548aea871c9abd3f23738a21f524d49667905b7b31e6cde977c6beb69a7ded2d8eff8b6da07f8bb720b7f34a22c75ad888eb4326cd0d3b0dbba3146edf39f5b4acb7440d7fa800fd5bf60ac864191e2e4982d28d00feddbed7a98ba68077720070ad308ef0fe1b10b9339fcf12e1240ece0e7ef6d7e0dcfe2c9d41c301b5b252467aec0c5328c9788496766a412170ac25e29fd663ab5070e4db70c69ff2a1e406a61b02effa330c48ce163f000ebe807af287be56fb7a268eb21218e70b46cb3581fd09427d47fb0a8b2c83841c6645fd5a64452811db1e5149e4bd521ec4f57d11d4a8f7c64a5a8fb50969350c250732906869844555fe14e8a158666e9e1b357fdceb6989fda0e1d1167e57b9d94060b2cae39cc3f68757b08467b3885ec2beab27d261068d67f6a51229adf8276cf94388d9715845e159f14de3e9242c3377d83fcae408849028e993e0b8d5fb2f614c2ced8ee9ba0ac98202dff76ce43de8095df84f228615e0263370b56260076ee3b52569a782e6a3f502404ad34e468e3edbbd615248eeeb02813354331ea8e3f9dc344f89a3a5f8206977baf90d60a0538473a00d061bb3886cb85094705714916ac46b9b9966ea0055826d45a3e6e1b2f81924255a17481aad887a2384ec6aa91756420b7565ed434c9d9da0f185baa1d8a4824fcd7fad65e2c1e859c256af9d15d4cae16b4623bd83bdaa44025a1ffdb72501183851a5bf76ae830888eb1bc6f624863784c5a5a5549db6ca0982278ff887aac6cdb8a77aa09cbb3fe9c70cf45f5060595d9f41e0d3b149bd0365754c4bdb3e4c3edacf4b0825860a1e25006e2303445a56926fd6251192f3dfbae54f4814af1789cdf98fb803047784fc01f9f45c6753911763be1f7a1e90bac185252b19f6a1776e6a3ceee107f58a8d63de66c0756a5eeb657d44ec12b12964fe1a09929407a4031327469f8b9503e0b7ad78f713b074a16a3c72011047126ee46e50841128cce31d11a140485ee5e94e9b711da57301c342b28507cf653039d7a22825b08c883ebecd3dbe803f8c27476e87721042e95d9b12c0a7a7eace3097a170a03c330d5b01d1cfe24ea1f000fc4ee59c5ca2a886df17d7512d5a58e8e8310082a59b07efae1f78d35bb37e245abf8378773cf519962af208ef51a7f133b2086f6af6ba4371da73ff9dab060de811cc2479dfbefd6339e710c2dc1442b3d4a66843741d2de3d925903d47b551ecaed555ea3edd8e12660dd64544e34b621ca2cfb82f89f5b00138e0afbcdce13c5db2ae32c776d256e8968af31a10df6964c481c6eae636960d20b95498e3c75a60371cb1803eecbdc2a8caa89008031cea9803348cf89dfd6e5b3589fb36bc796548e8f88a63330345232d742d9e20e72953d5263d2d981c75a52c418668217051d822db82dc916daa0d5251d26fd81000c24a8337453b44efa277dbf0b87e699fdea9deb479506e6601e934dab1bf73224e3d8ae3093a995f88e7269413d3b817c46d20828f128880ad994e2a08183bdb0ca6a85b83bd933cce72b318d0e8e5967d9be4989077cedb47dba456c7a4b9253de349bc792b0ad66ea8f138f6bb83b9e93c5f7f871a10dd3f914db0356c8c7f20a6a1834ae7cf7e874636cbea50e6917b0e830456f6663d9cf451afb47cc44a7ed2363162f3b07696ed686671c79e94e82cc9bbcf289ec63c67e5e6f40372d64b81e1f03c7d769613a8fca3ef70dfef7f15500e Params = SHA2-256_W16_H20 Msg = 625e1858f8dce3fc2c8037e18aad9ab670dee198219dd65bd74a0ada8e150b7763dcb544ab51b2120b73d29611475d5f05c91b0b4eaec824b07812b185 PublicKey = 03000003254d8ad016359fbefed93e944c2c6e5311c3eace96b99fd9a24059a5f9cb114d7a638deaa620d925806ab2a61802eac33167422ed8d3ecfa8a2910674034c9f7 Signature = 0000000000065cb691c7cc963fafba641dfe18c8491143e3aaf46083c4a37656777ab89a4c38c303ddadd9e45c333ced37f414d5c6ba36e736f789db08dc0ca792c1acabc7e93ec0f0a798d7cd1ba63f226e5dd9ca934edde4d6e663009a048a8c69db88c6adae565545478e0da1b0bdec7020d689ea1c63af1b45701ca9bafec111859342a3c1d7fe52c3e59cde26a0fd16375c4185243d907f7fdf5a2d641a406fb4649d219c7c7abcd81dd3fb24c7cc6696a24254041775c3fc95a2d54b35f9aeaed98dd3b673f0fa95ef7cdd8a201497b5418f21569d269ebfcd0136c10a8cbdc4ca607914a274919c5ef47e12900e59b20cf1f9509dda318dbd8137a457ee320200d1d847ef59ab90c5b96141de304ddab7dc871fe0cf3971793b0bd0c1e0e113dfb78500f53520f963e42cea13eab178bf47cdc4a9a5b708a24c7fab574dc5007f143830e5a6c4d5faf5206515fb145fe390cfcf29951941c813ffc87a1b9ce5578b4828992500952ec0434cb55e70e46a5f81b8b1654ef72056e8cb6165783eb73f141e6fdd481a4d24e3a8a764da8ede539c465de4542f45057950aaf517d74e4e56363b2e109d32da8a335d43a4401c8c9bfb86ee2c650fde415574d1e4efb9ec27543e2328c5805817a07f09d19f477aeb7fa89890ee6d35523374a286890861ca2c5f40f86da2689f33b56f42bd57cdde52fde6f287d2429b129cfad455f83e73ad822165a3a9b5c226cbac0d55d35168139cc2817c049f50e809f4820eb28788031f01ae6b0f588fd815b7248500a3fd4aa46ccb57cb6e674ca78bd28822d6740fdb7fc3d252230e581d287474e579de0b202ca19077e7dd068dfb14211720277c7e8b0780f2497a584ac49d82871434a9424233fd09aadad2f4e65efdda037d55a9fabb592ee77d7f1290f9b2c0bdc44c0b57f0f84ec6d3f290bc9edac01c3876b32e1f6251b283f1c075d047f6b49a7433b026bbcd8955553d0fe72a5563e573ced281e329630d2f0c849a476892bdcfc895cd13221d8801222e3c380d057c8e96c2f527b136e3133c8631ba54a6c0dc578b1d4a486b1c1044fdbab27d9dadb4aadc6cbf7310f3e2a06b3a37e5e41d551a6adc5acdf185739d567bd1b9e67e22f53d2e9de86d7941de82a035e22fc3dc90e092866e633dee0eb9d5fceef1455fa582d9f74c4956697e8968d3ecef4a6587ed7099ad401a827133997efef227c00321eb5c2ad60869dd274f4f60313644daf71ca2ef29ef2e9fad785201422954baff505a07b4bb44262c8134da0021aa4816fa6c002e142ece5251d35ef0de935eac695e74f86628705b748943c8e54a0ecac7bd95aab6ba32a4789f414cb5b6292cde1d8d5b201deaf5aa117a319d598a8238126b014690daeae5a255dc0525c37590e36ffb5824372ca8ed97146e9c081e8499aa4df1dac93aa1654517e4ac9f6edb992e2009e8e1623e405956762a79400d71177c55463aecca75666613c0ce2486ce3ef51bd0ed7e1f8739aded334ede46f0ce5d6811429e45a1c658d6eaf7c9209d32719a63befa7a6d33b28cb80789782116e562c5c5bd053dca5db2cad6001d9f80f5244ae4b7218fecb48db1374d900f8c2fbf9024ad2b70c16f52d2cdd4daf911472930cb452bdd671f07342ae4d149986767887cce62ada2f44a501d066fdbb70cfdc9bd8dcc87e96aefc41ccad2a4a83cbbadcbd65792e4e676a9893bf3214efa2d70d3cfa1d0ced1ee864a5ecc4997a9c370f0f45e87ae5d6a6a430da3eeeec1230e6b22a4153ee8dbd2069b31e9c54071c49fb0f562aef674f35e5c3fb3f17bf0f61d31722c68c396d5dc90994214276e86949f890ce2b8a6fbb66ec701d2c4b95ed7cde65689d76ca57755c66ad093c306a6d7f10a59e17f6e3af38063736e638e3fadce7add07037bc932527ff0bdfa8d1abcb08dc582c2c33881d840ccc62d37432ee4513de51e7ed5b9fb5a79a91ca12bd53c239f8c7f7219ce7665c4afe545c933904cc6c91f87667c936a8942bf7d1095b0e821b9d1ce70c584b126e6eec166dc792ec4ada5f7d586b746a6d9b3563ab67a14161708ac9d313cd94de837056c857ace049da3ff897ec68538e8a81039cbd7dfabbbb62011736d5cd72b5c291764317a7c6460f09ea91a967b053fb27f680dbdf42699c61c56561d341a98397de5d4d6c89b30802a33dee1576db2fc98cfb8cd8b5b0881fc9641989016b793fccb66a5b8f8eb997c5a24795dea82715cf5299489f11168ae371544c66adbb77a874a8acdc53746247019b8687d6eb967755f9c8a2757b674b7e8f3b4ff7d74c6e1b65c4e6569457e362ae64384241493df593b8ce6741874675f2740b50dcb09d4daece5a337985338d227070b4b8db5f76e1592d4abb216dcff0633cdae13c99f724ac91a6a696512f91ad1ad47df08a313618d2e68c75ebaba28354bf912963c1038b88c8494a455c3edf5d05b31b29ac2de831f0c68aa2d7d1c92edf0776506e861019792547943d64abcb59b16331fb9ad6252553cb048deaf7521ab50192b574c1f82a8a97f6437b58d460f99403ab90d6158114ebd97007206688459cd23b2ded59f2ca0e486f015953a60a539aaeff8f9c51553c6b3ec24936955b7908c85a27d2659a6f00f46f929959a4a6a606cf0fcae39f935e805c6f0f4ac8eac5f075be58a73a80a68783a6c616860c65466b62099ca67814756f93ba570fcf18fb9bab9aa78dcec71d2bffa7b2a1936f04818655c3a7701185268aaf50b5c11296c6b744d0f4cf83f6132ef31e0256faef66d548093aa8544fae90b88f5a644fdf85bdb6929af02ce9cf168616b0e0154dac56392cee5be7964ce7f317f722fb585d703a56a031e2dc5b2e77558cd67b4630c702bff3b5e6cfc1aaf71da4ea2adb3e09ef6b36c79f0a51a7c46233c18f1b13551ebc4af6f97bd376cb05c52f12a6ccd4662afa5237bffcd1e39991d197ea025324dc63795f3ef2bf85169c00d4159a79013d2039b2969858524a9f4d6567d5cf9a319f325abe4dc1d8922dc29ecfead7ae4d9e84480f2a68529c013d0c8b40fda2d19c57acb1555137bc8079205fdf505cab3e3e1e7017de0d5383ae8a14457a7034c810a4bd9f96f2acddd223e7cd2dcc848c01d7d8958f3f2a9f68793cbf4e5b40baba49d686a930cbf6c0e65a42ce446226e52c3114e9c3f5d8bfb79b89430f269a4795804e401a8894291355437b2823b908ec04fb963dc8cb8669b6f7776c0f9fce4092d90b918664b5759d250da4760e4be6822e242383ed9b373862517f3463d17d1ac4ce9cf4ffcb921878c90ab4996578fcc6f42ad477fd891c6efcc04ab682c719405fa713d5f92ba58befe4029cbce9ba4996212b37e0577f82dbba6bcb4cac7962c4b2d3c69b7a4de35d0b12c687524e80fe47bbf2a955553e9465a02b8a0abf804b5d990e127b1c60e1c10eb954fc8e918061156b5fc4d9a6f4b733e9c0cbdda42ce32b3f090bcfc882e4e37a03420790a4454e0bbe3d71b4ff75b30c04d0abda19c0e31e810d5ab628a622c96845e549fddc2aef76bf123ad0a966399641b827360026892d0ba8a4d0ebed928bf752fab6aa08dad78cf3b09dcc3a2c105cb789985699186c1156b57fd27f667855feedbe671de50c38951e4d7f89b1881df58b1e745902037703496fcb386c16e456edbdea0964df859b3870c4ae5b44a706cc38b6f20e094fe9a0bf4a3ce9d0f8dec8a99ce1839d0daaba57129c389228fbfc0ef33f928d758ca9efc0eccbd69cb97c8cacb0e7b599c35ff5e1c898a071a93dc4f80de0886e1a449c0227bb30d893c3a703be12f9528bec0b43edcbea0193e292beea56d1e5546146b5b0d63b8516708542356d4ec20d79ff8839599fd5c5d0c8fd5150c09e40d379875e5deff6b5073406682cc93e8f37b887ea7fbcd0ea301e8d6dab9eb0eee9e13d02bc0a1d3e023e3941d14933f06d7711a054c62 Params = SHA2-512_W16_H10 Msg = 0a78eba54b3915e3958e149e13d1c2736380ce64d8b47465f7d3838428f44d808f3d90d6270ca46308e6e786e7543012cac5 PublicKey = 0400000428c1a1df6a140fb2dbad85522c970b7cc38532a377c8027af308ab2bf6c2f41f3e4bfc0994ddb375347c5b809b7feacc5ddda69f2b4190702701cf7a37866a44f11a8dcc20bf5123d4c6e17672ce2fc2a8ef19132b9715ba78b26b3e92700d7a50ee5368fc483a0224b1e200108e580149a25e96f49fbf06ac58b2871c1ab55d Signature = 0000000000000000f5ac9203e5950aab07dac74840e119f1d96bac3f98d478c26612e386419fc50fd811ca28393f668275809d5469c35272031a721236fbcf1a8706d7340d9296a4b6d44eba3c795b57aac5a38f6cb77ce9a3cde1c4190fbd6c4e3dc0f4a50da9e16f498e336937c2ad5625094be9e2b075c37e5ccda030f5551608207b5b6439571e17805867c3a05c7e848956508aaba58f2b3f384ac574734c065290f008684c7ff4ca6ea4758a828c24a6d5c83a61a816c7c0f4cedfdc06afb327b9f8c427206b995941cdfcb10afbfe46c1f2afe6824aa52af293d694f13343301a632507bcdd811bad6de2dce4bdf3e1233cd298320c54f7f8de956c2e1061557685259ace41e7afffc3e4097d8500d775f8658c734f32dc570ddcabcbb2d7dd503cbcb8609272a834a4e1b9329d6743744642a71baddfa620804880ef38e1c7ecd4f6fc8bc7990ecc32c3e277ee96d6178dd8d4ed32eafe21a199c4a44f272e53593a28f9dae21444b937d130663a84df9c819fbfde1f6409894bffac3e146e76d5e5d993ecb829a2fe95ba4b5d149fb6ad4accd7cad26a65d5984fd2fc138d7095d5a45866ceead598bec050ba130ed732e18908628e420588e7890cf789b5445b6b044a3a97a9e031ff72d2ba129fca8e05f94db41fb7ccb76d638becede1d4693ee04bcb308d4ec91d15a89addd5b3bf0cb894e5fe4176f30afe57378ba22098531a23feabe793b86fb865890048b9ebcfddad7d6ec044f32300a4e0d5703695ab431a01f51cb46313b981b7c153df0ad74c1a0212eaddea6d39e29f5f77af329ac6074b81a05970550c7ee2480bea1fb8b116d5dd558eac2601b564a8d806269082962b7c5af5323e764bccff98ae0b9ae7b82462dfa6764bb95ee7b85b37e2e6827a4e15de48d53897eaec929a9e738fe9bae3a01788d78ec654b9256c4a7e001f51df7cdb120431b6a3d08726cc4f8b839587970d582fbdadce2f558950c5bfa1c6d1b3ef3ced14edacc1cc762307e79366c4a12f70b8579dc78e85a7b7e4fb8c79f3bce1f933c254a444ff6eda9ad1cb015d3bbd66e1300a7acd5b7ab214e38ef631ceaee08ebc215ddda57e53887a9a0db742156c01391b8ea170d71a9349c9657a480ff4dc086535383eeef205bd3cdfebd4620174f2b53afbfd204810bbfac7c4a38775307923abf298a20eea3d5ce4edd2d71a768363320d3cea5ff94ed1262ebc94769b261cb757770db5c3f3aeecd6f4299fb557ad6e39540375f4d8fe3a95708a7a24046e819dccb0b20ccc1d29ce6f125a97b29a31a67623347de832db0ac4f984d554e9a3d0510ff1b7da764fe317145c0cdf37723e061ca50f507751633bdd9358fd3eb964793462f9c331fc88ded05954133c7b8c097e1bcff4ccc6c5808fe0f3cd0a70452aa0b28cf59fb6d12de71724135d395959b3bce04f190103e25257d2fe62b5debfd2aa4c59c09af4f12a6bfa501e2d631597afe08ed866ed0633d50eb89fe049659130ff8e4be69ada6596a2222a4caeef80b7a3afce5f7941d6a15bfa6727e3e96f757d154fe5df37402a7efb1d973ce618d81c513788805d6cd633b940895fd35952ffe05fba60c1859905b0052f097b0ba66d540de92f7135fe8ea6cbeb8eef6d136fb381b77ed0b52e39e3013e8c6146ea363d75c93c15ea8c4955e2157cec998ca1015bb74c4b4bfca81de1313b25eccb75ea29042ce87ea49b559a8fb33f4d55de51cea0e0dca433ed9f2f53c1e50054a6109c71135d3b7d4b8b5956b6d872acd51c65a92fb5addc9ad7151841ed07d925bcbbc55b19c5132f3f61c150818655ce63f80b9a04111fc78090c81210377f7c79ed58b06f5acf3ce52c08d853bd9161feae7cbaa767029df05b5dbe6a70d8ada2230125fb636175bdea19b06e6b1e97d63e329cb5d4cb6fe090509ffe747603de2fa9e5d59e01c5b6ae5919e0dbc387ba2d0745ab5065087d88c01e4d63a0b1a315e8f1de8338c5d53887e0b075acfae39242c8199e67c043012075b76a0991fefb0593d844b688e3db7d428d2f5b105750ef0ceb02e66a4618a58f7c005ed50b5cd496c130c81dac1dab80c01741b89705684da7b04cffbc79bdb1f65f66f85ba3ad8c454ccde11ae1497986b221d0618a61f3d5dd4e30728400e20e685344203cb19ccd32aadba6d0f9d2d193cabeae3db54f39a4bcaa041ad62c0ff71bc9fb47a1e125c728bece5e42f2ae107bd6aebdb48cdbf93df1aabd8ce323c92b888ce337a77f1323c0f5117e78376957dee1442d8145a395ce03074aa96227a5d904807f8a2446898b12c005956c62f71d548fc69a2a94b37d1a844bc78e67d616d6fb95e5b1fd71e175c6f5cf605bb480028f18c62fa40e63c99d498b1cf6abd8afb64a8efc21510cd2da4033c24848a8b144900f0b14c8cf0d83913943468b62b3911f4003fe056a5d6a69f1a4ad303df2b448808765ff5d5d1c6c08293637098a5d1986a896197c75467bbfb5baf672334e4173b452b4bd866a4347f709cf27738f4ebccb2ffaa01622ff586af5888c6e74a7e652d5053f9d62a6ce83c00de639f0386a1fd5c088c2a27d7d0168b465efed4ff0cb10116b46647fea4c8a963749f09b17af5e4b696424d316c1b2447790567565ddb40ba653d21b4d5ef75674d10bb5174fe64853231f8ef586fc2d8c2eb45ee4f448ba35d07914e8f1b15ed7fd81ae39a4c6a740278a1195dbe93ec5ac979b18e1730519ebbc5061040175ac67a558f27c4df2deaec1554e7582c10eda9660e62ff0b199a138627478b64d10fb7fd6bdba58e9d7e1e5a103c1fe381a07d9f6194df8ddfb16eb21be5d7cf4649f9f6481c0c4eb6f1d2f393cb00be4516c9ce7acb195c846a54b09b8ab61abd37413d47b3c5fd9dbce5a3c1c621594586fda8f65c9e98c0247aa9f0622ca60062677120326ddf8d4394e1ac69d2c0e71e05767554cf8b72f480afe1daf918e3617fbf0a5a9873254f44db298c1285aee31c02abc07562f6beaf18ef3f55303d780e8f4e6d7bb5f5ea19e182bd5e978a2d85f5ea667acb089a1531a27efa2121107a3cb540c2b3df3dd0186b4c7a461743fabc41b2fb2b83ddf10b86b190544ff962763ed95eb8403e297e6c6952a8b752794eb768f6ee9dc3492da26d1cabb526a74e19f6cd756a236ab2152f299a1450f443eefbf460a6e61c548a082b4b66ad4781fe0c3ecfd769478b5144c2c85e67d1b076cf2c9a7f01d24c4ad7c8fde46bac54c454bf4dbe3234f25c461cfa39f8363f889d0f70eb87c64263d2711252e26a3519fb2a353e29d5ee35d3c59071c6c16f399734782e7cba6ee48f4be9192526ddff4724f5bb187dec5bc8a4f231b43451dc1272425cdc2aea7f190f7353890cff338aa855675a41e770635b29b585bbc4856d782bde9ffaa3c7eefdf23f4f1c77dc8093280262c5e9b251cc77e2bb09897fbb030df7445634ac96ffadcc3e8beb39a917b6d3bf5b82db6a49939cbdadc6ed026622ec146a5e9e6fefdc7bbef6e81442f38b3e23fea44913ad74c8e2395d75afe767d79ce4df0f819e62dc825a65ed3cc18d085528122400e848ea91d89565e638b835a660b267e21148359e3640737ec8b5db48df5d7075ca3cf6380a433bce3fa6c14aa2ad50bcc312b4c2ea85a32abd397e94102eaea46372cefbaaceb3588eb9a39e07b50948d15b3f45837bf50175ce6dd8c97cea265e7f2cf9800df64dcae8960ea69655a3434e173911f807b8ac9067b4b88b41a8e5b8c6ad14a273ecd8933912ad72e331aae56104dc2d292d0617d73b6cfeb15be064fbdfdc2477db2b711d7f44f630aed237f2639c6b7147d5f616d826e06f19ad1ff441fc08920f9dc58ab203d1396ba3721e469e179e84f4d497119a38e2530b48f9369d646afe47c5af35ed97f2a5f6d4c8fd1864eb052ce1b504d7a6149fcf208e683803394b36dc916ed33017c06379b5659b5b55b07f4d0226c6a0d3e327df9f577a15ea6c4640c81d703e133697e59cb5c25187414a62e49b4905f09346130430226dcf420a0b77952b6fde64a3a9bb4a5ee7a360895015de13dd8704b321b566c4928f743f808d9369c834e44bebf69740013d06edb3b364db3e0e671a342a15f3301debf259d36510fc5e54ac622a97f69fa27c8ab60f7559249f0d1901e6562e3ec90f47397840a4124ccbce534bf2317eae8eb87e7b298ac736306322f3b719f66553888ddfd8890d94947d95b0ecc0345882949495db5e622cd8c75acced4191931748bb0021c2fc0c1d2ae78bb0553adfb54688f9a55fa13d79bd308881e7c74a0cd8d6df40dc64e9967f097f661935fe2f6a878e5068b9d340de26f96817230fb7b02d797eb33261b5079271b8aa01c62bede5170cada87aa5a0dea2962828b24d4ccf50ab6628c6f49ec87e1b0ac23087fbf46c5d812b04bb5cb6c4db34a33f244aaf04863c257fd3396d140b6ee150b718cb0a04223461e8763aba49bcc36c1a4aea4f7ace802156f79414c5692fa1772dfb92c2537e4fb76d7e793701e1f375498e022c106074e920085fe36cd2d0bb5afcca570f3745af380db115ed3a77db8de5640a1f013359545baea153771f6bc17b9bbf4aee4596badcd41ed88b6a65dc575f23b14d25830b2f211d44f3d0c55829ae90cecef31fcc74818e1f9ab01c3ff1dc8c4cf8123f1b5f7e1591f8339f092e68b18f80f5c1a4f08d6bb4e69d9be64e29a7595d294ca39f7961f18d3c9aa5fad7c4e58f282c9041c1e83b701524a2366ede95695aa847ec3061fe1aa682703cfb23b98389ab411d51bd2d2ffdb10c126c84465630812b1c9aab0ef69aee36b5b7ecc671a9b5d15073c539d4bf95b58d891b3d9987d5f725df7b3a23de94fbc04e0c297ea68e1469f24cd0f1d752216a143386170bb385921f483af13041a41bcd35ae62b8f7c319170bd7c00096fd53c3b7bf6d94d36a58925e043c1ae395e19abf0074b6ee1968eafeb4e2870565f140762ca2cfce313568a70a2f764a302e0022396206bc8c8a26fa6486d31e6102ba7a736e102642f8fe67fcfd590e67fff2332118e1e5bf11c81a591bc61ffabcab92c32a374ab4973e993d621c90091b534b54692d570616b56a284f15eeeb1b614ee62c51f5f613bc9d2a8b73e60297061938af302ecc41d5e10537d05a46a6430c45910b7c7d83088e8ec9287824bfbcffd4b211f13c78bcec804026fb64be874cb0dd2545f2f2db9510e5acd669b1dbd72c3d6003270018330f01915fc8a2e235b53d0eb6a7164825e577fb8b83be560b619c2b7f48ce3c9628f1a46be1aad07eb60f136fdbd101797dc502d93b69466abed48bbe9941c7c9acbc0fdbf4042374eaa48d71f5f2a0b4d2d83abd6ec35cc27ac6d4861cb1facc1039c848407bf1d05a32c92de515e107c8c56d2c10397082bdf2603e378111ac47e89635a18b940d5b26699dc230b1d291a900ebed88fca93858083b00426726fa1b1a55a79b2679f23c95103a6410f72e2be9d7cf0079c4277ec3af9879c486084bba39201710f8aaf36eafdb09ac5f02721b11fcfe4ecc37e390b92829f87616d66447a3f347abe95e6726143307f1035d65a86053ef328e9dd5b0d202d916ae27b87eb2ce40a263efb2e96a9a1076417ede3a0ed0d87eba90ca20c13666d952b2aa691539617f9c9b9697bcc6479538980be10933b7efb412fce4918c9e40acec5d03c7005666e109b6d71188340ac04ee34f6f6e21246d04ec5b4940aae55992931ab2680844f6efaaedcd6ea318d68c796c5a7c7a5bb95477eb7ed1ae1c8fdef5799aacf70abbb661ffd38cec01512873cb46a236dc1b15575b17fe96f5910f13a38046dce04b6dbf561e74da08167a90270578cf9c6e2b25bdd8ab9991f9e67f7458b5b7e25debae569d4d7b92742aef6d2fe4d5c975e2fea65a1f69a35bed901a272e80ed3c47d62fe03412a4183c9f434bd73c6ab55b3fd8d158f69754a4b62e1a35584d334f923075184ed1c4edc300778722156d31d526edd08886a233afcbdefd834ff5c4a69c46cb497b4de1f1728f47a9f485ca932b03de01319a8a30da2f947ff789001b88fc3a99ee2716ffa33e13f70fb7fdff7bbe8b582f531d34fd4e38562f6a7bb2095b1fba5085df75067175d0f0a5516681cc6f7a4fd606eb3894092f01eae1ed0bc9fb47cd2249e0e9823a34f75e1cd1d0fb8067ec268253fa441a330c898b8b34157c5c7d5f03e206a84754b97357f8f0bb2a3a2953b9af466b30f0fc9505fd501094f5664a1b412756290bb52e903ad293f9bd6a3dc2e93397f00272fd80f6443b4f163cbcfd3ce45f980008e67626a8f16e85cd19d708673f2f53c9808079f8295aa7e4ed81fcf55d798d27a3b4ec6a0cedf928e84c249fb7ffba2b178b7af022dfa7fc7da30ce8e89efbc421f76561596e8b748a2936f47c2cf2dacfb0d29fa6d00a38b5a3ab997e1b074bc0f97ace5c02745e9173992c2090b6b6445f6e30b3237ff1ede569d54bfaec221691a04c0f67ff364bc729f7b6a97b0d502b7453b79959a000c2549692ad00b7b84abaf7aeb96431e97816b4a3e38d4cf14d0370066cbf604522a7cf6fed1fc41dd7f17e9acf10222deb71b673ad6111f1dfe68ace5fb1e605b21c573672f9ef67697fdee53df86c29e78b1567cd3fe9fb9d72733c44ffda8fa8a1eb8128a810f820ba7bba095630f1ff095ce1b3015008bec186892b40882610222a8d6a72fc1e62633304d7da45a4177bfcedc0acac9ad8112ccebefbfd0de18d9843bc46bf9b9428cda4b6e5a597c2fb87669f0875cca2a23c1d056315cbbc0aa61b9fc1d92e6da4f53d3e5f81ac1728d170ed65df1014d53137545aff96d0d6e97d55f850d19b455a54c771baa5b3e7d6a539db90c96ed018a9fc331d5e6398810f5231dc131a859e560fcf7ee7131d346c3c830ad12ed11fc6a79d859f9c67686f42180f7c02fda9c412384082e696dedff5e66c1ea58b5605ad828b8755bac6e8c4c0c338ad55079a2d52e0754970da7d0b2e55a0ac1c5c9961be6c13b224d2c4d392cbc4bdb5fc4c692951de1c852f0742dc6803c79ce36f8ba0774256ec72086f9236705106744a0773828ec31cbbf45aee787472ba46b609a2e283c567e7fe4096e5136df474da71fe1cc47d71b0140e2461bbc951d2bf027605ad2bff06d3febbb0f93045794e8fa3ca1f1bb5fdea3b326601bbb5b9544a5ec6ec8e7d3d97c9e9d51d6542b911e05b641d16e167362f899bb39430348d1bf3d9434368aac4fe58324b2283bf6fecb1f0ad0671dd24dfb76a4062ecc55de86980a737676b75b6d52444c4b753551001f457156e8439742597f68a9c102b50e8cc95a12e238ca8e53f4f69a0e9423f00ee5b1d629ddfa0416f895fd625dcfa6de9fb120d859752c79a34e5c333cc550424ece39c16f0f991c566da873425a2d21ff4e5891c76d52c82ccdd6d6309c9654678ceac2822e3c3a1c1e578093b75fb6945d4a813ad95b1f787a1ed15648b0e72592c55430602acaa8c3ef895de3e943522f16701a3d83306c972a45dd8ff840d58555bc1163ce1fdf4e2fc4891ebc326cb4e1e076e6c3958b6006db959c0ae5c3f29ba1060aaf5e2a76b79a17cd5c2ded2bbf9720bd3f57c0fa4e17ce44edf7a6ca609d38cd14c93df6eff9f021c59735edc8371a15e9b2f01b3a15cad582332a82ce565816290287f14140ae4634d44c95795ec41746a5fd49d03cdaa6061d0da4c8d6d3b1b88520d3785eb395bfc4076f36ede6c48009e764f7bc504c51d67eea63e2747d37911056fce85601344abb7d44e10f2e33db9f24fd006b1b5fb85ef40306d91f76473e32ebb21c07ea28dd6340795ebdd9e0b89e414724c6a080847ab58315fc248e35230b6a0b524ee6c66db078a06c8f6d1fe198a2bd2d413211256823e4ffc71b427e6da72e0a9132eaf1767e5fff6207ea6524af61264a98b526f996acbfad9de4d4707630dc6a9cc66f492ad6baf7bdf6bde64fceb8f0558d212fa80a4b291501e0a7e3e8261d4532f170d2b18746758f40c6abad72f14ba9f353cfceedb38a21b71115193b94d1f25ace589cb5ccccd9568c8a0df113b4bbd3e8b466e407b3c4f04a83d61191fc8fb6ae628e7063063b865d64b92ec9a52fc20fe447cd05f5a1612e4ee51a0c2837c79439a257d429fb3d2b80022aa428b5c54bc21a662856d7e594dd31ceb6e133d0ece8c96631877deecdafdb49ccf6dc42ade7d0d67f408017a898a34d39bc70aac71cd0b5f03e0a434f604bc5ad01c96ea8dfd68ac734c99afda91c4b1aa167342f58eb961bba19cd7aeb44844a1ae4f5c0c49a167fce79e3375a32a2106699ee71608ad83a8bafe5ff0c1e78e038cbf5cc9ef97dbce194252d7785a1b460b5844b732e01fe9fd25c18869f4a54d543759bc72b28fd08ae39e7185590e4ecb19d5592b88cf94491d494af55ce827305338a3a641ee88ebf3c609cceed6c3790335e710d5db0501244e639599066775f8da3f74bba3ec250010d3e286221f0ef24805a59b60b82fdda02de11f6207fa7e4569bb133bba887854093eb222d387b8df1eecd693b2aa33a8d5add284529df94f4290b23506bf8ea428abd75dbac8e8d477c84699ccc49e69f5e2da4d4e646d86c0072f5f23df06d7e4999cfb8f94831cfffe0ba58e29917368e660678ddb2c0838cb9e984ffde0b2150037f14c59c4f3113f79d9b3ec04446e72599722d785cb4afcee57cc3092b51759a1b0e6f820d63052ad8dc42222ae7fb5281f7372309ab5078430cfec29eec3232bbd0c96a1932294f1813ba5eb1fbcb07b8d3f6405dc67a27620c371f8ce7bdc4fb71d5cb82382c8a2f072861ed39a6590d46394cef9b7a0e69cc88c7d13291d19a30e779f2fc17b2d2530e9fa3e96866d8d68dcb93a08fb5c0a013b4a21180b410308f7d57e5a8f4b3bac76e171dc79e0dc94a479b24d5ed9f59641b9940b22002c55a19dc3e38050d1f730b5142c7794966d08959a7dd7973a607aa7c93ae22d2033dadfaf19d815a7beb098381f24aae31293b6ec0ba16c56b9eb760e085800336cb2f27db7cae1d19a8b1bd036d8c88fac5a474319ec8fbca74b0b3d97a4ea7401e7832807d0a61efa0da541ff5ae186e7b6f2d377129bdd59eae400b0525ffd9849524ff50a2127ebd5f186c8541eaeaa8c69d267c9fd3046c7a9ad967bd0600fb5451ab9886a4fa28f9cf9fac97d9902fd881a9b4aa6d1dd98959f07996c7043aa4b1aa0d8212d48320346c40581c78030ea53127ab84cf380291a488311b62e5308997a24d355cac1734678eb57da1b1ddd3423da0b9d9d2d3f2a591fe762d617273b41245195f2c3a869e69292187f9f79351ef8e4a71e124cf600496b17cdd0ac0afe25ac557beebae1737d775a402ce47f45d9cad6a3f94ac8c8936accb4e6829a8e1e630b5b0ac140cb544ddd13d237ea7dc497ed65b7ce6e7129834cfb9248ab1cf312f8cc714ecf9936da1d3f0cc58b725fefa0c3d1a3c739197a1c858623382138a784ac78f688dc6f051409ce4d2b815a829e1e21f5f190b9ba404502243f8ef0bf8fb802dbac61424a1ff78d5043d283c72b74fa082e4ee5795625f98f37753783d94eef1953ec803e350039e55c95d55d008b6f24b841b066abbd60e1f12f9817becf186f9c1664b2b24783da440c3ec4714ae0d933638eadd4b511f7f9475f593225e98888bf19da87df80dab2f50dfcb000fd090ff1313823eedecaf340815ce7aa193c9ed615982bf1c63bc7f512d3efa742a9238541f653bd33dba9f7390b1e1c6a44f27afe1ce358188baaeacd26f3105e7340bf8e11853a7d3fa38f19cd1a0a9ba51cd6042d83273300eeb93f69e90c930d24c811fb9c5a00ceeb5beddc77c04b0989077eeb9dde8e5c2a68777d3de68e2193f6631def4fe870430a83557dd3bf946da40070cdff11ceb530e64c3f2fcb1e3262a92ac954342082fa1343ab3092bbee2cd90904777d8de48fa373047d3ccbfc661c95c235a3bbec6fc97b77ec41760e984c7c6057a4bdd8792f7ecf4fb4afbf8581b02fb4b5b0cc9a4c5442adb7b41e3c50a4580ebf07a3758cb916c2b68c169ba33d463e3600a9e74701a80f79b338d07484d33f582355540abee28421a28e6a021d438974da7aa9addc9197a6b5a2816a6c737a76724c8f29995d5832049728b10f93beefd3cce2822421638d5057ffd5f76494e9da30a771862a46da73ce937f2c97759135edfc334b144cf145e67ad8c891277311c6ec836173dce759b3624072fd57604b05120b25a0ab0f6f575edd6198993f0f3dc7bfbf0bd8d85ee517d56c7f276295a54225087958a0c5fc3c5461ac585faa4e3fbed28ab62abb0f41a4c0682c48631dd256a5d53787654f7c30c65b4abe9f2bbc87c5cd072d9f0bdaf0cff35145f6d961876e1a877ff72f00b43c609f10cdd0ee2d5c6e72b15632516dc7e594aa2eace2bc96d1af0016c0452f94c09f4f4e814cab5e9ec02eab4e79863cd83dca3a186bf85d3a3efcc0724dd2c4d902765358c8a93dcd691d89a5ea4915f17fd7ba07518db5863fd4abfb77f22b1f7f8aeaa44353f09cbe1577cab93e196b63eb754ada4a03d441f312b5e697f870c4ac4f57b34a483c7564c101e18b059e75e31161dccf5d9237ce30655437371f1a4f7144e2458e7a3dd6e3e5e84b803602126da169d468006eca4e2bc4ea8aca95a404db783273544c5edb4c5bfd8144da01204043d20ced7788f92b7624144251bdc165ea2913875dbc9a52ff3a0bc78d3fd45477a4d7fc733ed051ffab9bdf092a72681e8275dc23e1ae75aa10b7a53eddaa6afdec7418e7c8d194660e330981eaf192d658e8158a9f6e393af49d483b7cd31b15f187a33d05c4dc210bd85b235d214dd99c72eaeb3fc7c27271b8b9fcd220cd65a54338b8a423b4aa2cb0f624db290862d6496ad4d01f3b1ddb8300040a8bc30c495f9ef29e6652d34190b3d880b0eb1fa7741fc99939dcc857fe9eb2b6a16beed65675bd36aff9baf21b589ce7f586dad83908a1769d14e46a79e4c1c269beec7d71d668ccf2abee3fd4c40f597859317b1e313d5afe5ae3156746792672fa72fbbbacf5046a5d5c8457d804762a064ebacf5e7586adc901852caf5b57c31ef6fd95a4918729da784880fe7ce3eb1f53e8f8d9a067cd0de01ca19ace027d2a45e4dbb19509711503ad9d1a990576fb22c708bed316c6f451a5bbd81e56c0a8a49709baa607a05a4994a61778c3815ecd084cec0b7aac578e1faf816a83c2034cff34710986769c4ddf9723a205ed6da3dae1046583bdcba760c366e8920d3531d0481808001a23ae1a4d87895aa6577a6ebb7f760c3cee416e86834340544af0a55548e56babf8394134bad34051d204c9cee52bfb5837fda4be57b119dbb0612ab84176b97835328c473ac7adf338eac01a963531fa603fd87230e306615b61b1bc5b52e4c2766d3d573f0b115e65b87d3f88386100875792865fe9d256d6455992f5d3754b921dbf68585e2086479c2b37735a795666adbc868f27f73bb852f75499a6d0d3969c8038e83116f65f8b1cb9315b774760acf51df77585ec33150a6ca041cad36d6df2505c596aa74f66cf3f05e76862d612f3b980483be2cba46815e6bfb920959d2cf2ea6eb5627964201553b67878c023af9e464b46c79626b68943cfb160938288f17084f745f414a8fc39ed1b49a67e89b867193203327c93e8639aaa8cfbe6cf11e0e10b29ae8d78ca3b99bd40f7f79bb23e097f83ab2ac90981237e586bb2b845d1d09472147c9d16128dd53f18dde484bba186ff0c37ca1993c233697812da990a1bb86dc0e7e91dd886d5e83348aaab768908f4c86e9b165a599350c121e3f1533a887e8e378e1d21ab41d73d365dd90cd5adc03b26aef70337642e745caf4926d5e2ffae783010346f3bbb4db8e9389c32388d1b7bc2a049d6c3684c996dbf657557c5a29f7402d5cb7d66c7e3e180aa76e42241939c7c2ded432d81849e9f90d9c35a17e0f964f82574aa57e8067fe08f17b97ecddecb6fb40112f26c8803627148611cf84e5e22f18987f6b9c5ba05cdfac750762d1bdc3272f343aa965f151045259535c0b9554fb5335ac52eda1d116453ad7300ad33099aa8d180d0987db56a632fb7e8592f9281d52338257dfe7decb1db462159a99c2056c2f1aed7be6ca51140158694ea8a3279369b650a5a50cb9beb0cb6064fd6a04d3c824102d24c6943f4c3109cb83364228c5bfbdc5d7f52ba14760b2fec71a25775545ccbf9d50a18e6befb3d4894b9c609d85bdb7ce1a3495bf5056f3eec4122d9e1d369d0873dff107629f83a49b65a130d8f9a89e869007dc54524de570bbbb314dfdc47d3782277c1659ffa9cee942ab385dc295228e7c04d78a8a4fba23fac85ff51785c2b6e90b3143d3ca7c8080e3a5458e0925a30f2875bf8c4727bd792c913824080ce0555b704b7f59f87cda1bee5e470187db82627001dd02bb45f19830b90ddc5983a1ca4106379f17fc6fabee4eef9a32097b530f07c88fcd327965a9f576b9d309ba5842b619d93e741899c0406cb470822f3dd83b06996b0b4652e5cd8e96b894bcdfbd4dee2a36b98de2a74de309047cc107ced576780a13a6aea1ac445255bd93e5a3db5770a4b6ba317ac7b59b21a04c3c283270e5f33e7ebb08795840bb4e468c11339372127b04545422f015e846ee7aa0d0ec10055e0d4cdf96011efda62fad5c1297380d90e2b374524854b2776f5a5a068b85014222cbab9c1a2ae9b7ad45f37b75af732a7a1725126fd91fd0025c Params = SHA2-512_W16_H10 Msg = PublicKey = 04000004723e42717aa94e533e94dc253c264f8320f1c9a4eb69f1d576d7cd0def698cdff86a38b2d3208269892a07f40424fdc31d082873098b044240aacb9de97dc7f62cc783ea008361a066632df01263da7bba38feeb0a013fa60c84c23eefc21218cca425f89fadf8047ced8f3c5b7bdd71cc81a4185fe8e55fe9592412565d94ae Signature = 0000000000000151f67e5bcc86c193fee650dec0213ac7c7ecff87b5126026ceabb908f6c67156b3e5c04274b20b794a775b211858f7ddc2de11d381e15d1b54c626748ca5508adc770c56375f9bf3257532c812742d10f29b2787300afed9410cd511f506ee07627d4e57b6ec3cc6b5d221dc7b4bf7e455a9a5567ffa6bccefc650c01168460400f59c4a9aa4faf699791911ba3b77d7e025b03c941703b5ac4e65f9c38892e686d3d616eca0e83c2986984deb9ddb6c5ad5f7c1ec30b00369d11a09013a189e3a32cae13950a158a154f853f5ca8e0176fa15b3be60d9872ec61589fd7e79bbb984fc80395e3db90d0926268b87c1915a8fcf8d4d170a6b39e1e98e0521810dbd522fcc9d16fb71fa148038edf73299d8920e58031e61006de20f34a5f611409e2cc2ac58a3f776be20015bf4645965df3ac0f0cf33bc98e26d8098f64b09a811d08002c89b31aac2135cd776ed68af86cb74dd9625734d54948b4c4dd54f356a89128166a8cecf7aaadebcc977366339b3f5ccbab34c2cddd308d5f3128f3b0adc86ba2c528e54abc914b8bf729b39391bf2822c42515544c3e5b8ecd891271ea2549fe1dbc1e81c52b1187d8dae103a9a10c7f0ad29f8bea19d20b334e0715815ba93946d7d8fcf4bdfa21ee12ce9477303063d6becda8f67cff841967f038030456ee2931c3dc1495eb2b5a09e9d20993df647cdd099a91fc4ececf49ccac0f1f48901b50861e5e00b575a42bdfe239e71ba9ab1c6e8d2e4dec31e35ed03990e3ad9c25c09c296724be3c284777c14415585ccb25fb2241786406969e66a5fd2b5048e5a0885f786268fc4e5d42b960d28cf8af132bbebc3141d6f348d6caaf91a773ddaae1ff81e42ab7d1bda05b04688ea575b867a71f1de345fac2e49b0cc968ba147bdb4f2d04290ff61bdb44ed50fd174f2daa82e8ecf25a2eec8156ca23e2373d9b42aee4e823f56f49ebd2145ccaf698c9c9f3e6d98eb82e182b117ee3cc9b9aa25400c1d36468879271925fcf4e7ce2da2fa25bea5f0cdec06cbe1695137292baa801df2589a76250853ed38ec3901b705789d5da97174c41d65e9e1599fbba92ec319049cc3c46990399cce61185a1913dadb7217bc3d136b70d039b04498ef0ae8b99f3c87e6aeed31264bd60117b8228fdaeffa81b5f797203a85a53ee9ed262d0a929bd4bac59fa063c722e267c872dcc3ee40d524c5c874761757adaaa5c4279fc4f2306ceea7a1d90622c65400a4fd7b63ab7a31bfb7980e2f826ff2e55086d025ca3591874feaa77115b08513044f08ea42a58775ca206ae94b5894717a7ceef74b8b7667110539674fa35437ab19cded9a70eb47aa8661cc8753b692b9b28a63b259568555dccbe9fb5bc8da88c6039e98b5108f0fc7b7e1fa01581bb017a8498316444f6becc67fadea24bf4a4ec109f75ba9337d0f4636343623f6007759c86322485d0df246cf7950d968498a1b216e464513aaf926294e451c8eb64db569203c8da3a4459437a87dd0ea69a51695449624823c70f9822ae836b5dbecb81a011f80d904430041f9223275670cdd844536908e84c52f712428f97c964315b8b7046e1063c93bd03f49044009ad3790a686d6cddbada09964743f869288354a6089aedb6947fa36d8642d0ddee2fb251bc575de47498b5bd637aaa101f16028fee71c0dccc1501ce7362c1434def8608c33c58018ed45de6a347055de9fb3e405a52c0bdf9c38e5f7c05e08ecd93ced193eec43348dbf773970341c508fdb459612d0fffeb859fb32ae5aa91a223e7e2152d994fc8ef5a6ddff1cb405b7d68758739680184ae7ebbb542c30306a01460e15f1203df5e8be2283b02b4eac29566dee4e9027d7321bf1dfab438a7a3e448a32a2b642092015dd7a10df4da440a5822f3e055d4f16bf9635f53c73373421f1cd4bb7d6c90e21f6852f86cdf0ac07d54d1e767ccafdf4c928af8a0e8ff641f6e01b08b63118070ca7ee93be62d836ed0159965f3bb0948f861d32d1d5b2d784164b7d4197d12dc8b33cd327b141cee9a7e6fe7b1c988de6d95e220d97e51081ba5444efc93ec0a2fe9d85b3078e81585f8f07f131185e046640e6e358928e4cd5525bbbb30d499e3367220a85c9b32da336abb6abe52879c8b58effb502f054a6349ff331b92e2445495db43d947ea19aba70966e6e00aaebadc3d3704edca8eac8be6b8466a48b2853ee1df65dc5820fdb54f8e684bac04a2ec9088c32a77f6ad94891b1fdf60f58ab73d285229053ebe116b3d17fdb128ae5e63bb520d004b3a5d6b9dd8e709f87f9922c29d0aa6d97fa38ec05144160aa0082ffa226afb9af9ad0f4eecde4c4927e05b3a384b65a17918d1fb904c321bd50071051f81ecaf39bb2b5f242522130309e672f6ca17c3310ae9315e81a20f3a3e71509f2f2b2c191628ccf2d36ad203274f5f07f0be74fc996d9e66e44931d68200a69ad8653139fbc63eb01dcff9b2943af61deb8a487163979da0321cf0142ec1f2358993c1e095878b725d1eace5419904c304b47ba41147c15631fde91d15066cfade3f631564e9a956b4ae8a991e4380574403d0c54801f16cf4a07622772e1705c3d9d85e6b03441d61df6fc5742db31c720b1ef3f01144031ca746611cfa4541b70da9fa4ac99c8e0bb74e336b71155c6635fc4939036bb24a894720d05521bdcc538886d70c190fe6a85fb024d1d227620a9b0122138bc7ce4cb4882deee2dff20d6ed21dc69a32ed4084406cf12160efe04282b16028c1ab44dc941ea5850431d63ea5fc95a261a9be1742d9a225acf06d98a21bea1a25ef963aea9ef94747155f56318097493fb8aa56ad8888bdecbd8f2c4db70df2f0b327d9f365d3eee3e0bce43bda075b6d1c49b4bbcf64856cf755ba2ff49a81e4420b008e0af588cc29883bfb2b2c9dc88ed9195d7c2c5ffa2ff469d4046df75b3d104c5e3082b50218e953ce792d3ae1d60d7f87bf3eea49db03fba8b6de87286dc4aecdfaf61642053ca4e2888401ce552de7a271522df1816aa5e6f7c2bfc7b16a518248112de48f2a33ae6bb4aaeb60fc9672d772323bf891bc1830b5f5bd761a538b820fbb5f696d45f47d92eb8939e22ccd054bbe40ab0e62e2cb908959a915d0a0bcdfcea997dfd4f76fbcd9ee579d449fce74afe77831b061c9311e4885dd0f1cd44a80752b554478476daf9a87f5587ede870c0ba65c0442b439d4559fbd3064626ac330848520db0f7dc05f1289003a59906b1b5d4c7e7d0e566427f6eff71660325681c78d62db4f8160111a766f826e3e01401e0ba4283039f5f535b943f34730a740640ba21dd08d50fdd8138b8b6e864a76d9eb19e5381b06e877830bf6b25f7e8295f21c2616afb6bf6193aa5d5a1d2898d9157846a5bc18aa43c3b4506769f01fd74bff3c9fa736b968c0366399055720e3151a25575e07151b58787e03187260bfe2a8ac1cea234c64b06a269e5ab99dd16ca4e069f0b4fa94223e4bcbc545f1be42b9c0d12ca9aa1941de9ea4412e20ed5a26383e756df6f29fcf6bc94aee0f1029737b2fadc7a4a2fef8d8ae2d8db6d74ca9fa8c0706f56198312ac511d7da9c1f3b2179fc9cf19cde023e68342346096ae83aed09266bc60381c11cb60f93ba66a4e13c59622a5fc8afe0570e5b3685e7e3d9c4f1691737afc507f5c6e34fc99eae4824fa5f6cfe5bc569cace343b0c3f804a6a2534f4242aaa72d6a0fd049bc72fcbeff105017766b1c6ff6e4f70bdcf05c1470560d7d7695c2652addae34c30cd27f2ae9df28ec3140850539f2639f064b58cfaf6cd53702c7b24dfb66fcd6d9cbe3d3c972413e22f0b7a55fb80cd699d932d3f824c5c78854be174427671c171e270a6d55fde6d551bf898c2e448605ec285e7b87d177b9d2823d00031ef843c2cfa70368d9c3ad058389acc7004535c849892ce27df5905b12ab3d1f6348aff6cf7e6af9e9c8967b3a6ee1b76aea364d5360d35c546a69a09838ac62b6eeac47c799de6b2891d62590da7801bfdc37ee9ae4cd046792334ea0fd9dd53e66afbc3e9dab141f2eddd06597a96bc7375e4b31f7cb23f6c94e58a1a99337d057d2d620ac0c67d9991f09381264ebcc356e9b18c74438b86ad74bd11b4ce0ca45176bd086855bf3f47d0aad4f3b40ec25d56512d7a9b66a85d35c28ca31053806208ba89948d665f199aa29f09743942f175d385b3331885492824d8c6bbeed9e15b2e90bf6078159a2245980cd44c86d034d8033b1f7ff8a9b7b531b5af06b96bcd984a8bd9a8aa1d8462e11b7d602bf95dcf7d8b89c5e95edc3b8ddd3cd4d4e77a7a4f855105aeaff13ea4d90af9321e6bd0c9dd7eb117ad704233706766f4b8a086a45f0adad71114a2ecec8da9d529dbef499114158c52db75da05bb40b03aab7b324c3310950f5af4aa795c9cfd8c0f5efdf7431b2f9babd99ab5db3cea19d7ddbf8ee9bdf8869050cce2456137767577aa6b053733ad76c3841562a5166948b6aa7fe52179abfcdc222b72b1a5a508a36d0c22eb61a6b6726bd5d96eae7880a602e8b2ac170c759f53cb0db941d8971a6d53f482a2da52821125d72a49f529808f466a19db77ed61fe0cac8c69db73aff5c987e3fbb278756f437ee4be3bc07b9b05a27279cde08243f7bdd6b9ffb52685ba6a3aa8a740cf58ffe5533e6ea1b0a2faeac15373f8aa0037bac3d62bff276f6bf56c7b9cddb9c77536db4c794823bcc4751717407187008f3900ecb66672782efd557d76721c251df5b2f18c7d627325b2ac709e60958f443ee73da901b261c8ae47f8741b2a904157f86dcd549ca97cce97c5a8b2d0f420861bd72601920f4a3c0727ccc1ac231e31a16b0bc6d0e48732d107a0a032e5ca7baac66bcea0208e5c753928b30f643a4ae5fb4125ff8da4a96a9b7e6b18c8ea34b0b3476457686c7158f21a901ff7c7017d6fa7d45d92a933a3953e444ea8f92d3de46fffe40f12850d9d04a248811d78b1c0a9e66bddf2d53d7595743525c6045da59debfe4df68f72610fb70103f7c005a52597a4cefd1551de4ed2a4e312fb9a8ed167811d922a74f2ddbc61fdf9099683483095d9abf3040e9018baa0f6c2c133f6faa0d11e122fdf2fde9303fd81a54f6fddfa14f294aef4bd0f057763e1418b213cf690e4ba2c440416b05063529cc9952eecea7d86f5233cacb12203ea2d9084a7e2fa06b11bfdedecab8f08e64a82db5760a3b534c886d33a95c9935aedd8382d5574d29dfa2cc1d6baecaa966e990bb3b1afe54ec6239f87c2fb83e075e20737e66599a0d9f86c6cf295a4e370a9f26dd266a5008df6c8a3ffe49339876ec0e95996d1cba8f483a90b9956136bb3b87a881f6f04371be878ab1e42ad6ee217e06455a8b32d3c283c73bf3eefc925f401820492ccdc609efc4ff020a4a172a12318ebc23259e45ed43ffb23f26f0a84e5647a6450ca98d4a3d70770f34458719aee82604fa76286ffcc106ada4505e14df3fa808cab5cf04124c9577f942e31f8552434731e84f8fd32df374e9072b9c437056ec3e18b7e4277b1ca13a3fe33a170b3b79ee3c04ac400f9202540430eae9598194f9639d1fdebb030f09c41770b117a3b79e3d56ee26275e30ea7c853352fc979b657701ddb48cd4411abb070c45841c1353df255070faf4d017b5b3984aa99a5ab935eb1afa3cfccb6fc119ed93a619432f1fb4538735672bdf088d9304279695d1d522afd1406f31aa56da3ba3578d5853e20324417c8b6c8fd14d27721ccf9af449dfea191bbae67ef0773f86a296d69c8006b0073fa666eab0f3dccad6ae15870b6f7858f011c1462dbe19fdfeee78ddc259eceb6a4b5936d6b276d7716ff9046aa13e4884b729a2ea4a3a057378cc8f2e2f35beaec2e8a572bda07a60e2b7be8422d4f0db640deb3e72500b54beb77dae0efccec6b426c4934bcc77691968b627a32ac36a66cbb135f14e61caff3de6328b2b743784cb6f6ccd83ad0f3ad8745351de2391890b7989b6bc5d0a1367a7be0ae5782ae785587fdcd33cbeec53a23be6a32d85048c781d1c3c8d226d63ecb34b02fd5f6946ae746e6e7816eff865e2afb833a0204eb15c6d7dde1603f358cd864c68f814ca7ec218f3b32d98275a3cc0d35cdb19b74151190ea88b78cbbf1f399a404362f5f4f68de79d97fb9944edd6f5d99462b1065be338d08f726bcc5e4301729f1c890ece611aad9c197a60b3f4a0619ec3a02bbba1da3528a55560dfef0787a9f6bde732f49455b2a569f98fc6a97ffc95f50dd80a8a8f9214b84de228f22483259183062f146ffa8465e695723d87e5234f4aa2fea956bd23d1bdad156d5d21bd8ec52acf2297728438b81bbc9b98bb193c299b27b54fbbaa8dddc56eb985fed2746c499f48704a526272fe39aff50e4a464482dd4667b60daf645348528d251ec21c9094160853954150d29dd7460381e2db431d81cfb60e3c9e7928f71a5742ade78b5267630695818f4e825b9ed89f2cd36e293e5f53777d15668037ce314a46129dcb35c060817641da7d58450c1c23021d513c157e98137918fb51b31190ce4c37361a2532a59a70130e5e1b3b9fde586e3c3307ad6d85b99079004af09a1ce49b0ea440bc1b3c4388eaf3f7eedde77749fd4c812c8b3f0babb8c4cff0e4bba595c4aa992bc0fe0049901aac99d42c6055f07f8840d1d99e6b340f0b3b4a5a2a46401ea8689bf0fd4ba79c5c4bbdcb1be986ad84d0467c781222807071b5fcb744248a403a5f5c3e8e1bc14ec914783ed85a6f363c479adb9700c3d9e5f4cbaec921880157b559d1920018449a19a739320f0ef6a9e0c058fb56dcccdc2014ad9a07da3952f3b928103a72d36d5ca0a50ea31976cd2978a610d4c5cc7978407bcd66fd0c198902b321297719f9a865acf3c7118e3ed1b1b253d9f7403f91934d54575c4688c5ee57d95fdd30d2db56b2d88dd9e94076c83551170f532edf8f8cbb40d5a40b5a9d36baba718bbe04f2be8e14dc00e75f46af8f4581813334793fd3ba67dee1acbc957763b5d33fc819ba0569680c6809fc51586d1779ebcb411cd3d8a2662cc643672eb313db2e026a953c0c717d60036711aa6fd7c9104364862ea8cc92cd5915eecd7148bfab9422d1259b9c4e1acb7ce285c05c5a2482b7615819c6b671bd23cb8f9c0b0dce85a4e1def8aec6ada6de0a13e282ea1663eaba2725b43f3374bb12550664bde554a741005845e54538a069143fc51716b6c86e1f302e0ad398e8d7085a99c9a0d1ee9aa420f2c12a391507938d33c61aa4b01b486123c1f1eadbe826c54a18725ca91c6fc9c23af9064a7ce016431ee13ebac710aa64010add3259e26420bd98b7edcfd8a322efb0febd8205f794ec4f950066f3da7513e553c90817029a1d6c187ec98b8447c0fe570e94de5aac48f9f939823a2d05b1b54c38f0578807e39879ebf355ccd2944532bd1fe580b211dcd625f72bff2a7a87bcf58df0b707ddbf1d8b1e5c1ea8543a4a185ebd3b8a8a4ba95ca225dd56dd3b65077c667b027bdba05037adb7a05c84565d52944b6582a92214227acecf08b7d08035e789eb625d64e2a1be7abc6ff229021d8cb9adf51cdfade36a90251cc0398ec885ad5b2fddb3acd2ed6c2a1b3e49fbfc8d3255625b4d370d13405079fb7465c08346598898a4beb2452c5f1252001ec0527cc1382e22eed8e05b6e15c68a29e82ee453b4dbeae2785c2a2e99d4e6f59bfa7a3933d7ea31b51ba9f3c4394f8d512f7532f2ff6ec3cf2e19214b7c56686915ac7723fe5b1bfd6c2db0f33f1d1a19f64148de1a35cbcc35d0f5f391e2546b60875e3bfdc7a17d9183ffe2bcd3ea0b0fdb1f7576cb4dcfc72c2289d789dfc1ab2e1e201d9037c5837d29e2e7f463d38e2347880b28482410ad4cd3e16a9379f1f9f5655f58144b2b64b3a152e22a2d86970e2e48f0cab890aa35e5d525fc8eff69a6e604243c442552813a36ff8c02f616b6fbdddb12f11226b0d6215c6b12c24ce1705055f0130177b0825443f83516f04eac4a2eb4ad1b1aaf440369dc68b415d75f0bd7dbc7c202346d041007372d306e696432e1fbeb0f9b2f46f5a32304190c42a2bafe6ea874049e1deb9204ff75c0c02303742f1fa663923b112b7c9d0e4253c47ad0f42a6e5cee1e8b3d0a68ff7916104f12a4d541617ed532ac6b23aa11478fdeb89fc47dd54047ef07061818f65c74a49b3bddba80d75f9925bd7ddf957dd3955e225994c3f68dc2b43783f7405a40f9f334e15fdf0c38b3405422616801d216594e29cf511ff93a68782a9a70b64a5eab625a84f059378ae83488221e92485294331d49cf721ccc13881f137a1307d2bdfdcdf8d9d5f54df79d94bcf1c43c992713ddd1dcc57b4b882b15ee3abd95094b0a0f4b41c9ee09344daa828c27eb35a75876b1066a847f7568d525e9697b6df997711d80f0bef21f20a274534c71798e9bb8b49fb312a72713bf7ae75124c7b806a86621c9e4c44ad36ab4d012072f158cb50b4f5d8d280a124f0c389570c536280926813047e6bda039da168795f11b47b0f213cf68606834745adc0f5ee9679bb2b174a55a137588eceb551186397c76b9610913fa15dcb63af8a94ea3c7179e3cdccd14ca8a6cb62f371e828a40cecb85fae7effb920101d7a69805e78b80e6efc2e7d753b0c41e0e25d82b5b3730dc9eb906ee821026588d360d3f442c2138181fac35eddbb80b1545dcd37cb8f61f77ded5f1900bdf66c634cc559c3a7a9ee3883f9ef52e8a5bd2b736d8629459f163e5db22231049670cf573f057ffc68e6dbd14c69a14e8a6948d79cbe4fdd498462c87b114e118e5baed38457cc63454b39fc806dcfe4796cce15146cfa181f73a8aebb4be2e337027c299c9d1677916b212c989d2c65de6ba9595a5e1b39c2db54783f453678c3b53317e9923a3faf49c18929a6b3a67eab4b2b4d99a91bc00a559f347e8a3034e2afbb555fb2814e7fd6b7936f0b1f3c59c8702ee26c20cfef4c9b637620d6132fcbaecfe51ce69fc6bf570663b4865e5f44aeb64e8ef8d76ec02702711ea4fc45c396cc316c7d7b2565386be7d15a7752e5e6ac86edc3286cb9a8a176cd4a3cfeaae32c419325fd0fab70b20a4eaba575116ba19b6cbea24f2c66d5857014a13c24cba39ec138031d99818a55ba96ebfbdf887b2fa673766dec195c8ef40c4462761c3f6a189bdff740e7a4764cea79c9409d770eabe106cf89d80f9e0e2df54b1000a258bb76316d72dd62ea5fe61904f5a3926e06590a3beeb1f151a1a7549496f143eb9b2a533d87801bec30558a40962390b53daa92487bced399dd14ee95435e22d398a2c54e5f93c1912c3ea85e66979cb4e52a874603d1b379e9e21586c15beeb2d56f52cf68b2d969cb65f1729c49f6d88fe37680fabfd9e7a8ebb453181143a252ae3255b4514aac281c051c2e580781111351d74e3c9ce062424c77cea04cf73225594ea040297e2168592e92212fadbdb8ac59677f47c902bae96f2b9b492b9c28143ce40b02a423ccbd4ad223b621a24e7ebbf0111357859f8019db5b918b68d2ec16eed4677e18f093b65223b2fea6725a4e9cc256c9f3049f3f954a1c748a9e74c1d7a824f35999855a0ac29e7a0759807091e76388d880e4bc68350d315cc1a6e257d5c202a28be11225a045ae6cc5ba665ecbd158bd4f6fed480454729da235a4ef12bf7292f1e70fdefb1a455a921ab96f8d9b9709c9e6b261b3855202c3b00c275d500c495caf741700b31796e74721226eaa521dba7f89d1222c8a9bb7945c5a8e607087928c35724fe7ed9c2031db90dd911e20b1f37c196ee1ac1134e8203fc6c413b100133bfcbe32556b6beff916c588b1f628a8d786a5244c84913a355c2ea4c7601551f9b2ae7be5fe9b7d649dd56d1b147be0bf0397f614e3b8ccfc14fbd92bc70c14a727bb4902442da50da4f281b62115cc651d848d8be209fc2890d4fd54736f6007bee269176fa7d276c18f1ec4fb11fcb22d523884fedba151653847bd441ea61f27aa14a44507b6630a3cda16a6857c24d164d86c2439cedcdceca93fe5d824648e1f4b85eb962a002faca2289ad63a7e689b470b2e68a0359d5f7b28d415c2eacf00e2dbe78de6d18cfcac9d05f540d8826b083928c23d49c162877f5e0e1790d9e815915412b84b5632f1ab2740d3bb290ce0e3b6504e2b7e1fe5c878c15fc0893c8a28808cc8999c9bf809fe604fdd6bafa25dfa0b0c87b9f5f6981b30507f9d0708115d918a20d2aafdccb65bb92a55055ff86b5feeb65ed01cc1e00000dbf2592d15f7e629c52a10ce47f2d3f67d7550e01f13d3e6e10f3fac7d4500979d051e0efdbf77384d0af8b4ef1e8977edac80e38d6db0952d2dc5307221f704a004d71bd55f726fe654e06afe8ef6870e0122abdc14be2cdc7e97083aa523f530a685fc262ac7ce920ff2cde572fd9f1e1043ccd942f6bc5165f3b1ee9be1380255bbc4e0192e44d74f926259c8859ffe53de6f9368832d5affa70fa6f11c369c3e112d4919b9106b84e396778d2c5ca76f63cce105ef1a11ede6e1407a1a3d79df74e13b31260aaca9652b836237b17b7cc31479a49794c7f31426adc7098c33456555db7582149843b5fe10c9d296bd11c239089ae8b67651d33d9041144867def1b941b8c529b56bce508bb1808f25b7f32c3da2b232cb16918cfb85f55fbd8536f5011384b3a5692b79232e12a5981079a224b144ea606f7f3ee86fae85547832f6166fae54f2d964540277caeb5b72894538c9767958e7e1f08303d2947b8b8507f56e0c7c2280d965057f7b034c974dfac96b72da04d0d5c8fc5e58d4268a0004cc53f4c99f0b76612a0c1d0e8396ce7eb3e0dcb04f7b056fd917a41b125c80fb0e29daa8c3d5b3fc62269fe603870f2bc7c23e31451f2a5920d6de576caf1107d55f7d673d015ff965942688d5fdeb2ac18b85068950188eca27b2c6d4e6d241a21077f3993e169743a1921e28a52783b2cde7bc52e41147731d1e5dd739252410579dd9450f83e34db8461efc617b46520276f6fa1e43d03cb957c7004f15b2ecb6ea8fec8979ee908653c109804d2b96e96dac3f8f8cf0e33518fed93235452108071c2ac763d036c8445145f86d46b9213840ae39fd1fa8204967decdfe0ff40f6076676e6af1c88c1899c4a613e7e0ed165be20734a0382c3f9fd81128840e6ae16b2af211055841b7495a3d74bf24f518006e9e619d364b4766f77f88ad27053bc738868ef60902dd58f3ca6d69e42ec3cbf7e6f6e08ae3b759d8d1db7bf9f0cc3c3e2f948d8d63dacb4d2ac5146073352868a441f62b5de88fb92438a5cd92f85f299eea2e35c2bb1551c0b32cf078b6bc23b3a7d6dc3cf55e9650028513c014642a1815f9f16e37d58361859b0bafc5c659b389c76e63f50ab29dde31919dde0a30ac9151e25b6d0a14472f8add99c8e748d4417b19ad9f45366ddf4da2d0a0564e4a550510f8e3cd34359868698784a45cfe3c38807350f86940a9883cdf6fe707e33e1c27ca02c13d948ff3da682952afa6388861c63108754affbd8a6d7988f733d1df67534b867cf6d0c12a04ac3cb8b74ff00a6c7af8968b64b8821b149eba0e5db216d6231707e433e769fe59329b6451f231472d855ef485cd99035f77c7fa66ab172e2f03699690fec47d1478242c5bed8209f049d6f0aeef819274b46009fa61a7e39ad8c2164245e2bcb24534e66d55d18984b5539bbe70bedb33f111ce6229c5df8f8a1d424bd14fc78ff4a69e5dfde098dbc3346cafbf8beaa32e233d3c80a36526f09cefd1e825177439133e0c7ff74934e871401f7ea13a49f9596921ddfc437b1ce9eaa6d429ced30b1b235ada656d63d912fe42ca4bcc9d9d3d80dcb372a913444e43afd79d09bab30a5327b5c5453900676dee657c467cd8b3e018ef4008c3b3519e7a447fd6bbab66cbc87cc625a71362f3cdd9b0864948f5cc8a6c39d60965f2f4e32812b0067ee78dcc88516654d64194ef6a68e84ee4f9e97e73ab3922416f20bd9b3e6f8c7141c0709bb999664059f2dd348487e6a2f754a399f7b489078d60020d66d493e988fc772c6372c4e8e46fd4143c245140ea42575274b29d8607aa0d2abd67da273e02bdfa0cf2598b912770eca56342fd321d0d2b82778a0b1beedc291b93d9056b864343a6977081824578dfcfb26ed1d448e2abddcd8294da8729165216278a0da14758c404b4cfd1b10635bee4d090b82b2ca286e1eef03ffe6b46b4967bacb11ff3b2a2d5a7e1766e4bca1856bcc9da9fcf605d7ef0ac1154830008fbfac48481f02e8c959256a3992dd9af8f7aece9377f663bcaddb3cb192dae381f9157bee4dfbe47dbfec033543bb60242cc492e276b5f222ad07dd7bdb60f6539739788f544385baff6fc98e3895b79295eea664dfdc4aa3955808ed031635e18a138c08244fd419cdc1d99e0132d9d6b57d46c1b47b78771eab89a14a13878e7c173c3b503850d0186fe25cea61b126fc124499b5b0f2980262b02972d8889567bb072a9a28e94bd58b6c23e5bac13655a54d574f375e8df6fa57150436ed6f258566c5f61c9aa503741515135a177e594e41c060ac0f9e94682c9020be9991b0abb2c393fc1f50b9d84f30c4f7e5d53b01e933ccf10b4a82a33d694c61902132be6f10ec65dc617a0c05f7a58963350539cbed113a8a863848705d736db7aab7ddeed21dd09620ffa7fe438fbeb5c9aaf88d2820681005d028c17e601a8e53bd969e6c0f960257e468a7ef3cc03d049962102aea8fb38e49cd193a Params = SHA2-512_W16_H10 Msg = 426e562ab69a03a893f56910a2aed2a0618da1e365167749e78beb4997d36dc054f34225797478a5153037d4154a90c88836eab69a7f6783237143fdedbdb6fba8aedfd98d3af16fa293660640163c0936ae072c0d38772013b0bbf97cf44b64c44acb62803a7b2b374da627e47a1135782f09537e873aaf5bb54676bb5195aaddf73b64fb9b32f3054829dc0dc0164e51e9efa8bb5e9daafd97a85f0b3591e8c06232e6e54a3606cdf93a05df506905fb69b7cdecf62145d5d1a97fcf055b69d35c07861bf3532cc9bc78058ef266d8c98dce0af755c84fcefa69468d4a9cee6effedda0e0263a87573eb3e1d9f765083c5fe5e3598caa2874d065360e7f254fe6e3c3acccfe63ab3 PublicKey = 04000004e0489566fe62275cf1be38b809f0f959717848a76d26b2392793bc6523fc57aa78b3ebbeb74462990eaf2e2fb89f988b804ef9a3155641347124f7728040c1ef60bf55b84746d9b9232f0221a3ef11728bf25e797985607c06432ea5b4122574923583e7127424b4304d01f90de74e2c81aca71e6721805b70e9c77fa19c5c0f Signature = 00000000000000e10ca08803df60e7fdd6a25d3dddd6a2989053aa5c2f721c26367d3ab387bb9e9061d29b1a6e075544752d02c5f3520ab586870b57fab6186dd83f0a42d6b0f24222d910d56291a3623295e4c1ba3720039b34f4ab37d44cbc1c5add15d1f23b6a75ab03d156b3de75c5aef881f179e340a41a4f22c04b2e1661fa3bbb9e2fafe88a4449f812c2a3bb3ed477756f52af37e5d32afa3936c0d04e44067b155e02bb56b91e82f6a43c249ab14b15208def1df7895dffab75b619320b8295221f13daf941577a5d6885e70bcf305f1160fbf98c120ba2d7d008af4145cba4ceb34727c8044eea1e3999304bfb0a67cc1f666b3ad02d708b8293d228622800dabc11daa45e4ab36777bf26f322d36ff39e335470e14bac1ed89af042aaa352cf7b970ac1f4682663de659bdf9f82b765a3e54914238db38e60f02a7bdf821a328203f5f04e4725485c475b34c82ca912b8cf599217a6675f5d06990869f6bad4dc1efb7569fe073fe6c5c14d6fcadf4ea3b0922344c78ad88efa956a0530c009d09384b42d98fbd9436f7702dd27d658635fe93e973896f4166fcddc4ba7ca33e1baf65b286008d8e3b60ac0d67e73f9b253567135c82cf0c61c2482306889c67b4f59fa7bde1797517a033db19d9c62e3f384e20b7e396977d155d42e89cf60dd9162d319cab44f208d1b68284b3ca968de4bfc14f596302e0999a053b51675f56debe6fc8871636cdd4e33c25d4b5d04d5cff32016dc8840466efb32a89cc6cc69224d2d7943e6c16f1fba7fd3c31546589013366e07e2a92057072b9eddb8787c14969bcc68bfe70a7a1988d692cf97401ece6af0842c62d2ef9f7796308e6b225ff2e07010d579cd5386543c8784ce0a900ae5747cf1e065c06b32b93cc441becc114a16b1bce74aa41742f0bf764b5e7e162120f9794b9552ed5481b10b42d1f6fe584afc11880ab5d0e8ea2208f0ca584937224dd1667ffe768fc7ba92b20b1efb18de523780ef43a305f04f5c58d41fb7ffd58f363a601f878232f9acf72a18aeb38c568db1433aefb3f1d4251e80f709db46496eacec4cdec4a79a81632e689f9034e0715ef83c57b10306728ab74e003bbaa9d394440963744a5c4d32b851faaf4524539eccdfc5bcce0bba998485b281c74cb644683471e899102ec0fe703abf4d6a96637c5b7af308eb29eba6e513f68869e2fc17bb0a56922cfb681a4e59ea5263749d8ecbb55830442a7d96b7e29d6d57ea0d178e09760d6ca390988d150f9a4272c95b37a930949f7feb3e920933be8ef4d7e1826724b059dffa0345960ec7a1fedd00d6106dac2a14c0f6901ee2cebedc837d01a50375bb4a5b96d710d161555871e765f09b7d5cb1dc448fed3a79946d0191059687517ccdb916bc3bdf4af2994b857d40dbf82072a2288d9b02497ba40381631e944c83c8ae887a18266f41dcc13a421d44f5f62f8215c29d00f5179dc79143e7a67d32a9acd0565c53eb409f1de25b12347999e19087e1618cd58cde72b4fcabc8e2a1226918943f7ca51ee6eab71a542a69b7459c36b1e5cdeb90417d82dc8b2126f8fcb9d2e5cdb7069ff4ff71b6b13903f82ba5d912fcaa2a7abd113ae9e15568f44d4594de4af889b48dc5d0ee13180e528e61e7ee20303891bd8b1d253f17e1644f63d965c4c845c720cb67d2db964bbf07118279ca62cd6e99967d98e43e8b61b6030b6ae8c4b56b1d3970b7bf2d6244028efe0fe9d44a2f5bd06fe6ecc4ea416a11ba0864dac3404442eeda8ec65c84bb407136d6baf8a344f026699aa6930b07d22ea6accf4d52bb5ddece533b900d548b4b215579d125f83f70414af742e7149585b5ac5733d8a7612bcee1b28c57ee92b755400da62c78488008598f5a1ca065c52ace67666658e069cbce1f4dd8b7f24a78643d5632efcf6103466a9f122c17a083ca24c77df9759ddef4cd26147472218173555265691f507cbb887fe968fab43defbf8816fb6917c4b5ac41aaa7e5d8162e7eb541c83cc0613e64976578b9143d90976f9f1d88ed0a11e27293a3ef50ccddb05c0c2760c664b153289ba16270b724ec7f1de23f799324b83529532be4dd0f57e0077b023f1c66778bf55b4fa308f6a0ce9e797b0a23b0d44694176959fde0973bb871bbaf2e6ee2a851e48ece311006fda85b93b67f171bc7f438617c583306429635c68b48e7da1e2cd45511ea1e33fa18be2121d7b9acf802de6153a198c47c17e90b79865f23ebcaae0ff7e72b521dec7331b19e1a03ff1c86018a0e51942bc544a8a17af0bdedf7759de574414cddec79b0eaa7b5430393faa2ed76ba8e3d375f99ba1d34e3268e764607596f043bfa0c5c99adab33c27172a79b09c0fa3a7922d6ba7da2d8a5521226bc2eed48ab0b5f8c22f717b8f4d5d9d7120fc63cf87d706eb5eb112f3da2818c252ccddad01b004ad2ef9340179cb9311e67ca701e43db4d80c05f97b19c577696d15a2c157561119bdbe7d6c870d181a4fcee8527306414d23a97fce96908ef888dfc5f4049dfbe556f1a0b7b95df1ac71b6ec8bdbb1dcdc7f2309e912b754db515c04724d095e03bd550cbf703c2327d9e5c05c36fe8379b17b48d706160c3d2ccab168ccc62fe693cfb5f8f6b61bea6279208f6b3bc625e8077601ac48099f52563384a703b5e59c4dffd76c545e9c4ceeb840bc3742decb7b89d7ffe83d28ea3fcdf3b6499071a5b7cbe9d7e7ec9658207d6776668827e51adb24d3eefd82327ed1e92958ed8a56f188619a84854a2606504dc99ccba19db669311d90728e2b77e1d49518613a1f411c9f3e521a1b98c5aeabaec4497e1b77043b8b4b73f150d75e2ca5f6955b39987d6e302710b7d304c882fd4cea70194e7529d69a7c796720a358128c4d0cc27e24597cebdc88888b682c3e8d106137e172a358a525af16e138f36be2807b3f2e39638b48e16d3969245d9a6e9d8f8c98864360c0cfbc952c4c2aaa5ddc6da39a168797d9daf608bc1b5f99fd1c5677b2e8623d462b275d59da70a17d844a58008e39cc28e1c68a82f5ed064c27190a0422e06fa2023bb482cf930da4e2186f36f84836ad8e05cb233d9270da650f0b6eed1fec2a325116d1fd7092ef286d1ddacca7194d58ded1e9a68fcca7f33c1389c4441dd79e4831693a31b44c1efeea4ab80506beb5a001ab9d79a69e9a273439809bc8e899f53e69c5030999902c75905c2d1d195089fc0f6d54796fda1a4a4ce6bd172779c8af7e96b3eaa2b0e89d45fd9bb76456808db64fcad5af835fbe7b32d49f25ad94eda04c0c5cb887855979b255e1c9ce219dc19e6eddcf8c1606bd6cb17d44344491be6d5f7b915abea22c58bc413c4b3a4fa332cd3853a6e4b0d8e873cff42c177825c19f89c86bc4ef87d62a620a546e13c0727311601fcdc1f53f8a1b246885b5dd46c369b1760613517be65eb15d52b5a686a5bbb360197e99f3e27c45952ac8cc7c9bda76e9fdca0c9878ce3b1e2dcbb1f98ef97c5c7349b99b8eb2f994b5065b1f7211622164b3d6e776bc3c6ba02232c72b8b867f44e9ec56c6ed4151e3a1eaef761ac780f8ded2c3d02c01b9712987c3faaea2735998a9a46fcfd759138cc5375370ed411179e4cff1ad70841a95fb67461287059ed1f6f648f87446011e8df22fad689a9cfbdcc2c2b200ccd4b97ce4ca0eb810c7ab2452e8ae80327936710098945f082319f4007442c33b6b6fac9eeb030daab3bac1ca739930672bed258775100e3b5e78cc6c3f68fa671b92d4c59115ca1fd63680603290965d2e9e0b80d71cda7a0c54a26355901be67240490063cba6bac155944541b1fe61f80fda432ae594b011210eab5f1693b381592cf00fe3a5d531a99229a9aca6fe483e420f05d35f83bdf44ce7a3937c4c305bd5dabc904f9fe18d69109804c1d7532490098a10f7770d6af409e79f270bfc367d433dc8385c4ab5a6b4315da582a03665f773a131336fa4ce0cc3774988aac20dde501cd5bbbe532b73f997886ce61801e32e96b18810bf91a122b87a761e3c2055536c0e7de1e76e5a0aa6c23aa3e6dcec3bfb6bd857d5a581030075ae769eb035da51764aa456e128f98b2283dd8005e69522c59dad1ff4825ac0803c07618a2472e4f49d60221894b1ff7aecab4aad583d34f5ca22e07eef17b887045c0120082a5f19bed42ecc6b37cd4c7344fb4a28881cd35e12cc51806bac64d8650fd09e4a3e2f8382b1972faa1bddb020a5f7fa28d3d0329b4b17d1cb35a63bac727f3a68aa11cfae20f6d91d2785a987ef5710236a81d3072c259b7e1ef16037fc65b16aa52ec7e5bf6c75137aa1a104d8a0633a287ea5a0439118d39828626673804e0d4585f80c0c943016d6fd2757124c24affde304f08db26d0d26ffb1be3138087cf2d4b3e6f1b9f565c89675a5ac0d0c9dd67d7ca721f2fe5ca0c33c3ce383fac07271591c553ed58f871882b366888feb705a439b928313e7784d6f2e0a82f1186bce81220c02b33429ea1e132841507f89ea9d9c9c0bc3470f583ef98f594df22e01887bcf5c72879ed6f7e941c5a7f7f6eebb14e9d93f8181d948aa985a2ad7acea770372d472380ed8449a8e190ef8b83e7f28f1b030f8aa32e1d32154aaf1361b4f3761f2c342a75dd3ee3b1a2c56ba2e8e29309e03241baf6c6361e7c0ce74ee62be26a0b65d8e7d2db1692b719efdfbdbd3125d3b682173049cd823ad5c6f3037d990610d09e91dc3cd8653d584048ad15729bca2ab95589ad8a3ecdb3a39c655decf7643ba0f0c1931d40ddaeb1db2c7f25dccffd218e906fb70034100552979208ec9d195fc6e1f82290e3bcb8ca1248589857d56c091b64c234a9f431d6aba8f107bf34fcc469989858acfb05e3f81c8dc5ae918e6d79f10aae4718abbe4f4ee46fc069d9665dd3dadbead13e11f8020e5cefb1fdce489e3c9d904fbe252e62ba1d20f42ceaa7849b9dd8525847c493a1e0d7780bdbc7c3d2a0adb5aad6753a82c51d5e6a1078345396d885ba6a598d6f20a10f85c50d0daa2e9298d3339f7387e87cda9a174ffd1231e9c606ab533407af9580e6d7d8119a4d8543e1cb034701dc760af5582c8ecd957a0cbca0a08507b693decf0ee820d4ad7f3ece1e50f6c78edffe1f36f96a6f75eb6f1066e281a5df1bce4c666f2f82565949b85d6fb15cbb705e5633770b05dfa1f1a7073dc80aae196a0617a8ed7cdc579517da20497e78ad417cd7c2555c44e7f474a453e86422c8b8d337c2e5dc57042868f7d849b5304aa3c77d7b6a4e3d17aa8abaf6ebc6ed118ee882aac7bcef65a6fa226464946b440589b9fc898735b526c7d43a61353066c291b1f647a2d48721eff17923a717632f3ca6d036dbed516466758fb1bd24fe68f795920ce8890270a4c81e47575e5cd028cda1267c55ca7e940f5caa093174d234b4bc42486eed721597c8646e7a1efc28a12fe16327e0f0906eaf63ec96cd1989eea01f0d33ffac2d30f69633b1bc09ac124ab5de0b6b1d20f33154afdd0921be529d34b44fe3d0f21d0d606b960d396943ab9ab232a2dc06e2c62979b651a576699d7d11c0b9af36ff227c5d26026d6c10b88018db9d918bed7c2018c56d7f5b1efbba0673d4fee1e6bed58bc5eafe9c64308fc8e5bc8e1e8cb7e64ce9ccd453d3eee007c3cd1bd2f1ad925c25e201cc882615875d1d4f7cb2191738fe1cdc6ecbcb460f6853baf553838f6a98c639e74419c14e1635df72bc92f0af3de1b0573409436fa9a1aac72b1d39d373b58d7acbecca53f4e1506b65f67a6e866bba1db321af830b9b32e430874ee0fe9477ba414fee56311f1dc88dee950713b4fe4d4b88ee6d8d2ba9103b9bc509b3c1e783bd63b086ab6e2cd5043d530771d70f10efec1adbcfb2b4a587f675868ff1d6f890e9d919aec545cbef839b2ee18d1fd5ab41cd626fd9cfae6c3648fb139adacf53c7dbe4b87943d2c265675a9212ec58125b11d610b7e89f8f30146fa279d1778386d4b63c4ec51604fb4e190aa28e7ec67b005ec3a704ddde52e8286e6e50710dc6c852b05dc9e26de7c36a657cb156be1cdba5d0daa93e13311e16f03e55263257b17aad42bfadeae48fda3191fe6e2fefbfecc5f8d18786db5d8e92219339bf9707d495fb0780132193a4b45a5f3658738c29e29e73c123f2c7bb6c8cb7679f497ab4610a913720f143b548c31d899ab6fd043fa4f253beb76c325a3eaed7fabb732494404ac91f8f3a3e0f8ef636af82aa24175d96e5c34c75da7f08ca7ab86833e9dc4794b878e7bcc46a545bd9e8e4ef4e77d1bb44b6242b62109fc5be2bb7205449c7c03f96db8bb5062833134bd4a5cd41130e3e597458a733c39eef57e80effc56073e3a61ed253b9ec4b004e92aa6a35cc6e89d05b6e98a082f6e5a9bb6a65c0a04bbd7de5773bc7fc9e22f677059cb8a793333d9a92522b390b1d5c4fe1fd01c42d5a93ad1db681f705141ac0c5028b2837357bbbc9b296acb37e24bc4c00b4c4bd22a285057d3a4c7823a494894474275807df1aa882841c4c2c11d2e8648ebe3fd23676c9579af5954cb84e2c2c61c0859a80ac0cd9f0300ec5c7b306c7b42193c45dd19c1cf41833b07fbd97a6d470c5f8464a1e18b695ee545cd70692f52db47d240d21ad270365fef9cd3f65645c37ce360d2ba7692de5b1cbf24ca21af52948bdf67bafde3e0f04689574defb3392d49189a5643779d0fab7719244ae884cbb9246acbaf4abea24cb0b989974732f8f1f2b8e3512a829a1949fc78675b0209c1cfd4f0158770f307eb46c8f21231c4990dbafaec4b1025da3ec8c5e9f00bd1681ab9a400f5ed9c95836aaae26590498d118a5fecf5e142262eca9f9a95113db960615834ef5cf19c5dd99ee2ca71565bc89a001b69134f6a0c48f0ff922642db1fc5ee2b8940d1e2082398dbaffcad8ac72a9e221dc21004a71f25fcaa2145e85717f3e0ba14ad4896a0b64bedcfa97ab65061e20e5d9d3b9fe1a2a6b147af4a4d184d1b4989ad1dfcd2cbe6f6d0d226784d66f203325b56084131ed232c3d6880b6e20f690f0454d104c5d146d49d96255d7368ad408110d4ad193dffea62b31aa87c99e78ee8800d35d6aa3fd1a3d387d7b405f4e96b35e751adb327b787ec45f3660548d73a0c850484298209180e58714941bc9ac22a57b0ed36475756bd20e74a0993f7e2025954d057b6d91683819749bc14eb114c7ccb265f050789be65ba25016959f3b02f15a975956eafc82a94d9f0583442641603a9e0c8c54b378676264d630ed2942f266da3fe03eecea3aeeea9c079a9bcc42168737216a4bcfcb91c243b20e39e0b7b863eba52fc4aabb209084ba4557b041369389b5b0238a3b281b2e470c2e68945cfe567a95b859173ca4f040bfe7fb9e8a1377eaf42db813a90e1c87bc89ee182c66ae069db6a3e4a9bf50ed7e7e667ebf58e1f9a78e89d9a5b354907eab1f44acf9319509bc0e622b733683873dc4ca94720ba5b9ae975fc0db98460ed394b3a496090e2fe4e2f5653d119f73ad8b870be993bbedeb17f63ca389d9d489c4c3556b75a20eedf2196a4c32715cd5a44687e15896b6e57e98c00145a557db6d4921f3e359e2f2e1c2e5605039dde023e1d590e1e7bcb2612ff140ba4f9dada6cf9e986b2503429efb0f951d90f91a1e52574eb07ce33b32c79b2041483f700a5848943f000cf6c8163eeaa9c7b7c7891217990e98f0ef9b918d71a4e9fe7446582291eaa551389c4a96ee0e535dadd03064930bd6b10df255c61d7712ca5213822fd3f0c57f8fb62b16d5c4968658e23e5761de1d4e7094ec3c7048253bdcaca2a26220fce863f09f482933b7c2ec44c1c8f322064eecb8d0db01123f143790fb461d0810e910283a91d878ff5a8f37b7876241ae5c7920bfed5f27ff681010c79c32b17139a43e1d8da2e173f7350e8e8c5014d89ed638f8d665788e58b6f6725ffeff06a328464ba578e3a863833d531f645b69b613db2c012e311779dfb4ef870b0f2724ff860ab1f03a0bb6d5d22ebd36433583ba2a75725c1e7aba62bc19a1c4c2c1a33920885d0439cb81cc3e1e2620ecace778dd230debf7709d1bc96b8cce40a55ad288fc403a8ca24dc8a2865f80a8e12e8fa1aaeda7baa31d707e8cc51f980509cf6b38b180dfb007fdaaa66389ea171b42cf35cc52555880b2ee10ee48de9da10765a68e727e5b1b5ba30080a257b2435aede11f0534276bba83caa13d6dcfdb04cc1669ffe0d4afdd398613ccec2ab75082ba3d9031fe54d4aadb9662c1875b489ec0732877bc80e6e76b9019bba2519a0b2d7e8e1ca393d0cdda3d30c4ab92b2c2bac792c9126be26d413fc73c2c357ec18761538317a9dbfec3497cf385aac74deda7874e474138e2f0fdb55927ede8dfa856988a3a123e172c8415cbc50eb2eef3025ea7407a5c7a92038b35e960405fbb0a4d6500fb63d53da9cb2513d4f4c8917645caf44f0f288cbe513717b95d9ce6465dfe0fe725b510f7ef08d7a6531dfd29bf4f8e664d09b10e8af9cab0bec3dcec90cc77e6e8d0949cb8280fdaa12b9c7670f2160273756ff9915d175d72f6a894968c2db527f19bd385169b68cef67b59a0cb52889bb7d62188970c47c4adcae129163afa3c59d7c5575bf371e8b8dbcf6dfd0e3cf560dc1224ebebdd2c7b88973815b0f719833a214c5cebaddea500b2eb17267eb4c328b6eb798cbd6264a0e6e75e641ed140727e0e8d45b90fd96056b18898d5963d0e121b691b0cfad3a90833f2bcee7908de73a08eeaa074f1d259ec25fdad9d4e255e133d2aa535531044540318e8951bf91e75313f68f07a031a01d907dfac1e2589ded9f610805077ff06784ac9aeea5e35835cd5d7fc02413fdf37e197b6573fc033c9986475bd5a0b4a3bb6ef5c81bca8b7cc42721b00cb4e515c8c1d71ed966aeb23b3ea6df5c60db56918549ab132f8632777511e9d16ce9ee2aecdd33c5642cbe17e4194fdbbd25b2a95e021ad5ac12da4711d1d26e4affab3dc95c698265ac38d87c2c50bc5d52ff85642347d5bcf41bbbd5da72cea586d39a4fa84ab23888c4f615e69fd1467f6564fb1281997b4a73ca775d2b37a17cd0f12766b20f08b54e26decef0e7fdac6360367bbc9d911a000356beb56bf6a6185502f05e1f449c6a6e5c0f96a53e419e18f56e7ce42f51687a241ac30503a621340739e351649630dff0de6cbf1d69d6527b7f9d9ffaba16d03c0eeb7adbc77641bdbcd749a376fa24369786175c90f014f0e776641838ca7dd95a6b117d76f309b90796e9bd7869d712c5e967dd54b18f1e7b5e9ac5f8ea9efa7f5ff53fa5196bd8eb4453b12914acc08e6cb5cf7509be4202ff4c649c0c89a98b026afc0630678b564e1b101cafb597812ce46eb7305ab545210706fa751de811621870519c84562152c0ac671cfdf26ff697b5a664bb96ca6127e1825d7e4e184772e173beddd96894ff30279d549b3138e94e7b175c4b61c40cc8373cbd7dd69529e4dfc274a1e4dab8da1ce31ab62472a884bd8cc37fc679a44540fcd7d779175fd16cf20cd75e00e4fb2ee78b38054c2db9de96a709285314557eb9cbc87325159a19193a1feae9551544b23984e3c99eea2b2d2f820c04772b9f201451345f12d94759acd637facc8a603490cf7ba9b81109f32be63c199c8b1eb86d400498c71976e55865da2e3e9c7dad11c4c406fdc05e7895f9c7a02a6778a50c696e270455fbe0f364a33a9a2834d26166757450597db60e69f5bb8103ddcd0a0b341f07b7156930915b2a3622a50ae6ac4c748ac61e42f9f63062417d4a0e81a255ec2942a985184389c2abf0a9fb8c07494ff2571297331cf7b20d4bc8772cbbb13c9ecfceeeec8715d07a1e40248e1b8ea66c28c532c098c82ccc44a2a38e1fc9142497c16afc71f33e8930ee2dbf20a9287b67951682fc70ac8294fe3564e3846518d8ab49aaa532be98e5d6801392965173bc3af16b32e779bf697f1401a7e3b904bb75f46efb37a722631374852bb6c0480a557054c208098c6ce2fedc009886877ac03ad7847dcbc72dc63c56b260aa4ef96d5ecd5a401096b536bc9677afcbb9a7c3e88e52a20c31ff91032c2e77c25c50ba945fb959b7cb335a56ac80b2bdf39f3ac0b6ea62b2064175acd4b48f1ff1ff3397ae45b10d9cecb4af13f62e936e99a2c63e8a82d39eca12c70d48a055d3d75b1cfe214f1d52337f728f292cd090d0347bce37982072c7fbeb19d90e296113d57449098e1a14f97b9e778eaed52f6ad246f9e7700d03752d998a30da79e88d1c41cbd9e17a9ac8bc594ec6df18ed3e92e9055acaba9c23e861bb0f062261cd5991cf1fce6277fcb6112759e91a9f8db28be64276b1880d62e547b21d37a7506504fe4d8871421e0f18e9dbf09828d84b25e54872499915207da35c75db761bcf9abc08c43d094268324beb1114f959878b26346db2ad1d6762789fbcf4e8e4df4b22b7ccce6d8651fbb8ade9fb2ff6972bc43cd35151b395f580d0ca72b15488fca95c8dea9d1cabe3526b6c81e47be3e71a1e881aa238e6ba16cecbeeb26b4659861e93364091a27e2b744aa4a8e9e042897e0eba5814deee7c92ef6e56fecd1b352a36db1d7d964f71756057e107932316ef898660ca6becb54b264136ed9dd96c164fa2b0d0353c2de931e4654adf398797cb3914704964a5f80920cb2e5eeccc5b0808afbfd7d10c06d819095717e0737b57a4c553d8e546d8b59cd8cce4155a51a0450a336a422925ce07a8d3ed100bb403b2adc0289fe8c8bb68ae7d787028a049e5be3228df76849257d331b80539a5c5e6e8cdfcbc8ef519c54ef69b7e72c346794ef4492cf63d0616f46e5789fd93b74bdf59b4890ac002717bc9289e4772c30ca7f32ec4ce709d5b399c6b9f70a65ac9c214c80933a316a8d862eb426c20d733945faaf66f60b3d5c2f61161d7534f8aff8f10056876412ce1c728ba404abadde6cc6b9139ae5dbbb2a91e006e4b81440b694e38af04789b8a87d414064d9549a3930afc92de402da097c43b2a42e180b6d2683d2ce116079405ffee3a105741c4d814c29f7b2760bc8084a3ef5ef38c22aa33dd5affcd4f2bfa52b74ebcb8115d94e7ca5de6b799e9fcced1919d6526d5e3e941a8b4cf41249e7a9d4ac19130ab1ef5d548c9087f97550693072745f006e56055e1295be9cbbdc1d000624dbd73cd26d9a32653518b82bba9d5e456d9459af39d921a6685e583990307a0d73e25986ccf65fab2842f808737ea5b429e3b65b9d5b1fe16b254f5be3e9d2ea0064f72d19a1079b664dc920f1af64c4081c144104ae3c0e165ad1ebbc7dd0c602dc105e9b8c1564b6b9859051359ff06c924e72e223bbb2cf35eb8ebaf6be430cba136cad0c5c0c446d01dac1c50f42a3dd878576ff3e1680b295ea1b6826d947c09d47a9ef2a31ffccfe5c2175ebfa54f79f52500e61ea3cb81d7d7a20bbe1ad50fe28fdc2cc94ceef86f30653deb48f2a00fad4dda234fab52558c6e9471e9a3e0e19363d3fc4b55883a046ce5bebdd04165357622a4be1c0f8a6a098a673b8348b04f57101b942cde9b415dbe9a53f2a5fc9440a17e943ee0326d37d7bcb8e78de21c9a766163ce434e324f39ceb77e1fd7d465ec8f9436be23343d8171c2c2fd1aa1db2b5364ebfc8e9794d7def75ece29247b748d4932c34af5deab05120cc15c2c07f336cc2304ece900b662a843a093bce6165a6dc1eabe3dd9cfd89b5df3bc2b4476da102b28ce5870b4cc5da56e0625272dc59248ca23c0d214b23924bf52a5c049609a3d8a76b165178b7a28f693c2d25bf0516b77fcba8fa5066d90ce36f91a4117e824b8ae2c00c07fac39f1860a8ce4728262bcefc9478708ac56fbce701752f8d2b1b86266120a60a026344a39a149eb8425ab5aa713392ac350299f749834c83f43b03c1b8a6cca42423e596f47b235555150368512762505e2fd895df3ae3ecc9b10678c63be2400bd5183a4482ea11062a38e31c35184f941d3340b686d0c1f454af5bec22808bfede6643b6324e9b24bd3819498e7afddb1d9ee0e54ef739a109c20730e53a30cc340678c402b30ae65f713606b11cc19866ba363e02f447cb50269765323e4e11d5acab8869fc83195f44d9e3f25d3d850816cfbc0c2f8d61c53b337e8536eca9d128c10e86787a4a2b5a542bd3946627759d8e6e24d79bbcb0c52b1852ee6e9871ae05e650e52b86785768935dc3a090b6ea7c05807eed7307319b8d6ae30936a1057aa4489268e32e9c9dde148179b1096ef65d98e77d31bd5a31e2f33e56367185ed216a525e093d39bd55b4b98c65c523e536828aecfafe94e2b138ad46c63915fbf4184d29c8a985216ee2a66e3ff5d2a2b78d1905c789a38c88bd58278656b29baad318a56c83cce39f6e64644e2cb783870a7d631a26f816895fa714d12828ba765ccabdc32c2631c12bd71077b8c3355a2e9fdd834bde2a6d3a715565ec4308c615a76c97715d17de8aaa1f530fb6d1dd73388dd127ff660125369ce5d43d9705a1bd3c353e9074bb259ea89a85d7d4a1088e7d8c6aae24add459a2768b71ac0ef6b4ea90923635a8a6c278cf33a2da3f0f5c6f4acfab5d94cb1080b588ebb8f0025671f912d5954f3f5af9ff395ef3ed1ee8a9f005dfbf2badde64b18f76c47f770512bb76a43719756e7756ea23141e92e5d9733411539bf9ed2091d97a02e86025c61635efde32d7f7a6b57a757fc69bdc8a2ff483b772f94e4ed19b8b090960e3ea13c2cafffe9673107a16ddd183235b3497e77b4c84aea236bdcf0b9cff4b Params = SHA2-512_W16_H10 Msg = 39324feb180aca683d995db187a075a910d0 PublicKey = 04000004c6f1c4a0ec9da6b8dec50a8f2257076771f62a1d425d5de0d02cc74db052973e388ac5b7609960ebf06dbd7354ad549e2e926cf5142c8054aae28ce3a84934730c54894ecdc72cd8d94f02376e47fdfe399339ed29ef21a881fe52571c2a1878c5b89f67d59e48b44ee2f1d2e67af73f7d733148d3ed9808db53151c08098808 Signature = 00000000000000c0df5786b75efda083b9dd7e2e6679d9a692fc9ddd9df1449a92b51183c9983a0062d6c0aa75e3ef4e3ab419ae836999bcf760af96d2a6ed76526472304af6b1aea28f99a669d6d2a5a056366fd64653aa594f43dd455145dca520aef953cef40f48e0fc0200f2b16f595d12f0c634b3d9cd19fc4130386bcb65ec364cad9eb1caccccde41d6dc833c938a0ee7739aebaa2e61b51f830399616c041904c4fbfc9a8a0c05f462cf1777a42847934f29a56322592982304333a9e5844b4b9329e1803e0e621fc00ad87773ee299092c427362d7bcbfd8ff2661d1188223d180b7f623fa860bf4615737319e44120fc73ae6165c09223f38465cd8b806014e652a6029c079af6201591fe6083ce5016f017276b07e2dcc73ab850c7eacbb7f6242d843f4dc792c04d9a9b78d01208445e058d687937bbfb68103115e6fc30de23cd4796d150ad5c641330ca01d2e21e43876eb6cc93d13986e7ca06bf41dffdf641daaf18a8d82e9f3d64ce239689c5b65c9287054a2c09c02300bfe0e457df33223104d8f4d4ebc78a217aff34515cf383f490af54b5b2e1a8dfd6bcc13f73232e208d7f31b27c0fd80500f4afa796a07974b05601dec5884816c198692ade50678678297f308f68952961cdd05f8383e14d2106dab433e10e2262bb5da8883be45150f08cbf22985e5f0f4af32618833e83ad3bad6127447a907595e910295cf0a18a9e621a9e8d2a9cebf833b1545e88341fe8ae69a251d97c93105770d1df5feb1a22a3d5814738e984f1738ecb6671128541d57b4abf7ea288300b6e3877ede053e56d020cbe3630b960ee6431d990376c9ab52dcfccb9e41d589b7e1f0ed33c23bb04f093994a5e854351f13343ece396ee5c47bbba29827a4cca9d534c82adfe44f16c0ccf252b7678b30b5580f238c94b38388d82a32eb6642c90b6a80596dc789ecc616b45beb99768ea8f921cbdbe65151ba6d45f8d47cf035aee3fc405c73d4349d7003fc1be1e8cbaf3d989488a9d26f3c338afaca5b69e8b69dbc02240a040186446e99bcdab020940cdb26582289173f783332b91af818c0a894b44582b3df078315137ead02faa0bbf58f59574816acf9fa8d8c3692badf2a792b26e1480c9f88472a793a61d8ae13e6be27114224f08c42633b146c09dab1906e7fe1758ff70c9abb6d3829ffebfcd2aac39c0165546660113a76b2926db58ab7b0c60dc62404003e809ab9c0ec98338d520334310ef5cd90770dbdab6bd3992360ed82f77208a325e48edb9f0fbe384a67d0aa90711a40413f6406378332be5d3b1f4961be34e9a1c0e8acd9d3da5e3f8d16d5259bfb6a3a64c81caf09af84a93aeadf7ff811129af03e91036e25efc493d0dfc475ede2ff0af7d881d15c0c946a784a366f79a0f6ce84b81094d7c9c91edd95c427e154667b199baa75c2c4fb20a870978071b10c1f2bbb363dad6cf85a0a7fe744c45f0f48f41f7383773c5db11a8098a09788e1a6d44380b067cbfa6c97a13d222c26858db57704b3e835312f9d73256e4382d4afa4b057fb4b633abde992482ab668c93218ad158de54c988d42ce14439496a76ae85d6937aba5d2227153e57b455bde7763b5937eff31cad5495420d873c654b9fe53b4fd4dac88d8f28aeb37d026c826051a6fb09347ef1e77d45e9c5b4ba7a3d4287de414b64c362007984cb12e86daec949d80ec759c704d538d4104197cfc90181bf9bbe1febca4c5ec6924356a9ab08bed86c79fa2cd2a1af25778dafa4c3ecfefdcf9b853d5d932395041af43274b7b588a76c4b4d0281f4fce84a765a0e6cddf19aac246fef7d9f05b068800e1cdb7e56fb247a41d7e6eae8629cdb60bb90db107b0a5bba92991acaf174a886f9db445793aea458a9771eebcc095a2c103b87a28b4674ac7f918f25811c0744a94cbfe25d17925b46c9d03a41bcfebc108536e04c5c5a4a6e0f62fa46a58e3188babb0fbc1816356860840b907e86be1c8507ae49534c738c3edf0fd733a17cfa10c33a2c1ac96515c327fba89d6df90116830bc639f0a6220482c4f8a8526cd5894eebb60dfd8946ef2312ce7473f6960af8e44928d8a93a55e86e90991baf25a2245cf7adbf092393f64470807da6cf190b53c03e34e07d0e61a8257a4bec169db7b527d30ed28e763724c43488d0e7fbc0c1ebab8a1a978d959bdebe6edefb5a329f1e83b75186377711d2c4d1d5facabe282f4e52a450c8fd82d9f17407275299c82d7d7eba00f81f4234c252ec53c20039789601d7d793774484ba847c383e31997c658e35df746f09f6be1742c6eb248c310a292167b025c57179c629aa2218308d53c4c6f3996eadca5af50b875022bfcf4cf5a39aca5f70e94ac917fe2e06fb7b2f8e615986aaa63fa7a5707ca4bbca076746a3ed7bc83d4dd38b1560ad79103939b946e946dc2c5f4d1a5c446b17086d3dc2c4208f101b3a1d54ce425c18a47e358107a92d47f2658ca08efc5b14b5082ff64c9a6ad2122ffb7294b07de4fbedf0ae9fcc91ccd3faf58b19fb65dbd9c99a013c066ca4d2454261aa689fb629cfa15eaadf1326ea10f848d47a62c6ce13ec4f3bb74cee950c50840f140dd3783e3832402e323d262735c64b9791000546cea6baf5f48d48205fe1884966674fd0f50f3181b4b7d554ef549cc3c0213efa0032190baebb354bb0efef23e93df84a0766d780a9d3427fe89a5eb97c2dc897d53c2c42b2b2382468011ac3eabba6abe615da76ffbf5f9f6e8d79b4ebefe2e0dc0d98886b0a4bbe0a4f423eba75196e2c0f865f243ed2dd354f6decc61085ebd85590573950cfdc05c4fb4e65725f7a3127f06cf11d18c845b469ff8f8fb3ccb77b64ff153e4877248c938c241758b5ebd137dfa5da9704a1c68f46401ea02911b26faf1a705539cc93bb7dfb700e651f531e1a885997d8f7b3eab0f1f1061afa1c9707f3942201884965061ed0e496c6b3e88b4ee1f94eab798fd956187d9b16e4b7652dc073e96c3e21790cc2bc4b931bf2cd1be8aaadd9b87cd1a408fb6bae152f217f949abf1834b75fd266741385f5b7d4f39a157f90f68a1182411f99afb12b2c01605f7b77bdd2b1461eeb887a43ee25f00903ef0fbbdce566e2342c73aaea57c7d535b712f26d854af896453ad2203e3710d4153f9495e7cca2c74669b4c65acb80f3c21c3343dec6c33cf9f200ee0f516893d609ecc2356dd27bda41282451a10b211cc6e0df885bc122a8bb89695363498928473436e2a3327d00ccb9ccb3a341254d6819fee74c28643042db58e2b8dec613171c3df6bc3cf99ba1fa5447eb1952cf26c2429ad5f619181af5e45e3c1c38c65546087ddf08c7dd17c2152af18f3d8703637cdb275a444c3eebe632ed7d8eeb913c2f9bafc7163c74b3b3d400ef4273b6831c1b9a862f0e2ad839cf5f2af4b5b49bdbd245b5063b1a85717c6c0702d56d8acb19cf6601678ee5656510b4c9e9ef2a1865fb9b077fd46bb0e7e105cc99c964487cc88cf90b90b9c2f291ed7f9c111e5e53d8f359ee590e66ae84eba25b7f07253df37adbffeb4bcc9fb58a18b4ad0cbdc081d6ce76f031ca3818652a520f6da4b354d1bc339b48a5239ba26efa3299f39ea5e120118484524d504fea423662aaf94e4dad556d84b8e83723e263b0e79ee788d396b5a82ab190255ed91a6081953728629cd193fc1f0f873634ab0fb4e399d0c22a358af7b7718a450ac0871cc013e60b4741eef19ff2663a3d9286c31f1e7a9ce2e4a56e6cbc6b97a2ff0fc3f35df4cd0221871d0e81bf1987cebc98ac5d24ee3b594931f8c9078495713287e0317615cbcd7de0409500fc9137cae3ed1c4f2d29b94f786f7227cf93064a4adddb0714b760839b0516d5e4e2bdb7be5226e5006da9a50b534ce26b20b990937c355f7c88ce878be4162c7efd9fee223417266324176a935ddf9389aa50aa286be9427fa72e7cad49fd2b9396d94b90dc1ea6334349a3e63c1e2b3543373b4ac1613d69b1209a1cd0fdd7e4a83231f6c047ddbe016e3736d44e44939f97b80b24db21a3836d2d024bbb169396cb72bc718246dd9015a9be6c0d5b69b4b2858c91dfe0223820419d16c38e4cc6db1617ac3dd8006162f7d32f667edee86017e08841084ba2d0c16537c1f1b91120d33e69842863670d95ebc411d6c4acf939742e4a1b40f75fada79cf3e2ba2fca020599d3dfa38393e0e5d203fac4460111348acb20ec49e881e75fdf9d4d136a265e85031b660a0ac32feb940a2a9f31899371fe410d03b15fb1cf3c033ffee1aab995feb1f65d89f63dc368b10abf94971f9e5a09ad8aa313ff4446e61daa5544bd035af8a74f4e537b99c2a999fda2cfc6ec2acf7b3a30babd21efda80f507d82d207e1c7dadcb480e6b1d3da782ac4d937abdc7e8ac664ed439ac0ae32ad263f2d323ffa40fded187798361f91c5de3a82bd6a15a58bb6f8d2505f6451b3b7983e16796878c440334333e3e4bc2752cbb9d1ff25a2178fba2c9c350f807ce1662ed76ce432153c2124d65e4e24480008dc164b5d443488374db25a105c1ce0bc774e4e90e11a21d2d0ee8d602cc1d24a47ebb275c1f1a7e2af74fac36f314de810e3514aa55daf1ca33c5c16c0109c89a8d5c08b1bd0d33e14b6a6b7969c4f4d51a8a8c56cfec45c0e41e8aad9c5f1764b2835114be4a84c52d2bb4d44e1707f53fa1a32658206af10879cc087be2e6807041172ffdfd36d9d65130a7346ca524f522f2393bb4d1622f5f411ac4d6a51078db127c8e7a1e4dfa5e71744462d53f24997206d9e3fc7dd3b7ab5087f80ce43438bed21665608d80e7f3ddfe8070b9edf9aa579eb2abcfee3ce50b75d4ae1a9405356fe847a8e7a533cab88805014ed0e0ab23cea6d210caaecc67f8773de52761454b5b809f0c2d4c9a6a42ee8a7b89e882289978b420e1501b62aa14b38605d469b96dd5190e0ebc040acf98fcf99097b6eb63c7db6286119ff972103baa871243cfe6f1af078e83d098db54fbbe591332a0bcdbce93dc5fa43761cc2ff58df0faf06e05a77ac179576f19584f8302c6d46376600ec95ffc1ba250256f47d0398865d2b35ddd426369a2bd7847490cdbb7283e6f005a437b1c94cf621bda720e2a1186231614838ed9b8c8004260d903b38d5a9171a75ae1791a20cb74c151f199f9b26438856e26c596c3255062649aead524854d3329e59cb4dda727e7e7de528cd45c2fb6865a2e520541002fe7a13c07b57926ebdfc1105d2e7b9b34451d3030b340db7b894d56afc04e5bbff89d1e5df0c85db8c58063c8cbefa79c19a1004763d14a87e7eb53d4973ae3d3b666980e1d1a394ae80183b82db3b8a7eb3aef13a47fc2c00f2848ba71fb8593048f00417a3edbd9993bc1be70ba95679e942178fd04f4e35ec407811f328468564e62a4dd36389c8d51d3f1d325d5a1ad42eb1296daba99bd8a011d6d421cd43901ab6cf4378bc433aee88d2a646a914bdacb343ec552327a333b319ae526224c35d430b1de7380f4b79a1c8d8df3bc58a6669792d341aa065fe44c56533ff8de6dfc543ae0e7b968d81bb667eab77708717597c5e672216126c1dabf0928763f92fcfb437d3c3d84d58bdec1de6ee54267e94e2888f95e1da82a4ab03595ffb8954719104b1b77667a73c60c4f053e2a1e91663888c8d7d888e2ac924334b6390e4e2b46cf5d021126c9f5346b8d7fd90e097c9620d6d883846247665d67fa42a0ec32d7a1b2bc2dd3cc005d754118d0c904cdd21a8329c588c43749589e333aecc84e3aeb5b1ad1bd0aa1dcd62fb909ceab2d2b537c1a86231e1e442c3d245d98ed6c8a0ef67f682418480882b4aca46f62cd7253a02ec620da88d4029acdffd00969de852306b3fa9f13e8b60d14b0ffa4eda019e94310603f39b8b511c02006aff618549413a2def9a7f14624b9ce5d8222219f04872d34408008536694dd600b1d7eb471297565086d485a8747affa7e3db4472911932c82836a311554ab11e475aaee390ee06643455254a313d21d93353c28429655da2da97d2001621ac5aee44751d85be1b03be85bf96bf8c51e789d65a0fb3bde01a74f851a9d982c4df360a4962867fcb3e38e1ab39dcc7f286912dd0659ce7542d5a371b96fb8a14086daebff0365740576742609a207cac1642eb81044e0e795b2ab27c4c6b12d8188f1cb71476aa13d645a0049b0118e00af7bbf532d6d4fd77be6ac32d33a6cbb1f7ab5dae87dabe60e13527cb907e8c94e82940dcb8c51498abc5c9ad9d7dbd371bdfa1fe16fa3b59ae87e0337bd58807e935b21d9a5c359514cb4927a61fd6e53a96920012fedcf54863dca7b5f4a21973e95371beba0c04821bc1582df24404bd890d5d9b4fa1d75e569164d6923b34c400882653cfa04686d86eef23307dc6820efdd7fa1b516fcccf5f39fe653a902bc29e897f2177499fd5104da5f191872d4f9d67c7f2dde632e1703d4710757a04b4b66ebbae71fb698ff31ea470ee4f08e739f25f950d4ec788c898b01e8ab3cca06f1c88954f46f8b03c73c00877846134374f1feec122217b6cfe249d37509d98532dbfc8efd7c0e59713254182a7e91a7e54f82fcabf3a7f57bc2005c316897b42f444adec7b8b5cb328e24a2e5af4460f8f2e63ed071353672d9d3447fc24a665778b24560b11f3836491d3ca59d5f128762e60390478dc8efeb0adf070be2ce00036af5f107388372866ca133c9f043411dc6adcd50d82db736a963b5b1e325a907c785c874f3943fabcf083143c5b45e41e237db1ebac9f692ea796440526c1017b8872e0f707defa236b3b85b156ea03c4ac67d5d31b07e6ec8357b381dcd72e073d2dc6f5c243e76ff6dd39c2970b651320430ba1f0cdca344337f1f5adb8b662b09c9137ab117b02337637823a28c7b98be1c49480fc940936ea2c45c14c6c42d755a26b630e911b0708a0349389bf78c107961eced7ceecf6634d89dd87de1990cd9e9f6ac54796f434685aee4e23529809a226937233a88f9a794cb6ab9ff1e0a2eedb788bb1d2be90223d9a1c9282e322281ee4571c01811ca5f719eca414ce681da416ad7e4eef39ffdfbb00a8ddacd47112ad498e366c79dc1588401635c10e9fc33b06c536066407d978ae893bf7145896bfb375dd9eb9ba470153af55fe9069bb62f2dc1af9e06d1cf408f1a0e867589e31226c31a923555bb30b3d1acae70bb64ebd52500210c0a8971d178452a192957bc44f7266e2bb06dc25372a0e56c388d948376e577916cc5372f3b51c6638475e68f8699f42fe1425f41f4a384a351fb01978479965f1a9337652fa683c5d50cb8887a999e6f2fef0f2f4b2d4ac2aa2bcdce39a40695f984bb3873c92a81e3cb45c2f0f2b23d04b85ee2084178a529f52436bfaae97a106d46ef2c1f8d0fd3652111ad1fe32d851bfaad5fc00ae9ac2f497a12189903349cb9ccb85611ecf3280abd5b9b89dba7734a99a01414294350c170b839c4025e221cd1a3411da7665d7056d4d76afb1c66faa9a5cb454fe4737d878c4b074bdcd1cf21c156dda35bd82860ce184d13f366ca6b63d5db3138b2f016e7bc68a7cefb1dc5476a8a7182f6032518f256abc3770d30bf5534cb21d2131e175be8ebbe3c41bcfdc8623cba60c0e365a9015f3a8921a328e3c632961625379cbc3e5bef77638b24284c0776b10793e25ad80292d91c09fc7e09a46659b767eef51fb5e244e44f873d256c911e51be0214638247cd365986711852c1104f2b535cbe0a98c4a15e13ac3e1fb85f0d65e8e9f2344a9e7da048833a872b2b2b0204c11b9658181c2922114adb14f5596a3e1ed236ad5b768eb800fec9233cae252950109e69287c6abaa5e6c436346071bb022a18f12123a287162618389fbd2fd744aac2c70a28e48e7176bf8ae9f197728b4c02730d261b88e85193d5fc1185c4acd2a68a1051747f09e50a4eee41c2a91e438801147838467be6226783507d04484a1ce270974e5a5b01d87dfcdde7c33b709cc29d972def7ddf1ef09d78ba661866b018fd94828dbe73c99fad9379f77a5b0ab6a2f5f7d2e0c8d22ca5397966e4c4ed919c34823cf2d48c233358d6f62ea39639e6248b29000e65148d51a25270688a49bfe81d4ef49dd31223c8654b23f252aa7e5955b9d873fc3e4d44f5fc9fd54dca7d076ed162494ea5f5e2844116fa282e45b23b5e19a123a18af26e9b868592e4f883aa808f10f45e606809282be0c9c5967cf5a9bb73861bc7c03f5783758d78e1376348dd4b1117572b035c554f62a7596ada2c618228fae88e0a02247328c17b7cfb155ea43945df38ef01b9f71d9dd8c77f79a3eb7de2fe495fe34adc87b6a8a05394097f3d546b0f35ddae9bc1f9a00b03c31294882e5e95b1fb59009a19c4c8a2694d64909358b63c0967e81495f959f5a750368800aa37f3ec356975d70807ec914ecc3faa918b409b9f23aca1b626bd87c14ae420960f109831e5252c4747b676c1fe911cdbcff2c99264e27945f35d9b025c19323b055090ff73415d685009c4f9168b357d5d0d84be70663cdaaadb3b080a06f8444cd903fc03ae9f31d736d37c9fc659c6bdba5f9e067bf51b5b0446a55412003a0976c8e55e7f2bca46fcd432752fb22a9ca57a9d1d0d1c01aa54df2caecad322ad3558babbc7f83586f026cb0d2c2caaa4f30131e0c1cd86d16bfc7adaac5a5518d62279e96088205cb1754fa782e261c810161e762e80fd6b739140c1e7d17f5a1d99557c2a57422a70eef93e18e7e0077c9a62db9841aa43b8125802df17618b5725bc22c9014ccd180b6f12cf81e6eacf14b718c1c54196c25d0e9355a2bb7d8cbb5f3fd59ea85c58b7b2e3336dd3828e1320ddf1c0b8cecbbb7765714fb585f789c656302e23c0be9e6bd95a3e9c2d572374183b04a718be98117c48865d702736434fc9880f82bb8741066c0524ce5cdd6ce98670e6964e0ca74428c9461b8b06a87fecb4ed5117d02b2464495223fff1e3f15ff8a060a38f68980b88bef37abd1fb52e1bf1f62e98f00bd9f8c82305db6d8c53545d99d664514343718e859ed690b5953a1471778867dc39390343a1ea7b404f59c52a5100c3a656152abd3cf5c9c7847c73f107c76101ba73ddeae3db5f8adaebcbd75717ebf4a23584324537f7ca90154a7ff16ad08f43b9628a7533ffb8dc46cd9c54488310062f4a2cdfe21bf6e2384264a0767cd9afdf5fdf100aff043f80fc947599de8d260cc63191b2b23d8c31aefc0e54a737fee01c14287687e6411dfe33f05509f8609ada563124bbf2366af0994a2330ae0e43b79f4acfe34c0047eaa9852f31ca33623ff88a741f8279b1526a7d74eb5231a7da41195be627c1d742eac564bdfddaf1937d8d9055025582a4d50938996a755235ca54db2e6ded8251f5f3b0019868ed40ad94ebd6f79d7bef0c4eb1397d9f13f151d2eb381c8b283575f005fc954fa4fc98581389b1003c7ac0fcf3528ca2930afbc62a4a9379a2b78e1eafa856cb1c79bea862cd694a84e9f705bda7b0272352fb9c0654376fa74e15b761a126c26c25c8263ca5547d6ceb3eb1e3ea2a1caad9dbf375a268d35690333558f560ee4247c0fa74eaf2fdb13558457c98a975e9b59108efef9b73572198b04333608c39e2ab9d91c0dcf77a48c2bad7f81498492f4095e2d081f01d2e1d3460d5dee28dca7e5c8a8657405a529c1a3dcdc41e32dfef9aafe452150b3c65a4cab886dfdab954409ae0995c6720684df12d2f9839d77a2a63d03e43573dd707fa557a49c4c69ad2a10351b8486af52ddc8976c2529b6460b935e1cf500537a7fabb7803bc458633590c007fd0450c75433c08f5c883f87ea531fe04a2c7cc198e5a5babf79251e283b5531d49ac19ffd858351384c00e09cb1700ae9efc6a75ca84238b1a7a01ceca21f4794393a699dcad05939d2b9d7fdcb709df662f62fda282611daf27b8647d788a75fa799c5d3c59908b6b7866409ac6ad90d1e00b170f8e3538d593828d78d8e53b6f1f2f85343cdb82276e4eaf4178461c442a05af5623d887d53ea78340d0a41c036cccc3fd0613f48ca07afddcbb5d464b85ca5b3abd6353ddb93ec1983371bec700f9f8f8b39f7a23f0d3a0fa53657f4b36313fc9fd90e1e7cf70231e6651a1eeb6a17b2006e108996e79a72e9c0ae7b291aac85613491d3de568974a3562aadc3837a2ba7a71a4f7e7f77098afbbd25de4efec2e8f532dee6f67cf6d7929c8516d0c15cdcd3258f4676866804a3b71b62ad9c5b787f505309682fe07727afa4c0e12d79fb48c5dfb876fb56634aef00cc1cb18e2419e9cf62dbd238b6c58734ff57a0ab93c6568f7b20214875f4aadf9db20f6997d2d3cc644ccb326ffad1e37671dcd6c3a8a90337261692443bef3a9791ee242b0dfd90e9a8b709c3c4200e857fafb8b767b8fc0aa9094e5ff52b6a094a802f4bfcb8727b52ea59ed3c9fa24cd8deaa21d5383ec41041842e1b57733d50550c69e44ed42a571e6efda26c4df48db280b3c372e6af0af0d8ee6cd8ed1de7855fa16ba18c58c0a2a35da02c7cd6bf4088b00cdd33e97d81bf9369e882cb9d9dcfc9c810d6ea80b347a3f9a4ad0b3dcafbdc3e2072e21eb019c08c954a9aa6a83838e277e9150cd0b683c66fa6d8af41e79245554bd28adfb4ff2204705344cb1e43bff8e3e5332e6d21fc73b86ea5e755c282b0e9e69aab6644d5b154c41112754c9f92d802edb36cdc82ff5dcc1c9ca830377b1762e53e2c2dd3e8b7d52f66a9c06b80b567281401bb02bae6b38414c8c050541784a9d9098900b6e624d0e55869a5a4a1fee8af088e462b28ccb644ab8f200f54b2126741c02ed11fbca7863ee5d5b225f5d712ea42e3bead7f82eb6279f395c4f6cbd2c363cf5944d72483088784aa9bfbe696f3954d3a3bb8ee94a0082f7e95c5f96534e07d5e029d97d3ac2d9059be913c7acf86a60b344106865514d93ce18b9c8c70ce61e0a23ab3a1a9e599826748fac49eee3849385d3cb1b55a50dcc90ddbbebce800b710ed07f3bf18c9c7de9e4cf503763a284b10d111f223efcb629d0f15fbeed75e5d82f4ffeb749c4e729a5687f6699b98bff1d6b401524a515a0a08db1315ca4d7ad50eea2e85047ac510930885858735d69fd2726a8cd7a4382cc1b0c197ee9638d8e3e7c8d8dec2649dcfcb1709fc31a43abb0deeae416ad79bc81f92aecd373a66963b959859d9d68add61a94ab9cfe69fb3a77fee9d3761a281fbd26d99e900d71be6e24b32df5abcfa2c6061dac5a36e140f3ed2078019202cbf55737530eb1b901749e8a0059d2c3fc2ee43590052862b943718aec0f9e320d61e9c575d8fb842f9ff703fc113e14471e91631f9b28553425d08b715ad0de30336c13312c2be4c57db09a7bfeba69bbb2f8d7f0fb1ad5127f28daa09a6607a6fc32c348fb7a62970661f2d7dfd08787ac2e94359a05c3a10e9d7e3c7e860c4f3a6b1a856d404b32e45a97b50633a179de6c282fbf378e0d28eb8af6b6c9df1a2fc598526cc17e65a1c8fce1768ca818f0a76b01178c23e28b154caaa14f67093a709ee4a3552506f0cea326a02e9de04aa0aa8459278f51818fd833e81908b52ff0c9ca51650f0c7031e85791eefc3963cc33e51d3b4f2eb612df5e805e127a97e9dba7599266dc2fdcaf248cbb6cbaf1e2f1ea5b938cea82694494da297b75bf134782e47d5f30ea1fa2ede1247bf10f15d8cda3564ee0702bff99f63e4df90156c9ea355927e9c955bb0f0dc36df031a37309d3c53bb1c921c1762de6e5f4d69edf9dbdb9d448a105a9175ab91a62359d25f2f336e0c2cfd645776a023a6d1cb68074a28aef88ff4b0b764e29d16c6f6ff67152eaa8a6281a875b108ede904e998afd9a0d714a7dd67aecd48c277e9273bee76f6ea2510b56dcf4443e75cdd3c5880e9bb7ae91bf821bef7fba1ba1989ab81e905848d0cdba38760b43d1f26d8cf25967cf14d0bdb678d29112cef63a68052c7a07701b63c229fee5e95dc7f829be47327503ddfa12e4454bf1a0365e9479951b5445480a3edd34b831f8559d6df8246b4c4cda9bdc1350267d77be3af3e6dbdd1816177cc46586d18bff669a144176f378284197cb6a055cc99b72ad56b087dd4c7d3396c0e67d88edb5f70f2ab5716594f2e375bf560b28ddc5a671f7d1e82136101bfc77fc2e7281b5f95b0419eda0ddf9409ae71be71ad2cc05d99ce8ff4e72ae4c263edfe38bf77096aa94d4a042d71a79ab4d0b1e28e7ce3ad2ea12a73c6ebc4d34688f41a698c1fcddc4de928c08c296a77c352528dccf63775b9d1c0fd0a0fb4ef7c960ee38842d20eea9eb7ec85cda3d1a390d1f3b20ca91956cb83d6722641511805523de7210af52ec39142a14c217ddc222b46412e45ce536e5a57923044a81127ad0245f8b4cc21e38db74c30d9f37b9ab121d31828374d28cf244f8daaa6e9438ce65eb02f959740bd4bf34fac6d1084a5786bf1dad36148d84d80e099d5aff0f8550e0127e887d00a03ed97b251e25593518fdb942e33ec0959a0718ec564f8eb0296aa4b6dc80298829c4bffc525b90cf45fb9ddd0035eee6448d58c78f84f9707f02254e719b61cce7423f90c92995c0845b5962532203ef6927f3e0931470b98ec685e67cfb8ef002c5438b0b5be7adf8c28bcb03808b23914df6f70d528fe54c4c78b71da022388a55075b4acdff3206e4f0da0387bc64e5d02dac894500f2ea2c794599763f45c12683499cd5494ec9e60030c58bd2931332abfee6f2118891befe8a4a6d9d5db247873f06a74f Params = SHA2-512_W16_H10 Msg = 458f4d30f1bd34d306092e2de2924c259c3bf53de876188f3b1fc0b194ef548b3a60f874b7536d0b402b8520e98c8fb722f15c653d1b4fa63df8d891cda1e747f8ab9490b5f0b1b0e9df7f92ef172a5c449d4a10911d765b14221c70f8d7a1346b60e0ab8b6dd00d2792761b74746de071c27a83338b236f592b6ae75ff672848b34a3ca5b2783dad72e7029891c24fb77972bb4a7f0481547e8ba4ca62a0c8443acbe7d815f257ebc8d51e0dbbf1ecdb7e48e31e2ceef7cbca409da63bd3b PublicKey = 040000045bb39f35e3d6eb179e794406aafa4263e48bab718d4611b4015916ef6d5dd8ed7077b47688f2681377a857851510fc3068211ec47530cdc8312bbfe8a79e703446f7062d2370674cd9c9693a1a5a3522a58d896ce1b8ab5cfd54f9fed660ae881c602767e4064c28654d310c246ac81be08d63d3fef18ce14f709f4bba4cd1c3 Signature = 00000000000000e9808b7bd974f079b899ced611f87e1bbad2ca99fda3823c8c9af4f8e6d60211449fff6ed8149b76fe76e70ea74319fb66b918b05f14c5f7fa337dc76590697ccd0057117e8bc6f02fbd449d32489e62acd33b39db3a434966e56c6691e1153e5979d34c1c8721cfdb2063d0b7e1f8233d806e8f43b5ed85776eef2eecd39a9bb694788f56ec2fd76b76768d199175b1afca2461ec3f78e75a82041498c97751cbb17833b9d5c6585c02ad9740dbfa116d4a23ac3ac8c61558d07cda28d8ed384731132ada6edaec61dce4a49a95f9631d2c939884667c53a93dee86936917998a9cb6f53ff4c7a1961e6adacdcd5c0ced786763029bfe83f3ef331650f28a50a57a3212d46f3f5ea8cbb0a988a56df939759c57255e4f2333f4c1d520a3bc28d653fa17faf9620b43cf685974c7edcc1fd449253f05b72df6beaabfbe1d0768ec9054c06ad81a5fa970533357b4ff31cc09424a0a9f84769eac84e926b7c27c9e9529991426162c519b228da850455aaadffe0b9e0c39a979f04b5b7bab9f0bce9dbf29d3b21d88efa777055106dec99b151141476a3f25e31a6286e60452239454b79a587dfca7f90c58fae43cf70723b00b7d7be439a2030f928905ebc00e0fbb51ad359c6d15f4a234b4c03c67aaa0da80d5a5c92fcaa1ff400cfcc5f33dba605f18bdd4b24cc7487205ffc09f8824ced32fe1fbb322dff67e76be3adb07b948fb20f5d16743131587422f7b76faf9fbe334df3fdeaaab55c3c4a8e4a5be37447ac7f400fb447a3c41758829726da5e34cc95e1f68559c62e1253b41cdf2546a12855b9ff68a4aeb017bc509084e047a26c8cfafae5708ea22f7e899df8b1a65965a17aa5cab23f327fe19469ade3dab6fdbf9726f1b4962695bfe953c85f9df2ac95a8ed1afc11b735146e0be9a5edf0aebeee5bb9934ebe680a90e7faf0b67391cd05cfc8b2e101d515059f915932e8c378c1d0f1390e01b4548b0bdabe7962174dca5200da0e2285939baaa44f4066a722a2eb1ad2b20d07ac1cd1008b73303de77a3ca6ec4ebf6ba885fa73d9f4e35f6352293c99a3cb2977a2862027e3e591c21a94de6b54197cb3b89f860aefaac45a8cbe19dfd0867e0814db4b93385cf23451bc06c555ba8712409f8b27fadd998b2be7047fa7898e7b97510887feb9effea20e9afea0ffb4817d247b7c1a89db45962f0cc45f034a617e0fbb4bc757aaa2187a524b55299ef9dd478e9aac7753d1a1f8ebe3a5c5d63aa6294e19beae3599394dbeafadfc2e5273373fa9bf7c63b085ff0c0dffa2a5389991097543190f2db1ccd8070fef96319ac525b626b4bf71c94171691411e2e24446e9d34ad0edfd74c8389cc30214a991a8ca0e332f47994ade1574c61ec6a80d503798aa1be016e073517bc18de6de5990d3ef32823e5a3b855584825799a77fc4255d372f488423966f48d656cd48c5fd762b29217e871eed3626b7315bb5693bbe5cf392ac777153cc6e43a206b0c4056f8af3cec156f919479cffb871a5d3683294ec53185c381ce27a046db8c919977629a8baf4422df5a8fc8ee5ac543166bc90830031e087f1bafdeb28d5e61cef22ede425aa37b36e69f0620c10f59e43e418396c75c76f8fc45a446df885acf0b524f5eb8332f42f090f2eca44607817cff8c5e4a3f7dd2f76dd2d46ebb4fc53cdfd503f774e8787f2027ef52a9f61c2a452e056da63a1dafd1f5b811fa2c6c13b98ff1a2e33d1f98f518f5742ff7f1a55ceb6c1c7d88d75e2fed8803f57323afdac726cde3637678b1f07d306f69b563f632e666353f8eb30d262ef37128d508c1697809374da92700884f8998c2fdfce787ac43ea3ce1d104c176586895569e822acd4fd9aac446f07008ae484f3cf651f317b095ed53dfed390bacb9196abc2ca11f80159477689b37a3e2ab086121de585de54669e4c5538e28539dde74e13ee67e9683210bd214665d72c0a38ddb1e7d788e8f53494e980540be0d0e53810f988a4ee3e76040ea77a7a93a0005c03a3af7d9b5cef92cdeb695208b6a73868259d4a27ea99c5b979b8453fab9fb6433fa80b18c7ccb89b91d71688648d85417779b61d5069ab018e65748462aa99eb62f0738efed8f8f47657c911f9b7581760f57257ee6c3b594555981dde23a534abf3c9cdbb34e7528b9d110d9d380898ab8fd43fc273c6bee9f162369eb60cee21c14f0fb6a2834a2014ab1d7baf95a97a4b04352eb888699c2feb9bb208b638aeb7d87cce6935465669d2a6a4a7cb21ee4b2013b001077c2536a2d93f717ef17a4a4084172a73ad818bd0aed021c464e5926fef1c0f96f383ed8895a1d45b5067048ce2479af1b2c2f236e39a845055ff31384fc71abab1362d20442f12cd34e4b05d38160084d14f08dbd10ce2049cf92d5b0fd67cde9d3c6488754424315055f86310016427b9cd11f71187c84a4e228a93eac1082fc15c405e1ae2a9ebd9c194691c3b0af8203b34cd7d9def76bea31c3a6f0947263ca4281e86dfbfcc9d946dbe164b7961e1705bf5910a27777735ceb9d01a335d3ba21b6e9984d8c0ea62ee6b46f84407675702361b6fe7fcdcd559ec5be24c6d44dd95f64c690c5cb960b9e05a3757450ce3fac04fe3fa847be281b36b1f246c8280c75043df96e61b63c2346b664a691172cb9e6c81bd12d179993adba9e54e6a88f6a52474608483ee049b7a4aff9ce79e727bbf31087f53c3758289aef24e5a40ef7eee4ddd7a133a98064cf7b2c42af1101955164c7e15656dce6cf23090a2a0496f9d35410425193551dfab9857fc52c3cb30c4785d6fa6781bd4daac2895f9c925176dea1ec695fb546d612ff132e4e9371798973bd112a3ad2394a640adb1754f199659f78525742eba53bcaa706880f866a5eb8d4181eac8a5f604389b020ca8215233a84b586a0d05cb805b9350506a6a634a7d18e18bd46c0534b6f93e8d15e2212ffbb474fe732b3551dd8dcbfe1a4ad4b55acf4b66f1276d14136846dc2ab168c9e71ca3fae7562d6bb64bf5f9abdc0bcfcaa7cc636f214455094304aef06c9e770994f1752387204275ca1ddf7292d5c88818fe562c453e9570d13b6b131c9241967b96f7f7c07e5701b7678c8ad4421eed405d84992f4a5b59320710beed5656493357c74c85f332b196829ecc9561640adaa80cf63ed0b4614c9a79112c6ff1dffcc8540371fb7db87431ebffc81960301e7e52861878ff91eb2c7b3fbc584b76062bee2ba3f15b121ec210c9dc23dcde1b3154f2c1bbb360fb542ca27bbe401c2741309bb67616d70475c629f5896b2eb7c47cdbbe0f3f655d5cc386585a2317e3d9d8bcd9ef933bcf5b567f43b705fe0eb782d6fd12df2ac858754ca98c3424625c5fad8cb9159374f91b86b00751c5d468f5cdd238c6f0eeaff02e5ba08a969e95e7e219032d4fb4fb55e85e66d02d6501b52558e94f07a9397a049ee32cf6485bd8023c303e32b601365001309b5c915ee65b1863602a04f3c8f16cf079a3f9ce098b4e580c13fd9cebbb9855b3a95ab55c4bbcfecd52ef6e3b1ee32ea1f3085c0dfb4e2db2e55bd9093368fe4eccfce75d886a20d1796352b122f4a2893ebea1301f4ae7c1feb3e52a475f1c7abff7d1d3c2f93f31a50050d4ae22faa17e23fcf05ad51e07ab351bb36f16e59ccee445c02f2c533f5a8ed47e2d7f3d8ea438be1ecc8f85b7d900cfc73c24efe5584532b6f084b82e8cd27e170b4412e1b4659ded789adbf540809370a3f69506cb20860ddd473986e097c041061276495118a561e5f4433e4038150b8a883b5068dfc47d6770eaa1b3c676e55cd27c31d53927b7ba5997a09aea85b12a2ebf3210e4963573f091d27dffe6ca80ec9bd7a76c93d0af5200b236d9aed99dd5ceb5ffd7c0a456220126e574be8747e624e2268699c75e242020165c1f0eaf13993fc946f263b64d5f2c32f678bd87bfb3495595cc2f5d29f1a8b262ba67a54e605d17690263501f75ee0037dc27d991e99656a12b3b1647301ab42caa55c1156d169f3e86bfa9a4a585ba1a47285ef9c7facf7912efb082fe5ded7fa79f0d55b649b131d1a2ecd8d14bb36110f7dfd12e98c49d8af54cb8964c9b0940840860e931f92efca95793dce8908160f576e5965e0c0a3a26a7de738a21d33e374248ce8b688830f9fe24ae945be5917d3292cf0040b4b201758187aeabaf62b8a589dc1b1caef5657fc0900941287a9ec2287e5ef21f084a9b7a4a6dadef02aaf6a44a4c49562a99d7001e02e0f0a94a079035eed72267d47fa1fae6a01ed29b71458bf78d9a6b2d16a38d21788d66cd156f2366f65c72e3e98af014e5fed656eeaab499c5dd17e5623214462c768a5475413fdbbe4480fe097c9a5c98ef03ac4e2796e210c44673e001d50d4b6eef595988379f4cb166208c8d4a96ba32782a033676c7cb8472487ab712a8e95a2ddea02aee656bdba407d163ef94d608d065caa38783f154e880c6173a7e8bad0c4cc922048824777e297810f3223e12d58a8c1cd173591c51e89e800a0309e79618a1eb6e133a54a385881d1446fddc11d50f829cb6ac44830e3e1a32a19adbf3da914b967b3031d8363895b55ae96f27a691a3a3b581ba31d78fff30aea611c2858212b346dc060d9b48fff440268314803e0733e6da6fa388804f6200eb4b906536ecb06b91c52943c8d39a5ca21e49dd7934cc22c8e3ba3d2021c386597cd9cfbd98ce03b0f7e9462dd3382df7d7885e8a882585e90338266bd37befccf023a80e470dae59c7cb05167df66a7f18e7ad9f526413299ed0fba845d12e7c713295172877cee5c8c3a8f7dccc13e8aed7b5a651f4e07990dfb22b36a55fd70f3acbce3833c7fad10cd5ecfa5d1976629ea2af9392c0227bf79ee93a97b1a62ca5ab5becd12a261500ab9ad509dc85d603be8f83304467fb37040cf3126a58619f2923feab2e9763e2bf0702fa1602062398a12b2f0771fbc21903f0ca2a06e47eae6a482e96520f45f08620f12923d2d1a2ec6a03d0dd7bf0386a07473788c59afe9935734a08918cf99baf858e9efc726837bceeba99aa3f85e128b4e86b665e2037e7953ade885ef52ab30054a2beb5b2b2bd712d10461dbbb7c85f154884500dd75248e867b539199048c1cf070f3c5a6f9e0e6d620c9b82a6693ab7c7f2546e2cc733849e56b96ae07cbd9ff1c5f34c8ce0c1e573c34fa0fe134df4758f919ffbe186019b9317894e52f05028eaf72cd5b00595ed452823b105da41fba411e002041be9738169bec02fbf0872fd6759fb1e103d3ea1fd3b95bbb1f0d0c1f5813461de670fefb188d1b6427a6f71fe51282995fd0eec2203e56790b4f7b24161c91b20ad2aa4ad81c4415a285bd3cdb72ba7571ddc41f52edec69a4e2424fe0b912a1b036d2d5c25774988a70c4906a22aab6e1dee335c24a30bccc397ddb109f6a2afecb503e48b9f3d634b611c2cb2e9d9b6951cf5c358643d4c52351d4057a828cd0ee3e0b4ea167973e495c7bd8d026c1dd0b5a0a541636480bc17d87f4e0fa38b62f706b93eb08b53ad02e583a2feee4032119fa62d027188e51712acdf25274fa5421925fd57d06db061c347eebd5052296dee2ada0e94f016d8bb51d4b2b858141c563dfd65b120baa9331efc70012522530651bca6530fee63978e2cf17f6eb3e034a4a2d84d9d3ce48c2bac6c8d558879bb1bfadb95bd7d1e18361c7e5ade4e96add3bd2d80af07a9c192e14ee769555ea59980a3f5fc81e5a7276492babc636072d58118b031ccba0f47907ab318fcd84213c575205ca379ff9c069e9c2d744749dc8d1ea5eb48d456a2b80d4fb2e45b5e14b6e23aaa3390299bd96b1481998ded9dd8a793883298ff81a9e4c9db2517c4a26b6d5f5f2b82eb60e9be3005a2f264aa38cd6b371b8dc84875a2af76253149a5a99c2a7ba4d087052bc39798cf8314362bdf0da1e35a0c47a8d745822f0a8a1b65034adea3a4210b81ff5ba1e69e523bb8a42b4b239744a143b4f84d19130ece3a1de8dcc00db9c99d70be5419077e7f7d94419be137ba6b1992aceeebfb3f22dfa802c4f0a2feeaa084276a4b2e92793a3cd6d4cdcc81e8ebbfea80de8feac03051becf7c2429d32bdf4f4138eb3d2d25f44fbc5c4ad09c485f008200991baf8d71c77a91f4f0b16d24bfb006198cb6fa251f3ff81ea49d382b32d6378ce29d69ab6666fb18bb8feae485f5ca165551342327ae7b5e6225c0009f1eaa1ff52d0f569d869a12a857badd31c2e95664d37060272c2f99021b4ababb6e1d1819f7864439dfea6181515f917d7a36bf6bad24bf0022419028a5561f79ef9b6ad628883ad47afad06b74ac2117d6d6e9dc3f90a7f39b269a634c0fac54fa57c2858f82f6105d6c8a667f0cebce7e4daa9551c114946079ceabde02327b0dae4765bb85d36f68865b502e51a5d73f26cf93a989d793aa983bca22d85b66415fd4c47afdc00688ee8aa8ee8e7f6daf3e1333182df5e15fc92c6634beac5d379e105353abe95cd94b9dd78f8e9053a6f22c5eee753d9555d7f3ca9703104e0210f37b613faf14693f2a0a1b3421a3346a15925987b415700319871a1fbe3886264a4bbe26a0c8ce684baab298005811153fa43e31228592ab453393112ab70431b072ed3a879258894417e07dcf551b973a984ff58447d052f625616bdc68d2b3a74ced1569ca163a74ddc92b6a9cc0e56db5f3c68f2b168569ba00180dfa373205a168dd8e6186ee12a023939ca86a262b7ec4ca44092fb5c9547036d1fd5217778d1e18c46e38ca4794aa4200b34f195bbbd403604408f20f236b8bad7f5d3398b902c9d746e0e36a214c428ef08705c1c5c94ab8e53d95456eccb7b4df8b9861572c90afcf7ee08a1b18a06935dce20516e0d4c96122ebc7fed04cf0e38121a9c58d46492bf44a313a60dbde7ccbed3878b988e214c36acd5a1423d1cd17d8aeaf85701d422fe80d817696677f3e9c983015ffea16e7272b643067afefc80ecd47dd36330511f7e913fe6dc85b928771f9eb9537e66cb314483a95e20c18236355fa923604083e5cbf7ec4980cd4d45bce16371599fa07bc670068a07d850a41040175faf19712f6c3abb2936a8954e6fea6bb9524526bd40b38a89219f6d7f4256f50822896b979ce7942af93fbd9c68b6458471a24886f3c8a04120c9d822f96d37070fd5526307a411080d176710fd314b2857249b7e8ed647702098d32d106383873d0bf1a991bf7fd1259fbc42db23ead04577baa69f581aeaa0cda554863284f2d2f8c48b2fedff9cb6c5d664d023c2851e3e3b4dd57a6e157a3fd23a743dfb9fe8a98a14f9d015ae39dc94e595f9de7a307e146fdaaec07e6c015e8340d7f51b6868d91c95f706fc43357aad49fd9fd760d4f2d3cdf40277979581078712c3899d866329875a430ec3f1a404b6700c34b6a2f5c9a76c04f4a15b81c0627e52e7a25f5173a55e0d205bb202e17b7bd2707a95f2a2eb3af7cca45f34eb304e6fc861fd2546b0b2633c618c93a8c795ecbda77732599f22265210ebbbd9c1a5b3396007371a90466af10dcac9a63e6ffd64a79d6574726fda302c22d39c5f6bf906e754833678a4936b5c9538b08f51cc3c821bea7bbfb3cd7658d5695882e50af651c0804597cbee291df898788734929d3cb54cf932cac041adedbd380787b975113d8aa653e5002e3d7718047b93cb676ba415eb764eb60916bd1695463ea62cbe89a29a76c36d157305b5ce41d994e296d7a3c0fa5ffc3e25ebc96a8eea8f6c116d692a0714ae730d6a3643ff7c5e4bf6ae59615b9c639cfadbb042314188af5f023cfd8e1b1d11b4db7fea19018b5fb9948b14453f07d155905f72af38d47c46f50bba8d33869c27f15a3ed686f7c5eead632b2b4c6b18531d4a1cdf5421a5ffcdce3affcf98bb9ec1050b26ca4c25fed72bce0264fd9cb8c1907a7a9322c13e0c23542782c61463009a89cc18c9af3190778821b09295d162fe6f8d5fafa863dad6b2c3dce2704e011f77a2926d45b5d2ab5dbaf071137ae030856244565fbac03431af2486fc0de0423fe7c7bf815b644fa61205371527f2b9ff3898a7958b9f589adf19639a5ed498df42938a3a5233ea903f1d9f16caf0f0c56248ce591ccd408eea487abf6e3dea0e14ebeb316078f65ab5ac9233f1195ff3ee81535f32d46dcdc922111fb18d5db4f8e48906aba74a6dbda0729eab89aa2d1741417e7695f8b41d2364802d6ae85b5994e6b86cf1c3b0043e47d264657a784308944c7a12ad941f6a5610b77956504821a6a32e36a2a559855cc2a14c85d582e3f737a4966a9d11e6158a6d22ce0ada2af9258ef2f239086d4cf7d6a0aee93b0008e7e1f634eb0c887dad4fa2930a216feaf393a122ba4c59604270fe5dd6fd1bd52d032c17d47f9b3d615645217ba1dd793ea1ce26005ddce32c54a591929a3b5c87f937fae9a8ea24ee2bf4a4a28c1b106246641c50901ba552676e17222af71caa362b2eeaf344670bf8e2c9ecbd3e63fd141d57bae44a56aac385c064ef148b34dc953212f7053bcf145d2d99bd46d86db8c37adc4ebfe10ae362ee1bb52daab9d480ec70e5ed8238d82b7dcf67c3b4c6da6a6703c171610098bf7727799dc98f0dff00b12942cb6e002a4b636dcf536172379b62e56190639c02b5ea057301f64fe595801b1e3e7694cd1816a9d7054c94cd6ddd0378bf7e6400404b08c481c13147f4018af2b678c68524a4ab3aff2eafe3ee56b6f77079a3d2a989c3d2d3300ec253ac6d01a39912d422e06044e4963b105409969e9efe1a838d3189b133b0e3fdf087edd6be7a2ddb3fbbb15fbf2247cb69d8aeead1d2fd31c365b340df99d7529fc9de3dced79160b6f3e2b99b9b4833d1d5d0db62823bf274ca4162ce78be4cd055a2592611df11e815216c35464e3cba0283066a50385ce79dd4daf718b51fd0f7727171633dd899f32193f214f5ac4e0e344e7dadf6a88f8ef8c77e56039eabaadc163dbb3c4661072d8d76fca7896933a2a3caa7769c0436a066280f686fdd487f527e843836b096b07842171ac8847e05cdedbf1543979dab41f3b835ed2774c7b66fa0e85b66ea48e2b3859f8b7392e68faa282cd096c1cf4fa11d37876a17e6cc393a3964392066c416574fde7e26697f4c79a221cf0096272acf3c35ab0d131ad66a5fd61571508f4a568def5236c32990ae797b8a1baa340852bf6ef0dabca30457bc2ef2b0860b6c57b7516b393e244e3b386a574441c7dae74c46ac7de23f92d5d7e1c114a5aff9e5c1eed9ec4a85179f357203a270a5a8ec45ac69afb0087d2f1df9d6e0504c854e9daac88d34c2865bb5ad9f92eea783d5023e0391d6e3a4d9e353b615099baed36caf38f5d20aedd8581f924c9676081b173c8c2108b49a22a26b5687bea4377bc81344048d6579b103478446b80e9c301109835708900ca2269c75c553e550046aac3a631b06d7526cb3bf1b0d525516394ad190dbe8bdaa64562b928fed6967c1357fd4ef50bb138df23cc4af2d5440aaf1abee8368a72a3f81dc8e52d21cb9fb1d430508b870ce989bd6b881d61b5a5a639344e5e399fbc3d3ad2d289f3e7a073665719037db445c6f356aa78e260eeaf904ae2862315e634d38df4a99ed8173e55fbe1c002ec582291ea47cfbef7c6977b26f27bca606fb97697df51fcacdc56dd66df757241c001380c9ad33a898326b78bf69dd7a84c0603dac0e4c13597de85d4e4e8adb5f30a8e04496d8bc27289214d7919c5d3b3d65ab3e1176ee4ae7c876ebc50a93630d02a1ad99ca1249983769386f10754512d457ad3f2694cc44c4d6e5119cb5e9218c5c46d3010a52f9e046167e947620bee9d8e5842b59f0647fef3c386f6a66aeae5390bf68b494b99e803722948fe4594d3f6eba638ab2c882b1f8955e0652a6eb474d01f4374d1c1a0b93408b186cc4e06500e05a6433f9880f38e2e92b775ddedf09a36515b8cb20b5afe0afd1c5f14219203516c7bbb71eb28de27c34e48287c17cc5b2cb73801702c50b77ba3d9f598d33a299cc9a6a9ad5a6b56df34ce04bd858a13ee8a4df9efc44d4fb2f00ad3d339dcdc0f1e2d558c627bdf2f98993a63ca870793436a62a5fd848542f8a88a112ad5c1bf1224837df76443c764faf698ece6d95b3ec9cf720fe16cfe638ce13da7ddcee27f7590da56d41f956995250e921de607ec848cee53b566ed8a0c393e33a9e7bdc6e82308a833ec6c007a0e038098af02b8e152d66c351f3a1e1e9d822d7a3e08cfd1e3d2ff795aafc2c996f142cb246c27e9d33202b844ba24bf5d43c0449b7c1d2028c9225055a68e6c672abc07a0d8bc87cbf49f282fc92fda4509dc15e144a73d1696b746262ae492a3eb627efcee49a131c00f8736c78b0c012bf5bdf024acdde8f7995a2926e09a6937d1866608305c7b3916dd62ee791c905cca08235384d6a2f9dc08a288e34b258fb839b0f35f8389f8b8223f0185a490392c378341d6ff323124ce9588674b01c5b6973629002bb22beef27bebb67ad2fe92ac581d62273061594b70143ea00af9ed45d2845d70e6748550c258b86281750c16929edd44ee2d024151b51ed6531a186d5e81f44681fb05142694ca411895b935fab4a2f5c3443d53d126117e4102fe1625abac37d4035edfba23994aa72434f58dcdaba82d5f074a6a1fcaaac3a96411584ac189a2aa734f6deb09b3b11cc6b1a2f8a5943fdd7711155274d20981f207efc73e96b54897e29963e8790420ac6fab39e827605ffcd5368a00b6905bb9706fc6f936fc3610800e6149622e9d5b47c866afc9a46462404d890b938352fb8f56f6a8cc3ac91b2b2e55e3d86a8dbb7d888570d8e44ee090a3b29615bd1ccd63c81ae85247c70f8a09dc007ac02091c29521ea6b0e2fbe94f04a23000a0efd06e10632c6f87a92f7ce7f5f96827ef8955b22e7522d16f2f7359310f8ca6e6aeb9a5fc75c8c67f3a9cbd5192fff150eada6a9d2c9b75f897d19daa8ea79627ada0a23b7513f4e40f78448b8af073dd89284b1a8b9f2d30b00f437739eb28fe255df6fc9e085590515ec9112eef88ccf53352f15ab6aa2d6de2f41fcc1322230d50a2560339dce5f40a74f4cca7ea1288bddfa7de4b75c2dc8de8baf75e2f14eea64dc5ba28e1d42760e4d9242413ac12752663a5a278b046d651dcb0a1df1f100a22d624b3b38d0686733c052b797541d18860ce2028dea013c2384763de7b9de49dc4adb9ae1f12b3c395a8d5e05bc4226483fd548cea98013c419c4716fbdb89853264ab7d493c679b5605490a6350e7107eb6dd8b836bbf522436c50dc713259cf0dcb477e4964dc2a6785cb88b60e6d4720c92b4a05ecb16fe4ac34cc2b934af7d854ceb15f159acdd96b93746bc4a4aac6296cb3b861fa1c97b2aa531d26647be9dbf7db8d83b2826a07a291ddeca0dd2421ab6f32a090c99611dca7c15853b05e7ee8889d9b8d9e13f8b49d27f5b742aa0aed3dcc75d3a7cd54ffca10a33b4a1c0b05702a1ce7f953734edcf97afd4273c1e86394cb916a8f0977665981e5cab2444587894b21afb38f59adee62ff362505e7b56a9cc57b03e111520ec69843788e323be064caf0f0131d825869a01c17711c4678a6bec8a90a2f71249cc573231e4eec95aca6a872c010d9fbc9a9737293ab8a92e3f364660e878196db8c92716e52530c0ca64f4b40f4fb4470fcbfb9e5136b8f21f7dabfb6f784a548cf95a9ec583c985fc8c0b24e33ada091780a0f17a8a5c2bb35c523c73512ef0401b90ec5bd1bb0378e603e3c518b122f527ae14b5be12a459c7e3ed53f5ae026657ca277160ab838a500163ee492233be7f5079573e035b9758095357da31c35393a9415ec53f54165ad4b573b82676e7f21a1469b530f86310580423bd74dfe18a448b205ed790fe6cd9c3054e6e71ba4d00944d4b8bf78607ac0be6fc7e2f622e4ef3a3feca91cc850f14332fc0174f98fd920c24a402538b141304aa45ae4c7a4bbc7a34bbfeaf30183fe7482c309745e2e8ced8a9c66bd8d88f397f8e7a3c530ae373daec53be6237defcedae88c747acb772fa76a38299898eeaa020221e62c033df058c099d77e0eb6051bd60f1f6ef58775a1d171df901c501206c79c49aa866f660ea854e1b0ebbcda51c652829777e4b89749fe280c171a8e3d90b3cdd6d5baace1edc2731e15cc906995bf56e3f4b8a83176b2d63f13a5c20107a3c3acb3ba78fa0952ee3eef2afaa003c1e1fc2f04d44df1cef9eb3459d53bef0b8635f7b680be5cac976285bfe4782aa3e9bf270a2cbd15663b918a7c6f3940c56d35750bc4317eb85d4f8be13bf64015b5a7a2370b2ebcbec42d9b55f76f7ae9704ce5bcfb218987ea1ff4888876561e5c2f87c923996a63f49b076f34f92a4edc03df5bbb3785b3522f0e7e154f17bf070f8e67e048dcedf9eb93a7d2a61d61e87899720571e12bf2b7ccabcc9e2a05b51ae75cb837238275c354d84211539052775d41f212028f707c02a92bf91cb311bf3cdd78e65ad1a9630aa54acdadae284bf4f69467c6102ac56d878d6de1b81be1dfbb55d246731619547f83af9e537ea6e2594e27a4752f18376a3e26e9664118351a371c54725e37b3c26c76996a8128c924928389922ea4fe150939c2994ae9d12291cb96bfb1f240c3ce850c4d3b2984847c65c2f245d5af5fc47667187e446be13f887040738b9a6b179d804236fb3904d5e28782ba46dc43da7b2f5648ae8e6a1ea38024f45586ccc5150c10af8d3f6a8820bbd0bc6f1cf01762041a6d44e Params = SHA2-512_W16_H10 Msg = ebcc54f09738db1c5a24e315a7280d4cd8c266ee1024d3b32851fc49b7ce05c2a43eca9bb7d584635eb2ed538d86d773f4bcb87a3df6f595bd1e5b4c8b03a70c7bdea8f441058b133dda4f409f099a9b68b6dfe96de5ac6869ad5aaa9cc8630201c8df17f75202ee3069e5f912a88e0539fb0b04d487949a1f5a4ae192e18c24f1fe24dce1ba1c00c3bcf703a547f336594f87d1d2ca98a9096d4da24725601b1752e7d7f1986d9ea7ebc4caf50169065d05997ea6dc1e6937c1d7aad19682b10b56f8ac4c148122f9e906ac21aa0c3237b41f362cd869e9d25216c466f4d2a885296bcae2f02ea3 PublicKey = 040000044da2eadc44f6074409a26a94763a16c54a11fdaf30ac47c1034347bfe794faa66cc421c16b1812520afb172b46fe304ee0a24c046ac6c9cd55bc1f409d67784356c888e90faf52e030b0384ed42b9f865e0fbf4ce8bbce5f4b9453251fd63021516a2c37b2451c8cbdd9223e9b8a479ba0bba4fd98c7af4977411d1c5b8f242b Signature = 00000000000000cdc66644e6b2036493a6b9862fd1dd831a7cbe89881595a290773cb3a9109fb2a3e48e64efd67fa76d87d78dbbf31cae1cea9aefe4a92fba0a3c85fb2ed695a6947948be330e635b575afed1f1c0663fbc4077ff11f96133cdadd0c1b2a56b2c7f4a638cd423c9df05177e5ec0ae3fce296214fe3167be8019722d28d47610e14ac37e817c619affedb45458be53ea98b0e9d0497d4f24238a6c14dc34b14150312e60c6adb86fec2b9f91a28bf5c113f415dff010168106d5bad820fb13a9605848abcc8e792d42be478b17a25df54c80752417cc585c23263a5a07d7b6d01309b57f6d1b84c01d9c92225ee51bd8fc302924ba9912722cc6c03745d9deb8a20f1d94d0cc2cb481ccdc5e14e7b8731662f9b436286c201c75d7475ecb6a3d5737f37a99a8f0f81c2bdc9a4a64980d4a7c6fcbf96177034a7e676c39eec70cb5cf68af0d06741b215ce5e42133a5fb4298478b49356a2370130c3a4805e568353fb8ffbce7b5bb8d26619181350fc14061b4aa3987121d88eb9cb7883be879409a7eb4d22b7dfcb7e8fff459191dff018b1a51edd7638ad30350bc7e3c53b0869c0b8a8e72cc4628f8a780d008b8d51ae1c8b6ecef9781a2dc18f3092d8ad8441443a5dc8be8b61821ce17ffcda9b1fa7ebb80fa387af05de0066ea7b89cc241493f44314decbf8e37de6e85d129f5f16bde1e652b4f9c83e08db4df42c63af0e99d3cae0a317a42438e470b9364bab1529a2e4244266215ece38c300f742d51801c1f916cf0bd25324d17cdcc624b88a269733f95c3e298c5b9dfcf8e52fe754b3fec1b962bf63d94010e3365158a03031bcda14f4510f6b9da67539e845410f054d7bcb27583971f6477914d1596a6ff69d57f32ba81579aae44447e4edd538d69a25ddff1645948e88f8bc5a2bb1ca7324de52c7c6834bb0b3e00e6e62451d00dc49658a54dc751244c9aeff57c64968b8cf469da169604739b82925802dbf242b26e6cada879cf05f822ffe0b275d9f9dae873fa8d47caccf9081d1a6124987bd646f0a595ffb2021606b4815f391b28f69d7aebef515cb4ec4a9938566c5e6daac2cee5b52d7712203238f5f2eeb1d6acbabe74341cae9789f23034e15bb55bf1af6064b01d328cb910650f1dff9c619eacea55dabc611c996ea80628d4bfd5da7af249348648c74f9332cf8254e4a392a4f5728a3476d26c0c85a699f02b7019dc4d3d7d07edc1d045b16c965e58fdb1a44b6b293917d09283985ec91eac80868c58c9190f9bad8f1cb71bcaf6d694878cc4599acb63cc7a8a3c0b899ca476a6e66b08ce3d6ad044494866136d15edbd457c510ff3279dd65c524e6338b386921d0cddb77fc295eeb76db626f91fb52b9f498e787eddae3e359120a31c9d8c0c7c2b110c9cc67ea361e8c8755bb4255b7f9b25fbb3f8b13a03a28a590987cd850a42558fb1f36a1c459a34815c14b25f2b18e543a6f87f9b68ceb11f68312ea345ec396dcfe7a856a3c0b9dd58021e8acc85dd87bc2cb599b698f933f10205f41288e751ac6914da8f5d8e623c403ab73f2fd454760050bc491de3cf1cd05f89d8ff1099d3a337e0b72593828bfaac912a3b3373233a64807e325e6993feec72525b58edd9fe19cf0c7db1ed0a9e01e00be38d6ee57dcfc76d5c79d5957a4e7cb0e7d5340e6b439e09ccbd3039e3e04cc650246c65fd4e8a11847098479035e37b0f7d56dec38b4e27094c20c4d8fe69753c7894c95c5e2e94a05fa08897e50ebf363f9ed388ac0448d610f7c328c109c674c4896fad2a2e908b601d56393bfb6f82d3300a8ce3fe3e8462afb6e28b14a33126461ec379161bf8d0c80c6859c640dd822837cdbbaa5bb9a12fa87bb1c5fe494062e7c4a774165968b00800e3c7d5dab5f509d4c2b5ba8dde9cae5c45ecf2f65c09ec03a4343d008c6207b424210d6e5e524edc8822050892e0723b401de0c9c96aa6e00028585b549733fcea2dbe53a29e9b05e7efcb0e0c4168248a1c8cc814e5fd5f089ad0f6ea42bd59da3715ed7bb3e359346df81ef27e22ac528c4f28517cffb218a746a63f725b2dd898534ff0619f34f563d5d0acfdb64087775a9548b7a92af8c440bf3f1620e05c0e922fd162ddb7ec2f7a3e3c00958a6c9446eef2efa39fca109e0542c7f4884337c2fd6f1519db0f1e6f55a3e3c0912ec95c95597968cd5cba15d37c1a515e5171df315f86dd7fce85b7095993455435cbf1b7859ed2f7ed00e1b7c51b03f694cc4385ead00f9866f4b5be6eaf89857061bce00e7c3d6cc4dcb819975723afa241e5c4ddcb1dc85f1a254541ed44c50bf18a3fcc5cced4bc118d9c8c16064bc75e2527350b5a387e8c7da3fba6eb2566c2aee9a6d0838dc25a471c827a0327718c4627c49dbaca0f758b0b55d65d45dbdc9f1357b5d7cd924d0b87d98a36309937bea0654de1f004b502e4215f64c7154605b1541640661436c1b322ea9c3a1dec3b071cf1777c83471459312eec907c25e8bb01dcfee7b5517799e9ba7045d71b751803355ed1312e36e8186293a64cbb6004f70420f61675921436fbc4daf8eece0553d1ff1657c8b1d7010b13451fa76f15041763a2ad5b03399166a195b6cde5dadefe4780c4166e19d5cf32fee12a931af0559e2d7b6568188eedf073f46c4ee305c362ab853680ab411e3712479c0f569305175aad6cb2d27bb23a4d7afe59779299a2de424b5404efa0d989c172f24414a1f4050d09c6adeba8391f434a9e5cb9e7673fbdac88842c80f975e3d0682d802880da43830091cdead07c8a229f8c36be7fef8ab5f327011d09c0871ef9621f33ec2d657792090c9b2e010b1fe831bd21eb9ca3b1ec306c8850dda66ba288bd04f75711cb35438262e52bcc1b2dfccf0ee901a489626187a53736dcb6f369ae0d62630f0be0e89dd2c99632f0a16c1cf8e757d3b349782750823723cc9b8f2dad9476c66b84cd0b0a3757b2d5c19cfe22909a2d5bee3f35ccedacff6ac84c6f6a6103368a896ba0b0dfc909906fc4db3308d533edeba3e41785202d6130a404abb550a70734247822837bb046bd3606322059d5dcfd64636ea400db05709df6dca7e53ee4de7a72d7157a8fd5b510b10b5491c96cd9f8335c9d29bd26d3eb85bee8607fd6e225dbe921148eef4f2dcffbf3df9c23cad3c9d3a844b5dc50e508e7c5467bde4bddbb9febf9b6893c5af177c63f233f26861b892f087f1a3e1e8dcf4c63c96208d58e15be0a4c97372eccdf9bbe5d2e6a8453ef8b5becd3e9d80ea178da41b71505a1e061f62a2fce5b98d7b3f0e60df40af718184fe95799b7d223647481fdc8e935f5b6e5194c664ec5ce511fdc0cf7f2b4698f4a8ff28898e22fd065a304c0a3d87f22fb9d00229837ddde77ec139e5a5c1d9c980418108218475cadbe8c6c1d12e678a386066cc8500694f3a4d653c3795bca21e0002af3001b1102a265c9e0542547a6a9551534741c106833fb06e9001dfa7f1477c5e953cfff0b9d5cc62ccd1cc3e31cfa6e0f793140745acc352182eb8f8ceefe3d894174dbc5b84f18d509c4efd67cf7b54ee14aeb19fe250a0d528b8b3fc45be15df83e703ffedf8842374c769e20f3cc726ef72fe638209901a850e247de81dd701d3f0a3015019094e4efdb93c88501c67483523f5e6ad3cffd3aeff92a32046bc626cfb770f4b4aa96274c874a04f3d3ada8840b347c0d654523f2429b1dfc3c4a4b248a629a6d2f3c54b9f9c378bb78f3a893e7976a17a1324478e0f4afe4a844658556fb0e0bb43f4ec40a487fc2b81cda868addbfc90a01633d14b37ad7a538fe8754563ebbf1ffe78fa42f19d7c3000b8b5dbf07da1a1ea8986871d2b0782a758f08a8ccad827f4a727dceec9a8f08c00b3a7483d2d4b1548a337dacb584a00e2fa48a39b98057b217cfcc8c336fcdd1a0fa64fbe2616ccb4b30bed4367d5be10f0214e957f49dffbd748643dff0bff82b36be9e4a595087370a017892f199d1771ad03f47b812364db98e3d4f903c9d2a565bb4d34fdb663c2c998152f8c24077c5fac831f44b2ab992517839a3d02504fced82fe1518c7cecc14339f63789533914fa8b22900fa49d9e09c5fab76613a3c3bfc4a493919077f511daa4349186019878bf861ec87b5dec2da1fbcd27eebf73c561273bbbe7566cc569581eba345b8cafad9af39d09101c575af01206a41cea5d274ec2f38dd4b900d1ad52b1a76e0fcb369757efacb11765c50f00de5577c074874e30e79081069c465d69d14723346ed695bcf7c0dd2c91da97e52c11693009ca8a0495f5b266af0e2f6e4cc2cb23347d9f1a3bfbb6d88ed4d978f9e1ee3ca3cd2808fd3ba8f317741bd26694ee77564cf113f72910f5fd4cac8a95012d201265c1a22cd65b35aa8698e7882c698e12af6ee2c361a54e37ce61a37933638621acf93cd5e5b1307b971fd63419751560bae2875b01b4d81e208e4312ba84abdddc9be1c2810fd9a45adcdbfc6b4d6f05b3c96c1f6740b397d94e6c242799b4a5ec897c923522da8f3a4e3f9f570736dfcc94c254caa40ae78ff890852903602fbe3445c5d639e3e6eb60b636d026ef69d77b9ded38578ac8e6961e518c3545bd35733ff292d11c829ae62f5410b05a5bea7ce471adf17414997b458909431175d4eed27d9185a52dcfbabfd751571c4e771555f813e000dad6e2d2ba678de33f6358f9967519e2f6b81314b20cf0f2bd12f4748fadd8477841c8f4853d048428c0772c8fc54bc367ca8c66e7cafc184b47e90ff39b94a47a359af3605478677ce76151821a302c050a6d3e3c888265addd47358a9e434a2cab093311968536074b4f7040536c0d8a1c16f416749725b0c0d0a6d33b33183bca00a819439490d2b8b2dc350ede67cf7f9474bbae433d62c01c7368286dfe23c56de7d6f5e2a6d40bff1f5fba287d1657079caa155fe272f05e59be52f40dadc6a04520b1a3f2f725ebc870b3709776e1c2e90ea07c3d0fc649605741875b30f459ce5c4f1a630546985bd601986fabe7a50855f0a2138b0f27e9077f82edcb7a38edd8e08f3d5cea07ea16ad5a94ceedaeef4beea3a5b7777d617adf34e6cc806b5ae19b89c0ea05775ebfa3caf3fc9a66f1cb4a6c3d8a586f6c6b6d9139c3383d4eb71176c74032768459f4f14e55af18c92950dcc9ba8706f04a4ad6c5bd95c4c7d2e1001be6106dcedb231a6fb45edf99c48b245a745081680adf530325cd7725f6eed745a62e0d72e396387ad08916dd6ba2cb29e0e6e19e3d0b0db15626ed6210d9f73dc8d6f64ccdb038036b942d4bdb3aa184411a8eb5a3e8453adf0486cc543affb2aaf649a8acf3fcdaddd3af1670563bf41941434612b9bcf87bbecdb2cfc11a992aefca95bf3433413f28ed7b7094307d9a1ccfc2e0c80f29a5f8680230ce157adc8a5540d705a1481909b1f808131410eb2af9ec49baa47360f64ed5094caa7f6d99ef6e824512cdba288088064ce19998ce5d04704b7815a923a797fe82d054f27052a73214a9402d325528564193ad158f426cefd8ee672684ecca6402025b023c27e454ab2d1d877080ef8491d6653b93e872472c0a0d78ff7c5d2c24c9e22c52caa3544fa67d226f75305fb26306c0334fa76698ebe35eac1589e012b5b327cd27ba2d54ae4b3d10ac714efd3265a99f7857d3e06a150ff914af05e9ec559bf875e3852fdc2476bae0f16924a08a0d795e2b299b18d80de1d0623985279df55003b0b39f095a54cf7c59acb0e5c4c5d8c3f2d3504ab35ed028153a4fcf7b35edf6a14bc5dce6cf440a0abf6bae3fab6b2690ba95b57a3e3a7c11841948a3563abbbed3f4231f7aee56a9edb1b7fa00e2fdcacee53ef5e0518b1a64b8c644c7e7d4160772b9818a716ac51daa51b40b8d4c757e711f9a5780c3ddd2eb245d52a10b919620135164eda0077d1b2fc77121b24015a482448cb15bc2c8884bdb021a546f990fdb7221f0b2553cde17fa3625a923af7ca9e7775bd4f3547e0db288a42a57c9968dbfdeae5f50794a2b83ae5a38bdd35c5f0464c956ce15fee79bd78c3f6fe1b78e6f93197b8b81e47b5e61439243fe4f49fa4594fbe7365888658b66ba5658e9a85d012f4a2e8fa23731b049f060d7a3ffba8d3a76ca428fcfe8680ca41c85519977754564b4a8b8877750d35057999a32ce4b49615324ea341a550d1a959545de870c4346276131bbb34bffa2a021ce628d2e0ba681953ae1e7f3d5be3503a652e101b9ef92c0f111bb66ca48408dab0279f890595b66f131c3a66857a32c6d79f193f046f8d23a40fb7d14fd0abd3f9861d17a301467b2bbdbc9658c548f27f85dce47cf37694544f6bcbe9d744a629941bd4127931a1cc0ce2a45fa112232b41e44cd51e81a0142ab607acde2c46f22c33869573ca278f1735841cbbc6d0a33b0b297bb5e2f1b7ac428a2702fb22c9c25b428542775751e1584a23158b762ffaa2b1222466ed67fe3cdcb15901695f538104f465d3f80a5b02602db226e33ff90a6e98f886fafa2b0408cacf4d9f3c60bed7e9ca65e4ed471bef062fd05ea0af0ce71d44a4669f0d7a06612d08da467de5951283b827fd0c8f89ec447c17acfa1c8143ec95c3a3528ae5650233c3b1d456874ade0f5bc992f866d169d94db1bd9f6e5be75173d39dd8fb6d16d423b1d176987d95aa3eefc22fc405a396185eecb33be9bb5a268a4431f7c65a8282113e1622f5387f0947f48dfb040b4ccdfed0e05ed8bf8953691feab906c8c485fb7f9453fcd2e83b46e63fd303b9cbe5e360260abe08e1ea80180c422fe9c5b7ad583e34f0346a8f0ec60fe2420220acbd1580adf5dad00ca740aa9cd6d13bc8f9411e3ca7d8ca2f7f433917a2e695a3a252549eb46581a5eafa8a7dbb0ba52c1ebc13c27eada465e5b7d2ee4f903c405514e3a1a743870e375e7ffd0cd7f8d363372fe7a7ced99e81fc6d8241369332aff8618a4b5dd93c78ef161889aefc9f00bab636fdbdaacbb346065473357eefcc22ad80fbb716319c09e6ca49eec1db4534ef843f4b5c074872ae0dd1cf40bd688aa50e7ede36714b4bc7bec58ba4cfc90bc426c3cabc5d61ab09af54356e63abbcc0f38051c5b5b2b6916f83ffa85c16be956a0c52a2e0aab4281774a6f07f51f07f8ac6e45fd09a74bc3c3d6dc90ae1a4d6e0e314a8ff0beac6754a831599d163e261783d6d6676493a49961759c8a1f2f4d75b1afd5b284fc17900506eaacbb55d2423d0681d3359b2d4f93568355669dc1ac1b4d448e4cbcf056dbf5bef853d5ab141c701563a59e92e0b8242735692e1d5c970c56c69c688e0432b3be7a978b04c66f4619f786c85f5e8c6973376fb71d517cd8d4490c8d29e531887dd12424f226b150edadd9ac9c3f4d9306a6e6cb1171dcdbefaf372334dac85a662328ce559c4efb712e89451dea0ea5e81f9c10df059f047dca3d492fac248b3f9d642ef2c88d8cfc9e08cad1526a19d31f48a19d8b85146d5c5c02414c676f2dd99b1c7fa5357a7e4fe6c2cdb8d56b3df4b162fc9ebf3c0878b377d6d1ec12a7bbda618ca8578ddbcfaaa732e6304e6c3ba0b3dbcc2dda4dd907ce7f54d2f08a9983ddbc569afee65ff285e6cccd897be6f8d00a09729c103b9a89a90530e99b02e872f0ec3890ab2c5da0fd2a1d1a2c8578268eb9f82d27afde19aa7fcc20061429c7c8b3df33507b114614abf5b13216556386d265bac1e31fe9b4d33065a7556124564b6ac833e2bbbf9754605882c46326dd06e5807653e05ff3c09afb90dd7f4f05a020d0940d4dc014a199a3a6265c9c73129b4160f010153b1674b1b44d409b53df6d5fa6d7c66cb6b0db3fb47ae3295ec8e1fbf2193c15701360d50991666b4f4d6fc2dbe177a19fc0c0bbd190e9004c95b0536a16bd242f92dfb39b073ccb85302cd25a882ab8af9fd03f88ddaf5be5fdc0978dedf93c20c44eeab0a6d5e80baefeeb5477c50593dd2ca201600187926c06305d16ab51020e152b6282309c1b7a1249655f6d795349334ed68596ed0b54f593b9e43bd3a1ccb6440a3bbed4575632b5abeb481b02b9f9212f72488673cce5a0e7126975f55ae6cc2b0fc6e9f369baba02ddb61ea3d141826537d3e6ecd3e49f8bb78d70e03bb3b4bdc05958e399e59d9a5f8b4ce20a36cbf6938a60386efbb80c6f091513eda66c4244356fe8d936da81ae24a0eb9ea73d2ad6e7fc3ce3d28de4bf5cf9880e360cc916229f7a099f7635e588de0a03e1d9f534ed0e690c36e860800919083081a58a8e09ab5353bd250184a768a97c6d3796726605dbdfab9d9f8f60489456400f5004ed5b217dae117ee78b1bc66aadd580c8e2d9eff3b1dd5f18416eb5ce35ebc005bca100398bdbc8af236f8c60193c035c98e4351b0e128cca88d1afa09683460f9c06c9c8c5b47b676a55de813d7bd1d33718bf5cc79056cc18951349037fdbcafbdb206c02a37d492991bd59c19c27dfff48406aa0d8aa6f7a95e006459db6c3a116d159fa8e503fa8e7af312081844003f5dc0e35eeb30969950e8a4d5efd581022977cc3aecbdfec4cda1359a344a9f49760e66f0d72060a87278404eec7d156a3080ccab95d7815f7a2db0dc825698fd614d58d58c3b5aa1d9cb02b139fb6f36d91c35eb0c063265ab6ff8ceecc21d2eee70ebb3333cd51e20729d73d82fd5ea57b290f868acdfc6068f92923bb9682fab5530404b744e8d6106c74cc97d5187387533d87a987bc1e58827de8b5c2cd3e42c76d471d3b5190e63672d7d2a363fdffa337160d3b3e864300848fd5a9f5182a27d4348d8300c7c4d7273afd38beedf77d99335a070cad4d3cc444166223c6134950684c88e3e9b075f6edcf2067971ac522620ec56d5e8870e90a4333ffc2fb99395c620217e08cc89f05d66e70ad9a31b63d2bf30e622e22a5409a5a87c1b4917be31217029dde5dc34ed751a9c55f31b8807a7ee45ff044edff3103d22a4c98c65467e79ef1afeb8899167220a2e3ceebe8a62aa2dd1e865596baff1645085bea4475b5f9e13cea212cdcffc8de0225e92e6c78c793ee0fa5e93ddba5360fcf127b8cb656221ca0e8082aa3c8085cbd5315a6fab768b45cd53936a5dc8596798f62897ecf17e5a1b4206118a5503a2bf5246bb52776b5d16ee7f1c105297f17172f884bb8b0b754a824eb2a8bf6b41b110423d995f98079983beb53fc3e54e4805d5f3c0f6ceefbc63075fbfe98ea46bb98b40162672f220cefb2f20aefeea6b4d391d8446dbad7f71d31704140a6683d06e5d287bfeb58b217da123bea40eaa8ae4bdcd2a9247e3bcea686f46928fd9479231c7d6c6fc093f23d846d060b5c3b5a14219b2a60abf5c10229651038b1fece589402972fddba9e196d8d0c43caa155572486a9e0f68711f43647f633aaefb2f00f4324d1419689170741bb9f77ed78bece87b1cda282a6f8d1c98105c2b29622fcf3b695c6874c49649a7f7d02081343a7a068969f773fa5cdb56ab660bb83ece1ef8371fb5c884362de28c19c2afdc06bf794621e1799c232a5512fb778af8e2ba57648a78eb86c72e0740af7cb344eaa26a6153f2617bb727a43d54c0d2135a772ae8e2811c460f7d1366a3d7bce4200b386b59189eb03afbb99a066a0fa9f1d56676de71b830048fd9e83b975a0a7abaf59e7cfb8c8027003788677ac1e2bae5643417a98a97f8a4332082578ca33ed9b249e31a611c12e92555a78586657501e0807c053250725d1226f97e4bd202d681fd62cf362c24dbf5dfe810f9b5761bac7708c0ce0804ee9c0760c693c09e57f01e3bf00004e327b27055b513e7916432d60e6e145d0f6ca450e3b56790959b5f056ac6fffc5ba94b142886c906fd7d55fab57fb21b56f218ea6cc197338dbc1ecd4b12e5c859cafd662fb21158f2ebefc46decfebaf72191ca7d3f947d249f6d532dde042d0698ec69b14b9119473943b32a24c66aa598f2b1853eb3db1906e5b5ae55e45f25aa5ae91a4174b88e47814f9b42c1e1ccb50d08513c32f929ebbf5dee3086eed021634cd764357bb92e9c54138671042ea645771ca04681a20e47184d32d3b7196f8515294b4b5036aae40bbabed2521090ef2776bbb588db40cf87d2f793e37b1784f969d1d3464a8d345064ff93fafc2bd69226cc428a96b635fd196d7279b2ba8e3636da01136249282750382dec109d9475f31863b271f30c02283fe7ec52da5da35ff8e6a6a0d23272a152947fd78c647b039be563cab92ab92d272208205db179f64d50e582eca8c57f2c5532ea79c46c636ede3be9f89de06c529c7d9dcb53f755328f0110d6e610df186747b3241521706010eabc51d381688f910e9b7257bd08a48b4eef1f504fecad7498f7a70a38c99270d7b30a816a045f4cdf9f22fba819688db24b6f80f4025e2f80c8c873d7fdc825d64c4fea22ab8f2ad1c30771f52450c5efc7228c19cbaf364224ef08cec41b415a72dd7349fef8b7d443c9516378e43ac319ace045191550906bafb81c8db299d97ab8b7eb3934be5c97f4704dc69811c25a7439d8bd1449316014026d31121840bf77f4e4dbeac0858807d06c5d6ccfe8a1f13f43b2a827d520bf9c01cbd8c3867b31004b4f3c16fe47c3de5cce39aefbcbde7417e2258ed9c9dbfb311ecf8f32b07c238536b5c26f6a9a705a6095688f4fc101f4b2cfe6cac2d62f9d4d692ea9c7ccf008e7b55940ecacfdaae4d14ce202518f6d2a26ffd5f38273a7758c79aea636231002238c45c01d09d70c77d59e54c24e6ad40d74f87b2c7bf1d1428d43c562c83b9f15328f53058645b465269141ecf27a303da78a345a46d828f39ea6820daa816113f16c7d117c1b3e008b52a847b33d99513a4eb9f5163c20df7ffd52521699f4c63e3fe9ce30b66546562f9fd611db3c7a0e3a4131a8062b1ed4b35d2e378bad82848c77f3d815aa78ee05dcc2af8c5d7c7b0d4562e538c745033db7ce77efb13d8e8bd8cf65dbee1c9cd372c4484d49edeaad6e63a34432053a0f424208ff39eee274f885da3eee67ce4bf87e645ffc49004e2b96a944849110d3d6b65a5d942107c147879fbf29f5febcd4a8209b6aafcd962367e272c5208efeb073e057930d9ee8c40760349daa28556a227f12589b619d5b5950c063813666de676217e6a5cc07d52a5d75b8f16aa9e993805090a195095f8510757c4f4e1d8bdcab3d59360bd51ca71a8714a1ea64e98169f0b10d633bf3f88c2dc076b29d9269ac445c88ff3a37c3f054b453141ed437ac5126fcad57b39a6e304d3a9ba36500ac717b3c8972ea35116510486f7b729641b96515eeda1ac0395263a0dc609eb94141a3cd885af18dc40873487fab912b9213748ccd8a75721c2d99b59ac4a33581d0cd58db1859a5ddeeaea68296177b168267b0c2854365f6e1cbb1094e86e11efd4b1afe1dc7e45df91f93f1ca18b027f66583cbaef4e86d1a486d6746b788e3567bde098712796b3e88a4121f31bcb66fc38e5e97a68d645bf460cb1dc51d07c7db0a1b7ea10d6314c9e8297328326e6fec03b390c433bab11ccefc691c91af7c9f66d131393cbe8f897389e9d5948148cc1fec3231fdb82b4deeeac382cff54bac9c39966db22c65da1f289b81874697a514c617a9cf97ec499c7f0ae1b69a23ac42a64414fb6de6cea5796c7e47e30427092d62b737aedc2b27eced46fb65526e4a59f4aa4c7b617f6837e78515b3d49e9e322d3b37a9b536233c6c2e36cbbb209514c0f5a48bc08a82023913df121a7565efb7971daf76e2ecee4b9efe20a43332afbecd0ca2964a68cd0eb4d9b28593dd5f87d31d4889739d0a29f0c25d77cc15cd658313bf37e0edf56a3f4691e83b9dee3ab39a0bb3bb7756b63d733fe01dc5cba2507236a8a16a857044fd982e7f74a1cf22da944f16d0f2478a3fd142688a036dd17ad3e616ff3b34fb2bf6cddd317405d72fe0c8d0e2a4999cec92a126d95ee4b6a2f2007c3c4e2f1ba08b61ef898b5a5f70cb88de5dea08ebec0122b1749a5c5fc86498465651fcb95a064a399c76adfc3f6d20dc3c3ffae3fb5cf21dbc4245a1761d6bd7af1dd70a7996c97332655d595867e5a11a82f8baba05e6cc510e8f5ad0de4957b68878f0e2360de667c3bc6dec4f5c3c66b2058a18c1501d372d5f3aed73ace6959e5abfefc680c3f1389761b880fe263f43471a0bd86a5560963182dd5ea7e1027d0984ccd402419f94e88fa616fbde26dc527ddfbd9c955a120415a9bf5c5d64f56d5a40b4083b8ba126549a2c14af1925bb6d56f9cd2f0cac0deaff1351962ec8901744b60434d452968b08de03dd7aa3d9e857528e3f29979b540cfa7663eb7ed7e89fd004d28bca536a2bba9b7de613493bb115f138530dbfb57f8f35657e93e1c3f8ae9e14ff8e537c9bc631647d36ee203f3a6692761b6cc973a2f1fbb5f45621228ee71d38a64cad7477e38074ee0cd5890fcb21c20fa767ac1bbc6d7bce563949d6e8198ec5c26add1ba3245bd5f59b456a8f68c72d175c17bc37275c44219f1070ba3800bd46eb93e453f3031f86d7aaf2393da6965e8cf0715eecdeea81dbc7ff6eeae6dce708e2eb36325e1b0160205f801d6859b662802b7bbb78e69e81c10757fa16a8850906efed5f6e8a80c93f17adad3667bf305d873e3acba66f1d8bcb4c19830b8d916a4cfeb7d52e95b1267c46109d5223a0c3eb53341a8621ae4ccd35e2b0232fada0b4dab6a2ca9f7fb29075f9b98bc2e264c006ed8384e9c7e5afce5bb7cd612bb1777eeaa8e4c8c20d90b469219a065a5b58b2a708e2acb2c272ac4ad6171a937813 Params = SHA2-512_W16_H10 Msg = 7947c106e7e116b7e97d023498bd39ad62f38f2121e679410445647c6bb250066198e15681c2e887db6e04340e583d6248d00f589e91794d9182c1564e3591df95badd3b5c4badea59ec2c3bb4cc36f4287c709f3f588a9b7f2fcad52013f6e23bd35a681b9731dc33f417d1bc885e61edb535e1609e89dfba159bb31cf570ee577a5eb33271473bf67113aab4ebf9af841b2a3fca38606b4488adf61a3b6f3df95a9679619d10e60992aed38061294e969528cce7edee35acd6c3e66494a505edcbd4bc01b50fb6ab026e8cfeac842dccdd6281b9b701457474d44d571606842d2ae2231839ee0affe9ae7bb72456fb79e1e96d94998fbd7e7f68d2dc0be6951409d301fa2b7721f67b93b96afd509fdf755213b5a23c551c295f8a PublicKey = 040000043a9f156f22674942cfd68f42eb1efdb203286c2a9103b9943fd40ae054daf6994312b0c5aa74fa28fcc97806abfffba44def0c26bd748ba71bf27f3a78f9980e1a0df6651b6a24faf5eb9c1f22e567c00a94c0f808037ba9405cfea82a13031b227b462cdb2e4fbc336f8634e36c113d6044f491dbea1301b043a791e2fce3d9 Signature = 0000000000000040738a5ef557cf8afba71c13bdc5f1158cce333cdfdd88c04a49eec8951738390728c13c72e12d543f4e8a9ed0883979d8662820c5314cdf62b1a98d3fcc6f9c573be508268de40315d4ef1f110b325a1389a2ce016081ae504f0fe1938955489c592e78a321428492e78c12a2cff1026f4569c316cc22ddc652f9e9830f292d07a384fe6e50bee2eac7e365f9ce71b4e478bf31ded303e65f3c1d02b506e293224a770f290454bcd8b80c02eecf48421c21f7289319c45fb4d0b61cbac29cd4a82cf25ff4fc1eba218f819747ace46782c4c0906f046621bdbfbf43dd283458ccfbb845912d23c999772cf315ef4ffaafaa550ed2ad62243f724294bb709104abfdb09dbacf7d1f41d92d4f70c46b867137e1c71144e6f7fc78b5f7f6637784408cfb102a72a628f30ab2571bda03cb8d7ca7ea5baba0f7499774388714f1e78be46c04b903ae4ed5a914ec071dc135c011f1a0bec0445eb3adf51ccc181ed15adc9c81483fd8b43cdd77e3b7058fa5c90b3cc6096485d57e91566143fb1e2a2d741af6ba0926075496bf81c115ea362218e478b06a2f3f2294b9e1acb1e1aba52dbb257d682dcc89a3859d2f57664630e1f2b9f3ccbc17222ccfd8732f3d5f8ea8b5c4bcda853e078d3bf79c106ce46a0ea23db47313fb7ad99dd00e6affa27d8f0bae85ecb34379afff07d97b1b0c2a1de99caee7e1bd157909361e2741adcdd79237a1d7b20850415f6bdb212347fa51ec055346831b7b16f1a5224bdb9eddf622dce0d43570cadb566b472d1233285bcffb2bb5572892eadccf38ed3c654dfe9949d6eb280cdb3bd0b84e701a8afd39f334f043920345d44b01ccf7bdffdbd700522948ac7f8bcf2ad598811de69ad522ad87e5436875a0255f4c762fae5927fb1722004a05f82e1b7ce00dd1dddc4c48da4b9b7ede200d615b97da19f6d8192822d694c9d1993d14847af4eaced0a4e3b770e889a865da8f7b37de96078bfe76a3187feecb029da1692d34ff7aacf143c1649772ffc1fb43b5d371251355e1ad710dc180708d1e8d523e3010cd052dc4e7da3dca70316748a9f1bb215998a31da3e7711a3f8037419a4edb7534cc31f4b3818b9eca8f47525eef38dd55fe9b8bf5ebd2471c0b16f72dd1ba44e26480cce2891a91410e8f50402b0da887e0289762c5859e6023dac4f9ad23e2b990571c2ce564815fb1d642bbdc5e71900b7cc7168179207f1e53fd0369cc673f3762fc009f9261e88eb4a58ba3238e6bebce57b59f5626f3d184ab7d581abc0cfbbd444b8787f35759540729a338e00d4022d6937c19766bc4a8c271a6cb000f48d8f328bfdcfaa127c2424a0252d8ac39ad97140f87bb7201c48d3fc3ea65175e7eaaccba9621091d530cd1a8b7f935b932c1704d458658b565c376f7b21f95e42196eb3b0e15f5f8a146e48af6e2adbf8121b6b523cbd3736b9e42937f1f3b3c5408c2b1374f377d3d9fecd031d77e9d6cd1b7267378bb8fc58ad298a2acbd7433b0e26d29adbe113c44e986c0368ecb78c6aa07d8398c7f958350e92cf0651562e4fa291b468ac601491fa136d7718e270c128e115d5fdc698656356caf2d1651eb59eab4cf886e9701aa6ebd711b34d8a4fc2e0802d0bbaad48c065a5b297fccd85b1eab39fbfb203a7e38a33b7310a0f65d1e13607a994b36ebbb3384fd1b1e8132c40474cf1479c10e1a21cb2a9fdb8d38c39da96a7dedd6fd646c149182d4f7e13c30d4e97d7339bf241df9d97157fa2ea80842c83f66c113f2c05a86f6e86265a991c9a83b6b6c19cbf9983d926c5b72029979bf2f5e1211cc7df58f9db764772da1941279048bd8287fc6da17ed1c16d42c0ece6f9d891f3ebf0096c80b9f3bb0d6843f552582622fce630653318c8cb216a079708401dab6f0d7bd7cf84cb2c35304b6fa04e7b3fc9915f9f9ac8fc1ee8f02487baab7a6845f9f6bede8b79ba4739eec9e6f42ca05b73f7eb78c26465ba9c6853bfd2fa14f753c71a4eb11424704aa7ed4ef0027291d2fda3909e71068020de732652324b1057ca26fb13c23f2f513ac15d91a7fd39d70bef1627d51ed93853aaf675a9361a5bd9a83c551030d44e820b787034d8e01d940f6c686caa742abd94a916f171c4f3b4829173a273f145ba72f5e2077327a6024f9c0dc3d5df86dd11bf82f4f5248bca326e4dc1437c9c1ea0d91557d7a3fbb7e5c36223092ef58f4d4d7e294feb3422becbd3d05508ad66b0977a7ceb87a8cc78447ceb752ec4f0d34ae3b87142db611a048bd488f613a6b49100bae1fe99077462ff231ec0c40b35f094b95deb8831c2500f9f82df790aa676314ac42c878b1d99244fefc2f57b1d9820a2c67a7003a960b3aa106280273160d5e6b3516377d7f68ae2858c748b68f7d8c05a2e62fb9bda10c2588bb2ca75c0e947ce728efd02c755069c8e688c443af9f4d1b0270fcc016f601bfb617a3f4122e31ab20ed0ed75dd58f74e8031f3b3bc7e6130324c16db0fc1e935d603c50df19d10cb1f3cc7cb13050601cb6c7e2e526906de9cb22f2f22a2524aa8495212353b51c33ff35a7b0c67f5d8f39d6d1e0b1a94388b2a1dec20a642fda0bbb874404108357a25ffadd6da7ada2ee89f2bd1fe44b2acd05ccd41d186a57180f928c0621f6b9c41567df979b999ea0613ff2288fb8ba33d7c10468ab89196a22ae81900efcde9ecb780b43b1d70daa2b4b8be924d7931de8b411b6c7e8d9ad500f7c8071e1c367796b0153553240c404fcee6c0b2e018989d8bc02c945b3bd4123e27a9539678d67d654578f73bbc4cafaf8920faa0f990b8c2c9d50ab137cde5be6c6201425a074758adf701894f338224c544d914c3140eb525d18a1f35f7822b5bce331cedcc560897f038a341804e3f22e5d106f12b54953ed24cc007f76182efde8a1a48e71f19b862673c4e9f669d7f2e7b5a97195c2e6f7ee04316e3bd07c1d260871896bf9e2b48b43ab41a149b2e5f205f6fc3547c4b1aa048558cc8c4a2bd679c2cd9424b1f72169b632a96226a2de876ec51bfab9fccd7c2a182804db39f15e9b009843b68ef8bc4b75bc48ff67faa9149ca2bed504d2c8d110ceeb62e6dd381715b03def3dd82414c161a431d556f670ff29afc93cd6fa6ed7a1bac370468602a6ef9afb9ee1fc3990efae14a28a7f2dd970c8baf8b6628d4a78963db16801c6bb328ceaa8259944e9527738e32d4fff7f5136126dcc27ecf9a7d0e050887ad8a14b45b2bd36460fe8a8ea33699ff7be0f6aa07bbc866329526837e7bd9648bce114216a541c35c0ddaae3753a42b6c1bb5ff5492782a1280eb582b0c49a8667014ee60b16488e04fe6ad700b7d4632224347330873634216bcb352d671a8d9dfee548ad6edf1fb6ec7128fc864b91c727f5b259a495ef7c8c038829f5ab7cb2cc829d7bc53d5a9444aab996a370c0646166f0b96fd3a5d58d932d532a850ee023e19dc82d46ff3399f89a67af4c4da32b101ba0d29e71f1a318b929dcbf5c2701b29e27a612d1e3ab32e6d8636c66755ba09b11d73011fa73f3ddee431c72f70657a7d356ec949a63e43bc37b8d390438411c034984670a9ed9e36ea658ecab13d5193810f1b4a51c5d6495c72b124d38462488df6dadf09c84e94e61c91a1d88abacd39d337dac7152031249ec1b09adc57a86a60a2c9cf4cd6026764b8d34913221deffaad4fa1b40cb581562385a5b479e922f1f142c478054a1472bcb0102603381f319aba8e439ed4e7c0be91b7050ca32fced9849606faa3b52b10a8a8df5e518f093d89c3590fc240dc3f4bf59f0f4b0c11d336c0ff3456aa5af90a3deaed3f8d0ceb1121bdc23a9b68692d5d8ffcc06a86019fc2c32ffa45d94e2bc9ab6bf01954ce3de0b96d96946abd400b249822d8df1486545dc4bd1b811ffdce6b25d0ba27e3d74f7c936c2fb8ac8381bd2d84ee9fb766821a05c2291647f9c6355f3ba250c08220d6c39764ca624ea50181191ed81dca9dfae3cfc288a29b98b3954b2207890075f99399008ab11295930117bfc56d391fb38926366829dadd9100cf8ca7883f051931c0940986526a7f284d4cf483601e7301e2765de64f84ecb834a5f5d372df6c3c601f660bea83defca00ba377529ff6ecaced8b208c4a7fc1cb9913088d4e70754caa82e942de4bb7124c6aa4242fbff6eaca3b36fa7732b379e5fc05deee33edb5515b6ffa3f031ab29181ec930a3fee1ac601484e7c13b8e671f2442558a1650e6882d26ac9c60a500666456741b154ae02101cc4430e9c6e9e47dfde541b311816f1a23e9f3b46e52f72821e43aa087e3a4b862ca6537d3ee998f46a0874b082429bd7db981f7370c3fe1fda1d5ab043605ce6850d43d3e9e6b7821d67ddf5cd14fd19fcc22e00ec739d258e3087ff7e3ac3a9ecec86f967923bd6a9d20fd66de8c9b8ae10b050794e60a576f47f4eab821a9bec196378754e91edd0b5ada3578ef9453196f42a661071a8dff05dfd60ffbf2b4667ad4c4e36cac47d7676a1fb7b9151b5e49e99076c796329f269df7d518d80618500680d446c7faa8ea1ca0b8e61a0ffdbd4d9ff05f37ab6b7b668bca9b4b2d425fdd78e8db1b57404e4743b1bc4f1cae768a89d056b37d5b21285cf7af47224710c29e152586d4add1f7eaadf7e7db4ef39cca473174c11098787a93427cd3edff405c08a646ce1dcd143166dbdeb47789dfbbf20431ad3d06a93263e4b0b827a2aab2b0d66a4a768a7e6607aa2e3b0d5de92b0ecff3599fc724736b4d26c805bb2cd2211e507b49b070f8c96dd7264b90d09a8845d5092ba36bbc7897493fe021522e426f20dec6851fc26de9a8b1584682872c2a9da3b0264e913b4a67486ff3c5d09173d926092e842daf456d8871863c5984cbd27d45881cb896bd8b97ca40b23c5081c078283bddf815655dc25b3cc6773dae560ea7f01731ca0a2c60128fb1e676732f99dfefc1839cc70d28f0a0644e97daeec05498640005e87013b9bb06ffbefb514ed2b6b672cccc8fb8d5da27ed4a1af0c9dee23d5f17fed7af0362be5425bcd5b389c9346f89cfdb6b998babc51518e0bde9855a61528325c9346dfd6677307c251676f76a2e6dd76562d055da42e601404872679fa95bf5bb73da32cf1be0ba22e0da3a7ac1469d39192d851e4ae4f04f17487c9bf25d6d1fa6cb4a4678fd0f3cce2a4433c0cb1155116f77c677ca8e415c7f337ae21c35962eac4517afa4ddb951b7b9c3cc7b9736bc4bc8d7eda7ca9b4a15d1b255c668f6eebd9ced2dfa63e914bda8c8dcbb42dffbc68573f91b8d42eafa43d9afda5a03d2e357117506a506c12f3ea6cfd96d7d96c8c03c3b6728c4af6e8c55955cddd86a807d771778aec694663cc633b93ae8d654bbb087d00cbc9fa3ba463853b067c9d4bb59c82e9cf26a99e7306578b84859b6f48a9f1c421f05ae66f9c26433881b56f22fc00a3202ced03db414ba3640987dbb7b91c7d22332eacfcc9fe63a48a78467a7fafcdbd035c4c2f97bedecde028b12d4326041530b1d47f7e46ce75da9ceb9e6f195dc176b6dd251cb93b612975bd583c4f96efb11a01a158cb6142c4f5755bd3a4ebb14f907be9e6838f580c2c0bf121eae5134d401791184d1e21e6a7a735cc524d68d818cfd7211a1f27eb80be275132620e8faa851937567dbd844677a01ddc48b79dd9acc41e569ef7fa66e344e1dfda9da1644d22186816ba5598af7caeba8e762de51acad1e67e728ec5d1f1d4d57910ebaeb8f652b2d95f01a39248b1493d3ee8f11ca31252c629d36e75ed7527ed3f8a2403d7218cca580ee4144d20f335b4206fae50fac05f0323b07bdaa577a60642ccb554f2ac3a1bd5e8a7aa0b292755c86e38a129c4bc09c19b9d9c4b27984d0f71c10913d037859eb7c61085bd65378f46b933a205561ca2a229f7f309eb29c8f206ff4e847e6491151b0e32f106ae2a17f5d8535c9067f398144f415350d51b214af8a5f25f031b4418db61862713cb02886a53005b505e3bc9af9f1e3888367c77b622c7fe271e863dfe8cf8a91af6524282f80b1fd2db498697db42026348e6930e43ed50093bc200ade00dc62e1dcd9cd3aa780c139d43081188f0f1e8417f53c711ff71686d1c9dc114ba4677fb89ac2270c2649eba1117628f5441e91b25b223a4fb9f5888f957400c8bcb075f407851d466d67dc9598bbd439d08dc223f5c97b0eb3f50e671cca2c4dd2236383accbc9ae465d95cc7e70af9b8c52d3aea366be481409fd9ce7e96fab1e7dfefbbbcca6c6c17a07891ff49bcd113b7067f220196ee12f3ac516b056787926fab8d0660530166194d903eff6905eba8ec61bc2ba1df29fa515cee158fd0a869d8e778372527bccb6261f333feea21d7c98d7cb6c5f55af8546d20faa034fa3e8f09fd5cece303d4d144bd8b349dc20e778ecb9ac2485dd68a0d2cf837a40faa31f474c9f61d4b75ce1ca45ea5177b37bcba4431f32601db85153a22840cfa432fb7679f15d67687160bfb91dda7518d5267ea3317796c66e726b0a8656301efd746367998c2a6ade49a60233f7f340f75e95d67a42f0d95a0ed8460c0d0c62c0d53d4f4d27257ff0fd96aa7b33ce812bd3cc4f1a4733c233277c03440ff08c083dc84a3707a5c53ce2cb268821b3c0b6eefe37450fe22d17a7ee7100c87729a58532e9618b916e0941ce7e112be037df8edcef32882e6a1b38cdf97250cd123b6a6403460499715f2b38d9955d1bdb717d5ad9d9c40b3b97cf3cd1f74319103a50776685753410a1f266c86dcf97205e92d3abaa34ac68f56759f9648919825d3804d17ce992c771cf40117d6e210308cb4ddacda4184e1bf07d4f0597e19cb78cfdf2c562a852c308f35cd4c41899ad0ebca7a48b192c5fa999627baaa258ac169811dc111624cb5afd1c36779227899e318bc36a3a9daaf13892b87b31cce7f97da8a810770b44935e447bb4349abc754a125d74576208cd654d3ef2751583d1bdfffcf3ed664cbf38f56e4443479caa45f379e3e6ca6961bfc9344053d18b46af5ff536bcffb1c828321f2b51d7a3a9117b474f7517ed7f0d624e0a252d23f887c312f9a507092b8f1e5f4bf9396396debb8e57c02eb46fcd98c7e04acc7140fdf0723fe1512f5284361b177bbb88b5cb2e300086f8b39eb1ff027bd6a47bba0e82230592d0ee7f8d65d069bead51fb1dc0ae9c70be40f18ed9aea74765a39969bf68c2ef2b017fa4d1554c989c304123ba8e7133729aae8b1afad184187df12db0f40102fdf2c5d293676f9901127af937505d9530e6df48ff57657054c44856681389bf7bc77cff820dc60d945bd6c014c58cc83d7b87bb32c724123ad4674475fa3c092e33de2a2b8881a0f2ce3e039803e298d5cc98c5411b223ac3f807395681dd2b71a093f358ed0ec383513b34a76349e38fb47207296e28d38b65f06992e3a61bff21f4a832ce9cde48e90163b2fddcdce11f47fa882ce50994df57bb55f39ffe043988c5d184decf90c55d88c18b42b72ad6f3d333df36d90d16db670d95f6b66c1a97bb05a6092e4357683013cd5d12fe886c09695766342ece192c2abb77848cac9bca967d191d045a4a997cf63f169c191cd44df50b9c4519fd2f4d8751e642d069e951ef93c7d17f43d575f093b236a8269f2495067f129ded1d33941121818d835c5eabb64144d6fc24f1921fba22edb16bba2f895c4e1e6bbee1cc5d3b0e6f57342a3aee97640c799cc6252633e31ad70159e598c45f533a5ffaebb17582a1e45f11b0efe72eea86dd17324e255482dab9e8f9b5e4608c6f1da35e75bcc6a1db2731d38e8ec1731c38f5258fe4022b1db4ab7f96b577fe8836ecfaa61e3b354756b72f3f8a4e6c5c357b00fa847245590ba64801563087199a2ba5ab3af8c8327d89c8b4c7c1a04a2c79cd00a1bf906eb2b21feb99d15cfff93795ef05a45045db24ad76b298bdf7a3715a8b7a35deb6aee355b83c72e93f0695d208db18d89c557a63f8313ea5fe27efca556bf7c5e17c410bc7d2004d1f4a0b3dab9846637bc9b860b26e4e318b20e057b02b44f211efba64b67ae6e959e5fd12a3d2a647ceac2057be925f8cc312d304b29c4f2f8c70b95d812cfd698770ccc1eb29a6e0bff0ec4a93fc4b3ade3449a63edbb28222fc3dac0ea6c02656afe8df1cb2044654990c453353354c7fde4b60db6afbad20010dab6d493ce52e30cdaa3532e0048f050931a2f7dc1480ee50da4a4e702cb0258a8d05ff67b46515e10701c36f048944e50f92bac8391074f519001c5adc7d17b3b1cf9ad88dbe7635342b78dbc4fd4a5e014f40cabf2f040fb0d59908b9b3531aa0172e3abd8b5dd8e0394fd14b8a391e9426e9e85f4a03c854314f065e50c149a18dbd13aed7b4777959d3f56f7189a2b84039198e5982c29547e4e76dcc56bc607512cee02094cf4c982ed9c154ea1b5e6cbb7ed43ca83105cdb69997dc0c3bc67effd73cf2fffe3d56fd1f78b77aa82d6c5285a0f41902516db2d24fb1fd890c7ad8aa31070bf8d32f7a2cf444641b88665bee752736e8084d84f8cf4b2d795e6820d2ec77e764dfd81d9393c4b09acebcda22356c5941003cd7b7e9a8fd860a7cbaa6aabcc56610019b2a0ce672993a932b64523134a606f2bd4cd5d4da5c4d11286bfd478711aece4180709fc03ebe63ebff2cdab438b8395717176aa9397e50efff258f9d71f07d3320b1a5cf03508d179168daf15eabee4f71fac1b3fae92b550154b31cb64209b13e60979cd0fe57edb70cf4a13d274d5365727e4f16efda5b8182c3105ff9320ed61781b5746aa0d6a19f49e32c9f002630862c7296a552b68f62293538850506d92ce396ebc591b4730499bce904ffa7a7c5a59d248ae2c30e5099a07d47f68fdcb95b4c8904102b98a5b51b0560f10d8d297310aee58c08ac807b0c169b8c905ea96f1244e0b0ed425611479c8b34dbe710b9ea4a3f3979c65967f47c79a5f74f5ca14f21384f9bb0b52b1f3799ddf03b8a6add9efdba5be9e41e2cd4a9ad59d3c025cf01975fe31cbf876b82e227eff7c76be72bd004941270c95ca37c37fa791815d6ec2689f18cc0d781a4f49ef9ca2d851078014bc475693f9f13dfab9722e9c26a7eb728dbef54d1a1626657251430cd2fa00b7e4232062a7dcf8d0e5763be4d94ad752a483b5e289124f235cadde08ef9c0a37dd018e142fbb8fed4f4e16099c1bdbcd410c9decf8b55e3272e372a94ec3ee9e1de3368937fc36779e4f6d8e895e4fa7a70fe04567d33b44ca96e2bde04482a74663a06d415143025a85797fa1e2a408bd0a38800d42a9172f4a32b85c1659fb7a4624dad4fcb33d99034463037641a60872290c906b73a48c779befeb536b0e8b2d7186a14f8143f225f17f8fa560dc475e7ff6279201363fce993737e6aca461a1cce1657337f0dc5a5cde934d2e29285b675606ce40ce28ef555435792403fe3bed4e5155082c5a9981b2c9e953ec35534e93eaec0537741e3b05c2a140d7a9629c88ac1356edec908b863f1499b28efcc0d0a258dc1322f6d3e38a549706fdd77e5b6b97f5100b9ce5af252657a493c9b57187edb03df30a5d3d9310d0dc76bf0226f93b0eeb7ce7a49a1fcac49d56129e7f8b6b83b04a7ee1ec2f3056a21fd73868bba47c6c0ee4c960765fddd18fafc018b47f57221183dd4f2a692446d3f9f2c22d3371c82028dba796402c198b74985464f544ba1453feb483be61ee52f58ca96c02722c1f9ca1cd57b8088033513103200dfa1f78956545238e4aa569634379feaa63f1503ba18f695937b2b547580718cd285ef85a003298b787a528ee2c994af3f36485343f62fdd515e290c8970c1714072c6240a5aff0e1188c47463c90918bc133653f3f122b7e77d4e7f2bba510183b2e26bc6c237e25edbde606e41736bcf0dd62e629625e7e7c9d1cc6d4f5eff2bf5207219b069de6a26fcd01d86400bdf60f5b5e19d2c4396b0ad183b45f6cb8aa6a170c2780f830bf19a24ceb4bd190be9c6cf9b6e330b380f0c4c1effae3ad55785cc53f87b75486ebb7c856dc02753a825e97460c44ec27ccbc0d1cec0b00cb2af515df6286f873d69ce320cc992f63fdd58e3118c0c995d8cd2dae806a94ba1aede15b5dd4749a8eba851b6c581250519b167507170697135b8fa06aed13d31f878ec1730c41938e5e11ef0fa49b5b130d7e1e01d753b41768132dc6fde638f5e71fcf45cefd0894703a4279d44e80f508b89c207211e440e5303f972c97d30127ebed7c9a2811fc6dee7439812db7ff2853ca5554cbf018d6337ae82b1a842175c6939fcf4b8b14639c01db03f9667f29c312864e96c17e7000ecd346524711a25ee97139da89d0d3f6fd4a3be1bcabdee02de484df6aa1f0ed1201a2acf5405333ec142c3ecf707617d30e8c34e3b6946fe1f45beb0ea289514fcc89a7a39e57d23b2b558a6e2f6231556c25334fc25823ba38f5a4e11364687a026ad4aed5cadf7cdbf8583881364f15a021d7d7e860273313b22ffb0d39362d34be20873838aef0ca832fac82cd6ca912572002e1249c14be2fe9137194c9947bed14c32526335a32a6469b6e61c6637cbe179042e0eb91cc9e4d07fad9f2a4b86d02f411b542203fdaf6fd91aaa17540dd3eafaf13036816ee2a2aa8796fdb664ca0bfafefa7ae6889897237c3433c995268a705379a561daad829c7d305fc4696ed9de9fc03a93ec05bfa449e649410efd63882211c88a0179266301853304248b74f8582f0e731f5a259413c4a42d26021be3e6aa784c2fe874f95a5f04299e62a4f2c5153f11c7974811a73949aa477cbdc768d1150a2f11262edb456fb822d75cc4628e941c3ed6969207afa79978e860f25848314e0b5a4f6588246fc571cce73d88cdc946bb466861de7c1081303153c93b3c605664b767ab0b3dcda7edee1650b053130d9d694908574da5f04ae147754947c1f68e13bd009c1d6ae573068474fcf477c4d37403e81a07ee01023dc87a8f022f1398f15d344a13d80b365fa90df7547315f1e428ea15b0887eb55f202480c952bedfc431512e127d435dae6d30bf98e7493afc85dbd5448b2e5f2e557666e2cad428df534f18b14063a54bb5e706643c261cfd7dc6bc8d01d4fbc661ffd460ebbb0982a5974ccb61b67b91b7fdcbf68bce82a829acc2a3da402a7641e42daad2973a37edde789edd628986bbafc49403e72a6ccf89bc11fc9ea5f913773b26a92c5de21cf48d116e11de273f91251487ce58891a369d6df044b78ac7601bb9fc4c3d871baf0c4d4056f6732a0975880979f1d6afb659a7343fe43b4b1e9a7def4d407e4849f07902a81b89552197a3d35e8975673dfb2627e791393b4004bee6f8a38d0b6dde5bd5e8d2cac11d3a4bdb98e18f1a931854e57ae5ec112f68ed82092472f4fd7af8ce53bfce4163892b80c21da9010bbb5edb25779a616d9aac155436efe26af18aa731bd470cd074a34a571bf9bd547a8a47250f3ad1b609605036a5ba63bc72b332995e13894068ff5c302e7255b37b305bb6366e339f95bcdf7e8fe46bf30ccc7efaef8f8345e1f08d669261cab61812adf3d79f41cb1d9058db8b1d20361d73e836ebdeb24ef48c53358e5da91b1618a22e730323b360b71e12e037e12c6f64587577862229d6d1f38ef7094089b099dc86627366b941279f2f87bf97f7737a7925432dc33fb340874a0d34614fa2d573b38c8e439bcc62af4c280d49d4a90eddfaa671d03f4c909c687591c0aff9a05e5c7c33e446ee09da5387943da9d0a944e1a22069f3c6d918e6155074e0f179a0f4871151adcd05df0c0193b610cd12bf28c49951f6fdbfc44d255424dcec5b75856290797865884bdfde55b4ceb051caddf0b45dbb0383ca309a1d9cac7deca2df31d691770d4298ec419563aff2821bfdea9df93b7523789e08eb1b4ff511bdd5c25ecd15991c3cf8b6440de9a2127ee7305b579affccaba59c381af2fe75360e5b759533a87138e7908a2bbf4707284e4ccdaabf31f6cd11f5c7910dec2db98f6d46c86cc410552ad736d060ff94a45ad9cd63aec5c5d33ca39d5f721e950ee5f76c92bb43bed2ee6fea0d2e6ce27930f9777d60164737bbc33ecaa11ffc434ee26f42c67c5e8194b3e112af3fcc9bb0d2d041ac3da4eee402f6b4037b0c97330287416326dba1e307b415af4a8de9c333222610192ddc53ecb0018da7560455c66d0db9b03de39b41c8d92627b47b69ef604d549cbb0e458dfd8d4c5ca3f163ba19cf5799a12093f0890e6dd8944f1c8811d5cb4aeb460caf886a8cfce229a73e9f16500c43498c1568ca4acace02cffc1621261cdafa0a33618657d42001b0bd2c46a26a1b3ec772099584c59069199ca08217af9a23255bafcdc877777c43e7b5814daf5c65b96b59b427400fa6a589fd68d51133a9f8ae3c6ff00a74f670b4371ae70028d5f2504f35bc6c5b771050670927be2c7ff55a8650a088d9f58ce8d3e76bfad347ebd46b3bb9e3269914ad6e971f297d48f077933150045020eb3ed154bd4f8b84039f0dce2945095d895b191cffcb4e30a09d51c62b7f934cc962bab6177479efdeed81728331e02bbfa8ad5cabde14be5b7c4397fb0fad4d4f4fbbffa7c0512f53d9cb9cd311c329c7b493f5d360cd5e33668bcfc30ecdb9a74883a097eed2a658623cefe4761e92ec6a5c33a76d1d2f1128104b5a398d5b853f12ad2324abe52e60b95a95118a5503891dd02caf9420af3a3ef2d00f3662e77aee9d76a69de1322e0f3481732a56c964bdaff032f8493fab321c32 Params = SHA2-512_W16_H16 Msg = 9c3792b7dbe44815abb6853ca4a6ff3f8645a18c18feabbf287360e8705e133450c30b648b810e04c781ba47aff2a6466fa1 PublicKey = 0500000548534fdaef9a69681a9f5d66113c2edad09fea503494a0c1283da33d4a026bf0eff8844cf9c9db1165d4311456efaea753a25a806c59bdf2967b0b9dbe1b365b97225867edee40937297b7113ffbd6d2ebbc1fcd7c73c4470f9c953228034be7f4e458548d986876e0ca4ae8ca623e0304693112ed87e532f50c53766d7ec744 Signature = 0000000000000000a81db3d579d02e7ea70da829633d06b8b519e8c31f350b40e40d0f8b3ada979ccfad677a50f37190b1aef7feee2edf9e1573eae272a6fccc5ce5cdf5849f36b65b7714119fa64020735d6999144681c53d8c4c46350d4e2ac13b6b452ea0c71dbf87dd078381808dcc284579bfa2f61189a98f1cf0dacb43b1809e29ff477052484790f86bd83ea13078e427a4b3bc1912d80d6527f477dcd03eb2e746279548c3e77e14e809be17e53989d13d447f39c35429610ab4abd0d7124e86f3ec2d8f254516e1d428a8379ab521425f6cced7dd1eb8a5f9787300e3db7ee3a4853d8bb6d0f157e23bf1b196009f1f823d51c8a7f07057a0eb5a5b2cc0009e4bc347657a0e68eb5d5f1629771ceb38c546f1647dc2c5ffbb5b5fe8db0d792b70dc66eff8e7e9dd41cd8eb58a1f379e80f8b4e4a2dfc97d42596a8aab3b62f3e22249fbb2a1c96e04ea8fd4e8c6dda9ca17d4cdaff1f34490699b2431f68699ccf5ac167cfc539b282314defd314c8ab1ad5ea31a24562dd9dc24c1e8ac4a281a8e81cbf0080be054f79e486e69785dc93f6396add11fcd9625a92d486b5a489b456ba365b7ec9ba9cc2ecbd855b10a2e1c4c9ad8dcd92fa443ce19215134261c803b314a5756f999204bef434445d705717848e7ddb15022894d11a8b981feaaae53a5bb63f34aa2c687d7d1555ff18cdef42db12f511b9e6dbdf1e68114284d0cebe9abbb649ea4a44a54613b4b4505c72e48845bf9c2f0fd29bd000fb76324206593e30e0c9c799e1964a0eeda1c85331e4dac28e8fa757f0de53c03ff95d5c9a241e9fb600ffbb4be5b01ead9deec3ed202a4ee37cc3b5fda3246aeab9aef3cefb33b1cc09203d5843eeb26fbe101fede80196d702b3be44c1ded67a36974c4d29f3b7972fde29fc9647b40862bb0ce044b919949fc6b7d764c148919fad3981c82e553fdfd4515cbd5d79f1f2e84d1334b6d5a3aab292e7c61ab53f780e50e16e76e94dd754d6a9061a0d1bfd5b1bd0c3cbd48e4b364a240012e2b41f06726d06fdd0feae26fe99a9034461aae912f86c5ef619687ba664c649d1eb2d00d566a41c1ea957bce9f30f271d226f3ae274c5c74f7d6f5b180a6815d5243adaa4c8d70470a113b05ff884705bb08ffef9aa198330115a7aeeb7d4f4fc33aa41727b373451ce64c96be94a18147d24db2c6a886508dbd057ee3db4b0e701747bf9c3cdc29e753866cb4bae2507c4a1d04fde262bce2df457f6c3c143b3c309d27cc801372a3d91caa5ea66f1b3880006f3117e5ac949a0002d0787bcdd8b645988bfb7a091d29b5e14a5f94131c4440bca740bbde347591ff608e47907cc3abb5298df5870d040bb7fb25cb4717ab70bab920f61b796f664f727983cb607981021ff8dd413b4c05d61fbb007b04fb11ec15224e08e7ba68f503165654cdbcff73a237979104c76e23a7cc4319aa3bca89a85dfac92f1391a0ae88194078322e304ea63cbd23e47f587cf2b6d14aec8556d2132e495679f507c0e509a2664778529c90df15ff64dfa9066e5b35f6a56b121536cee38fe79689a4e0ef6c800453446240041ec9ff0c80ab6645116fa56bc2d83ce4a673534341f1382d9ba183e261f6fbede51e80064b9b572f74a8a3b1924334a2a42b96854bd7b369849791199643f4c932bc2f6c6c66761ff8b16d4a97d98d25ab0bf52a65fb9ff78cc5d5717565f7017615bf31c5ae0b392dac5d77ec8f00ec9167344d544386c502a108952f7e4a5558ff90086c93546ca8ac47a59e8381921f926244a4475add05aad6c9cbc591c08568e3bf29433be12e5db7a2d21bc2695726c3284622ca6f9f31d4630720df84922f65d348c347f572966f33a07956aa99f3ce911797f1a72410bbf1a054e26b41d12fcdb654d6a4cc44176b95a6612fd6151207824cd911087dc33e4d36083a1749ab80f54a3a4be53f99f6662ca08b9e8b990e96d68f6d5c34684c7a0ecbd6bc3950014cfba21f4341c90f2dd92e7b3cc91b49d106d79a7011c05f954a842898c7ee8093c30254a158072853b4114f2f29f729260dcb2c95624df372f20128d28bb6db616242fcf47f4af6619c97f473965eccce9ecad12835d02119b6342277cce576313898ab0926926eb5ce333235be327d8c32b2dad1367f0ca6d8b7b888a28904dcac29752114c6976d8b795b5e7f63a45cfef5a4a74ef0a05bda6eca580f53090e9da1a22a6f8f735e1aa7a110df386e84ab19e6535a3c88ac08cc2180ab2db818fafa5f8923af4ea7810819dda855548b38919afb4cc485be356c19c2f52f8c3100abcdc5eed21280eee97972116c2d5bbaa0b28fc8bc29332a16a162116478a2330adf569041529d4259fbd16b822bf0fe7a88136c6bf7ec42b97961bb5b3ec7913c2b5f0a7dc3b3d48c634f71d523a0423cc0fb9b5ed97bbc87bb0bd575efb6376d34a04656f6616dcd27473b2fca02e953cab112cf03778ee55b17ad7ac011357db62ecb1e8d984569daf6f8ec6f0169c85f91fd4f1d8043e087caef768008db76f3fa7bf71a77eda2d59b5bdb126cc2f7b493d3472d16771699513abcb67cb409bb4e55cbc91798129e67cfca8e8753964e06bd401cc84332f6b4a2f4a11e9b0b69c740c693da4f57d3dd01de5fbd7c8531ba92e6db6ac3756b8141ac7c4d6c2a7a56962d73a4cd2c2a99d32eb8b686e855e4a6bb81a9475f50c92e20521a8476d16c6e541e1e20c9434bc5c30917e6c38b46ab70688248c840bd21557b0b9021c0484be233990664a488a8c83f5974616eefa4b8e5dffd1bdc1e52877bc64be764533889087f45bed5b1b3af61d688ef19e7edbeb06d06b62fbfe8ed8288174eb6471b8e14b255d4229a0d38977fc29e8bd7bfac0c50d67413caca61848fb66051d4d1542a840be31f13e7b94ba2835018f3235a4c5330bca7acf33d001f1c1790c6f7e17235566ed1cbe4fa443e97afed8f45579414753ef9936ccddedfb8104cfb01a215c505470d08bf7c51923430a86d205ce7dfd7168eebac14e06770eaf3d3ca0467199b49dc6b3d44b948053aa41e76fafba5990184bd79954f377f15c03dc723aeb096bf01b52ded9b55cb906bbe5460a3f215f1c82d6794529f6f989c43cb8ac784755307f06be57ef40a5a0909cde8052a696bc82d49ec1fa23b294a2adb2ee089b8f05f9815345baaf5416fdcc92de0e872ddde805d3d1c372a0be080ee1207df3af44c300cff6747f3278e6e7152afba8f8a384410518abf49a02acd5e75413cf1541cb2d2f994165cf0ce1e5711fa68820fd20ce2135c73f078891fe247cdbe1fceb027157052d810e8fdbced090c2a872092279ceb51bca1858382029e24a79b5ceb6f600d56e20fb8bb6a5345b05af81cdbc3ccadb0a0288887959e27b76ea9d6540fa239e9ee6639d69bce1d1c24e2eaec854c5c6f88550900853b8a20ba320b20ce2a4e52d6c06f5a5304009292d1271920a002e8f155c25faad942f946e73233467a57209006b85de0d999f3d1a2f5368cf8ab2aa2495fd84a5f15feea730e83d6a02088663a40dfcb42a778182a987198a82aa8bb4a6e567a6c4f518a548f09a0b7b88892b8a532d7606cd99469266954d829c9cc6229301e7fe29df8279c80a3849949171a9f7cd6bf16b0732167f7e50e16487dccabb6a840c9301f5b8494eced792ead419d8518129f2891cf82dc3670a223e6a852c23ca3b5d59de31dbd02c41144b55ed6dd3da83126160c70991c1ce1907b749d52c1f54e47e058820e0256b0d764b9d8ce7eb0822258916fe6673734873027069e88a1b1a381152b98104e247cfd6d0f53c93ced76b09c0fc90a302b70597c69dd7deb44c6fab0cb0f86d4f133be09ee9aa7700c59f356071aa537e2b4dd1f8629ce859daa6de7e3a526c32f13ffe1932342673ec46651afe0860b5a862fae0ad07f8ddafb575a08d8dc22cfa7dc02b4a39b5acfb567b14410f65f546295f7438571989d570dd2d74c4399834b383073c087d549ff7ed20748e6205caa5ac109ffdaf9d796234bb2e432142c2a4034ae3b2e23ca31589c69c2140315b2acf4cdc4c039b74f4950585c095e5c116fd977c3734b018aed0934660d5ba77ecf004779e98b8ee6d08afcdff2730fa29b916d76f56a8f1b1a7b5594ba9a596566e131e322db66a86794c7c50b852ab998de87101aa898e872778d1e89cef914254f34cef71a8a4d040c9c4fc59ebafb5893769307352cfd3290d33f88a0259ce7b13d419bd9024a4973d200918eb3d797e36296a7c8f090efba5b0bc091f42e4c8322cdc4686206bcd5097300b0c8be1c669e36aa4ab471673245e97d4dd7cf1832d97bc50aa0c95b2a70337e5d5352c125ff6a93f23c49e30dad607ecd09d385f02281f8096866bee091d6854cc9baae88b3850e89cdb4b7ac31d2e34b9b94a1ea4ef522eb4fca616a6d0e405ec66d805d47a2dba451e0445336597c5e9c401357240cfbbc52419af02de1b466bc11f54f06cdc8a188e396de2822d81b1fe0d8d5863460076f897783e22595c77af21f4d92d887a06f8b8bdcc4637d883164eb9861bda4fd029a6d62281bed64cbba0ec888f4208a8165f0926b111ccb19328eb77e130e5f121c19192e9bf30fcb5b0fe6fdd5fc9a2444681ccbbc7ef90a764a2162ecd04a40f19c996bbccd775fe22e18753b84f7ad0210c666e259dacf0913a84e40b576b6963a920e1011f7bf112112d9e8f8b45aa7d1c4b0bf783c2bec8b0a046a2ee210b83971a5064ffcd3069c68b6ffb9cc1af1602272bf78c8b0d9439da4adaff62c2bfe98aa824866892e18ec8714b90740ff656b737754b3a17de7a4977ecde040b6a09d5814bd118b2fa41ad59cc42ba91239724883d2f4f11f987a567a0f06c3768a1f40cc63af089b8f2875bc51c9f8a9f51459ef1256fb04e99de4496f310935538ed5d71c2f57fd7942f5acf02c8a46e2d7f9a3a9634c978747af34dddf5d55b14bdece796e142c36d9e018c3b6bcb246ecd6a213a200dbf8e20f677e4eadc15d52f3efa7d71a524216c2721d36f869842e616d4cfdc941c9c35215d43587fa9a4e2de1d492152a846b4eae7048e582d9c1483a00ed05a3d760b212112b9a43d7e865db13d9deb7fd21f44f8410e8dae31b92dea76e35e46cf9f4d60cbe3394ef5b8cff9ab999c22ca5790acc85a73d2527ee1280e280b4ad1872a0c96daed19fcd34a2ca811439767633377248dd864d6d4f15978c1a80c064653475c3d963a0a9289463a53614b4cf1adfe11809ea7a86e3eb75707de21415d8243cd8278bd01677537c06823751543719d679b6de3c4c1ad4cfe90bafc64ed98037e4ed4e049aa24c9a79a076078d8ccbfb68355b1e09474c39ea131a494471158dafa481305a173aae647b44caac8557a5eceaa1d1b615e9c8d85f7944e3ef43acda5db385ad96130f36e5866aa34851c3661d968d7eb081bcb6d8a49ddb440aae3bb5df2348a6becb536f57b0c6f443efc14f5d532781a2c4c3593b67860e0f5fb502ca98669dd7f2c587e1b224a89b36be1d3e4484bcab0848c18da4ee0d3acb1dfc260c5e0aa4891ac420a102bbdcd8ff1fc7c870b5dadb3e5ad574559f98c762ccd84667f3f98e3479eb179fd55073ceeb240a1651e8aedc862f3221319f89a60825b0bee85e24cf7c3f70bbf30e9c11318a506d77f66c5af89c45ff79a8305b5375ca1470c5c8facb0d8a94d063ab9aa51f90bf7c05e73a95ec4ab22ba7b8079e95e8b264bd7808cf4a3d5d19c606f57976b2430df6bcc1356ec474a9622059a27b71401b40bea00a0432177fa4a475fcff466e7b32159b8020181fcec752dff4edcab8975ca02df5b19cd5be284c6faff49c083ceea2080966f8fd726443217a77c61994f5a2d0d00d0a36b84c1ebe3e8361dc4383fc9b7369fc6ecbb9bd493194e2080e3158489e26364540774eb27bf76ba947939ade728a2bf41978b620b404d23cfe617e68834d248dda64656e9831fc69662248fe4ac45a7795735599c947f64220c901d08ba910a819388051990abf9170d8bae9e466ca21002249436d0e99cc3630c67fc66b22f4334a0c9af37b1754266c41f980b645af08bdb0534a4a5b44babe0214599ccfa19e60a45274cf77ae2555e4788f844189edd7a1286102980478be4dbece968ec8820dc5e65822ee0be8133eb385fba4b13b0f000d5540ad494ad909deba698b57a3a06774289ab606126b894a3eb734ca951db52fecfc60c8c77b675462024c4fc9e477bfaf655c0ea0b3054708992874af01928fdff60355f4d68c398e2f5ddeaa1e31a30c71a6d4d994ebe35bd3ada54cd054572a9bffa393db3f5361693ce086000f5aec47143b5fc71e07b57c8b9eabc0e553a81ad4f3434d43e581dfd3d2f97770064050ca2405c8b228b3875a873f1e0023e710e877646dbec955b662d9f773c83291395e02c63e7f95a3182b2f79ca1de64690b559ef42e89dbaca1c3f496c89e50ecdd6d8713e3a334a396afeb32b93b77607cc785cc4e073afcf9298763c7fbd39742c0352f95442fef723a19370b9a6d95770b236bfe0601efd1abfc294dcadb5c426ff243d4d87f4fe0d63e9974b5cb7db16bfa0648dcfa40db08a8c9b5a977e77d42d8e92f8ddcfd737854c3eac3bf2130cfcc55a11c66c4c88b66531dbda65f9eb43e7601c5ed5b436d319843c1082e094ba32dacbbae0bf389ce6a0227b7241900c93d172c45a162f4ce04c33c6cbc66f327e839b75afce0bb6a551edb14a36c7836ed8fa7e53c4a4be420104d3dda680e8052ca0135fb49fbaf3769ab0a98f35ece987fdedbed44d5079f67dc417102787edec3d3409a1af8afdade0742ce44a0e16e545abd5a4bc7a243faadc4ddfaf0160402023be5b70943cc3d6bf3e8d90225bcc38d404e7f7ebe13233ddf596f99b3a6bef2a1e4ff992b79b3f8d40a70f81f9895f90dc0d4ada740339bbf4b1161594fd84a4242e527ee1f5cb1eb2ae4625d25716d843fd2d43ac037c977ef02e13603cc0525e3a9fef6c8918b656c712a0c15e1c85632cf82cbc62bb8fc1289c52d5d9bbedeae976c5c94f473d4c0c2f8069e59faf28144a7dbc2762814a8b743f29f4f9548bfa1072c85f6c6d20c4c7624ca3d44a8a244c4b31c239ba8316b79f14617224d8820d9e399734277d6af11bb8eb8a720802a34a7a8bf1e63d4f1b738c40081101ede33595797f8f85b29c61b6de3920cdae6c29d61e6b1c76d99cc957f6f83bc71583bab6e512278427e843e2676cdd7969310ae2e5470c296adba20cbda05e2fb8d66431f67a6530172541fcecc3912d37a24c72d107edcf56160968d843cbbb9708359a651e80cea4f08d5be9967fe2ba5474c45cb9733f89da671f35e7499d25929462c3259c03ade5a7e721f604eaa9b6724391df5f78c196014229750061415290324a2e74d228a45c54c3c7b1d58130473c00677305ed8157dc58488e4949ef1886f0c8b0d5b6f66a60c6c630e7dc6aadd837d7ab4b358dc98b1af8175e1d58d585b935214c827f6481896fae4a664cbd2a983ab519c873904cc7665d5a2dd06e1f683f487397dd2373646181d934d7a8e58615d2ecad395aa9963f1efe28d3b36433a8f2eaf421b41ed2c01c67ef9af9ecb7424cec77cbb77665a7d5094d991cfed3eaade828c6306532819cb95e5ecdfb09a811f034c5f5aabf60843478d1d4cf2e65f1c795117d3b82c909f8879e3b2a59a735ec92c3597d944c1bf7085663fa6cbfc65b85e5b4ddcc7eac3305e43b5e4114f0e6a4d3fcd2a90f3c098372f4caffe47942e19a318ab5934d4197920117c98607ac44ff649d9ddf1820a5acc785ca8d464272deea06139f901661fa26ca05dbf7b6e02af4c006eeb54343981cf577b8b07b361d4a1fb24f427eabd7f75027e8d2a29b9b7ed09f9ec9a365cc6803d46f41dd7fe04268a9f01414da085599acf79087b553c6f5376c0586ccf952c8ecd8f2ee1a87cfbd8b16d8f50b7171986a717ce3affbd1400770d638cbd939eefb865799539a22d83df754380815fdcf1719877d0d5d1ae6a60c07a9a79724d3128d160da19a642e1463d3445c1c753eca33496f1737d72c897e8d9a969f081b85af4b01f761a325d50fc4b9fb12be0bda8ee8501c764c1444630fb7bc4ff8468ef9186fa84dc523b8df869acd4ab1e161da772c580c4c5aea8ba2e3c7d1662ffbbadce700682e0ec923c04bdbb9f9b3dd4238a673c94897240b77cba013e8c1f7fc8b54883cedd90c57ff1c3c37018b190f37539f344e2480dc4bf5c2095e78034266003dddc0d68a6496e867ffc1e282aea39dec5658e56220098b908fc9b26a843a7830807d110674a28ccf42af52101a4479b9ac985e2ff51c68ee688d2a0cacb74300e9d096243fd592f3c75043f18ac83e73c69e28434b147e67fe133019b6e61bac00773d2fd7343fb37654db16743a66a4e710f722cc269e51a9fa9c485612688ede36282c769f5851077c49902e5201cf27a96dec325a850261d84421ae30544163dffef655d2f176b7e27df684ec63136a94896d0254c65c83b2138c603ead8b91311e1cc8302d2545fab9be8f9daee593a9269c834dfb5d3d0a25221b42dc88026c9d945fb0dabe5847a9d5863362ddadc8d37247cab3eb5df002ae7d4dc8c9538294dffbeba83712be0453621e3d29b1f5dd639ec0b084e5d4913045f769f8c8f63bef18cc32ceb3aa4f89416c179c211410322e77baa098a2b9e65ce3b919ed7a1e0a4fae8ad912282277bf0b7814f6d0b96af437496c32c1ce4793f44ddcdb5066cc69abf469a59736dd13c519d909a316377e2a277d231aa782f6202a96164508190182bae2f8ffbdf8fc52b38ecc5621567fe41e112992ef1bc589d928b2b04e4a25d30f90426ea4a06cbbb520969ccff7db7ab65a82fee7a2d73f15ad9ba601ef2aaddde07a0d356828fd8628e0226b65c1543c35997922ee7b040402621423563edc35a7655fa15f5a19510b1c00c487d40cc8599b2bd2357def4188321d5f35eca0e37aa607066bcde252197e7b43f7c81b2c503a0a65f6dbb3e5552539ff5eb7350b79a224a61095e714c3663b859c1de079a9e364676b82417d191e179022e0e0461feec3eded5de0d099752aff176bb8aab5106bdb37b229e9161f0e5fb333a9ff3e929ef4ac4a8f5e7fc21559b62db9c2d695f45e12db7517715cb0b45c039b573214b802e8922f2d7b167339da1b227386b4ddd4405956139927752bb03142c62870e9e88d1581f68c05d2defe2472067849e6c05e26b456ef5d1733a2cdbc6eabf96645dd185d4c86883138421045f656e1f96b687e9d8fa08c31eb3bd6ebd0ae315ad7d5af30486de49465b0c7808730f723fa5aabc69a02896ec93e9991c8b0791d146a3c6c2afe76246ce53968001f107538253f96a2f9264d3018461fe4023ad2338b54d94cf2fdbc929220ca4d07aafa470bdaca1d0e3eda22a769977f92591a252c9bd6dadb1626e4e0a3c06e11bded0efdb8d1a91d15e85a0444b3ccaa9e634682d915d195221750b40365fd16a3a20fb59b377dd0bf84bed889a3fe04a1fcf2b280a1d1de7ca60b09219dd2f727bb4758657ddf1aeea4bbc224a002de8a3fbc96613c77c3d6618033679236ff7025e6e8c30aeaee9c653b7569541997823ed77e4b3554c6b09c4156d7e148292b5f0dffe7311f64dd6a0bd7f7b9e12bf147abe80198b65b642a4d0a73881fe94868adf80bbe0ab202462c211d7060341533807158bf4be27ddb0c6de4412291abe05bbe386192c176a8e0f6ebaaafb754b34ae61b4091f8259b0b3463b57bebfa0f30612cf5f87ea2459997ec4530435f85071ff8df34bfd4e35902d72bb07eaf877dd01f8d87d09a5311c42fa58f1fa78cd8923f6c16cb4d1cc9b7148e7349971f502b56ded92721efdba2333720133bc55efdfa8c65195f5273387cd211deb209bf95e15a0364de578e210b29710cac1bec9b0d9dbac27c348575c7dc46d62396a01d8a359f3a1283f235bbc1ab50e5a3fc811045b69c4d553272ac4f4c380d1172026eba0ff93a41f41a49353e6da0becf5f5eb6fb4d4973c75ea8e9798b6b8b219ac2a16ec33547ade945651b61529f3dfc7c8a2355349b97d3154563597df4b5a0f23c41be2d744368c1a44da11ee3723f3dbff81fddcc3b3598db2777594c49e4a706baac715eb7fdbc0540951b0e2a0c424f2d6ad3b530a6067adf6a0b460734f4c2f8ce49e7d2a4267521499bb796527f575c13e35bf014af5c34ea8b4e8eb7124af2bc4c4fe24fa1810e38415d92a96c027ba0e95a8a9d38ca934c26c92f7f5ae6e88f8d5d428da49dbb3b880062b0b3401ea8e12cf16293a5300c4ae724dd61ada9e3c85e9295fce3cba23826966696bacc452eef907123bc6e425d2d84a3b67986e9bffcfc1046971a2c7a9980526e5a6dbb74a287e7b30af6c2c47c19c797dbde95c93ae42a39f79e065cf12d4baa222b0f6a9f463529b555fa04db85e321d641f35a7474a36944068b5fec7cb5de9383a4b2ba91c4471f3d30d08da0b58351ce602a3af717ef04851e5c1d387f4d85c503fe37afcaba5c85fcad2d2339efa4c4be1c492f0fc24fa87dd84c72bd6be21aab181dc4894ae4efa10c5a0ee0846b3a64f8cf37894f92bead6146a9af17417e92c3942bf2a8200b2542a3923785dec68cb56e807f437b4fe235edfc5a3ec0f5cfa1816665345b68efaecd113292c8c338f04914cff0d57cde578d490a188290398a42a4ebbca83e00f522134e1ae6c544e2cb362e5dc924bae68ed2aa287d836909baf59a03a05041d3df37ae67d3d4f716956a4ce1958fd265fbd902935865579ec4c4bf3c47a9a2967622e807043da2601b73a8f41c02335d208ed654d064278df787cc617b963984bc896f73664cc5ae1e096c9cfce22b90800f50ff81450202a24402211abceb75935e5c57a4bdec067081f3482b2d1c96f92953c7854f77e2a9bf2d72430d8f0ec4b4fc92c508833604152bcafb08f0f2d1c992655ceee8c56fd1abfad44e6f5d222d14a3683dbb12ea41bc4482b4932b456cbb46f13cc3cc3c5a8d4ba7b5b5df405ce8899ed5643244b87d94b5c169f23cc47d7b8ccbf63a23aa3e8193a83a38753256524f2e57fea09024cc1ca350e7028eac07202e01174a05fd0467b4b11b5c175e63d1a9b568c2222bf369ebe7915144c697af28b4c8efc9daa641947db2b141d6f90909d80f109f8aaac7c2602e74da5a6236e14b65b2d4d28684e57cfe9a512c9bb580012ebc8c2f903ff4e1c8023bcc1db741d431e6fe357e310bd08eccce449315209c866f62450d0862b9cdb6f3d5f50dcef4fae765016509c0a281b2f3539453be33d365a51e12f4f862a221b0ca61721d642c4dac4a2dee2f2e89b0b80ccf1cc040996738097922ed11347400b2cf4720a71e79f051df55dbfd499af949793f86fbfce35b36958a400fc3edb7f9365f5a40543943ea2e07570b03706a02d8313f939909a450d23d86ef29ed8bee439979cf66c9f21684378610ea5acc483af0ad57bf69c0c05f77e897f2d733e099301f1fb7967a99c827f1b184d84b7e10cad835eec04786e3d517442459bb46f5a2b13b0437eeb33d59c9d266bed4dda209baede3a4ebc43be90f59ebf409d6a0b273cda7f6236dacb4d1fb6a26187e0a722bb326e6f46e43494d01c0ee7dc083f048753e39d7f10e889daaffef5b82f86ded803cebaa685f04f03fa0d63af65a18d27f5683a47fc066719014db74dd9773c38071d60b22e7a36610dc85a3d9920b36cc8c2ce80a1c5dc5a128197641d6424e6329ebeb3e504d3d13b57ca9d664fdf337cc6ef4778ab4b7f7f1e35d36cc856a6495e9fd3f7ca924c5302defe7d686a5a290145e16e2ed69ef68af8ae246a44a212f8946916b44c307523ecf5a1b77ba5209983b793ed9c67b9b019bc703661f350407b8f75053837d247f773819b71d79f08aa44c4240b1c5b651e3d0aa013211910ab905bc074571c1baad4d91bb27e3bcb66ae18cffdebd41e7423c6bcb1fea8527b6dcce68d98980e88ec99fee8c15c93b5d40e6a28b613dcc0e909e5f508075f45ce86936683964ce09d11ea5c622861af155e0f135fa7cd02d8e7b60928b9064668e7c5ef82c5584eb2d14c1b136b3432b595831476b0933d88a9555fad85e16140d56d80e43e99110f5b1962df2c4f8d054b210d18ddbab46c6603a35bfaff0cd91fdb944e9e7cf6987f8c610ea0545ef2907596944edf0782a8703b3dee0135fcace7cf1aa95bc85bc681eb17db1ea184755ed0849c1a6501ff11c397c3a4fcb936a8aa3a93c5d0a7c93a547e7f6fefe067a078f9c610fa471efe34d3841757211afdb72fafbdc1ba5ff1e912c8c799a8ddcadf740c69e2f1384a055cece7f399554bd1574966d851b6a9bce4ec87d019217bf7a904b276913cd378a1e9aa9e4989a8d2eaa90d1546b2316705c70c6e60717b7ffa29c1d5468a831458491324ff72abfa1a49f4c7c8b65699212634d9aef0d72ec5d1d68f7efac39fd5a90f1f16e5e065cc9a7516d8e98f5a03b3689ee4dc242bcaea93f68eb6abe484af999e9e71c00b50cda6c9a5c99ef0cb213e62b29c9682c09bd85574c821b35fd0b8026071102eb873d1f5174abdcb51824009ec00d7b3a11c4ec50cf2fef187811c8249ec9a51bcea86526e04d18d53c4f7b76753157c9b397e56be0772e91ef8019b1c27fa32b651f3060de60728901600cf3658d8b1a568fff9497fdd453d212db6af057a2c3ce541c6eb0a3b9eb54f23e3ba2ebdc60b14fd075581718e94078465250e62d08a86e8962969eca5eb60b634629b714db09b4e896112a6bdae09f5abcba13e2bc94f0f919b2f3324cb9e3d8e1cd638bc9951f94eb0ee99fe37b94c0b4eadfeabdbe771d839cd8118e2e02d5619043aca99e00d6be9861e800846ef6f1759ee8790be87570fe5ad8c396ea9285f12885e7c2d6bd77db5ffd63dd23366945198fd5acd244491c139141589cf8e60d9a6e202cdfe05375ef0220a74a7f71162408886e6c630eed0ef549e6b76c10636596ecb48e01c55f409a93f80fec2cfad8fa9c86d68208eb69d2468fe8cc048c6e4c0c3ed2b690a2f2374a8803d99b3be00def168d3dc6a95e110dc68cef7ef98c1d139532c4257aa8bc181d1c10d8aeb2b5ef8122764660e6da083ef1a7d6794d0c0e0b72b520f35b6b064ddbd371d04150927a736052a47f5a7235f6820b7be2d4fcb3e916cd78efecc34bcb0e72166aeebc06800890011011482e010689734362141f923eab1f500e87ce1d6edcd459f71b973b9a8003611e3e105f6839fcee911feae99875fb225f69f987472012 Params = SHA2-512_W16_H16 Msg = da3142f27eaf1aa3f28a755a4f1e2327e8702761e4e5d597ceb6b880776d228461ce5da7f9c4d1f78a3cbe10b31a58f34aff39144dbfbeeac0fd81d92580a555dbe40476c745b1c0b5a5a095551eefce0611acf6e2ef2af882d6fd180d0d90d16116f00ff8a16a28104c02f8809e2a8f1ceeebdede768f93857bf00388cdd5919154031a5d57f5168a019e2bb41146c9c3b2498696e7e68b76b70e580cd0e3a32102370c95ad19a68f231124aa4a0f64f75aa73d00b7cb11b57bf957bb2bf43c6e667d41c7f45155fc4512dacdd168e982f8c557c76b92aadcf5c31f4314da4f7024c116912e549e0b55b66560ec924e52aa01b8ed607e7dd6e8998494efff3f836335a4cf8be7802b82a6197e4395f8e14847b2edd59bc3b25547af166a9fb459dc287d39888df3a6b2e4eff2daa86e73a497a900900226223ba058de997fc37e1dbac9f14672988306 PublicKey = 05000005f52727df94950dd68ef359f9f12b18757d423b3dd544f222dc9273cebd23aa705609d32f4a467c066b577e0fda4dc544bc0f1150b0c9f6fa647b2bf5a4456594691e7369495bfb858b7f4802d34bdbdf4a1eafa35f64cf163c6d9f96a180a0370b405212562a67a275118a219ad088b0540d3e11f8aa79884c084e622ccc446c Signature = 00000000000077c19178e908300b5bfe5103ecf766cb6a83c8d36b10ca696e012d43bec5f29aa46193a842eed614cb28ff7157ee1ae4b3e1ab2ebd0853508858078c12269f9269f57d6875a43edaa64dfb845b725da189f30f6c9507048cb163d0c2b3754aa32e8b6fd7248427137bea99ebecce527148b5b045a7d78a30a1fab2c7ab3d95f0ae3aea7104efa54f695443e33c257b7c64a1cb9fde8b8347ed774da89ab076366a273ec98d0cf4de2a2f2f21a0fa04090ed63e4cd3e18241d82f68954f9fb30e3dc880d3cad8952b301a15faccf280e1271950cbb311505e889f5de661af293cceff5003e96729d541ba8b803605d517bbf38b748a09571d8e4843348d8900f12b9cab3b87a96e9e7942a483a1c6a479cfe5bc04fc671ef62fab4875ef7930253313aec96fbdfaf66e80be9b6e954fb65f61c782816b079beea302b14079845eb0f390b757f94e61d116092d3d39ee06da2d512ca141c221a78394c18e5cfb5d8269b8b083507224376c24210acaebb00a7d5bcdb5be082bd70b537be53b9b07649fe31ec0698d033bb3d471bf7218909cb20ada231c7709413349e72a301bf43eebca5fda1bf4c9e50daea3c582870b5525c89a2d9a4b9f714c10867161237e492e9809e7a6fc1a86b39c1f9879a1a6515205417c8405711cd4e361ac5bf158ae7ecfa43fa409d157dc541cf6afb4fc7e7ff4b515a9346e84e641003ef6e9e46c6a700432aae33517bb4cf22fb4ee1391ff74e414db7932dce20f0890ce0a182854a96fb0ccd1237a7ea40e0fb5ac1fd578610cadc2cd3d8ec2d518e794773174f99afa7b8a2e440e2f7e7dd92a034041b6a25c2c826b9e9ec4c7b194da9a50e16729a95f5912ddbb25e36ba8ca71449dd4a6e15964c9f34fcc35bccaca657dea8ffcf74ff618e1acac0ca005719e77d46db19edabc151be8f5fa9c9525e35053b7e718372369902cd8f4a371dfb79b5eef4d1723984e7975f6ba61eca7eb4a33fccc804fe687d3c12c459b42dd9294b6f48842fff434624fc7674ec4affda193575ba4dcb088ab3e34ba42618805a2d9ab1ed6ac10eeeedadebf8cb862f34f3a0c0017823927f119d1d3df780c4cb8795867cbfe3d5f79701dfd67fc357b0317b1bf9131c8242c7cec12adfd948c50b815f38119629e29e1ed7ae068d6c8a1985b617a8011f16381e66db5864bfc08ecd839a2a7b406597ab1abaf68285fc2ba689174d12c4234e3c663c79704553dfdd33b45e83ff128bd64c535c54dfa3264d7156c7560a558810e432138597273fe1a397f8411c9e106f1cd5fd7a4f10dc0338bb432d7e1ff9aeae54236ed85b4d19d921c657abb0d07aff3ce1897c5af6f812c58e085f80c4d9af8d565e83b0e00e1eed67d8efecf41954695441e53b7567fe3320f030e2d72f20fe4ced5f779584f84f0aa78eef4d679d1e48d1ca2a5b09757436767701bb4119028437a28dcd2d76526c9e6d070254e740831c328ac9e3044efb3110d738eb5989445a6ca2a1cf3b1a2e50e79af40972770c2ff1ac978107a96b3f666ca3fba772ee3fe3146ba8e6ef925b4f3e92cea57eed023f7dc83fc91cbe1aac204cabc144b304fa4dd46267f632421192beaabd5bc91db162b3e10e12affdf5c1465df05a384028d3a559d61e4498731fbc94170fad0ba17f0e703b3cfd43cda50ca477cdb04196f618f5703231eac64cd84b031b367351b9c6a04a64290678ddaae54b09a6ca9183b7c2b7d7fb00e056bed1404de223e18b4c9be322eaf22ed03f65f9b8a81c770402a4f149521d31732b0073131be837ee54b926ac9100fc4cc7580382c92856e1c7de47f3ca282ea22b246b7eb02e927f8f854afd96a3f392c07751e2929988e2c7197502f90492d236fd69317a49998101588d507df186dcc9c35c33462e99a0ef0122adc5debe9ed71b6c94b629bc9b49141e816b311462f9cd192268952871b511c9981df810f421f790a4435e9031138ce1e51f3113a9cc0fb1b4154c3280c3551532d161a3c994dcca6a45386ac3cc9e230438968c54237f21659c8e6c84e10c4344a2e3e02745e1ef5ec16ca68fed3bd006ae604963ca2e8e4142c4d4034fac1031159d2fd069f9f547984f2a78234757fa1c66ae3d3d6322f7401251ea8892b4020d0191ee265ed53ca7ba1a2c2b031060b15cd284e74a98f727d8a156d10a7be3ff9222506b76894b632d9cb2f84763b9fc52917b9ae6d4c68cba1345d64e1817f17db438e0ed406c4efbe11ad7cedc718e63177ee4b220f772a28aec73b376f2c9541952ba61b705c123bcf4909d9a4084fe23f889560f4a32604fb5a55d6f171f5daccf91ad1b0806aba1d061003394a8855dd3161069ce26ad159ec5da593d09d530c53d98cdbb8cc77dd3f3934dac7c7b4775bbebac379acfc4027475d2c48cc1d0484eb978cfbfe2c70300dfbb15fc5c2b9afbe4c38fef20cd3b230023dec401a23275cf1410c4bf217e21fa382e9a47ac5ebca7da7d2e9d16a8402f0aa04742b89a3d2c820d87844068b9dae642912642246e7a0a385c03735752aded0a3baa15d8bb5b573f7c89bbca5c19c92ddab7988f0d5dddf68e968eced2839c6bd9c562e55fbab91001bff4140802823f4335788f8e04a4d192a904c670ce3ded5325a3d72b1a131c5d8aabd1ab7a95aa6efdf4db2a4b135b34696bd0f4397913a527b8f597380cb9d31b163cbb5c848032556d0053c5ed2001dd581067090ab254c5c002029863aadbcfde22ec26521dccaff6432b8f806a5bdbc81490ac882885b1e0475fe399ca72c35ba3d202d79a0ecf2a6b70790ba32e97a2daddd015baecfd1f7820545305eb299bf23865642d9d7bc1654dc73159710ee7b2d4f1abf278690fb8e72cb4d65207d590e9dcb9e97a9dc273e5857ef054af2f405f4d1b78e6186fb715f86998ce5f1190e2873b41b457566e00a9b9da0e46b7fd53ca75ce89e419af946230923c39d6cda075a07c0961b70a57047ac6884a651f5b324bf50467f6c55b142d3db058b8842a1d04d4d7b5ae4b47448a6a2c22ba56f90d4b8ae2bebfb7f7bbcbd5ab52228e8cd22574650082e8c0803d3e3a95179444184ca47a2840d08bab97c9e9ae649319fecc5e6b88e4cfe30c3d3cc759e84256d2134f0befdfad900aeaf9558f4cb5b2966855aa14958c43bab5d60cc1ac35b40a5c079c241e5fc09d040760a79a4c5aa32a0fd673fd4b598bb125ad7b30cec8eab0edc180d65c13e8c7ea618f4bb21af82e504566fb891cace40f5a732aa1029c8fe3f67e2a360afa22315430377bf8f3074daa7ac8d694df16e999681e484cc30faa4e3f02410fc8f0c171f3361d07df0daf2ea3104b9688bf3fa18718e58aa179461228d26380c0e8680b89da2e01ce9293564f08ec306c602d0ecc4e7a96add0155f69f32a1c4ed96ba80f2b5060959d4469145b8561285333b82c09dd1ea36e2baf7917a68ee16fb7e1e8ccb2f4972a74ab4131cdd8941ace4f36c1243300ccf7cebfeac1c93feb9745bea4234d450832b572a7e19eebf5f9ced91ed0ddc56cb51b355aa1251f855a991ea0a8ebc564b08161da1520b3fce1c99d0efb01ae05cbd3b81336c518fa6c21aba3b31c258e11a8890ddf88382251c1399b3b589d4f05107454936850cb10e3114379c32860dda72f9a1f3a0b93969cf03e8b5fcdc25d85141789c52f4539f0f33e0bf147343cd3015e17fe3704c9cde2f8814825fe434dd22cf4696cdd007190376a0897fb732de974b8cb7179a923f817c0257068e0072f5eb371321307abf6b2943f282ab7a3d5db3aeb793a9a5b60f1b41bfde8198b37fbafd967c588660c2c6ca70b0070972320425ee89d1116c97270aa8558226744cc6c2ad35bff5a6a09c2a71a26ca48f0cd4fdc4c12c636fba061a0fc3e3664eb98052f142fade40db598249e96b4b15c06932f738d0909b5990118976c58f64b7159cd3e38a259a0cb84616398e916134bb8e8a40f3ee8e021cf0851e1f9e9988263fe8a7fc9f49d9eed7c9e6ee27b52773c67fbb8b1128f3bc1b19a0121a8a1c9ea3789f7b1943f539e8f32b7c01067fc29f84136af273a0afd85e72858f95dd24e32d92a693f6a0a9a844c83cd8a7cd20fb154f70d5fdc58427282a348f65f982f0cb03ab8e102c6fd0c6869505e299b27e30f41fc95297b91433efe03e0b29cf53efe4fee9db6243e26d90014e9898a1e6df47e4f91667cec3a8ce33a5b66c9e334f2f430f021f9f0e9acc250387c3680f2a8f49545290d7b4c2d5748e6fc8387bf0a3df318866483d00e88c2b2c4022ac0a6c31319792a7fc0a54f69711cec8f61f2c9497278dbee2a74770eb1753c0092317126e9e6a38c14184486823636cf8461e55bbb6151104a55d91c97ce5810b86ebe1d70cfca517c54050cdc8d4a036781cb508ebf5b893193bf19cb88f0a580ec382c32f78086a62aeb370aa2e30d2ce593421809d092e241bab4d43b5945aac05741c8c7dcb38c798f54742b829421fa91c804a5197828f71ec276822bec7193a93a738f588fb807cab864c4d331a7bf1913144713561bc5cba2b89c7a498964b7efc780b1cfa08b20e4a54b663fbbbc57cd1f0e187818f6e272c3563d8470275433d0a0a270ff6692df977a1f71246b18fc87a08cf41bcf221e6b99d2a0d7483b869f8b5a80009847c25e3d7be4c03d4908ef562cf541e5ea38e61a2aad5a759fc2bc8d536ea4cc0306343295e5446b951f399633e0603a26022111fcd19cc88fce9984a577fe1753309ac4ce8fd7e33d113890fc1ba3d1eb88f6c7b47c74a7a274d8f59058215ae3b6a81726ff33061cfee05f64a860a6f80743b30dfb9ebe99be83fc5e7848e52efcf23b0cde37e3f3a6328d8dfb14eccae3f28e4280fb8f2a1b152f5407ff72b2ec919efc69269873e0cc2173a542a7a9987c27520528f8eecdad69e0798fec4ec2aebec1083c263c83c0ee2926eaae98926de222f6e7cb79344df8e199c9b2a8e1e5376863850b1f6fe6666cb529be4cd078eac355eb74a110d9d1b650f52f775d4d3aea474c2ecb13fe03d203b45952b7e701480e484df8fd1dd1094002baeb1684802c40762119d5a90da377bf8c32139fb60436bc6095d1084275b4e730e65015e4630bb7d8c515f4e5bef7a6804e200a6f7dec41f5c2f02a5929f15c52fc9df1295f8363f4c5b456cc0159dce58ea22549daa697a5305c35db191c5d9c78280397b7c8040010d039321e56242f99da9ad4f03fdf52525ef8873a6a9d5ab509a177853416e7c073070ca9340b08b015bc0d137ac920a17f34a9e8b9ef2a2f878844ca29ff247e04de9ebd40bd3ce9b0da58e7edd663c140b2a66994404bfbc91b8d4239686b80230d7706643f5a06503b3272e7da98ebd459baf85382d0164262facd6fdcf3f5acd6bd9799c5acfc8ab776c260a781ef9f0908b5c532958b4ce0aff1bd3ad66bde76eae1d3a23cf67e089f98315c84ffe60a36aa80db22a0dfd49f02164f7c273ee88e7e64a011505140c33ce73c8459787b0a3d2b32021fc04d1257882e8afa3f5d0cded2341cc0d618e30c42e9668fb72b6d479a86b91beb13078040e3f4fd8db835917f161dcf559bbb83b667084e5f31216d979c5a826756e3ccd410581cd60427059e3c65f335033729d99e19cb379ff064284da6b224ea668c1755a932805b9ade999b6f6169965ef95c3f6b4ac5547f2fe26ee35aaf409e5caeefb5008b8a5db89d8a6921ab4283a47fcbf315b9259d1323416ac941ebb6a50106e18d7e98ae980de70b7cc9e12812b982049ad76f2650b314a1531fca69a91af535b4b3a5c71c17f939daa0e411cd7ae7ed6d94731d51750cf3595a2b4bc1ba6483e814fe321be8c3885bd0219395c7dd4c65a16ecb0f1c254336e6ebca97849b63b8130089ed00a91633ea93fe522105d84188af00a25415b715bfa1b9a201a6c8a8311c40c8d1ee22f9b4d0b6d61fefe37e7e8bf8a26ded7c371d016d8b82e4fa803eb5b6e7ba5a23e905ced559d836e8cec459f2445bf8b44edf511c10a481641f56a42e7a0c1d5a848333d82fbf5d733c8138a8a42de0ef85a4941f4949dbb7a079ad1810cc367bf01265dc0b8a09e03ca87f32cc29690d5c22f9a6eaef312f1c302a4220caffa68639c7301ee398f327ba225204a5717d75b8a346721984459df6d00b54cc73793a1d89a78407c7acf80e0d9258e7b72b40d5fad963cef0cde9dd06aa8caf9f0ddea56ebe6c29345dc9b3df3fcc09cdcac28943127600ca3c7c40d58e4364668315c7b29d55f7d959788d6a61b504a4861bc8faa43fb082c6e266c37946a92bb8c6dd3f6393fe68ce3d89d099a314a4de0f17773439295b8a1c4ed73daaf082d4a9e307f1ccf5a9e79466f3ae888af4b9b8d19317b10990951663ca596c9cf063a5983ab3d5c03174b7dbab8f66e49bd78c888ca4a5385bbaa4eb14c6086fbf168b2041cac2f239e466f06c4ab84bd267b770289f590371b36c5fcd60257d57b747cf5220e593ffd0e3e002109e3f06c1c3783ea0f2a44c002286a3d5fd68472ed54a00faf2927ef4e4ba91e16d84030aee5d125c301e0d56c0c3665106c40a30f2d5c836e3259bf3e0b10dbbc7b74cb46141a7b14e95f4fc30ff3a5fadd10da97c099ddf07a9bf87d3599f26be7c83ae65dff87226b45edccd02dea93406aedcd4df8800f9fb14a6c30884c3b73954ed02173242b5176beaad1a8740979eac10d46d3b64e4a2dab5bd4979b095be64d51661eec5b7abddc29e29896cfee2c4b58f6a092f8d6cda954d979c46cadac5ea6b64bdd10734229300d5320aac414862acfb760d1af6ff30f2517ce820218a7b9f28423a477b73d220f5d69b949e78e98254d02460f65c21660cc5b44155acdb0891a28429fc37053d7f2341fb6a60f58e744874e1379ac1f8f44b5d5afd848aaaf16b1acb67a8267959fa7bb63e13fbd9f58b5adcd7dd88ee4bdf3522c517f29b43e581ecf8e890604336de77350df1e7381a0c2241bc954624345e8acef45b97a06f8eeb9d7827a1820651be6aedac0199de93aad5db3bc387524fb73c3db1bfc2a48800adb3d2467a7261760e79d63540112d6cf3429d82fb49f35ef8e31a73fee72ba850f55d1322492303ab7162126bdef2167a3ab60d861d5cb95b7e690739fa690fba186ff812f2778d9757ae581bbcb794fad1ede2c12435083355c271fdbd0fb32c6b585896481d3756a046454f5d2170e7a4d7d0a92ad40fc213a228761317cac028d8c1049992ab1dc11b921656fdcad2bd83306c0606f969069fc50c61bd1549d8090b64cc0bc901d954a74afcf61bfe961a6fc848e67bb40c4b11fb0c139150b074cbfb6e85d0a0e5cc4586dff56a497ab93f6d841b4a0b3855c9798cac78128c4e44e4934c398fedd3fc6cbc095790a54434a4e53e80a414416ae48145dd0180c6a69dd8a7e92e36b871a0f9779e556aede7b5a6ce884de03a5edac26f598c355edb52a7274c1cf1411801521bfd514b6fb7435447ce49dac59e8f8e12973a53ebccf4bdc910b823127ee1c85d008d89e16cd576bde6deb1f044bc69faad3e7870a4477abb1e0ce41623e17ed86a7ff0fbd6eb6f430b88a2f84fa7086ff7a4c938317d4a617a5c1a0f88f13b2274a3a34d6403cd4c37897ede10ecc1889b286b47e1766fb1fb743ee5c2e3055534a3e77f63498a24aab02285d70229ec8e9b14936adbe600c12aa1db42665d94ae73e474ea6447e138df9bdbbf09f490d9d8b760c73be81239619fdf0825c1dff0471d697f3e1c2654c8503b3790e51dbb01feef1ef0a79970eb1496d584e4794a5ddb308a42ffc4200a20f89c07c482c4f6de0599af622b6ef0ed7e05fa310ae5c4b2023386e0e488094b6f8d0cce00c2089bab155c77d7985ec15cf8f8a3edb484091b79a78290b5e526fa6aa7b5e6784a53fe56f311ba0d5c44b4a57c1651bc55a35eef56907ebbe667ff3b6768e47e69ecd18dc2a8eb2c16a5d1a02e52e592a3382806eee092ff0b3a7b4f01f74b5203f50380cdb00295fd603431990dce26892ef72ff0be487ed16d4bab02f3f1c74c605b149164888e91f41a98ff7a9d0df16825332ee6eccf76617851db00bea4f13fd4815bff3a91219ab28fd3d86bad2502797646fa4304818c533efd655b135f41c181e3f112ab3232ba1b2e9bcc45f1379fda4c2a1520629ed65b16a9e2e4a4ba53ea6010690ad9a5c7a9603e1a83305f5c818116dd14e2d45c67e1431111b76ccb2a88fb96930c45477fd75c42d80f3abd34a8e98e57b5bfe99d56c9ad4716a751ea30fc113d7f9586121a7e8a90d69a03fcad9b213935216f7c278e47d50c615d4ae44fd9013aef76981c992a54a80c621926377bdb398ac588aee4a4e549d73c82252d1441bd3648969bf8f6cbc685bf8899bad38342e57c228419495fe907fa8933ed2d8b6e9fef5fcfcbdaf096753a8798ce5439a144bf1f841891dbb433fbf68e4f390d4ca4d2099860e1303dc9344afa42ba78fb549c46cb2443b995fddabeb2a50959d01ea72b9cdc9616dae1439ade6cd2daa756366b92aeb59d2fac3dcc6baaf5ce56a0ba9ed1915abbceef0865e0702004f465c04868e3a23bef7837fa4ec2a49244671d6c3a74b79907d717c4d7b1a22552372f7544c5d28aaa744286962a92e4b1f562dab8d66b4b2e2eb24b624165076616756c6a0c7c4005572adde58817613a98c164ce6ab120237ed61aae80c2ae148c9b3124581e39b1573a303666866516e18fdcbc76a8a0b241a2a6293d12e124e8d78349d2a51019a825f365e19282708e8f0cd0e57f5d9c526dfe1a0ba3fa2aff43f4eb18054b3b5ab2c6a776b213450871df08257ca6ce754285f9890a990a57e37018298d574ee0a85a215255a1bf82158dfd520353fb052ea0765941855c4b74b2eea79917efd7c5f98431e86bd8f9f19e4c45d6ba0e9ee7c2e19a4bf71a2875705e0af19ec6770b5ff80ac66470d70fc8ab2b3fd08e7bb8c9c2c952ca62afd08f6c55893f89085bdb22455b342c5cb6e9d0c3871825f5a923c0628704812c6acfe3b7bef10c93a6b7541d4cde3570c470c07db0043b5ff76c3e07d6e8620a9385bf15713e10bb87d76ec249fe4057a2bfe789500dc4981784d75c078dcff27306c0598c85380d2d8e0154f5b9cdc5789ce0f26a57b3a0e04c1e1bc91b8060692436eff266f7ad73538df445f8b5078467d05962e63b8ef3f3be29869ada3f523d7b43cf7dfcf627058c79b44a5f986e700379b27a43c7e1a28dd2766eb5eff00967477c73a119c25a0b8a881aa31c260946786c4833431e110a8528fbd90dfbc41da66af2f73e0a20e0d241c04df7791bbba8b686c23dfcdf233831c6959f79cddda6cdac622c3c226c55ac44e0c73243a39c7f3b6a8b41eeb59fecb63c17f538df15ec3c4676b42b0da94075d50c61dabef577dac4198834a0a87fcaec3348a79510d4b9c777ac550eb3eb3b72ef73d948b40979fc82919c776e1535cb8f55cab19ccfd407a998c16034fc7c3dfaf27a5a397cbc91177746bf11f5a78725f3f8b2af45f973b276d79b19a5b7f4d2ec3958c519ae58ba4bcf6485fa9f58c850569896cf9b6cda7cae64dcf025d4778e329a2a9e4c5a5febe74304a73924c1bdadc57a8b1719d76854d2dcb9af0f0c308a87226b95baefabb68141eb075891b1303974f70718fd48cdf4d2fca1ebe412e30faa21511257b5f82f57e1b3b337131507f66fdbd5a36db41097722f401557f5fae06d043cd712de1669217d22ebaf8c1373c9b56ff6d2f2c459bc1483616478c3a1dfe6b9cb769b482483350cbdc353e8eb90d09a480b8368af8255322a1c7d552d034060468bdcb49b29461ae69564ab9d1b128386a50d46b39b843936333cc3638947a0dc16f69baa84a78e34db481d1233646fdbdae2c595b1bea7c738cc3a89f133de26c567480bdef6a250b97ece65702242d34498b11237f5d24b7afcb3a2f9d0262535570dce2ee24c84ff0cef7cd2da67533afcbe6304f8ddcec62f649bf032d711db5db00c4ab67801480f178ed31c44e2eecf8b59f9346add7134fc616482d6c100421466e528d0e152455aac759d8d928e375d78878afde24ae811c62f5230902910cc53692c5ecc3e57829a2b35fc662aa279118977804af2c8ed0c6f7cf523673f4df80accb72888b13af57628e218f88634d789a77b4dcaf19de5a79b656b9269a75cf146804a89582d71acbc4836987b7ea527d94bf2c856816a8c5053c8acbabd74c0f54bac15f4013344fe90d04a5306b4bd68bcc87945858c4e18580574b900940e72da33c4502841db30a85234a30c2a33761ead6101d9aee7e41b59d984492c2db06ac89727a47afb49a732f571e4527c583b74bcfde94533b3b1ba3442d0bb961979364cca21816002665a65bdbdf0bd7704a5df040644dc392af1a0be5ee7f1b2bb73592f02ab0361ecb9ba22a149c9d850aa0ff0bf0d77144eda9b3f7b5d42afb3b108e068816e4bb71df3b2eab4a84c413316f05010aa0471aa128128dc0b4aedebe3cbb50dcf9c756b5675aee1ad45a72ab627c041f565cda0676ab1bb53c67b4b13703945751769db5386697bb39759f7c5a0c4fa3b7bc729f9652574ecafc97a2feb12d9edd39a893f754e380fbf84be1c4676e284cc34a6b1925ea85b52a6cf4a7ba67a0946d40505905eadd437d6b860b04689822e5078adcc5aef0e18528d4ed6431c9a73d978135c1d27bdb0c454526448700f963e4dca830467c0f8cab060ed1065d6c21b9c8550bea9920b74484617d053b4dc65f86467e9e845a09c04afec58591700af994e26da470834c184ff0ccc61a2b22886bcd52acd3eb7e715a78a3366a75b65bb36d20b63fe134ddcb0c15b366797360c046e4639e377ee4155da0e0f1b427c79fbf442fba4c4c15140472ce9be21703681dcbb9297e02f00b53e5d896a4e993a45f07532e4389c70b3f2185a594ce85286a1bdddba4236bdf07cfced5a2a13a27b1f7b21e86e19c0fc76d163a07b68d3c04823d5498eac0fc0dc708c7242abcb7435151e7883fd6a559f56696ada57ba47bf608c1bbbd96555fffbc2ac6159901e73e320c3e422c17bba66ac9b4ca48770f0a8c3eaea066f25bb1213d1780c37c0e4f5e1dd14814bba49a27d05a9dca82af6d2c54e455c0304c3559f23555d7a668ae5780ebc68ed3422b78ff6a3087ac370d047d8339998971d9b07d1f73d7af384857772767c396cc8880fe2bbdce3f133b7070db2a8e02cf6379c5ca0ad6469de6508c5e8aac41ea1e13ee9005fd8007304d10836d625b9d7179ac58787e55d7f73cce7c2b0c6ac834a16c9f17d6e1344a5e975c08358032aaf18c45b5bc3bd6c5288c5c9c73c1a763335d8e6815de04730ccd0e7070bcf7cb92f1aa6b549a6a8350c685125dd1a1c0f1aa1cfcf7a81e6500fb1567e46bf192d8a17a7edc6056fb682f40c11e6c6828978e9449dd45968835bdcdafcd296f2e201814b225cee02491b851c1306e32958e65366c6daaf3933f738f44e9367baa80fbbb561365ad8d5fa49540863e83e222be0db3b725681f6c046031189e229b20450071a00c5a39925345b92e04e7b84b0c3f6e9c4c67e4a2b701287bdbfac8c3a130f07ede6dce7f985008dfc1c5d10ed7a768990e5641b4206726b03030a7d14fa4d49d25b03ff9c9a8bb2ac7a9ab4a534b4bb60aebfba3f9a513886006f5564f90eda29bad8cf78395a3fd89615d9012b624d7bbe6f3424294c7a243dd604e19de387695666a00457ab729b89b0bd29f8a417c56e04c9d266f940b545f8d2e04eb4a227fa3d2a119c3407fada28487a5fae09a2764fa228f884c06d9fcc395dc6992cb2941dc545db2f400665782fa1ade2a419cdddccef795b44cbdef290444e968c5b1da3f405209dab85a02b36445c21d286de4e1ea3033303eb522f28c3e0846c2f428f25933e67b71b324c9fda8db626a2954d81474d39ebd380f0fe46fca52002f4012aad7eeb657fb8b8b17e2f353f6e83a09ae80271f378a542585621f62ddfd6c5f44cf2eebcdfd1feaf610b0f9650696b4c9f464c3f0e1d792784b24a65d5b7cf1787aa172b11ed4b83001d5dedf65f8ff00b68d2fe9318cf2da23c232fe51c8009701ece2a3777dce46af9399b81a8fc655e81eac797eac705d5ff14ebc29af7366b8c932ad54c0ee0d5a66474225643435bd9e7854b2df2e881a9384cba3470d6355905f8e62f8ae11786c3064ea353d4a24432a294be6a36f85093991c1c6081b60aedcf561d816e64e3026504f7e7a3db302f9aeee209cfa7d877c247e78300988c7377c0c674c20c420b6dcca75b31702da6ed57192991bf2ef54a93d531f0ff35b9ae4375174cb781ec600163bc9fe4fe36c352765ec0ab1a2c5a7405e3a303f7ba575e54a7c304a1a560a05d1bf3829571b439101221563871442e9db42da2e7afa285da8fb7aee89e0e8c10c4a8a3a39bd612f77413f9d42d504cbd3a4f36a67b23900876101e4c87fefe4dafba236c80fc67305e7ee368f101501a49d984c29ba222b0fc1c39c0a88eed9e0d804db580639b94c2b96d8e238425ed9dba2395fd206eda00816b377c72cb131301658b437fe9352c2b91aa3076a18f8873601a38cb41b38b5adbdecc06f62c7c6e850699af1537a3e6c9fd1eacbc32a1b0da1182c57ac9de12f8c07c2bb11aafac3c5739fa729297fd87fd4000c91c70452c9695a3b0a3e124495887da93c9827d00d5648ffe37ee72a636f2dbffcee65c984910852553c376b3a51836237a61ced8774bca2fef758de5e948bda7231b1c3f6ebfb214d813dad7fcbe31e149302967cc9f49acf4d94851d8ebdebdab2c23c4cdf35623fade9f39483403fc41138f270b0c4976fd5ac6a5abe842ecb94ec4c5d21638d8f6f22646963d6c27042b1881072260677dd5ce97e7b6e95c773db37b3896b587ba93e36e0ba86bd21765bd0ae1706bf1d75947ba39fb5d50d7efa0d6684e121b4415468677ad227d1b984e96bf394c62e2da0912a750453fb908df69c045b65fb762146dd52cbc94cad3727e543b647047592d326e1f3584b141822fb9a272025eef72c9b7fe623ef4223e47fd240a9340ab44baed2b79afd7a1de021745666156664653e189ac8564093065772caaf2904a50cd68d7401c9245881e5cda580f333f04cebf61da25ae38d5c6331350adbbaabaa59273b85c5f66f47fd84f10a068815be14426c18f474b5cd688492b1a437af153cf945f612eeb37e024afeac1838ab34bbc043ea1d94f277adc8b7f987557179805d0c2dc8cfab286464679c29a9199dd6dd8af663fb3cd2b734a43613b13b7d3cb23b7c73454c6a0dff05f252fc Params = SHA2-512_W16_H20 Msg = 84ce75239912d0163f7610221102b9ae69ae0e9851780220efea9f3df9543806d1cd7a81ea1f73f294d045fcf0f80b05f458 PublicKey = 06000006fecfdff3df99dc1ef72b129ad87c35e5d824238ae3b0d2fdab85fc2a82a58d785179994155e7f9d83ca376f5a86dfe82a45f77607e5f2651fa48ff4283b1d590364afd2661bf6fb110a09217721e5e810a7914dc478dc72b90114dbd94c2eaa1c4aedd5c3265a12d53c3b8e624dba4b925f08f563881d4e301f0744d21217fac Signature = 0000000000000000078442058aaa10658ee79fa6172b458d243ea335f3f7b32711a9238db732dbc892849b0b949ad945a5e1a6c38f4e0ae0adc99a017089401c2923a83cd560876053348cd04bd68841bea15e60828baa6223b40830ed18bfaf96c354f33c00421a487317e90faf149866615ab0e758415dbe66b439b0b72c959d5effed712ad011b0bfd329455a8030fe44f11d3d4ed130358e1fc878ff7bdddde5a01d63bba39a0b521ed3df698ea7f32049a5a2ffb723cfc7ade625a903117288f8e5c43766d0dc70db161f110ecfd976033e6215ead958abd2fedd1c10d6428bf734cd0ff67656f023eaeeaf296550c119a4ceb9da188aeb22d28337a4711baf32fdf98fd41585a9042966022ed0f1dba217321b100f5bbb32b130d90b57fb5fea96ef1d719f8c76f60e0f2a742f92999aba1e0b298108cd7e0c80fa26705f8bd1829706bd88c444bad2d37357b9343f557bef0af15f31ee8ece94f8e4527231d64696299aeca7a3dee52a1fb3aeba5234f653e7a18f1b9e846af9c5ccad4b244699484c31a1c294add8ca9228ec5c3d4c92e735cd8bb5d40c5606c4f4171c44ef9666e9e448af74edf07baefb8956ee16c7c9b215f88e6d5107af415693639ed46aafe230c550422f3620cd9ac0f40bcbd7cb4390416a1a5fc36ee1da3e3a95a033cf36b26aa6063ed450a3d726de7b14584a4d3fcbbedbca018203d618cc2a9e9353f3ff0704785199597e8cd827f51b80b05b1552435b19a8e0d6c60e1f2b05925ed492a991a078bcb02d7f32e3aa2c1fcf2d938438e7081d2857159326a74b248517d2d4f3388004fd13d67cc0cb8405d802425e787373cdc6f51048ccfd330510eb7f90819c1f3a952cf759b9d526d53c753f532de680892c6f65409cf1e4a812c5a5f33396231515166094ea1f2d2230c6cd511c51ea9748205cbc104b6784467e6b6f1e59a96cb0e7b992278d629c027b026e462d3e710213c20f706c98362bd3b8cd8b3a7b9622f3849b8f7c626835b620ea7c4a9265bf9bf38a60a62ba8d23f846bdaa105dee577e5d097f210a34d2ff518fdecd0ab6e964a4806d63b104183ae13b83f6a588eb4ebcf6ae5b32e35869aad2edf23a02a89d69104016dbcd87ab5f9ac77d0a55446a04633ad5341b1bc88d5349067ed0695b91c98bedfb0ada6bef69e5bcaf239ebd0b18bf55799efc3a4bd7eded8acfd7a8779ebd4d37d480b45a9838c072e3cfb7d28279daf81503004af22badb5849e212d9ff9e808bf5204e5c01d5947384df54209ce4237a915e74ff9ba64bfd740f8e527c65377b0dba3c570586fc7beadb8500274a9c8af711cd11aa6bbe7e93208c6c76b43fe582e50d62d6f49e1d011bf53356c17a9aa7c881716a9368dae1cdcb439269aef8d7c27ddee4385cc276a9359c2ab5adb309008f38f3e0991e584f5935d86f99df21fa8498160a50e9ed38ee051446d3f03724bc640f51163113bfc7fcd5a983030191d9f1bc0f369ad10f6054d231a7833ed70074f8a55db78341b5770376a6b8e4043806c9f5d5edbcb505bd7c29780674c4dd56d8c53fff099b90b17d56dcb2ee0bb9b7841fe78c55970b13b2394d5772cc5b38523bf00d8ba6f225b4b6b64a93b5c01e16dbc05ab79b9476f47860268e56b2d8805e81b8521e1e71f01471282a7e865f04548532051f7e564dcc9a4e4e541780796d5ba2be7d900e026e514b6046a49df1162065123400b6a9b24084a14852f625039deec8d16d2448aec7faaa461114927175bb931041068f2291c0861fd1627ee132e247cc0415773d2f1f3979e10a60a8a3885a46d5010d94bc3c8bfe2d26e21038de2da951ee85f3efc3e7b8347367a473959a5935e25357ecf4a2f5daa5198fffe7fa26b34b4de82f6dd5dc0467e931323ff83f24de5b6ea57a6fea448950f18d62bff1b92c01faf102eeeb34e3612c2f955dc91d377d6ed0cfdce3b6956b061aff1ad32198a4b97ba5082e4bc392adac30b89706bed228f9a9c3ffa81bd5c025d1c1873ad4174c37381ad8da3471790c5700891279b3547204adb7f5b5b39827609e988c1418349c5e5569fb6d24c35e76bbf4c5c407693784007950e9475ff55ea754f1705cecf72d87233d7a53d74d64a5f331f1cd3d064276b7fd10705a8a43dcdf3be6c5b51e03f365eaf23b0ef9f570952af05959c0f8b5dabfd1bd380b4c5efca40f8727b9c7ae034b667efac8feda83c21b9935bc89bd5381c161106df576a429859a9793de44ab688499ee721eca77c7b5da5678a25c54c98316072637372ec30a04fbbe5ab182c73631a01cae998dba4471adfe68f88c27aeea0e515d1054b70aa7fc16296cb8586e33619cc6875f4b3722f71e87f47e99e1dd31e2d38473c6a65d2ad677bf2399dec460039c9b9218bd713df33b263196fda72212efabc6a1924f35c88405a8bdcbaa5913a84614c78701cd6434f949f8178a896fd8f7b20aea0d5f13b64710821aa63755d6993e95f825f74054943b50d727e958d4dc1d714a91b5ea61543be293934217919461383d538f157a275eb0d15ffc232e709cba19ba4610fa14f93e7dfb427d161488f5736a678a174194cf976ee007afffba954f87960d47eda6caa632a6777fe05045fadeb24b5a26de3af2edcf85b12adb1a20049a480c809ac5115537b65bfdebaca5a6de334ca834ba0c25db5e5d4e0f3aa9dcb6bec440dfda75598bd96443eebcc6df8626369796eba3acf6f7940e07c7505752c05dab0f4be304c382aaebda794740fe79a56e81b92c07c8839cbc58dda067beb207297633c0068ae7e1f6f695ef6a0edf146577daaa95396ee1f76412499280cf359380b2aaa7c3dec29538f08d4bc87eea9cebe94a53fbd629b930cb8dc3dd0cb79ca7ba8698abd5e03ab53b52a47e56d3029af14b3ae26c136c97b24aa7b72272feff4d6a2426aab902a034bfa45a5ace022dbdd912a24a82311a34741c762da5ed33726c00494c5c84e60caf37710f396f37329d3f408f05bde6192f3b8a5df11f26ec3df21e77a7192d37cff5343d794ac1c02f829cc88c591b6a26d604a87805111320649155891a41871424e37b26fd4bd39812239a49e2d8328fd93f25c0e93e426ca0d6f274c83fac705d24fcf535fe07a507497ea24ee0c4aa3ee6d240ebe1b7836117584908118caa4f50b8503055f4944f4279f89faa1957a621fd7eb0c1e7e1ad6fb3917aa04c20317955dbe1cbd9554576908922d82c51f90bda370a47ff9fef469fd6944e82e25c726a91e7fa833c65023b9e5725b5832bf8cd0b3fe68d0e070811675a3a6515dd80e89c94ac2f658278c2e98a32ed29fcb422bd82c440b5bf548395b4a488416ac0831d2a8a8396c61423bedabfc91f457bd8bf8d2aba404a067aaafbb5fbed56d87bbd43ae467e952612b26879ff7ed082dd40f0a808643602fc5ce33ce6cd66e187ef0b9e61e97f46cf31066ec470c74849570cc26f5b013dda6a30e32049eb3c8c590907a4d2a31484c2fd73477b22ba094b2cc5bc5e1ab366da11f1ac5fb6a0c784410524d2c06e701a93ca1dff775f869bc5c654aaabf1d208ad1092af5203e56a15e335867e4428c53780687491326b5d04f6d37ccbe9bb306492fa16776bf5e30393738a8b23de8e0091310faabdba07f4c5b33c0b613cf53e5ccfc77f0417fa03943236d0d450f93ec44f7ad2669d3949a83fc52d5a9c73106851890954fef04dbec0e60beb5ec18d5ce1cc8f715e2a074fd2ea0577c367bfe59d7722a9b789b6ec547cf84a6d9cc440e31a26ea26dc609879fcef4179273443a04347927049c356037e8ebfe69c36299453ff128116a5ebc3ba2aef4a1ce932596c27a617e6fa167b6258728716484757117f168e06d0a146653a570527bff14a7f2da949f690e2953bba2fbd0df7ed8ef4840b262a372a76480a5fd291665fb805d2a17c67daf2f2b347f8cb622533e42110b38ec975108c78539519bafe645e53b848976bbfe8493f172a25131f77d3c7ebfa2df01faf19d6a6bdd1086bfaf42d1919aefdb7352d1c8e17a2d55a6782296836adb8f0aa4aac06c9a0ba45628070ae4e8c6eb26600bd757542942a4db45e61c6f7455a6f19135effa4986444f8f59264d60b49be0869ffd2c598f16a1c6d4641bf0574f3dd0860ed3fe2a005ecd9fa5910ed52902507be35456145f9861ef284f10845ccf1094a7a80e59820821b8dd00deedd44aae3ac21ad16facfd60ce78547631d5eaece6d10d6cea49970e81c5f812da2d5795078b4099d849deabaad8d87c6af6ff988db936bb377d8b89317dc3cdcd886dd315946f0860ff27c6f510ebc8f3773bc27b79d21ce67cbc0cdab2c1aaa1a89557d14b77c474e50cb1f903e661579bb82f45d43d072bb269fa01437a2e181b831a98aabdb96f7b5082982c4497b85441d12dd51f4b335057539daa292d49c51e1d9e81f38709ff384b8faf4bb1e66cb718337c62f3c49969a10ffd5621cf288a58f7e33acfed46f488da2e9199bc5c112ff9af79ad9161f63cc5f97b54006db8c26aa6f8d813607561d61a5b87d1a5cbd38006e60d846f181a15b0fdb2726746094ed3e9aa4391b94778c08b533ee6e789ce291d2f6ed9f7b29f6bb2c93d9a03e2562a1fa5bc5ef4450aa078e91361ddca973d94dce5638fb9a03fbbfdac292ce52d7881982aceee8bab9ed9f5f3524fd9d312b18e22d6ddd0ac96501c1012ce2b023f5c3d3da972318e759b60c54438ddc0b1b7c34b7d86918875b5d81ee091ebbe501b1ffe830b8c32283e44770635b9cff86f6fd217dc6f37923e18c6658a9b888abd7a5677ba07e6f9ae64e89981913c3d7c6cce53633c6f39c61047ca80dde779debf7a9dde5d9c0ff543de02b4d3aa36126a003da5346576e11979385dbffb327bad22f6a2c57313b010c4013aa06d94f69cd53c18a10fc9f1239205d38a089a21c323d4f787c733c8cee9b03c14999cffad29930c3f309b2ddfe524411c83d7a2ffe2d207a6194b0e0eea206f4c90bf9c0f5af2c25f42bdbd397e07f296a84163a4e4d1e9d4b13b9a1cdb3d487a3c453c744c2b450e57bc93cdadeec82b7a43105358d88944779a645e2a23dbeb718fd6196c6a61d7b4781165693c50a2e0d6ff388b5d72420b3ae5a3631f35a32ce92ac34efd3f7d213eed8cdab4d57ed1cca7a4d7b4a53cb43127d311b2d271c419f65832c0d7b6c0c808e07b538df28a70c8291ed0d0a12c03efb67c3ff107ca5faaab543cd5f6b5529c68e946e6eaccc5212399f9acc82c9d2514046076887a4f6287013e78f69ac932250572e95cd2de0fbb0d482c7178d7ad9cbf82299c62cf136b3d957df890951de5b1bb228883c58bdf384c1f00786c156e2fb782272d6381669c6dde5037f6faaae6a57a6fa77e81556d8293793f622a6c1f10e570f1c85c25b402b3a921853d478fe74b7faf65251083598a55d42ae47b9ba957d1a60a97981f19a83334259b7ef60acdee6f83af303e2abd0050b139dcd6ddaca2344e53f96bc545555830a915a8ca823c4208c68a7ef6b6e888b4514d4275df813738066f275c6dde85242656e0822aad65a2bb37fbc4bab5a5749b0173137310be0d0f776cb99f782d966928854893673ae9da3085840d20dfa920aebe51f7b82578e84642b1c3236a01f8c22e316d6cd3f334c5fcb218d3da5769b9ab8faa3dc7424891ad868a76fa9a91efeef052b18d08c65fd44a8eb35c20d85892bc114aeb1c069d985e8a00f012871f541b6e3c00fe0b2840a40d213a939880c6f5e5efbe1671c2446941d1ff1dc0a9f83c9d03a4ba0158442bd2a2f732b6b20666920756df040c475450bd7f3bedcdc86a15b5fcb609a5b927fe9c63e4ffe55bbbd0ce493f65f159c58ed0ef383cbf293d8d56bf812a12ba98167a3d173b896aee749f8b8ae8e6b1481de805016965680773270e64d9ffa2bdeda0e914659e925c1884a5d8e4be369b98d4fa820edbcbed86ad64922aad619cc4e39a68eb60002e4e4e29a8e9a5e5423a1b3a21a040ca6b9fe3483f9bc1d7c8906edb41ad7dc1ef05e94f3aa43281ceed6a9b498221aa11a3e0ff1094aaa00470c6e347d4e9da5defa02a6ad5253040a99228547c0170eaa137026084d11b24bcdc9a36d89449845e1ddcf95717b2358e77550fa1c1e71ed8a0487b3d37caa50a000e3398df93c0e97e0a4dfefa8c0e9f482c6d4010aa89b4c8f17e8921e47f676fe94d66ce79502e1e3f1cbf341cf752c4c73f213b196ae943ec6f4bedcdeef8678d49a62111f6b876f9765d93488f04b3cd9cb64b7e0ffb26a58fbe65b78a7d8ec8727a8ae04f2df3a6e402b29944d9042ccd978a223aa660acffbdaf1ecce525588ad33b600c383d612f87cf5419ce3f0a0e2f175d5d46d482ec60cf794491b1724415f42ef3315e4b1669891935ae944b368a80a26bc426b282887f16210199319a5f2d5a5e8ce622a8b1bd0c796cb4e033453da3044421b7f6c8658620f12e13f4ae65532bc2f27259dc8d798423813e2d611932cdd12522b6b8daffd4e7460000a011337fdea8601ed2cceb1435a76f098a098c5b007189745dd6e8ec6c2c36b18322f65d9499ace66078ecd40176e724146a142499bed8f85450d0e42cb8e94282763fd9046d7adb7d2e691dc13b95ebd6d28cfd43241d154c7298a39676607f83b9918ccf9b0c3a6d3acbc0d32d2ca4465277c8a84e90a2bbcde837cc7b57d802a9ca1c3accec451c755b1c70e9faab8573d12a442df5c795c3103acf04d174dae5c042711d73a4530a219ed78fa72c32f40c6c79bd958fc6974fc3fd4b7abafa80992e6c5f8559ee4a41683446233e4b8efda80fd5ac9a5a8a87d16c9e1b32bd61e527467d86b7614d4f4d38e31943f364c9c7bb741b4dbde3e6916486c8c13dc82348aa147021cdeaea7da9d57d72a73d9f4dde081cf64a7a233995bd04694eb2e4b64cdba9f56714f2a4153dc1cf79d6318161ea3e62e2db56a7079e4109091c257e6458d702d15d30db6b98b0413b038944067352a67c954249b21862a94e2d7414c1077c524dd38c91850e878dde9dd0523dc13796e7f9bda2fb404db02a40edf5e0d0bffebff12628d8478d29de7500a27d62acbe8e8d13ab5e3cfa13abbdf71cba6e4183b1a2ac46eac174c75719c0e185c41e044266c9161d760a06eb8b5d48919ed306dda0799461c75709d07c7eb6fbdd2bb0e1de416572fd5384fdf0bff8093ecec5308c8d9788e0638bf3a103868627c6928d565a9ee1ec8d1be7e1a046718333c8b40869ff32d5667bdbebb74dfbc7deab9c3e9164f84255cb4958ddadabdadfdb69402424d3fb14564512f65e4e9be877dd9059be01df5e2637366fe3e6b642e5b5cd090b22d67e17aef0549f59acacfd78a74bc6a10aa3c4c939d59efc30f4a3924432700d1c85bd2f7635751fffc78f86b4a46bb939ec343148fb9ab69766801cbdc4a3898b5d590b14d2d24e1bd980933eb539e0d9914f25e10db81af6800a4f1273d7051ae7aa5092f3ebd7846940edee5ff35eda2fa63a8377e789c1f4979381d447717e6c1e2c3216a9cebd139e078fc62c0fa9b0c483d724be0100c0df8a2a73abfea35fe7b2ffd64441bc0fd051305c6b6676206e5dd4c92f18be8ae9b99220648d1f3f0ad87b65d244a368986af5f1e79d1f07af1dc49ad4a889e7b009b1d21d1e2e34fcd478904b45f8e96fa21a9c3215c6467f37ceebd03a652f9e1c5021db622367e20c71afc22647737c8d4ab10774c427368c55d0d222833574628c4bcac98a37c26d7057e248808bb03415230e08d5767d9758f4e4384400fa79969ef6fe46c0fe9f7e04f14af75dbb332f62a53e4da16fc144687482b83b495c5dab85de8ed66151a3a6bf8c8dd95b9971e9267119eff9b2798d3f73290562c6f0cee211ef8f12cfec1f6b0d15302ca3bdef2d1af76b81bf2778578d9489be4d0d145bb115c9871b87f2cd654bb68164d2a74ab388ecd4c9f5c18095eb98f68388eb0b2baae5c33b5ed9699474aea7af623fb8a08275d8c1ac8be28ebbdae78edd31fb9bc795ca8d395e8ecde9e31c4b72de8f0531f44013b7e438c870e75041cc378918f7e675259e245a249ceedc2e9c1066f89f4a4c468ee7b86dc6203ea7fb5cc1d9176200cb195a4b82810432ccead9ce68684336b41d271395fcc10a54c8b073fc98dc6332dcf4e9e961b3aa33c996d08f232691bc3c5d64b1a30ddd366c71725b7d51c45b1df6032506ad7fa19583bc0dd78654ecb189b585bb3a87eed906db3c1cf6cf9e40426805d438d84868a044e1e19d53e30ff85f514e43c316422e8b5ebdfcd5de54fdb9fac572c011bc6e640692c9adbc6dee890430a262a8215650cc46f681ea0179d62dce8b9d325bd231e6d041da896fa8f990b7b4be6967b1123ca1659fe322e609636a30b9cd11fd00b3ca2dffac8e4c7c7a7ee1bd2d9dc377705238f4907c827af749e34c95999628cdc9e1731ee2f00b481904505dbf86c92649cc5d9be8b6d9834ae854bf4dce933517e73d3b149ac40a22544c0e4e141ff46fb4b64724f4be787b06941a5e295b2d3e153f7b41f08db7116cba7beb1880223ec890571dac4ace94a06f3934362f620c4ba81de9f6ad6d9d3d3c1ce91f5161b47750960d5c3c7f77721b68ee98cdddb7a2b2444a1031e95ddccde7670c36ef362a557210825cbb8c0ec42298c6b759376aa1ccd2f5d6154b6701fc5196035106e1fc8f197342e2044c6a7206efd8220e3cb44e99d399a62931571fd8bad0b38f9f875e98ac4c4a5b8294b6c124a2d61454c1175e5cebcfe307008d964abf8445e126643bda16267482f9cea94c42af99b1c0f9bd51eb865243099f97e7bd477758e074aabe1ab35c0c0ae4243bafa7335f081db0840019560fb2946c5460e95681569445b62ec7dd6827c5e34ae144dd6286037fa718bfe73ff3325498a14f1d8c3aacc0139b0c36b2a68ff85787310f2fb6be8f8a09c9907ecb65529b46aee9381c6ef9afcafb83731b75754fd2c69d8ad519af4f6f4b38e08c747d44a4ac294aabb7830435f594f84ee78584aede554d57455805ecea5fec6f510f2ab6b1edf31289f6b76f9cb8586891e8c74d5ee6c7fda854f12125032810081900b86114cc698aed2a369b3c91bc0f221fe76551f569ca1236fff59ecbcbdd8bcf032caaa74fd4a7b3781061a707a2d039b564dfa4266cb2533fdf04dbd3998e01c7d92cffce1f4fc862d37616097c5da15d9668b4d775607ca1f0c32cd12b65c3a0650c3246692a4e62fce286ddb4d52fb9fe41bf540da98a2c731a41cc77c863617df160ed23f09ade39105dbc272ce1f82db054f3fcfe3a2c4477bbb2b7a288386941d2f3048548c1333424c9f429d07b0838907868666e436043797aeccc579723d52112387cdcf4ab162c886c67a3f77147b6d988dd40470c3db510ed997b8cda9548d2a36c0cc9116235aad5f9fefa2166ca1b07c6724792abd669bafca829734ef3ce3f3fc766af8ff90ceef1b180a5001f26429e6c1cb0521aefb7e79c2de60acb4b1091d509cb7b5f40fb3400100825dbec4185630a59a5ccc3dbb28b0e9ba0031f47eb8b72d3ec2ae2227fa6374f7a959c0246ea93b06ad4998585e2ee0bffee83a8a6ad48bac4f9e0679543ba1850e4eb39040fc793ebcc71fc4b5cb46066ba4794a1266aec09c8b02145d96f6e8004b58177ef07d435a94c353c14662fb5713b906bcf30c32fc8503a7327462e512e5fe5d123bbbcc33debf57536ded2d6a1bf42462492d73b4bc6aeb3bd5605597fc8e7826ba1d3aff2e6f27355d3d730dcb2d12132f2a122d58f8c44375b4b8d61ad7af5fde1a47b6c52df01824048f2c246a3f1e058e445c1bc2e0ef03c5f0610812a5be20d56e986ba6811e03599381c5c5d7ab9218cf8e632cd4c23b15f815d391bbf04defac389406580250e3a1d200ca0fe41d5c3495cd86883ec436874ab42085ccb5c52d14bb4ee79a1a94f7f5958d8788bd7ca6654558613636b896738d6bf84a540678e44e6e5239d121e21cbba63360583de1614cd601d67fd07af97a8233a07bf989644557188975cb866717a35263206cb25e8ec0327749ea2d32fab67d18fef1cba84b325ce363dd1ad215dbaf0e1e18d9f0441de8c68d1f6166543e5649bd3c71857460684a2e690f4d20fd1bb144165287a64461e27eaead959eca15a90ea0b6ce37d5dc70a20f36a002f3eb50829f10cf04ac32e530f9806ce2b150eb5ffbfbec8160fd3cbee4e64eff030a6561f07963947c50182d43dea9691a18afbda174ce2e6a815aa329fef17eea14e52aad3ca2c6a78bce68e503e31504e2af50d8823f253d575408221e96249b593982d60cd478baf9c6b79e16d0513d17eff6df4d68c28ecc7474cd5140976e20fddc14127d74da1dca7b00ecf48c1ddc2507e3d15abf647b7f348aa373726f88e6b35e3cba21afcac6d8ee42d9f3b618c9acc5061bdb9b3fdf420744030d0eba2ce65c469fb10dd9be7fa009bd21eb3d2b2ae324d8f98b9881c75236c55e7e19a9c645dd1ef3d23afae307994a8a75d155ba4027bfc0e77bb98b9a1893c3f39579816aa74c45ffe6501273dce876d8f7aa98e3f7ce2845aeecfc87589d3f652267d7173432c6b02086b6d68f41754d3ac8f22aa7b7d2066b4c7ee66ca4808b08e52d6893cb2451d507223e72268a3a3200bd460e20f4f7b888ac63aa34bfd97a5eb499b1e405188b0dcfc716cf1dba797838860a685921bf33284f5bdaaca04ddc70bb6b5d13ccbd303d8a3f035e4d6a34683c066c1dce8134dc6c811539f1076435d735e86840784fb61adedf7883a94b84355daff24118a104dfe147e577e31db435b8d910a4809a285d3277229d3cf1cd014b9746581e150fd2e999cc0af260a0f1384cd938a893265d2634813c95664fd67bd4ff7c1168135b427ed6c96ae6a6a2da7bbf3b3449cadafaeea77540497dc95849556d204c935d9e3726fdb7d46b43ab5ad68ef718bc53d5eb74175ee63681c8b31cc9142fd0d96aeb331f9b25961862ae4b85ef29ae17becf323a8416224d7814738ab2bc2e1be552aa344ece5eef87330cffadcc6088259df84442d4439ffe56c051d4a36f84344c54f7cada583dcc311f57b0431c7fe487b3f90bef13b9ea2758e832838f0b9a4f507bc68299b2b87371180b15a7a92e2bce1da064670cfc5e9aab39c839605d9927ab9a49a7688a8cf11a55fec15eb6d2635cf861dce4a0852bc84cff5e9df65f84b5c292f97a76745a35f0ea355fccdc54d1bf13e4a3ef6bb002b5d6c0b405608c3f412c6f845d4d79dc8301be764ea3cd7238937a2aa9e600686fbff9502ee7b47197e85927d4d1c40bc52401ace840cb9ab1720fa2eefcdaa63aa886b4e8c0a84163f53decf471340a566c71f16dab60a28b281ed0be0c583371f8bf6c4d735d17fa78fea6b3357af4ed82c7399beab8cdf3d597aa1b70a3e9875f9cba5fee22be37a23979d9b29e2b1f55ff323b9e7aaafc2d65584baecd2e1160889b813e77248d3c32cd581f5bf8dc7412ef3c6ac03dfc2f8f86dc1ef8a9c6835d3b9a0a27559407cd98f44d0d727c5314f96d001971190611144d3ae566c0a34cbf853714db97b3d6630ecf2ca15bba21d84d215a20cf179b7f86de78ffc0a9ba29dc49776b0deef40d9309b05983266821e60d430fbf0a36fab96950240d3e94f6489f0daff1fd5b898c9525d9c521bd05ed5889a80f92e15726ece8c12c1e83fcb3aa91f9ec6f8518e46c4603b075d725511ce5bb900df0b764852c965636d08569061e93966cebd471ac66d27e71cdc6cab40ffbec4b2fed642154a6b55a52eeade429babec42652d0edd2ef441d7e9a51d6ad899dd56c93c293e33c2a9416b32e99d85ff5aca0051303cc65a68aea0c635d1ce60059921b2ca39244dde20ffddb239d6982cccd954e7f0246b9e2dd3cdc1a5caef88d3b51b712231fc1bde755dcb5774c75556953c8db240bb4bfa461dc26afb6385a4ec8cef64302a796bbc589800c74d35a47e8309ba550cc3fafd1f885f3392429f0a7611dfea855e6889773830b175769d11896c13a265acf99d8ddb71f9234eb4e508738a53c77adf1a28ebe71cd878eab1708620dc18202a372fde0dc7942c0af8c6e9eac2707f52b4182879e0b2bea507fffc067c3284604d1615d4c20f42f1b422f617b83c1c253634955058ffb56aef680cdd243c094aac9b255a667e106a8aa6ee3f45bf57d18b0d423053cfc6de6bc5c07238a8c13496d754ded5dd2a6602d7c44fc628d45dbe64e2989ec928f0407f29afe94805e5b907821917bcf34a9970497437392cbc6c8c163ddee9e8b726352255f06a8b1c2cb5e7aba23c355cc05ea8c3a75a9e303b324da6e8e862ddabe2ff39de6a1151559a9a9120dfc8b00dfc4587ca9039564d124173cf658fde66301c82b66bce38462788750503fb5bb822bc5c228e711d9d8f7c725af559e33bc4fb18ba0d5087b7b7e857f6f564435bef3ce3d5e21ddbf4e2b631995ef684abdaa4c8c8648b3c570d1d71134d4ec2a1aa76e92b41726c0c877e4c0667b8d1a7feb564e957358a6ecbda97a2e597d01dd59b18e5bf3b5c1e09b67411ba8403acfe2472562112eae9266f30eca828a63c958c055ef2eff0cd69dc33663d7a4dc26123a1be22baceb34cf9f06c0b676128d50e6cc367a4386ffbed747a1a1507d72396072d0266df8246823a9974207f431180ad04333b82c6d087797629df1eac04edfdfdb591436fe0f866ed850a64a23ef07d672e8c00f3798e72c42187de79da59c1ac4fffd9b7c1644bce5f173b21fce08fdcb67fd475ce3ced9e0297067f88d16fec4a1ae0110a443a477d5d53a2c9d5192850370cfffd604542ecd1c85d0c6f0aa1084fd94de9871f85a67b19020fd97ad20aa203b6071126d4d31f37ffc69bef9d2629175cd1c657adc8e7a5940a2cee478f387fcb90d0c4048a59f80d2f76f4cc3d87740a733eb73cdd502d58f4f9f7b352ba04300540d3fb759b3e9e1295bfde02f548dc94af0958d66bef7ae73406a3c681b5583cd2554930847bf80abb489eeb839f5c080d75668abad9f0d69995e6ce0b75cededa41851e246c5b72f2d4dffc949f4f8d6599883e8eb40d751d4717cee4080cb047f02678c8b3dfe4138f89a5ee17b3714c8c8fcb65fde83eaae702f0609d1ba28077919b34678ae3b04fef98e1cb58d76815717daa3907d744d9034fcfd802a294ec5fe1568a5e9b9bc8a480f552c17ba5d703c4f5cba4ed5a6bde70db3f48f4a37c1cf1368458330797268e11cfb3c7d856be11e7f5d1bfc3ed45807c39279b88c87168332036a1fb4c67b782e67c3d8e46b30c487471ac52163d511742943712d7e01c0f3dee7a0b3f00232dc632ccf422fb9b1c511c334941311ced6ba0877b3cf02fbdddce8d1a2c604c9c8cb2881f67a759cce172e2a7fecd546679a10b44786d9b637a0e687b454ac52bb643aa88f7b63417be1efdff7c3e2608612e148ff4615207d7febd9dbb65385798030b526296c10283b4a07ca2b4364099368cfda493974b85fbecdca7945a9909bc6fb353695ac5a2be33a6783827e85f26a8970b1582ef720b587f507fcfc381ab5f2097bd624556d5fc9813496699b7905cdd6ed131b5b5fabb85849833667b0964fc10739e8341149ec8576dafa256f9dd30d001ede520b81cf72eac89f9f169b825c13ac26b7089265ef Params = SHA2-512_W16_H20 Msg = a2d4a1d63934c13b4bddfbb7cc62968274c785cffbae18bd66fdbd78fc19c0eb3603c6e2ab5bb07adee56a40faadd9a47d1864ee180852e29e26d8173b8c8719809699ec1b53dbcdb8abe4d9cbb2831d2aa664f99b56f6bdbaed7b25dd40df0a27ac214c1ec077ce04ba3c3f0b981b2f220e27878343bc50034da0d8e3b1658dac6ccbf6ded66dd222702137e694d51d71df2e84a3b0501b4d9ff2e8267ba9c60ba77910ecc61df79ac8a51a98d53a7c79477f4633b96a8c7afadc50555381db3534ba2c1e5eab1ae66dbad562224d6487fe0bee3686eb8b5425ad47773319 PublicKey = 060000069688212fb7e7d9e42aca5d52a9d060c5d48b1f0e2de8ec0846e9296de363de9986862f3f77128cfc130bb64c4ab672a1ea6bc4689d2a359751bde229cddbc072f6e20bed39db09b035f7f07f485203a2268e3d93c182004a4e6921b9012bf03676c960096880d5403785ece425544a4c82ce31cdd3bf13f33365d40954350d47 Signature = 00000000000738c44491e36400fe9924d725856503409142c67333dcbd1246c64441b9970ecd617db6882bd3d583464e4be49b7f129753838c037dabf32ef2798597db5759f8b6334f64dc4558a8cd914c1953dfc529feba9d531748e4045f22f39748950956d42c805117e54d6a67492f4d252572c06c5ee1d715e7e644cdd6e432602cb94d8a67b4af676f08e2cbc35c0d56440d070f034e34c3f6fab77fc936254ff818b05805a2eed14f93a438103876ed99a60daeee9e700877c8827b2093bda243163f070c7383b9c416c9556fc48f213b35cfe776152c9644a90f1c7bc0757c8ae457724daaab835f4d5a42e5820ec95b8d722e92ac16776fbe99cd063f9bd83e475c7a3310dc0595019e906e9ce43d13bc02df24bed5c2e7ca751cf332d00cd2a87d6bbb0a966a21759eb85bb70e71df0e1a7759e01294fdbc2fe3dbc722eecb56596ab888fcdc4d199e431629e6eb91bf92a79291bce6a9b7a11e3c8b521bf9fedf856386e7ce7d11bb6b2e6a7abfb68b7cf781dc65d5dae603a73fcbbabe66014da3bf8f9646d5b6eaf25f157eb06ac3b94557951d3dba156a8c93b23012611655fcfbf97f41edb83e68954f4d57f69b30051b364d9b3d9a6f0a5257e1fc9c40052524cad36f66e3e372afe0e972c6caefcba42c5db780b9bab48f31e0b7f4d21d9dd359e14c0d8a73dc7bb1908fcb2b551976dbce5f03ac3625b14ad0c83b68dc53e91b3d661e0fe6d70d50f7a7cad51f76f27bbd8ff2ab5cdcb6bbed8cec406e7b0dcc1798347463ac6e6c375beb003c0b4fcbc229d4f784e657253aab55e8a4006458bcf796162f9bb9b03d1cd8baba2d8cceef8b6758c42f8c7185c461da99e9fa5746063a1463cd6800762cdbadfbc0ad990caa6ab8897b18fe063e7b8cbab5b4968090011690ab0284274f0bc4375f6583df669fd03d38d8b2e3b954a5b36d9eec4084381f169c3ab5a43f245cafd3bdae2fadd6f56891f07103f6523533d9e6fa29ae77831ead3adf5f3520ffaad3c9bdf3a3952e1bbf9537c0a9d9eea0de758fcf92d4e362003d7f473bd633dfaaa95e6135b031f1185b01d9c4e8a62283258fe2024bcabf3439dcca884a846670686e2ffbfc57db83a286737da41452032355cb9ab5540c7dd4ed847997720060999ba85ec7b408f0fffd63f3a43bc29fab0168aaece68c23be80e65e8d1ce2c9d0ea5bb52eab7bf6b0ddc34cf22b5c4e7f1963391cfe3b9bd878210344fdb3873101013409733fd79cb54c4ee3f27d236aaada01c8111e781f38f046b55e74ef4a0f8d222d0c86b1ba20ccc5af96de39f9ce3de7da10f1defb36d5d775f7d2a957a5edcc40fed8beb67a4208d36bc388ef89ef4fecfa6c2ad9a3875ca3693b74535c47b36016d6ca42efbc9f2dfc53672c723194430c569bb5e5457a077f52f45512dcbeb842fd58c4446d6c768b975a970fbe86c07f3fb6537a9fa667ee7612cb82c4aafd88856a61c6393e7c21694546456e1d93a9b7803d563708d0d46d0e778990abd73115536f28eed31c4c45604c13ba581d0d7ca3b6e8c99fe914a497bdb4750cb4265d642b578d428ff5e720f83923f3507453a8cb2f51d72e261ce393994a990caf4bc5e52747297038cac331b51e86ba29b792be4cd15d787d521e8d08558cbd9f4e877924e19719c4404c94fd5311e6ec168534be7b9e4dcf613bc607a9d921e30a5cd1cb7396af6d32e632649f08015701578b28a26c912eb689721b463f23bf092f167534b9590f87463bc68bb9f61016d9588f7cc55f219a0db42d0bc44e73cc8f97c5a6c328b3d24a8de8c6c71840b3cdd849f07482e2ea7c3be30094e2ec9d86125a2d4a275098ab086eb2043464b4ad8a542cb6740466bf0010d5775aa72c657f828ad26bc98f81d11da0a2a5a0aa742b7a13248e2eecb22263eabac484bea6a0ba079320adfe29643e7bb6dcca928c68c328c74a136431ef4f56ad85900813df410eabebb0c19b252475b1da8d85e8b02db2b3d34e6b07a99d0e636662f4ce34bba65ff75a3748d0526d74f72f48e077062fec8a77b92b19090d772c1f036a0129fea4cd29c257fbcbad9d347fcaff9957843b354d2eec2bad5932d39aacdef576af74879a1d0dd7661e353a20fb5799338ebad718c9a656164940ead4ffc9ed3f9e9d8cf1597aa29f3a26bb757f6cd67fdfb8db6aee4eda7b8b757c025138351a05c4ea6f0539e7f15de2e1cb76b500b8d5d3433e2616b5cfb697823e9af5918bee3b4eb7d2557cbdd640941c4e168411ef53742c24779892ecc4df540c2d4decd8d72223677ea606c0ab06e148bd7a51bb318c72d475e7629c8a13dcad4071f1652fe2cca9365b22e4ddc6c9cac83c78ca200d067e88fb0f84c91332032dfe770951b7cbfd4d1b7922494163c751379db65be9528e1293c0fca9313d4df010f763d1e473ecb3e2ee553aa9d81941b0605fd0e05bf2ac9e557f7b6badd3c392d32a7c31621bc7b4207812393382e8809b70c6ea2829a9d359d59b40e3fb0650bc58e4e89cab91eeb9c53903781db54d63a73fae3c85d8a5fd74dea90939dd6ae7234fe2f632730a8adaf6f7afc9cd922e76ecf60a74f7371150b39ef826cb3f27a9611d3987a127baa99778b0d5c4a7b86350488f857a27bc99836084f5140984f617745216b1fd9bc5eba707bb33de8e81130fcad4f52b2a0b46e499a5ec3bf2c1411dc7701add3f4a33837a5c5d8467744344deb21b2267fff47ccd9feba8a4cc13cf4316da3d4802e3023f45f51ebd69888e9f8d3319fb8aba7d5b6f12580fb3f422895c6537fe373e11e1a558a0db6ca94cc079c640d2421c5a461969957b33a3efe2e4e950c92fee37c4b41e64cec5c4a0e580d7dc3b0ff9a4a0442c3f3edf021c77973c39fc349a1e7bdc3da14203c02c5e39ba8938c195d40cf25286d7c0d79bf8ce71b1d2324d663d985c0f8684a5190c556e0046060a1d65de3447f6819cfc2b34bdfcb91204c00eee8d21b5e821593a9f2e3089c5e8b34671e4a224a2a522009f7280579246cd67bc5903aaed3157407df3be99f51d522ac178896df9d71688631533c14e34f63f75a8a0c367b07526011331d7feb85669542572988a4dc4a4ba188c5ed70287ee1f7ce3a60f5e351a2b4b4c2e03c975e6a8b578873eb55b7f74fc79091170c8f6a19d7f7081537a9211b2ac1f7ba44e57f6da828c0ce6c2ec3804076103e52e4a19dfee346c9e4494d5b9fcb032715eababf40610001ea2a6f64dd9c328e48e3e3ef5b0866db8cbcfea0a082369cf22256efa7222073dbd55f1fb7998de5bf600291efdc2051696b67a64f0643bbd96231e294fc4e3b53d3c9905956772f977a4e57f0e0f4995707125c1534957145844dc67ab46c558f9b2c95b677ca39c1b525d1668f1e9ec16be0a24db8eb9f7aff148d623e572aa12d3e05303a323d252877f892eef691710a12ca265d36d84df29bf54883841c1c79db9c9f5b8b75b3b389172f7d41d864b7f4b84965073528b0c806e2559a7772b741ddb12fa4f6843dcfdbca9cde24a2ebbf9c080d7ad304f9ae9f969a6015ce6689b6dd803bcb0146de770d5072b01f5cfeefefb5dfd5890388f4923387b120a9b7dafa31dc4ea2ee766561801c567599f66006e1dd3be484a3ccaac0420e58ef2a79d113afb36ccb1bba4f60cb66077074d5779556b15fbfffdf31864674ed87d176f06b2e5b47d799bb66338ebc63503899b3b9de6ce2b940aabe108e99e6c2c791a6c173a67c5478ba8e66b154d27c7dacfb28c08cff93ad9327ebda62950ddecc400f4043615f0fe1fdf0c534cb018198e0ccd91835db0e8c9dd4c3d23393760160ed209deee0acc617d392358cf0a991a9504486ddc75ab974a377bb251b806665f04172fa9fbc4edbac67a59bbc8799f7584e962ab9f3d32795a977f76233913d50a6cb5c091d1952913550bfbbc60e314d542b2875a98678eaf257614b592349420b8c6d5421bb9ea987a7c4b6d8753e67861c9e37ceb0cf7476e8400c7db437ac23a70659d70d69e1e7cf44fedb14b052d2eab6a312ae7716eb5bcc4fd4be48fd5ad91ef09fa7fcbf95b9387c8d65636de22fed0f40ba1167fdd633ec98ae2d2072e56cf554dded88f4dcb0d0171b4d14334ca56aae324fe5b52562f67716086ade1d1275d2f64b109cace4dfa87b871860a3c1f1effbea16e54427db21894982fa6a33646de4850db1050248dc8d60142e1ef442fdfa99527a4987ef8d3e637570fd8474a90aa49fa3f1129468c8ef2d06d0835fab08f48c58fd3da767f3f34a8ff99a9c0a8b236198ad0b62dc09164dc8d6cbb2a865e205fe7a4cfbfe23cdfddbf69e3208cbea18df5a6a148f4f0e4dc6743285f8efe6fca51c2fdef3eac848ae9c5721382c1a30d6895646583fc54757e765663ec803db49cb2193345d60c2c47d06a57818605dd156a7130bbda4f59c53cc53b31aea18e277d287e892bdde69114107ccb8429daa7bc7ad4e9ebaa24651bd94df2c94c0bb881ae16bf6a3dbc22f4ec2ae1d520eb00ae90de7fabda00d69d7a8935b7330aea763a1f3f9eb5642c374a0936c9ca14c6945a90610baec9ab0a0101efe0c7530a02c1a6c818d966acbada4ea904e225f72df436515b36d90fda40d11e4b1563bc5933242ac5f3dd6fd33e49eb4568af7b1b3cb3661453f888b7b2821d1b4544cfa7468626a73bdca3ed32754668e1e1552eaa4562e2f528f2a242a5f84af9d47284eb09b71f04298cad0dcb1edba9916cd2ba14e3e616838ac7810cb4373251458e5888ee90dad1ef0a0377dfd323a5a718dfd0c3ca9b9e37c3b9f44dbf0827e360e8cafc290b52bb29ad4e637b2032d2daed05d8c0cd443fab3dde1e4828bf16a2d9ee2d76f8b1c3e3199d8b14ce6e3d4f80ae55d41111d82fd8fe74ba6aa77a0531e0ee3a2abda911e7a4b6f1e25f2c1f703860e445707107a6e361f8d5561a375642d4929d81b04ca47647f4b2a60218149dcb3e17e9d144d9c13a85e5929285d0c0db3f76607ec48456e06fc3b0763c4f6e4dfe4c7336bcd0aefedf5a1b563375684ac746bec0ee15ceb334833124e3fd4702882ca3b596c64f80475b308db3ae0d51e1202c042e46506f9c1812e7823571fac00d866df5c5933ebb33fc005b7d0c28437eb1f3fa504e6219911bf43d0d97a2cedcaed57c93697010093512bfe7251884892f5b2688b7f303471feeddcd85959059bdcc85236e9b07976a3f6e2adbe55e12736530ba533f7fc7267bdc9feef905f326a844e911b43c702514f862a8bde93a2df4642926b26f6856a60b6e844c0d73e65be70d3c1ff99e4bdf3440c8275fde413bdb8b39a6585a266ff7ddcfc73f5b9cd6ff2af97d086dff603ebce9274e7349f720306ee2d3375a56e675888db957282b7676bd7cdacfbcf10e7ce9b7c90f0c1db5da030497d649ba237244626e29f9cfef35bd8b67428aff32a5231a9af68fbbfd884aeb13cafd310bcec008c6327429193d88e34a04fadd0812ec9c4448cf1608bb450a72b72fbc07b5b128249bfc93ddced873053c6b2b73953f2474cf20be2c4089954394c756441642039f5eecccedb298ec038dc464fee37d8543a69c6c1f4a05d8fb7d9aa73d55ebf2defc49d17768789d83c65b2157a184af5099b3ee2850d85af469489bfea4b9783bf424e82068d3c86b7b815b69a1f5ad876d71c73d75eec4f80b7da7001e6e556fb9074531312d699540e53ddbba35c867af2e426c0ff0c05e842ab82ff81488b7a049ab3c1053cc519d7e07490190ecddbbde03cfc92f47210f5a8ffef4fbea5925cfb55e3c269634031454d096f8f47dcd6645a22c146022cc8a4a205addae8fc0eb15e40ef48341c8d07ba9b7efbc9a34e1fbdf8e795274c85465326852cec7b376ba80c70115b0bbdc73d6ad4dfa2de72506a7432f0a376d1e8f90048b6b0c6db33c2d7742badd314177333e907581ff647e895a2a26c253b5a8f593b7a46fcba588987dd51037886b8f331a416c1ec8b0bbe9434bc1f5d21a227a4908045c369bccc6379325b3c2f6de63e1959c5482f7de9df0c7aca11c8c4d46fa37e397434eea4099b2731f3c83736718ae7ff97aad60d5c394d3e9980b56d231e7e6713a302712384263d607a53d6ad2fc8c588108836f1807c242a22d72e9fcbb553cefa3851efd55e36ecbb90f56e668e8b7a69a1027556889e6e1d27927f394e74bd8434eb93b598ce582f764893016c8e5338dc4c0712ffc1962150a162aafeaf00759a1f58e1810f41f00fd795426c201d48de7c65b6252993a830cc8a415c8088453bdc5b522f54e261d55d74374d79f6eeb99a2554276f3dbd4981ac66cc65aae8fc3193acd465d340743111955d6d3c28ecfca50214e46d5e6ad1169dd0a25cecff8acacf463ec2904087ca767dc039256a553db5d616d9bc71e8e423ba74548fe137f6a37bb125cdafdabbca9b9521e257534badfbaec0ad27b71bff7e6d6ace688940e852fa1c9e06bf4df97ac6973efef5196f408ca869048e10797c0d1ac3ad80ffe1e55a28a63547bb22d795a0e44f51553bdd18e65057f6477605b2c69dad5407bf981543998fa752eeb730363f1557f7a21cff41aa443e5d0651a218f9bcead617e1d5fad59e16c549f4a882ff2509b6b66d6f71bba6c303995b1100d53ada607e39c17d926f6bb04526d90075a84b977707f6979d4f3f3ee1dad0f76e9ea375f4ccff2e3de37abb8edc5a32641e5bb04c964511ccfc9590bf302193186be958b362574e0c69c28df9dc7dde2992e259482932c701556080dcdeee605a82813cef6e3740eca6a6c1d64d12f74e52fef5c77015ad97c61e4a080a5019f2536b0964692de3b05bd4194c0c04bf72c300ff207d247ec806b56caecb7268f9441cd867fc28ff28cfce075e0aff71f3e4aa2d14bf6c2675700eb3f907981f667369c6ab76c851f726c3f91cc3fa0732753579ae223ef8e43007ed4282ba84814bfcc8647334197caf04ae8a0aa3e922000e104354c92e8aa08b5533c0ccb40e1dd2e8150109f631b83f26ad78dd04315a0cfbac1b3bfa5f08bcd0e18af93a18381ff2654d9f02f162986c9b2fef5ce66222e66c045533fc9e268ca0b29577dd82629342d99172006b05d76170a8fc0fe63936d62557f1fe95d7da11bbbdfc5f841b8ca7e255910f430f6a41e9fb451328cc852468d1601f18f3664c6bddafde7af60d034bea692c65aee997ad8e50006851d10110e768f39759b05839656f204b0616538caac1350edc0c8d7de9ae787386095c8ad227fb5d80617bbe4c4f9b941b2742d1a8c264bf59f284c026f8d056b8bd0b1e5c39f380304bae699d441244d8f452e6b99b142a1635c52e54a8e536eb5b97443a818485f442e93c2ab34bfafc99b3c752de30688e6634e5a35b904e718a63895c5daeeb74a878f1211d609c4bd7e36cbfe91095e3d897363a7a5d977eab0095c57daaf199978379e41585c333ef862c6dd818c9b74678210dafa07f12ffba5b8db878d8250c294aee52de9d5ac505156715b5e8e2b0e66c42acba5080eb2911a22887d87aad7680205dbf884e38d02251df8bc97a13b102af2b88b3a1dbb1238ec32d1725a4e91044298d13cca295d9d5cbcaa3392e0eecbb4acaf957e228156761016f330c0405baf198e809ce600319bca48227e9084129fb7d170ccd60d8c641fc51fa0d1d78e054e819a947c463a1ee7c65f671ce381155e098d7bfaab3108db331deec5402712597f2abc6e7298a4a5f4855cf15ee55820eceb2380894e58f08bf1af795e40727c09b25979d7e290a02354638fcac8da08cf50a831066fbc1745d95d43bc9f63b8d8abf6a7c1495b7e7761a586e22b875ef4fd0cbee41b01f10cdb9102ceaf8cd45cd2ee44944c592226f0257d515a78e4ea330859b7cce3d9c02a15d058162b9ec790bfee4f2b9c6debf625c2109dbc5db5cc49577533fcf90da8c360fd5a9bb5ed14a6b3c18f10463fd96dcbbf8588c342b6ab86f1ae68f5d381bec8bb8ecf243862aa753bcdbb66b994019c63b89358779b41f444ddae7084135a903b4d50ae74b4d20b80889cd6cfd6930d621da52258dfbbc292e0925f80cd28caf6daa88c0e0f3cc202e511bc1fa151aa8743069057de5b52757ad9a74f74b9ebc660da6766ed5b9a4f965beffcec54825172b900539f40666d38344dd853052ef9852a9c412e04b5ba78dfe2fb8f0e2876279069641d2c0ecd4bf018acd27af3a973969bdba7b3b50086c405491972ef3eaa4dd5a7785ccfc662c0a90dae52959d51cb32e81c904a0a93ab330b43514c8898616d03b08cf71c4bf47ef3c83bed8b21bb754e552447dc5012b87e19211d303ae4c6544ac9b9abe388009bd1caf3024583a4d12fb137f7e3b5a3d0ccbfdb27d3f24bfd6461f820cbab1f5c9e1f4898d0d5e2831282a308fc87e06801deca485757071ddf110111dabf668786d33b381b69a435ff48366cf9ac475119e32f07eddfbfe03d8e7a21353eccc41671c61f03d520a6016b7dfd7e8f5f13e11d2335b904e02259c8ca10ad4a99d8c7566211cd393ed6297317eb598b76793a525c44caa103c52a8e4f10a02bda486610864fc2d0e89120e6fa04f3f1a0762cf1eea3fded4ebc910e853c2525d36cdf5594395c04dd2ab41896a2301ebf050cba075256349879d24896c65c37ccb2051ba7aa89f7706ff4fb80a0def2e1ac06dfe7db36517efcc24d9e0b6e29ef1333edb8e313fc19fd8459231e70a56712dc2ba93c55feecd1007815ec6f7d611790e07b840da856363d267297b80d7e3cc7ac868500277de4d9bdd3f6d05e73007ef2cd8d3bededba82a2321293f353c0b3b5f6bf5dc42362427b753887204b4bffe4180e02cd589c2632de7c8674ecea823ff3b9132f5eaee97290da783e263db29b0277d99522f337422eaf9fe8caf50a44d929201f7d9a946c60917e3a33e9da4a70c9bb917c14c5634ead83d994f4c7e4980937c1679264b400f8afc0b5285c7335b6d75f1a1d7bbac17154d75b71890d077e18e85bda6e571ee2f2966f37be071e55bbab2df69125008e1d9c9cf7a6848effec9161c36689a0fccc83612df4e738e9c9edb6545ef389398d8d6e51710b2dbbc4dcc6f07baeada16ea2ecdb24eb74b6b074670a437cca3ca07464a694849234e76c3042d9a3159c33df3cc5c710253753143fe0a10b2c22b3aa46f88a3028fa9c50563f32c0216eed0670552ce466bb1d4ca5feea43622878838f443c539763a89b757245e45af692f35bf9b0bcdae4fd4df783db48d4db8324b3de94064b9594fee3760669d54dc62793e10489e321d79847a2e116dbb13281c9c0974f6f4d74580ef67ec7f2d9b1be99996d410185e37f4fe66927e121c7eb5284044f69e7306bad4ce9d09fb5202ad7c7fe85c76f0a3e91276ec6ba5ec2dbafe06b01fe30c061df36d7aeeadb9f8dea42b0f6b80afc6b6b5469df8dcac8ac313dfa66c904909caf4a9f1f77a41816a14ef1bf08bf27a1bba44debb5295e7ddeff19446379a4819eb46eee94c8e8839402118d7373142b960417ff567516da015e29bf165f5317a6785c5fb9d4dc2f1dd60c51070aef1f0c1ec3c5b429d8acac84d0a1de739ac1cd90c73c732ffab10c7a42e7a9cd9c05cf250637c185363eb0618cf640dd6aff90f610be026226b8b2c4b1ab8f15a95aaa9a2b440e2134d271ef6e34057c8c979bc565c889e9a0feb064ccf7e7d56958ce6b6e76b3d89e0da1059eb545ec636fde232acf3d6977982d2b53b32e8ae4776df25d064aa20aba297d10f15c3f2554d3b080b3c53c3aeffd61a29fe80d9b5f0dd03617aab6d0593cb7b0b1302a67bfe88c28e6c68ab3ddb66025dbb152d6356577e441819f56be6f89d9fe3dc12c4afee48dc249c2ee58e055c782169cfc5631891af320869dcec05b7d4f2aff2719a0248282b6b1b83fb3d13a9311000e6dce747368168f4e516a4d5155496c9193b8f3bb2f9d603696b50127f62c8e28413f0af66b5a83ca81c80468ce89e0de53f1de0eb3d823056df7c1c28083f1f8309c626eae193c5200969f0d091a589b58b93d2592b60140950c7083f61303ad8bfaa4b2f05bffe7e878a7ebcca46b36c492f3a51506a47b6a41353d31a3edd611e863c03eec1905b0be1796cf3ac3e380fed00fc1a9b9489973b0ca813496639ec8c137ef0cacaed286c96fdfec27ef222f57bf7072c447477dea0a24cd3acf783b4b3816e4e81049118351d317e437292aae78a2cf0439b5ce5537e66b8ab233e6dc0b8fb1018850dbd224e56805397f3e51fc5e42c3ab1c8d78dbd5ad68b01153570d5decd486186b1da43ce075380d5dc13b8ad6c0e8a459728409068c413f5b65d4877fbabf542225a33f966d29b1cd0e076805f64f939407434a9884aad488e9a1bf4919cdbb5f2b92b331bfc30c04f9ee5455c746ee4d4293f4d02fa7327892bad806eb97216240363114626ca1f97bf9e0a47844ab09eb41138d7ae5d89ccf947d106e3469d203f24228a746b75cf85d8aec19e074f82993aef4256f4d5033e4a6adae5b353df870dc87d874f1d0b8ee268551447f39016cb53dd25f6b8594ce1a73f2dca5963791b0d60b61f4abe714f8b87500f19561ff571e92e30f77a294c47b258a4a97c48744ff38b08ab9f7032506a323d3f206465a7778f488db05528aa01739c431c9bfa57627c5ed4261c37091bef7139ea268cb71a26b7249d08dfcf1de57393c9c3423919e63af16b64e0be681453dfcad1a7c0a57ab42c8368b7d474d211a5254e090bbf7e8551a83adb4fa71cf7184a5948ccfe676b25ca1f868e167795e3159f3358f8a7e139528c7300d3896b028126c6f9ffd0907dc1377fa571c258c53508fbb2e75c439e118b4dfaa68ec9d4b9ab43e5703aa250eeda636e74ea6ec3e85fa375032ffa3cb268944ee459c9a96aae278d87a326371c2a4d6cc84c577e868ed8c571dd06c41ef19b13b9241c0f2ae677308544815e97f0e95ed23e72efb44bedc3a7c7fc6a2368b873b9ca8ea9d4ee06e5d1328b1fdf60bdff342bbccd970d2a73d56cf5c9c2904da806d3b5649830bc026a8b42c314d2e6fd76a0543df91ac028c37ff4c3f836dc4c926f463e7ca576b86e78c379b835343adf1b85f44972fc7f0b65abedb593927848777e6fad5986c16f1215198188b32f9207651c2056206e3a0ceef1c4779b24406b3c83a6efddab7ec5a9eca874377dd103ae6ace4baa8692af1951bdb11c8b936047c0f8c3fac5392408df7d25f1c7f30f82bbc353fc2b3bcc1a089fc3d62d0fc32fff905da12e9eba01d9bf5c250d3bc34e6e3233c5de0e244dd89c5b929633430d70ed898975ef7b3f7c0c8b17ce6ba2697324c54da293e73ff52bc98ea160d8af22152bac12e06ed75fb98ddaa3aae1de63c335c62da5219277b8c39166fb0d496af9d156167c52d4317b723a9b75392da51db59a0722e24e249c89a5c5ac3bddd9d110ada80ed53444a3cacef0b07f71bcbf229747a47c2f38ebcd6ee8446e6fb18c0319740b9b8a1e08bd422a24fcdee141b6f33c3df5f23cc6020a6bcdee64bebe621496131d886a87affcf1d07fb187abe8288bf8479305166c4e1c14f10ff25d54b02b0ea2a920a84d0fd1f3580e6d87b4a4af06cc2c30543928f83900d437cdd2696a0760c08338688ca6f3168c4d21261fe9f53e7c39a269017612b0dcaf0a987da45a64d36aeada20674eff24e33085a9810080a8bb7dd07c7af8d2167556640b48e4607bf0879fccda3b3b06c298bfec7da73015897d437eb5d7f7c987dfef27cf9044520e169ed9ad6ad8d7bfadd0bedaf55a86e0cf87515d930b4c4d2a3ee919007c58e7df65813bee6c2f511658e37a6589fca7f333c835c3d9de7c856659490472020d26c4bd8e471861ece3244bad1156648ed4dd4aed0b7d55b021e94dc644fb9c1d79aabc4f39c2a855e791ba3d24b3035e06f458ac156b8e40ac716b9a392be4d7905545a4d7945d6dd8b3f6ac55a51f0ec9b508226118a2338ca6c25015efb418cd673655e2dd9d25df1482f01aaf9132c110dfd9a77364d78f118105d4b72086a303a318159985ff3a457594a96a0dfda2f58f5cc6cb76ab4354adbfb6be20973b8f9ae37c68a9ba59463c53793d92093e660ad6209a3a6a81f7d43105ed261b791fbb178889661ea81935561f89553dd57b57fd1213a3ae5baad10a58cf4d7331ba5ba306512e3919d92bb765701d340c036334320910013d3210cc55ca527c07490eac1fe84e6484abd26cc9ee47a510d2c2baec4e4e5bbe7a4842f38c8b9988b92dcab3bdba530039fc1ee32cab6cd412e2545a74aa5cc977aafdda5110d612ab87260cb768f3d8ade07bd84f5c5a26aa11e88d6ec9acba6750c44aab993b754c93083c13dcfbd4f4576bcc543201e96c6a3201f9f15df2180370b4a407458fdb2d5a9c0ca58df6b6867dc0bd561150bb93eb7d931bd41af294330933d132a3a1d5c4fa2dee434dbf3da9e09c593b768348a9b5bf078d2cefbd652c4275bb46f13902421acee1a429bbe2d77a67a99d71c7e246a7f5002b92d6c60c5a8fac45d974ff3078aa12a1e3d06ee88ca6f06169bb67b05db5bfecb2db3622cc717732e616be800ae2b0f647ab4365264a39471f7e353e68f43ab5eac5d9c73d2233e2dd238903c3c7d14d03bdd25a7faf6fcd1deaf94c760a4535979f3174bfb124e7f69b41cbe4ac97c2990e6e2fac123afc0a29be310b6368ad4ce48a711162376c48857acd2c68a50c5fe0d0443438ff3e3153564e5242e3ee33ac31d03bd8670ca537d135434cbbccdbb5a090aa535db8395f8c753fdee0f40420c762901f0d1627ce82814cae9fc98a1caabd7e233ca02dfe426406a0d795bc84316dc5741bc7110601d6a840a3514ffe601254c62d06c6d0e2bfdf84c4f86bce4fe170bf452c35dad3f0d019ed244298be53c634205ba8373cf1716c6b4150af05eda5979cbb5a213fd2a1aeed34ef301592571154ef2e549534769424af7da598ca584754cfbb47fe6f03dd7cb425ef8f6174baa6fdc9704f6fc4ebb40468572b3612ad96c80c7755567b95a5a4b9f749f1fbdf076e704b98188170a9d81bdb7ea5a8f13159d438a14a1f36fab61c4478ada54bd2b2f3fbd99089ac8390356d2fbf73d9dd91ddec9cb66e2f975384f4d32e39c66ee87f1252d931d2b1073ce1c7d73422049e1f53e6fc6991bdafe3740e6b58c01dd1934d6addc07b02a4fa811522f76f7a3743ba9f6ac2c3af7963a8f175403a9e7a4200c20eb4852ee1c88a2b575167eba7d0f6d2e084c20a6f27d326229dd05f9b33b3b241495b65e9274f428dfcc43b91140f9fa3920df9acc4e4c002bc739e731ed4c2619c14f8e68b8fee2a22400af31aa37ee4b073c22d48b0b2e9d96baa94eb3ca0082e90fecfdc8c9424a561fbc4f68cda33cff7802b20f21ba2028586bedb9fde64060881b1f8bd9f390dd31165053aa0e3f1035b3bc85e50e3e7abd5aed2d7fc4e0ce774a29290c3453c0184ffeb270e88794049705e5b7375606a1503cf0fd62e7021c33bcb06b1a9749016adce83dc88251bbe2fd5b3a73423817e017e9807ba75fd93aa88239f30e0bc73f4fc1d45065b5d55896df4290e5d608cb2cd7b6a3cfb159d2ed532380ad2d6ac8b74d98f7eb9bc5b2e292c82b2903ba533544759fac6c66500fb48c9be4bb373f470807e7c574a18ea333d974097a71ea Params = SHAKE128_W16_H10 Msg = PublicKey = 07000007eb07406fd6427977dd5a919dadaefc9942d787341c230dbdebde21873f76c6a538373235c146ee79856aa81051f25d3928b53381c7f35e5e000dac25190327b1 Signature = 00000000000000de84829a0976b760ef0992fe93693b0443fb6bbc1d72d3adbd98beedf5a533e40398dc72c9777b8fa784d6a985886d6cf0b2aa3ce524cb06b5f780be568ec827cf4bf2958ddabcb96630cffb31f1f9bfae66c8e90d7582744d3e62fc1cb2f10c534ad350ecfd250acc7bd122975cca13adb85c3ff2333f17144c52c086b39034f019f4a6f4986ae01eb325feebf14b8bdef572646e42b10dcc97b203a6be64890cb6fd5bf7dcb956f06e9345fb340d3535916af61f9c128e8c06b965ba880b659d9328b0260734954f515192138aa52ebf2388d2d53804a5d1f5da118d50dbdb2193f58dac49c9ca32ff4d3e9c2d97f7dafc8c392c60735111a9d1e66e01b05b2406eaf90d9ba41f4ac5236de39132551ab4835f39648fbb4966b462d570619cb65d7f6b4e5c489018ea3ee4d33c9a3514b214e8692ccc8a64c3f9e60bf4aeee1d811ffad44082a225ab8e7e391079903013ea742da9721d1cc28fb95896421eaf5251d1a0b1af2c1cf3d9e64c7dcd22c07de0fb0c854ee66eeab774f8f3dafdbadafbb7048a01b8cf4fd4782ff94f764463242862564e02477d51d2087cc5479bc8472c03cd59cab9dd5174eb28bb86da4281c9b864457d09fb60876b4855ebf0d1f65577770d78eb70603b44cf42b81a0dfa0175279db944fdda0937b6477198d1ba81370b2a03176ac3cec4368cee60548cc32314bc8254af9000c8d1e6964553338af62248815ca6772cd4081afebc6adffff5d05fde948b5c8dbd04ff153fe0218a1191431e8083cb4a67e89d71a608d0921a160cecb508ce03532c84beb8de3f8816e769f771910754342bb306db478d6f1e4f85648dbccad0b0923ae6e51068f53d7602490f4f384915b8aaf50c6e5e790512314962ac76950e73b79f84bf9a219411732fcd38c57a9999cf7e3517844967f5ef24dffd1617015014cee8fb0ef0b2d10a6fa795ceb0f411880116b485bb2bd388d2ab6a5a84c37ae35bc85d37589392268b817e3b22d5b80499fe09e509799a03bfbdf400778d30c79fb53729be53763246029803c75fba9f48c47b0603d4f2f3b797de93b622353cd6db4231fbd3ca4ae955e12f1b808fbf430a95e25668f1a3ba3b5c5d05481b2d9d5bb324194aac7a23baecd018de624cb699b6778bec5dd8763f5f8fb18ea7f94149be7f4a7879ee9dffc8e519a2a6df0143775e672f5cb8d6cd53dc33e3dbc71230fef724ec7e83c50801cd53f6f9e2ac0f6a04068f47dc0c6a247b805bf9f261c49e9837cce9cd663baa7fca7fc9ead955d325e1c4e821b116518de060af8f9efd10ff52e27116c4c6ea15f2bbbbac748c39a540d5362db7ac3dd2100940b2e3f4c6683967478ec507f4be63d667d3896d4d7a9cd0779d6f4849e698e40b1e2593f6c041f3b603bfd8f5b82bde1c029ea94b1e679aec64ea00e00f75b880a367abf9571b36d7dea0706c54a7617b1be8b2b57e3e28a853cd198de8ed7abeae34478f8c4299d60b46cb8feecf455bdd5018e1e8387ca0179e80d397ba14b2fca03f6623022e59d016499e482cb21e846a1a356e98361ca99d8c407f47067ee3f1089fbf0d1bee188f8946896edfb50ef838b0f5da8b8370645807b770e90da52beafd5a78a3ed9fbbbc1c1186aace0f1667c3d5eafc76656131b4bee811e77dcd717cbab971ea9eb2a78c6ed42658bb9c0cdc7d5bc181f79a4c2927aaeb8b6d0ac98a9d74842ebdf06658a44bda7d6a9675607e209a95481bc9ec1f6a9fac1674964828bc45b2b89e6b0e94a07714a1aef1a55872ce0c3f83015376938df5dd19e7088afe80cb0f81dc3cdc98aeac767fb11c7df566e3f85b1c38972b076a4a3409012e681266ae5066c36fb9f9600ef026eb222c2eb813a80ceb0b01976a193f87c7845b93a2175ed3def8d2de6e940545d8a3f811099b4134cd8c220853c1133e5c61faabd152884d994e6ee5cb3ef2bfc1116d9dcc639c28959737963f34a229a41b8bd5ed24417f3efad8ee7765b1673a34df57e43914087cba418ad4d62aabe334841b3a92aade830405df1c9b4df407e9034ddb96b1702a44c178a04c31acd39a2a1dbd5f948e8b989209250a29da1c04e3eb72503a26666b3005cafea095c7b4609ac8b332e60d1c9465007bbbdbe409cdabd8eafb6d212fa7197e92a3021a8b0a53d786a8ea97d5330c31aab666461c2e7d96ee9a73a68788ab1d446b56a92da314d33ef8c23d2327cc912e9944d1b76dbfcb6a45726489cfc40f4f0e4edea8eaffc6d3543537d111fda061748c7acf6d2a54e978c1089d671b69b2bf171770da7a2454ec51e650ed6a8eebe671a913be36fb3258679bae1c330caf2a05a6bd9a0732235d57af3c1f046b57e426eefa316c4268e1d8ebc6fb6e83a272aa3289a5411650b32c0585fb950e6988032d64de968280206afd192f7299ce08fe5773dbf5957c165b514c504a81cadec9317071948d2b5c4eb1c5c66953c8bc070ec75248fdd65c0f1fe2b6889d043868d7ce85f26202777af1702856e947f6b0b44e2438b7453f92fc9054e953f4a239d012121888849a30b5533642ca3701daa1b5cdd309860b14a2cb898dde649ee10bc085c600d2d7ca9e2f8788ca6a5d108526508b8ccb82b06f4f0bb8c614520c3d9adec39b4281038b815477855956dd45be13efdd309844949f322574b2dff9efd7ca0686592870b08700b2adaefb2498ce9a70de0bfc738fb40bc5ad04430edcbbfc8f02e6c262a5e7da01d2011d1b0e26e45a53c10150ca2f1eafa5ecc4355f94dcd06b0a9683689cea23df8820dedb57271ec4760046f996ab87d7fb26a9e1a3438e1b981e550438cfd7412fb127b8a5d3fea87d6201372034cf602c70038b72ed3ff7f5d4a581a1368f0f08bd9ef7a94b42e9e39cc75aea12560e300997539ad04e3ada4c7d40f6bbfca2bc649cd11e7e5efbd0585f481133546ff2ec04711a9c9314c508ef5abac421aedbeb3f95bd1ec10539ad4a448b1b14facffc92adf072dce420421df3bf9451448408bbd2681c18ed01c78b99a37425e43eb91c41422fa8961c739f89401e6ff1a8bfd2ef0c98c275785645aa21ed2a300c4f9cd7135fa6db1af2c5f6c1248d4d87baf73ddf1128e98e0fd4de2024df715d27d9205444dc916758823e039f31f8835f7248d5ed04a21e11be98f824ecf571355db28b7b3ee4bee91f81576860704aef7e3cb0e6afc4d4b09c11b6b003b41ae0185b9210713c5a9c9ca05648a0e30e9cfa6ed2567ba454b7892141dbfbb606aebd9564adeafd5eddb277c8e8883e9296c7425246c5c61468d29b4476f89ccc63c5e4225bc65f3ad0c410cb1a74728dafdc39777b53ed9a779a5342f5f6df0f843be093142fde29a23ddc8a4e4a50e006b34af8eb1a5c8488e033057f37ca96f7767fbdd65437312872f60754507b82ae629d35eefabf6d7b53b8db0deacdd568841b1372cc07845eed3036316b0ea59987ae25993ff1091e132cc2fe44185eac6b0118bf4f9d3bda47bfea95372377e1b4 Params = SHAKE128_W16_H10 Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 PublicKey = 07000007843b9e633148cb60f2d1a1e61781fafadc60ec779ab380cb5786103d1df5ffc06295d661c824c288844dfdf149f6f0e2578472ca14f920332a45ec6d2351c789 Signature = 000000000000013ec7ac6768468ecbcc6e97f798b87c2f7c293de4f01671a417bad924274d81b8f809b1b1c6f9135fd261451c2d107b18a330bd8830e7dbbb95ec6ee84806e414297f5421d17207dcfeaf51f0ff571bb2d53d3f2d943167b8b0f8747e1bab2720421633a36edb43e7689fc54278c814ed6d2597f00706c811c9dee96205df8504e08ef6faf3a2b407f5903c1bcbd01ebb53979db58c8ce9cdc01192879bc555b2f4d6d512b2003b59ffaf0272d93e4f2ca935bb3d4d8d1354119b7b78f7fa706ae09b3ab31fa7c60baeacfed0490a37977a78e2619b7c65d643704c1dba3c4fad4e069fc4e09054c9ab5b8699b4702c5a5ca223db6bc5385337d375bb98fddeca4f7911f7094a04804b00b7adf64701a7126de09dc5c1cb388d170e69d656cb87b54c56b3ea5052333cce09262571dfd28c119074a05c29b392a53945d210f12f82b3b41cf8725f95ff66f0cb3976c58d5a63314cb6ebb47a484d4c9bfce983d4cb38964e33636318547a76f06dbb7d1e81585305c2b02e5fd05432789a622ac48fad9b2b51b82796ddcbd11ead95880d2d121a5f8f197345b5deffde18157322748791e9efc37a4e5fb692878ccaaa454a78c0a9c0957859be5e235865d0e1093c711f14515578dd05f1ece412bf9fc3c1b6497109dfb80d7e2b6a72223ae63fa046790ccc5bdf29ad42f6fae5100b3e5065d2e006986bb3ae386d6618f7840f4322dca4931786d44525db4f05143855e00d19df2f64f00277a0c68f7ffd2039e95da1f299bca91691a823796e5d31625f91d971517ca7173d83bd529a812466e5d6a7c952cb5b474663738a3b6ca45b9e8dba2a9fca7dcd43f452eaab5cb2f70b6cd773430e4ad47b4ed35ffd25857979f581d6b686d06c68d67355364cfa5941c9eb38eb3a4fc0d62da574765c0223cdf284c9d92000f812755fa0ab8c45fc0c8bf4c851b75c4a37261a313846d0c440a44c0d107018e4a40cb7dcff02bdf56c110a2a89d7fb6bad20959ad4f58065c8192331e6e53ad29bb953e6fd1544ab589e87d1e9fc65d7f74df42585d6eaa7b9e189b638c09684eeaf92cc55eb62cb3d1b839a7e82bc1b2a70e9be6ab2a8b54c6af9017494357f5c2699f83c0da7020862ad1eda0ca89e6df9d2735fdbc86ddc6668828970b7e5c41b3c29abc98708499bdfd0330618376d474d6d1a00abcb68c5b31af5cae2461e2a0cc77de4cd7d6c0e6bff57eaa68e92d5a5f3dc73cb00f05b707d8aa7b45a74836b6b31e521cb09f21e51faa422492fb532548b58b0bde2bd70b116f3cb57f10d1bc9b90b6bc2578efed3be054d83b2cd7bc5b543399a6d2f1e6136f60b14cd83ad5a1dbb95a6900e18c1cb5e4c861b8376f0274ce7d8a09772ee28d1ac9e350f43f1aa03673244799982831b8098a0913ec3fe1e8637b6d64f44014545f4ec819c9976a025eea0ec70ca951888fc327859200872a53aec05c6cb05689a5c1c5e7d4089e8725dfb35820a922b0f4c931e0afdeaa964f16871888cba2eddef045fb4686c7e68705fe2eefd915c2ce5332b07684a05c64339995a9c2a534f061eadbf304b4a960da13b0bf1214970dc7e128b413f2b5ade9f07d60050cd4fb80ec9184148321a2b4c1bdd4afd3ff0811eb3538f370a40afdba2fc0a49836f87a5b89f33d8f56682a2b7d93fc26af6334c214663297848ea1caf0545defa45384a0a40f848da8e7f00e67d45eb19907060159d8d24c193dbe181bd7a9424a2c324f667f3775ae65a38b4822fe45157bce58bb6ec053f1e62ec305f58edf65b8ba65eb699f644b939e1b8d1d793bccaa7069b540c477cfc777a060a59cfd75049ff664d29f5b5acf98a4f62333f53b4e36bc5bca9a34ba1353f339a4f616eda67cc353848bee1f05082e565a45045631f351f4ff79cb0e54d202f4c7eb200189a07f571ed1d1320177511b9bdfc78c8b193223765871838dd753869bf2f6b1fdfbd38ad22d0096d0253674e888cda4d59da85d8689ce8fa1df7091258a8d31d0f4b1ab93431df16f494ef9500bc67960ce8d7978bd01f69c28b0e399cb86da7ddcd6686c19cc0bd065ff140a7f80d6ca65c7f850433f32ba844917d29408f8976913f2051bdf248b6a5444659de8caa4186d83b4c35a5f6d27f2661f55d0bff294b1e42160cf806fe3609c977f80895648479e6cbf6ea7df90ce382e1ba75ee84189222d88931b4dd9e7b10146aeeaf3879edb88f63bd45c10ca89b5c138cbe943219be2ba031a0d19d4dc0904a313c0e0f1ba55857073d22075396b7f64ac3ab80be8c8784ede8c731b58effe553ec6c2b360cc2f58d35279b556bcc374b7fafb110f7f5c146ffacca865cb899d4cda89503c6aa89e988b5ccba02fab904dce1006919ca6d1f76dd43757015ce89fda63029f830c883b4f26b176b852560cc29796016b9575f7cbd92ac111a02b530a05291100eca3cbab7799705274b7d68d1ace37a2e369a53ae97eac8d6a8117c8b2e1092784c75cfcfe317f5b76603b174f96bfa4af30b45a1ed51b66e8e1527d30241b5c3662218634c986e1f0dbd6bf781c0493f1da0b0695272c4a6e380c7540522e1bd2fbb937783e16e9e362d6411135eba92ddb19beb2be8c3d02bc681b6be71bded538eab94e165ca4a9b1058c60bf2101b8c845e19950120868d7eb82b1f27d311713d75a081c9038dcd6111727799b10660d3938f51e6d6f712db47d43c6b352d3a1a9d38742e33bc82bbc114bdc74cf7abd6e985ee56b7ad7e031b183003ea83b06592983feb28698b130e3d4432d5323a2530cb36f0890ee0d39e39755dd88d77963b835a02517994b5150be9f9b2e6e4851fc95f62d5723da8357ec0a85dcc994363399c130f7894a551509f03069df36535ad267f70392389d368e26e58a27aceeb01581d78772fe3c18ffa75f53424405f50fd89cd2b073d9ed5ef4dd5974944478deeeb292f11e57fecbf5dc87d67abc0b72cda0aae13ebd5f63a72a5e6a4fdef06447b5c37b578662bafee3ba96dc4976b8ea15e2fc8204d18e71dc2897916ed32d7339c90a334c8fbc5923f3f9d93340493f56a4071217a1e0736f22c07e6cbf43a806965e350183a399f074a849b9d29739372295981d5e9ce2b1ee58881e86653faa4e4207da8876c4912e5e5fa239d071a3157a5b469409c0aa5f09b6e82f388d407cc53ef61d89e8c05b0a06ad218625027b1423913062c53db0ec3db27661c2590af1dee65e3f754daa02244f9c5c0b52aa6582c773a389404ad816d49cfdc8d8c46245d42273bd1ea5fcf6bdb0add91ac359d3b58142591bddef621dbce853604ed68265d1af725be14e08c1bec4a808e08c8ecd730392f97aa7211be8147966a61ce78547fe042f4ff16220693533c800fa35c544fe91d2d3bffcf8ed19a1bf29164885879a568b70ae8b5a4a5e2071e0d0de1c4c9da32cc6bd9b7624c55e0c54f2d7fe12308f20c7d4e4e2ebbfa0b22ee9b671c125cd2afca3cd6bae0dee3bb762c12140573441d9e4bec891934 Params = SHAKE128_W16_H16 Msg = PublicKey = 08000008eb5c1ced2a8acc48d44c38763d13d17930ad07691572b3a47c5592c90f8a06e4a42660ce1d5972a7e617be182e21d03e990c13f0c3105464393d5fdd958bd983 Signature = 000000000000125a24464197533c07bfdb3997618a7ad7c7ec5a4661c56a32a68105337b5f4e496b715be5d6fee41b17a8f2df37e90404272f4be57f828951d416162b949ee89f0ae3228be7ce31fff02b305c9864742e5c8c141465b0fd651b618b40833cb2b9a5fe1dcd998d3dde37af018d185c18fee7fa9c1a97699dc3e4a662a560c61d82682d2f0a89ae6fadf8c436c32e65f11d7dd9ea0a001dbea9f07d97f8e59ed94b0482bcea699858c48c81ce2eed54eb423f5b7123d6fb01dbcd4a45a9910e362f80384a05c104cd444c3b79c50f25b8fdd21abab6087383b7e61f55370983f1962847ff4369cf5063347abedd701cf2491ed5304ac2be20b23f6bda3afd298b2d1b8615d879d0b5e71c495c8ecf1747e46b8dea29a0242473cb5c5bc0542933eaafddfde7dcc92d1ff41b1fa7062893af4b3c230d7c1cd0a05011c7695b259e8b3d229b0616979ac4bda2859a9c003838fabfcabfce3d84621e027a643692844269cd9d5499aca3c2d243025acac0c87b83ff72cbba13e5a07e7bbe0c31cd5e154aa15417a8cd95ad2b42613b3a0e74c1bb7d42af60a2cbf7ad3798d5a60115871163c7147fdf149b291b89d119c04214cd6913e00e0953c55bf094df5682bbfccdf0b1a476af094929e7a05bbce1a221286bcbf50d5f4952b6b591eb8017bbf8cfab70d200a02e9e265953f22c5086c576f9f3f5bdceb6f3b508e13411ee14e5bbe5836b19eb9d7eca74b56b6fa28b4e52d6f08345c0b7e7d27afce847598cd5cc07c3cda08b422b1cda4b617cc03b2869461f10af14162725da1d5d21831f2d769bbed8937d50f2d26822580285feb537372aac72a59839c72d2a76fa59e56dea60e5f9315ca8361e5701a64a528127a5824e2bff9eea76e3912ea83ecd5c49c1c30ded8506defb3ddabce544e57430ecf12d3c5860b9a8515d9d0c7096cc116a044cf4c2b8ed1b79962f0d5aebb56a40829119f91036c63aec99edb99aced6f3b14d96e42deed40310757bf839dd37adbc7903ff4d39e924311b89b30ec2ce3fb0816c016a4ea65a0942af004fd90ed5ad8c10213bba25cf2b4947fd93334413776133ea9b8263107632b53f1707ebf6a672558562d864ee065ce29288f0fc4825dd0d6ff57b2ab87208ed98593513ea1d0bcdea24772b61b927a2ddc72b36cdc4fb62cd8a42e5a7ed74c87aff91ee12ffd8e6abfd9d131dbe9364ff924bc3c229942066cbb651a6e02d561754fe573f4d0dbe56f85599c7e8d7b61fb03f8b30a6f4876c7e60bed3c94c353892e6875634b73e1f518fb0f02d3a9b8022d1076ff72be08e3d8be47a0e15d4477cf33616530f5abb9d034f77959727cd7a17e028c96ecdf0692fbdb3bc4b4d33403f42a0803034fbca578f05ba0751bfb37b57841ed208d2928c3ab83be8d5815bce372f57a779ff353e09458a74cb07326cc144a2e679553427b992640504e27629e42d5d56f461f5a53dd04f0d157f7b2f5ed8f1dfe82642febde172e092d40f24b2bfe409764d077426704f3a26aec5cad13227d1dddd8a397fa76378e7b0586fa9e854347c2022986fedc90c8b21cd4c7c837c42cb79172e795e08d3f760305000e2869a7e26a8609d8bc1a00e9da3534eeb28ba2ae9e48b23bbe87535ad87d114b5f48d25b42609063422db51d093bf66d261a827e1d92d9960b44a551a2c798c60a282a052e6b3a9f3168865f8ccc1e70bae61afc2308e95381dd0f60880206916fd65efbb6ca8d96375559c0811b7cd0d8e2f9032f0317e7148a1903d60922ab0fb76218fd53214a77988c8ae782e55118f73c04c7c554b12df149ebdfd454162b145231d8e92dab7d4cac77bba933f0af94e79a178f3da1a6471786407290ea357453e459857582be19e9c212c3c02e98b6c8e2d44149b569e32005882e38772155ea3e9a85967fea82759b2caca4b49838b44e4837d9441e047f6cd29131c46b27e33418641865c6bdf0495ab575724c500d8120316618da58dcede4791ced4dd4ef7d54dca21dd5373242bf918715838dff41b25d8eb203ea39842c29567ad3883bee174a2f5e3b1eafe1a363e262c4ea834590a64860efe4828907bddcfacc077aeb18d831a7aed79d75832d277508caf5d9bb52f8061a5f5303798376282084a9a94d058bc1bbd6ef59e7a7e72b2a8f503252185d71b787e38bcc6b8e4682691e1d35d322925b9ec954f0931d34406b34200256cad97fbb0b61f9ff02e9f3dd1ac926c5ab17291bd1229a50fd9910b01bc9e3c1a436ea29cdee2cb2e97dc5abc4f77a23d546912aa4d37a88e3d041730faae2cad76aec0b999580cd90934e3253c6890362d4efc6d9f22e94bba1ce853e6cac39e712a5d7777e89ae119b98eaf07fa601ca64e902d4cc3abb32c0543032b93a21fc372d355d98894e85eb0c3af24b102bb5134dfc736c43b34ad6f4bf51fd7bb1bd2f22dd3b7b6b721b62a62967e8a7324da6fc04e2dad5a22df90e0585e99ba6e80a32aa64f170896ce25160e163ef5811451a5ea293ac69f119d273608dd07855281a6277afd92f7ad522958333525973ae31620f3a9331c180082030ea5a4dd45c72944709d36117feec0d5e84fd4e6992daae3043782cc4dfa967a490e99be5b0f4fda47d0990509086b59264e29b4c8d6b0b2af6ec6e1fe82127345a205369e24df2bbf3b33802fcd5f98b532c26286d12ff6fe22c822915d7858709faf4c40b73f9cbeec75d7d64de40b5e87092d93ceb9d56fd8066e1872900dd7277043f733f8c670549de95382e0dea7c3d14841f8ab91ba1fb65246aded467420341890500e68c0c8f2c5d9f51cc1c7837832ffc0a397432f2fd2a1d8bd168d9b5cd6fa7dcdfa8422a1f170b7ffd594c441d88e18e427ed148a8127232b3a9c95bad1ec87f92d65d375c087e4d8761628111642455855f9f56dcd3bf56f77610eb0dc82a6fb287af66a0e848066e1eab783a5a48c70d91e12e8d1bb85f96b02b051b054cabbfd3f8055ffe0c4f79391a571c1ad300f65d1c3ce3b1bdc5882b74b65c1efd43e2fff5c7e649e5b259643cf05efa5510256f8faa64b1e518608a15b26e0e2be2dc4a8d4d77b899bb2c11c2abace3d2bbf5203bf6f42ba66429dc5e5c6f3ecb7cf461d83bae957880dbe952e6277be81a0a7ebd50152bfaddc6d89f8fb68309e94aefc4ae17c2ce5e2817df569f54bc573833145d602913d5124491271cccab45894765902542d3601cc315ff9ed90e01eda465dff20ce3e64df1b257da8a018daf7f716f9cad6eed91e3a31a0577189bd1ef1306fa3af59a8a24baa4941b26c6f04012015f61bbb7e9764e663f8d65bec08411e0b481cfdd7418dedd600227e81aa972964c553d90821e11282ff85dca924fb0d9f160ea72948be55fecd321586a12015f30b5d1556401c5ba0d36651a9a44feb28d4c1b946fab0b9b093825a2d746fcaaa11d95a585e4bd576df37444bac2a4d5c56934df0f66d132910875e59fa398594a062c6bd4d30515c890cefe82ef54d25c5f0e2cc7958ea3623a089f232cd3087fda9c73cf327aabc520db9b73045c6c21f0b6ee1943803c65c401e56af434bf43d0b49e50ff50adaa0502dc0f58cc05c9935d1509d59456538d06a8e937c67fe2ad972a801f1e1aab080e42b23e73b90e6625780318deabd4a05c4fff38bbe6be01fbf9b6723af26f34b06bcd165ce250d8f8b8f00919179961de5e4c03e252d0f000df8def3d44299ad5f1c8f158c9987491a524d091d47127ab11e2d9867a4eb1531eef93238db87d1b125ddd86d9ead8320 Params = SHAKE128_W16_H16 Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 PublicKey = 08000008f99162703baf742f338a4f035fae34595dedb604723992a8369a83bcda4addb05a0568597f274a0e0de7756f92dbd28325a9c63730fc74790b2efb2c3978965c Signature = 00000000000007acdb208ca2c5910a053e5bc2208f852338b35d12ae4d4555342badefe231cadd7f42b54fdb2cb72755ee7b321fbfda8964171547e0971b7aef0b15ecd5cc44586a6f06b8d54c3a576291bbd89b720c8bd86a740e148a3ddd0b11c66b464c99456d9621c1e74f7c160fe7e78accfbba65b94cafe95ee4c8eed18936dd1842309e277708e8341cd2e8f21974ab1e56ea38b390a791e037a48bb88bd7750180f7e0992dbee53d689481158d3e14703ed6f82e90f6c70104f870bd90f5c9a21b7405e4ca633b46f5c1ad23cead2459b071c8960ae2a181840563b43d16c90e875a85a03fdc73b467dc755c5a1904d0ee78a5f280b0ba1b716548ec86bcbd618bb2b519657ddeb147c46fac45a5ee315abf0a78e9621c502ef42869d58fb862d9ca994ce249fac7226287e7b1499cd58e98d3a48b96cdea71b4d10fe9cc47895adcc930a1bb29e1333261aa2255b3e170fabaea401aca0489ba00d97442dc1eb3e43025de80b9715d2a5e4e9f0c5e4181385644c6e604d81221a269f9cc344ebe25661be277394e417baa8b9499ffe1517cbc34fc02b82ffaa908c2f5cd9e7b1a7c4d915442db2a3ffda8ea28661788193048d1247da9a4697b1d18fd3c828c33fe181d621e83994669cc1f0774ede9beed0dec67d86a4ebcee6871f505d0fe3cdd355f1c8e39826f718b64990f67621be8df590553a4594edaf91b0768083a2ebe6107ea506b1fe976955c24f4b9d23efa80e3b43b5c8cd61a20565e343f09983c02afbdd770c17bd7bb9c2fc6d18b27b5f9d3a8dc5b9bfa553d650059444781346490b98dcf820d08a105365cba43bcdc73eec66af1c475433a72842df86e3703cc1f948d3d98b50e900d94954b5565f70f49ec7e5b014f0ae3123b4e82acf5e7dede1ba50b4fe89ab58ece7959b08718faf65e41211b76ef9c928b7f5751c192bfbbce51d6fba60dbf08f18982e0a23d6b245a1e3325adf40c14100fee397a7b27cbeb946d45fc66793c27686e0cd7f0e1c77f14d8caeaed14e991837b7510558522c83567e2d47c1973452cdea06d4a1167493a95e83b672a05ca6fed5ecdbc3d3beb557b319c08751b7a1a82b7c63cb11c5b0fb651cb10b32b1c3debe5a641e13d72e1dca0a9ae95734f396efa0385849d229d81668cfb2cebdb0c88c7c652a9bd01d701b87e7b5922cd5746a68e1326cf65aea919030e82bae569607508c91850196d232e4451d534c949aa7c51036a73875d8b185cb0b613f4fb33ea3bdfa9573df2ac53261aa3163eeec5542316dda467bd98457b5b97a2e61a97ca6b5572c3ffd22e6fb582f8d82e311af4ad932d2624f9c1b80279082ac8717f476b26c551a5f3aa497b0213bff4506a2c1d43aa852bd09dccdbd4d9abec33c7c507a672460c322f433d6ad61edcb104092175b38f497f4341ea5006098ec6e7e068b7f687f17971666361be525d077c0897b6f6dfd3c7460925764c7bc310433c5252ace61c6b3f7e189a7ec48d586fc1ddc871de0928040e77d6184a33a5d2faac550790d58feb9abdcdad0e3ba2b52b7a90082d331d35f155883961358219811deecec344eec9b653f0c2d911736fcb7d43c8477ed16646b8ad8f6093acabcc260b4aa7e931e4a9942d9be7975cebd9adb70c399c022a522ea5635a9ca251b9ae58eaf2a8bab212bd93bda8d71baabe6319069fcf742fb4b76055b5186828ef6672b576aae00524329169143f7e98d04a92ac6ddf8eee89b94555082e07c534ac492443a158a07bb23b1f52de7a8f5773ecb0281e27485ffe990db32ee487b80fcdd596b5b40c827fd0590e043267c904c4a2a1abfd1fe09ea3bd8ea0411424163c10e3c938a78e818283981e6bb89ca0368d26749f0abab8e7d78a8a66917fd2f6032347b6258faf38426edfc4b15499dca9409f8fd02d1452fc720aca58d39bcc2770d89e9a883d492383481baab96ca29ae4125afffa68d2e142ff887bf1ab0b6d7ee8fdb6de99d14e60a9a9e3fadc1005f63545ded914fd295a08cc6c297b39020bd3bad41fb16af7e6cb1e0594f5d92abd655434762516c9e2ed6230dafe98fd71d2dba4a5e99d03e59c6ebd3bdb59cd1f4c71b0b55f6560b934b903282bee65e3f01df28e846cdc0216d243e16f98fb0470f9894c75cef0b7061fe236d2431cef3069db821e84d4e30307cbe024cb99a8f9bbd62c9019f5481c1b679307078b6af6cbd5614218a66120eaa90f928df4e33e4b6209da1b116603940af8d16b4de473deb89fb6558c571907e54fb527f055a4462e270a53bcead68e222ea75f7299e47224049df371b0581d11bb2e7d5d2fda987c254cd33f771de0f949120263b855fb0830e24cc8dea891a8f3a80a957b0658ba40b44d87c3d1082503f6c7394ad6b1accebb63667737d632ab722ca30a3bd6dd9cc9871f7c5380cdaca51087e64128630bbe2f86964c57e88899976761d93629cde170a21d0e55573436518b490701589f68b3a48832583c7c7860f365b835c5a07fa45afdafcd0954585e826f9071b811033503e8bd21382787eec7ca6974ef08a28980427dbbba58f00cb6a1d7d83e507d9cadef1fa6200fa0786a80a0dfda94c5d2631330b3e8e9459e56bf0554399b58ffdcc13f51c788287a3d856bd8b6fd1692c0bf70b00b633c0297cae4c9047373e6ae1440492f751492f06c4f2eaa4a396ef3e3c6d261af455d213eaeb27b657cdf0432cfde7995c6f35578bf96971c4e423144f4feb8471074479768cfa4ce1b061ca3f3767c62f7e0a8c78861d3d5c9f3262a7f2aa6be6eb5f3677d63242e605006719e1b0f1cc6c0c0e56c9d88c551d2af4ef1a44c273edd660ba3c69e6313a132e3d37a3b300e916fd2c3f06aa8d4f4fb756102f84d96efef9b86c5d8532afd65436c3016028ff2a74f4d25a9b52a1a418923a0eb0f008dcfce01057c1b4209b25d0786b97cd558d5c033bb10929721b7e28353eb8e58b304190de72ff1eff7daf5bc921e43ac65c87512c9e4a32f99007edee0d43c713a9024f50fac0ab99ed2e558443434463935585169647aad5a7d2a7fd9fb3a98dc5c0b935e2debbbb27bffbcf10301f8897b64a1764551ce0d10260e20b35715a99264da9edab72bc20a0d1e4e47025629ca51fc599ffe2059bd64093ca8e26838b8e58a800fe698ac3dfd992b514f29e5e0334363316326f4b931c1268cb39036645e5938613847c4b981fd6795234cb254acaa22596f0d1df9c9b6e45fcab6a6d56236ff1e9a01cb94cc9f6d2fe5cf89ac3126b36a34eac3e09d5495137972cccb691f2e70be4a1b76039637fc0c5f1416c24418fa5cfe28cb34e6be8c4a1a249bb15aba9dd911f10ff57612a360c34afa3ffb5620562de640d586b2ca5e5983e878257eef9844bf7293e1999b5bea0ba46a39a105c381ce5f415526caa1252ef797bc4617bb58fac8e79f576384cfc23d41c8947d0db473f95b535847409b7a93ab9c640d6ad9491cbc3c8240075465a75c06af546f67ae8591fb5a92d798f7c2b5e045d1b1d8a3b06b683ce556c03092a93117116b74520c36b1170f4f7684b314e1b3c66969fae2571ec7bf9cfbcbb4ea983d1ae30de486235f68e542ecf06f5da8fd6d4dd80460f4be917ab2179e57bd2505d79d4b77755e9cd631b7ae493ed4f4646330b4d5b4c24204fe7faa424a4d6c317adf796ff098b32d805568254410448592e961db62ff26101e53e5fa39dd0d4e3f83e44a92a5c6de4703f99b7e6bc43e15ec957bd5264a2511cd9b1813c93a587ee5c19b1882bab7e27d19de9cca Params = SHAKE128_W16_H20 Msg = PublicKey = 09000009cfc05b12d6049d4e95bd5ac29c8f7f41bcc09a65c89bf695383560451ce52e31e7bcd7956f662181d3acd7184b66e0590c8962aeeb37665744b41a61251c5a83 Signature = 0000000000060358da6c1e698a91559e53a858b2d18e0e71c6640a71dbbf68777ec20101afc866b02f42c269ab6ca74b05969cc8b44301d1f35f52eae96a397094b6130c3a50cdf13d76f10a1ca7b9105edce281470b8de4b41f9a5917d83cce40a09946cee0f0ddddb86ab4225c1104bde1875e39af46c7660b9789c734d00076a38cc5631b25bce5a90a2d80979573579f89d0c9b733b34611b2a09b1f91b5a6a81de3a6cb2d966e7fa3a273e497c52d92dd814565a36ebe70657972847baf6dc6fc276d24b891006acab914a5e74340f7077292bc3c32bfdf62ef8cc4d36c0ab2e20a918e68c170852fb0ea8a38e6bca1f08768ca97217de93113607bb7c56c7642e5c44f75e09b250c8936d8561bf405ac37c11cc7f63132b108176e83c09e0eb2edd76c86555b025f0ac3128405a00a70952e2262deb354a17423286f6963050e62f8daee25a050167b3bed7bc0d0f063891caea67d0566215dfb8e0410776ae611a98c519e2682d258f62bd79d8472a7e3a9cab486bb2875981e5ece135e7bf2ab2f7fb337a485b560c8852c136570b9026366b8d814e3719bd9f0b9ee978107feca9335bc85a12d6863ebcd41dd397e340f72cf4006bc250784be796d6a8299bd3ff4a1fcefd7667bac1a1a3d161708f4070bb3ec76f9456d1ac8d5d10d48394988aff68c46cbdc88bfd90c8fe5bd9ddcb661971222529d40db69a411a5605e939f8fc62cf116ca2a84c5f9531ebb25fac28000bdbc39b85c5cb1438e34b4060bf993a57c7a120cac59f00233cbb1f8eb83d64e2c8839526f41b3f5f7f4d536b8253892c4b6be6936785cec65840bf48f62fd5e0a68eaac6da547512d67e0d16ad97d9bd7a0b9ede0a7a284992e0d4455127e5321701ea56eee2ee4367a6e04e592fd1cb838a49e5e266740d6825adafc36709415b161279ea559000eb95ec5b204ba8c8ab1033612a50af64a3847a806851b1b721cd9997ee1c7c5fcf62ae1ee3864e990e4626e3689f4e85233de2f8bb2b9f275e62af1a31d708997d236b603f5b451009284d34237fad75fe5d31df139c5d4a640d2c636b55317b763e42c9eae72b4fbd851ac35b3bd6eb1920e311d67650c9f8ae45c9ab2937967c2e8aac1fd9e31867e8bf6d1227a98bbceda17884fb6d6015c5af5c1074d955416df1bcc8774c64f66f602d8729e40aa014814d8df6a6703a5bc0a3c17daeb4dbc24e63369dd70c8ec7d504f1cc4b2d75d0e74d3826163630bdff3bf28ec57a518c8694cc75582e977b674cf69649453fcb31b1151e4791d180b211c0b2a4e142a838aeca4cc61e2ecd93a0037ccab1e7d40ae76541c24d1bacfe3673f4e2a9f286f04eb1b81bba0045b718386c4c0c86d027ec6cf9ea1d871f4d850a726d61b3f0d437e8a847d6cd7281ea9b8be9131c1a460e32cdb5f5847232115e6916e7d938b3cdf4cd6e08c2fc69966f637e10735c79a09e8b1c82fe3173ce3a94911552324b01655381e5fc699a7f9761d49f8d131683c7581036c80281313a46f8ce1fdba72f57944a48d422ff196e4720add4f92560313f3f8fd562fbb14b3b3c79a8d57f3c8cb28b95f33b7eeed28d0fbf0fbf83cf881542554fcc0d41dfa432ef067b553c97d9c96e5f004fe37e5250628576d016fa3f52837e6ec988c6ac960dcf496ebe3b2cd3bcdf9ab9ae3efbe417b44baba3bcf0181fdbe8bf81934521a56f96c7b8ca0d0625f58261959d27a25e5d55ec5a490c0092bce2da3d1b8a0535e85936d39287229ce03f4b1e56e0f04f4206534960955e8306168d824dc33581eb28cffda119e2b5c048cc37540b6e2b716e12c0c59f885238206b62d8bc150f2c298461a8857e0260203886ea445bdcb80b6961b619df28de9e603ac13c625b64e29b04caf370b6f3ff039cafd05c91a4049fb0c383643c9eca8d140b1a2b037192b3160211cee772ba578559968b752a4dddf71b671ee80b0050c9f805bc3d46ec3e4828e3f8acfa832a8df17e87807ebdb76609c4597cc3837bf224ea5065d4580dd59bb0d1b07804a0f10e00ecc297c72f5f0df90c55432b6cacff38be8bf66095ce255e722a15b6cf454932218b9f96c28d5bf78341597373f3c8f84588c32a5dd5e0b3e84e5ab9b67880bcc9f5beb6e1153acfd698b10d98507a6644d540d70ced90a8bcb2f788182d8538a80a339d95640befdfdc67539196007601678258d4099d8bc7bf276e7391e000331614bf98bd4831e0d5395407cf37fab701108c28ccd981f8fb15515dc07e1c15960b978ed3cde39e9e0320eb5e6738b1645f396d4d15a58ac8a046075903f87ead2f12738379ba492bc659d3239cef36cf6da307906e82ecb1dc575f24457a304b615999fe99f940ca73ad3568e0309417b3f1e7b71335824d2a5368574bce0f6492052cb72db005dcf556e7df2b5ed2aafa649b08b122b5a279a6bf19d7dd10fcac93c01157d2cc476791a961f585bf6e7f418459c415fb3c2a9196d046192000b23997eda4d8140f2cb47f50de85d25983bc829669922bb3f292a45237cecf6edf827c9bb64ca47703870e422e74f5da471f3c1639f0a39dbd737059b96aec190b257617c8a4c90d382a9817ec462f566762b0be5ebc165c843fe02cf0e960d3111d1d8f143e720becb370bf559aab961347c72201d83134ba36f965dace34c987da634562d0ed0f58fc08c6fbfb99890cf60917e6ce387906e00f1db0878916d92f4fe11b18da4353ce355169b619a7a2dcd346ffe42a57d4bb4ce4729ce145a7445d2b0209dbc10baccc73d2e4f5e972c7de655efd26825f5c4a8584a6b16d8b1b3d51e1344c0978697cbb3abbd37a609234ef21f9f61214cc7e3c5dcfd83f30d4484ca52f061cfbc65f6b64e3e0b1d4939d7806457c54d7624e3afb63a1f7944209ddbc20b1b6592e13bcc76a86c55ecea4f0074ece524e34665d6e8018af658eaaa689c32de77b5ab74c30e65642dc3e1e2b4073e96c76e57d6d316c67231e2eeb2ec9b0c56d4295e2c323054e7cd6876448e739c662a79f2e43f3e5f92fd0e05ae40aaa0bf7778c86cdd65c941c3db996f7c76eaa1d7fc071bf16ea5f63504623372adf6b70d359528b6ca28c2bea4f4aa1ed3c2d65c5d3e2e0919b1b7301d272fb12e16c5c1efeedc4c9881aa408a24921a669f399dd396981a4540d27f899a8b7d70b5be968ab3a9f2d16a9a7d1f502099a312aa1bc39f2cce7d55af7d808204d94f787071adb68ccc387c2e1dc2011428bed1711b9ed81bf691629e532583f1b84d5631e3a85e59b70e9b0d9e22fcfe7a0a437e8e5aae93c527b59d2722fd3366d2ce4c26ea6741abdc8f2be8791cfe4a811f270b52429d4163bb02f12eb98602a23a46d65c433e2ad9709ef29096317aea7b5f3b4fbb44120aae5d31e21bd08b009d3112a448ddedb17b91250e1517925e90d4ff050348d06ee3cd6e6bcbe9200bebcd274514e9b00bbf25842643327adc7654603a3432bbe5fb7f20b94d1a96b02127b1dc2e084c12967f61192095737648d8d15db20136db5e8ef427a52983d8e51a2fe36fea426f89800c31fc5591bbb4774403b95978a1812da62b6ee5a6b92b65b097dc4a1ee3df1013aa7b868ba5a4c44f2f4aaaf39a8f96a3a879464cae45a05cb9010ea6e288764ba5c8a6a6c9d50e055c2bd98998b5fc151e2cc17384b2c5dc5d75d3720e63eca81f86baa6a3bf5c57e45c97c4f18c1078c6664284431e09c6805be61ff0efe0684f5fa6960b526f5e838cc1fc63b0fe15c4c4170b44946de18357f9242d8b4d8a4253abe43884c529a440c1a5d1fb667a0ee286e0e84689cb1b2b820153326f0d0a88b5f1aaf09b37bed792d4524e1866a19f9260d1f318c0ba96e4548712356dde787d2c60589ac1edff8f716f584ceda86317f760b364c5812c77edc3b51aa1515d4c7e66d5fb59175a5380470a71dc429c42e2583967aae8eb622d60b79a71963c4f0c865bd1be Params = SHAKE128_W16_H20 Msg = a2a50241278f92c8ad617c84331ea21c60e92afcf0e48a714ebb75d0120a9d8dd0556840e3acca6c9a86451a0d5be95c2a25ba8331e8ad9d842a1440e90509ffca5ae64ce06a8f5b65dd852b69e8b88735022f520da3e29d99dbab904646d8bf58d3344048f279aeb1669f3277f0ebbbfac2267c2b9ac8b989695974adcb35eff3aedb675eb76339cca31d6a975a2bcb9b37d4e9d89631543df3c970b141c039059a8a7e648c814403cb7c3ab0051c051d1973c8738e6b6539f676b8af827bb3f33ff12bf0b063bded6591818100f70cd396ae573280acfa713675d233c6fd0d2289b7d2f1de03363414bff3f6f4042275b7baf15e3996f75a61b22a583666e0341143560554ba15d889cfd9a589c0b7dd7865a3ae70e40dfa0e0fe35887d2951740728f874caad076fd0b0e8ca4e98b3a02aeffac91a906e3282bf7c5956c96d242aa1135f897a4059c5c85aefedebd17955b8189df68dbc7997ac06c9af18f993fe44e438cdcf2543018028ac893a362c1dd47e155dac60f90050c03031aa8eebb8479c4007fea897e272b049b451183cd9eba34a451c0e1ae3432185ac0b4 PublicKey = 09000009739e954dd6737ce9b7e71b7169afeaf1230a09892455a8e8b4149877fb3c1061ae8f7d135816276cbd8b3540f7efe80c9d91b37d0303b9c8d748576f62b391f9 Signature = 000000000001d1f26d26aa5903013f34ee25652c4b0bbcead8c72bc5e480b9f9ffd740689d0340ef0d9b3b52d41bfb5f53a6054d63ebd9cff5a3efc4d09dcc35f56806a0b6ce490ca923578f759e8790c04fac2a99fcc57fa8dfb8e575b477dad0696cc3cc13f6e6c274cce4763ad86b102ea2a57d25fd06dd7fb3346e9b47b11203afc733ea22a0287e073636d51889a8d94736536853a9ab3d3e21921b83953aa6e931ac88907bd5783831d4154cd8aa8f639b17bc49b2775d3598f60953502e91bf0f87e607c7c81677a3debd50d9acb43b8971c288a4fb935ab3a61b16025d0a433c47d126fc156ea7ef03397dbadfba937b98af36abe868d291ec7364afff24836ca4dc40481adb0c9b80da9d55f30168e4a553df56990d19f5a783823ffa717e46cc10d2d97e2e9a9ed9926a9b81758af5aab76ee68b8777a48cd70d6793478450c53d839ce688cbbcdec81e39ff60698c8f03b68be6c0e8c4b7eee93c7bd692e0f5ab4b8f40f1e0a2fd51d59e96a53d0c856cded47d844452220d1738d18e6425ffff109ad607b1fefca857c06de47f01a4e73b3815f7af332fd8cac5739d2e87c3a13ea1f58f21c13edea8c2175f6414aa8d56915530a31fc4856e1c11ec4d8ec38b231b08f6e4b759aaf19234515560e46485730fb1cec39f4185eda8f52b0a0e558bad3ea89ca728dc279228f3b5a6807aaf598397f6fffddfb22444b6f184875e0e5748a0c1b4454e16ed0d56c46dc12d436cc52b1d2aa67e20bac07f1a778eb6ca433bce5de95ef031aeb46d2b196cbc249f6e1f0585708c3142c0930025a50ab1d6f20dbdacdfd688d87e0b93d2d3705d0a66844ce14441b571fa52b0267f8969e5173551b599f041288d014bf465f41260617f9cb48ba22c60050530d9eed172cc99f90969fb3760ef2e9cac8952fedcffe800a807695865e746451d9f94465cf0655168bee150f89a9c58160d487b9185afe720c9d6c2dc07dab62bfc60fb80dbd7717177c31141930c97485ab9b374eeec4ece18f0d88fcdc47ca8da6d82df33ac46a86c89e31b7f5e0f04c64bc88c7631b08e857b8c39a215852d7cf780243ce568657f062878132578e338969bd3fee092bcd72865c9a6cd5921ad50796dd89ac76deda9f2547c448d534fde5b90c6c412662c7e5e3c74b0853f1eaae3c060b274eea70474fa5dc1858eee6aa2e8de2448b6555e7f081ad6c0f4c82d0ce6bdabc24261b6a6ea3c808d3da1469c02650af48c12a1551977c7fc625e8a6f10e60a99f4fb46c8e31203b79241e94d1750603e5974246b067e806ea466f2c0eda1f92875e3f7fef0408c37229d2a4c0d4257e41ffb2a67c842aced6e21fbf1a937dbb7deabf150777013b0e81b3055ad3158be38e6c7c79d03dc18815fd7712205567c204f54b1fdf7ac9808359a65838056a757d05443ee6cafb23e6244e5d4026ea968ba772ecf1b16a0b6f1a6e0252a4c04eb9ffcb88aaec9ff687b8b4ef4c984d31b572b61fa4265df6b0e37e5187805ae496b9b1d0a1d62e22c31b628ae6a922ca2b0cfae097f86496cfd294f6ef704b0c94cc13195d149692ae4698e9c3d7bce35535f305dd7ab39f474eb497a1ad65865a915431b645a7fd62ccebf9aa7d0df5ca034a99a368746b8d86db8f0d3aafdb0f07ab8d59159dee81f916cd227ff3530628601ae8942be49287e6259cc701b8eb83353226fe523dfeb789dd3a4a4dd93a48e431700a7203208b6ee0984f7176f8d151f1cf79b36fe767b560b7c07fb553cdf928c940563522e04fa46bdb3cb5ac4067c0288932f674571439e570ea2eb05239289535586b7bc355c9f92c3fe4a1f5785a9ec5c1b1e1577e842dd93bebcc510c5c8f36a402f40476900b7a80f9f71bcf51a90a4d868f477d7458ccfb8902b13ba9556fdd553cced8138b5e470fa473ed0cc0e6b208111f21b48252673713c0ae86ef982fb184dca2f018a9328d2a0bd37a28ea2e73d65a2e30c4f659317348d8f7c488ff4d53b2feb71b88b228f5946015658239a64fdb93004118c0f193f12ad608ac2e245346ad9c89fe43f7316f377291c5f9d2b5476c3bcdfe76faedf3a6b8eb52e0234f09c2f285bb10259c9f4162a74ff0605fb91bd2d4dcd3f120b25ba288354f6721b479d4308354f751aea35fe4951622e9e84fafd3f5f6046c877caeaff15685a73c1e9dbfa435bf6301f2bb899f88564e1549beee24c6be52b2d89aa2710f02e6bd00260121d0c88a7dc8fc7e6b8e0740d4ddf8a325a5fa78bf95874fa22aa44006b6bfd5e84605b78ff0190a1d78d38150baaea990184dc39f29df4b3c3cfd613b3ec06a414c0f639f604da82303cfe9522a54969a6cc6278a6d10130f32a6d1ab2313a803d6986d6e849cff1b8fc997172eb57f06e18179debfe4c8c79f572fd9d56f26b35241e9bcc375a5ffee6ecf61a5d446b37b2ad964905d64a8622e8201e1a53d098269f1d7598d5c915061dc2a5870c08dbd29e01472921fc37927c0e79443384b71ed2eb8abf4d0e980749c34578984fed9fb7419896572e4f93facefd3c81081e4d10c0011340a4a5fa68f9aff536059c89ce03689759255e0e5687ea911ae065dc14c2526416d25a08e2f8c76e2bfe01b7ab932174b57b237bbed5ba768b5c5c61718f87f7040767e4fa57f8c311fe6394fbf8c73662ae4d490a1410dffc87eb6e902c311916c63e111e28ae36ed264b69e459bf6710993aaa178c8158fce5df529036d3bfb21c62c3d1a6ac350126fa9405eca2230363367dca0a1dd49667355ba434cd55131c03674f3a37f88d4210294e6dc346bf159ac2f28443d11396b4df1f2d033491e5a89baf50b12cf87caa33e51a132b91a0f60bb9d58f29d337e8213e4aa5afe0c8dd712a270a96f9cf681026c2f00c5454e0fa6bd2034c39a872b2fea98b1b822b73faba81df9d141eb13822ebdf270764aa350fdf3cd9a40a77c2e25c1e7a653dafee4c19f08adebe387afd250e0da4024c2fb4539e78f62b8deba0bffbbbef3ef09b9cc3196d51ebf00414c461f059abad380343cf5a303735520253561bb6ed2f6a8542cb64a1af0a4361653550c4b1559c80354fc761020b10e12726dc626d46bddab669f6015d83b097287f3ad7486249a00ff88cef0c2c1920839b6e0bf45b467d2fec088719b12af58065aafa997072cce3fae6c6b2d27bf9ecae46d915d3dbfced5b5906b346810ca8fd9006b4b80b2bbad9ce9a7287ec0c0de3875543471f46e08ddd8222de2a3075783e0c315f09e3f01ea6b2a155cba8a0a9bf41c816f32d9792034b1461a4e3df1331a461bd67ceb89bd8585c31c7fcb2395092bc1c81929a1baa836709f0a1480256f088fb10916203bf1caab7feccb2a72b0bda774125fc1a891b88f2cbb99b054b1670dbf81010b418a263bd170e2db3fb2bf0acef94c11831086d297de6fe4154013e07e58c36fe0c1478ef04d8e4c00df9e48ef6baff31210d014c79e021c9ec55c8c4300ee359cf01754bbf707e7af4d908e0043df9140f1107886e35df1e89c44603693bf39c6eb1ba0074db62d698751d96887e60eea12a31609bef808e8ffcfc4614c3e6622270f8bfea08cd81aa7d7e993d9eaf5ff3b039ef5681a15f9a3777fda9d0669a1e097d55e6f98ff37ac08e93c0c0036179bb60a9a9e4b644b7860daf75f248feac6c093e492665b563e277a32f1e3d20927d0380a0ee3448c22015acbd644ee6e1705393fc7b1191de5d56a076b7b7ee2060b870f6689b0e31162974a7560fe139a0e104187ee4024621726935b0b85d6f5e5e05b65c963a69cf5ec3146570452771befc72fd30ecec2eca69250805484125a58684c92dd5421b57b4130cf52785f3868f656c8ca498f3d301013be5270a634a17ba4096ed142e0ab7e1efc30f9e797636797709d7b6d7876c130899f2d8694bc6cfafd38960eabd6f690e79ad445201bdb8d4da828d0970eb0bd7bb8494a4c8 Params = SHAKE256_W16_H10 Msg = PublicKey = 0a00000ad2b53ac8ce33ed27619c2eb882647d67c1316b58d2dfbedeeeacae1e60ad45f420716dddbb242060402770ec79837988bb1e8ad03432c287a0b1338f0be46539fcd0050fd05552b9ce10cc2429665d62b3155a530199303a0b0e5bc36035e2a0cdb800d5c497985c78d30c25dc47130f142e317376a5ae0b44fcf4e8be4623d4 Signature = 0000000000000183cd58425b3a4561a1b555ebacb7ed552f988b3dcbf63ee35b9b4aaab49255c62f87ec233218d25cdf59b7a4555dc8bdb44267228c289fee1bb0256be44aaa69963609340c93e2407f411dca5e57a12a36e3d1cc4e8cce8644e367043d8bf3793ddda1d6fed0068b8fedb218cde1eabe4a6d0bdbd8ed3150fa068e30e97a4808b3ce4c9177b756b020bbbce8271452bec8a6b5154ad68ead8dd87769ca3f8122755fde48cb02b909eac5470f8140c6099bbf41eb707185ca40fd5022e3f2770bf548be96e7867ac3593ac93f504d8e71f354d3f33d9d3fed67106b1741eacb88f82f2d1c5b57a1f4e3e7fd494bd19bdf217d5dc6f896f30ccdd0801171960747842e8a60b445cca7c5b59427a5337a37aebaab470564d3221239005e7762ad33a624ae34bcb02d56b751ca40b9abd166dc2894ba5834b0c3178fd3a5243abd500fd9dc5cf50f399611e8b20384b7b1ddd598fc52067e9f366642c739c0a20f5784d594a90d848bdf6d1194ba9e4421345b31e3ebb67f74a48a5056e6bde1faa6d0cd25082abd8aa20f58f91cda94246addc42d100928df9ca51da7990d898191c10cac241846434a54b50b6e8652e3563e128734a8ca1dbd08253bca799fcc81fcaf9f2312fe50e530e746ed4c41c861a57386b4f4b1efa2f095c665f20e30782236abd3c8c2a9a13267dde855a85754bf5dcb5c4b192ce4b4ffb60a282747fec64782bf05ae1d5cfcf834dbd5018d2d31e4094a75df11276cea006807c9fd66d0189f11fe4e9959390279fc50a699f568c70f5d40beb61d6403fe7db6b1584213748e800a0061daf2ddc36b491e745b7ea16b1059ae40d28347f7511f2faf01437b520d4a6cdf92e38d793dd84c160c1bc13c0de32e55c97948fb729256d0ed3fe24aad92c78bc2f89336cc52c4b12390ce19b0a6831c3381af6ba415ed7fa9d34d0009f5e9bb3c2a1aa1908b3cd0102930fc8571d09db3a7783da2da75215211fd7ea03e275fd83fede2e167182beab9601381ce20ed806f2de93379561b78e58802008d3c5042f2d8376f7e3bfb0573e9bf5e679cab7f67cfc5c1556aa6bdf67fb6818c3288255567c6dbd1cdf0c3159879873853408fc727ab32161dfe942b8e6d5f713ea947869eefc1166496e0c71bb75a3965ecb72454810bc67ca2ae0169ccc5092fcc6e0050c3ce33cdc10ae1cd60343c273e6703c29a339d88c34cb5eaba8dfe2c798dcd43ca34f52ba51abbd186fe6360bcfbe9ba06fdf3b2dfd3bf98c1ec08ed1af837ed528fb15a0f1337301fdea7dc43af29ee2f3e383377379d8dca37b02428fe7750d3e579bbf028b11235c0d672ca9e3ac07acbddd2f656f9f59533a9184d1f4bfc8abd4f93373f41ef92c9978d107fc9f6056bd169f0638cef9074eb6bb4801c265d7aafadc96dc9fbc843a2cff9a517bbd54fccca8eae4648bb29d0569632c38cea57ef14d5e1ff86b648637e572df679dd11804db43c707ae3e1a00c61126a4c7adb203601b14a75819f2332c8aaf1f47280c796072839476b3f09c2839234f8ce8e1c85124641f146e0ff2ee44745bdb6519124c6657e81d11eba406daff6656f64d8983ebab9a622365cc4aeed786e777ee9b91d9a333b85d5818b905c82e1f4a8bd2953880466bb8721393e224c0bf38b0745287566d89cfb91b14ac39d74133c1c5768e4db8025fd43659cd6deb22906290e203bc0df43c3877860718e3bc07e5b33adcf39a74c1d047b1463d974c56ad79c1aaff24fd44e1baca40cfa7b84ce76781e380facd8ddb8b567689225d94c26368bf31e68e39dd8d260c1548e377b85d016ba805237244f3296aed82f2f169628cda21ba653833d23c53560f9adb9c4f8e349140a713331f2af5ce401f1c77e41f171893144c123565e2426c2c91a88dc203ea9df1599ef36bd7eaa70fb48fbb4badd2bad79c9d22b75bb12cc68eea401a77f887a989ac18aa73f43b7f2800d3d37ff36c24be8107abf4ebbfae7c4cda1e916fac67c2562075b6f5f12692355526f19604da39925795a2909eb9e84929d55344db69c499e232858508cd9bb0a679ae2eba273bff60a460b4f487c15299bd44b4c26ed355f321be00b428f8ff959cbd2f39457300473fab91947774b3136576f94ae22492e65d47907b65e756a8fa72e1dc45c0ee3d4431b6f6b36e60d6fb135f3391ea2b9890c19b366fb46828b2e14a0b6ca6a9194acddc3c43e13a585f180758f8e3da3974f736403c9891e29f456ec0e8fb1881e88d7aa5bb52467b33ef7fcbff30ebd81a0c78e1e2ca582df5df7b16bad5a6a99a16f400a117d69622d85cf1ba3c7a6cbfb568e6f435a51872777f2d18f1f28f45873ad46679aa278ea1854571d584ddd385368fe78dc1d0939fe310cca2ac9bcb4e879ddfd38f1424ff994fdbfe051e41c412bd270dddbf42d3c2f3c5057080f7534edcb84414b2718cd57fab7fb9976e36726bb3c540e8881d003a04fd025ccdb46a6123cbc6961c2be3e2dc44c58a3bb4873556cf267352131eb8317b915a902a1c88b27a67ff1f4deab16c123fb70b76c2def7af4039eb3231955ac787fd71398902c64eb86c84872e4f1aaa6abff52fd62a9d28e171e137c8bc2b813595e1b08cf07145de1f0125adb1e64a369f266264736ae284df25fad957e99680a492b5692a35cb1702f44e22fe11dd4744dc802bf81aa5e1fc0513acbd94b7873e221ead94c379493486e183f07f204703167283271f2d2175e5f2f11e7d41036114fc3542d08abbda4d0fbcd920ea8813f8764d981377cd49fdf78255e6a27f8e045ad85502872bbd8ecda63229af3e7080ba7cae275bcf3f0194d1640365c7b2e49b985de0ff098a46f29f9323b39904985ceb77ec4c871c92763e8c4ade1b6842a5eeec626743818528b427bee2dcd0c7a8872cf180da5940b23ee6d4625c5c2de3bcdbab182d69996da3b2ac2ad0c51a6a7586d134ee4df49c28249991dc4357cddd43820284ca9aa8f64772218e008a0483d7694fb3aa7269495347f3868ea76c9b92058af04cfe88a095e78ef2333a1bbd2498195e1b992f5b777b7e1192809a90fc094dc9b35e2c0f15bb313810e687e3a5f2408c790dec22b9b423d8e3b2d71df7e541b2baa8e28e28985fd5644a23a46a0d9b1c76b2c93e72167e871a53942ef34ec712f344de782762acc6d736b3bfc452492eed34118d1b3e338c834cb5a01d23ca1723198493c22c0d54c303c6b18a55420b8e828eac77d025217ded1ca035d74bd0b727c15b36fa4c0c5694ba6c5f27f79a8fc4e50d47caafac76c7e73e5af4f7e6e117db30fb248cdeeaceef08c9b1ca84ce9726ead5f1c46032bb9e0c1ae7be8d6dc479e36a2a688941343630dd9f21585dc5d0d997322ce19a910598afb276d0c4bb718ff46cd7093a65ddef754e4e26a70bf9ac69d31f3dda1220b66d6afb93f711930e7e4bea37452eb4692ca05230cc243f66343eade85fd581d982131d3df02555ec479a127f55a8f90facd3546b38f7d6eacb92715830fa5c645068e6b0405df8c0abcdbe34aba4c6b90182bf46bde5d08a45612fc79a1645494be4e1fd82087d5720ef63f44652e666388dc85359865392acd0f224fb4c6fd12debe754a4c87d1ea81a6987d8abce9404e501214eebe762536fe9461d5d62f3e5dc073f48bf2e285284f05bb6ca4579e8e4c9d61e6b69d54e4e3e8f4e0759c312509728133eb46482f5404492680e7c6fdc3094a622141f7f9e305a78219c07b50ae79ad952147ca5e6c539413f18949ea221eeac7c0805456dd5b78ef83abd5d8247f5e16f6ed13ac23d258ce79644f15bcd81a4ec93dc3ca1ef7b9ed88779b65173b92985119e30eefbf3c20ca232c1ccbd8aac52701be949453e113f1c8e2c6f0ee600f05d714755a6eb52e7124515e6c3124cd61c2700ce11f927dd03407f5a811be554aede8470e0215f2de91922268a10c471f158a51c7693e3db66f57a8ad27453c61a0da009dad99e7a89c8a1eb282fa213de46cdca2d8e71513e0f728df2f6e6e6511e7274ddef704e8a5f0f163311ade5499d0c8eff4bb3531d7dce7643dbfd2cdf07c6fbacad58dfd3a3a0f566a9b9e27c5735bcd3931d6ba446e6c74e79248e2fbe9d3f52758e029c306064d8e75d0c084b27bb5cc1cff26181dc3c857d873a01bfee14690c61e6f7beaa7e4058983d1ef1912db0c4254716c5d0c96b821ec2d006c0f82c09af9ec29bb183c6ccbe34796b8264ff9c66394bd49c8d54f8c22ecc8a07a570e9b1bf28aa646b5f8783a12cd93e0e92ae6fb7441403551ff5ced3a623233c5c21150e955e817f39c818cd1c822353fb74ea5644f9de4a31af34f56ac4f2e92b912a794912a5a1ea37adc607152c6ef99e6b8f3a4322f52d82e2267f6384c3f8dede98a526833ee50af70db9dd440084363287193de8696b5532845c32e9c975b6b2518154aaaa4fc26bdae657d57ce6df594ddee3f02056f5213023752355469d1fae68a940e51840efaaf46cfeaf27214c29054c0b39dd5f80e7e5319eb4f88cd5daed672b39aa5a474469d09f815c72fc9ed1235191fb04480bbbee635b513cce6eb68f2c0ea70ca3dc40b4472d500176f7d19ecd5d1ccf65c8dc2d09cbeb3e6108e76b9c3483d33d28934000315f3ce1fcbab3573f01b496e1cccb373b53adc8e73a0ad3d47caca539c1c5ba049de4f3880b03fb3a4ae43774cdbd7417c81b244aab0204579b819e3f2b4a88e28a21b999b7308fb0089794417af90a94534c0eb2ecef77f54ebb96834aff34654d9034233d16b1e3b8c2d1204d1f87ddab1f5e31c46464c032ca7583f8f8a2858043b012aebecec418859aa5626cc05b1eb6a93d30272e5964ebe4c09dbc344cea168a3647898d27d147c4596b111dd19d9055ec35f844669ebe304a16a9cac6467c7b5470726c68c512b877c022dab1ec4b1e1bf51f9f7d86567f80d447b646b60cf46a1e93fb544efefb939c4e3a6a96c9f6261db6d69da5a925f4acb92cfc3a974248d6239bef68e19bbc469b41d336deacbfb26ea356eb524c7e1c41b3abd99551f849b099c0016d73c328bc1556d6216ec2bd17daa88887b6590015af3ef21fbe12e3bf9e1eac71735a8765ef514e13eb75d6536f8feb661b707e5673cfe87489f90d4ce68ba7f7d978398859160c46128a7bb7027932dc98dd29a944f112b634075243da787796db7e2bcceae26ea162ce18a64e900dde5aba18272828d13c49bf56b66a798c0651efcf30c9d982ed977aea081e9c279b15dc1d110c3f034ff2173b8129b5980ffc17054bbeb9bcca5d31625a4cac64972bccb7d334f7e3dd39d9d8f7abb0110bb594742dad43bb4366e21582cf4153ed21298b875bafaca790944e2ea83cdcc8c732f0b662c6d27854251efa89c2dd9fbc86e8ade3ec7920b482cd7239e8126dc193f29f97799a73f2ebcb530803b32c2d8e09e01584fa5ad547cf9313b9ab8472a36393a7541ade169ce751bfb965b064ed98d0ed0e3f0eaa2e4458841c72120bc08dec2cc7bc22f8c6f78565d3febecbb5aa352a1ae0d6e4cb57c0784e03ac4417c21d23681dd05fde009fa6f54a2f4b0be253d95bf60abbcb1977958d0a95b297e4aac18f935058d4991df72f455f34429771710e048886fbd8c7299db2cd2643452ff791e09dcf3fe4e757231fc0be8951bd9dc364778e9855bf3eedcfa20b09da1d79ceabdaee5d6a7d48842d8065ad0896398a8ffb5f3a6f89b85dc298dc96652fd3354d57eb9b32d94c983f1d2969391faef0c4dc7ea1ed6215cfa8f0a46ae58fb0f73f0cfeae683ade511d4ab0dde4414fff42dc187c78db262a40f200b9d21a0686ab28b2fa254a80cd57285d814bcba4390716db807ad3394bbfbba9eae9b0e3b3b53ce2e96a473703e6b2b9fe969b8f777f1bc0c2b076671b984fc79186409b1eb0e46385f27ae195136a19d747c9668c0f581b433c0bab014ddf87a2acb835c6d181f65725f854cf3ba69312bda5dbf16167496a6a4c8dbb05bae39e6ef7054a79dd769c02dc05a0f2d6a5b6cad0d4520a7b8dbd2e2323dc0d33b90bf14f52dd2ecfb0fd1d6a20c1d9697c90d6b1460f3a93bee434b3a2df2cdca43c9c0cd4062ae1fde32df61ada9e05df08b05f1a1223d11089a6f4cdfb0abbf0dbd71db505662cf96f3d4f27ae7c59509eb2de4dc40933db0b0d8a20f3fcda9c8ab4a89ca4b1052c81f3d29f4ff116a5ed4f43c809d766e5aa5c4fbf92ab4b7ef3c36e8f39cb4b4d2a7b7acbab8cdf9e1d48e5c277828c3d4f2b73db8d856fdecb4287f3e39dd37433057cfb5f0214380ec991cddaafef7b385137225f8743aacdce401cc69c22077c9f087d0b88a5590dfd5a07461005f0e17203df0f0e1a91ac81b3dd8ea2bc45184fe0e6a8d821423945e416eefa0bbf99b4fcb17124975d2667a10f20cc2047a641876e1f83d9a411306095f9d069cb6d742464b38efed4d27434b5e7c8ec33b7f1b1439d74044f67b9e47edb41dd72977c2c6b8cc24156e974ec1a479ac9ee9517bcc48de6541ac8ebfddbc0654511eac9229da651214c1f8fc1822534b606f9d23a86075a764ad894994652cd67d0d5d8b06026d8bf31b959307e0a61d491e75046fd96654ca35d243ae512776662c1a6188af46b59fc600c6486e028a0cf85485d1619263ea4a3e758ae4b415c0fbffd9a70ed832e5c33964b5bc3f9df2cf8b8ec4e6ce8fa1e86629fba60527872eb9c67e7fb7980ba4f3e6c40211afccf48fb44128aa44ccd00ab33c257beab2bc8839026f20e6705f45c325f10b21af19ac054b2109eec79860945226b3caa65fb68aa5cf2cfdc0afd8317c4dd5dbe3149852260dd99eec6fb2229e3013f9973a5405d298bb762a0a7210f6c20eb8fb6760472a8de54d2e0bd915acc63cffb389c178ee4687cf07ddb3bb2f42a65f2da355b0902b72a132df8990e0ac7caa8389cbbad3afc9da68e62211c0592c9dcf3eabc18f9b21a465bacec7ea2e888f73deff1fc0192a02f6f2cf19b8d880632bd2311fb89f5eb8df701be59d90f70857f6aec120d7b8fd5a3bc62446014c8175ebf5e184f0a3aba3f42453a6d692fab30bd030593bb7d9b6e930d7fbd635816b01164f2e419ac42a7a3d6a109022cadb59b99ab1c829bd2a4674d1627e4b4745e38e0d648d5332e723d95d131d4205c4211ecc583ee02c675e93c110f4b7d141683135ca244c6fd3f28e1c0af4dd32a84041ec69ef8eebd977d60af31f9ffdf2e2daf31ef94ce16918abd59f20aec432e6cb7c1e85c5702a0259a411d81ab7e645e9531d4c154788533fd9cd7b4e5d5f05508a08ab8e1ffa1d4937ec8d8e73f0177bbea025463349e6ff86a74e536401d4fe7f337b31f06242b918f2537b657cbaa48fbec971476a7c7611fce5af9a37125ef3c9bd96a089da4c8ef58319f05dd9a17cf1279a3d3e3c91a1991fd5b85fcf2a2939cbb45de8768515f9ec7e388b3a3b4b61de61abf3ddb618000250d78304452717edf8a38ab540e47a51889c4b9e58f1ff51a6d4870de306749f94d0b4cc8383cb11ab5b91236940f1660f3fb4a5125d667dd78904598f4fae48c499adb464bdce8ee13571c10cbe484b4ea4a289da23f28eac7837dbbc2dcd3c06ef0bb32a823504c01a73a281610da59632b15e41bb4874cd00d1d163b42e0d1124e7013b74b3ce91dacbc60a311722309521f24c3510b7af548af1b04e07c6304f675ca94bb20a5293cb480a011cff7a74a88ad3e63497d90982a4d6d22ca2aa0a0a87901ead31aaaa016e68fd1e316211442c28c0989ddf88223891a5697cf3919948ec24ac0d9d4e475b5966f39933b4793a41c69b137e4a6a6a1a9d0356b5f95523985a2c0eeb208cedc8c899fa641e12a424939f04f01e82d455faedcda4cd00b788f1b49e024bb8a60d58f28b668a84175339c175cd2e66c50a3463ca90adf520a814c404267c197d3ce082af4968e9c550a7a404e40c2db2904fbb36c2d2e459802a7c79ad9df87ba5dd8778d0f473f85b8c0aecf8ac586ceaa75eb646bffa74b6f7dd08cdb678246b38a2ae4b0234caa16510d80a1c4395e34f33e6a24dde2b4367f56735dcdd0d5e54673e32640d99dc4711a6cc5ad15c46f0305186211e88535039f6d15c7d83a885e8f5e22b6f8b7d087eb5a589ae2792844e4aede33c26923661223d68970d049e358be5bc2c2c649e8fdad084e8c314dd31107d0440dd4d60b7845e69a251785e0fcfd447d9b6c7609b520d9f17ae9cd8130aba8b76d88a964ddaac2314d67142fe894532109a32571ed09925c2e1f94f670f549bc6babbee8c410b1ee23f7b2a49557aba27a264b3900d9c6edc925b528bffde65492ce9f0ec0ba3a4230586c39ddb50c90634a57872d4c360ed550faf518450df0d6c23dae8ac822d775b4a66b87cacd10352a92a1fe3c11f9831606f4f90eba60674d7408d46496d8982ec2bf21c2b4cb56f90752186c77a731f16d3ea22c47e77c6cd52867c2f8b9418245a17e67b94c97e7cf05c4f8a04791ad7a27e05f3840d52fe20dc7a94586f64a81b23fc1f76a15e34c7c40d225ed990c54c0d0f2c5d270bdbc7ecb93e3dbdfd6505974be6027c7173dbb0107d5cb1e260abc83e4a28ec4778d826b00bf93cf550316aa41a532c0eb595784f570de8bbf112e1a42c396a3fd6891d8b11f80678d71b93b3026b8ffe595dd1ada739f448d4790001cb272ba920654bed7fd4c72fd732edec7ed9dbdc7c203e049bbfee4d6d9e0bca4d475fa3401ac18b1db95a42c527a9dd34fc7197fa41ab32b1b2f2bb60f59b140236965630952a2346a073e9657c8c270eda23e0632f53df045ef8b2401bfe628c2aa158eb6dd67d3f61442605b363efedccde7202850bdc24af750f152d7e751e04ca7b882ea8cf32071f7eaadaf6121bb338159f265ee7a4c57f651833a9667a9cd01de30f51a88232195d7c2f6d10ee0c9b29bd6d5c4671fe64c41b0062164896a43b2aeee4d0aef6dc97838a514f4506a41c58f2dcaba23d74f21c1758e59ab7c1c57f60f2fb91754e306979543f6c5636e8eb98fb6477700706cf277895ced8ab5f7274d1b4961511b7fe253e2c0d11e61c586535300edbba4402cbe8e24289d9bf014c20402bab1e9d5f04d6cb5c30647b88b21df80eb48046042aaa6e313fe70d596969e76fa06dbb5e1c0bbab722d500d33e7147a9d84a20e45b4fdeb919a66a48c4f28dc8d8abe9b16c0246caa20c222ba806bc536dc70744e18ba315a72d6417601a427502bb6801ac90336df5f140df20643340fd910f0e1a799cf3a1aab658d1b0c097712020a6fa5706a2015653d36b2253615f53343f80a994dc5b34181f5eccfe5d79000b2b471e09b31db444cf1b4fb8cfde0dafff4f96ad9b9f27e0f8045ce54dee1c3753488126da6346546a2ff384cf1d755604c50c255faafe0f163a778f979376ee40eefcb0dd77aedc4e47dcdf7793f453214e6c828f287597611259f8922472d4bcb5362325bf4894efb8d5c41663d2d9688909e2df274236943a6cb653b8ffbe6d0e995500bed05cbc801768d1cd1885e66c55266ab7884f84d18d1b1fee2a4e4b7ff8505b3f4de8c5a724163594f9027f19eb20f263a65973c34e0af68396e6dd21517a6b0f59bdb1ff8683c377b9e4c7b3639bb640dd7e224e75f1c51fd098762f415fe1db2007a4eb81c8e8aedfc895fdd0a392244574b3eeba50431c57c63b5828aa8aad28371026b3119621590004a988ed8072fb042d597aa98c34c102640367ed6167073c69fcb98ceaa4c460c27274613bdf904b65552d34286582de5603bed0ebc4601dd68399f26c71c2b510aa53b390f10cf867d8928a4b38a75e74db1030ba913fbecaab7bf559906fef4dbbfee002da7a9c80ca5a0ec059d42fceaf924eaacfc48ed4a6c655a931fccbc3e1ae468e3111765998eb6526cdf33ff83ee40fea31542152a7c8e3c99ccc36006788a90da8b798659a9d0d660a0625fbc5ea7d0bfdd4f81f6633603c9032ec53c35ef6f9ad685a7fd1003e0582f42aa2dae6e1cb844ea1840a386be5c9d70aa65dff76cba5e5934a60427a15ef48909260fb93187eea5311702495607eccca1ef3ff3b7c3c47a3de4ebebb48398a3ad28f69596771a5c785b65a17b65976880ae5d2991f1aa311cd0e7e19898951dcc2c8609148633af95d5a8b77946b8684c6ab2e8cf56ca6847fb5ace01348715bd6ad1bbb4201e9c83f44b3e259cb38b3e5a74e78a2edc51ce209f14cb61ff21fdbd5e4bb73fd9fb25a248c3309ab038f3dfe3a4a882f09330ea69fc38dfbe14dda510593d7cfd324dfe1780fe1606bbab43693cb3eeb0cb05f16dd58c96df0a4f7c4da5fa9bfe7f7cdd3de03102b88afc5d9cc4c21098ce874f1487fdf6cfba1a59e18bbf4973f3c9c2dacd73781d57068705be1849a6ae37d02818f365faf603fa3ee4de94958974be3d1c21a4a08fdd67552660e85d29481510b2696c7c0c8bdd3567cd40329cbc8367b7ca9da94b2c84b43baf72a730f317b787d1b1186c9665561e0dcd4aecdf7263e64dd980218a4731be0a77a98980227834655f770e8d3f26e6962bd528bdf083854e2dc60b0c9cf97446ae5c81bdf59d48f175136d01c5499db902fd21dea78fe3697f76bfe6411a8529d7be7caa2b14f303231cc039b3b61756d35e9981f5884756f50b5a017c1c1875c50e7ea5ef9df5d336ef807487c83bdf9cad677a4b8bd4ec0a26b07d0ea306d64a88cc7e3f4d049a53e828c333ffbe0c5c95e1c8989990330fb4990046ff9f8456b0cada08a8729d64b326222a07b9f9ed60b0228e8a941ddf571a13cacaf63a60b3ada502ae79759355c11feb027f35e7ecee03f6b2fb113b79c840b52032b11d88a008d2b3aaf52e7cd362515b34fc4d1507c167d475534ff83a8dee573ccb51bc523436dd6ed3e23720ed185f7da841814e02f7379fa56aea101702f03a9005a32b13365e6b6bb9726bb9e80e06077fe362b1e7b6b6af65e58206c67c2d9bc20895bf36c0d70416fe4b766e46ef646061a97a4b982d4cd72f17749ba853fcd5bcf4bb4bec3d576762fe8d28c13f1d2f1f5b920e9a1c8d3af3ebe604f356d0a30b930c5100270f8aebf8be8c874ba27b7c95421938ddeb56b2a6dedcd2c7884dd208ef8693352b657f03fcc012d6b6a89e9d962be637ddeafcc0d662e9452f20b5659aba64260ec6f7d37274c837bdd2c6452d98306347a81d10bfd40851862fb706e20821d550861a2457f4ea1e69318fd920395e469af250b0dc5c359bac1fc7ac00db269acd09adca1cd73833183f57a7a601efaa08a9a27ec713cd7ebfd0b2ea342f5fa69693233952c3177ce2a0e514f50297c768e0271ca6d782c69ceddae5ebfb20a3575221ceede0f024b59ef24a9ecdc417aa181f5da25338f94735033534b7dc21c9a7c6d74a05fbb84d0dd30f2189b046762c11f37ba7d7766e3c6a71dcd7ac14e9c8aae328c012a2efdafe93ec33f54c47c60da29a95bb9f395fa6d861c8f57c6ae80be86641d090caf45ee56627c8f8b3c58d13b17dcbe3f84e0521f90f34f4afb29e98f02283eccbe2e3f1e44d7b939c3bfe24d346894e593997966cd0b0c207689e619235d63dc1026e639b4faa8246bce483c762bb2fde589576b88850bf49d714c167158e58f9bd992f051842cdb474e859cbc854ceee821cf1e90d14a6faea2650a6446694912781d950cd124fdfad01de2b56bfb9c94ffd3c224f4c79e7cfbaa42384361679f8f9fc98a31362aab1122083b2dd479a96188fc164a62b0691deb5989d144d4bebe1358bfc049b7b3571f51896df4121fb1b179701bb9bb89f5f345dec0a1ba7cd5a90a64f5d290948202a9a552e3031b9d179b55db2a0c8f4f25c0700bfd65bde8787680990fe4a2135db8ec201affd8c018c413c7530350ca9e8f10d90946b6f8163b0573ffdbf32c675241867b900284389e17ce7f420d67ff667de2fe5a1071f3209be312fe7d7a12ac7fbb6ba7b5b0e96efe966345ff7f0664089b06efce35990888bee84ee352e798b39204dd3501472fee83a31b3c4a9870b5136c021fef0df8049ae0a97067c44ac573b054603e0abbfa36c1aee2a8a41e13e72adc89e6f60d263f740d8b3a816d0351ecc228f34dd9a96695dc0b0fc13a4cfae96faeaecb1ea7911fe1d1d80358cfa380afaf6cf9acda1fbad394592ca72810291d9e19a330dfbf2f43c1bcba244f5c3148176eb5608d351f0c3d0be183c7b82ab94b1bd23f5e6541aa3dbca0a000fb8ab1c84453e3b455f29f8bedc4b8bce2508086c560a703f710c5a67711e90371257face678ab75f9f17b7e7e7075bb1665535854f2e893d26b5ca983678abcc646316ce5310aad930e6ca68a71141fe57df5079507e5212d13bfc9f02221cfc66517568f57b14cd9a6cf180c8729dcbbaa79a102f5eee774ae7cf8cea5c4abe5f1df220c2bbf1fd7a3b56c061e28b1082d9944882ec451b2b763050fecdb39be05dd73425d58b2d318ddbbf9a8b83b2b9739b4f1e7142b1df3f6b3f4c3236c760c6c7e32667050f382752744a6dfc295d8565e20e054f0ac6ad1806403216c105d1274336318398cb55335d4d0be7dab767aacae40d8dd17e66636315b48ed1375f7ecbe0a7ed1a4acd6f05404cd43296e71a613d680707ee6c0c2c12a898355a33bdabf7d1e3b01b3256785fe89d446b1476562f90bb7c06f09eb4da4a71063439adb92aca2e235358cc898dbd28083a1466febc6ea8f0b861dab9af420f15fea0a2cbcd6ef9a4cac9a69df7b31ed8cfc81d9f0e3c89a50603ccc986f10e7a1a8 Params = SHAKE256_W16_H10 Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 PublicKey = 0a00000aee0d4c904559c13a9495a2848437bdd5181f86b81ea069907d14b1c8bfdb29e103ffc674eb1b9756c22e1178c39abc1d6039c6e9837ab212c400132cbad36f8e8d9b0475156c34478db5b273c1070822883aeb07e55a235f4784f8a83bfc4a7f6ba56a9bef635c6b855469e0beb150a26403efa385db9d1bf96dc208b4c8f52f Signature = 000000000000000662bd1a7752f2f1e2a8feef514c2a83616374d1003b1c856c7d1a865a6302e6d7875b187381e7415521c1c1a7b536197e6f79706cff35cafebb24b249580b18b7f2a24e6a0b75183ed8a1ea121702d489fa2587a5c2ebc8b6b20ec49bed0e33200ab2a05f81f334336ce9d6b622f5a31ef7ed614255a4521a6f2736c401b12e871c82217fccf37078ac85e930256c1b3b9a034d136c83db8e9cca7cf1cc81b47df6693036ddd9bfc9360e85dc49559e6fe42120cb0924bbc1a68ddf5953d64c64f0529c91070ca8feeaadb376990bc90163e2c80b587e2a86fc81c0b5e51ac6618a1f294f323d39f884e1728dd2690d01f62d2b25648198cb2380fe242da8c64b86a8598c73d1b3aa0e467eea99aea53231736f02c55b7d5061f3fc726012321b69ddc8150d56f3dbcc89958802386a4740e6ff90f2f4b17f49b0d168ab8d1f131413852bfbd3b48357ff890a378917247435fdef4239cd8654932b09bdfa9e1b300dae285870cfba2169b1ea9b7371b3670bea5affcd1dfc16bba184ed3c2bc837eafda18785d6624d2de1fb27062f57ea864fc5923ad252529bad0b307f6805467f3eb425ab152bb073e133a1eb530de0349850d047eb177cfbc6fbd5885db745e2707241b34a50485193b01ef5179a1d7df80b7d95ebbb9da74f41526a1ee85f4aff0c9509256c00a6b248190bfef4bf3303332c1e2ce44586ca106dba380138f13b098ffa0e9aebd190379f81df01b0e7569480387400d383964d2e9ddfa12b2a4b87b99f021278a65b4d6023167b3fa4cd78efba2eec6298af5d4b63cad70cadee80eeb9567919cd834eacb1f8e1992ec8647fe3226ce377e64b7564bf63af0da6742e77709ce7a43b4fed06b6eebc439070f05d324d04c9b2b80cfd9883327afb4402bb26e78782ffd6042329c2ffb96d0d50ddc03340e85365e28fb31973a39d0f237afac95163de5ee5a156296c24c3d8b6c734a543e1c52f1345978f0deaeedbec6bf314bde48335dd54b73b5bdc6bab03caa8f78c750b7fd5c1cecf9dbe7df44458030869bbe4b203b3a4daf88372b95c6a0999f969c77ab35f4c1f3a7daea1fa233fea073a73331f1e76b58cfb4feb1caaf705898b4d81e99e478a6d863d4b5bf9bc88dffec4113a1512df5cef30bae9dd7ac854dea05eb44a8b805f8e2d10d761a3227ce6003c2ed1d7ced7719b534633accb8b802e82d7cbea16ee3765f3d1bdd5c00e4b2699a0ddeda32fb36db5e3348d8d53df8309772b11ffc6eaafbac5e63d68a94c35854b5efa8346fdb1be82da632937ef90e9d6ec955fc0585616522a7e2b4890cbac550281c8841e3bdfd88f48be87e1f032ea97ee44d1f8a484cc08da3049f462511a63d93a443066533769dd640137b6af644e8097370c238e73f8e256622cad3119c9e753ff560655820f97ffe9409751d025ecced824b38a5d816c0311e93eb222f395653d663a3a31371e33c8351f14018206d8981db047eae7c04d3274764fa4dd585e0649073c167cd32e6122337548b3a54856d675b532187a2368e4bce16fc8d695db6d054e66ff6b4866966ba3b04009ef7450f7d83389484009123338966ef23aa5121f26a29f2f04f94795f7494e017ea6c3565b9af340b5898a07a15859e19cd1515960c01173c178bfa10ede9edd7ab00329fafcd06565ea9cd06debe2a6b29fdc0f13f27adcd0cd4a12e89cc9b2fea81fa0d6beac273f51c533fa8efd9e5fbdc46cc88d9e0d11a7dd9471aa7ac628bec5e4a97605b835c9303a572f23a89932ebb42d520be6040ffa172ac2ec2ba547328c485e4de174fcb2e8ec9165317f7bb58233cf811b81a3fd2b0ab6805e08e06842ca17885fbb662e7b2e202df292d2241e0c47662d269a59a2dc288ae27df45efb615528552281372920fa9a30c328fc85583a559d618d8a7f03cfe6965426b9ecdfd2ddd779129e415dd5fc1d3aabfb8cc97b75c0346e97fca93e32304a6528ee4441aa8f86f01f84dee19bfb72b3b40fa9e3be4e3a70f3d6a382344c4e04815fb69827f63e7b01253dc50e68473527c509ae587d1f6ce312dd12a99f74dcba7db3d17f53ab40495c36b7bbe94b2f05993c21afc0db5efe4851a49181350bc43bc687afef098fe1a7ed08c9b5e98ede02c3c1339fecfd79607aaaf757cf117674616370bfee9bd19eba2029e78423728b9e2ca35d321a77894b2900b63d83a405fd15e725bde59a791b0cbf6711f06d268106b17e68662ebd5062f7641d290454f17409067e868a367e210f10c87c33c7e02e7d07e553881948c7006a419e9217f390bfc41a99bc04926d0a1562d4f2a5b997260abc0fec5863c03cd3b405fd1986f919f4c97f1a6e7b2250041f5f71c50ba1e6e93155ceac7f8110b64c040b2ace79a1bfe1be656884e2a390211bee2212dba8ffb9d55d4194d6b666bc2a5795517513b82dc970840ba4c550608a96b5e72909217ce53d781b14ec8ec7f7874ef22cc1298ac23aa25e8d5f68d5e333b8cad8d713f8172a24158f46b587c47470655af8611d8eae83d505d1ffd9d860ec6fa218a762ed6a380f1b3eee4c3f4e06823158ba00ea6b199fb99a1b8a6d8b403da2544d340f734cc99163bea0f84d2acff5337d98dc4381b202b5e847db1f6cf2b99706775b4796ff730fd02a204f65d09a549c521902b34382b88759d35c6d4f5763bd72085192a4842a7eb54f2dcbd1e7f12ca7341028c65a3187194f4941d95c78b6949b3615f8225c11d41a4455c8e5494bddcd0d3dcd5ff8b5b9a3c2793b2883d12d44783c8567cc008c323a34697bdd5f83ab83c10b256b9e1dbd3dc53a37dc01d30a2c4277850fbcf17f3e8f8bd94f5604aa94227b1144352ac221de4993ad93b9568d10ccdd42d7b5af290b8dff4bf991f8dcd9c2db5f8c6f3606d0a52bfd697ec3efc79ad00ab08f84913f419efb1168f2302b573a5098e1b18f2dc4fb4ef87fa0df81ff17aab6a1088c93f0130e8156326cf676ee3a0c67cb44aee1ac2795e95f9c543180ca77c26d71adeeda7dec56d0bcd186b6ff3c281bea30c8599f862630cca66a2e21df9cfa810b1e7529785c514d70af0eb1a2894cede1ecd91cb5862ce403669a209b70d7baa290e6b4f777d361275a8203dae89dc60c87c03b116d5fcfd929402716a9b63d062cc586d6883f43d8cae2108cbe576b334b4ebf9554f76001e8553f8e78ee211bc204b3dc8c9951288f4ebe438ddb3890065ba084160de737a1b2c813bcabd3059d4f116d115ae9f821da412ff711bcab0be9f1195d0e346ecb28ac51fb1af107d54c05560e209a6a36ad8e7327575f30c3ccc233a41d68b8b235ceecaac6c898ee660655707c976f04ff36107bf1b12fc7729a57d7042c4cfb2e55210973705cf55ffbca5739f137e6c1e5b9f81b9b5b8c380aa0e92ab61df8af6209be051d64d185b20992f16fb7fd14cb6fee6715bb1b2a32f8e34be755c3a85adc0ce5323c2ef0516d7dcbcaf729dad6855144fb54d0ca77f9607021f14f6bd8476ab2d2afc9b9c80cfcf29c0840e5ee1acc76e2c256f25204968d5d85d6cec96fe964b9f60e0f0a784bdc1ead6e7c53474f3388b413c04e61ba611d5f764552bf97bad8ddf0b4867c787be5f70a18e8e8e074a7568b3a98e6bf166edf1008ba021ada564edb29ae544b4eafa85979b95d6d94930e624c9ea1c3503b5f89340f62f3020a030ecf34a4195f7ac8cba14e0f3e77610b8196ceabed21b79dfff488ea220b98a3b759f1d90af5f7af2aaf4a571abca5fb0865d3ee3f6778a82d7a7fb35440b6392a0a3909e0d29145ff594d3b7bf143fe7e935487358097e92dd176488769ffc2d6aa6589d1a59ce7dc2372464f28b7a05bbc542e57297d11dbbb0fa7b8a3b240b9cc6f018ad79abafe6681bb5ee4a04d61f61f015f28ea839c02a207f0a7ec8c0d82131368c2b715caaf070d642a104af90d0644465d7ef526ba19ea0a47536bce1b8b5459265888147cefbe7c6e91576ff09ba6bd125fe8fb0ee864672ce9b17b18711bcd51f2f6e58b05e784de5aa9055150fd5f814bece2a4eb5b90d202dee3cebb7ab47331827f54760213b5a4dcdabae4b638261cf3df6827593bc63c38feef8f8686418e3abb402ccbbdc68b86994f456c07b0ffad49c205e6052cb0b716ef0fe72bdaa964c72b8845bf28580761dd29f252b2f2b0ede01d396aedbd15d5ffe51f52664a94fc772813b363456a7fcc35f04b15aa45d881a2a40016a77d468312cd02364abd4504d161404f58dedbe9e844bfd782823c6c111a70dd56c6a34aefe2f1ae3753a4ddcc20d0e678ed925f2f5f2b339fbc5f28cf42c40e0940dac4848e95270e6264dea56e6856303879097e14aa11bbc00cd168075e5c6f4f3df294bdee00980c1f3a9e9e5ea7ecf1c9388b96e58dd3d30fe34476e385a4ea4f59478683ecd658796cbde7d95dc278b452b47a1ad307435a24638c1e404726ebd4229b4264c1e086b80497a109d94d215a24e65b374c162de08bbd8e8c7bdd75d976bbf76103b67a3019ec765e9e4bedaca8a83fbec472829ea06fa19de6328e3d83582e403c1d966c67dc117c7ef74d99f4f3aa8c13d4229e8af560f92bfcae7b3f28cfa9c04bc5753ba9d5777ab08a039f53efdb99ae1443167f2591f33daa3502651b35a192b0aff84c21f9bc551ed913f2ba8166743a7841a904c3e24d25d79b4a4322965e00df7c17bf61e19284028b5b12e188f90a8c90333f3f4e8df09383b919dfd05dab2ebf6bd56306d4a81fc688373c9fcf6088ef868dcd339510ff57839d9fdb68469f2346815e1bc8da0b066a26b3e28c2280f4af46c590fb174db226c4befff0f5fe69beb88291ff7e85bd53804f81518a95051b6f8721f47e0250a3af377204279045452b803f63d72aeb677b42a4f844f5b77edc33755bed4f2aea5f155c2efc3ddd839fcd2ab746db213c6949d1ef7a2f7db01a3578384da05df259e7a7c09cc06009ec662c51745b5678eac9dfdb9dc494c32b2a13850a0e365d26f355234e58b63ae15e3b6001aacdb92af143d5bfc4b9da8ffe5840bdb25ca9190ab18448002f39bb4752b194d221d0e6b860c07d2161d53fb6ce55d90c7e17d52c9a4cad8be432a6b111a8666bfebca8f3ac3d51db407489bc5e7dc8e146fc26c3b7b1f148064b52234b002e33075e3bb50f6e338f011b18cbbca6628399118c1b78e91e4edbdd666bdd8db431bf00c3e5f5eb50cea0fd89ef9f705b257d9558e6e779a7a57774dbea300414d1f40082574667e0912938736f0cd092caee9021b9b61dd692950ad4adf1506002096ce77fdd3f146a963852c2dc3a56f263e5e4f6402577bf7312711af8bde9689d1d21d608260702f1c8cb89b723abb425c4fb71277c8c8dfbd8c026ee20bd61a6d15f5e245f944bc0ec94a7a9df15a3fd13da07ec1d78e99913947f1453af340ee037387fce87b995690165144bacf0307ebeab51ef5d7e9d5c3a3f8a73d288a6f84c7d8245569646b3fe6840f7a3401b195186648a0d404003cab9f2dc16185ee224a1af8e5e7152cb37aa2f27fadcfb65f72c9bd8c4d60b7b72b77c9dad675d945308967e9326cd6cf5f593fe6b80e91650400de80da5b24c6ac5234a9402e55556e11010fcc17c3d5237f6d0ba2c2522f454cac148da60469b67cea27e7ef9a565d417adc302f992bcf82f8ca8ade35b791d8a6dcb4099f2406f7aa28edc98d3057560b72dfdd9001de9bc64c154c2c8cdf5968cd3d4c2aafb8034c42a3f291bac6561756149025865684d4d31d52f9f9d89fea3dc7eceb7115aefd38694b3451cb86e79f11d2cb623ac42045ab02e1356eefc86e981c3a2750e7491e02a116d8cd775bfc7e5e69cb092ea427a22004586e8dc0a154269210e84089f5b4079ff11820dab2c51113de6bcf63dd3d429fe85446108d0c3bce9c5f3b85180e7cbb329dace1d82a04f08387c12dd58f00c9fc44e452a82b7174094a98dcf9055eae7376c47283edfc769cac94470ccee98a72774eaf902ac422b8c3b8fdd79654ef6258647734c7bb1ce76faa5eb1f62e1a5d5bd88620d3d5636f25c1a1c17c9b70f39733f973138378bb4679c8423e19e5117d6672d50d7764f2b1d91bdfdddb69618fb038ff372b3eae6a7583142c3387d83f8d631a95e50e58195b8fbac6bfef57a4161158e1e5b5be2144e7e00a43da983769b6ad9a58fda2b24382857cbc5de6270ede23142ad3d2ed22e6ba277bc6691c4f37dffa3e00d3871db507276fbda9d3e15d89f2dd4f0413a2dabfef8e1b8702ac1b5f2169111a8a829bd5184cb442d8dfa8fa74b083f6b488fbca74e664fad8e9f0b0f3b76991b7f556e9843d7ba3a5a6e8170f9c6a21b5103996a3e3d8742538a918673aa4536cea16d0aeff4a6db80553cfecda1125132b7f87be19cfdd0ffd73845e40ba945ef352dad690fb944bff2bd8451d526b40fb1ab81228e28db3a077db6d732d44c574036b2c0d5ea538c8a7ba4d88de3ae05bff957a66cf00288156325b370833c07fa30c0bc4cebada22fbf157b54cec95a86018fb2b2037dda61852d7dffde6a3c2d708a13bb2cc6ef2a56cffba003f31fe21a22f4d7644124079afc2b5368f2c2afc48e6fcd0fff3f1b0597d4bd093d150c38734806605207652ac6bb49c540b0564631252869e9c0f4ed7be45887a1ee1674e3aea2bc84c59ac0f364c176ff9c5701321bc90d192d1afc4719065d7082b6e221583a7bd97f392a988f8643919c619cbe38f48e305e3174016f170c781160097be579235bb442d539ae371b5b7e5e26bd21b02aff4c18027f92b068793a15ee40b7c1dc07f6e76fe2fc254bd6f61ca701c41e14cb85856970dfb056d2effedd522111b575b0f22f8ef3e9066e6815f364f40cb4291a02cc5ac88ec20d55e5d3471f1a39029ec4f95249b48cb025d280af9604037ad56349247d544b255f11268de2516d1d22e16dfdca0b65daf5d32d4e94a862ed6d62a66f2b1bdb00a4a20eba5e968715c19d11173eb39824fb6ba2675bffe16d5a9706feccf8b7887ef49d1e793335bd2a347266f32fea6c6e926f120cbfe0385333184994b40307a4755b69ae3319da65417396a9a7d3b2733176d8d66646a202368771933d78754fec4eb2fe8b2add0ef4e9612c445fbd9aeb93279015673fb692410868c78b701a7ad0ab924a2992aabede3d4fe5f75893f8a8bca7300a27f6c890829884991038721977e18bc29e022fc044148d6ce8f3539ab887fbdb1d80da22d7c1725e5b2f3181663b7f98f91c91d16dd3faf6fe07977ee3d3b7e9bcaaaa3ae96df180c52e52a83556574f4d26fc490a7f52a89b65023e8b0759de67e1d35a754b52677c7979358520b2b3f4d6c8959ffd971da08cd714076222b2aaae569dfd2a277e30c17d0b035cdb482e52f78b184a9ae99fb8e929ac8b0fd1b127afbb0e038aaff96c27ccc84dbd6eae14d28e2871a7a0dcd63a78528226cb39a3de767195b0c10eb5cbfb122efdef6a79d496362c18a8e590a6d363478312df321b170ec8e70b954968aba4467145cfb3d605805c5b21253f931bd1b87d3ffc18c58af3119ae572def2339691c504def5d80d83dad0faaec80b60c56aa940c9e289e5d6b3e3e80a101bdba233028e08177eb7ec0a6de40cd3f53bb10ca333279886fcb47ad976d0d64d788f6a3697bda3164ac22bb524026d65b98a746daccc5da34ec53cf5f1416d242aeaabd086982fbc362c2296fd90e6b0e6563a171980afc8c4e0846edea5137c0ed5007c9b3ff3b985b248aaa2534d6bf06e85b1ff020fca9fab744ac61a4710586d94c8f7c1e411159733ca82b202e7162b6a112eb400fa8b179f84fbcebae798e4d06c3c3f57dfcdde76d07414a8420575c64dc8c2ed2257eac40f6b7cf033fa9406ce47b5fa8b3626a30f4282d9d2986cbd0eb73040f2493aab5a4840ecffee89d2ebb4ba62c7c88ef7179a15081c26bdb113e4e97af91d0dc38894c6bd51c8ab39739eb07ace4946fbc6a5225c2d2a4a40c3d37930d8e831f1e35e87ea27952a6af6d186d21f2b85dbca97c77f171edad5fed76459142e2afd1e238ecd6ce734075354bc6c3677434cc4907bbc2756de4b1715bd64c4f7097928142c64f4b88710cbae41cebaead35fb432144f389e016370258829bb517b9651090035b8bf6a3dfea8e07aa1915c0917b9d26a45f0c8c287e621ff5d65febc46930fde41ed8368d339b160bacebdc202d443ecf4cc4c108f1c76102e0fc700be96e29457ed1f4bcacfbdbfaf291fed9d311a63e25362823161f4d9c2f57cbcf24694ddd73b202d427ccea264d36698431fa9e874ff5876bf3fc8683852b5723a53b5ee583afeded57f81ef89f85ce6ff18bba9c7d64aae843ae7542290788f444e5d6e9f7a12a5ee423b9d3fb509a1628e61fad5d0beeead63bdb819a3eb0f0eccfcd2e3e1af03890a2b9fdc0acc825747da095b58c1a8c5c1676f1ca69b75c1bf5274243dd0f6e74b64c55a5d0194c0f39c9e94072c62ea86735c958ac58ba79c71d1a235d114622cf830bbc761c31047f4f86959f902183b2b6505e5bc4bd45842699ac4b0a8fb53b4e918a0174b21e4781f008ceffdd8cf294f2e6e186118e82e2075353f743c2f09b3fe2ae39f8da6e83c86d4de96f02cccc74666a39f07c185b9ae592c2ac37ed18ec02875ee7045360ec07e82a02817932f18d7af12b9fb9f54d274d5637a1fc03143fb06a08d23a4e5840b54bff13eb46ce5f4d745c660b222948e5b1050e84d0d9555f1a83159d795546398f05640d411ff580b5bb28b0d6ce5ce47f0311a226dce617c5cb87bdf30e7cb8822a44fc72ce50d46b4b658e3a6ea8eefe56e481eed83a5cf8207726ebbe04f6eebc99fcf42b3c6a83441804f58432b0e5b70d10a0fa3fe33405558e3d8d68daf39aebbf4f6d8a707bbe39a84c283c35857ffe72cc10b8f348beba0741b044f4a181016d32efd84ddf85a1e8dc7e080bf6ca2fef98441d554666812a83fe13ff845edf22a24b027e819aff167ea5e895c9e87ede2b17002dc9807497724f898c4f94a8a0b4ec90e434b20a981979a6ddbb4f247c851bc8c0c115d3895e9e6c40b3ee9dcc7f4bdd7a2a564da327fcf84540aefe4c7e10295d8bb69268c4bc757c763a2bc49bcf3c0151d4a65df3ba3e6f056b582aad1ed0206af91613024494cb9a91099ffd486b5d6778beb79a671c82a41d8c79dc27b75bc63d7c04f3c387c0a094f22041f33a67bf1dcd6f8b07e2f5da81bf50e35fd7ad69772dcf5a56a45ea0a0f5f0eb24aacf5d9188dd864b04009d262da554aa8885521c4648d6a2ab6e80937d3a6cda4b19c75d57159a178fee16eb992c7fcee4a25ae6018397b07388d4145cef69fc44fca853d0ef747b9a5692c0a92e6c3b04a9d5a778afba4a9512c7ff9ed040b3c2bc7c76462ba360fe4486c00de3bfd70d3508a3e0ada49d5ea0b27d7af22d0b4c259979180d625ae97f4cc61b02f17941e526609b1bdd2ea9e7fc94d889d2f5b4f15e57370cbc909c8b80121953ad2e96aaf526f09c5f9d0cbede558f986988f4bc580923b97d785791b7cfe53b68cf315c841e75104ac784491f3caa329f3b6f455d4368e1d39aba7210145b4b01698f2c711b95c70ce3e8d55826a69b51c5cdc90bbd7612bd7b9981ccb11fb5506a54b859c53ad678fd1817d3a598a2a0d44e9b594739ec2937b845dc166934d0f9be6914b8c959d9bd8704dfd00f2c9680b4be2f557b5cbcea75d99c9fddc7e540c0a219a558b28394cbfcd01fcd2aa915b3ce8213bd5a00693b742da144a4f0d7b47dd5655e709d60e087d2a751f76b22b9ae67c5ce967aa70ac6027627b5d4d834878d0fd8b64352f0d785845678ee8476982fac37a1de865534ecb5c1739737f3e2918c046bac762182564d4dd44da5e7760dc0667e33d23219ea1f46a76a8a1ff3239297e085ad9f5246003e159745b6f94560f7d1763311b6385c9e02fdc6566ee3f095169a419551345fb47645308b88c54304a5942ed84b1cc8e0f3a24fb3d7d26e4e0877cab519e669c127180e78130dae1534bbde661dcb685f1ecd61014b9cf6f27ee398db7c9de7c461625c545adf250975dd1d710f46943415ea7ec48befa2ceb2995733057e05244c6c4e843147b6f598a0e4ffae0ce6568da75c3bcdbc30433f103ef67b486601e7203a0aca10d349142aed20b487d836278aea12860507a2aa121b2df3a522ca2374a95659bd2fe5a04c82de8aa1992b0e783e563b8b541e1c3ea5ab11d8adf57ebaf53a17e48c3bc8063ad3a23d03713b5fe4c0afdd42df490dcedb6541918337fabfa905c031cf99faebc780be6834241805d35931bed6624baf49aab8883155caed306a0580e23a6232b9b25606b8dd03bc6f03f0962d4452509d16b57a9f0d868eed296ea12a4ff4c862842a20dfe17662beb9045711c60cbcf880027cac2e594db4641770880a22027359fe52a5c7eac44fa41d019851e771b99f264b2248db8e1586d541d35caf4a28ce2958a837befb5fb24fc359710297a455e61f5f61c05a6d753e4b4d7b1c36093c0132b807024000a6f53f8b6285a2cf33668c53e1d6788103ccc9a19033a6b68c8bf1ec4b27a1a8dd3aee49aaf3bf5c37478d705c4ba8d41747e53558341b7c77feed9136619a3927a4736521b7f2fbd7b8b8aa67eff3f56b10cf1eee99f767e37adbfc8160479e532df649a8a79e0562d665cd47e094178c5aead180aeeca6198b9f8aa0329924cf79e1ec6729a71bfd62bd2f500fa46f496ca7678212b38330ab858229c628a73ce2168392cb88aade6076d6c40476447faea370d5ec1c3a7f00b6539ab56da55d8734daf8b4f632c51c9a6358741847173fb080b83acb3cf93b7d2fc0daa3135b28600808be0055f0afe6ba73dddb6b1a32c5066297533af3ef1082e3fb8e524cff3ce5e104a48f7090acb2cd5af7d13d5fe2fd06e920635f2f2fd9b5d42869fe75cf46ef77782040fe6268bf844c55b7494a48e0a67295d9fe337f1e62a7c648a5af60c809ed44fcb37a01bb5c601d86dda3b16899ebaee504ca044c115e089792aa2b555ba4ca953fa30456487e3e158e0c7d97d56a17939b909dd0dff24c6c80a5580c2da00ec8f31f990f0722885f47b14f94275dbc0ef1a17128c94648a8cbe488d847873cc20b26d7dd3dda544060a79f7672a31236a5b36f72c03ba79010d10ff285c825d8ddc88d81962579b5f3f8239e1af7ac0cccf829efb1178b86407326ddef1bd9ecbea7abb99285bc14a629e680a18375b6f2ea543e742d3789db432a9721a8a07f6f95e405037cd9ce67b2b7b51bcabca9b012f2065b833433ee9346259bea6c1059c56e3adbab8dd0a286f52d6ea17f0930057c1418ee90cb6777c512fad61aee5ccb113dd7cf3600f0d17cd6ad97a7ec7a69ade581610730d6f36782e94e09b393a3658210a198cba72c7848acbc32bee743eeebb02dd43138e88f9ff32a394f181fe588ec0dea65df3be8e3bec54a234ecedb955037a155641944e084708486a1e360de4d7b0f3280f639dfed188a7b9a5f6a05f3096a822645f9d5bc29038dc0a7b0bd65a088d87330e1790f3a93aa058ba9f737532d5400127bbe9e02044f288f4ac49202ee2386d647d96af8b086f92b87a3f193be50f96a5c1a3f0400e43976eefaed7bbe3b3b70550f93479820fbdabadd30273df220bf60429c70587be5025e9196f80a2dcd2352b235200d84d17a425eb8b6028ae5bf4f6a698d79a0aee44a8726be93e26f69e8c4268ecc97dd704ecad8f13e61861315d1c689e0e90d697f77eb74847d173f174e5cd9f0efa05969a1e3a47ac5798d43f51f3dc46bd8e7e29838acd39ba9cbd3ef0c17e43f60ac5c7e1d9633bdf26a34d3b897965278860b7f8776498ae8911474bcc037e4ea7bd4e11a9e2edbf1bcbc4b576b29f1fc01dbac0613a2358c3dcb0efe9f59f8e61a7592e79f7c382e647720137efbd96a294a1cd0946ef2fbcea7e0ea3186c0b4932fa7eb841277f299d9fa37cbbe926da749a37bac165e9b0d1be477d2c55202dcde41e1a6357d1230fb5816d56412fe0b0f0794edac5fcfc61c56e9b8fa1301721d8800d89fbfdef92a2fe4b45976c41bc5941d09e353ae0b41c541883bbc4546179b0158e7485a6913b378489d1191defe4c30f06a34c80bf32d4eaa1233c08ac9faff6486cb1609c219c51a25162927227b0444ac388420ff22110f4fc4b387193e4d2424b2d76bd87c5d384dc1f57ceebf9bd474deb7e5091120e899b25460f302a34f85b894bcc69e23a6f664ca017471f653b1c832427e7baf9eeb81f5c466d8afff2da31328c2348b0eb641a1290f0f2eb8b249406a4dbbc6b71cf2e1ef3319ecb9e8035d99fbe25b166bf19c1a4fe27a597c02b6d2c8955702ab43660a175d1515fcd963d1d91cc67ff0c44e5e05d128e91677a3da871026cf774ff3b8acb79a04d697f9e3dca3e87ed93cf86bfb17da97c21b52484da07f123407677eaa241ae215519209a1734043c0904f3f984dd8af5752b667aecc3cbbe076ff73e3a01a3264c1ccfe6483ab73bfc22289bbf748d5c8b02bfd660c71eff424cf48152351bf04b912fdb2d86471a0b0cdbbcb4b50e18ef454c985d6627dbd7d2962edc45a2877ad75eb5b55307b1b19dc8418ce9f582d1196790d5bb6eb774ad6f643ad06737f8f95a920e8c9c6ee38b0c9f5d07002a77f3ba30788817b8eefcdf593c216957e66dfaa0b4f5c3bd10a6cbf0e83616d6385520c1ee1fbc88bc833ff7a45481f1f811e9587580d2715c263c9fe1a584aec9f85dc5c7de Params = SHAKE256_W16_H16 Msg = PublicKey = 0b00000bf02f49914348709a35e51cef0abdfadcf08811ba9ce1eaea52760d767756e6ab956b0c75697b7e6f9dc5144e412966b6648164217d97925664e327cdf2b532412c8efcd6e9abd5dc08c724bb1ff4254a0d0159f1c448dd5e65af77177c320dd5f058109a5e8b5b818cf8553874a441bbe4403b006ad168a6da424a43c2ddf27d Signature = 00000000000072402f41a1e0a5686c48f29c795169369d01cac3cdeb26052be3c85c279d13a95a21fe28818bfc18c2629aac3d14300d36e8d14b9402c3be8851a039fd444d28b57fb9eb3bf14652b1d8881a6df61dfa0c3782a6d9dab60277b6d92870f07da4bd9953ddf2d7b056d37e7d497742380ea91cb509f53c5d1fc162813ac49184dd05d794c657c8a3ed709da6ff7ca8ee9c43bfbfc0bdfcf1cdb179e2f3426c5b18c37791a6639c6b05a8515c703dbe8b22ba89b37b2c4fb10177ed1651bf80d6e785070c6caa34924d45d63e1002d2218b81c15bc144eaf0d0f607692ad62034bb7ea759f30f23ab5b3985ad949ae2f4083ba9840112d63b1ade3b42c46630c0f67600697f7d62456275cbbeac0529173b81ebea4d2bff4aa1ef15b05027957c68f7b4c1d40f719d4be3afd015cba91595d8f5c12c8a9530bc5a5c4c9ea59eb6c4bf7f4decb35a535abde741b60c068e480cc83c25ec9e85e1f7c82d5606264312f2e375f5289508f084d0cfb4bd4f9f6b8afc9f50fce535fb8bcca606197ab98479919875818602232874dabe76dc573ce0aec31845a65e42b697bc6f24b2c3dc8b451a8244e4edc934fc40bfa2455eb61eb7c7afc7643c23a0bc3e9faab71e1aea183c7e364ed2f5da0d02f416a2d3bd1797112699bd53f124e422bb29d9bd850151aa53c8144148cb1bf22530907da3948e3abb708c92e3f8567ac39d9d93a62967350a27a22777ca7fc11d6192ecb6f893a01ea1d84b0dff92b0d540c88a8a7ba05c79196028678212f30671358d59f7628bc9d74463e177a6631d9fce1bff4d750d9c59916446df7ba3b710d975e1bdc8b26b21d60df4ebb806137a539c15e1cf5af942e925f943d0a3276aa7c3feec8ba0502b2f99babc3a3d3bd9850183b0db6d11f702cd0fc4bb1283deaeb15cb61b0362be38c7f9c1feecd2494abc04c886c5e3f77579eb4e00f3263de01565d12ed396fdc2a3618f2af53425a5ae86cd4ac8f450177f0ca8d9a651b7a507841f9b23b1a28b0454369499b72046d4f1ea3139aa789e1d004a7299a7fa4beb344d30cde65e1d5da7ab8bebe4cac02d270f0b30309f837ea9075e4671af3cddd74fa07d25f963b5a9b6c2977c3a07f11c9e027ea1b1944d7af5b706a106c7e20982971f53aefe0ffcdfb3626c4b64d39b765da2eba81647b34e04679fa9e3b27b2a084da8d12aba0d4405b6797cc0b2dbf9c1d649afdb8b3802d937492fcafb0c99ed8340d7562a24e0014a96ebc081a08bc0292cf06c96c56c7727f1238c65daa475ab38a611008132146918718aa75013d870fd5428b1eb2d6d5c8e7ad518ba466e4747bb74e01ce23ed1f4629fdc097d841723eec860e181cdfde33d9cdaa2d6e36d43f9c98402cb771616c35abe5d92e3c2e9674f1af4a163a1e7adc4be038951f86f1edf7afab24f591fa71a3e96f03c5d254e55dbbb22bfe693a8693221e3747a016f9c95270e6ba581f0fc0c3e063ae151072166cf9e33a226759a67a3c9f192a8935c0ce88ae128d27b9805578cf64ad844c5fa45667d112b4a19d545d0a60d6332b1d71988e895f491e106dca9709ee203a4400fbb8429f007c888d9a957b31973e1fd7e22dbb85851aef7d8c883233a3cadb59715bdf12051162970b433893f524136e8aa7f76bc3d848259bc0506b0f3f98223e1fcfd75baed1b1ef2ae9d7031d2d196cd26b15e2df993ffe5148225284ee05bd09cb9397ceb3d621bfaea80c64fddb7230cc576173d4e1a1edf99a31f9b14caa55af0833848db16b5e92b1f9d628b13a1cec1a589b6a00753ec082adfd4565e6a47a3054cfd4994b68d747c380cfd5a625a04e8f7407f2520e6ff28448db68a55540dc4ca5cd6511b81585cab59ced31e61769d959130e750a87bd7d3ce8d04d72ca0e056a28026ad4f06730b91b36a060d8f0a9bde0fa9ae1a2787570ad666be6706deaf0a1d9f1464d6a3c2b731d7af99a4c6fddf6a7c384d71b785e637cee2647dc7618df4840188593ac57b577b55ba365f1b27df5c765c478e7bc79c732ba887c930f024c7bffd04131372c2b4169da6e00d55a51ffa7d38bf835feb47fbf6c65ced91c2d1f898abcfc2d5f5e025328c7d6be8eec74d6c43c25e99d42d89831be32ba6603c13d2e3a08ed79e57f5893607c3e3f13e5006924f166c66f95cbd3f6deb735ce56ef5dc3d7ac6c578025f5fddf851a822958b92535906b091cc48fe86c57f5843e83129a207c2b255087aabee2ce1cddea4ca8709f5095309a0edd710a3225f4853618472bdc2696b512f33504e2831a2f3bc8ca516dd1567ee02ea3f9f1fae16223174544f24e046fab0515cbfed9411573d1a25b38871ef84ce8fcb8b5c4aac6a9ccad2b6ff9253ee4b471eb9905ec9f537e4b3d2104fae94caa1b7c9d15f0e9dbdbb3ed3a017ad342b37c82d97e045ca690fb8d2b3172efd193c12e292d0373f6eac33f96a2a6b15b9a276a262fc9d1bea308d6541a2ac557badc631275ea290172a76e78d0259666cdab183a423134cfa40ec9e9c08074addae42a1a1dc54261948b63931756098806ae8ae27390fdada729c84927b1440ef6661edda084bc8114bf343ffb10a1a156bce796bb59b424cad1dd6d0bb701b88ce06cc2b7076d957de187c02aba2615f9a64270d12c894aca46f89d42a7daaf984c2475c7e9fc6dd252a2a758d78eff568a8b6d6c907e08c7436d898ed7d79c511352cb4384320057ec2538412aaefcbed70f602b3158c7f69c85341696c48468da08d991ba6b8962b80b83442df677e6d8b387d67e4c9d2f2cd98f4515872b43681ca11774b28d7f87b780f8b8247fb1d9a388c8f2468e6b6d2bdc1134ad2268ad47ce56a9f026f0a50ac8af288e4bd65968142b43b8c66b1d584849ce796cf79b526f6150d19d1d427d9a019b562199bd545dfc5d35d284420fe48a965a4f92f97a159fdae7676cde3b45bad2419988e3b7153be0de72df7489015ab86fb5894da2e3a75ee04872d2ebc67b55f54653e5726f8174c1c9f5e9d38e215e924c645c2951f2d0917ded9bbbdcd7b49abe32678e658e042b31fa0a40511f30391a695f25f2772c7a17f454a88c8b5bf48cd4123dc3dd4e0f36252c211a332016225a718fbf75a4474792cd8d733251b1bface1a1ef07da64381e23ffdbc3996c09414470883fcd860d7c154394d1a178e1310c10279b545e03ba1f7d82d59e22a2a995d259cf5a15298009f477e789867e36a331c0e7ba207a05dd4ccba718c544f2a69c6a5119c094e5ce0081eecdb7064973f3e27e9c156a84e63908a14322859f1059a7bcc2b733a455c6c31b4bfe4274b07fa0b134029a961e6d6af781d7c71036e40c69e7f5cea9b4f8ae010ebc6604bcdf73a7e9dd7ce60365073af57772216be7f2dfa67134e080c7af42b9a4ebaaa6c5aff5f048fdac7456931ba44586ed915e6f1b97d51225a8590fe71a644ebd0a1ffe55a483c486ffca577e28755a572fca2aa80f2ab7bca1adb083e7433012e10e52c4b25d0603e2c25daea332dff2334314ce323043e52702c6102de83fd8dc3c7921cc1481bdfb22e97cff6bacf4b194cf228030cc1faf7c0f6a166b3b8a3b8bb4b8fd1af6b92f858620978aafc86369a07a374c87a0e1c0769b7a48f23870a5028fc0e6e6d2ce2f295f32e2051811398f0b93739cfd62bb7f864449ccd06935706a6dc9348ec8ceda132dfe1159486881fe970da500836af0d11bce62a53a23c90eac58874f765904f74da56009a47c656661f8303214e2402b130f5f95d49a58d1f3603a51747d0c80b0ca2f18620e5213d7ab7454ae8de1c39a997c8be421eea735428455d182d00d2b67a915e678b0d8c0b0e4274a6e895cb1575c12640a24ef2577c6af4b0caa15334c4aede9130d61047990bc9d23f712a95724daeb943f764222452f7b162c14d56e55e9be7782cd1af17d46b77e64424d44796af2b9252a0cd3064cf82a7be5b5cb31f4a2b14d754290a1ad0be995b72b92a5114a370e61b8cc0f0b0de7ce1abde5fcf73eb9a4aa602b98bddacc8f86d42699fb9423ef6c06034d60ca1dee8aadfe236c0e28ae8299e4a0ef9f91d8527bf92644a55f0ed5d3300b9a37be65fef204b37a25bc1238b73529e4a46af744a7f57d0e7c847d0ff6e3ac95d194e0e967933859651a7725043a01f0bfcd788daa459320a6b93ddd506b05038dd9b5847b17f037d929ad5aead32341621ba53f6e5a04a3d86619256cdcac3e9b7ea039e679a7de94347f4d7ceddc3c046a09e10dbd1eadaa39ac946ecb1088ee170eba44110ab35f668d3c5442866d1e610fdd5934e50cc414462bfafd81ec0c7da11a19474baffbd4cf41d70892c095e829f57f45eea4f30a60b9b9b3af80bc1e67415b273a1d95f18ace7bc8b2740c2700dd3c0ed659493644a0a5b536c15c5a4518c1f9f3bbb11cbb4abe8e3525985a425a1ad6957617a4e23686a4b1292e51af498c9b6573112899d95c92d23898f2529c3ba4b9a5a3e806a73f5a53cf02a9718365dda49b78deddb1b4510f23d0279913ea7b6a0e2638a9dca63815d7946b21774075a4b9b7c6b1aff62cfc11de0ad94e664d42a0cdd5774aba15d0774b95ca2a0d70374e66d298a2cfccb210419633360c717a42aa23b21613af556a096e4b3f3191037f1117873ac6b9ed792a5a917b7c9fb53f3bad87044e3583a018d1c90ed7017ca2f4ff93205aadcbf4ac3452f3459f7bf08ebcb50a6119c983d4d0e50882bca3e1820cb621610ee5e5493e59418952bc845d8bc0dc943ff54f041bc6761b608d60b84bb0f8bc8abe7cbccde9490c20fe8e9ed861c93011dddf7f644c7db59459fd9d1cd13cac1f930866cb9b459fdfa63a3844062ea97297237946d293454e6f3e0a14b6ff570e9d3d00f71c119d0d2677d6f03017d70c8ae38786644cb1dd5649d04c398508877ed1897a747e0924b33749bf970cb0271a50cd9ac45474c9aa35cc3e874a450d4aa204a5fcc10815808c56523972dcfacbcff4efa5c1d1b45cc4bb72a4bcb25cc53b20075ab8bc11a8baa2c593be15f2a14579d08ffb654c5dbbab6b99475a193c791b8c5cfbf542d4a63ccb4f2a3322d663caca266e70cd989f0ca75dd8744a614be445d7060c3d3e089eca04f3f72e8c9d2476ebb85d3847a581d329059a02589536f3a5dd68a2086aed7dc3e21f412939e5182daeebd0cd2a35fed9f1e94ed2caca91b6c226c108b00897eded06eff1186332c4ed17f2c06561661b6bd68a7392acdf4b0fc877e83cf7fc48ad32f25d93b1709e79fed7612659aa9a7357430802d1ebee80a2b178d3a6b0b33168c4f266fd0642d82c552b20fa786685581fc1a7f2b871ee12eeed0616bbf6952e94adcb20614be850bdd16e79cb50921b7d219091ed0c8c31ffe385f08d2095f62aaa3dadcbd704433f0a028574044496dafbcb415ed1ae0cc7717d436ed0f8a01bcdfdba5c744a0222f99632c8e689174d5c329916b19e760719d1b97235e5b680b382ab1fe956ee52a2fd415ff76b621db02736297724620be22233362ff29f4582213291d45dc75e9ae3e40437d9deaa1cfcf0e9d6dbffad78494cf8b37ab0f2ee4dc05d4a72db4875ab9d2001cc0f785e4fad0770b6cdccf83a0c5f71ab2b116001ca50324173d960dc970ed473f1b6660eda866cca55e944a5473b76d4d963e6ff3e8e3f90d9034c01c46e06dc0b6d2fffccabc2cba8cb6dc39ccce5ebdff4f0b7e255e630f354462fa98ea324012051ff207076d9a96d23cdd7cfbfca1967412c7638ea94f0c6ec45dad0189ee0ef81222baaecdff54e14c185ba21c325e71f21505395ed741a5bf42ffabd1a045b6e5888b0a20bb92dde6c20539681631f238736b7c56260f44c10663eba540e5866aebf5085f0d8ffbbd9f3f674f8c4bd84509afef12934a2af29c48fe588e8aa4f10e1db61e9454ce9b3dc9a239f869d28b14dc3caf9243407837a9d900889a3ead0d2981700520fd1d826abbfd183da4949696a77c09e700d4ed1fad4050ac52f9066a9fa9e2da02eaec818be67c68ecf34392f30186de4609c9e026443c5b2e6a408b75541ea3ac4d33f997a8361a82282fdf03eeac0fbb0ac548ce933a21eb1abf5ab15dfaad49433bb8a3151511b60106c8d85d31da15d6e745db5fc0677d4c848b2e8807d882bfb477cca3377ec0890e7063e165adf97f4fa7cbd3279bac7424bb959c1c977273c0da950990846802c6016f58ab44b87dc2216d525ab6808259fb764995f094092497083b493b18a8aed54fd110e890cc646f8225f2915ed4cc6c68aae284aba191f4a4b59fd3ebe798721e2446406967845276daab992f7a6bc9de0c94473b6ddffc226d058dd3085805d8d527b458691f6a5e90063d00c80eaf4bc6654192dc9bc928bcbc6f5c7e1a21f7a30937ed99333486e66f434805c2212b60a074bedc3221554c5887e58e621d557647bce191043110eb6690887db221dbb8b3800b934d44471c66fb4adc4237e8238c15663dc515b81743da25b9cbfc52cc6b1827a9d82d93b6294addf6bfa329545b28d982a16cd521c46c59bd2eaf3206d5a3913b7b3a0d32c5889506dceb546f96a0cafb43e532fbc2dae5a432cd7324fd12c41a91eca0706d417042438ca02232f544be234a36037bf5d1697ec144c5732834db59e28000ab6de1ebd169b9f91fbea229ea7743cef52e42cd12c987b75068868ad811d89392d63c85320f86a34212cc30e1b611454d1abee4c330b404b3c7bdc1be89698e49a5b06b9fc6fc1db3b00c15be9aab80035619b5248b6e5ccca344cd6b5b91124a89b40913f9c62644ec91cc65479a892918282abf15617a9b2dbab887e67b021ddcf3e3135636dd69027fec08f71f720f4039d8bb4baabf81032f4d65633c443e8c0dd384ba4965c801187d7e86fd697348c5324494cce2b148a916598e760ad8cbf656aca94cd96c4199d5a7fcae9a7be061b9149d7c3e1374854fc2efad4b64089b6ad0ecb5716aee999297e5199fd3549b3d891a27fdf59749bae10350595099748bd77bfb7dd1e5f405efdbf950a51ec1dbf4448694a13eb359a56780b8d89955c755ec9abbc5c78e3907294a5bc6e4326769a2dbefdec950f9cc5c25a363b84787768786cf823f73883c1739ccca45920aece7cb38b54d54788be1fbd3cf909e08bdace8953d6695cece371d8c10110ce98de0c525063d59c62e81d56c82cd1958025da03cc072695c8153b3b37975b072f85fac5b32ef9569d6a3d1a6eccdc904b10576eeba15ea0257a257de92449ebb8adc00896b7aec9a16c164e96d6d1ac50dbce6cb7e5adcee4aac53cded9228b900260f5f4fe62d0b4afd02f65c9697f1750c1edee1f67cebb8d969b4c4ce414a86a028fac0872a84a005ce317bf36a83c7407fc1a778bb1c44c6025535e4e1b294bb9b474cb79e2cc19a49ab96c37a6e57f52c3f32cb91f95f46c27154fde6d194c424158ef0b5d060611dad96f4bef25b3aee3b453cfd9ddcab4a8a00c33410f7428172dedc8bf49ea106450d0db188a86fac83dffa3809c1fe8624406142d4bf92c2e67ed49f6b1a3173ef45b12ff0fe7481d29b4d27832dbc70a6716b078e157ab0238a7b5702dc55d65bf9afeec7b6b928cae11529f082c537042b23d004ad38e499c51411295fe7bd5c481c02a001a70e3aa9e2a02f9d9920cad54d7f900b49bda7fa1160b9b080e0b31352a58d3bf572c814beff0c368e0cbf6650ef3ad0042e835af6f11d804a4b6183920404f72928e8c10713d7fe2339d256db33260aaea70e59eca429472717d4cdeff6fb3e4c707634d468a43816a005a5b90fbf90d11eeb12e39d2df16e6ff1e25b1335aed01b4d485791cf739cef6a0cf903a4af4c4d592c42039be195c602d8d55570b2dc893566db4c71dab4350a8b432b9ca5fa7e7d6f1aaa4fc230c170774bdc770fb223fc920cf258cbcf0ae26a12d0dc4ea14042a538c8e7b78ea6fdd05255ebc68f2ef289475d687cb554a6335c9fbca6261dd5fc05d8c386ed5315b9b0f58a8674b02b0c6d5cc6ce1bfad60e037ca5bb73bab5da748339d97bc38e3acb932f796cb725a512a9b3183474be497b58b9204e5475504a46e99508f57c709ebf41980ba57ef72d93aaee52e1a447e29e11fbc3495ec07298d8233c6bfb1844445a44f77fa27b60f1f9afa5476048304777d1cdfd9e9f41ffec5562c3b6bff58a1c45c39436c798f8dbaa2cb6fb6ac2d6332d717f099cc1f29602e0e44f5f0a42e7c385fcfa4979f2b4300bdff05917fb76543962184a20015345446fea37ce926cb6149d4f433c463fec03aa672d56aa6edf61292ed106c7976fe4536284940021e5c3b924e2231e90ed4af9fc136b6f2ac9fbd00a656c58b498e1caa8a637ee052334098206714b94f2273132110a3a53b34551ff9409ba5e60d28e5640684899bd378fd577341cb57f01c7c839eee92b84f3cea5b4de9e9529f8a38f00e5748d30b1b46cbb33969c502725442b2afc776e1583378f10796c9b98a6b801f60e55c1d9bc0dcf61923ea0ea8d34ed13a36dfb55a8a25b191a088a2780ff7c97f50cbb8095a773cc604bced9471b215f498a1d6cfff9b8e78c4fef67c23e2618400d95437085005bee6013c20b3d0a127970ace0daf65da0675384841c2fb1519c88f9a36c4114b600c54863897f49595d21f46ac93d5d89a84647fd7444e85a04a640d0f541b273f98d6a04ff702bee11ae2d9f23bf2f68e74de5159c197c38ac6d2b4aaa58f747d2c80fcaf0a68b559351807b41f70ef48d3c39f5c62764c1f37b7f99398b926d789b9430ae56a1081a780615329fd461ec22154713cf340690c5577d28db73e737a32accfb7e075067f6836d1da730b426d65a2e46abfdee324a1311ea888b3a796c063bd78955f9777003d56c05425387420ae4b7225471deb2cb6a960e66b771949ae5c20026bbf5a13d5b098ff36a07d7dc77c2a4d128c246d0ffb18c2d851d3f23e65d377cf481a40f76b20f40e092f7f0a2f95009aab54c27f9afb44fb8e4f66540b6d2ef424b7cfd0bdc3b24907119216e03326e6d740c705340f6581d358f450aea634eb07a655e8e5a126179b5e2660c52c88c0710c7ed07990a70833185d454fd966eea1bbd7d354dee37643f74e3cd656aa65342a834653e1101c1315d90c092dca1d033353a23092ee47ec588b64761dd71edb060cd43cab625cfa543159bfb260f8ff50f875276b9f341a42b630e5edee80510a0b20dc6543816b673ec7be74e34ac6433a0a1045d5f370130ea8f8f6dce042f6063801febda0fd51af44d01a5c92109aed1c2e9c65d4924471f614e0459aa06fe49dd6216d67f36d8534e59bb38692ac890a994a751045f5b47e6a6ee6d06bc39c1405d34cf0b02af5cbba5226a96adb4e1be72c5d508cea36f76c36e38e68df6b32e8847e4c24c4430b904125cbf782311ccd1944013c93510467760a0eb229779669b4530da645ccc6d2d8447019771ffd848e9c7d935f0cddc325fd5f3b67b2c2f0513f9349c806842f20e53ebcf8d29fa2b8bc1bb4f4d1bba45bf13fb011b74b191d8a8f8ab6279588afad417bdb6d52c73343f270e08eb20e0dad3a0f53f7d7e4fe6cacb774b35ba8ad5ed8f9cc698051936f404f27441b8aeed75d587b6a409eb135db6682345cbd3426ed6ebaa90dab27982040b999f8fd69a7c16d81aa99ca9824f4af2b978ef56a5dfb7575fa25ca63154f25eae91606a5f64b7d311f8b1167996910ee9e0193acd4a4b75e80ac2efe81cc4cf2be50b0e15cf0ed09913b7ec8b08b9242eb59dc4122c9f29486c4575f8723f5c0e9e175774d839db2c4ba7a91dbd592ce60c2c99e8beff58b47eadec8c17cca2cb929cc8743bd8cb7d29d754df9abf8804c1afeeb9b36475f99e3298649e98e48f2bd1b978a68eaf380d8cb4823c8f32be34041e4771171615cb49a0db3d84f8603638b188a90189c4f62e8832de97e2acd33869f382911dae8bf7c90de63568523db5e5f2e35b34d1f3599d099cbeb1c967176ca3a7060600e3eaf3287449619a991e847658d0c165c6c5c4e399ed8296fc3f41f6b2bac9f3435107fe18932e1f89f537ad352b9013f1ecf448e30be17efcbbbe4b6a796a7757042ef39075ab73efb40e068d40b3382c7e38f3ba35fab91b7aae2f0bb207f1fa30370d40a8851d00cd374c1d5d1443eb75656b2b32a5a5109373c9410190c9a6910064fdcde176583b45261c43639c76c5aef48132a530f2cc4c6cf7ede9f3d5b3175be949c0e6acefb8d3140c92e36647780d589ff5b822c8a2c807e2643d7caad7bf2c1840d734053152eb3a54bd90a51f64a52fc2596754d8ebcffba144886c1d59460ef1d8148f71e9213bf1580f1e9e800b2fd36c358265a4b8c80380632fb9ab6bf1720f6e63a90c25342af620a911c94cd15f7230f47e5c7dd859679f8115b57f814c3d01850422fda3257bb2412216a6944efa819e10023bdf24fb8f756e8e828df17584b2aa28c82aec5cfffaf2d96904130dc84b8fc4e5fbd1a986ebdbf673f8365f8159d8270939ed14c3a40aa27911775534d44de80bc26b29943c0e85ebd08e116dd27a26c09fb9f09eded1b0415fcd5aff36f2118a41d2d90c643d0a2dcd043be12d54d1372b18d35a0506fd1ea3d26538a15a5a6ae222282206bca67d5d7de78b0215170b6baffbbb0c5d4c51290fe10e0c941165e0477b2dc56c452b8f5f6817c3a6d4f42801529bd612288247d1634a3815e19c0fcefe1f29cb18876ea7c7cead6f19133c5ddb052394b9f64b3dfb83b8ff910529f29608a162b4c87bd04d375e01006c90c0b22003a4c641f089ef832046f8c7d31b3dfec47d04984bdc0bdf862122c2fa95c84b92633d25eafb31d606022229b2fb4b8b3f6b9a2d1f4d490ead591c5341ab6d701d9e2286651097d71fa361a21dfe60aec9b47ce1f4aa31757c6ec504be930c9107a45d179dabe3f6d73bed26b679303b8e3a629e5dc1a1b632f4dd883b83c33ef3ac670c00c4a74c7ad413f7b5f2b8b71980793811b5451036416705b686db209d31940df1ab7b6fc36e4d8c741ec7ca7e0866cac639c626ffcf86fdfd7e6687dfa5cd646c3c26677abc9b894007eb4f1697857323cb413aaacd1ca549fc84f5b944af87ccc83c3680ff44a8362bb09123fb11d5f3c04be4d0cecc0f7f789df1b256661d670e805b7da73411fc5630912abf5748cfea50b4647b97d83f86cbc75e9a43598f5090d10ee5e7a45f143f9b42c51c163725fd665301cc58fbb50de396d44f76b0cba456777e2ed3cdea7054ac6456a1adb9bf95ba0d12f9e046175acc72bcbaa6aaf1d5765d6e17df6ae8e1ec0cfb05fda051a221a498f4bf885edfb97f0286503dbab6ce61af4697703d5537e7bae403331e3a53dc4a9912a013cab42de07f5f45e4310bec5b033a02b7777f69232800ef02b8640be4f4c66149eee2d2b6712deb869376761833ed5c67e77fa233a5761fe4ff3e9474ee0e2be0e93d3869be0cfd3cf0e6ed8b6c0c1bfb677055ea96f0c114f1c3082efc1dcd7ad2edd2a30094e7f7e6088c5427c4214ce36c757686c568d06ef236edb05ee0aaca4e9bce2c6addff5e7ddb4c2793bef4d9e380901c73c335f4b6b17403eae22380c28372125dfbea2c1434eb81b8d09caeb3667c3b4a1f283fabf92207dca37bd2ddff6ee2cae874ea2297637a3aba7fc635d5bbee439c286484b78ed4e12da497e463fa7a27f8e3d4876b122554c1ccd76107dd4894814a104e7bb0d6ee75b8458461d863539960528f72179188797f7d594cc2c656822445ae834bd4574b6b407cd541978ddbb4db11664e14c40ec1292c3ef54c34179c09917fde3dce71590c769416f81763892b92f6c585916fa5447d4e283b871f294942f3048592c3690b54e500ad93a3cea1219b2bb6e4379b735462795392280b74e2561cb63cb1748276f085b358a9be9ed4dd329aa369b6960c182179980f2b16088d64ab176e7c977d44faa856afea8a53cf7cd54b4a644002ecd7d86a51fdf02feb69cb75cfa586bee5949ae59cd9b453c5cc3978fd84aae4f3aaf937c0220dca1ab13ab7ef1a9e1088237c71d09b4303e789c4456fe15b7212fcc00fcfa5d683a98a946e8f7e921012c0d92c5c26d38efd73bf1c811245ce8d298fd1d6d0ed1a5e3538a86d32c0b25648efbab2ad1bf8bc12b08bf7d340bcde1764d6d904246bb6b80925f5c32c2ad4db6577dee8c4c067f99a811600f9ec1990dceb2688e239fbbe53d1937c7f20ffc52bb3311cc7cc5b868172f5e6ee4e14099ebfc257574c11e2f5946a8dd8912aa3924303ba5a50b60bf57c539c13bf52a7e1f88fd18276224911a044d260171418c38dd823939ca75732aa46d5f5c08b4d2957ba129e72f4dd06b86432099b21ba67c545da7e76d4e72c8c030dd014e1dc718b69e9e72496e58ea8de57d0f06e04cde578277c8f74eeea2763d16fe28cc495a742cf8869971843ae434de6bc51bdcd593954fd3eed7de1fcac68d79a809359272dd4f0599b61eb272a2be22f062445d515dfae94789c495ed73bc0e1272682092b0b827ddccce05cd5bb204d8d48fc2448172fcf1139784f324964d9a6b48eb82b32ebe96e136fc4a835b7f41ea14908c4da00ba26adff3563146dcab993cc726b21e1b0e33bc0b072a3efd32e001289c7f575ecfb328ccf51ad9fdab95d942f629673c8cb3d9805c2c8f855ceecb696d3176a93512b938c04539d0a982fa649924eb37693a82b8481344a52517bb2270779472d92c556c0636967c8cf98c088258972a5f3513d8a8b484069714ca911909cf362d593011f8efc9cefb256dc0bb4e7e39ca13c163fbf226e3a11c115899758ba865896714aed915e4c16ab007f35f9a11b6e6d121feb26b8850afcd514d5b8cfbd93c853b03b5afd91127dfcdbe2b8740b4c751557ff428d0a7cc2db7306df551eb42b4589fd0b1b9a7719bf95cb28d07ed095af5225df033b7c271e0740f6d92eca179dd5228bf3025eae81e39211bae1c03a089babf745a5d6694e65df8b7b637a9ec46d5f8533958afd7094e0327e39c2130bfd4bf7de1c2f28594b76fe0128a06912a002d242193ecd1fadd680c355160c80c6c1ce19c103ffa5f24470a08d3e5696d829a77e4c13515f834b9f47733d81499c512a960e67e735529f6170a8b62eacf7cf9e860494d813f6101a82dbfb1f15e17119beb5b3cc2d6611afe2e0a2383f1198a37f8b59de22bcc67ee8f986e137928c643f5db7a668d6e7d71d5405c7d8ad1a59396287bd5988948ebefd2ebf62eed475e9eb387abd7ae11e233c063f72cf8c27d5d437242fc8ea3ddec1cde3779ca5ff Params = SHAKE256_W16_H16 Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 PublicKey = 0b00000bf47629d9bccf46257bdbc1a8a45c3842851bdd6f2f72b3b30792f60a6f3793e0c0060334212b5b781d2516171fc02653ad4b032317df30c371226e06aa368c5c656e84b3d5bfa1db1d5f1a5c1fdfe91983e446f3d49479bfe249c7e6d9465f3b77e0e759c21997305afc2cde6cbf18bfc95abefe46c6c4c4cc0479fac110ccf7 Signature = 0000000000007b7bc85334b501b32d2e6c0001dba9f162fba39fca916ec55bd69dc701ac4c35358bdf99f366137a9f479d537765c89f95a66bffe68e1c624152b60b81151f174a04bc3fc6f8c1173629147c380f4837acc8e5208ffbc42fcfabae556b07a06119b301121a3751a76aae1c419fb3f20f574036f27fcd3a1f4cb7a3fc7821272603a30ca7f4d121faf83b0feda40de7848ca121d0119be82ede16ca080074a780a8302b53b779e481e7813b228ce0ef01e1d603e5717842a6ff0605a89e587fd8589fcf3f3b4885b2ef38f27e035dc9f2a50feb8ba17f7cd9f9ba3a04682b80d0c5954a8ba9df261e8a90c23dbc3600cf00e394ac0fb549921964d94d2512bd6ea6880a8650eede3aef7bf5d3937c087352cd3205084ca3a9fc190a5d914e6f5ad0d5e9b63e9a6696666f8296778d0e65e6413977312e40d8fb8fdd30d392940ae5d44d0f6f9c953843223d5c24db00b9e0804d1b6679b950f2cfbeef66e54244e70bf34c499813385b94573c682be393bcbc47d128cdb7a6c7f1bee4d0b1b17c63054b4f24bcb95c50e83da65ecf74ec565802ba6fb061201cec5e0d05fa11f438a69e16ea3af9ca023f08fb26e579d9372c5f9a8f2bfa1e2e009175639ccef32f6684769069933e725ab469a5f658409cd6cdb98ef4dba95efe3680bd43df025570d1dfec681c940130b23d5f68ea90205a1c7f0c675853c9ad38ee0f87970bee0cb9e88eedbce44e21dba941c126409f0977f8d1933b481c1736c15d6f0cc887b2a63b75e42a0e12e45f7692a985963c74b635b9018a7b624104051dce0ebd93eddd6db339b79fcc694339588a5536baa391ec196ef50050da35f9e5c4980a9b23a0abaadaf95f889c05e76d9f5d81882d4953fd53e17e607b63926d264a5dc11d974e11ceb40d1123ee4d2f864feb601eee640a198454554cdd5d09a1ae1239218a5d06c8300815b8a793a068424d087ea6f11c663c2f0109f6127292e3b705d3f8f85e13ab0ea7c4f2062f50804ec04323b62bfc7aa23357f08bb07d891b12bc64a3a733eaa3e76b50b0ef6454c6b780936f4ea286b91f7a63c3451468ace53e5ea85723356a9a86271bc7273b9fb100a79efef7d276415768576bf484244811c23816980839b7de687a50c0182d87fce923dd95615709bb380ab1f4cadec1cec0804b1084cff4c596255f871f6cb26c11814836368aa548258ed99e86ca4e1109834bfc7676c14af1e249dc864030db37cd6dee7632bc8172e8d619daeb1b045b74e4f9eaf6500e5ce7adee5d70d7fe4c70e31c6f1f6a38ee06252a71c3a937134637b6a82ac8cdaed1ffb293588ef2fa8efcf919931e122c15f718ec73b3ac8cffaa18657f1e4f07b8aec1ddece9a741817f3a776b41a69b758a8af9be87d58498ce11dd0849e5cd886d3fe1a19582c3e6c572f544890abaa00f8ed2d06ca768613b7fef481755c5db2511ec0ce987d18496e9305f2293e3159a50accaa2f423bad0ed2c6dd96f2c76784cb8b101e91277f13f99a4eef94107c2bdd7f628cc8be2e12f4e94920591dc2f6bb9213417f16204e9804e73bb0226c7b0e541ec2bd022b6e3ab662dc2d9bfe6ac448e7cf5b7bd3347e681c8d382f0a83020ef8f7eaec07a4fafb3a0d7771042022a7b069091c36bc410b168375946a0928c341e9c3cedd1d53f4258c257e5d681ad55c267a2a44f0fc97d28e50e49b46341baf1fad6f96934fcdc9837c820a0f2a895b681f27c25890fa24365dacf9e36efb5ff084f3ddb2594f3ba983ad1b295b04098162a5f6e227a00a5bee90c03fea8f8497b260b6f12dd3dd54b5174e6fd4e17bd28a5873655af2fed35f71a2f7b3ba632245c3cca74636db95a4c727e6e1100694f234969fdd30ecae9a6df133eb989387672d5257673aad85278640890416daabb5ca846731cb916f0fcd32d8dd5517cb0e9b90bf8f87ba78b64ce7d42891c82bf24d40d64cab3017d7b452405f31dea9e10a13cf8cb9c86f52589ed4260446920999d548d5508f3623784494addedd7d5a2c4c47d3453c7493b98a10c7251a1577e5f1185833277ff336ff9c9687af2ff5a57e79fd1cf6c1c8e1cf2231371c2036507c17393f46ad93f1443c8e1b8031e798d3e8a43abc04c3d6a2c059b809957266c26416b0482f0e940ba4fa5afae0897744b9aee9f469fc011088871fccacbcb15a0068b55d0ad8235f6fffcaecad63814b67a959936124805b4303c5f3bc9d73e42ca738369feaf3bd292d3121f47982145f0aac4e88389f54eb4b40f4117ce875d39c572802f9df10364f278f93e93cdddff28eded75edb2bb7e732b8ba51bde16393922030a604c939f439bb6288916448bddf98b8c912da4ec125967fc6b085fc92375b9238e8ab351d9c27829847311634e6f48b8f1aeeb3160ad9315ef2e0050663a17673557ac7f9984999be66aa6777259e9e73ca00705751ed8337abd88370d372de85a696272129a1e6d09e6b0b84b387111830dd29b548661534879055d0809a85a8289efd9ad63118742006812fe050abc2dc2770cce3846891b8a5cf5c3fe92a0daca43a15af123b6a16c45bdf705e349d0b611df1829b5345b209d2581c8b9afa37b57b413909a5033917f8f478e49e539617b97e47408789a7e77af4dac2e72aac934c771b6a9d4f6c9d7310d065f4c8cdb3cb3732c9189f56cee60238f844c3fe2300d2a7a1acdedb306b084098268c813e273d13c64377cf95c2fe6528cebb00f59ea80480e0f509063df0291325cfbd616a49528576dfa292a4511573f793a0320f1585f7082598da06fb1f87c2062ffc91a438f31cab166346cb6d85b39ba5a146aaa85ab45fbbf7670f31b9a963240dc2368e97f306abfcb52b2caf8c8bbd105b0c7d8f2cf06ebe5bde9e135286fb96918978c117c5053769704edf7d0015933fb31ab3cf7ae28f35f5e9ce03e076ba6ea914a9150e94438c23e8b08990ee576d06bbce4a08150370107dd10b7b48be6d65a92ea3536eb2b6f0a2ed49abd57f4f186c5a7abbc8de2305d5633de9d8844afca54cebda3f808be9918c51fe699b1a2897fea5c2cfaaa8c859087b8edf263a1b6c7bef2729b73410930989d2ff817e2ba2e080b637d37bef6c582f2d29ad6f54215de05545bfd2d09c697e29409b6b553471be003df45344e21bd814e2bbecc17a0ac14211d7fb11e759f78fdb6e5291da71d873e00348b8e72f5561e84826e7277e149d570d9f3aec879c10b9b384d50fbe7e602ee3418a83536ca1ad7779b29849bc7caf223c79636dedec2832a67e520647dc16db836341015890c61bab1a2b37af7856995275f8858c8ed757ba7f4ab6d21a0308190732ec2aeed3739e4fcc12ee4e19ccaf19b5631152a03fc5b891f340e2e8f6b4c05c43534f0342b4d76602d36178a5a4ae4a0ff6a40c8e908786c82af3da198b8a2e4829b50d6ffffdb98905da2972119831e3531a85d26631b66670d5477efd7f7b2fc19a36c4335937440165c7b10face7a0fdb384c9bace98f90d87bec7601c96d47ac29df3d341a32b3943266ce2add12983c12adfd6d0f1756f4c1a57e65d0348e97f52a8688f8f5471462d15371b3eaf6d6d701b106a83b07a2a06f0a39a502c07e75f6ced37d694d85fb5a6cf07fdb6aaa51b240f746ae8c55a20ef5ebf1fd9c660f169130c78b20f13a67e521bed741633c3044b152c2629937d9c1f9e2bdb0374c075cc63fcc8fc9a428fa22a820773dc1f3dc063ced4e332cbe8457f6df8a307d5568be7559f82d83d1831bdd5f843239ba4b58205ec549bee88f23ddfac10a234e078f18374ff665f259eeb86ecf0b07c4e1808941b081a822441be0f0da43ad5390732f1e4c387d4571615ee2c90d4d2dbcaea99497eff564cf2d2b805e7a65df4154e71cdaef922598a341886acf102a68fe17374ece9ae3449a115fee60f69380eebb1afce3579a902205ecab00edc08f125b9634ae3226776694b55387d685432a09a0d5ca3b99a0cfc8c33508ed51395e39b63bf1282a6645e16a320149c77f7b452c07b9bae882f8ae94ada67aeac8779b8c7a16ee3021f645b6fa74d326cb73f59efc7459dd71079d6c84bca827934c0c417bb403cdf57e7d411673e042e6554373a839edd943e267f7300d176be93ad0c78e6c771bef0f76d3fd7c91db60124f7c84dfd98e058ca0a19d987c91c843d17c634ffad2f4281139278ece25ff9210d48ead262c02b5eed91c141c116e5feeaec92540f3af70d40d40e7b212ad37c523d23d04aa03ae3480a10a8da6e1ddd1ac1fed9caacd2b8571ff1be0937b0abbaaab32cf59db40204454d4cbbf6c03af7664711894c131c3670db9c6e59e3a66eba559e36c835bb85d73123553fe20ef038aa7a54f617da120d76d42541da3cd267ed5d436ad0981e3e961f5bd198cd4e83478ab9b3747b3ded542c077392128768e783cf05ee97ca0fb05b8dd7095c6409dfc9e6c5d2cbe036d9a635ed5393e3c719afdf2767252b2a1ac0a31da261bf173f14621cdd22c23f1fd6e1167959e372cec18dcff5fc914e28e6e9a287365183e1d5a204cbf0ec35f9554c76ad7c3097bf46f786a2993f9093e3cf9f7d28452a8474ace5b6fd944eb8aa35389d5dd08cdee69d00ff98d63ddf09bda385fe5462a7adb7b77c6d78e5787d1a6ba6dad5fcfb38212179da3d8188c395fb74b41c28ea1c43ae170a534321307746cf3df768d5378112df015b2b5e3ebb315ef79a64426a6e18d5056514be73921405c9d21e46da75bea73eb04241db5dfb5720f76169d5d7bf244c58962a6e407e47ad29ed756c091a0e40a13d3b02949b74eaf4689374f9160f86d0e43651316e80a93b68f380ce6a087b3e3a2e690c649ff20b8aa3f27c51cd7772749807041e5acb731c89318464c090fed119779a998e3c1cbf87e945dce00ba8e6dea2d69d5ed7306b000a4b5260c19edaa6b7da52f44e30c07a754ff76c6e9f5b54228b1e42c0ac4f9a9c5c111c7fdf97796110475223a3b2792713c4963cd530f2145d414b1d7c933766a37138f56d6272693ffc711f05609e108920478c53b3efd379011d1a6a8373a43e4b0cd3c207e47523ae5daee5252c5a5280333aa269618cd0bf9adf1f170d9f67c2b07e2da0d6f4f6c090f5352e787e7d358dbd0145c375c796165f6a472c8c8ec6ffda3320b474f767373c71bb45286fb4469b606466f4fca56f424aa2d5ed57bb8e0e2cbd08925c658a70b9108b6127bfec04bd2e117e86a1fdf0e4504b6c893432330bc3bc6fe04244d3478b4af82b5d90869fc2e6579d362dc016569c028a5debe1255639748d8b333d4fc4d3e3afca7deed2fba51daf699cf06bdb9de98dd55f7737d3fcc5bc3c8ebddfc20afe99c0202f4f3cf9378540c588e5bb195d2afbbcc2bac819ca17ce511a91af4cac77695d223dcb5419d33d21e20b28c6405325448a2d03941a1f92f870ddbdf4cfc01250e94436e0615780b46c7d4904a3eb9e16d33e6410037740d3c80c3b573a2024b6c189c7db6d9cf5a7e90534a71f5ea55b7120b9720b9b910ed1189f90167d9be68de42ecf27507b49f054aed78d632392812f08384841e158568cf6594eaaede813b6e884a8aa1a5eb523bb4b13d746d285abfc8deb182278d50a2d9376b65424d5118d952bb16db788ca2a386a09baad2f38cceddb52be50380695b035ebd86995e3890f83934df2ba707bee07a40a3d8c2eec1a3222e97768f60c65cf57900fa63c9b1fb8d407b339bfd6c7f12c8d6c831a614ec70f6676454151c5889fee528636baca9abb473206f007d28b6288bb59373afce2a249c5e17d51c4822997b968896232b484fcc07869e4caf9a0f5a361f0e9425810622798b2cee33b5e3d09ba9519b3ad229f855c6f12c6adc2403b6406c89e76fb901d2c73936849a407249c3c5354564e25ac55210ab049a0adbfe1776b0e27790ef1f8b7af4accd5ca8d1653177055ff422f3577d84d9ce53e0c4ff07f829583fb0d2589540d802510959bc4f585c395b461faadd8c573dccd2b2c4373583751084842acdf897c6042112d3ac71b4958b0cf5dbc6aaa2f0820789a3fd44790bd08b4f010c74242fab1f57648771f3a6b3068585b93d589d56ea40ea25c2a8f8b09d844c57ad196b5f11fb889956d96d5f5ff32094585a280c583838bfc3abedc93ad3e5ec54401f82f0610a66263b3c1cbe1a76b8c29c46d73485008f9a9a4815f084f008bcb094fcc2c608b3dc267328a4e751527cfd1add527623f96cadafef338804f063453e8efe42863dfde0ed607c1e669309aebdddf0fae0a40985d67e6319c61979b5cecaa7f727a52b4bb9ad6a88cb0b2ff82d22fb2c211d31cd9736bcea02b4c4389676d3395e069e154ed90a2d10e6b72f66111efe3a664ea694f908c4e9ae133e948979735f5fbea8eb20c0a9e71604501748f322f24c4acba70644198c6ea4e466833fa17d12176ee68be8f06f8f8b106c24821d3dde97cc3f7d26cffc2076c35aaf29c7c9b284ca07b38dae91ec46ea1312e637837a7d6a4e25058463b3c422ffa0dcec776ab79ad3ab032dbd1f1ecf37a23ed7e4761b27412c447b059c1301f133522cdcff149711e23d86738b3d530ab3e4def04e5a00fd8ab89e251952b449ad2fd1f63615559222df0acc3b7b622a51c6ae278956cd421572669e81455647d8d4ad82c6c79943d136ab1686d1c6968029c28f41caf57ba5084a7c0d38013ee9b31bd0aa5a3207e02d464f2b8da0049539ab0f5a4a760a1486e39166295e1936722fda1e3712afe267eee71ee7fd46035825219108d5b0b3d2d2f9f18a787be108ad95388d325378868361a9752aabf77a44b3c1160f812167af4b3f3f714a2c6bf323f0bb55bfc230ffea6679ace40aa13a3e35573e2534402144169a5d520fd498ffb435094be0324820b43a63437b0d8268bd6b5b8328135173c6fe60c32c17ab2ea00d443bf08e826efce3aac4dc2947cdf7844a52b3afd526c41db8000cee804e98f6f53400fa37529da242c4874af6d879e4bf7b1b59695eca3363f66fa46c63f3e53a75c9b2b2da82c97867749241b62ec855e9cb0728131df9839689d4f203c5b40fcd92cbfd53cebd8ad1463543fedbdcc6a98923844cd2b3cfda06c02d3f8327e2db7744f93a632fea52e67d1c372c858775af497a08fb05f8f0efde784778d4a86809a908b4cb783bcb1e7fe789d020ab2d6955c0005ef7050a35726a2cbffb584bd4a9eef5f35d0e712ad91ef079eff491a7709595cd86fe67eb380131eb83113667de35d2300dc83eb729d5eee21c88a9b890599da2d9692fce67a92aa869763ff54890000d5c23591d6669ebffb5af26feb6706c01e1ac8da06161cc04138917cd59af89abb20a416d63344d0b98120ec6d0aeea95e53885fce5924f35c9615172f0ed838efe5d7873843f7498f7b68732be3eeb551dbb37b66f21e9cd7720ce3b03e0d33c75c13f58719f14933340dbf16f5bac13a3b44db0d275a65ec8362ab1964a88c6eb175dfd7a76703be29f8fbac7e73982c21417c9ad635d22bdb848632ff27be653502413d00d91fece935a77cb68cc41d176d87fb86fa21d07c5484797449e15421b9f90fa5b414281c492d6b933790160aeca2c65ca4e1d88005b858919218ae72d6b329266110e14a34741b65869133c48a0705b31ced9701ac0c02a76d5cc06e81210550d72b7640d514006361d28a5b2b54e4b6c63e8418b3a15885c772bd9f45fc3b42f346a45ea1087ca9ab1d8eb5dd6ffae0306da4af37bfbd48a8e0547b877ee6434834eb8c52ae9181e42e25109375f3c96723f98922645a51a2d55ddb67afe6b1c874bce00562641b9345ac41c76f44d8617afd1d3660bf6a7f2a4a9d4a1d35f31b87ddb95c0039119e6e79c0bbf1d8b59521ccbe385566d5a663990f67cc62f4efbe168a25a069232fbf87f519b8fdbc8c96d432e091892caf32dd17d812bde60f81c7a43e18e49edfa7f46d4f7f93b16ce6f18fb041eaac24a94fa0c46bf5419d44139d8b03a7244f194df6974b9ec9816cda2d98352a46e4c88e07e7d80f19990cd1258c4c7dd37533b4ad28036c8368ecd95f917f18cc15832352323d2898f818dead1f07e02cc205f4f3c36b33cc84c8ee71cc26b1fc5f230825886bf209019384a3d6e66fd7bdc37ccc500cf99a1f6f90ef46c58b3ff24396298bf9bd8c6fd0637a6c2185c6f5237a06b5ce42db181617d2a30c78d382110afef9cbb8691217deb1fc936265e52f7a7414066cee5cf8ae18f30d08cee2795aaf515374e5d2b874d56c7bf756e52bb765faf4bb0714faa9c57087a19487ecc9206d889d53abe7c977e298aa105685a5db3979d2b4e49215d6280ad040a8791a6a829079729be40600feddb82a13ba500e46cb45b843e7d6181e6801758bdd584b2f00f029c449583c326fd7b50959b05ba0342aafc2dac2bf890500cf2e3f8f5eb460870de1983952035117de1eb068af87c97352582238bb652732655e3f6a93f3cbcf122aeef63ce0f5877da11eda1f0b8716552be05a3faf3c3a77232b9ff7670ba9a657f2b515739bebd97fab9bf33347b1ffa36d2937c826ebcab0f87a2af0c4ec187a13724af6a7ec3a54210f72ed09e536d3c2ff81f089b51ff1ff3c67fcf6078af2a8992f58c4ecd1ea00776fcbdc3acc6289e04ee88a55a1372c5e13d9f68e3983bc8260d7df6ca86c3a7d3c80cbc269c15e31b3eb3415658572970592287b01c56f9143d8f3b910493679521964bcbb75331ecc6b6e9ad4ca18ec651677c3b649c20678baf6c488c19e9b6f3e3589def26b4f80e7aa1a5af2e612d32b3645b0d48387a6ffb47d8a2906f18e89e07fe6fc4b751ba5dae7e4febfc06b9c4e6e612e2fb90b1e35ca7fb6d7bfbb6a348ba03b3f8402beba4fa107a6821b0e4f72e6658d9b0eabe13f9f5b345ea65fdf535c89502064f66e6f13a2e4921fe6c5c5f64923f070963ce5828550929e36e4c999c6e88428f657ecd9b8368632f899476e4c4085b7bcfba9e3aed9c08881b0c3e474fbbb43a23444664b5b1eb0dd4ac5e901aaff7190f89c628aaae911db12122b18679082a9cbd5d1a41d2c53d95fec7c05cc732b4757bafd5f4ea7f28e961b2d5f959aec587e96dc48d5685cc1c0cd8ad84900e5158194467a2302c48c5dd7896c31e292cd779d42bcf8ec36ecb1a0cc3877e949e66cde3ad2df0165bef2cbd5eead8b36094c72b24ddb65f24a5b4b7e652db741dfc9d2d56941b51d8b97d40e4880475182566dbb718513e876f41839ade3218862c97436a98608f339ecdcbbb27079a06f81e9b0dbcf6f135003d3601a0945faf1ba88fb593ec25ca0db217a5419a5a9a638900c66a6090589e9142d3a9e9e0690afea7e33f3bbed184459ee9a62b4889d21f41a8558667ae27bc616b916a569c34bd5af6b126ea4165b710382c22f5f9741207a3b4fb293cf2dbed09f324a87182b86480d7ed695be1c449958ce30f32173722af73ce6c2091533f92a5d458aa623a97ddb50f0033c224d11620503f9199c7ae40f70e2ac66cb4a056e4010ae80165e8b87e08240d8c94a17e19b7c8173c98bffe88af78d35e0075bf5cdcc10e6634b3a2bcdc5f15021facb79415980a62613be6158121260d7dbfe041dd82b4a0beb917843919cba51ac27a851975ddb902532129beea364f0e3e76ea359d8cfe4d117bab28869b5251c8b55e96816cc0f4d11563393bb904844aed260c9ee65e5c57f3e3312fe696218e3f0c568a13012ac080a2178a1a66ebf27ded1466c46211f910594b22decc78602ebd06d4a0a2e1e68d3fed8b80da9c80db2ef8768b6fe64b9be5cb386a7869828dfe34264fc89950cea8b0af49eebb5353badee6c18b8dc07bca311f9ac5b32175f5c4bc2d13f55d4ac1af0a9ac1d3baffc9c6193cc8f4ffa1f534b4f4a02742e1e6af040f8d694a6cb41d3e254476b7364fdbad88390428fb0a2e701d4be51dac5b8d097a5729b164a6ca11e18431c3b81ed56454f48690267c74703dc4ba3dbda49944392eb1f352654675389cd1b14fe33fcfe015de3b5f95ffb77660773048c28b3341b6f1e88d046d17a761c64b9667d3ea25a4b992a41e8563fde2d9eff061b3bd87ec8987b09993e7a01a030488913d664dc84539ec0df7161527ddb28b3523a3045f5fd18225c055632b76b339610320005bce58e4a4c0445721d5a5fd551b3b2815a232c128ec63bf30eb8e7b7b9aa51ff2b241012d6ca1ef67d9942f5cc7f79c2e2b0088a53cb0721a308eb881588117491b0c87efc4c5454524d61f2cfefb74e1d2e34a18990daf850316704dc1475c7489242067768548ce64983a9fab82f7623d723d8ac2c5d4d692a0e3f15a7be967a29f4b4f3413600e3537f06ca7de90170e61015f02df19aa4bd7ccccb93581b4dde251451146921e177c23845f91eac814d20653bdd934e9b66cccefaeb2108f4e2637f2f8d58dcf41d783749f1e6999c86ce4e4828b074336530761aa7ae3f89d9f397bdb74b7326a65b7a8847ac2229904579a26caee0e3f69c82ec2330162be98c38e43986276840cae62399bc9e6c419911a80c33aaf53e0e80fa636333de6a5fb91eeae038e5cf7d4cb1977185469d3fc313906781480d31ef2cf58bf060e5019e2906f30fa51954f981ed2724691aa057017d6acb604e970c7f28ebefdceebf5d4a40fab47b6c12ad726df95eb6a02500340a639a5c5ca0a7722b022a18ef296ee45d6a8c275609d2940dbec5217e60cbe58ee9c2385cea1fad467c8a4ba399f3f127457dc61189cca83b477103634f74f4d8ccb2e7f795465c89805e9fdb88a7bb619a0dfa391abcb1a25d5ba321a9b153cb5f2b54773fe85c478a28624f23fd678832a6ce1303f875741dc887c5376d91f1d935f462202130293a3a4dd2c0bdc9279685d15449a36eef85a8d7f3d3c38e89c0edaac34de943c99fc4c5dd4830a970f34e364dffd6b9ea2e3a50ad71c02e2aec08f5d45f25f6222f590462f92937bb8202fcb9913eef3217a494a0282844b62903d7ad165fe7fa2f7c39d82b4704bcb33cef72843c7665f2e28fbb84e05cae8a93291727c3067fb99fa77a7d32a756e11d184e1e4aeeda48d7e55825ae19364e3bdcff35234bf985539997d6286914166005bbd2ddb356152b1658f966cf3b24feb2f944eaec2f2747621b027083a292b1e0c74f40ee988b6d713acd9ed24c0c8d6b230263e32faa78ed3983daa4e4e94a769762b6aa7069137c32e31b6b7f71e090bb5216ec84daff62901998f3b4c81e8856df1aa1c7a8fee9e2bca8600921f87711617c185c19fa9dd6abbd9d5e7f08d6dedafca0081a415060f5d9067ca25d3141838abddd7edde9a4699b663d8d774eb1b4b3728784b5cf76a45ea5c3762ded7b100a4313b99d941d9acd7749a09d18068bd8dcaa3daae65f5078ff7b2334f6f8873048b3e7dc7335737b0e3096834e00cd32a16029b533c3f87eebf01bf0dd9ddc79b32efacdd6499fed3dd1b594d7041e8f86fd3ca12cf21396b82744a45fbb3249efc6da94d696be1bfbe6ea74e325a97d44c6ad250d9460609b65873fd25c7ef74fffe75f7efb3538475f1bf0d04b43978b5d86756725ac0524efb50325f8dc1fbdad36d0607e4df2d2baa81fc68374bb61cdad930081dde419c3a01d3376dff1013efbc17b1a4e7b110a8fd48077250b7ecd024c79454b37aa04aa2ea54487beb409ce5c3ebd8b9f565b7dfc7355917b6bb25be12ae6b1f561314abfd8ba6ee562c7e3c78916b31b2414a8f825fd9337090e6d24e7d147c9fb4c9555781f5e31156771d9b94de3c211e6e8f8d167bdfa4467093af8023c44f86a848bbb991f4b30a809058ca839eff903245c617be2069fbb134427e42f91436170480deff3075748030a4e001d8c496b7863f1dfc417a350376d620dab11af4d6e70e75ef76e03751c88a2a536c39ef55a130bfa8f87798d2792c006d48f2e2e95992e550195c12b53c46577b36a9139b9ffe6e21f21df4b0049d4db5f792a7a7dbe751724c530e9bf21e008de7d0cfd1a2455fc28e92fded18ad81f5edd31a7ff420ff10edf12a7b4996e633039adbd72635918da7e1fbbb88a7c9b0a0fbf29a1c885a105f0769a2c819eeeed6eabb1ec556b6c98cd60baa1b471b7d92f05f64df3cc0ead6fc16249e34e572dc6f8dde98ddfa37ef0bb5105012ed969599f65ba7230caeb3bfa965e597f59d34b192069906d7818725b852ff75c21fd79bc273f9c3cf997aa23bb6a7c698d7a6bca74eb03d126169dc9c4c20dcb9245e099d545b7cc1e69cb9d64aa35ae2e671fe69649a59098f569fdf1e1d213d0aaadacff4893d72bc89a1d98e57ba97fdfd8f3c6f69525c0090e1da6439cd8d595251b0ba80b35ccd53927fe8d7d1d9d062716b1974a27e2a42d018b97c42c85f1a96501361f1456477f6cacca7b108156fd9636580af7e1f0374b9f4933120c9422299766e873bfe88fabce591fac3066525d9a6ba76b75597e5c17514945ca8fb596cff868f0f3e7b9c3dfa2203ffdb887eb41f3f884a0d658848f61f55606b07d97081a4a87bb860c0c50d7a2d353b4afee64060695911f8b49cf8e2ba02753e4e099e3077f763052dab152bead9445d624af1f835b5e8708b9a8282a452c6a3999c1e9ac63a332cb68ab011679931935d7a7be1da0e784fa85ceb4c1343282af98b7b40ee1bb197d800e9f3bc6babcd9b41e834db28f230c6b0b272239bba98dc2b8aadab1760f1480be11ce5f0285256893fed74be3c65f5ac4e4940a603e9eb88ebf59c1b7690913b76902ba96a0685f121fc3d25332674349a86d365c9347525ba6ed9c1d076a1e532ced4f27f1fd5131823861192d9d306506651bbd2f46916ee410a45bf197b25e07d1a6ddc38e3b2fc7ca17cf97dbe18cdd12b80816d6ff6eee609937747c83c5460ab47af0e349bab1cbe17c1202b89b06f3f30bb095db76bc17901b40c4ed86752809ac8e6b01cd631f58a49851d7814c53aa05788c34f75f3fe41864aa302ec0f703d0c1a4052f661ae8d92e81e863debe54eb23e694ac9bda9e89574e035d7156045b4d4e8888dbcb8974f51bd0c2177fcf2136390f4cb67f26da1c6c6ba60f5ecd857fe2381c0fa56c033a706ece69f5d815c8f3c18ca7752680b762bdb43f46395650a8b40466f6ad0d0bd9c1b0e38b9fa0639b24ff0c15bff7f0acf347b5779302b4f0564cf065fb5334bdbad0b98e62d815c1ca5bca374f25056ed56aec96d56c2b4f6fa6ed39dc56c14bd44b0a281166ebeccc90f4c5e52950e3d544d67c7b342b63f464c17cb75ad28262b705ed1544d025d9d2b63eaa3734a4886bdd8c3f8839fe42f60c0 Params = SHAKE256_W16_H20 Msg = PublicKey = 0c00000c51544a5f352653430cd7baf816d6c2bf8889b556ab69270a9eaf8981a05d1a5340a60c096904643a3fe5a7418294796ce452b83ca9206f2a854f7f4678a92a5bb3c196c4c85bc1a7a8847eeae9725617755557c8f10522933f79ec8461dd792d8b5712140598d3027e5de2ae79975e6a2b36a46383792a9980652b4fcc28e5c5 Signature = 0000000000002ee19973fac1f51067e9f8203202d7183432b8144af2ced132452b8815e2980e9224f0f99d1ac21a0723d098ab065b06ea55cb41edd88c368f10e78b2513ddc37df57e0dfa9bbb30a3d79e986e2acbdebbb879c3911e75423b816a1cb421dee63f612b1544acea2dd2f1ca240ae751816ccf0ad702603dbf7938035312a705cf7cea8b87e21cf08eec23d361d506a6dcf55d57d09dbc47c012edbfbcda31441bf54dc150b58a02a1ee2bf44140a82ed1b33b13def8988a5b9aa95658a72f9091e3308e39e292186a0f13e51a32ba69659d81c0939169fa07ab9fa12cfed3246340e2d7dde77e5400998788a47dd6431c6dd15a7bc7f4d3fdd0aeb61dd3d6550c4295800cb23e1c6dad768b0880c7e3d462ea5599b2124c7f68b2256de2f9283ba126e2835b305e88a685852a36a843827ba91a3ed9af9580f917286b62970926aa94a80b6551ad36d8ec46173b5e705adcd6aa6524382be08ada69b8ec8ef729795e80a6695826033901743425bed68546e637e919acb20448b9f684148c8e9572ebba61039640b82d1414e81d4943dbeb3ec56a79ac790d0a4b188b67676d85c458b4a76dfbe2ce7464b14ed5f25552f9e8dea774478ab417dea6dd5e72b613a772ac0be9c31cda1f4e7e4ded44cbd9f9019d533a3ed9a7d2d053dc36f913a4f772c399ed3c5eb533ccaf9da1711db7873997db8b50afb9c2dd8d374c282b13e02415f46c3ede66e58469e4c769b170dd8fccdc40b7d2ac2483da939eb4df751b5f37eb11a64eb7565bdf89e59ecc526e94b6d0342ae292fd4f0ec4acf9fe89dd41dbbdaea87687ea1c38bf3721ffded1636f0c09b9627d45961454670a632dc4a83db48acbddf53099f1912ef5fc1c999dfa3b8e15f66d0a5fb75567d3c9c495c3ffd02ac5686317ceb142aa1cda0ceddd81902ed9a4dcb372fff369b6727afcdb3b4c6fa1eb17f340aef2010f490843fb25707c64ebd5117269d5aba150f197e2c3e01e93ef3bc45067051bab62a208b2ff6bd6966049bfcbe0f57824d8fc27491405e6950249836fa7ce55128a8d752faf7ea0a1645ff0bca1a4b4f851a0a82efbf5a6f2c1e5dd78c9b757c1bed85c2c9b5328465cc7d65258abf5bd6186e5dc1d80e65f5c5466d1159bb4db411775c585d199214a771fc3f1161b34c300f43bc069b0c949b08d63c483ee3833b837d3159b867aad3b7f517b5d058bb7178dd4e9215c84a975e597d501515662e0ab279424da6412f9dee49a000802cfe9d7410197f8125936c9435d1a92a93b85979e8278a2fc1d3685adad4ac5a0b199ca8155e3b156211d6765a5e2fbf5bec793507d650c84757280496a996df3c0a5c4dc66d0ac4b4a687a864da17f43a0b49c5ff6db502ac4cc087274ce125d7e432a30c28a66d61e2b46a5828e1e25eec9bdaf21a31c2c5d172d002d7d14f3a6cbbe14801973d8b8331a920dd419abfa6697b4aaa2f242c23f58ce2ccaff6d16c7ff0d870304079866fd358818fc3e4d174ee15581c9dff7d95e7f8b7e6288d6e6220227a585be5f743fa441f9248b2b6f3541a85448a55f4bf8691facd68f9c1f3a70dfd73195d2ac885c6f8d155735cbf8591efc86562344f580074cbed95ae910660766b193bb8e554e6235582871756fe263c61489b87d95b16597786731d33e0ba81803858af91060d66c7d932ea1b98e90e4327ca5d3adb8864f9969e04f41aae948d08ee69ea5085a2901eeecb62fe5c4df11d6af90896c7a5c622dfeeb2c1b3a0cc5c1aabc2df77f64311bddf5149d8d2c0fe5cb52c4bca221822006c74fb6e2afba83ee465044efb20d7e9694d9ceaf4977da4636af38a75bf6deab0aa06d0904421ed8ef58d20319e3a0ab600566b0a1cf8e93259d47e12b9845216dce879aa3cb4b0dd417e6e4e346ffe3aef87cb3941cf853bc7747e90c99474b06e30c8fd8f0619f7c236775736cc5ab9a31ac003915123fd3f0c91d7c1e963b31b733bbe61564b9b2565929a001c97c7eda664bb97a4a9f052ef1462c246dd8c3492b80067835b7cb6d3f18858fdc9b458d095b6ffc7f5542a3df99514124629d91614a555d478932b8e7cb6ca5eb50be80f7f42575dc8d218511935203a40b9106095b2f53225272cf784d39cf5a333e5679584d5a15e1f9817f450e56ba1f7d0be13700951b4e94a8df56dcd6dfed5aa1a0f0f61a0487fd23421903246ff2a5241826ebde16d56790c01f1485304d711285c01dff11943bc92fa38520bfd72dabb92700f7062edcd5c2557a1b15c0b872c0ef8718e55f13a1455e1add258591ffb2083b0c38611fa3779a313a58c25fd07a5d09424526e9db2df35b7b78acb44846e564116cc84258e5bfce04057a16503da8da57ef6643e2422b492786685fc790238a375651a3dc2afde18ab6a002f46127e5a9695b3fed953c826acb22f22acdd181f004425efb165bef2e7dc32e1701e8fdc67166da3a896f25610d345c9a007b54ea0dba45e1bd1d502946d69ab51b4ae88c8d6ba794a8129b3220c31ab3aba2c9fbd69e6f3549b0f0344045a7bc2e41b4f9ce8a8fc776463d120dab1184681e37c5578c78fbeaacd68d73cbdcd57970221c18a9c91e3a35a7d5ba246f590f04a6f4defb02fd4e8d55b68c132e0fb47c80663b548bd0585f68124dc8b1a9a1c066a7b7c25be1ddb1f8ead957a650782dd3d7c47723def2e681b887c9085934d7c66cd32e3ef359dabd54a700dfda2219e553145f58b2c65b226eea195463b0837748307fc1789f72d496962c6a5e4f2bda13edb599bf524b684c92512b9f9d3a17b03d31b53f184b9ac0fad8c09adea331f642c3ea5eb2a06cb593f69081362ab8dd817c2e8694823fb3c61244c5230a77b67ce3adb4eacd19d5d9c059b9df2b81dfd0f23c9a2c18f6a9c29afe54290a57a2e5330d0bed868fd1c0cda9cee56dd91aba6b302c147b5e044835ff6ed268b18ae7de49d18054e01940638fe583e3ee134d8dceba0bbe7fc86d1bae8334c1c9e8a21a8ed72990bef9142e8fef51e92904b05f44e3cf7d7595caaf35f90faae14b5fc650020d471a2fb149bcea9923aae0de6428ebc79ee588a97328b4a27c92e8248c0d1c22c48b3070ca35aa247d354fefe7b936c23aed09a69ada8c39cd63c563ec0d6a30ccc4b740b0320b89d35c658e810993002561a2ac56db9968193acec2a39bf3bd515798403c8f55fe5e958d6ac24cae11abfca31ede31fdd9e81ae21ceb85f59864165b95dc2e091c88c488ed48aa1154960508ee214899c665b2100c07d11f4db150134db58d8a027db100e3bf554679684e2e023c97dfe523279f6bad9a43c59add304c9a49f166919318062f4dbab185cac7b06df0a51b3a57dc9a0541ebe67b23b5208e524c9e5d42ae3b27723ba0a9b9c88724927757cec48efee3d264d16d8a65b01e10853ad7fbccccc6c21c8cf10586248a5fbc1496977bca08f5ff23aa3756b3909933d64dea4ff8092ab880521df11a937921a07caab6e38fe758cf3cf92961b923864ff23f1778f2ff96349c6c83956a2b27cf715300b4deadb26e2ee75d7a1ede1c9e82f955c1b897b383b256f78aa52f5be437e5bf5b2fe7101bd26a8fb143afb6e7bf52d3b720fe99ccf49857d265f1d0bbecf3722a3ad940a287cff6e9a9f9ae9cf32573ef6e7756a70842b622d0a587c9c21663f7203df90ed93e230d8ff142eda60c501478c8a12b5ea6e3acad2d641ea55cbd1a9252ecd341912795e47660b1b71a546ff8338e755e67f859b742f9c725a41d3c6e16f9225df7066d250ee44adb0b24a5fb936a58ac4efef41f5815ec8209c08533d60e08d07b0fa470e50260d3ab0e97d754dc60e32a7d83495f770948e67bd06417678bd7b9c9678d1c6106d434522aae177b938cbb5b860f4d93983f260460d63985c056c8e4e4440089aba9110f6dd2a985fb01d810fc47244712c9a8af325aefa17ea6365c9d0eb60d3a112c09983621a3a20b9dbc2d0f471fd2bf29e38fde6050cb569735ac8195cb41089e2ea1afb1216ad527a1781265256051e770b35fb026bcf397006171f8f65fcf22921d14eef738bcf7033796e920dfa180b746a1199c134287c0fbeb78ebd233c7cc4e2df6a735df5fcf24a0963ffaf8a8b42f048fda71c3115177c4ed592575f09d75be760556cd6e078a189d602cf5dd29cdc8120d09355b3cb868b079dfb5f75959aaab26ffaf43afae9168d946eab4b8baee31d1b947a0a927d016bd325f4c4a27f8a424ee504b9cb54a6910889d94d96535e1fbe932213c1d6d57e78085aaf9079607ac1f7d90b62e9b115cea8c407c1744688ec308a819e73373cdf565e2d80962bf047fb8a649fcaf00d7079d91d32aa1dd21215a31a70c7d68ae81eeba0923fea7f00963446d1e9f4ad5001cef11fcb3fa1b35120dbbbed77717ab2dc5fb0c09d6687efcbcad35c6d209b66f8635513141075f1ce1341a2cb6f177a5aa3307b5e430557616673cdfd324b6abc6756de23f1be055a6b01008704cfaab86f84e75f3dc3b05803811998cfe157700c7d5d3a130626d70c0b26b5699fb7ab33e9f7f9d97d7214e760c0224c283a064bc66df57c33bbef7ce829b9ae8a136b3225a3b96ade941e980f1946da477ebe040bdac8e7be031a0eee83695c6f7f181aef8165a599b7c9258d29273cbec0eb1caea11132d0fe49c9cf93e5e4da54dfef13a8b2f0f062b3c0b24b682b1c0c43f2cd5b25792afac91ab34a0c73356ff8d323c6f7d4649e80c8a9411a48d3c8ae2482bec69e198f353664ae9fd7efb46329e92fc4b042f17af6756592ce76e97addc3c360b6b91fbc712a436410c24ba7fbc67968528ea4b9a1af6dc82a2665276556d538cf97cfa25e42a691e92adaf1d5791b91323d15b60b68d386e2a96bd06f2a97477eeb4297777b548a05bb41f0aae3060d8058a178aa2d23ef35aa2c8ab6d9a60e686adc7f1b43b334aba0078b778ca310562080504059adb33762dab65721dbcc5ed0d9c1c46e938bf2eddbc54060ca35540429fc8ea83190371097413c6dbeb3838ef3c5866c46dafd5e319158f20d2d5b5747008a959ce7dd052c0d872cdc526673f7796d3c5076f4c3919e7c0f53053c08b623c6efdac19ebac2ee19edb13065323506971145b0c58369676ee20f4a02594dde0547b2997b675cb03d473c3b487f1b779bb7f598e33c3a691f67416fa9db2300a00ac9c52296776c815ef843d10926d3c4d1c425b39da40c9d8b8dd1162b653e052cd08ae56b94a6cdf7823f5ae2b7067b2e0a7693edcf28d806e0de435faf01a9164acd9338e37019760dc1320564f7a28fec76d37f5325d2cd375ebc940cdde22e04eb485c571abeb7db79376f313f9ef7dda0036abec679a4225e2c5789e872923521d01b03ad529d375cfa7230276bb1901645bb808c3a93ba5c5e5b230b0ab677346c3cd47ce529c76776a372b9450e9b097c5db31df4470f033c2c8e78a4de2c3092a4f9b6de21a2acfa92c90543212bb9ff8c5cd952950e57be298463ccf0360f9e518795195941a669b7a6e43afd0efa4e8d13e29b1b191de3528fb93dd1ac76ed2a7a402c02d60832b2588898eccb2a482e44d382256d75047b80953f7de2246549c12286c92af5b7a4d40036a1a09e7717d7dc6c8f5a07c6b2d39a4cabf809e0b8665b3fcc214be00eb66fcd29559f15e6513f9f382ee5953b5073694b6fba7991c453448a20e90db9e1384dbce0be6d0b37a855787f694125cff55a7c4c61d06c5bb8327827c8f3d68324b6c6d2c2ed3cecf24973620a55be164dd36e50e086a7930d3925d076d10d6a1757ac14a7b54053a9f2aa654c31b85e63652a45544dcff543df6149536dd54a7d7ea092d789a81a82193c59a73d698154d7a17df1acb4a4cc381cbf75593469691def846537e991d73d2c7dbc5fab61cfdcc5a97e41318aa7711b7eeda3688766b3559a5627c2d88bc50b4c12b0b975ce2550756753de6ad6a791bb5717acca37c443544efc352400524dc62a3b75eb953fa6705958a590cdea5a2dfa9b2efb842ab2ce6dd50edbd84fb7960b18be041c1b53cf5068cb40a4486d0f8e5490b0c39f99a3dff95edddb44c6f08151d19948dcb614dbd35dd676027664ac13b2af719b47424f58d01996a4926e6fb8824f865964d72a94429ca2a852153bb806e6b700183f8c39c22a7c504dc1ee7b816b01462ca1602dac44e81668e7d63e2bebbbad6f17aa60a4c356bef849e782a048a1266f20312ddbaacabda4ec4169aabf9966a70e84613cf1e87f727e02b6c8b39039422022e58554998ae22c9895502dfda5c05de6e9a568d19d964431f6635111603d5c3a4dba6b8879d754e7eebb6f54e5f903282e56435790eb963d4b6e68942b80609c0c3aa8cabf62c58abfef4534f815d6a620b881a10c7869591fbbe7c13e0757f93023511d488d8a4002a7b1bce8b7fe35c20dd5cf2da2c11eab8e0aa5133ae0ed46261d50395facdee96cfdaa5475c6db044f4c83e5a276e2c0dec09ec5ffac5a8ead71aa62095d1f2c594cf32ee5cb0bc33f54720fb684155f0a267628ce5295c596416f71b39711ed2d05881cece47f17cb1a3eecfd313570fd5f364963c122226b55e5d64acefc21db781ef23b15b8dc0b77c5e92b4ae933ec72efe44148aaf3bef8b4e1895e85866ac17c69a1e36dcf22c3c1de2472c0edf8048e6fda1e8101091cc941f831d059e6c5f6aca5ffee0f1a1bd8fecd162fb5e44c3459aacba7bea966a6e2b940cfe599ee35f5f96a228f104de96ac8649c570d036915146561df89b9c214b137f9e9d6969d6cc1ed69a47b5d93fa6eb7b1578b33788de70d10df85d0e4448888ad226fd9ef5d5a58f430551f607f714f0cb314825da91fb674bdb03f4cc387b0a5fdfe167b0e21e4e304d9c83d436cc7eec9516ffed387d3927a59da86ae54bf06a5812f7bb967d7131b75135bdf0495211c67a180579277654759f2efd4fdd6542b1e6c27f8c7aca9b38d7e05b0a823c6413521d6c47787ca0fc2d7f44db582718b7b06e19c127867fbffd459ddff392fc81fdb513d1c18480db79ea3875c66f2d6bbd211970bb2e0e5c5cd6672a80f89928dace30cb0e724097f721f292b577b9d4a1e4e5f5a9950c0b158917c624168d4914630b1d1939dcfc0bddf52ffd83e102c0d50814be8ae4d556bba65c6759ae344d88e1565c582ea8486d042d1dad8319e854ce2d205a0d33b2adcfbbc59ad1ce76d54c0152dbc1afeb11d055d3971cbd7e3c6499abeef6f01173c2819347ebe742580a78165d0f137031b3e22882f3b3d1235b594be783363567fc4b38bde5e982dbf7cad0b5c9bd202641141354c621c491385bc9fdc6e62dc5ba4d2a8cc90fb2837ccbb638ea93be6d3a2a729f03f2be53ec8cf1d1aa8dbc0220722ca14714262ca82672d8b9245f2f2857865ec3090718904ac4394be16c43d1d737682e5104d6b75f3173352e8dc0ef40b7aeeda9bad483c50d377db9026d2e0edd80191204f7244c80cf69bd5fe28e3c9be5569f0a0f49b27d90e89300e061c0831fb955c74c1c7b3ed68616acdaf6f2b6ef2af3ab56206750b540269686cced0b93531dd1dc9454aeee18d8e2d81a357fc74689cdf2e0708ca58727c08af7717c54cd3d33e7b5275b38da73ead1694886219c6e2eff4815d6563db6e92b9e0d99fa884601efed1fe37ebb557d331174adaa412545ea54c2cadebecc0488103de96af1b8200b4e99cf0b1fceef87c0feddc30c03881806f49be676a49f4bee3bf4ac164693b2c2b80655800f505e6bc15321894169b49011213e5a9772e6ba836ce22eada4babc37a6c08eca756fdb006b679bb39a2dbfb91c073f3683db869b2b97eb8a6022a4c5a6da48413d4ad0bd8f210fd1bf3a9d3999d215816fc2468455700c611e3c1195f3dcf312f7f6afa93469e9db65b4d688fff97713185fc0247320ff539098a3cd9edf6bdb2ce168d29892343cc7153649a91d17acdafb947b1fbe0b0fa92d59219554419f0369616e693decca4134468ab0f9acce36ff590aa8d710289d19de1c5796eadd537320730f4fd9f58d377a3c44a6cde79ff12d6fa328825976f8417f49167df8fe391cb21b7eb3d38131e615472f79b73d62f305ad1a8600592c2aca1f87b0069ec0e0138902833abc2efba2bed63a5792d2c8a32f80e69538154028497d8f7ef2a1c4688d5c0926d31a19c0fef5ad110b0143496fb7e349ce275aacbd9f985624831e58992303a497a231e44a6c528714a87c028ca7055d44df1d1292883c366a44fdd1c92394868373e6c11dee399304f8a2abd3d2a3bf27aa6308beeb6141b3d8cfd9da4d82962c39585d965a366c2576b6611a23d0d1a6d1aa49ad9ad07e19a65b9ca1fb29808b1acefa5411041e1fca64996a24fa0f7b0c0a99799e630cb0f21eaefe2fd74fd07833467d574b85d9b452d8768c21fa184b631466f776956052fa3d3aab81a93672f5bbad0b9f24cb8dc60b9b296423e525687e74f9732b7d6ee7f27924e1e667ff9d0c15ba8b5b24dab573be1dd1ea983cf0bfa9edd95cb7ded61af5c74f478049bc1e50ed1aafc57952895ac4ae53e8fbc2cd848fb32e435b82a56cdb3c7b58021d720dc00be695f5d00233fd8ed2fd0c22cf297ac2345de5dfc960d15bc36bcf20011d4caa0816bd634d726f0c265d74c66132b8a3936a5210325bc582b240b5e9535f087e9c4c3bb1875b90f70ce64c46958a4f4c2aafcdff4a2f0c0375f9d40b20598b181f824247690a51900db280e250bf382b30c300707836274b16f0dc8e3972a6235ce3b555053ab49b5f81fc53cdce891473a1ab708086e66420ce43a966c93f58519412a4c97e75ce9d0a54e0282fee529932c54334ec895ff1a5a97038c966d623e75ee01f8009f915ce88103c73c2e6c462aa28a8b6358938739ffce91bffb7358411874d7ff9c3d1d2f6dd21f7bba7d0749fa803cd0006f5fa5139afdaef1d955d76e2e79558c08a29dc9976dbc717da2ccbdb1ca2c331bbb7bb69aae0d34c8fcc8d38f473223c1eea8b41bcbe05ce2c2bd1d72d5d4627af4e16fe6425c59624bf2b13c175cf6fbc367603bdc4f417fb399d58aacf31b6f16609c9dca250687e909702fddef63194ea9b0534d2ef82d1b351e242fe639c76ccaa7530cd24d4cd33cd4fd87e10fad41e5130627a555ddcc1a57315a200ef6fe105169c47d36c3b03e6a8a6c8f3919822ea5ffb428d9745e8be513306f980e69a0b0d38ac794fb38d016e09adf84ed498a9156d40be6f989fc66b0b01902af6800dff891641a9833b5e20f5e47a9fdd76125dadfd442879a19952f6dd2e8404cd0c9002fa2ea4efcdaae3370f44b919e99e8f8d4984ffa08e3c362a8e145fe3a6b213bcbbd4c20310f08d809bca8af83657af3b924a375ed7f8310aa4cfe0a43895a36c257d51a32bd649b0f1b989eea90d8980d816bb4267d01f782abdfa948efa8bd11a7db10ee22c2b63cb81940f7ca606f30aaec73e7e810e7e389e32980a255ada2b22a992219b415b48d15ad9920d806230e9894fa7208f5dd9c15d25272bcc92abcc8c55625732e42a88f7e23a3fb692b871eb81182c4417a42df26151725482066af342ec8766b206ff78097d15397ebc197b04ac48ad2932dfd9f8a6e34ab7b3f5cf7758a5c3ded83701940f01931cd9f844da3cfc2e59433f13b3e65bea88cebdce4166863f642f821043196c853b60a9c5d9d703728edea421a2c20dbb177330c4659aacf7f020ecbd646925559b26f7228cc2e305af87780de9fa55593b582c337f638fb1865c50b138cd12388936cdd7e4654e7de8eb813d71689e90243d6e8ccb149d98832281808faffba201946943bd16d2b115f751cac08ba0c46b0b56a0a7dbb0761a1ce7f71bf39c7f6277a8e1fa169e0a7eb3d4edb4b696888da8853b49e0c135b63076cf35c7bf3d10f03c0373b3c3ca8a8d5baf632245e714507c91f723a4d3022781ba48fec51666deb4d17490233265bf15bed47dd6388c9cc8b68a51306475fdf7842fdbedcc1e0b42ad181166a9101a64976bce88309b0ff0096c66ac7d0afbce7445aae6be3ef97dc2ddd17724a34d63e53384c2832e060e7e3267a655f3de56033bfed264cb8c5cd90ee0556a0c73aeed785cc56963e4fb5eafda63d61b2a3d9e162dbe471d2935e57d043516693fe20ed5b5d631d626eaea97b35222de7a227c7d2e1703fe2e31db074c168eca147cb2565085fbb8131201e5b21bc2a077323dbaa7155cf0dd7964d21bf5dfcef02f6ded3d00ebc339f0d748606077eca8ccf4b013fe47f337250267f465ea406251669793aee1f389caf8d77b225bce04d46d549ed284fb54fab689bec62f808ec9ac14080bacfe178027fcfdff55025ee3c6a69e039ddbae692f69c6a5bdc89264b6d66186f3e16be72eef6221892a8cb173d8bb79f086dd3c43e4187ddcca8a48357143c6051543b182651f794cdb11f5ec9906a3a11eaab7b3b3ae2812ebf345847d97b577f1278b981f9ba35313b09dca7da3f873c019cd73285301f32c5c85ce2309d4ac45b491b4189d50c96c3b7cd364f7f7ffa7b883dca0708f31788b79bfaa3981a99a06a9710ec80ef318ad52e9781f31bfd039fc3bdae81a5a6152c99b68c9b55ca7ddaad356aff91bc4430efebc8f7aca34b382b6fa13a8c2fd03558f919d498055b950b918b6785ccc247d78b9d76839465999007b06b2a61f8f11fb7d48ae660aaa1baa2ded921d38789ef6f3dffbea2aeccb98662772c30a89aefb8ec3daea44aee4685bdf5a5a897bf986609432874f28f548f07da63bb6c514c8ddfecb41ffabd7bbec7e61aeb9a71cd7e7c45d4bc43426641246830ee13126889aca14492694bb858801170b63851967b4990dc2dfbfa17460b3e0eb6d468951b8e2dea37ce506dda144f1cd2f9118f5811e1619373c5bfd89d909d3f4d59e9a2de2aa40daeaf71e23ad7e0019c585a161f2622dd31c5e8d7bb8263c59888e5d4158ceeef48bc3013a1b2360b2502b123e8cdf1d820d1e86104144596e20f61a9237a97555f535aba57fb1a61aa56b9bea93e569e753ac2bf5bdbb49ef54fbc1bc03d71bfe2fc4bf879fee1cab5d28db7def24cd12bdca5eb2bbf98ccdf06d3809e5c03d0fd8762982032c7d7b43915ce2dab7ad46f8f70e0fe095c9f9562dddaf4c77f9908c6ec9e82f4019434aa7e5fb4ff0babe3902ad1d4e4ba8ec8f0c7f2a2c0ab87b7188273bc59ac1ea1dca9d8e8332a02835b45a271e75276c258d9bb27f2e2b0a5d776ee9652266c33b103e567ee2d2e8de8dd0a4c9129e5e30ff12dbbcbc9fcb3ae91b089d22521234da3909ccb42a86c7a8fe2f516fcb73f0d6f31206e749f010613c4f7d5e200d6e6a94fd97abc5b41a5783be19c069d311b79d542e73c5f1f9385c31c8c893eabfc7afad4f002b1920fa22a9cac3801e51a33edafec430e552e74e663ef50e246b9a99da1302c6f708578b0317dc4e06c5fc6d31d19ef411f76345489646597a86842fff97e5d81660cd3e1a5b19661bff6518ec31f7ee67869d7cd42b13182f0ac50dfb8d53c52c3bc6898c9ec5cf9f3315cdec8cc61dfc63b883c3cb1bb5bd88e352beca1c8d386f5198b43c3bcd20bcd06d2d41e600b29c14f56a92ea223415213129ab472f65b0c1dcde6023968d453a1f4de5008900d0fa7469b55c56146af91baa2ed3aa807b2641a4791309a40c9063be015786a4a35362845cf33f217787244c7ad0e139fc292d82d0624acf41fa72e8660e27b114ee71b14bb3ded9bb8147cff7f955513d2c727d378078b2ce4860d4897dc7bd55e4ad25363864692c92c59f2a531df3f3d8e4beeb9bbc874221ac8cf77b18e15eedffb24891bc970b74de8193f167c9742aa0858ac360dcf0a09a171e30efdf752760e6f1986149cd8bd59e76a0342bc62ca95fada8194b4c47caae10288e5daccc74915eda891965c0da1a7eba75779d255cfa0046d333c3d2e078fa744bdbd66761e3041d633bde4cb2e22475d10d98e6ffde8bf7a44c3ca8e6079940a3dc4db9208ae1b28ee3882152b4bf578bebc211440c6157f288a17f05a3f5ade8a8458f01e20abb9b98aa78da68bb7a8a8111c6e7a5639b1f07825f118f2cd1c041956b7bb0203e863085a47fec8923a53735a71f7688f27daf6b46c8db7bda357c5038b567fede6724ca3d39c3dfca7be086261e6c203ec89881e4e79f33b5636b0a8e5c90835d984029266f270a7ab9a0cc2926070890b5cf552bb9b88270483f5b945c234e91524d36098975444ba54d349068cdcc2eafd544ad240b8d07673a29acce34eb0d7c4fcc8b80035ae933eeab7cb0dae4092acf4d00f92303c213d575917f40fe8c0352efe910f7c025496ed53921569c057f6c53f667cb13333acb54458441f41b86593090e60bae2c3822c059ca2c36bc64b46ad74fef88a92735207e558ceb138bf186b8f821cc4c2b226da0a82e5de71e19946fc1cc21bce31f8c4eb69969faa7efb244466d9d58da84aba98abec07c277bc6d1d66583f9282d0ffb70ff7de0698b60fbe290ed48c6f81f1c7108e1a707eaa7a755e183c17d4baa505c429a7fcc3fa2892eb67c2f661fdf1990ea9ba1e88d4f2d75ba663350a59b7511c1ea068cd3d740a2b5461a1c6b780c8720222ab37c6bbb46326ee3ff69da887411ad1d159e8b6a537a73e70e4709a323be486fe4c479e1c957e1a5c834bf08d97dec17fa3c30d3b43308fc32e7b3c81622e15b218e015aef7affc6c401ef39970f1884379fcfac0e9e60d869123228065912366076bf23e59af54e014f892a16fbc1834e55b8cb136deff4a1d3932a63578fd41a24316b0e2ac3dfe2437b8df99d49ea5ac0984f8bd5baf36d92e4a95848fae01dece64f4f9f0e5d150d1d08bdd132ecffbd836a2647fa01c3e96836846e2f23d76b3a52e297532f88e59caa08ef63c66a951ca85f592c4d484e481021036b15d9375ca80176951e22a438ca3b9a37edf75536b1f7c9d4030d89ce5d642a3f7bbdc9e8311866c56f015d53ca701410d3ffd4cbc733e49cc4bdb5942aa245cf8a041ddc1187cc09534a0eb4bbff0cdd2bb2a6c187ee1d6707fbb4bd79ee46d72eb5d484638cc38a48a5dff62c9e5d8fcca88eab2ce3ffa5b2d499062ac4b89a37535c28e63868d682625f5d8fb64faea0baaa042c61c200648f541465e8eee98e1b2fd235257a2df58fed4917d55df4eca3b38d3d33b8a5d122aa0d204ec61e44f414d68719a5f4f19a8b101d0c68e94fc9bc93af0534f7606a0ef55c5234e95ccd5b22c3ad238c5fa048c7e2d6e75776a7129eaeb19c33008dff60c08b3c50ca9879b3e582e9dd68cfc2aa41b6d3b845519b1488a234f45ab09d8e52b7965c4af76949b69874555ba79adf83e50b97647ba97ce1c14ee5298a206532074b2fe92539ab3093cb68f6c1897912fffa96491e8a84b22a9c9889f747315c174349ea45c402b827ecc6e2476d8eb3ccdab6d65a995e2ee31e2139b68094ca3fb44414456b39c5c3e7b5cf2023812f8888c153f34237cfabbc5a2b44a8c70f6819c75686a5934664bf43bffc7d0af1897f746e0069a4ae6a25d6e901708800dcf81243b34d3e5dd2ba49231d58305e0aa331f270ec539e4014cd76c529c96913d1704cb3be5871b03f64c8e83519ed9ccdd33b86bd37579094550aefd2f9cacaf54969661bc3b78d6b2d5b77ba359fc359d5 Params = SHAKE256_W16_H20 Msg = a84ac56687bde5e2d8382fd88e343a128dcc899a02ce38126675fe2a3bfd6c2ad8adf8d092ed6f7951e042f8fc60a366e191c44f3fd3d77c8dd23505273cbac651a48ff067f90af5d467c4ac525872c4140e82358591a1daf8a7bf6716a6fea003d128ae6cf80a30bc06f6057702f97133de52648641a4f8dde73ca365bdcfc6c4bc3bdec3258b61f23105ebb52ca189c7ba30fc24f0752c66c00331c28e53aa16219a85c90658c615e20ce175028b6fc01dc0aa1ae9d92f5f8fb4212c6e4e0dea138c2cfa3f79495188eda3c2405e66b410c19617e4b5a2651e086b834182a0821b5794a7c417d7084a876fc7618c96172eeb972a5f323a924b6f0530daa8898f9907fcaad6ed374590d38fbc65de46f26bd8aa70bcb59b0119bfac482a1c10b415 PublicKey = 0c00000c9c0f7a40fdcfd0632e28250df5e3baee11d089a6d15be5ec41247eeebe67009dcce94de5668eb862d80d6690ad267e26ce4dedb697dc95d9314f52524142820275d45134ec0df695e554d8047c39c919abf247fa195889240223a8a44e55b40847e4b0d6139a3bba84eaf5771600b91af17c99257fa4f9225b7bc0219864d959 Signature = 0000000000004a4e7e4ae155ea8df546a09bb06fd62603628eb71b71ef0e8954e2e7608687c7042cfb8d7082f75d53aec95b0e0de406352f9e0bc652ed53b95a1807fc7f66a54910a86661e40e8b70dc566fd162c8075268f76ac5535d453311508962678e1210b2df5d7ef52c5975ea44e8a8c605e4ede36724d9eb3b5879883f6a8e71d8f05e1232f3685c9bc77b112949140f3d3b7abd52ebc0f6d70a32fea276549aa1b68937752d7b9974a2196f66e369039240fecbb97b32b170d26a1c02df3220be8d1af801dfbde9ab310451e6f81cba492265ea8686b56167e2cc3b8b4054c7fb35a1f536cdb4c92f39ff78c8d43281f589f39820cda347a6e6dfa6324fa0508bc0b5394e4795cfa87428930c074b4d1459227da1d2acce2486ef51c733fb51d29e65ba5edcb5c7e7f967acde30218829a711c69c11fbc483c29809ac45a6e8d1ff73217baeaa72979d0576c11d11a28d690be28e4d8016eca09aa5afd0dd46db8f9b94e22ac0de9be462eb36c78c2bb5b1d1e72738df43d4a93bbc0f18e90c3b0d93301a3c4e09d7ff421ed16fc78a97ef9fa8af9f50e78a545d2965733ef77ecee407b14f84a4e1a18dc673bb53241b47ac52320641386ae191b16e5537fbc437aa2e5ab801be640045cd88c744d41bbd658dcf0824a900fded9d8b9618431e1cd3fb4520f1696b7846ff16c26324bdd977731e1ca72037868d03780cb368b219f58b5b86550292e26c7595fae45f506d9f8404b4374526f82229a5255dc58fbd2f0b36f8e14f0640ec2338770e03359db4a0c259ead5ed6447dd476fa1912f690f2635a431913c64a1b07e33873cc645052a204220366e5952f1ae313767d7f73262d914fee8baa2ea4318bdeefbde9d9fc0a9b9fd53c20a00b69359695584546c7b2d47e6b140d20062098822d23b185146cdfab6748659c5595b67fbfbd0cdbc314ef40eb90975b121550a6a8679722da1772f6ef4bd7b2549d8e76b47413d67124aaa82596a1a593682e48d98f21b84866ec823e1acea862c5f3ff0f9042720aefeae8aa087275c0a80785a3175b16fa5a43af82bd7fde814eac24a4e428cc9d8d0beb79c81d8642bccc78d42aee3f06509d7d8c95f9c91aa1bbb54bfaf7de5c935b90aa7599622fc27593e4c0f67c1d0bbee2bf107114eede2e07143d8af75c2066b74e6aad1be10ad2acc46dc718448b79cf95dd10f438556a72ea181cc4e396969bb5b97748d1be765d063836b180f1e2ae23829bb4e55d889489e3b4d3605581a0f85caa37369efb0c33e553544210a4f8e8788bc6d3d281ff2b960c478b2b606e1c9a9ada8738e582e219d5ecf15b16edf9948235e80d6e269c13d39902e0ec6751606ecaf5a252e4427e34531a19cc74502d9ad579a09ae164a9f9f07a95ab538cb6b1388cc04e9975b83e265c42a5c1afc946ebf524ccd86222d5f5c91314043ec386ede239dc3bbeabf5d7f23e47191c59dac76c9c656efd4efeb713cb9782ab53212ef84b0fd26621b19f579677befc76fb73bca2e2cdde9089dccb963496184e91a02f0b121513ff603966235865aea028e27ca7190f199aee848f261d44df125d2f277df0e72cbed2a59790612add132af1328cec4d3c2aa2519a7adb2bfac09050abc0318933e6af8dedbc54af68a9618330158978c0d1c30f606a19e82e63225fb15d9a231c5e2b04e57e07d18deccdb772e85de40e102c143f2799d92d68c744cf103ad6cc1aa19cfcc10ab1204bf98a83558d2330c71ea3c217b259f909429da8cddf5bc7461af6cd44f78bbcee02733f3d031a4cd3591fc47e3eeed34c2f0af4352eeaca1395306f5062d6d804b3bec080e71236a1d91768f20d52ccee3f2b3375a6af1f145d0409a7dd9b5964dde40249b635680c1141e6a1b5639a75a4474e42823bb19ac7ee00d8fe14246b5835d9fc32ad2449d521522aea76ca5f100647c18291628289d9abb76b699c7e8f36e07862a57b6f0571fd6652404bcf61a15b2e871d8d198340f215ad38b7acdaddd4db5e855d6a7f3c8c7535f68411a360ecef805ca53bdf497e656453a36ab97839dd86ff9960d1af644a7a8d918a66ffa3c1bc3116eff33e89b64fae2353c45093756843c12a60d9afed9cc1c535b768f584ffc71dfcb346c9b4c9cd211a69e87c55ece2f47bd63a09039228bc245c80cb8973cc3c6cba4026f5cac9b006d4918490b8c77cdc61622297d5da655de0ffacb24de2600c25556b6c89eac8f2677afff10849c7c93799fa75e85d5e9f873c5f6d0631027063b5a5557284484a71f57e10c96dd49e20d3b263813e4700325f8564eb07c319fe9074fbf25a94b33f772a19a3e228dae1c550ac5a386d515eea7942b887c79c5ded4bb87142dbf6b531967cce406ade84d9be0f42865c9fd0159403667140716c5794eca403e66348a89c3be1ac2b578bad588de52e82a726cf8161b7f01f3447576e707f88bf4e2e5e264e14207e180b57133a77cd147a552754b00faea38a7e7353edd55a93dda1a0a78fa6a10ed5bc3b30419e9f4fd659c43e5f9b24980ab1d81ef3298cc14d6d464ee3c4a14389fe1e25164d990fc48dd97550dd45a922272e75f12628310abeea2b844ebdf912a4421d451403c4982b966a81537c9645aee93c7367c3539bc088fcf043a1bc53aabbc6c2d413c127d2a90677838e7e24df0fe2963870b06620a5fc01fcde4e38d0a68dd92219142c86d49215426a750a7ca4392b30a7467c918bf3b2b2971381f94b91e29c1885256bd5fd7f2257152056d10ed3e8faa2fb2efe40d4c5d90b5c4fa969ae9a851f35bb3c3e182c9719b7fec3bc4734b105f68250b9f497f380eb5933c379f63b51303af07942fa64d869c3d6f357a1f183397ab1c22402cdc220a68aaff7ca4a30fc94b47a18cb44fc6f1776f0d93947f351e6546ec2c046892ae45fe931a6b8f28d1650a98bb47ed1769652ed951eeab133ab84ec24100f604aa39c55dd401d55f5e7e1edb06a23ecb98be48a797beec112dbdde84212dbafce230b730f846c42eff5c0f1bc1e8099ee9f1b8a3f67eeb808122c9ef78c9abf0a055aa8070838dbb2ced6cb47087be719884b912bdf290861ca7ef8b72781d98d8fca344dd80f23b65824f2acdc42490e0b9f2021a080b1d99c7e5e83e3c3b9fa6fbbaeb3c2d1bf7eca3d6a6633cdf4cbc0168d8fc55c974ed4bd2103e9415c61cb26833e858a6d6f5a9d6742da8f87dd5a8149fc14ddd4939baec23dc8e74b029913099543f80c2bf032374f9bd1592cd04717166574040ec3ce4cb5121b0dc9aa227ae67724ab2d81c0d34fb5f11c905b6628e168bf5b9da82881030943f1b9e884b67c7e635472deca14d142ad26d29c883918dea1d2d43e75a9c749d2278ab7ed315fe6c5c21e98070cb7e0fb467e1096f9967bf9d1e199f02a45d542daa4ae829c436f98e61968219288b4dc62299bd41bc526aed6769fd0559f88c6cbb01ee5ef62e318a0c71981cc1e0953df58bdeee7e302c90effd9440cf96cce24e7e3a8491af3a55f1d9f3fc6bbd326617fc65fbc43997e152384e3febfffe2321c26b3d80cade653832480dba760e39786155ffe5c763cfae895fd710a569e522dba4383e5aa88ade675258461a5165cfd49eb6239ef81cce76a16f3ab48b15fed06465086c083746db606ce6c4d329a4c4771b457ef77a4c44269bc73a7151a8183133e7de408f3622bc96b19e04fa2522d053dae00c3989a3c697a9ff2fc7e4afe7819eecfccd9b41caea501bc2151183352c5bad07169615f1899fb2cdf17c3a5403b8725c2bdf035292f12381e27102078830bdbce17abace65cde00e9f3a8b5ff34c8d7d6d11b13643ad2d7d7a22aa7289603a5354763dd344be551988910767db64cdc18b8b996882e924ecd3d06799e8a31e643d7191061d6281d722309e1d55fae5927b37f37d1a64f30022b9dc60969c3eaca34a3270ede79635310cd266a6ff36fe76bbde7928650fc0c94ed1dd094b322eadfc931769fde95b0ce5676df87759058678a0d39602d9b757ae10acec9cfc665cbd4a16ee20b2fcf55bd5b645b1f76fd891e3a02401110d532761ecbcf54c1c35b0a4a7e868f2667bb07b422a57beb1467db6440c51ee9e8f2b8601ebcab9297aba32223670eae3a5eb96f94a31560443cbb765e1d9216221d0ee0738b571b51f0fc577a55e1525e379e1faa913c506339f42ca8c5d815ff28d2654923db2a3346124f2d0be7d3c1b418dbdf31a44b8e30ad7f26dd0abce7a5842acc713927fbb997a7e1db73f29b02ebe48ca3d5271a9fb91c2bcd9b41909b01c33a03dab709a4139179b5f22d131641b180f3eea5829f931db01959ed650ef170c5f62efc5e8bf2c2027d1a750204c131113ff7fcc7f94763b993a8d53a67adf60d6f1353759ace48076c196f0578bebd29ccf0ef3239978a5ef05eeffe1cd08c72818718d801e31e6d85eac62b6c19931359532077109c88edafac9fda52d4a2703ec8f80e946e17d5db7c50f0ec3d1f8df99d159341aff6911a12b58fe57506e8a7fd9c719088744e94900d9aef231efbc55549a45f040338424c92c756b914220cf6f1fc01c443d863028f82921d9bff6c976fd2206724ab580beade72821ca885c5e882d42396ed5a32b7b5ded7e0f4df8c89ddeb7f4ff896c6060ba7be2546f16c148a0760b79cd0da02df4315ab94a08c669cbd24625e06761b7a0a527db33a157de1419d75ec8ceb7ea668e913e32c619371dee9f89d6bbc7557ff4d0ca153cbba13ff7b9b312d130efdd70c988b507d976cd1004e73b0e2c19651ede980506528dd5504d4dfbe41f48662c143d0326cd4d3fa13562f1d5692586ac4ec98a00e06ef0bc5aea72feced9447574ab823c4e5906dc36a3979275254f0ed3b46ed6edbdb70a730735bd7215429a3609c7ff80199cab077f2fbe55737e2610f56c5cf045a293c01b87adafe90272d560155ceb2709a7b80c301c5d2117b0fd07d16ee908aa94eea20d36ddb8ea83a8f666aec368944498fb9b5df27f207f89c4116cc23cfe489090ebe753d0f19f39401e1a6ec40615269328ed0538493716a23e98d3f30ff91cdf8b4ec87f6cd7b4f3745688db6cbe998d9c5d833033b5109ce6497a764537898a5c0872c4c49c627aee84884edb9fc69073b596e001ecbcdee49fa04289fcf6bd6ecb2811351f7a79eea6d88e7862b33d4cf4ecd7916d285f95f6801e420895b67d5809cdd298e41ad327f3377f62f8fb82b53f0ebbe52482597de63f990bf1f9969efd98a904422ca46093db2497b7c2ea829162e06f00f47ffac745ff27380f63cc07bab9c8c2e84dffcda1364739732fddc82fc0a6f896140ab138f19841a041b531bed29fcee0b85777de4714184be4baf85588ff6ce226538b11e4a01e0b9269cb02cd4fc8f31b0fc1230ccacedfd56a698afb74618562f65502a3d129876aee35e79780414ca5eb76ca01109ce9ffd43ab5410a855778911f906164473b8914836a3df87eb030d60d2be24ce99ef10cc483f4c2c27dd25bf0a8314a1b65e789f486eae11c2dc13605b753d75f7561bc9a0d3c7f84c91f5b846bcf4abddf0441dd7e9ad6e78e09162c9663803f9f0bae11ad105b5d1b6c3d0e9db055cfd67e00587adea9dbece56613e5b037517a4e49362a5c00405282cc2bcf400fc9164909de14765cdac84ec25315ac4ddd95e8bd23c872c8c4195a07e4cea05d48d0eec592c03ccd7348d0fbfd2c945693bb07cb1bbf7216848598b42a1908dc685a5521d429a22ca142a5b3fee418079d51f9ea58cc36bd4a985a5332624881d6b0425002fb6f248c0471b7e25bfefebed0f2b036f82c0037e8e1d9c93e918ab84ef0c4811d92b4d979839bb6c5f6cae835a0823c498a575afff69221cf260784209af2958751f40a2b54a0983f8eacb05756d7f99a4e6bfa65593a724fb867fffbbee5500eac3317750865b83c7c834f19344717b139cf8d0db9d8fa756eda69641aa0b20e9f5b970adfcddf57206304068234a01a3cbca7eb5515488b290f99d04354d593c28d5dfd0e26dc4fd19513cb76a7f53743488161e26692095df191d687f7223f85f630839912a251d0ce470f0423f04c4aa60302d65b4f7bd5c6a7bfa82eb3f81da7db8b45a050d536bd78ad32e032f67237ac5a286bdc9e00e813668d69bc82e0e9196917e4e8b9a5b493a65ab093f4e0799df9682b7d90933bcdd463cc51a3426cb68ffdb23dd348636637a40382898237d47005058dc8228af25f837b01faaba42c2c9cc7d72df9e14a791c7e1363cba7b1e9cc17e0e5842969dafa93e8c1d4e0123dcca548d87dcf1e6810cc237a0e5c8facb7b40421c80a97b98c977e736e643f3782809aa147677fb75b4a53a8269bd5e48c37122e45b38037c187a381bc2384d80b05102f23dc41114f082b462d895fe17b5887be93cfa410dd657313ee7e5cc2ac7e636284beec10a8d3019287a74f94c294349b619666d65bb9d4fb857d22c573ce979446f5bc164bda01b5b7f9d7634355514aba168cb63a1ae012de846234ebbc7a44f1fbee1702fa0b82e774f681cdaa7c17f7e59bb4cead59712c5c65a5136c9893b5d60e7ccb3b6f602b879c6817ccec900a00b8841356480abbb5904f2bc308d23164266bc175b49592908212183f3a676de470a629195159a610e08a36e6778a024b4db6f1cf395fcf3a106a373efd889a6e87fa6bcd7a6e780c74200910392f16ca18510545237c3b8bf44085c02d28d27e88091bf69584dda7247d465fcf856ae078ac4913da36a41e1d4ca0701588d837cd8a1f0399ad0b6da064ddede0bdb8416edf3dceaaa77e473620702ae42bebe8f13b0b0155d2f50b939e52a23c7ad14f0b01685b1063f5d9d835bd4f17e864780a2af2a000bf1445aee917c395e077290ac74c331a9bca943b1054d6e1c3e9f4c44bcfd931b03707970e91ecb30fe841e1efc6bd722592f0e08c5a6ec470bfa12684dc8d57162d0243bf3991e51b2196b2615a699552c2eba966b714ce3ff5b597ad3f36272914f076aab91635e0e6beaf158d94a0cf6f8100f24d4424db3ba4c559e32cb5b4aca2c25aaf9080f9d3582562a4effa01946fb5835f02d9d7b36fd289bd42b06a01636b7711ff00f1ff7a06fd7e18d71c79bf640a6ef4821b4cd2662e26d365fac3615fa190fe7f1705b3686044e5e90250927706f3d41d82e1b93b9183e348742246abef89209b8302645e483cc1e6bb3e359d116dbfd280b85c57c2ac5dbdf269aee2b9c228fd3cfb0e36c4f24625b718ddcafa9d5cf532d8744eadff8bbc8908cdf4492a0f509d9c9d2a11add47e340758f0197c35b559614427b16c443d9da405c016815910473b0788ab7885944b8bcee1eaa80635b458c73fcb252e37a9b9d56bb8fab8358e2d268c8205b22f2d5232413f8a358a1e076d2f09927085d4c466d9f78d35be88502e2e96110da88ca94af4e606327236f76d727265ce593d0fda264d0ea5ea700d345c97fcade4d1776dde905ee66d09b79be66a40b826d26bb41cdc8acc471759198c0f2c6fb9040883654273fc22d3acc3efe2ca32a453454c75fad160df60803a2d4e547e61b788166caad013861bd94e774c645fc0dd8346fbf1c6106f3e72f53e64d5c320dbd7a467fe4bb4cbafa2955960776866302dcb40b7b44329ee360fb3e7618ae5b00a38e553bc25d4c76f5f04f5878b27beb3da7966c2b0281ad5821e0a46bddc5d8dfd3b483bcdd24ebca66b96006d68473b570eddfab123b3a8a8f212e7c5f291e225269fae10c7afb48ebea53cf8890122ddf7870c636b1382e26106d9b059c60b4ecc685e73e2b6850a56757862bf8e6f673fdac55b5280cc6d44b053e2355640cfe5d9682a2843c7fa242537b4df5c628766b807d5897a062775c0dbef7ce03b554893e9c4e77a544563366bd816e201bfab5c56846e6bc404ecf9a105c44ae97d662ff2bf26481edce378b138cd002f741e2f8ccfa471d3e6ff7ba6129361305cacc8eae956e0dc4033985f861ac9d94d2945f89448095267381f6c66aa20e408b6d9a856c59626fd4ab0930c68bde84674afb74c85b940e81f754b6763a4b05fe80ade43b090fd5b7301c34b8498fc63a5c9e14b8280807d1d8c902e2bae0a5295c9b53885c6427e5692d4671528709a54645f1f3152bd313ea049d31822511cbafb6f929651408aa5705345d800177f8aa58586edf79c8804ac317dd836fbab04df38d410597ceea63fc637175dc8bf6cba785cd3f8d5dd0ee9af3a2e8bbc4d50cd3116798e71f153fedfa4c9e8d96c34b41b94da5fd99b4541325d6610ae51961e174af62447ff50da221390e41c4328b32614d6472b8566a22705d40431a0bfc46d8e4ef926703966d506b8928ed5e02d7432fd949521c2d444d4055c4880730da83935ae40afc4156fd960f5e9e5cbbe2a6ee57d126d98e33b04e119a658e2f98b3debed7167132111cd86da56d378acfe2082d520b6cdfa2a5a9bf29a5e7ebfaafbad9703b47624044e2abb803eed7a5637fc737f3ae03224ee0b8d9bbfbd0bb669e1d1d1dd8c706e4f190783ac9f2b36b972318a45db45d73e4de1ab2f0b84d41ba4175ff6d6ff89550d7287c122a92995a66a72cbe2268c9afc2c647d575fba1df36e22bfd48e454da5d02f7f0ee89ac1d414cf9411c979a536a16681dc67c8350109b66a4945b10cf86ad1e6e294f9c46bf749efd05d53def96961c4df0d91e955b9dc3bf968d0c6147768482b24b546ad4a0fbdbdb989cf066d00030913f14b2f6ec9c8489052ac1ef4390ed5075563bb6dd40935fb894f46e0bc93f5995796b6814e963b8828db4185fbf4139bb9661070c9ed6622ff794cd89a14a06c19620818311fced1ede476d317b6f731716a8dda20e4736dcc569875384c9d2c0c7cbf99d77d3a91de819742a7856eaa7dc97d466408943a7e9dc0173a2c73691963b75c38daaee3b886c1583d66ebf0efe33ea55249efe041119cadea40d9ac7d2f90ec80abfae25f741d386bebb8ee0c9b99f0037f33ad2c3b9cf1eb26403f8f548c751f0985d7728e261ab06f493899857016f1edfc83c67d8cd1f36afeba38c31bd413734c190c12aac702bec1310d5e7f65f034f4cbcb5d753bed02fe37ccffeca32810351e84dd89865b26a7b01d0cfdf9ef08f4b375b8302169fc433dfeae64e997c55b0d38ec24a2485bf799d14869199c0090a3af4141aeb685833809381513e02b7640d0e6228814c2852bc597ed277cf00e42828ea48ea7586f9f0658d90f21a0c52e1ead507bfa362a042d1ce951b2e5daeb14d313afddaff4289356bf5baafc3fd3ef4a13d10b0e258e59b26b20ff1cf3f57bf076af4c513aacf5714ca833348a878af3cc4659452409c97d7e3e90ac41915dc37e1300b269ddf4aa8df815b9e4344f47c339fc2571e8466cee99599e9c5db81fd828f84b9d4892d8f349b47e4a03144168370e5e7fe24365658732240e443356e18f8456bfdba1c7296c183c7fd39e8997b8e4adef74c58f2aad4cafd01ef9e5353554797f7521aa32d2bbc4f14ce9631b8b304f99cf591227fede34042ae2fc30b3a9d465337c0947cdfa71bbe45a4e61e9dd7f7b6937cdfaa2b9b86200d9e6755fb3cd5957da6153e71938105f3012364c1f567c012b605746dc4af2e6a8b9b4a13d5c81b12ae56cbbe6dce283fe73b46b6d7cb9182ead966ed205a9196b49fb9658512354f09abf27d8730ce33f9668c02b4155b077fb52e715bc47263aae3c369392003aeccc2735289e90fa4ca7773e90dfe0e30720f4ddd7eb973a89f5a799f8ee6088e44b4ace304d8af69e881c02248b433bc6532212ec8bd437d3589f2165156bd37c1139e539d2420f2ef4e5f4cb07f648044e0e579a0c8d1d0751bcad2215536f8d0a2744920965ade434a404dc07031769a4f53bf38579dc0f9038c065636874133e5a8e694566c9bb5d91e1d1ffbad7dac8c0de1caf4a64c61497b905d2819ffb54cbcd8dc5f06febaaed73aaf301de30e77c8f4d0e649c89293ecd88bd08a37fceff7c80abcb2b7a33a52012a033a35001eed5f9b32cbe064970041bdd096ba1246f228fd5fb31d15e3b62ad4a71fefd2992d9942c6ab3d9812986bff3691ea2973f9280adb081f61477ed0d36954d2d695d8a91ab7af5675e493e1f68a21b5d029d509af885170b1938bc433832ea0dbe977999333c24990a1940a095526300282894c1ba8069e1ca7ea9a748a33a0556e63a08cc34e22ecd1e9b8823f925bf7785259dc054fad3102054b753ba17ddb949bc433e6ecce288dd105bb180f5bbd06143682041dcdb167ea302d6a4ee765c519c1c7f9afd60a625c5108e8b92644c1533ce5bcd780205a09fc596c799a972559f67036f253738726f5ce7f699131beabfb1d5ac00dee1ccb6a92357bfe20bd74e59e58aebf967d64e94adf358174799f2343fa227dc71cf1abc95e9489241cf55edbfd42d1d01a56ee340678c65b7a07598232868959b64ce8ec90d0c7ab0a3c38de185817b98cd233bfc6ea88f35a096a93bf7d4c450d8b7e4e7825cc74ff147b246a943dc71fa90195c5d84f8180403c3cbe0bf16764b466cef287e2e938b59c00d67985a4678161170069b525f0a93ce2eede6c8ab1bd419443b643ad8096229d0ceb85dc96cb2b04a55a24439696a6f98d5730f50b7f6f49db14f6582ccb343c471b26f4c879f0509a428e1765f480b84a63976119a22499db27d1fc99775e15b47d62822e0849d29c8d5811ec78986d803d24b7221fac3304c689f65b61d16839e3724c0415560546814b7ca61d3010c216d8350e9c521b421e073976c6281ae650f30c2b6da6e61a91f0fda14d98659caae726087ec83197f5621b537c1b75410f7607a1e95f5161f5d2056b68d57c02d2508a6077554b451d05cd5be2ce96fb4ec8267dde3b81af1b3c279b87fc82137dd53141b844de0a167013d4641821a1037961fe3bf4be7f783262959b2f931440ddf2b7536e1c0bb715540fb66036a4e6aeb9e0ffc59bda845c85b641725068de1d8026074d8cb7c065bfa7cb60da7bfab0637484139c6421c73131ec4866d28780f3b50171a64e890745a2262a063be6ec262f1d857a017df5c031f70e2801b97e23ecfe8f3ffcbacdcead35191dd77050f940b6df0e6da3151e5abc4ccf58df8e7c91c1052b0cdc9c4e7557c612f9ecff1dfcb9631b39cafd5dad3df8b4ea088358746b76c5bf1058d6caffd2d929501e340bffb52e7329abf3d708c1f2e7919727257e2a89a969bcaaf1b4770684278c1d20ee12560e5a7017be8596aa03abcb12e87ccdb7a4f91118756a2f10322f1405b81f2c65db9091cd8b36642a192f463eb37d0e6ada551b47176910370b90193a2b433f7995a50868e71bf06713df847ee74a7a801fe760fc07022fcb69d7d49d82669a356878997059c41c4211a88fffe50975dd490bcca324baf5d7264bea57744ced5ebe7dcafaee195ce533b25b49ccc57b4d8f020944930bf639daf0d36e11a53004aa5b845b9bac5e0d225b7ad4b60bf394e82cdfcbfa9ccffaaa09c3e1d74b9c5dec366f9fb505173d360360d773f669af8c412dc7ad0612fd69935cef5629b87b601fc13d7187dfa88221cedc7c6a74f13d09af15a51bff394b800c567347a12ddf8c61aaff30a716401997e53707a1b007e9f35f1d17c53d2456ed9d72d33f274de71e29cefed33b34ab7fbd4a4a5494112d0603f2f559499b3a26c19815304a8ad03d67d2ff671ddb5de79342024100dc0fd077ee352d00d7077db137b81b892ca52cf5580d4d9aedf062eae68e38a71c28f3a6c9b5e45dd59e37f1ecf40bc406801ed54883f52a805b96c052982a3ea84f2d41cb95091d0179fbd3183ffcc6415851b8b685b75277ee3bfe45cf3c92d95d45065c9951b68fa15a47ad06fdfb04fe93508d3aa8929ebfa67bcaa2fd081bcc1470f29d8f5ad6559012d6a87d18b74840d636dc792faffed514315189b0b0c234acfb3242459058b3178c0d29ef573eaa0e01c7eba3d405492de99ee4e0b6ed9dac023938814c137a3e54afab4d20708243615d5207aca695645aa1169d567773c1344b58ff81e4676135d5144db72aa2773fff72fab5065ce4f3fb879128c3fc636f35c9b792ecd77365fd9cc88af54992dcec0530fdb2593a05f50b3471ec63c5c617d38f344ac64e38889339bd05da7d9d01b56dcc4d25882fc91121d3e592044b2809ca6298e841bdc58c7706fd5bfbb4c29d26276c6a834e89561e5c4182df08ed1e984c6ee125e5aefe13efbb4290639c84660ef04bb03dcd1601dd002b8d328fbd4cac780375ce79842cf97d0db08ae30d58edd97bcb8035a21c1c04f14d3b7a1682ecfaede853f2ae308030478d0d1686d261c3bcff36f1b1b09af53c5be50cb879caba49ec85c5f797597a03f7889feae3518e9f6a01fd64688b6cd9d2df00fe605f20d663139f3f8e1824a7425837c0e17d24db202d843ccbbf071e3ae0f6e47cf874948490e43df6afc63e4c1fa1562332c8dc23ee9ee67d9f99c61124b13a34b5e06579671ff957a6e0bf345e1cdd754721beee3371ffe548a28da503f72151952303c311f008f6bd24a2dc010eec74e13ce66c8c1f55b467324ff895eadafbea73bc98bfc0735d8707d0bdb08e3173f459bfac0cdb0ce7af45cbd832bf36c2507aca87c934c5cb541da5525e731492b82a8f7a8ffd34060c5aab7f5b8c5164bc859d683d2c0c9ffc68945958e4d7b17678825580e5ab76e2cc3f172bf6354c9f39d937a96e07028dbd239f5414191c8af8e7eb877e9ae1d567117a39ba913ac658009ef0fbf3dc4b701089c4c3822adc7ec923d45498e77ff28baa0987b4dcce973030ca4fa3fa5fcfcf9d57e21fad39d58d862bbc25a15de666c33047c7e9f859f811afe93cabcb026ff8a94933d76c70ccb8d2a20607e47fb8ce68ea0acd0e3a9d32bf12ed6cea17faabc6778944517deff7ddf6acfdcd3ac60fc21269ccc277cecc7a5837f21bbfecc37664cce6d9bc4f7ae3ee3c2366ab7432f8dcae2ae501c86405dfdef8a488be4edee4dec538638cad2585b85bf95ed55055483a7512cbc70f64f031d803b400aa90cd1e31ee23c3e7f5cdc4b4ada1ee50b329593333496e6cfd06bdb3e32da12d3146146113150759c16eeb9ec7e43b78dd2c49681f1bb29c112463fe7c1dd943da579ca973fca81bbd349bc8a6b47f5565c1cf284a4298c97bd99fda6c1c7c1bc02a7898876f5d1c0300194a099f134b5c45fab8342bf33161b131c6e3ef9d0a8002870ddace8e8b12392dd973007dcfebc2e1de393c485bdf3bc71a96d489c15009baeedde46abf647d60b5519b3cc9efd781fd0d3d94d80f5c8843fb35f36298684cf9b774da3a5f77c3309ea4f01897ad954f5f6d931098f19dcc686eafc2137341197851d9fba48888548b94b1e0cf30f67f155672033b8e44dd59b209cb13fe6b9173e9c3c3ce207ac0f05a9e978179d18d54e0b026d024146877282ffbcb1e20063cc091101ceca06e4c52a7b10be2edac0a12557076e6438bedbca7fa9a65a99dc21ad1d598ec3ad221d67f16c7ea5873928985c4c6f07f5f0d2462a852b16d3e0ef6b2e95f762e04b26e44c63f5381a54e6d75a2018de0a2c97e5cf184f34ea85b70390098c2be7d7d0aa33ccf2e585a5e4edc88462e207a5fa726f6bfac0307e154279530404341998f5b055 botan-2.4.0/src/tests/data/rfc6979.vec000066400000000000000000000006771322470703100173030ustar00rootroot00000000000000 [SHA-256] # From RFC 6979 A.1.1 Q = 0x4000000000000000000020108A2E0CC0D99F8A5EF X = 0x09A4D6792295A7F730FC3F2B49CBC0F62E862272F H = 0x01795EDF0D54DB760F156D0DAC04C0322B3A204224 K = 0x23AF4074C90A02B3FE61D286D5C87F425E6BDD81B [SHA-1] # DSA 1024 bits test #1 Q = 0x996F967F6C8E388D9E28D01E205FBA957A5698B1 X = 0x411602CB19A6CCC34494D79D98EF1E7ED5AF25F7 H = 0x8151325DCDBAE9E0FF95F9F9658432DBEDFDB209 K = 0x7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B botan-2.4.0/src/tests/data/rng/000077500000000000000000000000001322470703100162475ustar00rootroot00000000000000botan-2.4.0/src/tests/data/rng/chacha_rng.vec000066400000000000000000000205121322470703100210230ustar00rootroot00000000000000[ChaCha_RNG] # These vectors were generated by a simple implementation of the RNG # written in Go EntropyInput = 0000000000000000000000000000000000000000000000000000000000000000 EntropyInputReseed = 0000000000000000000000000000000000000000000000000000000000000000 Out = a84e2a6af98d0a2601ffd05c994de713fa8da43b6f04b3c48c28b0b1b6c9c813726b1d536da5b8b359176c646a7156db35420d5ccd1cea945b246f25edf43b38 EntropyInput = 38002f1ebfac64151ec02c602921ace0769a15b6f6f922b30b2743006269f935 EntropyInputReseed = 2ecc6e719637e6ff5006e3691bbac01a83a2e4f0e407800abcc7063cd6bb47dc AdditionalInput1 = 37864bb3f4c5bf11cfb534b36444ea1c AdditionalInput2 = 9dca561150a4d622d50269d2aad18661 Out = ed4901a43569b58c216e32e74d8b14769e1b101f6dd5d524032253fda7d8b4757ce4e7d4fe4d9e3b6c3e937140f930ba9e311b38160d1332457ecd01fd2c67df EntropyInput = 44c52257803c224984f23ffa9417ebb186309634b0fd948a9fa069d233cdfd59 EntropyInputReseed = 99aa36ca2148b390fd5bd4a6bde52d1a0502ee2633eeb1ea0dd1225dc623e6db AdditionalInput1 = a34c8be4076e135b07150a28516a2c3a AdditionalInput2 = 6c4d44cbed39c2bf09267232e5f989c6 Out = 780f8a99d6719a656972df37000fc5ed0c514c29b1170ec55a2e8de76e0194879d80d4a3dace5bc31d7d011c8fc17e744df7c4741410704fe7708b5ea640b800 EntropyInput = bdceae46180d07f7a581c94b0d91d85b976ecd65091c9b17bbb6486b4a293351 EntropyInputReseed = 15bc3cfbafe7442936bb780c98b3a12d42b90976d6c8c575e8b2612697dd4d59 AdditionalInput1 = 3d99f5d6d3b4d9b98ff4688aeeb545ba AdditionalInput2 = 058a43ed9d1852de48910d5ec0f2da64 Out = 7b76eaae8b7ae31ac7fc4067a0b2b7e86eecfd951ce5e9e13a237a267a1db96bc247cfef9b233964508b302d0d325e5f620b9e7c08f6aa4bc0e5c5d69022220b EntropyInput = 0a4fb07966b36e583659edc71b61370f8d827b20d4de1bb0630b67d8d87b6d11 EntropyInputReseed = 08bf1846a3c91d5a28f57344e9a5c3b11882659f4d20b2c13bc9e96a50c03c29 AdditionalInput1 = 7e841fd11444f7ad7ee60953ff207b7e AdditionalInput2 = 420a562bebb4872d51a8b0e342197894 Out = 6437a0f47661b11f340796bb78b5016a61a8b2795fea0e1a669a1fb6a02b5e5225e83df280243d7d5f54727d56a55a275d9ed5939bc250919a396916cef8e0b5 EntropyInput = 0c04f83e4bdbd506738614e6b024060f511b8c9cfa5392d82e00447537191cc7 EntropyInputReseed = b72ca03d42083f46cce8d6597185a9145fe15689edda6cda567363464c643358 AdditionalInput1 = e4f77d67a03569338078b59a89dae593 AdditionalInput2 = e3888f6f82a5b2ed3f12fe1e53c7386c Out = e6b8b885a857e98e0def1126dfaaa654f34ec32d9c7417c81aaf8a9aa6213e4cbf8962147155146e6ee49e3130f0b5cc66e7699661f9150ed380b8fe1978575a EntropyInput = d3fbbc4611908fa8d880be5dccdad79409742a1161345a6ddf553278c58c4a6c EntropyInputReseed = 34c397ce79b45c4605aad652f5e6fe90166dd8f2a0e4698bf39162e2d632489e AdditionalInput1 = 2d51b98143561b70cdc15fcc5b56a222 AdditionalInput2 = 39e427807e0d2fea0e9ef6a71d1b3ca3 Out = 81cf95a0030f00aae715f2fd37d7691fe05ee435530abd8c43f89e113c2ad306c596451047b14127f950c42af5640ca18d24a898c0bd6172d708d3750c947e5b EntropyInput = fb8a522fb21b923879460acc2ea2de865f46faf2ac12c9579a9dc22f5d268a3e EntropyInputReseed = 8747be06c76a504fe7c9d23cc2d6837dd519d54b123b7f5fa4dcbf3d2331da03 AdditionalInput1 = 6856d58701a2beda014068818db45780 AdditionalInput2 = 4642017cd6e61cf6764288af3c70c5ee Out = 610ff2f79cf09c7ea66207957b77574a320c91a26719e431121cd4d93b472f2021b7461eac8fd6cf917e4da37a45e728b488f723ef393d15de51bbd1ca908c9a EntropyInput = 772e616eb2b876a5e3a4cb148dd88695d0419957b1767b004a5eaf4c4927f3b4 EntropyInputReseed = ecc4a344d2c4256d81b382293f71cf12aab1330f1088cfa61fa9ec235f818900 AdditionalInput1 = 2133d928ee950dce00f190c187f9c1dd AdditionalInput2 = 49153c0dfbdecc902e24ba511ba3d22d Out = 38372a6f65fcfddc510a99f2d51c43702f796fa4a1dab0b2f0a0cb82436d70efe10253ff6e38c8dea3c38ecc08d197b020d7ac57fc12c7150b65a783536e5014 EntropyInput = 946a5dd8c437c233efb44ea327eac846741ffb487ac9bcfc49468d69c26524d4 EntropyInputReseed = 820b7f1cbe9730c378740eaf03cefa535fe9071cb3acac10bb7ec1bcef042346 AdditionalInput1 = 2c2e72765402e28679caca88aea6a39e AdditionalInput2 = 4a20e2ff0684cc93861240dfe9df2e38 Out = 05e6bd717775eea8ba4871da85786df45183c2f1957d2e36a8a2230ab53778e94cde92edb86646be2d600a891a12715727037663b53bd38802b5e9408385cb8d EntropyInput = 4ebec81abc28a39f683eb9137065bec349c9616178993dbe987b70ce1015a134 EntropyInputReseed = f2422607b9c266408eb74c8ad21ac3be7d3d6e2ef498cedd63e30ba933efdd9e AdditionalInput1 = a822f49a68f5c98ab3afd1e7b27a9823 AdditionalInput2 = d28a7dd06e69845c0dd8267621b5c867 Out = 472aab0c6a53de0a4b7ce68720d7ef2766b7fe902633e09bb7cb4b056fbf6e2f251dd9486a0701fc9452f5dd2ffeb17eec04461361dfb5b0ae7ed919f0c177e8 EntropyInput = bac6fc3d796008ea765028652fbe516818d43f7935f63511842520441a3d9aac EntropyInputReseed = 9834830402d7d087841e624b54f936d2cc554c3b77f12fefcaef492eed243d38 AdditionalInput1 = c752b06e72d8f650e11ef9d556f613a4 AdditionalInput2 = b84347008e613050c864d2596250f5d4 Out = d9693147b1fcb434b68ca87bfd4b4791ac09dfc8a87448910157a1aa626f274b8aef568292a1c01982895c0310bd4597d2c5a6b1706116d7270866edc040d4d6 EntropyInput = a01393aa35eeb3522dba2dcbaca4c28f1de3fac2066ea00a37f34142e1993592 EntropyInputReseed = d2aca9b92f4483900da6ae2be81d8bd2ac2a2000016db48e5894acba30ee3dd3 AdditionalInput1 = 42025c459f59e5f9847efc6cc4da1db8 AdditionalInput2 = 7ebf89dcf9b491230edb26da11985137 Out = f91d97378ebd55c25f527c65da5138771245a38867ab105117cadf2291509e5ffbd3fdf36505e2fe78300106e5febbaa4b08b4d98ed693dbcbc496048aff6d68 EntropyInput = b2f2dd9263b1c1b4164c9f4ed4bea85c0397423c52efab1ebc84532df90b5f38 EntropyInputReseed = 95e073c4a143b680f144782fddf621944b7fe1a9e15191256d6467596cc7847b AdditionalInput1 = 53d2f2101fd5b09a602f07bf2a2b04a2 AdditionalInput2 = d52f100278121939d70f460a21dc218f Out = 92f3bf77ef6e6ca68bfda6581d791d059cc9d926df5356f032a96894bb9e3d37e82d40ac619bdce9f61532e878d5ef09e872b3cb9532c3d28792ea028f3a3a52 EntropyInput = ea3dfed2728c8818c62b2901b993bb64aa246f324f0bb003cad7d3ebcf8ad3e3 EntropyInputReseed = fb55d34c9ca100c4b5ab810953fe382beb639f233299beef53f0ba8edf24302d AdditionalInput1 = 465975974ca156cb55a127c393ae65ef AdditionalInput2 = 8fbd33f59b305e9991ae1ef5373395ca Out = 952770a8623fe7ffd9c3abbfcea3e1c43510e992e219aa0b087d3408112a521ecf3663c8cd60938b981c7568ad9000b07f895e7e197ab1d44f9a316c33e1d2dd EntropyInput = f38a98047fe48acfd2ee3da79263912cca4b9852e686bda3807045d3590eaaa2 EntropyInputReseed = d87fd98d35218eaeec667e0c79f77a5b5f38daed8cbbdde4468b71204631a5b3 AdditionalInput1 = b938b402dc3787d3330f0d961666ff4e AdditionalInput2 = a05d6789ac19c823dae0f53bb29fd39b Out = d7b5efc7f42d66d19e64c14eeb38d843b775bd7d836a12d8c2bef75623dfe3645cc0f2230b35c4ca708777681d062513847973d4547c8f3e5d41c7a60678995b EntropyInput = 11498ada4e77a9f6f9a185a42de81ec202a6246f6855d7eb9751185f338eafc0 EntropyInputReseed = 772565fea0634216ee2a12ccc3ba87e334d14d9769ea0a2f4548154e1fc677c1 AdditionalInput1 = 5c053b8a304fafac47faaa9eec3cd29d AdditionalInput2 = 14b24bee4e3104c917c8572dd44a3b46 Out = 4a8d639007c14d3a7c3be860e833fae793560cbb48a47780c26969d9e7979c9f9e684c5d0fe6851e1434d7ed53c53e96e148557067a49b0b97e64e6418c6185c EntropyInput = 2d00c48b41cee9286e34b8bf916f91de9dc2f1ec9c0c53b4c663eb3f05410f4e EntropyInputReseed = b2703d38b570d83e8decc5981e057dc7dda6d88c5719df1bca7ef6bd54385a89 AdditionalInput1 = ca8ffce1a2409694859347760c9cb9ff AdditionalInput2 = 31d0e14249c8ae9b356158b43fef10b7 Out = fbd40489e7245f230649db916311829f687d92d387e5b01826bc365692af0c7f249c0b04db81620dabc577794a1ae054ab24d0b2b8e64936e6c29ea134672ffb EntropyInput = 7fa36f65c91f4487bb7a765283746ef8e6d43d32f74121ee3c57c5e8e23b771d EntropyInputReseed = c53787ac53e5eedbba4a813fd1c218d90a8f69f49c6fcc19d079e0570247e13d AdditionalInput1 = 629657f04b2e4b2d86e3fbaff4698bfb AdditionalInput2 = 190cd249e568096e962d8ff32b22c0de Out = 91311f7f36c695aa13dd87f7c9a7209f062522e27cb04af88177e22b8e3728d88d395edd803c80f2d02cf95a25aceac7708f2c2d5b1490b2af65a26e54e85765 EntropyInput = 7295b42334884a41aed8fff9cc870020d71049219ee084a9cbc06bfe573b97f3 EntropyInputReseed = ad5f770233adb60e19fbdd46e24ef65fc5098f7f91983f280b2810360d5d4a22 AdditionalInput1 = b67d0c716aeda647c5aeb4aa4c1bebb4 AdditionalInput2 = fb9350866c2b34eae90e3a1e9cbb51c3 Out = 86b2265d200a34eb0be4f21c304c4ad1c4609d8ecc4b8a63da8c7fed3ead7fb93441a4050efb00b9b22d52ce59e409c06019198a9c3f32463eee24a01036cd74 EntropyInput = b8dcc441b4979af9b0c35e3cd065046632f83bc6de9ea575e1ec28b3d332abeb EntropyInputReseed = 66f92647479dc296e4a1784a086eaf0c263eaa805d8584608b625d147c577944 AdditionalInput1 = 9e663bfb63c5ca4395dad70ae5d7074a AdditionalInput2 = 19b648af3efc4fe33781c90a1bd24d25 Out = 918049db0049c744b75a403387c430f45c86c019f925c001481ec49069b2ef08e9657a8af26c80e227017b015679331a8708c4bd06bbea4774473e7460ba242b botan-2.4.0/src/tests/data/rng/hmac_drbg.vec000066400000000000000000036640431322470703100206740ustar00rootroot00000000000000 # HMAC_DRBG vectors derived from NIST CAVS file 14.3 # http://csrc.nist.gov/groups/STM/cavp/documents/drbg/drbgtestvectors.zip # Original file dated Tue Apr 02 15:32:12 2013 [SHA-1] EntropyInput = 79349BBF7CDDA5799557866621C913831146733ABF8C35C8 EntropyInputReseed = C7215B5B96C48E9B338C74E3E99DFEDF Out = C6A16AB8D420706F0F34AB7FEC5ADCA9D8CA3A133E159CA6AC43C6F8A2BE22834A4C0A0AFFB10D7194F1C1A5CF7322EC1AE0964ED4BF122746E087FDB5B3E91B3493D5BB98FAED49E85F130FC8A459B7 EntropyInput = EE57FC23600FB9029A9EC6C82E7B51E43E9721E4393EF9AD EntropyInputReseed = 841D276CA9519061D92D7DDFA6628CA3 Out = EE26A5C8EF08A1CA8F14154D67C88F5E7ED8219D931B9842AC0039F2145539F2142B44117A998C22F590F6C9B38B465B783ECFF13A7750201F7ECF1B8AB393604C73B2389336609AF3440CDE43298B84 EntropyInput = EBFDAD13C8F941D279DBB4DE8D7706DDFDAA279F5E4428D6 EntropyInputReseed = F785C5B2F833B69B09B71A57CF5701D4 Out = 66E35F9B8E05A861A0B3D01C66C416D5E8B77D4D21328C625CFF9163FFC92E753015AA9D7F36AE3A961681D39F271D0B627787868CEC3DEDC520ECB303F96A43CEC67369117AF268A19F5284880CB3BE EntropyInput = 4FC0EC777EC5A5F3B9EA06831A36ACBB9E9ADD057DBB73A8 EntropyInputReseed = 3367BA7C163F7B99A56AB64274EE64CD Out = 7910A801B68A20570AB0E593BD565021C8A543BA3942BD726021A7198F1D84C8806A6F9CC12D196E1CBFEBF325D0E1971746921B4D55483FC366D2CA837C4FC9751FADEA7B04C0A47D1E37649F7BEB6B EntropyInput = 85A41BAFAA923240DCF613A53E28D8535474E05FB59BA1EA EntropyInputReseed = CCB5E28B1F2493675CC4F63475A69B0D Out = 2735FB69BFCAC5B2F7F64E747C27D9957FC6A3CD0B3EEE984641B2677655606E6B0AD6C875C7BF1333AB1F9B15AB1D522968059F78EAA05A70437C6974EC8E29C8CA5A0EAE5464B32E9474E4FA5D4236 EntropyInput = B64416EA406772F955FBD7DA30C67F6A42E0B9A889D55454 EntropyInputReseed = E03A88205EAAFDD584DD54A40EA5C7DF Out = 44BC26482A49DA5249E8785A4E44D91CCDC6103FD666B480350EA3A09D8A8CF9E30C103F53559CBF55E13078B7C6949E4E90E1EF79DDD234166981F715B8649834C27B17BDF0F0689ED18EB850B43E85 EntropyInput = B3D4041201F4345E0A818DE136C6AA7E6B0612E1AC6B3F2F EntropyInputReseed = 26F6EC328AC7F8966DCA90E162C297EF Out = D9245A4A0AB0CA97E747C0D29098979E8248E53F0EC6B91678972F3B5691E7995AD2EB99640D3E9A8364891D0FF179732D633F762D6592A4D49C4E667C699B2678929C81D9BDFC74D6575F5B727F4D65 EntropyInput = 06DBF57699DF40FF67287EC11573B75B47E40E643C47F4DB EntropyInputReseed = 89BB41A3CB66446449B503B38A1E21FE Out = 0D06C663F9105198A34229B0E3FCFFD0DE9A445F4FC5D5BB58B55E43CACAF0C27C07E5A9C3734E8A8E0885DD78CD1BDE0777E3330D2FB3B04203F6C2749A45CB96BAFBA3BF9D1875DCBC46B6AF558228 EntropyInput = CC1CA95EADBD1BDB2459F44C6653C441F225685240438AFF EntropyInputReseed = 26A3447E8F504BE4C42BEEEFFD884455 Out = E8F3CBE8E1F8738B4FEF6AE67662524C99CEFDF7B416EAFC15750054FFD7C288AF1C13EE9A61D19F7163AA21F92207B66348228B56D64438AD7EEC55670860FDA3DA9BB0773F5647C2BD03378D795C71 EntropyInput = E68BBE5C6BB3A37207E6742DDB79C0B1640FCD3512909ACD EntropyInputReseed = 16AEA846C8DB1D76EDE51D5562F20639 Out = 5CFAD20546A1CC19922F0BE7B7D04BA7D8335684354541B1EC8CE0ADF3607446C8742D7737A566C92FCF3B2FDE205197E9AA95C739D677631E28403EAFED1CF45F22FE29D3979126EAAA46A4040A4C55 EntropyInput = AC79BE87BFBAB344797FA6DA775516BE0923DA6CA517407E EntropyInputReseed = 790D1E3CB052983146F9A757FA910CE7 Out = 5B4444CB58DF47502374FD6BDA064CF1D70D253B994F1A6E5D4E62741846472D9F1CF14A2468AAFD4CA7875B31987B8BA0DE9144648A82602C19E293F2668C9519BE3EB8A12F15543395348AA51697B2 EntropyInput = CDDC43355E651255DEDF171C9AA1334452E3E830CC4C2160 EntropyInputReseed = 5E927085657E7422B68BFFAB74D8F78E Out = E57F32E6A8A847F033802A92E6282C967EB18F3C9837B8BBE5F5E8D9D6FBC4D571412B873944D20BB8A354F787C3004D0B5DD5A92BDBAB600F55D1CCC52275715DF239A1E2A79040862680F34F5CD4F1 EntropyInput = EB1A31C96683124985C9B412D16DD899D5DA8C43273B3173 EntropyInputReseed = 417CA1A9392265B273221BBE87831466 Out = 59E4D915349514F4AACE3D9EEBFD30B58E8246C7DCE23BD4C4E47BB9AC8C2696441D5B5BB2FBB2A1B585373EC5EE55071F2EA868B2DF342B5F2DF48CD026DDAC9114F9142DB999FBCDE7A0C23403FB37 EntropyInput = 6A086E671327087DDE91396DD73D5400D59A4FC5B26C0558 EntropyInputReseed = B7D5321E4F22584409B7E6E014E7D062 Out = 70E17CA71AD75E40ED31629CAE3FA9C23374F78E020C56E551907F2252706BD4CD4C47D099DBC072429AE53E34ED208FDAE5E6EC13E5CD9B435C1B25DCBD099132570491E7C3544CF8FF2FBA553C197D EntropyInput = 8B7086EFAC1E3C3C87C3798471D4AFD028B8BAB0217D403F EntropyInputReseed = B61206715D219A93505B62CD619BE51B Out = 0DCD502C6E884A366B50F208A1B8C59FFB85DBCD72A6E2D75AEA94C9692A55A45FA7C2900A277DCD38B79CF463AC8961FE54DF47BCFE5A60555EE4EA2BE76FAEFEDAE3CE65DB4B3F04301CF5C43ADA43 EntropyInput = 7D7052A776FD2FB3D7191F733304EE8BBE4A0CEEDCA80207 EntropyInputReseed = 49047E879D610955EED916E4060E00C9FD8BB33AAB2F6CDFBC541811861D518D AdditionalInput1 = 99AFE347540461DDF6ABEB491E0715B4 AdditionalInput2 = 02F773482DD7AE66F76E381598A64EF0 Out = A736343844FC92511391DB0ADDD9064DBEE24C8976AA259A9E3B6368AA6DE4C9BF3A0EFFCDA9CB0E9DC33652AB58ECB7650ED80467F76A849FB1CFC1ED0A09F7155086064DB324B1E124F3FC9E614FCB EntropyInput = 29C62AFA3C52208A3FDECB43FA613F156C9EB59AC3C2D48B EntropyInputReseed = BD87BE99D184165412314140D4027141433DDAF259D14BCF897630CCAA27338C AdditionalInput1 = 141146D404F284C2D02B6A10156E3382 AdditionalInput2 = EDC343DBFFE71AB4114AC3639D445B65 Out = 8C730F0526694D5A9A45DBAB057A1975357D65AFD3EFF303320BD14061F9AD38759102B6C60116F6DB7A6E8E7AB94C05500B4D1E357DF8E957AC8937B05FB3D080A0F90674D44DE1BD6F94D295C4519D EntropyInput = 0C0D1C0328A384E697678AC87303DD62C8780B4AC33F1867 EntropyInputReseed = 4EA4DCE5B190D4E381EB7A5B5E12B4F10557BC052AA8EABAB0BAA42CA38FBBE9 AdditionalInput1 = 985865C180E0BFB7CDBED11B58B5E509 AdditionalInput2 = F40452F8C5B8F4CBC1675F70BB803740 Out = 4A1F442EAE6C861B622014B079DFD47543176B82BC60826CFA02D3923EF0563F8DEBA8362C8D1950A70E80D67189FB4D904B855ED0AC39942AA8673E0951B4876354B849A6C1C51D0C35A3F4ED4E2F22 EntropyInput = 7CAD65E5CC2888AE4E960F5D143C1425FC0785DB471CC55E EntropyInputReseed = 66451D29CF65D899A281905FF9B29E87800D583B2560D2A2300132EE2D13F19F AdditionalInput1 = 42EAE705C2225D212FA0554AC6AC564B AdditionalInput2 = 72081E7E70200F1982C3AD9CB1D3DDBE Out = 953E92258BE7FF61B97077252AB9835231E366DFA5B635FB889C337562A2641D3AA9E46FEEB2A4EA03CB73F1F801594C3CC71D2945C11A52BB0E93419DF5D0854AD5F2E36D223C119E145CAD507495A7 EntropyInput = 3084C8811564168BF7834D9A6C9D0AD0821B13A0B66DDDC5 EntropyInputReseed = EC2C90278236C08B6F657611A16636D79A7665B3883BED37A48B07F98EFA4B8B AdditionalInput1 = 28BFE9605BA856073EE69145CCDDA4E0 AdditionalInput2 = C26D7C962574AA587B3EB7A8C29B2E08 Out = 36908ADEE4C1E7EA4E2F266B65AA7D7B5113E4B4377ADADF4406BC573E04374A7E8B9B9B36EB0384E9336A9E7B4F308B463BD7AA9476154AB13181DA5C2DA9675A376B9C82ACE5391E378FDD0CD4EF28 EntropyInput = A0410A32703720ABF2E28E252B5B9176CB96935082BC9EF4 EntropyInputReseed = CA7BCAB78FCE7DA97B0158379041BD6CB70982AF7B5E337CFE989703BFFC09E9 AdditionalInput1 = 8DF8B08F648518F7526C24BB95DF1E44 AdditionalInput2 = 6775865F451EE055ED2242076DEBE237 Out = 548F66F0ACD9ED887CEB7F95D1C9A0C29E2F6007B92C581E615139256BEA63D0FCD7A9B950E3E89419D2142C5D8F5BBCC2BA5B0DD67689B7ADE01D984E303A529165DBDD140EDD69C3EC6A4DDD63E091 EntropyInput = C2E9A6E2E29F47DEE0E808660C446A4FAFF465073A97862C EntropyInputReseed = 2AB6787095E944C5276D29BBBBD7A777358FFEAB6A24F932ABD4C9577F84CB13 AdditionalInput1 = 37578C2D9B68D43D6C83164A4C43CE37 AdditionalInput2 = 02A7C9575D9527A33DF9FB566373DB3A Out = FCD318C83563F72E5A21D4A93A84254E0C3BB6D3DED55C3D5939DBD5D1525062FD587A422012437AEB88589E669E5A5D57F7EBB16E30590F6DEBD0ECED84F8E57D47A3D123A52361145A8FAB258ED19B EntropyInput = C93859E7FED1163B070BBEFCF5FFB0A66A6F5B986116ADBD EntropyInputReseed = 959D37EA3B79A197449169BB01E0143DC62840816AE06EB725BE9DD3E2954CD5 AdditionalInput1 = 5DC60578A6A309FAE33EBF162C22FAB4 AdditionalInput2 = 00D0FAC12A9B66B7EA936411F1645D4B Out = CA2EB212B29D5A38CF72409CD8CB4BC401EACBC6E59C84551CDFA12C1C8FB39C29C9D49905B25953F727AC24453CCF1C6F20A4C3FA7C33B052E4E82C7FCBAB70ADE865D249B6A27E0B5EDDCCF0567D6D EntropyInput = 237A566E4A46994FB13AF5B2D4321A03FDF5CC54F461DAF3 EntropyInputReseed = 0949F86B7B223FC341DDBE525C533339BC252901F8F5C9357722A424B0AF1BB1 AdditionalInput1 = 6020D93DF16B10C31D8802F6BB9DDFAC AdditionalInput2 = F9104117190D905A30C65C0A76148C7A Out = 70E0611F1CF70BA93E3CC53DA83FC3D6064B293E90C117EC12CC79C5E4EDF845B6A5E2C4CE75FFCE5D18A75E24BF51300BAE6443F04A71047A8F522EDB370689EF1B2CC13769865B69DC232963D90419 EntropyInput = 80C2B6FBD576CD57C38D1D1197B9E7AD43216111A1EC8B5F EntropyInputReseed = 31DFC1A4E05C15ED96288386D07689511AF215D9B991E4F7DDC2A89FE23388A1 AdditionalInput1 = D889E43410EEB2A83CB6982F38077756 AdditionalInput2 = C77E7BB93115C10A56DB1245E610E8B6 Out = AF9F8C34654F44F42914070DCF1E971884902B428C7332913DDF2E342E776E01DC2FC73CD803B3A492EDB15E7CC755BABC23D8A5007BB0BEBD7F02BD168D055948E6A5B66A3016951697617EAAD371A8 EntropyInput = D8041E31215F7C843EFFAEC3AB722E1D271753ACF2EC9ACE EntropyInputReseed = 8B5730E21C0C30F9DAA98580695C4572347FC86229E2E6F6AF2EAD186248C2F9 AdditionalInput1 = A09C1B813FD11102DF392D116F127DE1 AdditionalInput2 = 0AB6C5C7F689BDA8A3A7F406BF6DF33D Out = E09414C8F5FF2D8D6B6523729556DC1B4BBA6E4CFC7A929E4561CFD32E5484918C7F21E0B533C3E3827BB8E115CC6A2AA5DEF3D946001564EDA8CB36FA5AA771651E4837AE60BEBA32E01F5D59C0BE0C EntropyInput = B0F69A20531C5B186BF8C16B25FA1DE8D6817BA362A9A00E EntropyInputReseed = A3AA59B018B7CE8648B7F84AB925050F2905E4B0803D221CCFBA43BB4F1E3338 AdditionalInput1 = 0460C4BA1738DD7C662E0F4337A454C5 AdditionalInput2 = B5A7870DC99F5C2EAD93DAE773AB55C6 Out = A542A3BA51F4024D3876A32FD6FDAA136C024FF36B9662ED82CF580BB1D33B531B124C0E28FD0B8EC06E50DCC11132062A55BDB961A908688DDCCDA12BE8F1242F8A5ADA53939E32D8C0381250134686 EntropyInput = 188AE42FBE0F4E9E17C7B0432712AAEFB1667157132F8D62 EntropyInputReseed = 40FD9D19BA9F5F56F58BD08E9842E2A188560712277F73D457F62B3769189381 AdditionalInput1 = 892957BFBACC684AF6D31C8BEFCA8E4D AdditionalInput2 = A9E8986FF89479FA506780B07B09C2C9 Out = E77187930AC661BD1A422E29CAE4C67370D9E8AB0E44EA9DD86B11B2A1C5271162513587ED02DF4C91B0E04158406763E72A443A196B6A2E22AF72EF2732E3916CABF518FA58AB89FEA5528153818A6C EntropyInput = AD490819BBB9E937E0D0A749EB83465470FE146AD9F3AE0B EntropyInputReseed = 104810BBB28773E538B466319BEF5D6AE01882C8B9BC52D584274912D93367E8 AdditionalInput1 = 20A03700499444028DA4C8FC5BA42D8F AdditionalInput2 = 6574BE269D5CCB5D10AD5FD6ADD77E2D Out = 5662845711B5A6C04715DCB3293F091709D87703F1A449858F074858958260CCD833D9699FCD0BCBA7956F9036808984828A3A9DB2041556C77B1644A7566BD8892ED53E418CB74BCA1A8D65F545C3E1 EntropyInput = AA4EA001160441917AC60F6231468F7DA993E136DCCE8208 EntropyInputReseed = 3CC6C81B69E67EAD392721EA79B63E9750F89606E793786A14ED11B3026313CE AdditionalInput1 = 2445D7B670FD77BB62E0C1DB75671863 AdditionalInput2 = 32B79488B44093EE7FDB4441BC302B70 Out = 1B803314C8ED124BF6550BC63BABF09F189E59DF3D8D4103567C442B6783C32B236A107D4ACCD7AB3E465D29F6216349BAA298EBEAFD3C5CC198F0880868B8C9B67D94FD53626651200F5DFC939D4128 EntropyInput = 11C0A7E1472CEC70FA8C1CA15759AC5BB1C73C22DB39CD7BB24E392CB1F3C18AF2CB50FEAC733E32 EntropyInputReseed = C6AB59FF708A5C1F598E75DF060E1981 Out = 070E603CD48D56430A5AB461A751EC2A4A6AA6FB6EE52EFE9A41E4611EAFDFC957184B47BBB017E484AC34C7DE56CD7813FEB301B5BEFCE573AD0A254E6CFE35B77C30BE6B7CB5E7EFA72813C7546BA5 EntropyInput = E05141ADB678C297EEBD8136885B67345B9C0C54A0FF74D84814EA71A8E11845716B22085CC65F2B EntropyInputReseed = 26E26C9323A3DA3AF6E5A5A1F351CB54 Out = 5EF29A2E7E821D529D1928E6BAB16FB80D6491A98DD53695473DADEAD4E5142C146F1E29B101C6B1A57D8315CE34DB17040C02572C6455D902303DCFCB2AD3052166DE790CE0C94AF78A51864EFD4B12 EntropyInput = 9747F5A2A27C65B0BD9202F0743AFBFD247B3B05FCE7D31CC3FC8430972DFA880E2BFA66862BFFDE EntropyInputReseed = D3E34742CFFE1C6D55F8F98DFC57953C Out = 92137EBF7518354BD65D87235A81C79E13CB53E46B47FA091CFE342F0253E5EE4634E8FE5FCB967BFCDBDFAA60614BF96826875608C0F1B55967619DB6DF24EFEDC86498CAD733E29EE9D9E3D6277273 EntropyInput = A9A8A0A7B8A58C239E083FA1CD2A8C968CFC5F074BBC31473FB4C2F37714039A1A2E6C68E4818EEE EntropyInputReseed = 3CB71F26B82CDAE4223FA32702F57EE3 Out = 1B5986CCDBAC7DA7FE7E792DDD445CA894B6EC08424A17FED5385FF8BD03BA782B42BC5A9676ACD5BE8061D535930A487902923148710FF17908FCB03DB7DDC0E4B10BE16C0A0365DB387529A2398552 EntropyInput = 99D1822BC16F2E7BBEB6556C5215489EA6039F54A175AE86E80FA03BD7C8F5ACDDA5754EF00CDB5C EntropyInputReseed = AAF4CEF7D80FFEDC37E3C68C7DE03DDD Out = 2236568252A384A7E75CEFBA04A94381941035B28DE764D5B2518A98BA4E8F1D50E8230953DF40DB602B8959EE8F1B8831B29516F937AAF561679BAC0FFB11207030EF33B26DA28AF93BA552C08BFF97 EntropyInput = 305A4478BB85B0CDCB99618D8753494BEEE617D70AEC2650C3FA490A01511E8410577021A307C31B EntropyInputReseed = 1EEF2F751CAD0B1CDE509806D4064422 Out = F23CEADB881B945029B78366A173C20AF93E43FD8C3BE0588F811AF31A7DDD653610CDFC3CD875A0F114FC1B887E4FE5042EB0DC0C36746961B1B7126950AFF4C01245C215156715C7EFD14C76539A0D EntropyInput = 15C178375C839866AB31B38B900BA889325BAF19B84C8FADA4D50496711DCABDE8E0FF21D3DA7535 EntropyInputReseed = F2F78DA359AF10DA64C42130F79F3054 Out = 3F38257370353677DEE9127862305158B1C5B607741D62906CEBF8BABEE4FC6CF1DEE3F821D1D750C69F3FF5683D266DF0A669D291F6816D86CD222B56A351C240AFBB443E886CA194994B4DEDDC54BB EntropyInput = 7EFB63ED1E07CF853FCE80468049DD5ED5E55A8B58BBDD32D89028D21CEE2B223D634A9927EC036B EntropyInputReseed = 341F137867C451D8D4E327733DE89C94 Out = 477A1612C19B1C2FEE232385CCDB5B2F32C845C07FA216EE410CCA20245239D3220AC48770017C4D52F99A267D53E0ACDF69E8F4BD1D76D463E9BDDDC16BEF7FAF9D9BAA9B9DE3D397D740D685C158A0 EntropyInput = C7209755B92BFF93A059DB79883B2866B51BAE337AEEC9E534AEE961ECCF0B92B833F2448720BDC9 EntropyInputReseed = 8C87E68DE33545FA20870E5E70A190F6 Out = 285692468053547638E65DFB7C8B69AAC43E16BE5A4CE9898AE0D0C8F567DC27945EF6E21F36D456CA248577829B90F96A887F96E9C2A6FF2616E21C7EC93093D68F60D2CB99F2C7632F856E33EA8FF4 EntropyInput = 1CEECEBBC42F9EA1FAF7494076F7937BA827B4666D0433ECB431A36C996CCDB5E936DA7EBD216C20 EntropyInputReseed = C028EE75D4F55DE2B223E92625E399AD Out = 64D4BACDF185DD8F6EBA35DC8F79FA2CAB155113E020D1F12B32BBC4BFB9C85881692A5D8933A40D9FE8F6629F74BBA8A99E8DB0228A13C8D7776459F73DBA8E59E9820AE72F8C425AC3044079C1EBFC EntropyInput = D5B264CEC1C7ACD78B902DC14A457D30B79ACD3E06A12F5712E4101D6D4505CD43710B05D52A9194 EntropyInputReseed = CF0C3E1B8FB1BEFB5ABB9AF1F58CC9EE Out = B53D3BBF4A9561904AD9E100B2601DB2660F415FC5CAEBBB1A628B7095E6DE4A3895AC5DA6F2C1E1C6655D76FA5B8F75F52DE41564D79B09C9D2C76C1C486F462A7164ECD76F0DFA7B5F53C0C25B7730 EntropyInput = F440671BCBBB1BDAFB22C06482FF670374CDBD69535D07988A69144EBECA59C330C9A4E0E644A7AB EntropyInputReseed = 0F43CFAF10AAD2453D884CE5852DBB32 Out = A5B42447F4D02504536DF9E0CA8D98642A21B64A6B84BDE4B2BC186C28B0F740EBDF2D60C664D4D89A867207BB8D4C62F1745CB3C971B4B2622423A4291E1CC97FCE7128E3ECB3EC13CE08987F59B77C EntropyInput = BEF3995F0D2B1051554CF7B3235809FCD2989CAFBAD08163E807CFC52494119188F86BFEA878F2CD EntropyInputReseed = 0C538A7BA0695FFD95F3ABEABF2A867D Out = 527BCA6B945DB8F2CDA7F795763EB5767CFA1A4195A9D9AE70DD8129158138E687A056B64F00D29E11C37A9740D19FBD16429CE4DAE79029018B984A22C1A2B2B988558B133651234B35F21FF42EDCB2 EntropyInput = 5FC1CEA988ADF1F7C090B14370CE169300A008A687475C467FED039D998BBFA3AD62AAB86C176D6A EntropyInputReseed = 4EAB4611CBF3EA5583A967EF0C0EE2E7 Out = F096F7F631882F5E5A6E708D71534C19EEA20A57FC210155D49FE9B872B18CC04A73CB652A03ECFA0C6DFBC174811EFD0897F4BD92C916A5C835BDFB5E126048F7C17DAF00A845FF024641499047097D EntropyInput = 9C88099AF48F9053ABEC455B7BBB015364FD593A0F40175D79E501B77F967A676FE398EB7C81CDDE EntropyInputReseed = 9D7B6301D86B259606FBCA7DE73CE63A Out = E8D53BD119D23CC57245A8B9B2D111811DC661555E389180E367E41F8C815AB4E7AAF5A238479117402BA17EA41C1104F475E11BB97CDC414409AC516B3B28B62F284C7D4093975279D3C31320C61061 EntropyInput = 03E7B41C95818EB0B667BFA8A175A82466A1E417A9B6B92F126DDED5EB0BC81BE37C10BCD9D5F793 EntropyInputReseed = D17E98C2E50EE0DB00D25C3364451E95DC596D188E2343802240BC7F5CC60516 AdditionalInput1 = 14C8EC10F5BDDE6B9E75898D7F9F03D0 AdditionalInput2 = 31AA842AFCC1DAA94098241A87D6DDFC Out = 4739B1BCF87404A2290829BD7A61F0B391A794C71C055C7CC513B28DCB5FDC88645BC9CB490F41FAB134C6B33CE9336571762754343961DE671B02A47960B4B4E23C5BFB87DCC19B260B3BCB921AE325 EntropyInput = 5810043CA63EF5E573E118ABD09D5E9CAA873D3A2A2A1C7E0EF00FE3E9126BC53DD61B8D2CB9A2A4 EntropyInputReseed = B574167BAB56E4D1AB5C1725421BE3AA4E19F01001D1F550CE0DD0BD4CD3E216 AdditionalInput1 = 684183426FB6D102F8E2CE55C599B740 AdditionalInput2 = 1A80710E25C78CAFB81CC119ADB0A2F9 Out = EB4C7059612D0AB63C0F28CEB7B8F89760C3D2B508F98441412BBE0AC133CAFA7E2981AC2750272EBE503622B477C67E86930C9198FE21F7288394B2E11A5302E3DB03B59780C49907EF720199EA1362 EntropyInput = C27D1ABC5AFD30A3025D42BF9EFEB8A6F2608470DB9A90F8804004607012ED7B40FF0AD8F5CA085C EntropyInputReseed = EC4AD2A126B799402EC8A1F210D708D1EB2393DF0BE0FF471D354343C43BF2EA AdditionalInput1 = 92618320CACE6C075DCD69A634E76666 AdditionalInput2 = DA54736DF5D2E0DAEF664E905864CC1B Out = EEFF317050AA3BDA57BDFEF2D46408B3FB2E64D34D4696254C9D8A09FA1B325BB3E3A973EFE7918EB03489865F5E13E9A28A0BBB43822B9CA3B209CCAA1CD5BFA5139FE59E16248E1F468F944A0228CD EntropyInput = 3F34680939BA128C07C5DC5AA161A8703A45440CA68C8D5CE423DD11CF92C537509499EB891EF5F3 EntropyInputReseed = 2B706E7AF101AE4A669B46DFA262ADA2CD32C88C56858CC5F6D39199ABAF4543 AdditionalInput1 = 2B24BC6DB1ECE7A32CFE57DF3F6FF74C AdditionalInput2 = 3C6DC6FB353CE7E131F8D09635465D2B Out = 9DCE0B5B3C8201C98F54501AFCE1595EAAA6E3E6B89ABB6F6112B5BD5D1FCF549BD13E51FEE87F0AAB345571CFE7D7B61069660BD8CB8EA33406B6026BA28D02457E2BD3ECBE836829A4D91481FC0F75 EntropyInput = 94B31B718BC40B28CC5A67EA5E891C14E1683D0E243C48685DD27AB3EA94AC5C04F4F8C13C767354 EntropyInputReseed = DB7A613BEADF1433550003DCEDBD227CFE1FBAABE7A2BDF4FFDCFAC0E7E214E4 AdditionalInput1 = D71D9F2A6887681BEF91F5C1AACA50B8 AdditionalInput2 = 06CFC99087437AB7754C5D626BA07083 Out = 4186F2A9518371D123473A4C96D23A44C89AF9BAFE17EB2EA702902B5A955A42B05188B8DAF7EC7BAEE352B365F46A3B880810AF5C9678DF5503B5E2CF9D02897BE81E409145C0CDBFB83949EF327F4F EntropyInput = 6B90E0E1496DE9735239AB6EC28766669C65E1A4BC0F5C0499455A5DF2B13410DCB912F37C266093 EntropyInputReseed = E446388A90D86A1F060AD436666204FAA47F245FA6F0D928C17ED8956D1535A6 AdditionalInput1 = A88CDBF82362F1A2EA78EF5BBCBEC7F2 AdditionalInput2 = EB8DA8A49C4917D71DF7FACD8E9399C4 Out = 99B09A0BF4D00539F7C1F3C28B60CD86B47A33961DA7A649E810A97C1388BBD712C6EB0F7DF4B68CCCC01B25DEFBEC42B67F4A341C0460E7B20AB67ABB34CC2A3CE5B5D7D06A186F48D95A7607BA0510 EntropyInput = 05474CF1BFA15E12BBEA7CFA9852D152EA29F8442291C64A70D00E37A88B30C450580EAED5D4D60B EntropyInputReseed = 8C9DDA22CA653F755D5A5F128972D4A5651F8AD6D3ED2BF04262DC79ECF164A3 AdditionalInput1 = 3E693DDF993D63CD4C9D464F2C84C8A1 AdditionalInput2 = 53DB0C0C12363BAB7B1ED57D420998AC Out = 590E747956E6D01EADD1C9B7B1387BFB5C20693DAC84F70E2C2931459B3CA9534325D84EEEF1B245D17B8CD059E05A3BF998FFB517FEBA0B047553633DAD642E8CCE5C4B7110BF57AA6416EDD204F780 EntropyInput = 7E9A4732F5841617395EE04ADE213B80785D2E4FEF267D510E725F5E2E3F5B9CB5EC36C4A4F99E0A EntropyInputReseed = FE13973B675BFAC30716D753CF2F623202592AB8E4E2096733E6B300EAC278CA AdditionalInput1 = 2F3F8E2504BFE008AA1FEE1150B47F05 AdditionalInput2 = 2491177E84E06C3C6B48235B29C316C4 Out = CA50DA0839DE54BD9FEC1A4B1D6EDBA1E68B47970ADC36FBF88E7757AF6962D9B8EAD266F8AAD696F920A1BFC702D8CA43C4504CFA42D7A603A55FA524C62FE49E698F21EDA7025C9B840EC1B9795066 EntropyInput = FC16D69DF6254A9B7743CA43A64E9D1F5986D771B6CB069A82FDBA5FB4C04BD550EB5A8E2E4B0A31 EntropyInputReseed = 65484FB4311A80479A4D00A42CE16CD6998B27A8E314B99B4CA06593BF9D4A17 AdditionalInput1 = B97706D6068CBF8DF35B28A2BCBA3B55 AdditionalInput2 = C24E22CF478A61F1ADF5BEECE947E16A Out = 29573D54E80E43625024D149E6EA55CCE5728BB456E86B75175D38AD95AEB4AE5C47270AE774374CA44E2230C5D1861FF954F9FD432A5E8367ABE49A88ED8EDA504B991747EA9C4CF448BA504CB7DE14 EntropyInput = E917537E534F9433E40F8271A799F859524CE9BB84A53CAA682088F3CE89EE635F5C8EC25EA8C8C8 EntropyInputReseed = F9EEA9984D8EBFF701EB7C5F627074BF085A9D20A2D017C4D3E57D20CBA52714 AdditionalInput1 = B07122C8EEB299295858A2FD1D3B6098 AdditionalInput2 = 1637261B4B3E7761B5923048A46D1EB0 Out = BE40786139AA3966FCB85198D861F5239CBF8886AE8E814571217DD4454C8646C4C8428558EE3D80C5297ADD64D6D1A991C4FDCD72CF42F82D73A89B8BD2364CD119821B1BF54F69ACD01A7586C53925 EntropyInput = 85ED8611AC58AF2D6B878EBCA74256D3F2F20A7A4F174822F2612085C5D8338C9B77B9B1EB8092AF EntropyInputReseed = DE6EA8D0CD0BDF18D395785F0797D371F414629FE7AE0A21B211E09FB66512B9 AdditionalInput1 = B943191D1882A390032339BDEFD19351 AdditionalInput2 = 4ADAC9816998CB105D1C4F7CD3D53764 Out = DD79426F61E81D86561A98853B7E187EFF7DB3E8958944CC10A74E7B12DB3B08BB4436BF64694C5B8BF1857E791AE7194554AEF6B48D2B33AD6854BD2E9771BBEA3E08C2C083A82CB07D7242CE22DB2D EntropyInput = 6652B1C0403EF16416DB88E49456119115D3901CD7DCE343A580613DA8FF7B06580DB9A42BC0CDBB EntropyInputReseed = C718324222094C25D85C33857DAF5B28923014039CD117F924900CD330607D0D AdditionalInput1 = 8B42F93D2CCDFEA272F7A03BF37B831D AdditionalInput2 = 28CE97668D6CC92DA8EE25077CB25DE9 Out = D31DD59237B3C8B2885838840261727AC116BAE673B554FE9C8B0C64B1573A25BC4A14C1942D80563FB4165C57E1AEF5C94C1F6B1F88EC6BB2BBC10CCD8149D175E4965D07341ABA06A9426DF0D0FEE3 EntropyInput = F297186AAB4F63F6FB85C4F29D659D6E48FAB200424D67DD9414F702FD050F7EDB9A648CD833F8C9 EntropyInputReseed = 52FCACFE725AD65C0A47DE25690C0AC591D5EB7962EC1051004041F5D23FFC34 AdditionalInput1 = 94AFC7023650C2EDCD8C957E320B04F0 AdditionalInput2 = B6B79DF82780297261E00EF05389B693 Out = EBBDDE904350C6D803FE258A3AA7A63622F2E9540F03B1CF687E20EF35FC5BA6B616254710CD4515EAF69ABFBA0BA778B87E4CE1F9F1FEF34402C6E8D23EFBDEB7DA53A3DB733E69527D36F24000251C EntropyInput = 90899D2DA97759CC609F956F5F391A0EDBB422F45AFA0C7223261C0E7226D749A0D7D0166E92DAE9 EntropyInputReseed = 74A2EF5DA636FEC70C6D926B2670B88D8EA2E411827C5D8B54B24DA8AB41A841 AdditionalInput1 = B9EE1C9923240523E7E4745EF93581BB AdditionalInput2 = BB0F785972CF68222A5EFF4C7DD3E28E Out = 2AF35B1FBA0C62AAE991C12D50C86CE2CC633224B158B157459C41A5444072E918B4C777BFC84F8000AA238A46C5D5258057866F2484971D2708C33497191A2686F8EE9E3657616E00DFCA61E0FFB8FF EntropyInput = 4E8227E8422D674CDB79E52CC30B7B84F81CC05B033397042D6E4AF02ACAF230BF746157EC624BA7 EntropyInputReseed = DBA3E731FC81949E679A4257C5FD68A7DEEBB368A79C1788528B589056B1194B AdditionalInput1 = 1DBBC7A131E98344FD748EDC6FEC11A0 AdditionalInput2 = 0266E8A066DCABAF6991C7A91E1C6E56 Out = E51FC833A60B099E56996A66820368F5332822C8F9DFFE8459C80D2512D451E1669ECF6E562A1C295FA6981FA651FDD3D8D936C18F88D5844393A2A371AAAC8F485CFE92926F1A54980500EDC43A0A6C EntropyInput = E5A81357B91215DDA0A0986A3FF5123F9C1838D7360E674B EntropyInputReseed = 592DD232AC83DB36ABBACFB8C640DC60 Out = A4D1843C7AF208F770F8B5ACF64528866D51E731ED5EBC756E81EFE8FB8F9C9AF89D52E8E8D1C0141EBEBC18B1CA78C78A2F21CB909D5BAC3B6AE60C4A2FF4176B14905E4AFA3BA9E458216D5720CE83 EntropyInput = 2F5DF23B8338B1B40B476E4758D1FA39AB19E417FB1607B5 EntropyInputReseed = 175898F53639DFA817305482F003BECF Out = 1E44F245BCE399FC30A2A29A952D6BFC89CC26C82E325B1D3EC1133A0F8E4A1027C8208C61E58F46162305F484176E5A4541BCA6EE3A1EEEF4D96312F4FD23488E31B77AC58C783C5C3849E13CF01D17 EntropyInput = A03184846AD2744A86E3186E9005A5AA87199BAA227803FE EntropyInputReseed = 4C8FC950C0C4045F2F394D41627B7CE1 Out = 49BCE54959D1847F45D0E0B965813B1420E1B7A0DE7378AF217C9225BD67425F5251C263331F4CCB8E0ACCAFDED69951BE2614A2EE2DED3CBC1F8FDB37E48152EC25EDD6980058C9B72B4F651C00D04E EntropyInput = D1E8577C5356395741AB6F96E26B6484F2184594297E2CF0 EntropyInputReseed = 23BC40BE283CE1C5406A554B2E224DB8 Out = DD4B16F5770F33778ADC7043E64F4CA8C7729D91C96D4266E036778D377AE5497211CAEC0B9ADB24CB5BF6BD266ECC191894F70E697F57A054192FC76898CF4E323F3CDBFCCA2E351DB6031786F8FD1C EntropyInput = 1499F31AF6735411327DE83D8CEBD2D22BB3646D8FECDEF6 EntropyInputReseed = 0F53FFE7C027B6FE143A2D527B8780AC Out = 8E7F8B7E3653A5410C8E37D03B1C3A4FA7066AB51CC3298B18A8EBA2BF49CD78BCDA77C5E042BEED6A36445E058FE9856F1A953A4888A14410134CBC1D9A28688ACC75FA9422F1447284293695BD9D26 EntropyInput = EE05558BE77FAF5CE39AA4B17F7A3DE5BEA82A9E7DCE2B3F EntropyInputReseed = F9103F7739538BBA0CD4CF78988C42D9 Out = F4E5A66A8F35B9FED2AF5566A2BD0714E2488D4D51B2176FBB9F5B17FC16E7F0C82E4C079A166E8B6DB302632AAE216637D77D27619FB0DF312FEDD2C9D6B798CB4931C36F519050D5F9F588C3786BE2 EntropyInput = B778083612CC9B138F68176B687B39C06C616696AC63A626 EntropyInputReseed = 0CDE2F7E5D2F730B4141FBC32324751A Out = 8A4F1C07222B146760310E7699918DFBC6BD68165DD520ED18BDA82CE68A80134519C42AA2EE56EEA32C35DEE503315BAC9946FBB57421F71FAAC4CDFE3C74764B1EEF803329CECE0F42AC248878F767 EntropyInput = 281652F1752CA6B9BF04532F02D6EA1D54644CEE4BD06620 EntropyInputReseed = 944BE831A92A895949B42D9507BA7B18 Out = BB741E2C54E0C3D0AEABF2D4300429694E5B14BD2ABD7087E38AE26B2EFBAF427BB79EDCC825E358CC91BBBD1C6B0BFCEDF5F951AFA7B73F20C193B2DEFE52E75684D41560B82F47E9B47BF32C392E1F EntropyInput = 366FD25D39D1F4D1D35F69C41D113809C8B3E21A9DC22FCD EntropyInputReseed = 772D88285A156B364FB9677BE95AF200 Out = 382EB32AD8864E811BB28731F5B3ACC21832AC84BE4DC0003557FDF237332586072B780AC86BE7A7B9F7AE278291A7698EC9B2343AFD80860CB69BBDDF4D1FBFD901840F965EB4931ED3F05CAB9D8877 EntropyInput = 4A2CF89689F6F1608A25F14FF6870EDE65A620EEBC68C16B EntropyInputReseed = F766C57E979253A15768D5DFACAFFC0B Out = 44C375BD8C2EA870A927CE74EA863E9FB8A7E4E79ECE537941DCC1AAC4C648031DD654A72870771D39C1FF52449D51902C76F7D1C9A6E61BAE2E19636D41152A255A18C8AFDBEC3388AAD82F5E3962A0 EntropyInput = 0C4ABD470AF4C5921F54CBC663E40E0063A754C6A17757D9 EntropyInputReseed = 35EEAECF5F0FEE430ED54572E0AE295B Out = CB876A0B999147CD1C6C94FF91C3E279A5417CE28D5669C9AD852472B718DCDDCAC036ED94111EBBA1CD8CAEB65369354AB9B43979F757050ACF871EBDC3B0489596ABA2ABAF9C5EDCE16BDA1335F006 EntropyInput = CB35A9A6BBEF1FA526FEA0F15ACE5EA2EC6D18570FDCE92D EntropyInputReseed = 66100E61C908BA5457B1366C7C84FC90 Out = 8B64D0ACA599D93B82E0527A54A57ACA4466C2C6AC3230B70DEE596AC7C954C34AC0D8F7D71B886435B3A0B5B6B74ADD1A6ED9B063E23C7949673B11AB51DD11C239961E66916CC1FE60DE630D4ED919 EntropyInput = 5177CC75AB7A1754992226B0CC566787E02DF3F3976C076E EntropyInputReseed = E29D0FAF032460D6B0563A7A1A0114C2 Out = 3DAB6C5B6722FD6D8C70C244F5A8A87DD12FACD2E70A8102D06E8968BA8614A1B8CCD55D159DE8348EEC4B7703915BFCAF2792570BEE0080EF1A7B297BB919F4D4602AC2DA30F6ABEE974382D463EFAA EntropyInput = 702122667ECB80AB652128FCB5B65D175BE3FA60C2F0A096 EntropyInputReseed = 8BD446B9F0F99A0B764AEE6515599824 Out = B2DEE774A1032B7CA86E18ABB005E7083F637E24568272882C52995BD8CFFBF61B7F9B5065FC9114C41E799D69A8066FE03C5DB7030B369C50C85DF196E064CA2FE08111A2A98D19A6634FE51B3C4210 EntropyInput = 2FC9657E06F827F85CE05F42B38388C0B316503B5953FAA1 EntropyInputReseed = C54B51306308C5BDBD0358230872491A Out = DF713FD71AE3400E815469204314C071DDD134A8D40C1B7E2B2AE94CAE2CAA57169493ECDBDCE52D7929242C74F2232BCE79C7ADFAB47658D11B164186D0FF5C4A1FE5A17BB3617E2AC1AF7FC014C16E EntropyInput = 8709676B915EA6171229F79367C1E8DA2D7F08C26DD4FB26 EntropyInputReseed = 964E10BC6B822C2413F61D9A3FB353AA188C1D8ED94DBAB388217F056C936600 AdditionalInput1 = E2BA17F4757408BB8B97DA74998704D2 AdditionalInput2 = BEF0C60FF759B6FF4E373F75F0BDC2C2 Out = FBD16FC6D36D8E17F30D5B8627B287DFD34D338A779D8EF65D012EDE5E37970A70FFEB4B369DEE49CFCCA0EE561EE1BBED2C8AC7BB68BCDF0EC09DD89F360E3C1534AC937ABDA46DD5180E71F760F6C8 EntropyInput = 3EAC2A121DBB7204932F5018B34C05EC5E3569C6B0ACD9BD EntropyInputReseed = 8F588A3CD773B1EC0B28B716E85BABB72A6A72C26A5F8BA560459FE75FE55B9C AdditionalInput1 = 3CF33B16F3E13B7F124E5AA82DA06258 AdditionalInput2 = C3C38D99695770A67BA574D6A210556E Out = B99899AA5EB069FC9A508BC5417C61D023F139F7C9333512195C922409B6992231C7A8E442E69F0FD4E7FF3023C4516718CF12B038E517712483BC1724E3CA7C988266D9C39C09D09EA2167DFC359E02 EntropyInput = E207A5168EC7BF1E1CE41CED1EDE10ABBEE06268023D0DF6 EntropyInputReseed = 0106709D732609042F11789124630521610ACF26014BC59C55ED3C66D8410AD1 AdditionalInput1 = D2CA5D29D18FC8E21FB4E75B2371EAD4 AdditionalInput2 = 0E06604A0F3517D9561FD95662211AE4 Out = 4C2D499FFF3D98B9EA637E491297C93EAFF5592837986E607B26B0CF71147AF468711B017514037AD95D4F278CE7211714092B5A569CB0C2770620E75F8220AC0F9052CBDE15C67188E1EE096576408A EntropyInput = 873256C1590180ABCBDECDEF0765000831E822D39D9C9FDC EntropyInputReseed = CA3DFE9B1A0C24BD59414300B5F58C49E9B405D3A2C07E07BD2995C46744E11E AdditionalInput1 = DB734A41FEC296258216D5016AADD710 AdditionalInput2 = 16887F7485974E71D362E9D3D8AF92CF Out = 7FDCFD2590F8B9FB964F2755832CFBCEBACA36947C424AAF9C766F6747B7CACF8D2E5A033724C0706465E1A263C44BAA2A14C1691820488F246E03755405520B27C05ECB01ED21824691EC66E467AF70 EntropyInput = B7B44C2F1CA65103F0B8A1D97B03FCD227769284630EE9EE EntropyInputReseed = 94BB957F6C1F9403EE5E5A705D33506BC3E1E1A6E21A3CCBDB8C7039FC4A7752 AdditionalInput1 = C515E8014B77A853FE9A1266902F2D4D AdditionalInput2 = 9297195E4C5D94F4AD811891666AB150 Out = A03A0012C88A4C93B781FF67ED767CCAB54A7C86D2090021D790825D9E898F98E58D399BCC7B4C622CC34315AFF512A3047503407ABCBC8CEC48BB72FA899818F1623679B7D4ABFF872F06FA7DB22358 EntropyInput = 4976765EF957D389CACF5BA856007FC618EB3FBE12369A9D EntropyInputReseed = 200B890D133D92FC7CC18550296EC3578DC0A42FA8D276BB284DD1F908CEC0CD AdditionalInput1 = 31ED29C33544E2ACCA2003F5248DF24F AdditionalInput2 = A1A36E45725165F78F73BDAFA784B356 Out = 488F0D75726615A88E0BACA524B09153E9368C213A9EA445FF024A2939DEF1FCA8CA995BA7BE6532BE08FB563433CB3E33B35F08F4D2EF425E236E92F8E02A8DFD2260B681A4E89677178898EC0FC526 EntropyInput = 71E316C1B653371E940F1CCB3A5A99B339FE4A165288A370 EntropyInputReseed = C38112BF75544D0E330D9AC04EB4FE2CCBA66C75D1B5D79FF1736216FAF7A775 AdditionalInput1 = 249C0464F8559E27A5597E83AABEB635 AdditionalInput2 = F681DBEDCD2437F2D9A8AA66E9552F03 Out = 68BA10D3C6F647852AB59BB3848AFC4C9D34237DA6A8B25F2A875F9A6B5F3C474FF3D403BCBE95CBE93BAC7B03FBE23ED8CE2667F5863BE299A7D133A54783B2B36BC69F101F30DA298659D9E1610F39 EntropyInput = 61EAB17A00A01594FAB7DC717219FC9C4BB5E54C248DA1D9 EntropyInputReseed = 9A88C53085286B73E43E6137D772A67F4EA3200A9155C455C2D8E5F3B4DAE32E AdditionalInput1 = C4C78C8A03950EAFA5103EAAD5B99363 AdditionalInput2 = 86C28FBDABF27C3AC8AB43B6147A7C49 Out = B9C3A37CCC4F599858B49D479725C45A0F17D7EF4F183506AD6B819C9831EADC9B60C38F9F5E3FD51EF55D0DD23E3FBBE6D05FF7404B526F6A36E9E7EEC899B45B2DA6FB2B56B39C6C665B8F5E4F8392 EntropyInput = CC950C2F11326BE58CABB501CA9E9CA33A3C12C7B948D302 EntropyInputReseed = 8382FBA530DCB824D9AE09266B484FBF415AA7004362549EDFADFC57B4B5D1F4 AdditionalInput1 = 0A2DF5BEDC61CCEDDF034ECC5C43EFFF AdditionalInput2 = BD96D85E29697AB9F4C4BBA967BB4371 Out = 48E0F8BFCF8D856786656FBED96EC70E17DCE5148EDC5684A23358A42C405D5030108A4AC73CC861447349B13F005B5B5E22A0FC70FD5EEC939CD28535577F8A9A62D6E8D144F9958AF25947D63D4891 EntropyInput = 6B822F9BB1E5127ABA42AF106C5655D158EAD933A8EA9B48 EntropyInputReseed = CB7B50375CF785C9A02FD59DE989C0EBD758C26022712739C51A44697EB70CC0 AdditionalInput1 = 87B6A74746A3F23177E873DEDAAD683B AdditionalInput2 = 2BBC5535B8A5DEDF7B645F806BCB608E Out = 8CB481B24F24C51F29B9769C90E79BF50F0DA5FC1A7F4287CB33DC2B6C3D358858BAF25EA2A67D5C20DBBDBA3911C38A94B05E17AF80BACA2FEE5A6FE3F47B3B7F6A85E9DB9BE9D58BB510609249C0B5 EntropyInput = D6A5EB4FE45788A2694B1CE1BDFAB99489A9C7A21CE6B2AB EntropyInputReseed = BF969403AC8867C17C405EF0D5EE0103CEC9401C46EFCC8DD47DECFCCC3C4ECF AdditionalInput1 = D34C03045167446397A20B049E72CC0D AdditionalInput2 = DCF866ABDCC522B70C6AE69A654E019D Out = 5D5E430A0C9DF6C83414AC0162F207A522988E0CE8414F7968B445799BE6A45C6417D7B77349B7E3884B282A1ADAFB81867B0A5BDE68D04E9AD2C774084DFB9949CA67A816406981679BCEECB241480C EntropyInput = E1E8F97FAB82B107857EEC6AC1DC88F7920157811CD99EB1 EntropyInputReseed = 2662FA0B43339D012DCC4CA152819C1B434808A37155D3E12B22EDA58DF97F51 AdditionalInput1 = A2775AC81C8D0906CBD66D6926B060F0 AdditionalInput2 = 640067B71AD0D1605E27983E2F67691B Out = 561A979E6E6852304D2864C093CD127F7288C7F71543918E0AB0FD4183BE522A8E4B3E82B9BE4992E6FF51EFBAE33418ADA11B8931644B767706E11044A0693964D4B849C79E0F6BF5D68765830CCA39 EntropyInput = 1DAD15A3EF8CFAD9999CFDC2039B3F244A9438E0DB626664 EntropyInputReseed = 8291C7B5856E8873455A913CE83886CDE03B40F7CA46A954EA4E1FBF414BE9F6 AdditionalInput1 = 2B79BB6B91A94981D79F1891B23DA99B AdditionalInput2 = 7FB9C973636D4FA2CDD2DDA10AFA5340 Out = E6D43903D52786FB5967B87275652B8F7AF5B97ED8A9333CFC0586D3DAD9840B53ADB67DB02ED2232E374B145CDE582F54C3002E83950084043F51A286836379D10BD0D3D98C2FCB6DA22C507C01D333 EntropyInput = AB523F1EE60C55275341EC9BF77C7DBFF396408A9CF41956 EntropyInputReseed = BDD09FA363F2E531FBB3655FADC43279A2F0D95201D3CDA8BC4019EC40807322 AdditionalInput1 = D32EC1329E167902C26C814F0E719094 AdditionalInput2 = CEC85CB7C277E1C21169EA5097B67CAE Out = 14A7DD4E6231E600AD3D1AD6CFD327F58509077BA9DDD832007F6431344FF4503D8A3B6AE71E1CE78780116D257189A257D94CD503E82832904DCC668E1F4A6E63FB7C33F92E1BBBB71ACF40FDCEB7FA EntropyInput = E669D35AA760D27C359CA54925A05ECA4F12D70A6A9EC061 EntropyInputReseed = 6836DAF529C363C5BB2DC00B3C014BB82EA98698B24AAEE2C1D21B9383F5CC4C AdditionalInput1 = E5167FDA1FED23D757BDFCEAC2F6404C AdditionalInput2 = 490E7D3E46022594DA1A339002A3A6E9 Out = 679987FD60D4194298EC93BEE975A85A9067E784852DA42B20A8699F7DC45C951F00D4B585D87214745F10E3258F568A80CDD55A4E96758E8F9FF8C1F85511980588D40F68873783997C0C9742A0356F EntropyInput = 12BFB2BFF5781128967E9CE4D429453C5AAB2BE4E92EC855129126C16D99A684F3CB47E7FFB207AC EntropyInputReseed = FA8B0DA2CD5031433D64310BA44D47E4 Out = 766C4A1670DEE63EE3AAFB6039E86EC5CA2890531974E70FEDB3C0218B08FACA07DDFAAFF0A77F0AE47762B0E1B31C5FB036DCA413FB96F6E0EC6AB7DBCBB558AA5D94F429C38E0FD7B39F12721C9935 EntropyInput = 5F314EB4515B3FFF678044D0A8E8B8C665D7EFB0AF14B89EF3EE004227F3260CF128234BB4B49CFB EntropyInputReseed = 31A19761BC6AA0EF17A7D8FEECE54581 Out = AFE1371517FA27CD48C972C0CE4910896F006B9500ED29C39C5D3E89BB6489DC258D0E01E97BA19A7E8F04295E39794F9054183B7A5BF10FF2E4E50E922323C3C4C1A8B9E9CB36475A534D4F16C0D05A EntropyInput = DB9C15470936F48D96320027B84B65259BF72468A403B78C0B720C0B3BDDD23034C58697766CDCAF EntropyInputReseed = 89E1C2646104526757E61BD1FEFA5B6A Out = 6AE8EEB818F10ED8A881B5B040A1315756A27097BAF8B17BDB5166A5BFD858256908F55E2586649B46B4DF175B8E5AA3307E68EDD8E5963641851AA143A1CF235555C5EA10314B45B962AC83670AD832 EntropyInput = 3CA04EF08155523441F6996B8844A52E9C0C9370EA130FF6620A6150949161B2481A66E3D0A282AC EntropyInputReseed = DED829AB4A833304FFF50D47E64F8E96 Out = 1D821781B1D2C0CC7E246590AF5D4F00CB399323ED0452E44E3779D687736B5B2D942489D10BDE5BEC9ACA51D810AABAB67C9745F682543303C69A148CE46A02C7D14B7F4764270FC65A18071BA37B84 EntropyInput = 1EE0F38A61DAE35AA3C8E797777CE35A90FA73834EC282B7007112257E4A794B2DA9601A6043DD16 EntropyInputReseed = AC6E1103C0181BD5BE84700FE1843555 Out = 5120119844BB4322E73C13BC137881F5501380980438F3359289B117848B0CCEB2FFE45CB9FCB1EB757D7BB6784DBB8EF0A973D5881B924D123C4A3FC46960D3A78DA770AE53ADEC2AD693C235626C66 EntropyInput = 401C22409B47B9D6D46EC53866AC5E0E5419D1AD34D6B6B8F17D06E2974570515EAD0FB0F53A2673 EntropyInputReseed = BBC65915AE03AE69F3BF66B968491F2D Out = EA4A96E2BA40140AC54FFD5B669E9B0228D7A362E010CD311CE633C13F740C66A38623448E848D13C2CEF1D81BFBCC3FEC408A00C172159AEF3F24A08F44852283034C6D8508E4745E8EE2677B4657A1 EntropyInput = CE1BF38176D19E06AB5F1CD23C9DCBD4DCB5F44B9D04E2F413F05293E362D9C504401EDC8CC83E75 EntropyInputReseed = 6ADBFDCACCED121F6BC61DF3C93697D8 Out = 3D6892AA94C5BE0B3DD4C36BAAE56EAB228F2D3187B80AC2BB2630F07E9336EEBF479C7589E3AED9BFFC8F21E982BA8A53512ED37E0BCDB8B15CD3364A0ED3603EE4FEE339DB82AC9E6ABFE28A979409 EntropyInput = ED8AAED53AD2929CACDBFBB865413924B884BEA47B728C520DB4A5B50E7E61C5FE47991571DE7E62 EntropyInputReseed = 8542EA41BF9816B77C48E18A84545397 Out = 15533C4725CD778906496A2595825EBFA993BD8ADB06E8CBFE380B5F09F37921377D0F7DE7B79B2A033FA599942B78708FC0A07BC69822BD1B2DA369A0F0712DF7162FD8993631642E1ED625C2CE9BAF EntropyInput = 46FFE9D1D4348822D19954D4B2904EABFB788F893163631CDA7653D4ED42B18BA184D8A9D26838AC EntropyInputReseed = E88F12BE7EF339076591FA11BCCD82CA Out = 7B81D0DB15A89F3597E817A21C1FB6209D9CAEF2993978490DCE3E3DF7B5B7CBA00F1EFF6EEBBF659737C0A8DD5CBE53D143839D89A2D9FB9B0A2C55035B6CBB588B6EE75CF3997767BB11C2EF86C8E3 EntropyInput = A32C6FEA74C6C8B73684D4DC05B74843879E4B22E764BEF5FF63FAA042F7E9637D0781B9EA93C61F EntropyInputReseed = 8667C7CDA40904A03AE759FAEB9BE4BF Out = F7C4B76356E70C1735B537894B3895DA0702CC1871F8182452A4C5317EAD6F4B419E2C39832DEA27BCA3E9D949F3A8A6674D9B3E312392E490FDA9EBE4FC909A2B3F5A30CC68397D894F69108F01946F EntropyInput = B2B15CED224F481600D725721D6C826AD4D2AE6B5C7E6A52AF2F7176498486A7D2DC2CAEC10F7657 EntropyInputReseed = FE74A13C7C3F372E4B0C68BD9332BB42 Out = C0153F645C5818DC9781D3E3C0F8655B95D3A5901DDFD107F0EE44A2F52712FC32D99AEF3F0891EB58B2A1E6353407B0F56F457C6D55B7DAC09EF791DC157202C6B739110045709AB71AD971BE6B443D EntropyInput = 5BDC7879786B46B09CA246E45E8D0F359EFA2396C57BEDE7C9250642314FF914D881C489A60A1EF2 EntropyInputReseed = 59F6411BE93098464AE487DCB71B019D Out = A7C956D1B5E307FCC6DDEBE33DB2B7DD923E88EADA99CECB7FE88CF07AF95E74E68BCBAE2912C6FBA1B5022CA3D4C211BDD8DF65D9402FFA1322702D7DB8DA26EDF950A13D4C119D7653F1EE559C34DC EntropyInput = DD1C19033ED467A6A919D73503D9B45A2DE077E855379D9F480AABB5F431342B34086C7AD7DD3040 EntropyInputReseed = 5BAD8887EF03033D58B16013A101C45E Out = 83513414D1F14E1FFAE5409F47071B408218883D0EC7EC788DA6C25FAC189ED1F673EFAABFF6853BF0067720C57712BFCA09022DA459C12D6C5DE3E4627DECEC09E96ECEE5B3F9DCCDEB50FE2C768C08 EntropyInput = 08FE3BBE34D4F08C66B4A3108DF93985CD6505D51AEB982D991A23EEE8985C096495570F32FAA7C0 EntropyInputReseed = F9323E1CF1E2AB6351483C5B1319EE4C Out = 42E5B5F875A674E0736F4736676CA85006357FBA109B0DDB3F604B860554921CA2A2F2C2D6976CD79347BD169C532194C252042C245526AE2A6A1F357D5E24FCB1F1F280D30BAEE10960D2D4330BF747 EntropyInput = BA5AECC5DB239D14AB4B395D7FC79DFD1ED217DF37D79A551DD11C419A0B07D05CB578F603C941A0 EntropyInputReseed = 1049BC424DCC88FA23354928318C8048 Out = 69D252209D4CFDF54E62AAC442B02758A69F4988BEDFFBF76F6FD76A3DC458516F32D6A0C93F5BC1CA4B663DE524215FB8DD725E1AA19167BCFC6E91363BA49F24A9540252CD13D7E03E7DE77422DD62 EntropyInput = BA6ABED642938168D88EAD387D44DB1AEC70D18C01216A7BC0E525961AB9AE58FC72BDE3023D2B5B EntropyInputReseed = 9A9895F7A2F0521E4A43EC62B08EF15B51B1151D6A8F7C4E5D9817ED38383849 AdditionalInput1 = D12A45C94D603D45D0B9090CCD56A41C AdditionalInput2 = 7EEF8F4B0A03DC5C5B3FF447FBF007E3 Out = 8CE561C4FF2E2AF6B38B1189E1A1C6690AF6C8E393478802F7E40B2E84756FAD8627DDA6FD9079102CDDDE9559AF5B82731771A2245AFB0D563B03E67838D4DD0D5716BF63A440EF5FFF832879B0E380 EntropyInput = C01F419A621644A59533348BCCB01C2961B746F57B44773AB44BA6364B25375A53A2989D70EBE318 EntropyInputReseed = B5838340D5C044320D7802E1C99F23E68F2365A0A09898DD5EFED98CB619DBE9 AdditionalInput1 = 8D8BD3BC6AC23B8410E22DCD50021E05 AdditionalInput2 = EB79141719787902F297D54F9ED29393 Out = D53E67AEC6B8E193C8DFA5A4657295D988AD3EA4B94D9638BCC492D1D8BB73FDC4805BB8300A25FC4907AD85D43DB14445D5AC2BEA8D193DA0F60964CAAA959006C112E99A7B9B68F333064FEC2B7F9A EntropyInput = 6A19FD0499C0F2BE1168B86EA5D28049C74C06D4F748695B8196291E0F98AC8E13CDB57DF1D1DE74 EntropyInputReseed = A8CB86E4EDF8A577603009A4AD73A3A724F97741D451CDA7E48C6D1A7AC4A82E AdditionalInput1 = CDAB8471277C33A2C84BBD7544E10BCA AdditionalInput2 = 820456EECE723A690F0032D35769CC68 Out = 285EA40AFAD186C14A7F3B05780146AC85BA33996C617E7D4B13252916B96EF7A3CB61E3C1050D8FB7D6081BFCDDC74715EA82BCE5A02A27118E875CA682F73C9F8DDE81E99C69830D7B4A60779C1B0F EntropyInput = 353ED6A742213E38A55996CD66E47D7FB9C3660F051FD0EA17033197C41AC8170AB298342185DB65 EntropyInputReseed = 8546A98B0CAC372DD9AAB53B39927DE096496C4D2FD10DC5156ADEF22944FBEB AdditionalInput1 = DA1ADDF3522EF2A2E552A7F8F0C4554B AdditionalInput2 = B041D48D77FD64A5034337234FEAB527 Out = 45979121E111030F0F5123D105A1BC2F4C8E6B390042955F882A187BF4C115F849CD3B61294234C1A90BD54C2CC0FDD29029FAAB9F3788DD05231C7AED6DB386058D9ED2A162F77850C358B24D2BE933 EntropyInput = 55A47579DCB78E687F553477C5BFC8093C8FDEB8EBD1E03C3D290467A8C5FB5F847905D31B893F37 EntropyInputReseed = AD548984FDB2697EBB6E7DCF2958CDF9189B709B9BD6BDC6B221D0DDB2C8421E AdditionalInput1 = 41190FBADF94216847D8D39A2ED4124E AdditionalInput2 = CF27077812E34F7B9B009077F2672284 Out = E9DE4C948418FAC8A2C1338611C7056FA9CF0BA2C5302A5FFDD61C0748CA5EA6189616105E6686D777AC6F28255ED56E812305F41C0E9BAD6A4DD16BA5F4EF6B36737274960EC4D723200E461A7AAC68 EntropyInput = 1ADF49C84A9DF47CBF46717CB2B2434E2BD734040EB7CDA8D2980EC76279BAD4DE93B4622EA1E399 EntropyInputReseed = 50775400951810DCB8FC10443E239E04251EF8C244DABDB342E9D1002F07F9FC AdditionalInput1 = FAEE840920C8D328FB86E79A6E618C13 AdditionalInput2 = 5550D4AEBAD33F9A54AE2D545B227205 Out = BE9D36FA33E13AEEDE48DA3560BA9EC8772400EBAA43E4F08A9D2968B64242589912B4698D83046DAB38C25E6F88F1CC35B0B4549A868B3DDD4D64A193FE57B880059A347519D8DD9B3FAD809DA8C8DC EntropyInput = 7E136BE33F95623257EAA52BC28CCCA9CD77C05F4D71C2D4213312B29E0955BC1E94FA48BE80109F EntropyInputReseed = EE1613FF36C6EC3D118A30696E21F98E123ED916B103220C725CDE18532F98A8 AdditionalInput1 = 834C545B69A936D96E20162353CCCCBD AdditionalInput2 = DFF2102E80EE0A202C3CDFECB331AEB4 Out = 0A73D976E43D2851883F996C61F28AD02BA6B21D80A276E5DDC25E2CBC78473374EB9FC75E7343643BB4179A24B8FFC1361E3D700A538BA4C7711574F65A091A8AB84499CF5D37FF22F9BA2831B92CA9 EntropyInput = 0736A083595A8397CB9E676CB37BFB5A0B184A6D0A630ABBC302503D86A2BDE46A0C63561A86CFD9 EntropyInputReseed = 4B50977033483277647945FFEFA109E24DAD813744F54324B3046A85BE3CC3C8 AdditionalInput1 = 7441FEFA60F7EE48FF387B587EFCB3E6 AdditionalInput2 = F0D005289A9D3993C44BB750D96CC1BC Out = C03971897B854585994EEB8E3D6B556E1A8DF18A7FF88F83E8FE17E6DD9071070A6DBEF67CB612ACF122CAA7F817704B3EFC6E1B1FD6C330E0A732ABEA93C00818E12C504FD8E0B36C88F84A95B49362 EntropyInput = DEC6BB6824D49C28CA06942AC5924C757A94E6E859C5CC313E1F89D809AF4C16D4E5B6193B721395 EntropyInputReseed = 201012915BDA4E6C72B8DDCCDCDE21ABCA3FE54ADD673CCAEFD13BAE3F609263 AdditionalInput1 = 08726462B141DBAF769F9AE341F76F12 AdditionalInput2 = BA0F9AAA0A505F45326FD9143072F7D8 Out = 0B84059CB7B91FF4985AF0AC76EDB5D815C587C16236D5AC1D1966BB0C0372429B10724C5ACF2F5E49F81EB09D71231172AFFC925C0530BA73035B3922B2A814F9945789A017016BA7EA8C135A10A047 EntropyInput = 423EBCADDA51D2DE406E0B4A6D3C9CCDA8992AD9C9205B108AE3B91C6061C0E41AFD6B7F5077D8F9 EntropyInputReseed = D2466179736D32539407740774260BC8FFDD4B741A214555CEA6254215C3152E AdditionalInput1 = A6DE82EB7E460A742CE54E321FB4AD38 AdditionalInput2 = F9228086D7ACBDF578D60EE7D882DC27 Out = A0AD941FA81688FA16012A72068A1C856A5E032912C55B6A2921C3D53C948E88690E6BDADFE6C24EEF2A5B1D3082DF982D429C75CF9E207C6DCB9BBD7437900EFA1B158287286C3DDF35F235D6C0F219 EntropyInput = 9D56AA480176534276E039622B52D8D7CD7F45A79CB28CF113BB01995873C88E8426A596A5601549 EntropyInputReseed = 71CD80745587E10862597CB14C8EE60A103F8C49D81B8DA70D862C6C4B282D2F AdditionalInput1 = D89C45EFB2BDC71C75C02C85F86C44DB AdditionalInput2 = AB0796FAA11A90E27612700AECF6F88F Out = 1F05D7F9764763643130567168175CAE82901F952B5D12B8ED46A86A3FD6F43E6EF30F02EC2F12855912C530E1F61E40C85544AAB78D458D3C959494868AC63A04638D37C4D7E38377D4423DFA776FF1 EntropyInput = 8C21A6D554FCE12AABAFA3830E72F5863EF819E18B4510C7310DBFD99F4CE777E24142B5B3DC1CAB EntropyInputReseed = BFDADD4E7F16B6326189F2A79FEFA895658AEF06E0CD17BDCA8615A629BC8B9F AdditionalInput1 = D997B5BE70601A668C50B6FA679BB095 AdditionalInput2 = 6AA272CDD21884CE7B3E9FA0428AD171 Out = 18875BCB9451E188D24C8A23F5AB5E5508078A7623234E233F66C857AD3F2D1A76BE2B69B9861A0290532F6FD710B634BFABC344E87EC656F9EB719BDEFCA7943313AFC89601A66EE98027FCD9894A8A EntropyInput = 725CDC8F78C52CCDC85C0CE67B662D5F1B19FFDC15FECDC4B749F4C60A1FBC153AB8A64CFFBEFCC3 EntropyInputReseed = 405EA28DC06BC10B0FECDF02CE53A724C2421737B222A853F7CEF8AF4C6C519C AdditionalInput1 = EC3E3F95023608FCC90A4EDD789E0084 AdditionalInput2 = BA1CAAA50F9F1EE0F1247C2156EFDB12 Out = F99E51DC8D9646B5AFC6FE0F744235AAC58A0A3F4B1265C45C57C483C704D95BC4768FA4FE16E7BF2A552D6DF32F657F5DD051F6EB7C99D0BB2C8662746158BF46CE3B075A8F885714B247FCA06C6EB0 EntropyInput = F3F8C2A4C504B4DD5CB3DCCCAA3F67AC13E8E0BD04B423BD7278980E1BC9451173C3B2D3A1AE52A9 EntropyInputReseed = CF494A8396A93E12F7A9E89DBBA24B3CDF5E532692070DEA4D4B002E20F56EC3 AdditionalInput1 = 110BAB0C7B3ED3CE03776348455B694E AdditionalInput2 = EE095104CC8E65CA55B37F024FA3AFB8 Out = 0D7CB33651281F827559C6F6D1CBB8C1A60C646DBD6A51A072F0BABD63865E1358FAD3522E432FEE9401817EA01A9F299C09AEBF5F7369E97EC26D4CC76FAEAE6E418D50BB2ED9F863DC4E6D8F94D9EE EntropyInput = EF29B4C45EA0067B9BE2BE87F44BCA0CEBEB3251292B693C93AEB83C505B12F159ED081283245442 EntropyInputReseed = 8814DC65495C9F82A9BB16A03280ABF84B0E2A22040FED46E12F193B6B02F5B4 AdditionalInput1 = 23FE574A28FA74D5B1E8D26957260D78 AdditionalInput2 = 58944F71D5691EB2CF3B9F857C9A7AFF Out = FC00D7D72B245C207CDF089B5683AF280990B0C819160BBEA6C4F94FF0BDCCA99BA0D6AC033CEB8663B1310BB9D033084E22D5CEB45D984AD4EEAAD1D600F686821557EBEEF98BE91D499A4059F9F616 EntropyInput = 23BEC02F58A3A8D9D9FB368DD2628C56EEDAA50CEA712546 EntropyInputReseed = 4D466A3608A4ACDBD6A5A7A753A15F9B Out = 987F5CA0B59D6FD1DE8D7EBB07C0D988E246C30FEA5DBF5CDD5BBEF7CA453018E2BACBF7977F494CA9BF5C128055E41AB8F7DA93D8BBFAF9044B094A6EDD0D72963F83A3D1F417FC8F5B723911ECA062 EntropyInput = 3C3AE3F8E2705B77CE06E67381B6B7C409A2F5C3F165E3BD EntropyInputReseed = 704A2568E4E64BE675D1FC45FF744B07 Out = 2086738A4C5EA298E2E22A1404C15C0E01003ACAB9FC3B57A151E22CC9332337F56A03B876704FEC1D942713E75B88EF81402166361927D1C09BC3B762BA9CAC38DDDBACA99F32122A7E68952A7FAC7D EntropyInput = 459F52E677D0E10EF6676B3A2E146475ADE64F6DB903DD98 EntropyInputReseed = B9431233DE90AB01260ECCA80D7A5367 Out = DB10431805726A05DD19136BC5CD2667F5D64BCB71727E0FEE19BAD9A0C2049F03ED40A1990BE9A0BAE8B895ABE86C5F049C4D6BDAA6DB9C5B790CF2F1B003638699021F079913C49161D5F99A6073D9 EntropyInput = 508BBA0D257B512A08D251550F265FA86DE3E0E1FDA1C159 EntropyInputReseed = 2F1BF12F30EBB2CD03C396DA3FBF2EF8 Out = 5E74308426C54388F809A50CF4D1985EFCD1ECC101B3BE340BCADAE35469E32EEF2ED1BBF7AAF8F79A723F76A367A6DD54C6ABEFD1A122B0CACAEC56750D7701D51106D15C334C80E6C1CC6B7ACF0C46 EntropyInput = C23773ADB955449521F1FC0DEBB6E34950240DAFEC42BBAA EntropyInputReseed = 4CCC5FA315E3ECCF8B4DD18ACCBE98DA Out = F8AC3735EE4712A92CD97C66671D3B4031E49EFDBD733D55E817B4F8DE215903488C0B6DEFAE0905ABAC1D199B47471F0310C76E1DE58BC8D6C793413B31078A506A1724BC329D28049A78AC10B7DFAB EntropyInput = 7655FD510776434EA512432522EA61F294D7FF1F7FE7D0DB EntropyInputReseed = 12A4A027B297FFFBE91D8B291C3ACB6F Out = EE53AA45E1AF84295821CEA896FAE7EB23695E4E3B669ECBFDCE4726875D8D622139E763413E4EBEB52481442A5AF1DAD59B75C002BA63EBD0634DB10ED58ABE9860D2AA5A37F36DCE50B8C622EB1C91 EntropyInput = 8A8E9D3D2A07E4DFE73E15DE6F575A628FB6B75EC61CD014 EntropyInputReseed = 19DA99267F0E019EA08189C0B9C47674 Out = F86E4E918DE08CE26A34D43C301A1B0732CB9201BA7B06E5B222C65A97EBAAF4544947CA96ABA654D8FDB875DCB1137924CA1C6A9F510F3F29420C0CF0A0BF4606D4B48EF95BA8F2F3EF02566C7A221E EntropyInput = 8D4C0135558AEFA83A5A50010A96927E81F0F1878254F3D2 EntropyInputReseed = E3D2772A989BCCCD454D9D361C635142 Out = 301C94F81AA058551673BD81A019C64778C1DE61383B7FD31AEC6495081A85620E48A8BF5EC09E6051C9910C6142C7AB9788580F112ECD54441EF873C5F9227BEA9FB5A77BDABAF2ACC523C4F04FD965 EntropyInput = E8503F7DB66E5DDE3B6FBD57A6576A38720523663C99EC52 EntropyInputReseed = 0FA52238C39ECFC2180535DB0ADFBB46 Out = F0817296721AA5FD47FAF138521729F6B69138BABDBE9962A45E26F0BFB617A83CEA78A38AC6ACD954F5CC23D6AC8FD7C05C98D76F902855DFA63965F524E1348A00AB425F3F7F1034D70AAE43D74517 EntropyInput = 6163E7D1145030AD39CCDE7448DF212969A03030BA852E80 EntropyInputReseed = A3B7B6388E2F558F0AB3E2FAE3DF4EFB Out = EECAADA44B905CA5579D08348FE4EE182BCAD49FD54B1C346E708177E52D2DDA3C016973BB83FC2881DFF2C4BC1899EBB04C45666B08932456D85E09EBE391E327F91D16BA2FA3199CAE1BB3E7FA5EB0 EntropyInput = 961F386DD73DD7E41A538747EF7EC71CE913E8AF10781C30 EntropyInputReseed = FB27C35D0F3090C06914F948E220A143 Out = B3389514037E400015F4FFB504A2426549F807535E2CA3BCAFDC673F83830DAE84A0EABC9C4CADC89F88AD54A0B9B124AE828E42F7E930377A5102490CEA1A65C699D0F0E1965E27C9D62036BC206710 EntropyInput = 458E3A23290E2C1ADC314D7D593CAB0D30286C4023501608 EntropyInputReseed = 3B4D588BD106E35468D3B292F9F1106E Out = 9EBF82BF32D1B561BD413E089D003C8B1F7D9B66DCD82C72F1FEB5C46D293388946394FFE45CA17717D42E699C8E908DA3331AE8E9652147442C9A8558E1995FD3359398E79D98068180E5F76850812B EntropyInput = D5E78A5768F8E4AB3D4AA281651E0B66EFC4B4EB2BD15645 EntropyInputReseed = FD7840B662B5E13CF4B5E7DB093BB27D Out = 228A85D23303F04EAA887CE30AB0D43956EC57BBAC6E5CFCD63136496BA75D714BD43D5701CDD59B53A422CECDA3EFC2E33842A71908C9DAD0794DDEF6CCC03CE38B6D7B703835221B2CA402268A7AE6 EntropyInput = 3078004EE9F06BD745A28029D7C1DD0C0055C09F4C1C3D40 EntropyInputReseed = FF4141209A65DD1F7544FF6C0E82C397 Out = 7DA1BCFCFF22FF632916CA7BC739EED275E6EC191D55E0CABDCFF04E079B8BBD3825196FEBA7045FF102E80B4D07AB489A1ADE8FD2E7FB0FA3D2950B13D4DF9F0DD2901BA227FA1D33F02B5BF5607FC7 EntropyInput = 1A4C04D384CEA433A92F1D81BF0DE58C71520E38696575C4 EntropyInputReseed = 9318E0EC820446ABECB37B04BCCA3CFA Out = EE47592EAA7B92988989A40577A888CAF59F45246D8F421598EBF3E6E387DA718356D59B25803C2C771C9946924E313CE4479AFE8A22E2D3AD59C3CA29794BB71E6C8661D9B38FAAB20646DC30E6F269 EntropyInput = A79509B8D65D1B16D5F30E691B091002CD827C9D65D8AC3A EntropyInputReseed = 740C66D4755700102413AF9144B9DB93DE929B43CE734E7E3961627CD5E105D4 AdditionalInput1 = 602A1E21189CE1A31BE1A61BD1797B0B AdditionalInput2 = 09B09C7E75F9F6B8485D76D95A52A5B7 Out = F3CEFD9D94C05BFCDFDC01B52B9B73CF3A558BF0FB03DB77281B8A4E5A09E2A08908BB87AA965C168B91DDB7BEF1AE3CF7C0B09A8F448B8AD8688CD18D97BE6438FDA447F9FEC23DB024CA3A9EDDB16C EntropyInput = 29AD43273F7B22E7E7A96AD89D951EE96DCD20355E816631 EntropyInputReseed = A0BD338CCCC31E281FDC4F5EE02DC147754BDAB143C0F5525DAE6C7907582EA8 AdditionalInput1 = F8B071567607E115FE911D8AA8ADECB5 AdditionalInput2 = 15DA7A28D228AD6C54E1352608ED8F2A Out = 16A47F8A673CEE4D77557F7C4ED163DE9C981798DAB0CC28F1E7BCC3442E2931E41622DACCD4C26025A57100A4D49F3A2411D5C3A6EF2474BAB2D526DBFA12083575E19998DA961B24FF8BB42D820F20 EntropyInput = C48A52D2324C9AA799AE7BA9AB3EE7489FE3483DE1B6EFFA EntropyInputReseed = 3277274301417894ED1914905D413F81423E3AEC71534FD5D5EFA4F519459FFC AdditionalInput1 = 9042C0FC0848D8D837CE8021BDC0A429 AdditionalInput2 = 43FF169DF7DAF34D68E57248CC6A53B4 Out = 888617A752404A22537FD21BD7B6A2AD3A3C0F6A08A5E84EC31FD920CDF132941159E8BF2AA6C4C975A61CB771D207686321AE25DF211816F0CA19A7320AE154E55E93ED8D009899A14CD1C3ED57A28F EntropyInput = 145DBA56D5ACE91790A86E227214CE0C48095A47E49AC061 EntropyInputReseed = 0805B537DA95648EB504CED8EBF1C252786C0020ED111B8FA1A67EEDC8154E51 AdditionalInput1 = 0D585EBD9E02F59EE2B221C14C1CFD13 AdditionalInput2 = A1851A83F48C86C669240C92A20F2D9D Out = E1081947CAC4F36F82E81C14A2FB752B98C149BC3ADEA22308409F8BDA9DDC592A91B99B31C0985EDE37D255AB163221E5BE5CB65B8B8E759A3F484B111CE3BEFD20C7159FD3BCF677C014F6F6AB8A67 EntropyInput = D42C53C76D17F33854EC20097E09034050AEB4CFE4F353D2 EntropyInputReseed = 2723244D8D423767D1C5FA525BB418B029A7CE3EA7EFBD335B5984938E32BE32 AdditionalInput1 = 9A6E85B90B835722C7E6D7B5AFEBA173 AdditionalInput2 = 02C8FC9231528B51CDD87EC0E25F619D Out = A10CAC5D26903DB10EDFB6CC317C209A1E77673AAFE2B2D522A5F16BB03EBEAFC5C66C2246ABC70E74DE7CFC2235D00A848D8DD8C04ADAD8C33A836275F06F0DA08A31925D94A3EF736CD93E65B83C7F EntropyInput = 057A19F0D86A0EAAA3EED542A0ED08420ED4B66698C95610 EntropyInputReseed = 71B3CF56AA8337EBF8EDBA7A152257C0C8BAD72EB4AC43D4FC61BAEFCE904509 AdditionalInput1 = 9679962E0EA3B4E2B42667A375D486CE AdditionalInput2 = 17FDD94422A443BAF36587CC5FE54C05 Out = 7E4428EC6B93F55F84ECC49FA6E32A5580BEF8484688C5731FD12B07F1A56E50853EE5597E9CB0F6786648A891227D50ED32D6C126DF5147C95169D758F56735F97D92B0DB837248167D0BA86FBD9070 EntropyInput = 232E969ACC934CBF980C9BE9D257F2AB6482CA068D25C6AA EntropyInputReseed = 4BB2F58474306229CD18213454137924BAFCC4190875B53769B7C4AC45FD185D AdditionalInput1 = 2AA5DA34F65804712DD0D20DD11C5786 AdditionalInput2 = 05993C607EDF4A267C48956A5130A8AF Out = EB3A5E5B6CEFE491CF71666231A4851E37905FFE2A36229896EC5078A92E31F5365D0AD3BCF0E6BF68B931B3415D76870350B47DC6215DF6EE8195C4F71E58B4EC1F718559808BDC3DDE0604E9F0A46C EntropyInput = C6D2AE6A4120AD9579CC6B9B0F20138F4F17EC7D4C2DB7DC EntropyInputReseed = 3663C6D13E27B70F9D9A21F5408AE78757A20B870C0EC6157BCAF309BD17B3AF AdditionalInput1 = D7F7A125266D57BD7E447D3F1EA4041F AdditionalInput2 = EB80581D03E5464CE760E2F4852D0DB7 Out = 0787A3D8A19A3838B8738852EAA67A17DA6F95A872ADAD80E7667EF418AE01E0F85497494991FDBB6CC865E6015B3ECB67E20A2D7E6C2BD74240411D9B9633D0768270239230C7CC98F64ABA1ACEB339 EntropyInput = 56002B7648BBE4DF8621FF33B12A8DC3243919A82BC27DB2 EntropyInputReseed = 4D2291B38800C3E706B7DA830E2EC3F7E933185166FDDC7245B82464AB8FE19C AdditionalInput1 = F00D917B6970E664F51A4F5C9C784813 AdditionalInput2 = 7D6925A1A45504AA323F55D48D0B7428 Out = CDE8C781701BCA2DADFFE287A9B5B20509A056570D6279D221B2BACD731B501731268638C0C3DBFC3F6FC60362CF7E8134D06915BCF7AA58B1C1E69E4207F47CA148F3764D876699B87097457FC30BAA EntropyInput = 014EB1D1CA7A9E365425275DEC87D7ADE178CC28C3234472 EntropyInputReseed = 258D9B7A97340402AF81179FD3DDFCB7C62CC1FBEC1BE7268CA303D18C78ADD2 AdditionalInput1 = 7EE3293D3A4C58C444A57485A0A57470 AdditionalInput2 = BB2CD1FB6F6628C5B8AD058C0D61B0BC Out = 2A968678FA17CF1134A39766C4ED4985A6B61DFD16EA1F6899934E7E037768023EF6F6A7200D005C461C78CC6CA54723998FE67545F789828BD643D6437406511E9C60AD10C96CF3AAC4319731416796 EntropyInput = 46ACF73E320C79F12AD98C31AB938EC1D786A2A249147247 EntropyInputReseed = 65B2D523CE74F0ECBB561D31BBDBC239AFCB19F073330EBE116C1EFD3F65F559 AdditionalInput1 = 105BBD42360AEBC02A01AD3CBA0DA120 AdditionalInput2 = DABDE1BCA2375E8E7218DB8E7228397E Out = 2D70C851E221C431C6DA613FE36F37C508ACEB3695EB7864409A3E4DA1AF336B53434C28F262C805FC853E9BFA8E43C5AECD2E8E56081AE821D6B769E78BA1413947B510874524218CB2575F33E5F4FA EntropyInput = 0255D8FBE31E5ABB0DEADC5B3981780FBF29970BA84BD45A EntropyInputReseed = 3625F9D6F007B72AC781D290D5641F97274DF0C603E9B568ADB0387BB43F8678 AdditionalInput1 = 641B6BA924E4A2791250E5A4A5E20DDF AdditionalInput2 = 9C3E00323DBCB6CB8E922578ECFFF052 Out = 28AC7F5FF1241F52A8BF94EF2EBA5FE6BDC5046BFC57ED56DFA79BB784CBD2D3EB8FEF5800AB8C524B1D595C10AFBF2B900A831BA6CCDD3A93DA824C53AC980B630ACA68F6389DE62BF3139FBCEFA9E1 EntropyInput = 3856C4FC62490379FF60CDA24388E4FB1CD95DD406A2DF4F EntropyInputReseed = CF9DB51E0C51404E4F878151522633F1994102A7E08FF126C3E8A7561E0DD042 AdditionalInput1 = BB9932B8345D93276DDA0B93481C0449 AdditionalInput2 = 95DBF36C066AA7AB9C5D45035A7A7840 Out = DE88E50A7A37E5CC41DE3113E60E02C44BA83F29A8EA4EEDCE8D765F8359650F2DED95332FF3E1F9132A7AFA9106D8AD49735AD97108A41EED95B3C0F91A660386F5D750D74AB5BBFF8E1B106AD462E0 EntropyInput = AF59BAEF8820D7776A895069070CBCFA4E46B51E96EC49D3 EntropyInputReseed = 4904C1614256A2D8DE517283A709A638DD5C3C196C105278D63D0C4D9D243E2E AdditionalInput1 = 2DE987D3CE6078066BF91C127A4ECFC5 AdditionalInput2 = 45388F80A492B1C402D374A7EF688B70 Out = F068067E1ED3D248F826606E5355585CE4E55F0F99D066C74D90D896919CF96C3699985DD4BA843EC5C1071F1D2011E620382CFC41378273F4905991581D3A70ABED28B4BC236CB05A7D106511048784 EntropyInput = 75D9A2E8DF60EACE1480F8B6BE9768F5B5C00074BDD4A2E3 EntropyInputReseed = F02967047929EB1F3304EF2C49D54F5734EA773ECE2E8FA3F60F5C686728F2EC AdditionalInput1 = 4A5E0E0397918C5F18E142008D386451 AdditionalInput2 = 5E7133BAA56EB408208FD32BE294623A Out = 05103EEECEEEE8A68562E4C2B352A744665B927FA64FBF40377F53355F1206131330110648B48B9D43D0F6C16939D5A766AA141274B2F75FC7D44D2CC350C4E8B735EDD3B06BCFD97E47B26CB3F7A328 EntropyInput = 9111D8C33F0F585347D51354ABA7AA15BD05FF4FCB058DE3999D6DA3B5DD452C4BD972017B3FA135 EntropyInputReseed = 8447D06C5FDB5CF2ADD77BC569E8944B Out = 697D468ACCC526558198A0D0AF81850BB9910B70518C86A7F99B7B82657966A05C73890C3AF48152045E669AFDCA080739721FC2BDD49F90A1E565A69069236E83E5E1DE6C91BE64020A9A95A2B74982 EntropyInput = 8A7A3C588E6E90BAAD9C7708A603E9A47605045E7460EE0CC30F916B3D70E953D9D5408CF73A6227 EntropyInputReseed = 22680561327465E35874545609F9B916 Out = 58A6B89C859FDB65110C8006CC8897C5173A3781DC7AA7DCA0020DB42B3C1FD5993C1A6D2466E843FC7915BDC7D6F40ED8759E474FD78BF55D58C45A3A8839F7F9DC2C32F870063B8E9235877A0531DA EntropyInput = 33539AD9C4E5644B40EF0BEA8DD9995758D39AAA5FCF7575228E79BB5759DE071C41E8D960B71D2F EntropyInputReseed = 7A2BBB7914614615775C6A62156B5B1E Out = AB910CBC1113226444E25E28ED9DE16B4713D0904DE2F3E7D410E52BEE189540B2B65F41CFE375AF8DF3C22CA2A9307BF2A53BAAD050485BDE30FA517E280AD2D4277FF2BBD575FCEA73D5AF48207896 EntropyInput = 28AC7443FF3F5E79455C35A79C5AC07E7A6987A812C079DED461A3D0BC6B650AE621D5B4D1B9EF6C EntropyInputReseed = 591C8C18536A115FF0CA9DD4E1DAD799 Out = F6A77BE979B10EB649160B1CF2C0A4682D16FFAB2F9F5338AE4970630BD6CA4C0AB962C10CBEAA9BBEB74D71D7B8D1ED36DBA1D49D2FDD1327B7E73AB915921AC910B4C71B7EBBEC7BEC27253454A699 EntropyInput = 8834B1115C1E04A61E9676E3169B3A0D45AD058000EC321E937F864600A1066A5956328F6A989EAC EntropyInputReseed = 91389A9A3F55C68B99DCAFF92E5E3200 Out = 58CC3B24F7A79D6206DC4637805C0FD98B26ADC2E072E0B9DD288F3DEA322E92CEE1E266F8B043F3086615E16A8896B6B4D6FEAE97CC6771E7B6C1714886F1DEF59D8F0AE871B5E8765947857CE0257D EntropyInput = DFCD24F5DE567333F224939FD6E15DEB7EF1CEA8356AB2F512288C4D4D62BFF7CA5175B182C0FDF4 EntropyInputReseed = C193129BB45CD1A0F05EEA41505DE2DE Out = D4E852437F64123D017DCFB9B1482737E6803BB43D8810783477BFC40A82F5A98D1630B21724E8E429C4C8D1A93C7FA4ED0415E7FCD301C1D8496EF69809132C369DBFC4DF7DE96B707B59F03609C1B1 EntropyInput = 172054C827AA895FA1239B7A484752F2EDB272C0A98C759247BC78BFBD1BB7E2DCDBF4EBE42C5293 EntropyInputReseed = 29F92A0E5D24E19AF698877F69A0EFB5 Out = 6464BDAED23245DB1F6510F8659E1B19881D606220997B837684A7F88A166CB75CE6829CB3F11E55D2B7AD349CC1F4BA02E30A76F970613AA74635B0034F8E985CDE4F1FDDB964657A169386E20767D1 EntropyInput = 0D569ABA053F8DCAD1A84635F7585EBB8A7CE1A5D19DAA60FA26519F8284C98A3637274ECFDAC9EC EntropyInputReseed = D79B6B0133E34A821A8748AF98AEB30C Out = F4EC11F81D7FFFC36FA093D2A98C9B659D83D7A6E583736A6EC64E29D7F8EFECD9DFA3623E075FC77024D4CAD16EB91EF1A10068BFE0EF3A94CC6F89183E1ABD62EEA0EEB38F77886BEA94A64DC6BEC2 EntropyInput = 6D9012C3FC9E1F6958BFD685B0C4846771E4EAE5B9134D4DF9A371CD61D168DC35D8697C6A06141D EntropyInputReseed = 2741BA09128B8A598694211F28084BFD Out = A67499A5C3A5554B772F138EB08A0E306C70BE1061B40DD1851AD4BA2078944AAA50496242531C56805C0C542927DA64D2932C9C50E4898ABAF4252C466706F7F57B69BF9EFE7162D7938135A62E8CA0 EntropyInput = 8DBE2334B4489D357B740BB14A69337D45416BA4E9183679BFE05D8B689218CCBA212BA849CDDC80 EntropyInputReseed = 197C7C95A6AA3607546EDDE7DA53C693 Out = 445F8FA6766B88B960E61D36489DCEDBAF73156C53D19131CAC34AA2D2DA4426D5BB49F67463C9C9286C989B4E42F8E54C3FA9872EBD261417B372AC064515B0C9E87A6C0F412F10171A81F67507089A EntropyInput = 447DEC4E71BB163D43DBAA35F6CD242592EC0FDC013D49F88F9A2A68FDE72031EA082EAD98E051C8 EntropyInputReseed = D31DB128BF5EDF92AED173586C21886E Out = 65A61E844FE8943BCB004227807E7B71FEA4A83F1DF83BE942C58E54EA317B8C9FA9F28F5376323583D3DEE622F9A581D43C89B3F0D838B82A7853B7C2B17E2F2D1CE7B3867378A1A656214F5F618EF4 EntropyInput = B3D6EB100E04261C03600446640A1EF137E524C906E8D4772A42A860A99352272E8785E21AD0B9F4 EntropyInputReseed = 285FC9B762510F878D7AB15EDC2B7DCF Out = 01C98734340D5A4CD96BFFB4F204015DD9FC7E5489679C38678368A5487BDDDBDB133A7187B68B7E37060ABA91ECB6A3804F959BD701C3033B0C8BF0B120FCC500BA8440FEA34D475FFBEDFBBD510B0F EntropyInput = 7A5639096FD3A499D42B4B58DD80AFD6AB3E799C89392ED1C7B65D68BF09F4B23AB6F665DD2A75F7 EntropyInputReseed = 3E1419AC5C8A5D9B78ED83C38419F496 Out = 3A26A28A13645CCBDD7EFC3343DC43FE2C81297BD5AC6536DEC587A68B93D1EB413EECDCDEB6151A45BA445FA26867E87E25ADBD9AB511EECAD397D6D7741C60BC5366CED65CB43E4BABBFB91326786E EntropyInput = E36D7AD2CDF13DEBD1417C6C0B9C37FF480E5D38E7C56717733DD2611ECBBA2C77360DE4849F9B19 EntropyInputReseed = 25CD4521CE38E98421F724F10FED6934 Out = 14B4C471C95B32155A0B2E83675115DBA0633FA9CF566B10F9B60B2C4A7393B34F0506582BE46D4A5B034071BD1F51EBE0FBD004B70B3EC3FA6EAE3C8252B5B861F39632EF4AC8DC2A417F6266CE4ACC EntropyInput = 82DF9BAF15BBD613CED8A7E4C54F349FB4946811FECBCB505844DEC944E403F50360ECFE9F3925A6 EntropyInputReseed = D16CCF4016404B289597523873B70AB1 Out = CEFF38465338AAF6B1F5A9F97C662B939B59D05A38067A55885359EB8026F43BC4913D16878E4CFAB725CA4166C75B45AA6139D16FD79A91E9FD23B24481C30C0681807184A2E603E277BFC0EE850036 EntropyInput = 1E1D5CDA6D3293F4DE7024EB807F12215F46AC05C020179E1B73E2538C621CF08762CB1C368217E0 EntropyInputReseed = D9BC5BF243868F4B559A4B34436BE4BBE3D96F10FA2A1A415033C4B590A4F21B AdditionalInput1 = 36CD39FCF5076AA17301F0C0B259E153 AdditionalInput2 = 83EA3A934C69B67F6B1ADFAADDBA87F3 Out = 46522DD83DEBDD779BD680B35C31415BFE48F0FDCC701A2EBBB438D4421E58324B7E6D0F4BD89F2409161E5D0AE0B41105AD0E4610D40CCAE2FD293DE7248D688D8B279DAFAE2A8C6951FCCBBCE7038F EntropyInput = FCE3DAB3BAC8CAC9199E1630B229230A4D568DF3037D9F185DD8B44BA784965D0BC17E7C3211B3A5 EntropyInputReseed = F1631D60FFC666CE1286A695F29C08038D4515927E79D687B42A73170C8DD2A2 AdditionalInput1 = 432B1E35735328EEA861ACC804C85A21 AdditionalInput2 = A7626FE3FDB5094F0A1D749DE9549C3C Out = D84A2A7CC6042A3982BEC2CE097055A4358E98B99BCF8DFE91F81C366D7ECE2BCD9A1464DF3F98D1681B8D413D83AAF229B54CDDF8A030211B281CA9E831B561FE6FD99D0B9AD6FF11000E4742B87A98 EntropyInput = 7E9EC17CBA66E7483A7745A4A5D3C15B3896D9C4FD2B7696CA5336C9B80572BF4BE14FC8B9BDEDB1 EntropyInputReseed = 6516048D51365F4734F0D948100E101D989C2BFD588C26BB38674DA6886B2843 AdditionalInput1 = BD163381C0170166560EE8A086147FFE AdditionalInput2 = B552364E04C6C8549AB1B9F6F8541BA9 Out = 23D0BDDDB6FD83E5FEB7DFF2326F34E9D0D1FA9ED79C3E15079FA6D1B3953C80E3D32DFB693C7ABD0E7C0D100D459420188FB7B0307A85F13AECE23A2293EC41599D0515AC697EDD82A13E71457D27C7 EntropyInput = 5ABFE8FC990659D28725D00DDACFE5CDB6FA3E81FB144375AFD0515E300EF53F1A167D9A76EED4E6 EntropyInputReseed = 6CC1D8974BFBF85FD0FFB1F1058B6053958B5CB335604F7C3D1809818E8DB923 AdditionalInput1 = 86BB0F0F9C5919EEF4DB529B6B54288F AdditionalInput2 = 07610E6A0453E2C3577AACF564468553 Out = F68C7193A22FAAE219AECDDFD4102C3552981D08AEC590747C7E95C8336DC34F226D2AA0EFDCDEFBFDF5EF900C7AB36575F485749D92818EA900F8C8F1D1C769C3B65F2F7EE04B70666FEC2FB4C5B62D EntropyInput = 755110487F412D8559522B7CF4391D80EE693ADE2E7864DB08EBACDA49DEB0723942FE9409F93A2A EntropyInputReseed = 05C9F39FB36FAE3D067054CA17B0C271481E6FED5D0F6256D551785ED4577CF2 AdditionalInput1 = 7DCE6FA8B53EFC1AA5F4101ADF22E40A AdditionalInput2 = F35DB0D2E299BEBF1C2987F66575634F Out = 374C7724FB997D64A78A60CFD8B1EEEE1F68D5557DB892E0CA781364CE36B369F38F046EE49844A2AA07DC842320CCF72746E28C08EB378CBE6175302EECF4436E85334A0712C30168D50D10C4686C47 EntropyInput = 254EB62711F7EFA58A2176EF11D209E901F2CCC33351682527C2FBD7D49BF5139B74AC01556FD21A EntropyInputReseed = 8005AAAB0BBF8D1E1AC1D7BBA1C5BCF82039D9F82DD7F8BEA4EC3A0572666A4F AdditionalInput1 = B1A5F3C75327CCF5257CA62B6DD1833F AdditionalInput2 = 21FC074DAAEAF20D6447F16A669F4622 Out = 8F7165D2FBB95B6D295016A6E50AEC7EFA3D2D8DDB68DC772B4AC4DC8E907527B0A0D6C5CF0D4A2DB3873D1A3F5DA9064F50611B8B344D5CE06D73187ADBCFAEA2C632D1DC5E3866C39941896DF1E873 EntropyInput = 77C747F76B5A4D328F51B04742E778043D784FAF80A6F0892D143040CDBCC846E19D9CA2B647D58C EntropyInputReseed = 9D9E82EBF6D74CF8E722495E03DD87B1A2414832DFE9980F253ED43D9FCF9A2F AdditionalInput1 = 0A5E985C92C1D2866A9C069BD4C983E1 AdditionalInput2 = 3BD01AF26F38C2DB3C12AD73CBA8BF84 Out = 86EA3FC84D1658405F03505EA0340ED17F28C601B54DE43C5E0B72BE2247FCD446C80D80AB418B501E50462A1F5EFA039A43B05B0E8F8688F3550E4C136F7B0B4E250C58E392303E62EC2AAB731272FA EntropyInput = EDD342C885718575492D2BEE9052CC148826955C8ECA9AA06FE4EC2852EE480A2DC8DEDF1906B095 EntropyInputReseed = 84ECC71790C71E9D7D55928A5097473740035F845F050905DB9CC97D74EC09FB AdditionalInput1 = 4C52F375258EC76BE537AD61AA96B5A6 AdditionalInput2 = D7C8C1905034DEFE16FB028E365DCEFA Out = 90D64714BA11ABA3777865DD1AB6E142E6BF89ABB9A2B4E5461F2D454558575968641A536FC542F218C82818FD7E8D7AE0BAC091BE051E8FBE116C4C0CA8C1C999A8F7359EBF5FE7A319AF932E2B5A9A EntropyInput = 9EA41449A9484475594241865F05D07F42473787CED7D5C00BAA8DA8418BA9CC2C00D6C22B871620 EntropyInputReseed = 63FCD2F00CE6ACB2F31430B830D3886BF22729124C7649545389314E8088DCD5 AdditionalInput1 = 9E15FE5EC79025D52D31ACBD9A53B0F5 AdditionalInput2 = 4420B819060B699156327E5C1774C119 Out = C7D6B1071F9C1562A8A4D6BED341E6AA837504F1E4C96C68CBEAC9E9FAD5E598809F2DF37AEE1D240A6F8B9475064A578FE15472D2B400BEFE1FAFC8C83E7F56151B2B83259E6012DB28EBE953E56003 EntropyInput = 98F4B367616494D8EBB3E4DB1E4A03104F59F11F5C341C13C1BE30B13CBD9E171AECFF500B2FFEB8 EntropyInputReseed = 1DF32B7C84DF7A6E54BBD046C1EE5BC490161B12A6570EE4EB3821FDD7898AE4 AdditionalInput1 = C4F8DE88411AC77637FD8631419D3EF1 AdditionalInput2 = CCCF6995F86B9A32800FB2A5CA71B804 Out = E650F2D90F589F70D171AC4BF25F361BBD99F4B40A48811B30CD6347F4D172E8455C03DF447E790282FCDB25FAA886C57E2BB140940DEDA0D8A566414F89998937925020DAC9143AE72CBA1843F5F4D8 EntropyInput = 16F35BE8ED1692B2BD01194D43BFBBBEC0BFA774321A8C75A87E29D8E0A59505DAC998E2C2D56C15 EntropyInputReseed = B9FE8D749A0DF36D18A22CC53F99EBFF89F922F7D5F45B02A8F7325059EAAC6E AdditionalInput1 = B3F45DAF357417BDA85A8EBBBF8C51DC AdditionalInput2 = E41FA5D284F081CA0BAA2A40EE38D8CB Out = 1B0F1D8AC677FCD8D4B8F38D4DB3145948BC5FE39AC4D1BDF1928B66ECE4B5639AA2E6408CCCD48530F6433F5BF92F2E5C40DF28918D27EB5E06B517038C0B2B1CE7A474FCBEC07A40E413057862DB1F EntropyInput = 233DA224D5F22FD48363C1C14E046D68FBE1F9A62E90C1C1E690B9FC7C63FBBBB8BEBD6FC230C767 EntropyInputReseed = 0A8AA09FCA433FBBFA39FAAE0AB5763F9D73BD9A910C44DE41BC0A0B1ED9CFA0 AdditionalInput1 = C8944F8B2E1703CC494A075F90630C0B AdditionalInput2 = BD695D7F88813AF1E81765D5F17B01D7 Out = 15249B160B931F4A17EFF12F81E1A0D1DDB351C61E10D21271375A68719F5561DAE7DF6E65EF1A9E84F16A09E76D678560791F0724D34D5ECE63B4AC10BE5CDE7915C2B3276DA0BFA594E1EAAFE47414 EntropyInput = 1AE92191923502842EC7B93D6243310D45614111C97BA7CE3A3A8ADE9222A9D42B743DFC0438AC36 EntropyInputReseed = 6E1661255EBB288D7C7F07BB87D525200DB2B7302AC46388E6535D040182B729 AdditionalInput1 = D7BD870867F72C8BBB1EF6646193190F AdditionalInput2 = AAC76DCE6F5A0EFD372438C715A384EB Out = 4D46123775EC4A516C9EED4B4337F2FF08497AFA096196826CD4F6676DBCF8A5A6C2EA4D54456A4C86EDBE35A75AD363439194F064ADFD275FC0D6645BC91BA7584CAEF58943E96C0B485A7F30BE6DBC EntropyInput = 21C768D063C60080D4BDEB50FA79F20F77517BE52353A2E37711D605B32A0F14DACA3D43A452DE43 EntropyInputReseed = D1C151F02DC34FE2D02A9E82D3E97DD7B8BD333DD26746BB50FB7507A7E599AD AdditionalInput1 = 169B17F98CBD49E015115E42C754CE3A AdditionalInput2 = 1FCA530FFCFED1CA4E4F520868972F08 Out = 73A1E210668D5D123BD5F92B1B5B651B380F8284291162290EC154CBEFC7C3DB1B7C105B009504F83FA026B8212AD0D8E0512F0905D3FC4CB2341AC0F1D4F1664CE09A69116C544947E4CCE4CA461729 EntropyInput = CBE58DA81E9FF08DAAC265B2BA2716CF484DCF66C37E2EF78FFD79EA799D3E8B28EA2D341A664E4A EntropyInputReseed = 38143CC8773A4209F3CA13DF4AE41EB5FEA3253193AA696E02FA906E4B7DC272 AdditionalInput1 = C7CD5C4DFF9371C0DB3851C0661B5B3B AdditionalInput2 = BABA7B03EC47AD164956EC6C6111E0E4 Out = 41E088839DAFDD32B69269CE8F38A11ED7D5D619A99FD3628B04B75E4E5E384FA67E447B83DFBECE277FC004A3BDD39E64461C95B84C9D6347CDF58525D83E882D2DCAB4BD8E6D3F566EED585DD19BCB EntropyInput = 3C1F3A98EFDA9FF1B29D158892065E018AFA6DF021BAF5D6 EntropyInputReseed = D8DE5B0CDFB0DF0D60127AD3ADA13ACB Out = AE577F99743480E39138C9E321B86DBB0EE91CD2422D21FC6455268859803D7C4DE5D777DFD6CB5F75742EFB1E4AD7B5373F677ABD3A51F8A1FFD569F67CBC65645184B9D1593472F2409D49C71BAF81 EntropyInput = 4C1498741C78A3234844032E07B4673949F8849094CC499C EntropyInputReseed = BD32ADB6B4BB57EDC0CACAE3E6EBE9FC Out = 05D71A826461765ADC4CEBEF9560D7DE83F10F8A01F697DC7C35BAD1566D19DF668C4E8798510D293CD3F58F2EB67D19186AC8082C62250D6240678F27711F4721CA5AD2408681E65A1A75302DCDE171 EntropyInput = 4B85D028724EC916B7DEA5D1530593FB8F174E51704DD5BB EntropyInputReseed = 8DB390A9088775C342998283E2F50709 Out = FABF6224E12A0B01928E65E1F0CD2BF7286E766BCC3A2F3A8BAD75A4422309F62608B6932BB8174B7DAFB807F6A06185E610738E67F809CC5CD416F7214D781DB5A5F95A89914223DD77A9FB7E3AA481 EntropyInput = 2E5310353910A6C931F7B9CEF0E9758103A37B6CA62EB62B EntropyInputReseed = 709C8BD5DD954BE90D53C1C40AAC30AB Out = F8044B599FF2F1DDABD9DE8169E7A4F82432808EF0BBD788B9C87A01EF4D498DEA320286439AF6986006E09A22FEE877976C9D3A5795CFA9B89EEE9D5BD337B4D57386A9EB0469291C0A50E047B31C12 EntropyInput = 771B07F7D4C53E33BFED333B2AD69F0CD6FB55A61E0CB63C EntropyInputReseed = 529CBD1F1C5FAA69EBF86A4796DB46C1 Out = 74459D2A69BC9B9B1FD460C10D842CA819FA9F07815765674765C27AAE625CEFAAFCA8D4F0936B6F4A9C5E043563AFD45CCA00CE85F1CB49E3B65560D921914DE4644FBBAAF188DAF32EF511BB196348 EntropyInput = D81C78895236DF02D7BA04FB873CA4CA6733E4503CD69554 EntropyInputReseed = CA589B755627817454A2359CB028EC20 Out = 6E963709EE5ADA5DFA21852FB30207A975759E57016DC8D00930BE6B46B02C8C91C1E77B15E20C55041C172D027067864E6AE8FF8937ECE4CD3F183EC464FA80B21376AF60A560F2463D74F2D09B9C14 EntropyInput = B1A19BB07C30CA4F49DC69130D23C0A72C06067297058EC5 EntropyInputReseed = 840802CEA2E55A3B1E487BB7AEE62B42 Out = F41BB7AE532344A90D413B66A94EE1D0254A5D5E974E36B1993B1042586F54728D1EBB7C5D351558ED675177E432360708C008984C41BC4C828D83DDECA9EF8ECD9DA880A135400A43F91F4CA6D59D00 EntropyInput = F25C7F0A1DC4395F858E8D7E9ACB257344FAB1CC03ACB43B EntropyInputReseed = 3B131851D062B3291CBF967947962882 Out = 8235F6813989EBF914811067D490E85EE066FAA9DC6E55763288B44C5EB87BE83BF23EAB826FF1886A7348A9B47584E84B43C3A60C8C6CBB7D47686EA590240E29DE5A7B4E41D0F06367A264366943E5 EntropyInput = 709B3F42DF070F7ED87CBDA9864605076D65DBB19581FAB5 EntropyInputReseed = BBD62A7775707B4336650FFA37482637 Out = 5326D763557B7B0BE6A17191098344C2C92B7B00534814941D934688196B2ACD838A5D3A71AE95577E1B8E9D00ACD79F58675850E9B5704F0D7FD9492EDEE4B4A531AD120693E3A0960F9EBAAFDB81D7 EntropyInput = EEF32F59DF7527A93FF0C576B9A2843E5971CFC87AA7796F EntropyInputReseed = 96CAE0A5F3E940B8E773C334A0474597 Out = 87C4117A91641A28ED5F5DF41E8C9E3A8ABF43BEB9FA9A4929DE15CB7ED7D1644E8DB821146AE33B71720EA5E1F8A0CD71E821EDC0E8BD38F92AE6AC9EA1A6600BB22E2325326D0C68E29F7DA8DB6B5E EntropyInput = B8B5583A9F8E5F83D93466451A2C5B06057028D22E323836 EntropyInputReseed = AFC0AFB92B412867421CC77E68E07E85 Out = 06E267145C475D8BEBF42949A99B8D9B144664DCD5D26A7F40D7C39D48AE5DC7359EBBF62D91A2BD2E2942EEA7B8733610A157C625091E41159C9BFDEA0FD50965009449B8A09C74EFF7E1689D80A38C EntropyInput = 576B7513D4DA71074D7380ABCF88B7748FC866F10E2B7F19 EntropyInputReseed = 68331547280DF6BF339E37C115A24D7A Out = E71ADD18C6109A75636AA46F510DB8936FBE37739599D5C67CB63DC6F0DBFF62499C0903072BF4BAAA1F323BEC9E13BFBFF006ACE59CF84D66A05C5EDE372AD9DD69FD37BD7A543ED7D7A9FF1ABC5767 EntropyInput = E8BFA2ACD2CF3188F29880A0A699D271A43CDAE521BCF155 EntropyInputReseed = CE8EFD591897FCCAB85F231E2787661D Out = 07820587F88C1C84182C7C3AEDC6B2402E460E732DAEBB690BF1E3F70ED1127A736928AAD2F80FB6559E5AF3157EDABEB956B5490C16E1BF2997688A6D6D30BA2D7CBB34B1DEDECEED381A38E8FFF904 EntropyInput = 3E9FC7603A0B8AD62CA1C3E318DB0593DCF11E6BBCF78825 EntropyInputReseed = 39043AD3DCA8EA9E0AC9C28948049985 Out = 26F7EB7EB7C7149D143B4858BC1458D3218EBF3B5A86F66FE760636DF7F70D73C6C79467DAAAC078CE8F93E9ACEA615D4FC5D303AEFAB289259E3DFFA85635B8D366E3ED9D0F342DE2946CC44B144808 EntropyInput = 7D49932FA135A5EB585B3CDD968DAF99FF0D752E2B72180F EntropyInputReseed = D955641750A7C3A81AB6F8BF93EB2393 Out = B76301ED39E7BC1DD285352B58A4EE546CA612B29109D870BA41037BD20F44618205447597799E494C9045C58F523262FD8691BD12CB80CD007348FA282FF67A974198C54D99BBF23C25E7AF471DC85D EntropyInput = D7584BFED6668BA79F79624AB4E373FBACD5005FF2FFAB2E EntropyInputReseed = AD42C3CFFEE2F44E6975B1DD0C613C47125D6314483914D74225FE90BE341CE6 AdditionalInput1 = 972FA6292CE39D0196EA4211E12D5AAC AdditionalInput2 = CCC1F3D201D1B3A1FF10805770FB8E83 Out = EE952B20DBA4F0EF374223383D085F829B4C4EF9B7E55E301770ED57D0AD28B5084A9DCAB717AC2CEA58C0003F0246D4409B778057555BFC4311D144375A0ACE29D3FA16F7105752F4746B6027DFAF29 EntropyInput = 2A33E98FBD7F36CEBB4598D7C54F5615F12E32641AB50551 EntropyInputReseed = 06B22AA4AA4AA1D1B5B4ABC82E2B02EE38C620994BD843814C09C71587CCF6AC AdditionalInput1 = E6B75BEA1AEAF4616D771D35B5C67488 AdditionalInput2 = 39E65C1292DE7A0E7CD95E38A3E032CD Out = DA1A2C22F054A841F240A002970F7F37970AA1356B77365DAA30D89012ED0556E80589265E88458EA714896197010940F1D4F2112FD187B39C270F8903E12A6AEC8B2BF19FFFBBBFA794AEC47C412312 EntropyInput = 8DADC4362D04BE7328F8E78E46568C14E75E5D6323A277EB EntropyInputReseed = F53CF01EEFE563EA20CA980861F52B84C1480B5A4BD392316BBC8DBFCE178C0A AdditionalInput1 = F4A3BA1C55CF2B76FD435AC8273FAA99 AdditionalInput2 = ABCFB701C8E9E1A6936D76F1D77F34A3 Out = 9A68BE9B5DF628D8FFF3DDC591E77FC641F8B21FD2BE55448E30042CB3B5C6D4AF40A55FB34B5665C7B0B6553239B4FAAA6ECB905652B7421E83E6085B183FD1353B3086E24C639D94A95E82D6EA6D60 EntropyInput = 74EBC13620AF9528A25C1316A795476A57A99317B4589C20 EntropyInputReseed = 0B1F7858E6B57B7274B823AA0E95E56B27B9221A0C6A8F53F818AB90DCBC5147 AdditionalInput1 = 98DAA18240C9E106DBAA0D9279AB8073 AdditionalInput2 = F22D1220527C1DA12743A95843E8D01D Out = E052F7ACBAC035CF42708E5300278EB377401CEE7C32D812F584A953875FB1C05FC0B3B4CCE739D9DD17ACE0C23EE82A027B9DF97DE560B796537E3A0A8A4E697631A25AB691182CAF1D9E342404369F EntropyInput = 89E1CF969338D3239BD9D3EE71A161D0964E647BE9B732D3 EntropyInputReseed = 7FB5997AAFE82D3A38E23F17D5121EFFB59F7BFA518CA93546C64D9E005084E7 AdditionalInput1 = 92C9509D49F282BA0082723999460ACA AdditionalInput2 = 14F3330CC11FC9C179D716FEEAA246BE Out = A5E3CA29CC3273533F5E38713CCC4EA557F66E8F38E12B3B0F235337E5A2D655AE7923972CA2C0888DE5934489AE77FA5B589478DC09FF1B13E814912B1770949ED39E602DF5BE539C756305874D320A EntropyInput = 343F9DDE89A9E3ECC4F9653C8B392DABC4FB3606D8F62DB1 EntropyInputReseed = 021FC3EAD46FF8BDA3B79701B7893A398918831E15D430616F4BD91046FE0930 AdditionalInput1 = A8772304A1ACCB16662218A748BB4FD8 AdditionalInput2 = 4BF9F2B9D15EC3071FF3674AD7418759 Out = 9782B2111C985BCAAB0B8905AD9BCB97EB3F3554C68D79EE5CA1DCFBD0D7850F65090C79D21D1C6253CF493F08392CFB60461FBC20BEB4CF3E022123816F0BC597ABEBC775633DB324C7C1C7CD5E8C56 EntropyInput = A27CAE591E58A47DD3CEC93964EA7FA4DDF82254C3769154 EntropyInputReseed = 0845168C244AFC0E5216FEAF92593BB710A6464B48CD350F5938C5DFABE82B25 AdditionalInput1 = 21D6BFE1572491425032B4E3AC9943E5 AdditionalInput2 = 630152A0D5D4FAE7881A2922CC87A5CB Out = DAD0AA2CEEAD492B14254E6C69F2EF262413A0AFB7BD011887192BDD27747C8CA449AFAE3016AB8985A231AAFB6406D9BB6CA660C1FFED28BA286444C2EF73D2FAF76C4FD185A3796335CC5FAF773FB0 EntropyInput = C2D755246A53F0306DB8ED4414B160502C886CF18FAC7AC4 EntropyInputReseed = 43D083DC705BA8C5D60BB1C6E7572B5DF02DD5294F3AB3D95F99C45B69E76006 AdditionalInput1 = F3BD6DA645F33000F24382E965982400 AdditionalInput2 = C3CC5EC38EA41FA8DADE394E440AF214 Out = AE4094ADEB93B4F564445FCCD05A3D829DA9360B55D51D9480D2F3C8AC0B5532612E805756BCCDD61526F162D8B909FD72D4FFFE7BBB98A74BCC26447046FD5869499A6338DD5E621D42601EC34D916C EntropyInput = 04935E32E0FA6E8BC5BF2F202201B11F4C407C0F7E5955FE EntropyInputReseed = A2DB8D98A00865DAAEEDD2CE9557A2C6736ED37A8B67E0D850299CA2BCAA9C69 AdditionalInput1 = D12E7538FAD2DD0D79F64F8450A3BC55 AdditionalInput2 = C8BCA1E640740AB265C7A8DC5B95A5F6 Out = 2CA4D9454DBD6E905043EAF6A2B39F3832BBDEA7DE5ED2FBCF0BBBCC9149F07D3DEA128216BFE1A944237C8E82CE68C01D926D8DB80432BADA9682D70B814B30774A21C5DB49A9235A75054980DE059E EntropyInput = 3B8DF3B9CE4C6CD85971EA346DC475B864C42BC0C69A371A EntropyInputReseed = 22A9A74697007108409AFFE94422CA290B01058B042CFAD010662DA0581DC06B AdditionalInput1 = 6F64DDCEB26065FFDF3A4F848C968D8B AdditionalInput2 = 1C1D78EAE25CA92971E22F6F872CE185 Out = 81F3C1955001A3878FDD606C13EC6EB788A6669AF45C8DE523B5C996A5315B6F5BCE355F6F3F92DE8023B7A13166D601F2530018C7B69C88935122D5807C1DA4BF66BFF08BECE5CCC3822ED170CC181D EntropyInput = 5BFC4235A9949E8C9AF0D79B9CEC59EA4491EFD080BF5551 EntropyInputReseed = 113611A8CBDBD1DE100091CC24A376B8D6F7E459DB30684FF5D962536A4BC353 AdditionalInput1 = D6176932B48887EF5D3F4DC7EF441D2F AdditionalInput2 = 842A5FED0A881B498D74CDCAB579E239 Out = 1AD672ED898E9F5F92F12850835F0A4C24B3D3301277E29D05BBA843E0C1568BABC997E99ED37F8559C70EFDAE17C8D7731A6B55EEB9DDF42FC9F2CB0D38128A1D49F11FF8DDEC711E64CECFE20E27C7 EntropyInput = E862AB31FF987B5BF83B71F361DF3531499B7933108DDEC4 EntropyInputReseed = DEC881C7C10FBF8B7E6B727045CB6F6E18FC60D470C1E7C97D002405AA9B3BA7 AdditionalInput1 = 1DA15F945D0993C9DB0E14A982DA3BC2 AdditionalInput2 = D6781B076F68B4B60D69493F535AEA84 Out = CB618E1DF41B7D994949F40A57C188B0C9FEAA3704DA2D82D0E73B262499F142B379C4A3B7968C4810D2416325C2813D764D4FD51703B243BFA81FE481A6C6B125EC5364CCF2D10F28EBAEB9D31D3B45 EntropyInput = A17628D0B9D10A89EF163595DF64897BF83EAA42A85E1209 EntropyInputReseed = AE1A44D6C7C346A4032A58C8583F1F7407AEE61DBDA8EEB671773C2598FA7532 AdditionalInput1 = BF488C33BA1633D741A8F2B5D763045E AdditionalInput2 = 44A8EE13F129D95EA956D719640BBEDB Out = 06B12D8133A1F762AC751616185E17B1E90D95B2B33D0F8CBC42757B8B29A65496D5CAE5AE16036A5F95CE3C8706C4D5CBEFCC1DE84C5586275F71BE332392FEF321E1ED648A40ECAC5E048341C2015F EntropyInput = A4AEC2DA71A64F7EB07FBD89B9ED03FBFD5ED0FB9FCDFFBF EntropyInputReseed = B8DAC4C54A3093C45784A0DBFA218D953A0F607495433626666354EF5AD902A0 AdditionalInput1 = 638161DCD137748533D52B81D5462AAC AdditionalInput2 = 4660868ECE630624AE5B8FF674C34E89 Out = 69AEF88B6396CDFA592F012ED0BE0CDA5A78C02E077096F9A67F1DD4501E4AA7A1B37CE3AD50B111ACC64781DB4EF94EF45C3E853E481E544599ADFBDDA9AA68941E474F1E3D49DA24E92019117D39E6 EntropyInput = 420E9CDBD0D7CD81D227389C7AF86353943B029CDDBDCA62 EntropyInputReseed = 822052FAE3B9A10C87F3434338B4742D157CF13C57FE05CCD04078355EB8217D AdditionalInput1 = 22267FE260C4F865C9DAF5F5E96AC0D7 AdditionalInput2 = 431BF75096170C3EC07C59E013280B20 Out = 1DD3B2198A3A0BEB0A17F9D784543A2AAA9D5B02F0E2D5544B1F15D12BDE12DF676BEEE991904FB896BE6F69A9E398AD4CFB72BDFDEFEA6CA1717CF4980BBA0B3A66FE3F5413475C889DE35346CE03AE EntropyInput = ED1083D61C9F5AEF470EAE91E539032DC3895CC89D019570332C5BBE1F3A572AAD031584E585EDA3 EntropyInputReseed = 5658E4E165CCBA7016B2496BFEC358EB Out = A268C24D9B459A0AE48590874AA18107BC2C1D49ECF20AA1AF4EAE57CA9B8497C27DF43325037112A1A3B72865974A59E541688C8A9B09B25149D144C84E70F30B9C075CDE12BB3932F233ABB637B7B1 EntropyInput = 74600125ECA2CDE01B9D9B0AA8BDA45F10A61DB6699526A7D51C87B5F310446756C045A1D8CB0E6C EntropyInputReseed = 46A8AA3175DB7CFA39C66EEDAC4470BC Out = E869F337F7CD7AA8C9B008637C1E6DD2952D66B6470029B9A111E51D6CC37BFBF46C53EF6C296A6C1F5708C6792C5ECF4680AB6029CE18D65EB549F5A73A02617DAA5BD18B510F87759B6868EE241FF7 EntropyInput = 226EB5BE121B9245213D59258954D319D16E8EC046EF297D848738276A92BAB16D320173E74DA6B3 EntropyInputReseed = DE1DCF265F8A9E9D508F5FE52B8111DF Out = 93F9EB9B0693A0CA70C7AFAD583E0586BDCE0787227878765A5DAC3B6FF17B086EC2C9B7D2526400DC0E8BD691DCC17F1B7210013037742973E2660F914D85FD7AB17CD0B2C11A7009EC2A423DF5C81F EntropyInput = E7AE41A5DAF64BB228CF9A0E6DB7191841219A5F3DEF9F0606894767743B014ABB137CAD5E863CB7 EntropyInputReseed = 5D1C05376EBC01A20546929482F5954C Out = 1D4824DFD3848C8802461877A86F1C2B59234FB390C649EC338749448246359A56C6E214080385D1898D9B0E5B520E380A23800C9A18C9AC289C24F82906AEDC6647D488E56E902A620F2A86BC6E00C7 EntropyInput = 5D4CEE56DBDF57AFC3340B308C4FBD9D0B52E9934265EF21D5A7A695F27E1DB070E9EBECEFFDAE4F EntropyInputReseed = 0190983B394F83A28FB2B6CC8EB78E85 Out = 8BEDCFDA5918AFE9A132B9113B69A6B2CBA4BEA0B8D8846F30B2C86BFE71B69B26528BDE1351D88604391B9F305B2E9E0156CAAD7B8D980265CA052188A14477FB12D2D5D0F1CE28623DEFAE576F332C EntropyInput = FEE10AAE77B9DE4D3C603B85B7F38C0CDD9822EF720F3DAA0F917459C9D26E13CAC5A6ECFE710809 EntropyInputReseed = 1DC9CA87B6BBADBA44CE5653E556BA58 Out = 61E0E3EA3FEB99ED7427919352295184AB9E55125127C73C58577CCCEB607547A1C5EF4A5705025C8EA1F3CA1FE63E39CA1950DC8C101B94CECED4009FD8D542E82D314BDC01A49911638404CFBD2D9B EntropyInput = 670515A13B8CB10CA73E3DBCEA3A6E0BED4BA7500467E152ABF6B6DFEB44A24D09E72F6937E76080 EntropyInputReseed = ECB5F8A70BB327190654BE0FF5CCA42E Out = 06F32B27D914832DE13AD66C9C8F93B2C5C60399B316AF1A892149E1BDE883ED6218F1FFFD661CCD92DC698F5C5E6775763339D5992816F909704D509E59414ADF0033F3A11FF60596FC0A285A2A5D81 EntropyInput = 950DDD2ADE0AAC34D4FCD864AB314D4410313C4E6C13EDCBEE63A064C76CEBBDEF3DFF6BE4D9B058 EntropyInputReseed = EB7CAD7809293DDA70F67CAD432E1AEB Out = B1BA0665D292161958DC9BDFD65B47E927BDB5F150CEBB15D2D15D058406492016DC2F7FDEC3851901EADA8D59BC9940753BA80A498E3699B437FDC50D45578F054D7BD56536165C6F3EEA695658BDBB EntropyInput = A13E3DC6D8EA17733D298538131D3812DAAD23D22E2B2D20E6E951FB0A33D7ECB77FDDA0297E06DD EntropyInputReseed = 469FDE41CFB1699867504E3A23E82AA4 Out = 0C000222ED7ABA82AF189E5AEF911739573D926CC98769801A57F075F20EAB1F54B22CD0B53814F725B2C6862877D2FBE63975C9AED446288620822E6DEE077B72942E61D87AC32B3BE9905BE6B2B930 EntropyInput = 842FA32FED6FA399144250572F6C6DF6121DDA73DABAE534A46F727F8A28234214A1199F758A497A EntropyInputReseed = B67F6A9E83B7FF6A499D25277C449453 Out = 5E8EB6DFC74D9366B5BB1305FA82751818E396441C3D2F60B09518342F7D1B367ED7703C54BD081D0EB4E85AEAFE2F68038D1099EC2547D7966AE9E181D0F63F57AEEC40E99D96CD79A887B37763DF46 EntropyInput = 3848EFE942EBF082AA82016D19C3160E157F5CF67CD0D26357688D5F282EAF67A500FAD41B7D3B6C EntropyInputReseed = F893166384FF25D34EE1E3C420110E57 Out = C81F97CCF795C054FDF2586346649DBCC24C872472E19631E81510BA816458408F46FD675DE9160E5D7A8E48A5BEB095712A4358C1AAEC09AB1A5AFA7C9FAAD02D4595824A4669C5EE0D26FF2FC19AC7 EntropyInput = 11E284100433892418FD1742FDB0696CF95BD384491A20680A0D6CAD0A89F402DB59F6273E672997 EntropyInputReseed = ECF47EA987767CD84907C218DFF84F14 Out = 12262B4A3E0F3E3C8B7AA93598930CB6AE41AC3E1CB7CDDEA9A29E542E4930C97A2442212FBB7639BBB0DADF482C0064318344D95604C1B294976A31228BB232CC9E8E3DE47F8B05006A3A8E797F1465 EntropyInput = ADF06E13506A1A5D07984A32B67F227E8C425FC1B4FB1874E810DE40434B447FDEFAE74DAF65879E EntropyInputReseed = F9B1F7ED0399F5ADAC13F000C151D5E3 Out = 46E89BA929DF0AD8F1C4FADB177529D4589D0311F03B40231BD61C4C53EEC3223381F50805999CEE68DE34993ABB5984650F85C33287A54230871BA2BA0DECD044B30491ABBBD5E4DE09902C5E4BFB5B EntropyInput = BEE72DAF3A1EF5C777535EA56408E5EF5FC8914C05E351F3593400D041A4B4D6FB79B822DDBABD38 EntropyInputReseed = 73F7965057401D3D09BF00C2ED44EB1B Out = 5D86452D676571756256E2EF939A1A6D65BED74A1873B8500ECB5F7EDA332C3011E20EE91818C39C38BBB645BCBDAD6A36FF55DCE419543D8FE48144FB6FB456E219D05492ADF71C2321AD77676256DD EntropyInput = 366338CBAB989F18525B91D2C75E6D918AA9E6516F739B4662FC1A2145D7C72DEA232FDC9A82DDEE EntropyInputReseed = 7B4CC3D5FA5547B4FD198F0BAFC1984B Out = 3503E5F10923E6D34D2C14FB07148D61A2AB52EEDF5AA8610F5F13890D72CD8F475A6138D316027F1616BF1EBB4730A3C3F91DDA46569CE7ABE7297AB00F20F1201B24F2F683E0140083F3D38D81B5BD EntropyInput = 36D491CFA97687764314F65FCD5D038E6D47568AED67D1DBB5BDF7F229D7BCDA91D8C0A79B87D9A2 EntropyInputReseed = 1F99D67653170FEC17CDC1206DEB62D764FB8675AAC3A93E981FFFA72A8741E3 AdditionalInput1 = 78D088E9DC3028E0524C2248F6FBE4B8 AdditionalInput2 = CB61D8318591E2B76B9CC9E1F3FE5446 Out = 3A58D1E2B3D6B8E1ECF49FC7335DA4B93B9A301082C2F8063EE8D65E8A51D1148CC9638434718A7A80FAD09296EA722A4B0646DF0AF09A39AC8FB90F25B65C99CEF4D4F74F86A067D032DC4EC95E3213 EntropyInput = 922A3E29CB9D2E9FDDE0F5561DF37C2FCAFB8D16AD854999D9A8F3D2E6A6C360BEB72001F9F007D3 EntropyInputReseed = DAA5A3461CAA5EF65E98FF5441BEB6299E35513AED59B96A892C8F55F7EA5E52 AdditionalInput1 = D26764D54F7855ED4B6549879B9578BD AdditionalInput2 = 88FA64AE00B0F57562BBD91D8F3188CA Out = 90ACB2D03298902B4D7096B1B2627EA767999FD2C14E4D21A44DE335EAA7BE71DF9134200180ABA8FE7097B21B90CCC3EF86D506CE80D5B59DBE38782266F9E5AD53484F7A49E90426A2E2A789965D28 EntropyInput = A53F834505D74986EC6884507CCBE67EE2F23D6540049A2D4CB100666AD3985D3101D7F7BC2C5BA3 EntropyInputReseed = 0CFD23565C886C70EF990D2B1AE2FDD79D5790B0804CA4BEA71EAA0E3D602706 AdditionalInput1 = 172D4C0EBE11A5D72B3CE03D8D550F6B AdditionalInput2 = 13C04F8A079A83092CC6B5FA1A091159 Out = 1C7D94555B982AA152A6D4766665254216A687AE8C5DCB982B71BCCCD80A439E27B08F8AC3C538E728772BD86DD0F6622A4D526E6D85D21E218999E0AEC2809F6A5FF96BF4DA81FBFC50E9ECFC2BD9E7 EntropyInput = 0A086726F66F2AC9E7DAA61908F63319DEBF011D406A5B2358582DA74F8F91DB0444BEAE39016857 EntropyInputReseed = C92BA2900AB0A4CA3553806392B6B3E55604A76E74EF4B304466F21DF57C70F3 AdditionalInput1 = E1E4D0754CC306A1752B50C5C446A3D0 AdditionalInput2 = 71DACF61875CBF3655E4F7D2E081D493 Out = AFBB3A05E753F6EBF026594A03B22B3F032EDB873B9E1E22532E360A097D7E0D4585BBF82F9B12D7A88630EFCADEB8FFDC8B7C8A53FE94EEA9D2CD6CF90828C3511FC936222BA845FC77995A03855578 EntropyInput = F3126E1D790C5C5A3AB11A4B359C15599E05641C2889EA6A47D59BD1CA69B25A70229DFD99AB14EC EntropyInputReseed = 98009BC10EB032489E2107DEF27FE44BFACB973B942C25CECD6D0D525FE59893 AdditionalInput1 = B15191EC7B4D920F0577FA4E1CB620DA AdditionalInput2 = 00DBE09B9370410A8AF66F52E55FAE7E Out = 0CBDDBF622FA2161C9DCC2E11D8D8DFF99AAF62C5E49F5932647D2349EC1AE73D12B5AFAFE6E99B9425BFEC743A5A7A55C80F5A2DF9675CB0A1D5C68D40A0C0E3E623F1639674C453235C39E2564A5E8 EntropyInput = 280F35E281F8886E4308EDBDBEBB7A5C8C727AD1BF01F61189A50BC7A8EFD2D66FA854A5CB800AAF EntropyInputReseed = DDE9E59EC35BE3D647F172C496EF066308CFEBF0F55DFF3DC46A357D77A528E3 AdditionalInput1 = 8D32ED6752A219D8710D34F9534C5B2A AdditionalInput2 = 18F47CA4A33D573FB64B4B325ACC3913 Out = 8ECE1B02B6E3AD95AB0D76CE02D1FEE090EDB64A2286B4C2CAA5F1638C48AC3E2CB2740EE340EBD90F66D326BF91C92510C01F6B112F4D791FBCA39A279346B78A50C7C6C4662B9C3F11D4E90C103B9A EntropyInput = ECDCAFE914E7AA28EF6D7960E8EC20384F595EE68EC8F304E8FE5EE4CB6A5FCEE7CFF51687275577 EntropyInputReseed = 3A6047087B798DED13A55E7FACFCB6DFAD11464632D4D822C4D08325A5942C0E AdditionalInput1 = 64E0D7DD50FA8EB82A6EAA8A9590D82E AdditionalInput2 = CD5A82B4E3DE0825F9D970C3A462CC5A Out = 53B984E220A0BDD2F43B6FD8989D47DFA86C325B0D87D178E1D514219B031F481C8FEAF9462C5E580B9FFE0AC59C672E0E3F610EA1ABDC39AA5FC9F0010029D4C8350AAAEC27BB859505DAF3CB3D4E71 EntropyInput = EF7404326E7ED8895912D1F91391DBDF6A8623ABCCADE8CE441937F2478C9F1CE7287EF2547E1587 EntropyInputReseed = 0C7FF042F078998FD0A58D34626868AC7A9AF8958B5A35F0235425A55BD91DDE AdditionalInput1 = 3214ED59A6A688254A694E26A223457E AdditionalInput2 = 06F141A32BD30B6F69DD3E6E541B0FA5 Out = 454A2056EFAC929396276BDFEBE4061679F1A69BFC31F9AD7180B8C4CBB8B92030570BB206BAB2AB30DB28DC2178BA04DD8DCAD26B301F2137CA01232C7A08E5C302DB19066F4EA915B0EA8D027C361A EntropyInput = 822B9DC77CA92E41BEA9ABF5F94A35246A45E218EB0210F9748CF2D2B45645C6809643227FD9F4B0 EntropyInputReseed = 64224F122A462B5CF3D6A5AC06A8CCECEA67DA960FAFCA661B59D28581841326 AdditionalInput1 = 454F36491CCC2F9F13974CAD14C46FDF AdditionalInput2 = A8BA3982FF251EB8966AEEA46AACC01E Out = 41CF232315A6690FC93DDCCE3D0ABF9254A91109E57B31D1644F8A558D01AC910261068BFAA81C6F846FA516B0C2B4E8A74632BFEAA8AC8AF4B59DF53687C7B2C7B575D4F0E40070EB96AA96E37D1A3E EntropyInput = BC26CB60DB5FD37CFB3F63307DFD9029215C57873D61AB164E13917CF71759C680C5B128C5B30E20 EntropyInputReseed = 83CEAC3A8B23EA47AF43AF5EEB8CC3D96288DA225B57D7B29309558B5BB7C5AA AdditionalInput1 = 9B7FE330EBA7A9A6756E623144417ACF AdditionalInput2 = 7082A7E954F36E7DF3FDFA5D8AA89F7A Out = 174786D98600731A437AEF748B758D6BE4A2109155C9D045234B45A70FA2DB1A9C91252670B06D9FA4C147877574FDFDCECAD8C770BAD3A294EA579543851E0EFE57F91759A001EDF5CFC254753938CB EntropyInput = 9085673ACC1D474931121ADD4889371FFD8D4E12D5BB1C605B8BF8112A61465406B5BAF66BD97C1C EntropyInputReseed = 469ACBA510E07215A968E4D6D8263B13F8149771539E00E45842B850E483C79F AdditionalInput1 = 17914052692ADA1FD7D69778A245997B AdditionalInput2 = 5FAD6E14B2403E4EE18A798326BDD7BF Out = B978C23B54C9A64865FBFC9D340D183472759360ACBA3CEAF91D2BCC4A6476EC4566DB84995BABA94CA63485400AAE403114E48A91F751C5F3F2B0B1F733C33717855904B5BDF260BDE0DB40AF97A9FF EntropyInput = B839BCDDD74EE47718C2633725BABCC0592DCE979D549574FF4C0D827F74F1EB7C6B24A1A936BF2D EntropyInputReseed = 0D8114AFCFEF3B9F1F72D47F9E6AEC7C32CBAD3E4828D85CC0A669F3771D84C2 AdditionalInput1 = 22EEBDFF9A4E58728E4094EACBB4F30F AdditionalInput2 = 8BA44787D3D65A1231A82DFD4A12E439 Out = 20B89E4482137C5987729A59FB6758B1D943B27565E6EA131C108D3DD163E4122E4B091ABB50E12606F6D6D1C9C27EA8EF9BC7108E3A9AD38451048BFFBEF23EB41498563A613D742059B87943DD1A68 EntropyInput = A7510240CBA5BABD591736042E9E9179B22F5AD71B77AB6F128B57A441D7EEA0D7843AFB503E793F EntropyInputReseed = A1A391302EA9D6300D482769907BFB8A78CF8B3E4F7858331B5983FBF189B2B8 AdditionalInput1 = 1C8C235F3F1974F296625284CDA7D86D AdditionalInput2 = 6CA231DF9A72572596525DD31D5D9752 Out = 9344E4F8FFA9A3077490C17BF6DF535F57BA10C73A7A23C32825A11A953680874C38A5067F576D93828FFEC5785644C048898B66501682ED00B8B594FF3934759EC93E594CF53AFBF83FF174BBE15039 EntropyInput = 2682033F78B5F3EED8C77418F29FBD88649439E3DF9F6BC414F0040BC789471225330B499EE1B668 EntropyInputReseed = DDABE9371E4921C996497EB87903DB787F63E106312003A2E8678624B08EB350 AdditionalInput1 = 25A6FD102C9CF4D02AF67AB6C12487AE AdditionalInput2 = A4D193F1453506DC750DF2D516F10235 Out = 7C71B9D7F4B1D709825B2C39C0B51BF9E104D6CA610D441E3C512B9D65B7004716FFDB8E890D52FF25BF3822CB9661435F0B9F3B36C7CEC0F25353F97E4720F3F98F5B32B854EDE883129F12D5FA0C23 EntropyInput = 8E311BB4F8552A39741ADA40D64B550798990B5F26A71E4DA78839EB007CD71D0D872E0FCC244B53 EntropyInputReseed = 71F4AFCB90609EF507F895D1725CFC0E477ACFDA51289A6784D014F49415ACD5 AdditionalInput1 = 2E79CEBEDEA8B28374CB44F55221B897 AdditionalInput2 = 624CEBB0F48370DCE902406D56352D60 Out = 3352D891599D63D219CE5DF8B4F43D6ED194DACF658486A4FBCDC50542EAB24C808AF1EC902DCBD258762B2C5C7D5A3DBE3F4A45296B3DF0C72EF04B7E6B45068F734ADD3B0AB6BDE06F0D2405A5C355 [SHA-224] EntropyInput = 09EFFA3906A5E93D05530EDC71E62B39C5E4DA020537176C23823DA52DBDBAE8307656CD EntropyInputReseed = AF8F861471DBA14533C880505874098917E338F20EF8D8A1 Out = D5DE8A3388B11E45085F6D9A009462947631C4E74523080CCD03A0196AA56B63A93A2939F490E9456E9FCE3E9000E58190991B9AED6D145AC18F65CF2B1C17EB021ACC5256EB6A7E9023F62AED87D15EA4E4B328F265CC34ADBC062D54524365CC9C5073A8371F35DC2F459E1D027515 EntropyInput = 29A7071E686936E60C392061F71B68500DD6F11C563732FCA9DEC3B2F859E06A857FD94E EntropyInputReseed = 3CA1817872D94C2B7C2F283A0D2D12A6443E95F7E700A910 Out = 72C0F3CB7792BFEBBC1EE6F65D40D118A6A1C4E04E589C8F70273B4C7B718C9DF383658572B894838A311FC0AA2AA6258758B33783E192B0C3C1D322809375DC925A05605FED8C7E8FB878FB63C84CE639FD277D9955F91602A9F4777B7C3B15404C4E761EC8D466674E32136C7B8BDB EntropyInput = ABD3DAFC85B23025792BCDAF9F410829D3201C1E8CA450E217E13EC2E3B744E8C5410717 EntropyInputReseed = 4A6E69AD05F643EE5CEC49CD47EA88C80B96A0944154B458 Out = 152333E16B04283DFB8C43DBB3BE43B5DB2EC49A399FACB65CEBDF7CA3ED267792BA308CDB0649B0C19CB1126B144D5766B5AFECA98036A1F85CD2CFE3B8071011B69B2AEC382F8562D9DD4331A554F3A3EE632CFF308488B30A7416BE8BBDEE7E250CD12F371D069A097E9EAC43031A EntropyInput = CAA286C160D22AF10922EE6088C269D0C963034E5FD2A85D2FC171D0C4BA0833B630A64A EntropyInputReseed = B09965F132A744656631BF2DD27430C7C2D1E59CDCF43A97 Out = 4D6132B9CE70470DD36F551584ADA639E74B85FB9BD3C3E350011D99F2DC0371F874E6B9D92EBA3FCEAFE34E574C1441D0D476C475B704755A28733E31637962CAE67E849BED18D77501383CDBC27AB6F60D5D8D26634EF39E2C60FCBB04A9BDDA8BCFB9B2D3AEEC12A21279ED553343 EntropyInput = F79156A2321BA930E15109501EAD80A3B26C1747B7A9AEB922D1A9D474DF64A1FC3483F1 EntropyInputReseed = 0E88A7FCDDE91DC06940C58BF4D747B5A9CD8CAD2C2E9870 Out = 1B3AEAFF973B2E20CEE947FF283277991842A22F45CCE9D22C1705DAA51A56AB43AAAE1B51BAD7A7363EDC7B548A0CEC6B376B925A6E35BC7DC3B4A33A7F3B57D66B1B35256908BD2D8F0495CAF2539BA4475D766C21C2C2E4ACFF87FEFB07C662EB344D9C99ED407165F8A09A22816A EntropyInput = 2DFEB70FC433426E23378D048B836F899CBFF52D4A92C6D7D218E3AA54C06793339A752F EntropyInputReseed = 86F03B7FCF89BEF725339F16AB1CD28EC85C20594BBDF3BE Out = D403DD8A6F3A914933253DB9CD043421E54243A34043F5EE11A3B6A627E25D944434EAC22A00172CAA607EBF7DE55B4C4305C2B93428D5FB4CF0A649451EC7FC5DA65C4894CF4D2F3D52E90993544237E5C58745441C9CB2E047513FF81D9CF980D8B12769C21CC8C06F6D583B8BE3DD EntropyInput = 2C6BA987BB61C4131138BB8ACD877763C2C7E1F86289A81B6B54D1D8B399B5A5AC7171C0 EntropyInputReseed = C9C0B5943BD7F54BF72B20307834E971BB637B351A756823 Out = 7FF01DEF84626825FC22A62CFE28F5F95403BB2618EFF22529B6531AAF1032100944D5F9703496D165C5756C0AAC55B1812A72940AA5317FB6A2944D124E7F65766F231B6BDA06100C5AD0D1B37C488E0E9F11A6D8F7E4CF7337E04D094EA9DE2DB1BBECF40E0CC8D1FC1CF5A01CD081 EntropyInput = BA08ACC3A00B9B40D2BAD8CCA4909D3BBEC5471F78D0BF89A805D839B8B29FB753C9E5D3 EntropyInputReseed = 674365A7055A187A238EA1CD04F482D24D856B67EB54D71A Out = 9EC6AD840270051313C5825295A6F7527A8B1B9B3E7C867E5642A984B11911BE60614E5737D3A0D109EEA4223F0D2EE63CB19BE702291A771B2E2C277F2D4559176FC5ADCCEA52492E3D3BA7D17BAD5B5F487D783639467997D7668CE2173EF777F9E31DBECB6EE716B5CEDC8BC5098A EntropyInput = 95413345228EADB85B67674B9981AF34BD6A4AE04866229921BE928C06E6A6A6FDE8D31A EntropyInputReseed = 6A88F24D6A1114CCBE08DED9D7C50C3360BCB8908A615381 Out = D4DC08E36F94E88F8BFB1919C13186139591EDC681AFFB61C421D32DFDA69E507D59495BCADD39B73C4036EF440DC598E339473CABA60E0770AC4729264B1DBFDAF32CA6D136EF6810A6660FA5CBAC91940A28053C0FA405C7B6CA5E3F147B5E0096F36B67DA9FCE64247CFDAAD70FC0 EntropyInput = 9B6BB9589F41E8ED6969DBF1A3B3D242DD5E133711F72549334C74190E4EFB1D0452016E EntropyInputReseed = D4FFFCA9561AAF219E6793BFB6FD3DD9500BD61E6A62DB66 Out = CEE02E4FE0980AFE6CCBB1B0D80041BA9841461397494F0FAE5188228FBE9822E3FFC5397B7CAA29950D95536E7000E1249E5BB93A593E659A49689ADD16D2F5E02FF251C76716DC426010C2961A176BD63C29397F6E36CD4DE2F2B11E1260B9F9A00BD49B4B6617FB056B82C92C471D EntropyInput = F276BA0DA08274A082F3B8AD989A713908873B742F96BBBF8C81B4E1A7E4857BC99AECEA EntropyInputReseed = BE534C45105306B14860883CD56F2438A7812B43F0D911F7 Out = 24DD3EEA9A8E1F9929EBBBC2A68379CAEC77FB42531A97F7F3A75D16AD053799FFC25CACE4F4553C271AE360ECA1F5131EF87BF0390B26785880DB0D92BB351E6E22409D600F6DAB5CBB2278B8784E67A40BE4D8EA6D994115C67B7224D721D1B3C7FC5B24E15F97EB3BBE33798D1BB8 EntropyInput = FA5ED9189F21D7E94764BDDEFF23050112868CFE35220B863E8112F691C57E6D6C4A91C7 EntropyInputReseed = 52C5F0B37B97D5F3E383480054877F319A568B064E6562A4 Out = 55EB5EF1248B5A34C741F2076EA5D568DA630CE4720B7E2C86A9DD535B48FAECE2229866A36024FD4114249BE4730E554B772D557CE3F8B9D4D86D91202582213A676A076B87F941351C7606A452816DB5D0F8194825D402D2FE7EBB2815532091B3830A9616918BB0E3298FAF037BF6 EntropyInput = D0C5003A6168163F707B25191B51211DC1AE361DF1E069D0F284F66967ACA4199809DC89 EntropyInputReseed = 368164213AE17285674E5574851582372FCAE8CD2733BF4A Out = 24910E1A9304471D053AF458BC3FDEF527E8796E33133F5AF005106B203E8FDEFB274F1C0E8FF44E92C63BEF3082C6E5607A7981A6076F1A1D15368F4330C7012509D5F61B4349224A87960BCE9873725145F187AA931394C449F502D12B60655A0AB2A221134A51786C3683F9FFA2B2 EntropyInput = BF5B5D1C891F7A6F2DD3F4D486D693FBF67F49584B7F053AA96DDACD9FC0CDEA0FAB8209 EntropyInputReseed = D8F4335820CE68BFA04899B63CDA15242E9CD3F7ACB1F103 Out = 710C8B33AB034B50A29DE657B93F3C71DF4727A5219A474350C88B4E3974FFD0D3452E8C4D26F579E348F39CFE0D20045A70A866C5E16A0C22AA0D69B739F74CBE8B046BC14CF82B86498460BFB26AF0771371C2750F7C59320C6F6FE1D04CFB40C048686B6C1B69DC641B8957C2C341 EntropyInput = 525615164DCE0DAC5397B357546AAD049DBE5982DA2C215A233557553460F8505A3E7C82 EntropyInputReseed = 24AF561190099EE21A06D62F9F00E282B32B486E8D0E338F Out = 3FE96C9B10C4C8E43CF3CD76CED4AD85AE576F32EA6671EF284F7C97491B72152A18A1060145E4F5E7C0C373C396CB4C8C0B6D625C1F0D2AE95B0691CB1C80A3DD5EAA21632A82AAA28E09A2BBDEFF7FD8812FAE46DEAE14BBB16DA24D06878FC417B3554FB47B0EF9FE18D1B9D4F4CA EntropyInput = CA81953D50430BFB09537A318A1A7B90A9200077ABB721E55D9AC28946FBF75D9CEBC81F EntropyInputReseed = 11CF6D4DB712A3B91D479E00BA30D736A763CBFE40B91448E50AA8BEC96339CF2608BB82CF038D5FD6BF93E65271CB72 AdditionalInput1 = 5C5EED0D98C7FC7EB30ACDDFEE002D5B99C965949D4E2095 AdditionalInput2 = A1A7CBC79BFAF4571CD8020DA094118D241B3F018EC823BA Out = C8B7D9C15624AE018A8612EDF6444354C45C6A788272281C16526C689A3DAC36679E44D89C4ACD7EB58FF40A577C3D1A9F4D0175FEEF9AC5674C115D5E4CD17F2369E0135E33B018BDC99E4099713ACE986A145EF55E868F74846FEB3592D44CA3EBBA6044A928E9284B5EA75063AE81 EntropyInput = B96CA1202FA959EF55A683A9021068E14C75376E15D1F0394B1C091A8B6DD6B98B6F6374 EntropyInputReseed = 7DAE58C29186179B4155B868F5A81CA206A5086A5759B025A35096086C1FDEB1FB60DD84FA730ECCEDD53E5B127EECF9 AdditionalInput1 = A3269FA749E55850D4AA9E466BCED0BEAB2EDF86B926C2AE AdditionalInput2 = 29F6799F7C78FDFA2D0DBDDE8381AEC5AF249556903F6313 Out = C63EA73E1DDC9D55BD64A63CF73F730136AB4F6D688A9CD56B945F9875EF4FF48CDBDD8B78B898486A685D8AF8CCCBC2A834A9804E566EE7138C7DBF488D263FBD387041F835EA46AD27CBD66721428ED5795F6ED044CDB17C8E7E3ECBF61DD68239E8FD644AE85776050AFBAA06CAF7 EntropyInput = 59AF1213CFCAEEA29E31400AB6B30F108D4A9A77D3B370972D29032CDC612B7C360C41F1 EntropyInputReseed = 6B0C9D794219300FE0551E0E66D634A4EEC396C50EC9604C66ED9352BED73224D35508754AAB68FCEA10AAC06D60E888 AdditionalInput1 = 198A3526A67A0CE31AD0348BBDFECEDE4F82D4203D1D5CA1 AdditionalInput2 = 03FAA2F4C34577CD8B2ED53E10C68C83C1EBC8D877379178 Out = 5E24F1A9083F13274ED1020AB6935222CCA644D0920839C2B142E2780983204453D2E6C58518CB351188BC3E5E3B64015882130D745511F004CFB6B64831139E01AE5BBA64B74F1A1EDE7E220A6D29B1067D7C68BA3543F4DDA2FC97A3DD23590C2C18B85662618462BA2C05231534B6 EntropyInput = E6CC94C72F37999F28B5FE350BFF622B433AE19111786C747D954ADAECBA47ABACFEA8CD EntropyInputReseed = F5EAB05E2F750C0A679CFB9C2C2C071461178A054AF409673032528703DD66E42C7B6B5881483ECA41E9EEA503852EDA AdditionalInput1 = CE8C03B0A05982CEADB516B1FE513DA2403A9E6DCD7A39F0 AdditionalInput2 = 3F7CCB55376F23DFAC1DC13BE617894931F9C13D15FD3DCB Out = 558656CAD7DA2AD87A7A29EC5E612ADDCCA96D72AC7B224CDE80CE386C6EFDA12113FE9AA8E511714A42EDAB53EA0289C75D34B42F2313AC366F51F5DD3F6968BBD4C09EBF840DFD03852DEDC1E3B6209D932889CB04062C644482106CF8B7A237D2937840F0C4D752D52725B5590D15 EntropyInput = CD4DCC8FB50672611F19E0CC8ADCF9285F9D76E7E28BCAC34E931163F8057B9F86424E5D EntropyInputReseed = 514A13C0A25BBB49EE485501EC5E21061E006AD1569D261024480094A44067B86EF47DB38EC3E62914351196358BD9D7 AdditionalInput1 = C6AC3B879ADB6C150A8EE44428C333574ED9B0D6806848D8 AdditionalInput2 = 92BDC1514D87DAAA321655D56C6302878C2BDE37700163E8 Out = 21C51A1568AAFB56AF1FD424F6FA146113D14D6D63E1A24E3168130EBC10DD84925BC4077C41897AA8B3C73AEB5BCF392D496DEDCB6487379BFB3E12BC07FCF5C196D59FCC1FA730E55C00EDAA2BCA7B1E32A40BA06500ED3DD7FCAB361995319979A0FA9CDC406A4D20650814E8BFAC EntropyInput = FDCA0039E8485A06E6A9AFBDE5B07A1BBE49E13659A2164034289639D23DCF3F9874B8FB EntropyInputReseed = 1A1AF8495B6B2129B88475CC529C96271BC1BBB5C7C2EA03841F765ED5F00BE838A270730CE5926659CD7CD9D5B93CA5 AdditionalInput1 = 825FA13ED554973768AAB55917CC880183C3EBB33A532305 AdditionalInput2 = 736E9DE931198DD1C5F18A7DA3887F685FBFA22B1D6AB638 Out = DD8596A62847A77DA81818DBBEAF0393BD5E135069BA169F8987F01DC756689342CBA61D87A79D4BCE2311790069D10709C3A53DF974C7D6793AE1298253F13ECDBB5680928579B73D73AFDCD24A703DC9B391F303D8835BA1129C3D46237EDE5E44732A74F8F23B60A3A45CE42F042A EntropyInput = E246E3F95D89C166768AAC69FC95FB49EEC49AA633ADB938CE1705B68987AEB0FAE7F57B EntropyInputReseed = 7E99E4F3E3E1B1DB2D1FEDF443BD2618E95193CEFD905E1D130701F88CC1E7545980E6C6F6CC76B0336F089BB66CC347 AdditionalInput1 = 95533F4CC247C887D6A7CC0CA753009BF034BA95B7B1D3B2 AdditionalInput2 = 464FD16F011EB2986D9982879D79349A3CE4F5905BBFE832 Out = 0D4E6B03AF7A648337ABEC2EFA585908AF40E88D1F104B3E8C352AA29AC79FE8E448F36B0DFD701A1FC0F1D86DCAB7E8A8ECADA6BA218D9AAEA1C40AA442CA51F3116CED3C9B8BA7546688ED4F3A1378F76B8A29EC763784FC82906DC0F688C5E60D59E6D5284FCD96F361BC5B285465 EntropyInput = CB0405E58270CECB34A9951ADEB694C5513C499CF310F6A99985D4FB3973463E90770574 EntropyInputReseed = 0E01AED4CA221D4B03EF30E69FD8DBFB4EA919A913800A1A0B57E688472E9A05BAA3920417A2E8F9A9C12555FD0ABC00 AdditionalInput1 = CAC05F79D9837C97BB39F751792624983C397FD288DD1D95 AdditionalInput2 = 344D2AA2B3BAD1485429B66606BF215ACB0A65BF2A318F6D Out = B2A13D75AD389514149763199D711092A9B0E4F1E50809355CFEFC1884A94F4D4A50AC5C5DA0B4E9BD7537E413BB451FDD2FA77F1F894444CB5C81E4C43978EBFD96900A2C8986C885D0FAF89A2AD5C6EF922DFBA1B5219B0F3C4AC2095340C3B8BF0DB037171B6545741C76217B2AA5 EntropyInput = E38EA7584FEA31E48AB085C44F46B4CF68FF24B4A6B0B25867463E4A46DDC9A4DE23F727 EntropyInputReseed = 2AF1E9C4E0391AA9491CE7CDB5F96292E0D65CB9A9A4A3CCAFE267E1491DE3934054B8419B88B16731217EB4EE74C854 AdditionalInput1 = BD0F3C43229A0FFC9E143E16738111E16D6A06EBF3EAA5B0 AdditionalInput2 = 23BD14EF8CF797CFF7FF787DF8ED8B87684FE7A9A33BF695 Out = C27A6EE5BAB8F8E93783840E72894F3B024C7D3206A4A1869CE6FA8B5674BCBD24D4AAB30F9866D797D850423C57684B7697913B9EF7BC0BE933D0E21535BD50FEA0FEEB293985261FB9D4EB1EF97AB5EC6B691A08DB4C8171E63745D14FB4C3A03C41F906DAAA2877B7622B254F0449 EntropyInput = 71DC625242DCB94E6BA2BD013BEB2112CFCA576774E102830503B7AEDA24C2C9D862F521 EntropyInputReseed = 2975CCC019AD2EA0442595F74D1D37DBCBA0719D8EA32BA10FEF9F0934BB4485BFAB2431F8811D963EC7FA7953FFC213 AdditionalInput1 = A6A7501C4A5A93C396EF8CC969EBD93CAC1C30B4783A0617 AdditionalInput2 = C58EA233F35A22FD9B01592C6026AA17922070B3604C7118 Out = A1452D85799B54370CFF65FD6DD74B575199606CC8FA64880B26972C913C372010B4C3F4CE9B7B565A8F5305072404C7B9D70F7AEF6E2709C1694EEFAE66FFA80F16EB4B91F8041F4487427E69DAA437E183E83D3B9718BA6A23FB90365884899E0D2F0BEF56B27249F65E1C00C5411A EntropyInput = 36C1E048D16F9D6035C6B62515AFB929633F356FED6A654282663E2284FD4132116D21EE EntropyInputReseed = F66D29629BC712965D960F18CF3F7DCBF8A3CCD61B5B5FB593BB372B7AE1035DE6F13B2A36C3AE5682B9A3EA8F444383 AdditionalInput1 = 9715B72E4755993762E11A93857F1D50A051E70D094339A5 AdditionalInput2 = 2F1E73945863B237F49D6D20D0999A0203F295B9A046DCA2 Out = CA135891B47F27C26AC891DF49C80D085F90C13D236A60F1372EEFD81EAFC5819F4AE5AEE5B32D46681BE01629B078AE965F67B81A5268EF0B303D09E048F4449F5AAA11AF51F80151B4697B13700930167CDCB3B6E8260EEB8BEC7F6A67A2050A6EA569C825D61D4858A1CD15F70FB3 EntropyInput = 582425E13356E7A840CAE9FA435B220AF6A96FB53AC91E7EE22023CF6A0EEF3923907883 EntropyInputReseed = AE540BE816E0631C894520B86E8C6ADB8152E55CB6AED5AD227762E137F9EEC6D2B3C63476B404DC5B0C68613A93034A AdditionalInput1 = FBA72C01A9E51C93AC00C1232C717D32FD4D4C791556E716 AdditionalInput2 = F5258BF318457769A93EF5B3BA95FA2753AD1C5C1B81A785 Out = C753A84BA7F41AF2AB757AC1E4C9C450D2112767FF55A9AF8F58EDC05C2ADCAEF7B5BF696E5C64F71D5685593F254A87625065EE0DF51AB4F7BBA38FAF5799C567D783FA047957F3F965571A7B4CB477566D1C434D6B2E22AE16FDF473A6C03057D934A7E25F0EA3537BE97238D74BC4 EntropyInput = 836F5D7521F26D884DC34AF2CA56AB4A752EA18B909085A87CB6D07DBA32B654390A25B6 EntropyInputReseed = 8EA7BA8FB790271C712F387145052CA46CB40534355C166699D9AEC334666D7C399E453455EF6AE884C2173E12E31CF2 AdditionalInput1 = D74D20DC22C55C35F0B66A464DFBE8F349616916FC726298 AdditionalInput2 = 407B0951404079FB3B54559C0286143D9CB18957BED7FB1D Out = 809F372D1AF60FF972049193FE9F173684A2FC9828B60B32164C1B6738E1BA6AA12CF739287A74C6AD528A3EC00095B590B44705B4975236A0B7EA02C1213F0E830F275F53BB79EFD98679C4766CAD27738E6FB777E98CDD606B971FA60745289D5EF72A99E1919686A53A241FE36CF0 EntropyInput = E555ED6C7AB344FEA68D73C6432E4E6DA2E67D8B33AB79E5719A2DEF258A852D17D93212 EntropyInputReseed = 840583FE23900949C301A29FC92095F4716018144E64583B5262CCCD138256FA8424801435D118F39B9AA1DB4D11CA9F AdditionalInput1 = 9B55D76B743BD7FC5700FDE8FFCA956C0ED6091DF1A22AED AdditionalInput2 = F8C99AF8029110C41A6A01FD2D3D12B7103AA39CBEEA90C8 Out = D1EC06E38AF7C6E0A70B73AC62BC3556183F99A47BFEA0F0C4A59E7BA4B0718DF5438E369BA14BE84DB40D5FFE8A1A5952EDFB83F61EE4D984E3D2FA67F557AACC58291CC688FA29BE530E66C228E68607E25C013473B4FFBCFEDA721EE35F5DFC8809528EADDAD8969CE719A411216F EntropyInput = 12F2CABD3B6F640DAAF27ED6CF6BD7D06E2AC372733C6971739E36AFE2BA1EBF4E7E5E9F EntropyInputReseed = 5591480E3FAE752FA59BB99A1949BDECCF0C100F6AFE886D7766C36E6583CC8E3C26A8058FA0923BFEB3EE22033F46C0 AdditionalInput1 = 63E60D1BBA9AA29ADC3F3B8A5DB53F3B703C7AE69BCBC2F7 AdditionalInput2 = F416F36717BA5F0A78125CA52CCD004B2F4F2DCDD401F595 Out = 6196B2B4ADFF14A26D64F440B6C160210266D7F5B77D5E292E94B8C67BD9CC774274741E7C0C9A7AB21C31F1194EF4218DDCBBE94059042D22EF44ECFECEF214A73DB64505D46D5493D7475D0684FC0E431C5265C12B35310D4404B3C4DB6029FACBAEC88B0C0AE9799E5AF0AA49E842 EntropyInput = 2C50DA90A1F7987D5216950EA22689584B237647D96C1239F9251942F4D13D16F418B0CFA74C108FE870B91A2DEFA971FA1EFCB7A209F293D29BB5EA EntropyInputReseed = 7265B91C4AD97A7ACBBDA065A48BC1BC5C7A9EE1523C50E3 Out = 8853EB47C4ADA94A3D58A1B517784BCCC8F831D02DD5239C740FD7CAA3869C5FF7BBF522A78BE2D510C49C496A6657A09F0EDE00DAEE9FD77061B0F04E7342518DC6EC1F4A7FF99DD7C783882B58F5E8BC467516C6B85985FAB65C6761D4FE756FFC27FD62CFB92778391A258D3B0B0E EntropyInput = 4606E3E19A8A53E8ABA05D9D1FDA1DDF15E7709AA2BAE8B54EFC4A14E734B45A5CBBAD0023EF5FBDE4B270C084A745E0E299A5EBA228A37074FD4F07 EntropyInputReseed = A749D2BDE540258DE74FF8FE886D05570300AF2086D0B9A2 Out = 8CAF86DF25DE5CBC3749FEE4B64FE041CF4EF2859E20704BB01ABE126A90EAD8CFFC427C2F98AAC400AAB97184846125A2A66888DEA9C8AA108E96E03B05BBD30E566FB90C661DC1990EBFE75F73F5B0DE7BE419C225BFCBA3713805455DFFBE5D6FCC98141743B59C2CBD70E78F5977 EntropyInput = 08E2E2175FB34E4111179FC2580C05AFA16D224440CC7EFF24082BEB16133A992FC4F4E20A4AF33E2501BA409B132459BA97603888E727ACA0A0CEE0 EntropyInputReseed = 762634FBF68177DC3F11C4D057B71661ADE56E7768AB9E6B Out = 39C60B6D9F85CB69B2128BDE86ACA2B055E21FFD7716D789F834ECACC69A043893B09459991793571D3D8070F03382A11BD1C1BF38E86FAE13A932C6DC82C540FAB8C8EFF478E598D3295663AB75EE8A56376C0D607FE43B74AC39479B8F694A3A13826B1B96344EC67B9EB0A5858EEC EntropyInput = B436EBEDA1119DE3FB2B2E532F7EBF59FAC632A4D784D904F844BB73F2CADE5A88D4790C07DE5589726C49DC5A764DE9B41BCE74675E4CA3C71769A6 EntropyInputReseed = 8C1D5973FC73F6B7F929303B62D30B6818A25DDF705BDB9E Out = 2099FC754ECD19A19DE8AFD21D2AE2CE456C32D6CE7772A98E37ED47F54001F44FAD8E9B591A70D3BB28F19BCA22940321BA17C33193613B7B5BE1EC54EFA470B70CBD6BE2931193C35CC73D80C139BB4E670E1A2CB74D3BEDD3610E9D0F9D154372A70B608FEF824C346FB16241B301 EntropyInput = 4D3E993C296C66983B9C751D2C0AA2D519F801A764AC9F1FD8D86B57EB226BDD9F69EFD952AE4CFE985348408D3678D60259A78369AAC02953911E74 EntropyInputReseed = AD29BF16AF483E7DC170F8AF65C16426C2AB7C0FA9DF0175 Out = BEAD2CFC29315133E6F5BA2E85BD7778DCF9908081032EE634F90B0124ED9371C9009419B9E2A409FE4ABD6295CAD57CDDCB6042986CC98F2FAFDFF99F7CC1185F3BA0D5F1E5F5452EE5F9DF03C0E8A4F8426CA246AFAFE81079C2F0D165B87056E7C8528E8CCCAC5F49D0BB5CCFBEFC EntropyInput = C7C4E18C56E9191BA43C967CEBE48E55BF9AFF4D6449C3E6A1F9846BFD7F92D535BB7386C36A381B1B36E6AB00EA80557B5E7451EC9771101DC22580 EntropyInputReseed = C0155CDC5AA2BEEC888DE0D432F695EC79B1C78841AD941E Out = DA74B23D309FC7CF7670D7FEB6CB6FF4DA1B763AE2E8616EDEEC12C71511F5A24B9C466532283F4151A902FFA5AE211D7C1EFA84477B93FC393AC95522F3673F97AA9E379E48D198D5929684875150633FCF8A0918D2050551D8DAA91887F3D2685737B6456D0C61C0A117413F193346 EntropyInput = 78426F865483FFBCC6330DB2CCD65BF8F247706CEDF68D4CBCC289BACB1EF32E5CAF05F2E5026090F9806FF6F158C4A834588F6A39E9B4A44EF2DFA6 EntropyInputReseed = 8A21146A9B18E77B3A7ED0D24A0803C9AF7264FE4E23D692 Out = 111CD64A9950CC6F20A1B38811FCE4A08929CA2654BED66C0CDEBAB0B81552826C06EF12CE463FC9C91C81A35D2CA0553905922B9A4975FA8FEE2C7F9FFA9F2ED8CB2609F4B7D32A44927C7B5BAA8F43DDA137ABA9B49A2B0394F7F67D37B7F71A5E4F4C151DB6B96E8E4DD9CD0BD84D EntropyInput = 43CA11D53AD0198E4DB5E136DE8136BC461851A30CE59521F931AD0596D13365BD8297A6532B05891FE406CE72421013ACEB434581BE8A3A13549DFA EntropyInputReseed = 8DD42B7DAB7F40808B3CE6C12F14D4DE741CE451B6637A10 Out = 4C42F791DC8322D779F9A1ED9A28B0CF352601A4EF6D74E4E822EE5D9EEF06E700314ACB7A47DCBB62805BABDCFDD236E3022374DEFD44BBF747764F72FBFCCAE10893B54B29966ABA448435987C22ACE4C931D01DC945091860CAE7744365BD9B619059B8B646B229878966049CF83F EntropyInput = DDCB3024B681E30E16E05026D8E23977497FD0B2C0AC24017DE2744EDCB097D3A104D4E3BD9E41974F6627AC5BBB21EC690EECE459E1DCEDEFB327F9 EntropyInputReseed = C6B8ADCB554746F9A43671F0692C01A8F89FA98EC3A54AC7 Out = 741B2A8E82AA3CA9F3A609D05A6E2D570BE463EF957F235344CDF9E0F89B3610951AA1EF0B9406785B75E59C2DE8349D435E4DB82FC2A4A8B94E366F4EB13C432FCF8FAC08F0C7FDBE67A44E81706B53B460F78BEFB8CB6DD2A0FFD13C87DF84F8A5197ED47158CEE171E5323593DF4E EntropyInput = F81C4BA8605DC14072E2BDA2D2EF64E71AD856061056B8D8374FFF5A6FD9A54A814FD725217137084F4519D046EC896144CF2C301BAF911E1440852E EntropyInputReseed = BDA8944037197492C52C62B97EA02DF33325B35B91726839 Out = 14EFD71FA13DFBD498BBE13FFA24E646D04EE0EF32C99C11004C3E9D8F748AC2F956F9899A72C8D97AE988D06275855F77A92BC30F1B957DBCFC93FFFEC3852715C239C5313E765AFFBED257D302B6D1B74977B8012522B69902ADB86EFC1AD768D99D657A5375DFF720B4CAD886877A EntropyInput = 8181FD2CC5F7AE2D4ED2C96B9511AEEEF33E50ECF164AFC4EDDEBAF76A96D97BFB4037797D6CA5AB652A37CD79367D84299F1FF2C5A3C2331C77B98E EntropyInputReseed = 59E1EDC44D24DF041749EC6239FF226E40D5A5FECCDBEDA6 Out = 5A2CAC8110A24E1D8C5F8BFF3E82857EC8CFCD469C316FA18B0F65A0D30866E49FED2A228121F50901DBBBA561732C4FE82A98F341BBC0A397FD257A5F8A4A9122C991648B1A6507C82F866D26F9B22E0EE7C9A51C4D8E5104F0B4570043C9257BB9DD6F3730F1DAF94F80BAF8907ACB EntropyInput = A0AD012A978BED2268D05086B823F5D0DC9BB98EE03980D755BCE968F9AC81DB886A2A051A8ACA3C118F2BC0C2196DF81EF22C267D20ED7C607CDAE0 EntropyInputReseed = B59DF40D8346334A0276B73F528DB03A118545ACB7F2D70E Out = B9DC0EB1E4AEB482DEA1B4A5E6F6EF9636366FACE696811DB2D912E9430B303F23AC95D65682694EF9513AC5B3E56A053B2E1A2FFBCB901C375CD122CAB47D31FCA5A0606DAF8CC2E5E6E99B90FC8AB4FA67794CAAD91985CC92B2187DD2965BE0980240D9BE2FB1C4BF06E60F58F547 EntropyInput = F28B143468AB87794230CEF4361D047236444180D0CFDA58CBB9494CD1AD21BE96297FF7EA7FC50E1EEA3D84BFFCBF83B240E921348B532E7B33F094 EntropyInputReseed = 99011042013789A928F18831FFB0169126DD046C774A4FCE Out = 5C22E92F25ACAF98F55FF06E1BD80D382DA754D1D33CFFB6FCA933583BA758200357551640C439770F77F843E9CE1E9A054F69588D76ACB9CB92B7A2FA2903BC51391BD7001CCC1DA67A4CCE9E5DD08C2D489295C36DE2C148CE27311D0789310DE1CAB2641E92F859B036383A8058A4 EntropyInput = B628CB448E477CB439A2DE687861A992E738DB6B2B25CC6C27AADFC3A0A640B3411DE49CD5F4F8266DA9B7F17AC97734201544104A5C0ACB53C6BF22 EntropyInputReseed = 920407303E80ABD7A1D4F45C4749980FE1550BFF69518210 Out = 34A834DBB7DA0B6A2E2353BD9795BEF369CDDE4D172B3FEAE7B1D9FDFB0446454CFB1ADEFF423D0A143C33C0E0D8E7905BD1720889E8B1121F1EF82CF15443C2F9C8999C5573E7DF60B52EF395CA1D1B60E7EB721C012C344D06B336D519FA2B7B6DFBED8383456504BD0B4893BF2BA2 EntropyInput = 5C7C9690A1926A4580C691C2E5327E736D5C3AEC0CE8F5D32D4946BC4B607F712A8759420310B2D8B5655CBB0FC2041AD15A248A7B1F2AC78845E29B EntropyInputReseed = 8B010BA1B268B0DE64FC5EB32D3F7FA9B8D4F20FAB45C72D Out = 6F8B6DF55D9D8ACF87DC2AF20B7F4512F9425987495F512975DE8059135E7EBB8698CB0301A8816E7299E76053CB66051C8B35BD2B00B4695CFF4847F168D2D60697495CD9007AB7DD74EE7F61EE90B7827543F624B7C1412BBA3D6DF1242E6FFD90534ED393341429FC00BD97D9BCB7 EntropyInput = 96AE702AF50C50C7C38818A5133938BD7CE51197FC78E21815B6C5A7FF9C0395D764159FE96554644097E9932585B7F4BB14D101F24C8B0376F38C05 EntropyInputReseed = 707D5813E5BF47C1B8232B44A007BF7DECFEF499D758ED533F698A5F6F4FE67EF2DDF23BD5A67C1A2DF4F3B19425FB85 AdditionalInput1 = FE1F6A90FC0ED396BCA21C0D40A1BB583EB63DF78C98ADAC AdditionalInput2 = 5942B56148F27DD5388F00CAA47FFD4925E854237FE14454 Out = 150B9260CE9AA419FE1860332AE7C9F42D9ADA1649679B53F46BC9D20DE3431186A54AFB5DF7B6269CDC05540A93FDD50A2CD3A862372D862841768DF02846B057993DD6AA32F874B7220A5A1FD9CB573D720A54AF5715CEDFC16F0D9A467735E253B2B1A6E97421FCEE1F2D670DEC1A EntropyInput = 4834717F669D9B599F0EE526129057B5A7C5680724AE0459CEB0E0D4EDA21E5FE92E63FD870B7857DAE97CD361A005C3005013E4DD55CA76E46B62BD EntropyInputReseed = 23F08F8A0B094A85F3F377FDF1018ADA0C461B5A05C334E8522534BA1A09CF9ABF29BDE66CE1DACD0E273E8954ECCAFB AdditionalInput1 = 45F54169665F59D92211F266892009958EE515F14D09581A AdditionalInput2 = 4633819C2AE83C71059EC8AE41ED2C68CADF9B2085A5B8BB Out = 7AFD6CFAFD9A7BAD155B59A8BB2094F76B915B93764E92858821D5C32FF4A29493788D3DC1627FFE7980950394349EBA88B9C2F6869AC5086296366B6F4EE37E8529D291C9D962E30662423FAF375B7820E0B650DB03E3C99791D8042DA790CCE1A1997EA21441DBA4B936BD8B393300 EntropyInput = F5D1D27EB344B63E907D82A2E57494B25DABCAE440AC88738512D9602AC8BCA243018F2412FF844E5C5BB3FD871FEB37AB796002846FFACA5A741C54 EntropyInputReseed = 95599E618DDE0261E43EA38D45E7C09CCDC4BF3DD8E5C100F642C19602754584AFA3083F567D80FDCD1E5C29202AC3AD AdditionalInput1 = CB6DBAD8CE1A5677B4825CCA934336B936CCF841FF98D894 AdditionalInput2 = C11FCC157C643A943E54274F1D942D998FD1EA0333E21588 Out = 6F25AE8BF8C26D5F0B9D2A81ACAF221790A09241B6E83C9E527C7784881D1F7398C2D7771174F92AAB45134B4633AD96430DF30B130AE34AF52DE90B425405959BA24A41685A04D2411E2F0E8564BF5BF3280CB6D75D0B910D06C73A625CD56646EEBFF14FCFF81411C055921CDFB4C0 EntropyInput = 49A10569D87A790D34BCC3C8FD77D075A1CEF9EFF337E8929B51BDB8D6C5DF3AD310456834D6AD434A436A690E7644F0DC2207131148192CEB2E91B6 EntropyInputReseed = 4FD1DABB1FE6F052FC9886384FE43C0A7ABC7ADCA043D35E8707328FC5A1721E4D72B23C2B8CA3C30DDD95664AC478AA AdditionalInput1 = 82C8D83A9F5D5639A6A1CE26D244BD30DCEB1CC978627E19 AdditionalInput2 = 2A53B0B80B29C7D071983B65BA835E4EDA66BCFE7B3D90B5 Out = 08E24CCAAE3B44B7248B2D735AF985DCADB84F74D202BCA726DE1CD663BB5EA1BB67C669126AC97218A9CA45491DF90BEB387615474249BBA1AFD4534BE7A74C61FEF308F13661DDFCCE40F24B410CFFB1CC3CBBA2C6D20A5E4C4814D44BEF07BB697CFCF1E9932E43349376DC04865D EntropyInput = 9A4232A59CC579867F8330C288A9218251030C00EBE50C9CD97D6CFF6E49AD079DF50964B4498A32F664D4B489C2B47E67845D2D2BED5096E88F86DE EntropyInputReseed = 4EC2EBE3AD4E515654AF383DA265D7B348DD4B89DDD49CBDB8471EE87531817D81EE32578D27FA3A190DF33561DA7A2D AdditionalInput1 = 2E74194AA62EF911599B37A51FA742817E3A4E6C254EC179 AdditionalInput2 = AFC7F13AE55E738CCEB976EBDD01698DE4D103DB797F799B Out = 340C28CB7CF4C3E143DAC3E133DE864B1F458C76E3D47F3CBB6845F940BE174B8819FC539F42005F4485FDDC657F064C34873094E25A9BF7EC341A98CB97014A1D694B1694170CA5A8976E86F6E4E41232F526EC8536FACD02394F492FBCC7C298EF0EDDB3C5A148399DED7677366CF3 EntropyInput = B89744009793D2C118365B1D2F343D6B6C59374B41DBD805E793F27882467C5342015CF9F3C02BE0A880E194013C21B09B6703A61A7CCF7A73E8A541 EntropyInputReseed = 68B080A88A15FD6A7BE3757B05313528525AB1E2CBD08FFDBCA27F10060BB8D16D499B3F6CA05ED8462B51B0B43A1FD7 AdditionalInput1 = EB6FCF75884BE9112219D359013F45FCB1959EA971BD0BC8 AdditionalInput2 = 50A03BC3652F50CB9ED1167EA70EC1E74F896F81A8090216 Out = D2A529722365E7FF3E660964EEB27040A0E92A4D19BBE94592CFEBAD71047414676CA6CA72234F5127F313CB7F5BE613B44D989FE141C9A0EC1F0B4D83C36E744CFB1C72C32A02B68C21D28832DA008C57664046255EF18488ED750EC5E73B18EEAD939F932D2809F12939670C3C1033 EntropyInput = 6D2918C15BE7871CAD99DC9E06F73253EF905D9705C4E4EC38664043B04F9A150FE5953B489243EAAC215F76A573B92F0709D116BD3C817EB95C2C39 EntropyInputReseed = FA7AEBD926BE162B7EDD72FDC14FF97E67DAE6257AD654F40A84CAD7A1CD21A5AFE6557D7D2875D9C62183CBBF49A123 AdditionalInput1 = 0C14578AC9504902CB9AA654086246D113039F926A87B325 AdditionalInput2 = 1AAAB1E3A29E144CEC825D29C3F42DC945CF2772ED30CB5B Out = 33438BA4EDD0C38DB99F2B6A50B35DD89AECB3491990EC4E60460BB32EB0186FF9FDC973B1B0DF23AE65DA31B8AF5A37A69F81AB3E577A4C2C31E51CFCC4E844B044FB597E937524F59A0019AD5120C460329C982FC93E8E7A4B4E1DE5619103B23A7A579633FC925D147D8FB856A277 EntropyInput = 1330C4AEF54FF84387E0372F7C8D273CECF0AF2CEB32EF6EDB6A4F1ACE802F3B95FA69CF89D7BF8F5754CEDC2E1A249F693E29276170F62C29C5EDAE EntropyInputReseed = 578E2CDA1D6060EC2554EB3152507387F325D8E26009BD80A6B58F33D57570F4DF05BBFB792A00087D331E17417E09EF AdditionalInput1 = F57FC701E4F8F5CC2181B5357824F932F6E07679EC0D3CC7 AdditionalInput2 = 586C4E8C5769156CBB54C025FB01AAD0B61AA6238C231656 Out = 0BCB6AD4F2ACEFB549C46271D5A4ED41D7DECC095137E2044B60273388C6C6D79CB89016ABCAD1D6A138621720B71FC11EF82FAE04026E08926E94042694A0C008F99281E03DA580FBB6543ACA2B4596D39699B97F1FE65EC60A70B88770EB825B716A10CE41383F31DB596079A9D54E EntropyInput = 3F0564B9CEEE32C8944C8F2BC4B4D2179B38ACC880BDB91EED466B881E2CC21DF77BC3905D54FC715556C20F5B2D01D6B0992F1C596E5AD77F81DA75 EntropyInputReseed = 1AB5CE5ECF029A066784503F80D1857979B09C456394443335CB6D07862FBAB4F50038097CB463AADF14E519C8834651 AdditionalInput1 = ABB21E501E85AD1EDC66108E3B88380FDDF810B10B883317 AdditionalInput2 = 3C690CDD997DFA9C5677BEE976FA93CAC21F5BBF382F7F53 Out = BAE872C9D221B1531F85C15F466B7A3AF3FA9C9C6B72BB8F5DAD77F3D12DF52D10347BA5D6504CD0A285C3BE578BB67F0A9F0137463DC01CDCB847E7853C5DB4CBB6A115EBFF7B80DB0406BACCB0E3E68A4A4A95364C2DA29466E160FECE7B8DDB65DFAB000C66CC8109380A601D5ED9 EntropyInput = 115C973D6DF41EAD464E22572DBE0761DCDB9AAD930B2E55A5558075FB7C51C94EFC5F8FD3079EE3A3C9B2D69EE0FD316A6448BC7D8E3B730948C46D EntropyInputReseed = E5DFE24D30175A89F1BBCF146037A07B324F572D0D4C27E42348EE87BD5A3BB45D51A7B6A109043A9B6EE3DB011DDA28 AdditionalInput1 = 937FE1A7A790754BFF99AD51782E8EF5B4928D0057B0C380 AdditionalInput2 = 3E89899F4AAD241A9189FFA127C87C15B5E3BCFD80BC316D Out = 0FFC883AA19B3CBDEB39039FD3760160A93CD663B8B358E9FBB6300DF164689303EE5F2489AB4AB2D522F6A33C93350EAB553A2499B15F8CA198303FF45E946A06D8A40959F33A759C5381B3A59DA22E68032ABF3DA3DA6AADB410CB41F54B3146CE57F9BB5D28BC823E3E03C0294794 EntropyInput = C28541425A7CF33E29ADAA91F326F216DE89976031977F104F44FCBCDCF457933743461344650A29972AA8521D6FB9DFFEB15C00903A283F20EA9914 EntropyInputReseed = 801FE4661642392DB29F15F0924566E72B596B23FF7B18D543CF4DE0276483BE1382F3CECC6A803551A40602584CD84B AdditionalInput1 = 03EAA10612895DB8F66D50A2210D73D1F563C3CA929D9F54 AdditionalInput2 = 8D2B20ABC4E8890C772BCAA05CB7B3EB5025AC4CACB5F7CE Out = AED27FF8EB54A7D2787E73ED2A51877C1250C0D4EAF10AADDB30409624289A9B7742CDEBBA54218C7C448B57F209182E214014CD180916A8C125AD438AF2E5F5CA5B00F9CF063F0C307560ED4378382B4572B97088F8D24E0BDF0FC3489F64074F1155FBB1163B54C93098B841257C30 EntropyInput = DFA52082AFB4DD137CB5209F6771F04EDA25794280983BA1D8CD2F3D7F9DEE556AC26D8A16CCFD20408082829AAF8A818885164581C9A1BD09E9FC12 EntropyInputReseed = 5A368D29096ED643089B65E9AB17B5F58EC816570499FBFFABE13D12A9F0133BDEBE14785DFEF5F08A133A6CB5C26A92 AdditionalInput1 = 485DAD7804DE594356CF3C571D5F22263C0B7CBD4DCA1F1B AdditionalInput2 = 5961F8177B6015AE0119D22E0A45A4AA1BCDC580F7E7F975 Out = EE48E57F1B5BD72C99C911D3353952C2C143689C3CD9B474A46E4ADA83811EFC67F2557D323723526809825AA338A80E833C95297D6B16490DB633AC1F1648071C3AD4CDCEA056C41B4EB157FFC83C3454B0CF001F1E01C31E48A61587381E293E6CFF97270C1F157B069DF3E591C2F9 EntropyInput = 95F3A1AEACD07218A2CCEE44C807F790E568E0032A42FDC7C8DC9A71F76BD725AA909DDB658B7326CF6ADBF7208D37CD69547805BC3F58FDD874E143 EntropyInputReseed = DF5457F1DC4E69746426A9C56FBEC603867633EE36A7FE62D44350C7A668E64873FF97C31D79CB23B0F1620AED7C9D23 AdditionalInput1 = DFEFFF80F10C3143B82DE3392C395AB94AC8A2F4C0A30048 AdditionalInput2 = A6D21A762AAADDCDBAE9B9ECEFBCB3149D514C94FE83EB21 Out = 4F5E544491B72B84A0D0532D7F9CE01EC2DE6A05AB5056FC75D8F73BBCAC5FFC38E20745D0E8AA1EACDEFEA6DCBB92475B5CF9CE0A617E5603B7B9FE34F4F4CB04ADE2DB35CCE1FD315140E3E4AB8472216C7CFDAF004181351F210B397C3147DCD279F6FC2EBD96050E996F77AD6BA1 EntropyInput = 29A1897D6EA5DE66E551F8C106F601E421DDD940812530DF00F634682F249AEBDAF86938D655A179EDAF4B8381A9F6A332ED5B754DBF34F650D19867 EntropyInputReseed = C895C11F9FCB0BD1FCDB183B4F8CF86B3429A5372CAAFE1D31C87BE686B6F90F3D1B0EA90C541E16F3430292A5C4755F AdditionalInput1 = ED49403700CEBEC30D1057503BE7BAACBEB45BCDFD9A43A2 AdditionalInput2 = 952763380AF3243C6C327F23CB74F8368919E0B6B9C25934 Out = FB29067BDB23C0F0153932523EDF32D0E3C18E46616E07F39A4B78091ECA90349F636FFCF26B68A4CD0902431F2ADA91BCC86DC223DB4AA7A42E7CB57A852095704A27F9F07962880A50D2CE16C125BE1E8D4F54A0CC5EAF63150C32408DB6F39B22FC93B853CAABA9E49581F13A8815 EntropyInput = 387E31BCFFFA51323A92D90713B438A1F4DED69707BE3AA517E1E72D448ABBDF0A17989BE08FFF320A493D70EA4CC85A4CC604664A0DEEC8F6C7666D EntropyInputReseed = 3DE7C43C621E904F52DB52AD823DAABFF9C10B3FCA93ACFA969CAFC33E99964833C4D0F88F906F5429B5DAA552F53BF0 AdditionalInput1 = 8D6E6F05301EF5CEFBA752F3D0EF58A25775D6B69F6C15A4 AdditionalInput2 = 72292AAA69FBEF6F010FA4D5BB63D6D7A595395D79A8C110 Out = 77EAD908484044482DA529F9A6F4CA6E6D8D49954D2E2D5C7DC455E03BEBF484021673727BBC40ADC8812600201B8C2DE8E658191422B80D23502329C84C0CA061B212952FDB2ECF3106DD20E6455F1F231E1DAD1CFBF2FA019DFE9C162A670AE20B252AE2E5A4CA0EAAE1C679A7FD3B EntropyInput = 4584B33FF224BEAFD37523A36FBF6BBDF77A29F8DB6FE884EF99003CA3EC082CC112AE93 EntropyInputReseed = 6A864C3BF7DBA18D00B3ACF36403EC05F4CD677965644715 Out = 8277DB943FF25BC275F3DB65D67935E2C992EEF95DA33BD4FBEEFF7A305EF870BE0C406D23713A0CB6676CDB7A11866E6920CB5C036011B768FE753342D167CB3C1654F4BEA704579EF8087491AD0CF9A7B7DB8D6E53178B6EA9F1D1B49B901A797713195246164A6B1C5680BE310FE2 EntropyInput = E6E2D6509626AC4A5E96A82F2D9764EB65CBA73B79B224C2F8A11690558BAD40483C254A EntropyInputReseed = 417B36557DBBF31B8F1FE4F7706AE124199E2552D4C42925 Out = ACA0DF82249F536950B3E921F36C76DB6B3F7FBED3A9DEAF6C24E5630AC0A7B6DAF5A6F24A6A09849702D640F6FF2FF33EF5DC3CB199B95CF5F13F5637BE387506A49C79BF3D5C63B27E142C85A6D25F632CAACD1CE990A66F501010B3EC6F4E6E6798F79439F0923DA7F71339452A84 EntropyInput = DF524CC137ECBC9ED5797E0C79F3635D3935C4155E09C1CA228D775E3599B39DF06722BA EntropyInputReseed = 3DD95CD97F8F5954EB5CC193D99597268484367017830A93 Out = F3C8696F7957E90C2BC97EB0E6C2B72AA6CD6FECBF170E60D0997EDF1A5F5AAAA8BCAFCF68F9D87E83AB4CA0E592A4D7782F17A4F3F9314D39B0089BFA639F90D63F0B573B9299DF708EF96CD8BAE6556D3222378C6CF3554F3489147D0624C21A23DB26740A230B59A8822BF3366373 EntropyInput = FC644D63825C7B36D5E7AA3AE5675B7AF05776BC2AB8C855D0FC426CF3E6885943631EEC EntropyInputReseed = ED4E3785E6432126B1B2C1C91561EDEDFFD3B8C2E14E93CD Out = 3AC7F56A77BE6C515659BA606631A58EDA584100E16A6674DEC050C5D0C103924D1536929B95352E39054D0845329DDD925DB9339676FD17925C0420FFF1A40FD75EDAE17F014F8BAECEFCEEF587B736368B800DBA8FC3493BEC6680D6FE95C026619B441F3E06C38BF648D6EFAD58DE EntropyInput = 1ACD1D0BE7BA35AE5DDEBB428205439054B43A59EA5046069D88B21B2196A43D81CD4476 EntropyInputReseed = 5E5614C43848088C032E8E1A168ABD15A5A558AEA51DF260 Out = AC4394292ECD9826DEE8B596D090EE950B610E98E4B0EDCF3F983617A9E9618320A88CFC54B9D5B42F44E2DD8FE45D909C938412E2BA3E662BE5AB49C79AA4DFDA5CD344FC1FBCB9D54ADB4C9404BA22797395C175B9C16B9B3175A6541AF44DA9BA452871B815AEED629F15944204CB EntropyInput = E4F2801C28D190A965831B61B9B1518B0C3715469D77FBAF427A4596FD4D2286C0865176 EntropyInputReseed = 5FB0037C0A663A82BACCC4C3364F2DA67392DDB773714D60 Out = 9F6F9FDBE7A16ABEBF88613BF307CDB47A2B0A9AB1547C308E29D30232FA3A1461C5B8B39B2D70F3DDB970A1CFA40E6A40CA2C7FAD945931A44C7887D0370DEA3438A1C8CDC8FB1A846A2747AFA5F3AC85174B3962D9DDBAC55A599BF6F353ACD433CC84F4A24DCED96B608AD1705FE8 EntropyInput = 8EB21401DEBCB726FE5E4E13AFCAD9103BDEEF385650EBB6846C53D3889B9AD28759295C EntropyInputReseed = EABD93E12EA629D42F4DA7834FFC67930AE82275DD04045A Out = D748A0D711729F71AD97E44D81CF9EC11B97A77B16D22E3629F04EA15639A5FC0E9274598983ED44E39FA9D1B242F8274F8FDAB10019AB3F99B5CADA0EFA5DDFC7B450BA6D0A53AED24F9E1BFDB1E9C205576EAE6878709518E8D80F59BE51FABE1A0965856C85C5861337CDD4BD6A00 EntropyInput = CA622C90AD71704972EC0A43C7BBFF3BD6ECB516FA2733146BF31A76E300467BC848408F EntropyInputReseed = 3A054DEDA83F2EB99E3305B594BB4B72237EF4ED69927B8E Out = 3B6DA864061FDDC94B1C80570AC279C947361C7D5FB215F0D7168FAA0A7A2DB4F40BB83078D77A55E4F67C18A5D4F43F30711E60A9997568366013650CD57A377885029113DCD2344A98C3B053AC2256EB75199B3BB388A18B80A56AB003882C9608DC542B0EE36E9CAC56842A2A9989 EntropyInput = A9A9679159B8838AD6C27E44FF6A6CAE3F4767A825AC5A976315FFD452B1CEC03509CB97 EntropyInputReseed = 4EC53CFE9D648DAE47A44F73A0B0E8EED13C9AC45769BE20 Out = 72A3BAD520E41B534F9CAFF4B50351DF37842C5E4C9383E082415A61193C4007295D27CE2DA6C30C4084129EDCDBBE34B964A1C10E7BC0B30DE936A3AFDE6CD857615C98B6BC754D57DF9320CB0448672073E46964E157E52B7C80D706EC8A493C06D29DB6B9D372C479EC5C4B1D22A4 EntropyInput = 050B7F9651E4081414BB68BA3836C70125F0B9E6C626F45CE1B98F7980ED56D670754C88 EntropyInputReseed = D7FD7E2B727C358607D8E59EC251F313485A8331827ED24E Out = 8DDA98B2314D0EB03BAB3712E79160B7BAB4A07AAB13396BD21A829E06997E7AE3BA63165A52E943902F093A54FAE9AF3D67C752C06F25464248FD241EFDAB808876BA62E47A9D1FC6DAD17BBA00A36F40B7BB698AFE97B386195AA992F1C0128D7D254D6DFED8157428176C29B6B37C EntropyInput = 444EB19BF02C8CDC6305C3A0E311C2F11209DA6BD30C67D18761288628E58026FF6A26F4 EntropyInputReseed = A38B521D99BE988E5A24F72A4F723A40CC665550568811C1 Out = 1691AE568D2290C2A4714A03E0E576DEEBEBABF416FB59D94193D737CF9CB43036C55E04143A319B385CB3308364B5F9B5B5DE300FD50D10FDF95FD9AFFE97AE2436FED2F91889BC2AC3102D53B33118210116E1D01D61BC02B28AB76D5BF493A72D9C6AC2B732BCF92C2953694FFCF0 EntropyInput = 93DF9E24D84996CDEE38E4855F58E3AEC42194103CB1AACD254E707A174C24E72FE0EDBA EntropyInputReseed = 2447937906F349A612D85E9E4827865079A8880068BB2C63 Out = F6C14C8B315C1E4B5E61892315F5F31DE9EADE220CF27D3A27572ADE882844F342E394E46B6C0BF52C9E06E3C535AD1CA26D925DFFDBDBA49C2ACE8D3C94910CA65159A2C6DE5A8269A8807966644F0D6323209C5A909DEA9574531FE23D9109B7E979382A311BDFB7FEB4AB9896FEDF EntropyInput = A7C342FA807C960A151560AC2FD44656583921D51B889A3DB6EE6A32047F3C74E176EE04 EntropyInputReseed = 082289181887FBB2CB143DF4DCE92771C54254EB3BE35939 Out = 90454C858533F6A67CF1687A5D29CDFDDF7A870367E97B79B53F0A845514A3C290BE06A3E16C4E05EC9A820E896A4CEBC1854D4540A883EE2EB18076F0A3876019B22ABE2A8B103F226E38B15FD57F21AE327AFCFC460982FE8954D266FE39BF784CE962471AB7AF9EF0E430E7C3E216 EntropyInput = B49D946B70A5A3D238AFB1937CEC924F077283054D169A75008A2DFCB784DA2053CDDA51 EntropyInputReseed = 7BB845F6786ED049DE0F4C85C84A55E36A78AB3E7895F339 Out = 68E8E12E7063C14D85496E662B355EF6A5D879C0006A3B3CDDB7CB107254AA1ED0C6EBDC6419F22E786A308FCF61BE830E42C354571D728DEA4B2C8859D48FCB1AE075928AA2B47ECBBCBC3EC58FC189A80B530C294B96A526FBDFBBB7F72234C0E9252C0A410F26E52A1D0EF3071AC8 EntropyInput = 794B1400E41573827FA7860C7B9E2DC78985178A17D616B027E1F6A2ACC1A6379CBD728E EntropyInputReseed = A40B0694630A7497269666B8E78F63EF1F53718D9748C7B8 Out = 5E1A9E94334B8C8A91BAA12BCED82EB2A745E3BF669247FE18CB266C62A3F796BE8F83F669758B921A6B24B5A4CEAA7775E329FBCA70E34CA231AC346623D7070A15309DDD9DF130F47D4704E5FB445842E83D3968EE55837C4731CEB210112532668083EC549D157193C77121C83B7A EntropyInput = E76A9DE247410DB3498FA22899A13CE849F070B5D17C49B92E2D45ECB1259F891A199B1B EntropyInputReseed = BF2BC8345C276834E859564884B013DC4B5D2BCBD9508BB928D8C254DBBD1D1023ECD0D5B5E39C74D01763373B1E1C1C AdditionalInput1 = 28255387CD760E8E0AF4C3699194C3BBB9D13CAAF9DFCCBC AdditionalInput2 = B4705F4028D4FF0551198B9BAFEDB348AAF1C818F283E2B7 Out = 37590F7F99BC412A673D33725AEA2D2606E844B4756BF3AE1D2CE4F47F412B1AFADC2549333A808AA8CCA8A4201C8AC9DC12834858D40B88D46F60EEAF3E6350120B75EA83FA467D00C237259A4243BBB1B834F769C24FE6344B59E878E0828E9321636F317E7F33980F23EAFC931FDF EntropyInput = 57976666F4FE95A6FE125F4AFC733CB59D82BAE546EC33FD55633D8C1E32241FA3B90775 EntropyInputReseed = 08C06191B88F4C34DC8741AB094F60125F3D1BF694D7C58AC76C7188B5D837B7AF3A6E948CEFCE76FB42CE72728B0CFF AdditionalInput1 = BB729C5090D32DF046EFEFF7DAFC14341A71F03A828BB4CF AdditionalInput2 = CE4AD460800DEE178F91F7E12497A19EB53CB45B2632EB7D Out = 1CF1B4102F7465D0232067DFB9900B46C1E74D3B672772BD6C7BDA04EA17AE0EFA34DCA3B39EC4E07533296BB8597BD6E3B88C072A1A4026611CAFF6B8ECB2733C1629D5680EDFE0FCE391AB0A54828B67129CD9C9C57BD62358EE2398E64CAC3DB26CFD4F1A0A3B8DC9BCDDC471A6C5 EntropyInput = 759B4B7CF754809597A2D69B7BCBE235E6D5684F00B1B24D05548E36334335CC196E6286 EntropyInputReseed = EA6448B4CE47E9C298774D47B52D053F8CBED9787B49DE5B8E540D2C71AD0A1DFB2BC03C4318AA9EC15DDEEABF17FF67 AdditionalInput1 = DF8D08CF1062E26F4D98678B9DA503A6E7E4E96B92C129F6 AdditionalInput2 = 7ECB2D074B3481A1249BB78DEFD10ABF64D7D292D9AD37D3 Out = E45ADC635871C8A35F59B6EF1BFA71CDC3849B93F6B2384808B545192707987670E870B3660729D8B8CD959669963B6D7C79A34B2AC54AA2C732ACC987AC9286D0C7D028AEA6E757FAC25E75F1D81399B632EF59F483897AAD2B9EE989FA414DB574A3AB85684CE33465ECDAAC37A6D8 EntropyInput = 19520C19C5CD2C6EEADAF67F55D7E1708247C25494A188850F2DAF086ED7E4039B4EC664 EntropyInputReseed = E13602E3EF32040D48EAA3DDAAC6FBA7F88AAD1488E63634E33B93126631E424291036D4E610DF4E40D8CE271CC8CA0F AdditionalInput1 = 529DDCA2759655A025D25C9253B51321F4D13DE5A69846AE AdditionalInput2 = 4F0B73D4300CB048019656AF08ECFDE262E93D4AA557F32D Out = 778224810204E3C1EC8EB50BF1D984A6E988ACFC34B0755FC3B4185817EE509F492985A9F7C8838BD17D6DC4B7C4CAC3CE1D4786094ECD6EBE7ADE445C6C66A36486FC11E95CDD1A3F68DBEAFC1FC7F36671C1AE8D8E540A0184EB09C09C9D2901372B7C8D251413560B4E70FF50AA23 EntropyInput = 50C476349FF270792C1887DC3D0958493E77D9036791952763F732412F8756CE937E0082 EntropyInputReseed = 986723467344BF52D0AA321697B1CB64D0FAA88C7B08CE5A57962BEC9F7997EFD533E22BFE85A2FADB28C6A151FD7154 AdditionalInput1 = 94F4716497AD62C6C75314368C5AACF314F36FC13AEAAD6F AdditionalInput2 = F33D8D946E261DBDFBE3E4019375B54E5E24F32184AEC342 Out = C2E6B4228B3F96F85AC6DCE517F4C7DDE5D5C0465AAE7BF640664CD195EB04617FA121308F73D6BC26E5794CC73A1F51B4E9F81A91B5A7768A40ADB262877AA7D4FF8470E7966D72C08791B792510C5EC46009D6B72BD64932B7DB4C677DA3DDE7D53B693361369B9F83A4541D95664B EntropyInput = C6E12F6A6F85896F9D4F49D85B3FFB89C9B2A04A54938C8DC637A5B14C65C3CFFFBA8BB2 EntropyInputReseed = 4569795AE28361AFC3839C221B9F5C6417ACDC46766325F06D3F0C8D086613892E0D906860543AF6087C92AC855D3936 AdditionalInput1 = 89FF32B0590CCEFADC2E7AE295CCCDADCF89A8C581104520 AdditionalInput2 = 85121B645120D7B52741C4EFE02FA522932CBF234138E4AB Out = D90984D9AB9B77CA73E37B30C0C4F13EE87065AC9CCDED486296BAC20C35FF440ACF5BD3888423A92B0E55C28316D695C33AD1202F546B19365F4E0A31A40B22A5424756707DF11D93C5D173051C7E1A5F801EA43097CFD20DBE963EBB8F087AD724CCC767039805224D0CEC93F9A461 EntropyInput = 5C5ABD7AC1CB78CF1C32B2021AD2BED42977CDAD7AF20233261A34842945F3D86314AA43 EntropyInputReseed = 1C05523F81CB5EE215EF4E841942346B41667D3C5704484A2AD671D17DD03C7A648D459E16431DE50EEECC79E03958AF AdditionalInput1 = CE3542016071F51D67FC75BAF64BE5B5F925ED16FE22412C AdditionalInput2 = 91AD7EEBC3582079A1529ED3B8612C5B5D24011D3C1C7825 Out = 6205439535746D98C86F3A16D35F4B1EA4E7869CF53C53563AFF33EDA67D2790715866AF9176D1683EE6BAE0CBA5B3559D1A062F53B4E14E2AA3B776949B3EB35F7048B80818E6293868A57E669B3E8671F582CD5E1891DB2A19C48E00EC16B1B3228C7905FE267642347F33B47E852A EntropyInput = AD5D87FDD61DA2AD9158640D5A4803541CDD5C5DFD4A9F52475A5EBA235B38B7AE223700 EntropyInputReseed = 19482EFDC5A38F36BB22E40DFA8DAD2CFE9E56E671535ADAB9EE2B6E5BBC6D05A24EE606FF798D6ACE89EA5A4B7BC4D4 AdditionalInput1 = 06533966B457F59F0146FBC8B355FED4A272F5E8EBB10DD9 AdditionalInput2 = 2376A47AC59419F4E78C10B1049F4DD05A8EF15227BE71EB Out = A2229EAFCCCFBBBBF2F6F6E9586941CE5D108640973E3D86D4B1C9295864A2435644A05AD9B52F60B0B170AE72231850C96E3A8C0F813FAA5A6B5B89A6ABEF0735B7842D2A82E71A528C1007A86F7EDB257A2D92066F11F0401C6BF601E0BA5B0C566857FC84C344021AE65F78B0F79E EntropyInput = C55F8D126E608F1DA3C2565CC82E4509B610753F59E79D0A3A08DA5CD1E74E119FCF0578 EntropyInputReseed = 3613857A8862E12908FE0CB1141AA4925960C6E6E419A76257051989953968C0445C01A5877BE106FE528C65C3244FFE AdditionalInput1 = 0C9F6C3751CD855173A5CE1EB7B19F2EBCC5F4BF7CCF0BED AdditionalInput2 = 2B52CD487A0D04755364595F54055ECB2A3478BD9CA10880 Out = A2A5B9E5F0C49425BEF613798C6DB34CBF0556966AC29745045A76635F41D0B34F721AACA59AC13D98EFE31C8DB068CC9432C528517272F1DF52FDE3FF0E98C4F0ABBC5D59FFDD5A1E11EA8B69F205D431037A3F158511F214E42D23010E8251DAFF262B4320851CD526488046628EF4 EntropyInput = EE5E5ED17DE9770A06F6B23FCACF908652553C57667B1DB9A30B12E77AB9AE31347B415A EntropyInputReseed = DF860C0F73D332AA9AAB1FEBB71D3BCCE468C1947F7E55E9EE6B8E2A3B44F98C03706438682A3CA3E61265239CEEE512 AdditionalInput1 = 1D13E569B56AFEC5B68B96CB58A6D70972DE12B5F76F6DD7 AdditionalInput2 = 93FD7D8CC865B4CA4F263BDC420B37EC7E74D53829503F0D Out = BF63652EFB2EDD5F9432DFE1DF1C753012FB3868081E60EF3E083106D8E7E0C9E98ED019739452D76CDCC019C60B14A3915DC71F3FA2D89E5C61951FD1F40C327FEA53CBC903DD57806F34284307266EBBB875592ADD76633FDD4FB7D6DB7CBEDE2D9C39677107141B17CFA71312CD7A EntropyInput = FCA6DE53834E64CBEB21CAE79F763E0561F13A279A26F78F34845558E8778548896561CE EntropyInputReseed = D60B7EFFD1A32B36AB745A0D3CD5A72C8E2712A46716ECEDED84F569AA31936AEF3ADE81BB00C145128501A4EEF0DE56 AdditionalInput1 = 36B87204FE2E7914886BB30C636F3F6DCC513C49C3393985 AdditionalInput2 = 69AFA8AEDB5925A2401901B471AA471760E4C950714B2DB5 Out = E3541A207DACE456876B133A6D53F440B8BC80E59580700C8E4EC1873CD68A0475A930CA87AB6C0DD7673B3D947BEA82BBACF2CA2F6C068B8AA8197B03582A002F8596FAACC89D056375B7AD22604951BAA3233248CCA02BABD49A8CC681B6741F332183265253DC2C8CFE7E6CD53EEC EntropyInput = A4EFB429ACAC02CE9DAF4109C0A68BF391D03528317B925F149D596ACD3A49351BA6A1DD EntropyInputReseed = 477EECDB9F53A77D47997153134C612950390E6BB82B5060A907F4369CA854FAA7B4FBB9CAA3BDB3CA63E9B0B1314FC0 AdditionalInput1 = 6EB0AC1E9C237274EE0F20A062C559460EE55FA4F8827F81 AdditionalInput2 = 5738BA932C241ACD8C70BE434E441768A497D9D1ACB044F8 Out = 9CC289FE002CB55D88F3B43EDA6EB0302382BE1F78144FB0A9FF0B53759BCE714F41E0EA1B9799B592885C7A5354FFC65DACDB25E138B508D09C238F247338BAE7DE5E0CB8D8EA1A387CE23736AED673B677750CF4517A21D2C9C9DCB5E4CEA57CFC00CACEB5C359E468F74454803C0A EntropyInput = 0C516200989BF72F8CFFC21886B40595AD3ED81A9DD93C6CBA7402F825CCCBF38488D6FF EntropyInputReseed = D397DD0274F3C83F3D118490F73FEB37345AC42727E9A5668D57E8EEF0589645580BC1A68F01FC3C0F9B2F8323DAA20E AdditionalInput1 = C56B9F7AE8CCA2EACFB11CD3030981C02C442DCAF1406A94 AdditionalInput2 = 2E2B33E565B8A454C921792C41D7AC3285F31A078533F0EC Out = D43EC156235D466229E92DFE8B7B92FEDAA4C689CD549E5EF25EE1053820AA07B9969BD2F8B5EBC9D594BA37C2C6CCCB7EB3655C8C8865B5420F55CE6A050E8B9FEC60D8BA4CCA47DFB13A2FAA2A2A1A993179373CF1FD20F7A78FDFE15DAB38DD3A46F0B2A133BE45FF4E26F8EDC077 EntropyInput = 8FCC5FF3C7DDE991C6D25F9B4E65716E46935FA83708AD9C5FBB9D9F2D7CDCA99C6E7FFB EntropyInputReseed = 625484085CF5F1DBEA28D3CF1BC5AB76625CC7D27DB70084B03F90388DFF70731C9D2148014A2ECF6BEA927D2DFC231B AdditionalInput1 = 8F64F7CA57FE4C14692E0CB18637122FBCF58786FC3A48E8 AdditionalInput2 = 22D6005ACB32E980BC6DAB9E534EF7CF6DAC0A2A7B05479D Out = A0DDEEE093B5917D9F92DC0FF5AB30A4E4851842104EBD9A516C6C68EE66B1CC4E1C930AFE8D97564481D92F9BF1BBA0BF9B90554C4F46A2F8FFAA221A67D4423274B5F8284A69659EC868CC66D1320BE57DF370EEBC12C6E377C25D483493773D8E4FCC87EC440A713DF65BBCD3D5C1 EntropyInput = A9CC66F1FA4BC6DBFF186DAF324E36B326917D4E24759372A861AC9A9D4250C106E0995F EntropyInputReseed = C92FAE28CD1EE4F2E5D1D0A1913EAF76923825398872196B51A35611732E2149BD8A2E03E702F59EE8FE4F45D7107326 AdditionalInput1 = 3024F77E70A67E7F5C06F0A4B233D1E0746333B56A5C8BE0 AdditionalInput2 = 62D3FA1C04C6E34A5A5FF98020DF6DAD154F3E10A38A12C1 Out = DA604FA35FF14CA2A25EE25EF23E586CB9B61C7BCBE1AA10BB44417911828205AB12B438DA1B0A58166723194A81BEC6C59822FC5CDED74E0E96DC75A0D14DF6462E0F05F57496FFF409CC77C6ECC22481F5B5F68B7FEB5CE9BC4BDB63AC3D4240E0C112CD0ACACAEEA2E5314E02C70F EntropyInput = 166864C6E1F1C75DD668547D9E3D144D267B1F57FD39C8B743080B0E5AAB08F87CFFF183499F9D1A4D46AA794BFA3F00B80591DE26373DD9E276BE6E EntropyInputReseed = 37FAD4EE320602A0BC8C694E1E88A2630AE06D14E1CF2F87 Out = 0783522262CB369FE68EBE4AA0914A41C59485A3785762BCEC8CE7E44C8459622BB8181495CA7F512F7BA6EAE1F8EB9213F85B8651DC696EEC59D3CFC41CD4001B26A68DB179297766A6C86BC7215C395ECB221D83FAB24D45441F66A1556D4B57C1C7BBB33B3755A596DC2C5AC43A25 EntropyInput = D73A262188BB859C0767158945250FC7582D5EA20DF939E8168E5D553335924880E1995EF6E35987F829229EC01E3DC43CD78EAD9ACB8C1ABB12551A EntropyInputReseed = 28E41384C22C55852A5F91A1516194C698FB5628C5236181 Out = F9BB802B18B7048B8498ACDD01026472C52D0A3F0E9649C7F4DA15BA38D4810C9652BBF8E0ED8F9951C2379AB8C75DF344868343F6F99501A1932B9EA36703E76C21B0D8E38977D9286DE6C02991BDFD5E81E213A416F68DFFFFA3FF5C5FA6E96C1DF9AB93F6719FB7BB42765B58C0A4 EntropyInput = 3DDAD14470A08B651B112F570A407AD88DD5AFDF93EADE4BFD615CD2473DD9DCAE759CDF63E5FE1BB13BB44D7B284A5513768BE531CD70B17B87A5E0 EntropyInputReseed = 61F7D10CA480801A5705477A4725F081DAF001871ECABD36 Out = 6943F9B891D73AEB0FDB2E49F755D3A991DBD037038A9F47102C8394E28B6146B8D5C87FCA3A9F5764E8866DF1012C8DDD1C0C93010D0D63898C16E97978FFAD60967E2A7F6BDABB518629192C0DE6332BA48E4669848BF8C4AB0986A109F4739AF08801B6803B014E4B103479083496 EntropyInput = 1BA8C3230FDB8616938C083A93052CB37BE5123664F54DE4860DA43158495D46055EE1FB3CC6B3E8AE86EC63B4829BD6A94CFB77698BBF76E56CE193 EntropyInputReseed = DCB603FC9735AC3BF71488E67C0C377B8641EFAEA640A581 Out = 2C488D99D60751A5CAF5AF34F4A75F719B16A2955865F926C5CEB2D1F0E6FEE6E810A44F0224FAC1AF36A4DAF79AD05122D52E7511EF476C883D3EDB86B700B88B5853C4650952015C127865C5EF578579DD56CA4234075CB89C47D9C41C87090FF68FA65AB7C83A2883EF33DA5B9E3C EntropyInput = A0250ACDD07D8386442CE7AB61AE47CC2C1F1CF42BF3F872ADDAD68C711E543A33BB9AB23F37F22789CA58A15A52231894FBDCFD245D89A54C1D238C EntropyInputReseed = 8246BEA87A472AC6D61849D61F507D26B14302A6392979A4 Out = EB44C545138D01DDB38A6AAA07161CADA4B25BCC573203A5A83FBF0DA838C6D498DF4B8F4C6334B3010BDC3442080E1C2A65915B42444F819DADB283BE43ADBF0C59A8C504E8E8B3CD3658E64F7F8F4D9FE1C443716833ED2B0C291E8C73C25D5282FD0A045B477CED2EC381FB538900 EntropyInput = C29515157FEA4222A070D2C9432C3487D4E1FFBBB5658E5EB07DAA65C75BAFF4796304D6401E45312B71F978BB26306E9CAFE2F723C70A95DB5C4450 EntropyInputReseed = E35561E3A8A3A9817000A712AF1C6BCC9E4B1003A49A230C Out = CB7B41B3CEFA3E9BB6E015A9934D9DE9E1F228AB1673FDC211AA47FEFDE393CEC8196DE79FA2610C70FD917AE3B576002C50D0211B00492BC84AFB7BD3F86142C6845588E394B60DBB3EA6078F90F8A4FE246FA4792CFFD7020074E4D87909B2DD514B3CB0F1C9ABD5C6007F6BA9C5AD EntropyInput = C1513C89A75795FB634457F9AAC86A87D1B0E05854C32D3DCDCEE89999356F2079C51B6A0698F252EA14E06483F6F4300E16E9AC758D50275406C7CE EntropyInputReseed = E8BC0103CF6A2E0F63154447FF3062AB4D30F386050DDE1E Out = C8464B48E3556179B439F639086B69720F444D8C3B35F00EBB6110A333070FA62914160C7143A1BC4747524FEF2D7E66EBDF4BFE4355BDE19C80CD3707E3AA5493B6740B050C354047A245D8A69651890441946B3CEDF749DE775E319E04CABB56DF322A3F0E4B2AF3C5825424FB4048 EntropyInput = 568CDF1B4CBC4C1B43F555FEC14E8583D852F4C372DC435536335FEC870BDDA29CE2A1EDEF393AB1B0C380142453B1B9947CF394A90F0BEA171B68AD EntropyInputReseed = E5D164606DD5EA6247BEB349E1F12BC401D96C70AC018A85 Out = BDF24E7DFF7A33F64B2B4E97E904B64C9108183E501284FD621E6E4C6F8AFF090581DEAD7048ED27F67C87C25993288F0D3198229783BE2F5BC380E8C494768CB34CE7375F1C8BB11A9E0534B1E700AD54C5425FA8FDB20C2C9901653D35F6596E268E6FBB8C8F6323C050596E844EC5 EntropyInput = 94ED31B038C036B21AC2A3ABD1EE49B7EBDBB29218FA522630B42702C246137C9836AAAF20E17E21BFB37C8E1793308BF3D4E740F2171918C02A8906 EntropyInputReseed = 219091D83FC404AE27BA26F031E8833C4711CAB0E18924E7 Out = DC6AFF5F34E58A606A54B57D8CAFD6BBF242CCFE5463FD0E9926AD8DAF4F222BEDC17A480EB2640FD56B5DB19748C59EDBC12D279107CFFA613F079E2A7FA90C4EB3DD5640C0C77D07F0503339760EA03370B7165FF841FABC7EDFB3A811E3DE30B7B0C0F464B4D83F088B9066DCF9A3 EntropyInput = 7E156DA2EFB5FFFA057C06C707B0667A4115090067E9E199D8854EA4A1C4B7FE31C4012D8204FB60DC1F8DB5FB04696DBA7E9E296531AC124E5DCC90 EntropyInputReseed = 2DB2DA3F3E3184AD5C173AB05E3C8A7ECDD4D8081F1CCF5B Out = 665ABD4DEDAE85780A8B3B80663B8E38ED327987B6D8D6F72C2C0290737180A458CCE65BAD3E9FE334D79DCF2B6B538B80A0407E1632B7A3B72338104887125B81B0E0453C2D9018D9B97847F62E1353D48850676F12B1C51455BF5B5A478D4B4AD02F0523C6C757281C3F996AF03216 EntropyInput = ADADD51A6EDC5ED0F54D6615F8D64393F1C227B2FF69853CF21AB48D4027E57FB5EB31990E294F949352F76F1D0243EC59EE65B35D2827EC05676FB5 EntropyInputReseed = B96109A9975603A14038DEF87F8605738222A282AAF83C9E Out = 6BAABCAF455EDE563AC1E271726F2BB2E081E4326E1EB5A229D283D0FEEF043CDFECB6EE6A6569A4E8BD43080E04D590F39C83E4B21EBB65044559C873A864D814E8AA6DA8CA182B634F133B6027C963F877A8C1DB151677297B146828F63B68FEBFC3745FE92045BFB2C646976026CB EntropyInput = 9834D60F60CA12AF0341808A5407DF66ACF97DBF4DD8AE06EDEA8B1795CC7CD44286E4D4042234EAA053354FFBD24F0CBB0A837B4565D37D0ADB0D2F EntropyInputReseed = 529950D6FEBAA751A3DE0C039FA8482FBD5A4AFAA3456835 Out = 63BBDBBF323D313464F760D9E761B1D85D4751FA66246DFA10C39E8500FCC666C6E91DBE5D75DD28587E62659A17DD84FF55E3B8B4446CACC49ED9E264863760F0449899864B0762D621B862E550D1B81016936B227D9CFA6860466BFAE87097BB38565D33A811497B972002C4C0ED9D EntropyInput = E972D354406CBB9F4A5CD58B261DDFC49744270324E5D5267042923576996682C1EA34A080F76CFFBA7E5391F5D4967D5AC9105A80DB4F3F1A0F7EEB EntropyInputReseed = F05B970DCC6928B7CC57C3CFEC6A850868BF0E90CB7A0420 Out = 5CDD3785878CB97B3B778FA6284AD539978E85BF09E86FAC97071CF5C2F548466752AA7CFEB1E32CAC176B3AFB655F47F6ED775AF7256E3F69CC9B34B977419EFE2C4BC236EC125C58D57EAFDF54055408688DBD42F586DEE06CCA6A123C2D3ABA3865FC29E4E9680A94C54E747A5C65 EntropyInput = B66B77AB5F8EF02B59F34A9C83B7E6B1D9BB4DA0AEDCC6B9C071D1E8CBBE6CE7CFEE7BB748B837AA8E14BC3F3907FC6BE2FFDDF0B3D3E3F3D1DF1E52 EntropyInputReseed = 29F4BA6B08E41BD93B4B1BF43245C5F0BAC975C3FB907010 Out = 9FECE342A45EC86240D73F5981B3CBCB4E93133A8181AD1C85887AE66B3FBE7B11E1FC3EFCD91D42654B7947FF5C7F940D1450578A3E78400C344B8791480CC47177163A74A3B172F082D37B32AA8E2D2747F425EDF050EBEEE2A4078F22496C01A69BB9872630ECBCE832FDA645E9E8 EntropyInput = 04C5C1C3DDAB060731E30B59011CCA48500E4B94C85059FDD1956619B57595B9733F455345093EB15F7176782FCFDE904B765881383F18A7E0C60D76 EntropyInputReseed = DB29B0DB2E9E68FE64BB828396B2A2AC993DA3DE9E97A3C9 Out = 40C13600CEFE46F8E44DAC08C749A38CC247D92F0A71B85FB79AFF36B25AFC49445B35EB382F1FD3B3388C013546EF8F9A3C203273D89A86C6170046CA67C790D5896A57B483539CC5AAF4AB4964DAA19E72C6EA583F59455BC66A28C77C59B8F3FA36F8C91BFF4F15893ACD807FF2DC EntropyInput = 9CF60E04DCA78047BCD3DE94B6E62B046A1FE32D9BB7AC06A94715BA0A9621AA70CCDBE08743CE7361B96C5B044AA39202A06F3708CAF2520FE1D0D3 EntropyInputReseed = 9EA85479DA2BE2484BB9092E993C213B8586F1122B0C8D3DC57B6B460641AA7C16D7452AA33DF1AAF402307FD38D15EC AdditionalInput1 = 53BAB9D21913EEA1BC5AEB326B36E85E893DE5B215DA1F48 AdditionalInput2 = 061EAB8499792F51F524DE87B31B7FD43F2C28BE4AF30443 Out = 7D5047275EDAF529E84149F6F6855BAE69744CF3DFD6C34D4CB9F47A82BBDEBDF5E8B684317730E833B7ACB291CEF3077C1CA9F2320A602FF248249D0E73249D40C9FF182A9FC0711C34B8A28D1D2FBAC01E6828F159437A1BD5A986D639E8FDA427450EC75C39654513B5B4D1A9CACB EntropyInput = 09B662EE008D6C3E13DAB5DEF331D72296B95D5FC5EBCC9E377AB95872C629E1C79B740604C59C869E9D543EE5369CD218447CDEC1DDE400CB115D94 EntropyInputReseed = 699AFEC8B9D6B5DB969C2A0E7E1BDA7B7B4A4D0AFAF1432A9D91AA79F0738FF30C77717331959956C263439EB727FBED AdditionalInput1 = 3F4A3C94A956E1AFA286E5732AE8508EA666443CA80EE1FC AdditionalInput2 = 1264F3DE6556FD22A20A25752CAE5CF8DE2A9C4B3268B7F5 Out = 99CEF2EB450BE818F67F54F0427665E2095D72D2E9ABEEEDA79958EAC2EF1D0431BE65FFC02743E19C14DF87C6C50BB859FBE531FA030B2C0511281C965396B2AB9938100E823C7658E174828C569716B522DC4418C3EAB966C56B8D4DAEB9DEB17F4A0234F40693902BFF1816DD8004 EntropyInput = 5565452D83E12C91923D5B1913F5CB7889C42E23C93EECCE66021687E7DCA38FC1A3A1C221C1AB746A273D3987E70BB446C1AAEB470DA9E4C53850D7 EntropyInputReseed = D7B49A61EF54654855014851A7DE237D5701EBA512E942D0AC5265099F429B51424815A3F476C4329F48101C743E8E48 AdditionalInput1 = 77F89D63A9FA837DDC4DABC7BD7AC19CA898494E6756D994 AdditionalInput2 = 4DC0DC2CD8EA8E6934E3C51E86A87CA55AD8B8425BCA83DC Out = 9FDD66251088456F91AF9D58B57A695814DAD6EF747E9FCD90C251970005C3865DEBE94C590B7B159D5E4E2A53EEB4A308C39147FCA810DCF83FEB8540ABE701C84BCA4999F94CC41BCA266B6BE876E18DDBD80613AA9864A1FBB3AFFFD0E72DB013531B286B633699305B4D25045094 EntropyInput = 5477625D5A915403B9668FF219E534169E46BFD29B9212EE05ECB6EC51E110AF7CDF785227DD76AE725A0516850E5D3934EBA3B08048015878DA4C1D EntropyInputReseed = 389F9085B1618606BFF7296F248F55CBDBD390F0DEAA6EA519CB0BADF7E815D336FD6086EAB4FDC2DF222BA133C8BE53 AdditionalInput1 = 816F37208BAF79AD919E866EF275FA5784816C90767F30A8 AdditionalInput2 = BB8B128A6574387F5B229F5A97743C9783FE5A2ECF7770E5 Out = 80EF3A0BA1732370299C5A8C13714564A36B1B2274D307E9A08D3501DAAB4B4C3CE23BBB440915937BD6AB1276907CC20638BB85C9A22E8334F971D92042A4882ACCC12C516BAF49E30F49C60127975778C1D43C113E44CE88304D75EDA325B37F33D66410674C7033B8CCB4C3C7BAD1 EntropyInput = 4549E10F445E310AB1DD8F67AEF3A2DDBC9421B17081C6DCA1D86168E850EB93AC2A68040ED2F454E411111AD95A1B997DF93A4A2C04FF1114B1D8A7 EntropyInputReseed = 9677BD2C3C4944D0DC1F1E994DB92C13E811AD6B9B11BD94C0760CF048A0448ADD6E14E08DF08B9C6F542385490E4EBB AdditionalInput1 = 70BAB0DCF4C0B51F2B8E51AACF99DE5018C330BFCDFC21B5 AdditionalInput2 = 47D06936B8C3B3CD871FBFE96567C6D586FAFB2B36C77C51 Out = 3B1AA7BBF4E24EF4ACA1EE311D485D9FC3C302B920A37F3B2A15044053B3481A255639A82572DF2EB56C6AC4F36DBCFBEB717AC3D2149F1F54C8EA728725710A31E788ED00158272335259DD9520A94E225224CD60FC872E8E61DBFFC3B21FE99D8E4DB450262A5015A03DAE908F143A EntropyInput = 9824DA2093DBA422254E62A79F981F96A34500A0C2790AFBEE85D4B55C9980A80641BA2BE8C3EA2CEDCF14C1536786E7C633E21DBF1821886A8C0B24 EntropyInputReseed = 24A272AD7D9631111F09429DC84C78EEB3158F3615849EE76BA38E1F56A1A5A34FC3A1F0AB1AD1E4A7BC9BBAD16315EE AdditionalInput1 = FB957E99C68B14361E8CE95002AD071D0FDDF2D4CE4858F5 AdditionalInput2 = 53CBB460E6D48B76597387CD7F89F1D6BCDE3160708B6B88 Out = E6136EEFB85064AA1C2AFC9E1B6BBC7C4512B51BB7CF3CAA0FFF2F931AC13FC429A7545F3EC632461885677674249018703C36C4C68A8DB31EE7681C6C9BB8A79BE616E43A3D861168EA18DAE258034235CD971864025C6278AAE080E507C84D43A09309052B56152135347BCADCF6CF EntropyInput = 010F656C4105513DF91DF8F18006C905B7166269DCFFAD761EB98B6D09CE837FF3DA2D9903B9EAD2B1D8B1D3D9645492EC80CE1CB299EC90A8E07537 EntropyInputReseed = 8BFABCF89F101010FFFF584F7ABF98472B8FBE3F807ED3C811FF7FB1B5671E2CEE6B8ED2176587C9AEA2C5F5BC7C0062 AdditionalInput1 = 57F63FD8B1A1CA691123B519939458EB22532C94C7D743A7 AdditionalInput2 = 9269228E1B24685EA1389B936D1F1EDA9C23303B01CB0C20 Out = 3C808D27E93FF06BF5D61E1B5CA91BF391D15C2E01572314F5C06FEC64915D38A4E0DF425D9946FD374613CFF68FC290EE87DD81A131369C395C89FEDF255701AA5D75AD754C08F52C7E92590DA3A61258B96332A6234B7F86BD8657F1C377AE70CA586D48093EEED9BC454B9D133CCD EntropyInput = 48CD9D371745A108FE0EB51F71F39A27427DB15D5F04215F5F473C19084E3669C5C9730891D4B565EEDD4DEA3DBA5C75717C8BD61FCC2289A4736824 EntropyInputReseed = EAB71701ADCE5B00B238A1F625A7CE3084FF9F1FC9E66833D44F1C1B8EC8DD0AB2CDB2E6EB6E5375F3C2B01DF886A17A AdditionalInput1 = 1C216287DE1B821089D2DFC2FA4CA5A97A5325F62764BF16 AdditionalInput2 = 0849C7BCFD12FA3A105CEAB8918D5A158BAB29F54745780E Out = 632598A6CC1043B2A3608485174A5D55EA735FC4219B822F7ECAEBEC902039941688C3723BA20F2ECAA138F79F9C1A331F2CE4D287F449310B04C5D9FF6E6C83521AEE9A1077521EB187F68B3A6A490BF12DFC99A3FC2C1C2C580EE49C8A5E98D63248F2446E9A83E539E1F2D2CDEB3F EntropyInput = 27ED21814E5437B3E62F7E2F4C78F178A37F31281FD924D39E6F5BCC7C98CC03912CD9469862C119945FA9B369EA277FC88277BF19BFF07FDB1E076F EntropyInputReseed = 8CF11AE1199CFA199D240D14B634FAF58E083DBAE46D1367190C555FBD524EF09A0A89C0E31FF3ED41327E146F7BE3C2 AdditionalInput1 = DA6B1182C4881662843060C0ED553FD2935BA3D3E0E338BE AdditionalInput2 = 840A61E8C94524932557AB6DBCBAC845EA34C6FC911A88E8 Out = 85E71CD096AA088B6E86504B077827F38607A99E5452AF6D0C81D93DB6FD9230454E34F209549A1EB5A2FD91EA90680330D0C18CEEC4D9A8855F9A8E6E6412D698A769946A56DFD1D9C4AAFE5B12CF1096D64088CB2DBB5087C7AC2A7D5D9E7E3156D16B2F9538A174C7E7D61C74B2A0 EntropyInput = 51EE2A17299E3AA62007FF80897200A22B73B484C30AC1A64F69C3A7C4C78FFE2CE138804656D77AE28E5E6258BCB7009E766B55CFA37A705EA0FD34 EntropyInputReseed = 294080BEC3B522C7A52627548A152A48023743A972BBDCEEFAC844720BF841583AF762CCBB6F662CBE7A9A99F9D29F5B AdditionalInput1 = 7FF6C55DE3A2EDF9A647DB6F2CB59AC07E2C595FF860013D AdditionalInput2 = DE1F04D0E186ABE0C728897E5520211D03A116FDB5E18508 Out = 3D86402D86A90B4F4B279B32DB00883C2D50A7E0741A5104C6DEEF2DE02CA7AB7C00792EB7D5BFFD7A272E937A9A0917A23ED838042FD28B1D072C9FBC6C8D88230D0DB8F41C82CB30F84B27FE968BEC608CF799B3F4B169C2DF2222D42298029C469CDFEB03142B6C1300AD187987E6 EntropyInput = BF1083455F525A15E864F1D97555B92BB5810F2275D47D792961F1F1FADABBABF111476ECC14E9435B2DBE5C951840636ECC2729FE8E4D0924E2EC5E EntropyInputReseed = F10AFA715CF6824D96DFD4B94C0B60F59167B8563D0EBFEED9FD144B5A9D545751AA8C24185449CD66F821D33507E5CD AdditionalInput1 = 23A446353E51C2C3EE95A814B2455E1282F7A4D7ABF58EC7 AdditionalInput2 = 378210CF047757CB10E31C17CF35F3A6BF07786EB45D1FBE Out = F845144D6E2550BFAB13FCA4F51A7DB301352E0DC37AADD4AF430E3656485D35BF6201E3F3A50C8F70E0F2C348CC2EA769F612443549A8B62BAEEDFA4FAC84AB54526D8C182C91342A348EDB4C3BE454EB4F84161A45F5ED8256810F49CD48BC3302D50B1DF9C8A3B60609E0B35579ED EntropyInput = 1F5829DD1C139033783CEB551B0C51FCD5726673757B11C612B463943051849C5D623A2B32D8C18546EF2CD7DA8B1D0CD872C2FC4E351CDC3EF92C50 EntropyInputReseed = B6CC59B6ED2AB05AF28B920123A256240D00AA618A74FBF7B6549FB3BC04FBE765B8D320B6F5CE1DF2EB51AFB859BBA8 AdditionalInput1 = 1A7E921D64D302E29707FA7FFCC8C0317D724D4EBC45626B AdditionalInput2 = 02B57F1BB76CADAB591CB2B67BA321E07843475C01F66CEA Out = 057BEB95E2102BD776EE5E865313707CC0FDA2781D43DB6344444BC930C945451C7EB7375971456A04C41E743E0050D2E827828897A1136047BE40DADB2C31CCE3E6E729841CD4C06611880E111EC5FCDDA3610145AA8694FA87CEDE463AA670AD363CDDD33B0F7038B3FDB4A8D846EC EntropyInput = 0D914C6AACC85952B7DD334588EC4D019D65AEEF9E2081FE39176E3DAE76773BF6EEB17038506603E73CBDD21131D0AD0508C48AFFD478D7B1A94427 EntropyInputReseed = 93357A12E81FFF2E56E80D0051F6F520DBA4C374DED4A3D4E181554F4B8344DF00062AA0692071D13B38B59826D23FDB AdditionalInput1 = FE70512EC9CA2AE48A5156E6B9279E06EDC4C3970B963324 AdditionalInput2 = 11B933A0C4E094680C202736C02C0658604B34E9403BAA81 Out = F9A5D57530D69EDEC330F385257E99E27D1167314DD6D0E86162A029739CEDE88731023D98FFBD945863EA6FEB91A13F8020DE0EA73B3EDE3B669E02C2CABDCB017712046613B82CA9D4F504610ABCF3D6F05866DF37DB184AD7C5E9D2925FCDD553E25B2EDC58D86A3F9E8220B10059 EntropyInput = 1F0A72CA6EAF47FA9B29DB2A8733E4703DC915F45EFCB34F8E322149CE8966FA3B1159DC800305628A6B8E9525427F63460E5C2645DFA7037E8336E7 EntropyInputReseed = 956AFE8C613AD1002D4CDE4E47D2ECBE1DFB8EF334F7AB0C464D84FC3455E72A0AE57EC60A1A6D54CC2917592747108B AdditionalInput1 = 361D9FB6452B281B2916167D3DB86730579ABF8A55858CF2 AdditionalInput2 = B717C39751228E32879035DC3F2104A0190AD480E9174EC9 Out = 9F4D6B7702DD764C315ADC7D28C7ECA8369FB7A9CD194E1F098167E766FD3EA7B9090E4AAD459766E97AC2BCFF0537AC0A694D042574FAD55BCCA23F17120F8A7094CCBA08A5024D6309C6B5E5A6D457AC9750ABFB5DF2B05AC8D393A1B6B7219E3AD48A31B8D254CB9C0B1A44D8CD09 EntropyInput = 4DC278EDF2CB086BA4C0650C3704F6EB5060221F5055887CAB9457764EE2F8827CA0D7E66D267D9176FEA6572E6D18973DDAC8F7D5769B3E5046977E EntropyInputReseed = 3F4B2B98561FAA3EAFB6A46C799CB2B8CF6571571D741D3D87A9D3F3915258D555CCE738822B5CDC149325A2DE9AB994 AdditionalInput1 = ED092D99ED9CE4E4C0672334A79C92DA03F582F37B005322 AdditionalInput2 = B3F02760C4D3AAAE071F4D813951747FF0C508A38C2069E6 Out = CA5712990184688412DA82C602FA2C20B9D13A324E821FB922EA3B0ABC140A208ED33D4B16080DF2C97D12C19B9E3D1292352BCD432ECECE6AE9C97C54D131EC6E8B75BD58014D6482CA25ECDB65F0C7402ABF69BD1051DD9BB840123D808E10D8F88F48388ACDA7F492D81FB87024D5 EntropyInput = D01CF4738CDC62FE54116E6D1CEDF280F1C7AADF24E8BA0E4800169080D1E660E9268C63 EntropyInputReseed = 01A07DFBA5AF92E174C7E4C8D4335ACC6E57BD138B3D322C Out = 9924B1B346ABAC3C0C533CF79965FAAEA9950F272A2741651FE36FCA4732BF0B3DA93C670E298499FAE0C195A7A0F018BA8A5DF4FE0DE62FDF7DACE84F3EA09B486D339C1D44C34584E0D80947E2882FAFCDFF83F6002E7424C4103494AE7014172277D94E3DCB9DAA0415CF96469332 EntropyInput = 8C553FA4A1AE533D37971E78F357530359461FB9D68990838EC1E0CC73D3F25E15763C4B EntropyInputReseed = E136ED6DF6BA4CC04620C3D07C092EC56AA297FE67383DC8 Out = BDF377601A2E51890577CCED936726CF1D6875EB97E1A48C74C23B167599996D618CE6AC930380E8D481B209CA52B493375AAD8BCEC3EF5A5E8D5CDF7ECED6A4DCD959E00A4A7C3A34174CEE4FB812BB7BF637C3F9E98932CB7645AFD62C3F0EECB8A7EBEEAECC1275BA568CB21ECFC7 EntropyInput = 2CBAC4701788D8D2462A9F951958E7F186028B444C5607FD69F3B99B3C422909613831C9 EntropyInputReseed = 7796009C6C519BB21E9C3AA3BA3594AD337AC73A1006BE28 Out = 4E4673F9867F006583485A60E4128ECE9E171AA0EFC04EC0488B07F2063A919FE7BD0C20213A9C9036CB70D6203E54AD5F99613EABAB936F41826581688F6A294FC2BB4B508DB91FFEDC29D249B8A3A701112752498E32527D4A7DE7A8AB84804D23D2DC0671B40B9793FBF65524B6D4 EntropyInput = C5278DFE4C1420A10FB6B46E48D051D04145FC6EF2FF33BAA82E3F531A267124CFEC048E EntropyInputReseed = 0484A7A74C6F670576DA147B94AA7E3511E8C645FC9CC89E Out = 72434BBE9269BF240C2A2E8FE07D0D70DC2AF290AFCAE175FC95E3F14A57B58CBBA88CB329A94549CBFB5E04925FBF07641397CFF80FCCC466D98BA6EB46EFCB977BD0E695445635FC378D1985DA62AE62E4C0742E88814FD74ECE369B4383D6EBB171B4721C88CDF6B35C4D2D03370A EntropyInput = B4C2BFB904B088B577102EFE02A22635343E131A35A9191B13A57F611DD738E9822FF668 EntropyInputReseed = 90CACF110BB01F571DF055AF5917ECBF43897AF0F57E269F Out = 5EF038EE013BC61FF68E62BD698814AA947AE79A79AB45597211627FCE3D17716A5BA941658732F956B5AEB60420D2DFE18A6332F2E1305046DB644250CFA788FFFEBED0E4DDDFEC3F4E7AFEFDFA0428B801357C115B4AE9EE7B7398F50201AFF67CDC74E6A45F5D41AC22E57E49EC8D EntropyInput = B49657335ED63B7CCD60AEE4611CFE13AC5598936E907F66E0C93912733C970806ED1EDE EntropyInputReseed = 0CCB5F2F547D2569FF8C3714F01F6D3D4030641D457F3226 Out = FA631B72DA6ECA9782C4AA05041A1FF91C4B8212C40561F3AE1F500493EE5E44B9A83A8275321F014A185365E2D26EE34E5D36876659CBDC34F9FE6DD22E62940D85D6504B085375F13510BF51B89792D4E532880E75F90A946E086ADA7367B8FC2C4F8A5AEAC7567A524590D6E81F38 EntropyInput = BBF561C02E21F4CD54CFB22CFDECECF3EE60E030AC707F89F89E918D8228B7474F5704E2 EntropyInputReseed = 47A4EA6755C8F646FFFEEE68893BC27461AB5EA0FF27173D Out = 6A72DE469E6D9B58438CEF28FBC26436DAE793794D89870A0E86CA7C4D74646868D69673339474C1819C7BB10B52530B4B8C9B73B85449401C4AFA8775710A9D58165D22800DB044A5FB1EC63A8CCDED670E4A832D24CBBD17BD1A2695150A1C1779A464EF33BD027DEE50800BAFDBD6 EntropyInput = 0256A89C91A84977054356F530332507F6D6E5FF45D5EABF31A6056DEBD7E80003223D59 EntropyInputReseed = 8F29E77183CD1A1112A6209B47CA6B787BC6DDDAFEAA91D2 Out = B1C1BFB8052DC66C8BE8C8E455AD3867225619F0C13848010C427C9AFD1780E8AD1D17E395F651381E26F7647552B06C4F4B4D5DADEC35D20B07C26EE1456E894153E5A7C61937F68D72E9A9DD7625F5CA7A920D3991BDEA3880FE3A55AEE785050F647E15FF347CEFF1274E52F0036C EntropyInput = B1A23B9B0649964D42705E3C0AF3D53EAE13C1F777FDB23980138346040CAC4EDD8BA2FE EntropyInputReseed = F12C1789761FC8080B62A70AF2F1A48DB58C944FCE853F62 Out = 607EF0A9DBB126908E039F0CCA5D4526C776882637B45CA43B58F0C8F7EBBC2FC24DA2AEDD7D2E7B2C11D68A09B892F4EBAE277AC7FB001EA998A2F3A2EE7D947C42A22BE000743F2CE39107D7A5B7E63677A5857A9B6F4ED9640E489B25D4F2F0E3773DABC093AB6784C564259EE33D EntropyInput = 9FD35492E25240DBAC2406B99725165DC27D140E4FF010288D28AB0B77CA26381AA74923 EntropyInputReseed = 18BF1C9A25065150B6C6B93F034201A25DE5C419399FB4AD Out = 2015DAFB661646D7078B470F5B0D024ADCA4715BA288AA05CD977450342ECF387AF1F48A3E4EABCCDD0E9B2C6E234C37C2A356B96675C4335CA579154AFBBD2CD1041A7214CE88DDF49632BE9E830E75A2F15F85B7BD2B8CE25B8CE05EEA2C252E1464AB7138B00908A53ADC884F38A4 EntropyInput = ABD30BFBD92BA9FF504081F3D93D38DC4E36553CE96F022A2A72D031F9C06AECC5E71FD2 EntropyInputReseed = 67FA001273F38B0D84378492088D50A46BBA460CAAEE98B9 Out = 9BF2DD8DC80AA487A7FAB28D0541DE792B69481FE3CDC66845C697FD1E195084E56E1DCFE09BF97909AF20B5FF88DF30342C5350D39715019FF8396B899330DEC1942207AE76451C5D54D23215434F4C89556F25AFF136A971B03021A1C41BFD2CF3C4C10AA70C510B75350BCE676F10 EntropyInput = F0AC889A112E6912C6FF72FD8EDA97C515BE855A3878422E9BA50044C470B114CCCA9893 EntropyInputReseed = DD237F9F95EDC64E4749DBA94F906B832D811D6AA766121B Out = 67AE1A534C232BABFFB62C9B62CE01E7E72524B2C25B6949ABBDD0F7ACE00715C0375A4AE201A4A482DF635872D428238EBE5F7B3E2A7DFCCB5E6C2004A20EC8DC015A0975C47CB54B3ACA2EDACA214C6B66391C0037881E49B373657C7A5A6A35B4BE174BA4492D7D44FCE15741D832 EntropyInput = 41E277F7A5C72ABC15D567DE1D88C952D930F85D6DFCF05792AAF1910E9BAA335E96C031 EntropyInputReseed = 215587A725CBA2768A070A50E01DAAFFC8BE56949E625B23 Out = 0E38ACE95421404769B1F76A7FAE3BA3B7F6E97B65BA30E2963EDB91B9F3D6687E92D210D932266C96EC38B3D3D775FD85870284E6FEB069277B81415359D1EC64D0ABDC7F10678C3CC681C4592ACC432BC4AC2E80F00B53A838591B5CA7DED8860E2C87388A4F2EF41347F274171BC0 EntropyInput = 0B9FB69783EE9AD0F868876EDB11AD2EC8D192B8D46556CAABF320011FCE2C4BF5FF0502 EntropyInputReseed = 788046B6A9EFD4E5858D0F8433725C1DE40841C778A93E80 Out = 000B05E1775676058DB68AD6CB8FBED5024F46F00564A88B1296DCD421D3913FF838F91A7C8EE5B6473E3716DF016146C705605520C5917B0387A3A8FFA5D24B503BE6FC29FE6988B48A6DFF18D450C995D1C06555497DA3409B067B6A4D4FF252E5581FE7EA0E9F1840D9C7E54E1F35 EntropyInput = 836284634963E77FDDFE15F082675A253D21535E04927C0D0F66CEAD08AB69E974BF1422 EntropyInputReseed = 4FF6C49A8EF1A5E68571C96A68CB3D2FE62CEC8BEB4D7328 Out = B66030390D1B9A327C85611F2C6DF202CCA3C118CAA53DE1A5C883930327F539C37BEB92B3CC49A58C668BB7BABB1EEA7D5FB3B9751C3AD4BD979F497A53BE60CCB8CEC3E2DDC31595FFFC138F532FF4D15A7B795A8D56668726839AF333169A531BE48F4B93D284DCBDBB5D14C07857 EntropyInput = 567BA972E169CB31C72D54789EB635DCFEA737214B4FF5122001343CD1BEEC788D7BE7A3 EntropyInputReseed = 6B4FCBEC7F956B4D05517C1671B94CF6CF554AFA98B21D11BAB54B854030119EE208B8E9592BDEEB9AC8DF8D81D314E7 AdditionalInput1 = E02BEB1FCF375949BD0FAC04E2DFDA2664186E762C57E1C8 AdditionalInput2 = 31C801C27BA328C9FF5186493A15F8EE72F9B87A36C7C7D6 Out = E46CBE0AFA581762E6ACEFBCD7278840AA57AF548105C88A7BDEEA7359F2D9D85C22071AF6CA14148B3D539AF3708CEB1C5379740038351C5F6AF6638FD0E0ABE3F07A14C15E0CB34B13B3B4DDAE3C1DED9E81B56B37BAB09136277DE697DAD9D562F4A72839FF18BC93B38DC29DF412 EntropyInput = 6DBA43410E488E982AAB577A5A0E63FB8C522B64BAA6F9208A3A1805174F9A9D43CFBE8D EntropyInputReseed = 773231EFC7A6AC40DDABAE3443CD8C21A62E1400BF3E09412288E3A46EF7112114B695FB4FAB49BBB47E67947E4D2FC6 AdditionalInput1 = 6DE3331C47A2C7CE046D10E0225A474F0E0BFE4094CA9FA5 AdditionalInput2 = 16D6A0B550023830EB021FA745D4EDB1473C47D9DB1C4B6A Out = 58E7366D20D937B9A4D57EF611438AEDD82F59BCA632B4D82383531EB22330DBEF9C18A97664BC5EF2BC51842460999FB9F719449D348744530A238C6A5CDCCC12CCA637DAB24A68BF4712DCE4D95F57D7D82A776CA58D8A5841C23D04D584141DDB1B9170ACAD4CCAE8382457524BC7 EntropyInput = 46AC3F656AF8AA41388218EB8326E5837FE72F71D294C6BE79552D05B4C096F8C32D31DD EntropyInputReseed = E3E6C504883A65842CF2A729B969D71CEEC3268EA7910B4F96EB9370B023B8D7B891838DC2135A18206914DA79E5BD1F AdditionalInput1 = D5346401A31F95EDDE31E8C1F793D288A330318C8A4964E1 AdditionalInput2 = 177BF69A3A79CF822EB8F16025F2A07AAC03E78276BAB334 Out = D46B4EDCC71BCFD44C2F61F39D7E68EE1E33F2E66B1935525221C8B2C9322162063969FA0290D21BD2F55E9E5C408665E346769D00A3FE7AA4B323CA5287E2CB914E2104C9DE3E9400FCC01BD2ACD09FFE16DFCAD1101DD4E839D908A90ACF91841803929F62CE8B37D218842F283BD5 EntropyInput = 50266363EFFD06B41B928035AE2F4E45D0DD5EE2F55973B2855741AE40D54DE4C4EBE8FA EntropyInputReseed = CF15D1AF6C8BDC8BA3F9F767BA1953B370AC0C2A56878825976923A671040EE03E123CC1F15C0305C2A1B1838788E5C8 AdditionalInput1 = F1E647D8DB9FEF522CCA733C838C0D126263E119997985EB AdditionalInput2 = EF268A9B250412C976F309F60C3FB184B57FC7888AB057BE Out = 943BDEF1CCAA74DAF64A0AA5086AE9B2D259520C4F170635B7473DFE8156CFD5BC48BFA46B913DC655C1D441E6D2C6B1BA3DDC702405714D7C669663EBA9E9D908E78030ACBE7CD96F6C4834BE72E81E17E0855A0FC95DBB5BBAAD0C3FBE7F09F0C8CE40383E5B1618852C8DA415BF59 EntropyInput = A3671269B0B62A9D9896710C92FC9E82FDF020C46FF72FF86400A4A1049FD5E91DC6A67C EntropyInputReseed = 4AACF74CE6F6DADBDF3D1E2E3ACA7213B5D567F309E5603441007892ACB17A5F1F551C701232C91C481370D01B2BB69F AdditionalInput1 = 169496FA3394170242F853C740ACF785DA1005DDA17E4592 AdditionalInput2 = C0625486C06C4396AC170E8C7144BA12FED0CCC0F9F88340 Out = 246A2ACB7569F04B37DB982A8BD99352964B7452ABA708FC306A2B979DADBA6AB0818BC23128D08DC234305F9360F3686EF053057030E7D99D77173C6AD3BB2BE0B6B8A13705056794FAEE9CA7FE1681496EB2E1EB523F377AA231789C054CB5B20D77B451F9327FAA68A4607333C61C EntropyInput = 257DEDF8453E4DEFD2BB2C01C4E9EC0CC842AD1EDA028CDBAA7C6D780A3363D01EF26DE3 EntropyInputReseed = 1F0EF57A019C7EC2A7AB23926E30945D5D4934981EE6DBB3DB697E173BFD1BD600B8EE45CC3CFD3337A63DD1F4234B6A AdditionalInput1 = 9F3324F285CC1BC927025F6E0DFD3A8754178C6A13EFB721 AdditionalInput2 = EAA0F12EDAD50580D1F85C4D4B3FDF359B94C2AEE143D9C9 Out = 5191ACB51C3367F5984F9AD64E31656C6FD0352C81EF400B7056A7723990DA659B9CC3CDA5AC1A925B5968A0B51A37D1399DC8E67D092C6887F413ABF7FAAA7FB7F8CF7973BFB3ACBEA1D03F2404F171E84167AE5F0A8075985911DE8F772B34528418DDF25132C8E7DD985DDA29F6F7 EntropyInput = 10E40755FEE67581F16BC66DF8D9F5C1F56FB7EEA62244436EC23FB170CC6D03FF9223C3 EntropyInputReseed = D46A574910467D908F19B7536E476AD90D8301F6EF9CFE431CF7D4072A520202E9522B8EEB566F77E800178E0063350B AdditionalInput1 = 832A702323B7C1C9F3E06DE09E6101B805EC52A2934DB283 AdditionalInput2 = 92C5BE5DFBD13462CE3AA5153BFA0994116C70E53B68BD63 Out = 1ECDA5F539CFD6A1B5A676C57B717DA92056FC0D002E807D2707836E81F936856E4E5E3DE681A4872BF88380FEA6FF5A0DC334FEEF517D2B9C228400C3FC0DE3BD5C020C32075D2C87A90D32EA018E1CD4977D930C5F3C08B9DE4C46A3B622C2B0DDF6D1616E695FC21A65653188CBF9 EntropyInput = 56BC792A789D43DE72EA9F58C1E9B27713553C5864DC2DB81C2834CA90D25F99F61128A0 EntropyInputReseed = B2A633300F59BA753DCE3EC54AED21A2F1A5EFEA3D8A8E8DD3546D8988A2EBA245E1F6DF96CC9F56DBF3FBD400233400 AdditionalInput1 = 914359D47AF137A178DAE7013DF1A43E92A6308464E676CA AdditionalInput2 = 46928473CC26EDB9AE6B91FED7453D736A4F50E30724DC73 Out = 63EBFFC137E19BAB87995BFC986BF17892995FD5D6A14B2DEDE82AC8958365A0F33F727C9536D8FD647CFE8F461A052972927A9BB8EE9F230305DC3F992E26EC2EB5D978C0F8AC4CCC23F73C6B4887A97E05CAD49CBBB2AA3B476EE105EB112E732C8001FEA7B8EDBB370C88B00EB553 EntropyInput = C1DEC6622B74D78BC74E70A5B2C08A760C1DB79C4904226CD34243C6C03C3C3EA3EE6DBC EntropyInputReseed = 4A22DC6DC171BC4ADC019FD434B7F4B7A23DDF967AA9DB34B63A03F0C2F40DED67AFAA83C9656D816B4A2E1538D4A99F AdditionalInput1 = 08DC210940E33C75A26EB3EC8DEA59DC692436EB9241E85D AdditionalInput2 = 2BED86BA3ABE28AA6BB3D6B947EBD4B0B2D9E483326907E4 Out = F2BA21EA894616765ECC1454BC3BABE2032AA1D742E1CB0FEB5DD999584C59DFF3D8F7F01626C0FFD8778E69D4D805AAC982DD32A4B9866CA34135C7FDB039BB413B05D50CF2559DF36EB5F4E7D3C0840BCCE1A631612F2F19D1679DCEAABE4673466A1BB85856662590AF46ED6AE58A EntropyInput = E93D08D9849DE904A6D64211CFB9A38DBB054E5305F292A7B7C6B194586941B1101E2D20 EntropyInputReseed = 7687DC57BBABA7E695731889C3289840E1D004B1CD9FF9C3856249038CA9322EDF3DBD68AD7F41B708F91A002EBD166E AdditionalInput1 = 8E485EB832F89ADBF019B6988A0F85D385CDF10C903DE02F AdditionalInput2 = 58443A53161F0D212487D6BD9FF01F1A7B7C089874CBB774 Out = 3976DB87A8CC04E44301BF98B0521DDEC760AF48C29044242E0B7173D70F21197039946932D1B8D376938B45068B60FB3FADC53EEB071D84367FBD66973AF93E6E6FDFF3F11B89D1A029268B51B534CE5151C92495307C13B106E918E307C9AAF1C08BDCBDE4C5EDC03E978D40E2393D EntropyInput = 0F05957CEFFC4C1BEA8D6598F609ED6213F6707246ECE1E2048DF0FD6796F61E6D02B1BB EntropyInputReseed = 0B5056B9E680264DC5C0F83509A4C69DDA13E975EB24933D685C5BBAEEECF37B4A86F004651B7ABE573556668AED059E AdditionalInput1 = 23B7602D22B6770390848C731C7537428D5ACCF042BA86AE AdditionalInput2 = 0D548F6522F2A43B3A7930DD9C466177C997312ED628D4DE Out = BC4BA0FA998E3DD9648101719739E396107540F073FB654804715672C1CCAFE8BB691813743830A7FF3228779D84B524B244BF52129B22ADE255824DBE059E435748A2CB45ADC679CDBA884BDA394B8A66107044A3A163300CE373D3468980E52B845B88BA8A37F35B020C9B58AAEF25 EntropyInput = A9E725A9C0B6FFA8AB8AB29D3C50C6A9D5CFAEAC2DDE07A64A6B385FE4964B9FAAFB8648 EntropyInputReseed = F8D3DD0CF0363823599CA06157A4B034F9F403DD1808702541271C6FA6470DFE38D073107DBB4D182871E0C422A0A0DA AdditionalInput1 = 044DF66570DAB9C0EADB8FAC4998286D61EC30A19224F1F5 AdditionalInput2 = 563D4351B99ED3D6E501B0A85BD049C9A388F0C529406D79 Out = 397EC457D8385B458B2FDBCAB0633E14ED249E63E1A04BF0283853B441EC226613374A3D1F9C77AB0D08F863140D003B6D6DD932B99843B3315FF70C480A94A213B20EDA11C930F58B82A24F6A24A20CEE015651F9F1080054B94132ADDF94C30A92820C328D9102D92C5BC3A00F8D10 EntropyInput = FF64964C5E8ECEEA7B798F5974B1A713DAC51CF3317E2EB0C0CD6D190E01516031D47B2E EntropyInputReseed = D88E467CBC3EB58CAF97E54BC37B7B2302E34719371701520F01B180A22155494D57CEC2600056FB68956589DA9027FA AdditionalInput1 = E056AE5582B712141F25E65B4601EE3E4ACBCE70DED98B67 AdditionalInput2 = F026B5A162822173E234CE795D481AEADC0ACDDC51DA2EDF Out = C6B94A2968969B3B4503E5DFAE60642FF43492357833E3407EE79DDAE4C54AF5C11EA704C44EAA36EB16AD1DE7A05FF1CBE3927137E2BCBE7B1F10652C3D8C3548E8F67B5E25A194898A8B4B74E29781A00FC75F1EAF6A2B0CA3AB49E7E06B92B48A8159C41307ABE56C84064D692D3E EntropyInput = B277E0E8F322C7323BEEC86EAB6D6E01EC081B1F307B2F5E6AF3307FC9513C618D3651FB EntropyInputReseed = 70A987F9F53E067FEC57EAAE7C7B3BFF58E4E4A8F1B50129359A932C566B9E015504411A1172B39D4A421EC685E974E7 AdditionalInput1 = E36E414ED03F0DAE3EF0C753F84783825F83F69040D2153C AdditionalInput2 = 46EADDEF91F2B798DAA79F49BBB046D3C282639CBB0DF8AF Out = 55EB86B25B70FABF1143CCBC03F53670F5E5ED22735361F7E9D746241F46957CBF20A62E8D64AD85134C378EED8F99C7264047725EBEEC71B7FFA24CE2CA1D4CD0E20FCC1DF78627C2462B604EDD9BE3ED5852D67D909C8183BA6F9EBCF62F737D1128AE34DBE947D28CC0E224BA5B8A EntropyInput = 7D55AB6467671DD32DA0056BE163B0BBFD903C97071A5A7097B460F2FF5777C9D6FD5155 EntropyInputReseed = 8C941ABB588D0236651EFA5B78A4CA9A0141E0669C6389A37B0A52DF4D5A29F23CD0851117DAC0BAC58365F26ACBF8BC AdditionalInput1 = 89468643D8096C2711A5DD5D323EB70FC6947504B7EF3B58 AdditionalInput2 = F9F27AAFD1EE350424529203C9A11680034567137FC94443 Out = FBE69D05E5240F16289075219EDFF0C5E20B7B06295DAD5D8E8B3EA9C66F0D970BF742CE3F91AD5A91ECAC621A9EE05EE50985CC685B24271210D9FE6992946C55889A8CF2CAA51A6C01A52FA48BE04F384B76F77E638219D3E50551F9E4ED0AC582D3FA9BEB8B0672C44189993A5CDE EntropyInput = 07E6F39A4F1C75203E1F3CB2A2BB015539B294879CD4DB47B930F6457C6E31AC22965CC15EDF4066271F903A02EF7E6152EB41BE69D1A59D1A954543 EntropyInputReseed = CB4A88463A87958F00B21017263185EEE10C8B57DBCEA047 Out = C2C1519FA6C4AF564E02E0554579C249CAE9C30312CE090F9DAF9EDAD7F57E90671CA04162F85D498C84274E1CC5DB6B204F0FC9DAAECDA244B6EAED4C2ECE0A1335B44076B702B96C05638C57377682DA85A8040213219109D6AD57EB642DB0FFF14CD886FC9D26130EEC583755CD97 EntropyInput = F7253F1897FC3219A6FDC0E7BAF460AB24BFB0302BF7DDD61D97E61A8037104794C00FA565F9B995863E5854EC3D063C5B9023CA8612BDE0027F7B14 EntropyInputReseed = C745CD0B8CF9FB41980869FD433919AB8FA3D3B45A271FA1 Out = E6411AC63CEBF5C77001796AC48A03CB5C706F83F6CF6F41109BAE0298C22D42D90E0CC573E565D1DF3727D3A9B41EFB52C486BCBFFFC92DF27B3F1773A8A2EC0EE517FE8E9CAAFEE910BC97C013EA04DD79A47C7F8AB02EDCF8CFBC85557FBD528646844DDC60E1B76B7CEB544BBA15 EntropyInput = BF3C95669E1E603A6E066FAC829607A4C865F6AA231D5D9449A0C81966273791E655BBEDEA9E5A9B61B0506BFD8556D0F8C90838B9F9718D43442C06 EntropyInputReseed = 2A433F8BC49418EB0DAF59DBBEB7E19A5262E99BD7075AFA Out = 0827FA4858A4EDBF626B28EF917A1A3A7CF73B59DE18F68141ECB03E9FD2A9FE2DEE8DDF4214478BE6E56ED0C8963143F9201E43D8037D720B7DC0A8137D4E5D08C4E7433CB427CDE9BC677C4F243964F43EB08E4F76D5E69D71270D1C37CF9090AE6AFE2C14DF5506E0ED7F033E3085 EntropyInput = 3D085A54AD5EC8C1BA8C51FBFCE50ABC4684DC73D719E88856C643DA133B49006E4553C3B14938623C990AB342EFEA0404486362BF7FD8CF0F2135C7 EntropyInputReseed = 2CF8A217EFA6A84CB715AFFA792C714BAD416B1FADA1DCDC Out = BE3B71BA0E765443A794581B6183CCFC528D86C54F9CAD63CBEC52B1924C226106226CAEB8DE0EB8C48CFAC0CFA1AAA040CDEB075C9149E80D1AAEC6D3E35BD2A509D305E1DCF6AE89A4B67A6BE54092CFEA6F3428B449F376CF3D62080845ECE70FE6FF8250E72A396181081ECF822E EntropyInput = F86DC6B7BD1AEC8A9F1FFD9F99AF6FEFC0B7BA35AF2FB2C4CDC7EE708ABF43AAF14FA58F6C5B5A436B696C62576490BED91DFDEBAEDC72DED4DB03CD EntropyInputReseed = 2A492AC191D6029B6328543C94FA8DBAC77FF330826D0C11 Out = 72471A14F1A6ABA36F0C1190A048FE7557382F17D0F68ECDB8A216FEAE3426D270358EC3093A49050CA0C220CEF0E1A2A9FCE9CF6BBD1203D683E61A7DF1927E0EEA58503E914CD186A81E192AED026F31E80029FE3EEC031CAD809C12C8DEF0C06B50A277E901F5DBF1E96AB3732AA1 EntropyInput = 5C45CB4994BA4DC6C4858C003900C0A85DDF679BC042053274081015A716AA5B9FD4E08CCA2DFFA7A087945A05235791318BF9978125C3735F447370 EntropyInputReseed = EDAF100FBC335D798322A5B69A4B53B798443FFCBA3779E4 Out = 82F066589DA944179CD44F07359161552CD4752EED7D0EBE480855551A3F37AAB6C1EEE399C93712A06D3DD9D625BB2916040E8E3CF0066B25CA19BEAB609055E54EC8FAD5BC6E8CC4093F64E9CD27E7E29A3BA470FCAAD2221AA1928BE6C871A322E60E2DEDFDF238203CF6F935DA75 EntropyInput = 1023D6158D3C820C68030CF9736991A117F181C9E0C6F9F683B12FE0135791D47309C7FD4D472A8703BA58E04516A41FE7E318B0020B4D1CD12CA85A EntropyInputReseed = 3BE9784A591B42E637E5F9D1880004627A4C0CED5663FF28 Out = F266A846C66333871E2E4DEA4EDB9C8093274976B0AD7A3FC72E896E1FFCAFD736B72B113E61FE1CA3D7C7FE247B44916C2827745D4639A400444CF8F4A5AD7587F64F7C3161B43F5DF2105F68506EAFE3A3C3C59B60E8BC45DFD7FB832258E24BD61375AE60844B8B66679FDC6A8320 EntropyInput = 8D05D3602682EC020114B8511288B3BB71A1FC4D8DF9E04873919E854D3F256F11E58ED9C4F1B2DFC5955B23D127FE3D5BD0D84532400D8ABA31969B EntropyInputReseed = 9B024D816D101E22FBCF1867CA63510C3C9E93B248311D83 Out = A7DC46F337ED9E06C26BAB1A1E656A407034E60FD160D2FEDD241CE66F58F9D22ECCE1466DD935F3CAE7A6822DC665DFC3F19258C0EC92F5F77FE2315E28225EFEB11CD2D26E2BA79CBAA97D8978E0220737014F27F982E05493D73BA46C880979F4112BFFD46571C007FD3F41B9B216 EntropyInput = 90A11F59F9BE2D9BBB1DF407A87771805165A3D552924F5635353D1032159B843D285D4F3CB7DADAE2FFEFDED882F379F935C59F342D18BE535E07C3 EntropyInputReseed = C29D18BA7CC6B825FC10CD3740D299C25380F0DA851EB4F4 Out = 86EEBE427AA02D11CBF75268B5078001FBC295F0D2FF0BD5AAE6B3E7BC07FFB240CF88DE18669267B60C0782E2D7FA850676DF7144558A87BEAE8D7D43E7114C3DE2BC0BC64D8D05FE932B2E3424EB4E070A58A21350839099F2F8E0D07772E51AB5778B4906AC3AE018746681A57AA1 EntropyInput = 87F39D7A726D80338CE0FEF98CB9AD572E73A63445228ACD83FAF65EF6FD6A5EBAFAE6D63A8A18849ECA73247734852E180571128CE14172504CA62C EntropyInputReseed = 2A99809878D560161BD4ECD63A59D274B63D6EAA11B65F0C Out = E5952913DEEC0CF7E44DA38AB8E37B61DA755062B19A3573DDF2A58BF3C059215C0C961A467E14BE8BCD238AE0007BD7A987373639D1BE2CE3FBAE354620C935F3E8C0E852B53186C7D1F8E86BB7E11C56480A6FEC2A89497AE51D83CACEE4DCE0BCEBCC3CB8BF4FFF108FA7578FF56D EntropyInput = 345132518AA680BA992B1860AED02BF2D81F99199DC593B05CD2B774EBE0ADFA62E3073A8E7C12C247CFEDE919C0AA853913F369B8A1215DD1DC8BE1 EntropyInputReseed = A0010093269C52D5B20961AE4AE25FBAA45F3699AFA1EC92 Out = B32A7FD826B2FB89AF889787E71ED047A3210E32F7264FD8BE1F338F5C90797219834107B7FBC32D67C07F9250F6D7C8F9C60684C9EDBDB6460AFD64AFF8F94FBACB50A0C66B02935C9F4CBAA9D7895F553B4E0682A41FCC306993FA4C0F6BD334D0AEA63C4C9AC8F17ABB40E0D88017 EntropyInput = A4B797B390291FD9E8C851E6AD93245341EDDAD526024F74D535DBD7BE26E5B3D8290768D4C8FBA249467E533B1A40940406340E4BA92D4A577552F0 EntropyInputReseed = C7524B88D49A007C1347F96C6ACF6F3DC4208481694A5B82 Out = 823F2A6B4825409B4712D8A52028965485C66DB1D828C57466C82B23317762754BF646980D37490CEE7AC50F6499BA31A1B6BE7243E470279CCF87126C7CA92F69C64A91B6F847D30E089054CE6E6810840627E6ADF7C2382119AC942EA600B442188854C15C724FB2C5B014332FD979 EntropyInput = 6FD3F98CE575DD5FD80DF04DDB74A9AEE48E21D5A3B49334A8900AB595685114121E8591371C1285178C5ED096F6C172D39CBE66963DB2DBA0447361 EntropyInputReseed = 5B75E13271F2BBBE248063982818EC4EFAD18B54C01D0F72 Out = 339215892BAB264E64CD47A8F035A26623AD15A1DBD329C7F0B99A6D7D5B4DD4FD119469CB81D604D169F6441E2B7E37E33FAB592CD0196FF4741A1287D55188F83762BDACC8A5F59A0A2618AD099D28FABDC0F9816144B93561D9070B6B24AACAAAE10BCBFA7E5908B53EBCC3CBCA0F EntropyInput = F4A8C0E41668607F1943802CE51B5654719DAE04FB54FC7C20208BD5ED4066A6CA0CD46F93B59F0FB178F9A2FE633AC2697F89738D0472BD17590F8A EntropyInputReseed = 7A6E704C7AF4E0439A9FB7EE110882AAD9EEB7C858AE9446 Out = 9F72493EBF410D40C756A67608945888E2F328F7352B74986BA022C08BA850F91672861F0989496C0995C93EBE18E0B5F44B653C8AE9561908395FBA3A4C056E9AB8166C23C57AC11243D8E792FE1E8EA2251906C140F9C90A7C1870144AAC8268401A34620FBC83E5D21C4F2ECF1BEB EntropyInput = 3ECD3608CBA641494D31F0B3BD690D06179A34BE0B11E8722D8B61B31B1491F013291CFD457CB6A0893D1FF59AD3B19F843694C644DCFE14DF116F6F EntropyInputReseed = 0913F5D566CC27404FEB695194D41817764262B60E0B8576 Out = F4E882DDDFDB6BBA45301B1F1333554A302F57841E9FF807A782A20A4D727559B917040E561B0E80C81C1DDCD4504B04DD6F345CE32EEC7BDE42622861B58C8803797858130015F2BF1952051FB1DD73A41E62A9F4681B9A1F5B8FE85E0E824C072FB0763434C7591ADD79F8D6043840 EntropyInput = 44EA6BCFA5638E7B090214FA78214A4A1A1BF8F62509D530CF23A346B0C39111EB133A149BD10D819175B807B7F087B0B9AA3A64D161C7CF1DA19EB8 EntropyInputReseed = 4E3A45FDB6FC11478F66A558726D579DB2BEBE39568428ECB5EF550B3AF1669590BA3C3D79D7CADB148EB37BFD39EA75 AdditionalInput1 = E08A02B8C686A51D2238EA25248F2E47D125BD8BC85E64A0 AdditionalInput2 = 531C8E8B422DE0B3A5B971482392A112F14AB46BE1CB1971 Out = C50C93BD30F74F4B7AF01F7A02DFD4A511A2D9573F22CC5ABD917EEC4304E278CF94876F2CF433F73BB56D43FED14FB2B04016B28BE66CCD34AF806BD26DD741344100A3490B82F839929DE2435D2F667FAA94F42DE85315589173115BB22FFAAE9AFB67B0AB5EB7651335781D1F3192 EntropyInput = 44D4EF3F1244548ADF47A5155098FF2AEE72457E8456FDACE683E4E62E5E9C75CE1DB56FDE994CC8136BAEF444C180B6CDF985AAE42A62EC2696080A EntropyInputReseed = 260FD06D16BBE9B5BB79BB4669283803273318130437092A6B36AC54F565098C66D145AB0BCBCCC18A6D0382ABA85B30 AdditionalInput1 = E7DD116B7C75B69F3DF094F58E04787BF05D814098FC8ED2 AdditionalInput2 = CCD1E4A534355AEF69CA5DAD007567ED32F08E0B33A1B27E Out = BDC3F39BEF50273B73181F87C2753477F025F248E59E6171CCDA9344DE51FF2A41EC2C10FA7684A53D838F0178F7A964DC5EBC3106399B67A401EA9054870B2E1A57F063AE4C7A4248F4C5796BC6AE4CAA2ADA1EC8B69F16255B89359171B0B3EBB96C46CEF4C58A7EF79E1E41F38E1A EntropyInput = C917BC9DF7C1F1A1C61B17F5E796CFB54054BBCCD9591916BDAD2F6F951256971B19C3B78AD0CBFEC2189707BBC261D6DA16050CEA285F61B59AE9D9 EntropyInputReseed = 01F611C3B3A3197CC76623C7EFECD932D5E520023DE12F8B632A83C99D4C3C454E2B165BC0A04BA88742BF79B02E390C AdditionalInput1 = DD0340D1B755847E6C0A881D28E0F53FC1CDEB94B142BC9B AdditionalInput2 = 13F1E8DD318523553ECA3216CBD65335EF26AC4B13B2352D Out = F39945E5DE82905EA943987950F7DA94F267BBFB9E597BB045A1EA5B4FB38097E941F157CD55599C755C7E5904D1DFB3006373D07FDF23324DF3A890D38A271AF79275F6DBEEE25FF80774E9570281ADF6D5635F2522DDE56EB5FBE5B42418FFC51DE14E0EBC20DB706D8041647A8A10 EntropyInput = 33112CE0CDFC7A55ECB861FE6CED395799AE95104EC52A270C9B0946AF553603DF299143423E66966489A0525C7F4DC72BA2D2912F713372568722DD EntropyInputReseed = BB60703165D0365A1EB8D9BDAF7FAF314122D5C0706E6192E8FA2A33D24F3FA2DD4E50A93615862E1C5EF76684EEEF70 AdditionalInput1 = 5EA9763956035C5B2F82FB34D0DE1C5DA2BA4E1D8871E3F1 AdditionalInput2 = 0078A0A7072B48D83FA494DC72726EC0C72ADCC812A3F04F Out = E17DB6479C9DB75C53C43F60F1D0F2174E5676E295D9CE457B29D82B060D94CDA04BE1B56C9ABB6DA634CA81636CB7A52B72B7E0C6B734C6865DAEE3CE9DBF4A678657CA233868AB566C4D156F286C09C861D5F54DC52CC87F3AEEC8C61B4C5A0B51388730EB7E7FB87A035FB5FB0DCE EntropyInput = 1E0B4D22E1A05E95ADB081AB5CAE1F92ECAF1ABCD86E15C71113A5927401ADAE94267491EF3B001BE7E97B7B1B9D7869893C9014FB6A013DDE3BBD5B EntropyInputReseed = C18BDE9FA36656E08E04B7552055BB0E4E2A377DC76DC9F0331E526719434690BEAB43A032A349FF797604AD7407330E AdditionalInput1 = ABA15D415A5ED3272736004F1F03860CD1490F8407CEF67D AdditionalInput2 = 3BC65CA0776CC9AAF918CEE9195966B874FDC32D3872D0AC Out = 1BF89566B33674FBE37FD4071F68D3556655E7AAEEE94E0CB91825549C1F7FC7AAD45C5931F4A9C076738BEDEE47ED17A9CF97DA6946019EF27FF64DA11E31641AD29C776414CFA83246222643CABD390A07B023A327D26F89152D6744D24D4AB8C87509A942BA14F270FCD1A0BBC15F EntropyInput = 336CCB62774277B42DB0D6FA022585C4A4E73CC8CF1B5DE5E56784D8958A9CEE2696DD85718BFD45176CA43DC7F087E27C2C861414595A2DE1611B3B EntropyInputReseed = 5512428498AFA24CE27CF804E58473339F683F508C7F0B6D449558BD988A6AEEC921C80A1D9D48034F7A633FD74E94B4 AdditionalInput1 = 43BD1A540E225BD55ABD923C275B56D0D48A1F46BC91466E AdditionalInput2 = CFF4A2AB3F96813A7A2225EBDF9BCD347B2E69DF81802400 Out = 21EE1D23E16BF40D914584A487348CA2619A9B4EBD9C94E5FBA623709201EE8A8048E61A8122D8044402D1F60FA2E15224D6213EDF88103794F35DAB65DFCCE2C70A5C9B9E70DDFB480988BFAC4B273FCDE68E1266AC2B37EF92FA06AF124F136FA8BFE21E84CB0A25E08061FEF1985B EntropyInput = E77AADED0531EA22F3F43C58407BAA1E7F0A373A3A3834986087CB864B090001469E58017A2472B8C184625D3703DA2C08F0CF84E24E468CDCF0ADFE EntropyInputReseed = E08ECF24BC5F25873E25CF2CABFCBDAD9830B3FE0FECCA020CB1C19E5707D9BAF679D11655D9390B42CA552C07B37390 AdditionalInput1 = A0F4FAFF523A1B8B340A71E6180A148243A024A25C9D1FEB AdditionalInput2 = 9A6AC1FF076378E4E7D0753AE1F21D3A232B22597A0A4B1C Out = 0AD6F388908582A0C765C4B88412C91ECD4949DDA8D024FDE5885B5F03519FA7227F319AF00A314E81195F6DAEFEB77F92D6613ECC78838C38E0E358AB10CF8054E53D29310EA096D405A17D3C363A69140BE5526ABA159AB5DAE360A4505D8F91E930DC258C22D28DD34F523B796201 EntropyInput = 14D03B4755CCDCF280343470A485411BAE4773E835D73E18227D47A24BF18D7187F497012FBF5B76DD3BD0151F709061A71A26D58F6DC143470A1287 EntropyInputReseed = 6A737F8BA7986A6428DB44839536A0F1E739C4D77531BB583DE711F9F5A15DDDE55F1498B30F22B880459FA0AFB3E9A9 AdditionalInput1 = EA754354B2B744E1C7A323D751846C133C8E18CD495A9BD4 AdditionalInput2 = 04EAB80D5167B6EB92098B8D1D89D0143A34C68A7BC2AF00 Out = F7FB414D4483667D2C40BA089CD07446E427A9B9B91364468C09B8CD4E030D9463096AE0055F97163283659D657CA9F679992BD22F4D04F13BFE1CEFB1C65FAACE2B40930F06CFF0D27357B4BFCAD99D18908FB0E6F0C5A3E3C9F46572C6AFCDA37B85141F6D41BDDF3AD906AD80D22C EntropyInput = 6FCD95D2ECD49FF03403E47CA938113A3D6D069DEB98E4A28A4438CFA80B60EC3D51F0C44E7D882250B26DF3B4D672A93DC7DFA45949551B16595959 EntropyInputReseed = 78F200247945512C029D29EC667F94314FDF77DC35C3265485BBBB2CEAE3F975771AF9DFAB19DB7792EAB9605F43CC88 AdditionalInput1 = 6FA12AED444DC1ADCB54538B2A53C0BB290C43D3589B30F9 AdditionalInput2 = E13D2D9BD56E6FFA1B3C93E81BE6E5461F54D41CBFAA4984 Out = E3E75F5F6DB33FD00FB0871BC22D9AD8CEC87B1CF7A823B27FB84087F66A05344C6FA09CFDCA1FDA55F9BE79CCC6D0B254A782CF906161172A84A3ACA3FF0AAE741ECF993F0324865A342063ED411B2843A079C339268029CCB017EC1214068F1C0F9295FE22A09A975DF33835A94118 EntropyInput = C9DF08D01771847EF66246B006CB7331F8C5A2D97C810DC77C115CA4385913A17F706D6A2821E087C1ACE271654A5783CAC4E0294DAF66DC94D0FA69 EntropyInputReseed = F1BF06D6315DBB4B59E0ABDC54FBF6CB740CB71237AB14536B535849C28E715FF355AC2BF9252B5DEF24B9BAC690E2A8 AdditionalInput1 = E3C30064D900313433F42B69C3B2219C16E585D0F3CEEBD9 AdditionalInput2 = 4F50A8D40DF106CEADD286B48DA8A0D1A9BEE2A4B8820E2B Out = 57D5582447FABBCD9B09D0C6104931B5E1A5ABCFEAF361EFCE44D4173F163B32338C678011100C4CE11D33861286E672233146AC62171A33ACDC1E8E21AA85D741AD06F619E5B8556C1E4C44CEB37D341362600E16B9C489F508007D09DBC44A7BFDB293F2FB0A90ADE64035C5E6E28E EntropyInput = 3A5BAFF8971AB5A0AB903050A8182CB848315141EB385A74D168FFFB333557B8CB623A7572B87A17527A047799702E98A129E6386282DBAF6D57D712 EntropyInputReseed = 9557C587755FFEABD9D18ACCE3C719886F8BBE95612C6DFD84211F815A86ADEAFC31F824B18039125A026EE9E833A017 AdditionalInput1 = 5F91A926B4C0AD64BA592FB083DAE4AC6F54D85992425C20 AdditionalInput2 = B28CF5B3E50FA8EC99FC4F9FAF7E3EBB99F0FC726C3EA460 Out = 95A32949752CB203D17AD739673D6F99DE9646D05E4591AD000131F7DEAFD7E9C40305D798AF6BBF6C06CB488E7EF587E386D61B784BA7191D4A0161A7F8378834D8A94EAC997D0591E96DFB3106BC5E00E6CFD2E466127C8AC8EDFC677190B2EEFD7CCC04461D642324EC6091AB9E4E EntropyInput = 8D342D08BCF0E2D5F08D94C63E0BF8D7B4992FD387C4B88DA34874A28A507AE7CD4945850EB394BE8361CF9120236EFCB80775F3496EACF4C73635EA EntropyInputReseed = 9A3CAB2DFCC2C10588C07A20246F2472F8240FA2FFA9133C990CFAE79A0A4361D14E3B2BE54AE2F9FB9FA18E2BBE0979 AdditionalInput1 = 38ED0065A0F575CFCCA03F85FF331E91617229B343B83284 AdditionalInput2 = 923CDF94185CB93B4A95AB02D7B2F25661AC3E2C01C198BB Out = CA0F7AA3289122449806FC57E1AB511183A2DF2184B68A8ED011DD2EE033F6D6E84617DAF4D60142C9B0F4015093BB4E1B746B53A8D75E9AA1F079429C2E41D2C93E1F7FB3CBC1442337EE9CDC49CBF7149393C2BF8AF5C3061362894B5E9554DDC70B2543C8C049844746B6DFD4C350 EntropyInput = 86715D79ECEDEDC9FB27F28866E14AA414FC82C0996CE274DDB933FA6DE294945487416D1D65203691EF9B7AC3973E95CE97B43485392FA29D3E5904 EntropyInputReseed = 04C8FE159F2D4BB11951E559CAB7FA5B6561A8CCDF9C5AA16C114F0C506A233462E0CAEB5F825DE966C1EB2EF53DBFC0 AdditionalInput1 = 41BA74A5C6776220B79A31402D3CB28C33586BEDBFE3372A AdditionalInput2 = 043FB7461963AD9A228CB69BEE083E0AFC8ECB5CCE25F155 Out = D00CB10F794A23C561785AEC2AFE6B50900CAECCFDB3A152816CD6453D825C8D1EA5DF9CF5D6E81C13CC6C77DBCB37EB13F0B3708280A282F717A39909023B709E2A83524AAD80D2FF70188B49B3A88BE963D504692E2D29B182DD060C8B611F5AD39B2FE48258D549E577A5E5A9F600 EntropyInput = 4E1A42A9CEDF35AC6CEDBE4BE36ADA99EA9451173AA6B9D32C3DF4CBA4E38D4EBECF5FF39E1A65B85E773AE79340AAF3EEC081B35A25448CC9B32479 EntropyInputReseed = 23E894EB1832EA99C68A4EF5634D81CB74ACFC6B67B030C7E77DEA3136A48150C0C0B0D8CE90DC44850072085E220CAD AdditionalInput1 = F66E1DF4B9FA9C9D3A548EFE2DD165CD1241D52C68FFF62C AdditionalInput2 = 1F964BC42CBC33140726BB406CBD1FCCBF6D221892243BFA Out = C8003ED505FE3453136F4EE26D0F225A18A0D230531CFD2F7D3714EF0F450462A4A7E2BA6EBB5FDE76008B2C30709B1940A95BB212E5D2DF6C2BA0C9B037C150D5FA2492CDD908C09D527F2D2B10D864600CC52468567D21373C99D0F9D97BE6A24E3A00DD0714C36C0B4F1E506EA6F1 EntropyInput = 8C9650FCD3DB6FE25357016606C7705C067AF92B21D5E2DE1C0CDE942DD6EE9A5A54A3778F057B7FDB9EE89AB75414D29A9037BB86BF24E966856445 EntropyInputReseed = E619B44CF740BDF5C7FB2BF2FAD0AB768295DA93D8EBC5CFD643C106AD69AFDEF9FE0F60A04F7CA70FAFFBDE2C26FB09 AdditionalInput1 = 6BA9D5CF7E38CB0810E296C559A1AD157DE026FB6AD47639 AdditionalInput2 = 256C4408B4B498C7E98F1B0039B544F2763AC3C09B4153C1 Out = 1D2D065E84E332358586A167A23713B0EC37180DC355FB63EB6392F82C2B6767C130AD0EE5CD9DFA5E6C44EC765AFA046C0291A3105FEADBD06A57112B100191105470F6B85FA437BBBDD1233A0F0FC96E164B90BCD46595BEFEB9E979AA6E3AA967137C7174815D9A44875E90A23AB4 EntropyInput = 030033E45BF00FB0D0AA3819EFC426F6BBEAF176E922DD826DD11DBDF10982FB53D4719B EntropyInputReseed = BBF980064624BE77814FB4C85892279F3F9CEABC99B7A094 Out = 206B045374DA2EF40C8299AD90B94DDD7395D27754BC58B42D8FA5776C20213F0B26D367B39DE9A7185EBE404522AD5F14B58E85400C2A0040A4EE031F2E48569CA973DFA267B5DA6137D9596B697AE8F76AE2DE1848682A20DD24407FCC8D55CA4C91E7368340E93E23A9EE8F8BC5B9 EntropyInput = D379AE51303AAE1D023BE220D50F65FCEA19E55EE507512B2890A3A7E729FBDCC163CFF3 EntropyInputReseed = 372BE08FC6ED059FFD706FBA0858E805C005273B52717116 Out = 45E65A8260AD20C8832628C5B90849A1145A226ED6D34FC9367A670D977417749214AD77DAEED063A415E0384F39B77A2F2F4C6397E539D364DC7064499A589D62D5070F0F8A37490512756A0535683C483479E3618074EBA8DBC8F5B968D276C8A4C70B3E03F37F7CC8C09B6DF86953 EntropyInput = 26ED55947053941AC4121176B51D74645F33185125A8E9122F42AF2887D3CBF455345099 EntropyInputReseed = 2B46365CEC1160C49107041E994A4FE1083AD9936B6712A3 Out = 69378F20B12B45A3C3BBE08FD40918CEA8393661D549F05F8695C7870DF86A5FC97BA2C6752BC2AA9DEFD7FC73B083DD8796D2B6CD7FD2CB24044F7C3D1E96DC15FAF1F43496BE00A10B1089B8CE6A7F38D76FA9B033A0A2B3FACACB92499D2089C8E1FAFBA9585BEE154A969CB50179 EntropyInput = 2E044407B6419C50394FE62AC1F3C8D45F4448C0FA2DA88F6800DBCFD89695F07D83C050 EntropyInputReseed = 436078FA9D9D75A20DAAE23B36FC62590D6401EBB3E43452 Out = D76F31DE4CEE9C279F8A070C9FB3BF752BB46CABFE6FFEA861706F23ECC9CEDF7EC1C356302A6DCD05A776E861A6B1F653B2257843CC01A937D246E9B40742CA07A001EF519F083119BC673F89B83E3F4D057EF248A579867C52C5966EFD9456986522D15A5F46C3DECF0321334C25A5 EntropyInput = 4AEBA257EE1E456449A21F31698407FB7318E426D5B33AE71230D79898F5E4E6CBEF51B1 EntropyInputReseed = 864A089BAEE97C4F677A89AFBB19A0303E36811412958590 Out = 4A9B5A57065DF521CE42602F31872B5F741F201DE70C03AF3695AB898F4706F5627C2267A62E3613545D4B7019F67C24B593AAA7BFB2768F5DA2F6BB43889ACD7947752A1DB1D13EDC6B1AEA866832015D82E30D062067113C85FC8851D3078B776BCF1CBD1C232BA3C34A7F49B1E657 EntropyInput = 69A6D14C07FCFE0D35EB5EFF00D9615549AD54D95F29BBD371E0B915E4035FC5F924B39E EntropyInputReseed = FADC5916219B5778305F3B45678881692F3551DB9009F169 Out = BEE5E93888D5F90FA7BE16C2D68E1D25FF21A27FA3EA2BC82FDCDD9BB398A7AD0B032512D222A7E2143800F8DA451AB9999B5CF49D82C2038B2FCCFE6C0C7035833FB1ADED07BE1FDCD866E56F80C1E7F4E5A9E4B1766548E913F8A8D51C9E208065A65CA9EB1340E30C5D793C0EFE7C EntropyInput = E063F0E5504037BF2FD1862D1396A0F804B85EAC2C45DE177481B3BB271451DF0ADD6AF3 EntropyInputReseed = CC50B84732F575E009EDD4BA5F233C49F7BFD93A39ED965D Out = 04C41FFAF006F1CB8C2299FFF8F8D63F4044FB28A52739A8404444CAEB50D310A1CC48526894D7181FD7E243F219EA403081EB89E02BE698C46196B0E8D53AA916D3F9B9BAFD1AADFB8B1B719D9F850C9EAFB45B9C2C73468E4C8C734ACEA054D3B932AC27800B4FD23BF3A6A13A3C41 EntropyInput = 008C40B3A1607942E3889B40A292B00A6705BBAF607BC39F95733D931FB9BE5401F04333 EntropyInputReseed = 89D7DB9BC97E6DABCAE1476C99FBB206E3D37096AA00F1F5 Out = 8590CFC74592B5F449623525175FD1104BF0DDE57D1DDC4810B02F47F9B02FAB7F3DCD62BAB08A5914DD0959A67C21897C8A23A27453F48C3D53FBF9E22869446981E0BE3706E0B7E8285DBD760F131375D9EC879DCC2928A8E9F5E8ECBF0185D3C1A8DB663757353D68E010D98DA396 EntropyInput = 9BF2F703F216081E88C6C15736592ABE372A00CEA6D549F915DB88E07619EFA5B47DE176 EntropyInputReseed = 9D0B0C008D7A5F42F338D9DECE91E73D452C295DCD062B58 Out = B00F6B033B4348C606D33CDA9F1E51BEC8450D186D9130619FEE9F95B7B25BE8270A6C7893C1B7872CD4454B56C166E120E750D784A4803AE8FAFE12C705BE930934C58EEF160288125F19748212A3EA4105E97C862478DA6BE079C1EB202D6E82695BEA65C2E8BB4370EC2CB8B277B2 EntropyInput = 5910740F3FE1B99D9B60E4138A1402BBD5B79738ADD0D9C89CE9A465B2A276EDF547A3C6 EntropyInputReseed = 05A1D7B045CAC61CD7DC62D4EA66BB630A34E516EC10EB8C Out = CB622E249167B9623FB0FE2A1CE8A4AFD2AADF1D03E0D8F0157D62C3F7D5D71C9901C1AB59F73BFEA3A9BD2BB04F960A72326FC336FDD02CBBEB37AD7F7A4D2A3AF5215E3693997AE438DF8C588D6E6F6F2F4AC603EC19654D57569AA9C0911AB49F735E9CDB019FF6D8EA710EE02FFA EntropyInput = 665E77028240E0779F3BE3D5CEB5F05C838EAFB98409EC259AB90B27FE54849AA2D457CB EntropyInputReseed = 98DD3334B8990FAB909A84662A4AE8F04A58A5B832F977E6 Out = CDFEBF096FDB8B5A38148909D64226E8F4BB1CB2C04635C2EE59070CCCD34DAFC5F5C1002F95DBD51A6177D5D1D920AA8B562F4AE7378506D426D133417CAD929D3631F1E5176479AF7F397EF6C7CA4AE6882E1DC31EC0F34C4250E7E906B0452FD8B4978291DE6E6C98F148D240CAE1 EntropyInput = 6C87D5ACE98A6AE3AEF838D7A57584B60125A91E8B96E057D59E5E52BD11326BDEBFC076 EntropyInputReseed = 1EDEE4CABF1B11218502CD7B20FD19A1EFAE2D0318D4155F Out = 6A807CB17C7FF4ACC577B81A29C239523C56730309A10773D415C93AEA5496DC4E5DC6B523F088D192292FCB968DBE686C158915FA3AE23C2CA6E35EAE0202EDECFC4E1E66F873888038A2581DC07D986E666E89FE2193F6270CA2AF145CC90F8F6566B29DA0EB2CB41FBE16D38DA4B2 EntropyInput = F33D622832C0480C6B5ECB013A32B5E3EC185E7C5E1DFF3F1BEE68A134F94C6702FA3F78 EntropyInputReseed = BB3D19825E83D9CDF770AC1B7C33A8C1BB1CA4526B486B48 Out = D95B908DAC6FAEE8930CE5D4C073A0C8E6E4E17B0FD7C9DCEE4BFA86193D34B894152E5D1F00C2CC5523C063513A2E1E68BC2EFA4DDA657B3924037E666B07FB4F7D2E0E28281CB28E3E8979DA9EBB46D3AE7073056D56FDE91F3CE3363ACE18740340CAD7949DDF45B0069DE69835B8 EntropyInput = B9D973D0ED2EF873D871B2120DD2ECC83957B03A42106D8EDCB080807FCFCF2C9C500C1F EntropyInputReseed = 6858DF1012609018790C74F9ADD75E592C5DCF623BFE9257 Out = 82D1F70DE2DBA437D8F1EE9C8DCEFC5B89FDB4A2DCA30AEC899E34811F283B12AB2EC3214D50AB6FF55F1311C8113E2458091A81620FB552C9367D5BA6B4D6263289A5A286299C57EEE09D111104F4EAB0625DEB8C485B94674812CE7C3FDA29EE2F1EE2EEC86A6F00DDEC9CA55D93CB EntropyInput = B9024D3018564B27CFBA304E3698871A3ED11D768BF1FDE973BF310B51374082B05159BA EntropyInputReseed = 907BDE73F3E11C8D82CE48E98E9A80B6086A14B8D8AE3D14 Out = 5A17372DB41833F391F15B8CEFDA1284A623045F86F7E9BB09D931F9C1A16F31E7F5FBEA366D50276DD0EC59E57018C249EB71EE4A231A84CB53C4D3E88EE6A84E0DA28B1FD18BE11C3D9140D44BE4E7AE88DC780624A868B530557BF5774900EF63759994ACA42DB417CEB81324AE74 EntropyInput = 7CDF6D17C69938C74CBB30AA8C63BE85EAEF71E0A1241C6C76EB2DFB5DC422303476EB4C EntropyInputReseed = FF89BF410485DAE33FD3FFDC5AB49C30C149AE66F6A94E78F7B27F4105D5D846381D1BC5D3F95EC5C5875F474F18C77A AdditionalInput1 = 2030229A1091BF8BB0DD2E580AB895DEC41C2DFA85517488 AdditionalInput2 = ADE1C3D98CEA1848180C118B3BF3702C7B3D68DED252AAD8 Out = 9F1F283C3E013ED2F9625D17F38A4DE551C87E979A334F70A44865CD48C2D5CB4C4899B820F1A536AD4BB16FE91BE1F0933C15490A8370CF9BD2E8C707C1E881172F140825113B0E369793BA63E41E190010C6A37B0D75007130FB41A7A37CFC2FFA55A30DC75380D262E0C531B0190F EntropyInput = 72E2C85833393F2A76A44488ABF082B3C1B9CC6F23C7D9040499EE144959150D82D8B5AA EntropyInputReseed = CD4C70F2B258C1E979E63CA51D93ECF7F6CB28B76F9AA5DDE5BC0AD5C9AAEA6FE1AF3D212FC9E2014AB4B8BFC67750B1 AdditionalInput1 = AAA6924249E44801D3011F9BF8F4EC61474C38B1622F52AF AdditionalInput2 = 43A98D9E166309C8C7A202800592D70007FEFB4614D5326F Out = 5BD8F654F91A781A159E1E71AA708A31025885CF4BD3342F55D93E7801A43212B47ABC731ED4772C71BE4F2AB95695706D19FA07803EEACE6056D4A1FBFC2C9067FA53D045E40F60A3C972000CF65E515C0101D958B10BC153E246340B14D593C2365C5DF562DBCA85E4116612337EEC EntropyInput = A5B32A6B7A328057987D22CDC21B339A5DEF999D1709DFC6D5D12EED300849ED06DC4AEA EntropyInputReseed = A74B8F7A9EDFCA8ECD5ABF12AC6B9B89DEF0CDE4074CA16E78A8F4B3B4771F1C6ED24FCE538411DDA91BEEF1CA60306E AdditionalInput1 = 31EF47E6C0F74061C8D5FEEC9D6AC9E3427D9B302921038F AdditionalInput2 = 7BDEB951FFF97C1D10A70BE2496814477BEAFCA8AE8E3D2E Out = 5789C18EE6D7FD476B85E03C6A351DFB6DBDC2605CEFE1A7846B9FC89D25521ABD0E7EAD9628E5F2FC6B44EE23AD0BC62E6BCEFA44DE08ABE3AC138ADF333C92C7FA673DE79495B83206EE31BADC76D27A4DC2413DFF4B22129D973D5BFFF7182AF10666E019C844A7E938047FB76643 EntropyInput = 9D960D8B6E1B77194E06DEE1E40DD53A8CE207120FC6E7D939529B6A4B41FFF0D4602580 EntropyInputReseed = 2F9B68AC115C5A2CD29EE31E0588EECEDE9277EFA9F16B0BB87F4C3A7998F49E9BA24CDF67310EAF4E71C14F7888DEAE AdditionalInput1 = C73B1432C0209FA9149A17EB75F1A2B7D15888D984856D20 AdditionalInput2 = EDBA1AD0F6CBD711C21B9118A157194D4F7241CF3495AC8D Out = 069BC5321CE5144BE02EEC53142F11730FD2C4CFC18BB6FF6E19BEA1E45221EEC63A95FA9B0841AFC869AE6D1E70A8C7023B8BCB82B92B97FCE50A421E77C908A619E12E0BF5F67CCBF36D77704FD0D87641E8CA782D6C09EF24FF6848A4E3ACB6E920CE33A466FB2A78B4B6FE6C41F7 EntropyInput = 51158C42922CD8F9BEBE031E0D01415779A153BF3C092E50C9B8C1A9EB3DF5E412F62429 EntropyInputReseed = 4F43B2A656191C1C9E45E436168643B6DA4C98BB051D1D1105888648A9410B3806B218634DFD67D3DE40D58ABB1F4EDA AdditionalInput1 = CBB565F55652C777B2077D76F9600CCB202213914D46C84F AdditionalInput2 = 0F5AC65D9E7A50CB160A6E88EAFFD32A93156381E3AA33E4 Out = B9E2965F85487258DAE26C11473893A4E32828ACF561ED170F128E4E4A139FED3A6CAFE59854E31DDA2E8B63AA533B3854F866BC1B5AC9478FAB1B82BAD1FEC479FC1B912B6C73AED244737053A9E315B4C6B92DFE6BC0CE0F895F2909D5C41E1847DC63BD06C62DC681903203A62972 EntropyInput = D79DE2B97087914C7AFE4A95FE3660F909681DC1D964E18871C31879CF9E1D2762386B39 EntropyInputReseed = 7A906FD4B0F9711D0E7011C5F65264DB191503BF0DEF27305DF853CA4895934FB8975F9B48C68D522933D4057C10AB75 AdditionalInput1 = B94C12B445AA011CA213796078AFC7FFFB1C3CF8ECECFD35 AdditionalInput2 = B333AF30B670618AED4101DCC5E70688A9430CEE41F357B3 Out = 721D9A4FC0009EF0DD881A936D0E98F5CA9A3C088D2065C4A9F0CEE4FD5B067DF9E20107A83652573BDD05B77829E8D6363FBB611E0C48F76B8C301065741397BA805D3D223995C4417504D5DBC0DDA2F8037C10B91E64020B2C7B859EAE23F22C71ABFA406353944E90EC03613DCFC3 EntropyInput = E4DBAC7764C22F6C3405A175665EB38F1DF541F4BFD77BFE164A3A42E9AF5267EF2CC95E EntropyInputReseed = 1CFFCD4EE5DC15E8AE69DCC3CD0D112E3F5ED332099988E3F6C07F7C9D81AAE92F734815A4AB080CC27D50576861B448 AdditionalInput1 = 39E4EB08BCD471190EC3FDDEA206D91626D0FFDF571B7310 AdditionalInput2 = EDAE8C7A87437E73C87F1EC4B29D47AA61E28D1751CCE951 Out = F4E391896DD9C7F139C7730466631C672449D461256D6636F1DD0E6C2E157B5C6FF9398F46483A4486A4A7D6771C43DCDD82D179A63A52C3E3CBDB1A4EE55A06980CBFD6CE00D9E92CAD8FF7D73418548CAE9D4DB98D0CC9CF69B273BA4166FBF63151EDAB09C26153304BBDD7321EE5 EntropyInput = 8C8BD8F24F4015D314A223DF053DFB5914661DAEACA78B3A674EE6F2C24177007D20D93A EntropyInputReseed = B55C6FA2075805EE3FE0ECF9F230CC4B6DA9A73E56ED47B240F5798C909862EADEAD7B4821D8B335EDA2085E711EC65C AdditionalInput1 = BD48FC8122A866F108A6EE0951EA43B7D70165C6F28FB1D2 AdditionalInput2 = 681585DB472B83AB72DF2387C4E6CF530322AD5BD89FC207 Out = AA398743C113AB79211384CF399066200E619711C9C526E3B733E27A44D798C09E55ABAD296C83622FED12FF9556E82E265773C0988EEBCD12336E74631D41AE1FC0E362B98D877CC5D6BE0ABAB189CD66E4CEFBEC29694B2B6A3895C002C99CDD85EC606298304029C6DC0702F4EC0C EntropyInput = 76F90DC58C48E9BDFFCC2C2ADE84770C2CFC03FCD341F0959EFD457D9183DD9FFABEEA45 EntropyInputReseed = 0905A3BC66A3011CE3ABC7B1B3BC623570A661870BFF3FA215DC06D7AC65035DF63FA68DD48966EFD50A75FC2DC9A1C0 AdditionalInput1 = DAE74D94136976FAA038EF2404E86AD6D757CB24A3D251E0 AdditionalInput2 = B0B32C292CAC5261BEF5EDD7CA60911763745D9DB3D4B090 Out = F59A0DB3A6656885B8D2D8C17946FC54803FD0B386C368467913588B024C385C5407B7B0900D026F22FF0885209FB33A20A1CE7665CBD31F60B31C1C273D84B2F66F4D9BE72383B807FE8963C2329D4099DEA19F02F6DB7A03F4EA8611E8B02EF519345CEB9BCC376634DB69089D4013 EntropyInput = 08DD32E70B1EC007E8408A1217E5F331D0D1993DF3D09437BD02FC96EE68B7D005292602 EntropyInputReseed = EA68BE1DFB1CB826FAD46B920D138A7F91F3ED4096BCBC9623FBB54BB2E027BC3508055630A52BF9445D788AB984CCE5 AdditionalInput1 = F07F89C5726C9DD5940EB1D5B30E066A7E1B9F595FE08A80 AdditionalInput2 = 3226E55EECA29224A2FAF05CF6495A3CFD64891971D05C97 Out = 33B6859D489BD5F3DAC549CF5A566AE1906A33C7702969A1F78713DCBDE1C664F19DCC7BB7A07B2B61F4E1701588FF3A4449A7F697B7702DB3942646A6853F0AD1F4D8FFA6FE2BC025E810AD9DC91DB767CD34AF0764AF7D56CF6A35AC4D3E46165AF86E1CCEBFB11D5849805F7E96D4 EntropyInput = DCD5A80E25A9FC8555B5521E1D8B4FF4F87220DD05E4F9F19DAE24E5F069DC0341545894 EntropyInputReseed = 22157D604B2AB05F9103E488881DB272A27CEBEF558D46C676C8665CA9D98221B0C3B58A79D2ECA34E708F35176E1285 AdditionalInput1 = 51180078783BE4BECE3BE1CF3C163FBC7D9B694D09A34832 AdditionalInput2 = 5D805D02D1B8E2FB22DE6FE8AF76D281FE2541F9FABA4421 Out = 9FA771B92A328C7C376761026E2B40A178B786A6A3F561726A1BE1D3F309FE3CC604C5551572E2C1A0735E768DA79FB5EBCEEBB8BB8E8658D58DC43B5A3ED789E5E27F87DE81D2DC1854831033923513FB45C552654136458F9D6F50845511DF440DF2A05AB2B6FEBE8126FDE11BA69A EntropyInput = B1A77C05F27D7B010F8C1606338D72E3518E12E0E970EDC7246CF89F379A6AEC2E0EB24C EntropyInputReseed = 8707B023E67BEAE4F902B8C59139A66464227A41157B4BD428732A676976A22BC8805A70B426F7A567E51C9C2F3F711F AdditionalInput1 = 60540A576C3D956B81505CC380EB451FFFF9B559FBD66F0B AdditionalInput2 = 662C18BFC77D81CE23F6A214A4498EA18BF193E4D7314D2A Out = BAFE68DDB46108F5ED8C99326A4A0A03CEE60F042B7ACC6E374D5B3C1ABD473B6C78001032CD54DE04800D67C13D49351C52AEC8D860B59C183D043535012BF1677E561DDB658AB086A6E4C3D3F5DA297882BAF2EC592BCDD3DF79D3595B56CF542551D1CFDB9A2ADB24E6B0BC206922 EntropyInput = 990ADC9F6E1F6855AE0B7048B89D93839C0B82020D2D53881F211F8A0B968148BF9DFEAC EntropyInputReseed = C448F0321BD71F97EB489E0DFE4B02DFE6C231A62721AB159E173D500AB90BD0C706C07DA55AC3351C562A19CB18BE0F AdditionalInput1 = FD889F9C3D98CB40A888FA851E8254865018AB2DA62C3333 AdditionalInput2 = 3FEF35E63EF22D940A436D83787F841FBD7E05D5C635507F Out = ACE73047F88F58D14D742B3B675F4AD23B2A71D5DAADFFBCCFC5FACCB44703849237B15C1156F91B34945F501CFEB7EBAC22C5346A51BD9F405CCB474E773DC6D545E9F7ADB4DAD3BFBC2ADD974E260C6BCEA640F97596E0515FCAC2B52D0039D8B5C2447AAEA1C8707050B02FF442A7 EntropyInput = BA38859504ED09BA040464429B4CE3D96CC4997729A836EED9E31DE6EAF9CEEEF9B085BE EntropyInputReseed = F22A8024FEDFAD187CB4BEA3388FEED5036D24558DDEA04E1813BF27D92DF5B9268A6DE7E396F0F08B3625DF140F942A AdditionalInput1 = 0A7589DCFBDEDDFB70973EBE72EAE355D82D69985B398DFF AdditionalInput2 = B434030623639AFD9A8DC84B3E541211C8A5306B4F8E00EA Out = 01CC5E922F3E718D80D8E0B9DC68591AF338C5627C3B8D59BDE5203E54441F6B5885F5556B9785A8CBB8A44FA20EF932D1DEAD63C8B0B532F66E476DE79CBA40B14F2EADE7E5C8C9A25A7667ACE51AE56428D7D374E6E132A411B82D027BDD397168C8295F74EB8D92D39E156B38042F EntropyInput = 97ED4C20356572B46E926FC94043DB3CB07B64B84C14AE742BBF345EFFA0737FA1D09B18 EntropyInputReseed = 1F59BCA7A3617892B60FBF402244D72349B917E38D7E11521B1E598CF675CB5106E7C6A89C5877DF4AE1FBC8D920E328 AdditionalInput1 = 251ADA02E40A61D864101261CF2EB8CAFEDF668F9BAAEBF2 AdditionalInput2 = CB322D4F4A013DFCC92AD565444D43BC8FB05853D0E2548F Out = F465B80B5144342AC74C162BF27589B8199D47021E32BD3AC4A632D21C288544FA08A98F97C970DB9ED7992F0F1D86FCAA1018CE67413C4C76206A74F25904BE5CEAC5F0F3DF8F46097F1881825446F08F9EA690E0A7DAF2678825298C5BAC4304321051D319AC91F71249A5D367D35D EntropyInput = E2391D189EE849F1DBA515A230567A2CA6FFCBF24556446A7A9D2D5D797CC89A93DC19777DD1F6B5220DA6006A2E7E9C8C2720959D762A6009CF7BE3 EntropyInputReseed = 8826FA2E3CE5181DA16B21D1FD86C2D90A9A079132EF2E2D Out = F9F0FBA1729E0EB29A84EB6EFF0367AB3FCC274211CEAFD3A060B7B04E795DEB66443F8696657866E75465FBE9B947483DED2D7C57F4FFC909051E0727074EC12D13EF3FBCDA39249061E85FAF7CE6C394917A95202A5FB23745EC326DF9BED775C5EAFCBBD1D8F0897D9F66BAF0CCC3 EntropyInput = 5FD4C89CD71572E5878EAAB210E54F762AEC936418EC60F9E555E4DCC7CBEFA57172B47ADEB8EC55416CFB32C80B712A52135FF3F513AB6DC2E06F11 EntropyInputReseed = E5BEDF1724637336D27717485C20CCDC62F7BA5DA166A5B3 Out = 6EB1EBAF4D0F64C9CEE32628D0EFAFF387838B6AD1E68427B02FB94ADEC0CA02083F4D38F3483F4A859ED19D83ACBFEBC173EDD480C97EF39AEC5311C5AFFD0793F07D0E4994C9332AD5B3760E537E79B8F3F9522E22C56C0F360060D2A4405112EEB368C325533EAE52ED55462443C7 EntropyInput = BBAE747B3D2AB012121C640350C4FD7FFA1D6DD92C6FE848FD51A652CE11ADA5F2D606C9F1B69CBD0BE8A8DDF09B01176C47990AA9ECB7D3296E7703 EntropyInputReseed = D3074A45EB9E1A35997F337B49A27DB46817BB49AC90141C Out = E80C84B558B0E0AC2851DAA2B6B0D76F462EE559B09BEC40CFC8493D0AF0C9635AC0F83FAB746866C45299BDB1382ECADC630ED4FFED393E1B3787BFB5EC2DE0A5F7FB013FFE6327F90381D4F6549B0E0AF28BA527B36114E5051695FDB2180744C10F70EDA6BB2429800858956C2B3D EntropyInput = B57238A10FCFC43033BDAA06F9D049701B6B2C204586AD849780126F279E264B1C907D510620DD6DA4B5744586E64D9F62269A14D8E8EE6498899CF4 EntropyInputReseed = A2D4B27FB6D1E6393EA96A3961A7112D10CB44067CC6B245 Out = 4F2A0B3E33990D6DCCDCE6AD0408448AB2B7533A9EA71295FA275943ACFA458C66E41CE43329072F7862C1A9A86E9805DA0629B53E230DF1C0AE19E7D317DA7D13234FFF1F614DA81379CF3616205276E9DE4B01FB258566786E2816BD4FCBE23BF9A7871F6004C4BA3269817593E7AF EntropyInput = 219682CB2035B05E3B32C6CA3C3776A84BB5EB1156963D27882E106CBBB03B3157D0515E785F055BF23FFE24B4E9900CAE38AB5187C44D1113555123 EntropyInputReseed = 24FF1DDF63C44CD08A6BA26898E81A83B9BAF62FBED9142C Out = 308D09B9C70D2226C12EB26FEC49A5240E614FB78275A3873C2816B4D1CE0989B081B2FE98000FAD09355396BD6C6CD9EDD1A6EB55F7CF179C569BB962A0017C0AD19BDD55149702CD01969C537C380600C94ABDDF6F86858D2C0D998E5C09194CC05DF1EA4B28140403A96AC2151E0B EntropyInput = BC30E3F7C611DFDFE7EE3282FB7895F8EC6D53C6803338FBF22D5E24C41D913183CDF8BB48E7E7FB3813970EE7D904E4620D177331A21F24F6CA7462 EntropyInputReseed = 4CFEE5FE8BB2D5A6D92BBEDC275E311910819F5CFCBDEAD3 Out = ECFB9A51AE3ECBF8DDD4EEB2A0CB22652C4A9E2A0954CB5D5E325DB26354BA108F822A6A27CC30B111C90E2039C5AEB8CEDC8BDE6609B4C1955952544F87C173DB970B361D2DB15E95352887E0B37B8198A0D6DF449F81C169283F42B5F9AFAD0E52F1CA82B9097864A658BFB51A793D EntropyInput = ED087091E4DE19E93BBB952C1E6BAA7174E2E011E32BC55C75A30CBF0253EBD12A1473D094B8EE66597006307D405938106C3495238E2A9DF5831376 EntropyInputReseed = 2E5DBAC7CEEFF129EB25AEE91E3EEEB3598852D80D2CF135 Out = C68D1A2E161FD168BF0D8EC0711A016C3F0D987861472C0F929952370709E821EC0754873D45915AEE51E5D8E2B54F1F49286DCF5F92BDEA027C934B044F0159568325B404167C74EF9C0830AC02DC8457335BDFE9B7988DA6D14B7AF798CA863262E77FB62C84CCD18DCF517BCFE684 EntropyInput = 4E382F82CD553958E36722E86C3DE8D28B5E5940403A1C749C21D849B4999B6C8739EC6B5F8824D894C83E6833E398B69C6E5F8AD06E35D8523DF542 EntropyInputReseed = F58A4623065E34440063316B8F913B9F1C71577FE86B2533 Out = 4405D17E599075D2EE63B3B77C9874AF433CDFBBF4D2ED3F153000CFAFB8AB4920084515F50DCF495E3D9BAFE357255C15916A9968227B6099F88BCE7C7150A0BBAA069DA14F2D72111FAC20140A9620FF150B6DEF337C823FE0605BC7608828FE225AC870D7805C63144D8949CFEB43 EntropyInput = 2ED07A9563E2923C6391A22A1C30C99647A1A1A28291F7F38E33B8C8D0A1DB62598C842F30059291DAC480624EF16B59D3FB6BFC8E7C5B01DD558E63 EntropyInputReseed = 1B182C34271BBA465744F8ED4954B336B22686F655C89B35 Out = 92459743E61CEEB745A4C0A815F6E7F1FCF478ED28731837432597DDCBCA250D424ECD59D8EEE5656493AC862A11E2181D16E72E9590ED728BDF24F21BFE6C7F66D4942A7D70F78836248071F5604219BDE2844F453B52BCF4B50136FE3D18D270F034EA61409E6A732531CEAB9332DA EntropyInput = 04D936B0FF5DEF4EE29C58F274BBE8C24F7291E7265F87BDC36438AF7DC5DDD72FA256D8F5EF271F9B64881C3DF2DA35A6081F5FF1541A30C1799108 EntropyInputReseed = D4544603DB9A990B76995971ED944E40F4A90BC5E951FF52 Out = 7A433251B17F3E7458AE12ECBCA6C9F091504A6DBE6F2DC4C44B806812A2474C17637A7C834EA16BCEF104C6281CDE4A905B87D7768C4D64520570EF0990C9294CA1B5DD69EAFF77F5E4DC36AD908D4215614F1BB8EFB12E269B24381915CFCF20395CA206D617631627ACC864585AB0 EntropyInput = AAADE6C4D3A38D35C13827F19B55E8F5ABBD74B95A7E9D05F4B5FAB6C6503EF1ADCAC2B069DB0F4DA101F9CB013BA7C3F839BED97DC9D343D693352C EntropyInputReseed = B678E0391439BF4AF06AA1E684C6AD54E5F89228E71AC076 Out = B98DDA9606116AE7FF87FBDFC902072AE99AD51B1002FA2632F31E824D6676B9626972A2721A268E173E753792A02A25B257DDCEB1194338712D1E059DF5C0266E6E48CF828DF3D0FAFAFC3F0E52133C4C280F9B9F7DEDE76E9722CB291FD59BEEED375BDA3D7081EE76AC71CB71706C EntropyInput = 9946997EB9BE7777B9E788F4682B2C171388EE188F7ED9D3ACBC8D98462EE4EF375B1C5405B01AE2DC644589F5676B4448A439FAEF89BBF5C267DFB4 EntropyInputReseed = 1BC2ADF067092727B95C7D40CCEE9AEDF384062D6D3888AC Out = 5857C334220A64084CBD4BAB51D6A835719157B4BBFA4C201A9A89929A29C891BA07759E354B778861643744D2A26D358B338AC55C8EF850460C6E2EDB0EDE4F338529E24157C4727E6FF825B78C1B1C89418A1A264A70078A40A83F0AF5C64080D761E47F4BA565504D27AD4484C9E2 EntropyInput = D549C3D26DF339DB88B81BEF795F5CF87C2733CE8E9C76D2FAF622DE5CF0A4C4941DD21C2028DDE261D94A13F6EF56EB2968174C8BFFDB9F11CE1DE6 EntropyInputReseed = E6931672F8A34422DD74922D586B2A58949E85DA0EBED317 Out = BBA653349D4E8B8D2E8A2743C23C1DE7991DD461F06B22DE9CAA64A097CADFC6B8F82C55FA41B5C8184D3EC273F88AEAB35C6DFA344092D79352C8E91DB387ADDBA185551692D5D88A12B18BBCC94E99E2BD2861703BFEA4D0C7FAB29C68C349E2C225BD06CCD77D104AFE8F20A03498 EntropyInput = 17EB90FB869D49EC7E5B2B4B3D3C64A03CC31CFA94F8AAC624BC969BB6468C1CA238DE91CA8F1ECD364AADEA3E47C7196D615C874FDFD4DD1F4B4E9A EntropyInputReseed = A8628BCC9BF64339936BC35B36BEB423B07D0987A4791ABE Out = 98CCB3F596B8A88FF2AC222EC2513C74F6CC9F777598C3EA0C6873DB96334872721685D272D813C3BED6B7CF7FF5840F93A3916A7BDD4136FF02B53F87A24088DD3E44931FC9EEA326947D4D2B3789DA22FB383DF54976E58245446097E9B9AC692DC69CC86D200C25D3FCC4284AE2B4 EntropyInput = 7905311E1C3E62880033C9909CECFF0C81A1F351C81BB71D80E329C843C25C98052C74C25254F0AFCEE1998FC855874294C0EE2BD321D201E77E4640 EntropyInputReseed = 114C588FF60F48FE0FB2FB320C7A54D512132A2F530ABB3C Out = 8A018866798E04F7A5C8A35E829D547629BA8E6189E88AB9184C01CF61A9C12F12F17AA48CCF1690BF6646DDDC92D79D1704BA517DAE097CAD527B56E762373083C7D0A37CF16B7B58A4C97441FF4B4EF54AE3E8773B4F20BC681E0AE2FBD3FD3C08D925E7E5B6379A172882B2E706C0 EntropyInput = 591075A55C8263C32339455B3E929482BEA1EC9707F1CE1D884B66A1BDD64641557B828A6C4D23259B35C9286FD9EAFB81E96F9D2A7BC34D6D81B0FB EntropyInputReseed = E1C05FCED3FDC82993E9A7660F19E6E6C16BAAB8A4A9B018AE1542380BBB82C79D1BFC3FD2433159DF5A9F6694661F7E AdditionalInput1 = 32D931125A432FA2825C75DA70900BDD9DA715AEBCAE6425 AdditionalInput2 = 0CE82D2AAB13436459311380C29DA537CCD6677067EAB6DB Out = 086F3905C0C95DCA7C8BEF66B30FA642DEFF68D1F08F6D46F5DC523BD27CA5D984E26D5CDFE7A45DF678DE4F4B05EF5EBEABACADA2CE259FAB953CD0BDB9B207046B8CA307D387A6EEF287ADFB3E16C72F378CBCA3406A2D85B8A1434CF87EDD98A4AC4FDB5BB123F8535B2940FBF0CE EntropyInput = 12327285535B3866CD624A17FB6723EDFF258D1659917730897C8E7F5767DD7B2A94C2F250C01853F84541301A6C507B490971C9881D9DA53D8C05FF EntropyInputReseed = 5BEFFEF6DD098C432AF5372330C96C034CA0B0C09280C6A249FC68E4FA5E484511275714649BB73577E163F00017806A AdditionalInput1 = 0597F3CD8CC9670B79ACC045FE26569E9152D59881D7FEA1 AdditionalInput2 = B948DF867C7C576AC169DBD67E1ADE5F5830497F4FC627A5 Out = 51EACDA37B5E3CF1B0B508A2A7D7704B33F5C8A59660EFC8C7E1E8F16D4CFB40758009946B2AEBEF5CF9DBCADA11B62EEBC5F7EE6C64B0C5E600736446A99CEDBE1E79D112FF6E8F67A6C9065003C7B1EBCAE6FC9A0F752E1BA1CB487DC1291F0F9C1A5D249C548A9EE060D894A27E75 EntropyInput = CFF0DDFEAC647A3033D5352442C06C54EE9143A934E9040F0F21BACF64CAB70A136A8EE89895F45299F9D4240AC29845EB5DD1C816F30877DA29A486 EntropyInputReseed = AF9EEB050B8E5B9D3B016F4C1C78D77B0E06E0EDC44B285088EBC6EF1D494158CC714650EEE8354EB262B531388533E4 AdditionalInput1 = D509222EEF77D1BEC36668F276ACD8F9B7935529F5A58E32 AdditionalInput2 = 48ED31A65DBAEA617C908A018ACFFE72DC736CC643423D1E Out = C64A02422DEC3FBCAB273A7A470E6BAF94FE4A5EFDB85B02D9514D584EB209882F8F63D9A4174A80A45476345932B6B23995D7C2E1BD20A3C7FE7DB0859FEDCC3A6BDCB32BAFA8CE50B896BAB46831999C63D501040DD2C69F13FAE7639A0F567D0713F0393F416525D42D775BEC51CD EntropyInput = C74C8A63836F58CCD2A495346F2A05ECFD7CBB53B1D49874D9F0EEF02724CE6B5ACC68DFEC20D95E4D4777B64E238D94D541C8BB5E4388E9CA0B2790 EntropyInputReseed = 8139B702AD145F9506A65BE26F9048F0E593F82099B105099CE3B824CE7878204EB1B8451F73FDAD7A6823E6B1A83E8A AdditionalInput1 = EE6904CC264B610AA2D369D4E17CE38D587BD58437B2D6D1 AdditionalInput2 = 059820128B811EE4CD1DCBABFAD887DFA88198A198CBAB27 Out = BD520F1F3BEA3E172903FF68205FF5F15C5BEA9F1D8DCB98BB585C6F742DE248600524B7BD4C69091C8ECFE5FF1D855ED91B1368C4676BE63A4D6F294C329720B15EDFE2773F2126B5A3341CD2584D4879DB045E94666833EAF87652928D677956F691D6CB0DDC2BE81E5F00E10C1AC1 EntropyInput = CEFCCD89FFECDCA3AB7CD911E74A5A4BE43BBA01950BB1C4A7CEBA30A6B7A31D7DE73F916A71611DD0E4F1072A5BF8EE3138FD9D78A4770AD2CC50B7 EntropyInputReseed = B838E298D1880E9A5D814614C1AC06015C49D2C84381D7B707EB5D62B25C7BCEA1C5A3942154687B6DCB006B8CC48CA8 AdditionalInput1 = 53E609E7A466F1F772F075C4F2C180BF268A80C417CB9992 AdditionalInput2 = 689092F77E4BF5294F7C5DC07524E51AD3049CC28EEED11D Out = 64EFBDF8DA8D2714A94A88FC426DCEE639AC6AF1F60448D1468E8D40151A989111339402F66A609360BA3285F1407D6F012EA6280B0104EE116525A0295697BD06040EB1CC9B6C189186232BFE8A272684E5528751FBF3A8ED2C815275F249927DF6E69E8760E8B0A16E0B1B57EF7C5E EntropyInput = 0CA27FF23E0A8B7E0B7E49ADA25B4C246DDA3541C5B3C3C46673EC0D2602DDF64B919BFB4102D7162B7BF918D579BBA5A4783AAA539369E9EC76E4B3 EntropyInputReseed = 8F1D94F0742AA916E48096E3ABDE4241CC19703F9E88B8F6B58F3649C92E8E0427682C84204E8908D7E13B3A78C13C8C AdditionalInput1 = A405EFC7C05E114B5F7E28ACEB3CA6BA53AFA193B476EBAD AdditionalInput2 = 637FCDA07AE6BC0E9E7A581F562F6B32A62022E55DC7DD94 Out = 46029AD7D4BF11508DA0FD05B527C77749C5876734AC641C37EBACC862A363E869DFD5DF51D4C7966DB870FA517C4AD2D1BACF235E4521A6BB3DDB17FA35260C1D49AD36BE1B9650C60D2AB982724D8E81D425003E6EAEF235ADD2E41C6BD94097C89CFC94632CB631875D06EAF996BE EntropyInput = 6F95A259502811E8996445EBF3469A80A5CF4795677BD22D8710E75EF1F30F94C1EB7136A283FFE574C691CC070EF36746E159752B52F881FE971D62 EntropyInputReseed = 1ED00B2922D9FB78C59ED4BCA389C9AC1B77FB859022C5991FF3F53CC086465A1AAD0D72E7CE6072B09BE914AF185BE0 AdditionalInput1 = B4603849AA7E3CD6441256EFF5810F5267C4D5FFBCF053D8 AdditionalInput2 = 0F52DB3E2DCF024221CDA4C127C9C0CEBDD0835D4BE70746 Out = 9606B45613CE049D00F2F97A32D88A1E6CE2C3DAE5C294222575A23FD53B639F418B229265A86B6B9A1372CC0FB0F15AFD0046CDA6702BE4BEDF56EC961900AE92D2E51A808C622E0211193E24312E6806A6B9B5F874BD541FC18429A90EE3D98E35608561147645DA283AE0ED594F6F EntropyInput = 34B3BD77D36CED522BF9801BE90BAA700E46E9BEFDD22EDD176A555DB3698B51964A33360AFB9179064B12382BCC868B7A4323C721C7B4565252C1CE EntropyInputReseed = 73E4A1A40A6AF8382E39696BAE9816D77E27F0DA898AD15CF9A314B0DF9ADE46ACFED9205BD30BD648873F4069D2E9E7 AdditionalInput1 = 32751262029DCD7143C4C95D3AA33DD68B4A5984A932DD46 AdditionalInput2 = 71283123D2B10343977EB5E16BF1CDFFC2764B29A90F061B Out = 2217BCE37D4B3D915E26CECB8890029A226A021613CDCA492C47008D278F170B5057426BF27D2C80F499FD430F80BADC9B918AA146E4EEA2EC0C7A7E65F4B32C0D4E73420F32B7FF88D03DF56A42EE67E9062285071EC9C879F9AEAC5E36C2304437D985C2CA71A6FD03B6D11721DF9F EntropyInput = C03C1AF016DC0F9F829B7B739CF75FFE8DF9D3DB8DC71F6AA1AEE3253753B34BBE2BA51BF29279A365B957B45DD594003281D4929EFEB2D206D7E470 EntropyInputReseed = AC205CEBB167EA9E0C4708CF94B83692BCEFD267870FECC1CB8BC596257948894AAC94FA2DF036D08AF6D1D96FB655AB AdditionalInput1 = DF20697981E9E3B91AEDC2F98135A41D92295E697A6D5C47 AdditionalInput2 = 957D29A776B75F3D388AB6C1C74A3070D352AD275463F972 Out = 122719A1F7AE64CDE475B1CF1AD2D4991DE2E601533E27F73B16BDE3B1A3A4810406FC06BBE9B13CAC1BAB2BF4DA2BD81D2062563B2CBDD5AAD41D413F9EEB2DAFA517C8FB719058A313265DFF800B998414EA5CEAA56F09D529556309A9819443E3B3C09DC18258C79B6098BB55DE1F EntropyInput = ABF82377848E2C9203D0111C21B3180BC3FEE319D832CE75A13031395D38E93F9C6A8F4F312E7AEAB2EAFEA0DA9CA1FD84389C86D70FF8B63ECDF9D9 EntropyInputReseed = D1BB1EDC0332FF3DBAC934F6ECBEAD1FA8C01317BC6666F316AAA283C3DEB330EC2926DF0A8BB9C9CE24CC328D35D215 AdditionalInput1 = E41C6B5FACA23623D0CB538D8FB8790ECD9DDD663D4784A4 AdditionalInput2 = 16CC86ED9F6E9F8F354073FF93F5D6A9567D44EE98CFC64D Out = 02DCBFCDB28FEB7A71A4A4D3D1EE061022A10DF4CB0C76BC3B70BD516CCB014F8D49D21BB1402396C39DAD124E5F37E0594971BD0E7AE043325ADB046FE09C64F34E53787916C48884379DEBDFBA1C0405A9824CAFA57AF7F61F78F6C2CBA1F47C10198DB2866BDAC69638160D85BE35 EntropyInput = 5118E876BB8F10B8823778F0C5BD444A98F5C2FF5F19575AEB88D92901228A6ABF67B911EA97CDF076D3DA875E21F41EFB42947528ECE6B15B9CDC69 EntropyInputReseed = 693CCA4E85F3A9B26A59C06ECCEB821A5B648CD770699BE4C5F9D3EA1B9F617D7EFFCA8838B85EB92EA613F081C5D738 AdditionalInput1 = D63E995D4F38FDD42FA208639AFDF53BDF7F368A6548C2B1 AdditionalInput2 = 175C8422D814EAF50B19CEB8D367A5AE09268A05D66421A9 Out = 40E3D418CE4766249714833466C33FD0022983B9BC6628751CE93AA71AC57C4D4535F5EA34659C47CA76A05BCEEDB9D6C3FD4FBCAE16AB85257B57D9443C498C4B073A1394525CAC12A05F9E538F3A60AE1037CF8FF9B675653F05B16B2A648CAD33B10B42856E594165B6571D0AB505 EntropyInput = 6709AA7A6F0AD5C85257CDD3F37DFCCA4ED5064F236FBFF66B748F3F50C80D7187935ACCA018DAA9F37235C3905DBFA89F9857DF2FF86C504936C0D7 EntropyInputReseed = A82F7AB03AD5BF21770B99DBF0899F594C55DB41C3D2FEE480BAACC246CD21A55F101CC4FB9DA1581BF5DF5D7028407F AdditionalInput1 = 7A207784C88F410C3800F054F4F075F8B06744AD3CA1369E AdditionalInput2 = C8CBC0214F65B07DCB781CB2FBD229787FAFCECFCE90BA5C Out = 236AACC4561B09E9A467FE605D81C30BDA09087789E822994879D53E7E00C6B8FA2991A90BCB24CE4C25CFB44811F23F7495234966AE470DE131252B288281C00F43F1A675E3A43B0242956EE0AA2810C0DA955930D5BF431C593A738908E847755D3CD8C733D7C8F95F04BDBB57ECAC EntropyInput = 06899244D318FEF02F124163FA84F174F323E9D96C36ECA213E52A5B36C8DA60C01F9164B3B69F711C3EDC45CE04FF77B0ECAAAC0484502FECED65E2 EntropyInputReseed = 02D1267FDA9E3F0CD19678B197634C5FE93777C15DDD34B9EB201ADB9503A0D005E763A32D25FBE7D0E0310CBBFC99DA AdditionalInput1 = A7E48CFAFBCFD14FC4C1F02FC1605DCC6C0000E0B87502CF AdditionalInput2 = 0CC7A461AA0968E7D58D9BA35FD5BE337652FF97B82FC104 Out = A64211CD4D265EB7E60923ABAC990AEC04B15C5B9049B68BA6178C53FC9BC6C0C2BB7D280EAAB989AE9C0C06699A5DA46153248D617EE6116FD7BA0CF7F134BF506602DEE10EC70472BAFE3C4DCD8B5BC7F0243D4A07B6145941A82C422C1C718840CA57F81D90C63DAEFEAFB843E5B9 EntropyInput = C15613DC156CF979125D49B7424EBE65F367D6476DF9816EACEC20A2105D4C708B4A40E78EEDB35288139BD0A594396401567FC6415CDF0EDFE54F74 EntropyInputReseed = A2A38685624BDF59FF569C97C0E3C026E314C30ED4822A7DA04F874EFBB3C7278A75137B0F7AE8458AA165BA9D7CE312 AdditionalInput1 = BBC76FD33270AD4171698722585D84AEF25512F1C51ADEC8 AdditionalInput2 = 9FA6C736D7CD756E57B0B808A11B5425916D20AFAD17B2BF Out = B37D18E599AB7F68EFFE43B818A6BF7422A43D62B4990A4F6A2D6B614AF43AE02C1F7189D22DE2B2CEB7D395AFBB6D8F8BC7670D20F11F9A664E44825FB4BB2EA852AAE4BA07FFE57F1A4DCE0C92B16232BB730A363DDE54B2254C6DBD2E744BE667A5B67B34E880DF5BD44A823248FB EntropyInput = E9A045CB195A35ACE0623753958C35EADCB41F0D1A2DBEF6ED5CD6DEC8E06145CB61A5C69573C8E6395700AAA9C0764C4AB17C35AED2C746A3C94B34 EntropyInputReseed = D67E5D805458814694AEDBBA2D564E3645F80880B7EFCB7903FF031B53700AC8FB264136BA56BDA20500F9C819C05ED1 AdditionalInput1 = A511E76D509AFA50F498AD9BAE7847355A2B51C0518EBBAB AdditionalInput2 = 17021FCEBB868CC43884EFC0791F479033D010AF63B52290 Out = 224710E1146737E99A8464B33A047BE20AF4517E341412889D319E870326E40B7A4FA2122D2CA7B002D8FE570BCB647A9C72DEC5069609AB900AFFB1B492CB0A0D6C146E285D5223B255739DFFF36BF245415A75EC4E32402ACFA5D011BF4B2E07ED53A9034B7BE417CCF0140312F698 [SHA-256] EntropyInput = 06032CD5EED33F39265F49ECB142C511DA9AFF2AF71203BFFAF34A9CA5BD9C0D0E66F71EDC43E42A45AD3C6FC6CDC4DF EntropyInputReseed = 01920A4E669ED3A85AE8A33B35A74AD7FB2A6BB4CF395CE00334A9C9A5A5D552 Out = 76FC79FE9B50BECCC991A11B5635783A83536ADD03C157FB30645E611C2898BB2B1BC215000209208CD506CB28DA2A51BDB03826AAF2BD2335D576D519160842E7158AD0949D1A9EC3E66EA1B1A064B005DE914EAC2E9D4F2D72A8616A80225422918250FF66A41BD2F864A6A38CC5B6499DC43F7F2BD09E1E0F8F5885935124 EntropyInput = AADCF337788BB8AC01976640726BC51635D417777FE6939EDED9CCC8A378C76A9CCC9D80C89AC55A8CFE0F99942F5A4D EntropyInputReseed = 03A57792547E0C98EA1776E4BA80C007346296A56A270A35FD9EA2845C7E81E2 Out = 17D09F40A43771F4A2F0DB327DF637DEA972BFFF30C98EBC8842DC7A9E3D681C61902F71BFFAF5093607FBFBA9674A70D048E562EE88F027F630A78522EC6F706BB44AE130E05C8D7EAC668BF6980D99B4C0242946452399CB032CC6F9FD96284709BD2FA565B9EB9F2004BE6C9EA9FF9128C3F93B60DC30C5FC8587A10DE68C EntropyInput = 62CDA441DD802C7652C00B99CAC3652A64FC75388DC9ADCF763530AC31DF92145FDC897A0C1C482204EF07E0805C014B EntropyInputReseed = BD9BBF717467BF4B5DB2AA344DD0D90997C8201B2265F4451270128F5AC05A1A Out = 7E41F9647A5E6750EB8ACF13A02F23F3BE77611E51992CEDB6602C314531AFF2A6E4C557DA0777D4E85FAEFCB143F1A92E0DBAC8DE8B885CED62A124F0B10620F1409AE87E228994B830ECA638CCDCEEDD3FCD07D024B646704F44D5D9C4C3A7B705F37104B45B9CFC2D933AE43C12F53E3E6F798C51BE5F640115D45CF919A4 EntropyInput = 6BDC6CA8EEF0E3533ABD02580EBBC8A92F382C5B1C8E3EAA12566ECFB90389A38F8481CC7735827477E0E4ACB7F4A0FA EntropyInputReseed = 72ECA6F1560720E6BD1FF0152C12EEFF1F959462FD62C72B7DDE96ABCB7F79FB Out = D5A2E2F254B5AE65590D4FD1FF5C758E425BE4BACDEEDE7989669F0A22D34274FDFC2BF87135E30ABDAE2691629C2F6F425BD4E119904D4785ECD9328F15259563E5A71F915EC0C02B66655471067B01016FDF934A47B017E07C21332641400BBE5719050DBA22C020B9B2D2CDB933DBC70F76FEC4B1D83980FD1A13C4565836 EntropyInput = 096EF37294D369FACE1ADD3EB8B425895E921626495705C5A03EE566B34158EC6E2E0825534D2989715CC85956E0148D EntropyInputReseed = 1B4F7125F472C253837FA787D5ACF0382A3B89C3F41C211D263052402DCC62C5 Out = 4541F24F759B5F2AC2B57B51125077CC740B3859A719A9BAB1196E6C0CA2BD057AF9D3892386A1813FC8875D8D364F15E7FD69D1CC6659470415278164DF656295BA9CFCEE79F6CBE26EE136E6B45EC224AD379C6079B10A2E0CB5F7F785EF0AB7A7C3FCD9CB6506054D20E2F3EC610CBBA9B045A248AF56E4F6D3F0C8D96A23 EntropyInput = A7DCCDD431AE5726B83585B54EAE4108F7B7A25C70187C0ACBB94C96CC277AA894C8F4B8E195A47356A89A50D1389AB5 EntropyInputReseed = 51733EEE2E922F4055E53939E222E71FAE730EB037443DB2C7679708ABB86A65 Out = 99BA2691A622AFECC9472418E6A8F9F1CDC1E3583C3BC7A2A650A1AB79DCBCCBD656636C573179276E782569420C97438C06BE898867F628B1C01EB570263D2C0F09C7AAB536F6FBA7DF6AAD19E05C236B645674667C03D1B6A04D7FC11177FE78933B309679F5BF26A4632B9A13E314C4BF4532428D3D95C689002B6DC1FBB1 EntropyInput = C286425ECF543A49BCC9196B0DB1A80BC54E4948ADBA6F41712A350A02891FA6957A659A4EC2E0B7AD185483C220FD61 EntropyInputReseed = 08C2129813EEA0776FBA72788FDF2718759CC3C4207FA20A5FE23AC6E32CC28E Out = 8E1020A4FD84C99E0FC7E3F7CE48DE5ED9EC9A5C2CCD624DBE6F30E2F688A31DC55957630357A5D48CA2A456241A28BFB16D8BB000877697A7CE24D9AD4D22B0C15117996F1F270B94F46D7A9BDFA7608FA1DD849177A9B8049E51B6B7A2742623854A1FDDB5EFC447EED1EA1AED6F02B4B2754ECF71EA0509DA2E54F524A7E7 EntropyInput = 02818BD7C1EC456ACE55BEEBA99F646A6D3AA0EA78356EA726B763FF0DD2D656C482687D508C9B5C2A75F7CE390014E8 EntropyInputReseed = CF319BFA63980E3CB997FD28771BB5614E3ACB1149BA45C133FFBBAB17433193 Out = 19A231FF26C1865CE75D7A7185C30DD0B333126433D0C8CBF1BE0D2B384D4EB3A8AFF03540FBFA5F5496521A4E4A64071B44C78BD0B7E68FAC9E5695C5C13FD3B9DBE7F7739781A4C8F0B980F1B17D99BCE17CEB52B56866AE02456FFEF83399C8CF7826F3C45C8A19315890919D20F40FC4E18D07E9C8CCD16C3327B5988F71 EntropyInput = 77A5C86D99BE7BC2502870F4025F9F7563E9174EC67C5F481F21FCF2B41CAE4BED044AD72EE822506A6D0B1211502967 EntropyInputReseed = 778100749F01A4D35C3B4A958AAFE296877E0ACAFD089F50BC7797A42A33AB71 Out = 831A4DA566F46289904893EF1CC1CD4AD19EE48F3857E2B69E936D10AFBDC29822E85D02663D346EF3E09A848B1D9CC04F4C4C6E3B3B0E56A034E2334D34CA08F8097BE307BA41D020BC94F8C1937FE85644EEB5592C2B5A2138F7DED9A5B44B200C8B5BEB27597C790F94D660EB61E8248391EDC3AE2D77656CBE8354275B13 EntropyInput = 0EA458CFF8BFD1DD8B1ADDCBA9C01317D53039E533104E32F96E7D342E6C7B9B935A4B66FC74C2A48757A99C399E64E3 EntropyInputReseed = 6C5F3708E7B714C4ED139B4FA9E8C763AF01773484005109A85E33653BB0CE98 Out = 373A37AF84FDDEC13645A9768D6A785AE5A2589D64CD9B37980DDE2541499210C4F408335DE1D585349064F3F53A2B4C5EC6DC2A09591F99AD9FAD528AC83474164B45497BF167F81E66FA08463FFEA917F6891E48F149FAFC20622BB1172F34886FEB45C26FD446A4A4E2891B4BC594186896141AAAEEB301B49E7C1A26FEC7 EntropyInput = BFB68BE4CE1756D25BDFAD5E0C2F8BEC29360901CC4DA51D423D1591CC57E1BA98AFE4BD194C143E099680C504CCEAAB EntropyInputReseed = B97CAF210E82498C3408790D41C320DD4A72007778389B44B7BC3C1C4B8C53F8 Out = 409E0AA949FB3B38231BF8732E7959E943A338EA399026B744DF15CBFEFF8D71B3DA023DCCE059A88CF0D4B7475F628E4764C8BEF13C70CFBBBB6DA2A18AABCAD919DB09D04FC59765EDB165147C88DD473A0F3C5EE19237CA955697E001BA654C5EE0BD26761B49333154426BC63286298A8BE634FE0D72CFDEEF0F3FC48ECA EntropyInput = 4F6880A64610004463031D67D7924FA446C39138D4D41007E8DF3D65691A93676B33B2C13600F4B1DF6CA3D1960E8DD4 EntropyInputReseed = 57B87B8C8F48312B5333D43B367730C0A5AD4725A16778FCB53FE136D136CBFD Out = 73D0F324ED186E2AD06BD1800E262BDBDA79BA54E626761BD60F74F43E3BB62958EC1E2F1D940AF163E1CADC124E7EBABA2F72E67EFD746C7F6D0CAD53EF03D859D93CFF778A32EE5BE172FE7FDBDC232DED360D704A6FA0F70BEBE942E56478345492F49DC5C6FC346B88A58947AD250E688E8C626FE1EFE7624620E571976E EntropyInput = AAE352E111843219CAE8F70E7B8F6EB9BB53D246CBEC1E4F07D42757143295B4B84485DCCD1BF93210E322EAFCBEBCD9 EntropyInputReseed = F9237F00D744D8FBFF21B9D0043C258E8731817E6A5FB7B4BF5011680E5BC642 Out = CFB28B93522C7D61D8D3CE3F080E435E4C83C7E13A9DAB788DB8FEF0407267A14FBC9324E090E24DF5491FEDFA81116869983938D4D4D7324A310C3AF33A6F7938F602C5E4E63F1771CDAABDAB0782B5AFFB54EB53047C109A9606739DD0065BD21ECA33132986554878354F5F9F852E674DD690163B0FF74C7A25E6BAE8CE39 EntropyInput = 589E79E339B7D2A1B879F0B0E1A7D1AD2474EAA8025B070F1FFA877B7124D4FF0961ED64DBD62065D96E75DE6D2FF9D6 EntropyInputReseed = E928388D3AF48C2968527A4D2F9C2626FBC3F3F5A5D84E0583AB6F78E7F8B081 Out = FCE6CED1ECF474D181AB331F79C3D2CC8A768EC2818DE5B3FC7CF418322716D6A6853733561A497C0C25CB288D2C9FCFBCA891BAFD5A834C85F3603F402ACF1A7B1EA92DB847ED5C252A862AD4AB5E259715F1FC81DA67F5230BF8BE50EE8069758095F7D0E559E03F2C6072290E61794458437609E473EB66580CDDAAD19B71 EntropyInput = 714277D408AD87FDE317F0A94732FCE62F1352BDC90936673B4F1DAA0925AA26D16582A99F23010B4248B88D86485419 EntropyInputReseed = BD9FC7CB2FD5063B2C3C0C4F346AD2E3879371A9C805E59B9F2CD2CC2A40894F Out = 62EF7A431288252E0D736C1D4E36CC9AC37107DCD0D0E971A22444A4ADAE73A41EFF0B11C8625E118DBC9226142FD0A6AA10AC9B190919BDA44E7248D6C88874612ABD77FB3716EA515A2D563237C446E2A282E7C3B0A3AEF27D3427CC7D0A7D38714659C3401DBC91D3595159318EBCA01AE7D7FD1C89F6AD6B604173B0C744 EntropyInput = 05AC9FC4C62A02E3F90840DA5616218C6DE5743D66B8E0FBF833759C5928B53D2B89A17904922ED8F017A63044848545 EntropyInputReseed = 2791126B8B52EE1FD9392A0A13E0083BED4186DC649B739607AC70EC8DCECF9B43BAC13BAE715092CF7EB280A2E10A962FAF7233C41412F69BC74A35A584E54C AdditionalInput1 = 3F2FED4B68D506ECEFA21F3F5BB907BEB0F17DBC30F6FFBBA5E5861408C53A1E AdditionalInput2 = 529030DF50F410985FDE068DF82B935EC23D839CB4B269414C0EDE6CFFEA5B68 Out = 02DDFF5173DA2FCFFA10215B030D660D61179E61ECC22609B1151A75F1CBCBB4363C3A89299B4B63ACA5E581E73C860491010AA35DE3337CC6C09EBEC8C91A6287586F3A74D9694B462D2720EA2E11BBD02AF33ADEFB4A16E6B370FA0EFFD57D607547BDCFBB7831F54DE7073AD2A7DA987A0016A82FA958779A168674B56524 EntropyInput = 1BEA3296F24E9242B96ED00648AC6255007C91F7C1A5088B2482C28C834942BF71073136A5CC1EB5B5FA09E1790A0BED EntropyInputReseed = D714329F3FBEA1DF9D0B0B0D88DFE3774BEB63D011935923D048E521B710DC6F4EF872FD211A426EA1085AB39EB220CC698FDFEABE49B8835D620AB7885DE7A4 AdditionalInput1 = D74D1669E89875852D9CCBF11C20FE3C13A621EBCB3F7EDEEA39A2B3379FDCF5 AdditionalInput2 = 0C8AA67CA310BD8E58C16ABA35880F747266DBF624E88EC8F9EE9BE5D08FDEB1 Out = CE95B98F13ADCDF7A32AA34709D6E02F658AE498D2AB01CE920F69E7E42C4BE1D005ACF0CA6B17891DFAFC620DD4CD3894F8492A5C846089B9B452483EB0B91F3649EC0B6F98D1AAABC2E42CD39C2B25081B85AB50CB723007A0FD83550F32C210B7C4150B5A6BB3B0C9E3C971A09D43ACB48E410A77F824B957092AA8EF98BC EntropyInput = A7EA449B49DB48601FC3A3D5D77081FAB092B8D420ED1B266F704F94352DD726D11A159B60AF8D20A0E37D27E6C74AA3 EntropyInputReseed = 50916AB47E8CB5DC843F9FBA80639103711F86BE8E3AA94F8A64A3FE0E6E5B35E2BB6768120555E7B9E0D573537A82F8F32F54560E1050B6ABB1588FB3441E66 AdditionalInput1 = A50CEC9D1ECDDB2C163D24019E81C31A2B350CCD3AD8181FD31BB8D1F64FA50E AdditionalInput2 = 591DBBD48B51ABCED67F9C6269CF0133CD3DCBB5CFAFCB6EF758569C555A5773 Out = 0A464ABCC8685158372D544635B953FCB1D3821C30AAA93982F9B788935F00F88115AAD61D5CEE003B3D1CB50F3E961A501E2DD0FC7E1724778B184A4BDF9F64E110DDA7446E5544A30BD49A400EA1A5411800E1EDFEEA349323618AFC5DC5782DC4B71D2DA4D6A4785F8DD346FEB9C8740FFD26BF644E3E4323FF24C30B9F10 EntropyInput = 14683EC508A29D7812E0F04A3E9D87897000DC07B4FBCFDA58EB7CDABC492E58B2243E744EB980B3ECE25CE76383FD46 EntropyInputReseed = 18590E0EF4EE2BDAE462F76D9324B3002559F74C370CFCCF96A571D6955703A79EA3CCCA1E8D791D22FCDA621FC4D51B882DF32D94EA8F20EE449313E6909B78 AdditionalInput1 = 16366A578B5EA4D0CB547790EF5B4FD45D7CD845BC8A7C45E99419C8737DEBB4 AdditionalInput2 = A68CAA29A53F1BA857E484D095805DC319FE6963E4C4DAAF355F722EBA746B92 Out = C4E7532EE816789C2D3DA9FF9F4B37139A8515DBF8F9E1D0BF00C12ADDD79EBBD76236F75F2AA705A09F7955038EBFF0D566911C5EA13214E2C2EEB46D23AD86A33B60F7B9448D63EEC3E1D59F48B39552857447DC5D7944667A230E3DBFA30CA322F6EACAF7536A286706A627C5083C32DE0658B9073857C30FB1D86EB8AD1B EntropyInput = FA261FB230E2822458532CA2D5C39758750E6819A6FCEBEF10579BA995096959564E1C9FBCB12878DF2BD49202CBF821 EntropyInputReseed = BF7DE29E99E7F0E1B9F96F3B1902FB4049C8C6234D20DE8316EBE66D977254578B7326621F6AFBD44A726DE48D03BCC5331F7306026C229EA9523497FBEAA88D AdditionalInput1 = 33B00B31623D6160C4C6740363A96481BE14B19BC47BE95641227284C366922A AdditionalInput2 = 2D812C8203575790AD6B6F2ED91A49D57460DE779A3E881BEF3BE12E8766DC91 Out = 5574E0B4EFC17E8CE136E592BEABFE32551072BDDD740929E698467B40B3991F028A22C760F7034853CC53007E3793E3C4A600D9E9D94528F8DC09AEBA86146CDDE2B7F71255AE0EFC529B49BE2205979DBA6525BFE155E8819E8E2AEEAA285704242DA90B4C4535101CC47D94B0E388A1B2E63AD0CBE158B9E1BBAE9CC0007C EntropyInput = 61F1471CED56AA04C57E1B512307D4CB92497D9592D7E9E35356E99D585CAB1B84714E960C403A4FAC06B2828CC564D9 EntropyInputReseed = 7BF97DB3C102EDC81596D4757045FE6BDC008F35792FC6290B77D889C09C33A85B8BDC41F76D98CFA71ED976EA3994706375C8841ADB8B6B3B6418E3132E8832 AdditionalInput1 = 94C8A8FDF38A6CCB8571C89420D899ADAB169214BB0DFCD43A04622E289935B2 AdditionalInput2 = 8A4B46E0A7A55907365F82D4AB9376509BD44728CAB8CBAFB0DA901012AD8DCD Out = 933EB159A6AF7455B60E40586C064F05F1970F564281B1EBC4662701AC1F299E4EB908C4AFCB2E065191281AB576F684AEFEDD6904BAD04D96BD93C0516C62A496C3073A0CDA0676A11CC08866B0CC74F62CB9D3DB48673B2C3FBEADA69F922B4B795CCBA22DF12EF7125909381F7D681F6B9CABA02FB913C5437B98C040C576 EntropyInput = A1D5BB7D70621DEE6B668B28C56D5610C2F8CED30284CC3E0E48DE331AF0506288A49E3E54C5EA54C98B95DE81BCC807 EntropyInputReseed = B4E2426E98F6EED97A6CDF690A89EE109E84C3DCA16C883C26FA4AC671638D8D5BD1E086ED228CFD8B55C1731FEA40C3A63D022599CA2DA4BB23118F4821BA62 AdditionalInput1 = B754B53AC226E8EBE47A3D31496EC822DE06FCA2E7EF5BF1DEC6C83D05368EC3 AdditionalInput2 = FA7E76B2805D90B3D89FFF545010D84F67AA3A2C9EB2BA232E75F4D53267DAC3 Out = DF6B2460688FA537DF3DDFE5575FCA5EB8ABAD56CBC4E5A618A2B4A7DAF6E215C3A497974C502F9D0EC35DE3FC2EA5D4F10DE9B2AEE66DCC7E7AE6357983095959B817F0383E3030771BD2ED97406ACF78A1A4A5F30FA0992289C9202E69E3EB1EABE227C11409FF430F6DFCA1A923A8B17BC4B87E908007F5E9759C41482B01 EntropyInput = 68F21D14525D56233C7E263482D344C388A840103A77FB20AC60CE463CABDC7959FA80AE570F3E0C60AC7E2578CEC3CB EntropyInputReseed = 7584B4166530442F06E241DD904F562167E2FDAE3247AB853A4A9D4884A5FA46F6A5482F139045C5389C9246D772C782C4EBF79C3A84B5CF779F458A69A52914 AdditionalInput1 = 9D37B1CE99F8079993DDF0BD54BAB218016685B22655A678CE4300105F3A45B7 AdditionalInput2 = 4C97C67026FF43C2EE730E7B2CE8CCE4794FD0588DEB16185FA6792DDD0D46DE Out = E5F8874BE0A8345AABF2F829A7C06BB40E60869508C2BDEF071D73692C0265F6A5BF9CA6CF47D75CBD9DF88B9CB236CDFCE37D2FD4913F177DBD41887DAE116EDFBDAD4FD6E4C1A51AAD9F9D6AFE7FCAFCED45A4913D742A7EC00FD6170D63A68F986D8C2357765E4D38835D3FEA301AFAB43A50BD9EDD2DEC6A979732B25292 EntropyInput = 7988146CBF9598D74CF88DC314AF6B25C3F7DE96AE9892FB0756318CEA01987E280BC1AE9BFDF8A73C2DF07B82A32C9C EntropyInputReseed = 2BBC607085232E5E12CCF7C0C19A5DC80E45EB4B3D4A147FE941FA6C13333474F3F5C1BB5DA59252861753C4980C23F72BE1732F899FDEA7183B5C024C858A12 AdditionalInput1 = 44D0CFC4F56AB38FA465A659151B3461B65B2462D1AD6B3463B5CF96AD9DC577 AdditionalInput2 = 34FB9A3CDACC834FF6241474C4F6E73ED6F5D9EA0337AB2B7468F01AD8A26E93 Out = 4CAEC9E760C4D468E47613FE50DE4A366AE20BA76793744A4E14433EA4DE79DC188601EB86C803B094641AB2337B99D459D37DECC7D27473057BE45BA848868EE0FB5F1CF303D2FCD0B3E0C36F65A65F81B3FEE8778A1F22302E25DFE34E6D587FA8864E621121880F7CD55F350531C4CE0530099EEC2D0059706DCD657708D9 EntropyInput = 1C974C953FA2A057C9FC9409A6843F6F839AA544BCA4FA11E48AFD77931D4656ED7C08285464AF7A5DBDC10B944A1270 EntropyInputReseed = 78146AD135ACB836360D36AFC50653DCC36C21662DA2A6F6AE05222E75F34000263C4984C238DED333C86472866353817379502157172CFA51371D82B1EFD7B5 AdditionalInput1 = 79B591529F9A26A0D7C8F8FD64E354B0C134EF1F757E43F9463B3DBB7A3DA1AB AdditionalInput2 = 7D8F7204B0B5401DDCE9E88DCF5FACB9A44660A9F5F1C862748E7269C29F7964 Out = 72E2CA257B9EDAF59B50E05A144F56FB517832FB9AD3489B1E664E3D5412CBF6B2883E891703B2E73AFF9AB56DA1009FCDEF010AB4CDAB996795C8F7C47FB1192BB160353997AD39D7D5FD0E2EFC9103A7C3F158246AFD53FE53CA6782F809698EF5F1F0D85536780A3FD6A8BAFA475891C09213088BD1A3DC169257C34A517A EntropyInput = 56216D71984A77154569122C777CE57E1D101A6025B28163A25971D39C1C5D0F5CD148BA7E54F4975AC8E3E0F9B5D06A EntropyInputReseed = 3580F8CA974626C77259C6E37383CB8150B4D0AB0B30E377BED0DC9D1FF1A1BF15633E3A62B21594D49D3D26C4C3509F96011D4DBB9D48BBBEA1B61C453F6ABE AdditionalInput1 = 6068EACA85C14165B101BB3E8C387C41D3F298918C7F3DA2A28786AB0738A6FC AdditionalInput2 = E34F92D2B6AEEEEA4FF49BFE7E4B1F462EABB853F0E86FBAE0E8B3D51409CE49 Out = 587FDB856ABC19EDE9078797ECB44099E07AADCD83ACDCB2B090601D653F4A14C68AB2EBDDA63578C5633A825BAE4C0C818F89AAC58D30FD7B0B5D459A0F3D86FCAD78F4BB14DFFF08AD81E4EA9F487CB426E91D6E80DFED436BA38FCE8D6F21CA2151C92DD5C323B077D6139C66395558F0537026C4A028AFFA271EF4E7EA23 EntropyInput = 83EB48BEDC1E9294866AB8E5322EF83F6F271F8188E8FDABE5817788BD31570DD6ED90BC692237F132441EDE857A6629 EntropyInputReseed = A4E5E127F992BD5CA79EE56BB8A9BCCF74C21814BFAF97FFD052211E802E12E484136E403D9ED7F4515C188213ABCFACA35715FA55DE6D734AEC63C4606A68F1 AdditionalInput1 = FE9D8EF26E2D2E94B99943148392B2B33A581B4B97A8D7A0ECD41660A61DD10B AdditionalInput2 = 594DAD642183CE2CDC9494D6BCB358E0E7B767C5A0FA33E456971B8754A9ABD5 Out = 86715D43BA95FBBCA9B7193EA977A820F4B61BA1B7E3B8D161B6C51B09DFD5040D94C04338B14D97ED25AF577186B36AE7251A486C8A2D24A35E84A95C89D669D49E307B4A368B72164135AC54D020A970A180DFBED135D2C86F01270846D5301BD73DB2C431A8AA10A0A3D03D146E5FAFB9A2AA0B4EFC80EDAB06FF3B532236 EntropyInput = BA2C94203DAB2E6499D8C50DCA7B5C34A6B4764834F9816631AA21B9F9C3736167DB133BDEFB25E395085BCEEE5A0AFC EntropyInputReseed = FA8984D16D35302CDA35A3A355AB9242EC96FEC0652D39282D4A0ABF0A80DF87B6FED10255A3FEA6772AE1AE6D9F6CBB9BFAA34804E58A5B786F9BC60B348CCD AdditionalInput1 = 445E072244EDC716D3528F0E0A20FF0CD8F819C0D031736C8DA122748F24D6C6 AdditionalInput2 = 1F856E403C4FA035BAC9AA81A20E347C7D8B213AAB699D69D9D6186A06AC45C1 Out = 79F33FC36B3B47D9AC805BDBBE699909A8D0BEB689A8B2723C291BD5BF7F3CE61343D4722A14E4ADD36312DBB0594910C8828AFF1ABC159915D498106F9FFB31147478D8C9EF75D1536BA5036506B313F6E85033F8F6FEA2A4DE817C867A59378C53C70A2F108275DAEDD415C05B61C4FD5D48C54BE9ADB9DEA6C40A2EC99EE0 EntropyInput = 0DB4C51492DB4FE973B4BB1C52A1E873B58FC6BB37A3A4BFC252B03B994495D1A2A3900F169BBA3F78A42526C700DE62 EntropyInputReseed = 29D5AAB356876447E3A20D81C7E3FC6975E2B984180A91493044442999E1CA3A40B34183B4E72CDFF5952B317B3D45943D0FDCFA0527F3563055F7C73AE8F892 AdditionalInput1 = DC94220C99FFB595C7C4D6DE8DE5A6BB4B38847169E24A557EF6D879AD84149D AdditionalInput2 = B2376626FD2F5218B3ED4A5609B43AA24D371CD2176EA017C2B99CF868060021 Out = F0BD6BC4C506D9427A09352D9C1970B146360732841A6323F4CB602C87DEDFB5FF7E6964B9144933AF3C5C83017CCD6A94BDCA467A504564AAA7B452591A16FF6A1E7E94DDC98F9A58016CDCB8CAAED6C80671BA48CC81A832D341093DDA1D4E5001EC6BF66348B21E3692A13DF92538AD572BB2023822072FC95F9590293FFC EntropyInput = 593845F0ADFEFFA7C169F8A610147AE8A08C0072FC0C14C3977D3DE0D00B55AF9E0EB2507342EE01C02BEADEE7D077BD EntropyInputReseed = AEFE591697EAB678C52E20013AA424B95CFD217B259757FBE17335563F5B5706CBB5BE0EF9BF0555EE58955C4D971FB9BAA6D6070C3F7244A4EB88B48F0793BF AdditionalInput1 = 6DD878394ABDC0402146BA07005327C55F4D821BFEBCA08D04E66824E3760AB4 AdditionalInput2 = BA86A691D6CBF452B1E2FD1DFB5D31EF9EA5B8BE92C4988DC5F560733B371F69 Out = 00735CBFAFAC5DF82E5CB28FC619B01E2BA9571DC0023D26F09C37FB37D0E809066165A97E532BF86FA7D148078E865FE1A09E27A6889BE1533B459CD9CD229494B5CF4D2ABF28C38180278D47281F13820276EC85EFFB8D45284EB9EEF5D179AB4880023AB2BD08EE3F766F990286BF32430C042F5521BBFD0C7EE09E2254D7 EntropyInput = FA0EE1FE39C7C390AA94159D0DE97564342B591777F3E5F6A4BA2AEA342EC840DD0820655CB2FFDB0DA9E9310A67C9E5F2E58FE60A3AFC59DAD37595415FFD318CCF69D67780F6FA0797DC9AA43E144C EntropyInputReseed = E0629B6D7975DDFA96A399648740E60F1F9557DC58B3D7415F9BA9D4DBB501F6 Out = F92D4CF99A535B20222A52A68DB04C5AF6F5FFC7B66A473A37A256BD8D298F9B4AA4AF7E8D181E02367903F93BDB744C6C2F3F3472626B40CE9BD6A70E7B8F93992A16A76FAB6B5F162568E08EE6C3E804AEFD952DDD3ACB791C50F2AD69E9A04028A06A9C01D3A62ACA2AAF6EFE69ED97A016213A2DD642B4886764072D9CBE EntropyInput = CFF72F345115376A57F4DB8A5C9F64053E7379171A5A1E81E82AAD3448D17D44D1E971EC795D098B3DAE14FFCBEECFD96EC0C798C240F22740CAD7E27B41F5E42DCCAF66DEF3B7F341C4D827294F83C9 EntropyInputReseed = 45EC80F0C00CAD0FF0B7616D2A930AF3F5CF23CD61BE7FBF7C65BE0031E93E38 Out = 17A7901E2550DE088F472518D377CC4CC6979F4A64F4975C74344215E4807A1234EEFEF99F64CB8ABC3FB86209F6FC7DDD03E94F83746C5ABE5360CDDE4F2525CCF7167E6F0BEFAE05B38FD6089A2AB83719874CE8F670480D5F3ED9BF40538A15AAAD112DB1618A58B10687B68875F00F139A72BDF043F736E4A320C06EFD2C EntropyInput = B7099B06FC7A8A74C58219729DB6B0F780D7B4FA307BC3D3F9F22BFB763596A3B8772059A135A6B61DA72F375411DE262AC1BFB24E0B8C6AC2803E89261822B7F72A0320DF2B199171B79BCBDB40B719 EntropyInputReseed = 9AEC4F56EC5E96FBD96048B9A63AC8D047AEDBBEEA7712E241133B1A357ECFC4 Out = 0E1F2BFEF778F5E5BE671ECB4971624EC784ED2732ABC4FBB98A8B482FB68737DF91FD15ACFAD2951403AC77C5CA3EDFFC1E03398AE6CF6AC24A91678DB5C7290ABC3FA001AA02D50399326F85D2B8942199A1575F6746364740A5910552C639804D7530C0D41339345A58FF0080ECCF1711895192A3817A8DC3F00F28CC10CC EntropyInput = 7BA02A734C8744B15EF8B4074FE639B32E4431762AB5B7CD4D5DF675EA90672B8A424F32108607C8F1F45D97F500EE123AD627433F465187C48141E30C2678106091E7A680229A534B851B8D46FEB957 EntropyInputReseed = D8F02B59B6A3DD276BC69CBA68EFCF11AB83EAD1397AFD9841786BD1BB5DA97A Out = 1FB91186BA4B4459D994B4B9F4CA252C7BE6294D6CDB5FE56F8FF784D4B190A1C6456E0A41223BBBDF83ED8E7CFBFA765D9D8BC7EA5F4D79EA7ECCB4928081A21DE4CCA36620D6267F55D9A352B76FC0A57375884112C31F65FF28E76D315698C29E6C4C05CB58B0A07AE66143B4ABC78B9D25C78B4121E1E45BEF1A6C1793E2 EntropyInput = 9A8865DFE053AE77CB6A9365B88F34EEC17EA5CBFB0B1F04D1459E7FA9C4F3CB180C0A74DA3EC464DF11FAC172D1C632336372EC82D0D68BEFAD83691966EF6FFC65105388EB2D6EED826C2285037C77 EntropyInputReseed = 75B95108EFF1FABE83613E1C4DE575E72A5CDC4BB9311DD006F971A052386692 Out = 3C683F6D4F8F5A4018D01633DFEE74266AAA68ED6FC649E81B64DFDF5F75E75D5C058D66CF5FD01A4F143A6FF695517A4A43BD3ADFD1FB2C28BA9A41063140BEDBFFDB4D21B1ACE1550D59209EC61F1E2DBACB2A9116A79CB1410BF2DECA5218080AACD9C68E1D6557721A8913E23F617E30F2E594F61267D5ED81464EE730B2 EntropyInput = 22C1AF2F2A4C885F06988567DA9FC90F34F80F6DD5101C281BEEF497A6A1B2F83FAFDECF79A4174801F133131629037B80327DAC486111B8A8B2C8E8381FB2D713A67695C2E660B2B0D4AF696CC3E1DE EntropyInputReseed = F95A0E4BD24F0E2E9E444F511B7632868EAD0D5BB3846771264E03F8AB8ED074 Out = 77A7FEA2F35A188F6D1BFDD49B569D8C45E2DD431D35A18C6F432C724F1E33AE92CB89A9CF91519E50705A53199F5B572DC85C1AEF8F28FB52DC7986228F66954D54EDA84A86962CF25CF765BD9949876349291B1AAE5F88FCF4B376912D205ADD4F53B2770C657946C0D824281F441509153F48356D9D43F8A927E0693DB8FC EntropyInput = D0840E3A8D629D5B883D33E053A341B21C674E67E1999F068C497ECFAABFD6F6071DE7244ECB2FDF7AB27F2D84AA7B7A90D609527FAD96FFE64AB153860346F3D237C8940555AE17B47842D82D3B0943 EntropyInputReseed = 1DD1A8B59856C49A388F594C5F42CC2E4A56B3CCB8A65E7066E44C12F4344D50 Out = 7AB28A9B2D3AE999195553E6550CCED4C2DACCBE7EC9DCBB0D467FABBA185B727FBFD9830242CD098F4DB3CF4A85E8BF8E8D5974B62B28550922B32ED5BFC1A522B6605CF93BF8D90BDEC1C5B9E59C6FC37A817D437068A87254BE1F7C4618ADA46FBC3A2EFB02E44524E21D91BE7534CF05FBFD858304B706D6A91EA1CC6AD5 EntropyInput = 2E2DD56869104492767A59778652831919E1C8B970F84E824AE4116597A0AB7F01C42A7E983641DE46C82FD09B4F2F76BCD9E1508FCC22820A8BE07180FEA5045367333B569E111B011CD57DC1858765 EntropyInputReseed = 7306507CD3CA7EEC667E640D270CFBB033063D97520B6B7E38FF3CEA0E79D12B Out = B915726C7B8C5DC3975F1A334684B973ABF6A9495D930088CF5D071548E4FD29A67B55CC561ED6949AD28150A9FB4307C1FA5F783A7EA872E8D7C7E67FF0C2906081EE915737D813C25BE5C30B952A36F393E6BAA56AB01ADC2B4776AD7B5D036A53659877C7A4E5220A897D6C0799AF37BEEED91173FBE9C613C3B6B9BB28E5 EntropyInput = D1AAB0F16BD47A5CCD67C22E094DAA3735EAE21AA57F0BCD9E053D9D0D545CB8199310DFE1B01265B8C0D2B46D6C7C9F625B4B8F4DE72EA9CB6F70556322DC2A19D6B2B32DE623F557E419A084BA60FD EntropyInputReseed = F50CABAE4E060F3971096B78E550CDA2837A26A693D905DB2D992D589B268F44 Out = 987E1FDFE004C619CF1E9034576707ECCD849400E19C87A1FEF5B0179EC51C42A2F8C45D7942D0023A023C89F188B2634362703985695369863322F58619C50A7385A2DC91FC78F94B59F0131DC2B56A0D7C699D427285DA1C104B0AD1739DA10D8071C23993787045DC21F0070E1E9AA1658FC8E3ADD73DAC7262E80E0AA2EE EntropyInput = 449480EAA100AFF6F48DC6286A5A81B9728B084864F78A9DA98F606A00A6A41FE53C6C5AC3DA9F4726389A03F97BB6406B8FEDC084D8E28D333AEF6DB3702B6351F0D24E30908CCCB63794282655886B EntropyInputReseed = 73A6D64E1966AE324388DC12C14544E9DC5AE4FCB331E99D350C456FF16F9AA0 Out = A06912D362DA7EB25598857F6D65344C3E23EC3DEB80C6E43158845B95EAECA241C0BBBD67AC385E24693444455CC1C2C08C1134D956B8BC93B28BE9C2D3322B3E09252979DFB8D39D04C94F81BEBDA5C73110605A237B561216BDA9EE9BDEE1CC0C7728BCC8304682334CA944E467A27A85313FA5395A9C790E35DEFD2EDB12 EntropyInput = 9A6174166E97AA4981DDF580BC01C96754B9F0BA042750AABFDA1CFFE56E8581D7512FF6B7DB7CE141B2BB01DCD0425EED75288F23275F9422444DA5D3B53CCB3C4AC8ACFB659A1E9B7655C2DB52F879 EntropyInputReseed = 6888B9277E57DC57663D402EBA8D03CF56A070DC868E6A128B18040002BAF690 Out = 03519DFB2FF88CC2B53EECC48AE2A18DDCF91A5D69D5AEFCDDA8444E6DF790A5240E67B2A4DE75B4BB8A31F0F8AEB5E785FFB7A1341BB52FE00A05EE66FA2D44EA9956E055F9FFA6647C3BFE851AB364ADE71A0D356DE710DDAFB7622B1DA1BC53FD4D3210407289C68D8AEB346BF15806DBE787E781B94F63DA3E1F61B5AC60 EntropyInput = 9C6AE1002EE1B0ADD0BE563CE50F899DA936E13EFA620D08C2688C192514763AFDE7DB5160C73044BE73E9D4C1B22D868FDAAEFFD64E53F7B4374D902D441209964E12B65D29AFEC258E65DB6DE167CA EntropyInputReseed = BCC28FD58E397F53F494AD8132DF82C5D8C4C22EA0B7139BD81EEBA65667BB69 Out = 021D938C9B4DB780C7D8134AEFF1053E5B8843370B8AE9A6749FCA7199D809810F1BC8DFA49426470C30C3616F903E35FBACB23420A32F1BEE567CC32300F704246DDC0217F236EF52C3EC9E2433CA66F05C25721F7661C43F22C1A125ED5DB531BD0836EB435C27EEFC7424CE9D845E1D4CC4C503097B4FFCA788E674A5CB53 EntropyInput = FE96A85B69D46B540918927BB609DC57642EEAEFD46BB5DA2163A0BC60294B5822195A410D24DB45589448DFE979D3FD20F698833A4472FD7B78FB9B0C4EB68604F166A2694C4AF48DAC2B2376790E1E EntropyInputReseed = 09CB870879D3F734214F6A4BD2E08C62A2A954BEBE559416D8C3551AAFE71D6A Out = D3E96DBE29E1FCB8ED83B19DBFB240E6F41679FBE83853AA71446617E63E5AF78CF98B331D15BCCB8C673C4E5D5DCEC467A1FE26A6CD1696D0C9BC49F78139D051287DF7F3AE0DBB4BBF581CB8211931063C3F4612CED53F59D1B4EBB875729139F5D2A7D60642E8F2835EED888B7E3E49C0DFFD012CD746ABFA3E1C5C2308C6 EntropyInput = A4FD693FF0A8AF24BCEC352D3196549FD0DA5EE5D99CA58416CA03CE4C50F38E8CD67F2BF71D4366CE61396642531FF5368969C15A4849D7593BE8B162113B9298A535C148FF668A9E8B147FB3AF4EBA EntropyInputReseed = 83D2BE9A0D74E6A42159AE630ACEBF4E15271EF7F14F3DE14752BE0E0E822B11 Out = E9188FC0EAEC74B2608E21E3A40BE94AAF4AE08EB684DE8F8BBA2D5FD3B073AA5531C938C0FC628DA65725C54B5C68BB91D7D326565E96685E0A4E7B220C50E0CAF1628EDBA5BD755B31894F8CB90AFA76E88C5EB9E61B4932444C1397DEE3E32241A3FB70A3929E49F6DA02EEA54812ABB3D6B5CEE18F03AF1E0B4958430AB3 EntropyInput = 254FF5687A6DAD3F1D237DC762F58D24EF2E2C084D0A48D26A3DC81E5490CDA3F2EC392ACCA491E03CE47B95963A49FCF806B9B4A56682C61B55CB6A334CAF87FFE135ADFEA6D0C3FC22B39898FBD078 EntropyInputReseed = B8494B1C1F1752FB6F80D732A89B08115857F7CC96E7DFF05EBB822706889917 Out = 0E527E00494D55564F9D9B28E7110F9A61CE36C883B5BE2DCB055444164CDDDD1A9F2731716F22D6FF476CE413C77ABFC0E946871D5481345C2E97B4BFDD12AC03DF606FC56BDB99AC7B71A69B5B9160373BBEC3E9DDE477180AF454E7ACC6BC58DC0AFB4281C0DE4354C1BF599054E3800C6D60D892858865B5361F50BFCA9B EntropyInput = CDB0D9117CC6DBC9EF9DCB06A97579841D72DC18B2D46A1CB61E314012BDF416D0C0D01D156016D0EB6B7E9C7C3C8DA86F0FB9EAB3F9EA7AB0A719BFA879BF0AAED683307FDA0C6D73CE018B6E34FAAA EntropyInputReseed = 8EC6F7D5A8E2E88F43986F70B86E050D07C84B931BCF18E601C5A3EEE3064C821AB4CA9014FA98A55938316DE8BA5A68C629B0741BDD058C4D70C91CDA5099B3 AdditionalInput1 = 16E2D0721B58D839A122852ABD3BF2C942A31C84D82FCA74211871880D7162FF AdditionalInput2 = 53686F042A7B087D5D2ECA0D2A96DE131F275ED7151189F7CA52DEAA78B79FB2 Out = DDA04A2CA7B8147AF1548F5D086591CA4FD951A345CE52B3CD49D47E84AA31A183E31FBC42A1FF1D95AFEC7143C8008C97BC2A9C091DF0A763848391F68CB4A366AD89857AC725A53B303DDEA767BE8DC5F605B1B95F6D24C9F06BE65A973A089320B3CC42569DCFD4B92B62A993785B0301B3FC452445656FCE22664827B88F EntropyInput = 3E42348BF76C0559CCE9A44704308C85D9C205B676AF0AC6BA377A5DA12D32449AF783973C632A490F03DBB4B4852B1E2E51C7A8AC70ADC37FC7E40D59A8E5BF8DFD8F7B027C77E6EC648BD0C41A78DE EntropyInputReseed = 45718AC567FD2660B91C8F5F1F8F186C58C6284B6968EADC9810B7BEECA148A163A107246A2070739AA4BED6746439D8C2CE678A54FC887C5ABA29C502DA7BA9 AdditionalInput1 = E4576291B1CDE51C5044FDC5375624CEBF63333C58C7457CA7490DA037A9556E AdditionalInput2 = B5A3FBD57784B15FD875E0B0C5E59EC5F089829FAC51620AA998FFF003534D6F Out = C624D26087FFB8F39836C067BA37217F1977C47172D5DCB7D40193A1CFE20158B774558CBEE8EB6F9C62D629E1BCF70A1439E46C5709BA4C94A006BA94994796E10660D6CB1E150A243F7BA5D35C8572FD96F43C08490131797E86D3ED8467B692F92F668631B1D32862C3DC43BFBA686FE72FDD947DB2792463E920522EB4BC EntropyInput = B63FDD83C674699BA473FAAB9C358434771C5FA0348CA0FAF7EBD7CF5891826B5FD204E2598D9626EDAB4158A8CFD95F2A5DFAD8494306D9D4648A805C4602216A746AE3493492693A50A86D1BA05C64 EntropyInputReseed = ADEA5BA92F8010BB1A6A4B6FAE2CAA0B384165ADF721253AFD635D6021F764AF07C69D8D2B8AA1454C5C48083DD41477FDA6BFCF0385638379933A60ED2E0A77 AdditionalInput1 = A14E902247A3D6493D3FBC8519518B71A660E5502CF7ECFC796CFAA5B4EE4BAA AdditionalInput2 = 60E690E4A1EBA14AEC5187112A383E9991347FAB7BAC7CB2A40A52579A0D2718 Out = 792B47B6ED221623BB187D63E3F039C6983D94EFD5771DC9B4C40BEE65924513485A6332BAEDA6A96F9BB431F592D73462B61D9D914A72B56FA9D87597426FB246424EBCD7ABD51B2EEFEC8F5B839C0B3C34015342ACE296B5F2218FA194B50AEA1C89663460292C92C45F112DDBF6B9406F6E7CCEE9C47ED2D90A27BE5DD73E EntropyInput = DAB85F98EAF0CFBA013B97DE4D9C264CA6FE120366CB83E8B3113C68B34E39D5D05108E1028AE67B4EA63BDC6D75EB8809FED3822F6F5E5B9E575D31DC215DE1607B0DFC927412618C2D8F79166DBABA EntropyInputReseed = 1794885A64470744198B7D0BC24472FFE8DAF3C7EB219DF6DDF180E484FE0AA58D74D01B582F70B92F53B43468084E1586D9B36465D333D5FAAF6911E62FE40E AdditionalInput1 = EF7F6B6EB479AB05B3F9AB6DD72EAC8B1E86D887F1BCAE363CAE386D0275A06F AdditionalInput2 = 7442B2A792A6A29559BB8A515D56916EE18200580AA02E1237DD358619382D8F Out = 49D2CBFA0897B7D961C293C1E572FB26F28E7B956E746F6EDA90454C1370A29E25303CEADC7837514DC638553B487EF9487C977C10625409178AD6506D103C487A66655D08659D92A4D5994D1C8DDB28FE60F2E49577D6E80CAE1478068C98268F45E6293C9326C7F726EC89601351C0A26FD3A6549F8A41C6F58692C86594C0 EntropyInput = 0F0AA84EF12E10AE2B279E799C683441862457B9BC25581C2CD3D5B58A5B3246F74F4230C2427A52F01F39E825D250ACD02B2F53DA48B923C2921E0F75BD7E6139D7030AEAD5AEEBE46C20B9CA47A38A EntropyInputReseed = 5222B26E79F7C3B7066D581185B1A1F6376796F3D67F59D025DD2A7B1886D258D11512457BF3B92D1B1C0923989911F58F74E136B1436F00BAD440DD1D6F1209 AdditionalInput1 = 54D9EA7D40B7255EF3D0AB16EA9FDF29B9A281920962B5C72D97B0E371B9D816 AdditionalInput2 = 601CEF261DA8864F1E30196C827143E4C363D3FA865B808E9450B13E251D47FA Out = E9847CEFEA3B88062EA63F92DC9E96767CE9202A6E049C98DC1DCBC6D707687BD0E98ED2CC215780C454936292E44A7C6856D664581220B8C8CA1D413A2B81120380BFD0DA5FF2BF737B602727709523745C2CED8DAEF6F47D1E93EF9BC141A135674CBA23045E1F99AA78F8CEAD12EEFFFF20DE2008878B1F806A2652DB565A EntropyInput = 6A868CE39A3ADCD189BD704348BA732936628F083DE8208640DBD42731447D4EEFDDE4E22B376E5E7385E79024350699F7285CD5647FF0E2C71A9B54B57F04392641A4BDE4A4024FA11C859FECAAD713 EntropyInputReseed = 0174F7F456AC06C1D789FACC071701F8B60E9ACCEBCED73A634A6AD0E1A697D45463BB2241D10C970B68C3ABC356C0FE5EF87439FC6457C5EE94BE0A3FB89834 AdditionalInput1 = 3AB62CDBC638C1B2B50533D28F31B1758C3B8435FE24BB6D4740005A73E54CE6 AdditionalInput2 = 2DBF4C9123E97177969139F5D06466C272F60D067FEFADF326CCC47971115469 Out = 8AFCE49DCCC4FF64C65A83D8C0638BD8E3B7C13C52C3C59D110A8198753E96DA512C7E03AEED30918706F3AD3B819E6571CFA87369C179FB9C9BBC88110BAA490032A9D41F9931434E80C40AE0051400B7498810D769FB42DDDBC7AA19BDF79603172EFE9C0F5D1A65372B463A31178CBAE581FA287F39C4FBF8434051B7419F EntropyInput = BB6B339EAE26072487084EC9E4B53F2F1D4267D205042E74C77FB9CA0591BA50C0E7BF6EB07FECCBC494AF4098E59D3034AEEC7ED0CAE83701B6477709C8654A1114212401DC91CBE7DE39D71F0C06E1 EntropyInputReseed = F47FC60AFBEB807236F7974D837335BC0B22288EF09DDFCB684E16B4C36A050BE8071CCD84AC4527E5C6E85B0709ED867776F25AE0E04180DCB7105ECD3E3490 AdditionalInput1 = FBAC45B5952200AD7C4232500F2417A1C14723BDD1CC078821BC2FE138B86597 AdditionalInput2 = C4292D7DBEF3BA7C18BF46BCF26776ADD22AB8EE206D6C722665DEC6576B1BC0 Out = 228AA2A314FCBFE63089CE953AC457093DEAA39DD9CE2A4ECE56A6028A476A98129BE516D6979EFF5587C032CDF4739D7AC712970F600FA781A8E542E399661183E34E4B90C59EC5DC5CAD86F91083529D41C77B8F36C5A8E28BA1A548223A02EAED8426F6FE9F349EBEC11BC743E767482E3472EC2799C1F530EBDC6C03BC4B EntropyInput = BE658E56F80436039E2A9C0A62952DD7D70842244B5AB10F3B8A87D36104E62933C9627455DFDE91865AEE93E5071147D3A6EB29B180B791984DEB056D72C0608A2C9044237AECF100CCB03700064C5E EntropyInputReseed = BEF24DC9A5AA23003D3825F9B2B00E7DAB571EA6AD86415DBD30C0BBDCE7B972047C29E4D1584FA70CB66E2AA148A2AA29837C5EEE64DCAC60FDBA356CDF90BB AdditionalInput1 = 41C4792161B1B00D410CB79CD56BD311A714FB78DC3471C25BDD7479F2E9A952 AdditionalInput2 = CD4936D7BC3EA0E7201BCBEFBC908215A97680CA6CE8672360AEA600B6564308 Out = 2C25557F6DB07DB057F56AD5B6DC0427D1A0E825C48C19A526F9A65087C6D1EAD7C78363A61616C84F1022653AF65173A3F9EC3275F2B0A0D0BC750194673C0EAA6C623CD88ABB0C8979BAEE4CD85BFCE2E4A20BFEBF2C3BE61676563767DFE229E0B7BE67AD6FCD116DD0B460708B1B0E5C3D60F3DD8138030404D197375D75 EntropyInput = AE537F31A28CA14500E759716BC207983BFEAB60B25079FA30B77B8D41244CB9FCA9E27D8AB84CF9B9CE491EC5D8CB678C9CB2B19AA3ABE83C8FE7DA96E9C11648252653A29DCD5BF0AC334AC587F032 EntropyInputReseed = 1EB52777BE480F05115AE6370F30159A94D50FFCC64454678AB1D1AC6F166FA79CDF6F1A2BC07ACD4B0F43B5F2B892A1153E2669F237D257923636094FB40B54 AdditionalInput1 = 692D512722DE6BA720FD23C8994AC63179B5F7E611ADDF9CFACD60E06E144A6A AdditionalInput2 = BBEEA7B2BEA821F339F494947C0B4BAE8056119DB69A3CBEF21914953729CDEF Out = C0C4FB7080C0FBE425C1B756FB3A090CB0D08C7027D1BB82ED3B07613E2A757F83A78D42F9D8653954B489F800A5E058EBC4F5A1747526541D8448CB72E2232DB20569DC96342C36672C4BE625B363B4587F44557E58CEDB4597CB57D006FDA27E027818AE89E15B4C6382B9E7A4453290EA43163B4F9CAE38B1023DE6A47F7B EntropyInput = 2F8994C949E08862DB0204008F55D3561F3E0362DF13B9D9A70FDA39938F2D331BF3E94EA858160B832FE85D301256F5B46671CF7FA142E7012ED261E1FE86714711C246C7D1C0330FA692141E86D5D1 EntropyInputReseed = 5ECDB1E8FE12260B9BFE12D6E6F161474FA2311E12E39B0BEB0FCD92A6737B733CE9A29F0207D079E6DC81FB830356E555F96A23EA71424972EA9308965786D3 AdditionalInput1 = DB950000C0776CC0E049929CE021020ADC42D29CD9B5D8F7117FBE6BDE3E594F AdditionalInput2 = FC18EE6DD3DAC2306774F0AC36CD789E33462D72A8C75DF9057123DB33E5F7BC Out = 8546362CC8AF9B78DD6E8EB2C37DB96E70708852BFD9380ABEDC7F324575A167BEA18F632F3E19D099CFBF310773F9719EEC036D2E09F393A023ADD8EBDC4FB87AF43B2FE6C7EAA4D39F8022CE247AA45FDC84D1B92CACCE6EAE8252A03EC2EC5330C01F56D113FD2EC3D0240AF0AFCF13DDDE205BB5E7C2D912DCB4AEE5DCF3 EntropyInput = 0C85E31487DE1D7BA4A7B998AC56DC42C6DC0EAE7BF5C8AAF1E4E78875F5FB47DE878F728F73F83DC2A2F550B96C8B979AAC37BCE1A6A81DC7934E23747991E3CF48C55FFE5A57781C41768A35220A01 EntropyInputReseed = 2D5CA8AF1A70CFDCCD015EE3BF0665DD1941FC6A7317B9D0D06658F5744CFBD9DB881E6D0DC3B62793D7DA5FE5A18E33BE9B93F4A63A00A878DFBECF0D383BD2 AdditionalInput1 = F743CE1B72F3DE4C901369EED581C626ED3081CA707E6634FDAFF46721CE0878 AdditionalInput2 = CD52DA3EC8A839C537DACDEA8506A3EEEE879DE388FF5E513322D6D1BB3FF694 Out = A5BDD57CB8FDE6298E7C5E563AFCCA60DD472ECA484BD8C3CC17F3307BE09B601744DD3AB9E8A44107C5868824575F850C0F399B280CF198006F83EDE8C0B537E9BE227FA140B65995AD9DFA1F2303D560C3B7F59BEDD93C1282EA263924469411C2653F87FD814C74CB91C148430481D64BAD0FEC3CBB3DD1F39AA55C36F81B EntropyInput = 93161B2DC08CB0FD50171141C865A841CA935CFDD2B5907D6FF8AB0348C4CEB05CB9F6E5912B90C3349A50AB881B35A10DCEB4A36326C4DF1685DF43FDDEECB5D0C76F00EB44826694F27E610290F6E1 EntropyInputReseed = D8E9BE44B5F293482548D4787762EBFB03C73C40E45385E8B98907CD66F493DD105A8F85D6959F3E043EF508CFEA21D52123F03B7AEA8034C4EEC761EABA1FEE AdditionalInput1 = BF781F7E489D9B4B5AA5EE6D1796468AF672A8D25F311EDF3C4B4DBF433D703F AdditionalInput2 = C81D6BCF1E5BF37E39DDA1735C6F193DF115B1A854A12E7CAFE060AFE4589335 Out = 4306628124D0100FADE7EAAF5EDF227D50771F9E5F2E1E983800EEF9A39FDE0B0C280E63C8728D836B5B93EA794A32C1C04CFC54BD5300E3FEBB5FE2E1023EDED8D7CD180279A598F76823E8D5A7DFFCC93A09DEEC5D1F80838E938FBA4DE9F47E94B99382AE55F116DF9C3B3DDF7E50516E203645852A415796F03A86418107 EntropyInput = 1AE12A5E4E9A4A5BFA79DA30A9E6C62FFC639572EF1254194D129A16EB53C7165399B3481FDF24D373222267790A0FEC8280CFDCD7A575816E0199E115DA0EA77CAE9D30B49C891A6C225E9037BA67E2 EntropyInputReseed = 681554FF702658122E91BA017450CFDFC8E3F4911153F7BCC428403E9C7B9D68226732B7A457CF0AC0EF09FD4F81296573B49A68DE5E7AC3070E148C95E8E323 AdditionalInput1 = 45942B5E9A1A128E85E12C34596374DDC85FD7502E5633C7390FC6E6F1E5EF56 AdditionalInput2 = 6FC59929B41E77072886AFF45F737B449B105ED7EACBD74C7CBFEDF533DBEAA1 Out = B7547332E1509663FCFEA2128F7F3A3DF484CD8DF034B00199157D35D61E35F1A9D481C7D2E81305616D70FC371EE459B0B2267D627E928590EDCAC3231898B24EF378AA9C3D381619F665379BE76C7C1BD535505C563DB3725F034786E35BDD90429305FD71D7BF680E8CDD6D4C348D97078F5CF5E89DEE2DC410FAD4F2A30F EntropyInput = 29E20D724DFA459960DF21C6EC76B1E6CABD23A9E9456D6C591D7E4529DA0EF895DF1F837EBA47A1687AA5C4DDCF8AAF3713B601E164B1A51DDA1CA9242FF477514648E90D311A06E10CE5AA15DA5D7F EntropyInputReseed = 2A2A312626CA3E20034FC4F28033C7D573F66EF61AB2EA0C7BF0411A9D247264EC68BE33AC8FF3DD127E051604898C0F9A501271859376653A0516336180993D AdditionalInput1 = 9935499661D699A00C622A875441B4DF5204958FE95892C8CE67F7DFB2BE3E4A AdditionalInput2 = 256A4BA9E8F439D5487FA5EB45EFCF1BC1120491724DB3ABE328D951F2739FC9 Out = 73114CB3624D687D4CD49A6E769DFC7A3F8901DC41F6AD1DF4CE480536FA82E52AE958D0528640D92B8BB981B755058E32C4733682E5C4C0DF41F3505A1643A0DD49CFDEAF7A18ADFFCA88256C6D2CCEB838AF6C92A64BC21CB7A760A0391291BFE3575E014FC156323F8EB5E86518C669DAD8D29AD5FD4EF6E296F4A0764C26 EntropyInput = 1353F3543EB1134980E061FC4382394975DBC74F1F1EA5ECC02780A813AC5EE6CF584DB2447AFBE2C8FA0C15575EE391345B0CC016F2765A8C33FC24F1DCFA182CBE29D7EACBCDC9BCDA988521458FC2 EntropyInputReseed = BA60219332A67B95D90EC9DE6B8453D4C8AF991AE9277461FF3AF1B92FC985D36964B9B9842AEC9C7EC2AAD926D701F30EEC76FE699265AE2A7765D716958069 AdditionalInput1 = 6A03C28A9365C558C33D3FDC7E5EBF0B4D32CAAC70DF71403FD70CED09757528 AdditionalInput2 = A58546C72A0B4D47C9BD6C19E7CF4AB73B2D7BA36C6C6DC08606F608795EBD29 Out = 5B029EF68B6799868B04DC28DBEA26BC2FA9FCC8C2B2795AAFEED0127B7297FA19A4EF2BA60C42FF8259D5A759F92BD90FDFB27145E82D798BB3AB7FD60BFAEFB7AEFB116CA2A4FA8B01D96A03C47C8D987FDD33C460E560B138891278313BB619D0C3C6F9D7C5A37E88FCE83E94943705C6FF68E00484E74AD4097B0C9E5F10 EntropyInput = FF0CDD555C60464760B289B7BC1F811A41FFF72DE59083858C020A1053BDC74A7BC099285AD5621993B639C4A94C376B EntropyInputReseed = 14FC6C9B178DB644A8CD7130A4CF051678C8F4FA8F24C27B0A531338A5CE8589 Out = 2F2620347BDDCAA2943685346BBF31C44081F8665F3DDB2B42AE1416A74C4B77FAB3FA19AEECC547E76C8CBE6AD1F100A3FC8B2CE2A1EA3A3DD7CFAD46C1B27830B940BA18D09E9B7FA902BB760669B1735CC7B7BD39052DA7F2626FA87000CFFADA410019D053386AD808BD3C0CFCF56B91879EB8D3F932EE2D185E54F31B74 EntropyInput = F61B9A293D18952C7465A511382C031B860BCC8586A7EC99D7523EAD8ACAD0CBE332A10E88F00D951DDFD4C7B0B59658 EntropyInputReseed = 10F23AFEBE726093DE8170036A9F694E8084C09C6E620E98BB45F16EE56031CE Out = D34384893EF4CB3E42386A42EFBDCE467CD411A76E6A32E1D634A5A3670A95973985851B5F369A1BE65ADD3ED61F7C6A11986485B7E16B57263EED71FFC5A89756CB42B7BDFDF92B2E31C36B4D7B7CBD2E650CCBD6C0B5DFC95CD8937EF1E8EBC71A04CF33C398F7F9086F0BAE57EE9AF8F93F3B8EC1C9816917F699D8F43272 EntropyInput = 1B6B52B7BA19C26E62BD0AC9B233BCF004BBC9FD9E1E737CCF884A760829CD10D381C8BE203274F1766918B45E08DDC6 EntropyInputReseed = 2F504EB29F8EC0704F070B59C02076F4A4E5C8E7B64568B22C5FF5BAE196D5EB Out = A41500FC54CCF549FE21B3693428E03CCDFFBF42FF790D47DFF34FD88FCE01AFD49A26D300AD66A34CD3D1AEC73DD002DC83C1B86C432D721766FB90366130A3A28888A63A5D0B8BEFA895611C25BFA8817536EB0B20B9982C7D976F4707563B16B49CCBD435CF049B6A6E11DF12E5FAF0D20FC9DEAB395AC69303601BA31FE3 EntropyInput = 36367FA973AA4E2EC7BCEF339900DD959416BD63E746AA3C14A9B66E838FC780FBA07124E6D57F3C81BA596D256E433C EntropyInputReseed = F30BD11A1F2BC97DD8D4829F75D59D5577E726825E2364D204E9077DF48F65A9 Out = 6A5BDFDF37319C2E6BD2BC44938455E03A2E830B23EE8EBD6F982FF838B499D6D37B44EF0A5941BA42FE0245E64B28EE1A2FA3E8D22469CEB4C6F675629C3C6ABF61AAB6B1E887C8CF6644803F5D5116BE11FF42698D42AC3686807036F51AF4AE344A365E8AD8EBC3A623DE1BCC68E064D9FA82B6C80FB0570060BC58E87EBD EntropyInput = 2485CFC615D7FAB60F4657E470C8121EDD6BC1FA2247B205CE4040EE13C36F17087E6B4BF1E775A4C9F182DF61801343 EntropyInputReseed = 9AEE0EBED8DAF703360AA1FA2E17FAC6B7945AC45CDAAACBCC9FCE22D28C0D1D Out = CA4E2C4B63BB7F08438B825CDEB6A883A2CAF30DDBCCEB05C91D37C05676F63CC4DE0BD680A821A995564ECD12E54FC056A39E4EC5FE3373B4D6620402B6A537762F95A2D4909581C8985DF801C72F3223BD946796AC71DC8FC1B2838EA5AA68644908CC74CD8184861B8894E074922E85A5E258FB6ED3EC10E3FFE240B6738C EntropyInput = D109E755A725C9648D3371FFBF2CE08045D17175BB1E777AAA73FC6F9EC2ACF6C142F6E04DC887D02D57B1C27C1C77AE EntropyInputReseed = 091FD9E5B5B7415F873F2CB1E554EABDD91F96B684C10CD0024FB32E481D4CB0 Out = 1D6FD50A843869BB8A9B83CCB4D100AF18EEFCBDCB98AFA273737C687B50402273B9886CA1320ECA2C558ED264A42E02E1A7DCBCA267A385DC70D6E15AC4276A6AD59107D63B2D077391EEE762D9FBE22946C7D6E37578D4DDCCFAE9789628A60537A3933CF7CFCB1271A29215991BD341DFF39B2C9B6C243A03DDDE0B73FFB1 EntropyInput = 8BC47B94D06919A17B23FCCBD4D23494BE2587E0B5D2B82395593DD42A2837A5BF4D19FDFAF2D5EE48391195828ACBED EntropyInputReseed = 08190CB31D8F20E8DF5E5A648EDA896368FF3BAE1B60F7CA1C93F8BCDCDFBDCB Out = 6105197B7FD3A3121727899550144F8B9F03CF9B1A570E972AD23F0EA714DB424A0BDCBA045B6AEB1237C7ABE90BCF843D4253B375724953C3F726A9AD8B25BA913E4DB374185AF93637F3DCDF973B986723F590EE766916052C5EAA419151F09D12410E48284AC8EE87F25ED9671B235CD7ACAA440AD4B6ADA864ED62FB9823 EntropyInput = 8B95ECFE9FD090A09210172B4CC199EF1BFA73EDDDE50D3D4147C75B6E0E76EB130C18AEC9415A2A54D6CFA433440833 EntropyInputReseed = 825F0B1DD1A1570FB710231512CC288681FCBA15A0A45CEF45AA1F2682CF37F8 Out = 5EECA51C5A058F08BCDCF83C1D9044B5203B77B536F86623153E67F05F3ADB28EEB8925B6107D7A8ACCA778BC4526EF1CFF5AC5FDD0239522FA175D3E065D78C19A6DABA56E20B284B433EA81CBAE8139CA79445B887749949DAE8B9F03E559FCF5F710722831EFA92ADE0CD0CAB5C343DFD4BCDD8D6BCEFBAF0531A8DED693C EntropyInput = E8436E8622EA345DCB9431640AFF328C21BE838321DAF089510D27AA4D3D640CD69AE9DAE216AE6CF36F48CF3F97BD3A EntropyInputReseed = D912AAB48368EDE1C5F9C1116CB4E2E991FBAF2624D9F81AF47E8D7467460105 Out = C3CB7789F69F6A99C38CCD8D73B627C5A24DA7116F9D1B11B4A9FE3448A6837D219099B339F06F185D9F4C3D1B9A474BBD2C633ACC09FD540AB8DF423B9515D52C68C539068FCBA531B885C26CCC4F576E3471F7E0886F39725131C2F1256B450220473BCD07DDD90AC863059EB18C6982703CA4219C747D84580092096A55C1 EntropyInput = 61308733C0883627AE9319E18657072440C7588F58131EDA0281A4E6C63EC6F437384D9F08C4257035F730DB48A2C153 EntropyInputReseed = EC6681C5281399BFB3AD4F5C6D73DE9726351E189C46BA94304250B71052F904 Out = B3F642CD6FFB6DEAA11C074E767299D93D2411FE4DBDE2ADC04630904E3BD5E61B53440F9D51398AF3EB8E951233E585D88975737E3F45E23F5D63BBD42A2862E827A8A49CEDD8ECF8FD8256A47573D35C2622D7E87D83E5357205E0DCE531F92E8FA3257782F1DB47CF70DBE94401CD50E27DCCE183693AD501DB7B0AEB55B2 EntropyInput = 7C6B15D4477C5DDFF3EAFAD55690E021F8BF5D343BC6DC2D58D29A979AA921C37938804EEBF061388D3C346144F49211 EntropyInputReseed = 7D8B82D9EE9A99AF59347DA76778051442BE4098A300A4C606A3247314EA4618 Out = 62ACE99FE2DB12E93C2C9155D70A581B2BACB8F1ED909A24DE1B365FDEECC67135607A44792B004E507D07F5B361480CE4B2F1F6D32BB2536933ECE2816D47A94677CD823EF64A17BAAA335987722B0E1C0239940B0F3D005219D8D378157CCF17C14162165A8EF38FD408A4E9AC85A70804D57353C75FB187BE0D72CF699CC8 EntropyInput = 7159C7AEA96DA8AB8648F8F854F351BE9B28456690B788C49C3DCE74B2311E636AED951FC6E1557F5F1CB6ADBEC54686 EntropyInputReseed = CE6DE3B5211777F9056669D0460184003E879784DFFF86D7EBF08A233E6A5482 Out = 1333D12111B959C51174CA2188ED84CA7DFDA30D5FF25327CD19F73779590B19C0B524756033008B6406ABE631CCA6B82EBDDA5CE7B9E2968A8ADEE3E4A6B3EAA8079A64E7622F6628C362B5C6DCB61B7CF64567E6EC5AE312047250513EC5659160EBA5C758352F7416A0398637902A4D7E86ADF98450DF111EF433111FF2D1 EntropyInput = EBCFE25CEA696645C79E772922DF04D48417F9CF2ECEF727CCCB3E8998893C59136E0C8E8FAD1C49435E6EAC763C776F EntropyInputReseed = 38B48DB11FF31CE5E0A0CB627986B88BEAD74BE834A4E347DE17074CE117244C Out = D90CB0835B0CA64C8D1DEC23F2773B6DD835BEE7E27C91822DBF0898D181DE5BE4E4F6A1D59712E3B47200CB14E12252E9D7C5624C841E4C05C7372A5E70E83A1D86D0C069BFB29A21F511C4CC8C4CD9F66BA3A0810244DF2518BF3785B303E7AEBE9F1906BCFF55A4545D53D2FB8DD72EEE003F10009E9B41825211F2352BE9 EntropyInput = B0CCE5ACF0D3305CF5EBDB55870AF93168200DA56FA2FA6885BF1C2A9328956F6D7966198EC2341808973900A9FCF044 EntropyInputReseed = 2C0BB1BDA5A0125757B64D573AD04CF36D47EE4615583FA8FE5A2DEC8B805921 Out = B417B4470EA950772CBEDA485DE1E945D2319A6A3500D88FD522080A2644CF7C1861D4281DBEAB81518B59245050B1B4A5F89E9A61BE4C5A4372B4972F1C17B983359907A44D88B5BB12848428EFEA84407893640FB0363B2371E14891248AFD61ABB5AC0474C500E1C8EF2C114184D7EA4766D46B78D2742986BB34E62C49DE EntropyInput = 103E04DC6C885DE4225067C8DD67CEC5A3DD7C45586D2ADF59B54B546CDC15915E37BF8F455A2835CF448DA683D636B4 EntropyInputReseed = 936FFB8CB0833324BE823AE723929996BC450F81576F2C43B4829EA85044CB55 Out = 14EFB3F12FA03BD20B94B9794EEED7DE9E7F7FC9F106D680366322E710285C1EB8C143607641E0C44FE9DB92C0ABB5FDA3806BEF5961289E3ED72B67B14F1E98DC3BD9B938863D5CD9E45FFF3E7C5EB256B487F029643A0A27C09BCB6F5EEC8363C4DEBED61752DF8840CD34E6AE7F5EE3FB53B7267678D15E0172A699FABD8D EntropyInput = D5303207D58BFFB97E0772DC848E7E32DFE2F517FCC9B82F256DCBBBE225A543478F5D6EE7101835A177BD002AC75955 EntropyInputReseed = E2B00122B868747633010CF2E505DB7FE89B197F0847508EC385D2180C97B9621C2A88E25D1711C7862A849EB9A217C2A4219031A0D2E0C2C2DFB5F160B2528B AdditionalInput1 = 282E5C2989D4DF5E1CE476BF05057B7560CAB5447B15992951DB78F7A92767D9 AdditionalInput2 = 3A5B9E896338713C7707AA03360A3027F76E2418BDCED7D3E8062196E2721887 Out = 623AF8A786C2303F1248EDA345D3A80DF15A6BE6CD34973D68C454EA1399390A41835266C27D0D2EFC7BAB2207022B2ADBD8DE654937B49BBF620A716FB0C69911C39B2F96ACE53D81FD1BC015364DFDB4B226F216A2A129FD0D1A061D74F4AAF6CC8871E015A480E527AAD612F40178AD40D4F790B6F81DE9B4669B194B799F EntropyInput = 0BC99543E9937CE2884D090D83222B72ECC7A3FB0EC62448A92269949F04A1AA26E7ECE2C5BA510B4CC6C1EFD58EB70E EntropyInputReseed = A5E9E5E35DD699279305E4670A39C1161A678DB020ACF6198010BB11B301945A690ACFA9A56A4675A1735883585640AB05A859144ABF6767AEC6F287AF1A5D1D AdditionalInput1 = 54C5E8A01E6FF8BEA520FB1FC19DBD7508BB2B3E789D3E69DC937D3E08A3AD5A AdditionalInput2 = F6198CA82F86384F6A61169B6601860C6B7BD6B97DD2415D17B1DD2A29C64529 Out = C85BBE9BD93516B9B74ED33E73041BD3D652437168277678AEF56045B5989213B55EBE6F57BDFC308791C8F70FD2E879E2F73C1E6F49E664253698CBF53F7D03DC81400DC70234CE023D8C1F07127D9E65DA76AA0C8108B7BFC9F15F99AB87C5543D9EAC0504108FEA73351479115AAC1A1170A0596E4CD0FC469E9C60829323 EntropyInput = FC0618D83422970DED0C65E7BD1CB0475D09097479732F8CD7AC595FC1A5660039852B61CA8D81B23A5732DAC45FA478 EntropyInputReseed = 5D1CDE86C410D00382FF159FDC2F68F28600FE1F8DF552A78B4D086D129F38B75100D4F2C4AD3A0CE884657EC967286E9376109CEAC66BA60B9B2215A88DC23B AdditionalInput1 = 41A5CB531446FF20029A2BF660DB85CACE792A8EEEFFACFC1E9B9791F007C01D AdditionalInput2 = 24511AA84E368FDE0F93766A85EF074E987608C6301BA7D7503ED1B37A1709EB Out = E5C2379D01C9BDFEE346560AE279C89C93CE9DD88EA3DE4AF940C208504AD2EE41C8E108840EC49D313064CDD472CFF9BAD09DF0B804C771CCC44548A081A330E274704E5AED3BE6245DDE0148CF68A7045DD0800E1864808E7B2F7AD1F95D028D51FFE9DAA17CD147746D013560090C1CA105A96C8941F798FB868D94F4B0B1 EntropyInput = 49B7BF8C97AC8938B4422D9F64CCE5B50A913D58E5B5788ABBFF6A7D67D9090E6BE832385C029128A1BB384C29350CA0 EntropyInputReseed = C24F83E6E9FD621F8BC9B210A850B877AB2F5E5FF1E5126F9D90FF188C68B6BE951F344DEAD7B8F2E2A55C74A88576EA6851079ECF73112F1158912DD98E0DAC AdditionalInput1 = 37D36BB939CE1B885C156E4A3DA3A24DEF007134A184D6559D8EB40C6D1AD570 AdditionalInput2 = D889BD9AD6D8CA0B93FFF592C1711EF84D37FB838ABD5B047D4691497FDFC32D Out = 51D7D6E0C61C19F4E03624CAC5DAA883E54CBD0D53C8CB5DE0E1FC97AAF11B85D19717533DFF4E7FD91397B3E898591CB4F3E005CB13476971686DA5153F549BF9A1B0D850400474AF70C468A0EDC4224D27C5799A9475CDDE7F8777E13AC4192C3E8E807C72BA5EE579318C57C4786DA037C43CA59C83BADAA6CA7620B0920B EntropyInput = 345BA41551E0BCBE817629EA36F0D4DF7711F49102802C92A21D23CD02FB89FE610EAF2DF87C3DE8300748E2E18F811B EntropyInputReseed = 05FEACA236C88E19269F3A8C57DE3F1F6C247FDA7AAE1A39550C5B004F51A08334F3F5BA8732B429B412C21546D0B714E219E223F5F55097B1A59A2EE2FB9B1C AdditionalInput1 = B05C53CEAE0F2E20D0DD6C98A8E22B867BA688B4FB7421A3E076A9EC07B444E7 AdditionalInput2 = 7981DF1D41DEEABC000AD25457724210318E0D072847C647CAD39AD95DDE9CAF Out = 42A0EEF581BEEA298384FADDDF489B8F2E4CAD163F02EFA398DAC8182CFCE30587CD72D1C78942CC7F8563D306140404E8210BEE3FE165BEC2B2B152A57A7AD6551AB64C6CE64667250C2B8255922425E944EC7BD5E847BE57513A735DAE31A8E05752E6E7E82E0C3D7092211411BA7FF28804C468FB070A6AE879A5776AD571 EntropyInput = FA01F038B9823E784999AD5AAC89FABA9B874FFEA4F4EAC384FF4D4A4A96583DBE2843AB8A282003D7D96DD6795FE7F6 EntropyInputReseed = C24BF33557F2133456038A53915170B84703ADEDBB1FE2DFE083C1F993C2AF76FFDDCAD110F5F8692CBA9D5B1F9A6D21094090D2A6882F3426FC0DB9D0DD379C AdditionalInput1 = CB3DF1A9DE2E98933094FBEC934BFE12409FB36718845BD5494B61FDE7FA2243 AdditionalInput2 = 843A4ED58C0E96CCFB1D829121A9BECBBC2F647740902580BDF299F023894275 Out = 6CD34C36DCE70C626F426DCEDB1F43C83EFC05A052E975AF73896A14103F7B86230090655E0EBF42F439A5640489E8BD32AFD94FA5BBA960876485ED44A444D1EF2A926B0C7D25F53ECB34FC6EFF65BA9550CDD49163B2B23315B62E926FCEEEF8C0A88B91B65AF3DEEC6FED86CCBCA242C9A31C7CF4B3AC8FD1892F8D0EE3B4 EntropyInput = A1C71DB56D1C39FBBF45927A3773FEDF91CF70B0017CA29D2DA1C2D02941BBF21266A5B195A5EF2B4CF38AB00932D90F EntropyInputReseed = 39043E4CE166AED8E375DC3FFD47E600EAAF7D1FDCF8787B64ECCE63EDDB4CCED4C484AD1BACA483A614C00766A8788CB4385A2B2717DAC51F1B7C0CB7C3AFA6 AdditionalInput1 = 3F3E8C23DFFA8240BFDABFAA6EA1C749A6680385F033C4E139A538AE6CCDDC29 AdditionalInput2 = 36922EE5D21B6B60E06127572EC8D87A08727776F52B9339E9A5AD891AA37B73 Out = 489EFC0858E8F9332DB836FE9B03931A3A888394D25118FD8E85EB4D8118019F72690AB9AB95BC947CF7A1E85E78D65C50A7CE5B86D939B74D91F4935A25A99646F4EDF3CE28174D1EA903A09566F7486F7866D21298106B613E87D0947375027654118BEAE179DAA166B8801508BE4A5BA6433D481CE6557F756BCDC84B585D EntropyInput = FF72D63B7C745E6150E0743C188286F20CBADC1E548AFC6C00AD58049B35EC7A3A160BCF38935BD94A211DEB71052981 EntropyInputReseed = 3707D06815F51320039A35F65DA599D8D078AF5805B25E915A95F6D7D89BC8A73205143C73B606E3800608C4DE92702E5980DF8489DE8860C09C909B4FC139EB AdditionalInput1 = 2368B0104068487AC6E40E06F894A0FF7428C5E54389DE4C3C171F467F20DD92 AdditionalInput2 = B4F7EA6D8F5FEDE689B13F399D93349584C47F2DFBBD56455E8E59B003E52A70 Out = 20744265566DADBCDE71EA8D0CCEB9BCF236139A389451179CF69650DC5D0C67C273E68548DD79A69320F0F879C00A6B64F66353DD7BD33F9FBE2C955082ACD7D2DF26481762923FC09A0763F49AA7BCA1B1C9D0A50F600F1250CCC37710EC7CC8571D3A6259BBBB91B3090C04B5F1F286CCEBEC6C6E234651B1FF0721582687 EntropyInput = D7A3039194000B37EC0517DD75310D5F2FDED48521021CCAEBCC27A6F79C653370E73FF457EB030130701782B84BDFDD EntropyInputReseed = A9BF846278F477A761AF713302E15EE5B0DE38B50420629FB5503D7287A06357982368B81571773A997E35B2448C288578A9F1EDC5C34389E009D69A1DAC7FBB AdditionalInput1 = 83DB74DE7931335B01EB65E3246097A85C0F28F21FB43E024C660EF1B1E5D7B7 AdditionalInput2 = 3FE32F74F19BD347665F8EE3658BBA86F6839AFFE28D428A0D692D4F586ABDCA Out = 9DFBD5BA6C2EB3CDE6620FAAC79E8EA5C1271C21AC1490550D3962BF9CA3D8AF00B7A551B3B9DC6A0C14AF53BB98540B23583FA4AB8FFE86BE3609E4469D18C2683A556AB6F109FB52A7498A852EDD9803280890118A57473C245F92E389102C61729E788681806BBD6238673F46A40C6A9A1C223778029B4BBECD21C487C5FE EntropyInput = A11B0A4E21C3A8ED353C571B953AEBFE94499EAD7240D8E875D6B09B40FD6DCA1F6B0D4FA4329CC79963005262861D5C EntropyInputReseed = 4029EC544E6FA169411C7870AC1D40A6EF066228F7B3FA4F4D05103B1AC893CE09FE6A459C6A86F1EFDA26E4B37453907C161BC6E93196A3119CDE8D616B7DD6 AdditionalInput1 = FC0481E74C45040BD19A0BFA840A4B70C06CB1F7C35F96DD99E049677F0D78CE AdditionalInput2 = 2D7BF8B7D14BBEEFF529119C57D553CB12CD52945736DC2A55A1F80434A3B9FB Out = 7DB81870CCE89FEDC9B30CF22227E991C1010055D1EF6479EB638AFC5D2599AFD4551812859F523B6CFD02F23A7AD1426A5074779206F2510F38836A7C4A4E1A12BF02D09CA7C3299314541A1283B841B3F52EEA99EE6EDF4DB0D40F045DCBEC339AC95282132E9F3968526FCFE339D60CDC0BC2DE19E920CAFB45503A2EDB0C EntropyInput = 5F76428AAEAD69B420BD9FBD18FCE1388C6CBCE2663343ED98140E6FDD64AD764CA63581B2B1355788C20DA0567B2CCC EntropyInputReseed = EA2A2426631BC886A84794DAA915936E04A398DE64C1D090BF116BE8A11929377280B16F4F3D2A422606FFC340E5DC84F1AFDF5776BC3833221CFA9CB614402B AdditionalInput1 = 834706511DE37B258F4F15887DA2CA7E31EA5907C46A965CEE21852E6B7F4FBA AdditionalInput2 = FEFBD23A913CB3597DB38EE04C34893D2DA183B55B61DBF307CE6557077E81BC Out = C0B1FA32CF567A5578E61F9AD16568C1D220F81485605EAE2B3A7630FB39494C094207D5F2C7DE72EE03F51E83857AFE303FD9F7F98C9900F916391F81501AA56AC1AACFEB194043A454719557A2B10A845D761D3BABF1C150829DD6FB3267258C1F9230465FD6919FA102A89C25B177645B7D9937EEF6FD7985BE29A1A75470 EntropyInput = 2D414B185B35FC4DC1BB7EA0BF9BD5758AA4B3B16F17881ED4CC9E3323902612910F12A00DFF2449320493BCCDCB0918 EntropyInputReseed = C2849E6D44C624EE83E13FB21C4058DCCB43D75987327A157D3C294C19135DF7D90847E965E4109DEB7BC394B257CD1377E28DB227478B89F87D6FA4580B0903 AdditionalInput1 = 24F09DE99D7F583869385F00E9175BEDB11ECA6D1C5F45CA79C79B9169B46E63 AdditionalInput2 = 23821EAE5B883C5C0B95803496D960AEACEBFBB76F80352A8263CBA07E76B3F2 Out = E872F0AEBEDFEF8C0CFA4AC29B0D098840C3DA6E86D2AC61AD049CB690290523DD38F95A449804FF22D6B30D7EB3DA7E7D06D6C4CD2571C0932065D5585EC7BF7034C8D946685252788C0C050AAFBE54E399C1080842E46F74A0A34237A8916E96F61B7BC2A05CBAB88AF716723C681DDD676A27950332A9F97AECCF88F02150 EntropyInput = 6E5E0D62D2AB05F78AED5E3945F68C4AC932AF55D560CA7638D734CE6A1596BD9F6CFF7AF025B88AC2DC0089B9EDE594 EntropyInputReseed = AEEA23A045A380869B5311A2ADA8EC9675856A9347EBC5191C62AE9799B65EFBC7105F97A9CEC8357C796A95338F190E6AFA640ED8FAD8C5CDEBEC2C4F0A5729 AdditionalInput1 = 82E45278B24042F4D2806803624168011CFE523DDC106009F2F77568686B85D9 AdditionalInput2 = F73B56282FF8A8820E14DAF7CA4B60AC52604563CE05A2C0C51A2457274D09E5 Out = 95CCB4EE97E14100BFB368E0D618927F5AE1DC61AE3F252F325E7673413AC6D492121676B518558BAA98770F4DB5B71C8F2AEECB9E57735C4E2256A8E3E1A12F2B94D3AA7ECCC3ED1717805619497074F8DC2FB3FF06E1C32C9B5A315E88B8DF72B75D1885759298E4E67CC020B00A97C8B82C7E9BEB45E1BFCC770334C6381E EntropyInput = BDCFA37B6621B32F3AE532BA51949706885C7BE56987C5AB8A2F33D7608936BD789C74B11D609B5747F8E7069B3C362C EntropyInputReseed = 7973CAB93C4DF62993084EF32D48092794AF8B9A1AF973CCA1F604318D95B0757ED09FA93FFE367C5333C0B7460B2E5AACF3BF19B810F4064A17200DB1122904 AdditionalInput1 = 156348CEC867AF11901B9EC7B5272B67DB450EB1CB352D2490639AD4B911390E AdditionalInput2 = 7B93E7F076A5E56B340A003AA85BA0D940C609934DB23E2F591AD95E78F175DE Out = 590E0178F2FA21E919388FE806A727B268613E21C145B6F237DA421308E92A2CE52AC780E98CD366A6B547A304DB0E0C07D12C22A110C7AD60FE53D718F15363EE03BD1944DD8A538622F6EF0AB619CA3C024B89FFBECCE73CD9112D9C9CED3ECDE4DE78B9D16E15FC898A7A11245EA80C6C1EC86BD121892E71FDD197D05849 EntropyInput = AF16F98DEC60202A61A8378A0809D034D682EF14C365216F095DEDC72401129F0E2DF5B22B176E053F7A5CE04A839675 EntropyInputReseed = A033170BD8134C6810FD93D3D2F245819E2CEF2C591E44E0211FF327F20DB8ACA1DF363A5A1A5B94EB2E205400E63F86953B630AD2DC203D51326DCACEA96899 AdditionalInput1 = B5C03CC62E06BBC34E77564C72AE68CE8BDABEA3507DDE33E485BB7653D81628 AdditionalInput2 = 92D3A73716837339D825F3F4F87099BABADBDD57DCAD22393378CE22A6DB2298 Out = 6AA96EEE978D357D3BB0B3DD98F55A653FA54CCC05DE780C687E7A66984318650A3A648CD47AE0805765A977A2FFC65E40F1A04DA3F3C486F01809D68406569C95EC469C5369A27F0ADC6D2BE7C9B67C022A9486FD05D32B66315720E41F7944EDB2F9BDEAD8B1D6EDEC1F1758C3EB87EB9686A4E79C2F83E589733D110F7F92 EntropyInput = 28BA1A661632EFC8ECCED5F51B791300FB3B55B05D041708638DE4BEB757A9E576828796AFF07F55795CB54713C77ED440933FDCCE4159B0955111F844471B0DB85B73BDD2B78C468DD39E2A9B29AEF2 EntropyInputReseed = A5F542B04AAA5DBC931E47019FEB38962616C57AF09B7C1DF83F2B860FF76586 Out = 65E5AA47B385F1EA42B231B9FE744253B8598859D7011E525F5A2A1AD32A972A850802C60A2BE19BE270063A3CFBEAAE954F10B122352DE6A08AC410E0991653AAB271B360FE9191CF5ADDCCCCED8C4ACFB61457049992988FD7A9ACCA1F1BCA35F1475813694A39988E5FAC9F4AC0572286BC462582AD0AF78AB3B85EC17A25 EntropyInput = CFD549C8080A502E3EDD7905584E5BE14D7EF55910D282D81D345C53CA34E07BA565E4BC2F461769C0A8F211A67DC9A7D4ADD64C8603415629DA5CD58C518958C84D43ADA71BD1BD578FBE67744B2476 EntropyInputReseed = 2712A41615F2B4AF37D641C3A73407AD62B43EEBD0439BC70FAF2B7F2525E2F1 Out = B5225FA8B7B1FF058F3ED492CC7F66CBC3934774031447125AF820CFE9429C195DF9B3CC9A11B02CF3800613EB534DC2CE1365BC409B2B13D65BEDE54CD213A549F2EF9E3D17C4FB99551EEA539B91254883CAD86F5C3853A803566AC1EA864A08BF6E8029588FF8580F7D2657DC8F389F72CAB4251A19C4FA2E539AFAC7C1C1 EntropyInput = 5CC913E12629481262AD317FB8D39870B4F7260CCACDCEBD9131710AE71E0C98D46DE6C6F4A543FE5F473C2C2D0E214ACA7F2F6501E6DEA1BF7F54E6BD50304797AB80EA0228813EB3849842F217273F EntropyInputReseed = E7F008ABD00D525297FF6E2C39A358E6C75C4A64F6AC68DEFD275623F496CA07 Out = 8CA7DD3D3B82F640B33CF176B22DE7130C1DC54C684DDF8BC7B08A181753AD7AF8C4638287F724DF8FF991431F99A3105173B107F064541DD92440FD4CEE659E9322B5154168F49DB36F32245AE4D9831559EB839B28B9A388AE4980CEEADD9903D4FEBC662BB7D246017463E843E77256726622CD1F1025C51B6624CE847716 EntropyInput = B8BC5E6720A414B7F7A213D455D43EC55C773EDF2403319716DEF9EEC12939752DA286292331056DCF884DE8944E026B514EB0C69BBEA5B995324976CA123337E26F639B06A7A362FF57673520CB70DB EntropyInputReseed = 3C1BBA681B3E0408D08B92FDD3252DDA67685D865FE8286D6C4FD669C33C0920 Out = B9416002C544E079998464D5181AFE70C106D44B876D16B39F936AFF36EC86DDEF5FB2688A0AADF669C39B6F6724FF3EEAAC90B70674C14D97E994BDEC0FD52373CF7A21250C835E93C73D7C49790B59300DB485F021B13593A32D72B7057DA0D55F63A6CAE5183540E817290D8B91CE55F45FEB7730732FA9156DA8276D6732 EntropyInput = 28DC2F25B2634C0672A0FA03378563DE214500FAA77EE4076409AA16BC8512D285D52ED34E062909BB5E6175DFA187B85BB0E422CEEC47AAF48082909F11C998A5A77D54320B28EAEAAB713221C95419 EntropyInputReseed = 4393B20D7DD15D67A2F78E7437E1E7A95110DC2DF646DB22342A711AE102D1D6 Out = 66DBF2B121BFD4A72584B561C650F50995D22F0F377DF2F60CD26E0377B7D1AE7B1AFC72D22F9AB5B542764A219CBB66F3253E602E93807D3EC2BEE5AB131F00FB4ED3288BB1B6F52DD39D79C817AB73D9B11F81E30131D1F3CAB960441D07EC23BEA0EED77188D714078739D81C42CB224BC5AD0B65C8C9C5A808B605F1923C EntropyInput = AF84059F96ED19B2E53F091228E70967864735DC83178E159F577C57BC121CBF84C6515FCB88136ADC239F537FCABF4D9FABE30ADB15A1452FBAF2B627C0E47ADC60CE6E9B10A56A338F08E8858F82A1 EntropyInputReseed = F5FDB3B3AA2EDEF8CA8D31C9912EB43A3ADC4825C88D463230B113913F1D0117 Out = 181C7A02264E5A6A1FF4D97DBCE07428E4B2B449A2B861EB0A617293FB847E2AA1234D214D5092073F9DBB49FAE8B963569BF4B7FE20E6AA355E565DB4C75D623B47CB627A7FDE9008D029D20C09BB50E83AB037F3708FC5183FE0F22A732B89F39C3A45F1F1616876F87203CEEF0605F03C28B2654DF00A4D55A0C011B93916 EntropyInput = 4AF2BBF36D2A302595DE667E42E08ABB5E44CBDE9B1BE2EED0338AACB48673BCE0B943F55FC13416869A624A9A383FCFDEA4C6B2490F1872E61A9BF77C3F3B67AFA8E892BE0C3C1AB89E92A27045E1A7 EntropyInputReseed = BB6A04CE7F81EF18BB3455C925B8D576DF2BBF68C0FE4E65C68022AA69DC0EC2 Out = 31052A14C911B6926457F562FC27D19F22A3DE7DD145AA75B9B603A6109FE1C1FEA3FF2E37E9D98414502E2DFEF0137788187E42A71CD69475A8BB0040AC6DB23AED06927495954AAA23193DB83289F75F966EEF0A7CED68E8871AB2A47D3892F594A98C90AE51CF11BCF6ED879D458D171F334C049234DCE7941F34B4839FCB EntropyInput = D666A2E70AF2771269425C4DC1ECA87FE177313843B8B6B9C3D4DA9D46540CAFD5486A3B881C35BE944DD2359B88D6A25F0CCF34C257608EBF9E5FCBB979C1D8F669047E718C760D0A9BE0BEE7C94D79 EntropyInputReseed = 1A6CF1D8F6A17AD9DBA6898F7F82D33DBA596EACCC2011D155AC6E39D59A7558 Out = 58FDE4F4E108A540226F40846BCE66DAB6082EFB636E8987E18542DD6E2840A88BE045019402B20371E08E415238925A440A493ED8E10355FC164685E499600EE192ED0B9531592D4A52F4D70AC0A0AAE12C1705E9C1ECA26B36C0906E216FDAE479AEF2DCA8460D0558BDF768D7C0002FC71D6A5EB06FD660564257A158DB53 EntropyInput = 208B9EF500B0493B7F2DED5F3AF6BD568F5DFF0EBEFD1998D348037EC363DF8013EB969CEAC89456AB22D86933A18181CCAEBEAD9E2B911EF927F3069DA5E3582A7886D956570D2EDF2AF434B9473DBA EntropyInputReseed = 069B767AC6123F9C551D3BBD43228DF54F379CA6B418967722825FAD33343F9C Out = ECC758FD316A75E5F97A14803AE51F8C0A80ECBA954B54EC8B9DA8081F0BE9680B11ACDCB9FC65C6EF458787546137FADBBF077A6002528835CA3C808FA593D820A06501592D857AB0A67B803ECB6315BA1AA0C90CAFEDE02480B98A07CF9BB867DCE3B1575B6B46D4046F4408DDC71282FA43ACC738A27665B33AFCCF974077 EntropyInput = 01469DFDC993BA870C3487F93BEC2081974DE5F4193D105BD8AF41CF001F699C76154EBBFEE08951CFFC61C1C22C96854E5FA3384345B66B7DD4FE9FC788A03A3805C5E8ACB4707E6D24412C4927E8FF EntropyInputReseed = 5E7435F00F59387BF0977A6D79C95B831884E8ED261BDD0958871691C70A3FE2 Out = 26DFF79AD2E72932CCB00AFE66905FB966FC7A057B491C375A31540A79E30A4780708A1E928D7C6EF959433B9A0DBD19CC73082CF5D304FF2E9ACBC562200250E7376D7D35F22BFA257C86B0DA7483791F8F82E79559E5B4B9BFE0E1FEC52AC40933B3934B13DD650ED5CC183E796BE35FC59FAF513C40F1249BC8FEC4F2F611 EntropyInput = F19F4DD401E7FB21B3F7F73C8B390EB676F895DAAB860B491CB2FAC85197C1492538E6BE68441F15AC6FD0A34EF3B8B812352E74B912C5C637AF35B19047775F9CAE26C1AD49C5D56CD287C7B4117622 EntropyInputReseed = 051FFCC76479A5670CB0FBBA2BDC8379331D8DBAD06069F9A5E36CB8F7AFB398 Out = 8C44E3D5D0FEE79B1A258F3E30E3CD9A0EBD12CF68978CCA5ED053447657FF4105778B4DD872FDE92F98804A7242EA57E13B0D6A8D49373748C495A77DE80EFE24FAE768604D1CBB94EBD08F379140EA5208DB589D1D1DDCB69ECC764B51FC082508ACD693CEDBC7070F552D294B6B2BAB9C7B6C9C0E06888BABBD75688CF536 EntropyInput = A0245F9908F6C664DEA7689E971A1FF2C189EEE422EA157D40A444D83C941980F569F2AF4D5FBBB7813F3E244E4D3DC4887E6C40263597D756C25B4015E709A9663E48D5A9FBB4813B85A53B997A64B6 EntropyInputReseed = 2B85598A4F92A00F4CB4C1FAD1829ED6F8F02A8A81027D14B6574C91783C1DC4 Out = B4C4F41396706CF36D6CD9FFB6F8A94C4682A8692AE9D8EAD80AE89D964A01A5DEC1493D96E764B94935F88DFD95E7B5FD196EEDA8C2AFE9946DCA0725FF517D7BA3D8F7E017411923FAA9289F68B7F7BA6E29E3DE652FA4D60E8CACF582EFA2157A23E953B503981C485CF523BD1456BB7E8C322F7BF006223E3774697500FD EntropyInput = EE8F7A029AA7D220A5A19D285FFF411F2ED566A12EC3C813F9559D221DA38E81B028D4B96D9A61801D2453C4B42FAFDB282CF8311375837C2577D31C503EC06023F8E2A5A0A2E5CF9CB7D911899F2B5A EntropyInputReseed = 4C7B59E4DFD69C36FED4A128D7E63D5E7647143F5D4AAB55516EAD959C05946A Out = B6E889D02D5D4CD5A937C79494E9928C383D5A3BB11F6CEAA180C7964796AC59FCC2466171D61F533CEAEE81B0DC763F0C62C449B779CD303DDF56E1CE01DC127BF1BB526723FD7F2F054676D651C94DFB0623F97222E34241B5654D5D9F231B99411C0F36D57FCBD0ED49E2EAC47DB3F2A122178E116D68F04FE0898854E695 EntropyInput = 10B8789CDBD6778442A45EDF228B9923F452631AD0FE9E608D10826BA71DA7CA159FC5D8E50EB56E22974789B1DC20D12DD59E37766C667571B779C06E12BA219188489772F48631A6728B5B867E3CF4 EntropyInputReseed = 966D942038030509B20E610062042B6BF104812818893292A68D57D1CE865151 Out = 3E6ACD8B4E85B4A0F7928F6BD41A8E6B52524FE72723A0509637D33F15AFE7D8DA6A15209B9E4149576FBB1FD831F784C04439ABDA4605D06556DC3002055B5855FBA201F6DAEF79F78D001ED69ECA8A418513D02464E8D742C2799CD68EDFBE88AE9B35A0AA065C42A4770058C4B026D0350A7AFA9C52C3C7FA054F8A96D887 EntropyInput = 9829D2E5409629D9C53C7DBB16C619B616B0D17394A3E055BF6FAE9FCBBBAFD4E15D2762631516807C1F073382E852122556E3D75EEFE6B6171328E660BB6558DADFFAA1E032E7EBB6B3262ADDE0DDEB EntropyInputReseed = A4F4E28B330B73382FCC5C857ED62E945FD971554064545437A5D22DDCBFF3EE Out = 747402C50DCCC3A666D94D2D6F6F43FD2B505384733C9762C2EF84936FB329C366541288FBC578E9397B5B1198F1665F8C373DE8556D3C08C6619AA3B355DB206F840B6AA4CC72206D7FEFB2435D6B024E4C1568E9AB31F7110F4311B05D7996CEBA6E5E6BB900F8E721AE106A9511F8926DE2F8487100698AA8FE995388A072 EntropyInput = 40F4A4344082039F5452C3FD21ABA9393D253C558728346B6954B00F0C64BEB1F8E297EEDAF4384A12D91E5B3432C69F11716A84A8B4E5717B61F0827CC9E56E21C0ACB9B40372F68902576B50C46BA5 EntropyInputReseed = 07402212D59681934D22D9BDE4CB04D69D2FCA68E184C526DE933669BFA18F78604E8C8E5FD3C9368288451929C9DE0E7F537493D7ADBA56DC400961ABEBE501 AdditionalInput1 = 34CECC853E6E379BFD1E13B8EAED00DB34602E33760C590E3F75F10EA2E26951 AdditionalInput2 = 82B7F37CB3CA1543927659FDDB13D09507FE77C941C5D60D451A9103F1B0B5E4 Out = 3CA3EBC8CDD8280C07213C5A5F1E937BA1294C9AA682CA1A3DEE63842132B8DA641B340861ABE7512074F6D1B9745A541CCF19CC1224967A9FAA285E21D7572B3E669D9A3647C30D43C27974FBDB461D468149FC1B340D4EE6C640CFE194669D85D4A595BD1B78808E0496D0E2E38A1B9BC1D0E5273FA03CB5F041BFEA7F1C9E EntropyInput = E5FA73BED99340C91AB17D039EFD248FCD1AB8B0A0F655DD3149949685ECADBDAF4B94F08300A1EB059AD6A687A22FD1D0095A4FD7F6D6DE2A1F0B292C47ECE8565BF8C202F0723D0DE7F2F7904537BF EntropyInputReseed = 4DD81FAD534AA36E174D06666E95A4D9B3622BF60D8A562C764541EA7C974FE9117CA0AA9D57973005FAD1F8A02F2D62AC701758556B42A8D5382EE55540A86B AdditionalInput1 = A36BA41E095A40F37985A5CD7315F3773132F491EF8A453D3970AE72F41C5365 AdditionalInput2 = ABBA1D162556EAAB729252CD48DEAD2D7D50A6385B1D270591D465FA38C5597D Out = 2BEF01BEA1FB0AB5FCCBB474A1BACB361FFCC326F1D9F1969048C392F2761ED0A37126433311DEC9DB18596448CB814EDA151B264E3CA464B25DE401B0E38B43E93C64F675F37AD91E95C24E6997DC4032FA62BA00F3C8A792D6B539A4E8290B10173B6B35F7278F34F40DF7C4CF26518350DFA7E24362320C8446963A9A1369 EntropyInput = EF9B335782A7058617D19971E6030D80885906041FA36814D1813442F74E6E5E2C916C3FD3478CD0472C39806849ECF9C496E65304FF4B7F0C6EEFE0D285B2CB94C10B2F1D8F41C48B943BE1843F2DBA EntropyInputReseed = 5D0EA0D9E1829247B940EA705D105467DBBAD7741BDD2003239BE6279A462A582C25027F736FA44A669F739FDBFF85D2E53B4B5C3C507595E8028EFDD0598BEC AdditionalInput1 = 23BEF66F03DCA520A44C48A78D6B0AE282CE2B5A6E6DAE1693722DFCF2BC0EDC AdditionalInput2 = 7C6A7942BEC6820BDC0504C21810DF0EE23C6A39969EBA5D34B47259686DF340 Out = 5FD4C259C89E9AD59D5A3C6E815DE80DC4A07710B4C8686FD7095B31F3F36C18FD15975091EAE2BE2BB4598C9A8C20902447647BA0CF36E111E3DCE3A6009F7402C7E61D46CE662A543BB7ED24AD0695B4CA68959B6451B679E7EA2FC475C4877D4E6650A97CACF0C1F4FB387966CA556560FA70FF2FE0FB8A18EF126BC2DEB7 EntropyInput = BB2EE85378B345FB3A38846AFB78A389057961728926D6605F751FDA499C5B07D84CC383D7EA22949E3519DBD6FE4EE34522CA2C98B6DCBB20A9EE94F1138A02DB36102433782581BF2A711DBBF6170B EntropyInputReseed = 9E1B0D2B8F92890BDD22E8AAE0D63D3614D0E08B408DA97D88354466E3778685364B27A285F5D75D0C578341E1FDEBA21584EDCCFAAB5740C3F7697A4527B78D AdditionalInput1 = D9AA00E769E8E2CA59DAB0F5E92612272D0C6F2124FBE9AB2B5355E6AF177336 AdditionalInput2 = 3F745B4C6D38C5EBC517C5D0BAA2BFA6D3E4FC37F623F0652AB1998873C04A92 Out = C5EE136D33C31410680B91386809E1BEFEB1163AF1B317D9B6B8461FD0143A0C7C65C928E45C313FEFF1AD6022679BBC4F492423F54F51C46C00289199EEDFCAE22521E7E5D9F45E363FD44ABC4BEB272292898E9CC352F8EA0521F172AC10E9A9E12C39E3C4E74A607F79B2A8671DD2CBB3CBBD4FB7DB5B4C946453D629614D EntropyInput = 41BFD4BFF4F2912F23E8A9B0737B2B80B36190F49A296A8F64030F5C41178FAB54E60A6B9247D348219B230533D70A49A93D441C79DE8FC817D412B9EF1DAECFF13DE00E83D3ADE890620334A8C1932F EntropyInputReseed = F3FB3663AED33C6E4E0D0869599A30728F88554E8111818790A7E0F41655CBF5961B591D3F2FBA301D0881B07C378D171680E890D5E25C00B4B06D995793AE48 AdditionalInput1 = ABC5C01194208027EC648F324E087AAA374A435C97C7AB4BE7FB8AC943446BCB AdditionalInput2 = 85F8C25A14AC637DF49A79A33C23E175069F8F045881839EBE2B3B0D79F01FCF Out = C5CEF51696DD2EDF21A0E1EDA0D117B9C4AF729E47B021550E4920870B8EFA40BC3B444C98E8D1E1586102AF9235084C0B1C1CBE06EFB52B2B06263572D0CE1184E73E8615614E107059D0B3C80362EF0B08D8BAA285FC65BB75ED2AB39015BE31355E9B5A8720B875640F0A0AF7A1AA4DB88B6AA13D28AF591BD1209FCF4C5B EntropyInput = CB56868A9C669969C95690E3C14EB830E111BF83AF254E0AF6DBED0708E7C0DA69428FE0F196BFAAA360097FF3AF7DBBBE2416BF572A63E5CAD3A92CDF419D97934DCE472EDBA298F33C84DCEC5F029B EntropyInputReseed = FB9F58DC1812DB4D32DF42631248CD3946B9FBBD0FBEC9D92AE70611AFDF9BC5E49A985D96249775F3486962B8E5A3EF5479DDCEEF6D9B014FA05B08AD0ABA13 AdditionalInput1 = 1E5D4D1F24CE39AE9887155A8163487E05F6C2254491B19869DAE1FB54322E19 AdditionalInput2 = C47278727A0EC7825F0482162D4FEF1BB1B3F796B54DCEA21CFCCF77E7A54F71 Out = C71748DAB32A3384772B114E2214F8644B6490BF5767A43677D46291540C7FEC22AF1345C3EA57E40113734F37C22FAB50E25F40D2B6D093DC87D769946CB977DAD8C4AFF7EC363F53036C1CD389F34053BFD49E6E06B1AA7001BA5460AD788AE4772CD5EDEFC69615EE5934F81793DDBAC499048AB4ACA7CCF9E6A6914DCA95 EntropyInput = 256CD5650F84D9E4994575870FDA06249C82C20A56E26CD9529FDF202B0AEA8E7D1D9099F0BC4C0462C8D1071DE0DC0C80F2F49D0254DA9C3D6B4CDAF7E0FE536F8FF5D14050D0FCFFFA5CD7CBCFF4E2 EntropyInputReseed = 2868AADF581BF2A65CB5E2A9C792F63CD64D4ECA75AF23E929DB0835D7BA819FB29F56BCE78CCC73E6C8F2E408FC902855E34502948120E37A18475B174B6250 AdditionalInput1 = 594508589FF1C0DFDD041ED8A039067322CFD9F4D5229CB6DFCBD17E8E73C59A AdditionalInput2 = 0563078C9002413A36C16FBB4BEF7AA7EB95F60B7FA34DA1F5B6D763317D38A5 Out = 9F8E4D1399F88499647935707DACA01E4804D32A7F54820B4E1A7D092ABA3125F1A5A774637AB4C8AB29B09C58CBC380DB47CDCBA54FBCB703185369004F3F03BDA03D8F4CB5BDED1A4DCB6F431541F5E5DA5B9BB38E66CA47424479E7D46917A09FDDE53ACDF6C0F1E602664CF6FB2FD962DFE0A6AC01033F875F7CFC646639 EntropyInput = A097D5A81DDD5A6DEF75EADA913C992F89AE6FEB0927F534514C310D4F23D06D7E24D688D660ADB06B3FD2C8DD3135D5E85E0DAFD1CA8D9D05A61266F8DF12CDA3764E02D2F8AAE5B7F9F19F9FA0081C EntropyInputReseed = CF2EC7274C55B164DBD727E719D563EADBEF879788A49004665ED5AE632C2862D1A8BBEE94CB96693C4D5901AB03A718375C4A1BDEB2AEBD7B8F2BCFDD9833FF AdditionalInput1 = 5F749DE3B1CE6EC7CDDB74ED93757138D2C881791546616B41A7E08897CCC5E9 AdditionalInput2 = 7C9382EB874E35EFDED70C0DA20935ED8BC4ACB824C750DB73DFCD729878BD11 Out = 73AC660E6A0926F548B776A742A11BA7697DAF7DFB78FD48E101F00E1718AF1FFD5CEC975B97B53A7FEAC7499575B7B0189A9DB49B26A067328D483A58DC2BFEDDA3B02D55487223B2B7AE30F6BA4BDB898B77FB39B0194039A29D89736E3F3B04C2B97D34167399721CD313B681807831805D7BA6F310AE96BB387CA77BAC62 EntropyInput = 66AA94A320375F17711BC8929E9DE9CDAF3F839DC06360B4B047D2F0BEDE76D57E57E33A7634E86D3E1E36F1E656A45E102511D2E68E0B60081BDD16F17108FDEC1084106D163206A9AE5CC0FA81E307 EntropyInputReseed = 6054E81D35AA5DB21ED93C129BB976478A7BC76DCFE3D586259FF3B82EAA9F1D74EC569A9A017D052487AAC4C6E730DCE3AB8E522DFAB0E8020D186B5B9ED0A7 AdditionalInput1 = 5976E9B13CE44AD09D18DD52B4BE0878102515A6ADC3159731A4CB1B431294EF AdditionalInput2 = C2C958F78A1F929636332B693A15BCD5DB022863038B35F028DE5C94521592F6 Out = 59FC3095F633CD04A728591DEE591D26729E558467C55394720DB78F090DA085ED71FD8C25AE80F53CB9B2DC911DA65CAEEF20EBE697B7894F79E61772CA3CE08AF3493392A31B324A74ABCDC4E5A66F87B9899087D447E23A8BE289D151CA840EA89FF8EE664AB29936206507CA897AEAD5B3ABFC53279094DCD8E3F3E0ECAB EntropyInput = 67295990D7D476A1B4441C45B3EFCD45A9748203D617F74CC1065B1CEF11D47DD3F9E3B2EAA0A14F667E3753CA3D783E93DC5F6828B8C819014C9FCACBFB969FC21DB71BABF380A2A7E0A985143C4016 EntropyInputReseed = B6FC4CFFA366D02120895DD2312E13B15812AECF76C28B7EABE57F30ABEA469DB00505549DDB2A5FA8E67B9D1BCB486527E200AC0D13675F7AED98B4CE813560 AdditionalInput1 = 321A960AE91F379CEE321DBC8197CE097DBA582EFD709399C249B3DBB95CE0EF AdditionalInput2 = 9618692EEE46EA6AB70A933376BE934485D8CD9EB80F10C354000DFEDCB4E8D5 Out = 9EBA39DEB3DA6DD54EA7F5CBE9D9F21227DE049BF8257D3A4ED17BCD451A572E02A3EBB250595B378BC2F77A5760323D20BF553AA4DA9F1EDB6A811F6F66A4073F9E4753094D07133D76D34CCE085B2895E24653A9465196E6864FDFC9D15E5E345668A495B61625A80757FCA10085C2D789C132CEF78FCA7CAD170F06BB85E2 EntropyInput = BE8DFDFADDA8546B5342DC5C33D6E8F0FB5D2D2A7FEE17872030FF3DEB962AFB17B12C5F42294C6EE75350A4B7F775C0E9791D8D21992D3B6C3C88D8D0A2A355E06F3AD9E6CD7416203F7C68CDA55D99 EntropyInputReseed = BC73F255D3D119E5EE9BF31E741AEB417C47F99D0B088ECC7277EE3D48711581FE37C5623728C7F066F7958D1D20CF1E6CAC42C8B6A9630D49B520FFF0AF0C3C AdditionalInput1 = 1F645DA8A4BB447247D7F764322D8E62A93E59ADED6BB1A13E54EFA6D9D6A998 AdditionalInput2 = D37EB82AFCBD704F4EC2F2BB809471F1E51E5E147F0AF7A8358A4DA02AF0CAE5 Out = C5BD7CA1CE2A183DCF71DF3A34F58945FB02F9630B6E00D9880A682876062A8DA373130325B565A1EC8B21F9797F930D8ACEBAD2453F8C5A018EE2A452C5780226E3BB43E9E0832DCAF610FD97BE81F67D279F53916ACE0EC0E6D787C768A876C021BD0C3915CEC91EF7DF964B92923AA77DC17E29C365D1B44B93E69CC92C26 EntropyInput = EE38660067DB5CA16ED906FA3D625F8B9AB77228AA57F3B8575BC3289E4842299089EA4A61354F73E64D395552828935ADE3628204AB6E5D973831A4F89B9FF6B38BEE0C31F17F31E44B5FCC08E5174D EntropyInputReseed = 2735E4F59F7F903143FAEB9AE393E83226347029407FE6007F1A44C86A6073B25F8BA8F290137E2AE86CF200E56FB5B8D07511FA1E92C73C577FE5E91E7FDF90 AdditionalInput1 = 63E6D311B7404B543A191896E9099F6FA3971BC926880E12BEE8398A173248F3 AdditionalInput2 = 4EE036AB2BAC8F3A40A757B71922205A83CAB7E968A4318C9FBEDC360355C295 Out = 3EC4CE391DE36F825F3B279535644834A587C5B58DE8161A1125EE30EE5D96958D97351538CBDE671FCA86FD63CAE74A40EF74E1BAF50F9CCEF6EC46AD2D6EC75F125DF502B8E9770D47F71A1BE798EEEDD03AD7300833086071B7EB99BDC89762B7E969533F282F7BED366C60DE6D28D6ADEE488D2D7A59EDD09842BE02E3B8 EntropyInput = 5A8932A2FC9A58C47EDB186362BDB07A74BC71ACE4D9EC45BE8ABF90B7779C09F71B46D44418EFB4699C7B8E05FEC6B1D0229E8585A997392E08101D7C1FC457318F5F94C92DEA79754B4952141D7CEB EntropyInputReseed = FAB985DE5DDE01349CA63F7794FCB0E014B562FE684F4177F31A23799C43FFC534E5B102364FFFE243F15B6F069D347158CF4138588AE096EA170A181A964316 AdditionalInput1 = 0B7279FFE43A1E22345231C0215BD52B4BADDEC10970F3D60A70076B905A1795 AdditionalInput2 = 7BF19D555263D89ACE28CCEA70F239E39E7934E1AA18A2BECA0BFBA20AC92995 Out = E762E8ADE8134FF5C379EC2DF2F1484F65FE7D82C23D8357A82B9104234EB5B95E9CF6CBB467FDAA0E8DCCB414758C37B2085E745CB4F0DF3A6334D0FED7F4E22CE7F5E7567309AE4C7BCB5D8F2D1835D05461AEDC9799A97348EF9A85CE38C817FC46504E525919AB1C95C6B8EF8961CDD9BC03681E052051913817B9FD8ACA EntropyInput = CCEA2676FEB1EA2FBAB8E1D46E2552B864C71A9D7B760908F1AFD179CA11BD8A753FE5B483F3D6F8E9495A891D97DC36578550CC0AA7A6878F7E8E660A12160544C8B7F78E49A6B3750FEBE6ECA7BC6D EntropyInputReseed = CD28275FEEAA9042C61BD1323ECC48F63B309FA1D49485632D417A7646DE5EFB057EDB5E0700775F966C437A8E558DD2AB772B229ECC56B5DF54357980861B93 AdditionalInput1 = C34C24B9A0FF018B6968A132DF9DFAE7D3F704584351B9E9C9C87BF6286716A8 AdditionalInput2 = 9878CA1BC0C039C71BFBF7D7F13BC293DF59773BA356A0D5CD205193E0104C68 Out = 0DA8ABA26EEB678F326079CD1B2007CC3C8B964BD56346EF2E12C1EAFB62B56E4CCFD681ADB8941661AD3817B8244C66423C1B77788B89D3DE7FF9465F653A77C9BA31C8928E6BA70CA759F3F36FF9712FEFD749DEE371742E855C23078BA66B0AE0E6F830228629F8AA0F884DE0CE1F9DC4C4597D9E45FFE6C5456A3E6BBFC5 EntropyInput = 3E15D5BF5E112BEA8B23913734A8A9D9FEDA020B1F4F45FD8EEEEBB7CC8092AA197E6059EC1C755736FCCB1274BA652520B734F7A4B115F85148CD14C7994403D9843EFA570E753FBA1A37BCC00FA70F EntropyInputReseed = 9040C67CFF6993765FC6871F642EB6D32F53E5A085ACC30A5E0B4701896D151003A1ED65AB95BE6785A5716B83DD362EAE3DB5E91CF87504F5DA80AECFEA9157 AdditionalInput1 = A80D7B64D7BA904D46F0576BCDE17623A4973AA57F0F8A09455434486437B703 AdditionalInput2 = 4FDE340143560F97272884F1E727A31E001E700D1E5D59B8765190EE586812FA Out = FF4B42F37710305EEBE169F4D745878475612EA9614FF47358AEB5D945E5463D63386043F5D2D2A9E2429147CAE5E3EE3E1BCA732BC4D17D2C8263320D36F10EE713FC1CC68A4C081DDED59E81AA48099E9E25134E900887702C5F10BA348F1B526250A618C6A7601FF7381767F846CE6465D005C3718D09C9F03A481D1B7285 EntropyInput = 6AE80303292391335BF9C9387FBD3BF615756C9C27C3478C87E260CF97D4711001E16247DD4CAE6499337D82784EA57F EntropyInputReseed = 035702EF4E112B173112C5851D07B279309863740D38D0D0720223E24017BBC0 Out = CF4315598FCD6AF1315518C4BFBAC0540C589635273548A7B507E7D2E685E5947B87AE257E58FAF214F2B58ED10C3BD35F75F6C35DD6D441C93BCD42E71720102631B1A6A4BA247C175ED800CFCA6E1E839B5AA907604CCFE6F984F6822E001AB02DD6634964F789CB107A977346693F3244C895E840DFA0EDF7F14DC61D794F EntropyInput = DA2C406C1A40F1BE98FDB286078A927F606AE8EC91AB3A663FE213FD8F0523F94B49857C625F7A6CA2669ABA213D79CB EntropyInputReseed = 52C1C006C577969179CC1FEFFF1BB0DC42255C358B686C73216DA1216F82FFFB Out = 5B6E8EF0300712AAEB44A52F91CA2F3DEEFCEEA95CE28E8C4D9310125A7D259C3423B2CD662B3337AEDF7DF12719AF7BE6CACB3A6565070FAFC986C336836AA2E18C237B23FF19339B4B5EF704634F1626D66BCE9E72555183742B591335821CE9C3A95F2A1BEAB6B0659FFE6E940B559DFB8A8DF1A473308C3154584EBF9622 EntropyInput = 5B77E885056B4FAF9D8EF9C85730FD5075F0A07015C6DBD7323CE63EA5D71E429AC3AE89CFB286B31149E78BCED8CFF0 EntropyInputReseed = 0DA5AB257B389673852CDE4800C05ACA596EC57C25D7DA451911487A5BA6BDAA Out = 1D604F4D5BB10E114AED678A5139BB46EE6955D86E063D17CA5EF6DB387151430DB23AA0B48A343B2D35003D295FD024FC344E7C010649248469DA7D9AB7E25097BE35FEDAD1BA89AD66AF96809C64BA3B2EFE601C1D6C201CA55EA82D901AF146F200291B113FBB059A2043285A8D88EE655DA76F837908ECFC9BC0BBAEC1C3 EntropyInput = 4030B2A983A8E214C9B6053F474DEBB135522E2B0D50AE98441BEF99B93E63B4D6292C7633ACC7A17E797A149943E6E4 EntropyInputReseed = EA9FF3344CBA8634E8058F093510519C4CB93A1AB47C3123674295280A26309C Out = E98A2D67D2D52DC612437C5787ADAD2F5DAA8290423C45E5909455E755F2D4A729A6E6CB42F36B0E40571F1D7721B40E3D4F773D845E726E8E1E5BD9504A945943F334603F282BFC7C5D8B2A6A1C82CCA1EE943BE6C464BCF8A4DF470D3DDCD7EAB1E8BBA0090E537C3670F424438E3A0B197297A7A16D12A282558D556F3B5E EntropyInput = 947B3F93A601DA15AAEC58078D198C20C91379D5BF1C0DEA329691F47B3CDB4097692EBC8C9B045B73E823500EBA5077 EntropyInputReseed = 599FE84D8A84C306EE334A3B443005E33BA0F8F59B636E67D74F8C596558CF8E Out = 388DE4EE5C19AD972C650C865EC34F7DB669669D326F0C5589C5AB2410D64F2D2714843CF5A2288E3795FAE7F541FDA4BD4D4884014CC7758EC2973BCE26A6B4C4DA0911DEBA016424630D30D5F3536E4E7977DFC70F40B5308F38EF6E5A3DD7A060DA5C68CCE27505745F5768245AB3C31FDCC540D3767B9FA62D4171C715C7 EntropyInput = C868E7221FE565C13E46BA781417DA8CF42BEDC9BF5ECAB898F64F53A8E5BE2F49240587C2F9E2C9AFAE3A7AA7062080 EntropyInputReseed = A698203C5F5E559D5F08DF28230AB3B1FF4059CE8E8B2B9676880313D134F7FD Out = 64E69B9CDD8294573C67E06CD662662E98CBCAB9B8FC8C9AD7D366C3F978F10AF1BBD9934ADB9A31228D0C51A268ACB776E3DF0D9A5DC413DA6236E77C15F22DFF4109115E2E7A09D45D43F5A269104A717E101F2C8427049AB6588DAF8907E33168EEBEDECC4701906557F97FD34B724642F285C0B06ABC3CA15BE687C9BE1D EntropyInput = 5B75C3C8000A81721824E9676662851257FF315B9F2065631E4B1C31A824ED0F1871BF15FF16E94C9C8D93DA29515566 EntropyInputReseed = 994867B413459C17A1E50769CB2DC30A0012C8D594742ED4EA2C2AC434BE3386 Out = 2B40DB08A5E15EB1817F05141CB0B5864684EA4E1004C26098B483119BDE017526DF8D393ABD6A2602F42FE35224EA7DEED2F6403D92C41DF801AB9365CE24A6A9AEA908DCF6113E02CB67AE13015B6174F22CD94331A479AB03B7A19DE281E069A17B600C6649D7B88E5BA3F340FBDB537A9E4581496C8EAA40E5B88862C4B0 EntropyInput = BB4458CCEB0DCE7332F30CE90F69D82825B547BB512AFBAE3E1CBAAA4C172B7B60BD6A33BEE61D1A9BBFDDFEE60F7A18 EntropyInputReseed = E88A2AEE17CC491640F2E0A693F03EBC48A9579031861DF31CDB4264997F8A64 Out = 5BEA97A6DAAEE540AB6D417CA4587C198F589DB5AC72B4F1384B1B1D8C03EC73B297939F5A8B8240FD1033CACE0E971E3C3F49239B168576F83DCE89533787FCB72537B32F585DF1355064F7D737B6C252595F16C42D77B837FB7D4D44BD84DBE84D0BB5A4224487FAE3CA26E930E54C27E2EBDDE992E76DC4C407777AA4BD11 EntropyInput = 7E70381BFBA7807BC773E2CD683F90C7AD606DCF462767988B3F6C758F5C795D7E5AB4427029E99DF2201D81C3FF284E EntropyInputReseed = E0DD5B4E7CA72AFDE53C16B8225403BB6E749742F3E38896FBF8F18B7CE6F799 Out = 8AF27C163D25ECF4F539944D9450F5116EA8AA7F97361C696F8DC7D8B3AFE6FFC0201459A1733D9EE09B2E45F3B6CD5F45D9F9F45FDC662B569059891F2E9EBC740F78404A0BB1C46A6BFEEEED9C6B552C5C468A4996AD41CFFF77AE4D9896CB80AF27635A4E2A1B5C07C1B58B49C9A76851144E69037E14F7B805161329CA15 EntropyInput = 2E5432ACDAB8CA81EE56F3E69A0C748A72F83E11D18C2EF8FC8AAD568E19E91CCA5F6EB325E4A2B24C00915BC37D9941 EntropyInputReseed = AE3D7AC0622F7DC069E52CBD1584472979E1C8A96BF461C8D3976D8D535C10EC Out = FDA5DB4B28BBC5D2F6BD33AC98399BCFCFA46037478CF269BF359DB228280662718F6D4CA477BB1CACA567309ABAAB0832E7885884E86C4E0B017E8677749C5DB2C33E65FA538DF4AEC446C7CA724AF18E45983601785F9800A0C5B23FEAFBBD349D204AE54B40A019A57A8368F07D70945F22BE24AA992F930F92A626BB22B6 EntropyInput = EFFAAF06CD997B99783372C515672EDE1A741622A2043953451C33668E8DF465FB922910BC6C2AD0461C9809D18A23F9 EntropyInputReseed = 53CE26BABC294D2F1B48B58AECADAB3308D8711892CFA393F358335FC0F4674E Out = 8AE535A3CC00DA2C817E7F389A9BC997D8E720E394BCD3A6C23EC678ED9DA48D3D83E32F73D896DA582A5C2B0F44127B3F7ED36D91FC877BBE91339064890A4C2DB05F16B553611D6872C8BF4084344C5DAE08CA48172F9822244D4FF372E04CE99AED28C3944C47FA434E20E99730BAF2BE9EE85247F1B94B129C3F6C3E0FE0 EntropyInput = 4A3542CEA1B5A7B893851532549884A9EBA93695BE8D76761DB69831BD1053EEFF0320C47E47B440718B80AB616D7FFF EntropyInputReseed = 869AE8FF949A10C93C05D620E4C4F13D0376EE1E00C71BBA5883B3BC41F5247B Out = ADDA83C611883E01F958FEBFF1052B658B0C84F857AD8D7D18DE897DE2A8EEAF3953D9407CBC4C059C9FF9BFE67744E13406CBFB09ED31DC2FBCD9626129D0B6E4A80AC3C1B286D81F6F28183A3E8CE26668600560084F3ADED94EE57DE18657F44350F97532A7C25DCB99A8683AC3D632A37618EB9E2B18545C00B0C2CDC3C0 EntropyInput = C502A009EB41C8F8220666D4E23354B3D086C8F6E09628D2A9BBE072770C99EEBBFCB4613C4503268BC90745DF3CC890 EntropyInputReseed = 6DA4C12B0AA128A58FEEB87ABBEA04EECFB2B43C6293B8863DE316AE6ED22221 Out = C2A8784FBCE4FA6E15844FDD8A8441D6B56EBE6C0DB576D681E02BDB459E4BAADDE17BD0B87DFAFC9F92941D7CA899A13F7E19EBD492B347F7750D7C43E67028654748572DC91D2002B14427187CF33D421A56EFEFBD621A84DE1E5664DF1CB2E7EFC36BCEF03ACAE13B05EA105976F840EA759D68004B4043E8CA76D52C7366 EntropyInput = 304F129AFB5BA1E062BD6C0D859E7161E3B9EA53EF526F00329533B6BE12FAAF58565E9D776C89ABF6CDA5E77CE7D27B EntropyInputReseed = 1980A2D65B26B7ED3BFC2BA976F14F147DDB7FB18C8543D04686E6ADC020CF72 Out = 8CDA68CAF57C12DD0A2B628FE875D5E0BBA50981415A4AE2D58806AF4C23F05978E39E566269076CD43E36EAA1025E351395514AE50711B187EDE5CFD8458A7B8A7D9788C2120D1D71F61EA95D84A7FF1E04F514E8448BA2EA6B956AEAFDC3EBB6C1CD0C7B7EC76B958EEFB812ECB3E86B33A4D3A7B2977F66B214089662D14A EntropyInput = C558926A4DBB9F41E75689D9C8AEC86797C29F8C77E356F0331BED788B76E9B7CF83E7715826FD1489CC3054D3CD5737 EntropyInputReseed = D1207C7B914F5E873EA0CF6F06DBD02D59494F6C8D4C9AEF5AD180C9BBBEE208 Out = D3A7D78CFE76FF97BC54F7F694F72F312441D8608D3C1513FD28E94742CB19683A0270839B026CEE52E4924DEE999EE8CD7DD01EA445CF91008798B8ED64C8458D8678C344D4E3FE3201C1AF2FAE3BEA82EA3AF0CDAC8E77B5E4D7C2B084E416E5322366AD13E36B455F047BA464CFF287AF372297C68B51AA4701901943AAC8 EntropyInput = 010935EC2370E1F0FEDF365CD4E37666727CC33EB799F38B1CFD226B7037D9B1E09E498A94860AC567AE911BB218F36E EntropyInputReseed = D21A3B9A439BB26FA4B4009807C5CAFED3CCFF19B2B0608A29F0EF6289F27ABB204FA3482FE99B6670EC70B7F2558A5CE9CAA98113BAD174B85A719410010867 AdditionalInput1 = 4F61B22033E1CC256F5C677E91882914ABCA6A5A3F716AF0AB2C652FF8BCE5F8 AdditionalInput2 = CE1EB61F9AF9727844666E283F2AE69EB7C91D098535FBF2AC7B0584BA81560C Out = 503E08620268AFF772E06603679A7509B4BD590787375A4319FD1F7C7CA7261AA1EF336D862096B4CB98BA97C5E96905E410E719FE2A2DE1BE621C5A537D1596C7E20DB9B242523FC926E22E2826BDDABDCA1C0B8E2FDB32C87044EB6E7760C6634BD9B96D385F98FB0F8A273DC21BB7DBECC29FF69BD691688DB2A4B013576C EntropyInput = D7F053FAEECAD7C9C5854E7787F06DED1A95E99D292EFA924AEE5D5932358D2AACB8862049884FFB4A6CF4CBED236491 EntropyInputReseed = 8A0E005ACF307A471E05649688030E3D5938D99EB877CAAE90307FCD4EB61EAB59AC7DACBBB7223C6F1A4D6437F0E369CB663F9D87CDF227479D92BC01985BFC AdditionalInput1 = E37C6CD335BC9547D26FB63E0F5B49FEFA8FD7B9FB711CB2AB539764124BA36C AdditionalInput2 = D515894EF2B83939B1E40FE2FC6B6BC29EC21518859D9D74CC2F9A2A04F56B6C Out = 28118A90CF512EF8066D76FC81A649C109AD6AF6C06944CE94795C82006BEB72D14F20DF2169EB9847B34184DC5EE16DA0761D60ADE43B2F449C1E51D7517AD375DBDD47F6F254318BE35F855C887861BFC6784C4DD2BCE51D49E8FE62C51627901D756EDDAFCD11E06CF89668EEB3D9A68BDED01B84554C716D68164A487FA0 EntropyInput = E35E710D0F06A7CCB625F33144CCE716A98AF3E56A1D8581D019D4B74D5CA4DFB74B937CF0133C576EF950AD0B312AFC EntropyInputReseed = B888FF00925F94D36CB3EDD21BAD02DA0A2110CB98DADC3F56179AE8ECED85D7564CE208B8BEBF9BEEC74C716C916E28757E1BC145507DD6035542D188421304 AdditionalInput1 = D8D533C98DE81C8821F6CD7A831F10772363957F85F567AC81386D183D7A6D6E AdditionalInput2 = 52AAD64ADFA2B8D8BE5974D3D55BAB254AD94EEAC693611C90A47A7EFB117A7C Out = 1FB18D8F64680EA667B86230B3512C0843EC18980518174643B36B8FD65F7B903BB879DE70509CBD18CBB7CE839BCCB4C3E2B079799ABC9950C887C5FE9A0F733BE8118095F7A47620B03ECCE6F05C7BC90D65FFB270FBF2A6454C592A333E7A4E4C2E937EF6E43E5DB457B9BDA7DCE03AE9C69A37742F05E46083D75605A74B EntropyInput = 0C2C24287F264C1D5329D18989E7F9CE06B8A9446D26CD90ED718792B13DAD94FD01D038386B37709F8DA03579F82BCC EntropyInputReseed = 05B523CCF880BFB0DA83A05E4EB2EA28CC75A1E4F9E09C8A3959B18622453BDC85E06A8CA3A741821C3A2A8818131675136EFD5841CB96E7DDEC7943CC169FA3 AdditionalInput1 = 6B842E1CFDCC6203FA3750CFB3C722F7A85014C06E78DA8EA61F0F9E7C20CB4A AdditionalInput2 = 7BA4A1494A0B498388F94D1726B8BAF63E44A03C2BFBBFF35AD039B39881720A Out = B1001E78FDB26DC92E2389EC0EB5EB3059F44AB4F2EAD6C74A7615AB8687381898F5B0D838247F41786BB83C077713FF84540ED54061F4D00264699DF476873C0DD0C363B998054EDC64084EFEED7DCF28D7719979978448D7DCE8F8AA3868E56B89EEBF275F000A39C4CFB5AF16A64302A90986CC3042D8826F2E3F7FDB859D EntropyInput = 8E971002E21A60F8064AD8CEDD9A47330FEE3C4E5B6E88B2AD11BFFD9ED6BF13C36A9A6729BE646B2C875ACDDB0883FC EntropyInputReseed = 8B0838EEFE55994FB15EA657FD6BB04745EFFE758DAD3B3E7BCF56EFCCF33C1F3077373F60F3BD86D4FFFC1358F7B0E502FF6D64A2C6A23496A764F6C8BDA6C5 AdditionalInput1 = E9B308977E18472DCFE99DF090C6AAAB5AFA79D7EB76EBF6943CABEB2DDD4F4D AdditionalInput2 = 94DB60E8B1350E73982D7DAAD94E05D4D2FC2C718E2E52E9C0A71A998395BFDB Out = F7E7E1D16B73EFC12753EAFAA77B076357E42550C7B8460FCE581E7F687B5C6BF663385D7FA33F0CDE7ED82748B995E998BA19EB8C239A4674DF4FBA890F3302734574E9EA3DA5B2E8BD63BA24932A0BD74CFFB62C318CDB69652433841DA148711FCB6310BB6C897C3958757FABE71BD5324546AE34B3E59081CA4EF4E8FEAF EntropyInput = 6FF926E9716A555403E721DD3983D8D59B64B6B88EB1CE50ECB35024815822A60F98E56ACC675995D7838200306D0921 EntropyInputReseed = AC6D79FC6FF9CAFEF4374FF51298211D739BFFD583BF81640DE1C856502829801B7B4746B741A911BA634049DDD1B0A890040825A06BE1368CD9A98382323C9C AdditionalInput1 = 46DB3CE4761DDF2863CD8412FDA2F56D6DEB5106E071EFB1749FACC615AD6915 AdditionalInput2 = 7483179DD098F2250ED49F42D6D01637BF4A83CB2D0B34AF56274DB932C6E004 Out = EA8E4E1572889EDD2AB238BB1F16A5146B01B611DD7335DD24E02355AECAB4430D09607E95D2CECA2A99BEB75B288472F64A019CBFDB5BCEE9D1BCD06CF61F5B129473A4BF9008A28280510A6ABB67FB7670A123356DA428AFC5FD3212DAFAB0C7870B692D52AB23597601FEAF3FD0A945F1A36BA1DB044C50DB9D84828849CD EntropyInput = A6C473290C29AD6E3F7DF4B133E077F89FE9A8D9C4718EC419D0644E6DFE9B6BD794C462B4CA035EDC4B238AF9D52602 EntropyInputReseed = DB6E5E099CD68FDF9D128DCF1FA192187F1679673B350DC09E482062BC51960871224ADE83E348B69086241E94E1704476B392C6B6A8DCD9301B300C53789F9D AdditionalInput1 = 4928840D03AEA789ADE8E9D4C34CC8AB0073AA33870F06373740633A3FDFF7CC AdditionalInput2 = DF1505CE46AF209CF7F5D37BB652ECE2F1120E6B626F5D6D55AE9B722516F0E1 Out = 27C97CFA650950CA7C64BD5B8DC94FB1FD81AA5A94FFF370F9813AD6C42C5ED9A0D7EC5FD8E2A563EFCE5BCA9360D62D3941AB64210601153F3DF74EF61BC78108D0FB4020B7DF4E9F51EB79ACC34686F6AE0091B1E29CBC8EC661C622194ADEA37C07AF8B84CF931D557FA58C8ABE12EA2A609E3BD868A6E90DC7B33BD2FE1F EntropyInput = 802483FC9CFEA633F499B91876D4FC51F8FF34C41268463EA104B9BD0E2ECE6E667BA2818184AEB0D295CD69C4EA2A98 EntropyInputReseed = D81B4F7D2FCE470769CE6C3E5D6714BF8CF75C76429B523C3DBFDB58B2999F1E05614B8348B544E98187B65241D0B5418626A8CD7FB4351A6929F67DD116624E AdditionalInput1 = ADAF4E3479B2F01E3E5E680292469D94185A87022D1F5CCBE28ADA42B73D7AB7 AdditionalInput2 = 12F4EBF97589829540288DB4F7D31C64E84282BF65B39FDE403127DF7974A0D9 Out = 00FA6F4F4DE6F60EFFE2B2EFD29DC59366F009E1D4251680F625C37EB67C1CEC978674EA1550C977C59F2B5EAC2928FE94EF06B956798E2EB653263CB0049926C77EE65D7547EB6211042682E2D9637D5399B3AB86778A5753490434A79D5E34951B843BD1503E80AD050554F94386B7B4467878A993A376B60E9ED0E20983B0 EntropyInput = E4E381834FDABBFBCA3B92F5A0F242F4BF3DEF930204B0852ADD9736EB02C871BEFD7A91E42946AEB97D3B09ECFC3FB2 EntropyInputReseed = 3B48305DDBB20419A7E6E705C77AF7606A59913D14480284E9CD6A9FA98534DEABA17F3F6005A1F5D519E63F78C8FC16B326FBE090DD0513C5E63E572B37C57B AdditionalInput1 = A536B1D3B0524739C926BC318E05A63093CAE60F16FCF93B2B685C536CBC1CF8 AdditionalInput2 = C178326E376DDD673E5A3C65009780C5D38D9ECB1CFB5B7C13A1EED5649033DC Out = F56773FC33DEE51D9718F761CBABA258664684D81B73BC3607C645D8E0303B1819B3AEA30810F76F5D3CAF0137801FEB89B1EDB3D76F4AC8D064E1BCB3B698E5482FBD4FB78F53CA3A73FDF4F7E35FE59219B98E12F9021E76BD67C62DC292DEF2A2513DC2C643616A9CBD9B4AA332225DCB855EA144E30D4EB6EE4D50A45D63 EntropyInput = CF6C7092A50C1FB07DFB3591187DAB6E8734D262DB5EF0E4E57A1075DD0707078028219A750270C0F7956BE59E299FDA EntropyInputReseed = CFA9E7C598606023031738A4917D6478B7AD972FE95FC0145D094930633BEE231F9AB7B7491C497910615756969B85EF6B887CFC9CF62FC9B021F1EB4DEB18B8 AdditionalInput1 = 93FE65879431821082AEAA6280EF17BB6426A347CB5FC3C9F35D40607B2F0D54 AdditionalInput2 = 8A53C39AC336AC15EFA3E4829F2190458C9D64B85764494A861957DC8B9C6E86 Out = 8EEC0B588FCAFFFBFBD8BB5AC05742DADE824C24ADBE5645B72B1F15391A0E4AA56BF42CAF238653B2B2ECA05067DA0FA3F7042D03D856630FCCFC401D83A245F5607BFF36D75CC7FF9588F334B6DDD795FB0522624DE2C9E9532A7B050841E227EBD43B8C8C4652E7807F1D55968BB82D8FB06FDBBC6D75D8CE0948B1364EBE EntropyInput = AA3B3A225D390E97D96D21529A03BB38600FE88BEF555FED243A08938D30933B11B464F29F27598B8BFE2489456FF273 EntropyInputReseed = 00BD373F31EE8A2089E07BE076F7B2F4ABC5B6304AEAE86FDC4552A278DAB42B3ED5F777F1211F1277BF0CAF8697B218484AB2D3B8667C2390D22CED7ECADDA9 AdditionalInput1 = F5D41C3233271CD406E3F79C3303EA3549DE366B47B297D64936C9F89B129A13 AdditionalInput2 = CF80281F99633AC153CE713DF0CDEC8920B938EBACDD7A57B0AADADC17951F89 Out = DDA7286BDF52E4CA44B362F1904E1A1ABA2B071ECB8E7B6A5C72F205FF71D8DA8633C5E41D368436A7E7A5C001AB1159EB061A67AC89C9302EE1A58FE5D05A92919E083A008D6FA5E81712204F640E98A7F062D855CF4CF22E56A19EE5B01708F4EB1C3BACFDF1EB46BA0909FD89B3AE0BF2A6134984C58E4373B2EE98D78049 EntropyInput = CF74894924EA5B288CD54A7B7BCF642075BA24FF799295D635A38C9F7224EA8221AE0C093A3E346A5DF15EBA67A7AEA9 EntropyInputReseed = F8975BA93B3B9E4EE70B3362DAD605DCB773A84AB4D3D766AD75822AC136D1F29B584ECA3BACE4BD3E628D7BD7827F3773B0B1CBCD948FC6E10FA1965416D5AD AdditionalInput1 = D885B3F20E42CA6AE6E2493345433521B846C7DA453786BE724238650A44DA65 AdditionalInput2 = EFD8EBA1E4A50AC704BFA8A703C2C2CAA32D6A81472F625D65C913F49FE3BF80 Out = EDFFA433B06AB53176EDA14AFB729B26FF291B731913E2557FE602061FDD0F89553693CCE24FB9489ECA41AB79DA2622921516DC6A08589068C3B9C9FAC5E335FA900E9B6C315EA06143710F165B9B03CC94C213B7A61A82E90BA916EC29317D8858826E1DE418E469A2919E063C48E079C6E3CF415A46C99F8264AA807306FE EntropyInput = FE6021F842CC2F70978B51A1F180140DAF10C4CE0B1EAE514B52688536DB2229B1EA0AC0813AC05C93EE4355133DB7F3 EntropyInputReseed = 15226557CAD127382179391D40FCCEF56BB7ED431F61EBD4BF2B2756EDA546094E7ACFFE9C7FDF75978675B3E41EB11FE7DF5AD8DB9A0059CDB505DDF2D9E0DD AdditionalInput1 = 06887B83FE589C597FF9AE19C5D054919BF062446D79F011BFF278BBD94EB860 AdditionalInput2 = D48EBB600AAB0759C0164AFF792D96A8D9529F4CADB1673DF569A16E307C5C17 Out = 9FA3530DC65BD9CB39BBB3A243FEEA175BB7C57250B5C25BE5F7AC270997087EAAABAA42FC39BA5A80A17A06AC314882272C849E16E6A16035B624F0874F5E81206D90D72DF14E90359E51062292E45D6D85F676E07CE3406DB3AB3FBD2EF51C7BE90412DC42AF3A175250D30AC6EE717FD34A0235786BDD9CCE8A2CE51C46EF EntropyInput = FD534CE1F823A48A15710B2E382945464FEF1D7272052033DC6F8E3C554A77181BF5269CE3AF10500E6CF62D90814066 EntropyInputReseed = 7920B505B1C5175A7F4F65A3091EC5229D3C4315CF2782716F1C60C57684DE0FE6BAFEC41BFA28CC7DFABC6D495964641829161780767A0AFE2A3842D07938E9 AdditionalInput1 = BB51083E7B0D125B06143EFEE708F1802D34055B32FF1F10D7A2020E2CED206C AdditionalInput2 = A3E78B7A4797FF5F8BC86D419AA1BBEFE083BC4A06C70A09E63B357E25AA55BC Out = 61676ADDBA5ED6B7BCC4D2C78946C6EE188E503D8724F60478D5280C96EE92BC2B1A59590B18A5BDFEEFF4EA23DAB8E1D43A5A47B1A615B04883550D6DD46D318121E44CEB4152BB7BC6571B41898D17115F2C213C00D01CB6D70EC72054BEC2FFA9E9E2DF67021C9D926A25DD9DBBD13E72DE2F85106EDF782DF034DC7E7393 EntropyInput = 3358CBA51014877F9FA038572BA2CEBF428BE3D555C298E33773651F6EE874EB24971323FAB7E282858E91C5220C3CE0 EntropyInputReseed = 824F9036600F199DEFF4B1EAB1E02CB624C82CE94313D69E38CA3EB5C9261997598B2E2EC7176B4B5D8A8BEF5B8FCA28666C561C4EF595F363C18C61F819D6F3 AdditionalInput1 = CB2F954FF3A2172794755782FB98CEDE181068706A1182C9903CEC5DA42BC0B6 AdditionalInput2 = 10BA25641AF00B5605362D8C9C297ACEC5CA1FEE0829C535789A8889B44246CC Out = F4B5A849797B8F20EF9DC24BBD039FE5C3A15DAB353BB79CAE01013003663E5F5DD723F6E816C329CEEC784ADEBDDE0F643FAC2F37C36F5542B4BDC640CE10DF5237068C832E520FF6C9B39E2F755C7A01008D44E0C343FE483C8026CDE4DD1C65170E597CBFB768E5DD563613E282EBFD66F286A8BD4CE248D99516D865EFDA EntropyInput = 633D32E3005F78114723B3EA5AC121BA74AA00C52D939667E30C3351B38549F737AFFF504A2D8AC168C68E24D0FE66F69F1699C99D60B085BC61CB110EF8AB590D82A970021C3C6A5D48021C45DE4956 EntropyInputReseed = 3E3347C547F17F4D0B9F46405A54EEDD7E980D06A215EC15E89316AB743B7547 Out = 6E38E82962D707CE9A6AC383A738A748F975EB785611FAD5E3F5A4FE44D7B59A98137A2BCDC35F9EE9A1E21BB17DF1665CD1397625A177247E2E329A660140636141560610A368BFD499C2E25BE318AA4DA9E7A352D115DB8282ED8D79ECF9CD820360D3D2D1A58A93E040F5554887CE6C9858BC2BB102249980A858498ABCDA EntropyInput = CB20152E99D8CA5E8095A13E72E0C1BB9E6CBEADBD0BF4E70FC6FA3C81EC5D0F0A55D433D3744A2F381939BE85C97A98B5BD7429591E5E2914532A7DEA75FF76CAA39F15279C73092C2CAC3B0D28C13B EntropyInputReseed = D08CA96D745F7E3A9F2ACBC1E800A98195522A4F7C607AAD62F38B1F63354BD1 Out = 03E8CD60768262CF4CC2F295506C24F06FB3FD3A889C71521451DF6F2EFA0747FFB87578B71BCFC37D3A43F85AB4E5FC02D21A90E85AF18D6D75E9FA95F7F92942A293DA5D31A6B777F110FF862791428BA01B3C1B2FB4B2366318D244A91EC130F4C0BDB8C40CB7A623E5ED020BB305A38B134712151B4891DA7FFB06912F4B EntropyInput = BDCBCF6D3475AC8903DD32CB125436A6F4CE7464496043A180B260D2A00EEDA14E63EF1DD04D3E6CA8A8099D7E3DA095E0B7816CAE8674B87308541FDD65C0F811B7808F3F2FC15F577D64748EE36D4B EntropyInputReseed = 041D731B3497B41909DEECAFFF8B7116085D8EF28C32F4233F6C660E77A99BB6 Out = D10F8E09BA935269D8C38762ADCAF28308D25DCECC19FFDBF793A9C67585CB791DF65A24DA8BA2B77941F701DE863BE3D6F3C9D13F44459719387B5136534663862B70C7DCF99131DE592530B3CEDC616898D3656E2064D879149DB254D26E72C5466AD55B1AC6FE524386A099AA642AD096A0933F92DB03E94170E05DA500E5 EntropyInput = 0CF0731C47CA73E8C42942CC61F998F5342E318CB8ED3B1869020E3DAB1E1267604C64154F914ED0CF63C861653B78D43050B2DF2F59763E443CAA925A54DE1E5CED8759B554B5F0F68CB01B4150F999 EntropyInputReseed = EDA082EDFAF4F9766DE29AE2CB930FB1BC26BDE6D18AB16F66FBF4B06D3E7480 Out = 39B3F47C024BC84AAD8091136D341EBA3A89D06577AA4FD3D24F8B7A5BE4280FDF62353490D5F66C1A7D57CF198A633756C0907186A71A4FEA41C3FA42EFEEFB0AC285EA8587F1A8D8FBB783AE627C1E858FFBE051D6B7A2A518A24E71D554E8A0DA3D54BC69E4CA940B7CA320C4BC44DF1E476E05E489A2C668702B0BB8913D EntropyInput = 97155A624EE42B974C4BC9E0B9A737EB790CDE2F0A93F8EF2C6FE72015C5276B444DF2BEAE4AE6E9A640416FC3948DDE625C7EF0FA30E0CB5C28FF3A2396639324292B20069ECB1C0163D966F2520E61 EntropyInputReseed = 401B91BBD726EB24EB19B4F36288192AE07135917DEC75B7F7758177767298B7 Out = 8B1C56CD415DDF123BC5BB327F0EC4CF53A649831D7C0920E742033CE183A4423C4B162EACA3157CB194DCE06A543BF155164C7041750FB3AFC77892BD7B452A20B6489018E5369FCE4E7EB79354EA8A033880A6DB0A79EE0C1CA15D807512312C3F2D82BDF0068364CC3EAE763BE24EDB39356DC1A6D1C5EB093CDE4BF9A589 EntropyInput = 88E9BC0E56BBBFE8C07F311B955D2B877FE7047F3F85AC83F9DA68AC2ABE36E22CF7593A98122525C281D3CEC1E2B94C0D28961B6ABAD30191B21470BA1EE00DA1703790DD8A15537397C73E80EB7FBC EntropyInputReseed = E32852B81C80F37D79CFFD3CAE785910E79232813D174A2D14F0BF275F31294B Out = 4A6B13BDE6CBF866D1B60942488CEF4086367FD4E2445F73EDEF0328F6941D4084A4469862812FF6E4D9E4192E29D59D562E5DAFA0AE10944F8B62AD15A8F483D6D10EED6C4FE42645587B6125D863653710BD6A21277AE449B7D2A979782974A731DA601B29BC8E31FA121B8B7E95D1EB30A75B3D4FB2131E17FDEAA0395EA6 EntropyInput = DF8188FE2B7BC5ED26F747C93ED48024E3ED627530107D94906BB2DEBD4FB92B0DD750C74F8363C14C172B4098F520588A9BA6BDB3059EC88BB29E1C516051F8F958B3C7751FB37A616E9D4A6CF17A79 EntropyInputReseed = 1B2145C0EB75775030D1681C848B9249DACB8137A3A0FE26544D17A2374A5182 Out = B925C27C1B2A82E6969A90FE4E4B6F27C369E82B4B03479A9A152ACA1288B262420FAA6C62DA1F225DC7F3125D42885850788B264410C8149EABF6BA164C1732A2B60B77A525EC745BAC6EDA51EC7D88D11B40C2E12854D392E7C6AF2FFF7AAF1544AB306AC31B6D971B70A82A672C81E928204D04960EBFF5BF5E38AA897F23 EntropyInput = 6AEB84CF5F72982BF7B1EF4CA16F8A27965C35B2A55561946C6D2CF6A6F9E41E827607B806DF2C423741209BED59B4EBC25373B61D8D582FC268CBD6493A9161EEBEDE96C43B0295281CC8AC473824E7 EntropyInputReseed = 57548126381ED8626705D3537122800C4CD9EF8132044DFD0F8D27D5EBCE55D1 Out = B20C3AE8133B8720498C17FCA0B9A2F7045726FDC15E71A6D39E189549B02D3992A74BFA9D68ECCA5FF171890EE5BAFC4E59BFC662FDB2458EF244E54E03FA43A0616797BDCA83B6EF8F36DAD280C9DFB1CA56D3AA5E2DA32AAFE2F689F51A43C7547D24ED94D02A567F7855AAAFC8B694EA5F0BB5602F72DABF8656E74358B2 EntropyInput = 49CEAB47EF95585AAAEB98064C61E8A289EEE5412F4AF1FB6E48A12358F9CF67D48E4A8A612CAC57FE7BC1788C64836B621E313B133480D5C471BAE8DA097A0333B2B2EA23F83C1B102850D411D1515C EntropyInputReseed = 84407B20D0ADC22C07BF2494080AD286938B2128F824DAE3E44D3C71818702C0 Out = DFB9CCD2749363FD993DF5DB53826DC36ADF4E040878F6851514466DD7214BA70D35F474B22D5D180D71F8CA0049FC90156D6D796708280CE1D225184B06DBE3D798B7B9028562D222F11EE8FED9A95587A6536E907ADEE3102B2F3D92DB246737A9BC71AAAA4F40CDA33D33A3379D2E8BFED1760EC12801E72A384B748FFAF5 EntropyInput = F322B258C62951D37BA680ABC49A61983F3FD89973940C1D4F0765C95D0D70780B79D5BEFE4285A73EA4B48E2BA185C10532BC7E99709006AA191B379ACEFA1645C67D2F5B61F13F36F868BCE444A529 EntropyInputReseed = 2E4E16748EBF365902D910A01D9CA24AEB8E3E5458EDFD88F6B909C1FFC7468C Out = 855EE8E0060CB8B4FC5692073F62CC3E19A19B89DF2DF97C2A21879D74571D3362ECDD1AD9E46458E35F5F3580E766067E3D8F7258D8EECB17A075F7DC7523A478B5D177F673659E3887670EDF6E8F0FF75E26D41ADFEE6AE28FBE5C2E247E1036241E1F5BF316FBD9ADB3C15930E8425AE75024C277029972F0D6C645B4A117 EntropyInput = 33A68BAD0FA344FD6A46F75F0428CBDF2711D3F0C7EF0F6A395073ED70897BAA1892799FEB410B9DD6E69BF4403EFC20677ECCD0C6E01A263FC7D2E2C2D0C6294A307BF3EE1BA35372C2166D04042972 EntropyInputReseed = A6447DDBFAF7EA07E10A95DB1FAE3EA86D103CFCDDA550F1101B02DDC5AC460C Out = 2291433DF6FA572589C3A6513F381AF4212787499BAD0864CB36D0EBEE3B56E340AB7BDB9F3B0E0D61DBA6B01435772108BD8921CFC00BEBD20766944184046A84F56C4319695880D24345ACC64F8579D3CA30C1F54E411CFF515ED72A8FCAA5D2A15FC2526D5D116FA1783FFF6D70D156B6E33BF31D210D3EE79C44B73EAA7E EntropyInput = 3136F442DD3CDC249538BD5F0EB355C7670ADD6427D1E180317B7D6496780B83836557294D844F2180D37AC057CBB8694834C68E72E25ACEC7CE577EFD4DC9746B8ABB89A446AD39DB7042CEB6DA9CDE EntropyInputReseed = C66A4865FB9B0F86F0696D4A2E1EA5F7A393157D096929DFF45F64E745D06A3C Out = EDB81168130EC433016E07429374073137E0EC1D1464E63AD2DD24BFE5CB763AA8793D8FB32EB2C70EB670537FCE9F7E53C42D4BD85DBE0B2F50F440CB132CE6CC46FAE10869DA2AE6AB8C10C3A1FF2E4529E46C8F843E0CF931B770ECF0D0639F1A5D9394299601714CDDABEA3D004D24DA005666514848D2FE0A1C07C78F11 EntropyInput = 2E9BEB64FB0FD6FEA59B5873DC0A946E8AF68AFBF8F16358124B4A5679A1A8DB05FAC586D88F7DDD6FD849E5BD9332E181A657D896E294DB4977B52653B8EA29C89EB2CDFDD995676C8135BA6E8DD31F EntropyInputReseed = 0CC81F757D01427366BB764B40378C1024CF88136BCC36243CDF111C28D976F8 Out = DE247230BC5E805A6788A4CE2BDD428704C07668631F85917812CB04EF3B7692E7263A433A66CB78504ADB04F5B60395684783F41A3C937AD0E10CB69C4E8095477FF4378B8A3AE06C9A03E985BF14B999D276A45C27762B4C09C53872FEFCFFF03496C1C8833DAA4BB60928B44A6C63AA440403515365907ED4D6CC8787B892 EntropyInput = 5115F68FF08532ABC3077B0A49F9EB9C2902FAB523439FB689157FF9F03997AF41DF1AC01F8CA029FFF6034D57D093D01E92F8EAB8166825915A56BBB00C4B2577CDC99C36126269FCFED682B12B06ED EntropyInputReseed = 0B245E6E6ED23E171A02D52F1F1A520ED50D67AEDCF999A9063EAE51B3B33E08 Out = 5B1EDE46C58A3D79CF6305AE59FCDEDD1F88F1FE3514F6B81667EB659172A120B70D128D23CDCF2ADDB9B97CDA137AE302BC993E9E405B5085D8A0DF2E4B9E0F4ACC644A0BD49CF60DD2170C0EAB8DF5373978D89E415FF6891080AEEDEDE6266EF122D448A0B20574CC511C3BDF35384F58878A04EBCC862F2F1DD3C93A101A EntropyInput = DC5904BD752C66E025072622824E4E789DFAFEDCBAAD3356A344953E002FF8451AA563883BBA444C88500ECFCCA2AF94AB754F51C03F29EB7703CA5E4C8B10E168494A1F09B544175BD87B687BF69F7D EntropyInputReseed = BBBA280C3E2207212F18F78DBA2862920C2E1B69B8C9531DCF8A5C981BF43865 Out = 2F7D0053B5083AE049524F18A25D0783DBFFD2E531F673F87BBC2871C0C4BFCCBEB544A09DC208CFC7582B4884C994BF84AAED1B55CD88E9564302088CB54992C40026CACDD02831926D11BF1994E08EF2E940F1A7ACC1CB3BDD4A3AFB2EE3A7DEFEFB6BA87A5EF1828C840286631CF1C88422BA90E3954B421B0A869A9FDEE1 EntropyInput = D712E0448C7F07FFC32CB24D4A13980F63A95C676D332F3D96DFF8FAA867286BEAE6E959651245CC5420455B264BDDC982E3CC515480A6D3FEFC6687AC488CE04C0CB0361FB87098104355BFEF4B41FE EntropyInputReseed = B34A0FDBD1082DF4FB3404502CB99A2B564B7A7335E485A907693B8BE256DD10E500F6F8AF3C4FF61F46F933F80E80E4D08376349511DE5A2D3394855E5EDF33 AdditionalInput1 = 87C571B98A05B372CBB53429A37D91295F6F8892813BA23C3C21327F83F9F55D AdditionalInput2 = 72D1895E1C4C3093452447CDB3519C8DBDCAF90FA0821AB5CED0079C03AB8DD0 Out = CE50CA00CB699B6DFDF0B997B8A425D5D665150579C01232D51B6B296138FD39DA0349C9FE1E1C47CB2589342CC9A9DD9D17671A68A4915BE152826C3245D51D87B37275A5CF4BE9B4C90BFE752065EB93BB99679B25ACE57AC6BBD4C7A30EE489CFF74F2D11A38782F05301DB7C60C9659F08F237DE354FF7A8EE10B8D93460 EntropyInput = 6F293C9B5E4005039C112EFE7B94E8E4FCC7A36695811A3748F0D1D3AE36D502F7EF8FFFFF776DBC605690B39E0E6DAC35DA17CDFD63115695685E39023E51D8496978B4EA1486F35A02AAD633A43126 EntropyInputReseed = 8880B6D52573F3F0D6FC8A67DBCCBA759D5ED4DEB2E9B54916A50150028123117ABF3AD0273DB79FB7633F0CA83723CA4186EAB6ED39321F2F5175702ACD324A AdditionalInput1 = 89D21EBA6FE32A7D16A75156A0866A88803826AD541063A1FD4CDEBD9F962FC9 AdditionalInput2 = 4ED140CBA667DEB14F2B404A69CDF10F2A972887FAD0C90FA4FD8025E5B82FE1 Out = 316B0353ECE29F40CAF3DDC577787ADC540FB25BFE0ECCD6BD2FDF558A5CDFB1099028F3424EDD01B85C8F174C2A294DA9885986C4A90361FABDB62D5BD20D31E21A13F2D62FAC098DBD0D2121EB2AFC53C949F5BB9279819C3A7A3DE8DD05C13B6C6CAFD67CE08182BF3514F719729AED4F6E5B3736932A907CE8F8DE7D099A EntropyInput = 8D15292A9622A61528F93B76237DC11CF2185D7AAA61DC58E4FC9F0FC31E566AF96E66F2AEDAC2FCA559A123E58FB2B75BED07277F3B91903D9F7664CC75495A8358EF071E5CE5696800A72651B5B046 EntropyInputReseed = 54A565F6C99B4EFECAA60DCFB6F4EAEF8FAD85A6D6512C27BB3437AEE948EA7B7494D01AE8B7EF5D1FA485D0E91303B273A5BBA384F9B1B880B4C1ABB31DB940 AdditionalInput1 = E914E2FED24F64D275F7688CE989895E5A4A41DDD1FD3F8A60CE7527C6AB692B AdditionalInput2 = 2FE9013F707A21F6F5C574E8525EF09D68FA9862E7C2B45D313278A2CEE16D41 Out = 034ADD0D2209C3BA4ADB562179DB116830C1EB994B413D4DBA5A6FBE3A90B3616BE66C53B67E4BB16C63638BF17E0D7B0F5C186229DA9AE0BA325FFBDF8329BD67289915E1D00252F6B8C8D492DD20C6C73721E8FD9771E0F7F26D514233D0C46EE71E21AB89A3A4D8D60C03DF48463AFA32C5C13FD4FC9F70D969E8FD0C5BE2 EntropyInput = 18A6A899F8AB20F503767086087FF0D44905C3840DA5F52524C701E0DF236D0D137DC9F64690E9C1CA32D2FC3732C18CE3FDF4974DF11FB44F9074A307E0EA75008021003D21D684BDFD61D836E6158B EntropyInputReseed = 078F8FD1C981F0ED728B179417FCA212EA3B1ED0BCA0B32DACE0D1C8410680F63D1DFEB4A9BC869BBAC38507A1F937DD9BC890B8BB2EB8783CE3895F5E507901 AdditionalInput1 = 6D5B3A99A423F5B2802FC99C5E39D6E0EF4135CA418471B598B26A1DF666F3D5 AdditionalInput2 = A7B3504615C5BB959E9521CC12BBA986555EA081EAB4A0DA3F4C1AF405725107 Out = 433E3FFA01E95F68631D481F8B936758FEB0339CF315D62DD82B8A25631B765B8E690523B4D27E4ED3828EA182F8321F30D3E51CB8C5D5672CD7673C021FED368953FB1016E160B9E9824E7C31583F1F231E577B67A5C4BD818CFFA8483FAE09B2BEB743556852934857F25FDC4328420A71C1AB6C33D069A7DD493C3CAE2213 EntropyInput = BE5EE9CD971A6B7E8849BAADEB26A107DB476145D8937E2F5B240010DA249F8FA02C081CC23904CFBE9D402FE7C02D84D0C60090FC230EE806F98134A06B111D95E48D7D03B0E72656AAE6675D2A0142 EntropyInputReseed = 40A5804186A602E5499E53AAD53191D0D89D57AC37E30BB33575F79EE1BFA7ECA0DF173FEEE84E66A41CA56BF5B3F7FF234B5CD4BB01FC8AE1A1B21136010055 AdditionalInput1 = 00A3902170FB86FE6E42F846F0682E055857DA3EA7FDEF31B015121DDC36E905 AdditionalInput2 = 891CCA343E37FFAA231856E0E95C3F137F8A057DD0B05648ED368B8A0CA761C4 Out = CDBF6A7E798ED00732D3C7E17261713CF86586320B8D0B6D06D4C1F67CB70478BF102653BB292DD91D884B2EAF7B40793118F2A6BD0B90C7E2E0BE05CBF5ED438F0B1B089A1E533AF9EF523DC244249A28311F5F3A28970C52B0D801F2AAF98821C32642023B6EEFAD5395824F36B3BA477258EE90A0AC599203D7D7F15C9C86 EntropyInput = 92C8D9C71A8AA38E7BAAB774568D8A4CFA471F74B1944F83E3A0D39FE30BDC4A07777F7FF711B971042E5B7650CACC5E1CF505B1CAA7C925126BDE4B8183312AA7925969B48AA69E281F192E30F022A8 EntropyInputReseed = 44B72FFBC7002178273DCF09E244822B264DB47831AAB26D56428F1E0425FAE2F6F2155C119A28DCE060C301A48384CEE69F89F78B776C85B5675F9FE2D5C150 AdditionalInput1 = 163F865EDCE5D85678A3AEC6ADA86B12ECE42D19D3F686CBB30478035FC29C86 AdditionalInput2 = AC05887FC006BB57A006C0248F3FBE3516205C3F20BA8DBAE523D0ACF78319E3 Out = CF89E3233ECCB980FED8718F1DF43587AF92816B4189EAA6391164E7602408F8F4CD7F0ABFCDB428CE6997788482A888E34396B59EA75B111A25471A0FE1E7E4C066F886B1C1BBDE7F58ED749A2B64AC77D693919BDFE79D6DCD1EF60ED110CEC3B73AD0A7A6102C7B7C992D6602569123DF5AF729E399CB467B794675460E52 EntropyInput = AD7E741E71F9D5BB73854FC9097E3A54CE55FBDF0B8AAC937D20C615CE3291409C0E34C85C932991CD39D122A311A8A21A9EC02F3C591522534559534AFFD895DA48AF9288D8842F066D905FFBD5AC32 EntropyInputReseed = 7EA1DACC7A285A45B4492E717F2D1A525ACA26852C19C09E2BD6E66F44E17A76FEA55FFB439832BDE8643E1F249C0FDEA9815D348444986EA11931B564BE049C AdditionalInput1 = 0232C4DE03FCC67D92EF15E06DD92FB05F1DC05FEDFFDEED8B5317B23DB49FF1 AdditionalInput2 = 220FDB0032DA68B61D2244009032190672C7EB30BF55206640459684E7B99635 Out = BDE4D056ECF8128DA1E7AC39960D1ACF13DAA995F440A79A93B4C01495872678BB5ADF5563BDCD929C215DE218B081212AA94F5B7D36B8CAB4A9F40D32D699995E2846101648202A4986B8D8AF826B6083E487701EC113B021FEA8E1F39F2B80BB649B9539417D6358C1D17003A16570169B5EB91183EA13232DD5F960CEB6F4 EntropyInput = 8C5536AC55F0E705F381BB152650DD4D10CA8338B45C0F1736D4AB6DD79D1D9F800676ACF474926CB720063F7E96F932FE2C8C5EEEDBF0B765FEA797786340BB6B3150EC605A0E7B5E4B6B54D541417E EntropyInputReseed = D7362E14C62622AD57FFB20A860D4C4ADA44997C046CC831F8CCBED7C87378EE3EB7ED9950A1AAC8F2B963B66B7855AE1E8A94CE510412911E2BF0D1F3D108E4 AdditionalInput1 = 66057D7AC6A7F64773BE3E67F76A2EF465CD79003F7BDE52EC8EBB119C2F02CE AdditionalInput2 = B68298770D51A6D6A1FB88E692F79ADBC1A777F21D5FA5A630862ED6B533EC75 Out = FF5D616CD7E297E2C1DB85AB271A4CC121E150E7ABF07CFF82FDBE79DCBB20E68456F212A6B9DE93F9332171F44295F2D95EE4A5B32A3D8989929731C73C7F4C4B17A86C6CA2F5A2B74FBD6871A0B116AA6C4CBC1FCFD87C4E1ED524C4FE6CF60B8AFB5957AE5387C48ABF6E4906560A561F25B66BCC95D3844F6DF1F5510B79 EntropyInput = 4F175052AE1A80E85F3D41BE33CD05030BC7D07C62BB760972A1E164EDFBB977B1CFE9F64286FD867CB41D4C13F3E385A0472B08106CD49CC58C7C7DE2D1F9548B291E4347973890AB83C68FD2779E43 EntropyInputReseed = 9AF986A052B5A89F14A4740906223873A018D0C418669608697496B5B5FC6B2E4115F2E109C2B54369CD2157033C9226C76DCDFCA1FD1A1A4DA7FAB55197C5D8 AdditionalInput1 = 929D0C117C4205C22F2B959365FFB045DD2A25DA37EE6B81600393E2C5E42DD1 AdditionalInput2 = A5CDB09BCC81A178BBEDAFAE82CC970AB7774389C31D9FD98F572F4BECF32F14 Out = D512B263ACED3CF1E5D51FFB482E0B90618702B2F980598B2A6F80E81177EE65F6EEEB51E9104A11B78FCAEB0A136080A4986CF5CA6DAC85103DBDEE1A3F2227DCD14CAD7677B7069B68D4C5DC57C53010C3A0F4AEDF2485F5B5DBC4276009E781B71981DCFBC6A534FA0330B3DC7EC54613BC8206C921BBF11DF3D74941B8DD EntropyInput = 7F0F1CB593E4C8501ADD6017907B432CAA4A6D56C4A1A3DEBD934E2ED641A77A717806797227BE88DC23033DAC9A231ECDEF11FD6B34E7DA48541AF454F5EC020D258278CDC2D45C0312F1D4F2EBE82D EntropyInputReseed = A110B6B21B9503CE7A92C1F025273F60B6F1BE21418D27861A959DA5C08E7ADE4866870D939AB0B2AD91F5A1460A48811FF5A32ECAFF1F800BAC02AFB08B533F AdditionalInput1 = 97DF0E1434A083BD2A2D81058F0F9888C805AEC20C0BE3789DAF4D4408791596 AdditionalInput2 = 94EC19C538E58C6FACD04B20A397178F6EB021F36A54B2592CF95359BD62C3E1 Out = 28351F9D0DAE8B4CF0707D463665F4F5D17ADB2877DB8BB2E91268D88E67B9ADBB56B929CA34E51487E63A67B791BA913D8FDF11157171B2D32663902A4C0644D2A63001E13AC80A1493EF331792F198DFC240CE91B910304619456623E3C65A9E083865D48E9B4B121920DF54E87E7B6611914697BF8EF556CF1C70472C30C8 EntropyInput = 261EDCE638D08160F10BF4019F15988F8D4DA2C1EDF5F313D3A1E09EA8211E93EDC31E7F9EF28C97FBD16E209C7266D2BAB7CE265DA02EB532C583A88A8911A9F444178C408902A8EA73613CDFBF7072 EntropyInputReseed = 75CB2BDC464F2017CB7998C37DF26EFE8A9C99A7B8B31117FA9BF594EF8598D1B79D745DAE5240489C953FA03E86814F1EB086CD8685E143A4AC009D64B566E5 AdditionalInput1 = 1EF3FFE5024F3A77EB67C1C9FD001F4438E43201EE29A0AC2BF7FC37A5F0787F AdditionalInput2 = 17CA5281DBBA08F86449942A95125A41343522D9096CE130A2473D197B0C4098 Out = 5D2A202A1C094929E29CD5076E8A604644B8074378FB55CAF890B5D5B69CA4470ECCE3ECEBDD30D4BE380E0A78D9F5B981621F456AEC5A5A8094A22BCD2F100D82D3C8ACFE9F4EE28AA2D4AE690966ADA24E97E2A8BDA237C837CDFCF52C69C1A420A2F8603CC813524691959EBE521AD7128B96F4DE5C86A7796978027DD85F EntropyInput = CE7FCD7F271EAAD684CD64FAA67D08B0404AA44DDA69AD8E51DC50C2B4F429D1226E507EFA629B0CADDA00559536751C2B7196CC432A75F9CC72FD459D25A88D80952A88C29F9CE342BB0808C057B0EC EntropyInputReseed = F002A5B58522FCCD7930C4B89E6A53D84096F375CCDF9C84B465A9673986B6018712A2AEFC5996F177718A8E5BCF250BFCCFC6F1F08BCDA9F3A56B3DD0C579D1 AdditionalInput1 = C51637FDBB2990F037819C01BF12778A254FA9646851F709A219C1574F5DC15E AdditionalInput2 = C42BCB92D457E9FEF96EC52E69C6AC5EBD8C6DA269FF794D26DB0A8E7A864AEB Out = 2A4949CF49AA44E6F9DAEEDE90BABF7EC02918AA086564FCC4F59AB289AE48287ED7AA7E243847A97678099AD5CF9AF960AF1336724D5CB005F23AD9FB27AE5B3841A2AD73140F723AA8572E43413C312BC55E8EE0669F16AC67A4BCE6C0496C4AD1C701149DC8AE24725B43F95EF4AD0810D44BC3D081249EE5A58E17C4BAB6 EntropyInput = B816A36760C337575634C4C5054560E76CB19C950A3A162C774AF3110C648BA4DC6B05BD4C9DD98C9F7834002E20A191F4A6EF5034D489FF7079A40BF986BACED2C8ACEA665D984453DE76E183575469 EntropyInputReseed = 4D9EA03C41F5E6688557ADA6B270A30E6446C56D826F93935CE5B144F731D9E07B94085C670C0C5F666E3C5E18F3D5D9B5839C4F29888BC14821D5112509F0FF AdditionalInput1 = 6A109321833DE5339B80B9DCACB5B814CF986A9AA066841DA9DF65233ABF0406 AdditionalInput2 = 28CC8A2CB790B0A2CAA8FBF244D8EB4440E95BDE71E4454015A69398D3E3AF1A Out = E59153C34D68A0FF4A67EE08A84286297838D176C86F4375D7C32B4FCD30EC635A80117CCB9A74D6B51A1058BA9740F6EE3D6F14DD964B60D7AADEA1301C74CD8A72A5E0B3D6D8FF7B6E722A373B764A34CFE5E83D01D41E7BCC43751E872F9CF78DDB0283D9574285CBE317D361CB5B5DFE7080AA6E682CE795B92189BFDF5C EntropyInput = 22ACDD4D4356150F2CFDB2DEE34349164DAC84493CFC836ABCC90AB489A77727A2799AC1C419AC721F37BEDB3D608C1F0714FAF3555C6CB745B4566A7A171116AD71AE5F1B3A1273D3ABD3445E3441A5 EntropyInputReseed = 6BA05B9DF10729C4566031CBE80AB1442E745875263CA7B8FFBE3210EC923D6C3A5F2A3EC3F8EF8F26AA93ED442A951109BBC38FE6218CDB21801DABA2E8F7A8 AdditionalInput1 = 5627AF344E65D906D0C4BAD2FA43EBB5A2EE18CBE23B42B7428F3EE29CD0D4FF AdditionalInput2 = A05B5B0D9C6D14658AD9ACE19BEC5A1F75BB360F472BF8DAD13604199AFA8C57 Out = 58D69968842A465227887A4D6C9FCC30DCBD0035A6FE9B393BB44108CD31C9827923BC6992D18D950E8AE879F797A4838AB41BA467C90A39E3DB4A691B78CB3BBBAB8D7EC9DEC4AC6743BBE23A48658A51AEB473D156B99DF9948C7BC3E19FED04E06A86E90FF18463C752844EC8C24A58ACA03357CB22FCDDC8E99034BAA588 EntropyInput = CAAD192AB728518A1224ABA01B2F61E4EB6956C4BE0991DBE4BC11DF60EA995397CE7486062DAF0F8EACE01204901389C732E6DF93B7DCE601E070BE6ECA84FE24BD679E5DEA0526DA9BF4F9325AB24A EntropyInputReseed = 33C088A4076C6A675D77C5EAD1E6938201A2F4858E5429BB652392259D683CE8A4F8079922ADD4E3FCA85641612D570A0218D18D1019FBBFD951A185130D4DA7 AdditionalInput1 = AB515F5BE45BBEAA6DD31A257DE3D3CBC3223975F83AA0FA344642D1A30CBC92 AdditionalInput2 = 90A462585287C5552A3185ED625F01FFBEEB345BA679A429062D034A2FB91A0F Out = 41D51AF6653F1E213F8E1620129AD009C518704D13F25119F9009F2A607062028512CEA7111C9029A882541CC48661B22A4A1F70764C5E5C979A195E5730C2DD4C80D7AB4FEFE7CA594E803726AC42A8802B276F7D61601F7B4E44652595B4C7A6370ABEF702B5985CCD9DE49D6D4692D2D3A07435BDAA045C603F48BE432188 EntropyInput = EA28926CD5DF4FEFD572C9103D87FFB04F599DA95E1E6FECB84F53F73FD00D6CCB40E16655B9A2C71E8E3677B9EA6C6F EntropyInputReseed = 3D2D1DB88B8462787A5576C95FD660734FB681F894E8EFC47E3BE3BFC3098E40 Out = E929C6E749C5175031DCC926BCE8D529147B5E940F61D0BA1F02831C80C27A23CD4B5FFB507C7D09A77E4C8427E29010CF1C8021A80CA29504CAA350A27D6CA4554FE4D8B0235554F251A59EC6729D802B473083B0BD6CA83F6D945B3D1DE2B706BDCC3B50DDEF57847FFF88A4498586CA6AFE65E76C2D97F87DDEA66F5563E3 EntropyInput = BC3C346928929169C7A00C6F532F7EB1C4A77D42193B65697BDDE5FE59AE45201B2BA33DA49D3F6CF84039CD99CCE50F EntropyInputReseed = B4254AAB62C415D8323D556AECA61417B41B090465480DB8FB864F578F567B3D Out = 2602FCC0FCDB71046DA4226E1277D5DF89225473E4564F047E60610D981A18E2B44D79A93CD864B80FD377685FB4198ECE5B2211AEBA57FF49FDB6128262E2836E7E8166F3C3D5A93C686A9B70AA739C66F85F84C44C314662D7AF17AD625E55B6B4801F0DDAD8E636854D228F01BA8F2F8120762052D2894819A9FBC76D6E6F EntropyInput = 0BA038BDB7AD7BBE77A6C7DAA33A2BDFD9A1A5F31CD2E75377C778F492F5B3CB17A134234A30E09170899C115B43CA16 EntropyInputReseed = DB020E00BACE417BA7687E829C1FFC91D22EF93B27BFE1107732CFE082A05CF6 Out = 01792F59D0A63DEFD87D13188B1AECA98C03B11B7DD6698328172DFB65CCB695A1BAA58E44FD7523FD176D270664337E598AA453643CE3C6EBADEDEC6311E2E1A6ED2252477401041253D3AFBADAC06E4D06F46DC3D7ACE287EE3E23286B28852EE0CF1E7AB3ADB0FF1007D07716B09C22EB1380BBD0E8DAC482DF480D41581D EntropyInput = 2B37C70C56A2A1C3D5150EDC4C31807E17973F4AFD853218E99403D8DD9F195FA5110C3A0F45BA13B8EA3F77F3335849 EntropyInputReseed = 1450BBF9F6B68330FA6C3EEB20185ECBB30C4CCB4B7B5EE3271263A643D4F3E9 Out = 5714E08ECB34E51C1B5B91405C812E8010729B6995B6CC9014809C47C3B6BAF110134575146C6BB43D20FE16386D1005B5641BDC12B6454F3BB74588B616C654BDCA84F071364EFD8D1EE666CD60E4E2A8A3DE99E3F56A72714DB04F15AA0376ACA8B12D50318C128E1F4CE2584009ED4D7E57544ABA9D631269EFF995319923 EntropyInput = AB79F1FF8A69C7F7EB33E57F03C5FD8458C0AFA9D27388B78420A1AC8D98BE68B36B72A04BBDD285968D7305D356F8FF EntropyInputReseed = 5CE8783B453BA8567E7B6D7A63ACE5B4EAF87562420E729FAE9439CE3A68DC86 Out = 9D10404B952E37C1D7007BEAB7F8F1FAF2361700F1388BEBFA83D857ACBD6520947A4A069F80278DAE1D5A8EEFF9D69F633018310E2A16ACB908B3B029B5BBEF71F2A05970F544ADCFA6E707799FC1E6B78B96EA1A574F34D44994E68D1C40BC2F397AE1A48728A92B8B4D46E34722DDF24DD3A035262E90C5BFFE04896B5658 EntropyInput = 05FAE5A20803A1442111AC0BD1810186319D721D2946ECA264FB31AC8D8CBDA897C41CA669E223EECFB2659941FFA1BC EntropyInputReseed = DF4F01EA4A91AA2EB65155F153DCA70AFCE98FF56BFF2A1C941178C2C2DBE918 Out = F3EB85C168377931A2F677F1064C82DE815EFF75701B031606098794EEA71696805485F777ADE2F250E48FD58D2358AA8EEBFF597D396A7AFCF38BE65E0E78405D35EE3D8DD2985CD62C26CAC1BD0D9C6E67ACCFBBE2BFDA87D50DE6415A4A9BAA273F997BDCE903271A0582BEFC402F33FCABB6DB6F145252D870554D7891D2 EntropyInput = F07ACE299EA3C1049D88378E3A64D6FE781B8772CBD192C9692A4D8E7AEC198787CD0D8FFF8DADEC5B8BCCD085F41A1E EntropyInputReseed = 42FB6E92EE263B1C03A63E5BEAF80662AD67B195E155D0ACB7478A8293831FC6 Out = 3E3EEB53800B4874BDDA331C1E9B98C57700E7C206F5F3D0F421E3C490797084C09ED6B4BD5885BCAA42E036870D633DF8B3BF1D1BAFF588AC9B24E0827C26ED4F0618D912D39004CCA9739E0B9946F8927B580BB2F32C9F142A7B1C09B32A405E1EF5209CAE790B0711D14993510953018F279C8C8DFD06648CD1B1A58BDF93 EntropyInput = 96C3E7E5FECCC0618059006C735A6CE0B5114D208C79143E1C9F8EF5036E330D6BBB09C41651C1C78C36C25E4CEE8AA9 EntropyInputReseed = ABA51086577C6948B892CF5254520BF8D240C2E3B0924AFE6965ACFABD7E0ABF Out = 1D7EC48234BB2AAAF54FBD55FF0663F0FC82822531F666EE7F7F5E257007F30462428A519D86A8764BA0D6A2331CB129232D9A5C03183B0F419D813F4C0E00E4BE5DD16A87A9FAEC8915A39FD2D406C54EB8AAF228A09A46DB55FDA8A90B27EFC96C461E9E9BE08E27AF86B01750DBBFB40245E998F0679686E18D801702FFA2 EntropyInput = 210725C60839782D3665A300ADCF81C6D51478B1F12E5D53104BEB385CE15024129A705C88E4FDB167D34794F6F739B4 EntropyInputReseed = E12E9CC523D618AE6CB667ECA7EDD35458187BD19E9079B5C5E1CB971E380309 Out = 345B3B8C011C787E9063F811D51F096A31CC1EA9FAA0B8F29D916BE1B925A4B71F8E6DB56E0E22ABFDE3F035F2D5A6FCDE02E5DF8C0BEFE0C00438FAA4277CA790E632318061FBABBB83DC83F719F3CEAB431E3FE80695BC44D74D0935C8422521CE784A923CACC37517B9DD93C7C0608F955E5B48680B537142459A6D7B79E8 EntropyInput = F87E047438C6F5DC41A5E3BD0DDB386C99407BF276B57824D4366E0973EF65F273002B5AC3CDB5615A2E1792B96386E2 EntropyInputReseed = CA22F853F4371ED334AB94444B58A4F9CBDACFDA96E4A9E46C9CF776A903990D Out = 5D54827FB37FD86441AB4EB3796089DE39F113244158236EC1629969F9295F37836B2D7D4D6E59E0BDCEFD923C2C442118C8CA3B00A258BEECAD7D28D7E12162A420212918937A4D0DA5EA7C0B9602813266015F385ED5C69A48375E9B3738814F16C085D5CFD1D2E6267E1C5D7BAD88F20B3AB0AB279FCB651020ECFC150763 EntropyInput = 50EBB38461D3F26C5AC2ECF53A03417842525BAD577F057ED920C1C4970E5529996C6B9DB4A1AAB9D31C754AF49A5445 EntropyInputReseed = EA898550CEE38888C038F67B4912E48AA9E378FF3ADC9CC6C5BAEE8C376FC708 Out = 773771F1F3903763F4F9D6B21673D2A93F6E4D03636D381BC26864B46496E9588A064B00E846A8D91E302C47DACDAB7388F5CD0093D2174E33327F9DF6537124AB91CF35CBEECE38F6373A8B851DA2645DAD5CF01A59F53180A0FBFEB928A71090D1997B055FA20F14F49C28DC065DDD84A14D9323192B2428AEC6F915F90491 EntropyInput = C13D6CD63BB7931174696F3E04A0C41CB0B2561134E847CE03E36326B803F8AB2084AB32374392EA9F6E8A474F18E9D7 EntropyInputReseed = AEC5A6A7232A52B81CE7E981A359CEF1BBD2F1EFF8488371468CD1F4147A89C2 Out = DAEA78881737CB26D60C36CEB9FEC3D281C7AEC54B4B9850937B373B2B2621FE077585A1FE88265D84F225552E5C85CBEC8D00069648065AC12073AEDCE8C940460949B597667ECFCEDABD7A86A979B904A24D32DB10223EAE5A98A0D1B6571B8643DF2C6265A5D66CEE9F4ABFC5778146D6FB2B853D82636C1325B2D1EF4576 EntropyInput = 67F98D4D9F35A8DAC03D199222B07C785F11DC517A8D8840F5FEA4B6FD68448E1DCD3A1BBB4F94AD78355842893DE035 EntropyInputReseed = F1F9CAEE31036A2A200A052D8A1E065920B8363FBBF1C371A23244C6835113D3 Out = 9F24A56F985851262D0CFDF122B89B3B93A1DFD97A297FB1F6FC39D6C719942E28977BDE91CB3941C035E3EC454DBF9DBB43576920DC47273D3F82CCC8A8FABC1B532F9D1C487DB31E7EAAC3325EDD1FD80870CF30CCDC87A1FA4B88EB7A1C464D0B68EFC3DD760A3259AD280D49642BEBDEBC1A5829F32F09FB777AFB409AEE EntropyInput = 0F4A78C8623D303154398CB9340857BA937388F95B0197ECBA487C4CF021B3CA6C02E69398AB7B7DFC4AD83E7F3CA8FF EntropyInputReseed = 03020B4511B2529B2A3348078AD0318BA5F825A1BB0672DC894CB4D1DD3E294D Out = F5B9A5262970B8CD94482AC6E4DEDD8FFDCACA0FC37E6D0FA71AB10E5AE07487C688017DC01514F857702B28CD8E4F1B0839B9EC4D6F9E07E4551E150C91CD4F4AA22AA7E8A5E1077869B2454BB8CDDAEE69A067C6B0DCC178FE1DA6EDE5D53269372536F34BED378566CBD8986DC1AE0848BE749079DD572D4D62E51FE659CA EntropyInput = 001CF2BB87EE4AA145011908CE79920700FF40CE765099292B7B7AEC68EEB05EB10115CCFEFEC7487C872412977067A9 EntropyInputReseed = 9B5DCFA40B5C5A9DCAE4E8CDF16E1458D49164B317CEFCE63F28C10D29229974 Out = E0F073C0BB4024C46CEDD56F6DDE44677D8DCDAF8DF939E2CBFAAF0FC3810F621B29DDAA7810EE3CFC251232C4F8B01C5664E4AF5EA0A7A20C768AAE83921863D7E0FF12778EE1E6E4EFEEA6320F9C8DD439E7987E620AC2EE409652BA7F07708CA19A2E16F4D324BA1ACCA3A4D244302438608BA3B64CAE05545AD867194951 EntropyInput = 82D87758F16581B2BD8BD4374ABA49A59B65CB953F753594240E69575D51B170C12EA8A42DBEF64B9B3ABBAE9222F94A EntropyInputReseed = F9BCB64209E8F68E6E3F996196AB445DBA64568C7E572DCD2378E916449E39F7987D93237E7E52D1EF3941407E8739F7D95991BAD92A49AD6A681DCAB1644049 AdditionalInput1 = 8DD4DC1E62114A0C7E52537607EA8313FA4128F486D871A8BB8ADBCD9BF46C42 AdditionalInput2 = E16721A200D3F18ABFD154EB0DC2C9B7C245E8A2A644D59C2E888D4DE11652DE Out = BA00A49886A6C34EBCD649BB93989CABB9C1D11F9C53F721C99AB125A6CF4726A79713C2683DDAE6AE7939BE465E9A2B95D008AF76DB42973A6B63A33BC662D99AFD9BD4C7AAADC116DA5D11DB66F2FC27BFD471FF5130B40F81C0DA8DE5BA09661165371818EA61F936B4FBD511EFC2DC5A7D24DD56326A0E10B03F1F94465D EntropyInput = D45617CF8AAC4AFD6699DFDBA896E943CCA0D69F2F2AE411B846A46AA1CF96669F8C13650155A0295209B5BB064A85A8 EntropyInputReseed = 02FC5D6D9909AC4AECF6EC05E68122BC349CA7270495E832249254E49C5C8D25AF52FA54D850B735B3A83E45CDFF5DA4371E262FC54171756F397298EFE70E74 AdditionalInput1 = 0586BDBE560B77B784A40F10938AA889FC0721EA4FA1D7D43507F15BACDB37C2 AdditionalInput2 = C0E43CBC21559A8DBC833A86C24EA5C3D5A42382C75723CE351C3172EC69BCF4 Out = 3B20E6E6464A05293A9C72F2EC130FD62D1C322CC5818EAEAF2A5E01FEA7A3638C1CFB9E7BACA2E1459774255DECE1121CE76AA557CCAA1FABBD6B40602AE039F9D668C5BA728C39B0EF49EE2230BE5035A25B98EE02836B807D0C048485D054A008470A0BC9D58252124FCC8E83751DE51BBE04ED91F6DA75D16915E9A86F31 EntropyInput = 88E996FF049A7E883140F388195BC037DEA35B028D6CC840506C3A973B350BC9B5E8B9F4001AB207F6DC13E1646809C6 EntropyInputReseed = 7C5AB58A716D0F56C8093BA413DA08E365796558DFD8706483C75F2495C791C919108947F3FE5FEC5B89406B5AEAB5EA302E13CD2E07C664928EF77EBEF9FC14 AdditionalInput1 = 234C15AFE741F90F048790F9273537E138D4C11B72496C3C5FA2D943D0356B77 AdditionalInput2 = B3DB56BFFF2896C980B0BF0007C1CF7236A4A8D826BBFB1D25245B565F3CD886 Out = D19059AF044C7BD0A2B1F2DD7B42A25DB1A764B6D011CC92C268A9DA92BFB7A3AE8EAB49A501D169D68E984B2A4B091131BB4E3A5DA501D260666F281CDC6BB57C4CF5F2542E97A6B249C18849DFDA92A7313F76E314379C28E9155B954B06A02D3078E317006B50556383D8F9998703064BFEDA1FA63A84834ED9877E937445 EntropyInput = 46594DDBC8C7A26BDAF61ED97B4E78C72C34CD4AB1152042B4B39361D01711D8AFC1482DA5B7BC8718CE2F6A720D288E EntropyInputReseed = A91158CDED4676281603A1D9F6B59C9E2991080262CB122FCAF4BBE042900AD528ECA150C28DE8DA9837E7070D4D51F51CDED6A548D63958C33863DA24279A01 AdditionalInput1 = 5A31F9B2966E7A9F3D5317592DF05FBE61752A139101E902D6200074FCC377B4 AdditionalInput2 = 1CC68649E197E202E7C6FE61612372DD05BBB3C37D23D1CDD40802213F0C2466 Out = D603EA67DD8F579327E7869BAF7164B1D3C4BC0FAC661C6C833295942FC613CE40EE96D38D53AAFE3C8FFB28002A2454F5377C97865C73387EC9FB5BB75DBAA3E68338051A51F1DF7FFDC5684667C62AE2F200FE131A88FAC6D53F2357C3BD945744A525D0779B247CFC94D5969D0629D58065ED50B82855FF051BB5A8AD8305 EntropyInput = 208ED308A6AC1BE922C8F89E2E27095664105B6E628A212EE4CF6220D36C3A42663BE94764A6503E554F54C9AC1462E9 EntropyInputReseed = 6F230A815AE7043D7334BEC6F43DD926AFE4E6887D83B194D01C7A72B833A6AB49BA715BB003F28E3238A36AFD12197E3764F5D5C5D7C4D933D73078BAA4CB8A AdditionalInput1 = 81DB352C01849B9FD463DC9B9C74A8FBB5448DCC3E0171A376BDEA811882FEBA AdditionalInput2 = 90E0240AFC475CB623C5F4685EE7B99F55E400A8964E978FD8AE7DF2CA670DB3 Out = 87544081D61F56811AA3C689C6BB492CF03AA81FF54606F5C4667E7F2F3E1A099D485C54FF205A2BDE2098C6E89B3D423AED69C3679CA535AF7D0C4995E4178AB206D5CB05151D9D92815C14C701BC4CE4DE6EC38FD22AC64EA1ECDCAB5E5048684BF066C9AE46A208788BD2E5E2010447E0C5495F22E2052D21E358AA9E3D0E EntropyInput = E5EE17D11B033E3701BBED8BF3D99C90131CC0F7F46C85D7CF852AFA41E916DECA9B43BD86F64EAB072808D4F017F147 EntropyInputReseed = F6F16EFD80734CC1AF7841960B7235B5F103D4EC83C3209424DA74CA81B7A9E1AF8E4A7AD0A1FC3BDCD70CB155A0B707F435B07569882F163F8CEE653CCE4F07 AdditionalInput1 = A9F3569DECB7F1EE3E3698E4528185265A48CC7FEB392B48F55CF09C6727D787 AdditionalInput2 = AAA0AD270B97E20D8E4EB1388AABB85F5B041491A0FFED2871661CCFCC6FD306 Out = 4C1D9D8D2F8BB8FC9F7DB889A775CAA745809C43E71C71A9ABD496671E5C852A4B42604B5C65DB9BA3367CE48A5B46687F23CD851F89D9A9FF4AFE6C4FCBEF0876997B501BA4B5F66FD642B2DD8A238E969EEF49D4D1187621949C7B2281A9275B0BE553CC8E058EDA21AB2C97977544738FAE49128C8AFF71D740883C6B237C EntropyInput = 52DFBA700935BBDD496806D7ABEB85BF09AC6ADDE9D278DB3E070912D7C35BEF36B9770B63D5A3094F2EF4B48F1EEC92 EntropyInputReseed = DB4591FB6F64F8BCD8CD170BBAF83399948CEA9ACD51FC29E3A50848D6D31B062AF211BC067F4A669F9B4F81B1E0B8F2BFAA2885AB76EAAA02FC0871D97DC7D0 AdditionalInput1 = 2F4C567083AB1741F0EC642242C12626055CA8D99EC9431396998DF8A4529CAC AdditionalInput2 = 774745C786B5792BAE31450228B80800E6026CBF4226ED5408D90135BA2DFD8E Out = 1B0DF8A6BFDEC11454A565447463E6F75AAFA8519685B9860606360D6D550346E42AC3EF37D8E4E581EBB9E5643D2106A1C69411E9A98156EEB61D643E8CF930BC8D5F73CECD912C8B577ADA8AB0C862CAC995D3BBF66DB828D883DFB477F2D4558508F4819D13FB7C2D1FEFD53D66918CA8D43890E205FC147EABB099C61928 EntropyInput = 376FE9BCF1730A71BE71F71D752686862E0CB46076B47612826C17A462F2DF20E31E81CBA8C1F46188CD3831C31647F6 EntropyInputReseed = D576346D85D394670AA763ECD8C3DAAF115C91CE84F50AE7C8A25F853E206242651E7325E4C94B94368F9A20CDEEE32FB234617CA12F69752EF20AC4EB4E9599 AdditionalInput1 = 0E584541131F90DE2F0463BC42F515C3EE03E2238C614FFDA13110A7600D238B AdditionalInput2 = D06BB18AE5239F680E238E38E4F1826200B1825DB016D42D773AE0EE03B65832 Out = F49C0755401E953DA54A6E4ED108410F6FD33B24DD20471CDF0399A8D2DFD6EFB82C30085F3D01AABFA96A2E149C4D5A6AEEA6D39A94F7AD910293AEC2DCA0A9B65376D083629104323BE02C7CF3D9E227B25A2372B948900CAF6BA5375535BA89FA834733289682F1112A1808FFD43A9B686693E689118C759312310EB1AB6D EntropyInput = E5EF4179C15B4EDEB6501A7736AE4710E10E0B05020D9AC64EC285E0FEA226634C7398935C2580D12FA3C77E1854C96A EntropyInputReseed = F455054DA03746FBBC547B64A5675E8697A3017DF6EDE96E5F4AE228627C7C36D26EBA60E7D06B97B93650CEE6BA83F2E63481408AE42F38691CCFE0F4BA08B3 AdditionalInput1 = 09A6682D44C7DC72A11B70A003EC7D5CD1B6B90992EF3AC7CD035994C1A67D1A AdditionalInput2 = 7EBFC06C51FD731EB22F609A2C16A3A95D203AB3D272781EE8F2270C06AEFE8F Out = 5C35CBC97234313FF6DABB28031C124BD174B38836B2B0FCFA21A525B736908B492FDC414A26792332E84D63D4AE91FCD044083C084586E84237E073CFAABF06D43B751A73569D545ACD81764D5FE7F1CA3E879E68DDF705D42C40F62DD94FD4F08173C200EEC36419F8FB61408A3AE2F89D7F897B620557B0D957BDDA051347 EntropyInput = C4F54F73A0F60D1021A4431E38A3A99E918DE4770B110700DCA2230A4B048E6AD392D2C24744D14BBB7ABD3394740E2C EntropyInputReseed = 3AD6360E64501CC2965E401F748F62FC671C0CC5C6F4D74CABEFB77FCDBF37D34C654C9435AEFEF0F0F192A7697C7F0230100531326E728B1CAAF849C0CF6335 AdditionalInput1 = E3230BFCF6BE9255A099DC45A18245C1C93924C0FA0786703D30AFE2A08DA99C AdditionalInput2 = D143356D6951635CB8FE9D82A1680A8C8B474E9C322AD2C50FC2F6E5E365188E Out = E84B05B8F57F174B94524C6AF85EDFD694BD804967F6042DB419E6B913EC11CDD875F75A229F7D80E291EF1BD9CEE09B7D1FB0C2153020F567786BE765459EED65A214A2479384F7EB3562A4DA345A869858D007873084478DD3EC2C697C4B6A3CDC43D660C0CE826CFD837A69322BF4F48B9219D274CA079BC6A65F9249F306 EntropyInput = 07A2786649C555C461D9354ACFE7B2EA5DE0B0DDBB5944B9FFACF0F3A05C350599ECB98FD15A1E3B7B810E52DF8A0A9B EntropyInputReseed = 03565B2E46259468554C37CD2D3AC1BDD74C54E88800FDDD5969DD790F9397C31375C269F1064337F16DC3615B4CDB1AEFF2B1F7B6C762CC8C805255A7AC3770 AdditionalInput1 = FE734E36C050FEA842E3D6AC416F131ACD6CFBBF1AA2E56510ECE1A09070DD1B AdditionalInput2 = AFCDB213924AFDA9F33064799FF433359F4C9A7BC4582BA2BE4F444BA436220F Out = C0077CD07EC1D44A9A62C082B4D81CD40D9191A7ABE2D41DB02681A6D845AF965D8229CE3F5D13FD7C2D978994A89AC4451B7EABDE0F9EB46547824C01F9B742818309128E88BB1D04B9EDE9AA10961EDD86D2483E5CD998CE666C46637D6367E2CC195F255033D2662153402264243066198A4D4BEE84D847E5A220DB54354B EntropyInput = FD4EE32B2C7493ACD93544592AF38A173E93029AB858E4513C76C95008487068B30532B780095A254E1917CEA183DBE6 EntropyInputReseed = 604776ABDDE4F43931376156A9372829675E4AEA5FC09B3060ECCDAEC3C3D72C03AD9A2054712669C927A35D1387E524AB9E5637CF9A602B910828735F7F7A75 AdditionalInput1 = A89A5D312C771C0CC7C8BF48BA815E0444830755A303CD5FFEA05917A1993218 AdditionalInput2 = 51A450C26D4629AC69390CEB45ADBB66247EABEFA07522B590C2F571FA550A63 Out = 49DC11C03F615E8FB4D7BCD52F33367CC14D920A0C83543728130D34AF457D44A7C9C3824FDD46256B49A9244E7C1AA98E18C40B55989AFDC85BB98369C8434A02B0258A6411C7C43C93ABAE439B197BAAD4968CD7D1F3481A4CF0E254E73CD114C23CFCFE49BFDC689DEEBA4581522077B67E7E612048A6DCDBBC5301F4C46B EntropyInput = B29425FED72A5EEFF15B047E664D05E825D2FDC3A2AE3A6FDF6F9692D5E0FB9A65925C707E7FEF54E174B1EA25832222 EntropyInputReseed = 263447FF56428F7552D6C0B5DB0B77115E16B3B08BF442E0176A5AF21C48CE4BF5F9492D00E9FF0F546016F2E8A829D273E76DA0CAAF33AD735A283E5DAC8FB0 AdditionalInput1 = F74E59BFA315BDF095AE21D013DD9C9D0F3BEF78DCF8F83D5BBCF9E7B6EDA744 AdditionalInput2 = CAF5AD8978EFAD96E0E8BAF0AAB300D9A8FED1A7B6A28D1545411B6D983C3B25 Out = A3001862E230CCE418B01545B6F1A65098F00C1EA3B4A8590F9A84FA849EC13F7A8689A6C2C26200B10A61F171BF6734CCA1D1925E71D6A6372923AE941B0751C59834696C0230A19A039F4A4616221DDD29AF9917126BF10E6BC84B7C8E3AD5204C5F3027B5EA23604DBC1F7C996E0706664258FA7A6FCA06F08685E874680A EntropyInput = BFCA09956CA339D72EAF5BA29FA91A91A289E270C9D76D0DF30D8B70B24EE278ECFDD27040168C342F8CB1C290CF5FB6 EntropyInputReseed = 054B368651C44CE3E526F01DA3B75AEBA1D67836D32850B20C5108ECC268AF1B05B5460AD65655DBD29B0A76B708376272B49B0E36ECFF13C22860F0ED1E68FE AdditionalInput1 = 0B1A4E45E8B37B4DDA406E1BD005837E5D73943B7BE5A3AB2E0FEE9A477F98D8 AdditionalInput2 = C2D811A5494340F6473121DCE7179918403A580F599A945B3C2DCE16CA660EC3 Out = ABA32F9CBF7065DA6CE4E2F29762B80D0F3E996911E6C854DEE0681A4F638554A2AA50DEB54C0D889BC7E19D9406C7D1684B749B1BD63EEE082079FD965780E29B2CE0D142CE3BAC70A9FC5D0BB5B5454A8AF90DC1CF11336D39D611B2DF1B2A7479B5D378C329031E9AB387CCAFB82744148A57B8620008C13E1EC72026F86E EntropyInput = 7E8411D8CC0CFF5F25F2DB88645CED7DBFD852AE708158BF7B352F2787E7E4264F4D8EC376D745145F35F9A9C7215B52 EntropyInputReseed = BBF3226451C38529CEB9D6DCAFC10AE789CF6328E097C2BE9B23B77972E83867D46C9DE6DC4D295666FEEEDD7C08E2E354E60D282860A2B76F4FD1106665CAEB AdditionalInput1 = F721778E8E5FF5CDD96C868B03E666C8F174A7C5F5B9C50E1F13E76C888EF4EF AdditionalInput2 = 2E5DA8224721CBDECFCBD661563F1FC8B56E5BCE3F7DD958243D7AAAEBFBDE35 Out = 9111FCFED7D165BB5DC5301A5DF5627B68EF90ACBA3402410046A395C937176E4BEE7485F7E361D7F6276BA57D5F96F74B6DB237D0B7F104C9D9DB8389C5D72167EBB3930CDFD6BEBD004A97CCE332BD505357041E654E1E0E90C1556F2BC07C6A135FC6D4D886D2B3BD63057D45917C0D4D03F3B39DEE6C2641B29EE369F18A EntropyInput = 22D8C62BCDDF5DA1DBDB093D6B1F663DDE337343C56CCFD40ACBE3302309EAE02A4B8E66DEAAC38B70D9FFC20C585DA50A337038F4B4573FF43A4321A586CA777C30301267D82FDF937198AC56C7062C EntropyInputReseed = 0B6FD179E44F149F062DA4F66F829C3C58C4A0A4F75AC2A9E0240D43BEC30E44 Out = 046E19B4D8AB38DD08DEFDD0D7C30C8C75D5689CA26F2BC994AC7FCA4FDBEE80677DFBDD851E7722835844DCA79DEC4A3FA82FEB884DF7D474BD972E12619BD5D6CB1B951EAC47EEC2581195B531534EDE507AF6F7417FCA84532BE7EF5DA6738DBF7AADFCD7CB888862B52EC773CF3FD00E6D4EFB3071AF9B70A49935A3BA38 EntropyInput = 6411756DC7AA3BE096AD419CE8381C0910D2A2AF5E944D8FF21F2FC5666ACB8773B68F5C749FAC09F01BA565A75789F83CA3D9146E2EBFF21A287D385C4224ED23596D745017F3B81148C92F3B9B27A1 EntropyInputReseed = D770128E711A8DF163F4E289E775032FDB473AA38F7E1D291726121378E9A8DE Out = CD72F809D9CD1AE13D995D1CAC368EDBFFF45697DEB1D1B795FFCF354936F0BF61CF550D043F9D2FA46281A1393EACE3847D5E4C6335182F87F465802989B255701F9DAEE03F591BA5C080D1F0584B027AB3B1DA5735C93611D9BE11A79C0FDE3BD4204EA3674075EA967A244AB1DCACA6F07B48BBB0B7E27D8A1A680FA0794C EntropyInput = 68AEA63AA5D6A83A5F71E33268D162A58D8ED12FFB26C825703ED0D100DFD1EBFA799C677C361C3E3EB321B07308F2FDFD4273DFD5B3BC1C6A1246F54375E9A0022864DC4008F19422EC9C0FF8A95644 EntropyInputReseed = C6733599704AB72044FD286E3F327B53E2F04C33B17544A42C39905943CE20E7 Out = 389253F73E2ED3F9109E6F98D889B1554F3BEEDCF9D412AEBC07BA9AC850AF07913FE1C99CC824E94E55CBE99EE23066E8E0188390AFD88DC3E12D41B5B27762A96B2DB305BF7C12065309AAB571ADF35B269BFB647939794C2E7D1DAEF35D857455DEB0FE12451C417E95553011812EAD9B8138F7ACEB75A55EDCBF968E1F68 EntropyInput = F9AABB49600FEF8A9311C02880B3AB2DF90ABBE07F5143632C6C35B573FFDB8D7C64ACA5A121114F6EBF5F629B082B61F55569A6DFB87769CF69B02B4043A0E9055B5AEC53A31D24595566D522F76CD5 EntropyInputReseed = 11DC5843C55D033B1801016BD0CF5D799D768CDC1EE3E21DA61A0227B983158C Out = 3B6AA699D96F4F1DD29C19C558D03DB300DB1CC92FB1A0565279DB1D055667A7844934F04DB000594CC066B04BE568C0DEA8E4EBE5467E1FF9AF2C62723B90D4F2C22A6CBA2AFE15F5504503C8E454DBC0E80A203315A8F459F9EAFB711164539DEFA442B8F3520EBED4A5FC4A84461069EEC4425AA3EB88AE6D83AD7A239850 EntropyInput = 88A76C16D3270ED3FCD176F9D793FA0C35516574C1CEF425B6007628AFA35E2BFF16CF7CB8E49D482CFD3994ABC5EF8A9213C54E3D002DF8741163AB9D7E0757CD512C691AD64BAFEF95CB72539B0AC6 EntropyInputReseed = 493B647FF0B3FAA2921F12F8F57B919329F2AF2FC1F14576D9DF2F8CC2ADA7A6 Out = F1330A85F90037876B3749203E849287444A827F0A58C249FF868FC1ADBA4DCE285E076A1F8AE1DA8CF9FE14931E8164186C97A8FEAF24583451F116E65F8E432E7ED55A36683120377E23128DCA1540FEFBF3AF1B56D5C74187F5286D0A95FB55931770543060CE8DF08F3C1959A1F4FC36B64671E0654FFFE70D96D521BE21 EntropyInput = F8F2C3194E8C4E909E6F052795030718CDD6235303BDE537EA3C7053056226E1D50EF4D06D00745465CE7B08CD035176ED897EC33AE3F4B0C20B128D94615FE387270F8F0D665E119B9B5AD10FD3657A EntropyInputReseed = 9178492A925112806B27802E0C9B0E70AF3FD5B6DB9AF8704028025635C5ED27 Out = 0E50D9DB9A5EB2D0B0D5C45301707EE281866879E072E51696E32819B33A44F0D00B88AB5D6C31D91988B1757CEEA8936ED5D0AD672990F4951DFAEA994DC00F3265095BDBEFAF1D4224DA616888A806609D2805CF0F5183D5E925261E6B2490DD85242FC9FBD426D77AE8339AEAC18394BBF351E061E4956138361D11B35772 EntropyInput = 2A65B1299D034B954007AE773403F509EC8DF52B25FF577919D33E976FFD21A58080ABA8C9F7A04AD41C41DEBC8D6B0231A46617E8EEC915707B75F7BA7881F9634E7B015EF2A2FB51F592FDDA27FB20 EntropyInputReseed = E3C8815172ECEE13E649FF624C6243AFBB46602BBFC3BD28D0317BAD6856C66F Out = 5B1C01AB1DF442305DAA8998728E1E99975B32327DA727F162AFF5ECBB01D4D6E8B8551F7ABE1892625012C248178B2EC12D64D84063F87F127928EBAB06CFC377FD9655AADBA361B93F976E5133B6FB8745F130D8C5EAE6F0D3857FE5C68904ADEAA224CCB93A960ED79ECF55D6AF307D287366B8A2D466B95EDBA142E86D12 EntropyInput = 85B60FAA4EBFDE825F0A4970C80C78E377A51DCEBB09453A03B646CBDC1C2F0EFB4DFF7E1AD37F1D00A100DE0A9D5D2B4610C56563726C7BAA3A2112904AD8036255C92FE748D65F1233354896FEE72A EntropyInputReseed = 854056927B35053B57448A2E0B6C7CF371CE10797EAB1C0A009D7ABD1A067CCC Out = 1942A4DC08FE8D92F5FA581756DDC3F7A321CB96933CC193711A0F6440A76B6C5A5DB8069C5C82FE3E1CDF3F3520DEB1652A9698F9726FD4048BABAF07050E937D56542899EEA5EC2C16919A360DE5CCF49EEED115EE02C067B72552BC4D4EEFB6AA91A233DD7317959A7E80E16B17379184503CBF3931A69E902D97F820F803 EntropyInput = BB7147F67454517B2F2B103790B44247EFB528A77A05AA220C8FE40B323A1F0A33B42B70EB65D985F2476136C949CA187EAA52F6D435298FDA70EF9ABAE90EB54968BD2B4CE749836CB2B11E452F6768 EntropyInputReseed = 4C2686E2EDC7A25BC9274642B886F1510C4D0F00715B75901A40F3D1537788FC Out = 50DC60BF8DF4B73E0C95B3E17364111DDEFF81442460D6C935E1FC5D2ED295C254C5C9F39D18F6540E697A1A7FC588B37E8FC45F314C06E9EB04458F3BD18D23FB33DB2A3185A0CB2B2D9BA6091538E85C2D6FBAC0201FECD337D268347AD8F304213C3AF945CA31EDF8BE847A7B56D7BDCD308399B06502794443F738F6EE55 EntropyInput = D7DCDFAA81C35119A46951AED8D8899502FC21B909C8DE8CF3A567C1AE81161D4C2449567C0867C9F43B752860E34BDE09417A1912EFC01465A8682FF71378706524B46A0C27220E9E40EC43073C563C EntropyInputReseed = 548A97B112AB6CCB578DD77599DF0CACDE332AC1A60088DC018D183875B61C51 Out = B200D698FC72F01E9709E53A0CA482ED3BE10E277296424CEFD11072C7B19BDDF70FF137C956E4D11D8EB1EB29BBE4979CBA9E2EB941F529EA9684CEC6614A5F8C30950D9544148FC4C92BB8B7BA899E721748A1D6BF5E8BB6429BA9020E089A7C1E910C8FC708E02BE75EFB89F00D6F8B52054062E43343A60DEED39CD8756A EntropyInput = 79ADC5CEAEF771102401ACC2FCB3D01D9BF7541ED86E8AA16C938D9556829A8E379D9AEBE0BDBCA07C774B5EF1EE732D8B13326A521957EDE004235CD138767B7F45F550F2FC55B1F67CDCC70923811D EntropyInputReseed = E268CEA9DDEB0CCA5388E12417D90C7FAB629B2B2C144DDC8054D04210586714 Out = 008FEDE441E550955D759C89229359F6A06EC2C06CE2DCF42BB72F255C28ED758B38A5F7F7EA9451A1C9B7A688D379C9D36FA7C86EB11B67F4E3B983FE4B42159FA623F55EEA9FB1FF3676AD547DF469607A03E8F832267968C8388B2DB849166A98A98AEF8D9E25888B1F6AEC3D66A026353259BDA902DF455E6D2D522CDED4 EntropyInput = 376DFB59424145420AC65967145F6FA51AACEC27BEA1D3F9F8B7616FCB36F73B564C1CB82BEF2BDC2C699955BD2B0777A0839DAAACE6FF209FBA71C6BBBA0584497CFF775D86507228717B576F3D5ED2 EntropyInputReseed = 230DA72E74367D921077B7C38C11EB9E17131F7EE4FF580ED883530DACF34199 Out = A7FEFF8C6859FF3D69543BE61657C8C19BE12B9F2B5348B94F237004437A20C6BE8619D531005FC47FCD6A1F07380FCA9075FB1148F5E3E15716998C1268BAC972F94E1B3EDB89E286A7B36A53C021FCA60453D7FB03A4EB00960DE31C458B377986AF33FCFCEFA7F6C938C7FC618337D4EC8BD942B23AB01BB3B3DE270CC9A9 EntropyInput = FDBEE9BAFF0D021718BC0732CE5B2E0BBA133BD319B4C5375CBE32DA8274EF726848A78DAC81743C0AC4C1D7A08B21F3EBC1F9768342632F576F7AF503699598D13BBA5FCC8FFBE294BDD16B8C865FAD EntropyInputReseed = CC3927645F65F54660C169FD3394A36A989C760A287F23EE8BE23D0BCDB2BF6C Out = B458AED88A53CB5A1A157197B38079CDA455BEDBC0E69F7C66C1CA67ADEC05A411715309582C7A2D5709A4D6F27C70686627ADECC68F3A2045B8E7CED5B92B5DFA4A36E555FD4212F1E033D94A523B16F1A4FB15B695D58DF4A5BE8EE7A2B9CBA0AF05F294CF0DAF54CABA5BFCD289C6F7D978EFB41263C1BA0DEBB06B56F3DC EntropyInput = 0D1015BCE0F7BAC3C07420B4F3F9BECA056487897AB26E8AD5C339036C87A7CEAD72179444306C677BB2709D1D464EFCE8CE89F4B7E0CBB3A2FB7479D95E80B36EAE5C62D7232F26C5A9103599A49BDD EntropyInputReseed = 15589857010468CA37CB83ADD59CFC733F6E97F953E2F8B8B98FABB81F608E47 Out = CDB7A115161C332A97CAEEA6EB7A6BFD299A768A8F7827DF163048F4DBF1750EE1E84D521B8001AD7DBF97A867FB2B99D21F99524B8411363636E2D440E94F26F2DD93516E08964D291F49961AD2F3FA21F6AC7A00DA08DBD83C520231A97E4829F676FBC18717ABCEDC4DEE2A41440D5797AB014537A42F5953A959535B3C81 EntropyInput = 9284FD4660BEB7A154349D74E2AD8442A5AC0667AC4D28DAF0529DAC5C805A21AFE96E33C6D5BEF1652821DEDB9641831B3419BEC2513531FA5FAFB42785EB07EC01B61A1E06452808B227F5F5C873CF EntropyInputReseed = F4942B20A42589A22E1B3B2214336D1BA3B11753937B93F1D7C3636B346D70A1 Out = F0B87F8C3C67F4DF3CC613C3C67999675951177C2D7D646EC03E522267EA1D39D42060D8B157774AF7AD7FD7F851F9C13AAFA56A64D7C0FF86C8DD9588F69C6E7A9680759BC1B602798B23959FE54FF4BD2CE2D8EDE7298F68801AAD61977485E0ACBADEECF47B7EB30E92F406D973E326518DB3AF0EA06EA574BA7B0161ABF2 EntropyInput = 00EFB9C7F02719FF5C7030FFA897A308D36C11CE27526340728BCD487C80457B09CEBD489D363B5578DDF30534EE6A7F27E38C624A8F934E931E195A0CBCF38E4E8D50108DC318743FB4B61CF78A7D14 EntropyInputReseed = 4C87234A9BB529AEBB7278DAA089753BD2B501D30677EDB6CC31E38788FE0E210E4DDDBE0034180B59303D527A938A447BAD9E4A91787D1072E6F41350FF11E5 AdditionalInput1 = CB25FCCF929812B9FC66AEA93E0CAFB064E25B8C2989AE5078648EF529ECB487 AdditionalInput2 = C1685A422E4A0673CEA9948937A8FDAA77777066F501AA17493682A83D931E6A Out = 7569FF1AD01A56AB283C1F2357BD519E15C0BE84B80CFE8EC6E26CF903AA8A17F52311A2458E48468122CE1F4ABFF12920F7DFFA86C46F06D744D198004BDD0B29B1B0F17712863DF82406E2C2A2FB73EA99DC3969C7E52AEAEA031E0112FBF8D785426AE7C106D876A900BA54C4E9A1F3656990571C6D1FB56131CD1CDB1E68 EntropyInput = 8EA54338449DE2D1564482CF2CDB1610441ACEB13D873C406822C8C29378EDAADB1D9E60F8DB08799836A1CC3A6DBFA8F3F897CBCAC4394DD96F9677A970CD3BD75E5577F6AB59BCF28C2B39DED7A7EA EntropyInputReseed = FCA077F2E5E6BA708D1A81EEB6B368BB6AE30302A81717EB3EDBEBA09ED3BA3241AD1A702E4F030D2A948B6C3E80E511BAEDAA13C3AF17991B1F5F8F02F65942 AdditionalInput1 = BC21034B0583961DB1B6BC8B3A91F6DFD48D9C90B698E272D973E6DF6318797A AdditionalInput2 = 2CCAF045CD483A13FAA045A316C0BE8CCA17B5336F8B5D8D18A9653AA6BF3D00 Out = 0DA0440EAAE77DB166A41284EA461513115ABB03C04F4CAA5C3DAF876FAAA8E0C92BFFCE6A7BDD0D3C2180CCD9F66F97A459AED66E2C84B612387205BD18BCE47D79504FE3494407122AAC6A650D37AAABAF0CD99235FBD0A5F3A06092D71D56A929E8542EFAE09CF25A692CFD993903F9EAC95C3222E216C2AA0277854F4175 EntropyInput = A51705A49A5B51EC885C7985FF8B4877CC842D9ACCF45D62D2FAE398422D85141FC37C7B48DF83E96B35B4B077B97756F83F51A25C95A5F24AAE0A01D5221E159B6A32409E4B6B4AE69693601BA6C0F0 EntropyInputReseed = 9BFECA7A06EB1C2C3378A89BFC94193745FC70BE0AAA1A5A65F66DF048D8B9862ABE8B2681DF7033C075BCAE4EFFE23CC8C60E2B454EC65C109715AD795C3987 AdditionalInput1 = 16D355A0609B2AAFC0A8F7A426B3D3B4ADEA942026DB3DEB145CC20F2E1F2A13 AdditionalInput2 = D61D12AF4D35BE2C0E8C56798CA6CCB66E060C69B11181348248211DE81F5D58 Out = 0C364AAE174EA28EAE8C61F8CDDED92271F3957A875392A47ADFD630FDDD935515C325B1061EA5A455A7C198E2962DC7375F8BE5B3D10E7EF20B53CA8DDB33CB05A95C98BF99B1C2CF09790A25CABB15D78A91E7B03D380498042A4D397FDCBFC447D21D832AC2DD5AA5E97059FFBCB99D32E37DBBAF5471A19D0EB1B7AC2935 EntropyInput = BF8397A7312152A7D8FE58843B680E38F72B121D4197E7607A5D43A739D59981BCBC9B9319E2B36685BED42963B224F4ECC27E66C66718855D52E54C5973125E650FD7C5FF996924E781ECE3F52E1765 EntropyInputReseed = AD4A6D2B3C119263192C34A544A2A37F236E2C0FA759873C3479B20E4FBEF54AD6197135BF1D537FB3BDB80B51536D5B4DF01A1C9E3D50DE91BA59EA235B3C6D AdditionalInput1 = 5F8A4035300695344FAF8F694D980DD932197299B1FD02B768636CA4E0D54725 AdditionalInput2 = 3F9C67B8DF9BD1BBA6F682CF558B4FAF053B44575E79487B985013AF661E86DE Out = E38570C368A509386FCF1762C9A8847F8D73ACA1F1C56DDA0D5202F32C847AEE749067D8483D918A07B2EA77AA2864B01A3680E0F911CD94F2AD167C44C8893AADB7B9FE949E2DE0179103387A11E723AAF3423B977BAAF6FEEB1AF10728EB6DF5F251602D189D214AC14BA04E992C7C835FB12B42D1F984225C2424ECB19062 EntropyInput = CE346C1B3B95AA2B5B86152567B769639240FD6976642B01AF14EE4D6E81E7F3CAC74CEA92B26F496A55D55A4762597ED8D5D383B0FF965DEE00513B8533680CE9D6CF6DE5E89B50DFABB11A98C0D1D5 EntropyInputReseed = FC1F5D047237B843FC8AC2247D4E5726515112171C87CE336A96060FAB487E5C5C9C49176AA263521ACDB52A9D7D4FFE0C48887111C15DF78274445157959DC7 AdditionalInput1 = 548F0CE6FCDBA09B74FF6B7A98144B4165C5FE2CF7E34032D445E5C276011ED5 AdditionalInput2 = 3438D70A60C3AF31620C74A4CE09E3716BCE04CD276E0577F323B5789A72DC24 Out = 04C6989AB5D490B143183C3CD1D2B24775E52D80CF038078AD96C80148823A359AE66CED37F09FD0E8276DA61B02EB38B893D9A40D6FB0A3BF806A57275566B366139A88D55314B3222D9F3EA2324B07712E6239326EA5EDD51680E7FC0C224710EFBCA738777207908CAA2F441FB79916B50D0E8392AC9B3E8CD9F8CF3D1473 EntropyInput = 43847BA36D55509FD07584EB8480251FB72EA75CD737AE180979A76FDBEA769741EBDCD85F0CD475CBD4184A72050897583DFF8D1D5C7CC5235187471C74C0D7BC7F066523F9986030AD69E81828AF4E EntropyInputReseed = 96C40DA9C81CD3B8A99712E8777D942F89E9FDE2DFD38F47A71FA836FFE161C70BE251C10429119218987A371B646F0F9B58A02F1768795F88014F846037FA5F AdditionalInput1 = F6620BF3F3ABA75D017D9B41E8356F326CC59A2055A970E2B387D25647A8BCCE AdditionalInput2 = 1AC1D03CEF61CC02C7E332B9BE2248FC4A3AB92647089BE23AC6182832CCBB43 Out = B5F5FE335A3022476B70F86252F3FB768E78684BED61997FE81782D5E0104125013B3805E9DE3BD2EF43600BAA6D064C13A4285FFE8F8DCF6C9882A9ADEE292DE97E380C08A04C6AA38BA256F4E94B984424B899CA17EE63A6849E0DA565482C6B279037D973A09B038D6E4C9D8E7D7029ACC4940C775BEFC649DBEBA3E95D6B EntropyInput = B8E3263140CE6EEC9303E7F6E80101ADCF941FD74D816CC56804467B72F59006E131822644B6779E7315FEA3160ACCF54D7E06840CD2E23B39CB43B5F6F754503886249379DD2DFA70B7D64E5F42CDF9 EntropyInputReseed = 97EA1618D61820BC1583ECFFA75B497D55F3810555358D8609FA163F7B1E88F261334592A5D6A854170313131BF1AC2B663883B0884D21A1ED931514AD709E1C AdditionalInput1 = ADAD0D0BD1F4E66D627D61E720B35DB53E770BD005191FD8AFC669C27139F180 AdditionalInput2 = 6996831A78DF3E9B566C4749F9022CD398F58098A0102DF8AF247B3CF27DCB6D Out = A60797805D6C181A836344B35C79330F42711FB22E56894430BFC05647BD85A05AC3D852D3C60A1982835590D5E44DDF7BC0D74397DEC7BC28B56C0134FAB05A97B74B167B6717C889A348A73AD2E7125FE338A70D39C6FDEFBC20079B4A16D57BE976A02FE734356C19B595B79B1DAD8C3581874F0367580D4A17E004DEC982 EntropyInput = 681F3B77163E9DAC7A43D42E50E9876D2ED5270339E5366C006E57D49A7205341050C6EE3AD562CCE8A27BA88DE4C83886D3CA79E003C4E936EA660AA4D7CD91BB8DCDD283BF6C10971BD6E4441C6388 EntropyInputReseed = 440F268E476075100893298D934C152DB38BC9539FD0866CECCC9204547FF70DA94F5A5E1F41D9136E5BC15E4F2FE34AD2A27BF70FC98C7ED7ACEE8A72C81816 AdditionalInput1 = 0415E5DBBBA05327D4C5552E4EDE2970D44FC55D3E73BAE3AB5C182078C207EF AdditionalInput2 = E4886219C9A7835D53A20BB1C59F3C0162560DFE9C1CAFF6DF294619F7D20DF7 Out = FBCB21E9A91D82A56C7636BE7DBFE0934DAAFD64FD87BFD451EF3787EF7E37DDF7D5692F0232DA58643D98E23E9092401A57B2A59302E106936BB957F2603E00794CCF8CCDD9BB56CD91A7B0B2898B37DE2113C3592F87AF7417F7388FE8C66589F1C84905E09E70A718A63AE0E2633A0982B50BAE45565790B50E3CCE2FB4EB EntropyInput = DB25D9393C8B1E945308C8E6AD01E5764172466893D83DFB0E63CE61DE9463DFDA2C284FC7F631BF335DE174DFD64A51EC4644028FDEA33398CFB506401D640318E54629B23B881F5351CB2B1141B53B EntropyInputReseed = 72D39B10415C11A7D3B788AC92E3A4C312CDF960C92D77A71C62F929CA8173EE37C77730E3868FC9D1FE8753CDE38BF4FA3060C5444B678C2A6B1E56950F96FE AdditionalInput1 = 6A0DB12E7364194DBEDECA69D23B3CE566C0624E110191805DC059B0025C1646 AdditionalInput2 = 99B462EA5D63ACD2D8511B377D176FC2A870B8A6A3629A20509EEA2C7E97CB42 Out = 90B21183E15F0F6FDD0F96C518CE6A7F1450141820C94201916C9E5A66324609FA9B1379CF9A9BD8ACE7AB1C1640312B29048EABBE18F29EC7F600260EDE11B8C52BB7ACCAFA7329949DC2FB03F6B6191BFE25A3737B8FBF686AA97102BC98E3E60FDC415D9055CD783B3081CB3AFF169DB633E78932387FB62F7468F64CD4B2 EntropyInput = 01ADED8D1B1CCD07A8D8024FE739C339A9F0270F3774F33E13C854BC8A014F6BA16BBB4F8689BA2D527D193C54A76739538DE4EA01A573CCCA20201A4F4F1F542C47E366B4576D29A15D4412B7B5F4DF EntropyInputReseed = F29F76855D3306E85A65237D9C8A8B48F6FA5C848BE940E6D75ADCA4E2FA0CDE3DBC50F9E36388B97984C78348362D21DD92A65BFB90C66F17CC0FD9606127E5 AdditionalInput1 = EA9AF103976DA59C694288B18FA00674FAFDD05EFFBAEE05985F899F94788163 AdditionalInput2 = 24EDBE5F94D7D010F090E25F395C773747477712E69E7238983E96B6DB4450D4 Out = 1C5B6984BDE71CB52FAD90F88225C0A7EBC17D80A4CC35B506014C33E33EEA615B4180277AA78A2FD73B2D494D0296F5E4E3116C1D87AF9BEE0D174AE99C0E77F7FC1135ED7EC3910B931CE1D623617FAFBF1624F17149278E57E4DDD752CFB04770A4B1CC48EECBE0CA1B0E370B5430B7BA8F8292BF16978006FC7D17AD7763 EntropyInput = D8D9D690AB229F4716DAA6965C8A815D4094EDA211300B9FD23D92DC42B6C07EC37B6F8D95C2D50F54700B227B20797E46AD8218FD1FEA6CCFED323067E67D1937230C21894F22248151D2842C13EADC EntropyInputReseed = 95BC0DFBA4BBC8C0F9D4D6F22358E06E997E82DFA41CE0A8C7803BCA23EAF62610CFF967925248BADA91905FA4A54973E089893437BD4843554E1D8AB0F579AA AdditionalInput1 = 06D81DE8958708916D07B4ABAA680D7700D8433211379CC83925CAEDC06B0D7C AdditionalInput2 = A7C2C9E389243EAD18C7B0B1F5F7A7714C47A152D6170F4904227866FC934B36 Out = CC7022A26E3FF2661DE6302F9B151DEE3B93D72919FBFC456B8CFD29D441D0A4D57D1817F4075A4D943B50B6811E5D203C0EA94C0BB5D9A18406F9CCFC3A0CF1DCA33F9E56779AA8E724A911CE0E65CD38504F181EA880166ADAD6B5C5B7EF3B8FD0D4134F9F5FEEA6CB4EE47B57E04E24535ABFD5BFF6A7B55A1F7B37AE25E5 EntropyInput = 62B3C2EC89AD1350997793395E1D7B359F42876B70F67F2E926B73469ED1283D599C40A215778AA3B4E9AF92CDE42D12E00E6CF19800E2318B6BF987A789DE7BB134FBB4033BA6BC801EABAAA19232A1 EntropyInputReseed = 1BC64DA7D9AE6BCF85E01FBD6395015675C71C40DCFE1E98D9CE10FD58675A4EE4A8739546F0BDA2AE2ACA501218DD8347AB123E4E4E93DAB5BAF6B0527C8966 AdditionalInput1 = D7B5B8DFDB078D39A9E08F0631E3A30D533C65D908A0D034DABE9E53A762D6FA AdditionalInput2 = 23FB719675CB5D03F601F605BFEDDBFD22410587D5C6DE91A4D4CDCAF44ED135 Out = C9595D489692BB81719EDD37D8CCF68AEA0ED3B929E7D4FCC6696C93F3B694404A283A0D684FAF6B209B1AA47726163CB7289432C2F93AD83C7BA7E685F147280FED0B2CBBAF2AB77E8714889B813BFF236BC29B90770DEC8FFFE520BDA4FEA37C65A30039295599C9EFCE32BE315D9A1E41FB8D5CB55C7AC71D955EA2B79886 EntropyInput = D64C4963F25A67AD62FFABE756DAA95A1BA61A8ADAEF8D11389C40E05CE4A1210A85737B5ABDE0A85737F3C8167C7442A6455F85FE1FD6E3BFC2EC953802AB56EE7E8F26EFA48A19B83B316A090C701C EntropyInputReseed = 3108914BB6F0FAC881452E6EC55E885DB6851BA58BC720E8763871F7121DF78AE5AA7B47868EBB1BC4E15DA69E4F146A706C6248F06EBF4C0DFDAEA71098242E AdditionalInput1 = ADF22731683AC2EC856840AFE4BBED5C4B0FB9DE7321E7A576A6D41064E2C7DE AdditionalInput2 = A8AA2ABC2FDEED457D4FA4420DE226328C3AEB70285161B0EB29408D2D4B4B54 Out = 16A71FB9DF2C1C42B02B829BDD9FC399AD7D1100534D8C09ACE35F2729A5471327669361B89B02AA393ED7A90335C175769F78BA17D77717BF72DE6473875674AA246B87754FB9D115477A09E7A31088EDD7A3E604101979626D5E85440CAFCA73E7EF8B4F6F92E1D629A4BAA41ED089B4819D495524965F9C312517EE1BEA0F EntropyInput = 74D370881697B0EB04ECA6A4BFEF2C522D49FC7517D1181512A64BA10C407201348068B14768C4DDEF587F26C1BAF56B38203642CE3E988A11958980A5C226A9C4A5DB99CF67BB44B042343D643E2CFE EntropyInputReseed = 6A7FF80365D99B2567C44B43EC55B932217DBB1108F7C75ECE8B87C30A9D8867320854C10582B97DC7BCF4CF7CD9917521C2E73B66DF2FBD64FAE889288B0CF7 AdditionalInput1 = B4DE444E8EDB0EDD0442F4C295E109386B6C8F36A81F8590078791E5DC12D81C AdditionalInput2 = 46DD82993FECD021C7817A4D7EF179E5F92BF7D1059F150A44DE65B28A72D866 Out = E16258CB5450B575EBCBF65F06CC5D563415305DC6DC9E82693AD0952B3F4D5F2BA7B2A0CC6D8CC36F4DA2327A9407ACEEBF0B755EB6D9FC9975E7AD7A037F945FA6EB049A5C650BD50F47162B0DDC858F38D44082BFC8CB750B2E13A009F9938334415D83ADDDB1725911CC1DA2C65EEE6D272E81C0C705E55C1EAF18755A33 EntropyInput = 3293882BE72B476A903121688DAC37EE9AA6205A7F3E59313EEBA1B225513CF32D4EA1E3C303B275F04C1778F3F1901D50A3828E033F47574D2926B7C7F9F51850B3C0AEAA4018C2FEAC5F67E80DA3B2 EntropyInputReseed = FAF897A18944A8C693678A4FCA516ED747AB7CF801441649B3FE2B9AE5054B9E6367E1C92948E61DC52FD5D7BCED68FA573B501E63B9C063463602C4454E400B AdditionalInput1 = 44B7F762FFB8FF87DABE76B04E739528863DC8703F4618013A12564A88BEB069 AdditionalInput2 = 8239EE765B26250756C9D5234ADC43803CCEED8CE94F920B26FFDE6BC3A7DD6C Out = 50645DA68BBFF48ADD4E22BB6F378417A1995EF32F0100968615FC1703AE1D4B0BE5A2F1C6DE76595DCBE572F18E7F2E38ACBFFBEF4358BFE3D174896B29C241EE1B9EA8A233A1C2EDD21AF868CD7EF995E133D1173485CC15CE0E72594317E3DBC4E14AD0EDB212DFA2CFFC5AB56A830B188132DCFE50FAC399B30F90D97D06 [SHA-384] EntropyInput = 096349506F3A7653D54DB7EC1D09E93413EDD175B6DDBEB00E56752A520AC8FFFC7983B918ACADAA71A67E1624F1B502 EntropyInputReseed = 4260A0495FDABA58AAE41DF82505012D480C8E4F751FD7EBC39F9BECD694B2A3 Out = F4C7BEC0C26CF3892D214549AC6F3D82F34C6966D4295099EE56166E879A70ECAE130251FACDA351E903D877B6C5EAB5153CE87BA6C7CF8BCC61CBD14CFBE34CF1ED43678AEE69CD87B60E6BCB6FF48EBD44CE9E31982D8FE20AEC34FA51D625F845F61056575969BF785C2FFAB4DCC754F13DE63423E94BAD8D5E166D96A62A602D3EE4045DF162028B89CAC45E6207D9097F2B3AC0AB17729251985F276F1287F5C56CC9BA1A79FBDBB291F3A945FBFDBD63CF13B82EC91F7B1085B33279E3 EntropyInput = AECE2087B713992FF49D3BF404DCDA18403E015632AC03735FED29102CFEA6EC1B574952687C9BAD0E9AEDCFC1DA568B EntropyInputReseed = E632162A83C802AB94F32BBD87F6CF4AF1F2703F4A02AF7D60E22383A770B9AC Out = C0344807D5E3EA29FEF73AFB2B83DFE0AAE186047FAB6B603D8608DF49476BE18BF1F0F4707198FEFA18804404887EA3C598D887E938440E1FBB8ED0A1A330CFF84D952CC6405B12E7BF51B0C67D5E4896006DEDB44637E393A97925890FD5176252F69D43920043844A91D0840844D89B8715052CEC31E257C121D3FC0EE807B84AFABEE59624A00703F464B0079F12884A6E888AE4959C5423604F8AE2E6B57F4428E10B680CB74CF20417380DD5378449A24EF95D9438B0FEE386BADEE962 EntropyInput = C39E77D579755AACD454AB7CA6528596C397F28BCD5467CC7E0FB47F398E875DA83892A840381C1BC03B7A223E92904A EntropyInputReseed = 714DFF45759124FA33464A97D7F0D7FD2D1C6C21663D31FE80ABDAD59458C228 Out = 10F8EC63A550C31ECDAF2FB1B373F71F18D146EA033DD65CEC2EC0B73B55BB6F3FBB7136DD045E09C4073247F093493CF26B6683BC9EBC98025F75FA405FB8DEECBFFEB0236A33F0ED6C7600D992CE5A268C86085ADADF68047178ED89D93D739351F892723D8D6E4F428946E4E6DAD1D640A9C11DE23CE9B793324E31DFACFD367D86855A28CC544F88B8A91506753FA061CEFCB9D77BCCC15A23A84DBA644089EE03DB8374FEE91DC23AF6672159B0D2DB219FFD07390B69879910B5C336A5 EntropyInput = D2E8A25249AC850FD3B01F62CD1EAE3DD94D38E724F8E2644B7BB510C37F203890242B11BE773BEB202E9EE93899B60A EntropyInputReseed = 00EBF08DB1648C8750B14D7B784CDF0A6D4E7CDC816469CBDC3A08D6D32503B7 Out = 019F74EEEF674EF100BA4A1835BDDEB925FE6FFFA97113DC00D7D8C0ED486A73E831561AE44C5BD90E189FBE2BB1BFB84F3E82EC8809699EE8C2FAD80B464B6B344999C364868300C1EDB065AE86109DC29516F2BDFE2A046EBC8725044C382D93990F1CBA185F61F71FD22FBD076D727DE32A6C1D2F430BED491C9D09EB6EE669A1DC4F8048C7BE199C7CBB5AA4F14D1423C8A54763869F5DEE947F776EF2543EBB88D3004739089EFD86B7B22327AE952747068B35D4B3D86CAC1DEBCE3E41 EntropyInput = CFFC6C44279E641856C39F14ED35440EA2F149C77459106F960CAF910AF21C109067C0F9445320ADFC0AAF0C86120A38 EntropyInputReseed = 584747B4049588E5D93569FCECD358C51507BED59F96145BB8DB6BFB4ADE3A2E Out = 928D6D9F9128B0AF64028D5D2E94414AF9F8DDDD353E4155F42A5D08F3E530930E01EC0DDDF25D65DE7F49DE702791372C71FCAF5F20BDB24EB999752BFDFCA28525B16308D46CEFB0BC3B260490115778161DB2FAEBBD687B940BA098E3D5BE640565B81ED9D434B6861FBB4CF034BA77380562119AA3164DC53653D4E82EC84CF351C35B1B668343FAF17F172EB4C0CC3999D7D24AABA58DEDF11225336B5BD747825D2AE9100CF6DA3276F26CEC198E52EDF9194162483AA4A45FA348D0CB EntropyInput = 3A1F0474C279548C086DE9E12ED754C49A0322E6631F7F441C8024FEA654BB6CE245C357B13AE94064D1B41C23E5E049 EntropyInputReseed = 6199E8AC9D535F8D95FCF85FDBD31EB33C20793F35075C412BA7213194A873FB Out = 954B58042D028ABD00F7CE3D39FDB61E0CFF6C40391EF8629E87101915771B8D0C7E24292751AAB1219645743C6F54306866775E28B54818C759A6BF807C4982EDDD4BE5E22FE35A303CD503D122CC3FC5CFFE50B03117457E2EFC1FD91A9768964552116811B0E65856E8F8256681C722EA2652DEAA2498025E84262A3FDD78BD33BC36C057E198327A33232ECD36501A0ACF997D0149B4A833153B710B90C8722B232A574D22E7026A89A4D9CC3506CC9942705A162B34DB9F49301A087DFE EntropyInput = E5F4FA500982BDF8B023788F9A5532482B29B12E8AE776111ADAA617A958CE8977873CAEE6E82C5098AE77287BDE1D82 EntropyInputReseed = 95B8AA125923DD7F8E05DF78ADC29898836BE76DF7C5AAFBA6493B211CBF8B94 Out = 5B3FC1A7EA418DEBE79994BC0A8C86F487ED2F320C34293DB950A1A026C239B8DA6226D1DEA509A0FE76F5A811C9391A622343324C293A0090587C10193A2961E358D1E71C269827E0D44E93D87984F47ACF5B4751C8C066156DA1C44662AF4826CDFB5F7CF98B1F0200D3A0D7B99FEA7F1B17DEE7ACFA5BAEE8F95AE4E0BC050BEE2EEEA7C09BAA729E6E02ED19476BA3F8F5A8C1660DE0353DF8723EFCD98F5FCAA56F6EDA77F2D15C76D26989AA998C4AFDC53FFCDE47DAFBA8FE5818E8EE EntropyInput = B9444339A8738DF6CFE95B6DC28980D02799B2EC5C8DBA9CA98FA8075621A04172B0C9E414EA33C8BC4B3BEEB536161C EntropyInputReseed = DB9A2A516F3E87BCC9F92EBBF4AC1A900559756903B72C4C1B5F9082D8B341F5 Out = 09465004F009ED378F440C10FB122A265F464D373E7F1A1719C713F6BF38D28FB5447C269C127A0C10081533A847C0E19F4B640BE0B1EDF84D95025D56679E5880922F29C942E7284296A9309B4FAB1B5BD9957D470DB28D3D36A3585FD37573E8E3355D03690241D6F7211D8C6B054A813BA25F9CDA76202D3270BF12F66D2E5BA5A946C7D28DD22D55D34A30A040AA9782D1E494603143D436CBB0212FA0DF6D1BBF4F19818B99A68D9CB062AAEE8FA05636FC60A072EC6E5EF24566C6B96A EntropyInput = 2AA822EFA22D4CD65359107C46309033984B8E9C3ECB1B77078A09AD9EC746EF4F64B287BCC3064867B678F81AB209DB EntropyInputReseed = 3EE132A11F8C9246CE0A3D6DEB3345F9B15E4CD048289991C64A21AFC46AC98E Out = 7B79BAF0126782BEBF1794FB48633DC69BA88D63504D27A206D974854D446737DA4CA1FC5BBC54368966B583DC441B105BB30B3BE19F2778ED31564ACF333B7C4CB1727480AA985AFD80396866E10F6DA31287CCE07358D6308E56E3BBCE8613BBF472AEAECB27E66305E34AF593C8631508CF7D2C512DF7C9B3AB04A4EDE436B9D2E6919C03A525DCEBA10AFBF6E8A641591D09E8A90543F1905B08537B8868337C774C20ED47DF32D115A7F3306D808BB82D06BCBDC81042D0A16A3FC8D0B6 EntropyInput = A32AC0AAAEE05D57CB3A626FD26854EF08A3AD42A3C688EC6A9F9B67BBFF02F86DF150DB0DE2E3612CF106D9F158FB57 EntropyInputReseed = 0901E1EFB12252666E7A680513CF22BC0172C4F8C0D8B2EECFA1D471C10C9EF8 Out = 8271BD7AAA795B58D8F741BC207332335A68FEB66AC9C3BFD5DAC72F20807029F555C3BCAC629D228C3A77D596D99C5D545A8DCDD0A2FB2A5EED5C3492618DAB4F763ECD7C6580817C6A7ACCA42D81831BFC13F38ED56ED42055877C7F31DFAD35A73EB2052F6F9183DFC89B5926680DC2AA85995D42A0C073C881F1ED332794A784553493BFD842225030E0056D76E52810236B17F6F067D1272372395FFE9C2DF3145CC65ED2C6F2F121DFC6C1EB8FA6132B44EE0373C7C027AF80383D4A7F EntropyInput = C586E0F5999F107281DD5C7CA1FF88D4617B4FD1BB61313895DD4BEDE875C27B5B0E6C5BA15E8725EBA8FA009406AA3D EntropyInputReseed = 8B8B66F13E07C8918C0F3F55262DEBFBEDFC641329E1FCD6442C245626CFD206 Out = 9D4F4F688406D8E57D96369553EE39267A9DF9020D7FA78B39E1F246675B70A8080CAC5AA6967E78C55071241E20A9446A82507A215A6C5FAA3A2EA3C05C12905558D98A8EEF90C8ABFFE6CF8B874C5EF057E365FDF179438DE6A78B4DCC075B41AACE875A5DD35A44F2D2B17D6EF6AA91F79354931C4D487142F7AC2120FD78CAA6C7FF5298729DE16C0E8285D73A3C6A95ADA99F329DC9AA0924B0059A6585853296789B7E1129432BAEF4BBD2240A8EF7B19046FBA104A85D43AEE0EBF021 EntropyInput = BCAC6C2160455E7DB38A9C94EBD329C1AC043B6FF607A9C76A86156974D30251B4F4B14E6CF01D407CB426AD61608D15 EntropyInputReseed = 99A6B7BA9402756BEA2709CF3B162CBF040D0F5F38FC4584CB9CF4E6A7BB3984 Out = 37D76EBBAB0D4C8354086A5C5EDD5AA6314A4770749D468B9E5D3454F2DBC9B25432F2D5D9F4B88BEA7F9835EDB22F8A7B09BD604703870ABEE1160369D0575BDD3847EE5FA93A9FE9AAAAC0D436022F94D1B96655AB00FEBA1F40202425E51B084E372249FBC37F49410FC9D4D16173A9BC29181B62E342A8835F818D2647C45B6CE6C5B6F29ADD13D57E80513F767339575671BCCDCCDC9D093DBD72C91BA07D81C58AB5256B6744A94F0E75482E3848DE891DABF384322D1419814CFE1590 EntropyInput = 4B667D35A481779AD919956CA06E07366A974738C09A5685FA23B3FCC1A54260CD39D725A7F2661EA86A2D57CFCD2A91 EntropyInputReseed = E08419476BDC5534DF58C6C3B077D3ACD27ACE0472F91854C164DE7F76A9B1AC Out = C82E5E2FB08171C233670E9E5403B07C600BE4E91FF5B57AE284C4D733139B56ECE720E82D3F9AC185E37D0F44D5281224CB5F9D230DBDFCAF1756389FE752575A2764F6AE775D0A82F2EB1D901AB04B59B54B5FADB2ACC9B9AF3E829EF19571DC416752B1BB0935EA2F3AD69DC452285C2F08412B11794134BA3BDA0A10425576E88EA7B069B74B436ACA93FE9DD1DAFC78DA1227B13D70157F60C9BEE644451F8765E4C8BADDDAD6C779D6B42D4E8B5BA65269186B04C38DB348AB5F7A4146 EntropyInput = C0DB9453F84C2AA74BF93EF21B9E7802BB8995F6FA5E634CD4064CA2A0075319A969BAD1345BB5432DF63412807A646D EntropyInputReseed = 2008394D83989CB4A506990F59F8DA80E6B3A1DF3FB8D726639D59CBAED1562F Out = 120BC268CA0D3F55D5AFF5B360CA4D29A4B8EC5CB624F9674EF0A67B90BB70C238B94B2BF804FE74CA18F8364FF8B1E50B2315F8AA0C3FEA663E93C80544284136DE1D162E9078E9A074A50B493BCC7E0C83A0047199164A2D32133DB57ABB05B751A357ABD3AD5298773BE21C534F98645E94F0935AFA53729462ACBE55993B7D801BD6B0CBC8EEB5A1C5F0C0D690702F8DE0A1A78DCCA8862538201FAFBEFEE55CD5BE62AFA8E5111C89F1F68D0F1760CECC86BF6675CB09B20E097BACE037 EntropyInput = 31836D292CB46AAD594171E76237A3422844F62FB14D0CDF63BA587E73501051C7CBB280D4B46412E10927C9523BED1B EntropyInputReseed = EEB5163737DB7F910E444E5D5221C5469655FDA4AB7218E63E1451F461B4FC70 Out = 1CF3B49F28B791E7C81706FB1A870F1AF134A0FB0D2AACFCD6E446CAF0A91C04DC160F080EBD5503FB7C16AD9229BF0A7BFFCAAD07329D5BDE4576870758A4BFFEBB6B5C309114688DB8E59A55413B4B37689DF38D72BC5358291BBCC0B05AF487A33934CE626EFDE918D0ED5F2DEB75A17BD8912A31DCCD783354477FA850520C3B97B56C6D2B9E4A05D49BC36E6683271F2322C9A546FCA88C502187A5F4A2035BF5C527AA312F16C357C37162D722510B52FF8357490A096692572CFD8B0F EntropyInput = A0C341DDF73D9404177A5FDE32CBE21319C318F35CC9AFCA9AD41A3B06E13491E843CC6AFDF2BCD00CE77FF06CE3D8A5 EntropyInputReseed = 4772C46BAF142E569ECD9131D6185AF3575BB62A41CB646BDCAE8A7A9FE60CC5B83491EC1BD89F3FC84ACF1AAD6FBEB8EF6AB949F41ADC6D0DEDC53722C171FE AdditionalInput1 = B76CEC3D6300ECC4A02E810296C7E70BD9B4E7121FC5E971CBB94337980FDDBD AdditionalInput2 = 2A25CB0ECF913749AD46B585C76097739A14CA7B59F1F3CE4F79BC8A4AFD1378 Out = 98C01D4527FD131CC327E9632104D9EEE10407CD73AB607228D37B9B72CA2C987AA794804D505D072561CCD5016BD4189AC9E3DB9187822877DD533347B5D2071818BB7683312E1E8806E9B73B021777F7F878BB7D304EC58CE92E5E36D3D05A7383DC77F3FE6EB84B615F3F290BF8A43C34EF5478A30A6AD616157C9D7DD046AA66B522BCEF61C9D19382C32425D38ED3FC049E73035AF1E8B97388DE22C4DCBA0BDC09FD36AB7EB3F67659CBD92B8D7F6D74B56FC8DAF17068C65FB016E29F EntropyInput = 7817FE880C0A4224EAED0DA5F3962727E4B3BE567021D37D3B6D4CD779274378F1CDAB91C4E7C1433DCDCD0AFBE4B43C EntropyInputReseed = 32A2B5FFC520AC3721BFD5352FED023D04439C176288521319B5E315B6E5E85AC7708C25003E6587FC8C8116C500D37299F5D5FFCAD3405349351D4FED623874 AdditionalInput1 = 45F88F2DF43C4B9C3D829B7CFE61904DDF658C16043271F01C5F06AD3EC7BC32 AdditionalInput2 = 883CFD717AD8466035E6D3F3C04813E21657AD62EEACA449785AEB0836AC94F8 Out = 6E0633C532099EBF0B10D4AD35D78A48B82FBCE37913E655484AE40E29772A25630A7AB37F1D0ECDCE27773A2CE88521B171432C07C02269DF1822D2B6CDE0D9F768375D9C60E688F497FB7AE262CDD5F7E8B84B84411D619C36529B41576AC456A240ED94D750FA722DB874098EF7200C74C3234A3E5F21FCBC2CB5D50C4297D1E70901B8936964CCD242098002F4C8ED7DBF49DE8C2A924C737F248D46AC1469F676377CA52CBA12F28D9B534504D6E8423B5404B7E14DE954B4225BB53551 EntropyInput = F2BB6EDEC000982BFDB301D1D88A23CE840E496A4F595A662E4127571264F1D7E9E283C567F11E7E266459FA781C6FD9 EntropyInputReseed = 5339015836EBD69AA42857010F44E8A72B81F501C96931FB491DC1192F6F6A27ECD5EA33146CB74A707EEDB8DF881EDDB1797CBB7B16C16F8D741D23795774FC AdditionalInput1 = D410D6E2E848F2241EE45C9870064AC0217D97F59A8E80F6B5107FF0E4240BD0 AdditionalInput2 = 8A8C58FDE3B8C9711757CB17E46587D0C5187F758D64478E9968604AF0367136 Out = 990B1F68152B3607F3011F8D04EA33A3E8FC479C8A6EAEB589133569048FE1284AB44D51BDCF4F0CD4C8D64F4C6337CDBE5F4F497EA90EE4204845BEBCA2FFDE7831CF49892829322644C4E20A45A9885FF619BDF5E79EE53C26F47072E20A46D2B108D180D6BA5859A696F472BFAA80B2FCC7EDA374A3F91AC0B06C9F13AFAC1AF244A389CAB4489D0EE04A0598F9C5168F39B40E7127DAD9F20D69EDE6CAE7683B25DED1CF9D903541FB4B0A804D7C163AB068D22949F28A8F4E853E691E51 EntropyInput = 6968F5B87019B4CDAFCC9F3A89321F25EF5D8D70FD0781C9E3BB01B3ADA18C8B61D9142B639AA75F5F9D798CA538475D EntropyInputReseed = 09B121048E8A0CC4B2286EFA12FA8B4B959938261A1EC8E607526B7A27931191FBE6B8AF6685422EEEAFC32327A99104B45CA5602513AED0A5C6235328E8A7A5 AdditionalInput1 = 04F137391E27CAFFECD4413C775117FEDA27CAD839AA900FF2AF47C700034B08 AdditionalInput2 = F185925CC180E556A0703A5956AB6D846121F9D9CFF97F65BBED3BC44904CB5F Out = C8BBE16192BDA74EF89D9859B248AC658896BD40B5491C90E923CAB6815EC3D2126C62410370F5F44E01FBF1D1653064AED835604D5FD0633C8B71CDDE6C831CD91D69E420DB83E6D5D82C26C47A11F2EDE616A2885A884835CF2142A6AE4CABE989700125DF12902374BCCE04F3FD78F034E50398D9BCF463DDE6796627820C75A7EFEE82FE4E16375AF57AD3154973042E0A92110EF745F468377F6CBEC5FA1A1470EAC80408F8E96D37248B100EF8476C2A85CCCDFCA5696FFEFEEECDA9E0 EntropyInput = E8E99FFCF08AAD8E50386F5D079D79D3DB783A74165C6126B42B3140F744A7C723541930C8C772ADB62981DBEF8D054E EntropyInputReseed = CDCF1C30228904BD7BA31798BFBBD64757AA251AC9A1AE8C20A050670FEAC59B546E04247D6CB5212A57B62F99E1CCA767A5768CF79296F45F0DB24732BA6368 AdditionalInput1 = FD45F66C8DEDE41387373C38674605F3E075C9B7CFC66123A5478B8F8E3AB276 AdditionalInput2 = 39911A79C6EDBBC805A50D2AA018742094177A8E216D647C64428C00169AB2D6 Out = 871577DDF34B29E5CAF132AA82E1D2F1586B76E39AAB62ACD02F6D4440908A772AC5F6FD48C5F55F1EBE0E76221AC46B834A8A4F5DD9958721EE053BA3AEF1574EBD980A5DA6A94693662717EE548AF0F921421D1AFB814E4D1799D351889D2A1BDD57570A913E428E6613B16E158C1CFED038F6578920D60DB73DC10A40DA9BC363A0206B4E7E49670ECCEA866EFD9A05BC237042CF052F2A4140F9377E3C6792B88EA06323FCEBB99C643FC1C3653758D6866CDB148837FB0FDF77DE1564CF EntropyInput = C7774E199B5A8C0B306CA236163249044EC2153DC89BD1C1459CFD40CC6069FD1921837AAA80F4DFF34A97B4DD7E94C0 EntropyInputReseed = 143EFA24F34924FA52ABB4275A63CAE7048A7FBB8B76300FA8D109F9561F16991F437F758512071BD23D091C2B1AD8D51B99ACC663E1D037FC5421092CBB1A45 AdditionalInput1 = C622AC1071B50E4F899E4760CFED476ADC013B6FF95C9B7BE671F79CD2487BA5 AdditionalInput2 = F973F45F75FB0D68E0BC5A723A72E722E6C8F3FEA08D785141C78786DA5101C6 Out = 9475C697AF430E94ED396C707BB7D5EE5BFF18405131A0E898ED38065ABC28EBDC1DC33D767C4DAB69C846E3350BB414EF2D43798710958A6FF3E6B55DE93C2AC31793A1DD4B07379E364CE72553323B9BCAA8839CBBBD347B4A82010B78967219B84C6FE9F9285FF741A0036ABA6BFA7DD0D5A4FFC1936341B0E2A31082123B6D2AF6740CB3FF43BB4A87EE74EF7EB06030745453D2EC225C8F31D214F1DEAD0F29AF01EBFE90D2F8A8BF5E031242EBFCBD136B3E3DB1F63A46F69A26D6159F EntropyInput = 898963D0237C58E4B7B6E894AB271555407D3AE8C1C4599F5F5490AD5701984A6E5DDD58D311B547F6FD2D4D67ADDB4C EntropyInputReseed = A6B86839B83978BAEF72B8CFBDD0CF180518AF0E32E52AD4A73DB460AF05E187CBE5F14445CD310AECC97113232A0121ED2082F2C4152B4BE68448F36C91B1F4 AdditionalInput1 = EFE0EF028E4179AE10B378BCDA3D96056FF21D94404BFE022B563CB6690AD563 AdditionalInput2 = 98CF6A771C05F904B53FF9B12709D20BC3F1821385CF27ACE7A4A584E73866C2 Out = 5682B6BD667B45DCF16527A817852B52A7F5D0FA8C962F3DD3AF63E7E71990DA92B75E9FCF5DE59B1565F525A734E978BA74DD80FE89A2E527960CE4207B9CA514D933676AD93E6DFF5D57314A45889637A623EB7832854C3897FAA511ED6DD246D2B8280E7D0524647D4BF7715B5546E0A9A1DEC246B1680ADEA2EECDC354FB3122654102CD0BF94AC9333CAEF3FDC369E7649653352739783D048E08E8D231B332FA1558745E2CE89DD76D1DC442A71DC3D5EB7D3481558941E261F989B097 EntropyInput = 426BFDD4EAD656611CE49BFD9F213843C194BB6863534EBC258415148F457E6E685FCF539922AADE348A2AF678038610 EntropyInputReseed = AF676246632DD70920D661518D4DC5221381B2FBF1C2F3BFED01CBB930398095971785B18E244D03E25B9A80C2C2204F5BAB6DCBCAEC986342450EB9B376BB5E AdditionalInput1 = 5DE582CBA43A610866578604C9F2A542831F41C277D50B324F4EDF1E2E5D498B AdditionalInput2 = 46E4C325D2C45E00A3C17AB35115B5370ABBAE61337EB2DA4E6AA91F951F55E9 Out = F2E8BE2E994B74A4945FEDABB167778523865ED27826F9C26CA2B49BF32AF1626AE62BFEAAB13E9BC52A081F365062A5CDBED0872F6479CFEC5A5E79171D97EA898E8D10ED71203882D1D7B7D28C5D59B8872985ABC628E73622F616C4C0904ECB1E4518BE8B4398662DFF8806C3F43750CC9BE95AAAC2A4730F40323D63AF157D13555D043C4D0D7CB53F202DF282FDFC5544A234F71121E893814F4BFA926351C5E9427E90F1117A3BCE7A16F0E08CD06C3D7C458F9D07CA3269E015733AA1 EntropyInput = DDFB3D1D93E977AECD08EFBD71DD48168E67658D93596B742670ED7C8804BD3E730D34A80CA1FB4AD2471EE22461BBDA EntropyInputReseed = 670337D675A17721AC63C3793153830A26B1871B316A3E10E49C555F44719577390C53A5EC1DB52996EB042F9A76E45F0BCA76EF6EA31B4642F00658342E601D AdditionalInput1 = B5436E880C15F03C3BB846D90F3EE5FC5BF5393865A112A4317D724738F5DD25 AdditionalInput2 = D193F932AF858698AB086BDA36D04DFDBFAF487FAE4298B38FEF97BCCDF63F38 Out = BDF9E1BA1FBAFDB8F4628098AEFAE4810EE7FD565D0D285DDC3840F8E24A9985C2DE57EDF5A511079BA6C952C95C626E296FD62F3579AD03DB536238FE69158317C9C26D373816343505C60A48E07A00EDFF8FBFEF0CE69ED176E5484D056AF02A270BB6FCE7BAE0B223BFD98AD359D53B159F3295BE3FD630A568D2363121C7021EC23B14693BE48F5B55E06BE3D729C2A80948194B1266DA96317BC592362809409A7666D5C168125B99DE26DA741F17CA52D63685EE8D8260D45764FC78EA EntropyInput = 457E49A71DA81A2A08BB19B97BA8E62AE4B5AD4AE64DAF758A83A75506F9251149B2BD7180F69B9217346F8165B7CD8F EntropyInputReseed = 100E0B1066E2877F5E5DA21B037C2BBF178611DAE627D9BEAEE64A9D0186462AC3181F694695C21405588F600AC33871B519E2B8E3B876424B32753DA483D6EC AdditionalInput1 = 68E717410F99AE13712175E402B51058B7625B7DA27224414B472F9622D163D5 AdditionalInput2 = F2CF13D05E853A13ED47C5D0EEB9C0416688050342F0D345AC1BB21D5AE675FE Out = FC23AAD02870885394CA831B72201D76CF736F08F6132B12178E8E3B016FEF8D3BBB849E5D935AB732054CA701154E7D3E87D1B51B7392CCFAA19C4AD28638C67BD149FF67A93C09EE1FA5C2EF7BF9D40844BAAE79169E52E9990C93F099E036B63B000FB8EA67A13167B045C8F9163045BEABE0575FEF00B89FD90390B0124961698F4AD8884A1E1FAF576DE7A179C03221402279B31C93136B9436F9A07B5A67B1C199E7C6CBD0B5F53EE5BD0EF845243077C6EDA0E021AC9219F6DB5AD503 EntropyInput = 79E96CC8E77D8FE72CD6C66BECB52753CEA28BF71680FA541F345B83BE79973DB4081201BF23C94D1828E9CA1E825AC1 EntropyInputReseed = 8AEDC5CEB87A4C1B0C333C88D97E0F12D61B338E5ACE5E15F71283D31A1EA90F4304CCB2666B227C92E2B00659CE0B34DBB53451591E32914A60D6E6CBBBFDD6 AdditionalInput1 = D6E74777C02252B0613357B9A582F4D8CD7E436DAF1674A663561B62D8EE7143 AdditionalInput2 = 0DE123897D5F090B52DB88E4C0F9FE736CCF27C134B0F5EAC61B200D15E07986 Out = 55A369D136E2D903C179472EEBFC45AE236994669C46CD318401BC662F38A1F714F78AC9F15C819D2BD876A7AF51E6CAECFF3C650A3E661E5D137A354CB16AED5B1554545BDE08C10BAAA5BCE22284083B43A6DD9941A37F1A18929CED61181C137E9E38C79D107465A5A12F2A2F37788C8E398AC48B2BE944D6DD3562C05922C25569C26A1203FDD244920E6C268028DBCF6807C05BBF1559969981467A479D7117A91F210118C1159749A1DBCE4D8A0D5F2F8232C5152CBAA6441865AC3A88 EntropyInput = B37180874DD4A7E08B1256966ED5845001B0773B5136956DCA7194CD12A9D9E1F1DD35534F579307DE11C1E64875E937 EntropyInputReseed = 7081DE3095D83CED0EA3DF2EE8D5BE4DAEE545B431DC908BC10EFC04DB16AB4ED3C8AA88CC8D5B59AF3685177CF3826CD675854DEDDCB9B501C40C4288CD9CDF AdditionalInput1 = 6783F5BD86FE178E6A4D303342374ED32853925F143A5AD083C04A9C298FEB99 AdditionalInput2 = 4774E5D062EDA04B680D717F652D87BF5CF635F597287B76FC35E2D5CE593D08 Out = E478D45FD3EB6F4C398A0EC84F93EA6861F00666753C143506C5E417100077E2C4C9ECE450D98C9372D68AEFFE9E57EF9176D4084F9C6D02479B516942DD4792A90FFE1E4E49A8156BDD872F1F05FACC06E71E581F919CD94FB97208515BA284FCD255EA6F1D1EBB7D351E1CEEA1CDEE631072D3FC3F4EF9D5FC57A9CA98C88B81003D858CB5BE0A3520C34E52D3BEEADF91388EC9A495B1FC7FF7A6799AB0AF211ABF52C15467274C04BD104DF14033DF000D8624ACD253A6C954C0D89B7238 EntropyInput = 2779F20C02D086D30D53DBD6E7396A35E677214650E39F2AE83077FAD70C068005FAEF347E7F73EFB53A92F0629E012C EntropyInputReseed = 7E1246D07B4E1BEA7008DD8ECC7546E3F0A6E0E950E083373FDE3FD994E114A455EDB840B85B391D4F1940BE52A3E3824119349C780811C570D2C88DBEFCEA16 AdditionalInput1 = E83EF56F09F82AF4DD91A0B887D3F182DCCD973435B74B7B3C432B39A61FE720 AdditionalInput2 = EB9F30F2886D0486C5240F43104E426B36AAE0006C4B9C64DAB1BB713BCEF7E3 Out = 68C3FEDA06172A191184E0BB77A8F3C9096048BF71ED95B20CBA1B1726660900D7D9F97B7AC648C76B50B921C28EEE3D401BA81C8A46FABF82301FDA8FFE9D76BD93CB275638F7C2088CFDE88620661EB844CF953CC141B31E946338A0203C8AE67C2AF1330A53251818AEBEF893010F16A519FCF22060A9AA9C597F3409465CF3C9CCF753DB8C0BD3B465B028ADFC447E37B5129C17AE9E8BD01F762662C466491FE57384825C163AB8A26D67EFDDA01B053C19D3BC6545C3661F2AD1DF1E33 EntropyInput = 71C9FB2EB8CCA98860F955A8BB3669C70B6F5374256DA23FCBC4FFC2E90BC0A043B8ECBF1CB0C7B65A2CB7A47211541F EntropyInputReseed = 2675512138964D0DB8074727158BFB4F0D3C093F1E2C2BF697A48C2EBD27153B13B1D552E2C8C84F66961AC8C919166A248BC62FB896CFF0B8B001CD7E147BD7 AdditionalInput1 = 27D626121EF579D9969809762C77068E4573AF44B6E947A2892337A11404C133 AdditionalInput2 = 456EA206C38662750AF39AED5FE0A39760F4DAC85B83D7CCBC335F53A160A0C9 Out = 464AEE8AF42AE68EE776780113805CADE246B83A698C34BF4C92E5D81F28829ECDB808884BC7D784397F2B2F8C76A2E3517B53BCDC7257F44EC9357D014AF4E8DDB44DF98DA72775567356F363FB85885F8F22505E5B5A80C824B4A0BC48029E3419D3D2F161B1469CEAD730CB123CA8387A2C8276635A91D0DCB2220797AE2702468587AC3A70B927625F3A6E2980D6FAE6FDDF4B380CA0D91EB4AEE37B98644BDEAC345F49523A241CA392972DA02D70364F9401C21FCF39EEAF414A09FDFE EntropyInput = C9E54BCEBBBDF44051E80B91CD10C87DC24267923350B6770406551A5069EA2255201F3F15BC3A2E4CAAF0B45510F19D EntropyInputReseed = B299A41DB8D56CE993ADE44323C455FB1A3F504124C35A9E907D9765E810C9392819B3EE279D57145EA1020EBC77C46031D69524A843158192E081F2AC91512B AdditionalInput1 = 269AC853CCD332FEF61330AF7E80A33791EC44B6CBB83006E5CA0670597B35B1 AdditionalInput2 = FDF031B1E0A8016BDF6A6EBB533DDDAAE1A3A5B14B9CF52A1A8028CC720B10C4 Out = A1C4C1D6E72DAE5E4714BDDF4A1CB8D01CFF8A3973B12022011270C0DE7CEB85FFB6A6AEDFA54D0521FF33D748FDEF8F29C52C7C414E692A30DFD0013776B58F58421605369C83D4D891A19C782A2D036F9638ABA9E24B0EACDEE87D4A8011699B638C287F0A12F11EDE86A946BE9C00D21A31584A2A0DA536DCBF86E2DF63BE9A7B771999C9C7A6B748DE713B7DA757DE2D731A8D980B75136B0FDC75CA7AEF47CD36BB9370C5CA0EF81B9A04FDC78698720F68E5D54E1A777E557A1DFB4C22 EntropyInput = 4D95F31B9606A5F6D04DFF1D89B50BECFD0882E6CF51C1C5D24AD843BC12D977EBA4582C39D793A63EADB63F292568C743BF6F32B3B5F580B54179E4102D063536E7C47681D6DE3CFE88FD8EC66E4873 EntropyInputReseed = FC4270E6C9AEC83186A20819A7D35E7F1155EA108794302D593C53CE9D25422B Out = E991D000B24EBDF838BA11F9849591B0029FEFF33604BC4D71ACD94301F8D045EEB1F81F3A101A297403A35859113C099939638680D481C86067F54762892F82146F61CCE7BC2C85D395348F3EA2ABA6BB3E59DBCF8E41A81918B6CAB304D44EA1E32573CD6936F38CDC11D3C2F96290CC27B0DFA3BBBAFA9394ACDF2F4435170B428563427C4B02ED25924226EDF8D5A5ECA4EEC4AECF98EF2E6F75CAA70BDD84877DF2E637B7FAD621C6170CA5BD86E21D0BB01CC90FE2E76353A9D5687BEA EntropyInput = 1378443DFEC3C03D36B16BACC480EDFCB1A4A509C17CF4B35787DAE3BC91ADE6C113A1E0DF927A4449FF9E2F4F1CD9A2F67CD35AFBC96756499C68A5EA19991CD1AD4880FDC13AFAA817608A141E9646 EntropyInputReseed = 7B07F57CCD6777F6D6BBFC9655F0676D7B4F91712EFD43315BE7C7F30E51DA89 Out = B32D9838B3F45E3C4B3EDE1181BF0AADAB96D22790D8536F5913FE95C3EC0179DD1C7AE69430BC8C68F4F30105199B785A11ADF7ABEC007D18ABCEE2E65DF5A211ADFDA35FED8B9389A61D2FAD33FE020119E72C782A316F17F8A588239567315BDA461F5F4518A1AECE4D0AE028C153D67A8D4CE620E571FAA0403C56BCAA864822E4D8AE6D14FEAFEFCCBE879CE4BAECA70D436218E0EB3A62BF15C018FD4CF66A50E3D9D7CC9E4744E29E9C945EABF03A6A2C4CA57E582B60914417DA57F6 EntropyInput = 69E9396C58ED867EB52FCD046504922E2E9A9B059234CDD3F0A09EEE9FDFD45DEDF5D3860B25115F8A3D0E2F3F5438901B6E1BB613D199A5E6F1B5C2ED041CF6F6633E2EF4D50ECAD89B28102BF70554 EntropyInputReseed = A23A5AA278F836577956944A098D18F05900D1B076D30EA745BE745B9EFC0DCC Out = EE09F7B24CDC6B51A8212CA00613633C1A5F044FA921BEC31BAF679F5BA66BFD723721A03E0F260A44AD5CC4C580080667A781427A34C3D2FDFACEB4B040EE675491C4DD0C0D13ABBE81336384806E37F2729E7FD080FD57011B54B664D58534C831C90D182D4D955676938D484087B0086D2BF2737A912AFB66101575CA2BC5ACF845F4970BB1CE4441EB667D5096319D6282714A8A9708EF9964CADF596AC3E7B1BA18FDEC7E2E22F5E6352E825E965A494CB880AAE78477AA3BCBA9428107 EntropyInput = D2F390FDE0B50EA4AFE6BAF29A75E698FB0275C04C481DF03910D238F4E72C6F63A6231DF89123C2DBECFE0CB0313DB32BC38D852D1DDEE2E89B7174032D96C0B97F955E16BC61716C5C64248EB6232F EntropyInputReseed = 4288F4143694CE2DF2484D20884DBCA097E35C3FD8DDEE5273B53C1149BF5070 Out = E62346C72EF393A2904E982158992DF4CCAB03142C41D8D29C1454794926C48570EEF34BD021D44CC9106401E9CBCE6DDBB6C92257E89A787499D7F7A2DD527833307E02F44645DDBCB1303F1DA95382C89805C76A2F12EB13D2B0205B7EC0EF21F596C98AF608A2F2A2C5E3534E01A23BA25BD5FCBA0481482E1EC8138FB1C86840060919D7620CB7B879D1096F64AECAE1EA085A793A9F4DD665449CE73CB3036DD5F2A49138CE88C461A0A9E2F0C1FB8338F5EEA53AB0A0CA8A8DF9C315C4 EntropyInput = 0CF86FFA1456C453B53305353CE43AD3BA44EBF4C6943CDE8613CDC417EE9F6E759C0BF4676F1EBD05C519EB84DFCD3E088C917F84679641F491AAF105EEA0F02D0A8AE0B7ADD69645D1EF304C74B417 EntropyInputReseed = 379CE61016E48CCCDE24753878F7D8FD5DA72518253B2F836F32E5B594D54AD6 Out = 79E71D9A974CB88D9022D35997032BB5FBF8F0DAFF411467217837A836AA44C493F868A333D1EBF66689895B53C9E01D58019DD1DA2354FB966C88D2D6ADBE66AC0B8901595A24DDDBA609478EC36E497F6FB6B4BCAA88B1E9A9C87088F66611446E8C2873E89EE1006B6D92D2EAC54714FC6481E7782B38ED4B18D5F9714AE6A544110CB6063C8A9964C52A7026F52AF448783C3427092E0339EFD7D1A8522848A2FAA8AA19C21363A537766C05505CB979269C73EE90679FEAEF8DF13B6506 EntropyInput = 7179C434BFFA377D9B6821DA9571667C8B962196F7D8AAD062E75B6091A34A454E8F4D14A60FB5253AE373CF50EDCA93BC1C39E646AFC1BB62685B746007148494209A419B733E938C1A5D02E2350860 EntropyInputReseed = B8D2EB2075076EC8C7A42B7ADBE7723A6BA8B51A55FADB16FC3A6FE9DA020482 Out = 3093A2E1F502D44D8BE4F35B386774162F0E10870F9CD34E3B9D4E77C7EC7CD10CDFA0BF8228BE96CB5741F069440A6B6F9EC155D88BA66B7FA84959C53D3574BF1CF9F1561006C776223B881DD396E9E9830AF2C1B5F7457FC45E823B411C5C2BA3B11219AEFE5508F75CBDB5E40EDF6B1F61453541AC98DAD9ED502BF1A8AFA79604261C7A89E78CF2941D520E0C10BED18820DA6C23A5ED1C0DFFBB04CDCC9C3284D400644E9365C995D8C99EEBF444F2CB051BB62F231301D31EA815C338 EntropyInput = B063333128A6AB4F433F151AE8AEC4283AB6D1CBF4A69447850FA1A25930EC0F4204DA52752A9BDC788C5CEE6D8B92E1067708B24DF7A34811993D5C65D5348EEA73E6C6680293AFAB5804B4328E7A96 EntropyInputReseed = B8530DBE0C81B1D34037EE53F20758D5750D9863ED60C762AE2A8B4C973ACC22 Out = 5F74A1D199F30FA22F2020BAF036FC61B1CC2ACAA80B48DDFF1CF85FE5DD200A9AFBD8BC51DD1829636FA335660F36D5D2A516E4C38E8EF0C3CAD979E79E7E226B820634EF1D76AE81BC3E3807913EB0731B2E959C43AFA83FEB1D8DA31DCDCB3DC3A4CF8F454C4EC41BBC822E58023F0D797C844BD8F20034B31D99579BFF142CF53D2651D7A31B212D2B9D5705B048860D6C4E3F45EF1BF2D5E46433FEC593B9F68BE8B1E928EA04DDC4CE2FCECB737BB8F9D054C2BA5060FAE5E5FC21A650 EntropyInput = E23FA0C86C8A7B99BA0D3EC3CA47349A57798C07587B666CC4AE1C9EFF83B8CBFFB49D1910BF05DB3C7D0DB7E27285AE7FFDEF21683A75484F6AC304801C213DC8CB7E3CF0F94C358A2E1CCC9969E834 EntropyInputReseed = 9F6B4411D84364B27A66398F5B0A897EE2085526D3AC4F65E70800067D57A51E Out = F952956CB8C528EFE2C831C67B69E8AA7E79C013161497B9C55415FD40C7FAE778A6FA82109A40DD72FB2F4D92E1CBC47F52D055485C99D893FBEA1CF28DAB35BE1F162494CB79EA45C44A63A1685217CD3733DCFA88BB6DE65C68F2390E479C0FCC6B398DC5498AC93002E7E7F360535D082C8E46386611075665060845C4F8BDEE38C23D2F90D2B1D78217E865ECFB6DF02498DB837FE581C43382CD1D3A508B6DC052EF7C4D20349679DB8D8BF8DEDD763DA8E5DF775D133970BE062A9CED EntropyInput = 4889013333CD1E2B3B8C4365BDE690B66E06BCCCBEA25F04132A0962F13A7D458E823F5EC0EA091A07065593CA44FE49B4761D82A93E17D8A0A461EC8205932EDF218157459A25A7F26CEDDB59992192 EntropyInputReseed = 611602D165A35AACB352206844ACDF41DC2C88B63B36912AE81875BFD3E098E3 Out = 72AA3601986E6C970B8C2253118B8381264577E391E48BDDFF0CCEEB5101975391A2C731F5611316B255C2A6C0554ED6CBF8ACBBCD8609E3F99C3CEC38AA060EEDB863563442B7BEB78F35221736C608A933AEB0D4A7CC050FBCCA351CF780D42C5380284A6163520A80896EE7F71D2961D7629D673791F8FAC10BD01D32D95E8EFBD65381424C378BBF54B532A70C285D98BDBB559C9F37D6EAE889B82D5006FBA2892AE16ACAB103AFF1B247711EF92DBC6E516C92E388FDA4243808F95170 EntropyInput = CC32EF3EA3B0DB89C69312CAD56B1DDEA73BA4C302B85FF3C6605D1899A96F49909C6A54D98BAF096EA5BD46ABC25353CB80942BFBCD8F112ED601CB12A5CA52CC0F280522DB11DA92AC6C76BE3932FD EntropyInputReseed = 09676D9D6BB9917271BF8C86C8852E29BF3FF5B2FE56AC094FA35DCC51547F62 Out = 2C972CFE1537BAE42ECC46B1B41A691350F6E63C202245347E91602B93A4CBD5C8829E5A4F63F7EE0E29ADB69386E8B659DCA2E6000AA03BEAB132DB6DADA8DC35AB68433671CF621FE4593018B1EAFD3A2191507FE015E2A5694FDFE2C3182FADA71D18C5FDEED065089862249C5508F055EBECEB9FCFE5D16E4479DC17E2B59B5A0AA31CF21FC6B5925569B0CA63D1A5CD268A4D409F1039D902556236FB06E61C1C054ED3798CBE4D8C2A7B2D18206212591174CEC9DA519FB876C583A20F EntropyInput = 142BFF9332C48103221359040CDA6632BAA92CFBD1AE7F8B3D0E33D6A8193939D9D20D17FDF6EDD1B3CA9FF600FE96578DBBCF0C190783122AA6DA6E05EC9D82EE29F8E74E59F8FE6EB9492FE410DF6A EntropyInputReseed = 46B0BA1B61E9AA5141EDB77ADE0F191B87F0B33C0F3620801A755DCA02698883 Out = 2537A8638D5759201CBC225E844208C1D08443B055FAFE23329AED5EB2D814703B0FDBD0A89C2D62F8F4EA7746905B9BD90706B734060C96E4E406675576BAE84317BF36D8523BABAB72236B71FC6087DFCFCBE765DE13CD1ED316F495E3BD08D780CD6A58849C929EF24B41E9561868158046FFE8D2A89D169BA31331611F0872C6D075B9938E5170A3B8612F9ECFF4743C0DB5AE365FDC2678EC262EED3B7C337E65DD1FF24A867574EE460BEC7C374FC6B3FE9B0EB7BD9F5507EC5988D313 EntropyInput = 821ED44BD793A4AF223AEBF52413BA5E0E231B2029B3D71475AC028D8C10F86D2382EB9C62BAB540BE847E22344704D38D2C8CDB2DDD6934271941F071EA47DFAB869A5671DFF9D424B916C1CCABB02D EntropyInputReseed = 39B798248D0BF2990C0621316E3C98EC07F05BBA8887783ADAEBE8FCECC48FED Out = A5FCF13E4A6B9829AC30171920478A7878AEDA658803F2E314F9EF8CF42C9C1933CBD8DFE5053ABD30DF644CA062070662F4B7E7851D28FF801CC4B878523B4610891ABB29C095A70665DE1199182FA193439665CB19CBDB00AAF3FD0FEFAA2278194E79EBF652713A28C36F2CDB83F96C8EB1E85C9969381B52BC3444E8AD5D82C94964544B3E6649AE3F532D25A2E370E9FC8C77753239F130091C43720FFCD2BBCDB70A75223CFD9346091E8C056227F66648941552EFAA5A0A369291E9EE EntropyInput = 977BAD4C5D1D16A2439863AF8BB6FDBC206AD0BF20C4036C044645962C36E2E853F0D702A54B70421A509C25DE124F2751CB91CB7FF1B39E18AACC0BAAD20443522BF869F26D9D7182005B5CB1D018DE EntropyInputReseed = E330EBA581FC82EFCA522E43956187C9EE4F58F971E4B91ED51CC8AEEA26FDC3 Out = DF4ACAFBE4F28EE47ACC5134EF665A50DEB68DE9B3C7E075B26D5731049F13FFD00CDA05F612F20FD901FF127277F269C069607442ED9F7B41892711A72B83AC592048BFB28AB2C64C6B9F5EB4427450F4475B1C04DD4665998B638D06FE8F463E2F07FF46073003132B66A5D4D19A65BD08230D1DB0234FBD09A98864F8CA824E7A0CA9F1D1662027A60C7E95382122674D88224FB192CFC129952ED6515912ADED9C72A49A39A00F9F9A16ABBD361B20A12B5F3C4DE54012AEB1B42F6FA3BC EntropyInput = 3116EF07685EAFFF1C77F185FA840BB5627FB9A5D79F72F8007CDCDFBFEFC56BB1769991D78E9E48FCA4C97B01D720D1F138CA3EC867CB7ED7D5FDB0868D7470DE5F802FDB941DC400AD524D9032E23A EntropyInputReseed = D3EA6FA6FFBE2569DA94B6BB36CD34D72C37D0218B3D02C391E0653E286B24B8 Out = 59F01EC06C97A49CC5DE469CC2B39C28DB7612029E0E24E3C2B24F92C0AF2383BFB9A0DCCBEEFDAEC4BBD2607DC582EE7EAAE6A4FFAB251404E3C59C95E5460CCC8D8DEA4DB73E924CCD7528708E1B6A9D62D485C93764686F93DF6FB8A9AE86BBDA1E038697B5485E27E0BAC9A18126BFF1E7B104401306CC424E783F55EBE9940176D7123EF58C9460E5FB8311F745FDCCD39CE552547ADCCDCD853BFBA87AEB87DFE8AE72080FB7B3E5C4718E743C9F576D7752E3DB1FDB29F160BDE115F3 EntropyInput = F5BA27C487A40DFE342FE18E7F9C72BEBC1EA229C7634CCE87DEFD7AA11448E3F584D1769F3E76A017430E6E9BAE6BB634FD124AAD5A10B852B2FE8481CD0EC46DC2D02ED9583F6E282A4C908E319024 EntropyInputReseed = C79170925E1156275311D86D4A03CFE3DFBF85F80BBD70EA98AF76220833A0BE Out = 977FA5B70F4CA3C04B6F495DE3BFDB4B8AEF93BD14C82653E30A00A4678C602AA889766AB7CAA434D9C15BD68BD14E66CDC609289A691DBCB391611BE66C2056F8E675DE5DB9B2E2F15E5A330D00A8886EB8B8EED4076306D443CA292D783FB056186AA86E1DC9F18A113E015E535DFFEA954319CD26E5572F4173766207ED7D9B8B2C42A741340C1850A07139C0B358CAB942BEC51B159E50F5AA9D8FBE7CA9D1D2127A98FBF0F8C3094BEA4E3039F7F7AB083FC9D050E29E7D4CC2D3D44CAF EntropyInput = C4868DB5C46FDE0A10008838B5BE62C349209FDED42FAB461B01E11723C8242A618FABA54ACBA1E0AFD4B27CBD731ED9135132CF2B8A57554BDC13C68E90DC434353E4F65A4D5CA07C3E0A13C62E7265 EntropyInputReseed = D30016B5827DC2BFE4034C6654D69775FE98432B19E3DA373213D939D391F54AA0BBD02F6AA71A06D1642CA2CC7CDC5E8857E431B176BCF1ECD20F041467BD2D AdditionalInput1 = 93EE30A9E7A0E244AA91DA62F2215C7233BDFC415740D2770780CBBAD61B9BA2 AdditionalInput2 = 36D922CACCA00AE89DB8F0C1CAE5A47D2DE8E61AE09357CA431C28A07907FCE1 Out = 2AAC4CEBED080C68EF0DCFF348506ECA568180F7370C020DEDA1A4C9050CE94D4DB90FD827165846D6DD6CB2031EEC1634B0E7F3E0E89504E34D248E23A8FB31CD32FF39A486946B2940F54C968F96CFC508CD871C84E68458CA7DCCABC6DCFB1E9FBEF9A47CAAE14C5239C28686E0FC0942B0C847C9D8D987970C1C5F5F06EAA8385575DACB1E925C0ED85E13EDBB9922083F9BBBB79405411FF5DFE70615685DF1F1E49867D0B6ED69AFE8AC5E76FFAB6FF3D71B4DAE998FAF8C7D5BC6AE4D EntropyInput = 46C82CB81DE474AE02CCCFAC1555D06E5DC44B6EF526E0E28356FFC8BC6C0FD0628D4D942834B94FC977609C8EC0A6395DE51E3F49951BAB36460724A63F046E75F6F610BE7405F55016C93A59F1890A EntropyInputReseed = 2C0693130C6215D55E37DA43D67DEF719051E99871DB68128E245217D2AA32305DBB13F5B4EB275CB757513E6B8AF6FEFD7C9C9E0F5304FDD9B4C0968458F22B AdditionalInput1 = 3EBCEFF3232E75C6BEB79D97C78E93244A257F0772F82E234518C50E322630EB AdditionalInput2 = DC64E5A1FC7B32F0294DB138DC131946E5602266F4CDF00037FFE513A44FF83C Out = E3480544036A3684A88E23FF41A4BBD810F827021CA45E800AAAA36ED0B9BFFCBBCC99A1EF1F1528B4BFE39514C7A390BA132D1681138C4B1B9F1A0FA1758837DDE35D0F6C38683BA47A904937DC5EE3D3B75F909E5FB6311C6CDA5E1121EDC774E66092AA1DBDE83E4680FF95C0BBC2946AA4D46770F247CAA7B71BDEFAC9641EE99700FBD1E560F9F7FBD462EDE64E009CED90C44C6FF03B890E16C79C7B8C959A27DEFA6F062168891977C637EC22ECFE20601D499443F1FB0ECC7D9505B7 EntropyInput = DF8053DEF0260AE71F67E197AE8B547A228E9B67BA7909FC1CB3ADCA51058B15F6D5951F0B60C972D139B75DC44A368026890036A9B17D8E805C38568630E1C196091FAAD546BA8EB976F3AA031A8905 EntropyInputReseed = 127A84799FD7672E429F20876C175D135E5F894EDC7A4DA334EB8B73A334BE6140EA6BEBB0CB94B7E527787E17EF9F7D3EFB889FC1E47E49893AC5C4BBA988C2 AdditionalInput1 = 090271C307B43B951C20AD3F081D2838DF0936A4BBDC5EB6F2E16B1DB482B1AC AdditionalInput2 = C203CC1A3AF668E45653BAB6B1AA39BA0669491A06D00CD39C97B777A8BFD4D7 Out = 0D68D903C85C0172419DC9F782C5D67A0B3367D13CB2F734FED95C7FC082291EDBF4FA83354C6588227E40BBFF082BE2DD276C264823A8F31BA18B00955D7A1FD612A2F37D824BC82CDEC972D3F8384DFC78B51DCA61E815766C877EF3D2113704C805A250AEE7B55B849AF048FEB3536FE73EC4F0BEE97006881D5EED8EA38BA1B8D16A3BCD91FDA749B77D688997BFF09F104A2D8CD8E133EA4AA764B237787358DADAE1C25092CFE09F79EFEB8EB6E20C39CAFDCEED90E602F221FE6B1D69 EntropyInput = B1A1B468E1D59716A23FB028E295588F17BE6A79E589027237681FE9CE354860B1CC33918A64C8BE171E595EE6A3B1EF77E5A3EB6AB38419F84B57997627C6BEA79703C95BC1CD24EA73EBA2EDBED540 EntropyInputReseed = 46C2EF21DF2815528482AB4C7A32449B97AC75A51DFA1C7E67A763F17E97BCD652AA0BE951816D21A2EDE89F53913F6D5D70CC580A1CDA8A49F8E49A6BEFA909 AdditionalInput1 = 5BD8E4AC61BDFE752B5A66CF2E048E812A8AEAE8E20C3C8C43F31180E4B18303 AdditionalInput2 = AF5EAB21E4DD9443B1B16F40413FAEBDB0E086991DD3C53C8A51BC434348311B Out = D477404BCAF0ED53788354705F0FA9F46C4E2BEF2CD94932B614B3C34E0B0C7C28D7483075C9745BFBD4E31E587FB1DB77D557FCDFD3FEA47DA3F01E42635ED3FD87CF6C98A2F20AA833A1BB74A15B158E47841CEBE53E4D5D8C85CAE78ADE156E025A7737AA9197B122E73A29CE0A881C7ADC8EC228F4C14E56C722ACB0165B1595F010266151801812C031EFCEE4A7739876777816AF8BAF4D29496912A012F1F33C07107B2DB5EBD681722DFD76F3A58E9D7426E7FA75E326EAA416C5D820 EntropyInput = 098B8C107FBF943BCDD2199DFD15F130A20D518E95DC81988748E1F0ECC5C45F74622CA2940807DF86FB05F0AAB47275220BBF23394C3CEF156F683D05739B76F37538A0D360600BD52F0076425B5F5F EntropyInputReseed = 25F19D1D3BDA1F70825F3E1FCB18D29E8E410616C105FDA9324F4617AF39F021AF88F076AB39DB1DD0E7002BAE187965CD144382A3D1CA7B1ECD65D346F7C090 AdditionalInput1 = BAB9D09DCE5073D11FCDF9539501DC998B6FFFA8A0716EDCF583A7D7385FF41C AdditionalInput2 = CAF8D4E10513E5CEACAD6F9F145A6F79E5C245AED4965AE85E2E7C5914F97510 Out = F556494B3849D78B06AE75571F0B9C8C108885FCB041DBD7892BF639D8FF6C82E19E8CE2D5AEB58E8B964CE4F75976A0A9C7F3EC8373B83150B88D6C58FF9B810124D4AC62D955AA64D194AFEF2F77DE6994642EC86CEE40AA7A5591E99A63EDBD8BBDB22FC3C2506BEEE6D507FE34FDB4D4F525DCBE30B5747FF920A13F9E230899FFFFBC5615E994EE96A1BFD8890CF607379BE1A39D173662D0967C9DFEA33B14D78CC8818C2A1956197F85E92BC11133AC4F7657F2DB20ECEECAE8CA636A EntropyInput = F54E9DF92752D30EEC01C3756D569BDB39ABCDEDAB80B0AACAC76AB406723F480BB359A5FC6C7AEEBB6719AB44114A75B69F77D5A08850A13F8E6D06847C4BEC181AC0F6B720BE3C06C0B67D44843C6E EntropyInputReseed = AFD340AF202BE3CA30E4DE794B826237105202DCFF5D1291CDAF26667327582540F14C3340E7092B898758EA3C36750943ACAC7FBB6A83F0DF3392F7936749CB AdditionalInput1 = 5BCFB0786C447675032D2A32B304F25737DE59CD07C84D3875C45475B15797D4 AdditionalInput2 = 656AB204E2C1834F346D89C37A30164DB414827D83CA732C71EC71EFA8182C28 Out = 6EB8F276A8FF516F789D94D997F33C2E40B227776FAE0681C83FDE659462B72D37CD48C95899530CA072BF2470986EF29DFB193BE7EE9AB3F8CDE2317C9BF02A5F901CCB62BB665BC3A109EAB7E3910888A522C765EB49B11D1AD0FBCC45ABE3841E9BB4FC0E73188497CFFBA54F3FF82260767D0F70EA1668F45192E6719102E75AA5CC43084C50BDBD1BA491BB61EE9E5175092C1F50D56BFB68977A567E41C1E05D2D1523C198DED737079131FB12DCF847219D71FBEDB5659411D7AFF2BC EntropyInput = 2CC330B34C976C859936C21E2AD88BB60FF153E41131567F58AD34BFF5C9CB418939FED56356AF7FE215986A5D0ED8E9BF531083F35066EBFAEABD67B82D392EF6B121E7D9603A5407C5BC74CD596023 EntropyInputReseed = A078DCB1D3FCEE6B99714EEA3BFCEFB37A344A69D414965539DDCE9DF239BE2F51F223DC461AC2DF1C4877F65CA876D635D50939FA9DD586C176D8AB73C6D605 AdditionalInput1 = FF9D6807D71DED1305D9E2CDC811DAC2D73746B001B53EC8A5509C4CE0A07EFA AdditionalInput2 = F5222C8966659974DD8A7244D2CEE588B6C9A2700F338683FFF9CCC45B6D3807 Out = 981ABDA0E405C976435EC7F938570D911E5BBB32ADD52A8B94E528486E9DAFAE139EB15CC2B56FEDFB9E4B2D10DBCAA5E6AB985BE16C62B9B75A037684986843A7A0E3BAABC34859253DF2A053DCB0352A0554FD2D4530DE0251B1B852D1D3B6E08548E215902EC8DC46EE89F3FC262C7A35AEF8216B3DEF65BD56F0482A18A329F96863AFD951307740FD8653D333F932940E2A87523AFBC162C5C1D2BBE16F33A4B0EE0EC75BCFA6AEE6D8348265938738BE638F78506AB731D3E9AB345551 EntropyInput = B4E5AAD9BF4FB03DED64E4BF40ECC6FE2214049BD5889A5AEEA0BF47BE8670D329E6ED04538DD6D207767C367406D48267826D2BF9651404D5DF4DB84EA64DCAB10697ECB90C68041F421452109AF3C3 EntropyInputReseed = BA7AD29231FD944F00B8D9B762935B93819EC62E0CCFD48F619AC40C9C20830467D6983465FACF33369EEBE0BE12DC65FE736969E8F41478E44EC25D461E4435 AdditionalInput1 = 65F97C99140C8C9BA2CE37710B06F822CC0EAA03589157A3B575BC9C423AFC3F AdditionalInput2 = 19C37886D613D24B0592EA0B3A465EC8F8A9229ABDE3FB5E0122032E1AC8DFC5 Out = 05777487BC152260A852E1B31A091F8E929ED22D8A652A77E4391ABCE7EFCF0570DF3D466D56DC51EF14BBC55309C6831655BA97C6050E563083FD1F2FE65B43D0CF8762EF6598D967B473B68C4143287F70D096A6EA120E3C07F2A95B80B393FFEAFAC2D0309D349BFF017A49B9EA547A5776B5C38B9E981ED0A4825853CAFCDF0F17269B9DF6189FABC30388A383E3C28949625EF3D59A2C371EF416ACE8658ADC0E0B0104F1ACD4B349B91B660D64412168D3C9E29680A5E324E4D0AB9258 EntropyInput = 27AE2120824F3D416BBEA1F987440C507A4F01FED08A1BE27E6EC16390C92C4F8DAB04203543CAA3981373FB991D8553CD646B0D1971F249F4C4D1EAA17E60C311D813057E0B71819A503AA41E5C6B21 EntropyInputReseed = 40C29BAF439F23BFB599A5EEB95EC2059AF24DD86C0825957EA8392CE3D980F190EE2D0BF06CB94190E6505A75D12DD77C266497DC99C5F89BDE60BE6789099E AdditionalInput1 = 7D82B50CDFAAB9B5D23FB6618B59DD28CF1A83C77FF2993D9F1EDB87ED7BC388 AdditionalInput2 = F7F728D8EF6AF8C5E77CEF1E837030A6AA5C12BC81423B0ECB07A2DB95A32A28 Out = 4B25AAF436EB600A103D3FAE8E301D2755132B3DE3C8B4C442129A88EBB3AB20C4D3A54078ECC4197994FF04BF0E460919978D47E45C7D10D76A1E63AE34624E2F64125AE1BEF304EFB1AF688F20D8E212F6DF4E11243A49177E4B6456010D784D0E4A94E75371A75C4050B27E48359549F8268DD2A2290EBDE22282D96B2F38E3F06103DAFAE5F54F0019BFB013DF39A76482EC7F878D26EF0E34C9C21E67FBCC3412AA0739E875DA0E9EA1340592144EB232385FC7E605ECD10FEE45524718 EntropyInput = DBD5F508E8226ACB957BBC4914AB13810B9B5B2B51A1B55CD4AC60F6B6D4C370963448FD323968C27D97E005B1A079C90CDA5D501072CF482D3C56C49A3C929B423F6E15A3E835888B3A9873647FFDDC EntropyInputReseed = E3BA151887006C56593ECA7809B23CB768F5B3701B456BDC85FB5672A81DB2D9D3F38CA5C0BBCEF46976C6A5965A8493F714AA2C8A2C817576CBC0BD6652BEB0 AdditionalInput1 = 20014421F9AF259892F017DD5392CC973F103D4736F3866E66329E5E7704E0F8 AdditionalInput2 = 686ABA6C9C6C221B2B4A7DE766963E4D9880676E7E6AC8E644DD273FCEE519BC Out = B720C7C56E10C9E436036FA8E1F1D1C0C0B7246C28BD36E5F3E88F988684B95A01127BC64CBCF12B9689F718BAA52042B0837FEA791391EE2AE42E54ACC571239E5B654486A025AC25F46F10280ECDC65ED098E65E07DC3870B17AF8BFD58EDBA026DC12B4FF04830EF132D07DCD7C62F67172CAF2620A204869A81E39809DB7BEFA25C5ED8A74B6D306C21CFD3778180D444BD99314A430FF4EF6B7061832DF9B82603D6A0F646B398E7DCD8BB33A7926BDFA085A450D3DE68C1E8CB2EE4524 EntropyInput = 7093224D6BCF0915EB75360AB4BB789C15834A371BAA24DEECEB33F86E8BFB46F4E34325DDCBEE671F9E45F7887C1481E7CF1F32BA369CF5545EE672CD6746EA9A336DE7039ECBB25419259EABDFA44C EntropyInputReseed = 238993EC4A309E10D3F8E3952C840D564644062534F985A6B4E38688D2C800A3BB186A460387BAAE27C11AA8C65D6EE003577EAC47B259254A933F82AC683250 AdditionalInput1 = D823535ED974B7FF9F19DC38B9494AA99F88143E3383B5A183EC00C925BDFEDF AdditionalInput2 = 56548AF797F4A07EC42273F895822D877A311BF1F8DD5C96FD8449732A13A921 Out = 159C6923FB71F9670DB4EEF12DADD143EE701BEC9B0F76B56E9B1B8C473EECC3E38CF06C8F3B0C3D49580E49CAEAC0FD48DA5F53D0D3E9C829C253FAC4E4F09730177A63E0E759F043169E91459C9CF959D2230C7B94BE168CF4FA02588D78AEFBC855D55E444D671A69D274C66AD1851C56C0D880416BCBAD08523CEFA2FB384DD0F9F188E8A601CE0A92D42FAAED0A299D6A9C86958854712427B35E73A0817193B50F3557E66D64AD80FA9FF87427B7DE5B7E6312D1D9988BA77BE90D4CCA EntropyInput = EA96F8787458E505F5858E31BB85B6E335206F6D6D04BD9D333029193BD2A04E5F85AD152675ECC090119AFF7720739BBA45DF1A14E23361201A467D2CFB7A3DCE3128069A8A59A9A388B8E31C48EFB4 EntropyInputReseed = DBE34551EBBEF10E822CD29E9ADE1488C21FD9E798369D585D6F58168D509D94D551272E5A60AA1232FCB4765E853DE2CCEC08941ACC75188ECA37120FA49AAC AdditionalInput1 = C1B34347691AE9F1BF6BE396E8B49AAEDB38307526627399FC10C48748C3A7BC AdditionalInput2 = 722C0EFA445262F5800ABF75E43D9DAA44E3DCEE7A7528F7313EE52FCA9F1803 Out = E2F873758C4E71704D8545DD1EAB51206AC11DFDB00DFD1EC9E53BDC7F6B57F5209727049D4D781059B0BC4B6091C9BDEE947127B8C8F03F1EE5F3665720A4F6C6777682EF1937719052254AEB97E3A17B6B552BCBC9154551A7ED41D837A27B6C37B426508409B75236CC156DAD89D896F25C54467FD45F9698A11C7CE01BFB1FE171E4D33FAF73A30C8992C51A838E9C0537354371BF79146A79A6D42D4E987B9773377FBF384979690B2C04C332F22567FB0921C3E33088D3B011921FCA6A EntropyInput = 92AC19B133398B7D8DDFBA3C6046421B3618923241097B8F68B6C7430B6D232AE9AD8F864F358AFA7CAC72BBC4FD90F10517EA7410BDE64EDCC70DF48F3C87F578B38B8C7087DEF16031E52760037DF0 EntropyInputReseed = 6EBC9C15913C11094BF7AAA510E6241FACE016A99CA08DE6525A570BD1741DC7439C97F62D6B7AADAC64057C0003A41A44EE549F60AFA92797EE7C9AEBFC8164 AdditionalInput1 = 669D42F9901E029BCE7584BBD22A13A74E6F6BA50441A2633773BF5AC745122A AdditionalInput2 = 8BF3C1A08B2D8459DF96D6ABFA90725F1A735809DA78BF99F7FDED0230771804 Out = 3B832A7F1DF591BBA571BF7662914B0E5A3B34D38228E377E4E7DCB4B9CB396AC268D71FBFD2E1A5CFF4429FEBA36F55C7E45CDAC49A5FC8A787292011C61F4F102BB9A5D9C8FE1CF047956F21C74987D80968D2E4CFA29BD92A35CB96DD372D9BAAED8D31BA3462B42084DC1841A4042311ABFE4B3358F56C9E0C69E233638D3BE56D0D269CF110D5200759ECEB63FDF3B0AD25937857D129B68F038FC73A842046CC7C45292D6EC3766AAFBC22F1491774624751F2C50FEE830E24A34A27B5 EntropyInput = 7A346BD6D853803D07844CA348F3C4837FCE3E3A727F712223DA248CD82DB6ED4A9710CD8B9F2E7B593CCA42DA7B1A123E8DE39AB206ED166B203C97103059E6A9317D47F7A76BF4511829CC2E27A4CC EntropyInputReseed = 85A78D0C764B24C3E4B21D25919C5400B4ADAF0684C787326C19010728BC6F94327976AEF239B20833D36B7F352E8E6570F8F325B568975A661B54B8ADA49128 AdditionalInput1 = 9419CDF1C59ABC03013D7D443C734AFF57A6D97C870A03762C50B459D38F5E09 AdditionalInput2 = F2C9C49C76BD683D42DD9DE9D45A97B78710F39F2EE482E877E3B0844647F9E1 Out = 24A83991F9455A0410213CC138696CF4EECE7B2CACA0A627C6CE023B7F912C115768AB8AAD0FB10E35591D370E0372FE020823365B5BBE713417BC2F050CBF86FD626CAF91323271EEEBD5F2AAE36FD0ACED63779565604EF2653A0770FE4E42649ECEB6089BB7662CA3D744FE178F5AC5BC20CE7A90325497F55FFD9B25C59A6B82F07553C080F0C45FED23CE47D972605A2F603B72D09D608548A04031DD2BBAE9FF898201E4460479548D70B176E917FF3E3683E49F3330CFA77A25CC48FE EntropyInput = 2D8FB8796D8A1764F8C824C55B880C53D2205559AFBDF1CECDA3DC2D05BF001E6252076DAC013C7094AE72CA80CAFCE2FEEA8AE0B299D5F79315383D938BCF9B536D11E036B28056BCBBC7FCEDE21CFC EntropyInputReseed = CAB30A160CE49DBD646710BC429C163231D73FE0E121F8CEF8C02F70598FA8531A0FC47FA95CDAFD2036EB5314E0F56266E58ABB0F03B5E679638945B1FBCD58 AdditionalInput1 = 30707F376333DF203EAFBA7FC52B40D8F1D97521A71D579C8B8457AC1328CACC AdditionalInput2 = F179C19E45C4A4F3CAD8B545D116CA29E45F322580B7FC9715313BE53F047658 Out = EAF7523B910B653A305F9122363D96E17FD22CCB9B6158CC42ACEEA40C34EAC73E496827DD5FE4312F102BA6AA7AEE934D1F41609BF3E14C29AA3ACA210E3CABE70744A09F4C180F3D1DDF8BE0B530403C5238761226F2C2C7AE29B24439AFD65D6D5A0AA8DAA11ABCE36DF02CE61D352AB08965122E16708731D72A9FB5DE071C20C6CB039273498FF1588C901D997151EDBBD41870031EE337B38233EDFD78AAB389FAE2BD280E4BC85D1BD6655269C3359753B17FDAC502C3A2E871149FBF EntropyInput = DC46E317BEDE8FF5B45120EEFA6DE78031B08CA7876D62D10EC82F66A48EBA3F6024E13963ED404229ACB796BA0B2D0B EntropyInputReseed = 0455C3A1AEE20CCD66A3DD9689683F5CAE3A7C37D09AD6CE746DB6692102C289 Out = B3B541CA462A72A2CCB925F58F40FCB1D5385138B095F771575E628518D694B9ED47B12634063D9E9FB64DDB20DECD20E57FAC665EEC168A18F7AAF8C8F925FE2C34FA9F766D5A172459F32BCF243199AAC7139B2C1AA7982FFB2424A4765A9DD1DD462F08A280350F0CEA0C4B9CD87324B0F40C68F1A877E699187F5C40610D38E71591E98564018ED2E3090009E49E1BE36F862BFD01F38D9537DAA34D7565BB1761B5727DF7554FDAF7F0980DE7C2033C1DBBEAA298DF1C7F34051629FD4F EntropyInput = B5A423D3BA2CF4C34AB37CFD91FADC305A95FD8CD88A26CA483F7D0D7CC1C7AD5A8F2382125CB1FA8EAC3EA9B72BF981 EntropyInputReseed = B93679EB91361927CB8722EEED04A79A2BE1A90D2C12F7C0A453D2F67A6E0801 Out = 1F9B27ACC76C0F249CD179FF8BE8737DDEA8D4A3D569C19E45AE587B1243178DB429430AC8AAD6DEE5D7A107078DE976EBFF10F83A34E310E35C5E5ACAF38FA0B769ABD0D13E23443616A6514558DA04A1A135FCF2924CFBF31C7853E2ECEF2B9C5AD9C7C5F52C876800D9646FD9A687757F44C9EA3CCF6D69D799A72252677C526210A9886E930BD94E9CC1AAC8FB0FE587AC35FD525982AC90A0B17BA420B54FD9901580C2A8581C8365BC10BC9252CCFCA955FB974FCA73B91EEC7ABCD16C EntropyInput = 764E213A53C53E0F6624B61A5436A2AD54E872091B0904A88F43F42F597222087429E52E2B26E5D390F169E2C98CFBDA EntropyInputReseed = 28C0ED0835077D33EE455628CE435DE9D8FA8D32FD2B1465E1AC8D8C1F94758D Out = 25F707AC6C892886E93BA64EA8918CF9CA8C6BBD70D428051804125B8A829AC8799911B2C5C968F519C4A21C0470CB2F5AC315DA7703CCDBFF252309D411E776841654BD458B1D90A6D5CEA16AE73E5453EC202E47A4CA31008DB9382C26DC9BA06C1E7CDD5880ABD76844DA5BCFBD065EB7BBA680E73EA3552223100B538E69AC47834BA61081AC628ABFEA8905F380554D5A10164772C90AECC7D5627DD8A90B2FE81E2CD88263182CF868FF4C472759591708BE7ACD52634268516FAF249A EntropyInput = 64B7C896DB7DAB4A4A844C3C004707AA244F51747B6961E13C6EAB01106BE78BABD0751020ECDED4FE196F8869CA8FFA EntropyInputReseed = 5437AD60B37B1A50797286D0FFEC5E914F991950E31D334A781CFF0303C0BD88 Out = 7A892E2198075A1B77D6AD607149C2E21EA26CD455F8D431AE733958B25D36CD330774C85FD0041419A252D1B0DB2D46C843602501083907CCB1A3AFC09479B63B882292727AAFBD00408FCBDB0590E54B29C8285A75B06D70007631EB9284BC7C632422408889966652DC2F7B21DFD227A3E819A70519CBCE711D7FD23466F92A2394CC8517A549220673C4A1E81A8A09EF90635EB6542CFF2BE201F9406422D0EB45E6570C93E52FBE70EF2A8AD41B203795F9FB47A50BA28E2BCB0E6F62B5 EntropyInput = 10CA4986883F0AB8AB6B7714D271DC65A51CF76F1E4CD49CF50B881C1863D7279D90FB4F74142FC665D18B8F89028F84 EntropyInputReseed = A780264BCE1A2DFBDA9E6216093423A53F89D111A0C3701AB3C18C92CBB2CF86 Out = CA1FFE01E18C9EF2DF00F5EF4C3265646E4D428F77B951F7BB59C810D96D1F46FF4F7E7EF51D1D637615A3B503699C28611EFAFE9F914603F418CCD767DD7753A250B40272567DF48B312F871FDC0D9BDA33CB413A7AA920B3A846360DAB9380069607F483D9830C24125E5B0E70538EC9627CDD819BE8ACF17B05F4FB2A4CA29913E1B88D38B011450F5B127C243650BA5D33BFC34D78DEA9F388384304B9551BE74AB4C3C79F606A9A5EB3B76C5FDA0E2D44CA414CC0493BA0FD0A6B4E5655 EntropyInput = FE9B23FA2A501373CFB4720B8A060CC2ACF6B7945AEDEB3DBD8D2B616FF0D774A8B0D50EBC980575A8B39D47C9A718DF EntropyInputReseed = C98F3C1232682A8C6A8F6699E6C666CA096B31F9CBFB672D2AF26C7C1ECF93C5 Out = 8E292C0C9BDD41F035ACE929E4F34C8AEE8821838E63253523CB2628B92B83DB42405EE9DB2731D8995387485AF9736E7977A6E6CFBFDD5DD2CBC2FA0B7C8AB62C9B2231C91F61FA16BCFAA5AB6CE5F0612176F257212A704875D3D0083C613E781BCCB3383282EBC70D827BB14CD4EE409F2E66E01F9A0F306D380A41035A528DF6D2FD33004C6C5D9CFA3F8CAE422EF6E188CD168A890425A1FDCBEE25633CB43160B184679F97AE3E931AF2C59C5B14AE2875F7287667FC0A99FDE76D83DC EntropyInput = 75D0E3E132E9FAF3FF39C417BE978868F4E4A11B79DC9A4F582A5D75DA144E1F6C48B18D5AB14F0DCCB163186942DC86 EntropyInputReseed = 12B829F2DD340431165600B10C3813D139CB11217D33F5E485170509E237A6C2 Out = 6EDE681D9EBE06E6063421BB70C8753D7952E28412FB3AF264E7BDC3166215E6F19190A21012521BB1BB338D1AF288BAF5E294CAC85A207623A724CB7AD5C8518ABAA6BD2415A4AF7153208569CBF9AFE6999A61003CF5814A3A179DCC0A6304A4667563050D573466FC0FC232188633440C16DCFC987DB6BB64457A23664FAB6733DE332494C81D22D2B50CDA1FE36192FFA70B109C574A80E26A0D66CD7758CC7A99FAE6DBB55F0EDBA0B723D796040676DD07A8741F7D1F3636343CE65CE2 EntropyInput = C5D55591DDF011305DA88DBEA5CE521BC59460065B7734F4380A7F059C88A55E7AB714202BD9EA360B89432B135B51FB EntropyInputReseed = F89346DBBFE86A8DF9EBB4AC6EFC7507A64A11AE3B15C773C589035D382C28E0 Out = AFA85BC3B81CCDB49F6E87BDB9BC06B5F80D51CF06791F1E0EFCFADEF7D12117F0BCFC2B45A88E18B6782E852601F55C833CEC7EBB096464509D44BDA3D6C3D6E9182F37A87C3CA0FDE306AE8964167E5FF2A0A0362A8DB9171CB367076A4772C53899EA0962112311B952C9D835430BA2713E055CA08A0E5B7E2FAD6A01594E73591520831D8A4E107CAAB2EEA1A8EBDBC5680C119F990849AD449B6FAA3B72C0C6E60D14C117AE047355A2DB2108E7603B31DE26BD6772F4576DE9B7F9481A EntropyInput = 9AF8EB83463FCB58FF538DBDA6D1EBE64260347E9C1153D3BABF84511F370E719C13DCD943F5B8EA615AED924C9BEE44 EntropyInputReseed = 765373A3E7BAA3378D6320A8713829CE8AD3A3AA2705FC6EF44FC15BE6129757 Out = 6035AE3D958DB36A4AAD5836D15BC4921AF8673A4A9C60FF6E303D84858DA1BFF83FE822E41F471089B3305FC28BE4B1E3CDB45FBC89BFBAC68F64F5184C17664EDF224A79ECBBEF0652B70B4BB3B818ED897143E9A5C64DA3F105EA726675D2FE971AF5EDB37D8B5DBDE739CE97AE176077ABB2C49D21FCEABFBCEB911533638EB14B45F731D5A938DD4A516B296B400582B1E79A3825C585CD45120990EF9F9299EFC03A6C05507263A568E0028790C5A9BB0B235C27059C798F94D2A87D62 EntropyInput = 9319148FB7C2389793E9F53CD3B4AD8F1BB75710088F1C9A18434CE13B190DA211FDC53C13AEA33985BA2678E8D86D09 EntropyInputReseed = 8619290E975F1C50F6606C7027EFE9C8438D3209DB71EDD023AF0EB024A282D2 Out = 30C2327EDDB5C3942D90006EADCCFC26D27B149F195389ABBA507C0746E41D7FB8CF30C15F2CDFF73FF3D77B4CA0D289F0660073F2C73F83CE819A6A7D8FE911FD109778B501357ECA73079D86BED0916DEEDE54E2E86ECA2C04F3D0706E2A55FF84942CBFEE22B5A92D309B84B8DD3DECB9F3F2C4B24EFB4F382833FFB867B5FE054B21D47DB6C52FF52FAA13CE2ABDF7996E23A8C96BAC48C02980D96234E478370027D55BA8752C17C7A1BF6253084654E79C13BACC51C1815C8B647E36CB EntropyInput = DCFDBB37350473A86EC8E8D976BBA3C97595053E66FF933605378C5891B0060A229E0BD81EB5A9F22705A0BFEBCE3CAE EntropyInputReseed = F607FF51D79ACE8279B119077B67CE6648D198200EF4EC0093FE69DFBF412369 Out = 74BE40BB52916A0C85E910D4930D79C248CA4A56724283AAE65EE9531CFDD188D03BFF22C02C688BE7CBB9483FD15F156C14DFB5132B47D2A0A6DF40B4D3D3BA2B30D0C48A6F4C1A0BD88971F669FB6B94EB84FB945C7E964BDF3FF96FEAD121D08B70F65A27D5B0B8E84C685DF063777B4FA2B94B9FE2EEEE305A48CA3F282080D3B40ECD3DA3D565C5214702B4B0281582E6B528ECFC37A54F2A6446EF6227B5529A2724431020878237C91E6E8F64E13C2AC63761AE5DA4AF7DED14F1BCC9 EntropyInput = 92F260278D7F30B362632602EE0206D66C87B76EF0F9F2F489CEE6A3F84508276DF12BD1D7CE6E96DE428118F4892DBD EntropyInputReseed = 008A9D2A57ED532C5C891CD7534973CD8AF9D22C68DE40DF9583ED565CFDE5ED Out = C8C190C21C903DF929036E682AD05DAA95A58CD1FEF05D7F82A0DC451269B0A5335587C48A5139414027DBDC6B0FDE324C9FAE6039F1ECC097A56E6FBED4DADA506C34F5D41D2F073C3B2EE9F279BEEA29334CA3AEFB196597D6E54414DFD524EB59278502EF3D395715DDC54851A38C0352EF3305330AD29973C20DD3F8C746F71E4C885C85140D4DEEE72C3B0A20319F5C6AE3F6296991D4D6C456D35B50C62D500802C17870985F8B0DB2B89147A088AF05DAEF98FBAD8DC612D4691D40F4 EntropyInput = CCF295DFBE0605758E65290CE34102BC8238F82EA51D566CF49C5B4936C85F64CD884CACDECB227C72B3819214697490 EntropyInputReseed = 06951619EEF139F29C47FB033A6D5B4839EA8F684DAC80F87912147A5581F433 Out = 68122FD290E05E778E7DDEE396DC4ADCF42F04FA8F7BA6F90B7E9250285E10285827B2271F765E32D752B097084E61144B9D7B8957B2958B9D25D17389A351D31C9C2B8C5A5773055A16B48DF99935ADA5F368686AA07D6CA092D0AEA92B5898960ABD2D76A9909E6519FFDD1A1D242CE72928BEC32DD6D13B439879167C9B0C85132A9BEA19D8101710351AA4285FD95B3EADC37A86A924FBBE24E39D0A83A1296D3F123E69040F7832801767073B2FF4C13FABF6BFD7BFEC34721D5624A5E8 EntropyInput = 90DB460CE6AD1280019CFAD5DD0C3CCAE52F4DF1F5903B765414CD9E6C014D6A37AE8378976602FFA52E7B5CC6AAA3B9 EntropyInputReseed = F810E6140989D0F5BFF5A7FB02016A876952C014EDA181911650C0A45A384BDC Out = 25F5890A25F9E27114EF5728918526F3841DED241B0540D181BDA74B6A1AA11EDF4F6822D3F9369A5C0BB75560F4FC9C5FDAF70BFC3D4B2D92ED2DFA33FA3E2912124BDA2D02BA3B1776EA8F1C0F07A124F0BD7B6654A20743E5D40CB8505C296F1B00D0D08EA39FBAE361D91A12A986E912230AA7191AD8A587189E8B3117AC57DF4666B27EB798CD0C96B86561FC688E4622A2A5E0456988D61F80BE808CF38C8BDDAD18F310D39EA610D9274978E166205DF05D790C7B99FC18E07EE1A0D4 EntropyInput = 878893D8396EC7296E54542E0CF128AE54586F881C0006018DC091305B53F28E1D01041C8846174E37BA76F12AB177AA EntropyInputReseed = BB38D54D31EEBE9E33123A824DEC35A5A9B3C5D31F23AC07741AA1AAFD0A9046 Out = 250473B14A26085CACA408AD919627F95E4B0ABF61491E21F98583E23178D4E3F78F27FADF86A318AD45391B4F45073BBBF070F47A9FC0F51F7077473280661D57EF68CB7C0A84585E1993D1F2714B0EE8C6758BB85CA35145AC34DAA8C1A016025F02B8EF91908D22ED070C985150D5597F9CD942D955F46BFBC7701088ECF5A489B37468E6CDC356DDBF3BF17CE70969B8A73E95C296FBDA9862591886DD26637834FCBCEEEB96D81D133DA49CFCF7B2A380C3E29AD3892CAF6375DF741A19 EntropyInput = 52F30BF62724F1A3C3DB5AB47CF7222E9FA8EF0E9725DB46D8FC67CF6E2595D815BDB4D08EB2FFF5F46C94CB0CD9423B EntropyInputReseed = 09786B74D1FCB89A7B716E029C67A3BA67EEAA81080351BA0650DDAF4F4D7655BBA4D488A3F97DA75221DD47453703396332FAE43204AFEF8C64FD38AA510AB5 AdditionalInput1 = 76FB7EE7D950B5BC02388C0458CBC345B12A5E7277062DB3FB17CA5EB31FAE01 AdditionalInput2 = 61723BCA5953738944DB3E2D6566966AC17D113D823315722C166FD36473753B Out = 8DC17927032962C5D23ED0FFABF87C29F18D46E64D1D25BCD310CD07E1DCE7C261345F524D0AA5E9D8F5E83DC7EF0F55B2C7C41D7AAD8D8FD52E7C5E8C971417F6B5A54E560D411CC587DDB9F43BAF07452A1F4E093B18FCCC3FDD86342EF33E4BB2DED45A9B6563E054F5FCB64F63413C10EC3E8B2C015FF15B30C4C62A3011F46D8B7BEFA5391D431B9C7B428AB715D384453A8A2BF9741031235C70C6B54EE827E84A0B4B7E7959E6C8754EA2FFD9B99DC299CFA7E6679328BD4DFE9783AE EntropyInput = EF104E21F78411DE5AEA226771068493516EBDF1764AE416283FB6C8340DA1822ACBCFFD6B4EBF4F61B643CE2E5C718A EntropyInputReseed = 557B21189BD86E51BF575EB61C057E0C9EFA2B84A34C0043990D4A3B69CB2BFA744195DF4403557A494959C2E1A625BDD43859754EC0B811DABCFCCC2F9FB0DF AdditionalInput1 = E2D3AA799E71DD0DDF09662346D2169245F6674B3DFC5AC232A36AAE3AB6F445 AdditionalInput2 = 411E2DC5E081B287BC68EB585CC1512C37D18430AB8B6AC642BAD077801BFD49 Out = 828D76EFC15337EA1A68458F0F2DCD389EB86DBAAB9B83F3DE47E773BC8C05FCBFF30840E367153EE79216B9086B17A2238D36DD79D31C3C6999D879BDFDF7E30353AEDF8D9EAF28FA9F22C0FEAF8CF1172C757F0ECD4D7CDC22EC05C491AA8F843FF64E1EE5B1120F66F76B778169CB196AD2D246CFF3AACF8526673F1C847F40A5C0F844C71DBB72695D372D477C1BC7D1EE493931956982C87EDA72D21A1D8FDA15BE1C55BF5E1DD45D42B175C6ECECB263C1471788F6B0F12F52AA253FE9 EntropyInput = 6E88D5695794272DBA32939AA4610C0E16AE96B2DDD26ED8BBB26033F880077F03535FE9595324013603DDCB1EE4CDA8 EntropyInputReseed = 335512CD75D66D7E5FE1698C5331B9C3522CD93F2067766B8FF4EBE95C5EB3489121669704952332CEF474BBC25D3D057C7A1C771A17E8DF5610EDCFC81DE4F2 AdditionalInput1 = B138B8D47552B4E37422DE0723A15115B60C8C921929881B73B475AF9ABCBFB7 AdditionalInput2 = A91C72D791604A04B548E1D9D9CEF7CEAE615D832EAFB1560F9DC74603F3C033 Out = D99A2031760A13FDA04E30F0188FCF24233B2E5A9EAD7158D50F35E06F3CEF4A7F4E7FDA1CF8BC3583E76247C0DBA3B7C8A080E33842311ACD171B6D8B8607C8BF574F3CD0E7D36A016146143327F1DDB9A36A129AA41531780EBFC1405A41F0F711A6E7A29D2054F8B14ACCFD5E02EB03D07915E344967301AC521517EC30BB41857111BF49EC7B1FCE7ACE166273DA6ABED5EE5643F1D2F391A62FFDCD75499D1DEA79AA7CB453913C4BF8216D030AE826EEE6A5DFB4B3658855154ED16E1F EntropyInput = D8965C0C9B0A87298A7451564668DC38354D79D23164219474FF73CD8B15E8EBCBD60746BF5631D4E18A35212B3002C3 EntropyInputReseed = 72BD6AF57252ACAF0B9FBC283CAB1D0BF47A062EE2C4D830F2631E83F4F512E6E40EFD4256FC572AFBD1450027B1E14F57CFDDEA42079C9A40C9F23682FC4059 AdditionalInput1 = 4668C3E8D9DD661053233F6E38728ACD83B4F2FC8005C0C70A89E192A56C7403 AdditionalInput2 = 20123321CE0802C4390C5B788D34B6DC23708FEC08F0B88F39FA6B65F0F8F041 Out = A97C61EB1B02269B473B725EBBCF87885B860EAB84BC433406093DE6F05B4FBD830C43198D5BCC1F8B8F3D2B3437F586091A8441258DC8AF366AADAB60A7A4EA757D0EAE47217A2552041FB35A8650441BB2D5A09FD33215BF0A0EF4CC18236363DC9EF1B2C4EEC6B49C80774958532513E348447652E65C3CE3BF5B3F776DF14698C101CDE01ECF3CFCFF97E31DDB1E1F72F470FFEBB87BD740354F6E1B16D0AB390DB1191528D7ECAD3A4250ACE286E3DB7F787D1FB24EA8C1650A3EE9E73D EntropyInput = F4924423971763E5435EBE39265D5C2D1A5B34E7508DE7B3690BBBDD469B1AED0B828A7C7C73294EC8282E46B76F7187 EntropyInputReseed = 17903D6BCB7BC9823A22220C99B8B00BA56BB3404F4102EDDB5646A61D23BCE2EF4230BAD846B9339BA51DDE6B5025959BB5FA27AD1FDCA231B36804FFBA7FA1 AdditionalInput1 = 99014F6ED3CA32CCCDEEF23EFE05FC63928E0C07256AEABFB96EDDA1523727F7 AdditionalInput2 = 0D7C207D92BF6A7B4EFDEB09D449D32F48D59C7432EFBC611CC796189010EA1D Out = 3252D3D4D14DB59F0CFC12141D5C4B1C44019034FC12A716C4F1E9A806A1097E1AD820E1A5444783543ED765FFC9C1CAC1F3815BE5DDDBA0128DCC8399BB3BB8FD5A18607CCB5645DAE1411E73E66236D64C6D135621D3721E64D3C091F6CA4C8BE9BB8A1A0FF4521CA1D23547047BD281254679415D10BEC415DAF7F593CCF71B8E596D0CD89FEA6BF67E59CE812591F2A1B0133B46963D7D2EE78FFCFD67AE6BAD9F3DC094614EBBC6BEF03A116B58A8B4D90B76D09466A04C817F8755FA2D EntropyInput = D8A4652F5AFE770600EF1C30CD9DFE9F39A2BBD0FC353B1C1E68816F6FB5FFE448D0CEA960ABCB7114C697607E6B2563 EntropyInputReseed = 49A7E1FF623B3170F7EC0BAB65D247B8782BCCA0EC7C913C0A110D3F64A876F6DF5CAE3F34DE14674C2E00CBD8FBF32BCE9E332F7191A0609939031C29625578 AdditionalInput1 = 3F4594783262220E0FF0D578F16CFF40491BE510AD440B0A325F1FB733183044 AdditionalInput2 = 098D7D40F3995224AC6177B86254A074A929A7C739A3D3DF03E859B7D1E1A009 Out = 2E841DE66BEA35F28E3FE6A4AB9AEF7F66437AD3E9D9EC392DA0512F53563AC29EECB44722AD84C314B2CB0AAA31A556715E4996650C497B1CA5D69F6FD27F19F47CC8E0E620CBE9685E612F37715E70C9D3998E3DA76B9AA4C88CDA42BF1A258358E2F1F5B8674589F003111E5C69EDE1C03567C61A42990F83A748C5D18B7DBA4DFBA81F0CCB05E9C20FD5B3F32ED54E4948A480E95BF1A0AC9F9FDC930D19EAEF898A6042ECA9EC8DC8541778F1E40DA100A566AD5D272DAB863317E5D8C5 EntropyInput = F9E25060675E4C5734D818D9C31A0B232474520577E42F8C53F803AEE2349F4A9A62A41CF3F5A9E198DFF8C907A35A3F EntropyInputReseed = 888A7529909AE36053C75BADB44D103118E171784A7B67DC0D7A4E1B1D44391A10A25D0027B1C55F615D3B7C3F235D791A81DFE8215315E0C38FCCDE27A5D8DA AdditionalInput1 = 7B10E25044ABD0917490E7F1A8CFD24966803FC9BE260F3AB5BF954693F60885 AdditionalInput2 = A3563EC5C089FFF127B2A2EAEF12BD0CB3B18F3A0999754666113A052FD443F9 Out = 83B9FEF4F31C71AEBF3753D0404208678987FC4CB2D293A8AC8A547AED18A7A9E09D8196A07D6E97C909E64AEF00D9B9530CA1CD69D65807857D9B30A74924A6BE96DD96FC48AD5931892736A77F62F68C3FCA75AF3E2EA5B2A336F1E080A24FA28F81FD8B1A34D3C8AAC650ACAAD25ED1E00BC44092A13940C821942ADD18BF0ED70C578C305711B0A4991EC5BDDFAECEE804619B197FD716AA2E6713C0CF91EA0A6D46A4D0EA80A7F70F4FC75307D342E69D1FDFF989808B7500275CD05218 EntropyInput = E63BA9B0EBDF68C9D88BD1992C681A93ACC29D2E9D4861BC74B937CF551D4775664E8328020256B2C9E339DE9E3C7AA1 EntropyInputReseed = 5C68DCB9B9BF6D0BA6DE6ECD561C6AE821FF78E956E6614719A5EDA5A5AAE56A6754957A6EEC240510A7B6679E4518FF6A8535323381275EF22AA0E2D8B2932F AdditionalInput1 = AC21EDC68B1128024E0371A8217260E001DF716871A1CB80C30B19AD86728C66 AdditionalInput2 = 9381CDBA4B29CFF81C8EFFD21156C8889C8B1317B5FB1546A3A8D35EBE41FFA7 Out = C5EF6658DE39E6FF479C258BD9A36C9B83DA604F1309FF676C315D4A2D471021EE31C26C2FFF030D88200E060B8F046918CF448794693972B51356DE1466AAC8D86F34817A7CE8CC290BF59D448DBC76234D283A163FBDD66259D4F655AC1035A7BBFC2E90C80CF9848C78701755D20E4B8DB8B29D5D347A955A66D1C2000AC944837D8A096961629FD83C6A3AD8BC89088AD43976EE9E6F6E8DCC4A99E9373F9F21DFF9C8293C9E0984CC03E8605D0D4CFBD91F53E9B8F8ADFD19FE070EC765 EntropyInput = B248ABF23173D6B3367AB9B208FBCAE667215E09CB86B5E5319530312D58FD875420E303889947F0D54D1F4A21B1C7AC EntropyInputReseed = 777AC80D8D9DAB22B8104B49D661C521FF3EAAE4C5A51895124940BAD3C61D19AC818F42464518C092206AFEC75846DD7687367648FA08AC157FABB6580F13E3 AdditionalInput1 = C16C33AAC8043AEA30B67963472DAA20292C8CC14C8D0B29C802CF1B92CAC61B AdditionalInput2 = B823EB02FB84AC2108CF8D8DC135DAC0D35FC5A869BE0365D24AE592EBA33E04 Out = EBB1FF30E5A32A7E54F44159B297D612F417AA384FA250ABBCD88BCD9711A865D1D556D7AA7433F93A57E3236A71836AD2ACE3A6672C99056B5041237586E3121A099B0FAF96DD65B6A08134F7AF1C964A11081D78956CD3F36D143FC2EDD01B097D4A7640721BF4711E7FD38A4E5FF5AD5BB18AC218BDBDB7335B0BE5267BF5F168142B908D3D27A373FF1667067469B8000EDC1A9F7EB29CA4CE389723429C0C2D2F193519FE8042D8461773243B9DEB2CFA9DF7449F9CC9C649B835365641 EntropyInput = F534DA033B98CB8537BAA521F397BBB2FFDEE23A2672F79ED55BE98164EDADE4917B1EBAEFFB0A295BDE8897135BDBB2 EntropyInputReseed = 3D4590F469CEAA841FD25CB52BD00AB9830B1128360D0E9C3FBD16A6A0B06647E6D3244526AE1E26FB246BABF03DC856DE0921ED822F86A94791857BE816392A AdditionalInput1 = 45A1C391E6072EE9B9184D648F8F681843A268D3D02C803E6D306416B05CBF5D AdditionalInput2 = B14BE9444D71CBCCF95D9239E1AA4EA22FED1D5FCE7439CFB444A3908A378B83 Out = 0FCB4AC3355428A31C3E86B083AE82B537B2047C143120AC0F1B1F22744A15168EB68136F1D9F2E2A5894BF05B006C37312BEB0E360768516CBB2087522201EC7931C52C2F764AC9EDA6A245618E7742BDB1E3462E4A9B58F1A49A1EB6CB25FABD83F4431AB909A9778E42DA00427F0F4E2CE8E3AFF6B4ED20C0EE885B031D12551748CAAE6CDCF859BB5FE8D928310D5B82E80542C117822595B9DF7C27CABDBB9AE80FEA2EA2B48426D9AFE638F64F89432AA41055F4D4397161541105D655 EntropyInput = 4D887B13949210562DEBA62821B8F157A22E124687A6A70645691821BBD2767F677331B66D080C7BE8EC3324A6E6BEF2 EntropyInputReseed = AD8D24F72A557DAB570AB96D882C405B2B8DC2BC1E64F2B66A088BA8670CA59B2747D60A8618127DC3F028695590DD9B1CDCF439BD01DD74CF2056CD81D15CB0 AdditionalInput1 = 85794617A9F7BEE6BA892F32194D07A655D2CF9E1A9B4E9F4116A1E5493EBA16 AdditionalInput2 = 528EB0047AC098CB91B321BD494374FC53282B11C025C2975FB9BC9282717CC4 Out = 1405058E484213E97D5605CCD3B534562C461C493B6176685F0360E090B2673593601E422A6A6EE98E7767A2C4CADCD7B9683EA019AEC74BC315E6C29ED33B75254920E65E0061BA3A5E7EFC04F4D4CB5FC1113DA0FC3496BB86F9929CDAE15104D196EEECE4C65E3C326CDD2AA6F7D09234C5B570DA8418D577C72C8B92064A60D04858EE4D6135AB551AED7B611432DDBF08A167DAAA685F5E2BAD22DD8F026400BDAD223B9A35C088D33A945E62E55194F1869EC8A3B65EBE8B0F755E88FB EntropyInput = A4D61034C2B4F0D00C25929755B49B4BBCC50D689E8F8D3BFD380AC260285CC5D1E2839746198CC8BA61C79E8A7A7FA2 EntropyInputReseed = F1519056F6320E265DFE713BCB23BC560060957223E8F6EA42364E43C19E3AE4C99EAED03EA0E25324FA741617F84EEF97CDDFB6EBF3626132469D6BBFB8BAD1 AdditionalInput1 = 6B95C7B3A7FB407F6053BB8892E226FB08A7B732ECD4A31C507F9F80FD8D5314 AdditionalInput2 = CAB2AA665354356822A6B67533C3DABFFDF338494761F47A83802FE185075F4B Out = 3D1EBC88965C3D28CB4AE3C4AF1417399F41DB1D7E45018D48A2035CA17F49D61CC90260B229FE9C9CBB5147BF28353ADDBE7AD7B181A00B912A202C625114C317ECC1540F799F3DB28A6C1815DE5198200AA9DC663C9F6C661B5E7D84B7288141E27FF499F7F059545CCDFE5936DE7ABC90714B71E1E3EECF6A40A021B7F5D4F2BB73EAE9DBA4249DBAE6C25CACA61CAF283690D9DB7AC82C093DF84BA5FBE8332BB2CD04A057144DDB95C4D5A31DA56974AF324FAEAAA48902F3852122B1BB EntropyInput = D5DC885E8E3CB56445D9D1A5ACF85745B3A7732525B7EFDE23FB0CE8DFAF6B0ED5CC2059C204E377E12C9541690C6593 EntropyInputReseed = 66AF05E178521763E51073884956EA08F9B58E1F3B917F31FE37D67D046FFD1CD2576A2D3BA97955F7A4A70BA1F9CC8F95FDD42DA5C17850C85BF9CC2C4D6703 AdditionalInput1 = B882E10B2AAC1A5F05E5AD5EBDB7035A2513F153B57FBE88A1116ED43318A276 AdditionalInput2 = 632FA4DE8FD3FA5EB82D503449C58D4D767E75CF05ED8C2272C4B6F128CAD1C1 Out = 9771B247018776CDC9873BD94E622A4FFB17EB7079ED40BAB339102EB2DB3C360425E775EFD010769804138FD54509646A78758E66877FB49506EE7373FF7EA90127D6C81D6BC227ABE60C45126BC052771D03E73C269C0A688F20F5EE264598FD096270560B50732000358B7535FCC15A64D9A2BFF1B869C3F812E88409FA462F5663C69FC78AABE17E0696DFBDA38D017A3F2C6533CCEDD75979BA407BCA789F77F4FB9D1C720D53ECD2BC693491200650720E2B597E85C6C8ABE2DE419E21 EntropyInput = 134465658F23894CF9E6E30D3FA8386ECC4E8FC47325B51CE6A7078691D8DDB24A89F733C574323694DE052B8F37E4CD EntropyInputReseed = E85BC925BE30D26629A4BA986B3935E84771F0F2DCDCC7705EEE3CCCE72BC0EEC6D056B08C06D23E3965EFB527CAD7D79A6CF4C2C42EFEACFAE8FA9A7E5AA288 AdditionalInput1 = D6521341F06B94C7D50011E8CED84A12114677DCEBFD631E24D78DFE47EDE65D AdditionalInput2 = 9ACE912BCCB51DEE2807E3453F57446FD4F1ED7BDED13400AD8B422EB068CC0F Out = 41C49C7CAA17A3D600314497CE4B0E2644268635389AF7AB0A07BBD2666971719981BF886A1B8E362AB4B3CD62FDB54D0147E6F8F3CCD728A2D80E5C4C6355A1B0CA77EF263866BC93F551FC5FE270C89FB71F82C4A62E67B33B1C736C5A2EE5A99B7E01616E3C9A072656CD7875B790CF60747E42C3C3868795B6A307E6F9BA9BB6108580BB8FC40655933AA1C3BBF25F42FAAF570C72C425A6C8A94F6B98CDDC1D5F405672C8E3FB86013A43817A826497EDED4BA72CDA33ACFF49105C82EB EntropyInput = 13AE3EE6E1EB2D6DB9803CFA996FF2BE06DE00D18954F1E1A8BFEAB5FAF3E36B7A90C61357D6C6E92BF9084B097F0E56 EntropyInputReseed = 8E76A11F2D31B18F92E4694B244F4001FFFF67262C70C94B6964C8718FCA71370EB6FA8CFD5086178D28DDDEAB747DD19C34D65926FE6F2A963EED48FE62FF3E AdditionalInput1 = D528CC854D9354FBCD5C0E80F39E9ABC24BF50E062E0CFCC378778C406413AD7 AdditionalInput2 = B7DAE3FB7D546620080E36517367E93E27BDC9EBB831EC3EF45269C3AC0E686C Out = BD2703F86207A193F17CA6AD2E6B5A15C9E182D4417B1285796D3D8D932C8D465EF10B32FD020D95C86B2A2AFF1589B202C91428618FF138CBAB1FEB48356BC5D9F0C858C0C748E95B8611DFAAF0971CCEE710812F166C37B08D7FA09DFA9B2FFA19B994135B9A6B8418DDCA535A19E3BE570F11C2706BD711FAC50D39E658248BAB0CFCE876A9591930D42EF0115E10462AB4022041E9A3C154FD5D22A911CA4DEB96DC604D48FAB1F99D075A7D3366DFCBF255CE46090D269FF147E93C8EEC EntropyInput = 79BE91A22486CFD621248AED9CD820278F1ABAC82DE377C3664D83CE2FF3D17524CA63074BD67B2EFFC620BDEF617B6F8AF79CED4B2777F44EB3F9781BAB243585B82711DC1B362EE98C8E6577891C7D EntropyInputReseed = 643A86919E5E984D6281DE715040B6F521866EDFAAEAD616E1D1BD83C2210F5E Out = 5B6A4AB360FB851BBAA035AC55A5853C4F06FD8041F282DEE10827B561EE038A3D3C537D55430B013B9725C011A27B3349214388B4232DD31A3660E5B6AD1FAB5082041AA34FC804BF2BE368AC6DEA0B3EBCAA5B54DBA51682ECA19F9A5D595633FFACDD746E1089EA3D67B156EAA2E9F9B79CC17874555616792AF37085AD3FFAA28BEC60D5DB6EB0C2BCD6F870543D8ECA7EEBFD63DACDB7F3D389D0E0B2A9AB92E7A78D11F8A3F06402A9AE7510DD9648AC8CC33DEEE49BC6FEE97BC86DCF EntropyInput = 86088ECA9344486B7773D0B6546E679D421257362364B50DB1A310C796B384B7DB8F416D5106B9E0D85B04D9E344F760B1D2CC9FA0A7D15FAC68DD2A1E16E9F933DFF3A04C1C22592859EA94BEF55FB5 EntropyInputReseed = 8FC81EB7DE2A5D1B23F1444B6BF79BF258D1CD6152178524159CFBA06C483706 Out = D05CD64034169FA68DC2AB897C2EC28C23095C1F9BA42C2DA29C210D0EA211E43727BDEC19900CA3A8F4FBFE184D0BCA42A912638957BDCFA419C896AD664AE1C8F987499791A5B894CBAD717016CDF09342E8EE6EA430E5DEDA462899F0F32BD45712285637AE5BBBB9A5452DDDD60E1885C19FD903891886BF64028734FAE26942089E3309C284951675F4EF147E9DD26BE1C8D30BB8D112C6A44D4AE4C18673DAC228D9E62FF54C0821B032A4D53BA8C4D6D97B2D39753EACA23111C974CF EntropyInput = F81D76FDBC3F4D23E148C69552AFC2A018677411E7E196E0AB4405F91045FF03ED527DC5F9B7FFE6E2DA26B64281EA9A2DF2DDFB3724172FBBD23F1BC5FB89A02A764721962F741AAF7897167BF7760C EntropyInputReseed = AD6C7AAA806884FED9A7A44DD51DDF57EC57E5C036608115986A17CB52BD12AF Out = 94875D0B380ED72321A7C7FE8060C8EFEB8BAFDE59D4F06BA787EE246AB75E390286EF5CB0DC871C18864F59DCEEB48167DCC8FB1872385D093BE47FA80ABF6F3B7A6D09B70160E01CE2C21389CBC4286FD55D600CA5912A64266A6A43140ED31511CBECD4FE2EF6A3C6F6891AEFA9D1D33138E373680AECD7FC42E00FA9BDCCABF2E5FA808683D2F344B752605064BCBFA5363270FACF9CE9AF0B6A1F6B9033C0578E3B2FF54FD27D699917C0C9CD2739C662BBB166F036ED4A4F9B7E18997B EntropyInput = A08E9747F30753CE2459E9FFFC52978B8CB81C8AE7A48B910893A9F3F9337832F6B6820E2645C96A65AD9C7ECEAEBEDE587333F1FB2D98FAB07EC6213F9A4F9932B2019EDB8C07FC2E99E09C87AB2D7B EntropyInputReseed = F36422C0F5842B689972D470D7AA7D77159610E8A7C0687503EC5F07F7CA33DD Out = B9D4D8ED69924B0CE448B5C7DE1DC16D033F7D93A1F68B91C7CD175E2E2A128E50A60C9005DBEE8A292604AC5AA7C39ED83EF2BF7C8BC3F907B33A2B2CACB7240B7C6805CF161B9A6AA440291629987C7339F6D16EDD46988138907BF6D90E8A78758B89AF6A70F6155DB077D17BE457D371E8A04AFD1FF274B101DD3B3D19244A72615A987FE5EBB261740CDC46A498A7C357EA96E6B4962BBF188EB679C8480CFCD38C9A65428706F40B1AA2682B0899C8C734E61321523876BE5E6641196B EntropyInput = 2AFEE35A11953678442EA4C528F129AE13E07BC0183149698BB3537224F1268FDBD847CD0C990E7A646138407368BAB6CFAD6695F0F75A981BB35327F63976F90C84ED26E9180A812E2D74E1B7E9721C EntropyInputReseed = 91522EC5A1806789209C92DA4377F780D83983E2EE6EB9B98DE759CC4F9B8A4F Out = 80E494A7B66765BE7DACA86765716284A5AA126DF183FD4E12D85135F7C9F5F1D11C1ECFCDBB3FE8E5DA5F05E539290D5AF91DB2C48D0EA265EEE6A66777D6D6A61F8625E6C88F863E020FEDCC8AF1DE545B73524CAC82ADA239E200C5C3E06870ADCE428837EF17C04310FFB8C50FC0E50525C1BDE984A8043141FBF37856E0A374C542BD9FBF9E84656D29B671EA5FC999CE0A4472274344712237A0DF2148B4B3408DA5BD5BF6CBA86800A3628C4B86CBF50E78898CC170C8B71310CE9439 EntropyInput = 9221E4AD654005DDCB32C1B444BAFA7111A3C3DD762F0C4B550560800C3DAEF32C40CB619EFD154BAA4AF8C387DBC2B13D9C9E0734B20D0A0A6B97113925BE2B256E10E24703479820070C72353E2A43 EntropyInputReseed = 988A5EB902DC72A20CF2370005DDF2883439CA248F090255879DFA8B6585248F Out = BE691E04B2E79FC2E500C9312C00C9DF519D00BE589282AADD341A3579D5F84A9E4063F54E685FB1C0F8B771385266C8CFE318D5599D827C4BD8D90515F601148D376F6E364A87E20B941AED1D2F126146FB454C7639DC1B3F811CAF4E1BC314FF6E8CB942FB1E7BA72D67C15DD31B8F05DBEB454FFBB533951F991768DBF750607D0D0C2138CB3DE16535313729819CF0E93DEFBAFF6F4123E3BB0C6F643D4652695E3D17EA85FFAEA1EFBCF7A4D923DA1D42E431BED79DA1E27969FD2900FB EntropyInput = 41AE462E94507D144302272405691BE2C82B876E52437553D8508F3A084F0DEC896530F116C235D6E669453F8478276DF0F9400913C91F0AE49428344C27907211B9B795E941B22C3901D73F032384BF EntropyInputReseed = 3C79C8E9C04805C59243A1829FCF82FE3AEBB6D4DDF1379B6340BE976DC11EE1 Out = 58E2ADBD6A2B3A969EEE1A9E126281A7252DCB4E245F40FE749134EE8426331022173137A701DC2448DDDC251E11C915AAB7B60E7DC0DE474CD1F258776A6020EB375DC1E039F20CED6F6EBD04ED8D5D5860EA5E6022C2A4B3D09606ABD650ADDE21327B02B593D3998F3B578E8810F326ED6CA48AE9BB59513B188052A6A3CEC1934545AC59D18D58978638DCA8F7BCE40E083054E7EE4179389128668E67A6D7EA78F79463AED5C4390F43FA55FB71207E4C75ED97C951634555BF13CD0992 EntropyInput = C93798CD05E74DB38BDA9A3BE8DF7027E23D7769810B95E53D8EFF8877FCC05202287711D4A54B81FCEA542F1D71E8945671C4DB1BA7D61894B4CA2654951504C002CAFCB2C75E1DF10BA142F8ED0C96 EntropyInputReseed = 868831402113439529375FB9131E34FBF026A9BC36B3E1DBE42C77DBCF1D2C43 Out = 0699AC5F7B69BCFD461BF026006EF2C013583F523061DB4D2189730AB12A3E5F9DBEB3BE14A787598384A24AE6569A827F3C7E11A6ADAD5B8767BBEC6E92AFF08EA1AC033F58B51EB3B2577D59184F5B3DB0FBC2FA1D25F8E9C37CDBFC6229F203A6D88938390FD0E8E523A8E59C0562E5E19BE03E47D0163231FB0024CAD1FFE72B602C7D515279359675D7DDB52EF589334DD7947C964FC5C61C368147609B09942F9C179D8D490B911E735358252CB3466F2ABF0AAA3D1144B46DDC132A14 EntropyInput = 60E0B49BD01BC4C5FD330EE6183C9F26EEBA1D05CBFDBBF37D8707403F6CEE5806197E3BED2F7A47C67E55B6DF5CB9A1CF3A4CBBDAF2E639DB8760609E07E4EB54D20065C69AE1497C1EDCBFCC98F008 EntropyInputReseed = 8CC0E3F90EAFFDBF85802CFF871C4A1610D072F2335F1328C3D5D0CCAFC334E2 Out = AF99EA4CDA797BFDE0DC1663E365FA3D6F1A5A4B829FE0773775B35ED9A133215EDA76CD1F041AE171556DF3A54ABC95B5B1DAA4EDB7E5269456A80F7242E033F09F46A785F14B9C6DA175CD429F0CD0BAB99F978AD993FFA5AE27C6EC01CD5C4B370059B6B4EBE6C87CD9163F5EF7BE11E5D565711BDB7994208FAD9A468C10AC33C68416A8EA8F0DE850E286A2AB0340407DED4325B5EC5A19C33A7873ED10883BE88EE00EBB89445A58CE761E022E59488DA5A5BBDEAE101676930FBD1BC5 EntropyInput = 882791B637D6BC6012659803742CB7B45E11B7D3D31DBA97674E4822BE47C37A354C1017CB46A6BDA606FC81E30AAF823527E15881133D283F1A9060380FC91D61CB85408F4748B38E5BF554E58F3BB0 EntropyInputReseed = 6DE68AD518F8F4A693917DAC2E7C843320E7091784C5A355F6370BEFC034F883 Out = C92C003AD40A6522419D31620C201A0FDFAC61AD7C3A903B4E8E7EE1375E519C714E640560B31BE8AA2A9A5CE44BDBDEC3510C06EC8D3A1379C40A36B3BCE05C9A016BB830BF4424092008A63B43963EE5EF63C6E8E11A4CC432BBC679391E69DBA570661C903886A443E33D005ED2901C1F537037681AAFBC11A16B7690C3299D6FA2C3E06E6AD49593A222C0840F10F21A983999EE6E343DA5F056C866EEDDED8A27A8470877D53933AB032033170CACBA3DBBB0C726DC3FCC9FD8F301850C EntropyInput = D85C485D0295C56208FF69769631BE5746593C9E12FB19BBB3ABB9147A5077BB9220464B84D17310CCDC6DFEBB1B549E4F50C2208E65EDB2A0B0BA48D66224B8D5F37760A298E612BDA29B82DBE41ABE EntropyInputReseed = 31191A54EE68D1A9CF7AD06C850E9B15E6985BFB060DE283C8050130972F370E Out = 568DBC61F98CDE98BA1587BB4FECC4E6C88AA013CEB2F65BB409796616DBDDBFF2BB6A69638EA835C4051C264E22A8179E4B20730FB07E871D2B1D61705DD5919EF04385FCBCAB5F4CF16AAF12BC11F5F1644D75341C69DC504F227D51A66606C1DE739A36F7C7F720E0D42662952D8B7A3DEDB89DB78B74DC03732A47C63E475AAD3BB4FDDDFDA9C635BFD1DE3CB5DD34442DE11105D1C9DEB03F852B474F8A474FEB192383EDB566C96A2978B205B15CA5650EB731C4A8C18EF98F049ECDBC EntropyInput = B1074D17BCB101298C96353354660DE04F225CB931D495B1D6B834D8003E52315ED4EE81B422FB088C9737134DE4E9C143DF2624A3739075E179F2CDCF4694924554461CF758791A68FEF77E6CC5BEA3 EntropyInputReseed = 4504014B8DD6457DD4EF551BA9467A070A69BF06C27E22DC19D9D5442B383A2B Out = 9768F3F89E4AAB5AB0625E93C7CD1E3B3E6346635239D9BFB60EA09C32C54B8B72E17A78B007B5D7D55E7A8A7DA5C22F9590CF608C9C1246C8E4E4B9EAB3F2E3CC35C55899A102AD463AC6090A77414224A0CD78AA99F338B5260CEECB255D82CBB2D39C6398A0D631AF1C4BC16349B6EE0029365220DFC7B3EC91EF4DA60D5F3C5B4F5A6C11244DA61D1F7838A4182EAC06366308B1C0BD58E2ECECBF987BE4B063C31BEDEBC7D8E8D4A2AF2819C87FA8BDF97BE836B2C7F810104298CC4F62 EntropyInput = 486BC8CA09D5B34F05DECFF440BF43FEC81EEB09C9C89DD227288926AA7233077C441E405897E0FA84893EBF35DA1F7A9A4A5A092A887301D64D908D458EB15B48D7F9C7B8D93B413B39D6E4A40F8652 EntropyInputReseed = 22EE37C6FD340905111C55C970B7DB913F985C21BCFBFB688BF1867B0045135C Out = E6B3444D17DC5D184F995A08C9B3B9B4FFB8696185FEB8D126CF34E234B4D9EF0D397EE2D66658A927D22E51EB5192F1E1695F38EFE95BAA6D893B07FC7AC27A5EC0A826118974A0A497E49DAC98BDAA25F95333D5889B6F9957A9FFD36B195DC4E110ED4E3746A79092A68F51BF370551A0BC73674E7DBE64B4C5F15E9EA56215296B320FC8D27E63E4AE0C25ED267BB3E9E41E9C1AE12031BA7116B7BD9825280A2B3348AD958294B407C5EFCE71CF1569DBF7A2FBA77D6A158B35552282BB EntropyInput = 405212F01A1D87D3CF80EC38F5CFB43B98BEF677BBB9604A82B34DCF5695BCFD0E9D6A64C50C5E7422979D37AF2986257CA3FFEF0F02A17EB4C647ADA70E4A6222AA05DDA4AD399ADA807A2D246226BE EntropyInputReseed = 67A1195B28DFD62FFE96FF71E1BB644BB2FCE98F5F9FA0210EA0FA4767D5A7AA Out = B39344E101B833D40B37D3D36440CEFD9E9319A3AEA6C419F393E6F012ADF6307C1662DC57C136B150E4A013B3EA03C0CEB9BE2439B595F165AA7ED47B7D1167707B77F779CE34091EA0823378BF4D4880D487610C0ED3D6FE234C1DF7BA4C0E5F800788F8F8CD6A19C4550318A21B280604D035140CE6894E92A33C80C689A430C4E32040557987274DF700590B592D2D5B95113434585566028774693DF424B2E16F7DF7CB3B27290E10F0BCF5E65B6018EE8DAB16B9583099BA2B099CF3FA EntropyInput = FE81E81D004293758EF6C3C90A3CB3A6BB16E11342E1EEFB6F2E7E1AA0735378050E2F17E21AE1D63B6FC8E96291C1327E63805C0285DDA53934ED1F777651383766F7597023D684DB11C9A4ABC76F3E EntropyInputReseed = 915209CCDAD7AA0D8A2CFAD167635FC5FD406890461D424D12E617C521BF534C Out = 5379F0346C73DC0807DA659D3CD96F7ABF427D2D6763AA6F2C4B2356BDBBD540639A80DF034818839A3F3D72D7D1025290743A66619CF9AB1D01AAF8D798037A9DB3EDB7D88169B6B3CB0B2B7DFA5CA9C1DBE1D84016ECFA9114ED7EEA135E8FF45452C946168CE91DF7496353A897525DECCAB5454A4AB2FA5BC3C447ABEE706EBF109D7AC7C7F21FC6E00B761239EC13097D67BF6F685406A8D6B239B2C500E10E0F8FA0D20F3A714B298D0A477DE7097392E60808A688FE2111C59027D278 EntropyInput = 8952E4C0F8B4C4BDC39FA2143BAF5F0FA3F58C521FBD65923A1EA4C4AEB9934D1EB8C2FB74A36ECB5AC714945C95A810A67FF3850F1889754753DA83FD9507D3D6E086E72F70A5AB2263C57C4E6C98F1 EntropyInputReseed = 8E8D9BD53545499CD2F6035B4FCDC24914677EC9E254B4971FCAE5C71779492A98EFDE1CCE88F77C5CE1A1FEF0235EAA2C6EBCB15E0D19388CCBF8B3C683A213 AdditionalInput1 = C6A8FA4D6D2EEB8C7E247D4CD0B6F2C9D0F3241FF83481B1844546FAA1636199 AdditionalInput2 = 85D99BCB67E1799402224743E28F56DF3AF012E35562B8EC5F3BADC580288F3E Out = B6A7BDB1170582417E895FF8FE9AA09DE7F92719A974A9D4E7F9ACAE4B335B2BDADD102CBFE7181C79A6532994DE87C10720D658A15DA22E4BF72A0062F8CE6E49CE15DFF04CA7A35FB8719B87E18635F9867AF5DAF40B5B6F7C38BC897F9C98DDB9D351E9B3EC8816B91B0DDA4C37F4DD139F50DDA9C93E8B7660572263A7A9687D2487277EE9DEF47C7B8F89C95651201C3096F1AF8DC2C7A597B0C71D4A67396325FBA454C89A6F2CC1139304C49783E0785CDB3FF86574D906D2D9C501BD EntropyInput = 7D700D622EDF2EC2DFB07D3516883B3E9DDE9D0F086EB64C58D9F7BB9E5F89BE8D7E350DB3BBA7A9849F831C62D717C06EB7022A6CC3A1A4432EF97430184C490D35749948839153E579DBF29AE421DE EntropyInputReseed = 6B3E8E88F6452B2A1D95743632AC4176FFD9C8CB5E434BE1ECE3CAFCD77EC5EA135A824E8805255893B25112BEAE2FD7C5112DD993C7C2B85B967C5F33E7C4C8 AdditionalInput1 = 216ACD9EEBD5D53D671AE26E7E1F61363A3ACA481CB3B5B11DB692E4FA1934A6 AdditionalInput2 = A4D47AB035A0A41FA478FF5E4C9A1D07B988F09450FD7B51A3979D2E3F1D473C Out = 40ED92A49555B56F0F9103730687CA76304CCA9C864857378630B51C4D370B09441DA65182E86ACC98286423C147F04FB60D0E258FA59BA990453C1CBFEE97B75E8A922F1F1A6F8D2CDE288C3C446221E40387A0E78226B1F43A5BE34BF1C2C3C570744F23C593E401A1DB8654B3055B25375973F9A30DBDD518A3B91F488091153077D13E02E2753BE6C487912CCAA1092EF088B649C18FFB522F8DDFDE5CBFF6F94BB3B810822AD8AE3A42EBD4050FC5CC49193664A1EB4AC8B2CF690E57B5 EntropyInput = E0164EDF2FB11673BBB07794D186AE18EA28B9B26906493015F2711F4004256E0660C87D156E47F84FD9CBE91CEF02C94E217EE9371EA800E1652F8AF94CDE68BD0D9DA365D7B54B2D4EC988E490DB9C EntropyInputReseed = 8376DBDB5AF8CEEE0C338F8F58735CA69F51AB09967097D44EC48774E9C45B9C5FC8538133D78D7DFD58BB937EA796FDBE11A364D51E39584BBE39C9CA0DEA50 AdditionalInput1 = D4F482B97182560A625F4F05F4361C57BCDB3372483A4BB129820491867BF729 AdditionalInput2 = 77FE4D79D11A0F61DE7BF9A3FE2326AB4F6A2E3E8F1FFFAE3BF5907C590FD071 Out = 9BF3273CE76C7E0D88301D8A5EA78437FBAF0234D82B31128609CAB39B62ADBC0ED00ACFE640170C005E34B3963B15AEC66DA65734A3764EDEAAA911664CA7FF3DA668E07087AEB6C2AD30FDBC6AAAED67C69054EBEC77585AAE13BEC5A0636121512F6A5355217EB5AD1AE437236C7F1DB694D40613123EA9A9306D54F8AFB943FE61B5ADD4B0E769671E6B62418948708848B4148FF4AEFFB77D6DA3B2B70EFDDCA2709E231A3F153EC562DBC6BEF4AC877BD436ABE9B66E27A3BF5F63A141 EntropyInput = 4DC3F0C0044011218F2A1137A4E9667B0D5A313FB60ADD73BBA82CFAED51E19AF640659080658AE971808A71D63020BC2B2C67806B28940882BA31B310AD91AE47AEC546ABC81FB54836A0FB333CD6BB EntropyInputReseed = D91DF97869C332FD4CA22587CEBF648861071828338264C3F1BA7A93EFCE2432E6078C2ED1F1CD15B62F54A5ED1F8893E725A0F33284A0BF8994522E43370C32 AdditionalInput1 = CD1341B4C78DB1B312CE22F1E20C99D7C3CE93D9A5F7102526BD81E92729E3F5 AdditionalInput2 = 69783AB2209C743432F6C9FE385C535F7C7F687B424A633B3E7A8509B2BB1E3A Out = 1571D5B744066880B1753149198C849444E4E996304518092E8436DC5F0B28149BFA1EAAF8FF70FB61F27F67156A489D9B6A7162928CE8D9724495EFA4856778445E1DD39AFEAEAE08B77117F73A7FE278C009A30843FB4A4E730494B1222A0D61F8D2545E4EFCC509B05575F962E8B5FF8F64DD4C3B7F55E8E53602846B29BF51C73FE80AE108F0C030DEC533020554B736093F967E2CEA17A0E0E750FB57AD680868F5392A7FD4687FEEE3340BC2C1DDEED4EE6BF144C472C15225B587E3AD EntropyInput = 31E4B59081E7F4775A190FFCB56F124F32ED7121C17058C6458DD9E49DE93D4D1708B0283C1C0E3D750C300C3F00E7C7036D96F491D1BED8261ED73E9288D9A9628F83C208E9BBC4A6597211AA4EB82B EntropyInputReseed = 5DA61C6E93770F1384D5F6859666EEA53F771D4EE27C6606E4C0BCD49C1591CDD657051BCFEAAEC4A75DD6190A88294224F0651CB57291B178E229E6EC4A3933 AdditionalInput1 = D338328E55305F1481C7BA015FE24F200CC54225933D35654C14D86FDC50B4EA AdditionalInput2 = 6410F89556F0AB98AD60BF21B52EB32704DC223F94765F04B88CA871BB6C5E90 Out = 361FD35FE545528AB757817D74A33163C065304C115AE20F9267B08A86DFB0EA4FDE8E28932B41DB21B013D10F7D13A35FB928FC86B0ADFD5A1E92B83FBC3EF3CECFB5E7C248291A1BB9ED481ED8689963E432FCFF36EB0A286BC11B2D52A501EBEDE5CC006A9BB32AF10AFEB849EBDD83DF22161561BAE98233B67975D8BA68539EA0B904F5A1C427CBC28E8FB6C31A27CD775ACDB18947C8611175D148BA6FBD38FDE1E3F4CC685D9E5F4196BDCAF8426B283B7FBB9CCCEA6F56C14FE519D6 EntropyInput = AF3E5350CCDD5C2B6840BF1D311FF0A49A2A50B423F8FABA7FF619E7301D26337220BE061DC2068058BB51BE1E2DE0F787E05D034DFD0289F59F807B6CB4F2FEC4DF3EDF76DAF9821B809323402ABAD4 EntropyInputReseed = 51CCA903E853BEC1935E81EF555434634B43EA31D5C7312A106945D4FAC00CF3D7067C5C9947F4890B24F0A33B87E355C5903F4159ACE32E4CE670538F16D336 AdditionalInput1 = 0AF84F59A388B86E1C3CF83DAA45B5C035F7503F48321699B67E525DA4E7A129 AdditionalInput2 = 4305764D00F691651DEEAAD78B5CB81438C39653AA7B8DC414B8F2247C67DE92 Out = CEC037C23291FA3E402E4A8A523E9C60D20D68D34FAC7521CA54219524AF7B8BED00F581D61779950A5A384CE31E76C827A0C6F82ADD039A9F66E903ED9C1A49691770E69D1340C169F12C3C4B3BBAE6510282F1511D48ADFC08320B19E0107AF1D0FD6D16FF9CF9D0E05036AD0395C9E1B61879BAB17BB0CF307516FAB5894D0C0ED702D6893D4A0794C73B33CA811D332DC64E31B216BFA648DAD5C7A2353E8A094FFA8ED1C9A1F7FD2C71B8DA775BB6B343E41A35471E0F37BDEA22789C89 EntropyInput = 938826A359C6B1CFDB231450EC8039362BF1E3735C7683CF508116D6887FC3DC7E77D99B842FFF3909F95E3EC2F8780C9DD7BCC2089C5298C69467482CEC4796D70B9062683D55DD4B644D3481BC8531 EntropyInputReseed = 26CE016045C4334CA4D89C61B5FC696C5FF4025B4FD88F67515EDD48EC64D5C296B11F9DD6B00CFE8DFBCE669ACB5215F4266348F578A301A05D07B5DE38FCCB AdditionalInput1 = A8EDAEA53998AD49E100A9F94C7D42EE49685DAAA50EED0AF8DCE137AE142CDE AdditionalInput2 = 8BD77996990672C77761120531761AE6CCA803F142844D5A30847AA120AC0801 Out = C4D0C598425A5CEB2E6CB46CEA23866A2B6F54601A0609C2D2A638D34C7E7170E9597F1E2F5C07511DCA973185AFEB57AF0F35CD4028BB91F7D4B0D592AFA31F5A3031BC70656F6F210C0A0BC8AAC77BB31E8F778CAC79EF08B1D6C3D99899E297B674DABDC0A8C782E06D9DC373D88DE5D6F0F4100AE8A5E3B5C30AE8043BD27CA94112E9A4F7D0CAD349033271150A54723F4593BF5AF99FCA5577C4589C7EFC08F4FBEE0A6E245DCA858875F63CA6A6AE0F68E6CB338A39C84B47873E0527 EntropyInput = A2D662FB36CC6880ADCB64CC1526686BF26FB660304FD4D061B5B9511BEAB168D1D4CAB3496A3577397BC20A6B9ADBBA746B1453DCB821B05B25EA0F3CAAEBC303ED34F94013F38A1B672F1CC65413DF EntropyInputReseed = 36535482708449A24667B28C5F4FBA2C6AC4DE469F398684FC51D6082EBB251D1773BF56578A3CC702B07261EAD2CFB16E11FC6C0BAF3294282DAF3A596F063A AdditionalInput1 = B32F6D0A83EFF4E33286BC573EE878A6D46BD74B5C5B89987D5B4C47CE9499EF AdditionalInput2 = 34AFCF34A6135C2EA236ECEEDCFD974A19E5B2FE238DFB6A53EE1F05D0A62CE6 Out = 5AD60C49595B13A8EB50A4B0A716416BDC25DB1FD4A861AD85ABC09B5DBF1F8E2340E1E6D7AE0293D9118F9C60FD2FC2D5AED7398FCA63455A535E62332E8B35A28C511B622056D6A81150C53A29D4C39A2D93DB3648CF4D290297342AD3ED5FC8955CF4FF24EC7F954B3A5289C8C1DFF8CD49E0F828A31633CE7BB96FB5119A28520A7E273610C38AA332A89FC78D4766AF9924D391E6578FC5C67EA161BFF0291D118D0AB4932BEAA75493AEA37BB758AA8C971DCB4F7CEC6AA0397F962077 EntropyInput = 6E18C972EBA02E02C718B1AD437578AD36BA868562CE0151F733ABDA4EF8EB6C0E821BDD8C6946B5D47E86C659E6689BDF88F4115ADD77C4466EABC180CB18030FC5EB9428CEC014FF9E1C83AAFC0495 EntropyInputReseed = 1DCCB719FF27FDDDB1754FA6391239B1B2AABFB1729C7FDCCB8CD2F00E6E5B50C1C33DAD45D7B74C799FE05D1BAC8046FD7F27CB4EB4046A1BB16DCC3CA5BA18 AdditionalInput1 = 22E7EFBD5C39F6A7EA9734DE481E034DA2F7D961DBA04203A6ED9A32C41B55FE AdditionalInput2 = CB8AE3F995F5C671EE667AA35DB5CECC17D5923EC6A64078C1D9926AB3DBD29A Out = FED07F63164DFF673D77A3A07601F13AF78962F6F72433B92C1A645CB37A8972ED0C9AE2E14E4FBDD8EC4056B6E6A97946D84DC58827E5A0211BB67666C59B4B7F62BA56DEFCA35E172CCD0A1010B3F5978482A406BF62C8B98305F646C1A217A6CD61ED259E251E4679C5E16F3EB293593EE98269F45ABE7017B82D2144848023314595619FFF4008CAF339BA464E0568B5CE732422149BA3F6E06EAF5800AA317E86FC5D9F952ADD137957AAB899FFB55FDD7BBC8CC9DFAA05AED8616A7083 EntropyInput = 7BD34CC9435D2027F8FC31897CCCE23190CB223F080E2A7D30B80E7698013BDDBE7D5637CB19FA348D79331E4537FBC6B07FE0927594261F1BE72EC59213A484C65A786C42DE68D6114B5487C6FB9A4D EntropyInputReseed = DF3F5B35BFE19426243AA2BF6779363ACB22753F9DD4F7ABA109A62C639E5519B92C236303B1F2149826B0AFC80448E59C182AF7B4BB80BF45B1E3ECC5B86469 AdditionalInput1 = BF5611C8A7FA06AD9DC12A7206278FE7D8963F8F28937C4E9348D14B4840EE54 AdditionalInput2 = 5C9455B7BA43AE4D34DE3A62BCE43842029BE60395D409AD9897C16232351E81 Out = 2C9166A0B71F64FDBBB0E0043E0883033AB33F703880F7FF61993D8AFDEE327B9A91280CE399B682E399C7DA42F443B2DEA057A940256978A489B4C3967CE15127ECF35AD056CCFA971437AEEE9694C3A0FF8219862A10D71DDC467D29FC475680FDE5935B36CCFAD7BE97ECB04B222C6796784DDD3F3753C67D6CAD787F7694B086274B27687A5BD5E950A7D642BEBC86DEED14039AE9CFFD1F3185F03B99DCBC3882A7F3E424489DC7AF0A6DE73EB4AB83B88068DF3EF3A6FAF27F32887E88 EntropyInput = 6BC9F3CE436C9727132D310A0A8DD28AB9E27CCBDCB01EB75A22392B7D2F18983D104C189E8117EF18D4FB441CD2ACD9FC5951E5E91BC2E6544BEC5C04787EB196DDEF8FE4DDCF9B559BFF5432EB5F3F EntropyInputReseed = 4036509C4336F0825531897D7A29DAC079532EAF202B2A67BE141C00714C58EE616C5E4C654F5AE44B9A1DFD3008CB0C3503F423B2188FEBD43889ECD0B922A5 AdditionalInput1 = D572C769767B16C4C4E7E4EFA83685D1C30835C11901A0F68887733619B605A1 AdditionalInput2 = E5F2B4ABCF5E38D3FE122D92C60CF7EA2763B5A2A705167A4470C8BCFE743ABF Out = 1A5E548F18D3D7AA3A97121330DFBB64943E3C502FE791C99409F661F8599F67A399233A2283C0B5CF883DE4F597B2B1E5AD0C6F02AC446C9E8BBAA2EDEC83F01F5B9B0F0CF5B92AE9FF28422810FE4BDD38FA7C54BFFEE7A2A8BB02EDC82AF52AF290AF556D9580450816A83E57DF8DB3EA0C09742B949ED2E0019D00801082847C5B4572801C625027A21C6FB886C588843E54E8D8F3ED62E7E44DCDADD7491C9F0DD4C78CC90DE50E7E0EF2B558708C893F37607203760BB85417206F59E5 EntropyInput = 38EC79AD129BE7916B80117CCFB68DD83350F04A7DEEB664C33BB15A609861777C28DAD465AB68D2D68871FBDECA641DADE83F71FF379AD2A2FA3830F7E94193BD7907A901BEA1E3A0305642DCDE326E EntropyInputReseed = 6E8BD5709B281F72EC76DBC6F439E64D80C49215AB0C5FA1F281AAECB77DBB6A45ADBDAD1AE2AC5A2AE469F14BF6F8EA800A27E866CEC715F7AE8F9C42500C3D AdditionalInput1 = 3C8EC07202976F211670D80AE1E9A8B03313D533DBE016708478F1AF036006DC AdditionalInput2 = 8D065FBE3B5DB28920CEEDA6F0523E34CE54E83CD8AF021198BD0DDB16A18E1F Out = E43C03625FAC50DA86C19094BC1A8B651A098354700502BFACFE044D628EECB528FBFFAC640B6B076FFB7861D609D43F6718DBCFA2579E231713D3590E150A14F095A5033767F84067CC39E0A870BF7F225050343696DC9BE3EDCCEF07C4C3D9C97A54E1C8B6FC04F23889EDAB11DA5D61F25922E4ACDA2F17092D2DB57911B2CDF0ED1E668DC284867BBF88C335E0E333A92E4C27C0D89EE48DF71CF79503D529FD0FFF0F0CA7C54A3F9DE0B3799EE87AB292B0616D11AE284C82D135376AF8 EntropyInput = E91F2704B65C825E247E4E19137D759A810F94C6E63BC51820B1FC49F00CACBB3D01349FB30710FE9B4F527694AAF759E855603A0974AB0CFB2588ECDFE8235D649A8942E860C853DCAD342A05C15DC6 EntropyInputReseed = A004F6CAB131C8AF76208CA1D0BC815948EC73D80614018188A5AE7AD3E6108DF1C2AC22B208CAE0F50B50952A2875C2AA8B75D571794AC6E371ABEA43F8134F AdditionalInput1 = EA5AEB13E9E8DB85C34DDD9698FB3F8ED87A4011872D4735EE5E5770D61DE8A1 AdditionalInput2 = 3CAB271FFF159C2B8C6A53DBD46A4A013AC12959ED8AD49575E20FB0D8C6DCCB Out = 3E397B12B767A64F3287591098A55FA1505B65340CF47E36B7B177F8A3F6FB812BC6DF451B6279C7B7ADB4DA668DCC68A6F615DAE1D87FEE2B85BA50DE41A3D6BE5876B94E2C16881BC66AC60D13C41AC21E34FE2FEE3B6ACD72A87BC25C8F0CC81FEEAC15E70FB13C3C2648931428CA5074DED58136DA213339334AA8B251A1CE759BF5ACEEE492B0C552540C0342F3AFC7CEBD021C156DDD06D67CF80F2E31F62AA140CF92E3D88B7B0C7BDAB4E195E76BF64B4D1FE135236DBD957B53423C EntropyInput = E55B437646B117590E2D2E8E2AC30D1449D1CDEC1BA027DCA3F798305CA7E54FF731B9963FD3539DB9E2ED1E6DADB327375C6812706D50AF25B86DF447DFF3BA4E4D626EA747220AA42587777548E4D0 EntropyInputReseed = B0BBA4DAB3C92343B7939D16CFE4A8F5ED7990DBFB93DC3E88C7928A1BA175F5297CCFDB89B4FB8AA0144097BB89C6E0729D14AEDBB7DF0D64CC10DB08C884E7 AdditionalInput1 = 4A7C4C1029C1517ABADD9086051FA22CABD10ABA56502DF64BEA022FCC94F25A AdditionalInput2 = 4D964F68E733BCC3319E19EAC8C9C5AAA9DD7585D9A5E23684122B096CF0F1D5 Out = 504723AC2AD7F96B25EE9E42C555F738858EA082769BC4C8B2F6C212A283DF7FD6A71558666F246F52CDD3DC972860E4B967FB68D451D9EA36553BAEB4EB2533E9D8AAE48878605BA8EAD2B8722FDAAFDF21B993876632D40BB9DCAB36700B7367035FD8BDD4EDBA9137D40C8A15A2D2D3E0E97700A3BAE14A144586452841AE7BC73308A92372A74C360DB736EC2BC6C0425124C4138B47E97992703432EB5213EE6C434AB2B2B720DA708EF8F2865F7A2976857E9E3158664D79C385DB9A42 EntropyInput = A6A7697716F2851260BB76CFBA048F8D0BFCF726713032FF549FB69BB8AE7A1ADEBD33DD5306D74E7D6E3E480AC94A2910E90BF209B2E3B3EA9C5E77BBE028202BF3847D44ED3B406A89C304C6E1E72C EntropyInputReseed = 13AE40D4D9C43848A68499421BCC68A1C513B7BCF3E9F4581730861F26115CC16767D287E339DA85620AB205054ED4AF8AC72F6AFA2C7ACFB3F75BBC58F65F60 AdditionalInput1 = 590C8A55521C1FA20A293E19941BDDB0AE16492C8331B244B42DE9BB403F2111 AdditionalInput2 = 8C1754A8CB8DB97CD6FE40AE1C375B78A78933E9504118B4FC6CEFAA7B5A2B6F Out = 0E765E75A0ECC056B01BA5A13F3255274FBCFC7219538313668D09AAA6A17D736CA29E6F47F7C464C17E3777A33A37B90F0C750E425DE3D8550EE3CBE2F2955DBF75A187EF63AEDFACB4BCB61E13DE61A183F0FEFE070A8CA772F0B4C0B47B3F9C7E9844DFD8068D227C8D6C790DF25CA935DFD3EDA0E5AA42FE1B7E130AAA7A7D4C65AE8650CAC7ED0DF44BDBBD469076A184D00BF606F9D35DB3CDCCEC14483D1656204367CF48329DC1823073B9EC6CE9EB5FF023C572C1386630B605C388 EntropyInput = 54964538CA40AEE8EFA7BF336A23787D9506406964C32743DF9CCE28E892C2A69E7BDF08E85E8DE7E049E7FC3A138885 EntropyInputReseed = C9C84DF81F73196BA5088FE28543A81BB52C1DB47FEFAD85511F8D42A9842367 Out = 919F9590973FBB06EAF8E97C8B202EC3BF6AD4EB50B9E3D6638B66220179EB8C3EF187DD50270FDE903D5C7013552E4518AD9C69FA5E6DD7095DBD3C6803F29D8BCF9D65CDE750B17C79737E96D7ECC230402E226E00C7252917E95499705523F3E15C2C59054ABA3A40FA106C85D2FCB1FF9C115E19ACC579EF1A190EF76B7529FE796230FD7C678AC9D2294013EE37331E45E072F2C8B5A9275EE9813D51006F80343CB6A21681BC5CE0EE6EE3F49710AA23C925EC8B018249F0E6F00B85D6 EntropyInput = AB56E7BBBCC069C176A9B604B0894A30E46A521F0870092D9818CC489785702A4E9B183A9B016862B2C9B13A4623BDC5 EntropyInputReseed = 2D0165A50E00E59B6BB91F5B2CB3DD40B2F87C561D71F08B7E8D1D52E1FA0219 Out = ED8B255670AB79F75CA1C9CC9D1A4E251834075407EA234F6F3ABD8C2DE4D4B7D2B3E4AC5F15421BBC1941E1EC2DF7783A731C3FCC10EB0C6F409D90C499C42E20DDA117CD8D7082A69B85DA03D50FB9AD995E2675C065723EF849076DA85EF01F23983D0C291FB63B670396BD9268279A811FC36337A3D348F8E3C1A7A014E5C5431DD1EE7F5CFF7C2F0F3C8187795BE3B1DAB36562017A36E8B808FA3F9F223F5702F634CA619F0B653E03B3D5EADC2177BB3E93A6FAB5446CCE9CA1B9D19A EntropyInput = 892A2C896B651326025690CD9AF53311F12D71972CA9E4C94AEE9EA0C01F755F10F95980BA91EF6EEA9E431C8FBA2E4E EntropyInputReseed = 32B8D7E87CEE31EAEC17F76844FF5C7AE9060BAB096D23B7969C12D15DF1AF1A Out = 944C7CA7BABBA582B3FCE5884575650244017A285059C8FECC124154BC9888E2D864941DBF2A1D77C13F3C757D6A8578E949CE35353CCAFC86291F0D191E4A12C1F11D9FDDB5B1187E317ED60FF9CD4AB6EBE254D2A2CC22FDF39C0F2F16E564749EBF55F459A37B2D47F192F22BFCD7D8EEDD5B24BBC778D76C0D78B9896FA5C0C0E049119E672DE430BC97055B07F910002F888A4B1ABD61B018B21108E19C9EA599D747F2AF5FE6E874816DDB97E85172B575A8A8422B83A8B9639D75C354 EntropyInput = 7A8E279250A125706A0D1E92A97094FE54648728C723A3BE1A45C7DD02411BCD4035EC54805FD8059227520EBC9F9514 EntropyInputReseed = BD7D34B927EB3DA0348CF441835251AEAA894B703B13E9DC8298998A5CC402B0 Out = 8F05FDDD03CDCEFD3DCE2EFE60A5DA9B485178961BDB3A3AACA1A7A6F4FFD24418906242D0E4D33C3176FEA4619AE4AC7719FE136389682D011F26489C7AB2C72705E1C1B88D49C62C86CAAFEFABC68AFD5AB0AA1C83A5F4B9DE0C7594F975B454252BCFA3FDEEE6375AF00E0B61953A2EC5074AB637981184A4F34E899469FB119CAA83202CD6F42EA5969BE7EADC7E32CA9D3236AA300F9C5A9AB85FB00720DD2B6A80B4CB8054A6ADA951A6F87341FA4A1064C9FBF6788D35D5A90BAD4A77 EntropyInput = 505DE7C59B059FB016559CE6F99171E22C6F6636910919B78D794FD3514366F2D6F8CF141F1EFC9215C8202145C47275 EntropyInputReseed = 0BC4EA2565723367BBD3E80F36F069424F2FE87F40F5B35565F41E2D3CB2F742 Out = AA3A0D33E280AF75D8E170136CA86DD1CF8D37B9BCA22057B45C4FBADC0633979BE7FEC5297177E9AEC50369950D1349AFB3AC0B36657DA4948B67BC578594791BB6E1CFFF21D43E94A8FD65B1EEBCD785B1D6B105D6A30CE018F6F37A39EE07DF6C0ED646A18C17F35E9419E195DF39DC5606F3ECB6D0E15511397121CF71F30524B1A63778B3FBE3A67A51EC7A19414CEDA953D977A1A16534C8E41973F66548C7AE8BF68AB49B58BD5EF8C3CEEBC8349F8E0E2A539720CE9DF39145F9D086 EntropyInput = 4D35A6EC6A5633F68F4F56675654CB350D3F146C8D857172A799BF2A6B3C0DBBAD19C3F7AE073102772F3A76C162F5A4 EntropyInputReseed = FD78B50DB3A0D172A4DBDF15A32AD7BFD700327716D91FD453FA40C6C85EB9AE Out = BB8FF41F1236DCB659DD00B7C52F4C3CA18CC6F7A6A926DE1B21FDD711684F51BB8AC74DA99D56D4073B7D0EC913BF960731E08295DC7DF8E1EF549470271C62EC06EC3D87C1BDA9D34D69A0C2987E7CA690DC9859E07B73106F2074F5E8F20DE801B7BC091C3F1CC5320E4E88BF7592C296C500D83DB9EBDFA2FCE53E6FA598647D91FE3CEB732E3793BF9BEF7B926C37D094B16F451DF29A238B7FBC66E267FC9F2361C2070F71719299458DFCE48DEB5CEAC17BE9B7B29AF9A8CE3D59B071 EntropyInput = 7E57DA83C7B270B432259E8DCD7152C3B3573D8962682DE73C6A5F85E2CAABCE922C9C8A78E9F06720B4D7A971700E28 EntropyInputReseed = 92A0737FB1C80898E60E8B10F362364739F8CEC09AA8DFD517F7409F1E1BFD7F Out = 35C086763136E2044A635BF0ECD0A91D99A4DE651681BC2257BAF0CFC75AB1F6370054CDA77EB1BFF24F12E9CA0A72B9BBE052D8372B9A9360D4091EAE6E63D71194103F3D7ED68599CDB7A0DA789CD69C838AA2DDA57BA5EE76D7137A735F60510AC1E50B601EF92508FDE7FFB2E3479C75DC05949D2D1BBCD64599D51FD6BED7C67C9460957616F5ABE1B18E19CA9FBF83797079370EBF38D795F0655AB20F24E12C03571107BFE685C2C098AF9278B9AD8EA6425505EFA639C2C7029F0411 EntropyInput = 9F2B8224E424706BBFBC54EFE7517412310A28DF9D7BD3A66CFF01A8AFA65D3170F91E40833346890D6470D0834EA070 EntropyInputReseed = 964A8188290921476CCFA6BE41125C992B0CBC95E81ED98D181B14DD87B9874D Out = EE3DD2763F47A4ECDC32161CD979F646AB0F6746C1BD629F8194F710D005F9416E838EB95E0B417B0D2518386F6A4EA85D9C7E14268B2B517C95F3585928E3FC5D36FAC602BEE64B98E4229AE7E26AC3FD1BF5C343666324005257FCEEE1D789B9041FAF87790FA2ED3C5A6FC660021C97DBA119F7660F6CFA96F20EF93C0451B8CA6C006D9BB2B299FD6247EEDFE23EE92F310F397DCA9690B13F22B5F40B6DF4BB593C59B10DF59C91B9BEDEF73FFF58E5012E1B6D16DC747B283C3C4838A7 EntropyInput = FB07BF1C10D609BD74BC78DF5A4632222D9F4D4CD9A43ADA96E47048C441907A5736E1BE7638D07A10C570D69CFAC201 EntropyInputReseed = A66C3BE7F2E5052B3DD83886B465383304F2409F72ABCC8583935AC3D41D7B04 Out = 8F7ED755756D077E6907EEAFB47A6F55F23E0F515A2565CF0543ACCB2C1BEA7ED7A96A98A711F024AC4A5B149095069497D6CED09F340E558B12B064024E01EAEFE9BAAAE45E16C31FBEA8E46BD21977724F05E869F1EF2DCDA8A19ED4734FA0C62B7CAB32541C355D9D3BDB9402D6588CF9E2563EB4FE022D1BB163A3061290586EC5BAA66F6A932D016413D67A6DD6CD10F49899909BFB757AC474240D4CA580F8BCF350ABE31BBC7BB772BFF1E1CC0FCA23D9EE33F04F66A5FEECF9F2BA20 EntropyInput = F8CAFE20CADA6427411B748C7F93738BB0FC6C9D8DD6E608EA4AB711A1797DEBC87FB9233D6083CF89E7E910D22A27E1 EntropyInputReseed = B5D161A63B29F7E4529B57DD47EAAB85F1DC420626A6A03778A83F97A2D54E06 Out = 589BE310D3ECBAA5C2E555BC6A4DF40132436AE966CF0729F6227ED47F12B8B5FD3FBC70DDA16473D4F7BD6B46B3AFF11F4DC63B308C4EE39D12CE5F9D677003A1A76F7095C499E2A108FF82ED34EE7E1AC3FAA195FC84CD9CCDE3FFCD70AF0208F02623155BB3C7314EC4DD750F17161B24BDBAE5686539AADB3668F57499D19EE2DAF6A5E75312C1DF652DED06273C90749432974FDCB9348A7BCBE791DE77651C1DE6F441470BCD2D074F22C9DD01397C385DAD689BDD7F20359CF83E684E EntropyInput = CB126527972CD1A3D8C67D4A05FAE293B798DD379E03012D7A9F46031150938124F77F5EFC344CD5F2171B59525FFBA1 EntropyInputReseed = 6F95256CF622704512212560A1A384059A0D08FEA6076DB5079348A53510214C Out = 8A34A865CE007A8BAB429F1ABBA270DD56CFCF87B942F5FFADEE0941107B45CBB3CEADAB7B429FF5C9A514A842BFCC0E04DECD64074948A2AD1C438E65DEA6B48031E2349897FB0B22F6A57DF0E6D2CE204A459E383D363E793F67A11889629E338EF9798423BBEAE82DC7459CD16DB04FC32DA0EDC2AA934137AE91A12339DD26EA84D0AF60EB62F468D5DDA846F0FE55F0EE01D3B339B7B9016AE554F3617E87C631AD4720553C88C05721B20061EDC2C00C7549D0969FC777A48353FC5D53 EntropyInput = CA3A1CF9C596B8D449451AE09BB49B0898A0D123A0C99AD3280BF85245396AB1F0160E24B7DCCE83464DC3B9879CB922 EntropyInputReseed = E287EB98763FD692944384F2ED6F93257AD6030B15832486F820672AE33FEF59 Out = 6B4D46836D0B98A01DFD2C4CF8C08CABD315438BCEB76E6968A0EB0E346CD95E5C7E47BBC8A25F157A8ACC7F7514B21E9319DA480514B83EFC04D27145FE3A188110209DA69CD69AF2B17A4F0096409879601A47E919FC4DFDB4DF1578F028BBF600BD3C234EA51DADE0435EB1AB471B6B58E1FA7C6D33A284F694A8EF5251BC7283131321D3BD5F1567918C7437C0C30955532747BAB886EB3696BB2467297C740906200BABD117857F1408A8181022CB7CBD6D42371C59ABDB3EE05B116FBA EntropyInput = D24D18408D5882A6F1547BA78CFFAE78472EA017759F260F324B2C509A27C5B1096B80D7C93C53812138327EE0C67CEC EntropyInputReseed = FA5F33900B4682D7A37C8D595DF37987E130BE9F432FBC9D47C8D1B6E6E883FB Out = 1EB1115A93E46475106FF3A4B0E361802E9120F13FBAACAC7BAAAF73122459D3FDD956708C415A3F9223140D5E66FB44CC402EDBE3EE10B5FA01824213ABAC87E043501D5CB8C354A7F88AFF6FF4C1524D12F8AD8D98127FFAB709F3E634AE1933A1EEBB3BBA94B013FD1701657B3FFCEEAB5E01416F0DB1921174EF4E1C46236784BF858D8B9ECD6F42D1C11FCEDF73CACBC1B2B598D04B654E57D73381EA2410296E12A028F8C44BDBC7F59B0948F6D1D3A53B47A714639899C414B1D7A887 EntropyInput = 8409187206B5793F675900B4342216563152A6425D93BDACB9FACF873B2A954486D22458DC89068C8F89D3A57292E973 EntropyInputReseed = CAF8706B1013A8A8F9FE264DAB6FA0162A2D8B79A86513EF45D9B4924DD47610 Out = ACA70FDD55E10E390CB5A181B3E51DD18BABDB4AF0839302096C8D60D4F53595E3EEC35D734B01E8C93303C44561B6D654125976FA79A6811642D975AE0EE86DCB5ED5E850FE55E06488053A13CB7446CDC53D9E78079792699C3C37FD4E66EAED0AC4892F604A01ED02281F6749E73866EE9DA70E085D0A95D3F475152F2BED88207538C7D2736F8FAA7EA658DFF5D656909D99ECA2FB07273E4CC157EE992BBAC1362357366203B0BDD60071BBF627D74A453962EB16FDCCFFC3FD25978B79 EntropyInput = 594986D76381473AA0470F1E89A70CF84F5DCC4A465D98877C58ACC47A12270D584C6B8B62F91B8988E4FA25C74C29E1 EntropyInputReseed = F1901BDE967034C78F5E219B93C087A8500C1AA74CA3DB72ABB401B021FCA578 Out = 11EAB1D2E4E52E5EBB04577997CCF866F0903C77443A9BFFF2440F7EEF8A9AA00976F6EE82BE13C20DCCDBD0D29172B80DFA3A75D9C5A7D550CD3CE995BC6F2D7C8D7161A56AF828979F43A38847067DAFE2AD9EF0F487B58C840420C99A6C2ACD674B1097E2E093E08A8755D7DB81DC81E2B92ADDAF02470BAE3BA7335C785710028EFCA5E1FF3F5DA0D3EC13C8751086CE5856B75B509532AA0524FCB2ACFC17116ADDEAF50ADBBD84839FB51EE662F84A26BA28A05602D9983E9F954C5035 EntropyInput = 7297B3EBE66455506D74DE9F8419A110E266733ABE6D8A2D12C65B9AD52FB562E5257E1A417BA829EFB8C674CCB4F0CB EntropyInputReseed = 4B741B7974AEA4DE35B160C7FDE146A7FA11AE65620EE0F3D71C7862C8A18E5B54DEB3B788F770E8B360C21BC0965F3CDA246AA1BC8282211643CA519A963D85 AdditionalInput1 = 15B46ECDDCFECC338FD2BD568D3BE59CD90D3F21300534BDA380BF65F464532E AdditionalInput2 = F41E11F56E6408E338D5C9DB5A59AB7D7BF5303BF640A5DB0B3D796EFFD66821 Out = 64405D6ACB6AF89470CE210AC6B1280CA3C6B83DD44698972FE22A4FB51A925CFB6527778BB866C44644723B2364236709D268E50EABAB118F253B4A5DE547F0C921EAB5C1D1AF7530E95AB875814896A11CDCA1AF438B7A06092CBA1A337B785CF650DAFF12428CFCD20D4F4AB95A29A61C46D3DCF02EE2B1F3CA7755CB5BAB1F7ED10C3175173DF4E33740C24519BDF5ABC354F468A39287A4D2C82F9BFD1816D5F4365B1CCDDD72B6AD60DC2315B8A6F85EA7DAEDE68F59A2EDFCEE672C1A EntropyInput = E2AE839DC05A9506BFA06C07A0DDE8C1484948FDE99DC61FF24C90425F31F9FB9C5EE3F6C54C968D3BE2774E68252994 EntropyInputReseed = 15CEB5AD15E1F48DC85A1AAA9CCFE67568A4FEB63D81FCA94301FCC5CCBA5CC697A72FB17B4CA0A3E3C238CD7BC6EAE72CB5F7BE4A4923712A83BCA2F44732EF AdditionalInput1 = 94001BD1D8699973FCE9D3C6BF97C6838CC5FE35D48663E7D1066D4E632A2F57 AdditionalInput2 = 2D42690C637D566289D86E3D708C139219125635EA46E16E32CECE022F3D2C8C Out = 1EE2F2F003223BACD93B33A448D54802CAD6CD40A2986724A59FF9C2DDAFF2EB1541B712AA252D552955848A58F80E6F4777C76E7EE1BE6C8F7332B64539E7EABBE9BE63069453AD4F1FE274E6ED9BE6AC649D67EA79416CCC9543ACB2C6EB0EC97F77D4F3D575EC4FC0484A0D382BCD0AC495421CEC493535514E9D5E76FE3E16C82B2EC12F454DEBCCF1186A69438C876D9C9B82DCA5EBAE15FF793AFFD67E1983F705C36C05B4E5FBB25491B98423BE4E2858C37729E70B9276BB3D7A2B6A EntropyInput = 0FD336A5AA1C4D91F091AD86E22EC3C29D3CBD20AEE9AB3C1636D375660AF1A0C971391543D8C1FDD2C06C721FBFDA1E EntropyInputReseed = 6CEA8B3C07D8438502E6DFDCDF2230BD0CE5CAE6B78A07BAB0280444D446B4BC32F0EC07EF4BF8151747CFAAEB449272E097C217FB421A08817FB044B44C7451 AdditionalInput1 = 9664738F99D5E8B41985985944EDC9A4B8E64C6051D9325DB361FA99CC073C05 AdditionalInput2 = B0B3BCAD41520AE89652E817767DEFF215B9B7E2AFE522A9B7837F71B0CF9D7C Out = A77BBF641814DEE6E0B69A7925313735500F7EA6499A94F82C85FB114FD9B3E5EFABAB13F31697F4FD9590DC4AFF5FC509B4312EE5674FAAB70D1D9B69D6101DE3EC5FEEA4A478C41245DDA7A5B4C3D2447E7E5A7D41E6341055B7CAECDCD8BECB3C07D7AA073BBE9B4C1E50C6723637EB9B09D6B6313BB99A00C317832D3B4D88FC8806A012379100ED732B21ADAADC3AB7749D9DD9383C6A6E3397B64F842EA2C721294A24AAA715C5B6E13EA414D07769642DD08AB7B3A82F056D11548751 EntropyInput = 51AE93165346E120FA6D9561FC31BAE7F27FB125B2EEE3D6FE905762C765E6BE909724716F94F4D52E5BDBE5C6D164D7 EntropyInputReseed = C3B09D88BAD07746985A546A7DCF4BC152C50F16EC03BF4C65A49F580714DEADBC9D09434C4E67387B20C4C15D5FE9B178A20F26B245D2BAE4CE3FDA8E09679D AdditionalInput1 = C5655C20E765D2AC4AF4120A883F2C47E97A690D78AFED45239EFE89002472C5 AdditionalInput2 = 68BA0203609E50BB3E7652AD440BECFF2C2B3EC57E09F706FAC6BFA2492214FA Out = 0F863BE20940DDD9D51BD9197881DACB1C0C5EE5C6FF383C002A02D5C93B28808B420CA026F0BA578AA84625A2EF2936F94CA75BDA3D542824461FE10D522C1994ADBF5F34BBB1FF216C1F21115E615020886675A4E0D5B635DD904C7F45E91F3A3BB3DBDE52985DA50C4048AC3455312EA70D9ABDE19EBEB829BE621E1F9C88CB75C07AA98D3C555C7D754FFE9337661B6B27C9DFD7C8E08024DCD0613105E83AD98B5F86B166FA5BB1987F9E75A2BB928C45009901DF3C0AE12E8A2C6BC94B EntropyInput = 0656BDA83049D68101E476174481BDEB4FC17EBA899BB2FF9446AC96E5463839010CAA9377E872315FC94AFB4100985C EntropyInputReseed = A2DD33670D867BEA86BEA3DB08598C374F571EF9BEEC36A127FA40BF91392174CEEE5FD2F4E9936779B1A7AB37559D16E5C83946D35C4C144E929A5A35A5FA0F AdditionalInput1 = 1D21905A509EE57EF427DFB8BA0A39E28E990E92CA6095F58BB064DD0FB12A80 AdditionalInput2 = B5BEAAD4436409D1E0A6C4FAB5CE0E97478AF176046BBAAEA799F7ED223200CD Out = 7619BED124605E790E0BC54FC1EB95CCE6A0A0E012E3D016FA2E617B4BB10FE0A6D40AE991765E1EA6B2AC0B19D19DBDCF48D6E3A8C52DE889163DB8FBF7106FA3F04DFDBF52F7C8A7D567F0395D941E8A848E2CC2EA3EABB532C9B50594BCDE33922AB92CB0F1455E4945ECAD21C4666C4C5991960A9C45027CB548ED17B004EB4A5DD73E2A4B0F4B2F93E0D82A5225395FA32A61B6E35F4A1CA1B84AFBB3D09328AF40D15609BBAA8C557A1D994C49AA91B8CCE2ACC1A1D9ED05A901176ACB EntropyInput = 43604A9D7FD01EB74FE518E58E6EE2D62F3D569345B3064FD6AEB6BEFCFAC79EBD069551A21D75860AB8935C5C1C10F5 EntropyInputReseed = 4838B0D7E1D75697FB268CFEA2926087CA80001100F0C66B87480A93EB06FD012F49B9590315B5DEE4C473A3351FB21F7CD2AB313C8D937DD9AC2E4D208CC750 AdditionalInput1 = DDA255CF58A41F21B9619D4DB803BBCFC12EE38C82980C28D458C97541D3E431 AdditionalInput2 = 504190AC13621C417CB469A23D348FBF076A9EFBCEB68227481823070AEB418B Out = 813791D29D8BF3CCEC2502A4C446617F89F8CEFCBC7E11038A814249AF3C0C147B35FB40B67434AFB69E0778E03D6C47D08D1DC38AA1A5A902A3DE826E5252A13ABDE9D6412FF8B39EB82002237AE545F4EDFC5FFE5DD2C2CA54C29FC201166058232412045F33C1FEB567F684018FD947093581A0EE220912EAC8705D2FA658F7106D2DC645B167CE3BD5067A8EF633456ACBA3B5581FFEB79447626B7AA4D3786392A9B112B7D22128BC3ABBEF53CB9CB33C4A3B20F3AE0427BD5CC63FFE29 EntropyInput = ED41FA267C226F8F78DB1F3049551B508F603F6E1D63F2A80908E863AEAE45B02662EB2C1AD0F203F0D936FC47BCBDCD EntropyInputReseed = 0B83E3FB5D2348F7AAB99FA5FA64261A01E5412B4AE37F866D1F98B0A4CEDC8D9DD5A6F12106B5D7A2FF20D1A7991393776F7E31C01637098C9B93D1E23698D7 AdditionalInput1 = 4C4F175A275DF6F2324BD303A7DD6B382C5B6EA369F0A99139951A6A1ECD3A4B AdditionalInput2 = 1329DDBD7D5D15123A84C15A9222592F3978D3DF4433A591B8FF2EFA93783CCB Out = FEA3D4F72303BA7ECD3A374E3648675EFCD90EC502E60BE6631ED9BB7C45CC86688A12C59A392338095607FA3D8CA240C489E33115B94B82C6C8C219181DC547D9C6B13E4DC5C798F116AA438B4C491F89A887B0E33B761F7DDEAB10BF379401D42FD0E45BA0BB5407F75C61742423E1507949F19A3102FC4FBB611F877352C2B413384326560B8E069E1B7DBE600FC72D055165DE3F7049F4C2F6ECE834837CDF0BE980F3EE1F6D72D978192F57586CB37CA04E091C01635C6FAD7EECD5AD9B EntropyInput = 5176FB99FF294B0AA3A78FCE18C6DA9FE4BD3A8449D53E88084A73579215F7AA65E53E7A90589F4F8B38072625046B0C EntropyInputReseed = E88E2DE323D250A38C6933AAC339D422DDA2E94960636CA16C929A5814FCB1A0EDAEEB9B82B4834011DBA1DDA3723CE83860451F86409F74139E060284E2BFE1 AdditionalInput1 = 5B59458780C608B243CE1F63EF6659F37CF03660EF323ACC31B20B250512687E AdditionalInput2 = 18F471425008A4A5256BD3DBA0ED32490145F4D55E0597409474D2EE619584E3 Out = D9CF0FB6744DF5E2E884B02D690E2F04F20B0A09A7D680403601FFDE3AC40BC7D6183F1B99F7623C390EBB521D42246AB1EC60E147367B6DB20EF393498668E05E4DFEBFCBAA965761A90841399F44BCD79605183E9BFFAA8183B4676A69C7F69581D637BDFBF425901BEB276A14BB2FFE1296605443376FF3072019B556293B90A292FD82211983784A9C8686ED04DB7413E50F185D3411DE389D116F5B8AB0D11F1D51FC447F77733E2DFAAC3F1D8B4C4BBCE378F128DBB3B2271A52F6EE2C EntropyInput = B90D554CE3B22059F6CE8901CB53A3C150EC4B04CB1937BB4666BB02663F9995CE2DF05A20E695870BAEB8F1AFDE974C EntropyInputReseed = 8FD35525146CB1ED4D1A0FC2450D629D82ABF079CF24BDADCBCDB433373CA87278813EF273E0B11884EE8A47AE530389DC8F1E69E19DB8DDA077194B7B4C959F AdditionalInput1 = F11C7E9BFE48F69FEA7ED99898B9F658098A1E40C02BE30BFB52D0B44CC9BD1F AdditionalInput2 = F05535509E55E24B99361D4CAC7EC54D87001AC6D4E11DCED202C6AA4A64FFD1 Out = 8B69828CCA0882DD5CF541431925311AD6F7BC62EF6292B6927AB4B01D66F0FCFBA091243CA0AAA296A10469910D61D8D26BE6C724653FE80F6C1E2BE19EB06C6DE81D19E8E9D1B60D101157C284ECFF8C0AB728A3CC52471B435DE3033B6EC95C39EFD47A031116B41CF7E2617308901983BD086938F0E5FD15EBD00618632AA45E657CE51BE2F0EF4E13BB663E448CF7F4261ED54A61169A9D30D5EDAB2A941C54525BE4EE134EA6EC690F8BCC2B706E064390CEAAE3A6EC0A80B929126497 EntropyInput = 873473A919A7170606BF8C22D097D20995F9CBC4B16F394000BC2876598708511A24671126B43DC409900D45FE7963F2 EntropyInputReseed = C8A69171AE03963A07B6E9311FC4EBB5F87397EE839121C2ECBE13C547ECC420B21BE6628641BE74DC6ACE81932E25EE43D79DABAF55D6A4B196D041685BE339 AdditionalInput1 = DFE57CB1C8B3CDC78F479564569B8638EDF381EB7D7D73C0C3DADE6CFB44508E AdditionalInput2 = 9389F5133C6D9DA525F79CAB96E54D7E9474AF313B3FCE65867FA92747043D4D Out = 67B54EB6B079609A761CBED83B6E4F2296CD27FBFEA32970845FC35B06C987AA0A8D6798D6C309142E5AC56FF4B4E8BB3AFAC10ED39F61CE2EEF477EC68696D9BA293B7A46607A8F7FCEAA4F4319868008456DA0F9E0B9B86C2EB29DED7E608A9D01BAEA66ECB7E14E073E6A3B29FB6B321AA3C5DD8801F4C689D610DA4E0F28EDBFEE32DC000D8BF988F5A4839F0565634B5A777A445D0D20FB10200C03DE64CF25022476318C756563FB9BE0E07C6F7344B41811CE3DD09BB74971E1A09A13 EntropyInput = 8FE60399885A694E9C5A47672796AC14B42EAB6142D05DB7EF8919101A4264F00A0631D72903E7D90E9FDD9F7CC27BCF EntropyInputReseed = 0E44F1239AD50C4B7A1059BAF17BBE2C00C96650BA9D376021A8947A05C44C2101BF4264A490FD179A63B2775FB4BAD575AEF8E591664F7C0AC0CDCB38DC5C57 AdditionalInput1 = 228D836B9DC5E21EF846C003DBB1673FD435F0E8165DBD6A06C4E59C81AEE22C AdditionalInput2 = 62CFF6BD20CB8343A9D5E42B9F9291F60A604799DA5AA4BA8F9E87A501E4DDE2 Out = F15B3F6FACAEAA0452AFCE86A1B26C45375485979AE8C20A1A41675349CBC18E9E94FA8DE7E0ECEA9B8A0A7771ABC9C5604E474E3431BC0033E6B81092FAC2D31CB2FAEAB1CA32331A6B47E0E77A237A5AAAE1D8A1A077F3603AE22470F315F04640EFF0099F6D48D46BA06A7F467AE8D7D7CE1175FCB5AD8B5C9694E6D0F1A2DFF89F58D075BCCA0ED3ED3CFF836339C4C8FD4A83D8EC8359132BDD678520501C766289CBC25E917FCDF9FC32DAE256852F13811909018B3AB01434D9E139C5 EntropyInput = D62231788FBAC95E07DB32A3E94EDD5EEF35304F679064F9CB37BE4D569ACFB3387A23AFCEC2A98E6E1E572F4590F324 EntropyInputReseed = B7C05423ED04CCBC6CBE60C36BA9110022F7F6F7EFCBE8C27AB8741CC65AFE715D0F5B1E98B6FAC595F5F36973EBD5E6DBAEC0865F2C6E2204AB9D1614B69719 AdditionalInput1 = 2F49221737580DA91614B2603BBC5AD51E9EF69EAA261BA166D65A5F27FED225 AdditionalInput2 = 885A8F1F3E9B3AEB5C01A847CC7F22FCDF0A51D389BA0DEDFBE1F6634687F576 Out = 572DDE076F9AF6D7A58F689AEE45D45D7004B7C59EEE7C27059147C93CF76530E623D778C48671BBBD19C1177091EC8D1B8F144D8CC4DF8921C8688CD3E46F84D2F751EAB89CCD4E658847A18BBE44908812228BEC57B2F7EF08588F69E6E0953F75A022D345909F21D423304E81944F9CCED990EA0B48E9F103275B594CF93A128BEFF9A3A7002E1EC7861A116726C3FA07EDBB7FF1E757A87D2B1E1B383A59578C6C20069496B3004D8812BF04ED6CF6C4E7687DAC9CC867525B0A4BDB8323 EntropyInput = 3772DA71E9C2F344CF35DF740467A2CE6D1CE44CEDE3D6EE8FD267EBFA09E0FCE350C308020AD79DADBC1EDC68A2BBD7 EntropyInputReseed = D01C7FD67C6413691667994051C2DA7043A7D7CDC3C0B32E3B1842B07C2B15919BB381A8FA8E9F34401F151C36CB80444E9D5C22630B9590130BB616100439E2 AdditionalInput1 = F07A627E37A30AEA544919E2A6D246AA288760886741A91CA9080522DA18BA3E AdditionalInput2 = 63C7F304DE4E35DC6FB9272B38B9700EC575D29D4CC91C1ADD25740E35E7864B Out = 1A89A8760AEB668E72EFF6D6E7E8642E15BE44F4B581A134DCF9E11870262139D5727C3C0FF593C2C5D11F12F1EAD95A78CB90CE96E6295AFA9CB68BB52F01B699F07D792068885190CCE21618AB56F6F64C46DA8AC1CCC4E1788EB3C0EC07B2E91738C251E60A9E697727D12BD652EA6CB53D02164D2F1CA546D731313F3663943A61B9D8597E9CB987FCB19E68757B316B5E64E491DFCC25AA08BB91535232B1F70456F9212118A728626A3C3D8B925AE211A09A88537791625AAC5B82AB1E EntropyInput = 5330CFD1E4677CC79DF84B631600AA7143C61309F65162768054D3D52279B79B8FA0F39D31BF0762DF895E55AF4B29E9 EntropyInputReseed = A29EAA513F8DAAC7E4E5D63CF955C21FEB8E7A446AF43AE7E370C0C0986B11423219DFEAF296DA7E9D7E4B9BB60FD26ABFD477C290C55D642A56B9B5F91CD64D AdditionalInput1 = 282C76E181664AA10B92449121487F960D8431C7F1392A0D43BE85B9082F5289 AdditionalInput2 = C6292A82E9D5B0D49E593EB3D16C68748E38D971A6C3BE4D4DA0E28EA6B98F09 Out = 2073748681D934ADE0E9FC98E173B64146AFB1AE977DCFEA9A4F38E896378B3843E7D9B2889118BC36D14262C836B55D956EB3B1F2D889629178711DD7574450126E57FBEDB8A6731CE4C78D8B55891A04012F09EC75AFA695B55F16ACDAD58A96452CA2268263B48A8B85ABAAC70581CDA052F3F4BC264FFD585CC7CA09B8FC879838AD181ED7A2B01AD08D2BA96ABC44C61AF573CD187DF345A44B8F2CFF5195D5E0B4664F3EFB4E2E4A694995D804B3FE272F82B390FE9DFE7F035225F434 EntropyInput = 3EE0F0F2D187DEE39F37BA774EAD7DB2CEF79C91E53315573CCE773AA832CEB038A98516342F78222119CBA03D38EF17 EntropyInputReseed = 8FF435BFC78B2DD7F56423FA63DACC72045E58902778B788A974AE1A347AB0159522E9B02578FEA1FED1E532D4763C6F014F8A22E83A14BFBB2A6556786F0E88 AdditionalInput1 = 0D0808177314E4A080EC86C3CF371E6FF58D6A08E56A6947CCEF0E84435FC543 AdditionalInput2 = 1AFB5D3309B1F93BBF9669635758C5E9534B029FCDD8C4112522AAEF6347898C Out = 19D01ED2FB655833747A3AF03CC638C471D52DD352160602375675945F0BBA49A93ED5A62CB57B1213E336127AE99F08693B838F0F24B8C1A80F18822F023A3DC4A303EEF7A8E3F3238F03EC77EC796DCCC76A5A672AFE7A8C465031241F7147437D9378C3412DBAF2BCE373A2EBFA17A124E24E765BD9B3E2A8BD59AF0A468A54C8D5FFAA370A5B169547BCE4399A8FE44A513CD445D115A44E69E0C27440AD2EA276A43C9BD3BB745D1CB3D561F4667B6F61CC032C50C957171D2B4AE62931 EntropyInput = E9FE33F3D1568B146B7A86FC0FE80E11E7D3E08CA39CC5DD38676F8ACFDB75BB9AA091A027FC5B3C394C7F17C816C3CFC9B45F1214B7FE12D5FA54B579E055022C25D23D8AF63E3926C0ECBD92AB8D01 EntropyInputReseed = F6270E5BA1819E482E42197896B924F66300A0D425153D551EB000EAE809C15A Out = C7D0B27B36BC2948319540055DF229AD3D43B5086AE345C1C3A517012C247D5EDF25CCDF83B6FDF4EC104149652B1D26ED70367B246DFE9F5890F726CAD677744F6408D243D986EF768AAC65617C06204D35E31A98A02ED3235B0F98998669CAAA3FB5EB94DB64C2DFB3CEF231EDA1FD59B4377B0B002A8C0B5310B96F49E0FE3C46944514E5F5AEB4F644D4385F0E2109BFB9CFFFA9962E26AB2C7649A27EFA3309E72CD15116A5787C130CADCB4E42BA6E9D0BD14EED1C6A019B5BE13BE0C4 EntropyInput = 183C2B6966472F86260B6C1DBD1C9560D9170C3BA74C7ADA8A7138B4BAF2A7AE6C91B300528B7E1FEB780786839F18597F5ECF75FBE172BD8FAC81204151F395E5B5EEDC8FB24FD7521CEE39BA98439C EntropyInputReseed = 0137A531AF7201ACB07F760C88B4431C62CF11E84471547AAAA861D7DCFCC179 Out = FA4511C920D1614B068DC3A76B6DCBCB3A72DE5A6FD073F8CB732ACF09B5847337219C7D226D221E4130B3F100C36037E56F064D49ACCC21EEFCB69C030E44DA36A2C0A220000B0EF1F730A1C243D7CC683B70C95BD1DCAA2120AD2A20A9DC2DD89A2650D8C31F0E1D723EF9AE0E9B404716332BB86ACFD8F31BE8FB6D14FD6D31316701975D4F5504ECF4D1280902BF0F43C3F348EE60DE262995AE986E1073ED5E5D5DAD483F2448CF414A2D21452B1725CE457A9CB614F10BA3E83F56B163 EntropyInput = 5338DB2488DB1DADA8626CC7E911E095ED46FE607B9EC5AC908B11C17CF1238791370784E59C97FE5BA145BF3C58980FD7D439F9F80141062C166DC456AAC9C0B545B6F345D82146555285A448BEDF62 EntropyInputReseed = D61B50C21DB441768CBC440126C01FBE2E4144B406CF3E62B663752CAC4EED14 Out = 5B159EE4E4A39D23BCA4F69D657725F35725143B89268A8C92031DC67CB43EB9E1FDC152249B71526E9FA3F834007B56CC341A339DE19C39A1FA914A30EF6B004C67E056AF8A3EF7A696060B74A96036ABD17F2110A31E1BD3935F6519CAF91765E119B8F4DFFDE6734FB47A5F513D46284E5472BE68F5E6C7DAF92DEAD6B4E8507DD8E6DC47D6B5802D56FE45B086488511B7784209D162FA6CCF090473E1EB8FEF2158BFEC2F05B8E2FB574033D24E4493B1192C4772CB326588F75CC86940 EntropyInput = 6EB57649AA8654643510AA360E0D25F3A09EE4AD74978F88A6EDD4EEBEFA6948279D47D41E06D865EE9B0870B5E52B96983EFC40876527D09E803E3F908C9636D71499E88291A35E00907A69E280A096 EntropyInputReseed = 9A616BA1F53FB41A094B549D17F887281D0C06CC89AAA80B24A81AF14E0C7B2A Out = F0B54D6AFA82485A9CE9ACF61F3CE3593E852145E0FFCB364DB0E71D46464620232532580DCC586C5B16DC8C0A62C0FB918BD979917ED6E8BE595C4D0291ED707D064EFD9A866066F6484AAD4A5A4AA4D2C3475C4466F25D50AEDD479378488A6219E57AD6952A0715E3F8467CFBEDC5B8216DB859FD54907F9D332A6944D6683EBE49084077EAF8CD2F1FD8C26CF308FDEAEAAD9FCCF7A8F6947A484E562E668EC2F834878F0D62158441561B199FA8C61AC8D98147C30208818D99DEED968A EntropyInput = C055FA655031D122E6F6E237FBD017A494B5B3EFAC9FB149E5F2F9134BB1396FEB7F271592D181102CDFD1F6705895A753CBC55B9B845D44C96924C0F1876997CD52158E1E0E55AC3817CA90C32E2DC8 EntropyInputReseed = D1545F5740943C40ADE36B4AF9734FBC15D478638A236DCFA2FF83E49ABFEE06 Out = 978297634CAC67B7804570761C52BEF44CEBEB17965A03B1B57AA68E6DFE4CD88F253DFFDFF36D4143ABA689E531DC129A6B4A50D9C0E629D5C4A544CEA8B4E47E75228586453D23AD0A8024B416C858CA5976753852E9F2000ED1B05D428A7DAB5B5D81B251E71B2D5E94957C8D61C3768822304B0CCDA74B1A296D4A9F5951ADF71138727C19ECB8B1C7C6B784B2043A8D752DA3613F50DD2C85723881AC44B5473DFB6F03EC3BD63EAC4460486AF5DC7BEF2E0E1B744923DEDCEF37D8786B EntropyInput = 945F4ABE52D6AE3776754B04C94380B80FB500AB44CF1591FCEAF047DF081091673C74025180706C1D6B45C44A23AF9F5E7B277FDBCBAA581FF17856616E6C88EF03620B1D3E24EBA487CCBE8EF15A40 EntropyInputReseed = E0A280F9CC4F70403F4270304640DE69DBF286E2B8AD87532275D75F76617CB1 Out = 17C22E1EF2CB3FC4687541BE3A5FE00D061F5AF595C294851C1320BF029906C22712B26A014A472BC9E9BEB8A8AA353ED228EE2E98C1B9AEF32F3C442A18A70F11966A1EB886A7867520B57B71DA397F5EF9C870D0DBF08E9F15A3EF8BC00DDD9A5FBAA0A9EC687DFB6C2742BF6CBFB6C7745C0F93A85F1AB0B69CE15EAA528CA2CAF67350F498DA97BCBCAC35FDBE05C046098B60B1096D5A134DDFFCF4A2E80D8353E31BA0F6849840B6A20FCB879BA60CD4C8EA80D9D6BD548CE53AA42676 EntropyInput = 63EEB912252670FF58E0660702D635D2CA616C877CCFD4A381AFFFBA300E0CAE6237234F1463817587EB8B0343FC85C71B771EA1255BBBCC43CAC4821677464071034DBD3A1EC8D2491621AFBB0DE8A3 EntropyInputReseed = 6B7B85052B05AB5F31F21B2F698823B7A28532A196FB32E35E125C9D0EF112ED Out = 88AC116CF48A2F5784543E92A6907FCAAA4C2935CD9537F38899698D979C587BFC03A22AD05CB2AC09DDCF242DF1B1138CEC1EBE5FE6CB0E08D986CD255A2FA82A7DA9F55B696970ACEEEDBAF30F9B4B470B1D4ACBA821CEE865999E8EE45F97EF21DD3987947E353C1F421B30C13061554D606705E8400E95ACFA72E7AE13A701F495AF161289CD8CB63D36E808F31F8EB92FF145CFDDBFB16B9C3A645CEE37E2B97CD33869C1E258568880F81CE69EF183FAFD7DE45B5102F878DF77C63037 EntropyInput = CEB10A8FE1DA31CED236ABD502C8C7AFD3CAC11DCCFF0E676881C7149B6711865194EEEFD9BEF21CC5ED6ECB0A7EC423B2D9A3C22A0495BC78E40551A23545606EC13F8D749C409AF481291A93CF5D00 EntropyInputReseed = D0A03171D8D80CB2CF690A693B0D3636B885D0A9605132B159AF1DB7BC2E6B2C Out = 82E588BC332914E9A914CDDBA9BD9CB3D5F8D075D5D37DF6B50E0C55F5FA0B8B5E0877F69C38653DD56737CA03E2B30089162B8FCDB91BEE058D7913B6FF59FAA3A22C11F9299767BFE6B8C187381AD1463D7EE3780E389EF648343541822A43235ADF10719D48973C7B34A3F6D79DB034FFD097FDC85D230EBCE5C4A4F95DD4C37EF65244D35FEAE1D85308DD17594D70A9EA1A17AD987192A7A35646E9B1DA0ADF49D1AF3C5F8C7445CD2E9FE4F8883256E7433785DE5E8D878AD9C8996576 EntropyInput = 716064B357BDA6BCAE2C7AC37DDCD5E3642FD83D7BE235766583DC7275E924CA9DC0D1636F5289E687A80F41496DD21367C24B6F8C0BDC67361B7D010F8A815C4F61D6EE3B264FCA39E1E16B2B2F05F5 EntropyInputReseed = 5B70765B2C06BC2CAAC01FBB10059DA98DB97B279AB76ED44C659E15AF499082 Out = 21560444BEB31677848623467F52CA5E5CDA1CC405DD82D977DDEF932E67C4F4B89CCBCA2F8049F670D81F258BEAB95CF1D52B2B69DAAFE94C52E66A8DD770982883BBE3FA87FB7DA4514636926AC8CA9984E6880403EC38FFD4F6D42A7F98650A610D63A37E8A6A0DC60FC42134E88B7CB02D5EBBF8F54D7E410E21326290B063566808CCD3B2AF06C5B09C89D355145675A32FA381AB959E81FC8D94BE803A0942B84E86E163C3C6A535071AEF321DE9E8A9D0DDD244E042B149D0709ADA51 EntropyInput = 96F8D3C86041AC46803F0FF7214049E467099C15864B4AE6CCBA6EF8B504C6F2165AB9DB42DAEA63BF0B935633A9AE2348D26B9C5A414825BBB606FDD60FAD22A4A2EB80215F03847BFA975AB9DB7FFF EntropyInputReseed = B11E634A73ED96D6C62B054A680F361F8E059725A81BF2843556E3EB63C3005F Out = FBEEC630B78ACAE74260E854F92BFCABDE3E58F4E5E8A25C426D76748D2F0FB97F06085E11C268BEF6604D9B7CC2424C4BBECC701E2A0F730ED2EF2A244914F2A927EEDA9BB62060BA762306CF428CDB3C4F18DEED4D7D195C4FDA38322A7F5DC771B063B78A3AD0FF28D78BE1595E78966EF7ED510253456E30A157C977169B5AC302D9F4A05122BCDA6BBF10B5AB7D3383B3370E75DCDAF4AF7B4C7E4E34EDD7BBF0B4FBA8963B14545CBDD0D232E81A89616876C74AF85D12A57B0578DC76 EntropyInput = 69980481F405F3DB91703D675F3B31A833FCDA7AA074C6362645AB0E61CD59F7B515584ABF16DE082B633E6CB0700AB7D3908B6F719C5195F52D65141AEAEAEBED7506731F4C4D3C9988FCCB2D6673E0 EntropyInputReseed = 0717A57C287ACF8537FFC9933CE695EC84F88B0AE6203F9C0B7AB2F7DECF97AF Out = 9647DB6B4DE8E80925F66B10DF9C19B77A94DDA9FBCDB9E64A13D751BA2304E569C871B2439E48346C7B100F7E2905A6D4F37CF023BF2F7621FD0CF61B42D5CAFA86CF40D33457A912BAA5A6042185F793A3952FD29B51D6A66E73EF1832A23EB42F8174C25EAC11AD97DCA615C988C06293E67865ADADAAF10BC9410B4B4FA4784043A9F7F162AD98EAA49F5FD9682EC03421DA2D67E9EE8B82579347560085E6B74E385033756702974A1A95EDF7338755F860F3E553A297A5657A5FB81169 EntropyInput = FC465C7869BBBC201905B238D5D24238C1EA1606F08E4DC3158664DC57C6E3944C3DE31E1AC0814A15679511C018E6C203BF0A6BA3916142ADFBCD0B5E9542C4172CA5763ABBC07B65DF7E1C2BE360CE EntropyInputReseed = AC7E60548B32B65FB1F98C48D8D1BF194E7912A6224C9B94A2DFDDBAB882063A Out = DF68C4A77FFCC76AEDB7F28ECDB28324D07975F61CEC64B3825036108F65A791885F70A67149C0F4DA2C65E821621600961925C882EA0B251187486ECBE60051FBCF7D91B34E3E7E4F328CB827A2DF0626D80C13DC0E4F4BC6FAD4BD961BEF7A08678CB147415E181A927C7A256D8899D0741B1FBE6FD90891D862355ADD178469FA72987BCCC319F80A1360944C1EB4EF5BBDA4E91845C9FDD319E6F541CE7AEE67307EF3FF8F592DEC9067296F34251513A29AA489A16EF91797448EA26B91 EntropyInput = 0A3FE7C48D17D69DD8A7882626CC44E38F5AB07FAE04E99BA616EDA03715954EDD789702CBB2CFE2A8A751646DD97F18F5EB1C3456641409426E15A5BFB64E61DB80112A157D6FF8FCEAE64B3E066852 EntropyInputReseed = 16FF1D6F28C93BF290AA1C561BDCDB3D6C31115DC623FA7BCFEDBEFC459E425E Out = 4B41EB927E90EF0771F95DDC9025D2BBB7C22F40A9D95881E3CDBC361A1643C60A6EF5A5CA2B73FCAD75121351E1FF0233F579FF8B5BDA5C7BEFC06F8F8088F7C9AE167724193D90C91EA4FE759B00B96C7019193ADC2768B9BE333BFB1B81864064A8B291EFA1BB129034EE0CF760493CC38C2D8252DF497CECFD273088D9F2A63E39B7F979E0E82EFD54002B4589B16948233A3723B0E667EF214733A970106BBC9ABDA95FD40A1D6F366852012B3A89E1DBFE0B9150EDC12AB917F7B40DD5 EntropyInput = E2923545ABFBD68EE8D172B534F68C643C4EEB09705B50BC981D435BDF552D8CC5B16C09BCA337DE9E9B059E28E243854BB9A0052A275BCDED3EAF8CE25C87F863C97097A6592FF31AABB5560F72F3A9 EntropyInputReseed = DCF1CFBA089760C51194567F67BF3C45C44CC949A507125D80ADB8D98B6B66F6 Out = 86B5B43DCD94FAC15C5E20DE9627310909EC778E815DD13B7050D50051974757FAB934546CBFD56CA07C3FB038EFE6503C8AA93A5FEBDBF79E7C9ECA10E7A14278BAC7D0B653941F00BF6AD4518E20FC25AC6EEF82F6830E84AB0147E4D2C9CE303325E02A5C22DC8F791E780C3346A481C6A1A9AE84A9CF06A18EC6FE4DB0EBA9741128C5C04E62F5374EA271D1D86A9E248DBEDB839AF0CDD7ABAA959A41375C809D5E721C7859CBD1C3885A38C3EBA19013DE15E8BC70D2E51059C1E936EA EntropyInput = BC98062C88EEBACA74E3FAFF5389E92F14D7CE6AD5A72A7E31EA1094349CE6AF8CEEFD3313E5EA15B41615358FC657308CDF01537EF4C1AA6164ECA9F56850569B2CD333C7FFE73A0F5D21D8FC0895E5 EntropyInputReseed = 9E42627BAF4A9D2FFA76B4AF6837FA71B6B8A83EE07D3F356C12322A745F35F0 Out = 46803C0ED67CA292352369F340AF7CCDCF0E7E98F43ED4DA4B8F88B0C241527B2673C53B941A9A452D3AA7041CAE0CAC6D18E2C3187FFEEDFF25F27D08CB7035BDFB78B19D66F27B55D541D536230727483539268CCF3CCA82B8BA66D1E4DD9D7128C81C1A445F56281D133E7B97CF920A194FDB27946E7EC7E1EFE5973101B98E06AD08EFF3B5889FAA07DEE6DD2D69139BE610C21C5F47ADD75368161C6FDA6D13C0A5604C1EC7FCCB77782B15D944856B8523187B1A67E36C7ACEF5AFDDDE EntropyInput = F7E64A9BFF8FBA0EFB028C0F01285A0C30B550E15814E4377B3ECF6050D7D37E45C98564CDE8445F83DF7CA3AE42DD4A6122BF4B1D722EE2F42CB32F18B36AA1C61B9D18036FD2C9C61E4AD8EB0F047A EntropyInputReseed = BFE7429DC2A4CDCD2816F170C81F7358CF957073D696401A761B9DC6AF1BF4576F2C3BF3833894857E06E5A336028B0B8E6F60962BB2CE18DA5D6D86229F98F2 AdditionalInput1 = FE7E0BB856CA9D49553CF00EC1EF8A2FF2D213DE19CA07CC37D192EB32FA319B AdditionalInput2 = 66CAF1F1B8B6F12F8AD65060551D87EDCBAF25AC2EFECC303E624988C514D84E Out = D97D3AD44A650438A0CC32FAC69D9CF27230838DC7142B147ECAA453FE02DBAF59AA048B004966B7852730A6A374A1CD430177A6C02F3027BFDA2165325DA790D3CA9C41F6D8A1FD168FA60333699A58059A484D6363FFF18DF3C9B2F5E9B9FE7491DF371C73CC84D321F580BB6CE6179CB017228F67C401B53AADEB21365E3044815A8CB38A8E1523913FEC668A021D42A2AF4BCEBFF900A2EB15E3F39D06F91629ADF4BC61B38EB10D5E6265AEBA11565AA9C5E033F2B109C71BF6E49C0137 EntropyInput = 324B4423A7304DB37AA4A26C45ADFA91B72D540A77B845654B6AC31CA77601F8B39FCC65E47F304AE519A554556D637AE7A777BF050F03E4A879F66473EE39DB07ACB8C274DA644486CAF9D462A965AA EntropyInputReseed = 739736F4B978AB2E680509268ECE87758DEE6FED381295C93FA62AC754B08B7F3DF931603CCBC21F180C1BC8921B039FF66DD287688D871384936FB1578AD3AA AdditionalInput1 = 2E8E735B8197CD3C7A5DD6B8889EF47E940F11060CD0391766FBE5802B3773ED AdditionalInput2 = 93A5A4F4C8DC63EE5FE758F74D32C1BB68AB7AA5C97DB98764B8D5436C18AD91 Out = 393BD2269534ADDACDAA8AFD3B93592F2B51403F5A17410B309F2B305569F887606A5C3ED2E08336620C26ED5246858B6233D12752A77D0F81AD20A8CB3F9CD7EF20432F6C9246BF56130BA98CDC73CB22A9DA87D3984FDC676DC6782E59A87D659BC8EA1EA38FF6F5B87AA793482C0952F9C6DC982ECE0DE2A20429E6F8AE219D3DD2D044599B137D9D03830ACE7507EE077863CE6B3AB76B8295011D2D783D6116BE5B6FA0A92FFE23BD458AAABD39A086583C6C8B0EF80A4E7AAF706B2824 EntropyInput = 5CC41DC27A3E7412E36AB40719CDDD5DE7BB62C4229BD2491864AA6D6AC029DD4E608011E4D093E2D05FD42C52D0A4DC904D6CEB619F08AB3240D394353A472A1759B268FF0C3022B22CED3FB61A4CE2 EntropyInputReseed = F9505F99AB2A3432D336B9CC59406EAD347F2683FCF9859E52FD9657906DCFCDFDAE3352B135465E13FFB4F9290DEBB61074466DF68B9BD82779F0432CF38DC7 AdditionalInput1 = 3D11EC2A39484140A363CF2C95D31BBDA42E7A348A640B0A026CED3E2C72207A AdditionalInput2 = B773D3EFAAEC6EFC6CDD330A1D77B15576432382CF165BBFD0E738CC56B21DAD Out = B32A7131399EC498F823F3E60F55973017F6A93BB7496B092A365E2827D92A89FE4F63181D4BC9356169154066F4E03C1F08FC6EAC7D784047DDCCD6E4C7677802BC2A83F8711F9E2971792F97F4D9ADE5CF14C2410DC8E7ABF72889BE22A4243A4D2BAB13356BDDDD161266B40DC030EC48FF8C961D4A8E2C8CAA2B328DA9DACCE862D6594D1E96CE7B8B33A3FE41C548A449C89E5B1D4A817484D8D3627BD59FE3D818FA10C4F265A4C02724FAB3957D345EC5F8908821115BA936C7DF70E6 EntropyInput = 7D3713B36FBD5F8E7A555D151A28E76AC87EAB9C471A4AA5F1ED8563EEBF25EFF99BB84413C4D9E0A79E615FE2CF59DFCE3BDA911D6F71F46015A1BB6D78862BCC386456725559BEC231C3C2B599C262 EntropyInputReseed = 5280FE65211CE37B3B81CB59A1AD52BCD75A1A77EFE3A997057FC838D5937D5198C45281F4D54DCB854D5AA4D1E58B4D3509C78978489F3B5E2E551C35042EB0 AdditionalInput1 = 9199846932758EC6113C973FF57F570C28609C71F20D42250EBCCB376047C86D AdditionalInput2 = 0B4FF7C01B8577228E84CD4C159DDAD6CB773E257818AFBC500B8A77A66F7A3C Out = ACE30203A6460150FA835EF4415E1EBF35736735F8D710FA3CEC98EC3AABBE491C936FAE33C796081F586E262EFC31A834A4AB338676D2F94C8F6871FF3D8343852042BECD3F2B1F8DAC041328685F1C3E2667F7C1F31C2A29A0E7202149D1D4637083218C5C0B7ECFFB01C03590464521D96636118EE08C31289547F6A5C7C743AE31E5511AFEAC0943B569C7C42DD0149FC89E34438D2BB9B363EA9737D02C1F72DCA760EDD35622C15196C2EFBC2D33A224CEBA1EEF9F254E908A0C884BB6 EntropyInput = 5F36A0F6C8647DB51F449DBBDA4335C82EE3A0A1778841A092E63EB30A6FFCF148106F388EBFC9041129D7F64C31A482947DD3B1BA61398108D34D13D9BF26401372D3296CF38E0E4BE157BF79A78B15 EntropyInputReseed = 3CDA3EBDC7CE439FEB42F6B624769FF53CBDD88EE07A90167DFB547F94768C57528F5A984E47B578602D68BB4F70EA025A310DE7F2FF1C9CDD2A51EFF6081ED1 AdditionalInput1 = 100214BAF5285C1F6F289C1DBFC0B81FC5F3840A333FE452E44A36687A688431 AdditionalInput2 = B5086B27ED5B03DF251D7944C437278C11ED0BFD642102841DA60D13CA068664 Out = 9833DEB506A12B0EB253B2D742D09006BCE1B1AB1D062C05968205D0C6A3B7AD519E8AD30DE9BE8A2915204C9AF34FE00553D50958D072690498A404A19DF1B0A63A2B6ACC8505C61D1601A5D71BC010AF745228C6B64DC198505CAACAA68A7B7A407F249DFB4CA38134B297C0DFD20107DDB5FBCD42FBC03F4DF56CEE8AAD5A3F81E90B57A4701F54F79245C72673A8A5373D625825915384A6EF589AC95907A1853466D7F2B5A761D9FDD4865E409C6D41A5181982BDD34E8268FF2A6448D4 EntropyInput = 8DA6971B19F6A5837A13D9ED5E013AD35F52550403687B51C130F57BD0A96DCEC1E9B7274CDEC4A9519692F9961AC49484C9E62142D44CDBB6FF52784E0343B8A2778AF9D662D965A170F9CA7EB4968A EntropyInputReseed = AAD384D050366CE9362F153F488F84F519091B98D830174838620E97905B5A479B2EE9193E646C42701170A2BA1DF1B810B146686E78A4925297CC8964BE4E22 AdditionalInput1 = 52D985CC41A3D1117E2EAA6564D5F46EE925D2739E0E7422C0F7C15EBB17B9F9 AdditionalInput2 = 0F1D8C70052FDE0E922127E8B85FB0AFA0843921465CDA8DC4A7D844EB9ED4DC Out = D857C0FBA8486EAC49904DE46590BA287FDF5F6071EA529EFC929A949D9B32B06D0906855AF0A436066191EEA12073C86086C2C1F235BAF1555E1DACF3F351CF2DB40DE8F183121CE13575362C397C8E4117175D5581A6FC8E6422FAE435B662BFEE81F02911B4E916A58FB627D3E5ED88FB484571E2C7AF5F8C56AA85216CC43D2719E18F9C8F2FCC11867FBF637F9FE8694A2C5593C74EA48EC8DF755302558105888CD7C91936FFD759C589E2BFBFCB8662C2BA6C4C57DE1FB5B6BA491993 EntropyInput = C0D602C8C089D87B75C9BD0B09E411609FBDABB841FE067A20F0CFC59E943B1734678ABE79436B1DEFE5A06BE5A7A543868422746762DB51A1E65B29D08BDF3E0575B66837A5AEAD302B10C513BB8548 EntropyInputReseed = 0ECD1D0CEBD373C0C503B3689C99F190F8D44648FFC288AF69E5C6661F0ECD0266F359A5003AFB401B7596C345FB6FAA1F6085FA69B2EF260057D01F502D9AED AdditionalInput1 = E7131C5783CA7741C8AD8355A032CDF291607C9A7BEBFF045D339AF065F798C1 AdditionalInput2 = 1F50393468E12DEB31C5B5AE44B70AFF6E317625CDD5D749475766287ED2933C Out = DAE8EBF94853F9ACFC12AD366B6C2537ED3F09CBBF3A82220E7B019C8BC62518621924C04CF2FEDF1D9559B78E9A79E977624CF291BB3D9376116D423DE49BD83225EB24A355C64978F694A1C578E2076F62AA7D0384601F1F02ED966C5819721F70DD1DCA0FE36144EBD27734ECD2FDBB83302452D1F8DABB9F9588197A2D22793309A440AEF947C541CE11A32EE5CE942789C52C8A5776700E3C05DB086A38EAC862769ABD7A53E907747B1B21AC4FC527C6F061B4CD2C640DB5279AD0C124 EntropyInput = 97279AD5E38B74B2E1CE94209B17B7CBFDED4CA7D91AE08E5A94BB018CA4536BD5959AED707E20A87C1B09BD1CD6B2513341AFD9141B95C076188011EE7D73D1D57E6986ECBF55E84AD6B52A9217CBC9 EntropyInputReseed = 9E8E8ACB70E4F34B76735A87D8D3F556CA096E4B55494F1C1AE0A4DD4FEAA6F4C99DC4A6F578C71E791F51FD0D36BC672527CD3C92BF7E6EA79F761E3F3FD76B AdditionalInput1 = 98CE47E9DC80F6ABD3110E14277B30A33E6BF3A40369FC5B2EB62B5F804B5BFE AdditionalInput2 = BAB20169D7670BF5E31DFEA92762E2EF541AF622788D577A220C1166A6ECA33A Out = B58936F25A4AA5C21CD6CA021E1DB436C7681F9DACAED7D9CD91AA674420A999BA925283E3FC5AF068429C5E21D827B8FF1B87B0F973011961962ECDA3DC8920165F0E3AC5C508C74AB4056831CBECF3504531E049DD802162D00018B3CC5936DC320D86FD56D801B2476A0ABD5D3ABC64A2B9CB52A79D01AC72156751144E76EE1BD3BB30871F311B35C36F3AAE0BF06CA5F79A6AE696F4C5EE80AE046FDF460130F000AFBCFE209418C5056DC3BBE2279E631317D988FFDD0C2442B33E7CBB EntropyInput = 65F6116DDB0684F05509BEB3A8551AEFA7A038FD355B17C4CEFD172DBA6366A2CDD87B201D0B6818FD1475D2EEF6B927227974600B1476B9577168BA6F8053CF2B06CF130C68F2C13D8C841B79E3F22B EntropyInputReseed = 9E06AE5B6139888F6006D98FE218E7A5BB0BC23A174565EEA9EDAA9563FFD299F828DC34CBBA74D1C42D401A60D56193CBC0A7D823A9E4CBCBAA546F5FBC68B1 AdditionalInput1 = 7E1755E30487343364C9F5C1229114C923AB451390B59F20FE8A83E8D582869D AdditionalInput2 = C096BA79BE0F499D853768C29AA0C609C658C496DB0F8F0B0D03DE5745A05E6C Out = 7342271739137D5D468857A7F9CD63AF44529FBE5BE721F8DDD34A7715EF4AB51B05B82DFBF745D35BF0C58677A11C57DC8DD5A7D33633E2813690A520D5094E0C2B3EDE8E1F522447ED4AB823302F64319F35BB2E50C4C1688EE16D1C292A6C2B3A7E029A033DF2978FAF14BE6313D5D60EFD7E187AC791BF0EB6A3D531F5AD3EC733A4E85A1B2DCE2FE8000C2F90971F1C69E249B10EA6BF439B9A2B1BA98A0152E7026A0C577A1711D4642CB0151C2B366709E9730ED2CD3B7BB8986C8710 EntropyInput = E00641429243AFEB92506FEAF36FE1E2BB13BB324A45D0CA4989296F408A0B6F54CFAE5B4C045A81DCC612D6C8CC64C0EC8E2DCCDBC7598F5FBEBBAB623E225EB75B8C7EBAB726A8C005C9BC6B86ECB9 EntropyInputReseed = 691DAB095C4B39EA967D5416BA396A2E1A0691B21C6C0CEC55BC8A55B79A9BE7BE3BB59C9B5937405941FFA1898CDE190399D01566B477B2BDAAD4D5FDFAEE82 AdditionalInput1 = 5FEBB9407C05E8B76319A7A87B7599D8CB3164FB2EFCAEC09CC13207AFFB7B65 AdditionalInput2 = 8A5414125A64E8B4FAAABCDFA9B990DF1E426A410680E742E87B467A703BB208 Out = 8A0ABC956A037B6B0E6A763D28DF82294592A580F04FA8C0CA81628503E00BB524DE2C691B3E5E98865867BE323119E8BF3B748D680B77E0D5F4BAB66FA5B47434E70B939F3FB94E18DBF5152E3BF6AEC323B8A785A775CA8D83E70BB4E06FAFC7B130FC21BBF991EA13D0934900C0564CBF152D7CA50F70FA08193133FBAFF60F198CEA5A75620A97636C1E12104C48760448F37C05954EE3460AFAA73E0CC6A2D72F9A316D646A01A4BD997AA84F75C452750D25DF6C76ABAA70E5EDE0DC2E EntropyInput = CCD28EB5F41C2631344E6B65FC93523075AB03D8EAB268989FB1495DE2190B8A02FE9E118735595A139BD588731CC89A33FB55F4E82E39355F8D199B985605E7995621D62E3CC18ABCF4270CD9037506 EntropyInputReseed = 9374807794087E687FF7B47A3AC07AE9E49E4AECD223CB9FB4986CE5E900B44FF4DE5C6FE99B4F2055A7E9E4928D1BE66323024F25C177180F404FBBFC45C1F9 AdditionalInput1 = 6752AB7F862101E649B5E0DF226A1013B1A39865BDCA6F0005B533E9E21D05BF AdditionalInput2 = ADFCAADABCFB1AC374B6513E119C0356D89367839378BCE2F659D3CE17CB0A44 Out = 008B88259A0E85F05BF03B2DBB47B22B691FDA69B8BD96352CF942CE6FC6CA1F40A5A59179DC37E4E4CBCD663848E1369AA93A97EDCD858EA0E32DADE7D77CE029CFCBEA8FC462099178B2605FB1C61DF06FBC457913247C712D04844E9FA6C7AEA53356A487577DE258484CCB2B570B4081F9C74C4AF2ACF2B765D2485AB3ADC8F2BB04A6DF17A8833B57C4087C648FAF74BDB2090A41B6E42D6E9EB751ECDE07781D598FCC42E69DC69F20308331E5BAD12FB9FC2ED38E01933913EB04670F EntropyInput = A85379F1C9957631D034882CB9FF6CD7340B6EEE66E56D950B81AF854414BB4DACBE481A0AEFFCC6DBB65A86F08097D094AA5D6FB60E9B5BE0827A8AE29070DDD18F8AA450AAAA489D465663C0D0B4ED EntropyInputReseed = 1960056E6BC15F7D55F727F93BACA60CA68A1A7EFBB885ED3DEBC21B60C90E2AAFEA66AA2251CD1D5692530854C9FC5E78996859FF29641314E7E4CC99829F75 AdditionalInput1 = 14718D37BDC74CBD305DA367C1523E76878EA3E272A7C05283F89133D8B18C4E AdditionalInput2 = 2F3BD1C76C682007DB8319F6148B3136F2D32617460C538EED9365EAA7FA5C52 Out = 234E50505E3F23E522FA54234CF4D604D9499AC13F29958E13376A358109A3BAB3CC84A050FC5E34579C3847CD307E6D38A30D27821A12EE182DDD62EA7EAFC33EE2149A86284954C6E5C2AEA835341D79212B2B0B68CEA4EEE1B3A45C3A10781D6FA2F09B4FBFF1E016DFD9E6BB27167CF057E2ACFA3B62684EDD89ED74E9934611C3B992129EB0C554A392F273A22AD11EFBD22EF87BFC42092ABD711DECB346231930B8FA021F15E607A94E912FBC40BBD9F71FF7F13438A4A9EE852D4178 EntropyInput = 93E36459D8EDDEA5DF5402204199F7FE0142D3B1276C613EB84F0B582A0854C0234D69E851A4421CE3625E68A491BC5585DC9B36C47362FBE23ADF0744B7DC20CD9656B783726908D502D40ED4B90F6B EntropyInputReseed = 948033B1A53A4B9AD49F3F272BFC9ABCB8E77105B0E31867F60ADE5E91BEE51FA7FF0F75E2F5DA3E85A45F5F07F124CDC5D192467D352A7AD742F906BFACC8FB AdditionalInput1 = 0BCD123D961EA61F6241BA7C56068BF0328E252FBE9C677D236C4D2B90920A9C AdditionalInput2 = C3DA23C57EE5CA6EEB4430EDF77C5340434EAA0FAB9D0BD8374A28AF1752603C Out = E754021F02C98CCED81149C5E73C23CA6A453716A2ACDE0E561D76FE5C59682D9936004B40F477FA39B3DA9E5824B346323F9B54146998A0B87DF1A6E88DE27D938E54D0B2376C55E8F5E8DBCFF38D09CA6469EF3F23ADBAE2A6DAFAC3D19415C8112042D93035B47ECD0C3A8A950DD93768CA1772B6CAB2571858E5B77DDF583D9468B2A309A9C988796BDB1E9994CA4E3C4A85183B897F376F2D66D9DC437722CF00A473310DBD819B863F726A38D21F6087C58FA83F8E4C71278A82574C42 EntropyInput = C2922B5AEFFC9C6D6DA00DCDF2203F671C4A1917FD608832AE2957CE03E08A0A674CF1187BDD274BDBAE9ADB1D7EC1EE64C9EF61EB0848CFFECB4DAD1BAE453E54163BFD77F2683627CF1378BA088A2A EntropyInputReseed = A37CF7C36DC6ACCD7ABDEB41EFF58DDC26913126C5C52F80125C1E55EDF3D1098DD22C90AE5FDF1273C7218AFAA842DE139079F561349D19E7B97BD44A2FD139 AdditionalInput1 = 02249DC36641FE41838CAB92AAC6AB1776CDA976ED00F80DAD72B6CB4242DAB1 AdditionalInput2 = 3D13D0DA320EAA538BBFB52EBF32871807DD2B0B79068F4FE5954B05BE40F15D Out = 2B7DE182A3946971A6CA6C921AD204DA2580D9204B877410318379FA3F4D0D2C28C45704378C952E07BF61ADADA75E6976C0B35B6CE0DB36B36DFF98FB7140FC88A907F0B5A595D69164DE28A9E28426985D5F2E523A01CA6B45EA834D2E2BB28EFA778588F60E714C6BE5DEA24B2B96DE8196054ED74AB51FA845B83781E99FF870D45C948D8D514CD6D15D3911482A04461093B44FECE4A83B23302A98486BB4D8446227B9D5046EC73C821AB793ED742453A5EE994D6323882807DCE3A0C9 EntropyInput = 1BDB84E51C32E1624CAB5B79447EDD8E749ECC9889C789D21B92B8F49A24E231A030A97565C05B5D97E572D9E4DEC7F6D48C2E3096BB8701615F1B8766666E308BFCF52C55EB79B46E0F0B736AA4D5D7 EntropyInputReseed = C515B0E82EDACB1367CE2E511EA95CD09A9BDAEE5935F4365830738C7E91B5D41E100D4C2E7C6908DDBE3B5E39E52808D5F2EFA9B89D3A761703B10E8F10466C AdditionalInput1 = 41773D5E28F8887D4365F1EACF4F5B29B9982CDB0A07BDB54E1D478C08BE4A93 AdditionalInput2 = 4B8E3BBC11161F40E6C6B7F707B8084450E53F155FA925FE256BD82E57AD6423 Out = E223AE662BCBE91CCB0A54A5691307EF42A483892C656B4E0BA472B022DC415D22569668A03DDECF430BA5120C5273527B88678FCF9C5696494A329C2F235EE6A9B9665D619E0DA7D8CB5DAB6E7A5ED0E1ED7E1CD1678CF5DC0C6D50444DDC9E9E4DAA1F9D4B28C5C0531954A15B6FE4540B52A7D5C2E9CFA2CBFF7B8C725C12AAC3085E020243162CA4CC11CBF5A8D66A5B35A602DEB451F834F8D2350BC09CB164C0F86CEC9CBCC09530852CF72EDA789EE9AE19C95EA9EE8EA720B37DE4D5 EntropyInput = C33AB8358FA16A06EB04344B7AA06089B7F2F97B9419E0A0334AFC2A87CA0A91696B03C9494D996E5E7D53613799D2FC EntropyInputReseed = 6F84EAF1B366ED8C87E12FC4977EE89E6935608E22C9460E45848351B807C016 Out = 1A3B0E806FEB6637B13729A98A73D0E90F7FBCD8A71C6096B9A21BF2205C615C7AD2D389E8A5A20240EA69FC67C732BDC4864462C966C255077C98EC4F34B6CF2802A8E11C78E1639821EFCB5E7EDA6D9406396EF8D9D36675C09A9BD0E79AE55A5ED3D9A7319204BC42CD2BD116A6DCB90A21B95E6113E7B499A86A7BC990AA6F73AB8494A66CC84769C5B40A304240CEEAD2E1B5B299FF8D7657FDB5DC78EE442F92B2FC2E9FDEFF58A7B42704A2DEE64F938A8406E249CB29368C67533781 EntropyInput = 605C14A31962CF0C872DB9507FB98799374ECFCF82FB142844289C22D015C2144FB161652E349892A949EDADF4008346 EntropyInputReseed = 8C2043E2825291AE3AAE4483A74C208C7401115B8F65D07CDC45279519B8E08C Out = 3C700E3C037EF03B002A2FA2F2FFCD22FBE176E111DF5E72AC6017CE72010E3406BF2C000943625710039D45C2ED734BDA37530B0D61FB87D4C52481AEAF314BF151ABB4E9C6A8059770CB98523D9074D7E7524DB93207898F014C084E4E8D2DC661F4E5B5CA872B817E2ECF35B9C221B3CC5641ACA5E57C03001643CEC2BD7BEACA5B0A4BAD7FDA60B5C853E1CD78D3B7C92044BEBE688745A2CEBA7173ECEB8901103A94BCAD9F2B9B9DB6A9F4D8187B98FDC4987B9D959F9FA9562D7FD3A2 EntropyInput = 1528FE54C075C921979C63F3A360AB7F57072739597BC058DBA8D106E9323DE0A81EE7C2210CC43FCCD4FB7087F6AAEE EntropyInputReseed = 0CA31F1BB59EB8E6F21AD5E6D1D9E992D100E732463A12104D709C60B49CEBD2 Out = E3F3ECB70A760BBBE3A3297999756888FB879400FE4CBD4B7CF844F360E0598A78C23F599F4307C65D79FAD6C6118884F362ED80B0B84DE5479DCCA0B674FA77CE318596439813AB81E53A21E9D0299BB2CCF64DAD6CC3310FB90D9398697578C416CE1D3FF93E076257FFE47946205FA4374D3AD16A2138E7BAEA1DA0D13B5206856E4A29F019CA29C9BBD9CF6ABECDDCA6C0487E8D0BCB32D444B55830EA68A90DFF13808ED32DDB32D1E4E32969929574CA7145DB366736794F4194725B76 EntropyInput = 9D48016832E9DB4C74B235B91209407D8BA6A78E84ED7C24907BC8FC79FB13FD097363F076365479697BD942DE0B2B9C EntropyInputReseed = CB6C7ABFD944D1F479DFF5B17178251C5F5CFE034381E12844FE25090CF897F4 Out = 308F798F7D86A3988962F8EFD782F0BC4BC5758E719A080849120E97DB4C525FA81A7218E9CC3262AF0C2E0842931547496BE8CA56C9AF9B3CA92954EEAFC8C0520A7312265CA5E329AC005D21896808285400B3612C9BF53151177F7E450172391FB5929267ECD725688AD996FA1C626151303C2D64B37F62F055E0F22383D9C000E665E1E94CB21A57DB42E10EE3343762CC970586F481E7FC427B03292912B72456A7E678B33505ECFA80182E5A1FF30D57EC0512620ABC7EF0B11CE4157A EntropyInput = 4FC7AFEBBBF7F4BE0B82AB26B6CD6C75FD532FD6C8DD62B26D5DD7ED92ECAB973491DDFA6DBB47D5284C0700FCB8FB86 EntropyInputReseed = 3EC53F261E119E3B6E2C8DC417787216097B0ADD08F1FCBC9538707265F42B89 Out = 82F4FBA26CFEB3C444847ED71F7B46548E8C844D1EC67468DAE2D88BE883E8E00B94F297FF1DB8F1A05A8A607619CAD3030641909ABEE4BE29E540562D7EC7EEF043261E729C444D5F586EA5A5E9ABC0B1ADCC54FD148AE5F1F1C04649BBCEBE2542442039E40661A798A55FD43C9BA2D1D62BFD0BAB216CE105D6330DE9192159F66E5E282ABDC30262958422C707A805B72B306B61F463E30380D2BA7A93F44548F7372A54F833F491372904F30985D0968E989DEAC48388286654B847B0BA EntropyInput = 4B0B0E242F3E8F9ED9FD11D5CF132EF9F86E48F984B40D5691A9514425E900FCFD5030E74DF72B1EADBA12B0C5116DB0 EntropyInputReseed = D6DE93CB74B1C3821C6929337D56B16B03DEF6FE5D5AC945677176E698F67ECD Out = 064DFB9AC6368B3134F3F95A2284DC2E13C81DBBB574EF6892F0480D2FE1D00E22D3128EB00EBEC8DA4725357C838B87FA3305E18B679D2E4FB4A8E5A7BFFD4F44067F7E3E6B91D222508CBE188821AA0FDF81C4BA11EC886F0928B494CBB79210B03893B3CFD66371330887DD43C84F100178B23B4DB032D9CE8A39BE492AB70ADCEF6CE6F0FC8345B859556DD2CFEB2C65236920F6E7BD6FA343BD6AE6E89FB2C03322E8E82177CC2116920807E8ABCC69EFE230A3469B3A59EB2C1FD64A3C EntropyInput = 8C7E635FD9BBCC0C36B03FDBEC48F65FFA73A89AF9BE386194DEA3EAAFB864BB68F57620A466177A2EF0B54C6FBD9CD2 EntropyInputReseed = 0BA84007C4283A3AEB8BD178920D22BB2D12AF03ED8352B69E0A4441B449355E Out = F404A700FC8E804904CC3DD27CAC7FBF3DB78AA405481B9CFA77145B0FA02337E809AD1B0EA5994630EB349DE822F25C5E42DD1E8DD7E28000F9295715628F2E69444963C81CC06EE7CA0E9BE2685F3ABC60442A057065408B614628530A810DD8B81E7D3EED48E093511A7FAE8FD3943D0F7BC6BB0DAF666B4126843A61BAEF8595564932243689558A17DDCDA25FA9FA680E536ACEFFB1C847266F6D555603E01AC3776050B95DA939C6A6387B8D83195D721BA724A6C39E3A0A784EECD7FA EntropyInput = 783C870738DBD96D3E2E6825666B9AC1851269994FF1BCACAB099A0BE567F6EA5940980F7CA2F30FE98BBDCF3523D658 EntropyInputReseed = 9D9290392C10D2CE9A17A24416C903108CFCC88B28D69678BC54F37F3D9ACAC9 Out = 307E462511842E9FE6FFDB9891E5CC1CAE7DFE6094A636E1A6BEF83F43E04E83C6E8DC6F4B8AB7B684F8958FC11DBA6863C1D2C8ED89E1142381FE246D828771A2ACF4250FDD762E3509E0647B38E7007F14F42D728145220F6784D4D76D2C9C84BD26F7F2C41643C6962DD375AAFCDCF9D13A7EB01C855EE99901F217268C35C190E71FD1EC75CE4C0DC5AB428FD4A19306F03268BE66137FC4DB8BB34FBA5D3615F510089BE881AF426DE68DBD328BDA6BB0F1794B172122E6FF853BDD0673 EntropyInput = F58B054FD30D99FFA61EA9526421094E9E8C220176E7CCBE20B66B236B635B73736EAB0BF62EB65CE3F429BE9CDAD957 EntropyInputReseed = C0B6846649C9263CF3611F60DAEEC342D42817DECDD32CAD657BF526DAC170F9 Out = 33FDFF33E938831F63FFF072936AF723E3018600BAEA6A63BD84C02D06587A80C4481F9D620C6F171D2774566DE67E6D5C44B72119B9272CD47A60C52034AED50F538A902F016E56A319760C90FDC8301FB53221BE2EAA2655E3C1E2A1B3E851D1D335A2184F808A809E9272B664D19645FD52F63EDCD5ADC289392151526D2DE8A6769A287BFF60C53F27400658445386FF4C86B57386F3483275C1F9E8BDE87DA8F6B3FB1D9175F477DFAD712823A498BADE582E2FA88BFA54C24BA9372634 EntropyInput = 7377011C3A56DF2281F3DB56BA87745A5F0AF4AE7DFBC8795E665D89C82C0BA44013AD809E8A9FF093AAF98731073622 EntropyInputReseed = A9759A65B68DD573BF678F1CFBF826EE8E4002CA7494F4CB4D4C6D1B39DFA7D9 Out = F8B95143826C3CAE235BA5A08312A398EE963B3CBDD4BB8385F06EB350AAE9D981B84C5F72705F024C2A9A10BBB54FDEDF734170F7F57519DFC096054540E65A12CFA64D21A4117C8CA60668FD200F9BF4CF914558352F7C78296473EB5314AA5C3EF41138454B0595163A6EB016070C38BC34FC7871441A3E637C8D2177B3F3CC0E2B677FEC886A46914D3D8E7DFE182404AAB66B88B2C0F1645EE299EFDAB3368D8F6CE471BD17EEC5DCDBF7B0E00A0B5B1B024E9D9002ADDC284DF8E0FD71 EntropyInput = 2140A01687535A8723CBBEFD90938D6B20DEC281427E812DCB275FC6A2CE3217641D9AD98EC3BD352AC63268262BAB2D EntropyInputReseed = FDF41B2D55AA760ACEC8F10F608CA1DD337D91F4081D702BFBECFCBFB71A8830 Out = 9AA21ACF4974954022E3E381EEDABF4017C66A04AC5B80224BBECD0908739FE1E2B370D4AA9B9A7D5D6ACEAE36283DC4CD18391CC9AE7EC5E283EDDFEBF30CD380EDFB562E974DCD39DDE4CC99CCF6182AB1B14DA6D935DED03C8BC3413C0DC75F6751E246883747A48BCB4DDC4084399EDADC6CF7CD6B3E907D5F0F72D4DDC51B7E26CCA53AD54257F16D142D7C18E296C558986537F292B1CF4D58C37A6F5525D2DB83177C0BA8B453E826D2E5530A81F51EAC307CA8457A2878FA1D132093 EntropyInput = 85EE6E9AAEAC38C54FE6DDB662C6E6688E13D81B192953290F03D0158A560D1C9B20ED194A7C5A1CEC35FDEC02FE1C71 EntropyInputReseed = 664EA9E1CDE623C70377C60DBD5537093E3740C9CD8A6E21B4321F626F658D33 Out = 216BB8AACD59CD7D4406D9CF3E7D07A3D0A43A320F1C09800E455E3FB83DACBFB617BA105C3658871535C834335DFFE2CD1337C4A64B16645BADFCB9166E4A36978D16BE72A44D5F2AA035631CBF22AD4BD7852B32B6B0BFC9A3C1EF87468E2DADE59E7DE5EBB35524FC9F05BC79FC4218954DCC4502279ABDD45E24A3DD07CF61AFF68605BBCD0363F9559D6409FD5D7B490AD4556DF0B913824D8DEE92B1CCDDBD1EA3624E877C00A20618DC49BEAE5574738B209E7902764A8668DFBD085F EntropyInput = F585579464D39FAB1538CE514DA9B17443E7158E943FB34AECE3853406B8D940FCF66CCBE483E2BC02D1634919E39AD3 EntropyInputReseed = 40D09A2211E18115C49BB9001CAEFE72311C6321871B920D641B54AFB4CD9DAE Out = 2AD6F8AE76677CE1A264617F62B57B0BB1C58305A38B9EDD5A7666D480B16CD929C2BD83A7AAAC2FB13441E6865BCEA468FE0993C338028DDB52F478D2D5338C41219BD02636E5407F05F255DDA148FC7662F99E601E759181AC12A5D57DCFA15553F486DED28C1A9E6F9C473A198751C7C35A46F772A5C1F89AD6E1E53A6184039D108A41CF197BB1106AEE34A3983075E8E5561306DAFD4984F51CBF8833CC83421B0CEF0B85BF1236149380A4C461968963DC95F7297613C53D430B9BC0C2 EntropyInput = 9F7DAE4854A00657C038918EEA6F1D10D6D7AFACA6A7E00AB6356039C3A09DCB65BF1D8A311C50FBF92E68F6392FD3F4 EntropyInputReseed = 5D76A31B1F654DC460514F95F494F79113C6A5CB06D007340F627F4EB023E5CD Out = DBBEE262269510322CDABD6633A070A92925D13C1C82EA98C95C6449160625BBE0B74AE08D2EF1573E64AB0353E3A1353B26DBD9F0144BE993E6BCA82411E9DE8C74D75F0CC6A573EAE88CF26A36B42092D608220BB6891204C69DC558A57B14DE9D7671CDD75767C1C62833940B69C093B75F940B1514575CC1FE5AD3A622C1D116AF67501E4C4A9CD30412E9AADD6FDF7F58F6A631D883FB394A1A6BC6E87B8D19F47AB83C6F683A2EF4E1DED81AA9FF1FCD0017826D97C0CE0AD1B7FBABD2 EntropyInput = 0CB47A66B5873A2CDCD19B528DBEC03818386F3475C998347FE5F7DAB55672D105B64E67D2F32CAE08F7FEE213A33326 EntropyInputReseed = 8AB6F6F194E807B419AE5D253F2EE0527220B0CF86021D232C07230C98BEEA31 Out = 5AF3DB5149028DD53E8644F1D8FA2CF63D3A15933ED576AE30B197614A18EED9CCDB5F53B1B5669B87FA906B64D8CD54AFD691D863D4E5ABE0AA0A94959D5776E53BC6881F87C4E4965277A1021CE64E49AFA0D54935380F90DCD284B1AF2EBA13771358D38306146201EA764EA4F92540E6858D8BAFB18FDF60B69D0643F6FA3F875B31E3C06D645BF00683F9EB1BF9FBD113FC83CC0DDF2BEA42CAB2BEB51DBC23231E35B7E1698EC210A46F3A326FE61BA363FBEE780E6D585461AE6CDDB0 EntropyInput = 8E716219EA8116C507909E97D61A3B92121F19E2E3FB7929F7DAD0C67B18407A421855817FF615654272EEDECB43BDEF EntropyInputReseed = 1C01EFF6C0628065DD6BE922E32B47F90E04F4A55D5D31ED876B2E1E97BD282F58ACAD049C511087A6879AAAF884CF034E013938518399AB61AB0BE97EBD9722 AdditionalInput1 = 1B2239482315BA4FDA5429B1B4A69AF1489F9C5364A85D1D91232C9798026820 AdditionalInput2 = B3068274EE36E9B3592D4BBE1A9A5F2E6673D5B92127E0C2555B8D2F3AEAE4F0 Out = 8E5605608DE490C168614A4D72E4CD1229D04B5D054DB526EE06441173FE019BC6E862DE5336B669BA7BAAC800F0B24CA799F295CD9E58DA9CFF0C30D87A402201A7DA9448A7AF12661275FC8C46BACC418759431E429F3A74FCBFF339386FF84FD6EACFFBC813B35D8C5172D2633F209D5D4501AEA23B619CDF3056651B8DC93D27410884DB31ABF58477B99E95916ED5835D83C4B205DA0E103DAC4037F5F42EBF433B30BD68D378D5B56A8A3320D7107F65645354E22BE281417A0FC79646 EntropyInput = C940EF1139C00B7B0ADF588448526A2C315DE2724D66F15389C46428349A22711F1A0B171759D88F553640CC1DF339B8 EntropyInputReseed = CBA9ADFD127D27F5F5EFD8233AEB8F6A616CC625E218C4B7253D67DC31CAF609FE0CE51786042F350641BEE8D7DE2C3B154F9454EE5269378D3BB2B982318005 AdditionalInput1 = 9F66243ECEF254F6FE94224E213198EE8ABD70538CF807C5F66FE53F4546312A AdditionalInput2 = AA3C9D3DF63D0F8AC0D5F0CCB240007747D5DC5E2E2109033800EACD9792E1D0 Out = F7F0F4FC8CC5C3F97C2882F38F399736E5A8B427E5210963793FFE9A25384B9BF4F814CE37DFF78448D4009BB748EC5DBD60CDDE05F427E8462D683AEF6B554E2A4B545D281B0B8F8400A4EFF73BA1E154B359DEE4A40656CC9FB2B5E4EC1EE3730E0FF8CC322B8680555984D9E0539F3F4D584777C372A2A8F2F31871DA1EA2BEA9DE4F3458007E830941FB4128983F166A65B0171EC9B2B395214555191D63EA7CEDBDE27A92E3587A233E8D2B2E591F29DFE50AB0022F251BC60122260657 EntropyInput = E2A3F99DA80666FA79D1945214C35A0345E9494B197BD8124D673621018DB3135974CA1D83E29BAE7882B4FE257ACCFB EntropyInputReseed = 91B414245265B1E93BC020C324A7FC28A83C482924DE62FC653762198C8069AD254313DDF61BBD469575F94AB84004350C4C2DF6FC2C6858FF897113DD6F9FED AdditionalInput1 = 45F7212A950095D4130BED31B683847484C60FEABB5B9833A86BB0C99E89CCEB AdditionalInput2 = 91D14F6AB7F2EF0FA3F459F21AD50FB2DDCED5634F93897EB825E4D94CAFDA0F Out = 569AC89357AC80120AE2561604E4A69F5E0DB02AB85184B48498473A38A2CE7B88BEF0DD20AEA637F95C1CF767187CB8F9B9E89ED752418BD161D6DB2CFBDB0ED051C42E0AE9268D17CC23614CC50B530562B055D6896A1557117B855A751D46BC4F57C7E03AD309E0BA685AC87521E7B6ECC438BB2F5F348F0872A4E51A6B544E08924E95DD2905F80DF729CD8A300469602BF6E577FE7697EEEBDFAD44E6C0ADBC37C02E3D43C4E2167BACE7FDCF50380F63E57E5D2FB8E21C3C150E171BB8 EntropyInput = D6F61368EE6086CAB85AFCBBB59D68C6A0ECF440D54479DE785E8FCF784CC0F5113D922492D63E3CE5C88850C575B578 EntropyInputReseed = DDF843252DBBE6EC25A1465BA268C6E336D94BABF43DD5457BD6C699DB2846674479CE8619D400E065B59818887B8E006F5A1ED905BC5FC8D59DB4A55FC820FE AdditionalInput1 = 58F634F0AB161650FDAECCD3CDEA41F5CCFBB439839401A091EC460511FB05D9 AdditionalInput2 = A6B3A1F5E9E7E967080B9252C4C2EA43DFE462AA693BEA160E9EF2A8B1DD19A1 Out = 3A39F21ACEAC07279E5301FFA142D68013BEF1073287513FD6A25A1213232B2F7ECF61DF2C2874D5F50D448FEDBA4C3FD5820607BC5FA819F0C0CFC712F100085DDA85E759316F96B0A53AD43ED2BF8C2D25DAB2470E005DBB9A025D755902D8B19E5F2A655668D7D1D5F58A6137BDB4677D87CC7F95197009CFE964187B6604E7BCF7879A7023FD49547BB1B20986B26672A85415F5F1B5E6BCE61D29A2BB9BCF7F0DD3C76CF7D692257C63ACFEF18425A8CCEE476C880585B35D433110B494 EntropyInput = CC1174239CD74EAF12D4399004DF6EC5EB7FB4F35BD2797203EBAC3A5ED797ADD0C5A4B9BA64A8D8A7E6AA9869E53A27 EntropyInputReseed = 7D3CF5B2A313C4F0FA994CA2F59AA7C869BD2070EDFB3FBB4E34369A477226F05F23433C20003F2E90A6BA4DC571B811FB02B66725B6DD6EEEFCEBBDC636944B AdditionalInput1 = D97CB81764F037E01DA017C839B8953454A1FEFAADE4E97511DEAD52DFA48348 AdditionalInput2 = F5A224F90ED0717524B89FE9550D47EAAF406AF17D3487EF803D56E613DD3008 Out = 4FAE49EC0A842F9159F7F51E393B9316403D4A10BCF50CED305E1607CF3EB98F8333C4D0DC8B5F1BC6DB576052EFDF248975CC0E12EDC49D09E7B2F867641A2089F3054B1777BE19440F49B8141C41D67EC1DFB471B783C5DF7E75C27DE695973FA47DAD30FA14E1E9A5318A8B8AADCA7BE677F0F520E65554A32EE2FD6B386993FFEF27C8AA5FAD260874B6F662AC5805BC65A6004513CC692AA7EDBD4159541C564E9BC647AF5DBF93AD1884F5F880972F6B153F91E119C8B3070D55600E8A EntropyInput = 51DA1446BE3620FD89F32952138A70DA11CA63D7917083C70FFA3EB2C87AED930A5F170EB4D88096D987DF3D42803E48 EntropyInputReseed = 43DF036D178AA8AF20DE68C8CBDBA0EC04186B955AD4EA7289CFFAC94B72352167D18A160BCE2C3F10179E23957618177BFFF7AB3A5300A7169F1EF5747A0500 AdditionalInput1 = C1BC968E24AF18BE78C7D6001658FCF5348FD9F72946ED6988BBF9A7D0E5D4FA AdditionalInput2 = FB5F3227DA5D5CC4846085AE5C7EC6CE81DF2F5ED73D9424651BF0962C46590B Out = 39BABF6A76695B3727DAF79FDC369E26B85F84667107A4FD55904F2C8B501D21042285677889ACD8DD1A8389ED4FF36111228D82E9CE66730584AA1AB0CFE9FF8CDF7B2D51FA8469B91BC9EA0AD463E0EE641713517279A99C966C2FEA264068D01DDDD07AFB6A8C0131536F8480C1265F0DC2939BF49F8A945AA448F50D8CF9154AE882C0DBAC1D2EF1558E62B56B8F1CD90317FC4B294F14AF39D9F18266259E801F1425A4EC5C5D9D20D1ACFB7D11D91209B1ECF6CCDB7FAF6F8A1AA45020 EntropyInput = 34D4AC7F5AE763ED56BF5CF780AA0311E8EB4EFC5187CAC662454B804B33B5743E75CF7B0F1E5643A848016539FA6596 EntropyInputReseed = 68F9B530F2B854B94576BA1ED03CC12D22486BB8F68E8E72E9DF92033BBFF7772BEA57C5C94495694C15B01B8D52A8511164837BBE86E8213F0D46659347078C AdditionalInput1 = BAB40AA4742971C21193190BC523061CFD908A8AE31C01E3ACA6A40A44345813 AdditionalInput2 = C7D7D67820397702B2F51BFADE44CEA275200F6BE8F5FCB9007FDDA32CBB4FFA Out = B6D852BE17580719421E8CBBA4AD5550CC72623D6E9007EB6D603CF07B7A0D6D0DFAD79890579ECEE52647AE46E7396EBD76808A0B12E7857B9A5261B8CC1A787A589C574B14F997BE7A8A6A7670745F79B50BB70CB7569420A19C82F00F99109C95B41E28CADEF64C90BB5A7A9294F67BB199DAF46705A0850BC89DED7DB722408A762F57C6B03E10459D5B815E4A5B214F01574E4B1DD8CCB33776D1FDFF36C2C8DECAAD8541A1F19A3930C659E2C8B1A39CAA2DDDCAA3E9AC9F1D9B0B632A EntropyInput = 4D138DC271092218BBF7CF3A5298CC0FEE5540CB9AC257AD5F8F5CC958C0C5090A71D6686C44FFA60CB98079122D9105 EntropyInputReseed = F67A35FE60519E53CEC3E7E892C20699D6CE47B03D9C636782034360BBBF073BCD6E036DE18B11624972E37CE80A10DBA2B04C34C07C0C858ABE76CC23B29931 AdditionalInput1 = 791BC0D1AFFFD3F0E2D45205BB7BD997B6BD909800003D7C3345ED45E063D1AA AdditionalInput2 = 71489282BD26A8DBD008014A6010D0C798C8F9C173B0B04532E1419218D46A22 Out = 5187B2404A031B5077618845F18E3A1C325BD86DE05B02279424A01FE3C0CA03E45C45E0825E3784551F36D43E88F348A63A5D25ABA9EC9EA24C4DC983CD3749521569088BC4FF519B0F632873AC87C54060D4DA4741BC094C71B8214E800EAE145FB34DA9F2DA217DF0DFD032665EF82048657E5ECEBBC23DEDD868D55FFC817957A008E4E7B629EAC5B0ABCEA3F14356B8BEAE85EEAAD3E8B68B5CF164096DF6A2AB0D13C85F5F2771065FFE8634AD83D35BBDA97DFCF9D55D841D836CF2EE EntropyInput = 5647F4D920A564D1F915DD867A51369FF8DFCF075C29630B9C253613453C93EB8D396E9E1AC8746CAE57B560788F5FEE EntropyInputReseed = C2EB00D47D17FBFE04915D9C2C3782BF044FA7E244D7A2D5E829923F920BE8D5B460C5F1D6E7614949E7E8B23B80628B697497C58CDACD4580611A570CA6D581 AdditionalInput1 = B33C5050A4E32E79008BED48D36764D0D00E1B3EFDE60F7C041472A23C7E4303 AdditionalInput2 = 29C5D3F2D034C4DEAA340B9E202BF282A2B460BED41404F24E7FF922094EC7A5 Out = 4C0A10E4602EC0D58FF32DF51251801088B90FB0550186269FD7145EF49E56B5C43F427F07798E3098BB3D6D637F39FF0DA1D6E8EBF0769DB9B189807E0231223101D92E558510344942E2D46C8E70203234F92D3EECC18EA5DD043CDE87C848AB1D15AE6DCBC6FCB0C38EB33B4EA0E3DF12420D4F4BD9D896EDA18897437526488B13DCF02115E254191F5998E4146CF1A5ABCB2519AC69D93AF79ABF1281B23E3C464A9D716C77A34AF05E4AC71931CBD4A70E50CD09C6FF31A7C1D7C9E5F2 EntropyInput = CD5E34CD4FE02E8AD1E41809B50F145B2C64F6FFD4A30A11B3D5FC448A853E542A38103CF0C4F189705E08C6B75FF17E EntropyInputReseed = AEC09D5B594315DDD6D9B051187C0478889116027046E2F2C748CC8924E69D9E44F099EE77856CA477774B1C590FDA11995D947700D69CA1244F0B7C28031D95 AdditionalInput1 = 31F106EE11871824027DE34FEB461A32635A7F388BD4CC605D52DBF455B88ED8 AdditionalInput2 = 4D84C3F2C438AEF6912EAF0132A46B3E45685FD0014DE0DCE7E28E0A526C208D Out = 7ED7C35CA7EFE3C808BD88DD3F79387A8189D782E62A2E3D918D1DD9043D4708F3226C8B645A61F5F9B1EF8B5BB466A6C706A14075D1388A88B978CA6B7FBE4D72125A7BA57D9A6CD70A64660312D040F7BB7925D616832A412459C9F387CDD7321E7AA956300662B5B780F73D458E5F85B59BAD19727570149D1263C8CA4082A201AE94C33DAADD60D8EE5B53D9C5F46AB134A711DC4B752D1D6AD4A748623036C379C3E68FC7C749F86CE4186C3CDC3274F6FBE82A49923BA45D41327361A3 EntropyInput = 1FB61B336E7307188A05A439ACD8F3D20B756604CBD5AFD0D8DA6078794CF13D52C5C3F9AB6689B61558E32D60A41FF2 EntropyInputReseed = 960E3B822A087C5C1E0AE464AC18AADB75FD45A3CC68A2B74A2BD23CC728EF69B867859B5FA999A5D072E66DBAA4057F50EBB795F2798E9BE0DC282A765A854A AdditionalInput1 = 677A37FE902ADBDA4DD6474CDCFEC1E301DC4ED86DC7D6AA05B5F7BF556BB108 AdditionalInput2 = A7DD81BB8F350172025E403FCEDF35ECF5FB24DB686B27F90ACA03C44D52F767 Out = 6130A5AB7D0EE6976519715A3FE556C4AFFCEEA9D7A1756A3AA1F38CD295BCE4B775913600B43A22FBE7A4C36EAA2D6C62858B59978B0A5E24042E54467B313096C8A515FFDE3A740EE648295CA0D85203D33592B2D78DA08B0845C30825BFBB463AC316F5C1B2A0D48FE20F0360A5EEC63665A49A4A83759B0FDDED248AADD17B98BB0EA4DE962E4D9BCF07C3D80F821AAD7CB940889E2DC28AF2DA3907FAF6A8B9452937F66B1D8BFCC1C63A5F78D3AEF27B960A891C1249F508CAFD606243 EntropyInput = 47BB3924C6718E325308407B12744AB5838E636670200C09C02B6FB4C6B842A52F830E75C717857F89F381C6DB3205A1 EntropyInputReseed = 809E193FA6F8F6C78EFB4AA001C622281CC07A8379F2BB9D18B98B2560A9DDD84812418D21247F4346697F653B05F93B78F178C2F0679F729B45B34A32F34F1F AdditionalInput1 = 6CEA09F18F921F0F1AC3482613388A468B27558272D70161D0A87C86CB08146B AdditionalInput2 = 2BBB38D9ABB7D397BFCA75EB7DC8004D21CAACF9CA4461DE839751FC7B06A5F1 Out = 04135F31D0D64388B7C2202C0F19DB8A0F22377610A684DFC4B47C014D9476547FAE0E5D9F20C064F3B7CA135652ED5F8ACB71DEFF67312D7FCC0CE377F97838E5E0BD72F9D7162ED8EBB1928046CCC22122032AB790EA60D9351B01E951EA0EA0FEA7DABE34E4AE3DC8CBD12E7D8FCFAC322BB3562319D77EF97C7B283A7C0EDB644B9AE644609509843A84EB9B414144C22E352BED3D6D654B42CB30B27A2F91D4A5FF0A81CBE078DCF65A7B1511E7E0029356CE64EB9EFA8D54542B0660B7 EntropyInput = 21C85371939E220D04C7F6521BE229AE31078FC6241BFD767D27F5FA4674D8B7712B77D2A35B47B8F7E7306D6171ADA1 EntropyInputReseed = 47603C7E82376ECCE0A7B4E8173EA7A9E5567DE970F4438C0B3FB8D50846121AA63394E388176BA6DA060B7D38DDE5062CB5BEC7E70A9A9D815FE725D34F2616 AdditionalInput1 = F53EB3875AC8AE8E720900802F931DF252BEB6E59D5D4E0671A27A19D6E25CFF AdditionalInput2 = 19C70966726E171B65F6A471CE44312EB9D47CEA91F8875D0C73171A1D5F07B9 Out = 7AEA2E1C8149812954A526DF16A182D50421CBA60AA1FDB686F5A269E32F2174FC44ED5636259D3900B7CEE5951BFFDC8B77BD0ED1550C94148D720906E3330A078A739E954D2DA1781BBB4864D5C0E22418BAE1ABCED550A740500F2216856E385D562DB2CE66E124F26857339E27E0EFFC12A85D4D29B9CDC79C7C7FD62C77C5B8309C0CCCC13BBEC46752936AB721AE08F83790951DB04EE402188378570E78B4E64DE374764BE228E60C4DA0D4830A0F565AC36DC4CC1FA0514074E1D7FE EntropyInput = 20DA1922D85A790EFA838B110D00E277325A65CBC51ED32E38E4CC081C1AE8AE369AC66FF41653FCB094A23524BE822B EntropyInputReseed = 89C8BFA7C5C53813D7FD019A1BDCC77BB1661B8C8FE15F469B41E2A850BAD2301E963996350452D4F6FD386EA5CE9B3B095E64B1DBC1DC7DDF850FF63CB530F5 AdditionalInput1 = F0F7F1438E1420397B3CE1B5728F93FB16861BC6301F7062F2A4ABCE742A20BE AdditionalInput2 = 54BA8B63661E445887C242D969A99C20BE75601827530B697CBA8F81F3E46592 Out = 8FE55AE1A9FF14BD6CB3EDEAE6F0585C73E8A58B387FF6DBC026FDCB3147AFD63A4BEBB8F07BD8D72323581672D66EBB3991349D8F5A00200B4B7B84F3B632A88E6B4386A9DFAEDA4BE5900345EDDA2DA0A025222571CDE032308ABC879865FB23FC07A12BAFC72FBA22198F6409C412EDF4EB4613DA40701F20AD714F8C7F000974A852F76F9D89C899A501824BE72F354D57448BBF08E1C5900C839017FDD855655326EF3168D07FEC3F2FE2A03588A2F3890E310D1A871684041F7431DAB0 EntropyInput = 11CBD0EA3440CE0AF21BC7F522D7353E51B920E62186FA7958EF79BBC57E391B4D9CB4B64740EAE3DE9AEEE145FAB47B EntropyInputReseed = 70527B723ECC4CA6570BC369A690C22732FA5A30600618B11F52D4F4D8AA785ECAAD06F8B6E566F52D3924C6E49C58057FA50A4DDD1B9114CB91749F33467D29 AdditionalInput1 = 7E5327B7EA17EEEA3B49CA990B729B246C5B67EA78CB5343BD4BEAB3C1FA3FFA AdditionalInput2 = ACE200DE357B9BC573FA877398553FFD0D211849C716A21B79BAC5E8A363A468 Out = C18033A738017188B9965D3E5FCBB584D81640BC1575DE384462D20511872C44A5F4A924455FB10EA32AC8DE8F1761FAEA96E318B5FF962A2D25523B1662EF000A043AEA2CE6DE4E543F0DB126173B39B76D217DC6EA9B25C0B4C2CAC0FA423669D05E614D1E9D51C917EFADBE65BF57CFAF0497A4C2E6A091F52B60375F8EBF6AECE0AC54D668143B8B1E49FD8A4F97E9C0D8484555197096C0FAFB1A98EADE4A630A3CF4C48E436D33FEB3FC44FAF78CFA0E081CFC642B5F2352AB03C7E776 EntropyInput = 12AE99FEF2CFD193BBB984B869BCB7A64F795D29654E13DC7640800EB1D766C56A6A8FEF78F6DA0CB87717851F8DA78AACC23BFF66068372DC1B93C5776FE70710CA4A35BAD1C8D9137264FA5B8E402A EntropyInputReseed = 4C1F1988C37F2A1B997C4998B93C47A99CEB4D39FD0427C8965F8BEB4B0E76C1 Out = B3D8D31241B3809D82E5DA9FD50CF584FF590B3222C84B67D9BB0F0CD22550D800DCCFE22D5B329DC85CCC4654FDDC71D0402A8BEFDA3557C2BF71B628BA1603B17732CC35DB144F5284497D51F8DD000BB5E4B227371C1D7F1E20E417744C64630F1E408E290CBA15C9DDD074E440D8545C08EF61D9FDF8BC031247B6C942C89DE4471273D040DA9C347735E1D020880BCDBE3FC7F95ACBFACF896C7CEB4470C8AE9479B3F9F57C26A4EB18F5139DCA19000D8B7D4C9342F7B4394FFCB4053B EntropyInput = 3E1C0ED92D018693B9709699C32E2701DA9E5721A51810FB286F330C84DD9095C729619EA0116917346801E034123FB67DF11B36E30191E28D86F39A4B3BB6827D91364C167AAF0B74665FE1D8A93F36 EntropyInputReseed = C8E3D41794234A0A6EDE9809A3A35E1C703AF608222E6E54921CE4E53CAA2E0A Out = 81114D837A82A24321969117BD011ECCDB634D0603AD563F8A051FF0312B265F32FC2CAE8074D5000ADC22FDE14BD5EE5D19A28568BC847158833D76A89189BA36FE2C0091509B2460BC5D9C1762CCA189FD9C5A717F40E722A82A6491CC507D297030AD2771E5A83C83E3DABF19CC9D38C1A3980D2F835E9E553E6B43A26415F33BBB39A68EE1F8D0D85593CD1DBE966FE4FDE8DCE8B768692E45E154A145DB81C9A89379A899C667A44C33BCA1EE634670401B4532F26C63AA63E1CBFAC926 EntropyInput = 17B4687975B4DD4682EA98EB00E35A58C0741AC0AE1D1478F9B896E8A2A1137D86D01577E741F30518BB3D0DC9A99C57CFA9F0BB0DA6CFB33DD25E709BC0613B64B5D3E284D11069BB831D43E6F3F248 EntropyInputReseed = 1CA0757F21747213A455A149251F1D448A378A6749F56790A7DB65CE847ABB09 Out = C49D530B0F3E44FF16C5F43B993266F489225C4B03C7A51B4F8BB2BF44FFF8AFCCED999E5C9C09623E59C29CCFD05DCB9C8062D886A8C8D00349F43C3C498F67027BC106C16DC82BBD5BBB4CF9D880CA0E067CE85B49DCC55B43054E8219A7BD9D1E871AF20CAC8623AF5AD317C962D98AB55F6EF1616F20AC76F2B4107E7DED29D2278DAAB73B3E2734754318D6383FC0DFDC7A0FC9381EBF24806BED659DC2D643D2CBEEFD23A8C51EFE1DA0A434FB9487D9353EBE2C1AC91BA993C37A812D EntropyInput = 1197DAB1D2F0B5194838D67C756A2477ACF8E45A7D0D38E6E472A539FAD430617BE58FC7FC9288D5A5024154AB657E443CE513BB67A365BA3C127D7D9CAF41FA60F348F7B040775560F3B32395FB5F11 EntropyInputReseed = 5EDF42C4F35A017DE8560A7FAB4144FF7D0929118C90828A316D99247D34A6D4 Out = 2B200CF2888D68C513DD372235956BD245D3130E037F03DF4BE6FDD69B72C0A27D22D81479C204BCC47C36D74B5C2ECFBAEE1DBD8B442576576D4FFEDAF919D7BB561C8094D6EA855C583EF55FE9ECC610314C050273ACD0D6EE56C5337136ED57F8BE1F3A897B4A595A7F8C0DE9B5D34108367A74BC3336A276955CB32E2983DEF6B9E1DC4670658BAA4D7609F90F78A79AFD3D63DD735D382A6E0A382D02BE6D099BD4F8280D183EA34CBE1762F841BFA36CED3B1CD35B3AC9EAB38C59FD55 EntropyInput = 8A783B9AE5ADB3E1D049DB4200FDB78712E512727E73F1B2A6749132BEA2F320BB65867820601A1E0F47F921E727F8F2E45BE063A9D4A582DB7334594E73EAB545388DCEB1221E9E4AFC1D0A766C8E18 EntropyInputReseed = 46DF7F2F4A78CDA588758D692864779C5F8ECADB8F356E31F48DDBF5478FBE4E Out = 8057DDD85CFA68D2F676B58E0EBD6F47F2B782599AC554A868AFEF5EF9FACFAAAD233ED63771B4A8CC26610085B617FC8E3810197B1F072AF39A7B6BD495091FF27196A30304CA2DF769DAFD2DAD295568AEA98B144E97BEC1B972E023DEC779E19D9C9D0E59E5E291FC6AE2269BC49D9CAEFBC267859E713304A2B6DCB6450F758323DB30B6FA0176873168360B51C425832A6B50848B343842FC64DA603A26787E34745B3FE11144335E9A83D3FBF16844E8FDC71ED9955872E36088E2C757 EntropyInput = BAC8043DB8017AB9E29497198D2AEF8DD9B48D594216271ACDB78C2520E0B4A2109BE67410132DCE355A17AAFDEC8657AFCC6E2BDB560B4264463E9EBBCDFBC9E05EF0D5ADA30CB86689DCBDA4D29D01 EntropyInputReseed = BE932C4BEB1D48BA3B92C4646F959CDB846FB7D06E8B92116F7626ACB9F3AFBD Out = CB2D07A7A7F17E5796CC00C3CC269289CA0617115307F27AE5D5687C050C67AE232B40B0E515115F236A2D1FB5B42A48D08E3EE5CB351BB40C91055AB8C81CFDA8D6DCF1672231754C6E8FEC37C6A4D201B524D890223D13DCD36D4B039A30D6B5376517EAF32471964887B6CC36B6C75CB0794240DB7464592BE688EAC2FB64A7BA36D9A318009E02D9968CAEC61FAAAEA6AABC6CEF7B5A9FBDC12A806D353FF821EFB24C97799601257D20C53033C0193E6DC8FC13FC638FD3BC6C51EC17EA EntropyInput = E6FE191BAECC26D1AE13BB0946F2CB2F6A98E91A069804FB3D9C6B6959849EC1A4A38D486BBBA707319C339E3E2B7EE0EB1AA6239A39A5EFD1249715834CF1BCCF9BB170214DC4ABD2D5ECE1C1C34227 EntropyInputReseed = DDB1BC0E396A7A7BADE7A01965C0E252B9DDBE2E8664857B3A6FCDF665205E9F Out = E60AD0D64A8F0D1D9707B0F9C354CBF6E2BC7F38D9F4B95C9D0649B00A273FDBB1ACDDE56D6AFF30D9CD1CCA38DD5CDB1F5B5ED4B42807B1DAA4BFBE9377FC659CBDF26CDA2B3B730BD643A05F1B5FC3A5B468D259D74D3A72BED102F28A962DAFBD42A64A86249D04CDE4E91E080A1B143B6E42585773856C1EAE30601A768A8DED03A6801630BACD5CB44DDDEBE7BD4B0BA3CFB09C37572FF9C5946D746CC82CED212CD0B954C3539D60F893767ED07FDFBB946D768B374C8A67D2BBA537E3 EntropyInput = 6864E3357BE93E2D67E9EF978F12631C25E2490E2CC66052F85CD5A86B07BF9D3A9967235225C2704B910C4615EDA5D3A911F2BE3198670C7E6A395F8CF17600F389EE9BDEF1F2677EA808B391368E29 EntropyInputReseed = 5B7D62A8387EC6C0E46688682FCB7E75043299D20284B7546A429599B847A7D2 Out = 0D796346931A20B45C517FDE1B097C42ACD7848585D811D4BC39DB3224D066F5F8EE732495764FA30E557EEE81DBED190399D35BD0DE96B6E9ED47F9C24E0515C2B80518F29F88F6B9ED37B9F0A70003EF1663F0D2B330274B0E66F3BDC1620837BB718B6247309AE8355748209F8D44D158EDA17F34179CF66A8A1FB2D3EBAAAC41A9EC788CFCC76D53EB2EDE037C04BB3B5A2F90078E49A6DBE96E916DB908F525BEFBAC22CEB26F2A47B710B84711CF0FA4107BFED8ECC2849BC073F1E867 EntropyInput = 261E565B21D0C6BAB57AC87510F4CC62AF8E0D4926795D8FFE9A32EBAA03D87E8CD31E78F5AFAF3557E470F8962518C7AF05E0B9C8B1F6AA3542DA53F32AEB66526CFC7D8F08C098D2B0E620F9F0D898 EntropyInputReseed = C9BAE97B50D95CF9FF79AE976EE812650BA1D7009012596F400DD42D2080F3B0 Out = EA2B1BA22CD3D7628A2A884E501212CB88241DA2AECF2F73365451A550E9AB7132246199017EBEEE3B2FF993400500442CFD7DBD3AD99F1EBC952F51AD0577AB494D4D1B7D4ECDCDB61331CAC064F12A6C0DF4CCA2C1137EDB9D4151FA6555545053407BA84F02B947CD8D9B0A57DF32C55CF0FECE1254FE88E45D06F845F30A665FE4C6F9B158CEC31EBFB8F5ECF14E094DAAD89CA5BF5D35CABF237B0FEAFD275F5911491DA1D7C30BEA46CDE672F3E6948B4A14E1152D8A7CDEC9EE3F90DC EntropyInput = 12EC506A4CB92C15A7C3BEF1B7206CB8C4D9D1077AA9075AD64EA08534B7CD52F6E59BA6CEE388F5DA7DAD606C84DF0999F754A426BE869E6F53BF602E2BBCA04B83FE89355ECDD4E6A8E46D82340067 EntropyInputReseed = CA5997482F404157C390BC5758B0A110579B9233EC236B42C6F655CD04B0B2F4 Out = BBD63D6AC1C7021BCD53BC7A4EC94FCCA11315135225FAFA9EB28E1B5B35E9951357F980D12FF15EC7D5724566BC1B23D59CBD7F6FE6E7D7E9376B56A1012EB6CFA077ECEDC01E978143996AE51F55DA4A589E2AB7DE79B59ABD8BABFAA03E1207760BC154C6B48A2C669EF334DAB20B47D7BD8457EF3FF9256A11D245388102159D80BE21494C4A2DFD7820F9FD62D2492C1AFFD2F5F939221388AE936805EB070C250B7F4E78DC6729C757327F3FD2B7F75159941BD4FFE64FCC7B195FFEB4 EntropyInput = E600174F49F2A2D39569B23E507BDB34A0C841A1E6B2A68A304AF02B7194DFBFB8708C6266E0665E5BB28795071DAB3ADBF4DFB226612E343EA20B66378935FBFC726FD08764070D4F7288CC42C20672 EntropyInputReseed = F47A00A287B61992D38F77BCA92B9ABE7E3A11599E100FAE573243A5F0B15EA8 Out = 1506206A7E7A5A7BB9185280ABC102F47FA5A4B9A4CB897A76E327D3FFA07C852279D9DA79DC623D201DC4E270DBCE3396BC9C94AEB6A02D6E280C03056610A2F67CBEE5F25DC7FABB77796C3923AFF1A35AF12C6155331A4BAB27C8C8779A203758ED6C5471F174CAA332E6E2F530373D3C210973A3FBC74EB06E926D0F26957EBFF68E38823D8FD6FA81CA8D27D836F140E57907CA5D7EE3E8FF3F4C3EB435751D0119443D165C9A9B2B497E20586FE188073BAC6DD4C18BDCEB8B24EEE754 EntropyInput = 10BA7017C84DC62544A932155501C10396419E4BA104871C81FB442B0A719C7BD283CF806D7E6263A3E6F975711B9BD7AD512CCEC77B6729B0E20551DBB4E01912271D22625A8E63B2DFCBD1884F0998 EntropyInputReseed = D9C5BFCA1DB6ED0E62CDBFB209895092DBD350B3BBE8EAD1AAF0EABAE44A85F8 Out = 2C1C62F7A0666D96C086DF3BB70F40243F926A2D6F47E24D3886DB8AABE351F3C7626B708F2F89F84F67CF34B553D656367AAAF8FCD74448F7524CCC663C326238F5EBC3DD6DB1474A0DED6D6311FFD5860453AE1AC73FD76ECAF219686DFE58D908C74B0A2BC7AD187BBE6DDECB72D3C54B68E5EB5DBC9582739847FC07CF6E1E1FD6DAF5B71B1412C125322096C4DC2842B89D1F43ABA9B485594CD260E1D267D74AF96798A6249BE623D5ECF2F9C6D816D7CCC596C2AB1313A020E3AEEC3D EntropyInput = E13FD026AACD9C37D771C6BE869B2FB98D5B32ED63B1FE93FA59CEA3255DC74D73D591CD860854B6A06727F1EC041169429775755087D933EDD967D4FF03926E9B761616E7FF99A3DD97EF1F610651D9 EntropyInputReseed = 92E474D5E2BEB240677B4EAAC78446F3F48CB21CEDA8120D13FD5DDD6A4D8A34 Out = D06D8E99830407BCC57CA3432E75ACBF3DBBCCEB54102CB619BEE3F9B085E8DAEAFA657E12E17709C9518B147F6572C3869D7E336054EA3560518DB9055B7E37E45DA62032D5B4A535E5E3B8DBA3DB4C10B58B227267193D775C34DF22159C3446BA15F768E03A64B64D4C39A3CFD48F3D916B4ADCEAB1AC6968546DC85C3D6543808D97E67A16D99EC23BF5DB0709376473792C7794D1EECFEB0BB092024562833A2AC65B815B167EA93D89CF24213CE25883B9D06F0C01B9B4EB89DDC8EFC6 EntropyInput = 37E7F0FD4109D7AC355FA6A3B8DF6372D706D637EAAE8C1CEA569A17F2FC44504BD179EE4A711678C1A0C244C003B1F7022DF5A086614796DA69BDD8B06895816E049189D1F08F4E620C036E9371BF3B EntropyInputReseed = 96D979CD9A32EE85BD97199CA35DF590C36444C8B1AD900AB4E0442D5B288CF5 Out = 68109368D80BD0A7379D525D7C6FE9E7EFC02F4F9DCB62774E4866CD0E8279512FC97DFBD6FB602526688B32F837596531CD675086DAEF8686A6D064214CA2BE7F1D54BD97BB54EF1578CECF3887DFABE246FC737A9E8592E30DE8B69E613EF7724806FAE960FAA39B29CAD75DD005D6D09DFD241C43E88E54DEBB43CBF498580927CF6A3CF652C45AC94F81743AD86A8E5C3AE1CD6835AB4261968BE78D4EB55F9C760FCF04413EE414246DEFABA6B1911D06DCEA9ACF7E87AA0B0C52BDCDFF EntropyInput = 7B9CC17409A64DE98171684205DF0177A8B75BC81103004288EBCF1B8CD646B2B0D9D1582FEDD2F9365E95B6C4CA984576B2F8A30B94F0C462196E3F0AD8820303A35D0304E46268A7AFA5ABA7C1E6EC EntropyInputReseed = 97F5006FF023F3FBB48452DCB8E3F4EFD8580303730407411F3A53D44D4B13CB Out = 8C457791B5E79A32C1A5BDB023A51FE82DE8217D12CC45A91AC15C11BC81BBD7F545A587422191C361F10E44FAFDF576D33A580F34682B9BA132CF5154F0FA3BB221CEE52B3C7227823858B487867D326D1D139C0DBD88BE8720346AA6AD9DDD8D7C55844B4FCB75C7B79F1091320B8DF9CEFD837A45CE9071013E74D67615FAC3E64189152296F0BB695A2C0DE27DF23A1CB2728F35259404A656E7B238812045301520584AD9E3A39D19F16A0ED6C64B5544E9AA4750A2F44445C4AC9E9A3C EntropyInput = F2A2EB28C20D4A3602A537F22BF96564C2348233264BA1C46F4C470CD288FE6D7B56D889BA43E11B7B93084249A5CA48669229823DC900C0E01D5667E98B976B6B84169F822029A4ED49A49E00F0AA28 EntropyInputReseed = EC5C63BA8E41027AFD786A20366D4994908A173D3528A60BC36484BACBDD67F418DD4B95E8BB1C091553E0FA89A878C0C25614E0379A3C4C1DC400F2C9E9942E AdditionalInput1 = 1EA97BF0D6FBE42A30BD9D71E5E44618D6C8252133C65030E43627D4A36D43A6 AdditionalInput2 = C2D260F2500CE256B127A045A6247DE121FD7425024856ECE553ED860BBB08E3 Out = 67BDCCC7DBC29C11906ADD1276CE8FBEEDE3C162605B406A63AEE6746AC4A0DBBFA4109F9F51E79B6BBF1554E4A7020B664399E2A97772472BDC1F64F92B4DF21623E4D5AE4A1841442E01B78E84F238993E8633EA1EC00AD0DC7E04FF881E78700FF19756AAF0C9367DF8167626721D1E5D00FE59501E852947D0B2F5AF53982A1124518D094E02566221C08057B3C017FCB86DE4F839F644C89E161414F789C69062C288103E4BA0E3FDC026F07A2BFD93349FBF1AF8853A091B0DB1BF946B EntropyInput = 524E0B3987A13865F9E7148A487167B803D1E9782345F7DA274BAB9037DC059176518D0C3E117E3E7BB8F07BA444F1DF7AFB4B1156E88958DBC98FA1C8737DE66F94AA50158095BB421446893A27C7C3 EntropyInputReseed = 3775BDAF78742A49459C5734D9A020E74DFA4B80F3C93AE9D8946D2DA9AA8CC0D463511CC9970A66FCD1C2BC753B0B297C73D57A790928824378A30E91B5EAAA AdditionalInput1 = 10D2B9071E467A97E945DD8647F0777810C34F0BFDA2036089FE54D07A5612D9 AdditionalInput2 = 0712EB60976A1CCE60976731A958160761E088334DAD29C9FCB9DE862BA13C1C Out = D4E24DDDE04F9C4D005E54AEC06AE459999C85397C21D21EF71E2F2371EADBD675DA95E88826E0486A93F7A499483AED6F2D826763D397BE3A4ECB907BE9170534F717A20B38EB9FF4A5AC795F144A3F2DF606A3468A2D1872595CCFF37ECD38E81236D4BBB74396FAF62BB9EFD0D943D84643FFA5D39E305C5A559FB7ED61CD93292D616F88C858F2E6202147FF06F903A12BDA491DC7968D6B93FEA0D2A79C2511AD8CFBAC4DA63760F9B388E98349248AEB31EB0D976F5450864BC1BDA4C2 EntropyInput = 8FAFE8890A8009F46461F8A9BCD3B9DE0A8D9C432B04CF5523AD1B4D18817F7FAF4C10C6AECA60F1B75FC6CC37FFFA98CE96285AF32FE199AA849FBA0029FB293E13D226FA2765A09A5A99500D7E25E1 EntropyInputReseed = D53FF2EC5AEC57BFCFE2A061430DBEBD4908752F41E07C0DB817A76598B16E254F8E8EF0E938A42840FB549A4E59426ABF72EFB8CB55FF864144C4960578F2C8 AdditionalInput1 = ADAA7C5DE633125120A9913A216D9E1FB150C4943B74BB80FF847199C953F6EB AdditionalInput2 = B880FB05B66C1A2FC3D517077AEB8D3D489377B599DE539CC9BA589DE00A72BE Out = 0D949006B45243D470C3293647C52ECD392CAA53458B535CC7302CD50ED98E91D5E7D949781AAA5AB361E067D18CAAD35D58E1FA2C27814623D1996B46675AF9C1FD841BFC0C4DE6F7A06E8C1E8B963931370AF367858E9610A38F2D294A000143667D6861B92CA350CF142E69AC9A1B21A2AC7BD7394CB6CB29F350A3F3D579C319DCA8E97F07B358EF5E8D7BC74F55270656224E9565BDE1196DBDE36D7A4AED33CA97B1C08580075D0DBCE6A722CED2FC79CC112CD4353A4F8487CC6D64C6 EntropyInput = 30CF48964968C4EF2C52D1959C9E6283AEBC465AA22BF1CDEF99993BC6FD469E2B42AD6705D038ABFD7BB9CC9AD99C07A7EA3DF5198E48404CE3BFC4E9B45C301625552F577B6C191F6D6D54A2830F59 EntropyInputReseed = 10E3FC0D2FF11927989F781ED4D0A920515E3C88ADB85AF411E6A9892C68108EEDD2A6AE87DEC0A512569BC3C70B50B2AF5A9747E0476685C1D2176C7FAA4135 AdditionalInput1 = 19954633FC58C4B426F4BFB047F0842A54451A7BF82B8D82DC119A16421CAE23 AdditionalInput2 = 5068B6790142F031AF62DBEC417B07E15DE14BFD9B544E07BF8A9C0DE79D160E Out = 49459AD6A2AD11D838B2119DD742564FF149D6B4ED00F425D3211636023981D4A3C661B2349507C77AA184B533E16A8BEB863DC0263E15C1E3837750306AD75F90EF8E1F58702FD9777CB0134140627389A367C4B981F0710C909C1C98373CBF445A78D69FFEB5A6093E7B6EB4C0B340D7A06616BE1A09FC91706B94D572A82733EE2F478E90F5A6909C89418980E4D58EDB6FFAACF3996812B8AD9E9F90C33819EC0EF1310952B169240375BA02FF14FF36C9A9594AACB05A40CA0162C19474 EntropyInput = 904B2A32AFA780EEAAF93772CDBEC8881240592FD9BF2AA17CA75BF1AF9A1B4D074D7545DC33B608D8C17461EFF38D9436BA3BB758C1743D63D85785FA683842DFFD9D5B0CD20CBC428A4A742DE83FD2 EntropyInputReseed = FB83E8792E7E9F329554F4C2EB5215311E820FE6D5B0D2C8BAEA609E0076FB3086631A461AFAF9BE0BA899E48B864A3A6CC42039EC8AAE7D4D0AEC79C98303CC AdditionalInput1 = 731FB925EC6CFCD9FF8062C73391FE389149E655C6D32B5BD1BBCF43C7CC1AA0 AdditionalInput2 = E2CB59F86E5EB25D782E7AFD13EA164B05C5EF2F62EB46FF6CC6455052E14F82 Out = A8458A6E8D6409B3AA95C9D504D76DB3301F50EED28FD27020FBB2260D6DC17DF32023DB59BD6650366FC16D33855A3B66BA682C177A6E13F240E784C131EBC605DFCFE517AB07A740AD4B5266CDDBB46672DBCD9733A24BCA24C1528B4D9971AC18D23C59DF33B78342C10A35D904F0ACED97FCC7D3C5EE5C6E6CCE6DE9876AC9DE09CD44EB664B4AD813A33F26AE7E23B494D32F5E9F227BAC7CA9F3DD72534D19570385F9D6BE91B5A3F2BE7C4BA5EDE5C63616329F55ADC4AD93CE53E05E EntropyInput = 17C8DAE44ADE95803CAC47130D9DEF668594ABBF448E81814B1A7F619D18A25D7FEA0426850962F9FB35F3E678BD74BD610655C5BC744267958F8E71DF00554A468A9E6243D1DE1E98C49703670850D6 EntropyInputReseed = CEC0ECC480954C6C00FF8F01833A217B49FFD08886971E4837E5CA7520D178AB14D3EA574762C2FC46619FD0D2DC1E706030A0C3CDE67D894CF47DB54F12CE78 AdditionalInput1 = 216C20DB2B052F7C5140E377EE104FB28D318D86E15E11B7F2C228B1E73419FE AdditionalInput2 = 06344A2457B24B5497B8F96AB4FE3D965D747BF1C9F62D83486A9E39050FA868 Out = 5FBDD7CF32439844B53B7E3639F8CE04DBCCA6D73A24C162003611B2DFECB42E48F9906CD193C38F13D098C2FDE912546313AC8BB55A7CA9092C80F3E35D39344667A077F9E57DD6692F08E3B72862149B6ECFC5FDED9DDB4E48FE81D2CF5FF549A763A0FC52FC89F35EFFCF0386C130041D1A390D976C940055CB8F05845397A82079795E7B4375C4CDD8575086D038D82029A344B9B05123A4C3B2A94C9F63298721A061A9818AB26BF2D1506923EF07530C03B4439B531D10FF467C75F4A4 EntropyInput = 88AA8530949763ED1811B51DA951FDC99E73DE9ADB5F59AADBCB37FF19A95E625FDA2DCBB422B93239D1F2888CBE687B99EC25DCCD34936273F23180767D289AFB0812FEDCA02D6689B263F3D10428B2 EntropyInputReseed = EC433BE36C420751746CA60A7089935C1157D0E5783225058AC744BC32FF66434F7A8D169CC0DC883B9A34B9ED76544D3A50BEFCFD295FB4D3683F332EBB9E97 AdditionalInput1 = 277FAC5AC7E308C65419FEFE704491BCA4853499BDAAD08A383308B9A8A4A6CC AdditionalInput2 = D9EAEA08587AEC254B3508D3B9F4C0C5B3975F3CB6C0D931ECE904CA6108F4BD Out = 2B3CEE08641F6945C67C1061ACEAFA3D4D68DE963D564CE64DFBB4D5356240F2BE8DDCBBB960B9F2A17C7019BC7AC8BDC42915A4D090D76BE88FEB25FC6C62D15E79F65B9F78F1D01DCFD09AD1CAAB462FDED2E5A13954BD8F61389148F45C1382D43B9DC0E4D2D0E764534AA03971F8DBCCA65F763B6026E65338195D89E2B3FD2A59E0E788A810AF7AA9CE9AB41AEEDCA2D546C232D7A5F64E817F425C3FFD0E86962452B5FD257D8318C57F86B146F4B2EF61F95CFA5E576DF551D19B753B EntropyInput = 0464DC56208F92E46ED3111A3E98158B865323D940A529FE255086087A846C1EEC62F2942747C10086037E470F9B8AC25AA6A4142314E44692552DBAE38D4161FB6D0C05111DE3629A74969A57DA5E30 EntropyInputReseed = 91B1FF304CC43DA69DD52838D9A5CB25C94E65421C22D1630FAA76B309DAF3145714BA37F54149599023405DF5BF905DB4CBEAF5C92A9617887C4AEBE21DBE34 AdditionalInput1 = F328D28098672DDADB0B228071E14B2A385052CDDC526B5EFEA9ED14E6F74E35 AdditionalInput2 = 51D162A7B07F0C2C6D47B90157B42809176AB6C65D7740DFAAAC5CFE80197997 Out = 6DC0A86BFDB86CD5970F3362610A05E47E5F533A3C6F7467E687578550A51C9F9D9122A4DBA8E655C178CC65EB2887DBB7DF10BEBB4AE40CB5F5ED91ED40D3AB0E0913045E4E48256327B0E831A185405A82EB64080C9114FCC7CADE85C54B72B2E69C51A332C2DA72E570597D2F88B972581441A775549A6B68928B5E2B55B444311633508843198205EFC6EE1D21FC94E7CFE3C0AF7E990790A60DDB64C46014A613E6BCD3581827F8B34E3734EA8E9749E754799BCC5434741BA3066A1604 EntropyInput = EFFCEE1AA32640976A20181EBEA4278ACD43C35B9D6752EA0682C51257B88A501371B01A96A59EF4F3685B681B63D6F134FCDC78E2CE57299A434CAC6B363056197BA68A654DBE3BD711080B5BD6CA04 EntropyInputReseed = 2D0CDC9B15BFCE0DC64A8D6FCD78DC4EAB0E63E85765A17543114BAEFB63A0122C66BBE53394842F890A969DA5814A8D96268B871189C038586636C1D84855DC AdditionalInput1 = DB1C11E38F0F87046432C3CEAD438CB99A4E7391012E0386DA3D46F2797BDBD4 AdditionalInput2 = F76264F42D8D3A7AAF7E9BDA6DC76BC68BF3CF482AF024023FEA9DF43F08FD54 Out = 6CB9AB4B19105392793FF64E06FDAA712504052CE3D341CA2A5FCEA2EF2144A9916EABAB1CA93314F987FD85CBC5208B0F990A08BA91DB97A279634B7E6D27E38C2F8B1AC2BE45BF8D3D2B75C5920EA23400E98E92E07C404884359A2A0E57C446BD37DB5887869B5314AEF3C617F6C889225E0B2BBD3E836B2AECB636673AAB5C7D7F5C628196AE30F8EEEE77E031815A48019B4489344EDDE02E858594612C671BD59A5CD15A6B8F377516B415912D0ABCE40B231452329EBBB8CE3D83696F EntropyInput = FF152813593FC9689488A0CAAECBD7CD2E3D522974BA2D01E0B7CD2A629DEA8CAECD262D975C457F0F0B47177865B045C654F0035DC9368ACC3682B1E67E6B4E7829A8F4CF6D8847DF5321886A55BDA2 EntropyInputReseed = BA0EAA8E3A41CE27DC9F0D78F0D9FA43A619B4AAD68B6D68574C7DBBFB3344FB27B3282EF1F4FD94A187FDA07348ABA092AC547320CB9A764EA88C84E41E5836 AdditionalInput1 = F69797766E8DA3CEBF2A091E7640DC19BB740504AAA457C7632A7D61BA68FD82 AdditionalInput2 = D900EB2B700D720861E5EEE88D57B9BCF6670976AFE026F183679B97FCB28D03 Out = 3CC0BF1580212378888AC6B90BFFAD75B561D268087F0DE2A0CD5F79689C7D350DED6E83D3A0F75ACF63A924112DDC751AB2BFB8F429CEE62F72575276A9C3BC3F1EECE3AE8318CE9B674B29D7490699484F0AFE62A1F91A3777ECA8B19EC841FB34598D45264EFC57CFEBFCBD558422823C0770B112E9E9E4A3207C7EEF54636633861EF2A2D923B0CF0DB95B39BBDA39F30B97ED666FB2C53E836E01490170D5BA8188EE68360711175DD2C71A448125F6D07C1D911E52223A68FDAE0C31D4 EntropyInput = 7710195AA2B10D179F33A842A5DA4DEAC502335B316A3CA0DA7D4CE069A8F39BB21F20F9A8439884EB033B2DF4C19DE8FF042DFEE453F0699EC38E6C485E7BA824E01E187920F82FFED7CAA8A800C382 EntropyInputReseed = 90351D93FE396659B113A3EF4D5D20FDC55839FE48E4262512A0ED99A0443D0BB41A50FCEC9FB545680EB813CF1A73EEAD9B63284DE78905ED13D8F612A3577B AdditionalInput1 = 12361FF8BED25CF402ACC9E495A49805A4C56E9470903B91D402C9CDB6E11DD8 AdditionalInput2 = 5A44FA0387E06AA921DEDA28EE4D18CD274C5B77CC24D57A6E5239575AB43A47 Out = 56A3C4C1567BF630840C0A1FB4E7ABD3011B1FF7F8835FEF5692FC8D4AC0BA2912D2CFCC627FB266C3FCB7B165BC2E802B6F11F874FD056E1C4E66A7A73B69BB37CB2E5260D4AEF9B2FC08A9D6C54B11DF3759E1F0E7878087229F33BDF84EEA865591020D9FF8EB28697426E47F7D9EE3A42CA33C041B8DDCF0530E35204245FFC8BC33B365C256C13A10C64CE4AEC906B959BC58F4CF2E62BCD63435F73B42E4CD259F41E36B7123F4336B406AA7432DCCF183D3FFE7261B8C7356E4624E55 EntropyInput = C56165AE25C2DB25CA2EA19A9C89852595CD4AE0C21DDC4F1270668F218F199CD6F72A450BA4961B51F1B14ECD1AE0E00B135987380F86CB9AE03D7C0F8AF4459D9B2B78123E7488B8127C246B9623D1 EntropyInputReseed = 46934A4DCFD6E0E4182F4AE810FC45E2B8E5F0A3EDA1806F66F7E5565F62D7023DF90682931B43E7F7D944A3277770669FBD576D8514718DA540C82C774164D2 AdditionalInput1 = A43CB1E002E1FA1BE993F6748C6A606A6747ACDDAB4DF31030588D200694880F AdditionalInput2 = CA9D31FA7FE470B733D5E998AFCB8D0A42E8E8CC00D02951B5651495B48FF5AC Out = 81616DA7B20C0581CAFCA1F7DE7047F9FAC4C4D2B171A5A3986D55AAD60207B19A1EB85366037A994704FC05DF424489B0562006F4BF3F782629F210528436C5DB827C78C100C4B437FE4EA43CD46D621BDE66808558B7A3906B6DB0069DC8E8E03AAF2890C94F4120BD45CDC3F3A69C752D4BF838412B16988D478BD1AC605FE9B58A30A31DF8DA2D2FDFEA1C29D32CF70C3435EACDB2D7FA41477B02582B5B088C5FA5B0C7DE1FD9A4302B160F9693B69058289A2640140F99F89EE1A14A3C EntropyInput = 471EDA382A7459FCDD1D05222B73E374F56C87ABAA811DCEB9B7E59E95E370F5FF12211866E7867E6F8CA2AF2D101947BD0230981221816112F3A8674474E3F8C64D1E39AE7EDC8FFEFB326702C788E0 EntropyInputReseed = 4AF6BB1C16E41185FC599C0D38F585FC33738FF820BD1264B2A4A4B861D454D5667B18EDA8F6E3CE4A69471F64CE0A8398EE74AE9E4E87D808F86E98133C86C7 AdditionalInput1 = 9576E0932C74B22F12D9E63D7F455F4339D421AA0D2F6F86C58BCB6DD084D30B AdditionalInput2 = 5FDE63C7142FB1D7666456CABD486F5E1654CEA6E599A793A67FA42D0AFE9BEC Out = 05224FA03392264F97BF82D2124EF4FDC0D8AF2B3F679CE32C7CE4EE860F8C691699EFF783B45ABB335765FDCE7635B05ADBEC6E19EA72ADFA7C61C6CB1D34AE4F6A430CD281CA87294D1CF0C390EFCA4A697FE0CDABA9584EF52FA82D0CFC5B39E590EFC00933846927CFBEBB9654607399DE888C68EC706A2BCB4F52801AC98E91AD0E064AD15F9FDF80348C6E8909AAB99072536100FABCABA115E7C3C6798E01B4633EFFC28C2C951702AF1FEF5B18C034FCFAFAB767C41A04B27DB76883 EntropyInput = 9AE5D6BEE49F7DCE7BD859C1C818C3560A95560E0667ECA940A367A19063EB10B577ECFA21165E086D62B059B806EB34C9AE2FDF6AF5C0CC0A836EE403D11C22A92DE69246DE3EB7A0D940D07AD8D0C2 EntropyInputReseed = 2AB82AB429B6EC25A98CDE0B2E96EA173AC68708535AF8B2669F47822130327F8B0522FA8F19423210101DE990D55EA4F907368D3D167F023321B5B37C5BAF9F AdditionalInput1 = FE49489E934C8C41351B67C3D16CE068200677CA83D5EF24D97DDF82D119D05D AdditionalInput2 = B75A929109E7AFA92617CEDC4DF22792F4B5AA4C50B490F9909CC00FEC8CD128 Out = 50D33CA5241C5DB4EEAC7F3C92690DB17465D67B076BBEDFC9219DDEB0E1673458905E2E0AEBCFA87FE2A22A35A45FADA64AA195720C01D70D55D6FDD21F07CE5A96AF4A71CCCA879907D4A4DFCAAD828C483008AEE220C83C414AD94B76CFB547CE84C4B5635AF6D74D3659952C7F19E83C2EEE9FF7DE75C052F02993A84E51E6B7AC61A71B7B75E42DA267A4AC2AF2B05B64DE3F985DA4F2A2ADB7BE80A84750DA1D7FAFFF2DDAFDD91E7BFB4ADEE9EAD173330BBD7D1E820D9B4817D58B09 EntropyInput = 00747DAEBD7492E77E6A14540609D38CDEBEDC3E8F1BE99ADF1C7901E1291984FB44AF868EDBF951A0C1D2D30356D5009198A361CD07DB1392BACFDBF9E623CC98332BB5D7B554E0F692313D2B7D8385 EntropyInputReseed = 284CF4DCF0D697B5A5CD7E1E16C6B1FCE4F5FFAD977DF9BE6D7F6E3BDDD2317F5F2B2CC8ABA9F0E47B2B0E7B19F2443F941574E8BB18DC80F4C2187A74410DC4 AdditionalInput1 = 6E99647CC62C8895265D96B172CEF01EF08D810700691E5B8E95A609E4D30C98 AdditionalInput2 = 1FD149C6ECCF4384F091353C2B0D84509A5D07DB012F7C8B11B10719EBAD1F5E Out = 95507CB7C2CC71E1974C0632C67E9D44767FA608308903AB51A05C7493C4F61E96803D9E9E9FE97C4D8BAA10A828FB4566B368A8EF08F2A5CD5A8058E3E3193BF3CEF19D6A6D29B613AAB8CA1C522EAD73884A3FD12A7E76A6029F67052FCF33625A53EF9F7659D9AF5197715AA5DB2AB74FD63221DAA801D61C7A3288301DE6AE7AE11D699D3834B4D56434DB1ED679FC57EA3218F438278E999FE28518A09D8B18B2B68CA96BF8928E29DE329F8C398C8EA5B9C4F13F387E487C654119EAA2 [SHA-512] EntropyInput = 48C121B18733AF15C27E1DD9BA66A9A81A5579CDBA0F5B657EC53C2B9E90BBF6BBB7C777428068FAD9970891F879B1AF EntropyInputReseed = E0FFEFDADB9CCF990504D568BDB4D862CBE17CCCE6E22DFCAB8B4804FD21421A Out = 05DA6AAC7D980DA038F65F392841476D37FE70FBD3E369D1F80196E66E54B8FADB1D60E1A0F3D4DC173769D75FC3410549D7A843270A54A068B4FE767D7D9A59604510A875AD1E9731C8AFD0FD50B825E2C50D062576175106A9981BE37E02EC7C5CD0A69AA0CA65BDDAEE1B0DE532E10CFA1F5BF6A026E47379736A099D6750AB121DBE3622B841BAF8BDCBE875C85BA4B586B8B5B57B0FECBEC08C12FF2A9453C47C6E32A52103D972C62AB9AFFB8E728A31FCEFBBCCC556C0F0A35F4B10ACE2D96B906E36CBB72233201E536D3E13B045187B417D2449CAD1EDD192E061F12D22147B0A176EA8D9C4C35404395B6502EF333A813B6586037479E0FA3C6A23 EntropyInput = 8802D43F70294F532D2AF0BE0852B7A9EF6584E8B1631845306B583AB059111C0A88CC670B8A827E5057B902563840B6 EntropyInputReseed = BA6F6919295F2206BC8738EEE2B4E7B4D3D492B945150C76EDF466CDFEDE4868 Out = CAA3A5F9822F497FC3335C3A4262294846CD4A6842CDB290A011A94B6C3C27A83622DFC7E5C9954E91FEAE5CA8034083E2FCB493E210E5CAF31CEB63A7F3D59DCFC3A859DAC5C250981F7B663E4EF7222EDED353C7F42923C6C6DB006E927B4B5F44B73E986DDC4176AC03A5EC619B3EBC923D4A6D9430E5B9ADF75A5298E76A110D0A2A4E2F7841F900C4067CF7EE68C356C4F5D13BE8885801D1E578CA4D2CC32D48B5E6303A0BC417AFAC033758F3E812693C49128E0DB1BC9EA2FA2F2C45CB35792123AF63F42DDA3ABC7CF8BF5DAC17987178CC0A64B0FDE5C9FF2012BCF57E93103F08DB1E3A9F727E1CF753EA44D62EAD2AA5410B9E37812C43D60EB1 EntropyInput = A53ADCD8C8EA16BA80A57D9A55955197CE0D957BC92D8A0B548BEDCA149D78FFA9DDDB64710D5DEE89F1EDD37D8B55DC EntropyInputReseed = 2F50BD67E4A6AD0F3A01947E3673B10688178710BA2E7BB5F3DBD826C792C9D8 Out = 7F89DB3D0D6CF7C5557B4599D7F4C8B5235C00C9CC393F734AD7BA98CB8E767CEAA529892DC30D2885F161F47B9C81DC2811BAF12F120BB9458096C183AE35E198E1A50FB91F863C5D82B27ED10864DD6FD601F4A1FCB07BC839BDA185A9B18CE45D800049BD2F41FD909A12EB2FE8AB3E1D2F0F1187109D61E2AF6DF0C5CB9FB801CEB319D0AA9FEA918AE9991720E4D9D79CED8285774382A4D89001FCFB899A7C3FB864F1AD2DEBF5F5C39AB04496FFE383E9EFDA0EABA48325514B09A253640F386FE12FD1B25DA3B2373EE14EE9F2FF06FE063F771624F538C0E5620029B9490F33E5E4FF1A9BCABA76005C829E0117D345B73F986D7C8276CB54FD87E4 EntropyInput = EDCDDC13604E036F16687E36BB576CECD71B20DC78F070033D8B6F1F8125BA2D2D3EFDD9F01A93910EC29FC4718420A2 EntropyInputReseed = 1385F8798218E1AEBB810379A0871B534E067B04D6EC9D523F7CDC8D45BED4D2 Out = DF02EC9BCCC25FEB7AA4787F5F63A92EC05B2CC13FB92C20924ABA9E1723436469C87673B8987EF19BE99EBAFDE91D293CA6EC7C1FA4CC8902A57417338538FBF897772CB96085768E893C5A09327354006074992CD6A517D6C57C7AF5495A3D645798EB1962C0B56FF0C8C98E18C0963E5A581230909981B301797D779703F31B264F90D6483EABD8A41FEC8EA69A57BEFE1F53D470FC82BC35029A4D089EEC7CA3986485A51AD1E56CDF2DEA5FC3D39AA997A53A9924777EB6F3BF1056A578FD32ACA125A74C8D24ACB7B99C37F34081850712EDF1B6851F0A5E640AE7193D3F49F3654AAD3CD106E41E78F1E93A8A2D01ACDE0E6CEB3F19E0AB49F4BCBE40 EntropyInput = 7EE0378EB594BD2EF129F35C9C1D87727C71AE472363A596467A2D71871863D8476B636E2FFDC0DB70BE5F7792AE8A8C EntropyInputReseed = D40D3F03347700D3CA515880CFD7962F8CE1DCDFC5FF134DAF552F8C2A911758 Out = CC14C0E72F186392E461F65A0C0711E32E4B33A407953215941FC5D06279D08770B3D165D568B2FDDB94299DE2E7A6DF0820A64E8779893390AC173801EF85170A52B9C0334B4FDE55FE08E90B79CFF1366BC43C0FA8F5F8206CC468987A38123BBE0D27E7EA2D21E6A1F02619B8C270A5E416ED50FF7E42D9FAA2F8D383EDA55899D85302590622ADA9CCF5D144313E5DF95688FD1A9C48DDCAF7AF03068E11729AADD626761F3BE1CD36188C89D08E3D8A090E7ECD7394077BBBD2C7E1766662EC882901941E09BE9943A72A34817141611EF84C0F1848EFDBCF245215F290427A6247174CF3A08E4110D3EEA05BB85484F75E156E2FE5EA0C6723D3F8F047 EntropyInput = FB35F3AD6B7618735DDD273D95B442A362B6822502A217E893BE3E36FD7BE4553CFDE0EDF5D9B5F15BE9288FF78FD0C0 EntropyInputReseed = 9EBAC49E71484169170F343F4B21E244D1391F963112DC061075D9B7D26CD171 Out = 6F6814F55C7E226ADB7687D73EB4E9B909D47F4B57693CE2C543436318FAEA92371E951D5D338C06BD95F0E7DEBD915E2179BEECA9878FAF3DBEAFEABE3C9BC8D6445F863649C66E9C3609B8A3D54080B68CE145B2FD4ECB3C93801C307C554513A210E49DEE13828B20DFF092DE2F312FD60B2AA0AF4ED7E564F06ADEA6B3DFA74636E7AD16DEB19E95DF71D2860AEEE7532AA9FF2A08C768F1086ABEFB60D860657C8BD7972EC7BE3740293B6471CC55262CC120F97C0C08DE78B705068DCBB2D0C656CCB8E2C6E3FED199EFC888492EC641D4A54152366DEE96008A80794CB3B4F5A36A34D832446D03991E4374315C67C336AAD317920B99F9C35A493582 EntropyInput = A8DB61234723DA2F0883224563A1BC04C7B4D040A7DE3B659DEA0086BAB7F454C73D1F918FF29E2F98CEE562E05F5AD6 EntropyInputReseed = F2781F5786228CF0CBB50D2C8D94A1307383D41229A90C0DCF142B94B704C56A Out = 0FA5FC008C56CA47024692FF55F500E312423818D1EEB77B1A3442058718885479B405767B879943E73FB16956EE2293B23DCB93CFDA420A4F37CA5EBA1AAFCB8700CF6F38F2ACAC88698F1C0ABEA975270DD4436292C8CA60576690DFD9137080DB2B3A42107ECEA5A631AC413384A9329D60A358D2C58647EEDCAC164DF50820E879374BC2E08D971BF5DC65AFA33ECD472E5FE9677635A79AD58B489933FE9C1F992429E5D16DC954D2DE059B70B8F170DECD1F22C36B034E5F175138846901F6FD7FCEA1491846984CED8B595C411A9F6D21F3F15FA5A073EFB5F829F3B34D601AA91ED8CC433458692F44EC1930F3AC5781EA001A3B79DF7C3E82AE5365 EntropyInput = 95D7851BCD43FC71CD9656737A0B05B5F83E55451C4672061230B9B34BFF71C025BD51CCC3F4C2A14407D5D569D250B8 EntropyInputReseed = 40E24828C319C1B7FE093E5551F8ACD20167B2839C8D5CE9710532D69812B8A6 Out = 358B36B4B7F119FAFCBFDD619ADBF9593048ED7364377752DEF3419B85EABD444E87D1E952C45F7C9BEA3D29F845F297DBB48C2336CF44216FDD2E5C164C81AC688FEEBCF460910ECB8B8F6C3B0150195B2C7F1FB9988EB60C0564F0E089E4C269CD19414F6718120AD3742F96730233DADD3FB7D9E898CE38B5B8244B0AF62DDB1E2689E9AAF27017EA28699D08B933F9219676A98F817421C363A526798833F9E763DD19341F56599CB594F274051151B87BF219D4B87B72EEE5BF4BC78053A59AA5040AD334E08283E060B7B528A9089F24B287334070853C180021B50595E0FBBDE18422127B0EF7EFE92B98788D6E85683D97B679861154863FB0D4F9A1 EntropyInput = EE7A62EFC8403A0F988711436EFACC44B5098F9A3526DAC49AD9343C80C98EEC51F064968EB37D1A8BC8604E3324E5A6 EntropyInputReseed = 4A99315401A2DF8D8935E94FEA3FC5990107BAE19AF886415EDD6ECCC95EE942 Out = 7E3A0A32D6954BAD579D54F136594ADD6CD30628BDD53DCB09BAA98884547BCF3C8E84E4C01B0660D62DD8B44AE6CE830447C5480F30942E742BDE5009FA769EA8662A8BD26135BB45E5A380439D5B1B0114969F42BAFE4D1D7B7C9A7B765573538A7F5917AF85BFA1FC57710E10EB4A00062C176B93F4B02255606A110840BFBB9131AA290635FAC52B260190E9172CFEF947F152113FF3CB3DE73E22EEDFC44F143B9C23C1670A057CDEDAEC28B145AC2E699F366D5D695D1CBD258B59D4C88BD8D1062EA578C758D5823C43A85B5FE1AAA8F3E4B68092D4107D6B11EEB613ED058747259FF0EB685BDD42B9DEE54C1BE9B613A4EF672C4D31FF84A73F553B EntropyInput = BF02755E4C3DB98CD26C0ABEDEDB5CE360495C1A2ECF194E922D87DECEF4173584A3788DAD5B308C50E7C0A0A10C7A42 EntropyInputReseed = F3C7B2A52DF2230CB8DC7BD71C35D448FC5B1EB4F903EC6342CDE118AC284C2F Out = CE2806594DA7A6F27385593B14669B5C63B6A5B0240D150ABF0EA4DAF32574604FCDF10C4965A9220C285885AE2D2CC1DE8A86796357741645964F102E65150D1106CB5B8C5BEBF5FDCD5E64DCED9E489C188B619C2ECF96E7F96861DADCF0E7381B4D628165DA0EC5B7C90D369AFB705C39986E4884ADBE05FB7B74A9BA3B354E858697A1DB531AE32AE8184658688012AAEAA4F69B85B802F5ADAE64F049857D1314C7532BD40043E61AF47CDC7EC8E85FE61827DE39C2F1825FB0253EE73CA2423544BB64F8D2AFE84DB5CC8AD7694E177468DCB29092B4C85D069AD7B1C41E139642076B8075AB0228F542FCD2A7A6340917F82B7E356E5652ECA24B3031 EntropyInput = A188065C9EE936384C5572B0910360ECD984CD0EA926C86B269F38F1040D41679BF9A91BD4E986F500036CFAFC583EDF EntropyInputReseed = FF1170CEA9F22A3140E7F4D198630FA353626518062340FD2F5B0F6B4FE7E217 Out = EA19CC91D80D37B8F16388FA62FE8E1F114F32F2A6108140B60C1994432B18445CDC131B21C884C74D155AEA2AA7F62C7FFDF128886CDEEBB395E5B8819DDDC8C7834475D19162CD6A9C037995E3F9381CD582EADA424EA6B67AD734C216F8380BFC8F5DC0E7A1D93C406870BD64A190A670A8CA94DFC0C02B61365A1D908A6B980627AF6BCE02A42DD9DEE90DBA722CF6BD7AB86CC4200AF93ED226CDAE14F28E242C6F96DB866631B258BE010D47C2EB95F01FCBA4FD71646E6DB54947A0D4DFF86A107E226B1E4343D8A1D233369F8B560F78C865426D341F5F0713748B3AC4031D3D84BB057CDED60B11DE44CB221869E42BB054127388740E52535A11AC EntropyInput = 58EBCEC4539F4AF1B32A854181DD0F512B8C704FA47537096A769EFF28C59165A18226CFC779EFC9550F7BE02006D83C EntropyInputReseed = 230CD6E6909E301D1E99ECD1FFF2B2CD00A56C7A684C8907BBB13CE3E9A0CBCE Out = 6F4E86F309F69144603961C5366E4F9B16D10C10593EA689A8E7435A327D2524F4468813EA7F3248D8D4BBE17B175CFC40617149983928B267DC0C4DB46D2C17FE8BC0764386758AF1A824E12EB897FEAFC1C7EF66F80FFCD993AA016E139991CDE8435EE6BB0DE45A7FB61EB1A6BEB76E012B848EA003F687537E4BD00CED37EFDDA66333B53A8DD5220C281FBF68BFD9E72285E78197881EFC540DA4C1BA80A226013A2D7098D34AF4112E7B8C865AF15409F6901B952FEE4A474E4027051E1DCE879DDF5E84F3947DC9B94119D67E6B48ED6FD6B1F813C13D3FF30E121EFCE7918533925F50C8E381E87EA685F993619BACC9EFC0AEBC884B450646EEAA5E EntropyInput = ACAD606154F6AE06738D67F517CEF4C8DD8DBB2EA333BAC9E69BC0A4CB98877BFCA3D906739D442608BFE66CA48C3D7D EntropyInputReseed = 01F7D410F46764BF2BA4268713BA76BF7026203E35313EE75ADD608509DE867C Out = F6621BB82D8830707FDCC6F58A7CECC7501A56F44C6BA783F6F8187B21F5F3EAFD1F38AE780584BA4ACA59466F6F5FDEE1E82B28B5F8DB4C4DCAA28F030437DE407B5FAC632C96E43A12D13B54901FB7C112DAEE2699D8256C6EE26D60BB267DFDA2C6D6B61C9C67CD5A5B055A283FA02D06CBB8B9B1C3131D7DECCE4DB61243738AF4F6652BF2BE23D4B49A1A7BFC711092CDF655527EE785A85E90B58FE478A462B65FD9868F821FFBA56080064D74724D8C2F98CEBD9EB8FC5BF13399B04CF1586334913E8E9232E13BA10F9F2C365E50154EE91A00D981D4FD7A4D49C3A2CC0988D4D712074918F11C378C40E762B610C9F4DF3EF58D728A23DFF3E035DD EntropyInput = D2715947B420CA136A4CD5C921B8FAE20900679D87FFDE5BDADC7B0FB532F35E100D8D0B59810BF3222B07FAC3A3C334 EntropyInputReseed = E4FFD96983E51AD04C2C5BB7FEA15E8A03E36B92F487B314A191B5AE4862CFE9 Out = 75751DD3463CC20D3F27E3EC085AB6FCC37285030FABB2A6E43C0D438C7D213346D218D34E3FDBABB3411BE233707257290599BBC69512AD971CEC2431518F38022816B9F794E2328B39A8CF6AFEAFC4D1F408F6E05863B654369DAC0867FEEE0C17034D6D07EF22DD217F5AD0F1EF25AC82FCE018573D0A2B0D5A924AEBC5FD9C3EB9CBE38AE3D60E0E92FF800C9B108FBD85B2CDE1B651E080E6625ECAEEC9BE684F1F7D98CAEEC9AA5E1445E5C3DE6AFB590FB3BE3058B403DF6C556963E98CDB30460A3C688485BFAE28703B38A5C42454D91935FC7519E1E3B311BA117B1BCFD480C015CF8E535AF66521CB35833621BF1026139164052AFF6AA4E51FDC EntropyInput = E1D2D72E7907E7214CB266F1EF641395E54B39E8365304661B0BEE371F3246528417FFD58420E48EC063DE5DF4462E39 EntropyInputReseed = E6CAE1B5F3A3A12FAAAF39B98EE592C8D4F56B9D4534ADD5104B357D788C23AB Out = 626A0863321AC75E0B6240EA6A619458634A978245C1533819C97114E63914009C9CAB732F1310F60F64F033B00729424228671F33425099820AB108412D460F32C0015B73987E937B9BBDD29E5BFB8DBB6C95D2B69FCCBC26B060CF0A5DC0992FB0E76B38BCD64FD7A726714E8C8542D44B2F9C5D2F2F8CB370B95E086B07E88F492F51FE6C288D78B76D0C3A6146C9DFCE53E76CDBBD158D2944DD10197247004954D92F6B1DF4BADEB4BB1C98D7D3DA2054E3300F6D8DDA8863422E6A042C2D84B2BBED6BE88F0704763410771B3786D2F6D968B6C224E0CF535E8D02C178B2E0B90E8A7FCA0C431B7F3CF41B0A7C17778FE8C2EEB442C910BA88C7C364CD EntropyInput = 4686A959E17DFB96C294B09C0F7A60EFB386416CFB4C8972BCC55E44A151607A5226543B4C89321BBFB0F11F18EE3462 EntropyInputReseed = 5EF50DAAF29929047870235C17762F5DF5D9AB1AF656E0E215FCC6FD9FC0D85DD2383C3E528492269E6C3B3AAA2B54FBF48731F5AA52150CE7FC644679A5E7C6 AdditionalInput1 = C841E7A2D9D13BDB8644CD7F5D91D241A369E12DC6C9C2BE50D1ED29484BFF98 AdditionalInput2 = 9054CF9216AF66A788D3BF6757B8987E42D4E49B325E728DC645D5E107048245 Out = B60D8803531B2B8583D17BDF3AC7C01F3C65CF9B069862B2D39B9024B34C172B712DB0704ACB078A1AB1AEC0390DBAEE2DEC9BE7B234E63DA481FD469A92C77BC7BB2CFCA586855520E0F9E9D47DCB9BDF2A2FDFA9F2B4342EF0EA582616B55477717CFD516D46D6383257743656F7CF8B38402BA795A8C9D35A4AA88BEC623313DAD6EAD689D152B54074F183B2FEE556F554DB343626CEA853718F18D386BC8BEBB0C07B3C5E96CEB391FFCEECE88864DBD3BE83A613562C5C417A24807D5F9332974F045E79A9ADE36994AF6CF9BBEEB71D0025FCB4AD50F121CBC2DF7CD12FF5A50CDDFD9A4BBC6D942D743C8B8FBEBE00EECCEA3D14E07FF8454FA715DA EntropyInput = 0BFD73A55C96ECBB6104FC1F91D8601E7B57CDF85D6E6B5360920B4E7D1CD02629BB1C55E637FAE1608F389D179F4FD2 EntropyInputReseed = 650251A37AD27C2B5264B1605ED5A51DF949086C10ECE31255701733EE1C853915B3816392285FC665572C48A168068A10994CBE4CEAA1955F07075039C73B4A AdditionalInput1 = 374241CF3073E2F82956C76897944AE9C43907FD6781202B10E953C3AAB1CFB1 AdditionalInput2 = 4D434031E2A2B1E1AC5EC98081BE46D05DE1B4D25E3B4DBC8F040B627F8A6F7F Out = F4283ABC7C0F40478BBF0234E2F7656B7C6D1D356C12A3E1F76666BAA19E8A05FC1537BDD2FE855ADBEC4ED4D287FBF571615F415867A2E188AB60B3390053B27BD8BF4745887C93E68D0DFD01608D6B306AF273B66DB6400DAEAE962882C4C6A19B363F24D4BD543A8BCC7935F078602CEE1CF3C7B30343AE2AE0D5AB111764D719205FC30325B2F938B4EC4D0F1FEE2F431E70CB1AA1E7D826D54B7B4FC50560453349D2C52F09D6F5EAAC72B5B9CA9B00142D45ABC550EFF26F1DFB8229BFD1EB21E4567145D7CA47C84001ABD7F5F5E7101B9941302929A37F2150620B899907F7216F3E2BB1FD028B196031692BDBC0D2769C448B024880A131ED98612F EntropyInput = DA5589E7FEE0A023E01A50AA54987C5B6D70503B78403762CDB53C9AE7EC65F853DF14CD7E30BA0EB703B912387469BF EntropyInputReseed = 7F000E5DD78DD80722E194A4616AA373BE2E093D23F2A4E7224B841EF550772D4C74A4655DCBEBD1331B86BC224BE30E6C3386BA844716D1A6938447CA7A317D AdditionalInput1 = 6397E8FE13B3EBB08C0B7CE460B5A149B23433E110B881A9C095CF24D236CEE9 AdditionalInput2 = 6ABA359FAAB473D0D51F21BBE7B2FFEF3A03B64364777A48F80698643D9B2504 Out = 49C7EA8E2740FEDAFD8D31571A240F175AB5EB83B2104F738F3BDCE41C160C19EDF7B2E2C0603D9E7F4F26F132F6B8BD8C61FB0EB391A5B4B6D23E3DB20584E08BE87648984D0B9F3B05C763665B110D58FBA8D3B7C635A78ED8F56CE05414B8BF4E0985E1FF0B4F55EDA8CD516836099DED2B6092C9A1D532BBA363E0811CF507A22189CD3D20AC6E66380FC8DDE32DCA54EC76130CBDC0AA70B5BF3B582CE1405C69DC0E26F65D91644C557D1B55EF9CD893355E7836EFCF53DAC2D468C4909E1538EC1555C94C04B62448092F44E81BE7C0984BEC13A53A953EFDC16D3497B1EF5FCA39231FEFF486C84FA7756419BC909C8782559951D971157441047B80 EntropyInput = 8A36AF663DFCBBECE9653BE51C8DEDD7CEB125D59DBD143AB4C37F21D8CCA464920DD161245835ED81FF1EF1D09E367E EntropyInputReseed = D43118910C2B62D4BB980D0E4305B07E8B321C5A04B46D4A7DD4611AA328543B59C96D6EC4E49B8185F275057047153EF626456085DD77A01CB89CDA060BCF3A AdditionalInput1 = 1492DAFF48D8C7C9E9E8F38130B8AB2DE6E02C6CDCCC25FBCD92D8AFF1FDC66B AdditionalInput2 = D2F40E7DBDFACE320825D0B766D0317F47C74FB55A5A325D66A5834DB70D5ECA Out = 435ED803CAF3E5C94BCF6AB61969BCC4E83F1CF7E73E481494D494FAA9E33CDD890F112C89BD235D6D1DACBBCB73FB1C9A54A4B282032CC01787BFA9BF855EDD91180432C27D98A2F7983933140F63688CA595E7A9FBE38D12280023D383891F0FB8BA3FB07D835A0D48F3F90860040718D341FE5DCC101B51243081563589B00A3E7C2095118C13B8784B387C1D63767C3C655025021B0EAAC886D21EB5FAAE0E35FD073CFEF4354C7B7E4EA1386D855E71BCE01B30151629A7009B851FBC404731841BD24FAC155A912D7B7F7A601BF6559E438367FDD898379B2864C548BC8E2C088348624E33C82990C74F994056D22ADD18E611665F1B45913A62F90845 EntropyInput = DDA69DD5AF052570A7CBC2FD378EEAE936CD301B197D23DCF21CE06161F411320566CF1F231111C1EF883A88F356D94F EntropyInputReseed = 2BA7E42D84574F39BA1946450FE7394E5F3B9A21005D797DD03F27E0477BA74A0CC796CEEE78DFD667C309499DC4CA1003B2D923026C65826F280946E9F3F1F0 AdditionalInput1 = 2483640AD6B242E5C6576DF18DB137A3CF0E4A3EB44BFDEADB9BB650EC816200 AdditionalInput2 = ED978C3F50C3EBBF4B70A75771A940F03EAF7C468E9C4E9AF5F8BF9F947A9352 Out = 9BF785C4A1006DA21F66AE308E6F23DE2D1B01521C40404DA9B605E1FF1577CA1D1300F0E47E922D02331C79B7C0B1E060926564979E0EBF77EE3E1F54907770BAA80EA8DEDB7AED1948DF550B6EE95F2F71A28EC2EB5BAA76EEAF0062E757500EC255369A9DB75C242924D64A391AF1536C3A9A6951AA991F02B7415A2CA77582E8D25BBDD023E4D0A0537C0074F5ABE3AD34D24F5B98AAC29A62C1C2648EB124AF18C619DCDA701E7A277FF1E00A8A267392419DFC1FDDE4EE865C9F3744D92FB86B8AAA872B0142762BFCB7F9A45DCDF5BEE93BD631B73E3ACF9EDFDE744E7492B77FE38ADBE631E7FFB2D1708F213136483CE6845398409B8550E7467B6C EntropyInput = 346E27BAD2B0C0029148C5DB5419A124583D2021FB74677B37B13E8643EE7AA9E9BC52F5C2689AE2BACDB7C8C8D22F5A EntropyInputReseed = 4BBD2F0AD3479DECF2DFE2E9312DBD682D96E199E07F5FD4D22DEEDD83C7767365262E1BDA7014866794713CE6BC1AE4F0DCE523C82CE43E6E0CF9A64983964F AdditionalInput1 = C68C54BF2CAD027CDA08A3380F3BD525E354C4288A7BEDA1A7ED8D62931AAC8A AdditionalInput2 = CBD0049D6546BAF0A8DF2DE5F15B29B77AD07F59B4DFE6A872F0BC1CAD71771C Out = B8C344A8004072F76582E494F70AD0F7D21FDD13CCCC387622EF04CA03A0A14FADDBCECF8869E0F23B6F13FE58D9D769F3AC96AB9B9967150FB81CB5D773CA44960E9267E858EC9DF23228FE2DC239CAAFF0F948D189248F5C075C3250270AF7031DC0AEBB327B004D84D0DE699F5B02DA1AF448DF0D13AE19F77586DB22EDE3F6D3D032D10EF2D7E2EFDDE2CE66A8BDC07126CD49241FAFF097D1467D862EFC2A2E198E74B2E3293D4A99BAC75E328A1DEA3477F3F4C95EDACDEE48B14D26B054B5A268E242A2908449135825FAA7B4FC0C9C877FFE7BB90FAA7C3F136B2B4C78FAD9F44C829BBF7EB8F747D501E150BEDCDF4CDD6FCC86FC409A21E6E90E86 EntropyInput = 09587AE0CCF5C580B44E390E68E6A0A6DAF45E7162EA0418135828599918ECEF9ABDECBA73D8C6D56BDFE005485BE3B1 EntropyInputReseed = FF284A85B127B00185F2F935356C3F87D076599F6B0FB7F93ABF45F0D0BFFB3F4E703F5F59CECD926FC0D94100D1C54FC8B19D165BFEF16437D7BE92802B38D5 AdditionalInput1 = 59CCDAFC72E5727E303D2284B80E9224C95CE5ED0EDCD816C18A55AEF681B203 AdditionalInput2 = 36D72751E4D6A7C6CB2EAD12EEF191254DF53622F6C0FD1F33187F09E87880E9 Out = C1FA1565591A1225E0A61E1CAF0FB6E4C17740C1B1088F47B90D91A0F99978068C162F14CF82A1CA936EC3312ECDEC2F4B7944129722657AE20055A0C293BB678771B457940DF23FEDAA69EB1C1D487AF7C7790B4359BFC84FC83E9F64B81B78B5617D8074D8C7FBB443D3BC671F8D2BB600C3FFF2231E0D363B41F3F558ECEC02B0F1D59A63B39F5B82B59BF88A0FC9A838A802875E7BBC06ECD0029BD62796E2047DF49139BD5C34EF67DC930B1811428C4B547A6F67404012A5B97F93B2895DC2C2389070220A078D2FCD8244A241CAAA98A9C0C7AEF60FC856C61A3B8AAB46FFD3F0CFD768D6B41E9714969587CF363B3EBD60C8C331435E9CD79430767F EntropyInput = 1AD037DAEA8AE2B9131F4490CCB453B670596978E097C7B2342C5AD8BDA53DE10F696E07BF91BB091C21898A1F728BF5 EntropyInputReseed = 873089840B5F022441B355F8E5CEE75917400C5CA597D6FDB8F52874CBA1FFAE27B4177957FBB40BCCB4832FD95BE75ED8DF2307BE3CDD692E8878BAD14CA8CB AdditionalInput1 = C7DD83BC2E99C2428BB243C35E2544B10857620FCDF8964B65B62C58B5069A16 AdditionalInput2 = BA57DE1455A25C66DFED3F8D2E3E198FC6EBFD7927F590C702D3A5AE81E80AC9 Out = 76957B10F67A690C33D9A5652514EFF7B3B5DDD35ACF424D0706725D331411F6CABCC35817E3DD1B51053DE30CCB0210BF428CAF0FD6E9E798870E2CAC024643F5E15F6C5591E921E7531E60C402BEC732E79F55F354EEB5CED5FB74513AC8A48CD6DD92A8F72CE26D87DE25FFEFD511974D629D17048F10A6315D1E06103F58F8D3A04391239D8B1E58CBAC3EB7D8EE4FE9DAA194CDDFAF891A209F7E3F703A4C18FE4734D532D9B648D55D92D6CCF7B1CD5DAAD9EE400A52BC464EC300E4DCAEEED6ED9D741BE4C548E45A6B9C7F73FE4B394FF285B629FCAF031A9AB3593D5358428DB60850DE0A2FDBC51D5C63F956D6B6625207E2A0E401891A92EF953A EntropyInput = FD2D1B1F4150CBBF6EE3D8667E7F508B341B3C251C8B0ABF3178D2FA5A80ED170A15BF55A6570F979080EAD216EFFA58 EntropyInputReseed = 02B2E7404AD93C5CC41E17EB78168859388738FA935D1CD6B06422867A30B5528937C389FC1B905660861A4062C4E6542CC2C587284A279CBC86C432EDF541F9 AdditionalInput1 = C1F79F883F51E1DE95AFDEA8392E121A9591674063411BA79B098E0869DBCE33 AdditionalInput2 = 0EF847924D2FFFBBDEA4F12ACD441E52AD39FF291E80C7A24802C4F03F09C8E9 Out = 26A17B546D2DC3B1528EFB53B0B0F87E917116F03658FF6E6FC165FB891F483AF8EDE7FEF8AE44AB9AD07961B4A22F50FBDF1714720704DE4D80EDD1B1FBAB4443E961A441CE4E7959BAE558E333263F79DAFF8D8F9E3AB0D73EDA9F4D3E31D535C67EDBA3D788EA7250584694628EEB55DF97B01F5C70B051356B5D089B0A368D98BBAC36C690E188E58EEFC9B5E2B59FDCAD05B71BC111B786512D13FC0AD4B9F799287F03198A53B8BE4A2183E7096A0B9FDE728DC409414753077E436FE1AF94A93241021DE8778D65A4708102A49875416170B30A6FEA290D6882C41ED8C838388CBB7FE881A4775CB323DE353032C6E29AA057BF81619E1670823A0AE4 EntropyInput = D4F64D9C63708F9294FE1B1DE82E160274DC7EA857F8AB6F4ED629CC5C4FED94BD2CA16570134810E71A3A7A38FDEE4E EntropyInputReseed = 4AAF3AA82871142EFE6B7D7A4888B4F0C745BDF649F6C84FE5A6519ACE6336C3A8ACEFE33C7D7933CA6FC3C8495BB315BD4EDD94668084DE3A4F742AC5CA1FA1 AdditionalInput1 = 095006F15AC6F8F649AB217DFADD426A60DDAB70C114CF7D52F5E6762A47E679 AdditionalInput2 = 9F095084B18D6EEC18BB6BA7FF6A876344F0D6D7916C10BD510E2E0D546C4A3E Out = 3D3E2D085A23F3B08C0CF1E49252858855F28AFDBFAD3A58983B1D815B2643A968DE890AF8F3D804969D716DBAAF206985D413E2534EC6F2C9E144BE0CF097590E3DE9D63D5C530669D1B287F99D769E7FB6E2C71973C1EA02CAF49D3E400BD31D578313D5C73BB52535A86B28F4252C8F6BBC9770554E294D0181904881D5224CD30BB95D85A952913F63E2BCB2C9E24E9A999A6C7431C5E6E2D76E4EA64480819EF95F40B72DBA0F841CFFC67BDE3C9732AAC9BC4DFDE6E9789487AB9E2FA87103155411EAB4C2E9B640C5FF417307467AB7D9B6036C8E81A51670525F1CA234FA4EC23ABE6DDDEAC0C029A4B58D2FC8C24C3F57E2C2081137C92FDC373D23 EntropyInput = F30723BC93A3FAC546286C2EC8FAF54498EEA6F8D723C32C7B648265DC75D8DC14634281F7A7D1870208BAC4896E22FC EntropyInputReseed = 72BEC353CE3BBE4FE2672C0B9F6266408008D0D1FFF6C9C797E93CCDBC72DD95EBC2B572F365A726531B3DDF7344590CC5F779771134EF7BD7AEC4AF95BFB532 AdditionalInput1 = 0941303CFABA20F7C7C4EE745EC65BE3C4F6D217F8E6C9A1F5E6DB94949645A5 AdditionalInput2 = 6039CC999268F1FDD5EE2979E76B584B85069F144507723E2A47E3AF1D8C2355 Out = EB7797A46743E552E682C0C7FF02E1A06D5AACCBD1A54075CB1A9332E76570D6AA5DD7423DAB5F12B1BBFCBA8B6396F2BBC5A1BC4C7F1FC306B32037B503A1A26B509E7C736B035108F90E4B3AE880BCB1EADA72644119F9AE9A73EADA21F9DE1D2B1356A90F83C6FF97978BDCE08AA6412535B401DDA98C4CE72534F6ED75383D51922E0A4763C5903BAAF75E5BAAA355B3448E101CA3229F5EECD346F450C2F2B11503BBF23BF5D8F79392CF1425AE1CBCDD5BCE53CA7EE0B59647A0A4B8CBABDE28A7368FD46965EC0F55C8CFF034AB3B733D19CEEDF2B8F38E541DA2BBB51E04CC5506D1EF8AB0EC3B43C34DCA722E830D745CE631652976DD6FD9A6AADB EntropyInput = 070A6DA7F4F59DA9ECBBA2DAF690EE9AD0C9CAD330600B7CE7B95D5C1336C96B47BCBBF8EB4D8918CEBE861E959D68D7 EntropyInputReseed = E5FA7CE34ADAA38DE3E36F425832E6BB0A23FE21D10C78800506D9054766CE523B4D05963C2FB8315371C2F35F375B6E39FFEC667303CD96642FDF6FF5F99102 AdditionalInput1 = 4189CC93C021BC2F958DAA737A17F78C03CA09A1A4A73FAA8A74F3F109BF2800 AdditionalInput2 = 5DA2D3A69F10CF9A2F5276D3D54BBBA4EC02826F6EE0440608FF4FD6B1EC962C Out = F8D6D5D7AEE571A9D75923C6A2ED73F3E77901CB025D3E609C7CBF83B6478899B410756F66546BBF38AC3309F02FC870E056772E56ABE76A99A147D12F1FC60EF50CF87BAAD21F5CCDB43BA43EF0ED777BE5DE30CA312F814FF05EBB93BD523716B8F8AD0411AA732D2116040D46CFFD9BC2E463664433EF1F7FC56105B393915106D8AE860AEAAFA934975D446EF95D697E1761017BF102E9E175C7D6D3A3AEE0CE877F1CE7709D08C2C84A34D85D17F77E06A5F72269C9F18F94A9D9E635BA1A1B62CA5499E717423AE4BAB477EBA48143028EA7818D64563BDEA3FDE587DAEFD59FE7059F4F6DB16A61837876946EEBCD846FB5ACF07507C38410E2AC3F22 EntropyInput = 09B75284B738D600DCD3322B91D380DB45D3EFDF2DC8E9FEC64CF07D7A606531AB41F05D85E3EED5F62D55C5132C75F1 EntropyInputReseed = 51437D4F93DCB41145B2F95125D1DAA7DD1F75DAD6DC32E9E42A21DFAF35726B7EBFFA04F7F0C939E1BFB4C8686EBE4FFD7A1EC3FB4AA114946A6650F2B449EA AdditionalInput1 = 8D9CCF3526B655CB923AE3E1416E84AF5E458A2AE4BD55AA98E900353F8BCE65 AdditionalInput2 = D78EDF2F7211F49B70DB778B0FB0EAA217860F9197AD1242CDA264C3FFA3E2DB Out = 1F802D0A9526017A56C43EBEB782C19143571F979B141B644612F0364CB5531F8FCD527578CEF89263C6FC5AB26BAF136418FE203DFE3113124363C768812D3E60A66B14FE13C43891E0756FDAB6F8DD2A28CF9A6341B7B39D996353CF435726B2A02560E0B5F8035C2A50B10DE41FFE389F0B0E478D783FE8DA8D729F1A7B41E09D3E3CC5F93CE24AD76B5650AE61701035D2ABFC05BDED61AFB36DFD910BE47C8788AF1F74CD101746207722EE2761E54742D8F21884794FA9B0712645FDD962CA5CF2D3070F4A2C1DB6F4C1AADBCD415486735EA1BF6894146E09C6CBDAB36D282E20CE0E840871A0B435C3E800BAD673754CAE50AB4E7855E268D9BCCBCA EntropyInput = 773A12318265C2DE4D6A80CE936D4C8A13D81B646FB197D7ADE8D8DCA38988E6BF4FE25D32C137FF50F5E20E987CA8C5 EntropyInputReseed = C7CA4C2BFC9F68C1A79E8A0F9BF2A1DCE0C09DEE4134B39F1E51F0BC10359FCA4D995D9ADDB816122B70226A068C457ED4635E7AC9CE41F1594FF84160C1C06D AdditionalInput1 = F068497D26966DFDD57D5A8EA1A05C1DB2AC2D72248DD59D17BCA9C6FFF28817 AdditionalInput2 = 641D5482FAD78093210F7E542F45A8D17FDC856BE5860C45465B0775BC45ED7A Out = 4D47FA06AE54F60102BD242309D5366A953E72A2622D025F9BABF6F6343429E4158691BBE3629E701F07A48ED239E734A78A400463139CBFEB45D6515BB690F1211EE03E908CC446ABCFED29B955B92E7F9C3AAE149195E174D34F10E30333FCE99CF362C5A42A79EC907D90FB5806C1D09C9690D4AEF060F0FD1B0B1877CCFC377DD675778ADAE40E87588E5080D3CF3EB1F710F019611267B2249007A01B3E6999A3BAB294766C933B09537E99EF7251C588728EE1BF8C64FFC64DE6A70A521EB745B4CA6307BD24CE5661DEF1D7374AFB1C44A964F14EDEB1FE457465C0B45D62A33C5C5BD1628D528B20154D73A946C44363AAAF20DD41244FBC81DD0475 EntropyInput = EADB3322979308075D4BAFB69CAFC6DFF5D55B97C4A73DD9943A0A9E4AC01B78CED5AB91508B9718F6DE9DA47FD7BD54 EntropyInputReseed = 797CD5A5F6365C28B1A56CD5D74721AFC4424A7CA53ED8E97A2C15A727A682E68CED860D74040DCEEDC0FD0F3BD36ECAF36F91E4C56372ED1A54D25D65180D42 AdditionalInput1 = A19980A1C86E9EE4DB41F6467144B0DFF4C0692141916D46BDB7C2AB79992116 AdditionalInput2 = 1CDEE366E7C3E7E853CAABC4320CA2B63616AE86343FC5EC2A21B6C24C04EC39 Out = 84432C3F00AD23BF1BA4B464CEEED8DA0760319141C214D6C31344FEAD11011CA1B10F19DE5A3514C8DF0B69FB85E8706DB272D0E1E6BFD512CADCB4DF7FE745AAAAA8FDD6E194C38B063C030DE3DA53AE6596834B99A46AD205690511E3AA69CF5BFD9ED78D6D33E357524DCC94278B127E89E189E52DB00B426499A388241E9455DEEFDDBCD3974236C67C6207A6F9C4C5D1403C02C828488E705FA4F85FA2771A1F3DF7B2D5D4B1BD25788B8E29C679044E557AE4CC5DFA86559B6EC3B5A314D4DE8AFFD2D576C3CB260413403E3EA439ED4DF3501ACB85DBA98306CD7055027C7BC339878998E23F70680A855479060186335217DBCB229CFC54B66130C3 EntropyInput = 97AEF935EA33717E8E8644BB8C4789F375C48A945DED08771149E828A22DC86682580F51070BA1E991D9803F51FD9A6F212300F93899FF7CB144F20426028B976380A348253BCC3FF42B528CD1972549 EntropyInputReseed = 63CD91C1EBB2CAA15F2837DF8F35CBB6FE96DF2674A136990A5976CBBAB63BC1 Out = 0E8533F64B60C23A2655827037DB218C2FE9CE430FA4ED6ED9BE349C4BDC6F40018B42F486FA04288B3B0C62A12812E76E08C76062A510CC60841F165869EFACEEF90805BDDE2FD66C36C38A2AC9C3CB86BFD30406569E0AFD245102F2EA2D49E4EE5F69187227A3F0EDFBC1259CB6564A2D4E829B3FC3B6996E37546F1D8A16FCD8201D1AD28661BBB0012DAAD55D5403E833D8A0068D216C879BCEBC054DF0C9CBA14DAD4863EE1F75B78BC488662CB0C91CA4FDFCE7DF5916B4E62580902C601BE706DCC7903858E6B9920735BDAA635ADD5C06080D82265345B49037A32FCF0A7C9EA6069E3369F9B4AA45493EFD7318DA2AE9B4FC300498248AFAAD8D49 EntropyInput = 549ADA8DE63982FCBEC1D27162A51764DBD770F1DA46D87759B2CED52D0AB2E8D1E8B2883FDEB221380E17EA387B3A060E7F0664EE95E3DE9EF4F9D8FAADA0851BD1DE3A3A767F85A74BA26F7FE8201D EntropyInputReseed = 5CD6DBB671F1CAEB7B5A4BAB5B901088F081AFCDDE5ECEA10ACD810735B95532 Out = C876001855484B73DC46BABD570013993413215F6617CE71BE7C77A418494F77ADC56F5C26B393DE340A514B40BF9A0A9E2629B768ED329CA083DD4AF5ECD6F45F878A55D5B02FB9BF3FE043EE9E7058ACB83D3AAF39EAD7E11D82725BDFF8272D7A22CDD6EFCFBDD60458235E523BA0EC1B490994FC394123FDF65D72ADA39215EA6C7F8BD6C8AA4CE947988442C66CF53F196DB401E275098D9260E2162F5726F0C73B201B61FE9F7B586057780A87861D31CA5B21BA62EECA6F5387C5F42147D55A61E1C7D39398A82EBBCBF4F153962F6A6BB5461D58476B4811051CCABB00CD9A78DEBED345C7E854FA064F990A6D0DC827C39C38237BDC5E9B1B44B6A3 EntropyInput = D3F2AF83ED1071E6895B1D57D0969EC7FBA3D6316DF5031E452C26DAABABDABB58107846A2A6921CE3502614AE6CC94B0D4223285E53C9E7D743DFAFD08FA75C81582D0C507C38CDAA6FA1B398E342E8 EntropyInputReseed = 9D246A8CEEECE6A9CEAD94CD297838CA96B74A88DCBE24000F8EB719F939A3BC Out = 9B83018FB5A4B2D2B76CF5E8258E7D3F6943A494A9CF7DFE16F9C51BEB6D9B849CDDABFD597FBA42D6FCA4096E458C8C0E353DA4FD6AF9297583E97A910BCBF1258A83DA465D34AD13EEACC0E57F145A8CBE09AD9129302E64A4D6CC9166E3576D256B7B3C64540100EA4B0C6F7F92FF13AF732F6FCE6516F2FFECCAAA0AF906D4EFB8B7625CC91C5358E5FD292DE159DBAC1CC9F0AFBA62BA7D5733491538D14467F9F242FA66E79B444F38CA9A6E7472E41CBE8A63967B2E9AD0D8FAB4DC173A3BB45E3654AD49D8D8D5345146B33FC55C52E201FD404F7BA64C331D92C3109DD8FDB70116D0E84304772217AD8FE65BB0215ECA5C842CB10D591C9B887F0F EntropyInput = 43DE428B90DDF2DDA3280FC3628C289EA7E623B63A0AD5F568C459EB7D62F739C106327C0F3A8F59E5BED661224E4335E9CF65C1C1D8D1FB07A0A66821B810FE8893339949B50909FB9B72883A530FFD EntropyInputReseed = 94F78B3604B10FA048E04181EED885DB9665C4EB92D0CB82969A1E5DBDF11FBF Out = 2698A29124C6AC40F2416778A54EA080014A3258211D2136CC82E83E199243E7B6483F363FFB637E3A498ECDA6926E91CFC19E61F66F33D3C830F2CE9A9379F3AB5EAB90001A06B7713A5AB5C5ED461D1C99824E1A506482FC04B6FF0129847FE84B0E36EC7284DC028F2AE326F39E7B2B17B6CBC21A29F1F0C8EA069BE5A2DEFA5794880FB37ED129849CB4E7BC998A80E6BDBF6EE7D7BD78EDD6A7AD415E571DA42481F00A857C57308CB7E24EFAF3993587D3991AE41ABA97439F5E0FEB5250013D84619FADA910ECBC186E976026B1451B602D20E60679E78C8940B3C8946454CB0409A83C2AA7E2D1F92F548FCA8D089E15C47A2C803E7E1E78429FD01D EntropyInput = AF0ABF3D221F4AF4A4571EAE06287C994BEEFFCD8F5DF5DA72EAB03CF108D67F71B91FF2D70698A8578D058C181BFE717EE295C84488C3F5D3B2798777F92AFCFCFAC175A937CB50444831CA60A58650 EntropyInputReseed = 5D244F5321660DCEC025897D9E9B037BDB406BD97FA9C3CE5E6D01D0840CFBFD Out = E570A328F4AA705F4060F9A6FF38E16007E59533E1D94D039C274D105D7BC8C2FF77920748579DE5C33C1465D4441332BA51D30BD8EEFA90AE8A421CA662551957E1875D6515ADBA50A0D297640248E0A83C032B515520220ED880701650C97727D6B5E5F9980F0EAFA4D709BCBCA76D31C291750F52B75A165023AE40DDF4AD66F395D4CFB1F5A5873743031D2EA2A093B2DA4EA175BAE45CDABE00687524A3814F153C514E1C3D50ABAA96159516BDE73878A021B2E9B889C130CB3D016560AA9AC1EF2E4FEDB67ABBD2EDCAB3D2D74DE3F8E9FB1120473687902FABB46EB183D74F22E5B3BFCB9DC1D1EDD95360EBC1310651EFBACD0E603B37845F2A9068 EntropyInput = 54C0128113A4F3E76311736C83581E6C3FA45659C20BC622132CE4F9DCC348E76575DA4B0142BEDDBDCF51904D1FEBB2B147253BC1D28E988F99A53A73F5B86868B43C6CA73EC7D559F40F572F2BB74E EntropyInputReseed = 48A116378BC69ACF6D1B4B25D94E9D76145FEA73F8BEE448964486C39E88034C Out = 2963B2932E86680BF0EB6907777E88F6CB51C38B36794A0254E984431EC1295AAA26F91D5BBD3874C7733466E04FA4180FDB922B10604280A1E34BA50B4F5867A9FD069028303364566FFA6F7410AE2194EE51BC951B19D7BE1CCE358E002A4B94085CA34F845BC7598ED5036C23A1A1097809C7421FE0B6BD10E90D1F8FFD1CDCFAF3755BDFDDE695B032173861FF3BAEF7A194B5E46C3B0A3888F4E4696EE5DD2414A10C16EB372F67A7538782D61BE0F7574646C7C05F6F3D81EAE13B2F5327B8AB94D2C2172EA168A0F2C6B79494B497DA375606C7D04BC2D8D41618D925140B835B90EE224FFCE041697AF669B0A944D342524FB133E193A54F4B528FBB EntropyInput = 20F4687B717A31F5E818C872952385CD9AC2137ABD2E49B9849F01CC2551DCD7F53DDDB2449C1A9E793FB8A0447B303D0516D63709DEEE72CC6751191EA05D6AAE7EF016DEE1AD62159AF167A785B353 EntropyInputReseed = D6DA6110768F5D32766E3E3F171305FC68C4948DC6762D3C4D27C66FDF962CEF Out = 82EF3110200F4F322764F91FE5B119492B8627ECE211E79E2ED69044E612F60553E5E50ABDB1A1144E4A7AFE05276C80B7D1E3992B609C4966F61BEB02FF8EC889FF94889B69E4E6544BE9EC760B260EDE7E4B5E96B333FC460392EFB1833A6467B175AA7D6602ABE175BA16D94151FEFA0FD1396960AA8C72A6B778F3F0674C86CBEDFF250B5A609D30E0B40EBEAB2A524CEEE7AA861B274BC55541DCBCE77361ACB8DD39FDFCAA02820950932245BD37986D5C1407098E13B5793666D079969B054589E70712D50BE04BBA484CB651C07971BE722E13B82600358DEC86C7F04C0C4E256BA12542F80AE7DE745F50BFB07AA28E3857BCB1F371F01D93B12A2A EntropyInput = EF41067A7CA9B6946155247CE8DBB619795F028D678CCF8F5F5B40E33E8CD15634DB8C9141BC2CB0590A545CCD02CEF67B90A2BAA4C139E29C48DB6C5B51CCF088FDA54E4187611DAB44409CE1C36F4B EntropyInputReseed = E1E96FEA14FB8A55411D9EBF03633DAE0AD449A2121D1C78FBC0E9CD8A78A34B Out = 2A13126E8947278CFCE11CB02EC31ACCCEE5319D478A4937E8FB5E6483F5874FB20A17E9D4599D256B4D87318FFF393F999E7F3D8612FC1B6063175A5D070805D53F7506632F03D37AA43B4E77E323AC0D5C241D9581D7E110FAD21DEC83D1DC9D119D1A0686636ACD0846F58B42BC12A4E7E9D5DDBDC051515E8636FD3470A3B4C2EFAF9774D78F3D32991F9CA50585F939D21A15C5CAE6DEFB1702F9B606EBFD7308E55E6690310E35DADC48F9AA873F142397F36DE90FCFC1DD0B8747496548B4688899DF4D9D13857274741290A39C86D5B92D375B79EFCEB7F6CF2AC0C8C41E6D3C05F7E980628F330B5AAD1328FB4B0621278B190758FAFC93DA359A3B EntropyInput = 4D1A72A7A7EFAB609C6EA16E4A1150A8C1F8BCF19EC3225AD2EB10C761268D6D2C9B09F982710768AAFF9D5E3337B028E5C9712EC583B2DBBFE76D5EEA90B9E3B6815C2E38782192983C6A02EFD91AFA EntropyInputReseed = 596F31842FD23E75A668063BDB03CF1D7E1FF419252D44335712F16720AFF52B Out = F4D994662ACB2644E389B41C71122053B2A9BC68303F4C77870E426AC38C1B20D12CBD8ADAFFB611E3A3365DEFAD82CC8C2A27D40F57E8035E16476442CE4C4BEEE9D8212D230F796FD92B02D7975790120BBF7A6AF8115C06457D767C5543A6C1742FF745999F8E815F5CAEFC92B9540A6FD19AE973C52B321E7D4D7D9B6AB4900D13B7F633A7B8F1ABE3E1A0540B5803B89D71B3C4D3A5DC7C4C0751E088F27B748440DF9DF14FE25096FDCAFA1C3E16D49235DEFBA82ED6DDD1FC8A5FE9F5D360BD72E0D19B21CBECE29737037832B9EF18B96580BA50C344695D93D07B105F39C17CD91EBC291618C8862CD47459946F735FA7FC778B4489B574D6E77EE0 EntropyInput = 5C9F5DE1E3BBB5193BBDABC6211E797DD89EAC092995A5539EDE5EE3F769C4C3E221E65EFD6DAEBAF2B68E4353C23D0817F703C54499FE53E688C6D48B4A0604ED9F6C71B1CB4FB9CDE37EB8FD2A2EE0 EntropyInputReseed = BBFE26B69ABD8DBDA8E41F4F9057AD7148541CCA28AB0C3EA512AADCC65EEF28 Out = 11C40F20930A9AE087D5AE4CD93C6D8DEFC073888F4F8E153B163E7DED25A3313A55B341D40315D78527AE87C932C9071AD6416823D266FE23000E1E33463D2F67C73C6883AA301E5F12820640FFB50B680C3ADED1F6B93D21C3C1A9EA01ECC9642F1E653551D6E8FA8AF6A8EF626DEF69C65571F4A26A7D8B7BAD126D945961797C8147C3ECAD4637F915F8A3A73B3FF235AA3C71273F0CC0E023FA26B8A567DB56A456D58536807817D5F9B04FBBB99DCA16164652526B4E84781F08F1501364A1E3B709894F010693523FACD0EC9C61C41AD9847A9AE47F3B5EE57CDD63AA179CAF1CC4957B59461AFF01F08180A53334ED436697688C55608A12FDDF7239 EntropyInput = C5DE35CA4848615697693D839616A4272900DB5C894BB13FA3A43AFB9E2A714C47A61871BED42C6C2A9D190B946F72010678789F954EA314DABFCE48D090BF93ACAA2F89F7E1A92E6EE0F7AFB19788FD EntropyInputReseed = B671991C43E5DA4325666B140BF96F0548A7220EDF2DBD9BF0BDE719061C11E6 Out = 7D4F29FE94BA8748D534F3FBFDD6DD8CA00F362EED4A84B2EA4C0EA83267246343271BC9D48D6E5C0265DA7C11EA0A40BA8CEF9EA76C649426D9089F0FD81B69A328EC511CF96E7CA79E7CF51B9FCE4A62A8FDC568A4FF19604541BA2EA428EB28AE49645DC0451708FD53EE7E6E6CB8EF7607777F959A1EFDC172C10E290F2F7F3B2CEE2CE5E9A83C3928C55CEE180BFA18359DFD9CFAD1377CC0FED321EC9D13E4BABC23E4EFC89754648E9C6EBE7D7F69ACDA85A56501B8AA8887F9B809B29C7D3B02A8AFC8C1EA9BDF26179B4547B480100C9E6F7D05EDD620599D3BA85C96549A20DEC8084DAE4C98DCA554A2CFF094AFED966A1B3109DBBD8AC5C52304 EntropyInput = CF72DC871545003348CB2E458C6F4FD6DF5220CE389A792F854498CABFF1B5C88E3732F6AA95EACA2B318A4D29D2D33FD8DF317E505AF016E86297F02FBA94059B4CD31529D8C1EE1B33107DF753D89D EntropyInputReseed = 3A289CEB1BD858E3C86C7404825C0C0A812064A05325E09D34553A691A601866 Out = 181851EB38A67D9552C87902D25C67AFD377AEE587DA12386A46148C4CAB44ED5B61777C2247D0D39E0991FA6462475DA9763D30F1ADC9A1D2F90EE3733CF335648706BC7BA06C862EC9969A0AE38B7B1E14817E0D1DD06BBA77A7371F60E0867FD7744B0B4B7E36CC1E280236FCB5193C73A2D00CD0C256B44EB6497ECD69D1669AD3EEC8A4E4C8B730D85E12D1D9C40070E645020D7AE2360CD0D39D559713B4F010A318DFA91E44549FD85E5AE87BFF1547305BE5B788B5750EBAF11A60B0CE6D26DD69D219AEF1A9A038DDAEE0E8135A4428062837AF5E0AA1BE821AF0246C6076BA9ADA4E0AA7F74202E10802879142CD109CD27A292D04E6C53E33DB0D EntropyInput = C89DC15467AE09D5C514A0941F3945B1F4A1670A4DF9910D14C68AA6D3C36E8F5BAE0ABAEFD8FE5300B56A7BC38083B58109DDB29D8395E938AA210852DA6BF1F1A3D00BE9DF74B372E081D538983174 EntropyInputReseed = 5602025C221E1F0D1671F2AE92BB0C86FDE571CCFE8B8B5BE8A94F3F1D027EE2 Out = E1C5D2B4EF29B2BFA498541BE087F21075B0B7449AC7FD234D8E6AF45680920BBE1DAE35850CF27469209162D4175EC42C3D5CD6B7965F95948D9C49EEA2DB9DCA83D1BD8BB49093EA0AF12497BDDD8CADA20BDC94A453792800CC66D01CDF5E0AFDFBDEF3CEAD291E5B88B116FB47B82B4B18D6FB363D733718496EA20CA2614CAED61D823CA9923FCD2F570A9C03827187B0CFED19BCD2C2E87F58508DA8E1096EB9EB4C2BA223CDED5064A6A9B5EED8CEF6FABE3AAACB88B58FAB570A56E80CADE1BE8C82F3B6918A7E574C91DC4FDDAC497F1CF26A801D6CF24CE49ED5E8BAFBEE09ECEB39E1F81821EF5477FA0394992C848FD2CEDD8F86C4C4A396EB3E EntropyInput = 1A100EC0DA9544326286B38705523AC970B896EF6E6306B2124E283A8851E46D3A4B2BC6A8152EC9B0F88D0E2BD1528B005612D87B6DF0204C3D879B5CA30BFC49DF4E189285307E2926B367EBAC30FF EntropyInputReseed = 13EA307A3384C10D1FEAD60B90BF25C305A91558C1537E2A7AC74A85240208F4 Out = 01F56C3A325A39A2BC85E6E077B7A2864921A4B223C7FE998AE255D724A759A66971084047B44FC1B8AD013E976AB8B255930337EDA87612364D605F241095200F8A8513A612BD847AEA116B73078349B7CF60CD2588A8F7431671C3B3C6AB2E4DBA9796B1DDEB2E1EDD4CB3C4DD67CF722679CF64C5B20C64E28BE1AC87F8CD9F17B59ED696F61A4A472FDF37AA90A2F16EDD3D54C5ABE7DCB0E964BBFBC113E66B1887E0DAA2151635B803C0340BA55E3E5817CDE2662AD45133C277502400B78272786C7AA40C54219A06B5A32E088BAF0613FC535DBEF66241BEFA09722F3730BC85C0434C733AB17DCC7C473D8B9F31651921407D85369B6F6FB609D53F EntropyInput = 47C42DF62B4DD570EFD3C2722AD39A2DF5F969A13F645FD27B5290877BA70916C591934D4F66000EBF8C508FAFC44F7594822903CB5C2003C31C6D072AB0DDA435ADD0DE7D8F9D5F08B5CBA410D888FD EntropyInputReseed = D16A2C72C63580B9BCF156862214533A47B1686C871A0165604FDD00A412A484 Out = F78E61B443B5A97B7E493A8CE35A43545290DD33D15BA4BF0FF78F34A25C46C4FF4CD485964CC96E90FE847D9FC9E42D96E4F5AACCF976A84E3E12100C28B0F7ADDB1C76F89663E11890F09E4BEEFE928A1E0B304F1D9DD0414CD115A01B641FD69C7071F2CA7C7F2E53560F4E91010BA11948195BC5DEB556686FEB0BB92FE61B3171E639EF47418F02BE37796EFDB6920952F3A8C766B52FCCFA757E923E38028A84F9BE1B802C1FBBBB4AEF825F4C5E4FC1BF6E96F33AB90EA486710718C9E4F3247B2A55CCEF5A5D342CAC757F0B9F90BCDCC8C2EC3A43149BBD3924C85F0B5B7AE42151F4DED826EE6D47849EF4E8AF64ADF6863982503C23C4A0514CE0 EntropyInput = DA740CBC36057A8E282AE717FE7DFBB245E9E5D49908A0119C5DBCF0A1F2D5AB46561FF612217BA3FF91BAA06D4B5440FC227293523ECB5B1E28C87863626627D958ACC558A672B148CE19E2ABD2DDE4 EntropyInputReseed = 1D61D4D8A41C3254B92104FD555ADAE0569D1835BB52657EC7FBBA0FE03579C5B9ED8E35AD018A375B61189C8D365B00507CB1B4510D21CAC212356B5BBAA8B2 AdditionalInput1 = B7998998EAF9E5D34E64FF7F03DE765B31F407899D20535573E670C1B402C26A AdditionalInput2 = 2089D49D63E0C4DF58879D0CB1BA998E5B3D1A7786B785E7CF13CA5EA5E33CFD Out = 5B70F3E4DA95264233EFBAB155B828D4E231B67CC92757FECA407CC9615A660871CB07AD1A2E9A99412FEDA8EE34DC9C57FA08D3F8225B30D29887D20907D12330FFFD14D1697BA0756D37491B0A8814106E46C8677D49D9157109C402AD0C247A2F50CD5D99E538C850B906937A05DBB8888D984BC77F6CA00B0E3BC97B16D6D25814A54AA12143AFDDD8B2263690565D545F4137E593BB3CA88A37B0AADF79726B95C61906257E6DC47ACD5B6B7E4B534243B13C16AD5A0A1163C0099FCE43F428CD27C3E6463CF5E9A9621F4B3D0B3D4654316F4707675DF39278D5783823049477DCCE8C57FDBD576711C91301E9BD6BB0D3E72DC46D480ED8F61FD63811 EntropyInput = C2FF911B4C93846D07E0D00EEEAD3423845C7215C8B5FE315AA638745E63CA26F1062321318087BF045903CD4F5CC9E6B62F8ED28A72C28D80B41E016F559BBDA0A2A447F8E146EB93A509B302E03C42 EntropyInputReseed = 1A318C2861C6A93948D779AB45F14D451BCEF2D43A5AC752995BC0B365BC3FBC77AA1FF77BF037AE26E60D412F3341715AFCC1FCD3BF971A481A15D45C794331 AdditionalInput1 = 55CA83DFF075F4DE57588DCEC9BCF0FD1FA267BC280D3C48F1F1F749E1997CC2 AdditionalInput2 = E42E4AECA6716181C71EBD462082309868F6FAAFB5D9C82357C785283F6D5285 Out = 384383C41B4DF205D19FE68E563DBFCD2F6EDBD176574248F3D1EE44143B70AA5DEA695B87BB6C82378953A714084EBB5619ACA7D63E0DFBFFC253A336EDF80ACBD584CD3F916D6126968D564C1DABF7B3479A62E7DFCE560B80A5104389BCD771E20138DAD4C59F290A4525B00F6798FB2A3C8F44605A247653D24C772D207F0CCDC19A07037429C7E79771C6A6B4CA219A1F8ED9BBAD9C4CB27415D18B7278552E50EC6E25617CEFA7324AD786AAECA811C3AAA35AE00D2F2152FB6D98DCA82EBE579BEDBB50A40E62AF9E229DBF9B9B2BC6532B5D78E6333CFEB1AD01E192491193C9459B78D4E9C6E8EFE69CF0C702298E325F129027145AF92170B843A5 EntropyInput = E1A333FFE4BCE7B9F6BBC8DAD8787A82AD66CA9B25A64F04B166FACE945C249B5F45CDD318C0588C7CBCD14846523943CE1466063DE221C4FA1CC308442DB476ACFD8FF34B2A0DBBBE0ECEEAFF210293 EntropyInputReseed = A59119683628020E901A0A7FEFC21625864ECB1D76EC119A10821B49A3431348D481E022A80F3E60687BF153524A33BD6FE42C54C39A377A9FC27E047DF53F14 AdditionalInput1 = 26A88ACF67D5ED00184BAAD664C6B2D4A91D437A121C3CAD9EABF3D7E676B0D0 AdditionalInput2 = 524E4896A22BEDC62820C500ED7DA2BBBB4C1EF9F07B5F374D0FB4AE9BBE50E1 Out = 3C3CFDEBCA060F534A952E4933C2C00F9EE0FCB825A58ABB6AEBC952E160668F711068881BA8A6817500BBA1C28867CF21A12A50E46792ABEB9F41BC02322BCE1E77D236B7A45A7807FE22B8EA9E2859D2B0164783D364F6AD84F4B9341C576CD6AB2AB249246BD76910E0ABF115E4C59E37074DE5F4DEFD03FA61CE1733E33C98849EC28CA61B845035218AFA7EE2867B32BA1EFC50907D76CCCA5A7BA69E9700875B200CEC5D1FADAAC77A0960C4EB899C06134CD9CB663C62B69446A460BC9E3DF7EAF2A34DF00FCD838E882F5AF1AA701D35DACEC0CAFBE74CF6DDE7893B880071D3F1C9E53B205BDFDE9807999E73468264D6172C952A7F5F88A836B1C3 EntropyInput = 73CC8CAEA7F1F2129BD035B77BBA2309CA3BEC73E9F993FBCCE7E3F148670BCA656E3F17E5A8CE9BFE3665F4B6CA8AC8EEF338EBDF4D9399441655090136BECBCAF277E5AC73426F79552B3F27819AB6 EntropyInputReseed = 111FE051EE0E760B295B73470DA27081FF17BFCD6FF9085C5E064AB844927F842114D320B65A5906D04C5166EE82E727CC53F0BA33ED54A3229AD9592995695D AdditionalInput1 = E3FCE46CD5C90936F20252E0065DEE1940C7902198AE105017A8F50D143A50F6 AdditionalInput2 = 7AD27EA94DE6EC7AD7CC1895381C735F007F6087D688A070B4CDFAECDD2A3345 Out = 858108FE1ADF90FB3238363CE3532362675A462563E5C12DF97D054267DF0B205ED3960D86893C93D2B1997D95ABD9179512289297B00CACD1A51202923C4224561E9986D0242F50EA4667FD6402E29D18C184028CC6C85836B1455E2D2E9B389E0D65BCD2C78D5E42AD9E47707C9DD4617E6EF2D64590D0E0BE5E4465EB611D91B1A45BCA1AF04632FC8DD045A5F5BA3EC1FC09E3AAA1D03719181E11C80DCD1C4D1AAC3CA69D89B9D2C6FF7575D78843FC4695C1954FC663732418BDDBA4B20439DA03D0428FA047F99A378447F9E563FE405FD8F9C32D580AA6DC1560B9DF1530FCC7B337072CB60007B4E2762DC61A08E6511E7C93B91303AA3D46C14483 EntropyInput = 5EEDD039764E7AF96C3EF7D9E094E861DC0839C2A2642C4082AFD09F2761C392A4EB8FB607CA7C5D7D4EB8E871AA995092A258C0CA5A9C030DD469CA5D8883AE5F3FDAF7D8E0FB23867D150F3D24A0A9 EntropyInputReseed = 37A297AF07BA36A59572E3975138FCFEA667E06D9A4BFD2E9C570E61FBC09006954A9431A4F9B34F6C28FC41BE05FEFA3449C8CE0265A19B8A422935690B50C7 AdditionalInput1 = 1765C701B279CDE38B469BF0948F500B5AFEA8F7EAAC3F100AE5F0B147005EA2 AdditionalInput2 = 1F6D382B8A8967EFB9FEFFB8557F1CF40F4F65B5FA7D9846CAB0601F5150430B Out = BBA8F496D47EC97D90533650275243FE76844B606D714C8BDF37DB1E3F8045DE44482D65A99B6D60EE4AECDAF0D262D96C058DBD704EE96E4AE52BD3EA56E9062B93E2B044124B7E9304DFA237E623D7E7BCEDF59BFFFEE1C581C7E41A401832443AE80C6F4B7643591BD78254996235D011233B18D993B950CCF09BF29B2AE10B85E4CC4FEBA5503F8E81B0D0E7B50E7EB1A358726369E4AF07EF64AA83813E61350068026161A3CCBA808A99D11E7DE5AFDD91137FEC9B77DE8B59DED6286E590FFAB21FDE191362AF132BAC1E8170F36F95D53593E73D1775609A0EF04D9A75A4BAB26F97D253B8E00CA430841CB5BBA4439124ABD37FB43F3510BD5690BC EntropyInput = 95E33E3E1E5D24DCFBC5A534AD0E6AB6AB15DD6B094B7642E2187ABA9A303137B5B7DC3D70253C3A8B446B591FAB69507080C7D4DDD8E32FDA42EA23ADDDF7A4D3893BE2CB87D6C7293BFF521C252189 EntropyInputReseed = C4F6A33DE5257FDC474A46EBBD367465127E6A9EAA97E17851F9A4D55FE4E954611EC30B87DDD1096396D539EC973DCB7C408A62E6C37BFBE563DBB60D9F4932 AdditionalInput1 = 8A4A0F9EEE67C54E3DFD846EA92981CD769A8C7FF4F2646C85E80A03FC556BC3 AdditionalInput2 = 05DC36B5D354F4C3B950053F925616C27E2317F886D2AF09EC1EB7AC5397977A Out = 90FE978FEC5CB14AD180E1CA8D3E266658EFD9B0FC95353D4EDD06C4682572A46E918D1BF4269D38F5B005691F4B5A8DED08983D307A0D7DE64E681A302EA6D0FF8DDB87BCB5AB0871779B10744D8188F7BF2D6498A4EE998DA93D1A2FDF3D3DA635C52CC26977B25DFE17A5F5DCC80FD72D066DB7CDBEDA557BA52554E1EF5A075D7A40CECA83CD83477D99591228F4AE33163D73045D35BDF892CD21083B8D70A3297212EDEEA57EBFB66BAF7AF38833E72113001C2489EA4BEAE57995169A1354131A7F607A1551643D27F56CE8E96143A78B2A19F9FD72CAE9054533FDF16825D852C990DBCF347D32529952445CACC55C79A79C55EBDDA76F226BAB80D6 EntropyInput = B43301C1AF024BA6CD7EADF985CB1C6C303479EC3AB47797392D4220788F4DAEC2B1F5AC6138BCB83E938BE66B3232F7AD7FCBA1F90B243689B85A4EA1DC150BBECA4093DD8B9A0A491A678011AD807D EntropyInputReseed = F022F4E548B93E7A8AA4D853FC1B4C42ED9B182AE582F6876BEB268BA23C41050410527589E72024491D4B5328B5659A330D9B167A1A27251363E262F393EB57 AdditionalInput1 = 5DE8FAC62063A676904AA9628046FE71F080CE285EF964ACDCD11260734F2D90 AdditionalInput2 = 2F14A327BDBB9BE4D9A813DD73445C8A8C911A874DAF08A551E867F54983DE2F Out = 41D553ADCD069C7D2B265798F8891329B1DBCABE2E7C03502542B322D13EA71CD8272EEEC65D31520782351A33915DECCFB8E10CB64D5F9CD88EB30608F7B136486B5972A68B981E0B9B7298BB670ACE568B98C88D35B4A40C25BEDEC94EFF992C0083E539ADCCC37CA5A4093AC96AA13C83A59C080BBE02E37A81303500224DAA4F380D2B88CB84EBAAC342BFE5789658585D2892CEF2BC9AB6F1AD51FB292E531BC33186E39B93FB67D4AC633A2F4F8C681C7F82A81A47B74905613BF10EBD3C57FD6C8624BC7E55B38E2AD063AEA90FAA038D671F86C6B17D4341032E11E13C526C4818DFC42CDA496ECC060D9A1AC45AE0E72A6E05BC3A8AA851AF5214B3 EntropyInput = 837E9048E5564DF02E25F7B7585AC5600CE4CD6A6DE8311C6B3C6084356AD0F9FCDDAD47E7BB6AD7AC9F33145DE135601D194D69897C5A7E8C36CC4CD97784312C9B6599274E3B20D022B1349AC45C58 EntropyInputReseed = 5866611C2B083FD1F9E5CEA98F2725CDCFB0D2FF6F0ADB74D6FB61F8A6CA02B0B6A8880D415CC4B2AADAAD6D7D2DC73484B70909345BD209520C05FE7F5CDC80 AdditionalInput1 = 31BD3FC264C252BD3F8102529763D5AD3E45A4E068677423E698160DB284BF11 AdditionalInput2 = 0B845CF842D1CCC15C2FA7224AD121B9B5F8ACD1E07B16C143C931DA56620906 Out = 7A6DAB28AE7231E2DBBD826C4EEDD8CE062DF31FFFBB0C0EC045B0CD0A4E3457FF978BF39425E48CBEA4884FC59E95665068361A8EE9175A48EF094806FC146CCFC3C403A770ABD0C6BC8439BF68A89F13B0725A79DBAF976DBA95725A4399C58D15C4758A515346CD0D6208FB0BCCC06568642EB3E0C3A9A1DF9567EEAA86924157CCFE5B2F8E8EC946871DAD33F40F65847088C9E500FAF8E25439BE8A1E77DF12A2B21B9F73244B82176E4BEA4ED33D2671EACFA5C4B591CD0BD93DAB7DC62F7231840909CA319278185F873D00820FBC239C3092D1DC1A3CD9C692ED6D37192BC587F8B3EE21C14FB20C520FA7899BCD2A1A53288A42CF70C6FEFE7EF7B9 EntropyInput = F840C75CE0CDB200A3BD980D6CEDF1C7321E5F303CD0446C7AFD2D2D66657447B215333B15D55326BC9BEBAE6AE36EFE6D5CA4B1EDF6C0AFBDCE02ECB30923B2F4F2B33121E21B2FFEE964CC7DE1ABE8 EntropyInputReseed = A3A337C6FBEB6A979A4783F2B7F0F0DD6D3A9D3747DE639A9047248A04A19F5BF56D2B1584BA2F129C77B29590C4E1DFDAB5527B1791E3E445750CA6D4AE3542 AdditionalInput1 = 05BD799249411B37B80590D49F3348631B06A2408A61635C70687003A8485302 AdditionalInput2 = 12D26AC3B87924CDA5D78A3E3C0BD81280E340723643ED1B2EBF2DFD52F5DC43 Out = B48C13AF7A9B6FA6385A7EE5D2AB97DCEBF71A715DC465F413CB0962292DF84C9C83C4093309F749359B0A0DDCC13162CB4AB8FF7B3A6336351ED79EBF47730F97ACCB6A960A9C5C25E0920A06CCCC3B3F62B616C15CA18D7E0B5C2E7D8AD2518D1EF0BEF515AF866893E9378B56DEEC32825FE0A2C5A9729F658915B99AB22A03B7187E83D2D0F41B9467C8326F7BC87189DD8ADE18B3A7EDF0C0EA462DC22109EC91294CF8CE69C8CD0C129B423EDADDA8FBD25F4983A70D75001576A26405188BB0284975203694C318F3AA7FE47EC041BC4C11C9BCEB1B131F74ADCD72FC4D2813564DE6D4711017800377BE9E4C579E88464D67EA6E457A30F8F652375A EntropyInput = C91DB86E3984DBAA25AE5D851EF341EB647BD1DF0517E171FB86069CF6183C19A386746CCD0A7E81F3557038711DB725A4585C13C83F962DF72B58230EA123846DF652B2810766BB671F675B96125A4D EntropyInputReseed = 9926089317AB7142D6AB6050B1F7DFC21080910D43A702CCE93CB1D3B155D22EFB31319B4E622DEDAA88B64AED93BB108362234C3D3ECEFC78F796AEADD9C8E8 AdditionalInput1 = 877BAFBAB3BF9C20B1A85A5F4B3DD11A5C486042B807C39D59FDE1EAED89CCED AdditionalInput2 = 89A5AF332718418758129B8212643750542BF957BF35C64D6B0A276238C808F3 Out = 931E43B1607F43260CA4FEC3205BAFD90CCF9916D721D9EDC384250F9346525C7656CC7B5AED8ACF92B8D843108855AC13F4F0903E51AA4AB7846A839CE70B7DE88E0D52590EDE14437B5493B6C2D9458D221B771107EC166F66ED993739604C487FB4CE94BD795E9CFF60B4F8365C758C27FD767135B90B3372570A8E0E3B3A23DA37E69382AFBB76168ACE3CA78852BF99A0D3A7E2BF192D8D929DFF5B07730E00A8C5FA5AE243C89E71FD52907EEC0B4C49FB86B81394E38A6B0523A89C0FC866C2C3CF76F336E9438D4F773CD5CEEA4DD47B3716A9986153F718177D2C8EBCFCB90B986330F817334D29AEB9C93E9DA5DB30B483F8F434F2807BDDEC6851 EntropyInput = 3E4C40B9B33063EDBFD21BC4E34C5BC1F454D7ED176E4F6EDC3AB056A3B0D1A79170479FD91D6E30CAF99166842E01757A3D7511B93842159162176B7016106E61573AA42C57ACA7BBFC97B3388C28B3 EntropyInputReseed = B2941A7186D8C3F54E6F5F9884E47DD22A161A3FC5E00C1C9CA5A744C6A7F7B2D88781B3AFE2E1500B6881AA9CC23DD150054DA57BE0CA127E101A9FBC4DECCE AdditionalInput1 = 6231B0F5CF182C6F108491C5B7EBED9B2A015E9698E860623E9A12E691A38899 AdditionalInput2 = BDA666C5AC006D6EFC2AA0DA52E74EDED88955F8F064BFAA52D9F2524A195F59 Out = 2D7D62310BFC4A3347122E23655A10DFC54FAC51349F0C8D586AAD39236A20368F4D96623E58987F7C1184148D586022A4B96976F72636EB1AA92AD221C5866B6C6803CBF6C982E1DE12BC89618AEB3F844B2A518A578714E2380075ACB828685A57683179753FD1EBD2D8AA1672940446756829D6AC1CAFBB21858465789ADC024B8FA544BEA09CD4F1F3ED35F298D4619A5F92A6E4F712A0032307ED781166D7A6AF2A352694BE7FD3BC8A151EA848F8B14DA8150EB22E264D76E655FDB3638BF250546EB29FF27850D2B5697932C6A876743561E0894A01CE8435CEF74800F11E4BF44FA5149A6FA4F4CA43267A47D3841722AE7EFD09676F341A54FF1BC7 EntropyInput = FE4F5247DC405C12133E9CF7FE00483649D0E7B70FDB1B39F8E8ED0A4789A0C9AB78417816B54D47CF98C0AA4246AB0D5C5A5E517B3ACB6D6D75742BC293E4D091D7B0BF37559F75DF98D6306BCC2D22 EntropyInputReseed = 68028D1E7441AB77C5EAAF9ABA0F2AC6E1BE2AF480026D44D5EEC0E46FDD31B15F56DC4800297A3FA8E2B38483C29505485628866FF175B19D4ABAF4526BAD92 AdditionalInput1 = D9BC081026EA5E35A52B9D1868688E03AED785AF201E355CF51E6E8CEC917C34 AdditionalInput2 = BCEC655EE8C482E725C5B915B4085A9D678EA26B71C1CE0A85F741F9FB3C3607 Out = 411EDCADB791507F40BFD00F3C764A2C758729F3BEA116BA0C820EFE09ED379095F7877CDD6C694C436572F4DD1B905301ED6E5FA1360AC8112860307958C7B64372EAE8F4122D84FF2D4B690419E3043B8A6183AFDE8F084FA110C38403ADBC878B9B139F6DF5CF47ADBEC2D1F03CBCFECCC412942346FC42F0AF77D52CF9127DFB02BEAE47375AAC101BAAC38D0B47D8F04F83A7EFF482EAD93723827530869390630379767DF1F40B73932789583DA327E2F363BA421A253D35D205B00945D9F5521580350F631CB24C7BCDF7CDDA7CF28BAF625FD9D61134EC7A6D1CF4C80D05441722D081D4AEA1074712F37884FE15DDB3CEBDADB20E71CF3AB41676FE EntropyInput = 9D129142BA466C27F348D5949FAFB79675E334FC3A1948E5D008EE265076467BFA435596B661C527A82E5A064FD56CB6AC23C42315F2BBE54EBA535A7299113CFC88216727EDE9F154D7BDDD88041259 EntropyInputReseed = F17F549C77A0A6A998712EF0E1F41BA4EEB354F77565F7A7627EAEAB83EA48FE7F029D2430D49DE4909A758A2BDA4F219D37EFF01C96DE7CA2A4071D128A1C9D AdditionalInput1 = 4B6A443312F10348F6ABA088D1F81206C696508A75836E98951604E93FA6DB51 AdditionalInput2 = BC128051DDC96EEF9FBC3A23FF458240D11A229D1A75888D622CEB7519E1DB6A Out = 03BBF9E2C0C1ABC1AD71506FE91D483481FC583A73ED2EB4C8834A87118088B20474B78E06366B2F32A5F50E6425BE841E1885A72AA106D5A001E3909B1AC2A29940DED83F0724514800AA0DBBB18DA6D573AA97C7DE470E115E9332179CF8B321FDC83265B4D58ED39C28D09783590704AB9ADF007EE44D4D74AF437851734D470085D45252588D75448ABC608BE03630152582E0344E1A7522A87C3DAEBEEFBC79497757835F079DD99260ED7D7E3E00BDF046F4DAB3CA84B203F8C93CDE99755C2F5B16C00D00F370715F188E80F3F353F2D218350FE1A9F68673EA8E9301333FE5CA7C703D21AA2D0DF020DB28D8340B5E2C07CE5BFBCDE7194399B6F752 EntropyInput = 2FBA8ED5B2BE9AF95FB02183CA8AE0DCCA90B209BE73511A5DAB31EC81E939117E529FCA4F95A483BD307838EF0D779D2DE698D32010618C25ED86CCCAD2EA4D9FB9ADF7B3DC400A2B1B4C975651D103 EntropyInputReseed = BBFE77DF481D807B309DA929F319B39287D3AE0994F77FF616F0A763F35D44A3F9FFCFD5BC9A08F6F9059F4BB7F49E093F404AA7FE736BBF4018734071C26334 AdditionalInput1 = A309FB1F43A520A22946A6418500929E19D2B3316FB1A8C1AA5D047DDFDB8D49 AdditionalInput2 = C1DBFDB9BDD4A3321074B57E11E5EC6DFC374248A918242FB3E22CC6612B3239 Out = 3EEE1BDB63433C55971297E15AC1691CBDFED576B1D2ADA27CAB33E660A3C8575FE989EF73E13058C9A3777C35BFF1DAB25E1991B78CC446738CCCE723EB02136FCB24A0DD2597C3FD0A75774C4A21409689E9309E962BE1E8B096C2DDE59AD9DC6750051058FF6A18D57A19EC2775882EA0AF65B172ED718678D841FB51437AA3133B2B328DF0F4AC916A01D88C740981BF71C4664789CA4E9D3F7FDBE7379231B64683FC891C5222F8B396A446F3B50DDE823F95177B7284663402FE5452FE7BDEE304ABE34D71172170FF3A911782B72B2556F2337D1D23D9D632BF6831D3C173FEA3CA8EB5D7993A58A4B9F8F64D5C89319ACBC847576B383FAE0178A097 EntropyInput = A9FD18764900768B7909DB87DD4C7B87BAA2CAE6B0F62A8C2EE3E4C550041CA7435C7B35ECC6EF373DDE3D989420B92C8BFC5A65FA21396081D92C3D7206F92637389C60CD7A14F11811C91535C0083E EntropyInputReseed = 2BB32F9FC8C766AB840F5D0C73558DCAC87E2102C28193E7FFD3381BC30E1D31404236BFE24B471AC7DF938BE6A96B8EBF8BC758787714D226CE727E9D2B4BD6 AdditionalInput1 = 8151AE3237CA06CA5B0373039681A9D3CF799E98C3FA2EFB576822F1FE0AAA06 AdditionalInput2 = 11F0F8A2C16B1BC15FC93FF4793894F22D7494D11C94DDE5EAD2F0FB09BAE6CB Out = 9C636C3228432FB70D521EAED3BA8E436507E29163DE0F5B7E0AA9A5177AA1A3930B95F72FB0561353DB7213CDE9EBDBD9485A5DF93FF416966E09C1E61D8F805E6A082D6372D58301660A9A0181E2EF906A5A8A999C88002EB4B4132B34EFD21618871CE28BE5E66A65A1782DE11E8E11C57A2DEBC85B0068AB553400B26A0A0F948CCB4E8BBC1173DCDAB388C20EF6E2C9AC796D8816572EBC134396D38D71BA8E986EEB063A7BAF5CCDCF583A723BA56BEC38D4CD3E7BEA563B4132F19B730189F559300091E9171A61469460CA82D39B5148E4D288037F6926E96F384EAAA0EFDACF2AD93F0DA4FDCA0BC5EC0F0D7C0E8DADFFAE4E46AE96A6511735A80E EntropyInput = 54DAF8EAD3ACCB382CDF251CFBC8644AB8BF4F99693711102C02B2B6920C25C84BCF3B02DC3E130F50E89BDF2CF752E2 EntropyInputReseed = 4530E0B8955190ECD3CA117D2620A0F5823A2C7C6F108A72AEC69AD59151C8EC Out = C9444A9366764F89EF3226EE70F618492FA9FA9A1C96E53EC817DEC9C4C83FB6EF7FCB2CAE9973293EAAA596CBBFDA4C3FBF2DD91253BE2CE6648C31E2AA92315AB4ADB911AAAC15B56A273DA74C114E1F58B37B4705171C4CF7C74523F52E721F11BD8C37519995E0D13C190D7E586CD3E3E9FC2DA948C5A52AA69CDCC842DA17B494CB330FCA9D8724965FE7BBC45CCD877214ED4D91711A4ECCF9328F7A2E393CF59E69BBA68716AB930D546274A9D7A63FB275C20712DD6B631B693373295311871921C52E2EC546159D92EB15133BDB453BA54AEF09C4790A1B3428B44475EE8FAB6DB2D5A8AAAFC046355EB6421DBCE2F9283A03B4C373975131AECA69 EntropyInput = FF39F17EB0BDCEA244B3B5BC1CF197751430EE97D66F0FF1A919080089A1146C9F8CFB8AB26801407F1C49C0CA757FE2 EntropyInputReseed = 71BC8A2A1777BB9B01ECE0965F262E4B4DE41EC462DFCB8F679F7CC491F79A6D Out = AD2CD7AD68E21B34D2643A804652EAD4058A3AABA9146AFB305411E085C8CE22B207DAB0A3215B3535433A916205F5750DC9DEEC19402BBD73CDD3FE8F8E0CE50D89612F886ABEA8003766A00045CF105382A450BDFC9BACED9C8A5039B2EDCF8EDA96FEAB60E417809F5747E261990D7C0E122EC31DB5078865BF8C338CA57E0563065C1A5A448D43BB2AEE50B1C8C6F3C25E71C13BCA5F739D1E9F8BE540C298185A93F2BA8F5ACADFD5218BA3078DE68538212496597B47D6440992FA67F8D618AAE20BD8049255F7C95252A752984E56C9D92646C0B45AA2BB435B63E4B8B1956B6DD8632A135E35CED73F59566BCC60114357FA61BEC7AA371BCA048077 EntropyInput = C96C30FB0044649DE8597D4E9F3A03B10B65405B03D63B86A2D6891936CB5362772774068A769C23C8E57B3AC232A6CF EntropyInputReseed = EAD2D35B7A86ABF21F785A9377E2489399343233F36228D0E3E16CDCC25C5C08 Out = 9D947979D75536D82FF72916176A4FF592F453927298391CEFF9FBCD593B0C857A456006AF4C90AB2D8362F47346D00CC423E0403A7E87A992097DA7C632A17C2AE0B6D5DD202F27422EC2F44BAB14F44C317DD4822B65320B97C78C8E354F97F372749CC80642664B4218CE333AE2B68CB6B2F799EA74DC323F8D32622BD599A540ED4A37BF90FDEC9C3BE4A4785E48FCB9C086DF06223B6C730DBED6E45C3614AC44DA663815F0E15FA2C0E55480F6C5CAE265AF4F986B0DEABC898FD5F2D3C6E481D79230852F42E8DADCDCB904BEAF74F407D11B4EB950A3573A10F15B3E6DE00F7CF5277040E35298328A43A912C25FC6827EF650949DD4DC4C8AF19D3D EntropyInput = 0F2BAC45B04937FB27544F0B74C62C4DB6C52FA2304D44645638CD71FFBEC97CD217F0A4B1155DB8074EA70C4D9E3796 EntropyInputReseed = B97EC12B54D6CF13AE48EB94FEC897C9B91CB7A7234E2B11AF8B2A508B092268 Out = F242F1EA71ABAEE0D6D8F063897C710FED9E1ACCA11CE122B1033C8D1427D0C9D1FFCDFC5E6C3D28DCEDAE45F116C173F613BEAD98A3CC291812796287DB0EB17D35E3DBFF83D22214A40BB089ED91409695DDF21A9A8BCE5CA7D489FCD6DCBD7DA788692E8FD5774CDD04F1E827B02C0BB8993BE2D95869A4A4B93F65C9C315EBF3268D39502B99B3B3CF3DF6F8DB24F2E131E73A38BF266849516F0A6C8EE83D8898B0642A58DB2A0F03B5247B12E27A596B8FF6B1B4E653C315E84C872508C748390F155197F1AE9B6CD4C9761B8E793AE9A39A2CF85277F2D149E8C8845FCE5E4E58A022556F99F684C2236CBA585AF83675E775E5E0E6071F0F7D31573B EntropyInput = 1267F77731A651991B3DEDEB5AD9921E86C3A8B36EB5610D3928656EB3162CBA2426FF2A9759C7079DD53F4A10DAA3D4 EntropyInputReseed = 3AFE331EFC902642751108ADFEEBDD814A1E484FDA8C370554DA529C738C504C Out = 5C2DFEC7D8E444533C1D3316D0A937E59BB479F217C270C329A62A21DC793C44145516E2A1B3FE83A2DDD73612B5D66D2B2BA62F303B6AE666D3E93BA06DE7BE7BE7244730C0123F93FDCCD33CD3C05BE954EE9C070D97E63F0A4FACFBD2812DF09A5EE628174785CEFB781C6DD4595D00DE5B52E364F10C15F33D8EA8EF20E049F95AF60C4A61DA829AA7200E55346C3AB02F6A17F2362E5C205790BE7224FE67EBA8CC325E20E93FDB98E00088016A7205FD29FF3BB441124D3FB0B2185069FE272DE389BDB27C305627FB02F2AD0A5167EFB4C89775E26C443AD2C15B0671AB070AC86FAEB7765AB1584D7BD56E178316C77254D0A7926B58C354760BC47A EntropyInput = 46DFB4E82FC784AD0094DC81136834E5ABC767FFF2B876A06B1DBD2508DBED3A64D40D3886AC152838F6853121FD68B7 EntropyInputReseed = 329004B8BB439305C4B2DCDD54CA97A4F54CB720A8582CDC03AC26F8A603F3FD Out = 1887EB4C57B63109F7E446BF0A6C598DE093A6013009503925D620F40CF98C8774A6C4A1AFFE57F8E6B190D0504FF4C4EB55BA4E8A2642D230EE845ED4E31D8ADDDB1A21DD45346CBDA9884A322E6E8F38A82E888F81264A2E254EC2AD5AD4D60A162287E48BC39776EB57DCE88CFE467B042D037D1B06877ACC39F31B08B1AA13805FE0440A3506A7F59DC6E2376147ACF87B78BBAEF4C15B579335794688D142EEDC231829A34A5C6976E0C8C4649EDC178C8F7D8F9AE92F05E3D54DF6E47CF9260A5A582A7D3B0030E9A5DE912D0F7E4D3103233DCFA8DC0CAEDDF12A8502C7D941DE883690D47BD1A1B61D723ABAF0C31D67136FB427EDCAA9526A9DC9FA EntropyInput = 1365BBB06C99A5A2AC5506671B89A98208FFE8CD5ECEDD1638958E4C8DE83CFFB3ABC3FF4658A9F08FD55DA729205F76 EntropyInputReseed = 7C1D5A6FCB0B5ED559526D008786025BEE6CA6B0744E7348BE79F9797640CCAB Out = FD08E2B6F9CA3D9973D9303C37BDD6B9AAA95C740D68F720855FD531F942B3A869765E5EEF8A5F3C2A43B818A60AB0D4DC9C975267E48C4F68D070D90E835225D93EA4911F1CC12C0AFF1BFFC27859C8D013AF86757A835DF43A35A74A29A4BBB97135600FDC6209B834EAF02827408D79F958F47F90D3D31D77F3C771F82B6771425FC21281C4E9ACC1AB94A6F1CE6AECAEBC4A5E701BDB9697F52BC2CD1DE627075360161B0292E609913287139CF182A9AD2DA026EE419EA7234433D439652C5F47FCD1316D795D487692B793390AB24D93C336A9233FA92C148C7A4230C0649B13437DC9788D0F2C6AAB9AE976F3E8FA7845CF90938BD99EB6024A31E948 EntropyInput = ABF155BFDC53D120955DD324F396EC654E86DF8C95D3A727ECF8020ABCE92B512C844EC3D1C817D5584BDF0ACDE70B04 EntropyInputReseed = D1813B7DED5F4B4F67A2C70D0282D2F413E1D7E4731EC82D1382147669C9E2A3 Out = 246D55428F18A85EE70AC48D0C571F2AFB57749D2480C254A4AA9E95C2627BE4057C39219F1920D8AB8AF500A952897D3716AE3E3403A400A24A06C0BDBABC6FD3F739BF038DC68149145C6C0FCB97FB6DCA0FF5B7AA696127FDD1524F738D6ECD289CC2C01F57B0B8803219640D2B934D4DEBEB3A01B9B76AD1C434E415EF65DC145DAD86F937A97B6CD143CC57B4C8E895D15CEE2C090B89ED5876E8BC59FE4014A094A3308D6B435F5882EDFFC43386CBAFAAF96403A8CAB35A64AE4C0871C952166FC6902D4228E37DECCE6EFBC56DE93D323A7C3205932A6323AE8D4266539D8182AD934BA53C34D25558BEF06AD72052744D6B941731C52F3CD5BFC750 EntropyInput = DFC8ED902D53BE17F950C1CEF6FEE2D442C56DBE05BCB948EA52EA96C072AE9FC87A36E097CDB4B54F9C6D78A39CD587 EntropyInputReseed = 45381863403B4B489DA67954C41006479DD6CB8BDA88B60F792083C291BFB369 Out = 8904110642345C7C03E1F6F902AAA76339F4B1F29639FF6781891B77F819B6C4D6B6EF93434157285B1EF036F080DA7FB863DA7362DE4ABA00A8D298485C5713BC00A4DD0A5D031C2B055EC2212F71CDEA698ED1B85622FA6EE40E1C6D61C8ED6730BAEA822A6E4604D410F4B31DC84E07CBB73EB408A06524DC7A175EDF9AA95C46FCDA406FF473EA2A6EBC69F21BE125D961141A22782BB8C971BC126F0867C1D57506BF23DC606D0DB368A2465F57008DC54B7F14E67E06C2FA8561AB05FABD810FEB805BA90F13BE077B0C2BC7469E8EF7EC3CE666254049233CF0C15602B1A4B357A04EAA6E3B319F10929249A533FF9909DE6F3C601F00B6560EB1739F EntropyInput = 31644CDE0263B5630B9BC08AFC6FA5EFC4D4536F7C5F5385984A736085A4C0DC2275B106343248169DF29121CBC3AC23 EntropyInputReseed = 3F7034F880ECA499512B9E8D360D58A55F7E312F5FCFEB3C6A7F945D6736A3C9 Out = 8447594D8575DD82BF7DE0F9B31CDA696F3593A9506C4D839FC152DC92E7B8591B2B332CD53CDEF71593A8759A39E82CF2F717C9C9F1FC0EBF655A20A5EE97705CD368997FAE44AFE2B149CF6622B73AA90FA04AC4566F5F774728B5E12D24AD272F61A63B0A644B9D30FBC263AE94F395070F193153B89BD312FAC2AE002C6EEFE7688A776ADE10E8ADF770036C3F29819A1DE24A0C065F80AAC84FFB1B312B9D576B80B0A489B1D39DCAACAD7539AFBB698C8CA870BF9134DAD34810E161AF1AE3FA017870AC8BB1864F9ABF9B7CE13CCB204D6039ADB39EC46BE692C2601994B763A229811D73F9E2B16A8B437CD7A5DFD013DB5A9C9B919E7D9466C2AEFB EntropyInput = 0F03AF6D18D305B989E2690EDD50058C7C56127C1229EC4A9FC52EF8185D62D5F44B9E701C0F96B7E784DED671F6331D EntropyInputReseed = A14E5CC06D5C3359D3E9595B5CE42545DBC49B9CD5585E7A813F4AFA826E574C Out = 96DAA2A46FB46A6299B2D7A7DBBD3967A898189133E2FC2172BA7BD53B8DF5BAC278A4559ACB0CBFBD3B6E6648FC22F7E8DE2A159BE576C8AD50F803B6B498F90BFD4AEEFB5CB52B5478C4747A664D72FA214B2A025DF35B989DF592F098663168B7DD8CF0B94F1451005A882DE929109EFFB924ED2D372EE32742707F330966395F2B6BE235EAA766CC6B2D45CD9784399591FF51A9ED8BF1D8C6451BCFF8329FF5EE5BFA0CE3187A1FFE4577E5D212B8AFC090C00113A9B93F21252E89579F88424C7B0EC7F705F21DF18D819B680976BFD795CEB20BB43E0F3FD10889DAE58D3873CB306C2A959DF783AD325377FCF65CA780AE6BD2441A309347FB84CEF7 EntropyInput = E9EDDF9412CB854E0BEB96A2714EE3BA41C313A35D843AC284DCC71B30FBB147C02AEEB8281B512A965475166113B88C EntropyInputReseed = D2166B6E9A5EA79674578C41A6B78DE7BE4F28430EB5028019B453FFF7FC58A8 Out = 918A0403149D2EEF1A6AEF6F4B4EEADB8CC3982001C414E4C045E2752AF4A74591C6851E204804721279B2134703C4CFC98A851E38F13990886973AC8E0AD603330BE3F6B1C755A9F37AA17BEC0CEFAFC81FC644DE4A8D404DB19B2C8A0963573AD84F42E81D1FD3CB4AC6330F77F32C3700A7925A3D1B4E108D7804BD8EA5D4459D8EF26BDE504D7123E5381299356101776F544D432319CABCCAF7B0B4D4DD3CB98B2887AA1AD681DDAD47424714DCE82E7F53667F589401D3441D32337B8E3055391121E4E40EFDBAE92DC90FD9FF162A7BEB56CB91DBE3AD559F65E36FE01B652797A51D26D55B0227B4E3AFA9E18F93A33E6742443690969FAF1AD26141 EntropyInput = E7EF7D8BEE8395AC2F05E7F8BFA4EAB2EA45287DBA510A1E5A5B19FD7472329DC957D95F7DB628D56C7CE3A3167E8079 EntropyInputReseed = C01832B33D7CA32CCC195C32A8DA4523340789B69F5FF55B5BEBA33F3BD6490A Out = 41753AEF5D11EE0CC41944DBA9159AEAEEA36421F13FFDBC79E223B2036870C5762BF215DA8F7478F837D513AE70DE4DB7F60BCF2E84B28D3CFE3A4BCAEC8A470CDCA9083C5FAC8AE7C8347E9B4C460BE369F806642722C1E6710935BB678A1D34E39B7EC019036EEB547C3607D4AF97AA713BBBA96A3412338DB086BFD6240E994A5BA8CE5AFBDF8E31179CC6C8FC46485B39A5DE537E8AC8A266F48016C0489A35961C71DFB4C2318B01EE0AFED1FA751C7ADC0540D88A7B07A1F105A5BAD8C326C6A02B12625FE9742F76B054B60BDB960E4727780ED80A8F938FC4288B20C4B884D8F4FE34F1FA3CEADC0066A4526936D0A7CBC4D4970DFB3EE60DA510AC EntropyInput = 0A8196F28F54AD48FFA372AEF2D962339D7D6DFDF2C34E44E5193DCA30F2F594BEC5768C0224780EFC2C8D025BBC9378 EntropyInputReseed = FD697A37F903C09BF2FB7DB47522161775C9467CCFDC7C79F187FBB0843CAA13 Out = A6A9DFB667E5F169E6CB6E40FD9AE9E280BF7E7D047F4ECEDAEF551B97C45DF5609A10A7437875ADB9B3D85FB8ED2E816CAA81CEE7CC5218FBA4E3091DB947A862A975E8C9547AB0BD9CC30B5931CAE4315AC3DAB975023B6AB50D6D78031F90F7D8120776A9332C2BCCA4DED6FF93B3D47CB9EBA3886F65CB61298E729D276409228A706401F037F2E50F832048211BC615E24AE0CE08DD76188D2B8F74BCD87523E57E9489D85BD63EC7E5B045C9FB7232407315F812A71051D24F5066199A166F9F107F070A9BDE33F0FF41E49E56C6590D552DCF29C1C47CFE4034C0B2DC4F934E4DD451D902F6010D28A13968B6682F31DF002BB835EA22E79C86EB1CD1 EntropyInput = B67D59466823441123CE4A471D10C546EF96E96EB8137530F89E189FA32E0A50F465A0B441A15BE5D9EC38EB5B77FEC3 EntropyInputReseed = 0E506BB9C477B6C60C7FABC8BD0496B4B5C7A2BACA050EF1C9FFDD331EFF1D5D Out = 2A4FB0B6A7E7F9669D466D724C8DFC0CBB9DE838829BC99A494FB543BB120B558338AD37D956F2601CD777A2E50B17F59A61C55A55AF973065712372A3F7528D48BE01577A64CE351608BFAAAB84D799E711734A39C6B184477499537866A9CB0028CBDB8DFC2F6A383CF1E9A9C5C81E0F444FC09A4A170302D945BF0E5DC9F49BE7EA20D299CBC0BA70B683A6105ADEB21D551ED09A2A1C1974104E8825172B4A85EBA7C1E68D657596382E9A06D7B1993D657FF3DCDC7F215ECE3FB86105DD437DC0FA55E167E0E8E3943A51538C55785535DBC9E08C7C5696F5C00126254C72EC127DB47B2006322B9763496A7CB4349ACB521808F4F8113E400577E13E54 EntropyInput = 12738C0DDD0C9CE0393D2ACABDFA592286072A362E332CA3F8C401F01D610026B983DCFD4AF5E451F6EFE155FCF3EC14 EntropyInputReseed = 07C8B69898CAEC3A1104E2E30B811EA095384CC636B9BD24E0F9837D3B8E0B4CFEE06814EAB6E55CB799E815D84F07278EC6C12D82DEA12E261C5B72D0A4EAA5 AdditionalInput1 = F29287D46D517F090DF11AF46703D5DE778028C787A3AA1E5904ED737B776912 AdditionalInput2 = 0CE576CAE56C46042FF27F9F11ED88F1BA534CF5F2581E5AD6BB69B642897886 Out = 6293103D028540484C262770ECF7C47C93E778DAEDA0A5D17A838A5933871AF041AC603D81C4A8D73F4CACFF06CEE74424B57E8440E83939509EA1861ADCAA29332BBCE015C2B4D6C74154B52A6DE9B4C5EC9EDB4F54B7BE42142B9BE07BEC5052B78BBC4BB742EE89F0399071F49A73DF87B3FE762D1656346C9E8BF8E4B4B8B55E4E1FF23662B6586BF0F105E9D001F1593C175C9A234CBB17CFDAFD90BA85F347CB79B0046FB5715BBF35F08345C8FBC26E4722425F04BA431C48ECFFCACF15D09EA5ABDA92F541E46BB63E3933A2C053BE4565275D34FA085BAF555F92F446BA5E5D05FA0C63C53042092CB66C406D9B6B36B00E76D51B49B75C36E41E52 EntropyInput = 86928F1ABBB77B7FFA829331770A4A6FBE5FA6FAC56E5CB5314F2201B0A11C538C5DC3CE04FE9F323F97FD1210E0E3A3 EntropyInputReseed = CE84BCF3FF537F32E7FC9B669CE61E8A3A9EBD64A819F264FE472CAA7E7347EEE8609DA75AA3547750862C4D9B2E1354BBD03239F86B4A661A212B282946E90B AdditionalInput1 = 8259AF2F80608624C8CA7B29E7E15160C4D9FF42F2A43A089EAECF524A6E8A39 AdditionalInput2 = A45B6E9025CB6D762E83016240E54ED2677319E8B1F1A32A91CA93D1D03328AF Out = B33CB571912B3AC3EF41DA5929E7272DC6B413DD319E8F0D7FA5D77242D9203D834C64D85357D07B6580C9C04DFE4BEB57B63F9993B822D9E8CF119F1102AA2D221B5268A5C2D9F789E8A05216B9A554372763D7339262F8BC332B8F44ED9D7BBEF98C092B80C71A41BB0AC67289214AA1861B6794AC35AE32CBF43BD895F2556BF9E2B911ACE2717A4B2DB2F9E86800CE31840E4C8BED287B6C37B3E20FA3BFB3217AECF2AC35A479E79BAED018D2AA339B952C34C8DC058B5B235258D749E967B3728726348D51B6D26F3EA967897E43876792D00AE763773E8E0FDA6C5BAE65B325C8DB993C8E6C497EFB84660323A27EBB1FAAF0970FBB192AC20F2E2A39 EntropyInput = 4E7F19F3BA09B263B35E38E22FC91112514F742D7F964A5DCDD7F8B7FB3E0A853F4B58669F8B8A8FE5BD207497DF86D2 EntropyInputReseed = 0C512804E4A451A5E4D87E82C6CC421707B4298F201F85C4720F312A8B4285CB6AD0ADFAED80BC62E6DBF754484A92E176F90BBDF7480FF9CDA825B9C6BFA0B4 AdditionalInput1 = 8BFE2F7A03539F48E4DC0D653CCA6DE9805A7BA879A34BE483B38DBE9C9419CA AdditionalInput2 = 790EC615C1BA313F9108EC1BC5ADA3119C2209EB5594ED7B8F90A552D3CA9285 Out = C6069013F4CF0A0F4DB69B889F0772B695D23F88F3E00BA05E9096AEC8A7A0C6B513E0A0E8EDFE6FC3D4DA00A731C342795B9D0FADE11DABFF6D3B08819FC1A9A4DC7AE747DAE9826B4CC17D2EA7950E403E631E99BCC468863DEC9F6254AF4A6E7CE654510CE94D47C1E5333F04B49965FDB342D40B2CB17843D9BD0E8BDA4FE042AB762C001CFE4A87ECEBDE9EE8578D8E94FC15FE3DAB75507A7BC7B8D4FB1A8C4E0572366BD0EEBE5D00C35226BBED66F98DEE0E8F1F5E66D2CE4564A8F8E177F87FAFC792B174FE8DA11FF50DABC08D74E98797A56932BC78A283C05FCC5E58AD6A25E54137789919BF5A0AFB88C18657262966E3053BA8A3F9F69A107D EntropyInput = DEF3BF611ED4977AB5F71CFF6E01F3FA232D1B6F19D2CB4B1C38BE2EC4D61DEFBCDEEA883CE553E7C559CCEDB3D9F0E5 EntropyInputReseed = 05FAF2FAA6AB6AF7E8027091F60283031D9DCBF5BF7E4813D02836B3F48A29DB8050A5A1F696FDCCB50EED5E6B17B30577F1C668E9DB6CDDA1E729E87E535759 AdditionalInput1 = 3ABADCBFCB52E80A34FB3A233D16215629EF3C340152B9A104995E864E92BB80 AdditionalInput2 = CB9924DAB421ADD1704423143587E7E947DA6FF02465F52085D06264907FA903 Out = BC73AC698423825DB65F4A140AA45038D3EDE0551958C6E6FC08D657A62EB0EEC325C3519854C680D5FD1AE391D9B873138401C282709550616029523C440C426A4FED6DEC44EC9A7F12180120ABC661735F4A1462574E2BC71AF6E374873200419028157028830AB8EF430232EB05635D3B798B3D11CD8E51BB697E48F28E89EA3FD907CDBA0D11965445FB42E68A1BA370CEA93981551702EB9D19FBB0015C7FB1705EEE05011450A3EB4D8F269030B3358B977A45252444D9DA300D144DB76B39E139A9C701C3EC2D138D07C5E096D28C1C394AAD5265405AAE248E02E9A8C9B7B6801B2710ABABB2FDF155EB75C3FBEB102E045B3C75F0BADA71526C22D4 EntropyInput = 8982DD84ADDC012BDAA8A971CF300B1C06B13C69C2550578FEC79A20AC490504CD43E274A1FF26360ACEE0983B6E93DD EntropyInputReseed = 691C445238300E2962D3C648B03120E58232766D3E5857FCCAB2ADD7D1D09024157C9291F54CDE6F038EA9DCFAD7E7E61A4ECAA154B2DF20077F081E840F123F AdditionalInput1 = 2B5EBFAC8AE3059275ADABE90E9E7B571C1225BC7EB74EE67AA608B4CC957AEC AdditionalInput2 = CB494CDA5BC98E603CB18476DDC0DBFB808AF8EEFCC48A8AA7AF7DF7CB04B164 Out = 56983CF26A10E49FE04603C970367F796BDB709ED8F9190222293DD22B21F9382290905557F65C3C21023777FA14F3208E6A8032AA7D43AEDC606C2AE90DA6014B467E4FC6C5CC1F77A4ADD01B71EAE61C86E2F64B104F65EE34D6438849EDD0B24A671E799F081432BC6AAAEB8416797292F19496204691BA8D2D82B70895E8A1083898A7805B664E48005BCE2C048AD47897DE0C6513C0737CE0CEE075C05CCFBB339B7BE9B72D54434CFC6E636A39F3F2F1AA84C82CA05D59915740AD2AEEE1E06ECC410CC2943F460C62C2BFCF102A4840CC1E09320765C8CE1CB00C8C0A2CA428E8C7D819B79F5AEB969F32B91DDBB2C36EA8586CE0D2B92C81FADE2C61 EntropyInput = D3D5D06E3082E833A90535AE9A47F1559E4350D64B972701A075750BE284AA788A969F45AA64E931B649E0607FD22337 EntropyInputReseed = 2B154FFE1A62283E8E39CBE51C1EF1B138B1CB8D54B56B758E11E997487393CBC732D776070C0C0CF0F1CE35C9C98E7B7662435049C8FFE3BB16CB8C46EA6D2B AdditionalInput1 = 1FDC6844A31ACD4B7A2D4C54BD15C18C6960C7EFE19E7CD5C5B1813BD4726BC5 AdditionalInput2 = 7FFD75675D46432DC4FC5C3C3607065BBCCF4E64ECC31348C6359AC6E8A5776C Out = 3C2E559714F02BC753EEE746AC11D5009B6F884B1A8D153C8B30ECC2F778893FB143CC567AA871443D5D6EF752BB3F22190DC0ACB487140C3CCCC4090A932818C00B3E917746F49DE0CB66466B57010FEE86341C8F31528E7ABF18CE56939F28FC7E79C55D960B514AD4BF7E01EB7A1E6FA78E7AB5DE52DCA06B7480C03C445340271A71644E7AF4885FFE9B6F28A8F34305C66045716E91D4CC49C2838090EC0C4A5529F66B28C0280F023276258C525887B65674D050530F1AB1CB9D8F6CBD616A2E91268A07B242DD1E32C6A4B7A6A92055B610FF3414D6217B23400C40D69D367CE78B3115C74C9D542E14D6E7E96CC13B5AC072684A865E20D78D85117C EntropyInput = 0115ECAFF77A46A7584267CF1C2FA72FF4E4AEE5724E97774F3F860C4EF104771288E41249A9796E6BAAA85E6200EBEE EntropyInputReseed = 25CD8D089CCC270F28F72D8E475A0E6A6955ACB6E7E3B09698AE178AA5EA5BC9FBB0198DBA38DBE16616846D5CD7DFCFA5D9FB9198DB90FA3096CD1EB129C9F5 AdditionalInput1 = 8808AD21A7DD714522168AEB1DAB10F1948677219E147EA937408B5ECD2CA508 AdditionalInput2 = 232A642287EEC6C5A04F6C821A2AB122C3EE71ACD0DA764423D11D2C46F2E397 Out = 34DD82184E4CBEA30088C8B55B4E314CEDC7B7E872614A078387619929D25119ABDD30821D51A259836C6D42A7FCB705CEF7FB0949AD401BCA348751FA75FF3DB82051125FC0902A4B66E638490AC9B0F75E03938420A791ECB14528997A8CF9BB14FE9B15CF89742107219B23E99E573E8A3DECEEE698698919206DE831C75E0997EA33AFC1A73B7BCFFA8ED4C033B78321F929CD0F059D5CAC659F48C90968C32AE77DB213B7CA995504A533E73AF15367888BE856A69AFBD36724F265BD09381187D26807350F7EC5CAC84C953B117ECDF857B6AAB06552917FD21A5C1C78A1EE94F0BB89F3FCFC6F8AA8050E430586785E03298ACF96AA8738637D748F54 EntropyInput = 62F7905E8DD900ACBED20343866913AB732E973A1C0C11663379F78613059C26217DF93EB4BF77DECF895F8D5791A2E9 EntropyInputReseed = F162EA729D424AF1EE410AD3AD3DC708BBF519D291CD0D9CB402C0F53422414634B9C6515C78B325D292D8392A7B8482F7901CB0E1D2A884048A111BC372563B AdditionalInput1 = 0B1CBA72D4193EA91424DCC3798B489080604D290E96D5698B2991A55651783C AdditionalInput2 = 88E3582A34A236F81C8109FD88072666B46A82BFEFCAFB5E76D2680FE358E8F4 Out = 73825BE33005E4EF371BDD3BE317644F3A0AFCDF32EA8E10141F0719969E9F2735B88CD331DDDA057B441016F809D23D9B6E01D859606BEDC8294819CA0A90FD9B71B58A7FA6DE12CBAB6FE64CFF42DD003D771D286282E7FE6E2756E7E0D16F44400F2A2F3F694F78C7A2044B7CC97C3FBC64CEAEFA5F20A50685A14F45DC2E5A06F5FAE5648DA3E6D2DEFA401570854F712D0DB0B8A8EF056716EEE4E04EBE5635DCDC4DEBEDD758AADBEEA52DE71EA2E3E465DEBBD77461D075B44304D8CFACBAD80F2872179B6FEEBBEA34F927BEFE3A8EEB2D9E676EC2ECE7F852F0946AA3552DE526B35614397B964031A20BD18EA522F10115C7A9730B13A48208AF19 EntropyInput = 246BA9D0ABEF9F7594A7D0C725F5F90188251CEC66DAF1B5550AA00DF029BD1DE53D733359F36A1ADD88FCCBA69720F3 EntropyInputReseed = 2130E665F11888249FCAABF9703835BC6ADA200C0E3FCFC7F168E6A0D729961625589F2492F6830E19F127BB7E888DE4A84AD347A349ABB85B73AB069FCCA875 AdditionalInput1 = 6C7FF4C1C37F2B4662269EE782C22503F5F40DD025D5178F5393451B538B6612 AdditionalInput2 = C9047AC32A27176006728F642BDD8C54AACEA736954C2746BA766B48C06538A7 Out = AA421A743DA777804EBA7F8DAE95982F04A9C7D285306D739E71A4ED0746E8AB576699084271A503DC07F21D70927C442A26113CF5CEE4FA4CD4F3714B52A6D17C0EFB71DB1EBB492B7C7136297B79E5C2C25191BFA0779746FF39FB0B439ECF1DA239E129050F301461DDA86A444E8E2547D34ABAA00259C006AC43DB43B0DFDC9DF824E802F91F128A54D2C4887782BA8A9D5C32E6B740CE3A5FD4147BC5C76FB88A6B321CD01C950FE18B15FAB8F3DB7C3CF02C6734AA887C21015E713256B01710CB2F557C4542EDD8C96F24D33A876F3FE97D013C608B53839FBA0B2E09439855268F144536664EAA8E8CD1A8E3A3CC6C1DD3E234661A0ACCF44959A989 EntropyInput = 677226742B4CD1B68C9D73DD883B9856A65A1F4767511D5FC9F84C50A048896A81922AA0CCF5E4659C254AA0B55F71AC EntropyInputReseed = 24E19F476EF3526D0CA2A1B5FED69BCEA19BF508D58F56B58E620DF5A4FC2CAF893075EA02A52B15446D0C8EECFE4C5636E37F894A1EFFC1478BB6D57022C9C8 AdditionalInput1 = ACB8200172FC8E2FE943C0CD7CD6F0AE415DB4C159E5BCA14B049F73FEC9C90A AdditionalInput2 = 78466CEF24E374CF2C57457732814AA71B8389AE368205F162807F3CA9D8E30B Out = 8F4693F3ED9A7C92EA60C069AB6C6D78978BD555AD65E411BE2F82BE9737B61173E568B0D4091BE5D9BBE647D6BC2194B772BF910AD8C655986A939F062E3CCD350E4028F79D1F21304902FC6E7DF2A3A9C2525F39880D69F9B8D586F8453881E00C152E19275D4EBBD6FF5C6554A9FBE8CE9DCD1A8F2F46C96C060FF514106CAB35F562A20AF95BC331AAB69881B15F88656C26BF6A038C3BCFC93E743BB20A7E03C7162C9928012CE05E2988AF33994BCAEB0040B3BB551DC45030792AEB153328981F3AF2834791DA94162B60D19D0C9D47C5B07859265AB2323975CA0BE13E1C0C40F185C16D7313A0AEBDBA000F9252037796B792C5B41512D8C19A6625 EntropyInput = FD53CDBCFCF2DF211E60EC1EE36D20025336C374554F97B1784EEA57B4A7C4918A7675A97B647B210AB3915C5FEC4055 EntropyInputReseed = EAEE2B7BAD5F4C9A3E2413DF58BF99BCA27BF949927DD50369249B688C9BDEE4903314983ACC8BBB1331E9CD7B63AE250D1D5B143F465A0A0F647270630CF605 AdditionalInput1 = 602965E9C960A6C83E406606E5A1C1F4D040542D115A952B760C0651E7505006 AdditionalInput2 = 2301BA3D7E851784B96DC6035768369A95140F681478084FEE367149D512AF49 Out = 2834A1730015476D75ADB217139335D7CD1806B98035F4622E724D33F36F39E12D94D4C21477A5354D78DA398E548EE79DD8B44B9CF15A5B2A0F8A7C7A03E56786E24E2FF63DB6BDF738B794AF86CFC6AD002F523426F3C14B5059EE407D5E5FB79AFF737128AA3F4D79787904C7E7D74299BC108398890D21AEF5D9598559D80547748F2615D41CF7D0F1D7CD0D1AFE009FE0800B52475D4FA36EA42924E7BDE91C3217582B47C75AC8A065880286AE10BC60B4C90FEED2F91CA69BC6CDBC3B36295044B3EF80E78E831E10096D5CDF5ED44D72DDEC14A3BBA6243765BDC1FA7B02588420AA53F0FD5CC607800860E30547033DCB0E029A603A3E8E609D0C32 EntropyInput = A87DDE170407E1D8FB1B81B54A16FD756D7F788060A023D2A2CAAB457C49AC83E406582027245C978A215B66797736C5 EntropyInputReseed = F8D849C69EB5F57D1BDB5E28C326E8F18243C84C4A70ACB1558C6BA14CF2AC9A52C760E9F1BC2F9767BA3938B157C229093EC246252B82EF12F76A6849F95BAB AdditionalInput1 = 6F26FFC8FE0A558A076C228BB0794FAE8DE4E97360224B7C5AD250B8494DE686 AdditionalInput2 = 11AA928B074D500016395FCCD37C2D0F8D1111D772FFD5EC9D981AAE7545C545 Out = 94E58B641DDE62C03B75F77C9F49AD0FB0219C56F47CFC3086809E72D2DC3706CB5E76A5C15E8C10E7F7D469D61B7D9600E834B3A887CA7C8A7D3B355EBDF7390667B2FB3FAABC6835E1F59E567CFE44B4FE791F420D4DDC941C58F4A636E9BF40E7D4787CA138FFECB49244ECA04BE1B1B5B70B55A5BCEB2497277EB5C97C40007916A1A729859C74995E66061411C7CFBEC36B87BE6D124D1D3A5020EBD2F460321E61545D06AC6B5010837FC522EC693870CC647CE393EA9ADC526B74B712AC0FF0EA73D9EC9E8108780FC321D49942F208AD6DF65C196474EA89CE1C8C209D6E03A9587D55B492C263A82B20088CC1287ED5FDE9F0EE7D3427D6923CCE05 EntropyInput = 52F4D83D42CD3549E148C7AAB83D7323F582C72EFAA9918CD332BBA60742AE44D55767C0BDEB21B687CEE1FB5ABC7AF8 EntropyInputReseed = 9787755617EE088143BFFE012AC4F0114319823732DC6D8806FF5D71E591A33442CC6B60063E765B072F8DC4386FC82D57834486ED462EAB823A8754FC1ED2D8 AdditionalInput1 = 5F02795DB60F985B28849AF7F2FC3D6862DDEBB2FC68F21E3D72FCB19B15A38C AdditionalInput2 = 98E9294C7979F00DE4A0E69E400F39FE92D54C2440F9860C9331787544AB9D5C Out = 4A3C13AED52F3F21496A122CE2140D7191E3E32261E95639AACBCCC436E2FEAC345EB23724776C337108253B18D4806466DEE0062FD5FC5B418869FF66509BA8A7B10048FDBF7D6EA17760D7FBCC9CDE2B584FE5C8E810BCA7C4371C8F3CC24241BB59CE25B8EED068509E4650DE599AE918CA18DA8FD7CEE6DA3794CCD6A0D07451AC09456BFC799220C951D40FCECCC97C24DB67E38F877D5D7115DD6EB36323CACBD874A0A24CA2E590F4DBBEC2F920DAF7D514C03870DBD9F5BBB745FC8E64585BE948A3FA5ECB75593322332438E79CE7648DF84C655EFCBB6810DF3E45AC86A25EB894F0AA1914F440F6A768ADFF31D8239CB98DB2C012B0EA9B10ACE9 EntropyInput = E7FCFD714140C730F05F94056AEE6EDF2E669C50928D1227162EA9BCC74E41BA69619FF3AD358CFB3925CD35BD7BB8EA EntropyInputReseed = 4FDF69C0D9BB330A1A0F20FDADC6DE201A50C3DD6833EF120624C4B8EF3901231DA824D537F485D748DEE69938ED5DD2659C903C939C715B93336D7B19B80DBF AdditionalInput1 = ECA0885C2245B00732DD1EF09336D332C77C0099B6B1F1BCE2FD345FDC9AFF0C AdditionalInput2 = FCC1B56D3A2211BE99BA47DA10312F723454BF184036ADFBCB9DF241A80930A5 Out = D10EC5011AFC41856952BC4CF7CA1D3CF2C9906632D74FFCF0C0DF7C9EB77316369823F504BE4500D6E63C6A1116F24FBE12A7D3BCB68F90B2D5EBAE070FF4692DF8686CE64EB286C7A634FDF9D379229F2B8823F6420C6057610CBBA0C2DB6751E0DA083BB2084FCE26A24F65DBE1157294648BD9037AFCC0BFEC9FAD30F181436FD738D9A1B221E2F65ED2CCDE47C59122B77F45376F7109EA55865E3BE38C0F158074CAD321050C4656F5292120518B64A977329116FA654A55990C768BEACD71561A473F5D4E40330C9AE8D7E2B8A0A98304691D91C246E2533CB5A232D41FACB87A17DA91F9108585F0E67AAC4F6581A786C404FB33A36562B7FD914475 EntropyInput = A9333AD44E1A3EB36A4592F1153CABF8FA95ADFB4B896B9BE419B49158B680096EF8C46DB8B1212D0031903440022449 EntropyInputReseed = 5A3F8C882BEEA506D015ADD163D2D8140E9E070F1FBB0AC0A0B87B00841DABB4253592007E72C734FF412398A1DCA7FF83DF2AD3EABD6B20C492E038C47DB7A8 AdditionalInput1 = 6AE52BDE1DCCAC4CE8A2F3A801F136C6D07564148E9883D08CE7B0833BA2A34D AdditionalInput2 = EA381F846E965694D5DED4666AAE70877345ACC610D2D1782CCE8AE51B162601 Out = AB295D7451090C4EC15BFB4264707BB21AEF12F5C475B35B68DA09294C0F52369E5471FB568C0DCA5D0C302B87B2AA0E4AA4E0D7854BECF75D9AA6983A0D3A8BFF5519E15ABE8594DDC9D23B65E6B3085DA122EA531E89E3234B50A701C353D095AF7EB12ABF0075B7BB72485807581CDFA07BF2B19C4E2535C4C01E02045200002337E74742705EAEDA61EB3F3F35F9811888A167731D56AE92CFCF76E5378970A10D070016E06D33C67B646D6C902A23ABF348D4640F9A8FAA293D85D493C7E970717AD2C78A7FEEECC6BAA55DA70D966F2462347298DE19D2356863C73CD5BFC15DB83C202CC740D13976D9109C22DECC177FDAB3BF6362C7E0E39034BBEF EntropyInput = CDED7AAEAB1025A6053C12B8BCA197C7963DEE09F50C1CB9733411C72CD090B91FF77F523678C1926B2B11354A55510F39A7196A2616A5329C4B09F3BE521C2391FA37FCE954A1FD259BDE230C8D130E EntropyInputReseed = F915AC126F3AC6EDDC6F9B857B124363FFB53FBB664A3D7CB910FBF558B833BB Out = A4C97A54BE091A7F1B56372C08B4DBE9A160E59BFB1B38DFEEFF9BD8DB5B4F19714C4719C9127E8CBD24E783900E71A77B1A8303C886655D859A0A5054CD84ED1C6BA111AD13DC121BD0869B21712BC24224C7E359E2DE8F0933C982A18011856463FDB49CCA5C468026CE024A569C98FA3B3CC488946FE9FE07DD18FD75863FFCFAD32A2D0480E45B169F68CD6F31C623B4FBD3354270C51C494C614DCCC27DDB5E2F9BCBBC3FC397384C9237ECAF6B47591F6779A52AB4C0381BD7FE73444C20D47D5F25A4413F8068557E7FD2745FDB88A88D262D1A2386C9E84A110008ECD8CB9AEA883D4352D9E616ABE759F10C867DA1855EDED5A3EB5C4B20C95AABE6 EntropyInput = 83F9A0FB73A8818230A5F3DCF3D9CC0A6BEDB04401110CDBEE90E516A742C437138EF31719E6DE83F4CA1E2EBC8FC9C85A96EF191D56730840CD57A33366933F74171A90F2420555785E59EC5EAF8547 EntropyInputReseed = 7C4D1E16FF54DDE4560777583FA43C0F0DFA18B9C91851467237918CE921596E Out = 1FCE178DE6AB67429304D2CFE87B261B59D9B5A2F2E95517105D0C567E323F66D08BB6FB1F01FAA20D37AEE6C6FA2876743AC0ED245DB8A67157E30B66A77A29E1FADA8D4F43B5D2AC860A42B4899006ACBCEFAA3391DC73AFA1D807C379D0AEC26FE7379F499785AE21EDABC83FF18C38A49F1A19EB22C95687F465358FC5ED049A49D24E26F09A75C86C2F914E48BA415390331CC9F3DB725676F4C79561F54DD6227028485439C9265319FC26E02899BE979D6C9872D1E545C6D269412E2F009558B6E246F6C9AA344888D22437324554658D5A8BFD4CC6A4395F42D07E809D2485712610D7F3853360F6631E746F0EE4E7CE781B53EAADA81DCC4D3D5630 EntropyInput = 956B3CBE4EC45470C59E5A3A8309E66BA25BA7C0814708E892035976382482C9AE332756FC156AE540427E9FF65360192AB10D27481CF18DF5A2084DFDE8C51F6CB5612C2FED9F23B8B27D8278321437 EntropyInputReseed = FF252711680C68E71F1C180ECAE4D43A9458F2438ACA5121AE57CCFE1F85954E Out = 9BB320E95C0469A299F6E3142913054626D03824D8D270CA796BAACA6DB634E9953AF84476CF38735DA795A6F0CB3F5951E9B372101567625EDEFBED3F88ED276B0DE4D455D3047503C62645B552053C9783913CD1123D841BF747279FE4E104C5BA52A5D9A7216273B77EDDBDF9FBADDAC234E805598F31769241A183B7C7BFD59B81EE886D825CEC1DC7362EFFB7B195D621B614FE2A7CFBF62F7CE542155C2329BD514EFE6A668B0C958DE34FAD48ADD4C04C7149EE28423CF43353443E1856C95544170C177EF9D9553A86EEAE67260EC642BAF52197CCD29F4B8FA964A91174BF789C25F03D1A1CC062D505E303396ED31C01BCAA139E80695CF1331FAA EntropyInput = 0AA97D6D02FCD06EA2853E130831DF050CFB3740DCC03876C6C7255CA00D9DA8A51710DE7592BE83D5BB7B3C5D34B3247BA193937CE74F610EE87D7B0C0DD04542325F27A500418658F6F56715E20753 EntropyInputReseed = 077A38B211572DA3AEEB5FCEB398EDE745F8488CE02C7E1B8EA21D6FCF1C74B5 Out = CC5B2ADB59B58A558C736563158F58E834DF9DBB98EE624928C0C04FE63BF3BBB581A206D8C0123E353886404BF7A82DEFAF4BE8358572BBB978AFB845D198C55DD51AAE06E06593157B490D7BB590921F6DDEB3D591B08E8BDBBE10E56909A9C41FE924C6658CA6535B9B311631A3772342FB4E3BFAC1D7C98CE64E1A7D3F23A90721E1646CBFE8625747C291130FC82758605C47871993A16918B425C2C7AF164ADDF5C462591BB410D04ADF870276CAD74402830E097F9C8907E2206E1C14988155A14A5CB2BFED7764494ACC25CAEE75403DDF5476570DBC9A86EB0F3A960086B0CDABB132C6C4DA411514840CF04C3B99A304CACD8237613E312B2603BE EntropyInput = FBD5DD1F9426BB7E10DE90F0E9FC884F9A472C05DAE787ADE36675E0B31ED195DFE0B4D6EB50151938040DA17FA6346C3A2F42EC686E554813231EBD74C7167C6C6E4B416751E2DD050C374701A5C2F8 EntropyInputReseed = 934803AA2DB6A649865630B78FF54070839F40DDABCFE5E832DA9BCD7CFBE884 Out = AEC4FA0FB5B1BFE5E0EF3D7C6F819447CE99D93A48E1280B45C1FFA17BEF5A56638ECC831952A6B99B60F465A173FFD64EF21BC52C9F32A3D8808E08DAC3A12C937D04429376953D4208C678988F9C3DE1212B8062D414A25B4307FABF92A0CAB1A4484CAA818BE0E469D31EBCE47173F1EC8089CB0CE1EDD3AF28659222DE4BDE8279942CE94BC5139EBA0C9988D1BBE7424825F6AB2D1DA6B332843698C2682BD207B48917C36A0DCB0203C23341E8D2105582AA7BBD0EC9AE8005ECD7EC2F68A83B5255D50A3BA9651E8DE58496DB57C5539DD6E4A111618AE7DA639F4EFEAAC83DC7573C0D613A5AA8BDD9E43094C3DF6D88BB7304855CF1F013AC26B8AD EntropyInput = A88B6928DF0A330BE4ACFFE89B970670508E0326150C2CC038D2F811CAE11523C221E68D188DEB9DC1F18713C3BF3DC4A5757D89E6F84BC0E750B5E0A0135E6B20BF722BC46B2815D00347852F191A08 EntropyInputReseed = 8F5B290F277F5BB56140D6C212FC3BEA3A52A74AF202C8CA0570C3A8A4585CDE Out = A72E8E0B09DEA0F1C5CB820BC900EC2F842A1D9B1E341A591AD089DFB6540B75CE3E6EE47005FAB917ECF2D45B5B085AC8D20918BFFBEE8EBBB44F4AD2D5230FD1F8059B68EE1C7EF76A9B48CFD0A40927C5732C2D92184454A7F491F8B139B852B4A872EA7C538E6ADC772A512DF1A98C90A46146B85E34C82D429D5E63DEAA7CAC7ECC0E9687189CB9A068B6DE59172C8E627221F06E1034AED565926D5023624BC1EF8C837D5E90BEAE1E245BEE49C553DCB64752C66B647CA4E6C73BC200BD5F664A36C2376B177B02514A9937775EF50D0E173C0F5014F8CE473DF91005EDE04B4508994C595EE3B31DF2537D16E56E43F6B8461948BAC4EA0C4F30AD0B EntropyInput = 30EF002E66CE3312C47985D5F2CD2A193FFAD8F6070FD284CCF60A9BB495315A8D1FB622F6F0F730455CC4CE0B752EAEAB079A32F381448F9D00E4B6DB74FAC407FD7F67E505C6D65B71605FCA7D758C EntropyInputReseed = 4EE1212A8768360F831D3D60C25D627B7654ABC90FF2B03F2D4EEEBF1FDCF1BF Out = 758983F5ECA38D70228A0EB6F57DD38A34C7DE84E256E7D2C6F6BC820A247F1E2252389C01716E5DD5EAB673F9A62357373567365126D8DB59DA8ADC5F865579BF5770D215274DF4D5DB21E80D11811FDA722D896C2ED9A07DEAA08E10CA334DF2239B212A5E7265A35428D736E2FCB4E0258FC714E7E93996A37AC57CECB7C5FA9856370C204E6441E7B76CFC28098D732B92BAB90388A574C405018130FB63B71C9C7D19B38AC12DD445FE1B5532BBFE72EFC4CC19A8AAD8D0D7BEBFEE91E89048078E35FEFF0E8BA485E79CD52678513B874A6FE21D13B18360DDE51B2034136AFCABD8691641D2A93DF4C47C58E2A092A96FCB225DEB1EE00EAD5A5FB903 EntropyInput = 1997B1DDAD6CB23249F206663CB57A8D0A1189735B08F8699BD5B1DAFD0427A4CF4B0353F83AECFC8CA12D922214D605BC4620E0E20A0CE9D7723885AE20ED54B23FAA97A44784EC247691C089DBABBC EntropyInputReseed = ED1B1C4FC0F6D3C85E8907B84C80C5D374A0B342D5FCE42CD916059F719346E0 Out = 9671271486CE0C060FC060F26F9A31E0CE289EE8A3010C75FE4E8BF0AF31E310D554F9072F7EB79B335BF7E64B2D115962287C72F0191533520B21BD90DAD61CAE7F2D61DA830DC8215A1122257A241EEA7CC11264A14C9BCB64B61B2E9D7668E54D20F9F434CA893E08681F3DD1DC19C4A0D459C239C6AC57EB1966619AA84EE83D1E9CBE970E5CFC9863E342CC8B156D494048F23C8EDBC3D76307823FA0CEBF3DDA09860D9D81211FFD6BABD31090330E0675FE4D845909DF5F44D63506EC53ABE7F6236D69B0BD471BE4E4D3D1D4C23BDB1A52450133A8F4A549705AC13FD8575108EDC2317322FA331287615E10CD7CEE10469426976ED41C6F0E8995BA EntropyInput = DD7348799A9D7DC016FC04699E44886C98ECCF7D34D7CABFDE856FF75D3ABAA521E83444C2410418805E81507AB83C3432810AAC89887C36ED78D5F6915A511E231F53C04E88E1B01D832CEA38A2AB4C EntropyInputReseed = 3D1286F1AA0D00193E35A9C2F11F622899BE74CB59ACBF9AE45EC83E4BBB475A Out = E6448C5D3553B93714DEA92913A41B4FA7FF6CF399DAB474EAE41E129D59F7130A3D6CDA782E316C3419C85CDB54359D05EFFDB49DACB1BF1D6C4F89E95788D7DE0041AB280C74A116414A8120B81241FC67ADC279CDB09C998DB148AD011C756D2E2EE85D319DE55770F25BCC51777A16BB86DA74D0945C3971F6381B70683B7B613C6D5A18650743C1EB7417153966B448A147F387D384A180F1E0ABC2F4EC02289E423155D86A835B1971BB4DA4EE24AABA9613AAD499D39CB86E4C1A3C88B281DE195350CFDE2BACE386EC3C5F94774CCA8451A7746110B990339FD0C73FB9BEAC304D4AF5FBC85C94AD94917F5EDA5E212DF55EED4E024C2674F17459DA EntropyInput = 4D9925F56B924ACF7C869DDCAC7D5D4B1B1C862E7FFC858D06304B6362F8DCCA20B87E135C834D794876F80E67756CF38870C5D26618D98689F5B7FB84ACA33E8BF50D0BDF2C64141857C6BFC35E2520 EntropyInputReseed = 56C166C1874CEBB2E8C9EC74ADD6107B949181ACDE569D868954C4563415E11A Out = 8CB84AF0FD494FEC219268F1A6867B0380E0E5C496DE5C4751155772356AF521F85C2CBDD54A1C9154C5476C7E9125BD34C05BC05200146D1522B2C62015DB66E0B85E70E76489C115CA9EB299D31E2FD53A6FE42F6C800B632211C5BF44F45543554A6C64CCD425163816E1B880922916D22355B0921357DB8558B0045CC210BD9D54B652504283B63C04FFEC37A8561FBD92D5A390008163B65A7A1253FAAA6CC71636BB0B6657ACCB8B170ACBD415213B462E7B082FF2945C3EDE37DA827649280FFE31C3A2F1CD0106890C54752F831FC1ED11287D4D25807E6F3FE1D3D7DA55DFEDC8F65D7C3B09E149E424DF3A06380EED8F7CFB757BD6C42D79A11815 EntropyInput = 02B86BA2C6A25A8CFB58391156BCD61EBA55A31D87D5995E1235E902346EEC47F25CE82C0A8E3866C94A10AF455CBB33DED39AF098AECC7BCF9CB7CDB84EB360E9AE0BBEBB497221B3C2DF3496887CD6 EntropyInputReseed = 1975D8894D5E1F60AEBCA2A7B966DF6FFE476195F038CBF34113952CA2DAAA25 Out = D594AD360948B00C505B174EB35A821A3D46513310B3B6C2F24D6E44E01E88CD1A4762F5ABCA36A2708B207AA9BE78889307E8A1A173A7242FE6417B973FF7769B3BF499A4B527F1ABC03EDDF8DAF4A1E4176654026993E59AE55E8369C57A222A9420A97A6D354DC78FD591F2C9B291B2C34C33C7053B7D688455679B94B74A948398277CDAD12C674714B5BA27318F6F1F2CC8CE125800BDD05FC41D92D4BB597473F4EFB1E52E1C95F94A5227EDDE50542D1123C22A7BE05BEA686F2A98F9769A4DC24C3EF1B0CE4188078B1C0EDEB807E16F1F401F0CCC845648D9C95999B280F38392A1E50E95A096F2F682B7751E0AA766DFABEE755DE4A884C4562F9C EntropyInput = B0CA70F7E87A80B12C68B0BD6FC393CA0432B4749AD77682A5AB33EF0B6AD94082A27D5AFBE45E38AD8D8DD5636E59D345A2B9B8E879039CBCEC756E18ACA7CCDEB61F96F615D806EDFC9EF022D518A4 EntropyInputReseed = 38F8E48D8AEBBCEBEDE778F2E7FC8CBE565A5D79647185462A73F69019534474 Out = 0B5B4218152EDC1EE83C5253340DF39B89C6285984DF3F6EF5ADBB4E3A2AF3C9F81E69A6A751F5B9285540103A9FE07663737E6F711B4A4BCB10A4D0EA5E90FB77BDA5F6F61C09BDB5DA70F651B7F10DE7BBD09D8F4C18256E69DC125311FA628A8212604259798CDE235662D9ED13070398FEA4CDFA35C75343FC9583AABA9A235601B8432E782C3041A04EB2D33E735C39001C0C651AC70BE0926DC28BC82D0919E1FF7D06B61A70FC6FDBD33CBC4CCE5EDF79D9FEF1BD2303528AFE9323C727F681E6EBA735C42D2D7F04FB84DFFC6BE5303E9C03DF51A2437B02BEA5205EF85685D857DD1C63334909591D152BDD4F4FE0E7D84E9D6B06EC26885C430935 EntropyInput = 54378E1522BCE40673B499A8E76C850E2305AA70EF90C79BB40D7CB360A4FFE13321675FA9FE1C48ECFECACA12125387F6542B32B3C4898F387012C16CFCFC53D2D50723C33A880A3491A6A6CCBA3462 EntropyInputReseed = 610238342D6592326746C55476A1F7213D95C8023CE504E2A4A80A239D98BC30 Out = 52E30BB2469135EBBC8EB2B84C0ACB6C4589C3865CA756ACAF346D4472F69F5217349CD93CA309C8AD17BBA7EDA08979FA2C498642EA406F3BE96D772BF151B02234B5CFC6A0819196932423444C0238E6912B87823A0EBB8C5664986ECBD04B7DE30AD983C6A0339179FA08054A4D2BC437E696A88FEFE4C4C0D6BC8D639A9C4215C174660C0C42680628FD979D9918DFEDD8BA814AD66E63B7F55307907CBB0B210C0C70E513A8D5C15CFD8DE1AC5DC62A37CCB8900869602C14B5A36A57ADE130BE0C03740969C77EBE898466793A84CBEDF504D13C7477FF70C775964E36A386F99AA326FE73911A61316182D0482A460E6623BD8725BC1AC45372FCD8D2 EntropyInput = 65C5460DECC60E0F4C57CD761662DDA3C487A49483E62585154BD26D804DF8715C3365C83EF33154C247CF15DC6293CAA2B55C7F576EB6950F04E9C7FAC133A22A703E610F8409630BF11A87DFBF9DBC EntropyInputReseed = E98B6B0DD63DEB90D8024892D224BAC9C2A9A534E56546572DA4B7979636709F Out = 05EA23C43D1A73E33726C024014B7C4360DA256DD685C8DBDC7C68CA2C5B108577A9D0BFDEC5DC2755A845551F594D3EBF03ADEB6280914D4FC544558AA07442DA3718442AB704C143FEC9E4B6A94E6C8960AE21FD7C9AA3C10EA8A60345D9F8518B30DB7BC28489AB13066FE9CA52A8E3577686C06F872B958DB2C376496E0C87BC6C2454BD90687DE1480ABB1BA4839D315E9991C4BDEC2B46068B496DFF4AD38D26F4F27554F71081C74AEE93AC96C882B42C306D46AC12C171AD7E529DE244AF594AE372110B57A128B4270B8B366BA238A087660BBC6574C6098A93DC6C64AA1EB4A975F67863D91C4AA669C6D1875F73B7B51CF2C2048013419BF9F1B7 EntropyInput = 8AC96C74454A89AA1B7D74CCFCA4DEFB8614E0F065B8718F3FB943A62A16C2D7C2129E8430E67E6EBF5B3F78BFF22E41B3CA7BA921BEC5DFC1CA81CC945471367EA3294B2942C805FFA536577C6D9EF8 EntropyInputReseed = 5A5250C25F19B43647904578A71070B87F21CBDDCEDD7FED764D5396671FED26 Out = A8E93328B3758E9432B482AB58FF67EAA1A72FC7DA2DFE144C430DAD21F90EDCC48E43563FCE3EAC67CC8096B74C998555A3BF36DC1374A5D28EA196AFAF57B86F6459F8947ADE33AAC33017399005E940D4707CAD74874407A7C7F688138E98B8DE2DF2B5245792EF1299685734AAD9F07644092BF4C76A28DEF7D838DBA3D3F23956859F8C4257253B1BBEF50FC39BA748F60B8429883020C393471A070F12F7B739F82AC98D80716B85F4955C156D796DE5552B08E0516981B442486FAC54C503A32771EF050CAA236E350FFD320890B75A395863DA1104269740F2B5A5E6D3582DED545FAB6A39D6CE7A395B4A49151EE0AB121671DFE10BD5305085D87C EntropyInput = 6E52AE2F29022D20B4869283540A1B077423659D059F05CB5155D854E631910EEF88E4B978FD27F375A3C70B3494C346BB0031F950373FEDB2A7FFA0485EAB8E8607CA6C8D39D8D9DBB5389D7D36A2AE EntropyInputReseed = EC65E7EB4CAC16DD630BAB457225048BC1DCE78B6D859BD71D2C8A14ACBEA931C1474D4B4EFA4489F6FA6D25AB308D7BF75DEADCBC6DC08FCFD98A107F33439D AdditionalInput1 = 5438ED578FF50A6802C1A54131BFA0505266F110A476DCC02B32DCBAD548B88D AdditionalInput2 = D3BB54B969A06FF0320108D9101DBDA4C89503D04144B642FD35037C30642A6A Out = 66C990380EBD9DF0096B1B00C36D731EDBEF8D2FC04509613139BF3EFEAADDDEA4C1D4011710E1AFD4B651B0FB301078895F38CAA6606510941245C92427EAB34B73607BD3AACFA73F9F9090823F8A1F297A5C53A5CDC3802A40FEEEB60AA95F2882CF987FF9034FC268BC0FA4EEE809B2FAD7A2EE728B50F4691B22FE11CF1C7BBE6CB25E66FB6A3D9B511FA8FE8BEC4D8FC4AEA9F144FEA1E250F39504E2ACB45E5EE9E20824414F75D3A432C75AC2ED2183386F03D39D692F15B077FB18557332816DC976AB3A245E9DC1F1828AD1FCEFF23A611DF5ECAD05B9E6284B39CE6449C1CC01936A86B1CD0FF57B289BD245547A33EDE77E386E8407F5680E3A14 EntropyInput = 6A2BAF90D2E8B83355A0230A8FC7237C140F7699F40026E276DEAEFD4FAA8E06B2EECCE638BD9FA485E9C9E0D94C3A78A9EA2C4B2ABA1F48F2C71AE1A7FEE90E073912C833F2DE9C5F802AC2DDC57FBD EntropyInputReseed = 820FC963827166DE710208A7DC33936471E491FC21FB0119A252B49FEFB28A019A463484D172108807C43C048BD13A72D15B470C3443390774A55572D03F47B1 AdditionalInput1 = D98671978AE14B3531394A0785F78242D4B32EB61CFFEC6088EFB8625693276A AdditionalInput2 = B9AEF32C40B7AA4FD732E4431BEDCE071E4F64405BE1C85DE03C7FAA0AA7270F Out = F55791FDC9D763C34C0FC4CC457A438496F18F483CC60C493FCD0549812FAD792F92381532548A8C2257C6E424FA570AF260BD47DE92F248F57291FEAD3A68C94BE9DC12A656630622BE9B602D4FC5037C29BBB5FA92FED2235186048F652131F845F01ED718BAF05957E863239E94A5613AA47DD25D5BC9F170E4047E86EF1EEFA60E359F2204A3F453C9B37DCFD9410736EE14E296ABCDC185F3ED31D8AD461A81479F957E69C34334A24E22F4A69606DB8BCA6CB189E7DE4B83D8A10461FBA1942C83AA2E5F84DCED9440F10A54C74153643287313AE7FE1BF23C6ABECC55C4A3F5540495B7D29A302D426EE2F13DD9ED7A5A6618724544DA63527C702E4C EntropyInput = 309ECC8079BBC666380713A9FE4C67DEE7A8BF4A261961E006A2D4EB18527AE83AAD3A6CB9F5299AF91E6598652180973967AF61996609C5AEDAEBD9E76BE2FE0B6E9F884AEA806CD7C8CBC995619502 EntropyInputReseed = AB591CA0884C0D77C9EE3AF4DC02DD9666D66F72AA4B7B7899AC3362AFC0A452A8407A511108443B4B318923EAC4C6462FF598B21A637057F5748A9137E3B1C4 AdditionalInput1 = 76835927E8734A097026ADE517BE3E746693D5043FB8C40C0A1758C68E2C3A4A AdditionalInput2 = 236980B470711665557B01D81C85A83C9F89CA5DA45E3B46F458373E85DCC779 Out = C42193ABD4F3C88C5B3FE3F6F645624DC9F79F5F205E70F4D8A75EAF28027CB2826D7AC0F244B0F0346DCA592E835E5DC7FE382F6AB5F5E4D623B09C4B868296FF28EAAE60E9F0E719FE86BCD3A56A7144FCA6C8450766A9B3AA15DC8C07EAE2438D99B071C3B6FC9C92E293163BAC4398AEABCE30D82CEC643984D877B292AF9D9B6C5CE6D9526AC0031FC47337AA05D7BCBE04746E38AC3581C497D35CD05AF8B8BD14D67BB555486A0A61028781531AD2CE46A8ED75F35E05CF2E51ADA0D4BC6ABC60C30C8F261CA73399B84B93EF1C8736ABED43AEEFB508E35C05F51897B2D937F7170CA5B6F2FDB72B916F16A212BC0C5587B5142CDC7077D7725578CD EntropyInput = 92E3B497214D75F8BDFFFE516100AA02DF049EDF8EB6269423C56F7CAE1B0CB0837B68E25614A85CDEFCBD46224E795A807460644512A6A972F57B7922F0A2DD69887D30FD9FF2C40C42416851DFBD60 EntropyInputReseed = 876965239E0579C7304574876E9243BF8B27A763D7DF2611A93BA6E18E7FC562ACF1C05BFC3E0F1167B971C8A62F02AF2B3421A2ED997F92F4DF4F1F3031606C AdditionalInput1 = C1FB01B0D9C61E588B7F076EC98C04181C448D8F4113225C7289A2997D22D29B AdditionalInput2 = 1F3B15A8054ECC5DF1EB1912CB2AF78B206D8F328AAF3C294026D6A6E2D905BB Out = E2B5A2ADB6490AA545B0844C89B46BB036FA970C3641BB3B347299CA1C8992313A764774B88E72F841E97CB0867D5837D59EFD4B74B9F9CD9F6CEC905BDD651D29F587ECE652CE2FB599096EBA10B3C720C61453F0BD693A7488A2EAE23F36D271EF8063BF3817BC1AA011136D6193DD9B4ADF6B3CC3308B68D394BCA2029954847D6F3C9F450520272E3E62C5F83522B5F4F544D281AA3B77A90A0F2C4FFC56561B536EA31B6EC0E15A49204981343655E69A2F0D08468478AAB5FA34E59B37374C70D98ADEEEF45A7D46DED34302BC740CB07E0A1CA353171D9F19D3D2D253C5F4F720B34E8215539A2AA447C5AA9AFE4D80CECCC7976BCD92E5E8317F21AB EntropyInput = 8A18372DBDCC13A08D1E02F2E4156EF591524FE1223DD0E810563FDE6ED7E8F9418D4307EC1FDB14CFE0ACDC5CE7C62D05E93B67D5734991FFA75CC37783D819BB6EAE18485A90BE8F484621BE0A467B EntropyInputReseed = 42BCFC5BD770F0E42098FA5207B9567ECA4AC897680AFE155425511F23361C8055E26A73EE46A8CD89B66130E191F8B823E9969A9025091C568393553386DCBA AdditionalInput1 = F8F57CC10DE3A4A8C99E0D3C334EA38976E1C1460A0678AC028A7937F1C12A5B AdditionalInput2 = 594AC0B133987ABF089BA1A636DBB41465257871D698546178D09ED62EDE253A Out = ED0F02AAF9DAF1F589503DF320236776A39AE6BE6258FF98968C1FCF0992F63E3195C3B0A030ECA2EB7DF1D74E5FBA15EDB00B5A3431BB04C49283BF982F8A48C207E13F6B926C77D3CEA0CE3E394504A1990DD7C04AD0E23FA134C0B1E410269AB5BC22770626BD48F81EE1F035ABCA3D35B4D219EED4BCD290292A4530687B2B0777DD4268574A36AA1CC4386BA9169466DFCD143DCE6F0C9556006B8706C0C8E0179DEE2D004E625FBDFDFEB9007A53AE403CE8EA89DFC888A4E7A6B8DF482BA865F8F51C5094918B1BB06545641BE6C8385D9AC59C4F48DAFF113DC8721788D84A3E07C6810FB5AE8B213630DC12C968256072907782708A845C90729330 EntropyInput = 033D998364EF3B051B1F59D61A1D20BBC1E02631790B6649A21311CA9B408CE8F2CE313BC3B4638C44FE4555C075DA8978946CA8C4B8498B25F06075D8C8A7105E1F2034E43B25F60994101A17BD75B0 EntropyInputReseed = E20BBBDBA7E570EC9B80A5C8DD1978FF76636C9F2A0DB0499F4E2A73FE3DA0E12967A905CADECE8FB05E5EA66590AF6066D95A0B0F835941257316C3F5A438D9 AdditionalInput1 = 63D53AC93D625BBD0F006D46A15E14D560AED76360E3349DE4D64745C864A0B1 AdditionalInput2 = 0B74F6EA5A1D02AAAF890B89D9C0D4107569EA8F0C363BE78AA554AB7234999E Out = BB428BB9403AA1D40108CE3260C3CC1CDDFE71CD7CF68E24A8E9FB712101BAC8378FD25FFEE5C50947083DC0113F46E3EE43AA761605C696CAF2B1490455873B876A75859FF4E73A01E6152D2AB13FBE30BE019BD532F4FBCC24F2F2948DA736975BFB3FB5FEBCDF051D0F0856355E87ABE498BAF423F8C0FFBB458941D43B06FD8818EF688EB6AF9CCB73325863E9CA2460831BB7860D008EBB9B541D046B682779EE28D5C98447D8ACE4CC08F401F06A15FE56A98D3B6937A8E34F71FF2FF33AAC20AC26BE96FC19CD3BADC384C7265D4AEB40AF2DAAB396AAC4C4FA788BD346FC5B68085258AA9BA2D992632F7168C6BE9B7588E4F37302039D868FB033CB EntropyInput = 913A015125A1045E9AA3B276DBA9730C7917717D712590E19064B4E207CB8BC28DAD92269409CEEBF33FE4E0A596E841AA9EC41484C3D45CA62B5E662DFCA4123D2F4F9C51CF8223C790669174D0EDE4 EntropyInputReseed = 7E08751F4289C56E753CA77562C972B323EE4EA22873E8E4505307F9F9A641A5B3EA92753BBFA110909C531DE8FD793FC2435D27A7CC9938232AC359CC142FEA AdditionalInput1 = 030BD678E47A4AC82F420B997699ADEC32DB76059BFDD9F8525D686727EAE0E7 AdditionalInput2 = 475B966A29382A75E4ECD44E196D84B6FEC19CE65DC3D96EDC861AEA047F4273 Out = B7CF7C1E1B9BAFB4009775605B8F716D95066EBCDAA5A75C8701597802635816AA333A8F0DF4D35B9AE16852FCB2FB6A40E7E7E46BB31D11A9B97E29D359784F81AABD56A6F288A28565A74F46A572D8BC912395AEF94EEE3EE85F4CC37461E4BF7B6CBBCAEB3D1A8F66E14EA3E96CE65A203847C771642FA774BB5F9EB075A60AAB63C7B3048810BAB21AF6CEAF758DE53C6F33BAF723239A08DE556653A4349E85E7F783E7684A3760218D48430A9C21ADB4C67C1DF276F378C56A6A4DC98741743A29D3F4D17C00942BEB5734BC0180E5B3CEF65CEDD28BB80667EFAA85CEA04C74F78D8565F9B8ECBCDBB86255E0B8B72598AF3DAA5B91DA09822A6254E9 EntropyInput = 094D584BF2208B7E221EBABE05FE5FCB50E1FEC9949FE1663FECC0D546A67275B7026949CA6228643D174946550AE7E93B492AB1622AF65C400D2BE88E817CE120B1334A75F18920144041303330FAD6 EntropyInputReseed = 04FE6DE0E0A95C8E7247A85A7F623964C5D5ADC7C5D7893975A72C4F7A029B96BBE5426479011C77DE46D01E9EDFEF487B30FC7B8E5AB243C88E86AAF2A5B568 AdditionalInput1 = DE02B192836C3EC1E7B422D37F17191D517F8F4A05D0F1265DBD15510D5C60EB AdditionalInput2 = 79E6C7D0999611C469A9E8ACC4EEC6F1FEF2C603788EAB8398F2A84B924CE228 Out = 0656811492F6F1FCCFAA4EB19B6CEA8EF362B3B82B30B06B3EBE0B9EDA6D4DC760B5CE42C5736352262A84254794F75893BEA8870A6D38C0BAB0A7CB051199C5F297F52BC71327EA2A830E5168644028A463BFCED7D0CB415B52EB16129100DF467A9C28BA2A1EA46E2376AA37F22910956802670B28C3C74697BF5889E1254CB4F20966ADF4EC7292EE1A109BBD6ED06BFB82EED2C9A10EF76E0E939C24D5067AAF4B7AE854C8035F4BB5E7F8938C963D55E42A8208DEECE3A7D3F9DC4CC89E14F4CE7591E29EB840D889168DFC9A636E7934409E02D9B2814567E9E4E1B163D7C22FDBC930F38CF24900A64571AB6BA0DFE8AA2F9ED9F6A45B51DC22F77145 EntropyInput = 46462489D266DA07756538BE1E184F1CEEFFC509B61B4E8F0012B50D9D2C0662482608E6E7615FE33F51CC171793B3EA9AE212CFE0B968B95552F9D714521871CAF954E7A10FA5F7E016724F603BC7E2 EntropyInputReseed = 38B110FFE37A6C6ABCA0BBBEC005C07759BB2ED56DE5FB6D8A8831401EB2CB0B6D09F5977F14499489E7D765EDFD53418EEC3CE7B4A8E76161F63F768CD6A67E AdditionalInput1 = DAB347612F5BA5EFF41021436A05DF9ACC9C1641A60DEA195EAC376FC94DBF4C AdditionalInput2 = 381462AF8EE6ADC4F972D8178A7C5ADB1316F18F66C5CC16D6DC381E977AA9F8 Out = E52D3AFECF770B16DC3B4A8A1AAABCA3F8A3261B90F8CAB41D866DAF3A49BA3EFC0C78E2753076D4C539F5334F3C94E346B88245978335818477D3D3452A56F842B80CF83E8A2A66D5288524050AF25DA7EBCA2E1C857546CD922D4B30BAD8E78315E3FC381D4AFDF674CBC3C2434BDF90EB1CD197283C2FE643D88374E7D7FC908895A94994BD815587F9902794AAAF3399DD8367E9869083A3782B321921F1A135BCEAD43585389D868DAD1808822D37690437AC67BC789BB82D1FBDF55C535920E40C75B769F140A4FC96351E0DB897C0E65DF5604C07780DD865DE9F419FD05AF94122B32C43441FFE0D103CF406EA49F35F6465358E3267E98977DC4D36 EntropyInput = C8609383121E1D60C18C14024A9C04DE60ADD6FEB8CA369A1EF7678C9BF01BD0D7EE31F9A8B3E4AE9A69DC71AF8A38BA9BAA744AB49D49B750B6D1819FBB39A880721C345FA305A3F381D6C5C73A30C9 EntropyInputReseed = 5F5265883A249E44C1B0070EDEAF2C82E93BE6AE672AED5416D1E28DD95731B095B993D99AC4430864553D2D95DC15F016E09620442AE02C8B153197EE7FE4F2 AdditionalInput1 = 380F955ED6B62F774AF2FEBACA83EC470D7FAF3163069AA8D052DB2FF2B4E4F4 AdditionalInput2 = 2E46E75E522D994C575BE04B345F457FEB4EFDB3E8D6685F4293D45C8E687F23 Out = 67E1A7A10E2E9125E8573D9146FE809913AC923A3A249B2C1155939C11A1308EFCAA6412DFF248B4CF9CF0FF85CA01E6C1C7035D1813238E3E080A5A563EC24A8A5EBA573D4BF7714993548D73C18B310A67518AB5E8B24D9F65E1BFBE8EBFB3A1DF939D8A22576308D3DE1E3B518E7BF0DE271028FDE8074B1E1C3276AC354B3532009ED3FAB6D3CDABC005392831690A1F5587CEDE7A165E276B6F7AF1AB4282861B135E6F61A949B1131D715A0F78D49086E48ADFEC7CCA1450E97071E7A585B40DE4708214C7B060464DD5FA360D99F78D963E9D04B70FB84BF51792E8B494393FE65602B0D493FEC4670878FB42DAC695C9BC7967DA9CB5DF15C2C6A9DC EntropyInput = A931863E7D49EBB621702AE1D3E290D1097EE71016E5A9990D81A48862B62255740CF70ED5BF1BED92142C91FCFE4634E0D5DC66DE1FDDE5DE1F3FE2896B0CCB290BD9B8A69F1B2D650370F0881EF5A1 EntropyInputReseed = DA378085CFE94091136221351579FCB473FA13C1DF593E7EFBFF6A52456E7D6C8EFB40EE04E33A1DA7766BFE067851764D97BFAAAF4A91EFBC1F06A2F7E846F9 AdditionalInput1 = 81037AA6C5B8424149042AACC124140FDF52B8ABC0DCAC42377D41B70F740437 AdditionalInput2 = 8BA6345A53CB3F221CD7D1F57DA742612D5884744AD274EA50242EAABDEF66FE Out = A223E4ECB8C0ADE0C095763597973C28D77EAB15C457E7D28486A4976619520F9A6D90CD8CCBA0ECE01D38F776B7016F6100A50BF5F2B13120D9D1CBB260DBBCACE4852ADDE61B1B12D8B06C56BDB2DA3E52AF726B86BE9A28208A7A36CA09A5F27C34B38D6E0F6F4862E2179262929CAE13F6DAE55B3681C0C5D49A405CD411DF667166B8F033CD659B534EB2650C637F0FBEE8287D4A1304683308C319A1BD9B030FF70448BDCF7D271F5D991E0F006951CA28E2514BA748180A5CCB7A80B9811CC7D398B1AE6403841EF37272C9F2B1EFD728C8E560DF37133F002F6CA766513BC8B4AF99E8E330C52B9643A8766396749F59DB6C385FBACC55BBEC7F12C7 EntropyInput = 68AB5575E4E1CF76A18C26B538390D1ABDBE85834B507B44A360EB0DF1CFDD61478CBF0797F7EAD73CF21A72D225CA18942009F6BDE92C1DBD19B9A57EDC7BF6361D77E3C7E1CA65169596CF5C36289D EntropyInputReseed = 37B366F53B98AC3893778CC99404F487C740FA6095C0F3502A924C1FFCECBDDBCD2FF7CAF32D4CE6C992DAC16A4B9E30E863E7930CA07FC9BDAF06DBD78BADF5 AdditionalInput1 = 143D1753BEAB721F4298955195372C436E0E2725A6004F7A301F1A3927A1F7DA AdditionalInput2 = E885DCEA7B5A8EFF30A92A4AA598F9B6ACEE40A24D302E58FCB84FC7A35C0212 Out = AB842CBC92F2D41BE611E985F2EF48EAC7610C171BAD2CC8D2E81CF292AD774158CFFDA3EF505B1CBA9C3C363A9C3791E68623E6A611B0825868D9B050AD9182E754A5AEF16D24C8F5396392A77A89CD99B9DCDDD3D0B7697476408B92E3A4EE0B83B898A5C3641A30AA11214F0425D21910F83CBE50D681BA309B147387A445065598E979A79BFB6F768B3DAC5AF2DC105FD335EB4967AFB310E1274956300BE2474C00EE3CA1D0449D14C97D5A3B230F9257929ECF1BC0A832500D3A07DF1228838F177B5146F4D8B19FA15782BFAB84746A6E99BDB911657B64BDDD2FB599DCA4371A2469877C4C5C75CDAD4DEE55188E0E947E2FE212A8A5AC6DD94F377C EntropyInput = 66245E73E86223A4577F91F8858EF0A48B5BE26BC8A8D3046A9E3C4F5D754EC6D9095F94AF01FBE8980FEE0A2A36B952F42E1212D9D9B20599D3096EA0B5D0A1EEC50BA86434716782D7B29E8898A0E8 EntropyInputReseed = 001839C5E45E20DE6A87DF4AD48C0BDC662C5295F5D72984998A99ED60E90BC3626CCC867B483F944190C6F4FEAE4C6DAC54BC9FBEA7089014045EF1A2095DBA AdditionalInput1 = 38255EC557703900DD5E100846660D5548A1BDA675C83799F21A437F4D35B54C AdditionalInput2 = 228D9357C33098576144CADB58AAE3C3647A8617E80A1783C52F4BFAFF7D0DF8 Out = 39043827021FCAD3A7B46ACCB94AFC1F71585ED8B804D644F67FF3000CD40AA895F61F4C5FDACAC0652C3584A2B251B03B337B1E47933C1EB8E8401086B35A84E09E7A7A8D1E8EE60040A912260BA366854DBB1FE7FAF39A7905D6879E56ACE5B309E913F1E831BFFEEF88A2EBDBD4B171CE485D887DF99B03AC633FD8DE1C18EF5C74D8935EE49684FE5AB529C3E5AB0848F8BFB388FB88E11DC470FB8373FE353468F51BE195D5458EE6A507BBD9D581A4560E23466CF7EBC9B5301FA6068198D10B4F73F195B1B310FE2A9AB188ACEBC4A051768908792B54104D10C2C0A27B5BC62136EFF2FDC74BB4D160FCFBDFB43BE6F49F2663DD77C53D9CF83AE786 EntropyInput = 05449E03A3B883C01E894529A1AF570A4EA9605EFD73D6357F5B7989F9DABECEE869D8069F1ABD3A6FEEB0526FB04D29890C28F61B0BE8F5407F65DD68553887247A6EB96EF7349C9AC627E8C630B8C3 EntropyInputReseed = EB248CD5E25E7AE6EFD05E0B9CC0F330979D990BB2C949B4EA704CE67CF1FBFFAE52094273C7B14359AE351804B0B02798CEB2E950E06F0AF5B7F4FEE51FED66 AdditionalInput1 = 6623C334F22207B7C1FCBB549BA10127FDBF3527385CA9AAB0E0B16F25C49E05 AdditionalInput2 = A27257DE57A56DD949835E88D36D0C6F6707852A7F937C95992DF96BFD23BCB3 Out = 6FAA86607D8876C943A5098A1501CC2B8FAEC08AF98B77810C4F8932D60C64FFCD3AA6250964E690AFABC9E96ECF787DC36C649E13E7CDECEBE71C1977F80D3935136D7C6851C8BA16AFDF012AB074078C9117334436BBFC9A62D1E34E20750C180863B2BA3C3FFEBFD9C9B365A5EAFFEEE0F161C32827B172694A18B8D2B5EDDADABD209DAFB3CAFF046A9255F8176EF5BFC40EC3A91E0AFAE5249A1DC5EB9A0F19CE0EF8415523F53E5806D1005B5ABA325CBFB82073C416324219097B4A28BFBFCA1665903E837F8942B90A14E0DD6D8E58ABAA9753FCF5E472BDB17DB6318636E5D938A511C36193002465732C550C8CE1889E31D01858EC7967C48F8A83 EntropyInput = A53D5F23C0ABE62F4744163234AD0E46D9D82B358026F166F10286EBA0BFDB672329ED6CD3363585314C9A24D7EEA3CA899DC5AEC01C43B228396D6117DDF11D468B53D112A8A2E68ED842F9247DC3F0 EntropyInputReseed = D282EB2BB5053F012C1AA4CFED804B9F7EE35977E8B41DCE01E641447FB2EF249CA37C289EDD93A11C7D5BCC119E75FF78DCCE07594713659CCDA828943C95D3 AdditionalInput1 = 27B3E69ABC235F76769CEB61260E3ED866059FBF752DDE62046F75C06CCD17AA AdditionalInput2 = E7AE94756BE5D1B415414CF61105D5C5D374C4C406C7EDEBAD7D7D581251CB5C Out = B05C0AA77248CB073A969FB82F8D897F34B282C38BFD481BA20AA3E0A77AAF9DEFF79935AC494F583C38FAB12D23730F52D92EBD05D17B6C61A2930C6A3113011A6BA162F0D82F55584E55EAC0E65C0989563D5347DA96E64E27217C6923071F8487443FAE8F1CC75FCAE5E9F2CD831727CD7D88E5188A7830A40EC45A2B65E55EF7B79F2F2F411037584457F1BF0D150A7DC149F55B89D45875191F96B4AF08F646D60FEA5EF48C621AF565899C95FEC8C789DDDAE780A8556D3C90CD185A5F6CDE632D4DBD4ADE29A2F394B813B8911E1182E28B86BB5417CB9EF8321BE81775D02111C1A8F563977CA00238D910056E6038D061FFC1088785A333742A3908 EntropyInput = 60F12A1E563C83DDAA3613A515537F590BF22C2395C3CC674E23CC7B3A7E5957B046B797A0AF84027C69568838F6490E EntropyInputReseed = 68DA0ABDC08AD5D9A3B85A9816BEAEE2DA749CA8BD757B31D756CB820F4B5217 Out = 33952BDE773C0DC00910CE6DC55DAE77D6A5C5AB9A93F612A656B9CCC1EB24A6CCEA86D5090DF305DE6929964C4560531481EA835564F1DE2710A7B155F3772347A271FB8A40621353C135BED0180D867D4B8EE6139F3B6F60A1E4072CCE3198B201DD1A0A3193A2D3061EF121ED1D5CC127E7A433AE5407C09B45CEB1EDE69F1C5E27E7AC7FF7DD65D07C92E9B002F44A36B4988B4BAB45D20754943AFC0BAE2DAC20C3CC6EE08FFD3C6A944ECAE7D1251A8149FBB819DB2CB7D6FE48AE9844F1C0CFF1D76167034735C7998A1DD0A066E67EAEE86DA58168E4EBE0FD36BC1E0E469CD377B414B6E3C892020240AE71F17286D1A484A16DC18B25EBAB474CE6 EntropyInput = 5C38DB7D4667DE07141948C9C1DB26D472A67366C813DB7048106F8F47DBCDD7E4D984B5B198F3C875AE2E626B3762BB EntropyInputReseed = 3D8B24AEE7F68DDF7130EE9050656F1B574B83735AA6B1C7308708359363C8E8 Out = DF688F096BE6B4A84D31835428F766658A42833348AADB21C47AF5AE471CE8D5808ACEA536B0B68A393C00A98E27B9F2F677B45496991C9AA833B660AE32B8536ADD49872EEA8DEC8045B3D268530D5C82FD6D21CED7D3454ED979E1EC65C149FA218C1635995368089289C09BFE27A4A23C5517B2C88AB6F36B62912FCF1CBBC98DEC38C6469761A9E59278EFE4222C65417F9F7E59BD25520A940193035266F3A6B787BC16651C187D4935360F70A710DC85F4D084F757ABA26DDD6658CB02000F23B0F2F48EE9E55F4D8C370DFF764635F0EB8F27FB171EA0CC6B8F8C0C46ADC088043756B0158B3C6AB2EA6C0C4E146632F9F35DA9F554860D3597E94368 EntropyInput = 5BC88841F5E16880B22958A976188556F4BBFCD1D66E2338A361FD3DA2377B680A7A73C5B84E3AF9D85B7D93032CBEFF EntropyInputReseed = 6D7C495714688BA1F368A112EA2639B4DE3AD49BFA488334DDE3EEE461F640B3 Out = 1A7D3872B9E50DCE9F8A021C16AEC6AA5BC9368D282E8E2E63811E2A6379769BF522EF4BD09692B32865ADB08AF6DF36098DA145CCF0008B85647C95826F712D8A39B638135810B9D48AC4042130588ACC8CB29008A6DEAF267B5EC5C2D2268A7786FFC464E2C28CAEF54966D7DF23F18A045A7A3D76DB55BD3AD3F241318BB5959525E692523F9E213A4C9EA4E15AD61D0500DDFAB189A4B2F50FC336720295159C885ECDA91D25B9473A9A59D9EB8B429DE445BFEF5B9C38F5F483503C4DB314ACE033C35C37A0C7AFF99F2204A11784401F81ED56D7E5AE4DB609161E3B3E2B816694D3BA72F899C086F119DA98E82173D3CD3FDDD8998E276F157D4E775F EntropyInput = 80B05E193E3E18608542C6608342D12FE598107214D576A8CBB3A57AC67FF5932822C1923D2FC57779665131F933E513 EntropyInputReseed = 9364B5E11F56D9C23363958E15D9AF56C7C4849C0218AA7E358710EE74CC850E Out = 3D56327785F0421E6F33B2E1D20B97E295E603A7E9B3F8DA79B2719C962BA64FFF4A50A1759E49BFEDB0751023F34A88171B4CA3C8A1EAA72FDE67C47B8A7A4CA04AC464E7D3DA024F828101F991C76F991C221D380EBFA14E3EAAA4CACFD034C2FFAF7E05352AAF5AB66EA81E96496F5EF3183EA1E04DB5B74AEB00EAC232D39CA116EE3501F533E065CA4805D6CECCC484666DC4A0626F94B925C32762C575959B30E406E9B0C51B049CE2CD20E50B0542D4945DD7CAFEC2F141F3A506BDEB6B191A81581C778115A02D6DBE6A4994342C00C967283C9CCBBDF8277114D9AA2AE53BB8BC3CD5F2F5E22F7BA6124C07AB44CA8251EA010EFDF99DF54BCDB497 EntropyInput = 148A92169CCDDD99D2219DD6741F6B10EA562E3A3DC7A764F368359F6D3A8298421A9B75B112D02718D884B9EEDAB020 EntropyInputReseed = 6CBE8EB775B5894AB5DD743575FF57CF2C3ECCD73468C68B8593EB32894489C5 Out = 540F6AD561DCF94A0E49DEBCA4E655EF29346510E36ACECA7FEF3112105B9EF1E7794BCE23DFA51D2A8D0F8F871A33A81DAF2E6B097AF205F95309439E4C542359A9C229B58E206D68939B7F4ABFB2704CC9AAD74E80470E395186F0FC83E485F14BB1B77BB29A597DFA899137BCF4F285BDDF9DCB94EE305B2CB0C1B98B774E7C4B277E21DEDEB2D527A157E0D4CB7E166A190E923E3E4D444EBDFBE1F38356FE71D76FF01377B22ADE24F986693BC3524E8697D3B97E9BBC44508543D623B1783D9A74DD8C10F8E97C06CC5783BABB15D4B41625D20E9C9AAD3F6E23AFC5872AFCAD36797D7116C9235EAF8DE7FC963113F3979F64B7754DD611AB596049E6 EntropyInput = 72E33C05DA04454099612BA58CE92FC78FE568D0A5B4536602F8E68C46E8D9C271D45CE3ED933BFEF20885F912BA2A64 EntropyInputReseed = 0F38BFD3C65A942A4EF33657933D729EDDF53AE225810E6820AA13E8ADD7DACA Out = 4EED53D7EE0E5F46C256E84F4CDCE9BF32E24B7792C9C6019A01C53100F093A29CD384D14B730DC14D2C94B513C8882DBF090852FC375811592176FF5BF0BFAEE20EAA4432A469FF091DE537BDD98D287808BAD279A0A13E9B12F29D714F1C7A56B2F44705903EA0293354913F19586F59052CC07A557472B6581D574A498EA272F762BB7BF82C68D09861595FDF3B2C73619519F456408F9BAB9AC80FF71F190B93CDE768D354DA433AF0ECF2322B60E2A8A12CAF33AEDE1E326A7BB6459777F2DC52092D7DE6BE4DB8751EECA6816B5697B0CC9633D2FBCFE3D2FAB9E721754AA8C27C65ACFF217AD89FCFB83F8AABACBE77AF141270BACEC2F7BB9063CEFD EntropyInput = E77A18E0ABC1CCB2A0ABF8950BB83C2FB825C5FBB34182B3EF81DE7DAF1244E0A9B682008E283FD8301899DC5CD557AB EntropyInputReseed = DD3262F1D96119576E93E8E85B9ABE414F3034D1BEE222FFD9CAA94B02D3A253 Out = 0BEE54164B9286762FFB375DDDBE786F35AE7811FB70380E2EC88386CC164112ACACC669C532E4E3FDC7A2CCC4A97991CE4B1955944EF0E83551012534720C2F3CD0473B4532FB48B2A3F0D4DEDEFFEDD4E082FA8E50EDAF2AE3BE9E8D890EF027B671086D05D5EBAC4683DB4EEFA0386BF0FBFFAFAA911EB98D8C8EC28AC74E45075C1850F83C6D71EED0FB78F152BC1C82D4AA02B54AA7C036F29EC95B938682462CA520F4D6D2AD87BC847E8731C1BF33D08526DA945B76F81AC6314C9ECA3411D9B6B7950190DC70451795485CCE18383DD304C217D0DC088979BE38CF2BE0FC5F133AF368A2CE23D4B2D2B6152DF83213E07361378772DCB45DC227F494 EntropyInput = 94520FEE38408FFE14D3F086A4F891BB9604D7FFF0CC41C6E5B0988D510AEB0DF4FF18222BD778B0B41C5EF13163613C EntropyInputReseed = BC279ACAE79CB09CE1975D3A84B6FAB42B1AC07B47A1BCD196872922F86545BB Out = 039A0FC2A1F10D2E89D5443D4C02F87244430B40FA12BCD1D88BC9E2B085CD94328FF13923A43BB408F4F32426E2946F4E65937EAE7D56E24C096AC68496F0F4DEBE2DE8EDB6E3B2071EDB8F8256BCF3A27412E17BC87BAB3C4F72B86051D522AE2E32A5780B15A3F9790B574712EF9A97A9567FBFD5D184DF04B2E877B6DB1C70B346EC4C920F7D708D7FEF6D4751C9E2FB7CD679B15CF13ED793F988C186C88F7084A5C30F0E972FF65B0DA4A4E68E3103DCD3B1F6F2AF978077DFF7C9CCF889FACDC31FA6434CE21E7B521D4B7950409532827CF0F1CA9A7CD149C19615A14FFA90C3CECC4671E8EE8502DD4EC8E95F7980DA1AE9CE77D7DCDC6477E04B5E EntropyInput = ADABD1BE64D8A594713E88B7ECE25746A921222FAEDC626525E1FD5BDAF10AA717490E3B8C251ED298CA80F97E4EC4EA EntropyInputReseed = CF3266862DE77AF59E3544C087478B0820243B83343C583145FC45C7FECCDE48 Out = 4E315EBBC2AE4D9AAAB1CADD5A8EF6D50795D2C6D7DCFFB4C96D6BEC47B03D7833ACB147A16A2F0708FBCDC5C68364FF3B437884F8CB063B790A792835738D1A4231410864307A17629B832D9C458189F833B8BC42BE40CAA94F6C932C587E73B0D588EAC15569741CDA738447AC301A5703F68C99AD4D2B54AD0317CAA5509718884E10B3354F2BED2760017CD955D7DDFD647632F499384D2022C36CE4F9C11BCDD08884290E3333715F708E7DFBC6052D6362623182C3C9DAA92C2CF8EDD1555EAC345996AB264749E6E9F5CE842499A2086106C6545AC0C133E1F9F79926462A9D14F9D6BF1A9135D2CA83FADA94E17C322412B77E74A030B3AEE2F335AE EntropyInput = 62AD7867FA6CC97800A86CBEDB65AA003955E36D7CBBFE35CDB25AD4747F3998DA9A8F8E3F9E58229955C55418128A64 EntropyInputReseed = 1DE62980444D7076331357B68A68DF79FEBB25908A6576E7FA39D06F3905E494 Out = FBE013A6ED1B228C1110BC3A76E9F432C6FB4F76CACCE2B6BA772498E32A3F5C1B062F38F7541E65094D10CC2A42C5A296CC7D889BFD4D6F2B091914A4BAAD2175682B580D560D8E243F5EC7FFE6DF6940648AEA4A4A6ED81B774171EE21387CD356BF6FF5E9DA1707E1A6AB71703061D4EE210F5BE9B1E8AF19674674591B029A8E8EB740428B1EFECC64B5B6ECCFB0FD9E350DE5337B00A18B8FF9988E98A498A8CA9707A80E30EB32AE54C110FB1B9C59EA6C6EF56CB3904E8924B45ACA76BACC0DE9EFEAF213318649526A513E51A4FAB52EAD49AFBF37236C89ABCDA9A499C30FE3BFD3324346D9AA6713D80433714077D207632E61B7821F1DE6AB1C50 EntropyInput = E9FA53568132A39984DB361D15B0E09DE226A93A72A48B2207A5AA5C7B1E195AB4913EBCD2390977EEC014963B64C2FB EntropyInputReseed = 55A325673663411E25CDC551A44EDA909D31BCEB3E90C27BBC1330D5B707D383 Out = 7BB31855D72BC68912B37F0A2565C9B2061A10073A95BA640ED8F655D077E7519D86A1D5185373434E7C10713EBBBAEFE12B8912C804D637078BF920A3CB83708C30F7E38184543FA5F3711E60B0BFEDC4462593934B578D8B55C6E9074795B2AB2A23676251ED660A6EC797C48B804DE2D86BE52E820128576505E6F33B640BD081E1BD4B54EB9B9BA6423874230322790AD75C367F657A301C56071D5D1430DF377AAFA97EC92EB3073858D34755522A15FD3E1AF720714C6E74AB3E120183B92A742F507AA9595586A9089DAD475F53AEFD96A01C9198A4E8EE91F6D071CAC65C9626B2E13C8052E895C569865392F998CA281DA9E301ABBC74D6E69FF28E EntropyInput = CBBB320F17FF72E1DE0411CC1B3F8414723394B5BE28B81B17A2E83026B23F133310DA0041E392ADACFE2B9DBED8013B EntropyInputReseed = 735480F7F4A3A901558D0B06CD1AB51FEFF0AA9BD47E3608CB781FAC18BCBBD5 Out = 88C1C736BFE1F38BFC8E9BE2A002C68BF3DC8A16A8F0AEB49179982E145145DF024F6F3B8F273DE3ACD30688D0E970028CE8D645290A9F6B6057F8C6BF01168624265EA1A69C14D4DBFBDEE21A17289A293F33A8A6A82D2E258293C41AEEFBA0EE347B2429834565BDC6A810DD4B1551E646009F0157503D769A818A2F79C565AE597D9DDEB2CB323A3DDCE7FF289FBC5A305CF688A47D9FCB8F4E29641DA1B966B76F2723FF4D04E4E3A49415116810EEDD609FCA39FE1185CDCD63A27FEF8C76A5413FB580BAA90DFBE345CFF17E39E2B27418BEB55C56DCABBDA7A438689196A44096499D2E5145FD26603F903297F7FCE705A7950CD122E4FEEEDCD29A8C EntropyInput = AE191FFC4B3B9BD702557E28DA9FBA66639F0ED0550F17D9FE785F34AF7D0A43600A9DC744183F97C0F92D66D33F6A7E EntropyInputReseed = DD5928420F8098373368DE65CE02719910E12D5035C4627D3FE97A1B02DB8B32 Out = 364CED2856CFA79D301FADCF6CB888A9E21E29D4F2383265D25AB13D78C3F3A975595FD96565EB98FBCFE446A2AB9F34D09BEB921E1D05E9F5F57233F2AFD522DB0DC300DC6CA33AEA155A46257ACF5F1B5D696607FD7804ADC8F080C0067574591266442BD455882701C296EAA934880F5BFC3A72BFF90F7C153D0695677CA88C64873CCA0A3A922874366EE8EC221F66BE6AB4BDE269B4BB1EADA1AE5D46EB49302C790075FA5EB0D203FE1658ABF64E6EE21189C1B2DF272744F60D9DA4A57E530615A652B39AA6525067019D30B6790A2C3EBBD910FC24EABB4258672FA916EBDCBB8643811745060219BD387AE3C7B36CB2937F375239F99AE7393F0865 EntropyInput = 47C933FD2AA629436508D86350E3D217D80B9626C5CAFB3D1AC4C3DC0B8145EE4E75D761D74CA48EA5635CEB1129AFB3 EntropyInputReseed = 53FE974890EE454C41371506E14CCED9FA5F836220D78AAA16DA9B261CA75527 Out = 4BF6806754C8B7CE14C02EE64FCC254F91494CF4F7970E236B21857154FE8DF8FC1CBC5CF5E10462592EA3970DD372AEEB77A33185482A1F40D612EEB055D02B0A3E1214C4CF095834DA1E3C1971BCEF1FCA5E8474E7C8FDE062C3461D7ED74EE3704CD164836B25914AB92A4C19A15CF677FFC63221214778BF45DAB88FE7594CFCB173C3A3254D60A36620AE1A5B0C686E2D45AD459E9EF58E6FBD8FBE8565D6C6F5EF650B57C2579B8C13B55E3DCB48F3FFEF6D928ABAA1A8974F2097C31F80C9671E04B82FCB5734F923C163A2EC5F0E630B707C77819CC88A9B8D1310090A04AED7FA0EC5985CD6E682A8B80EFB1C4B56C7539D85866429DC09856EC59F EntropyInput = C7C9CCE7B1240B8C6144E9B7CC31AD066C7E5BC3742DCE1540CE56A078CE5FD8ABBC3DDF98AA66929B75A1A8C1EF7DF6 EntropyInputReseed = 65DAE61E5CB1517859E0BCF811335C979692D222560A5BDAF09E0417073980A8 Out = 8216724F7CA576E570E6157240E3BE443FD76CD3C68FE46F84A6CAE1460CBF648FE14E6929B3296A77ADB9BFBB50E8471DB53745F985A1C8DB3EDF931008BD9E636DC2F53D9C25B04FBE49CA18405E4DFC44CCC36DD5A45BD3BE3BBFCBFF0209A8798B2B3E49428ADDFA97BAD262694E8BDE3E4526F31C5349005040A2390CF479F60558880E5B14632BE93E872FE3DDAFA794AE4A49A20DF89C336CE4FA7D556A474096566B483F089062B44558D76988E787C2962283BB11BF01F43B0B59AE1D39FCF97F7789A073296397289935955DDA8A1F5E57504803A9853A8E0A4563A28DDC5DADE6219B50CF4FA19A63799A18059A411E97EE946FA0F9E61BE4A586 EntropyInput = 545ED684ED657A4644FB4FB942F9945EA482FDF64778EFC735D9C57DEE7BF3A28444A8C74BFC518F43A2A712111DC3C4 EntropyInputReseed = 73D7E0EC983C1A2A82B65338D759410897FD7CD81EDDEBAB0F130109B1E4FE1FB71A7BB4A46E7CD3E127155589B3C1FA2A3AFE077BDF9CDCD849C09B69B10C7C AdditionalInput1 = 32F13538E97F645C690ECE2FEB5F5A3653DAE2902649E24E041941017E22B461 AdditionalInput2 = 5BD7616704CA8ABFACF021EAA27597330EDB26BFC52A81A753453499B24D4D2D Out = 7D043C9C64EF66A48FFE96C81071441B4922568DDA27F8818F7D6DB8BD272CF9C1B078D34DA8863BF0787674D5E5CC19BAD15F9651294161AE1085C5F1EF62844C0E20B027FFFFB59E0FF6666B22CD65127FB162A937EAB7508CA7AA21305C93177FD3144484BB2F7245145C81CF15D98DEAC81A4D204B4D8E82A62F9B8434030E19054F97A602D9A6B08FFD5F4CE2A5F78B20623EBDE244BDC363D467EDACE8F0A84F2F8CD539BA3FE37C1173C62D339C1DB0FCEEF3AC7BFD4140505E246FFE717F033C94CDB9189B877537AE00D9EDB4F499AC3061924E8D47A90A40FBB120C012C42957DB312A051CEF1BDD73EBED6EAC94A92AA2CD55CB2CE859C3AC3E39 EntropyInput = 06D2B34FDD5BC017B19DC43C866ADAA572A597F2285CE1DC5B449B7D028E3006F0028DB08D666B9A4DDE388F0AE188BA EntropyInputReseed = DCBC14529825ED60CEBCE7B0139112E34E560C5D8D6BF8B5E981F4C474F72B5C2B76FFD1702EEF88B399D60EB9CE38022C03527C083E7CA2545224CD006C676A AdditionalInput1 = 58BA57CD3AC6A14B653D52D35BDDA7834C42E5FCE9C3A38722E80729CDF676EB AdditionalInput2 = C5DBD1969203F9B250939DC7FDC8B14563EB676C9BB3566E9C32DAF0235642A8 Out = 72F6E6FDCD74672677CDEEEE9E68D0484EF821F78FEFBDB94919EB467C915B31A6F95CF79EAAF1338D3058AC409470B09B6AF8410C69619381D4C83A1DCD1FB5EFB25AB533A18671874FC8A6566F532984CCA74A1024EBE87E3AF2C334380CE1B806BEC4FEC5D6C79B2C7CB63B4647478416B0613BE5E1732754B51FB2CC659EAD4729B412B0FCA7552085013878A310CE1FB59AC053B55C4B49011A4136FAF00E8F04C0F31FF8F0EE5A39B35B902B74376FD7936EAF06F7CD7BAD35BDCD80A69FF33FA29A6EF1DC4024CAEFD54364D4D911BEA0958CCA544F09C2C5E1C1C19CF37A7261C7F9671549D5EB7AAE3BD5354F71BDC30EBCA225C10C39C9FE70F190 EntropyInput = 8A8F9BC3004EFB95FBD690E4C65B6499FFDC9F81AEB935F5F30C16B496CE9E1E3F9CD9E718B90CFD767739B9FF073FA0 EntropyInputReseed = 9BA31E99C9831139785AC69B7F9BE272434D4C4D263581405664E564A1EDF0B7DCE96BB33AD8EE5B3C3FD3EC8A551F76C2E761EED238E0424279DA7E56AF9FAE AdditionalInput1 = 38078F180100C6027A70487B8E770DCA7815BAB4C6FEDA08CCB9265491F9DB11 AdditionalInput2 = F92F84833175B5BF951A782BB208D9620AC8E67D668A635E2260AD0F911E526A Out = CE0B82A9B40E6BCA1B14E4AE30CD87C26C8B5C1A79D5C09454AA5084A0882453AED406B2A3087D9198AD9E84752B1941EF27ED6696FCCB55526BD9C69EA70F9F4037D43217896EF5568858CD52C25BD73A024105114690C87F34BE7BC662FD4A46C1F6F95FCE034DF40DCBBA1123733D505F183ECB3CE662FD10F0C8987F34CDF34EE4EA5612076F73591C842A7FCC4329A415378D85563B406FEDEB8F5E7AB8C252F9C7C2EFB353A4C2E6FBDE845B42F5D82A1C18E98E0CB1E5624C5631CCE7628CC936B0DE39E71388887F24B60A5AF3111895E90B59C3E1F4A73FDAF7F21E03EEC7FF80A3945B22606BC18E8C5161B5DA1DA0A3694D48468AEAC1835851E3 EntropyInput = 3005B57EE67BCE76D289A77638F2E82050A0DD22DFB7669CF5EDE46D7941B0548474FF3D0409803E2338980A4424999C EntropyInputReseed = F528A9342573BAE931490D802728D300CE099055658BE0FBCED32D624CDE00BB8EF957AD24F0BD05ADA183EDDD270683DF55101BE1A1DE955216D654DC499F92 AdditionalInput1 = E71F45F31458681B1FB03B25F35527B11F949A7E8C863863292B882C4C3EF960 AdditionalInput2 = 0EC04CE83D9FBF37B4D06951DFEF1F0EA05206A52C6FCC225045DB2E00CF616D Out = E618E701B30AB5318C62035927FB12A44088DA6AC32AE3D001C1008DED61AFAD329E136D71FAF15756E271B709E84B226A2C5AF50F8A3589A9DE6CFC7260B84F494D78F5AE3DF8B2C7E3C069762E9A4047D36A79996AE0E65808FA55B6175E69CD22945F5C9A685D64D04B6059F7EA61FDFC5CB86CA53C8C13F0D3ADDB1DD1218BB4898749D9BCFE7B8E22F531683FEF6523B7928B153E5249A1DA320BA9FB4AD6C6DDCF33604A4F6F6D19FE591149422E85D4105271B6A0BDCC37947302CA15EFE41425FDD76587233F33A1B8BEAB7DAC86CE8455EDD03723F393D5A5E0F2B7EF75E52020D0C03A9B231E05430879DA1708944A944CADE3915797ABFBD7D093 EntropyInput = 362A117817AB74DD69C08C273A4A68CF45E57039D7FC5F92C47F3367AAC020F1A802539F054E0B85F171508EFE8A2268 EntropyInputReseed = 7D94CF1A865D79A7B0B48569C82443CA5303E028CB3D6D7B750DF23B226684F437CE17F441B4E25E3911611B08F24D77C7D55920076F15F42B13303F83121ABD AdditionalInput1 = AA08B2EA60E844D720A0FCACCD43B8D5AD7B0FC06DC01C780D3AE03BEFCCB935 AdditionalInput2 = 1B77522AB004FE9380E12C4680FCC121373E08A5026507A1A4A58A5922BED112 Out = 113052951F8F604718359104D2624CD0CC64DFFE7F688EEEC200473A52ECF8403A72C9C29BC42E423E90FE4F103F5C6C3513CDE03356DEF85B1F8D5D1645DD8791858DE4362C162401029EBC85C5B0FA4892CB73D1F2AB1CE9B011B2D104A8561DBCCA42FE26FB5C96FC0C0E2D649AE157AD81A57437EBE4BDE6CE4A22366A797B648786C2C3C445404DB542AA76A8A2DCFC2D96AC63C6E9C51AFD4ACAA08AF974D7919E506FD14D32CBE9BFE2A0894F411BD5A87F8B257DC315D5DF92F471423DCAC6785310FB6F7DA1966A699681E030E3566B222858C82DDCD50D848DBBD99609402D128EFE62CF93A21FB48A502A331C1B9B13E6B1163AA586C76596E500 EntropyInput = 6D81640A883B74FE7767E93EAF2E4B42E0857C732A9A4959F03ACFD86866A68F47F8D49332E3D9C5E4D7AA7AE9F51704 EntropyInputReseed = 71856D0A5C434CE2138AF494637B7978D5E58E3DD0C5C989BA319B9753A7E3DA8B65EBD0E2C66004587D28441C7ACEE7DCE8F70D24E7173D61A93ECA932E9EB8 AdditionalInput1 = 87D8CCEDC2AF4F297B26513D49371AF3567F63FE0C8E28B2DF4AFB306A91BC7C AdditionalInput2 = B96872A0E81341D8C1B61C4ACEAFB6591D081D368B388F71E819B90072DB3BD4 Out = 3A8B68A4FDE7CEB18099B0591558B9FAEC53390707EA5271E1639FEC04F6817166388C6CABD889745D2158B267EFDE6B30846DAC0B69A2560F35B46A28636233299F3737F7550FEF98E1CFD0131C19011E357B057909AFB11FD21D8759950CD59D853D262DB11E5E055574D151A34E5A22EC21A8837E8F41E0864484D11CF9253144F48A9E947B668E400D45B2B49C3859DA5FB78DC7DB4D2935895542C19FC77121918DABCD11D81F3BEAB04DFEFCC2D05C7EBF68B626DD8628E626D4D878DB4A355C65287F2C93BA301A0FBE6D49D7ABB937CF7B65855252C47C330F108E3A9F7DE03BB25F7E726937A77CB0F2CAAAD75378072AE8EE40255A2CB3322E287F EntropyInput = 2AE4318F5275C8DC22B6E1D6D5CEB76EB2DFC9D106430912B1C8E26ECE1A79C615757C703D33795A7CF41AEB8EAC5220 EntropyInputReseed = C19A60B5B846837E2C924B8B22468C4720EEC960AA9FB599E540B1B5E6FC1CCC8B76231E12102F88BC919C9B1A7EDB8832104CCF62C0A1187F1F45DF6F2C28B3 AdditionalInput1 = 60998FFF507002DFF1A8795C5FB0FE4976700AB4772E81B12525DF09A3D63B2C AdditionalInput2 = C3423B951C662F4B0D02D0A657735EA2EF5D2DD570F916AAC48879E9D1E887E6 Out = 04B578487404B17B4E87B47CB74E655AB139E37A4C4572EC7907D38A369FFA81A29717604E792D2B69B3916D5B2AC3D04160886D04D794148DC3ECB9F24024BAC3D6A4AE587883879D8F65D6EF0595DE4118685AD924138B36C17D2E61A40159A0559F7124205CDD226B6772AA87D9E7CCC9E2156815768C820E00570E931CE7BBA22E11AD36B85D85636073F42E8F443FC7E77CC5F92CA77CFC7548C58FD186E7D2AFB20BD5625F44B4CBD8262B4BD2530443B6DC40012B4ED535B660ED4D6D29BC630310430C528763A4157FA67B63E11C5AD7A6FADEE6442E64DBCAD8D3183FA74E8BDF66041F49316FFEA392C30209084501124D9522BC0A08DA16A41616 EntropyInput = 0DD057EF77BEE50DE12AAE3C72EB7051418D71ECE6CEFF3DC4E64DB6FD6E2C6114691C684D8CD44A39E862D368E945CF EntropyInputReseed = 12B8D3920D6893AFD0DB67CAEA3673FC2CCF8D6F51FE4B85E821B932A09A39120846F575AD47ECE17BA6529C86FBB2E2FD5C9FF92DEA8E7B4C6547221D6E96F5 AdditionalInput1 = 39C5D1908A6779560EF7CBBF346E782918C55AE2D27D6FD127B786FE6C4F928E AdditionalInput2 = 46F69BD9072680E5DA87978A8B7E7030E375884C49C7E21F4B55753B21560162 Out = F9D3514135500F728190787FAB08F36E969B7377FC47AE6FDB24CEE88C80C827ACC27078A9E83FD8A20C4F836BB892CA5043C2789AF9A73AA6817E64C87C0EA81B2F48664F98A9ECB773BE85BA658597FC0B8FA79BAA619E67D9139992FA7C622F5E91532EEB12585FD07ACE5515E518E2F8088ADCFF34AAAC998854BECA1804F69ED615C43FA27D1C70616AC0B19934552F4E0DE884864B06A0306D7AF69594AAE40C3A12FBD0C86FEE23FF19E45173F45722EA1A2EC4AFDD1333D0B896738A30ECB6F2DB40FE44D1003D968E2D3C7238EDAC323E34BF43966BD211C86058B1AABF1D29BED42592AA88D98AB1DDB435821D583344EA70A463D02FC9105515C4 EntropyInput = C16EF3F5D2A74F77A02D82D5E3E1DA808B37AB4376CC6F68E068D696C3F944BF31A290B90575C40B807B5B1562ECD818 EntropyInputReseed = 2003CE7ED4CC11F6767C067989AC867970FD58BBBB1A6EF4555E1F599CFAF69E4E4699CB379827A4FFC52C8EDC3EC60D212CED58CDF91B986F68C7350EEB2CE3 AdditionalInput1 = B63392656B591466EC598021E98435768F63062324F16BB8C5C1A646E3A7AC8D AdditionalInput2 = F204D9BCD2C7B5BF1D60333B29624E8B4B9238F7F5F276423B1466B716426F41 Out = 945D936631106577878FA3FE4F04E8C783C038F2E7DF1F67D14B702CFD4930D629C24321DA7FCD78B718B236AB7B1C8942E74954D97631B028DC2F805575A2A1FACA54163969CFE0BE598146E00743B379E85F795CC8202E3EF28809F6937E5767D033E028A81E730E19AABD473AEF5207C59977A41571ED97D6D1DC62C2815FAC4627BE61BD7B7C4326295CB64ECE5D5A428F0D22B64127624A97CD5A28BAAB0EE4A750340B03CCB3FAA986AAF740D4B759C2C6A8F36B31BB91B397D9701AFB68D649EAD0C4046C5252E7AF301C25FB48207A19184ADD5C33AA9BC6A0B022BE260584BD41FDAC458C6C8ACBD6863D9020C712816006DD206A730A28B2698FB1 EntropyInput = C6AF3DF15BA98DA5BA109FDE7AD1F69918332D3A8E28A6CC59CDC481CEC541C113ACD2B7826E780BD84B9040C5D0F8D6 EntropyInputReseed = 428D21AD4EE009497969138F727C7C1FCAEED0BCC313E0118F09CE7F1CBCCF766C2B4FA479D1C6B1224DB6CD2DB946595DC3B563839F88F5D97F5BBCAA428FAB AdditionalInput1 = 4A569E611779068116B7B5792FEE13300E6F2666D9C37C48E4D46E5BB36AD63C AdditionalInput2 = 68467D9583249D75B0737A078A71F8055B0702B1F82CEE4F6A4D00E00124CF80 Out = AECFA7EAD4871AFB9A5FBD80F08AB5379131213A0FFC13A762351AF83123B28357418023404E83E5D88F50EF6075D7F3D6484AB36F1F02C954086EDF9CF6FA881ECAA38E806671D826FBFFB01F57D1B2900EAC52F3391C85B72D8017D5C3A8899DA0859314897EE9BFA3E1A4024AB02E4BEE12143CEDCA1C2C91E22FAEEE42FDCE7F13F7032A756DBB19AD165969164FAF69210AA03D2BFCEF5D510C791A031193DDB1B9F3A1AB1283C0D554D630FF63B861C1FA7186CE71FE4CC17EC15D7F1CC774955664B7759A639CA9054B5AB6CAA45F4BF616383C445FCF30439331E16699E4BD01088DB17FB5B3C55652D83B7E48D8D01C9D09A4AE5F5065E31B6249EC EntropyInput = 000999618E96C9C20DE460B949C10553BBA99ED2A629116BE72DC4F6B48A61D25F1611D8A9373B63AC037FE4718702D2 EntropyInputReseed = 1B3E4B6A268CE1E20F56D5BF1BDA9A4B80F7C9DD9AF97F9E55F253C3ACB8E1628B37867E6DA9EE5647CE0FB7684AB4E15B2DEBABBB82827ED2B8E5E67E3CEF3E AdditionalInput1 = EFC853DA3F3A99B0BC47972EEC6E82DC0EAD363785F436D2CB0FE79055A8ABE2 AdditionalInput2 = 6F57C38C68FE6B700063BB4BCFF1A6222D4F24A408324AE5043F74E113AC4319 Out = 40E923507625EC8D10EC391E920E97E175BBA84D7CA28A3CBBCF06A7FC56C207F6225862B7B2C5B7B708F30FA1AACC75EF0A4407217313862D4B4D2E3BA6A444D82E7D029A7320B1E2BA0E388A67EC5ED31FA82F81A638FF87325B6824243081E30D5D09EBA66D77B61F8694CEF65AE96B2DF87AB898327599D184B9F3C90D6B541DDD47D51F78CD748205F089A45CB8DB7B6709469A4255A183D40396EFDF48F3417E10848FE539C100E16994925052D3CFDD33CE9CD252971698846169C0B71C97C64C5A06FA83AE4B11E916989294B453FF5AA408A15F88C58F1FBAE9290139869F60EC42F51409DF8763BAEF0FFD9F9F05F3D67E941128B11C6D57B088D0 EntropyInput = 5FA3A7133E8D078D7941FA0ED22470A8437202B719839C0B399A21C53F4AB174BEC2F97A67FB209F0E8622BB1AA901E0 EntropyInputReseed = 1394B8D21C33AAD08857EF1EAB4DA95B3A93A85A898912CA73A19C0AA65A7AE11A0CA14BEE19329308ECDBF3829AFD8106F0F06730CCE2CAB23353C664D3B7BC AdditionalInput1 = 21EE9EF17FD3643DD2B8AC612AFB0CD0764690542186ACCDABDF4360980CE3EA AdditionalInput2 = 92A6BCC6DCF29C77009C11BA807D7CFF1F62E70CA5B6B1293513461790CC6FC8 Out = B9F9841CC5ED73659EA7D536AD9D6A3061E8083E14455D3244D0ED2CEF1A40B7A47EBECDCA0DA4C01B809FDEB493E7C49310FE089B45FB677156281020ACEC762BEA6AB04AF1609A15A7F45ACF917B075A600B8F6BEC67B99E659B36BDD3DDAE44672AB87D713AAA1F83F5FE29E74B09E182D0F03CF0ACFC0727195352BECEA540167C4218289A028D0504F1F0BBC345518C13C04F6BFEE8CAC9A09CA4F8B3F5DD0B57125A7B24E404F8D7B3DA3B930240BC72E861F23B1693934031AF77617F5B638A39A58E29AABC2EB47F20C90F66930AA1725CD8CB1FA1DFC32934636071FB7B7C506CA75A8EE4BD9CF16325E8C3BE16E00A9831CA2B976376ADAA8D1753 EntropyInput = 8D4841FE7D1648962F849A3CDB5D26C06A992D1C4B60F06A3042F370242249339324F6CB8F4A02CAABFE7C97A84C94CE EntropyInputReseed = B8EF46C36E120F1DFCF8EA03C5726D2CE43E15233EFF57B3F5B2623C9B44C98ADAB440910A8C6913B587264138408778ACDB68E76F95FB1ED26161457479D9C8 AdditionalInput1 = DFD98096721A26FB104E5FB9D9E59447DB40DF85506DA0553046BAF93AEB075E AdditionalInput2 = D6D5DCF829FD2E6D23BC2293FEE85CD8C8921FB6E4256917F342032A788376ED Out = 38459BF2A743833EC32A1ABBF2DDE631C781EF71AB20C3ECF30C1AFC0421BEDA60B0DD61F81B9B8DC52D40DA4BE08471A33D2D09DFA5A515B035A99803F66F25E2854E13FC4927DEF147FEC46A4C8B0096146041C39695D60AC6214F97A68F7BB83CD4AFB9495A8A36CA4D278CA94A7636708C0E9789705B4DFFE288179572201306DD3A5D30C364A52EC5790450FBC12EF65BC60DFE95AF09BAEE0A0592C8FAA79C916825F61CE673E4D457C894AC46B7EA22D43EB05D1CB6CCBFDE0398B552ECDFB222ACC6684284F9FDF4A16390C1221C3164A5F57748BF830F938DD80D3E40007CE7DFE93D440A76509A2CC93D1463564B221671D7CB299AA773B4A0A37B EntropyInput = E2E87EB2338B3F735DF677AC67471D2B3E515B8ADBF050867BAA07F31D55F23748B427FC3E992B6AF5D66113202DA718 EntropyInputReseed = 0DAC1B8800345229CBA67FB012487B4C61E89D94355EA474F0E8E9E31EBBA7FA82991CABA11B7EB468036F6F2B46500BAD4FB2BFA8299B04825EDC459F29F412 AdditionalInput1 = 5EFCC075F14399D7DDA0C85ADD405E69735BF8E543AFE7B6CE5E93729D2F882A AdditionalInput2 = 5A26C8F4C12C5C2A5A22F9DAD3529D6D85D6695AA3D57121569216DFB8558562 Out = 3CF48E1659A4DA356F7FBE47858150B5801CB4A0B1632542916CABE536863C3F0DA6F2EE7B577BC878629F3F7D28D3624AFDE4D375B21530A519FBA5C8A536F6F7431FA94F210041504CC758C98CE9376989CE1223FB2722B6239997714EAE64DF23104DFAC464D27ACB568754EFAAA73E4E324FF516312CEF883B8D4A65DCA0C0D80EAD8D308BC24C7ABA9EC33165DD0E143964445D0884531C0E5F8CAF365B24E5CFC4D3C1A03E2B867871C86A1E5B52D7B835A6A60427BE5CDC7A58EAF3685403069D5D872FBA0E6C5CCB4E054D1C373498BC7935F91968A52818362374AA886AB1CD33824DFA602FB2EB546E93AFE21F0E4CD57EDEAEE2FB87F758B03788 EntropyInput = CEB8044E3C21A6928F509C0711B07A921488C203518C5EA3D9AC35FB5547CA19DE50A7D2A0A3074E9AF4739701809284 EntropyInputReseed = 110A33D7DE4880467213C9F7454E84ECC51F5B7DA88A200F19980FCF4454DDE7EFAF25BB4817BD288A197420614D24A09807C71DD5E959E630ABCBF73A85C800 AdditionalInput1 = 357B01742D49116DD6007E6285AB47E5D5E937027670BDF740E38BBE11A6F730 AdditionalInput2 = C25890A14BF6BD05E2A5A656B85E7F39E7BB0C572A0465F7606D7ED8634FE147 Out = 95A901A8A832AD16C2461A70BF572C019F85A8AFC034145009303462C7E54436371505DBDCCCA76220C67B967C2420BB621ECE0FBCD62C8CF9BF120AAA5B47EF444F218188E52A9847592D4B4D678F77A86C46ACE46D3898CB6C28B28C44A55026D847014BA65DB435A5AD12AB9C1F2C573FDCB94F9C9E1BF4199FA6AD44432E138F623132A0825164EC70DF2B0C20EC8F5C42B88AAC9FBD20356041D68F5A21DC776CC1EFF74CC4A9B8942728D80E98A7FF8E31D755A35E37273A0B2BB24E86B56AE10DC6912765CB2C386E7D1BFC40D931CC9D25ECF204C422D41D2F2347AB2F0A6BC32F912D31007D6030884037D3A3B0E846B520E2A4352FCDF6931B3271 EntropyInput = 29B97C421AEA05EA9B1C684A8B91CD04E576A0198831C42A1866824A3462C7A810A7CE396F4BEA5227545C1A87D74EB55E5B96B38FFFB929BF3D7440E60E9C38E6EAB05FD1E12AB82CB5FD5E6DA26AB4 EntropyInputReseed = 246C56510A652FD90EA377FED315D7576A2A230CEFDF4F45AE2872B9D9ADAD3F Out = 614667AB1EE75ED7131F2E37DA34A9B3924DD8997B35335FFDDD67AA3A5DCAEC1B6CC9CF32AB0C277F2CB0CCA2AEC72D663A258308A60CAEEDE43D11D2D7CB811F38677B813175D932790A37449CF28AA6813AC498965F569264C323FA5E120E953488182EC97A32DDCB835C4551F085586F3BC96894B30AFD7751E4A690B57AFC84195FCB97F8DD905116E6BC38BBAAAA543ED006D028016813819189770382E75B66620BC07376B7895620E2D4446CC29E22A84BAD1F7F8711614C7E919D4821B40DDB460488F1ADD36B40B423FC9CEDFE10FE121BEE24E20C4F0BB18DBD71C602AF0B7A5A15A3EAF3CE44B2E8709015F135DBFD0F76E4B8DEF775801C0E9E EntropyInput = F2409EA4C41352EE5AF268FD9584B9D8B74325ED76458028E067B6A7848FFEACA63C4DE6224F9624A3E8BB780E4FB10EC809CEB9BA9EF8A77190E8F79D0019D64BAFAF01BE89D943B591E6B1D6BF2A4A EntropyInputReseed = 765F868B1F5C5A62BA736719364CFD86E83B77CF90226C434BA038EC1C487954 Out = 4C2E3AC0A2CAB0B5A0D7EF6B0B94D06ADAA73AA75AC704A4BC683204E7088B5A27B71321B8747FFC8826B17CCA9DA76363D8AA326FC52E3E079650A04904A251871E1CEEBDA57A5476572A9EEEB177BAA46CA2621E63CCEF914E8B43120D45E7511FBB02C917DB5D1E7CCB1A18C1336D885C0228DB8E421461F1DAE3BE994467992CB287A5FAFEAAF1CDB776C46F4F391413C1AC79744F181239CE833BDFF5C3BDA29DA858B2199266604614A77EAD66BF509FF905DD0B79160225505E980AAF81C1E34F210E2D4D00A8EC53827356FA6686DB88328A5BC0647B0A29DD2F54912633F00CD9011C8A744451D784F3CAC069EB1D574E71AB6B53E81DF549F0A3AE EntropyInput = 7E2D49371BA4F7E2A02B8F376D1DEFE0B42FC7008CEDE26F3E20EC167B7929580DA762A0BD6CA5E11CD784A80CD0EFAF6B40FBADD827AE4A6E879F7D67B9FCDAA616791A609F23B814A69473E8BCB3AE EntropyInputReseed = 957C5FFDB08B7141E7B69F94E5CE083C6B6F79321EF0919237E3917281E754D7 Out = 88B0EA15B54878BB8839161ACCE7A343063544E6D1A7ED295F09A79EA503BA0695A062799237C01BDF3C54A9BF3CF08FCDC4A37FAF63F3AE76794DE79C61A538F0B30141D6991BE8AD346DE9BC8E67C65ED73ADB8DB9C697859A8BC059235530C7D195CC8B63F57B9DB20CFD1ECDB54658E1C209E01E1E17E4388D7DF38B8531804FDED3362D516BC7F9C8F0BE688816F03F20B5BA69600E5C3191EBC2929551EB744A4D616D5FD68028A7A672476CBC261B68AC71A37C3DE4418D1908DC19D5EA878CC917073DF2EA9C2F9691CB6F547EFF8BF6AED601D6DC6356C8E84A4B4A1926993EFC03357EC7A7F9FEA1063514015E9CB214E213B391584982E1C7C315 EntropyInput = D2F93FE1BC63DD3AB6E858821114ABC7E6865CA7A44E10CC73A0082C828AAF6C88195E443CDB0768454A9281BA4BDB9584C2887B77740BB00EE5148A7B59EEF3DEB661895B5391C29F7B9B09558D654E EntropyInputReseed = 8DF1BF3B5F340714702CF2F759B4561FE5A79CBD0505DEEA0C3E56B7BD806F92 Out = BABB2649889621702DB4F25046550066B65987E5E5CB0A7EBCE9475C7EE2D56B0FC77F6435DC0E723E7A4B4FB3C7FED81471212D65A02C914F3D1A6BCFD00E9D1EEAB58CE59CA819A8689710FEFC5BCF920C35343C05B0E3CB936D4866718DB2675872B353EA484E919E50DF3F3048BAE9DF35EBBFC2790C972EE88A27577F349DC46FDA1F67D658D212ACFC883E9CD87DA998100E469C71E94810B3BEE86E0AB0CC508026E82AF5AEF8C8E327D3EB4F6F08284A84604E19D09CB2F4CEE2F9ACC6FD75FF27D218CD3583EB0858E66C7A6569E24184C8E61B36F531D53F28D5C4581A9769F471A129F28616041E94B960B18004A0254740EBC2185B46CC630FA0 EntropyInput = BF25687643E7ED97B741E04D59C5B47507C8A7FE9A38617C6AB21070E8E8CB85CFACAC44EAEDCD21B9AB2B50B2B539230E4EDD33AB00A327466E2ABD6D3F70FE9614C91EA271F91F99F0986EA17A69C7 EntropyInputReseed = 5AC27E436FE492EEB2701220E44A0DE21B3F1AA7FCA6C10D43E4784A44B891E4 Out = 60576698E3250F0920DBDEE8257FF546C46AD01D6F35D28563E6AEE09E1B77274D94DB0D85DE78B587AC35CB4161F3F33A5063D1B7289D89FB7F65EEA84ACF9CC3B96806A1DCBC479E205A5CBABEB70C34A51D8A5CB6D14ACAD5EAA1595D42E897CA0BE571AB594052A540E0312AE16DA9DA8251AC97AA77CEA0EB93D16598C046F2F5331F971BA81820C49011773797630901D33E6C4941E883E9186D78AC4B3E4E745C30175A774258AD3648B1CA3026E99D16261DED265DABCCEC640ADEB92A8C3C0FABB36A53C312B3AF194053EAE3713B8BA4F3EC310EA1FB34BE5F2FEA0A719C6CE47BCD6E3F2A287E728012D8C6573D902924F39D4C8CAF4B4FBBD8E6 EntropyInput = 89A43E673CA4A0A2A8002D87ECDCC1664C7DE386C2ADF70772769121C598F39CA39D4F14FB27E5DF196654C2C3DCE58472C86C6E903705359D83B05EF85B38631C2FAC4599DF96D2691B3C0C45E797BB EntropyInputReseed = 4CD70D30D623A8DAEB43769E8DE1A0C1357BD8D578301B58BE4C6C2103CAA27D Out = 12EB84C93D2FDAE20D17ADB82FB98D89D69A23BB6F8CBC1530DC624A3992714080B5112638DBE84E3AEED84B6475CEF41AC3945A10CE9ACB48F1C96709C7BE92DEDAA5E0390E8682CDB8FB09A62038C4ABAB38037599744BD0964039B0A9E8182A372C240653E3D20346E44CE77C74F0E91A9F547EFFDAD10153A7403735C2C4F2A46B3B6CF43249D0626AF1B786481101EB7FB21327C68CC8A30E0D29CC8A4482FED943404C771D6A9481190364278E2D2CAA80A4A402EA003162158E430D33462B04D66283009ECD0323E9A2F62EAB2218824301D59CFADCEC0D68772089607DDA9F56D180CDEE757050E557369199D35AE3A15539993D8A7E4C0C92C2815A EntropyInput = 05EF826A27AE2A4F129FE97A167E930AB7DCA0DF567A779DE4E7873FE1BA14C89FFE8AED3C62108C2C444960904AF4DEC833962742AEDE110F9475561FC72D6DB3EF5F77F883221043CD94452B5E30A0 EntropyInputReseed = 54CF7D692F6C0C4B60346D401B05943455F424809A71A67ACA5B916FB9419A9E Out = C6CCA50BDD0711EE4A7DC36D76D61889C094DE18C11930257C4D80B70772FE7F7687CA6ACD27C4143C8BE1A173B2494CF0AFE04DA97CAC7E7CB908B10204C92B49B809B6FEB128F35B2E8676B406171EEDCA25DF1995C38FC8B21D72A70BBF9539D86103E0006244E7A8FB89D93D96014C8311CC5C084C954D07D8A1003F52729FF0D079FA4200B41EEFE172AAF5361F6690E021A4D39BC6CF3660308D66F35E1090AA4A18415A690B99C85A56C431155399D3476AEB2041BA4BA88CF024DFB70A253062D2CA357D6D5FA95B360AB42EA819AB35AB087768A304767020C1E44542017261A39893BAABFD736B3A127A45984B99DFF66A6173F312BC79E5E5B3BB EntropyInput = 347ED989ACBB676EB12D0E5043738DA8FD532F287ACAB82A4A9C2ECAB0A6E9C90D617E3491A0D88EF665E031789FEF0C9BB668AC71BC986714D42FF36AE6D7F9E57B78C9FFE88F75C22DA16BF55A9B35 EntropyInputReseed = DF69A834946C9204274DCA12A4DBBD11AD425FCD4889912B6B82619BE808E1D9 Out = 3133AB00594B250385747349F0D700FDC72D365ED84C0383531F53F81E1370EA4F78DAAC5996981400084015B372490F6A6C0A4981860F9C1639C7EA9C683BA3D0E1863E406E0D84E4E444E51B2EAEFE7B7B79425912F086792A3C613F385ABBEF2EC8291EB39059101AF8C431D0AB3B51A4B39E012C51725DEC23CF8A52A1FC1F28396EC060F3413DDDA9B8DA9EC0C05C78A9D1E4379ED1CAB451201FC5970C5382299E67B322C184470D55B6A1C15E9344370FA3D3C9E76116FAC31985B25495F7C0E80C7F242633BE818A6DE4ED52944668C9A8108C41631E036FA808863D30E88EB322751C96021348F1094DF3AA826135A16875E02C0E59CBB4059629F6 EntropyInput = 3409DABF414EAD79E220E6C90EAD0B2AAB79175CF188328A7F0431339CAF168F3A2761C28F9DA3543F36F9C1E0978C083B80BEA4A3EA58475E01620387D1778C38E644493A4CCF87CE3BD61C3113C83F EntropyInputReseed = C22A4878C876DE0AA877A5034F089D10B913347BFA2B1E5F465E0D6B133E8D2A Out = 2CB8EF277DD926A67630BBAF950096FCB2DA9AC03229899439660899DF184A2AA1C79DE3A00C1D40A9A2D9CD9341102F12F6D9EBF9074EE66FF318263731426338FFF04F0091F839034F50AB6B01F9FCA64663333D113A89767F1DDDEFDF5F2AA59C50A1EE442310D3E976D612D46AC27D0FD216936E31B44A0E4C0818B8E5D178356C421D642BFDF066F9B7A3AA49FE308E6B69CC9A96B68106C9DAD97F8F532C4749665570AFB5861DBD2DBA5F7051FA02D925BD7786044173A31A4A8EC2CB2E4BDAB2BD780088F60207CA27DE267BFD37046DAC096D4A075B6829C6718BD479B5367FCEA2B2A83539DCE8A61BF6D398411EADC6A7AE6A4EBEF96052DC2FD5 EntropyInput = 70300A8F5E3D5E36341161FA5EF172955C6661928A50E657569515A104F2F1EDEAD933F6EF6884C78BB361F00067807ADAA27C0AFD5C0BBAE90CAAB67E97FF0D44DEF4AD5E53547D00FA2ED1CE89325E EntropyInputReseed = BA4B615DD687B2F55808801B1831A333B29D91A42AD11AF873482724E105F3A0 Out = 3F24399389F40AA8240B65AE509431B471CCB359FBEDCFFFFA203585E78778AD5F25152AA70DA1749EF16C596064F58A5803F7568361AC7EAE97E90A37DCA8E61442911C64ECB147D822B4B0A5F89A6BD9C7208C093EA22223584630BB5769D813D03D6E397826A1A0620E351D1916E30D1203A39893A597A7B41DEA1AF80AE1702D5E644909855582CBD54A0A757AB0D02BF9E7041E721F8B711FB9FC63F04ED97CB94209E5222583C43542153C12A5B65A30ABFACA7725CA263A12C770B0ECDB448F39BCE63D82A7198F6C82C9D521A57DDCD94A3FC087A29D1C40A5DB25FA993398592C70AEC992A6AA8A156C05C0C76A93992DBD0C99F79CB860DA58ABDB EntropyInput = B21CF00ED16B83B0455022A5BAF3780F070E0DF1D739CBA01B9E8BE69C31467E02A3D9610EB0A518149F01E5A8B4F84BB260BB187CB067E1189B9429736D5D26DE6AE0B68A27A78DE329F8D317D26412 EntropyInputReseed = 91AAAEED161F89751803FC8AB2773225FD66C03001BBFA373141810AF1136927 Out = D6515B41AF922A0859D855DBC4D57AD7B6E3A34D9C18299F641F6A5836D09699999E59C63118325AD9E8BF91A733363AEEE359C07201B8375C95F3B5D69E522D2040807C789998A00B1CB5ED1A930E562AC9EB7EB6DA7650678142F3FA1E0DB456D3E74EBE7018904F7F4D4C45955165B7DBDCDF9B7AA15A88FAE4D2D45DB5B72B94DA0EB593FF5AD894995837F063E484F73610E7443B3ABE12B49EAF90639784CE23E48D2AB1758986F9023E0AC50AB74EF1674AEF7BAA1FF1399625E04C7AE5B27F62CE6116ADFB34E7DA7E17874FD326156B6AE318AE12B62FD887F93EB1DB0ABEB97FF1ABBCA03D14FE85296079FD3AFFC2C97D47C71AC9190CF18F2EA7 EntropyInput = 13A697C488C71D7985C373DE70F67BDCFC010400E35D7FEAB0B7885565FF2247048AB77A683D1867E2D3CB4C27AB16941AD6A7218E29AFF18CDE5731B92923E910FCB37E501487079ADAD867B4F4129F EntropyInputReseed = A595D37E7CC6563D7A947EE391153CD84C163668B3A12120DB5B8DC3F7F72E38 Out = 28ADD1C3BD50E0CB095226B4B1EBD5CD4C7102B53068A0BC368F4C2B260B0C77FB958277477A964DBE59AD60E47CCD194EC593748BE4C0C096D134E0374D98E23AFD1BC80CECB4BA50801DD34682C8AB87FC28FECF004ABD7A697BC508D63E469D523AD89A13CB1DE2F05CB1E210A3374C742279CD93B1EEB1678E99BD42B053D8DB130F4D6386AECA9EC28C83908022980C0856CA71BA67D292E2D8958CC3E96D2FFE8ACE152EEF8DEE53D47E2398991B070A74DD4029D0B44495406D5960BE58D05AB346D1309A14FEA069C57C3AA8E5941A5F2F53A5757C937F244CABC352A074E1C7ECBE350F997E2E3AEC6EE1B836B656B36501E238BB0042D879CBBF04 EntropyInput = 24C7D01E2DC197D833153ED3FB431FA08C0BD164FDE4A686E913B7DFE4AE93A58B9102AA2F8DCC5DC5A6DF047789126C307BED435F3450B8D35187C387C3B9BFDF65366388D589F2B1AA84455D12A9C5 EntropyInputReseed = 95F5E61651E32C7C62C1A30265DC10D5A2478D8F419D1DAE19950ED2EDFCB39E Out = 57E9E978CC9295389D20D5007FFBF0EB85624EA551445ED447D02AB62F7F5352109C550B96DB643091ACA70E0D8D252D68FCA3F9C080EDFF4A9602F84240A154260C930341281675D565F4D5B978C89680A181301E4A372A660DE61E400B3C4A1010B2108BFCFF340FADFD1E2E26EA48DC80247869C6FE85B2EE559181E3CCC8E262E16CA06AF3DAE89807E7E25767594BBB135695C3F04CBC5E54B0D2060D3BE87D6A32FE2B60E3CA139FC4F45439657A71B054840545220C450741A819E9644C6ACEF107112DFF94C40352259C66085CE677071142C404192964256E2D8BE19A93B42E40519EEACF53CDF0815CCB0B4F4EE10CD094E3CA205F5CFC286333DA EntropyInput = 7AF96E6ED7A459A4D918D5995E4A24155F2AA2ABB93887553BE440C9DB2DE891F27F42FFF55439E9952E1B1D3F6B9376F2332C8A3CFF77B3270E43872D4FAA4EE214BE5E0454B33D6CD1D044063CEBE4 EntropyInputReseed = 366F4DB4C743FC9711C59A1266A42BA01F07817747C37E3CA3365B530FB44AF7 Out = 44E8FD98EFF4C21F8A9A3CA058DA404A671E6336E616BBC2F72A3939244A178CB9D2D97B85B893C8338CE43A977072389DB97C8C17C75EB1F6BFE50E3ABBF939A2E6539CDA81A986727349C7B263C6BDB329B8F0D872721B6C6E7597D881B752F73EB00F4F3B9C50DE61BC966E91F92C24B045865697D799F01ECAAA04414E661E68E9689E21C03B7E90D628526488C7802D83D00F649009E882A375305BAC3010D417214577AC95D26184A8C22BF640B11368EE9B316EBA4E7C5D1F2E6052ECD9D6DE99886EFBFD49D14E9AF898B8AA877AF74A8076237EF2F1EAEEA07D16B82957BB29C5BF21FB400B484EC868FC113656A946B4B18677E880BF690413D6C7 EntropyInput = 2267F893091CB3F47D624040618B586245456FE8B224DCB892B21BE185C4E7E3C25CF2E956AEC5A71F526B8D1F8CFD4CBA838167273F7DF0B4D6C31D0F415152607917717BEB811E2F0CD4DA790365A9 EntropyInputReseed = 9D18E0C1816BE06FFAFBA05810A38C55F0DC3AC15EBD0A8CA0B951712CF37B6A Out = CB044C1696B33CE79FB23324E8E38B270D3D4B7D1AD2A75D941D40744DDAAF0C6F34E80CEC03EA3456FBEF71D2EA8A88348E3215628F2F809F80004509CE2F543D59C1F85B3C1A0695048310DF58A3D97D7E06A7B9AA1C4C84BE6430608904A90E4AACBC8EA5B051D15B6C5D6D8B91FEBBDDB13A8814BF90C906C596D23EE1487180889257E30AA978479EBAD00CA51522308029A38E38E95E6CCC09B8F977FF10B912CDCCFADE70B969F91DA0B9197F42BB4661E0EC36FDA3F2A25F33F0013B8982F3BD57477CBA84A52B32DE3DB5E36C69ABE44136D68F6CF4F2D297DC7EA321704D8208EB2613210EBDF0884E1778CF9796909B057CCEB5C17EBE6FE1FB10 EntropyInput = AF4C306AB5292676F711128B884C8DF15DE05995A74270EE3EF5CD33363D37A633869DCF0A9EF3F84E8F34246E43D1C5C969CBB355CE79C09541DD29FBB6C8583BA2CC5305EE52556EFFD1B9DEE18B20 EntropyInputReseed = 1D62A5392337B72369AF065032C7B6D7E22A0DA989ED8ABC2BA6D240507AE75F57E8A0C0EF3526BE05C215C316B1AEC403B9ED42CD738E7ADA986FD5E9982F4B AdditionalInput1 = 4141FA2AD958E3382361FF168FE81F1E90E3975370778583E6FD74A7A3C7B46D AdditionalInput2 = 664716A8E5CAF325B08E45F6D9E84CDE55A35CE7A75B29E39A2F7185370ED307 Out = D606246B38BBF387071EB492725ACAC8F13A80EAAD1DF85351D07639ACF20FAB0772DB65ED263919489F12E3278D3428D1768C7D8E9C807478221E761336F1D0E93812D7893CDD27E01D2293FE54F419664048EF867CBB0F68F95AFF2879703E53189D58C9AEBB368E4FFF1EC7EE08CEFD9514D73393877D3080BE1CCBFAF3F0C5E02E9A2E0AFD031A1097AC1362F9E1704095D47BB14BF46E820705EF3B21F587EDF986CF9D76BD6F86DB9A04CBE6DE17E855801BD437EB4F8003FA3B2D9D21C8037EA459A8291E1ECD41AFA22AE973DBA0E30E6B3A70BF35BF154F147BB193091A40D3FE6005C60CD226D95B95DE5FB63CD63A8D5EDFFD5F67852A9F85E751 EntropyInput = 4A25DA8328581B2A909317FC3F69BDB832236226FBEACD0E4F5C41ACA7C10CB632ACE782EC3B86F9584358B723F9E573371A8DC53E201846E1C10A170E0B8F1230C2D3D79E6F1E309FDDE35B4143B8A2 EntropyInputReseed = 454937DC6EC31ADBB15265B7CA019336F9CEEDC3CF3718259F3F499922CE4C12DF5FA8EFDDA662C2A3738A01844874DE8B49531BB75F50FDE846E0F096EF4E40 AdditionalInput1 = 6F77DCDE0CB365CFE261EB15BD7F639B404BB6B06A3897EDCA0BE4B712CED536 AdditionalInput2 = 9DF9CBBBDF91920CD81DDA13D95E1E550552F357048DEF1E08BFB8C28450F146 Out = 3493EEA3CAF0586A20F8A690438A0D3BD70FDF26102D57EA7CE85CDC2B237E34C3F2B92F4EE1FAFDC72AD2B5EC29ED9AE25DE9CC39BF090EA322A3DAFFF72AFBFAE456BB08AC872319E648C19D4276DF650092F1BBF5B124761D99C0D863E34E22BB6A4ED9082E5D34E0172959296801CBB7FFBCBA8840F382F14136E20E4B49521A7FE69B51129E08BE04A6064D5CBF7B5A4758EEA747DBBF23C91EFCAF832E35179C3F2A8DCBD633CFD717E3703DED6D84BB1D5E6879A99DC49088A679D05B398C9622CA82392B6CA866399327006856E3011E2079399FF46CC0F809DE590772ED07820EE8AC6006393631B4BC015F4B7209BC556C282DABA35CF09A8088F9 EntropyInput = A3B14E383943CC4A3094B3A13041022B27B9F6FDE2B376D36910E8D9448DB9A67B4FA54FD82EC437C83F52CE66FD983F51899C8E7F1B7038DA36AC9A01D53337239CF3A3AFB4DEDE6E82B90E50BDC510 EntropyInputReseed = 8463C7653371C98DFAEB6CFF4986C39A760D6BB1A1D8A63DC163A18607C8354B818731622C90F37CCF683334E2973D1A1150375C8C31007FE669AC160DB09E39 AdditionalInput1 = 2AAE835984AA94B333101E436D160DBEEE8F668C04E785DA9AD2F8D55B1FD777 AdditionalInput2 = 91CCDCB868C384C3F3DF78FCA5A671CE3B92EEA6797A2A4C63F4C7C67BABE4DE Out = BBC8C3601919DEF92DC236C0F5017F6954D3D953B39688D0FECB4D9B47B5EC12B5E0434778257555042B023B7BFBB762B7BEDC418A63AC51DE8BA17FA43BD6B35A1B4825ECBAAFBE423088BF1743759FCB1ACFA18ACD04B7923EF24BDE776FC2391E175F6CC87985545FEF6E88B9F9582EF16F031D5A6E0EADB3BB29F70802A4AB84693C7A4A7EC32CC6C1F3B07918862C36B33DD54D4F812DDAE35D13A6CE9622438D92097926B2B70145EE81C15FE96EE4F70B9600066C8D88C743FE72682AE1D702EC7EAB0E1070CB1DDEFF72B290F2FA5B26943CB644DC3C36EC9C104E602D457DBD8B6318B4E06B5DC1715BA76359E39BD90A33F7F5A3368C7BD16C1350 EntropyInput = BE16BE8877D8039B3614153B7502804B42C7A2276A488420A609388456DA1528B1027B5EFC1F24DD453D84D9F125B690BA5AEA951045FE2C3A5F3A6825D2BE20CD71C915967730FC6B9FF7FD78184A20 EntropyInputReseed = C1C5ECC2E9A17822D7F49078544E7913F980163A2CC90E9E32B0D5E5D3A28FDDD66C1E0C238ABE9BFC9504732D24FB9B70AC6BB7430F7334B64AACBF5BBD8A74 AdditionalInput1 = A1DB77D943B840777CC8D400592D2037153FA6CDD987516D918079CDCC0D67FB AdditionalInput2 = C375BD13D7460DFB82B2411EC33D6EA8D47F980F8B775977A536214813BDE811 Out = CC9E0561A3E2D3CD580D2463BC4F81F4BC1B97ED55A079EDB74F427CD542D8EFA91FBA24DD72F56C8C5FDA8B8F8E3069DB3C1F0568DC8B4A2AB1FEED7836768B06406931433AB3364ADC47E55EDE3C9B15FB4C20272496F7D61EE1990E9F6C646A665A0097154D86537CBCA3907E6A1B8ADF0150373278BCA3F262B462CAA93A18A8108C91D2029BF6CE2636697F62439A0107DBBE2881C0052DBD4D4F3FBB2E348968220F29DC66DA6FF93D3FBCFCC325680E744BD2AAF8A579B8A554263551615BEE4B15C4B0EAEF25458ECD93D4601C9438B9F21AA00CFD91EE24861BF1AEBAD15A682CCE1B5BD67A7AF0A52C99591AFFFE3AE33BAE1B1EB5C4B6158EAB88 EntropyInput = FEE854F9E289464BC6A03F92812BA299D0FDE3F80E707D075066DB7C27BFF3549DCE9A565E9EB7F2019F4520CC52EC35F7279F4D7F7BD53FC79B70C38BA805AB07B51B332345392B4DD0CCB93EBD5709 EntropyInputReseed = AF82BDC367B85544023DE4C34DC0B1929ED6B4F0FD9BBF452365854FB101C1F6CD8BB82925E0D82F711C51E0895017B537021D4FD66B7810D842DF20D6501022 AdditionalInput1 = 1C825FBD97BC0B7F7A2E9353DD8EA8C8F8D456B8772D6A0344216CDCEA00E683 AdditionalInput2 = AEA8271B3817B53F07C88193DA56519E94CB1267C4AC081F59593F305EEF31A6 Out = C0A087CF9A7BBE550F5BE5AEAD6ED58518BFFB59F5570F1089CF9318EC2DD51BC520F9C29768885767AF7447BAE69A428D37A3895C97A957594862140F94EC1F6A19C965A5B1308F41F6025BFC56B726B0787CA30E9FA60E1488E578961FF48901B4F1414FF7C85D55B0E325536CDD6D1922C7E63F7999F899387858EC04182D21F2CCC8A25850307F1348821DADBE27DA0C566A4DFBA28A85ACF5A2581E1DBDAB213DA1DE4347E9D2737DEA65B0A3E137756BDDB6AD287BEDCCDC0AE7ABDB727A5CFEDFF65CF90DFA0A7572BA3456B3F0FE4DCE4D8C2C66B9B1DA8503E6A11D7C48AF7954D3277DB794FED93EF7255B9DD669853F78534B4840F38D88DEF54A EntropyInput = 6AA62D0F4B1445A4B86976CA88D242020DF47C10C1595BDDF8064F7FE4227F8C7840CE7B158BC7AED71052B5ADCFC1469B3FD90F46E5058460DEC3DB74CC03819E5A197FA3B4C5052CE0DA576522CFCA EntropyInputReseed = C49D31B21CB86918EBE815B75DD04E1767C1C53DC1E8E7C643C9627B12FD69BF6D0FAC574D9302B9F529DE6ABF06AB12B39B29988801FE776344C4EF91F7302D AdditionalInput1 = 8832D9DA4DDD7A1C21AA86D380310836E93EB2A22451A8E8C24B8586BF4943D4 AdditionalInput2 = 64C9016B1E9926826F8E94AD0ED2EB0081AAA12789F2D152EC5ECB32C4A2751E Out = E10F9AD6908E7DE76AB8FE443C8207407D02424DD31EFF3F1D0631A09D5061AC761100DC85678023F95ED1052E8993290CAAB0000CE5507DBF5FAFBCC8584173A23634F6E5DA94BE8409B518D2E2ED7A12B8EBE0FE09E97CE077FBA90E564250148478389CAF1B9A37F6232ABA40D33E3D0C5D9B6FDEC39EF7C8313B0D56FACE00EDEA9D524EF6769D24F723DDA02D5FED01CABD4BD115376FA6F54BB1092D9E641985BE8271553EC84F659B4C9AE39CBBCD85D827E924F21B033317927A7886FBE9D35196C7C1C8FBAD8FC38EEF34FC158ADAAC788730366F70F8E28CEC96109163E7EE65FFEE51DB26191B0A9E5263C3A2D6977A52393F41F63D7A555F79E3 EntropyInput = 47139F544AF9F6B0B8022BBAE5B936A3F4BF8A0F1CD10C8C5FB8BB7363DF6411B99640F70C7B55605F7BEE6753F306750F88357519E8F2C05495C595056E6023460BEA47E79F72B113784EB6A77F9F28 EntropyInputReseed = 83ED7FB5AE85138161FE90B14B15295B11D81B0ECBD9F1838A2858CF9E822886E973EA2D399B9C4AD685411A619B7A5CE6F6568BC66EFB8855A69F256829A62D AdditionalInput1 = 1BD8090104B78844F6D615E93B7AE0C921517C97735C0AAA28CDEE1EB0A14659 AdditionalInput2 = 4D57D04FC0A2ADC6EBB618F1236FEE0EB00E38FF82137F5E375BE00AD1AAC35E Out = 8C4CE3292AE500557B40E4215665C8DB5CCBA13FBD2D26CA8D1FDAD9DCA158371EC0003CF801FD28741A2FD31D15E4C0612C68E19FA4E19C626CE4B0184303F4544C414A6541C7D4AC5E6555D22E21C09A096AA9EC09C902EB67A2DE9EBA94B719EC1BA4DD5DBAFEE93FCD5125223EAAE0BF0D8E7EB92EA0610CC32B69584C0A1565802028F31E6910021D618E5138137ECCAB894A5385CA4544FDF20919EF2216A3EAF44FDACC7FE05CE22E565A5AB013CD6C9E0A80B430FA8B72127F84F3A780D4EE92C72901EAFC8A21C56DCC687AC4CE464CCE068895471B36F7B58987AE3272581F00F8D667085BDEADCB06FFEF5B1B329BF1DB71CE101A2D694DE9E322 EntropyInput = 62798FB89785F864071E04D1FEF2E1363F29AE098557205E254656571B9D21E392D1CEDEB1F92BF29392187C544BBA9427A7066B31A4F7F89E4282E5BAE1C4ED08389E5D7F5334D9827A3E7731BE9822 EntropyInputReseed = 143DA7A4A1CD29A9F7BEB3DD1B73410DD67998BC0CCED48CA2FB0C6EFD525E03B3BFBAB1E6D1A82D76F81F96E79E1E1070B08304C4F2DBF9D36F49B906F661CD AdditionalInput1 = 080FF1721955B51C60544144D5D4CC596C548BD7972DA7DAF0B6756F275CC9CF AdditionalInput2 = B5CFC9E0F727B1CAE841371F9B919666BC208C95658227BE6B8CB3835618B670 Out = 246A577508768F153579EE4F34ADA6DB7FA7331E798EA8B280D8664C9CF784A58ACC9D4F08D827522862DBF4B34EDA08CAFB6ABB703CF8C2816E1EB41303DEDB80AFFC94400D1B413E80B402049D6EF68D8388B9156B5DF4F94F1CC3DBADACE7CBC20717960CA766FA6C48027FEDB98C523CE8F8F4DBF9B3CCFA710E43EC150856C389781FC5DEBBBB6C41C47BE7802578547915104BB51DF72AC1430D3D444FC982BF4FB26E14247E6F94E2FA837B7141CEAB0AC7AF99041D9607030FFAB840090A71FE7007D09BAF2164F565C031E8DAA7C7F80EFD343EC660A6CDE38BEA211F79A03321146C869D105D12E7144769EAAE865F6AA71E04160C1C707382DA5B EntropyInput = 5D31BCB603CBB001CA6FC41D23F2DC2D1D72AB4AD740BC63F5A157114ACA5C2D0C5F1A3958ECFE06FE3839F2EC64853A3B1DBDE889352874DCF51313A6070FC4B5C1C298A4F57DC6478A2ED3B6309FE5 EntropyInputReseed = 3AF6BEF94B92D8B74382A8154154AED466C668C01801806EB5B8A7C7A4F5F8BED9A5C83630B06CA70EFE2661F4CBC5CEB72EE157CFCA8E67B4474E89B3B5E460 AdditionalInput1 = D24D6970087EBF2FCA8868DE2B6AEECB0118D3613B67C1DE57AD6C28B1B4D24D AdditionalInput2 = 03709CFC5B6DD81D0940623D3EC1CEE0A586AA13E98F1C39839D55AB45DA979D Out = A6267192A29B9D2EEC90987909F818CC32CFA43A5FC4DE915122A6621CD9294C269F3CC526FBDE0CA49C354BE60F16EA24D50E972411AB33B8296FE820B364737A3E2E364BB411D668EB6270C0945FB45A407628622FB805AD9E0DFE1175EC1AB4A41D26E05A281138E8D12C12D741E3D524D5BAE60BFA946627EB682E07F5EC52735E83791653784A23CA34033A4DE32CE81649BEF383052C072AF1E6F77BFCEAE577C6A3756E4253A4D8273DC1C6595697AA370902F8F1148600570DF1D4602B21E8B56B4B7BD38D1B7B9B5BB735363316FB507B8382E59491A00744E8C829D314B4A286CA3E5DA888CD06FC70505F91C98035028FE38FFEE4A89A89647AB5 EntropyInput = 03A21D9ABC4E5D6C7A9FCA0EF78A9212C286D9F79C5234D990006590FFEA6F0AFA2B39B484029333A26D97015450209369C79819A0E848559178E3771E951547D2C23F65D447C15AE4A61F270CD4C861 EntropyInputReseed = A4C5EB1F09995DE23BBC74624B5C773FFE719F32CFAB4EF5AA9F7D4C09BFB44BE5ED70E6FED9BB84800596FD2F82F643D2CA3B62563BD50EDDD4102B404ED053 AdditionalInput1 = 9BAFCB2C4A03195B402E37B108461C8FFC0FB31570BCE1B8CEDE3232B8D2456A AdditionalInput2 = 08CDFF11E269E0964AA0D884A03F3AEC58EA4E17346D0BA64D6F6DFC42252A0D Out = EC2EA0E368FC23D293E4CF44982C1BC28CE70B51C01615BF354C4DC6311BC20DAA5E9B33F58C0ADF3D7779A220AA3257ED3104ADDBB527192E83052CCC90EFF21445AB5BA57C185ED8029EF10461F6291EB43CA0B52300B7D18636CF1115B3CE0CA05503D5B77F2A534A542B516A2DE9CC2AD6B9CB5D6CA4F4A326BF04DA642EFC414C88ADE6BFA9556DA64025D748F0CC914936544F826A4FDCC4E43E64C8D73F656AFC2DA81C578684B5EDC9E1020B243A73F89C5251461D81CFEB8A81B4F09E3F11FEF3872C0E2F13FD833C3E5412E28835765528816EFDC7C992FFD5CF9089F6C739BB3AF2B9B791CE8E4D5AFB94364BD0D60268C65EEBBBFCE619B4C9D2 EntropyInput = 6084E2E729FE15A40C8E229D21DC582C74DB70C40BD8CBAB90CCE9625ED16375167CB1F9A582C301235360777D6F4AE7A4E08B230803C3DE009A969B2486F5981A7E20DFCC2CF6F76DB16B084AAE03E9 EntropyInputReseed = 979132C57022503E2FFC7F663C4E586BC5106E9E04D831821148C7A1AB24A39E8DD3FA8C4B587B37EA77DB863C0B5F8402EF89C0AC48F2E3103376533C7B2B66 AdditionalInput1 = 4029C16638E42165555BE53198A51019B4EE15B6350619766081AB613D013509 AdditionalInput2 = 7239DB48E8793A100B3B7D437D14C1EFF07436C8521520A383ADA8E4383309CE Out = 5CBB2B93D617A5B258FB7D82CF43931D56DEBCA6D6463B291896258F1B49F5657768FFAB973BD621E2C33C5B630F29C4E64E86172693546CE709D21F8CB1265C750085D26A0BD02459AC7FA1F5BA604BCF201437D579157B4826C30F698E71F926BFA4CD7C3976B2CEA7186DCED85E10877D4597EDE83A7286CA984DA6680F16413ECAC64FE99DFBBBF7FCA42971CE5FFE206FFC524D0865D94315B912253B53C73B47EC9209B992A69361DA8DFA57605179D2CBC5043FC718872489D5C06412FEC6A0AE5F8C5F2C6587606D2351A6B8295C5BFD2C5F003D1DCE3595B864023B8E363FD2D22A1BC97B4BF74312D6E5A70F26532DFB043E1DD9FB750D7A208B4A EntropyInput = 1451159C6AF21D19B84BAFB6A386F9C0213F50402BB543FEC71450EDABC9D914841CF6F11CFB8C95F392E7FC72F002B5F13F9D51535338281E67B33D1E28C35EB0C374A571D0196DF15E588D73BC6AFD EntropyInputReseed = DC08B732A947A1FCEF583D94DB6D769CC56A82FFD3D806286A4577DFAB5D39CD8B47FCF8D87CD17703B0FC3BD595739BE0B6491751FC27EC0070E52BE1CCA03A AdditionalInput1 = B058465D27D8A3526BE24EFB7895547AFAB9509FC21E70A6033B1D8944E6055A AdditionalInput2 = 398CDE02E621CB5E67BC32CBB8A20D9EFA4B25E34642BAAAF3A687E7892C993F Out = ABFB8ABCFA93CA7F93F2F458A54EC543E835A18483B9B16FEC208ABDD800D5B784698A22E88940E3308B0E2BF531E361DDF34E86191A133382855997F730477A23BCBB746612361530460683A520973A8B8B0DC7FAF3F7E02C7CF244DC753CD090BDDE6D40A551A7C7A06C097AE0C3D62523C38E65F4446132493BB06ACE41A7E5AA1F5E8A4C2674B142F21C5C65A32154CEFEFD6D77737A4939B414FBC0FAA7C1758580241B5557A1885130FD10BD528F4A18E7DC4ACC7E14F4B7A7174EAB49D75FFEC003D19CD4DC48FA5F1FD34B5663810850C02ABB484F046C250BD678DD429B623793BC321AF86E9AE29155E41CE0474D5B1EFC295559BE7E40C27ED8A2 EntropyInput = 2065EFACF9256FE2404BD68B475866A5C642DC7709D402285C48A968B5F3F6F05A1996F94CA5483EF2CFA24D61317E4EAE0A01570A4F392F9835AA3C90280833A54C7600F09B2527FC9B28B18075C2B5 EntropyInputReseed = 602E6983C3E8B21F78E3AF6AA594B1D7BB890791DEE57F6F6169A952227043169421CEA69D212AA6E1666B08A7353EA2E672586AB856FC2CB894A67001364751 AdditionalInput1 = 5664DA8748A295D2725BA4AEC1A5D24D4FD380231DBCF98996D8B8AAEADCA312 AdditionalInput2 = 29A6C6EF480352704A6100478A9F335A579A4DCDE1336E76EE1E83A76246C875 Out = 38492EF4D6DDF39D0246BA963DFCCD4BBB3B4F8DD3DEED8FDFDDA76EE5DC5833EE33EB1471218CE279700FAAA811F2AD0FD60FB6F00E29C45B549A0009B505C5F9E5D03A22C9367EC59849085A6D2CF2707E2F4F880A576A1A2A5CB268A7D7B527F2E5FF21B927BBBD0F3FBE342F36F898C27D8EBBF8679C5E9BD248A03BC995D5C07F1F5CD1DA5F69BFD0610280B035ED660E2D314DC2D2796D44DA968514F78435B920E13FC8D65735F45F05A6289872F7899002EA3F2C32CD47D781920BB689DB3DCF16C04F8B0311AADBBE12C36F76116315210E978EEA06B6D0165E4CE489543DBAE8BBF6DD314922A4CF4476FCCB9614302D435D3330DEDDAA1FE61AC5 EntropyInput = AEC58B179B3399AB0DF04E43845417039847C683858F1EFFC4A54551BB7B101587DDEE7C5B09FAA172A756BA4B8AD4EC2AC6BD2862DA9A761AFA1BF1D925DFFAA549DC2708DF946807DD4BF4638D5615 EntropyInputReseed = 1C319B13AA1DD51C23153B7A25F2830215C23EFA60339DE2D6E38C5B4BE8B8B10BF13A2F7A954497A882CD80474FE5D2A4F7FCA8D26F352AE7C03A39DE79FEA8 AdditionalInput1 = 4993D94C1A79B177746B9223D881031997D15C56EA53DC92E23229D58412FB12 AdditionalInput2 = D4498BD0927D85769557D5CCF5A368EF1A63047BE359339B8666B999BBD8508B Out = 735EDD10201B0324681F38FF8A04DB17DEC987530FB2B9D27B458CE81C237AF8458F62AF65C5A9E5781D7778701810A311968FD45C800AE0B14FBEB21381299021EB69910EF2C85860F6824275C39CBE7E8FE23561B154E7B5ACEF6B6627D7D023664FD785A43C97BF37D0E06E6F1822D8579B0D311A8219DD4E6F76EFF9B32A0F2030833BBD4E3FC5F8448C7B090365961FDE7AD4588AA1B49548B86A3117EA2EE399D5C3C1292732E4347674FE65078C288757AFD8D89052FADC8B3360DF99FFD2FFC1209F42E69BD523C491E0D8098F7E709508822199F15EB5FC46C4A5E131D901FAC7C252B235F4CEB86F13B6EF9CDC162F18EC9A4CABECAB89587EA7A7 EntropyInput = EE61254397D63CE36C7EC7B3F6A4533DF679C8D60562F4688ACA05FAC4200687B839DC58C38B53CE097514B5610C94075C2A92C727745F62F261480B50A16116CEB2D4D1E490D6451EFED22F235B04AF EntropyInputReseed = 2AEE443B7A17365F91FED29B7C92FC97B9917B9C2B6BC559E4C1D05DF927643299170EF6620A03BEF1197A72DA74BD3398E68BF47A762CDF046F05AEC5D48193 AdditionalInput1 = F3472DBA31F5385BF86738FDB37F2DDAA1676D388B3DFE24FA9B7AA308BA2D8E AdditionalInput2 = 2E67003C10CA3BDB8E0976AB3E6B76DEF1DDFE682AD96C626A6A84D6C7E87FDC Out = B8CB8BA689C6A405628BA4140F19772319934556FAEF85C94A1967DBB41BDE7C818E13B5D5A65EBEE784DE9EAEA74303C1FC9FBF3A9699132DECD93399109B22ABFB50A28C1D81DAA4A31805492403D50835CCCDA3650576E6117C16B310CCA9A2E5C400EF7A0149B4E1B068708C6F49DFBA37039DA946C7A9C897631FEEB4275D46AAB185C189206A6EAF7B835D15246DD7BBA9696052B0973C496771CA2D02F1F459307FB66F92FC788B94DDABA6B0F0D4DE30BA64105C9B03993A5DFE66E7106BCD13E33E06FA9B10716D77EA6A40B382567C83BE596C4761B9CA4B4FFD4248D0C155B4F7AF6955599C8D4F880C16CC62ADB5FDF949F877DD6CB2BF908EE5 EntropyInput = C6AA5826538813D74825F8B54140AB232CC5EB2318823A9B45A5A854BF7253ADCF0E88445E2D199EB3971CA8C172EC58 EntropyInputReseed = 766C4A8909EF1A3D8496CFF97F71361610619B2539E3047B4397A9E272646C1E Out = 1A090AEF3B927C0C28A976E83BFB8E1608182527577E585DAB8F39412501ECDBBEA8634B78195464E8A5FEF70D7B748B9DC36246DA2A01A9F51707BFB9F77EBF0CD7AC2101BF70FD272B9DAFBD4807205DD57A9337C122E6C7CA02B8F6D90D5C451C7974675A973AE84F7B1DCC43D5EC1BE20F6EF34E24DA6F8E5AA642C537F79497D2EDD8439AAB71FD8A43B991DA6F35BC079D81B0A5265EA48C6206AD76C976055D7F6F0510AA8E0F313BFA0E606288090574A813B049848D2F8572235734BECAC597139457458AFA9EE20F1922D7CDD9C3E310912403B4277B616DF2F314BBCEB220CF969496E214A2B2AD09272CAE89CBD7A65C243B78BC8BAA1EC5CA28 EntropyInput = 8ECAB16877D062CC42D42B1339784BBFEB4DD9B2E8BAB149AE8501C1F928C02A7771D2DADF4A5F958CF5D2D944457A79 EntropyInputReseed = 02FB4CB570967E41BF3E63F7B310F504883C2297203C76548E42B53F0525E4CE Out = BB7D45F6912FD772F551293B68813AEAC47B1ABF086C0C793F44491E962B70F8F9DA9BEE9A8E7915B48D3624B731059C93FAB8CA826BB2D40DD1810613973A5492F4A17BEBD20670D848391D898EE66B00B8F08465F054F22299CECCC6BA8C90987AABDDCEEDA80E3071FF7C955D20613D905637FC912B6799DB7A616860F774C4C04F0E078F1FE322CD165D123E2AFC5F7C83E8075A0C6CBD549905BB9B4F34465E491C26A9B42A265C7850C51F993EB8681C55D4A9CA27E745D7FB2D5F7811B420F456719C6FBA19D578EB3AE6623184F36DAC1B8D023173315C0B0B3AC67B894E21FB9D6450B33BEBB08223111C96676A0B7E37CBE0360152736C848BC51A EntropyInput = 6A72F7B075372B241D62134FB0F3B666DC434F4EB311ED4CA653F1F356AFEFA684D789E39ADF499BCD3A02965C68A29F EntropyInputReseed = D41254DC3539174F0687FCA094D6743A3C7A634B875F220A1F1B82C38EEFEB15 Out = 7F6FF8C7694750AD16B3983E05B1E50B548FD5AEEBD457280DBBA360A2A8C848B7F88A9E8705E584B0481D136D8A7CFFF7648332277B18C68DDE2AC7839AE62D36F6AB4B3909A18114F8842B2774FC60018BB32BD6AE6638C5B89CEF08B94F18848F96B67991BB23A114B31AAFD4CFF588565DA05A2E2253A89A8B881C3EDD6821D6E331A0526A8C4982151CE9638E20C65EDF4138F950EDFC0E73659D694C8EFF6C97E46EA339CD6B7CA5B99622F36AC4F7E06AD3C98B0DB12FC0F9B0A5FF94B5F374778CA07F1952DB7A8BAD5096A0CCF2F71F9E4653417C53C6CEC008D0F651DC84B53365EE5D3A85E8E4DB60A7C1E497438BA146320AA471A136EEA35D18 EntropyInput = CD338B068DB4025252BE94E708B1B6CF532FC089285BE690419E675DA420AA440AFAF544207415B0DE07CAB574831C05 EntropyInputReseed = 633F5F69FCA6D1AFB0B1370D067CDCF9D72972C0D8EC881DB8F83872E2EFACCB Out = EC409390A7B75BE4268EF318F23619D7BCAF6007D40FD4A9ACB3797C5D95769B6486CA5464396451E341066D5659B4F9F4B955425D2FD53D4FE8E74332DFBF40A629BED802DBE199C7D7450E67D8C4B24506EAA5EB83F884BE3F85BD8A1F2D78D251E516F1E34CB3CDD212B2B1D855EE54DC8A065995C2439D3D164B4047258E06A857B5A1C309BA1344BE351C28B89BBE8E0823A65FC9D15E66D8981891437E6EEE7D6114B61A6C39A0A6111E33244C8B88DFD4A00E2AE29302BEC37AD99AC8B007179378EC49F44B5039E23E37291F0E94D942FEAB03BF782C74C371F3BE1AAA8BB0CCF33BBAA4D914C9EE1A23D475FB1667522B6D03696A025A4FDC0F314C EntropyInput = 30B1EFD2B8A77892179CC76A91DC593487F4D13F0191D553D2F98E1FDBCBF8083A859CCE8171AB0FA9F2DB811140F562 EntropyInputReseed = 19B8D347E7768EC3BBBA782CFD5CF323ED14B27EA933BD209A50E6D9FA5290E9 Out = B5CE782C919836FF8AE078EFE54C7B78882A41EF5383D65D6EF458CF5CBCD928A633BFE6AEEA68712135A176EA90B87E89CCC51B76223EA38EA94A1A0B08B0CCB0BBCCDB6D97B6A63551C7CD8DEE13A538C0947277C452CA43124C3A1A417903EC2A29B769331047F0ACB6D49CF42AB6B3783FA4C41A9A840ED6E8EF23ED788CA139095A3FF43390D5AAF99AAD0F53307811F3E879D454AEEE444C281DA701FC422BE922A76AC8207AF01DFB461E81F43D0F98164FBC723A5FB29E88143B901192D80A076D92299F65438EC32B8223859017436D4EA06A5DF294E564892BFD8ACD7786E78335A312CA971E4D50766D28221612AF373461DA08C6802112CFA470 EntropyInput = 24B1B84422908AF8218D805080E06A2C8612250BC5C648F4A48B6F8025ECF09E99F1878AAA20E0E59307EE245CE040EB EntropyInputReseed = B761376B8BEF722F9EC41E1EA8A4883C05C5DB5B5CD3E3094738D262C68994AA Out = 5DFC8DEC5D3CCDBF5594F85C9632840317950548BF0A9A51350AB5879ABDE59658508E6ECEEB782DE83A039A1B5C6D9817D2805F4F44006AF7D070407CD821544F590EEF1609E679AB01E86EBF5F072394BE32E071F9FFCC49C0256E6B27EF363DADB7B829962C37055B19E85252DAFCCC67C59CC8A887DE7134A258AC97FFBC130D7ADB3ED5EFFD96B8CB2EB608C9E4EAE4142162EE30430B3B2DB9C6FCC43F1A246EB4A9AE2A4159B821C70C65B7C7D603E45F26DD51F2E2DACE4A718303EF1EAD265FC58762E4E9BA1FDE72198C82E266DFFF23FDAD4B483E4EADD69B4860D2E08236CAB337510161146F3E94099FB10D0B87BAAF0176D3DD51C941EFB979 EntropyInput = 3DF4C1CB97D51D263B6BAB195CD48AEFBEE483F80CE43F8BD78AD76C7F8C0AA13A775207E01F8834322BED04CDAF5933 EntropyInputReseed = F412416B0A9BA1DA9AD248619B7B274C21E437F9EB9AEC06E028EEACEB9AEAC6 Out = 3AE68540F189D279D07A17B0D542EAAE69E193C819FDA41F6CB91F33A16F23315CFB36D1AAB5A64D2846A40E7FC39B07BF0416446334F898FF46952FD3A097127A01D56AF0D26BD48672A569CD00DBD81CF38CEBDB9767F5B362FB68DDB1550069E6112CF925EA29ACF950D6DA000BDB6B61D5D67A45311D86B8FC4D71070898DA54BF8F3F8337BDE0B15650F2ADEEAADE07C946DFF12235ECD5675003036951264BBF455F1B3E8D2A7BF1985EFB13A7FD34EF1CBA25D7330AC5A4A5413681D49E5C8D380824E80F36E64AD29458BFFE04D4D5B60EE1E5741E79A2995BC19547B667190E734D6654A69F7A42F1A40D21C7DAA54BD865253455AC103083247E91 EntropyInput = 609BF2FE6E9DC38C391F586E59A7F373A5E7D38CF4B9EFDF824FA0569D9A9AA7EF2FAD1B7437648F11AF8C4B768E55FD EntropyInputReseed = 4CCE81BC6791547D114FB527781AC121943D8FCC1AC106D8EB3ED9C7A0A0E5D8 Out = 52A4C08378690EEE94EBC78EC12B0D24800E221CDCB6BF737E915BFF7C1DBECA2A71D96B6E0F85EFFA78A096734BAF8A566DBA30D754F1987839F50A4766B9D7554835432303FE3CA2D9249B331C13E2590A5654ED93CA36AA75BAFABE2A78F50EB63D5257237EAE2ABF34A68F0047346042C8C3551A428D1FF57E81B34608D2FD5BFFB1958B43D60F9379FB612F9A91209C10C1D71C174F70B26EBAF2CBCB2B706EA9BBFAAFD98FFA0242FE760F16060BECAB5F85F7C791E1FE01B8C96DDB8820A2A1AAEA550B01084539620DD4AACD5767CD492043C14FDA622AA388AC9E84995C59DA7BF3B2C3CCD9B7747AC5BAD60C55B72404032345B6F53B2AE49E4449 EntropyInput = E7A27E551699615C7C99608D373934CB66D7FE23D3423B6C07BD23159336F08585BAC611A173E576626E1EBED6AEF40D EntropyInputReseed = 4E553B84A62CA0EE365C17DA4B2B4B037383FCE17EF31D047809A401CF165456 Out = 027640C42AD2253F788F2148A2EE4EB7C8E243BE0315FC72E044996A60F6365FEE9578984A4532426C61AD106FC4C49F3DD548C392A3EA168354793D9DAB579F54C2AE2CDBBD8DAE6DA662C1B2B74B0174AB2AEF14FF371E0D3288F5415DAF2A5CB098BE5C35DA5F21A014B9AFF9FBE3924122F3D78C69BF74225F46A71B7277F98B25A1D3E3DBE42D5AE06E0EAAA58A9624078AC6BFAA41C394C29EA60CB6735695AA369C4CC12ED4117E305074581D2B6F5AA18E144DF3BC5198B4430624864B96D08C1E04A856D990D4521EB8FAC29ADCE845EEAE7A138BE202454611AF12773476B37AA1126D9AC6A1391954D22EAA572BDA7E8C103A22252803B64E6E80 EntropyInput = 8DA4D1E80D16E7B55048CEE09C56CBDC978315D1C2E5B2AD870FF9B91128F04160A8283153296BCBC662CBC383667459 EntropyInputReseed = 745CC5DE01EA53B62A3EDCF108DCF52B48E62F489510CADA3FB111C305BD7ACD Out = FEC5EDBBF796DB21471303675B1E3254242E05800149F69EA6202B6C43E29A9A68997794E9CB071F8CFE92845521E603A6C6CBD11E290E109B22FAD578EE34DA5AC1092DFC3BD1FA101F239D7F53DC061B04D160DD49F3DAE26B569B9C3B09F8144B075466F8B7E82FEBBBBABCDC1C4456B27615C1803AE811F3ABABC1B6F1439066D631476FD89508756F3586C30CC0763136704B5E49FD866CBBCD1969E8076AB9AF2BBBA61FA15FCDD7EFB53E7D2E4998905560C9B784D2DFE79156F84E0BD66423A5AEC08E7DCA44183F4D7A182F76D2455AC362AE894658ADFFDB7CC926E56D44D7DC5C7A554CFE65DB7339ABE3F5D6F5E13B5E4574C0BF35F5FFF9DCFA EntropyInput = A6BB36AAB31E3A8F9D3A3F154E5103B690E7A02DAD613DCCC9F02A0522FB5FA620415F39B71B9ACA7A383D7A92D416DA EntropyInputReseed = E81A8956B367D682F82BDF16D9934D094317389B96F8E26FE1511848AECAAB3D Out = 7E185476AD44F23A9808CE73B547063BBE2014E2014F99CD77BC87B2BE55CA461C119D5BAB8D40DD569A99D999AB733046164270118F09F93F85FC15DBE4756D3136C3E617B835BC79D130C8774E09321898C6C747D964D88E1EE057C96F63C264E606CD7826C5AF8D07024AA3A15B4B82CB2C10E1BE5CE8F5B9C43634D330176580520087CD579640BD875F0EB3608DBD9E892A095D5A8C8CE0BE0158B3163CCDE4B0933A54C1089384BBD53131CAF5FB73D46C9B348288C33F43E7FC0A9CF84D23C02F70EBB3FFD4CC730BCD4E78A584F3BA2E0FEAB8665B0FCDC574A6C28D9710A3B0C56E64B1AFCBD02B3457FB53FD35D8F1BE416BBC2A78994B9E2E0563 EntropyInput = 7F0D6CF7CCE83A9A155AC83F452EC76FF1E21548598B8E944C470CF1FE7D24128823CFCB79CFB95B99D4ECFD2C6DF797 EntropyInputReseed = DFC8DCCCC4F1049A452A5355CA3068ECCB4C9048F227D3D0022203C0D87667ED Out = F07560B4A80AAF7269BC28BB6C30CC303923BB91A5673D2A31045EEF086152CC558574A3D66B7F45A5655CBA2A2928D298F8264EF83CB5751E7F0E4B366B0F19EDB8A4EAC54EE0E8F48B831058D73915F3FFD943B77A9511A526F1372AF89A35D7A060076F850990B9B2BDB672BB135A88153306C1F8418656A7645B4A79CA5CFB2E0C0540E8B75EFE864C0E6BD2E7D0807E213A8FD2CCC7DB0E7A7FA88458CD8D3296B71C724121CC307FC70DAE7C5684C1E883AF938F430DB7C6DD216B069C6BE8335952E22DAF77092EB230B67ED6F92F30E3EBB1ECAC738D6531FFF089AD03E2587E6AC164A0FBFFF0151AA54775D72E3D33009C4D4CC69872E7471AC9F3 EntropyInput = B4B297715DE6DE71383FC5055AC7CD07C90153CA430C2E0DDF83E9E90DEE8DAED92F81E0D99F435F6817E74CA5FD5A76 EntropyInputReseed = A3877692975E665098F1A3E3BDBCCCDE9E477A6C5D35B090A7595354D0DC5D64 Out = 8DBDEDCA3394E154B66BE45FFA1C86A7376CEC19CEB9B2894CE5242EC8AF032272824804CD0B9CA95145D73C748DD46D886840ADDEAB7998DF662CE20061746D7E3B8AD506B42713895A2D217D641441F679435520378B7ADCFE3D8ECF9710AAE9A93884C3FB30564B98C1F04A825420043D0BCD3C0260674046889F04989DD6EF6E4F2C0025BE1633290EAF29B8C4E539F16F60A5969F95B457290A4DFEDA5BA562AD7B2E845BB0820A1FA6BA4C8AA6966B899CEF629B97E61E139D1E76FBE691E44672E624E711BB9DE510A9CD210DBDC189F626524035395AF47D0CA5B729F8F3E879BA1FA6916AEEC284371DE94839017028BECF29667D75FA812E3040E0 EntropyInput = F5419BBC6AC392D87EC2934CEB8190B322F5F3F79F3D0B56F98FC16ACC63CFA9013D4865EA31DC474FB3D5531DBFBE84 EntropyInputReseed = 5CC632D05880B2EAEDF830B64947DC4C98CA7CC0D21F056E27AA5F58AD474514 Out = 1761DADC07C12B305A9E7640CC5E8FA33D794E66D310CD4046F84C2685C1DB5B674D5169801F94147F2570AB4B017C241B43D0F042445513AD601059C12E750D12992E34362CA2B268B2C464ADFFFAC0AA3C1662560C83531361AFCC9A5CC15403D67EB9D37A3E14EF834F0E6939084F378ABEE9D363E42A65DDF15F20BFD9691CBD937CC44C677DC9DD577E93E4539DC94C699A2048163E7172E246D6107BDAD9BFE026FE2FF7224FF493796663A4F4098EE1B45EB12797C142A7F0BB025FE8628FE962A8228D3FDE3FA53957AE5C9F63F24924FCC41DA643FB38C51B6B6E36A693345FA98DA77FF43EA551D105BDDA8DC98BD57FB4C11815D52A86333ECC2A EntropyInput = 598D34167065E39098233B817B169CD13781F0F68594BAD2E3F15EFBD259224FDA74934F6F13558A1C5BD8AAABE34871 EntropyInputReseed = 479AFC2C278B4B69C50C200BDD31DB924E1ECCCD8438ADB845ACFC73E6F38522 Out = F854F560C0481652CF5E10F63BFC278D4CB5C6557678C7DA3D802EC44EA96EA44E729FC16D21FA5B121715A73F706D87E84E79B25A9281932820E58FC4E9903120A75D02407774452231CE1DCB272F508C1F1F988B19CD9843BAEED8C10C192A0B351A62B896F04130A60168286EAFC80FC352A02F07CDE96E9655FAE74C5C844E4838EE8A19FA98C41BDF102E7DCDB534B483BC1B1819C3E253AAFAE56C3D1C5D373296F652B1A5A43621BE93824D06E73E652294CED2232D4524FFB3731AFCB5A7997498464AD119DF75D68F4B4D21D17092FD30E851699C04201DA58A8A61BD19FD9D5305B25647991A64FFCF7A7A09D6954A1B251F475B6BB658B7BE9269 EntropyInput = 4855249BF898293E02A503891584A78A9F9019F5FAF093A4527D8735FFEFB2C081CC0C16C8CE0FB210153132E7DADDA8 EntropyInputReseed = 22DC10AEBED133559A697D04D4143993730BBEA88CBB7DB310D262150406A42F27CF86B23284B202BBB2FFF6804EDCD160283EBC305504BB04F8F6446F50CEB7 AdditionalInput1 = A71824FCC9B5577F0C9755094BB470CB37C550BF9C6C1D58E75723FC4DE2FCA0 AdditionalInput2 = 823A5DF37A2E4CE0F4A71A228EB46BAACA1BF67C9433459A9A02E931C42F9D24 Out = 68F87519339F5C38939C797AA667A156011002B2E39242E158EE5C2ED9530BB92ACC15589219CD307147ED1FE3B5F1F983923901EEDFEA90CCFB20DA14E52BAE0F8C124D1F799CD243B136F7B8064018C45EFF0D0F70DCA6FF24356726E84C853AE8D141F94052481FF9921046E9E2AF5B2D944F9775DE3F73FE36AA364D70F5C8AC2C6AFBA388B9C557E540709B411FC90C8C09B53D90463F4044D4DE86E11A16858CE659A325CCBE2D148664A6BC5A4B2F5C74540132ADBD47D12C4FE81EBA7A65A0EA227C09C615DD66375201F7C63CCDA248C4B5C58CA7ED3C3A7510CD0AF09A8D55E3A72A13F280194EB6769BD2A84E2B317898AB13D0B214951C9789C6 EntropyInput = 0A64E116213DBAD677797AE77079148745C56AE9D07E6181C80C2E287963BE0E5EA6A459655AB3563E5072B9E171D125 EntropyInputReseed = 3CEAAC1BC650A6F742BC480508D497C56FFCA46D5BE3E51F45372F1B738BAA04FD5FA6FFFDD0B12137D316C88B55952F11EED101A0DF05CE494FE32FB6C081FB AdditionalInput1 = B68E7DCF8ED7DF200218F350886A506CA1647A23117A648AAD586C1053FCC357 AdditionalInput2 = 7EF391D8371EB82F57E4B1BD6ED1C843F20C902C4C80E1798573B1883B6E44F0 Out = 65C33FAB67D54483A9A1A9764CBAD0E04EBC5CDA3B24C6024CA6DAE0ECBE2AAA0ACB4E576437A4174D7FD72638E4FD41FCAAD497812A379CE6E17B383BC03BFA2B5C6AC35D8D0ADAC973621CA254DF79775FEA69C6BA49A1B9695A33C84477075167994E48FAE323412C50CE3DF8D4720AD38D3C07630268E9B0815CC55057CC953C5F9B7E7963D2527592BAF9597E9CDE414BE44BE008790AF5C311C1BA7651472FCB8ED9A048248ED90C3B6F1B940C3B6C46CFA67FE048008BA6EF21E5C3ECA2C71A5AAD7E66A77A144B7FBFB9FDF5C2DDC937858511520F168C2F624BB8D01339EE23E2F586D3B89A0FC025464971E41D635736BD54200467B37841ED3213 EntropyInput = 93EB46CEEB56B47DE712F62C125DD159389DC95BC376FB4ED5DB77D829EE1ABEC9A596C9DEF8B5AE966E832E67EDCBF8 EntropyInputReseed = BC2A3296C2E0854BEDF3F7294C45DAB10546557F0D5266B6AB0642AF894126050B67651BB839703E6BBA0A67E22EC89CB144581FD58351683CD21ABB787193D9 AdditionalInput1 = 554BFA91D75201368A5684F28C966D1C81279B796382AC077C2C1A4CB5A9712C AdditionalInput2 = 49CBE841142B48E348302EE6A558D93653064AE5B86E92645A77F3ED65918B82 Out = B6A24FE6841A1CC90F0A09CA2228284FC5C164DA505EDB7998FE4CDF2A84AE35C33257465A0F4D94950ACD7EE31A76D649BE4BA92E6A233720B709D241F835FD773AAADF5DE9214064E1E2F16E80D287431D9FECAD38E99705CF3280561581C68229011D7930C4A9284DB8A68008D175B1459CC1FA433F76C035228070EF12FF4775DCFF5B0F6A1C03B06B354224AD9DE1AF74F7CAE6A6C681DD51196E2035752AF2091308E418C167343AC7DB0D861B9348B765909E6DEDE1ABBF05DC1DD1D38E69C514105979D32161F48161C8EBC2251BF553A059904B0F14A2308B60B13B7A210A8151D0F74392C393C402947DAFB5654E5E341425F54CB458CF9AC9D06C EntropyInput = C2B5294D37BE32CE67012BDC4C780EF2424120D31DBC988F1E0B092E2634E6E1254C08AB3FC8DBD14CE58F25769F1835 EntropyInputReseed = 5918B45C626EDAB7E47D3D7BAE09FC351F607D2A35CA1064D1F44576E5D6887D8E5F3952C60385376B94AB4CD699FD07B64953A428CD61E4823313C1393C50D6 AdditionalInput1 = B045FB5C3ED90466B69DB2A56B60928D002DA6850F23615E2AFDD78DB1A05383 AdditionalInput2 = 570A56B70E8A697A969B4F48A3BCC5E7B643256654E4824E3625D4B85FA0F14A Out = 264E878FC1DB387D8501A8E06DBC238B14519E63C74ACBDE92D050EBCAF8F0B34AA27D64297312239C49FCB2AC449F45030F713AFA1FC713B58540CA77B5FA81E605894992F50B5F368D2DBD4B495AAE512CEEC3EAE75F08F0CD615847E84524D07D33D423BF75C62DE175C0A242478EF7982FFB9095F5B1C9EB2B71A07C8936B6B82F3B411926779302B22068F0F8268F23F22FC35D7D4A20377DAFCAB743999E409F9D111C3AC8DDBDE8D00C2D28433F4CC25812AEFF1C21CDD1BD1287470C143F26636C0C119FB30B2C0E62DF7AD382046AAF2108EE49F5C3F8E1AE76965D819D241A1EDCA7D10D7CAC1E37817BDB9636AECE485DB2AA42CDBCE0AB7D3E38 EntropyInput = AE8BFCD50F3874AD57FF5E403A03B4FF3ADDCCC709BD254F060C27FE2410722DFA4A6816CE9CF58D29D94E308F36921C EntropyInputReseed = 44E23F2B1379A21AE0B45C1A00ED09B1B590692A8C65E67EDB469B1B4276A63B7601798247B41229C78D59D13054CAFDA63F0633E98AFA3B2B5A80F7EF87D53E AdditionalInput1 = EBF62456F89E4EC3A9BD7800FF91FD57BEE00FAF4F77D0DDFFBC7D7D39774055 AdditionalInput2 = A6AA62CF68E550118DB411AA534B816EEBECF55B8A81D43E4183CE44FD1AC973 Out = AD85F942E991B0FC1B121F065F2556A9DC24EFDA80930FB4B9C39E15E807945B33FBA2307D0BE28448673BB2F83A5C7FD32F43D4A2EAB4A3C708BD05D65225036C28F30D5A4232A0F8702507866311358D59D835514C55B35231CD4ED40CB27BD981BFB0365FEA83E2D9B639DEB1C11D05447CA413619506C9A7DDD406C151A00A600D951AC7770B0A7ED2D016150132C4774B8DD186C5991C68F0582CDE5CBFCAB961C13729695EA67F501A7039ED2711E858AD56C9D4862771E880827C8A7DBF28F3AE728FB896D62D597EAD3D942A7112EB3458567359F372703A59C93BFC2ED4889ADC3562AB9E9F7AB54CC27D9517BB0CCD9C7CF34DC357D858F7FE36D5 EntropyInput = 2DC07177949DDD5E288CD03BEFEA3E5672FA554806BF04A02CB3774D94B0AB63DBC94984144FBDE909A45A44B5A043D2 EntropyInputReseed = 71F2CF92648A6C9663302BD0FED055BD040C5BE5CA300983070FEF11C23E63A128A08B21D0072E2A7BD3FBE940E42216E4C005499054721E9002F45BE5EB7880 AdditionalInput1 = 34B13859B31F16880D4768648F8472576BE54C3A349412F35250877FC432C73E AdditionalInput2 = 3C65218F4ECF5968707708E0AE3FD9FD106A9518DF06C45A99BCB4D3F9A7E014 Out = EAD99DAB1E47D848CDA542F418FEBB6BDD23A25D65C568C9DE8EB6BD8679483C67C1DF5384A15F943B8C0F951CFBAF507F7A194BDE9C188799D6D614F6A448BAB8F941DD356B0E73BFBC3E8F25B6D0725EC60126375858548EE8DA178452759F3142E7DD6876B2CA6D0EA3EF360C005261AA0600F8E9748F7EEF4E9C5B75838051FA63B5906D7EAF8B7E3F192D838DA1B964664ED53AC5BF46360984FAB569C1E89013A495B7B9CAED23EF2FF57E43129A29A0892497278534A8845CAAAD7AEE6288B6C0829111EAC737C6548073149425141A6D951CF89DFF7899FDA3D7CDC14E963257AE982A5D71B78040D8E130CB55B4190A31242A2DBD9A2EA5B22431A7 EntropyInput = 08903A126EBFB46D0060AB18AF021F89C579F2386C55249A2D4DEABB5935F81D3DF7F9C353B65157A02932501919B852 EntropyInputReseed = 20E5D89D6F2C3681CE53216677DD928C0F7FC19BB0CE14E3C75BA0B86660E0E79A8A8B01EF696AF3BF434E99C3BE23CF1BEECA80E58BC8C98E019554E84E6BA5 AdditionalInput1 = E9B4601A0649221F4AE0B6103DC0541FBDDB17632D61F8426E2D8274908E628B AdditionalInput2 = 8568EA9D27E790AEEE689B009683335547CE5FAD12DB6FC205A52D2F2C8579C6 Out = 6CEC66EC54D30481E77A929A1435DE92D2EDEB70D060DFE5BAC3C4F2966F3089E583FBFF2527F31D3B5C19BBF0BC8CFCA95395DFE6E9C9C3A11C9BBADC6A079D597B3D4303B147D5C184FE221AE85A158AA0309A5DF50E1450FCA352DCF1622BF2833112717F37C60846D58AFD311FF9ACC6763ADD38F3B8575851E82166F555A8CC294FEA4A494F6A8D875C627DFC8329C48FC7C2F8C3DE3CC5A6D766055B69CA39155DC3AB32010391796E3E837EE5C58C8D81048313F994CFACDD43F1D404955C71FF17777D0B72A75DC13B445F117D7B21375572C6A03E6C77AF31DC8EDE85A97C80FFFEA57657940AA818A6C029CFF943937DB342FF8CD0F8AD2833B6EA EntropyInput = D0F95C541EB58380B16650773A1A1950AC51BBAE33B4FA418649F74E17CBC0909213E8B9FFCD7427B84817442CDD099C EntropyInputReseed = 4AF040681F72FD1950EF6DB1B875887B749D23324068CF0AA2AC39B0CCA6F5C83CCA2B44F04A6F9D7B2D7C453B0865DF50E70C4C205B7514D4DB7F2645433537 AdditionalInput1 = 61D417EA84765880F4C50BE2F0501C222FB5571F43E952D06BE218B5C7F12C76 AdditionalInput2 = 3EF34BC2D88C194326535BEFB9D4374029A6D2B5D5EBF57CF3E295C101CF2091 Out = 6FAFA772E755FAFA55335D98FF364ECEBCFB0F20C13AF8B4C624F6291BE198EC8C0D7CB41ADC1B6C693DCE6A10BEDF900295ED4C06E124E5DFE210B20229E10FB65BA3D5C0DDCEA95D7580C7B141AAB146DD7265F21CC4E6477CB2254F7C8B51255E9CBF58346B60E1A8CFC362959A1D5D812F22BC66B6DD0612434DFEC40114D33373CB25830A92D641A07B7D585196E63F9E135332C8CDD4E397C63BA97378EC1DD487795846FE759F59A505927D031C5BC614E3ECCD5F3BBE70EF5EB0142640F4CDF6F9CFB3C62A461A6CD143A1752A6FB6092F68396662E5C6B520697058F601E00C699FAB18BE96FC5F6AE812D71F69392258275967F3AD0111C16C3EDB EntropyInput = 97D2153FFD77DA99AA780C9E8FBDE6EA5788790A3FFA3ABC49249D286B4499E46978B60FDD09DD059DCE5DFB9FD91B98 EntropyInputReseed = 6D4D9AF2C436AC33EF105C0138641EACDAFF3124D1DAF1735097125C201B71A80676A9ECE205509AB30AF19DDB9B5173739AAB572B935E0ECB600D4DFBDCA2FB AdditionalInput1 = E182E2937432611FF5832A0042483769351F50902FD3F4DBA643996DD84286DF AdditionalInput2 = FA1C67464F5E72262215722753F481F905728E2C46368911A3081CA0BD524BAB Out = 0E42219DC5ED272BD110F157EC8CC1F3BF4618269F3D34B2A19326B4E63B93C476E13D3176473604F936BE1885C2DA6F8FE5884FF1B459B92368D1277FC7127118220ACD083C7B3E7CF43A997D4B81B40822083C3D7DF9DCEA851B51CD1FF2960F3332FFE99A9792D516BCE84E19C0A6B7ED9FFC2144BC2E9CB2AA1AE01E4F3958E898B49AE5A96217B51AE71B5AF741A6F15BFBF4EB7C69416565A3A4C28149A3CF3534BAF61D421FE5980BC3B612A5CE4DACE729F37666EDEA58F5F3D19E4C474F09D5F9E4EFF208D4B9000C1D4D009BE37E20614821A8C983ADF01ED0D2461BDCEE2834BC0BC4814AC12FD11241AE6BB7FB0DE58CCC064F755B466B363BCD EntropyInput = 2886FF4E11950C1E639398B2C7D6908D5C2E4DAEB7719E6DD98A39B1428EA7DF8CBB97F58CF243045BDADB2F9BBDAB10 EntropyInputReseed = F487B94B5E4EDA49E933E0C268EB5042C422DF88061EBFFD893D39FAFD58EFD3FF8E7656A21BCCED082972719EBF87539C4825CB0F4BEABD12A12D544DEA87AF AdditionalInput1 = F64DD3B0EFC5C8C146F9B9B8F0EC7CCB784E87C16268A4AAB31E9EDDF2C9B83E AdditionalInput2 = 9DC16B955AE805F10EBBDC3794A2ABE671A339CA148B46EF6EA208698A54A0D8 Out = 0E8C9CB99FEC37602B291E508E43C2AB323D05764184379CA3A2CA4080ED26C2DBFDF3D1916485C7EBA49077CA881FB03D07F967CAD9B477959F007A6188150B6630218AF55FDD7BE2EB88D48B5EC6B6876EC25665C0310624283D2B5460E3736F8B9F0B84095AA4754AC59067A7CC73402C09B1768972B3ABD49E0E237A741649EA7888EA4A024C0952B94AF27C53B13AFCAA4FB7976F65443809D1BBD7E4B741BCD6C4A3F2CDF863E719E5D5E60043E771CE5355DEE1C5299DDFA54D77DDDE2924271C0ECE1E1E1E8AA6218C08AEE40993EED58959AF430C7D53B4179AA355FEBCC40124CB7A1D2965E36832E5F42F9A48275888725CBA28D72398FBEFAC94 EntropyInput = 21F47ECE2C338281914493124AAA5A52C159CF22D8573A2AB4EE20D4F77326BABBF1415DDAD9D453567AC809E9C75695 EntropyInputReseed = 9D2387474A55CC03560A4D762050A96593A83CDF12DD9A8A84C4E5EF2D6F4017A9A1BA27D5DF8B8137CF9B7EA25C793CC41115115853B7B7317E70F6BBDE4E76 AdditionalInput1 = E621439BBA7DA16AAFB66BA02EACD266A0A236673B67DDFE02E56CCC3528CFC6 AdditionalInput2 = D0A2071A18DA8AF9CD118C01408B9B85490A17BBCDB64DA2A3881898C4446629 Out = E025BAF65604F6C2D5000F5D2912E23169A0E6FDD0BFFEECCD3C331E31737524789BE100CD094E54B86EEF744E4B26CC6B6D5CC58EB5B65DD8CDB8CE634DF854A2878E174C8A935472713F23E804E928C3A95C2F7F133D1AF32E3559ABA22F9D52D8D1ACA72A79AC65DF337C3E55C36D7DD184BF5C508E13099565E2E410C3F25580F6F60ADB3E83114C33BACBB322E1A4999387299856B04969ECDC946E2CDF9E5431E4B934CDF5F6672F0C974D59E2B8553CDC4E334454B73E07A991977DF438803B4754E02076037EC699E7D793181C4039ADAD956F07AF9D1A82D717C205516A91F01F5BCB9E584646AD82339DD8A7415C038568DADECD910DBD6D189B6A EntropyInput = 8F6D1EC77FFC71FFADC228F853743B34E046A6DCE983E20BAA4C10544C1A7E2198E99813DF9E98FE30567613052EAF72 EntropyInputReseed = B16E983131969E4F814DFFDC3F3B4C7633EA7F7598E20501A804D166DD39331570E987AA3C7965ACB7697B5E3D7E1295B528D49F9205D9C549C82E68E500551F AdditionalInput1 = 457A20DAE4A69F1DF62820B9ACA85039BF0765445525EE1B80B9BFE984880882 AdditionalInput2 = BE8EEAD35183811AE55258C4D44C052D6C1F759553624545A653CF74627582EA Out = C6C45F5637550C4F20AD754919ACA0F2CF99B8DAC16BF3DCCC7BA6C2B5C99706426DB110EA0CA35CAA908C645E48FA89A93D66E0CB555092A4793807B050A3C9B5925B77042951B6BBAA676547B5C5BB0A64038E0E41637D142ADA044B4A7E3DC07BA7927C3E5D697641D7D8269F26AAD315A571D87701659AA3227A0D348006D9E8C53F009BE65FC9EBAAD2DFBC5ADC01CBB6342B01A7D7B4B6C11C70F452ECAD66740D66859B86F2FFA52D146C366B105044AB656877CE481E647DA4F809C926085982215628FF436B534AB374F063158CCE59246BA5FA54057BDC27906E514CFE7319866BFC8CE424904C020B9111B78C5E2598271E0B7061925E7BD7CA99 EntropyInput = 1BB72430ECF979C7BF4A04CC3D93A339B97718CE54994E5041580F26FE7FD1626100BC65A45BFC81A2D65E0747264265 EntropyInputReseed = F4CD2FBC2D712AB49A22CEAEB3F2B1D9F5AAD7B257EF74B610DD4095DCDC6E36CE419F8E04A9298A1683B8A243CDF6019D7BAB51041CDDA2EC5CFAA738FED8D1 AdditionalInput1 = 42A93DF698B6B69401642084B58BE1A1A92A91CD2A4E483306175006EE732AB5 AdditionalInput2 = E78CB812F135358E11285E00B9EBDC48F74224F4525B88D7409FA89A965C4622 Out = 48E16F28807B181627C8CB4D10A8C527B8EF7D4D604A45F534ACC99C9A833D62F93F169A6E723F9B92F4E7BDD22C43AE1AD317627171871665B73538D46943414776AA0BE925459CCB240463B8DA49E2F02B5D019661974835BC51035542DC651147C7BE1AD2A79E4F30F23F85251A97AD1FDD3432012C3F71E81C83167A4605F4422DD180F434FC2CA8D406B8F22207681B074280AD696162D6E6AB556BDCE13B986C4FBB1B1412F76B9FFFCCC03CEDC5EF25FD667902B4D78D10CEBC88D57FEF362EF2E45314DDD55AFF8C278CF9EC14515825E30CBB58A9E810066DD349C9A44A28BD866647BA2C426F50BE6B4E94B851C5561AAB0759AF3F601EE286425B EntropyInput = 7F1C8F5688F061C07A87CD47F01DE5D97DD411FBFA8FFCEA85985EABCEA054A92F16B78BC7492C72ECA8D11DBB936A2F EntropyInputReseed = AD5726EC0AF8A29F01D9E5AC35D318D63983C77F64C59AB2244ACAA443D913DD3A24DF5D510CDFE5DAA4D7E1FA5651F476A7D076E3ED9005574C7B9B5CE70643 AdditionalInput1 = DC2752EC4A469FAEF114F6F70E01F2B89763E9C3A9C39E45276E852EC8A389CE AdditionalInput2 = CB601E45A5F8E271466BC3CAB43FFEA228DD53EA8D2CE6183DBDD6B2DFA29AC4 Out = 47C612DA9208E8FDD8CFA8D2F878C283B0648D865390F812D46AF81C6B8D6F1BF6501C33BC8BFACA463CB36A12A9220A1A714BCC6EC7338D8D2493539DFD3863C7CF27D406920E9753EF57CBBB7227CA24CA4907BEAAF190D1321BA1D8C9C36337B68737957F69525530F80461DAACD18BFE568CFF7B30AF2C447B5A47F778135235DD00B0129C9D35D52EB710EF4F5781B2E2B7735340903F9147ECDB6BD932640966234305D8D55EF033505A788DD971D7272F0F3E8F5403EA13C1E93F55050BC157319B40ABBB6A5D6C7C6D9276CAD8700FB673B620589233CFEAC1F984CD3D324453185A113D00D4D5FDF9DDD28244260C10ABBFAF9E6CC3ABFA00AB00E4 EntropyInput = A2B50BBBC35F54067632ACFBAA5CC8C2B3957836E053189166AE6845FFB2B82B3A84E199FF6345752A8B33BBC2CA4279 EntropyInputReseed = 04E1F7E6F4F1E66B4ECCC91C5E25C2A60AB1331E5A17428B557DB3F30D6BE8F09255F00ED09189E34E21E07EDDA4BB02C1745B6886526DBC6F6EEADF38821DFE AdditionalInput1 = 789A47DE57F5B1308092C3774F6207A7D3E5E74B21D98D25A3CD17A525734766 AdditionalInput2 = 01BCB98AAC780143E1D2ADEDE3AAE1A0F9FC55C69537E8F862A4BE0F7D45ECE0 Out = 676CC965B9D56610860D92F06A4EC7436B884C2687304A6BDF53F7740D44633E0D71E36DD1C22C596CB1F39707604DDC2BB74A017F82504B08AA33EC22C1015829B76780C2253CC368980319121E11A11EE24EA5A2C2BE1E54DDF55990FF61BC6109EDBA70ADFB22488DC134AA6AACACF7B360EB2B4A7CD3CEC0F545F351B74694BF420BD20C562710931402A339E1A10C04E668742150C7E6C482782FC8C7B2B2001EB4E97D1491E8F58DCAB34516009DF031C98E1FB4D294463CD0E92CB1CE0D80AB61E3F645816DE98443F307DCCBF6F7D26C9622DBBD34F21F66C6E9C1C93632481516C55E9DD96570878C532DD453BAEAE04E3CFE349C9A89AE7A6330E0 EntropyInput = 4F6FAF0AC5CBD90C3A38CFAB8886453CB1F8BB19218B5D438088534E213DB400A571A0EFD566511CB9D078B85A2802293856EEED6B10EC1792C767FDF47732067657578E595DBF1C7CBB1260BAF01E3C EntropyInputReseed = E7FACB6B1F230B7FB3CA233531F27967CB2C2DAD8FAF71E868FE61942FE5B7E9 Out = EEEA36A5B6ED854C5AD14FDA1848F82076196F7353FEAB264A0D4A0F79BFE107FBE2F8054EB298E303BE29BC3D8369D97C29B1B79564759C9EBB1859887DF4B3D2F404AC3458E432270433E583D739687FDD3DB4EAA2CA94090BF0E28CBD8A054A731EF1FE6724B04A55956F5A33F71FCE96B5714DE0F061F889971A64FFCF9D4BD448E086E2C95F2E847715A9026EDB5AC284721E4FC27E8CD5F614DB75157295A109DA9388A0B66A19F0A8CFFF0E2693E9441180B02AB42717A31F607D8324BDD418E5B677527391AAFA6DCA1000992F9493EA6709309B18D5B9D7D829550984C0CB78F101A1E451DA51C5192F15B0365F8EF27D5F6F201B8B0A816869DF08 EntropyInput = 850FB526778A86353A58ADDD17E6DF00B7BFE313DEE51008822C9F59F8F52D69EBEB302383A2C38BCC1A04F39C7B9BC5E3F523361CD8271ABAD16AA62D8BC289F63CD042971105CC832FA28962092B89 EntropyInputReseed = 1794D61816F96D87039894A8A9289ABA9AAF462678A59785D541FE0503E01D9F Out = 7EEE901E7D7044BCD37D265BBB689F842CD2F6D79CA4325AF1CCD9E501120160A0F35DAF9C21948005701675B2AA0EA56B972E1C9D6C95A58302AD177BE63F1C83CF2424A238C12B89B7E8EAED52B781C83C23D6A63953D7BC41FCF693DCA853D9A5503A6BE6385C9E5BE5D93E663FF2A2905FE62076E4130A028AB654C6C626B052EE6B0B562EB3232DAC57AE4A15624A85110AF54C2189A393E4189491CA96FA52B9EB12FB692D322414B67B507CB1474ED34ED2CB68E9FAF345515671C73738066A38EA161ED8B05528805A7EAC87183D05BA94C66222330394699BCD98EA31A2593C239FD6D964DADE6AFBE589F98B5D79DB86D89AB95C6E89A3C0972314 EntropyInput = 8EA74BAB6654E178AF80211B22122EFBDC05136BE0B1848F6A661046CC59D279EBB204348A4A85672DCECCC03E5A9994BA31B193B65AAA2FEFA25CF5AF4C7B6C5C9D2487337439A74799BE93993AF857 EntropyInputReseed = 1B63F0B3EAAD8BF4140A0C586993355F408A28769B0F4ED7988ED32A2454A7F3 Out = 60F0A10A2F65DC5CC105CD6003CDB9CEAD7088DB8DFF27A0224C435C8068EBC3F47E9E7D931259C7EB5144BE6D7A44F125ACDD21110B77FCAD2A7C29B5C21AC67F6291DABC5257E4436FF4DA7317ED58EE6528B78BF48FDDB15582794346ADECC852E0BF5879C828BC5074C84C2ECD683C6A6EC0E1142295DC2841D9B98980E111FBFAAEAEE8FFE3A2783BFAA741D72A609B0301CF9B3CB23BDA8B82B250988CB8B60768670F182186307AE9EE6BC053A974E6D3138EB18997B6655AE00DA6E818E80595723067BD1ECE4DD21A7F086A108DA8D806D0B8CD07126E4401895EA898C632EA2F35003533F64F9B60F14F6C6622B4195438E8C87C52426F7FD88384 EntropyInput = 45926D2D9E8170299BC88DA8C4AB24CC083F1B11A7ACC8CAA5FEFF80FE6C5E311EF211DCD58727C9272B44E84ACE703C5F24A395BCA8E3AAA33EDF8ABA3F44D7A9C458C17D6B549533820AD918096405 EntropyInputReseed = FF0639196B387A4091011EF8B52451D080818707D9F4DD882A48BE878CD3F739 Out = FBA80ED9ED101CDC58715654B16EC419E3D34ECFFFF32800E02A31F0C51194DBDD8AEE10BDC7B676C4147F8DE23D4590B30210F32A350459316F82B76976F882CF3BE374DC39964B39D361681F803D6335E68D26829FA8663C191BB2065E6400756E343348F0FF8720F456D1A2C6292676B4BA70D3863FB8F19C3DA6D8073528CCD753B1333CFEB6784FDF949B6F86CA9094D4519B1904D46D85FC14C64E91BB60EC00FD4826B3EB85C3087866BB378204C69129BBA6E649FB2039B716FE9CF37F99C3D0C4EA9131D55FFEEE797895B49134E540E2E437600A9B76467CA25084591A73DFC5D8C7B2F8A92C343C205FEABE8D5C14C0BFD7361BE7F87821CB0423 EntropyInput = 2A1338CF8616F1671B6B12524B2D4473D41D40E2C51B167B4136AD16B2C403FB048B92F2E22BABF3FEBC888D55DD7ADA71F990ADA19916E3778CD7E6F72F807F23D48C04CDC8D4E0A477DCAEC65A8C47 EntropyInputReseed = 5671483D9E143AF61633E5FE5422276F6B3F82D2F25DA615EA6D18490610A3D3 Out = C5136EF02400804A356C1F3077CDE3655A5476F73099E2FA4F00E8A73ABD2CCCDCCCF25C793658FD2C347A4AD0EB83278AA93B6ACEFA33B4B435D9592AC6F63BEA50E45D0596E0A83B080B17DD46148EF030C616769658FE471E9BEEBDB442DAF0DE664C799382E850D2E8C4EBBC285A018C8B3BA7DA38DCE7670F6ACE5D00E5E8ECD29013F38ABD12024DDC6EC5BCC9262834C1B8B3B0DC70A2917AE34887AFEF0C39A968B41E0F9F10E49D2035E703B628264C89D7211369F058CC3F6D9B2660143938978579CDCDFE474DFD40F133C2CE9B07A4BDBC3A9653C30178904ED9553ACCE2ADB6899D9445E5DC2A7FB88031C2284B95F8B1405669CC187E29A2A9 EntropyInput = 18348C70F90C6C062BDF938E271D1CF40F0A7018465DDEC613FB2AAA59D527C5424D3955DB23A2F8C0B5FD2C2B2E414C7738E894F4CB9AF4B885E7880DDD7183C65A21460B968AD952265F288277B79C EntropyInputReseed = 14E55459382C39E5E62A89B907DE2EBA024BDE8B43EFCDB6E999527F0DC2CEC8 Out = C4A0AED6B29E9B9BD0E571AAA3D603E5FBBCA417CA07DA7071F0D7F37DAD0EEA6648C66995AD797544CFAD772A5C6FFEC59BF5CFF38698064AE48DE396983C98FC44CAEAA98B3EF1B3606D05758F091D768371008492D0F2CD51F0481FE40882455253878BBC924B4B604D9678CD21C306A5C65E0A2D8680A6F1F17D5F9FE892AB68EC1A67F39182A74BACDB9356EE4402DF8949DCF294BF235149154C24EE4ED0094D5B574617F14BAA08A5BC45D6A194E5B5A86BD7BED4758C2C3F827DEC7410EF6A14CDCF20A140CD7413ABFBF99DFA05783908675CE75A83287278317AE321DF53338698C7BB2AD87EAD2A694DD04CD628CE85CB335D967C9AC2537F0C3C EntropyInput = 1ED72F57D908D00B8AC6D81ABB5DC4DD21D524EE14CC7BCD32312C6320E5F0C4E399AD136E03F3F22B94FC43903FACE5A02D9135C30D30E57884B3C8A5C22CA4DF0C488C0D28273BE00FDE6AFF3AFC48 EntropyInputReseed = 99C7F95E2D46B21D398ABEF93511147F6F43EB9FEBF03ECF8730252AB0F05553 Out = 01D0B4DDC320AAB27DA6FA575293686DB57229B54CD4EC2649091012589D2C348AA0E4CA6DE7499E45129C0EE8612F1881A14DC52D9E8DA79119B6CFC056CB9E34D1C9100D1E017122BA66E45062A5EC013F3EE5FBA7B97FE89B9F58D816A2F17085A2F3042BCC172B76A6922579CD8AD349A3436AF2D17AD8AA2AEF30339E1CCBD2E6B6F9678270DE4C5D11FF423169AC15F80BC980E5026F0D9CAEF6218988B1E7BA2CF5FDA589E394EC4249DEF4BE2062FFABA12F27794BF4A56FD07DFBF0397D050CA4691B535E9735A7969651F02E85021C69FC94D85520C48A96A0E59FE80313865FBC2A6CA066FF9491F2105EE4841F542D37E46B0EB04DFC2D827304 EntropyInput = 06D4BF78785E3264C2DAD1D9FC5CDA86E2193A3F8F2AEE1E930082A54BC894471BF09BA2654B2EBBB9A43ED2A293EF6CAC8DD07B45DE4DE81CE8622C850AD0EADB17F063DC0CEA25861D92AC41606547 EntropyInputReseed = DA3E580C3CA2B0BFCB8D177F49B5EC1E92FCA186AED1FFF3AE4D8C59469D6331 Out = 2E56F87C870D245BB73A52E8A8B99EFDFBF225EA248A5606631DE28CC98F0B36DA498A0155DD327EBBCA57CCAEBFA0F0C959A1A1AF7CB4FA2A9D8969646A048F6E942B67334DE2533AA20A6DD3645F7FCF61D0405FBAE175715938001EBBBFB47A1D6017B330A32BF2AF13CB624A14BF3905581DC8AEA9944A1E10CF602B75C76C70D8B243407088B6FCC835B4C515074827041FE3BDB33A7CFBAE6890EA37C7D52ECD2DBDB2ACFF74A4F4B0F6B3AFFECB3930DF23732355ABDF592B349F9AF2A708D3E8247D02D1266EE7FB9AF8ADB37EE4BAD748F87785894719CB9BB45C9739B12441A66F015B430479D6EA737DF070C7DEB7BD8EB84001E035BE624B2684 EntropyInput = 3A225F9D29B04C169B14A3BB88313792D7CD6F941AFCF1D928DDC5245B2EEB5DCBA0C0D62A6BADEE4511D0D7499F0F8EC0885A680C9846EAFD99026A026E4668A4D8351F386040C9DBBF49B4A802A5DF EntropyInputReseed = 4C2E65144AF339D0710E50C0A0EE0F9CC9349CC428AC0C83DD5C6BA5F23A89A2 Out = FD615700295A162A79DA3E8D96D063ADC99AD911AC0D6C93AD169174B72798F352F0E861BC3740511F8C4267BFD68D0EA91046D5312F6E050AC701EB46951F9BB59D30147B6C4BADE13FCA096795F5B4BBA49323C8D2035D7EBB223AC46BAC847E875F400AC1AF09492256FFD0FE101F975BEA7AA97DC46F0EE4D663661CA4C7D29F5048540CA11E8A43F290507BCA3B39547352FF418C4E9CB202B320A2BBB55ABA0679388B4FDB722668DDBE1BC25ED03992E8F9F7D051C555E7F136299D4E4FBFD47940695E6FBE1FA992F4A5A2C4CC37FBF65273420E65E279B5FAB79A89A4E7AFC938DB623FA9C45BCCA76B3CABCEB2D6DA6617191A80C067E16FB57A08 EntropyInput = C0CF954F178770C3F776EC0406AC2F7B96EBC415D339AFFA2AD76CA2F854DF0C06B2AEE2FF6DE47046FC1225B1884A8C5ADF3505663071150FF52FFEF653922BC78CF48CBB974F5B7EA9447F8C51DCF1 EntropyInputReseed = 55E015C4904DBBBA0C7FD100E7AFEEE404869F2702F27D4D877B3D2C86204925 Out = 424E702EB4FCC3BA03F64D66F322EB647B8D50E16C4478C8C1277B7D401EA8D5B0448A5859D0F2A594FA6DE29CAC690C523E733F74BDC1E8A7140D52A62D7878700EA49B1E887F4789E8A98424F448C6B7220E2817A6BC1FE6B885193AEF601A5319FF607D47BE23D36BD6045FB73C9BB5ACC589396FAC953ED511D7AF2032E7905EEC4D23EABD4A488753566AA516C5677C7FA1D0C231A08E9FF1289DD3987157E4CE34A275D7B555637E5E96B0AB5A7B5025E773E07B63898013B35D3EB4D8A9ED91E45DCBB6F9FF866216B3922A870E9157435C5DFB5B106FB6491C2807193F03EF2181951A7C084FA2B00976AA29D1FC09803B1598D80442B54B7E2322D4 EntropyInput = B6E6BFD1FB785269F0CDB7EF27FD5B85F8B0852F2B9389C9F0D94A0DE919F60A008B4284EBDEF4FE10297C4F9CA8788BAB662F385EC3AA56CA1E492CFFFCD969C44F3998B0401CA06169D60143291105 EntropyInputReseed = 989E6924AFB53B10EE87528CB57D053CB4AC21B0587C9A8316C2F54696436B2E Out = 728101E40803BF32D014CCFEC65B3C2BE6642874BEF91FE23EF7802D4FC78E943F9036288404CE71ADFC41AE215462F82DC77ACF3E10773D2A62503C40186FE4B0142A2CE36F2A73F0FC9CFA98485E7D59876CB4B68E703D20DEE8C51C5E68F22222C253B61CF59CF903DDA0D7CFE746B54C83EFA45AF17F34FB76834A5826F8A2CE7603CE69E819C2D066AF6E8FE670A2CA05BD0E5267F8B0DDB89EBAA9B70C88A15B6FB3D6EB1F30F14AE65DD7B358001DCB89BA17CBF4815443CC8628F1F707C90C9BDBE92402A5A6C64903AEFC4F207052AD741496CE2EA7BC5C3F8BDC97BD4C15EC1EE14DB8B10FE0AD6CFB919C3D91C67FAC7BAD3D3030BA09965BDC67 EntropyInput = E01C2E06DB41D630C7E2C1ED5081959B494A6F71BE2B79F41251F87D51128653DA74E4B9A3FD9315BF35D9CB5931C52DF65ABAA5C4C543578B8A05A80E7EDC546244650A1FE3084CAC5B3CDCB5B2879A EntropyInputReseed = B07401D6E705FFE17B47047AEB7240D4B4078E5C2FAA2838F7ACC2C87EC5EE58 Out = ACBBC3E55E71574BA3EEB567579A4AF69233EF0BBC5B0890A498F360F33DB6DAFFA0F378572D814D115B4B2A9139038BD57A0648CE1AC4C1DD8AA7544F17D1BBB1EDC748ABC2A866926A2E26E0748F7E54431AB7D2CF5B678A10D096412AA9712BA38FBA3309DC86153B464AD958335D4B81350C62FD39303BC6B43DBF7ED8BD1D352CA2A041C6E48C31F3F0083814F6059359FF0607C2AA2431814A18B7FA432A9FF99328ADF0FBF60945109E2BD0D15FFF8167E246FC3CFB13504A74FA4EF6739D51657292D2228C5A0FF5961B7815DA64F352D267AEF80AC7342ACF120FA7DF71C550D4C8AB0E9B1D537033E74597161F0390F8D19319CD7BAECE73921A8E EntropyInput = 7219D935FE623BF89D5E755D899011418DD2C5B26918573881B2F689B2EFD80BF4B3001C35ED8C8CEAF2AD64D610ED338C48AFC7C0893C0C38BA0AA716E9775FA3F8D3A230797E2050AC90CBEBD495FD EntropyInputReseed = A7F1F2598015E629D22A3AFB815BAE721B2298B224EE5DE59E58DC238DC00EF4 Out = 407C513FC478205847A964D2EFB39A0DC8F1291345C0A2E0EE95566AED2F53214E35DFFDDA65D852ACBCC9D74BDA64EBFA0340476E344AAE7E2D38085CFAF39B2C728E5C9B43200A060105D821DC17BC5EE87523C09721DB4234A51CCA7530CDAD54D72F6B891B6C8D5EA5D4E92CBD77FBE487071FA42BD5025B738C583E1CC490C15176B2D1B8F060D9FF23E740D8067A423020A77ED6878934B94446ABA2368D832FD2B243BCAB22CB73910F36312E06AA350990782ACD2E57DFBC09640F0B883FE96DEF361D212431067BCF68AB4AE7CBCCE9AF7F52D68C2F119D9C53BFC5C2BD5D2498CE2B6245AC4DA991F132150CFFD50C6BEFB46FD74BF19EF162C679 EntropyInput = F3D86E49FF537EE60C3CACFA7895C075144C84DD6E2122A2C3DE17F9D89C0DF784C38250C98A8268B68812B183B311E225D5090F990B207821F9B21DEE87E0B94A3D2BF90C331EFBE0323ED582F45888 EntropyInputReseed = F3088CD35771AD0E97E2838F08EA19D544E23AE7BE167AAC19AE473004590AAE Out = 3FF9DF302E6AC27F10F8D70E2E8A0A356A4EC8BDF3AC5D26370F59EA097CD59A1D90CF6AD8BA7B5CBA50D16CABD8DDBA9FF3B5E42812672E985B9973B9673E457FA3F95A9B936C81E82512560CEB19495ED80FCB1ED1A9E748AF2D258ABCA78A4A57A4B7D16C93735AF4C3D4661EC73D8AC1581664B7FA5C79E07B31B23149539D9D9DFDCE5691A2A9A8CABBA19ECCAE93373236FFF45E14B5028A9763B00FF4D5EF7AE247818B85DCAD919CB3C9E124DE699FAB4FE777F67AC4830111703D1CC6C423B3CA8DC0215C6BEA7FC15BFC64D40DB7061FCC7CC0364BB6F5B157C72FE2DCDE9BEB4B24C8293D3A452695363687D977677E37706D10DB87320F2FAC4B EntropyInput = A2C4730D71871D2072DF3AC8F10ADB962D1D28AB1C9E809C7C61C4B3783AC19C0F54B479CB981A43D1B6E7D3378F54ED2198E11600CFC152362F5C9AF31C288E366DE62EAC4BC8CCE2B8B1939712363B EntropyInputReseed = 6AFB327484B0965C04EC06D7202F1EA9ABD899E034F51A3852C7946068F417C7 Out = ED27F28E309059FAF79E3F076639BE286B1199F625A5A7AAFD94E09D14A5770CD2F044CFE8654F057BB868B95A1800F95D33079E5E9F1B3DBE32D0BF728980CE3E5FB0CBCA8C2BAB6D78000161DEE2A93E56EE5E9DECC5DA342D98B5DC675E146B3C8FAABC555BDBC39967B461B77A25B35E6F4E4E7B22161621C3EF40C0D42877EC82FA580FFB14527E3D9C2B57E23D274E0DAA1ACB8001849B09D9637A630406C32D2719875A064FE4EC4F612094CAFFAF436717F78D77BE3DB2B806F46CFF3F302B2DCBD2A0FA39FFD490F3C6579D49080E8D6B0D7A9CD556C0ACFCA55826C65EE09A1E248CC24AA30FDB13F8B2505ED1F0A3B44C00462F30494E688821BF EntropyInput = F3B1352CEC3FE74843DD52567129572C6AC97671537757F9D43809944F52F56FE8F582A26ECBBE61122813AAA5BC2557398ED363CDB918EA8B9DF39AA9B5AF279F6DB73E53777221D369A9FFD8A85290 EntropyInputReseed = D0927F65B307607D65079C1B508B711783744D6675B9C4C66863BD3160F4DEF190D7649AAB33CC758F4351944AC515A06843293CFAEAB21940D828E6CB60F722 AdditionalInput1 = 77AAF3525D00DE0A4BF3849A4A2C2A0E12EDC227003969140CFA648C3691CD4E AdditionalInput2 = F444DB3C67E111AC4F35F18A8FEBCE335CF91D2760D46E5F79D67BBBAAC26EB2 Out = 15EC830A8C0DA088A8E531E49EA81922D5C430C1F3CF6D09DDA6293FBAD08425AE536368680D13F824EFAC7FE4C55B5F8EA8C3DD52EF239D0C6A2E046EBE9C8341AA5046A897510264C247EE691960360DB16E41E373E7C9567611A85DE771059DE22D8C5ED6B40C398178C5E01DAFC101E31C5683857C807951BF696CFF9D83E0B1FBE63DC9B4442B54CC43A96070F0DAE9A749826A526F3245CF9C78EA4E3290C8140E6441A12D17793C00D9CB18976F5CA6210C2CBD8938FD46ECD6982923A1462C1F5CDAE1B1234E2D3834454089FB042D696CB424B855E41BD4E2591A471A40266094B3F236791D8E40FAC142F97D3AACCB01F60B7D17B87EE1FA8C36DE EntropyInput = 5D0F12A74C43076FDCDD8BF9D6E0175723B24CB13CF245FBD45E73FBF97C359A03EC8CBB5164BB803E946BBB617B9D344AB7AB62B38A01A0CF8CA581C6BCF682E4C5FCA2ED5556F69A612B5A0587229D EntropyInputReseed = AB3B644CF58DBD2044DEA6CC967850D56FC4FBAF453161A8D3FD37F480DB34A93132E7C59AEAC4888837D0679311ACE06813203FD2333A389C752FC91FCF7BD4 AdditionalInput1 = D4EB29F4F2FEA98B63A297E8003F7C5544749DF0B824D1649616C000942B91EB AdditionalInput2 = C36DE8E4D3571EEAE33794DD459277C28F68FB7472A1571494FE058CBD67AB1D Out = 62646351D29A8CF51BC15B8940AA5422F0DF0EB221DDD158196011B38A03714C229A31B599F76D0AE6AC39032E2A68541C0EA9A568CD8979C239EF79F934A62256C75F2530FCF5E7A3799972FD0A4A096210BAB43B921A830BB3FBCB7AD5E135A8DF769783A0ABBA22FE17726DF1DAE4D8379C375D44E8A24BF2DEEA5808FCE73E71A074A892EF6DD94EE6001C1A39CFFFA8951E470D7E9BAEFF0A301EBEB35B28E71F6364959C2C219F38C4456FF7BB9EEE0824BD850032DD52E614B899C55BB4A5CCEBCFDB4FBDECB67982CB767B53F9EA123D9C9A853D2886F75731A166EE780C6AFE6659AD09B66970CB2CCF2A67CACCF59EE5B524EBF1412DF554587E2C EntropyInput = C1A753597A727C197FDE48F71ECE8DE7008623FDF78447B855D7D92AD97BED4883A27F81682B8F2A98899DB6B237C25F450AF2003C92F878E750F84D6C9C6C56E5334A3595B17776AA8F3E5FECAB8DBA EntropyInputReseed = DF5BD38E91588B4B82B5EF7C21AEB339D4735E7AE8B73182326EFB76D3E4ACD838961B0E63254559ED64F88E5F24B70802364568E5392982C42D7AD7677795E7 AdditionalInput1 = BBFCADE9F09E598B5F7C59ADEEBFED21CDD401A7C211747A7E5807D0E47A1AF2 AdditionalInput2 = 269C99454252773C91EB5A267420F9BD570235BC1186391567844B0B0FA5F127 Out = B4BA884D8A5073C071ED54922CB635F8B1DE0B77376A4F112F590CC1DA61AA05872C810F7555519E294263885166A2DA1A7F27B0D796EA53E8FC91AEFC660424AC81500DEAD65E0E8DD701B8236D56EC62259CA1A36A1EE06030B926047069B9F78E4644C8900806D6414A73F2443E5571C430A0CF11C513270BFF3A2B930A58A655205F7AEBEE25547CABD46DCF90D23E9C8EBD0924E7DE382F68D685363318D40D8A79C7524DA85D718ABC4E60F24230957D6C466CD6C6F7C4BADF7F9059F8726083E0927553E49C47C2A03B0E57DA53BE68B38BD5107EE3F2BF4596740041A0247E6A37045848DB8ACD43DBEBCA9D19ADB199BAF4C17746B31F7CDF00B2C1 EntropyInput = 61212B9290CD97EB85979AAA77230BBF8BE031D10497BA36AEB1DCADE31AF499731F306673E86F38A33AD5E6543C746F4D8A1599C0EA7EFA0C2A635319BB98CFD48FAD977DB13D8F3DA69FF37A4144CB EntropyInputReseed = F632481F628451BEE32CA909879A3290EF0345AB944E8DCAF49E3054756BC8F70856B49126993744A56DD56D5B706B710E7599E77F5D4AC8FD0575342B783707 AdditionalInput1 = 8C64E17D6185867BFD14816BFC1BC377F91D3E565C10DDC9C5F848FEDF44E00E AdditionalInput2 = 10C45E829F7152616C9B269C92840C01D16DCDA46CBD7C1D3437F89A2117F4ED Out = B2181534BCB831408EC4A24AF61B25C4C947E1F4F0D203243792DD79DFE644BB954947AF976504316D7C6B73838EB726B767C959B82DF234DDAD593C51ED53C93B5E71E2C2C9B0892C07EB16652CB2F193030B201BD32A8B32AC649CF5CE6F1B6619942DC933FC47D873341B8240FFDD753130FCE288FD0348FD0481C1E27A04CEA703A5DB250F2656E504DFCA131C6AAAB7E86BC4D7D8086556E4A55A5D3F27F1BDDEDE49C79523D5EE372E154BA2FD2C91E71C70157D04049CD5324DDCA6FF66235708456670383B2AD7966DF357CDD903A1C1A3F8677B113D54A5AC485B4E8AC6A6A7E9949E815335ADB94E7C5F6B4CCB2FC0307A57AD2E1535D856EBBBC1 EntropyInput = 81113BE88CA7A9F8735B647A3C7D50E5FBF0DEFBDA56D2DC97AB94C962B134C8C7285988DECB86574D35CCBDBD0EBF550050644148415EB5F2BDDB79E3A8D8F3BBED4737090C3F012856F63DD35BF5AC EntropyInputReseed = 830D4AE94AA96E267BCEF26F76C57F22E885D926470E50205DC5D009B781FF59FAC1D93030186E1D7FB0CF6025B1EF80F873D71E540B10B7BE45F498624ACA2F AdditionalInput1 = 30B6462DDEB1CEFCD4E0B5B50C62EA330409B443346C4E43B44C6142ACDB36FB AdditionalInput2 = 3EF5CACFCDA36DDACA24DBDB1AC4A2FC79CAE246807F1397529CF84E5549A603 Out = 37C971EC23AF90881A75223006FEFD1E905FBCBD8D15CC585D651864270D758C4B6906E491426F854364FE76D71CF4CAAE4D3AA7E2321F06673CB4E9FAE1A27C6DAB9CA59C3F266DE0F4D161CDCA0F5B2FEF7C9A67C33FAB6BC16A427F2D1DDF96514C4F4CC8EB2D1705D461BD7663821AFA05FD88477B544C8310025F0607ACAD558FD2D6F6F736CEA97BCED9143C61241E0AEB3229798D48B8BE5BAA4779F3C7D84C342A0EAA8CDFBACC0B95FFDBB539E8164782F3BF1040291F4647BFE5BB354272099F1839EF3CCF566CFFCD7DFB872E72DD152E0A45323AD1EB528BD3C67C2B8ECA779F4270A8AC9E99811A64926102370DA735ECDB610B285B18943882 EntropyInput = 7D8986E12C07570C4B9673D216C781F36E116878720CD3743286C33DC8FAE6ADD3B0B60ED17AB9DFB4661D4F462A917EDC763F656B4F960FB5B10D700D7B315EA49061D14649687350312AE2925A5323 EntropyInputReseed = 732AD0E4E731BD886703189BC376EADF1BC6634E59959A4A379D54401D5B3933B5DB1501A8F2ED90E45A99B348FFEB79599F93909E6CD20E5894455C4A6788E2 AdditionalInput1 = F325661E5F455E312BBE22BEC24EE9A703D027B44D55AD7032067EC64D0CE5D5 AdditionalInput2 = 0EB89C0E2939A2DC4C8832C5DAD4DAEAAA2E1482E88BDC19387CF985E070FFB8 Out = 0A9BC6938B110CD452CBF81910C004356A1B641BF3BB7E411154B2E0331819ABE1E55F41C49672D3D476D34224A597788213FFAD5CF0D3C0DC74F1FE420FE50EC8DEC4ECC7FCCA258978239A3CE63ECA03EF4C02508A092952C59C33DBE179B44016E20F4700DA75EAF9D1955CC92F847297AA8A4501EDB6C1F63781F057CEEA52E6732748A8CEDDAAAC9D648E18152FA846C7EB25E2DB5F9AB8D134018BC59FE8F3D966B11352E8E2076180AC14268C46E3713C0FC1351846567F7D3AD1704B71B21F5754E7F432A963A2E80DA13D395CB94E0CF5FAE06C570CE23615EA43B5587F4EEC329C82A4DF5B2AD8FBF59AC0BDCD10207AFDE46E9F5BAB4044C92D43 EntropyInput = 7B872FC9C5C5EA718E227896DBE7B13392488464419D81A7B036E1D917CC963949FC449483C66AD823000AE105850C80274360CB34B5D3B8082E01934A49816ECC17A205B5663471F2957537B80A5CB0 EntropyInputReseed = 81CB62CA4210BA23AF18DF37AF3518A893FFF202CD4794AE6B58310842594DB20D9CEA2AF5FFE0E660753D83F62DBA6C4078F9C75EAC74AFEFB75B6335715861 AdditionalInput1 = 3C0D3679A5B3160AD063EAE2B45153592290D3B1B97D649EA2E38B28D1751D38 AdditionalInput2 = 02501A85D84615FBB4AF158E161560C348328022865A99619A40A7F46B223280 Out = F3A30015A5CB616CC4834DBDF41981DC0B979A488EC6CF62ADC1CD78D0EC718309EAE0C8989BD6DF6A35C16815353C964AFBC9F23BB1845B98451FDBC0F574B43C26741635F3434504511816FD08DEFF82428E3E0AD6853CC806DF2F6CE45DA27781BA1EDCF047525A392CA7A6CA0649694D30A8D9F6C8CB1C7C8668B9ACFAFEB86168457E04B60E8BB2E391359865C48F1DC0B97826618270DB2A23B710F1A0FD189810E8AB6B2177106BBC03677044A3111CC2AC80EE35D8AE9362CDEC38B87D328D0A21AFAB0B7E7C37B3226EAA93A4B15E8428AC20B738C513D86F7AEFE6DD6372B02E6DC47996E67CD5BF360C897308D9043FBCF02E567DF217A3881613 EntropyInput = 930C6E0BBB7D3CF5393C6B7B5992516CC5B605B47BC27CD7C02211BF5B0BDAC8E9BBEB3B80B340A05ED140FC77306040DC3DDB5548D35FD2324990C828F281583F52D33FD0D12251BE579328E6BC58BC EntropyInputReseed = 232A16C04F28680CDC514D4FB1C75B6F14A9D37869EB1C52D67C57FA014C3D72650CE1EEEA7D17B7379FE219C79851E6AFAAF8D6A7B815EE5389923FE17E0082 AdditionalInput1 = BB72FDFA7A22863A7D0A0F9B6413A6440362E7F499548C19B387CAF8421A3163 AdditionalInput2 = DD0F81E05D1C123D796FE43E657DED057C0BEEA387AB1F13E2F56B5FE1557599 Out = 67B482B1E04BBE6F0A40295E7B10FD4E1307799586E1CB83AF524DC04CAE7E8023C5CEB125B89E50F8B716AF28BB010FCE6C5FEF106F17E5B4A0573360BE1F81121DCB17CF59F9E3CA21F88128FCD3C1E46996F227D60D92AFEF1E756F869CBDFC7A4E5A2471D9E7B3E64DCEC6B1D6EF8BECD7D0386EFBA10864E6E9207A456BCA2C5C6FBAC37B05CF97632133EA85877C7E4D1C210D4E134D8260191C4E56AE2A157732ACA11BEED82195D4887D8BD5D8CD3B8B90C41B95C55D107B6456C1A1737C08CE56268169FD0C441A70B7BA68C2DA14226C54AA88B3F53B0347E58E1819BC3F30AC398CF5C76AD4F4F5A536EB4900A17CA62F0E660C2B578933A1D3B2 EntropyInput = 02B4E4C6732BAF3398EEC87889A1F920F3664D95271B1D4EB1ADAB69F420657B74C639A7B03577A4710F691AEC6AFBB45579ED513213FD3747F635D01EC39497F7349ECDFBB60986F6FE97E2EF43902D EntropyInputReseed = 7D9B95EFD2485B6BED2ACC9D987FF06C54EC7C19CAE5F8C39E91F02CC0E1D91BAD2A61B2929BE36A6E4708C1FB198DD589C5504F07E8A1C2D8F2A23E105BE910 AdditionalInput1 = 2E88C78ADF00397934AF2FC48D2CDDB25629D4C33CCD3B0C0D762FF6F7CA8495 AdditionalInput2 = 6959206356D610445DA851C31DEFD3A1049364121B4F0B596A2FE9317B954353 Out = B2BAE195959435894B8D0FB114DC7F2B703699D228FBAE0E7823CCBBEF20A17B5E3FC73AAE9914C2FD9A2283699FB45C594C102D34E4BA3ADCDEF5B63388C27771823B0465F9A0C9E49D9C3C1D134386C1F28FF347DF7B8CF740806C8354949586C5CEEEB71198D72A034EE50559364A60CE6DA1725CF4FAA7ABC7A5062C4B64220521D47B6583FB7E54483EF537907A51375A6DE006AEF45AB2A30D4F5479F0FA37D9F22BE9418E11B1466FD8D32573F667FE6861CB0833A275A0A41D69DACFBD6DA24546898D4DBC0F25EF2BED696CA7B81A593B087E52FB63CFEAA1B379FE7FB139D44912B7E8714DF3E62E0DFB08408ADB03A96C8A5FD304CCE4753CED53 EntropyInput = FCF225211756B8373EAF96E7BB463B3EEA6DE44788B353D4463B3873F18FB1335BB5DE4238CAC3DC06FB88C0AE8E289C94061BE7D804F41D0D8B1315511F8B9BB0AC0B97331249E385F93A2AEEFE4887 EntropyInputReseed = 14BF3EED5CD946D0DB401E27FB49A3A70EED352106BFA83A65CF332B920F0FBBD71E5439C7CAFAB85676DE9045751FC2C8848E27FF6D5FD43E44CFD7ED1D84D8 AdditionalInput1 = 4CD732CD61D41D43D93D56B66384BBC70CB838C32FBFF7E1C130F323980DF8F8 AdditionalInput2 = 9B12EDAD21B7053BCA258BBE4910E80936C9E53C2ED4C496252654F72C3DCDF7 Out = 29A9C01447C787C096DF92D8351C2B7EE5EA74B977544E80E17469E6CE31FB73E3032B378D5878BA2CF01FF53688458AB9D356562897B025443998B00675F6AB145EEB23B278F3A92CBD78E5D2A3C30F5ABD136A3C8E855A2C6E1BC242AD789DE03E15B84AF1B6F4839343C0595246CE2811EF3F99B09B0781E37084B88E8BD6C2ECFA20256AE7A8C5ADC196AB2D66A6387F300A6DD6C946F1556A461E8D255066D5127C13DFDA1F173F5B0CBA0F4EF8F89D52329CDFDBA93AB2FDB767B1F9D766FD6326F6156CB5F0FA02D9CD00D3CB9F2AC6C278ECBC51A74B6DC171FB74187B3452379CB695805028957D4368187BDED9C00177F7BC56C0A5A3195AEFFF44 EntropyInput = 94B53A987E77F3664752284DEB4E73AF5E1CCD43966E5E8EFA55989EC8266D07FA44BB3DCB777E16EBDEF2F80A4476FAD99514AEA15C24EC3DAD694F805012EF53F649BF904CB3D1D513F6499F7EF278 EntropyInputReseed = A921A864645659B39DEAB78F73F81F6FC552D0894800A6FA545E0BA74A76E7DF0F7A0594D792F00D3C0E3B0EBC060135234AB4DB8DC09F926E9CE26CF92C564D AdditionalInput1 = 3A53A815B4171F88375B23F511FB770DA07EE6B83EFC65BD288ABD4267B5BC95 AdditionalInput2 = 6FF9E1258C5B7C8DB1D7BB5181A8801F3EB07C49F8644DA312F7AA66DE86EA11 Out = C9AF0F4C5CBAB5FFD29E51346263106D74BF2AE23A46135AC79AE0086D291D83143D882C79E1E261DEBB42F59AAE17D1D5EE2AE0133D4B42BAA856C5FF451D8844DE52C7AA89AB04728B03D070273B474E01B017298CBD23BD3BAF21ABA79545516560C0D64CD8A92DD987605EB1FB1C25C5BEABA317C593A0803A1FD88016E8BBBA5FD1223F1401325B4F6460671E4F4D1E9C2D1D74DA351CA5F31F5A6D5BE0522662763ECD524F511EB182438D0416174F7BDE7F31E81918B231FF7702DDED480675B6F0A6CF93518A2AA14C3CF86662D6472D7BCD8D7943D0FF5ED20674D80B189D42059BD66E87AC6B7CF1E00CC86D723495CABE0599183E2743B39CFBB3 EntropyInput = E9209DD0FD7BBC195DAC9A61A48DE3D8511A78E1496A2D213F2243D67A59EE9FBACB5E52F86041201B1B9BAF9423BACA270D31877B90BBEE69D50C99567740261BA35319593BFBBCCBFD13196306ED78 EntropyInputReseed = 8D546720BFE76A5C8FEF0051949CC6A9BC1B17F36E5C6AB13D0AF14DA4821FB64A32A48D08075BF96096DA566BDB9726BA19178EC7948AA3933937C5D116850C AdditionalInput1 = AA9FFED0D3CEE6104BBC24F6DD13769C99E36E88F6F80B651995363B8FB9B71D AdditionalInput2 = B1A50313F2D77B60EAD4AB3C93BD104483479E7383078AF7F6EAB6544B91394F Out = 3C48D443CDCCC5BE571ABDF066D217B4928ACD67807394D55FD7B6EE821AD8426A71A9BED5EA7611FAD4EC22AEB512B74E7262A1A373E5D43BDCD97ADD45EFB31A90271A549ADEB5EFE8E99E422B1BA9AB20600C11B6F234352A95CA18960C3F04A265D45CD74C857B84D0A2B8F2CC5CAE98F135C163C6C5E5EA54BABC560F3369FAD27968F58B1AA32E289C8DF078D78B0DA7EEB3CA4922F1E0882712E233BE0896A9A676D51F1881A522ECF21250EDF9D74BF87D1B3176917E66DA266F92C3CA487EC4C017AEB46BB153CE8834736810330E480A9741B9C048113E72219FE0B74B4E3366F5EDDA17D2E92B128F0890A63E04362FEA5A8EE7132503A744C562 EntropyInput = 77AC50E2D6D0C97BBE61F0D6BFCE7EA67ACA0F231E9D3BAD1A7C84989DAEA30A05BAC43848CDD0CC33B041F801495E9163CAED5DF0644669033E7BE2A1A1FF3ED9AD8E0EE7BBD2B246F6326C68658DE2 EntropyInputReseed = E4856C297B8DAB531BED952552850B67567B5124A86D35C2D3A248F4DA906CFE96DA5DAEF5647B0279A212AFEB2811756E1C90C644B14D1D7D77B10B06F6DE54 AdditionalInput1 = 7662F18EDCD373F92DB5F6D61AC2BC827B78F548E9077C088F571AA3178393B8 AdditionalInput2 = 2AD1F6BEE92DDA295FDC9FD757F36537F55F127A586EB75C0A233564E7C984D8 Out = A84B18DA2765E4644B3D6EECD55F1ED7C5C03D488624E94D9868A800516076CAF7D811089621FACF28136CA43AE74C5A7C4B41BB39FAD3F786EA810D1DF541AB48E42DB990CE86F0457745A4621A1B2BDC37CA0C98C72D7D810B7B41E32FB62FF03DA1AE678D5DA4F5A864488DF3BB0982AFD2D9399CC778E91BB954E8CC31C5D40C33CE8DB64BD11401897B92B17C83E6046D58C3B09AF827183EFDEE4872BB6D1F1762B20969C83A834E58DCCA5931BC501C1B27A4FB6A751DF7AE534AECB470E150587C52CF3C6B6299527B6592D54BEADA1597882D1BD211385E387D8A426DF578DC1B433758F094C8C4E9B39DFAC5933633106825C7DEBEF0787E76E5D4 EntropyInput = 332B0C2B582B4665CF36CFF17983A26C00216E77CD9FA22CAE409A8C32F965BC63C44CFD27D4D15FD3131746852E7148B53C8030DC2600F26F42F6AB885264B2E2C022297ED5FCA9F7AE71ED5FEF78E6 EntropyInputReseed = FE28AF0CAB1759CA4D7CD103969C1C7A71134E1A0AB9719B41F68D279C3E79764C07C1EA696CCD5D85B41A4F8019A955B6C0E2EFC38222AA79EAC1E205A26582 AdditionalInput1 = BC234F145DC3B2AE70F6E61EFD408E76EA3CC440D94F1838CF3A16E087A01D10 AdditionalInput2 = 48A782454D81B3AA5B81AC900D6B8D890C253C57BC73ACF40C90FF8844BC6110 Out = F0E175436AB3FA52429EA5484C3F5EE6DADAC1CF141AE01E84A9B5945538E2C0EB3E65EECA185874FC2239B853A57C780FAFF7701A2547E1EC872D66E692A5B9AA9311484CB6BC5696E26139B02AB701F33A40046E7ACA3149E2634C20212D5414D99A5CE6249EF11F0CDEFA657EB20A2DF4E411059A05A14AF9E0B7D3301541C1B0D525CC6835C430871BB6DC59DC3A71C1CA53643CBEF28ABD08EF7D77667C9290996A120A3888A20B24CAEA58BE730C7677F0C5A8ABC7B579438CB2C27F5BC653C83745C0024C1B0FE5BEA16A32BEA56B05A8F808D09C5132D067F928504ABF4D1B502D0463D1E445CF5E87077A4966A35B9107C54FF59B7254919CA3EE21 EntropyInput = 6D12BCB320ADB0CDC50F73A0BE4F4E2BE7F4BAD6CAC10C6DFCE048C61EB6B62D36164CE7516D11A10C84019058E4FFCB1E95F9D3951D3115AE50F5A0631ED8F9F2FA110A82C8335862058460D48506C2 EntropyInputReseed = 034A58DF02814310CF0BB6BA62374F9A549FA661B5F5D72F8999B42591D1816818400A44B4B3228C8E9046603729565FAE4176F8B83681BDBBBC2CF7D47E402E AdditionalInput1 = BABC24FDB186C0C0C1D10C2187C62C89B922C654B575BDAAFE535415D11E63A4 AdditionalInput2 = DDA30B9853D27D84ECF33AD8449E33E9100FD5E3B062A20C604F9A08B2B7375A Out = 14BA74AA2971E653AE1423DBA404213115B8E68C9857A4C4CA79AAB8C8E6F840842D6469605020875D03DA674809016E756F076F32A371D9B2F60B38BEE599B52A6177DB19D24EBB530F0BB8D1030A4E9F536009020057A5F7DBB9203401764AE20FA338DEA0867B7BB30EBE733E3AD55AFD14E9C9D0B3B3A85D04748EC1E4F61DD4A7D5D7A49F9C66AF117CD29379ACC7A33BFA9F5064F2BD55B9C8595BA35A1BF5D03AB642881C16153B178ADB85D6D7544DDA6211028A0880DA45BEAFDE34E51461919B4A6BB45962BBE6A24E07E8C2C1ADE036E6079755DC3FAEA2EC4290A78C6BDD5A1B67A4FCFE68C813D8F16A601C0E80C3E0F2C619F1AFAFD050AA3A [SHA-512-224] EntropyInput = F7D44498E0D7CFE749833C7BDF3A16809CB467B22DF30F7FB5A7763E69B64EC67EAA3806 EntropyInputReseed = 8268BE026354C36A66C492FBDFE701FF1C41CC960B0431D9 Out = 3685116CD406FDC0DAD3FC66FFBC1404DB38897D488ACC3046BCB13BB23061837C4AF3D744D6CFBA9C9ECDC9CBFE7FE3398D8D4927D6A7DE519203D0787F7618478C0B27AF9564839C81801A9E6E49CF64CFB87027BB78183BBA9E2873DB327C99B149AFE6F1E8E65E5026E822FDE377 EntropyInput = A3A7F0F252A6E25E6E51BC3C5883BFB591F5B22D5866B21BD4CFF5341B1163137C89278A EntropyInputReseed = AF1FC4D4F4EEDB66171C72FFE7F3AECE25BD4B33C18E6455 Out = A69986BE98E662A35EE064A0F2535CFF11D82D17A798A823A020A91A7A26A30D844911685004FF11DDC09F68D257C4D8A797B4BFEC8CFAECAD5EDFDCEA48A5916FAB8B505912E0CA60A31D3A3D5E5501DF640135F68FE28DAA1B8B8253E370A75F73C51749B1A73C4A341D8767B23B09 EntropyInput = 82D982359846849BC39F756673E2E3F8495F45FA1663C7017993667EAD5683F98E674C87 EntropyInputReseed = EC3C23F92AAD6E76D3C6BC062555CF446C0B605134BEA0FD Out = 9855443A870547056D3AA117101E7FC0AC25F534F9B7B3D29AE1A9619ADEACD44F66924E72DFB3EC11CB7E340BFC889D4FF1BC90E055C1D0ADD81305BD0F0C337D2AC451E8FBE7E13EFF6B280817151D093BC4A3E3C5BEB78D6FE6B95FC43FB3CDFA988EC46D05F6871FD018AB9AC532 EntropyInput = 2562791EB75A72A9E1217AA0FA77FA9FB46F1B9C4C164A2A050A1537E26ED3C9DF4F4BAF EntropyInputReseed = 51A28EDA6E78648EEB8DDE238B4246774C2AD4D4656E09FC Out = 33FEDB17E1E149BE1143A5CEF92167CF3F90652C6BD376EF7CF53B963AAC06EFC83972BE472B0119EA7D9AC70273F72EA8A82554722DEC33B764EE9F14EF07E11C106F91222803DE86E910D1BBF100DDC5525929D2B0D8C33313D33B463E514E24D94C35F2E5772B424BC1E8CD803EEB EntropyInput = 3C3439793BD596D44D22E34C5EEB6685CCA6CE8EA2624BEE3B68873ED7805ED6375067A1 EntropyInputReseed = 73CFE8031FB29885A11A8BAFE1A517F6B37D669533090AEC Out = 99122356075FD3F8CA5E6E7F668715CCC0E2F4F24DA5BD6F79CEA7DD5D5C0F23333FD12698A0064925C70CBCDA43B117679060C6780ABF74A7F61AD023885E943D3A270E93D483C1D2C1F784EB01FA0FE5F53FF3FDA24F3295894AD5CA4D8A92BD817F2E9B96927C8E513411F392618D EntropyInput = 5B9E4CEE341BEB52403D282BBC7420D0E1D13BF7000401C0EDA7D2ECB4EDCB87343C01B1 EntropyInputReseed = C4812161B439324B348E46A30808B4CAEC4D72D0E8968C66 Out = 724966740892B86EFAF2C11133B6CC63E8909A9E2A26A62686C8E7575832E2B6C3E63C5EE4FB013B923E6EBE18EA9041588676368D25D690EDB151B10918A9F3B3077266E8BC2837D5CF259AAF3138A1AA4165F0B41FD34F18A1EE99A9E7F335940E27B4C54B032D1B1140E06A74344B EntropyInput = 33F0CD3DB35381EE964CE43F634BA08E65DD259CCB20CF373626170FBCE52409E845EA2A EntropyInputReseed = F2DA284D4D888EA823022D1378D85B14E5741EDEA0A2F609 Out = EDA1449387833389A5113AF509CFF8A6EB79E5E0B3D07006EC66FEBCCB163222B88E9FC2607CEE351EB8191C17C9B65AC8B4F5A2B038E402DA3AAFCD3D3FEDB4231CFF05AD5D639BC49CCC2A257F634BC0380FABD85116F521415D6FB5F9185188CAEC40F22840C9AB9783AA2D60CEA0 EntropyInput = 97624A299C2B4348C4AC162DA2113BE76BB8E5D13813598DEDD8BBBA835F93BA4FBFA9C3 EntropyInputReseed = AD2BE1B482E8B98A3EF7B494045F72C338293A86B758190D Out = DE64BA37DC45CDDF8A719F4239C88538D8B990BF2CAFF51A44E2C61081A72058DC901B418D5EF59F1BB46DC10037B6194EC847FF4002553638BE167A891F15DA7BAC57A5E8CF806A668FD255AB2EB1062BAAB18268EB9057D959A8098A9B8B5003B2F2444A0B1CCC75C36D1764C7039B EntropyInput = E877957BBDAE38FF0041AD46A0C0C16EB4F2F6F74F9CE73E64F71780B10CF2B148C7ECC0 EntropyInputReseed = 1DA0CD0BA75225E90DE4209CD8DDED3065565882A9B093E7 Out = 90163194AFD1492B7FB860E2074BA0BEE38FFFE9CE57B2D52E470AD90413070D2303E387E6057E27DB3D3459D535865DFB9F14E34FEC93439A9E8859B0BE92F4283FE8C93B01AB296666E724F2D007DC2267A1F61094ECF838CFB67B79DCF540DF7079EDEAA3ACF21D0E6F5EFF32B4C3 EntropyInput = 603692F178FD7D789AC8E22810E09E0CE6073E1C588B5A7A925E0A5235A8EA5E0A6AC0B9 EntropyInputReseed = 41A40D58C27BBE9F33E540CF606F439F23BDD253569FA5DF Out = BF0FC245A11874B0C1F47D2E3CE0569E379D0E9F4526816CDC6C23A21E49A23E9B992B37E246F0927E9481AD8A47DD077C04B3732688451A755262F1B35ACB4559E6F0D26D0CED2A0D26274E1DB25DFDB0CCCD7F5613903EC7D439352E713BEC2A0AB743E8C3C279A60232A436D5AC5E EntropyInput = 4F78FABDAB4139205A9E1959583CDC5B5D7187305C74A2F9AF85E0C259516376544582F6 EntropyInputReseed = 3F98C9356B15A1A6927FA0FBC17A76F6AD3922BD5A2F2FA7 Out = 807D5DD2C4789273E339D13A59AD8A4245130052C7579B97847C9100B7BA1E9C79AF79DB41FC9F413A408AB6D2F069BA5F9141CB1AC1FC3B018A59DC5BCA700CE6982F28187120777B7085C5ED3AF05025B8272479503932E302BB26D2C3DFDA332321A37A8BB9BB660310FBC0DE3FFA EntropyInput = F67CBF51A143B1620E73A821715F206F953D60C6491E78784CCEE141A2375BF20704E1F0 EntropyInputReseed = A469EAD290B0FA2A63BBB3990FF628FAE2CEB8F8A95E1019 Out = 54BAA4F5EDFB2C7CCDF6954C86D911635C0C90776748D691F0431C82DC0B61233D1FFF9E45A5B4027218B18BAD43BA395D3BFC3E1B80A546FF94581A440D28C082C809CF2AE951B58DC7A2F05BB85093A0C428EB7812FC8ABB9E0B2226DB8595FCCC3710999B05F5E819D36C2E54FB2A EntropyInput = 0D81ECCD0EB5241DEEE4380424A10A24C1B259AA1A71E1CB722238F4FD94AF3CFA4981E5 EntropyInputReseed = 653A5ED13BA0FC68316B42355642289E56C4651704DC103D Out = 3683D2DF83D981496BB3727815882CD8E684CFFB340F3026BEAEB39448F1B5C3AC20D8252A8DD959808EEC6CC0CF2908489674673D0D76FC47C97FB333AACA787434E7A911EAB4B2FE988B0CAB366777FEE3358F2E43211BB4AC70BCC890B7EBDAA36F92B476E8A6A05BB44F0A4A67CC EntropyInput = D61A310AC09AF6E9608F05AB75EC7F0CBE736A248D4CB39C772E403DD01CC132F575E7F1 EntropyInputReseed = CE7329DFE59F73AC8241FF495EB846E4CC8DC1C16DEFB552 Out = C89D4C57E574BE8E4BA604CB3EACCE903F804A882337C1D779732A7F1612D3D3EBA67DB41FD7044E3D5DB992BB58D17E58FB6117CD74E0422B5D4603AF441D137B84E88501DBDF0880F8BE80C6A2040AB6236C857878A4F489B6C69B86557F4913517380353B983980BAAED2E867F784 EntropyInput = 94C3A2444C51F5FC39DADD15C036121F890C6A721C5836EBE6422C5115957B2C1F49036B EntropyInputReseed = CD2DD220E312ED6076BB35AE102DB398CA9AEE5DB3E3857E Out = 8819785BED31412AA74DB61FB6762B37939E3BDC7FDEE12859BAD695129FCD7047A4F3A8CBE09CB4F68F60F0918F9DCC12946546BE9619648E7D5304E4B3C88E5E736543B7B77A6193ECD00A23E5085247F5F0406D28460C65B3E6F50A0C4A6606A1231BF70C42D5419C1E6659F4F7B9 EntropyInput = B7C14908D25EC532E4373506B86A6AC70911588E7FFC7B717A3E0DFA354D917AAA2F06D6 EntropyInputReseed = 4217128F67AE79B2DEA23B39B4BED313BDDA43A7C6D3F512BB52C530E10BFDFE957053F2325C4C437696332FF171A132 AdditionalInput1 = 4B07A92324753D2179F3C3995A3ED1DCD1A7C561E13352F2 AdditionalInput2 = F37B2B2B4828663D9E7A346782E0E174396679A5BDE965D6 Out = 4D34A5340D4D636201815E22EF5FA1DCB03874A0303C17F263B17043DEFE847A087C53BCE4A700FC99BDB1F7FAFE4215A371C3FBF77E102C8772CCF5E91872628D08E39A747800D87B86ADE7B903F25FAC26BD90DBA8FEDEE70DB5A8512049CD82214B0556D16579E98AFA26E3CF2D82 EntropyInput = 33B778EED11F348A106FD2354384EAAB33DAF4CE2C043B6352998CB0A7FA19DB45FC7181 EntropyInputReseed = 3598152622368ACBCDED7ABEBA24BFF9BBE81F6A362E23BFB442DD2CFB72A21898CAC07787C9A9014BC48BBEE9042B66 AdditionalInput1 = 5E28315D43F91F930B338005EE5C7118310184D0BDEE14BA AdditionalInput2 = 7E89B31054328A08281F31CB317E22084DAA8E53638F4C36 Out = 0108FA7F1806732BF08D8B6D839473B47A2C4A9F8DD97A5569F192DC224F408F036B109F49597FCF931E45616BF04AF589ECBB4787666C5BC10B07102403260ED6FBAD7B0717AD07C4143A5173E2FAFC7DBF5F19F54CB19130637B22733609AC977D8E2107442C144E17FCF2F8CDC6BD EntropyInput = 4B37CDEF69FB585F71BC747ABEE05AC272BB5A2069C676450103794C9626E2605FAEE95B EntropyInputReseed = 51B184CC6F6F4FFC470808774C4C5160860FD1A48BDC9AD5ECF5FDB9A9A5883A6A94A3F13B6AA8452C6DC91F63864D1F AdditionalInput1 = B9A091B70C059D656601ECEEB0BB38119DCDC91459241A5C AdditionalInput2 = 700FAA438F51F3E284AA044566C91FB864C17AB7A6B9EE04 Out = 9B1E5F5635D2004B8A5E67EDBB19BE83EF7DC1597A810BB209BA91937899A5F07B472F084B380FF50C20C504F49501165809F0897655B198605C204D23409FFA4B1E78262BFC77C4D916EED129B5637F2CEF37C82653A592A0DF94547B10F1FC1633D89BF2181F8E98D6F4F0056554A6 EntropyInput = 1302F7537835FB7150372A5052B8A3713B55024AB4C7BC4542CE02E4928B7E077A1F18C5 EntropyInputReseed = 37115D3F6504658630FE018B5547DEC1FB57F1B1A31265104A81D8EBAA252F9DB06CF21299F3AFFC999DC5FDF6CC5377 AdditionalInput1 = 3C3EE9F8D4C518981ABF3B744BF7A246AAD97DF03B2EC98A AdditionalInput2 = 8E922B368344C594C705A28F595ED152F246225E17803550 Out = C4CEF9F5762FB8294AC4547FEEBFB568E87BBD8C10C81684E5A6609CA034CCE533895A905157E391E952963DA5BEE5184BC81A5743F00F7264AF696FB3D1D5B261E5841900CCF1846D9181C7E6D3C6D9A96B679A2C388681B93CA6CEE2A06C702883039E78E5CAFEADBC8F4243E85220 EntropyInput = 6B6F2BCA78DEA2B8EBFD6612CF715D72FED0AC8D01AC7D08C7E29CF03D592952369EC104 EntropyInputReseed = 7797B529827B909567B8B6EB085DFE654DE2AD41B0EAB07A3C43BFE4A4E25167DD402350AAAEFC4AA26BB3697F9DB2DB AdditionalInput1 = 1D6C759849EFB4E815BADD6AE996527623AED03BBE9DC5C0 AdditionalInput2 = E1214B1BA0B2E1CB1077F1792229D96D3AB0E30F3465B04D Out = 47D49FAA88E0DB1E0548ED6D7564B8A6DAAE5523A95B32326BB063F76E804B96856452347B02C383B2807AF0624573DA99FD6FCFF1D4C3509242A5F984917177B49EF81E73D8F4CB8D8EC3D0D8DA59FB054FA7F842A250E007ADEB821A4442F8F0AE5F5B0D7C148B2ED6D84855451ABD EntropyInput = A070FEE3846B3C12A40C322C912995B1643F8403DE115037873FE912135E109D1522A8D0 EntropyInputReseed = 22B15F03CF3E4A95C14393E4C26EBEF7CF58E9B3D65EF40CA7E0259152D72FDA9359CA61E11DA9A1308169E238ADB462 AdditionalInput1 = 2095A53A0E44D9764CF3FEBBAA8B87A9358D36FE74BC1DA0 AdditionalInput2 = 5DA20FE2927A82382B64D317B77627F1E377D996A276E88F Out = 722176148B18FF52D91587E66E57259EDBECD30001F463282BAC9FBFFD41C8FBC18AE456EB54B52A53AFE8E71A8EBB5FF8A8EB2BB825EDA55C861F6FFFB7E1A7D173804FB8F8510CE121BE72CD0AB1DF2845AC1C95B557360EA4ED198B27C15865E202A0BCB8A878AAC72A2499598FF2 EntropyInput = 8BC9D8E5B65C5B10057CF1DF4BF0AC0D1392A59D4B0B3BA22D9B20B5478190F68C438E74 EntropyInputReseed = 9D0C35B5580125E923FCBA4B8CD89DEF00B49002F7DAAE3D31BC4462AC1A92768AFC40D0AE40D1E860A550F3B8BF06C2 AdditionalInput1 = 7A696088DB1CCD7BBBF386067E1181C9A56A24CEC69FCE9E AdditionalInput2 = E0D78C96ED68C1A57A8BD60BBD23219D4811C26FBD427BFC Out = 916B21FF44499598B81F11B9261B859A84F76A1D4DCAF2CD7B0619446BC8B89B6BBDF2FD0A2CDEF34F7E1044D34883EC7B0CAB27D4A01F2208E625139F9F18340489821C86B1EF561E3659991E6030FFA53F810E77CB05E053BC209429A7A73D9572C6A528DCE54B58DF6CB41201BA8A EntropyInput = 8CAD80FDFEB660ADAEA12F6B09E3454680BFAD8AA7A9BA1BDED4A0C1A017730C3677391D EntropyInputReseed = 4109CC7211B68EE24ADADCF40679145C164E4ABA4DFA717864738EFDEFF8A3A149C9EF48B9E16918E22B5400E2957570 AdditionalInput1 = 30C27E7AE705F67C0BD5ADA11503E25DB0EF0898107D8051 AdditionalInput2 = 158F55A7B2C6BB7E03606A70BDD0EDB68EF314FD8CD5A0ED Out = 497B75ABA8CF1710154AEDB1A837E71FEA9A3926641244E8B01B4015492C15229F264A0F27BA405B2EBA89340FCB0E1D3C0D97DC7C9F2A0695106AD670FD0A65F2B074D00E7FEB439A15420D6ED91D433B7BA32E38C75E4BA56E8DFEDE7852442AB6221D2D82C52C6A3586AD80E59D1C EntropyInput = 1DA94740C53A21DF0BFD5C242F2FEF1ED58F86EE8FF3D4E5E6F28E99BB09E5F7595C7D5D EntropyInputReseed = BC72D8A1E34562BFB79887B88F160ACC96167B27BD5449BC77B92F92520FA0DE5F9A37ED2AAC64DA2C9AF9527C455F5B AdditionalInput1 = 93453F9FE3016DADCD0C82647BA413961D7FD57AA44B554C AdditionalInput2 = 2DD645EFED1EE6ABC4AE84F4C8F63620408E1674CE479178 Out = F416821368CCD733650F7BEAB4B89EF6487E1531AF06BCECB705A4C8B466DF142A1E234270E41B127282603823170F5420BB5A1FA9906B259BAFAE3D2A62046A3964E2D45254497B1C110E3CABD26267B554D064268556DF36BD43C5B2D834C1932991208C263CFBE89E7F14CC342783 EntropyInput = BFA08D23CEDB562A942E3B98F2E85A9395CED12C94E62384B7956E5F3FDCAC12F6CCF090 EntropyInputReseed = 8D5E60B60955E10E940FE50EE3CFBE2C01935A9D2D470F1BFE96AEE4CE4D591897367BBF69A8564AF4DCF5BC870F0D86 AdditionalInput1 = 78635A66AB4696F60F0ED6BD1CB9A43267713B3AD311867A AdditionalInput2 = 1FE7FB636C75D64997E8A78156EAF658D7F6FC655E65EAB8 Out = EB40D5C4EACC95B7EEAF94EFBF83F1D17D3BFE7639947D11E7955296BD5B06B84AC3CCB5C50E0BD9D621B1EBEEAF718E7DB01F4ED2C54EF9817FA2185458B7D4DD197B713E068B46299D69983FCB099966AE327EDFC6CBE8F47982D5908E7598A35FDA8ACFC828589EE1282BD63BB586 EntropyInput = B75683FBEB8D98295AEEDA4C4AEAB71150F370F0B787D57CDFD65DB0DA58A0424BE41C12 EntropyInputReseed = D10F7AAED67603B7C4AE79111BE9661539888FE4FA8BD6DE024A79C9D1FB59DA6C1222ADD4A67802BB85790F97A4BB10 AdditionalInput1 = 1376D08136ECC96B50E3BB1637608F65AB5FDF965BE5FC3A AdditionalInput2 = B92448A06076FE727078D4119F77FFD0F92A1FDC0F63E2A1 Out = 5A269D107F6C1A456135E577F7E90784EFF662607EF396204F5BE1432F12DCA012D35F155D303A36D48A904200AA8F6510E01474585C60A8DF1F5968E6DF3CB12BCBA67C9C813B7834B2C3EDF314212332335C141BDD2B64B46BE0B0A2C8E6FD6928C2C1F5776EA112C1B5B9D64D0262 EntropyInput = 1B4ADE20DB78BA10EB5C167283CE796C1BBA5253C48059A02C081DE4D028C58EF1C4A50E EntropyInputReseed = A57533A807C6CA794D504C414B237A2B473DC0DAE4B439EBEAF6E4E35BD1DC3289A1CFD5AE4B52003F4B1079F1A66E7A AdditionalInput1 = 5EEAE28922ED7E961F5F115BE3E83A0E8B09F6FFFAF6C97D AdditionalInput2 = C1D076EEB04310CC74416E550B007C2B6FF80810CF1CDD93 Out = DF9CD1B291C67FE246D3F81B2F896CB7CED29D7701D08FB74717F6696DB874615AC9D4076EC05CECB86060BD722419B2C74E637EC0C1FBC11444C6FDE8CE310755AA624C44BA7B89D2EE68CBE5128FA812A50B6D01CFFA08EFAC59CCB913E993D94C93C35D5C1D9D88E19CC17FABEE1F EntropyInput = 6008A35E1DA1C88D9B3ED5CBAF6B9CC73C9D85784A7CEC561B5509ECAF1CF81D41DCB2DF EntropyInputReseed = 939655C44231F6F88829763B3BAC64D1287E8873CF28A62689162CA09DBCF47102D853B0663EB32865E6F1DA03716FC8 AdditionalInput1 = 884A90B48CCB4E2F238C452FC5F533681EFCA351FEE4D44C AdditionalInput2 = A6AF8A8E2668D6E57697CA27F513F38AA57A86317C0F1047 Out = 458EA9125418DBC176DB2A3FA80E732B2738B63DD813BA1BA39D5025F483DC33F0E25FD4741CBA81262000B4DDE5EDD352A9013FAF3EB0DD4FBF7A954FFFCEC5B61A1459E822CFEF5E851251F80A7FB840E38931C6B15F07E9C08D05CE8FDDE42F1369926EF602AA4D48A40B986D6FEA EntropyInput = D0C4696ECE0FC5A8340C5F3C155411DE58BFFA2F7912097FEB3F963DEF468F36E2B9636F EntropyInputReseed = BC444E2CFF5BAD6B3DDF4067AF5D73A5F74584553F5D533941A903B853717191C636D242D95E7FF0BC16763AE9D225DD AdditionalInput1 = 05F9A38BC6E748DB3A7A45ED0F82A023C4C45B4CFD9234CE AdditionalInput2 = 8E10D90892B480FBC58C525A3A3033C25E7FBDC1631BB841 Out = 6D1342D0E9874DD83F220AE6582413D834FA71D735DE8B83E51D7D4E3AA4C6B11A8EDBD9E0B7BB5CA2C6C68310856F7703324F88B0408115167DDA6DEB529E533343629C9519FBBCB78344049B6BD82771D7B4D4BCBFC052F96DD5CC90FBBF2501B69FD97EF36AC087C8BB186E86330E EntropyInput = C1B77DD5FA7957F168FA634B4D49951ECDA045F49D54AA6EE2877FA3588BE7C04AACB190 EntropyInputReseed = 9EC529738D95201B863A487EA9EA8CF0C234B1EC5B16C7F47128C667E650167EB526E0D5AC029355282AD763742BE42C AdditionalInput1 = A5BDBD6B4A3011FD773891734503A556E8ED4E62358C1E9D AdditionalInput2 = FF0FD7E55B4D30ABE8DB5F82A9046C591050177BEB49F840 Out = E09DBD934A8006C2EA31AF175567C6C9E759B3C206FE85D59C26E2164C6827ED78AAA719CD0F5487E3D42D3CBCB8AC8C75B3EFDA17642CCD793E0F6F8EF64EED465FF756120E51D5683334059F012DBD6AE47E6D4F7CDC441FF91F09ED72643E479F3DCAF4B0BA78671CB807EBAA2138 EntropyInput = AF3724DEDB96BAA866254636DFA1860F94D4DA5793F935CFE5E248A00115768701CFF6CD9E91007FBCA95734457EFD543314C1DCEE39A8C124209104 EntropyInputReseed = D44012848FE190D13DD7831D3E3D68B9D0C67E352DF0D983 Out = 1D95B04060FC94D6D4BCBF9F2066488CCDDC246CD5594693D8414FD148CA4BC43972717E6474C71ED9F0302F28B6D7A4B362AFB97F0022896EAB9C274EA9F829EAC949B89E9BEC32A00BD9CCB158DA3C160247942E60DA2F259752B3291EE88E018CF0CF99E02FBFA71C520B05BC8262 EntropyInput = CFB0A929DBABCFA3A25E46161FAEE1DA789F2C30B1A9D274081D35EBA7956B4D3C12BA6F74392C3BC983B4F524109D5A5EDB0C7C70D10E87EFEF9D16 EntropyInputReseed = 721ACF85740D9FC2D7BC391ED4032954553E65841409FEC8 Out = B262B3F727D49EAD2B94F658CB877DE5565105C07CC532C1E4416A03893FE0A2FD4507F2088BCB3CB63486219304E30B290A564AA3E216A88ACF3093D78E03DDBC4EB795AB07D40EEAAFCCE7D0A4A23AD97B0B2F92F8357CFA578DDC292A7E9308DC53AA9733035ACEBEAA0B9FF6DF3C EntropyInput = DAD51D08CA7427C5672B9578BCFF1F6F75C6D39DE43E7A12E625A8FDF613479BE2D26915CF5E7F572101D6E792206E4D8DF007C3C2B9AD18C9F73CD6 EntropyInputReseed = EB86C97B338239460206EA055B05727CEE6FDACCF6BDD206 Out = 832596D19E5EDA13871A9849F230950462F4DFD132A3776D232784FCDA70A17E889EAE37DA9F633C67E470F8BCBD87058992E1FAF61A56DAAED78B93150C94163D933D0334A692ECF48DB7742538329F1C7B8F8177EBD6EC5848B80D1085E93E5BB9CCADA62C931563671550A581B869 EntropyInput = 8D204C28FD22DBD9833889F23B1863F35269FC16DE913887118E2C23CE26C80BEDD60842BDD5B9CE73E89F93C2753C82D87B126E38524AC1A8DD2E6E EntropyInputReseed = C3A175FFB398DF5EB82EA70732DB0671A6F822B47B3ECF95 Out = 0F924A732C1E9B38CF86C8695F82B33AFEFFBB56B30FB7D378F460A6A371554F13E9495C23781F1162D62994F78DE53D9A2A35B09C5C8354C0A0FC8F29B938E62FDEC39D2ED31C405A466C3C82FB876BF4F4CAC279E8AA54A4A23AFD4607C7E46681A0269B49D35D37D6F09D9682BB35 EntropyInput = 53A05A005031E836BF8144C79C37DB1096C6054544284EE103A9289193509F2F54BFD1D099E4595073D9D48D5C2A77DD0F931FF0715F82E30A7AB739 EntropyInputReseed = A53BABA860103F4BAC645181F4D7258C6D94F5D017BBF4DE Out = 60131D94E70F84FB72DC7FF836928E208CFC489C56A551F3F10F4933D1C7A633B2A102CAC3814B2B92DF48287BC8C5FF6ADE3C0E0E5211B50C2EEDA7527189156F9CC020A994F05DA92A1AF7482A135CA29540CDBAFDB8D74ACAFF7421A8C638FF693322CBD638F0AD32CDC7FCA60294 EntropyInput = 8A0A2A4BC1F1F7D5FBDC2E4CD9DC732F3279F6F0FBABAD15EE4B802551C91201FF5106B912B3E4E88B47902CDC02CD1A7C23AD7E8201208EBF81982A EntropyInputReseed = 19A179B0C381E4D7A88BB0D7C66F388B66A118496B389ABB Out = 7507DA729F37F8FAC040E028650AD615766BC06832CB0ED76619EDBE454552CB2357CA127B299EAA5CFA973E80D76EDC9206EF5C35811734CD2E0C3E5A2E6958FFF8CD072D04801AB6AADD8E2EDE691638513811115AB973E7092881D9680D04B2A32F410662D9C91B0B750BAAB71162 EntropyInput = D92A614D3DB7395E1B9FBD3B7ED532464A348F8B951E702BA77D6AB3ADF789D04058002D97967A3C2A1741A6BAC1CA5B189C86B71A418B54343B8276 EntropyInputReseed = EC6E872C9F673F60449B3093AB2217BC750D5790D3C04ED6 Out = 10431BDA9CA4C81B57D4EBAB7611A3E7D7D3EF30F3496813B1358D7D0ED52FE3F549CBC671743CBBB77E4FA6E443086CD3E6B5EEFEAC9571EADF387FBEBCE929B401115D82C1818DF78E95E3FF13C30F1F832C70BE6B36BDD0B904BEFF39C5D5F80AAFB55EEC22D7D80E5A09293A4849 EntropyInput = 2346333810BAACCFEA1ED44950B4DD63462AD39AD68D05538C7B1EFB2408FE6485E3C63BEAC2E4FB18D3BA844CABA12E5236DD732DCB58EB533906EE EntropyInputReseed = 16F18D0C02D420FCF79988DC7C8110A37FFBBEEC654B731D Out = D0C133B0F1B8F23B2661D3A14134B2C5702C901A9CEC44D4544CD8FA00A2355420B6EE24E9D376D6422A10A9D4EF5F1C56844CB73845A478A0ADDB0AA418BA2E4B8F4C8D5516BB0DDB021E519C86CE08D4F0DCF7F05CD87FBBEE789EC311F296F48DA9A22DFB58DD872B98F5F42096C4 EntropyInput = 890B071CA124A81DB69E17A0646BC3A83806B75F05885CB5814D4B54D20649AA763D6B01F17FB2C7B79AD3045E48D04A1BD2F7F2B26A29F971F92C06 EntropyInputReseed = 9EE8DAEAF369D9A9A47F7E8FE21D37E5076E2BF098E1FB65 Out = 5F2AE5D775EA8C6E5E756E48CD8B024724135B283DD770A332D31F8D45FC4251ABDD400C8C061CED93024E541FAF3AD165A237DC241EA30781072E1DC5DF2378FB272BCC3D2FA122E98082E656FBCB864188B3C851CFFEDB8C4DC0F6A1D71C435FB4B1D819272729551F9939FE9B1444 EntropyInput = 29E8371250C8F32A560FB3D2F496A662735D1DF9D7AF2FB745EABC26BD11B90A1C542BC49EA4C1082FDF353CB100D3052C270D2FCD754AEFE9A5356E EntropyInputReseed = D96BA80D097F65A40B7AA4BB94696E6274D48441E736B1D4 Out = DCE6B9D07A76CD9155BDB2E12C6D2287EE18E5BE4B7AE5344404F9C495F85FF5E22C995F66D36B2D52DDCB0D8F86795F6DF0F2B2DA4B2882FC0EF3B0EE5983FF5D90A40262D2591104EEB52722CB8028C844A2D294B841ACB217283A72F66C63275F3DCFB5D7193456A2AF01F16490C5 EntropyInput = C520505FF58B2A4B9ED0A7BA5EC9F23A3621EF3A84AEED26FB492210F50076FB2873AC416759028254383317311785EEC05AE974CE170FFEF0AAAE93 EntropyInputReseed = 9892CC302132659F094A028774C6BD4D4053C5EACF368426 Out = B53E960DCA900D2CF821C0065EA1226B90D35299279FD0364A98D99E5CECC94E63855415D7FD9A2F7411DA0318AC905533168CEE6D702AFE8618B94D3C0CA93C7E8AF5C6E0ADBB4C352A3D7836D5ED58C6D6A23F06617562C430113525D1D6730048770DB9AE7206D6803C2FAAAB59C4 EntropyInput = 2C0525C3D798DEBC50F136F9D9E688373FAA995BE0BA0F26D21A9186ABFF64971CD7CE8CA048D35CA4F61DEB53D79C375AAB61D64B83A8AA29367695 EntropyInputReseed = F2EF3951CBD04BB1FE12BB93BB8103F965EE41A58B9415D9 Out = 59EDCA3A9D023D5C3887FCB0ABF7EAC7D79AF824952F9757790F0B38787014CA5AE626CD1FCA80BBCCD8832570FAC1738074903BCEA4953256E9C6FD1AB83019B4993B358403D1AB74DF2A2EFE0378FF1595F681A70B4C15C68FC5819AA7B910C49FD1A28F0B4E277517DDD8495E6523 EntropyInput = AC04E2AC56C3ACFF4AFCC0AA54FCA967E4B5B3D1F9ED5EABB064A3B03BCAF8180C9325AE5AEB428DDB86B233B03FBA7F0AE6DB0E33291E2A27DB0459 EntropyInputReseed = EA599B347AA79179262C7B3E44201258D68E8A454E274EF5 Out = 9EFEC3D7457EFC367CC603300985FA2562EB901C69F76C29D99EAB6B589F2F41701C5F105CF5DAB7941B1A7C41B5F179CA1922D38BEA62AF7FF624CF7B9D2B1C3E95822C5D6056FB73F81EC71CD1C845E6885DC9F8E9AC406678F2CD0AF69B05DC137F7921BDD85BFCBEE30367E86F08 EntropyInput = 9811568838BECC2B5E8AA50BB212F66ECE1A95B459B572454D5A1D1EE96FBCF83EA8BB5B75AD0451497780CDB66F5A34E75EC8C32380014F229FE832 EntropyInputReseed = 179987EADA2A9CCC728D93CBB6E49BAC73514C0AD436ECE2 Out = 4E90BF1B1E02ABBCEB590308E740B550D1FA68798A69289CD317A5672BA0CE7C8984DC25598D4A55629B757ABC7A2EE405121CE892B615BBE7C4FEC431A394D78DF8E54CAFF7EFD986D71F567457F13C0919EF6D186EC3F6C5F48CF04E5EC43DD1A34E62BD9D40C83C90790F9F072665 EntropyInput = 17ED2E4C148387E3C7092A83AA560D3A4A35413C1AF8FB978D45A02291FC7F2DA3AA603CF36C0C17BC7A2E00FD3B14D336695C0DCB60CE8D1F223F54 EntropyInputReseed = A3887D13B63F35151017C848394FD1407F7071D30F60880D Out = 05384E51FABA66F8CA68354D55517F63FD8F954468909ED6A05E8F7320E34348B2875C166F2EBB14F4582B3570DA3A9B88934865EBE1A833C35773B50B16DBC816518BB2455F41FE2BC43D5B6FC8BB31C4B164A63FA870229DA46D27BABD310CCD9833C206A12560958E1EBBFE3EED1B EntropyInput = 49B3828D3A3791DAABA183FC6191B539D69CB23F7EAFDA1151B5EF025A0A815DE8F7B3FAE2FA4DF4ED742C618FFF06381B62130C0BA50FA1E037DE09 EntropyInputReseed = 117455D054CE5EB15D005B66DE39EF4B6AF811C1BD3C4F1CCFBE003DB17375D41A1EDFA4ECE9DB28A2A9AD9349975B2B AdditionalInput1 = 243851300D4D16F530C316F705C86136763C245C564B8BDD AdditionalInput2 = 96C4183E8BD01A25B8054917927EDE7C5C5746A38C8BC62B Out = 29BAF90E03114BB4AE61EFF71209617FFE7D36A9FC1DB52A3703AE041CA05E87DF8D94A3B161B71876D5784D4CDA810CEA69C58E3EB897680D19C9B6E8F507D931CB0E60472282DB39BCD44167037A72CA11107AB1C44F2559E0C653CB530675CA511F87D761CDDF2B04C0FBFCCBE2FF EntropyInput = 4952889BD2ADA06F00EFC9B6C506E1897ED5B5C20C2351644B052ECB64C85B4F3D0EED5C4CD87AB831649A0530D5EE7AA37A9D915CB5C91D670F8891 EntropyInputReseed = C1925F2AE881B2AB83C6A5D7F9FE60E394DF3791F42CF77D9743F5807A5379C1F7E7BCA2F6F28442C0CE7531ECC3E8E0 AdditionalInput1 = 60056421F4377D0DD5D65A592CE9491278D1B6DB828DA241 AdditionalInput2 = 0B1D20F6DB304853E8D8D1DFBCF03FC32D133D546E78E64A Out = 45C38347CDB54DDBD408A6A739C51D20BFCE02DF8B51C632E5192ECBA43008C3B71122F3C094B636A0F5334D2DA1B04BC6B4B2669B9A410D931795CD71C333DB44D32BF1CF7C7353630A5969BAD212CA2DB6A1F1331058545B4D8186EF72A344AFD6B80DC44EC8F1B4AFD0138B3B936B EntropyInput = 2400948D0953140623387604309375A91CAB6C3C6DFB8C8A6ADA879B6D97ADF2358C5DA795D772AD2EF0D0A060632E009B5F9B2112C9503833A55253 EntropyInputReseed = E76139CE7B78F16EE76AD065D8319F311A58066E9208784ADE6A4666569F7591548AE0B66967A8741EC1B68CC035C438 AdditionalInput1 = E5F373960312B565AEC7E61098D090757D85A6BDE4B93F7C AdditionalInput2 = 362DEB6D6839FD8E5E9D41278DF443E35B8D54928DEE59BB Out = E9F02297D5F370053EF13B4A02DCA5A95E0F59A5EFF60A37F2FAFC57F0770E6547152CB2D276BB92DC603ECD1576ADE92BF367B57B396D201276655969234BB7896CCAEB678274693F7959A8E5AF1B3E0008BBDEDBE84BDCBD65671C68078FD8081868450334CD81A65EA24CF22D8A51 EntropyInput = 987DF22FBB1A47C86B25DE831B5EF61628CFFC325E64A577E3ED2B3B14F304EE557BDAE10D40BB435285AB5A33DA4B4C155E5E610D55765390C25CAF EntropyInputReseed = 0F5CBCBA97722D6D52D071226D237145616F64E37885AB60941910E0C9C486434580ABF32B8D02D2B43BF5ADB6DA6B71 AdditionalInput1 = F07F61DC6519F8C39888D5943B6B364408E718C590505C9B AdditionalInput2 = 6A14448C9CDC9A5226C6EABF0D59EC6A6B7736A24D5049A3 Out = 38C9A0312CB69AFB0D609C8263E154A406FE5D4CA38E513DDB1E70083EECE28D3F35C63E25FBF0EE3FF39F3F1A1D2371FC574C5FB689B6BFF285D849FECE9C678515BCCE4426A1A1C8B2BB44B01216B2C68F85307E948C16F99EAEA6C3D2D609E39FB232037A60D0789CCE7AEC1EA6D5 EntropyInput = 1048BD7FC77A36393B337D64C01E7D97B86A0F4CCF7F80288DAB09C43B448A7F2B6807CC8ED870652B4EFC2C0FB6506999AFD70FBC6A6B83A7824772 EntropyInputReseed = 5BAE1BCA1EDA42149C0F49E1B779ACE6637C8E4B636F0AC0D06B7D24A5B1C68A0D4F47A81849BBF8C678C47DC42AF0B0 AdditionalInput1 = F6F3E54042EADA861E23F711867702D2CB03A950A321E4F2 AdditionalInput2 = C79316BB3D31445BBDD15F2387C57AC466D45956D63D2DAA Out = FFE06C74544134B13C710978F01D8B60BCDE274C9464D2B92F68F03B7F3853A76896BF6DCC7AD09ED41E31BA26E634A1A48FA1DE0DDC21466B1BA667096649817C7D2E31C13873B07CE8EA7CDA4D7C5A63F3249A07D2BE7ACF4248FC1FEB9CF11DE7529698EA9BF09B749579848A556C EntropyInput = 41438D8BCF066DB21183DE7163FA0795EA6CB1D7E748CB74353FBCB9C585D4A41EDFAFB9FBFD6085092195A2B1973761401CAEB16744AF6115F6E0CE EntropyInputReseed = 45862EF1165CD645010FA0F157451219DBF740D5EA60C3EDB8A41FEB519221826399AC0D2C865C96557C38F045A1893C AdditionalInput1 = BEB12996D6D64E7A46F712E42410D1EC8AE975213F7B37AB AdditionalInput2 = EA4A60054F6B483276D11269C9E67F4914C993FF63E1D6AA Out = 2A8DDB0C8CDB3837C80CE1B9CD37280E8D2190D60FD175C466E89E91BB369217F31EBECAF718A8685CC71A782494648A70E1E22EE3948D223D20D81924CD5FDE826F4054B953D4F342D2479DD2316BA4D43C6E121C2C94C68AB4612674DDEF3AE315B8FE643179F67D56DD5454797C9C EntropyInput = 10DFB97E42DDC0335C5BC1E0BDC9946C9981A79C93C2E7BC6D77DE8F8ED3F8D0922676A1EE154A5CC5D13C219A09C1612B8FDB0C806EFABFF147DF3D EntropyInputReseed = 917B6DD74DFDDD35D1A39C76B709520A3A3868994950C80646CD4FF692092A3972F6F94D0987F741C2E9AB876BCF1F09 AdditionalInput1 = 11631E48C7C81649668FD45DBE612AFD70BE64CC9A511EBA AdditionalInput2 = AF282B50BE2121512D44E7540396A7B76093176070C3F843 Out = 2D516DCDDF579CB408408FF44A5CDA00DE601CC2F39FC59FABBCADF694236BEB8F0C564239B6FA4A1F7C109C7F381077CA026C568E03575954AB9815D799A4A4728CB1EBCF593F79530E7B65A7008846E59180FB38C6270003AF9385CA00C7C0EBF48745BD3C69B438EFFE382D620AE5 EntropyInput = 45BB3E34EB1E099A1E49779D8C43AE7B5D1B0926D827F704D39DD79D6B6E5E9971A2A5A2C19E7D1E714AB7A688B9DB1FE2EF8EAD6C9EB4FE843F3F7F EntropyInputReseed = 697F596D8FB3B7929C613B95A512F7E55E279912688AE6EC3B6938B4E7B4770D3AC1FF18D58146AFE4A46F9F8A32339A AdditionalInput1 = 4C91D2D7B09EC655D3E5D20978D23F7D00409410371C2872 AdditionalInput2 = D687C28A7A6732B74F796557C753478DACCF388F440F93AD Out = F4604ED31D387F8F5CD6B2FEA1B402C09E60063D3028D8C693343B6E92C9369C00E0A9C3445FDD15C986B94784E744188A7816067FB36439252F7001F610B748F875BD28533802AC661F7501F41368A91BED94AA5A79026AE1B3BF96D199B24317C271F58495555A2C60C38496B78AD4 EntropyInput = 39CCAD173BE1B054FA77C5C372B55BE3D1302511CCCB459727D64E8C1FAECF6C99F907DFFCBD05B3902A40DCC72F3D04E2DC0ECFD691EE87F7EC5FBD EntropyInputReseed = 56604742F2B193D5F8040F9914B7F9277DC4238B1690A48D81F18C0FA49281DB6728780A69106B2EBE41DE8F3C526248 AdditionalInput1 = 9867AD2E0139C3706D6E11E8CB5E67C418433DDCD24E61E8 AdditionalInput2 = 767FF3099348C7EFCFF4957473BC0A2E6CAFF2FBC5031A91 Out = 43F5E497DEA0ACD6E2E2AAB59034A6F71DA82ABD9461686E96A551D32F480A908A8DFE312C7AF564B152D77B05596407D177EF5CF2751A707EC80B82E25FF44C73CDBEDA7729B234C4E728D0B0152783A1A770841D5096814ADCA27B8E4D1C2EF0BCB4370C28F913742362A2EE403DD2 EntropyInput = 61DF1740C38E8C9CAA0852CC6BA866BF9DB0EAF882825635C5C1166C9A868C68AF1EEBA28E623A22207C9D5EE823B0DA3A81768C9E0241C108091F53 EntropyInputReseed = C4211F3F53D445E62C752F3EFC96E6A13BB2AEDAD5BA50F4E0503884F5AB14FBDDCCEABE042A84371A842CBD3C0BFD2A AdditionalInput1 = 2DF76C736E4C6A1705505BB9BFABA504AD2DB969E2C2BEF1 AdditionalInput2 = C50C6F864965AA508A9442563D48AC6891360F30C8077F5E Out = 09B64FB869CD9E0DAA7AB948D668E8EC46060DA5E47096EF4F5F2D9B4614C8EE91261F50C04B185D04BDEE5E27DB209CEECFE083DC8904203EEA9B25F3A6DC25B555638D73331A841C8C027A1A489B5EF6D6BD383CC0EEBA41EB56FE0D260D8934DDC5D22CC8BEF66AB97021DD2B72A6 EntropyInput = 462ACDE1AC157B370DF10D20A6A0D09CC635DA4E3F185F0AE53E506FCBC9E9B9CBF7E8C862926F1E10774CEE0826B4EE5B50CC897FDDB4FDB92C9FCF EntropyInputReseed = C2C75CA73384FC619160F1B9A7A3ECDE1E6300DD4FCA3194ECEDA7915784A93D186ECCD47628242DEB36DCCB5E6A80E3 AdditionalInput1 = 59490A40BD6861B5B6D31DA90B0D4582FC030A11705892BF AdditionalInput2 = 8158E79BE5C97D8B46AE82331DC37AF536F3942F631D3D37 Out = A2F9EB80866BF1D60177256923FED1ACE183DA5A4B07420A9E72BCE9174993D99F6A3D78926A8804EA1AF9D155BFDA9D50527323FC68B2DC37DB73A69E818E120D4812635365D15123656206F7622A4919F881EF9A9CD3E26C68F50ADE0AA6C77F33628171A14234B94A4B096C384228 EntropyInput = 5516A172EF5480CDF6A0D401D3D189CE1F38E281446B090ACBCEEA597DF111E186D69EEAF4BF21D9DC52E652AAB3478805AC0705C17815A585E20F39 EntropyInputReseed = 1F509780F0D298E85B4490560405506F0CA77CE6C1948494632824E909DDCD0D0464299B25D7E33C927E40C0EA8A2FBA AdditionalInput1 = 07BA8CEF46AA691D5495F6FDDD1D741F7454152AFC7A0831 AdditionalInput2 = 3598965CA74FB78738E3C8A29BF1AD73119AB8C38FD44DAD Out = 243EC27E8A8C7DD0A0135A76969D1B684D7111393D948B5DE59C9A790E91DBC94E7D414FF7508274B1353487396B2B8F23739A3A01A6453627A2AF43F2DBACF1F13698FFC50CEF55D7240EC050A1080B691865DE06CEC22440029B3BBB73B335613E8EE5CAFD5210EC6CA7CC23B14489 EntropyInput = EE62500843F90F45786E72AAD13B28EA032F102B5A2DDB1EFBBD89231D5E640EE329E5A1BB70F83C7BADD341A202853F3DA2BFFABCB3D894F061BEA3 EntropyInputReseed = 80FAE685527888A94258CF0DC322F443E45A353545D21A58BA18AFB540E841CAFF44DB42F9A382AE621EA30C81939B85 AdditionalInput1 = 9465F9CA7200A961BBA2231923B1955EBC9F250B38965F40 AdditionalInput2 = 5FF0D50F64DCA4FE4043608FD7A5767001FEC09A37BB3428 Out = CEE1B99C94AB78298BFFB4F6E6C928AC5D4D3EBC64DBCFDDAC545C40F71B520DDCF214080DB9E85D7A57DF6AF4325514DFCBACC105CB84B11C98878546297434245626F7F4B0C4C6E94343ECCC28601B45A0E8D8AB5422C3096142D5AFA225724705845CD7248F8E5E255F36359A04FC EntropyInput = 35E3F4AFD35CCC19979D7F910B4A25FC6EEECB9669DA2527D1284D17A3EA856DFEBBC865FC8A2354106970921C4D81EC9051EB20EA0873920EBCA624 EntropyInputReseed = 214F85E88EC657D8BB030D3B0BCDACA63880007A3A87636B1EE4D6685DDE9D29BA08E701255C4B7B1602A60BF489FECA AdditionalInput1 = F584629E0DFB26AF2075500208D72C97F54EBF100E939446 AdditionalInput2 = 992CA90F9738E1FEB604AE2390AAA75F19F55CBE3DD119A7 Out = AA4B0F511AAEC2C66DF15EBE8247D3B1D5A4D4C46A4DBEF84560450209E05F4D7B6004721789AC2E89F02B008AAFBE6F8E00AC2D3004CCF1743E169520832847CDDA1214ABE117FBA23165530E8ECAA76B38547D808FDE32CA17E53276044649B724DA79BA71E4613D6CC0A9539AC204 EntropyInput = 4E7F347F5BB041F85685B67D2CDFCA77CA707F815AC8CE4CBF21B10D43BD7F5116417461DFDC8F45BBD4BAE50EA3F2685DE837C8F57B483F06513A62 EntropyInputReseed = 71EB7C6B5C4775F006A184E5C556288C812429D28E0AD3E7DBE29882C22BE59D5E255C8F583258ACEF52A369C9275654 AdditionalInput1 = FFBE30849889B896ABCCA991442D5CFD8327B2F6C112BAF3 AdditionalInput2 = 5153B38E3D50E697B67FB80676C24DA1A53FE39C53AD1691 Out = 81435661E69572A912A784C113D3133D41AE98DE4388D277EC15DB139224791F6BEB1776A3FA9B685F82BC38F96656A98635BC57D2AF6F03456ADA9A7422F1E629C3B7F7F971FCCE804701421CB9B5DC6FD53074AE7BE0D325B0C98E743DB0B12B326712FC9C37B3F9559303233F7ECB EntropyInput = E3EBEE65EC7D3848E93D85553F2A5D85E705D9E14280EB96013546BA12C7204B3166BD51 EntropyInputReseed = 5B9EE56BE35A328F3A0B21462E2B682D9A9994B1495D9155 Out = 66B2AC1B632A32AC6A06255191BEE8D5C7F70A2F6981B2289D0C79EACEC8CFE51DE0092F044197C289A21A51C43300DA4975810178631AA2E2872AF136768DB61303D27421EA7B9059C0160B69334602851A501C249FD53BCEB85308CD99C44AA6DB9E199F31F842A3CFB0A63447408F EntropyInput = 5C97ECEF2FBF898A5CB67A9F85707BF9CC4381292B52AAE8C8C4D6CD480F7AD356A69AB1 EntropyInputReseed = 1D8528CA6CB47782706EFF8E355ADA3E0F108CAE0444FBEA Out = 414EBA3F8B1B71E9BF53D96EF37FB6436BFD2DCA49C860081C52BA33BBC000709FE850F168385779EF44CE70DE7D038FE30918F537886386EB11337659D6897CAF0FDA1240EAE055B83EFD1014E98B3DD0F6B2FE4BB144E217D4E37194256BC4A029B447AF9FF0F3B69A4A0B49AC4812 EntropyInput = FB37D988EDB697D2EF82EC279664C509DDA06159EE5D81CCDC7488E5843B5432ECBF36FC EntropyInputReseed = FF7C7E94DF1468D8CB395C4A490C8B396F38404157DF5336 Out = 0DC950079511992C4C78105805FAA615AC37E8F105C0F48519C3966BE7DA4FBBFEC6A539FC5D84B001EB08DA4741B553E6C6C46351D6981C7795DFA5628A7F0DC105CDD8B1FC93BCFCB32F126D2B05721F7FF9E02361FF071B4E37CACF359478867AFC97B25737AF8E36017EB31B9343 EntropyInput = 4DB96E0175D8ECD0520C2CDB9735C4D8D12BFD2D380108A8FC59B332708611B103D69D07 EntropyInputReseed = 91C54C74CDA0A7BC0396C3B353F672270684D473420C6C7A Out = CD483A02C7C9A982982DAD2F4D6F2547C6986BE2BB5807ECCBAD86EB50F15C01BFF0A5AB526E80F5AD7F4F662F4F68AF5AAAB6DA4535F4540D9E951559EA88FF42AA5B5D26EAC51BC7C58F67A40B7B1E10F3E3FB8C11F78EDE6BEFE4F4129E46157ED62390E4FB00FE734E0ADA27DB52 EntropyInput = 5E92431BC966E1CB15F2AEB44947DE464B7199548DEF7BDE8D39CA16A71122759FA241D0 EntropyInputReseed = 7C74C30C1AE9BF2841881B511A0869E763C4E9B401029C76 Out = 3F260F9D090D90DDE497DEF33E1F148DB7A39E5D0F11FF2F4879C33D29DB6FBD8D01ADCB75DD68AB47DEB6339D1DE2DBD84F5AE22B180EED0D3A40E2AACB0EFE818F5A1A1E4212046E85B4ED436868934906B8586B8E7CAB75C8E0F6538D19BA1549E0B127E3E3439E345BE7F44537B0 EntropyInput = 660A2A0B79CA25C04EB7CB59A4370C90CAD89B55E6A09746692DB393FD443C5365BD6F85 EntropyInputReseed = A72C94EC1B41689C18C4265C6D165010A44CF75941EF90C7 Out = C7F9B01BFB9C63B02F303A8EB5568519F35DB2C8DDCE9EC6592D26A5DD99BA4CF8B07BEFF7977B771EF998E0D96B3DE0273AA4097DC67D01CB1A4ECE40790641A0F3C1AA1AEA8BAA1AE9683CB2A4EA0B508E8F29E3275DEE018441F25CD3FA0F865DBC549F5BB09EF7D9B6E330D0B2AD EntropyInput = 1BECA92C13BCE295622B841AEEB9655E6AB47A955EE63E968F021FCE5748927F7304B38C EntropyInputReseed = 0A3DB8B1989E887C864BBAC9CE3D5CAECE5A1FFB0C7E17E2 Out = B5BA5F854535CD7C879A942516F9880312292160D89DACFF105A40BE557189282D4890A3230ABFB7625E0FD843BB0B1641DF7021F1BC22794335CB5CB1D7957F43E7A08EAFABF38691A9EFDC530A644C43593B75D0980D6A2AAB412FD00D9AE39E51EA9B8B19CFACFEFFB720E0EC8F1D EntropyInput = C4F56CE3D11C9F0BB37A7509D686990621C2B42C620624695BC9FA3B7852E98B938C8326 EntropyInputReseed = 547C15C8111B9BAD3C29CCE7F1445E0C2D691223337F4FAF Out = CF6DD2D2A366299194C87502D584B2738EEE76BAA35C329CE526379F12123BD625E3B2584394EDDF96F1EF54CCFFEB23006B5C02CDCD4C79F09B05ADE25D1AC54C56C90182DEA25488F54A775990CD58351A0A91ADD3A1ACB1E01FE90A798298F04E47EBC8496745BF8AB680864DFE23 EntropyInput = 4851C3063ECF4C1E5CE1F9816B7AA177EE954A4B8E3ECBED69B963F217A2C96F2A29FF58 EntropyInputReseed = EB262F8CA8164F0A9C78EF61AE316222662A127447189196 Out = 795A1D327ECFD57C42EB179A0DDE5C82B856E196E4CA4E7B01DFF044650B8062858DEE59A95BF1F2991636532CC161E0B90562411A63C2646D22B195BD4F1C2CED0E68E21C7523ACB91AC712418A83553BAF374879834EC923AF591966436EAB307AA3774BE2BB2794C2A4777FFE1E93 EntropyInput = 578D126778C78B65FC5E726676D4842CB44B88036C5751624336E590E43D5F20F5499A70 EntropyInputReseed = 6271A3B36DDE9BA1568D477277ACD714265969E42329FB75 Out = E0D97D77034B22862F6EE974848661C7F4170271C78BC44F2EB38D74F8A62FE242CC628AE3B8C8A70F159C3DC68BAFBD13054F86C5C39B2C72669BF98C5B7450FF6A0B84D79D8C9CD32AE47C122ABECBE3C67F20EF2D9DDDBFDA13748A520A6352B9B36033D33FD6A9B81B1BBBC939A3 EntropyInput = 13DBEE21EC86D4AC7960D892A1FF685E0E993FB7F688FECBDC5E6C4ABF5CC8C649D3F52A EntropyInputReseed = 8CA8DAB36931EB605F45EFCDCDE1BAD30A4D72E638B6B997 Out = B6D4F66BEE4CA215700AEC677640955FB72CCA33823FF62BB820EFE8092D0EB805740FAA82DA3C5676804164E9B1AA58500E749FAC3948B5B0699EB0C28233608E373FAA60F98821A0C522D9D03CD956A2D863EB1C2F3165FC468B807C260AE1A840B472F93EF79D1D4732C96B609643 EntropyInput = F057BFEC4142CB31AE3D5EBA900488A52794B2318B1A289771AA03D80E5DECEC8689A939 EntropyInputReseed = 05F3330971E9E1D085E4D8A89E26A4CD8CA0F4BBE57F2056 Out = 4C8761ED99F72122A758409FD6DD7CD87ACD95BF3F8C1D805BEACB6BD80A17C2B6A60F908371BD11B6467AB2883BA808BBA3F14FEBEE113EE8C6112E8672AB3C0AA50182F6EF791E712E91B45E7B6A525F3EFC13801D0648E4AD77DFBA2B83E90D47C372DA86E7EF1617133407C154C8 EntropyInput = 778D731A103D0091BC210ED17D652EE3C57FFF71F2333A4023E754540D6CF3888F10A4EE EntropyInputReseed = 3DF7C387317A838EFDA028EF709E4DCE14667C68D9CDF692 Out = E16B915F5025A278BA6949055A4227E441E7157C4081DACB746F3796E275BE55326A58DE293401FF18AD011721AAB9F76E1664D8004F34FF155A8E5E6C4C841D1D398C5E4291D74CED2196C3721DADEAC1CD66DFD317B6C4B8F090A278C3B3C20316815AADA482667FBEA422A26B2D17 EntropyInput = D16FD89A478A87820EFFFCC9BA5B473ADF6FB5DF26BCFB0EDD2D3D86FD51C0FB1A770168 EntropyInputReseed = 95CAE7F6640C99671AD07EAB14A20EF734D1FC5789014E5F Out = 277543CD65268F87359F10018C774F0AC8BB31DE5AA9FF1385C5E3495673B3A53FB1AF8A76183A73D8A2CD13D1DF1BD8DC9A720D46A7C71F22048D6AD70BDAFED54A511207860608B3EDBA62F666C268CB06DAFB5E375459818EBB65F4BD6AAA3F1420A96782E3B65870FFEB67D15785 EntropyInput = 02A2E182367776742BE968241A548C0BE87CA73632F8CBD0EB94F97CCCCBBFA209A92B1E EntropyInputReseed = 2C9004C5EF63E71380DB63781A5C4640DC9851E76C2ED073 Out = 4F63F5D352DDC83376786454A5BE4DC8400D34371B71AF347FD3E7D42240F2918F700D975EEB2994C05B2A0B0BE81787DC86FC95A5E829B70DAB56723FA6E56E62F34B90C43A8F3D95A22569BC50469280E6E8033D7CF984CBCCEEA3D25913D461D4E622DD6DF355F4CB3C6F994D54B9 EntropyInput = 538F254492FDA7E1F15801E52D294C9806A2D1FF75D2827BB46CF28B419F3054E16149D3 EntropyInputReseed = 8BD24A4596C02BA890515742F959F787474D89819420272CA5342611CCA5D52352382AE7541A1C02F955E5EAC35AA488 AdditionalInput1 = BAD9AC2E97C2EFCA3D6C51FA6B7DFF4EDEC24386740B4BDE AdditionalInput2 = 9704ECDA35B512068B843053762FD7FC875D9A2EECE29ACA Out = FCFA114527CF0D75978ADD263BBE067F699F00170CD95388BD53B2276CF28C8D43CBD64AA5FB5821E88EE3B180ABB44357D72418B0783A006375012359E86F7B170C7287374F1629610FF5A5947AF9370C25A453F4D5B11056A21E57A4B43C370CF2E3262AB25EAA2DFFFA3C25E05C35 EntropyInput = B9174CC6A47AF4ED2BEFCE2D758212B9585FF2E549CE0EC79807DF2F1B017AE71F8504A4 EntropyInputReseed = 08F49264AA04C2CFDEF05A3E8DC2B4B40E0D0C9D1D2EED5A3BEE99A67E703AC8924EAA3D83357C28454BF9AA10E29221 AdditionalInput1 = 75AAA80F8D133025D5FE3BADF1853F81F111BF94986927F1 AdditionalInput2 = 2EC66C2AE23893AB01B210000098AE7F64CE6AC91DE871BF Out = 2DF1E64626CCEAF52ABC1FE78A446480B8584330A9B8E4C40E62519288E7B2FFEAF9D520205B59B9634382CCD0E4EE1A2503CA43A4D9BC71B526AD3A53F8D569E1246D33624D2C6808AEAF5764AC88D0070E18ADD01DAFD4B7524F87A2800B6B75EBEB193B6C4ED6868AF6F26C181FA7 EntropyInput = 9D4CD403628E7E29BBD95DB4C6AC219A48A9CB4B39ADC998069E163F3257FBF516574273 EntropyInputReseed = 5839165F0C9AA7190AD2DFE180DD4EAEBA5F84FC6D360A341CE8B2AD445A8560737AACBF6ADFB8DC09E6F283D655BD52 AdditionalInput1 = 37348F28A3414E44A778C37FDAE64559C2EC7149B55B0752 AdditionalInput2 = FB3F526A97F4AF19B60032D6E93405E5E1237ECE4D3D0FCB Out = 751EE0CF7883CB0C643E1DCD20F381CBE105845B05A1A407817D5FAEA26133CDB113347B6E7E521C15D42B833E7F49E7B497B450A0B76CBF4B6EE179D09AFBCCBDA472637D436420C2FA26360D2FF796580FCDD0813E59A3D58ADA14AEDF6AC5A2CB23B1A35E22B795ACD2CF37DA9CB8 EntropyInput = F531F066518ECD27EFC5A8442D07CB6E77AB1B631C39530CAA97814E4461FF28290F6649 EntropyInputReseed = 4871504FB0B6624C9482904852BAA2FA1C22557DCD4BEC51D5834A50A825AE2A6E8F6556968D8E3A916695E63FB03198 AdditionalInput1 = C21D88FF884A64E8E31A0183AA2E14A66B51ADB2FB2B4DC0 AdditionalInput2 = 9D39EBDC6B95DE21D7A202F2095A86FE34FFCDA3472A7149 Out = 01D7D5E7BB1569829E16C429256EA72128DFBE719256408FBD364EB59C6848703BB07A14326AC8423953D47F919C67CD21FC61D18F518C1AE92638045511A0B96671EBEF43E2728AFC78D1C964C3F3ACBB92F85146CF7EA0DA767408A12A8616B3FD46E04EF31FDB2597BD52FEFD0A43 EntropyInput = FD0DE2A45FAC087A0B8A124F3465C3F1B1713C0C0941708FB3BBBD63A877FD64C2F375F4 EntropyInputReseed = 82E232EB711A21B9673F5432A0A86C695698686BED4E38851D0701CE1E8163404A8CE37B83809C6240AA0C0E80931F24 AdditionalInput1 = 811D7466E54EDA34B0087C89C092C3BA2C5533F3C8638055 AdditionalInput2 = B7FB19C5A0FC2430E43D737286A06739348C6154257B7B6F Out = 950EE29180B9C1141AB7DB1A57560B0E8092E2578B01D3E5ABF5ABCCDF333718FD5F3F587B63C259A24DDC87CE8076EFBC97F7BFB195F6E9E53DCA7301A445F0E85CA09D13777961E1747542C4EEBB1EC675AEA8B00827F2ECC34307FF1815225D1201AAB50025F55F6328FFB10C57F8 EntropyInput = 386812F57F62281AE7E29FF6B82965773666209284D2B835BA9953697DAB4D974C23D467 EntropyInputReseed = E3295EF851CA300846116352ADD2B2BDABC632FEC720956A941B2F2A6500E9799A6EBF755C338CF9E2F7740692C53EC9 AdditionalInput1 = 4F1E10CBF218DBF928BBFA5F3686F4E3EEC64DD363DEBEAA AdditionalInput2 = 54234940377DAA7E8BDDA8EC557BF5332C64E6BFB16804A1 Out = EF59607B8CE334269321AD658B735A6A5BF77E5DDC81BBB7625AAFB9505EDC9D7834B7D722246C67EC3E8263FD72E7F781047465DE30EA583D7D36D10AA58098C0B2935AA87290FD924DB975E23FF5C91F413B3BB0465F760B963FC91F1BD3E0632F2C8D895296A06B6710F447F9E511 EntropyInput = 156C15E07D423DA1CF91C3ED597708D386B7A0B7E925779D1FE77ED972FFAD7794FD6305 EntropyInputReseed = 8F8416AABE1397D75742BE65A43CFCB9BD378B4AF585F958C4FD538198C0F9F788430C5B7A80B026C537D4E363AA6298 AdditionalInput1 = E50E1DC37FCF8EF080BF44F426508259900C99C493EDEC31 AdditionalInput2 = CE65F18967BA3035E58CC465F5ECE6283AD802741C78B583 Out = 91D652228A95E03E2D8025465AC2BA434F2EB37256C4F946EA3B4F5978838C528F6565F6EDFB7089EF2D6F8A8569CF310F0EDC1BA51B56691E51594C92432BC84CC827C1EF65D8631DD006DE4BAAE754C974C8B4D74CC4008AEB5733ABD2E990792E34D2BD484586000C1FEFAF5FE917 EntropyInput = C95C4C1BE62D96E978C5A224E69CF3CCB1B5BDCF1CC9599EBD318BA08AABF416039A9CEF EntropyInputReseed = 817B6F097D288E425A8B67C996AFA9ABE48A635EDD2078B9324E683C2CB93EA97765CEEEEE9269A2A8C5DFA20AE85D2B AdditionalInput1 = AA427C2F2BEDF1CF75F3D1B117127164FB014C507DB09577 AdditionalInput2 = E68BBF1AA067D5217FDE4F4288409EF950E11635F913A879 Out = 9C20C086965E9F5901E42FFECAA68BA69EE084FDEB4BC4D58D042B16FB8E0666A2E7109729D02324E95E3D6520A79F12EE281E727D249210B3BE86A01CC4ED8A173087EE70C2064FB8B899D90704625CDD9CBE45B9778DC6181A85B82D087272E3AD5CDC33258EDAA259654486EB5492 EntropyInput = 750FE944A04BBDC9C5A9651A727AFCC539809593892AE157AFE8DE46BB4A2946EA4B70F1 EntropyInputReseed = C10AE8D979A521A0F8C7F3EBF2B370DA9A202E3BFC3B622200B4B3B4B6556118D83D288059A2E9E3E19D6E00337706C4 AdditionalInput1 = 22CD750815E8F6180402108F12A4ACF6CCCAA80D7E3819C0 AdditionalInput2 = F03F7C856FA36AABA5E1A9A4F3906384DB326962B5429B29 Out = 5DFB261C96964E8E7D8363BFED38F9D56CB3C6017A4B33D557814A8507712B099927326A7C0F6791960B635B9E5263DDFE03CF5B86E6F37FCC8A04E6B4AD8E4A5D4D1AED64B661F56BECF7AFB6ADAD8662114661D0CB2566E2A35C8199D6BE75B71132D2C878C754CC8740406A697C41 EntropyInput = 4498E6DF0ED5C588DC1E78E744AEF7236C906C64196B75794AA3FFF61823CB8D7E5ADF01 EntropyInputReseed = 28BF50B61A40F1E70A9C453F91E69382F29B760F08263048BF0E8F4B9444786492E163D1F893C1D2EC5FE1C67C74B610 AdditionalInput1 = 0E509FC439E7EF3B65561DFBFE70C0D9C5EAE0D51409B3E3 AdditionalInput2 = 576EF634B4ED9A1D252F1542BB96C03E453CB9C9D247CE0D Out = 70BEF944185A3F07F51BF881C12589D0F8368DAF88A106CBEA0EA4033C3D117EF45CCBFC016C5D9944951C9DB83547D6849AE1E80A8FE0FBFD313F16E9CF2BA39C16AFF769BCD80568BC8E428B917F8D8BD44DE330DC6CAE0525972DE2ACEFBC6914381AD4B36B10641AC7FB2E0DCBA4 EntropyInput = 1BD4DA90D560C71F4C78064AE3CD6693FFC6F9B3DFEE53DDE178E0A4CC5EFB0B720409F3 EntropyInputReseed = BCF329B12CA14DF65AF3EEEA2E8070993EEAA77243A58A8267680FDC2F9A2787A10123327E868E280E8DF90369A45DE9 AdditionalInput1 = C2B590E4CEC61151C4CC122DE3CBE4B95C0AF294E7C0F872 AdditionalInput2 = 5C54C01D43414FDDB2C441592F7DEB8F25FE382BDFD64E58 Out = B89ADE1ED4BD7C0EF6F787E4C76DB75FE7F9216D0A43688A10098A2F5AF59202B2C1F48563FF532787A1862A213C269C2CC3112331C46EBAD445294C1A5217B3A2D06C6C849FA8A222E2DFEBEF2880060FEDD458FE5F87297FC3AEB1255EF33F32D225F1754ADB102653D74B8242AF15 EntropyInput = 7DBECDBA02E537CDF2B3B30FC5675EA810DC82450D5781169E7E4392351CE7B51FCDD8B8 EntropyInputReseed = 52C235CF0A45229C5CD2AEF84CB2A1838A639718E128D01A824C906E5FB21C8A342DE90AFE7C5E030C609D450A399040 AdditionalInput1 = B090FA3F3A83DF19331A747F732F74E6BB59360F7272A5EE AdditionalInput2 = 4E586DAFBA3C498617E15B62AB81BA837AECC27841BA5328 Out = 7E9E24D807B24398AA425CC194765D663E41736DCF7C22E241327D41C7D8C7EA62CC11D1358BE51546DBE268EFD3A41542FA63FEABEBC5B0E3B65F4490FCB8C9D589FA49778BB4CA6C6A097C57F667C373D4A9B559E7D34D133F8A0295FE395623105D67B73E33BC3E952022CEDAA343 EntropyInput = 76CD028FA90D01113439898B16C7D3FC98DFF947BEB77EE01DA338A0F53994C8F1E55ADF EntropyInputReseed = E4DFBA2138EC5E6EF59CD6C0178939C8B674B61AFF30C86BDA7B4059016BFA7A96493D75BF81BF0FA12A7563C32F136D AdditionalInput1 = A60B724483020A37B61EB5785AA6A87BED51A5C0AED75F21 AdditionalInput2 = 1BF4D25F1B58B15464A3C5AFE34F96C997D348FB81D2BC31 Out = 7D529FEB1B726E45A68749A4D34627CA374C59901D9A39697DBF7265B487269A8A96533DF61FC5030FDE9E646308F1EEB67D025C846F84A3370ACC09241E8C4ECCB3E3D85027AEB575BEE73E11F8E8A3A3A79EDAD6CB62D94AF7915FCF1041C1BEE0AE8CBDEA3BF01AC61DDE40287E8F EntropyInput = E2D628F7BDCB4137B12516451159150BB0B97F7F9068935CB109D0A45899D80492FEB118 EntropyInputReseed = 019FE94BFC6508C2021F126B6D1A07C1FA77A60944F0B5D490DE5172244F14453242918FB812B6CCB87B196745348570 AdditionalInput1 = 7D997B550150F14BF02E65550DCAFAA5CC410865D9CB9697 AdditionalInput2 = EEDF1DF1E5198B3FBFBCCD2A79FB5C0E56AA9D573D87C9AE Out = AA573C5CD75117D897664A295964250C5510AC4F558FD8D87DE4EF62A3C9403AF4F3CA35A4D0F1289D3EFBA0AB4D3CA13E754826DFE7A3566D3E0D54A41204253744F08EFAC623E9162BDE5BFF73C496EA508385A31D002470391D717BB4F0760595560B23540E0E27934AA6E4CE8660 EntropyInput = F7C3D39EA1FDED918B40B138EBDAD90D66D9871D6A512C255691CC942E0A2A8A2132F04D EntropyInputReseed = BF04279F270508B6610D86DDA40983B897686BFBA4F6EBAB7AD3583BEC609C61C45A46E736B99905938AC95D8A0B5831 AdditionalInput1 = 3F92583AC112CAE4988334127DD74E375973D622DDD08DD1 AdditionalInput2 = 2E44C0C0AF8D23619269A2DC5D8D61BC97B11F685C5969B9 Out = B95A260FEA2DE93B01C8A8FFD63D5265D106DA7BD701D8F0DB1F661D89BAD75B831E0900573561BB79E6E0AF473DCB1A97F96A7E61316E0827AF1029B923EA71F698CE3FA92EF7ADE7AC63F030873106F6161B5B732C9877E62821C34D2800733B2543DA3FA8D9F4CAF79B883AA5B9BE EntropyInput = 582EFA9E9D4853AE7121F1AB3CB9198D9E4173ABF903085C8AEF0ACFA4BBB98F5CCC57685131EA2BE1ABE5555929D430F01679C3E262F680ACD9B079 EntropyInputReseed = 675C4AD68E56A71238E320EE545FAA08B5F89BAE08B96692 Out = 93AEA203E157DE4DFF0C8B1C19EA53FA2E2E31527770188C65A1B289ED122864C1F1633CF9A422206A83B4C2CA1D18A4A57C06541D67022B8229AD2F4AB0BCDAACE5D6AC615B72CFF58F70E0750F8E26489834B1F2173FA38491E8DC234F9567D0AAC72F6A3C6EB8AC9D5F33E1AD082E EntropyInput = 7222025A77DA0C222A1E92504F31FCBBAD3296F581DDCE0CF5BAFF1DE8C3862040AAFFDA740ED0D334017B3362BB17B412FBBE7D4BFCC5555BD9D08A EntropyInputReseed = 172CC636665C2A9141F6CF31D3D799E9BF3E539CD04D9468 Out = F59867AAE0A39107C82BC4B6BAF33E9740BF0CD927ACA39ACD2A9D6C79DFAFBCCC48226178770E2F83F24BF3B12F644B559349F66E364BAB04643C72C4EE57A6B463AA760CC518A74ECA0AC7F6EB6C816F7C7D105B1986771DCBF18AE4C8F698FC0B0B000F2B11C35548375ACCB37990 EntropyInput = 68DB63CFAC0285633809F7E704A38A02C53EE4F71919CAA8176A4AD4E90B37C2F017613EFB16D23C0206D36A0CB720574D877E466C157B92D3A0B9C3 EntropyInputReseed = AB36BDD6B62F2F17990662D99D6B54B3F5838DD4DBA9BCBD Out = 0D6CD9E1DD394CF7ABF00DC0F9E61138C34634F12A1CA5AF31E8B13E423AD9D649772D8DBC33C0BF3D602F31D1A30C47E0674BC348530E452AC3A1D6A826567E5C200A1FAF6B28891BE0C658A3A23D5268DCEDAF11808823C5F0131327C2F51B37987F425E6D29EA5FA76930AC6756E5 EntropyInput = 711E5650B2861AE32080ADBC65CD59881A946339EF85A1499D83F0B8EF3FE158106873AA529D8E9903533483D85B659CDE6B8A5F35E388D68962BDE6 EntropyInputReseed = 4853FB444CF5CD68A09BDDF807ED9A5B0980100891293EFC Out = 68B22EA272A9CD5E03360FE7AFF3A30B3DDACFA24FE8448601DEEA433882AE14778E9D8B1A75DCD2848A292448BC2329BC1D8753E8948223822C79CB420DF35BC36E6468F83FA7F426DD5BEF67A51E37C7A3B58CA446B2B0812C6325C8E7B51C5577FB1B114E3C55E8DAEC2EEE349718 EntropyInput = B593756E43E8AA674B9EED72DDB8CB5D39133BC45E259127038FD29AD6AD8975CAEC6D03F965CC6ACAE9B76B48A319DA946FABD32CFE8E624099559E EntropyInputReseed = B15CF7B1DC1F2F5E327C37723CE540032AA48F64A55B5C56 Out = 8B931D49BC0ABDCCC63292F74802E8F8DDC781D04B1B65F9F950021E46ACD105A4A71A7AB4620143845B53D6C2621E93F5FDF1F338CE96469E8C03A2F3BF84D1FC7DC9DB176784DE7F0965C8B91F2AAFD38F4B300CA2EEBECF3CCD28A8E366B55F3CF66C5873F0B0B2C60EB4C65BBD61 EntropyInput = DFBAB114149C923C53585523668E57BAF54809532B3F8E3CD0ADC62652F61DBB2DB40A2C70ECC5412145B46E4A721EA7007A1B5FEDF26BCC83B696FD EntropyInputReseed = AD38CF3BB98AE73891D111355CE80D26547D95AE879C6673 Out = 13D4ACF170AEF13287BF5B116A6D5413D474486D044097C64D610D0CA4AABDDE1945FF3ED43D6C399DC6041F481239EB94DCDEEE489A4EC19E6CACF2A4022A47A1717BA78EC7B7069515E5AF0BE33534F5AB9AFCE068EDCD9DF38548FE028E6D87103B8398631525E97BAEBA9CD7E576 EntropyInput = E59BC9C4768AAE4D8BEBA9DBCA502351BEE14AF3BD37E24449148FB0EB504F3838F3E40A258E06855E38E590446037FEA1505A9B1D01414583039849 EntropyInputReseed = CC1C5252D14F32AE20617392C918E2F29271A40D09B0F5A6 Out = BBF25F6E147990170AD6B74CAEFBF67D3BA03638D78804C4CAC63AC3C35B745738984605C98F43FC33687B039FF7373F08869B4F43024800DAEBC035038190F5F486A8CE19C274BB7DFB2B199D7065F0C5FDBEB86135696114F3E246EC77D3E279D5F39A581AD214F4D5EB2FA10F25AC EntropyInput = 7057FD152CE3834A52470E9602DD50622299B9932128F58E3A20E575B668C8D783BA9599326CAA8ED2B94559604AE5BD6124EE7933E5C5DEF4751A86 EntropyInputReseed = 1B5C35BE02287CA0446CB5D78ED6A99D91698968994A9309 Out = 04632278360F34A0C4BFD113E18BFB50EB93D3B740468571826B5E1DD4C67071D5C279E67A1764C0220B2012687D7D8778A44680AA3BC2036077CD564B176CA22A69A977BC30321229F60555E59734F6767D1181D6ECF9EAE3D4BD8D32A4BBE317553F743504337B0D3C9AD2AA882878 EntropyInput = 6AE8D4F3CCF79121F3BF8F95D405496580D1CFCEDB3700D4037D9E037A963439609BB881E5C066AFFF04C7F71AA96B5FE4C2DF82C41B772F0F4111A7 EntropyInputReseed = 1D1D424217BEC8FFBE0D80AF1D468556E789F565D7A61A2D Out = 4B97451308D0224A82063AF2367F5899857219605BE82F2CCEEF2D6C3492D21657792CB57A020E6FE7418A855BE3AF1EA6924C781E9CB7F34380D868F8883163A149575F7AD52FFF08784271B2BF884C589D19BB117D0E2FFDE8C3D3AB6E1A5EE12E9BA34ACD3EF1D725B302E2574E47 EntropyInput = 5A9BC6B4E54CDAEF6E869CC67FAEA936E3D85815BBA7B8DED4621B0498D8106AAB28FBB2758CFAE81C214028E2BC5F7945D7C50E44CCCEB98F14E920 EntropyInputReseed = F909B3753011C7B850CDB44C674F06D703351F06CA891FDE Out = 1B41C15F94FB9DA03653712F4486DE1925E318B6B682B59356A47E646A67F737D367087D54685141FFFE98A11653D6241C3C571B035D2F77C3BC32EFBB606D6024E1F2959544770406D956D5E588BE0B0FB9EC714B13E2BF92C2CD5526845DB681B490B553DED0BD31F3756B5FDB1E7A EntropyInput = 82A07447FB62B1B0A3FEAEC5AF3DA7F6CBDFA4C72B009E545D1F19C2F7E235DBC444C53D55781585239E655D0351E33553D4BC5AD243E42B22FB9E90 EntropyInputReseed = 0E97122FA2C893002373E81FBF20B00E34483830C198DE70 Out = 69FF2DE1084DF81D1591AA9CD15159105E360107D6D893A22FD51523627F4EE03FC6D0DB0C7D069EE492C0343C9EF52F519AF77F0DFB4AEC759C736B3095660ED60512476E24A68688C73816C1B0B4F6DDCD465C73C4D103AD36A348DB29F2D5C7AA8A630CE981E370C68946FDE2397F EntropyInput = 4AD315B81AE9A48FDAA76BC11C18E27AD1466345ABACC67C78E3B083B38E2203CDFD3AAEC635C06747F52257DDF37287A739AEC47F276BA550A5F073 EntropyInputReseed = 0649946936034156EB0DAF9013CF0BEBAFC35D82017AD614 Out = 710188112DE46156A391A6485281DE0ABC6555894477AB12C621F3812029FEEB200B0ECFA8447CBEF35A4746CE599D0C9972DCDC7B4FB841C3BCCED8F6BDB046A3A9706249603D811C8012D9639772B4595FC745F45F6B3F76F3CBE13CBD66CC3F8854F93D63BA8498BE60C64664FB76 EntropyInput = F50194FBA5FEBACF6DD421A9CF857F57B31F60152F99C39CD62FF3DE64AA903D07A219D3652AE922F8B4B1ACE0ED99582942FDAC7E37CDD5085F0B58 EntropyInputReseed = 69CA60485454AA2AC35C48596351F57FC88093B5E74B3ACF Out = 25BE27EE762172C3CACF34A74956427462A91A2802652273DDC39B24F6D2AA539BB11113914436C98DCFBEC35D5CCEE7E1374C7E3EFCD2A15F838C6E818CA1232107A62987509E6B2BFE2C4BAB7013A87D0F12CABD9D1DAA2E53F27FCABAD53D7CACDDE41594F422BEA5CEC2E0578473 EntropyInput = 721DE3BC578EE54B81D1DE44FBD4F41F99185134A52545A987DF155ECCF6BFD01A814B7E2C60B3E35F5BA384673709BFBC7EB798791DF204A24BFF6B EntropyInputReseed = B7D8183316EE08647558F3758673B040FCE26A3613121E33 Out = 5E20249A116ABD0F09366A76ECF70EF71783D617EBC8EBA7801979282EEFEEDBBBC1132B08EFAF63F5DCDCB0F1BA2891822E52483E6D756B3A97B00C2623AD67B2A15053516B6B7FA50416DA4DC0B5C9B9D8769B33D2F4AFD626693076DA9DFC7AA0EB9C17A4CD4EDDF1AAE61F85E70E EntropyInput = 78C6B566435D01D2B4EF3CCEC4785E8F14C7B3BEE1E3DBD580A23D19E56FEC2D74189D9E32EAEEEA8E94879153CA49184AA3FC16A881493495445D58 EntropyInputReseed = 13EBE92B43A56B892CE82CDEE8315DA69F42AC366D6513F9 Out = 358D17073160135FA96F467E1E3AA5741C202DEAE87F37F1A8B0C4E520DB6FB9E5D6B861BC54DB8AC2DB336FE035D5C36A89DA38ADC8B71DA6F32D9F2DC4A86D604174C4C7B152B930BDE4A45995A5E259A01E1A3AE44F708870F35E2CC1059C30274461E5E35371702BE6A688656F70 EntropyInput = 6A7DEB4B6790284D9DCB8662A10E2D69291E889DFB72CA3228E0AF5BDEE3B79D6405D05ECA84955100BCD19DEF060E40344ED150F64B117EA7DBC0EA EntropyInputReseed = 55FDB9CD5E8D33CF5D6AA5A5AC6DA75AD525D6C715D274747D688D482B8FCE5DD157EB70D3F38B7775DE025C36D45EE0 AdditionalInput1 = 4D37506AD3E61AACA713CFEBF9CF360015C0E97AC568CF25 AdditionalInput2 = 594606994733F333DCD3B7A77A0EEEAE35835D83E0770960 Out = 5B79678E2B5E7ABCB89A8B5EBA0FFD60ED2E9A2EDE1E023C6A49CD80D3D03E6C15E630A5D8681EACEAFA3585D5FC0D11BCE616DE9864B9BF0FFCF2B407F684C99F13CDED4FCFEC34B80B44FCE8D9AFB3FCC016EFCF16BCF8E2CE0BC960654E330E7790FB3F7416AC100A88163AD884D8 EntropyInput = EDF4DBE2D3A73F9BEF7E54D3724FC437650ECDB795D65BD3F877CF829448F222C274A634757613CCE03832F1FD9F8F27A213A52F0197B053E723D564 EntropyInputReseed = 810B8DD96A6429826FD543A6E2DD203731CED8DE87453C7C75B229CD9880EA34B0E45AD8C6F5DEE7C921642FA5211A43 AdditionalInput1 = 6A4E29D6186476810ABC6FC8FE6EB3E8927A0CDB186A3409 AdditionalInput2 = C348D0311161DFE6CCB90522D1CA5CB25F32D451215B2BDB Out = 2B2012C4ECA07B87153D7A3F7234E9B03A540144C41B5559C2F5C78F762FDFF0683163831EA2A7B30EC06A42A5B1513BC6BD65BBE96F823BD5C163C405B410529987171AD6752051034D5419F402EC3FAB9AB4F3B92AAD645320A2D8739CBE79384E4BA21E12D7C4D23771236053228D EntropyInput = 3EA6A726D85DA31AC16D67673747E4B02A15EDFBF9DDA16BA2287A4B7377B18EA430E9CE6B142627EB132D78ED2E5AF0BC4600BD83512D7A7BB10BF5 EntropyInputReseed = 28201A163FE84FED7D7200460A60377A3ED42541C38A3C13E69A5B4BB5F2EA87A551F4158FB9BC97CE95EC4B74171C64 AdditionalInput1 = 24D3C8E9C33C8DF8A61CD0DE896C9905A286507C8914B917 AdditionalInput2 = 95E58747B4AC84897D024F79EA6F7BA650F133FA758207F4 Out = D2AA956FA8163FB121278FAB6B21604E29BD0DE7442AF15D64B23263A1894D4BE200716CF8CE12D79535C9827F092F2438071C6764C0A5DACE125081F84B3DB81FE1C18400DF9A57C9F2D4B32BA7564C5293DF74D9AF7080D6A6216E00AD59154440E38D39EDD68AB82A922DFF18E7D2 EntropyInput = 9C7A194C82DBC1B75BEB8A698CD06FF5B84DF33CE775CD9112F1CFC479912677204C0DD74D3E4416FE13243BA395EFEFBB67C83E9FDA2C332F041281 EntropyInputReseed = 981D12C4BE0354E6658E6CEE5B5E51AA8728FF35C7B7E2DE2800F25AE28C68487D840558FCA4CAC539CF15F0E31417F8 AdditionalInput1 = 2E26576AF7541A3DD8789BB8863CF9AB53703B5910992BC4 AdditionalInput2 = 9261A2F3501E25C481E74CE16902B693AD46E1B2CF6F6446 Out = 49BB6BC1C970337887329289723ACA448AD7754914CBE1989E04168DDEFD19E3A5C111EFB5EB2DDA87FD87CAC53E215A93A0753AC295CC62486049BAF4A9DA0BA2908D58B9B6CA97265D7D178167D4CAFA71E55BF6A9F9D6ED6688E0779C79AC441BA7E9FDBB6EA81D7B79A23595CB49 EntropyInput = 1FDCC8D331D5FA4A74288EAEDC924FD34AB5101538C6242FFA7F07BAF7BC6AA9EFEF06AE8052B9154A6B58D21EB954572B0900B684F35A4B3C3BD7B2 EntropyInputReseed = 641D1E3DD6EDB3D35A9249D1279759BDA44E42605EA377915E11582FDFAE631ACFB9344B487F6751035866E318216C67 AdditionalInput1 = 6A3C9249A47D99410FC644B79AE5E96E4A38BF9942B80596 AdditionalInput2 = 953A6410A372EF4C8CCA472E9FBFF9632B4F885D435605FC Out = 0A5B798F15E7D63250B5923C02A8A50813EE73E4BAF8F547610F99D0D2497ECAB673E9FE5E065904ADF78ABE8CEC3954FD8CA68CE84E205AF6293088E52DF457B2B5DCD6973A8C3E556269C2C297887BE252BFD25D69F649B9243912C4FE9C3445EE57BA40E279E9D333DEB0CA969CF1 EntropyInput = 6A3D7ACE5896300C30E33DF557ACA7130365130067BCEB2712955A046206B85A51590BE7D6D4B4C88F4067679AB0767F93C8F279FE18A695EFB7DDA9 EntropyInputReseed = 1E1C3888591E06DB0D3AD3AB6602ECB948AFC1B97DB5E47C42514E44D3BCF3A0A4A732BE77FE40A4B8AEA7EA94CADB55 AdditionalInput1 = EAFA3FDBDA7A1F3CBB004D9F7FBDCCA7199C6386FC5AEC93 AdditionalInput2 = E00D4BF6DE481AD984D4F5319428EF57B1D4B2985864913C Out = DDAA18AB182EDFAF589DBA175E6A147416837AA37372D3A5DF98D1FA4AD3DA63E831296FF264230C718AD52FEF300B595CCAB5EE5CCACC5F34D4B560A8DB12005D641C5AE6B3143A33697536E797D1BDD5B76653C314AA9486A33C0F418A5758F441522A1BAB9751A32F44490E96B763 EntropyInput = 1F9112E9D6106667FBA66D6C624C9F9E6BA883D910403CDFC9E5DC947CEB4ABF585004338E7243E95950015AEFECF3DE75EE002714CE990DCDAB9D88 EntropyInputReseed = 40E8FC46DE00D957EF2E07BF4CAC7FF7B8B6D85872CCFA6521974D20401DBF78ABD646D48D40079C48AFEAC6A56B60CE AdditionalInput1 = DB591CA8A306559D3EFC7F9EA2E7F12D3EF7A17D80A75DED AdditionalInput2 = 2B9D2AC745BF84AF75C0EE4FB2F8AD5A91986F0E067158E0 Out = 3EEF1A44A828916E9E77FFF39E291F07B8A059E3039C0A6234A2AE4F318C77E677C408DE25C1E514F5EAD3994A78DCABE34855ADA281E1579E016810E0E34D556B225258D5200BDDD128B190F43B566D1F8F09488A42D2962E160D16BFC692D86C9FFC199D2AA8BF8577FF51537AD299 EntropyInput = 000D78EE0914344F73411DFD0FC6A353F1BFCCD9AEE2F485FCFB8D43B9999556063E7E71A823283079CF0C4775AA3BCB2F3F161972D3A453A4B1CECB EntropyInputReseed = B91DFD79CEE327A0C2E277D0E5380C84391761D3F124459326401828909DDCA1DC70FE93F0F828214A4F158ADB79C139 AdditionalInput1 = 76274E3EA2FEF8CAA85C676E905D6EE8BADD2398EFF1BE75 AdditionalInput2 = F46F74AF07C79BE972945E1223E2888DC3867232596EE979 Out = 85E534DFFE0CA1721DC6B43F56D866312D1B1E58EECEE8335048CD52D9911648DFF8F7A87394AC5C67F25109D7ADBC13C9657E8EEF849150A7478A1F04C67FC40E9DA8856F879CE1AC3BE0D187AC7368B45A33F900C1A21B29C83E236AAB4278DC5A9F21B259F2680FAFCFC8C2ABE10A EntropyInput = FDA82CD1DCC6F7B61C371997736E240E7E1631BCBE4AF1F2A73C757488C9295E87D6E671038DF0EB94BCFA00895C16328132E671F77EFE5AF5ADE98E EntropyInputReseed = 5C9D9D221FE20B4085606D8A52585A22FAAD97B61D2D0EB83749D498AEDC59FE00362F01114A567809AD99FBDA48B9C6 AdditionalInput1 = 3FB071AA7922A557ED7CFC43958ECF2328CC7B67A6F3B654 AdditionalInput2 = 4242C85664769B311059AA7BF016822D06FC099ADE5B003E Out = 01156255BD3A4CEC7665ACF072782F5A3E11A2B0800EF76DAC3EC7CCF4CDF109E030C34B8FA04BA0A8EA9D93C8A70F0FFBB77FE1C11C9CFB462C822655306E1FBDEAF50F5293DBC0BCD53A341A5B67C304A240A8E961AE42D6C6D65E8C2FE51A3B4DEDFB3BFE23D3C0BA7CDFB7398029 EntropyInput = 18C55DABC8B3280A705110DAE597528BCCAB8C8812E2B265F9D9FAEC99B56411454941E55F9A43423875B0E63A62B9B512D4122AA3C7ADDDB7A6940A EntropyInputReseed = 81637945D2DCC50935684755A6D7109B2C311423CE587B80F0D8E663ADE0A5670F3034C69323780C9583266C24C7A75A AdditionalInput1 = 84043D68691C8A25140DEDFE3A40831EF6F900AB98895A50 AdditionalInput2 = B7182F3F8BC7836180B5B6EEA5B44B811D5365D790EFD399 Out = EFA3F8CF4A3CFAB0A4957B613C75AE6E34E6ADA5784097B9E7B42B847CC9BC96997D6EEA1675FC29AA73F33A6BB66A6B961DBE09BF4B5567916E124F975CBB76022C2B12504900370B46446E43CDE58AECA7F06574F6CDE59DD021B31B793166967E410A4A3C01A084B5DC346D090CC7 EntropyInput = 530CAC6BC0FE7E3856A55790E0AEC3A48DACBEE33A5BC8447BEE301927642B114125EAF0C7C7C79F474A7AEDEBF222706754318CCAA740136AA6A155 EntropyInputReseed = 9D1D184A265D86C7EBC2A2914E119E1CD3C7FC0E32101ADE3EDA257AC5325BABC7AE929AD0064CD34D2D32B1DFCD09BB AdditionalInput1 = E5648AFBC40996B023AA458908BFB92BF3B0A37F099B580D AdditionalInput2 = A03EE1CA4668687E2FFBEB5D689374427FD2AAF767DE5F06 Out = 3492EC3351F60A02A71FDB99FF3925E393CDA57555FAD1A129B4E8ABE7F484CAFD893879D79588952F31AD4C3FE78A10896DE1D2908871415371B123E158AA42AAE68D51B38E096EA896AECE3BCA1DCD6B07CCC1D639984478AE12F6B194D57D5F37D8244D83A18B92266469963285F4 EntropyInput = 427789FF80ADD7CD0D4E7D71C6C88471349C92D8AC61BA5F54B37AD23E038744CABD613BEA591565C60C64C70DA58741E5EF2C0F678C1D647048A038 EntropyInputReseed = 37451C8AEC8B8BC5B0FCE4B997C23882A3388D3D34AAD85EC122C9C2999CACF6A54B0FDEB150292B48748E7C60A50DA4 AdditionalInput1 = 6C4B1312ACAD06B7DBC8BAE4BA313AF83696F419C6850EE7 AdditionalInput2 = 47CE6F695203559F305CF24C2E212D8C871FA2428D5FE64A Out = D70D2FF49AE25F4548814EA94A47717F3EF27E5E5F1D109AE501FE9A14F0BD71705BCAC913FD2F6991230A466CEDC856CCB8DB1D30182873C7F029A6483F382E8A03BFE65351D14FB3CE7E17C7EC626CA976D10347C3524FBDA60B2CAC27BB61FE3721B95745DE2A16BB8C3C97713466 EntropyInput = 46384531A48E5521674EE1AEAB04E6B396E0E1F4F34B97D2D3F91EB5C08482FDC91937082A176CCF4FCBC8E088D04BEA650A34D04849028DAD13808D EntropyInputReseed = C4E7D39DB2069C495636953EC964FF40DDD531BB1F40AC1F31243630C211FC1CAA973421C4635FFC7B2569C7947CBDA5 AdditionalInput1 = 1701DD02FCCE1444ECA62825D5547E7F0CE9B3C833464FDF AdditionalInput2 = ED41033186E8326202720F191BCB16DAE355F3DE166A4B69 Out = 245F47C6D7E98A1C61CB367BFCB2E59F255B9048FFDED70D54E650624E3DA8FF5ADE5B9CD759EF0618297640052437C7C940F3AC7EF094FE65B88FA196AA8A15788862ABC7B883D7B1AA8AD96AE176DE018E55F7CE90F090CF734ECA86AD3F3915977AAC45B23AFCD13495C7511E3999 EntropyInput = D7CBFF7802A857FA06CA8FF2FD75FB819E40AFA3F3AEAFFBDB2F98B3D10628A161B8CE7ABCC0952B2B1912EEA4C06F8AA307E59501823883621D7105 EntropyInputReseed = D9B02587C08F2678351C57ED3E5BB5EBD7EC4EEFCCE49BE78FC2FA30912002B7999680D5A830AA30162E5792A43CDA21 AdditionalInput1 = AA92FA63F15B6992C6AEFA781244E440ABB0DC858509C546 AdditionalInput2 = 1297480A081BC62029FB06853AAD125E711CBD488C9B76B1 Out = BD8C2F91FD87C45ACDB15FFAB19181B6631CC9C0E2B70D56E010F28335623B7C595F4A5CBF01D90AD03FC3C9F3CE8BA23CF9646FA5AE3E8DFDF86A369EB612779BBC1CAB64002F1723DE4F660B7220CACB8DD036B8F3371BC808377EDA760E9D5958897AD615B0967C085DDAB9227915 EntropyInput = D0EEB2FAAA4187FF37A74FF54026C3CDF57FF16467438756509014F7243AC487447512E3514889F68A7403A1F8A0C57691E1125451F8A89944829032 EntropyInputReseed = CB26AAEE7BDC552F3C4DC677D0DE43BBFDF6540322BA9807C1553120335562255F9BB7D354A83EE915B5F20DED2E1193 AdditionalInput1 = 51ED29FC5AC677D1FDCB3408A70576B7060F1444A40DFFCF AdditionalInput2 = DB9DC4C9D09DBE5A14F2A50AEE1CED60ACD43182DA45A452 Out = 9AB1E4D60C7F9C117D3D3405EC8507C05F4BD8EE023D3299713A88C7DB6F35412E9C968E39E801764FDB5F2C89D4F186EE4E1F49989C153BDFACF67E499A23A89450C097C71424E59A0B1329895C90F82B3AE7C6B6B97C1CF9A87D27D13E745BE5243CFD538D177D8B5B6BF1BD56E147 EntropyInput = 6401565E2675F6D2C771A70700645D77FFE5EC94A6DA8A5EDA57AEFF71DCD95E94B79847 EntropyInputReseed = EB36BBE289C24E6D5A076ACD3B69B87E28030C549F04FE21 Out = 5E0B3D9695E35F80D78B39F4FC9C5132B03996340E2E360C3B606D895B8D4E406DFFE1A3F607E43B943A3D11DC9C7BB958B06350CE82D1A1652DA1DBF2C95327A96B4A2EB72DF8EC30AE6B38A822626DBBD80C0229479C83C6DA4E57C5E3CE2DAD447339B98888A75308A22F9CBBF727 EntropyInput = A1D4C11B5DA1ACB0640A53498B9A111F6BAD577A2D887B37BBA1788856746F9BE01A9542 EntropyInputReseed = 63F8449AB4C59B3AB4A805C8D3C144ECB6A7F51306A7C3D1 Out = 0942426C282753A9CA4EE6B22E8A844CD8ACB056199C221DA4E113F1CB9BC33327A9A12197C43966FDF9AC61E9034E5D9BF229FEE6828113AEED51E8528A09C6DA3F254BA3F0E488C73F75994089DDD4B8EDF7A7F4D05A53524B2DCE6A8E2BBD17BBEAFC62205BC56B6645ED4AC2ABB5 EntropyInput = CD1C29C3E59E1352BDF2F0035E44233C2119FEA623011B6E3E30F2DEA62EF9E8E8524E79 EntropyInputReseed = 9E2F5AE01AADBCB115110420490227248BB5F9494558290A Out = 225458935767F07FEC062015C190342B44AC208511A85D941AFB803BCD13EE05944CA038F77C4A7CEF79DB79E6A625E180CD1AAFC384AB39AC6A86866EBF1C325B454055B4C048E8B151DA414BD873DADAAA590BBE21C0F8AA8594D8C665EECBD0BFB3F5CE1078816951EF89D110869A EntropyInput = 98BB57F98F371DB3A07B32613721BADC1A85DE04DC6D342BE4E9E96E4E045506A1BC73D8 EntropyInputReseed = 20C049A00DBE4D205FEBE20588A9CDF59B5ACA3A6FD03B9E Out = CDCD72B17854A8003E77CC3EA26E8105D388919097BF35A34CECBA3D05F4C0D374DFEC02DD1E954AF7AB061A6A4F056113EB9524B4054D5E632F828B3D8EA82B6D95E30425A8E540559BB94E8E3122A29FB236D8E86438810F18FF4AA805BC4708CFEB6B2C908CB30F50A74888650EC1 EntropyInput = 8F9A9C030E3F9B9438775AEF361C982521C415EBFDDCE151EE78F3110DD31F63B7F478E6 EntropyInputReseed = C3FFE4B8E81231D18C5533F77E526AF34239A9667D6D114D Out = 353FDFB8707FE91AE2354F3692F57CE98BD0220974E7D2BB0223EBA2F523C50159F7F467AB52EB0D8BC3BF33E4646DC0B5FDCCD3E84782D5A51D50ACC4CF32370F93DFB90F9994310B5EDD4C1EB7295B214F5039050D254C9FD6F136A65986F1C6D623AB3F0135B8797E30F6D3424D0F EntropyInput = A92B039081F337AC20EA753F35CFC3078364884CE458D9925266952DF96F63CD9BE483CA EntropyInputReseed = 21F95F2B2F251EB1C8672A16378481D7CF13F3705EA876A0 Out = A862453D4A84BA6E1C55901EAC4F1AA51408053AF488458FEC821DEB92AC485A016F264C8E68204E05D1DFDD35471BD37C61863702ED9A6027D6E5F8126556D58451E794F46D87EFA302B073534206D49FCBCF6FE5F4AB2342656FBF76B8AAB3A50A9FBFDA5D4FCE10EF62EF31907E47 EntropyInput = E902C91CD2AF6E478EFB560DAD74F55C58B9DA246944BC3F5E86CB7EC4CCB9B2193AB4A2 EntropyInputReseed = 928EAFD412C31078EE8E6868A54CC94D4E22C5866AF50395 Out = 30A84C9D82930A101799008F272312810A13697EED8CC7D141FDB7502A1BF583B3382F10B957D26714FD26A3FE05EFACDCCDB48E4FEE42BFE0192923418AA5FC6E9B04156195321E737FB1652FC75164F1B159883F21AEB1C1E1760F9055A1B92E1B950D93D73412525DCBE91AEB9AF5 EntropyInput = 710D8BA501E1005AD463CAF954B53149B6699E347D5E7665DB14BAA017A8623D5EC35A2A EntropyInputReseed = 0EBA77FC5736276F068A8DC6C53CF769F137C2C5BC415414 Out = CD6314CF13BF81E47020E6CFAD5104455DE6CE11C7B7CEDBEEB970AA2FDF7DC485393B2A30E0A384F2B9F0C58056CB917A32C6602336458224938CA6A042F79096D60ECE27DE0A38AEE589D389B511C51E6D085B3081461E09C3E3D2BCA8ACC792EFE85E47142D196D7EFE36409E2BE9 EntropyInput = B59897E67D733BAD338F3854ED1EF823853C643BDC43EFA021A870B83B0A16F05B024156 EntropyInputReseed = 96A52164E0619320F5B8FEE0B919ADF047F4F09042CEE99D Out = 1B187AC91E7D8451275A3CC0B0EEAA55CA1B6C26887613A8FD57F6CDA934ABDAB5886F52527BD897378435FE7FF63904B134B2DBF055FEF7DDD891B691D5D62E48D3ED3A2D37FFEA4BAEF35DD4F7028F6049977B479637D9FE0BD2267D9F6A368047159CEF554AFF678FC7B91BE966A4 EntropyInput = D60FE65E423B11550B4343C7169B822D9CFF609F4FE2A846BFEB2D02C693457FA0F27ABF EntropyInputReseed = 91DC514E8749FD762728BC8080094CA4DD661736D928208A Out = 9AFC5165D53FF8B1A8C0383A6AC759CEACCBFFC2A56C3858026B7346B39CDD6B0B8209B0245F0CCDC667C7CBAC4A8F964DDCC68FF44D5E85DFB1535C4044445D212290F36E929A6D7C747AA2E9F8FEEA465CA26E4C5A2F06B0912326BA379134741E284DB571E4243A8A6978719A93DC EntropyInput = 4EE31B0153E3D6BA6C93BE092EA6D122B01B3D2A2D481990786DBF991C62DC08C97D95DD EntropyInputReseed = 4FAB0F16215E6F78F52BBC2EAB9C2FB062118D24987B9D86 Out = 48F6F7B6BCEBF8CA5A1A9093D8ADD4A80BE7C17FDEE602205B378A1B033B8C62F2BFD261C35011FCBD852FAAF61876D4F5DBE3F30F750C99AE0C18444414CCCB740D7B45A35A7A690DD21DF761EED908FAFC69A12D7C165871E753A11CBD02CFE207720D444857EA66A81EC3B2452899 EntropyInput = 07CB6258D78ADF18C39E627AB1CC91D7174FA91DBEBBC824025309DD03FCBDFB72995C9F EntropyInputReseed = 026E9E83BACC67FDB828948664A20443827A31A9E6CF24B3 Out = DFE6A6F6E4D967A49C694E36F75611663F4C52B7FB723FA07EA10ED03DC49D82F9EC308908FE4F54A3C48B991D6B34CF57179804105FE5AEF7D428D101ED77B106F9CE2EAFE3726570F2416F701243E5BC9F5731457B64DFE30777CB46189327C5B42C8D4F9F97AD8B0AEECC39978048 EntropyInput = 2F7811AB4852A0B53C75C63EC187D8B938D623630AEC2263BB15342EF51A854A1A362838 EntropyInputReseed = F34FA6D3EF24A257F74E4A7A6409E6300949407938A53114 Out = FAC3DE71F942CCFC4D43C9DC357B9CB8BA25637952446B8157731E70F67A48FF73770832FC287CA8A53ED09A07F37B3AFC2365E71E82EE6EFCFB9EAEA4A264229F009110F350AFB27AB897CD74A3B0AF5893608F55FC3A1DD279FA0E28EA068BA1CD486A7F41098EE5F328C876FCF7B9 EntropyInput = 5FD0F7FD210360E9828471769DCD3A946E610BC50808E1770BA35F8FAF6C8D6557BDE2FE EntropyInputReseed = 851E593673F2F4621628808B9F7AF6FB2B2A60F2E800933A Out = EE5B70E0EA56FC77E1D3BE87BED47761AD88181A7165E747EF3C39BEED8021ABFE55373907E159688FBDC0D1E9DFDF46AFF659C3200B698555B5C62FBB34B4E207603DA609FECF583E7E783631B1BB472EB531EAF6CB7AADDE45A1CF36CFF87E9727ADE2D6E2CDC9015506DCFD0A22A9 EntropyInput = B94E2BBFF7A84CD9ADDC7C58FB189C4AE6EBC9C7ED877610981C887029D641F0E165E4E4 EntropyInputReseed = 3339CBD3B27DDF02B2EDD5E6D0C635EEEFBC3FEE1081F794 Out = 9953C6D366DB7B0C8510BD3AFD9825620B821BBD92F8416935E173C92A181544E9F4556599A1D6DED635C461F07EB506DA5E23748EEBAC89EB3469C8B222ECB6735568209EEE6AE06A76C321A54F1430BFC75AB22051456EEE66BD4D5F21427C6714929171D214E55560EF27B4024061 EntropyInput = 61014E67A12AB1C1664B8B5295B659C2CFD288B4975567EB3476D6C266DA569EF4472000 EntropyInputReseed = EC0FD1A984954AF6D44B21C2023B05CAE2B5B5394AE60D1A4E7FF57003E41F4270CB29AF5A0E32462CB6E20C134269CF AdditionalInput1 = B34CBCB75C025CBF82AB88F3AB9928C7D32B4C14A28FCABF AdditionalInput2 = 106E0C84C362DF2B28466FF56F0074EAE6218041DBEB960F Out = 6AAF44644FF155A907DB4AFB066CF7A7876C54F2042A5AB9D6F42822E1358432CB9B911EBF773A0B9550A688A2942AA65A69CDBBDF1440A3FBC51213F44B96AC1C577216D44C5CEFA3E521A8CACBFD4AA60149293548A2C3DE7D041DF9A85335F9FF41977DAD05809940F250AC041150 EntropyInput = 593939E6302A3AFED7118DA0C483C1234EC7BE37F5E9DAE3127C3EC903A2660499810936 EntropyInputReseed = 6F896BA1FE76002456A3F6AC6B7F98802F6F6D355441C9558592DC13B044E3B874A3B9C46ED4DC3FE0E80281027D0300 AdditionalInput1 = A2379CD4DC3189ABCA346BCE587B8BC73D08BD7BDE148769 AdditionalInput2 = A7C6AAEF338568F3DC8CDA0331EFEDBA303C9A10174CFDC4 Out = FCCB39E5061519A22BF4324E4453A2D2959204D71FAD4857841F4A601EA532196C152644CC942AA5277769A1E0BB75C09BEE406D748A879C3022A5F656C1C152673A64A01B354A1B2634E2EF236C41AFCDFA8EC56ADDF0E0995E0B4F85D36D9FB6406AE0D40EE8515B5CA86272CDA29D EntropyInput = 7258147ED9BE8EED169A914256F66EF9A1383BF4F30F61E0C4CBE80DE4A7AC6FD210EE8A EntropyInputReseed = 430DCED67450163391957D8C2EE949564EADE8765F9B5C8B4AE3E1623EAB18749560F28C1284A148DB35EA00F7148766 AdditionalInput1 = 8388C53D43B7C52C02BFA64A13ADB0100F94F2EAED8DD250 AdditionalInput2 = 5F1BFD0DE68C8B5E02C1FA280BC7A8BA217C51249A624135 Out = 77BCEA3E14D6B7CD2AE02D4D50EEEFC7A32BC287D61C5C9CD49D0202B45F5D8AF2D4886B0B1DB4385D1B84A307A8EB7E25F91B79F224FA4F828A6FABC11F9C8386656C158A5FB9C09B233BA824AF33A51228817622FA9590AF3942B9A5E476A232F871F9FACD1178F311B6EAE7ECEC18 EntropyInput = F77DB10E7DC0AA1024D35CCC7FE3BE9D2E684B56438A38D9AE0126CDF1A06546C7A1110C EntropyInputReseed = 97869C32697748887FF5B8A1EAFF0F61EAFED026814D3EB24E065EBF71F40EB29F62D574F39C10521C99DF10DE2F9AAF AdditionalInput1 = 5E5A4501C9D098717980611E60902428214AE813F8024652 AdditionalInput2 = 25333B2BE43F25588D32983E25E9D863CBDBE402C664DF0E Out = B9C422D933987E5D0F28A765FC218C5B3237D04AD5EA276C5BC6D21F977B957CD2AC5B62B5304390502F7801819FBB97AF5607E163BDC405B5757ABC84ACCBA910C68008F90DEC3343CDD0B07D0222274A00F44E8C2E5654F13E4EE4847A11ADC258C96EC04E7D403AB0BD5FEE3175ED EntropyInput = DDD27F79AC6B54E218C684B6FC720826E1C05D2CFF5AA91E7D3A9962ED36C266A17643C7 EntropyInputReseed = 7CC4A866DC1D33794AF35423D8FA5B93D044031629AA56C0DEDB519AE1412E7CB96FE58527C50A617519966C1B4DEE8F AdditionalInput1 = 0C30761676E4511FB07BFD635E09E1EEB55A5A8FB7E61385 AdditionalInput2 = 5C3776E6DCA7F4907ED8C7C9353165DB1618966A0D5AB1BA Out = 52F2BE36714A422FE59F729DAEE2CE41729EB20D3D69B51C9F33A3D937D7F7F6CA3705CFFEB8AA76432C31B8EA01506F1BF33FE906284D625298B4AD3812D10DE633DCD2550C2989CEFDFABDAFFD1A5A193BB4D95343CCFCC73CA0761B5E14C205E76A64788B95984783BB7431D4F915 EntropyInput = 52E526583681FB77CCAC996BA0E33FAE1E0D9DB13B073C9F83241DE56D125DCA3129F458 EntropyInputReseed = D943F4F87ED9660452F99B3AD7D2438FDF9EEFED1AE2261FA99E9E01ACDCF63F436CFC4B47B01125C620B20D01F22A4E AdditionalInput1 = 4377A3C0737E2FAB455179F8BBF09A496FF8BF29AB345D3E AdditionalInput2 = 2BDA3C019F5F34D196A89D7CD269EFFD8B64BDB0C0E0DD42 Out = 39C84116E2FD21BB2FF1D38DB60DCEEAFC582DF4CF2A9430455D47DFBDDE19FA1A5D890908AC6C7954131EA0F2AC6CBA8BCBF551D3406E805C62613337AA1D09CC7CD3FA2467E4236065B72ED24EFD0D3457B2B5026E8EF114890035EF86812F57318E5F0DCB2EB88C5D25481952FB8D EntropyInput = 2D3E229739858708D463547723564190ACF7600A1C68A378B12FE1F136130FE2091CEA1C EntropyInputReseed = 1668C4512A162B4F03FF630F81824A49C1F9225D50F2B347F150F3839126E029B668EBA3114B0F51686F323136E53FB8 AdditionalInput1 = 6EECD80D20810FB96A0EB9C9F179352FD77C0CDBF1AEDD20 AdditionalInput2 = 13E9867EC1FD8464AA69775C9AD3FDC9C6D50B6FB85831D9 Out = 98ABB7B243F237438DC78C807E0FAEB95D89B4F4FC7709FB6AD9DED88D94CEA281A3763DF204F190BD062AB0CA55052355CF5667928AFF30A6B9665C91B4606E13DB72100CFCC1E4F7F3A47F8082D45C1825194C07786096250919F4E06C90CB299B6FCBD7BCC30386FA37B3BB8BA262 EntropyInput = F4F54B40ED03720D007450CAB2367C16338FC43BD7814A8F2CAB94E954799872035547DB EntropyInputReseed = 29796F011BCA6684FB16D2A6CB89EEC8098857EB15A3339213413D40A03529B93AB741F1E9FC1B71CE09BBE703F7F9BE AdditionalInput1 = 0A10B8B009F4065D34690FF599B22BDBC95F8DC7894B9E8C AdditionalInput2 = 1C3CDB4C215EAFFE55559DC8A642CCDA1A5CA3D683180ED9 Out = 16A48216966B2EBC323122DE695C756145C1A94F45335277B00CBEC8C5F165C0D0CAD5C0F9CFF8198FDC802FA47027A8CBE0FFF121D7C5F0279E1C4AE263CFAF061F35D2679D3BC9F733E2B5D8B6629B5085B51C22017E8F8A4B6F303F35C584916D61138C5818DC047AECC40D6A32C6 EntropyInput = 91523AF1DF7B166F7E281F81F5BAD2C8A810E8D05A6B45DED4AA960573926AD56D72283D EntropyInputReseed = C4785D9AAD1E7EF5E3A668542F9C9681C7DD292FA4ABAA0B8ADC386C26090FA4BBD9800C95DD7703B8AD3D905FD9BCAD AdditionalInput1 = 858DAC8213FD11B60049B03789EA3D7C310172DF9AE4F81B AdditionalInput2 = DAF50BA2C2FD49ADB1295908D4B17B2961B569343C8F4B14 Out = 6D2B38B3358341C8C7076DF6229CD873FA268BBC7C599AA42DD438E755D150C7FE3EFDAC2A1145B3005E1BBD0E9E0510A6AE69522EE0A3993BD4FB44439F2621E011E0026947964748E3EDC654BF5252C6C823EFC19D3A44B9528B720A8B2176BB106267123D7002AC1A14E3FC0163C3 EntropyInput = A40B6157DA96965934C939894A2B1F048756C97EF4BE4E641CC368D957FE179A4F85DEB5 EntropyInputReseed = 6FA30179C5ADE0A358769DB141FFC5FD14C0DEE2785FE53C90508E282AFD757B9ECFCDAE199AA226D6201E5DD2F20E26 AdditionalInput1 = C5CF4C4A6D936E7F80795A851BE7EA9BABD952931FDCAE78 AdditionalInput2 = C8234BB857411F41EFF512CDD1406F9A16995FF1AB854FB2 Out = CC9956504E25C6DA7A6139C1F803F911D6BE2BD26F77BC58D1C6D5F11338C8EC64DF9C6BFBC04B8FFAB1A8DF7E2F20D8ED0EC799ED52274BF6A3CA3CA1C9EB777F2F661E2EAA3178907A7FE9E2B4941A8424D70D0EF3DBA3215F614805570CA698FF9957D93636C84CDA96825499423F EntropyInput = 865249FB014A96B497C35B6E9F4FC0980FACA3B7894D032240CF02CC54200B716A997253 EntropyInputReseed = 0FE9F1871F50758F7665C070105075B4A9E2A55365A9D00E26C7641C5DE609EB8EBB62887ADB0D4AF9204A4A9F740314 AdditionalInput1 = F886D31DF2C55767283DB15635E6D33E2C82A59938918F9B AdditionalInput2 = EA4E201CD1A4D5A72C415FFE188FED75879218AF595A23BE Out = 24248E1AA60B89798299CB2CFF2AA6DDAA5E5D5FBB8D9BC2448DAB6FF155CDF6ADAB9331DB88DB71716128FF7166DCD8946944C2E6CDD3FB1890592165129B184D7677CB44A2F18B9581D8867ECB78A9ED6F54A6136AB5B66C7109365520C3CE194217A417A3964ACF6E8560AE0E4B1A EntropyInput = 7099D9E0132D292B67B4D565B1094D90B79F8D002024B078AD274E6C47A1EA1189F49DA3 EntropyInputReseed = DC12806D1F38AED6FD3F5D51FFE8A60491E3B67A88E5055F8EF1E7866034A8951B7484B73DD853F363D18025658C0093 AdditionalInput1 = A4010511BE37DDAB8FE9ADD3B37B3D026FD001D64BA00F71 AdditionalInput2 = A2154A45364E7948A07EEC860C831213BEF2C4B4B9AD5AD7 Out = 9C8807FD80F08F00FDC0DA5414B84363635C2871C1932C6AE5579535AC09321BC7751860AB33A7733CF8F35C5722479AB89A12DD79A8B9E13CE69E13DE8C295751006B0A58C548A1160393037CECB915EDE8667F92DE77D541AB65AEE18573DD7D00906567C5525B98F2A3B0DAA0600F EntropyInput = B2FF705879CBF5AB05F4E378100E5C16CC6A0D3CB29432CEC0EACA93CDE1F4DFBD135B0C EntropyInputReseed = 25BFCC540F91A7DFA3DA2BDF8D5E69FFD0FF4E12E001030B71752D12646CE2E5FC5A40545DB005DF5460A612AB3AFAD9 AdditionalInput1 = D94046083220E2AD76770985D5B4CE742D9E7D0775F0906C AdditionalInput2 = 11BE21E4BF8031A6F285714158AAF40AFE27CC2892ABB143 Out = 2184DD8A86FA211DA70623B7B8EBF96ED5253298DDF1FE3E3539C752F4413F973CF268D053025439EEF6B249036E32094361FA67C353E9868CB908BDC21449900ED7270B7704DB130A34FE5550688F6BB1D1DC7F13254B0C9FC71D738537607D49A9DEE9F8F42177CD410F06F154275A EntropyInput = ED3A96753CCBCBA7C226E87603FD1A6D6409E219CA82B52C681F33400C7375E5FC6B0DA1 EntropyInputReseed = A6F5FFBC1E78BD2E0CFDAD57FF16E6439E2B2252AB5060F40911C1514FE546E76971127ED5C99EC225167AD29C51E1DA AdditionalInput1 = 9EA4F5E1890A024DBDC243FB91EAB49E97D25120BC30AEB0 AdditionalInput2 = 0827599F2479F0EE9E9CBF329B2C90AF7577271F57831C1D Out = D70D9459DED2D6F7CD1ECD6357F5FF7852F79C7B6C34B55092952DC4FBCE1D4F24C63AF2A6AC453F77C89F7267A1E04934F2B8CD835E6C54679D3044BD7FAA2C5B5CE51F5F2D2B970A21A37ECCD3E674A1780F9C2BF8676D11E878D2AA57F0027E696EAC0C93AB8F448F41EBA7B693FE EntropyInput = F138302D3EE98B9D806F06BF2040FD42E414393D319968EBDCBBC97BAE7FE19B5F8E4E70 EntropyInputReseed = 604176462EC4BE54C8BBA30DC86321D2D0450297E91AA447F327106BB9037D548B0E95289FADADEF15CA0AC24A0C6600 AdditionalInput1 = AB42E9A2F162524577284832083D162AA5623E6944CEF237 AdditionalInput2 = 17F3438809AE22FC53448A5BF9590FDACE8E3173836C8111 Out = 50128246F098745D6C0D363CC93AFF73D04109CDCEC21840E793BD9D4B148A62158F538A7C635E9E6548159C308EB8D4B4303CF861071B4F24C8988C33E509AC2057E380F9A6AA364ED3D58AF2EBDF125A72DA4BC60BCF860A4096C47CBC045DB6957E0BFB87DDE38B532886653313B9 EntropyInput = 3B71C65E1E1300C68E76DE1A5EC78EABFA22C875C7237562533393BCFD221C6685C9FF8BF3E6BDA2AB7B0B0C2E348982B6E327764D3516671EDBC585 EntropyInputReseed = B948E90569624B7C44C3511E17B4C2AD244CCFC0E506FCC0 Out = EEE208BD35C9A14F3F4C785359E6D4C52676288FC666A0F375229BFE8AAA856613EA97AD7F93E844BB49D92398C6BBC2267ACE706FB04815E46DBEAF40B311564BC740F270ED127EB3C0DC5393784D5B8730A22CAEE381E4959D73793ABFDFFA569B540F7C912E5B3B688FA09FEEB284 EntropyInput = A199266D41F50D4999F35618B3337ECC7F163DB01573123EDDA762EA9829B39FDBBD0CFBDA46322DD16235CFC286AC54FEF17C857858CF512D286AA3 EntropyInputReseed = 464F81AA506C27A9A4168C686411035D369DA4B1789A715F Out = 69A396C685784E2C686F6576B13CE044A0090F9A83994FF901247DC79210C5DBE23D42C5B583C09F92822015F059AC5DFC9CF1E57FC33D1AD4110E749D8257A43B793D66F0B9CC81FE559E4F26E64C5CEEF3751FE565666BCB1587F4B8A1B3DDB47118C9A3E9894B39C1A80EC11D527D EntropyInput = 81A0F78AE6A29D521E73FDC4D2E7649FBB7EEAB2D5556690BE2FF4EEB91D06CA10B964DFEEB22AE039D342940154F9C28EBCDF25D1B4D1E1646CAD2E EntropyInputReseed = F5D522B1967E7674A721D4BE134886094CFB6975BBF98A04 Out = 0824D955F4488FD2F52317737D931DCC97EC33B169E7820ACA3C7534DE335A8CE6BCAA9F603419B0C5789043DA541FBE4C8D2359FCF740EDD789F7CED0D584812268E0273A50CA87DC3E0AFF6EB6200A6298386EEB9D5384385EF491C865C1A2D99DC8A63F5C98F41F85DCA33436FF82 EntropyInput = FEC197F746C4D7F4A306363C54A11A02647219AF014720E5B366C92375B4108E20D3F040AB98C401196A3A7F60F8F30A059636C240FC2302A1DD5A58 EntropyInputReseed = D3CA8AB4F510E98E89031C15F69AEA0310CBE16A8DF5BA1B Out = 0120DDF4A372EC7164BDCCE359C5BF312ACFA380248320A8E5BCC1E65C7D2F36E53E2D795D8624DDE7151C9BC0E1C7AEA5E0B1A43383FC3B282E19643A95081B61F3502E94BC8264F563F51CCDF0659C5A409D4EAD609D25E30D49BD72BC0917111DC727F8205B83DAFFAA07049AB17F EntropyInput = 1DC360F5B069195C190F21202F279F1AB12BBAB9912CAEE6FF080F1846357A947ABAC9FC561004A9BE02C7F1E4148ECE7D17344D76E3467C26E49976 EntropyInputReseed = EF62012760E647D3A6C88CC4A58FDFF36593D2F794EF4BB8 Out = 81CB01B06168A1B474EF15E95F677182CEDCEA3591FCAAABC1F4AA4B1F8CD3A1BA0EC3B7FBFF6D9BE460A0E1FD888F4445DFB60AB32775E15031AE322223E7DEFA18E95AE3ED2B419753FD6DD04D478BA303793E4EC20F6F36BB7FEE52A68C239D82867BC079B79919ADF0715230E305 EntropyInput = E5C25E2E5FC0317392A9958C8200C91FB76BABF325939DF2F0611998413D4B87301F59E9BFD6F8514360A3B9CCA7B491AAF140E9DB1C4A1A1CE95C9E EntropyInputReseed = 85B02E4586A592AA1E220E5CBC6DF3899C01CF3156335E5A Out = 575B0370B14EFCA71020B2D68336A93278B1D2518EA2B565906AFA6E1CFF20880D59A43975CF81D4D3F639CECD56C7100DCE9CB794603DE09C17C5B4F32579D05AE2351128817DFE93B7F6E15E5F5AD1B0D0B90606AF1374205E3B3C08711135AE7F8B943F5D9567C6CDC8DA313A1F20 EntropyInput = 4D9B26E5CD3071B2393F81ABBE89A5F51D5A97B604520BDC5D0C1720C64E45322F1708A10F83D58884E6502A2F55836F2F729F074A933F798AF4BEB9 EntropyInputReseed = 31845159BA64BD613170F10BE42673DCDEE09557B78298A3 Out = AFABE1AE872AD7B046B6C2D7EFFBFCA0475B57845B88326E83492C14C58E76FAF180064D8B6403F8E6FCB70380023FE085FA992B898411843E9C7B86F855BCE1C26CC383C94B10698A0B5C8440E4B129CC4227F23670B06985E5011CF45BF56221E101295DC92277923FEE406D8EF26A EntropyInput = 06D96F22CD2E040CAD60A9E1E615BFB32E24A7793E3E65B70BFA77E47DCD621DA030D5F0D0C11788EC5D8A6E1136225662304EBC030F9EDD46F407A3 EntropyInputReseed = 2116A8A0E93C75800EB60A40A6EFCC0D53B3E630CE7033E0 Out = BB8AFC873A830BE08241DE7FA2A13D5445621C739A2106D6FD17BECBB919E813694697CC165F5DEFDCD9CA8146A0E923B6A1A9117BD12DE71E972397B3C08BCBAF08D3D178BA775057708624D063FA24CA35D1436C15CED02EA335437BFCF231C8A3C6FBB15B5C8B95C5F81B654557E6 EntropyInput = 05C025DFF91622DF62C2CA82547BFD848F6C63FB31426BDEFF7139A52FD075CC48EDCEDC8D5825C8B8CAFD977ED197619A667B8C6B36E8383148CC4F EntropyInputReseed = 654C7986837C991D38A4B900F81763F0A5FBF20671E1627C Out = A0D76665262BF037004ED90AC91FE6E56F124F356DE0D8D09B60618B24014E524304D533A72EDEAD9D9050383042DAECEF27674659E114C424EC790D41E6D760F60731D4AF84E67B3B800A83977AD41A6C1023C6889DCCD0342B2E2499FEBD9E3EC3F62A160CA1EFF936C76A01E579DF EntropyInput = 30BD9DFABD680071017C5ADB06C5701FEA28C5DF89FB128F5B5C02B0C96381EE49FD5EDEEB2FD5CFF622F943FBA95F727A6D399D8221320BFC6FDD4C EntropyInputReseed = AF22432AC7B47C2C98B7025DA58889BC9F712A583BDBB17E Out = D616985CD78766C33E4D5F6E34C98B379686E6759330324B777066027F3926B04C305D3333FB455E40461A45FC9BB306CD30C2A8D534A3FAF1D27E71A18326545398B700D6E5B221B292370BF96A9C97565DAE1CE05293A4FEA4D8D4A65194027A5B292152EA394730D5ED8E7309D44B EntropyInput = FC8C55C96055A1E3670464B30B36235152F9B45FA41089A9193447CD389EBA3774DBFF9037CF4E186CB162CEA7DA75151038BC4DE6EE086EF5F425E0 EntropyInputReseed = 88C7C638006C8A7D181C928597D0EA6CB5130C734F6CB4AF Out = CE821B6D7F530DD956F69C9BA2B059D9075875E8D6DEE6E981B3399B0ABA0C2875510276DD0DCFEAEBF2915205F3B8A68BDD53891D048FA26566F0A5674319B3EF73A26963D4ABD2F503F1C7E5E9547D8526421C68EF3EF2BE7CBEA72FF83244B28DA7C72D149823F4EE242DCD0B53F1 EntropyInput = 6651DD86E1DF7245D3C0980E9AA8B40AD7E82C4AC620E9233E33D91E09B2F02282E5C79CAB6ED236D6050E858F2AE64EE453710FA43E096EA046E062 EntropyInputReseed = 8EE055E599D67D6218787C3AF6A0420CD70C66FEA9907F92 Out = 2C2E9C197C2E9F2F7AA7BFFEE6C7B3EE8ED27BBA5418007EECF02FD0C82740888320041912F26277A44D568989BA588798B5521C071D59939A2DFAF6594F713214FBAE1609C5634CF755E180D28B5B9786F82AEB7AD2AD2567BC1602504A66DD3EE4E47D4634D2769CDA84226182F394 EntropyInput = 0E75F059024C4942F4E40DD09AF07D7344AF593D10590FBBC853CD1561D69D70B1423C7792E877F30C4B95CC7485158D536A5D70358EC07D059D5901 EntropyInputReseed = D0786977072D825977CB5922E18FA446A635EBCB07A21674 Out = F0BC92CDC73CE6DE93020157C0BA218F4CABBE47E07955CE2CB3D73372709BAFC4B13C28EB126FA976C7DD068B74B42DF37B6A9EA5E323FBB2A5A4B05CB5F9E4131E0298F93FDC497DE86644831220E4FA94B768A9693692DD1F1A1EADC23470F0971EDB515EDA75C73F27A50FF70A0B EntropyInput = 9CB7AB4A6ABFA33E757247DBF5F4917BEBA9C7DDFDD570E948703353A3B6AA174AC1F7DA2036F8C933A7A8746AD8C8DEEA7DFEEEA6182AE2724C61A0 EntropyInputReseed = 8B52689F2342B921A67C4F67EEEE9613949511C6952A98E9 Out = 5F57FC421FF0A4B19D1456432F8A56960CD8C8156A8013B70658A6493A815D1925F856FEDC0258114CDD2813C23B908EE4278EEDA86E658C319E327227096D4B4558B8CFC327426DB1A912E42C66FFD3B583BE8D96963701A1A58B3F049084C5FABB886A9347F2E3D27E75F12C786D2E EntropyInput = 8C41F48FC5D81C1948A246AD78D4B520ABAE54C46A5FC5052084A552597F359B5237214A9B876B10C1CED818C0E7C8785074EDDE35167C838638139B EntropyInputReseed = 045393DABD2F6627EB49758C506E87486E22B1CC4BBBB061 Out = 45EBF0C7FE685866517C540EE2C837ED3FEC0ED90A88ACE6E3BBCA6E6F9E80D0EEBED267A0DBAF3C95CBC26511A44866F8DD780FBF92939E72A638A70A46DDFA6D1E2201FF48550154D93E7A9784A2DC62A78AD10E45D4B6E975CA853FFCBC503CEA7C8D2621A6DB578CE4943B620DD5 EntropyInput = 86BBE70423A8E72E44ED7DFACD115CBB16EC123678CEE7DD8761CB5F88DC388B2FBFD0BB047C7A8AA64A1141B19539C7D6929DE5D4F020371E29758C EntropyInputReseed = 37913938EDED03BB0FACBCC7E9788874B4681E4464D0C3FF8A8F6B92C3C61EEAB3A18C160666CE71487CB8BDA384CA91 AdditionalInput1 = 9113945324C10107C3C666486BF407A184082CFA3B4135E5 AdditionalInput2 = 9E6BC6B2EA742A64802483DDA8F4092E1B7FF73A6BAD47EF Out = 513C138ECF7095B8CF76CA2F68E1EAC77CB5ECAFEC22B4C0488D0B613B8D2E8B3D4E3D3AC2972E3AD8ECA14ED81350B899D053DB72784739AD73FBCD0EA1E64E9A4DFF5AA89F2402124A2FDE9E505AE2DF6A9A2E7D95D3008BE5BB3AAB36D50CFD2D5DCBF30F3900D695186B470B5D4E EntropyInput = 8CAB1FBEBB2E01F09C4ED40EFFF4571478EF8C41FB3EF6D79A95D961F2F6B5632FE938D0862BD408E25908E13CBCCB8B2EE35C8CD77AA584F367B3B2 EntropyInputReseed = BC1D480735B92AAB885F0861B22E0F31C1E92A90E85F4A443F40CADF36C3B11AA91DFC36AFD7EAF0CF4BCFC6F0A9DEEF AdditionalInput1 = 47B76F785E02A8ED60C55A09DFDB7FC6365F91B32C3390BD AdditionalInput2 = 0F7EB4FCE3F6FF3F5D28916591403C001774C0782EE5F592 Out = D1AC0EF974CE3DB46177CB96B302E86B3BD94BD5ECD91ADD5793DF67B34922C27390A6166A2ACC006468F589298CA234E2F381354CBD464D93DE663A57804FF292AD4DDB21359C5F14CA4BC4F36F23B6BF794F4F639D45A6829F0B54B941F9231BFBB297C802F71EAFBA89CBF7CF9C79 EntropyInput = DCF6EC9075153734868D78DB1BE031C49847432137DC4FB1C618A201AD8B7FD01655C2E059ACADC81B008E1C55D3CF06EB8FA9B56726E00A49FA09F0 EntropyInputReseed = 57B724D782711A087E475E493A183213B0E039EDD2EEBBE85A7FE122E0E854DE4036C96C8E0A233E083AE4B683808DAC AdditionalInput1 = 34BA13A955D53323735CDD3BCCDDE91DA44D330E43361913 AdditionalInput2 = E6A270C25FE994A8A8076FF4E5067EB3C807EE1AA386F7E0 Out = 09354D5636CF0064149152CA1EBA3E33596C204CABBC91EF4EB9D1908381F98604A0CC9232E01EAB78CC98F940596A1095E029B049E8E0A8CB5A142D4634674F8102B320174FB362D149173903A773B058DF3E7A196B5237229E1AD36BC96D491194B077C529D26EC8A3602D4932AD71 EntropyInput = CF6D8DD4DFB5C2217D479E9ABE418BE4A842BB0F2F64BD24DD2375C54CB1F2B8EAE388B2654519EB06C2D12206DC9494755F95BBF1988EDF95DBF052 EntropyInputReseed = E51F572C99C2D9A00A2CB2F3FDE597FCB5EDD51656699D039BD0E5660579FBD32C65BB7D3C66499F35DB92B8E47D5103 AdditionalInput1 = 652F53CDF8E042A5B3D618B1F25E964C959955433966305A AdditionalInput2 = 34523A619F39B31ADDBD59A81548938A1B2F9D6D20A36F1F Out = 33D394E853502D0FC0AC2CB12E363E84A6FBEF49E902BA79910A0BE3985556728429388A1D3BCDE8CA23C157ADABE531AA4EE9D055B4EA53334A15CE1AF379BD9529A320DA862B045C2051C4FC7BA467FAE983711FB791E892691A1717C099F3A84F875759DE7D47566165CE486699AA EntropyInput = 402CC907DD7C4FEA13B38D71AF58F8781DEB4ED0C2AF49574E291C9092E86164C608D8B04276A379BC713CB1FE7966BF9CC495348FCA6D7BDFFEA742 EntropyInputReseed = 23079E0425E06C777F080C320505D96541F453A73E3EB9D355E1A8B2EEC0AEBFA3D6478114C323D08F10693B1E841CC0 AdditionalInput1 = 94DD49F89A8C0582557B8EF62883DB59702E5079A2945623 AdditionalInput2 = 39641DD96CF2FF8111471F69DAB1623D627B81AC521ECE6E Out = CDD4356611C557CDE0FCB321E4DF7728BB8B138A55602D4FB56BD6CAA04742F16AC139A706F97C1647A46FEA159F8A9339650A2A704E66A2333F9D551D0E46406E01714A14053D4D4BA095170354E7C24DF3CADB2F1A11E03BAD3605F9FAD0D55C997CFDF5A58DDD310D2EABDE80FA35 EntropyInput = 073D6B521A7AEAA3157C0A304547AF8C0617A79FDF511561F3DB1279266716C49D7942120DEF0BD4A661205AB97ABE72962FD8AE7E08A992A92610A0 EntropyInputReseed = 263321BCF7A2343CB903399D6A8DC156551CCB342E74B6E2CAC63D849195CC8BB1E8413A48E377B72B41BB59EB905C30 AdditionalInput1 = A20DD147791154E93B3DD208E0D819DE12D98760CB2046A3 AdditionalInput2 = F38E988174BCBF19DCA7261C4362323B018A1A79666829BC Out = 24853C3CAC2FD38319D162E279FCD1578ED45216368595A926E7AFA24399236469B9AC3AEE0FA37D8F47FEEF6D4983FAE7970F919D29F2C18F0EE3AFBA14B879BF88B370273CBEF397C921765FD44CA8D74AA0A26C0CE6B3704C2C8563AD38D252624E1E7CB2B3458EEEB139D485B387 EntropyInput = E050EA26B758960B6EC6A5BD8A9A2BE8375FC2BDFE2AE0ED6D2065B48DB21F429C72E5C013D5E85D5BEEEF8EF766234205619DA179D2959BE4109FFB EntropyInputReseed = 005EB97F27385426EAF7AEBC0E8FB177EA59FF5369BBA48D1BC654EB13E4B5F0359C41B1F0D994765210A8BE39F6E2ED AdditionalInput1 = 1943D97CF491DBF6C4338391D036324361CB55C61C81ED84 AdditionalInput2 = 822B36218D1E6C47484C0D8E8484A621710E1F3226ED5865 Out = 07DAD14605C27CA6CE7638C462C793C248C0F13E6CA88E23EDE0842AB22F7933716C6B8A396A574DDB60E3E1E93AFFA8D1A1E84FF128E0E68B30D38228C4098EA30E3E5E98BB0B8EFD3B741E28E79FEB0016D0BACA365166BD3948324A579B99C5B7E25095D9BE809D5E595DF7C144D1 EntropyInput = F9B2737189096E85D7A5A83034AF636BC809CB9C9677842212460C70BADBAF38CEC2B75763CE1FAF69AC8432DAF87DA50064F8BBBF487B659DAB1272 EntropyInputReseed = B605ADADF8C76D9C9D6358B9E93DCA67BA6D26B2BE9DE9D65ECDBD157208B108CAAF194795E0B3166006F017BA71504D AdditionalInput1 = AA64FCA1D8EF5C2DCE4D6081F5B21F8D8ABC3EF2BB4AD6DF AdditionalInput2 = 01A99E5BADC90318F723407BE65B811C0A138CA934970035 Out = 77B5E9151A15F30E4AED7AC080F4A9010192A28A5B3307D330BDE9AE89CE594DCD55C28A57123D95F645E5C6FC1CCBE41E2C68462E9A82F0C8DCEB06E0D4AB67762133C4EF80910ED9E89B296FE1739D89F5C70A7871C2E975B6C0D20F95BD2072729AFC2F417636E9D36C7B8BDEAAE2 EntropyInput = EA70017EF6C98383B6F13B10CD2D5FC0F1C920B30E64EDBAC94465FD25F656DF03D14C67C804E656BB18F55746FB3327DA36D533118607447B27D162 EntropyInputReseed = 97994727803BA385CE143EE55E9A2CBC021B8F1445FEC51988A374CACE7AF9A1E5E9C0D731F65AE4B917C14F028A910B AdditionalInput1 = 6DA929D5D0E0063F4322274FB176133DF058FBD90F2E041A AdditionalInput2 = 6FA2DC13280942E941D6F06002805C33B70C1092C148544A Out = 2EFC82A1786F089C82AEC7DF1A8C1C65B230ACDD93937163A3646B2D06F03331A71B7C58C9E885EF50F9F8EF2B28B0C38AA7FFCCC8F0DFC634FC7A9BE8B80FB94096C02D63AAB6386F9317743CB08A1142D7F5ECB216DD00372A3699B9356B054ECC1DE2950B3A9D9D44698BFBDFF8AA EntropyInput = 8F1351D34C5BBD9B1B52627267142FCAB99C4FDC858DB2F0F3532A08940A7BFC3C4488DC5195BD18A71A855EB7491C46E21B3E4A9F5F9CF19C0B3229 EntropyInputReseed = BA3C85651D29F39EFB15333B6016C754C4CB177B6709B581A03A16F13180E1C5B22FD950E80FD4D6FD8DBF6DAAB90474 AdditionalInput1 = A003DB9DFA6226815E7F41B18A54F08B9EBEA04434D1D1E1 AdditionalInput2 = 032F1824B7F0FDD6335AAE1BED62DF9554742CED08939BC4 Out = 4FE1C7F47CC6615D983DA6B99E0DC813402951EF7981B4B97EA3A26451BCADF5D205B39A96366924E894AF9B7112BD97FC41A4DE9E89E5EA359B4BD24185A385A031325378251B2761501CFC46C6669461FA6DE474FD751705972B0BA36D7200E535CDFD720608BF9BC966D15BFECEB9 EntropyInput = 8E8D56126352668D1B31E963FA5707DB20DFD52BED7D6758C4296F6348D143D0FACEEEFC06CE3E3B9863AA4D969DEFF961F8239598D7CEEE233F2CFF EntropyInputReseed = C7EE9704B73527932D465F2F16BBAD809C684BF54A4F745CE4B0373F3BD0809F96C917AABAC062423342E23EB57EA75B AdditionalInput1 = 3F4E4035E6E7470B500D4ED90271629390F3783CAFAD2AC7 AdditionalInput2 = 1EEAFF0B4D17EC48F1FFFAE86BBACD2015E1D4DE15BAA11D Out = 6D96A469DCBA01B8D3B7A60F66DAF0FE9C557815F389A9FAE782332917C913A8009997FE929B277418109E3C1C105D789D80564307D07EB87ABD8CBFF366E1C497F4A726E6E3797194ECACDC8E50F2C3CCE31CF6B0C74DA0480B43A3F14C14A9871705766E5FCCAFC30F52EE1BF882A7 EntropyInput = 0AE72DDAE5DB4887BB21BB81E3C901BAC9B59615B55F3E5664DF3761E622FA7748DBEC42D9A3D0071FD72910DC6E80E61D7580B143D211CCAB5C75F1 EntropyInputReseed = C24365A64FB2DAF23710D03A690C531A319824E29914ABB69B5E630E0845133FC133A2C6F2CE8ECEC7E1013BDEEB10C0 AdditionalInput1 = 19CDE173F2EB22BB1CF5888481BA508AD36B44E0889EF6E8 AdditionalInput2 = 2B25B7B358D4B4D51FD50D78218EA7BC5BD86C2986B483FB Out = 235F9511451CBE4ECCD2AD889D1A78B38EBE5642B9B9C969E6C2155002150FE30C235D2145FEF94216BAA0C860DF544A864B6BC7705038C9D2342CCAA289F6A7F7DAD2D4E78E9B958BDA7171223A50C56B8897F45E28C56446E1824B8DF172A08FD610AD4C4DC8F869A33B8415CB3485 EntropyInput = 8512BCE0CD36F6314A6304041938C3991CBB51B019FFDD2B6A9C0A1212D7BAC12EFCE903ABA98006D78B00269E9E184808690715CB27A8EEEA7F6066 EntropyInputReseed = 6E56A82D794DB904078B721E54750BFC1C4954C9CD9116702F2E9BD063344AF9C84777E925EE02AD1B1E7A2E72B81136 AdditionalInput1 = C3AF561A1B7B723DE7AB18461EDA08D916BBF8FF7D9B0C0A AdditionalInput2 = 9BF4321EEA3278F06A9E7BD38FC8136AA874D4B3D4F75C8D Out = B9A6DBFA35EA863FD72D0FE6DF41BC63CA89C4DDB0490920AA304BE6D0893AB88730AE2E103E1955371EB72D633DD19C1A7B2BB3373469A96028D96173C015F2C34047C296294B0EE84D92EB15D30C94568FAE541D0439B198FA424292AA2B3C34B55CE67A411F2766A05A2F285A1F53 EntropyInput = EBFD90AF932000B02F824353CB707E6B3414BADA53D27B5935FFB116B9F274CE4820B57C10E8219A0841922E94B4DC4F1CE57882D8E43C8FA56D1C1C EntropyInputReseed = CE06007C370C209D0718F8EAEC543CCDDB8A0CF789469983883A2320ECFA958DFC6A3CFE3849C84AFF081A410005C1C6 AdditionalInput1 = 072E0EA278225DED88EA9689D70F9E23C2D96CC7D01D8408 AdditionalInput2 = F0C91C3B8708BD59D5B04FAF5BAA37E88686C5D9BDDF2827 Out = 6011F0B85D50A637E79DB2C7698E8C830088477643452EFEF350EB383498922CDE0399F252E398E174C1B1FD883B924F1FB96C89B027D73D31BA309CF01EFDFB7A0FF7ED0CCCD48919AD4EC3FB03B44C36BAECE91742BCCFA41FF4003C1E4539C45308098B52092B07BDD6320F6B8919 EntropyInput = 757C52A2D246895FCB227C081A25EF2753969FCF6B911A7E584C816AA90D16432AFE8A828DBF7A0200E70096CA727A99BF69EB018DFD86C126B88617 EntropyInputReseed = 3E6D3205AF6A2455EB2F414FE758FD01FBF10859672E88B99930658D1AA36F5A9977CEBA570540E8ABF94819E0090C8C AdditionalInput1 = AFDDCB331EF88024170F6A1128828ED7C2EFCB36577BBF13 AdditionalInput2 = 0B23B62E95CDB6E298CC923E1F084453CB0F8217EE9FC4A9 Out = 88D9DEEE80CBC4C675C452A966C6B6C0171C8B8DAA9D04894563F5A439FB25D8BBD5CBC5C2EBA1EF44F8B0E3EECDD2AD2005F301F96E04A57856C3D0206BAA01301AF7CA9F6F7A3FA76016DDDEABBF85E47E2904F83F0FF73E833BA5258D1949512B9A5251CC570E047D397FBB09C020 EntropyInput = A25AE874A371EB4E286341C66BF672A17BF862B0BD9635341591893017DC64BED56C8D23 EntropyInputReseed = 3FD442155EA2B0042F10F2C96FA7D95AC76E28C9C6188DFD Out = BA6416688239C08528FE0C634C1B4A935969E2A7C29716F83C5B9670A68512A8B653E61B4C51EB15DCA75715EBE86E012568FB9D86947327A3BECAED68BC036277C2D19A705B933C2C9D31EC444498702AADDB84C2E206EA4FABF2211672529E34DCC8876C26C2E1B1D8F0D961F34C5E EntropyInput = CA866BD467E9352BAD8728E9E00CCBDF2AAFAB0F5A7D0698FD1833822F83012B9C51F679 EntropyInputReseed = BB926CC5A3A6E4E7C9223363D6DB2EEEB98EB23FE776EFFB Out = 1EDFDCA576ED504635D462370549C6C10F4F3A59A63F4452E151980803D5AF819E8DCA77EDA7A853F1EDB81DC84E22FCE5089E903ADA7C8BEE2F10A9B7A079EE2EF0381F7CDC158C86317B2DDA35D19509C00C79921FB422BF36536721916D16C7B764D7DB4791136AC55A90467C39C6 EntropyInput = AEE56C125132C629B3868DC6EB654133B455C0212F93A8F04DC32ADFAD3DF2A49EE4A07E EntropyInputReseed = D3E7A27331F41C98406FAA3FD1E759F1C8054B9C1923456A Out = 64E2C30148242289223FFFB9809B90873DBD9A39C068162F3C22A46730567E2140DECB167B8C94EE2C2275DAE546CA277FFA03A7EFE8665BD4A36106999FE31EA438E49ECDA0B7750730A84BC9F23EDD4800B381A1F73AE94D5C41544F91D7FFCF50A52F7752AE3EA4F7E2E5A7412D92 EntropyInput = FA7DF0629177CDFE8874212C50DDB2254EA26AE9719FAA42B518878B86BFACFC1A16EDDD EntropyInputReseed = A58B1791E5900161677B9F84F2F514AA9F10164DB6E24078 Out = C8452DF036B309968951D17CBEA024F054B4F6976898A0D1E936228351FAFD903594266F6573D665CE2EC6565E211F048579ABABA5F13BB814F10CFB2DF910E46D6E7947218CE19D0F69E9D459B0250E795C1C234AAD7E7772326F3486E2E8A0BED6B500043D2E9080EF683B6606B46F EntropyInput = 1BF0B1AB1E02087055D5044226BCBE2D54D6B987C9C7BC7EC7312A50ACB568FED73734D3 EntropyInputReseed = 312CF869D64E083100CD3AA91FD14DDC70531BF06C75628F Out = 7D76000A728195A00A98FD051D798C3A4AA01C683E11653DE21B7886352FA25D7D8B6095DF79A3C6F89BAFB4FDCC54896AFD4EA71AA1D5BA3A6DF459F5C1BC715E343D99B1697884FF0506A7AE394A6E0436BE2960EAF93CDD8FF08BBD07F3CEC24B7356D33546594F034CC4AA7A2D91 EntropyInput = ECD8CCABDC8962F4FF4C5CBA37FAC050705217B33E251EA92B1896B055E15A85484355CA EntropyInputReseed = 39919475C3124B63EC80EF9CC63E4D4E470E074427842AD5 Out = FDF6835904A8066919F5ED0A28266C664EFB912A3571DFBF8980CEE36EB6FFE495E8DB7919EAFC270B9F408056F7D6C1CDBE3541FA2ED90C424BEBE155450E5E327AC51C7960D872BBC4CE90F430B5726AAEF3785BB8557DE2F9B7411819179D4531759623065F1207DC2F6EF4E96E6F EntropyInput = 75B2CEF606F11D5ABA6D60D597419F309BA449007B9E356654F84ADB8E22E438AD5898C9 EntropyInputReseed = D13D374F53624334DB0B3B76DA2202339A5CE47B18E1B78B Out = AE2604A3700CED2588ECACB40D74601C7EFAF189CF608B8E125C6D1465DC98C349B91184B7514C88FAFA34F0871F688BE0EB320C8C017A0C59217D2A8234DDDB262B82ADCD8248B671AA3F1435F6886C563C28FD7573DD239308CDED26EF52DC70B3C516E5A932E8C3BA518BCA1919C9 EntropyInput = 1C4E33465E9A32D3190128377BCFDB8E86B0824F008174CA92F4E3C32BFDB2C0E6AEDCAF EntropyInputReseed = 9FB3D4BFCE53149D0C48F96EAFEF9D21547FF75AF2F53237 Out = BB596E6DA855F46B66DA66CA549F1E96E6FDB174615E5064ED36D374A97FEAE3369F171F4B902A092CFD90FBF3AB77A8E4AC9E51956BDA022E37D351099863B52B37517788576E26C7D7946DBA0BFDF03749BA150EF1D96EEAC6E86AED61F034A55D1A65D56C55813092F8466BC32959 EntropyInput = 542C6A24D33F522574F6E747227C84A20A1066E67F2F882FB0EC022E24106181C9F6A616 EntropyInputReseed = 3D993D0B91DF31E723EEEA00E9E3F06A625875218B25309D Out = 81B134079FD83D7E828589F04AD39F0BFD55791FEE63FF07A919007ACE607E2C77AE9225B55F734CBCBEE7749A194352ACA3D84C2A0D7849E7F57DB9031841C87002405504CA723D4020FB7A1B109A66C2D5E48B4E91F4B1474CA4209254F50C4708562719AAFCDFC7472CAC6EE47FEF EntropyInput = 25EC7FB9FF138D761C166930F7BA5B6E42718B996357664292EB6609748D8BDC3C46D567 EntropyInputReseed = 82EAFCA8BB450EC431F10505C80CF2359922B42FCEAF951F Out = 67CCC2E53FD5048B51A2EC35ECF49602A1CD89D44AF54FD4A82DA9731DCE4097547418A82F93F97DDD0E2EE35DCF6579B02EF98CB4A1995E36E0C4BF94AC1045E0CE6407BCBCD140C347D9DE8B73EB7CBBBDB8791D2D8AF8CE52D561C75BCB2902041BF14130E46ADFD39E85AA3C279A EntropyInput = CF18FBE4B5E9C604CC10112699E6C0F429241A49EC5E54D6AF99A459C9DF1E55C369BD97 EntropyInputReseed = A6458ABCA9FAE7FD9288A8858C6BA5D05D414B920F08CB22 Out = A6AA0C03362908967E02C387D85878B5CA7F6B21266214B79AF1AF8FEA916EA42FFE520D5719970085428780DE6AB401D5A910A4CEBC338C645A363BCB1971F42D0FB61742447D8336B8C7C6DD971A6A60346CD5F977359B2E66FD5E17FBDD9E109915723464A28AEB323B9EB6ED5823 EntropyInput = 1B874233D173D4833C144BF89497C9839CA3F4C757CBF3F33E080BE7716D007BF1580D69 EntropyInputReseed = B396E3EDA7DA21CECC5CB0D035AEEFF5EC2CC0F2D422814A Out = D81B6CF8147E4F6DF252033072E75E8D5A946B8FBA29CF0EF61C9D5194113E62B97F0C06F6AA40FC8182B8D6CDE209B27E79FD12FF69E6E73C71C7C95268C0A01910DC955B1824A7A56FE09B445E99D31763E45283E53041397608BC1345BDDA269EC3275B07B88561DE1DC52D895324 EntropyInput = 1FE904788516EE55E579A80F8F66B5D8F2AE7C5BDF62B6BB1064E68C037B2A7A7FDE54AF EntropyInputReseed = ABE467F3CFFD299B183C2C602B4EA9272BC786DF9566F04B Out = 929E96217E8042C2A1B2AB5835905027D5B9057F882FC5229E6C0CCF2C05A089AEA1CC2E034EC0A0130D291AF9CDD316FFA0AB0B436C1431E0E747F340A3440A56151C22CE4ACCB3F0212CED88B4B89B2DE36C88CF40F233C136E13726584079590AF2A49D6896A5A4A3DBF3A95EA826 EntropyInput = 44EA83B95D482CB7DCDD9CB843B0345269E0D7E884CB55F70F0DE3CC4D72F3C11ACEC003 EntropyInputReseed = AAFA30D877E0721D30B5D2011DF35239F9C793B3556C9F2A Out = 734D97CAFC06A571A82CEBD2FCAD9F79DAD5320F5D035866564186D2299F039F7DA105F56E0B0A417F0AECF8F04F742F7B106AFE3D773A128DC696B791F0A32437124762610D1D7850BC3492E9BD5AB326AF43B8C554422A36FF4F0DB863FC5F036565C9434FE8EE7BB4DAB0204144DC EntropyInput = 494ECC81CFFE26C56E120D66F770F9A2AF23391FFA5E973BC24185C49B2633FE1EF7C287 EntropyInputReseed = 943D1A01BC8C6C5A83B4EC69D5524A47E8214257B26CFD1B Out = AF0109C0160D78470DE527457B2ACD5E7F30313F9EA6AFA9C375244D06B71EC730845F0D6AE9FFC52CDEF3E5C3190918A34074C2342522BA6A44622F818A645679A6EAA938C2ED0FF090B549FD6C65B3B8C067A1B902CADA34E5ACB7BA4974C5EF90A553CCC67B516C1F3F0B3263C408 EntropyInput = D7A2C0A83A2A2C11744E3BFC2A8CB211F6EE7F206B70A9C2ED6CC950DCB971E89D7D9184 EntropyInputReseed = 6E640025D93B016FC6E873F9C85591A5C7C7D85D0E1F97216000A74C3B65E9282BED6A2F100DBAE03A90B5A2E9861937 AdditionalInput1 = D2EE0902B369A7C5B9E386F8142000126E2691027CCE8215 AdditionalInput2 = 847888747DAAE754FE8C0C335FEE234E86987C99C1FA93BF Out = 9A3E9DAE1343807A895700C8B4C33562152E32970057EAFADDC20C30EF0DD78C264808DD24579587DE76DA1AD393E5094B6682CCA58CA70B9192FE9F559E8C73769D2AB4FE04AD79C94F575D1D62CAFC24DC8A6268944E7E4EB568AC56362E2A5FB2BEBEBA81BF06D2260CA69A44CD4A EntropyInput = F977EB61DBCC054E7296CB10018769D9F3101FBD680C34DCEE8D3747D252C8CE80455F0F EntropyInputReseed = 38FDB93FA37C5196E6979F113937E2F720A8A61A8B273C45551D7A8F3DBDE598A1737D9835A6A515152B2C7E391E8670 AdditionalInput1 = E4A5B01E1360CA50E9F17E1D69F339C28D71689B20760CA9 AdditionalInput2 = 4F336988ACBE1463348B8C02326574CC5036D7C70FF7653B Out = 41FEA6133EAF71145BA008DC8857D6FD8C6C15C59B4D53423FB50A070D5597CECE969A8E7DD57939374715490867ECD9E63CEB738D7ED05D22E3800BB1A7A520517ED8D3C484851CF367BF175244B1F8668AB421A33D88B5D11CA08E53A79D468767B5603FE32AFCE868F62A552D831D EntropyInput = C4A37D7A917B65FC4FE99CE8FD92059CC3609A1813E47109D2B408F63F5B4F2B91F24700 EntropyInputReseed = 295A495409E9C11922940A6EF53297AD46351634EF8A5657ECE909018396EB3F21D7C44306D3AB2BE32FE052E8073557 AdditionalInput1 = 3471A1A6AB25C0C2BC822A531CFDDB56449CB0ED7EE28BD0 AdditionalInput2 = 3578C3619A3EFA3C92E13D1C09732A50AB8B91E0350C4609 Out = E6EBE00B03EB4A27EC1B725E04FFF68E6454254838CCA1B5901DC3DAB0C5ECA7D09FA0944308D12FABB5BE9F700CB6C2E488224988A84A6854F90297D6F12DDE2A2354381C7991C38E678063E2C73B2D665132259E5F9906E0415A8847C99C9D5A3E186A37A201B6C7C82A1FA17E3754 EntropyInput = F475CB1B7769B1FCF61E38918AA8E5A4A381FCDD8950547C82EDE8AC1BE0EC5887A3FE4F EntropyInputReseed = F156FB33E71C62BBCE53AAA3C00E7A90ABA07E21F92AF9668FF51AE9B8BA8361106989998519C8200F9CEC9B93049075 AdditionalInput1 = 2220D47B992DD68F6A2970F89A3738261A35BF4FE95E79A2 AdditionalInput2 = A91D2EEFB047DF8C0665ECF75BD1A224A24589346FBDF548 Out = 8CDA89634C14BA9F6A2098E637BD6CDFE81AA9BD2920CE0AECC993A4DC540AAEAEBE3A65BC02788C677583A0A0A908652E6775091BDFEC543AB2402339B1AE0F1E3C4677C34EC66EC0101AE29E3A6DC2A41B46697ACBA4D4F1C875BC2F762597EFB1AC183F4B2904312E8A3143A52EA8 EntropyInput = DD6E00FBC83026AC7B729A8DFC84961E5FB43B8F979CFD3DA778A65BE3D4FA3850F0841C EntropyInputReseed = 02D5F2E89A2EE6A0D2C23C0E5DA88C33F4DD9C73B574E0ACD50CE7006973252011AC85265B3DB34E8B002F0E7892777B AdditionalInput1 = 98D3706B0E579B76E0A5AFD084BBF0E407F81D073B76B877 AdditionalInput2 = 1B4715C41BE7CA1C0288D94543B62602919AED38557E22F7 Out = 77EB70F57A582EFF9A5EE61E433690640FEA9135EAF2BBEA2E20656C1F3642BB7C619E4CD71FD72EB7EF19F39EB4DAEE77571A1B5875775A42266D52B5F1209A1D6AA182F25BF2D403B6C73BCB86CA80A7651D037D58EF5CAC8F8D889354B79D393BCAD5CC26DEB00DAB6D42D80CC6F7 EntropyInput = 11CA3E9ECCE95FE12C657CC3ADD7B013FC47395631BDB3075A56A9CE228974187E791779 EntropyInputReseed = AED4F1B519599F4502E3864E26DBE4EC177BD5A2ACD9ED27579B0362A6731E2B0975E8B403D3284FDD97B52BF0AA5E09 AdditionalInput1 = 3C35E2ABB77178FB6FFBDDC6C0AD065FEFCAD2F08FBBF959 AdditionalInput2 = 22E3FC2A31DD147C2C84FEF14774748068AFAAA04FC91E0D Out = 0D3EC4E7F68996E913F9761FF33EF79D3BE65636EBACB4E118BB2B53F366DF5F2F30B4FBD30E18B418BE13C2EA525213EB078885226F8187EA551990370F1EF9B06CDEFEC1B463D587CC30A0FA4188C4EE1B6C203001405F445D4EE00EFD68B72F398189287A4258820F5B15D27EE65C EntropyInput = 879E713F594D2773F704D4C0170C62042810027156FE4F435747E546A0EAF7F7E0C028F7 EntropyInputReseed = F397601172EEC5AC34891184E37A85AA949A9C8CE032E3229A8E2BA5A5059165826EFD4B15CD702BAAE7F0C3BF29C319 AdditionalInput1 = 3DDD0AD76FFD9FC2133347BA0F71911614C6D90B57E487F5 AdditionalInput2 = 3D437F55531FC76C2595444CA9358A6B88E918AEAA7B7EDA Out = DDE44E58757F6B58917763A320729C4DD00D6DF05074BA04C8130AA8C3C4F66B84DD49842F0B4D6BAAFF217336EA0E524A1BC556165453AF4D55D44FBE5A012A2B9ACA35C39433BD8B94305F7133049C2E9710FF6B314FA8555690D8D73E932DDE8BC4A440DE2834D8F9F337D579BCBB EntropyInput = E882783310318301568C6AD7321B0E741D1215957936FB8F16BCD41D3CAE08B266F72D6B EntropyInputReseed = FC99832514012EA9A67B78F2D5F1120C435C5E0390E854F67578309128F2A7C7634D562D4001EC7B1F7FFC3CCBDCB292 AdditionalInput1 = E84E2915D0D15647482DE4945BDDFFF77C5B8CDD6A08B0D8 AdditionalInput2 = 8912DBA6769ABA9A875684018C84B1AC4EB80DDE4D7D446A Out = 50098DCB290EEADDDAC212842FDBFFCA407D1B1642A71CF5355FFF01419A6E3CEE285C706CD830480D581664B95B6B9CF31DB297377F32C46264E7E61098694F3DEFADF15E49F28C964935DD3B60482AC11122CC3CCAF37365EC9C38AB04BF6C0E02B4F92CC26C0B06241B79B7BBDF56 EntropyInput = ED13A428A0F685C395A8DA1F9C41BAE1B8A0EF487AF81F587E797DB97091ED37410DFED9 EntropyInputReseed = 6F5DAB96589E11574A53BE89A78A46A12B13506DE2EE685BB830AF8B08E68EE8659586D6AC846D17884AB9FD820FE386 AdditionalInput1 = 776C45F38BABF4962C5E6C50C8F413D83D69A8D860676A2B AdditionalInput2 = 586703E2F4C66E4988641D0AF8A01768E829AAE8FA4FE363 Out = FBC526E9245E4E738CA5175893B9AF58A042CBB705CA317C5C788CD3B4547F90E2C9156A247902B89447BBB7C3273C5EC5BEEE3DD0713D9E19ABEB4DE34944818EA1518340F0DC50937061DEBAF1F7E7D7FB66B05BABDB10BDFECE14256BE534587559AFC0E1CBCFED145DCBEE2BC7AB EntropyInput = 6308D24B05CA574324B5D91A95A06333347C9BAC2D064811339C11590EA7229A5A73AFC8 EntropyInputReseed = 8F3FCEE30449DF82337A7ED9A60AF216F23F51C0250DC6252859E5907105E818C2700381D1DB3D3C0A7D56D59D8E5D8F AdditionalInput1 = 0C12053773B23673C61E2DE603CAE1915378AD46C00075EF AdditionalInput2 = A2C0751AB6F4B8988CAA3225F56957E7FB14F3904E68CCF1 Out = C0C1601AFE0752EA0FC0AC126448BBBCB431BE8EE719FA0190D43B21F7E5075180722954EB0488E9A8AF3A3858EBFE42C8DB3EC1F63FA0369CF3E239C6D0AFA6A4ABD20176B226C6A1FC722342BABC19BE940DF01273FECA23D407DB7FB6BE91BBD7E9895D10975409F51F257737F5A9 EntropyInput = ACC66FE399999247574595CFFA8C374E084190FFAB32BB59654D9864D2640317146133E8 EntropyInputReseed = EC06649A8914446F69D7650B4E56A9633BDCBB77024D868B70E2971A104A6D0EF69833AE6D85182E44CE310A480DD3F1 AdditionalInput1 = E4F86319A1C221105E7C5B82EB70D85F13861CADA0AE0330 AdditionalInput2 = B1115E89AAF6D14F66DFA6A917F48A3A91F46F15B09E3033 Out = 179B60DE103CD73510AB2143B0F31E904E150C0699A4C74CB9B2BB3CD3EC607E2B841C62E61104C5876AB23BD53934BFCDA459A523FE3344C14EAB88210AF7F24718F3AEFDE59307414E1796035525C4FB284A6F28152940CCC24BC03F688CA41D8544FE4A49C0F560C08FD4839721F2 EntropyInput = 6B8FF645BD92925713801E06E4F8C969B2D0D777888D880AF4B84FB2D42D5E8B16DE5593 EntropyInputReseed = 2F93F020A77DFC417FA355F1A7DBCDE534DF058DA1BBFA5386AE6FAEF2B93EF16CA6FFAEFB320E1FD8FD35B44138EF5B AdditionalInput1 = F916F05F1CB5EF1B792B2768ABC9EF1AD211747847DFE5E5 AdditionalInput2 = F96F23CD500070FD9BAD946C1CB7D6DA7B7E803871328C4A Out = A277D2191CB075F4A514EFBE126947DB61BA9C8DD49832AE8CEA0699975EDA4CA171476B6B160A0A7888E58375C6BCE4A725B58A28A0C2D5C4B1CDFDCA33E9442337B19C282FF249688FFB2D81E68F2CC27CD27B80F2682B2E2A083B960B31E70D9614E98B43743D96D5F33EAD6F6993 EntropyInput = EF06ED32B80F450212F6E9D4E5593A0230B85F820DD14ED8DBEC4407516D591CDE50B143 EntropyInputReseed = E33613E124A156A05AB3DEE4569F0668EF4022F44279F93E4D8483D29C0F518084CB126C245F3287524DD7F25679CE17 AdditionalInput1 = 31364A9651B546C21CCFA44AD9872FDDCFE9D53AE998824C AdditionalInput2 = 9C39316EA913E51D66CE526F8B29DF968C20D3683CEB1FD9 Out = 77530B2C37D278153CCF2A0FAD7A4AA9479A4EFB5D7966588535AAA1CD5278E6643DCD3F9F7D518E16513049AC6B68F56EB0B11D982BDF56C6F5028EE211C38BF0BF048BB0F75B2C830E038B0B58EFAA442B69C1C29414CFC63B12AC1D124EDED850A99D1F1570DE755AE4AB6333F254 EntropyInput = 2442A0A76415A8F537FC5D7B8FC37E612B1A13A239089EE6844F00E322E908130DB51B53 EntropyInputReseed = 13CAD2FC0C1267A3439E5ACC735A51C0D822A20A0FBCBE5C7B5B3353610E59770B492BFEE7712A032AB2BB91B9443435 AdditionalInput1 = 6113FBD5143C2C8120BCA6848339B6E94A55CBAE0078C374 AdditionalInput2 = C0AF633D238195097A5E4C761174817709CF98C7E6F35999 Out = A79F4344D489F97999E9997CC18B9C3F78BCD6D69BFC69F4D173AE44A184F738B8DC418E9C39F6A0A70ED28431C149FE7897D0D65EA649783F3CECE9DE94C2391551C6EF44064342E0759E624D1FB7B2CEB12986BCFAA8C0EC368EEF4DB2308FDF0549576C47410928DE36707FD688BB EntropyInput = 8817A837354BC602194FAD0B48F2B999E9473A8163EF0805EC590933FE15D0C51B902B68 EntropyInputReseed = 998F484E4047923DEA113A988D560D16F2A922A7C2423090A8FD10EB64A2F8D60E8658E35243EAE8DC23A29F5DC746C1 AdditionalInput1 = A11C531F90FAE6E8143E61B56C1761B7230B96AA3D6F7D4A AdditionalInput2 = E1014E8205DD0BAC28CF3AFB96B4157626918A773576BA52 Out = 876608A4DC5CE0C4A5F9447CE3AC66CB668CF50022CD07214085434DA06A62AF8D42E3B1A35FFC7FB5A1FCFA56193E1B1D2B61BA53320EC3423A2D4F4409ACE572CB60F0DD51C97A1B2F6C4B11248DA4D804E6F4C7C0CBAF804684EDC347C992B68CE9853BA2E8FD9B088C84A3E069A9 EntropyInput = 71DB638A8931E94B61F5E915D5E0192863FD5BB089AF44552A6CCEE7FE096C9CA7F3C1D9162B74CAA7777A4141D08AA44E92C329F52DE6B72DDB1D20 EntropyInputReseed = 21FF611F6BA5A3567946040662A0F7C79C7354398A5210AE Out = 117DE63AEB0D05031D4161D2465640464AD1841650B482F3AA8F857BF4CEDFF04DBDC5864D886A642824D55FC7362487C28E130D9A1F057AA42C0372E46BB73D122CE61FDCB6CD65EB30B550AAEA3C2A97EEA12A9EC271258844BFD1CFBBDC022A12C814E4B588213D895CF128F910F2 EntropyInput = 00DB114F61F90AE8E6741ED108E2CE6494D6AD3125FB44BD6A3748EA133EBA51BC6A324EDC99DF59108BC30B951EDF84938573619E4B1EEF1B8254D9 EntropyInputReseed = 8976AC2A9B383FAA4073FD86FDFBDAFEAE02FF8E00FF05E2 Out = 9AD52818825E3AD421DC25744400BCD55C5E33FEB1DD9F196877FDD1AE3D8BE596C0D7AB050174DC4E6FF796E4FCC0F6B6E8A52B4765A00794B4874524CA2A1C9ECA692EB1D24DC7A7CF810E16E9025194A8B0CA0DEC3336BF1A336F284CC0E36D730CD2AE0577E6F7D851479D6C0954 EntropyInput = B7E10037725D690535AE1EE772662CE5FBD0A79A7CE1073627B57F34D443A7314FCE2841AAE78068A38135DDF40D758DBFCF2A670D7B5E079E8470FB EntropyInputReseed = 17B6E110EF3ECA783822FEFBB2A1FFDA14518637A48654A7 Out = E4C2742D9081C297F52CF321A60F705EC7F4FE05E5B76380A308DC012DCD5C60DC60549B4755F7C717E00A86A3B484F208984E9A8CAEDC78F2110494DFAD26436A9B4099C47570C43265F9CD494DF681C806F74767EEE66EE66911D0A8E2C939FB55D94ECCACD85A7EE72F3BB6B3FEF7 EntropyInput = 9FBD08233E25CCDD358D9F722494FB7B303F490A3CAC3944D31FCDE7E6A7C6BBBEAF19D43719FEFC39558B4331175FDD661CE16853B82E33C4301841 EntropyInputReseed = C26DA236137628BB8E080E8DFCEC1065E085CD73F0410359 Out = C6C5E7FAD7DE8B2EA9EEF4C98533138836A37F1F2BB69D7640D1C993449CBD51C6FD8A0B1BC465037AF3859DFE875F6FA9516AFC274942D0A4259485D0830FF316B003A0ED22D9E0EF9DBEDECA4776D0B0E5E23297D7CAAD85595E61651C26937C4D2C9363137B5607F37EA7B5886722 EntropyInput = F95320E95E6AA94A59E5F52B9210FFA54EEFAF66CC0CD0F09FAD3CE7DC0FCAA180455D931CA5AFBDE9E306E2A56AFB2261B5A8530C4E29306659DF08 EntropyInputReseed = 30E8B7BA749319F771F3E855F4AE536EA10C53EC6AE8EB7B Out = DE71E893388E392D32C4B30882F638248FA0A088AA60B400391CAA564959D363C7CBAD7ABF0C0EB7449141F43AA36785DF82393B61B45FF73EE429723F2C85C822545C93720DA7FB44FB469A105F94853F345F46C6CD61F27B2D8D9F4E3D1642004CACD46A90E6E78C8BD27E15A41A95 EntropyInput = 30A3ED471F0C71E1F0A018B5EE3F5A572A19F490C9651B2B1265FC6D82954AD9FE0A6B903858AE89DAE0739A117CEAEA08D54CA18C739AB105EA12A9 EntropyInputReseed = 14085A1937B33CB3A80812015791D286C9A814BC6EE944C9 Out = 2CC03CC5768AB0F6A8DCFA5B5ECBFE2E4ED33F0E91E2845CA0AF61E3B7A43E1FE7556F06132824D7E60B18E99DBA21F4656A0F4F06DE7CDE034CEE1FD3C774F896D0F955912DF708C57ED727AAF0B70123F833A99F2626A0765E18C3CAC61718D98C187D8D8D69CFB8062AC845CB5B44 EntropyInput = 1B4E0C71C4AB5101B45212B181482E604C297F39DEDAD3C52535AB32FBEC19EB04AE3DBFDE4455F57F6AEC31C92796527AE76AE025DC1A2824819A6D EntropyInputReseed = 133464266D2886DF55AA0B176B44B9A0A3F9777061A898DA Out = 6F9442F4E5B551ABC335DFBF0147E60E5778366C8608927FE055506BB3E8545E261B60D1E2E37F9913F357B6D9EBBF26743E29B8480973FCB23E09CAF5FEA955FACE0F38CE3E363C8E40EA036E6B0A3547F8672C7DDC815441B92F8395FDEF9F6DBD2377994096196A682E7B37799444 EntropyInput = 2C0AE722E1E2ACD11D45A515F6902B04E7A566A68333EEE4A0B6BE5864BF4CBE4DB3324C5AE801A9E5A358543FC8BD085E604614F75539214C13798B EntropyInputReseed = 53C433189BAAE9D187D677BC778083688E5861F6EFA408E6 Out = EA05F36496FCDD38B95B5C238F5D71B336F62FD24D1F9774235832F476B2961F4F05E95DB1B52B5F77ACDF52C4E53BE26CBE90CD3C9914B5E918A906BC35A798CF84DB05C0505766F2A7ABBA6A01BAA8373E6736150A664E44DCDE0AA9C77F17B9C5433342CF0206C8F995CFE5D056B8 EntropyInput = A2D335AACF85E191820F855AFE1C4CEBF4BCAC0C072EE2D2A96B48724BD049BD8B2C86DE3F8B36D23C853B19DE0CA0FD0C7B8A8C8A3C847A3C1830CF EntropyInputReseed = 8654A20575A335A6D19BB4C907A71AB93A82EB80F436BD07 Out = ABE42381D73263DAA3A86C895DA642ACEA8080F37B784C10C5C3A7D6119B6A0D21E06C4B18C1E2F3FA66DA5B1095F4D1379C324692E4736164DA02DBC6A92B263F2EB4F2659A68667C5BEFF60515E4C8FD5CAFB1C539F5A4AE3B25C880DD4B1F2DC8ADAD16702910E2D59ED7867B91C8 EntropyInput = A2D1490E45B4C79B5EF10BC7D8E9157BEA9ECDD640269B70BDD0BDE9D094201A463DC663C95871A8F46373F33BA472DF0837072A32DA6687AEACB455 EntropyInputReseed = 6BE1771B382EE9D83542923A98CB682EFA59DF9FC8F32C8C Out = 9F01D4F7CD697E036D63C07C50743F27DFCBEDB5E939E4389715E3193237EF79E12FCC4CC88869C34C92824865B63D94D93AB966B6CBDB772064CEE8E25895EA7F2DC02FD6D236FEFCFAB85F9949F2DC4A24E9E5500634D843F026E094580A088694E402EE5710D3DE2D4419D2500C1A EntropyInput = A198AC6BBC4775B2799DC2F377A971151A96208FA9FBEC57745F5E145ABD2CE3921264F273DBE8C67329EC9EABC3B03E7D823D57E633D096ABAC7CAF EntropyInputReseed = 9376CBBE99AC4630F27D194072D298E439250EBC0E74A103 Out = 9D96DEB50BA35C535BA42887D7B452C7C609458002D2EAE140BDAEA2E4D38D2EC2D78D6F32CB0F56A0E8F33DD9479515A1EE61BAA7E89DD41F046D3415DA240504673972CF70FD2F27ABD952D00F0CFC8DBB580927F31194C2D041F7BCD81F2513D780DD8B33E369AA833E32AC352DB1 EntropyInput = 579692AE1A2667E746A37D3DE8051B9F632A801DFAC0ECF3AE9F817CE13B6EBD3A1FF000B9E2DDCD206942CE6D6D030B2C35F28C1517C8AB630A46CF EntropyInputReseed = C7A43AA1D9D089248DFB40D17EB3075AB54A031FE7F23D84 Out = 40FEB7DD8167CCDF6515C869A1D0A081F298C1B15ADF7137D7FAFBC130BC2E8E9150F3DFAB325E85DF565530B6F3BC5452268CE02A37923842A6AD3EDD0BE580E401D1E996FF356F9799DB687B2DD36158D072F814EA817708AF4997A6C33A7B8C7F968A78FCE6A1ABC0E4911DEE6EB4 EntropyInput = FF68C531BA056699534D167202791A6D92E43EC5042E9A871D2ED0AB1293D8AB1C50F167BCE17F76F92696AF89F42F7549CCD9A314F7B83FD0FEB484 EntropyInputReseed = 5B1143315FDA61D766DD71789EE2A03E3FB5A420A0533934 Out = 95B480068DF3FB2928A96CF500E08D5613365BD2529EB97EA2B2AA3D338750A184FBD6BA0F46BC10EC72017E76D05C595B3A2E81D31F2349002B26EF4EAA3F6857B914D282FDE58F52F9AF6C26430A9097E5CCE8950C3F55D02A4961F59166B7E47670F5946A63B93337B7E5CA008CE1 EntropyInput = 8691221A722903499B43E0BFB10EC4C6BB7F036D3D18B99399FFC3F9B36FE6C86BFD78E34C8BA13565B5F674699FFFE111B4E1D739B2A46E320332A2 EntropyInputReseed = A78592FCFDDA4A3E1D2CFBF40533A33111BF9FE2305FDD62 Out = CADC7702DEBB14139178F26E1AA8D786EC483C25546E1B7AFB1D71EC0BD62EB614988D2459B54480A9B62A905439763B198DBB674BD91A8B3EDDDDCD5EEE449592288251C5930273E27E157DE15DEAC3C3978DAEF9EF0106108B52C1D628B969EDD5DBBA2E4A5ECAE7D70294C577A1F2 EntropyInput = 2C231FA8FC0189BDF26892E89824684F61B56C24F08246C9460333C6B08F8C635113DDCD2FC44C54D9FE8A922D5877AB25A28C7A4618ADD00AC181BA EntropyInputReseed = 4AFD7A679D6D8E5A81D4B906277B703FA481E2D5EF7D78C5 Out = 4FE825C405746B9F3EBDC9BD95D053BAA9C0E5A63D87A3FB3B394D6508BB60B7A894917B65E89AC859DD940465BA8E5D7A54951595ACE8B75A74B727A86E6CDDE34DC7BFA2343E68D47187A5F7485CAD951249ACDFBD397C45B94ED636FFFA0E365DF29F074CE1A6F11792FEF0D60BAC EntropyInput = AF83FF83A688084A8C307530881A3D996BF4C3B0BF5117E092E82091648B17B5A9F09DDCEA542F263910C2908E810C4AB87F043370D6DEFE7E772E16 EntropyInputReseed = C4DF910F07A02EFCB57A3DDB9B63F81592EDF2289E96F981615DBEA78CC94C0C9E1F5577518A1FFB4CCD7DDD52F34B58 AdditionalInput1 = AE1D54DB4C66BF66D5A099B801CD750343EF016F0083526F AdditionalInput2 = B1DB078D01299791058FBEF53DCF5D7DE9113E03A2AD9266 Out = 011AC3050FCDC2B3F5B9A4D6867EA4769F5A52C955FB34175CB6D052574FB9F2F6894AB2F46FC6A53235880CCE0E9AE6CE0B68F4A33DADA0D497DA809F879E93618040F96B83D16EB2801005713F5D9AECBBFBFF3EA5B994A12EF1655191A95720224A6D8357664B5DBE0653F4F984EB EntropyInput = E25B7499F750991F95CEADFC9CC36EF6194568806C49A9E212502F5410BDB74837EA6172FA6EBBE9D7A0D984B78B8248E8C72BF90956680716A8E8A6 EntropyInputReseed = 97BD5BE0382B7AB8C3CE6FE27765B0FA24F3E50B5C0EE2B785D1ED48A560847861C5D8F4F873A8E9EB8590E81ABDAD5D AdditionalInput1 = B6B9BBD7668D3A6CAA6CEC7111BFB72EFBCCA1100C64BB2B AdditionalInput2 = 874FA5BA23647F6DAECF496927512DD7A9AFB56492763B9D Out = 40F0252BA0059982D721FCF476FC4015D412C2AC425ADC279D6114F6C873BEB636FDFC7B0CEC66E70BEB2348E87C497687F90CEFAFAB42393703AC6C81860DA4F866E9497801E9018D858B3D0CFA1ED65265A995C877E1250AB840596612D714AC39648A725F8EDAF1BB9E6D3345CC45 EntropyInput = 7CBE1355B01B8CC9778734E11E54C44AF5CAC945504087B1C2B56E57CBFB69AA71307CCB164005C66AC92BE926020A6BFA1DAB64463AA0E97D529ECB EntropyInputReseed = 681D8133CE1FE95CB27FB638323C9BA9DD1EB69B3BE9BADAD2C3CA32CD9E396C8E7204EF4CD88291339F110C39E9EAAF AdditionalInput1 = 4EC6D07130327E17855B4DA1CB187D9BC00DA89E9087A78E AdditionalInput2 = 56ABDBD71A071C2FF6DE3610F079FDCD1212DBF3E464D2E0 Out = FB9D3253259B7FA4C6BD55D896A2414309E1F66153033A55B01D990DEA7F9CB3DD78DD628ECC45C3B71B1C1D857599E50A33DD3DA78EE180D23CA0742158735486003204B231371F2B495E070C5CFE295A6767E168EAF71C247200304309024F52716FFF4C08038C42984F00B563C1F8 EntropyInput = DA19D80C83EB626AE8440D7404D271EC934BB41D49A460FB232E8CE61626A0C351ACFDD4557087825DB21132F99200B4F3E4F57E0537544073F34E1C EntropyInputReseed = FB3228B281ED3BDEB91B9CA31395EA56F41B39E30D5B38CE4B232647985ABB5B89AF861B6E712C8499630AE72651EDDE AdditionalInput1 = 13BD9ADD8F0D34D880C4D7214C29582D47E4F7688631FF91 AdditionalInput2 = 6D8D3E137EDC101062FD9DA95F79A2F94EEB46774E7A5A16 Out = BE9291193D9E5EAE5D8305A50207372588055E825583355479A6BAF314BBDB5DDFD86195F3ED4EE38179C89D9994C21C62F5585356C4488CA46F64FADE3C485FD11351885EA6A933E4183981D4EC34FC44D64DEB8705D796D477BDB61ED9F5C0C9A0F7943B9330850D6F9B9E0DDA227F EntropyInput = 6DAF8EE801420BD9952E85A4C91957509D87C084528F1E4B9F9FB695BE2FC767BEB6F1FF7B8D1A75C830D7D2E17C7FAC0CAFAB9CA250F4E139B3158E EntropyInputReseed = 75D0DB99FE7F6634A1D789FBE17D85EF8877D35523B0FE065D08F2066FC713C464A76C52CB8B6910B54B273A22E7C801 AdditionalInput1 = 622FBE9588F32CF012E020DCD7F14836FCB1794A42834C56 AdditionalInput2 = AA88DBB51A48AA97A75C5823FB95C52AF547C01553BBDDBA Out = 6EF18356D49B9A0DCF107671A6A83DEB381667013B551DE724C81031C54DA195057BEBC13BF631F8C886FD06B35CE7F74F507DDAF27551FE17D71DE5645E2BA168DBA7CDC347EF30E8026B953299EA97196B634ADBC2E3176E357B8FD22552E3DF4E65F54CD2E6145BA6CFD285976998 EntropyInput = 43F6EEBF1BD70EEB6FD8B47E4D473C8AF788E1ECF57DCBD0DEDFF9CCF5146DC47CABDB948AC3B8299DDFF225A716570DB1F6448F12A3D40DAD0B59CF EntropyInputReseed = 728A12247480E6E4E90C9210A3D45FF3D3BB2A203C240A25D76074A327CB2A8E8297FD3B55EF4C431402B326411C9C37 AdditionalInput1 = C1C7A007AF9EC3400E58B0CB6166B5757496D1FC3D7546F0 AdditionalInput2 = 879C4625C00164054F75C220FF4E904E803A843AF17D3321 Out = ACD348FB91B22EDB8668AC5997A5FA20DC15118A5026B17BE5A6EFDC13401F63A3E4F538E10B4B0017EA85E948ADF9C4374CF67EA5EB284E936903790D9582FF5B7626E70F14DCBE73C880887D7888E0C3E47ADA7D9E8584D087B2BC8E6793E892C08F9971828AAA57FB3B63BCDDC781 EntropyInput = AE3FCEF12B0054E65120EF7B3B2844D79D12D88E3FBF9279A772DD04899F1A3D100A3678001FF619D581FF7BD23E721EB6009A04415131AF4E623415 EntropyInputReseed = 438788D33F3AC899711A3E648F8F560A905737E53F83DC4B059F4E3D4731387A7464376B0017DA4C20154CA9022C9894 AdditionalInput1 = 07873425A669CDB328D09B023D6C09308C6FAF5D16280F00 AdditionalInput2 = 33B45AF6FAE14DDDD5F6C6E4EB0A4583EE087BDED1121C73 Out = 53A73AFC8A04CA721D650BD1DB442C43D8C987974AFBBEDDD0564C4BA301FB4B98DA48851BEFC263E62121454AD89F7923018539E14FE77AFC993EDD654112FD620B0DE26BC85DF0DDF6C1599A1F2348F54EDE12BC995D4FAEFE0A8C4EF3DFFDD6EB10A99B8328D0BA4287FCC713FB85 EntropyInput = 94139F58E9D3AEE01EE061D8EC0928434FC3008B7A475248C62BBA69D6623A60347D339D13BF7E3FCE3CA383F871B021F75A28647646E4AD190E0C06 EntropyInputReseed = 9DF84CB0A967800541E3FE6EC6C538AF10EED81C807231F999F343BFF578436E8F36580A080EC99D54C59B2417AFF101 AdditionalInput1 = F84ECE37DC98F4C479E00B14C1F56A536920B658DECB299B AdditionalInput2 = 82B7E25324E8546CBC6EBDC8893DA6DD55075108612DB16B Out = 5F8F39CF9C7EAB6C693E2A727E388366F6E51357A8999974144BA86B7B8E0095CD12492D2AA11F48BD86152F6B7D3E0861E27C4D7AEBBBE610DC0B721784CA53D5CD010A96F76583F03CCFBA2316FA9AB91BC2388A35431C04C8B9E1C820207283F9FF2C39FCACE10F85ADF8D70CCEC5 EntropyInput = 840B6C669D668A0E32A4163EC8102FFD3B9AEBAB133218BC50F545348DA2260A8AD8D178E5CF80A98A058BC2DF6CCF99F145D99F803AA6AF7014142E EntropyInputReseed = 1434B86C4C93F6335BF8301DEA23C51068BBC4E217F015A9F7B225FB628CD2CBC71BCF0015601F6F3653D80643156804 AdditionalInput1 = 1FD892A2411A02F9B75BCE2D1BCE16E248AB2C0B43A6C646 AdditionalInput2 = DA4AE0568830CE27F7F3977515728E594B896EC49619DF82 Out = 5F0082F8E6FF60B90173910B9BA19F2676AD18A9541DBB3AA5EF186BB9C52EAEBB016470679135DF9C1267FF8436DB6D58F9849A2C5F476861A2D05CD2E09EDEEF08C0EDA6F5E3C7FCF1E3BA944697B9FC184E4E2A0808FFB63FB98756ADCEAF1CDDF06C03BF77CA4F08DAAE5224F897 EntropyInput = 6A63B5CF1DE269E5EB790D843D353620869E5C4A5F2838CCAE1B5BB45B39EE33046EF0A4B130F623C922DFD210BC0605AB2AFB534065DC8FCCF1D7B5 EntropyInputReseed = C5D7067DB2B8780532AC9EB37CFC81A53F88FF17A605EA109D45DFF439BB3034F12A20013A09A0A90AE8C2A257807907 AdditionalInput1 = D59F602674DDD93A6BEAECDD221A730DD5B1FF47D7E2EADE AdditionalInput2 = BF76E11DE106999425D8A162B59247B989F9DC6F0B256066 Out = B05A6F23683E95D0BBFF9697F4C37BAAE4C615D4FEBE7F16B3987C036F1452EFF6D06D6484BE61154E13F66A76C066E9C6AA5C8F50AA1694069BEA405C61D873CCD9F5386F3F8C1E847496143FD74EF71D303DD4986F734F7BBD96A1CE457511C4150C1101617B42BFA6385BDE6D30A8 EntropyInput = BFD93FA6FED66324152595B6017F9BECFD0CE28FD9F97E4A4A4B9E4EC3B3678F0D033F6DA271BE5D73F9DEAA7EC91DCBF7889DA7BDD312764863D5A5 EntropyInputReseed = 9038EA5EBD7F9C970ABE66367F1F6163D0E83539DC84F75DB5F2564AC227CC6E6F021FE7D76F0EE6A9C4489E746BE4BE AdditionalInput1 = B8A3D715BD74E097BB3B3131F53D2B07C429B80EBE41D87D AdditionalInput2 = EEE378E8731A4DC791247E03B521543F923C6930E420115C Out = 8865D2335434E82E143318D8F02CA5CD9FC489ED64D555CCC58A300E063AD7DD35D6E158C6CE6C5D02BEF41C27C0C07F0B612ED253F1A301D59E7F76A90A972BCE5B11AC3CEC07D021A5108010796BE79AB05B5AC70BD358F5F2475A84B8E3204ABA80498FAD0BC005EF8E2A07AC5AA6 EntropyInput = 7753F25B8DFF01869CAA1A7D7A45D43C9942669C33A20BBE4CB4CB547430DD01B6F126F93330D4160066B3FCD84A3AD8C522E3FC7E95C172F76D1767 EntropyInputReseed = 8F931BC057714310B68D098ECABD4CB6496B71672E3983879DFEF3D99D4B893CE2A0EFAB7FCFC0149D3FC0831E5368D9 AdditionalInput1 = 6B479A7F9E4344D762987189BCBE32167FF9EFE99C4CCF5E AdditionalInput2 = 477A643733ECA43ED520EA35C6607C2AF7B22E044B9EF08F Out = 9A7307FE997BB2FDC2829F916C1DD221660B49AF669B7A9915DF7DC10ED6A3E5FE0E82D6AA0EFA92F1F5B2E4EF33C3492DE5B0C832BF1559202E85D6C7050B0D8024F9616EF377AA7A2565CAAA70B9E091CE90A1CE462BD81979E997D01F9A4FADD3E7977C9EC90E57414C2FD1BA949E EntropyInput = 3834F7C04357939F95CDC548F5B2870BAF53C256D954139A4B6BA72E7AC3F71FF0510847647233727A79771F6D35DDE2519EFB8C6EE67C5326ABF41F EntropyInputReseed = CAE639479FC7D94962289666BAC30B13BB2C3BBA2A56C8BC580FA75FDBAB2043CB5C7EC80040AC843E85201B4665AB2C AdditionalInput1 = 615C579E149CD0AE5B05DCCCF647C93572AC38C9F3E2E1C5 AdditionalInput2 = 87CDDF670D85FA582110562314E298CCA68667D7F1CE3201 Out = 15A16F8C5802509EC69E3D5C28D336A783CB4BD64DAA8D11F3D52CE8F8568714376F90F51377959991B4F8647C743674C23C6F73E2EF3B238AAC54E2D41336A51F547EAE995A7A01C76F43858DF2E88FD70B41F7D67832B782CA4635DCA42A1D4565C802FA4AE0675A3EFA794FA2BA8B EntropyInput = 455881A21CBCA6C7029D574CBB724DBCBCE41112119650981DF34E5F84F1B830C52C8DDAB3019498CD32EFC73EE4EE361CF7CD43E713F1FD2363825A EntropyInputReseed = 12A13A8CE4684048EF507DD684CEEFC54C110DBE6C7B231652161FFE0BD4B7A99B8D6E02612517B4F4B6A528AEF0E9C0 AdditionalInput1 = 892E552315C062FCC1E0FE7C7BFF83570CF6313410DD6BF4 AdditionalInput2 = E25B0C7A3600540230B35CFFF73E516DF21E52150E7B7CE3 Out = A3E70B18F5BD9425859C1AF0E3D41AD186B762863FC9D56A2E2CE6DA63D52C45721866A3246D8D3493E072415E3B972E8BF90DF5802A7833E57B59575BFDC72B4D0CB185899AF89B632196B439E08B4E4A667609125B9396F1138FD4FFFEB20DBF2559DF4AF930A62D2AB4AA94B2F91D EntropyInput = DBD8D05162C869E1123A92CEC86FD02D31485A25D749E6E3685F4D3DBB1424E4FF811996D7ED03AB67B33117A5A59C4C6EBDEF59DFD9AF1E1774F979 EntropyInputReseed = 326B34317C489D5696CE949346CD029F63B4C6917A0035C32BB206512B887B6E87DA80BFBAA93BFB257C8FA03A10FA3C AdditionalInput1 = 59985B969DB217242C6AE9F8FB064052F41A53584272410F AdditionalInput2 = F88609AB4A8ED6811325B704B1F872A05CBD5C4A9207521D Out = 3E2B46654759529C2AB2E261E66432A2F535D657A6E0C24594A064E1FE491FBBB3CE74A92FEB21C0DCE4B87305B6971B439F787D6935039C9B29EEADC7DCE05F4FC265F4E78EA92E985E4D0372D380114B3F4F5F9C9A70DC3FE7D74C5F707352D017E2277E03D108B6F9A4CBC5218404 [SHA-512-256] EntropyInput = 4CC39FE6996774DBB52D99A6B5CDB4690F1D16CF2D365593278D9A3E48FD42328D2B6268603C6D70176A9DDD9FBAD93E EntropyInputReseed = 5744AC9D6D4952B4AD7743D52C72F28A6CA0C95F904117FE190565136A7CE036 Out = 162D52C3AE00E834D7CBFA5CC1FB810FD649EBFDFAE32F2E705CAB43C4396A51F7AD71A7EB5041D1A44BEA46AA16F84E2BFC9EDC1EE6AAF0B741BC68718D9FF32606E4D269E8C70B903EF6701AA489C1870F80453C1BB6070C31692923C5254ABD0CFA3939F14828F9FB9588479DC9791CB4A00D49FCD93FC173A69D7253A2D2 EntropyInput = 74A35C515F0D51CD5E1255B0ABFCC01039550D960D54D5A2F2501D96BEA02B00DD5197656AF1840DF8838C9D5FC9F230 EntropyInputReseed = FDCE9F9DE18415614B896D5EF307E2FC83B858107CD7E47B4D01073904F79E44 Out = 7D3D69260C321695500E8811000437BF7F106A8CF8A045EB074C9CA42A7CD2F153F3A16E2B588A90C2565BBA04860866E60D6C102CBBEAEE7D2BE6A72722D4B7AC062C7F757EF18CEE858FAED0D2A5E4C68583BF82A18B0DA26440F59483317FBF36A23E38393C1568CD9857464C32682EEB070EC65B13A24D4EB89472C351AD EntropyInput = 34E5F20AD79712A30DBDE3D68F69209B8D3A41822E6E457383F5A31A77272D92314181EBD4794F416593DE382559E576 EntropyInputReseed = 8009C9F89DCCAEFA371DEF94AF90C354A42C52A5FB87EB07367BB753A871502F Out = 56FC16FE07BA27C27835A69B64BD351ED2036B9076F774D6EBB9BFE7BA31EC00883259C0B1C37887F529910609306B38DA3EB0D337AC1D30FE555C526E847C17AADD5DB76ADAED83E95CDB370AED4715421ADBAD5F9E21D3124CC3AB5CD585196CC29681FF18E3E39D20F70276F0509844DA598F81B2A77B814675012855FFF7 EntropyInput = D0261152CAAEC4E139B89A6B619846D440E89FC6F692E7775625418711E0D077286DB8038721AA2AE10C639DC65F17EA EntropyInputReseed = DC6A420A15730F5851A980677408B0AA4855429B4BCF460286874A2180B3DF5C Out = 13A8AD51D6C18A76528E11892B6AA38A9BA3AB600D1A8EE06F7BF8B8F68571544447FED9D767C63E1CF1BF37E1A5F1C66560532554C8663E2E146080A70802326793AA3940EF6612B9981371F60CF9576D312644113BFE75F5B7EE02B634F4CA3A5931AC0AA3C69EA6444274E70EA8034C37EF9866EDDFB6C6BD265B8943BCF3 EntropyInput = 76E0201F4FDFEF093CA593707FB08B8E61A5B3D382670EB2194D126D31F829D10EA47A186899A39961BA5C2FA1CE7CBF EntropyInputReseed = 3C237A1A353C32ADDA33177735449E7BD99C833FC1A8FEA118582C13E8048BCC Out = 1401006744082EE8F38FF823F0B3F3AAA7ADF5562C13C1611B4DB3AE32766CD0ACD65BABC0EAD8AD592D4CF0D2ACD15004BD3D077AEDB7A9738A1FB4C5BDC8D2247F74D183C16D93924B39D12753178A888461ADEAB35052F7D768254A80B050367A43E5ED24CC7DBBD49978B9ABA8B8D642B873328342E7E4E4010C63E6A3C9 EntropyInput = 7B47A178D22F7D2F813926D6A2CFF4269A13B79CD703C1ADB371609772A0DB95ECE57F0844D19221E7DE68DA25F2758F EntropyInputReseed = 3D7047F763CDF708101A91134E5D4EE23068727A6269A382FEB368461F48979B Out = D1F9A576762FA595C045880350800F1233F77C7878C96C5325AE453864FB7BB1A957BF3A88A237351F262162C2A4717D656436A9E229168146958EF01D17E42AEA00277DF35B9922FEC1091896752ED54D873A7D9712FE2C6EBE6BF8DE2F6EAA6923266DB58CC58B1B5E7214E4AE9469EC41CEE5A3B2E909F3C649C3651DB161 EntropyInput = EB6239BB7EDC3DEC694078455772A24C39F23050107C05B09950BDD51267DFC28BE6576EDDCF7BA42B4181ECAB3E9C0D EntropyInputReseed = D311F86E97DCA63C5AE756B8931159883EA95A9783DAD34A767AC327BCFB8197 Out = 38DD2011375F34F90C9DCB0E603FE2849207DA873F096FF514D8F0CA2BE98B745F9E7D993B7B3AD8D62EA0EEABED72FB9ECF36C3270888C24104E3534333B7DD1CC48A65268C97F246F3A332DC7BB54E07E8C81B9A70710ECF03CD89D33249854EA9892DB7C4B5939C5FBF748A570428BCDEDA49A3B7F877B7EEDCD2C109DF54 EntropyInput = FD31E5A8C66E34F9B05402456DE6B2040FBFA3360067F70B19B935A3825963594EFF90E3E4AA30D745884DBF3AE05E43 EntropyInputReseed = BBF05D9F92C63BB1AE50AF2E974C014C2AA9ED51E73B7C48E3DBD67FCBB23C41 Out = BAA69411E2ED7F77AC0A3DEA42849D6E6FACF5D306D008A377A24682DC06587A19F8C0E9EA229B6A38B1FC0CF5673C88583284BBA51ABCB843621CB2A147E5C7A733222D3BB0998CEF93E6F776FC9FDDDA9DFFEDB9F3B96CB80B83BA5836AFC0E042D8911AEBA3D2DFC55A80036386B1D892AEB4D8C548356924233E00E37B96 EntropyInput = 68AD779E4708C00DC1AB8D8A7C50891B04ABEB6921B8C44D23ECAC71C5CF1DEAFC1705AE921C5EE9DDD6F6FAB804C922 EntropyInputReseed = 6B46131248DFAB34FDA362DEAEBD7EFD91D48970B1A3D7F73C2CA1FA5B40E88A Out = 6F047449F81BDAA76584AA187B3860EA6A38569B56A1BE4A76CAC5F690E95E6C54314163B16A3B8051AE3BD8CEEE7C9764D86A5FE03F2E00D605FC55BF6FF0B3058733FCC36A2374B7CA55B687B3664986AAA99E17CAF0FFE7E611B150B6DD833D6DFE5B87629A503EBEFB46EA6919437D7B2E18FCBE9AB399695A8437D3686F EntropyInput = 91CDC218672D29B02FAA890CEB0F660E8935EDDFB9B446CF8CE146A52DF440CF98A42CF7080101A1374273608F705E38 EntropyInputReseed = 934E460D3609B298150911077310DB119BE937563039E15DBB679EC3423D559D Out = 4788C37AB4F6C2DEDEF9E357B310BF9184C9F4DD72890DD0634A68318FC42E4813F24E53955E9D1CEF582D2D8C2F6833DCA5CE6B2B1F5C4B56062CA2C5DD1F086190D6E1002DC09A68A1FD97AEEE23651E626138D27404452D0BAFC476F462C4A343F799712C1C3242C67D83F9A89A2A853E55FB9C15D750FCBE4B52642B3FE3 EntropyInput = 06AFEEAFE0AC3D7D63DFE517F6E93AC2CFAC0D1A0AE6741A2C037B0A14BE0AD56D419C5F206C07011960E43A80C54B2B EntropyInputReseed = CF2B3BA97E0F9CD36CB6CB7E36A684403BE206AC67962FE6E6A890F6018B7AA3 Out = EAF1351FC62A3118CAA8193A7783EAE8D07452A4BB70700C4A36D0AACE85F7EB11A168585EE9F26979D0491A1BAD952AA958CD00E8D3FF1E23883AE98E565A31B98D62D6606BDB891EE7C6E88DC173F4B2D0D8C55B4E65063BFCD8A25E7F75C152317AF1B346CF3875543B6F7B281EF853D04DEE173B8CB08E070D34629A91F4 EntropyInput = 172DD021322695A66E6A9591B11937C9712EEAD3C321A054BD182FCC14BD07F515AC5F4A795CAC46C922991D5FFCD118 EntropyInputReseed = ADFBB946A458608CA4C28690D10EFA898645BACA4485A72CA760EA60FAD66544 Out = 9D5D54B66BBE1A6FC33C645E9BE0FAE2635E970F95921BFA8C3614E5495C173F982DD4CF821D7EFA595629A28EC9D1C858F51308FE32D791D0274E2435E7F13015BCA8D9C7B7EBA2AD0F941CAB904F94CA6C6AE42C6676207BC4A99397EFBB6526789270949EF261B50C4D59E2997200E74CD860C9CA50316EEC8C682C5BF04E EntropyInput = CF44E3B9CD4EA5A586B1AAA7F6616BFBD5B3EF5CB4E086DD1BF82C3E344EDE562255A6B92C58CF8D9819DF74A54273FE EntropyInputReseed = E38880C172294E14011FD412094CDBEC4CD821E5D0A7B537CCFE83F494A1D5DF Out = 3B4718F46B1561DBC5BB8BFC5C8A731FBC23A648C57B90C8AC0DEB8AE7BF233B8E15491D81E1BFF7E0BCE0232CF3FB05E0A9F9C7D6CA02AD7BBFC98437D80A245F943224912362DC8BF74C214137C68209F41F2AA3109153BB70FAEC8D9039B8893D89B0C27FF47F8ABCFD24A78CD51FC90F94049FB37B2868BC145574E92BBE EntropyInput = 7285F925B276558A8A542DE42E49968195033F948C67169D56824356E135575B5480428C2A909A0B7A7CDFEE011BF001 EntropyInputReseed = BC4A237B076AEF48E889667CEF41F6BEE0606316357A95F10EBFB26B4906BBAF Out = 1A8CF76D626B547DC6C3D3EEE631E8A6EFB4F8A620CD3E9A66E0242B108770D7F16C59DCC0360F1E722FD780A7B10ADCF7718B7C58EABF2B18E5734D1D33ECB1C66717044B857393831FE92B9742B25C8293EEA5F5956373300DCD88AF4CFE373B2030CB3C5B554511C0DC64C204523DFF716D44683F28218C338B5190AD9008 EntropyInput = 37DBF351B0273C033E229A0B3DC056A113590F6F60CAD5AF384EAB61B1030C8FE68005AE19580E39D6C8AFC6BB1AB22B EntropyInputReseed = 01AC2E7C9D9097505D36CED795A3FA46260BBB6DCAAED7785D383378902F6C06 Out = 234838F750EF568E5CBC2CC2CF87C45D89239719EF02AB91BA23357E6E1006B355DE8F47C2629B21753DEA5EB2316BB5E2CE1426653FAFEFD60EC10AA5B6C96C12AC30C8CFC9178DB2D20CBD4F9AF76A8872E06DF08CE98F582FB0CE8708849FEA7804B554F47B05DF3278F648B3E5204B0B0DB6DC24EB5A3FFBD8E42DAB0DC3 EntropyInput = 46FC5DE4EA7D31C60CC62B49D283B7BC71778A028273C0BD4E59F590E168CEB7D91D148F4A52BC99C269D46729D594BF EntropyInputReseed = 76B955C9AA4C290418159F4D805B427DE35E42AA1CF10F59E743C56C92280A556722B8F0AE83CC1F52E3DED6F588B638881D5E097D8BEE2675AE30EFB417936A AdditionalInput1 = D7EAE425D0A484693557A53EF97DEDF43F255C2A9E38A8334CCEF35829E04F17 AdditionalInput2 = EB3D3E3FFF84D72A84BF94FA49B643D7D1EBE768B4D508360CDF962EB3CD48D7 Out = 9FE074750995B0C2638EB48AB66957B4033FA34202A7CC9A5354EA2DB4ABA89CA10DC5EDA1F03F9F5A9FC4CD9B9191D96D056AB74F5A4FDA15442F1839DFF8F240B06E9276F03FB1D7C3B5A8A571C37DBF89E9ED8AFE09E542ADD83332D730C4F74124B7F59FEA6A6A8E816AC5E0D66D7944CF9CF18936163BB8A81A34F0D4A4 EntropyInput = 031F44E0A067282B73150A4892F23079325E1C1480C549C35E1604C0C9BB594729D613B24F5F5BE62260D53D8B0C4F4A EntropyInputReseed = 26AF6DE0749827A9F92BE9CC7D3236D57F10CC559F8E361FC6B3A525824D78F53ABD227D7AD58B8C9ADBB867C8605D842083AA12A61B5EF0B187F4FC8BDEC2F5 AdditionalInput1 = 0DFA9AC14ED4C286A8D3142FD5838F4A8732E3A62CC63AD19B3A324AEA725A4C AdditionalInput2 = FC4D07597BCBABEFBDD88B7C46C93633E109CD27F4D1B95BA11B7AF0014DA6C1 Out = 233C8F11699651488332EADDC8875A56E34B5E3FE41EA31D7D04FF1C1F465335A301B5E5EE18E75BFB410530A3FD98EE2CC14543CCD7B16461C31583E47A10A99855B897D4BCA09C0C4D828D8E8A03AD23C0ED72AC457CC23360681CFD7CDC36BAF010BECAD5C6C48B43757653240FAEC4FDB25B5A3E3F3E2ABA37882C7AA69A EntropyInput = D9F0AB6C6B873EE8A2DC1DDBD8A96621EEBC612936E7DC4CB5CF020DD51945282CB3E21B3546F298F6A5D6C5461B1723 EntropyInputReseed = 09D8082DE328E4B21F2FBE1B3C540525A73A1450099A9013F57B6A0D55DFA899B9D0187B13667E5761F027A5492AC9D4216CA6AD1EADD9EC6FF518E2F41B464C AdditionalInput1 = 177B588127FB9CBF93174DDAE9F15BFDA493141B0D0A4322641A2AD455B72632 AdditionalInput2 = 989E98F30A4AF31BDE8EF9B010DB0AC09770A6C86E3227BA77DD1EF87C45E81A Out = 7BE4075DBDC3F5670ADEA1611F4878FA09391C3F54E3815C29CF0393EBEC077A02E60D28886D5B3D09EC3B06736BE0240D32C80AAE9537B7C4E62680E10A64CC54BF040AF0194AC066EAE34E0294D96535B6BD3B36DDE9314697B5BEBBAE2A11B66C103A42F6E94D9B1CECBF39FDF13845363A09EF28C734710CA6221D35A3DB EntropyInput = 2DDC79C7AA8F4B9E00F4CA710E14FE64F09BB52F0B878BF4B6B7DAB3600C105DDE8CD49BC6CAABF8A903E98DF08999F4 EntropyInputReseed = 383F08A66FEEFD0B89044BA502E75B4D333BAC5F8EADFB8D7BF32BD0631E0F6CDA8C0BC564E3E7F02FEA66B831833E8C95505057B70ED0D0EB7970016AE91560 AdditionalInput1 = 9A8E73D82F3EDAC928C7FCFEB7E3AD3895A5FC4E9362A6596CFE243F70BDE126 AdditionalInput2 = 21652E79D11F70A6965DD9C5FD56D29B9D2F456FDDCDF960EED1888C1CBC4B93 Out = 1C59D43A85C2BEA97A0BB69E7B3549EF53F572ED856939B8EA25F939E4299051943A33B1DCA599D87F0FE2A76880DA0A69EF23100100BDE70B3C81FA91D457B4D601C3B6695F78810417EAFDDABB9667D626770DC8B9279CEC65BAFC6FA524A1B317942D1C4ECEC042A9E01806B30D43896D410016197B715EB6EB70D5D75E71 EntropyInput = 7F62F1B907FB2822F5DADC336649959638D8D018B30E301DD6F21456D1A9D63D94EACD54011359A5EDC5E63DFEAC2F35 EntropyInputReseed = CAB5B5ED07503CCBEF8FB21FF8C23C57717B5002F91124BE3BD023086091B884DB4EF60CCEEEDFE43621A54132B70FC3F0212C08A773F9FC129E1CB9DB9FAEB1 AdditionalInput1 = 1035452EF904AE0A5CD5CA2583302D774A540B90CA4F7137128E7939CBFC4C17 AdditionalInput2 = C8F916DDB82E4FFC5EEF1A049832CD0E415E5686792DF7E39CBFED8051C14497 Out = D7A1F9A706F761B58ECC8EF81D65015E2381DAAB8483600BDFD45F6C6A1B7835B31D7D660F2BB90E357B3FBEA21AAA8630668FEA7CE97D983D50C1E1ACF181F397124A4BEBD9943458F754BEC99AB5E0892E6E121F579BFECA0FD83C46C56006C4278C3D5778A03E33D590913321D4721FE4670B2F7372054F590908607EF0E1 EntropyInput = 37C8B658B5FDED34EDF7AC6CB3DDC23C8D09816FDB212F226D6BFBB4AC61DF8F2B9A8F5FDEF969C55C5338864C4C933C EntropyInputReseed = 5333B5CE4A95C9E235604908E9FD73EFBF7F5E87834FAEFEA7E5010E86A8CA8FE08AD84B8542DB30EA9C7382D3CF5DAF656D2D525F9DF87827B186892532DE67 AdditionalInput1 = DCB3E3A4704800FC0F08983F3C6B7B95FCC740FB38FEBDD49E96B6EE645CCF9F AdditionalInput2 = 7ECAAAC0251663D2FDD3720CD6C7DB846A7AD0B7B5325CB92A861D900A3540D2 Out = F7D1D9ECAE703FB5E396AD6E892AA853558304D7F87AF44EEF7287426CF497AC931E7AF2271829B76740804E14B79E287017850234510FF1F887B9A38C0FB8FCA6BE9C4A25E6797138F89E73973834C268F5EE9C021107D50B49B1B3E6357E536697633820FA955793B0D8557F23B119FE171285A847B653473A3D634599FC63 EntropyInput = 5762FB19F1EA0D9C327A2A4D108E91CCD18F72B85DBD9DF0954B7D2B3D02E312355F17FFEE210053373332E535FB657C EntropyInputReseed = 37DE2DB71E66FAFC5441556686AEC874AAEDC1085F7C2505560BD2B5CCBFF943CE47133C1F6B32D5C97E746FCDE8DCF260553A2AEDB7EB0FFE480A9E764A282F AdditionalInput1 = F8C3AA39CEAF85204B8036980ADAA7BE61EF04AC5B8430046BF1FFE9108A245E AdditionalInput2 = ED812F762E1871E6467CD953F3DBB73FDF31BB76E657242CBA82CC6B9A2E7C1D Out = 25127B184C707EA16C4BA5231C9A312FB18FAF8B2AFE38672534018F7F8086E43CD60EBEA35280238AB4295865D32F98F86223918D848FF6108EE608EAE96A24F2DB52A14FDD3229E32594B2F510792677AE18328A3E6B492E1C25B7ADA87741F2624966A33647D7351419EEE2D601D7DC47E8E16E2A803BCB9715DDBE991B70 EntropyInput = C8E030AF47085E10394AF9FF9FA9E2FBA7128F22A3687E84E4955DC61A3408A438429E3364602E2E919DCD35B347EAC7 EntropyInputReseed = E4AB6F0E0B7E371ED941427E556C5FE273618CFD9A697258374FDE562B0F02B76E7897B3BFD31255B03278070444B082766133D7A395BAF911BEA37EA6B89651 AdditionalInput1 = 61467125FB3E56665646F6C7A28A00578DA13418A7E8FDFAF70D4FDB22CFFAE9 AdditionalInput2 = D17FB644F6FF594B195A30C2AC34C2A900FBC63F517F1A9F474A2D70DC07F6E2 Out = D8CDAEC4379AA173930DED1B0ECCD085E3F2DBC8D68AA43F50C8C064E0DBB6E77C467A11629E379E6AA56529D637F725D13A5D52B68C822A7781A4E394256B21A2820A10E28D445DDE77EB22D12263CC6FF54065468811F14AC921667A81BAC54FB028A2B17779154A87D732141F605F26B55705239AA1FB381BF282246BAF25 EntropyInput = 1294C6D534E9C15FF72A7BECB0F9868534344191C7489E15DACA390F67E325DED08E0E36DE7E374D9D44707267DADEB8 EntropyInputReseed = A2A0BC3ED6B585856CAA14344C41A348A93884819C265D84D3C2084017F98EE6C99317AC0596C86618EFA1BF8D451D4839A153CFE98AA201FC143DB2BD695D45 AdditionalInput1 = FA10194FEC489C51CCF4FD45EFD7B84147FF0F73CB8FACEFE43445A0E65C7A74 AdditionalInput2 = 38BB974E3D5A8ED1950C21B771230FE3B118149FB9C8259DF3900BC1536E2200 Out = CA8E3282A7545B66399FC3D632A303595D98A9B3B925F97513BE5CD33248E39AA46BCFF9B724476B8AA3884BBF30B342E82DCDB613DD0303C2EAE25FF63DF07B20E17741134763D1ECD0B82DB0FBB9BEA5064C384DB6CD08222FCE4C622C94549CB65F27E3919D66692DA5D59836CBD520824C989FF92EBDBEE66809A9CF70AA EntropyInput = 3DFE7BFAD11610898F290CCE80346A01CACDD4F044972277D364778534FE53FBD225EF087E98575254F27251BC3EAABA EntropyInputReseed = 98AA211E1FDBBF17E08ACFAB90A36A478DCCD1EE3C253365D1BBE4CDD474D01204570A60CFE38356C1B6D880A35348724A64B07C5BDBC3ED7581DAF8C0BA86C3 AdditionalInput1 = 9EFA2AF633F9AF88FBC303051A0950DBAE37A8F9547596079ABDD90336999E76 AdditionalInput2 = A22B07E3E9EE3AA8B1AC00D4877A0DCEBEA722B97E827ED34A4F005F9E298916 Out = 450A7191EBC51999D92A62F4C46302A671518B01E7BA408C3A3FF2E367EB3C6E06B446BDF9B03921E19EF43E6D6FEDB7BDC2E1DF195DA183F7177D80CB42516A0F95BC4CF92C78C1D8F9F8515A8F8678FE3CF684D1023010E91CAD995858CC9A500D12B4DAE30CF02E223711496B3980221BC95F9FFCD5028EC76AD46C7AD76B EntropyInput = 288C6C7F68AC7BE0922D6E2B17B523A9F43AE3C0BB82EF61A0A012EE7070B9635E22D18F86E53BB5B6B1F48776AD13E6 EntropyInputReseed = 47CB99B5D70DB8DEB7AC090597423FED274201A28F2AE3E133B7C1B292C2991345EED40D00B46F617CE52BD36F9DA74DD9B1B602C653863D995F9CE6CB1EADA5 AdditionalInput1 = 02D58E98E152D331F97F5C25F4AE7AC4EA8CFC2E84075D61DC562A72C29848A2 AdditionalInput2 = AD52E35CC162099E60E119CD59CF06F2E28B108CC33BE0C2A0B18996FB089FF2 Out = FBF3DCE8985FE5FE7AB2469B2290253A1F3668697F9B85B445AD46B548AB2F481B53438B2CDE31FD2679007FB4268FED75C79E553608D4E475D32EE6E296649F0687CC212C90E1534B88FD251354826257715CFBEC77C10B058C86BB5623BE95C7269EEF9CB655CE9361BCD1EDCEE1516C328DDD5314BF246EAD64B9CF075E51 EntropyInput = 08A32E5DF2541ED40D3993DD8DD99308713FD31EE9F89C6E2CC01466DD85C70165DDAC5FF68A4859A1A50D7FAE8B6AE6 EntropyInputReseed = 1FBA94AF41CF0DB1CB1C5CF96B2C89DECE65FE81B8E31FD770AB815E5FA6FB29F6284D4690D63F36AFB9FD3F5B072B0E56CD19DF0E0AFF052FF30484B96B4A85 AdditionalInput1 = 001E365DDFAB04C73A4817774593FF25E939523DDC82CDDE4007EF6C8BCD553D AdditionalInput2 = 4ED1BFEE4D433E77C7D9A9F975638E69218BC87D40A1AF36B61887C333B0B919 Out = 94643F4203F3B9702D83B19DBEE0E2EE1AEF0A0C8B1E26D5414EEB3CB7038CE96A1FA16977993788FDC93410EF20E8F7E74DE28E95D5C5128F4D77B66B436D92A83BA2AFD23E8D1FA2B27D4AC0FFB486A71F66062FE118FC5272FF054EBDCB61544788653F6D35CDC0872EECF7709D3F69E64E9D84998776535813FF8ABD5AA9 EntropyInput = 72A80A9C5234AC4275E896D2432958678BB3B29F7B72F2FADC2CF69C65CD077ECF462817DA8288782969E7F19A00E548 EntropyInputReseed = 839D9513BA111378147BBE08A9AEA9E5769E59F81EDB4588494E49E6B1CADE5DC4376C52E04E4AE0EE91F40C72BA0733ABD3C5645D5D33DF0DDEA023F0EE58AB AdditionalInput1 = E3158C1409D674F5AEC4B65715D7C4C1D227CF1840254F1E3606E8DC32EA21F8 AdditionalInput2 = B6967E7CA392F4DF690425EB159D6C84B83BB2352E9B2B3709F67807F18921B7 Out = 516881AB8F153ADBEB482D1C899E6AE0675FEB1B358AC7FF257E43299158ACA3DC909437B14352B0AAD58DF905D1EF2279E669337E9096E19BCC09951013825A67A99D522EC018939D3A5997FF9613F346313EB67166A10A1B01A851A595205855874CF03C7A119A5FF1DDDD08AC9AB470EE9D0F741C0526A343A9E40AFAC866 EntropyInput = 0B65868D3CB2626A97E9DD9EEFD3D2329ED62253FB0E795F6B11C0872C7A504B8F2CCAA01122A6AC801526D336BA7D44 EntropyInputReseed = C420FBE80FCE3F02E5FCE894D5830A3260EBA8CB8D86FC2F9D543332030ACCD29ED9859C674D3F6CBC1BE5D3F94A770F7D55A6FB810200491FC7E875F89F68DD AdditionalInput1 = 52429CE6FAA24911CA49F4AEB3A8A9324555981463C5CF8783BF321CC90AF887 AdditionalInput2 = F3C3481C40F9DCA1A68C199AF621223ACC8A0FDE196899B9D1EFEC9632246C6F Out = C91344C149D23C9C1DE3FC9EA03E38C3BD6B39E69F9129FD71C24E3CC12DB910A67D641A689503217D0A39292505022BE07ECDBC19E91087064C598078FFBE38C14AC3D854941E81B124786601EDC8BD0E9A3F13AB6FB0FF9E3ED87E07629DAAC45F15D8AA932A055622D80248DB80FF49AF46603A1FE7BD79B177672340256E EntropyInput = F6A4815EFB20E088DF1CE4C2F0BEB8FBEBC96CDA75F31E221997A112A7FDFFF88D5E38987ECC050B8B2216B30A80CEBC EntropyInputReseed = B909E6565058A7A39AD7A10E013526EBEF8AFDAD4C4DF65DCF759D3DC2FDC4B1C8F9A907876EDC93019480678C1372CD50346E8C63801AFB33DB5A3F9B8FFB2A AdditionalInput1 = EF16E8E7C147243946C5C018F2F29505425E6F43FF77078EFD7F0E04854C4CA2 AdditionalInput2 = 623F1207816F1F107563F387487F0954E6E7A88C4B180A06D66AC0E28D118541 Out = E52B19AA7F121D102A727819069216093E42962E09D4935476FF1F8DDFBB8ADE53355FD8C006C46ECD5878BB73B96A5F1C0920687096AC708D14AF3A271AFF7A81608AC542D28F0DE2312FE28415D60096EFB8798A83B5DCA66E8F262300B12EC39F781EC595093F9F8064844A1B560C064AFB171408776080CDD2861A4FF2A0 EntropyInput = 08630E964921B68163C6FEE4A3DD289913862795E22ADF806DFB454CDD1E591C48B3D1DFA05383D97D1C2418E57FCC7B7A7BB284476F38F95BC3A5ACCF6D241425761C541C42D71E3FBE319543E9D445 EntropyInputReseed = 9F87B430F19A5A169FB57A4965CDE5A0C3203D07F86EFA1CEBDCC52B5CF72F65 Out = 685EDBECD04C0BCEEAD59E7432018A17693316D4D5775ED39D8E8E849ACE6BEDCD14FC8CB4C5352B38B824D3809F5450141E7ADDE82EFC2354DB39877135F0BE4A0808380E1F361B30E8478FCDA6E09D3659E8806C5A14119536B0582E0E07EE710F572322FBEEF65A64A900CAFB483B6FD965073A35139056DBB23849E979E8 EntropyInput = DD5688AB52714AA5D97B726C8E2AE131F85DF3B8FC9ECDCDC29C7C052FF459A601DB605EB4EA06AAC82FB6C53EB0BEC9FD6BE588291A77D9323108A687FF279EEF60EB065C09BC79F181D2B8EEAD98C1 EntropyInputReseed = 32D7DF373BCC5395EAD68F45A22FD442FBB78D466760069F14B1B58352CB255D Out = E10831E6B487FBCA381837AA6FB2FBBDFC67A1FB8455F50F033817A394164F7BECC95BCD493B87B624697D526996A3D9E911B8A4E79111C7759CA8578EB5839D8ABDB8891B4FFACF75F7DDEFAB3219FF5D74B0F26ED5257A44899BE26791AED7CC4F111C0A2D804B45670F267B291EF8553EC6BE4A3AD59DA11BB4EBF7800FB5 EntropyInput = BC5539DC8036E58BFBAC0EDE10B6B56CF80AE2AECDF657393D13E701B119EE0F726E33C74F9F1B1C544A6847818B07DEEB4CD9A59E93FF4DD8694991AD6D13E4127D0A97440A893D99EFD525D7823AD7 EntropyInputReseed = FE4EC2D1F5359BBC69E508AB5A2587E95CED7AC901B09DA47A73DFB07144EE8B Out = 58B070B99D1B0E1A20668AE36F8603427C284D3733336EA818690957354F4E84D8FCDF8F8D9A1B10B964887C15F5C33E0826B5B77767516371D3E4DF9FDEBBB6E2EEC7371617EBBE2DFDC68AE94C2ECE84E289128511A462F323482BCA9B3981A70B503FECBCBD883BB180DF3F21318ACB330EDBB67C821FDCE9B2A2E94F834E EntropyInput = 4C574CACA0B0FB9FC2B699C2FEDC182717EBA9845B914160F12AE46EDD17BCE84BE63B08251BB36C547311BF4636DCFC7C1E78394AAE4CAFB85D045AEA5C8CC2CC4604CEA81BBBDB341D7B2CFD911195 EntropyInputReseed = B6AC0E3AD3E563D3807A92A9EB1232D848720DFE174A866D8FFC34124B0F7FB0 Out = EC6F89A60C0C3076C261A7098E18DC3BEEDBA5611B8C953976FC275C1136A8F2CFD32963F485B8C3C6311F15E5365DB00FDB7A70F397431B7609EE1A287680BA6BB4739099D894227428F9F3D3BED2C0786FB851B9CE8A1ED477C206FEDFADF1B7C9C30F4976DDE26696796836F930901055D56E6EEDB7081DC11D8B50AE5148 EntropyInput = 8E480FABD47C6D861A80926DF16FA61E8EECBDAF45886C2393A4D4F2832DB05217F69C76A35FF31E30F97C6A616C2288A497525A106F62FA90E6FBEAB6CCC5945EEE9196ACCD5FF5F5662577539CEE09 EntropyInputReseed = 94315BC955459112617DF11DA2AC4F668D0EE4CCD5C22B558A92BBAD35EFFF40 Out = 1A2A3A9E696C1382A0C40927026101F59FD11C41E4FBD3CD82723004A2CFD9D9C76B6D2FD6FE3DBA9520AC215B4A5EEBCD7FAC2E897ADFD3836AB4981EA5585D03603F27C05BAAFD7C9C78BBE1AD389F7C980B0804D10F6B899568EF9320EEC62FF6F6C66643F3760C4A284643DC28E2D320144E23675AE003956A07982394A1 EntropyInput = 28F0D84656CBECD0B1805A4119B7CCDD46E5BC033AFD4570D90B113521BE428A67E60FE59ACFBA484DAFFF59F2843A0CAE613EC6EE0711A29C2028F577AC47CD0C01ED094F7DB694C431DEAA00C6B545 EntropyInputReseed = 2289908951EFCBFC1CC32E76A0528C46349A10D6BC99006C64F0D121BA6B6B09 Out = BE122622FA6A31FDCD147D3BB6F49C7B0A3BF6514B36B0F0C063099F32C0C42F4F415583F1A543040D2236ACAAEE63CCE6A2B0C9150634052DAAC8C8FBBD9DBD7C5171A3B8C2F78F4934C859F39A5CF41DD180AC4D67D91382F454962B5AACFE3DC7E7C99FFC13BF9346417C083BCF5D5D546050912D92506F749F28C8CB3F8D EntropyInput = 055818D66ADFD017971A1FB891843B7282C79DAEA3D4587CCC95456B27884232180DD9A4AF1AF4F41DAC71F27A3D194AFF501630CDE773310FBC0AD5DF703795E9E7D5DEA522496FA7FAB6C1B3EA6AE1 EntropyInputReseed = F73890E1BC1D0C389BD4283097633C6D5112DCCE384DD4AA85A9AE28E0D9C4AD Out = EF7F19EBA8A73DF29D52F9CF564734B7D1700BAFE51EA8B887BDB4260025E43F9C278B24AD4A838B65CC90E845331A23AAAC56C0BA4B97A2D726198BC014123C2F22C5D135D53F31311266E03B7AEACBDF399372F9BE2CC8455ADBBDBB2C2CDFA6FAFACAC4680FFE71B5D2A792F86A3FB20A349FDD26E393AFDA7B6B3BCE64C6 EntropyInput = BFED2E0CB3BBB81723E73910FC20FF419488A665F8222C2616E30E55E017C1588142B223CA42F9A5D60383E1C72A27AFA1BA3A3112FD0BFCFF8ED4F2415E5128F26A6953CE38A3676F8D028AD3A817EC EntropyInputReseed = 85C55F1CB90470120849E02FABF07039F83441C85AD3FCE2F4D265627FA30132 Out = CB93B949F0285F8F9BE5E39569FB78EA26A4A8BBE0474BD32F335C307340A73B4F5D9516D6EF691EE982ED1259C3C9F121C971D3063638CE244BD580AEF797078C375446072582947EC9EF636DEEDC089D4B5420EC9E0181BD2955D1CC47C6479E8DF9B92B832A59810387E7F7B7CBEA3F4E374260F5BA535B672FABD92846AF EntropyInput = 3BC0780F31B246A57816233D75B3D00D75FBD7CEDA44FF4B0C8EDE40C86FF8D78D05D7A07A7B22F7F95ED404FEAD15BAD84D58190F8212F858936DA938CAE1977F22BAA1D6A72E027678A5BC6C287BAD EntropyInputReseed = 2E0336D05BDFC2AB7ED352FE2B7EC7CAF8C083E53AFBA1D8544A208E80533120 Out = 20F7C5A11CC7224AE92A86DFC4700C9D86CFEF2C65FEDF1815D1321A35F13F12FEDA85D1A7A30C7714BEEDA11D6034B0391BA0A3D9B4C6E03EF67040B8811E09C1C8C89ECC9515B4018C48574254053FA839361EDA3444A6D6DBA4CCF8E080F3EC3695449A08E45F498B9CCE0C31485A9C429AB9B153408F70CAA473AB968791 EntropyInput = B698BDD0DC95EE896C6BFF47B2E9A35C720945ECA77DC5AE8DB71E7FC2ACEA7B55020083B5C2A125D66D8375B0A370243BA0C0CDDAC64FBCAA87F2719D20186F5F61CE1BD023CA9FBE8308A9CA3A4440 EntropyInputReseed = 1754F72698DFD547321530758B072406A7AB067782CD5B3FAF4E0A39E9517D7A Out = ED0F30D126AD5658CB2B31A851B13D5DC01105F7C5CDBC0E997F32F7AB91988DCB37EFCF4E65432305979074C35EBD88DE1518E0E46A495876F40CD513DAADAB782B27B77A655BB18FF903BA92C4C75D4761E8C468598EDF902E9520747EE3867625B6330DFBD40034D02CCD2121B0665B0D908A9DA0C802542ADDC5A1E75848 EntropyInput = 30F65746F7B2EDE69584A33AFCD2AA5F21E0FF0A7BADC692A38780C4052D04B90D13A9E02E48EDAABC1E8D62F187B64B88ABA49F797D1AFE2EAAD77336CB0975C73E8C72CD3F9A63E40E95B94DBE455A EntropyInputReseed = 4284AF02E953170D8B3A247A9A5D4C2470113368B6B16A2840E5DE8C32740266 Out = 4849AC86848AA16E2BCFE9833BB4BBDED7ED1232E4332616DAC83D33ED515FA3B661AB6CB608FF69494C19F39DDC883C22A39F2D8E12FF12C904EEE520BE59B68FD8722276A66407B40F7BD3F0997B4FABA4AFAB461582C894924874B8E14C21CB90EA01F21DCEF2F287F5928B3F227395BFF2F482D0982BC9F7415C0D901B26 EntropyInput = EAEEE176F9E7513D9FD2AC02B692BFBD365CA3F5B6BAF2DEC9967D93F72EA158043EA713F044B188375E599ACE239A9CBAADDFC254E6578B319E4A46E006E300B45CD6A5109A9ABEACFDD59D67596AE7 EntropyInputReseed = 8A036A6678BEF3E4CF8CAAB4DF22A75927B8F0D84BFCFD489E9BAD4C7C9079A2 Out = 89F0EADBA3F32B0F76D0CEEABBF3D26E4E245B94B3424ADD496FF05BE8576601CAA79F1FA11516AD4A917DA0129D229DF256CF372789EC89F1A8646DCA5C6DECDB5B2BC885759B378542B5B8C62A35EA1778B06746900CF2B68B1626FB19903C2326FB17EB5C442707D8C2C3891B8D6DE1FB476C20059C96606E3052284E4DB4 EntropyInput = 9ACE958A7EDD6DBB5B53D9A441A2209C95AA003A6818A961B1703C35EB63D6C3C59DEF50032ACDC17ED46EE7C8483E6E373491475578687FA4A2DD7804D55458532FF7DD58CF8503BC44D0585F68C198 EntropyInputReseed = EF6244761BF877CCA8D69950BB368B2481D7675201BF1CE22907993030CF435C Out = ABBD6293A6B466FCD812FDF06D08F8D710E640A6161A9F4FCDABDA08F93B1C8775C24DDBE25D60026BA272DEBD7975C3315688F42A1B0A8EFAD6765592AF59726CC65026287CE03EB6D4957FC27B1231BB6188A400F4EA76B6D7A450D52D8EC24F69256389EB15DD8F8C396012623AB2D271E51B338DF08882EF00ABECA806BB EntropyInput = D67A049C4EF1F2A2116C300FE1E0AAB82ACDBE3E30524035E2FAFF24D600FDDAC61E4D220D0A91AAC8CD459B4E724A507AF2A767A1E6E33AA16F2EA8E6A17EFCD33809D339AC4518CD20D4468F1F4933 EntropyInputReseed = F45FF0E096D070225C8B8C614E980E8EA04137F294F59DDAB88091F45AF60591 Out = D4599F15DFA6195EE9AF3ACFF85540C804BFE1DE9B6BC6BED5E21C36A85C04C4B326F87BFAD2872EDE0AF1CC7CE02ECC00452127EF885E80C01CC3B887B6DAD10BD73AFC4DC69B5F4CBA86AB510F683916F3B94E85E5975248AA258CE1D6763794A8DDA7858715FAB4F0E4FCD11E6D54A17C9BE37A19FBBF124995DDC05646F0 EntropyInput = 73FF3D30E54AEDDAA68C9ABF69C334AA185F7322336FCE7F4D3977E58A1D27ED3398CC8BAA9F8A1767E169E3C5A85A0FEBAED773AB98B90BBBA3459D487AFA81270E69C56738A671F0293519744E7001 EntropyInputReseed = CC82E5913002E53EF8061A2E5D150F5AAA8E033D5CA734B26FF71B05A2748DFF Out = 2AB724223EBA4F192391B162A088001A25B8BF843E410D419BCB5C99EA504DA70439AAB0D98275ED8C517798F16910BA8544FA6120EA58D1ED4E8D07FFFA590EB3D03373A412EA4597174F0A89EC45969428D4FC35AA9FA80FDC0B662B39131C09424B9780B6804005A6DB09C31E8E3546DC65F5261E6168CA75DE609B8ECC93 EntropyInput = 07FCCFC253700B6A75B370E08A3A7656B05819347BBE73EC3CFCB89FFDC378DA63CE5F986444388962778FE385783B7F6CE71511C29700A427F2F12A482D86A978AC63C6A1B6A83371E3C504F26D5B45 EntropyInputReseed = 34AC0AA158096B65676BA5BB6766DB02F8EEBC5A5124204D778F15DB8D6F05E3A1232E22BA068AE1CCCA1A02AEE7638B3AF2C3238AFE394687DC431961250D1D AdditionalInput1 = F65FDECA968BCF29BF3E6C5EA01146D411AAAAA3AFA54849BF16273805C620F6 AdditionalInput2 = B308B2E265DA3E43096F4A8BE9A18FD6CEA6AD928AE2EF8140B5BAD82B898E52 Out = 075189D22C22D634AA608A7AD7988F45A6FD3A43A9F84016DC2EB90334A2984562597FD72F6C340746A688BDA79D5AA21A730A5E1F7A318A9BFC55EC26CDC6DC17A400C6A46F65DE8AA502F5E310B53D76DD6511D27F76C2BD24A0505615AD5D86D5092C285E6BB3EFE014364698F7C88A4D36762BB9165D5BCC7D7FA0E5F4ED EntropyInput = 02BC5F68EC198949D814322CBB7D5AD07406E01DB7CEEF07C6A620F2F62AA2812EFB4CBD9EA8737B979DC2A149FB1F7629AA89E680C1D8AE60182C692B1DFFC5DB66AA5D357BDC88907841191048A052 EntropyInputReseed = C41BDC7B83032384386F950642AA8B2B8BC8A198562CBE4A3C259693760BB1E7108E08D94A6C7BE542C92F75D0F056ECD8981DF7B55B9471666DEB484891142D AdditionalInput1 = FD4DF2BB206199D80A7DA35B6A8F607D7D4126E0770B8DF5E3F5EFD9CC24E1B4 AdditionalInput2 = FE45C6A972DD4534A909D1E0EE0BA118DC44B1E413E3B75548A1778BEA2D9992 Out = F7D208A2946DCED7CF172CCE1AF9C6EB3675F24AB8AF7344792A3FB05498D27C8F090723C993F0F737F78B85BD897913046471FD11E719C693539F399C6918175195A2CE8BB82CC5E06BDE4E1C88581444A3353DA8337B3CEEFE780A5BBCFF8E29B09A2DDBF05FBFA6AD0FF6F90FF022C0BEE0BBB7449B82C2BF3C51B20B7863 EntropyInput = F019762E9CBC17F1C10FDC2C1A712764AD73ADE9AFF51A9D0A54832F67074B877D5F7998820F37A1E1A2D7845B214ECF41E30320F37F2CC85D11CDEC49BE44B47040C8B271EF134ADBAE811E2383470F EntropyInputReseed = E49A7E8D2B7907DBF7C9F422FA35011263ACB82179F1A2977544FA45CB2FD7D8D079E3B8058FB928917CD7BE126FBB19843530634EB3FB86F2FF65D8E173C3A4 AdditionalInput1 = 12F91BA1E9045ACF3697EE7DE948C4AA79F5389147AABDCB545CDDC16B1E3343 AdditionalInput2 = 9D14E12512BE8DF2BD9BC0C6CAEC763ED9D3F8C97C48A23E3AD1BCB9C465E49E Out = 1DED0903B29C1F1DFCAE1CBD7CD77C204AF8EE1492D7ACBE24FB2F71E8DFA0B0D180CC6EC39357FFB807956C90DAAB8794396E37A4675FDC2FD1E7F3041AE2BE864CAC235D41E56FA3845A52F827AB7D82E9DC7B07D379B5538C5CE6178C70D5CF4F37383B57057F4825E8340BB7029946C23E153281832BF75D360E58BB7B52 EntropyInput = 72318F1BA5C8B0E98F40F6DEBC07A46B0C0AE1FCCED71F6485E649FC01EFEBB831069CB9ACF504F44A3DB30FBD984E10B9AEE5275BF30436C3F8666F6779C5BF26BA6E934A44633D95BB50C3A2D87CF1 EntropyInputReseed = 44CCC32F32D71279F23E3585B0AB794B0D967FBF7313DB9DBA8EDA06064DAC69C72639CEF4B62AC7980507811637DCB4F923E350FD40ABB7CCF293AEE995972D AdditionalInput1 = 9C1C29D2C35F656502E72802FA0441B297B2C8901159275F38AD02B7188AA4AC AdditionalInput2 = 546802411001B9DA0F7D59F1C65CE380DCEF8524472B10BDA9061B32F55DBA4B Out = 7CDABA83F1891DCC485BFAEFA2FFFF59FCC73E79CD748E838629EB726B0AFE19B28A898C5442ABCB3F66836545EFEEC486654CDE1FFFF18264EDBAE7F584A595E38B3382C50299FCD94638290B75F1C8F37063895C36682DC483A65953D47B76CAB74239B00945A4F7FEE9DCD7157ECDD836C5B59BA08F33BAD5F552B6241338 EntropyInput = 7D1AFBB6F4F6EA98BE04AE89CBB2EFCF4693CF73FF0CD3A93E8BDE025A49D6B08F35E96640264BEA6EE77EEBBC9822D529BF916DA7A35ABDC2A1373905692EE0D948F3CED950BB85552C14E21491FB82 EntropyInputReseed = 7BE92A00FC2A2C9BE512A168C0CECB0FE9A0AACF98B7EA117B5E9B63FE3D1307113BAD39CF789317A8C4FEBE69264A3B0070AB893FE2175170FD9BC62717C3EC AdditionalInput1 = 8E726829B1C87516F6838FC5AF5CD79D1B7883D9450D433823344930AE38E0AE AdditionalInput2 = AE4F9608CF9C1F21C8C82514D06AD33485776551FF8E1CD7CA916F4CBD30ADEE Out = 9A3625DE9A2A27A48DFD83C15806F579187AEDDE9D2C8C0E3476674C89AA5F877402C5D47FCC25436E9C31E80C016431D5A58396D17B4D67C7E035019B08CC2C175D7EAAE4AD61DCD53251B34784590488A711301D4FFB1A78919E356F348A9AF088C95EEC3D998ECB2FFCA019F10C957288E48A849DFA04FBBAD4B866BCAEED EntropyInput = 1EB0F1A8FC95DFD1D89D893CE8B6DF63BEB342292D4A231008CF472E8011933C917755EFDE69E078EA24E6CC40C78713877D09340F430963689DD5C5F67B6379075D852312A2EC3329DABB8D26F2C6C4 EntropyInputReseed = DA3CD50614872EEB1E11FC9350D9456355442E2831002489AA4F5D0D35F62A1CE42AB999A52EF6A3B445D633EA2DDF336600912973F1CF3055160F9DCC5A7703 AdditionalInput1 = D0F2781A06E4E5B93BC480365E1DB4F31CE2743FCC6F52495E12ED898265A572 AdditionalInput2 = B697B7DF9319D15578641E61F500659B22CA4DE3A32026132A868016E6ED778F Out = 6F455DDF903F5A291601A366F0EF31F886C8165848EBBA8DE75663761F54107BF260C1D8D231508BAE913B9652801F2DC456C25F7C5CD11F633553CBB81BB57196C3A84D43306BBF3581DD6C6B929DF0DC7D0E82BDC9C401E043831C436A6820B488757A976CCCDF72417092E3380831876F313D5D82F4D78C30084A315D4D28 EntropyInput = 9A30FAC1536C908719BCFC996E259B733F64642DC6E81A0035E68C964D3CA31B30A54CFEE97A20FD13CFEBFB63873DF268EA560768028CDC01CF133A0749B76D8837DBA0F6F24A3D057872EFC9FF4892 EntropyInputReseed = C49152684C9CA6C0D1DD584F1F1D2C64AD36F82184C91B38A89DCEBEC193AF2B9A3BFA179BF8083CD091A76D0F7BEF0F37A0B94818DA973512F6A8D041D102CA AdditionalInput1 = 778E2F62A3BA1A164749A06696E897B534318ED2F7142F2649E04A9E93673B5A AdditionalInput2 = 142E67962A51DE933078D57F0AF40BFEED693FC717C650B0601DBE282987B81D Out = 60309379049CB92340A61227B0E76B516415B2A53022E59BE799E3835725C21FF9D51F796EF4BB3756C3262137085E498927C29D60554E89F4BD4FB03E5A84EE14840C795919C1788033B36EED4946863155AD36B784C1FC10E10FBD12F3326596EF07D50C5B4F2E3DEB59653A62158AD0DDF43F9B5267AC2C2F71B15D5E8F0F EntropyInput = 016BDC5CDC6FEA8F2EF51BB39DDF6399D23FB3BDB01BE921A957F9C761736C5405F75D508EFA64F25756C9A1C8D88480EAC17D8A199968F8A8CA5D2D9F695522292946DF8E60F0E91E9A29F565524BFB EntropyInputReseed = 3562B659DBF9C0C4A032F028444331F9DDF91D095C6A7F03B69DDA6B5DB2A11C58BCF42767A209E5EF80180CB660AE0E8789D656A7D1A84474AAF7A22C19EDA4 AdditionalInput1 = 3552BDCE77FB4D6693336ABFBD12A3620F605B35E2FBF9A84FC54A50ED03E498 AdditionalInput2 = 4979A09228938C0FD3E57B3BEC0E69211085ED9B0C54C85E9494FC3CD789EB72 Out = 19E62F9D5885F790282CA3A476AB2A2BA799F5A131216C7664E864668A375D33C5179E27EFD883A49C7B51794AC5AE120BA7433904A0F60246F814128FBA11B64743FA276D3D7AF083B4C51131A0A804AF58D5982A857E2E624B143E381C20C53049CB4D686F27F1DB130473E1A8CE733744D3B3CE7F1A6B34543BCF8EB6E234 EntropyInput = F4ABAEF3E46E9A548EC8E1B87E5CE52EACE5696BB558E228706EA08E1DDBBA57008524FC3F41137C184BF0DC1A6C78AE9EC8F6B57CD41AAF2963095B8951B2D37D8114EDC12871A6B77222E9EA6CFB79 EntropyInputReseed = 7076E78DD02DFC3CC3AEA42014D8A1B14A2C9E9846A2AED0A4601A42B4E578F2173691BFD6226263D2E724661E13B3E74690E3F1492D859D96E00DE02B38962A AdditionalInput1 = 08359E7377F8D656146E4FBE2B7FB215B4657ABDB8370FE0DD36997EF6D5789C AdditionalInput2 = E8D642FB120813922162E191F0C4C9CD145E18F402ABD3AE1D69A819E7C6291B Out = BB206B95074AFA0136AFCA6A9B98960F0A34E3CE68E10F992399DE1B9FC97093C2D5A305900DF91AC134245E97484D0472049483F312B48D86BA5107F40E1CE344674AD97F8E33EDAA5E1AFA0B14B923522A4CC0F008C5C01F1BE8E042E72258D6D5DCB2721AF017AEDAFA8D8DB11E1AD21FD6C92E652FFB77C098EC62125B6B EntropyInput = D8A504A0E538B9CE58B717DFCFD2C1E6E6ADE8DE326C2B796F2FC54445CB5EFE1FB41DCC8C219216FF4DA54ADECB54F5F662D9D7FAC6F8AB8A8AC280CBB4F76F68F8B16149A9651522C40E041CAAA25B EntropyInputReseed = 85B0ED6F75740AF23A75172ADA7AF10AC61DBCCAE9D73DCAA13620CFC41E4C7992F6A72A0AEDD2D1A5AC2D816730BB6D4D00A20D792762C768933F2035F73663 AdditionalInput1 = 2FD39E04F72176D837B4582B39E2AA9D8AEE121AAF8391A163CD59934F1D2F2B AdditionalInput2 = 0CD3E0EAC36CDADF1E173AA6862353F744F29E7C27051668F1DD162EEFECDEBD Out = C6B97A3345F2FD2015267821B8E1D53A9574378198E37893D3D53B733EDACAD3F5F12F527A7DF655892143953FD25981B7CB07FBFAD0BA75C8B7F9C4814F53F55193E00A46E3FB636CBD3FAD50706D50F9371ADEF47C7D2ABD2B6D4B2A1BC22384058510E86BEE1FB761ED23F88D72575667910DDCCB74309F95351C20CE95E8 EntropyInput = 38303F38C3B3FE05B129589252687EB1248158058D64C79085F6A2D66358917F720C5CA27EE8B8CFBB62D0B7585D90152A3A077C8931F70E7FC4E6659560EF1871E2E635C0C695300CCECD0310DFAAF2 EntropyInputReseed = 6DB8BE9D97F07BBA92399C6ECC239B14763ECA3D29B72F6AA77914C9493A6A7D304FB5F0E1AF4C43B9AE75FF748DD4EDDF9352FE3A55E2D4589CDA2F42E999D1 AdditionalInput1 = 952F3D43BEA55A46DCE62F5F191EAA224ECDD9B6E8FC2D2C406E1D21E327E5B2 AdditionalInput2 = 2E277CA7F1A0588060E04936B1904FE1851EBF3BE2822582B997F38547B14C6F Out = 779ECFFDCC1868D404AD88F68C6FDD299B7455227C28B3BAA1B0D2DED7643696E9E8CFE4C76F33C30A6DE81F9C95AD088AE387F20CBC8B4F5B53F79233A6224CD9D4678638148C86AE803094A9AFE9729FCAC8D489B5F40A1D5CE2EC4C1F63DE7CDC8E44AD2CBEBD65DC4875EA9E256A6AE036CF7B2411116097C0F5D825E3EF EntropyInput = 6D20A643C400795CDD2C17B92378F6F81E4655B37304AA13BEBFDD43E11C7DE73C1AA2BAFC5BF2DA3B80CC5A21790873C15345307821B63F308B8AFCC45F59D5060BF1CBA6D4BD9EFAE8B57ED84EAD6C EntropyInputReseed = 54518BF138249391B75EF6E0DB949799B084CD0E004F0E01B96A20F6FE0146D749919C95D97E7E0AE946D6EFE044E66C89753D3ABF92739103F33CD3110A1819 AdditionalInput1 = D99E235BCB5E5DEACD09A93784BC689461CD89F04412708F14535B0C64F14F36 AdditionalInput2 = 790741BD0978428853669A03741D258D65B5E6F88B18729587785409C80EF57C Out = 43FC557F47A3C2287891AA5F332AEA6128AA059C72201BE62F3C25BF57DE04EBCD8B24768D8E9044C6D2B4EA1CF8F5EE639DB7DFE3083503EEF8961DD74FEBEDC0AC35B4BB9E1227472EAB895F78492070A26F57C9D420AD70D536EEBDE489D3C22CF1CDDD9868B95D2F89849D3D01F1A0D1E92B5A2D4C7E0D9AB9C71694BA3B EntropyInput = 81A4EEFBD3832A298BBDCB1598035B178A65F0580D3F41158D4442BC39121C2B566098E5DCDD2E50984C0557E94F616E79CD7A6DD14C49D99F738BCEBAD69CB3C192066BC3D1861F55345C75D19DB3A1 EntropyInputReseed = 0CF7576EFA4BCC53D587F5398ED26F10110B04110CE4E551A970046EA7E0ECD53679B11F8BBADBC31548AC86BF1B56E5FA6292A731CFB86BA3B4A6E844365C0D AdditionalInput1 = 178577C9F2887D88561BAFFC6D61EE6F8D6FCED5BC86C1983F48F2BB2892423F AdditionalInput2 = BFBEAE5E6D224D3603C75B1A08D1948A829274FB78BDE7FA08F7193135A07145 Out = DE23EAF95FBCE00E32A920FA31874ED7E8023A07B37FF74AA54BB9564B35EE2619AD1DA3E39186FF73728D32F3177A0362479DB20707769BA59ECF5614185430D6D96E895FE25DF17F31CCD900BACA806B99B2BDFE1639A3DB28944BB542D08EFE0852A59660289C9F0D5E3B93C0B6087CA17EF2B2D23F4B6B26A49D8A1C7B2A EntropyInput = FC104B74EEC5DB55569216AF50D9E473AF449FC5657DBEE8D4DC7003921562F6A135AF56FED164E25E0F938C39D4AF21A755B79035677C344614E9B9B9A17958C11D8179802203C4DBDF4B461D897696 EntropyInputReseed = B8D6BCBBAC7800FAB17F0B001D7D76E929CDC99E8168019466E52E12672AAFD20328B9E4E6A3403376B8EE77A66527E6B7D6647F1D3DA79A1AE25C7203BE91F5 AdditionalInput1 = D38F821E74661ACF358CC94397FF23A11C9FFF7CB117659FDE00067DD62BBFC1 AdditionalInput2 = B74BC5AB03AFAF58A10F24B31631BEA8BE0343FDE1AB3EF4EF77A3292A7E920C Out = 7F50A38A214AC629600C61C0CA2476F0D20060A956E19895104090525C8829AD89EA0EA350D06780F38EB1CAC6CB95B9DBF78CCB5FB21F470CE7BEBE4AA947B5F4467C8E735704BB8D939C9A7B927DF3147082A50BFC33D8F387DC6E6984634BDD84B8EE0716A25516FF295045E394D19E5B27B4F8E1126E4B4C003E86A8CC00 EntropyInput = A7A633446D7CE354E73FE504FCFBE6817C1CFA1F7024581A8A40049DD27BEA3FDD3866BDB7CF2A8B12C77014159633B4C101AEBA70D11DC11BFB3934ED2BEC9DECB33E67291130B290C9DA8E090D0E81 EntropyInputReseed = 270B0D85DE0A238F52FCDBF21B952DFB77A700988C2D0BCDAE2B149B34816B138817E467C7D913A102DD2895AB9F52592BAB28C20EDEDCDA962F00F18AD08B62 AdditionalInput1 = ADB49D99C15A98BC89903D0CE659EE2B4DA7228B82E077C7B2B5383A44A6495B AdditionalInput2 = F7DECED5363864A30C9D6578DBCC8A0FCB3B20F9D573C942142CACCE11B9DF75 Out = 3A6ABB0065EDF3240A4489B08CDF9ADCBF7E117093E80CFA49C288B3C940188FF543EF1C37E8BF8FDA4A759F5B58EB9B35827D74B7D740CCD13064B3DB45DF26B8F366267FC2E62895B4F7516443B83D0FBF539B14EC46BDEFA0C40D98DEE7073C7F01FA99DAD17048773B7ED5A68F3903229751CDFDBE85431B1F83D48B9A25 EntropyInput = C5D379AD1D5BA894C06D56297A80975144F1FD677B3DA7106668A7AFFE3F55C975231EB5CAB6211C43E36901F3EA0C5A EntropyInputReseed = FEED006A590BA107A88E70A61FAE758D39A312F53F86409D4BD618B7F7A12E56 Out = 985BD5F9F4E33C371200D03C94319FA9B2695F683F5459005C29A31C3751C6DEAE313BBE1F5A4132ABC0853426DD20A74239808F94C9AD7EF5D9D39CF3E032AA9BD90C3D919968EA817B0D20E224DFBBA7C285C42E5E9347DBB13952772BF5025F3170BC9932CBFEFFC1AD5372C217234DFDE7436856F2DC67E838B12EB2FF5E EntropyInput = 2667485D2283E66E1A8C4BAA8F02613E24D31E9FF134F985B4DDA00A5DB507A3D824B0E3A407E12E0C4D0804E282FBF8 EntropyInputReseed = 6FFDA415809E4F0B16E5CF913645698528426F1D8DE9760963803C21F5230C80 Out = A51C08A6449AA409B1F3560CEA4E98A9F30A81B6031B82FAF6E40891538F9DB738769D91CBC0F2D616FCAF6A491E5D610F2870937D2594FDD49F6FF49665D61D36FE422805EE96A18A998072AF58F20C171D2313CA717D96630E4CAED97BA44D5FC33A335ABC1E86A0F1B8005FD96EB6509C3BEEB61CF342BFAF948A8EA59103 EntropyInput = 3A1D14F511598383C92E568C3203F8A32F08ABC6A65F0CDB927E7DC2CA968247819F893078D17C3A3953CE4572508672 EntropyInputReseed = FBEB630F9E8AE36392897F60EEE04A3752D138A7FC373A306B34A2664F84C5B9 Out = 1FC5145973798F1069FDD03F7860AAD0CEC45968696E31B3506375BF0BC814D853EE5894AE95FC8C7599DA236748125F5309F4425D29DD1E4F97B5C9B677C15D5D32BFEF76C70A5C8B4D6A318452B7D1B490CEB5EE2036D2D583D8C3E1B7CB8CE8C81DBC38BB18CACF0D84D8160652DA314B4DDFC74AF70B35372D4CBC82D244 EntropyInput = 64756DCBFACA806833BDFB495199120127A0E865562B2D5C95B8B3DA1A05F27EE845D117CA1F1FBAD8E90BC71DA389B0 EntropyInputReseed = A1C9A4B53946A46842CCAB782CD552821D75C6B5AEF5A8678457834827AE5250 Out = E66AC9505716CFFEAA68295D4691713CBFBF9894545527C95E02E0059B0A848224AED34000377BC321DFADFB039E042458328F49B62A640D3A420693EBFE0A17BC652CD24E105D149D3EB29248E696DDBC34B12C535F2C54418FD722A3A648A0E3A1DD0FD319361C79BBFF737D674819DCF6241BFDB70E477C9FCA7C410FE8C2 EntropyInput = F05C26EC1BA70528E1634F5B7D78461CF6CA7F2B65432668322267E5F3A9CE0F1872E1E22075ED1E4509388C475F9A2C EntropyInputReseed = C06809FC48F282F67BAFFA1BCAEFC562D6B489235410C0E3AA90FCCA45BC9E70 Out = 6A851148B04704994EFF6C4A041E700B66784A7B80F012F457014B030746FD084B47C99B3BD18027C36E3848436E3BED535DBE53A6F4D7EFDD5C649A09B52FA32FD90C6A9B1F136AB15F025FCB95E409E219542709565B9605DD2FC93E3AECC8C714D2B8B635CA22C8D3FD8BFDB6F62C243DFDCCDEA324544DEF4C4595DC4449 EntropyInput = C071B6F6E79F02A69CEE38A5A10AB6730E467A1FB40DAC80BDA5BE0DA028555157678D0A8F89295BFE23881417A0B58C EntropyInputReseed = 19899E44AC1017368CC14D54FDC3402A56CC074B6B87C1C490AFE474741680DD Out = 1D1DFFBB9471EED348BE06AD1C6153790AE6ED54C105C7DB81DAA4F95A5120D308030A03771633913EBE0BD36421627E695D7898B4D63F0F04B17F87F91EB62B7C72269282E82E7A1E95EC8EBAAC2F8F660C63CC43F981E098BCFF0962725134ED9525E6519CB90CA96F4FA102D3C9DF66AC400CAF53F3D53A38D45D3CF86F0F EntropyInput = 2B8CF4FB37AFE03994700FB64DE602CC24F6666830C520CBF3E85D025AA296C5DC9414A16EA701E513100FAD082F1728 EntropyInputReseed = 26B510869AB451D868AD7F2D6DA0B60315D635BFDDFE71CDBAB2F55D4B9B60FC Out = 2ECAB3F023BA1233EEF3FEE0D3100E6F3424193DFD32D08F056D7EDB58A2AFCEE9DAC0EEACC7421E36B6D9DD5C218683572F857646FE3538E7CEBDC84E47C76178C3A862122881AFF155456A7CDC8324B958579AEB7F09915BE3A7A9861AB512AB127A4B19486EE1378270574241A213CD08E0BD750613EF58E432C3819CD7C7 EntropyInput = 6770516ECCB537CC6286F89C83563AAC6DEBD72D0E3E40EFDB7539B6022A1CFE0D99E9DB660E0850529763BE366CBDAF EntropyInputReseed = B34A78EA20E6476230FA98D45FF7CE62571A81C5DEDDDB97D18A31531DDFD446 Out = DA3E44761DB8E79748367B67E5DC29A64E715FC7D5342EEB4A907BA1FB08AE35C777EE280F771D11ADE5DBE92B88752817D45B8E38CCF0E96B5FDFD16EB851C2E9D95C5411EE7D9A804AEA8CF3145C7FB5DA8C428EC7E2FA15050024FC4020553BA09D1274695532C2E98DBC3D7940DE93C23F329C3C93169DE1E3C323365E0F EntropyInput = F2FFBFBBEAF10FA6C1D5E34B557DCE2ABCB30913E4753EE0FA3F98BF6038108720F095AD4040248E199F45805BA26993 EntropyInputReseed = 301F82B32FBC7A177E8501C3321339C98C8827EB896D99F49B8EC39D4A980AF0 Out = A41E4D09070CDAF73D4DD54069D1D90DE093730115B4DC4D6A453279050F9A0D6E0EDBF0985F1DB007CDDFBFFEEF0F55D03C558F0664AD8120B78AEBD1580FF720DFF7A4D4A2D15BBC260017DF7FAA900A62EE6596B6E5F5075D926E653678173CD7DEEA4407FC0F8F5C20B01B1A43A19997A76D7EF5DD414AC255C199E1579A EntropyInput = F938A52CD6C75AB780B771E51DA3241BE6A5C73D80A661416922A64A09AD20EA5F219FC1E68DED0D7A667A0DEDB9D125 EntropyInputReseed = F459F4757C88FB407F000BBB96EB1CE3897C6E7DCF82DCD6EA4D7E1E8A27BA94 Out = 4336FF7AFCBFA2DCC8253830454104BFD0F14A57BC136D037D695105675308266662E1870F9ED78A844A334B8D2663AA69F1D93C6A213B0F999A4D5E39AECC94E4646104AA9B1755A1D8F80A5DBC844DFCA14217B42C0D92DC9AA85C88DE51DBDFAA0B2F3CF0F8BEACCF5FCC9B73A6CDE1CCF78BFD2E0CBE07C3B17D5236717B EntropyInput = 7837A0686780533E7774931CCA173DE5FEC9E2CC9E355A720A5586DE04FB6A42078C0BEE3BB0CB9B5FB3ADAE90971288 EntropyInputReseed = 91820BBC9F387DF3D70BBC0A74088F04D4D573B2C93CEEDE86A44A223ED8B82E Out = 0FE2BACD38090C224BCD1DC47FE6B9D5D498DE84730D3575AB030E2FAEAE9CFB31CE9B0D588E0F1D048292022F163AF065C0DBF484544499107716925F3582CF47FBD8B31A0B12B6F849EC3B507DD495C319BDE1F9DA3772E2A6B5CF3005AEE5FE0CEF1762E65CED645C46AB2744CE6F018BD6452B83D7D76697FC0FBDF9949E EntropyInput = 16A4F3E46AA3794CFCA3063841C0CD193FF96F9F17E4003055B47180F1426DABB7BBEA6C36F729835AC8A743E26DEE2C EntropyInputReseed = EF77599A554942C380CCD459DE3C3BD8F1140115BDA548DC53A05AAE1C9AA4C8 Out = 54F7C2727A82D82A6009F1B6337F8FD153919871ED1DD7CE7D1C96AEB4392C0BAC7A5BEC047F5D5F51ABDC00EBEF93EA2060DE5758DB90A5DAD450C0BF911462DE9287395E666FB7BFDCF719A30E41E7D1A9246287C0DA073216D62CAB04A249CFEE7BEE28BDA025C4574AAD08AA37BBF94ED7E2D7AD807E751DE5A4992E8005 EntropyInput = 3327CC150EEE2A7306B2F817393597431F050E60A3564B1976827EC669845811DB4EEEA1D2F80CB85889BD693A0C0F13 EntropyInputReseed = 9AF7840E1B93CC10959E1E7C739685676ACEFAA89CB4F6AF9945E46C70E0E3C0 Out = 0A6A24453454D5D0C11208AB72F02EDA6D198448CC4C362BAB3A55B212E799C923E002DE0313380FFAB5EE5574504CEAC600DC2F442EE72ECE4B3CE45520BC9CD0DC44FD2DCF39BFC04D98D9062D5E83FE5D5C9C1B377E9D366B04604F7F44CDCFDA4F9DA38F7BE00671D9C6895B52966C4B6BBD998752FB030792912E2DCE35 EntropyInput = 8516B7E1DF5772CFB695B8380B3F0AF30544B3244962C12D1B925E936784088B12083E2F6AFF93664A2B766A1D648D22 EntropyInputReseed = 4378B0CC9A9320D8DCE8612E03CF9C633CB331337596DABD0899B0ABEADCA954 Out = C1B8BC8FB40BBA2FC1E2CD2E273E4E7AED2E125954B1AB2F0A90C8C18F54D173AD2B023F87927F86486EE01D38316ED3CE529BEC7DEB201AF3067DF7B364205B9D740A1A48EC9FD636714B3C21C7989BB80EBBE95D91075B177758E2696702D77B57ECFC0BA2D284A98E0C89A489490B2F7F6160C13262370FD7CC136614EC9C EntropyInput = E8FA84BB4AB99189EE66595063F70BD7EA0956CB9969F18FB26BF2F4BD194CD7D5C5BF47D70909310785080E656CCDE5 EntropyInputReseed = E758F88ACA4285F25E3596DAAAB91EBC5A2D9FCFF4BDC0998AE9AC9BD1E2D48D Out = CBC10C31F494333E2B2F1B2621700BB28C5B2851B358B71072B887BF1A06DE4CBABB659B802D463F442EC2A5B99C570C989A447D8F4994BE1AFB803398A68420CF845A1AC4BDCD3BF3DEDE446B56854A129431D281BB8CED27C35D8FE5111614ED822CE82014A994ECE8B2C20B4069025508B972B56BF6CD5F6BC6B00E32AB17 EntropyInput = EB9DB649DCFD8184B44C18B3651EA0EBA42B1058EA996BC8A57BC66A3C9AC07BEC49D77476F0FD289F4FF33E40532008 EntropyInputReseed = CE28AD2CB6D98B232AD13693AA77C4AFD27117710BE07A9B291AEA765D1271BB372F2E2D5019E1F8A0D6B8F29BD0F9C04FCA7C07F53F4D4F62B6D764F78731B9 AdditionalInput1 = 592E57ACD712308F91137EA83CE8931CDF13DD3AC81183CB08E2DF4F985AB926 AdditionalInput2 = 2E36A19107E0CAE875D0B3516BBAED86245B6496843526A276ABD793767B7D1E Out = 47BE5C2729DAAA07168D990DABAA73BB2BE0C9FD724B11374899538553757C408897CF32CC0F92A5560C4C54C2EE96210534EF252800FFA5D7086021DC9278DFFEF531AB7E294E532CBBB38D52C31495135EC326772C5A0333903C3C44AD9B59D09109017D2E9439B8A63DF7C0AE7048319F520331D30A3248E51B559D040AC5 EntropyInput = 0C9763C6C5B1BB9E48432BC551E74864E4BDE6569FBE852FAEC481B1F3D30EEB98644AC975582AF975A5D1449D42F589 EntropyInputReseed = EEDC2EA994072EF7994FAB06A19A3ACC0563AAD6177D4817F3FD054DF807720BB5A91349CA9BD3113599112B15FC13686E49F70E949D933A7FD65B46F3B689FF AdditionalInput1 = 8165777C0E02E29FFBA4B23E9DD49D0A9BB6B2DEE74A6B79597057D6394D2436 AdditionalInput2 = 725F7E6F8181C6CD98254BED1151D50491F25AFC9C36DCD842107B851704936D Out = D1C7F20F67672A5AE0B85A49BF0FE433B296B4466FAC3117B8183C341955A72427AEBB58612EF38DC2AF578E42973741E8C2716E0B93786EE8C2B59B6AC5F42583798F9EAA5224A730D9CC16E12E3C5B5F500AC9B539EEE87B65176ECA541FDCD835ED1EB70B20393ECAF8BDC29F5424C37CECA11002CC00DA8F8EED6AE386C4 EntropyInput = 5D52AD856F5397CBAC68ADDC8EEEF956E3CFE8AE00A7969B4197F5F5A7EDAB7908A99A509109A50F0AE5B4F446EB84E9 EntropyInputReseed = E6663980A36AF878707E832183E619F16167C535995337FC644030C4E92A14E4EBC4F2D339A144F460F49D8D208C3C27CADD1C3B0EBCB4C811C0C04B998C16BF AdditionalInput1 = AF0A589FBDE50AF5CCCBDA8D8D7035FEB0BF4957CC8F0344B7C79D36F2EF558B AdditionalInput2 = CEDCA3CE01213B0139F52DE583CE9C6E40E7C8A5B1DC323194EBB53243774195 Out = D467934C7A8AA0E99CC719428E9A17D940F473981F313ABE4BFF8BAE1546BAAF61F756CB0A42FC0D2F31D1148E62130E86458C810B497A08EEAFF4641A8C044F12412FFBA109B08AC34A1AAF9C61E5A991A390B29424D1470F906E8341315963C27346AF0CF679CAF160B5028034ABB4E5DFCC8533423DAD01096725104EDC26 EntropyInput = 9222B9D7C158BEE6F6FF5DB9225630D146C9F8AA93AFB396E809C14BE68A711708C5287FE73AFE15E3940EC3CF4764D4 EntropyInputReseed = 66A88884F2A6CD517D16C8D81E5EEDDB68065B982EBED67237F4F56CABD4C8351BCAB288FFC49BB582F308847BA20CAF1469AAAEF8E1F1353FEF278518CCCB33 AdditionalInput1 = 949A220AA142FCD5A12E74F0307702CF81C472641090ACA569ED5F8871C120BA AdditionalInput2 = E0C98A8FFC1C90A42314C5B8A43D266EB2D0E053C4FB4203B3AAB3AA07916544 Out = E1B1D65375C50F1B799DBC434EB7E59BBD70C4FBEBC4EA63EFF129EFD4541DBC23962FF743DE3E66DDF779E524AB1E0B6C40B6A418CD29A799E45B8D5EA6FE582B598691877E7E4301793419D1F2C88F5321FA408ED4FC32C202160D33F342C77FE50C1E0933AF4551BEF8095E4659C0E9691C8214A9A1CBC040134EA5B6BF2F EntropyInput = 2355CA4035584CEEE84E3CBD61E1A62F0DCDB0D1566BB6EC76F74051C7513345D9023EFF15F08998EBA05652B1B72991 EntropyInputReseed = 1EA9EEE8E509AF3BD2BCF814499CDAE92A02342B9129E13717C869AC5B923AA0E3285183329E5F208E62F4356EAB87541296CCE46FD92D24D05B971FF59E4774 AdditionalInput1 = B61726319AF8354DEF156D9E52A6BD7AE9160B4A6D6E77DFF111DD73AEBCA509 AdditionalInput2 = 2D498FE3963C211069FA82AA055E95F67372E118353E676ADC9DF4E853512BB5 Out = C4EFB45B11F84C93476E4E586D8A4DC9768A3C0709C2DA30B51C39D98808E9F8B60C07E0DEA821AF1645D723F6834270A67D62A0B8D1E55611AE7BE3ACA0F6BB757EEBAA2AE049DE98C57D02EF894927CE81FC3D84F66B01C2984C3B205C6230A353148AA643B58E1D7276587417204A779AB571013D143A26A23093DBDD9ED1 EntropyInput = BC26930EF299F0E8D811202ADAD4C876982F2981FCA4FE6F859B61AB1C3159397107E8978FB0359DB30823B644465357 EntropyInputReseed = A62B45B9F190670FA898F0AA0DC6583BA677DF92FCADDA541346969CB5603CB63F267F9A0AC876F419033E5C2F7E955D37E690C6F2540CC5469BD076B1DECB50 AdditionalInput1 = DAC68C8BE08A1E8B50D135484FA6E3EF49B709726435E8998EB543865344E79A AdditionalInput2 = 43CE6A0C3EE9297E4F6BF590E61DFD2C70EB41AA8409EBDDA3B0A50B741C2DD8 Out = 1482588574FB400BF6180DE5D52A2A8F91B4D991BB88A1AF95EC505591BDF557B11B095EB6316BD711C57359333F6EFAB3A321C167F6946E5CE8D351110080CD8AAC709D1E8C69FAE5599838DE4799FB9644C4DFEE8C7CC190026508AB8C03195C8D14EFB629E2CFCEDBD39C5CE798E019D72291FBF1C294D0F448158E30FE72 EntropyInput = 578512F0EF409D9F2172512F7B59B2167D6BAA9A68CE8AF54A3AE074CBA077A6A6F961B670CE19F63E80E2C3495BC9D3 EntropyInputReseed = 778A30AB819731F7926963AFF7CB4DCADC1D10A28625A4CBF8CC6D88889E944DE87666543516B2C0AA270D146C5D6C5A109DBF2C5BACB57CF70BE43010B9CD7C AdditionalInput1 = 7300A19D742CAE900C74711B75C9E06DC54254134CBD6CE715C1DA7BBAF841A7 AdditionalInput2 = 42FA023F15BB2B319E6A9DDDBFB8EBA451000E7815B15EC376A194CE9D56010F Out = 14B08B11AC8D4593F2FBB3BF5A47388840E590CA358C69511727C4E762200EE50846336EC614D94B5C5C15CE1508BF1DC152450933D3D6D83833E1183AEBCF913995D48A04F7F13EEFB23058069F4F44D5B453039599A7488E42554BA498FA6A26569DA5CA86DCB553B29DF4AC963B0AA2E21C5A0800D7BA3A325BE2EC325C72 EntropyInput = 637BF78A99981E3A9BAEEB54BA7A1007BCBE967B7BAAB85990675A1318F10EC7812EC8E6BD837426E2D9D95CD47C48ED EntropyInputReseed = B2D39C0C6E2D43278C16F30D6E5DA07609BE4478BB9198E692C7200994FA80D738011FE8A647B553AEADC192C7D9DDBDA223E01E3C7ACCD9EF5F8376DB2DDCEC AdditionalInput1 = 789EB7DA5EC7430711A85D59E8914B240123AD8EEE8C4A74693C0D49B7B4D154 AdditionalInput2 = A74ED3954A06AD4B4B1493D1F3D93A9785D259CD14CD9F99F48F0757967F7163 Out = 7D08DB43A688B319C38FF49457790EEE6E75ED62EB01DBB2F5942D21B5EE682E90FD05340A5CD754E0700E7049784A7EF6EA84E270CC8B208253A37F214DF6277E38D2C63065BF7CDE0DA8CE5E3941D2B5EE4DB0AAA97968C9DBA8591382C0C897BC02A47C2EAC2B093FE263A13BD97D510F1CFE131282EFF78D588B59B2190A EntropyInput = 231F1E34C1B8B0B12518182A59225688E3C2E240714DE3E252E085CC864B8D6C13C899DB2BFAD3544B851ED537B9E844 EntropyInputReseed = 2A95D6F5AB9726532AAF431E60C61818527569838691E2F79DA43DCDBFDACA29E85E63C5E69B8A27915EA3772E63C0DD405DF88905707FD3E79A189EC349FCE6 AdditionalInput1 = 1FB65913EE397AC4931D0F82A285ED91EEC1FBF2692A3A1F00B9E9F0FD47D184 AdditionalInput2 = B5826CA81D1B8676CC4259F77BB784B58DAD94DAA64693F7E0BF927C1059EDA0 Out = 61C53125C1020A4B06AB73A3A0D6C8693074CBCCF34B200ACDFB8DA887DC521FFC4928C5DA60507D6623DDA1B460B0F2EAA9516905D86AC56F44BCC5B8AB07299CD530E876C3B9779D5930C6DA16AE187732630C4984DE60A0A42D987BB633D105E57AFC88A50FFCF8B969B339C2511492DA8D03373AB4C6CE3D214AE4ECD9E3 EntropyInput = DD474F5F17C8E76DFFF45B7FAFA8B68E96CD2E66E5B439385DCC4949D18463166B1DE8C44D414596CC0ABA5A8AD50219 EntropyInputReseed = AFED3BDF2C7B646A1E93BA72379D75FF7498085D55AAB879BC794075FF7C2F8A050296B1E00AD1CD58AED2A668A67386DEB27DE9F2C325AF8AEF9804ED993D84 AdditionalInput1 = D54D7B3DFDCA55915418FE858CD33C181831B99E4FCFB9B0B92CF75A1CC356C7 AdditionalInput2 = B14FCB3A7700411DD0A59BE3EAE849D046A516765D0B8319E7745E992F243F69 Out = 625F702CF2D9AF780DE2F42B25ED162310E08CC114A9BDFBCDC82407590038EC3ECA947EB222CD579290E07F170D793A4F4B27266FA72EEF21E6AC2155B27A9A8E1BEB6E5541CA007D814CE4785FC2CE1BD52A90D54F45D2318ACA850A49DAE2FC76178B23F5230416E457B70A1BF1D12BD5DEEB961956260A1BC900965FC129 EntropyInput = 1361D1448265495B63FC56616793F1ACA1D4F7AD1757287EA5C110397A89C2CAF7047768CDEE4529757F80A0DE72EF2D EntropyInputReseed = 744F45F50A45DDCA0C03CD111A15E34A0B65C53D0B3520C2336450ACF9C14BD9D1F9308306B077AC6CC39B2E919E961C6FD05756DE2485AF247032FDF55A3A9F AdditionalInput1 = BD1CA21E296EEC6D95893DEA2A42F3D30E76181DAD96F735AB3AFBFB7FC39D3A AdditionalInput2 = 0A038E95B4A6480AFC2AFF1D104080046424CD3F8C01178FE01D0A29B83F36D5 Out = D27E512F9B7D015A9325F27D5CCF7AC1AA7CCE013E619C150F1EF391599B9697AEAE45E99EFADEC7D319315678BB06D87C95814E86A687F7FF6E5C0BB9BA4C94D69C8FDFF354E5F7BD17BC812681359A494F8682F2FDA036EA4FB5862B31FB18171AF45A5F0A4420A16134766E5F6F55C192F151D9E314F6991DDDD860BDF11E EntropyInput = C2260FEAF514D061D21115A10CD1000BA7E419A38F7B3A2D2B247F815183BBA4B84DA6259F4FD35BB1300018DA3C197C EntropyInputReseed = 2CB1717E7D01D04C41706514DAA7FD28BE36EA2F561461EAFD4146D483C6865F44538A777937290E7A132FC7B5517A1A719575F34F104AB3CEA5246C32C97D42 AdditionalInput1 = A3F4099120AFC870A8FEFAC28AE06B9BE8F7863E1C9FCF396D3F831BCADA5A0D AdditionalInput2 = 7BA6B283D34073E76DD5608F75CDB65BB039E6272F5A80F88411E1B06A7EBCE1 Out = CAEB2C55C41B6B9BA5C5088230104E9C9BAA0EC606FB0BDFC9D5656567D36C62956C3103FB4EE21FB38FFF0369BD14D25F0D0E1AC1668D135197887C75111FD59F8B449943B20659FECB85FE0599457B3AE734448E2325DA8AB7EDC7BA6D4B194578367E8D42B3CE90883C179C3FA3503EA732D8D7CD8BC5BBAA9B7DE585CE40 EntropyInput = 10EAE699C4A961C932DB26E96A14EE60F1BE48541C7ABD69B791981F3C7EAA37E40A7570129FF4F6B12ECA669493B39E EntropyInputReseed = E5A4282757EE6877BD175A621D078AE1E2242A66F61CEB65453A38CC1FB0EBD11047922ED485F046459090C91EEAC33F0D7AD4F00901A7E8C3EC47FF31323445 AdditionalInput1 = 27557647212CC054258E27DD29BD987474D6B1B056A04369FE3C595C168E0DBB AdditionalInput2 = 9D6432EC5D4AA5DCEDA9E134145D0D490994BF17182E7C0C29368057FA32636A Out = 842428A7EA9EC0A38BBAC5A2911C1D0FD2A620B9E3A0488B45B1C95EC3CFC4DCFDAE63651E718B1F8A14AC615EB35F29A9A149A5F4145F9C599EBE720ABE6E83A9585D2CC9A72571C1C7EFEA7E9935D38C4F8CB329F9A557B19F99D565A8482410FDCE9F0F084A8115E01D24E84DB870D8067D0FDE1B8A2E2E5BADC6E0BD06A3 EntropyInput = 33D40648D9772F5FA4E968EB2A99F73BD0204772CF6058C50A4F8D0CB78DBB8D237440F67F3C4DC9D6D1D6C9A0059A2A EntropyInputReseed = 170888240577542696686DE4E457BB7788F8218FC03DAACFD0ADCC3F341C9194D979ED113DB2B129798E454FF108AA9EBA2CB9850B0CE012DB19D3B8E8F88A43 AdditionalInput1 = 5A3D74BD96E53297D83B924B392CACA7937FAFA5DFE1F058B580847C1C57EFD3 AdditionalInput2 = E998842C65E76B6E72139B1A1859184202D793FEA43171A968BAC99E3813C336 Out = 39111845BAA7405F07006A1AA3B789372A50B50F18A7A0AC219DFE517A184B3232F060927790D914B06E1CBBE61CBA6FEB332B19967B75C165E1A02E04463E1BB8A522F9F9D1C279433799D4C9BEF627A8B33A01EC891D3C85574B02B78D90C82BAF5EBB8E12C0788C8CFA7F88A2FF1EF55F1F65AF5D19E9F8F7A41B373CB66A EntropyInput = 58363AA4D8273987BFC9F66811ED9532AFD706B33F362D089DA1163C4A9CFCA55E707BC48AD10D1BA8A50F0A75C7F740 EntropyInputReseed = B9F29B48FB52698FD779632A757A350201057736F821630DB9C0951F2660854ADC6ED0CAD6EA4B16AD37B0C343EFF0A33853200CE3C5954D734A9C9AEC08A6D4 AdditionalInput1 = 01E41E770157C8BF172B286FBE82F62EDF2592F31EECF2311443E7CAD3C5563A AdditionalInput2 = 0B70E161491F8D29663064C22A1CBCE92F9348E6EAA0E3BFA0E8F561F4BE0887 Out = 8F5AC65A82533C049F28B04F88BC9FC73DC8C45914AC382C5F411FC628C1B9691CA7BF771919AA6711B0B445C1506689EE2E45B3DD3186E9BDDE8902666339AD7764E2D13DA823C7807B95CD6E73E1742804C55D55E5DC2F3E4498D5B695838507CE6F0E8E7062CAD8133D70740A1A46181D5ECD03D733F20C4AD4D814FB2ECC EntropyInput = B39CE17FFC2A0B9BDA2F26C3AD6EBAEF6B45A0F4664A44C8E45D4E5F86C91207289969ED00D77C20EE004A856059FBB4C7C2EE032B45DD994AF3EA03358C478C2D250CAE000906F2C3D9022E5CD789CA EntropyInputReseed = 3468CE9B746278248BB0B13FF7AF3B44E3BE696878AB7B605499D622C886197E Out = 59DD729CA7F2603E2BF2C74D353F0FB2FB080BBBE3720E53863417B89AB267543903FF2257B6E9814E9AA340AF8BB270DE4498863C9E8B57B5B5453453CB59387864E80996678058FF10BCFD2000A60150D8497CE0227C9F6B7512A2A9F9839AEE5D6B18794C2197B6DAEAA528E1BC353C60238369102BDDCD93C960CAE11FCC EntropyInput = B89EE3BF0F121F422E074E28A476E617C37EC022A2FC0216380336EF52EEAC96F3139D15FB6F8BD65962B397D49DA70381BBEBC3F038093D5DA647707134725342D040D2C6033B80D5C9AF2F588EF1DD EntropyInputReseed = 8692855791F945FECCD91BFC113ADFFD3E1D39B2723D73D3D0E0EF6C32872FE8 Out = 7589A79AE4987B033A34F0FA35986324D7134A6A3C3C03B20E25137450E0F0FBFE01A4612E25967314EF6EF1DE5512338F0B81D8D64D18854990922D2A90415C99F2A4A912EEF8FA06461AD6CE10ADD0BCD155D9E1F9A587A9930E02925939499CA107F295CCAD500063D1C6BC7E5013BC458A338A6E40B76A6F170815B28F36 EntropyInput = A57BFDE2E3ABE615DC492DA7A3F3AB4C33D0D3E67C2FE99A2FA9C133C24F29AD9974096CB9F0E5E740ACF2B2843D7523321D07178482E54C2E833123B69CB8D8A8E6117F4FF0D2322E5DBB8F9EFE77E7 EntropyInputReseed = 47073E3915D254C6FF0FFED45D786B3A469706873AD6D7555913B4A55E2DF7D3 Out = CB82DCA56973556B94A00E122CD497E4C57E433DE956D6A8C20107F540FF303AE5158DC6F65D32CF5A5544619B5CF3B74E928FDCF974996EC99FD4F1D54461998CC4C9FD710B40985BE0D36AA6709189C2E88FEF623602F5DCE3D74BB50BB3735A349B7C53209AF6E07EFEC8D8023950B2E63DD68D07AEF8E8837F1E29DB007B EntropyInput = 8136C5850F5822F23E90CEAC2339DE7E3D35D5F53825836D5B2ED2F6F571FB68E37A9A7558C06C00D72DA5710C8099E31B2D8932036E093A5EAB45C3979E49389A531EC36AF52D363B508DDB900AF76E EntropyInputReseed = B787CB020A48E3A013E5C5F2A5215CD998C63663F406FA1FAAA9A5F926342AEC Out = 565D1387ABE292FBB54263BE5A3AD4AC5CFBF17795C526C0F8DC128ABC2679D515CDA95EA87497B1510C0BFCFEC7D9A303DD6660A0E6D8C93B4344C7B220C757E560C2F8D9C26CF6C17C39E61F4A7BA56E1A974B707D64557E55DEC61608B33CABF8C4C69B76670EACFBBF886F26317FC2ABEA05D5985F3F4885AB25010B87F5 EntropyInput = 4DF9B77C1F1F278EB555D3C1A35CA8BF1975E32B5EFB9682B21C13C7C18B089DE6544A1B19DF39583F85073FE51A62E36689EEAC8943E02C524D8EBFD7F3F76E2B642D1FD7BF80B961C10151FE66AF6F EntropyInputReseed = 3DD37D7B644EB39AA2EAB07B6A197099B33632F64ED7D3A3A6DEA0D0D92BEE38 Out = 6C7537621B64256F24BE60BA5026BB67039CE5D35FB358E54CA800ACB5F15D6F921F06686A16B0931BB737DA0E56A9ECC0802E5AC92189230D66E9697FB54C18249E1D958DE51A0B26843A36D8BCD922FD8B3D3D49E41531ED2638B4F5592353FDE1B7F54805D71E8062AC6DC1D3BA31E24DFE8F203192085E9CD515BD7C4608 EntropyInput = 5DAD40875758E5363E0B1515A010E4ECFAB1A7E848ED984B2451A4B78E3563B3442F84AD59E8139CA481B99B5356871FE42432538F94A3CCAD0EF35A8A77E8B041450FE57095ADFD0343027FDA6F82FF EntropyInputReseed = AEA9A2C784C633B9075DDFA8DC6EF153DA89B5613FC7DFAE85CD0A48535120E1 Out = 63DF8D6CF34363C294BFE65FB35E03AC62ED84CC1F8133DF39E04837E703D44015CE063DE83C10FA49FDF00F2A80C4111F637B1BB0A584E76E6F87CEE5BA74407B0951259DCE279F8887FFFD122409DC2CFE8840455D01B8734F2B41DD7C95C2767280ECA14D87A7B528ADEDE8A1C13B5559FBFC0A2FB1B2B58F81BA5D80230F EntropyInput = 13241E0665CBF845DFA90E28E1D0D014A6E1640E12DFF929118B0EB0DBB5899E1A2C5EF7C2BA9ABE0FD5CE7FB77ADEBDCA575501F228986A0012EEA03AE13167690D1340FE6A6171439B0DC4EC666A6F EntropyInputReseed = 2126F78E9A395595362714D24F77CCFC8409EC6C089FBEA6752E10D98173812D Out = 2F115A5F180FF337AA1B3E5F1D2E5467F2365304B1906B02642F403A2933A991113A3D22030872239385CE32B9F379104AF572506F9CCDF02D55A054DC4564C894F28AEDED3C1C7624FA49E21A029209443C60FD5907239ED960890A9604536C61AB12824BE5ACB1515498E1B1F081EC77A7391829A7007CD2B8987D3C74E64A EntropyInput = 3FB4AED7AE4742B71861C2B392665DCDE5307807E771CAC3D18C66497D9E9687715DFFD9D3F21B4587EB149E97A9AAD4676CA455496F356E5C12AF24E04B298EB8B1FE6E850A1E1525D28B79CE3B1799 EntropyInputReseed = B64EB4E831707B258AFB496C047A56C4D2AB4EB005E8BFF1EC24AC8292443016 Out = EBCEE6D44249DB83C8AD550ED0632AFED2F37B36FCBF1F43BC550E7317D14728B005BC0247DAD5B454C55F40CE86E425031B6F6DE5F24F4AD00BED3C0D2EF8304C2560EAD5631F83ECA09AEC2F39F554B695346FABFE543335D4813BA7288537E477BF1B72F304BFBB7F13D89503A599B553F44AEC8127FD1CE75982D853D29A EntropyInput = 749BCC461165DF42B10FBC14FA99A15D7B47F43F382D2F6BC4E10FAF642B1D5856E81C36B6553F43499B5C1E1E14D35D132BE85E77593FCA6970E6653AF67771E10D46E2224BCC8611074D1AB7C669AF EntropyInputReseed = 2B7C1ECCC2F14FD0E7195059B79A43BA4F9D235AD834A78AB3067637ABBCB3E5 Out = 9CF10F65A719ADAB107B63591A46DE7A8A96C47A464CD945A6433802E0BAED12BD1CD795CF5F1505EE9E2143CB60FAD11C51DF6A8E872E98AA41D22BAAAC2378B573350EB7EBCEE3A2DF7D4F69ABDA3BE3C01F593421415F2D5BE2D8001BE97139AFB330CB7E4B155DCBF39DA6356FEC47DEEA913F540398B1D7D9E80C511F34 EntropyInput = 5D13F6A60572EBB21E10F2EDB435824FE00BB473EDB24A2496F93E0E30B33C3C3DE65B886E46A237E4BC8ABD2AFBD0B810A0E469164953E04EFC2A72E6C182AC6EF3F877C5C0C30633AB444C7F623EDF EntropyInputReseed = EAC33ACE4A4DE0284FBB7DE51F2A6F3DD6FE734F507CC604A9F5C0BF7E6CFB3F Out = 5FE08E167A0702F85F86C27F78E9B5CD13928983B141EEAE6F61A2701B8DB16FBDB3C3FC33A2A9548F157D65A6629EEEBB0A297F273F05B5CCB3C7B40E4B50D774FA746B8CC4D5C8CF94FFE389237F146854E8ADAA24097E3F0BB436E32EE4D29FFD079D8D3F63CD225869FA995167B14BDB94A4E15E43F8DF909AC6C1B83488 EntropyInput = 7D40C0351C4EFB5FE440C14B77FF7462DAEA25C0E4EB7B5E56B8222D7324E8CB79AE4A9900A18479D442E0822C9373863EE86C680C97B5AECE4582F476C12FAD4592E219B2249176E448F7801A7BB273 EntropyInputReseed = E445D40A195974A4915BD20F97060C4C4885288431BB99EF38DA871AC638975D Out = C9ACEBC59342326D097D9E339C9783DB8E1171A56A67F4681B709E0C6C7146E5463BB0340E69338B801E9854A73B2273E9A7301C18B26A2059E7AE2C1B4FBC1B546CB50A99D2FB9FB3B2C5BEE107BE92BB3736BECA9913B85FC5921BB7EDC5B2D6BE5B74371FE3D4BE3F001D90A8B88230311AA7AA3C493AA8F439D5952D6129 EntropyInput = 6DA52E477E00DD7B562F9022C81CC5C6C6DD89FD19BF6D413BCF563878CFA0A55DF39DDBB65ED20F73698419E23933E4E4E3F701BBA52C3EF3918928ACDFB4C80C9E7C770624BFDDFD0909084D3F18FB EntropyInputReseed = 909D1DAA16BBA6A7D91F1E0D9C4A8C6904FE87DE47E6D51D8CF75221379987C4 Out = 69D2217A07628D7E70FA7EFE24298D232F6C2C559FE8AC897F7A14D0764DE38B2A8AE9FA96682BA45781A363FED31B2A9EE78326CAAA58E0561C6038B179EFCC3917B519E4546830954BC688C68979B9F68F91D1C835AE0B934EF4F3ED1E1A2179A16C11DD9BD8F46726E0ED8D8E9B85B3258F91C1DAC1767DE1EEA3215CE24F EntropyInput = A14B98A481D0402045DF3BE67230854A679CAAE15BC7414070773D6E55505C09EAFD93C68C027A1D9B33B0C1EAA86AC599CFA9A68CE9A95B48C92D718FBF9FF65A8344A1C6D3D256B7854F74E5813B24 EntropyInputReseed = 19FC823C24C996DBA459FD1041EF217152BB069BAE9935731EDD828138337DAB Out = 7923C2923BA92AA5C1B33238500A0F6A56D533E9C8CA0F9B2E9A104C6AF1C6E098B9340F06CAE73BFFEA248049FC4EB6F9AB91F7A8F6F671C0AC11A96DFE32A09D7429B9F67ED363DB6FD56372C8648FCD0597F5E89CF257A60AD0167FB5116D120B1803C1CAFABC6BF16E7263073C40B44F41D627417A6F9FFDCD0A20249B24 EntropyInput = 57F7B40C4532B886D11D6C08DE30B43C98A7E3AC0E37D7CB34FC103EDC422CBACE02DAF88C6CBC8A87567977F9A0B7CAD57713F480BDF9FD75D9F3FD09B55BC06265FC26B9A303A931F57C0CF3693538 EntropyInputReseed = 76A573F053B1A48B1FE7367B1A71D58C05305934046183D6A504498D1F84B23C Out = DC69797B5E9261657047C1CFCE362CB8A9FE4762CE4AC19BE7C0012DC69FC230F33EC85745788E729F3EDFA315E70EFDA9BD602FBC4D52E4526D033DF4A332382D2A6B03447A2FF0CD797B905C3A38F05881E8821062A12E1E8584FCFF87DF364BFB727304E25F80E6269BEA98A210B1A7F733BF743ECF7A182AC478494FFF81 EntropyInput = DB5EB9E806EA8BC9E40965E79FE8F1B69CD5E480C6C6A5E283D386F9561C756A7D1962D8BE810B0E40E55A9F1204F1E3088897C75048221AB579DB8D45E1E71D79CFBACC14FBA95C5BC584529A190BF7 EntropyInputReseed = A511F1492F02CAF6413FB4428BB2497BE8BA57207A92D7734BE5D8AD4C1B2645 Out = C53A156037E4834D21264CB6C6376970E13B7258035126CC4F6792B95C6B7308CB2BA801905E6935BDEB090E5CE19457AA6C4706315457B0DE808A32B87ECA9778813D634DA0FA3A609F025D7852EDB19B62E5959859FB513E179E1164CE41B14340E87E19B7219EE3B7C17AE9832F126FD3D02EAACFD04876476599053CCB07 EntropyInput = 7A3390A5C969C29BC2BFCD10BCD297EA89612C63B69FBB7216F0384C6CC083C692A31AA58C2022EB4A14D3AD60036DE3422CDC707F7EF9103DD290EDD929F1BF0A7F8C89970DF88C907191B8EC1A17E1 EntropyInputReseed = AE8D4A214662075891AD9A1F51FF1CF97784275634BA46ED7B411CF3239CAF9DE0BEC0B7D30995241BCEA013340DC721369613670E5E2DFC446C502739426C6A AdditionalInput1 = 56462EEA66D430F73A250644597479C649FB0B5D950E1FE57FB8B2493DA05A6F AdditionalInput2 = 4483379BB6509820F4BDA32D880212D7AE6BA27D51F29EFA53BD6E1763992C53 Out = 1CEDAAA49BA4BC508FD3EFF35DA2C914633C7A0F91755DF78802F8031EBD9CC36635E4FF035CA17BA134AED223288348C7D609179BBCEBD8933265ACC1391EF10813CF3497A80443B5162835A43BB81A36973628D3F3952C4BD062F5F1C0281550A2023CDC1617F8AC11651CD9E32C7ACB4697D68BDE2D451739E49B06CBF481 EntropyInput = EC4A8DF5C624EA74906765678A648A03C9AB4962E6099FE3EB0DF70CC599F463829F993089661E4EA08A9509E07C0CD3D59DCA9331F5D951BEFE94D25B1FE53BB3193DDA7E73FF077721760BD6B6A57D EntropyInputReseed = B94B031DCD1DB6992F9313A48311F7B950D8FDD6C09BCBDFA25D755BA43011934FB06E6FEF73A75548D843580F4127CCC1D820F5CCFEA4C3799CC101DA7D1264 AdditionalInput1 = 64AE84AB0D07E656E5891953B35C21F68DDF3C4F4AA118B6A91AE16D9AA628EB AdditionalInput2 = ACCD4C23CC16CA8DAA0BD4DABB977C43E9781B503E86A0DD4B104306D43B1686 Out = 08D9327710612AC829DAF7EB2A6A5C42E84AF6257F6992673A749EB9A48239DBBDBECAAC148867848C842DCDA2F6B218EB5F88B34EC08127F5120639DBFA5FB9758DBC3C2D33C10F991278C16FEC9B1D40BF55F5A550192CD299F5C496963492CBE28863F6B29B8E1DD4A6E7A1FEEC3614CD89F24B3B4AF46FC78C8F166A139F EntropyInput = 255C88E68DBCB54DBC57B8CB474589BD25D1F1C874AA88730ECE0C65D357F99DDB2C20403DEAA771CE933C884C8AE8191CBA260684E595034DF7975DAE3F57E641C19EFAACAA78F0F2C727E7949F78C4 EntropyInputReseed = 0F20DA8051FD575C3D2988A49A4775901B07CB5B64A59FABE3779593291AD483B7D19D5194263A09368FE9679582ACF085D27D47C0134E10B221827D61B62427 AdditionalInput1 = A642146B33068A421BC81913743BF1D0809B1F94604701A03AE44248A23B85CF AdditionalInput2 = 6A49100CE8C9B61421E6C3680B1E12D0377A94CAD5A6EC4232EC38B976B5F1F1 Out = 685AD08377A0A0FBF85D23B8C8B6AA9CBFE781779D850B655C893FD992813424C3EDE2D1F3D9C63F051CFA809FDAFC7056E37A375502AFF2F160627CC4136ABB12E69C16936C1691657331363820D9BF38E32A9A28F261A763A4F6126FC17BE2A6F6A88E39AA1E5C6251E37A505C9999D382E4F3145899BCA91F5308B599128A EntropyInput = C46E494869E435611495CF3D562AA864AB2EE5E1C71D696CCDC0656018AB85E0953A0B2355F768203CEA36EA7B27EC7E117B4E67694C5C61F62EAB10AD43DE46E133823E21624C7DD95075E99028A7A5 EntropyInputReseed = 909209A5DE5CD2966043402BBE79647D1C81D89CD26A1D323AD30F849F0531723151F5F8F0680F7AEDC583AD855D6ACE63D6B0367D82B5E65C3A4E7D2419CDBF AdditionalInput1 = DBEEA2EA7A196C72EBB9230D2CF1F156B32399DF76583D0678185BD145130B69 AdditionalInput2 = B7D05EEA4700E2E5A5255887C8A77233EED929FA2A8570956CEC42F791867AA7 Out = 912EE29D80978ED72EF8F4D88E49036B095AA5615E7C9813B7EBB85BC440F3B48DD6CE5EEC4C43B108CF7BDABF761145AFA789446608D85B3D638A2093607153560BE989B8AC4AA7377B0417DB2AE29BAC4808C71CEEE77ACC68C49827E7388B7D018F9CDBCB3F77D9D23BEBE758D6D945B49CF97FC4118BCC4AE342A3F462DF EntropyInput = FBF27B657805E2BD9A3EAE0B4E1C19CC491169FF2CE30314A7DA36C13CE969B0C9A9DB43C82F34B4D789033CA77BD6C9E78BFE7353CB5960DA98BB39E2CFE8546EBB85DF2A1643D71CB1B9D8CCA22DE4 EntropyInputReseed = 0907AC53F0B8ADA5BC3D053674F1FF131C195C11CA8C55284461641AC13E0FE41300F86F544D4E70C301E03FEAFD058B06D604E875E3AD643DA4949E7505F80D AdditionalInput1 = 6F62D92283ACABA7B14D0FDA90CF4807B9F37FA70DD6B4D331CEB37DB1C176AE AdditionalInput2 = 1B190FDB497A6776C3A66BBB74DD470E1671BEA012F15EBA3E644E6C349B54B3 Out = F0B60B5F02D504E763BAC669CD9B3561BA0169C988CBEC1406A6621BC5908AC4B53F9252B902385802CED4AE917242D0651B43C48E52F0887DE135CC416EF3518459998C9289795EE82903A858BFB5B8884EA5ECB693ABD766DCC6D255CBB3ACDDC57559ED3C698FA057EBEC7574076AD8AD56FB85295183AA33B4653B24B1EF EntropyInput = B1D5706ED000F080BC15F79D244CD6F8C3096959635F1141A7C3780AA1A018411575AB1192663E96A363D91B5608E9E09054C84843BEF8DE1CA59E77684910712CAF3170A6EEC650480D1885C045C709 EntropyInputReseed = C2F8230720E7E06768B6F6E69D770D3217CD5AD114A6E80AC1DAA2930D7E08DF2671A7D81FB7AF4EDF958A4DF66C614A554787B3A39677F6A2C456867569BD85 AdditionalInput1 = D3BD043AF2AF3D2BB1939A85E56F34D196F621478EA6F74E2D0C4065862D7D8C AdditionalInput2 = A4EE91A293357EA67CDE50AF20B606F42ED1276E7F1A3B78E2DA9A758AA4307E Out = 7631F654B648FDA1C083C1B47A0E43AA2819EC29CA2A263501701D4C240A999EF27ACB2C530896798F698B160A554A7DDE24111D78B1E90020396D0A03675BF274DF5388C788471E056AA06BFC7EB6EB2306CBA4E90412C9F8C1FE80055A898888C908B91C024A880FF9A5C083EBEA3817A93C171E66ACC094788D43C4665D8D EntropyInput = B2F1798D99075D9EC8BF2266E7FE3120A8AD12679954A61B8BD4338CEF51F521FF30CF733D54FF410ED6959CEBA8FAE1AE20FC6B5D740023C6BB889DEFF687383BE1F1A8D388109A20C6A69E10017CDA EntropyInputReseed = E0A7C8E29C7094A2A9170E88444712232FD7B51BBA4F5AE59ED3823A60828C3C4705B81353CCCEFE4442A6E0C5BEF3CA96BAB05E245AAD48432F1F31A8590BCC AdditionalInput1 = A5C9A701099C187E0CF0C6033FA5AC169FB8B9F6580359DAB5EB8339FD22F78B AdditionalInput2 = DC67A76FBADE14F6806D44117CBBF27757B4DD698C55A485DA33885335639274 Out = FC730AE280D07E5C055FB76F7537C29C58F299E2CB018EC035BFEF0950A8C841BB9D3B7BADBFA878560108EA56F7B0244BFF368E58EB260C7FA59081BD81C587CDF7BE07922291C7CF426F0D6978901AAAFD0D07C4A10FCD25DA093ECFDBF5F69B93CE4F91862F25F1779932FB2D6905D08359B0AAC035FC8D8EFD62A733D794 EntropyInput = D71DA4A480BC1E387A46BEB545F306F131AC34D95937D0DDBF48CE76224C9AF70539294BEFCAD2CFFEBEF86EC9D329BC452ECD7AE517B06C4D13FF32758EB50B0E21F715BAAF498F1E192BF14DC22C3F EntropyInputReseed = 9EF15E2C1E33759CA66709C19A21EE1F9C5327B8EE22C37F437C982D3E78271E25FA3CBE83B558376DBC700221FA2523A1C1BB7F35FCE5ABAEDD949C862126A8 AdditionalInput1 = FAD8D1DA95A656B8A785BEA1499969B6A7633DEE1DE1D28BF490085A0B354F8B AdditionalInput2 = CB7FE7783C045DE52687B62E651E281CDDAD9A22C5CB2B95D86EF51A70BCFEC3 Out = F5AAA097378D19AEE9C3F14C00818E7F1AA5117F435C4735DA5B2E3E9C22EEF77EA1C37CA385A15C9505A5405FB80DA16ABFC7D410760541C85A78096648EF05FB7F58B71CE511171B6A87B4573125B4B44D96B7261308DDF1EF334241F956143F68226404BE02B83A3F814BA2853061A33264A82A13BDB9112D3CC28DF970B4 EntropyInput = 0AB21E19396821E044834EE7722F276743E94625728F58106FAA7036880FD8AC9655C5D87CFDA8E8B3C18C385E7C3D57386E79DB3D5B4695FB36C56DE8D74458C0BCDAAFD96ED4D28BBF0D1A413E49B1 EntropyInputReseed = F9513FAF2F28730799407F8EE1722EBECF4009BB89DD8005DF8947AE65F31414B02F5574D526A18BC54DFEFE55EC37296196950F6E05F9D3290BAD8C05A88038 AdditionalInput1 = CFEA200ABB861C9E3C7E969D5F7DEC82F593E743D3C87A2F07C3979BA9A497CA AdditionalInput2 = B74EE00E0E86ED6A9B07FB2D9E8F1111736CF1A00E31724E17FAC853F0FFD099 Out = 4D9DB09B8812B94AE9EC3E5C93328C0BD92566AA19E8BBFA48BB1F51685E83D13669F3A37DAA6FCD92E3566529A7D04C6080D9BCDD15212199817923ABF33FA09159FD85182881BF3921B8C07BD49348F18241B9989D46BC9A06036F31F6C1A0764EA7E7A4164E854D59DD64C72A643AE0FDF880D8C8E85DA9D5ED60CF90C141 EntropyInput = DA798B49C6D57073DE41740DA369A8D4409B5EB92D5B7CEB97C2CE26E45FC8D07671D12C29370538734E341109FD499775BA1C88415959E68F9A6FAEE690F1215522025C0F48D02DB83FC25B3C6CACAA EntropyInputReseed = B9BEEC7B7352F6EE0E544EEC1FBC9FE03BDFEACBD3E724DC1BEC84229432D4388F17715C739A6B757A34F1486DCE77FB84EC585F02A3AF94803E15FACCD39C33 AdditionalInput1 = 6946F9C95E2D130BA7B9B4FAB7A7196465ACA0FDB977946A2A20B23C8030507F AdditionalInput2 = 6A6F44DAE2BB9CCBFABB24D9B083C91017421A2F6832DC8B1E83BC0A755F7BE1 Out = 64DB78F87FDDD4148467C20FDAD4AA90AC02A5411F05AEFEC712D02C5E6E31D841389174DCC57C1D32B1B9AFC9FAAE38ECAC9199F1C22425A8E20522BA96F8CD0D10DB6B51EA2396C0A36C6E634A0AB5676F6377C27991C62D02F5BE826A04F29878A6042486DE79B2F57987AA0EFA065B846357608C78360997E5CF70715B2B EntropyInput = 3E30E32497933FEA413089FE6FDFE691617239F4E15B053E2C7DBA7E6EBE97DC8FA62ADA9A920A008A4060ED1D7F5BC56863AD36631C31CE2878FC591D54543DF756F510016821EB0EF084F47E291ED8 EntropyInputReseed = 510B69229A300E6FEAE9637C7429F1E97A3CE17FFA8A5AFF2ADC8AE469439BD67175DA5D212F2355CA74CFE8DBBE47625689EC53799FA00334CE784D675AF137 AdditionalInput1 = 999790B27EADC26DBEFEB7C793CA48123102035D695CDF93DCF4EA9292A78CFC AdditionalInput2 = EBC362DD4C14F8DF89DD7C3F9115FA334A1AF06416DA0AB7A0E98DB8C86727D7 Out = CDA407DCD217136C2011CC8A39632BACCBD7A522E001EB4EDBF044EFF78146E92053AE6E6BEC8635F7816B076186FA30D411B9CE248FC6C72A5596EC9C079F663D4E94B1CC048C5389370FD00708CDDCC71AF38CD5A0387DCE0A18A05BAEC2CDBB19EC416397924B507AB26B71BAE40E19DF654C7DE4E7F5A6B43010A7D375CD EntropyInput = 1392B9EA5D64B89E933BF1D7F4E5E47B8943312B991C360D021B9A5E2409FEC12F2F2AD01350010E307AB140165E532E640EBC23511F077F922EB7F68FE92971A82FE47FB17601A30061F8E551C0E898 EntropyInputReseed = 333E1C1811DD0A23C1E84AB013E15CBCA83507525D0503A318100E0FCBCA2EBD9F38608D40EBAA7CA38C7291004E8DE9268CB906EFB13E880EFAB2224E4DE9A6 AdditionalInput1 = EBA2D758EF8D76CF384975F67C3B6BCDFA9ECE2C9C08E0F5856FFCDC539C588A AdditionalInput2 = 3898869DD66543B5FFD8E6D5FFCFFEF748399E4D6464868804D42D69AABE867B Out = F0B9BD219C0A9A5E89F599D27C61F160D049B67BC5C036095EBBEAA196AB51C835E0C1335EAB3A426C82C0D6B70114D9D6487186920E0284B2EDA84B2A8BE301C21DD38F4B473591D3E7A9F963D7E83B1B4EACE6A43FB70D064DDB1F723323FEA7C5D68EC043F4EEFF9F607B6D60F7CF1552CD7A524ADB52E1A9156CC431A258 EntropyInput = 4A282427055E1BA237C9F30662FBFBE5C191122F7FD6B756066276D09587100D2D5220EE59D807DE140C7934F71B90EA2E9465FA9A8BA712050343021E7DE122FC89499B2142C66C5FF203E35A33FF5E EntropyInputReseed = 837AD8DD86F157A2D82CEADC326A3EF35288E36E7C6577AE1BB6CEB2B769B0AAE42907EDB7C21FC94ACF4CA89A905FB7EAA081BF3A1A3DEC4149FD95C558251A AdditionalInput1 = 60FE93D3F38BB4AFDEBB2582709CE62B9E88C2B2EDEACFC1442F42F6D2E6102E AdditionalInput2 = 109D08D2FC724BB5B2F1CCEB47454F9273A8D4A4C4C9FFE9849D58A4F21EE4B1 Out = 77ABB9B49B574BF42ACA91ED59D49C5679B3C18E09010FABFF8D0CACA32C0CC799AE7C99CD50ED688104F69295349AB5F54F2670106FCE2CC9985DE7DD3CAD15E1A9F0BF97C6A84EAF0BCBB50427DBDEEA6AAEEA6F4FF56D3C39CDD70E1F8D1F411787DFD669B2FAF647400642F1914462FCA7CA351FB4E84A0A843929395669 EntropyInput = 0C824FC42E088A7EBA8785248870AA892E82F20BC5D75342E062A1C6261465D7E8A3EFECB0DE5A738B960E1AAE478E787E8ADA5678A155F9465BBAA6C89106250FE1098FB50F2D1329FEF79CB4368EB9 EntropyInputReseed = 6C2AEE8860A6B43304BBDC72F831783B70C1F6F2D047175E8ACBFBBC69677A3171B03DE1D261E5DCA0BE92126871CE1781C89CBFFDFB241945EFF893F0251B61 AdditionalInput1 = 6034F63074634936A787CDD96B25FC1FA4BA8D16AE6862D591581E7BE7BA1481 AdditionalInput2 = B8FD87BD4E25A8C2EF1B0E4292632AAEA04EC03EEE9B1A27B64887703DB03CD5 Out = 3DDF2DB93A9BC297665DD6938D5A243E7FC95C44E9EF91A0DB65D83380BA02DEE86E136E7AD454DD94A8542F9D3A51FF09572C899214B579D49ABC61B65556C8B77FB35D3BD11D5FACB610EB9FE7E54992D0066DB3B259CDF2EB9B6A7BF96D7F79D1BA3F0253D9640331808F0F81230337BF229F3579EBF860D9BE6FB7492E17 EntropyInput = 2DF6C4B4991573C94075047C4C5D0AC95A4E1DDC832949CAD8479A9A9BB4C8E3CE1B37385E70E4EC7B501ABCC22B477778728996738EA629D19BE925FACACAFD771F13ED5FF36D4DDFB90258D0812391 EntropyInputReseed = A260E38DFB4ACC8C017FAA23C668922EFB21745931C80FA093069F52C13CA170C87E7E521904F28E82E93D17A5999003F8F0AE9B81CF8354FE634BB2EF1F26B2 AdditionalInput1 = 2CD520AFFC089BCFA84389E8533E8E1EBA8F581AF5709B11AFF92C781D2846FE AdditionalInput2 = 8FA0296A8004DE774B88F80DD6691AC0F9452C4790F02404F7657CD5818FC791 Out = C2989FDE23E1201014BB3D0D2D7F4DB67B00A8D43F4103F3B4588E96F8D6166AAE115FC0EDEFCA54730728C910115D1EA7AFF3B6F48789C4552881114A565CE8BAB0FBF3A4CD2A74A6E30EC062BCF0381895CA48644C6C618B634528BAAAC5C501FB52EEDF59A875C74997474F239948FA26E0F0550B8B153EDA8E18ABA0DA4F EntropyInput = A1F38D5772AA1F6E1C23DB101625A596862F11CA74626182EB9CEF501B97E8230D853F485C24E8A2A41B1BF3736A2257 EntropyInputReseed = B5644774B6F71DEE198309C217A42C30D091434E78A62691F52DF359BF27D7EB Out = 190B8088608B3A7276295FE1930B42BC4B0EA02A8CB0A2F53AEA25A5486C4D7683C9F71B95ECAEE615C443C15A12836290A9BC02BC3B5D564CC609D16011534F95E58570ABAEE94DB9F2729AE68E50AABA96AE8B08F5AFE53C8DEA7B5A37395A9043A46509B41C956D21D14AE51B1967B539C4D33BEA2CB054A991049E7160D1 EntropyInput = F17D0C77D43AA7AB018C9C6A1226AD05FD5DAFD48D4C5934DF71207F635B8B9F2311BEA4B271B69CF3AC06456C67A7D3 EntropyInputReseed = 8FBF42504DEE0DF34D069DA9CD2A5B4838C8E7E7EACAC88CAA3B5342F12767E0 Out = FAF87D07BD60FA4354CA0FFBDBB9195EDA202CD0C35FC943CC1D7133B8F7F95969C64FA029888E91707A2C365BD7DCB559651200BD3FFC020A7E23B855F6CE06B2F61757DD4AE49A667563A2B68B6C5275E8BFA66ECA54A81D4E16B6F663518F00B10F3CF61F0C22F7D1D43C66687A09D1E788712C47AC1E7AA462D2E6C196C3 EntropyInput = 68FD239FE491B741962DCA00904654E5C7C6F348F9F1BAE74F8419481E4C62806ABAE5217EE65A1C50B6FA4BD23B566D EntropyInputReseed = AABBAA06A96381AF9BFF31BD779996716CCF3FB087A33C4FB2B8B909DFC0E494 Out = 9094B3601AA7E6E456A5B9EE772277809DD43AF3E16CEE8941222205213FA553BA36C13112217EDA341C068B919AA6C20A4116C1B9A91A6326A78BF7C6A70EE8CF8E0BF7A08C63611217FF0BCAB6ED5FA05E9E43B32AA2B5EB22E2E241A35C250F373E632869DBC6DAC2E220C356B73CF3DD8EABAFA9775F2E5F8ADA0149AB45 EntropyInput = F792F17C5BB480BF75038ED734C06B0550BB2582ADE5D1CD9667E2EC3070E58F4CC1772EE6B9753B5CA6D5F06EA60807 EntropyInputReseed = 3FC8F354D8A6EAD211D1311B872A63F55C7CC47E5EBC96EA124B3875A701B73F Out = 7C74E7B941302C4EA9845F01060052808831F6CF953AC201A16E8A35C4644890E281368B4BA126A159BBB487CAC20137643C1A2773DA8B66A5C54E4F2BBCC72319C286CE5E5C5547A52DAADF2930B7938BA4551C11CC7AC282B93E65D7F0896AC6B7D70FEC89926B2D5822038F7C6F8E8D78BF35264A9BCB684A56C01023F4F8 EntropyInput = 6F01A2C6E7D3A7AE022287881A9E22106F53EA905AD5AD16BBAE4CADA72C9DD5ECD54D8A7C82597993AD0C9062C434D3 EntropyInputReseed = F58E26A81197491C919407CC7AC8C95194FC01D8DA75FA3A05E7A623EFFCD3B3 Out = D4713F6C65166C9B554959F63F16908CEB908A88FC56D49F06D95C5D67CF48511DE268D82340B39A8692220A30314B3C32F0810B857BC37CD69F53DCB99AEBC7F360A4DE41562E4AD3C5A81E41FCA3D48C8CDB394943D50FF9167BF6DB93567CCB2AEC43FA808F65127F2DCC0F1A5DF94EE83EB74288FD12E96062C23C4D6ECE EntropyInput = 3E6E81D60302337F0F3649C02DB55434B355DB6A84E20B605B178949A6127D41E4E439A7761330402122AC32CEBB6EF2 EntropyInputReseed = 7E9E2529AB1E92668FCA34F3429DA2E3E0944A718539F2EBFE380F4F77FA96E6 Out = 71DED20DA6C58282ECACA7DB19064EF742128DD638506645E8367CBC4AD8C41FE4EC1F5A589ED8EC145BC6D8948F665D1AA24B20718321106EB33FB3746058A1F37FD4E56D10142781E4951653313BFBF5D437EAE401CF75102C7B7A02B6094DFBE7413B0C3DC0C0E7BCDB412144853C21DA0016828672281389FEBCBA25E4CD EntropyInput = BC425504BEB2B2500AA539E9BE9DE5F628C2C2359945DE9A2EB5E2D3908CBA3C35E17817C306FAB1D25BE64FCC30B9B1 EntropyInputReseed = DD1C1A4405CADA1EC3CE661B2D411E18201FC0A51EF2E11D8852F2AA0E709DFE Out = D4D7E795BE5A5E18BEA0F3ACCFCB5AB429178DDCA62BB6640140EA8BF30586155FEA165E0F4D4EBE48CF6C070AC1C42BCF8497424257E687375A6A181D2F1BFD9A1005BD52BEB5F62952F157A91C8B127DC5B2FD2AEB37A257E4720B4FB3A588AABDA25FB8BB4524000B52986EA3724612680948D5BE697BC362800886CF53A9 EntropyInput = 5BB77F5B877BBE6E71C7095C6A13D19B933E0DC1E9C8E564753A693D658FA2F530CA4F9B40000FB1240CB1EC9829D707 EntropyInputReseed = 4A716543BD5916092307C54A4D833612AFF9E44FF4086FD81594B39949B25874 Out = 16B1263E5888BC19EE4AFE7FBEF90DA492998609988A8CBB81D2CE7EC2D662C7A2B7DB4B84B250BEF4B47966E1D7B675FAA917AE1512BEA4AB187FCA879829B968898580778FF71D1DB5B9FA461FB97D559F23F05360B93E4B47A999C760617B90C7744641EEE67ED4E356686D1D1469503C7E57A651F5C08CD0358E424330F2 EntropyInput = CA0D9FBB79CB2EDBF55484BE53905561DBC12B2992B95FD227E6D844A32DB8328A24B5EA68DCEC56AB0E43D2D4343CEB EntropyInputReseed = 978033156DC1E2FF78B12061B9B1B234018F7576EB4244267DB9A08A9093C1AA Out = 953CC238A09D47E830AF24F02FD35E3419D9DA2CF7D5444DC5F32046B9BFB9ED27E5A7D97A7178D58098C5DB67D75277D24E9A9F30AE2BD454C0B72B7A3573D5BD4DE9F584529D8121D3A5C658E8E7245D7F78FD7965FC4E854F69D32E7EF940BFB428E76C49C22411EACE1C2BF30E4AA23D5F0F26CF610BBE4AEA3443511713 EntropyInput = 3A3C2FD2D1EACAF2D9DDAFB7AE3BC3110E2F018B001E990D158D91AE184926E5B9351EC199E930E4F652ADB35F0C2712 EntropyInputReseed = 4870D173909BF6F93538A2D314736ECA0116CA9BB9369789AEDB9750E9B07B98 Out = 22691075726659DB20963B4B03FCB90DF3B62BC72B4EF142CF8AC05B55294845AC911F9A018CEB86E79C79B58CC0F2AA610AF5F87F327FFA7BE529253FC47E2C29D805F5E25EEBED31E088FA3F6CDC76A81D3EF1B215B5B0337DBA4ECF3C288975143671EA6B64818CF4512A382FA39C45508FF4ABCFF01C6CC8F25B839A950E EntropyInput = 777B57C262BCDF8D974A7A339DEE00FBAF0AA587A33A70E29753262078E6AFF5FD05EECCA515E1AB796E9A5542F86304 EntropyInputReseed = 62BB85CE9C00FD3444296506C861D35E11446AED8FD63087AF07FECC61D4E3AB Out = CA94DD00BC8D1FCB6BC163D880D02CE0552323C53E2C4C7F3C321AD3C75B44B5AFE2B9FB993DADBAA425457FB988503DB8E7A9FF2761AA357100C06E596585F9D42BDF964490B14F9C26D11524246F7D8E469A320BFE6EEF547E801668911A4C240EBBDE32E5CF78671B3F8583C1B61EDB0B0508AF2FF1B6504DB93F88DCD302 EntropyInput = D85115B0633669FB104E09FA50F1DAC644F23E8B1A8011FB186C08ED17304315AFA4331AEC5E5C30193E154E60B875CD EntropyInputReseed = AC8ADFC8B1D358A6EADB09D44EA4D193328DD1EB968644DA63E3F0BA5AA12A93 Out = A270692D6DDFFB8C4DC3AE453CEAE41C7A16D69F369B3CDB759726D6C7E3B8FEE5047716D449C3E810BD0AE06E5E3F3422FEDC6C0D4E367DAFFDD5B58AA1117FDBB7E7EDE0CE4DD732D36C4B87FDE79C1AA58880E089A0C0EC83379800F449BB522A64FFF5FBC46270FAE4534BE90CB54734769ACAD07AB8C533638F109EEEA7 EntropyInput = 01155B3C4FCDF6C06F0C3D33F09910A148DADA794B9E991FE680B8EF662105EB0D77B0CF2E204A28D71299FA2AE3E402 EntropyInputReseed = 183B6DEAF173093B2EE8B4BE0741E85C1774ACF8E14D9EDBB0DD95A01592A45E Out = 030FB243F4D72DD247F6FC863D8B354B07A4C767EEFF162F9E4026F855E7E0F22B9DC806A1F8E3F7B70CFA9F2053B7A19E00C6230E2F3C10D3F74B268C2B1111E29DBE793237FB57CD9A5DB3D0A46F2530C818B809C6DF255962A828CC9FC372F3726D18302CC4DDF4BD69772A2245F146E54455DA3F2C27A5953E6DA9540D42 EntropyInput = B2EA2D91A7BC8262457F921708DB147E5F3929E33A783EF5412EE7591B1C194675083CCD2ADDE508BE9ACAB7FBFB7CD2 EntropyInputReseed = 52F8A8DFA81460EA29D0D304E4030A98E24D6A6AE3161A1417725F13F0F2C04B Out = F1416D476F4685FFC32278771B615E42AE518C9A867BC3909554A71F4C6537C22F0290C6F803D5D216B404DF62E428F39849C6A62309564E70A741D4388F7CCBD63A2C37F005A26FA773D6B63C27C5F766E19E8836488DD5CA2FADD7E2072BDD2333EE82C948DD0A2BB82A0B6A9EA9DD1E6C63CFCD68E2DE716A437588EDD9D8 EntropyInput = A9821BE915914294FFFEC5D385D01418BCE04D42E4E06772458C0DCA80ED62E29723639166B3E1E71133802352573D30 EntropyInputReseed = 45BE2557E454F2FF4188977797D6E64098BD12A587D68962A3AB19B81F9A034B Out = 459F5802D8D86AC5E03CE4C8EA3879BC88E17FBFF9E25A8B176DBB628D4CDDD112A60A0950C709F0999405C68B094E4F1A37528AED0A85708912E793792544EBD4CC1E8CD3B0874CE0E8DE67742C644835B7DF9116180315302F4ECA00A629657290BFBD2336C4F6F18AA2BD5BD6699BC9392910D74271DEE7834302972CA209 EntropyInput = 53835429E872A933E15DD0062C672026C3A295AA7E614998A5C9E22E710C72BC91F3EB64D56D0EE1214F24445D3B4832 EntropyInputReseed = 68FCA9EE2053FD737D203F472DCB49D63AC4B99FB730513C4EEF9D2A59D97A4DC8A6EABF11B671B2A04FD7EBADEECB31AFBE3F08939054C70E4872EB7148717A AdditionalInput1 = 0B1FEFFB9FB4ADC22C1C70293BC17E194B940E2720B8BA130F9A0F07ABE23BB8 AdditionalInput2 = 0690BA5B71005A7D5A4B2BD404622EEB406F875349669218B1D0261EAB1FE99A Out = E95EB17C1BB1CF26A51664E16D6E2ABD8323198224BE8FC449248D49F5E45C9EB4731A2FB2E6DB51621018E129C57954744F9759FBAE31E133692DC0EFDB154E789671EF0182F797D057E8C3B2ACF330918B2E84669797551AE8AF904E07A67CDA36610D18BB59872F415D194E416650CCB73C66E92ADF55950C08AF1A2EDDAA EntropyInput = C867BA0ED5233449BDB7E0F8EE8DA2C6D846468774AAE21A581A2D005243EA7ABF07C052F0A8D3AB0786F19074726E4E EntropyInputReseed = 49685FFB7D44536FC0407796EC6C037DBACE997101F23830ACC97E4D5E41B0D48BD6F9A0F3936183D6BBA49D110361E7581CF15C4AA58E7C9C559B7D43CCB00A AdditionalInput1 = B7B5415D3EC4E0161029D95F9F9D81F007CAB6C2119772DC1726DFF5A427DF16 AdditionalInput2 = 405D9ED822FACC86A459036E0A0944C5E7B247B9C16AC02896C61DF42CF24214 Out = 92070FED054020DCAB79B1D4146BEE67AD03D718FACA114DA3622B56F3B0C75800F6A508B15910AF4F445D2103590FBF48AE83490E6D6A9981975016E7AAABBA09AF8A4B77A822A8DED93CE7A33B5C17032869CE8A36FC338C8E5B369609BAD0A136DF2EB74BC4082007712CD33654C6A24879C4672103692A6CAC94601A38F3 EntropyInput = 6B7A99E8AFFA388C8E141960321D1C1113AA75EC6EE5EADF231D77FC64C91775A7929DED328AFC999530186EFBF9F834 EntropyInputReseed = B7D4699DDB259551F53822C5E9ACE6BE2CD877B5C41FFD547A599AB56213DD17C5C7C482F844DF42F371DF276EE842569BC2B665C4A97DA9444932F0837DF971 AdditionalInput1 = 25CE2780E214CED19667D6F73E1A85FA2C342DC8EC13DF6953ADF1ECF6A719DA AdditionalInput2 = 77418DCE643FAC1E881335E09B47EBE30E9C200B5B9C3641A245963B4A0F1C4B Out = 7ACBCD0E8E7750FDE62B3587F7CB4C3351E28FD4B7A06CFDBA86F1844A883893D3DA97871BA7B51A7EC42B1889C25D6B20D009E4FF9386746066115D87DBD7021C3168794EF80305FC6B3EB0969F58595C959BF65F03010AEA9D15E0E083D343D97E5769F6357D8F1E01624CD116DA8A38139C07195D9C49CE294E1DE3E81312 EntropyInput = 52A205D8F49633DF5F5A15EE7174083FE39E71D0C89A33303B521316D7B5DC78B2F679BE84FA803F5621792AF0B9F7E8 EntropyInputReseed = F6EA2CEBCD9A27E46AE2E9BE0DBCC7CDE767B264F1C713B28AE82AE1A7E8FBDD38E6EA786F679C411C57D0FDD602240C3562E93A83683050F2C4E41DF9064E70 AdditionalInput1 = 87B690F16BD4EACA47BAC668B762DB836B6786105DEAC8B7E0D09F5CFB6DAAD6 AdditionalInput2 = CF6023EF9A5C4B40EC182E9EB640279143C03E299E6AA59440487B77410CE561 Out = 324D01B4E8E51A9D5C271A85143EF586C70BDE97D6A0714470FA4590C2DBA22AEA9E246F6914C2964364125727A682C154016C7E1207452EC800DEA6E17E4CC0DAD75F01253A12212DABEF332C9618F924843003AA5B7F3097D1857A6F6AE9A45C4715109915EA8BEB3EB0D341AD163137CB5A293DDD4E077CB905F3ED80CBFA EntropyInput = CA3A2CD60EFE1F59E4D078D35AD69AF6772AAE6A270F887CACA51A62893DDD906EB6F65FF76D5CAF16E8668D7D5479DC EntropyInputReseed = A30C93D4EA646F2242DFF3A7BF13B0202E5052BAFCA960C38EDA9D19B8C5694C7D4A2C79020054B4F979C3E191A6BA8B89F5110AE0EC99092A35661341DA112F AdditionalInput1 = 8D03A249A2F0C9A07ACCF8CFAA267CDB9C874882FECED009A6EBEBFA6A270512 AdditionalInput2 = 4D017A8A84EF2C15A6E3E98F771AE40FE66A84D81B989E3884F0318F49901EA7 Out = 7E9D556F47D5F0139BACA531EE2EBC3A444E96DC6E10FF53903ED58B11B1B4A62DCFBF2DEFB6DA51D33760DB827F61D9F4199391666C667A8A22D4166ED84AE36B5E6576A0D22C8F02C4EB01CA9FCD39937E6AC0410D23B3BB42A68518570B986581D639D4CC95E91A9698956693522301AF0C6ADBEB610BC7595D6BE9E18726 EntropyInput = A678CC4B37597C4518921E7049549D4D2A8EB9B3B89931D40020FB9DE1E323822A9407C73960885E755357BD0B2B7AE4 EntropyInputReseed = 9E15458C4611AE6D8A275D178514BF92734B2B899A702F198D6B16454DB7A8749BF455F4B5E96FD977763F61DEE3072F6AA240891838211DF1690A5E453547EE AdditionalInput1 = 6DFBC277FA913337BBD8BB3ED3F1A90B15D0FBF86FB7D6443F693EA876176F2E AdditionalInput2 = 72F20C66D9609420FDE7B2DB49B243A879CBAA6FB33BE583CAED788942BCDF84 Out = D7AB6D7501FA713C06BC81BE4BA2B35D4DF5A7905A4986D22E2E260AA2E64F8980BD134573D80A5185E81FE7A2C2F0C620800EC6FC0BC4178B5188B55F1CB0D625727AF35E0F6346A4B7ABC9102065EDB1D20AB2D82FB5E3652F0BCFB48FFFE3CDE7A434CD9DAB8D809344D582ECCC4022D70520C960A3E4D1074A621892C20A EntropyInput = 05B52144973484F718D3B911FD8FFF683B91AA36F42104F57546CA5E1B447CC637FB8E90B9D4D8A66D2A951B60250E50 EntropyInputReseed = 02AF2C2B4DC564D5766CE51E093BBA0695C2A8B396D05A7D88218D8192307268EA0A76BB2496B49E7AAF7C340A1BC10124882690BC973794D8881F9A2F1976DD AdditionalInput1 = 964E14ECB813707CFD0498EA7DA7CEAE6B9D9BA6523F4479F4D4D550810D5E85 AdditionalInput2 = 144890028F4C9A7754ED4C388BD612B4FE2F6BF8166E0CBC310E76F59CD6676F Out = 0338D7C1268F44E945322968EB8C5D38018F6B983206D229B2A42ED4EA5300E55C992AD956BB73BA9E3E6A94E59EB9B5FE3BB7D16539C1D05BCA36B73DF53C2F8F0D19D6D8608C25AC8F9D8D025ACEB88E9DF7B4ED3E88E2E090CC6AB782E58F8B8A9BD69687BED9FE466C6B433F52E7BE3E8F701AEBE8161B975D45AAA69CFA EntropyInput = 1F18936C96837F002E5D6AF3B77D4663A7EA5BB9F8C41262108437B0240BB1E3FEFC4F82A52FAAF780E745C837CE6468 EntropyInputReseed = B70ED8663F5560BF9B1017C4D2CDBD32CB6827A22E89C4C12647023BDD8380BB40EBAC8591F2D99D2D151A01D62CEC57970DE9302FDF7EB1CBE7E93DF5A0854E AdditionalInput1 = A6EF4DDD0584CDD90BFA4EA90867CDA654DB53AB91749BC5362BBCC9E5573782 AdditionalInput2 = C3F458ACF584FB110AD62EF379FFA9B9C65EEB3C4A7188AC61B877BA1428A539 Out = 6DBB4C0B927A7B0FBA46D1883DC6D14810708B83CE957107836E1CFB8CF489DA3F75D542A42904063FA928E656A10D0CD818992AA7E281DC8D576727D3B5819CBC464A098A351288F4787760CEE35F8325EE8BADBF7524BEB33C1E6549A4A983EB10A17FED3F0C82995C250A309E4FAA2687EA642DA8F3EA3CABF6C377560A45 EntropyInput = A343DAD72BAF03DFC5E1D6469C12794FE87863EE292CA31A50F0DDE19F973C01C4CCF775B6264C9CB1D4ABE94E6F7931 EntropyInputReseed = F65187A9E0867E40CAC96996FF1DC99420DF8DD623E8113A1F7A7719C780920319DB2E5439FA8FEF60F8B6E903BCB38A4104701F9CBDB6737E6CE338262BE599 AdditionalInput1 = A3B05849D034E3510FE6461FC16DC71C320DC0B127ADA0EE0150120BD89039C8 AdditionalInput2 = DF462C6303083AE06F2EAF17A8151EFE0331BE02AF735EC63FE8047FA5E2BB8B Out = E5B8DCE5B868162B0BE8787BF811A93C8380077C1636059326A7A5497F53EAAE39DBB8FD5E3F0190B787EFE8CDD475981B550D623F76E683FB9B963CE749DB89CE8D4BD1FAB81B7FA4AA90A92702A4459A57E58305ECA659865C9A420D5B707C47063AB380A4011DB3651D27A4DE2D400D7C30C5C9CB13EE873CD2D5806EAB4C EntropyInput = 55487811AEC7BB6C580885840E7422E39B89981C636C1AF798807C94DF806C0F3E2BD25194F8480C806993CF3E4F513B EntropyInputReseed = 53EADC56310157D7C944B03534CAC0C95840ED0862A47B4FE1C5DFFCB129E7D8012CDE26FC472110A14B1922A3D74FFC6BDCEC1D85AF5FC6F48CCD1806266F0C AdditionalInput1 = E8309DFE34017A2BB20D976896CB6326D20B538BBB0707631D13CFB9A26ECBFA AdditionalInput2 = 1D610F732F86D7EF53B1129EEF6663EDB087C1F5E310337497506039E6DD02A6 Out = C75940A2C7D34D99FA55B6115F935DE3EE4F72DE05AB2AB970E8C5FB251DA5ED04950865165EFB63EAE4DEB961DE48B271DF60E11C0D8B11BCAB97124520C66A332C2CAA735553B330BF0DE8C1DCFA7883D480D5CF6BA5BC7902B33B330E2E233313C294B398FF1F6BFF21468BFE2BCEE6A2E6CB65CCCC1AA8BBD8930CAD3441 EntropyInput = AD10DB53846B7F1FA2AC38843EEC61B81BBA42E4C7D8A43EB944A4B94C072790A53FAB7817F2CADC0B7F9D9E328DC0A1 EntropyInputReseed = 0CD7A1B8A1FF9BE872712252DBB137CCEECAFA032414DFC921C9687B6C1D701C645AB93CEB81EE190C25ECC10EDFC92848249B4A9B49BD45BBC2FC208CAFEDFE AdditionalInput1 = E55F5ADFDC3A39F3D98DA3722668844B945421AD6B2AD874E3EED2108A3317C7 AdditionalInput2 = 73ECB98A8263A1E7E2F354F3E3911374FE8D49CC5B82773F89957AA1EF2949EB Out = 01235D374C38B9C583452F66F4F6CC8D135076D200E9D24E2BAF3615B04EC06D7374589FBC450B16D4255A1329125E88CE90E0AD9BFE3B412FD6EAB5DB8C9B72A1B49ABBC7B249A561EC5D29115DBA60CA481576A0050D587E36FE53B291BD8EA142ACAC210F1137E2B65419EC18B584BB1B038948BCB84F099B6E2BA77E2F07 EntropyInput = C45EFDC1E63CF916BA90C3BC3D99F2AC473E9C2BFC548CD1F3E312C477D357C3CBF233DF0277A91D070CC722C47E06F2 EntropyInputReseed = 478B620C3DC3951E80E886E72C0F65E56A62106FEC4488F426002E4D03AF13A74186F04BCCB663D58C1F62CB843782B812C01FC3A4F5B85DFF3AF4696884F0CB AdditionalInput1 = DEC6ECFBA3E61A29FB2BC74B6AD5F478F660B9CD2BE5769E675B93D9CC4F57A9 AdditionalInput2 = 9B16BA48B9CE32E6BA276AE7B072C67902154FEFEDA3C9F106A398B1557D1223 Out = D9B16835563DF3B0156009E065E4539B739508358E36EC37524465A623DCA45E6024EA7DD35CBDC50CC0D4A07D88D976D27BBEE71115A512EBC5FCB57D70360FB8CB92EF5797F40660DA5C5BCEC4182F030DB6DA5CDE651B9E83F23E47C28E74BD84A41D6CC52C1A9CABCC41E7C6AE0B27D2C4BC6DC2089EADAB78C1BC5EAB3F EntropyInput = 2F56E10D7B2EE167DC468A188011EB9DF05AFAF2AAF9CA07DE8D56E69E514D38B3D164FF6F6DB3572C6C0A86A1792EE8 EntropyInputReseed = 697DD5334FBD479F4DD842485431D6A4B8F37447AAEE14A5169D0F5C0A68F01680062087F6F617E5E3E5582B959C62D97A35A59B529C16908CE051BEDC4B9B65 AdditionalInput1 = 62064FE2A0533B9285514D36928EBECBC52DDD4EE130B6424069CC746242E1C0 AdditionalInput2 = 68BF9979BF5F03984413F31E7092CFA5AC0C6077FD55560E4A475E45647DA940 Out = F57744A755F02EDB76848FEF8FFAFABDCB9E5B2758D443B5A6D428D8578AF7C0BF1E61400171655F2D31DE5DD1D0741E3F383BCCB106CD00F49E067AA6B1EC7DFFA1A0FEB2F874D2C6418DBFA264632FEC3FA91EB6542B9A190B70C5B3948509E59A18B5F1D9EE86492293303ED71B9DD750124B1C09E760BFA5D0C81C8AD1BE EntropyInput = D148693F9609585B30421B72C9A8598054BAE30CCAD8C2F14F799A3858C857CB71DAF4E6C6D9D4DA7238E67548105744 EntropyInputReseed = A11247E631790A6E754C191E6E256C273373B857A36E3FAB16A14474D623070C384A93C4AA6D998588A06EF7FF95EA62CF14C569A17258E4C5DE74CD1E24C89E AdditionalInput1 = 87503F287B2C660EDBD83CB7074978F55F2AF7A42E653ED30A354795716F4BE5 AdditionalInput2 = 714CAB163719648B614920874EFD914998C6B35778F14F99B5F3D11A09547C13 Out = BFDE83CF0500BF06509A1F0B273C98FD8D2469CB8E85ACD81327D0EA57F57912E992C6398F48AD198B55AF6BA71C4272CB3CB7794A04B8230708DEAC9A9E1C2512A68CC83C736C7CB9D12D9CBE08414C8D9BAEA96E7CF270F4918E5267D791E9BA21DE456294D7B4903CA2B5E3A6A0DF903683535A61A8BC74561C4B8AB71F7A EntropyInput = FC394B589D9AD2E8703423304BB619CD69A596A3D8EFA6D9FCA68132E0F6A9558E4E9613DB7BC5279041A119CFFD6095 EntropyInputReseed = 70BBC00742DB2B7AD2A54CD4D9D2B8979EE2D1A5C07F8405A5BE70B360DE17FDB1E66FED6CBC30D3B7B5EC02AEF4698DB152C0521B3367EA44BA6D422AE6AB61 AdditionalInput1 = 9DD8BD9FEC4758BF2489E94859F2A9B46D54CC3D94C420291478B2E73ACE52C9 AdditionalInput2 = 99BFBEFA7F8F92F57C86C6D01AEA5F82F75E158E0B802C54A83351A0456D0CE4 Out = 19318FD4EA1065D1D157C4A40DC5EB58BC6694515955362F651A616E9A190FF25807DED9F237F6DD8AEDF1B1E6201DC334597FAA0F32C573ED39292D3CC9AC3531464D4262F92424770C9B3497589DC12C74C8E8B25CCFE3EDAD24E4809E2393DD2EE036F8B4B28083CFC47DFA999F86E2591A6C886FF14D519927B399E3270A EntropyInput = DB15B7D0645C0F72B43183C27096DE8804DF2AAE34DBC38FDDCB828D39701EEB3CF6AAFAFCB12E969CA8EA1EBFADD771BE054575F24B4E81D1540D807F9FAF4D61FAD6B73839F3C6AB3B0FA665F34A0F EntropyInputReseed = 0669C9D75D0222856456F0B46A92915591518DCD03FE012D903BB9B6CAAA85BA Out = C930CBABBB3FBE9DCEA45CBA12BF08B2B380DC42E583486EB1D02055F3700C1F0F5D989C9923BA7D6DD6C7882F99522C4CEAD699B3312B255F31E6877B1B586F599923E97806A4078349DF3A08CB5D0C92F3443124A814DE218EB6E0D364E0FB98F2EA465133CEA732405EF75CFB23431689A3D8C04BB4CB4228019156AAC8A4 EntropyInput = FD2585760EFCCB4D4012FB6C08997F7F888567ECF4FBF812EFDCCF6502B841F13517823D9DBF14BF40D13FD1DC9403BEA079CE65AF17DE974FD43FE187A35759856E56349D9EE291816C6B96C8CF0A55 EntropyInputReseed = 7AD6A593286DDB40E17A61BD761F9CEF298B3B205908F4B324BC9D11073B046B Out = AA773282D6F4A3F9677545272DDEAC7A62151942DCC20479261AC6486F1D1D90B8FCB97358017AAB4F3B49AF1B8F2046FBDBA804936175E65FCE73118DAD33F49AFBB7DB76131634EFA29C037AE8B8669283923BCA501AE9E1D40B6A46884E71300CEF5331F89A84140F71B848554A9CCCD20050082FFBF62742F8D9830F54A8 EntropyInput = 6B11DD36110A5D0A2BF2AD9AD997A599B3D80ECCA270DFA4A88991A15840B3514E846ABCDD45C4089B66E2AA7697CBB35631D870CC6F4A9FA26FAA49B21518A6FCC03BE44B02C2EE93AD74035E42C2C8 EntropyInputReseed = 7FFFF44BE8CDE569C696CB287CC505E9C02DD2C11A3BF8A9A6F5CBDA7BF5B00E Out = D7E0D3BB84BAF62B196F12ED685A5083D7C56535D8F721C0839CA75D62BF32585D1EFE3A833BF8AD92A340E5CEF201FB6BCC5E357C18D512890B3E65B389DD0D960AAA585E7D81B5309B67D84E31CEE8067CCAC11B1895C63A82A61C08A1A97650E714E5C190F7C2F52A78D6FA36A38D1E5A13304E483F6174EF947098CADA88 EntropyInput = B56843981E8155B0C7FAC559216C4F924D6AB5B30FE7CB481BAFEECE0F2B131F1648CA0CF3919B985C41DB9A5B594292D32280279CF0D5EBB6F275C536286883575D1E45EFB8175CCCBEA7BDD44F23DD EntropyInputReseed = D80F3815FD99BC4AED35B78DDCCC9497232E964F7D193313B95A68E2198F479C Out = B2CE4B91E5280F294E3E23BAC6E78893C8A8A8ADAB3C51908F112D5E2F6E8985E1D57EA368F55E52B3D325B168B78371F1507CE4ADA16B0AFBBC713490D04155A165B1E0245C232D53730BC255CDA8C0C2A589CD093B8512FB4033AAC771F37B1314BA5102226EEF7E10F8F2A4C445889A15D20E7A5ABBBB2716BB8A26E7B6B3 EntropyInput = 7E8FCA44EF3189118AF8428A0B4AAF663253F7FA299A7F6946C288E767E64FDC10AB56CD58692255CEE914405AA7E48D323D4D438787CE1BE02825B0E75DEE6DC4AE15378F118771C426DBB784D4A0D8 EntropyInputReseed = A8071715006C47048FBC25908CD8F2EBD50D36C6FC7320A744488912DEF5BD50 Out = 93A56B0AAD1FE1D68DE7CCC2E79F77ACC0F883102A920AEE6E3A51A2CEDB93F941C12752834728C3E77990ACF3928CC5DCB8D371DA1E79D5D9B8111BBB0C755230409CD47F5FD852B62C87D3F0EF2EA83DB7DA9EC516FCBD9A7CBF2AC850A916DADFD3BE42B10531E349560135BF1FFAC4D6023BA4806344634BB986ACE96440 EntropyInput = 6AA3B1568CE85F33DCCA81C33D9D6D32E681B652E82EA881E32ABF8BB9EA7CC781BB94EEC5525435B73BFED2FFE15CF8A41BEDACA01BF8E5012F2AC223E45DEC4BEDDCBBDBAEB61983F95142A924788B EntropyInputReseed = 9DD70BDD10D1ACECBBB4C83BAF0C0543F93432158C53044468B2E25D76051110 Out = 6E3AC7F5FF6C3268AC30F5BF3AEFF52E155FB19226B76C179C4ED2B85DBA4B57AA5DFFA60C9B8A63E2ED412960F689C23A3120061BBC0412AFE5523F751A0D68DF46110E9BBE69AFB16CF7C470EDD2FAF4F08B88F485647AD0162A0D14754EB240B88DC597531E9301A7CCF5A94C0300711CE68457922D8568D00E3AF0E5D258 EntropyInput = 61433E09F9A1027C1B2F0E03EB62F2F70E1A438E97C168D9B52E39FADA888677ED773E081F4BA0429E2C006231C093E4DE5725576A7DCB865301CCE91E007106C5308F99F23A892E481FD8A4E0DD0BD8 EntropyInputReseed = 3DC08E604C12946BCE367C21DF0D877B3A8DC350B77CAC31EBD1F78A9A3793B7 Out = 10D805D731F2E3C2D877871B5315D75401C45582B93209FC6267AAC18EBBA7E69FDE94AF1BDBF0B2594914289FFC21DD4DA55682B483F15E875E56D80728AC3AAFBABA8A85C93DDC6021CD184BC9EDD3B1B3AA5423CABCC95F7EBCFF896869C891EA5305BF80AE0BAAF65A628332CFA876D573D73462FEB7B9A51DC1B7F6F80A EntropyInput = 82564EB88C1EE4D8626442CEB5C42AD7FB69BFA73712B212219F1F11FA303A574C59DF9925A326C82AFA0F9EE7AB30ACF0D1CA76155D67C265EC412FEAFF8359023764A4FCF37B2DC2A21157150A766C EntropyInputReseed = FC9D555999EABECCFD000961417FC24576915C79BE7C57F098AF4CF57CEED518 Out = 0516FC28FA30E3FA5F33FC96F7BD3977033D08D8E86BDEE82403B33DC9D4D19D15083818513016FD1523A801ED93EB6F99AE4CD1F7B2CB79537A6FBAD5F1BAD5A7352A2FD3B3E425CA164DFB0BD95BDB996F7D26D80B8A5E05A02D3F9EDDFBAB0A91EF9DAA48BDFDAB735E0944DFF8B9622F1951AD0E72A8F04286F1DC3158F5 EntropyInput = CD6C9AF1ABEA3B14B02440A1154FF51471E68A7CAEC36C5D6448A189270928B8A652873A4945ACDE53C1BE7148D5C9C8DC0F1F35E06A4F03C7F11C2EDF4AFD9909A21D529B6D446F6D5F382B4B2664F0 EntropyInputReseed = 468768B26D53871D7F1066523E92627EA5C9F11BD0A86218B0DC4C5807AD6A2B Out = FC53DD32085C4AFAE0210508949C26011A172AF5660BC1E61E800D5EDE71EDE55B7D3086228B0D5B4670B61DC2579062FE889F5F13168295E179D4A1FA72525D347E4C6D8869778E24C1005566DCE4CE85C05754B5FE707F15461CA641827C7AA6F2DEAC75043A82E170598B12827F61D38EE58737192AF0AAF615E0A2E8EB67 EntropyInput = A96D0CA8C672C5BEC5646B3C1FC24F53D4C26CE9958DDAB193ED3F1756B03A3A52B73692C22EA30255276E9A8A955D3DB18782B4CF98BFCC3991AF12EE61EDEC6A9AE2B042F49CF8012815E67C35B2DA EntropyInputReseed = D37B88604EEC589ED3FA18BC271B7D8DF26090EC65EAC3A15560ACD13AE14E3E Out = 4EFDA889C11FC4A6C48CF1CBD05093FE773B2A1E8DEDD5069C084FB0AFB88A663DDD12221CBEF869CF318C7F96E5B37FE171CB639A6BA4DCD13F89950DF7018A4DF0B1463A47E5E32BA5B133EBF7DD26DFCFF58DDDC3AEDE6E584D464A29BB2A0723C471986C4A26334B5DD1B7ED22CF5E0B43D5BA1C32C28FB7BBAB8366C744 EntropyInput = A4432B9F47B9CDCF545E82309053C6FA59D89347CC15A8C5A3B5A48CE1DE4A78C826D43AF2165FB2A3CF89B29C24E5D93BD9BE8E7D55FBB6F9AEC8785C831CAB2DC73F470369DF1586C2691F37F86DDD EntropyInputReseed = 5D131C565C51D414A456F1B387ECBCA8E7B167906D7C7BB51D86CB30EA33C45B Out = A433FE8ABED42530242375FAE6C00B8F9BCF5BE594EF0B76EFFDE6374D0F31123D60EDFD887D9D158554D414571DE5CADBC42D24045AB4BD30CC340A3EEBA451D524395CA682D6DBD296C1B777D61EA62040C39CC4A9E5DFCDBFE816DC71CC532B7206E860E9BB4195EFF50B2FC7D91DC95B550D6E57A10C9A295396B672EE8D EntropyInput = 310F74A9A050DC5AEE78DB2358F272C582924354DE77206D3D06D11C33AC43E0817D83DFC12E9C35170106C4CCB19471C211D866C138461B406E7EEEDD6FB5450BE4B9D170EA15608CBDC09E4FEBC276 EntropyInputReseed = 18590ACBB248C8401C7AC5180529465F16AD050ACBC89E26CC2E60E441E21ACC Out = C66E145F770DB1D6EBF0A80F2DF364710F7115D02ABD99828FC207C1F9F9FAFD21A06812B3E8FF7B285750ED32E0F17353DD81FCAFB16A86CEC45B737727523F9E6C93BEC916B4C69232962663B0724AEB6B92920AC46A658F7348A8B34DDE853FEF079A2DCFC6167FD077C37368C786668DA20CC0936289F64E649C258A1B1F EntropyInput = 83C88A3631073B4885BE62C982F2016EA24FB0635862F4DF4C7DE472E53FB5CF336FC27659540149615F2F4E32602F287196E299CD06E3EE96E77906D0BC620D8BDB66A46B99DEE8829350244B121454 EntropyInputReseed = 2DE9FEA24AE744DF63CE67386A27ED79CF146D894112B42D16B6D920B430FD23 Out = 6D0378EDEF338D7997E065E0303A164150442FE1670074CCE86F168623953B8D55513AE53053E33479C7BBA1CB037BF457430B23B65196DFAFD4F1A0D5F8FC48E6597B8735A2D33E76E31A39DFB25A7F4D99D9418ED6F5C7208DA4224367283DBF3BCE75BBF1040C9B58B797A8BA8AE9160D197CB543B102C5C798BD0F0C03E8 EntropyInput = EAB3BBA7E18B50E7FD67BC9AA7824369139CFF54FFDE8B6B7099DEBD084888A2792F937AE30C488B8EA1F22976EA5B5B5A62E03675C3F74046B1258F6EDA11B729E81865F1BAF060916AF9B675839A32 EntropyInputReseed = 6DF33FC2A11D8ED891D2D4EFD7B1401C35CF9FCB95D2ABAFDF9EC1B845F62752 Out = A91CAA67B844BAE49AA3A16844D5A8671ABC4F6422BEF56B6BAEE4885120E2CB49579AD892085D8F0DA726BF63DED3D299889EEFBC3C348D744147B7EBED6ECCC3758B6C0A575890A622AB61576F796520C07F56015358C3F6B17C7F595B0A137F386421456A9C39C201C13A416A5E4549AC535FCF0CC9ECD20BAC4D056DA630 EntropyInput = 11BDDD2F39DB0C74CA84604F09B1C62A4CC22FD0B4A39E5730845E7802C0C2717916F8865893308B711443CF2709657A70FDACE833554CB3F9BB20FB0BC779A09BCE6725F396FEEECA3E9EDA762AA019 EntropyInputReseed = 6F4A3464662396119553E5FE9B48047B84BA5E445280D24816308D548C1B0C26 Out = F0A6C9FD5462C77715E83DF14FFFDE0919B0A54611BA90C347D213C74DEF9914CBD43F58B43D72961F9ECD1B6390FAC2AAF21E0FD1E09123C8CFC924D0629E6D5037BEDF22FE5CBF979A14CBFFE935D77F4A83F73A259AB977C296696EE25ADA127387CEEFA8703992006EF2028F5918A9AC017D78B1A18D80BD6BABD3550E7C EntropyInput = 13722BFEA9328431D1D4039FCDC1D94C5ED389E584F1DA8EB9ACFC175902FE24B49E205C2B57F0258B3065A594E5BF77D9D939CDBC69EA037CC9652064B9C933B1651E609446C0A83C64A4B8701B217B EntropyInputReseed = 71737399AC220BCB4CC3733FE017A02F2B3059AB459B45F187E1DE597617F287C8FF3AA23B69A56D0B0F1C166B921E3251EE09658E57271BC10C3CAC870BA3D9 AdditionalInput1 = 6D0DB92BB6802151C359416CC57AA4A33BA9D46158D5EEFB6B7759308EDF20FD AdditionalInput2 = 8AE04C9287F3522D931B33FA7D4C03A74F1B368D39116E6BC6D9A4E7992CDAC4 Out = 1F56A526B65D9C98D699E3A4D416A39DE70969CF9DD7F3441058958CCC3D6187B163488D8F1FC6C7E3B446584B8BC788C5F54CA1A235E45EEB453E3CB25EB5DFEAB649EDF614C788EA24D59F76567BD696883859A0B1179D56ED1B4F1F5C633B5751A7567FD9C8CE8670E1A1654EA5294B3DFF0D869282D5E9892E635D366FEE EntropyInput = 658FE952111394C1425B300555967470D37475CC9CD9CA3FF8C42E477F55233021BD55624200D64B638DFE9D654801C03C26957BAB05DDA66FE7C3EF766583D0444F9DB6288179ECC7D2EC359ECC28EF EntropyInputReseed = F7D88B00746E83B1822EDD80F6D373224C51724C8E028D30530962DC44FF619236F407368902CACFC6A0BFB891307334C2B06273A0C02792C5DA4B0A5C5B3977 AdditionalInput1 = 78876074E1D06098D3E3B02F51601A3E5F447C21E6D8DC8CECAE870F7335574C AdditionalInput2 = E01BA5E37378F4669AD7C61C9BE8CC08D3C7EEF5F61DECD5028C92EAC63BB27F Out = BB67AE49EB781E842F118DF384718324D02166BF1F660171C81F65973E70E3093DA1C17A1B130C0FCE443CEB50940847F669D87B6D48DB5935F66F767AD486E3186B2B6AD22B84942EB1FFFFE660570744775943742EDA9FA2C7800DE74CF5727EA17EC780DEE3D84FD3201CBF31D72DF989D24975B2BE988B9FAF9CB1F0D9D1 EntropyInput = 6F5231AC26B942A0E61760CBA0FC4960F4F0187E9AEC7167DF88D84E80185046BD746207F1BABFEECA79BE2EDFF4B88BAAB4A6C3E154ADBC6F549F8AB1242924ACDCED981C51C0C15AEF4E769D9E6D51 EntropyInputReseed = 89091EF8717227840C0F7A479B086BD9654B07D4F6F9A5DB1CA342C6B86E0F30ADA3EE0AEDAC447DC4FA5BA3B81BFCA3D7D1FD2C89413516CFA52349F22B1D72 AdditionalInput1 = 43FB27D5C165D533049A2DA47FD1A3DF695065AEC40650F10C5C8E181F0B3072 AdditionalInput2 = 32F6553F46344DD8DE941FEC8BC353F99EB8C7BADAA108D365F22A3FCDB162CE Out = 69C1893302B498AF007FE97544D3D88B045B1B4C771FC14BBDC76E6FC2CE72981F67910304A7194C433601A370F11B0B5F15FD97BC493A1D519D307E6F492E73256EF7A5013A90F0B9EC36E430FA32A835991A1B7C5F6C0C55760761D3AEBCF52B86DBD7F47291503D389CE72F8D228F2BEC1B0D5434B49A08023F09B203909D EntropyInput = 2DA5595CBE827B17D69C834E5D13E344584797EE9F9FCFFD3488E6987DBBC7C1557D55E14FCCA60471BC4A669809D40C0F74C702F39A65D6861F9F732EDB4C1189D610C7BE6F29857357E79AB37C27D8 EntropyInputReseed = F0F371BF64F58938FC85166891E3450BFA80BDBAA6BA9ABE2CD97EED78844B1F223DE1493E360F93D32857A97EE1AB4826317B14B6664633E3D2E8648CA1EF31 AdditionalInput1 = 385F4C62885A6AD2D9B4643AD117410228EF56F883969F52ABB88C8F673A066B AdditionalInput2 = 92C7ED0785EE67DAD948AAC47F165B491B7FCC2310EE73DD99D5CE9251261729 Out = 15241AFC336842F83F3A3052075BAD7DF3580BD60E6960F64F3702E1B77B908352E61FF98DBA6F3E8E2413235DEBBA87C9241A504E89C7B9B0C44B72ABA18323AF9FBCD249CC8D754483EC4C19A5BF0A6AFB1AA3DF4C8058446E812E990BED72DF109F515F4AFCAD906E3F824FE80742C65E313063795B521B6F6B24A2D46E1A EntropyInput = B18BFC54B50AC41BB304E3DA81F3A101AC31C1E867B2C3FD03F6B2D9968F3E466D06A4C7D28BE50B9AFF3C2D42D067F5B0803F48ADA3204112B06BF7DD5EA0B3878F8AABEF7AEFE6FCDAC5EDA7AADD86 EntropyInputReseed = 1554BAB07D1AFDB6E1B55349FFDB044F32417F557D417908C65F6F3C5CA7AE5D37E18282A4D8DE4E57A1DA597D604B9D8D478E9FBF97B5769FCE6F3E065A8A56 AdditionalInput1 = 7C337B1AD0C797D244C51B400ABFFDBC6BA44AFBFAF8352F9850EF9B5B658584 AdditionalInput2 = B0F34C1C7408A9A373FA9C0C98B5073B5ACE71A7544D751B62CAAFCABAB9B35E Out = E42D3A1AE4425837FCC8981E69776D7B9A7637B73A1A0524F93AEF0BEB5C78DCF6920AF6E47D68B9F2F63B9A8A60F5FE3D117B4EA15FC359926AF5D9983A0186B6B09ABB2447AEB79FEFB267607A8DA3FFA24A2425FEA5DDF2D8E32C1FB634A46B2F76B53F711F3425A8F42BF9FF8C7C971ADD765710D3CC3F958C65DEE0214E EntropyInput = 94BAA4D0211C0F1E397C0CBF5606A5B6F54E8392C44AF776E73986C6E8C74E50D0BC533490EB9060B14F5AA0B52BAB99FBA4B1743EDBE0099D0B23C6C91DAC384B8FB1C488A28E2290D660D33F4B2B1C EntropyInputReseed = CE37BC687E2683694F450FE7D7D72B5F485354538B69E56A4DE725C988FE27D9172040D6F88EE331C80AEC2634C47F8C73538ADC333583977207C763959B679B AdditionalInput1 = B4BE9BF0129B0461F77D08688064405BA800C0864A2FA91921E20F9F540E4F5E AdditionalInput2 = 5172811F6B31EF8F1B9616150FDA43DB9ECEED1616AAE0ECF9F60AA2BDFEB85D Out = AB7F4BD73BB9A23E490298AC2129AC9039C1899B53F04E5DAD3765B10182123DD45A9A08D0FAE8E73C73D71CBB1C71AB37D3AFA8564CE8A17C5371D34854C34D674E2A22BDCB4A34882EFFCCDBD596CF7D398B426423ACAD73DC5C83258DC00D91F44739A88EF97D3B96443B2D284E5DE0F1CFF7DC4819163EA94BDE73E9005B EntropyInput = 7398B194ECE8441D43B7E456955869F6626135E1076600A11396C9B014A1C56933233C9FD84234A546192684ED8C94802FC550C8D0638047382EDD4D1D0174F6E396887891C90316879A4BCC26B61317 EntropyInputReseed = D1904042C3FF4BA1A9C44DA7BDFAED057A1285132FE4DF60B21A5884AC1377B1B3F32C9C6F063792E66AD8A52684A2081935F57FD26EC1BF8773DCAB465D19DD AdditionalInput1 = B36CDC4F6635382DD8794104F9D245247C8F3A39626F92103F51EA33D5B3C391 AdditionalInput2 = 90B10A00DDC3473EE23582BEAC36797C21FFDACDCE9E51400D7D1A6BEF81C051 Out = 98544B5BC4493BB54445B2E97CDB7BB65C5218598290A4A2AE672A88A48A16203848B548F71F4B4FFDEAE6482A6B395224C689A7CEF1FE56C50265B38111BC3385B2A579B0A0E04F7C3BC672B24789B178435F74843C8A9F546BA109ACB6B1006BC20D2ACB7E29285E857CC0F0C5530EA4AF8E9EDFF9D84A3DAB103E2CCC9BFF EntropyInput = A577E89915861122AD72CF8C916558222183581749DF07BCD48075DE88CA7C386BDDD13EC758C4A26B01F44AB8B9E53608487819A373D451881399116A5D172659169BFD2040A0ABC5EA82B19E414D6C EntropyInputReseed = 4F405F93D97973C7673C086B1E54BBE481289D06F5D60B565CF24907666B5245E52EC1CF01510132640637BE15E7CE8456280643ED0CB44C54C986C6FC8A99BC AdditionalInput1 = 181A9F831759B891DD217C0F577BC0C94F9BD98DF3C3FBE923B1462014FA4885 AdditionalInput2 = 4DFC814B9E238A411F8B6B5673BC3DE473DD8BFCE1C51DB57BC69C08C40F78E9 Out = 666B06CFDFFE93A3C472182C69F6F7F8C069B47BFD2D9FD76820141B7FC209ED84AE902F0CC38D2BB4FE4FAF1C8BCF6B517AEDE78295F94F09B28B76FD2FD26444710222B3499C35D438834E54CB4014C2E33E5AE23E285ADD8E7B751C2F9EA89CD69393A35ACE89C990EB3C86FEEDDFFC5E89371613940D8C04D683EA97E87A EntropyInput = 2F3F1A84C97D1BA4B3CB9ECBB54BD86274AD75FB780C72B7B5B38D8A69DBB151902CDFAD832526972B27A1C829F8695F513FC2F52B05B0999BB7CF8C21D8D3835F0BFD3AD69BFEDD623D3CF02155D55B EntropyInputReseed = A6573200E875CDDE32BC29462EF3802ED1F2DA0FEBBE3BBB19ACA23D2501FF78B6DF8D74731D99480E841E7813EBE0F562A87B96DE20EC68F332FB2B3FE30054 AdditionalInput1 = 4C59352491820CB33DBBCDE911EC394B55DDD476B728769CB1576C3EBBD57743 AdditionalInput2 = 434CEE9F92038826C2E492A0CB9F67C771F32D98018B0B9E949506E9FFFE65CE Out = D9FFE47B720459363459DA347E09ABF08A0F26DC67C5B11839E6ED205AD4C54809C0E927BE7C55D9F879EF8326358907A2F515AC67795495A958EAB1AB0A5086C729661B2F510B48ED762044EB349B97A32DB8D69C47F20BD81CFBF731977DD5B545BB81529FE0F425DB80F36041B236EB53CCE7A97464463FCF843BEF7A762B EntropyInput = FD66D1528AE9F309047EC9C378CC73643D2C5166F4FD5F0BFD67EC177AC6F9A517E97A4050B97ED9366F04B7C5FB3F8E53F82D268980CF5DD260A0CA471E3834A724430C827100FA62B5D0BFB28F7395 EntropyInputReseed = B86058A58B6859ADA9B94CD0E4611EE093408BE3B75D753E314C769A65EB3D9150F70A86AC776CAF67108CCF063318D8CEC3DDBFE57932AD77B20E21245B2EAE AdditionalInput1 = 255B8F453FAB4D14435620829A48A0E53CCF5D3FF316F83981416AC8E5969EAB AdditionalInput2 = E19559A3C11844966B170E7D4F9303A431A15303E63BA6834D398EF785752C5F Out = 1BE669B3283D870D15E2E9856B91DDADE973FDA0ED80FB58F957C4E7F39174B14B1936F07B5B6AFC6DF89EE96C6E851BBEB5BA9C467FBE9494AC194E660DFE292BF2CAD3E71CE2EB06640ED4E2BC63F3C52FA385D9DF5A07D491B3D64CC1AC9D937D0EF625A463D3D295BB4B09844A8BB63D9440F731368AC0BB59D6E5848777 EntropyInput = D59BFCCA97785662BE11CB01069AD84E969D76BFA90A047DC4B42D5EDFD90A4B2DBF73DB611ED91BB408104AB0B8A1DD86BE6964314CB1E868303CAA75C02EA496366D7BBDA242FF9D81D1BF1553C8AA EntropyInputReseed = 5D6E05CA22C86BBEBD41CDA23B8746198D6CEBE05D5F1F33FCB57774778926D71705F256FE0F3C1EA0B7547B2696A2E44C8A0FEE42B6F601E889E520C6A315EC AdditionalInput1 = 6CD2EA7999BC31221F127AAA07E06DB55623165EDBC16724E4098405C2628437 AdditionalInput2 = 2142E51708CF2F823E6A3910333E4774B3C94FCD7A82963455CF5281E3A1A399 Out = CEFB91619AAB4767E9F8080C9C105444B58C108E567FE41B4858EBB89102B9032FD96A74E06A48C75945C41B7BEDD66A2845CF3A5139493D69A3F9107F4089513C4B6C527D071FECDCC22C34F10C4CF5FEB0BE1DCA0B0975BB64215A63918CC2310DCF2C37E7732AEE92737163F2054963AA7E35977466DFC53514F3C88E7FB2 EntropyInput = 57FA97342C92487AEDD7766B0E5721C0B90765B6EB98C9F65DA87B09467F12CD45AFAC70E478132CD1D566B3D54F00D5D5FED02106D3BF346D48ED2CB8A1C36A8AE0826C75A03CE5FB591310D1C238C6 EntropyInputReseed = E3AE21B02424DBA5228BDA8D61FE645EA9F709FB1C9A3EA585076DBD1B410745FEA04490BE7E3DC0FF6280F371D7AD46B05ACEC2F6D4ADC88664DED4BC87F5E8 AdditionalInput1 = 7BF23F5CB011B1C98C428D1703123F9B8E790D272F85DBEE275329620FCECCF3 AdditionalInput2 = 3E5A0EDD90858875300C579DD6EC1CED766B7E89F2D2A3AA4E08D88A8DB51000 Out = 90B6FEFF3551F05BDA2E6AC142D2BCE40972E7BDB6897452312622476291C9B5BFC69A0D60029BBF63E4496A6BDDFF56637282CC2AF78B68493AB6F55353ADD538D8B1C99A0C8463B212A3758F8F8CCFB2BC94D2AFAB7EA8D2185F91857B411AD5433E37CAEDE90DFBAABB12DB243EE796B1699FBCBABC143C7FF0DA3D863410 EntropyInput = BCE36CC908A253ADF0618BFA8EA58DFA9597442B423B7EC262F0B80593D3D8B094B2F6D101C5539AFECE79AFD42F5E6A42B6D79367CE55AE939F2D9A9746D2753FFB452DBA1846AD4AD599A664494B69 EntropyInputReseed = F8C6582A600EA86196FE0A117FB9D69D260D8E8F28727C3322C4C2BA7F8DDCE7E37FF948D2E3EE783B1CD7A213470B59AB0461E1DAD7E20224A845CB7AAAC87F AdditionalInput1 = 7E645071071A63C224AA40A2B1B3B4ED318FF69CF32E530F6C31BE9888EE4683 AdditionalInput2 = 669B6D40004BCDB245AC0C8ACE931C7F4AC22143BA2AEBCB5C30743AD8515EE2 Out = 2F298A0E342C3D40A191A228EB6AEA6B1173E3C78B7B7CAAE665C186A547AEDCBFAA441D8D4E436442746FD5ABA5CF0509A147988157CE738B7AB5060BFEB76C075E49A9535D8921F6162F3169BF7C8A46B5F8F4B296BF14FEF8A683C2ADE43433210F1D81223AC7239621D875121023D328E686C31D776EC66F7A4C04C6EB9E EntropyInput = D60050E50D2197EB364245C334FCC6232E62CA0E491B27AF78A165A3062E7409CAA1A4F6F7D6BEAD82289B332D889F1CDFC7CC81610F37F676414882A682C5005C1CA04D03AE5125B30425208AC36136 EntropyInputReseed = 10FB5DDD6238597EFC7524AD8A4C2CC3E0777D3A366B9799AC2F2FB02896804D64FCC7E2D7E8CF7908FFABA81AB69F54EDCCB9F961246ABDFBAFD81D6F71B2F0 AdditionalInput1 = DD7222B16AE2323DE3DE43EE42F35B80EE3A56D245473CE52E4037EAFFEA3E9A AdditionalInput2 = 8873FC98A7F7BDFAF5F30D2E4400C639AE873BBA87D49C57A77F3E9B94E5E0ED Out = F22025B50FE7CBB1C8DBB6D9878DB9F6EB36E58B629084E5B6A6CCD207761D0C4589EF098D015A8BFAA21D05CDF1B24C9D83440398A6F7285C01627593AC799F6769F3AAAF97988BBCBACFB010DF2321591482E4D9CF28A81BB4F15F70F15D70A67D5FAEE3EAF942B031859F6D36375C6F235AFFD7D931092B4D7528B0229CF8 EntropyInput = 9346EC3113369315233F000C71D531DA53901E5D7792C15CE219AFF85C92C269856E0A090669D5E7CEE4AD5140F9326099443F464BEE7DF64ECF844056D14D0B68D73E6A4A5B4C4E37403AFFFEB26710 EntropyInputReseed = 2B1050C3E3D2A087F227307AD2D7B3B64E00E64FA24588A76C488836E67183E68469FFA4C16DE3165719664782F7F80D947AA8604656BE92E2DFADDC83FB6426 AdditionalInput1 = A5E0E8585738E08B682916BD12A640F762B7A1BCAA11F6813BFB20633410B370 AdditionalInput2 = D797222F26A4E392372606371C35E67AAF651E166A20A8022934C78AAD636611 Out = 47C66B5EA820B17D4D987DBCF61B81FA9DD4890B107D487F5BD7393317FFE2D8365AC6573C56A500655FD283F5941C6D889138953D0FDFDEB00F531BB71A34B160A316FB07FFA2A6A89B24B170ECA56E5D729095DE1CB7392F492175D20ABE4F4971697CF952AC5AB0BFA540FB89262D4C4A065086B04B552A215053114A938E EntropyInput = BE62350EE67DFEB64EDB4867D8A6E0222FA5693DE9E3A02DDFCC073F857FAE1EB133FE4D7114C16B6CA5D90889A131F4 EntropyInputReseed = 2FD9BDD35DD4BE2ED01755242826B84B96E58E06E3E3A8C5DE61AAFDD5C74156 Out = 62273993AC371D0D7EAEB96452C44A6CC197461DA460D5E1E28999E42B57D19591C8D78F1C5BBAE1CCFDAF77FBBE589BDB664ADFE98C9BEC25BA5895EE61253C343796C56888D89C7C06F4588656EF786CAF0F174158F985A0E521F4492987E00A26FF49DD4BBE0CA5C11300B678FA67BC6F5EDD12FAEA67B703088893324E25 EntropyInput = A9C300F85B859D434EC6E58DFB2BA1A86E7138676596451615C93527AC02B4B4A908377810AED5A8D4CE27462CF77FCF EntropyInputReseed = 95801B36F5EB32B6EE40C91C22F7C2D21A0DA3B0AF9B357A7B1258AD9595C4A0 Out = FB1970BAB9B12C8F87CB6C149CC50A2D7E512088E3837E3AC2B9FE0E0706C30C398E276549CACDBE98A4147E38E904FEC71DD603D104CB2AEBC0D1312EBEB442F69595B613F756746F3F68431FD1B39DAF881E0C6F1587C5A02E975345FD20996AE909B2412D45E40785F59609A7A49BCA3B103D46CEEC1D5675DAB1F6E5FA06 EntropyInput = 531816CBB6297B416B7F1D95ED695081B22687B36C794CE7AE9247863D791AD8586B3A87CF94B0EDE65C0BD0716C292B EntropyInputReseed = 6833ED6DC99494129118D33BFA3CE19A35635FF76EA72B9DC5F0351ABA0ADD3A Out = 39F7FD8B2230C0DE4EE629AD17DC258BE947EA6FBD8EE85C5341253994117A4D74D7E2211C5DF08407D804CC00B6FB3BFEE2C9908C24D2CFC61CD2D5B26308EA504E499DBD3E798C76CF5885DBF53A79B1B756A84263E01A756955B02EA5DD28BD0900A3EA359A43A332162E69EC4BC50531692620596B8B0BEA5C71A4A72162 EntropyInput = 8A018F819172E9558F8BD620427EFDD4F3C6B7FE5DA5884C29A5459B155DB8B46661710A9E9D6A2087BBAED8B7CD4F6E EntropyInputReseed = FCEAE4AF7DA04C1E10457245CD9BAAF22ED02D354437FBDB69AC0259FFA78F7F Out = 1E4613B02CE733EDD7F962D75F8BDEAD5CBC067BD7B6ACFE087598B1AB00588EA83A9666AFD1A7F8B27787CC8B8EE8779F611803304686905FCA1887D41838486F6A81962B4F0689B52255C4C9394697E904F7AF53DC1C7BA1C9FFCCA4F0D3B68A703B271E577A18F5EB8734603F71F99E81B6AC2FCF83348D98EE9A3A755038 EntropyInput = 352071E9179B379A9C8CC8CB6846AA0697CC3F0B8292FD5E87A4457738C1CE32049732E1BBD565FBF636AE3AECFA50C3 EntropyInputReseed = 2B043739DFB6573A58E71CD2393427BC95E701BAC46A78ABE874AB1A2BA4D5EA Out = 75317417F00A3DFE4A1EF80F675FED3D30357CEEF4F1BAEB3D8C5800D9D7911BDB49946705CC900149FEDC62928221DD67C5A6EF13A47915B9744C84BF10620ECFE9446959DD7CEB43C2095A589453401866733C06325C4FA2DC36B79D1C224246FC958FAADD98BFEBFF05633F0F7A0D87C37FB9393270CC9B965548244EFD9E EntropyInput = 4BE26388D93DA07B023B249ABBFADA948532338404776F43E6D6ACF146CAEA3ECCEF0DCC61D9F2F059E3568F9AB1B3C5 EntropyInputReseed = B43D4201F5D1C19B041C34E378E5F580A3F1A130D4FCDDC876E9994450CCBEFC Out = 1A8F57FC18081CCE911668D8F373B6903761A059A604E7C7A4DC3CF3ABB81BF0AB3B804D215E65AC296C83D332977A8881E98CCCD15D6F1527C517829EF70376DD1C4D94A0E8A274FADEB4742389665DFE97D6B8A82DC66D9C679D37D65A7FA1D225AF57766EB352760B90188352F402E94DFDD717664147AF7035D08B489332 EntropyInput = 4BF20A3D0D3DD3D4B7B8B31E46F69CBDF8946F448241F9DA6F8324416EB0B36726A9F1E38B35234DB89E623A0EA6740E EntropyInputReseed = B3434C8B81E728AC6558DCC399BB82A8651CB5B0B9513544BE3B7740C8AFC2E3 Out = EC372FC474CB36DEEC209B030660F46C7397AFCF4CFAA7EBAD3E9327469EFD69B19D92260220013965BE81505D84CC4D648FF300B42E187F2BB72C93DC990910EB7865E714D76D380E46393F842CEF6B73152AF5F969DFEC8D4EFB149BD2C581B037540E4E30C01523AC463ECC7A789087C12EE6B08B2A3BE045C2F550DAB21C EntropyInput = D94364C681813678E1D4E58D75A5614E1C2D7A2ED542F12FADC5F10AE55318A7745A89B7B5D452D0B7A9F78CB4933A41 EntropyInputReseed = 2A549438047BFE6EE17DE4ADA7F10B0580833C53737811481EEFB53261A759FF Out = 536AAEEF67355D867EA4C5BC3B75E1640CD5157F0F200FF6BCA93346207D73C2CDD253B6D3E90744B9EB3299D232626B7F6B07A2AE5207E30FD39ECCE6D26BC802A0555FCEA24C8B7D3B471355D1AC3FFDEEEF67A5266239C0262682AE3DE18C43C82FB4EA0824890095E3CFDB5133307F0477380F8B78D5FC1A472B1D64445B EntropyInput = 4918E6D10F2E460DBC7B049ECBCD9610117ED6491CCBD3DE8FAFEBE9753A36264CCE8CA5CADF2492937080CB0163B53F EntropyInputReseed = 80B7E60F2453877909C7410F75195026FAE916D26CA75A9CACE0EDC7AD7C4A38 Out = 40DB5D953FDD719E7EB11737670EA9D2D2AB100319E69BA36BD6A17714EBE8C3FFC1859687C29D1D051FC319E1F3FFDFE48AD7EC2993CB900E24D56EBE02E2BB4A6E933E1FB04EED2DA0CB61D9FE9DD2E1ACA0173AC154A593AD6EA9D3F054DCC0701CDF0E2B8054A2B9528415746D6C7632F95B047A0476ECEC97EFCD61C37E EntropyInput = 656DCECB0A4C671AEDAA04FF6F8E172CB2E2EF516CA9A685566A108B162080B7F8845E23FB78E9847F2A67F8D2AE9F54 EntropyInputReseed = 1C45B7E2DE2956C86B288BC8BFB90526C299C8D1966DEB3A491ECAC7162F955F Out = 7B1371447C30C66ED26923709FB9D8306C53B78CB4BE99686F9C2C0A891F0FC48E2F059913D391181CADA4321C592B539B4F4F3CEB40EE4A79871171118DD71BB3CAAB7BD439C2FE990D319C1BDC2AECAC94928BFBB7BE21B95F2AAA89E784F7A92A89B80731931CF9F5EB44194B42ADE8E66BB516D6EDE3597EC10DAA427BFE EntropyInput = 39F76211AD696C28B19FF22B40192A610C4436F83B0BB2D87F5F08F7356E039088FB50E7D971D46E9A53E3208A7AA2E6 EntropyInputReseed = B757253121A7D42E5F893AB8E0CF96319A8B699C1BC0D769946242B41745AA2E Out = 7198B041952B24B76ED68C77118F7292CB91F26910DE74E0F1022816BC67947E72DC51115F0606933664897836D12C40A03C4F863304E401D9B71B3E2FE421BD71434723D35A3B828604BDFDA66D8DE294C78DA3C32799289D314130ED30E72DF9B09DD13584EF5641F94CA133150A7DA15902742C5E5A0E8809B709DCA70F1E EntropyInput = 8742EBEEE23098E0433D534313A6B53BB62359D88D5ED66D04A22E66A5F07D7CC3834B0EE189054204669E1EC2F8F302 EntropyInputReseed = A8DEF902C9A189D651D6333CB82DF3500D7AC1C947450E5D303C5B5F3FC5E8A2 Out = 3487E670C75D7D095C36F203DD0522FCE632F713B61046FDAA998CDDF6BA57DE0C984B18195193181A182BFF5C0DA3E56BD8D28484F834AE385D5B1C6ABD14A2D175BB2F4809D18EAF33F08EAAF1005204AC0ADA5C4CE67E422152305D74E611873FC359E29A76FDF4DA5130E2E2FC6A7126D11CD94280C7C99E7028599D01E1 EntropyInput = 5173097BE7FECDEEC994158B179B74D14E4A80498D6E8A4FFE8D44812E9429E7C09143CB2758C675D08CE8963D6F61CF EntropyInputReseed = 089B014800F4F56B7B41C499FE7D25A26733193F19BEF0A1E2A93603EBBA75A1 Out = 3957B3682DC5BF93156A272B86F16AD9F6640A075C5EBCBDC3B9E7D37F1DF540FBEB20CF389B0BCD30461C8B895EBCEB2294271D7BBB3E0C3E5272A978A170F403B2B0A18402ED237FD129900D819959149B3A4E64DE5C236E18644950AD254B08006B1CCB9166FD014A7F5EF3E01E932F7B2D678B23663B5847C8E506BB78AB EntropyInput = 7EF61747523F9061047575A9DFABF2C2D69FC5D0A7C5E73566E67E8CBAD1E739DFFA13CB6CDBE9C6EB908241EED8DEC3 EntropyInputReseed = CAA74F8726A5604418730756187731282FDD075D199B1190DC5DCDB9B9F1DC9E Out = 86248E8B03ABDC4A5A01DD03F03C55E67B652E1F84AA4230B7E0B7692EDDFC5D29A87EBD90C3C643AFF2FD87729B68C986EFF162C8349F5E71FD4592AED6F3A941767C4D3AE37B26638DBE94328E69555DA7C7AF70202EBA09047DD99D263B0EB9F14DF51DF8661C50E5116B596D57B88ED5200F2B0162677D49AD1F5EDB0D70 EntropyInput = 8FD5DB8B441A5B7B53D1041EECF640C0A15DE9523AFB7CCB4671B269C369DDB0824A201E83A0155D9B184DD8A4AB0B1D EntropyInputReseed = EDA4F1B4623AA6B4289335FB1F67F1D343B5AE46A951DDA9FD4EA1E6D8AAAD15 Out = F47F6A001DFEA0288B600EACB80B54DBF03B5676497227807BC8EB974AE12AC3FFDC8A279265D633FDB9D6A8A012217088B9F4122519360EF82EE05E9F5EE1F57EE0BB07B350291FAF11F43389AED4481F5520428FA2C7721A72199476BA8431D18421A03D76D0C1A06B078E0CB02D797B24F9B719290F3D088C2AD1BF9FA7A4 EntropyInput = 6C7F7CB957EE62F04A45EBA144C29AADE5C23078232BBA68DA400E2374FF1B5FA71760FD56436C458530E2E2A2FA5F78 EntropyInputReseed = C5FB044177F8674459747D04CB98D69DC77035D68B888D3DC090CC91C76803E30F198E122ED2E6B147AA8DAA5898630373C7A3DF04136BB079B56CB7EA2BBE17 AdditionalInput1 = 63AE11B8B395EE59DD32F8DB844F0D5BCFCE4297EE132534CF989FE31CFC3661 AdditionalInput2 = 5E368FE1F61475432FCE8394F5256438C3B26F3A361082F1890B27082C4EAA1E Out = 4DFBAA2F46D1438EDFAD4F508735773E514DA8F8B8E700731415831ED0CDB63821FF599FE410A11D979CCDA3FD0B77959F5C187BD5A544F34213BB7CA3CBD366DBEB12CAF361EC988F2EDCA60610B2560D3F72968F34B65567996025ACEFB30A7F03474E044C819C0DC12CD8FF60F80EE4A9FE8B5DB230AAF0A53D25CBD662F6 EntropyInput = 2BB97AC179C064A386B1D6E9B1F3C1D50511716C90034CF38C40901410F7D5A1B3544C5A7ADEF90A1ACB33FDB9CB9C88 EntropyInputReseed = 388F7214DE8B8715F73F4426400DE5ACDC30BB80C530D163FD0EDC1B4C5D79A5E839282FDAF9E4A53F47680A850BB094FE139965E2D408BF90699B7A313B01C9 AdditionalInput1 = F26019B2D9BD479C484AD6794771A71A6DB7835E7263D5C816EA68D47D70C13F AdditionalInput2 = 185BFA7B0950CECFFC146780B34B183B631D2346D7A971BC02E6E8E4AC5C7E9D Out = CC0DC68FAE8E9482F09AC8B99687FB05FDE1D96C9A04EB195EBE217544096F2353626B67EBFA492E7275856EF03376664912A76FFD97435EF22EA2C82C5FE85F251755F87FCE859ADCA9978BDA3B7E0EE1A22CD59BCD3E6604ABF1066A988D3D1784536ADCE791F61F358AFE4CDDC5A3ADB00F7C1976D27AB2676EB19DEABFB9 EntropyInput = F4CCD63088D3A3FB37F9F7C11B941F8DA13FE473D6E29CAB0F607015FFFDBB46556A34232C7FED0AEB49F1F4B89AB152 EntropyInputReseed = E0FB0CAA02F268CE9ABE820039444D3A5BF80B9B3C882D75DAFBEC95F9011FECE998E4109658B19CD3752B60E6030AAC76DB8FAE32B5E262456213242EDFB149 AdditionalInput1 = 8CBF032E8878D4FC3303F7836DC6B86755B5C44DE234A23B8452456CD06487A7 AdditionalInput2 = F31F674E2C184463E3EBA533E2206BC06CFFFB4D4FE2E74A8354DF37F684BA5C Out = 1B4DE0842CD4EB0E70A15BE83A71A2070E944E88502F46E68834B738C7DDE20066DA961194AF7DC6E67389FCBA269283404B23B09B0904339C15481AD16D2C1671C02A57158F28D36E6AE025D1805297142520D97B848F349C2C328BF76433999B0DAB0E65B4D69DFF5AA604A3412D07A353599376B20C0BEE2EEC416826F558 EntropyInput = 8B50F2D6D05DDAAB91FC508138F3BB81CBDEFE8F79FFC4CB2D12F5FA79D64C29D88A528DAD2DEE4A6ECA47205E521496 EntropyInputReseed = 77BEB009C05756DCF91251D13D8F13686A25D6BC11D24A0926EEDEF3BF4536A1AF2ECF7B9CEFFEF2A3010BD2C9C75DC7167EC31C92A87866CFFB0A0D116FBA24 AdditionalInput1 = 1FD067730000CA75A07EB896BAEE44B9664A22AB21C74F6D2FBA1A39AE7DD35E AdditionalInput2 = A62700A75C202ACADAAC6219A0EDB7D9BAF0574A4BB49EE19DB550A434775574 Out = 4147024E83B79BB0FE839EA1BD71234323A909BF2E6356B3F6EB5519075DF8EE7402ED762CFA6337599CD45D574B58E0115327CA67A2905AA2E69399D9D4613E36F1BFECCBA6A1AF51AFF0CF15ED62052EF144A2CFEB7547296B6E111429F0E032110CE136E9EB55B6B1F5132EA170C93ACFE085C2104C90FDBC99FA8D079D1E EntropyInput = D0B1BA0150CA5232843A1A1E8F16C011999FA6F6021C65C0AB81FEA95E6672B08077646D4817AD18789902CDF24ADE82 EntropyInputReseed = 7BCE5EB22DF1BDF2E1A5324B14CC60D1E2EE77A7426C68E1D6DB889601332118C29BD7791814E4FB3F2379BBCBA5E838F9AE113FC542C76680BE1D073565E653 AdditionalInput1 = 748E93BAA446B71390899369AECDD70EE10BCE3D21A92848C163C1B9E2AD80DD AdditionalInput2 = 6D3FE6CC363E75BCC5B2E57F3D46D05E610270CFD297B47BF4FB81F2773135EA Out = A8E96D1A6FD6A16EFB034A8D45F3FD7085FA195C3F33B3547C5B935ABE8467DB83ABAA81C0C1429FCE61AF1BD5029B133467D27B6DE604C634A7B241D44C2B938DF5B2B70984C52E2B6EC34171ECA28C2644B14DD9AB0FB3D10DF36FA83FA0AF874FC1204FBFF8B5A229C9BCC63B9F9EFB42C4526F75D81FC38905B053E04C90 EntropyInput = E0A34DD16929C0EC075091A76BDA5D34DF43EBA1817C8CAAE679ED350C253CC05A309A40DD4A33B2821CEC3C6587A7D7 EntropyInputReseed = B15CC5164B2AD349397EF6A70AB2ADE875A974DC0096C367C684E2BC6353F915E34E331D5C087253EF9EE2CA16C0B09408693B3042EE92B4826F8394071F2DC8 AdditionalInput1 = 9B250184BC7BEEB5AC732A72BFF817096EF7ECDC52A5F2BA649DF16E69C543E0 AdditionalInput2 = C581EEBDE19A6082B29099982AAF58BE1348C76B39282FFD124B0B3CD257EBC6 Out = 6510A6DD3A7530A6D27DBDF959F7907927387DB23FBDE72002B64D62450A56B568CB314765944382BF74DBB3BA39CF29BF020D68D05AE47AF31B73F350E5DA0A29520C60C60C5F8DD45A96DBF957EE899938A578EF9BEDB554626EEEF2C67F3EA77A8823277E06E9A38BBCE27B38AC3AC999770463AB9D5A3F3DB5AF7B3F1693 EntropyInput = 6C770DA75510EF99DA5AA7BA880EE7F27F7020BBF448AC6370152E1F70D159BA403E59B38CFC7166EE141439EB2B6E51 EntropyInputReseed = B94EF25AF819B0595F45B8E8A2EE46BB98DF84AA30DC30638C22CFE13815D05245901E60450B841282C8641CCD88B67A84C3057FAE64962AABA2ADADF8C9C67F AdditionalInput1 = 2468EB77CE6435B318C597C819C290C0880917B67A08D4D83A4B32BA1347C115 AdditionalInput2 = 1E21CA37C8685CEC36D2BAF3F1ED3A2A5459C6FE1BA59D14986EE421F460B77A Out = 9AFAFC60EBCA8C50DE599955B13B85CD1A2D04C2A27A04CE40A7F7FDE915B362CC2EF68FC2A21FFEB5BC7A524DFF02B8C222097841E885508F90730C4DF410161DF15E5B13772D9FA455E2D214AC97A074C9199DD83C188CFD4E41509197C7A5FF76C0A47A4F7624F105B3DDA3F866439BC0361175C4D59E58C579F80587B055 EntropyInput = A252D25C6A54F1E932863083DF28BA4F0FD4547F6576890FE588963F32CAD4A6519F2510967D4068FFBB8651D6D046FD EntropyInputReseed = 07C15B7F178C6EE26AEDB18FA0BF4F4D6F3B475535229BBFA1E811302CEB298C5DEDCCFC7563B881E42B9C7ADEE9017F99C6EB6E8CCA184B357FDC7806ED6AF7 AdditionalInput1 = E7C35AC561C37D5E7FC2864BCB4C650226372BA569861AF10168E07C04AB025B AdditionalInput2 = 4609B08F226E61D651D63C773D17913C729890D02CE3EAB32A2A5AEA8CE4E95F Out = D701A056CBCA20BBC2C2C8585222C1ED8E67D783DBE5D725A9FD3A1DF8260343E87FBCAEA071BB3B81E00BABA20D0AFAEF5F12BF04296A9C6995918BD7F6664C1CE166EA6F14C2D549EB87CB011CD254491887D29F58ECE705122238A7C86F1B5863175B28524465FDA4493543ECD1A0FFAC4DE288D0B594B22F7BD7EBAA6702 EntropyInput = 8ED425E1D761E92F07EC8CB098326E7A0F2B02A1CE22FB25EF9A35484BEE031FC9B14FAB3795AEEB58422FBCF974A13A EntropyInputReseed = D3948D2ABDD6009AA51955A52A1FCBFBBF6F68BD78943C7A48AEB84B5BE3D273502122287BAE8A63BBF8CAE59813CB6025CC164BB0E856CE9198EEE1724C4EE9 AdditionalInput1 = F88DE990A9313C102BAB1F138FF423EF214548B9A011F2EC90F8CC99C28B3A1C AdditionalInput2 = 7DF57AD388C516270D3898B52AB0525728160D902CDECB0E59D9FC174078ACD9 Out = B9785BC1A420B920B1E3F83AD4733529D3059E54EA2E7C83EBBFCEFB9373AA0AC3A80BD13CCE28BDDC192C59E46310FECB527861495A9A6152232F572B245F8D1956E6CBD03567CE7A199AA150B0FA16EE3E1128EAB3800A2055D81BD07542C4AE4608E2915B72C9B3D9FCFC8112FD7FAC59866A6675271AC72CC21FDC17D11E EntropyInput = 02A152572D79BA40B0ADC932C8FC5B86BFCF7AEED81696A54CF3CEDBD6F905192354D5F190AE00D06650DBFE50116C9B EntropyInputReseed = D75986669810CE5EB0E6103E6F40F8CEAF1AE64E198D1788FDB1F19BF0016C99EBD8D956F859ADBA6FBB384A4AA6706A6D0A8D72C7B00EF4329649AE086739D5 AdditionalInput1 = AC5EAF28E7063898D8E8A83580DA29BBB45A85AE40D32B53DD10C414F805B6A7 AdditionalInput2 = 83343660A6CB2B2348AF76450466F92A91D58DDFFBBF0438333781D8DFC2F6AD Out = BF4DB35B109EC5FBB65BBE96B1DA29878C953DA004262335474A3328FFDECEE05063DA5D63D9471784D9E039778931938B718170A22FCE18AD3DC86E661BFD95BA0C52069F8020816A9ADC8AEAA05897F9A30F6259DEC4E296E75657251654B3C85FC1BE6F43AE642090901B4000737E49C82C0B927B7FE47BC49268FD2E3251 EntropyInput = D1D7D60C579421A41E125FC91C9BD0F60075FD59D4A891C5E96A528FD61B93DF17803CEEA32303A81647EE9BF12D8D7C EntropyInputReseed = E7795D37C2269DB6796F92880FF08D47BDA16A68F9B4967773A292CA2409AA6A002AE65FC512137252AEC8B10A40FB63EBB4443D71F15EE4B7E87EB60D997588 AdditionalInput1 = E42C9BFE3B62D3F3F3C7D6B26B58AE750BD00B90E370A655D0564F83D43C928B AdditionalInput2 = 9618D0A600593C12E20348CBF940728FAFDCE5CBF698DB1A3D9B69C35BB7FA74 Out = 4D371423BDAE5663D34171508C32947AC44991D8A1F2A4187F949E5A85D68ED2963D6A160043C5F3604B98E2C051C87C35882097EFC96D9F27AF46B85B2ED1BE5B2EBD592FD7E63A3B3382B6511DAACC20E6D9994FFEC4E8A133A0C3A09DF1E0C99C22B008380752B9B907FF0E2C3579875A5C1F54E0ACD1C02EA6EEB5E2E3AA EntropyInput = 86CE1E7631CFA0642450520B01B9FBEB6F6CA1E8F1D70F58246F37C052B78BBFFDF9B1FD09B1385DB00EFADE922D9B23 EntropyInputReseed = A9A6A1B85D95829DBA15EF169DF53FE5272B991BF42C396D34F3A1607E98A7EB8979648B425F3F9D13E13FA858DA5820FBFEB77647A5B980858F83852E931523 AdditionalInput1 = F6480E850159F9B262C7C2F8A86C0E87C4093847A874930BD33940B7D1D18726 AdditionalInput2 = 65F85E7332347B0828EF351D7BCAFA7CF866837517D9B4E3EE044E23C1658EA7 Out = B6E5B8CE21E1FEC474AE669E810A65F203388D448939578704B459D79721E44C9C8A95043FE6E1878CFAE3C8C6DBCEC79A32C7B5176FE105F3A9A1163BF24D295DFED12856340EC8A8C5610EF76176974548736E6CD5F680F500DF247BDE2326F15EE07889613F3EEC2883AB2C5D9045CA1FD360BA6D1179601B86CA826C3407 EntropyInput = 45EF1C9D4936EDC87EFD3D363032E65D70175E2C5E8994BB1DF1413203DEA3266E8D3BAA8F0272FAD8BD27AD402A00DD EntropyInputReseed = B4C8881ABFBFDD748319D25995B4AC9018D9D6224012E465F1159852D3562325A9ED60D04FB5FF239F6BE5C0558B6E7AC14C0FAB2F3F80BC475ACD3768D3F474 AdditionalInput1 = 658158A4CBF5F097555CD3806E55E938660AD5962336BF8AE81B07DF12F91718 AdditionalInput2 = AD6D9D2618CF7C8FFB43E5C1674051E7B822785F5A8CD97D2288509EE8B3ADF0 Out = 7B8CD2B664349307E5C2DF8FF8D9EB3925071DEE4797781CF0720B00FC208434C0D626BF4E3A0FB18BD4CD4E3AD4BDA60403D46C2825DB79BCE7D868C4C95DDDB9789BC76BFF05790F71E9A088DCE1138B96C29D60DEA039C5F27C8E09DE74303E60CAB8E20464F2121E75B35F65CB1F5F5FC2D4F55095AA100DF5795D1717F4 EntropyInput = 7EE447E484D5B8589A333A0AF3D0D369918BE7DF1623F8A6F51A3B6D37EB06D77BD85BD02224CE54D755511359EA957D EntropyInputReseed = 89876EE467FF30B4B4ED793CDB13A2E653770B7C979099D8EF88B3270ABCF3E4A8566C7134A3621F5CFD3985E05790220D00A1B14DE03463D2BB56C625CB04B7 AdditionalInput1 = E1BFB749C0F84B51C8A97F9F33590EDF8EC35D94E041491B3C561A62B99140F8 AdditionalInput2 = 4F7B06F4A11D33D538479FAB9EBBD354BA713090DBFC4457AA0A3FE66C69EB07 Out = 14FA6348A18C3CBF8739CCCF940CC4ADAE01F34EB5C2EDF320F92D304E848634290AF62D59569E98882FF12FAE714D370F6AD8396B4C8E3A94542361223D7AA04E322288F100C5CB8D2001123466FAEAECC8401564C9FB03FC4F5CB25BE1E0000F99D4119495D7024C4ED5F1D74F2CA57958D7B89044B11B782C2605CD97C0AA EntropyInput = E0C79C338FFF841B62C60DD53E6193261BECCF0CCF88A13643E8773B5D1BB081E84D83374C0A021157CF7FC6E8F1822B EntropyInputReseed = 895DC4D6460F99F6083E8B989D2EF0225D49C79045A04BABF99659C44B6921089B0ABE8FE5F9ECDBC21DE11B1CF93FE9C11B68F3422C308B5B5C96FB3A171CF1 AdditionalInput1 = 7445C11ED9A91E2E3943CC34750CD56B15229B9309057C3ACECBAC46D7C993D8 AdditionalInput2 = 400CF4C693D49288FA40A367F77DE08163A74A2CB7F30EDEB1C872E5EF86E9C7 Out = 238899C8E867BBE19AF291FC93C6EF55DCFE301FEB5A21543AB5210CE900FFB07055309B903E58588996FF0F8C6B78D8ECF53381F98C57B676409FE7726464C70954B1D44805AC6B99F2A49AD41569B0E336A6C61D2B77EE7DE1186DD8E135D5B031185FE2FF05C6AAE9A1C3DACDA554C3B622EC6404A25FEE0F49F796C10629 EntropyInput = B0172555946D1B3A4121AAF22D22901F4CF57B4FEC98ACE4A99CAB40CCF2AEB8251FBB2F6520F6B94EB2D9FD4DCA8117EAF287330A2005E36614D9C4D81F279F664FA965BA5AFFF080F5858F0E6724FD EntropyInputReseed = 1171E320B02CE1923EC5ED98BCEED593CD5CDF7760CA0A60D048F65374D25793 Out = 0EAE5CA70881B41630BBA063222F1D82161AFB87C7BDEA50B30D6DFE286F17F79CF577B9F5C844F1E5B7030AD9C37DE95DE8BD7A699F4AC2801729C06CA1A879CAAA4C924DEDBA5AA0EE510DD6244DC1101A3C3634B65AF1B6C1D7138BAC1B6DA3E2F3917F1794E6A52804916628B195B8EB17A1CF1D37CB07AB75A46A104E55 EntropyInput = 590E3E6AF8B3A085469A7890E533CD1FF766360F813D78E6AC2DA50CF3F3103D7B1FE4EDAB3E5CF647F8718B916719CFB35F832E9F105994767590FC3EF8165BF5A0D299BE9115C7D299ACBF2DF382D8 EntropyInputReseed = A49DFC0DBEC023CC38663F3E1A0DAA2B7DB3CDE958F165AC8799C89708557163 Out = 3E2B6F710FBC414BEEBC5F28CC36F59501D31310F880ABF3174343AC2EB7F97FCA90B13C28BB3B8D5CAFEC4F3F33ED918CEEC6E60E309D60C9AE43FC6B03A231576ED1BD372F5FC29C106CFC738D327ECD5C2E6F6D2BEAAF571D8B9546CC813CAE045FF24A4CB4C5153D8987C1E00F913038ACCE76A44FB12ABF2A024FB4357D EntropyInput = BF8D1F9A177F009004FE186FF51477573F3066ED7E0799D0B2EF262A34E02DD4CB8F23C875E6BEA0F598346B02D30EF18AC7D57E7ED0B6631966E2ED30449A0D344C9CA5DAA9566E60288A601438868E EntropyInputReseed = C6E61AA66917F69086D9CE0E527ACB0624A4C996D032D14C6CFC9A810B98A61D Out = CE51091236414053E3D0722EAE7F0DC3DD24AEF87A4CDC98F03C3F45377C4470A77A884878F1660C9990C426256B87F43477815C4D1757E85DE9F2D82913D6B75D5FCEF8579B8D4A87422D76B6E19EFC9F97BCC50696F6630FBD08254D3775B5513C913503C737CA835C22289DD0F81E8F05194613FD17C5F6CE44752E6A9F84 EntropyInput = AB1A8A116E0CED3005D8B10AEA211340D747D8B8144399AD151A5170366F24E8330EF39C329304B7BF4D1EED4DAAADE3D402B56FC95B991D9A8C7E256AF09BE65175ED900CB71F96A06754D67D7DCD90 EntropyInputReseed = 2BE9620267DADF5E3CF3D8DFA4B6C2B475421513EC60764108D8BD20A5E0FE22 Out = B724A4A5008AD9613CFF1E031B58079C820AFA92E32032B597F6F2066560440996102ED3E23AB8C95312F8BDFF81A37CF7AA3CC2F0CEAAF99830B11934DB50AD2284EEDE40C4FA45971154D7DCB081F449AEF662D2DBCD0900CCF425AF64EC98FC65741F3674794E9ABFE930AF52A6043769FD2029D1D54E1D918057207941EF EntropyInput = B72E4F0711F20411C3F58A1108ABA8E6CBEE0990DF101E33944331E299498987C33A31FC2C52E11526B3BF37D209E052C6B572842DB3DEB06C727D25F42950D3FA7BC497F25999D013180CFD4E34B2D0 EntropyInputReseed = EB9E6C675A9C5D2A1252497ADCFAD86D17780CBD785A9471DCD2E2E47DD62D31 Out = B898BA43A7B6941F283CA53427633C674B07A710FCD6CA9A2FC6D0DE75BA46F75591D8E5D35B599E0314DBDC9D79A5CBE7CEAD4A728FD795C11489FAA25F47C047BF85E16AC4D4F42458B8C60BAD3BF0518868082E4D5F0B49FFFA3D9E63D0D423EBA7FE2196CA69E89EEBDE525F599D7193B02D650A873EB2E193B3AB81FF5B EntropyInput = 0692607A1CB3628B481B2E4B4E318965BBE4247EC3A98A2489228ECB47CF908F732A4179E86EF8C6AA6D06AA159D71C26EF1E3F15C5D495E0971643D954A1AFB7A4974581CEEFBFDD89C9F1C4CE143D7 EntropyInputReseed = 10003639589B9610BD5E9B39A11479FDD248E73057ECD57B275FE6C79ECA84CC Out = CC3C4CDACE89D708B51C6EEDC0AF3E94874136672035010AFAE73296E8D3FE07AB721948242D132DADE5473AC8D6DAD4440C433F97EA62E51C751A7135ADF206BD3D3D22EB75058A292C67E6329E0EC606869DE999FDAE0C6B0B79242CB2B8716109D42E9604D6960200D07B985C146A83C73F0BB4D84D65EC676DC952E96AAA EntropyInput = 9AD2BFAC9A3FEF466E251CEA5F95577F9484DD0A2EE1251E0A29857FBA3857AD6CE44FF7ED0ABCEB58A6ACC3E252AC6EBE44CAB92C71590A3E8B1A8FD907586959457A63CC26720049CE5F6FD1E354CA EntropyInputReseed = EB601AFDD5633F4E8B9AC7DC6645C628F0CDFD5840DACD0748DF42C3D23D6A93 Out = 9044D2DAAE0CA50C545642CBD95826E2ADBB4CC5C7E8FF90BCE05426BCC8C1D8A75266459E1D7FEAAD321A8C82A685D2509E04976A819AA339AB101167099636F60F786FCC0D11A0974B5E26EECF3CADEFE305BB303C6E60C6D2A8373D1B2B3F174B156714E9D172C11D415DB4E2F5682CD60FDAEC70B39E651B5A95CCAD905F EntropyInput = 0A01EB0E410A678826DD2741372C4B924966511C0BFBE2E5BAAFEAF3EDC74C6B425CDA0BE6BE591C0B643E800975FC0AA02A8B6462A6E076BC461622C5F8890762EFF077A9406543E5A373327D77281D EntropyInputReseed = 92CCABD2799DF243109E12871ACE13F8564C884F4CF6D0591691685812D27204 Out = 8C0D844022954BEF0411750D57B28069E18152BC5A4387A54EFB484C4288750A324A4B60381A52C21C182E12A1A7D00910B33444D320EEAC321F44E0B3BD494F4883B86FC1E561973F0D2F108ACF0734E6EF93CF94A08575F3A09D3E9D64E114E88FD11AF05CDD7DDAAA65F9362E507A6DBB4C327865C65C0E607E5B0295E735 EntropyInput = 0AFA3E94F78DD64630FDA1A8AD0298432692B5C1C19A97356677ACC8783897644ADA7C89CDCE0641C2EB9CBC3F75A1C9933683E41A546D9DB05665DD1B73107B1208746B9705EA94B83F17164D39F9E3 EntropyInputReseed = 838AC6C90853A589370E9E1147ECC9BE2E915F76DD7F193A2BD484101EDC1D0B Out = 74B0602D6C503EE6B8D428B3FC870F7E2446FC6F02074828EC99654504F2198415710CD2F9BEE4AAE5007C0CD3C4B90C33BCA8815526B4DFBB87929B9E0ECA411CC9AEBD3A0BEF4EDD61DA03D47FCE1C68DEAD607F877965E1EB5C64E321D7017F73183E231FD085DDED9460814C056D5D6F0D84D21D2AB1E2BB23DAF7276EA2 EntropyInput = 9432357976B2445CADEAAF8B62E7D4A01326CA9DD3C16286E4F6C45B44854167C77CE1F2E3CE1559FA21C293A8243DA28B884CA261457EFF6C3126BF516F854C6DE3AEB0BEA02CCA708A03E64067596E EntropyInputReseed = 37E3883DD365E4B3D44E1B4894039F5BBCF377DC0F9A0BD247F76B04D4B8161F Out = D310FF161075FC8F679EBBAD3688875B775BB4CB351BCE8E912F69679170147CD4F4151F5DA1096EDDD0E33D67D754C0A4695E20C7790572C1D104340018DD752065D8782C687A70F61130F2450B9ACB04DB48FBFF703ABD61103713856D3A19B9F5B058F3FB55EF0F2995129DBEA59C783CBB89582A4379CF983B8DA984D694 EntropyInput = 60FE629ED7A253A01225D4D4A05D96EED2A4A3C3A633BE0363A4C32F20552DA305AF54D460B5DA4E8C4B9A152AEEFE1F233BA39CE7A428F3EAACCBE5BAD418A9E1AC16F904A34391B3B14FFEC1611A11 EntropyInputReseed = 0F22A190C30B04E6258C7B08E4FE8135209B91EA2EB6231FA7335A99EFE6C77F Out = F3A692F270C24AAC9C469149A8D529B15A56CDCF2B95CE640725E328F4B27AF190C871D260B5897120952D3DF8CBF7A41D02E945CC9B34FF6182E2350A5D03A209E7CD67CE4F0F1AB1F19D8D8ED81F00FAD5FA24F77D312AFE25792294243351BC9C83FB67C915347D7924B4416A65FE9982EF089B8EDB9FBBAB77086E898CE2 EntropyInput = D23BC1F954E2F6AA32B83633813900C25CFAB39D6AD0E10E2D1426F6649C796CE89592DA614C83554FE01352B6AB58DEE22EE6EB64B94C424EFB4E650F61F4660FF68DCC90DC68EC75F817531C4F6DF1 EntropyInputReseed = 0A32233C8B4A525C7C15625646E79EB51C4CC918CC4663455492BBFDB3617F94 Out = 1DCD53785FB9EBC6D0035119E6C4EF9814E7A60128A864CD1EBC484EA585ADB9D1881D70C9E984C57D006965B5090B43A6016A3EAAB08F88C9B9F5AE8C5503A4662C62BA2C9D0861DBBC3D0766994B07B34D645F1FCAC5F7F960B1245386D08BF57A1E2803566DE398249A6B63F83546D3CE7E716E916312FAB244034FBCD7B0 EntropyInput = 25FEC449DBFEF835FAE8896F5FB20AD12649F5032302A24159B18CB82AFBBFDF5A2140BDB9B5D429CFD3A6C7220638805EC2AAEB5439D91C900722F115AA06C413F7CD7FA0FB0CB9FB0303F4D5BE753A EntropyInputReseed = 42229D522CBF79E0828581740A376419E8DF770424BE70B27340FB9DA3A45E9D Out = 47F4B2D8D7CB78D426FE2E436948B0A30608D1E1B9E8AA4AF55AFF0FF07ABC78EAE2A5A143EB1BBFF2E53528E388EFE9B8814AE66B8588DEFAB5B25CC861E791F99FDD2B92C04EE8406676547B3917D67B65BACCD07DF2F0073567D417034D35EE88DA52E8F9C5A06152C424B9CF1A1C474ADA645A2FAA235DC503BCAEE2FC5A EntropyInput = 003DFF168ECE519944CEAD612D64405094FF38F5B5EC5F690357B090BF2F3C950BF0652A61F1C358F6DDB555BB2CC6419B0695D606ABB66DB0178B7F0FBBE7D91BED91088BCEBBA0C7D340F8B86E5DA4 EntropyInputReseed = F39EF47278148F871DDDDEE7FA67DEF8DB78BB418BAF75A121A4803D64E2D4EA Out = 88114F01F3027BAE6CC79C5AC9FD1891995214F2CE4B193B16E46C9B02A53CE0A5966D61ABEC3B219CE4408E7FEC3C86674D6F53C7CEA70C37AD61FE8984C07830E815823DD83ABB9AB998F4ECAB993B98BBAF20132BE4C0CA40946E9FDF7AA15B588CACEFD50BDCE6F704DB38D49A614401DAEE9F384E337698594928D2DF07 EntropyInput = 978FF9CB5BAAAEA04E076A5704FAAAEAE2A71F1737BAF095E65C94D0C52E6ACCB3D5D0573BEB8E96514F73771DF910D19BA3AAA00CD9FD53921A42A6A35A2B261F2FF3FC127684BA41D8DB6A24E0AAB4 EntropyInputReseed = A47AEB9CB4B287C6E6E48F55C1AF4084F6F99E8F4F6E67E7771E3A452A67855B Out = C5B179D2FAD24DA651500A9B2ACC1ECBF2E80722D44561D873F9089054512E353665E6E9156D5F8C9546631A6F53CA27754DE38A9A877AC75D6252511EF376DF4B0F42E0E93BBC3B00C7627F9FF7508740ED2E24B8A19B47E589BAE4A3285D8D7C4DB4BCE2C40E1530E1458112CA5D7E9932CE871E4B9C8ACEF5D77EFEE00095 EntropyInput = EB314860CD71525C8A406511E899D4125A8041CE9DCBE3D496866982AC4F8090ADF81BD208B66E8560D72F076DD4B8E3683537AE09E0073C39E73BE9DEFA838A6E767B908D84A14645913048CEB6EAF0 EntropyInputReseed = 80764CF816353078637EE46B0B657EB9EB67BB307A75FBF81C17AD1B9D2C27C4A1BDABFCD7447BFC69D8038F3E19453B09B9A1771CD847AEB8A0DEBE9FE262D1 AdditionalInput1 = 8E2FC1BE2B64970BB822C5A0EB4C02563997DE76A0C6A13FFBCC8E6CDE2230FA AdditionalInput2 = A9A1A518D95BBAC9329F373F8A65957DF4D882FE793765DB030B07122FF8D549 Out = C39F34A610C96D995C2AB7BDFAFC511737E8CF031CB13AF70CA1FB3413A74893F90AE22591C534DDD82DA64C998D4FC6BE2A4DF5129890A00376D97308C418387CA481A35062479DD9A788BE4565A1F4B4CDEFAC6045DA934E69B3B7131C95F8D14352A65B68C9BD6C6F6F5CBFBBD7FC51D02D61DA8BAC9CC89C44E04978E511 EntropyInput = A46E22D08557042E50A328B22D8FD4DF20B1F92668C0775ED320744BD40E4CA4B2D7D09C18E090D8A45A3CFE99458EF9700E421E07A19CD1EBA8B459FE3720284215BDEFE3DBAF642C52982502D452B1 EntropyInputReseed = 856D517CBC820E9A94ED2C85C4E04FDD15E15278F352A57622F0E490DDBEC381E7F0AC99E8FEA7A63A0B02CF444867A94C116C1EB418C1DFBA9F25533D2CD82D AdditionalInput1 = 10144EBCE6080BB00B5C66EC724D72BE24BE2F03AB082C825F0BF51A3E297BD4 AdditionalInput2 = B1A2B0B01F921726FCB6DE1DC1D59C4B988801C13DAD38C242043DDCF22CD203 Out = F502D173AB1900D9F2255952A2C30E592046719BFCE1544826A5C04FBBDE35501A8C8DBD574167E056BFE881FAFCFFD3DE69E8C07CFF04121C62EB03B11A6D61AF4AA50A11F2BD92629315A2890E0019006E8E6E986623AC4FC463FDEE7EFC85FF9F8FCF1033B727738F2C66ED1CE11035F93CA9625185745D94B603DD6A0D3F EntropyInput = 028BD705C8BDDEBF0A217690B6934F118D2089ABD05B3376D6E217A0F4D05378DA87B445DA022A03FDC9019F7D700651F7447B32075D02B341D01853CAD47E3EABEAB3D737DD4566B8094A57931362A4 EntropyInputReseed = 3CDBCED62C2A7BED2FC40A66714D00A2CAE37566DD75F35E74A629062B2FF3EFA3B14F1DF7EE3315D01DB26B16BBC44889DFF2E3DB1B0396D543C478B3E6495A AdditionalInput1 = FBA9C65CE9A233F13A4F4976AEF6EF472C30195F9FAA11BE1040B82A44B767E2 AdditionalInput2 = FE07FF895D548858190FB1207FEE88812CDC48CA2F9974EF3FF1372C0A31C3DD Out = 37BFB61C8CB9DFFE953EB390F8F1603CF8BEAA5540F6580941BB313826A2D6211D6534BEFC46DF0058B309DB918DB870463A9A570CAD030DA2928EC7BF416A52061724077ECD5D437E32CEB49EBEEECBA8E6F0835B4D98BAD293A8F3B4E1886F51BF6F04EA9341895683AE278A6A0B8710CB7C8EA538FF174448DE830E6A0AB7 EntropyInput = 366A3007586E6B43FD2E8CF7FF1A88F087D81ECFA1500CBA5E2CB0B1F54C9221CF86733DDB943D3C2F6CE1B094C3EA79C1E7AF6F2385416727DF11F1835753C9427006439EC51BA8E3FC1276DE159D79 EntropyInputReseed = F3563C71BA1251A2B8C4C958EB52D8F556D0E4620ADEE65A2883C92543DC7D5A8558FC9C272A6F9EF554644FEE471AB8E39FE698E60EC2507209A3B2EAC0EE75 AdditionalInput1 = FED576F6AA1BAE06A881CDEEADEFF8012DA0AFF44AFB64B13F1DEF171BCD18AB AdditionalInput2 = 2805CB8E7713856857624FA18BCC796B37458EA770DCF93256F959CB4388DABA Out = 3FD8C1CD51897C69EF5FE0CAC6EF8D142EB66C2F7F99615AB6849377BC2B3935D28217E910291954892D4376E9518629B0C2D5878538F61D2520A65850AB9443433729457C63BD13793EF921D84967943B068868C14FA404F9B3C3455C4F97AC9A38CE8BCD8C0777FB4FE1DB5FF8EAF763FA386AAEE5341D6A6A20A536456F53 EntropyInput = 483243B6ED31EEB688596D176FB71A3C4FD862F08D39C269198D99BF4DE0384926F5D213FFAA3CB52FA7B6A70F8C3A0288C1D5F42EFA9FC783A0EBCEE5700806353220D132D870ACDA08F8F29AFC2A29 EntropyInputReseed = 3EDD37B2661EC11ECDBBCABD2D075411191C7A0537511BEA9E4A7ED9DE8D3D87BC094F67A503AECDE138114FAD5E1C4968561A451A1577AD4306D67631C44609 AdditionalInput1 = B234C653ABA9AFD951605165CAB27BAFAC95CBBDF86996BF5BFCDF352039B6B3 AdditionalInput2 = E3F2888B9673711C0F85664CDE2123B4E52058C992D5D9205D27464EA63F6C4C Out = 05DB4EDCF6C91726B9857CD4D53DE620640B95D793EA8AF2AB2E386257E22CCA98824EEC860C9A3629A90315B7A1C6CBBC2FF025478AF6DBD06460AC825F68C36FFF8F54389C54FCD467B13D78A0058ADB0635562C880BD9F0EC4ED2D4FCD8290102C2B5405938B692799BF0D0C51B58A471E07B68CEF92B81215D3A8F714AF6 EntropyInput = 4D3BD135A1E89CED37D09B4975BB1BB87EBE71EE4142B80A0B4B0C88E0A415385907A7633D76D3B1096A5FBA51D75E519A53252639A9D0CCC27A11F9CBFE53BB648F8EF838D9DE520E0C536BE9B063C5 EntropyInputReseed = 86080BAD1D9BD1FC1D29F6096C5378E3C73C4EB6578657807B6D67A77DCB12885BFDF14686226B55B23D34BB328F6EB2ABC4E683E73DAD10A3B6FAD9E03506BF AdditionalInput1 = 8C43D58EE3CECF933A1136300772DDA697B266DCD5430D5122CB8E7B1AAE87CF AdditionalInput2 = 256A9E544A73BE9D340DF7B5DF0679C48246F5486E2B76133962F68392029210 Out = 149DC147D05F438351DF0ECFCFE7A7C4DF837216C5953EE32078F67AFD186F7E9AAB416C1F0BEBD94EABB60CB5196CBAA1F289F9744923AC9ECFF7D638E0E076497B4A38991C682EF8099CB1C1EAC28E5178D837EC0CDAA1F72AE3ACC2DD063FEA28FF1D7EA3664C4D225E41A2B349E8A8C73D5146E613763B6FDE9B818D99DB EntropyInput = FC6F222B361D114558A99D0B120305799260B4961AADE021816064443CF890A21149480D0FFC976831AE66689975050190E2DEBCCA9D72EDDCE2A0566C3B2C2A66E65FBEF3FF950A32E2E79B6E7A2EBA EntropyInputReseed = FFA0DEE15FD99714339D288C13031A0987452868291399EAE61D16A2A21CF76CCDE99217EE45AC3ED389D34724F5725DD83407523C384D5F6EC1B929953D2BD7 AdditionalInput1 = 869E9FC34FD0E23FC57FECDA661FD90184F7418B8599EDB2B966C8584F8F8A39 AdditionalInput2 = 4F000B7BF31567B018FB8602B40A0EB7DED66810443F6992BA7953A220546ECF Out = D953819E46255A002BBDBEEF019022F629D9F8B5520BBCD6C23557584BA0F3BF3B0BFE3ABBFE5187513483FFF86E2C5C445856F5A4DAA50E53DBB4C7A3D1409008F8420C780429314B5772FF98D2BD206EC61BFD5361E4CEF78681BA87BD1199CBED5E59AE93C247ACFB7EF7DC93177829DB78D77E0C0CB69BADA59203540CC5 EntropyInput = E467E12FF28FF002EC0EDE58845591D1A9A4613C77B692CB3D259445BA962D18E689ADDF868BD7FD984CA27381D8435A4F3FF236CA4AEAE6F60CD9ABA71586432F7240BC3E03D529AEAA83084EAF3BE8 EntropyInputReseed = F9FD5D58B00421226230F2187F5ACDCF1D907849E493E8A4AABF3CD8FEC2BCAC86FC7F1C49C947BCFC51FEA127FB9457BE83BC08203DC5A4C4835D2A0A8CAD15 AdditionalInput1 = 5DF969C0235DDC39888E38AAF78A2A9EFC2FA56BCE2268CE8A788ABAE5C6E0B8 AdditionalInput2 = 1F81AC0B75FAF20CCE4539B1F1D841543F0E2BEF633D9A59E38658E9ECA4F56A Out = 5C43142C00448130EEC1442A25FED2EEBFE4D6FB50814F6C632118F115DE78F6D90B9520DC7A089B8483869E1F045D1D4A3D66509CB30EA4E8077D525D5A2D5CDFB87E3CCB9F13789AB95BEC3A98EE0EFF0A519A0BDA6E781D61DB3BFFA0128B90EA65AD72782B963FF33BCD31A426247F1A871C4921138F21FB5CA87A5BF2B0 EntropyInput = 0387A449D13511C606272FDA1B57E81B7FFD62EF897094B44F64F92911BE6600EE45655DE3683F310E0E38E99002BA412E135AD4990F5AFFEC6CE88CDBB300BE166DB6FF07E5F03572205B7356B8FF7A EntropyInputReseed = 7D8B45CE064F5654DA4D52F3C8A964D7B15A219F363A504A02DD9555C6F0C6F20CA1612CC5038C338C308D8670A5989B1015ADFBD8E5C7EB9C3491B93D8DA926 AdditionalInput1 = 1E732F2E0A61856A4E6C866A9AE13039164E96F0BF141EB843D1F04BF77BB678 AdditionalInput2 = 0B8C4CD49DBC28E66350FFD3F0986EFE908492673705F86FEE1B2BAB33EB8367 Out = 9C9375F28D165461C830C35037F628D3FDC4D4ACA668366C483A52C3F16E2DD15CB59272EB0F0A03D2CBB891C3E685053FF599DB36D7AA06A5A8DE166A85A91FE7B25EF7B1F84A5C55271526E479615ACED128CC7563495C8531D319645368525A66313CE05312945D77A865644BA666A8C4A53B92D4667BCB69B8CBBD10D194 EntropyInput = 72121D404705B3D936598DC106525A44489DB013C14359F4C9E5642669C4034991D17E7E48EE590338762593901EC5496DE0CEAA89257A1A4035991499B6EA79B82882CA0D94759C6B60CE6EADFC5126 EntropyInputReseed = A6113F309FC71924A99D15D81822FB0CA09632E72138594DF3A152E6016009B66875EAC096D0F6AA5ED659464F5BDA6A958A08935994C05D42887CB62B651DA4 AdditionalInput1 = 8DA2E614FCA90E66A2C92AF2BE17C31FDEC908329A53B1043E1ADF05326C81F2 AdditionalInput2 = 92F4084CAF783DCA3B75DDFE1B34DF76A69E3486F01E8B72400B0C4CF2463308 Out = 8C60CFFEFBBABC6B8D82D8BB0D13BF800C15539A1F8DEBB8F679E29209F379D4D2E7C4A02331F7298AB31EEB3A34E4FA8E7BAA7BA6378829B3EF7318EB7FC15636F6D8800D4A05B8ED8CB5B5C4AF2B6AE5E27EA8B8E67343CA8C1E5337A60F0657601383D1020D243B6714450DB2154BE53D2894B2E69ED146845344BF0D4B3C EntropyInput = D6E60433D7C756232245CFE3E2E0BE0D0C1C9B77024E5FEB16DE3504BDEC2DB381D4E4B3B0B1D3B84D48A48A41A6CE5E6F0D19D592710EF5035A69FB9501B37715C4F11821643EBACC94313FF14EA432 EntropyInputReseed = 815F2666833243BA70519D2B8D3A70FD22303FFFB521B4433C9F61EAB638C09A411FEC7B1E521FCAE98E1550C0720B3FD8D8CFCB82FBABF55AEFC40F6BCA5363 AdditionalInput1 = 1852D6E8BB38F0AF3FDD15D8670A20E2B2ADBC6698BA2597E2644CBEFA203D09 AdditionalInput2 = 3D947FD8939C4047CE4E4E39ADA924F76F876C3DA2A2570E1E51B88AB17E2C27 Out = 285FBE6B5B7783C0B70AF8B32B8588D4F62E3D66349296B337A90FAD352A7EF3E7C6763F32A3AED0F7CFADAB459149E2C7A4CA71F340A62469F87190A072DBAFF7C5832221C4D0B2CFB3D204C4A8DAB20D3EEF2BABE41E67731D05D694270C4744BD2669B2F8EF3A6F41102F81DAE16BF46945E41054C8EC25110EEB87898BFC EntropyInput = 0153108165847188B22312832B25399890A623D2C972EDF5483CE807B89412D3CA4E4A887BAF1104CD2F83A000622541E760B06F23F8B06E1877C649AA5893E2286AD02BB81BB327D030727DF72F85C4 EntropyInputReseed = 926BBF28350AF501C9E817884CF65F30E629EFCD42127313D2CA68128D99697F7C6FB58C46543B83A516472522F1CD7FA6456AE61CBF680ABE6E74723CCAC1D2 AdditionalInput1 = A055AA364A3BF6A08A093A49691BE4D7BF5371DBD3113E07CC1C3CC7B4D6ED7F AdditionalInput2 = 414BECC0A8EC0D0F8A1624309321A30E086A6D3C52C56182BC84BEBB8346B4C4 Out = 4E5212B7FBB67B5E8914992EC9A69EBEE1DE6FB595444D00CB65F9FEA63AECD5DB5CC90E589AF926FB808EF556FF494FD56325D677FBC1637F11788AD3106F4C12DC92FBC518673BB094EDBF0EB57695F0BC4C0DEC85696C916EA32ECA75D21623730362AD4E32B90426CF576FA503C92A007D9F736AB6678F5840EB63E93644 EntropyInput = 5CECFBC0C6555497B94F8E5E1A6F4C9F38C9C2004604E4B51A658336277D4E577804BACEB85C547EE75F1490D44A22B210E74D03CDD538EFD475C7E05C69B651B7D9D5846BD19D23B2D959C2D09D7397 EntropyInputReseed = 22AB15F640222EA7113D15FA2D01C5DA049BDCE9E19EA0B827AC210FDC05BDF2BB64606CBBC66CC6310899BFE261229059063EA1A5FE2FE46CFEE917B26B8FF8 AdditionalInput1 = ECAD2DD422774B939F126CF7FDE831ACF131F6D5A8D937502B74C98CD4625085 AdditionalInput2 = DDFAC330176AEEEF9210876F8E3BB69640BCD498FE2E702FB11434D2FD11F56E Out = 595DE1AA34CD099E58417E50796AB5E8A70B2964FE1A3B5F7EB9C63704B8E01EDF9B547CBEF276FFB1BDA5ED6DC6B992A68916273FE53ADB1CF9701EC6EFAE0FAEBDCD21055908C7C39598B42D206954B8661631D12CA2B8910D8D54ADAEDFEA901EDAC51B8E1FB6F445EE5AD1410EEB60EA8A851436302AB24E3962A31E2606 EntropyInput = 0DD8AA7DDFBCF8134B551BAF5FC95F0193BC12F0F8722AD067A372DE49D93B45AE8967B271163F28E0A4D66E6A9D507FCA6E6F74628143865E284BDD10EB506CCF1424A7C2E19A6C2B81B733694AE7CE EntropyInputReseed = A3F00FE2156960FFBC2FB02F2B2FC9F2832CB4F2F7E86BEF7EF192CD0EC2E9F0B198A4632358B438AAB70D9FADFF315FABB8FF32EB99DF27C7B682FF258AA4E3 AdditionalInput1 = 1F11A83064C1D4A825A320640710B62DBA1C4F49AE1BDC5E741D1C8A3BA068B3 AdditionalInput2 = 386000CB49C3EA68F2C8A958A57D69DC067D0A32EBDE92157B57BDCA592B6399 Out = 84BA6F4252A5A0B3B149F0F20F8641338EEC948518C402C6ADDDB007F92B00DD280A578EA96D0FBFD12CEEB6A92A9860A86DED919950686BB6E112015B19D34C8961B624DDBB8BBE5DB1B4BD94E6C5BA30665EC8F431E10ACB07C957395FCAB04576097E904F9F12D57A073C8DBA366DCC025AE4739C83D217EDE96E02841C61 EntropyInput = 038F2D21481DE9F2286168C80DB559B037A36A0591E3C246A5E3A55D0E392B358695634DB6FC1C67299FD5553B19C54D0135287EFE2F40A9CF2ADC97A55820BBB9F9498BC512707C5AC9C721893757BF EntropyInputReseed = 7D20F5DD7EBA0D2DD1882FD2DD987280F3D9502A624DFF55267D596D4AB021C97E788D4FBAB892A667C152F2906C4BD7C4A6295F115BB6F65D8088FDFFC8B5E5 AdditionalInput1 = B75E3058848160FD30E7D04A72BA5B376FADF266DB666A95EDAAAB5652511EB9 AdditionalInput2 = 6973E05CEAB5310B9121E1DE199484DF58FC4B26429DDF4465CDE7F7D6EA3554 Out = 13445B39AB893B319CB0C422508D3F4D03264016F9F691B91697B637C4EA251C71EC4CA35570D10724A3F919E042DCE35F50FC10866F7C9DF88AB37EA3BC25D286FAE1557FD930ED747CDF246BC7A3B2D6C95D1F7717BBE422D710356AF8AB7DF7CD724D022FE5F8F2D84D6F2B270D70B16AF14B3CCB4D52FD587C598F00951E botan-2.4.0/src/tests/data/siv_ad.vec000066400000000000000000000062461322470703100174350ustar00rootroot00000000000000[AES-128] # From https://github.com/cryptomator/siv-mode Key = c1d0319d678f7f7eaa8315d2eec5a3dcfbb097abe01675910791f2412618dc21 In = ADs = 61108c1d09d7eeaca42f33e011d977f93e39257afedb4e0c5ac7f265a33f141cdcd5b2f874a7a48f913a7db931accdb792cd85db069b3c156ca74e8f1da3a5a331e2dae5d5d9afa811decfb7d3000695359bad5712ccc431ed01fc29d998d006fcffe28b8530a0cbb43197,4bf3f928f65e5ce009f9e2511d200ce5ad6c18098697275218834ccb02a81e41f5cb5b9082f31e44a4568d3e1019e3df3d2278446cc5b3fc02ba9767001fb90d8fb7b9d8cf0b963f08e7bceb7f05e7c5b38d587567697ba72a25 Out = ff4a7764e15d1e7dc8e4de9067f02064 Key = 3634798b4dbc029f6245ed4e44d4203fabb97afe2c1d0bba6a58012d82a01900 In = ADs = 70f550b8d0263863e72c5c41b465c086a48340da28b58ee3952941cb6a58fdc88e040000344a1d836fec8e3d6e5ae81260e7fcf7258f7e6499068a6c903408c5d7291f5bfb0d8d652dc7a7ca1f6d791f1f01cddf,044d36980cc749aff20bc4293bdaebcea7710140034ca7fc287f78a78a3580b8a24c73b6ca829a410d33c96edd2c205b87d8ccef3eb6c05d4e99269b4b1e1d7d41f3ee1d096cf4b72f08af35b6,9cd557f2,1b16711dc5241ee32efb4ac4bbe1a4676783fffe98dffd8fe203bd6d048c4e8c62131b2e4841f288ff672a880f34bb0b6dae8d466241cdcf71d83db853a3ec2e5dbcc4eb4eeaab405861b8a1f179a5c07d2dfc8ae6876f2525daf5f5950fa30f7b9ebe9de424970cb44273ebd798d45f7409f1cb6433,d8d437195cf7e0f7dec14d579c6683fd525899038ecd047255abf0645308fa6e72388d4782aec0e76a190c282ec65eaeaa6d6b5fd66da7519b797a67af3dcffbd727a3244f1f167c6e26da9458249ddc73d1ef45e46f677afd08555e90b74b809ad06481389721b9ea839fe3fb465d82c98b873f1f68ae53a5e03393550937,c837457d024506bba42498e7653d7f19572707970474aadf587bb67211a084ce143509c958b4d31f841673daf4ce48a3a62a285f2fe724f921,5feaccde56c7ec9f48b431725dc4dc9a75021be0d24fac93ab7ed76afd54cc6fafe48b52fb918a8c1fc1f3fe51a55c00c0a8448b0f0c0e9adf5f2779a5b22f30f8c2787b5b94465a8769208d8509cb068c9d3bca813212abb196bea7502c8e3d53edcd2a87,477fff14e328761786f4f60c1f5562820f92c9a2a66b02da2ef5711e6408ab13c7266569dc41e5e94814a95e95587f13dc2e4c56e7a3a9b8e7146dfd5ca82e454b6a08ffcb5bfdb209c3614210eb72fea14d242be82e9eb2f38b37f9c3bf60cf65a66325c7e6e703 Out = 116640ca249a9e84bdfe4d64ec26450d # Test with no AD or nonce Key = 7f036a043b45f9cda8b8067186d70ee1fcf11053cac8141ee6cbf6a4fa451e98 ADs = In = Out = 8ab2a4ee4260a72a31159d3ba49dead1 [AES-192] # NIST test vector Key = 7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A6968404142434445464748494A4B4C4D4E4F5051525354555657 ADs = 00112233445566778899AABBCCDDEEFFDEADDADADEADDADAFFEEDDCCBBAA99887766554433221100,102030405060708090A0,09F911029D74E35BD84156C5635688C0 In = 7468697320697320736f6d6520706c61696e7465787420746f20656e6372797074207573696e67205349562d414553 Out = DE40AA1E7180D519CB14308EA7F77586DA09877C510F29651F42311AB728E95609E7DE2994BDF80BB99BFAACE31C4EC0D15BA6509F53F36AD725DCABC9E2A7 [AES-256] # NIST Key = 7F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160404142434445464748494A4B4C4D4E4F505152535455565758595A5B5B5D5E5F ADs = 00112233445566778899AABBCCDDEEFFDEADDADADEADDADAFFEEDDCCBBAA99887766554433221100,102030405060708090A0,09F911029D74E35BD84156C5635688C0 In = 7468697320697320736f6d6520706c61696e7465787420746f20656e6372797074207573696e67205349562d414553 Out = 85B8167310038DB7DC4692C0281CA35868181B2762F3C24F2EFA5FB80CB143516CE6C434B898A6FD8EB98A418842F51F66FC67DE43AC185A66DD72475BBB08 botan-2.4.0/src/tests/data/stream/000077500000000000000000000000001322470703100167545ustar00rootroot00000000000000botan-2.4.0/src/tests/data/stream/chacha.vec000066400000000000000000001044561322470703100206740ustar00rootroot00000000000000 #test cpuid sse2 [ChaCha(8)] # Tests got from the original implementation of Daniel J. Bernstein Key = 00000000000000000000000000000000 Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B Key = 00000000000000000000000000000000 Nonce = 0000000000000000 Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000002 Out = FD74BC4D822E344ACA041ACB39789BDA359D16B7709A7676B03B0F06117685B33B5E1E7DB844BE88ACCFC8370C808FB4BFBFDE831358476F09E34F2045AE61C0AC4120E44862548D3E5B577C695005115CFB158B9B6341BFC0561B9EAEE34D114583FB5FC901D5EA85019EAD2D4F618A5FC97954A5913576CD6BA32E710DA15A52D9A5B74B6E2F1D333C6405A5D6F64E2B1CED579A5FFBEB390A756755FED56AF37061CCC3A1D4DF6421F7A4D7811919F95A7F8533826DAB256A09E58CBFC5A04F83B063BBB169D2B05AFA6C8B3EC5880DB3346193860671AFFB3F9A5B56F771231393330816FFBD0E66F6D6B598178461CF5BE424A84A8D426DDB4B88FCB275 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 2E214501D03825E75AC476151531939D6DB48E04588D91CB6CAC080F87CDF6A95C6A0245E0333A970BB8E8C373A0CA81E2592224712B8002D3AA52835DF513F5D4CCCD346E24968A9BBE43C770EF563968821B21FDF26583F51D9F3ED89EBA912B2EC460C460BE062B8AE3604569FDFD0B1312F7705E9D7A33DCBE720D69308CD89AC06C58545C47148BD68C1E61A838DD3BFB88A5ADC721DEAB8147B9EC16A77FC8466C0B791D29AC2068769D8AA54A5D15A11580FA9A375F2D0072E1FB8EF5A27EF31B7710E196B3D061C911FFA93D067364D23B1FE69EA1318202BF94C8718CB44F4383D678C493A5C5502F02A9BA861534DD2BDC9559587BFEED4A08F5C3 # Test vector in a draft "Test Vectors for the Stream Cipher ChaCha draft-strombergson-chacha-test-vectors-00" available at the following link: http://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-00. # The document links a github repo where you can find all the vectors https://github.com/secworks/chacha_testvectors/ Key = 00000000000000000000000000000000 Nonce = 0000000000000000 Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B8A26AF448A1BA906368FD8C83831C18CEC8CED811A028E675B8D2BE8FCE081165CEAE9F1D1B7A975497749480569CEB83DE6A0A587D4984F19925F5D338E430D Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 0000000000000000 Out = 3E00EF2F895F40D67F5BB8E81F09A5A12C840EC3CE9A7F3B181BE188EF711A1E984CE172B9216F419F445367456D5619314A42A3DA86B001387BFDB80E0CFE42D2AEFA0DEAA5C151BF0ADB6C01F2A5ADC0FD581259F9A2AADCF20F8FD566A26B5032EC38BBC5DA98EE0C6F568B872A65A08ABF251DEB21BB4B56E5D8821E68AA Key = 01000000000000000000000000000000 Nonce = 0000000000000000 Out = 03A7669888605A0765E8357475E58673F94FC8161DA76C2A3AA2F3CAF9FE5449E0FCF38EB882656AF83D430D410927D55C972AC4C92AB9DA3713E19F761EAA147138C25C8A7CE3D5E7546746FFD2E3515CE6A4B1B2D3F380138668ED39FA92F8A1AEE36258E05FAE6F566673511765FDB59E05163D55A708C5F9BC45045124CB Key = 0100000000000000000000000000000000000000000000000000000000000000 Nonce = 0000000000000000 Out = CF5EE9A0494AA9613E05D5ED725B804B12F4A465EE635ACC3A311DE8740489EA289D04F43C7518DB56EB4433E498A1238CD8464D3763DDBB9222EE3BD8FAE3C8B4355A7D93DD8867089EE643558B95754EFA2BD1A8A1E2D75BCDB32015542638291941FEB49965587C4FDFE219CF0EC132A6CD4DC067392E67982FE53278C0B4 Key = 00000000000000000000000000000000 Nonce = 0100000000000000 Out = 25F5BEC6683916FF44BCCD12D102E692176663F4CAC53E719509CA74B6B2EEC85DA4236FB29902012ADC8F0D86C8187D25CD1C486966930D0204C4EE88A6AB355A6C9976C7BC6E78BAF3108C5364EF42B93B35D2694D2DDF72A4FC7ECDB968FCFE16BEDB8D48102FB54F1CE3636E914C0E2DADC7CAA2AB1929733A9263325E72 Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 0100000000000000 Out = 2B8F4BB3798306CA5130D47C4F8D4ED13AA0EDCCC1BE6942090FAEECA0D7599B7FF0FE616BB25AA0153AD6FDC88B954903C22426D478B97B22B8F9B1DB00CF06470BDFFBC488A8B7C701EBF4061D75C5969186497C95367809AFA80BD843B040A79ABC6E73A91757F1DB73C8EACFA543B38F289D065AB2F3032D377B8C37FE46 Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Nonce = FFFFFFFFFFFFFFFF Out = 2204D5B81CE662193E00966034F91302F14A3FB047F58B6E6EF0D721132304163E0FB640D76FF9C3B9CD99996E6E38FAD13F0E31C82244D33ABBC1B11E8BF12D9A81D78E9E56604DDFAE136921F51C9D81AE15119DB8E756DD28024493EE571D363AE4BBCD6E7D300F99D2673AEB92CCFC6E43A38DC31BACD66B28F17B22B28A Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Nonce = FFFFFFFFFFFFFFFF Out = E163BBF8C9A739D18925EE8362DAD2CDC973DF05225AFB2AA26396F2A9849A4A445E0547D31C1623C537DF4BA85C70A9884A35BCBF3DFAB077E98B0F68135F5481D4933F8B322AC0CD762C27235CE2B31534E0244A9A2F1FD5E94498D47FF108790C009CF9E1A348032A7694CB28024CD96D3498361EDB1785AF752D187AB54B Key = 55555555555555555555555555555555 Nonce = 5555555555555555 Out = F0A23BC36270E18ED0691DC384374B9B2C5CB60110A03F56FA48A9FBBAD961AA6BAB4D892E96261B6F1A0919514AE56F86E066E17C71A4176AC684AF1C931996950F754E728BD061D176ECF571C62A5EA5C776697B3193D3EA94CF17D7F0A14E504859D1A67C248AB298BE3BB7EDED3A23F61B6C5BD1A5A4CFC84BFC3D295AC5 Key = 5555555555555555555555555555555555555555555555555555555555555555 Nonce = 5555555555555555 Out = 7CB78214E4D3465B6DC62CF7A1538C88996952B4FB72CB6105F1243CE3442E2975A59EBCD2B2A598290D7538491FE65BDBFEFD060D88798120A70D049DC2677DD48FF5A2513E497A5D54802D7484C4F1083944D8D0D14D6482CE09F7E5EBF20B29807D62C31874D02F5D3CC85381A745ECBC60525205E300A76961BFE51AC07C Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = AAAAAAAAAAAAAAAA Out = 312D95C0BC38EFF4942DB2D50BDC500A30641EF7132DB1A8AE838B3BEA3A7AB03815D7A4CC09DBF5882A3433D743ACED48136EBAB73299506855C0F5437A36C6EF5AD3D6A4F6C35D9D66C2E34005B91BBBE3099E135A00CE2F700745BE6253195824D4B19F69731B6177E624358C7977E67552F519B470E3F7A8EC965DC3BEDA Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nonce = AAAAAAAAAAAAAAAA Out = 40F9AB86C8F9A1A0CDC05A75E5531B612D71EF7F0CF9E387DF6ED6972F0AAE21311AA581F816C90E8A99DE990B6B95AAC92450F4E112712667B804C99E9C6EDAF8D144F560C8C0EA36880D3B77874C9A9103D147F6DED386284801A4EE158E5EA4F9C093FC55FD344C33349DC5B699E21DC83B4296F92EE3ECABF3D51F95FE3F Key = 00112233445566778899AABBCCDDEEFF Nonce = 0F1E2D3C4B5A6978 Out = 29560D280B4528400A8F4B795369FB3A01105599E9F1ED58279CFC9ECE2DC5F99F1C2E52C98238F542A5C0A881D850B615D3ACD9FBDB026E9368565DA50E0D49DD5BE8EF74248B3E251D965D8FCB21E7CFE204D4007806FBEE3CE94C74BFBAD2C11C621BA048147C5CAA94D182CCFF6FD5CF44ADF96E3D68281BB49676AF87E7 Key = 00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 Nonce = 0F1E2D3C4B5A6978 Out = DB43AD9D1E842D1272E4530E276B3F568F8859B3F7CF6D9D2C74FA53808CB5157A8EBF46AD3DCC4B6C7DADDE131784B0120E0E22F6D5F9FFA7407D4A21B695D9C5DD30BF55612FAB9BDD118920C19816470C7F5DCD42325DBBED8C57A56281C144CB0F03E81B3004624E0650A1CE5AFAF9A7CD8163F6DBD72602257DD96E471E Key = C46EC1B18CE8A878725A37E780DFB735 Nonce = 1ADA31D5CF688221 Out = 6A870108859F679118F3E205E2A56A6826EF5A60A4102AC8D4770059FCB7C7BAE02F5CE004A6BFBBEA53014DD82107C0AA1C7CE11B7D78F2D50BD3602BBD25940560BB6A84289E0B38F5DD21D6EF6D7737E3EC0FB772DA2C71C2397762E5DBBBF449E3D1639CCBFA3E069C4D871ED6395B22AAF35C8DA6DE2DEC3D77880DA8E8 Key = C46EC1B18CE8A878725A37E780DFB7351F68ED2E194C79FBC6AEBEE1A667975D Nonce = 1ADA31D5CF688221 Out = 838751B42D8DDD8A3D77F48825A2BA752CF4047CB308A5978EF274973BE374C96AD848065871417B08F034E681FE46A93F7D5C61D1306614D4AAF257A7CFF08B16F2FDA170CC18A4B58A2667ED962774AF792A6E7F3C77992540711A7A136D7E8A2F8D3F93816709D45A3FA5F8CE72FDE15BE7B841ACBA3A2ABD557228D9FE4F [ChaCha(12)] # ChaCha(12) test vectors from # https://github.com/Yawning/sphincs256/blob/master/chacha/chacha_test.go Key = 80000000000000000000000000000000 Nonce = 0000000000000000 Out = 36CF0D56E9F7FBF287BC5460D95FBA94AA6CBF17D74E7C784DDCF7E0E882DDAE3B5A58243EF32B79A04575A8E2C2B73DC64A52AA15B9F88305A8F0CA0B5A1A25 Key = 0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C Nonce = 288FF65DC42B92F9 Out = 49FD8FBF19EDCF3A198F5226AA480B97D9F16BA71A693C4ECB90C276094585DFA4FA259E1EC34DE444C92879BFE7F641EEAC480168DC8969A9C033151B1E9229 [ChaCha(20)] Key = 00000000000000000000000000000000 Nonce = 0000000000000000 Out = 89670952608364FD00B2F90936F031C8E756E15DBA04B8493D00429259B20F46CC04F111246B6C2CE066BE3BFB32D9AA0FDDFBC12123D4B9E44F34DCA05A103F # From draft-agl-tls-chacha20poly1305-01 Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 0000000000000000 Out = 76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669 Key = 0000000000000000000000000000000000000000000000000000000000000001 Nonce = 0000000000000000 Out = 4540F05A9F1FB296D7736E7B208E3C96EB4FE1834688D2604F450952ED432D41BBE2A0B6EA7566D2A5D1E7E20D42AF2C53D792B1C43FEA817E9AD275 Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 0100000000000000 Out = EF3FDFD6C61578FBF5CF35BD3DD33B8009631634D21E42AC33960BD138E50D32111E4CAF237EE53CA8AD6426194A88545DDC497A0B466E7D6BBDB004 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 0001020304050607 Out = F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB # From draft-irtf-cfrg-chacha20-poly1305-03 # Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000002 Out = C2C64D378CD536374AE204B9EF933FCD1A8B2288B3DFA49672AB765B54EE27C78A970E0E955C14F3A88E741B97C286F75F8FC299E8148362FA198A39531BED6D # Long output tests generated by DJB ref impl Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000000 Out = 76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669B2EE65869F07E7BE5551387A98BA977C732D080DCB0F29A048E3656912C6533E32EE7AED29B721769CE64E43D57133B074D839D531ED1F28510AFB45ACE10A1F4B794D6F2D09A0E663266CE1AE7ED1081968A0758E718E997BD362C6B0C34634A9A0B35D012737681F7B5D0F281E3AFDE458BC1E73D2D313C9CF94C05FF3716240A248F21320A058D7B3566BD520DAAA3ED2BF0AC5B8B120FB852773C3639734B45C91A42DD4CB83F8840D2EEDB158131062AC3F1F2CF8FF6DCD1856E86A1E6C3167167EE5A688742B47C5ADFB59D4DF76FD1DB1E51EE03B1CA9F82ACA173EDB8B7293474EBE980F904D10C916442B4783A0E984860CB6C957B39C38ED8F51CFFAA68A4DE01025A39C504546B9DC1406A7EB28151E5150D7B204BAA719D4F091021217DB5CF1B5C84C4FA71A879610A1A695AC527C5B56774A6B8A21AAE88685868E094CF29EF4090AF7A90CC07E8817AA528763797D3C332B67CA4BC110642C2151EC47EE84CB8C42D85F10E2A8CB18C3B7335F26E8C39A12B1BCC1707177B76138732EEDAAB74DA1410FC055EA068C99E9260ACBE337CF5D3E00E5B3230FFEDB0B990787D0C70E0BFE4198EA6758DD5A61FB5FEC2DF981F31BEFE153F81D17161784DB1C8822D53CD1EE7DB532364828BDF404B040A8DCC522F3D3D99AEC4B8057EDB8500931A2C42D2F0C570847100B5754DAFC5FBDB894BBEF1A2DE1A07F8BA0C4B919301066EDBC056B7B481E7A0C46297BBB589D9DA5B675A6723E152E5E63A4CE034E9E83E58A013AF0E7352FB7908514E3B3D1040D0BB963B3954B636B5FD4BF6D0AADBAF8157D062ACB2418C176A475511B35C3F6218A5668EA5BC6F54B8782F8B340F00AC1BEBA5E62CD632A7CE7809C725608ACA5EFBF7C41F237643F06C0997207171DE867F9D697BF5EA6011ABCCE6C8CDB211394D2C02DD0FB60DB5A2C17AC3DC85878A90BED3809DBB96EAA5426FC8EAE0D2D65C42A479F088648BE2DC801D82A366FDDC0EF234263C0B6417D5F9DA41817B88D68E5E67195C5C1EE3095E821F22524B20BE41CEB590412E41DC648843FA9BFEC7A3DCF61AB0541573316D3FA8151629303FE9741562ED065DB4EBC0050EF558364AE81124A28F5C01313232FBC496DFD8A2568657B686D7214382A1A00903017DDA969878442BA5AFFF6613F553CBB233CE46D9AEE93A7876CF5E9E82912B18CADF0B34327B2E0427ECF66B7CEB7C0918DC47BDFF12A062ADF07133009CE7A5E5C917E0168306109B7CB49653A6D2CAEF005DE783A9A9BFE05381ED1348D94EC65886F9C0B619C52C5533800B16C836172B95182DBC5EEC042B89E22F11A085B739A3611CD8D836018C4FFF0B86C02ED662D2D2522647A1F09A7B2F9EEA56E7E20B1F06CCDD9CEC37E3B2D20812DF369978636C22646603675804104745D2997E28DF5D8242AAD19C8120CA4142FB6019FCCECF9FADB04ADE03B341E3FC77201B3DC957A8097AB2F615AFF142AB753811D5F32E75BC8825B456555F3D179FFABCF35F6AE61365851F3F681A2E86E8078B064976646186394CB9064767750DAD4E336B8F1D20FE2C13C6248D3D73D4D66D9C8587AC68A7976A3BBB8B5808320607400DBDB1918E3D3B90CFC38C4DDFADE990A213D208FBF7898334F4DEED7E5830FD266751315435AE19BB94F4D3DC92652F243DD1F96F3595AB473D2356D8FA8F6D64CC4F64B12CA99ECDD1962572E6ADD609D9C619AAB678B3FC298BC2F0F81FEB4F0D3EBAD7E850A8BCB52CA467E649DE2DB913BFDA001294C49DC369F7D14CC25C5FA65D4D5AF6A436D22BD2839BE23DD3C57825033FECDCE2DED6C511DBEAF4DF2B4CBB7AF8215BB48A550F57D02750E599298F512B1EC1829722FC10A5ACF9537E392A728455905D3AB4837DECE4B63FDFD5DD07A2B76A8C82566DF1A2167DAE5E125B6AA0E76B9D99CA84664F50EEEA54E449F0E587039137F57543D89205483141C933166B61990A706ACA07F467D22BC34C6552F5BBA91CB1FC21DB51D03DFFF6523A5E1B4285D54C47660EDA1B290E4087B30651B542305A714E98A8233577D2AFB383E402F6B9FD214B194C738886BD2289CC5F997951910994B0A6104092FBC9B385639343CF26C9FAF845E7A98CB1F2C9306E8200185D95DE059F83AD17C4B97F8C62CF6C347DC6EB5F2B1F4BF2DD328130D4500CA39BEBA2D4281A3D8CEB4CB1ECDE378B20029FB6A4C543312E41013915C57016E5DA681944CC277F9C7E75F4A654AB2E5DC646ADA242B6223AACC63674F9702146723360811ADBDF2BB938B595BF4C688A8A844130D9DA3F0EFE3650C2283640B342F8922FB6DD10B8BBE35C7AEBEBA416CB0180FB7D2B171149018F8D880463AC26202C2B72F9A7CF83A917AD26183F8E74CD418E3B63459F7AD59849EE43CAC6DF3BB63FCEEC1ABE8E9E0B64B233A43AAC54F9BA0998D2219B3BACA111940D524B7CF94677D6C557750FA4DB9E1077EEDB5BA6E33C104AE25443C86BF1583353ADDF6FDDD19A4FF491188E3D4878769611B36427C8F4C705CF42338475C3185C123919B79B3A4887243B924509C9A4E7A3FFF0517021E51642D9B4526C28A0CF86FB254BE7EAB18701CA5919B754EC2506ECCC087AC6141B4C3A661A3D1A89E0D4DD2DF52CAA5B3402D0026B3C643FA7126E8ED101A94188A048B34AB61E1182D6BE76E2E9E6ACF401443ED0D997DD5AE67346CB1E189791102900225E6B955CD7C9E39FC7255021045FE7ECD40E2C68486A4C2FBCDBC53E847790DAFE5B2CBDCA09BF09DE327076C79F2A339A9F942DFA372B41A390EABBBF296383D438466AE6105B5058117B8E406DCAA62A98AC624D30BC8773DE643CCE7578E8D5C57C5718711421E6D04A182F8714E192EDF3935CB2E0380E10C77AA6583832DEB64CB41DC401541504E0420D06379E4830F06125018DB3810A684C4E888B3B88829CF97EC67FC8549703F9EA5D6B8F67CE9E060F765532C323DB034EC700DB819936FBE6F749FD37CE927663F439498C98C5104D69AE9CD8B04444A471F95390873346858625420ED783203F8DB371D766586137459505525CB3EE59A7FD8AC3C1DB3F5F4E0DAB62B43D1C4CD813D998ED83637F922F884A7584835BCDC03E9F1802B449DFA2D249D9ED7F2F9129815CD8D4EC4169EC51EAC449DDFA5BC0F232D47323D4C48AB558576160103820D485877CC2BBAB641D21D94E67B32CEFB4E9CE5DAC84D03ED3228EA3CDDDD33F3915B9E21B435BBED927A539B556FFCDD4C9822FD1CE81ACCA79B6F7050B0C01A3A317F066A1A89C81E4DF8C7EE2E042203BE8C290CF8605C193471953F8FE6055AC546670A4A075F70909246C3E3B92B39CF2F35AB49FE6FDA67072A6E1B82364820477FD522A746EAC07E0398E873790486ABEBB50EC59A9E4129B7CEA87C5182EB43BCDF096EF740EF67482E98165A4EC64EBE9D57C8D8C16CEAA81F3203DFF26B3D5BF01EDC0B0458B6B47846C326C75A822FC8B42774A3B201EF941484631406CBBEAC961CCF42860EBAC578703B485844BB9E01B2D6C2DF72B62B43BADE982B0BDD0501230FC76B820D2F5BD259EC791B33225E06AFC2D996C90E756DBD4257D53EA6D6FF2371330035B57BF54C9DC4FA95D61536AAC11CDB08A664EFB55BC91A4C6F7FBE3EFA8C621FD9F2CB343898979E7BCBD55B55217143493B6DE415A85D681A2405113F3ADA3EDAEE6EB0E78572D2BAF9C43E3FC39B93081CF2FB3F8879E810F417B733927525ACB6D026F6EC46395620547D057A539A391DE7C6F4B7095911C2D3AE075AD4F2C0C96D9F70E48A42CDCDAE542BAE833EB4A976D4F98410B4A3D77857762D1527EC6714A040BAAEC3BEC41BF9CFF00E1CF81CE61E95D97792D7C0DB7A88545F10D9B0A5940457018817725DA257766906FFBC6172B9C4D2D32A14D00C0D1D01E15280074A4A9FD2D21393F078EF55B16CFEA5327993263BFFE8E99E56837B2763ABD221ED85D83F9187AF8B9E928F00DEFF423FFFDADB786E6678A59AF305CDC02546D0F8AB4681ACC1F00069B0C47BBC9F13D12FD9411F8DF532096D53E4B7861839E602FC5DFA0D0B72232DD81D2B0E4B660A7EBA353DA27E66CEAF2D6C7734925247281866A12D67752A1EDAADD1EA59E4E86E2E85A81A573CD68F6DFB526558D81A8F488F261F355DDAC23F6CAF07D27FDA71D8F3968D4CEEDA89A09DCFDD00C17FA6DB3658CC7AB02C0E5F44B1F526A7DB9269E4DCD1D11B8421C204C07A5DE46E48769579718C69532F1671E552B92EF1451FFBC7A2F412696C6D67EF071C988ACF61F39319CA02DC853247BE1F7F07B3BBD68C901EF36D46868F65D0FA1D1755EFF6C2802212908250207AB65FCE827F0A82F3140DDC692CB5742B3133C541E0FE17718B546AD1FC8CB8A3A5AF69A825A84343C378D7B54F917057A8D026D4A59931FF9E24AB95BCE2BEBDB3A4286E000A4C47E74CF82925DEA07686DD20DE228828705D90638661173E703E712D69B043DCEBAFDC53F132BE3D04CE50D70B80DD118DB00E45DFE953DB87525880BA9F7ABB0FC481A5F3ACFA363AA2153391AEF0DBF680512A0FA37A6C8293865CA95015DEDBF6A21992CE1FEB5F499359E288A3255EF3FBAEA5B01440BD787251CAF362326C7FFAD20086AA7FCF35E95BBF398DB75735E087E0863E016246703946C4E88BCA6FC21446146BD342AAE88AD4249F9A38CA3E4ED0A88AA6FD746F578E5B414CE0F2CE5EC76F87FA3B6321102EF7110B7E6D889B2B85BB11FCFD4AB2B3BD5F92B8A2F66166F0695C0B13F32F97EFAA0CDE4F28E1674BF120E03FA15980873A1C6AB674C085303FDD74832CC1DF5EF787AE11C6E6A9302C1488F36996C1703670786C05324F99D9D2CDA1624DB95B8EAB6F7E10AC5BC985D6536CF667307A577A2555888BD9302CFE704CF72E59FD28B6DAEA343A83531A10A732D65CE93F523A03E5E791EFD5AC502BB0A1F756E93208746240BC7BB1C085728CCC8150D8EA74B33AEBC59567E65B7E2BD83699F607412448D202D948BB111BADD456D68086FF9A5906EA3B2CDA4111D3638391F7A7B153EEA77AB47215D6FE13B350F59F884C6E31AC087239D9145B816424CBA2C8BCB7B3ED7E19638089D91E5C9136D2AEFC8DA165284B42229A70346296A7484648DAAFB9B88994D8823EFBCE9E029ACE51706FC1E6E194B7D8906BB83BE681A96D50F4A66F5AF24AFF5007AA2052277D75E1C6FCB719AE789587E73BFB11029B2AE9E380CD7B4FBD78F0C5318EF61802ECBFE5D91BA28184E96963366BE3D5B063B5B664002AB0682E5820E3F9D30AFD461B3046CFC86F29605458AE94054CC2967CA77F102F97BAE3454BC190726AF88CFFD5F0F05E18D31159EF2A9D9800F48D1B6719617474F1B3594315795822976613CB63A4D6996505F4A4C57F3454EC101F5303F5B84AA8236843FC51D63D8445AD5C9B4F4E15AA0395695CDE980A6D48936146C519FB84AB775647E2CF809135D10B12F7E632654C679F92988B79021746C867A8E05102BB98F8FE7D3D7C005F690D9CA7C6A175FF26ED82B873D63DF4CBEA0218BAD0CB9A8C4404526F9806E2D4FBF37E84B756561C67C3A5732966DC4F0701063EAA7D3A52A2B5E4A8C9ACDB30EE8B9F5125F76BCF7B22DB897DE9A8A9560C54118F31DCCF49E87527D188FCB8 # Test seek offset # Tests got from the original implementation of Daniel J. Bernstein # Seek = 0 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 103AF111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED Seek = 1 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 3AF111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89 Seek = 2 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = F111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB Seek = 3 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 11C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08 Seek = 4 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB0800 Seek = 5 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 8B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB080029 Seek = 6 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917 Seek = 7 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 9D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A5 Seek = 8 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540 Seek = 9 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7 Seek = 10 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 8FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B783 Seek = 11 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = B07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833F Seek = 12 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 7D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3 Seek = 13 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF398 Seek = 14 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D Seek = 15 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 9A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E Seek = 16 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63 Seek = 17 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C9 Seek = 18 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970 Seek = 19 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2 Seek = 20 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E7 Seek = 21 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 92F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E751 Seek = 22 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174 Seek = 23 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174AD Seek = 24 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9 Seek = 25 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6 Seek = 26 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 9A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E697 Seek = 27 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972F Seek = 28 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = D47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC5 Seek = 29 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 7A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575 Seek = 30 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0 Seek = 31 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A6 Seek = 32 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = D5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63C Seek = 33 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC Seek = 34 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC80 Seek = 35 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802C Seek = 36 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 8DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3 Seek = 37 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = D52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E6 Seek = 38 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 2C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61E Seek = 39 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB1 Seek = 40 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 8BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198 Seek = 41 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = EF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB19837 Seek = 42 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB1983732 Seek = 43 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276 Seek = 44 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D8 Seek = 45 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 2B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865 Seek = 46 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D86594 Seek = 47 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 47040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F Seek = 48 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F23 Seek = 49 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 0FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E Seek = 50 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = A3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84 Seek = 51 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A9 Seek = 52 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 1300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974 Seek = 53 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 00B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD Seek = 54 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28 Seek = 55 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B8 Seek = 56 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 93150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B Seek = 57 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12 Seek = 58 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 0A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8 Seek = 59 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D9 Seek = 60 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907 Seek = 61 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 0D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D90790 Seek = 62 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F Seek = 63 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = ED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9E Seek = 64 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = 89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9ED6 Seek = 65 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9ED679 Seek = 4294967232 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Nonce = 000102030405060708090A0B Out = DBF81BB406517BE1A54F4740E5DDDF2B7965747B757FA9D5B7EDD6B27FEDDB89D5D47F9B24E57DF393017A5079F61852CD8B86859884120AF867D25D3B259E2B botan-2.4.0/src/tests/data/stream/ctr.vec000066400000000000000000015467141322470703100202650ustar00rootroot00000000000000[CTR-BE(DES)] Key = 0123456789ABCDEF Nonce = 1234567890ABCDEF In = 4E6F77206973207468652074696D6520666F7220616C6C20 Out = F3096249C7F46E51163A8CA0FFC94C27FA2F80F480B86F75 Key = A67ABE525A0E5AB2 Nonce = 727BECDE9FCEA20A In = 11919B328564DA68D9F4216AE1B4FA7C46AFC7AD5BB867DF1834D77A3023ECAB940725AB Out = F40235A0B8B2EC0B53F3C0D8799497463638AD0CC3E07F0E8B8B0DC7605AE6AEAFBA2A88 Key = CDB366CCD621D62B Nonce = 1ACAAC3F760C674B In = 168A502D21D71F3BEB702BBF02D3F6D04B72EFF2F19EF01D217CC7AA739A67466AF3B14E Out = 3A73770D157C23EF8913D874CD92DD36C465679B2BC691DAA0DC6CD4591C4CA44D5D69D8 Key = EF510AA740BE98CB Nonce = 74E74E01E5C72084 In = 24889A268E11AEF80852C4FC4893DBEBDF4CB06115FD533650CA39A639C659F47C3D5556 Out = 782B24067A2C5D61BF6ED2E980F6BB16A0A6E0B5639B4208AE273C0BDC0311D65464F217 Key = E8CBB756DE4FDEB0 Nonce = AEE751205CABA9BE In = 3078866926F75D18239A3DA92EC9EB88D18393440B47D46A49D003F2C3B5D51C1CFE3FF4 Out = DE4D9632BE88235D717B36DE4C67B81CF3331E8925726CAD1BCC05126B87A6CD5D5DE3B6 Key = B050B286E47C6E6A Nonce = 701F72AE37D31F2B In = 4602C97A25AFB1746DE8BC1A65AE0B635ADDAB9547A99421AD86AFB087997ABC1458F0CC Out = 754BD27902EE4248BEEE65D2BB035C9139F98735C85603BA9565EDAADE37A7FE29833DD9 Key = 445A14B76AFEFBC0 Nonce = EE2DD8860B75788A In = E344E0C2E45990C451C75BF74406821B99D4EA5F56F67BB2F9B0EA52FF5D1BB25D82A181 Out = 1A23AD101A776F902B8DB40E273A1F5EAE8AA1E43CBA52546F2EC50EF32960BDD05101D3 Key = 4B1B62B9D6B8F54F Nonce = 036CC5145BCE2A01 In = 2C3A117378B8DB1287CE8FE084EAA08EFCEB253DD4A92509EAD154E6AE483E25D2B790B5 Out = 75235CB3E2BF7DD3ED893DA93AE25D7A34D43521DB620E2BC9072159357010E6D81E5884 Key = 2E0F06AE7B1C30D7 Nonce = 05E144D6DB9E7939 In = FBC7E48930ADF4A36DE18CABDE25ACDAC8F9AB727E3AA69FE8EC6F965C6E14EBE9AE437D Out = B271913A8A58ADDF3C89132A15DF1263B63018CC8EE6763E6FCFB4DD5D4AA8EC4B3E2D78 Key = E6E85EABE538195C Nonce = B86615CDA5C9E9A2 In = 940C3FE78C56A0F922FBEDE7ADE31914C993BB84F5BC1557E5F8004CB75D7D339801FBBF Out = 9615A71536135E50946A8517E72A980CBB2378A3286F08E76E85E5FB62140C9B3720C7C4 Key = 9985CE7E0D79CFEF Nonce = 25D1D57C3A6936F9 In = 256ABA748AE0005A5F99F1C96F8A197E3867B8455A4D6BFD6795BBDB89062B222E6B0DD7 Out = 2A6B043F07ACD99141C7AC616B7F89AB7E52174A41AFC1FD0C56BC77B9C2EC9CEC87A0A6 Key = 47550AB0F346ECB0 Nonce = 1C42F4559385E11B In = 44AC3E1333DE5CD00475317CBAD26AB4A812180DAA7405556C41335572F5A236C37CD36F Out = 155E5B86FC06AD433DAEFA05C329BC1407966220BA91EAC2FD32B35C5AD973D94A0B8792 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 9DEDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = EDE3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 0 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 9DEDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = EDE3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 1 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = EDC376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = E3E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 2 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = C376CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = E69EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 3 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 76CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 9EE5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 4 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = CFD97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = E5B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 5 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = D97AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = B55AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 6 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 7AE823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 5AC758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 7 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = E823AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = C758EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 8 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 23AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 58EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 9 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = AB2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = EB39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 10 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 2E0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 39E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 11 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 0CB0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = E70E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 12 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = B0072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 0E6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 13 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 072DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 6533CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 14 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 2DF26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 33CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 15 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = F26DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = CC4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 16 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 6DAADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 4D89C148F6AD68293E743CD82B9638F020EE589D Seek = 17 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = AADC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 89C148F6AD68293E743CD82B9638F020EE589D Seek = 18 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = DC4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = C148F6AD68293E743CD82B9638F020EE589D Seek = 19 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 4FD9316C7E8F4F796026DA9ECB8ED69DCD Out = 48F6AD68293E743CD82B9638F020EE589D Seek = 20 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = D9316C7E8F4F796026DA9ECB8ED69DCD Out = F6AD68293E743CD82B9638F020EE589D Seek = 21 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 316C7E8F4F796026DA9ECB8ED69DCD Out = AD68293E743CD82B9638F020EE589D Seek = 22 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 6C7E8F4F796026DA9ECB8ED69DCD Out = 68293E743CD82B9638F020EE589D Seek = 23 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 7E8F4F796026DA9ECB8ED69DCD Out = 293E743CD82B9638F020EE589D Seek = 24 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 8F4F796026DA9ECB8ED69DCD Out = 3E743CD82B9638F020EE589D Seek = 25 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 4F796026DA9ECB8ED69DCD Out = 743CD82B9638F020EE589D Seek = 26 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 796026DA9ECB8ED69DCD Out = 3CD82B9638F020EE589D Seek = 27 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 6026DA9ECB8ED69DCD Out = D82B9638F020EE589D Seek = 28 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 26DA9ECB8ED69DCD Out = 2B9638F020EE589D Seek = 29 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = DA9ECB8ED69DCD Out = 9638F020EE589D Seek = 30 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 9ECB8ED69DCD Out = 38F020EE589D Seek = 31 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = CB8ED69DCD Out = F020EE589D Seek = 32 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 8ED69DCD Out = 20EE589D Seek = 33 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = D69DCD Out = EE589D Seek = 34 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = 9DCD Out = 589D Seek = 35 Key = 098EFEE0D594C332 Nonce = 88D9C46E992B27AE In = CD Out = 9D [CTR-BE(AES-128,4)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 8AF2860142F786F409307C1A3F7EAAAC597D5761063D8BAD232CB0136888AABB90B8CF63F44412CEEE802A522AB6566313C5E10652749056AD2F02CE3BBF5BEC [CTR-BE(AES-128,5)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 8AF2860142F786F409307C1A3F7EAAACE0828A20E49595A19191201820125CC1B976913097C4A3245CAB186AE3B581F173DFEE01730EBB880CB63C673CBD4FC1 [CTR-BE(AES-128,6)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 8AF2860142F786F409307C1A3F7EAAAC33E25A114853DFEA903DB7B182593CB439E12B65EBFE27B2C1557F1EAD7AB52F0D42E2BB9772747085DD8C2AF5F357BB [CTR-BE(AES-128,8)] # Generated by PyCrypto Key = 00000000000000000000000000000000 Nonce = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Out = 3f5b8cc9ea855a0afa7347d23e8d664ef807c3e7985fe0f5a50e2cdb25c5109edffafbc01de59440e1b410bd993463a03fbdec0cdb5311b5a73338d5abe70962e7d5dcb02ce42e8a8983e0a724d3827cdbe272ccdcd0db452a5df56ea930333d8991a8d562db15034a6ea17eccc662a98a1b2730dfbd805b5fd9b41d7ab7873cd829a2c9044d239c3e26f5a71722f9aca18d7b7c75080839dcf90a7702254439fac0456e662b4ad8b04e657015c6cc16745108185b597b8e1ae00d89899800b2f3995840ea9f7ed2531230da0610bbe46f9c3e68707cd6a0eed749d85734c65a93ca4f99a33cfadb694600d01810e31f73e6cbb39bb5da783568c91f24bd07c1fb5fa2ac5e662ed2a60a8f57766a4de843da20cf31333546bc455bb5e0451821bba771293442a8ad1a1aed2df0b24c9b4c95b6e3b1c10b3aacb71523c4ed53b8a63f3a13c99fc8f96cbef516f0f4d16d8f08171177e740960d8aa95b32b8ba01ed494e8b8c6bbb6c715c7c3c961e61e9574fe384f894e89ef6cca3d9570d3045006dcf21dcb66cdb99250bcdc92779e860f2ea0a4deb0bf42b335bd996c6f2eac5d6163b381aca25096da8044d48fa468310f2d74d3ca3fc0cdcf622d256ca2c216ce73f320ade801be0533618f53593153f3056a46051bf97617a8550714eb6d3afe6b72cace7a531d32c6704cd87f2516df0af87f2b054901c8e1bdb31e961 [CTR-BE(AES-128)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 874D6191B620E3261BEF6864990DB6CE9806F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = EC8CDF7398607CB0F2D21675EA9EA1E4362B7C3C6773516318A077D7FC5073AE6A2CC3787889374FBEB4C81B17BA6C44E89C399FF0F198C6D40A31DB156CABFE Seek = 0 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = AE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 9806F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 1 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 06F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 2 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 3 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 6B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 4 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 1E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 5 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 70FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 6 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 7 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 8 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 9 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = B76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 17187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 10 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 6FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 11 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = AC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 7BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 12 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = B9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 13 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 14 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 15 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 16 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 17 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = E4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 18 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 1C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 19 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 20 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = DBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 21 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 5CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = D5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 22 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = E411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 23 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 11E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 5E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 24 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 25 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 26 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = C1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 27 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 28 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 1A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 0DB03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 29 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = B03EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 30 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 3EAB1E031DDA2FBE03D1792170A0F3009CEE Seek = 31 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = EFF69F2445DF4F9B17AD2B417BE66C3710 Out = AB1E031DDA2FBE03D1792170A0F3009CEE Seek = 32 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = F69F2445DF4F9B17AD2B417BE66C3710 Out = 1E031DDA2FBE03D1792170A0F3009CEE Seek = 33 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 9F2445DF4F9B17AD2B417BE66C3710 Out = 031DDA2FBE03D1792170A0F3009CEE Seek = 34 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 2445DF4F9B17AD2B417BE66C3710 Out = 1DDA2FBE03D1792170A0F3009CEE Seek = 35 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 45DF4F9B17AD2B417BE66C3710 Out = DA2FBE03D1792170A0F3009CEE Seek = 36 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = DF4F9B17AD2B417BE66C3710 Out = 2FBE03D1792170A0F3009CEE Seek = 37 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 4F9B17AD2B417BE66C3710 Out = BE03D1792170A0F3009CEE Seek = 38 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 9B17AD2B417BE66C3710 Out = 03D1792170A0F3009CEE Seek = 39 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 17AD2B417BE66C3710 Out = D1792170A0F3009CEE Seek = 40 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = AD2B417BE66C3710 Out = 792170A0F3009CEE Seek = 41 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 2B417BE66C3710 Out = 2170A0F3009CEE Seek = 42 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 417BE66C3710 Out = 70A0F3009CEE Seek = 43 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 7BE66C3710 Out = A0F3009CEE Seek = 44 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = E66C3710 Out = F3009CEE Seek = 45 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 6C3710 Out = 009CEE Seek = 46 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 3710 Out = 9CEE Seek = 47 Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF In = 10 Out = EE Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710006BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = ECE71ECD7A4E3C2F643B2B0BFBED32F31C8551B6306D52CF843EC0B85015DC203B1C0B643E2A6BABAF5133DA0EA06616076AA6BBB52ED75DC3A71A9A6E8AC7C9A00D2C39AA68BF4E6FFED9AAEE5AD6914FB3EA77C7B61FF6BF564F2F1225ACB4B5889CB1559888A5817849C382E168482F75381F63868C468E4D1583B1FE71DD808CB94D8150AAB9D530A0FC17CDE748E95545D8A033B2F61F1954D0C0226168022E1CD7E031C57D048AC560F152960F47705E174D956D4BB53AE80BFFCD1BD569ED8EFFA223C00558B702405F33E6E0EDB2D9B0C148A1441CC80D6ABBCE785AA1B9DAB7CB8832F1B12D2EE60EE2DFCA37942CA1724E5602B7B70525AC9662028A22DB234676615DB474538CBC8D197F38C88BCC4F9E8D207538CA18DE5F095420A2E4D5868CEBB8B34A9377DC52D119790B65210F1B346F5E00D9BD00A8847048913D80726B9B745D565E6284B986DBAEA997FFC5A0DE5051527D44B2C1266DBC9130A6EB15F37A0F00B6286D6678CA651C07743BD37F2E8F6A94F5ED8C63428AE4883A9695183807E104BC335C64FEAAC40A605913DF98FF44E0801B31A968CCE5DCAFADE1E017FA711E05FF5A54BFA1999C2C463F97A3A66B30211BD306C8911C98F8EE5EF47A54746A4D16B7C7424A6954B4FC3BCF1A41BDE8A19CE1027AE86A320D0E5E7D3C7E50CFD0C4665B811D86C313F09ADE5B4DBE017231859881E5873E9EDB2011CF5920D2F7277C4DE1AC430A1849F0B870A69ABE701B6D0B5123E5FF53395409177CF84BF41EC33C5E4BCC2CF29258DC7C260471AABDA49FDE62915758EE4E578D0F7698E6456BC144573739D5D508CC76B389359D2A0ECB5B7EE5FCB4C3151D5AF7C71819EA3DD5F36C7B27E551FD2373D07FFDC76A13FC4B10A6F29A83D6F465ACB6960671EACF21A3E1CB4411C4DAA0C2A87DAED28AEE60B7EC0258A9AF125F2DDC80B9877EFE0F372D9B832C786770A84EA1A07CB6E1A9907D651BBD0EFDEF2AFFC3 Key = FDCD25C05C5D2EEC19F325924BF2F7AB Nonce = D3BFFE7D9A480362532B542007577EC6 In = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = 900BF2352D973046F4128A1489F84DB204C552D2E59FFD58844B2BEA8DC04B46B1212433EA1D3704673C45222C77D3D7CF7D21199BCC1464393853EA9FE5976DD8612F828173D82EAB52C10A863FA549911F9B4CD0644766BDE8412F0458C620EB63CD699CFFAEB948BBE360FDC541F0912B683B72A13306E0203F444E378458164F461290E3F934DA40540945D8FB455EB86271F4D55DEBF1CEDEEA08B7917C2247B1261C3710D949B678CDD4D5DE857A2BCD4751F2D4C49C75D52B33A0B761943CF6258DB7C13C321F2E3C43C680CADA039E3F177B88C993464EBE82732229784D929235FB7E4984F1DBC72A2E0431E7BD976A2CE09931DF2C80B7B7405E8DAEF482E4AC7A0E33C52EBAD9C4F854A061B047F37CF70571FACB6D2CFE6EC0CC64933965D74B871150214A009E998BB078E8799E1B43232F9709F1E5602D2DA4D9725D2EA8557374809285A1B48D489FF3A8A50CDA1E0920035E6924272FA1942022D71C9984278B4112253349D916B17FCB93A59FBC2641EEF4DFAD6FB83AECD25A6F55F06A95CEBA94557EE07220C51D0DE32969D70DF310B8DB0E7C8B65F95BB7B14098575CAA8EE472726FF5C87E31E94664FF009793D3230A528E9FE2893210E01870D0B60B1C55A6C49079BC3D97EBA815ECB8DE148A000C310DC372C6F0627EBB1F0CBDB36A79A9DDADACD157B561EFD24FD523067AD3E1DF7370DD7819347C5FCDD7296BD9DD9D940C7956CB8A4ABA3359538474E81613E4BEB346B74F05C66BC19594C12920CBFC145ADEBBC0511E710A490708B6DF67D8F5C5A3A809C9C256CD3A4056019E04C27D773A08BFFF86C6F5E9663DE4369AA4612EA26553F5DF2314A8FDFCA42B897B5EEE64FFBB16F67BB1BFB1E5408C850848978645087CDF026C9D8CB24494E42867D5010B66DE211C5E10F92D6E88784E9F423958D0E50E6F153FC9D7B07894D5888B3CD0AEAEA0ADDC058083E84EBE2CA55E491679BB9476674E8B2D01E17AB60DB86CFFE48AD3C171F427EB57247A5E34970EEE3A4FD9D9FBE9C5F39D326D6FFA45398F822532B8620337EC1846184BB684478EA59D803BFF5F55B4B15F3DEAA58FFB550AC480876DBB16C0FB72E0C224D2FA47BE2A33736208E9DC38EE0E5D050596D692718D9CD90DE7CF9203A6D1FFCD5F09AF6BAD40F006313C7916AFAB0D09220B9F6C7E020EC12D4982A809193EE65DB7EC04B94F580DDF15D6349279FEB9679FC9083ECD1FB1D9B58E2F81D07E586573AF0C61BAFC811BA0D15186F408760314724742143B1A01AA0038EE1BF4DBAF4E85CCD3412B4F17629F069E6F4F24CFB28B4DAC1B7ADF3F2AB621B62D4239C8425B93CB597D2C91FD9F4E3FFC6DD70CCFDF5CD8F42E29344B6D1ECFA073C853D7EB1FCB34EFF9111D90557E15B438D8AEED879991167D04BDFFD42014BD12631AD879A98BA029DF7441C7242F0FFC0EF25E36391EF4D151BE45C6D6DD10B5C591AA039507BF3513BFB36BAC155564B9CA65DB8B2EB74E10C7371090C1DCB54B65F9427E830CF1EC7B43FDD5E7AF72C8FDF19B709A41F9458A1A69D8FE8332442F5D1326597B429D065F17005C90DCBA83833369AA2F8CFE860C7B25269049425B1AAAEEBF873D32246A4EDDE5C42D88DDB5EA5DA95BF7DB2B97B3C37F4593D4F8BDDD2EDA804337307E6C68952FD7FC0A55E2673C08F028522CBF7000CDA1E33523AB0C607CB8361E95CBEB06025636D94E945CA9E911FEA1CB37728F76D2BF776875181EABEFD2841EA068EEAD02A945AA68FB64ECAC7EBFFA9EF739D534B7BC06F9B57ECE9CB9CB8D7977128567293C51E79A8126669925214AB99577019512A72A537429CF5B10FE5B39AA2566AFA490C6FA42916D414173BFAEE8BAA851A73D6E55D0A48A9F47BFE67EC5D27BCE42D7DE7BF52DCE4ACBED91C5E52414D09C8119A3270709EFDF1AC93598EE5D3FD58436465C65C10FBC7E5E830B9E0131D0A406777FC79362F660F8D9D173499326D8D87B1A64952688D72C83ABBC5528A78F57E38E54FF82CF826878D73F7F374284181D467CBC0C1CB980BC3CD3179542663B35EBDCFC45F2810A2CD83F3E8EEE11C7550C3F105153886FD0228C4368DF22B3483905C4EB8CB841626CBDB46010FF6FAD1783D518E9030E0D01C1A284709E56CBB29B18E269BF32CB310AF67FDE673AAAB9D5D05FF067650E9C2320BD294AF308F97547FA907561C6759957E19727BCB6AA81B0668AA891B524A44A9747188806005F497B0F06C8F29277F0532CE48306CB2AB1F4AC69189E48E958CDB252BEAC88343FD10F61D1BF2DCD2347407C4F449738D29FDB3C40BCE2381154DB9B3CB1241BC1E682EF2C7845ADEDBACE1DE98218F967C058CD6861CD66FAF98AD2BFE088DB945EFA1A5EC31C63F4AF18A7E26DAB81333B2D1D1B64ADB0F0B628941712AC56D651AAE05C5D4C5ACB7FA3AC16A1A3D22395B76371ACC9D4CC047259B1BD1659AB6987E4CBB363B2E2378D5CCB15C41ABE14B65B920F58356653E0240181B2192107884699352634712003815BEB662F3D31F1EE213E43637738F9DBDDA96524CBB76FF388C93CF540968D41CD79D6F575B47E8A4C8576A34D864FCF15DE44929682C7024F5B96250449649697EE056F1FDA1A0D35953F03E88DC3B35913024218DF877B75BECE027A2A7EF7C76BD650E0586D404934E344B8C7376A601998294C196D0D221CCBB59AE05F7DED4E355B3FAF1D0C51DAA055F925440C272D41911D83AABEB3638316F1AFBF7BFFDAD1E800F296323AA33A7853644CEBF3733BA2748DE7D37B9AF8A5A4C05B74211B359B0E6B518B10A012B4F7188865AFDBAC2CE1D53B9F3E8F7F80BA15D11CF2967C42662FC4177D2E3C00D3DDCF581B8FF5E6544F312AC52D93B7A0789C2DFB187E10EDEAB3BA6E74B9B685F1FC924974A4D0302C89C6709CFDAFDD6B235AE0326D8E22D164390620DB012B85A81560896F2C085307D07F3470887541EB5ED2065261C87ACA522E83C2CA77D9A9751DF6DE35EDF82E04F55CC9A50F5646254EFF10612AE8B5010B4F1886262666B997005F452CDDAD9E7FA8185F64B601171879FDDE907F8C35F8F100B942FADC0D9F4FD734B462866E42CFDDE56DE0539EF8F71F0AA72DCD8DAC6BB031B89C8F0A88C051C5E4E28EA5E95A925A88611EFD7EBEBE524F60A9EA32A41FE34777091D401429EE7F185EE61DA6486CE491F09A97062BE1A357DF998775143C7D1FF33A1EA9041241495473661FDF3E908AC9F5811FF83EFD6E331FF17097109FC66220B989428D078263FF696CA376663888819F3AC66F0BEBDC5EE5BD48C347C124FF427A47C80B92761A90664BABFAAC275A3069B13890B79E9513A935823FB60823D6C76A9F88DCE6A7C1F11E3DA5068F454AA317FCF92C4BDFF500A2BEA63BB7D4939F4440AE335C1E165769C5D041B31873BECA28648D44DB6628FCC0705B5E4CC838C1DC8022D9B890FCD54CBA42B372610E9CE351E5FDFBE46621768A30CF70969FCB37C484B2595B5291FE7E8B597DE9986271AFCD2DEE3029DADD330FD5EB38D7BB5276423DEBF31DFE3BB97E36D09FC62823060A0D2636CAB111C7C9D27DE3D2436996F6CBCDADA9BF7AD9B4EFF7EED2459DAAEE42AF414BDB2C7995003B2DF8474EA76BF08870317EB29AC6B46D19DFB471A8FD58EEFD58BD4436C30E4A695A30B83E53854AB12D4F0CB6290385570484CD78128782C55783E73DEDD0EF8330690D2CCC67A6C3A5C0E5824A4C68ED1E9DE7C047C3A27D838677EC1CA64EA21D7F51BA404CDB61F09CE2F3CAE82E68BEF8EB0BFB6F51F1D711E68BC7000C57170BCE6E6CB583CDD384B031552B471DA6E4AEDFC6E696EEA1D4E48CEAC08202D8C0626D957C1BA8D367C647C95BEC5C97448F0B0DED70E3DE200ECDBC2E2BF76600E838C2D52DC2799C55ACD450C5C33089485F65219B57A09756792353A80184B1FEBF9F40E7C31150C35BC9ACC208693A30594CEB60FE53D4EF4852AECEF9CD128A0DAC72A323396AE9DF8406223E554CDC0D3DD2EC641FB19094239D186BBCBCDB685A5ECA4945C0FA7B2F0CF0D42ABA7F5983D5B765168197B0556A235AC452CC42D59BB9F27D186E1640E447AA00E3005CF5FA24BC7CD4873CFB2AA4B47528F9813E1881FECB1C072288D8CFA45E2D0C52F17C49E7D73040ED49F0E71B427189A9A038D6F7039B7872A41E2C55E6A95834E9BECE5C70C18F89E270A2D24286EF6C027DEAC450A852804BCFBA92DFD52E7900F7F3E4A957AA4D594390CD47ED3072961B5D024AA9EFE854E692D64F3CC3123EA52F49A6F61D2316A5A17374EC9FF6F043076C07D597942D25BB0BA1BD71E971C42AA5CE9BB17511342A3EB35C6DCAF8DC36F762F8B1856E5E7BF492B8A6FA8F1D8AE461515462871B255966F0F5BAA52E73CAAC894C2CB56320155D4E5DBCFA84A0FEE3082D92EBEA98808406E736BE2EC8F41BBE90F07919682183DBB287D7004D2C2622C4FAFCAFA19A766DA033DA12E4BDF7855A08759C9FC6CA0F61B6CF96C492CA8CC168B3CBF7F587B53A7EF630B5374690000D9E7B84C3AE7832F4BBDC1943378F83007660DC83CB4F05E7A93BC6EA39EAF13CAB2E61C852A60A343247CDCBFD757B2475399051924A93731400EB91791C5E2DA5D03F43A39CCA44F3124DEC80D433AFBACE19660D0D32BEC383C1567549C112CA8055D3A1A7811A7F4F036AAE719762F98A3BD8CF5FB2D9673BC163ECCCC72328F13B03CC3C249C7AFA4041C0DC76E9A8094462CB41E9711A6F5E50E5D5473143F1E9AEE421D6FD88FAC95BCD75E46E25D2588F7E3D7489DEE5E7AFE73AB038D4C845A92B1C0C399B698F8E532AAC023CD1489B986BE46B7DA2A4B76AA76DF5F7FE1F66C282AB30ACEF5A7FD59B71AE64DF858D0E0425089290913B3C4CC82DF6219DE24ABC8703ED475D8373402EF46526416F2ED77AFC236C4F3EA0DAA5AD9AB949B024F340C6F1505B399FA703B6464C0098FAB1A3DEDAB5BE68C2FD030DEF738CD027FAE6CD4B03A2354D20ACE3F69BEDBB90A5FFC390BFD90D53695CDC136B85FA6B9649CB4841C43D5C9F649E32C410419B5EADF4D26AC0D36006D3CF4677FDD2FBFAAE156F2DA1587FFE4CEA0392AE804420E2FFED43935135F441CE90B7077D8E0B0F77706AAC6A9E23DCFE15F5635A0A1E1A315D8AE0489BA6DD88A1C8EB29BEC076F2E95627CD12FF4D6784FEF2DBA9F5BAC6F1895E5F15AE2E51A1D65B7835CCCA3B2AC7D4AFB05E00D210519F932D184340625647DE20BFB32329C238AC096CA68E159F90CEA319683F1C0D9DE2380438BB4E6DCFD358AA655D0F78C9E93B23C0F1BF13C128587E65B23C7B87350F1A5B8C37B5BB5971F4A160C9A7FC3E920F050353739B4C2523F1F628E8B4988047EC59E13F120CC557E14EF259CB15BEBE470008D1C0BAB2B6B50AA6FA379488B3553979BE4841441F971299C46BCEB73BCFF4ABE0B2B003C7E5C110FDA68D63D264F95D5E9C194B4B869F420EB9B93531396512AFBB6FED334FDBFC972E9BA42F3E3D774A7C6F1685DC8805DA4E10A150D90E79828A600F242BC2B7FC2EE22BE0EA362D687E6B2E4191C268EAB6189F58968CACA413F2E6D1A413E37AC4E93E8A7C3E13D992D09E7025D48E21F658F54B2354A1182F1203C21F05831B7B83308DC2A8F6F2E3C97592B252E66CDF43529068D9DC78465F66CA6B29AAD0C3922947EA98CCE6630EB581FB75F421D59E36DE1F4BE9D7BEEA0C75218C574FB70E5927162DF36AA1DDAE51428092B8A733C8D65E884FA48B6A4A6F2D386883D3BE615EEC10B3488DE1D54908AFDBDA76CC54BC71A7131DA141ECFBBFAECA0C193B83E8DE2ABCDA150629D8BD1706D16E4B2BBA4FB95A4DBD1B2E73071682B7B38142699C998631B31F53DE66B0C3AF8C799FE21E617F49EACCBAD64B76EAA4A21E7ECDCA1114B1C64C2B2A71B5BC764EC880E866AF3EC6E3801213341C998D0F00B9AD7B7DEEF21C0033247DCE567FECF294B16DDDC3346725677442A6F6FEC62627521EFACD02E16123623ECDF970493B9C8B9E10156A9B2439F03096B17093E5DAC3C9048EAF05CE92B8C2FB2B671AB886E5988288914B5A8DAB05909181A5F9142EC46D5FA71816CD944642D0568520EB87A4307FB4B608D4EAC1EBE88DD52F6549895F732CB75D495F5F2325D2B0FFFE0FB702045188BA98D603E546F09F44BB40804F4670BA22F9D188F986F00FC2BE3BC29E0D387985F564599DB2B0F9149BBA7225F00D6316455E2713E43E173A9418C5C4EAF5D3CF2CA4FDA77DE466ADAB5BF8A2FE395E9DCCDF040ACD903F13F1807817251B4844B12F7723627E3B66211258BAC1F45B26AF3303D1BB55241BB4EE3EB9F00050AA44DE7A81AE5501EC7ABF1A1692F3CE17267A1A83E6B870777C6249780B655008FF69C6EF3A32AACC1E4A8CD2CD50115EABE08E4A085AD93351DA04E5AC71C5FB74FAD7864324C070765C32ADF07071632767C5D0612B4B9407EBFC3141D6D8B202DFE164CB8F7112E3AE5176AA55779441B1352CF4838395A65ED5261FCD8C596CBA3684A56DC2FD5E440CACB2033C945E65EB9EC0E475A7CB3E67C8D5F627F506F6CB1D5A1F26F75A395056A1D8D70420B13F63834201AAEA6C11CC6E55BDE40A0ACC75255D06C5921A85D621B1C32434AE8CDA7925BED56718BA59CEE88896139381809548A0AF81502DB88439A48999A3B40C6FA62EBFBBB1DCB03409C73CECC4509BC4F2D45E7382D4AB7F69386FBE6377876D0D30D5F4DCC6BA7330987B48C9772410942B114D6F0D46AE5F3FDDA09618BCD78F0D9972DDD71DAC9801CDEB80676BBB32315888E008DA9471855C2B299927FFA73EB7A4754A2F9A80500629959830BC3141A6A3FCF3F529DAF588B0C415A6D237145BC3475724072D543D78F69E1F153086ADC5E28B420A3B1B81E139CE9B81F532FF557DC23BDE406373B10F5C03E2308C9F51D5E0150D6128A1BF82FFE1069849CDF84FDE7E3DF994608C5E0B2420889408D8DEF8DFACF31B539D3429470785FEA4E5480AA0C93B5C8225901F3177DB948DE7352882A9915B8D2332A85F16A4D1CB55EEF211E3190FB718D1D302A171EB57C234A5B1E5A6A297E7AE4BC65752ECAA27412D2A6835BC69229E7593A23EB1224E97419BA6A17BD77F9FDBE30BE2BCCF0BEACE22576C0570DBE4FC885192C11998620066D8CD92DAFD200B3D483FB825523F490CA75971D066647A8855436084B047C78D6581C1FBA6276B0A7729668B3B0D7D358FFB92332C57436F2F59873A1CDD128AD11341B5F256251B61C90C365D5F0768F441562B3FCD9E27A71306B7C940983560461889455560D32532DCF45E9DEE3E2B3C5514E249344B4DDF105774935D5AAD836B04B5E979E61E3ED7909A8384CB0C866352E7A1C7068B7368BEC60EAFB4A081E553F51B09C4CE8664964F64A4031CF8934382C0EBA040C0F0B2D3C1F5F3ABC3D30785E53F5F081248CC7A6A3664BAD836C1E6CCC91BA1B037B4F0F2C43AEAF9F749268D47E11F7188BC7264960AE26DB142C9801D084E0B691648AE83E85AD51A0A17081F978A434C82F6572AE0AF94B4A04A5686FF61ADFDDF73E6FD22F6434F3FDA4F0B2A838DF375D3FF92C9192462E8CF44F43AF70F154EFB12D84EBFE48264E55769E997D6F3D200E223DC104987B9786417F3296D732FD45EC48033F00688F92C7B5CDCE46E4BC8064F499F9B06EFF82B70D6ECD8C5A1EB5FFE1D6C605A54DC621D6544322911E827CE798CB0A8CE73C82F863F97934CABBE2CBBB2D2A2A6EBD553E8A09D8B49D87F79F29E3161DFB3EF37D5D0D9A93F7C13C2A75CEDB3E61121E85273545E85942EE1C6BCC698515CB8E88E76AD57BBF0FC85B10F10883AC4682A86D29CDD56E5A63751D47F06673F7891CAC9460B4AA9547DFAD60374AF982423D332BE9D7EF16759FB095A698B0DA5D7B5127861A8B39911F717A212C17A9368D2C1E57CDA3032C61C56B84529677905B3E351D71D06D46B8D69CFF8E10D175E084ABD4B36A0A3BA424F6641E917CA1B64A2FF62C6AD6DDE35A51556FDCCCF5428892E8FA6DD45626AAA1551EC7D7E8A89CC863E5AFD53A0D01ECAFB2A6268B7E0370C376F7A724B1023FFD184D900AA2C909CE156458C7F2504E32FE615A90DDF360C7F0B7708399AEA3BF3549A401BEE0CA1FC0D22F1871967DFEB0B740FB93151B7EDD2D807DEFDE734BD1C22A19E1D0A0101071A8DE3FF8007068E2E5CC43EB334055E292F88EA02D52B9771ABD3577B22E7236AA3B511C5E914AEFAE9C5B015F8AD013C109849CB5150298FD56E9CCB1DB84CE6A34219303322FBF38F9735414DFFE395ABFB19F1798894EDBD1FF77530741933847484965C3E25509BD31E6E6DC247E9B17AF7EE350B00816DC1DD0EA44792C6EE83541153208E0104BE27F055335718B2BA1AAFAD3EC4D62B952ABEEAD95B857EFA8F26AEA3E9FCB087A80D7DDF3BF29D63BEBF3A248A8D86A4C208BB7A3EE0836869074438C418254BDFC5A2A04C5FB21606B21AF22BC2631A46BD555BE9803EF4330B9F6C8C7C93478819EE8D2A0C5651C0C5AFCE5F20EDF72DBE8315E0BC8BDE40F09C80E760A804DB197977217F10BDABB3A14A23B30DBF3CDB2BBE9DDB141A9B115D16CE0CEED99E120514BCBD0DDD934379B9C48016A010151284377FB6B8E08A703CA401CE018F61D6D516C83F95499943EA2C818E315769C2A45172DD344ED15DA05D8AB1C32E4F2E7DE3ED5BD46E956878F266E27CBD65FD775B13FBE330B01C31AC5C27C8DD30F0240F5B9C024A6984FB7131C8CA04A6087091292D53AF14ADE0F2190E0F427029D0F27765BBD746DE5E2A9B8933DD0CC3B1CD1126551378372AB4C16AC49ECCBB107F71D7DD4175ABB0DC477E1B4FCCC42F868D7D8D737BEC4B5CE078017352D36A45CBE6E9CB676ECB84F5703445D42970D99F5744A008E21A6EB7A7A699C2435FC669DA5A8DE38BA98E6611DD8DE45482273C7DF9702BB10D345B826518F38789E66C62E0465D3874209350890EBBC5A3F8F132341CD58E7CC9E43B22C579BD938792C8B158ADA14D94F8179DC180CBB0280A6101D7BF2D17C0557F920307155E8DF1D95AE124FF9B91F9F2B9D4CE3D131D6DA313EDE0F09ACC122CAD8A296B5F806BFC2CBE5D8E526F020BC5BF5D5ED4728F818210F5E2A570B534DC39890CCD1FC48AB7AF86888E9453F3607401CEB4C22E3F960E7A8A5C80EBA5DD3717FC1224D190D4351E4944B4C23A949614D884D2AE59D989FD53302C83D66B26088C37EDC61207234F9B8EABEF6BF457BD61EF4B77D198B7A56B00FA723B4CFBB6E2CB116DAB87DE542FACC26A8A9F2B841B2F26B1C0B6D22172CD5C1AC70E5C5C1288BE1BB0EFC9F2EF68E0F88B8A6DD467F8C21FD4AA5C467C5D2ADBE9A72BB6F44262BBF4D23525D0D2527A06D740BC2BD45A3B8CB96CD66307242351D6B6A7C1B6E67C7A84E2FBF61AAB52E5701F51C4480093AEB29168AF847B48254CF04D1418C77AE1680BC564C5DF597308AFFB211B3CAB194D8AD0427AF89E0B55F65C2827CA704BE1B854A819FF87E4A6DF735D107422890DA141915D1687B56D2F1C5F007684331C7C17890E887390822AED10377F271A36855DD8687D9F476F3B1642F1388F121814C474778291202B97333C1AC5D6E1818FAD8AA2B9446840CC0D29EEDF118D53A15763ECCD692A0A92611BCC49F3A50C03A4E7C39BF3C545D9B2C2A08D3CFECBFEEC8D846D325396CE30275629AA3914B7CDDB05959A5EDB2DC952B28ADEB6B16197DC22D0F6BEB17126A1E2E0C66BE205E37E4AD7FEA34DCD7B406A87A155216009AC43AE89CB0C036433D736F5D9F2FE2FA091C28781602A59EDF96127C31265144B20360BD64DBDE8116E84A9E41F8259D9A6CB4E3368A646413FC23D76F55B4083F4420C1157A1D9B5EFC27BDF72B1FCB6617BF40CD8FFD2FCD645284321390BBB6707CE8442ED81163CA30A924CC9B5BD8BADB02CD15847F1893A7E94F82C06C19BBEC9E46B769DC853A2B9EDB14BCE4BDE8C6EA26A9510B6A8ACC62DCD55DCCC73DD962BAB314CDC65F9AE4BAA7FB4563CD38CFC6A6AA7A60E6D9C9FAAFADC55A8A207E9C2ECF21C343ED29113DA4E6E2EBAD2ACB1DBDA9652EBF1D20E8FA79533670DE60CFE73BCF469A8D89B5D6B2DCA831CEAB441F5540B4C4EDCEFD246478BD068FFDEB22F692DE4D814CEB4C105CA55AB82398D21CF7C2F992161B7D961F2FF91DE1C0ECA854036660BBB67071690C8E2DE999C809190D8DB16CCBDD971F4A0068F98129EDD0453ED31BC5724BEC70FC5CC79373CF6FA5D87562456538735D50674863F219CE5B3E61B1ED02564644DAE69BC0CEFD6302464042ED1CB8B741863FE00911729A0FBDEEDDD00FCAD9A80C88077750ADFFDBD921E2DB19070A41444FFEC61DC8B3D0221D336A5ED40A9C7BC7461AB8121CD4E9BEFB4755EEE92B8B3EDB2751D05028E5279233A44E0D4A205BA1F864FD5A0115272B4B2C7AA8E8D3D202390DCE85A47DF27909DB1CB7BDC29DF6FEEDECCC6814068F0C87513AB975977C7563E41F7E0FA1864F9CC9B5778F23A11B7D67D15E7D1711F2A6CFA4AA7DB1996B73259F791BB8FA73C99CA04BD837C8E7235624E6AF48EA30391B32B55EC08DF2F25B54BF663871D439C57A9400E6973B723CEAC8D55E01BE30841061CDE175DDEF36AE57DFD000B38155349703E2C9D10549890B7846C61ED62A6193AD3DE03A3F24275DE3FEDFAF9C384B601F0C1213F46A90BE8E3B97EA11C31880C9F905221064E6A7C297E300FFFBDFC0FC6A1C05ABB0D56F9918501E3EBBE84F986CFF4E94FBC1E71B98B315026E4EAB1C22634EE50BEFE7426FF41ECD53152344EA558FA9E9ECF80FF1C01335021C06BC46ADB15707A025CAC95D564016EEB1D192D93B94900CB346169BB1A18F91D88266D312A4BF5F050801C60FC681E3ACF1B1364422E0708120AF483A664D067273293687B3E321508D59BC60B78D0C9B46D3E4E5751ED038C228899BB3CC32239E5AA653012C656423222F2D04C213A5DC78005B739FAF522B17AED99542BD9B6543E4E9EC1A536667B484B412802F17704B99DC3246EF9180A0FFA1C269F0BAFAF79B1BE323F3F2D045A979A46A6B45EC9609C8BF2DA5BD40A2454D80DA1CFF9FA75965FFACEA20CB0F8ADC881EC8360F82BB297A6570BE1F8FAF0F10AE84645591974F7C246338A45443AC2B9DD7B8151A6351A001F520E4C6EEC800283609F16DA88396852BBD27C4FEA4EA0C2FAC4FB6B3A8E993F6E91DD06D461828F687FBB061A57E118D5B6D8EE5CFC6D453D48DBAA7CDE2C4B9CC226416A0B1D3B1BC6C1F429C481C187E0F6D022ED4110A7916D891E98600EA01263FBFDE28265F924F1E95F7B68C95DB4DA20EE37171BBB05637A883637D536ECDD9D7B6D36C15E255C1C024CB26BF5092A631A29B78454FDA730292662849E7B83F71D419B099E31A2420699F4F37378AC5C1985194C44A6F38A2F0D2CDF Seek = 163812 Key = FDCD25C05C5D2EEC19F325924BF2F7AB Nonce = D3BFFE7D9A480362532B542007577EC6 In = E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = C2B03F2E9DB7C22A9E730B10A572CAB1198FF46E4EC70801A66DDFC1 Seek = 8128 Key = FDCD25C05C5D2EEC19F325924BF2F7AB Nonce = D3BFFE7D9A480362532B542007577EC6 In = C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Out = 36ECDD9D7B6D36C15E255C1C024CB26BF5092A631A29B78454FDA730292662849E7B83F71D419B099E31A2420699F4F37378AC5C1985194C44A6F38A2F0D2CDF [CTR-BE(AES-192)] Seek = 0 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 1ABC932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 1 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = C1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = BC932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 2 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 932417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 3 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 2417521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 4 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 17521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 5 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 521CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 6 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 1CA24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 7 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = A24F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 8 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 4F2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 9 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 3D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 2B0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 10 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 0459FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 11 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 59FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 12 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 7393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FE7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 13 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 93172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 7E6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 14 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 6E0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 15 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 0B090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 16 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 090339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 17 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 0339EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 18 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 39EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 19 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = EC0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 20 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 1E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 0AA6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 21 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = A6FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 22 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = FAEFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 23 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = EFD5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 24 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = D5CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 25 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = B76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CCC2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 26 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = C2C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 27 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = C6F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 28 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F4CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 29 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CE8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 30 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 8E941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 31 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 941E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 32 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 1E36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 33 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 36B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 34 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 1C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = B26BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 35 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 6BD1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 36 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = D1EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 37 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 5CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = EBC670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 38 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = C670D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 39 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 11E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 70D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 40 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = D1BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 41 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = BD1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 42 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = C1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 1D665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 43 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 665620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 44 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 1A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 5620ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 45 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 20ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 46 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = ABF74F78A7F6D29809585A97DAEC58C6B050 Seek = 47 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F74F78A7F6D29809585A97DAEC58C6B050 Seek = 48 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = F69F2445DF4F9B17AD2B417BE66C3710 Out = 4F78A7F6D29809585A97DAEC58C6B050 Seek = 49 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9F2445DF4F9B17AD2B417BE66C3710 Out = 78A7F6D29809585A97DAEC58C6B050 Seek = 50 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2445DF4F9B17AD2B417BE66C3710 Out = A7F6D29809585A97DAEC58C6B050 Seek = 51 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 45DF4F9B17AD2B417BE66C3710 Out = F6D29809585A97DAEC58C6B050 Seek = 52 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = DF4F9B17AD2B417BE66C3710 Out = D29809585A97DAEC58C6B050 Seek = 53 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 4F9B17AD2B417BE66C3710 Out = 9809585A97DAEC58C6B050 Seek = 54 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9B17AD2B417BE66C3710 Out = 09585A97DAEC58C6B050 Seek = 55 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 17AD2B417BE66C3710 Out = 585A97DAEC58C6B050 Seek = 56 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AD2B417BE66C3710 Out = 5A97DAEC58C6B050 Seek = 57 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2B417BE66C3710 Out = 97DAEC58C6B050 Seek = 58 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 417BE66C3710 Out = DAEC58C6B050 Seek = 59 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 7BE66C3710 Out = EC58C6B050 Seek = 60 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E66C3710 Out = 58C6B050 Seek = 61 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6C3710 Out = C6B050 Seek = 62 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 3710 Out = B050 Seek = 63 Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 10 Out = 50 [CTR-BE(AES-256)] Seek = 104857536 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 556D3DBC69D83FFB1458E44066B112BA8BA2676F23AC4404217A5E290532B8193F525124CC6CE5C450EE1CECAFCC1881423F98C54F34AB0AC73E570290874C7D Out = 2850B58EC41321C785BBB7C536828C2DE4B7F7EB34BDB61C46513B970A1A073F46ACAB3F7C830F574C289EB48481D0347360457BDD212253ECEB98A46DD24478 Seek = 0 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 601EC313775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 1 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = C1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 1EC313775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 2 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = C313775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 3 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 13775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 4 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 775789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 5 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 5789A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 6 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 89A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 7 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = A5B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 8 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = B7A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 9 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 3D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = A7F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 10 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F504BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 11 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 04BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 12 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 7393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = BBF3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 13 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 93172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F3D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 14 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = D228F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 15 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 28F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 16 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F443E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 17 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 43E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 18 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = E3CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 19 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CA4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 20 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 1E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 4D62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 21 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 62B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 22 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = B59ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 23 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 9ACA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 24 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CA84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 25 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = B76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 84E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 26 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = E990CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 27 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 90CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 28 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CACAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 29 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CAF5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 30 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F5C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 31 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = C52B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 32 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 30C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 2B0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 33 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 0930DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 34 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 1C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 30DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 35 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = DAA23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 36 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = A23DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 37 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 5CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 3DE94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 38 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = E94CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 39 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 11E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 4CE87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 40 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = E87017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 41 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 7017BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 42 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = C1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 17BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 43 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = BA2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 44 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 1A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 2D84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 45 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 84988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 46 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 988DDFC9C58DB67AADA613C2DD08457941A6 Seek = 47 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 8DDFC9C58DB67AADA613C2DD08457941A6 Seek = 48 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = F69F2445DF4F9B17AD2B417BE66C3710 Out = DFC9C58DB67AADA613C2DD08457941A6 Seek = 49 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9F2445DF4F9B17AD2B417BE66C3710 Out = C9C58DB67AADA613C2DD08457941A6 Seek = 50 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2445DF4F9B17AD2B417BE66C3710 Out = C58DB67AADA613C2DD08457941A6 Seek = 51 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 45DF4F9B17AD2B417BE66C3710 Out = 8DB67AADA613C2DD08457941A6 Seek = 52 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = DF4F9B17AD2B417BE66C3710 Out = B67AADA613C2DD08457941A6 Seek = 53 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 4F9B17AD2B417BE66C3710 Out = 7AADA613C2DD08457941A6 Seek = 54 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 9B17AD2B417BE66C3710 Out = ADA613C2DD08457941A6 Seek = 55 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 17AD2B417BE66C3710 Out = A613C2DD08457941A6 Seek = 56 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = AD2B417BE66C3710 Out = 13C2DD08457941A6 Seek = 57 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 2B417BE66C3710 Out = C2DD08457941A6 Seek = 58 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 417BE66C3710 Out = DD08457941A6 Seek = 59 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 7BE66C3710 Out = 08457941A6 Seek = 60 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = E66C3710 Out = 457941A6 Seek = 61 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 6C3710 Out = 7941A6 Seek = 62 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 3710 Out = 41A6 Seek = 63 Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF In = 10 Out = A6 Seek = 0 Key = 1337133713371337133713371337133713371337133713371337133713371337 Nonce = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = 4C6F72656D20697073756D20646F6C6F722073697420616D65742C20636F6E73656374657475722061646970697363696E6720656C69742C2073656420646F20656975736D6F642074656D706F7220696E6369646964756E74207574206C61626F Out = 7CF12B76148F0AF2A6B087518AAA60F77F438FCDB11DDE33ECE397CE6B949AEC4C51107B5662EB1EA72AE1511754EFD33A6A9715242F43F22DFA993D547FBEDDFCDED21F8E6E912D535A2826FF6DE012D14358ACAEB057EF155EC33B76F5752565 Seek = 0 Key = 1337133713371337133713371337133713371337133713371337133713371337 Nonce = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF In = 5669766572726120616363756D73616E20696E206E69736C206E697369207363656C6572697371756520657520756C74726963657320766974616520617563746F722E204574206D6F6C6573746965206163206665756769617420736564206C656374757320766573746962756C756D206D617474697320756C6C616D636F727065722076656C69742E2056697665727261206A7573746F206E656320756C747269636573206475692E2046617563696275732074757270697320696E206575206D6920626962656E64756D206E6571756520656765737461732E2041726375206F64696F2075742073656D206E756C6C612070686172657472612E204E756C6C6120706F737565726520736F6C6C696369747564696E20616C697175616D20756C747269636573207361676974746973206F7263692E20446F6E656320656E696D206469616D2076756C707574617465207574207068617265747261207369742E204E6563206E616D20616C697175616D2073656D2065742E20456C656966656E64207175616D2061646970697363696E672076697461652070726F696E207361676974746973206E69736C2E204E656320736167697474697320616C697175616D206D616C65737561646120626962656E64756D206172637520766974616520656C656D656E74756D206375726162697475722076697461652E2041656E65616E20657569736D6F6420656C656D656E74756D206E697369207175697320656C656966656E64207175616D2E20446F6C6F722073697420616D657420636F6E73656374657475722061646970697363696E672E20566974616520747572706973206D617373612073656420656C656D656E74756D2074656D70757320656765737461732E205068617265747261206D61676E6120616320706C61636572617420766573746962756C756D206C6563747573206D617572697320756C7472696365732E20496E2063757273757320747572706973206D617373612074696E636964756E74206475692075742E2041656E65616E20657420746F72746F722061742072697375732E20446F6E656320756C7472696365732074696E636964756E742061726375206E6F6E20736F64616C6573206E657175652E20557420616C697175616D2070757275732073697420616D6574206C75637475732076656E656E61746973206C65637475732E Out = 66F72F760BDD02A2B4A6890483B66DF62D0A9284AB54CC32A9F9D29D61DB87FC4C5E016C4B64E84BA36EED545E52E0CE2664D4153B6641B779E89979156EB289F6C5894CA675D56048532025E476A55BDE4311AEA2A145E8000A963C33FD342B6FD5012945CFE8E55C3057FC838E60B43885AEBF70FD5FA8422D6E52324969A1E53BB47BFD139523715D72D79317C02A14684144DAF16AC65D050AA9A4ACAF82B7F2AC31A20592361DC872BEA0B46931C230D45767F9BEC35B8BA616677812EF3FBCD419872B4E7048C91AD93D1B66186EDC069FBD9AC26D0B25785D08E2E9385520812107069C3BE3C34EE9DD272EA56B8D35D9CB6A9496E0B4307AF3BE57AB75078A58181934BFF24CCA57EA9D3D1997C6A6D6F8B5453F799E74B09A01AAEA3F6E9CA00A70A1799475E72C40AB0D99529A0F99DE9393AEA7AD5883BCF533B79C9D34254993D67A77B17BA9C1C3F1E3F44C3E0DAAA13F72CA14332E08D739944559F05BDD4F63EB290894D3EA9E4BF4A863B35925E35CC4151E97AEE9935640792D3861E59BBF2B9B5D2709F692DE839E7E8829244AF0F54FA9C42429AD60236DDBBFBD134C40002A02EAE44D77639CF0CEF6B1813BC12ED8B577A46E2B808E5EF8452CD2E5A43F32166DE26EFBAC17CFD6DAF5C477F6D79C81E379E0EAC94E2FE34D191FC986109BB876A73671D4ACF59BF08ABF01D0A845FABB884E90E176293F903675381A8F12E4B5EA39ECCC59D0724A521922FE5BCA54D45A93F4326926C32FE465613FFBF2C69FCC382DE002D5200051A51744F010E16089A6DD8B2A7DCA6DFD6B6E6F4A04220E1A6B86CCD3C5C0B93326C37FA092EF1E531B544697F6316DD8F17EDCB5E0566C364FE814FF5B970A1BAA0D1911C7DA3203B2E6AB2ADD9858F0E31142713709F45C25CFE0E17BECA15ED4908AB3ED8775DA39A9DD83C6A5AED45F27E9B487B5315116589F73A8D54FBE24DC086D50BA0B915DC4F52B17705E82F6E65C8BFB35887BE779567E2257FC32C2AB85D03CB1C784C06651180E96A0B67F3211ACF40BD7FA6D43594E43688DF0E8A4141930E31928D8C3BB1F27CCB6D2B32C0814B5666DD67EC349DDF90B42EF4DA90A8BDD6DE480C4037230DC6BA0DB3CB6D321A382EC19B85244E6B3C41905D0DACB520D4EAE2E8A6F44A77822DA40621CAE77A4B4F70387B71F5EE2E30CC7563A39059A2C9174FA034E1899E54DCE4ACD82E5968FD8F1 [CTR-BE(TripleDES)] Key = 88EC5C9E9F223D7FBA9B30756EF4599D456EC9862840CA14 Nonce = B49FDBD64C0714ED In = 97 Out = 0A Key = 12C9A28E27C2318703CC39D4CCF116D4222C86AC6243ECF6 Nonce = 5FC33DA76B3D9006 In = 0BBD Out = F252 Key = 1E796473468D5E91CE170CC8B5DB6C1EA46D058B5345D35A Nonce = 4B32CF8013B2D2B5 In = F9AC35 Out = FCB637 Key = 0B6D5A41871596D3BDF22A486BD79D925A01DE716C23E10A Nonce = 6C164D7221E75CED In = 5F646CF8 Out = 1C2B4870 Key = E061260828CDA4B86631F3FBB74D48F363B0E45604EB41CB Nonce = 4D6422429C41CD32 In = 0C2E20A965 Out = 63C6DFC9B1 Key = F123BA5416CF6208A06F4700A6F5F26C5D27C4929711E044 Nonce = A3731CF37938EC96 In = A13360ED3328 Out = B3D7A1D9C0F9 Key = AEC241C64A79B95F289BD4935691CCC72843216233905904 Nonce = B2D3675FB60B68DB In = B050800567C2F9 Out = 24950B574E00C3 Key = 96A8129959AB9F86C6DA4C25CAC3AA8E6CB4780C9702DD3F Nonce = E0937FECACFB7CBE In = 68F8124B237BCB15 Out = 487F9E08F63717C9 Key = C7B972CECFBC119A6A48FE5A9C648494D255E1C798E957E2 Nonce = CEAA71BCEBB7FF2C In = 9987D62F3B186AD519 Out = 6FBF00CB7E57B85FB1 Key = 7DDA46EAB41941CA93ED65F9564A87B614D188CA40741C50 Nonce = C5C42B0F197379BC In = 8AC131BABB73725F9F93 Out = 87F0636BA739E1AF0420 Key = 7E246740B8862DB45BAE9DDA9AA2371CA8924EBD10A83885 Nonce = 1362D0F2A164F4B3 In = 01C70F5350B3868244109A Out = 319B4F8A15BD070C940ED3 Key = B395CBA236BE9E11B5C71476E31EA33FCA07706F41F9FFC9 Nonce = AF32EA8D33DAD998 In = 29B2E505CF74276EA0033323 Out = 4A81E054B1DDE289B7E8A339 Key = 7F7B0488E6AF4E17A815C5C47D1A84DFE90023693D8513D3 Nonce = 2166865BE0E1B2BF In = 0FCCA7134678D5B1F19809BFFB Out = CB2DC5F7DD24CA55DB73DD90E4 Key = 34E5CE0294A97A0012E11E0EE2BAE03A701B28C969B50573 Nonce = 58AA4511AE4AF26E In = BC2C8412AAE144C3DBE5FB8FA904 Out = 84418EBA5D8723FD6C5C3E6D1E10 Key = A09FF56F666975A778577D50D6B12A21625DEF840866787C Nonce = 90DB7E59DA534702 In = F268A2E1569E166B2F32ED6AE8B56D Out = 70FE2961AE8647134952D4100E1EAE Key = E86ED5142A2BDAE2E15387E500FA176F496690BD009FD017 Nonce = 7585B73BE2B46DED In = B4D921E1018766F3B5B57B62752E1410 Out = EAE2F2B0A7ECCCDA47CB780802BF8113 Key = 89B6D2747C5C6595FC0763B10FCE3414B4B6800DF6FDE760 Nonce = ABEAEAD81F34ACCF In = CA032FE8596CD58286FB89F89EE75449F3 Out = 588DAB35EC88B532925D113F501F48A4BD Key = 1379A08A06CE56C40C2F71402D063D2BC45E2410872D91BF Nonce = 06EEBB1BC203C72A In = DD8E581A456A3BBD5D4C0FD412F15DD4DBFF Out = 0C0B17BDF30BCD4F2DD40FA59878ABB182EA Key = B78843AB2868780685B364FA4EC7E7BF3D8F2FBBB85FA573 Nonce = 3C84AE0D3AF5F57B In = E69BA9AE4A7890B935EAFEDC4C1533ECA048FE Out = 52AA3C6A5A75E905AA9CC6773D0D9B8B91C550 Key = 56FB990986DDD678E179AB6FC26897C2996FEEC6E58226BE Nonce = 4E0A07D63752071E In = B73A4B8FE9F8BADB0E976DF555257F9AF67E2FC8 Out = 77EC0EB7DD2A673502F480EE6E2CFF32306D07F0 Key = B2FC5F8BF1C5D267DBB96D819A1C4F9579ECC5F50B45748E Nonce = D95DDE49F3720F90 In = ED9A5313244B3B47B7D122EBF4CDE71BB21B823B52 Out = 5E80D463E271FA56B1D8FE417EC70B36443224BE24 Key = E52FFD655C02ACBD8A764EC1C938A34FB7A60BC3214EBA75 Nonce = 44A5958F8539B344 In = 28B33AB62AA9110B5E51511444859EC73DCC385B9DA1 Out = 91A005C130858BF53E572231CA53B2C12C79A45F7A57 Key = EF8BE118E57C9B007525AC36A150C3A21F619F12B472FD70 Nonce = 7F117F99E20199E5 In = 078FD39F4D444A18EEE155F12297D177D0CF3A7DB53EE1 Out = BD3B9A1FAD86FFC6AB61987C5854AD31FF922B135DE763 Key = 1A96CAEA23524343EEAAFBE71F8932B30C08B93C603FD543 Nonce = 332840A8D9799055 In = 5DD649549E995B9435118A33234E698829D6BF5EC642D1E8 Out = D2CD69C30E2BB267910B91171E25D31EAC1F86A161422803 Key = 37CF60330343BF4B535DEED7B84F635CC54E3B4ED931312C Nonce = E24659F0266162BD In = 11785EC120BED9A3C964B24D0AD7165C541524FFB48CA729 Out = 69F5A5058E69DBC79ECE72355AAE125D0727813FC5602EBB Key = 7F681F49EDF476AB1D6942CF78F3EBFE9B7C9465B96FA3F5 Nonce = CD93A0B282C2C4A4 In = 53A0E3F42907DB065E17B055B17E91FFD69B201759C398EDF81C22A6 Out = 747B39DBAA9E9C52BA6462D0C6AEE746CB73609FE779368CD4EBF049 Key = 9B1AD76C8D5951C3CB503C0AE24CAD3D1F3015072E4D9C93 Nonce = 3C6815A30F546E5E In = 065FFB79B513457D79739421F97EC777B53B23BB88A656A4693247D5A7318DD5 Out = 1C7B575F4AFD516208D90B19D5BFF8A848418987AFE195D7D683B5840651FBC7 Key = C4BC7CB98D99F12665A24433AB47CE6E351D07E6D800DB36 Nonce = 901D49B1E9EB2097 In = 47091AEA1CE82EFE6992AF5C5C732D49B16C11EF4F00D120B41E2756CBF7784EDB3B42A8 Out = F2CED7ED0345477521672A39852D4C006644BD2317521AD6D47F8039572896EB64E543CD Key = 1D795895A23AF9D60938477D717A4C2F4DF0113728E8147F Nonce = 21380F578AFD1C07 In = 945082A1B920EE6874BE05E3DAB5B7DD011EF6FF80952F01CAB29F9A208736A48042B6C44481F7CD Out = D143689BB576083DD9F87D970584D10F7EC14849ADE29841D617BFB855F04BD23182AC9ACEB79376 Key = 02AC9E4E449CBE29D49CE0B25EF137AD592A7442377DCFCC Nonce = 6EB9BB6851B2AB13 In = 583BBAD6BA61BB298BF65186F27B343D54EE47BE29B2469F0BAE0EF40856CFDE1832BFC79A499CE164F7F01A Out = C829FAF9118F73A6409A134E76BB74C1F3A0EA67C4AB1183E945E5750D9DDA606444B80C6BFB31430C6D038D Key = F8040495E58ECEF0E923C616DC10A520274BE053D388AA9F Nonce = 81F4BC6CDC689C7F In = FC80BDE6EE7C14BE8CF25C00D651839E53991824EF3415FB127881EE4EC73A49C107EFFAE1BB017583B3233CFFCD18CD Out = 6BD12088E4A1B86D5063C5C07601C874DD11B8813DB48D54F7D808A2754D543E9D1782B45AE293DD0C4E5A78F215319C Key = 6477EAA65B50A234927B8DCCDDEB3FBE7404E91FFD907E99 Nonce = 5F04100C1A2A2557 In = FCF9A0FBE89ABF12FE10F9D2D3B801C7551F109562BCB30E40CE8BEF295141F5155F3F05FDAAEE194255DDC5685475EDAAADD7C2 Out = 5ADA184FECCFAE942E0B689F05318AB134F48903B2BA4D8B180DE482188BCC2C05FB0E610913FB5A06C2B8676D7BA7EAD9385A24 Key = 2A1D76651411F489300592B31BB215A659ECAC6D2786D3E5 Nonce = 8FE416B43B775A22 In = BC91C5CA49644998D9CAC72B43E4FC7FDEC32C7C4E911B24AA37DC4ABCFE098347AC134A3D4F5322619ADB922B00A1DA123E0ADF678E195F Out = E3DEB62DDE6F5D1D91FDB0234FB0D8A1CA29AEA3A6FACC9E265DCDD87E0969635623037EE6D9F43B74C6ACB933F097A8782847CF80213E73 Key = FEDEF66C02B8A055A845B268CF5CC8992F330CBB7D04126D Nonce = 70802B6B96EDA29D In = EDF122577185F6AD11F6C3930A565CC6BFCA6D9E9A50D5D2033D985142145723AD5DFA28A8C9EB5D6A99A18294154B596581D63B1B551734955A9584 Out = FDEB456EA993FDD98BBF939E59FB0138689473E449D40D01F49740B02A1E6CD23F5908877DBA2724C4CC12A0AA25D37DF1CAE0F576608B0447D68E58 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 6392479C6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = F67C1DFE15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Key = 229CC4B93365854F0D1DFC204B7A10D220CF4CE01502858D Nonce = E671E23612AC6A6F In = 83F82618BF2DD4EF4310B5F14F25C2EE63A36987B811C0AABAE5172ED44E08941D8FB5262C7AFB846615F10A0FB4E9EE04CB1CF83986DD206A751FD5F8879EDE4729F45D Out = F675B2434E294DCB7A044A27463D68DD7DB781BC156ED7159F35E5F867D4842D38DFC9A2ED0CF055B2F97D3682F65CAAD778BECB1F3E2EEE7F0EACF1B00B80850BFCCF6B Key = 359DA8E7D9C83F855455FB211E858CBC1F22ABE0A392CC01 Nonce = F091D747023D2E80 In = 864172019C96F6A967D57A67DC2FD7D545F7165ADD8054FDD6383E0B127802AD16C09F300AFE5858A291727CC5554216B0CC3DB6496EDE43D050554B7259A947190B2EE0EBF1AE3E Out = 376764C231B95E5F5286F913C01BBCECAB034D0DA9C7E462592D49F5FF47CD00380684DA628B37D3B89B2DD661E91FB3CA8A7A0C9D81F84A20DB949A3B7E7825C0F4912A283FAC98 Key = 4093748D277BD6B2E9F584AECE71043C6E47683E9E4BD0F9 Nonce = F4245FF774721187 In = FB67553B92328B078608B5205B130ACF891C3FBB4B8871E924A3051DE9809ADC5DEA0923B576F2A9CF3773EAD9922AC29BF6BAA2BD9712161C8039F73E642EC03FC8A55A5BC4EC09495CE6ED Out = 3E667A7DB0ED4258AC8DF0114320EC8FEF6E65D0BC77ECABF170D5E51A53F8959CE646C019AD3FC808F0160BA87B106CD80050B8F702643111D538F742F314CD3D4214F8F2B16FCF8D5C47FF Key = 1FD50583DA3D8B0EC7A9BAB3AD14447D51AC817C231F30CA Nonce = 4192D0FBDE37BE33 In = 0C395E448D57AA17E8468456585DE8720557E994F63CBB77005073760D53EA9A2B5613C9BCCB8401F1808BE933AEB42E8A01C497E8D97C8CBD502D24FB7E115DD6BC798C07ABDE32A22D75A21A84EF6A Out = 655AEFA5C512A857897A1543A0898C012A4873FE27FD48510E1E9FBD677C4151222582FB0881DAC3D4E5D02B0BEAA19703F463EBB92F2FB2322B52E4B3A6770C1272D2B6B384914CEED77D776DEACDCC Key = 5D05BF58A304CF94C90635D56F37C1A0E9BA10935D428D69 Nonce = F305C881FA1A1F9C In = AD4B3D07459B913F32336BF93DF71BEFAB6B7A7ACFC69EBC8D987E0DFF89B8F1ADECAFC75DCA658693DE5B7424459403905E67E6BDEFEE705B71C4DCB27EB6AAF080E15B5DB90AF93EBC9C42EABCB8C310FBC8B7 Out = 0EC7B56ADEC94177911B969D69B587A675D8349F3CA94DD550F107C85CADBAE25E6EDEEA2E2D6BB686BBBDD5187B0E54A7AFDB0E9270E03FE7413138CEC8CEDF9FA3A4D9ED1301EA91F3D8B453D94BB0894B5995 Key = 78DD18BE23235BB33E2DC8AFB4DD531D1F48A8757223BA0B Nonce = 99BC592318BBF787 In = 8F0217CF21EE1748F05CA42E5FEEF1BE1AA09BB00AD495FC3A09611348591DD1E54C62856C39614782190C38642D42A515D642360DE095C7D55E72DDD831C6EC1489625F3361A1064FDBDC888C8DF7F90B4431775EDE1C20 Out = 79844FD0E851C81D5626CB05EC9C2C34ECD37B5D66C94C1E0DE4AE752BFDBF51B1BB83C312113EB395BCF6A5E33B8D1462A6289A244AE2D2773A7203DE87D76280196068C9D4F9034A5298FD364AF7AA8CC4846B1898EEAF Key = 57DB251A06982C2AA7424E1734FE88DDA1CDB78470412CB3 Nonce = 18F8895E0B303F38 In = 9D38B62D9033DB573EC84257CAED2CCA0D04CA5F7A11B47E45FF523DFA9ADB38C93E586AFC80B300835B02CDE13F123A8B2E5BC66CF5C333FD216DA06BA0C93702871142064D0B2A91362D390924A73648DFD9BDFDF504D07CF735A0 Out = 60D1C89500BB05D2576F602A93154CA6193678B6D58EE65FE5078118C771B644F452F21C1A881373DC4208D0759DE25F4581D8C799CD82C12DC018D6A61B060B32B3F42DD649526CFBD6FACA694DB906325E0F0AD786CDE5F9997BA7 Key = 2D0D09FEF1AA8DFFC59187E9F33AFEF527559D2B51349CDE Nonce = 4685C00F9FD16505 In = B54C5278A5091743E81F45CE4FFAD2640423AF7E5D033CFCED96729392E2D3EBD6550291054C41AD58A0F9FA55AA204F4CC94A1DCC83ECD019E5594FB398663C4E8D50709C70661B5CE507D51451BCCEFD5815824EF1F68C641C86C959594632 Out = A9A7642E3C372CC2A270D20B2E68124BBEA0D1111191C62544E7149918119EC43641440EFB83B2EC4D3E27D94547005364F62687655F697C7EA87E8863EC4B53BDC88FEB22BAC3C7974A79E2F0BBCA3BE3B4C6A760C13D5645F4BF37722CF284 Key = 10423E81CA423035E6CF0402BB817816E754BF0E7D5ABE67 Nonce = 588C7B44583F4338 In = FA8E29577C3EB4B8C49048A0D61DC6ADD84C02A9B8C7DC86E1DABA258C54D8D4C367594C2726B99F443FBF597F1C7C003E49B019B02891872F1F1CFE8EBCD22B3FEF3A5997BAC3459816BD43EE9137205CA0AFE70671D0C03ED01AC7E6F957B1B3AF8F92 Out = E736CF427A53CEB8A4CE9FDCBBB346B7D84311F3F3E8AF7C4FB5FCA9CE1C0F01F4AE272614E7556F6AE12C58D98DE1A1B841A9CE95921CBB6F19A2EECB7E1359D28CA79AF677933D13D7EFF3C1BB894EE20A44BFE196303F228DDBD1C8A2812717D791CF Key = FB6BE4E0CE90E551B235A395A780587E265459F3A2FB9301 Nonce = DB17C1C5F76F8B2A In = 7210EFD49BD2BBDF2EF3488D8DF261597DF326BD2B1908DCC116CA077B1D8810FCD788DEFD57B2285771EA00C2A71B928072AD92CD6634C7637B91BD3E138E179FF15CA24D156A831317972D4EBA7FE1EEE2B654BEC5598DEF97DA4D9AC99E165CF5441F5B0E6D16 Out = C548B70BCC936B8E0CB009941629C83EC3DE6EB7A9C7D36E9F1A369CD8C2D978D39796906C5AC405208AD38D6851A0B7D7E07B2E4791DBAE703CFC3D172F1132B47393044F2551222AF03439B2AAD4DE66E9E3B1890133DF11A2D7EECBAE60AC42E51F0210C033DD Key = AB41F667999698A7F657ACEA04E70F61ED64B1CA8FCBDE70 Nonce = 1D89DFEECFE84C7E In = 01560CE12D17C6690ECB8C08087A53ECEFDBAF5EAB66860BB3BEDD35F16145EA13F790818D974DB4D1F4469876A24F11599B63E48F70ABBFBC4CF8911F017854832D61B742BDF877EB2B1D7D05D3413155EAB0DEEDB077ED8B3CE940D30700C245068705B24AA653A3E31CAC Out = CB6641AF44AF5FCFBF38D74764EF26DFA72259FADCA3E4B78427789FCD0987374A307C488FDBFBDECFF1549346D04E3A03FD7E8E2B3680267CF05F99E983B5BC7F40C9EAFD4A463D88080E23A65A8706CEF65FE7DB3E437C7625F6F3833DD77796043FAB943D44634240EFC8 Key = E14ACE55594044D6FB3F49C1D3D2F57590609D5E4A489CD4 Nonce = 11692B3F434F1E6F In = 19D7CFF7182D41F083066B2AE61DB10AAA7E2C8CF302D5313E27E9A86A548453ED06EDCDFAC0C4800CE11DA1D415003A06E42DA380887EF7CA62C265C19B3A405336822490D93B76F0D51A5A4DF4CBE8C5249F53807C42E85711EEB44C72F7E03153DE0F836DF7D92C02AE80FEE343AC Out = 4632E56DCB6973AEC10ECA9D9EA95F0FB5A0318E28DEA69C9770591060420F0D88197B154654BE281A405E36104408F9848BF157BBD9AC676326D4023D0B0C229D9D2828678A04EEFBA56CCFDF8CCDF3F1EB5AF8C78A120D2F8A7FD452A56C9D65B6F6E8542BC5889FC515D93146675B Key = BA33A52369C5A7841F38C908DB1C428168D1B99A8D5ECC0D Nonce = 7C9D2C555EE392B6 In = 245548CBB355FE0011E7E07A5BA73ED0A0A02DCC8E5DDAD2D5D4031A086844918A0308B0F4A115C690FC12B80BD9B9CAE8E85275BDF2A636A98B41D1DCB9A8F33BA47871E931136FECD36555167C1C272BDF59B5428F1FD628285428B36CFDBC400FBCD5BBCA23E310F2EDE5809BA9862875E12F Out = DBE0660F5AA3D77611CBDCA3A76994F7D7638E8FC528BF57C32C25E7CD3DCFEF15FE6C05E04B6A1023DA5948FDB68DF5646432E126EFCE3D3BFDFD34E5DC092336CBC1B1A22C458A3F862A659BF39143B5FA990851FDE7D00DCC91128E6EEFA40E66E417DBE2800DACA867B1E2446C1F8DC16D8F Key = 5896B26A6C98A462BFF52F189E09CB9582E721BDD4435C88 Nonce = 8DFE5071427CC54F In = 132D28F6AEFCD811A8CD9C7377C92A761A337BF58107DF513B9F27D5D343C190BAAAF96D1932A5DC3668BA1DDCAFFF175817A82C7A5930B089EFADD712EB493BFF23D622D855E920BD254B540CF779C90F7DCFA78697EED2D27C4CF33FAD8C33574F167648D5CE82EC073DD1855F90E66F1257828435D403 Out = 8E76B60626715EB0A129E6C2385F2064CEECED23B08B1E0E1EEE9A1050C9BC45C52ECC36D3F503566F68C4A73E8737020DE93FC9BF2E0BA132746370D45E21E9E101291511C95102A40A65EADCB5BF3B70E30273122488F8E5A98F88B32492B907799D3F126DA27718C410B629BCB323199A4533D2BE1566 Key = 9823976A01E5CA3A0072F891737F2E804243C022DBF67DA8 Nonce = 1A7D40F7A45D3B21 In = AB017A9FFAD2C7B1447A426AC1D4F3C103315E37724D4C18532AE13A5A1CEDE49828C18DADFBB27785ABB9EE20CBD22D4DE7F61B59A818BF59A6EC9C1E7488689AB46890105616F78C4B511E81CDBB48A5C4A9E2B60061C4D76E000C9589BF0724E6730950ED9420053F554164FD358F8DF17EA944414BA63C2BCD4C Out = 19D963BF720D19DA2AC9636203F5B5D2451BB384A750A0B38B1DCB74A58C7E677E5EB7CF62281E9D625CB6B3455877E4D9EFB7D9844BF4808D6B35EE6E5FDF9810D29EE6A257BA601BF35E44574D165E739FF91B8CBDB7DA5D742A9F896384DF8A309DA75EE053D86CD0A45AEFC8F13365DEF0255BFBD11A3BA660DD Key = D15F4AD42AD3B5E3E96F3C1B80F841A4638FF494433F0CDF Nonce = 69BD2AE022B36B53 In = D88169C7440D4B715D00D29BE2C56650C38B88848A78C7F3397950A89CFE477BDC4D9BA25C7126A0BBF98B1B712EC31026987D549B285338146CF6460391BFE3DE28BA02DA4DC03712DBF7576B27FF0A9BF70A8F8ED9834C278B9B7D7C5DF14E6E96F417A731C94FD65E4BB53397EAE04F02C70DBB166BB06B51EBF5D0E21556 Out = 6AB43161D47BAA00611CF93F1CD22111B37C484D467C671737D0DBC3CC230E8D06CBFFA4AE13D655A3D5F5B4538278956120B26FA62F6664666279E0ADE80601579BE3EC92C236D16B0F0952AD277CAF995758C15E48D7319CDBFD60251B8C1604AC8E3665B3B55CD7C1AAE69C78A8079ADF454928834E7CE857AC1F7C1B5D32 Key = 30649520453107ADBDB89755E6A45BBC2B1441CAE80664A9 Nonce = 69807CF1461E591A In = 17B3CEE55049B8D5678308E1AA3AC851785500ECD0B549C88A79F4BE3919E831FA26AE8CA740C8DC605716419CCCD0EDEC6CD26636C6DFF4502E475C5925B78C728E2033A3CED070311C006F75105EC1250265736D128E484FC75B8FF59C1A0E8B2F6D1509CECC99BFC7F0AEF053BE99A0876A77BD2C292DFB8E302821A322E319F6166E Out = 9A412BC48FFC5241FF472C0A38B7A6DD90338D07BA5819337EFD2A1DF6E55DD135611A36964A9130F1D66647C408B300D5A65F158E738F545333E87490D3D6403450A87C97EFE05F4C2FB1AD93B6D1D3DD0B5DA919C30E2FD4FAB0DBEBE3E5F376D848246ACBE7EDA4EDA0BFDD3222952A4B3E089E91D759E8579A6A5CF226075378D6BD Key = 44ACC9C403CBA1CBC379BA5728A82184E3C6C5EBDE9937AA Nonce = 864C402CB6C3996C In = F2573AACCF5AF3863190B964E06CBB3D3BFA62C0A249B3371B0954CA44EA671DEA8DB66CA82F0F6A31F905E9A868DF84FA91F5EBD63213EE2EAC81EAA2D53E0CA532524E663EDE2D669F22944363A228318AE7D54B78D9D357DA2153D4FA74C0EE86CA4FD1A2E4C40F7BE5EA9EAB8972B40333E76CB668E252C2842FD3CEA4E4D0B474C5655ABB97 Out = AE9AD8224CB1C13935BCF06D72B231DFF0E03C1329B4B095D1FD1025D27749EE054BD5C5FC191C0FF6DF19114F3A723BBC31FD2FBAF568FC11DD6BB75582909B47945780D81D384415AFB1C239E61A47993BA6B3D28BBEA3A7B989CF9D2B0961BF215C029ED736F14D379FD7BDBD2811E1D0F4E0082F88FF80B450704CC0726947F82E3E3DEC4E90 Key = 8BE0F9A2BBBA3CEF45DE714CB47A1DA46ACFE8C8E375B5C0 Nonce = 36A3DA85013D20CB In = A79D7AAB3CA5CC819051D9ADB71CACB435E66752D5705E080C6BD918212409BF0E1C99143C7DAD3A19364816F7E055960DD413F45550A4225E178754EEB6EB36C78C400B59ABF6138788D5C86182E2FC5EC8BB54D532E7C0E1352E56E9F4667C4D5D6A06CBC657BB447E8A23E42ECA31B8B8CE70C44D1FA08BDC2221D7CDD2CBA13C7DA5909D5809FAB74EF1 Out = D27B0B90C84AA11EA79C30B8B6D836A0C873F1EFED6D1D70A8CD4B91672185528CD2D8F9D7AA044CE2465E8C8750D12D220ED7DEE8DD7E967535B68E97F51614C7F2DDFA8F0EF69CC20949C2D0A0F69A0CC0D668B934EA6ACCEEDFF36DC9C95E1BD0963BA58532EFD2390BF782135255DB25B09EA7AC663BA2E981D4BC24C21667AFD63CB8ED3996A415FA17 Key = DF1FC69356F3D84F8504E86162BF62786BA068AFA274CF1D Nonce = 714D51ACB680EECE In = 00675A08365A2C219162AF373BC3907A3F315065ADA8EDD8F95C1C72C30C060792B7DAFA6C6517C24815A974EFB1578A2E45B2A85877CF7AF4499BB61CFEE555974DE01502E40934B30CE648C5558515EB118A25F2EF9F68DBC6A56D47C03FC276F656FF72092E07AFAB6F7CA3B20805CF87062D5BC48F6809B0010443DB909630681609E489F84E40C6EB05E82BD154 Out = 2DE3E2479861C3935C30F117BF2EE076FFDB3BE6CED29ECB4568C573AEEEECF12A7A2553CEFEEB385CFE2E148D3520C04C3E3FCA827277C35AB79DF07FAE24400A75FAFE4122AD1B8DD2127AE7BF57B7206C45C9B1DC31E5EE8E7E96FB488C402A4B247EB848957D29FAFBA44162E41D598587C4578DA0026F91FBDEED83A493984AE7F21A92C34A3166FD22813D43FC Key = 3B04007C7DAEE3281F302A1E59C19DC27C5828BF1D05B0B0 Nonce = F0EA4B24D5C8C04E In = 422C787B610A81BDAB601533DC7FE9D2AA365AD8D0C6CE79D9B278EC2EFBEB62D6F786A39BE2EB40C07964D7E51D6D799714B9ADF950F87A190D8AC6E5EB5AFC69268A473270897C4918F1994BC6D13D5DA7997CCCB90B08DD1398C0679E8A1AF2EB22261D347822A2490CDFD4B6AFE1E73073EF7D35D6396591FF36884C5502058A987656EB76E7AD5C723A128D1D5DCC6B9EDA Out = EF213F63D55E34C88D1077F3E83A4E34533F11D913F495E35D2F69CC871505B72792A49801F546E574FCFC555477D9268EB7F047A9D158A6B13E282F1F970B8C4AC465DE3CEDDC9956BA78BD18248AD3DF634EDA11D4938C2BB8417C59068D101C426808E089B63CD06FB8DEF20AD2EBC1102CC3DAE5BC3968BC888FC565B24E3D47666CA13D1EE29C2BF2093CB1E8514AFB4142 Key = 4CDCB5507304374CE290C9A740ED58662B52E63392E62774 Nonce = E186BA54C8C15814 In = 366F71A1A3538E604A3A7E8F2E31812E90717243C69D260CE76193D6D311FF31358BD320F99775D6D15C245BCFE724825F9DE2FB56846834DD215B2D00CE23CF1A6A7F008F9B1FD499F8B7BE608F1E31B08009ADD2BAD8AB09B4D9A3720403A485EDB1100CCA5FC9C7A5B21F9D7B647EA950137834226EB251A16DA15C8B035638E0054CB8405EAB05A682551CF75F73CD485E3086F6D335 Out = 924E375EB5F65F2F96A728B9CC81E64C4A5D732A8F0CF4FFB671FF2F54EF0623CBB46ECD916C840D63201F6D032E32AAB8E55D3716AFECD884A7A576FC91279F34A2404F62ECA75734CA87C2EB0A4603C16FF51DAFA609C25F9B9AC84F5D4270AF689112B474EE22B96EB6CD9235018A44BFD65660F0EEA2C4A189A89F2863BA19BF4F392C619134B2AB9833A8CAF09B593508F9EEE6C762 Key = 9ED95D56BAD11AEB6AB3E936ED432A6E8B845065C876991B Nonce = 2D8C0EEA9AD90D46 In = C96B1DAC091798FEB0A74010ABC768D2D5CE0D781752AA3DF34F50A6D9618FEBEE91532172589BB22F9EF3CC87220B4DEA792C10F082057F18D7AA18460A3A79CBE91A08076C4EFE816C8C90736BF26408415F57AA82B17DFD1E5AC972A103CE747E7F8E76216AC93B683E26A8FD9C06F4355F7D4A59A74EEEA737866AF7590C4E1A41CEE3080FF29E0B6DDAB926B131A75ED34EB990A4E332D6E53F Out = B5D10BDCEAD213950A981584875633CFB9EE6C8FAE1D1C317970E4FD2739B6BB8E3F977D2FAB4448D412A6084B503C918E77DEDEC48D96BF968C66D7E1B4A6BEA461AF9CD9CBA8F981ACADC71E93BB33FDD0C3E83F5B87CEED3711CF8031B5505ACEA43308E67D6775951971FAE57BA329B69CD3B0AFCBFEEC4E92AF3358D7C54E675AA9279F9615C1963D64610F388724FB993F34024ADD1B549B31 Key = 3E83C2C42EDFF2231203B04175289C7A13664D28CAF0367E Nonce = CFC98241E9ED13FE In = A50B4007340EFBA7116E5C7D147FFD08DF940C883D6F0065DF2EE1DBC11DFB4E2027596A61F00956A2659D887CDBB8F3C768853BA53B3994EF8969582874EC4C89582DE4E113A34B31E3D31D694150A0D7851FA266EAAFD5CED7E7A6889E998E9498EDCD018DBE45C7B71052BC0BD49C2F8FCD705DEFC77EF77C228ADB027439031F95AFB48CA336D821D241160A977117B08AFA9677F0485E45804CF2A31295 Out = AA0F41F20FB792774E319AA8D26E600F14F99123AEA292E25AC0F5E77B1524375568846BF2C88A141CF38DF69D5F0A4A13BB48D59C580E22172E8A1F8EC90DF11AFD59BC03EFDF649BFEFC28D55B92F449C2862F9DCE8D2A38FF251C620F30F01E13F5175D94099D18AF5CAC2A1B2AD42A13788B5739AFAE2A5330C5FEEDD8E302B11F2FFD94DE4E7F23D30BA7CAEE4DB4D4E16781625A4D88AE920A5FCFE406 Key = BF60941BA2CE07621165363216B1A8662883B5789D9FBE00 Nonce = 79E1E8AA48BAE8BE In = 65052507F0994AE9CAB2FA2BEC34760B08BD89E993B9A459F1AFB9D12094650456B11BB015BA54C751790F3709330ADC28C52612980BF5BBACCDC9794B063EF94B26136F89510052043825F456309F9E64885C8365E96FAEFDD81378E933C562833786186A05BD87DFBE30C5461ABCE236E8884646EB36CB13F19A6C37F6D0361AAC771345BA794065A13DA8F353C35DEF1B3526FE90F6108312CDE61714A8821811A985 Out = 9656F278A0B988E5BFB80B677CE62820F386997A6AC0289651E4965EB30CF1435FC53C3A34CBAF23D0874F03684096303C946FBCCDE8186D200F28EC3E502374056B15973FB605BAC197F577862FD81317F11946B6645A89EEE49EC947FB1CE49DC7939F8453BF7F4CD0BA94F08B454508BE41105F579D73DD76ABFF37D12185987FDFDADCBA342500E013A9DCFDE437AFA5CCEA0A772B56ACCCBD1AB18A80691065B3E6 Key = 442541939F8392881C213DADA197907CD53D37030B426DC2 Nonce = CC469CF927E806BD In = 2865B3FFAC2D9193240D4E70F90BDA48BDBA9B8FE9DC80782E321CFBCAF194095E204D511B864743AF0F4059A955B47D53ABC0D79071300BF4304516F31839CDEAE23E47C9365B52A451702928C311CEA1F8D039301B00ACCEB342C251B329938C9FD47F7642930B7F8A859B51808B8E51E422D9E387DD13AE68B4A1D1B07AC9A16D5713AF9EA3D06B2BDDD97B615DDE709D0E8CBC3D1C7080B2F9932A16A1C4B33746A08D70EE0A Out = A6CD74B4EA815342265082C682689329A47AA7671CE9058760C453FAE6F468DA8A3AD9B7ACFB31A947FEF628204C9A6F085E99104C1E38CE194F6DF422C3B6249FC3464C25AB78E576A7BC980C3F6E15FCB4F8B0D2A269B4323B998FCB297C493ECEEE97FD8F6E94B08E83C0B3F090ADF2DAB04E951FFE2C2EAB6F30615AEFAE3958539E9AA6861C7AC1E97AF4A6D4B8591A6431CB1735FD51B110D94E05D1C5E5D34E9EBE6B8C9E Key = 19DA2B67A303BD41D9C14113367FF130DBEA0E586CC94032 Nonce = 989DB8AF81ADE45E In = DED01389883B988753CB3BC1242041A7DA950842C0FF4BA038348972707EF0215C3CAF324478FA07EC69857F93B4D5FCF59D95ED83B1DA6EB247DCB8924C839E474FF125AB188F2173F0B3EE6C143E3B8D0E65A9028930D4FB52914CDA17D5F60C5CAB8CB304DB9A6B02636D336F568DD4FBD44FBA911B3F8D7D8F3B8A698EA90D5910550A25A0F48F201A98749EFA7767A9DA32D60397B6794F2A0F4B483D2E6FD729EF8588FE34F8A02508 Out = 1723BEE6242BEF711C3B984948427D5D3A272833EB63B70083C68F845A0DF44474B01DE09634DB18918D236E244BBF19C28DFF774D8A23FFD6D02931CAEDC7114B1D4B6D3D0AD8525B87ACCA6FF577479B610244559D1A28B837BD3453A182D8D2F3718179DEB55926FE6946398B04A0FC1F320AECE0B3AE1DD372CEAF51DAED3F30F32EF9BCC98A398B67C7EAA478F6D50ED5131377C3E97BB8ACC7FF62F037F4282EBEFB97C75E4349A6F1 Key = 34C1FB60E4F910716522EF7284BE762E12D92C574C7117AF Nonce = CCD1117DD7CE8C78 In = 13BE60919E667B31C3F52317D68AF40FA32E701D947996D754EF21CAF1E0D2C8C801B59D610FC2FEF59058A80E95F2164B6CFBFC0CA8EBA67565F655023B8BAC6E22E0FDCAC92086AC5258A9F86FB0E6B0F77BD32711C8BA7830821D4AD7E5AAD4B9E763615EE1CEAF11393CF8FC03862FD11505DC88AA80870E518C35F19C3898C18D9EFCDBA4D665C716E19302571156DA8AB3606B5B859637C67C03445478D7524F52803F419F0D1576CDA2D4E23D Out = BDC26765ACF6111BC0564AEB8D98894F03BE142F7BDB5FFA2809E637B0EA2AA230370C822DDD92DB0C271D429F9FD9E5121E7C8F386DACFA628132E47D800E2C3B76CE0157041419F2D652ED49371E809C1EF46B3891DF86B4CCB1DB94A47B0448BCC21A1A32570B04A62720013872859C7660869E2773D75D25F123D9AA45FC4840AF1F28706E2BCB4352817158F02CE90C2DECC16E163E23E3EC566DAF7A664F7DA73CC65855F87E128F520289EDC3 Key = A954794C8C5A6583AC5574BD5267FA456CCB861B035BCB4F Nonce = D1C4168D5EF23BD7 In = 0E08C9AD2B7C2CD3CF87F1D5F4D41C4F5578EADE1CDD1C00FFDF4F755B409307AB07FCCC64CBC36D2CF9B4D9332DEB326B1A13BFD75E24223234AF7916F6FE9AA37F2F73D9441A49C7E9C5E6CB598ED438CD7C334845F00E6FDAFDA24A164A4FB285A5A7F3D6A992691F74E21F3E10F27B27AF202B77F9ACF985D5E6D528260EA59D7BEAFDBE0980D4976CD59027670582E5745F245D474A9A6384CB7B19B9E2D7531F2558243732D98681CCE406B87E2FD86F81 Out = BCCBD9A965628459EB4ECE80B4266C2F4CBECDF281E8FC0512E3ADDF66C5F934CFCD9FAF78182C3A7578234BCAE6DB34BED44974315C6D29FCFB6C7501D5F09F13E7D163FD8290A8CA2C883EF490F82A7EFA122D3598F35715DD0209617BF9C03F462613B1CC578A258D1A708C5323DB478296B09F83C55E8349A4F9A9E0B21ABA659BEE4B34B86F6FB8AF8390520C52B9874847B874A61FCEBB625C44DAA34410422610F411101138D9047C72A421D13E8F881C Key = B79B4914046D2440188552463AE7D4953CD632B74EF57D5A Nonce = 28AEB01F6AF445F4 In = 293D0A81E72071209BEE7B31E2C70A958B552370A0B5454CAF294A3AA7F0061E7DA53DF903CE3537A93BEEBB2B2FD6048BDAF6E856454814C2308760E2C1D809096ACC4B6F1675C6BEF9B0A4FA81A879329083EC0CE758650EC69196F56541745E805C325963EDAA2F4C000510DE7532A88D236D2A52CA5F4F8F4D3BC28DC7DC1C9286EFF9978E95D666DE1A0E3782F67D9F06986207368C319DF75928E4CBF43AE35D916D4E8DC800F0D979B244E08933F355F10E227A51 Out = 4E47991B92A21D08A1327BD558A743FFECA01E1747E2E05B27B5519B14668F2123FA0875D5E25944A34209C5B67F980B04D5B78CC96670496E8B52B38098C54C2A53CA9213A1F3E26FCBE8A2FC229492F026D97B6FDCCFDE0C449A1319D8DA631641B80486A9F13A5511FE48BDE85C828F8AAA346315ED5044916A7FF10FDF24732A5AC648864FC3D3305EA609C03726148DF121D85BB66281C8EEC32E5E0C8D8BD46A101D0F201096410BFABC7AE4702CEA5A7B49809B96 Key = CF5A147B024229FE958B9F55854F36E59818E78FB84526BF Nonce = 179B6E26C9B56072 In = 16E18ED62ED56EB7DFDC9A16C2A550C9A3FF4CF7B2994750C4716BCCA13D01AC3E9F4687552935685AFED40CC6355CA7B18AA4688F86D0FE9782696FC7FD370220D6E1E07D14425818A047DFC6A59F850C12DF38EA4601E1D5B5AF2AC29D2B0C5866BA044CBC0ADADD671FCDB7122D8BD085C66E7500C1BF245E24EA357781A63100150CEECBD4C4C93775A12CD24D48C90BA2926CE0BD03A57894314F9FAD3EA6266A7543AF46A82BB5942E87684FF30E1A01B68BBE1B9822669717 Out = 855DA36F0F1BFF9176FBCFD921E84709C0C0B65EE2343E5FB716D3A535EBFB68A3472F23F60166E0413E8403A4A6CB948A16B9ACEC25C9D9A77A65A849866079396F8580FE8B54773F7746EBB45010EF701624A4AFACE8C0C4F2237359F21DD8AB12A27C46F48339C6B65C32B3321B0D1FBB03800A46D49A478D725D23BF383497148DBCB54CE07191D61CDE1F3EC48735240750D7E1BC61DBDBCA3FC219B661028CF1F178F52F1B4449358A72C740EC3623EF93310B644541F17996 Key = 422E846979E8EA7AED9218616BAA4C96134D46B02FF4A911 Nonce = 7D2F503105732C9B In = 1BD797B39442A5169CC93A5B49A186E2EF27B95B34187C49DB78E204ADC7F04CA5174C02F9691CF7883B64262B1B15CCA987A16058ADB5CAFAC12DC45569B77FEEA2A3B5DC5D5B096C0A9CBE3F0C4B20FDF8738930929ED5738CFD7A21A0892DAE31B56244BE85809AD136490AA87D02CADEE0DE2F422C93C19B4ECA1CD87432353DA547105EB7C748AB0DC9B2A9377E400D92D66AB8ACA5D9DCF2718986796F4B20FDCB06A0EBFD2BF4DEAAA23EC4D01CFAF68569E9B623FB8729626FC26E38 Out = 9815266577A019A1A49C0940BD3697149A50D77086DA172C6CDAAD2FEBDC3CD556C60BAD7A5F44FC2F219255BA567D3F6392901AADC38398089D8008AD255E8D39786C3DA809E1C499070F3C7BA4787DCDD930EC173E393AC34EEDEF71D8CD69E6DA2BD2C76C814770529646FB3D9C15FF4D19F7BF926E0F72840E378FF5F9C21D464B7FA8CE6514E68BDD95352AC81C1B817E85CB2EF9212353A20DFE14C7978909CA2C96C84A73C93A7C64049A18DB5071CAD15CDCCEBEF9E45D7A4D3FD8E0 Key = 5A34EF1248E6886E476E059C42EE93EDA4E50A37A7D9384D Nonce = 901FB557894F2198 In = 76B8C05B6006C39E3D91DE9AF1E018CC41202F3E8068E160183F81F40A9D9B8D8BF163B89AAF149361C04616E5540C56DC69A050812CD08D9C128EFA11AA919DEFEDBB0295E2239A54813A4DD5F826836E3504C2ABDBE530912970D3656DE179F8CE5D0ECD700604F5680F67DEFD0AEE2AAEA49C1B8024869482998A7BEC10C0D0BBC07F90FFBB4E3295C35B11BD99F4178DCD34101ACBDF5E17078D9CA9D965A4A04E1C855610CFDCA417C963A7D6628615B0FB1F746558ACF2C23F7FAAD1C660027F21 Out = 06F6497B084EC666DA6706B607DE07D8F31F93ED7F0EA18BE167941216CED45579AE91CAAB9CA67AAE82422F4130A27837B5E6FEE5AC618542BC3A5F594ED47E57F733A63D854ADC13161F35B06889F9D22958CE7016D0954C1E056975CFB961A7E787F403FDECE30B6481ACE56DABACF5BB3875AFD291AC1CF42789BAED5933E41BEB20F314002A56D47A7D4871EC82F0637EA2F5CBE514C7436F90510CB394783AC9C5E5312FDED24FF9B112770E9DFA01CA9514882F57BCF6A9A7D79B6119970F7052 Key = B74C40F0FA6016C94745F73FC4E6C39B1796EEE217223B5B Nonce = 945F1E1536AC7FB6 In = 0C9CC3DD901AC951FF9FD311B0DE4C3FA05996B687FF0F9053044D5C30358404E1F475F98EB7F998B0490B5138F9EDA12E0F792DC0464DADD92483EB4483072933FF5FCD78030FD75D0B3269B5ECE51AD9B246238D10F4FA6E6A06C1A18085C624EEF9F561E50EC1F4972FD57654902A1592CC617DCF94E08630C460BB463054C2F657057499C258BA23B250683F75EA6C28214B05430BC1CFD0A8659188C3628E8653035FD20F3DBBA7FCBFD3BE9B7AFD3FA81179141D8D10031B5C0E335CC3FF15F40A82AF84D9 Out = 3DE407D6675240D9715357F3D343DBB491E2B5A4F6B3B76F2BFFE495A2715B9050FABB764C58F53BB665AF5C5CDC9E539D32858B406FAE4F6649A1499E3527AFC5174E29DEBD45F62DE2CD23B44B9599B63A822FB18BAD935B09D70E9ACFA9C82A28F2900FDFC97EDB08391E6420C726DC290A6509D2F6236F744EEC83A81E328B832C7FA9D3E949A7505ACE8CEC9468E31F874D5E1CD4A1654BD9DADDF36238704C1D5537AD7259CFF95A38F21F156A24618CACECBFFE07C0478530DADF57EA4B34F3B4E68ACF48 Key = 7ADA51356F87873ECB47B3EC609214E484DAA4ABC9439933 Nonce = CCB4D4C48FC17139 In = 7E36435753B7C289495CAD8E1E208917CCC9C925A2B898E87B622B1D2C7407A76CBD144631243913BB9D452DC6B42C759FCD01E4D3CEFABF9D80E2A29A6D854578868E7DC8C696738C538695A688BC67D1ED7C7EF3AF687AB99A8B0C691B0BEB71131A8E518A40BAD6EB0AE991421A1927EA61A5FF96C408BD6C4F7BA26835FE71F9EB16F2F477A99BAF3B4DC1DA366592C3CE89BB8287CD8E2942F097BF6ACB1C334270E45345168CD402399ECC8CA5E19801732DCF181C1EC53DBBC61719F26CBEDD581F77DC8EEC036D0B Out = 7D3DDDCD5AAA7E0B1AAB81687919E03FF63F7F4E619E1016EF9B3F84C9680AFA7CF530C0AFA9F990FCC19A010153BF10EB3CA0899A973A66A7A94487F8E3DC2D31E13EC2B2B9E4946BC97C7676E2329F2F42C0FFB14883DF8B449E16F95A6843C3058393E5C72199905E0986A79247D64882ECB6ADD4E6A250FA227253EF163EC548F561CE9A00C43C7D9316E373EE1FB715140EB9CD882A1D9D5FF6805F30F739668E3C8C51E29EEB7DC8005689928D9267E3F74FADFF38107202171C02A7C920E8FF0A678F0AE7121E16D6 Key = 13DF6263560C0A2971FD5B50AABF8A0244958379762C82A2 Nonce = BB4E0CCA3D31EC88 In = 6E804B62EA711CA8D09B7B9BBFCC1EB2A8938A6889BC31ADE4548051F8F4450E693FF9182B1BC1A62F4C7998A024506F4AAA85E6733F81121E6BBFAF9EF2547BD01C40AD657345AB0B0EE97A8581E837A515071D376409CF4952ED47BE5DF95A2E07AE6921C497FF1CB8057E8B8B38D4D8D0D6320B9A1E4445266C66210CCEDB0D3695549CB3D70D56E5E85DA85D2A096E156477D5F4A4B1FBCEE2E36518FD1721ED2504DF5F19410CD9030A8477ADE57375E08DA2CA15E7B85BD010D76C8CE1B3ECDD91B1B970AEC36B37FB32D9DAE7 Out = 0B95E5E14AFB699FA86B5CE3129BA5819814FB7C3302AE95478DF30B3FD2CA7EEA12DA1AAA0100172A3230EE6677A114394206E60A8EAAE1BD20135B5EE425BC6814F2084A7FB5C66B85E6B443D79C68909ECA4EFCCD0347BD5A66791E8632D63640A98076C19D4467B636157849F9BE971124A20CAB9CDFD3CDB63CF18117D547F4A6F761C7AF916BAB021C2AAAB37598C0470E45E672498A0F3745844C89E0E4878C2FF25895ED51681574CBC5A815E38363F25BE1A6BBE01A7897990817661D95B38DFDE40F61457BB40B3CA5AA82 Key = 2E5B70B7269AB9586BF23E8BAE7E9E0BC063957008D46F0A Nonce = 943BDEA705D18073 In = F7A5CCC27DCC097B0FEF1DD3E4FC28C513C17E9C843C97E23E185F403D5282F417640E4FA86C9D53231AA6E62BDE9D6605119528C5EEE8A9A4926CB023D59DD6895F3FB4A2BFF78A63388FC843BBF97268AC6E2E0DEFF46E5A6F0CFB015324616A6ADDB278E14DEF8DCFE40656776E5FAAFCD4E8A72F7B9937FC86B2854F32FB341727F469D323D1BD0B9F9FD2BAE760C5AC102D2EDD66599CB41B9399F2B99FD9D28E50EEE442A1A7F94DC7F0F6918C559BF1BF09A6C6AB3C44ABADB43066317CBA83888FCE81A5AF3AA43FBE9EC69CB44B61D5 Out = 12F3F5A8B6759F29F1AE80CE3A6ABE73802CD1A723E80F83867AC2DE7B430272E6F105E530482D114D1D6E9117D821629DCCA11047CA4C187638F3A9BA8E513A1634A7F740F8EE889FBA8E6E2FFEB7830619C882585E6D8083076E0418C011B095A7CA3D2BA84E224B6C993C6FBAB9585135EAB90B78ECF282AC463832AC2CE623659806217D7B490C234EA58DAD352D5AEB3C84F5F33C7BF9435F684A128CE0F2456FB01AA7527787EAD3040CDC2607C16103F4E5A535B0C9A63DBDE4309C32AD4A8EFD1B8270A8152DEC0CD3892F2225062558 Key = 092B81DB2BD6AC885D46310109E1D53AFFAEA6AC59F0AA66 Nonce = 1713E9C1DC895CA9 In = 6AEF7368204C0B8BF4C7F9D1FBF33CC7E559A0BEFD6B74D08ECDC5BED0A62970E32E011B38EC1BE7A691B877BDE9ABD4A35E5863DE39220635B0C856C87D7CB5C0A6328F27A573F07EFFEFB52A1124F45052DA579805D00D71049B396F44535395D6AA92558CF12CB77DBD1302D9F75A868BC528E9AA0EFE897B01B94FFB29D3084AC4957E64ECE3D1949BD04CB328B01845D046C289B144F5D42B4746915C138A859FF6930ED05AB9AD195758B3D35FEDB0655377DD1271F45DD4C0897501BB50BD815FF6B9705E93625CD8CCCFD566C34ADFD11DEB5964 Out = 75EA8AE76211A99049C39F35780C797221C41F662A988D53D07B4BCC058B841CB2B259204F5CDF9B8110064B87E8236CAE4657F22DDCA568FCE3B1D81E14BC12D1D445B22D4E50B90F71E5500F111F20AF05DB126CCE0BD4613ACCBB180C0EBE16A04354DBDA0E796FCDA0F1BBCBD505281B93E836A1B7505A210EACCCBE6FC35D0014007CEC5A6F0CD664E7BFEAD74C01D6B3B88B86B2799D8E27B41B1B6C100890F47851F0F9C8F2808F76CDB20570A9F4FE1BD92725FEC28DF54146A9CE8142FD0D8BEA470F52750A0937AFD4993A3D872D65EA84F4DF Key = F73F51FFF788A91B32A016648E9086748E6B75180E1D39E9 Nonce = BEBA357FC01A0163 In = 8580313684E3AD8BA9A1F091AFBE7F2170C6B61556646F395A2D4A182920BA82BB9B9334367B81BD5CAE18A279BD55B7F5B639F28FC5CB613C44CB459435C583A5B6EA105E34C6233BAFBF55A2D25D19C1589F9F1B3D254721BA872F5763494DFE47F73EB4088B23221C489D52B0CBEFA53DCF74D46948455F373A95F0CDB3A42B2D37BE00C4CAE1C3E0A9206997E6BA6DD03CE7F76CCB30A1B6C10BF1251DC15C8FAE513B4430BBC39A7202983A857C205C84B872300820036795ABCB443774F89588910BEF0E5808890831D9613D75E11A653DA91EC66964C56457 Out = 07051E15F921E7D97F48C3BA31B5329E8410E45E36634463406C8E6BD36F35D627D0FBBCDAEE49E803625B25BD529AE208E8175EFD101D5826DF8D8A14879A3DD7BF8C1CFCB73F1037447ADED05A71D9B1B077ACCA26BF18B894171C6BA58D9C6608974A1648F9B967908D25DF1F0D93FBF4BE99E81302B7A871CAA59ADBFB2668C0B5828468F7A208AD5538810C31CB2E131E18D008ECF8F596EABEF5160DD396AF5761A765C05D3C8C11096FCFF5BA27BEA42A17EE451FA75E2B7EC1F9D2992E5AF048AE3104D6B70E2CB5FE818BF4C5F1C62233D13CA678CEDC23 Key = 8561DD8C43E15F404B4E48974A581FD9C533947F0434D8A8 Nonce = C5703CC501187E82 In = B4F95F247179350D3E1519771561421F8D6C8F54F54D51FA68D06270FE0AA124E6206546F08490FDA3CDAA366167A2507FA834907BA3BF569D30EF793232D5A27559C8847D3B44EFE20B80A14C2421F7FE110D34FDD456885B7C1DE7CE170510191819FCC7368598A97D0145F674DD172D965A90C3B52694292990B57F32ED0CE7F9CEE9F9F14FC529678E3804821D611DC811BE618FC844037FB2EF1501F591D5CB5F4ACE37F400D0F81BE9809E20FED067200FFB4666E40C5EBF53F779DFF54E8B89FB23D13907930F7D6DC7756512CD9981ABD64A5E3D3CA1B65090204607 Out = 7DA67C7CCAFD319A38C9013018749BCC4F24C89688476DE6233444D9FE8B0AB9DE4EC7836945314551D95D6CC6B45CDD69233C7B96377C4DFCAFA28F93C2271DD79E5822A3B37BC608D6A8A63754BC0415C487D4A90500FA262683980543983BA345DC7C67034E412D1C90522F88D84B088DF3CC2D3FE06CCE15EA905024ABA8166E1A915F70B1796EB1C091041D31A4C870AC18F2D181701CE4BF6B838A248533475FD52120025484DC4BD92E43DA4B576EF0F12760FFD6C566996F27962FB0443F20216039EB57845A5483C1B73A9D2E344928FB58E18932748F2BCBD62014 Key = 52A58D8795CAD4BDD915B1FDF917698154D11F94B8E0C01D Nonce = CDBD875DD5066730 In = 2621B208787D71EFC115DDBBC1594CB99F7F85EB4D853D78D1085590C9B0E2DF4917B94C7CF171F839F0BFBF68A1C1B9ED073B650F1784576ED5A42368FD3705B72D4A9EE3B2128ED2698626881A93599C981FCA80242569F15D3DEF06D6507BECDAB0193301739EE573570AB0C4BE887D69273D7691BD44D2401EAA90AE6666D526D9BA785847C25FF6C91D3EE3A1AED72E08119AEB41F1EAA202BCC81BB0A49153BFB290E7071E03A1F1670029556AC62201EBE063A9EADA1FE08B60BD90DD3C8F6D6934634BD39202BDA3DB7A0DB496643CAC964B20B76B6DD6B2F40984066328A67C Out = 10909490510DA488F96575A0315FBF02F01647F5FDC8A805AC05FF6139F4E102C52642A55EF11307B17A2C83E528F943526D2A8B9E59AB2ED47A250169AD7D35C64C29F5296C7A7C81B6A8825BC0EB4D983003B125C8729098CF3A68F1B02F00DCCEF3A86EE88CA312213AEC4B0DC012D86D89C48118A300F29338CF5AD3ECD23157F6C7B46B51CFCD7E845B016CAE7EE671A736D680D5EC06C68CE6B3855E75A1038C8A425A833B11D544732AF14043A14352D202F3F5C9DCDF0C45E29CFD03FA569A8FD01BA411FB3BDDEC28AD19EBF66B3E2B513AB21E915CAA6C6FDFCE80CE79DA30 Key = BCC08F969399E4AE6BC44F7F33145B1B0C2321D577A75CFF Nonce = EA02AE6ADC349324 In = 8BD4EECE9E921E4B11B72AE59C51C60C541262274F08E9CA850C21BFDBEF5190A69E177B23B180A6C64EF704AF486C93196A6DBCD892F9A436DB0FFE4687C3EE82E6CF38E105A7BF07F99E9F016A25E937E2FDCC085CEF7642DF7F17851887159575531B7ABE751B3FFFE35E627F4A86E7A263A5A41D4938839D31C82C50E1719446B85D3FB56C6E6E5F9789548D8469ED2697363C56C8FD24BC0C7268853699D570913AC858F6F1CAFD84C0A39FDCAF2FDD7AB6E4AF92D2E37F6F85DEDAB8A3433C3E6062F20A738C8517D256167CBD40A0AC3DE23C29E98E0D1862DDA52E71DF88C0DF1C0340FE Out = 8FACA5517EF40BC3FA2A6A7AFF133CD23810B253C1E455FF8127460569A7F90339E6FA5D3DED80D956638E7CB0EB13D550CC25F369C2DCA686A455A2F7BCCD97249A4DD908D9F4AC8AE06FADAFC52E76E6D603F023E8BC3BFD5BB00E585B79E7CEFDA9B747133001B710ACC9EA8B879439D8B13EB7C381BB80A031E95CB5727A62ABC4ACBBE7881DB2782F7155236595EBAB7659B1FA6756A097C0F0AA447C82E3350515C02FD25FB214AE7029422A26DA4D10BFAF8B48CB522C68C90489F65972A21570C23E60ED9ED5330661BE68C0AEC3E6686E2D68500EFD83B32EE2CFE0E03E522849079D42 Key = 32F0B4E2C8FFBCCB7755AA909E46485E6B78446829FA26B4 Nonce = CB2004E37500BEEA In = 5565DECD079BBE370E3C1EDA1486C027E58E50BC8F2BA314E247CCCE3E99AF320EC1D66F3E40418C2739252D97D09A89090DF9166E1C49EE0CB963DBE8689F49BA75E034950D76552F349F7AC7670352A14DF520FAED9F02AEFD74E87B8F912C40110B9D0ED55354235D628B99DCF7482E049BA0B5985031A61B973652ED28E53A73AF6CBFE87F4BC43A896DB8CA0A59E6E42CBBE07C42676C09DA89962CE405324832CFF103B5C78848535923562B903867D7D95E076EA1F93EE55E0C36DC90E9206A2AC1B56B4D66F37024BCDDBD01FA795D6E307D1998C624D4AA00E1574B78A5556E8A586E8DE9585B9E Out = 424373A6EF41676A850D1836DF76735EBAFF03C57750EE74D61BC78464BD9B82C7EAD992702C6AD9773156120C5B8BAE57353A4D49466ED8920E4C6DC45C47D708C5E264C64683B3472F2C45AE7AAEB423ED3F00189B382716C5E79EF2066CD4C10AC071DC354C2E63728D80EE43350C4AFD42881B0F5D98685CEA6B20118EC586C0B79482BB84340B53F8E4B1CC141EFE6211EF6CD75ACD251E7BBA1BC1F53E50C5C0060038613D262C4E0C4052987137562011510E03247A772CB95490391D24AF3276EB3D741A8A6CE10C555F4D5D0D9566CEB69F7FC77BA15E65FE3098642EB7E5BF071EF554B5958C19 Key = 82A6EF12BAFD7699D461AF7338CE13E3752BCD601E00E6DA Nonce = 47555233CBB27325 In = 42D274AAAAAFCCC109C78854F36861CD07A9B0E827188FE94F4CBA603B544A09C8CE0E9B30C9FEFCB8079D10F027288D1D72C8022EEBB4CED8C5BE8E00252B01AE9EA2C5F52725B5F22430335279C443963DBBE59FD5356665DA34F182E24AF61651BF78D823CD35DA526AA6D56344CB71961843CC12D1308BEE06C29D286591C6A9EC564D625443C224B647ABE3EF97AA95E56BF40D432C79A96EF57E9A3A91E7A706D50C9E9DBDCD98259318EC208D6F78E4090D0B8C564CFCD115C0306EE28B146D9A4DF1882B9F871FF525D3B9C3CFEA5FD31301BC35BCAEA31BD4FD15B4446E92ACD7247BC5D546A4C0FC9C1514 Out = BEA9C3D615055504C15FFE50B4A25CA57955958A7F498D32AABA4A88E1B1EBD608455126A77C59937EB0D0CB10EE92D9607CBE85B5F3F419281D984DAF3AC3D23DEC8864FD7663261CF40CD7504C02EBD10CB194EBB6C9672C1C3D01C85A5B0DF43431BACCAC3CEFDC275C388F32C393423B0DAA3EE9C76D48EDAA932B86D9D6BC2BE5508D96F31E7775027E227A4A40314C4D6D096BA8C1FF8EF88EA96184DA0E2C8B070BD846E89EBE92851EE18439BECE1349EEC82054EB452B6DDA35834DB0C3390A28B071011A10D730887F6CD847C0ED613E5A217E1F290AE0E015CB926C59576337975DD63C423A91B6407FF7 Key = 7E1FF62F578C880405AE520FA53BA2F0105C2132B6AFB167 Nonce = 3FFCB4B540A3CFF3 In = FB8858FF168E5ED4B497EE55F9CCEDE93F749155B4158DB4A18574E5DE00C516DC892F012D045DC5AEE72633A95B2B94101519E0DB99BDEBFF448167DAC475D400567EEA27562042D3A111FAF1FB5D3A6FD6BC0F29FF85D23AA959A4F0DAAC05A8D2CF00D29733711EB524EA58C0E0566BA6ABB8BB5AB873F843EFF5AA5AFAB49A31235980E97641EB508B50BC99F0250A018420ABBA39CE95E8E2846B7AE7E1E1CFBE690581D2DEBCE4E51148585BAC6F66D65E3E2C10B84F904F92AA82315808C8F05EF0FA961EB6AEE6EC898E6559FB32DC99A8E5770B0F891DB8297989E2CC7DBE703A536292677E41CF7F0420E3FDB18B28 Out = 03E094A8CA5A895C73EE8E2EE30C90C2B0A10D3D9E67432AD2E91ECDE41C772671171FD84D6B6D660A9EFAEC2C9353FD511D9C2A932A6C8AB4DF0434A950682CCCEBEEE6D874425E0F0287F6872D1DCB8311394AB6F6190065B7D68F0B3F65E0D1EC4395E531B5B5789E37D7AA8CF6B3E41054B85B9FBAB74E0FBE556665A16A4DC3C9775BBF3602378AE6D53A3DA5E6B0A7B399A394AD8D5748BFBD02CFDC4D869ACE9B4B2571CB6E4A01A813E126370919130B4D844FDCC2A32C1895C4687BD1B1DE69C48DF14CFBCC78DF6B49A67D25025204BD2EB2C92AE07542FF64E075D22BBB1A7F1A815DD954A9C5F6D8AA511C9F00E3 Key = 832F6080CEE1BEC955AADD3C785D1BFA311F2967EED12EDB Nonce = C034E1AD1B590649 In = BA5E4EBDFCD93ABE7030828501D28875DEE6CD0E2DCEEFF2EBE54579FDE16878195C7FAACAE794E6C3089AA92954290D65F329C1511DB2B95F0760707624925935044B9107B681F564D3DB09477B5B75A421842B88223B2CB7F7DFDE9B40C029B40D136452DBA02AF1D9447DDACE19C3D427B007F0A737746E6A122C5DA8CC8849BA80841087C4E27FA3771C71AA8F4FB3281835B8ADEE0965676567D9BEEEAC0C3E2B7E844414A0988BFC27B682C1A3D8214C37759C4D8E793E9A275CBFB6D8534536DA22AE947F696AF989A4F1D5202762F2F4CA2BEE376342E041A9B233CB3B7B4749A79B38F822D9C51E6572F8D1AD5C59B8A635A06D Out = 0E78CC6E7508507EF8D3420589DC844A88E34F4F68591E806499197E6C0CD3980F4ED5AC4B82F85720782558D85E704E5D726BC5BB746CE096B1E080C31F0D70FBE9BE28BB8C7AA5BC6A460A5C7F6E86D7BA4F307CF5F7B9F1E9A4C1945A9CF34F8DAEF8CAB0E52767C866784E7B944D41292A708290ED75B7EEDD5AF68113DD2B7AAC39DAFB865A8B5800DA465F70D527E417E0D13A9A8A7DBBFA83D9FBEA237B518C604E73C4C5C34C1FE79E230C71133FE97EEB723E333E8D4272F973CDF40C361CCCB45D4803189CA3610B00F422C847E512CAFBFBFEB81912649A9264946B748395CB6E96A79FF195D8520B2E60FB07AB5A5DC58D8D Key = 8B0E057E6B9953488C98A8292C7F87E0ECD574376C416AE2 Nonce = 994DEE000EFC0A43 In = 6A1275FBC6098126FE0D33265FCF81A0485776A0967763FF22B12231B34398D628D5AEA33BB989BAAF759BE8A07103FAACD7D68A7719E23295AA67B940285400833D7E322D5A6F9350F2B289F67C25B86138CF29A2BEA8F5020D0087B02CD42FBA68AD34A7C0908608A64F4B5F4A7EAEDECAE68D260AB92D172CD95FB746263157DD1679BFEC2741D5664BD8A80A1C95EDC6D9E35B040C7A38EE1D06B9BDA80CFF8CE8555413DD1B40E377EBF76150F223CDEA9E74F2AC07CDC6E0426CAB2DB813C6014D4296F86ACC0C07734F55E4A5DEBB510C47B4C019D5E59960A7B3D5B87257839AA29E6AE1F9558FF072F2FE6D8FF672525BF2BC056B206C1D Out = 6651BD59D1DDCDFF52EA95DAFFCE663758BC46571E0CC3F2CA83986FBC2CDD7945A1D0284AF73D371EAEF53C5A405A9944267F3DA755BF053EB94518ADE628E8CA10A936FD747E64C48A83C40FEDEDDC5959735E031B41FF4422BA64EC906F14256673CF4520AE76F10D910DAD129C270392471FFDB1CE601C53E9C032BAE528F68BE2A553BBA36EF555D4A8D6D7F8F43EDD91AF6AEC19DB3FB8FA1F33701D6782138F9D5F7FBC9170F50BD02AB0DE07A29B4A9C3CB2981DC251E5933C17942D394DAD2784B7AEA3F0FF46D59DD919C7C2BB3D3D1B3CB541920F9624EDBECFA2414B3E6A6EF69F83F20628C914F373E5D5AC68ABEA3E2AA8A5CF9D2D Key = 51F37FA4348F5FC1BD179FA259358A009E608B35AB363DA3 Nonce = 2C5CC0EC6434D1E3 In = 234D9E59F8C211DA83A8145EB1887725530805EEB27D19D77BCC951E6F8035A5452C290ECF72C5E69E030824D0F1A2670A817B0B6C966A10261A64A6383571E8BAC63BA9CB4D880A27C583BFAFF3FC5D373E0F0BDCB8E398F99021DD86F7FA92DB3D4830F6A29DC7C52C1556AAC457FBB679EC2D8321DBEEEFAB900D7E02DA7A2957F18D87DA97B683696CB6E3A3CDD12A5ABD32639DA7B1788349C98A05170CADE1957DD983BB109BDE21549A3C0EC290807DA2917A79D143B9F1C98C4D3F6D57E38D03F3B2473EB15F5F318E30C33F67B0DF4F1C79F56CA1D52E2D77752C259F47E219F63151DA18A55DA0388653104DCCA9FE04B949A57FFCBBED59AE121C Out = 3A89A8A7DA09A31F0F6D222C293338527AEF97944C7862AC1001B2E26DD828608662E6AA71B3F24337C1233ACB49D633FD743D2B16ED5C429D4D0087DE42E6BA949DDDB4BA562BA277D951936F7AA9CECDD02261E5F36043EAF97511B65867E965B2A5B2E8AF4DB5629C0B5E5F869DDA458E20A3DB4D34A4CE1B1642C791407D83E3EA46DF87B5680F06CC1A0F97627163A54A6010A60F37E93A9A3EE9D97BCD9561DDD12CAE952480ED2C4180E051652DDB00FEE1053F3E0B822D77DFB2D3479197E0E8353A3C4EB4E21B594EC86A8758ED48B24BB2E1114EA64C5F2C001030707A9896045EF2B48F8127EEBE2B76A32D698E39CB069C67B971C6BE57678CDB Key = CA7536E20BDE645FEA57A3BBEC79B7D744AF652A55998114 Nonce = 5CB81DE076CD674D In = AC691B1AE64C871A70F6436E4E65CE0E10A692ED41B5FB07D35540C7E2D0CA6B7DC54026782D70AAF08916CD340C5140DDA2E27F0CB93F804D15470B17C62E0C5CDA2091C5706DEDF94F720EA7F76370F2EED8830C657B07766689750D30D0DCAD8EFCADEA596113233FD328B0053A10486F13F3F2644386D4B177BBC70815E8D2F847EAFDDD2ED9FE418231597C958E53DDF0B1EF8E801654CA95303CCD0ABA7FB4DB4B34B199B7DB2F0727C89194F321353F842FC6AC5AD2F6ED982CE27FD85F8553265345BBFE00D316D7B6237010A93D1967D02C4391C1A10BCE8FDC45B32AEAA4A61BF99C6C3EEC6C7DC1E82B274A97F47513BB55C7604992F0FC2115519D02162F Out = FDA6F4772BD2BFCFFAC7CADCA4002590E2985E00C3AEAB56F76B4A3DFAC439267C22792D6DC8E05DCB7D2D79C553BB7BECBD330F4AA4DA20C26E1C173A6A931AF7E98E4E9ABADA91FE3C4ED1E718A85283C47A289779B911E9A806499634C7BAB246DE4F09EB3616C1C7D2C8B7498B2E57EA7500CC538FAB913F655C23ACC9A4BDEBB2125113E4FA3A9B1B3A607AFABA5A6043487FE6681152BAB584157B282B2293CC80CCB8DA5F8593016EEFDF77784A516569768368A94EAA9E6163CFE45759C09173449013EA16CA4D4359AC9A383EF8A3A05FBA28F3A6C45F0F6BCC384FFCA5D5FD83EC79E528AE29B0BEB5B32D7B6596FC092B141C831EDF5D41CA586E8C952243 Key = AE1AC30A6AF3371429672219CC6D777FDDE1C1285446D5D7 Nonce = CA8B1934A27AA9FB In = 1C640B4A7984BDEA3F5F750C5F36EF29BE31864683A8773B4F7DEA9F892483F03C56426F2772EC33CBB90D2BADD731DF6CE09EE74578A4BE2D3E07FD2B71836C82AC48B02465AC8EE4BB783DF66640C51D145FE7C297ECCD40BE49170F910BD3BB0DE70DA38F71C53EFF59237A7337AF6B22CCE4C724C8BCC3891394F29D9446144D1A26ABF6E04983C99653FD2B698AF15647F8F94304809BEAEA3A05381A35994D5815B404D9F8CD10C7EE62BE99FC29E06F6D07851CD34964503BBB6169B91EF8AC411FA56B528C1C5D269884457998C4A6000525D7AE70D442609503794645C8AEA41BC793933836CA570CF75D9A5E9138B6907BCBE07C88D4C1BB1F588D186BDFBC8D96D6F6 Out = E369F46021B17D34E30623D14F78526C89F54AAA7017447A7AE2BCD478C425D3F54983E9FB0963F8AFA3673C3F2DB38B3AD8D0F73174AB9F649B3FDEB40AD56174F289A7DABF99F976CEDFE11EA6B8B12F239DEB2DBBB8E829C9E8491C49D6A0EF12AA0404A7957E8F67887BED1A559BA3DFB8ED758AA938F9AE86082D2CB76902372455C129589B1ABDAFCC11C6E37E85F41BB5A1B5E7FAAB0653A6C370EF0413AB4123061EA984F804AE41121D89C9E206B4D5836A8B145A599C0AE79A61F65CC01C8FEAC1D33A2D703AFD4D5F0E5B1634DE35BB79A0588A30BA04287C0DCF8AD9E81891A70DA0970DD21DFABD2FEEE3D2EF6CF66B3FA87B0B10C6B92950C14733F5407540B52D Key = 621707897A8FF24C3E8E3C6DC8E7F06E7C9147F5FF6B05FD Nonce = F5BFA58BFD2717D1 In = 43544DFA22889BE0247AC5A56049E26E7F606004B8D4BA3111A94FAD81F7B3FE93D231CD1CE7658A26230C76F6CFD8CDAFFEA88ABB7264427CF63A3A3C4A9A6B01FA3D56EE3F618A18CB4BA88A311B30EA55C2CEA8AD8DB65D564D5F5A58D9E412E82525E4185B5B4170172EA69B1C573C9F6A8156849BF2452DF82301E3DCE6EF4DD2642968FC418D97FB04E25818C41EDA3D23DE5F91329A9819D88B3EB2CC8037BC45C0D77F30E8248F946438FA9709A995E2EFAB9DA0F614E04ECE2A76A2AD5991557630E2C1C04E1816CD08683B16C9564257C28FCF81D24341BC9C4443090D43E98558FDA5850F1F76A1D150BD5F7284B55A971DDB2E934B05523600DE7070EE002C3F4F34CBE5BEFE Out = 9A8E2F26D5E0ACCA216FF6BE29CCFF21D126717ACFE5796E72639AEE4856D043A232F971970558D8606BBE267EC0CCBB584CA96792E01B522F51B4F0A3ECD77F44B063407BEBC74B9A920743E2BC7D93AB3DB84DC20044F699E776D58A01F78776F03F0C5A0F0F8878B6A32823D0E332AA030F64852BCE48A5509F2E37D866651BEADF1BED4DA0A0B02A3CFFF9C36F6F59256DD467335A60E9484220A2771DA229D23E12B5FDC2595BFDAD34F0B8DA138D69D820A6E1DAFBF89CF37E82D7008B28D233801F3ACCE6F53CFE75AAB257AB707CDC9B6643CD4A2905A9454ADE457C92D168B818D332FE749FBA4DF9A787A410C6E9F50B02F070786EDD812EF03058F95BB542DCB16770BDE5B0BC Key = 7D5C37E1A2450913AE41090DFA935AFFD4CA2FDEAFB49436 Nonce = B7BF5E2C46E32068 In = 615D2D36A997D95EA3195335368D4E7E00324C9A6158C06E58730740E0818F2A2FFE0B9A383754E22EDE3CBBFB7834F387CAC353C83A943104EF15254A468E55140FD516EF90AE2707288D6F898638EE0103E6014EC6379D4829BB949EA2FAEB498F0B67A06CF6BF7CDC46CD6ED7B10F2A18339568B7D66484EF669619782E2CF8ADE1181CE2356942CD36758E44D11E9E2DDD54B16EEEB7FFEE6A18D46AE6BBA1433D5B30EBAC173C028E8861E27249D764330FFC694BCE053DE44EF98D2BC27FB04676AEFA2FCEA016B37CB5F128063CA60BF40939F688B2796D01255C78EF96506EBC1E7DE11AE466A8D2EBB135400A16A5C5D7DB80690D2636C0C912ADB98C27C65C8E59DA432FCFF17B013CCFF7 Out = F73A0035289E85D72C8D977E4EFAB3998F19F2B63B89E9FCAF26E7EA7733158F931099AEC9539DD337EEE372597A61E4ECBFE61DEB55B5005E90B33D743801CB1F1B5C99169DBDE75F8FF22410B6A2EF0EB097C79A3FB7ADD583D72D2C61800AB2DD2632AB14A006CFC3F259ED96604DAB8FA77BA56E9569A839A6B0E58EF576C46DF43A09704650FF9530A8E4D092DF1801B6E82F969E5E67F4EF03AE22D3C15C91756A465B7C636B51D175DC6A2DCD87715F78CBBDF7E22CE3652929860E94A6B6EBB6D9188E15A13D3CDF3A5971F347A687481D68FAB9B6ADBCA4FD3BE8AAB0D8399C2549AD6DA76917D49CB4BEBA4D12B6B5201272993D2164251E02B093706C280A6C90E843C2F1754404A47373 Key = 87B28DD21E1726A0AC57A9F243B232E3A46C6D064CA39253 Nonce = 9D36D9BC1DBD0EC1 In = 4BAFAB7E53594A75E17DA9B26F9602B1B2074E23C688D3EC32C345074BF3213DF7B1D2F2639823C1FE8DA4DEB631E13DC2230CB9A39FD1A37F088A7DD154C66428A0A16F0D833AF3F16F5A8A5154DB8047CE9E011C71D785AB755BACBD33CDCACD8B0708F2BC362BAFE5254640F9EE08C3F6C8992EBFE34B802374A34E97C9EB9C5FEAEED35DC5E0EDA01DD818DB69BAA6D59AE8A9DA52E5A050EB9B6EA766A465AF2438DAD5587D10E414CCB59F6BBDE7E677A85920962B48C575DF4D89A820AB8B02DB4042667FBA2861A495EFA045235E994650D286EC5ACF753608FB2410158F5AE557A98501E94CE74987144536F5CA787AC064D8746B561E2185147AA184C376C69250CC12CFBAA2659E3D14DA0403F8C0 Out = 9433395CA8E804CD7A181025AFCF050D5EE235E66493EE5AF8E88ADDFCED5651A7A9430D2457C98B162E0C76EE05EA2FCCAFE2C1B3438640B564501408F6FAFC4F6B995465052CB7FB108F6F94A088D648659BE9363EFDEB16FAF59E2AB6D47B4272384651614B82A292C8A9512A144162E8F7814980F82845661C0C3CC883733B54C9A8A87A026C315F74A8419342C1DFF246128418FCDACC6C2EFB286DE7450B8BB1B992563A5C9120A1FC70425CF48C7012CC282E3B81289EF335C628A46E4D7FFC0E326462881DFC7D08B44D0061DAF58FED53D4FEB9FC899D34BCBDE3042454981FDD354F159E98CBF530809B5B46C81A6F866142280610DFB21CC9791C39095E8A7ACA7557C40A340C87B35E8D00DB4E41 Key = E84CA677BB9563FC2965F57DF2F0D9B78FBAE62EAAF71224 Nonce = 5F5077413611A4C7 In = F6EA75879B0600B62F1300799896F7B424A4E2ACDCD8FE5EFEE417C773C9B09A648F010F9CC695A3342715C6568C0AB6853FCDE462645C2D549BCD36673DA23E8CBDF5AA302E10AE04A1C354B619D72993F0640D828AF8D04CBBB68B1325C1CC28627EFC445DFB98E2D199CD250759AAD254B161AF3862F57D4457397E9D1E041E8EB5539360EE8FDBF73AB99C8294A6C6D09A663B4D86A63741AB55069C55CA9D161561D7F97118455D4FE71EFF91017C50A1B2F8175A8D09CC6C3E4B51C5BF2C49EAB03D9D2C01D36C5B507BD17054091C12B0E4C89A273478F6849DD16FDAA06E2F54F615C64B0BAB4EF8A1C93DEA8BC43E0555D043BD79422450AAA64CCEF24916C8687DC6B65901E58CD3A8F4F18CDF72D0BDEE7420 Out = D15BF53D4D44F0A18B70D12BE3C4A6DED44DB06F553740DBC07B327C28C2407560DD7C913F5D73E582885786E4B454ADC40C156F75B7146B8A618A9BE43D6CE205126D72880E582F8384CCB928DDB371403F307108F3EF6DE85CAF538FAB216362409F99DCDCEF7A0CA8E1D9662240C193DE430EED6B5B15B8D3C2A90BB799C7D37C7445C3994F727E438C9ACEEBE89D2F1449D0E83DB2523C063FA903F8A1158FDC7CDD21D899A6C01B18A8D1E1E749A9E09F49BA5331914993B87FCBDBB43ADD276789952B520EB6052DEDEBD3D91A22437365FF12A46FE9822AEFED416AC415BAD2C0848A11628D14794FBC83D1007F0E23449820290FD81DB2896EA623094B8F9B1F1E903279CFE34AAFB287573574CF65C19EE5B709 Key = 6532565097C11A19DABBE33579B118B3CDFCFC57AC9EF78C Nonce = 261FF08A8A234373 In = 1225D5D4FD1F49FF2239D496FF327DA3E2C528703414099FD1400A024608DE7B78FCBB9741BE38101AAB6388E54100653AE15FEC668FBE9F9BBFB39C72484CF8BA23151A6DC4FAAFB627F35CE91F1B2BE9F3B1E1DFF258C0CBBAC425F13A56067C0CCC297FA6BEA5B97272C716099E9784133732BC359F67A2BCE94E62C7A21DCB03EFBD1B387A3D94CA245973ED31BB2EBE771F11D69BEF0C241AD339F7D719B892D37597EE729830602FE685C9C55D8420CB3F4B6DB04BA14D5DAA6E979C0C113270ABA4601B8B66B3C8FCC3D09FBA846FDB22F1827EB27EB65BECEFCC5E48B75FC4023CA0934F71406633C0EDE28D644472A1EC3C218C081752F41F1FF79657C513AE4694522B83B5C5D0E3F4F22A237654EBC5B64C1A032DE611 Out = 93E4C7F2BDB46F448FA1C987D10DE2CFEC3B48BE384AA4931F05759A3F43FA7C09930585F0D113273B2B0FC1350AB9615B852C2598F190108D6D2073E1009D9230B0EDDD2AC6812E2EB3939969727FADE44763A83A585416CC2A3357BCBE8D7C4285CD1A3C237B6EB2A31C73CF7B1C935FF9EC27D6DBFFE2D7D3DDB19F11678AEA84A13FA19CB2A574FA324A841709A171F0AE6D1C661089EE817043A56295F734E69BB7AB06684896C308EDCA833B61A1E60C39CDB3E69955FF29F350CD63306FFF655AB0F842ACAD1480808E66F8EA32E722E325689D14F9F5D6A1370D1659D54ECFC326647F5F860C9CEE7CA1E9D888C5B99786278755164B104F74BFE3AB408683EDD67C5A9C6A0DD8266EBEBF4A249867DD3C9EB51FB2CAB9B2 Key = 4BDB2B06847394FCD4EB83F67D41F06B0F111956FF1244E7 Nonce = BA6E8680024B3FC2 In = FCBF1E7B10B708FB50FEA0C3CDD48C283F47524160068710A1A13742221353B7BE18919379C0D55464372643E16A0E6C0FB02159E627792F0BFB2DB290A990157006EED144F382E693C8C3B170E7FE2B19F9F79ECDC604427A45BD472D8977983294DD36D081427D046AFDD637592CA150A9E0139CE6D3560BEE9853BCC96A1DD8C7F194E59312EFA76895EB110417837D95417A636222BE47DD1D2DCDD131992D734BD3E67BCD7E6DCEC606060D9F8E264AE12C047F3339BCA9B44108D469B22F44DADCA49247EC2FA1C76C396737E40149AA535A1E7C05FCB1B8181D5AE8BCDA411F616B307B19ABAFB36643322A803B1B46A477D0D1048625369CAC798BDC937F8E726D59C635447B667F125E26303AFCB7DC0370160E6152E514EBFF9020 Out = 63A887E0D27501AFBEE5A1ADC4DCA5443F9E4AFE1466D71666CB28A22F1D4CA0913AAB49C08378CD41E89035FF15E4150992528AC15300E92C1F73CF6333AE3F17898DDF031712F6A0CFA2147D435AA3A69496DB67FC1789C601AF00C16A025C93F64F1EB7CED97D4E22079CD1A422E3212B55A8687D191C295FAB74DEE44A0010AC51E167F080B4C0E1DDC6A26103FE61F02EB3F62BE3DEA3D9A056E46CB18F154AB72DC93A9FA16C1372FDDC1CBF7850EB671440E1BC6B065B897ACEA27B150A26D135F0152EA998AB004B16E543C2E401B8C8F39F4089911D84E1D232D4FF8E2614F0FADD57F8EA4B0AC90EBC7564A604128227B64BC534BE39B474056D8846D24604172AD1FAB6AECA830B74DAE1FC6FCF931AC3F95E9C1FF325D6B65AFF Key = 2B77F833E806D416FB381A09A6D05116AC049FDA023A5E2B Nonce = 13D0606E5CDAF6F7 In = 3DECC0B1CED05031E8FD762217792EECCAAB16D2633BC19F54C8B61AF8EE91727F8E74D1AF880A72637326E1D78D85C72D8150864D04413FF83D7A2B0E3EF7CBD9568D25E3ECCBCA57126EACEE14E35AFF3F052029A2E2570382E7E4219BE8E1E30C0656320C3E4B5E4B2191C46E3C5FCE6450B766B258A89B0DC09A95F9E85E1648189A2CDB5A999846E9EC8333782701131046E286D0459192D70279445A2B591CA7D5AD1A95022D2B2627772AF2A6D009B8EB1E2E4E6CDDDE3E85033CBC7EB61C6B77011BCB96C93970DC9A921BE397466E21D418DD5A4B3F5962447580730677E3CB4671050B6768470F8F3CD9742E7B9269703B8227F63B37572AF7A60AF37F6B3F53F3F3658B06D9B7FC860A294E47480DF9237B53885797C4CF580FC907BB188C Out = 043AD473EDC7463C7A8864B3E5DE8B0B8FBF700E7E5654BBDA0214B680488D20B9F02D931A8DD953A5D22C9477DF8E99F1B55F863D96DD285BE49635364B165F02E3BB45FEF18C8BE5EC665F96A36F4F2CF85AF35E70A6F6EA756398294842C2AA9696EE6B7157A47D381E6503B7EDB56754485BEDFAA5F125EA50C2B7EF0024EC62D0BEE490C516F1763EFFA23A2772E841540CEED0733C0B6BD66FF2D3E317500BBA4E8DC019EEE025B47E62BB4FA2157A938BFD0F623C85DB379EC731CDDF7E9F924DDFA3E6C5081ED6C6C88BE1FDD62611D66E3E019DF0A9B9671302225DF0C5292E7686D82C422079B85676DA81DF752A389A51C2BC2BD177C46E753D8F34FA038F6CFC3CE925C84A0894731DD3D188761B9A0F4112253388214BED7DB881730614 Key = EDD9BC31C48BA0254D32D297D7BF8E7253CA57041665D5B7 Nonce = A86D049A6B161AD6 In = 7BA7B59BAC0A8C726B383E52F11A995405835ED09DA1EBAA6BB0F208EDBA84F8B0C6A2EE46B817B6CE76A06CED89A0B01BD355DF6448735EE9FB73B2C7F8A9F0388908546B539E51A7A06D6C53E5CDA9BF46575B28B92DEBA62685B0B5FCB55E4395EA38CC14070F51EBAA40F67E7F4FD754BC2072FC11AFCC1C3F5159AC9135AB07005E77017FF4428F375A0F6EC9E9E1E6BE66DDB4C2BEFD1F4DB489236B3FC2AD63165C2599147C021E54010297BC746A4D2933866F963A0C9A81958458F59E14BA4756B71FAF702B9812C4AD2E5B04490C0EAFEE74CD95F1052FF260BE45CEA022A0C0E524A6F2C9CB8054A59702D02606EAFEDB322E001D5251A81BA1CE7B323F6F663A4C079F2E3887604581CAD699E754E5743D0D40B0F24CC3B0924DAEB7103FBA938F4D Out = 14A45FFCFCEE25886B7067F1A4FE029AE21E7343CA9DB9242ADEA2B33221A5146096808C4B623F24669D5D65B9BA4BC063920C08E51123D01F6CCB00A42984E1CC8A7B408544686E7FC1E79EAA64FFBA12A012DE56C9FADA55F56FE79726D3DDDDFE51E1549785F40DB5C2D5F6D2C49F9EC87B13675E2D1C0A6846EA97D8ED65FEC59D38EA10FC038AA1BACA09A3998C2DCF2351B5B56AA136064C4FE0644161DF09C41564186E2AE3A25095176C0AC163BB28C55181B6AF8396C21004BB00549161608CE44BCFF29B72C2F22A005E2B7D71213BC8B7417083661CECCB82FB7BD615B0D93B40A09ED2830ECBF94ECBD6C25C3289B6A79DF46A164B19767BFDF5DAEBADA5C5B9C04B8B288154009D52D21025531FDBE5CCC80CD79BCD0CBA21F998A05B516C8CE336 Key = 48AB74AB57DE668C6FD29F1C98B730381E0763913F7E19A6 Nonce = 7277C0208A8BFA09 In = 3AC25EE64B98F11977CCF9947978F5EB570D35F0CA9DFE2742ECCC7CE11FD09C6E921011EBC965161A0B932650545953168AD660BDCF4F88618060347CB9B4114885EBEB0593B79DC00D358E6088B312D764FBC4A90BC3B31CF5B96EAAE2491FDE168941CE3BA9BED3A5448681750FA7CC7294ECCD1CCD6A7C3F4BC106922055933645B8E298ADE83C9697EDB48F2CBBDB42FD70F6CB98B38E1EBC3F72DD77A84188422A5A3DF5BDC31F59B30BCA323492B4F253C04766C7AC09B6428965158494845B4D3BD13F36C549D030248E7FD19CC102DF2696C403AF58E5DF0854802FB1646921BD8F38AE62A594CE32AA0221C521AE4153CA6B0178DFBC0B96F0131BB4BAD83CA4199C6A9F30867D036CED549CEF76BE7C62F94F15DA0ABCD28514CDDC0D6955E162779BD148339D Out = 46119F1EEE4A5F47BD814261A0C6BD218943EE4DADA6362BFAEEAF4D01FB8D6AD8BB2B20C16E2B8E73E495BEBEF3C935E1FF49B00EBBE6F364F38B3AA3E628AD214D95EECC6932DD3916FF8758169091EB1E24226501D94C67FB0C8A69DA693D659A988484BD5BF3E6C41B00840838E5BBDCABD61868A3B2701F7CE9A6BF71DA44CFA116A46B378489F41B3FB4D004C79FB5C21321BB65ED5F9BAE24C5B558B7642D46DD14C2B8C9DD04F68EF91A703C45454B5C12AFCB66E4DE5E649614F09ABAA1D3D1D75BBA2AC6871EE1DE4577A37D535653C2D24C6ACF1DF665E297C135F70522477649C624E7997BC3ED8B99220E675CC9B1F2CD94979BC9B393E7A1869A6BBA8CF74CE041940566B5200682B19CFD85065EBE6CC64F34DBC92A9E7A4485C81D4C64975E73391AD83B Key = DDF2257D6C7E3735A8656AA5FF8FF253FF3E2D83385492E8 Nonce = 3FEE5005E1B52CF7 In = 4C44EBCD81E742D2B08DC7DBCC22411E92F57D9FA9AC3C7EE93C8D176A62FE2FC7FAC96B77F98AA3776F7A974B5854F229C778DBAA0F244F5767A42077A7E5A4A5BD3BD8A393C379D9C810DA5B6C97CEAA750F638500194499D439BAB2EEAC83CE6A51BC1246A4DEA5BEFEF0A90BEA5B818778CC249F68D1507630D2E993BF154907A5C40F8CB0FD2BF88F5A59F6ADF0F1F5CE9DAA04EA4EBE16F041E321DBC77ECE9FA6799D097F903BE1B108E153A941CA0C8F1E02CB8130D6BD8C281FF8B3D9BA7ECBF10FFE42EC66EC90A12A8A7506A929101E0F952373BCFB3B41ADF70BA556D82B190E986AB1A8716161F7E8D33AB449F7E8D898D8F0AE1266437AE290B23E36677657102FD6B0C3041F573E19234983202571413ED54B2F2D2610B9BF69240D8CF6040B3ED4026A992FE89CD2 Out = 4478B18390CAE6D3E435808A3324BCE26AC469E04D9BD81C9C462DD1CC631EF25881F29D211EAC5079644721461D55FD70806BE9CF8EDC8E9BE7D9580CAEDAA1A03E6B63165575E4898C0A85DD8A12ABD09431A037EDEB6549E6FA92424C76F5035FE5A7AB183A28A212A678C97C53D95080AF4C5170CD454CB11BB5C57C7581394441DD647DE9F24E3962BC1CF9D011FB14515BD452D93BF16297E0931DC0072CF1269E33DC40FEA1FDAF43D33E4B46F009A8E0DC2FFC0E70754CCF3AF4579E1251175D2E29CA7AA9535CB9084EA6651DEDE9918A6F845108B759628F74BF0A3EA029FC3AF80B0A087CE9923CD0B1D181E8661BB55F2D3A8503B5E03FA24595776760C3592796879442B5CC2696633EA8D35566CCBB532B667B2A09BE6A6CC7931364B42712CF6DAE481499702077C0 Key = 182A5086C289C129D13D2DF876858C0B56779A9DF2BCB89C Nonce = EE531FD00382D1E2 In = 8C59975C6947091366941557DE83CBB2CEB8B4E9439B9CD7981676CC209BE56CD9D6A37F334E0E83CC2F94AE5041A62328A0400F910815AB90D135F72278C97C2228B8D17574FE907BF9FE1847CCC0E125AD7CDF9361EE9EDE30211077E6F7D22DF72FC3441DD8E548A3E668F67E7340496E8080B60129F77ACE77B86920E553C7630765620A4BE0DDD04DB1D233A61F207BF5BA5F8EE378D48D60F8CCA737429C7DCCD0AD14B3C27552DEA11682781742B5275D689DC52B80F99D743B1860C2D6897F6F32CD203C5D6FAE1EBA0DBD0DBB68EE455B82BA9EE46B0F427CE1356D9581AEEF491373A02073CEBE04B22A97540188C226540F048C49376B1BD2C3CD60D90B27B66907ABE96B9F3BCB324265383BE6F9B4FDA7CC4EA5BB119D2B25BCA8B191D0AC899839E95827826AD0F4A9A2C90913 Out = 2D4AB476FD236B6561A1A91D2C2A1F57493E1060DAA19F4A633A2857B07FCAD534443C557AEB8C25AF0B6DAEC2C47BB0F12192C6CCB7A03F99D840403384A879832A97D7557F87328FD58F103EBCE3B826187C3D879B1F3D80CF08F41AED66127CC9B9784E53F8610364E16A587EBEC13E22ECE24BE3F9F3CBD6095430B381A8B62838D439B1D74F9AF503C06375BC7E30D639CBFB4F6175E520FEE2BD2F0470DAF914AA94137E90408B48B17FDC69FED073017CCF16C56014F531D343D6A960CF09053CAF6FB9E15257D40AA29610CF644830C0CA5671B0836F877AFCD0E06A2A437F299C3CD31837D719E8B370B96BEEEA44547606383B6418A2C8BAE9CA76742E1C5885477B7E718996B3B17D74BFEBB87292518DDBB349209AA7C421E3EB7FE93E9197E671426F8AF63AD7C60829334D962E Key = 9C0AF3A096ADA3E92633F7BB7B2FF15C94F3EAB3BFFA83B3 Nonce = 53A6552D82EF95DE In = 7155EB9E3EFD5AE2DA9B60C2F00364B00C002215AFD91E3BC564D9E436BAE0E5EEDF8C93C0F8C72BF35E22A8B9D4700487BE870527CEA56391CC80F2E848C14CC24A0FFBE4D743C256064B96DC3451E4F93C1B79081A2501A597509FDA1A2E9DC02CCB49F1DC2F0623F3A56972BF3AA21D4EEC2D3072395BDCE99F909B611903188904BF24EAB921E27E061C75C40937EFA66647AA0BBF9A2A8C088F08F497C2E2CB9839FDB1B0D68652391418A2CD664718BA93336F5511CFA9504D92CA14A459FAA90C5FD724BF8F616C6BA695F75B361865154EE6AE0A2C7A801BB051CEC692B2704212A1DC65423299209A959B1A75758404DB8D889BB6261B444310ED9E11D95C1C0A138272F19AD025995AB8F44729FF6BAE3D025856360C1286DC586E0B64E898A658330E6B18D127DD8E13696DFD750A14EFB724 Out = 2E7FAC33AB17984A53797887E665A5040D329732815B9047516DBA272092D7F707C9659D7AEE0C9487F1A44D2BAE2C1DAD15E3A4D7CA317C9F562739031D50ED6391D67083C15432920D35A66EC7AF77A293B3B83F46E905AE05512864006A9BAD7F3A317B9322F0F19492291E88EAD6D494D6A6C6BDFC7719109669E40B542B313B4BE2A65D495C25AB42A034CE10BCDF8567DA3044E9C040B905AD5C6E5FD3E7974B420108F839042946A0297B0FEEBCE5173CA8F99E877FBC8CAEFB26BFE0452E997C7B60507B5F18561308770B0559A86C7F789A179C05A78DC5ECD1E7026ACB510AC672D53EF6A077F99AC3D3564EBE697928C156A94C5C4CD59DD5002A8ADA3C81B6190A0CC13F423BD7A494A98C84ADF56748103C4AE0748558AC7F1E0CD0DD29A513102292A900B9E1498DA77E9ED1C65091B6A8 Key = 9D23110F8F59D9F55823EB31C933B55A8EA284B0AEFF654E Nonce = 0164755CBAF55AC7 In = 5DC9AC7086EBEDDF3AB0FEE8129617831CCB2192EBD42CA4F5196E4CB55069860D68D4EC183FD284E471CF6E9361445EDA907BBAD25164F0839EC3D2CCC2865FE14CF7387F3F14A85E8EF447ECB55D3605D65CCCB6258385819A916324616A8C57FDE027F7F3C8A591C22C83D3F337F699C21CA5A301F469695865EAA89D6D268D5CAA2B3CAB311F179E5254C1CDA4E8A21284EFDCBE49CD117AC990ABEDE4C0DA999912F62B1094BBBE37EA4B5D904D8C4692F387D55D1F87A72D597878D17CB9188AF62C313E8548C8CD16735D92F5C1866F2139EB2453B91A1C9EFEEFFAE36DD3F1B81E35F2186A63CEF19EEDDFA74B6BC90094DFD555B7527A654741C9A7EF45EE962D1FB5FA7CDC9285D657C9E43E1B0164F64CA2A9735F1B48AD06ED066A7491BBB21C67321DECF31CE027835ECF76D296BA2F842AD4A450C4 Out = 30EADD3110B2E6603EF5248E340C7FB693550FB0EA21C01F1DC1D2F35CFE18025FB1C96CAF5C0E5F22A6C5813C81EDA92D0582A3AFE68F4B9AFC7C9CA0CE4DF730D392C9B7F51B5D19EC73FF8FE1BBA520747EA1318AA126FB7FD94F700D08FAC59F7EDE8DB6016C308767B0040D5F85272EA1F9183F5A4E62959A0A3E43F6ED30C367A3A7F9B0C650832CB78842ECA78E72C707B7ED0405459E550AD6ACC8D9009342C86328E69BE238AFDAD8462580DCDA1340C88E93A777ABF14D8A5A4798125C9B8776237AED3D4902A21FC8E54A1D02F46B11ADAEEA85FD0274F39647ED9F1C6825FC393729C0AD88706D0A0B1503951FB6AD606C6F13A8EA546EA5E4E2877319E3A692E482002E50A1FCF8F7AEC1C289BEB26D69FF203961D64A973D3C93455543CA3267B0F9C671A1773F1AAF1B7452FFCF474A1EA17B1316 Key = 191E940A45F962BC4FAAC5E1BC5059F1C3C0FA0915AD1679 Nonce = 3D6557C0235861CB In = 9FA8622118B9AF70E0DA09BDAFF78886B3C49CF6FD6F27A7378C72EC153328F3DEB71BB1E8B27A0670D847F4EBBA1166A4A0A43C9E83F5E4A80577A7FC217324F5528023A87E6F030425FA4B328D60BD821BF03FB719F994F3E65756E11234698312B65C5965A386DC05B0098A7B69A9997811DCD28299EDA2E6F27FBFCAB280FAF0A1EC84A8A6A57392F03D3F721B35951FC6949F67979FB2799E7F30B2129A2A51D7C2F77F2AAB347A07F82DBF869F5EBA4DB0C12AB55627F92D7BA48088B1D4913629BEC1410AB7CB63F5E63192D9B128C08C39ACFA8895A59202F2464D6FAF26065440C8F6A53DF4ED4845BF04BE313E4CDD887C5AFDEC7725C4E4D8935E41E9E5F68CDAEDFA7B18D8CD6DF8E7C2BD87F2607E61C4425FDF0DFA85D610DCB9BD2B3147A1B7598BAED49BC0D59954CF47CCC878A8060C735DEC2FA0C738D6 Out = 09E0D1CF073CA78918D504CF0D24199DDABB278EF99B34D0C3393D7DE02CED887BA0B4D3E185CF0BEE92FFD9F534CD186BCF917DE09432A48C1CB720D4EA8CEC9BC90F949DD226BBC372AD3630B7A4DCDE75812816C56E7935918D14BA1E36584FE7D268791A36CA5E82EACB6B4C9BE622DA475D8226557D2402FAF7D738A1411BED25D60FA5B3F9AE500ED047B1391ECFBA8D7653F93C75F30398AF955C4F1C6D2FA44DBABE0D96EE7EDAE84408F33E462B41240588A0C1C477F67B2A325B541CFDE246A8B85B06DBB568354D89FDB193D490DFB925C9B7AA4FB98C71DAC6436BCA02A645EF076DE340AC4E4F138602FEBF29FF55C10D024A0F424DD1E06615FAC83A2A89B62249656DFAE27BA505EF0AC4F30A69A0EEA3C4352A95D40AA3A57147350F5873FDF12EB8BB74DD27CCD898EAAC4E4D4D0DBCF488F0B089738B23 Key = 31C7F37AA0A1AB4FB908B47F03CDCB302815DE0720A4AE99 Nonce = EDDC65C8A343E51C In = 9C468511DCE7310072F9DECA8CEF6A14C446F4B0156CA225461D1768D2750A5EA9F208247B9F3E531766D40D74AD03E4705AF84D00F27559B4BE48C2D054F842E7D81EA3D167C0EB6D4C5717A5BABE03748E29DEA88CAA3822F6B7602D60E58385B6FA3929A14A14012F7C904C25870C4FD9ABBC95BEC25EFAE71BA1C0385A1B7693A5C63E2D79D4EC32DF572EADED07DA55D8202176E9B99A9780145493DBF6D8347159D84008E6D84AF0D73BC1A783BD9F71F9F06ADDC1CEE6A46826B72B1EF695BFB253B28144B14BEE5CFB85507AC733E96C0CDEA44AB8612B08656D4143FDC190348A15586DEA60EC95F87CE0E1B5A3322A15784F1F4D1CDC5E778CFFA8A1258E042CA7AE34AED94F7993A49B37EE7C35127D786C47AEA6B43D4A744B8F81AE7AA1361255A6E9CFCCCA4480C437978826A10C3647EE546EDDADAF0156F2D4569D32 Out = 42EDEB6FF33F92559D7CB43E1CB8F3D48C45D04FD6D11CAEE0D1585431E59B093DCEA6B6C959B6353563BF66E0918B66459EC33AE16BC409787DD400CC170E7FBF13AC75E2BE17AB84D316ABC829459E5E193E1D4FADDF55DD8A7D5F6672D67044B14A5508F6D34AAFC78C78A0E49CD7D4F4D281A9589DD8C3CADE623E90D03BED78D6C322DFF058A5E3BBA8410E3E7C3D0B9A7F8D0BF28D00867D32443240C00304E9B5BF0D5189B018B80A3C5D9A8377D9E3ABD833444C4CDB4989A84C6449302FCD2C97EA218AFADDEA255BEA2D448835A5D4169A59ED5E59FD886218CE2A27D83E6EE813BD77067A972C75A7136854A6078CC19E81AD345B36E5D51A7AE5BC60EDF2996508984DDBA1CFE5B64A87F723753172E7B7EF22D374822D982D83B064F5F6295A5672E31E7C6CFB21CD31FE7C96246BC315613489997E2A5B3E5A93B60D15 Key = 46FE912C13C289A8AFD5154E6607C221A44A1AD98C4F6D2D Nonce = C7F32A4E0B63DB4C In = B158FB5A3C15E554B00797A1B7E10A5333C2D3A0887D0D71F2CD147A0B945DBE9B7A7579DE16E55D01E760F3CB95136D0150DB2559872EE12B26697EBE6EE9C060AEC6BA15E30882D82BB28E86C24BCEB33824F3277AD43FA4D343FB33317338A3B0ED7D7BA3697F2FE6474F9A8124D4057A59A511DDE033A17F819A3B9D5DC07478F49DF0271843493D81A68C26A8E4482910BB86C6DB4CBD0EFDC6CE7565BD1550F794A19C851E72BA7CA0297D0B06F0E605F376303122B09A70A7139A135BF18D1840D4EEEB713F4FD1EE730F1F1782C749E598EFEDC49704278311A356AF8243ED1E65D294824FFB5E9C9128D8D26761996C51F8DDA5BB17FB9ACB815194B29C1E64897E23859C5226265C4B56FEBE32AF265F9C2A423583459395C7936F304EC59838189EAAC9103C179C78C386FE67863989898CDC6B85FA1D0ECE8283A58043CA30023848 Out = 4F4BC6E672383981A7D27F0A3C9EDDD29E0698E2B9FB414EA316324C7968D51C2F717387695A256DE8CE4A3B8AA83776DB6A57FAE0D95CF0BBC4350735032A4A15B7AC93E199C49782575F968F1D349C0F6508A42902305AAEB10DEECA94486462840A2AFF37B5584A6F762E99CAA6ED12D59D8BE4EB71C2F28181544DDDB550C532398752C14DEB2E130BE59ECAA2602A95BBFCBB2C499BBF7C4C5B6436D5DFEEE9808020906E8EE60E001E9928E5A73992D9A3749540AA387E55AC9B266C1A8A468F73EB25B6DC9D662B650367211597403E2C8E4E0B1F3D3B175EDC7DDC6FCE63E79CA565F7629DF985C06F99BA5ABE27B7C85BDBA9CA00C394F896ACEC0F8B09BDD10AD0E9C4244092F50ADC183E0E0C600DDBB228DE3F28DE96B45CE8FF728E9B928593235206F98FD15548F99E7DCDA988924DB6D00A8BD9204162B2C8B36EB3C147C5644C Key = F96E066A5C72C480B8742FBFB78ECF0E87F539F1F3BCE4DE Nonce = EE9B92CBC273579D In = 4A1982707F10B83BCF502FD556351C83C4A56AF83ABAD85DA79B9817FCA8B6691EC7BC38192F93838A4259B2179438A4F0B8FF65CB02468870A135E6E582F7DA63E50CC4268B03BD8FB2C2DE222142BE4F1E2DFDC715AA1DCA197CE3756C92E2218889B8B48CED73C1E83D4BF4B924AC6EDC39178FACC616EE7D303F4225D81D0B4C6952E470ED3FBD7D91B919F03B938319167A0FEDA38B0A842B8474692026EDA147E8573EC41C74256443D2540A01CF6739D120D03F365190D481C2594D5669D98EEF2EF22BA4F6D3907F95F3A77DC0BCE340DBF09F6CFF7D82320D814F7CB1F0B7A6E236E39186CAE234322B6D9D749DF3316CB492F90DAB3C86E3C1D226932221DA62D93EC65D1FA7A17B9981D89044F7BBFDB04531DC6822C6FFCE98CB4AD845EE647832BBD9C7ECA6961247279505B7341329C131FC19F08B8606A8C85A8DA80CC69348F8BA34A7BB Out = CA89689CB39EFC596DBE373A82F3B267EA515134292D49C50509A4F633468F2129137958FE78B26F6B689B160F49FFAF20DD39E0CD26456797E0C2A252C37E366D75933093821C939225455A51EA70217E5D67D62683E81FDD46E6933419C3FE204598C57E2F3A814D5E908A645F8BF8249DD74A2EB535946E786D22C406794341F2BD50FA087AE97371A0AC653C6ABF665595ECB7A6260F3BA931F282F35B13ABEF5C69BA2BE90DF2743020C02DA8EF873CFF5AC911E54DCA33EF4B821318F2A0E11B06433E5735F7377953E2438BF8B2699B76800E9BEA31BA385E8CB80A4D3E13CF611AFD1BCA4ABAAB1AC0417255A99A7B45DE9152582F51E7579461657A168159F2BE071DF0E57F9DE527328DFE87CC909C670C04DB2B469DA69A954A1E064C5914A3A6AB9B01FC80660E4257A90CD293E625203C97A28C35CC651F732AAE167BC88A2FC593917976D2 Key = 7DC34DA1B3AFE3579FA7418BF69F20D7F1EAE634CB1E6755 Nonce = C23C44FD0BFAEA4E In = 2667F91D5E9F8F2C96D4233314F0CFBA7C538A15E695624183FCF895EC76867C97C0D4635BDA8629C48743BA2D472D284672868216AF08240E35E61CD3E952F5686EFE572ABEC5BB07CA5A2F5E1BB5DDBD920985756D81CD27960AF2B794A1EAC32198BAFFB7EAFA9E4A125277C4C6931CE8CDDB030E884E90A48A59CF15F1D9318A86697BC2CC7DEDCE842F71C6B4064E2F911D3C94DFE2F58F00188BA01054FB3CFE5D93E82A71869A01CA5E15F34DDA22473ECFE577557687A7CA0FA9EBC42D2F25F13ADB8800EC3477EE176BCC89301F429E25D86BA8256C2AF18E9C68C37BD4A8FF1871BB834BCFFF968C5BE3696ACD2634106E9D53D3BA0DFCEFBB2B4D8C42CA6168F03DAEA7960D5306E25EE81F453E268E0D4980F878448C7FFE24E6C7F181DF6E0118FB091119CD4279E5F082EA4B031B0A7A1D3E52987F705EB24B3C2F6DA806DF672274BFE45561B12900 Out = 3136CC2F6BEAA4974DCA793E03DABA0CBE0AD100954FADCA66F829F1A0293FAC96B001237E53084F6631816247622A835D3DC178A4C7EA87B51E141BA7F2128B66903238E376EBCEAAFA6A8385FAAC87C39C7208A7D5DD985B3578A73817473FC0166DC2C8CB55DD2C32F02A586F684486DBE321184AD2C7B7B59FF3DB4A04AB4C5695D52C9F66D99C2EE8D4CA5D6116412E0E50EE800827EAD6B6B0786C669A79DEC09732654D6F8C4847911AE24CAFE778B79754332E0F1991F34F4393EFB80309389FC409663C655BD22225E76D97A49407ABB0C4A30D26CA9B8C2A85C4DD1CBC54FCD9987DB2F160EA600648A808438E08A690E136D58DD44A0886C3E28C0AB82400E3744C1E571FD82982287BA7B9D6892DBE605C82372856E55B8E506BAAAA0AB88EA4D2E29CCD9A0BBDC2BDD45796E80087481B6A11F4DDBD32FAF64A8EFABB8F056C47DDFD110C0806E8C224 Key = 82D1CEAB43D9EF707E12862E4BBF3CFA4EDC35E9C845035D Nonce = 4E71D4162FC6C69F In = 121173FB02C48D6DD5D46BA28BF7A1F336CA04377B920A3CC209238301D4DF4844136DCFFFD09D78C23F1CCF59EC22E203B0DEFC678DCEE424448B88D6ECD00C87F2EFA7ED12AC742AD2ABB85A4EEC20963039CD7D12072806B39AC212CE4550520AE46ADE97D8292FFD4ECEF0105C806DD6C033C09E85BB853BE01B27A6538D6268E3F78D5FE685166F7EB4886636E621C777A6B2A42B64106B5C5EE966BB048C1D29B0D89175D91F4F57742D95E85F52C2BF93AD9C8F2FDAC45A8A126CCC2C56E14C5B13401F7B411EF92EB66D1D8B5F7CCCA0A6F9A46C4E2F3B574B27606108E863427CD03F9491EA5F30C4313AF84B660EEB2FCFAD5CD771D0B29178E85F35E7D3DA61F439D2998A4B5D319B824639323FB6F736C90B985CC6058A084E5AC85F34B3D6685F4D5161712A56B3533722EBB1237AFB6232A02B5107ECFCE80190B9EA1771CCC6E7DF7A12EB99E9130AA454A631 Out = 13C1FCE97C6C4698F94D0F6EB90FA1C468A1AE1CE7BCA7D7DE2ACD91F2C012D26E00DA3640FACBEBA9BE29F2A63AAFE646816D93F0E1647FE0667BC4DD31137627114B0F63D342C39C432C2B32193AFC84FBCFEE87372460345FD757D4D83C51EB364631677ED6A46985E2C56D114833685C088D3CD60C1D698853B388F6B89162302BA5D9D017C438F9670DB6871127B2FDBA1A0CF6EB765A44721365408A8DA30ADB097EB24EE0C3560E3918D9D92E8E7E690F563823694836DBF18BCD809B9548F33E42740F68408667D7E4B2312C1AA566DA6A442B5EBE11BD92D6DA1600C105C09891B68FFF45CB83F4DB26DFC0EBF51695CEEE8B31D8B976866395247D94F158CF3AE621C32E40EA208532D90608D6C805365FCC55FAF4C72EB8F3F2544718CD59B88A4682D0A42E645CF015E14751028111723861EF6BCC99D13737EEFC99922FC4B16A6D07DB278C67A585CA55484E1D Key = 0F5AAFDC62CF013302133CDB2658C362D683120239C9B73B Nonce = CB628A161D5BB00E In = 9417290C8343D14BB905E866113A856BA9823645226C88406BF80AF3FD18A831844466E8734047FD4A97990BD8FF8FE90DEC55AB372A93EAE25FD098D3A231288095E8E3383BFC3402B6424BB86A1B17BFF93177381C54043D297D3F9389FA8755D8B41713EFC12EC553D55BBDA231010EAFAD2150909E04782E962B231C1207DF918A4079B7DE2ABE356B214DDCAC516803F077D3128024C40910393798857865937B8A5ADDE65AEE0BDEFC1E7F008F06D6332DFF02CE0B1C9027C02C471EFCBBE78C14308CE073F69F0E436734146DD930210AB072E7A10CC9D1F87DA29F171B6D93613F631147C110F7628B6FB55DE1F67979CD04FDABE70EBB34183D04A1F7BCDEF0527B4F116708FCC0B7B04F9BDF741CC67A4CA5983326A6B48F0C0EF96AC6ADC57516049B7E4038424568472EBE1A778B62B324CCAF1D7D40C7EFE4ED8E594F5E57F737BF7889111762FC2B8509B60284C3696AB5 Out = 9820B0B24D15FA03E40B521FB67C043D1E55AB938687A2168D04035B9A216169D1D8CEDED2C86586C67DFF31F401B3D15CE4E287560DB0747E28F86C97FF21E927E32FA3D2FEB5DD33A1B739D3A2B7CE06473557DE2EE164794EF23570D96EE3911DE796554865162ADA1D2B9D24ABACA986028277223B10AC4FC84210FE8A586479B8D410A7E4CBA24843352CCAF119DA31D4310DA471DB2A42078BAEA4DA68FA0A41399BADD34036B9670BA9EF43B39F786A29C23E19E4F60D119CE2F9C9F17DC1091EFC85DCA051B095933ED9375E6DCF6DD60356EEB5B9DDBA04761A412BE475D5AB927CA00C3B01F136A15C13EB2E1349CC8EF8B4A2E27254B9E2A0C05C20B809B8FD72DBC1DE9ADDFB8D987D0FB31D95C8104F656D3C4DBF1B75B33ED798C594785172767B00C7699455B3CF3331D19E47C29C52AC844D8A5B90642C6F3D478A84C8DE4FDEFC1D6B421E3938E2C7352A059F69ACC0 Key = 913BBA8D3FB9A5A7D58F616A6A921C4644819277965087A7 Nonce = B637FBB2CC939539 In = 77D4ED2A5321D0C218C203D971CB425FC74497708B5E8034741B79D022B2E54D7C7B196C6DFB1B5FDC1C8A18DE787672D47AAEE01C267518E693BD02D1FA7B9542626DE007AA524A8B82F339882625843D67402FEDE26C15099F8F52D03F229923ECA62A43FBFF8E672316899DB117B1313FA9562F0F60598CB85EF42F7218D819AF309DE57A6B262F79E4593FFEA910C7BF7015A4D3033D8EDDA1C1023231399AEBF65CBFD9D43ACBB9C28B58381AACF7B25182D20B4C7BE9A2C1E7FD026F6280C72F806912EF26CC559BD64ADABCB6F57F1EEA44D99EEF62B80B5AC08B1A404B9DC1F11A2401C93F5713C88F9BF1864FDFAC23199F6591EB0C1E3F152DA4A1DCD830ADD9567595A55505A7237D245585BE2F802FC483C81BF895CB7EE0A27A8D3E46AAFC0F57A71EED36107BEF7658EDAE3093559B81E9C6DF08DC7DA87BB7E17421DF412612CEAA7BEFED5342E5FA9EAABD52ED6FDCB3272CBDA5 Out = FDFEF44290CB510F15B987C0F6F2D37BA5BD3CB19B21C0D75BF6048174D64B8D1930F1D4B13B024A60A9C1AA39D6CA247F2D4C6310AB01C45AFB6748D93B5C353EAE103E6559E17DECF28C11C4DE59223D102785BF95485430A3D3C6E3425C83EE602716B990624C2CDB40BD0444EAA313B5574778AFF53BE5CC7AD505EE4A669B7F77DEC4E1BE571635B444C5C38DB46F9673EB6883E99E918554FF0DE64C1925C1E7784D36B899B1F5151F7E3D5488CAC0937CB6C130141EBDD3467AC3FEA4BC940DDC22434F1B1883C1A983FB59E53C44410FC99F1B977CE4671D4154363852630A2887BB80B3E2F8F42C5BB81D15BE85A07FD24E7E8DB66F7FEDCBE28D6126E2124DFEC6F61B584FA0312304C5DEB510146C753EB7CE6BDB95115D024A05002499358D62C998F48DBCAAC7B1BFC42F450F407E838A40B5CAB429C75D30E45A0A8B767F1D7F1C1A2C1E71389AB6E42FD0F969CB7FCE517FDD5E8E Key = E5A12BB39909DFA7BB14C3287A8050A764425C616C5AA1AD Nonce = F4B8C64D45C46352 In = 5E379056DA626CE62D94AAAC8996988A6840CCB2963CB2EBC79C681F55F8A7540B6C602671856561F0FE623B362CD303EB124359581E3BD0763BB4DB2EE6B71F9C5F747BAD3A3D12618D5A510BB3F8C3AA30F49579B24E88A26C7EDC31F8BE746D1452583611A01E0364E704B64DAA5C9F5A0CA698A1A24FD2EED1B133042905F28DEF9241F05F7F391A67B29999BC003CE9A488A5DBB111056520F9BF6D612C163B62F4CD122AD9DF51F346F9D4EBBE6FA470ED444DE596ECAF10042FCF06E5FEDC5A6BBBAE01F34FE529279DA999B086669094D97CA5C1F2F7DA853158AA76AD9BA9F64CD920F85E4686158C27EC5F49A07F34B893C5A8F3CE5C2D407D213712A157DFD0B03DED3BD39B6A79FC81C6875D0E10F4E2E90D337AC0C54120E6F5E5CBA808F824517B7E78254058DA6D8B0FD014160D65188164B76FC928C6CE50FB912F098B943D67CC523C76603D44D256FA0825DD8AEB0937E2533B4FD2881E Out = 97AF2D0FC9B2E50F2C08941BD25CC5AC703F44EC717C3DE880C6459EFD4BB6F62C9ACF35CD425A68500BDEF9069026944E1F45F4E841615B6961DB2D9D80C31AC4A6160EAC57F09DD1F44E0E3C4FDC5CD38685F0F01F6CC2210F5E83B10A5C9F308FA922DDD7946E1D44208CF6992DA34906CB0AA37D42BC0A4F16B8282C80336CFEDE8BCFBD5878CC6B0D7810E99D5AE81934EBC338FCE4C03156C86FDAD10F48A10E64DA1FACD9B79DBA7A650BA4B1B7D82D2619D15AAB2D0C9CE8CA361A16244C246AECDAA8C3AA3A90E03CCC1D39FEE72509A3396FE6A8E60A93A534FC22A758B1FA5E0189ED70E88E868C53C95613A9DCBD6D7C3DEC488618A4F4259B9155691C094C4F5B920FCEF09592A7A786D1A28D5B1582519042E8A14477DE6FAB54CD88626B8AE99D3875888932F9C66D7E710DBFDF56BC435F5ACF80003E21B6B1ACFBE3CBB45DB9F36AE2E0B99CD574D11D2E7D007640802CAB0A73DF42844A Key = C7A36EACDF6E22781E61F131273155506F778BC0B5DBE974 Nonce = 377210AD91C659B5 In = 0E3633046E8C46E483E0AABD132578BDD9D5CBA67743BCBAF7B4DF08380035DB2FC67A0DD2360C698088C274039EDE20BBC315CA5ABCB31894E620328D11E58FF72DBBC972765C17D7894CAEF1E702BC2273315B799CB60B10E0E56D4E1DFA2FFD7CE1CC42DF14E1418269C539D3FDF23F35D124F6966E982EC4ADBF8D1CA6392C7CA25161EBA77CC54FC7EA02ABB40B40D34086B4BB4A13CCEEC89797F976158F4C4BD979648C67F3757A29F84C4D8D49C1A066E89AB2EE182430840BE258B6E56948FF0B37EB6AAB0289ED63C71C4FA9594E4EA93D288E4BFFB9DADE004FEDBEA3BC3B1CFE8A8D994A3C35508FB635A79ADAA6EDE65E9B674ADB305625104E263F7E4B2D8E9651B820BD74EC718BE43C6AEF4B52C0A1751360F4172D585907AA79EE213F54796686D504B1DFE55DC7CEF59F4B422318BC8670D412D2597E6A1BA6E12AE843ECC64049CCA3967100A0C132E5806AEED14D6CAAA96C951F1AA1C6EF715A Out = DF660A38FAECF3B338A9480E35AEF4E9D098AB643B1067B9F8D84AE5E4D1CA471797D326570A993B12949A35314E261E9D59195EF31E352317D2C63BE60FEB5681FC86A447D26E09C8FB5A9CFD83F085536921BFBE6F92F9F9CB274AD0F971174E970F6B717E5F24686CA068653785697A5D690F4443773900526A780AEBF836C56AE7BDED3E57E4D9A69FE12B0349C2026023D4AAD5808B69097D9AC3CC451A902E95DEDA9E5E0F2426A1E2FF13249F1FCFDA34B4525674AAD772292158FB9FD4A5B522314127CCBF2933382E4A126FFF48205D0F7EA1EF4813C34D5BF2B4456D9565FEA30EDCC30F2D1165B629443C3C5DBE802F5214DD6FE458C745932B589CDA0813AAA6427C709B46C45D764885854693D9F04B364B308AB6E7EE15394B34899D04E50B5BEDEE9E431C83643EAB7ED6F91180F9D64F334067F5B77AB88D10F1093065BA0C0655E5AB0B88D9F60E20887C1F85CAA902678C177EE67AED87B3B0F1A2 Key = 465AD62084182C4E4B46F597C49B0EF00F6FF40BC98E03E3 Nonce = 90C4BA4499805CC0 In = CD3546634E4EBEBB21CB70D51E0E4ACE02B49928135B71D23616AEAEB26466BEDDED0D8695C997D874355345AC10A9AD6CCB84BC61B9032757CBE2A9DB83B95603D166990DA301671BD4C8385242CE21CE9CFA1F10671BBBC5833A4D013B5A44515120E29E8E777EBDE51F289F8B9C29461E56F77EDEF58D833C7AC5C2B6F2A1D6F7147EDD2D4916C2BBE51076D549BEB7E2D39EC96E8DD7BA14311086A3A8F28F697BD50E66E7FE51142D318BD6CAFAB3D40D8173AEC1F0C6CF518D40F34640550D8D2B1A4722CAA02FB05FFC11AD77CFA42C83362F084639EDA36CC7B9011BF3BF7A5820D465ADFA42A12E67B01ECF5EEB441BA68B10221F56FB177C21FF613B4DC732F384644609D9FD963911A6BE6DC3BDC782A0380A3F3CC49BAA540EE30B0809329AB9F7E9E6AF0D6DA78BEA036507F8B5C360FA12EF10D24567761107C1CE99262FD64A1E11D5089125A8D70FA36A291F0BD7107565B39A421B66591B7C415E10BF33E82C Out = 60C6C6F5FD0D60F2FE85B68151630FB20DB5126FB9B893139BAB6D4ADD721E66B68F5DA7D09760F95DC5374E47C0A604E9C43D06F2C7DBAD6593FC160CB55C817BAB7A1633325BA3C23A2FE7BA0218408E8FA13AB5F7165879B9C9FBABF5622456A72FA7F4447B8E6BF6096E6ECE793693DAC517E539E81CBA254B73D79851C8F4FF3AF3D97B5237240B33AB538704C6DFB7887DB1EA49DC18057E8E98DCED10D1CDD199EC91552F63D7E0B8270B9E4DC1EC174BD294463F6E2939461BFC8BEFF2900EC92CBAD64B6AC273874A89B8FDEFE4D60B8982934EB9297765CC51380C803AACED9BAE5CD76D08BD4CEE2CB0D1DE2CF00872120BEF37036DDBD3A2BD4E54E26D383EB39C2CAD52437C31191406FC69A59FB1534624640DB35A685FE24B79FDB4C092D3BB2D823C508FEA2CA0E97B1FE431F7C65850A15B153DBE7D4C22CFDF60437B3C9D383278CD814CFB08A4DDC98AB529883FC139270FA32EF14A47C9303DC5BEA28168 Key = 88091BA332085DC1451D98A8E5BFDDC9CABB29D761D3ACAB Nonce = E98559E21C907103 In = C78F74D057C2CD4BDFEF207FA11D425C46B48681194461266EDA582D7811CCC9DC54C5A7038D35938EC37A2C38253B4A0A23B3358DD9E62A2ACDFC8171B9EC53AFE95D45AB21428F00E03F3AF50184E5138B0D69546FBE02D5DDD760CA367EE4C6AD61F94B21B0DF1D9993B8BBE873F77D5C5F868AEC81106ACBCE2E391D84EC2374122C48324CB4731CA41CC715FEBD36BE839DFC22265347439B3272AF632517DBADBE1A232737703E763CBE5B2873413FE2A04E22282E375981A0D6DDD5CC7E446CE4EB5ED6989A5AD028CB7E0D03499B7D61D8EB85DDC6A53F7A455A77CB0C930B6B7A620A312A7F978BB5AF8791A2F5CB116A000EDB70CA0B47459746D94958DC0376B7CDA39510CC9658AE927630B635C38837B6BE3ED31935C1B66E691368054F61F7EC304D7E408387B0DA71FA571B18056E0256BA89167C169993D45F46FAF8ABFA9921310E262A1FD45DDF62909089848C74269EE8D7AAD250792A403DE8F48B38924BA0266E2F Out = B4FB5DC3284EBCDBC0104B29B6D110EE04DA689C1C53DDE963BB9820E3792F72797B9CEA9DDFDAE25597D91AEC5C4A8FD9625A3E08B44630092ECC995A7BDDC7ECECD070276153F785F0BFB51FF801FA375B5B0EAB6F4C8577FAB96B33F87729D4F99646B51EF2096FAD2510045A5CDDD525298AA4EDB95DC36F19537E6F9C3BD61DBBC4312B96AA8A53A6328934A526FF6DFE51E6C841D6BD417D307FF1925FC27E701BFCF44372C2FEA7EB66A93FBD70A985D3D4F16417329663DA0EDFFD4D7EB209CE4AA435D24D91616F4DDEE729D1658110BAC4EF271CDE886CB0556F852E89B0F070A75F41A2B4C19785FC1B2506A6001CC7FF39C0FB2E095B8E3C66D4BA9B2FB6064EA4202F366BBDBC73A5079FB9218ABB11E63CAA1B05F1B3798F4558D270E8616AED4E2B45CC79AB1E2FED02D82F88018B621764D24FC1197B6F65FAD59476A81E1DB2A1A6E0E94B5325208ADF4F9DE15066F4FEABA6524BF2D567B75B8457B1EC8284453370F6 Key = BA14CD753C30AD563AE217A001919404D1201EC9E60A7910 Nonce = 71BF1C99162D23DD In = 727AFBEF333BDC8E5D25C882792C12E5829635F89950FD18C8F34F4B1A27F4051270DC484B64AADA5AE9DDDFEB0BB8829844844DC02BE2D305905257815ADDAC34CFEB18571A4D930AF2754F13AFE034831E53F8E4968BB799E9FDE8CF514804A9571261F87467BCE23545D3858145508C81CD91E311FEA8482C03C0BEC7688EAA15BB61474020C14B54B4424D20E4474E886527000DF5B8489C99C8E4D49C69F8D2D1292AEC62CEFB7B4D84D1CB0702DB88B51F709B087C0D5D9581EACE9EB443D5C6C12AFD8120AD777B233442449C9210E4D69A5D01D663D6CAF1C0DAB7B762996143DF15D9F1B53B5972E2EF5B042F872BBC0B5BD8447BA1ECBFCD27F759DA6A96C9B0EF0B99059D3894B76EE98781B23FDD52B288305BB48D7D5848F10DCD82B418E63313056039A97B765AC220C1035331F655BF468E868B0C8B1FB3B10F6D474EBE0E2FCB59A37F3D8E9890596FCF7652CFEF3FC4277C3193226D99E3DCE54CB05A3C90A594092C43F90F2739 Out = 18333A60E2C7502E1E12B956277B5166890876617152C075C532269CB3BDC3A317D92E862FB7F4864B8AE4FC33F04DF6DEEEF266B58298223424732CC70B29BD70967F8661013BCF606109D49C7F69E6A890EF80B3762C32EE76B10004A630939EC9FB3EF69BA4EF05BE0DE8F1841320584362667DF600FF85465F3F530777D3E2B61A352D700C1A74B6D569A6BACF6A86A278A2B7C2F0F32FF5DB364CABB07B716F39BA658D1C12BDE3D85CDCF7D9CC949DB7827DC3DE0132A4B0127D96076B76770E838436C680B2DFD8FB71D40B2976645DF4B93BBC3FB33C80D60FBBE0CE2DBABA36EC24C350F14C8042F8DADCD410D3642121DB95790898A08847BA9AAB4864D7B77123836AA5781124BA1447CC87DDDB18242311A4FBD21612B1F9B7FEBF831CE1EB068076E0B4CE29313B32EA8260EB0D626CC5C4891D4F42A71CB339935525742EA2058CDE9897F28122F43E229398825DC0B5327875E334A9DF114CAC531B235026C211F81C6DCD6C5C5813 Key = 9BD657917B8CCC9B5279D3117DD99B6B676C983FB92C5E7D Nonce = 9048DAE814ECB6DB In = F28C92127196B168979D38CB588EC92F1E61F31402111A7C87CB1C0811951F068308247AB6052EE03971FEDA999FA8BEB94C31BA1E82DB9088E1435B631EC04039B53E9222A3BF014AD308CE587AD481486A1270A58CBC2A72F5B975AB81D1A6B0233CD64B20A24769057E163A231DD54E33751E1289398A4532FA2727E8A6AC8BEE48D500C87311084723E6BBDBAF3265333C8D69DE71D6E43B6AE1A484795991C0C57BD55D5C0B6F05237D9EA41722399C4B7ABA5864F9414D8A7311FE5945FC534745C68576F18A5E6A2F0A435968788894EC6F1430E45E698EFBBB7AA5BD7C4A0FB40938B7C77CFCB2FB27838748DB6EEB356782C393AABD3F5380B556B4786D1C8E01BE5B02E5BF4AD724302436F5E3BA69D5D9C463AB4ADABAA84E2AD97D2C2329EBF4429CBF4025AF3698430701063743A4AF9FCFCFFA9BE5C2D651FBB9F243B64678A9AA308D2F6B5EDDD9C43810515E7CAD9E8A6ECBDDCFE03257858D948F1346E7600918731B1ED2AF7CD6343532B7 Out = C26079BD4967EE47AF00242430A6B84A36DCF190DF2808D3E7722ECC684E58E812F476F357EC5C73770FD5A06940C35E2F89ECD20E39FB931D4E024767F0F88F12FB67885DAA739ABD57891761796B0DCA6CD8BE0CBB4C1C8AB5DC0D9C8EA94AED98E5F5CFF5BE15936B55ED6CC6D337D27F141E2068059D40D2A393A2FDA70981067FD283945A6E01A90A1D9DC8C25A555F878A46C3F3FE73F895A0D06C877D4FA4125C469BEDE4A38B80C88084028435DACE330E1DA4A2E52EB92F06EF17BDAE79CD492A7A07A8F383EFCD60281E5CE04B14CCFC1F977C63E7286AA690DEDAC273387876B6CDA430836033DEE7D000EEC58078E106395C37C5020F4C2ADDDF0CC7361BB187D5CECA597BF1E0CBF2AD5AC91D4659C315EC039A80307E5693553216519314D9981ED5AF611F2D82DA3A358FD027414B44EFAC31042439C8B4EE3E4C0455769C8640C0CBD752195A0D4B7EBC80CF881C15BD7F41C96EAB2D6A9E5F2EA83B0DD67FD52C6B50A516828059DF50CD40 Key = 1FA041BB9AE7CB1FF1080589BC676B2D134181CF5CE95307 Nonce = BAD8E5E34E447ED9 In = 7D0F500100462BE796798CD42A5A133BC9128650616B9E72CCE8CB52343FF8CC205F1FD9478C6D8FE84E421C03BFE852806D05A4BCC3645EFAE0D0F357ACDD85E950CB794527092676AD8CB1EAE3E52F8EEAF4EA80A2F94B70F95CD10C42F7867D1F0CE740394CDC9C8E8A4A5841751ECCFB3ECEB635D3E2E050851826E663FC390A16C5A421F9BD71653867272AA649CDC77264F41DFA666087CD5E6DC9CEECDDF77104E78299B4B4159A7476CF833C2E85106B9706D9AC1538E834270F9E09B05A36F42EC62B4F79CCCBC4CA44ADCEE91DA2231B39F70ED8DC2B47B36FD2A2562934F7349C65278F3F7DCC612DE1B9A0D14478975EB2B9FFA495A82FBFCB5266B5C757856C8EABF1A1C8E5E2049A8DB546C87AB17ED8830B1224A94E1406FA7D5E4CFDF70AF4594297C82B2005C53C08098DAC78EFFCB69CB3B321922A247AE861E87AC0D32EC8274AC771CEC33DEF58AC9EF56A32484AFA10E354AEB72F127E01138B3C4205AEB6D0DB89BC0BBF38985E74871819458D Out = 8BF353E8349D0711C4A0CE2D2ADE28DD23F9372DCE7FB9EBFB177DA3ACB8BB18A97889538E51FBB8E835D9048066CDF72C65F355137AA7EA30E8945896FEF268CE2F875815EE76F6CC48495D01FE7F8D4E57936133E65212EF4B16013B1BC01972547B4D4DDA809E2E61CFA97300B1B09BC2B08F3E44515F756D3E073180B516064F9C5C5CA7A4C3F6EBC5B9A76953151A8FB1403E64BA82B1308061AFBD5574B90AA7D28A59DE2FB7CFE050E2D6F3384A3405C8EC56BA2D477320C33334184F7C2CE6E2F95B1C465356E0599D88A3B9CADC4FFF6CFD1B0DA788167381A4A291DED18CB3A4A33C289EC637FE574379E55D09807761538E0D80A538513D78D778B4F7AD386E2F5F96CEB5706BC22476D3FE49B907B4C0B6437976919D8C1DF55FCB97F5B142154F4B9F4457058862E583A42B5833732D2332D4809BC61AAC43B662CCE9FBEECE99D27E6D674C7DD17318E8855425D025A65803FEA4D70D0E294E227DB9D5C8ADACC98A068E6C1770BE4AC94D94B519233168 Key = 9ABCE6D84309211902FF54CDDBBC31BB25193A763DA562A1 Nonce = C9750AC233CF3FF3 In = 8D29FA50F355F8E9812FD5B1727F14CB3059A1FCC348F0021E0AEA8718EF066AEF2998B6DB2D9B2E0FC25D900B8BD51A577CB08EBB0F8D5420F924947E7951AACBE6A5778F6F1BE32EBB90D0FF0E68958C485742ED9605476AA7619CD555346A3FBF3594FA73EFBF74670C9766570138D9CCC82A76F8F386E10BEE6021A13C89CED94B919001E050E115356E62F5D7C5E1164AF2AA1A508823B8DE6C628C675EBC2C95BBB5C2DA8E107D2478B453EC4D5E57EF15015DA8B9AED441927B032BB9B4E9F4C8D60FF7FF039AB7339B782FF51E67EAC602C4081CEB86E27FAF5AE452F31BDA99D3AD4BEA0CE6DE369586E4F98ACE39E9A2EA3A9EB9AEDFBC92062723FF93B653CBE6142E3BD3014E589BC2E56226043EC635B6C114626859C59D1070007C69C1B9B46E69B38CB0157FD723DD1B0BDE08F8F09C9279A287538304CC04F8FA528E637F5E152B9953E5A8C10CC1220835F69FB5E33BC2CAB0B7DD625BD1730C1E2C8DA73EBE769146CF98070D5B667939836E5731E31BD57CDC Out = 4E1996018990AFEEB4CAB81B90F1E1545C6D2130ABE4B302FD286840898F9ACE8AA5B9E7B260D4910A4F247197F7320CD253459B7DC631CC65FD6C10092B6620403DA2DBE8B43C8C8EAB90333A10456FE2C53CD753915B5E77015E44F1CF43FB1743E1F29D4B178CA404D823CCFF9DC7B10DFCE1B2A73A0039EB3465C4E88F8AFA02233C3C54BF464D8727481C38653AD6131C351678ECC08AF3683D97898B4AEFBF60472AA3AA6D602F5C276C43DCEE815232199BB71A199382F5ED029389FF2CDDA22B2A8954E91C17CD5D78B0D8FFA0EE627A423EF726F566BE44C81B70111F3B98F6555EE999FCD37E2010A7F7B497CDCE086F950FBD6705204AADE1F8704C5AB27B769D02B438BD6C9AE66730D4CE7170F456A7C76F1FDBAE8439CDD3230A7CE630F52D2FFDB31C505690BE6C2361A0B6774C758F57486D9014EE857A3BA5BC1D9CBD6B40D24B55907DE5CFE361DF28C3549B5D236F204CEB6CD664B6E14D1AF0413D03D586C0DA1BBE56A1484DE06C91011956CADA5D2DB68D Key = 68FC9C0059B999569EEB2258B4E190E97E1F5B35D899873D Nonce = 97C48E84CE8B42EB In = F6BCE4F7C6AC3457474D4B5013ECFE114A58F6B85C6B104CB0BCC2389BBDCF5D618441A9C0705488714912B3F6B12A15D3198A3E41760A577020280B7B6137F5707CA945A0E2E0F6C14731DCF9A3179F02AB0AEFF7F054C018BF0C6412C7AFA91D856EF576C70D6A35F1515367E5899D9647C31ACB9F0EFE2D2A67FB5117CC1EF7609EF69E9C9C3C55BB36002A96EDD2FB7449B5A704EB8DB814EE982CC2C5F965C38E6B151DA2F586F2140DCBB24AC96F29BB34A3AF1EC8A441EE4C701BC9D066D2DA71A869D5301FFC426E24812C29A4B1727659136D3B0721F4842D18C3505E2FB31FC88835ECCB6682F9B83BF9A2D4E5D2F42102D80092FECB017E823C1ABD8056D07D254815EE3E96DB094DBCF36561EA49F1AE928362E4C6DA05E71478BB118F27C1CEFEA4F2AC510F3240E50AEE5BCEF9F1422B624AA53099081A94730FAB191E1CA71A560E61DE365EF3783E212E8FE11A4C9266F8F8F6542C7702B604488921420DF1E20BD832274A25AC410F86B58BB713B3DA022EF3F62ED2FD93 Out = C9875BC3D4BF3C2DB51911DDAEE617B69E77BBCBE26F307E136DCDA3F396AF938C12E1AB3892B4F6E1882376DB37192E2354DD269F3B9ACA70FB41991A71E12BF3B0F5FE2D9C290EA1E514CCDFE05567B6DBED2057CD24BA5C218DFB45060279BF466F53E7B72CD0D1904DE6F5C7DD5AD6577BFBF4E31F0B3BEC549456D31B5C392B021831F81703901561047E4055D305BDAE4028D86DA2F69C51CDDAA67D33C9CA14A8C6B169DF04ECF51C3E8BD33DB3A28B1292AEEB582691F4EE6CCCDD5299CE4DCA4A31BD5DC8DFCE32AD19C38CB335B387C8341FE5A039D55652D462A2ECAEBB0E8D3071E8A7F05E515F42DAAE6168FF097ECF99E505847672874D3287738C8C97232B4FBDA9F1D10066C0C597A5796C770AA281417C390847566DF5D7C9B6EB74D28739C3DBD75178B4972B08F090D5CAB0165B8F8FBF321D84BBD1785F1BDC303F950008ADBC15B6752B3CC648AFAB4D5A24A70243F11584D97EAEEB5A02E52EFA110CC9297154E2994078BB9D160341AE68CF52BD4702DE135A8E96 Key = 606807F4D893898C22936B09472EA44C4D86A8F22A863F23 Nonce = 1EEF5BFFF8F70233 In = 99003587F17DCD76B0ABCDBAEF378EE36D275EE2AB6DC61889052AA97EE06A8B6B30C10E3936661222CFA985BA181646AA9316962C7CB83D84012C8110B34D0C366064F662964153A2D4332C7BAC76A3E6BA7147BB0014CFE7158A1EBCDD53185096FA6585306E97555AEC33E2745275D4B00423F8EA4E4BA2CD4F848D3B4D9F0F65023298AF2A855EAB8D60EF35A46C7308AB9CE16FABB20B2212900133E15AD3AE639FF5F81CF212D8204AA09AC7824C6538DFE715B55E0C46DD75C1A48F7886E22CAD48C38FDD3F80E0E159FB2997687F734B56B0C920C34B544EB81D8B19F3CEC5827A0ED9DFCC952827F9A24E35AB6FB199A3B6381D2E7995F6431233FA40CBB6915B5BD853A03E6885B077D8D10191D56E53E4113F1D88D90532ACE4444314D74FEB56C6B2BDD6EF93D7E6B4224487EC068D59B6972F2AAEC5F0488F101D603A659D80FBE556EEFD0A1780FBAB3163EF1D03689ED3BE2AE1761492F0EEA4DE741978B64C0F45668DC6DC1ACCE3D39875E18EB33DC5D01ED3F6A94C9914982A19AE Out = D7FCC6158E5B203214E7F2F90BEFED9408BB56569670EB7142F02434ED3BF652112AB4AB32CB7689EDDCBF5C97D3A6F3D7E198C66A05774D1E69428500C24A3C03B9C39F94896CC0FD6BE69E37C6D4244007EB55CB8EA40F0990234EF042A82FA0F8028C7950073DC316850AD928122BEC8D810769AF5E1F35B9A7CA9F16AC4665B8AA7EF70DC7F8FF874BB2240220FB2AE6CB7BD2ECC2E913A7E0C064EDCA4917E588EEA69A13CB0CFEA09F4EDB366D22F6414FEB060C62C75F6DF41F4742ED5F204343B39ACB58E115CAD56D2666D870BCE34B0A7796309C8583897FF625128E2DD5D7B98980EC06B086CAA4F3B6D4E4C2739E341016B58488103BB298CFE60D0F29A75E77E22D869F22BDBA2AD9EBBE96AEAFEB73C1EA50116248891151A4EE6BA9C9A081D391F4D763DA00F14DDBF1E15C41D87009C6F313931BFFE516337C43C8A11F957B2954ED68F34B385FBF46AA8D200ED5DEBA8531F125FF2EF2A7D94A661BC1D89A8E9A1A9BFE715A3D95F117547E91E175857F95BB83CC49DFB860120A74 Key = 9F53C60932FB8AF55FEEAF79B451A18867199258BB881CD0 Nonce = 75B68C251C5B0DEC In = 4AFB9076339A137B25D7D07486C971A75E66C024A563FB24DD9E89E0B5CE1278C2CB378621E173AE9C667CBFA8FD7AA6B8497CBCECDEA7BE4041D192FC61B4311923264246E2AC8285761D32FACBC520B0A2C7F0D6984325BD51604FDF0DB5FFB1DBBE903C43A25728C5EB7EB98ED51784FB66A12D04DEC4514F8E7DFF5C87E99832192DC7BA3D429EB116426C0640F6BF82ACE1ACE11B5ED96C88A320EE5C29CF5C6956CAA8C2A90854A2A467FE471E2D1968FA88241E1F130BDFD1695D8CEC1B93803A3DC37824DBF9BE5685A35A33BFD60F099E10E6A5393001CE7C45D5AB369DDF162BF602F7462106681204C7D52585176A20010A0D5C2C23514AD5DDF0A6C4E5899B189376AC53C5CC2B7A87AEB8A3248A8514EF044FE4E6185AC96B55F6E88A40912ECCA21EA1EC328D7CA3F0FE5963B1B7A73A2800181943151BBE39161EAE78BBFA3397331549E7184EB04B34F35B6ADEAC72C196FCBA68F98FFD502B62964C805CDB34DDD4E57DDBA1D6AAE8006679A9DC8B0594C5B76C14E25177D874EE25ACCA9191 Out = CF532173EECA015F6AABDA36A4311A11BFBA0E31F82FED5FF503C5910F3755AC5A41D34E7C546AF0175CE1C9C43F78E14067359222868275F142D8967308B5C52274E2C223162356F83228522DBE91E45DAE0B41DA640ADADF73D9BB1B16748626418072A4E9E952CB60D746C4BE433B185BE7572CABD8378B47DAE8D0A68D7043CCCAA4D6671FF25FF1EA737FFA5D40EE6C4580F016E6FAE1DE15D421D3FDA7EEBE50096E70291E5773C04F38125D28E55DAD0ACEA9F8092519F1B27B384527ED7E4F530D77FB2AB4A17044B64D7040DF6E31221EA3C8E0450CC247C0D3D8F425587B0816195C090B4F9E5E5FFB06533713B52A7FB24A1422B43BA970183082FA416D0B25A0F5B27348300241B97743DCCFB7A1A8AAD8DA837312FC078D5431EFE3AC24CB8570A76A0A9FAF84687A83DF24E88CA3BBF15A375A3057AA60145D2A622A9061FD1A714CBD0BE8720F1BCA985F6E77652152E3D3B62DB9E0AD8564457312427014AAD9CB60CE37CD5F576DD6C6BBC60E53F4676210AF86BB20BB20B03462CE1FD5C726 Key = E5364A9AAF1931704A704A65B9836806DBF218AEDC852176 Nonce = 5BDF21C0893E2C63 In = D92EEA40EEFFB04585F6ED202DBC5D660EEC1BAA52E2968A8CEF6EA2C03B7176793E3FB4A59CF61E29AD72CC90EC049860FED7C0BB07F1EAE0DF101C41ABE8B8CB5AFC63BBD98D5E84CAD4682E03FB0735C7AA0E4DFC105F12EA3F9B4C799D2747576249841C2EAA26B232FC8047BC2F972EF0FEC0C70B5C41824E8F9D43E8A4B1ECDDBA69826BF99384D3CDF75A6A137199DDA67BA48C223214AFB844244755F0E560933F76D154E2B9659D5904F9867E37B5045D5E0E5D64E6E23EEADAE96E0815ECCB1BE57E56FB49EE7AC399478A62335986AA94BDE631937310C9589B93300A94B10598478732A65EEEAE87243B5111D854C4D11F6FBA956D96FFCC5286FB1197A4C374B1B21B21767D6FB5DE19B351A6917E8A08151DC184149EE4621490E4723A2D203787BADB7D721602D00C0FDB429368E3A2B4436528A14EA0A13829367D91F75F156CE2A777DABEAD8E723CE2BDD8BE6B00468052ECE459C47181E51368BDA4878DBE034445CA2BBF210CDABDA7D681B1949B21750B5A4C9044837DF2D75D0E20D7F9BDE01035 Out = 792E449C773073AC251764612F18A018CEC05E08663B55E3AC25E21078D53865B20D4215DCFA3B0550805CB7652954560B8262441586701EC27E7EC79A59D9A6903ADCA809DB48F2054C92096C685E50B5F42118F0DC133B9FB94CD3DAED452CC592C25C30253CBEDD8498A911F214E07B956A074B9E36B3A263C6A156FC33836850014D49BD618E0F0CA52E30E1B628B4E3F7C7D68AC98B37DC54E6A2E7C30472EFC0EE3E032BECFE660B50B88CDB968E220CF067122355263595BEE9819528D558D06A04B55255899F0A3A704DFDFF4D49789FE55CD1EE96594AB571EB06A2687277396847B14DC9CDB9262F808C2593A1124C7C473DEE26BC0880C26B267FCA7A6F0D9810A2EAE7E412DBF804E4B3A543500100154FD58AD42509DE3F495FD11593E9A7762AE20D0D25A2E3367A028E6224658F042ACDA555EF61E2AA03C8B28FABC26BFE099897179645213A317FA2A01889B5A0E73185C0D902823B558878CC2C6B49F54D992A00BCB1E0FE975C04CC2A6257C9C21B4C34390D16CB6BD805E1DFCF337B485F66C56B47 Key = 481FA65B4DDAF7FE670D87EFA173834D41230B31AA3E8820 Nonce = AF5B5455F64B539C In = 5E49C42B83923D159A0302BC310DC0552AD04CEE3563193EE8614EFC6382AA8C86EF1376091C86AD82C7C98F6C034014A3037FA9451676B1C0FACD4CEC91785B1D437305384241E8C7B5E479220150F9E1A48C3E045477273FE224E541C329374EAE0680CE64C6A370A9512104D7CED78E9F2A6C478BE0172825C1EE8266AD51955756B55E409FC1014A6A6D838C6D66DB24C763EFFD5341F8ACCD6CBBB4F1BE7965110E999D83EF873A5D77F531A059AD3E994FA1C62C1F05F97DCCA1C2B0928E554452B83662076EB317300687665169484452ED3533728F331295E27E0CEEE0EA20C9A37941342EF92C40EAD23BA35CCC052DD02D2E1E230232A8DCB796F8A4EE5EBDFD51017CD22EB1CC247FD4AC0CFDC0B69FF8D59BF72103D7D1B1232547ECCB1D6EA34AD1D0D037077AE6C43AB42F5041E692947CA3A58584E2875573221F4075CDE145A4B07C50C7539866125B8B733E01342C10C9A9E1B6315827AD312B9EE7ABE4981D4FBBC4CD6F744B071F011337D7653B6C43D93C6EA56586C40184DC2BE1E88C9DAAFEADC3E3A7A737 Out = 48AFF615CCFF3B8F3A18154CADDB269F067DD85D0EF412A7880AE3E464EB9BE1567BBCBB4BF07A975C1305B9111A6D45F899A8935A2B8B90AB40C9B8CF1FA0E74ED5CF56B654CE9D87228607AC87A8AC1B7EEB79FD83246D7BC5FAC28D26E735400E2F6F5EFD7F729E7A6CE9A99ECEFEE04ED6020133B4DACCDE0756E5F3C1508DE68BCECAFFEF5C30AAB454AF870049279C73E32B4072A0A037FD5C8B8708889BFA7F89EDEC41A2AF01A01C9E3DD845F88B7754F4A5E7A2C110E3E617B75D2A612525EFD62C63252E812A109E1BBBDEE5EDAF9FB8507D97FE0A13725BD7B79EA0F1632755379FB00A6424CDB8D236F796870420610A4E0CDE1CB5A13AB14DC120CE241A33F56719FFAA73876EB855D5C25454F64B0E4BC57092D1D8C8285F73CB077F1BAEEFC400DEE87EECC7C848652080E99274615874551B64B1CC2B3D0EF3FD4ABFC18C5DA95A61D7D3706AB735B4B9066CEE2887C2A714CE8115B8F91D7E01728EB68FBC0D7D632126C460870BE823F5C64399F3CE9E9D9FACD01799B45E0A2278F693C7A2C9F44B4AFFB74D2C Key = 272814882601F9E7EEBD53044D05E3BFE735AF7DA5B4EF13 Nonce = 55A3447CF08BB668 In = 53BEAD5B17B878F07921F079761EF7A267D540BC5731BFDC201F1A454CF465ADCA5B1760529A340F8D5D6461A094F20D3F79519496A649A70E5305F6A9CEE0B9E6D6C7B1E7809A0D816A0ADB7B5BC992C2532BF94E21A3C2D2A350D8C5095D8029AC899D53EFBF4C0B35AD7CCCC0CC5BD6C9C40D2867DC7CCFEF12078F3A5E624DA10B7FED2941A18401BE5EA2CBB17311E0FDBB9E3F0F46F3D1A83AB98F26141E2D8BF6F561AF5CE0CEAD369601C1E4C05387037AC53B9F2ABE6CB1F5581B04DA79AB513F477F79CA7AC824B18ACE5A62AB112B3743FB9D811A730D1B3F9B68208E7EC9AC7ACD233B4B70C134F3B297C4633E5CE00D22471AC88BF451604920E6AD152EB2A49E7FC6AF77B29599163B01AC3AE64ED55C25BB73F4508F183726C1260A6E8D6879F03450F06141BE1C892432EFEFCC8A71235288DF37B541C81A8B8C2161DA0069DC12251A3BD988E2DAF48243F2BC81A8AA97988D7907AD4A5E655557528A8A0E3B3338E26D0CFFE7C793332D2D0FFA2370CFB920E4B54762E8AB8933048F2B528E898168F589C564FEADA4004F Out = 6B03D9D299ACC9DBF19DA4A032451BF8C400AD001E8614F93F398EB776A67F4D8AF32224E92FAEF35D5D014210FD48BBCD0EDA63CD638B12D72CC921AE20F3B24DDEC670146B70E7CD40A309E877C53BC8B5D22BCEB757CD7E25B2062D5AD73D2EA7B3C19377251820169B9CC87A787D5C6D27D1019A8E2E3B866C2191FA91039D9F0C0F35240B07357F0F857E0E8DE2CACC6313CC92B43B07A3757A2118119EB056BA612F1306CB4F7BA10BBD0CD56850D1FA0A48716C86CEC9ED1F88B4E1FE4B7E8CE6EA6BEA15FCC5858AA4FEAB8E66404E78F3E05432A0C8D6F6780EA94F5756CC158AE4669B503C3B2E6325CF18CD356D04790BCA44C71F83127BCA0342C22DF8FF89CEB6F81014DCD8EB344909CAF91251A76736CBED0E6700B0BE765D293BAF3C6C039047363570DB741254DB1B221B8365753FB12E48B3D140D4CF3EFA0FEEFD79DE5D7FBAB5280E8477C6C24EDC716EFF11FD71BECC21FFE7DB6E78273D24DCC1939C42D2E5C4DE6C3A3ED5B09C2277939B756B5B6B3B1EAAAA75BF2F23DF5DB4E97333FBB577F138F0DD71159AD509 Key = 9A35761DC115FC9DE294CBB241A2707F0E3734E8539E605E Nonce = 7FA6D62960F072F1 In = 72B4A89C778C8A7D348E3B4447228E65E058AABDA94C50DD11B24954B9F27362C11A9432CB32F1E2F9287CD4FE1DED54F83FF0D7BAB4960AA968F6D0A75685F651625E0064E939AD176CB40837D30209A2FBE85497FD26CC42ADE9B402C2E02687CA259BA33DF4818979C9157E2F236968470F784C8DB4F2D1FCB38D4318706A924ABE15FA31DF55F8DBD0B5FEE7A5B75C25B1000462BFF375231696CCB5D855D8B6AF465254DC6DFADD78875023A027228E26286E803841175EE291129FFBB245E38C594A40463FFAAF2E39ECB165454EBEACAEDAFF9136E602E81AAFA023412056F307B02EB8F519610DDD864989C72EFCE631CB7405D28AB6EE6F641C3C40F90D94DC3804D3400DF8F3700390B2D969D644C129570FF262397DF481CA5DAEF635AE4E01BDC9A5DCE8404BED7730B529D77C5AB5ECAC912F8FCEF8CEFE7FA67A8F201D5598988A15DC385398D8268E93E4105969217CA8DCD3DDFADEB68AC2F0B180792B8AA90BAECE7175EDB481D182E83A19EFD7A751DA5989419A28E6D3720585D1F6E1A1662E44D0D786E1860E7B2BAA1F0CF6C243 Out = 7F647B760303C695184EB427CF072D2CBE168C00CF8AC8BD67CB75B085503173FD86208FDA2D1C24AE647B868E876FB473A399B4A6450D8A6B3EF30353B4D65D3BC08625E965D35CFFC7BF1B362C9E01ADA3158A73E44F50DEEBE8C9EFD8EDB4ACD8FC282902D805E1DA403BE81358E5152CAE7477BCD0249D81D5978DF90CBAF6A6D34036A083A9A0B32967C192A3D19A42729B9DEBD767785F7A272A2848AFD38FDF5FAC11FE4CD9139541F7152CA2AF440CD1DDE5F69CDFD5EC5436573298D73BA1E76A4EFC03733657020A09C69877B2A4F2E4C697183F142FBC78922282B4457B3501AE47325AE346CBCD8127459F365CFC2D407EDE24143E1CC3D2D0A199C40E1EA45F49E6B21C10B36C59816979EB18EBEA2285321C3B070173A332A585345ED422A944221F8BD6AD78674DA56A047BB3406AC25B9298D2AB518CD51F236C3493B244E231F82EE92CFED77BB141211C4722C5456904B11851CE383E2D2588179FC058E860695FACD6F876A2EE98C85A5059A3681F136DBD439C874C867E429FF582261E8E189DE58A3B1B69B45D8EEA8AFECABB9B Key = 46115B745C8196BF3E7B2EE39F9B660F4FA9213328B06AD6 Nonce = 32DB4603B9CE7B8D In = 88AF6C82AD45DE6C23B0480DC8D4EF4DC9CF75C5D856FA942225C9BECAAAED90F0ECB9634D5D19A0BF176FFA63BD67F3F6A177F21035A788E0664E8413BA55B8D8470F940F356D6C7E1D1614F0B8D4E25C6C079089FE655E5C9DA7703B37A581C00B2CE6E049577887C3871D40885B9B075D29F2D92CC9306B6F0B7E673A64C9B1444BE371FB1584D894A740B3DD27DD43CEE1BC5B905F42EB6B3B1DA8D47F108F322A2CD1508ECF305E348129EB4494DF9ABC135D02748B1514A54033DAE13DDB6969DA9B936D7946FCB0317EB71C2339C2B916E0311C83CD0DDD132CFD9D9E7B29A552C899A832CCBEDFE8469863F11B4DA6D916CB15DB06766A95BA19EC5E790F4959FE647D995A254EF52D1811525EC326583D1CED2983F19232746C0FEF937C4A144E18619B62C28BAB3376810ACF2604D85E7DE879A3D5F80684A7CEED448886226F894F536943EF7354EDBAB0CD789AE1B009297364BDAB0DDF265349F47FC6A72CA1FFB2322BDB23A2D084BF07AD839FC1711AF0F551ED7428D0192E50F69DD1E728DE81ACB71D566726CC6D3A878320C4CBEE936C19DC89 Out = 748365BF0EB638BF7C3DE839631A62978A76C3015A93E582AA139D867A5FAAFB10B6CADDB5CBF08991793D806F7D05B17F80449873087333CAD4DCD0DE97194D55BA20CCEAFAC03BF2C310E38CBA00EA2305E7352316710D781261BC76B8272CE8249B2456EA225FACD6BF93E255D68A8B38D062D6CB471D52C6BD4A30653BAAEDBC7A7EB62C93CE94527860540A741F7AC884715E713187648801229803CF78ADC5DF414B85C44B92E35845AF7AB2B474B8E2B983FB17BE603AAA050EF962FE2DCB1BFCF094144BFA0851FFE53BCFCA33458287D2CA8D361809C56A99B3513E2F415414462C93C0AA07F0664B5116DDE47A13FD085500FB29AED78AB1713C04C3644DDF1503CE5A070154F18B601D3127A273F370405ABE1083CD8C6EBB97F5D71A5699F18DFF8B5B96D1FD02EB83C151D86A483C2BB1B9F846DA47B48D7345EB7318836AB1EB702F05B1E8F552ED990B8B1FB23A134003C33A83240FEECEB9A9E16FD1B5EA15377577B41701299D0130C6DBB41AEAC395EC06C241D40C541EE1D7192C39880FBEF4D190BABB216769CC75A73E12E0BB31BB4560CD Key = D781238EDFE368CC4C03919FA36A22D58A732B8817486A6A Nonce = 348A67FB90EBE157 In = 880CB4AAA5E49F2E67301B8105C7C42E4C3A021067E37A9984F33E82850BD04CC6D7948257D1B07264D3CBB5FE31AAACB30779859AC5075B9475D3B6C76B4D5FE910E6BAA050F5E45C9253FB667F557FF6C7F3E56FD94EB5D3DDE72076935F619326BD3FC98FEB8BA62788796A1E8DD5738528B053C579F4FCDEC7913C919A884991692A94C12CA498E96012FE10732C30410E32943BD5960F560B31A19C4C88BB868EB058B788AB5295D0F9B98C5AF21A4DE533368724F17A01D955212AA33A6B96A081085F9FA3BBAAC39C88E55C851D72C24B96B7A3CB574DE516A2A6923F3A17B7E896D5BFEE8E19FD0D1F73073C087890FFE0F2B0481F9FB454201ADCB0AA1DC04484EA5DB2EB10175DA8E2C003D6700D0FE3F2C8559BFD52E89295FBBE3BB2BDE1FBD452674F5A9ED11FE5E11B855D2770CC9EF058F173E64BD8282CCBFA82451294ABE4B65F36AE2123F9EBC46AAD5FD70C1DCC9BC5896D8C701BD2063C41C161FD8B7327D01003CB4F62832531DB9A964A10F0FC3D99138F138DE21DF19D5B7A983ADC46D8BB6C7978BA5344029B7CFD9DF6C6F971791A12758A3194 Out = 33175826628CEB8736FF891D93230BCA418002DD41AE0DCCA373E2E21C6D8A65217A1435E18C9F6B854E8C8D37EF0EFBB6997216B5E7D65FE162749801322BBB71AEEBEFDB066EAB2F03D80B9B82B648056EFA7D44D2AD3539D3C651316B83E21F2306E92F47DF77AA3D47E83E92F0C754DFEAEA6261241E5F2E916E8FFB09F88A22B47BAF07DA26C0B6A0DA63EAD82643E13DA28924F697FDEF14678465EAF3ECF0DC9C43EC776C098B3434921679468BBF56890CF1AACF7F5A1347B2F27B73B40AA13A060D02DF6748BB84E9ED73746FC30C6D2E5A70A61CEE51870060118A06A3439522DCAE983DAD0F4B64FACA697ECB4ABFA57E9CE9FE4BF69DD67F2AB0FAB9FE5A8E54E4E2E165DE9B400FB6FAF23C624528FEE78F13FE8808EF84D100BE45C538EED4A291A2A615E6121BE2A9A37F79E73F3C3CBA7D38FF19104412E2159BB93D07F1A125CB1669B351E5968FAE2B6BA0C201586C3270278C7C4398EC88372B7C23E7CEBF3E8CF0C6A3F6852BCCC1D9DFB09A25FF0457467736F3EE824CA555C7DADFBD00DD27B30E8DE7D3A2E1ACA8E5ECFF75F7BEDA63C70F5E57EC Key = CE99B2DAEB8D8D838770CD20797B92E9FEE44BC7E613FE26 Nonce = 58EDDF8F4961EB95 In = D184A02AF2E0E10A69A92C047726FF67AE431138668821856BC352973AF3BFBBDBD33C7E822F47BBB6AED6B8D3C11DD18667E901625AAFD8A0F4605AC16322F82FDC90915674A5ADCF3BE6E1D9198D177282E6B09439428654F4B37082CDF2F1651B2478892F2D8AB303E3A20A23E8EF90DC588AD3E36B26142F481ED9E8A922EA4E8C1D599F11C87B8FDC197ABFA65C7B7F386CA77110FCBF66AD97EC1C5204453CC156701D31A03B83A453CCDCC2B646DBA2F5A1D8EADD7F805A890FF5DE9640DF414D3AF314D32D2EE33FD81DCF70BD775ED277A4B369EE45B3760BE8B637138A1A747ADB52A5B196253612F969E9D417FA7D38DCA78D3E96E130965303A7FBC7E090AB8D7AF28D7C386C76F5553A9ABD2F8DDEECC3E4A4D1B1E187A05E774980D9A69C4653B28FECCE1698576875ABC5289223483B2759790A6F7A964E207D058A5893E6D89A623E1C09C5CBA52C5BC3AB5A3098AE3F704B69A8D20D75DE005C3F784787CA6C064CC03E4659C6BB7F4AE3C5D8DAE12DD3B94F8F462A636A8247530A46DA3F1FA4478CFF03CF08780B50FE8572C3FFAC044E0E71231D4382D4F31FC4 Out = 7F4660F693F8C07345BBD6E74EF3203FF8B653E48E6735679DDEA31C052E73D8616493FE2D601976823EF96C7AA411BABC632EF5DC6C3BADA97655AB3FF3ADC14A452573E51562AC3E85732150B20671028E64E0C9D938E398968C821C1BFEBF5874AA628D6203C95566A98114FBD1C3D5C17238B8E1255BC02885633CC4B6DD824AFF1B1E7C39990EE2E513A8F3B29490B6E46F0FCA78E7B91F9DFE1D87611E95FCEDB64F64B4A0B95E001DB55769F23D0D5DFA929FBF0942CCB615D6A8A45D7ABE6FF2C5E02BC158983600A04141A63A3575CE14B124738A4671262C75EBBC5594727FC78569F7D83B4FA28E79CADF80942C0F8093473C09C23E0035B3F821736175282F801DC82BA2CA6441B7CD49945FD9DC6539AA9BD15EE203298FA639A34BE1631E724EB320A0FC215D71631F574B2F822ECDC8AD59EDE641DE94DE180037BB815D0D667088BEADC0C3EC88C075C9BD2BCECB8BC4CFADC5DAE8A1CCC4131ED582599DF4BA9E72F9D0F103B8D8909AA5B9D0C3C14B4B85C801C864AC0CDB39AF01F3E9BA0390CB744DB2976FC8541F7D46284B6698B4BA80A22F0E8A5A796D034B Key = BE52BE195399CB2F2D84BB2C791573504C3C08DDB5430C12 Nonce = 48E24F3FF595F760 In = C1E31324A12D13EEAE38DB3EB0B8ADA43A1AE6CA8B85ADE8574E0D21699A172024989014AD40763A5D91EE0FD0072BB253E7B9A7D12AE6ED40394FAC153E781C7520CB682291B87C83CE0C1D6A16CBCB890891381E204D9CF9F54FAEA53BD70D1AAD34A837B6208F848890C9C94ADD13E81C730C88835EFA0620EB9B3D714F20CB5C7DAA0822062756748A8B601ED55A265DA8273EA5A3EF7AF27E15EE6002AF65C6AC12B55890C3AF1EB6853503B6499FC3446DBAF92B77A98439CEFABE2DDB72A6C077A94FFEC2ABDC91B1FE9DFDEAF49F58F6AB4E42036BF5A027086E57E76B67713ED090AA9D85402027D84632355606FC82B07B4F966CBED0FBB5937E8859DB8E5AD58DC2BFFA7641D5E22A537D7C3B5C9F57BBE95D56CF68E3E0748D1CCC0468D7E7AC1941B76D49BC957969B6ED6A28FDA9CF75834CC4747FA8908392A2E82A9AE352B41DB44161616B35139B4CD42EDD31162B114C604ABAE5843B2179AA0B617752468EE97398D1ACE2172FA68BF1C1D44EEEDB676D15789519DBE418D7ACC69314032E21E7316DAC522970B5F0EFAD2B1C9AF99A376FE9F7AE45E4314A3CF728017C39 Out = EB31D4353BBFD4AB9F2AAD58E69B17992B8FC696BD0D1991443A51589F31D42088D706B4D8E66846596FB317E3A3EF9A7D8CD97540B8A0421D9C8EBBBAB66CED4FF8C57D95E330543F4FD0B80C9223C2D549D08C944923E48FAB6C087A052E56842FA8E82F6A3F73C79DBED3CC018AD14F2896AADA099E7E8F3F864F0D004782D7DF3D27B742FBEAB6657AEDF1FB467B014EC47F279EA04C02025A0F8D92BCC5CF3C554183B58CC4C892613CFBD85D5AC1EFFB4A329DEA31BE1526E7597E4CC4B8FCD8846F41605B9A65770CCDB6B4BD56BDC78BCAE87AC7DF34AB059587C5C35E2DD2592347220645FE3E1FCAA5809723340492286169292D4C0CB37ACB5B0E119E0BB74C37900EBADFB433294686D7621A21DBBC8B3BE8BF0084E742C3BCC00580A847BDB76E47D05C46520438A831257F16EEFBFAAC29EFCFB661A3858EF844EBF3015C5E86B804BE3915FE70FA4085F4879F96D0DE84CD2D34D20DB392462CA346E35CF9B8A12B7C2B01613528940EBF6B7A46BC015E34A443FA95A2AB66A8426D25BB4BEAEED5859A510F3C302312C8B29C8320B33DA38AC5F81AD0D3E7D7882548E91309A6 Key = 7D0E35629102D2B43C05955BEBDC1149EA841DEF772A9236 Nonce = A62D0287246F56B8 In = 5F1A8C0633F3404E9AB98D9E9D94030127CB19A98AFD74F0ADB29AEA593F88D01B427A871C1ACD6DA823CA06A7B4EBDFDF5B44C1D63D79FC2E42C4395AB01D75D20314ED6710355BE34E273CAD52B09DCBB33780932FD34640B8F0E92ED4032E2E60CD5E07CD7CB1FA3FA0C2A1D979D48195424E3FDC234C9469D8EB61A42DE5FBD467C58899AE2EB9934AD2D2AE36366C2B0CF79F4DC588BCC6FBAB22F826F0C528BCE766FF96B886749480489BBA399D26E1ADADDECBE0EBF8B560E25288FB4D43DA676DCFF245AB8FAFFE9AC32BF57FEA4512F73E52F2B05C726DCA64D9870E26CE296A3FF506478D88899D70E368A312420133205FFDB819CA71C56378F2DC1AD4C57E67ED057D15A0DF21B5EC609E2636C88FF135544D13E7F68D59EAFF1FD71BBCBD1AD20095708B672D07BDFB559301B8E26F94DC7DD5C85FB6F238B3098B8293CAFF217BB1172E03948A53FBF1EA6382E46C24A2BBFF3B21973B9D09E5FA2E24ECFCE4920C864DA539CB95FCB9F095357F2547EE9DA85D0793B3EE9BB75E0FE66F27F9FCEC51911B037478F1722D98229AEB5C1A80109777F3D9B5C8E3A3FC24A9CB654F9B3A1206 Out = DBF587B0D739DCCEE53F1534BDD606AD25597E238CFC584242E8D04D01366761903052598AC508827D580A3ECF55FFCED31E33AD9010185F9851090D7EBC71C95DFDA4F7A1BB0F5B62D889CE9E8B086BD94CDFF73BD8C83EDB6738095491144886A23A3846040FEAC5FCFA226951D32AF26851BE06609CBC2C983E6F510AC6D78EC94BF17AC64BA345580BDA6DC7373C487B1A2942CC0DB6231C847B3B33191FA65A28E9C2DD5BA26C0F5C937EE8D61612E88661FF9F75EAE5412FB83E21D2B6843DC810624736D474075D43A6BC30F2905462BE2CDC792D436F41A5B28A1E860F24ED4C163BFD3140029D39E78FAB3EA2428399F200A2FC03BA333B313F8B81DA0A091EB27C6FBCA677C86E8E7D80FA52341C1AC478F93B9E2757322E1CB09B1F784DEFD5F2C9F3D91D5A99E04CCF81760D0EB3D6D47E73363C1C912720F56CF2FD9B3EB2C35D81E6B5D98A64B9ED907D09FD82CD2003ABDA05FCD89C460F2FBE0CFDB7B915CC4061B6380142243DF57F2DB475253CF4205B8704EE664C9ABD16CAA305F374837E2383D90B9DC40B71CA26F62983B5F3EC67A4AAA5B10137F76FCFBF40CA6F4C0547FF27C0 Key = A1693B445C656AC857AE865C2F146522A6F1C7026637CB10 Nonce = FF32D0FA13F4B46A In = 7E20C76A0F6423C7B91237BA3146DA58C3A8FE3DDCC3929FA2DA53C7796EEB1A763FF3E4D04CA218A0A2B0E4179BD20E75C847A20A8D1AFBC73947AE49F115D40A10FEDEBC814649FF46BD240D7ABA37E99FEA9EA531D6D9E796F29C551FF70AD7534FAFF4F4ACD9F97437BE5D99D8216593B4EB4D5E0FE44E0725BB9D8B2516A40862E67376FBA7D38A54F10E75A3D167BF5A0DBC39EA533CA0BD9348AD737BF38FD4839F8FE6C49B50CCA89F035F02533B909861222FC6E69CEF8241C5A098C9D35390BD757100B62643F1E406043F36AAA218FBED89808D07F8E98BE073B6C5BE89B067DCA4AE7C711F66AB32B55E07A5A413B45AB978EA8B43AC0FC2F49CA6C99322E99746EA2F5F6405A5EA22B66BDE570646F15E344B431558943BAF7007DD1D3B466BEBE184F71D7C781FC6BDFD6A46788992786AE84FDD6A99FC6FA0B32AAA2151534529752F319EF3F844612CDFACC3CD9BDEC29EE60667F36B4CD4369CFA3831967D1619194CFE30024692CF8BCD298FC88F589412BABB55620923F7C144FE0E81D3504DB4C2327F5739A698D52AA0212335AFBE7FBDB336DB943E25AAD75B15B4CDC83E11FDD5F95E15F1 Out = 5184FEDDACBC6FF99A0045F9F6D79B29A1C983E197890FCE048F1F2E112A04D3D57C0CA49CC3F76ACC4A12A032E8E292AFECBE9E1D5EDA0747951232B085F466FBB2D7237814B84B69ED5A9D93D8265DE6B8D86FFBC8F3E21013053CC6504144489B7C119CF123DE78964280AE78D2A3B6898BF4C4F6B0AFD47FE8E02ABEC7964B1FDC64EB7B4E4E738BF4805480D92201337E6E9FB7E6F1F3AA668FEB5F449ABDD8E7B8039AC207A0B0A35B7CCFEBB13DD3BD450B2C43BDA09827A9A869258993BC14E58D4E53BE3DA2E4147DAC7CD5F950C3B14DF18E4C7B3B0CF3637D1EE98B38215736EFEDFA3DD21738A3D5AE9992E40D4D64DF376039CE58EC9500BF21A8AFC81D13178958C65820B725A3B600FEC7B3A60799545CC8AD417DAF3A7049A8D45047BD03A21A4BFB630F16690540CB77B676CAE494A17247AC715B7D273F89C440944D8E0D741C17FB82F6A9A1C1020826BAF8212D34288F70BB50657356236BC0E9D75DBB86AF0A4564D7E2663FC050FA971D152EC2A1ACD627885828AEBB1780DB1264C4C00BE0E0711D871117A8080B2F16E44F63AE20E02F1522FC43F2DB7FE71A1F869406F8ECC92DE89E74 Key = 28714FA7BABF4E6A5A7E2C7BBF489209DB3826674CDE9828 Nonce = 12612898F8DF5697 In = D5EFC2B4655D791EF70A683983F9A50BCA04535422BDE57B803378854522FE5C052672D4C98C2AA6EBB1FD0B60D2A2279A9EE8D369A375C4307DAE948768C309DAD74AFB5BC442BEC942B4E18B4009DFEB9B74C37A2D5AF18A1A6FFA5133DA3B1FE97E9714158ED411E047EC6328D8A082A3C04FA058A89BDF8ECCFE7E5E9C192E8B7089FDEA66F25B75D8BA9EBDC98ADBFE50716DD58D65DA2B0E3CEBCA7AF60A18597CACF0A0541A63A52056D504C2DB3E8118F20D9D02B1D4B877A3EE36C14474D0535C786CD507F231B72FA64EC7BA0EFBBB320EE692E4EC9CE75206F8040AC0125BD4D5F0B4879A6F9785570365821863F1D43551AC87A9104D82C4B0837BF80C0F955F43F48113F01337B9B37B1E0BF0826B57BF5BFD0A0117EF5821E1E833211FEC425DA8E5924FB5794A5CFB706BDC13B2D246A89770505BD4E67B170F2BE51301219FC97F4568232A98F4521886FF6A4928E07DE8849AC38FACBE21B2D69BBF8B1FE1A44428A551F04FA62D00B2D8848AE83A42B3FA165D35E584AD036AD0746374DFE44E650F25A4F72DF59D5BB974DDE6CB7E86C4691E825453EEBAEBC13BEF7E279E63668DCD98C17CF86F309BD7 Out = 85CA6E09A63C848C8CD3E1C88EF5484E30FCC585E268499279F1DBB2866C2069A23141927AC4AFD4DC0CFA2CE44B0BA02729D5444BD946528B3CF0DA3E08481E437A7A9717EE0DB2A4E9F99A5648F8A2B9ADBE5FD7A234541C1B5E8DA0B2DD227DE6783FAA9B79CEA7C9262946DF15FA04487982A514D67FD6D58EB6AB506E7BD4663462862FA17C85E9AE1BD6ED106C639D67FEE6E85931935FB859F756EEFE59EF340EFC30B2022F9973D9AF4967379BEC95574398F48E9235716AF57CCD9781B7A404676AD1A3EB696FF7C2D05479541AEAEA281BF11DC4C16A186A9DB1A08A3DA311F9D9829A28DEA38C730B19C114A0EF1839C6A95C68487D90456603F29F29E23686B084A69253E4EF4FE70A54A9C6B3D3D4F9654BCA0A65F238AB2A1155CC78AB23D0C8DA7A749B88B800307BDCD5FBF94F1317447E57B872D6AE9FA81B36C8747BC78AE1C357C115D541B8B83FFC54B02E36D0CF8FBA7E1D54A6B033FA419A9A69C4B39040B20EA331438B4B468C0B43D929AC36A79ABFCEDC241A32812EC609D44BDAF61B3F25466668DF9F912A075FEAC397B7B13EB872D05C5A7A729F3C254CBF54D8BE179278A85D89C79C2CF370 Key = 6103C50E4C8EC76B1376D2CD980363B4354FCB61ECE2A524 Nonce = 4A9DC67DCE5428AF In = 0B5CEF18737F479CF817386EF44A017C8B7793080D5133175703BF0AF6BBFDED410B6F55A32E678AD3844E756CA9BE031028B9100B7A354E05AB2CED46CEADD031C7EFDF5CA52159BF669669997BE25DA8537E4E55CB5712385D00D4B209E475D0CAFD2593C019D942AF863824A4B24B90B2B099717D9DF0ECE879EBA5143DEA0AE4627BD11DAEA8670D5E3F52B7C5B899DFD8EBDE05619B0C349205A8837B1881B7D16463C44AD99B6F0639EE8BBFDA413FF36A94991D9CF0ED4F0F517CB8A2AFAE1CA57BE8DEE05DB161A10A1FE0C2E69673F6969F76C19F919021FE86797A85111159D9793869754CC1AA3702B05BA590B96A18859AA1D64DCEE8AA254A133AE1C57D9F7788D956CDE737D5F67B1F31F86DD67B18EEB905BED8CEA639369617C78C2B70186059FD19B21B2E4DB1755A4F47A116AB39EAD06ABB4D8754FAF932EA369DB6E164F3577F2529B76368A19A0921D6A572C220431BB2CE1D20CCA97C3E7DF5E38EE718ED4FE5E64BCDF3274516AD1452D988091562447EF94F29F0F8B1161F422A772272AD9D14AD16AAE0CCE7F9F368542C5E3728CA5A3E246FC3E65783A106AF2823166E7707747CD4FB0ADDC8DFFDA8171D Out = 3F1C038C678EDB2951B044D2B28DC10839FD112830C5A124D0077E4DFC8C1AFC8011D7FC5EA03FB9B71E96DE73E592F419A1097A7D3443B95F25F477CC6E2818CEA472C864D87A260C19124B669F7CB132004845C87CB2B9BEA7CF36983E8A5D09AB44A620B414C3A395B3EDA8034548BBFDC130584A025BF671E4662BE51AF26EF1E98045599322BDBFDD5E7DED654D8E8964692A611C292E97C7ACAE6A3C89F58248F2D699DF3E9C899B6A323FE0D4BD833922A9C028C693687E076F84096339A6B3627B2718E93F18097F6EFF14467B60040E81E0DB2FAC283D56BE1CBB3BFB47863F36BCE01DB727AD280B394AC65BCB870954D04C6CC7F0431A6F72849D25ED8D883F8319BCF21603F997461D7F9B9376A18307CBECC0D0C0FED7C6358EDD10093B161525999B50C673A557FB36F11BB63A4CC4B3C37B47EADFD332E27E6D1DFBF216C535D087FAE46A941AE6271C47736C47DA38008C78043F8097C0A141AAA2A9997013E9DDCAECBD3326D246EA06E8BCA96B13998574D9083870091A97D3AA55133282C2348D3E5C9AC097FC7AF858A526F1A0B09224D393C968DFED5EDC5E3AF267A991B1C01B79DA0AABA17CE292253C5A8659 Key = E27FAE46E89D6C1ED3A8739D081D0D8D2C8AE46D83DA11D3 Nonce = 5A287BD3FA98DA9C In = 7368741C50FEB6B0262AC0A348ABD964A042080AFC2C95700060C35A2F732B19C0E8E847D8980B81CDEFC8625291536C50D2543418DEBA82F18C807315DC5E9193EDC66E6620F7D565215E2E8444016FE1505E696F22C97F9ACC3D459E25622F84489AC227D0CEC84DA5BA682E9493489CABE454576FDEAEC803802C0CF86DFACC4A3F6561ADE9C0419DE9895DDE9AA64ED8E9E0CC5E1548A431D12C46773840F741B5CF61534BD1D27BF100935F7217E1B469647045BAB2F63CD76E8AD4C2EF60A33DB917B9B545CFD103895931DF1811471CD0BC2E48A363774A59D0DE1CE7573E06AC7ED19126CDAD543E6CC41329FBE64781F66D275B2EFB2DC12F6C20E1E52784EFC9C50B86285AAB90F30F01E50CBB22CCA499EF4FCCF8864572F27EFC34584F5FACBD5B1A12F19EAE5D2B31AC085F3147751825CA9C679C70C353D989559F84CEA30C24D33C0CB1FB9DF90F2F244661CE0E70E94EBE145F8D6ED08D4C4F51FCDE422D2536389F1CF29E9BE85B906F30EDB913DFB6958684B542A09CE39C40CF80949D85A1B6300367D2D699C4FD71F2C632208E1F5A12B3B746315E4817168C2EC4CBBA01CC6DC9F7CE84D7751EAA66A84AC639F34DAE9F4B Out = 125A71A64FD9BCF2F6199B9B7D0BFD4D0844BFECDDB70B9B3C58988F883CDA46F3C8579BCEEF47270E0B371491FB40F0F64F95CC7B055B9F8D651203ECF52E6E113998369D30C8195D18EB1CD2777814B1F8787F1B50C6E89B3CD953E04AD8FC6D0B0FF857B2E3ED15CB5DEFEC6FE887514D06A053667C5069EE6A030705CF9C32009188BA4400CA7E60884A4825F16210E2C4C4839887886EC173FB09A0FA7F1B8C2C9C1DA193326C776EC43D70D5D2CB8ADAFF2E0DC0F437870C284A23DD9B725335AA3228D047A7EDECD64CF8DC52669E72514DDFF6A2BFB0F0A9316421AC2F62A767801FDD8A00993D7C5ABAA47714D6259E86506BE1C37F211F6F91F04DB2F3FC3B26BC5EA2A9B66C91124178AA1219F15DAD459B1250C191E908C3D14E7F42C4D8756287D3B6A68051599F0E74499D13826A1B5D863CB358027796819BDC9A718EB7F62F3F5BB221B4E4406E17A6D6F04FB10ACD096CAB8FD11E602E0CCAD15F119BC8BDEB68C50B382B5F6140E9D6053640CD09FA595C08584160F31626E6EAE0CE40DE68E12717A4E174825B788448F324391C4249E0004031AB7611B59B4AA1903E67448A9FB6A2E30C8CCDB4128F3D9CB48DC62342DAA6 Key = F82127A92B2B1CE42A944907BD71363921A27FBAFEEAFAC6 Nonce = 4C10029042307407 In = D2E6EC03AAA82F6666418C4FFBF6974A767C92D2730837F3D4854037197A587DDE7A1EDF6CC053B1CE3B9B218EC24EA0671246619E02CDD73E9A1206C9F99D770F96C9D1E561404FA23F7FEB51FB14B342A9652A5FB87F55E3958EF62E3CB8979953A7835B2E51A4A68C9BAB7F2ABDB9119F4D8BA100A3CDB57A99F9BC95114F16681A111914A424A9DA081B781450413494857B496AE4E63EE999542E9091FB30E221D5F3902433EF4FC73E9E81C774D921E4CD86D6D6218A47AC50C053812AFAC3DABD1CE064859C18AFEEF63897E5DD06F71E84936AEEAC3D2C55855665CBC179E293C86DCB6CC34FCA9E32645DF23F41D3A56C1C7BCCE7C0A119B5FEE1AA0CD4AEEA3FE84D79B7BB78D19FCEFC732CD5D2D72DC28E227190C1F4A0915EE9A3C986D26EE7258C528F9B07BD377DFECB2B63BBC08621DA43F24FF2D901D4082754BF3FEAC65328C87EB52826A85DDE1C856142EAFA2C23CF401857DDB200F0A7245AC2DACE481B2463789B74CE52CF504427D6600B46E0848C2B170E8C75365E82EE1CE3A6A8F0A7091A30828DFF05A8FCC9123A17AE916D6895AECFEEC0FC684DA570C3BEC0B2CEE4959E7AD2E74007C2B7A5DCCFD76A6A044BC5E94A96E8 Out = 3A33C663146466F9B17841C6A1812CCE796F98588DCAA891E9C84AC8744B6BE899F1E1B1AA26CB3E80B6E3F9FA19ED187FDE0757B6E15E80269FFE667F83DAF69ABE7133794103641ADC35A9881B15F8DA308BF46ACA2C33B1AE937721371EE97A0DBBE65AD4DC6C18C9E2C6C00F278B8E13011BDB1F976AE8038DBA4B6DBE105663E28C2AC1E4375708433E988AFE5096FFB7C485D6ED7D57A82ACAA97550453E9BB5F2C25C0EF0468EC1C3FDBF881DB6075A8884235E23E3BE39816E29644B37DA9FD767A853C899C3AAF91D0CF9FF31CC79AD965EE3C789583E2D35A2F1A3505061F3EEF131A20E9042A75F0AA32DD4942A5B70E6BE3AA3F20CC621D8CC4E31214AA99DCCF540A80CA3F5E2093161D59D62AC065EF5FF66D0388854DF6DE68F946E95DBDFCB48A52C495EB0D7BF1B00D79883A5EFD28536F0D5D99D5217805CC4D308E6A50E75255B286902CB586FFAB43A62A49EFFDF2B7D39785D1B5EF297528509BD90AD7762AF4D62DBF9FDE7D6F26B35C183606DD1AEFDE10B79836E6308AD751B25082F17011AA7B4FD91973277B8131BC20ED6E8064C9C92DD2C00FF58B9354B45BD4D1C268CC078BEA5EB4371B8281EB060935274A1F071415BBA Key = 004742BB9488135DBAC7904BD58A56BF2F11A844821C41F9 Nonce = 1EF01ADC9729DA44 In = B498E657E77F564CFB09C804645F7E40FB6E7C2FA60EB968E3C7D23513D5726C348857B06EEE3116675596DE2FA6C576E0A01C2F95AD3B81C0D0D0D79088E56809F87A67E81583828BCEDD7D154A645D73F3BC5E0D2D1DF790092019FC292D35B73EB6CBAC179F95988BBD739BF3316DC8924F6B451AC11BFF0A01705A1B234DF82166ABFB7EB4A4A99E9041C0B8EB7DFD89B2F110AA7D5F971F58B662906B9E1EFE77B597660ED73861618CEA40535272BF1704E5349AE7A5FF16869AB91220E56606E2F04B8A60DC5F667CC35AAB44CE8F6531A95DFB17CB168131DB2DA9186ACB8CF395597FBBED3B0315F33E7AE148DD5D514DB1BCFE6153E39F4406B6FB8F5A8700135B9F8FAE96ACC7A2E8954336F4B4F508CAECA1CA351AE5D02A0B47A525E6D6171D9398EEA8BD969423EFF7704329E0249C49B3E7903C7EC514EF7E543DA8A9444C8453C110F3A9963C23DA0D8412A4DA40A0C2279848DFB51FC0932D5CDC742080B2080373A1B9D9D14518D1D8A9AB7F3C1E34837E3DF80FEB9D646E8E3143837F84031A894F5BB359AB194EF19851E965D0CF1531ED0011E8BCD3ACB3C156361D0CA8FFD1B00CBD71444611DCD3E539C41B18F46C6036669C74F04FA49112 Out = 141E77FA01EE4AC4495482C3E2D004DBC73907007B2D2A2C68349CA02738D761E2F4C40F7A7A547B81B274014BE1B394A7440AEB67BAC6971522C1498A5977DC390DDE6E40014BC654109F7442FA3DCBDC29DD1408D47C8C9FE39000CD5CD50EE73C4D941AF0F6C0ADC66EA28EDE9A575EF66F486FB1E9FF16D70D7D6CBC27726C23356D6465923CE9637A68A145133850EDA4E743F19746E526FDE79E0B12C70E2AB8C5FFE2AA766563FAE99C0F2405AE4011CDE80764F2F8EFE1C6AE12AA049357085B25DC7E7BEF595837DFDE18C43DABB514D025B544D2ABB19A690D587A7FE25BF9468F5A0E20EB4546916022E3B904C80A862CBB25DD03CDDFC4D842A1D04A960C32E03AFBED6211FF003BD2ED384D379F5F8D02BD918CC47B40ABECC0C0E540CC8D673D47D25BAD6F16BD12BE9A799B8B2538932D21677A0A481AD6986FF193A455270451E6D4DA3CAECEEBD2FAB6FF6A15F569A29D09EDBA86B7626ADB96FE9750E661C405A3542987F1E16CDB3655D70EFE3F6A1AE30C04EC069B8E9D592051190306A571D5E8673E677E1AC0454A3769C7C3ACF2C222FACA2E7F039BD5C6972FC7782A96C6F350F64F4966A8E492369B6F5A911D38AB1940046F6FF69D6198 Key = 8190659CF5611333623FBD73CB27EBF6C9BDE2E0B4F564E9 Nonce = 703710E9623D9919 In = 013202D20D95E17606E6E7C77EDA4FBDCEF3CEAEA4E3665AF9B7AA6F4C7468A9E03A382FBB0A998074552CD458522539C6ED83DBEF826DEA9EF830BCA6275FE21A9CC715C99ECBE6EA90E3AB58720B151AF341F5466FD9D1BC877C07725929FCFF62A8D2B6F3040368734B3D1425F6A81A1A159EFD39E27E5D81E487B85B87E5FE16C54E16E4D7DEDE7D8C4CC04789C8B0A3AE267968AD961C28A1828BF1DEE346E7662961DA3B207BB636BA0D2B5BE7D33D186D276002431BB17B549C3FAF8F85582AFE78AD3E5879010E3AB3C1A4CCD14C776EF17E67A698AFD2B1941ADB45F5D0444B4D06AC85051B61602233CC6162BE0360720CA01EEFDC157065D680525000ED8B1C9F633AED07420B9D04694745D0013DE91C0BEB7E7C9CCA0278011691B5C47A912DDF87EEC336E12A4207370128003A347641515839A885189293F445C4BCB26148840AC667E4D48E952F68E9C89A7C5FF2B8C463A98F39B07C8104A5DCDBF7B72E71E17C522CC5E0851BEFE4046E836410298EA4461569CEF948ED12DCD73943435F948F431380637782D59EF8D9B6B31C175762ED6C44740D1AF084A64FA86968857933150B22595B0921D9EA37075914D638D768670F3F95F0E40D5660B2A023B17B Out = 29A49FCF039DDAF22E6531915769B12323D2A48CF1F06A71AB14AF22FF38C816A8469B6678ACB7CFAC479B830C84E65F4E4090C888B5F5120347531332B3690FA5A000C2904C25118BB1BCF045815DF8C0CEE58119CDECBE7A6D1F042E64DF5C4578F1897900DC50D2C3567697593A9FB8929D646456C930085830929F59C4E2D8262989F87146AF16A61C2A15E1C3126EE9AA97BD2EDEBAB648A098BA4BC6AD5B3455FA539145E57943BA347E379CD24FE0D6BCA965DA723386FB569918179A8DA0D246F70AF48C7B840A23DAC840E5D5588ADCD86BACDD5D9BB39FB71D19197AF5F3707154D14E2610DC221016FD9AA1B0755059382D620065C3EAD772AA4187DD24C16BF481E21A017DA62D5E521F3DE2E60DB4BD96C3AD1BA09663143329A4187C23F2ECD2DA585017071667F1C382FF3F3A3BC50BA23BF6E7863AEE19C5E11032925F9BB28DDCF618F5A594B15F56D077D8123C015077F6AD464F787848D195A970F1E0030978C81D2C86C86948B0DA7349517A3486480E29B827F18CDE8BE517B2FE120E5FF6546575F2DFB2B45927E5C69B94FC016D44C5FC8ACEE3B96229491D8D46FB07E5158EAA021C6B69F720DD57718D928FB191B91F78DCF6AC926DAAB34FA33133 Key = C56605CC3B7FDB9E645ECDD67F66707C6CD05B348F14CD2C Nonce = 4A2073674C9330FE In = 795DBB320C532AEDB31CCA66CA67A437C694AAF459DA1F46F33633FDFFA9AD8DE60FDC7BB6B10107177AD6540A8F6646A6632D9976479B10D7B54907C81F148909A807130A56EAA7D3DAE7F45F908CA14D9FFB78CAFCFFF2881A63FC9D60315F5C35086FFDCA1A244F12DF72C5E76A8D004946911A4A8E56DD769A2BA56EDDCA623CA5A67917EA3CD37E495CA925EDECCB0413759D7F2888A242ACFF15946027C29243661AD28F07CBDF7CBD2159AD5FF710B31F2BBF8138857A5CCAB2A98628A2F6A22B78B1F5E70B7F006CA702C6AE1A733031C70724BC1E9AA91807B5F7CED0A1DC49792B89C557B1C3C189F093471035D73ECD46557AE8111D7B7DF0708E4CE1958D40D651FF4E5AC37C57F213F144B78CC22F701383AEF41F017BD4275E672D9875272744C60D53F71EC77E55FDD2E4DDD7A1BF965690FF89C0FA6F0D876607A8D04A4AD292C4B2B528F376314A0378CCA764BBB4A2BB9A761EDFBA6270827C222D4BD479F990ABE6824C8336021A76F4B5C5F777090787E1540254DBE3C301E8103ABBF71B5016ADB11B6CE75A09ED4A5FCD6E1F593DF1A947E92E28843E807231CDC13BD5C98E245304ACE15566DC34E3AA5DB8BF2159E1997E903D64DDFEACAE8E02126CB1D56BD9 Out = B943E172A63343A1DE25F7148E75DA6287C8B5B343546A2A280581112CEB3BDFD270BBAABBC802249CA134027BEE0E96BC6A04EB7A34F81AB5749414558A5AB93B3D8B3686958B25B4A6423D40D6D8A743267EFB222D283AEF1032839A7804BF2FB9739064C5D0D3ADA84861AF5C0C7EB7921F5B87E13D4B44E0841CC92C3C87175117FFB932DB9EF0C546AE90209490B138CB9EFF67E32CC9EC218F55B596D7B477F4C64924E91D7DB2FC249E24030049537CB120E3CBF63B1CEDAF930E8A675D863E21C4AFE3344057E4C368904CCED47BE9ADB0880707109781788AC56F23513D014C9529E35684F519E8ED795937DEDC0734AF61A50DB9E48AF7401701F8B18707D86244DDBC8E0330B2085305D0446924F30587D260FDDD6E18BEBDE4A9687FA3ACE3995F386D3ED9B7B8D646DA4A44C664DF3DA832D58634F00A2302611B81EB7C4C9A88C3115E1DCB55EB3B92E762AAE4FB80243B4F9C33E65179826E73D57A04C0458070DC6A6C0428D1EBC4C01875B43361140B33EB67BDF3DD2C707B9B2AFCE9C7E5D2B193CB1E9ADD08AB31496D86B3F3786329CADBEE270B9BFA84AAE8DE2059CE88B409FF6CB9743B2B5E4F59C4EB93565021C149CB309CF9E55F99D94B76C271ED0C89FFC1 Key = 23410846065EA605C5720B0BC2053E5A2A331B486657D66D Nonce = FD110946E8F54E87 In = 39CB105721050C0EA06846CDCB0CF939692ED1A0EA2527BB8D92DE135AFBE071417BAC099F3B7F7A06EA3EDD121BC333B7E670108B4BD0C3DF91353F75B452AAF2B24E2D99CD0BAC055F7AC5AA4F6358719E8973E4E2E23E26E2912B93FFD5E9E4CC61EF203D72ECED180F616D9ADDB797902E96337E517B481F8EF39BDC489342534703800AB246852EAEFD3E715E9DFC240515EE4EE5F74C819021A4A081B27D478C59ABB5BF83C8339E2DB5CF4AD779C62579543A8EE1CDCE1D8AF9D22EB267EB4E96D7A3771DAE1EBE3E92A1376BA6217CD351B1DFA28E76B871F55DC79F2137F4A6271616DACC5DC1052BE7B01DC2DC740BE29CF8223633CA3994B6D970E547F55440E2B57033BA1E412F25C97CD2417984EA264F2E95460F458C99B40AD29753A43C789E8CC5D97813BF197CC64D7789DB8E7D01005596713DCBC24A7D05257FAD9D635777F497BEF9B993620B76CFC8302AF18AC76A53864D53ABE4EC08A02C7BEBE061ADD158C3D2805202B000D83DF112BCB7E120453AD4C347B5AECA76F76E1319639243B21591B938DAC089B828B381B0C3DDFA914011D658BD000355ECBCDF5D6A5C8086C8AF8CC6840439D9FA842DAADD0E5DFC14C87ED52FF46A33DEFAE485648A1D67588C716D4E9A Out = 5DA8B03C7F9041D7F41CF447322736D97FB954D89DB08BD936B215771583B2F220491501206A18144168EAD7CE59C279B9E8A28C7E4CCC02573A672AE08528FAB030FDF7590B2A7403D960BB002460A2D1772E1CA43BD503931E13C9C4DDC2DC4BD18C2982C9ADD95935E24B5D000298A3887AC27721E870D088FC2F8DD70BDF0B2366CD4A2A9DA179E081DFC75532B4FD9F773C906E151CE8CF8167BB212B60A0332D2AD96AA33A66D64A5752713B60637BD599AE5987CDE0B4D7B2589032236050A74BD65E5D0D27828B9E3C11D1C08AE1F9FFC60A7CD735BCAEC5DBF179D73BD88639034E1F7C47E955F192E6D90F6A8B1F74F00C7CBB575755F3A21E0A027EB2F7A8A376E7695001B521154B4ACDA68E2B3399DC5FC62BA6ED1DEC3958F3FBB453C957EB0610BCCC9F1177BA138FFEF23B91B2F8A45504A251302DB9690D79638A25EEB406A42B759A6358EA8FF886FA9379A5223DAF765099DE4947C65CDB30A3097DFD1A7467B3A739D376A48CD2942CAC17BED5E7D937ECE050D5DDE77041AFE7EBF1BB4B2D5EE6CA982492F50189EA1BDCEE220BA900FBEA1E125D6483207658E46918A3B7A7D147799D56F3BCAD506F8849C327B293BD97D86FCD2B7B5A3BF9241D821E5C96C1579206BD0A Key = 9448DEFAB1274C6004C98EE85FCF97CF8E3841ED05AA05D6 Nonce = B909B4879F2AB8C7 In = FF164D432F068EF38BC3573316474CEF62A7509808F849B9657443D3118F462786DE31D174FF8BB86DE93B9D92E85117C1F2475D5B80A5CC7F8C91F2C576ADF93ED9F5B19065006C0D8D32FC1C1C13D3CEF6C93E5B018BF908C50AB8040A91BCC433D56B770513E1FD2BF4B487B20ADC0767BA5A9ACE2757DD84E3411B09402AFDE27B886717A71C043B00CF2F35DB291150756DFF5F748A5BF5EA6D3A66C0CF08422673EF4AE2D939AD364FF6C892FF54723AF65F9E53FC93A5E439E1A09A61F3E02C35F8237719C3787C16CB75077772A9363662BDCAF4D7A323D613FC2E5C6611BFE8CF1D60BC20B6840CE89C96E28EF4828BC51B36C05C5BE257370718C9D0F87B3B486789DB2007707B37C9CB4412E266D17256FE6C6EDED088B48DA16336E0367DCD5560BA5C944F98D7AF3B113D6D6718CF7D530BB2F25B32170AF12227379A542E3071EB880A999E390FEC21D772F428BBF23134A386AE761477CA68D0860875A11E3B996DCABB5559FF87E64A33522BE02CB04B15C3399788940FB271167EF6E62AA26B3BF6FBA03B954342704C4007DF1780EF1BF8881B13B4BC0123734D3A8DE5C38A864E40BDDED3753DD2E7CE955B79CCE31774206BE9DB4B22BC8E83C6A473E76CD1A70C29B230359D741474AE Out = C75174D425E5658053951488BB414F89A2EE1FB266DF278BE78E42DCC27461A4ADC4F8F443D907A6D226189E69CEEF1801BCB7AE721F09FD2518CB0B95509571AA91372B8752797E5723CA1B70949C1C9BA8F59B56777F230518932173D17E6D5A7D4E8A2021902DCC244C39DEECD1DF9920A0F7A14ABBDCAF57B0D5EA207FF000C14C786786C710A0FDE97AA3D6A5F2988DC64C17138D0D45321C8409F36226FDB59A73544C52AE279F0EC64AFF23623DB81349CA8753FCF7D7BB9E31FC1241A88B9E701615A71D3B53B8E25A621F85F6608B01A1A07D8CB84DE5A5CBCD2AFB6DF5571E13BD39011B97FEF0EFDE5446D5C2EC729176A2D715DB5B6DB96F70DEE1ADEA964643AAC3D2D11FE277C8ABE07B53D4E2784D54E09CDED91CF09219C76448E6889E2E7F44FF0E908ED18511749496CFD0E2C923D6E7F6E94E8F50F6A8A9F33358D612FB968A75CC73A86CF9174B0B99E14409CF1496056BF59FCBB5AC504B4924AE7B2D7C62470CD35E847C0E3AFB86456366255912843832DBD393E127CEB9F87CE376247EB464E08C34DEA43E6876567B3215B56CFE5130CE1D39B9F6967652182C9306CAB89BD6260FEBA65ED74908D70B00133553D022478B82DDCFA7F15A874BE568BB37A6B2DB1D5E8CECF4309D Key = C8F54AAF1AC36D94D2E0332FF63AF41FC4B83F9031463CCF Nonce = 33CB7CB2846FAB9C In = 94E86836C44E6AD45FF50CA1A0D74C5025C397B9EAF703F4912578A324DE2556F06924FBCE0C7E865B129F9CB4CFAEE0837F9D101B5E8CE29272C7EE1A6AF58E5EC397173B20C2682912FEDD5AC40FF0F01711010350AB88E4CB6B806DAC5D7BBE7422AC1D1FD83B0DF3A8E4806B7A2921A165A02C0F22949E6D97EB6DCB06263F9519325025B7F4BA7EA7345946F575171D20150A3DEB031417F752E1092E55D669052E1E24C0E550A4423DFBE018CE33197AD4CD7039C0FD962BCB900471B9A1B2F001B5C0E8A40B7A3599DEE31B072DBFB81F5A459D4CDB975CE2CF984FE50144D8B29BBD1B2147197A79534AA4AB22108D4D20CA50CDFEE235B0B5AA9EB247D9E9B9873488F9E5CAFA91C1CB8839E6FC4AD39622D58300346FBB7910BD3296D6827685EA80A24FD821AB914B20A7B9230CB34E056487E5A590F4E3CD2D03E56CDAE09426361B608DC93D2C4E546F426C1DE6073132D497935E02A124D1CBCF08E6368071E24F1D27DCD7A3B586CD66D7D215445257404D486008B7275216EC6BBDDD4379AEC026AD02EAD7CA7E7B480F6839C74BB8D4FBD758FF3BA180267371CB83BF19AC6F30D9A54962CDD85BCA8FE323FBFE5FE55191370A450FB941B77A7E89942F605275F8B61C8333FC189256B21D20E3C283 Out = D5AE51A811E1CD6F1BE11CED422314814B3D6CB6D8547E486AEB4C053227A39F72E54DB1B517793581951534F4EAEC79D49C994D25DEFBBB96F0249B03880B730CBF723BB1C49CCB5D94A1A12D21BBEC2B8C9D58CCE5BD49475307F8BBF7F737FEB52E433D516EB59EB48DA4E3CA3025275C190C4C3F306BA801E7175211EF6FE4CBFCD8DF7CEE48A6A3936C0849075CFB31D572187EE18E6F057E7EEF784D37D4BC28D36979E7A8D0715569D32CC6F09EEC8D27A604E07B218005EBA77537F856F7D883592D166BCB5FFEF722EB76DAFB12691A9BF8C635064F3C6C153BB8E18C1AE48D6DEC6632AB6047743C5BFEEA51B42FBA59F500426B17C3ADAD9ACDE60958C00EB25B592E183E7D54A79789D08E97B499EA1011D252C07C1ECF4389A92031B22AD673EBBC51CF30E8EBE997BDFF37E886227BFD88F3C3721EBA42C6D73688BFAD82CBD864BBC9919B2FC52B745E216D2AB8FBB6FD1A02A99D77A32D05719CAA4C5438995C5456DD8E2725ABFCFF7FFCE426311AC632F3E0A929695262C9709DF208EEFFBC9C02AEED55BFCCBA37998703C49279E0907FC091A17A74EF43A0712996C2024F482F2988C6CF9219C21CD35A9E1DF0990C5EE26C14BE5F3A7504AB439B406628161F09856E8314E83A9AEFF2000EBE4B Key = 2C73658F0111C07A0A75A1998E5B2246F7A3A77AD7257EDA Nonce = 0A8B3AF05B4687A1 In = A3F7314020EB905728AAC9648E0E20A48E076775ECE129CA40332FB23F2E37D4E30B5E7D7EA1917124AD8FA313430BAB8FAC8C68154F403699397A10B0D802D9A933B663F4F8B4A4EFAE5C45F46ED57E0CB54CA070BDCD5D22ABD9079E7DBF09598F0D97F4FF706736D52B46C197A89777E35B09FC5E5089D1F08164E90AFB28D0ED03E8EF28AB434390BE895889AA6E1EBFADA0075A654ECE885B479C89135B070F3B705619FFD7C42E7F0CAD0AA3B0584452D55E8FEC6EE245AE724216E7762485ECBE03ADFA4E71C25AA8EBF3FFC6D570EC461A060A3E28A490F27ED34C7DCEB7944BBB72D088FDD91B6CAC1B6C6975CA4B0ABC5591D167DC0EC84E172FBA6887A875D59CE866ACD5ED6895B67902EDFF6419951DE5C1E337A357E7B1DC04B20BB791BBEF56148AB3A5BC7EC6B9580EBADE1FEC6CDB1698EC5CDA5A99DFC4B1FF10596243F6201F428DFE52F6D1034F4E31ED193165991C5EA3E6255B8F82F3BF19FA2C1C9E949979DF32F665054AEDF199FBB530A9C3E91D5522504CBD51A41D7EB885E12B952DE58EA1E1BB88B1DFE0D15B0DCBDA1D906BC03B1ECED1386C413AC9B375687F0AE00BE6565070E019423844CE1999C20E61C5A9C216CE369510A3CBCEAE029AE651645797FB03530FADBDA8E3115191E0B3C210 Out = C7D08547D362AAF8FE7EBEA483A38C2889B0FEF3B4AC797A3529322FBE638F615338BC15A6C3AD0E779602DD2DBE821C441299B587636B5F90FCDD7215ABEBD8910D3C528DF941D03CA84FE051868A782E907A8346367A353F0DCCBB7BAA8FA7066B9B2E5BCF29E2D20C42F9D605C5B593B07FBBA4CD04FA9B5B587D555BE5A415C5658EBF26F774E3399E1C150E0F7CF45C9EE4C71A06D9E4D3DEDE7A51BCD536636779FBDB5FB616243759A731DAD1859012528F1AE29EC798645E951C6D369754E470ACC5C904D0DFEFC8830689BA946D7D2DE3B7CE502077B4C17337B647D6EAB7AA8D48E9C1F1CE6893C69F2251DAEF2DB88259934D12AB1A4D1A4F93E49B5168C109700F9E716C7DCC6623390C3008508A0AFC987670DB44F9FFF8E5B1D4021F4B121345D144ABF066757D348A0BC34D4DD9F75008066B5BA444C86ED5CB02B8D8035DC77DFA56045EF607E559C3AE9389962F48AD3496D8E89236D77CF668711862777B88E3E17E6680FC4A70526FA4F39688EC1C4B7E47C539FC2A203377E4ECA9F4090D9AF9ACDBA4C245F1B8342AD9093F6149D3D98A695FE5DB88CD6A7961C6C56D739EEF31402EDD9EF3D80DC1D55E140A4C2BE8251D2FDFC267F745682C3F67AA3BA8F5D1DC0330CD5D455BEE89AE1AB358CB490BDF Key = D6D8F361FFDD7D2DE03D13FFAE2C81551A4570312D58EC62 Nonce = F6A50F45C5AA206C In = AE7DFFE7F4926AEFBB5338070A74A9F6E91BBF11683B676653D92332A6031ED483118B948A940B211051606D97C23B26402EE761BFF6499CE4BB517702D9CC1C853B42261E42CFE6626C92F026C78CB86771F2852BA6E334420D04294A453AD89CD84014EC614657C3F264D1F657C69D3DB370FBD19F338C6CA6F779540C88986EF698E484D51D87518952EE663AF8C066855624E8CFF94F9889CFA90A9E7F2F6D4EC5119A6CC36F0C6551E5786A671A1EA74A5D3F6D9845A0D7764320F45FB80A8295D9C5756B91C711DFADB8535D3880CFA8025726AD4ADE8005867EBC51656C59B63AC950E1D2597CD6B353EEEF211340415CE4EC196E10F0749B890E483D5FF600BAF56FE861F6DE509BDE62C57D9A50108F0D9F148677C3A4E350816C57ADD907889137271A267D6943405D66D1C6F88B994CF7B9306EC688C4C0EB3E9F2D7E24DB280ADB515B54C42BFE4DEADA12B164329FEF3ED502DFC5F20E6ABA1EDB0F071D1248DB67B8CE6DF2B714ECC3FE760BBE70C5E99D532B79727489959241AE6C64472BA435E0B0E51989D9C20F3469290C7A9CEF78DC9877D08B4A0D709E2A50A954E1F35AB9846AE42E4CCD466667EB19EC31F93946DE481738E812B7304C70807ADED09A66E6783B96F017D95C86DF0BB39EBFE5581A4414644210F3 Out = 50F8886790779DEDB925B5CA21E0F071605ED5418B440B79ECCA476281C8513020752B6EFE34CA00DEF44AF65EA9E98AEADFA9B646BA3A65B8FEC36F414CD0D971AC921644DFCD11774BA16398160DA06C6A5AF3DB6F9A3D2D012E573499E7E84B4324395AC646B1DE374CA0C194FC325FEA7345F1A6FB8F0702044F61912C859F8143B4583D50041E91CBB1D520A5CE3AF83F00D4D2C6EED07494F275FE4558B46669D66FA8E268AAE3FDDF663B0A9D36381E6839BC81E0512F767E32195F4857BF604A9C0786E4F63F36E0650426A8858DAAB71616FCB822C69716AA05E0A12E0A7B37EC294593703525CE56EA77A554BEA5061E7AB7DB4076C035B0544C6B49EEA6E968EDE4AD659359B8BBC52D81D547130B6581BA3138308598FEAEBF554276696E84B38BA0344AA9E80139363590685EC282FE2FC9E243897A28A24CA89254893DA7C5DF62B700992503BE2B91B8588080BFD61A5CD30F03C46A2099E88EC7E118A04080D55E064AD9D5D5CF3D00727CC66D1DACE00D3F0BAF5F24EEE6EE80187A6183F2F3A9E98B6A8131F549D8F7AF8FA2BF63AF0CFD227661EA565551E1535EC45A6D4219BA9FB6DE4732FAAC383032A7D4F90149277486E5F76D8CED94FD80030E285E4F54DE215C8ED63402A963B6526BC3C9BE5E28C6B7C02D1F Key = A9D0FDA8E66738A4E3E5E8B3C4B4A4E0F6D9EED74A1B5C77 Nonce = CDD7DA51E14D237B In = 653E5169FCBFC8E0C9CCF57474E5F19C88A359E1A19770274394EF9D9CDB4ED9457A137ABA3D09644D26389CA6C0ED305A45A6C831AD15766F45885E245A61726B4A10592A8C09B2306096592B6457385CC9095952C19033C389CEFEE6C44EB88F330DE1CCEF569FF52AFDFA1A53DB226E6BFD0B5C27402C4443A466B494BEF31F24A851FA78AD668C159EEE859B24926ADAEB4F9D654F1954DA30F1A6CEB172CD8CEA39B7ACC205C65F7AD550F9835D6B6C35DB88F7B79663B7B5A5317ABEC57C9412184AC42B5B3574571180CC808F5ADAAC97A5EC9F8D957F547742ED420C1760B9176B37CA4251B393828C0BA648841812CA3137B1FC8B90DA7A1E3C0498FD579F9E3DC1A590B6775EA5B5A23C811C0C8E638422ADE05F0432083CE498BDCCE6D69B1C57C37C1A95C28471DACF424A1D94BEC17E7F6432E680E24757BF9E1026585C65A40CD44F78C695C2185E7E10C364B760DCFE5FBCB897B4FECA55E1488F95FC58E3BAD40B205F9C74B2F38924253D68929C6E7D3FA160E8D77045C05CC7517D6C7B960543DD8C04E5FC5D604BBD15E0F9CB5033BAD7B11EFAD14F990D7F887F555C19E01224035A4AC43D6EA6BEA8C6B796B5E991EF8DA089981E231A9EFD24B49CD38F8114F2A41C18489780F78E0A1A900152FAC2C253952C27209FC9DC04 Out = 301759A39A270E4DA92FA0CE410EBF3DABB914CA0BCCE4683BA76BE517279174846CEFB1A728F211826DD38ADF512BC2E2923068687FBF9C5EC9F602517CBABDC190EE50E578D346A809EFDCB3A33294AF734FF6226643C7FCAFD86B37A5DB108379D6ECCC41A0BF30647AA85B4FAB76741256A5D1C45B509F57150E88EDCE9C1EA8001E98C226252E2EE85F21FF7E75DD330FDC9054AC82CF4B8E3339BC6FF0DEC415ED379810D6EAE3D94073606352857BC52AEC07D7AFA43A8B2461C5A617022C2AF5FEAF05BC2423256FD148A68696B8604143132AE5F59A7AB984DFE6E050E3B279CA4294DD73E514B48631E20F78EAA96F40E749FD810FA48B3D5EEF1C0FD66B14F82305FAF6D08D04A5755F2880036F274BA069D9364C8616B812F229679805B707E6C24957D0F112F694AA89027E2524A0F624ED8E8CF9127A0D5A1A748771CFFC646C819A6B30BCB1BAA11F906BA855DBE790516BB6BF97F7B03DC75AB06C81EFE4046A21212083CD62D30E250AE261FF119424603A32C199DBE1180261A338128301F43557077EF35E4BFC8924D23BB9F7A3FE733583CF6D850C67926C6F082C21B2BA7E0D9A52289D8B0E37E861BB8224AD24DB872A4FAEFFD93FD1DEC41F8C1916B4F35D12FCFE4A5324A37D2F45C0D2C3F9BCA21D1554CB6ACBA88FC548 Key = 0F33CEF21D511D5B58B022428E60664D17E853D031EFF74B Nonce = 0A6B64BC12561FB6 In = A2430BEE2B78B787A3711A1D3AFE40E0735C88610DD04F7AF71A1EC3FC6A5F516BCB72E6E6FC23F49902A86A06633C409333B0B7A10A6D795548008C8E62CDC7CBE8910FF16330B39C9F440684382562F14CC2A2597A0474C49FFB8E7DA2A4453DAF492062F69B7DA5EF4BD9E080B950A184B20639ACDF459EDEFCD4E43EECE0524CE005144DCDB5BEF5143C5F6117EF49794AB8EA70A0DB889D1C2EEC1211511B5C16C6C4000EDFABB59FAA6278864ABF61DC3B7B91D02272D69EE06BC195DB463CC5E48138093DCDF26120F393A61B18212BE4844738CA17E51AD52B78665CC4CEED7469511F2C01FBAA59A65A033A87792F4AD205A4DEDF9B9C91F04366227FA1322F6CD39DCDE3B8BFFFEB50AC052F48CBAB2CA14798458B3B9A16B6223491C2B785234390339EE88E3C7EEAD5458EB03FA69A3F511933AE0F079A2A2D5E9F2684446AD707F6F825CD792C1A50C50E47E537B816B89D2E9C126B9A2CC40E0ADF33D56DCDBD344734CC651D5243080B0152FBC5EEABD59CF4E784325AC9A058D8460C6D557DA9B418D08FD836975D8E8D7B47C3531BF1E208A9AD1AAF3E2862FF586927F344570F3DB06A3F7EACFF4D67554377645F850B0821343534EA462AD8127299D4D549CEFB21AED61A8FC921AFAC85A957CBD12262DFACAB9E269DE4E42F1667B5E3C2 Out = BEE849F8FF046CAB988F6AE1311AF3C2FA5CA6CE594EE9DA7D8A7EBD065179DAD6A141EDA654ED454F46821F8E484D805BB375FC081D0A53AC35DBABDA69C43F20E8FD10CC5CBC65A6BA7FDDBDDCAA111B07FB5F6B091EE3A87660EF5518F7C086D8A8375243F9011BA6433ADD2223F3B8CFA96CCBF8059595ED3908C35655E27D97CEFE653321E48D1CEA8B8426488E50AA4CD30775EAF55C3A84BFF61761D62AEC030518ACE8B5417333B9E790C1072ACC36ED6FC3D40822F63ED74E183471A2FAE3128F61D2100E2B842C4C1ED81CB6F2DB031F94B7F4E39D170B1FAB202470BD3A70F49E20141058B549013CC29DAC64CB3C56EBF50F0EEFFBECE9B226EF7D40440DB8AC592CB7A16FA1E41190174D70DFCF04DE7F384EAB679D30DBA8032E32472858F9154417DEEF3224992F1B9AFA4932233BCC6A03B049281E7061AB092C820E68AE4C57E5B578728DC89C8095B814A50DBE15F3516611939D77DD6E3A5DCDD9696A89C3C369AA2908E9ED3A771983BA81526F956D8B3BDAA33F600869EB76BE506AEF07B1C68BFE1E423AC6D10E4ECA7D40A35691FFCDD4109AEFC265C7BEF396545A052F24FDF563E73C767C934D8D1ED19BAA6D2D7CF72455B6D26F2C7DD1017E1C2C2651BB1E61EA71C9CE6D9E818AEEA5FBBC81797867B606582E7BBCE28538FD07 Key = 3F9EF31A91BDDC965C48D6DF92F1C2B094A47C2E5F5F0E06 Nonce = E0CFD4BCD2DC6B55 In = A33B7D0F50A3AE535EE81517D4776C461BCF7464C2F155449D563FF5C70CBE9A749A13CD728133C778B31ED75C962C170EDDDC34F21C8D4C3492AF837DEDC24757D1C344BB2A92E3F604981DE16E3222B73E5E3266D5967420EA25630117F84AE70EED77C8B16E53F61901B7A936508D469CF3062BF4578EBE0FA3C70AE9402DBF1DE0380AB20CE99656F5421C2B3436E1EFEDEC902D938371D01063B9C2F9841EA22A896791C4916E42BE6952234E6AA29069EE8D61A10B84C44CCBD5AF7A4D05F6BC02FE443AD794D32B18F05629CB52BD91DC514E7F99E61839A3D0E3FC5DC34B286010B6B9761DC2140C5FF643869B860E2444C0097D89287127AD6617832477CFB94CAF234D0F6877CD36D805ED65DB35B4B8BF4985D8FCA8C70D57C50F1A41D43229A7C88EA1F4299CDD56508B6CCB07FD3AABB9AEC3579FC915483C9E149B6F42A967F84831194C72B8AAC97484CFA2027FAB6FB876980479A7312F020C25E5C9071816039EDAE8A20DCBE76F89563337A7FEE287C51624621807FDC76769B375E7D98332DFBFDB8B4F5C1882E907FBD39FE2C8A908998AB7D3E663E173E13B9083316CAB80C8583C3556D25420C69E8418040BF621DDDBABC758AAF700115BF1372FA420F2E6E3D22B8CD448809CA1AECD4A276BFAD23EF020454EA1459CF05EA99725C74FFF119D Out = 4B4C7B53B4E0BC28E7C7BEAF6AF925E324F3A3C0454240B7107560409FBEA642566BD252DB8681FC83EFA4E6DA54C4C2ABF853B6A4FDAB91F9E4F8599455CB10DB8FB7481CD2D1E69673450D882CACEBF3912078A1597A28FA8F6D30165696D6EAB0B5F7800F6519193E18F01F736C0026666CB40CD38B66B43572847D4EBF981894D8DA25C69707C739995A5635F905E25C2AEB33EC5B972EEE04AF00EACCF43764B1819D6EFF7E5D97E35A167009C01FBC7F0C24C29838D6EDAB8E508BB1AEA3FDD2E65B564A5539ABAFC877717A8D43A269AAAE8EF5F84B5CB290C60164F300F2DA2CFACD52476C5710C930CA033F832873B4B84AA15C557CCCF4A5895DE12F444C8E0CFC7FA722EF445C65F14C4A15A372AE3DE624B3BF4184DFAA65BF693147B50637D4465C62424F644760F018D36643D5C959BE24AD9AAD07C9AFEFFA4E6751AA58CDB91478EBF536567F8614B6726F266A726B9B79B178CCCF5E2069372B27640360A3D647FB7FF6BFB49BA29B3B8961316577D6423DA51703F8D67DB5CF359EDD938361CF62CC84F7BBC9408B2172D08E574C347D2D669453D786DD72A48074D283B6929B1EF4304722433C149614A6B25669111EDBA9DAB34B1D4D9970C1310CDD9246A5D250DAE9D7AEBEFF16E70E2FFF073239A4202B17413B8DD86C6E26D9DC90A7BAFFC357 Key = E963967A40FA1B96CF35CA1886CB0A200974C968007216C4 Nonce = C7F1DA502B161586 In = ABCDECCCEE654A4B3908E39259E750AC8875F1AED64A3B13D20CF3DF54B24F116D5C1A3CEE7AE3330D0EFAD04CF87E29BA14BF02AFF8C066B41B08A0A0AF3E87A04933C4B947DDCCA09BC7ED0FF6BB1399FB9DF9A9202C8A7202BB8FB1642E1014883FEB3D1C57F9D8030FCB20911AAF7410EA89F19DBFDDB006783A5B4D18F7E8664DB8EA8E3E4511F82F3E12D9EB734523795213EEB54D3CC4C077D62E89BF61C34670A07E7871C664756E4C4A2F645799C0F74BA9487EE7CEBF7EFB87ADDD11087A39FD768C275BBCF5CC3CBBD8CFBCDFAECB405B16AD243782FAC87E348EBD1EBA3DC7135DF6BB92E8D952D8AFB7A8198206ECCCC09291E0015D9C516895B9AE4A31909936CD1D31D614E39166C8EDFA72424867B9EBBBF10654DE6122B56EDB4EDF03E0FA8B91E015543B8DFAE0034A46B49BC8755BE3C846524FCEF2BEAFB3E845F0E84C77CBB578C5B911C5E76BD56317D7975ECFCCD490FC23E2ECA7C1DC4EA41BB28129782ADA77E13ED32EF1CC4C5A3EFBC85AEEDF51A310913055745B2C26C7C292C432934D1B9B3E6AB6FE58AE59CFCF95BDAC939EDC635D80A8209CD418B65D1F31FC7C8B11F4539966E6AC0534A5953C88E80E74970A8B2A171232DC112E6BD67A9D2B07D020265ECBC75FE328951705E2DEA26B782FF879CA13263348433820E18993FC2E22FF8732 Out = DDBB478CFC853BD0FF6E51D1FB5E84C5772FE3AB3FA46B59CEE71B6CF7E07D8D16DBF7E14C13D16578A1988D47F64C000850DB304EEAAA5E2DFF5818567C2EC452174918EC045B54E59FC27D31695F9503FECDAEEC2E96AF8BC170D763390CB8A2E2D215E521D8BC1C9A2F9B7FBAFE70B63202675B65F9A9F333F41154DAC6DE0B14D0A614CA3AB325A765BC21A73FB333171959A329538AEFB9B30118DA972C0A33B38A4D0FAF1C31E6C9E7867369720CA968642E56B828F8B4E8607E8D35B72196416B206335379E12CDB1EEF8C8F41BB00F6C9071940040C3B22D396851FAC1A90CD7993E58B8B1D5D31CC594A3F439CBC7DCF70D19E53F0E3BFF3EFB9101D7B63F2A175005CE8C2ACC01434C6AAA0F82433DFAF40EEFE3ED7C0B39C565461A22DF1899DC216892A41744DD623C58EF8C28B300E9D9137DC04396C67EE58258E6681C95CBCD8BB23073FC886351F5EC6C9219ED95E0F42C72CF7B62B7F4DBA8605D9B15E5C0018A41582DF3CBF3BA7764A0EF4D0140BA79EB698846E32DFB9E0C84741A7E21B059F6C9F3B27E5C26D708A92A275BFF00D0C40F6E06A340AAF2BB44D24A60A555FA59DEAF6AAF5790D927FD1F29EA0E0790181C5B2FED8772846AE5A80D59BC9FF15A5276590FC8E64879533E862BF264CD539EFAE2C3775FCF3ECD9D07B74F670E460CECE79E52EA Key = 20EF4A13DF4132039A177078C0A095BB8B4D5CD990818535 Nonce = CFB3079EE79921DF In = 0B9568AEEFAF01DE0FC072FA1F8F10EE4CC157F607EA37075752BF49C49CD91481A7F9F62522C2BF8D7F4DA1232A86020EFF960C8F7B73AA6BA91C40A15A34FEE766DD13E57B9AF0B24FC1A3D5154ED1B09956ECA158741B55F464041CC0FEE22A010270BC596A0BF988CE9199CFBDB82B3B0075C4EFD1F20EB9E1D915D6A90758502EBB2EF76A6EF7BD565C6DFE8AEF96661ED4FD0078C0D3A97249473911D14F60B2BBD0ADE8EA6CBF99030BEA5210620670C9447A70D6ADD2EBA0064C8F0DFA7C8B354C89209C760556F6DE1A586F898CA171A1F3460E370217E4E5143E855988C70981EEFA25F177095EA3F1E3EC6FC1CCDAA6BF5310C8849CBE5F5525A8B9C0D2E12DB5730B750D29AD656A644310365B0839F069DCAC8868B60F5F68B6510019EDD81544B0098179FC2D153D224A19BD2BF4889FFD4712E138ECB82F2F2800C9759AB5FA2B49052BC63703CB2125D0BFD74BAD142DBE4613942B4097643A233098B75C58584DEB1C31F8058D052A9BDA7EBAD241B1D4A3C62EE1A9F3F3A64EA96C712088DF0D04D4EC00EB9A123BA4CA039374F8037C1C3BB49FF2E1D177669C0BF6AE9E506A226C569F2D27AAFF9F3B2C6D44B7209BE29E2959CF93E040EACBABCCAA898B508FF281AAE975308A3E4BCA8740A05C17D5461041BED828FA34699CB19FD50CB7F502CF7F1A483ECEFD69E7 Out = 1F68542DDD508744386AF7313C5B46B9B36CC1F862F26338948ADC490E1398F118ACC5244B5723DE0F44ADF5797D289E13A4D13378D33E3CA6E777F3762CDEA2AC2083668A1D2EE9B330F2D688FEC8629515953848362EF3D77B5308E1637A0FED9DD590D42A88392B2B7E75E9B9A4077869A2BAE5585E60F2E3F0564578C3EFF508EF1E202900698CAADBF3121621AB6C8B2A23076F114BE5F8249B4D3BC441ED49F66160CF65FB5E5EAFA1CFB47B3CCCB142FBF947A4656E22313C7258CB69180B97C5A6B94028E9A94CA95F392405E18DA31815F2ED7D8C921D0CE617458B14782A597F29505A1DC68D3999548FFEFFBF5CED35279A73FD404DACA8AADE27C3194F033CC08CA840EFD5621F97AD8E4FC5D7797D8465AFE168630543B4FB893A6428FD340FBA18496F5DB05FCB9E43EB009F10A4D44FA5F116E9441A32A652A34E1703622F4C28FB77BB17A2DF9FE5B112E3695152693142E425753D24641641951479A90C879ECEF77417503DB0CD081C13BC879ADBAF4110C13F19BF69C5A7C260041847F394CF41481465C63F6E5F552543EF45DF25739C8B4CC46BD76B2C9A8E43F614C37BC1D19AEC9ACCBADF07BDF053C5AF119030DEE90C485D359D763F124E7DA7EC3D1D366BCACECF7FBFAEEE4E19772A7CC9733D4B03848664CCD7D0A679ABD51D0A41BE05F62F3A120B381C4B16 Key = 299C903D9FD23A9C5D88EE6837A09304A6BB359802D1DD02 Nonce = 160A8EAD3112071E In = 22D74C51876400184E31C74A0F3EE5843ED57A59EBE4E5A556B56078F881990DD2CF2DA5C7BD08FA877A62981E698927039F278FB7080EF036DCABB3F5AA742BDC2AF907A9AF315B77C98B21E3581B668D9F131B42E4729F25597D277F9122808870475CA96F15F0C6B9303B7BFD97B5BF79FC5BC2D190A52764841C2DD68E7B3C5853233674E3238EBAC0FC9AAF0F9DA253D1215092CF192EBD573AD0A5CA4BCFF708391EF0AE8154C393CEFF8CA5E5B7157AFEE5917C0DA6A4C285A5E2C328205BAEF3BF39FA0F1E145DD072BF43687DE36E4F524E493169D01D274E6C97D41E9C592A5815FF839CF0C39877BAA2F479339D62B770AFAD555E44EDEA781185C6D76D186C0FEF2F96006378A0C7CBEE19E7F8FCB52B774FD9564302FB494C87A598BB9160B4D44C51B6694E3314ED52EF7619A7D98C33A6655A702E279DDF5C8024A7E7922B148555E69951380250086BA3565D3E806B719399AED264637FAE080ED33B4B0FA8B76CBA3C05B8D81B29CB43A79286B444ED84EA2DA7DA657F6EF76BF338D28526AF9482E15ED69F8712CAD5293EA86B2540B9B1BFDC726243B3C065D1FEC80C50601C6293CA822BB5257C60E5D49F14FA1875C46BC42054B414DC4B1D6152C4EE939CFC7F1AC456E9BCC1CAAE61ECA6071437BAD0A6E21CB2F43B77E42C560DD1293DB5FD0EBFA36115DDB5943BBA34BC10 Out = A8BFEC976102A91234A58944FEA83171C7D93D24277350B3CF1123D62D50B78F6E3EDB3EBDC2823881286614D6B3BA2B81B9445CC78B624D570BAF46C4EB2DA0D1790856BB56AC46E8C418F7B82A315B0BDD5E1FF50AAE5CDD786A069767678DA38A66DC351A563FC31C438B6D2BABD1EBBBFE576359FF35652E06E0539309A1E32A924658BA34AC514E3417AD3DB053DA2947FDBB46875F5A2ABF16F7E8D34CF067A7DB89B16226FD16F474822968D42C076BF52DAB16414711FD4986453E085CC78AE5E6B957B8F4168D85C0E2C4457AC11CCDD2BC42E6B3315623B091F0BBBD38B2FC2DCCBDC4AABF610DC078621C50B07A6343A1A8442E0D5B9F8A0A9679FDFBD4DBD44818FD92570FB1C66142710A40664F5788771FDADF877A8CF0542D7582E3ADBD2C9464E329177AC757502A2AF907FCBE79F7C040BB4DE56539BAF324ED42045CAE55181E3EF43350CF2F8189A403C6AAE6D749F5B42F3D2327363CB21F1CB805A041AC2E4F6C1AA399BB17CD856B513258C29945505CA8A1D8E2871A83E56B69AD3806332D404EC2DEE586EB64DE316AEF8AAA65C08C4410395E213955CE27A7E036ED6E62F68CB4B6D342CBB2187311900489B9FBC78BF204964E298C219AA10AB9B12B64621DEEA48CA6F73E8CD638123A4107FA392C5345129B09533971A6DDAF22B462700AC85CAF79BB6A0241E0A1E6AE Key = 0C3B364010A5C0D93A13532F4C8AAA223D50ACAE66A74136 Nonce = BC05FC6E02732767 In = 61FE1D3F0620C7BA9D93B5D457CF2433F7AB42BB25492F8A5BB7F55D031A5871CD054A05544247C8F04DF692653A8C887E5FFB482F0DF760DC95EF6D3EEB6D8950D0D3686E30F9464FB4F81B54F96B85F1F0A7B76E93E62B3DF152A44D3A82A6AEF7817DAAA724BDB5B2AF4DBAFFD6BDE7E8FDFB30C5D112308A394048B59C2AEF403A62F38157529E27668AB907CF97EA49A214D16CCF6F22D7B9F673E29C58F44C2BE9134E12C1FC6AD13F846C3E4E2B738A3413810EFCC7BC8CBFC87D71611A00030B2306C3ED8B17A4A71749696A53FEDE8B5DE94707232BEE81C84AA07CA7D0686FD026748AD1E2E813DE666D2C36B99CC18901B99503D53D2BF7EBAAB9B58EB26AE05C0790FC002DA29419B04351E9BDD0D310FE3A4AA8D50209A0DE3C312AF5C61FC3F9D7D932C37A8A8361D7AB813051B2A3DCE0B6F8B95BD4EC44756639465DBE1042A046C2719D5590020F6A4E1B295143545FA1CEA183FFC6A809157678BD0F8212C3995A494FFD60FC58EE002129E56CB236169793B999D92B304026C28802A1F380DB4B35B89DDE35719E32A8C183FFF45C6F8BD0CB485B1B38C508EB1DA4DA151A75A552CB2120CF7C5199B4E157606607119F7869167526A8F3CC5BE02CFE4F37DE43CD5D026AA210984307C73E40329A5A4B503890B0B82DBD68C79D2C8839FDF534F496755EAA0130DA0EBC0E31E64F561EAB12 Out = 4CBC7466274898801916701BB98617BDB7A55A89561F4DB89B36B6C88E192776F7FAB7FF4BF9039B8F2521F1D4F5E19F3EF57E18A91B7128C5FBD507ABDF4B1595F99AF60C7F340578DE0523B2D5FD8F3BC81B997DEFC8E3F304C57A3533AF11D3604621980DBF1A96A33FE89901BF65EAC0C7AF5184100689904C7D2C30CEBD8398F4E33DEB2F3CCB9AFB41CC5895E614D690323DD5A32CD379247B2E32578373281F6B53AC37009F9CC23947FE3DDDA14EB89D157425418A10CC0BF69192EF1C63CF4869EF382EBEF0CD208788E3C7B5063E5FAB9079044520885D242979E578BF20CF1F04C6E5B623269F48715BC58D2F74C7B4F5B7145EDF96139F73F7EA52072AD9ADD0BAE79AC1961F9A5359EC322DECC5007019B6C1B3F93E19CD2A1617CC55F8E9AF9BBAA3E25577BE7393D30C23902DD524906B57F5FED71577C40D072FCE4F0D61885E28321F4E6F1C5AE784ABBC154E348565602A8C9D16EAC8A87F0C4F18FB8B4C587E147AB26F57DEADA50C1E5C31BB0920E9B85E40CB050643E2FF19A583CD50454CE26368BDC0EED0FE82710F43138C1F7AA514A53335B05E65291827A1D829700FAE7F68810E4F82E9B58CBB66401CEA0B662260339A0736ED29007DFDCDA45CB1FF76EC6548BA5AD6C4EAA0D8CE9CFA949652325EA9249F2AE7A38F88F60E9205192E2CB997E415AF5FCEDCE4D850ED2B2A44DD Key = BA9FCFE6E8E1F77EA676F3A94DBDC534860D138668519AD6 Nonce = 8782B005DAE54235 In = FFF24DCBE1447BE1D5711BAE7EC2659303A3443519ECC5993F06C2B34A714F8EC4EC862B2BB6B5F1733E5CEC90468EA8B2E1E722B4C2EEAEE6DF43DA3D4CC0C8EE36260E45E71D2FD9067DA44A1F4E25F58552D4643F45079BB52E58CDB84B2E2846AF57E6A583157D5C898030BD57DFE19870128DCF0B6D03BEF58334F7DF54F620BDD8FE7E001506331C5F9C2D6B40F88D8AA79BB60CE6BB71D66E3675096F1FFE730ACA82649B0FD3C52A6D52D55AB9FB385002E18849BEDAA8E075326224F194EA2726A9FC412063FFA1ABE1F191A35EAE0AAF1A137F8BB3388CBBF4FCB9804D2E24EA21501582ED7CA4F4A2959A032265D3BAB06F88F084C771761C4E539248859C818AE82DC4AE12291C4F4C107BAA031D4BB78E2B0636E0F825146D754AB87A420F8622B2C73667C50977EC0FB654D7612E2578B646DC5B84BB0EE90CFD40C53831BB6F39940A98B1A0A9852CAFFFD3FB93A04676B736D1552996E503ADD196FF5D99703DD3D2B91053F8BB45791331128D52972FF52A52A1D48FFB7448DAE01FCCAA8B24A61CDEFFF171CF1E06038950C09BE254A7B64580082D09FDCF17A8CC30A234ACE62F434DB980C0E4D54475BC0DFC755BFA84C1C912A5E0545F8779E3EAD6251674C937DD3E43B74E87BE10FD1F947E7FA91F7BEADBFBAB9D89FBB22997621BCBCC1A40F0389C68FA852E98FE19FB3CD7681D6111FD2B0150 Out = D5BA6D89EAD46B65918F5E7B48CA070405E60FA10D6128AE9EFB099E467C417A0AAAB7C27A19DEE540A68F5D3C20399F9873419FEFB2A4444AC4392FBA747A2486C1A7BD232089E182BBBEC20975D38EDE288DDC2EA0BA993D536A2F346304D59E90B7F47F4C877857FC812D53563189F81FAE9CF8DF19A40C6B68F0774A0E0FF67E01CAAF18E725FDA8B1245FDD1783143A146A5AEEE6BF98EDE27A4916452BB0EE509D26EA8EF2ACD80402C3F927A91F0F982DBDD7AE08E556720F195BACBDAA30FB252F54BAF3DAB9F859AC8065EE6725DF20F05965BADB31C7629C664D0E42CFE925C4D8FF4694DF23C48D33495A1D7A860B27B49F93ACA2544F523EC0DFC10CAED0E7094F0C7582460C68EE922A1B9C93248979C23FA9DDE6FB17E2B583285090FE61813C443AD3CE0411C9B53F3233088863074CBA8E63837F6EBA0A8590963797E8E238608ED3A3201A472F561257238D5434D719037F35C4E2011E43C5A9817DF6D4AACF056EBF68214BC1E89F3395D2838EA4E313606BCA816E813A5E6C13471316288D03A6B4D9109480A3E3162FBF0C051553CAB4AB4BBCF2031D156C81BBF40D115A9035ACA04EDF9F38A26D4533EE53F39F1D5AFF2FBD1F7261F2DAB62D0931FC334D1F5AB869AB1BF11E687E18A8AAC18B35EBCB594D2CDB770F01648F6D132A963375049E137D756997F46ACA56C5EDCF347926E6B67277A7 Key = D78DC039B9F1C25BE368712FFFA0EEAD0F9373D1BFA68CAB Nonce = 4C079826FB98EA25 In = 7E4A3175450AE6168E6647319B754D765EA933316AD38083332D3EC7BFC27B67F3FCFA4FBBD513362BFCCB9B775BA250A2B32705A97F6188941EB58D7DF1FB54DEB7DD98864FE8B0CF06F2BDE8C54DB44365061B0AC797D67895A593C7B93B481E0B16782B638821304676BC9CC6C4E8C19A5DED2C4D939D4A247005CCE4BE41F7FC41128E45C5E4ABD528F440CF7DD9A0FDC4E56FA5B377282F9B582434F9727D6A7015EE7EE2A250A0A63FDD4FD05C3C9ED401D3387C75C4B4E4E1BC3A9ED05D119E17557E89690DD7207FD8796F8DFA3031BAC20AFA355A97DD43EC97B5ACAB96C0BBD8A4ED22D3A39B3DE7BCE65BFD3EA5F259EC0DF383BF9AF81CDBC50E6287DBB64425E792279ADD9DBDDA90F409F4427A821FCD7141CA412594FA1BC0A82918380181ABA6F906925B78F867247AA91D8DEE8500F1484488EC0151DA103AE98B51AA8811F394B4BB8D50D3A563D291E9A9C89B933765B39F31F813850283A9F1EEE6770FCE5432759D504F5DA1D221F3C1A3787BF1E9FA611A55FD69417F60D0C7CDA5E271602A72E8EB21AA9759F9D1BE29C72953F3CA2AFC95034D68E2683A295F31FB799068886AD1ABCE47B87A2517C7CC234BB60498779E25CA3CA3610C1F0AB186A2040F554E92F849FC1CC7E083CC6649575D037B61C3945CA7DF0760ABAB83FE4D92906E3C4C8C2BA4C15AF61CC6E58EC4C8801E6C94141E9B1EBAAB4A Out = 2111619CD276C8D5110EC5CCAA217AEA3728412FC53283EE1EB15EB6195DC4DF15A9206EE1803858C7F8ED428397A353B29ED0B7F4C8725F3ECF6A1D23BAC955ED57EE53BDF1DD04DD545DECD9617BFD562E89A17AA59E4621718AC2D533D73FED11AF9BEE9D4BB492872B4D9231D874992AACA5432A4C682961F008AB83E436556863A9BC3392D4999BC26832F8189C1AFFF6A4C3D7EBAA913BAF4E422B7CADD8B0B8EA94E7D7728C2B6D459A3DF6733E0BE36B4EF63EDF9223ED0EDE17FC15F556D79E1822BD9D1C0FA45A061F6CA43FBF97CBC64E96762AF59EC39E674492E3E96AEF4F09C4F396E6033059ED0A87DC1160EC55047A4C48B48EF8A1E5BE8B9DDA609697061D20E6E6964546367506CD3D74A87CB349D5A5760CAEFCD2C21B5E005FB5D1C17AF372417EF157C6B32627C7459C031421145E20C08ACA84BD177D4F95426CA93F129DD9EEE74E532AEA737882B230A969F268DE722B97190ED7EF538D05EEC2DFF4BC89002306FC139143C8503B2C77B8262C7C3DB0C43EE56E9F41E8E038781951D67F5A1DF5268430683736BA03839CE52FF5AACC75B1459F319282E072A6CE3800722F2550780C9EB5DB283A4214A9BE3D087CDF17B53CF253A303D5C3AD95D451AEE896ACB657C12B9DC42C6ADD5DC46D085D1CCA7DA9B329E1C5C7F5EA0D19773895EC10A9A5AA6716CF25126AF5DA6978003CB0E9CE4BF723CDEA Key = 385F7F95B75CD2676193034A2A842D8AFD585D1EC7A47288 Nonce = 9176BDCAFFCFACB3 In = F47B2AACAF0711AD04EC04C760D5CF3BE9BE42CAE6272CFF7172F4B0F7F1235A6B1195B0AE0CF39F28E919040EF7D34CC6FDED0872106A8BA2969CA6EEDE67556CABEC04DB7896892DACAD714C8D10CD3120B79E5D0E886972064786699FCE1A9343982A08542B7C3D96BC02FF72CEF2381F240A2EF062687E108E5BB3F9CA2D048AA03573B08792C0D89BAF4714D1D33CF59794C9A8C6D83F604B2DC920A5DF13FAB79C6C58F32046C805036FD56B3DC271DC5885243A0317211835BB5CB852A4CAA08FF5662A4859C06228B73320A0FD1354CD2A0AF64C4DF0E91337576C355ECE02728DD5BA5181CF6D35B6521D3649B4C6918B22652093E672C3F791901B477C87EFCD4139E9D483271C56FDF33FB0BDFDB4E61C79EA7D504149B2C83EAA17F1E79D327DFDDC0C5C0BBA35B02769B4B15241DF2EBE60AE06CF221B257BC83357F0B3256E14E66A143B458BDA48F346E8920BB599D32754E0F89ECE4A832E2CE8C90AB7AEFBF2A2303B0DEC950B618FAB9B6944D99F8EDF7CBBD0A306FBA7558CCE0DB1B2B02C315FC4E503957569AB5821E9C3C65D22B9BCC6C034B68C191A1EFA3216B85518EC923E131A265323AF45BC06F3F0F5FA712ECAB6CC50B0378B04C58A7CDF84A7DA1153C58DA793D949B9F12A8AD611EE1A137913EEA42151830EF9E451E4974D30CD2DC7C15C4B52DB58C837029B11C7E5C00FB1F8F5C52DFE552190AFA39F69683F8FB8FDB843D40B8EA29BF5B26A09580B38072EC612C76F1A59BB36212C3AED57B546742402C0316CC5320D7D03E97470ED4161BC1176C54FA92910EA05FE125E3B54422467C8BE2593A12FE303D882BCCFA393F436B462743B0C47CCFC9C8D9A878337B7CEE12117D3B6ACFD051930E270043B33B6C0F581971FEC18067CFB6B5C16A7E74BF6F04151059FC04F0945CCFB31B2019BB2B822E19099F08FC9E24BD45B6F6AFF87D58D7452F5C028A91849FCB08FF1AE5A884BAE1222EA4D94F0704903AF009F9D87087D0410F0C68A574ED50E27FA2DD6915228FF2050B731F5E25464F088A01D600BE49A0A2BA4A230833C6B35EF360A06DAAA5FDAA31A35ADD1D16B1EE223B03FB8CB852B576A92488237323E017D6AAA904B5D79A60B9BD8F8312124A125B7390925BC4179286155A7F77AB0D7426BEB84D6F790A5166B97987EC2B42E84D251DE0F5DA59B849A9F836D3F5373C33CE5153EE29756D325F400F77363DA2A29DBA537A26C530A57E9368BE2236A30E5CB9D0B2C5D3C6B765375DBB6F0D79B31C27A6E0FAD4C7740095F6219B299BE7C48A954E719051A5A48FFADC51BF96B2FB0389EAD449E63E42549667342FED323A398507CEBCA8B202A99573040C384A251CEAB34D508955ADA861BF6AB73DC0A9C1D291E4A9903E752C5A54FBDE4B73D4BDF38642FD1011F070EDAC8C2370FCA Out = AA33DD431C05B53F558F5A9394D28B938F8E8149AA494CB5FDBC7A73E5E8AF94EADA457D0A86C871CFD001E14E29A7718696052EF6392B4108A66A68A103A0601AB1703AC6C7EF17981DFAE8BD1DB8AC47C211E241184B926FF6B3BC35B60E0DFF1161902106AB81E463EE1DF41420729D7C164FDE18AA42E697F1C4E01B2C495FD4E9276FA34C45FAD5AC98DE47F137D1098C0918608853DB8506CBA17C1D4C12A41A9CAD5F7F490D46C15DE97ADB0BC83854114E5F9A1872DB4A3AE8E400AFADE2D5A33A0C6663A394839423CA9B8EBF417F3C5F047C76D61E171F6654FD08EE424C2078B063D118CB3F69665342A4C16864029259EF76F303E5A1E23A7789F99206E43CF03E58AC070812B977A7D30FBB582429193CB0526211C6F002D23394E9A6D2DECA4C83A3CF092B4047FF86E36E2FE1EB09BCAA1D7B929BF9ADB48DEC871D67FEF35B0FCA8018EBEB3AB9527FBADE5AB45A47918C61FF6AE21C2108387C9750F0B37155B7893E1A13B9226A9723B2597EADA5039938AB1679917DF84C491A2EE6E76C6840177E556B35F292DA3C785CF37E477BA53A1816D592D3186E4FC4A15BEA60AB799C681D8B64A7E17D781EBB6F9139C9CCC789244A6A0E6691E278ECA60A9654826FCEE4519E8725D209A6CE4180C91C17698A5C48EABBC7BBE7F335AC4331D4D352A2C99B6784245E046A334179A29DDA41EF6BE685F634FE02020A8B787659B123BA086536415BA7AF3C31ECB3A05E06FF1EAF2DB92D794817C89C568436C56608EFF8E6745C9DE92141C0CB99A13D137D723D23092E6E06D084747E9D778D268CFE64BB2423D92BC5391E395AE4663EE83B2E8E703EA577E67EB00A6310C2C28119EE9D6C10849ABC97A55BABCA512FFEBA057857DA44BB149B5FB0900CE09CD65A975AA29213D9B6E3849FECB62A12FD85FCF2E1EF67D121FE8C9FAC0C20E1EF41C7C7F01FA177C66AFD31418ACBA38517B10CCCE1644B5BA691D79D70E4C0AFAC83FE051D871A6149BF027938A0F8E03EB10688372D65DF17EE27C8E193701066DDD5758D216C75775CFD0AED04232FDAFEA16199CD3BE58F7C6EE1EFAF3BE8D08FBB179D1D3D4AD61B8772A076AECAD5F3C82BAF24527A357DA547DD03DF1DD5D9CDB1C8DE65608E673378C1ECE400C1D2CCBEA4867E4F24DEF07CA60EE21513C52180F93555DD75BF22391A0615EBA90A9B4CB4CC95A3DEC8ADAEF579BFC78E5FCFB0AADF05223C1726A6F1367B96F9CFE7711620DAE28644514E79605F70C8EA3B60C3CBCC93FBF414276A99AB1E1F28D63E4611C1B1A0CEC1F32DCEB3A85EF7803C9B8499CFA7409E15D4488C787B2D04E8F58E94256DDADFF89A0DF9A2975558EEB5E52E8322EA46B96FBE68DA49BABE11A6E954C6724213881A4DA032E361860AC881FBE19EBF199E4330DB9A7BEC002FBC6F Seek = 0 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 6392479C6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = F67C1DFE15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 1 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 92479C6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 7C1DFE15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 2 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 479C6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 1DFE15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 3 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 9C6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = FE15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 4 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 6E5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 15EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 5 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 5917082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = EB8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 6 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 17082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 8E5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 7 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 082DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 5CEBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 8 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 2DB4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = EBDDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 9 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = B4D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = DDCCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 10 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = D58112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = CCDB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 11 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 8112A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = DB495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 12 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 12A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 495E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 13 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = A213D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 5E6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 14 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 13D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 6418CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 15 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = D5822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 18CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 16 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 822B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = CE29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 17 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 2B9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 29EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 18 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 9443E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = EBC243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 19 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 43E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = C243F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 20 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E555F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 43F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 21 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 55F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = F8FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 22 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = F2C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = FCDFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 23 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = C38D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = DFB82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 24 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 8D6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = B82975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 25 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 6AFDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 2975EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 26 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = FDC167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 75EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 27 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = C167E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = EC4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 28 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 67E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 4114F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 29 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E9E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 14F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 30 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E089D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = F8CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 31 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 89D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = CEC1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 32 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = D31BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = C1BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 33 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 1BC3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = BBD6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 34 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = C3F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = D6FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 35 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = F6CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = FDEE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 36 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = CBAFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = EE6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 37 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = AFCEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 6C2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 38 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = CEE28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 2C6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 39 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E28DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 6AC0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 40 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 8DCA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = C0BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 41 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = CA4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = BF8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 42 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 4F5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = 8BB3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 43 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 5EBC72E524E132D745E4043CEF7020BA568EEE228E Out = B3504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 44 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = BC72E524E132D745E4043CEF7020BA568EEE228E Out = 504909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 45 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 72E524E132D745E4043CEF7020BA568EEE228E Out = 4909D09DE527E1C0BAE9F462241F7830F794A5 Seek = 46 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E524E132D745E4043CEF7020BA568EEE228E Out = 09D09DE527E1C0BAE9F462241F7830F794A5 Seek = 47 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 24E132D745E4043CEF7020BA568EEE228E Out = D09DE527E1C0BAE9F462241F7830F794A5 Seek = 48 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E132D745E4043CEF7020BA568EEE228E Out = 9DE527E1C0BAE9F462241F7830F794A5 Seek = 49 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 32D745E4043CEF7020BA568EEE228E Out = E527E1C0BAE9F462241F7830F794A5 Seek = 50 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = D745E4043CEF7020BA568EEE228E Out = 27E1C0BAE9F462241F7830F794A5 Seek = 51 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 45E4043CEF7020BA568EEE228E Out = E1C0BAE9F462241F7830F794A5 Seek = 52 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = E4043CEF7020BA568EEE228E Out = C0BAE9F462241F7830F794A5 Seek = 53 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 043CEF7020BA568EEE228E Out = BAE9F462241F7830F794A5 Seek = 54 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 3CEF7020BA568EEE228E Out = E9F462241F7830F794A5 Seek = 55 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = EF7020BA568EEE228E Out = F462241F7830F794A5 Seek = 56 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 7020BA568EEE228E Out = 62241F7830F794A5 Seek = 57 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 20BA568EEE228E Out = 241F7830F794A5 Seek = 58 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = BA568EEE228E Out = 1F7830F794A5 Seek = 59 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 568EEE228E Out = 7830F794A5 Seek = 60 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 8EEE228E Out = 30F794A5 Seek = 61 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = EE228E Out = F794A5 Seek = 62 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 228E Out = 94A5 Seek = 63 Key = EE761404DEBA9A33565220C27F0813C39A5EBB242853CBF7 Nonce = 852F8EA440CB5BAC In = 8E Out = A5 [CTR-BE(Serpent)] Key = 740614949B42870F0851A0D639A37AC8288898B0F9CC3B326B983ADA69BDBB76 Nonce = 3377FFD0C8093067A0E33B8700E2C2E1 In = F3 Out = 3A Key = 872BCAEFB1985B9C10B1F2DE2790E22CF31C362AC7276D437D0DD697F1682BC4 Nonce = 53C8B7C9BA119E81AC5474FB70BF82FB In = 3018 Out = 053E Key = DE3317D05233577D476509E638486ED2ABE26ABFD847C13A8AAB189F322F46B8 Nonce = 47D690C680A567B9942BBD0A2700B884 In = C503C6 Out = DC4178 Key = A2B4D60F8F9B35C56168D80E8828F3931A5BDA190E65B9B06A814277DB2B4F63 Nonce = B3B98D928D3EBE1B9E07B291ACF9CD2A In = FC9B1F9C Out = 89FC80B9 Key = E39D7D09F410CDC21333D8EBE5E33E7A2E24872A99254AEDAFFC633061C32EE6 Nonce = 107FA9631083DE98F5C72A383F541F3E In = F1CDFB642B Out = 2BEBCA6F33 Key = 9F7268895714AFE229162D50CA59F1273744BDC28B198E1685F4323AFAE1243D Nonce = 68C5EEB64FC3DE106B99C0896CC0689E In = 9C3BACCD6154 Out = DE9920471C92 Key = 27757554DD1B5BE2E660576FBAEB238A0F7642F9A65771B69AF276A57FC04354 Nonce = 9BB3DB1661C90DE853294D20A369B999 In = B5602241E6ACAF Out = 2FD52D0292019C Key = 84688112BE481C65B282D4DF9A953526AEBF05FDD2F3D84E7C32830E3BC185C8 Nonce = 3ABFC6E1B2358A3B968E416B9087BBD9 In = 8E27C11E30E23C5F Out = 0294FE7CC3F020FB Key = 967BA8A79CCD302B294E519813B72EB5C4D24BD86322FBDE08C292C2DC4723E8 Nonce = D7DB3A2BC532D1F1685CB612FBCF33A1 In = A4CC3F182076E93409 Out = 00EE68EB6CC635BCFB Key = 6757B7CA6D7EEBFD0E679E18CB30D16ACC71D0B1A149DA27E439DA1BA0BA37C9 Nonce = 3199830075CB5E87016EEAE5B0B26F13 In = 25B63E2B38DFF81FA490 Out = E75F1A6DF39CC7A76D12 Key = F92107A1778C99C45B4E229567BF5CCAB2C5B1204052B8720161AEDCCF57E36F Nonce = 378D5BF003FB48A4D183D5227151FE11 In = 310605508E614C101E829B Out = 366A5DCEB8E76183C95CFC Key = F892DD670B66CCF6B8E458A6F068FBA79F4A69AE3A028E43D8E219BE940BB826 Nonce = 08BA9435AF764BE0E44515FF72D6DCBD In = 6A706D5F6526ED4AAEE00D7D Out = 8145258ED5FE88C34E671101 Key = BCE52007E10A2CF3077D00225C95F2D68FCDF380AC17304553FBC1DA10117B15 Nonce = 3FFED78824BEB8D6D655CC80190124BE In = FE62E34899D4115DF7FFF51A8A Out = 66F68C5AEC9A4BB123056667D9 Key = 534A1F49FCD2D99E2ED2F094E170809091195EDEA2ED94EA4DEE64F9A6F89E05 Nonce = D98E8D86E9BE95318429FD7286D528E5 In = 191D3CFE172BEFAC1A8A428DF951 Out = 7CE0D419C43342FD2CD8D56685BF Key = 41422F58E73BE8C494D750910CA612B2FDA0A41D041ADDDAB4144DF30CE7B26B Nonce = DF0771CEB11F1BAF934289FA42F54319 In = 2C92024B2587851C0F58C91B822DF6 Out = 36FAB117335A5F0C619826ED801670 Key = EDA2AFF3C4923D3CE745EB78655B0D27DBDB5C584AFE56564C7B625903CED927 Nonce = 95C67856E6EB7B0E98F0934A47DF6485 In = 0CC08B6ED36673C0591901E14AEF4792 Out = 250C9E812F38A9192CC65C6EE5B9DB60 Key = D4FBFD37C5B9D12E5E43D1867E1692A2B331CAC9E6C46C228A45E95AFA303185 Nonce = 30B9693B12B7F48C1C07F1441706821D In = C6B6E1F1BC46E8377F6C397C136461973F Out = AA0C36B960BFC811185F74D22356686414 Key = 47E9CA81E014F6AA4F94A7C0B8A533B7A636FF14E76935D9C7A3CB01E3AD64E9 Nonce = DEE733BD4644E258CF98F7FE87AD8E5A In = CF1DAFB2581C47D06D8F178787729F8FF457 Out = 10510051990A826CFFDF9014CA0B49481E39 Key = 6BBA2F42B85C58A4916F618A294553E084E223739F575159DE9EC4F5A63F3AAB Nonce = 0DCA755F625F78C363AC7EAB801DD471 In = EB95043E36EFDF2B5FB8F17B6806B2B021D1DD Out = A739171DAE7EC95CEB492183803D37165D1A79 Key = F3702792DEFB775F10B142CAA78D05DB26A4A8061CEB39FA2B4A27106DE8D9DF Nonce = 5C8EF39AE0EDAEB76CF3C10B94D1A002 In = 3277ADC7055990FDA21C89F183F0A380E71B696D Out = 610369449E344D609EEB89210AFFD1C90B05C197 Key = AAE83136AB1EC19B3BC892B0B5E8EC7A6E20FF5AC6C126DAF6189A7E2E344AF0 Nonce = C99EBDE92D57326A37B4B6F2C19363FD In = 43733C60414C054EACF68F85C67D547AFD0003AABA Out = E8F7CCA960B713991BEF20DEB3DF284ECFE912B479 Key = 222373452D105C2F58E87F5DDDF07FE464E47BC8309718FB30674770CA24FD34 Nonce = A03B629DB1C399F8EE32A7C08C0FDDB3 In = E2ACCDA4075886B085C7A7B71E39BD23F71DD16BC4E1 Out = 7A0552BA9DBCE00A60AB31F8D0E590D79E2EBFC49713 Key = CCD9F95EB29B2609CB35C959009B56FD43A60B4353A2F3D60FE78F2219074330 Nonce = 884C24E8368B3DB123F47D03F3812F12 In = 33CF3C69194FBBD03B0496F1982C570B363DDE621303AE Out = 8D2763FAD25E2A3BA7F4EE3ADA3CC05310B453734EEC56 Key = F7C88B964D55E40A04D8016900A3449015D6324DE16A024C0F9FBB1DE505C1AC Nonce = 308E6F85EE34ECE3C70C1EE2CB7E6777 In = 32DE0A03F6D52AA26BEECF4AB22ABF3A49768683F86EA983 Out = D4EE5E9BD04A09D73DFA9752A8DFAD00F151E822052B500B Key = 972C448AA251ACA8F589BE0F5793100D14EE3282DFB321CE5943FDE99D1F31AE Nonce = 11C202F46DC54AEDFBB543C3A55E7DB8 In = 52F14AAE8ADB041BAC458EF07FA247FE50B868888089587933 Out = BE61DB06D28CA4D3B418F10F463FC42EA254929C5C87D35418 Key = DFFBD3EA5DB1F4D7D9613F069BAF8737F0E37A33BAC9A9AE2EC67FF20E37442D Nonce = 17E670BC9C590D7B320A233232D43311 In = E56DFAD59ECA41C38A68C64388CA4D2CF94B319C65E033C26A8C Out = DC4A5B96090CC569B623D54BB1DAA4A7B6D879F21BA420D80637 Key = A14BB231478EBDBD7B6A7D7039559099AAA281D25D095F286B8104DF77DE0C8A Nonce = 5410153016A90F03A3863EC58BD66004 In = A89CF708448D7D4B1BD8C252F9EF7A0A7D978A1E862713F807E0FD Out = A244860FB2E83D608B25D77ED4EBBCAA7C2AF886708002C77EB5F5 Key = B5C0F5A46D855F6CE47CAC0198FCAFB7432AF8810A3746A90CB440DC2AA1CC9C Nonce = A1A57176001EF2B0417FB7DE1630AB54 In = BA6C11D80E304AFD1D922E2B35A47C3ACB34F7DCB7826F76A3C469EA Out = CE19CF171B181B3CC5261B5A38E9142DA7479F88A9B0F7F63E98BD7A Key = D684575372F4EC2F0131D786EF6B9666C38D2E99C2DAB7ADBD1C9FC805DA4229 Nonce = 81301A434C73C64DDB94440FC887542E In = 90D97D574AFA947AD194F3B94D17D83073D6ECF2FDBDD5CEE09D3D553C Out = 5139448ECB4D8B454563FF5BC6CA47D9BD23329E772F03E4C661E4CFA7 Key = 7C3F63710A6B10B0131C5BF96BCEEF6AD226FC25880A975E355CC2547435D861 Nonce = B3F1E356BDCB368C8F1D306DAFF59684 In = F4C312864C4FF38BA8D285608FC924DE8E60F4FF0E603AC7D3548CBCE1AA Out = 04823EE2C43AE04312C6F538F03DB4635D13026D546254A1E0BF5AF97B58 Key = 8C263F3C683F2C78E8607AC7E79C703F0F1D872BFFADB07CBB9E07C62624291E Nonce = 1BED13CCADDA5A02EE6F3F529A7A97A0 In = 9F188A9CC6957F8408FF2A93AECEABEC0D6484AAD13C88060CFA7C52F55130 Out = FA96B9A0FAA199FF22357287FA8DB515ED3D522039C3FA649E5BBFDE5D0D79 Key = 69F48BB5EAA67974713FA974EE645B5DA6B8E5665CE0E40347575D050755EA6A Nonce = CD6E4DDE0DEDEB87B7BCE9998F41218F In = 6F129CDB56D48914EFAE7A534C33D03280CF30D12389EB5119106790B84BD73D Out = 29ED54DFD26F097312C42848BD496B78436F907238EC8DBDB5A22FFD76CE76D2 Key = 3AE57D49BAE4C54AFCA650206B3FCBA71306286F1B9A51624CE3CF08B5791CB3 Nonce = 75D84A34073AA6331A8990572C5FF55B In = 49407E33C46EAFB24B01BDF5300DEA35AA5BB5AEDAAA2B5E47B2B63753A44F71127F Out = DC0A9F56FB2F440305B288C1C0CCB896B21D89FC3F741034DD76B6887740C5CD4A20 Key = F39D1CF76592D48DE487808FBCA14585C15F29FFB7C9EF9A4AF74B1DC29459BF Nonce = 50FE7E7F598B4FC4D0FF6D256135861A In = C34EF208CBE5F148CCF3E005BD2168C8D8346B18464EC8A6C8DD156A3ED34CE35C2A16F2 Out = 878A83F17390490E68D50937BEC73D4A5BD4183ACCEB0D582464DD9D3ADE683E830E8C24 Key = 8B387194C2E79916F5D2B5E3145B4F7CBDF8190EEBD05B598A3F44D1480FE045 Nonce = 6C7EAE05E72898C271A3D7F1668532FA In = 6732BDCFAF3C9681E5684208D5C49354C8C221FBB584080639E3A66C0CEFEE4662BCB787FFD2 Out = 2B40579DD8E87440DCBC664920573309D3342DB52463F76FC7BDDA45861F8775553129F948D6 Key = 60FC4F62E03E3C0ED6DD21259BBF3D4C24031DFF6A20ADA2E2D637CD0FDA2351 Nonce = 6BC92664DBE433FC2580850BCF0E08DA In = 3CC7B907609C374805F3E0625C2A8B77BBFE8C22860F749E4871541D27BE589B21773489E08EBFC5 Out = FCE9006F2073F1C64AE42908C2E7F21EF88422526423ED8E341F869B2EC8E9BA679E9028102C9BFC Key = DCD3F3A96FEF4C6DAD109A65D574842D04029B155BEA7AD54D25D3FF8FBE5A2C Nonce = DB7728ACBA219FE1AA8259448BE3D6DB In = 741C912167AB5A5AEE918FB21480A2EAE39C0038A458A34D4AF86F6968A97A945B4EBCD8D74E5C1D7388 Out = 116F94F7C970083C2F918454F7C5740F3F92FF83BD5A0C5F8DE592FF115171711879C6FA739E14D0AFD7 Key = 0CBD7326ADF581A058CACF74A3404D3CF9EEDFAEC8E47BB30BC1AF1D3660E0E4 Nonce = C4DB5DDFAEE532C12B7313A9258CE63D In = CAD05D525C37CA43C187403F3357EBFB580ABB2F782CFA7B9661B1F71B1809920EF0D89713598CA4749763DD Out = C17D53A4B37EF4AF33DF4E0F317BCF8541ED66DFACDA662289B261ADACCA3D4C0066159ABDCB108BBF5C707E Key = 567AF81216E5B25179143BC1C3AC52D940F93EB4EAAD54AE0A6F33661CBE0EB6 Nonce = EBF6B3BFE42C2AC5AD0B02B7D294DFBF In = 6032DDB7CAAC7CE2CCFFF53592FE2F40280F8C79E312F4DDE307E90863A9CA18E320E0EF27B21216216FFA8EA570 Out = 5497807495FF72FFC8C994E00CB5E7F5C521C86965FB17AD3578EE6240233A7E2C9FCEDBFF7F1B05FC6DACF4A0C5 Key = 818DD281DE7C051FE22A5CD1FF0154293556D693427EF49CB72D31E05B91FDDB Nonce = 4A3F1F5AC035B0D18543BC763D42D61A In = F3DB2D14DDC5CC45CEF2986CE9775A64C435B36D305DB04A75FFD3BC83ADB8595397EE9E1B8137A8227535B3984A7267 Out = 7BCED3DCD661CE1BFF9A6D1B52D957D12E657DD6241F64528C496B6D5A729783FA011AD5788BE7DFF57D892A0ECE7A92 Key = 06ADD322678535E83B950851EC12D6DCA818D19F1041F69919A1E0A16D868ECE Nonce = 8842C25CB6F1E93F2485204B8DF65A61 In = 83EF6209E5EC332E9CB0A2F73EEFA34EDCA0DE7148188A5A5E8AF5812EC9F272147901F38B811FB759DA8060A1F93E972204 Out = C4D6D68DF04F55151A46D291F188C71E3C59C06319D4A6B40B86312E93ADA7EE4CCF495CD56E0610ADA4EE49EB4982601DA0 Key = 2638477FF92C0A140CA99B62CDF46452AD58B01A2DA667BD5EB3D425E9EFB5C6 Nonce = FC9E9308891984AD0B305CF160A64B45 In = 14D9C539288AF393FD3552DCFCFAA4EF497514E7101ECDC92E875BE2D958D296FF1BE307DC5AFD29F71460DD7F093A392C8210AB Out = 792DBAD92AF1F5F5E5AB14060E6245D4175A6D73910FBDBFF76A08493464827A108141E383E3104E3F4B7EC645FEB7740A426AF5 Key = ABB8BC67A8299C34C4B97105230E203F1BF8032C876E908E6024F31F0778C2DE Nonce = 03C8C55A12AFBE4B5930A8D8FF80F1C9 In = C4E76E643B92D878A7BC2693EA1D0E1E86A06FCCFEFBD91506D2B8C6024490FC965F037CEBA97C607F808E48C9D86E40AAEA079FA7B6 Out = 66BBC945447CD9FC87CB47AE7F72FCA83696BE3BE6396ADD9EFAB87A3BE17718CA2E49AE00758AB922A2F2049BE84577DDFA228918C7 Key = 5DBF7CE56C2C431FC9B69EB80635D0B7BF58C7860A1EBC876914BD040978391C Nonce = 9E2DC1FD8EC1C9E1FD0D5273F1379D46 In = C8A5C5A939F5872E56BE199D24422A7B99F797617B5E39E02729AC05ECB1990CF8D287B08A718495D9F261E9110E4EAD62AC789918CF1CEF Out = 23D2A8B6508552F2075D340707541547F37E622DF4DF55EE3E0F4E0E610216B7E4218358ABFD86EF3A6A5739A0EEA49267AAAFD89B28D5A4 Key = 6A3CD1AC06DC7198EB08F439CFED766EF40551B1361048BD17B1A88E9447EA27 Nonce = 23783203B030B2AC2AF81621781FB946 In = 37B26B33453BC31C69BD09D5778E04AA8F5FFD7F367727B30246C81BB92F9ABC3DC9EF72171C3F38B76CE887F647AE42D87319D4209857EBAC0F Out = 8F85405DF5DEA595B58FCE86713593BEAECD39B4F4BD11B43024A5FFBBAFA0F4817AD6F92C111C08506056654E003CFF9A60162147ABD56BB4D4 Key = 1CA7FD4782991006FF0246581729BE4341A6556C61FEED749EE9F48DE8037874 Nonce = 7DD54BCD7665BD84E8DBC84F367AA008 In = 44DE8E16D60C2CCB0E804ABE95CCF7CC597B1A9D0B3FD15BA2CE321273006322B4EBC4B5BB90E1456947B3B289A9F6DF266FEA780FA13A2CF50A0882 Out = 03BEF28AED188F7AA6128016647546160DDDBE80BA403CC4F29D9D90A5761075B170D1E27EC6ED96E7A329ABF59F7016F4BCF39F61FD82C010B4F7A0 Key = 9E8BFDA871A63F32DC05F53D1859291E6B099E2B4474A43E570D6D167A2E99A9 Nonce = 51027A0552EBF97D8372668BDF106F46 In = 8136A889B8105FBAB44325DC6114F395CEEA87EB6E69D35C6020AAE00B47942B262157FA273B2317CE08255AF899CFAC6A83AAB7D4C5FE5729A64AD9F8B7 Out = 2D6B1B438E8F7A70555902ED6FBFE2ACFC371DE250F32C9D5B75321913837E36646DAABCE5B69AA971A0C6FFB5928E0A75A13E004BF241E73754B74F3947 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 80E71459F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = AD68A517A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Key = B0B664A621FDA57B3DF93323B61DA43CD55EFE1B1954A8B86CDEF4963E082B5A Nonce = 63DE5E4E1401030D736BC327D9DB2BB8 In = 0EFC9979CFC65020583D4141A6422CECFC1E816B8682A1BF73D05175E8A2E83DAB239DB15DC57C4ED427EED3C73491285767EBBFA20CCF1CCBA594FC45980A34C659 Out = ADECCA8B5879B64CF35C8AED809570D12BA0C0EB19C319C0B9FB1A0A33C04F48E2B755D2CDEA8C0582019F7847DBCEC023A4AD27CF4879C07CC33CAC9DCE9C47A491 Key = 6C62EF4976E50622F623337E32D70DBCE1E423B4CFF652C2ECB1D3DD194B8722 Nonce = B7F60B3D94FEE7768CD92148FAFEADC2 In = FD8A05EA9F872847A37F33D66906C085D10DD980435028CC0F7FA168CE8363A8A5420E3367DC06AB69C2DDB49C1BC0E32E1F1316EEF18C01A95C23B3342ADA89C131E42D Out = B0A2C09A27F4128353DA11A0797B63AB54E2CE00BA58BB765C8F6F65930E69258F2C3F30914FA964AADEC9B8DAFE39C58757D65CFF6702B955550C8A494B64056B906FE0 Key = 85357F480C3AC5C8E412523D2C6D45862CBC91394DAAE40BC20C58DC7FDC113E Nonce = CB11FF4AC49C513BD56A79104FE48F89 In = A592978733D8647858659889303CAC080E95C2B2B26642520CC6B8598C146DDEFBE1E4C068F3FC0BE9CB0EF3D61000F2E688AB2D9DE7B7A28C3B32AA3F8B872F91D2CCF9C927 Out = 2B3D0D935877281412DF2AD20602D0AEB7E375826BECF964E5EE29A8EA1B20529943BE595C099BD2EA0F70ED95BFF11FDD52069274E8D21B00AC5EA11369BCA9E6052F1ECE13 Key = 53286FB5B6E08E9177CA17919D845A958B7D55361DDE5E9B09B40138BE3F68FA Nonce = D7FDD75B3F672908845354CDA2EC33C2 In = 60C42D6EF79C6FD920FEB2A9EE00EDDF34B3339F99BF13ED42FC65247166B19C42099DA9089F8131856FAC9CF0703AB9C73DADDDF700290479146F67B49770CA9B53511D94F6D7A7 Out = 35409AEBFB98BC6CC70BE661EADF99C7E1133F912D8FBB957A5A61AFC01E622864C1AD2DB0898B0D3682042A510D65584C7EFE9517D0CEA31D3385C857AA334478BE651DC48E81DC Key = CA1AA91974D69777335BD4CDE41584FE09A0F90B4EFC1DAB01F5F6EE475C5B26 Nonce = A753ADB21556F5166B8D0EEA24AF4D20 In = 55204AF292A15EF0907E3A05FEF0BAB2FC199A874FA3B72B1959CCF5CE59B1A63BC7D0C5709A1EE8152A11423FF3D021726C9B914283610530B80114A6AB16F1821434CA0B5B66C51181 Out = 790F49950B195EFFE12FEE3DEE248147793869ADE0B46B412F702C4AFDFDC92A95889D45F1828CAD935CF281BFDEFEE68057906564E63509A464206A3939C9787AF559C2F18E857F9794 Key = 67EEEFDABDB4E221A3F5D331E021861D80B3E52EFD3662FBE4B7F96CEC220668 Nonce = ED8A0E2821ED9E46D9E47973CCF4FD25 In = F1B63FFD3C223E65972E716872206B656F036AB58CDC6BECF814B4372828651A28FEB0BC6F7D5E008A0C9D069C5765D9613F75AE3CA564089840C2E5326AFCBB73E9677D60261C1D11DDA8D6 Out = 05C44E476B45156EFD1A73CAAE0CCB4A02E7A3BF461377AC5573624F3CDBB03E5F040EE00A628EAA819B84461B8F39D63308C5FCE21B823AF0508384E0A5784B99FA47AE0A15F8A631CADD11 Key = BA8A42A5079A1211FF373CADEDDFEBE4230384AE50C0CADB777689E9FCE03021 Nonce = F2CAE7EFFDDCCC54DB0DE734347ABA8D In = 415E13F78C19D639C7E2A262D03D17C33648D7852706B0787C5DBCA2F7BC09FCEB3C570FCF3E121AD6B9E467515998EA53B59532A5D0C86125928ADA505D07E9C0683F0F2862A0A709B76B9F3E5A Out = 96D6DA75EDA6029E162A70667227790B28DD1D08731D08024FA175861A30D321CF95FA07A96077F5F9F3BD0EF809CBA394726CDFCED17507C89295954F7AF19E7CD513D18869E7B3418E193DE7E8 Key = 00B1CFC598BCD9B708AC9CC600AD951E95228C4941FEA43D3E9F9C4C4DDA9F57 Nonce = AAA2D1218D7E5586150602486330D79D In = 5ECB18F27BDBC1469A4EE7273423D51CF53DA0BBCB3773C04F90934DF1A4E686B76A2CA19B325F91CBC13CDE9FBE0E7FB1D205D78EB92DF19A5AD39D9E5CC07A4329EF14115D5A894F4669D6B6C3E920 Out = 47D37261C8ECBB954E6980BE6EE8A89CC31E83CD8703AF97B40308FC71FD5C204C9FFF43B35BC9709CF9089BE6EDA572EC4B580F74A3C25741B147D3F2D06A7C5BE8AA35DF232546F93B603A91A4D4AD Key = D9E06DC86E89570392B95234B2B4DD1D424FB5D96D8E5EE6522EC023247240CE Nonce = 555BBC29444DF1C9B19DCC36E8F526E7 In = ADCBCF6C2797D693DAECD8B395FF2D8951D9D58748398E1886146CF39B6BBE94AE5725B08DAE80061365508ADEA2F7E27006BC2EB8296E441D9ECF3A1F105AEB72A7B7ED65C0ADAB96DDB4C56D3E6CE7EF9B Out = 204B284617F9E475636543C231788FFF1566DAA35B7188BA5502116479D8CFA3571726F23F83EE62960DE1C5512364AD31BEBD71778926B4DBA86C69C87BF62D590FF01D43A7FCCD9DF526738DA3ECC07313 Key = 8FA2C547E80F8370524EC80BE768591403BC8B84A31E823E1EA7B58D13C2C1A2 Nonce = FC552663E080DE3AF70F1843B20C2321 In = D1E3667AE3F908CA70E42ADB571765C2977A7597AF1E93568BF144FE6B8774AEC889EBE1C55EB673F2E05C9049FD38FA112413C1F5DAD6400104493225B2A1FA2EF314267671682A96A15FED5A0920BEB7915759 Out = 0D8B1A4D0B4BBA07DC3D66FEA6C79EB79845A303A99D0CA6A1363494FED39D9B2028323EA66F48420620AE16522CA5C036984E431645D55BB71C9729786A2942D246763AE14D4D7BE8182F4412706F88D745D29A Key = EA2BA62A693024D30A6F86F92534B011D6D8ADC81E6DF43A15F1A38B077B47C7 Nonce = B09F47C60D4A913E80DBEB9572CDDA2F In = 9E66CD55C5F5ABE2D9F479572D1867AE07654DDFC4B09603A7268BDB98CF22A15EB207C05946957927BF3442FB92CDF2BC64CB1AAB4267884C65AB29F7C7F1AAA0C797DA1BDC2FD47E02566998933F0371F054AF75F7 Out = 4998F91D12BD0CD7C9C3E4D7E4AFF383D87555C75523452F7764B8CB017DE1C9775DEA51AC4A84CBC77FEA7CF4D4ADB3F79279E73EB443513AC9FBFEF3F210F80C553C758149CEAB515578E988A8F49D4B87CFC7C3CB Key = E659BCA785C4BB8BB49DD36F132EC4984397B2665B97689FFFE7509F1A1D7551 Nonce = 069C61C342C4DBEC240C709C3CDB361A In = 0B515541E94644E05C6D33B0DEC22322A23EC8666C40697D58B0D7E28FE278DC8C6747E60924A09442A04C167D48CAB29D095BDCC0EACEED2C841FBFF1010769D8829EC1CABB235DCEE28CC09C4D905CA1CC8BE624298D76 Out = 0FAD0D901C43395C015B252EBF61F66FF41713C2DF9AD2245E1EC1ACBADD2007412DE768E5C986AF3F26FC489676AE5F7507AF559A8A23B56C417FA1452D92CC6671F6E4BA5C1F60819811F9704953BF349CA5C4D3A0631A Key = FA7AEFC8F4B784C193C785B93E90D08F8523FF065E19B2F8CE817FB401A21FCA Nonce = A66594B33C8A53C811C2D97CA6D14303 In = D2C5A20331AFA2FC82F0A0D64160B4EC447FA5572A26EC3C64C9F736E43B0915AA7C3E1AB6A9D36BE4A15CB26820E29AACFE83024959676FF05376C1AE788D276079F199936AED0F0F688E42E337329BEF9336FFA36FA4005399 Out = 7DB91F84F3477868CDC873EE908DDCAB90CBCAF18C0A70791A120AEC86CDB215E6221A7014482F9E3802EA3467001D3601A63C92C6AEDFB4946845F13A52351CDCC6D5F922D19DD5B1EC236E822F62655427E62A4D0E84914622 Key = A26E2B0A05D0283D38D7169BC2BA47226EDD259B8D57B381FFEE069F1B98046E Nonce = C4E7CE77538E9914BEEFD56DCFB571B9 In = 7255CF6B4E647EBC0AC95A5695F0AF0E9AAF91E3D95749D6A49719093B1200B9C6BE09B26554E36EB6652041744605EB051062C0B6D1CC01257709F751EB7B9667AE7E329E43EFD744D96300958FADCA3C106AF1733CBCA1AAAF823E Out = E3D3CF5237D3A038F5F6C89EA9FCA960FFF212211D3C2CB3490607C9957B553335B18C551BA25506EB2CC3BFE9F3EA6CF0AA9EC434AA592FF77B61BC06F0B2B95AFA8FF5FA494E94DB731F57DE8529ED53A50C42F986C16EF7C7A940 Key = 6EDD7092DA78BAC7E1AC92E3770134A03D2739FF5D34430F7F4D4D6E9764B319 Nonce = 8AEEDB0DE46407E08707969C750E38DC In = AAD33FEFE3F84DF826588A512B14CFCC1D853F2AB84203C1D4D8F8B86D6AF3F7173F6A6AA73843D5658489507104DA3D7BFCF5168D986464C3448F234CA69BE3DCBB6672575564B02ED92FA0F3877DDCC06D502A33D6957A0E33F2DAFFC9 Out = CD0C9764841179AC19328315A39CD34BAC626AB5DB485D0F9B46059F54E08C5492B908DE07B85E7A44EF9462BA8E0A81FD1220C558295A948DA4DAE908535719C1F88B1560673BD807F5262483B40AB9BB0C64926FDCD1061E504B4EBD76 Key = BBF6DF7DBF4037FB25B611E6A2930DABF072F65AF0A6457CB9DC93972E9ABE7F Nonce = 501092F826689BCDFE80F092C26B5EF4 In = 8168FC2661FBA3600E59774138459C2961176EFC931CBD6B5C33560078EF7518635D6939A98B0767639E0E93074057CCA6883F7964A1668FF9F8210E95D0368F6FAEE9FA8D7D77792AC00EA2BE1146BF56204FE906FB865AD039577C01234AE2 Out = 51A47CF78D2484F3451F0C2A43EB428379D1F6893C1B8A39FE3E60F685DC87C0B840E9B96FF58B5D5FF56AF2D9E6DD1B2701C68A0E845D4D5976BD315A353D67347BC8730CA8EFF3AA0DF4BD6DC8E05F7EA07EAF2C39D7D47D9D84B474E7ACE7 Key = 432FFA626DF2A52CB0571B6E90C61ACED99991FCE9C16BE3B63F32BE944E2E56 Nonce = 5C8A73A4AFFAD697BA8B1BCD810D8F11 In = 81EFF330211A83455CB238BAB684E0067FE4067B8C991BC1AC8E7633D080339190E5D94DB793154FC74FB0AFDAED0804E3C1CB51D2C1E13041FB81B2157BC60C1FF633D16CB4B9BD331420AA12B95CC7AF57C713C24B727846B0C7227961F2C2D36C Out = 6886E3F70FD5F90852F3CE559925D769036D93CE8D9476835D517E0FB32E9C96D038839130C1C25E1B169ABE4BABA9B82C4ED74DD45F597867C5D53A0506AD37542F25CF58F4A362BA222FA1DE9038A8FE543BBB44D85B2E0E4738067BDAE5DF7060 Key = A249D7A363F984C302E92C5F94F8896DF3F776225C022878944FE2C2CC5B4C19 Nonce = 5EE7A0639A58783D7E82D1FE5AE0DE2D In = EE2EEF94470FA795A889D2669CB2B80D3155C8B61BA73019CCEEF203FA4EB1D9AF6C1AD3B2954F7315935535333C758A4EB3247E19B07308569400B897322A4752612F0FF13FF3A5361DFE0DAA88394F3642B1C6270718F28BE8C76C89ED29B6A6B0BF94 Out = BA17AF1457C42E6E6FDF4F98C8E45C0FF78D4849039ADCE1A168A6ACEEB9F419F49125BDF26E443EB783108219A2841F82499FCF6870724044D9CBD95AE1F4E2A3D4A4C44C54B2D990E0DEFA120414ADC438E66B298B72EBBFDD7BF38EBDC44143E16B69 Key = AFCEECF27458C2A9B8F34603C639A5FF1250F1D6DEC2849F0D74BFDFAAE36660 Nonce = 5C453B6546216E318A6036E803322401 In = 577B77E72EFE7CADFD281160BEB544AF2F28B41CFE4B92C5D770B322D40DE7590090833A12EF4FDFB0EE57CE0A4A36AA71C0C39B33E78EC4CE15CA6400936E1561FC6206916DE9B03BEB08F90930048F493C05BED453ACC98FE7AB2256B5271A1E8958D07AD3 Out = A34F475248B72AD9BA2F461A690921544CAD263EC739AB3ADB4E42652A547553B3A303BE29F23BD9BE7977D6750E50A2106ECF52C0A6724AED2EE8D482D09D0D2B9AFADB78B357EF0F52E027243D445B5066572B0CF8812F3E19475650FE85DE610EEC640091 Key = EAA4738DE7B609D36A756B5DCEA1CF8F4359248FD8A423BAA925F0B6BCA7DBF7 Nonce = 7DDE259B3EC5CD93A2734626A9B99FF9 In = 4A0F51F3716D41FC3E5264557D19CA35FE3B70E215AE6DA3990D1EFE383B9DE7E50DD0855F751F95BC093EA76843089F284CA6176D2F25999230F6A5B9670059736CE084CC1672749504BEC04B22F26045366030599337D1DCE783ACD0BDECB76DD4E9E8D4BE9421 Out = D747558707BE24371EB6DDA6B5FF138987CDC42BFD71D75BF1D6DA35591E4B35C32F9F07A1C0B82A55AD28E4DFFE43764A814CA13D60EEFBDE3345BA454D49179662ED53A9F3FFE092D8DABE481E3DB0D7E34D6296102BC45D61E1719C864FD26FCACFDBA986A6F1 Key = EA42B4BBDAB135C2B0BC54A539D5C9A3D9B6EDF21C92763CC8F468BCA9CE5D2C Nonce = 013847F7E5082E4F5FD6DC16D754A80D In = D8D191D620CA6DC8AE66658AC39D87B8465D32BB2637128191F0F92E47C7E99E01FD4B8A8BAF767C8D66EC280C77E877EA06435A7EB72EB477CC2BB6DE52160E7B66F305DF97AC35C821F418E1FC56FF8617B9B595CE824207099A8D9CFE24B616F14EBCFAC508C37127 Out = 6A320C22C68E984F0308A5D626C16343D268693F283FD71885860FBEF767B02E16834BFEFAA78B6A806D2E0D1B54451532B4F77365989259B8B48AC65C0B730951DE373B4D51276B0D364BED18782613DB2057C4EE9AACB56CEB2D0857BAD4CEB9A190AF7B9E04B8267B Key = AB8512537C3519628BDABF83E005E8685A180AAC1988E48E39A95030BD4FA6AF Nonce = 693E3B87BEBD7D144FDFC1796922F843 In = A7033720AE2A602FDA4BA5127C4EE042858D0376774704D582986A848B2A0DBA6DF135CF3F1E5D65F68E8940858A35E9C61E7AE2469CD7B08BE72069354A2A13955FA21FF3B4DBC2712647AA20D73428D426F9B279B5A0C82E2A2620F836B28B03BDDEF45FF3366DD9AAE66E Out = 7FA21E16C5213010DB8F3DDBBDFE1E5AA16696875F632EDE3CB31B4325C4E2135B9D2C3042CEB5415306D0FD7AE237F26E3F135732BDE6C753D0D844AB8270A094D5B24F6C753EE86455B2E936F2F5EC5AA4058099F6929C95AA2AA6CF70CB2C519D6854579CA23192AD83BC Key = 69BE0E539EE3C48F260249A10B2DCD3A63BBFBB5AFC85D9AF388B79240674A6B Nonce = 9A1C7753E6140825999B5695A2CAA7BF In = E84897FACE6ABD7B897B935DB435C22299FB4346BEE1C4381948622ECF3328172D0C3A48A30EA2411201A5907778C994EBE29637A290EE6DD503B6EF1D53D368811D5DD731E7E44E27EBB7382E6AD4C74F49FFB62CCF996FDC7710B943334284A38957EC822B4F448B7482CCB972 Out = C5B740D2E9AE85FC5CFB4ECD1E375C05AD9E5040A8FBB149320C263150A83F2DDC3FBCDBDAEE0BEB6C1CE6EBD3713DCA848F87200922C1879238E49DDCA5F931F1EA2CBC586402AEB83F1BF2175341D4937CAA2B97F4BB51BDDA63C1F50686F2C40AACA7F1F049F08D43C6F87E06 Key = B66821FAD6EA6320F3B5025EF909411DC68120198DB4B2A7BC148EA922F64DCC Nonce = 3A875E75096B58800EE21B31E39BF38B In = 54D9C7F322D68ABB78ADA56EC4B23C1478DA181F30C32732C9ED38BBDCED81F063255395C52E8EF6BCA23CD23A70BDE242DB86265C11777A13CBC9752F2ED55CF9D816C2F83AF85B25001D486F5812E39F4F661044091E10C3429894E92EA4F87CC998E22ACBBF867D3B5B20C97857C9 Out = 1C4D79F2EABBF97E147FB8369933B4C7E7BA77C6A539F571AC2AA8E37C5D8BBAA1308DFBBEB2F892BAE9064692A20B8A2CE2A1DD8879160C7E46E2E5039D5C32E50BDC961F3A7DBDA36AD5043A87C9F0583EEAF9995994E764E19B62CA4410A87F33DEE40747EC23CE6E41F280858149 Key = 33B871FD2A012F18E3914F1702AF7485BB793B7DA154804EAA715136B568BD6E Nonce = 596028337CAFA821457B88131F5E644A In = 0EDFD9C739C9F72766EF8962032C1003669F5A648B0D21943E99DC5BF7A25079852233242187574B279FCFB57182F8F9832AA9E44D15ED2D8386AE4572986FBBE0E6E0D5D3AA4DEEE2188614F7A8A381B335FCF9B899B86685320D457D85C9F761EAF43F49B9C9061AA606ECA4750FE198D2 Out = 87CB631FA8E039C050740F72698E74A93D758BF0D090B1993D6F7042E4E3A6360D0BDFE45EA8423B1C0FB9ECB9514769890BF994BE04E7A17874866FE1A15CB9C785B0A103F39384A54AC746673A7A98D9F9E20D409F7E172592CE58EAAD74ECB2BB56C95C6CFAA6309887D8956087009252 Key = 51D9223DE781C2931F7E2C08CBFE7FCE5CC2AEAE58D22819A60BD9D4A688C5DF Nonce = 0A55917388EC7A7648973240F8C2EEA4 In = 00FB363E56B460D690672DDFC0B71DF6E19F5A5E74E6E85E936937A054E8F7D87511FBEE4A982792196FE8456A849AA1C2E8310E66D6C4BFFE084E791A5EDBFFCE270A4A50E5E2382A18C3B9DDB1B71EF1E51B3568B75F423263E025D4E36012BD4350C226DC9805681D6F7452591921AF631F6B Out = 33B7C9F0C16B82C6D6B08A42E1467592FC9F4D51DF70BFE52139614AAB3FDA3FDC97FA0A235A2AF801134B58CD643E325A020AE796E333C9B3C3DF1208AA7CA5185B3FB1A7FC3B79E717FE1A8B4AF71C96C2A58576CF14906E0CD7A8C4FADCDCF28145D26131DBD656ABF6BA7D522FF9FF23AF29 Key = FA54E69192980C674DC51DF702B94A43311661E98AAC776DD7F09FEEFF530B6F Nonce = DEE6D2C5DB36158D964F28370B147CB5 In = 85F25B5F5D3E68479A0F84CB9F1D92DFFE17975C864C8A974AE1E2DE60292D281712952CAF99C570CED2854B6C98BDF025DED8D8A873AEC8276AA9A1A6711C49FA842C4B446EA5963994F33C74F7C9074B4576750770BD5E5BD9CFA01EC26440A122A6BA0E9A5E4B490581FABEDC940EAC9D6BE86524 Out = E4BDC3821AB65D06994979873EAEB03796A2A8F5B4507411F6E96EE5A246118EBCE8BD669514E234A991D708FF1704CB811ADDE53BAE3A147EDF0CAD867ED1547F4C4CF7199B35B8C548D037E494E9DB52ADCDA17129563FB928D13F8EB153A4BA85F330F263FED7B14E66B0C37CDA03133158D1A0FA Key = D22A6E996F80C4AD83209F4E47A17D78EC0F1343CDA8890404FCA4103D038056 Nonce = 3E4EDE2C0488BB09BC4ADFB3D1122E99 In = 54E53C0739F2BA49B5A2080E324089051EBC24783771981AA4EBD0E63ACC86BDADCC32AE88099729B4A72D8969D2EB1540F8A7FB3B79C5A0A7F769054EF2EFDDCE4BCA0294AD2B02ECA48840A2A0AB20437D9085E905AA2074FC8C3561C564F1E992FBFB15877B7CB54DCDD27BECDDF9AB3A58699D4B901F Out = 6D4B53FC1B7FC8B97BA8E1D1526944490B415D3D59887437A24F8384CE850F8005512A8A4BF1E79D03AC1245600DCC83EA21195835582B041B5AB2588DA8BD956D2FB6946548545285C2DF36D26CD09B082F1CDB278F86FFB6FEF9DCC3C71E9CE6B629D7B2897B69CFFC2E14510B4DEE8B9D957FC5AFA769 Key = 7B7E24D8792EAECBD7CDD6A43A1D0DB9681C8964D1A55332103C3ED167B2CAD7 Nonce = 8EB77D48DE2CB3E862CBCD9D53234A46 In = 2A365C1E10368C49339B3F64A7F25D6682E34A3BB273DEE16D6679B7DEA80FEFCE351964587CB68A939B36D705A32F1760995CB3B9276BCB06AFF5F68CCAD25ABB7CC702D6DFEF85722303C4D27BD81B2D42D2C6A47A9BC4706CEE256B5CF3110705753929B95248761234DBE773C05E79EC9FF958DFB728F8B5 Out = 75BD73BB09EE09FF5B8E138D84D776BB8D9B26274D42B012B1D252C22A0E29C66B2C69880EEDEB0F02376EFDE6F02C85ACDC24BF7AAB725D1CE86688ACB31C5C91DFFB290968B415F7342AC9D60A49F7CFFD35D350D4B63DE597127C5614D609CA27EDD1CCD869D3C4554C3081450A67A2495BAE987239937DED Key = 93C474796CFDA89D8FAC562ABFD5426E1611582D0FE40511A503119A48A07202 Nonce = 81DB28BB02B082FE9F40675F752B9F7C In = BB6817631F1F0A703F4D5896FF5C3CD94187A82F8287347B80924856B84CAAA3A05B892CC8D8CAFA85F65DD1922F017728CE2E0ED7D4FC9CE844AC9FEFC79FE1EE7181939F4B7A91213880D6B725FCB8348A4879641A628B7BEAB77673E4CAE70CDF36CC92D3784EF7D529E9404C1E54A9086D0C33A50661295ABB24 Out = A2875C6E81960A33F8EC626B9E649747E956690DC4DE11801AE67EFD2B563695CC8C999C1784FBEF30B753AF38C413E361D523C42521A4DA656BA0A1076E8773A335C854037DA8F6E84EB48AAFBEDEF12D4451E9FF1636DBE938960753D3E0FE96165474298512792B8C457F83A8664A4D679D06C22FAE43465F9549 Key = 11C63D070095FCD408DC7E7596C177C0A09961B2BDCB6E7C0F300C918E7E830B Nonce = 41EF5DF5CF14D6D2C14CC4CBC4EADAB7 In = AE29C830ED344F0072FCBDFEC9B9C634703819B24397D59C3D5418B47DD3861B5CCD211966B4DCB3FFC5E97F6B171F5C51D75B18AC13A78E2CDDEC9D4B23ED26CBCEAAE29FF78F01C5B4201FCEBF7BC029C7730F7603EB456D2AFBD27581BD15941F85E816AA6EFB0D7408D85F83AF88AF157D3C90BC849031CB9B410819 Out = 835993AD13882518F2A1662CA9B4160BEDC60E53083E1F8D72CA3AE2F890856E4B52832DA83B341D9D992C0D9E489BB04C75149624C6D645BB9909E12711FC087C56E1210BEBA66BDBCFC865520E4DEFAD4000CE0EC528916A415C4661E1ED7095E5777BF375DC31CED5F9664C79CB3FB80C5EECC2067B4313CA27AF4F8E Key = BF4DBB8609E7AB12773DEB38FA1FB31DEF23A89137E4B292EB569028B6A5F836 Nonce = FE53D28C28A8CD12C0D66B79CE6EE6C1 In = BFDA49CDF67A114D29A7949CEE9BBDE5D26FF8E35407A266E12F98FE1247D74A1005366F526F7460FF5B5C45D6791069BDF075C8BD396BA71AED8B7F812F0A31403046F30418A11DB134127434B14CAF1E696DE716B41AFAC8FAC96687ABB8A81E1EB37C0C518806673A7395AFED27408AF1B83B3EDB1D1AAF54B3C754E8361F Out = D645EE5B89B1FDDE1056BFE827B8F7C2DBEB72E89E8ABA4AD0915193916EA8E6AD54028869D0B1E71E396881006482C013B25915563C492B55F6CFF5DEA950590228899EDCA68C819B9AC2A485CF40023CBD4465170232F429D06DBB42E4E2C9B5E201EC41E4DF5C9674A1D32DD33A341E2E0D13351CAA4267BD869BB5AF2804 Key = B6E12C2EE1A50C4860591BC5AD7677BE5C77120BE31814A03B1B308198853950 Nonce = 2E78B846599FB10E51D8AB906D7AC754 In = 967DC68154B9B3957216DA8538588B899005DA3D2CB9500B1AB2FC4EE815232C01970F19BF4068081EC07B041A6AC7A2FD97ABBB447C7AF73C0286EDCD99DBB6FDA189BA76212EC37B23A72FA8213D5C54AE716845E00262266400DC041D89AA69F1DE8B600F66B16485FFDB5BFF89EA33625DADFB00DC35827C4CE73EB098B3A6639B26 Out = DAAC288ADD605085CBBC9867F0FBDD007472B15F34F8A7A91F16208CE15F0BD2DEF3FEF432DF84F66B1463777D3B2F0E3D2A41982BD845217383412BDDF2EB628EC8DF59240A32F9FE442E334CA6670C6F3AFE7835C5D12E064F272C610F1084CE39380E029D050E5DC5676ED7DD090FEF19A547EF90258670B3A49349728733E69CEC34 Key = 91E98D4A6EE9D7FD83D643C3BA829746FF2EFF77FCBFA41D44CE95C4CD76CAF6 Nonce = 7B659AC1248FECCA3EE765ABB8D93D1F In = 6A3C46C05E280864DA7660DD5600F4050AF7EDE52B786F246C2BCAD03C8A88B6BBEDAC3D5FE79AD40697BD88EEE4CEB3F0C8DF2F0F5381321D8C6E89049728B0A0DA9A71AF00DF1B9BA71565C73F042CE22FFAD7B9DE33084BEE400C11E6A6F8398AC35E816E63B42AC23098E7C5CA9B4D78395019B6123EA198EFB6A2E92793BBE243B46B1DC872 Out = 2178CB3861AC4ECCA38D4C31EF1EAB6575AE0012BB4AEE9615069F62013B920F13797DB8E432A8DC486F62A9F219FEFA356B8AEE7B1BFCAECE0DFA4F94E22A2219F6468C2D15A69D11CF93B67AFBBB98F185807D32B794C6FA8F22794EE880084F6BCCD8CB5A7D0C59D0B737781A60B29F17290D39422BE10A6AE430AD37C717D5C461EABDF8862C Key = DBD7D9C318FECB268FF109238110F96FCBF2400BE054071478C7A2AFF75B384E Nonce = BCDEBB1E6BC37F18D49C0A4A1C7665A5 In = B0B0645AFA0E15A28D3EB6ABCAF31C6996CEE3C93B76F957424FA82B174BB3E9945F3969094C0E6E5544D64606B54575CB6CD6E40964B84E94DE2193E7B9A00D4C5D140976DEDEE040585741F7ABB55CF8EE815F7848C4CD48D30C16783E76ECC14D384F480CE896532CF6F367E23633642794E6A913B871BDD702934E8968EBE1B2859CC62C01BE12091CFB Out = 406EB5C237784660784E9A1F477E4B8655B07FC54D1C69515C1B046005C05B82D806588639EB44323FCAA1F797D210FC51C91E3A51AE8236C0C2D6C521F2FAB29E89361BDA2275C543B54110AF60C7829D6C5CBC42BAEE86FDB0FF22C08EE59E81E63F0A98A6781926770B5AC7792CCEA9847055813F065225B49F387E474A333D8B50926E3D7864035D75C6 Key = B58E1583AFD26D09ECC1B81270BDA381ADCE90DA1A6096D27A61C8DAEDDD9F4E Nonce = 7BBB7496BA015237C080354FD061CBDA In = C47325105EFC7B78FF868A0E1CABEBB41B6A184780A52AA1D1E78A284C073089762B80299A628B3B22124250CC683CDB54DCE31E4072708C232129D437B89C0CB8BEC7A8F658291F50AE9C66A0D62E26528032FBECD9B3112CCD022B7648BF995ABC46C57E821B3F3CE0EDA97358F31024F532C5D560D016CFD316A04FDD29588E6D50E681068EFDFB8361F93AA979F5 Out = D1043171968DF2B850257D7D14FBB7DE4E34FE62217E9972BDE0283E6EB2054874C6CB8FB66A18A6F6885522D719EA965A0BE5F079370EB76587B8BBF5672FFD6B4390956C5B81E40AB21A15C8EF17D1189B6EF8E931A07B192ADDB3CEF0C66B28CF545774762CEC9968EC1C06FCBA860BAEC78EE635495137D4E7B659100C59BD4496A850BC0FCF464531181F47EDAA Key = 3A945A5C8FD52A46037A426C32946D59AA9B081C4993C634D9EAC2B7E144C040 Nonce = 4C6D4D342E2582177F3641F777D337FC In = 73DBE3EF41EA394F52138D24103977D8010166084F8FECFEA4C5327765735D5002FC7808955D2DA9E786AC33F41A41E47D06E18B84344B4A5ADA2F925E536799ABE3367E0CB181EA720EF44D286DF2223A34030E66FE161404724DB33DDB026FD5C88072D47AAE1BA89738DBBE681D79E330856E4DDFCBD2E998E5065BBE6B3AB93DFFCC0EE04BBBB13E47080C511F7461ECB802 Out = BCAA1E8F81FF49528EA23C4A62C40953CD98F16F91AE3EB6878C7DB5C3A6CAC4F8551A34A5A624CC587A5A22E81CF9405E38913B77344DA59A53FA0BACFA1A4BBF64D234D1963AE5E89159A24EB1237B93F25D652ECBB9EFD26E2881368287357D6783A8F3C1ACAB50FE60BE7ABF7225F8AA0A06F54A63577634B9E930618A1CC8892D290ACD04F7933CF654A8A60AB900D8E0A1 Key = 94EB2F6DAFC83A9FEEDF7081D40104F661916D4D68611AE3620A7E52D7C8F79A Nonce = FCB50453BF443A452F735A2A7BFBC5D8 In = 451FC9DCFBC3C8F106FC9C17A81D1C562E45341B4F05B5319C912CEBBE01743AE34D06930A5AAB36166780F9E75C154FBB1110375B271C297FC46D4B97BC70C1E8B378CB1E29F61B5B0BCFBC8238E6D460054FEFB4A649430AAFDB7F01CF78A5406A3087E9C39FC2D60C4CAB6CEE3DF6A3A8D2F0CD4134209C323D9CACF15308524519C40A81AFEC9736FF858D78927AF66EFC5FCE806ECE Out = C111527D486F8581AAB32257A7577B062AE1D781CF5B44333D12C3208BAF3C8E1276ACAB0F4C325BC0D3FBF3913B13D2F06E8E64E2CF8017634AC9162EF32324A3465156613AFC57779B9340CCCCBDEFC6476D2A4673DF123E435C6A98FBB8E59221C7667CB831EF2E7B5D4926C9A022204F0B3564C66A9C8A7F494EBB337D148A8681982F70524C467D868BAABC86FD50D5A2BC4C858342 Key = E667049150AA0CC53BAB66F3EDFD5C32FBCBA264A6EB12D4563EB5E1E73F2D86 Nonce = EB8D65B2A91A7003E9CB84241B1DC009 In = 5C1DB0ADA94F46127F18B21406B6FA32EFD090B0FDEB549474CFC19EBF68D4BFCB3137F547C48174E79DC87CBF308E0E9306E68B5FA1F9F67E005A2E033DF9034BE4F1E8C53C5D4773846E8EA3782C70E8B1026965C40CDC7D5884F763BE3E2B64AA7458F48B6BC76818B52AFB743300BED3971A416C587BDDC713A8C5782E91AD001E8D3DDD0EBDB978427173AFA9ACA2180F7DEE47FA5A76F7989A Out = C8E1CCDE12CBE92D8E61F23DAEBC35123564A94BAF6F2511B4BAF697D04EAE69C9B1C8D78E6383F9EB053C6B09F9A2A91EC0EC1CEE7801B3B01AF1E9BA4A481A4C7B73B0DC086285C43CE33919DA440C1EF892D9A254FEB9179BAA1183EF319702EDB67FA2EE08F43A719D5AEE5D3D7E10F0599278C70F25104885DA2F3CE797D3064FE6400366950661B6F703C8FB9E1F773D893DCAC13DA94162CB Key = F26DE261DCFE004B4F0B322D1CB4752F2D38279600B0A9421E1577C863A7978C Nonce = 2A4169C8E13B81AD96DC1CEC8723152A In = 734BDE1B88BF91B571B7EF20524347DEA07BDFAEA8D194E00367A905DAB483F76F923087B1E307EC990148E1C3B2E9DCDEF1694D9CEAE1A86A2D092D84B1247B5DD627B68E6CBEA17A539A5C650E8A6713ADDC2517B8FEEC7656264C795B1B0034B30B302DFBBEAAA12AA6C42BB3857A3C641A7A760C275F9C01521432A697984E12C2C7727A538834E90750D4FDF44DF7083842090196A95D2E8143AAFF1D5E Out = 8289B871A4AE2E14F7398E510C5B522883893F59C8ABE42567FB879334A761E5332100EFA7C6F6D4CEB8B6778D0C4B543BEA8B3EA58D198DC3FF02A8FB5CF063CB40E607087B5F08DF86C906F14336ACB78832F20303533F8A7AE39A95C0AEBFA2985F97DB96E84EBB996F76491D186ADC6D0C681F33F0FD3B42632E87E10DCEA36F222E4E7E8B4F2A5CF58D341BDA679516C829370C251824000BF463A75322 Key = 32EA9D65FF14E80EB4AF36A9C6E8F663CB37CB6BFD131F14B49AB528614A613F Nonce = 3F1BFB148CB229C2E07719F6F99AAE22 In = CCF6EDC92B1D17CC548C9973270FA54865DBEE4DD450683C7D542293BB2C59D2163027C229055943F7872D8CC2C9889B12E9B409D9EC55C346FE69998F013256A250FD23EC8C23E36B5412101FB35E7A0C78124BF23AD040327C608849E720EF644A552E35A2E98CB8ECC28FFA8521BC4CD947E4BD24E4A70AE1A29572C746CDB98DE74477FF79101C9E75F45B55D6BC2BD0FBC9CE24B569DBDC2DAB7FA88A07CF9BE2A0 Out = 80FCDC8D13CDA4FD4653BE225654BD597279CE58C66A3CF67B95A8348DC976944477ADC20E9CD0E24C7913C928B2E0C531D43DD7F708FD4247D87954A7AFABE300085D169D280FCFE16E580A0FF5AB435A7B64FAFE9928A11BDA14FD827D3B6DA14373879B4FF12F151BBEA417DB039CB8226AC91C8567B38DAE42015456FCBECE1C1CA8F0D2CAC3ED75F3D6F01D8F322F2822D2D4B0929D2831D9C0A801D49F77EEDA99 Key = 4A1EA133F919B366E3084F80E89E091C87F5F703FC9185F5C8E34E14973DCB2C Nonce = CC96182632AD38AF5273863621B25E55 In = 428D69DB8D1BADDB36EA5950FB2F99124A78BCBB0A7A9B1398F84A7E121637B48D12BBF85F045718C3F0409633E263F62F4992F4C6D497AD7093BC8BB1BE5663B40789DA824AC2EC929C5FBB5107969688A9DB02BACFDB400ED395091A98DA4F806CBD7A9229AB96FB12BF502243D810B6A9B905C48B7612F94AA37E671F543FAD6BCD9C6B181506F447E90F88F050B2C7B7199B88AE55AB922FB1BF4A5EAD00F71E83EEA2FC4F25 Out = 5050237A09192DB1FABDE4EC7E865E3969AECB8900CAFD72B223A8E08A34AF993B1F301832DB0620BFC6757BEE80D215DA0D6B23666371158876E0422D540B2DF889C9F8EA92D181A79AA8BDE50ED123C0301527C0987C4EC1FC105E6B8C0EC12750AC13FEE9CFF30E5A6DFE47A6E63992A803F94D6E79F5693292C4D12D963BAAF42727FB9F6B144F6AFBD819C54D37B3558EDEB4A049C7947E83E68C6ACE0203C882D9A038727D Key = C383B62616C48E3FCC6BB32DE3AFE5DC184E83ECB739AAEB94D82E942F0CFFCE Nonce = 52C109E1FAD94E490BD93584126E30A5 In = C6092B37D8B6C14650D8AB31815C321B7923E9CAB069598003744F33EBEF1A693CC3E03EB801BEE76182BBCE6CCAAFAA061250F5FC6BE6E07A3C39ED3F4344982E2DEC0A5075E5D2A3218AD1C27F12C55D9BBC1B43BFBB79BAB35F74E1899517A839A54AD5274B8718F2AC2E8F89A6CE94972A0AE020BE5256F8B5365B8AEBFEB63B886BAC9D263107A13B95E29A521D3FBC7CCCD620E134D2D45082328AF1BAC6EB8B917B3F70A47B9D5CE5 Out = 3F8FCC0A28C43035C055519FDBB13E8E5A4B35DDC04B62BD2AC7064BF7E4F7CA6C5194B40344F4C0D0C40AC3696C47A6CC2F800139EED2677E580BFF68399D8AA68DF7A28B95FA79A1CD776739C1E2FB9C302EFB924013ED0FB2B06EB6B031FEC8AF7BB47E212859E1D13EA096E029EC051784317F63F5DFC2EB9C7E8E249BD88684537CC36785C54D8DA6F512450831559BE2E67B024171A52F0481102C211DE9138120669D1C2A1F8BFB10 Key = 357D3ED5C533FBDB195DD88811F3D6D50EC133A5E0A36DD256BC0E561ED28CF4 Nonce = 38670C0DFF42CB73FDC3295694CFA934 In = 0D85590B10C077184BA269C135DD1558CAD1A3D792BEDFEF45BCCE14E9099CC4B64D986497223B4D3CC9193E37E31FDE74E31023C9D265ED49E8D7B1032F1FA13F50E486F68FBFA3B449F671878BCACA4009CF4607556E85878A2769472D481D30CE43787E1065BAC0506045A26456644E7D5149C54C5C8387F5E23DBCC762E4369D4E7E24C4EB7AA5F3FAC3D76EEA37DB6DE27601FBD37EB44D4C3F30E5688B549A029C22EE2282E408F9EBB259A86F Out = B317F91E9BABF4361F26F96D001E3D63F3A82F2C8DADC4E4080611711CB4A7D77FC58D719B6ED93D118C7ED676A5B65CD259B9E1AA77AC2813B62FB869C42DBB0A710D1C986C0F978517DB2EA942D0F76C06AAD414ADE04BBC908DC428A18729B4D55CA600874EAF530B38FD4318F1B2D97513BD3FF17949BAF9FFF3BB84C3F0065A521B4595E9801B5233DB2023D17F5204D87AE7ABE1ED73F091A63CEB338FE9BDB2B82463E6B6B05883FFBC0AABCE Key = C2B6E94866DE53E7B7BF5827D5C0179A530094FE6AC5F44C9B3330D6C855E918 Nonce = A4EEEA6808FD5626B56AEB9206F86EF0 In = F8891DD530B83DD5EE3EF9050C7AA6A9C8A6EAAA4C8669FE126EC1C78A6F6583E57BEA8884A368302C2D9C00D6F2D8DBBB98DC35152E43B1A9D744BF0FE1455A36B6164F09F55D4B12290418E14A88F3F80A5EF558FF4EE01CA1ACE680FA028E81C12BF8A18A18792AE98513636AB075C12320038C5BD733DCC8305551514D45E098E8E07EF0A293A489DA24BAB16973D270E5D92AF34E6ADF9EBF945648192640BEE963281303D6DE6097E48D0AC4868E87A58D Out = A54CF0CC7FF8A5B041A15C78F26EE7542BAC19254BD4D421E9A1843C66E9D8B136A80E2831E6C52278CA54C79750CE64F6DAC5078BE3CAB44AE9F4D9019CBB310900282A6BD483137870CF8B0CDD002C61BBE679C2A87C7B1B1F1632DC57CC277FA4767D77BC2F027387915369012D0124BA8B2B85D8454499843C5F2FD9DBD584F9E2588BFDBA062C9F0761609BCE8E0CF2B487F0F2C78A1C0B6D5C37D483F6B6EC52B7451B057C2D5FF2CD5F2BA443AFBA9215 Key = CD9057AF000AAF8EEF7F304A770DA1394F8707E59917A82671449D336167E456 Nonce = 4DF89B713AC1141D62E2C824896B80CF In = 1712A86BFE8C268C84902ED230BACA2B7B1610B5E6837ECB817D5D945E009BF627039587D42EFB7C3966B9E84FA3A8A5363E1077F287150387C3A9AF1719D91CD175A9715604934013A8A39A90EF97974A419796DB11DF04F3AC7AD348F37969FCB4F560B02108674026C17D59D191A92DA7C7E32292D3DBCCB6D3B29C09F794851BBABDF7F455A9F050A069578B6A30315BFA63448CF7A6AE2EC87C507E0A762A18ADD0BE18DF7BBD4F622B1BDCB693B53AB4406E88AA7E Out = 3C43430F459A8E942D7360E97A89B2AD6454DAC2E72F64A1B06233810334C549D63D0BE1C90A419203632CFB5C52E205756B751630DD08008BFFD348CD67C96774AF48C50AF4057B4A3CCEB8DCC2223481AFC79FE717CEA8EFA2759C4B64339B2987175D14B4C195CB8E1363D4F4249BB6F8A769454237FCCA5F848BFC05158F1D27BF39E1777A3A1648B555A72DA4CF5B297DE904DCD84E36EE569B3F0E1F943873576F97D65B8669ADCA2BDB322E4A864DA4A9E09BFE3C Key = B86E45AB9929C8382C8B068D619CD8450FAC18D39F31D38310BE8DFB8BABC18D Nonce = 3B10255473C571368D678D36964404C6 In = EC9A99CC500450A9EDC1E707A9480144E242DF106E840B9E8D3DEA995A0C9F63FCC0211702E8807EC1ABA88F5E33645B754B2E28EDA71F1B88E25B4B03B0909BD075F3855B4F6E18AB07406AD94E9C32730C09CEF69F7A4FEB3F09C83D46338926ED795ED4EFBD2917E47873FB6F516F6E4AEDA8D0310A914DAA25A08CE4528D67C3E1DECA8754552619027FA6FE7CD7A1D9638EDB529445113C09FCA8BD4AA540EABB931B6BE201BA372D213162E14141E3AD51AF9E684896D3566C Out = A7A266F5E6CADE688097C04788CFD45BD87FC636201D0F484927B42FADEE8F789EF93F3119D0DDE8E3716C3176360B928D3006A9F42BDC12D0591817DBD82D75FBA44C784FDF2D865E11215AF461C7DD1F9E3B82A146942CEFC56DFA4F8F80C4F0CAEFDD323607F43B33FBDA7B6BEDF9DDB2A8C908E6D172900D2B4CC633C610812B62CDF225CBA62E09A8A1A1D7CBDE1BF1C14CBF4C24080678677AE59166314703A11607C983C5AB3C7F755B220F10DB049983C1EC0ACCB1368305 Key = CC207471BE9C6952378E60D263D69618DED46A78A21D8B7CA94E6BCBC4E3DEF1 Nonce = 44F3D7AE3D2BA40BFBAA37A0709BEACB In = 02AD0113F276A03AE7A6C336B4DF4092F27AECFE4FE0DE526F6C548BBCA129FA24AAE3850D0889FBB6F99324F7C01C749E5C7EA3F550594B98F4488F546C509CC256926174875DCB99470F2D79EE7532E36A88BEAA0AB336197954B13171897727242BFE37DD15EE0F9BDEB5E512A202AC3BC467C91191E83FAC86A80EEAFE0A8585E293558F7071C375A918248443475B57044ACA87243CDF11AA0838D9509A712626461E9DAFD0058A16DC7C4E8D69F53C165C3CFD4AFAEC80E4F764DB4BE9 Out = 7F3B26E6C98FACA940DE8DD01BF79AC15EBA4223AD8FF243909C321226B7497CCE5169E53A3A342FB1854C1802A38F87F393224EA8F518F633B04BB8EFB4ADDCD47CD2599249A40D85A91CAC62ECE87834C028DD2F4FA50FAC1E6B591AEA8A454FE3BF3B41EF7C7FF533AD2A5D4D690F899F5CCF8D4DF6D4FFF94E7F7567070B0309A905DC671515AA617018F7C37C13763A445D48A5A4569D77815C1349A7E0BCB01D667EC0613A1EB0F12044DC748BFD1FFBF4B173FE804CD0C91744302030 Key = DF3DE7C6FB886CE9DC51AEAC38374C29AC993630BEF81F21F725DFD4D6B799E2 Nonce = 825A5B8F13472C46443D47145A1C136F In = 459C134A5BE569AFEBB4C7109D43FA4A5691B113D13CCBF47C06E90787A23C3F9C296B94D47E2606B655C60C26E9DE647F4CC5BA5A49F5BCF458F40938E06BD259C20254F46F6932C63C29EF311B63BE600E5BB7179FEA67EE10F7DA52C1A30E9EF1944D6321C3CE169123E2E7D4B4074254D7C4998ED6C153BE0F79895CBE9B3462122BEA0FAE7B3FCCA09E5F980CB439A2F748D0E704C0184B56332921E85AAD4214EC7DA6EA8C6E852F7E1773A9602DF512C34895861E1C61D8EA0408F103E88702AD Out = 95042E5A21E494CF178601CE390B4F9AB388C698AB66ED4F2E7578A10984E30F63BED24EBC839EA91BF852AB63AB170D8EAAF93FF2188D416DAFCF8C30B29455F70022284A6F934E417F582B774B034ACC257C38C173556CC2909F5AF94C0E7E7CA69286CD7FC2C729DF2F6C2543F4B12506DAA449CA990BFBAF39D386F36D490DE0932DFACA60644D7852007EA5532B6EC98789F49E77239C236284FC94B77488FCB5EE37F0A3CF575541EE2F8FC0F2BFB670447A7E54C63AF122536C4B61B7A9C143F5 Key = 2DBCBA50DDC8EF3BFF1511BF0172A073CE37F42C83BA223D7573A82B13CFB813 Nonce = 68A59DA89E8D3AEC1D4434F7A2EDD2AD In = 158C45549636EE574B32800377F970320B9F861641425ED07021C9C4E44B5F1664046328CCC1064397FCDB67015873B5EB433F52DF4936AB289A8CA161EC6A43E7459DC36332479C704D956E18C86E11A8C1AABADD88E1EAA313A3D133004A34ADCF5E0F2301C3E0317834A6A08CFEFD219DFB5F825CFA794DBA5971E6360DF22E3E0C15881021377DFD3EE69E53841EF08B3F95D9D04CAA005ED15870B94557BB73CCE60B73495655C9C164098E2AFA19FA74206685D8103BFD9476808E38F8401FC582496A8EE5 Out = DF6250DDF592B446ED6D976462EEE2CB2D7830E67AB9567BC275CBA74CCCBBCF008441B7B1593756DDAFAB05B1B728557F6D027A2A5EF2ABB072F456761AEECAA143795D93D6EC567D17F259013858513D20CB461BB51C3CD3D4204CBA768A5A3CD4B5D19563FADB62C4054C9F7D8BCAF30F450F14AF29429E3E27C130FBC7B53840A00BACA0281A90293C6D60376B4C6C455C771D1008A542E19B13AE1D4D14E3B8C69FB44550F74384C02861AF985BC210CF9C4625012CEDA24B08842986E2DA30F9009113F0A8 Key = B09FB55A95EDF75A610A03183D05A8D03D6CD9CCA7276530A72F6948CC074848 Nonce = 0866EC523C35B5D03269F4F2FB004AE9 In = F3087E4CCF4C82AA5B3CACFBFE367B2F501D1992D6455F10EA6C047A26ED06BF4393D53EB0FD5B8B587B19ABE106269A74297B517D57D89D7CD26009B5DA7BD1B5CD40CB5B4DDA96E495A02BF58108337A4F74E2A33C8EE14E730740F023560B70582EF4D1CE87C3AE5F5FE1546F5C16683A0630342C319E2A5C43BBE7EE522BE44F955B4912A765B1AC476828C0C5E98948ABFC096ABCFC4FF2DD5077926C9A3F21F85D6B3EA941560A307BFB4714A11525C60E4D70DCCA56ACF6FD3B95560CB6C3DE1342D8FF18828783C5 Out = 996FC92E3A276EDF16CA8850CF8C9530364D170EFA51D1C5DFC2843A968E3CD1EFC504027C2E056AEB2E7AA5DC3EBED6CD25728812CEB545ED9FA552B1D0B1FCEFC4CDA5BC2646BC5FAAA4C20B821A417980572112F737A7DDC93C39B533E9808D86A495547078087A6785701D27D4632EA57D398F217BC191A30807999BDC509AC74AF3DEF4B1105FB8B904DD9F2CB4158ED207614A07FC8F3803DC5BF81CAF15B709B099AC4F1F0968B7577A81819858D2096777346AFC426792B9581202DDB4F1EB17EFFD81CDA476AF26 Key = F6286D8D4FD9D8B373C7ACAACC517DD041E6E8A69578CD444B22579B4D3C3EBE Nonce = 621D087684EF405E7E49478F145FBD45 In = 710647FB3C699E7E83D1601D49513706C54CADC3034E47F8C20E1523225BED6FAF93308A653921AB1043732F142196A32329AB98094C580657617967787D738A4EEF541ADCAADE4884113C020026F6AF952FAEB1F9745B6D450FC86A04A9C4D81F4AB15089DC0BF7B1548D4F850CFD97C6732FEE47B2320A31BEFDA8398C4AB0D7FC123C43F642CE07AB8DFE87B114B228455479AF224BF82B04BC3341D257F4EC166D9CBDB1793946FC2BC08B72F7099128CB410140DF4FA38A2EA4A2569DDE2E3AFB3164DD2F9D830A831A323A09D1 Out = EE6EFF319198C6C10DDF6F10546A5F38490A9D9858E021F5DFDFAA8ACBBEF0A4463589285E8F1EFA697D08ED42F9160C4E6EEAE1F15D78207FB207565B9DE9DFFCDD96E88766B2BDA996CBD439E45578596D91E88F7706A94C9428CBCC3108E1F61CBAEB184C30E5BA0370E5DEB1A9B8A42191BAA3D722CEB9DF9ADB69764820FA95BE1B48493BDA88030469CFD41F5F13731A983FDC9B2CFE562881BC479253A126D57A8BD02BCEF2FC6DD8BF1AB265C924EA40F5CF75F4E36EE10133923E2427E19BADB34F221CDF4673D871ACAD8B Key = 6886D97D7FB73175DA93375F14FBA49AAA7ABE901751EB42CD243B568AD6DC18 Nonce = 9F9E1F292C86CFB45E0334700755C190 In = 707ED22B1DE93A11A851C0B14B1CC4B09E6431FAF7F11E97730D1E9F5C729D9DF12E4DFA53E88A5F8507FAD0AB721510E02EEBDB84EF9B34120FFA1FD80C5C0C3503AD02AF96E4F466C462C3B4F3D26C78DF8C08A551DC39AAAF7EE05B13D2E1B80DA5A1A532B13EF0D1B0659D2A0B43246E52CF8B6CF4EC5918769C21C51C6D1DA8DCCD2F3B0360248480C36D4F5CB8317973D42FF7DE23D34329FD57B204EDD045BB87DFA5913819F15C6D5049DF1DBCC696D24C34160249CD84AE0E94C9D50A5EC764C48B26C7C8E28BBBF418525F9FEB0DE1 Out = 4F9221B68E45395D5C923C4A6F96826018E207CEECC5DF1560A7587D15427B75FF3188E219D5EA5F92F909B129D6CDA2AAFD9D52B8B0C05B9E9363E8117E9996923ED6C59287108DA2F5FF3451823362B2CEAB17E862E622437A990F7B23A9FDB6791A9FBFC1C06214673C9241164044EFCC6439AE42079D3B1130320A878581D2EBD264D4FB53ADF5A60091695636F3EB58B73A3342D3CDF833F7E82D6EE1FAF65E327DBE4350307CBD631042517C448F91603F2BD6038FBB847B53F98A8DF30205022C613365C8C69CC55C6B911CF3D5567004 Key = F1F03359760DEFBA1ED11309F0C1D27A311FA4DEC398107B2D0AB2E0EAA895D2 Nonce = 2FF7028F78B7F5623CBE7D592EE5603A In = 0612DA958E54589E58F7C2E70F374D0CC47109B326598E46FCFD23553E3D84C70347561868DD38847E0096E2FDD36CE8997820679ECD5219FA16CC9FF0F2DF8AACF9116E6FC9F9261674EAAC3142DE0B9941DE77172FCA477759531B77348D914017B5E1896DD87B3DC0CB844CF642C1919D25E21E2A94977065621A4433265F590DE23612FA6B16B031F6DB3648A42F57DB126211F6FE7231849B5B54694DD736E512D1EEF0001BDD94DA84AF47C71FF61F4951019CBFFAB709278DBCB60F17EBAFA7DDFC071ADB89EDD569CF4A8C7D566FF1B7E20CB0CE Out = 67943CFCC4B795A311DCDACCFDBE44FA84FAFD87889892F0410166017B032B78CE7B96D03D00222424E0D363DD321634F4D151E1E03C357BEE8AFC7C561E8629EC55EB52567EFC8D906C2AF0E4C385A0011CCB9E254834E55F7870F10BB563BF0A732CD6AC6F8DDF19C0D3E9AF3A7F54C38E66BBDF3CF7A00361FEC2F5A7EBEA03C4C42AAA0A74F11EC51D3F5E1F78B90B09CB524F7A5DC8CD561E15EB866449F4893FD49346290A63A8D478A0C5ACED66550BF64D2A0CC5AE29886DA6DF798D8EDA7258B74BECD3094D6E83A61A9288EA1A8D0FA91E6F19 Key = 8739533FF38CD3C2A5969CDF010BE33299B5772DA0F4A56FEFBCFB4C187A398B Nonce = C28792697951BA0551162D5FAC70775D In = 4202E5DAF05E4E2DA055A9B76CA4C678A5D7F1B5F130E68389A57A52AD82B1A08FD35CD61832A0964A5C66F91E9F7826DEA9C78F5257206DD3A78C099768524D1E3B01306A9AF70F2FA7DFB02F9717C2C9D7CF037603B96AFB5B9A5C832FFD86793C0228F9F38593338D92FB70CFE3EB0B4B0E149E52ECD784E0756C1934B3DE03B439292052C21B40CB5D39FDD7BF3D81C314F927C6EF03FB4270BD1DFB796EF59F887AB566D2AC112C1EBBE1C98679D7F0B72494BAA6735FBA58D3CD125ED42272E34A9D51407D5550FD3DBE0E06004D31CA3B5CC1874E10A60668 Out = DB896F08DC3DD1224CAA35F8D841E6174E03595794F8C623987CD275AAFD213A0622D2CAB9DA6C8FB847FAD852352CE37806529A4F06A1620AB065D157E8992981BC74DAAE1AAD300447E720146174D75C8C09F1A47D307C6492D93E7035A081D4B47EAA116BA2F2643CDF4B26EE8B82BC90FAAE8BEDC463B93F2ABE99BB7A1FECFF8FBAADF907FDDC34AFE59484DFEA97937C02EDECBD1F3827518F3183FAEE67798726A220624A7C5AFBCDCABA3ACCA8862B319DE90F4C59C13EF1B8FF43DDACBC0A18548F148676034A3D71E928B1D25609C539C3203B7055498D Key = C7B7849FE8962C5670F745C8E26B979CCA21F1628305A75E9372A684EB8FAB87 Nonce = CE0C1E9870A5D615C9F6D8826D7B61A5 In = 2A797C4F230EBA8E8D560B141D6F7498036F7C54D326F67E8A0894E7C7DEBB49A717E2FF12E5020B8F4F3D00236075334BC1C1BE18609339FFE59A60DBCCA006446B05FF8C296E57FCABA4121656638EB88214BB0252941598EAEE42966CC162D78D0DA6D54C037876AE0931F94BA160CD17DE6FAFFACAA68C5F765CE64BC85B4B132366618C723B04ACBE5392991A1D1570BB5D3FF257256473297D9DE7FA8901F69B8603C9BBC267E3629A33A6A79697CE70B937E6B15BC6DEE6C0298CEB375B40DB4E0FCEAF71D5302680DE2875F14750E45771D5538ACA54A19EE9E438CB Out = B0C2C84FA758C6144BC07E436E7C4A7FD9279C35256524329930F5934B6D7CF4BCE3C7ED4D6603794393D85C28E4DB61D4FCD17A90EE2AA4E6C29E99FD6C4BE9E245329D4F33127F05C903EE1360DC713132281D67D23BA2B738A0F8C66A071DD9C31A19E13489EB8681CA9984B3020F497CC66E5CBB3979F09B0A7C5A043150D846EFE148E7871A45FA8DAC26416BE6936E5D3289A5B7AB77762726F7E4EA82D00D3123183BAF7CC146C761A7FC483055C0D687944BCF9072377A7F797EF2163FE07B7656A56083E351EF3F2026B19FF76C3162CAB2CC86293C537407F0F569 Key = BCCCB7F12DE82B841EF1C0171472BE0188C2468C8D660F268F2332530A2930DA Nonce = 570030C34B809C5D361636F477FA84CA In = 43328C5C5E30B0396CBCFC0E6BE81C49B9164FBCB9A9081CC22E223CA5CC5FD28922013E4A9A95DEB0025DD15087D516FF4771182A67E2E69E55C19809A8B9BF4F77E02748DB3CD1CC0718E37C0A9555E703C579F5761EE6DDC484BF619243A95BA97E8B0A5CE152F3C1D72FD69519E9479F4B1C46C23194DD06050224A7C2F467BE08C7EFCB0AF1DF523E294FD7382F4B60690CF7EE8B8AEC379363FF636111AD4CFEA81EF2953BF76C2C8E76DE5B29334FCD09F01FD4902C1021C93BA381CEEE9ADC7CA08D18B00FB5E652839848999FABD577870DAD510E8115B01AFABDD683FB3CA1 Out = 1775067911F026BEE6DAC1CB54B8FCD1AFEAAA98D610FE00C63524F9AB0EFFE7CB7861E1C7B1243990514BFD92C1402305958731E5E730D2AC179916220291A604B479471A249874D1B067558F0D61F29790DC82765A0C4B00DBC0AE2A3B1E608E9D1F429E64CEB08D2AC7E61DC0A3B8174D8F79CA27260991CBD7D739128012B6DF93DAD582B96603E61398BA8BEEDEF70AF98CE871CB49F2557C239CD61BADE4F38E0CBE1EBDC4580B56CB1830B5A14179C55BA1C3EBD60F60388B164CA51F1369900E9C3FFFDB39D0E9A594A329723CE60A21E7C87F8D756EE5C92CBD45D7E5A57395 Key = 2CFCC0880B1BCB48651602B2F653034A6B8406B143AED550F85F122DA3BC6E28 Nonce = 68A553188B539B46214ADE17802A5ADB In = 033362424F88682DB69F71DFFB5C08A010BA4394CE1305A467B4BC7E6DFF93DFBBBD7FABDBE62567612AC8AC5581A7A506D13CB8FED0C856A89D84B4D14D98005C74616704E46CFF43A878B66D1D6B3636949C19404EC55B61A1F5DBBC829AA720FB4A5D3FDB8919885E6CCC35943AC13E655E4149A587C4A60DC54BEE8C64A0DF49656CD4F67FD5ABFE1A8090E48212646D730B50E8255774A3A1756F63DDFBB33DC0D2EF5786B6BB6E303006A2FA3217143CD9237D15F24FF27DF41A9099E53432EBCFBEAA0ECD5FD419D736857E57F8917DAB5C20274BF0F61075BE07EC5383BDF320C8F04FE4 Out = 11C73FFB2F85FE26E087184A4E7D0E74CA4769A072EC036EAAA0162984CBF53979926FC709BB59158685C6F131BB3E79886D13F0A644A420D14DE9DD497FBBF5C8CAF27E6C2CFD83CFE6A5219EEB8B29DB9D2722FD7E1004BD1152F6698C4DADEC589BBBFA3EF96BCF4E90CB1395EABA2F1D90D5B2F81F312F2AF94583B4F3A8DEF1EAB26FC8EC9C4C2663F4CBF856B1BA593A3E3F54B3D3831E24B44C7A5217695F3FD36D834DF32488DF461A118A93264B2E6657DDC66D246720E94EACD77ECF23642A036229143868ABD20F3B1FAE1B852C9669CCB0B3334FBA0D8FEAFDD56D03E52F5D136E87 Key = 30A6450164DA25B43CA6DB430F827299AB79CA4A52C636C690F7BBDF82BA9B0E Nonce = 4A87D1FFB56ADFC374C09B2F8D021CE8 In = 9481ACE7C47FEC3A22B41B81E1A72363D4F4EED3CB0C93200769415B4779755982EA26E0F6363C973A7C59A43FD6CC4B2D1857EB38B5AE5BEA22DA4781AC36F5559A2A2A8EC111AC33275AEB3863B2A7CAEF572A16523A1231FACDF0FEBAF9305B658A4E7B0CCB9A424D58384B385132389D5545ED6D2BDC3D615D229ACFBCE60205CE1119322C642F4D81ADAEA50995E4DEEB23D9976A1FF4A9C8CE7F0CC7DE657690F9651E53DE4E58561E9570CC4526FE03DD686BA1AF9557718D38641B080592C9BFB2FEAEE56AFACB4F811439FE29AD6BA8D6F0ACC3FE3836369CE06AEAC64898DB676EA7640D7A7BE6 Out = 8217EAB21AA0D8A541AB0CE258E96EDD82866A5460455B82C339F5157C2B159FD8CA8AF0413BDB5995EBEE6AB6E1F8FBB03C67B086DD2E6AE05E0B37ECB43EC2C77E9510F24BA1D6E5D4906A10BEDEC2D3ABC09019274E8D09CD3921B3DF7F9EA607011655C684C3FD4357476F97C1FE8314A80AE372EC4C4B19B5D34469E66A94DDF0E0C5546A290FE42A3D00F071B5846DDF4D88E320E4AFF2CE3D650DDCE965C16C3943F1EA5A63D9696F8DCA6D7D65C3FAA6157549B214FC3B44E6C62D124EA327E97A91126256CC475A5C533CAF2EB3F6B08769436ECCD52D2AB31A87E1E09D00D2F835BF9A7356EF71 Key = 9361EA127351940052051851106E32E21B5B74CAC5EE2C65A478DC07962653D1 Nonce = F6159606256712C7DCBB2F3E8ECEE258 In = 3F5E7DEA03EC52DD0CDB0030F676EDF2EC5B91C788D1AC9F8E88391FED510CC64123E47AC2B685E5387365DC98DA305A832BE09C50F2E3E5B97E02C92F92EFCE59DD0A18E1227661719B54397B0367359A1EE476E8106D2CAF3988E95BCA0947E2411574E3E61D79BC8C6FF5F7D806BDA98E0C69E4F44F70E9B2F1178DA75DB504D3F8096AE002E2C7C36E95EA3D37CA3807E760424D022697FD763B1B85E4D4D15D95153BFA3F74BADF46EC1906B1904D250E984D7CB5314EADD248A801373FBE2D9EF1B9D82AB3FB0C2CA0F3F9EC0F83268EB2464E40E0C40EEEFC1B9C4859A357CC62C5537783D7437E6509689C6A Out = E4E2000ACFA0762A90E16CE545060CB60961F69586A8845D37709DA643894EB7BB29B2A069E0533EABEA770AAEF101CEC381983F59278E7EF2A55B190F7B758DD97050315B3EF563CF92CF9D2CF955F266C77AC4AC8BD7BBE39CD4F5EE6E57854C8F2DDC6462889E1F02DF8A7C1AC02B65423A17299973745C7C4F17E4579F514F199932D98062E3F0E141A8133CD974A4B1C8A066C4800CDDE54424F4BE19C4E0099A9AAF11692C27E182AA55DEF8A439A746E9DDB83F674F76F297BBE8C1DD7F4A4582260DB38C14E6FC40FB1DD429FAD55769A89BCCF00677FBE04B07C5BF6380AC4DCF47FFE08AB15370ACF4082A Key = 2377222F39987D62CE8CB5F64E88437543E20EBB58F2DCB159E0AECAF439217D Nonce = 2DAD0FE823C71638F1910AB8D8924C87 In = 378FB5CB6B0FAD01796C73A850C8EF78AF71CB2AAC0CF7FE9EDB58D64EFA6D138FB8FF484500C5E15F8013ED56BADC846334DB7AA6DD1B0C55BCD1A32B93A86B54B74D06F3224369D5E2ABF310A13D76CD3C0E037E161047CCDB49C1F117097AB42E0CEEFB4B09EA86305C72D1627D53C5D8DB79070F20BADF51DAC0F6D019C7520DF841978F0249E24F995D4C0823A5CA663B67B25EEBB8A38A95D27F44E425DE53CF55E5E3811CADDB9C0AD3C415587DB968FB1F2D93D3B02D5628BE64E09AAA0A79E9EB6B72D0088554E77574315F1152F489ECCC4B8B9705B10C96CDF2368DD61D8A345570B4751DB4533643C8F10CA2E5E9 Out = 6EC13D2297C89EBE84380FD858E68FEC5E09BA9F4974C03B0C1A098C42644170358B792601D88B40CDF56ABD6A2D8B7CA430AF87EC349C2B11D44731A0C219F0DF310832ECA798BEE87C293C8834CD74724E96A6D7A1DFCEFA893DA180CC2CA8465274D176BB0D25B1FCD04A3142EDE3B74A6D3E1ED86F3289DED1E37D32B9925C8BB51913B2850E5DA43159D4F70F6406F5BCF600B1AFB2244BFEED3B40303C58892BA8A59151F8E2649964E767D918771E268126CE88156C4FA319F65CB1E2909F5A196399B45EF0B040C3DCA7E79232E4782041C7E6B65C9C82D8B4517B469493A46831B9E9094AEC31639E353F40D3AF1488 Key = 19F394E4AF235F4BDD3F0798E904A2E114041B351F0D71C5BB269845BB53D4B9 Nonce = 093E57768A6107B8D6F31A083B23B3FE In = 41E99B44C7C94FD5B8978507A99DFCF6EC7A49304EC6099AD1C38DBF8BE918860AB5C37BD13253B763406AA6DA1CE6779CED6F7F7B222CD51967BD3B61FA48F6B65B96891E34FB583E0935454ADCB3CF6419216B798A7C0CE5402A3232510940839D4DCA082247505CD68D73B1AE4E352B9A95F6CD68CACF68F28A525CC3DAA1504DE85B51CFDC3B693DFAD28D4ED86B70B93B02FAAA0BFE452544C81ADEEF99A59378CE0625234EA69E9F69ED52D5FBB6687F9EE248479E1B29ACF0CC3BE7BA5B77537C29CAB662B2DD7D8937B9DEE577E7C8DE85D3CEF30912FF62687756C6F978FBB147E6B27E923C62F9A38BD7F50D8801E676FA07DA Out = BC7838EBF0287786D89BAAEBA8ECA378E898BB36A6D3D6CC125938D71768BA704E30F9FB7B09A43D85786790FCEEBB46A2A341C4EA50AEEFF3DC57005DFD7BE9C4052AB3CAB38B11221EA39EA778AC6F4111CD1978E5D467301BC7ADDC54D084F36652A9AD3EDB8D70AE63803B077A39CF064017DC2A8CED0E4B1A7D6FAB58B0FC92684778B7B3F5D76477CAB7C6C1C6AE6BCA1F661CF26DFEFCD1DB5DF58F1358D38406E3D880F30E43E1837132B5DEE65EC09B7622CDA1F52A78F8EDF870D2AF375C7526C70E43FF650B8EDCF6A35D02CA479DD560A67245C7087D0376C9915777FCCB390109115AAE52C4512ADAC046C8C1E9092F3018 Key = BA516D7A4B7638995562CE54FEFC84B6DFB4B8A81A03F24BB065B060E4FA2966 Nonce = 23C93FBB6EF742A576769819A5BC6AC3 In = 20143BDD828F687A93266C2E489909BFD6D85884A40018082FDE227841647D162DAFC24140580495B6E0C393CFE2BBE80615C87CBF5E057D74A4CD7589DE69E136870A24AE67F9F0FC7B92369903718B9268500155ABBD6C8D0E81FB1104403A02A56FC82F1DE4137EBA1433AAD9CE7B34198ABE7D9845DC462DBB4FC6DA4F937EBEAC139339B405ABA51BFC9B06B38CBF17352F47C6EF3968F06305123888130738B887911567A28DEFBCE943D18C73ACBE920C386143E0B6B2C9EA30C84A7E4196481F93395C8BECE5F9B341725DA7883DD74792AD01407A05BE7A2121AFB2E9EAEBBA7574F9582D0455571A077603A511ABBEF9EABEF4553A48EF Out = FC293D577FE018127C31A901490F19DD72D0A3212C828EA530B256E563874E03C700366884568B2F58B0478B8953F5A667E070BDC386404C47A45A862626D7F621C5E87C3F48A15B8F7DFA5EC168ACBEE32E08551DC7AB5826F42A75CE8A0A61BB9E1F4AD5BE53AC87687961388BB809ECEFDDD93782A956F9976242B20B1C2B5EAE31D28B48A44337AC677C6B865D89954E1159353FCFA1741C287FEE15473CB4004E400FAF336995004964A79E2EB0FDF48C2EA09120126443E8771F9700718BC94E5070DA8DAC17BB3F73555F3942AAC1C2830371D6417EE51EBCB1ACB8B4C74BAAE38E6CED7F7622388FBE2B2153DB6945B77AADCF7DC99502D6 Seek = 0 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 80E71459F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = AD68A517A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 1 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = E71459F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 68A517A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 2 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 1459F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = A517A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 3 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 59F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 17A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 4 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = F0F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = A73C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 5 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = F7DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 3C9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 6 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = DD4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 9485AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 7 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 4E490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 85AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 8 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 490FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = AE996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 9 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 0FFD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 996D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 10 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = FD23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 6D79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 11 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 23063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 79B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 12 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 063D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = B90344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 13 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 3D1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 0344B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 14 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 1F741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 44B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 15 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 741E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = B5ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 16 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 1E44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = ECAE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 17 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 44939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = AE6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 18 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 939770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 6C11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 19 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 9770B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 11EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 20 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 70B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = EABC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 21 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = B6128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = BC4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 22 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 128F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 4F268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 23 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 8F07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 268B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 24 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 07BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 8B165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 25 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = BBFBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 165232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 26 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = FBD48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 5232F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 27 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = D48323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 32F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 28 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 8323A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = F7A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 29 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 23A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = A062F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 30 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = A2CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 62F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 31 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = CC7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = F73FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 32 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 7558A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 3FF46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 33 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 58A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = F46E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 34 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = A4F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 6E7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 35 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = F4CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 7C674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 36 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = CA4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 674C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 37 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 4FD9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 4C706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 38 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = D9C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 706F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 39 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = C32A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 6F14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 40 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 2A137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 14BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 41 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 137C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = BA70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 42 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 7C5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 70EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 43 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 5AFBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = EF9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 44 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = FBDB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 9C77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 45 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = DB278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = 77D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 46 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 278A9ADCF66B0CA5086D0C09126A7FD5D20D Out = D5E6DF90CBE09114AD4E60417A597FD896D8 Seek = 47 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 8A9ADCF66B0CA5086D0C09126A7FD5D20D Out = E6DF90CBE09114AD4E60417A597FD896D8 Seek = 48 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 9ADCF66B0CA5086D0C09126A7FD5D20D Out = DF90CBE09114AD4E60417A597FD896D8 Seek = 49 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = DCF66B0CA5086D0C09126A7FD5D20D Out = 90CBE09114AD4E60417A597FD896D8 Seek = 50 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = F66B0CA5086D0C09126A7FD5D20D Out = CBE09114AD4E60417A597FD896D8 Seek = 51 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 6B0CA5086D0C09126A7FD5D20D Out = E09114AD4E60417A597FD896D8 Seek = 52 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 0CA5086D0C09126A7FD5D20D Out = 9114AD4E60417A597FD896D8 Seek = 53 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = A5086D0C09126A7FD5D20D Out = 14AD4E60417A597FD896D8 Seek = 54 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 086D0C09126A7FD5D20D Out = AD4E60417A597FD896D8 Seek = 55 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 6D0C09126A7FD5D20D Out = 4E60417A597FD896D8 Seek = 56 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 0C09126A7FD5D20D Out = 60417A597FD896D8 Seek = 57 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 09126A7FD5D20D Out = 417A597FD896D8 Seek = 58 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 126A7FD5D20D Out = 7A597FD896D8 Seek = 59 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 6A7FD5D20D Out = 597FD896D8 Seek = 60 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 7FD5D20D Out = 7FD896D8 Seek = 61 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = D5D20D Out = D896D8 Seek = 62 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = D20D Out = 96D8 Seek = 63 Key = 9ACDD36A9AAF77D9E2C6286DC456D461508356818F4FC2CBD001A94037E42E1F Nonce = 0EB87233AFD4C552D9D5ED5C415F03E7 In = 0D Out = D8 [CTR-BE(Noekeon)] Key = E6CB9AEBBEFE8C4EE3B4763AF201BAE3 Nonce = 1B17F86B0A89CB174F5DC673C187803C In = 21 Out = D9 Key = A4B6826186ADDAE5E4E5055D899F56E8 Nonce = 4247E4911362FFBF59B407BB5AF5CD82 In = 0FA1 Out = 8EE1 Key = DD4A440EA6DB12B9A7B59F8A56F9E0E8 Nonce = 81ED06DC0A1318D286945F012C5D5CD7 In = 193D02 Out = 3E6DA0 Key = 323B98A8D64754A9A33FFE88A3611896 Nonce = 3CBE77BDCA7742A28E46BDF357674539 In = 96C298F7 Out = A47A2E54 Key = 4784F2F3CC6AF39DDF680A99C7771864 Nonce = E26C455121A66ED165E6C99719572BDC In = E807140F0D Out = 1954A24EA1 Key = 8E525E8F28A847EE0F0CD2983CBD2218 Nonce = 1798DFABC785ACA2B0947B2200EFA751 In = 5B15EC624053 Out = 037D86CA7EA9 Key = 42A9DF33ADEFCB8829DB8E04325B84AE Nonce = 0D0DE03906AE076872ECF96A1C8032E6 In = 45E0C038C4EABE Out = 1ECF07B2734A04 Key = F427B0752E20A18707FE6EE3A5E618BF Nonce = 509920DDFB13129FB166D7F15F4F7A08 In = 366BB3B18C1EE9BB Out = 7EFB806DD92DBF81 Key = 3D1493AB0D6FA0480759227590200870 Nonce = 33C02954E7B23D691DC9E55487B93544 In = CA3574A484B30C861C Out = 73C3DF6535E7EA2513 Key = C3F327FD724506FDCEF4A1CFE91FC19D Nonce = 83BAFDDA70B7F521325D4666B097972F In = 7B7C1CF2E041771A7C66 Out = D5382A6934345A7CEAF3 Key = 9D193DDC4FF8FCF4059DD58B6619A4B6 Nonce = 7FBCFAE85957F510D3BB234A8CE3EF48 In = 6F7ECF3563E45900D78870 Out = CD7B586F2A1F6F1C33A203 Key = F7307D92DB9AF3F4F3D86E07066F8605 Nonce = 4951661393781B8C65DC17E14D0B6117 In = 5C354F161AB87D48978BED40 Out = 7ED102A25E2D50B7FA437F92 Key = 8EA31DF7E30BD06FCA94C76015FC7971 Nonce = 1DE58DD80BF16E30CC11EA53DC00964C In = 279745A7F70E9C8F8279870A5D Out = FE2C6E2726177A56F151497E13 Key = D139C37458AFC755E2152F71F3977A84 Nonce = CBA8F0E570AEC74BB05AD388AD00A971 In = F803982606FD583BF5AC8CC06AF8 Out = 90CA27B45F3BBA71239A2B7D695E Key = 30934136861FD92DB16CCEE4576FDE5E Nonce = 1FC104FA8E1F5E7A163BCE1393C9FE9E In = EAB7D98D9394C39C8F8B414892D34B Out = 00106AFF5E616269337A1D03F9A293 Key = 3676C4095C06E9013491AB481CB4D526 Nonce = 8C3B99D61432DAEA2FF8D5A72FFCA449 In = 5F1FCEF49BB2CCDEE1B0F26E69A68979 Out = EB5534749B9FEFB16AB0B8D5E4A581DC Key = 8E23F92D86C55185CB5121B04C366A58 Nonce = A1BF4B384F7BC0E154F081654D282957 In = 4F9CFE3CE3E86BF2A01AA4925D922B2DE6 Out = 5FBBB53B53852E977E7FD7BC350B0563D1 Key = 0B04F22C6219A26CE72D989F120FE3BA Nonce = FECEEAB827516C3A7A35A0A4431234B2 In = 921157A2FA3293584B0AE4A63326251D022F Out = 8F9D3B44559151D9FE636DDE0B029C3140EA Key = C7AB8FE20D48280AC05348EB99E60856 Nonce = 9BB889897236F3D9934432E39A678C9D In = AA30402A478C8FA4341A98F17C03CFDBC6CF66 Out = 3D84E0B9FEBDD66617EC4CD40B8DE06E3A550F Key = 9F493B0FD458928C9F4E14E3BBAEE80F Nonce = E41AB5247E989AB4828CA3C2A65128F1 In = F268E0F11C1C53B18373F7951DC04DC85F69BB1D Out = D8D4BF072F0D743D942F15F082A2F5662367159F Key = 728E75F900674124142AA337CA1DD561 Nonce = A488B3EBBD9DCC78F4F63EEFD6F95DF8 In = 59D4C8631BF4F21C857334AEE6BCF1585F5F0C5CD3 Out = 5FF9E4072585125EC1D08AB79B744C189136D8394D Key = B176CFEA51C6BD14EFF032BC66F6C7F3 Nonce = 0F24D4CCAEF29554B886B75382B6CAA9 In = BDC114F0241652BB4ADA3B33FDA18722F7C8CA0F0EA6 Out = A554815F48F5E97A9D79F074B40D4553B7614BC1E1E3 Key = F47516C38DBB7B8E879F0226D29318E0 Nonce = F85828355C8913A3D52DCA893C6AF736 In = CFF7BA8451ABA766F874E708A2762CB5FA20B0B880EA2D Out = DA5EE8406F03D84032207B50F84DD490E3B78C8DC9AE3B Key = 3EC64B66F25B7DF1B6AF3F64E072A4A6 Nonce = A1F158D936BB8D54E10B590EC36FCCFB In = AE60C714E058625A84B905D94507FF7A0D91CF2FD28FCE9C Out = 4FE77BA0D3C58497290AAF37D5C129C22B7BB62B450C43ED Key = 29561184F97395058CC4FDE45B78AEDC Nonce = 77DA790BDAF8445CEF0B3C7CB5682FFA In = D776BF1BEFEBA895F63816B634836D04BE7925C360B847A7CB Out = 012A6BB13F3BAE6F9BDC69DECF667CE8753E2B6F5C2875B45F Key = B3C263C819CDBC8E7A7296D9D349115C Nonce = 7080A7A1ACB9BC675DE05186805CB4D3 In = A34724CE5BCFB822B3D60BA0CB5AB46C63B98424E46CDAC89A92 Out = D7FEADCB3909C594CEECE8BA38C3ECD2CE77508F117095350458 Key = 945EF1858BE2949562316E1AFDBDDA39 Nonce = F621DD4CF531940FE1EEE47774E3A6C8 In = F935DF934AECFEF97B2F3C289E8E5F444CFF6EC8043FED9912F5FD Out = 79C745EC22125C4A5EB67A98E56154C4FAC1749C8823C912830B47 Key = EEB53F967B99F636DAD0E691DAC87E7F Nonce = 4AA26B55083FF42C0106E35767FCA76C In = 2F7B4634AE008B66DC1424763FFCD771521DFE4A8C55B83B3EB59A72 Out = 887D0AE0873FA0575CFBE21018E0ADC15ADDDC4CA446FE9961560B5B Key = F1C8548CE25FBC255D6AAB47D379DEA4 Nonce = 2F03398A4FA867F855D844EE45B8EBC8 In = DAC816A9AD72387DF047FBCDF545B67939FCC12C589B1B4358944CC6EC Out = C62DFFDA9DC4451A0A4356A2BD15B570BF93CD885784C8DB3709B93E79 Key = 1F534B2B8F89DDB9F70B83A83D03984D Nonce = 53C876314889F9D06C990384D3641EC8 In = 7672DE06D10FD6B5F1B3E5AC61F2B27746586CAE09930C336E46BA801F0B Out = 22C85E005F98728A845775998F23F5F9CAA6631B05FE3AD786551CE8822F Key = 51ACEC63AA4B0DE98B36531375EB30AD Nonce = 23DFDDDA97F97A1BC58A5E3B228271B5 In = C1D9527AA95E22C82B06DD6179958B528CDFDBC982E099FF1BE20132AB85E5 Out = 8D6FAE173EC8ED2CA49DC9991955926DF776442DC1B017099AE357B73B69C2 Key = AE1F2169BFEB95359CB55717D36631FF Nonce = 4694AE380F4932DC01A035040EE4DA04 In = F49311B047ED65667B79E02E347232C305E38DBADCE1557BC9766D0837C808CE Out = 33A4561CA1D8D7E59F3CCF80202C2BB05342C4BE8CEF2D1C413C5362E71EE39C Key = 17FCC4B22BF006E19FE47A7F3D1ACDA7 Nonce = 9B24E8C1B46791511094FA0822AB94E5 In = FFDB5DD9D9A73FF949F98031B8E54CA7D086D7BD83F566E8CBE817F7A5930E6827 Out = 01B2143586C36DEFB4300F3179A9CFB0C981A1C3AB7FD6134E83632FBC5EC885B2 Key = A744181C72A954702461521205CE235B Nonce = F1E5E566D925F72E67FD7C16742FC5BD In = 985BAF3296A7807B36605FA762CD74033B07A0D19A572032CC90144A30A22B7B5AFC Out = 95C1717EC7071A9C9365E8E8AB56A63C3F6F5188FD56D071515E654769263E7523B4 Key = 5E752ED4C2A65DFF022F75750E622126 Nonce = 04E3BC70FE0B5287FB8F3B563B4B39B9 In = A571D98D9FAFF69964D8FD5AE62D998AA948E64C3EC2114F2966273722DC9A85361D4A Out = 2D3776235BFCB3F176C7B82FF34B821DB0C637B3F906FC5E6EB8517110385CD36B2A23 Key = 690C8B04CB3AAD2265D6CFF3D1EA21F5 Nonce = 7DCD6F2721D22132F53484918EBFE4DC In = 5A96FB6B4022B903049C1DC7B209890DA31B16D9A4161E861DEF53FF461C98B50D18F805 Out = 5C7B8E2A358CE90696FA9CEC20C5E2D8ED1A2A6EF5E4824DEEC0BBC0E843F39EF74F706C Key = 6A6B6FB6F30634782A4AC05DC64186A3 Nonce = EB992E4B1255989D047D486DCAED9117 In = 77552AAB1804ACF379E9FF3CD8210D36CCBE8B5DDEF1C416668953B4747D4315D1D5643BFD Out = D6222DA67139F9CB63E66E51CEC9B8C7F2C371D3F1417AAAA99A47BCAD4BADA29F8E552B79 Key = F304C4DB0E3669597A8D760A596C14A4 Nonce = 3446DD04202AE3F7DF2FB86B324514EE In = E139C1EF006AF64F6EE97E37FC12DF87F93317D7F9067BB80E93690CD03A54DDF8009032B41F Out = 7FBFF983C5B55472AA881DE7D639B672E53CA89112C454FC1BCEA3D5CCB5360F8325DFD38A70 Key = 5993951EF368014469C049140FF4C774 Nonce = A8CA0BAD1B2F913D0907D0AAA8C40AB0 In = 658A21D4E0B513DD7609A820BE3A0F55C4BED000A009567BA41EBC3695719CF42A835B42AA8CF6 Out = 1FA58300ADEA19460C194BFBD799EE58FCACD72C943A4999959E74EE4226A72ECF022C95637FB6 Key = C15284EBF517E72FF4D6E700240B1924 Nonce = 0403E95837CA6FCE033E1609EBC2E137 In = A4BB6603C8706616B4E3932F4D17392A71F7C1798C8621E7420BBA20B7FFE69E76A43D732E851EF8 Out = BE78096ECEF8D4A521BCB2FAE811AC748177438FED3FA3B69DD294038B189AB47D3E6D1725362417 Key = 630A843465F6748FEC11706E0C1A30AE Nonce = C327AE44C20C6B7AAA39CD482B0FAC08 In = 1100C1895AC0A3A551BFBF4007E7D14CAF9F7F4C6EE1F70134D7EA376C819AF9DD8A5387DB47A68C81 Out = CBD14325C9691735B07716B0137F9323B9FB8A09892382CA2E58613551A52D1465577C2ECC5F516E8D Key = 71CCC4B282A3B8683CF7B23212C9755E Nonce = BC3BE9DEC1C4CA5753C7ECABBED3BA03 In = 3D9EE4E182C06BAA806BE849E1EEE0F1204B4689CCBE5A76A3FDD8DC814AB2CE102AB08EEF4F7166065A Out = F930939B3DC17ABC2128B4F57DB554CDAE8FB753E5982B63923F0FC2B967A4D3EC37694390A5DE94E5D5 Key = 365207F51C75603FDDFCA7FCFD0AA943 Nonce = 6135D9DC5EFCD2336B7BD8504F318522 In = 6A429CD60FA9DF30151381700B21B297FFA3B422A6E5743E1A17014F1B4DACEBE5D4E1EF5046B88F347BC6 Out = 78F328303105166AA2A007F5A781EA11A4BB64A333BF379F05F7D8615520E8F56339648C2FB0AB9FB12281 Key = 03D889839F78DAEE42EB1A64578B0735 Nonce = 2841BD9252AB693AD1488E74572BFECF In = 19026566E90BEFDE96EA10ACCB15475BDF4F051451FFC7F42E93B94B1FB59C3394E21960374B4E694A94B79B Out = 2B3C08655920C3AA770231AA83D05316299EA120EADEAF94884A32714FC1B73B0A9B3B573A53D12890683A29 Key = 7531E248C3607BF709BDE889983E8BD7 Nonce = 2C6804B5C23BBB1F41DC3DA8B9B135C8 In = 4964BE4642F182D57708C17AC58BE92555CDD0A0C2B9C0F373FF0093EADB02AFE934E0D316FADACAC1AF457E3E Out = EFEE5CF69CDAB2C2D1AC105C6EC38535D91020D1B54D04C56D2C37E592FFB48706131A352330813F047686D534 Key = 9B9E8F6A1E642D3F148141F44A702B78 Nonce = 11237C7423EDA19C1EAE0C84F6BC3B7E In = 320A987FFDADDBDBDA13911C14438966E2D44BE18270BA5B65DC6799C981E34ABF277C49B0EB6F147528F0E05DDB Out = DF6ABDC41BDB76425F2D8CFC5F6E372D269FA011AE3C2AA493DB30F569B75DDA1552920A9A0AFCB574DA7EBE5483 Key = 0C8F881ED6BFD47B5B8F458488634ED2 Nonce = 623F903A40E152910B828F7EDECB0CC0 In = 9A891EB88E6F35BAD450EFBC09CEA0779C139A9679AEA59597C98EDCC8B3172B36683AB62D3249E8E31538592C8668 Out = 02A25E9C253CCB466B6D34FA3B36D113A287F7AC406823EFAF0E3EB21120DAF92F484E6E9A2C913EC2B8B86E913DE5 Key = E0D6BEC46CBA9137A4C19DC9ACA26B22 Nonce = 53088D58E6BB077E85B752DDBC902C52 In = EE2D21B3B4D7BB0963A524126B86ADD09F17E07FD7A41A4CD0B957EFC9A9DF32047CC4626615B34FA5BAC3EE160DEBC8 Out = EF6064B1616A36CFE516DE3DE86C273016E2AC92BBD2B5345E3C3D25BBB6AE55F1CB79C896A5115C61DF76BC93687DB0 Key = 80254224459BB50962188755D792FE3A Nonce = 38063270D707EC6D3EEA123C6D4912B8 In = 61C4987F76789FE99F310290AB2444B4EBA482F29BA3738FE8FEEE66B4087BDC2E2B0745EFB15B6F9FB93E60CA5A55A8EE Out = 61719F9D07B0F044E8FA6980C220D4E5297F7612427302DEE94F2F381F10AD5926C133C496E65A3293498D2E2CA5C3F41E Key = F340A9624C475D33A2CBCC1A5242FF6E Nonce = 7C76FCFB3D19F64CAC2A7278AF846A70 In = 59ACE34D84974EF492E04A809FD3D45CA0B8B445461B59B6524F2CCFA3D2FD59B018D4CEBA2094AB668F9671966B165BAFC1 Out = 11D166C2ACBC481AFBC65D461864D9EE04C879A4ACC14A1693A57C07971A4B9AA3A33BB094ADFD6BBFEF0AF61AFA0C311BED Key = 977184379DA6CE1B1E3132AEDB6A2FE4 Nonce = 7445CC4DF79D018242B1E6B9EE22E9CD In = 9B0E3DE0C6A835B46112E807B1BC3A8384DEE51ECCA166D6A757963FFF766AB32D0E1565861775CEFE8455C64E81C7EF6AA10D Out = D17E90D24691B153B8917DA9C3520D405465D4F2C7FDB2DD82365D0E356DB712C5909C594D83AE4EB079F5C392317BAD0EDBFE Key = A3A5F12ADF2EE262843B4489245A0A92 Nonce = 57C202A720888F578CB6481BE5214CE5 In = 55A74416A6C1E33A09CF3C1514ACD9FBCFDE9741D0C386AB84F1F01815F3A7A1626B1CBDF9D6D25712FF220B6DFCC91FC97E4842 Out = 6268AC60330EBFBE8F3C7762B6B00DD92F0D85396098B57474BA98ADECE9FD568AF86B5695AE6918648BF883868A17BEB4359D3B Key = E72BFE997F80D8D8B16657C6B754505A Nonce = 22F9E33AB71D200A64C2F05CC426A748 In = 10302F2893D19D0429A4B893763302849B8DD13F79DD01FC64168C938278F7FE9F399DD4271C0B832CEC29F1C26BF1B5DB8B1BF793 Out = 2C1F2FE864FDA7D93A08AF5F0FD4186B5ADE3A0833F7029DE495EF6991E72354280F385430D16DFED118C984DB1E3065ED57DCBE7E Key = 5C6E15752D992AEF84C7D61385168ADE Nonce = 689EAE57ACACCDBC3C02265A42EF4965 In = 701BB84145F1DC20F7A457624AF353F0148F1C2091B840C49CB5FCC9B637A27AED4AB17BDEEE88FB982337E8BAAE35540283CBB38F38 Out = A8FD582216D3FF768FECAEF5F619B056362692D8F43C2E3E75694AD274D753C451B7AFE90089012445D470C5404A74F40B88494EAB5F Key = C56BE3DF2461B1CE444FA14943E121E4 Nonce = 284CBFEC11CFDC509E5EC53CC2E33AFE In = CB1D8554194AC2AE0E3C9F9C2B7E3797848E6AF752690B2A30EEE0D545D41E336C2EBCB7C24CC5038D79265414F74453AACB5BBEBBDDE4 Out = BD19014FBC75D13E2F2EB1F18D8C1D8336B6DCFD2D17D7D27F62331AB78637BEDF9C1F4378165D08C79034FBEAC9B2B90D4FD6F197177C Key = 4740158FBCD99CF0DCD425A55783DCD0 Nonce = 312B1208A28974B5135DD517D8F6C643 In = 348A8FAD0985490F232862FAE0563E8AAF58A4463F9C6ABCD600B8F6662C72914666583653A4B9C3FB499C2594ADD05EAF82B8DDB27FACBE Out = 2F10D18D90F9471996EB7127D1219439D1867795EC1911E75DF16AE6019FF569611D9A7043DBCCE61B9D261E1CAC663851C4A0303313DD47 Key = 435E6E1F17830FC1B3129CB31DC25BCD Nonce = FC83C06D644CFDBD069B8C01ADA12184 In = B15B6F7C6B48E6C6F9499E72311DBD707CC3C3C9534902C988729E520B9DC997B3D246F009C93E16C7F54AA9E2DBB870DB6FC266F254A5EB97 Out = 4A8E6487E3676E1111C79CD542FB77E20E0C6B27F5502FE47A70B0E328568DA75C736333E23707AD3A53D65C091B5A886B4F0121F7B90B714B Key = 3FB7F70F55A40D38B40070F047F0A845 Nonce = 101A58E039261D052C457D83FE99B7EA In = 8916C5F7DC966C0D7B9C6FADA33BE730674861B908E08392A9FB7F66A58DF32B2BD3D8626274E848235C7A213BAAD607A3377D116CEC891B33E2 Out = 56070C7041E650EA2C28902560BEF65100959E1FB2D2B53888E69286861A711748B7693FB597A657C27069E91F386D896727340BCFBEF79AADD1 Key = F4CAFC7D939BEFC4B7C9BB5645C2863F Nonce = DE8BACE1BCD71A743E153EDAB0F6C8B7 In = 04DBF311335F163FEE6A1588FD6FCD433E3AF7D4CCB72FE8507C23853F3F67386DCF8019AF7C58B20A1CF7F0BF915E9C2C8C6785B702AD4EE599AF Out = 174F696EE3197A93384A8E53B1315C3C448E4F2B1AB0086AE68221383BF12C9F43833283CF54E4EA421E09702724D59B4760EF4FE935692ACB837E Key = 7725DFC7A01FA56A262FF5DE277C9C58 Nonce = 4E856EFEED281F39164BB5D426AA42C0 In = 2F5249B8FC8326634C5D80DA4D6EE63E77162E211C4C562C100B86157103426627C6182EC81439662BE17C3ACCDC8E23AD637CCFADB6EA97816C3395 Out = CCDBBF547E5F39797D5BB8BE1A7D840D16A8E60555F84494C551E10E1E9B295055A1CFA85CD0DF95A9E90F4AE6F43053BABB28604F88937A384225E2 Key = 276AE6149D3D365BF4DB65B31BD3C10F Nonce = E998FC4FFD8E0171069FF3F08F66D984 In = B3FDFB3E75FC0B934C084152E96DFFDB625FCADDB005345732643419FBEE2760CCF336B7B76E45A4E441AC88C94C87F70C48AD057C9440E032A20003B6 Out = 021A9DB9599E243EE850AE3803359248169DF6F1E109B5DEFC3E3181A7F54580B6655BD4B886802FC7E0F32872A93D3729B4C4E4CAB61DE7C5D9F3D687 Key = 86F47F53472E329EDE94D33D391EFD51 Nonce = 3E9AD8839B92C6730D1E1B4BBDDBDE08 In = 3D3FAAA063794263890F4DDECE9EAF9D8E8E89C11A8F779D82FCD178615F5E2325ED84378682169835C7013C7E23CC9BE74C71BF9D6CF291C3AB3304C13A Out = CD1C1D2E2539E6AC4198125E968C2E68D16427DCF681FA2006CC79AD23DEAED22CE38DC53D84445E5628F87AC621BD781E1BE45EB83B0979B922EC41D1FE Key = 1305148EF4895A0FC12CD652FA9FA2B7 Nonce = BE33A68DCBFD831CD6456D77A2CD8E12 In = C7BE811918B7292EF452E75842F1C8C744A9FCC616B1267DDDC9B7761922B657D2653DC1DFE1BE4D5F20BF76F3C196ACFE38EE1038FF3EC62470DB25825701 Out = E2128982F4EA238ADA0AC44FCA33D64F1FD1D3F8343EA61683BEE0E3D330EE156D18E8C26EEB4010F8CB0B20FA964E479DC129386D30460611253822A85507 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 3A2BB9D146DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C03B4714C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Key = 0A127BC8C04D7718AD77F62927CF0B2E Nonce = C97672CA375539D43E6CC3E06167A001 In = 315FD1212F0B4FCCCDF9951DB7AE90F980E6CDAB1EC35E41332007F3FB00DB054FECC6F0B639BB916883F02423A768547144D5B8856DD1693B72329A738664599B Out = 8EC652D3962EF9CF22A2B1849730EF08730F74A0EB86FD0C4EE9E7751B45F45FF6BD85167F9FFEDB8828F5D4F3D442A240180E1F296BCDE462CC4B7DE977C02CFD Key = D5781536A2EDA21FFE45B78B49F5293C Nonce = 60D2607E881FDBBBBB215CA56F9E1855 In = 16B82523B23A8C431B7315C307EF103CFE366E76D7F8A6464FE6C7E3BC78B9DDE6A2DA4D09D05D3DF2EC2CC71E2C5E2ADA89E2C4C263BDB24BFFE8300B0AB3CAB673 Out = 4A0E874F284057A72F55FE2FC5733F2A81E8DA3C35BA2B2758BB4376D8B88FB7203932F4F664B0EB848A182AF957AFF953AE69A59480B40D13CF457ECFE4F4BEE41B Key = 3ED48E0EED488B5D3F3B4D7A6C36679F Nonce = 659ECD5DC78B7435CBCB12B50836D477 In = 83AA1A09444886437356E2833AFA415AA29EA1C16E8FEC269DBD7E502B1D4C0924A42E357F8896C2D5FAE8389A369CB365F771F14229A506A5056EF2CA9381C808316C Out = 5A16F9A3E1E29371E72B3A96EF2BDBE312CC353AA464C88789D9DAFE2C5024A1EE2E39FD450C62DD85E48566D3771ADDE03222178705D7128A6A4912A8AB1349DC226C Key = 0FFC4C7E8EDC3704A564CF4848BA0ADD Nonce = A0B0AADCB21B64CE81E6FA519D9071B8 In = 86AB436404A846C845BBC3261E367E43B71C1CBFBE83A1E678259BECCF7E78785E2D473402FAB1DEB3781910B24FA07966634B8CDD3C8EACE0E0503196211001F31B9738 Out = 77E4424C70A4AA48521D003A917803CD0FBC72FB7E4E3F61D6618A84EE7436DBBE3B103BF55B367990FC1607CA89E07E694D0E7E4237D0748E9370BBC6C99D2A72024534 Key = 648A228F34AED9F09440653A56299825 Nonce = DC35F21F735FF7890B771720B46266C1 In = 95B0C1A5D1D183C95ED5B77A473657CDAD06374613F94B2731157947E2008AF6A0A343442A69FEF44EC1C3A9A526C1B850E3196E67966D8CA2467D2D8C8743B74EE755E1DC Out = F8D5B408682F43946CB95B071F24AEC63E94C74F7812299C2CC7F63A6C9C32186FFCE730D98020748639BE446870BFE848AD881D02B8213A6287ADC00F430E5F590B6F6F8A Key = C8473A5A85EC5D7D67B0DAE1BAF55F0F Nonce = 7FC23300A2B3F939AA57ADAD11EA06C1 In = A65E02A60F709E2CB021CDA6BC4D3F580138DD86FC32014E3671D4B917077BC7E81BD7D9BD4C61DC5791AEEA8CB37D18C0E2CAB4555C2C797120BE459F050F641DD876666D67 Out = 05798DAA3D2815D7A6C84ED8CE2DB04E183B9072E7472176BC23D6D0F55A938A8C1700C4838CABBC842D5313D389301C23E6B76D62A2A7BB6A605ABBB5A504582A1373A690AB Key = F4FBF67893DF61037133787730E27576 Nonce = 11684438979AE34D371EBAAFA7E28C4F In = 4A2357AAA2042E7EF941158FBAD441083CBDED6F0361246B2A1C28751B657FDEC5BD1A197A0E5F90AC47C84218673BC6CAF33A78E2E499E0FC5B7A08A300FC76BE7FF78F045513 Out = C8659F0DCF964501606EAC3C3F91D17D0F6B8E6076E6C85CC8BB3D0410553E1A261C4A4ECC6C19DF80EFED89999E67035AC997CCC837A2B19DC9AA514E7EA9F150A9A22BF029AC Key = 18B9EA7CD25DFDDFB21FCB5EBBCA965B Nonce = 58E6A7597E2725CE4151C2601432B094 In = FCEAB567A1DB78D58043E922B56DCF529FBEC49ECFB44D4E90ED9B5352F1BE956B894C438202F32DB57D0066B2E2732D495B7B77B60BC3EADB3B8D22CB71861F00710DA68D8CDB68 Out = 96FA555FFD8542AC2185C67F6C2B1DE9D037F570716CEBB9AB31258637D9B066AF2D2A46D0BC0F4F8DE7DBAA79E1D7771512B7CC788740FF68E5FA26A168DF2374D8602D525AC547 Key = AB1242B47A230D3CA9AA74A65AD314D3 Nonce = 2DB97AE77EF56836261C2B2857B37C4F In = 9DD176CC9D27F2B8EEDB272E2C87FF9C7944CFA57BD12A9E1E7A4DADF9F256F8BC33E959487CCE2CA07E04DD29A1642F0B8B7E16DE15E45EB0C5CCE6879624838E43EC6BD4A1F68AED Out = 660549FFBC7351074ED0433212D7B57A8D4076DD137D83280DEE8DD50DD7242DA3266ADBD2027CA03553F137EBD437083C86AE3D88136D190AD25431EFCF94DE0E38406C9B592A3E5D Key = 0F6E2F2743E2459AB610AA4905D3FB13 Nonce = 044478F8EBABBCBA92283C03729CA544 In = 484971404DD0EE0EEFF12365C8960632134926A1C625BF847EA6AA61568F99614AEC5C688ACC889BA25BD0BE6D39230A422A997E6C861EFDD2724B307A9FFDB22AF4401ADA3AE4C269C2 Out = 452D66F14FF4092DBE60FDDFC469CB7807A4BBF727EFE47F9DD3898B0FDF1D229F5864C7F22C60DB40DD6F6E4C6E726A949CBB297E251F9687B089AEB1EFD472936FFD8B6890062FDF1E Key = 5188AA01382907A2F6A586FBC29EBBEE Nonce = 446D533F257AB6335457D53772391AC6 In = 9ECFAB84D359E87B8E46D6F0CFC6BB06EF2F8AA27D66864E36D2840D3606624ABA8BB13E53C55371CE7D4BCB1BA5F012273E131F79CA0DC72D89222AB0A32A6133FDE7740BAE09BB1E08E4 Out = CA9C5F1C3C49D22C03847418907DB46363A6B2BCF6AAE9D982B502B0CB8E02CFDA5C2AC9B0BEC8E4162993C2DEE53B48458359AA7BFC2D8827D8B9822788041932037A7DE2C6CAB4CC0762 Key = 447CB21EAF8051964EE8781F901A8733 Nonce = 36F18B4676A549C0DE722B2659BA5A8C In = 6878D201901DE244EC5CF495D04794918C150CB6F5C0D953E5B4F8B9622389D7F2AA3317CDDC5571E0F7974A6B2415B7547FEDD7316747B949A224F0C7BFB46CDD14BB7A332CED6C8813F668 Out = 9EFB38AAF7FA4F5E249E128D3F17593537C39E317B766F256836E9F7E3A17FCCC1409F1C5CFDA928E74969848DC43FB4E941FF5554F06C50185A1182617CDBE243E9CE7D9E7DC3597EEB91AF Key = B77551B5360452D628085B62AD73F5A6 Nonce = 1D682D5795A81A894190FBA6B24C0F1F In = 23CA3DEA8D4D6E4F568BBE6EA90640EF95FC7429E2A4466FC30BD0D9BEEB83D9B35014DF8E7ADBD38ECC65B46E6CA23D89664CF28258D73BCFDD3227FD428EA6FA5B11F03FF154BE1598DBE70C Out = ABC4F45E59A9071E2EAA2A58049B2579CA0595090139F08F66C27703F8B8332762862924395D9D345360D082634FF4B5404B296509216E8E276BD81BBF180F8E9FDFA80F43C7F285782EEEED1D Key = 773FAFD175509B681A7AF4617A6F432F Nonce = 8550EC205F5C64480E294FE0C60D73E2 In = 83C71BAD6F39E2A0CB7D925A2933D195FF186ADB4ED7CFBB9A0E4BA50ADC8250EED58A02B37831DDE8D67C765535448FE1CACE1B63B352DE87BC9E10EA1911BDA66C62FE3671AF87C6F3ACD24A3C Out = 90BEC207BDC7180A465F153A622EFA99BA31B01F4DF1AA9D3E8B2B85DDF4DEFED5991E29E45854CFECE24FEE5FC08353D4C25C56E19AE2FD2CB97CE01CF39D905315BE033828B4BF30AEF84B8968 Key = 11074EEE43942BAB676A6A54C0F680D7 Nonce = B5F1FD9945A0693DF1372682FBEA929E In = 27EB2A8D1DC6DEF8142C2E35324F19BA17DB1B24F7C94836DE9E7508AB3AC9B837DEEED54723232B7ADEC3AB27534E1B726AA7A47C182003FD09991B5EEC8CF101BDE534BB8B486E1D74612D7D1568 Out = 281B411FA4702FEA5930AA30F14C6CFAAD7CC47B84334C03D063CDF52D8339CF12EAD9632AA3218476A953933FA4D1287FB0DE5CABB0EC8AE298DD0FEC1844D0CEC638A1D167C7BA24619053F26D9F Key = DDF28D5F03B45367C97AA207D351C92A Nonce = 53666B1F1E067310CDB1D4B22B419C50 In = A020AF13D35857A95FC8745EFA6DB000F6627A41E3B2429AC57B3A862828BCBB22152F68530FD7FD7E2889C2AE6B4B203AB136E81126DEBDB673F1E8FDDFA1BF53CFC7E2B8E00107BBA47E525D36D990 Out = E91AB36A19C2050F7AAB135988AA74F36CD5252EC92CC7F5E66E76279386FDBD131A09BD655E5C788C9142A3418EB40C15A29F8262406E4BA790D364907821EC7D77281F6F2B99E69692AF8D0BC229E2 Key = 83E81608A49F2F4CD6D4CE9E38F8F9E7 Nonce = 02279A85D49830F8A904CD9484A87C54 In = DF2FFF4CD40DD8B4A6563C086F29A800C5D56517B28EDBE26BDB95EF2E51E40EEC70B6EC5132830B8F64DEF59D8974597351F9124B6FBEECC054E76472A3D8D41DFB6C5CDEAF4F8F655818AB707AA711EE Out = 102FC701D542EC9BC687BE8DADBB953C2F328B009A4624BCFA17212387A13481205A6C7F55CC81FBF97EE5A595597E4E6ED3903C4D91B4142B73B0B15030470C6936FCFFCB15DA3C26CF8207659505D054 Key = 8E1F0454359FEBC2471FF02259561758 Nonce = AC18B91487815D98AB996E940EAF2287 In = F17144E09A92D6390CE9BEB91CAA4ED3E5D1FCC65630FC7FFD7CC70476E97F83430EAEA112D52912DBE6CB77F774AB551EA321D755C4A62A7BE4FDA10BB0E89F60C882A239ED2AEF199B3C8F48FB10013019 Out = ACE1B6EFDA7EE7407DFCDBE573B954B7ED7E8645DAAFBB25246E15446D2E4CA3A3A2EDC39E66636E763153D8BF37F9D3DE907FC9D98C3ECC9782E8B510216CC414C4F4D28395821A35C4845A850382DECF86 Key = 5AC6369174587D48E1AE1B7744F46C97 Nonce = 1DE42C0FBCCD3D87301E750B0066E847 In = 1CFF90AB8BCF241A734AF795E3DD1FB0F63C196F423AFDB2FC3342F416C00D61208AF7CF38F4C821B29F07E6A55DB219E8BC04C325765C47D87C281189ECF54982F752CE7ED382D194B08D03B4A7534F916129 Out = DF5FB08A8AE10DC102D61877CC48DAA16843EA8CD807564AF2B6F4F82B4C3350F318FC2A04D88E805098C71C63E0937CC8DBF7701A48A37E32A67E33304C22866743B83B1730BDBE219B93B695A24C6D18115B Key = D73F74BB2331CC59766404A7FD68FC12 Nonce = C912AA5C9C69FE793F9B0D13E79A491F In = 9CA6CD595F4C8A21F6D5947A0DE2B61C76E422D6C677965BD2C5559A11E0063B4F93E09EDCB777D6B3EC51B379C5437BC88AF8EAB8E72F8504952B743D2215B33C1C98A1BB16B07CF3C1893ECB3C6F440B75E1CE Out = 6EA26BE272B9D9A53DE12B89F9EEFD6425FB9AEAA2642201B1545F6C3D97B0ECB4BB6C37828AC99C9EE23AEA72DB4C8FBA438AF542EB262673BDA1E0D16BC9334CE74FE1DE6B851C9C21EC245020F1AE124D58F3 Key = 02CAB723734573136AA95AD75F64BB54 Nonce = 5C9CACC35FE500E156BA2CE520CDB23B In = C0F380619D41DE3D3C0FC84C606DA8BE129644EED457395E263A3D56A9A109DABE2F925D4ACACF2176E8762C4ACAEBA27123C074DA90B1F71D6E30B283265B327B0C2DBD94EC65A70FDE2953B5E25AA9AC0DE428CB Out = 7DD11E74A9568DC2B22267E13AC51F15EFFBD02F64DE4388AB2EFEF3ECC7282D930F52336E7A6283CA638CA4CD98708295997576AE4E4BEC3495CA57F2FF7B0710B629E9F67FFCB91C99F7162F250956D469D41B48 Key = 4DE074EEBA050628135F6E0BB6153455 Nonce = 7DCE705726988AC486109D330CB4841B In = 01513EE1D2E470ADCE8BE57112727AAEF1480C38D92E68FA99D568FF4979EC51A3A63E21921933642002B99F41E590CBCF257B735AB586E3F2CFADCCA522946CA1CED4EA49D07F5C70965AECE0A7678FF56DD9CAE320 Out = 2FE8BF3C296F7E36517DF326103D7BBCFC7AA093B6034373E6571E1CB2AA808FE0166EBC122458CE819ABCC6DA5BA4E6AFFE98F9C4DE2F7BE01225A265E57621681F0CE8683DD642924F54734D510A660ADB7382E438 Key = 529AE17D04AF5F81DF48B7BFEA78CF25 Nonce = D689379FE4A642D0A6E988BBC0B0A74B In = 158604D8D8A4508C2CACA26910C43941A7737304EF901B34ABEC9BCA8F7395A86B6395BC8B60FD952A12F4321A0C556280B7EB192673B758ECEFD4ACF1EDD7385705E97B661B24CBDA98777737FC1939A7DD84DFA810FE Out = A7C9B667DC31C97D5095776AC3967E9F3B2912C7E596FF507F2D10FBA8881C5D6FC1F17643E83600CA5CF78B28E3104C4A97A3B3AD9ED537DE2AF85737572438C200FD3D8E06644CA347618B85243FECAC8B062F9CDAFF Key = F02044299833E58B08F0DF2E7CFB1559 Nonce = 4B88F3384E330930637851DAA0FCBD6E In = D93C5846F4647B17032AB3548D81116644B093B5B19E4E2AFC49198268DF9750716F537D9BFDC9B466909C496FE259134F8950E2994336A3EA2D3B41226FEE6C05A279B12D23370EFC7B09D6313CCA54D5940C828D066889 Out = 527CB7BC14045AAEC07C679D842DE0F7DBEFDB86FC6DF79888032A872C91D12CE8778F2F7A0AC7D2FFB3A6370398ECE9E532AB4550F269D0CBCDC116CA6C60B8B2A161D34AFDB049A32665A90541BC97051B6C73E2264712 Key = 5DE936BAB4C06AF24B4083D42006B6F1 Nonce = B355BA45A1690385C48B557E22DAAF37 In = BFC943E6F9FC3E8967A860BB09AD85EF183000779B202B5E5DE738F010D327683154F5C03E8BD2FB9B26C9385463B2B198F160DE25E7D6BEE423E4836524C63687A31BFE042759C3BC94D3D2CB8219DE07C9444541D148CF24 Out = 9DE102B2350C51B27B9A209001ABA87F74DA02B3EC7888EFD095D350B1670240CCC2868B8DE8F75AC21DAF34A82BF8FBB585C8087F9309C30EE7FE1516BB8DE4D93EFA938382AA834ABFF1069EAB633EA817890BE0340C7471 Key = BBF991E78408A06E251F1C3A5CE70D52 Nonce = 9BD49245886221FBF69C849460E29BB9 In = D1592D0C67A705130543605408D6F919FC30A2BEF6D4D0CDAE5A7CA1AEBCEB4AEDF779C9DC7F36E1742CDB993A8FE10C3DD02878F9B906EDECABB5B6ECA1CBF313B31B0A24C075626027E113A27D9A8D2AA466FFFBCCF0A69ABB Out = D2F41E4F5FCBA0CBA4B116BEE8A18E07610AA1CCA0309E9FBF35ADBD2842AC717F996C569697F73BBBBC852622781D2F9D0A06F59070019109FACA505C91E70B8C592020364C8DF7464C1F5170A0640D3910F74BDFB22BF10FF1 Key = 270DE1437695766D234EC8AA7550955E Nonce = EC6DBCF2BF725BB446A026DECDBC3536 In = 1C1B4F2F4297E12CBCBA6309AF806D4484683299500447C0C7E89910679DDCD2D4BF27F759A9D8E8D6FC5C3B358A510F69F4BE2A460DA4183985D426E1E5D171D5AC363330FF4C42E893F20D9BE08CBA3FEF9E4EB56260B866FED1 Out = 1DFD895B9E4C944D6965517F115729D6C6CBA48F1FA75B63CA669705FDB31EE7D73973988F5B73CEED023AA6398AF1C01ED3CD9FCF9BE04AD675E3D49A50F9FC386533C12F89BF5CC0C8800A2F769D2BFC01FE0E4D7BFBDB254FC4 Key = 65B0D4643037333894C2567F1200651A Nonce = 5CDFB2A7DCC2E1903BFDEC88954BD0E2 In = 96E90DF1B05F9FCEBC85566B90AA6B54CB45B20F86A2FF093E09014109D01D82BDDE0FC837D2BDFE461E8C280C517B1E9C4899D19E35939919FB29DCBDDF98CC59C29298399A9E3B75DD0AD13061D785136112251DC93DC6458E354D Out = F02AE9B596A60B1B55A0A1AED885AA41CCAC58A620ACFE54F222592C4F9FF9E638A6F8E57276420EB14104940F128DF0DCE8998427A1FEB6D0077D92061CA9BDAB42554329C8D44597A346CAFDF19DD6EF1E271CB444E1594EEFF448 Key = 37C4175403C4A0CE66F44A0D89398150 Nonce = 2B447659DF9022B1EF5EC995B4EED6C4 In = F41F334F73D002068F64A43533BAEA6A0AB6703D68AF6D85621AE7993CCF08F7637E047C0B9E8F679B7228AAC16ECE23B3019F80900100AD079E5F9FE571C5249C3CF9B8BA13C7566F0EFD29AF4F4827C1676D2E895C8C743DC9B48E33 Out = FF27467D014B193A4A435A0851A6F70C27BA92ED82A2E4ED18152EF20FD5E7DB1EFA494ECB64588B29FFF34827A49EE511C29A93B68CA661732C286AFDB087271421D4F4AA8D0BC9E71C59E4CE6169227435BC2652EAB29F3A63F1E9BE Key = 30E5E7F3199B6F4B9B4799D0FF8DA9B8 Nonce = 8443B0454B241D603E3A4CAC72D562CF In = 0A17E8BC90EC5C507694C084AD918F6B42EBCBB0FA695794CB8A41A3B8F9F4CE3ABC272B3B1F2E46F55A89E13A99A4509FB68EE322AA95ABDA5DD65519056210FC327BCE11E8A772998ECEEAAE0718D5677746FF68E4E24E890C775AD3F5 Out = 176F5728351F63009F37BDFF6D7B305E77CBFBD621140530BC4B9CFC65EB776113BFA8FC6282979907E78E0A14D2C7F97359B3648F841C98EEC4DDD0F15BA1D3057A0EBE0212EA54D3F41ADCBF5315EE23926870408FCBDB0D47292A1F01 Key = 711E9F19B40F63409045565634E94FEF Nonce = 00D36E6FB099D38C94DF4CE767A26DB9 In = 1F322F9D6F5CF8D38AB21E1B655261316C1CA0BBA2236F9F2FF5550998B0CC0A376826CF6142E3D1165B3949D172A098C6ACF50468BE1E498FE020CCE0B37C5FDD32233CDB4DCC5BA2A70AAF1F27683B1DE6A210DF857AE6DBEAA5477320E1 Out = D3930D3B1915CD157DECA33D14B79F62D0BEC44F51A669E07F2899CC21A849D76011453BD064189415B726D9AF12C8F50CB887AB6714FBC71CF83E3953BF52C37FEBEB48D14C62B1A64F04F987BFC6F311BBC27C79F4520C2C710B69047BCE Key = 8D2FC9D115F014FB6F61AEA91DA55153 Nonce = 0E0E45107F52F186FC2F38B35565B8D2 In = C830A4AA5EDD5AC64121F0D47441884D2E9CDEFA5F7138B4B8505DF55185170A80164F8B1BF583A0EEBAA52ACA5BAA81471CAF81FF79E234FB5DD5066F8E1DDEFCBEA047B9B02C80DA480FCC5B67378AA3554DDA138256696A875FEDDBB233F0 Out = 35A8F3F1C7333DD3F1713680B1ADBB4268FF3DF157C7E1A83DFEC1C224723FDC864559B9436CCF36A6F930AAA7BA03CEF94C2A01ACC587E3CBB334779833ADBC22B873E71506207A4A1320FE881C0B5F6EC5B384B7C50E88FB8100AFE85C0E0F Key = 6F7035148AA370DE95DF32625C61DF1E Nonce = 89D60899E5C54E72C9E86AFC88E283C1 In = 08155837372A1F8587F31553D0CC20BFF1B499D0EA035FD3809CC14F6BF2A5D9565A734831A2EFCF4EA5939FC74BB76A0C8822958C8FC73E77D4C856339E579022EE3AE26E737A8E9C6E3A9481796EAC61035BD97AD45EC7CE746AA0D587369ED2 Out = E9B72DEAFD9DF0839B94F32937C8F4571F83C648EA7E26193A264A75734DE940006D9CB5F10E2647E5253D234898021118578CFD50F7D9A32E59C48A98859D057CFFB16F9C345002A0C577E875A561A15C78983771D75A7DF7286B8924EBA24E59 Key = 7CB41B5675945EDADD9065E47EB1A2D8 Nonce = 883FECB5355C16D075A7DE014BA9A05A In = 652D41B854C0D18458B8C583D5122DA3AC6B278ED180E9A98A2CBBD23854DB32DBCF4377E44F339DD6571AE16693D9E5AD9834D38836A71002C40BF320C28EBDC5824F6701EF35996C8D6C6F843C585C83A42C5F775073AC065AA1FBD61F7F18D68F Out = 3C56B8394BDDFF0471148D0A9CD7B0F6B179EC21B829EA808D6E55450CA688E8EDEE29B1AC3AEAC76B0C3A2D8604F09FF3E777085B522925CAE621DA0E66CD8063440838FF3FDDDF09A64F3ABA5CB43B88FEEF6572C053076BAEF92454729C087AD2 Key = 21C9044F7F1F71AA0FB698E80120DE7B Nonce = FDABFE4911247EFA953293DD7FE6D5DF In = 3756825A44E0C3D7E90C0F4EBFCB2FA4561EAA12C693E7FD8707AD206133D0BDEEDA0BA65EF58030546076FC9904214E65CD9DF37DDAD962626868A3B32AB476BB694534D37A77953D6F1109515C5B5FC239C88FCEE22BACF54C44E03E9E3784CD9099 Out = FF9FC9F00DF578810D3D9F7D50B881B2578E9D7EE8328A3F8C702F9298800621DCE4CDC2E55E2B75B0574A57A9296400F811FA6E899CB8214583B969C9D5CB03EA966FDF32A2F1FCA8B0B64BE84C18CB4A7F7BD8DDEC03953E744520D95A6D65FC735D Key = E06085A98E76F04B2B78476A4FEFA542 Nonce = 9A619CF8924C6DCF2CBA067A34B3A761 In = FCD4675A023315724B2BB939E6E1A62E403B90C9DD267DD6C2E4B39DFD1711174B9D13004827B08A65193BC21A9A6C0AAE8C2527ACE9C62AF6810ECAD8671403CFAAF86BBD72E3BBB1875D9254D04A8209AE9E800E41A7BA5514F9913E94CD8469A7B6F7 Out = 5C7AEC623C486C256635814A95F07235A4D6932FC23CB54CD0A6C76ABD58DED9EC90B9802B7D4366ED11E7AEDE696D3A47B716312DB0577662C1B8B8F8523EAD62FFCA8F3C6D15CE2280B7DC8144782D9CDA5D609F871051C79FAAF9006F686B068E9B97 Key = BB11666DCE893166774A99EB9F4E4A55 Nonce = 103399E7EA5A24A0CA60FF24DC08B391 In = 9483B567F791C819D9F4F607AB82E0E2F75DC02BFFF7836563B1F89CF0F3C859AD93852485A76A5D51260376C7877E2A875BE3C6528D339C6BE1597688805022AF963A47A188112C714CBEC0435AE99B9441CB7D5D3B3048CF9C3CFB91C7D2483C3CBABE75 Out = 3FF3298943869CAD3CE99857B849455232AF6A0420985364BED603D012F1AB29DAE327C27FB107FF25E061A60933772EE5F9FAB717378E739ACB6D2F09FD8A3D1B02C2359E0AA8C07593367BFF1C5FB70C20BA8742D4EBA2A9D12678FE08CB758F17428DCC Key = 1A7031DBAD6A06FDFC79B25C77E9EB9A Nonce = 64D45D74ADDB71224104B3A4188916AC In = 00080A114314369DF72FD1339E2A83F2427DF458221236C416ED129563D07E711BB378FFBA1787809C8AA09B031D23033EA418E0BFD8E694B0904C73B964D73F975462D3264C3F8E09182F732E8E14A2FFE3F50E5A6F81BDF6D49D8579AACD9852E699C23502 Out = 04B30B016A92070ED18565327AF7CB82C4940B3289B28BA4A1208357B8DB6F79930E885E05F617C5C152D619950C1B986CCCDFEB7F9BE26C41F2142DD05C25C3B92857B87FD7944611AC6ECFFB66011CC313C2BC96581D7624931D061ADA6FAF4EA4B72D2E73 Key = B2414750A8AE2768688F7C82B6DB8C63 Nonce = 04B8131DF59B53A0BA806FBD07EEF083 In = D5576F37BDE9BC6FB4BEF8F83BF565C8E710F05D9F2FE47E4266EB23875C54EF63C5937A506B7BC3FF6ECA77D953EC905A2F3A84B36CAC6572BF8564D0D33C1FF3BDC96F374AA75C7262F49338AFA81A6E6415FE60E4E61F3994CDD19589BF389CE4BA169B99FC Out = BB5653A4C90F6BADB14DE8D41C55648BCFFD7017F8CE43CF7D78A4FEF9DE625B0B9EDAA83C901C5079E7A3E2353E9679032A029CE34C5DCA41D917659E2D46AF062728E7D170FD743C1E52851CB00AA95ADBC2216C109523B605041C1C22095916EF8ABAB9C471 Key = BB7CF3E17CDE92291B4F5B97D5091ACF Nonce = B5D12B6A1B4AC6904FC2C77DF2A76772 In = 47621B4D2805AEE6DEF034678EEACB4D6C4395B39D8ADD4A60A9165E2CA7B3880404B40AF1B1E9083AF8FA1D69CE83BC9530B67D2BCDFE9E36D1FF05D6FB621349FAF662C55F62727C447B35AB2336FE86ED7C4F3EA6880352EC6826B5E61BD72478941454973E3D Out = 95AE682E1A4A92FB00D8855C22E3763064BD8A771EB2AE675E0C676117AA425BB885C63E7FFEE58402170FFEA5FAC4B5EAFB53AFF6998804C6F99AB09821F8D42F8B7EC788F0E10CDA6714788DF679976F928349FD8E8F14548C1FF4FE9025C3547E486B0ABCC410 Key = 2F5B82638FAB8E485826C4B65992577A Nonce = 5BD1063BED52DDA5D04D0F85486763EF In = 358B57B91E90956DD981B9AD2F570908502F1FBEF230A350B324316FC52E1BC6E69A2CCF39990AAF1FCD59BC7B712CD1321F7F9915CE1A46D0A1CE9E3F500BB0D0F1B9DB3E1EAA8CB532489AEF8FF6FA4F6970D7BC8045E0BC9F304E257145EA7A5828902FFA9A6B89 Out = 70607CBE0266AC893D82198992E0EB8687B6787350E8797A96B16FBD8444A092058810420DD51854E87E532BD45402682C9FA77ED1499CE07D6DAFCD5C15D056000052E3D9403FDEAFC91C479AD9DFA313DE0C9AA3700664D32190348B29F9FDB5BFBAF249F10FF0B7 Key = 8F4FCEC73EFFE3DB1DAA37494D1229E0 Nonce = 82FB062F71C5984EE7A80643BDE0659D In = B713EA5878BA973DB81463CBC2DCCEAB876AC10EF2BEF98F141428A933DC6968BC657F53AB286B28FF6E141F6DEDA0D0E708B20F17BFBFCC0D994B443A853A292C94A254A8055B713122AA27D079CD6741BF813DBD9471A8981E433F824311C0295225FB9553A4038254 Out = 4A8D9EA5DF1462E152F8DE358A92B7283723D49565CDACB3DB050E4C93C152C14063265DDFB76D46FF2319309169C2086A31D521BAE0B9B3CA670E1C2C033F3156BB9350B0BE208A7D41101A0B063F71771E2AE2A0A5984DB5341C76A5091CAAA536AE7CE4695FD37B99 Key = 7E3D876FBE4849C64A2E6FBD6935B8B3 Nonce = 8699121F1CDCEEAFC4ADD47DD4822507 In = BD2C3B366C5480ABA112A5481AABC79A024ADD95F6FDED50B328EADC4109F669103636F1C6DD7F1D57E307535F4FF3DC963C96A8DDCF51470FF02AB21FFE910008A8DF16EB2373DE599189DFF12CDC348D67A6F33357E86DFA5F813877FC167974AE1E835469497A682D68 Out = 11CEE8C48CF3398082D0820F8FD1B200FF0D0BF29E8EA12F845EF999C1B4E9B0938CE474755921C86DFF4658C29615F0A2D64179AF384FDEDB103B3B642D3FF799E24394BE70C9BBFFFC56194FE861B124C9A605629ECADA990CB736513C28435D1935E3145A3CC4BA754B Key = 4856224AF0495A558349E5A8A13EB199 Nonce = 7E9E8FBF19BA323CB2B8060E79FB526D In = 3E4A39011E58A44C9ABE3368A899426D034DB05E097060C01C63F0DE3149D0D169B9F185B7C38506AC7976E6E182DF704844F1DB5736821543E978B9299614D0E3027B7D39B4FD4034E3562D71C685FBAFDDC16D0A6C4DD1A5B3DE255ADD980BC2CA50B117CC6561CE792AD8 Out = D5445539FA5E9045304A7FB13ABFE5E535AA8BD830AE8FA0A8787FD0497A995A9E42A622B2D9C00CBD66E48A74C4C32CB4862FBCB38BEA626DCF65408D7CFBC82527DD709AE68908D14A9F0AAE118A7A90A94BF970F6E4375E42C377609C04C9D86F5F18109A8B21B22BEBF0 Key = 1D8F327BF9485ECF42100325FCA85813 Nonce = 28C5C1D3FAAF5703E95EE78096C53022 In = 0178CC505660EE73D385D55A680C13F66811CADDACB97C303D90FB9AA735B91E025A5871125B1F8F728A1A4CE1ABF2B68A1DD66F72E9CB6A28B7BF13190EE5C88D68FCDD44FFBE340935B0F32AE0E3071554B94F7CC069AE0C1E465B7FEFB64304B84B4548A2B6BEB219CA9C03 Out = C43FEF0049C62915C5E7966A2D51AF66A61AC78A7E7725D007E41808C3BF080671EB8710CE36C78905B4EF0A2C4F294F702AE24D2DBBDBDA8FBB7E3DBC1EA0B97A884AE62B008770A08C909552D48F076268B9C14F94EC1BA17D504A63BB7B68B7D2A7C0ED2AF76CCE495287BC Key = D84FEF97E5FF1A5CB866B8965AE205C1 Nonce = 56DD14E0C72D31557A35F16D93F36973 In = 7A8B2BF9414A0648449541D609CE1DE8D3E8060BF09F449BE3F98FC4D6CA7B41FB3DF2306B33BD700C767C99F934C78051BEFF6F21661F4C211A2AE7D8BC328C57953B39E1B424994B0EF865ED752A5094A4DA28DB42F1D492435E7D4FB92B4FE61D5034921D0371B0DA05E90A43 Out = 28261AAFE01C7FEEC442ADE2C7E298C09F7BE36D8883A3A81C8266523B8CDF1FA4C45B9C41E96FB53F8781EF4A91192342C473AE3E2B0D3C026803868D0978DA488EBBE8282CC07AE95E8042C863EC66A73482481450B9715E8279D5D4FEF7882F81913679FC022624BC9E800C9D Key = E274D29F8D942F2DEA0F2EB56EA4A65D Nonce = B060E8D64520B1F3FDD513421461DB88 In = 459F416851ACC54284A9E82CB878B82AA6C589A9EF96BDCF18F47663083F53A6FB5596F976ECC5BB49078C07E7F31E68AFB84F6BE1C157E93A4D0D86505881DEA2FCECFE477BA35FCDDA2CD2B9E85194A63FDB06DB8AB5CF6C25CA323C09D6F114BFEA93CE791FDB588A068D27BAEB Out = D7E8EFCB3081AC49002FDC9B899FACD2326AA7D13ED97360AF2859F86ABA346CC7A230E0889269DBAEE7E83BCDAAB0274CC84B4C3353EF0F75646C5ECED75AB7BBFF646376155DB30EAA1CE5E0AFC3BA38D0EED7FC9EDEC2418FB6BD00E8DB248C07B2AC8C92D5696D1B26456F67DE Key = 710DF4F3ED2C815B98B0D6100F79F9C6 Nonce = E79A134DBF61E5B7229C75C312F5C02D In = 2CC8CB49AF1488C956C3E065C6E4E14E40C0890BC5D0042E49F0B42E0FC543470D34C98A894FB31EBAEC18327888CDDDEBF3A6467DED49BDC7AB0EF1F3BE1DE7B6A7C0B63D94F818E21823E9AD75D4416C55848FBB6BE2A9F06190089E455B4CEC9B5E45AD86D93A31E4AA84508CF9B8 Out = 16C084E323E61E22443BB67DD8BC82A4F42DDD86A187242802F4E6EBA7381D7C9BAF5D439884B2B7231F93951AEF45E843EAE09AC7208D774B5F3798ADD4CE74A41508E0AC7D7DB8A6C47AF8BBC49C41B96DF51867BF4C650EB39DCFFC6AC7365952C585CFECA818C62BBBB2A653D426 Key = 6B1E9BCAAC6D93564DBE4EA67AF7FE82 Nonce = EB899146B055647A2A32798D45EB8DC7 In = 4CF8A7BD22E0EBEB7BA5D619A9964EDF83518B08A074597616385B8D48AF8A7C1F779E728229B69FDC5A8624F95C9B891FD27153E5CA3BDD40C7BE56D2A5FFBAE32CAF544B5BAE9A7A9669BBF1ECEFF913D037EF7DD016496C52199E3613314BD78084518A5661F42DFA7E87ADCE83C5DB Out = 6051562B133B0AA03D3CAD98E8696FBFC45BC457D7888DCC302EF3A6CEC34295FB6E96237B2168B8F7EC6566E49A28840D12A9B4A6429C57F2EF46A2B8F3EFBF79252D86D7AF9C600AD4E01728791F349DFCF97E6B0C487CF14EA8D79FD72A5488FCB6F728C5214BFA987B4A0521A22F22 Key = 641A4B7E4268220890E145488960C185 Nonce = 59432C9E1519A223838B180634B51521 In = 0C78FFF41C47BA8610D9EECE738A4451CA1AC3267D9F6268AF5E8EBE432E8252FA8E378E0C4F0A7000C93B415249C66719BA3435593F216937E7F7DC64EC3E26B38055822175D8D27979CF4AF86B3A61447E29BEE7EFFC249483FC29815B8A93791DE7A8E3182AAEC0A3ECC4C5945A203D5A Out = 56562246286CFB3BA6BD411A3009CC25BFA6CCDFBBA44BC90C1EE7B4FB07A5B366183C2B230844108CCEED0FABD01B15168F82AA9B8315422A5175D86DB2EB6F452837F2C9D4EA7956D6B254E4E4979F278518617A1985BE35B71F80B6CF5589F076689E022EEE974F496147F29FE5810CAE Key = D3BC0E0818C1D968378290A948DFAD06 Nonce = F9CFED1A6FD8B74DC354D25315A12869 In = 34B22337AC8C2D57B79208DF0CC4AD245FD02776876F0EBC5B3EF57A4E35BD522B8F8F3ED20F630F2C4C706845D1142FE636C69BBAF78E9A32C86F7ECECFF5BDAB8ED1C72CECF59E7120D6C1A1C91BADF25F7E2E710FE6A8C97EEEEFBC2E45B149DF05FD33C1D8B7A37F7A31CDC43A56409961 Out = 8D4133BAC7BC2644BCA4E525AB21D57036DFF7CF713C4A80B913E0E0DAAB1EDE268B7D2629CD5DA5E69DEC179C64666AF7944482D051A43E3008DEF5E1871A1DE6DEF3539AF563F42839F67AE0A36D1E18381C8D8A50E27E28998E3637BEF02B409AE040DF719AADBE213EBA57B179FC5BB0A9 Key = 45931A0BC3F330A3390A1285121CBA69 Nonce = DFA9D41C68B05242052C49B3F9476722 In = 6A70DF92C64A831F654DC3C347D12317441F012C3B34B62E3BFE9F4BC65F9EE77520B11A109D60CB5C97CC071504E900ACC32C85754CF17685C12178C40FF85A453293404AFADFBC4369EE134AA1EA6E417BFD290B2FFFC5B244CBFF10008644523D50962D7FA7779B818D20DF1032E0D08DBB36 Out = 938BAC00576D4C6A3AA073F1AB7E06FF98F57838F17F7FFEE2BA079DF12DB2AE79DB5225B274D943F90A1BBCF239755E2117AA9C7631AD60D93A03DC2D848E5BBD3CBAA245621B4E124AA1772BA423DD3D6B86478C8DE0EEA53B43728A299305E96A93FE337D06500DC4C19E96AD20DB495D2A01 Key = 2BE723871AF751A8F29FE427EB4AFCF6 Nonce = 9BD948CAEC0C63433EABC81058FC54D6 In = 1B46DC2A194A4EC1D6DECB3B4EEE8B9E815052293884070A0CE77818BDA476FF820CE494A8A620358E560E978BE89F6753FF625E7B9FAA2183E173FBE7B8EC09ED968733010412A31BE5155FFB5E1A31063CCE011425C2C0BFB6E7851BC6937F324F8B6CD7409C14DABDDDE9D90054B97D01A9D030 Out = 7C474EC6ADB6D2E9CC286690FDC89B3BBBB53DCCE2529FEE1E7385A73ED7812EC1D0C07558218889872793A7ACE8AA08C2AF2DA5CC529E588A26896E96F257F95779B797353B3784870FD49706C9F53C0D3F7698264B92E437435431AC793ACC740A68B2096FC4BC696AD35BC84BE379F08C2B75C1 Key = 3DC16EBE791AB24559F9B2F1F6C80D13 Nonce = EB15B43C7C1FA499E13972ABB38E5059 In = 9B09EC9C26135DD7E328C616BACFC1166CB0A6DE265DE3930EE2F6C2A2F17A6B9ECB4C695B1D6195903AAAE922EA99FA72F2FCDCB4A0CA4691904809E9835D2F87ED4B8485F2B1378A8D14710E0CB21223BF4A031996FFD9BB053597B124FE42D712369DF9E42662C4F353381B016FFB39117953231E Out = 93FFE4FA99138A95461489C915CFA41F0BD8E73DA1D02D6CD28B4516A1D151B1CEB905E4F4282A586A41F567D324D6D90E1814CF86E463CCBBBC20C7F4A951744CB375A621FECCC418FBA8DAC781A8E89E003B34E1C3D95313543318517C02F02544854305DB91B05CED444B02956E1ABD7A464CA158 Key = 62A399748E8768CFC4354749FE98E1AE Nonce = 9DE4950CA5BF39BA05EB3A5B867FCD59 In = 77D6EBCA61FC06C689515C26C8D13F7BAEF7539E63ECB3DED59B3A12A5277674507A94EAB4F7333159929EE79BC000CD474AC416159E0CCDBD77C4218398C7844A98B549BE8CBE06B7A3CFA269347DF9BBFF1C7E9346F6045548C922E1E5B96184A0F5384242C404EF31CD0ECA6B5A0D3D1B825959F87D Out = 76AD0A59D48C62648DAA6AFE551A76D734EB420CAE0ED368EFB29ED715ECDF9BA06BB58AC17986CF78307D12C8477F7FCBE77D47D14700F998561F8045C4CF53C98B048E21C773AA68AA6DF4571C64084DE4D96CE838C103643C077E1CB35EFA664820F478F4844312FACEB4FC014E4B8404B8BC8C3540 Key = 00D7603484E89AA807CCDCCAA7FCEEFB Nonce = B20E59D1782A9B2D156E82083F5F0AE9 In = 8973F0C9A1AB4E76CC645D59DD60877081349151C5F39705D432C6AA3AC1AF565AF923F6CF1635919F59F28F18754462D0A63E909AF3901D0D4643CC627A3D750A737035A1C43E58BF43E90BF44F7B766CDAFC1001962DF30B54462DC1156A4BA34FE80EC38AF8EE0715A01F2835907D2C2341FB624909E8 Out = D88924E63979C8990E1508D198C019573250A3FEF243ECF82B5C6F3D5977CE6938A688C63F7D44890B1AFF1F0D82C78C21B2F2660E612093E161C5CFA9D02B0F13C3689AFE54CB930370A24E8EC7AD90C3AABA0278CA36A14E938929117CBCE8ABB102ABF2CA46E7413D4DC265AE42FE513954CE88C330C7 Key = 2BC487B3F0B5849461A34EC826530DDC Nonce = A626101B94FB228B40D9BFE968B93283 In = 6E617AFED34D6D72176C41071C562D462ABC10C698A3D30D7CCE1702669670C9EF485FB7239DB3BF58B0CCEFF683BB57EA7C717B007D19358517E78DA5BB9B83B336441F99367523E3824B842A6F58D8E4525D8A04BC011DBACF413F8B2FDE1B2E69B59289ACCB6F67E8C74222FB8EAB8396DB82142C9C227C Out = 0D63C50EE0DF01B0D6757489B6124D16779A7756EF292C0D1527B9B12A9C1EDDF14CF75B9AFE7AFFE082916D44FF3D7FD5950597A3D3507D9C25240DF09594391ABF42D4B9F126F9CE7C5022724196878C7FB7D845D28BFB7E2B8063D9BF1CDB06632FAF53B05CEDF1BFBBF7FD9A900893C1A1BB80CBB13B80 Key = 24EC777AD83D32FD0B3E273CBDC3D06C Nonce = 0A864DCAADFBCB0B21681045573805A6 In = 8057464E6C7CA4832841C68AA8DAD0820D9B6F914B58152DF50D17DC0573EDB2143EBECC208E15F85040624B1AC941A5739E36508964FB23DD6BBE4A869ACBA1660E545794024D8CF79F2F7F47F7AD27132EBD9BD45DF4F0B4CB2E892F3B8F3A5A6A4443825B19D2BBE1ABFF243050338A8E6A94E7299779C04B Out = 2152EBD90B8D0A132CB4A0FEAE79D17C415C64EF95C08D178B6D106860A1806ABB36ABA214ABDD07EE9D188C6EC64281008739C5ABE99341BEAE5F3BE8947EAD04CF713DBFC3E808EA1A25721298083736851F618541FD740F5037977157B751C2C665AAB37B53EF2133416000861164309944FD2C7BAF01E0DA Key = 4C5C40C1DE409372518E3D2486181C44 Nonce = 989F5547C5F79F05B04E40353DB89A76 In = 9A1964D4FA2038D123902B51A09FA1A5EAA84B5F6A1F622E78F799D487EA90BF44C6D591C5F1785628A98045DB7E5750C6782AF367186431B07C8782C1D5D5D6E09455079DD6DD1F7B0AE3BD3634EFF698A19A6D86D91143179A7B350A956DE1B44946BA9E111BD690DBB0277DBC2C79F5627E491C4BFBA09A7E91 Out = B13D67461B776D04C361BB32202C29F576A082BD63A58D4A059CCDA610546D3287992D6D62B72DDE8FD2C828C8CF40D4C8E83FDC28457510F90C3379A394797CD9375F139042116573728BD54F7A42B312813D656DDA88245318F957D4A560E45B395DECA5FAD456BBDD6EA37CD9AC21A87377D2FE18DDC19FC83F Key = F156CFAA28C87F157DC989170929E8A2 Nonce = 94A82BC348B0AFACD194C3423AA8875D In = 70A6A74CC6C98DEA90BD6D18D8BBAFED2CB45F757184DACA942B1EB2728BAF94A245CF5A3F27FC8CABB9564BF803EA75DE2B62DDF361454823ED68B691A1C4C86A0361543B950FA9D67FF767C1DC20E384B7FEB48518D0B251553520E39A05B950A7BB2B44B7B8737AEFEC2A875FDA8B901E130B3947B65CF9736103 Out = 1254535BAE8A3CEEB81C5AA04851A3AD15CAEB906ADBAFC93F05436619C037C59ECC67B1B4419733B9D5BA4323225B4BE11CB0347BB750E1B40603E23FD067363C616ADBAE85C1526FE2C8F11AFED5CECAB321CF97EB314B999AB118F098E2AE1F89E56F13FB501E77C02DA692E49C8BBEAA1AA9EE97E7551756C2F0 Key = 4E36103C8C67DE1AFBF8109D10BF10B1 Nonce = 41EB43240037C71DD6D6B2CCA3261338 In = F5AD5AFB27665589C9F524176716C60BCFF9E3E41FC9F6C5E8B83C5485F956C9BA7BFD0D8742F6F391D75178E6B560C0BB32AD3701998697C23EBDF74CE4876C9B1C89E43736653D6A0AC442B143DEED7F2C5E84DD4874E1854E676CAC32F0FFE5C0057F83DEA1BFF2044D5FBD4768D809A61FCFAF4A654AE21D233BF8 Out = FD66135ED18956B6F07BCE45BD57F0FD1DE39935B8CEEE781988DFEED303D189CD49725F10BA59876F00569C1B7E941F3EEB21BA0E04D0B617C435D5638331E56EB7CE315C4FA4D875ACCD1C4B8660E15A3FDCDAA77398271E80DCB0B8B861B97A2E2B509234BD538FE0E8EAEC36BE2AD4CFC46591487297981769036A Key = 11A8AF11A03B80A71452973CC6664AEB Nonce = A46F37AB9C79CAE2C0067913BEAEFB52 In = 92233AAFE15359C0E59E8EF3595311AA370D18FBFAD06204346CA4F2F0BE6DE1D3302819BE77F4898615C4D3D887F3F0209E66E77B002150CA32709C91099BE420E95B5E753D6F5C0C09F67B0DCB5DDAD0842F6CBD3CD16A187691E24A7B2F14BC95EFC3359B80A2C3C93FDE2BEEBDB20020A3041F5D83EB5AE89FD09637 Out = 7285EFB954C50E78998DFAD44F952F436CEB2C47D303DF1281CA8629145794BE88B62AD6D8F35B00C308B321901C3EFB2AA32121276C64079EFA6FCD86F7812A8AE11E99274DED703DA1DDCAD91ACDE50C3FB38900E07D4C1F6B74CD6010D6FD6116B9BFD956BF0A3D391C39EA314236E14DDD9AEBDD03C1CC65C6337348 Key = 59AC380799FF7D4A6126A445ACE889D5 Nonce = 18FFB0A05F2FF079D89E1D36082A4579 In = 9A94824C6C3551364320E09FD9586C515AABD15AFCDBBE31C2AF0E7188BBAFF9BD249C3892FE6F4D16927C1B65D3106B3EA4977E1A1DBEB0F0BD88ACAC7492F6D5834DCAAA12B9723DE2CB00D634DA187C15DC212542C7B0D495FAB7ECADF22AF95C4CE4E762D18EBD4673F2A2AEA54F43D0048C80A907CB609EB3B3FC5F1A Out = 9F6DAE40324E5E369817F79A5B4D57474B75C5E9EED2A7450BAF7A5E94F1DFA1194EC919030EC853A7B33BC1D3D5C0BAD403102C5BFD76383A8723C73E88B4065267E075A5A42665384B1336E7435C36BCE4DD98B220D42770C64851757074278EE9654D9E9798F73BABA1CBD48C80178332EC159A5BBC7009D7D627FCD37C Key = F1E297E1C4E33229EA69EA943BDD5C41 Nonce = D43BE1D1871642996713B6400DA4B0A7 In = E71039961AC14FCF7212ACA932E1C6307696CF7D98A96048D888CACE6B95A32A268EF802CD311EDAA92D96019938D7F6D1E12C70306A1A893341F610D387248F00A113BE0BA43CE254B0958EE5DDCF10BDE3223EFF0BB7FB71C833A7A3AE52F78E00B7A294A23B76868A53B74737E23B93A7B89F6890791CBA7657715B9DA9BD Out = E411BA4401573E11E51D6D7E318D6DDCF23E5927CA429DCA57C419BBC391CAC9EAE01A2384F4705EAC94B06F151638BC7299DD8FF570404363430E9B06FFAABEC5E1384485E7A085AAF6E2692742F7E9003B18A4B9FD5D772EB0A326655F38F39B2D49035C484AE4B4F12B14A7BC74A1F0ED2BEC9906E45C22C085C04679DB62 Seek = 0 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 3A2BB9D146DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C03B4714C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 1 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 2BB9D146DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 3B4714C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 2 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = B9D146DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 4714C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 3 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = D146DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 14C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 4 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 46DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C9E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 5 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = DB73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = E4BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 6 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 73B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = BAF3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 7 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = B3CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = F3A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 8 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = CAC8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = A42E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 9 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = C8C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 2E2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 10 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = C2ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 2EA7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 11 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = ADD1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = A7BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 12 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = D1A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = BF63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 13 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = A1D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 63CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 14 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = D06BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = CD28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 15 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 6BADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 28325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 16 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = ADD759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 325828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 17 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = D759A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 5828B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 18 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 59A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 28B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 19 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = A0968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = B25DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 20 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 968E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 5DA057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 21 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 8E978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = A057FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 22 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 978E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 57FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 23 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 8E36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = FFA79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 24 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 36EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = A79BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 25 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = EA82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 9BC56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 26 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 82E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C56E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 27 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = E8C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 6E63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 28 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = C918AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 63B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 29 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 18AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = B7E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 30 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = AB24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = E419C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 31 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 24A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 19C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 32 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = A85F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C9C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 33 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 5F9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C67BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 34 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 9AF8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 7BCC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 35 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = F8BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = CC2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 36 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = BADC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 2F61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 37 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = DC2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 61085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 38 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 2E19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 085849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 39 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 19350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 5849665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 40 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 350B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 49665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 41 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 0B4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 665F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 42 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 4C04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 5F549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 43 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 04E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 549DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 44 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = E9F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = 9DC8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 45 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = F9894C8764B64C6BD00AF8C44AAC04588AB10B Out = C8A12FEB9026B4D6B041948060F0F0C9339490 Seek = 46 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 894C8764B64C6BD00AF8C44AAC04588AB10B Out = A12FEB9026B4D6B041948060F0F0C9339490 Seek = 47 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 4C8764B64C6BD00AF8C44AAC04588AB10B Out = 2FEB9026B4D6B041948060F0F0C9339490 Seek = 48 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 8764B64C6BD00AF8C44AAC04588AB10B Out = EB9026B4D6B041948060F0F0C9339490 Seek = 49 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 64B64C6BD00AF8C44AAC04588AB10B Out = 9026B4D6B041948060F0F0C9339490 Seek = 50 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = B64C6BD00AF8C44AAC04588AB10B Out = 26B4D6B041948060F0F0C9339490 Seek = 51 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 4C6BD00AF8C44AAC04588AB10B Out = B4D6B041948060F0F0C9339490 Seek = 52 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 6BD00AF8C44AAC04588AB10B Out = D6B041948060F0F0C9339490 Seek = 53 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = D00AF8C44AAC04588AB10B Out = B041948060F0F0C9339490 Seek = 54 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 0AF8C44AAC04588AB10B Out = 41948060F0F0C9339490 Seek = 55 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = F8C44AAC04588AB10B Out = 948060F0F0C9339490 Seek = 56 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = C44AAC04588AB10B Out = 8060F0F0C9339490 Seek = 57 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 4AAC04588AB10B Out = 60F0F0C9339490 Seek = 58 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = AC04588AB10B Out = F0F0C9339490 Seek = 59 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 04588AB10B Out = F0C9339490 Seek = 60 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 588AB10B Out = C9339490 Seek = 61 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 8AB10B Out = 339490 Seek = 62 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = B10B Out = 9490 Seek = 63 Key = 5580BE3D3A5A727F22B4595BE16E0F3F Nonce = 678ED31CDE4D6CAFC8BAA875713FF0B9 In = 0B Out = 90 [CTR-BE(XTEA)] Key = EC1147D3A4CB70A20AA8664E88E60985 Nonce = 7A38520947DD623F In = ABA78D16A7A85065A61F31B9C9CD4053444BA2A36C80E97C4C7BD0956676FA39 Out = 4B33050781F6003A1A4CAD8B188DA93FAB60C28BBC1E5D822CF7551986E2A5C2 Key = 2FEBE8549A5DDDA945398955CBD4D3E9 Nonce = 2A95AD603EC4B59D In = 14E75459D23667074E7A7373034443BB4B2C7CBF90EA1A18D59A93598090D92CAB4F8F15 Out = 7C2E05A9570504B7751E4614FECEC7F7449FA1B25895C4435A29AD9DA8AB41A8CF06048A Key = 62F04E49D6CC94750FA5CFC871DBDCCD Nonce = 25723E1410D2EABC In = 9388E427E80A52FE5EB761560A2494526DDD7B4729FAD683E6C8B57FB46782B9D016AA0DDFC9C313 Out = 8020D203BE99C6EA448C64EC4CFC2F02AA220CC6194EAF81D938467E8BB69200B2F67AB6D6CFF596 Key = F7E815767C7D7542BD8F0DB41C8C0E95 Nonce = 8FE94927EEB3ED8F In = AE15285DF8745CF588C3D075C545591CE8C87E0840CD8EDC9336ED08E42D2A4A6BA0B7D6045AAB25645208BB Out = 82777E8462001C6BE7990AD149ED8AA462CEF8FAA7F3377CDDF07BC89F0A2EB39439756C31D21E932FEB672A Key = B64DCBD21A7CB07620DEE39C74BD598F Nonce = 74DFAD2D6C7375BB In = 94E0F6198EC8C7C7DF35262ED38CDFF2D5BC48A1FCA450D250345996EB01BFF3965F221AF4EC43D8CB7FB89ACEB01B1A Out = 8468BE0862149C3CA03983C7AFFF1D61C33FAD83477714CC51D40C6F1F045530E9651757DFFA70BB1C4780D6F44A0E9C Key = 728984B99C7E92CDEB49DE0B3FE42AA8 Nonce = 888F01082B9D2103 In = FDEBCC1AC9107EDAF4AF10F34B6E1C8EE15797901F35840504754EAB53BE680F30BDD571E9B50289987C6292BF2CA838D932DE34 Out = 76F9EC52A2E6C5EB209E7CFB4BD40EA0CAB974068A0CB4C3490349D3024CDC522D11FED4D91D32223FFA8916B39D458999FFF43D Key = E55ED01805B70BA13D785D8D859F15D8 Nonce = 5C8907CD33AFF98B In = 9B0E0711E375D8EA9735F98F38C58E9184E66EE71DD12B9E14F80095FFE53C6461A3A362650D150C2FBB6F84DCB0789D6E7CF63D8DA9CD6F Out = EC83CD5B6D2DD5B438CCFDE65580F1A45053D01E15370119219B39C124A4D99F8EFA44F5001BE7F18C7E0033CB1411AAB97E104196434346 Key = 1D22726357C301EDA933D7910D3135B4 Nonce = E046855FFD91DF19 In = 22E53F89A5E86CD4A874D5CF372E51362E8F71728FD855730CC87BE1F57EF26577689C1F5390C158B6E1ACDBFF1B5BA5D90D6B4F0C2D484D9F0F513E Out = 33F1FC8F0B7B13EA9F2676597870D55E285F7692B5F89CFCAC80127E5E85D1D3C5D624E22A4C36066F7EB9AF665AA1C7799863FF3F5EFA3FF027CB9D Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = C1EAE81700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 25226E84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Key = 6AA995999C4EA6C83070988AC0A795F7 Nonce = 01B5B1C6E92BBEE6 In = 325748DA5C629AFC738D34BF32C84DEB40543C276A3A2C13C6A4BF23B885B6AC348D27467BA3714BE4FB1B764B81FAD7EE2D062277B4EC428F0A6E6CADAF5EA55860F8AE Out = A0FD6A60A1B8A729CC52D41FBDB2E5E7896EE8C9944E6E63CD1A769BF278AE2E8CF48115ADEA864B00DC65B950C68D09079CD81D35459F5F483F9040FC38AD50778B4217 Key = E6D35BBAC75EFAB74AB954C8C2D0D1C7 Nonce = 6582E6C1B4A47B2E In = 23019A5A7C61262EA124DAB215A517423781B9C1BE56B63E794BE6836026F7CD55531BFC08665896FCC7CCDFDCEA09207A8785C8DCE932A00A5D105A2D6682A32604D1292207F195 Out = 47CDB6D6BC25AEBAD70E99524CB0EBCDEB48E0531A35E505FFDA421A1F27ADD6BB9ADC57C3525B989C0C1DCE37577877CE328E6D317D0655DFA80AA8B62273C7AE8DDDE05EECD178 Key = 3145D3926C22A5AB4BBDCC163CE93E0B Nonce = CB8BEA9267176935 In = 9F8B703434DA473871B05A0D83EC424FFBB0DA17224C95D33178FD28641C1ADE87559E7DACD11F819CAED832B095F6F804FF63D4E239D620B8E6CE8DF1799D028926A3FFE28BF433664B166A Out = 8E1F3C026E4885E3693FEEFAD56DB8A898269D61CC92CBFA0DE1DA833586619AE9D0B98E54028A2AED24BF2878B1894F4BFE090CF0A7F2627106DC0700F43D31914586DD1A1CD7A1A7F5D82A Key = 353358DD5493234F6BE6E3AA3AA4D393 Nonce = A17467FA740E2541 In = 4592FFC1D25A2ADCC9FD5DE77DB143AA6E17934FF882E2F8E2BF0D8BFE6DFE10AA33D124199BFAE8D3C2BC2B4B9EB37FC6289C0ED2A6CDDE407F78C035CAAB36653FF686FAC37E5176B3A821E21CF7B1 Out = ADE67B169947C994E246676FB301C44204D8817BC3291DE6F35552E1E8BEFA5763F1C605E2CA7442847030793EF1CD830F7103ECC9928FC98EE4B346872ADADF439464BA40CA0D7863C4C9946E723E71 Key = C313724761DEC636790E38D93F299530 Nonce = 90C5A696C66726F2 In = E3100B239057B16CE51A754047F20D6537DE016ADA61056761C1D9DF3939AC8C0AB155B42C9C3BCFF3B63BDADD21954C328B4CCA4F1EA6A57EA8B7A99BFCE72E57CA2C87C4ADF0C844CB76A4B8DA35BD0A3952AA Out = AEBEC1E382AD5129278CB4C5A67EF92E64BAE93C1F4266FBD40AEEE0E28D5048E81B0CDD2EB7851B7A3CA43BFAB751C54217DE5315D9EBCF94238FBA5A8114C28F1AF6B9110DBC84EF13F621B8690AD7480E9E90 Key = 3ED02192D605AB5AAE56CC630BE39141 Nonce = 09808B88D15118CD In = 6FEEE7F77DAE629397B0EEBCE6A4E7CD4FCB4F14EBC408A6798475F3EE5C560F0C38FB0F9D2334E85B75C36632EB4C9ECF80F02B47EC1D589720C104B111197E5CCE4D08441FD98B9D67E108BD5AE4313B5725F7B86BA4E6 Out = F73ED0FABED7812409A04F100F1523DA22E013055537803A3F6B2ABE9479A199B2DF80F3F379640228C47C0475A68A86A455B4E53D2CC078A9EBB04F37764714EE9F0202BF15C393CE87A6E339CD0EA52DA997091383D151 Key = E53B03BD00F9E5817BBE38EB1760F950 Nonce = D559750E3DC7CC19 In = CC1B18F695290A169D5DAF220622250E4C3383C871CED8648365EC2DEC9A14D5A522441B35B8AAA51FD6D06EF8E5C8F6A12F8EF068882B826E1B97844F0F088C1214DD1769E6F1B329CC62FEAE91D1AE9CA752AF80A966AFF9495BD6 Out = D86A1A79CE209972F3F5DCAB0389DBA578CB0EA6FF657E889CF6CF7C30C746131E71927A3CB2DA42A823A19E176510CEFD9AEC30D7F648097AAB847840ED396FDFE4CD1EE0C131C763C17F551457E5D0D933EC1CD30ADABE4E69298F Key = 48E7EF6FED168BCEC4069E3E622530BF Nonce = 7C8A47B36E7EC263 In = D150BC8369DC06BA57F7CC241766549A52F2D49D7AAF9CF7D6BE0334FAE2327FCC76104DE5EDF782E32B8CCF92669B62B25FC619DDAB77BF9AEBB2D175530AE97B56BE01065B95324EAF86AFDDED0C93DE01F139E6B0302DE8F59954F0B20793 Out = 16DCB3F6A247FCECB4B5C7790796166540892230E00AACEF9EACE255ADF579F6BBAB2F2C92E8389EC54A6F039963E980550B073C0CEC4FE554B2A23C69776D35AFCD1285591041415CC9A15BD1A4A89AF43F702B06F1807FEA53490B80686A52 Key = F931CF1396F15FE1FBED7A230961C729 Nonce = 5DC1DA62482AA6EC In = 1B1508A165845B4EA7692CD8BE5A38B42AB114B9A63E3243D3DC1AEA8D279E2A12BFFED888B7E4702CD51CE577E04B9E401C1D6ADAC4222FB87A5BC81CA331DE77BE79D3C92878398752DC9678D5ED422E40B469515A64D1E561DEC0D3599CBB88AD71FB Out = AD25FC4AACEB3BF13B5620DD0437C0E5EC62869F5C0296C7A0666CFE974603D9509E29804075560D1674EC8DF26BB7FD8F9438731927DF583D8DEFC45E960F0F03CC71539E56F6F33FF324F265D4E3596F97630FEA0521C29210830BD5514E8DC390573D Key = 238F54FD6D70A8E8E03F305A8136A4C2 Nonce = 9C764FCE696A60F5 In = 969875002E0CF955F29EC9651D8AC98B667A8700E96EAFB42AFEC3EFFC9A219B614BCBF0C32028EA2ADBDDA5D0E3444E1658C7E0CE20362E00EA73B2428027FCA2061CF6B492DECCFCBF06E519D05BCA2282342DED05B0CF2E1E25639F58DCD220922B690C5B5E23 Out = 4A1A307B23136A6C15065ABE453209D1B87413260BE453F7231629F99709CC9F56D25FE6D2976B2EB968B83C4F58DD21DDCC0DDB4434633181E4384EFB89EA93B679AFE93C77E4776B28F504514DA0471C49F6E5E40BA90BF167B3849AC6D7D1C05460EB0D262936 Key = 84BFCFD08B09C9515D703EE5F629242E Nonce = 8B22EEDB409EBD8D In = 0116DE193FF6B1F703B18EDF87610137D14EBC3119A979CECDD460C38A38817CC12FE56D2110442A56A1BFBBBF4A1CF701B502C6D37AD1A6269546E07539FB4EE8612216FD3E69CE47513CDE9AEEA674D6DC1719EB4A08A513DA5CF063CC9C6C037425DF4A44766516E41FAD Out = 05CB3542A26697484D30EE15EAD8DDF8B5D940F5BEC00878DB6FA73D1015B758DA221815AA1FE5F237AC3F9D6A24E946097A9B1F8DB04D5AC68B0B6F164596FD087E06649F05E7503617BBDE7868085FA3053C79A1C878C8FB46CFFF98F782FEECCAADBD93A087497A9355AE Key = EA279EDFB80A909C95158D9107E7BAB4 Nonce = 3D899C4A9C64C494 In = F8810BD894C82BA767986F98DE5CD7E7F9ABF6E82D88AFE84A6735547CBF1E13F285C35F8C5B3DBDCD89D9DDA3AA4CC4C153426E573A585C9A21A77CDC1EC886F64874ECC2482458706366950A1650A30BDDB73F9A619CEDA1B806CED6E1ED00F63650C09490CE87112F1319431FA016 Out = 8D2769AC11176C15B77F0CB8A72B34160A1E3939EFFA43E098B50271D9B031FB9F52E6D949B150AC630B2CFA85072F797C9AEAD9F15735C69274A9BFBFA4BE9E759552B8E02CDF6BF07DDCBD6C5BEE9C01568D6129676D20DE0762C5D466252CB286E0A1B7C1CE6E4BB3FA4D9B56761A Key = 09EBFB4079E906C5F8BE9B2041A32305 Nonce = 998215883ADB9F54 In = E1959869B615E838C4362ABDEB51A3D0BFF2CAC32AF78E27106B1161C5D6A893A5A31B78FA92AC70DC3A9CF68DC62280D963BEE9C04CEA5F1FB32B15582B37FCDAEBA18DA3B222783D2E7484256508F26BA549AD56AFBA3F5B0161AB6A4A6EFEC326477E92B025FBFD29498DDCE8B9D274DDE71C Out = 95936503497BB10E8C110CF1A819FBB13DB05DA88723055D8CBCFF2B15C8DCDF12BC7810ADD4A82AE8A85DFD6D906B5936189B6F0B18B9979A0C55C08E53BDF37BE251AB364D85D9E94F6AE957131AF7CA475BE7F19954B45CC3C00867B9EB574B614CAD4A66BB505EC9996B7DF9467A39096CC3 Key = 809C0B33709493BA086F146697A9DCD5 Nonce = F263A312E9A219B9 In = 8B2999AACD2CA034908EF05C394CCEF00F816E57FCA840C6010760EFCD6E3F3AA088784D530AF024FD9E3BB2B4EBC5223FD3DB3493EB6E2E1876EBBFD4BD0090004ACCEFBF3756BB82CD18EE4CEEF6FBBF09AB0DB0465134E848672FBCA3BBD6CF8AEB684C4A82244D7A5D44468E0F31C41B908989B7EC26 Out = 51BF0E20F1FDE6F5B7FD1B72749709999147D80866C7D12E8D37CA2896D67F889FD5510C8F74C62B8D044F552EE7B009F943110CD3EEDACF20DB04F3522434D5BA4E0CCAA29DAE39F18CCA49EE1CBB9515C13FBC38142775ECECD778BE72497487D5A0763F20A6F84BFEA19D4674066E934D8D73ECA96C28 Key = A794395BE934B5BF5FB38EBA5E0D5406 Nonce = 4ADDE2D9335FFEEB In = 60C66BE7E8951C3E406F5635AA22FA1869BFC560F337DEB230EC6FBEAF805A778421CFBA07166136F1C1F3AE674F895CE24BEED79C81BED23C320B12C45894AF037CDF91BD5405637772D4BE4B06E72181286194BDA09BA7FE682972E1D8972A09096612114DAA9CABD80816B5C50B2C1644FD6ED8521E7F82540F15 Out = 64A20C4BD5F7949AD3583B00651404AAD4496D5C3C39A7D463CE22238A741DE32083AAA238E3320DE7FE007968BA55B1F14AB1E88064F2C112A0E97C37CDFA9D97355692E0E9552E2A71D22DC2B5866902221B7AF4BA94810E74CD4D6FAA8E57263EA721C2959A240FB336346C602C177F95B40B11E0DE004CCDF6E8 Key = D9653B71A3003270F83DFC49AA48C8EA Nonce = 40E4D61971A2D857 In = C37A738A4E6144F1E5EC5B8E1E61C71AA0449D83E3D207136CD63D1A8F978D8D0B00462F3A10B193B2F5445D2BB8F0C71605F277388A23677CCAEF508041C406219D8FFF569E44F24D4DFD9216D261E244DB588FEDA33EC4B87A5114378984559004ACEE5DDC6C16C2A25D5AFE42C961CD5C418B44E218A749A357351131CCE4 Out = 64646829143CB4A25661723F772932F14BF4898344F70EEF3186889849AD9D1D98CB480526FFE8E7B6AA15F3A9346D10111E79C809FF435EB8851907A90530F2B96A2C0E1E1A2587C8AE735222967BC82A8106C604C9F2FB15E4D7EF3D8F9806455ECA090A0027BA5D2D52287E0831422377336450F45D268A6D2BDDD474FD84 Key = F546A2AD3A1F291A995F4C058D9C9F78 Nonce = 7F993DF4D373BA6F In = 2E3ACE745E2D36728751E0A18448971BEDA6F21A742E21DEEE68922E89E85747EA4BCA5ABD903FDD7EF705359E847687C5C132BB2556634DE165F00BA0E4693CF364CB1DC100A073253732050AAF7AD77C2983532908E888A8DAD84E43A4ED29335A5515940177F8325E5D36C6892E42665EEB814E6689F0E06A3C5A69D042F50EAAC4DD Out = 287F31451FB5E6769B3EAAA58506EA403BC6F47DE662BC5BDB558523706DAA72B16174CBF0DAA28C5ECA6EAF37EA0866467A8860ECE342104E63687A2191F2927A0FAA1624BAFFDB8660DB0FA50627509D9AB5AC422ACD521436355FCE9DA020C11D402A02EBB46DA363A7999F348DD815CF60B115166BA82581CC01358B5C7F52401E98 Key = B8A2DACE13F418A8C576AF7F5DC03E79 Nonce = 00C100EEA0489AE9 In = F51E1F304ACBAA9CA94555934652761CEC135E591492912468C7FBDA2807A61EDABF838F0EB47B99DD441C54A03C65AE73B2343A9E12C6B1B7474BA6E88755C90333110861AECF6EEFE5CBEE18ECF2631FEDDABB3AC0FE36DC66B1E78D8FF5162BC5323F85932B215408997501E3FC0DAAD12A51AE1F1387C8ED8B132DEF421D0727AFE59788F4D3 Out = BED9B697D1DC34037DFD5245FB74D684103E9F6B649024911976336DF5451443FD4B32A9AD91B2679BC138066DC9BA6C367277EB7A7AC67C505CDDEC6300D26FF5C9E5825420F356532D78080459362399FB9F08684EC2693AACB90382E326431B1AE0822BC6E3C4D67DC93C301951E8635E3A19A71F0EDB63D44E53951B097B5A0FE3681E2A472A Key = 3EC3D092356A5B6874DEE6031785E19C Nonce = 96F16B8BBCECE7FA In = DD2B20530B72F4E675F1FD7AE4FA8B0EA84B2946F1ADAEBAC8DAE5D1168C4084744F879EEB9507B340EACF728D0D10786A6E8A4408908A6ED0E6198D8D1675C918462B82EA0F544BDB3E194ABDFC9B40E2AC4BE61E907A70352532648C1EB6D72FC114544DB439516DF681F642D487924ABF0524C068EE4B9E45009BB8E99DE5CA73372A2F7DE78439150ACD Out = 4A4EF7F6C0933D12A4825EF1C293FEE5F95DBC69521323B6BCF527437513B878D0DCC0390708B64CCBB8C3D7D1D1FC574DE35C45C2D48770DA757A65A177F8AC25C3F1F59A848E5FDEDC9ED2801300F1A3ED44EE8A9F5A79924BE7E9FEFBAF6836CF18E6F28DA81F87DD2ECDB48CB009A448172B556D977315F798218EFA44A794F257D250CE73AF151F74B5 Key = 11132C6E22979CB5C213191045E750FD Nonce = ABDC21EA87125B00 In = 5BC87836612D3D7FCBAF662B16924062C237658471CEECC0F1300C84531215406420D7C202922DF63F6864345581EB8C3345BF47D5FD9769563EAABA49A042A21E1CB39F51165BC8AF5418169C8A0A9222C4A333559CA6F3DAB374D6A342D8AE24E41C51424585520415590D2874F93A7919F2BE0F25438F0953FD3F8FD2804435DBE1190660227330D5B0FB3BBBDDC8 Out = 077DFDB7F6E7EDD024C475FD57BFAD68BEDDF0737C1A460A589A8647212A61B33827D953A2FEFC7F48E2979C4DFBD4285D747C52E3CE232FBF2307FF9F04E39C3D817B7402FCE65608E599E37F208BA8684611C8859B2DA1F7F6797DBE58132E0BB143BF990D1D3D8226C2B9F6BC50E8A03DB6C6560582C03A3D68F48E781B054DD69615B5A63B6136F2AB75BB9585F7 Key = 6A0DA91DBCA54101F99ACB1362CB882E Nonce = 7ECFD1F603D67C77 In = 673436400DC4FB49950303A83E0BDF18E477F638B5E768172D86C2223861A86E73A5C4239FF593B84BC3B98B67C56897B6417C9E5BE8ABA361E4EDBFD95DC3B15FE96E51BA717742C449F635C645CC3830CC7EDD36D1D34A1F09C46C33700BBABA29EE856A86BF6D146166CA975B2BCAF3C7E3C6614A03FF47BDB498BF3BDFC328C79228303AFE01BD80FAB8D54A0F2BE38FE911 Out = 34723A46EED388E0A273E9DE120946892EEC04EA668325C654F43800D300970DB9009E299963EB08BDE37E4AAE1B3E540EA2BABE50534B93D3988DD1F93F0E49761D83C3F95EEA979241A22A80D969ED22D826686BEFF174896D74A1F7000CBD164DFC07B92EB66EDDAD1194309CA143605094BB8C330F31F5232A0A24936594DD4E7BA41E6039A3CAA6205074656CD4ACBEEFBB Key = 08AFB509E7385CE045789878C4B13D46 Nonce = A3E66AF196BDBAE9 In = B5FDD61F8E6110D7AF03DBA5AC5342F9119F2CC317F1985CB3305E7DECD07A1787EDBA37BC47AD1329D0752F4400E506A098CC71B83ED798CA67A01863FDDB8BC2952C951B46BE9F8D9F83B7E0FE32F8FF69FAEECD49D2ADFD62C405104DEC61B4C3AFB6088B5369E88D11C49E7B5F4DBA284CA2BF5846275C5C2DBDFF8EFCB4AEEF12E215AD6423E9D5E6213382D75C27D0E6D14C78FC36 Out = E42423B8CE44B0C3F7BADCC2E0EC469969E9531CDD4A0B7DB8646014A5D4BDAAAE1096198860270A1283724DCE0E886AC9489593FFDB00B478E8D6BEF839DE633D678BA945F26D5EFADD08297AEF5D3618645D200C627D6B6097BE81248B23F825FA4442C34C2F25A1E41D445E283CA3BB723681E654DCD7932A637834958D0C80DE6AE92D298B72396BBA5119DCD873A403358ED479D453 Key = 178178B147A4454EBC944527EB05FE22 Nonce = B3C0BCCC0FC8C398 In = CDD81737DA50063D7581BC6FC8918B542E0F161D0D4BA408B5890196320C71DA508651AB850C565105C854872ECD8A336CDDB5511399219D1E15387F21ECE4CE0FD896508D041C3FAAFA75EE42E24B6C5FB45BC7B98FBF17E734FFD7C9E7160571FED42DA5CCE42750D46989CEBC803002B72C14390087AAD352BDA885B771AFF5EAE3E6CF1428AB628F2E792A92DE72C5E0234BF0AE05599A15F829 Out = B492AA4DC9B8C4CB3CE1AE1FB256D0455444D5BA7495BA36D8EA9B6BDC89881C9AE6044EFE078AA9525B71FA983D3DADC6A03B5B1E327262B21718CB7EC11F46E9CD18DD6D94A9C9EA923A459DBC518578D17184C6B19647C6F6FD3A99CD1EA09B97508DDB6B7439FD6308FFE609A7B1660B1399B07F637D7C20B8990A652177A3E634092784A6499A994F7B2644FC1EA597EFB4A4E15F08749E5186 Key = 0A0035EE3EC39ABDD835B30D054E63CE Nonce = 6345FFDCAEC79C12 In = 45A13F4D44F679618C049E0F6451C1DF764CD6975A08ED9FC21B7F60938FAE7EFB90D9C1FC9F6EE0653319532D6E5EF4C91415360C42B13F3E9C4467FB910D617AC9A73EF44AF24375B1E8A7F5A5275E18024276DB173D723B9A834E4549980CCC09D5DC7D9AC3B6967C11279C3E3847C3D1E9BA98E7F9F577E322C1985E06ABF75557540E676ADC9741DB1C4B078814A62E001C3F98B116E91A6E4601CA5F90 Out = 59A7C4B96EE561294D33E83DBBD876250CFDFB91AD6A1F76E112DB95D9F0A2DC1C5BB58C01F650C933C9948A18C879E2115DDCF59499DA33169481A521576695AE9A248A8078F5ADD5DC1E63AD39A001346BA3E3B541A9FB101B327B0DE2363BF17FFDA8CBB33142B58484C9C7D888E0CD7B4482CA3A883930E35D581C755537AD4A7876E1F028C8344BC76ECBBE2AD25BDE23FE9F5293C414D2FEB1FE94DC1F Key = EAD6297D0A3A3A8612A17C4C336E19D6 Nonce = 66B556952B67E560 In = 36144BE61EC490E90F95D38A8FA17A2A9C00B4843AA12D8030D01536C349585814E7D280F292BF5C8CF2F4F2E68CB991AB0253045626AF958C5F591FE34515B29694AF39899DC4EAA1B526C3AB2BDFAF51378D0ABE33EC6892EF01D281CD2817112D1FC685C86693A2734C5B5CFCF6C8145C990CAECC9B318EF7F5BE8B6740B280A39FBD8B9ABEC947277779ED62229D2E67EDB26F34A9A72806FE1E93A4E2E2E5D119E1 Out = FFC4706302E667EC36B915B4298BB11B0D2D1FBCB0DA35A12D1255AD4048FF593B880E96C2F9451C8AD38D304148E2DC920E9B26ABA72CC05603C6DFC21CBF7B528142422537CD564E0877FBABAFDA326B196814DDF9FA8515C91CBA0D45EA8D9550C6B95D8FF35DA3F3A1B3CCA42FEFC562177FAC15DB5279CA50D6A7D342EBA98A426BC7943133F71A97E074AB87F5B30F8F23CD26A8309D78F69D8B39FF2DCC3152F8 Key = 4E7FC8BD2DCF8D0A6ED122C394D6464F Nonce = CE96ED105D3C7931 In = 9B46EF1D1046A03836BA53F6EC68FA57B382FAF02606B4F272404C754F368DFFB1225CA6F9A26F22B0554818BB9F784F2AA5368B42E82A4C2C1052F656BD2C0272EDF95D997833EF7D1547E08E407CFBE1C996E9DE05EA5166E1236FD6FBC70A494FCA1A6A17BF4B3AB12E92A78939BDD5A538E55D39E789DCF2F4DF7A8F79452FB4ACEEC4FE364B973357518A79D76110353CE90D48BAB713D7B7D63AE14AFD7913F4EE74F02B51 Out = 6E9151C9F82CF529E7A2B63C97E451ACF59CF00971B9789FEA5E8B1FD3071A64B312FA6565A89E42DAD21C9D6BB5197C7C944C69AD6071809316E8BE5B67A775916A7E8B633BE18900DD59D26612FA4624D12AFEC3C1BC39D1C9146761E0B3815889D0B3C37B860D4D56DE042D163D9F7236D1293B42822870E4797EF63FC00D3A8900E85F5BE156EBF2D97A5B71B56FB0AB95FBA03C4671CBF97B300D4E90569EE9D586A4305533 Key = 911E1A315CD2C8126019607442FD4279 Nonce = CE1FB0B32F6FB617 In = DD3C2F94FCFD7C101022B328D3F11A81E8A47A9CF36AB9C03AE81433B18581E5B1512417BCE9AE91DFCFDDBC5BD6957FA2602E12223E98122BDF22F0DBBCBBDD4E88CD2A87C0334AB108845CB44ED56BF25FE3C8AF0C1463D2A0C6E149C218B9942C20C4FA5F42CAAE9E0FE136B238B495FE1BB33EE712CD11FC78E2536D7DA293D5E624BFF86EFFDCBDEB7CCE8B05D7FD4D6D4B926C6234E602D84B3E93FA5078EEA598C3E8CE3CD9BA61C8 Out = C749DB2D42DE856439612BFB902897122B6B57B6E5B3DBE2844312CF131DB3B7B65B4096D1ADA9C665C95ABA1AF299385E8401310FE9A43DCF1D0239F4C88493827F7EAE7FF5B8AA2F7A1F8E42F9D3B90EE84E92B4F136ADFB4D459B22195562AD525F0FF12E64C9072DEFEB31CC0331B7AD8A78DAD43E18BF84A1AC2CEFA4858BA1895A15CD29F4AA29CED0B5D5590BD1AE2DE335E795CF5645FE9F9253077144F30EDEDFBFD93F47DCA24C Key = 5283BDDEC2CFCE31E61A003516C9D151 Nonce = 7A2E404FB6C3B6BB In = FBE74B418AB2B39F83383824C6909FBF0750738CF218EBFE913492E6B458CD25BC79CF2D1BBA62CD4EA9924F13E9BE3CAAE81F9393E1B01C213D13EC7B32D42C4B896614397EBD25960F2543AEB59DAF8E061F80B2D34212202A91D35AB9E9E15F26A8BB1E20E9C8645EF0A40727C705EA03600CF88F58E2065E920DAAF41779281D02BA70DF465DEC7D34669F6D0D8C527AC7BD9A0EC3519C8DF317A697D4745ED94B13FED3FC8ABCA76D6B4FFC1390 Out = 79E20320F675AEDA7E1D50A32C6B6C17F1BE8FE14CA9818C30AE46830A41569059926D7A1C238F7AF469C19705C5EDC127EAFFA45026A39F49A5E71E3034CF4EB738775CCE69ECAF62CE39CEB45D1204709B26F809B53255D1513F3F8100DCE3EC915E162AB17C62EF70D8048C24E2CA11D3958CA9D06A1F16E571CB5BB39B0F28478A68BA51AB7A5C14611DB5781C2F3302A15A7635B60A849D9C0080C62D244FB03670EEC92A4FB403A7BD089027B3 Key = D2EE5AD0C6B1277836223D2B8999EF6C Nonce = CE3B759B6881D0F0 In = 5D22783F9FF3BBB0BD89621E7C18E4647BABA0C76563CE14EB2AD5C4F6F51A49C513A4F9C12CEA6B8C24D27BFED626824109E9B39B7468F39FB856D6C3946AC95C1A211FAFB4F7673717EC97182CB9EA000BDE3F2905439EA5F6579FB7E6A0E8BB33D2FA3F02A5D678F1002B4F95B2FD4E1C2559BECFAAF1D712AD4E37F6EB9088F81484ABE54B3A959550A2B41F041DAF19167E394FFB9410D71C2CD90682D0AA6CD22D8244B6C025B1F5E877DE97372286C835 Out = 811F5009DE77855B575D9BE64ACD8272699862AEAFC0B6284F4481CFC5FC1D028BA072F6A2398D1DD99A731261C5E4543A0FEB7E089DBC6FA7AE9DA555D0B92A58A4D8B16A39777D3368B6F698144B3E5773EF0501A41EFBFB30A1FFED14E11CAF106AAA515AB9FFF8AD9AD4917155083754A44FAAFE449205D47F5D7296CA3917C575FD3ED10B26FA6A218B00374DFE8EB43AACFC5E7DA3B514CE47AD69016EEBEE87CA8AAD668CA270D6328F7BAF60B0647CAB Key = B793A8EB1336E6F82E4CCBC6A2BABE79 Nonce = B573079D57C8FEAD In = 87719A3ED11A24F7EB0AFCF7743456648E1E6F170A4C98AD8296CCE7DBC9C59F761CF8AE0B7719E42798C45DB57477F8D6640B5BB5A07352DDCF46FAD9CC19FE8304C1000E2B177EA8BB610BDCC989D34BE946F9F37C71BEC8922BB1B067EB8F6FC6295392DAFDCE5CA3941987CF2072853297020A2397A0E1F71FDA7FA381196C942B01A8A3F82874AB7D6AA1BE59A5B9B1FFA357F17302A8E717E0A664400505A183F5D1D89C1E7EDF87713C5C114E10D17412C28AB68E Out = 1E52C0BE4B78C8B45805586FFD14DF7740DE330877913156D11D9185A2414BC5E1317CFF85B416F2882E769B74F974F0161BF7D582D25FAD24820A08A4E1D43D214E8AE6B4EE382D52C4754430628B26A4E5EC17FFD939A45C7C1EDB55329A20B3BDBDE7B62746D04A07CE7E2F28BE210B6B188492719B6044ACDD221A12FE6977369FF0FA5D12E2A5F492A594992BDCE86A62FF3CE6E5A42897830CA156E630EF707705D6BF171C250C965F5563E235E898BA0DB9A30FAF Key = 639366B19DF1C6C56B84341ECF8DC970 Nonce = 874E59C9D25196C8 In = BC5477DFF13EC99549F3DBA37E83231F9182CEC72D1314BD587383E6585BF97CA9FC86BBA7797EA49CEC4C09433946B82962FEEBFBA4DFDEC0BC60B38A9E142C92C0B3906B461D2AAB94321860DF947F584E810D502F84097ACFF6223CF77801C59495ABB52EE88CB775DB7D39D566B9C13DC47127A64A325D7AA12D9B7D63A272B92D2FCA91DF310CC58FFB5CB8B80CF44B5F376AD8D06EB87C262456C10E3091ED47F85F6336F3FCE3BF04C2DB9DC0F622C1580DFB14C9040DE592 Out = F2A1C03F2728F33CC8745FD021011F74D89F8EA351101CDCC26D5B164032E83BC793656288E124D597BADB78E0A1EE1DA1F2805ACEC4C6F5C45616465735362045C72650E48FE70D8685A2B1F982C059FA7FA04E6FF22AE885BECC2D14F8540884AB6E0C438459E89AC8D4EAC698FC0C516E59ADFE79800C3F49DE880C43E3745F9F3892E9808E24CC65DF92BCFB04EAA60B37D752B73C5DF02EDD4805E5CB14398F2BFC0F15ED5556E653A4FE7643CB609AA7AF839DDBB2772CB327 Key = AF36BB2B821552C3949B694C33A04716 Nonce = BCBD3B723C5FAF64 In = C55BA1C5035F6D543A356D3FAAE8E8227D29F3D5EE065592F980B8424CED3DEE767495708C0C720FE6EAC681146ADE443AF03055294294F138275D519E3466D698D8B48AC20164D39587DD97B26C1B6853B5B274183FC73A810F00F3D748B1E96E0E7B10DA3147DD917B314B8DB75EAE7DAE87210D320BF5BB3E1A44A66761F91235BEED601C87EF419A4F18EBA54CD6634454A5BA0675EF68F22A7DE5592D396A9BCC181AE411E9452F9973E4CC612F72F38CC10659E477E4293A46A4FD65D6 Out = 66F3195F85BB50C69719AB217566E65C682D5571AA5A6A964FC013FCD12C0462124980D7C8E423A9848BC784261924A4B76B8D3D56F2B0E5EA6BABED53C45FC11BD34B32C0AD721977FA61D896275584EA4AE3587101A5CE90DA4B9E874C1EB239FAFC0DA27487ADD04735915FAD188519B7C0451BE0CD042944F3E1BDA69C4617A6CA98D22A62DC6F1581983EC1A124E76CF2AD611D7697C8EB76259C679917BF3535A1C04F53082003634F09111FA8467512D1D69840BDA1A1A808B8664A85 Key = 1CC4ADA25984BFF53CC86C7364278440 Nonce = C9CB2BDB19911DBD In = F8F640858D8A5169CFFE6F222302138E35DADF658FA53F9610C4A115F0460E9F44CF0259AAF63714277B493E94FABD920F22E2585D0A3AE55812751A54D3E194E733FB14C6260677E1D8B46F94B69E31B83F6826A93B6821C3F3CC6B64138650CAC4500447083D66422EA3462D978FAA70A5D6369DE9FF066FCCC8AEAAF7C39705A3432C8F69D67179D92893CA230E8CB0FC559E0CBDFF0AFB3108603C2A9786E2E7F6BD965F1098236D9910BF228FC8733F168727A209F57E7E4C6AF7EF620BB158C864 Out = 4CB818690D084522ADD573C3ADCE75D50A65342D16C2BAB23153503E1D163B17E085EE9280DC5C1D19B041B1D9ADC43D2426FDAD9B11B21CAB5E3AFE0FEC9CF3A9117C47F39066D0041A1B7282E10F2F1791E7EEAC1DE2AC70A1A12BE2C646B2113F41216B5DCF6474B9ED8C3AB2D1BE23A5AB533699D876DFD512661D6B18E9F29376AC0A0B12D7B6B2231EAB5D61E7F7ACDA7503FF8E58E320980E83E877738B749C89C626FE24DF12089B973E50815EDB143F21DFBA48C0B70DA7C1DDC43233AEEE35 Key = 37910B573950EFE3AD2AC0F3229F34B8 Nonce = 6DC3FCC797E8B292 In = BB97677E03C9259E9096A6B03EDFF049EF942C5FFEADD4C59B8FCC713E2F42BB547D58D9487FACA73248BE2C38DCEDE9310B7844D68F3D0EFE4E1925433476D1618769306A571E2D4768715398CD560B52CC492213F8BE3DBFFFBF35877061BEE5CEF46A8B8D43FAE2E41623F0DED34DFB8DDE42D7492E75F2329CD4C17A8B86D60AEA10A8C68078955004B8CBE4BD80E61FE9B01B9CA83EB5D902819D4A6D8997B75A7F1E86CABF7A5D7C8C44B93B66F8C80D32A7438900740BDC2F7DEDF4B6E729FD5B8A1C8D5F Out = B20E712CC5B0041E191ADDC5083A6014104E8DC5021B477CAA5AFA6395B7606E68640FB9EF5E208FCF0515575BEA9C49FEB32749FEF89EB579A869DA3213F5DC86A4AE12CB02BAE9D2F45AAD2B5FDFF1FAFC57AF290B70E47CD00648ADA75BC476D7E048DDE9D138133F081EAA0C1475E0D1260AC0184CEAF6F99CDF5140CBBC282009F72272374E946A26BB2F0214C8D7DB0BF7676CC582C8DB8D14048B99F7C99F550A4B6EC89D1B1D4A067591FD411D206878A5F413F0A3E67671F0FE340811D6A77D55B6096D Key = 31AB675C93F77A7F5FE7A829DACD46E4 Nonce = 9200A442F4CFEA07 In = 0BDF3471B6A535F918863F7C902519F33BF9A613CD5B265C20A4DA957AE43DABA8185A512C7215D58CE22B24567A986455AF60FF075232B9E540C6ECBFA71BEF3CBA65B275AA1A74C91396CFEDDB7E39D2EB07C407C070CEB3486AD025295BE09FF74DDE2F1DD062EDBC294CCFF0B0B3DA798E435EC727AA17E1088B6F9E2AE415A19F88A87F38B366EA6F3DD01BB05FD65F73F8F97474EE5985400C25CECCBEA9D4F0118F81264933F6A61C307D148C43853C0A5D93DF6EEF2A2206079850A05E08EA9876BA4F6B202E810A Out = 5D5C57860E0F0AF71142FED28B1FC0CEC703D8746AFDF5F93BC9B80F4D0A358A3B74EAF0E128BD14A14A4F85BCF2FB40ECA5083D60473FFF6396C8C718EA44C5E64091F6C268CEE433D81B139E0532E7684CE4D2392B32383731C04829916A2B73F9FFB7D4BA1B9BC95E9D5BBA4112FD0ABBF2BB0A3C5CD06FBF52CA87E91EF399E051309230BF61F84CAF9476787B5910EC491855020A2838D19313FCCE4893030988162A8873A559522F1D4FA7BCC82183350F31D0BD8CB4C846C72AACDA246330FD4E869D900004A5D655 Key = EB2BC3806990CEC6A01D863E1AA28056 Nonce = 7056216A1187E1C8 In = 04DF7F049025BCBD7206B4A12F7E8B599C74A616A91A7B7A10F148DFA5DE56AAD4DA35DC9F7580151EEF0F87FC3E630136AF059FC49AE77AA9809F7019ABC9A409E8EA5801F50671672FB20D5CFB2ACF5B86C7FCA4805AD6864FA0062DBA39CCDB369FC7FC5F19047206A4E0CBA96D0202AEDBBCADF69DFDAB7328FC40DA82491F429AA770E177D775F728FA32AD548E4614162F84FD2EE5B8BEDA5BE1EF85460C4665782F44939DEB7571B6E2598EF78BF0661E5D4E6DA2F493C1D0F2E6073302A19C26F2707BDE2D5A6936CB4F9F6B Out = 1111C0D8F2C9577D3707BC247D460104ADA84F30DFD8A8EDF6478092832F2E35200445B013BF16A419C6D231A66F34C76C4037C62C377654CACCF9B770F7339CCEA0DACAFF7DFC393535293E8B347DA29FB207C369853A9E3CD444C67CAECB7AE4DC42B60F3BF0EB2ECEC7A6482F1BB767300C539E8FB9046B31A267D1C9ECBE997EDFEF4B46A0DB501F4FED4F81C99DC15FEF56D4A7ADCAD808F8C6B16A4F62CC0A4C39F57BAEB0914F829E1D4E4B72D93D8167BC3CAC068C327AF3D7C887B65B3400FC4C6E6400326945F7079C6EF5 Key = 7FD1AB8DDB8343643C4DB7D90BE1F9C1 Nonce = F6CD6CE2D5F1DB56 In = 963524B3D92412DF49F8DF7CA10032FE6C56ABD03866ACCAFA9E45FDBA070FF683A529606900F1C7ECD437B56A74390858E4D3276DC8DCD04215470C0AC21611D8EC1EA9EF8E512006D876420F139007ABEE1397247BEB37DC37CD237E3909C75D576D8D37B5FF9F7B078D6279A3B0500F308F991256394F78B7616B28CC6A622A98B43A9531BA25917F6D7BDFCA5FA19DA4F372AA871C7F253C065A4F923E734740A5534474B5B661164B00605430FD112B197B8570D27A3B44A4C367471FC58F533146305CAE20D15DFD9539FA4C6920F09F73 Out = 36FA83EAE79BCF08ED631AFA6C0619ABBC6731051763B61D2EA51B5D859E5069B0FFB4801EFE8DC3EA79D9AAB849B98F0DC180C3A7BE4237A0283372B235553692A926F8C20B9466935B5CF7254496FEE811BE2406563345C16ED4D37A1609683B3216DA5D01CEF1E2C0CC30537AC8A9ADB668C0A8D7DE1EA14AD9619A064B1D9C11B8A224D76ED68838EBCA0D323D801E293EB2AB9D2F64F3C1B4588CBE074446A0EFE77C5E58F3715691FF50056B047444784C154E230AB3C27A36DA7E61DB7774C9B402536013DF4DA7895E51AF1933A458E1 Key = F674FCB74F8175532C3B888AA1F685A1 Nonce = FD402E1071C463B0 In = C1EA094DE4B8DF3E530F4E75E08DC4793EB744FADB50E94D0C360CA08FD184E5B6E8B685489335C6173CA117F2CF638CDCFF0F0E3329C36125D8780F4589EB76EF76AD722A359C84632865A5ABC386F838EE6DA8E6DD96B6DD53C3AF3EF08315B71E53E442893EAEEF6D0022AFC7D08DAD0DB051CD709608ADF4CE94988476CA95EEDF3CA63328B0EAB12110826554172E3F2ECE07C25C62992E81985B9B1D9E3186AC83B167D206EA7B180A656BB4A8C5F09DE39B2ECDBA96E1354706449717BF720E9F756FDF4074FA9F5B3C0016E32B94AAAB9484295E Out = E66888E7F4A179F83B178AB7409D2C82E014922644F2276D4C308EAEB9A9F42F4062EB1BDB77EDA72C4EE499CD970F1583F284523D375C33D5AFE5264220339604B46FEC19BF61C0E7B07F7B710815801B02A4CAE2BF77F28A0EAAA026D1136580FE1B8AD1B1C40DB1A23FF7878531DFE96B18EFB5CDC34198D23A22F005DD7DFEB91359DBC3BCB1E840A71EBF85DD94663A906C315A1EAEA2E5FD673BB56B23B98D2F54AAF3E82370D75417DAA68C05CDFD15C9592FB9BE87B5C37476A2559E56C4D95834C48ED6B6B0E4661A6F8017A358D0DDC9FF3080 Key = 68101E5C1C4C16FBD08F90DD040E222A Nonce = F2B05714F3B87180 In = 47F823E98A8F3DC6E872A177EEEF167E82D23862AD0C28E8C2172EE541F28863A5530EC42EE5E6462A467BAB8372BE75990369F8FC299C13729CB508332906671E0F8BF40A82E86551E9CA7FEB3E0FCF8BDD5EA5539756802A450D09637978E91A2DD4843DDCCA8C63EDCAD02B3AA18744FEF1C78D9618686E4B5A84E00069328F1988CE852AC7B17E2DC24280502154D9B1604654CB54EA5E4D069643D6A43D988555AE9CCDF057F896CDB600ECA135406B51158694ED6C8BCC898E2E4335A9432157D306E12C77059CD3B296FD9C9A225719861D042ED726BE7302 Out = 42300596CBD9EC098AAC697D227058DF9A88051904604063E95C509F9F03869C68AAEC1063701259BD652E9AB275F07BFE164057367A74EED02C72A96B3673ED0510B782E6F4603BADA717221EDF098D13EFC76A41CF6261D36C64D7B747303B601B3114EA603F9BA42C12C3B89642DF4AE2797569B8798604FCE8BC7906F09310858209A4F678748610DB9DFF24BE79D3D5D41A4F0A449A7EA03628959E5D44B801048BD685A7541D57E9AEFD215D45227276BA6B737908C2AB5066CD3FD555A69729B711ABC683E7236B3D0D82F112888006D30CB1DDC9FD680FDC Key = CE1972241FA1F27CF1AEE36A51432732 Nonce = 4DEDE955E0196744 In = 1D4C4CF8F819F57243A3CED7F2D8A284AF2588B0C808141A698C1C2C6B7470659344245AD162D527A3E221AC8822668541D10A536B015E8AA35268321144D6D84A199FC147E12028A3DA9171E8705CD65A54210ED4EAE211AB1F864383A2A9AA014E62ED69C60DC32B54012671313B45319CAD64B0B26DDF9AA48E5D0AFBEA3EE2821459CBA5F4FCD798A8647526CF3655E0421EAB46B558B57646C56DF3F6C62B92E8BA3D818811CE7BFF4975AE434B23E095F5942827ECFDE9954C6823FD5198E0002E189C63006914672B08A61012FA7A37A800BCFB3EC845D179DC210044 Out = 1B98BAFD01369C2CDB5004819CA0E2075860A4543B1A6564B32F097C382F9444360658599A71C29CE4791683E436DB052DAB361A68D6DBBE3587AB2F6AF60A102B59FB62DE152DCE0737B968750174D95854AF51C95473D17060082051DCEC1766DCEFAEB2B0754D9B95980F143DE1D6676DEB9FD6EEBD01652B4166072974DEB8F26CEE33D918CCCCFB9152537979845E86428145E9225F69BFA8FDFCFFC80CDB0274B48522195CFA77F33328E472FD767B6C3FF39B66CC42363018E38CFE221039EE5065B7A64FEFFAA441B6E87003DF7C60790B9CC46BA6ACC7557609BD9D Key = 17192110F1F1B1279CD586D5FAE45F4A Nonce = A01800F5D6B63103 In = 2089A7FDB2728AEE9D176E603055E77ADBF6861C98A185B642BF02C04DAB8226570F746B66C1AB8271FF590CC51A89E93F9C6108EA593F9135AE64CA62C11E165924C4734332BC34C090E7383E7E1108392CBDC103C4BB847C443F7951F17AF7C610CA07889FFCB27B40AC17F8E0594D6DEB391E3D6132C3998CF6F707CDABC13CB702F7F0E97F266175F0C1282682ECFAC95C8A709CC3092010D48F58DF41DB72E04013C5B5323155CD2D9720E0D40B13BEBB081F97310FDEE5D00FCD7B5E5C7FEAA2A4FB756916FEFE38DC0025CE7381D83E52DE05B09B1273FE3B16BE372DF94FDA35 Out = 7DEC8416E69DCED8D5B6CC3B831307AFC33FECE9A0567DEE0A5999C804CF01FBC19AC1B8555223D3DBE6CA50BB096A7A87ACAB5A5F0ABEB3111E98FBC09897708A18481B51EA78BFE3CCB5AFFBA10F4B980E313E3ABE98EA7E13E38282778514F70D16F7940B6E382AA77BFB4044D6F8EB9D95DA97A142DFC876746FB8338200787D3FA27905E57FCF861BFC8478745C7C2DACC162115E5AFBC80917ABC5358957ECBB65B593010177CB1CE947235A94721541F90349011188A860D1D23CDD64C3B8D101A87114803690788337CC075B1D37DD21097FC730E528D94FCDD4BE1E9D8FF00F Key = 190834E408E085E8CC3793E57146FEC8 Nonce = 1DD4835D46E42E15 In = 6AB1E72EE86035D1E1E92B3E79DCE8E72C77E3AE2C4C17A345CE25C373C5B95833DF02C1F34ED2FAC60F6EA77762C8F01AB976DCD2F24BD46136314AFC6F1336032ADCBEB1642A7B46C8CC6B122D67C1EF3E578B6B4AADD9CC655FF37C2D7B5CD3878C32C3D5B0455A2C1DC9FF743EF2ABBEFE2D8214D48413032133D821AB161F300CBEFFF376EEC0051D4A769F5203E87B99DE52EB687EC12D747F2E55B84FF377F88E3F9B72900BD7A8B18E970FFD41BEECE4D1978F25411B7EF8991122C4B4444F1FEB3E88A89E48B3CB721A62EAF0784CA54944585210A91A593E2E3A02063D1F76BA62B997 Out = 0D6121F6EC196C1AC20C818918A2F2683877EEE0189D94511CDEB2755D203F75851FBE498818C6013098FF6200E2262328B8084144CD2782DB5BD5C51E64B3FCC2F2D789B9CE389929E72BB65A264EB554213AB772140D7BBDAFFC818B2D6D0BF4ECBAD5E984BC17C1E7EB6B1D435B92B2E1C5A8867233DD9534F3898C7F64E1DF8828BB765E382F9E2A46B5FC9C38022E1E5C7D09E791E187073DDB688921D22172AE4C972B1B6F802D4FD75A997803B9B87E9DF2CBAE978C3E6E1FF18AC8D56CDEA3B9B1E9DAA74EF3FEFB018EBD9902AD4ADDC67BF0100D9335569D6499563010DD12DD3E23C6 Key = B7029C1C72337170854CAEE83C38A031 Nonce = DF167881D0D693C5 In = 12025BA46EB9326EB77DD3729B51E1A2E845C031B89DA66B8D73C02AD33263522AF4B92CB5CB4BB254057012033B4D8A147AF3DDE90B7951DC0FBAF0C98D4530A367E945D6BA4C54F57E9986A2452AFDDC8D64550823487168529B5D970A6CA0FB5A8B73D4E9576EA334E41875DDB2955C1E81A8DBCFEAFE660C9A594AA169FDC78AB03783738175B4C974E28F8DC593782C9AB44DBD49934C3AFA35E12A8ACE7F02A469B1A7847461D00B85D34BA01858B624B2A50F192DBF4B7ACE9082FB2BD4B9E4C39CA49300FA69D3C1755B839C90184F7BFD322CEC78F8221B0A9BAF3845AFE7447477EE4B1623B384 Out = 6BF880E9AC252DA1FD73270B64018ECCEB005CCC89AC7D48B48A5E61F15D21F5524B0057136BB21FBF084BB16B1E5D09C8BF6082AC285120945B63522255C943D137F76804F5B6B526459E9FA64B3B5CE1B2AEE7BBF621B864F42556E0251FC8829B536F565E929B5C61CB72EEE11961B52A956E4B2D3BA81124952F6FD8B4EAB170544D0ACDD2D97977328549F851E89EFFDA3057D193189EFA71B60100C4719CF0D83132327828C48E452ED59EF0709F295349E1141B003BC688800C86F3B778A18678403BA35309373967AD8B6F5B225B85D2F0C16C1D5A155023A0010BD0FE1EF31139F18FF8CD9606C5 Key = F7430DF9CCACB9230AD4BC7AC46B52F0 Nonce = F9059FC6D69FE7A7 In = 79E97D129AD18FC0B12C3CB00C872794D8AA7647BD743E507E0A67C0434BC32E58AF6F720668DC6FBB1CA58A0774F01AD16AD46A83A6A493719DE8D88B709632DD1BE56238F6C95A599CC92B9B84EC18C43E2598C752BB9E2DD1AC58395A8278876AFE7F152F72934B903FD23BC1F76718A3518DB74DD8CE3E41918E62133B99742A5869450B09854ABA3E9466B7C44CADF80E126CBA30CD6117755701F6F5FAD161159425B197C4B9804B5A7940627D2A2257CCD7645512002C4C5B09BC0DD4919AE3C96F70FAEEDD4E48CBBFAA2791109F2288B641F3AD145B37EE68EA0CDE249F1669604E8B717A5D247A8BB25AEE Out = 7C5B40D0A68AFF288C04331EE8EDC20CCDC98512858E54C8888DBFD550231D7463F1BC493C23C9FCB93EE65F025ED0A0F470DA7E15A97B900F64D225B71D7C8CE6511A4B74EB0A7AFE7E4EAD04517198635BEB48FE2C41D6552AD5DD48936CBDFBC9CDFC35248AF5BD85360DD8A3BBF4CA4E87D6E345094CF9AC5725E32736B2AD12C0FDB4E9382372FEB011F6F7D222175A92698D1D74B3795EA05C99DB64FD6E439B5DCF85859CB4D9398072C8843BA1D1F650D5F2E2E2BAF2F1C3A66A10BFA879FFBF6203118771CF893982AA710C67C2347A8ABFD74EB814400C306BB95458FF3EF850DA5E0300A1ED39A1B5611C Key = 500E05FC7472AE721E0B9DF4629EE350 Nonce = A791B3A28B063D6D In = 57097A044B43E7A3E111EA95D9111CB2B7440A54A834416FE02A4F34C4C8C34741CB340CF66750A9683E23DADFA23320EC4E0A0BBE692A8A2F816863BB078D7FCF6C056D5F2E8169CD639B148A779618C32901CF37B85DEEE483DC0F30B522504070602CF032EB17CC48232F86FECA67B63D06F0B25C717A62676B26DE840AEE70D39432567EA2868ABBE2EFEAED6E417BB02E0A2E9C30D7FF850503380343838E7EB155E1901547BCE29254F27DD1979C2608AF0EE05696D5F3D3F678FD457AFB048E41CA852129B5D78A619231B60DE4E19B60E2F699CF09E832CE02EB63543C02523C092B34FCFA10BF9BFD9E32766E412A27 Out = BEDB29A971B27E7959B48857AD56DC1FF2776EC258646F26C935928D4B1F0B874F0F34B16C5E1936D6F5E2263119EA967A9C441F016431059CF8B54CB1AF52A7BBD1D5F9C378E302FB9C9910742D7E5FE8777F2F5D976A569D54CD54F37524A0FB9CB5BF5EA17763171F52D2C823C1E12A99C2196C45FCB1AE3FF170B05D5EBF8EDAD51D7FAB7B6357B84AFFA19DF67ADAE39C964CAA610889E1C79218C38762B7A4B522132D9F9235CCF8F8D810BC9D7EA44C77599DCFD1404EC6BB219D1F1916C0685B23D79E57A280A1D3FF5356F948F15889527C42358A137CBDAF7ACD8750D5D317F295B821E450C7114279FEFFAB4121A7 Key = 19740BD949A0AAF7A2908411B588E75D Nonce = D0CB88F836751471 In = AF72E9E989D375EF3D4B16E56B025B0B5E3732337894E5E5AA08D9763E905C625B782AF0530E2E3C8BF1D3F336BD13208FC0A1D7F0A8BB91E3FCD7C9E45541C29809C8F7589042CBAF994C56F5F96F10E2140AF452D376B5DBBA2C72542E1E59D63C99E08334ED6A82605737236D4AABBD45A92610AF0C2852B2A63CE0A0C8D1D281D1002C8C37942791684475B10C1BB81E8CC3E7CA9CA1BE881113AEE41857F25E5C6D404F903E93F16BF912D767ED6AD2604AC8AA5937303699168D8B034DE7B15F25DD25002E22E7DF90B636457FD62E83731675E32F6052BF1BEEADC5E65F1B2831A2702B0377816792EE9DFE04BC6410E9C597B633 Out = 936EDF889D6629BC65F387545190C03C4AEF91B9A8A13E4E51B02A9DCAFE990CA303DD9FF81EF1C83754657D4C2CD8A89BB5345DD280376FF8996F2204BF1ECADF126D992172CF452A5999C1CAA455A0AF9EAE12D8B5B8CB4992F215707542625DACB4C460ABE2A97B804ABA14F365C4A99EBB92FE4174A59D74C0D942D75F920E46264D3FB929C60ACE11F4982F6E5CDFC8AE73DCA838021D898E22916333075268A29D8BABC2A78AE5E54BC51791679203B812C4CAC0A4251224C4E509F6677FB140B557665BD85AC3B3EF2D204129A84344654D6AEC97A27C8FBE1D5FBFA272AB20615D2B97A31AD82D92F6457BD8B7A35A98CF8D8384 Key = 8CBEA7813B209C17DE9441053D8CF013 Nonce = DB8858BD18B36B06 In = 5C679ED0A8FA89F7763427FCEABFF3640D680E74B633889AF857418D8142B83322A084AAE7521A5DFFF2C8F05A345D05359BFA873E24CE2259F98B9F40615F3CFAE9736629C988BE0949924060A5A85A59BA733FD75F53F991EA3D37D9C53C58C4999F380DE813B73342F42739B169AA3568834F3D3A8AC0912AF8E3F116B602DE32760D5F1A4DBF7F71F783E41A3AD273E54B76E4A6439C9739210F5A2B5FAE2806AB5811D22B8F5B5CF68E80B2921F2980C2858861A66619CDBE4BA9A3B2F6094C9774B5F9C07D8B99BEE0E4FE02E0082ECD24497236C8621A413E2F3DEE93F38E98DE28B95B621E8DA964C7419AB2DB4FBB5ECF3A9637697D35AF Out = C5C9D588A11FC4EE03A6C8AC33064C73DCA48BF7C3813EDB9495FE0DEA94FE7F60B5E491E802A06CD0593FB8169230144BED6A76CB353C564DFFEEC8793F28E659127CC9F4C25D331A0718AA2A91B463A3A686DA4A037C4217EAF907B70916A70229EFF66118D932F1EDAE987CAF21EA174582ECD8CBEFE7A3CE1F2683B408F56A6855A56BB9C8CA9F8B334F1C9F03D68D69CF500C0AAA729D0E7D8C40B9199D9A8484EA45F7A483E8052DF531541DD3E354A31D7B2AC271A045A72AF306163DF714438930D6B16D15A1E0132804DF1A94C2CCE769FE37B20E84E147748653A2F4F6EB228AE7C1AD6BAEEC853F17C1AEF07756C42E2C09AD84538D26 Key = 281866EA198A1CEAD6E334039B2CA436 Nonce = F8E76A4A26185CE7 In = CBCB57CFD5F6E8E9FD5F987FB13C1ED23EDF09C2929F7C01FF6D4B0AE61E4F1B3A5CED6ACBEEDF34831C96B9CAF72C2551BF6011A432DD25540EDD5C75E1018F34846404A912F23F580BFFFFAF8CEB875E7274021B5E2B47F794ADB79699D3D1C6D26E0BF46203C3D44227546056CC2708224FF3FF9C5463733F41E10804A4F05F8DB4B2FF72B96BB4CF240A2EF2FBDA20E7C91BD7D4E1F7F322533A03F3368A88DD08C36F21EB76CD59AA5C0C3E2537F7283B6D42F6D24B8979246FB8970B6705B755D5EDEE4D7F71DF1595F9953E954D0775DAE56F184009764B5DF00C136920F887F4D78E8932E671455F98280317FAC41C0F5050E4A1CBB7CE460FE75EF9 Out = E5F790088393EC494F34AF1B4BE73B63666874BF31D74D64C749A0DD067F6BEC681AA3396CCFFEB2E30572C7F9975727EF566827E98CBA94093499E4F666DF3BE4CECBB861AE5BBA78D67B6686690A5A5069D47B1D3757F6BFD28F734A06F9E37980C574D2975F0A9925CA9488A11926DB59F3B00639DF25C3FEC100688AA640AC67C9788103A9BB85D53E2420AB3374953F00D49217A1AB8883B71D46D361E245C6F0A5F68A6154DD94D8380FA853F6517B716278F3CE4C75ADBB27B9F774C2FB749DA9FF98E1E52FA2C0B4746502BF360E77B56E623667395A59F4FCC2EFF4D1C2476B014785404F62AC1570C464BB0DBDB3A767A2D8105BEB89551356289B Seek = 0 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = C1EAE81700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 25226E84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 1 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = EAE81700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 226E84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 2 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = E81700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 6E84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 3 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 1700F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 84529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 4 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 00F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 529A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 5 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = F699ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 9A261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 6 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 99ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 261AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 7 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = ABD728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 1AF51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 8 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = D728F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = F51E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 9 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 28F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 1E429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 10 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = F04E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 429148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 11 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 4E671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 9148A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 12 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 671BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 48A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 13 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 1BC2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = A35B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 14 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = C2623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 5B389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 15 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 623B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 389A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 16 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 3B70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 9A88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 17 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 70BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 88809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 18 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = BE954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 809B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 19 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 954A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 9B75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 20 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 4A9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 75D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 21 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 9CEF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = D983720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 22 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = EF23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 83720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 23 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 23CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 720084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 24 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = CE43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 0084586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 25 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 43D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 84586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 26 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = D492197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 586AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 27 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 92197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 6AD0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 28 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 197DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = D0A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 29 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 7DC55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = A02F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 30 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = C55713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 2F2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 31 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 5713406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 2851CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 32 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 13406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 51CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 33 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 406212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = CD92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 34 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 6212CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 92A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 35 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 12CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = A72372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 36 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = CF1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 2372FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 37 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 1E322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 72FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 38 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 322EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = FAE97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 39 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 2EBEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = E97A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 40 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = BEAE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 7A65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 41 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = AE57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 65539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 42 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 57601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 539219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 43 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 601F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 9219EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 44 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 1F2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 19EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 45 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 2B717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = EA224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 46 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 717AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 224A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 47 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 7AEF4A3DD4EFEC18BD9FA55B226EC129DC Out = 4A9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 48 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = EF4A3DD4EFEC18BD9FA55B226EC129DC Out = 9B1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 49 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 4A3DD4EFEC18BD9FA55B226EC129DC Out = 1BC6C7E8A0586CA4ED37C3D452DA4D Seek = 50 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 3DD4EFEC18BD9FA55B226EC129DC Out = C6C7E8A0586CA4ED37C3D452DA4D Seek = 51 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = D4EFEC18BD9FA55B226EC129DC Out = C7E8A0586CA4ED37C3D452DA4D Seek = 52 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = EFEC18BD9FA55B226EC129DC Out = E8A0586CA4ED37C3D452DA4D Seek = 53 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = EC18BD9FA55B226EC129DC Out = A0586CA4ED37C3D452DA4D Seek = 54 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 18BD9FA55B226EC129DC Out = 586CA4ED37C3D452DA4D Seek = 55 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = BD9FA55B226EC129DC Out = 6CA4ED37C3D452DA4D Seek = 56 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 9FA55B226EC129DC Out = A4ED37C3D452DA4D Seek = 57 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = A55B226EC129DC Out = ED37C3D452DA4D Seek = 58 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 5B226EC129DC Out = 37C3D452DA4D Seek = 59 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 226EC129DC Out = C3D452DA4D Seek = 60 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 6EC129DC Out = D452DA4D Seek = 61 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = C129DC Out = 52DA4D Seek = 62 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = 29DC Out = DA4D Seek = 63 Key = 065EC565D8BC713866CFF86B0ABC2BB1 Nonce = 27100BF3F22105DA In = DC Out = 4D botan-2.4.0/src/tests/data/stream/ofb.vec000066400000000000000000000033011322470703100202160ustar00rootroot00000000000000[OFB(DES)] Key = 0123456789ABCDEF Nonce = 1234567890ABCDEF In = 4E6F77206973207468652074696D6520666F7220616C6C20 Out = F3096249C7F46E5135F24A242EEB3D3F3D6D5BE3255AF8C3 Key = F871822C7FD1D6A3 Nonce = B311792C8BC02EE8 In = B25330D1CAB11FDDFF278192AA2C935A9C7745733E6DA8 Out = 39B9BF284D6DA6E639B8040B8DA01E469DBA4C6E50B1AB Key = 5860F4A413DE6C68 Nonce = 527A1E050A9D71F0 In = 73AD356623A1D6E0717E838B9344B4FFF21BDA Out = 0C06E63E9E81D9976E16D2009255F917797D51 Key = 3307042DC775035E Nonce = 99DE32FF0351509B In = 08A6091FA2987FDC682A8199A6D6BD1F Out = 640B5033DCF26873FA8A34DB644F2BF2 [OFB(AES-128)] Key = 2B7E151628AED2A6ABF7158809CF4F3C Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = 3B3FD92EB72DAD20333449F8E83CFB4A7789508D16918F03F53C52DAC54ED8259740051E9C5FECF64344F7A82260EDCC304C6528F659C77866A510D9C1D6AE5E [OFB(AES-192)] Key = 8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = CDC80D6FDDF18CAB34C25909C99A4174FCC28B8D4C63837C09E81700C11004018D9A9AEAC0F6596F559C6D4DAF59A5F26D9F200857CA6C3E9CAC524BD9ACC92A [OFB(AES-256)] Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = DC7E84BFDA79164B7ECD8486985D38604FEBDC6740D20B3AC88F6AD82A4FB08D71AB47A086E86EEDF39D1C5BBA97C4080126141D67F37BE8538F5A8BE740E484 botan-2.4.0/src/tests/data/stream/rc4.vec000066400000000000000000004217151322470703100201550ustar00rootroot00000000000000[RC4] Key = 0123456789ABCDEF Out = 7494C2E7104B0879 Key = 0000000000000000 Out = DE188941A3375D3A Key = EF012345 Out = D6A141A7EC3C38DFBD61 Key = 0123456789ABCDEF In = 0123456789ABCDEF Out = 75B7878099E0C596 Key = 0123456789ABCDEF In = 0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 Out = 7595C3E6114A09780C4AD452338E1FFD9A1BE9498F813D76533449B6778DCAD8C78A8D2BA9AC66085D0E53D59C26C2D1C490C1EBBE0CE66D1B6B1B13B6B919B847C25A91447A95E75E4EF16779CDE8BF0A95850E32AF9689444FD377108F98FDCBD4E726567500990BCC7E0CA3C4AAA304A387D20F3B8FBBCD42A1BD311D7A4303DDA5AB078896AE80C18B0AF66DFF319616EB784E495AD2CE90D7F772A81747B65F62093B1E0DB9E5BA532FAFEC47508323E671327DF9444432CB7367CEC82F5D44C0D00B67D650A075CD4B70DEDD77EB9B10231B6B5B741347396D62897421D43DF9B42E446E358E9C11A9B2184ECBEF0CD8E7A877EF968F1390EC9B3D35A5585CB009290E2FCDE7B5EC66D9084BE44055A619D9DD7FC3166F9487F7CB272912426445998514C15D53A18C864CE3A2B7555793988126520EACF2E3066E230C91BEE4DD5304F5FD0405B35BD99C73135D3D9BC335EE049EF69B3867BF2D7BD1EAA595D8BFC0066FF8D31509EB0C6CAA006C807A623EF84C3D33C195D23EE320C40DE0558157C822D4B8C569D849AED59D4E0FD7F379586B4B7FF684ED6A189F7486D49B9C4BAD9BA24B96ABF924372C8A8FFFB10D55354900A77A3DB5F205E1B99FCD8660863A159AD4ABE40FA48934163DDDE542A6585540FD683CBFD8C00F12129A284DEACC4CDEFE58BE7137541C047126C8D49E2755AB181AB7E940B0C0 Key = 2E Out = 7D0EBD8586251EBA5612E7F0AE1461B85E7D6D01870ED72CAE875737359780097099D507F3F9 Key = 395C Out = 9E10A6E1E7C66081EE6B06A86F27B31528029DB35C156E571A7A39E09CD7FDF706DE80056CFE Key = FEF6A9 Out = 193FBAE8145757A70ABF7E4B5DA4BAD3C8208916085ED2462C901EF01FE42818B027A6E0EB2B Key = 547BD96F Out = EB75D7A79E5F7C25156A5A63FECD9A6A67F48B97448EE49C3E3311C940ECE6D317F7CADDAEB6 Key = 284CD53FE9 Out = 39979C6BC7B8DC7243AD1148C1AC76899922F9759DF1988CE2FEFE0FF91CF7E908F30777BBC6 Key = DE8C6ABE0052 Out = 309D05E88D1A980CDBB341930F0086CB0672C85F37BDFC2CDC36D80044AF6B02E3475E3D2712 Key = B4D915156C6488 Out = F409D463A1293AD11F4021982B7397D554F504E80C3AC0A6DC5C54CDDD090309BE00F9213E5E Key = 68B5FEF1FBC10AB4 Out = F76241985FDD3668E0860D9396012F61F338EC7E41CC23BFD0B62869119560DC2A0604CB3C6A Key = EC498E2BCA7AC2BB9D Out = 61FDF65602F7A63ADF57B05792F6C3642241EF46B97CD86171AED28D26D67BFD6E1E66C7ECF8 Key = 169D98FB855CDD15E205 Out = 75258D597494A88866F4FE45B09ED2BE41D49B7D653539508B4BA1A3B6F9A08C3C103267D820 Key = 0C5710A5843C9AA2C675BB Out = 9FD90A643014F30D5D2BDCCBC37212904F0AD69FB23637B0FBCFA2B6E61A2A7B8DD9B6B3A344 Key = 837C0042EEA1A15CA24AD014 Out = 3E04F9E7804F3F8267B2F5EABF4722183BCB17266F81EBE3A3EE8B00D5C9A727105F43131667 Key = 4B5509356362D35FA63C5B8C44 Out = FA9B2426AF83EC289356B58006370907DD5D8A7C1BA887F188B7F695DEB96F3DE94E5AF4DEA0 Key = 3F6CEBC8C94447FAAF9CEC4E778A Out = 80ABD7170971295FA8D525B1EBB8CE95829CBC9C81AAD2472DEBED0F087558433B84E11CE574 Key = E0A97B4D129FB0BFDCAB24076DD5C2 Out = 0C3E9A53C6862E2121F3D089737FF54F96916E469BDE5A645FA134ED4DDF76AB41B569649A98 Key = 97CD440324DA5FD1F7955C1C13B6B466 Out = A68686B04D686AA107BD8D4CAB191A3EEC0A6294BC78B60F65C25CB47BD7BB3A48EFC4D26BE4 Key = 31DE7ED3BEB6EAF9131922D06201A19366 Out = 07001BC046443693F173F723638A685CEB7DF1CD61D4E93A52E44B914063903A578138EA0FD8 Key = 368C7A9662385B308F696A0C58E5E57E768E Out = 8C68C80B6A01A6571642966D601BABA39B1644177C7C3B35A9D91669F7AE8D22A57308D05F1A Key = F745ADBD90EF249FFC14183A9E20F69BC68214 Out = 2A0BDB20E12B4BAA2E8C3D40B333B55ABBD0A156826BFBFDDE066F9D73398841E4A38CB78B5D Key = 872DE53D5116911D916A947041D22A0D50B7A5C1 Out = 64ED1979AA8B458EE96EEC995E4EF2894DE0D029B1C0DA497A9BD7A81ECE4A408C253E9DA074 Key = 27FBBBE2EEC453C3D5970A6BAF03FFE299EED3FEFF Out = DE31449883D5E651E6F889E2F18C453F06276D13999607FADC393A2619DAF7E2182C214872C5 Key = 1BCEBC37EF602F758CDFBFA1F1BCA61AEBEFDD79B179 Out = 81570047B8BB9E5968B15F9C286F3F2B6264F8BCEE5C64A698BB2F35B697E32FAE6372BD07A7 Key = 6FBC9F1E72F7E6EE8D233C4B27EFB98351B5FEAE803732 Out = 0D8BBBA8FEE3CCEE8CBB3548F52AA85D9FFA58E50655E19FFA31DFCC97F65116DA34BA775559 Key = 852F2F3CA64B0C256B080A577E135A54B01D9079A8785EF6 Out = FA087B45D61566E102A2B099CCA04A499191C54BE21C67C17D40A2EE81B0AE1F525AD7E61BEE Key = 8EB43FD27CF769A39BBF2FE02B9E4C6ABEE996DE591E5FC521 Out = 0E79E4BD49A8CFC6BD1031FDB6DF4BBCDB96D64967AD1710C3BD96A8287064B211A984C82C4D Key = C3CB4048B42619DBB1A16373749B8264960CF7CBB1EB6D3565BD Out = B420CB807A85D5EF897AE3EC7C7CA53EB2580F11B9C815DC6870FD3D0DAEB8EFE5AA28DF2E9C Key = A7F0BD928BBA925A49B117ACDAA68702B4D4342F8FD62503319BF8 Out = 92762FCEB9FC304D2FF7994AA435E4774FFC1D97C9CB36F89722AED507310EBF028EDB0F6323 Key = 3BC2C34F2653E210A1E15282FFA01149DF53AA6BFAF5FE04523DB614 Out = 978D46FC073896B8875C7D4EB2F7EA35F58877550071F056584DC59E722E850E4E0DE75ECFF9 Key = 6538CBE80D306CD6AB1F027E4EFCAB804D407B00B281240B33A8C7F40D Out = AE6AFEAF83A30B85D865FDC86362F95642E7A9CD157DA2F12ACFE9A718F3FB996C1C222B2432 Key = B7793A33C33FE1C3EE024A7EE40BBD13ACEB02049159717F35279D67F730 Out = D4192C0818E7E4CA10AD05FBB3181C41C4D0BEA1805A883708FDE321B70D6C7D8B5601079D7C Key = 0C9856E6B845A33EECC0F30BF1974DB4DB088BF02314EE48FC369B6515994F Out = 65029B1DD806694E4AEF4B63016D0685A8EEB682E86353C049378EC540BC0F4BB682740E3534 Key = CC26F0F11FF7759081CC87B0296E46E1A29611FA042C0F09033F12FD06468624 Out = F33562228D9339F23EFE694E45A6A5B4457F2865061384B064DD45321D399FD1DB1C3CCBE64B Key = 51 In = 5EF2DE98C92BAE4C15CC2194D37ED3558A44B6FBC7EEF695E85E33DCE1C2CB8CE0779A73D6DCCD1B906CE940A4FD19C4436A7832D4BDF5EC87AC472BB281DE038D3A20DDB8791B2E12EE0B2B3D273F14D90EDF7F07D32E03D74B261F5E501C0D6DAAAEA6E2474379AA983A54BBCFBCE08E6FE0E48959F7DEEFC0CF9FF10FB67DEB51F78248D650D2432BB1FECBAC3347C541BAFFDF0E707289EB0CDD8C5FE960C5C8206D3DA9D4A2B43A9A3D2F449A7C2834C152E1A07DABF6BBD7BCF931E238BB759D4005E540612A8F7921D368B906586A06AE9ED078C509E4AE7678F01F8ACB681AABACD3D644D9579AE28937405F59161E45123CC61385B1BFC75B738D21CDF690B5D041AE425D1ED7C9CA20583B79AC7BD28135CE4B9C1012A8FB7A7791F3B016AE27872CFA7F7BA29D5E1C267CB30E2E7238CDA5FD6BCC1C904AF236EF9E7A88EC71DB8700A7FF0BDF09FB24110B121DB825FAF79FC7587F0D8853AE90CAA6F479F5D3E221E4C832E27B6DE7340850F2231AE13AFC8E9C94E73BE0F631EE0549622A3BCB2C79C7D6440F694C77DD66E9F98A5CF1ECC80EC3F7D0D0A14B6D4BFC1BFA5DEC3743743F7893E94AE563217546653E2F75271B1CE5B3DFDC01B0A3A5AE6E4796B26F8059B1B35BBD760A08B48BC60323BA42C8224E7EBEF5C3364544AB3D4C8D93A7805429F787EE5B57D85A570F05268B8FCADB24F16FD4BB95BEFDEAC40C50C55EE32988E7B15334449F78ECA703A61260FAAE9F695715637732837FA0559B6B6BB602D55915B7E401E2B53151D3633A933B786210794111073B3238D16CA7B14D0993CEB7F04A7EC1515B1E79F4BF518B2195A29A5F59F7595CCBB04314535BA452351D23811E01CED3E086F2A6132294541DFBBB6352D0D58AC70AFE2C187842CC606C59527F3EEF330FE4923DA3D0CB838C7DBEEA26EAFC032F3C15C80FFA09C9342A8910A968412DC31247831F1C2CE9B5ECF365A84880DABEB08213F6EBEF78D42899DF0A21349BB01ADEB9AB51B1C312EF0F5E80E03BDC84CA28AA4F662F7FEF874F8572956F44F49477092F45E0254CD941B70964706677C50E9D0B98A6CF838FF4FF81E60E0CC4706F0701AD520DA6D6123BF6983EFCA5F081AE9E548464BC049BB66C28551D79F8FF465E406A12E5605FD236C57BB7000BDBCB52429F2C2CA5B257BF065CABD0B19D4F1AFB91985FA20248BEAB707527B40ED4B79CFA28329B4A2A83018DD00665EBA2E4F7304D665BBF4E05A179A0C0D78449A4A72493390B7DA66F2A0206B8655714BCFF0E5804CE02EF3B718A14F7A1882EB763701CD6064409B545303F5473659959F9219D5AE51E978525D1D564DDD6A4408D3E47AADF8870DF2B1AE657B1C077BCC231F70422FE0BA5E86A7C82AE64A6D8739A57EF629C7D4BE277E6F5BE859F17AC4D960CBD09B13856 Out = FCDD62469810ECE85ADBE33A4D967BAE4FF6B63C6F0D7CD6116228D7DEFF2F741D7FDE4DFEFE48DC89046222B23EA184B1E15BB70C2293CD25AC3C047BD0B53A246A78DCA3482E752FBDECC16104C9067ACDFE811D3537AA7AA750C10050A6746DE68F6B543BAC92C42E5F8A946A2CC843D679508A8FEB5D1904C5E61C151E5899849C3FE54700BCBBD009E10824953C41D367470690959E951AD644D05999FC8ACC64A61F2889794235403EFE4B55AECF2DCE5EC6ACE52AB1ECD8B8E931DD8F05E783CE446DFD41D7B4456CFED0E54838E38F4CADF51E33DED230D42300192F8E1B6D8C7E78E5C94AD4C0227EB8AAC759CE436DBD22025D0B1D014898AD77902BC77DF45F137F51277AC6AA476AAB193EFDFE0ADC781DE75050409A94B9B41C6EBC99CA065D99C5E6DDE5EFA43BF3F7A011DB66713D44DBE5C818C29B89B37F2A17108D53DE0CE4D9FE3BF7480BB65E18B5531A410C5060B0F16715D499C2FCB6B6C3506F1E6193B629572843888C18D796DD5D5F7C4A62C658869B00EF502C620E110E5D9E2DB8729E4CE731925FE2F41D16A3B5A9B7B9A2062E96AC93A0F4A3C17988E46002EC10556DD0936444BFD2ED9C1F7D64FACB3439842763EA0D6554ECAE5515ACE0387B1A96999D218C8F97151B0C9CEAC62AF1D05E7553909D789F9C6FBF0C8CB0921168675DF8A28A7A4A6125324BA9B5C5BACE51DBA568C25D77947D8781538A9BC667129C25DA915C70F2E0BEE3823986BE2C3B0D84667BD0DE153EACF7A34AF495AF62452A2C3999886AA2F032C212DB60E6E85A9ECEF1FC7EAC3AF28E4F56B0A432AE32A2F239EDD233375CE3C62F77D976FF44B4132779189C0B2AB6316E057353ECE809188EFD7BFE1D1F845789386A860705BA66A9AFF09D1F05A542C86C96083D1317C9053467621F6CC34469A0F61220E5CCD460F9144710571D5D920D70CE7687CA0CC3838C1B7A27D915BFB071036962F7D3672D2FBD13E360980CB484CF9155ED528489A684E4C69262021C9E77F094D1449E8D8F9D358B4DD8B4F7E4148AED8FC6265C1975675C67E5674E4976A64BE3231191EBA7D379451176A02052D0A7AF4676B044414C0ECC075E9D67B117E225D0669F5676ECCF3F2E3EE1A30AB100FF777CE9C51C78396051BD4D747B7B167D8D897FFA0DE5F31862FA55741CFA45E1C8AD935EDC6F734989CA9072F1F6148D133C09E6EB797A723DF2B45DB4475AA127273A3977C1913860BACD285741E261750B2B7921DF53AE1F51538C328F94A3FB04C7EAE66E1AAEFF01C02CF4EB6EAAA0D5EF2784414D2E3FDC6285B9F4713ED629F100AFBAAEFF74E9F9C35ADE18142C4DDDBEC330AF3FCB6F3E77F05F2D773B6BA545DBD4BD13AC2E1D2B300BA4C1614E779E761A9765D5C6F15EBB6A769290B3ACC8074761189F3DA0F3A4A804C2C3472E Key = 257F In = 4F3657558B507F48C7E1C7D78C396B6ECCCD236154C94EC67D72A17E02AD38EB5719E50B558E5AAA4A6364670A195AD3B932B1994BAA9ED914E11B939D92EC42DD4EA4F4D117FB286C3434EE551884EA3CB4E6C83320AFD10A4BEED39E96E5D04257934E33E13296A18674393A3A5F23B6ABEE2044322ABA0A4211F604B698FAB9296D86D2FFB41AA0AF73BE170193B486A37797819E21803851947EB4EED45AA56F0E9B1189A72DFA2690355220C122FF3AAA584849C65090DAD778E3876D0E7461A459BC80CB334B3D9DF4984ADA808137DFD32BCDFFB7C59D7F15F239367B0C883994FA4EBCBE89FE18BFBDAB6924F03FFE95C621C71D956809734B33398460DB4ADCDC0598BDCFFA0311B4E35E570F89FEF167861CD57BB1A48764AE557CA475DA66021BF503E5EF5EB6F40260EF2B8018916314459DDC1FAE820C492545F20F9A5F284A465DC1675150E7707F38C690E8FF050168EE5EEACD67DD48174A80144A057F5EBBB0B3A1D65D61AEF93532CC008DA66196D5B1200FCED7ACD48F2E9535A3F08D6CCB2F6E20983676244BF3F0C97CF22E496C99A9DCB8C76140C7924B54F95A859C088CCAA8B3B925AFF6393BDAA9333346D1F3D18E6525C5C5584C6BA634AC4658543CEE45121B5663FD99C106AB4479D844442C6577A28CA84C8D41AC3D05210E3994A793E238EFA2797474D770CA030B092E835524B843970FBBA98B01C5FD64844EC271C2924B20AE17EF7EBB472418FB9D31E6F7F065B40950536B697DD773F2C0C1E0FECCDEEF17AFCEFB8297219BB258870D32AABC8A91E4710B37723228113D5C9504005014D0358B133217CDCDEB164E02F57F30F7F6316B5BD82255D7EADF98E27007E834E98A4AAE8EA0B42AA51B316C4D5201EB3F2CDC70A35D719A99DDBF0F4078598E1B5233387E20384932E4A59D9FAE8D3A4AF93D25BD5C18199353FBB488D9996D44F0889C572DD74AC545BE159862352D3948EDF79085D812FA9CB1CB2A42A1AAC3E9D490DE90BABAB42B66C13618C18BB6606DB69FF9A737129F70C27828E95A8450ABF1F18B5C271C0A48A63490BA622976FB7EA3BEF37A4AE7C6350E39A1ADAE2018F6003A7C5CFEBC7E0D934D019FC9E1F1187CAE86FD50CF003F08EB7F139078EDAD295FA175FF3F6E79FC015B37000DEA64AED28598FA4DE06EB62163B18FEC329C702F9EDB7561645143ED8027BD7863396F4164C632827E90724298A24DEE1450A11F737C7B7DE56666DFDDADE45345961FE7DD9F95DCC7A5DBA76309F6594E169B8706C21B19AFA85E312BA656078E7C072C125B3233C66A130249BEA9B8C33D501ADE4F1A03747B1BA0C7BA9240C9D2DCD339158C52CB46238D09DCDB6B9090B797ACAACDA233AC4FD5C796AA722F352BF3766C673060DBC7901EA9827FA7ACDB32C64E7D58966306E8959A27 Out = FD33B57D9ABE946FD81156CF3F6475849F742B7FFA9250B1E1A4546416A479A20C959E45E7D623279E762C85986D22B42F6E64C0F118994A540304E94FAE195691F858F77C2B12772B888D2380344DB66003BAD5D0E305396255004C468A7290852B02C6E4A920C7EFB3B448E6334191A8A1CF19BC3A70851FFF422C45B133555BA01BBE9D06D685665FC58A7CBCA76EF2B22C14504A5AC9DD8BE5B4DC317B1E70E65194C04DB27600929221DE48D4B90F1A28F05B801580DC23BB79CA62AE7B2FD9CE99D195A05776A7C779AF8ACFFA9B78F3C09B0036A875F7C837776EDC0DB1997C98B8905896BE04A6FD1B408DC26926513D91A5E32BDD1E51D9E99284A2F32959E3282D4B8858EA237DF3B4AA3A493D196734DC11362B67CF20276C48BB1CAA07CEB2FA37927773A0EE3F8C18D7760907A1677A3C75B6FB07E98809C56E9D7AB64997CF6F54B292E56759E54A33132BFAFA5FFA7183638A66D436E70616CC4A5724103A7FD3D5B61924A6B6DEFBE6200124EBEC929F61FCFF582766C2B5F78AB953835BC1FF7DA76701A0933A91DF9F2ED680E60EF410C96DD9C7E72C773DA3CC610F80E9134A8075375B921A03FFA555C3C26A027543DC6DA55ED6F6FB6DB10B34075E4057F74C01A97B9BC5A5B05B83A112FAAB2B975D3062A63534E38C9969E5374698BB585B0C470FA1F74561C1CDF939C7E77CEC8A49F5667B08A6DE363D36B93FD2F719DDC27112DDF10DBA73CFB886834510E833A45C8835EBC19904D911FCFB10112D0E6E4F636DF88D9FE028E79F5A0818CA520AB3E9D4E049BF574B8B2F1C196E8A69137B497E11F3EFEFB750315254FB218411F5A7604FB6BE3F2FC63F1ED170A1C53AF8273CAC3780C23974C98BAC1902754A672ACD09FDFBA2DD1B72B301A80B7F1EF004A08DA13AFF02F4AA8DF711480925C322D43EC25242D0FDD4420E200DF964F6CCB4CE2FA5CD9071E2DA17B6A06492D99AB4E24810BF4132C1B73AE746D3864AF44D88B08AC3CAE02E1DC44BA8AF450537B7C2642B7BD4731E14D3927729A65411851B76823324457A3A16DDEC2D3B304E5F8CF9823E5A062439B5953F6ED9A7EF0FAF93F629FED8E71D024521C6AA922B03C4267B964C65E83D9C2CF16067ED6EEAE9EFD3A3843085597A683CD80E91858DCF5C04AF5E1AD937C4B4DB4EF30B495E873D0A92636AC2EF4F6A1F9A26A99620E6803C1BA230C50D339039D4DF0E3C718AF32F24D80EFB446C160F8F5D3030172F924B8CC3996D454BDA5E958498823D86AE9E55292D33E6E7ECC0CBEA239ABD10334AB9A3FB1763AE997F5F4764637C7D6137531E4D8EAD4D05C39D825CFC3FB16FA17A760C9BEB4516563AD0C40AC607FB616E9845DF833B989207579F5A32A29FB54E6D5D7FFB90FBEF64128957BEDEBE936293268BCE7FE0E8C455218B1DB7EF Key = D746FC In = 8554C25CEA8F0E19357FABADD66C519E97622F36CBE09828CB271DA5EE14DD3451CC8FD2542145EAF13D7AD49A42B7092ABABF1C8796CE4B3C4A16BDA80FEC5F69049F2B94550283E5626B0443F32FEDAA5C5BED3AD64E8D6C1DCD3C7C2C5CD3B38907653CED0D7E6BBB25686654DC0167C0B0994C274F645F2AB1947C56CC64AE8E920C24690ECC1AC67DC4B95E69F321232E71A6B859FFEE32657FAFE512B4BD33303C0838EF3E275562E09373A7E431E552489DE6284B58299058993A44509F2E10B07B3DFA7B20103FB9497E6BFA6353C930A0F9D565A12F241697637E7ED81D1BD5E609787F79A0C95C1B18422A42D7690DE2288F5E5C8E0AA8BEB5B3A68ED358E3196CA20AF163C20316B8E64216581DDBE553EF330A717DABBE0AD1209B9A541A7BDBE70A22D77995BE26D99E3903C0E251CBC7990AD08489431C8BD80AB62D63179EC93E5EDA73E46B22B4D518B8765C2C0B3736817A9EA60C86A86A1A69BB7C3E2D05AE0AE4313B2C766DEA92481C7A7786EA82EDA96EA50964765A171D552037415A3D7F20B19104C7565265BCF660B4685B66707EB778E39B5B34D551729CB39C8C4AD50E68FE2B988EA8F770749A336F79189D6B157E9F64D17BFE477F7ED5997918C18E0CAFB2C7652CE554FAE70C52CD7A7319F768AC001C7C2D60C567D9D9A6501640544004A38243B4EFC37425A46ABA7BA98BDBC2CD7F106F69485819DA79FB483C2B50FFAF67EE27A4D0C184B20E98D9CD859FF2A336C1544745EF4EFD79A9906BC3B9D5B5E358BA1FDE3101D0B27E9F0251EBE26EAE239EE8393E1DFF8947E6036FE4293253D223E89E7F6B439E1FA8C67A9440DCF5C40BD7744275E66EEC2175706046F67A55B8580A8D902F342E24A76509077AB3C2272AC4874E52E15644A35A78D57C650692B297EBB6C9DA215357567EFDD6D2A64634C2F0FBDC39BFB6EF17079805A0D9C2506DCCF9C858441E2478B49030F0A741EE8303D3EDA6FE0D82EDFD38D5F66AEC10AAB25AC72E39A46E0EDDA0AAFBA16F9CCDE84316195655569EAF463D2E046E3E9A2D56E78E8D495BA69BF997BD972BB724901CCDDBA065491D7595211995C6F44644C63E275FE1EE3F2A6C61BDB05E7223CAF113EBD060D9740344BF8FD878E820331427DB67DDF921DCD27C08C5B176B86407578907ECD6A561AA6CC206CA6CE5F8BBCDB7CE3797D0111BC52DD1FF4082D6AF0D65001C9A13F42F4F66CCC9079FCE07AE288EBA8735B7D983D8E3038B4A774DDA3A162AC943D27F8BB41C90E14422E69E2DDD726819F613F08B1D2D7DC25634035B5BAF6CC0AAD642160DFDBF3B3862ECAA88493F9153A5371469212FE7A223FF11A85C08D4D8834F2D3744F6975D06C9522505B0D10744FA476690E9885D995777C6DCD79A0F49FDBB44ED03936A0F2629E4BD4483F94CA76DBC Out = 4BB0E901B9BE38A39A8E116C77C05704C8293F44D394ADB23B0E87AE8C66D9A9BDFD51BD5CFD6ED04FF5366723074327E923BB63E200698184BBC24A47DEAEA92CFE39A9AC48F22A1E0B76A35B9729F8A14AC41B430FD4373B2C4D2AAA7560E3D60FF4EB63D1AE440C8271E3339C716B592F1857BD63D9951FC38D334F75987FA381DDDD324D62DC9D1564EA417BEAE82B0F8D5D138419BE02E69FCED4DAD1D4991DF70B701896E180ABFACCBD4CFC07E07D23625371EE0199D6C7BF146E2987CFCE31EFEF4D6305682DE92015362FB1926822C672920359932AEA49C9969CD958742BF7B436F03734B3E0B899A513D3B6DAC6A715633BFA7B30DB6988EA2E14EDE3095267BB5407CF7C8B693A06227E990B256A3CF18D64FE3D2EA8D4D168B0DE71876F3A77F3563739C5A0754823B97BEB1B16B32804DF7623888D57E6877B2040E68BD1328A69A3F6F9F3796EB8300D53C68F8189D93A11EDBE4608175C3D2522CB0CA8BEF0D0FB752EC50CCC7ED709EE5CE90CF44F788DB78613692ACE14A617973914D9916D4FFDAA07D50673A5F0A60AC73031D3A96E89320C7A81A42D3246D95099219F85FE5BA00631D833DCFDA19A029A7670F848CF16BBD271E64C8BD741DEEF9871AAA68B10C08A64A3BFE2F99D7D04CB86A1F0CABE561654553131B3F903D420F2CE748068A81AA833609693C633F04BC1DF7BC391B2DF083B84CC9D4E14F3803E704720D7C884E5026861033582D0E854D61C766274FCFB8C8ED428C5B9F2C8FAE0111611EE0A0278B72DC305033F51545744AF98C6DC2F721CC42F71531D3FC8C0E003B6C9E65BA3588C42669BA65D3662160A8A6CD0B652F87FBEBA6F4FBD0499AA4D8B06B9B67F4F0144CFD8AB517C86B68F2D648E161029EED96979C24F0C64D232D4E162C5EC93E2F5C8483920DE7FF0B23CE3FCB6E8675435D579031B36A10B08A4AAF16B563DDC94C8C5C922D7AD8C72FB15070E00D1B9AA09C8F693CD179E8C3CDAAC20FE4CEC4F14DE10478C419359A8543AAE601DF2C1205BE051A1BBF572E257DB5EF8C8659B6BA93683C76A6979BCE9AD27C3DC4BDAC4122EC8FF7FE53FC651EE4B68AD38502157027F7741B30F013F0DF3D2BB14764355FD6CFCFC855B838A18F06896817E9E1252E1F466408FE09184601DCF3B0EA47C62AF09B84F890E5F94A8A6F94614E9BFC5A6EDFD2E7F2869ECEB8F03BDA424E2FCEB9FBD676A3C051690E555DCEA6C124681D1255C2E0661B1023C15BF071B3EE3A8E8E6DA8DE8AEC78EC3CF9C7A1C9EB23B8B706FD5E8703EA10A1F6FB29A0D42139D1D6EBD7EB145EA565ECE19A44854748908BDA769E9634DE30E3F06F3216D121A92323CA73374371012BE9BE82B158BCF9B634192A6D58538C3208DC6DEC7A9BFA83905A69E9D6F78E2885499885B5FD8E88305BBCD2192216F Key = 48B842FA In = 72DA33B988192326A043A7B70419ABD6B89BF899D19E0AF5C1ABF6B3A2842492BA6D4F254E7BACCD74646BD6560FC87AD5E59B77750437045BDF17CAEFCEF0B07983BFC470A9F034BEC6218A012EE7E6109E83849B5890833B5D2EC79A5D3570C7AF5DC8ECA37F4475A352FEEF4BD0C33F31958D2E99113467D30CBCB9F6DABFA01D3728FDCB13B6ABC5DA6C7F470DCB2055DBAA0E77989399AC345739674F4F4AB66C4D7B2D9F04DA0808848108DDCF1C6D70190A66FDF84D5B5F19FFFB0CB28D47731EADBF183740E0E06CB33CBA47ADE2781EEE9A7B13335F4A7C629B2A1E808D92AEECBDB969659E67F93FE25E6A86EA9D471E5361FA961C35768AD89D8DA6AB16B9C1C4690C8AF23798AC217DCD23F77DA4F531CA9C25FD73C6EEDC174AC61B1D38BAAB4238AAF93A336DDA9C21981EB80957059FFFA939D1A5FD2F6FA6131880E59C5CCB6A6FB73B077172AE85E6EB0700A3BA09C9DBB0699628B24C8A50D57C5C6C8C9CFC6ED3B8FC8213BFB0D2277BE162E390DA561A1787B6029A6908718A180046CC777087E271859C190C1B6F517EAE660FF7CB950BFC3B8E572BAADB121B6E68077632AD28D27866D7A76F854808C68E69F3620E079A99839CAC76E31F259CCB1A9CC04C05E2E74AB9323C619C0EC6E5744EBC1A22F951544D5B4AEC306D8921BF6FAD4E749A3FE25B7B8F206B558F14BFEDA34D29793AC53A4ACB9E519C05D0EEB9C22F785ADCA395EB0E7C2F6D19D1C10FEC2A3EBA50A47990B64C108294AE6B26A7E3805E5599596DB55D2D820BFC27DDFAAEC08970144DEACCA2544CB758EAAEA728B10ADC70686A07F4AE77B14F2D58BE107160D738FD53A5BA74A1ACCFC1A7E90B888F397C4807BD347BA9739F2EA7421016EE9520E217CC7390A2C68655F7645D1B8B44FA61AADC92FCA2DFAD3954E41DB3A15E1C7E529A32D6ABB68A636BE55384603CB605F6A42F8B4FFBE795F8F644588A27A7C3C406179C8E4128585D2980D51DDB831D3BE643D180CA129C183337E08E3257201D77D56F84A8DB60582DE8941F70618DADA81C33AAEB0D9D0F2A3C5E60A8042C329668EFAF8E50F72C806E2F17B785B355F2CDAB7E5FC75F86BE10ED77C98234CE7881311A9639CFE5BE4373348922B0B4F368C376B8A20E04E154FB6F2AD6954A7B8FED2DB2FFC94EFDDEB0BDE09EA6D64BAE5D670F4DD245E253F99341C1F80117598F9A5C404AAE1EF5C8B225326A5F1E4B37315A328D635FFA212BAD1495AB583D1286439024C6C0C9BCA7AEBD4607CA2AB18069B216E289812B847B33EF52F0ADE59A5A44AC63174DAA82CE6C1B80BC8440A814C18E5811FF086188C4EFEFB2692BD3C6B7B4A6438C61B29093E62666F5B760354DA1927D97E0E807D6885F44FEFC453A6397BAAE5A9F8BA53E8FE56895831D6B1A2DA44DFD3046881BCCEF Out = E2B67D05FAE6CECFECDE72E33A41696FCDB48CC035033C1F53A8F6B4C1BA0824D7D553197FBC22859B2B32BF2A636DE8F1999D54CB973CFF9D633D39F8F7C32E4D6248CECEA4222ABC898FEB6764D4FD192758D14CB0EF7881C50E1FA07C0705AC4533B6536EB7FF6A430D8CD4A145E156796B5D280C5933F69E813E642ABD145E43A03CC1ABD26FD5F0C6430C5656998BCC126D522D56562DA04C6AE0B19293CB11E2A06765C64C18B20E5BBAED65E46807C0513E6BA36E3231A28B426D62720278CC4986E1CF3F71C42D4F1CD45D7477475E7919E353FB498CF32BD81CFA4084BE21D8698F2040BA110A32DAF535E1B1F4D6FD3A7278E55EB5314CD460B39704FFB019F1004176451F029D473458CE705E62F2A461DC2EAE9DBA2BBEE77ABB320C6FAF2FCC5CE8DAEF599E3D37915545332EF305D8386F34C5D9A2DCE8FCDA1A3517821B761856D777E311F918761C873DFF638D806967DFA28D5213A2C17DBFA0BAB947B7FDEEB4F6648F2F415FF09947E6E3EC01EAA96AE03C6D07BEA5FF5599A47E23389A2D00577175FDA3620B4A3AC3C22092E8829CC12814976E38A5412D8C8795C3EE89B76C8678FA6273C06F12AB9121BDA619948E1F2EB6D6C46844642C532E03E4494CD7D89E7479F2B75CF3D1B072FAEC4E293B50E45DDE6936485EDFD091999899AB44059E192AB81F6661FF98C5DA37C545980721C6741FD0CD84F65AD04DAA49CE4F494BE674CCE1212FB868F22E81097E1B3D16C9EB43035979DE7FF557A5540A36E42A0BE4940280D3837C46115AF90F8873AC0F26FC265DC0250FA0DC894B16CB77E0A5C80F4E86EF503DB8A42DCD9F800AB108EFB8CAC4C3CB2683D73C1B4EEDBC3F80547C167F7B72DD0AED7E5980174124812AA97FF26F1AB6242A387F8C5C921A93BBF6B132D20C3797035A131408561E5E2C51D7629DB47684D76672A5B508E9A59AAB30C2E2E207689DB69F8F3D8F79A2142A8CDFD8D251DA941FE8BAFA507E9E8A7C69D6D16A272594CF0218052B981C0080676DD245F419276E9E07D8983F9688FC8CD9AB9B16756CABD21DD320A6A435EF40C4C88CCE50A98D79FC0EA58BDB4F11431AF00D4921B0A49995A9CAD78CB228A8274B7272E3F82671258418592D03008715A1216DF499197946B661293729DFAFA6239482EBEC503B7836E4B7B20E47C2FE6BF62C845B9227069742B654056A4F31A0B4937F105608392125E63E82F9045A54799E4DE18D8010AB5E3E3B9FF008D494DFB5A2041A6A5B89CE72F68F777A8DA398ED66ED6637AD105871A1BCD7679F55AF3989CD3603836E9636C8A1ABEF86D4AD3F6AFECB1D6417C7030CA8AC09E3C15E9C275477097D77FD32509B7643C5B96DD9F9213DE07A083B5A8E5FDCBF4A41890D4D1B854604BBEFAB06B598D3193E57570FD137372DFBF983819CE35A Key = B2771B8F57 In = F3F1796F6C00243B96CF802443D16F213BE4D527551102892AA6BFED3FE95B1A4B3E0E3C52B1D32595B83D7575379B34C36F4ACA0CF3D9CCBA91AC0DF206D9A98B39B48EC8F168FEE924E14CD9DB1700333EE88992667774D31B42FCCA673A3C1A0F72473FACF463578619C8828604F056EC6948DD3B6A12F7C92AF902F3F6C8DD2309D9B1DE9A2B83AAA8F3DC15B5D2B1ADD86077CEF3446538F7CFD4469A031F91717A87C23473B8B6D2961484D675C0AA938207C326C1A9869180922864D9E5B57361CF9004B613EBB2F75CAE2CA11D6EDE4944F54CD8CFDDA923BE42908EE94E8AF664CB9E4CCC86B31605C0FBEA52DCD22DD1827BB361F13C8558AA6087A420C3E2D6D7A67CD1DA849456EF7CBF827BF856FC397B8F921819F6FACF26240D89D7B9365589240CA03C30B2FE3D29B2E5889C683D6EFFF09F90385AA6B518AD5C0F581788D9D6F0B20FF8D2C05F16BC766C10775307FD80FF2DEDBC64202527149547D784C7A97FF8AAF03820E8D3CE6D94FE8F4F09961BAB6ECE873A099F49511A4F1AA527A0294F9D4C2C7CC13B66BFF754CA60EF76D0678AB6C247027C5658506EA706784543083F83E6F11B3310C0375BA203A857C87F846727DCED355AE64773262F863258C77B8A3A8466283B5702C45FF6BEC024DF5E0D72BA36D81482A0B4E15EF0FE18609F925B94BD8D42A9CED97E32DE17D90B8ACC07233F0A684FB85EEA4EB25A5F9F29B3B8897C8E735114BBE4162869C1CC53908894A392F15B49CB1684A03822D0E02F1C89AF37BD4A22451145A97D28DB88E3E85E9D17AC0BFAA8575676F4E132B20CC91C946FC973DB2B2E8EA35EF7B8CD1AE83951CD62AE825F5209B1705A6FF0DBEF9D3D350426E5849A26CF767E44E9527D9DB39C7E19B79876CFB38B26FBF3F3017671ED423FE20DF87A39BBA1463E894FC1B713D01E79488B4B751856D8AE2675B136FCADFC0251C30FC472302368419452CE227BE74A3E167A76BF8B9B225A57781CAAF79EFB924E4A050D1FCD723550205D04C17E4C865302F8C09CA68903D271C4A3AB420255B69A7C7879C7411D6F2BFBC1E3EC555DB70D8536ABBC9CA80E620ADFCC00C088A910E686161DC9D6E383C74283A0348D7D3C49EF028A549A5D9849CCED60064C25ABDBDAD3578013B4CFC4939A30FE1F5D043E119CE8BA1B8CC67F23EEBF06C08DDB254693C3F66DA3E45739D284E2D797C3FDBD3517830674EBBCD92E1C87BDDFF9C477C061BE575866AD1D6D81C5CDE36F32204A6ADC96CFB0019E2A74742FA541BE8FB5F6A73928E5AB1A21489F8E385391261392A04241140D7EE97C57391B857C6D8599DA250270A2C07F3F05D64495F2E4FDFE7336022443343E7BFA9FC10077B2357406B968208775A2B0E07F657153B4AB3206EA83984EE3A5D03DAF44BF30AFF2F181BD2A1F02B4 Out = 12E5CF2EEF42624BC53D8A0FEA029E604CC6D20FA927ABC186E00771A634C5002012D6AADD89C5192C56B8E3E4B54DCF041056188A5671CCE981D4A02137DF7F40533A760D200648F24D5C18BB08E3A694730EF165A1AAD4A117B8D800D0B8ED9F6AAC1D9850A0E12CE815796D5220376226A5F29232810EE969E537459546110B9B747C1F0E441E59682216F27192E69C7034EDA3FD3BF7B9F4D2EE0688A5FA20607FE37C5BE1051F5AC439903794F7C4F34C97E88CA61FFB46D948E5C78937DD683F5EFF633AD94015B51B9244C0B83313CCE16FECE79FD5BD26DCBAFC05E1A34DF5AF398E09599E9CE94158D2FEA6F0E86C7B054DAEB531A1E836E05B1CCCF2E9F8AF048C94CA1EBAE9FE7503F367FAA363DF74AA9E7E1C3D2A22E0C342DCA5A5266387F86A02A8F5B848D56B0F2A5C119FD930B8408FBC801914295B0FB7797C0F214F8942AF336AEA5F24BEEB021994EF75A15C29CE5B3FAD12886F934746CFD8E12CA0EDADEB86F89396D17FA0D7C992F24AD06A5045463345C5613DB25967D87B9A72CBFF8E2B008DE3004F45CB6028EFD0AFF07602AC624E11A2B4F908FB8B28605AD0B27A2F4F96DA80E5A4AD1247EC6F5F0F9702BA60845E5AD8E15F12F2A74F8E2D18568AAD6753C2C0A91D6823C412A48053C877C6B21240941F14AB921911424F4DBADE8B02F20AC65E68170F9FB64CDCA5288059C08D39BCEB78606693D17498D892E0C058AFD44A7269A8B2F0A3C036A4B53B2218CD54B0DB5E2CE2F59B923124C304273F39365973151AC85244B054980588CE632026B05EE656357D1D7DCCAC80256DC59CAE11FFE5C9C03742D192963802BF27351DA535B087296A85658481054FE5E04CD072A5F77770C391742CCE3DF8FA3ED45CB29375F7F7D25A6035264BC677CC116F27C58A61696C8FF4BB117C9F452A441E543FB95E8BB857E071EA4061118E137C67E90F8F82134E477F1266BCA6C998D9EC25EECB1FDB19F0B11B3D58D2594DBB943D019D4174ECB4A18D42681CE823CE33CD803CC68A00A89E9DA7D8D3441D5D6BCA1CD8B915E0B814B20C0D5526E67B0ECFAE0B318BC63318846620E9EEED3D981FEB6E2CC2A9AD1E115E1E29C1377B8A173B166C579C7DF0713C88A8E75EE73149C2DD187EC6165E30B92F90C62F963531CA593602DA6A2DCFC2524CCE80BC764AE1B24EA2D903EE25B7DDD545AE3D3FDBDB97987DDBA3157885426EB2BE46612F9362BDD0E65BAC163B0BDDC1FC171BC91D3191243FE0851BC36E95F9283428791C122BAC07B2F6BFE9362139854CD114B249F5F6413121F1D7F2A63318DA26F8E9717E1AB99FD7F894610375B71A04A8E066140CDC42349D5B25128D401C784F2A5DAA7E6B6B331C8D2221A40EAD0357E72AC5346DA1712FC85D42C2E1BEB0569FC6FC31641D9785E1ACA85A67B69077 Key = AADAD8921C1E In = 190D0B444816CFE9A58BD72DF9C8257F5036A75386F85F20344E8094CC6A1445E7475CE75D3A3F645084D9481382CD8F33AE9957BB977A49FAEBAE48F889ABDFF73C8CE67D3BDB99D6C7F7641362A75D7BD1FDB2522E1CDD246F044E482FF989834C7C4CA7CFAB83F75675DF9EC88AE7FA04FF16D1415DAF85B119DFA9A740A745FA632BF3662671ED20198CCC61549F63AD75B04C313091F301CE2F9E9E7323677FC926ABF881E1EB1ED92EA0D4E6C9B2E2B74DE021CA73C651E93758FA036CADB304CDCC3E685F7DB07CB275BFEE14B005A21899D3FBC79EE80BEDEB579F163C60FC525A231FC33650FCE48F798B6915D0D85B7551E93D99B8E053CCC2F81A808F73D2A5E7B184739EFFE57F33536107457740FC3483E28CECC770D083BFB935DA436D19FC65DECF57C94896ACAC4DC0C53A41B9B270853B10AE3D31EB205086D4AA8AC6E488BD82B39DF844B782591CF7943D78DE06E189AAC9EAA1ADE0811D5CE37805FA53C76B2D8A1D4CA7E8D9C700F77300DFFC17818EE1F3675AF79BF797DB6ECF3E60F34C0629A52D0F5C9389155EED7D4D9EE397BA77753C584900CCAAF3C4EE0823644DAFBCB0DFBCE1E1516EE62128EDAC32D2B1463E4CFC98F0268AE4C2BFB12C450FFBE84D3601A0F62C30039628F66B779DA3984784122784CA667277FA504A1FE731DFB704790B7265C6EFFB40A3515D1E370BC879C74E77F7765E7F473E3E44397026AEA2F6B0E0C23089D49D7E6E218EBA7A1FD841A90301EB4C3782A6AC5C52DF861C6F495F6CEFDC1A597956F32170DBC01CDD5F431ABE5229440EC56265490869F9E0B82D7847A40EB6E18CFDEC0483DA195A61EE45BBD9B3098DC2EDFB19590EAC0225D10E2F4654C7EADD240E535785BDBC0A4FBE5BCE491AB773B717516E369A95B7135E77EE18BE2387BCF450E18FB205A46CB2041B846269328A7C161D6A70BF0C84BE33542045F837C31FDF12495444009DA082C5B1ACAAE10445B5CFC29294A19F81A7492E05C04BBC6A7D47CE681E7978025ECA19B01B1D7A7D8F03CEDC9E651D9A0F0D2D3CEA75C0A800D88E79D550AA1A306839F080C7D9EBE010B6523141D9FD06B5AB40099B37B31DC592CF967FC055027FC93BF4631454F5E0B4940EB2AC81BBFB3BF088CC00C84E5733F5B7620FAECFCCDF236DC9E25D2A07EBE9619438CA8EA09B03BDE999AF5F163B2048993418A47EB3D3B87CD96D5C5E94F169E05BF998022D41C1C494D0538A49B47DB7BA9D4339079872421895941AD12946D74BCBFD741DA2E18A268803FFFBABBCE8FF4DF0563ABBC4AB0F4C426561AC10CEFD47D1369439DB5033EBBB048397BE3595E79A11420153FA157371388FFEF1D1525C4F5DB8247E048C8292ADBF45511CFE147B2B374EA9D0D776F66C1312E13FEED497723B1EE445778EAF1B7FC0F419DA1F Out = 8F6EA7B4AF404A493EC11A2E3869D46B71CFC47E26537804E0CE258B6EE6A85164C35C547DA780653AE8D290CB34F3FA4E17528E5938E237EDCCAB9385EF5501BB0DB7AEDE91A32AEB7BE0D36477AEA80FE7D0714CC8056B8651394C1AC88A230721AC8A3415908A321B79003F42DC783453898A47D5E3FD0A24F839D5CEEF4A9BB51C1DA54EF0481297B5293278985275723D2395C7BF28A7F78618CF2E841AED31FD98C7DEDC3C821B92CC731714054B1A51FEA829470B32D83B63F087686BBFE3E3B56FD6332695FFB8C7F24B243FED3E314EDDA8B3CC5E2D0F6B968092A4CB44E52FAAF9A5D37866EBAC3358AAA4A1F725391D226D30D7561A8F88894416F0B055FCADCC55F19FC529D748828F2E3BF78CDAE9AD826067D266E4ADD86AB680F3DC5E8AFCDCFFFA1971B9A1B9A21E0DEA1F3339F54D19973D75C812DCE634B792932B99724B1750FF95759EBF9B33DC92DBB3CC1681E56F9B1AC1CC91E863735A96C9709166A5835B81862E0514D557F1748F3EC77B6A35204D687028F9597E35BC28AE8DC60029945AA216C2979BB9D87EA6CDC49CB43F48B5181C2CB91020055D7A33513D8C8F34A27CA058AE98D03BEC7AB1806010743C55F7351C9B6C552B8936F5F092DAFFD9DA4B836EFC280097895A9C655E5CDD3BB1126F92528A94C1E8BE5B65F188FBF7D198F480C26713C9D881FB760383039FB926AB578EF5EF7746CD531B9D8EEC55325C4CEC543C832A781EAE64E06604A6342BF886B038DC672305925D72C8B8CFFF9DD99311A80F3BFBF6F5AA94059B30F7ED70F65C022E9C148C338FECE35AD3147A0AFBC3034C9C4D876D0FF1CEC97C35AC3E5A9D7FCB02ECC02D8F01550E961B283765EA7BEED4C3194CD054E14E2127280D117DDE0710D706FD651761FDB2AD33979CA5E44344BD615B1AD45E9ACB55F8562D18D7D15CEE6AD07EF245F7B07A23E7F20C0E25D4C274A54CC030A6D21A12BA65F7D530D897435AF9162A609F91E7EF9F923BB5B9A075DCCFFA99F075EC96155549027950F3DDF6B35D4E053B9E255EF4EB8B9A1DE30EE7BD516D24D607ADF658BBD7DBD1F58FBA34C0A6FD81AACE142ECADF63FD763A03CA13FA4032CD10CEFDD759AA1E34484625CAAC69939E796C1E8E4817E0EC17E8D3C456283C162183E6796EAB5D4613D3ED080808DAAA70DA3A945CC0ABECA5B44649F234F0207C3811A9E4A0CA173096CAEEBF3DE7A2136B5F48516DFB4051D9DC98D90C3A011310339947F1A40493FDAD6098B17AF61AAA9C610E21131B97A33F94D8A11F7A33FFBAB4F85973A2CEFFAD0E7FC555FE5816D67FEB78E696FF34F9EB76EADD09224EDAF9FF2B0C44E8346419D1100C223AF42976B031C10AD1A57D44A0A042459E88D4265DA5A3017C31209411E67F468A5912457E8670D96BE6D460741866F5DE24BD45DB Key = 633768D40512B8 In = 239CF518A7A49CB68A264F57C1B9776D26D0E21264BBB25C552FA15915FCE66C2006D8AE6B5FCF9F0D4F780C94925EDF2CF9193C2F0857C050E522F72D873EB3698CE789FFCBC7268EDE838CC0277C6CF4135522E1B32BAF00DA4A63492D733222D451A3335892F83C560BB0C074157659BF280198698261631794BBA5440FC2E624BD6CF0F9A3C014D3046E891D06AAD67C123D52373003C9E9FF370B8D0F6F18E5D425B71F4F90110E3B9683B6A1162A0571B695C6D2C4269B1114DEDCB345AD5C7687F889835D374683EE01CD3B290F70A66C3731981573A4B7FF0729E42801E94E29BA0D3CFF7D5CCD6AEBA27A44C84B6F0A28F27ADD6277AE5A2ABF9738A9AE473DE4937093AB72646B67839752E048C00C2EF7607C7863CE5DD7C761258013B176494C7AC826A19ADA853A87C7F10F8D148627CF69D3755C77181847C469C8721A5F92FCBBDBA729DB34AF27C7FE37FF3F28CA56587E22596378664EAE0E8BC1F76DD7F4D28717A4550E7D668C143215646BCF3BD759BBF03E2671A1D01C071AA8F9E45638072FDDE82DA96617953DBAF76C22DF09F0C827B3A0439F1F86E2E1873F3DC854C8F1C49768153B2091941ED2361528D7BFFC3158B548F9EEC81677EA1D1A4AB4B24DCB221DFB055608BDCF25FE92DA59F87965F5B5C60363518BC0392C5F1FDCC5D2AEFE282FB20587D0F609594F5A1FB5A0B9DBDC3227C59EB4174D0EBF1A5BB17E52E489825CD50C604D34671C0224427E0DA9E6DA00C41465FCD836895215C14CE15BC4B304E3A06FA984094A887EDED8AFF731FD07DB8F5CF871B2C27586C427A8E75BA1FB9D7A422E99F48F81E013257D2F580798D0400BA3EFA12720F497946478C4AF612B280F18677F39EEFD539B66574F35B7ED8A918A8B0EBA8870121DB7B55F3016AD93E865319A95C83BAD41266699F2F4D8DEDE59F181F6FD4AA179FD3F16A9270CE16810F99E6F2AC5F54C7598E86534BECBA5D083E6B3B9C67D9F2B83EA704803EFE9148E72096DCA3C97B296B1D86950607F5D17153C9050AC6AE97FD4C9CA448BA98E671BA92264E2F87B9CAF1D63506739DC62FE4FD97CF6D1105E156FC4DC1B4F034D5C3AF8C9F675EAA460A4DED2C847135A64A3B1980BD4625A29912415A3A947C0B4FCC9A2B8D3DCC6F3261B89E9898A43AA60B8B274F01FAC72438D5B5581A05D6CA300B06BB5805CF0E86189DCBB8A60587DB1F190436786374F6A2ECD23FF8E460782A2E4D8EA98E167FA330F336CA7E4C7F94C03DCFA55AA57B6BED032C484EAAE0501F04B018901DA071E519009E0B26542822DC3E7B9799B34AA9EB69277FEE1BAC2E98E80296F6554CB3D60B6DB62811EA97BE3BEFC12F156881540509988B92F42249FB4AB8F39A21232E2ECBC30907F8EC123B0D773B1C8B67A8DB0B0770DB559F6EBC63B23CF806E Out = 3D1D43BCA6010739D96D16DF036C6B04047BF3EBE1CED4DAC2490559EFF84120E194923FE454DCBDFC7F2FF02B8F3E70AF354D333D826DE8C4DECC83ECA6BCA35A42E7F16C088B970205C1194A21F6A5B41CA13097E93098878EC5FB52D67CBCB36E3BD6643D407C2CE10F071A7EEB44D9C83DC579DF0ED3434B65A6C5606022A134674E714D02444D5BE22ABB4DE8DA93D928B2E6A02F2207197A730BAD7C43A75BE382C495890631CFD4C943BDA20DBCABDB5BD5BBA0DB6B7A2A8CC985A04D4732DE32536087259B73023A0994915884AE9A14222C5A7A57F838B15091FBE3A39B39ADB962B36F03F3A81D52DEB13EF79487D58AD6F9591EACD2EC7BC256126D2EE696C611AC050637F88594718D6FF391A794099963C9EE7E094048F36D605165BC7DFB8DCC57B59115AFDDD2C66FEB4C289A00E85BDD6B08EA290D6788022A9D52BE4E87D2F433A52AC998109584E1AB7F8D414D10728C58D50F8C4407FB9701868F3957BBDF48861905F3CEFED2AA6488A03B84E37F6848642ECC0193FCA1841A44DC6E6BF30BD17E1FEF02ABA77492CA5525FDE471D070C5B2A3AB0E1383D3E9C7AD274C2534E17741A4628EE9731CF69449796134F523F76C0934D88F0DEC7CDC67C45F4E28D056B9E46F97DA29528AC6EA55662F3ADB6B5112B04EA807B40AADB0CE0B8D1B2149381EC27DD75513FBF8B271136E1CA59D87B0EAB956C37AE0BF57E099738074740E7B10D66CB01678D2488C4F1F8D9011A717F68750902BCE93D9C389F29A53568E60E5B735431050469207E8720127F18E4553329404289E15B1292B8DF3FD88562B981A9202E0D92E3A83710ED49AB83BBFBF43223584DFC9C47D7B5DA45D199F81F40E94DC4FF4C5AB7A92D9D246E690E053C2BFF4307AA5C21248A2D1FA5BAAD7BE81A6F07C61509FC625121184D73A0AC1630C345662EB6030C660C911FE5F658181B7555EC35DA7F8FA00EBD2BFD9BC809AF4C125F1B5CA88B65FF8B93EA758489B481BB0D4DE2CCC0E68381D8F91C66815FC08A0546C0BCEBF52E0D918A61A597DF46A8817D8D5265DD559FCC426A9D7486D325F6650C5A078FF1E2BC11F27E298960A9A97007F173483C83EEE55159E01370868C8C5C0FC139A9BD54F46F8A9DE0B7B82B80FE08DA0D34EB531D9CC2C46BC15F9CC23814B98D38A39BB2E2E6DD9C7BC98C44BF822175610F78E034C5311432161B29A7A6653DE0040A99EE878E8BB9B30F004B31ED464BADCCA96596F6568B508E04D82BF5D2D836CE4FF3613C529B8A25DC5B8AB96C541C74E2C9B40880979ED2D60783089275CA75610FC2868F6BD1B5880D0CEFF0A8E4DDFC233111267DF38535841E42231C3AED60BC89B965DBA6E805B429F5A15FE0F54BF5ECC3207156A5DD019F18699090E8BC3A6E80FE9213C2F0B59DE9AFE60F1646382F7D04D Key = 60B01F1603339963 In = 24CF445438C0D1EE449DE2AD694CBD75526DCDC1D19EB4F67D679C87F5BA69FB70BB6903CCFC332D4C6744F617DA3C61FDC45EA5731BE4C141030659CCD7C6A2120AF422CF31FE39806BC5361172948D12D937A67E7FADA2A49F91A5EF107B1BC2C314732A64AA49198208466A873EB04F8FF832BB4813384E0F9E395D51D1908C34488EE81EEF5754103907D8850FD3B013BC8B6BB1AA652683C46F7AACB7754C0AF944DDD2A94E7A4D5F8BFB4B134F2F834068096EF5DD82C198E101CC7AEC73AE88F0E0E35FED59E7A53A959D8544875BCEF200135D309C27A2D74EA95F2645C3E2EE82E2162057E4E47AE26AB1F3637DDE57023C4E97B83726CD47F2ABB1C6C7B880BB14F0C7FE42A52550B282961BEDFCABD97B5BEAB51333E90637B29F6041A9CF0A3EC65318FC013E583A2E56C89525BDB118FFAFD46BDE45CB3EF582647CCB40EBD6EF1C4EC7AAA9F79391F1A38B418D88105C24E49EA226766496EBF19983AB76C6C4EF3C9D1BC6DE59C2B975CD0E3F41BACD5E091977E7C40F974FEE8919F6C0F58E126375B697BBCE04A584A64BDBC1343774D9F0146FFF543A0CF0B228C30B231693C98E7A67A8EE4294D136F64F7C150BFD06C989711AC42A35A78D96E04F98A4EA2111A4FE5831E30A6EF96300F14875B217D1E94D12B41BE2D112BF81B30961BBC028BCA2B105C97E841D1C7B02FB360ABB442217366F90F469A1AF64FDB5D95B9E50F85591F3CF499B440E029EC31A49CEF6EED2D7B6F15A49B6515539F9C3F5C5C4651A9B0442ED9534A863D15B035D581AFC705DC598174DAD2B8E4B012AD4C4E5AB965B778B5382EF8BE6AE93108290B9905ED5A37EB85E819447A48113F61B9E004F42F3893808E2240E6355C69B007C42A33549F2AB08BD2C6A012ABF27CBC4774002FFD1AEF10F971331B4413E632E020848C9E9972EB4FCFF9D7C0EF898F299313745247CA3F22A699F7D31DF7D7A908A64AECF10B9A9A7EE0ABA37910AB7C7187C4F5F02826483CE39134A54D1DDFA183CB97C3A940A88159DE9F3390031219D3218B7166891171A7CE3D7F87CB701B9527280FBCDC429E285D645D01E668887F8462E2D21040928A06FA8F1F302C6CECDCC7E97572AD1B46C2AF8DD02BC9701DFBC7B8D5A973A100CF332F780324BCCE3E8080EBE251573FCCA30EDA25360F1618F25076289A92CA4AE2ABE59FBBDA609568EE283F747F255DB200749445022B78C0AF186AD7D8B599CF18EE9E78E84E81B8CDBEB8CFACA1886937D6262486DA8DFE9F7E2C28921A09AB1C3BA7AD57BC7200AB49C12D562FFAC9F7C529A0067ADFD2FFB865B9EAC9C0233C24D467C2B2267B36CD342EC88CAA672F77FF4359E1DC597FE50E82F29A2D973AB1DFBCDC868C373D4D6660FEFD160819F71A4AD464A9EC67A214562DB24472D5B278C5B2AEB3C1A79 Out = 4917B75D7DD10C7DAAC6922C3807DC446A8AFFBE5B2007DFAAC632EE14AB8809D426B6C31A4751F5AC0AD459AD4BEDB81E4E9A26A47A2E420D529F2D598F0D1597D21E36806386F142C00A2AB18DBE21820206EFF2283082FBDF19B8CE53C324D5FAE648C1E67CF44AAA2F850E21E9A978CDD5FC0F98A7F153BFB1C69A0982E357841BE6BBBDB0B994638BF7651CF0986F508BD69A21A4FA1607B5054745D2EE18F2D11E115A1F7B6686C5E2E84CEC92BFE4A9525CE7573F31849B3AFD551A0A12387E3658B03730242318AAF5C8253265C116809936C0E0FC52C665F518DA04A78080EAB0693240C3AD5BE4E9F08771F5D6A31B8EBC68708CD8188A44D9E22D67F9D839B27F4F91BDDF7AAE3F5141A3FF4EACA4E2D6FF788E2B5B2E5F3BA296D55C62671E4F1CFDE3123C4ECDB2640ECD477E0AAC5461D5A79AB67184BE38547C08ECEE1C51B45F2CF1E9B407EFF3B6A3BC14AAC5E83387CCE406B115C0EF7BB0FB7BFD563481A707434ADD742918DF8C711A7CEDCE355D34B5D08BF07DF9630FBA1B712BAFBC784F3C914ADA7B28F9CE1359C951992627677A70C5171A63408A494C097A1C3AF7113AD5E2DBA66DA11876487BBF998B024AE60D270E57B89ED1C86BF0396F836AB8940BAD499B20DB8F9631A7D104DC912BA1C0ED22FA0B1762011EE84183AE19F87615352C87240FAABCC5F6B8D970B5A7544655B352DA64910C81E1C57B4FA410147EC16744DB0F7BDC5E918FC90CE7420EE31ACAEC353EDF5067B24BEFDA4A3C773C73876BFA2470405F44F683C6C54254BF9613E2226A40DAA7A703A15C582FD8CEFA9CEC0AB2B8F28EB7C3D97E2FD44B6E6934E449974C5DF97F69E377E80BF02E81115F43A5C057D4AA68A111F9E7B5A4F87A7193C4AD026F06A85F4D6C8C86B378F40F8860A246419F0B4036C6CCA20891F5AF3C804F05D32292121DE0FE7431ABB29587F9E38BB3754CE18D1DA91589F4BDD28C472FF4FF6010391EFE83834A2E61AD7059CA60241DDDE5412C67BBED50AEA0789911BCD56EF0612DD00F82C3EDF4E39151B9CE5EB12D4983F41EF9D756311083AD080A64CBA8518855A2E7BB50B2662FDA413469F7B906F6E7E72FE778A95D3689553F7C7AF367E47BB47A7C052C3506D976FEF9F3F3389C456F84ACFE21A28CD3EF275CFFA495E1577DA1B95E867D0050B27CEE11F3332E66E04586974E815B13C34E0704EC151EE0A9C585D7F6259C6241E7D50A78DFB83E6D45C0F988DF270E65175FA688741F0800E106C14068FE70F03E3989B6AABBAAF4929B5DBB080BB559D1153735E28FAD7F32699382CC8AE5BB8F72AC5392EEC4F92FEC0CFCCE3CF36F0AADB781D0E7CCBB43977BE203BD4A92336C4ADB4DD28770D3944706E93360B54965DD846F4E17A96D301DC7DFF7073644F4C630B3924377E43BFBBFFFBD8B Key = 9FB8C092B2A0DFDE70 In = C9C8A2527DED20D6CBEC16939C7012335A7E0BFC8D23D7CB7A819E63FB3FC39175D2F19645574D9DEFA9DD9096A00CBF062AB5A30F99CC110C5F67BBA32526C96B0A62DAA9A38BCE99F67DF73CF4C424C4EF673EA3B1EB32CFC0C44254566A74A9EA8610FF9FBF1BC8957E54E91A169AA98FCBD119B24E3EC19E0E6E23FE9288D02A230BADA7A77391A691021F0565AFB0ED5BAAD85697B68A42BB71C1EC0ECC99B227BFF334F2F218922B56BC6BA15CE9EEFA0B3536465CB7D81AF4CDFC59811C99B499A38A8CF945D9A83E1A15C4085AB27B2C413031CB54D818382C626FCB4996D738CCC697A33A8ECDAD86B1082CB97B38DD8FE47188FD9D9D773A8F72D5EA74ABD533AF7C2300A8F5C881277F274734D14279A08D90FAEBB4D6AED98C94299DD411EC1412CF34004DD2E7BF812A8073E586800E0DFD62159F754FD01C3D89756DFC50D468D1647A4C77D0151727ECAF60257851C06008D3A0BA6B74BA815456A789C3965102F5D5F1277B873792CCB0E40B44B373DBD2FFCAC9BD674256BE1DFEDC78D7909FB375B607934921F3851C90BF8B82DCDDD91C42810143807C62DFEE6183E59701AE53EC4D0347B127C0D609EF4D951FACA3667D29FE914AA449C941682D7A17D242B4A333DC970CDFD931D35288EA7076A7D4054AC233A6AC17E612FE32570A9ECAB968DB5B39964E6E301E63B815F13DCB99793312C6D1AB998A1E87D6ADE96B497931FCC0FCD3D0ECF79C23D44BE879ACAF1206856A4F12B948548BCDABB07664199E1291ED4B2C6CB0895FA7DA30486F26C5C7BACF8C5A2ECD9EA43DA809067E1EF29F92A0DDCBB495AE07CF77A0D3E3973848CEEDE3774BDFA19F802313665A64E7B9291B2153080F7BBD28E727624D5DB27561FB8CC4D45BB66F9A1620BE69A759265CC089DCEA331508E495F770433966582058337C0D8CEBDDA660DC74E9FF179106E0831F9BAEA68839D98CFD2C2507F85942E7E0178581BC5185440C6E8470AE31794F422823F80B4A424866918F7146235AEB6D69DAA7718A18EACCFCB05A6BD6CC8B656CB03FE0D8FF5AAF936417827FD51D811E1182E4B726E0AAC3252FECE247CF120A0985D8FAC1A9574FC8882A583032BD4778997825D84A96CF7C939544BB358928D2BB64D695B6F5B002889505B3D8B98FFFCE5A48F9A05E05461C462E8B30E566B95CABECA00ABE7385B65B5B9749DF238EFF814F5F0F0C378A366179CAD80153A9F5172BEA4EE42CA2963778D70D4953907935BCC09C899EE3D8FD5EAD0922F71576442A760522C4D0118C9AFB867C338131EA0ECE114AC44DCE202D4D998D585A9E37987F0057556B526D39A472D66425580AE3AE64FD24B663B1B56C7EB14F543E3611BE367D31167B99037AFB25A049E80DE1B4CDF8EC69CA049BA9B51101369938995D2A8F82244FC4E8D92A71 Out = DCC0C301B6C08825CEFA3555DEC86A5BBB7B86B015699C2CB7586E7D5B27B85237D0993B9E67E77BD06C357F274781C52AE5F0AC9AFE42E8343E0CE46B77C639C18A1859A007F7B6C5F8F90B13D88B7C041383FF4E6D5457AC473370331073684F248B998C0ACF1F5EC1B32B749C012E68F3CB8F35368171AA4735A3B7DD988205E9662520D0916A425628F48A4A1AF94369835C2E04251289F1550C7AA99AEE184152A86E00D121FA5026763DD8B106BF9ECAC68366362464A58335386DE0AC155E344B5C687B3CBE126E18F4A237A20F8041831289D79F12D2F53CD1EF0163614BC2E82DFCC2714C02280113EF1908FD40D3763ACC6AEC03128CBD3469E152E81C2252DB94A972B1891FD62D774AF979EE53BBFF7A4B6EFD30B28DA1FD5B8618CB6CE82B3D408CB165FA55FB8C2A553C3EBC448426F3691ECD20EE48F9F06607A4F10A16C2E9A186C1AADDD35908A34620C3AB189BF8C666B9BBA5A9787D751550196569E7B5231DEBD02283B5B6EFF002FF33941E755731A1E2ED27EDB322284716960E0E421F6C00D96E872474C6C18F6ADF6DB307549FE6FA29CEE34EBEAA1A3B5EC7927CCCD5ED29FF0AFE7478F78D461FE000623775A010F9319E22D0417E9014CFD944B5165E0A3A71758E7C15E4C64F26F455862B6A806ABCD8D542FC07358BDEDB48E06E07942BC33592D44269009A079C6B5067B32C083277B43CD245BDCC9F32AF924A69B8FD6203E147E4F24D986462B4FCC19895DEDD69CF631D9362C21744004722B419ECEDC53266A419623188E9234BD0EDD0B6B434A747050EEBCA6485CA81893BE4D488D181211161A7D1BA0D91BC2EE94EDCB99A45EDF8160A9120E477913A225C336A24E08A7640A8329C9D4277FAB518B67EC41ADEE3E6845EBE8C53C6F7273B0891E237A3939AB9CEA6839EAB641734AFA5206CED08100DEA1031CAD6DF65392630A33B791A2B10036948CD441D20D013A1BFB2730A0D265FC7AF87FA58EB42CCAA6F954936DEEADCE4A160045258A6B65771C8916396751C0B39D804FB642A7FC071887548268B6DDD38DFE422720BEB1BA13278C284321953F2CEEFCFFCDD051A0B847238ADDAD359720054869202346BC0C0D2CF83408A68CA1657754C19BBAB2F1A302FA988B73CE061DC7C98E8EDF3918360FFA4214A7F7AA75567A2A0E077661CB379B40743E719178D55B2132697E3D73C924C15F99925559E2D48879C1A798FE2E18CF15A5B3819F36CA5A1DEA0F257EFFA7C9F1EED365801CFCEB2EC1798A5434B0702E7339E4785AF3F558A7EC6CF8D9EF7BC5A57DBE2E3CD148A210F86DD59C9D75D949870FC7656972118585DEB702E02B8EEB2A2C291F46078812A09FBA07BD5473F2415444540C615BFD49F9635BA7E4BC935C27416509FA81B6787767CD67F296253F55F0B55B293B399E316AA Key = E8547EC6BB8CE2F8D4C8 In = A946842004EB370887F8E43D082718924A419A24F3FFBDA01CFEE2A57E061B5E939B2A38C798F62EE5C62F46711D980A9CF38057E73F6ADB9DBAD2A1B4CBA828E79E5A587760D6DDB3B04AD9F61CD53E501668DCAA42CFB5DE0769AA8688060CC7D2C9D845E181C18A842D9E3C45FA1FAC060CBE4E9D3F2C168B3584AC87269DD455112BE67218D5D4C027A1BE4ACF7C68FB33100E8DFB1EA8DA8F63B7D89A5C972B2D4DD0B2627149759674CFD8C7C91FBAE6C6DC156D8F2D58F45252BEA15B0EE577230386F6ABDA8B40579F216166C8492E1F9ADA792C42A987B270A2DD4ED6E21B8FB5AB98A8D56A782F8039474D0233DB9CE6A0A2B8B28D16C2B7E69B8834D3E2579A8038CDA9D7BC37D2E4E8E674DF39B6B62AC55BC76A83738EE0BEA1F236B938E0F2CA63D1C97362E00364D78BBA094AFA3546954461138F2012B04144E8C95046E4C1C5E8AD6D17C5C9F74721CE68F84000D101FD25182AAF2888E3E75052EDE707D2E16FF382A04FA30488FAFCBB2D70E5B4C0294B8C8EE04CA6C6A8624E476C25451BA7E1FF956FC0CDF4E8207E6961B1A017751E40A38889666440227613AD3C3A3BD853816C4B0E17A7D1267B2615A1482CB304EFCE54901A35F3A56E8A392F6EA5F8B79309F69EE8A936FCAA6B1DE2D5C6108043DA1C11CD0E199EAB241385646F4ABB81315268AA77404EFD3E2070E8342251C9D433E474C5FDE3546A2735C406194220CE42B830E6A483390A2BA772BB36C9671068CF6E7BA70EA29AF7BAD1F9362D368E69E01E29566C27C6D3B926F7378D0BD7195202D052B3148F7C5D5BE19C0772960B9D08EB31CF2AC357C2A98E4594AAABCA37221B09529DB5EEFC26CFFA57F973AF90813FEE0D8E25CD49C7634B033E4A3AC8E370348EF6B76AFADE6DD823CFAC381AE795852F95763EADE551F65A729E3366538E8723BA2A7931F217C0E7554E5C7F9E02CC2923717D6F285AC12E4E126006E99EA0393356A3DF5EDF1CE578B9A5242A8D3526BEEE473B2EAEBAA89B593D93398250AC62A5B111E8FC473E77C4F64C61128AAD86887EA35362E1F1AA1B72126846E7C00585EFD36D3C350BC9F2E6C99DBDC4CDFB18EBED3F9AB9324A58C944ACF030FF70A196A6C125DD2C79E698C9995C9160095534B104D5859FE5546FFE5EA14FA398A12E15DCB0106E8D1962A41D229694F24F858744BC09C0BD303572CADBF0E389822BFAE830C71EC5EED78C5F5903A30308331F8DE92E20F1F94561D74344049419C6158E533F3B29F6C8F0242E832475DAC711D5F1A3AFBD853E4F48905F0E1B90E6C3EB4560A7F5265A10601C8B9EB7706B5AA9C654366D4894BC88DEDFCD7E75AEE80476D5C7FBE5DB7F82152D98B0B27AE01161A4037E69A96CBD11EB512259E178284FB41FF4A5F16A37053F7587C2F237F10059FC38699B86ADDB Out = 3B6BD8169D4643AF7E792FDBC9A2ED78BCECBBDF7EFD7B7C86FC7B96C4A1E089888BCBE572D715C2ADE3367E948E02C723DD7B4CB2789BDE1664375529E183C061E263A319ED240DA7193A9CC7CCDCC188F651E1C2A875B06D6A27EDC6F7D7B4AAD7D725AAC9983E150F7B54A1DD8D36068F65A505CE401474AD2C79CEDD0895E64AF67907D2867845D13286712FD294C4F1604582C2BA78B540614A7FE2D72B4C943305D8AE39EC416E6D1FD9FC6BA6A6093BAEF7D29BF04F879166968B3067228069FA0D1CC1EF70B870EF4FDC2484542CA88FEB946C8169F8E786DEA68D654986AFE6493866943BF065ABA7DA02E9B225E1F9428B3466212C733E9CC293189E54B703C0C6F3DFA17CA183F4F752CBB1E4803715B2B49B00D70EB36816CBDD856065BE5F86A5DE04A3FDF0FC5AF5C03E95895A28A806123559E642298CDF940912C7B58A1B0A536FE6AA9DE8A5F98C02FFA7C8A99F1ABF7129BD0EB678F21B3273BA5CA047188F303E6F8A32A7EF864E49470478EBD7187C71EFF57EEA68147AD3D5C87CAC6133E3B8F71221E8B742BD60A4E73137978FBA51F459C22EFBE66D8B496D9385A8BB9962071F997A2AB3E730A529269213F121583E1A02F7B1F15F754BF6BAFEA740BEAE9DE0CC3103F9A9A61373956AA02A5D072CF658A2BB250557723F64BFCB7DBEAD7441F25D2EB1A54AF9883B9BB25653539D5CA8289B8CA9C3DAA69486958D6B190183D677598CD9A4CF279DBCA1E323FF83B82DBDA3F416AAF6FF2C14DB6CE5052E5657DEAD8DE3C7F14C74A4EACA1C974DB989625E0B9548245A3D7857DF36A7066242261336E72347A3D9B765861DB6D9BF843F22746C063AFA1F724D83204E5CB3A9E8F1AC86C8AB62A83B323B48D52CEAC0C3CDF4630B35F26749800DC95AAD88EF7F83844413E04A17136618E9CB799DFF24432798BA5777966A07C0A3F24159963B9EA803DA5562D544A6CDE1FF21D6D5AA7CAF38D436B706F2706AEF6EC02F003A023D7476D0FAAA3B5DC397524960DF83616EC5D5B11D2CB148BD1D2D6AF388AA4B978F1A2C2A2E6AD548F5F7D12B9BB28C96C062FD13EADEAC01CBB32ED06B75A5DB7AF0DDC56DED1EE5CD509003C211E3B5E673B7CBAEE0A2281B156BA5264CFA602080CEB2626A038BAAF69FF2C3778F06277F71E62375C78683B4809D2017725D9A4AC03FFF0D3474AE23AD183C012B201DE91ABF005944CF60F096667E506C6879771172EFDDCA4BAC2AC65EBA86BDE7E78E6F6970D59861708A01EAB138F33C197997B98507E5D016D7B3AAF9F774A93F3A7152C22279D2DB55966F387118A0A23C36A539CCD75DEF4367017EB0502F7E5E08CC7541074280A90A6CBE0E4D881154DD3836E6E50BAA61BFC3BC4E4427BE0519D74ECADFC57A3D3CC3B3288A6195A4E1E91ACB74F7CFE2F4ED917BD7FA Key = 2F2758E4C63F9C698C6503 In = 18D660AF6D52144C394F285EC02FEE9AA28F11EA732D393CA23B6C68A1751EF3BE0F28159E0055FE925E3EAA77308D9FED109C764405266781B890836069A817C8CC2F33476F02480ECA4F6D389B2F44A7207F17AE94EDE443064A1C6DFEE28086033DD69C4AB8622A9BB65D1032E14C4F36F753E70F9E399EDB92092FAC60F9540A2F8E6D2DFC418BCE35F56B1FB7ACB6128829B27326D4A4CE6DE1ADD9755BB6429F5BFCF9779CE46A041466C3CE353534DC114F07A62AF0BF7472BB0E760098E920F77D3F3F48145C9501C699ACB53B9821DC56875662E524C90EC65C3BAD9A2D2D152D504EEEE8C64CF87278F964EDB34A2B89889979C71E02581A4B87C3B6377287AE1FBDF2D777900E318201B257A1818349EE5A247B755D4173A9A6E9393B136D92AED9D8420D40C91CC095DA913FBC8C8976D61A2D1AB5191DFD0ACF9B9A694CDEE2BBE42DD8B600616F40B97E6399068FF5A5FFF39456202427938AEF8D4DB27D8460FCBD4D91E8F2C16C1E9704479CF48AB364A26C85C5C2531A7D624EB8A3FBFD5591E91FAB465EEA54296C0314E944588FC8B74D6BDC68363037C8CEEF9EA7D97792F25266AFD6B2328E53E8AF6FA5D8D8DF625621FA21E29D809CFBB86C8CF7B0186A8B90159724A57C5E6892161E6802BBDB36141DC5909D4BA3CFB59DBFE8A5833F3228A9AD9254815D69D09C1BA3FD21CE5DA19B277D46B2EAFAB171DFFD7504A71FFB96AD17422E7DC9541CFF16BD5AFBC498BFACAF7E5D5D79EB9072CEC455BEC783F0935ACFE8E2594DDF5252B598AC3BB6F7F8DA99AB326B8C914DE01E4FFC0D174803CD4B69787726D9324FAE54CFC17C0E8A08692F3E9854630A6EEE746864E0FD2D9785B426BAE60901C9E7478394159B4E7539869398282F7998FDBDD29FA5D3218F05C623AF3B0EFE1D98AEF1B05DE593906A6BEC93CEAD1EBFC743E7D9683245CFB6DD3D05A456868DC0730FD426066A261F27776B910244AE61111E4CABE88A0B75E97B664CA5B3E896FBAF5550948DE7E6A695C413021C702FA31988D734E4E2FB3B71CB33DE3E942035A9D6D0D0C9FCD554C3BE6797173CA5BD7E2B0C7AAAEDA585BAFFB630BBEBA0AF1AAA95C679152248BCCB76470C2896FEE0821435F466B788AD81291B9BEAA98AE92731ABACFC67FF5CEDC3D2F528243346CFE6A1113C71DC8E0E8F9F88637937B70863ACD5F413ACA4FD0916E9173A8ED8C30D14A2A3D017766353EB0A89762678A11D3AD47FB961E5DE31D9B24F98128A273E3C1F282A1E214DEFB324D162F9025CE8CED03CCC1B140131CF0E17EDFF2EF1F53CFB3BEA8D7ADF14D84FC98D43CF9F5F771423703FCC3D034D108AE32904975D758C8234A2261ED6DB23B0C04212166DED54B0BC15F62E6E1ED9B020D79192271A6A2714A9998B3DFD08A19E8E2BE334DAF2BA6626 Out = 024CF54DA77692C014693C6FACABA08C52F75332A7D5084E2D12F3547CA2B166FDD6B71EC89CF9FF02CC4A289B133DBE6AFC9E87A7A28D62E7C4B636E4ACC9370E77D900F089163961BB627764F444F013501BAFEC9F80F753C9FD0055D4BAB050FF1C1DB22C95517AD76E5686DCC7DE0D1F08DC2EFB287C41E279DB75CF4F67E43C452D10537E8AA653D284039909D33C4EFBBB47FF0939830CEA000B447FEF774BFBBC378008D0B212087A73D572C54BD9E665A7A4D2D533C7BDE9B976B65FC7BD540F4E9C81B2D26DBCCE5EC12739863C8C76071AB93C2D18F84C9198E6C70976414FCC1DE005251B308009912D6D2757AA9359BC20FF60130E12F4BE75725B69D5F29A4177DF104B78CBD08F735E1DBDD51C0443268143CDCACD180726EA081A9B252B26A4A6C16CA6225CDA357BE3CF4F72D7171C853DE6391944CA2065A32298EA17EE0CFDEEF2BF46A6A83BE4E06F076DBAA374ABF450B78CDCC3E5F3976EA2D9248CFAA75B292542C55497339A149268E895465B44AA16AAA91021CBC32B761D1ADE1E5CEDD5403385C23A2DC36B468A2EB54DDD3A78A7B0491F2ED546F5034A9D4A7BA067C10B920045A04A6D27629701F92EF442DDD3B81FD992C61D17D81625727516F3163E9E2FC538486D5AF1C0F09226143E79661E6C52449DB9518E1DB541E0C0F862A7E783A4EB78E916E9C9CCFFE358D139369D416E15B361740530E525FAC7FE1A5897C658A66C6E8C541CB1C5B0DF7FDF1818341AE975E1CC0517CBD55F8166E499F48C78DC017FFD4A2FEE2318FAF15034EC62D451F559DD47B09F4ACB5536F593194B43ABBB5B88C8AF87699F38C2987B4D212190E0EDE8BE80E97B0E8FC7C5A71C694D2FC7CAC8470440D6E6225B415E6A6DA4BA879468DB40D7659971A38DE502253EFD724AF9DC2C702B9F45D6613181877A2E3E7957D0CB6849101AAF3787BFFB188264EEE9337DDFFC7405E80ADB30DC5CB367EA438D502E3B1DE303D5755A46A46D8B46AADA4E363CE08AC181A9E4EA6B1DB9B3AB551085DACF99849624DBD7933F1723B7AB4190CB429F696D8DA5DDC92618BEA7E235E3D8CB423DA90E90A8540561FE3B27ACA309FB9F1D4373AEAB4AC6C45D90E1D95C0B2F2B7A9A9DC468C8654779361CB4DA6D6713C7218328707DB6F8382A3B8F274712FE3E70B439001E80CECF6A7385F91B720F815211CD9533764CF8245FCAB3ABF7FF7271E93D25DAB94D6C75CFFDCBEA6199E5A6069FC13892085E713EAC8396988CD6554E0ADF4FDE2D8C4CE6FAD62FB2A0C54D3DD6E55610E14F6DEBF5126FC552DF942F06651AA8E4AD9D4A35C10F611822FDE83ADFCA8ABB678F9465FFDA3D5AE38CF0EA04DABF0763C68E95519ABBED916AFA171A487E72F54B6C88794DFD6F80660A23E2F26BB6E844FE27DE41B062910228FD1030583A Key = 195CAE9B4ECBCB8DEBDC6C48 In = F6F77F1E437560515CED6B16CE05A52D89B68DD10EE26E826F0E6C54264619B71A4AC1F4D56E204947DC46804E29689E8EFC3950CE25482C4ABF907798691A3282374A822289F24E0253346C0DA48BCD2D28EF6CA9485221612ED197A3E602810C97B644ABC1A43C40B29BB99C5DBAD8D641146CD621EE1149A3E74C51B460A4AD695E77A574E23F4E74FEA26EFE64FCEF59844EAD15B28DAF3FA97FD49DBCA5AFF113289E616B4E898CBE2C7073215C02C3E33D1D67261075D077414DFB32BE4DE414A21DF902AD16AA76A176ED1B7A9AB8F6AD35635A38034757CB52C48B3F7BDAF5C687DF0836AE7D11E91A41733C721F68CA8D882F2B0A6B00C133B230422A9E9A476BF016082036876D7607A34BC9021E867A24C33E1130589E3F6FB2C75273BC0271E849D6DDB84F430F6548CABC9227EAE780379BF9657FE9569460036A7C1CD8B4C63B3587F0ECFE522128A286CD8CF0F2B252D433B6A4BB4445AD845F9E56C35934B90AFEA01DD6D5671754C0B2132D4FA6562B9DB9488A607BC6607197FD93F7EC345A0F0239514F1DCCAB1DD67A2A12B2DC2511FC789EE8257402BB64A02C703D70EDEA45D64DEFD9209F9172C3DEB8948C0CDFA05E3B33AF4CEF56F5ADE10D8BE40661742249F6FFE71E49031AA605054719B59B1667695E1A07C0D126CB477BC005C44E6FCB47F3D08A7A39DB4A7B446A810EE60E71BBB3951890CCC182D0613119A65BB08309BF87214DB179A1CE2D3F21C3F2132047F8EB5F4BEE3198F316C669E007A435921DBA101CE40A07DEADEB308D2DC2B27EEEA201B75633476DD8EF2091FA1F0950FE713BA1BF06F1B55168CB416C181EEB0374AA728531BFE226CB67D7B2F5F283EBA5D1F87F3FF90AAE06130F34EF44A8D2CFFD7E8A5CF9AF42D3A7AC0FD4FF2DB47A38DAAEB3A7C22280205879415418B429800762F597CF5C4A4B07BE8273827038F83D805A4E6ED95D415E9FA13EB8F5E401241ECDFA71DDE6BAC2F397155948770925A1BA9AC1BF5A65B51C26381A09E8259D4AA8B62AA97454D3F257C0E5FBC9145A4F4A47BC743B3DE964C2FC8E273DFB21B78B6FB42F8B6A66DC766F5729F1BA68426D4EF7D5BDF9E28BF39B964EEEF5A880E2F67B8393A57A5DA788B51C181EFD35D919C20518D32425A4050022EC73C080D404F1400D1EFA7FD2DFD8AE759ED20D3657795A4DA020D1890830FCD80093AE746DF9250F2749BEC1143B8C7E20DBEC9E94F69B768DF054C202E17A0756C02D32A008AADC2F009D057AD556081C68832EE240EFBA8F46D6D99F96F66B508360A42B38F0EEB367DF2AE78FAFF7C30B0A22CEB9ECB05D683E3963E7B06EDCA94BEE20C8D991B1931D0C4A1321569679CBA497406F6E2F74B36F932DF3134B77747D321CF4A19C05ACDC25C548AE81F1676AA2C18B7C14E6465569AC436D46 Out = 6F2A05211F8D2800394D5FEB91B7740DCBD71033C4395845528B814C495B9CC7E242905B5C6F30F024532A50D8A1A4AA3E67ADB9B33159767DA566E5E50E7844C503F48BB9647B24ADB996E2EDE2208521DA9B5BF15B344F748E215EA3063A3E5ABCB592F2C04FBE841BCF53A731DC1322BDEE3F3E91310FAB216ADDAEBD5E226AEE12FE00ACA9022137478C2CF93DEA82B302AF5238EAFE873FEBD1F222377DFAA177D8E1E313085AA5B1A28E473C7303BF0D131C5F8188896F2304FA9583ADD474E92924FE1782740CFAC20AB4C2728CA3D0C41F6C369EC1662D166723E0262A7E41004F41A795EFF54585AD8F8D1137EFAE0F158F9B373ED73DC73DFFDFA00730AE381A71794D48D42C90BA49AF77EAC887AF0E01AF68665F081AE40757C6CFE430C3996EA4BB2F1EAE8E97413DD5C04F1B1B64122C448F40701C60DAC75E34909B9B8B61895D819EA5F55B2FC6CA5492AF520E816AC2EC14498891D073FB65E3D33272CB5771A479188CDE2FF818881481A4747BDB20F0A601557E016C564B8F5FEA42694F12681A7D2906B2EB0DC0DCD8B98E763C5E3334D65B84AD23AB7C5E7CF8CE1EBB34494E23FBDA3D34994BB20207AE5E12BFC95A217F3907565E742FED414060B86A14C710F5F5DC79F0611F2B2532ACF37E210B123C15B51E03936D8C5362B2BCA153B19F7F255B0BCDDD9FE6FFC5DAE45C42FB0277A56FC5F6B56CE49FBFA7B1C8C249E6A5EF497CC7C8D7CE320BEDC0D6EE2ABD5FD67F6E953F5D9BB025F7853B04E304C382E3BC80D6E5C87FE637E38A829305348CAB5BE542A7DA8A6B47A1186B6590934AA86356E58D6FD059D333D8AC6ACFD1315EF3CEA933EACD22933C9F29A7455D83BA1A8DD9B69189A181038542026ACD15085129F824475E1EBF76B591422951D96498F1FD5CF93701D2CEB12F466E701B1FEA1D38C6F57DA33A69D0CA041BE786A045BFC27451A76B0105F00F9640180A97A39D6BDA768D330E7DD5CEC42A78E12D518D7742485717A383B983C8749315037D39A100248087F4FC40143873B11ED80FE496532DA3CD09C5FC1E22311922A3445E07FB84F9924063503ED11369F70CAC8B6CF7D8367658C333A2C421447FEFA05FDB39055F4A46BEC4AC90A2868664E47AED74AE0B0B5604C06CE8C33BD2DA41E8714AA8528C68A84BE11CCFA67BE6F74AB4ED104342D76BDB9DDB8F38CCBF28E118888ADB1D7626122FB1D265ADD42DFBE823E93AAD3EEDE4D472AB139A7DEFD026B758F3669EAFA7A1D99386A5E870560DB879884906C0CA9805290FB19187AD24E7C2BEC4DD3D4025E7B29667ED94599751378DC4D2E0A5A916DD35D46518451328BC7187D60FAD9CF47CB13B8B4BBC9AD71C064BDCFA9A1F674AAE15015B5EE1BC46B1FE3C4FA2A83DAD03239953B55316F49B5CE605AC9CBE41B02DB59965 Key = 18B309BB8EC6931F8C1F224D9A In = EAB25B3642470318B8DF509B4B1939289B9EC9CCF3A12181C8AABC6A72747AEB41A68F69AD8ABFC1164765EEF06961714B7F49D8098088B245E05DCA8E52CC7AC8A5E97C6DDCCFEED8B6FFA61EE8DD8644BD31888D27F81D1A21C1681771B732747FAD3A238381C80B004244B0A1EAF51425957D2380E7BD777F74833DE0A3E3CEE8953A921F9DB5B6B8B8BA19982C7CC2F8C2005D1BD8B2022FB01A687D9E0DB6298BD42630A9660B25EC35B2CE6385C8C15A79670A23ABDD74ECC9CC7914055063BD762659F41DDD1AE6F7912428A55EF0EE4EDFB257F05BC04C90EB67196608108599887B5FDCFC265FE811ED1A21E71DA52EED2F1B37884BB888A23CA74752E1D612E3575B54F55685FB6BA51743FF5BFE44384FED0832819BA014F613D7B19A046AAAC4C8902212C6F54BFA57B8E9E5C50BED0E0A1F56AF878A323791DA52F173BC284F3BC38DE23D27E06CCCCBB4C1B7E0D6B3F594FFB71E39120076D78EB85722A7EC25EFD39FAF7EE4D020B3D05D6ABDEC9318075EA8199597E9056DCEC1678CCFB0907977BEC59338AF03D28A80669A629A70D6C7882484E2E4A43B9C01EB5FB0E034D8A6E5B54238F3EDC82DF6741055D093F4E43C6AC4978A4F7D00DBCF4110E6266B70F7AE7DD2A93A74B16A3FD7AA249F6182E84094611EAB686DDA57D091CC2E156026D72B7D8D29965F9CF1583CD921DCFBD57BB0532B0B502F4F4FF6FB19DFD858AFC912BA411310122987E284D9463112C879E9B0DD686F9DB45923A69B3BD200ACDB83FF41366A2C417CA841D9B85B7CAD21681B8992D0243A6C30476B85AC2B3024A6331C160CDEE694D09416300FE4C7FA1B76F05BF79E5FB6880ADB3A1DB894ECC980A10895163BA57D36060C5596ED1AD1621161EE6068184EBF42719E9A9918A819B77394D25D26481BBE51858A4BB0EB3C693CA99DF8A504E3B1FDC84A497312CC4396F7C4EF1043B70484499CC24002737DEBA24D9AE4C538410887830AAD0E5C15498C5AF3A24597306DD953E6B342DDB22496A66E156BD753F4876C26421CE720E2C3C8649824333743513617A426374D0DC812C9C1568950B68F8A8EA1AFEB581C4F2D53C48654E19E4AB76BEC7C8D384366F207EAD9D044F8E5C5652A6A73626F5AD08A0C3AFB50DC9E6541E24B9246370F834D6E45B4C8EC8D7F4C64F01EB97D11E8DB1C1EE7A489926732E8C8CBF6873B7B947D98F96698D2F2B5513F2AAD60F481B39D6CB49485633CC81D1B98F6A7ACD09CDC001D13F059C1921B7AA5F7E76005C51291F902E6F566439B9D2AE60A4AF32E939714B55BAC5E5A8E2053AD063E05738D03A704441BCA926D069CA0910BF5D4EE3F81B4D8940E1B5980038339362F08C293A2F28CD0385C28E90D542C36BDF80172504110A03B3F57EC6F700D38CE039E7227FE6BBC8463057D92ECA65D Out = 7D681C0CA45B1919BB9DB6102FABF4FBB21CEF49BBFF6744D4779533839A414C06FEAC76C27820EC237A08EB003D46AF81CB4354B701A8D0C8CDD6BBDAEBA2C5D7D1D089B6D530B787BB25C29291239FC3DD2F7FA1BEF55D84E569C40308D792EF44BDBD9FC557CD618B6626157567C454814009A611698576378B094988D2AA04BDE298B96AF7942A1DDA481546F080BB0D3B093B288152C1DE21C7A6429A6C794AF36D387391A5C71A388EE30D9A887268FA4FF2E8D249FFD62BB6905E7FA605EA81AA0E21BC895B333CB7EC253693A6A035632DF8FB6AFC8DB3A59D05BBAE5A5C49C20E24235082C55F7EB8573F18B3D379DA4188DDA7DC6751C5F20DE416DEE4C09E8A43D60EFE266F0048A127617255653B3AF4DA277A11D3391C4C4DDF9088A7B7880F8CFBFAD185FD436363C6B36E9FC45FFDD896E502061A7B154B67D5A0B715AC4B970D27645CEFF88770290A3B9ED84E18F306FF39A9C70E9EEA4DE6E661BF81D6178336E556A36A87024D7C2EBF04C10E19B8E5F6BDB56C7351B51345F2D6C29D5D1BB28B10357818D482A2015221DEE8798F326C223D8E382EE38B3F2B68EEEDEB726F94BB1A33C5893AC6EDF050A90B7DABEDD734E269B70C5E3ED5300C370E8EF0DE215A69799145B11918D2DFBFF65F80C00BDAEC88153886BAA2219EBA027B6B93B6DD6D27E8A70F7318326E3A0F2937C6C25301A33A521C5AA47E609980C4DC03EE018A128F7A0EE614CFFBF6081A89C0CE27E097EA6C639FECC0B2241B18651177B3FE4EBEEFA15DC588562D08D4F639382C86C15B99BB96AAE55F841F14ED67C435BDCF48595C0EC4D2929D75B1C4A1833C9AED228DB20FA1AAC9EAF5ED8664E56C586B7E5A01C2308BA61DF95FA3FCE90FB91B049C51DF7E58141EE31744FA1536A9516E16BDAC93E223C616ACD2EF48CE973B6D6A123944DD0B3EE161007F3272C092E953A008B0F1DA7FB8E2B8A2506D762A82D89AB1A60E33D1D96AA189A23F6D475D03F7C19EF77A6290C8456EAC591C40E92CCB5B60A5C5248EA04E6037AC206232F3EA830661A344B825173426B31A8EFE80CB6C4B9BE4144B48162C63A1B95CA6E3D173D9EDDDFD712D56D9D6215102F343B35F9B36ACB7566A3BFBDB376F48CDF0F0365330EC35BF414CA33C2919410E429699B97B57AEA59FCF3F21C261286276E9E2CCBB1E50A970493BB1211324473EAD9360C98703259BAFC93D424FD2CFA0DE257BCC90C328F7EA2890AB3398D173E19CFBF3F43902B43C080612A81DB02FF48D65C214727A81F9F19C8C4E4C6D40EFD03B0F5084A9595A5C5B330652036E611452EF24516CA8AC71CA5B7874C209861A12DD5CAB8E310784E82058E5B574116D6CD88D7CB4C228E5C445996703C93E73460023CAB06462C9858B19DF2329214ACFFD82EBF2F9ABED4D1E62B38FC2C9 Key = 00C03EF75295806B9C351F89FCD6 In = 2549472387BADE846341B6E3BE1938D72EEC5E11805ABD34DAFF0E8C1226D5BB797FB149795B1A1FA79D5F24D91A60D7C664D82ECD90803EE9E941AA5DECF159698727A984522CCB02B024E1EEA19AA163A6886175AEAEF0259D1103AA35D44B3D64537992BC1452DA51C9C133F118A8865942FFD9BD48DEE841294BB59308BC6173A4CB9840D4B118E31C479ADE52D9D281A9B97ACD9CFF85504C2FD4859AC73653B2F08C1C9FE2712E0BBB26EBFAAE8D5FF3261DF6C1AA330FECDA245982D406E607602AE5058242D7040B8A0A0F8FE07131912FFC80895B0A3AA9E3E8E932A5083A4C987D4DB0FD651DE6E00FA13B6454237C7C03D069C57ABE94F2CC23E23E648CA81DD010D064065CC225D70657A5145F947D4C8EA3DA0695D7DA7569FAC76033E01AA3C2770385E8633327AFF7BFE3B36FED73CCF8323AA2949A3EF3AC72F2D2046DB3B98FEA69FE98B3B9FB9CEE71ECF90DB90B65B27417A8E1656E8444D5EB6DBDA3AFB8BB527A26C51BDDCC47938254E38D58853BAA17174CE36ABE1F4708871D41E77F240795CDDBF5115654CF724E0A68C776F705CF1623989B8D2E047EC25662CBD1075FA6CAAFE7D911C61E30604E3361925B922D1481A071918F0F2F28A4EEE8CCBA7FBC6FFE2C0EDC102B0BE7361761E6C75B1441B9D8D22898238CEA6204B060BA4CAC3F174FB103947C08DE40753F3CC319E0EF163193173560BC94C0A24646F298A3F24FF1C4E6D322399C6F92201B288218D443EA102CF2BDCB016FB7F4E1EED7D48D4316081484109C4F9588F8D909D9EAEB0725F6EB487E3F12A1E653A70F3EA5542F68983018F5E9907BA9B3AA86335FC55202937D0F45D43389846C51A121346AF692A00F8C4627A3BF58451EA0E8EC047A5D2275F944F67305F9F46E58B218360810C94CA8295BCA1A3F4997133360683E8F83EFEFB8D27EA6448AEA02F5507B5C1ADDB848B5FC185A934FBAA03E6FB058C164FF4E0304E388487E1C37BB83D3FA64E713565CE976F9D1C6C69BE7EB6519E67CAD95E90D4FCAA8AC90D43A2074B41E0A6F7773B618DAAA16075104D9BBBBD97DD219530EE47AB277AB0F5A8378F6345E045CEF9D9C625D82F568912C131140B98FC8FD5DE20D5F2F33A542129EE85D8139D1D49FFE7C49C412439F9B62528A1D1FDFF6B7E2FD645E63814F597BD52AAE1D90E0054B6B1A7D11D3A361A46D0F12FBE93D236911D2A2D06DCA1C9E71B6A439B75A5513077D568EF9CCCED07181629277AEBCBDD6547E0163BAD4CCECCF5CB42A87FC1764AD39F289135557B5F3448C8903C75078D05A8AE2F77E60D5FC2BEEB2749EF604F05442E1DD139C97545456351E0CF51248E9DDB5C18E5FA8D66F8BAD3F87EBE09D0BFC514020960A4EF76D357EA5B7338898AC6F27C1259A52B1687900BA66C665D8351777298881A7917A Out = CCCF1A77029D9C52B4C36FB1C15EDC2539FE0A4D6F51CD45E613AFF6D4D71427F104DF270B74CB9370FB847CE64DF227D9CEEAE19EBDCE1C1A281B5D67EF617528B86BC5142E4AB877236AC29B8E290B941134B8C6F7FFE8C4AEFF033543E30B0811624C77E0B5AA06988B46EDF62AF7EFA71749BB1E18C302B5254AE3469BC14C640E01F38B608E5311C62A47D2FF307A7C5BEDECE1B8B01A56165FF8F6D68E979B5C35DF532933635E4D2A9E4127D2B7CBC84DA74FA6E7FB88A923D794ECA14E45C33F728D5FE66A43965E13F535060CBB2941979F934DF418A5105F2AF9C587B0260CE7917A06C03FE5F345D3059FC783DFB513378B215D17849A671089A3A5A136B79438320FC79F05D03F96910BEB415B744B28B80438319BCBF2681DA358387201E74D68FC65DDE18F7A7CE9C38342E8156D685CEA43087B5811ADD784413F4A4898372522B341D40EFB7A4F37BE9A9AC482177075E0CBBC95A4616724A2697566A827F18789F4A788B6FC5B98EA8C52D4E5F57E89CB4F56A2975017B39C23C7CE80DDEDEB0D4B008CFECE71043EDC59AFCFD7B880C246F4F4370D733D7671B417A39CB1AAAFE237EEB78A84F3DCC396E12694FBB841C8625D68FC3289F56E99D0BB17579F8419E0676C8D4067DA5B4E0588D0B0F9F2A0568740475CCCD9E1598E905F5D6E8D2B3FDA6126CF3C954CCEE4997BA4BD27EE1486156362B19287AEBF1F6965796FDFE2EFE976007510C0B452A97035A913999F690E43D23EFF7F97209E6FE6FEB3031C5D59D2E03CA437A5318F9AE83590458F64D39ACEDDA1457BC9B7E87AC666773580EB2C2B6763D98DF65B6CEA506CDE22513090F35EE5EEC1511D707E271BD8B279B0FA06487F9ED4E462282BDF4E532231F9465D5084772A152E50203F185335C02CB65E29F6FF02AD2C0069DA80ECF10C8A8794E98754929CB2305E2830B457D9DDFC7C8589A91959373279A170C7D39B25EAAF3C0A9CD4B5FBC09915C9ABD9B3BE52B1A645CFE72ECC29D86BEFE3FD4EA60858C674F4B80514FC223C9551BC5080DCB55BD3FF5C7D6E506824236E9168B43D038EA0899925318CE4AC85BDF007B5586DCBC226D18B33D17D6A2B66F478827BCED487D62AC73AC4A1DC503045DF98B3C5C60ED32B769E2464EE09D212A8D02A30CD0841AAA8EC3F21EDA30B2D6A2B87F3BAAB38AF5B5478E004A9F3B1EFDA02C5024E8C83FBBDD780E7203D81F08FB024EEA7508BB554E98A0270B732445E2F57D50B82A943BADD2729CB728E356F8F64564CA55B545332BFC24FE5C4FD6613E5F82AD6163A9D45E22E3F871F7C7FEC2C784E2A886E781C3B45CA32863C729149714EFE9D345E3758F9BA83E25677DB261BED30EA50689FFE39862C225A605897779FDA656B12DADAAC515B4D05453B4DB307D5D441BA48590D0215547A024A6654 Key = 1FF724B44BFA454A160460164B97E4 In = 40B8DA2DBCBB6C202250FABB2FEA9315D78BE5208437616A16646CADD9D0B0AA2239BEB7E698A7C764CF33BE1F3A783F0FEF0746253DAA0DB5C912440C58A8B4D17A4289FBC819E1EDDF26395C7547231CFDD2ACF6D2CDB9DB04AC73BBA3841E5BB476AC18E39E010DCA432C171D18CFA150A2F8C913B0F00BCF61A976480183A777A1EE9280075319DC3FE8BF35113AD2AF6A8869CC637289D8845E2DEAECE42244DF5F8C3610E0BB3A16089D32A41887DAEB15534259A0852555AEA52D7BC7F4DA9E8E93D236151742522873153BA0E3F083F473C0F51BBEFDB322B34BDE7E9E3B2CC9729C48AA3C6A27C54550FAB48F805FE4C073E1EE4B593CA15D6E702154B3825DF5936E97238F6184A7FAEB6B33C25F9C5E92009A0A5684F299AE7DA60B84653B4233EF0254726FC4D2319EE73644E510625F80D02FB4D18D210F019013C9B76421BB833DF3A852548F7DFEB8FFFF3168B32696852B85B7CC62EAE28D3B4BEFE4591BBFAAABB5A42B7B600F48FBC8A56555499292DBAB37BC69D93BEAEE417580EBB8120BC6016E1031C9FFEE3BB793927B632D35E2573C067D3200377284395F995FC6FF47FE26539A55D6697C5B8C52FB1836B7A8C0A691DEBCFF4F9DFC32DB43B3DB5826D4DAC23A1332D2F8EB52DDC4D0CD1D48A59D89A168EC5DD80D3389F88694DD53464BD5BEE3D60BB0C20805CB1D62BF86F232B0CF9CAF75D2162AF79980CC4989B6F0FBB505650EEDB311020FB8F3844C4EEE994274E190A42B783D01C7DB90DBB237713E38343E48D53D923426EC428491C446421BA13DA837FDF7BB1A3810FB05670760F9009C117CB02E2FBB51E1184402FF351EAFD2ADB05BD0B319E481B234B0F1512308E13C91411F9C2D983B615C48055CEFB1003562C1D0B29E88903A6DB2815C8B5BF146075CFA14CD8CDF59DEA035A7624697B1ADFE64A8BE8980D26AE531AD9139B1F9E724A2E431D4B170F46C42E84186747B163C39A1D3BB3C2AD0D73E2FC19C7E1185E40F8BC81D8931B2A86CC56A4A4B0C422031F8B93D5BEB68E3A26BE266F737DF729FE815B08A2877A6518DE1B753F4DF16CB655C0A27B420BBFE0DC997FDD7EDE4F95F04F5D53701C9FAC4353D4D9370C9438F418231C593FBA37777BEE9F42A912A70FAA1B82B711300E84B2DB12E872648EFB2D91B4DD25F5A0B9EC113F76C9410C0A43B48E70D7D37DE6F505654BC209A42074E3BBDB04B57C1DC2C15033D60666C49D97EDB5649D6265238B21EAB2C84E0B5205BC671D457BBD1BCED41D57E07304A72830E26DBEAE598447AB16A767DEFC3487487880A81DE64DE84CCDB067544445DABCAFC048CCEE7E5AEB6782EA6F1E67609635676A0F13830C3D5291345090C822513FEDE4CDA4D00137BDE30683DA84F58324413151D33099C1869FCE3660BB6A30E11EEFBAC191AF5 Out = 43BE6EBB5571E9AE73D0A4F11405E5A09A248DBCEE76D9FFF09318E5FDA50B86CCE4334E6F0CF79AA44083AA896488ADEBA02C038543F7ECA4DA5B5110EB3AD4D70DE2A21A32B568F05067B093697A1C715FBB4685E622ACB8F3E6FE2C9AEB11897969395C387B25791A648C7A697110D5787F32DB5EAAC8B04B24A1DBEE72983054ECD00A57E37A5C2169D19B2EBE8E76F1A99312C6D11911239578C1F2009DBC09EA9F38F706AC5E59BF1DD489AE38F7EEBA9692471B2F342E87A4E794BE9BB0497546B9D4D45E381FF3D45500EA202DC2A680C16BDCA210335BAC87D274897CCF48E6E813766AF5461084289CA27FD283561E82F144CBB08A704647E980C3795200C465D16A7668B2238E70DA6A81D93DF64609037D22CA744E7562C0F58506B899FF1339B93371BFA5F0230DA5883634DE5C5623C67232358D3D38379B82EF5A3B08BDAFC618E92F3E8E65B179822B2421A6FEA8E385184F17FE136CC4D9288E2AED7F4BC8D9C26106E40F8AD7C8F158906A0579DED7181B04E6EAB501DAD016A098A8C75D159CC2898AAE7E67E2F0D3422433C4688C566FC0FC214628F6BF0126C354ECB7A626BAD22878764A370F20901B39A3D16E9E6AAF9FF74A532712DD9A4CE8E24B53CBC58DDCD96B41ABD04A2BCB4A6B968A053D31EA7D8F8D656AB9466FD46374E452ADCBC6910398441669A1A51E1F80514FBA635B807BAD7A18D00F0BF39E44C7FFFD97B2083C7361239A67731A1A68B53829CA92B0836F94B76DF5CED8A30DCED3F6D231C2C386D6FFC86B9F556EF871E0ADC52D66AFEB91CA512494BA5ADC302B5D30F7F84205F593BABB81F07C3C5AEBA649E40CF6EC903350A01E30D1C24096D4AD06462E914492C0E342CE333D1D05D0089125C04B82676ADEFA258BA8C925E57C221C5FD169BDB26210F147E56A1DFB1697E7C21F8131B9C2C4DC5D5579B8E7DAD04AD45B1E1B8E2EA6A1594DB7034995653C9740D05C13EE79FA642448F1005B3DC1FB2AFBD2FD4B7C5D2CA9D96A3F22286C26852CEBA0765AE8C11E189D8E979B385A2DD77AE9DFBEE9EAE48BA0A068F9689099D360EB4C8F99C1978D6DF0F2F3DD2B721A9079D475E0CD066E287D6708B924B78B8619E7154571B055E6D9BEC0EBCEB74EF927E730A962764B09D8CFFE90EDBA0A782376B2C0E9B840F7AAD85F8374C741A8D65D3D8FD2A4CE9848BC6F259CA5D01151C11E137D539991F0BEF86854077180285813C8FDB5E65850EDC53A4238005191D798A0876BE174980E1C8FEEA43E53EAEB2CBF02BC69862D6B9771F79BD3FE544835D9AAB1380069246C930BF019FC0138B6ACB2BB330238DF7848B423964C8476A8E5A53E0CC259D4D58971E0889FF10A04357BCE979C640FDE60ACFA9FDC8160E78490CC6884A637BBEC35D47F3C5E1E93A3198EB398C47850FDBB3600 Key = 9503468A21F5695D3D070FFC76E14A5A In = 92F94DFA72C653A73AC33A740CD9C917466C163873B9D90F4F4D6C8FF427BFD0F24350EA3491783D175F73437D8EC634AB63AB445F5B30BCCBE09FA9825AB28E326FC52CC33EDB529E92E75B9D5E447BBDBF9BA7D6F04967E90A56C144B5894D3A3C4EA2FD61CC59160E656B7AF60D6510A319F043F0FACE3E9E8CB195DF5D2FAE6D45C3300092E26EE90E1E714F41F165DD22D27026A3D68E150AB7C6A81484E2A39458849BDE93F2654A35333DF2DE42291235E2462647AEB37000118A358B9A3E1CA8130F7B48DB7BC2AAF7B5279B6995DA28D8942EB41470E30F9885ED5278DDA22A69088BBA20772AEDB1925261B7480F73CE7837AE3FB198E39364AC30BFA6C20E7A8F95D0A456A20AE83C028434545EDC952E091B12537625B9EB8487FF705478A34F587F17DA64EEC9B0E9CBB609B9AD290A6553709EAC85D50CA733B35914FFA3A39FA4E0A0F53D8E2AE80D13401C328F0C51C45EBD0EEA1E73F1CE5DFAC5F04BA4D6FC92CDCE759B73A30515F7EFBC206FF5D2D5F1E638FC827349FECB9221DCBEF64DB66387CF2BAACB9E97ED6966DCAC0919F1FB2E0A0044E48623C31E47B40DE61AA82D703E5ED5CC7984FB73F3EFCEF355ABBC5A75C4CEEAF34D41139A1DEACFC8416150A231729C3A609D2976C2482D7B77C73B27D8B20369426F525E8D0A32D500A155BB4E2B839BD10556CEF79EDD1549EDC8C78FA6718836AEBCF2DA9D5D182A543C76A37168C7B1CC201AFE0559D2995449EDC7E11EEAC81577351684871FE7CFF80642C238C4E376A7C61E8ECE2E9B8097AF9ADE84114B8FCD4337FB0832FF59E9B6EE2974F5659F8401908300FC99B93B5703B773CAEA586413009982BBFA293F523F3981E80712F471123A7235458CCC242F4CFBFA2DDDF55084CA62819D4CF4F01020BB2586701AB99EF0E40CFF2AB948A9AAFA44C1FC1EFA3D9F2F47F91BB8D645EA0699051B83A61187B48F1DA5FF1E9347F8AFDD042BA30A193E06636BD8D6AFED22A8E67A2E9B4BDD7FBCC80492F9D37FECB107F44D93F4C352A5CDF6A603F3AB39E78062B046F679D6CC80D87CEE0F9F718CE8EDAAA6C8B2D6C70AED59F58C02E1279F18D68928C4AAF2688E8D28300215531C08C8E8FD91DF26C06355364684B27826322A0D247E5866EAEC66AA54A30C97E71AF538B83DB2F89168B0FB6737F9E56617DDCC84CF7CDB9910CAAA582B2D18CE103D1466F554287CBAC753FABDB92D4B3500D14CFB5DAB5BDA49FCDDA541569DB38B046C063B2D1DF35CAEFC183C7142B4A8FEBFBEEB25671E4B7844E82D7B11ED990AB4CEAB28C876764C1B3510FC50D4E4DAD614F8928592ECEB38FCA604C3ED3888A45A8AB951FADAA962BEB81F5A517821DE7B319DA9C6B297D52112F5BA0FBE0242237082BA2B0081F21A3AC1EDF48DDD41FEE7A227D0A3B26FF0DD73 Out = 598BFC4E02D49D5D82FF1031F230B1E9D289648EFB03F8D9E7818EB5023066F4E5FD2A1E401EB20581A69C2A084E0DE4436AEAEDBEF9504C7C0560FD2AC6E94BFCEFD9703C8B959BB9EED253F4AD7B6BF476E7F122B5196A45410C0D8D53FFCF7CA72DCAD7E3359ADD694EAFFC5BCC4D062E129595490147C070FC21BB903F8964F234D69B890527985CF28E003B0E82143F87F91B7042F115AEA2CE15B49F1E8A2A9A6DB2B0F0478847880418B2FACCED2F54E7BD30BF766360871EAEF81758C750E8D1B032F299152ECFFACF43E726AA158E26EDF352B185DFEA6A452E0EE95DB05CE56E5FE2F75C1EAC692BFEB433B17203118BDEC883591EE735B889DFFEE6880721D11959910A3C0008D0B148FD73F8C211AA4CCD86E1BFF6C4C02B87AB5DFD911C00841289B5969D481B798BC9E0E91BF409C6C1F84299CC31EC2B7ED0A84FD1D4A26244EAD85F81121949CCE7973D1A333F301269A1C437CA998A225AFA8394027381D37E598FC00B62E58CD062E415CC2D6CCF325CF44FD9B56EEBB1F9BEFF521710496C63CAC94FA1095B41745DD697138DBCD71C096915874615DA84CB97FAF5269566B4530744726C911AD5D6F078F9812091C5E6B0523FC9070AAE823B9226CEC9B70A36465779D6766A9C4711B403B207C9170E1739E56443FDDB401E1937F86E8319C8E093D01BAF7A9EFC41D84DE3D20B60A69A9D92591E1D91D4209E987E5DC413A65994EFC6DACA40E6BAF15E61495043FFD03E94A7DEC7E98004B93822FE56E4FE51392E24DA1F401EE1FDA7AED2EAB1497459209FDA614B3A69DE3F3B6E8222962A5B29F0A28859254AA3200A1F59DB7F36AFE39E0F7F2B89011725672FB8B3F282186881476F69C782689D6D7ED426B1D58F36B3F2E6372BFBCC89B4017DB81D350A23F59FAEDDD3C3A125A6AB46FDF3E8C12CF60F850BF651FDF60943AF01FA55E40B4D9DFD31442892B1FECFD0C7402DFE97F15F33AF0A1FE70EDB72F555594E67C223041699136F9D011231AE19CF6F25F5B400683D07B2C5E91BAB306EA3D7BEEF47F10A951BA2FD7022AF668117BA672D9A3183F908EEA212F5FBE3D7BA26BB0DF0E1DDA4FE80989659FF10CF5EC682E431D7D9F0F232C39059AAAFA376584BBFC7AFED07FAE0CBC9B241BE0CE4A61649D97536A47CBD2C875B9AB51D255684CF74A99687E7DB759056C46ED1F826ACA2BD9B0763340FDE52236388FC68DBA8F620F07D2452E7A8C67177B1A51C74CF8C142E33D89B78792A9AD20A7402C963ADCE6AFBC5D36592AB284BA52C11365E256FF4E9309F00AFF74629DE4BADD779E1776A7D797256FC667DE3C2D11E27127FD24020C84FBEC99BD8AFCA2BA1A3641B97DCF4594CA0DA9BA814D4F73349D7E04D3379C548245241CD5EFFFEAA0CEA8AF3A88162B9B83B743DA7E5998D8F00E3955F2F Key = 165013851816370C99C2B47DEAE6F41DFB In = 19B7000075DF02A525965B3F59A35D09F38FC2FEF8564F7DD39C34D875C692833BB9547E16065EF7238AE95F3A39175BE680C63B91AA592C9DA6D6AA31372F25A3B95FE40DFC0E9B4F45C703CE60E7A2F3700D81D7FB70CB958F58A841E0E13D431FED62A4298D73BC4D0935E921B3EC670A1260C20FF7557609166D40D32A59AA67682173EA2FF7B21589A37E05054C413E78CB3B4CA675A32B32CF92A63C3CB115340DC75C3C8E45F33AF4B31D8B4AF466E7E054AE8D447BF359E5BE94A34B52D1FF16DEA89AD84811159D7A48967A29BD8840AF80677A15DBE3912D2BF2DB8F998B20516B2197B7350967A5C2185CD6A0AFAB165CDE4C3D9CE0DE066B25EA297FC710B3CC21CFF4D32A7F7A0529DA626AA0A3B17E890D6BD1CD6E9FECABD07B8DC7D0860E45E5F3A071A1AF0D461B0D9C94A54EBD84EE1B6D8F0FBB432C0A73212ED19B16461A5B30F3257C93060390C1D5A81165F8B341BAD0057034BEFD47025024E04342099F78973E46F6E3946E7AF975856D28EAF281D23077BDA73F1B908B6B88FB40FAA0164B3D6C8A32BDB61BF081C2C043045D2B2126E34685C87721126DBCF2D226E2584A2C1CB67676C06EB19C9BDD7F4DAEB02289E748C0812723FE99BB09CF4837831B59420363A5FA7E7877715273F7C48AF2CF03050C0AB2AFB8888CAE62F5DC8B705DDD851B8354A30D9323B77D9BC4167D2715AA21AA6D566F1392F574B5A23229F9FEA21EACE9736F323553C2A6F294A4060C7724C5D2F8DEBB5FC7BE61AB25752881ADE4A6C1C1B9230EC89D181C2EDCD9C0393BB0E5C22CE3279B918D990368B95F9D84F98A7ADF09C4C8DA5CCA026D10A46351310F63913EF23831BC66F7B405EA97BBFA8D74C049C328FFBAE1BEF8AFB5CE8FB7EFDFCA514D45036BDFF84045A911814E5B28CC44CEACC7484BE3C399028E31A585ECA083EF18182DDF5E95A68C86BB8249FE534EB66625CD7367B032234CBB52CC5CA4C49E233148156D45BA7A80BEBE4DC4BD412777FF38A6A9CA268ED707C86F1C9178F1C51B69F3BBA9A751758AA2A66240ADFFC178B4428830B0D6FF04A2183224B627DE686526D460A4ACF890DAED0E4D2F181F692AE66336AD4B40CA11302F0D4FF97AA219B60477E2FAE0A8682F4B87D4507AA2EE2DBF61F76E8A289030959812D5BF2248271E10BA6D83BDB71FA6BFF16694EC5F8EEFAA2642B3C1C661BD3C60035AB7E4AFE8A1361D2EB0845F6DD37CD5F8EF5AE403D9436DAB73F0D3DD408F9AC933442405B3A4C2156EEEE9E4FEBCB41774A96259B7C45F513AC24A8B8AF555355FACA9732A8B95062BCDF1A18E09F75F4B3D7538117E8E8B449A212A4ADCA3C6724799E3B2AEE646F31A3EA29A211A4209F93161E876E9138C4B6A4B654A08184A4C2330F2D7FDA7F9C61784E4FF04F87ED6F30D95B857B022A9 Out = 4D8DB26DD443C4495849B1A9F05D59A64B88C3BC7C6A8208E02571799891D1BB268DF842E16243738DC811CFF37E10E0279C828AC5922191D2282E94B551896B6C86EAD7C05A7E25CB5854B27D1A3680EE75FF75E5F5C2E421BD7F3996B19F5074A2DDC87326F7CDCD0CA4E56112C62424961FE8A8FC85CA6E56006E5D9BDD1A29CB831B9421E89C2038BA958BD00D596CC7F6440C61E9221F3642920ED9E1634924986D9AC1F889A8B02819182E1EDCCD96F71244A9BFAA2097EBE53B18222FC15B219AB3E410D7272C8BC8CFEE1696A8B90E2B0F9D4044728DF3BD8CCFF988D5C1FA679BD78D51453F796022E7CF1AF96619E999C3A574EC2C2822D93B4E0E9FA31C26429019F59D362CB996764D2246A8DE9398043BCD292A1E492C794F7E1DBD02E3E0E73E7CD381257C4402A8FC6AE3E686AE844241F191DD557EE254E1E8AAC99A3E946682D317563C473D653DF8CD5818F615651EBEEBFDB2E8E27F744D4B830C72B69B235EEC4AA2431F8F35B8C73C359B718161444425EE5A70F8D965FEACD187ED4557B56260AFF9632E75E0609090B9F130A9A9B81E53C83AE23B36AA78ABB50AD0CEF64262D7B106AFA9CC1EE9D5F61A6EDB232F2152902BF0AD86101CB7DECAE8E3CB63A515468AFB873D8AB5C3D3F132C2BCF29C8EE9C98E7FE3037DCE5E1E365D0F5BC33190892FBDCDCDB1B9C49315319DD3F508764EE6CF68394D46A9AEA9DFCBB03E3C60E70989C5CB645CE060445D2FB569F8A7176B067423EF657396CBF0475F2A79BDF714499F642A064210A538EB162C16F505AB6B2C101DB317DC9907BD8FC42CAACA246E8A95A2DA8270E2F32299039E36CF1AD0AA880707318D3D998C5DAEA87A5746C754E3B64D121E3D22F2359FFACF08D9C5EA0AD2D6AB9760B4189CF532686C8E137255C220BED27969D24AE1DB6785355E7C789FD8021075E243FA96412D087010B9FB20B10479D055F7B7D631F4B8DACC3EB5DB5338A94775F9191D8361D095E8B29C56A8206E04CDFBCFDEB8AC953D3425F41E1A6E313FDE132EA0425BE42BE8F4903D3091B894F08243F59760CD9F3FAF8D7ABF567A927A99C8660AC55C37D2E0BE845A91A47AB971C684A28889BA53A2CB81072FEFCDEC751E7D5A0AFBA49E31A110B533335ABE1A7DD479E20BB84B73E87BE0C6255F9A961C68BB3648309D2F8BEE5F24D4A30B8690890F0BDF36980981FCC7BD98889B8DB4087C1D0C20022018BCFB0A1B22F330F0AEE6AB795C099C214215003087F337F574DE917E8595745DAE00494E4339F634F3A2E98F80380A05F9FB871C1D14719D7E95241ADBD9E60D96EA50978234BF71BDF5330B2793B8E546E075527A0965E60064C8AA0B2CF5D2EFFC063241D4363B1893271C6B3DBDC266FFC7B9D6644003C1BE5CE1C0F78A7FEC3346E31CE674EB59046327070E Key = BE6281335EA5230E73E784D383537496C36B In = 6ADECF136BF4135FB584DC375E92B88C14F8EC184BBE9371A97045A7C3FD0825AABD14A4FDC7F587BB5C0A7695F738DCA4A3CF362058700F4DCDD4420B6C236B5B527FC66CC6A13543A51CEB9B42B21C9EF4B368B541EB880A2AE8A7C3D9A94AAB6C34739180F07645B7B523B3C05A97AD093B0EB7010433BA92CA744DC5190C05F96100E79A3C264A4B81D114CE98AA84F6B1935EC21C5EA5035756C10399BAFDC1AC3A42BE5611713F5FD764F7A6CF3DAA97B36733C1AC71F4B4C3E078D95A05D87424689E70CA8536233D733FB9C9AF9813AF8670CEBFD81DA31D3F0233E0B8AC6CF65F720E5A8EC0447CCF961A25A68A1E50D2D1D0F87E0089EAC17D5E778243408A9CA33AA73426BED6EF146FE083197DAFEE1E7E08080A82A61ADFA9E2B69725618C3507215A9F599B29E43E89800ECC4AB9D6050B094D4E22B4528F9874384CCB2B87D91875897544806A1BE8E141EC84B9B3410DD33A1DAB0FEF1F65ED0B8CF2C43307D86F210B652E6684E6AD5A5CDF581AC46E5E7CFF68E80252F1CD6A8A73D13855D5C338B8F24C8A52AB4C635A7C895B365D296AE3B80AA73A514299F996A574D7FCED7C249CF14E3DA02F36810AA148FB2FE42BA08104FA3C04B2D363D17FF53363D2D33FBE9DBA4777BECB70692BE9DF4A110327E89B1E322B9384655E941A12E16BEB88EA1600A5657F5C699407E132E7D9AE03D3F39D3F0E3A0FB459761361DF949020CE3B75AC49B58047D1D818F3443015DA8316B10DBEE7F8629E901F63AA8D2EDE58E77CEB5C0A94B05C4D87ACDD3B976EABFA39C4A5862A4528166364CF43C608AE1862158FDFDBD599F8DC1B67A3B6B6FBC296D53878F5A01F5DD6C5CE02AB9D4BC7563929BBF3BFB8C7A8F603925E99F98E02C3CEC3130959F6CB9FB0CDE693A3FACDDF06A33E4D766FC7E01B3C67BA4826B0656BD7BA9E7CEE5504524F47EDC0642B707BE5E11ECB84908B95488848871FFD96DA278AE7176BD8704836E248CF9F00CBFCA2EBEA155D240F1708112AB0F31904FA684C3AEBE5B9F5486D8EC0ADD1C9A877F3B49E5DC7305F99B0DA97D453EB9D1ED41DB5CF025100D048404951DBC804F9152B976C0B08F02D0117DE4FF0231158697E4DF098D3BE1395CA873BAEE64C36FE3138937EF55D5F098276D20EB4F5D19F99DBC5FB88D57890DB2728EC97D1FEDCD38F1CB2D05FA103B66F591D37F4DFDA80D7F11378956012CA2F5E32FAA082565420EB91476A337CD813665DCAC92FFEA96B4300583C6461C231C7654C8CEEDEB775FD968E5B6F2BE3A3A29EBD82AFC4E475FC4F71ED41C6FD825596A3E1D653F09DF2E1171ABFDBBC70F69A7AB8712A03A807EE56CF0A2E2C1077F8C7C5C25FB1E981A1F837720742D5F191D5F0B8C6FAD60D4046794F932A03956CC5436C74E9400C6F40E0F35CF54939C7851B5D Out = 3142889174F9F5FD84846155E4A752B91E7A9E549EC7EB806A046E3ADB941AB1A188C1BD0EC9E93D60A1164F440D0AF639CFD40C6E17A20B24D2012479FA01819EF6DA4306C0E642A0EBC866E0BD1006643D120D90C50B224BDB742BC398351FF3D64BB7CAC968615CEDAD679F64C304B49BFC7E275DC66C0B56817F810DBA4BF8CC0F9A71A26AD4E784918F70597474C3C2D7C526F4856F5BC7A939B5F129118DD1980C2044C8C843312C0DD803E9618EC77731F0E601DBD62FB0A4B2F09DF129E054448F59C965DEEC1B04E1865662FA4BFCDB9DDED13A8FA7A6D594F2ADBAF45BCEEBEE017D04FD1CFE071012EC258647FA98BAAA9628F37460289AC598962C1080A33E31F2ED07E510A15092E0374BE6520D892F0621E95D4C7385D874DC8D6A5B79B18E942DAD742073B67AAD207FF9C7F61CA858157C9164592DD268C6627E7873C13831BE7FD0666FE8BCB7D2BEAF2FAEF2C1FAB74A8F2B8E8964BEEE7B7CA9F4C3F58DC3242AA6E40991AE32B082BDAB5E784AA9BE0C69CC386D4074D4125CBDA87C40FF4B6B563FFD8431EC4AF544DA3232D78CB944592BF3B48F912F2CE5B8872631CB34FDE7B204C0E661FC9D5EF02070BCFDDD4EDEFCAEE5DE676740255BEE02087B8DA08A6242679838DF4263EA73C61FB73B5423427DECDC131E1AB0A485C87ADE2A3E6A41305948010B49D03F1AB428243CC98C43407BE41B715752E9A7B4342C21B16EB9BD740511C75646C3C5BEB0A8A66D2A640BAD624387D8B0889EFB7193642EB0E8A7287EDEADA7DB365202C1645B622B0EAD1A8BF2290CBA6EBE9937428A61F3C5C843997A72C4E1AA71622394533630EA54436061EA3F34FD4259CBB3694BE5E5303718FEE8D548F6C9BF03EB82F5693F4152638A66116249E32D68F02973258D516B9DA2ABE8D13C5F189D79A61284B6C0F4204E6FA9B8B7F0401E95B569C4606F3E5D8619311129BE3D63489DBE29F47F4116E786A1312EC53540FDA97F8B2C118541D8660D33BA282B7BB43AE1993DADF500394C519F32D2EC5BBA04A1BD02E9AAA084E127736C7486C878C1DA4D82CF94CA06732723197A0718B99FEB0504F01C8B7BAA2F09BE0DF739658A703ECA00989A0B608F9FB4627D56FF08009DAC83876AE0856E42B24B3A5DD6DFF8D83CE07EBA0F21B570C0F206238D44E966D63DC94A2D715C9A56A7F99309F8A512801D57000BC59E57D2A856CCEF243AC153822FCBACEE87C41A75153B71ADA7B884B75AD7E5010FD3C9230230A2545E784FD029C0B86F81DC4E6DA708F03F6A5167C5C793EB8FC29F51A3263D67457A631B37D65769BC9A252B761C2F3E982C4E9F1CEDE6A7E3736DB8A7433FC58136560AABFB36A2C3495AA8C1E0EFE79BE95CA1C93F3857A9D8E8AF64978D4B0814C480906A3CAD1F34FE90003B2C7CA883977ACC62D148 Key = 99972572DC537442E8C105AC248DFD511470CE In = 4B5B723AA28E9E0E919A276F20AA4375FC4FE86BA5E9A3C62BE3A5CCEAFA5D9245D4840F5CB50B75312CCA8A65BC43B4138379EFFDFEDBCC90E6DAEA4BE65ADD65C765AFBD0D4D76CEE405C12C56DFACD8B17A1F4C1F91E108C30E529B8EE8544A8B7130AECBD2C208BB841F5D50BFE6ECA6D262BC2912A1FB4EFE644C9E64FAE643A9C8D554B6DEA630D4BC2112E898CD8C2F9BE95FAF38F7263113336A2FD99D2FB5F3C1D0F977CFE561019C51C92A171D7E271FEC0EB225B55A7764142754DE8A2F9145BD5B9FA8CB9847D3813FB5358043799C7E3A78FB7DD8938FCF4E064D79782E01DEB5CFF083954A687EAA095169E02F1C8CC3B5084617BA9B89D542EF9B93F213DBA1B4ADF45B87B14394E6AF7C17C6D79F136DCBF909DF8FAF62AA70726998CCDAEC519AEF238D71FC031DCDAB3E79DCEBE2A7A6241207FDF5B66916CE31DBADE4093222B0D1ABF69A9FA90F9BADA3373A75F18625FBCCC20318B7B7C1339CFAE3122A7AEAECBDBF807D0C4C2BA882467E1FB72458B70B31BFB10451202CD10AA31E12587493E66B5282B2D8FBFAD823472BEE1A66F63F0471E985F10DA9FD43B7ACD6EAF23C56AFFC83192A383D9B69ACF3033A1216EB9732F88944334EFC31F81892588F1D197ED9BCF0DD40F7EB3CC5A9C22CFDAB86CA0C89C638D1035C978A54E3BA544EEC2AD46A8D57AEC61E534139EAB0ED4095EA8CD5EB132DCA6CB7F988C7A6E0B9DC9D28F61781415666036C39304A62C6482B851819F2E0A513DAFD2CDFF8C8EDC8B6A3966A2F2A9E7BE68655CCCFC768FD92DFB3565A28AB967CB569F940E09FED962BB21515D5C753ACAA3AB2F76C1FAD84F30CA95809772032E23E2FDE043D563FC07D1289989E9859CDB8074B361D06384C295B2943182D7C462E88E8E0C599D1377389602CE931142C5CB30AD4DB3AA6D01BAF616EEE1922379B30127C643D59C134298BFAA172376BDEBDF0DD47B52879172F96B766E30F669252D126E5C0837FECE300B07EA6926BDECBDA66C8EA66B636EEDA74814486E1B3D20FBCB1B4F5DB0A915E3E4D2B1AE7C7A9F13557110CDCC0E71AD28CDF566D97232458F01A803AF9BE6DA0313979D66791130A8E3CB111101F8A2710D0404F32B0CA2F4677B5DCC34542B651491DD5D173C93247657C181074F68223E5440D5386217899F939835BF19889AA6FFE59027A75A38B32CD6975C3A543B37FE3FC52F4DB66BC012A14EA0E2EFA6CABCB6DE0BCA100E60BC25BFB54FD5B23DD0C1A8229CD0BE80B7CEE710CA8598F6B6B5CBFE3F5566B8B15CDFAFD928851E07D6A6FBE26439F1719CA648ED6F4396310B3E128A34C4D5A17CBED908A2394D17186ACF6F46848A6D32FBD5FD8BD14D320E5346CBB73D2A2FDC323F5A6216559D7D0C177803FC1D9EBC9859F71E85E34D3C00A4C364068088609A5F7 Out = 251E008BB0445ABD75C166586B0AFC536ABF124C9C7A5FB568EA647330B5D7EC79DFB57048AECDCAC37400DD26BE375884DDD8F7B6EFDC93DB9F62F393C1987C45B7857ED49747F7FA57244F63F273F3B51D86FD2AF9CA6755568BBA9FA528E0FB43798EB0315653F495727914FCDABC0FE43EA93AEA5893A1E1A9488D5889D7D3ED05584174CB3CD206D7CD4C117933487768A3670E283B295807C6B1E15AC03F46782D70DF796F3A9ABD41D8F1928502F7197A99AA6112919D7B6CE3362787A6A770CABFD4650EF223D1B566B1A86EDC96DC294669161AF5FB414D6EB0912ABFC114369815BF5B9805EFDFA17BD57C8C28CD22A34EB7FA23A1ACDD32A66BEA2B382FBB29FD1DB18B8C3E539B42A2BEC7A14EB06907BAADC0E003FDD9689E26712B3D99261B4714FFE846E5425B1BDD90039FD225EE93C0310583B7D7FACD3CB9644C9219DD9EF05BB58394C6C3C2FAF455AD50558A80B7C6D7C9F4DC2B7086C6E31EBBF9446665F8727FE0AAFF7C483DCD3AAB34EDD181CE00393C93A28C280EC9F6513F0787689C3EF4B98408C110067BF3990553E902D5D3CE1F7C4473E7C9AF84CAF731B5A31D5994E5DC9D7820820EFB514C8BECD773CBDF6E818DE24AA4E461613F7859DC0BFAFF61375BDF20956F66EB534694D14DF29A78A0488CE3766BC85C1FBD3999765572889BDCA13897C09FA11C10E2FC2B24C591B3E3DEFE7E0382166CB2551606876D98B2C77B01B84634BF34C26EFE2C8B4C360DD248D63734ED6B7C9FE0487321E0AB25D428A0486404DABD837884572A0B0E9F343562D7B767F2A5C94856E6B9E3832CBF063B525352DD472275103CBBFA032CE5D952911F00BA5A6F33461D2D536E341D09C3C1F1B5C1BB9BC1014AD9BB25F2F19D4AC04347DC5440581D4BACF25DAFE6B82F526736875EFCC056FD89A01DCDF72FEB0DC70E12C2243AB8A28F96378B1633C9BB08625584F10E80CFF77D050A81A2925231D08F215E381ACDBCF11AF61964185611435EB7C70CC18A2810EDA5B55EF5A622F6484D8E579C7315E78F0EFEEF6E4C85A7712259682DE4003FECE559542554B36AB37CBA4B8BCF07F88241665D806A0A213FBE1F98BCE2895D3BF6420AC591A8FB947E6EF53780E2729F45677E06E425DDF65D545A9177FD99B53BA47B46AFD200CB9301001B309FCDEA4CBF2E8EB9427C84EC9E560CA4748061BAEC60D6FEEF6E3A70679C77066A428386050D6AF7A358A92E3357804DA0C61DAF3335EFB18750519B9B7AD2F3677462C55624611B8F0B4278388422AB646A90705AB52D65B2C6FC4BF295E59EE88CBF8624F1B03BE99513F1A3C922F129ACF665797D56877283F60B89BE4DC0F803762F6072EDA1212C9A6E3046942BF979332386F83F4E6938A2FA6B951C4D419594A37C6016253B88DECBC7C9DD39E1164A9CE64BAE Key = 388E2850F2A8DE89492204876A7DD8A3DF568F58 In = A29E49FE59317DB85DF4CAFF962DA6D4DC94594BB7B195DAE82B7E32ECD55854762C857CFEBA610B39D2F9D8091B38D6A225AD2A2CC2195DCD5A80ABD06CFD12BE30E914C1FDDAE3BDF398E23E994F6877095BD1EC8E48105804650D6F872229C7F0B17C8C9BB9199A1E137BA50A34D8A626C0DFD6AF1875DB00A498CA6F36DCDA712B2A0EB8FEE3AE69F2B6BABB9D779798234165886033D91F5B74E86A91E03513817FE24CBB71D4DCDB3D0AA421E7256E3F1D7F332FFD974403EAC2D3DF374881F9D95258B29E46315D326F08EF18909B2CA4DB8526BCA9B06672940423D9B039362E1CD8EEE68296584D94EEB2162C3735E099519F694D94EC732D59F4E1413601E8177D379CD4CC788DF64CF234A8B1FCE575A803DF5FB44014484D7C9A527B95EDDE983A072DF17D042026DAFA0E3B2328626AA8F84C8FCCD98E321C8012B896C32762FD7BED3F0636C6B9DBEE15EDE2AD9634477F9D9F0C7F8287A1D1C77893E08A2F5C2590A6B8260862DC4AEF39E7A0A4993605064BE04FF8E47E5659EDCD0AE97F800A520E587674F423728EE3A70DE8681B929CF6046551A6B90D13D49A8855A17EAB3F4C3BC4ABFC09A5D3A1876FF119CC8A75623DF7A8731AE551687FBC8E93468C9E3FACC033A254E46A20AB8D0B9FD4EDE15AC81DE9056145339FFBB450F01CC801E5443229DABD75E391EE7C2A62678F851F5F1D6C4AE6FDC878B12608A218BAA1CB258D42C16A84DA809A66772B5EDC39D0AFAD4EC22653FC98C15A033698F1B4671B8EC331A277B489D1B166759A0CDFB997C19CBE2A500F474E0C856B1583AC5C86A655208D2715E3D47A553BE7000C8286B749C850F715F99A971C51CD21AA58FC37ED1E7F2857B21E1FBD183AB8C5C29457C9F5072D5B94A45A5391796ACDF93431E494D18958C79AD5FD9BE02D42C1FA05BFD360A62D43A4F07406A8AD0C67793635C3EAFF28F24FC01360E4598AA651C35E9944CDF1A5A4ABDB0F925C03CA2ED9F3B0C4C7611480023BD8812C47BD61622CC01FB7DD8255279C6B17A57CA938329B80604C36AE7E847D7624D8D296656573A24970EEBA52BBE8420AD06E9D312F05B6FB5D1D45689A072701B0F39AA226A4D178876821B54430F96D480693E5269B551AC45D5E48007D026C451FB9FB9106AF072E7591C6D29803C75D5345A6BA0AA27A9DF7C7E15FFA47EA7AC241304B6D3D511ABD0E4ED9D565022040090ADA249C10EBBB9FE0F7E02922005234428561C7D4A96414443FFBC3144D4B354B50EE52DD31DADDF3DDC8B7B2C221F631279D5055CE38FC5ED54D5D811D84EFD1413EF352B17C94CA7DA2239398896B1559B1EF78C657AD8D6E968CAEC86CA22BF4706FC8CC1D419C6FD40F502C010C65BAAC9394460AA133332E342904C7B4106D1B84A7F6C73599F7F3FA2BB0255E06C133556CA5 Out = C107C43BCCD34DB295D0C6C64ECAA5E37D50DC0A88275976E4C82D93527BBA3F038FAB94F84EF875F0E8357E5459AB23BFAFB1DFF7926C7F17B11B47E93EA1D5E8DA1295C0378DD812A9C87B7F52C21E546462063EB11767774C83D95730EB5FCD1A8DEEE223B95D6F4F5BF16C6A00B5BF84F2DEF735FDA064DE08F192E2D240FE7A77CF4912DF51BEE784A36680F5CBDEF5B85BB912104D6B0B888FDB40B4B90456662E1FBEDA2BEEF8B19E171C0B70B454E10A847ADA2C0760331ACBC23EDE26010ABB1D8166165A88D3F3A6D629695CC614048529CA98DFF0D801687587A4857DA0832D14BC954ACA4E1FE5000B9D37D2DDFE89115F43811F2DF4E73A31B7A0752CC80ED33C53ED53B1E333C2C9EB63843A46B2C40D81315321B657A2426711DF4652CA64EB671E1365C3F32AA90A29441709B77E7D18D9F2206B70BD91ECD39A2B17240508BFCBB2C2EA04EADBEAE814DFA98EE6CDDF7F8023CDAAA12B5E0B6219EFBAC1E4E4D108AF25ED9CCCFF52859CEC02FAF3E809413859EEDD622BBB2B45570364E8205ECFFA530BC98F464093F5A4473FB6C3868CC1691A36CA4F4AE765312DA992E74135EFEAC2F5FF8F8EBA3B17B88247293D6C183418A50E5C06722E0721FE105CEBDBD404714E23355EE78116FE3D0A561EA5C6DD06F509EF38B31EE88B941E13682A3A54648ED7ACAF6DDAFF80746363E7F0550B7A306760480894F6D4B9C449C714F9DCCAC680A494E073368C04450FCDE296960C0021F05774C2E53308668A2828BAA39CB4D98809BD852A3A3864ED137048AD86E121953199C35D955F606CCCF2AA11FC873EE4532F884D9C5E72DBB48FC220D2FB3E53F78BC1DFC39F8631254800A47C83D85953DF95A58FFB94DBD5EF36B456E42C513D083CAF5A5BDA7014759CE8646EBBB99E5AA6F8B996B5389DEE8D4FE2F945EE68A6FEEEA1DCE81CB55478BB87C60EAA1F2D5D7E4F0380FCE0ED00FFFC05F60BB1B685F1E9AD0AD42A7330A9A70F63D54BAF837136FB53203458919882F2F67EDCFBD631D0EFAF6AE2DCF75193C6891A164BAE455E1BE35E93FF1F907B049D56501EA27DA959792E9716F7357182C87E5E68A78A92E603EB82EF4D1754457504D07EAD8F6C13A855A2A458FCFB3D6264BF0C8C79BF7613A1E703E44EDBA5FC4424F86556BC98D89CBF9CA2280F4614AE53AFD3B31BC0A45AAE6FF0744ACCC3579EC6BDA9EFF4332F2EAEC9EC99024D8255C72AD5CA75B2E97004717D04ED6484B9B13B1F3BD1E9B39B0762A5560E8F02DBDAB9BEC8972B1283F4267E55885DDEBF764E26D050D9A148AE386850DD857BD5A3568A0FF8F172F5B9754CCF16D1BF4BBC6FDFE79A51466E9DEAA38C5EB9144AAEDADF7867D7B866A7D76B5BCBD25165BBC7392A3E51ACD40F71919957FC23E19ACF21C5B62DF36337249CAE5FB22A Key = C2F4F2996C7BC1F19B88BA92B41BC6F42BB4DDDE56 In = 40F2EF525F91C2B7A8DB54A86E4CF21B08EF3C7C34450374A358FDE05B75C166B02ABBA087ED9DEFCAC5C38F970EE7B83E932FF490B7DB64C8FE3DCDFA7105C5CF67A159F3DB52A6093147E8C8B7E066723912A8E1D8B9618BBEF57B1696B7DADD547C246F74912282711303E22FCB202171F5357BA41C6D5B5FC32D1FBCCEF5B0A090670AD75C15A7469717FFAEAC7BC588A8D9DFD5ECEDD786BDE5EA70762CAF3F2A159CB1FF8DCA307D2DB822C2DF5B1C3D81FC9D992781B6D5215B3F4442537E1DB75F3CB1DD53E2F26765F9172DF5ECF9A0E572774E8448ABCBAB3A63176B7A8090984C5EBA6AE2CFC0872AA364A5A90F0FE6C72AC3EC5873FB84B908487438242C8324CCAD23C79D03928832C3153DA6D5D5EBE50D00F844B85928F04DA60B3D4C2A81C9DEA01EFBCB94FC7FF0B66AE81E2A85D1C28C5387CC2B6549AA7B6A5FD940E57057EE2B9A98D490DE3A40FBD493CFFBB71D0FE44F58110C2830DD18AA017C0F45480C7B404C73A3FA756C807C8C569C29339933321A74EB2D1001754C5CDCDCF80C8CD3DDDC5E64BA3736FECA5FD9801B54EF8F6F780FA4AD09BBBDB87DF9A07D88B005E803AC7670B236F0C508CC874D120BE45BC9997CE2D56B55F94A547172E046A01C18A63BFF3BFA7D60FA49D1856E002B36EF6D38DF71CD1E45CD6FAB59264F6550DF84591FB7145BE757993AE5B9327CCB5FA23C2AF8B35D50F17662C6A8CFDC0F0B47270D84F4CA8FD35597D18C757D4D474E788098B759705567A1740818D508E9CE6593191820F1735A48B7C4380628F725D86BF1324843A4D85C2DDDDABAFD0EEC45265D95FEBE3F9FF87363F073F1C96E5698615E9C841BAB30EEE72D2C559CFEDBCBD21AFEEB6391EF578B8E6F393577D9B3A36D269E65E673FAFB0FC582DC899C8145DF1DCBBA1689E3819DCD784106EE6642945ACC8C9DC44E45015C02C4084416CE7E19322DBBD5FDD55B35385AEC50308A4CF06EB4261A638D681344F48DA7CB2E0EAE5326F54DE4589E8951B7BC42BE7994FB64AEFEBDB7FBF8949E6D7FC360EE722883A3D06ED3C3C2D0EBC6AEAA0606543888C600EF69C444F08C1DFDAB3671F44C85B0BAB0FC91712D50C1AD979F32C25F3C9CAFCBA9E8C82817D4A1180EB4766CF7844A27D47067ED7376E071BC7DEFCFAD0B8C138324D77F54E3E41D4BB8C33892B84860F97468223D3F155B04698019256A11B2A20E1720E6F40BA100B2D887240F78EF499A5C253385EE2D4A491CAE743FCEDA6C1A0C585992167B6039954774262A9F604A972438AA52C4228A4A30C7830272AB66E23458BBF3CF055EBD656683295151B7C60979A87D806432FCC107C5F533C32BEB0D4C412A0EB7932840B1B1414A3B091BB69201589E2BE699029E09720285581958F71A350A24438541F3D05CD921FDA0FAD525BFFC30F2 Out = 59CFBDC7D164AA6051360ACD53540489ED573B013B52305E530F3D51BCF8FDDBD35DA519C9A066AFA8E8D38E9AA32894EBE216D09C6B28454B2D1CB1E62947E3C7A19A33B95EAE69B6158D7A179EDDEA39CB308B36B8F446EF02AD0EE039225376000A6717A27D8C7692E3D9F210B521C561A8D46E022D56BB93F232FEA37257EB30EF41C92C727126FF7058A7DCA2C5649C3A5AE6CBDB5FB9C5CEE676885A27773433E1E3756218041AB4F95E71771DE5D52E40A425FEE63C3D93A0886D4C56E69E0C01954249210F792B19BFC25C3FB872EC1D9BB94CCDCD695F43F5D7D1210A803539AD9B68BBBF893FE055D715A8EEC0A289D77A3FC8FF9F2B7B6994E476F16988E6DE7E002F0083EBC007F0CC0FACFF5E0238ED1C0598CACAC390FC03F75B876E8B8AE1F35E1A64D3F2635ACC52618004A21B0F8FC204AAE2F8A84FA419A930D266C619D4F736AFF6D2C1028CBB129C355678B5518645316A3F9C38E37707548CD38A24428A989E14EABD3AA8D3BD1252496E458193C5CCFC3919602987E4CD4C8264E1B8279B598A910C235D7FC9C861B517B59ECAF0B797F18519420A993B016C9A6728D707EE7EFBAE8FDCAE866DFA3686FB5C65CCB11A9DB7C7B3D15E8A747679BC9DFEB2177698BE98A216514009BD1BE3C62A0234252DF983DF15969E97F99DA7913BA518C52017B7EEF0B789BDDDC3A083BC1FF8018622CD3455EE108FE7DD5BABCAE1E0E88264016C0A1FED524FEDFAC1BAA8D9D4CA330A27128E2F774F3134CAD49A41548D0BA303717D8EFDF9EBAD46FDC71924FDD61989E1516E4C2CC6AB099CF68A3721AAF8B4FEDBE794D2A5D60F3A618F1D4E697A60C88014E0A9B465538E82FC37F94FD368AB1B0EFA99FDBAD037F2162554C714E1A539F5DC35E620CF81454912E92943AA12CE4447B83DAB8B75EE124A34038BE4297D8C88C6DF3EC8361912B883D4BEBF5858F5116A3B8F9A818E0C19B42D11499A70A75A577E46B9793BEA5E6195F23394EC4AF1F1F4BBBD10CB1B672568795AC479865C4EA8540BCFCE77F78C7F0B0600693007A5B69B68275617DC6ADD55B5192D6A4C8BCFB8B822CB6C9DC831C4357AD605ECE9F15C5C3C0953807E65FB3E06FA59A8FA4314111564691962AC895715053CB22358A69A2DD658F14239C4BEA0D1940F7E786A53E1390B74DF3B176D54272B62B1D61245B958884349A7ECF2ED98198244DD0001FCD5A0FC8B3302B0B659CD94953AA0C3A0003E74A074673E9C3C39DA5DADCBEFD0A638CB7B3711FC17967E44C01B65A64EDF9E9A0DC1DB5E810E8D3096A959C918E9813E2934C8CAF1800B55C623AD350FF26006E97919D250C2EA700A54231E28FC85E2193162F4783027BD86F859B01868678F2E1C911F23364E350F4628570FBD639D15F30AB2BDD7512BDA269C631C3D4DACB0B3FA6F84 Key = B49715EC3C39DFB191BDD75B46A2151C033FEF2652C0 In = 1F9093D9F61F1FBED0E57C530B3A38755A4F8E09AEE810FB7033F47E7461A4B6BB2EB898EBD79B3BEAE94B0BA1F3D43DD186D33F7B0469BD9357B4A8CFF6CA3974D795C11B55F7218FA5F7A65AB3799F7CB571E670F12C5318F734B9A63C0ACF016214EBEEAC2FC77961BACEBE48681EC078C933C24B2A1431AD0D4910859F98BC3D3CFEA2CD07D5062639D5189A0C439D3E8078669B8123EAD0038B9B702A82260014E6A07A965C2E7BC16D5AA7BF8CE23970677144FFDBD4902E4C195A66811CD6C0B3E6F38525B3854620F1FA4B2B699108CC090EC110DFBAB90C289C37171414AB86AB0A1F09EC28A844B21A2A3803D832E3C1704339CECA91B93E98014124E15F7EF2ADA34C2267C5FF600385B6176C2E8DDB02266628EE51A58716F1C6ED39FC82553AC1D646B16208601DCBFB9C75B1821BDE1BBCFCE0EF4134759D1CCE23DCD4BBAFA24D5BAD86D09AA3B9EEDAFAC4B405FBDD6B107D6C65B0BE3194F41EDCECBD1116C19ED72BAA7E1FE91684CD430E683D72AF2E7ED471D210189E9651EEF40943111F5B19D9A05B453006E32323A9489D1FEA7EDCBD486EF8CBD8369CB342048F63E0A8503E61C17A4BA2AEDE680C48834B28B43A7436AE84C1737F68E0E6ED6983CFC17E33515D6C2303AD08971F990793EF2F6596BF67AD773104BD01EC4848122567C6A4BFB0AFC89122296839B9B01A603AEAACCC0EA7A8C0801562F50C107B9FF06990DA929B3A6FC51955A0010FE2C412044DFBB519B0BE5F151AC8FA5A3E537276D8C6D18B9666E607C03E886F74D9F4BD3BC20122C5A111E6CA07C14D3D12D43BB80B5D3D69C11538A56A9CEA77FDCB9BA0A73D992B6064F96FB32A513E310261E87BEB457382A6897334F486323F90D85620C4AD93A7F88A3F310513ED54A38743D9918C4B12714373734862E6EC1E5681E85BCFA8FF283BDA08D7333B95596195E94DBFB5E65EBB0DA07A1A913AC2E936EDF3075A8C6CFD07C80E60B3254C188ECD0661A4E276A3DC4A729E6E5FD18AEDEB28B81694421885924C5D6CF5EFD257AEDCC39B1A8B88406200D19BBEE9AD2346117F576F5AAC7A82BCDE6CB19A1BDCC70F335EF6543E9E25F157E189EC8624DC3B8A6724DA2691E2FCF06CA9AC2D92E9335B70248EC33E8F83532DBEECBBF4B1158F3B2766BBD2D011C931005FCD3EBE3AFB23F252E19D12AB9304410DE599FA6A4D37EC7736155D92B668D7FBDCBE5C2CA70536A5D401822261801D9D0177C81287A33984A56E9FA0DFE02D150A0A3A223BC86D2D7C0CC50E8FFE77151CB709D6514889750165A2306E7F204BC0571BA1581F4059DFFF9D748EB45303362164B24C975926549EB6EC3B4372530DA1A4E3293F1B0403A0B7C0C4EC72F18AB1AD83533791E8846191F0D27A1B8BD6F91A3A8012A18E3B34ECCD8374AC203BC644ADAB06BD Out = 22D743189DA67A78A29148D4545DA4B72DE285A43B42D9CAC731B34D12DDD16541A0EC412A775E24EFACA5C206081E5C3328F88E2BB0C06BA703044E05CFFACE073068830D9C856B2920CC6B006257796A7FE2ECB3CE6644913FB5AE98F6476DBEE36936D386CAC9C39B0D9766CACF5DE9C60084F09B36282DE5F109417FE711E0425BE00FB55620F386C81F0EE91F4E2306D8D134A1A45813E36DCC9F045E4C7A18BF1427BF5C3780E3EFBAFED3E4714A6EC62C0309803C7C187F97C7802DCA176EEE313A574B49C81DF25E427C8C373A9A5EFD6B290AD9EB6ADFB52BD7E3A4B86B056CE75D50AD4564F5755A00F148ECB36673985F8F17F084D75BBB251FF261C06BB1972EF6F5AD98A8221AF8E962A869BA395AF096ED24B58B810C7449E20DA628A69B69673278C6A1DD2DFEB5AAFD226575923095CB6FD06A1379404945925B782A09E25FDAA51ADFDDCF2F8384FC1A8D53D36CC3423099B54B03F0FBF5ED17CF363B140EDD3B4C20B982024A9E4F26C1B330D2A9360B737A1390163E7347EF8FDC960F03C5F9194F8EC838CDFE1FE4452300548857F424ED392CDA3D88F83158347D931E87E11F938BEFC178C2E191FCD5D1FB6087D09C2A25FCF65AC3286401A90842047202825D6BBAE5D937E3117F61C1E212BCD6520BA984C04D1A9A03AFC01793063AD19288FB9AE0324106D305D9CBC1AE8D4CE73808911DC45A3D543B8FB87347E5BD3103E95BFC51245DEA0C6F4AC7E9D40B28CFB48866930D91464C1B602238C7E2C4752640F1B4344DDAB38C34BA694B93E09DC086FC49DFAD08F37C1F543B2768806C39E9386CA47DB9373EECB375BAD545DA04742C67255668B63E2408C564DA1FA44EC9833689DD4EC5EC8AA1525137CF7E935F079979B7E09E211E602A991AEABEB423A939FCCCFFB9EABDD6B03F24D2D0DE2D01FB40638F069234A66A7A60E3D6676A82D7927306865FF74D4456E9B73E498B88CFED4C0678613A74440886DC0A17F948A1FDA3887C99DB2133EC4D8A09CCB6DACE059373250F8BDE5EFB11C3897D592E1B9E080C185A4ADD3C9E047C5DCF9781C228F194DDD075423D89E8DB2053FCC1DEA35FFA3909C791447E1CC85A77B5DA82D2E012AF8D2C23017219ACD2E4245DE9197A0F4EB43EB3B203C930D48287321845567AC0F01B639442715A07BDA9457B38DFE779905990C0CAD83696514BF524F889DF87031B0CAC93826518321921523BFD2676636DE5526C3D10C176AB27012A609992B3BD01D822F11AEC3C88AD3E1CAC3F9F42FF60D4CA0ABC2BC93CD8096D66C135C4FD6E7835F506D26FD5C0A4405FB353FA10BADFDB343419FF6102052362D5CB6841ED111E55B7B609195A36A6E79932C363D7924E6725D28DF66FC871357EF8F78CAD93AF7C20B9CA1C9590EEBF12E15B1A2EBF02D9EC43A78B7C6AFF Key = A0B8CA1B1F83F3303578B0CCC449871843D7C8360F93C6 In = 8EDCB7A73161A699F571C3E4837B05B8510F8B47C6177E293F376EC69B607781280EC24A8EA3F1B57C6D4A842746A35EE44B86D6463997B8F506168C3395ECC8613E1DCC181A26CE0B541551511CD570D3B912F0E7F10EE18E51B9C83EEDD4E81FA6F14529E886A5E6F3D1A815847881DBB5D432745CC24D2BCA39ED8641F35297A46ABFB5E06FBBDC9B23404B42B4F6122E0A29DD945AA3A9374531E60CF973D4E42B5F21385F2BAFA38372DE67205335EA1BA7B9C6E75F85C9437E8F69D48524971B6FA192D6476B16EBD6434A9C802AAABE857389A9538870B7A17D1A62B2033AEEA4C84666EACAAED730D8B7557C7B3D4421F0074372606B95D74518B017D8725E691995E215407F51C745B09390AE6E7ACEA17ECAE1C9786AD70CBBED26A522D215B4EDDD5C5239612BFC9B400A6F33AB66F5D4E96D497E0BBA951084496D8BE3621DE03754321A6B2A9C4394B04FDCDF6069330D5651177FCDD78132ADB1C52910BA87BB544713911CAA9B8491907AA9F1FBE1650A8B03D2165A97E68AB092E26A03910472347D1E12F9868B39B872F3339FA8817FD5427F073527FF6642D20F3DAED64C670598BF3E6163D88333F66F0D6F50952CAB037F29F2C6F5E7985C5C23CFC1AD2A051BC94F9A0116E28B6075138B207DC639FF8D6C96D4ECC9DA9B5365FB61338EE7F398862A03D70819403DFB08301AACB19D5E20BD17A428AEA172A63353D6EEDB8B39003912ACF52C6D6EB1832629F151835D3F518A2E018BA9F9A4D192EA9683AF1A726403BE65C1E97EBF80E55CC8BF9FDC4C7692003E8E5E10B62179A669B7A87E88B8395255344609DE906F474E90A74EE6F88D25F6022DF4BB9C2491F20D0A6AE16FBAD102CDA4A99214BA494D7105CF54D34904C67B76A73B75AFF13D9F9597F07B2C2A72103759A6EA6571AD68AE11BEA14BC8A02EF623137F349036DEB2B1058A26C58502CC55629F3E5EFB9A3F30BFACD1BEB34D26B73666033BC3E8957D5CAB95DB5BE1EF3AC844E6179F5C3DCAE207CEA301937C7B6F6392B7A3C885E291A2772B0F9998D9885362317779E9EABF3E5281CAD5A9827EADCAE9371604ABD85BB9811E9DF0A7DBC9AFDF8C0D2AECEFE8996A6B8C355C49E5638230CB00B552BECA580928987C7A958F95AB3E4C0EB30D2C89C2946F0F7E2DF961C02F8DE4676636A0EA87D5941DF710C55EB37EAF9E2D0CDDF0406065EE6877F259BE5511853F777BCFF730E642C671C12807B4A590D59D40D69C3E4278A32EDC63658F47B0F01A3361136AF4F777DAC44AE1173BC71812A335B8119B06F71324642560A609289B9A7AB6271AE98B3D3EF010200C4222077110CE34558F860C7252E96AB61127F39C9767BDB716EE2E812F9AA39577AD4820C5F3580BAC84D6186C72D11DC2B994F72E7885A08CBAF3D6CDCA020D86B4D885E4 Out = 7CEA4FA938DAA9A9E01D791409298E10C3921441647AE602446766820A0059E6289EEC102A51EC6C884E2B007052B9FC863EE06E21429392E2AED8831125E8AABCF6E184BFDE646279340448F61F1C6351FC6739E088F4213A63BB95B38FC6B83BF38B8FB45D27FABCEC411B6F18A8B9E3B0F4A4CE3DA6FDE2464FA8F37AD06C99362CCB716DE824CCB62EF8F5D8873D8237837F020C6797CFFDB23E004D532E3640A0869577ADA434FC7DD3C1D287083CB2547CB6FEEA2AEB377462977553960FB634700115D677D2C12DB25AADD1DD7D52602CEF1F8861E291CECDDCA69DB08D98F2EACBDBFF1FDB7EF5D08B704FC6C8F7B4AAF2A62A68267BF50FDD92FDD106C56393CF431DF3D7FD82A3517609D32787DB418E2E41C55EED489E3186244DA744D5D50FF4CD71EA8F58C4CCE5D84EBC4D5A37BBF7A7D93994B3B8D41F4D2D2367A4A8CCAFEC61F4D1D8FE637C9FD275CCB15B04964433F8F0A8220EDA6D3B0E96853447BBE97BB9EDCF60899896A0829FD2D0E17389F5A55FBA371C55E7D3E93F27ABE89474A243B2867A1F16F474E6972FD54B8A683884360159F0F8109D05EE799731A1C36CA22AA6D0320BC9B25FB1FBF9F1CB98886CF53DAF959E1FCB277173339C1CDF59702E4E3894843C336B1E527F5CE2D2DA9A22824D68FEA16222810C42A78E70B574BB1D5CB42AA6E318EB0A71E415E9CD0FF6E98001B16134B6AA8CC258652E156B16407FF5F7ACFB27FC869EA07835E38F4476B4D9D014CFD6FE90DA6D9D64C24934DB12D6237F9B782BFE0537F30E1B3115D875DB468721FA0201541D4EC6760C6E3E7D0EEC428B34ADB6F44928739BEA013996A9AF4E1CE74585C8BEED9A8C778633753930AD8A05589138B647828E01A841524B1A87071B77532D7DF33173AA606A196DAC31A26C3B7225CD18A0DDFDEE85CF90D8C2796B1782BAB320116101A63BC4B7C4FCF336968BD2DF51D329E6BAD996923FBAB99E9F198E067DAD4C8267B0B80587C88E9773755D1BF62FB694AE313DC6AA85A4C0740E4983E2527E5CA9C860327BBD67A53B9DB1FBE524F18B422F8DA23323926ACBE1BF751188C01264AB49F0A3DC5107E85C2F5C3897B9DA326D04BEAA8C9DD5490938934855E67C3A0F34C5F74F25D710BBB4FCFF65AFEF6877E51B05739CF64573C4F18EE1D2C19CD4F966C8A037B93ADD684A956091F82D91EAC6D929401A660FEC7A969B2D4D44523362F50CA7EA5D37E0047384F24411CCC9506CF1484F8583344EC6DEA320784C5C496CA9BBD30066A57D5452AA33CD03D041638DEF81D2761DA24E2AEFAA6A128E86926DBEF4F6CD832A1C0E120B0F7E10B8C970754E5E0919A4CDD9C288EC9316E2BCE4357B8E3B708C8BDCDBA04080DD1E986317E1316E95A7B0DB6C87DACDE723BA6E59277BCFFE4607ECB5B8FBAD0340631D7E Key = E09C01FC9C5EB8AE01A145C966D18B54D86962C307539BE8 In = DBECB1C042AA98E8593629327CAE8C1984169010D5EAE745ED9122E71827818ADFEBE013E774ADDEC8A2628EBEB1473A8864E2FAB7C9973553993689D72166197B31DA18F5B0A95363F4E765A419756BDA665E66C10DB27D712ABF7146ABD48F9DB2638FF3CB3099FB0BC26B6CD4C64A665263112AA378F6A093C11891B641C74D2C0F816FD5E52F37F01BF84BE64F9AB3727D8031213A791F9C6BC1EE49A259CCAD511D5CA26DB3272DB3751D73C2E56BE46684D6F9E952DB9DB1C9E879797C487F56993420102418AA512F50B1C1339ABC6FC13E905DBADFFC651CBB420D6D9BCD7B86FA66083DEB317FB538A5381636F73CEEA73F28EACA590F6AEB4153B5DE87B25A7D58A7E89659DE2673C751343C72CA13B2B5ACF96129DBD9587DC1F427485DF9D75366C099F186B6E0821805977C728C11269C4650DC21D8ED1ED60CD00C41F0A362B9E8F938A20E7B68B51A264750D4F8253CF216D17DE03191360D6C9B33CBE7D2ED1E6214D0665C34D03EF11662C7CD7B25E9CF939B05C77943ADC1F8F4D3B861842D5F4B147529113C414A66269CFB33B0334D7C18A80821EF56C1511A2079AEC4A2C9E5A1FA2212A358CB5D994BCFB43042D5696F895A7E2F24D1F9F1C9EA37F56C2F41824B1A628FD1ACB5D0BA64B858F68816C76B11D3154337E49BB54CBB894E7F4781087FEB75123B50F59D34E12E99D3BE1CDD6C1167A45D4DA1B5E4A0657BBFABAF3CF360C1BDECD6C5B29F268CBE1CE12A08B7C3EBCCCDE1521CA93C16259ACDA418D48319BCB93AD13F6E379D6CA25C7277CD5CCAEF1EB90B2036D6CF7BDE5E64CD038C469F936F56D86D2DDCCDDA23810C2391958EFE7C76512F66F11F44B9E9F1CBD24AF6E5A728D01C7FDEB95A17214C48F52938404BDE078254872B6003351A464D824424DB0D573BE4A2A8D836F342022B87097F8D20EBCB3AC56D26FD472077845CA68200D60261B79C4B60C6477A1A597C81E72D09BA38BD4B0E5E692B436CD1B541D4E2E72C24DBC766022ECD4F6556499AAFE062B260E104903C4FE3AF208B6D25A5738760B2FDAB52D1A5E66B7348F7172924E15E0A4F00D0FF01F6504092555973DAB665AAA68D9E6E54141805CB409FB511507C66F76578C40A034F7398D88576B47AB98EE94CD18CFE6D99471FF56EE064B70B224A43E691AF4166D97CFAEE55A6B73CE15FEE6AF7214D12C092A5FEA66EC489D868902D529348B212D5A478A33F918974620818C12CDB01B150610C1A2B5DA3B693617C64FB9D084B293C3A1E460776A5ECA6CF50419B4E6DB18FAD314F0C7877213FCFAE640E11B4D64B0EA1801D0CD7EC123A9EA0E290872A8238FCC8FD358586EA73F2A065E0C9B8BE847B836077B6F3867F23539AE19E6CC3A245A059D1C3A17E70C68F92C69AE400351B9AEE6BD3E896547622262D02370247 Out = 8E536C2B3E9964DACDEBFF25C78DF2B29CFD2F423E3B85EAC810F536E18CE420763AE2F07E9BEE944437DA35D5843BDA0FDAD0F5C0C70474B84402D56B7CC1EDCAD0F6FD87ACA8ED695BB2FAF60F916C401BBBB744B0C6BA13D12C8557EFBC024441AB86B0E63B40D86082B51677AA296CAD65B16335740DD87F75614A2BE2A025278FABBC19FACC257F01B395D803B3868177AB0E8B258A931A9F41F2F3D08EEE08B4A8384BCADC8348B199443853D97C2DE47E896142244B123B98D22D281F6C5999E7ECD0AF5DEEDA96B65041807A7520BAD6525F9D2F5DFC19630297C5C738510C9478C0F105765B0E15995042A8E1F255D572C14BB7F8556E45BBB38FC00ADEC00DA5F7BCA78B26B8E38B37DCB845F968010DF7E908078504D4C6B09246140E27044D9796112005C878C983C27C0ECF9C12F2ACD41078EFEA7B1BB1CC5A6A288B3D2FA67E2FFD0C42046F06862CCFBFF191F43507450409670E3076DB2C6DA71550DAC99861E7D011A3998D3A27A268D93B09DAE44D7263DCE237CC7D136D977DE988B24FBD7A0AB103669733E4C1AF667EB71961F242C0E5551DEDF1037FFA037BE420458B8921D59C6076F9DFD257EE563B922E703846F709E8498C584B9D2963C16C21607E4E3F4A8E72C41C54A51EDF14BF9DD69A78EF3BF0F0420FEA75D62BA644389F5DCB01D95B5BBE6A268ACBD7A0C8FCFB7BA6076EDF1DB4BDF8DCDCFF73E5D99E864C78A6E909DBDAAABF7326C572CBC82DAC8E276CEEF2E75A29916990B1C0B9AE8E28106233DE6EBF15407BE06D20B4C20128F15FAC31841DBE8CFDB93EEAF7204BCC824933F80615C1123419AA8E28737D11AE352C36D2F69CA9A348EDBAB3952AFD8136B4FDD2261A57BE6C42206742A8C54F94432D480A52DAFF7ED625E6F5D1FD5CC409392400B80D62F1052190314B64694003022D154F7B12FCE34E3B9CEBB4981A722E2C344475134F9685DD95BB419ECBA2AACB502B28747665F4A1650A881B37F6D45280B335E68AB613D826757E1BAFF076E0E45CF5899A73384EAE2468CD16B12B5041E736723A771CA1F93E80FA664BCE73A5D88BBEBA76DA2FB3521D70FB06D61532EA28D7AF279BB6C0EE77FC3EC9C8C4B1652CBD71D64FF5E55817921E5C6088F0BE653A754335D9A030C89B4AAAA3586E77D8B23D969B5D1BFBE7B5E8D0C4A612B38270E51A63591F7DAEB0815DDE403F7ED968FD1077F9427094C5B212D03B4DA47C7E968FB8F982C81398BCCA00A304A1F098B451D9A2EEA2DBF9C2561097F0C16666C8471FEA676CE01A6DEA5EBCA591C509C3C0C943F5AAAF8456E1E98508E5527040A28DF9F3010AB8DD3C7EBF25BD7416BF65590E5B3B3BEA45477C063B90FA0207D56D716D2577D3F5808C4C40941DFEEE64D2AA91710A5B2169FF77E21369A595F3A1EC1A956D916DBBAC22 Key = BC7974BF2DEFA077AD76ECF9B5FFA109B688D685A736A03F42 In = 510F5C74619D838446DFE399B6D460EC17CCFE8EB1FB0A32E65D6C8FA1C36E2D02CE83C39603AD466C16DAD9528CEE7E3644AF881CE6E764FC8F6C96B51B7E3467D9E52A779F091C174748D49BE6FF831AEAE0D9317DFD0F9054E6F6E9AE61F491D23860FCA94E6E99260A7FE8311A91A33757B140B9E08EF8CA4CB62EBA23FC2001D5F817F861A901076DCEFC95324E426F839AE0ACF4527F70EB3C218FE15C2FFE7CB522F7F8780AC620E6E86CFE47C0F37ADFE0057A9E66D4DAB6B83D1478D57819291CEBB798C1D97363337B15188705FCC6108F1F4CD55B956304DD270CA10BE504FD93B68A7224C02A065F2877D93CC48FEC8A5BD5969629BA11169F0812A6C268FF5D09346F0E848118993F240F25FFCAEE40FAA3CA451F08FC167C5A2BC3F2F43907A03B116BCC93C7320C62B3DB61039CCDBFECC1D9686144EE8EBB884020C5D7B7FA8AD199CEB512EC5224149A911A96F88E6F4D000C72B20CFAB17B0028876C777F5ECE01720BDB7DFB73C2BA43DD77032B1A23712439459FBC5D539C63A16DC168BAA923784AEFE68C403733AFA0C9B70101358EEBF05C81518181F7ABB606FB180937799D256437281984017D56AADF3CAC1064FB198D54BCC5FF354961B1C11845973F93BF878080C3206DD1976106EFEC6768DDD4A00039168E00A7515191A1C06145A5460BC9323AC9204AC1A4AFEEE7CCE1662C034C63566DE3FEF9671FB4277702F4A3429B2D7B8FE1B7E034E00B2CA548DEFBE7DF7BF3B77FCBDBDFBBC105E375E9B9870E7FAA4ECA36FC6E25A6D4E04D1001C5E0EA40ED893B59C6E7B16536028CDDCE2DB3ADF756504A546CD7CA1E97FD83D7FED79EC25DC4780544FEDF3675FAE8474323A8BBE081C401D097572E02DDFD088117C7DEEBED761490F812A2F2FC1C38EF62B597710655AE6C28D290D003A41C322654395FA3EA0B5389B3FBDD5EF7C9D3E159924FE179B2B8C25F36EA1A26D883DE42B2B800C9629CF99FF280B9ACCD51495C60BDA9E6963EE0007D86963BCDD00589333B7C84B8474BCB2BD28B6B5ADAAD16B452152ACBB951B3A603283623D2A445E70F991A9C5C5B883237BB6200A47A7D601915847AEA550F3663CD366A33981B123BA770ECE42ED5B933FF829682594422D1F3341D04120C1FF547A1F80C08F097E64D50F7A9E1E2B28638543BD36A603C40ADEB9CD5453D572FC0309516AC24763303E652C170DCE7E2F30CF22EB5C8E1ECB222E1EC2650334DE8C7504985CE290A48A0702EAFC9C5752E87510484A8A4706AEE25350DE1D691547CE9F474E440FD3A8C22706F9362D8F4A6D7F2DA1D3B6E458FAB7E601C0811A10FF6BC5CE7AE7B5E7CCB9FEF3216A883EC88853340B306336D58F744659D67BF7BC738D0E89FF18C7B386D786B111B2C90BAA220267A7454E5229A4E800B94D2C9D78C8753 Out = C813B0E5702C0C6DE3328EF88A7E1F823ACD43EA6AE2A3339FB3F40E71DF4085142161B6414DBDCA3450B5303E2489E7D0A943E836FFCA6D99C473F46664818F5FD0CCE69A5B0DB47749C1C5B85BF8B93DBF8685ECA343B7274800D757C3D482E9E27DFAA293C37CFC4E6A87A51B8E2837968D9D71E0CBCA79D7F7CA29C849CDBFE3C0E1A67212AA88D55C2667E7E18FC77ACE1325C6C49701D0E51BDF69216EF105FE3EE23234EEE479FF85DE0451F0245515DA9C7696EA7B589922D44C65DF23DF4FD437D2A68130EFE72A5BEF60754D7087692B09CAE3D964CAC2CDF2E4E47152DCABD0C1E9EAB1ECAE68001A934EB8BF08B35BAA4857A085A477AAC48D3C33104712947053A3A6AAE9420761A148F42AE11F29507595DD468F9A0B24BD667C58D52E303673C5BE286D9ACC26FA8A401E8B4A2FC327BBAD64E7E27FFE5C9ED91FBBC7EFFB9DA538121567D934F43B89A10A9086E694818B3F9F076BCC04DF8BE4C39E0C8FF4891E45B0147D435A946BD2A099C64D4DD6E3BAB8CAC7A44FB825FC10A0CFCF2E07144BF92513B4B468F89BD04B451A59A0F36B0B1768C8520ABA306EEBB7BFA6470BAC3C99F570034C3B8C73824A14719AB2A7C9177176C626447F2392DD1CE5EAE77F66F3EFACA292420E947C96074557912526ED5340A282581825055327454110F16A60105877F16346CE130514CF938DC48AB7C5B6BB5814860EF7342087AA12283BE3F4E5D052740F74FEA37011E2FAF3A991F6F64ED4D0B27359646AF04177033E9A85A70E1292EE24F17E3158605F3C4F5E50115E3FAA01584D3615617EF0A78B6301B4ABF79E0F13F227C03AA55EBECBA7253A74C6DD3539F9A9651AEEBC0444A7F2D69F175D757B25B53006CC424947AD0FE57A722B3B5C99499274AA31A994EC8981A18A29695414CA397F3EF2571E165002693CBA1F54A72B9A2E0E0EF83C4018C864472474A52A53CDEF878471648D2748FCE41CCBB9B55A1DF82AFC07B378B814D57EA8A6F60F8872ADF7D0CE4FB942424602508D1550711365BE45433656E1A4734BCE2E1729038BA26B9D3BB3D47C960A7E1A3286A41632B47147F533F8514A799B96B740BE43DF9E5D9596DE6FACE8F75517B97E6764D700AE9B0F4EAF9259DDCA66972EE5CE74D376D59D9A7F921D92E172368191CC21FA0B367A8522F9A05DCC89776596BFDF7DC34B71B2171E8D74F8E87E26592E84AE240DCEA4F8236F7E13FA1D254EE7CA048F36DD359733A5097090293E676638C54348DA584F38BFF03F67E61A38331D31769D41BC04C8EC73CFD9A66C95656F87563E17BFD7A5CE3C1B2BEAB42BCE017DA00249A77AB05EB39A99999E8C374FE9EFA7323A542C7ECE218B1005B100A171C94A5A7169F679E0C89F6AFAC45202B3344F1C1F11FC749FF120A7B1B2E30DF2AB3A1A20247D8EBEB4 Key = 9F442E3FB2EA592A0CB7B0CB8D8CC4EF5257C2DAE393C21BA0BB In = A3878B8AD4FA1EB390BCEBD93724540756966688C1ED1F877932E75D50C1253CD20E79BC6FA71285DDA89BA56FA95BFF11E2EE1B171DD95F698971B3B850EE1BCB8EC181C3921A8D9857203A2A96260818B0B7807F1F93C32BE2DE700E75C81D3EF9A515B708C516327DFBE7C642C14238E1F2E2348F92547B2A1F8058E467611E3D139D1616FC616715754E8593678E32A49B2BF820BE3E55AD895B388F43B587596103A3A01271DAD456205BD53C03BD8ECCD9C7182B1BDD24BEB7C845CC775D56150DED9E059BCEA42AF4072803778040E1CD33EF81A21767006D0824C90185C549488D9092CB0EF9175AB351B394786611C6CBE7B47F1762BAD1F39AF185B9FBDD3DEA790D1BF5FCA6A80E4EE953DC61C54F7905F45F373AC9299C67C9A543AA3597E84653C43D80D11BCFCDB635E12A846CB4B0D4F82CBC40DE236E6D8DA39BD9C90A03C8C9C47C8302CB53518A2D7328BD0463B2931EEC975F3699C28C8B2A08C3C40ED78931C6FB807441B0B154F8EB0F8A0D811482864A3A755E96C62CA19609A63AFFDE31F11A65CA9A98268F7797E883558A9221C57F32E126F156945FE4AAFA2C5D9E4A2B383794F23D0E7296613DD73558F5B16576E7D8F0D87D4F2AC6D3196C28274822C648175C919559D85C13B97870FAC56C5151CBAA305CE02A23621F3C50A53E4C39FC6ABA9A957F32DEBF5DF62FC34BFB94B186D376EE4FBEF617EF511AD2ABB1B3FB8CA56735BDF60D9D38BF4AAD71D91F194DB1B8AD003D803402B047CD714EEAAB30C9B7A672958265E032CD9F1BA255856CE3CC55FA29589610624F25A68AD3A0B668F69426C5D91D17C5FD721628B0038ED397D0A0D88D4436F317E78AA05446B8DCA1F3E7A1B16F754046001146487B06A6C1DDB8C98D3D0727D9CA9F5A99A428C63018EDCB49D810BE4C3D77E2F006F9787DC1C0745062A4AB11734EE71175DE27FB2FC04502E1A8E127E374FBC983227FD935035DF6D99A99C9700213EEF4BE0AB6DAABAC727D6FC09CF528795E7FC36481EFD8E982AA5721895AC421D73B902B01CA30103AFB77594F8D62B021C7770CFA088549B8B6292481901AE54D542AE2B547A41C8A2E54AD264A511965065E1D5352CD37E0F0E9A17A0A237E894618079F5FDFF5019A2DE7037CB7073426F1933FE7777933D6F212DB8C5686613D73A82C070CD06ADD134CADD2C746B8B175CC73DC606F0F2206B269E3E2BD7070AEE53EE4BDEB702C8F5474305D3A99527779967DF66785AEE17CEA574FED7250CCDC111BBA529548FC52B9FF81F1CECB530BD3A5D8799DEC62074C0C5F2927E0AD6677CE90B57FFB1796D9F62157C4D4A0FC09F4A376D8D6E96EB58AB67073BE683E1A0B3DFB6BD5331A73CEDD91C104DD8FBDEEEBF4F80CF2C79653947AB84F10663621160D20C32D60F15622EDBBFA4B1B4435 Out = 30C59A448D99C6CBAE0C75F3012A728713BC357DCF1E814FB0E164F2502D8E1838C20A053FF541E0D51EB389D0932357DEA124126D40AA8EED077239B429DB16D18FA4537D2694A7E78AA8F7B5CA9E2E4C62379A860D4BFEF73A23509359517C8F191C83ADE0351EC54855449441952B8D8340F9A8E9692B79C9E52A48F55F7D281D5A093DFC313E704DAB8897B35142D3055E2B26816D118A1B2102580D87E888B5BE5C26E00FC6BE2A8A2DF05E35D0F34B43191F1A5BB5865D2F9F0695B5F163F5AAEB43A21190C81344927DE4DE397DE23905509F4A94144276EC3085E353E9409BBBFB4CB4871F67C11F93E772BF800DAD9B56CE49ED9E807A7AA2E82E9341FC5531EDE9D39C5DA81158501B0C0A23894E04418DDF6B3106FD980C676E65B7599197FCE7BED861FAC3E3DE4B6113400933C276733FF335B725889885D1F05B104D60621E823E9E1EF47FA982445FC5F5FAEDF701BFAE44EA5DAB480861FF4940C13D9E4351BCA2B84C21FB3EA23433FF7F2E9C56DDA92D645180E6EB610B39309ED073A700C891BA183AB048FD285476EAB85042605B2BA614B390F5B006264731E736D9D266A56B62344A25AC7B95F88A53916BC0A764B373CB04ED7B1F84290A368D2B2F37E794CBCDDE38AAF38915C1E0035B190C7AE546C9C3641829FA089F3E454373A90BDCF7BF5FFA1E91D89BC026C28B00275EF96EED2A3E311CE73A3F8BE58C5E30380D67E55BB16CFDEF9EB6D52FCC797C0C017A4DABB554FBB4B3AD7D4EC0520EE5CB63BE6FEA34F8EF1B9B94CFB1202F4A1ED694ACCE6B5D0A07147F0C15A554A6B05BF0224092A4CD3EEC46DB5CF93706D6EC1184AC22809617A6A9FDE605794947A10B11F5EBE05E674DD48908F71DE8045C71F345D22851607353201B0B0B0FE0744063FF262B91894584784D216E63A7E0A550680053C85687C98DC8E8D31AE8EBEFACBBDC2AB15176136042A72F6E80A12168462723C42FB6F759392F40E4C38C74685B164A7AEF478CCB598B39F3A84646A945CBDCE3339E369720A5BAD10C32058C07F7AAD768A693B3CCB9FC677B5AE21CD4EC66992B8D1EE676DC0108A9C2E4344FA37B1AAC704D6A9AEDAC68741DE35FBB8D103DE27CABEADBCF06E214EAAEB615051528456AB7477CE95BE4DD899975806D8F21055CF45DE6C98456F5A8F0B30AC2647B5A61B7A10BB77C91D7353541CCDD5CC98B24B5B6CBC28AE123713AF68D9352407A232E65316400C25647840F0B60B8172325D3338561B797A9DE775C847A288D535E9A42530057487A8D4DB74A9E8D989B1A6CE6A9F66AC9121B8FD1FB4259275CE1BB28B825D1825DDA3330AD4AFD6B94B166C4C2B069C77B134AA105857772657A42976FC1B671F21B6867F6F2F79DDA6AD5E207602B57055B0654FAF0ED455F164A7033F6B91E28054232030D56 Key = 98D9C8D2899042442EE0AD2507DF56B749696D07D2B3BEDAB9D13B In = C3E72DA2352F1272F2A862C1802DE449E63051F6D9DFA19260EA094B450FB888C40A82AB5283AE400000BD786852E0A9502FC25AFEBEB3BD6787887DEEAB68A7DA7614A9446772DF7FC0BE33BA1494FC76DBF30F7894E644FA1DF0191612BE7516420A850C46CF65389CD5AF7C5A534E7A40CF76C90BF322166E26057A3CEDF2497B57742ABF06774C0E4A8675199F3CFC5DE26402B40BB3CC303EAEEAED2F7AE6A0ACBD24D54549EDF40CF1EC6180B59CA17D4568201D211E400EF9D47A320514F62404B010F730D40A1ABC45D4FFE475997A8692202E88D8A4BE2E3891D41096AE609A19105E5CF74CE58EC9C574F0815DC470DE7E36F3780684EA0CC402610327879AFF283DCE3FEC687D4F4A58CD4DE931DD5F3DE319C93E775BC417C29E6DB8B875F2F441B0BF7119980322C071AD77B723E0823C5062D479820EB6D53F9F39AFF69D69C741C8C1C39EEDEC6A15336E0F25FE1792B17D236C0567D14703F6C64685707C7221DF34EF5E3849CD44C3199C9D7953F132C0DCDA32DB03D1A1C97511AE7A6D440277CAD76332251201B1E2FAC46EBA667C2905C00206145A08B25A8FBD1478084E52300BC8187B3AD4EFD51CD7E2AF440BF7B61C52BDB5E25B2EE89E186F8FCAED91E557DEBC038E3E0EAE0F894D89F1843E12C9A450721977D74ADDE7DA2F13C4D1F20884F03EBACD1DBBCCC6815FAF755554DEA59BBE56B54F3EDD76220F35F82D9EF760A72E5EB70A20F45F9458B2F42CEA0068133321772EF76C79760ADE842ADD7A9449B30C9E88D9B707BADCCAF729868EDD11B9460B39BEC7605A54CC156AD27B6D96A474D183EB1C0D2C5EFD388DB9ADDA2EF38B06D723A0E11D94D0610701E20A8DF084F8AE67FF6DFD52A8D7EFC25D73802540FCA4C7E99008BE15BCF36461FD9D5D3F66AA25510DB2DC7C715A5A1D40ED8DE77F3145BE7918BE39A579BB1AD39B64750436A2619A96094EBC67B6C7095A9CE54D32D866DA097AE970C5254113940BE9E8949797F8F0FBD38281206D2F36AD1D4E0DF47FF3917173FFB99652F74EBDF85E0C26BE6E88661811F285A02A8995CDCE78820711266D6A9ED3B29220DFE13D7FCADD3B3460903460EDC6C877BFEE1705C0688C6B19B8AA29A712864BAD9D221A973D133317EBFD85095706D553452A31E9FA1C2B18E11269524A8C585D0D852B5CEF5C20C898776C36F269F09BF33A645C860460263399864151F13B10DE554AC09EFC791652451FE761D93F6B159CA6CE312AEFE8989A0C173F0C9C3D185DA1ECA468B1C246F9EFE6D8CD7BCED96DE3D6E6F34ECE1EE378AE4A3D386EEE3775DA3192617163DB46D1E7BCE606B6A43E07A9C17C6FBA952E2A6EAC4DFC3D4D31B447C85750361B9F08B0ACCC87887CD270CF7A898B8C0DE907E28337F9E011F20E219D313E3BFB708A3273149DF69193 Out = EFAA6D16D871391B565E2CD61AC153AD5A52CFB19535E0F0F0C0AD361D70053885367ABDDCE48793DE9FDCDDAA35ACCF7E99D76A98DDC4FAB05C31A1F39B971F20D2AF515B4EC62C686AFE086E7571EF15629281B76988CAE44892015C3DBF8F44731CE3D2C862F8A1B0600BD7C10B6DD5CA276FF73AE22C411A6FFB7177819132DF0C012675B59364231EC6222A270F80004E403C20A63E0EEAFE8F8B1D7F389F53A27BEF11BD9486FB83678A971A49D584405C9010F1A28EAED00FC2AAF4A763659C28D73D0F79429A65BBF18F4736DED48043CC8D9E4BBCE9C8742FA66F566CDC64B6C77F0D4C5EB39C45B65B748F86E00B0A94850B4A3EA2BAE4508DCE0C2C040032E714FAD46A9108CB9053E5DE1108036E816027BB28E8A4F9BC8FC4E0532C0F734247EAB51C3EFF525FA160F82AFF051E3E0879A5C0B37BE3EA7FB811CD473D711C45DA6C35A499BF6F4CD9A61FF77FE4D62FF750EB353427496F34C46741A612597BEFA6E78EA7F73C3A9AB06D66C46E0254F5BD2634FB8C87B188A7ECBCDA62E7C60A60629EB89630760DC9946C898FC6A8FA1CA72AABB45A44EC09EA7CB7A83E32088957703617C53FC8612EDC540F2B9F12263EA3DBE1C137B7401C4BBC79601C898602E0FF0F9FA82CC31CDFCFC876C8692727982F95081B21BEB36664A103D743BB4DC43FA4D886853C555787BE2EF4BCECD3F960271494B3272FFBCFD15DB4F13C808B43A93B18FA2D412ED8EE94798D45177F25B64BE91681901FC0067D78CDE05797968A4A5A17EE2DA3B13D05CCAB6C9BA1DDA97AA52B7D54348C902EEC725B2F27C0E30F080FEEC33ED2406172833EBCF7324AA784E34EEE33987AA71B631CC63577FF8DEA298986EEA883FF69E95EBA40D94AD348AA8D92997F4718A91A963FC2954D6912EE70297B365133822978C251E4F8A3CA7233A6A928E36D0CCC15BAE70BAB7D6FD849F2EE215206CB09E91A879B475832EB839A19032985A3AD58C99E89042080B4BEBC24A4643BE342057385E33C6C08C8C66E9E842051B5D53AFC272EFF54B6287CA60A54A45DE35B9D83B0ACF58A5EF76A9562630DCE413E2650AC40E6AC286D170A0FFCC03EFBC6E19F0BE6A7A69410F019FAE61CBEEDD64AF69D9346ECE739B4F0DF179406293B16137510060206B34D47069ABB5CF345E8273C6E614B9140DCDC7721920FAB33FEB009E51A1A65E2A004C5E24FDE771A4FA06F692D8D8FF6E41CDC2B6CCD81E001EA39E529367B7CC7DB6602927E5A7916410AEAEE2267545B79E3CFBBC6CE1EF761555E387524990EF18539BC4B69F65C5E7F6BDBD4C304105C7436F445D61B69578ECFA9DDC357BACBC0919C2A796B17778EF65FFAC0D55CA5055AA2042B00B1B92F9227B061EBAB643853CEA690A77138B4276840E895EF691370E6A36434EC092A815FDFB12AA8 Key = 3EDB5024B4439FD8463FB27E72DFB2A0EEC2A108770C9EC58D91D5FF In = 70FA4F489BA7A72EBFE10B8A591FC75809D116425A300FD9DBCC0B8863EE25A11D531CF58FF5FF93D05346FBCE189515B84C8AB100CE6B802A340E11D522EC771C1EB4071A1A3874674E285AC4A8AF302E95BCFAF741B3FBE85ED098EBC177E509FF2B120DD48FD41C914354A8818A4AA8D36EF2926CCE7C71FA19B0FF67ED6B9D2A3AC3FDB6108E3A68477C92897891176D4B03D4E26292B79FD0AEA177B0F058D3F0917D642D39F4DDC8D02773C1C75F705529629E25B10E465148C49862B0A89F1BF62AC70711AD6313387BB0185E8AD71F8CB4244655011E7170A304DBD9D1FF3EA5CECE7C3207F3F94F838CB61754672BFBBC8F9F7BF255012D759E6A2E07E90C7DCBD8E0F87FAFCE0B095957A07F5CA27D6754F3B1FB5090D4F971486F533BE5012BF3C1CC4ED7F7963854EC84932B8B0DC8690F1402E201C0821A345CBBD7B65BBA2849287B4EC1C62D822919AA1F1F46CCE1ECB1E01FFA7445A38B1BB8A7AB84400159C8B1738EB3642F6BF12DD4418F2C2A4B5262891F16E5496561C6348286DD2C1DE2C8FC1657E49A0C039AF09DF56C5EB561DF4CB947FA0A932A07BB0970B3FBC018D9B17A4CB87AD93E51CB2F3CB13164AA6C3FD719419F4B67D1B03E3A9308FAE9D6DC94B4B1C0689C9C97D9BE77D395071825C3ADB32D0702109F702AC8D7B762DEC9A1AF503859F98F7AE75AEF4691F3A55174623200205D7DE038071CF8B02736C99A3A18E92C10E866F6D69F416EAC0EF9420DAFF040BFE3CD7AB9A240268C03B9D66F603C6A1AD1254D736BA669F9350AEEAA647D3B7FF0CB3456A9C39EA5F936C5F6B124281ED41F760BCB1E49056F74142A0F6A6BB64B85958F8B25CF7A9B90345ACB5C3ED17B285977125A090F7C7FA391DCA1FC2F442746EDB895C466D665C949BDF2AD3E56049A3F62C916987AA911CB3D72969F920FBC4883AB0B365109502FD5AADB0DA1B79324D3299DE64C6944776C0E9F575DB1812C408FB263F7CC7612007216741B5B397F7F3E7CCADE3E9F9A891FA1FCE70CB46DA29E520F7E7BC049A954D6F6997E82A7B49C1E980BEBFDEE9AC11D43C152988C1BD90B9E643A1761898993BF642B4465DC05D87FD83F1BB98CB26F1CFC986DFAAF1BFE98096C65ED8FE76AF4D085837D46F63AB58FCF5FADC6E098D319AD7172E0B2CD6AF62E10C41A46C5F08B2A401C212D49E4ED6F7A372B5565D7164897CF6CFF57E0F25CC814A1B46B01C78D76391D76EAD6D9A9F37B6DDE47BD32E153DA5CA8AAACF436D4C91BD5BC85AC9550D4181A3FB20F6B0DE6E136161DF570D6BC72C52AB743BE670F3B83351ED71F3018B3336DD861CC0DBA507BC2A16B6EE7E0F29E7472772E7FDF47DA7AA4BA19253CA2CB69BB5EBAD19F30C6321EDB5D908DFAF162550E06BA90276B9901BAC6E7F1F21D9E7E6895396ADD9E6DD5 Out = B2511B9C8A29E538FAF6C9FBC0C5EFB8B53548000F3B69A8192D1074ADEF8A589A68F0ABD9915F869AF21281EA9910C20FF08006AB2C558FAA5E42D2C3117DE89C276C1977E36EB8DC80AB919B142D35ED73382D4736F9135E16F58B64D5FF75D235637AEBF4ECF8677F214C039EA29D2B9537F88B9B20C20F590B26A8394A2B9D4A4798EBA65EAA6342F370E732459DF8A13BFBB49F5331B5B0B60526FB42D093271807F7873DFF03F5303725CC3E2AA847EDA1E413E8D11E9B8BC85C9E2B95E14F38991CB01164EF054076D028D9C0AB1EFBAC1D0CAF727194DBD817A6FDCA84965434495FEFBF6A5B28D8E816680002B03754178FCA6C5EC96FC069D30CCE54307EC1EF1D4EEC73F145240D4BD8C86BD1C42A79456683A8D1720B24B839ACF53FA450A5A5AA6350E8DBEF67B8E072F1DEAC1FF5940D1BF7EFFF618DBD461C66298EE462230CD07AA44D1B145432995F17EB6BC0696F9260614FB1839AAD3AFB70B767232EA053D3A03AF278BFC4396B31176082A97E96B11E88EDDE6E419BD34079C5E2C0E3063EEA2E8D285B11F886B1AD177DAFCF6C5159ECD12393743FB6E8734147DC08F681C79B8ED889ED4BC2908D37168604740F92F13C8407A2F7F1138217154FFB554D1CBA031337867EB64B03FC343C35CA899E2B279A3879F1A282535E53B7C54E1429FADE2FDC31D371BB3A0C6FA886E592CA9E3A41864CE3B3C1A4C64737A835C40678F2F22A48BC2F02BB63462BD9BC8A0108DDCF3A96FD4426EF9F5F9515ACE83D9B37DEB30D9FB6612E1F8509E7B557302A86F491A6DB9E7BF4FAF867D8237A491D41EF94F36A691892275248AD721092A5EBE87CE0109D497221E17B6582A0C6AE2E6D9486B8CDE0046A196FE4F6E9490D2D3341DA9AD473BC94C341E1B003E5579CE7C07C8ADECD38AF583A226EB1365C853FB512F27B25CBA25FCC210F3093CF7EC680A2A32CE434E7AA563236D86442E7935DCFF3050681CA2CD516054DA3D94C159A935EE03C96D2906391BF5128D82FC106A2948649E8AFA0C5A3496F42206DDEEB12168A248B4066D9939C036CB94E54570B18E234429EC67AB15B8760EF62053F2834DD41667C3CC57291C7AB373959087A101AD986AD201A7BE01E79DBF19D392DC119796382C7F1748D86418110309C27451A89F11124F41F8D497DFC0874C9618C8DF99199D2E366E7147E8DE0D84FFB122BB24ECBA72ED6F42AC0E0A4B73924CB2E193E4DE685B9C0C557F2AE0441B93838003F59A014EAAEF999B41ECC3E0A9FF58C38406178BB2271F2DFEDD3B8F4611E1795755EC713F5E7F4967919BD21AA336E767FBB310E2B305EBEC9E3CFD2F2DCE6F2695D29C3A69AEDC81344D1975522B20E2A39BDAFE01F370C4B21AF921E5D39A47D5F9D0373F69BC94E154A95DDA966B83E9D72AEE63A3C3F01FA45F7EE Key = 4AA2A4958F5A0F91B928D76B91C36506F6B4C7C3EA41EBD6416DE2AECC In = 13AFF54F5FDA5CFB464DA7CB2B7EF98B3E19DC7BDB50302DFD044BC96A26F889A3C869F861DAD16F832D9095855385F7CEEB11C9FF029E270A82AA00B71D62951AB702C24BF5AB04E72974CB70E575995F093E28E3AC8B74931B77FA74BFDD704E841D3AAC4C3CCD41829B052ECBCE10CC909285F644CA5EE801434B95B7BFE1E8D13B8BBF0DA6D608CF438409B9A5BEA68CFD03A0C040DD53698F0CCC5A23AF583848CE756821435B9DD99B431CDB9EF5419B8D595260CE0D129A475CB78105EDD56C24B55860A56CA0A404B695852637C8220E7B26CABC0EF8477191FE4CA80356D693DA691FBC7881AE3740D17740B5B39C01FEA3463484A016621E1320D2503F1B680F62FA2F45F85D9CE530CE7456257D86C68198338BAD10CFF149DA46B4AE5F4B4942204DF5D45887E8171581283BF27B420C99314556C74FAEEE06FF34492F7D6B9E1DDFB4C7B0C68AF0DB1309548F3B0C14DB47D59CFA2B990C67AFE1A68E765180F7F28B9A022FE1B9D46BEB9CA70FC84848C640BD265822BDBB22ACF459A83ED381DD01C1B4FD8F560EBAEFB47798116BA55D7401F876F841DD7CD7B7A868D8E25F177C856F9DE63A800FB38DB1B75A1AB8F5DAE7F17F78158ADBE74B74F55BD6D2A5853DDB39052B7F8320266734019EBCC808EEAA974B9B25DA57CA946FE338E551DD1ECAE440985FC7EBE545C7DDBD2DD6D9F8B998460788C1B9BF031A3919F56D425B08ED00BF8B413A094D88F5BBFA5C080D1E9988DAFC03CB7DC3DA3963FF91A57C35803263821EAE880A90F4A50BE0E2534498E8360AEF2E6DCDCE3BF0C9B44B865E82B26644010A5560E0C94E6C12BA664399849B71F527F74411D41D408C938805C3E9674B8854B8505EAFD47EFA6157CAAE3CB05E11F2A689AF14499895104A59778EF19385D6640466CF19E45DCE6B7367D55F802AFA2BEC0553C730EBFC603CDB6BCA10B5066BDDB55EB6E81AD2012D7B9802ADE7A8AE708CC5816CB77E52B44648032FAEC763942C3AE1B6E226F2B89590D9D738A9BCBB8D8F1C92F3F5C84DA4628ADD590E71AAB74E91B7CF558459B641A5F5496B93A973EA4F40A1A3DBEBBFCFC01559B0F081F01A83074C16F101E465639B159ED430C194DC78D398EE03B779D978FB4BAA7BA417B12BCFF174F22F71020264B5F49D910718DE1EBACB8D80DC7D45882EDC842DAE134679F60C5D59A0B8B71082009A5D0C335CD443899E62A2D693EA93F593F1CB33A0519EFB246421F3BAFDE66A44D6061BEDB0E93F1C5DD6CD6D22864FC0407664349C83AD6C3362978DC255F0C9DD421D9247536401887301E5BFF9286FBF0D71ABA606A4C3DE065FC95D282209ED7A18221969C79147191FE629076234C62995A07F9550CDC5201966645DE98A12FB2F36AFE4779FDFC1AD49A59992AFF96E372AB59CFB056A37F3CB56 Out = 7037C2E54E86E1F52D497FB4E60229BDBB7357FD617924EEA72AF90D68BD5075267A9B02B8C02EBF86782C0B4BA174D9FF66014B2AF61184C722D5398C531218054D7D8F30EB6FCB0A8711152AD577B2D51179E6266173B6F4CC868AEE184AD2C39D06432AA31D672BB75FC710A8BED7CBC3B3CE303C13781E243441E7B6A1B6D223A32D4472EFDC8E50F6947AD601F4B07EE405AA66AA71313612F904626550F6DDBC71A24B3FD9F036ADACAE04A035C13E2DF78AD9458174DCF3677776BAF8ABDB1668D39F4D4B513A2DFC8D36869154DF1D3F45EED4DAE86E77090FA21B0C2514CE24EAC2A0D928EB487843CA5431D3C6FF527BA67D8C337DAD9163EFCB9001E027A4EA629624474B112EA2DCBC213365EF44B1388EEA3C76D02AEBF1C2731FC54AB6D197821984DA98D22FE979DA6920C15A2A4F19FE86A7A49C1045421149548BF31A48254D1908F56B885F39909BE3553D82422FC41AEC0C63D047DC65A1DD9C7413097A8B986C3964A498C3C99C2E7A4DE23205265734C29D457C32A2FD4E598C136C2B74A51511024F75E9CFFE60278D7DD4E674EB07F1EF7149B9859A3BA40E06CE8DE91FA588CD228765D7FAD214DBDED8B7BFD6726A51CEFB803740CD87D8F23E73855691B6FBAC114C929992BEFE46465FFAAA6C592B0570C9F9EA87D36856448B9A5881A8F3446E9F884FA0D3F6F396AA1B95CFF30873141CBF22DE721E355675BEB018E2A725B296F029E9A683E43B9FA417A3DBB5E9F5756EA1DF3C3797E70E54960A9ACCB28CCAC4A4635BFE1F4A2A2CA5F84A9F2FF6B2498C7F4F93ACE34128B73BCE971BE0A5920E9A938F37402F1BC4DFB2B651A7F30ADFBC991263418BEB635E25C1CE3E748A0BF9D9C6D4CF3EE48646033EFDC377FA5A5472375349900D1F1DB1D313DF7E64B9B34C4A7CDE434E16A9D93797C07D50400D13E7F65486DADF196099FE9F71554CEDD782D89B92AEC58E007BC903BE82C26DDDF2C86B8FCBD52ED64A19FC2920C74D7F0B47AAE7FC176851AEBA05E33EE2081DD244B751BE89D8FD1E74A798EEE60A493CC36AFB34DD96C34541EC3A2C32F1285DDBD88BC71138DA04E373DC80D958CD369C64FD5F26485369ADA41B93F5D43C47E2DFF1CA55320A70A0E07903964571DB66C75FBC691691B0520A2D31A3BD0CA522D842576D01B57AE4580B8AB4A6160159A96DA5FED007FD02E4D63ECCAFAC155251F316BB54FCE1390AABA68E296756AB4F0189F92816FE9710C3E190F4679687631E99981F17429ABC4CA3482C56C0E42061171BAB63AEEBCAA30B3CC4883A74ED71E47D5D8930A700F6D5DBD39627996D9B93B978A8ED52D6E87752CA617331543CEAC386A6E3A8F43ADBCBDB46053F570119B3F19B2BD92477AD98AF4197C274C2B569E013A7FA7850D8425F65AA425581B720E27BF9D9399A76 Key = FD7760119A0432CB5928F24CB65E989B523B540161A3703E2E9370EEF544 In = 2407970735E9026331AE5641300FE86BCDF45897190370274A476C8790502949D887AF8DFFB7D1CBEEE0BA4BBFD0AD393E2D0698FBEE8F3E56C6E08C3ADC37A2B2AD1BC1A5AAE25B21B6E779E41DDEF6C1FAC6EE571284F4DEB791EE1F079DB666E2E64C1378763C3EEBA9B998C27C757E708C680CE0E9C64B3767B4711C62D2C10F7905364DEE5C4A7DC533299BFF6D55086941F876CF1A803F04EBC45EAE5D48612FCFAA1E6FF325CC8643DD77B48B16CD6C01E767DC11499644B6C301565E16BCFFCE712676FEB37841608CC173456A4BFCEF5F9A40FF521CF94A9A38E20622277426EE49330442455945510EB10259B6FB360F1C38535CDE3CC563DC44F36F978A1766CF91D495921BE0ADF59EA0C659D97E1C321BED0113B840350085179AFA32426A6F30AD9CF478A727D89DD5693A087B16AE1C40010984D8AE35323FA84598B3F7A13BEF741A6BC59B47BC8D5250BE51E563BF30BA364E54B68B75955FDE0809C56C25B79831EBCAB1DE292095DB60DD5E6F8C68386EEC704CDF5FD9B21D2011A955DF9425E62E94E7B5400801E549959B1D7512A5F69494226824FD4E1480D28ED9D41094AB13D280D6E324DC2C61AAD4141F82BCE5B2342654F2A78F08A5C272501617ADA60BD42A7E5214072B104A6EB88916E59694D4C72ABACD08D31130C88A6BFB1CAA47E3F1428F4EF3D55DA9593408A60CAAC3058FCB5520C86D6B5A127A2D711180313690B79EDBFDC16EB83496C458426F00B56F5DA2AE368A297A76E2F6E86974FAD93297E55269E03E59EE09EEAC0DF02655DFECF618C83575EC012F36D6BB05196CF85D49F82D99C5DD164AC87AD9C5AE7698B721AA293A63EF98535F7547BB044A3EAF9E9F3970DDB3DFB6E1BACB4A457E7D8D63780BEA7CBB1068D66123C401ACDC047E0819A4BCAC745C2F4EFFDE8249B1FDC0428972EA8FBAA981F004C7CB4F652326E43819BFF7530D44D8B42E52CB52EF56E897DCBAEFEE5984E9369E3EE7BFE5EC40FCC730E2C15C05D6319483329E117B79F94E441F1F4BF0814501418AA5349EFBD62F7CA3E5E67257D9FB373C8D3DAF0080493F181EEFBC69C5B9F8D2EADD3D9D18774CF76C2C063C9B487FDBDB12A9B5A104D1B6B5C4081E6A83EDDDAB5026EC6A5236D2360550372AD28461A60D9E5ECE6E1005405252035365C61DA77ECB6126C7CCE1A5F1F2B5E8B53A50A49B6626159175623A537D0593FA142194E7F137A88950B5BBE35B30DAE7A6375831FA9A3AF07E35A0C92BB60EECAD8F6AFD225CD68B7F77BB8D96CF9225324527F5575A17CC29C380650B1D6C8A4F273FD3492A30EEA845B0283EFD0DC9E7D2F241E77218342F4B263855D3C4DBA5279891BDE280942CA5F39A48A73A605F6542E64B8D234DBBF3765A6A142E20EF90D4D30F5C93B243E39D86411A5EC1C04D0BAF7157 Out = 1587639AD9EB4304EA3BDB1B51BD4A3E928941107B3E4D0BD637C39676F1EC92F01B7139A4A25AA3060945143EC36BF7A6D38478ACC037988AB7D334C8DE4D0C4163F8F8180A0B45CA17BA0E4D850E169DD0DA41EBF7EBD08B6E059AA7E5012286BBA63201F44129C0B214C31E338C0924BAE2552EA450659AA96464B34250DE693E4A1B917B63EBD1528BFF6DEC61BB70E84309245195D64E9B30A880CCFAD7E39EB3C526E657DDD41183A13E16C23B9E18194F14372EACB8DFB31B6DC418614C4A2679C1D101A4259DB50781795C55FDFEBA2A5621831A2142461D3BCF80799DBFCD4126C85398EFD911F7039C62A32667C4067E155C1BD9DEB210E6006FAE5DB67ADDA8EDBE2DEC75B5BBA1570C2CF3E3118C0DB8E5890A94708A9C089BA5822CA7F59F897DE20020DE3EC4F6D092DE2159A93367083FB15A302F5113F49A521BA8C863161080EBF49FB603990D1F920FF5C23455E1560C1D54E5E7E4227DD35E86298E12B344FB30F1F9565382E073A2946D7AC8B3CB903D764901A04E79F5F09E563E6A84FBF60EC88990ABFC71B071997FB6024F1BE56B94159EDEF135EB59FE37EEE584BF4E066D014CEF83151103C21B64D623B115F84E0ACC52435DEA7D39C11A68B608332C56CA5B9CF0EFFE59040FC386F947170D22F2453A8EB948E3FEA25CD482A4822335005DFF5A6ECA44221231E7EE7CA8AF990346B049AF59A95CEB2A7C884A5DEF765BF8D837817F4019C0C323B2087159CAF7B9E6EA2678DAE509B4C607134F6293DD2591DDEB92D9884D96295A81159389D44CE9617921842F6D7249738500F3CF2B73EFA762B9EB399F8E2DB5B29EFD71F1A6AF0B3797DFA41651947F330361A5AC495C0D3A2B9E4F34FA5D186CD946EDE0665F861EF99AC831F0D67351E848D9C9FBB74EB97F4CE03B5B9D70C103A7530063C4A7A3EE331F9A6314335E1B433D77D158AA36563ED4DA4CDB9B635C5EFBC5B7A840A6F74B0DBD906D949BD419FC7503AD21E285B2EB01BD7123BF7AF375D05DAAD012121310CA7A9A5ACDA2218D5FBA47596F2BA86FFB5909004040CEA480E2EC50AF9953D379CAD0A00E375CF4AF2F225C4C66B2BC26F751B3FF35512CAB8B944A5120EBFE7606281BB53C7AA3CD5012592638A9C6B8D855264940A980DB68FAD2441691384AC8ECB31C6529787B5B51B534E94F1DD21E75E8D666F74485642BF4FFFBA1DB6D8D4F404421276BF1CC7B5AFF5E57241B1E14BBC4DE84B137EF7BC9E1434DD36FB9A91B551E82A9E82F87FB53665DE96A33B5B3871EF88A18560AF91C050AB6476700C7FBBA84F861E1A738691BE2BCE485C6FD4E6D958CDE8DA49BC4B2ED3ACA18D12E8802967BAD848CE3C5CCD25B4941BC96B0FBFC745E802D86C8E11642F3A0C2AA1026ED148D15D4EA27D68B26F7A73A15F05C056A68FD8D1D3A Key = 8B73381DC14BAD9CCA68FD348320642E282C53740BD4E479F9FB21A740C4E4 In = BEC2A17A991E96730F4189382AA0D0B9FB9F3DC9478D3DA9BE077815332DD60D74A5B06E2EE891E2DE94FB011BDBAFDD287053B792FE58B6C0DDAA56731A160CFF5140FBB15AC775C99E526542D2F885902869689561B6CC222F216231537665F3055258B99CAF7E24A756AA64F9F5F93C7B9C790F0F56C83CF32F265C75A1FE60A0D03E2AAEFA99EBF6F3B5C3FF6D12CC8C8D1BD9F13EA6E3EE9C41963824CAB090305A928B7732F96C8538489AC959AA38CCA32669D3477E25102349C059E47DF8CF161E174B75918249D61F5F8BC5F5010B48A84484AEE8149822750112052557DBD2FB46C741338C1AC533FED2B753906A47AD8FEC3853BA882A35461FA5BFD649DC1349FC9D8A04117029FD146E54B4B434AF5ABCD0194C226FF3AF3FE22070DF5FE6B927D27AC30B3CC304FEB8A8F087ED668700E1268AE6B2A575E44ADA0BED14592410F4252585A2559F6A59E4E226F53F5B4DB4A9F886E6BC044580B20EE79D5EFB6C035DB9D24A2684286071DBCDD5BEBD4B38DBE2F990E7D0C30E4BECD54607D673A6FE226946D54BF84F11E4B10FD44C7EA79AD5A523BF38CF23D856311AFE8BE54A9E417CAB529A77BB210AA8E3DD8C0A9F810FDBDD9F7EF1726F489F907BB6AC2BAA5E6B7CBFFD864B8B47E91D0CEAB50ABA28245A1A93C3C6A3B0A907F678F2424FEE8C25FE94AE69C454158F8ABD844F499F4BD39ECE28DDDB373C8A1C40C0B060927C7A879E1FD03876830A7C2A67E9AAD1AD7B41B960C27D0912039FCA6E49075D1CC86619AD7A8FEC8422BF3AF1DFCB45E2826D96DDCD8616FF4EB4CBCF2634104A09250739D6FE762CD05619A9D552D33B8AAF54CB8B9AE834DC2EC340530DFD16D8E122F46092B03CEBD8AC54B70D0157F0D30DD4F1CA25EDB7F527741AC5DC48E2AC752BFF7CEB19FC1618008A4F622C9DC1B29B4CC13C2170E7F771ABF40D3A634FAF580D97A3D7F7014EFD71425639EA7E026557123C347B3E2E57C7A7BF14BAB4B86EA05B2C7DDA0787F4DD4EDE1A2F7675DAE9661E3F13D200FDBC64649B977BBA5AAFE6DEF9EE606E3152675144015D012B663C219434A9F413E4331503B0EE68B7D53C71CD30429A33A6FC421C3EF8CF7C63954B071D36A0EA1A9973C0BEF37DF9FF62C3FE6C9CF9D5F040CA663EFE4D9501CBA1F9EC71F55DA295954E119A2172252618EB74DA2A931AC8532F9745BD6FF660E9E851D58976882ABE61ED14DA8B2C0AB5A16EF9CC949B1F8854103F4D8C55E02802E9CAC30D0B0C8D5FE26D987BA7F63C195FC376DA3C0518D2B8D9D7CA945EAF8ABE2BEF78F99FA8EF19133FABB845BA842E1CA86927207452C129FA12ADCCA3E4752635675C4226B473749817E57986BE452B67F9D6D8845EFA0B1642905D0A9A1FDD6F4741111E578370095FF5623EDBD4DD92D7C4A9E51AC4660FA2E4 Out = 27E92D9318FB1F44542B1FE1D040204690E57E289012A86D785E230A6A473A0CC3FF618463826C5A6BE0EC29A42424539114D11325B75D7F84B8BEAE7AE78122AC69E8537FF94D1E5514F12D5B2A985DE39B68996471E15FE5AB14E533D36D61EEC01B70EA9749BB431AB9533D1DD1DCE6D569696057DC693C0BCAA9BF18DB7B6DB009230D492D01E7FF2DECD0BEF61E4425E1706FD396FD2203818AF5EC5833BB7C902D325F47E3ADD947DFD7F7773CB791C7878FFF63916FC373642F38B3200780C9831D8C173389AE404C6ACB29E844B96487B8F59B4A5C64CD03F1BB0AE9F5200E3BC642D2FCF3A422FADAC4A23788B44B4D085D25C346A381D43782BA28240AC89C75BE6E346E0C098CC65D785D3B522EA3F03DA743D84471A2FDA73B637A849C0D924CE9DE42E74F77AAEBC64E844E69FAC8D1125AEF4770957ECBCB1E7F3183780E30B188101D598D7F89FA6A8B32051C3D446F9DF12A850F418282F819CDD06A95B0A08FCAACAB87D1D9CC91FCB3A762EA11427CA8045C6EAED46D823E6813D2C1C9D496B726A3F06DE1C5D70B943CC41E39D7904105875E9D6D1571D07C3FD63007A759210CF93D8581529D0C3CE80CC60EBDBE318DBF63F914F1BF0E991F51932DCE9008DFF7C6C29EDCCA1836BDADA487BA7080A6D154939FB82A0F41800397576636804E97DDAC08F36508DF60A2538F0DA657ED17A54AEED2F46A9D924B97C5A8442611D12E140D5584B7375C2E47389F339469022C055E7303A144D63566069DCBF40432EDF8A6693D2764BA19E590114B44FBCAD4F1699FDCB64F89AB053D34355915E987F260E09D657283CB7758FE7633143FDBAF4795986A9E480E8448FBB16EA49C51E6359491A5215DE7947E3AE0FF018E8DA065FA6C17AE90D07431F8F4B6B956884B3288937F40F72B7A90E36917043C994B354DE67E3DEAAF15B683A62B023BF9DC0E6DACA05D75FA9B8A16CCB8802355B0ABDF961B34E18853220E5D01BE63449F002F23799E7989E9EA37BA15B525AA053B200B4AE796DB432242B9EECACAFD1EBBB9037C90D837AF20407B194ECEE1A4D468BB95EA0135C84BDD8079818C822768728CDBEE416FF0B5311A3AD893437D5760A14A94F4ADE9A0C4D7F2CD33AEFB982B8C05E4CD0D8E7C50C9591AC3678E1DB93796004E719705288C15F8FA49CAB636757ECB0037B852B755B2B519552EC3F1D9EB79676DFB793806043E880319E9781B9702E3A39C80D8DD30A9ACDF993319287ADC774EF961670FBF74EF41CCFC4EBCCB2A571945DD5652F7FB85B20C5BA4FB4B7AF0993C4ABE8DF1231DB8E635BF7E6B5F73DA5FDB042E699F68EDA254EAA50E9B180341C1AC72E0DDA1275205AC0AD31388F2D002E3DD3FFE26FB8CF8B69D9728E583B1369F3688AA9F3EC3F1C306836635E3F14F37FC6FDF7FA8578BE943 Key = 8E3BE5C3118FA8382BE650BF4727BF6B84F6D962367AB966A072BD5913335457 In = B5E5EC7969BE71F2CB23A1B3F03683D760849D250CED76939779CB56F68A1FB0C5203E70C709AA3BD5F46BEF4810F7A1D5D3DF80C7E887BF8D8AAF851D22A70663CFB11F9FAFF3C7C3CF7989A62D3D51A317F5AB3F34E3E666FCEF0AF7565831C148AE441EC5B944267D2A5724225EA7FF93B39A3B4840FFE9F379598721C1C8E5C72DFB37999932C75D16C5F43D77199BE6FFC9F19EB8C19296AE5C06CF2B7263941D6CD40EF0D68E3D4E309E46794EB0CEF97FFC79A2209B49657CA5010257AB977BEB3070192E13672E94C99E8250CBA79BA46A23C1613D46EDEB7DF6D2AF8F0928115CC002103BE69BD1E7BA4D81EC5CEF372DD1A6FE6B2BBD643C04E0C7AFE61BAF19140C0A45A7226D059D66EBAEA5346F6C79B32F234813CA2365D3F45E13F77ADE50C16A216ED9497BCC77ADAE50DEDA9636E67504C71D499707951CB28EDCEB16974A7F8015170E7CD9A2962D529EA97877281DDBDAB23988502C46A0F2CDA4700DE1923334CFA6F344F4F8514DEDE2DDC82C0079729840A459A59DC89C57FE7CA34784178FDD70D1AD7F46C1D464DCCA8D0D9CFEC542A0689441360C33F1EACC4B882DE9BFE1B593459A13B73E86BD8C0B0282C69387B0506FAED80D13A2CD8A61FD556AA52CA111A250A9759B65C9815E8917A81248E47F7AB963A5D26ED23F07F1DC07F74490F97F0EE79AC55532855E44BF85AC6870ECDB6EB454F04332297D1A219E76CDD92BAC023036C580F3311D5255201F6617AD800A7C1BD4E0014AB554840B72BC2E6492CF27E246DFEEBFA6797892600B13CDDC4B71F644492950476B21315B6BB6599355EB2ED3B41DEDAEC9915803204A77B2BA17F5EE77143D62939326C6B0E47D013C8B4CA35EFD56969CD9922DF373DA3361692F2215D1D79A620179B399ED509B75D64229E678D50BA5DE297D4E3F43E63910BDE9F50D81477C4204205F743F94168FE1B1D49BF0DF9B4CDC54043BB0992D1D8D2DCCA0E2BC3D16BC9750DD2683C8B60313E9A8E613DE853B5BAA0A6F987F6E7DD4753E285ED6FF895D521BD38567588F36DCAAE3CFC13EA204DA65E1D8FDBDB8406FB10F99C977D2523B0556C989D7A13E4B6CFCE1C92CAD06F513D4E9ABF607D88FECECD8C47413ABD8814DE84075C4BD8315EBA45571247DB384BF6C84661B93E4CE7ECAE02CD3B2E5C93F08FD020AC41B583B73E5C1534D5F101058B9EF51BE65959D30E2A74F643F55A71DAC6441D3C03A117A675F6472AC5BE7C3D05791E85134CB10CD4C8A4F9E62EBFB24DE64FD5713CE856BE832F4D6C409390EDEA43E8B1BBEB195C38478342B33BE0595334B3D0EC5E392BABACF0052B3686AAE8AF9A9D49093EBDF6507E073EABAD120CAF75A172E08046542B149588AFBDA53A1713D91980F04E95A048BA7A92B98C4C090A622ED1C9E9BBEE79D1F24E36DA1 Out = A497092296A16CBAB0B6A592C33FEAB468D38BC809F666492B55F6A0FA8C02B38856A0ABFDB5EB16423C8FE8C50DF5522C27CB55251A8560E25633B97CD00434266786B57AA4CBFF2334D072CC32652917F8371F17EEEB05B46B520F97D63EEE0DBEB2FAC94896C49D13EA71EC1D6553B05DC266D1C2B8AB82932B5821A5DE558317B0C42DD1CC86DB784564BBAF915F5467701FD7C28C9AA51DE741D90FCB60A16FB21504F77E7EDD65CEF98E1C88CDC657BAB27039C3A89A022B18783E65FB6F7DB2D8DB623BCAF56FD94634FCA45C9537BDFA76C6DBA3F4A7F39037C2B935C25DD517AA2DA9CD8F5E83AE7D3E95ED63025E925253D1C5FCDBBBF18310954C22CE7851ADFB0527C057B51EAA8504082D138DC6569F9736EAB6C11BB0DB9243BBBEE576A1CB9390F92362F7A3581E91F27B3B47FA0E2E375584D8B7588BF5B5EF1EC2CA21267685AD9E76B985F5887B0A6E313BE8275E3F7C0BBE87228DFED01E37A7213349150191860B1AD3E20C91DD504C2FF642AB869E4B427B11B1C22A6D1029BCBC7610EDF9B2F4A2834A8897303A9C5A313D7C3B18796CB0F0F968B175D7CA252ADF80CFDB258228FB6A1A9AA52F8847E18866C4F1038B28A6A3EB14C51098049C519FFF83136206BE095094C66CF3F683BC5757D2394DE9E0808E42DE433988FF30326AD87C4AE38521A2B8E4BE8BD7634FC62FE02E450510A190A767B3475639A86ED3F31230C21B2C9BE5C1285C8B127BF153B2F3D082F4F6B18BC2AC3380BFC4BCAC748C7C8F781F58CD674DA01CC6351C354FA75879E002A6C95986A516035F6F2A9C50FC8BE5AC79B7E9EBE8FB4F4DFE1683C52C966DBEAC355965A04F9AA6C91833BD55F508B04100A88FDA58F14E5C260859EC7CB60F625928EDD7CAF8B3490655E234CC511B523C40B56BD07CB9A6A08A3642DA96C3D889C1D95176C9FAF6E28E74A548FD6F8C3B0FBCEC237A5BD739A2DCF7EA93943DAB8CB5F228E0C752867E116842EA867AB7FB0B4A6D031E9FEB8780C1318DFDBD6CD335122568E7B7294DD851C800156E13B445D64B22E9CB4649B07E4BA64D2D22387173727EB434AC69D7A3F5580EEED15F7D4F15B6A6B190630C3B4BF6CCBE98549152E5E6EF47FD02E5ACAA8D1C7E8621FBA77C4C712C6B91EE273B81C9CB4B0F5C610303F700C441DEE3C05540B793CD4E72C787F262F711EB788057486250076C2B1F09B93B2DD962098CDEFC48CF50A90DE67B97819FA4248D45BC29B3325C4EC1EF95C9C2B1701190BD7420FEDA9976DDF8CF70AFCAF1A8799738C5311757616764701CECEFF27D2676B1F55E3749751080358DD9E9A9125287342FCB08E6BD33C776B0E0E2A6F28A043F52A6508DA1C7F867512E13A64A20DB83D86884B50141254C71B7388F6A7D65EFB2D069A815FECB0970A3300CD5C5AA73776E2A [RC4(3)] Key = CC26F0F11FF7759081CC87B0296E46E1A29611FA042C0F09033F12FD06468624 Out = 228D9339F23EFE694E45A6A5B4457F2865061384B064DD45321D399FD1DB1C3CCBE64B [MARK-4] Key = AAC76CB1CE2BF5144EE9A543328AFB95 In = 97212EACFDB13D5BBC037B01A81CBB736B8136124E275E2F25823B8B98EDD3C4BF7F6AD52D Out = EA57CEA491D69813935D09E0DED97221B4E909BC5C59CC8C1202BD0E7BA82C53DBD27540D6 Key = 141619BCD6053F33E5D479E32F937222 In = 87742937D3EB3D9729D4C668273DFF01D6096DE237BCE72B598727935704DE047378453395 Out = 120EE944C947D8EAA10A446BD6E65BBC1D5821764262F2129FE2C37B65A38C5FB41D4A27DB Key = A2F81CF25695060C04A2ED2E6F92339A In = B0B0488DA6A74775D3C3B3459309D21E20D00798B45EAC2C6FAD29A1A8C1743E744D34D1B5 Out = AE1EFEE98A07A2654C42B68FA24065C02714D43EED8C0AB336EFEA1DA1906ACE3586C96DAA Key = 4404423C571E0843B8EC4F5B0380EB60 In = 9BC14F96CEDDCF5440130D170608752B75A2D1BD7227F8CA2B991AFEFEC0EB3B9656ACFA53 Out = 953A60AFE169AEAA288638AE7DD5DBC2120418F44470194E6B869584BCAA13D7E0FBA35FC6 Key = BD348966C075CE6B78BA2918258538ED In = 7B083BFA430729619537DF5BF575777CF5A433206CFCB8B175AA4BB5AE46EA82A69A15C2E6 Out = 80206B94450FA80D81D44D3E751C8541E15B9DCFBCC05DC6007425E52851DF51B8166A9EF2 botan-2.4.0/src/tests/data/stream/salsa20.vec000066400000000000000000000135211322470703100207220ustar00rootroot00000000000000[Salsa20] Key = 000102030405060708090A0B0C0D0E0F Nonce = 0000000000000000 Out = 2DD5C3F7BA2B20F76802410C688688895AD8C1BD4EA6C9B140FB9B90E21049BF583F527970EBC1 Key = 1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A Nonce = 0000000000000000 Out = AE39508EAC9AECE7BF97BB20B9DEE41F87D947F828913598DB72CC232948565E837E0BF37D5D387B2D7102B43BB5D823B04ADF3CECB6D93B9BA752BEC5D450591514B40E40E653D1839C5BA092296B5E965B1E2FD3ACC192B1413F192FC43BC695464554E975030844AFE58A811209 Key = 1B27556473E985D462CD51197A9A46C76009549EAC6474F206C4EE0844F68389 Nonce = 69696EE955B62B73CD62BDA875FC73D68219E0036B7A0B37 Out = EEA6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF880309E645A74E9E0A60D8243ACD9177AB51A1BEB8D5A2F5D700C093C5E5585579625337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163ABB0376529FCC09BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF2130FC0A6FF6049D0A5C8A82F429231F0080 Key = A6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF88030 In = 093C5E5585579625337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163ABB0376529FCC09BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF2130FC0A6FF6049D0A5C8A82F429231F008082E845D7E189D37F9ED2B464E6B919E6523A8C1210BD52A02A4C3FE406D3085F5068D1909EEECA6369ABC981A42E87FE665583F0AB85AE71F6F84F528E6B397AF86F6917D9754B7320DBDC2FEA81496F2732F532AC78C4E9C6CFB18F8E9BDF74622EB126141416776971A84F94D156BEAF67AECBF2AD412E76E66E8FAD7633F5B6D7F3D64B5C6C69CE29003C6024465AE3B89BE78E915D88B4B5621D Nonce = 9E645A74E9E0A60D8243ACD9177AB51A1BEB8D5A2F5D700C Out = B2AF688E7D8FC4B508C05CC39DD583D6714322C64D7F3E63147AEDE2D9534934B04FF6F337B031815CD094BDBC6D7A92077DCE709412286822EF0737EE47F6B7FFA22F9D53F11DD2B0A3BB9FC01D9A88F9D53C26E9365C2C3C063BC4840BFC812E4B80463E69D179530B25C158F543191CFF993106511AA036043BBC75866AB7E34AFC57E2CCE4934A5FAAE6EABE4F221770183DD060467827C27A354159A081275A291F69D946D6FE28ED0B9CE08206CF484925A51B9498DBDE178DDD3AE91A8581B91682D860F840782F6EEA49DBB9BD721501D2C67122DEA3B7283848C5F13E0C0DE876BD227A856E4DE593A3 Key = A6A7251C1E72916D11C2CB214D3C252539121D8E234E652D651FA4C8CFF88030 In = 093C5E5585579625337BD3AB619D615760D8C5B224A85B1D0EFE0EB8A7EE163ABB0376529FCC09BAB506C618E13CE777D82C3AE9D1A6F972D4160287CBFE60BF2130FC0A6FF6049D0A5C8A82F429231F008082E845D7E189D37F9ED2B464E6B919E6523A8C1210BD52A02A4C3FE406D3085F5068D1909EEECA6369ABC981A42E87FE665583F0AB85AE71F6F84F528E6B397AF86F6917D9754B7320DBDC2FEA81496F2732F532AC78C4E9C6CFB18F8E9BDF74622EB126141416776971A84F94D156BEAF67AECBF2AD412E76E66E8FAD7633F5B6D7F3D64B5C6C69CE29003C6024465AE3B89BE78E915D88B4B5621D Nonce = B2AF688E7D8FC4B508C05CC39DD583D6714322C64D7F3E63 Out = 418078FE843F5984DD3C7975D1FF51AF4DCEDA640999AAA3C28618AE286CA15051CB4D55F9DA22A213EF14A2B905B52C99A557854C7F2A6D6ED6F69C1C6649F3FB67B8628468029B3367920C2E1148AA1F3B9C695CB1426F09CE84045842946E0454E41AB1EDB32CAE4B95669DE4E2CCAF00BA86FFEAE6A9C5FCE4153BADDB0D8998A600537A9649939CB7D7A9C4E8CBCA0FAB77963ABD516699879DE0B1971DC7328668111FF5B77C253B9E6346D1A2CE6E390CD736156AD7F44B339CFB141F00E7A766C06E130B0C31D88980D2AD8814A2D641599162AB8AF25D93067F06A49637EAF6523806B8FA07D56628BB Key = 9E1DA239D155F52AD37F75C7368A536668B051952923AD44F57E75AB588E475A In = FEAC9D54FC8C115AE247D9A7E919DD76CFCBC72D32CAE4944860817CBDFB8C04E6B1DF76A16517CD33CCF1ACDA9206389E9E318F5966C093CFB3EC2D9EE2DE856437ED581F552F26AC2907609DF8C613B9E33D44BFC21FF79153E9EF81A9D66CC317857F752CC175FD8891FEFEBB7D041E6517C3162D197E2112837D3BC4104312AD35B75EA686E7C70D4EC04746B52FF09C421451459FB59F Nonce = AF06F17859DFFA799891C4288F6635B5C5A45EEE9017FD72 Out = 2C261A2F4E61A62E1B27689916BF03453FCBC97BB2AF6F329391EF063B5A219BF984D07D70F602D85F6DB61474E9D9F5A2DEECB4FCD90184D16F3B5B5E168EE03EA8C93F3933A22BC3D1A5AE8C2D8B02757C87C073409052A2A8A41E7F487E041F9A49A0997B540E18621CAD3A24F0A56D9B19227929057AB3BA950F6274B121F193E32E06E5388781A1CB57317C0BA6305E910961D01002F0 Key = 3070F0DB09C523507D36404DAC79038A393E9F0E3CF5F870B16D2A06DA68DCD3 In = F4EA120B47D15466ADE07DF0F2FF508759D9CB1035CEEAB43920E9094FA50B868673B07173557D4B994B1E9D35078C1C7369DF6B6ADB2EC0E6BFD280FEA8AC31DB44BEB0C2A4DDC6198957BD0592E3E587D304863B893FF8EEE0EFC70CED5D712651C3E9DD1A0DE0480FD8CCCBAE4C50DCCBACB83DCDC3E2CEF7DBC645F0AF468163FB0E015EF48AD74694DFBCE2DB8430A6E91645FD16ADBB72E21A0FBAEDF5ECFF829CEA9CBC22F82902748AA52DA5CE903D9F2BDE77EFEF5FA3970C720E89F25DD05157247BF0DE2D2129C3F856238D4FAD Nonce = 4AFE87BF79EB938D786BA54C26FD6D7E62261EEAE8B62202 Out = 46F396F0D2D54189968BF56B5B2F35588C3AD851E00FAC6507598F3EA0193A586C00B18677811CC305B0261D9AEBBB9C0485A5800C940AA4F09C4FBDEDE12553824C429C7954E0B8DAD889203D292517B98A64E8D7A37C1364EB0934751323D9B9F8498F50D729E977FB742880222F22AC5D7BFEBE6905A4C344D82027398A70C334635792DEB0F20B83861B05E731F5627AEE17DF20413C79957556E66A970085E9AD40A73D9A964381584976C6F111619A916FBB5F5D305DF862D5A56BAC9FF9B436F31C85F34FF890B5AD3299EDA2B8642D Key = 000102030405060708090A0B0C0D0E0F Nonce = 0000000000000000 Seek = 3 Out = F7BA2B20F76802410C688688895AD8C1BD4EA6C9B140FB9B90E21049BF583F527970EBC1 Key = 0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C Nonce = 288FF65DC42B92F9 Out = 5E5E71F90199340304ABB22A37B6625BF883FB89CE3B21F54A10B81066EF87DA30B77699AA7379DA595C77DD59542DA208E5954F89E40EB7AA80A84A6176663F Key = 0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C Nonce = 288FF65DC42B92F9 Seek = 65472 Out = 2DA2174BD150A1DFEC1796E921E9D6E24ECF0209BCBEA4F98370FCE629056F64917283436E2D3F45556225307D5CC5A565325D8993B37F1654195C240BF75B16 Key = 0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C Nonce = 288FF65DC42B92F9 Seek = 65473 Out = A2174BD150A1DFEC1796E921E9D6E24ECF0209BCBEA4F98370FCE629056F64917283436E2D3F45556225307D5CC5A565325D8993B37F1654195C240BF75B16ABF39A Key = 0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C Nonce = 288FF65DC42B92F9 Seek = 65479 Out = DFEC1796E921E9D6E24ECF0209BCBEA4F98370FCE629056F64917283436E2D3F45556225307D5CC5A565325D8993B37F1654195C240BF75B16ABF39A210EEE89598B7133377056C2FE botan-2.4.0/src/tests/data/stream/shake128.vec000066400000000000000000006765521322470703100210260ustar00rootroot00000000000000[SHAKE-128] Key = 84e950051876050dc851fbd99e6247b8 Out = 8599bd89f63a848c49ca593ec37a12c6 Key = 9a335790abf769877c9e6cd3d5199e8c Out = 2ece1768a6ef6568a2dff699613f49d0 Key = a4db76d26235e64dd960f4ab6023e475 Out = c7284f7eb5b7c89ff2890addf1c6140a Key = 8d13e66f3c4ab0fe07c4f55ab4bc4ec6 Out = af8ece5999705d0d604cf05481a79897 Key = 261b6d999f1e6202cc9e06e203aef6f3 Out = 2806515d35b2fa14dca982edf003427b Key = cc0a939d40fefdc6c99acfa37de10df6 Out = b70b724a91ba865ef434f85048504891 Key = aa65f144d632d7ec0f2b391eb8bd23c2 Out = 2c160a9b7473dc0dfd5ba8089e7c7a95 Key = d58068a8ef3486dce8c88fb4c7385e30 Out = 5f63f137c7124c6617777f777756c801 Key = 32a36452a646beba4bf611e0bf2cfcb6 Out = 3df0ccef456072f3daa5642d4b02bd5f Key = f167511ec8864979302237abea4cf7ef Out = 20f8938daa54b260860a104f8556278bac Key = 34297d1ae9370c83ae2baa7993638c73 Out = 40a091f062889c81727272f3e4fc96fad6 Key = f4453766b7572c3d4a97c2b95d02d1e0 Out = b5fb489da49f500db79d1f1ab0cb98a867 Key = 4e6e586ab1991a9fe5bea54a3cf97787 Out = f8569c829df9e3bd4e290de87f0ab4bbe5 Key = 2dc3d1a8d03d79a7277b3557b0548bf0 Out = 05b54b3bfbf8958e97a1c85db7856c1db9 Key = 16cbf0273eaf6e7158bf635b731c80ac Out = 8660a4c21d6cfd5a47dc2cc7b867bde73e Key = a0a3dc989c9970b11041b37b3a68885b Out = d4020f952d6588a151187fe70ed6a31fc3 Key = e9474a9e7a8bd81dbcca534d8c78267a Out = 5ca33a1ba329ebadca76735d27c5b09477 Key = ec83d707a1414ae98d088c956ff1687d Out = e6c1945ec92c6df1d571ef9bba8d60e128 Key = 96dbe183ec7290570b82546af792eb90 Out = 762b421dc6374055a061caeddcf50f5dfbb6 Key = 70bee186dfacaca737b2b099a4de13f9 Out = 0c5e6530a41b3fba4b8bbc4cef2c7568c290 Key = 3ef719bee1b1485cc50e521c2d19a7fb Out = 3d9aaea9bb2522be4172702d04af3f03efe9 Key = 07e4a2db89616043a8387b4cbcb32828 Out = 7d9ec770c2a0123ea3d9cbec3eca1c04752a Key = c05fcbd92b77c08ba6920b1600d393d7 Out = e9a1db5ef2cab2b32d6c8e4daff4d24eaab4 Key = e137b0843baff9dcde0a617cb889f3d1 Out = a08532d0cb489b187b67613b6ccc2b3e8e3b Key = 75827fcb0c0848a332d08376666c4b89 Out = 80fe3c82824c1541a6edb6c68e22b885fda9 Key = ca12721a7a44544d9518aa0d4e407529 Out = 25904657e9903ce960b56bcc42a4e9ff7b33 Key = ef741128cb1abaa43680ccdc7e12192f Out = 0bd267b9be1cabd995247d9deace127c9d46 Key = 365c75b9b325a2e1708fb9d91539343e Out = 6004bf78fb5f0e181aaa8f9890aaa06a7f03b5 Key = 9551d68d4867475fa02ec3ba669c75eb Out = c7bf34cb74b9481cd031677d2d0ad2cabb078e Key = 981f4788c57eb8d064805357024d3128 Out = 4c206447e85a2cbd4fab891ef3140806a32a89 Key = aab231df86e774b3761c099046b851a6 Out = e8d795b389dca8b7b52e768fec79a1b7a60e5e Key = 75668a67645b9f8c0a737bca19231253 Out = 9f2ccbe1ffbefe78979dd23e6ccf9ed3dc306c Key = f8922574de4dee7129eec3037926e972 Out = 93e7fe138a2e2a8e7ddaf8e8e5595c55f98d87 Key = 9b0d9b36c46c2cae148dd0f2ffe9a8e6 Out = aab2216446d3347bb51a6240c33dc58cbc054f Key = ded94e2f7dac06b4245a5ae06c63d9d4 Out = 7fcf3586f10aa31cfba4717461958245eab3ac Key = 27a771a406df8862fe9d988f9f82d269 Out = 2d8fed871a7fc7521ade70df9564d525537761 Key = 3458d31eb677c3a369d58608715480ef Out = eca90329dd0e76f5051eb5cd75f5e015f0348993 Key = 7243050e327a3a22236772bdc9506cf3 Out = 62770578d0504dff65e54dbe3ceb509e8cb89160 Key = d5e102fd62e05073237c292598bbc774 Out = 7cca5b42a17dcec21511f13930283585ffe774fe Key = 9eed6dd16616ac286c2d33722e421f6a Out = 4c5878233a58f9069f9df74977e217e238b03a78 Key = 4cb7f08addb2374f00342f267ef38e7e Out = 0d140c1ee0a89f69e3d5acacb282bc71230d546f Key = a035c12af3fb705602540bd0f4a00395 Out = 64689beaddf7060d7043f97d102cd14ee2c83542 Key = b62bae726e14fe9ed55bfa762815f15f Out = d98b628dc2aac97ea43a7a843f55e3d7eed5c1df Key = 70cd55d250661efa8cd5aa0b7ce231ad Out = 481f166894ee480648b093b91827e1847b7a8518 Key = e8dd215f3107d4f2b7fca3ba036f869d Out = b727d3db9edf072ff87a1e6920abce8c66c356f2 Key = efd99fb27a8dc1c9f31e5483b35784a4 Out = c0cf862a4230b413d88a0205a17352b1683ad1b8e2 Key = 05a32829642ed4808d6554d16b9b8023 Out = 2848371f7341d499fc848ea8f249a69260f98b10ec Key = d244e11f506eb5ea5b4a6b328cdc80cc Out = c1dcfb1a8c6af1f3faee61e7e4c6f99d774405a238 Key = 9e8bd95c7b59826a7639adc704dc1ac5 Out = 2dcd280f1530bfaeb7361a0caf1e3c1b7617e11665 Key = c2e6e39c94baccf48efcb08f2e08084b Out = 1062add607a6a79ed9a27413b6a6758eca6a71f357 Key = 81c8bfe6fc0b1e92ddfad4215752bdd2 Out = 3b37b980afb04ada89695c70c27eb887a913a502ed Key = 27583ecf40b46eae9cf7e6c708c4870b Out = 9c6c40fb1e8b281541e979f7f2700cf0419233fbe3 Key = 56ee0025d5dc36cb53552dfdb9713127 Out = fc20a0bc0e9e0f5670758bc3b5f50bdfb278d781b3 Key = 91edd2a26865b659598f7f6c1c94c2e7 Out = 52cacd1c121c20973ad01e53d1e418ca15638084aa Key = 7ceb1e7161c9170d3c6ae5cfab3b4e3d Out = 420890852bd43a6399f9fe1760a76a26540cf03f28b8 Key = 59bc722152f2a73b17a7bd9a5522ee64 Out = a4880b7b6049284de401592ced25d1c05a55e90bad5b Key = 004da551df7139df9f34299ff0d5ce59 Out = 41deaa74c79677f8b5e80e26cd2f48d8b30fc939ac57 Key = cf5881a68d477d9b2d26dbcdf2020940 Out = 081bd131f9b131e28beb9f76a549bceac680ea9103ed Key = 497a69013eeb665c73b60ba34397b019 Out = c80ed4ac9604b1bbd23ca48bcb8b01dab730af9d1c73 Key = 08206d367db60c75ad9b3c8bbfae70ea Out = 904062b64201aa792ad9dd2917757f96c707312694c9 Key = f03ced4f360ecee8f76248536e1c04a3 Out = 09b5166e6eaec706ee55931e3b5947803dafd8c9362c Key = c7280bba55803bc5a86a11c366467fb6 Out = 32d1367afe291d16a06c48c59ccb01b64086c55d1336 Key = 0d6295543e7d7a46c70a9dbff7ece755 Out = 414cfca0e209e5a979d74cefb9bb1aab57526a7a8609 Key = fbd93adb9e9176398cf1136a1f02c6df Out = bed2e63ebcb926a5a18d523741d1cbc9f5ecc98a97d9c0 Key = 4c1a84f9eec120ad7c5dc0b1015778da Out = 854ec602ff61e496ad68143a94a290ef1af167735d318e Key = 4c9a0106bdf32f111c983b3fd9c7b8e6 Out = d4d4d9225d523ba24844c5f77d82da81b4861302a0db5b Key = aa369a4009f21fcc54815d8fd9cb2f45 Out = 5aa0fdcf526ede4bc11e36c0128dbbcb5893ebf945b9db Key = d3a08f2cc59c658a4c69176ff0c1830d Out = 47cf0672e166060135762779a673491c864600ed004b3c Key = 932f457305a9a14330a29121c58e074d Out = 205e8affdf54f6d475ff391fd52915e4c0afe5b8a6c18d Key = 03aefbdad93b6896dcce1c729fbce988 Out = 7e84bc8d013ee9c40d29b570b2ab37ad93bc74ada2d51d Key = 2d31ec167adc7a023568dd02f71c11b6 Out = 25f5715991dbc0e4f7029fc9eec8e64159d30e669cd792 Key = 7bca487ff0ce5452d92e225c9b8c5bfa Out = d45f7d6c309543281f62bb91f03ae976a3982e690cf803 Key = aae474370700c8896ff1bd90df4de3b6 Out = 73750ba855ce376034dd5dc9c1cf54e3e2e65bb0a1c7209f Key = 431d4c79faca0e15b720aba4190ee430 Out = 6fe71e38285f0c216f08ae4ffe8af13502538a19413bfa0e Key = a0b250e40e54e3046564aeec126da60e Out = 6223b013a47db143f7fd3a99b897cf8ba1b394bfc58fe0ae Key = 64465d136f9081e293b3aaee1a6310a1 Out = d664a13ff90ad944fa60040904e06bb69a8ef39e84de7707 Key = 382ce6a97be09193404b5f3865e6baeb Out = b824c8f435b8f86863d40522bc5875be67bab4f798794c7d Key = 4bbae3b83ecc337e0854273d3ab17467 Out = f6dcb321edee6846adfadff9868f2ae5341446eed3a257f2 Key = 70ff9f09596e13a9ca6a73d0bd95265b Out = 06eeda2bbdefdb2dd1567b6d198ab73b742d6c923ba0044d Key = 672630af113a015cea520e6e48bc8726 Out = 25021f325085becfe19e19093574e86e32ca51605c0ee895 Key = 500e735c87c19291749b653953b724ff Out = 4848f7a15cdfcf2cafe00186ff688eb626bade0e0877a894 Key = c1b88c92ecccd4755987dfe1a915f986 Out = 6e555538878906721fbd2c8334f4934174ae5317cd249e92af Key = 593def2e2124b69fb8e139272e922e71 Out = fe1119ec2a57d3f22561b9675d8091adbb50dc702363afd61c Key = 2f034a5fd01e46c9bd1951f1a76e4f3e Out = 45e7e61bd5cc353eb81b83c6f135079893667c9b52475ee096 Key = dd71192a4a9c80781b418ca3eb1d5671 Out = 14d8f04d32b86eea2777797da4e96e4763022f5383310ac9de Key = 86bbae4f6fb8d1d54f026fc84fb58540 Out = 61789ea823deaf5c0eab33f10d13edc49a58dbd3f2dda3428f Key = fbdf1a638c314f7d4c06d8133c6664a3 Out = 6b5741086698203f572ab5eac2ca3b4aa17b9374dc943f0fd5 Key = abcf1a831fb7db1715f9e9b142c6c39f Out = ec1370181cc07bfd882b0fc33f964f987542fec1cd856c8f58 Key = d525aed5907b542bf35ec5cd6c167769 Out = d025c9553362f7010e38a9aac418255ddf3f68243d55369770 Key = 489f322110002548de11c52e10058945 Out = ec9804e417e0ec0f465d102f613d3902e0534dafe40df2601e Key = bf8594f322de3d179722d182273f51ba Out = c2e5b8946c6c73739678a3dbca41a8a615a0967773a51d2fb387 Key = d87f23db7553ebfceaaee817a49b0f1c Out = 6136ccea5eb15b2229d6fc169db69d229fd0fe7a02ed6d87ea58 Key = 521701465c9acc253eb47b5c0b3c5a99 Out = 24581c251ce64fc80db5a59718174a3e50860b6ba6c3c2958bfc Key = 87f6866a72ebbfb9dee65892a2ea953e Out = 81c720730917bfe26ab5fe8a827742a42cea8048afa2c42b74f1 Key = c3adc0c2ffaee0394fde2b061d12f4bf Out = 3ef8f195b39e065ecf350d3dbbd79cb148c03bbeb2401576ff27 Key = e4a96e93bca819d46c7c31164938482e Out = 1dacf817ccef372c343dc3db365abe2af088379a226d9b1a3b46 Key = 07e3a2e0640ea1a22203706b62b54471 Out = 95ea9f55a285d83174b3cdefd95bcda974e484cfd3b50d84d17e Key = 6fe4a3c04e258859e3826140222c6d3e Out = f1caa4de0a00fe7be1e882a427a1932418188ca58daeaea57e62 Key = 368bccbd80655a012c3a9468f42a28bb Out = c46ec72fbcbc7fc9c9a3e160f66426a7e7b58da1072cd92aae43 Key = 606e64147e3db716c3d20d12144c9db2 Out = ae8b8acaf035d9d42f53c437fb4a08b129ac6e29b7abaca6c59ca9 Key = 938ded9a183b6faa6236347ada548ba8 Out = 5f5d977ced561df28906243b298c2974035e3bb83f3d3123f93dbd Key = 9d3218a3b9046e80c344dafc5c9ab416 Out = f20fb033f7a4c01254e580556b36aaf607a904f0d8d87b75bf2186 Key = 9719a6f3a37e1af1d79016a5056b9822 Out = 9f23c82a7a958443ab3851f0c1cc1dee339c282dfe9d76d5bef4b0 Key = 3629384895a8304336460ebdcac42216 Out = 078d5e9d7b92a70da55b31d0e82ff2018759b9b91deaa3f43372e5 Key = 8582cf482e3bc15988c987fb075dda11 Out = 4f03cb4d9d119301587e5b866d3cb3872ae8dcc372ab121f3f1707 Key = 1bbceb569ce7a3c5ce121cac63bb2ba0 Out = 56ac3177da634f0f4a8d0bc49dc6762193218ad80aec2290c50534 Key = e68a402884a458ee49509f77d18fa46a Out = 9dae63347ed29e71c73e8c589184c5c94a85051bcf841727681a6b Key = 4a37b8498861c3cb5d145b35c71f9c86 Out = 69f8eccc9dca32fb1725f912899bd55ef8e5cf6194710acee4e779 Key = cd10343363fe9ba5558a0d547bc3a5fc Out = 750120acfe4cb4181831b8e8793bdd3481eb9c45daa7aac24035c8ee Key = 1deeeadcc8711b5c4f0234f033b15252 Out = 4cb4e14dbb2e0623d061cba81b01cdc9efc547b8659ccfbb58c56402 Key = 64b865cff25adc9364ff36eb75cc17b2 Out = c4f83d6fcbb3f29dfb3d8ebcd052ce6056bcab730b794458e6ae2ba7 Key = 90723cfd10c22113bd28dd4c09a5843e Out = a697b354f636a1cc9985590bb84aea11dc8ed80ebc95f90911188279 Key = 2c9b5a2717f05a6db21a2a5149c51af0 Out = 76af83b5a0dfdbbca38c1befaaad3e63ee45a3325bc584c1e0c22ce4 Key = 9d1336eb5e7e2ab35dbdf9de54aedd4e Out = 93788a24ede50f27c922c10bf3a9cd20c3d84bacc0cd6fd3ece586bb Key = 21ccca432f535e4624b7ab39ff49c8a5 Out = bd62b3ecbd2bc05b9cfc4c1248af8413dbdbdaf19fdf60d3134bdd93 Key = cd65479018c98f9e784485c42fe58f1f Out = f5e4adb0747b70b66ba3407d8b4cf0fe64b8a312eff550979b515079 Key = 2e0b24fc8274fc7644d81796d0b053d3 Out = 0691797d9f24556c5dbf1fbb9c5bcb447cba326ad60940d0c55f25ac Key = 73eeecd1f5c1a64fbbece5876c101e32 Out = f297d2264c57b39a2cb988e68d721f4bb1690aab0c302a9048608c640e Key = 5f67c964bfd9fb70f56ed94565898393 Out = 52d45923709c9df92ece412005c6b953166716b2719478e8730941a4fc Key = fa43adcdc394f77c4e64747f19c833b7 Out = 32f7d93bda1aece6fa39095c4b55e9a34c4c56a18cd82d5a22f5ef73e1 Key = 4be0a6f888f251902eefcd035f02e9f4 Out = bf7390dfc6aaf8f56d23979ec1d92d2092de3fcf170747ebcc32d1ef9d Key = 71eb3e6f0e8845ffb1e7950dd1ee875d Out = 888c97aff7adc72af2f2c8daaddfe661bb8571a1ee9fdd6bf9ada0563b Key = 9a137bbeb20d05f3d4a2959a1d4d47aa Out = ca8c36ea428cb2718feca0451e3d98613ef27b587b43973773dd2f2e40 Key = 43707282fcbc66599cb04ba3138d31c0 Out = b9a7cfa9f54c0ea302182d82324f76dc0718d266879c1b9f00e62612d3 Key = b232d9a085d7d13d5e7e86616a32278e Out = ae8dcf860461325b6359078ed3af5497be642b31e2e69200fb94ef773f Key = 64e7bcd2bf9a94b420aa117a53bd0b2e Out = 6316b49efa50b05be9995572b6da84a1b60820ccaf2911c6ebfe1db751 Key = db8e4d7be53d2396fdf82726b2e57a1d Out = 1aa263d0ff30785a74ad2ab0aa635ced434de00e39b3e544aebbfdab0adf Key = d94aec50b9725a976ef047e0a8457ddb Out = fe3e414232ec75a304cdb8efb854c14982a20659e6120ce0cfad027dbbe4 Key = a265cc7609106afe878f41bebcd30dcd Out = ba648549536ff8a6e9acf75cb44f989fa9154297039f8b1c5cf14a8d59e8 Key = 52a10c3726f7d4be303e17edf530b5f6 Out = 3beb8559d3331fb86d13e2910a9a6d423baeef09af488cb7231bf5aff200 Key = def73dadc3bdcd938d2c59a76a8d9322 Out = 3a3fb3a84ef8006c2e5bb946013ece9551105bb883d1bbf90a21247f162a Key = 3e3acb7c71e82d4c557bf7a95093d6d7 Out = 9b7729cf16cdbf5f1cd0582a1492755d48fec6c55510ac0b3770a2bd32ee Key = ed81dded03dd2b214c939579be11e764 Out = 7c48fc1782857b5e2f0502e58f516cbc4548598dab186cadd0028fa50ba4 Key = 22e1df25c30d6e7806cae35cd4317e5f Out = 7a16ecd689370df719ca1e4f5add393d23a2ba4cb0cb1d22e0090ecc1461 Key = 6cb98a9dbf7c4982ed9c2d4a71b62da6 Out = f0b7d6013b1b37bec7424890067faa81f345751b31ddd0fd304d0bd00ca4 Key = 5d8e8b9854a597c3277395cd3dd5c28f Out = f67d83cbe49b580d00c42a5fdd6446a755e227b57e13ec3072fe0fadacc950 Key = 44364eae415dbbfdd75dbc38a998387d Out = 1c97c7294c140a1c57c5efeb2d7fc2769d53ce6789d70af2c8d0ae4a5ef858 Key = 6da13cb59b6b208210ba6c34716e0c5e Out = 970f21db638b8f59ec8af7e2d713f56933a19c1c830fb87eef9e324f3ec890 Key = ef46ba25fed903837bd6f14da02125b2 Out = f7b188cb797551ccb5c431d405fe609021efa437233a78cd7afdaced081472 Key = 1a26596839fb83304bc469fbb56434d9 Out = 0a610c3dc22292e8309b335b5030078269fe6f5b39d50ceeadea39b4d9de0e Key = 87d5aa9f54af9d83b1b57678902059a5 Out = b2274f89944d2a84aa57d8d8b470da9036036d74bd1cb0adaaa2935ffdfa3b Key = da044864c8217a77d663aa3bc90d6716 Out = a209bac56d92f8e6b2907b934322951cab36cf48f00358ba2e45364be416bc Key = 381e6b77a78a3c072c9d5be23fc11d50 Out = 20a8e73ec0e9ce0e6b8a53f41f63e8df06bc54a20b30bd5515210a3f5c36b7 Key = e1095a806e6e42bc225f85edda98ff55 Out = e94ebee167b533ee2ff4348d984e472695e1361234a2619310222bca76b223 Key = d94be6703183babe2a30331b0028193c Out = 0583c92e58ec7df9365dfa9ae3fab8bab0ae1a85c24cc834751a39159fe17d77 Key = efd1c510ed89cabdf29598c0e41265c7 Out = 117df5485b9c7d13f31e7897da27d508da1437fbafda349b33715e73d935c615 Key = 35f05940542b20c76f0d26f0826d78e7 Out = ea14fce8784800d1153d46273b377ad7e2ecd69c0203ae508dffe5cf6d5226fa Key = a35ee6136d2e323ffc855c709c5426b3 Out = 1005e8b44095c70b7fe22bf2eb0be4b46ea09ca75ff8ceb0167b86e4e7bc01e8 Key = 9de0f29ab812173dddb33afd611b6787 Out = c7d46e50d46ac4c1899778b36b06b2ac624e2b83c9e01deb5d47c0b82e41df71 Key = 049a9a408e559aecc24b3eaeb3164a8a Out = 9eec3746f1ab442cb915aa0df5c8205108d35017e6998351ee70df7340564cc9 Key = e01cbb1ab95410653be263b1c63e9e53 Out = 4abd4c46f3d06e4fd8e0e7b0a98496159350ce8af7ea331772895d71ecf8af63 Key = 22634f6ba7b4fccaa3ba4040b664dbe5 Out = 1a3e90821cd0a88e5a6da728bacaa30f7a1086220e72d1bfcff922034d29e629 Key = 0ad6dcfcb33ad0fe51b0bb94cbd4d9da Out = e97c9f53eb6128128b0c40efedbb61acff8a616dea7035f102addb1f5d38df68 Key = 31fb6be396d8ef43f09a7687d60fe70b Out = fd982f75a66ff3798b35b41735a4337a3d76a5e5b7cfb652bcef82b418c51daf63 Key = b9978bf8006d4551a3b905689a60a8f8 Out = 0dad76a9d67cffaaa23c98f2657ed832d2f95576f29e10681354e810f478708960 Key = a479e25d7777bc8fe36d6e0037bcdfd0 Out = 7be13f84f3832297738997eb7986ccf3d1bf01a6cd3b80c8e7a52644312cdaeb6c Key = 0242d981f25245a3958b75c364d2c993 Out = 19396a40377259d78d4fb54ff4eda0b8f787194058b06cef56265c12a4b791a7b6 Key = 5dc1c80a7222096061bd40e9884ad4b7 Out = a3125bcd727c879195b4c5af18da122bc8c43f472e88da841891493d4a202bdf27 Key = b2d13f4b112c07a623cbecf198aebd4b Out = 63232f5d7ba05802ead9871c0e01ab3a51ee236cf48a1f4080ccc1098584a500c8 Key = 287eb556d3afce478b22e6ec16561354 Out = 55695ec7eb5390855ce2bdb3d511f6e9142f5d83043ef7d21f4a05aecd5fef5147 Key = 784ff7a7120d59ed3be228d9aa3a6b65 Out = b11928c301c805147e9612ada417f1f8b8892084696715c01ed02a7ca3a0fe65ee Key = 4002a1c254eea1b8d19d5e5a977f5ead Out = b8e44fd448bbb543f6218bfb4e54566f56375bc34f8909a065a1c6fe66bfdd7235 Key = 6c05ca3e4adf27a7cd58f3dba5b377d3 Out = 277ccfd7ee36bb1141eec0a99650498375ad2025cd51ff3b11e57efe3398384c0b61 Key = be8d6e95afe3352398ab8c46f6837197 Out = 436068899fc704424cf9320f74ea459520ad2aa71100d63a3ea35d0920b8591640d2 Key = 7851f0c1af7177b47d571ef45c1bec7e Out = ef86289f9d2d3a7fa0ac43b04078d3f66b080d186fddff37abf14d75428335d52b14 Key = ab1f4d58e5e1f6cc779f9c79d9840efd Out = 7f86c629c003b280a6b846fb80a64a6b934f74ca1d2da58c436221e0c8ad0e5bef91 Key = e65af6eba1ef23e092f1e292e9db9373 Out = 1768420cf1715a683b1f4362ed5f1fb526abef00c6da0956f449d6ab6b43549e4418 Key = 39b8e4d45bb2171a2e8add1f599c31c2 Out = 441a42b95bea14c4de59c0c84f5c6b342f69a57bcf20d49eaabda3c203fe7469c0de Key = 817699ddfa19c74ef86a35235dd37142 Out = e4d8d262fc4d14f06262d7e8680e067f12f7f1c5f16fd716d222785faf317de76073 Key = 14d7b612c9317f74a3dd0d52b1ff068b Out = 161133943424b01b527e068e564d41e10c76f11f8c037b54956f59799f7fbf4b86fe Key = b4198bbe3b74e99cfb67ba6b0fed218e Out = 120dbe573475318958ed3706b12db19b1aa913c0244596337256c2abfb214f30b818 Key = 232932787545f1472327c69bf48d4541 Out = 0a8c2486eca2cf405ecd2c470b053134dd555ef63f1e0a40162ae839c142f6a31b1194 Key = c8dc8746758e816050c9af7669aacb2c Out = 6ea118e6e5f94e479ea25f8570e6ffaa970509cc1ecdc49f6b7875608520510f863c2e Key = 5119fa5a2050a98d065f7d58161bc069 Out = 82ee650cfd66c0b3ccf2cf2dd38af0d53c35906730929b6e08be092669b04fd3899e68 Key = 1c85bbb71d5035f88ba97a785b88338e Out = 14df1e0e753711da0ecf22f9cc680f601c3773d36332fc4a3999a190a39d377d3b7612 Key = 7263e1e02b649db6ca6349f6811cc3d5 Out = 29fa11b87603f1716425ccc5fe976a4f297486de523e8fc5395541446bdc4bd712c866 Key = b64b8a4367fe61337c57d2afe0e24841 Out = ddd46cc8947eabb2cac38b8efaf723f49cab562b34003b67cacb9b79eef4fbf3f93a22 Key = 5237dd1755842fb9e6b05395c309b27a Out = ad6249f9b7c82f3d8629107cd46a6305de395a1c9975b150eddb3b5732fc627b1d2516 Key = 9c2791a5217557843180c2dc983619ad Out = 389792af36ec599b3f20c36ae7330ad179c334dd98d8667b936860f93c612cf52f1da0 Key = 3f493fcdbd50e1ff2469e73ace9a0fd3 Out = 74c85db2151f1552929594c3df4b0b57fb10945e94727811a5a04b63da7dac94ae556e Key = 46ebbd7578e17f867b723c41b5bfa16d Out = 769adde27ba528586b6a2fccc42c7adb40a6aff905cd59f1c51258c72702615cd465ff46 Key = 0f1124928660658aab0a581fe5aeb181 Out = 744964f4a20589f18f451823fe2125933e4ab8573c5bf0066bcd1229e05a12e7ce4b43f0 Key = e9967d7440b6f3d21f700615243671d8 Out = 7e4efb0f6c8dc4b21d211fece5e9e33a69b8dc963373fd2a35c7e31519c489dcac4d6ec4 Key = d0cd37c9d1f77bfb8343ac648e8fc46d Out = d32fffe1ff1f309fadb62d6672594d4b35e3e5ac853820b0b571aea514657079ec2d4fd8 Key = 139ed70a89b46ff8dca4258568a85b5c Out = 67b355969d1136efbac4ac6a7c755f67b23d973814f75954649cea82a66227f8b32c8da7 Key = 03dc52dda67b20b69778f8017eaddd05 Out = 4d41619f155ad8e836933a53be15541593429c45e56a88d2fb797c10efd0a13e1cbd927b Key = 49670867f30599b35a332ddf57f1101b Out = c9d4c164f8198988fe6eac2acca49ee7a5ca238e744aeaf2fd0844c85d05f6f6ca40ee54 Key = bc0b3c3bbc2fa2d8b416c2398ed0fe87 Out = 87c1e6ad94bdafd851376d5d9c8e79942141f55314d02fa0aabf308be78b948af428c3ef Key = 9bd2bd3a384b9ef141ead26304963549 Out = 3cdecb09f1673d8c823da2e02a2eeb28f32095e7c0ce8ab391811c626c472511a433845b Key = e776e6749c5b6c7def59cb9834098453 Out = 15a4dd7c93286572de39b7cd692b57744fb65017a3277724b2de12ded2e1bdf6951884c268 Key = db3f1aa51e1308e19a52745e1a272fbe Out = 5c810492e3009f718d4c565712a996d6288f3f6c9ec60f591bc9662ba958cf46bdb4c9e488 Key = f9f861654ea697456a5d9044ee8e0605 Out = 6da43906375dc782711e179582cd435cf422601a346369a69776cf4eab0f2acf954aced2e1 Key = 5b2f2f2af83e86d42c4e98153fce2779 Out = b6e0361dbce6d4a809a2e982f1dcffa4a49781c989402bf9c603cdacbc15484261a47b050d Key = 3b2013ffe1813edd6cad8cb6d7c76cce Out = 97b10c446d9dee64dd29d3f8fc1da19f2418039c36119eacaa72ec11b0d799f2038f7315ce Key = cd54df0a90999f5d266ca8fd4f1d55f1 Out = b78e03db2786126861b9f0566485a39acd47a5b18625624be85e10cb64809e4ee37fccfdc6 Key = c8a0af2b725b947cc1e6c6ad1674bc2d Out = 57f729bb247168426f2a9bfff1420c2543798b8c55e4fb43a396f81bb28fc4737bb6b1b803 Key = 094cd1050f2f8706e65b2ae33ade6335 Out = 944267af083995ba05ec13e798e0de6bc8a127959c6f6744458d242f470d0c0341b74a7499 Key = 613927ae151bc7377d1f4d3516dbc21b Out = d68a076754a81b75646f274eab062560c4140fa1e21dec1ee5cae1410a58409df9a8820e46 Key = dcebfa827fbd92d6744cde446fc86216 Out = 2be1ffc9f8c66f059c2361b177f80e4a7fe1deae96f563a4c4e8afc8c22d149628a14ac6cb50 Key = 216649806a6bd9326b64413cc14240b6 Out = 37599550bfa7748a4fb19188985ddc0fb4258b8a232c00e55824f061771d20c1ae1d635644fa Key = 9c68494913481ead7f77714e09d0c770 Out = 0f57cb41dfc6aeb4d2b9ca9ac3cc76e80e46b874fb5e977201ca3bea45ff6248014b3387c92f Key = b4e9418158bfb48e4308fc8627391098 Out = e83aa3d9c905a2812d6aa91c56d338c7706897cbb6bd6b7da77b2a0a50cd28d57c07528f8f5f Key = 98a1b7cfaa254522016fb13ae4808eaf Out = d95fd1da91b299ca31cd2f1fcedd5f7ba1cf65e1df676c21ba98131048e3c66859dc5a7c1efb Key = f99bba3e3b14c8de38c8edecd9c983aa Out = e2aeb7c11beae1ddb8a5b03c23fc32628341477a41532e4ee5f50c3fa69a26d77aa66d272025 Key = 2273c4b7196f6e1df9dd3bb18e69f899 Out = d98eb65131498b629d703fcd132598f7027eac343e10420d919fc52b5ad7715eab9268af3790 Key = 6882e49c0e5652d42032cf7054beee06 Out = 1be93cf630d9eca59502adc525eb6058b5126daa1451dff68529adcf6216f947eddd93937035 Key = f649d801b4040b7b5152f58a01e7852f Out = afbd57eb8c199bfe3a40fefa120110fa72f9ef53b6cef009d158554ede0134d45e0f06c4baf8 Key = 717c29e8c78626dd6285f646d946807f Out = d74a204efe7ff68a5c39941f3d5e91ed17a280d62c038fba1bf1bee8d4e0f0e55d5cda129707e6 Key = f3fdde337d310995e87bcbb59588a55f Out = 15b3f2125644d415561dabb515ac2b64fcf4becf47bfa1fb9cb9e54b0a5427f1ee73ddfdbb0206 Key = 0eed9a6580ebe20573d3258b39c2de13 Out = 7c3dc45a3e2d153ea10bdefd5d89c074497639bb71ff85d45c85bd6b542d6095e155755947e023 Key = bf96fc79aa0e2e58e8faad4908078be8 Out = d512a16d076c3b1be7847af6c60f7cf8798b9dede9d1314755344c7c2468b9f0651f663ee534dc Key = c3cca27f35e166652f300143cb00e6d1 Out = edfde08d535ec7bb578bccbf44afd4ae47db900e7d7eadea0d5a0516562f9cb3d098b4a2d3c2b2 Key = 31857bb4e82497b526e426de6920a606 Out = 5d454be20c59110f6d7a6c9261da3ece5e741201a9e3e2887b5a61b4c20c6c7558ea378156daf8 Key = 412d0597c0145da8842842d2b9b26c41 Out = c6ca1dd4d744829d7f585653ac956caf5cfcdb9136319afc58fd6a0ffa3ba85ff120d8601d8b1d Key = e65bef053f5341a7d366d8ae9bbb148c Out = 7905121ae03fc855dae4140607e2df82acd266f9bc692570c3a2f78d9286debdce6d979bc380e9 Key = 7eccf10729c55528193e54303392a979 Out = 3f05a205da6b470710ca534f62a9288cb1e16925c9abb4b0f5cd600a22b3e31cf65e089e5b9256 Key = 66490595ceda415859f9e7a30c6743d7 Out = 482d22f8ca8f7f9236f50c8c4f85027e151beac3a07a5b031bcca545f4ae067179e80d850fa69a90 Key = 1822b7cc3c4ea4f2440a362b117f808a Out = 19e740d7d87bc322edeee86a05eb59b64bb86f90dc7b98f781720b7cac37fdaf293ce6bd047a14fe Key = b0ffda2133fb9a06565a633c3f3e1b24 Out = a55aa631a9c0e640e571d8dbb9ccd8ca4480590329288e6b2e638a402d49805b3f7fac2ef5d8c38d Key = b29373fcd231dd3312fd15f1e1b8ac1a Out = da32fa632f43f88a157d4c01383eb60eb3a13692d94b5faded53e13dd8f0bcb2ee0ece84e792e088 Key = d0d12417aa22d65247a290b7a23046b7 Out = c5013d9825fccdca033da4abb77b7dad5c486afaf62ea212746afa4d802bc1df666bc0caa92771bc Key = 157eb086b34c904b78039eca3f1f367f Out = 2ea1749b73ac59df0d6ae8e8f9cad9409941a5ef4ca98ad99e607d41c13a722f8492805200d633df Key = 9b6f29cb273bb692c5c141d780314aec Out = 458f57726da5222255fc1af5e3887d219f814e095902b6acdaad1c0252bdc653a5ba3b080968486a Key = 3a1498c158cf689364699d22649e99a2 Out = 042d0b198d9bdd866bc34d7ada5973914a86187494c82cbf622b33907b66720b24d48a322e9a3b0d Key = aca8584f89eb40c4e2f32d296a7a84a3 Out = 4a73ace2f6730c1ca18332c8a101b6e3724c78e571f317e06e1640a75729cce9ee1ea738f68562aa Key = bef98fe8bb1d17b764233ed58b6b7644 Out = cbf24dc051befbb824b85e2ecaecf32b68c2fb04f90614af87ff8eb0d278564d9088c2f4c8249f367e Key = 9f17d7875a2b08f163782baff892919c Out = da32baec209aa1fcdd2b946faf939fab65e2a6060171797d2709086b20b065d5618fe02603c0756358 Key = 78a01db6eeacf2909a3dbdf74bbbd33e Out = 5d9075e85e4cce16ce8a7bbe3e826f6eaf92ca09dbf26de71ab9496370f51551b149183d9db0da6345 Key = 2df02e92ff1a1300a1b01acbde65fe54 Out = 74f9dad555d5bba2258ed58d0dcc8482844cc5cf7f3296c319ba9682763f4c62324fa3012863506e2c Key = f1e9c745351c76a412d2a854749db814 Out = 011b0582fc26d6cb8eca7d05548a002e0399a5c1554eaec7446dabca2be06d80bf43e26ef483827a0c Key = b4a883fddefc4d8cb050394e0e82fe36 Out = def45035e05ccb4950ce92bbce670d5b038c47856c555c13b3159feab491b1150b7ac51cab41d75f79 Key = 6a9213162b82e8e8fd702d256324a15d Out = db9965694538842f20ce998757f16788e64e3a3482bea210b60d52b97673a6b63447c2cdd50ef59fb8 Key = 3831cc17cc1d4b10bfeb2ec4d169d896 Out = b84c284ec100702ea1729b4a70b3a0c63e58fc7aec9b9676d267b6ab29a80703a4c90c65b5e494b276 Key = 3b6e4dba09473bca8dde4862bda53614 Out = 640b9ed4c41e2d5c4767d316f2c12c456363c84b08ea4a0bb814023971774f3a5f777bffce5a1a59ba Key = 3da43e6d96ebae9017ed58be4a5944af Out = 9684644a09af32e2c90eb00909c7b9e50fbd75be8bed377911ee37d0b3aa86c169c95a650af20e2e81f5 Key = f42455b4367f29cf5edbd6bbfd18155f Out = 98be3eb1e60b3b87b9c2841ba3d7aae48d864ebc1f3453877853179af483d20f5017c1cb406f867d6631 Key = 86aa46c9e789e193fe2a92016eed4b12 Out = c8a44db589e08ca0b093e08fd0ec0bad142cc956d6a08fc6cd491d48e0c9a6215cc048ecdfd6444a4473 Key = 9474a5927c18e783ca148729822acdfe Out = 272535092b445a993731c5dd14cda9a7d2d05b2a10955d99eef77ad402ae8f322319da973f1d3e691adb Key = b09c4d92aada52811ff1e77664f89467 Out = 65cdee0d6ddfc852b2776c3a86819c94ce45260a7dc2cd50720d15d20cba8ce1c58a1deaba608aad181c Key = 977460c602374ca2ccfae08c5f8d7fea Out = 84809dbc4975dce69507d8958ee4bd3cce3c2e83708d647c51e583a27040d64937da653d1c1969075afb Key = a129f45a05dc7d1af8ab58f5689dfdcf Out = 359d263bb75f61acdb4f266281a865dbf7536f1df266b55ba9533bbe00a8c0dd8c3eb3b3d266d8d8e565 Key = 0dd1abe1602ddac7903731a49596097c Out = 5bc09675a4be5e99f3f1a4447095489754fbac28da6105d1356d7e445e442fae2092bf8c0118470e88f4 Key = b04099a5adbd0108ea12267458f52d86 Out = 5e6cf1c75152ff20eb716f5530f2e190fb51fa38d27fa98c765db6379ed90c0be7e0fa0e1be6b5ff60d1 Key = 3d73f4368ee3bae1d95990f809a74f01 Out = a60dbf22e06b6f040bbefa71965ec8e2e3b18ba6af2c8ae9ba05eada4b7208a4e2ef59d0ecc459b15e15df Key = 430fd1472674ba8aa372a74ef3e94895 Out = cbead645891ecf19f34bd3bb24d5f325e7073ac74e83f3f900c001b8c5c64e89fc49133e8d8118cb46021d Key = 64e6bcd89948d5139a740699fabf2777 Out = d7904473f81f73c5cd967ccc72e3d9a9f490a03c51e1a07d8dcdd4ec393258ecdbab3ddd22c8b971d26afd Key = e7e401e145fa6cd8fd4673437ad10a19 Out = de854e5e66616210dfbce4c3077c7970ff52a97b40cf477b2ddf5a1773d6d8fcec54db3f9d10fa8337d37f Key = 403e73fdd032eec21bc1335f4297090d Out = 8c07273cefb1ec0bffc770c3a33c25ec281c6f8fe2d2a13451cf767f99282106ab0c7db5ea29ebb455289b Key = 003e31056eb6c68c4a112e2d18d0b0a5 Out = 50ddc0b63baaf024cf2530e986af2ef642126744ffc08c08af2b4f12d3cdb089b0ed7c3164e5c080d20301 Key = 54596e319842d5d6563d842d65172018 Out = 35db42ca0b75af854df5d29f6abfc955f724cfd996722d79e8b08b0dd5006c26e001199e113211ec842db0 Key = 3198dd540db7a6beb932f9c1fbc8614d Out = e3c3a12377dca6411d0b79c3a60c4a355add1001999c909bd72696dbed31621ae455bead6faa4066cc321f Key = 3bcb00a12cb64ae349f3144622a582ac Out = c674911cf1af9224af93461ccdd753bb843e575a2cab785e461edf02c1a7bc10eb6936ae9b4e815467878b Key = 0b5173a10bdd6644ed165db4dec31784 Out = f96f5e18c12945f7d1bd8b38b4465e694ba06a36ca4d9e6c271863e95534867dbfa07517c095324b9cf3dc95 Key = df17198597547287aff226ffc85c064d Out = a586333edddc548529020f766878e7e57fec0441cb84e48e41ee97614c40820c417ffd3d0e836e21b96d27df Key = 81f51cd02be7b7ea572fba9584633136 Out = ea6f52132ff37a80413c5fc7aee1677f1b4d137b8335e095024477dfcb6850466b88261b65870472d5b371b0 Key = 363d99e2df8dfeed4fc9ec81b66ac214 Out = 9c2b212a986a45fa40f7394ad6be4b31a6376769ca2a6f096f5884024f408322b6a3a5389067ad18c088896b Key = d7788f0c3ddecf2f610ac8109ef65a9c Out = 8c7056e3093467561244b8cae00d756d8dbec6fde01d48a0d3a4f47bc46cbff16a862e4f1f81429f1ffccdb2 Key = 9e274cd3cce57b44b99b2620d097af50 Out = 2a8bb273d2ae5617703619782f6ab576c2ec6d386da3c4a720c9908b0f78650238d62436c13bb38d1e6249b8 Key = 516b1a83995360f8a62f0891687ca85a Out = 27898fe63c5008bf9d57dba9737770e3e4181eda3af8e694c55df93d32067fb3338a561258ac9eea961ec9a5 Key = fd71bf0416f214bc0bf4a871d61dd91f Out = c369130d3676643bd56dc244fc6994b0ed0b37bd81c0fc0badd60095d1f1955afc0e248a09a5eb933a4de44b Key = 898a19658a32610d55c9f6819d46c296 Out = 9b7acc5242b166615034fa41141f4fa71f16cf2dd5ecf248bfca14d92d7011d8ebad408368814893ccfaaa8d Key = ad56324588fae881fd638d2b70fb3813 Out = 911d952480977b6b8416a8f8763f85dcfde929d189cf5c5531f5d5dbd18fd0cc9543393e9ffdbe6a56606fa026 Key = 2b7a8435a6f597b14fde67de391527ad Out = 5ae20e968816cdb678177f8901e6e8eb8db211584f738f3c9ebde4e27132e7d662557daa5d2ccfc0aab749781c Key = eb3f7002c8352270340b8da8643622e5 Out = 816212c9e6fa0febca5942fdf653235153d0838344fc17888cd23acf26ac1bbd31dd238328c65ebf20c80676dc Key = 57060361f61c2411ed5d33b0effea0bc Out = baea6ce2510624c1dba0722cd75e13766c39361b38e038790e896cd18c65f9a6ff1389a4e7692f3e2b2595a1f3 Key = 0969c08355404ee5502d29aa38081d84 Out = 2bf4b5d1027f64b9715d563ad08bb325c135192e4702189b3a42683bead14e69121038852796fba5eae3426d33 Key = 410936918c62bd845a427e629e24132d Out = f1db1ef26179c77fd8ef5e0430a0f99e7a08f1fea74d6dc0aa8368d14bd447c59b8c230a53593e990c0ae13419 Key = 6f1200a3a454e053e3ec5194a93bc559 Out = 1566e0235dfc5957a97534f291b2a915cf7031f83e6bb02c3a65c938cd977885e52f90944ea23636f05362e78b Key = e606d6c7029aadd46bec4c783e7cc6cb Out = b954406ab367e03cb0994344976ea51afebddfe524c002333794d4f00f6bd51813fd6b6a0ec699f54f40193dce Key = bc17bd58cdcf19fc011ac593a9163551 Out = 4f5998d9efedf5462f3797230e3d46f151967c939957fb67d3a951e97df09a4da39084877f91a39cff8aa57736 Key = 3e2b5630ff2ebbf90058fc38788eb923 Out = 217f5deb97257e75f1e354e3846fff6ab6f5258c37bb0bd57bb42c95d60c8917f04bec5c176236a0b7519ef9e956 Key = 15b2edf8d2c902e9b24d48e68a9448a7 Out = 6677e86c31a50896097c10c0c0ce9c4e15a540355ced98852b444cb89782ea011dec3fce9e5e5352eb86cbfca408 Key = ab3e2f1040673b99dd267d96e071e5c6 Out = 8fd111692efbf272cdbccd6b5f514364b3687ac2146789da75790b95727bb99473a88c2401a8ec0bd2305d70283f Key = 59ab0a9bcbc3b6fac5cee1d2745ab436 Out = 30273a2659b05839ab05edfafb8863f4436b15e4c89bea682c6503444568ed28a24f6192904f6637c2a72a9e90c1 Key = c6cc5dade0528b25b74b658602617c74 Out = a9f2b0164956d26d53e90bbaa282be462b6650455f9787fa76387d13156ebd37b4dc20f58f374bfebcf737c2fcdc Key = 44a8566ac42717aea8a9473503023f8d Out = 72f1a1099984b079ba18fa98d7f4a593c26099b0e54793b2ddfe4b954826ebf491afab27223137cc6537c7a5973d Key = c8cc12fa04d40e0dfaa6b50591a5ae78 Out = 8478875d6de5f4ddcbcf3df58dd983f2da8b23ed2607f5373ca52caf14a3143d7619262c036ecb4465cc59cb5089 Key = 44877a98cb3eb31a01ae70fd4b35e8ab Out = 1351c34616778ffdcc6a0af255cf2b7db0c3b410a3a6bce7b3d2bb331db3dd2fa969af132fc85472bcf8e25cf786 Key = e37d0ac32a309f4333bc42becd0756e3 Out = b507b668dff1f8ea666a5887085288bad9a2909386fde7c65c687b267ae6f126fa0ba8a4c85036a51fc316966657 Key = 70ddc91ec221914de2f9a57c53e74e61 Out = 78ff3e93e8b6042bb1a8a3c505ac5f36ef63732d980771f7b43d2125791737663e46b21301a4cfb4824593694d8724 Key = e3ddb1de8866ebeb71bbfad996c8a3ad Out = 6ba888afc17e2905a49c4a8c5df4a170b94b29b9db2bfe2f6fe1281bf0bffcbcdd2ec28f4737044c077c798b636edc Key = 4f875b9a1e7e85288b30c1bf2582af8b Out = 69cab95d98edb49dca939314134c6b132609a8507e72a23ca8c5a2bf83a0b2a8f9935bd01a3b7f6a6dbe68eb64ce8e Key = a2270126ca15408b76c16bbe05ddfc9d Out = 54acabd72a855d8612558c6eac1f0ec6af4b75197ff87705352f9776ebd3c7ababf7a4c1a0609b042eb3b80fe20962 Key = 5da0f218012746a5ff817d75789be175 Out = c76c49ff59ea9b7e14e3dc7d509b920abde59256af8c3321a4412df68a0db9a87ff0a85a2e77849dc886e256cafd1d Key = 80fdf66cdd3e6e97dfee803aada535ca Out = f1c58f217802b9774c9a5ff5f8ecc240c964cf31b76548e632531a011939143c763e189eda0b419473c99053608099 Key = 2a8164b8bae82f9795283767b077aa29 Out = 0a9b08ae0f53764516021686eb7b0cd64a2e46594ad6ec79b94e406e7eaf2e9b58b4a28632a8fe2c9467c34276a08b Key = 3e9f5225986d9499cd596a8bdcbaddad Out = ce0abfc4f00a1635f12154a8fe81e29a778d30a8036c18286c2d03cfc45ad60da52d393e10ab6a2a16bcc2733f2a4f Key = b0617576a6a7659d910dfead11c28568 Out = d7f3d990423b369bf564666b2aa75559aa477028fec451f490ae1b60ce53a16d1bf6c6c4226d08ef865d1f48162641 Key = 1edd7c7b9301cba03334388251cecfce Out = 10cada8a13a5816c6def15a346038e2c2adefef81756d8762b7d528264aa5e23eecaf9d1bf68fdfdba45ef5382c425f7 Key = 532a1d0d52f1be8fe052bd632f43903a Out = 2ed907318d0ce95cc8b4030a32d2249413ed44776092f9067d20395886d5dbb5f696bd16ffa061a1cf8be4e5d8cae462 Key = 95130b3d096c1cec8f60edb9b0a664ba Out = 947a308351dcae4aa058a87ef1680ff691490fbe2d60c269fed3625b19aa30d183a0aaa1423427eba58e30806b21ea6e Key = a31e2e6aa0ad2ab734c2b8de85b85ca7 Out = d4ea521b6a4092b9adbcaf1153eae6bdd2f8c2934c199a15cfd9a1df46df34dd30bfa1171384ef0d6c2f42d5aa454751 Key = 4cb9e99ea06814b7c7df302289d1f34e Out = 74bb23d894c88d233f92becdc424e96561546563fb965d49df15ccfeb116f8a903eb21cc467a35e7465a514e1952eec3 Key = 61ad23a3ad5aa1d64a20bb887a07e6a5 Out = 1bc79047bf4a5b9a7a2070e7a48189efc81f90423a0d0e72854c7905a3fd5a7223e6620b5ea41edb95a929df86b1b71f Key = 739eba010944ccfad31128df7b54ee1c Out = 20c018a05016143f11cc79d0f999ea904b07d643e896a52db6b7914ac08df0d9e8b75604449cfe32776e467e19d24ee4 Key = 2aa24089b3d1922b3d240ea06944020a Out = f0bf914a56e504d15f148f759a54c8d6354cb5ca9f635138613ca1335bba645bc0bd4c305e97e4934fb6dfb0dd3a3745 Key = 52d44f88cc63e734af47d6cee8c32bbd Out = 518ff0a89282299de7a5118fe154b80952e2656f975b867de884188169ac9fe4ad4a979e70b9bc4bd725fc27bbc95558 Key = 9e5c8259ad19cb4aba8fd23826ea2649 Out = 9224fc7a90f06341f72edb905ed316c15baebae8d5f60e68aef9248cb6cb0d1bd7c9f80fb846d27c70ca8c00dde7708774 Key = f3cd8d15128d33adec5bf90b05b730c9 Out = 912e8ec4da3dbd1423196ca36dd4b499cc3cfcda0e96978f2bae6eb19ae35cd6766d7e5657533749ba6224decc7cdfdbdf Key = a0f01553c5606d9e31727027204653a0 Out = e946c176e5a9591425644f7e34975816f565500513a071084056909bdc5ae2d2f1b3c79f23c5927ab6cccf79537d04aeab Key = 2ab1b4d5258c057f9247091140491fbe Out = 3e41cefc13ad082d038f9a91e8ee24398bc430aba20172d68728b5d3ef81604c98d06b4175329c5f08df097a0a709e02b6 Key = 2b9f4c55780a569cba3a2169068300d9 Out = f8c350220cc4bc20d9a4ddcc31f4aad8951c678c3d6c670cdca7c80a26e54f3f828ff3c4878f99044315e1fbedbf8f21bd Key = a39fa497e7f099428f3d1fa7b50b3915 Out = b21b4a503e4b240f108440009f11a3791e2124108d63c50e87b2d94a4c02a4b8fab32b3d83322013a73cbd621ddfa8ec4a Key = f5deb6a8cd1ce8880a0f4edbc6fd6439 Out = 4afa0b109bba6176ce23706ba242764834c632feece6cca0f41cc2f4e688e8f4f72ec3cda602e7d92f7be26c111ea940f4 Key = cff7ed31a18954dd38325523c99b049b Out = 43cf90b24bd1b6452589831b0492638b31687ad169fe92100a378978fb5b1e9cd8b9dc8521718722cc66be5a1210a18746 Key = 0cc623deedf0826b84a825662b3052ca Out = 00b1e69d231ca81fba94e3b80d584218f9d370b89d5e4025e4765dd5a8d95bcc252535519940f307cce68e64b17a8bc020 Key = cc1bfa23c82eee081a72ac6a5ea84724 Out = a423ee77d0f54528d1d35a5e4a2a07f1de9ee4e115f4a1a8b60e121be49e56072e37404074695ba93cd6fb869b948fcde192 Key = 3205f9c79104e87841e9978be892025b Out = 20b3018fde04e690f88736946754e3b811b151520cec5366a0069e81cb42fccddea3da80f993e544fddf75e5155549363d0a Key = 4d5269e0b62dd0028856bc44f1cc87a7 Out = d9de0dda5670d868f43d21a1fec33aa18ebbb4be92339a9a717b175809d62998d6ca37894819920bdb80031e8f346c4ab6a6 Key = e236b76a9e4bdb149d956a6007a972b9 Out = a42abd5cdaa71e1d96c2a2ea5b5f7a7927c649d152a29ee1f30e39fbbc4b2b2fa24290440c8a2edac40a2c5711a4d50a7b2c Key = 306e72983ef50995481c0c658b76d3d2 Out = 98a670b3c7bb04307f7be0ef3f77d0e1e24ae1cc306944f161e36fe4828aa73c376d63658a3ef5daaa1a895819f064db7b23 Key = 6158096670a10c04e3a52e521dc798e4 Out = eb72a101a5c7fdceff3652890e0ccb87381b18fbb61505c17dc3afe74716f52aa153efa19cc2ec018ffd41a491c33dc61548 Key = ac08f88a5f33eb93dc32d17e8a1e6dcd Out = 90b7b325a87f4caea7c1c7a5660473863f375263f5c0faab3100249bafd3dba1d35a7f38c5033174ffd272af45fcd9ecd7d8 Key = b64997095289e34480a2f059d71f2cc7 Out = cc301cb02e9c64a79868ca6e904e7ae67f27c2d49e8ef7d2271b222d37ad3d92c2b56a32d5fa9bbc18d6e9bf91215d42bd25 Key = f37d5a404c6318f889b546436ef9e56b Out = c471a099c7cb35f49c76f0897037ab33eac234e6ebf775de3f623374d850170c7ae150cdc047a55e1fd69f62045e7a415f46 Key = eb8caabdf1fb1e5d563c49554914ed2a Out = 98c52854eed26cf2a5e926a6a88ac359a11aabde98a84e4684829e414dc130e09c1add7a89e714c576be2024dc9a355a329f1d Key = cd36f08d4a88d87ebd9aaa3551f49ba2 Out = 84362fccb82fac4055af8a66ea6834c99e4007d11f5331db86c5c503220ba9eb12ae07da0356978589c40dec177ecd683d0695 Key = b4091d5252a81722ea04d4bee0056879 Out = 3832eca50ba51812e0a0e1948b0b1cc34554e80b839df0b385989f43c825afaa08be103768389da5665da90d585010081318df Key = acd6b532de1a98bee35e1d7ef189dcbe Out = 99328104fd7c4d7d7aedcd906d2a48329f370153f100b6404d8a276e46a4f70bfc00b17a8b94f0bd66c4367cf55832aa0a20e0 Key = eb8e9df706709c4c52f12bab53d709a4 Out = 779f08913c6528884b58bd8051659d3196cbc0c400190db6ed4eab7398c277a12ba0d3ebe51db30791048a0c44ab60e881b6fb Key = 88c14fe591b86fb3dcf2ad7a4c971e46 Out = 76a74cc2a3abfcfbf0630884a3784e31195733bfe0732b81714268168bd6991d8e0501a8103b92dfb522a4bdd5e56b8a116652 Key = 7449a0c4cc8b37276b979ba91e15a15b Out = ceb4b3d9af9549b8f6072348a3e861d044310d18435d90a975e2fdefdcda739ac6e4d0d4e2397bfbc6d89e8efcbad87b4e8592 Key = 69ed0cdb57db56ff25ff7f03dec78ee3 Out = 383c1dd1f0099f6272f7463435ba3bca811daed49251849608b8b4b2e38c59b5f346098e5e0f14526889f75f3130a4ee0eafcc Key = 2ab5a123feb760d556a7ec6455eaa108 Out = 7ab70e196453188c752c34b51e7fc8a2058d621f0ab1770d64b24f77ae44675f80f8bcd9417dbd8e7fe8b8a05fcc874f8c2002 Key = 9ee981838deb51d1a8cd502019a19d20 Out = 3d2fcf1a09880d8a41e58fdf57c0b66e85fe3e342e809441dab77bf7ce3a86f0ae35736f6c9b29b09203daef2f1756135b64aff0 Key = 586e3866292caa4ef67601ed6f44231f Out = e6b4e65db5d0ba40fb846e2fcdc0255417fe7a01586edc9634a717325bb8505917ea88597c757cae694af1c222c9563752561893 Key = e118cecce029b40f7883805eb19d1c09 Out = 6e8f5de5c92a474a1f96bf89798a11c96637c05e6f1d21940c07783b2d5da11c8f592446c12189eabfc9be2561855fa7c7c1b7fe Key = 8330ee1181d946541b1d84b8d57df8de Out = bb2ec198e2a8c44447e260cd5528cbae06b0bf0962deb2fa02a4639706ef5ff53cc9d0fa215b2c194d7b642f6c72782c08c0fba6 Key = 771612c5244feaf7a9b3216560c878e1 Out = 284e0db05d4f243630a69b4f29b7da6c89eaf896cdf5b49698cbf54c09adc05bad10d9df05201f3e4da6565ff1e686346f35da77 Key = 33bc61a765ebcac926730dafa699eb65 Out = eb298d3d942fefb63acd8a8da14b42a006c03ff12e416dfdac085fe0b1c6489b5a965d7cf0a3452b5e20fc839c17a366187a01c0 Key = aef74c3283751f13127558fae1b7c943 Out = 6a0d2c2ef7e4b1c88ab1e9958e33532c7adee50c5a16cbd7fcacfe3b6e28a788e4115ba3bddc8e0d8fb86fd53dbfca9cc61413fb Key = 11e6751017696ee0b5a5b945f9c1f13a Out = b5e5da039d6d942efe9409a5ad20f959c9def70d35f8c2f20922ff3dc57d38a868ac956e8f77b4feba27a9896f73d96f238bf687 Key = fe587802557dccf5ee9df14024f537be Out = 90fcb9f3f13ac6f4d6c6d95da42c849a2130cf6fc3acb227bf322a1b651aa70aff91610a9d5125608d6b2354e9f52b5d6e9a8ad5 Key = d92b04beb0abb6503e74471c9f3e5dbc Out = fe025ed8f040f9bcb8a45d60c7ddc004b018b003682cec0b999a17f2c49e3a4b889cdc72f6e61f4496951bb3987f4a2f1bbf00b0ee Key = c9591125e3a69494e8e533ec855b264f Out = f492f218e0a4bb4ec8b37e6421e27b72ad6bd5b999c0b4a07ac5573825934b0f37885e15b94d17535eb286ce6d196fbaf2b7ce039d Key = 2928a9df8181bc8727f37761b053a818 Out = b590f3ff4792cd42d8d4e50ddeba7d8cce7040f0f3ddfcd00a2c3f52e1995ac46e34e81402c2cd3829c7af68985c64381815a30b7d Key = 58e04121acf60600c7c28ceacaad2b2f Out = d257ba8a8170fadda06c716034813b613b13030e020d9a2ced096526089e4e47ef36b45fc3e7ec5bb07468743bc566495448a74adb Key = 37631649fa77ff6083b4016b6c19b2fc Out = 898c7afaddb0bd45cca424ce0571f12a12bfa23e4976ce92be4ce3618b476a734bcc5f446c6c00e57797e7474c98dea07d19e3b0c1 Key = 603192dedda6ac6af37a2d2d0f360c9a Out = e97ae19eaba3101ba4c23c1b7086be23dbfec661d3234af1abeed7d4958b21f97b343406509d62a569c64c0a4a5e6c998b1b6369e6 Key = 88acf531a86f834282fad89aaf11fe2f Out = 661ef3fc2658ce7c1f9467bb65140dbc045d6dc3f56c592911601eee58a2f0f5ab255a059547be20b6f6d820380050776ed792a5cf Key = 6619b57763366b715cd915f87c95cf42 Out = ba2ccf45fcbff5c6715c064f7eea2822ee047b6e16b7e17d428fac09aa9bfbf2913e6ece04e011f92e6f9785b19712783c32e45964 Key = 04f55513ed0ecc9db7b508950e383052 Out = 0278ca61b9725fe83f76383a566f3464686568889445170c7e5ac706cadb28f9cab07faa94e1ce19afca0565cc74ba0ad43406b43d Key = 4820af2edf3234ab7e4b41bce975c952 Out = 04f6151477dd2b26d4a03b22a91cbf0d73d44e84110b06419b1887ff6985a0f12b1d16c4ec6b98ed58218d644c20c612ee3efc90c02a Key = 6e3abcf7b130dccdd032f856d969a0b7 Out = b8c3705cea0b4991e766c411e7efaba3e5235b557b608e16e40db3f7784bc6d4aeff9fadd8657735fc055ab0073ac96d4dd0faf11667 Key = 4e9cb54e06c87299e528959ec308cfa2 Out = e4168a0382fbf9b6f2ffbfae8c22e09d0e5f519777d66e1a1b5ec1bc0ef060f5544610a4cfe575f22c9cfa588c78b7538a486de53336 Key = 5d3d5ea9f0175e478358ece9f536f618 Out = 3cf3436a03e559a6c24fc82532842c54c3a237ceaed91e9a31d0ccb4be98d3aaa52622ebadfbb80bb38f3306c2a37ed691aa95fb69e5 Key = 20d0b691087fb99de8168e8c13ea4aef Out = 87b2b3ca23cfc3be97ff63bf061fc0bc8c1806db589893a2c0b4931f534bb124f63c200c329b3a21c3aaa5f1f863e9235c0a3daa1968 Key = 6c98a8eb3ea4451401e0424c10cb7226 Out = fb79a441b789aef108281333f3a1c042fd76c331242ecd21ab5c1411b653c806407e9337b64fdb71eb08fa3ab532464da1fbf95a35f4 Key = 97c686cf0428a4e6b18b808b590ccb79 Out = 75cad1bd60e847d97ebd289ead3a86e8f83bfcc0127935b0ea4937191dff0a1ae33bc5a2f1c47ff605279a047a2dbe57818058aa1807 Key = 34a8000d1a05fc1f0df02fecbaf34c66 Out = 7ea02bdddbc76f12fe9e391b1dbaacf0b31895e5a387ad80f1f0805deba21092a42f305829ae8496f06071d35dc00a6cd85d889a7607 Key = 63de280e3c80faa58a9bdcb0991c8d3f Out = c60fe8362c78798d2bd2236395eb2b1c8f74536d43e39cb01bf3af55dfc9a72ee990e5181bdb64eb896e38544ec30fb1707c6853c372 Key = 6179e5376a8b70988aa1058bd594f0c5 Out = b0a9ebeb21e4fa02261a53ee5cb5da652f8dc0b65483242d411bbd1eb8353ee3e95f923b41e0ebbc7331af039e55ce489c11f0a393095c Key = 403e72f7f584ad63a1f63e3f9c95eec5 Out = 00da8f7e131e840230c20d1b34e97222558865871cb6c2a9b88a771c004f8376139b4bab6286b59ae4f596996f1a9ac117dea7aee7be20 Key = f3ed6fc79366371bd817e50966a1eb4a Out = d8670e7ebc750f08caf9a3638e6ebbba8033f54491c5b9200853e92a24859cb62c0f2587243dfe9d464dc474e81af75903dcdbea086467 Key = 12a4c353873289f0263814b8d747c25e Out = da55682d3d15dc1f0f7b59d0db17137f9fe12ec8c1c028c36fedbee65209d09eb917367014c2c12e2c38c5e5e02909efd1222754cab11f Key = 19ba3defda0101174a42d61222987882 Out = c7e729c35b89e8a5579b4d4d5975f3d788312408c3aba302aa465720561fdc474bfc52de195ef634fadcebe86e1c3431998a48e3c53d51 Key = 18e2f943e8defc9137877ed452c652e0 Out = d30799769687b7a66f366d94bb8bae313cb1d085de5a5d18af08b924335ebd77801c77cc23409a82296285a583dbfcbaebec967bf70771 Key = fe7854d34e6730899599c879dcc28ea0 Out = ea9215b6feda2c2512acec2ab1071eb0966b6f5c4743f0092f9eca3eace984f07aa0703426657f6ff2967eb3c319585a5d42c602d61e56 Key = 6d617e2b46fc78200337b4deb1b5deb3 Out = 25dc42f28c006785960cdc8522bb53b1dae2cd82b6f188fce381d2c9b097ce3e6b49754eda3c6d509064fa2ca5d8d41532f5b1b10653ba Key = 67c59b3a267cd79ef45f88c31f558181 Out = af0e7c88212f18f3c2ca258c5e3e96d63e6b092c1f7c9df2039379a6dd70a3f44ef15392d62b3db4840d0ba5a17a441749893bc41a4fe2 Key = c2419e6ff373ffa583667a77882aef12 Out = e3697583c3390fb28e725071940e7f0f932aff7b1fa8956ca1899a020d68b5147750ef96fe91fd9d8d31bf7ab360ff54677391f3ba7f9113 Key = bde286cd11ee8897855b245cadc1a310 Out = e69d0b9bf96d8044fe7e785dc66417d670e917733eaa30ed1a7480462214d525dd09ec176f4648b6b60b090c9105c02bee348638487ad89f Key = 433e284bf3b472aa5e1c83ddd1db3c11 Out = a4841fac811daf72bc0bb9f70423de88bfb9e960734605c67aa900caec63380da1f3f180b8ae3667e6e58e051b11ce042e7c2d8e610d225c Key = 001d553375cc63f8a21557f45f0359c4 Out = 0cb2bc8eec97a408b76455ab66d14ca9bdc449fdad43b7637d3dbbad6a7ab46ed6b03c21bf944dab3132ea42db1341f1c43d08189cbfc1a9 Key = be28e6ec885eced720ce1a64695c69c1 Out = e26a6ce6bd2268c1baedf74980a3621b970ba2631d2b2e059470c78fbb1a3faf744b60e1dfb0e471b6943b12bfa6c7362accbfa6427c9b7a Key = ed30b1037afd33042243e1b51b743736 Out = 066e64a28b952e883881ad789e99c55f25289e42bd7b7be78ddca92fcf7b5a07bd299ac18fff677f5e6187a192bd4ebe1c358a88f67e2a9e Key = ad001feeaddd35e654740ad961db6939 Out = 91b7e9114efae35d5e2f6cb3d15de05b177984ead307d3aa4f9b2352c15b16c5e5ab174206e30a6888de4f4e8cc9fcb9340ba025a59012c3 Key = c205cc33772eb29a3943a572dd1243b2 Out = af148884c6004ba63ab6aff42ac9fd0de552a1620bd9279aed5f03d02054837954b1262744d3f8cab0b23fdc3a478cdffa72b6e8c774f2e8 Key = 25ad5706a2c0c12189a77ddebf01b984 Out = 70133db4c8ff3655393b0537cb8d414ce9c59f114e338cdeb708d264b2572f900492f5e96e3ee79a0b2bea422ef47e2e6afa7ca093e2754a Key = e919edba255c8124bc5f63f90569ce5e Out = 37e03ff6bfab04ef64ba89a84d286de96d100a1820068f0ed7d7347513387370f5ac53afe559fac72d619965d6c8300d718c5d648c1c2d8237 Key = 1fb5c1278524d02645ef90c0219ff571 Out = febca33e3157ec869e0f138a2e4baa78f122ecb2e1a929145c9ac9a35e5b8378cc877f87ea05426efebad962313bdc6018b5f6a9ccfa1d4960 Key = ee904c5fc8563ffad7c1714593fabcc2 Out = 2907281a91dc11e2d10193576f9104932dfd39ed7373ed31b3118c0fa38211a6dfe14a3c92a15933df16f234f77dace6f1d64c9220281b6e76 Key = fc9a7572c1332efe3aaf464fb72c3496 Out = 6a5503ff8a62aed2b42a0fa239f49a1521213743f09f3517219387e34afb17127e55abcb55b8c43503b7ab2ee241fc212fd905ae501d184d67 Key = 13006b80747199b6d297ab30920e6101 Out = 1aac8461d3ecf331c1d07c711d01186231766432cab581ad80d4c3638bb3804997dc7ebcf76f0e1c07313fb818fcaf1306dc2b36c6041c259f Key = dec8e6aaf67d1673d2817e188b9b9fa6 Out = 47afacdaf10eeeedc4661eb515b224341cae2c7c1fbb2ca5f57e8623fb2914873080ed527245552b03ca6037a17b1f2d52b074c88d4fc0bbd3 Key = c03cfcd3f6c520687cab47a6e5463bc4 Out = 6010e064b83f6185e2f281fda36cf39c8c18235e6b5d26eb607f378d78c24a513ab3e1c4ce92f10fbd91c77deb2ec4454a580e5f834c56136e Key = 9dd17e4e4658a4ea88903f8b8a164ad3 Out = 8e46b75fdf1e26b78a3510cffd8f106f93f850780edf54f3e547286a3590cdb6012e52f3283debde7ef51cd9a8fad39d4d61ae478d91e3ab29 Key = 899b87cb9951f227eb62e70d262b6062 Out = 3aa0761b660b12bf3ecd256dfdf0a10c7a509b8963eaf26390e149409560aeac3ebb403b0fe3bf27b9cd9203f1d192b22abcfa4aadd0d6ca97 Key = 493bab78e97bbefb6633534d84de826f Out = a56eaaa5f36d027acd90417a7fddd434b184eb3e9c2c9d5db66b7ff4905c1055586771905839dd5c9b03dabd93174c47580c12405d64160a2643 Key = a2d2e8e98d5cabb80e47de88a89daedc Out = 964d3613fc7238eef4e92630aef3608401d02a4986bc25f0a02e267b31c7c11a52e5ed13ccc08a72b7ae18653edb17c560bbfab45819ac13ae82 Key = b840c45302ce0ed0b76e3399fdfda719 Out = 3a14c7bc921e0a5dcf909644bd634411427b4bcd98a2112cf55240158d84371502d37eda89d54b7b7113be9be27244517e0d42537583837f7b1e Key = eeec062c4c61304c5161460c471a8741 Out = 9cdb232776fa641981e1960d0a68989ec5aaa3d13182c76eff525ea9a8daf5a61efb2ad48a81359ecf220fa1fcf38ff9b833b97f9cb82f57b533 Key = 882f6572b368cf35a51f405feb41406d Out = a1da06c472f6e22ad708be75b3a747fc5d77f2614f6e1114c370c4a7b5ee1ead2549407d4722f3314b2396e244ca51d965aef8586a905c4bcc9c Key = 450404773955c74e99c9f47367e642cf Out = 1391de0d9ef9bdcdfeb5d1c536b2185dc87b081bda505f62950cd6b5393a12fbf9432f327f57d328bed43e64f989d74d2260fde6c10740328aba Key = f0523b3d34cc38484e0fff8814654134 Out = be81a881ea47237ff4db80d27fb27c1bc68ae0d9eea08fad7e46f9b18b95b2ad340da78ee552aaf026d47aa78e7609914ae19035fdb5e007d2e2 Key = 13dba9402a4b7ba4acfc056a6dbeec74 Out = 9db345b3063daeed36a2c9569aa23d6677bdc74621d4a14677fdc972a687faf0e908ae5ef6e65b7416caa8ee6e96376aa29245591b8bb35ded22 Key = 59fa3d7091edd1ae2874949a0b18ff95 Out = 7b27fd12ce28aadd5fe136cd26fadb9e26b0ec0858c5599bd599a17ba36f032d5fb55b50effa08fd423b9e28e780c16066bc9b806a7f646db20e Key = 754f3c79669c352cb3c6c49573d9d5c2 Out = 4d1dfb1deca3d3e99f071144a08edcfdec5cacf2f565a88c76d6f299e4ac94dd180c4c4610449b58d8d4b15dd68a35a230b5826f3257f833ee5b9b Key = aae47a178fef6862b4b1d255886a4754 Out = bd9a3ecfe93587968f31894b620685ed7f045e5748d2521c4ad73cf0b3535f15a8f999bd86387c43e45524fc059d36a9e690d4c711fc78a4b41724 Key = 267b0dd474660ed1c5ddaa372351df1e Out = 8d9a7c6d19c1410de4d5f6b3f0925a9ebb24c404493b9c5d5350115cb67005f98535bad74910dcd340bf9f43c88535b12fb7cd6c58e1e79f02d999 Key = 9a55335bca338bbda9cf4eede8e4da25 Out = 157ab6ebd5fcb1b438da1d1f15d8344697201e6c13a6d167ab18232cf3f8d0a3429b53a91ef43846e49979ac36188ea802ff65b328385757627b52 Key = dba0b4fb92bed278d4050fcfecab9802 Out = b5ac829af4318dae451f033870b650499b2d36693ea52ecdf47278ae18eca09e392bbd457a4a65b0f7ba14de54dc69f2cd25ba4dc6655c98beabe8 Key = 3360adba68ce7a50f1944cad9a968484 Out = f17b110f4a9d9dd0f6b3e506550210e9e2e8e9de1a20cfdd728282f974f23b67787b4e951a8c223068d9db62a65f8dc92cd6c837fd2bd0783c1ca7 Key = 09bbe68c5632a52835bec9a932876913 Out = 1683c8f279bc03e1830a21d4c44ff8a005ff663a5a7d4fd4a636b37722ff5f772dcb8b4ec7ba3e3405d6f558c5b5983976b4b7dc273b0f174ab75b Key = 084fc4394af7c4956946171a9d9f6466 Out = 2ef0e907affc45a8fafdbaeb0d6b7c5b79c3e9a2fda337fbcd1a25a77553cd18159d94e19bf34a88a2b6869d58fbe38884b709dbadb31e62cd0d1d Key = 106ed29ffb8e162a9c29045c4993b4c3 Out = 6e9fdb64260c1571388d3fb69d16bad057e6596784b4af27aa095d1c9fe810de61f39b259d5412ce02f22e64d6ded95f17805766681fcfa1c552d1 Key = 16fd337fbfc8c2475193185c0db111bb Out = 395e0c2e3a799317ab02fc19980dea3a30e4cdb67fbe46be7fe6321ea2278c6aaf182f8d932811d5332da0b8db22bb76df5443020aaad83acbb0aa41 Key = 6b5ed6aae8b2b7aa3df27829bfb1ab7d Out = a112f5038d23bbb3e52135cdd8b910624c9fc53bcef2ef38df981412fd34d136cfe164904a741084b6af9073790a9b5371e75501cbb70bedf06c083c Key = 89cad8eedea2096e624caed75cfff040 Out = 73a780a5742e564715d03a06f9a0e072c83bbec01413108f071c8376000bf47bc6065938c051ab2e1cff1d62f5d05e8563e965632292983f25e4e2ee Key = 8213056de909def07c41a497d96f87e6 Out = 966714b5576a4f01ca1e1ce314b0712cd3ca0d36bb68ef0b21fbb96fd164a27173900985a476bcb3026e2bc62705e29e74d671113feea7d701611579 Key = 68727636ff38c0ba8999dde3cbd95039 Out = 9b8eb393ffdb201881f2eb7b427dfcd6ba104fc64adcd44c3417c79299d37c0b9431c48e35a6c42ce3ecc8bf5780546e412c5dbf8b8a697e6dc6a8f8 Key = df476aa202f8486eab12f8aa592d7ae2 Out = 1c2552a29df6a4a6b4925de9d8fc11a0ddb7fb87c6541443966cda1452f1166b6d57925159a6d9c6ad82a8aba2ab6d3540851f188398f322c8110f42 Key = 3c2aa1e2dcac3712bcfcadbae94b871f Out = aa8997123ca64c7acc426804b9fe39d31cfa66c1f6c1fa75676edef8e652a4aeada79d6d5423c4696f82f5cdc309ce591b2ec831998d42e0129c31ab Key = 14d7bcf2511f204ee89d2218591d6a2a Out = 195aeddf9a049e8ff2f400ddbecc7e58b81d90411444a0d19539114f48f16130f2521302fd00da26acc42be9521db6a23b824db00bd3bec5b3e4b73e Key = 65b1854cdd6744ae1eb66561fd6a9436 Out = 1c0666fc78895eb5cca43b4e807e6eb8fcf8c090645a409e4d157a587a9355c9955e909e8bd223902a87935f6dc0e3fbb8f3eff77640f6d50757e303 Key = 6cf84f069bdb92bc3fdffa66d98cbfef Out = bb89a5377934c323efc5a0c9216cf49ade493a8519d0d92bba9d92bb20b2c85ad1856fbf959c38a339bf6e14db18fd2888cbe63decedee2377621a979c Key = 7570184b5f8698c15bc29cce2ba62da4 Out = e307fdcb26a5688586eced3c4b96e2729a2efcf21cccb4f7536aff595a181d15b9ee589ca4e11d2dcad2415b7517f6313c82e57978a12c9598b8bfa109 Key = 8b4e035d940c79210d8c7adfcf91c821 Out = 2920751e9e3861ff556ddbd24a9cb428caa9cec21cc26fab46d245863cef79da79f707cf1ac451e95f71bb4e3319201aed2ba1c45cd821367095c9c1e8 Key = d9ca7043ea404b33ceb5cc52cfd53ccf Out = 6c598c2a3a8fa42303a237c4f4d44fe11eee354f4fca451235e3a7c435014cf9afea02c8116001cefb830226c6a7ebb6d63fab4c600a001942034ca77d Key = 44c9323bbd117a434fa51f6ebcce976f Out = 6da86339a8f519f19beb2edb2f49f1b86f93bd543a055b2df5960cfbcac0373735faadfdd7ca825624c1fe61809b08de6a2dd034882d56dc22d80afbf5 Key = 2937174a6a4d8e0038565e0ddf3b622e Out = 05a55ecef716281d434282ea5029a548c62681affeca3db2ca085bfb44884dc9c3f12589387838d9b25bf5b168cf89ed00d9cb2c4b244cb7ebc03376a9 Key = 1e68876682b092daaaf3dff595bf0fe3 Out = e83f0db1bae5dc6fdac59ceeb06d08195f82a77ff2f81167e482a43604f0dc24442819a0f41735cf822ff50898a2554532dd7638c26f8b17a7cc331a9b Key = 70ef2bbde7b4a0567546785fe59009a7 Out = c7a5835e30c14573fa2530deda44d9a23de7c7b0cf6ff4ca464d2406f04cd7b26e250a53e0073d74a469394b5898d8e565e28e217a8f375a880136f29f Key = 8e5b32e2669392f4df60c3d32bfbb209 Out = 35ed88ab99bdc19ca6afd1f6571f54b9c0f0988012ad3a2897bf9645d646578210de256fd02006f50d78f9c8a30a0bab412fd13d38492c07297f01d813 Key = 4bcb511e4deac4999fec18cac3971233 Out = e332a0b2deec78ef0d2e911efa0df41ed4d9bf44df64735ed090a0e0cad5d907493c434a8a7742a4f01e3156c460ebbe49e9ce1a4518dc53dcf4703154c5 Key = 8edda909d228c01fc010357cb54c732f Out = b52b0d291c060d1becd69ff1165e00056d4eb4dd165d56180b65fb1135b2e8af7e77126ecd0e99885c3ef5c8b619fc8f924feb645055b4411c1f79afdcb1 Key = 6e7a7a8106a0842edeb5b0ad9822ce61 Out = 49a428bbc56e828ebe8a1f18b05b804a84053ac9ea70ed650e882e57555dd48b5b377f4484b4de9155830dfacd9ef51e131bcc6266aed7852169e231373e Key = 2454964de16bad37d6b1a91216c053d5 Out = 0548e2e900e88c700bd19eb2d21c24117cc85ff404a96a3683d2b01e293933e683fb8a3cac18302bf5c2fde7177965fe81f56ca790fdcda807bb2883e4a4 Key = 432dbae5e496e18fc783925048f59e45 Out = 513c1928a79340de90759c3b3e185c19ff7287e019c76c23bbb1e4fe532bf716c68a823ff9d54f83762132980d8e603be68c25ee738ee9c82e5df1baed0c Key = e63b13334669de132c6a0175e2eebdaa Out = 8b9eea8a21efdf5df278a108119e2c08b5d46cbff8d9da5bd736c298b29817a2f9476d61207831d7dae22536085929548b9fc1c9c934dd2aa953d8d468d9 Key = 1a6424b778f6ada35c923ffc6b5a460a Out = 734850581ad0a8dec1e02acff288b53e2f406c6164c2642774d2b019a6763c81506f1d7f9a8d211f3aa3fac10642918553f56d2170462019782a4eb1d4f2 Key = 7dd6c4bd79802a9ce17211f00eb52e26 Out = 1c87dac73688d4ca43164c921b210f4fdfb3cb317abdd602e430b799b99af9f1d71468cd69ffac3c287132cf87dcb5e09248c7d6d511b5f6bc837743ca94 Key = 6cc4129b570b607e7e6045693419c80f Out = 13be30abed76d1df524f7f21b5e6c891b1c1ba0a528430d45094c72f5a984684df67476b0ab99d99cdff823ee165e7f86d4a33df5d7a81ad5033e202b83d Key = 132adb15f07596590ea2b832047c37d2 Out = 7976b6775e078ba641011bc19ab6e4bb9e5bb517eebd8a60cf86146ed5da631c386660f7e44f0d9f5367b873c593dfb63157af640cc2de2b81669b179b1cf0 Key = 3948d633764cda309eb3483daf13aaca Out = a07ef491c0695671cdb1f9cc3213a890fc5be5451ceea42481488b691de3e4d114a3a701a19e57f3c570100a4988ae266083183f859100e3d38e30b78e124f Key = 1a4348eb59ba8b6e2f615de259900a71 Out = 723882ebffcc92da4163f8757d35b5e2f06c5f3649b8fb9a1391a1475a807913a568a07d4e502aee3e010469d680233b94341159e24fd9949acf6f16e1c138 Key = 74f67bc0a547214200d1f1c9ca986f14 Out = 2161c68a91c2392b35473bc0a56b016c27e57c4a9c8f536254aac0ccf798abaa6451d878bb5269ff0a310eb2739e0b84986d9b060480779da04be73ae311b9 Key = 7f173d6e9eb3b55ffd45386b5fcdd62c Out = 589ca3e4b85aa95ee4d143aa1d33289d6f58e99f94ccd87e4e977a7405b682df0d575b8da49247a4e00d413e98cfef6c627aed24de1acbce8f43b3f05f9314 Key = dae1795e946fda53ad7de6cbae7f0f03 Out = a2f54354cf50d90f8cb207056041d2574d5bdd85c6535e727ba2832f14c5f1cccc80d4f17878ca613c4725c2238c8281c3f45cbf5688a80fdc743850ca7a64 Key = a29eaa776fdf391bd4fd346c5e289cb3 Out = f663d052b01108125781e0229bd90fa22e70504553f32ffbdd49f5348f77ed51564b47bc5934fcaa8cfd894e6f798923f4be380f3f18134eb465d6c2e657bb Key = ad514bd737bd2d037ec4be9e03781a67 Out = 7a1b28be3910b9b0e8f280a31fcfdffc95aa8dc0a103ee862247448da8adc178303930f516fea613c493789cf4ab4ed8555348b71d89d9a161005c6990acca Key = 38e19a4206f3315b5d457bfd3aab8d38 Out = 3bbb52d8657fb84f386f5d152ce4f5e91972c431f7505c9c791fb294c752a32903c038f3d596f60010a189b23381e3afccc318033662f654257d7a07086f1d Key = 5724ecf8da9109b898a428939e08db24 Out = 74ec9ae4e1cb431039d4d1bba001cb22b88c1319653fcb17a2fac28b6a27b5dfbbfa8869e8d349cf3d9cc03c05a73998a10f0bb83e5a54b55254ccbc5e21566d Key = c0e048e6f9a9cfef46cc86a3d943d4e3 Out = d4d3bdc941ef3e67407cb9e9cfe3fc9095e21630eec01e5261898c69cd2e6bd51624f77cffc223a13abcfc92f3968d67c327e8f23a0dc3428cb71ce51e9ca5ff Key = c0d2cdb425527b63321e824db31f3748 Out = 495fddb0da4152ecb8aaa136698caf237b90e0fcc6c7de18a6fccfa888b0d9d69ba2723d8c9b6957b703847e83c0bd1dd70e5433561bf36605a4deadc29cd385 Key = 5620447d55f58aa14c29e1fd5206c336 Out = fc22b1f5de6b264701d85b576ff69db3dcc938cb97c19d142db48d2b2d9c8cb1b7ac613e2e72e316d55c467b77a371c36071e92acd277125501796e1e15264ee Key = 5ca8ccb4b37dfd52863f431aa1dde409 Out = 3cf86d9495d75beeac1b8a7a5749437f6c1c955b9b4c82b1bdbfeedadb9c37e8869b2a3f71fa26cbe6f7b6d38be51e739534a74c0254e91824a59d53249cceb4 Key = 97755ae0a09a6a6a0d6fd6a8116dff02 Out = 8fda51bfe61c738597fbcc96a6e61c84a16e36cfae52d0c15c805e0599c111a966842ba825aff51414f13bb458de58ea8a1ffea40ef2ac9aceb18f2e0dc7c83f Key = 0b4b92191d3c8cff2d02980bc15f78bf Out = 3fccf2d4c530db8f92d4d8094a9539a705b86b7d04bf06d765e31883058b51cccbaa1e9ca5c7adffc2c83df67cb5ec779012757a3511613fcabe716305f18949 Key = af477827c1b099ee305bf7fdcf57b102 Out = a7c6067b5931e71e9b1275e02432480e1ade37e37fd3be7d87fca9468f9b84af0e51e3af36105c821c57a8bf30fcd179842adbc06b7cba43902e2a5b2d0b60ef Key = 0fd64c77822d78a61d266f569279a182 Out = c117a0b561948050582d0e4cf4b01bb85f5249b1b42c529cdc4fd83643a3dffe7cc2af27bc0461fac043f5854c7fa08ac27babc745c32fdca0fc7ec7e8cbaa8f Key = a5c61c1e7aebf9db7f6920ccc39cc55e Out = d4aab320e2231efab9f9f9e464f5a6ceecbf37a1c8dfa4d8e96429f5b5b1dfabdc3ee4e4bfbf32e469bea725414fb2e17014973763e7884e91ba3b7608d7f00a0c Key = 221710ca1c521ea4c3fe7aaf826691b9 Out = 3a72201d1c6173eb13d15c7b1840c8e3ce8765a96d52a14e2587022b2bd436c7bd7bf8f9c8f77d726d09d832e0177b2f384dc75659e7054cf31035952fe0048ca4 Key = 8988262b74bde31e5814142b9483a51c Out = 4c1ff9637e0b6f699285338fc412232b54049f33f0cf559fcb3c4218e504f0f985e7c6631a307bb267fbf4821b42d16c13b0b764aba4fae255695350c4735a6a49 Key = f0d0c516c8360b1c6c5f8ddf8a14800f Out = 4c1c47a0287d5cf2221a159abfd2bf7d7765b65b0b9e1cdfba262470f764c0a32141a50cc2035827bb7786ce9e7a85cae97535f895f548a09e993bfaf82dc4b8b2 Key = 145b2653d32acb67c6027617ec3047c9 Out = 4e4154b103f5da35ad73cb9596b6a322470060011a18d92cbb05db67fb8bd45e7f918dba4483538386b141bbeaab7d59bdccd339a4b33a28215bf26649ca12ce92 Key = f9ad1bde60a8d7e7cb16c1cf6b713df1 Out = 6929bbecb69eb1f22dace08e4643f607e65d6282390c99cfb2c40de12e9c8440f3adc72f6a06f44cc88e68097e2eec4e66a3a68212ce87b4e18fd06d6e8bca5c90 Key = 4af6fac60e9f5cc9ca5c98feae688924 Out = cc58d57ce02eacab869a3991c347a105949a72373f21da93600ec5a5b9006408565d40acd5d1c14d0d261b4c61891a572a296dd9b5578d3c9a55a3f09162f043f7 Key = 7216a825029da1c9a9328d499b3ff98f Out = c34bd040adc38f1cde974f616eab153eca92c8409ed892881a0197d97c8c99830ec8934acab5f81b73f8c130f37b96af7cd3c8857daff83b903d272880c1296418 Key = c6fca8eac307c0346faa236bea158d6b Out = 65fed8fbc7748a007c58a1836ad023ec768196d61ddbf464a2669ae2a5096407a6cbf79206c1f48f7dc0253e5573dfbf5cac1ad2a3a30b04c95cbc7dcf835f5a23 Key = 9c655cf55f6f81f7424d98dd4f2c2add Out = 649e69f3ee5f62728aa95fe9ba66d47a1e5caf09e98f2c012d8a710fce4ea83c783bad3437b50663011d017bceb20c7c626574e2b7bc57e4825f307e5b7bcb108b5f Key = e81158ebede8655732bb44f1ffc419de Out = 6ec974566a8d02e8eeb87b8b7d334589730e51a4e645b463bb95df06131f696507a4c7a2ccc339823597d9fa3ac920f7a1eda0018121cbbfb8b06b5aa66da090f184 Key = 69c943b5aa1856b540d9cf596b57996e Out = c12ba83a07fbe16502b3eb980fb48bb30cfd18fe8abb937c332504f4922088275e3958e1eda90b12d5cd26a916f7893ea1b52d11a2d827de942b898c6ecd765511ae Key = cca9f848cd5233308ee63532ac5da3b2 Out = b669067016fc393493fbc0b79748568f903655c0387b6130db8a6ede11f76f2a9c89bfa1365fa8bf6b69ea0da695f3615dd358436fe81c89720fec5ffa89377a2467 Key = 0a5465cf6cf76174f63555cb9b81fd6d Out = 3617ff610caf33b40672e3e10b0ad2e67036eef170559d1aa74bae35949760dbddacfe60ed1c6eaffd79b7f55d3ca6aaf2551b8e47551134393fc89536284cbeabf2 Key = b3ddc063481e3d6bf604f92c0df2d9cd Out = c82868563cac7fcf0bde8c1fc84ac857e81f227ad409d549b3a551db4f3e167a25c0c5f979950da172d3996c7773573f87f419b5ba047fd37b72b2e6f932ed14a79f Key = 2233052ec4ffc6bceb5a835bceb0caef Out = 0d74d2cb6cb0a7d56f1ca4cfd417e0abaec6ac3bf9d181a65e8714dd9ccf5ffff8f2c1fc8a9f898e7bb458f6fc092222f9c25d8af738a23fd7a49706840b12cf306b Key = ff389650d4a5c98701e10541c30b7c3e Out = 6821e1cf2ec37856875f012617e9a38ced50aadc9833bd101f313d277ee17357710ba4f0d0689e3c073fc8a14c70e77ebd43e9c09b923224f9dd7d4815e752810b61 Key = 1167f21de69b7d4456e034d3d2313147 Out = 62d45017c59738f6ee0974fd5fd14545731c2a7ba11db2c75fd7d6a45e5857bb0b2963e05793cf382ab9797b372925a379ed0d004f3cce006621e754475a5de42a03 Key = 8fd6cf674624c812bf8679b8e6075351 Out = 028bf696fc8fe6aed65af30105f9abc050a4122f5221639565462becc6d2175db8746b6cb0685d6e2fabfd241c5c4d281df189d7e57c18e6f58b18b630d69a66ae8f55 Key = 2e5d50e50b55f4936e28cc5a734d0301 Out = 8844598631fc713e0a28c7f13ff2b3487536224b04f3852d24403907ddb93e137ec86aa231a2b8ac47545a36fbd134b2ef2cae9043de49de4ef0e3f5db4aff266de32c Key = e9cabadf84852510dfeebb11c8a968b8 Out = d7d3e3d37ce458f9946250f230ab9aaf7320878621b69d669a545845ec74a5336c69698757e6b71121aa99d7170d9e3e53e521a6617f6864dd4b1dfd5d2917f2429f9d Key = 2f16abfff5b155d2506724d43a160985 Out = 64949a44df3fffaaec9ea80bc64bcec82671bc648ca354f4e6dbb71de6a6c9a09d39acfbf8c8b76d918cd26f6c0cb541a5b7773156c90b324da460b7687cf47df303b1 Key = d80f1434b53f6db3e00c5e1755106ddc Out = c1a2343dc6d702e12c9aa094df7e8cdad7391a8bd2da2f941b92e592d9ce5fb3f858b9a86535f6ccbf3cfc7dfa558982669d2e3af3b2cd65d98a39744b48ad7e33db35 Key = dc97e13f6857bca492075cef6c86f80c Out = 025db653363a926ee3da59cc8aba70332fa7e0ccb3d5d5d0f52b7e5b6acadd3d5df1b8751cc0eeec2587a7aa3a5e5c4da5ca85bdce8d1176ff0c7066cc3bb37db9019f Key = 5260549334240e95e146697b85970732 Out = 87b4c60f8eea9021ef28c83338282c9c7ca1d36a920894751cc0c6fc53ca5de5d604c18ac44ebd42415a40cb376d70b1415d69af272a8432e7a429b4b0538f388df893 Key = 69573bfa284efb046f8d445c10ee915e Out = 80de5c22ae25ccb9afebe78c23e53c185201dbcbf8171ddba9c9a4de9b841be850f753fb69c08731099dbd4ee88e46893cc236cad4800ac598b5a602a742e5353b7a90 Key = bd9edbf5e45385dfb47988b3d966f31b Out = 9f63fc28f0875a7d9ea07d0abf88422ff572a386ee8abd073adf55b05ed5e8af0d78d17f7c63c0457eea90fb666afce7e959b513800599655d9295c48543df08c258c0 Key = e6ab22da057d5c5c360c8b7632795fea Out = f365e1c309fa4dba6a356540cc8bc2092da76b61c0466c5c131c93efbaef84b3d2fee287c975929d227992e751984d67365553d83c8cc87619eea0e39ae86fb8ee54409f Key = 5d1e7cf19591197a1dd10bccee4a204f Out = ab06fbc60179e919d2c978227c25914f3d751d5d27a4f5d60afd0afef9151ab3531cb39bd4b4a0f720e38b1565ac6a6de51524a0f04b0c4377f00c5fcb9bac73297c4e36 Key = 50b3b88928085fdf7f309b52f8953e38 Out = 94c3e2bb8b6d3fa378feb46e28c7dfe9a18a94371d60b313970070b45780513792fc2748af8d5ab8ec0f1a88f2998a502b167ca795f611d7e49c297e0202d46114b93e60 Key = 2ccab02be430118d6dc505e028b60e6c Out = 00f4f14abc14fcae4c9d630f2eba6f174ace360912f0dd97e9254d790f5784ff6b5f5872ad95cdf5e75f9915d871f26298a4b8c41cb0dc4889a2926043934a302d9563a8 Key = e82f476933f82c369c8c43b9fdeed32d Out = 7c702074e1b19e31985bfcf966c1f7c65b4fb920ae0b1c50b577c4afb26c5777f710bbb947f326c0337744f20f9e0079c697204f4cf8b6e5a87029d853f0dfdbe33d6574 Key = 7e5be265445f183e8967bf4e8a0a2282 Out = 18090e3478500089d46b25e082a3ef1ab952b8f179f43b635bc1a5527547a98d840292f953933c878f5d52ba7888962eb493edd1469d6b4bb49748d2d34a7a60f21e2c62 Key = 511af474bdb4c85547d47373c8fb4082 Out = 50397c1f6d1244b8a3741c1d82dfbe6f9b4357cbd8f3c2046c2ee95a0ade85cc4650873b08271ac33c539ad4333e2a328da5ef2348e6716b34451450579eb06a514e7092 Key = bc68ea4257af11182b6a79574bb2e680 Out = afb45ae47afd8fd788403ffc9ba5c0e181c4e26d576e0619b73108be3ff3586ceda06ca0644993d7e6bcc377ffc606c6c9c9957a8d490bad879f1154be414605130c66f4 Key = 8426213bba0d11b997aadbbea378d7cf Out = a5d05d79ccc47dda6f4513b318853ff5083a7f38c020c99a74243378b3f58d7f63959740fe233147a181bd01b301c0deaa62bbd2c3a67752c6fcf571ee5c6be642fbe06a Key = 2418c51840d4a18c0659ca2d11aac3bd Out = ead10062875ca8ccae84fca71c1115c9a22db6c6104c98c7acacc514c70205f9a724f8b0e70dd41da0e62648bd82143f9b44bfcf35b9016e30a65b2d3623739520f772d58f Key = b9494c5d50b8a88b3dc834f60c657914 Out = abbdf0354bd4ff1c6f7382bf7304845156a99a8cceeeb43f68bf053de5778e25b3ef9d5aa1bec8f7630ddab3a0a60cc6e804d4d9c2c8b19bdfead2afb34c4f36b5c991f197 Key = fdb178ade3731c45d4b74c02edb8a32b Out = 7aa8d40a76d995344b5f45300026e7aff6ee8eec7c9268b47c607243e1323fcf80d4506a9e3d03c5e1fb58d77a272b49389f0fff3db415016e3571070ba1e47d4f18eaf361 Key = 0b7bdd5600f2c20de56155f0a81389b6 Out = 5ef7e7f88b1b2bda0a3a85500e42351d1aee766d5b88e0422a4ea02dbc32df1a993606635db263a72fedc0823e9d42781809464365c972a1981211eb69bfb1ca76279a2018 Key = 0b0046b1a74f2cc849fbb4d096244b0d Out = 299e4c120dee32166f28068609435408bdae7745d69820e1a29505f258dab478095227789028f163e08c0b1e3ef87b9c9d253a87a827dd899827e109da10988ca7eda811cb Key = 5de59710a7d3a9848ba30458a3d72ccb Out = c8fb73f7b7cb40156a0f7197134e2c06e8921f12fb04fe62bc8b7a8764666423ef82a312506428661dc2b6975a49cc7ae0d1a0a6ea0eb4fa0eb94b609ae0a8bf36c50427b4 Key = c8517c56ab3179c75f4013e57fb670cf Out = 0324b9fc6e229cb07f1c4d2dff72a1b861a170a228254923eaf7e9b738a790b7f850845605af55d25fe27e12b635a519bcce7e19b2948cfc465901972e6ee6ed203b056b92 Key = 28fe38432ad07e84701d764097e3b7ff Out = ea382f070e2e7b261530912785f6653ab6063d0fc4ea1b886493b81e9d3464e53f0178584672435906b8e6f788ae4d1c7ac349df26849c4cec24e006737a2b091666448fda Key = 3d449e32c1a302c11eafb4692ab65b85 Out = a3aeb811ac22c245b03d759068783932140c27009158a97358e5df31328016d95b96714a97c16d3bdf473071e6fee67f3c776d47aa1b5f04c1760fb87a2745426b8fe9bf2f Key = 26dab5f6ac4a9bd97da7577192144830 Out = e6280ae64b8a5495019bd49f4288f48020f065c3f6bb6abefd45b0881f9a145cd86d07fe495629ff325814a2f2aec63633c44f3f1dba89c84a564b2b1d5ba1e7dfa914b844c1 Key = 576a91eaa5902b37aafbba5723420b31 Out = 719296b4c6996e0db1e97966adb53f258d62357748cd5d031de7d8d84bcf4f8366fdb69722b46fb9e494d8c2de01d61286e406de11d97566319bfefea91a313376f252276dd4 Key = d8b073f3054980846d03c5a38e6a6869 Out = 4a82d1e857779cbc5e7df655ca33823c1c4408549af6eccd13c1851c56e6689dd347b9a6f7d8ad7242a2b91dcd4ca3f3499399b437a6353a735ffa0d576e935310da18a4607c Key = 36be0f0e26d16c77ab435349e7bd9e82 Out = a3435e150829a1515c1a49859cd5c168b3a0b3de3e33c1898cd7f9569939981ef99a706d1684fa04774c9650d4936c96a15ed218e765ff9ad8057e97e4384214ec8a61b8f24e Key = 7da093171f3b7b70243e7a9d607f1bcd Out = 1a91c390e9ef43144fc9dbd5e817e3bdd056a092ae508b311ea0825220419bedee792a1d9d2b8b2acb7a7b2d635d1cbc152bbbf78ed61431f5a8c15f0b0eda24092f31894410 Key = 7eda6b38fd1caab32dec58865ab74614 Out = ab256f29e42f06b271a7479b86daea54684fc101aba4f30ff3f70096142ca27137fffbe6c26a6c24facd35fe72d43c586c718ac36fdaab06d344d3f1dbbca595a59829d7852b Key = d1fb8ecc9e37321b3eed88f36c80b8e9 Out = 347914cf2c75837a6f8a562e9f27aa6fed8f247ea2d1748c2152ebf959bbfbe4c219d72e7163b166ae05a2b60f7574e74a2c81b506fa3ca943225bcad1247fee9c871f0008de Key = 4168ddb3c4474a8c130b2b9b0ce87b3f Out = 12fdc1356313c9074b2cff4221ba153281e4b4d53073cd583e8162f5804bec9e39265976a4d5a2633c8188e034dc91c2dda3a38b4eab030c0c8bc349449ced1a5ec8ce8635e4 Key = 2c275e327eb181cde419bcfee599f665 Out = 4738bac9204d5c1b351b53263a7f824278ae461224282b76d21967290fb00b29579a51780db15d481962e3131de58bec321f3f599454efb515c9a0021431c2ac7aad93464f9f Key = 6510268e8d5d31dc91bfffd5c40f99a9 Out = b108625b6dae80cecab34d05217b288522736dc83ad2ef73851602da8ca5b41d77d62f274961037da4b87a53e3452bfb4bf923e4dca6aceb4d69b3391653edb47d3fdb4c8dc4cf Key = 13cd2e0e56f42719974e011447994fd9 Out = 2942f5adcfb2aa6170bdf0c4ca78634cd25f1a1c2e6628fced08ced85c48ba842a165f479e83896bd6f4690b00aab716de3f4af4563050120f007063523a888ccdc85c44c35bb9 Key = 4ff8635b7bf62238d64741db26edd2e4 Out = 23d93704bf60c811d0bdf1a82357bced16e064e045cd2fd65ab5ab9e53cd3b2eb99ac04da55db524be817d2a3d61e95ad80c6464a10a8b290fddcb35bd742845b8a235ee582a4b Key = 27f79d936a6cc2dea2b84273e8209ee0 Out = b8deca8894b03d9ec8f67db054ee1191eab63f0cf082d49ba430d5d0ba809ef054f53a510ed589e8e9731e50bdeb5dd883eae82fb811b7bb17799c6b516baf3fce52558008e5fe Key = 58bd6b3bf056c503581cb4b507026e7d Out = 119e6e5f274b406259e116b39b600a79a146370437d18e1dd52f55b95fb3d3a1a24afe4d9d20758b72ffbe13ba30147cb02da34a2e2cc1794539b265719325813c5f0d946c3f40 Key = 4264ea84632d4f5c0aec348450299556 Out = 309d6fdf6fad0c9a440faf8f3beebdd975b2319f719e6aa9229757961291a8efa01cda044f1177bc62488ace95a478de3dc94325a088bbed9faaa6083bc722f2cae1b1c0813bea Key = 5a62727b9faa994bab5857f632619d40 Out = cf1f6723c853231d8855c994328c095bd5c96b31eec6a910032114d974a77912a04f9008ec6709c8f028c121b7f71244bff425c0b9d0fe4b727fe49b4a07bf7c0256fe5f7df089 Key = 798acfc8f0ee8730449007c1a47297ad Out = 693abd8af5650df916c73a7bdc27699818628f12cf6b4289be4479632b969b161f2df953f9236b44f1618d0b3494c58c933be0a3d7e911632d649f84d5c6dad00008876580d9bd Key = ae78c93f52a72e76b3afd388b9270a4f Out = 41b757f14b92427abfc994ebfcd5ce62c11c1c0c2e98a91642d8a79fa373ef16282185faa3e87295d4788780d21f1fe02db8047de8f51eef6312a4aff23ea2d5d583c762372703 Key = 6f820f4a63685f9ced8edb95f9c56799 Out = 547909e3f4cc11cf61586346cd701cb10050fd87cef101f0b02b13e5e8c1d5242456e0e65a35a9b84c13dc2c64cdbbea1cd8945e4e9bd5378c6224bde589d65bd6d6d0976cac8294 Key = acbabfcf366defa6ba0115d2a440a388 Out = 01984a78679c5d41f1a78d8ea424883118c6323302b1b9ed8c9cc6761c137ca1766b68f10b47950b22ed0d617d9438e2893883fb42a850531424a7315eac7e9510775583f2c595aa Key = 1713437bf0e6f040751c469a9378488e Out = 804668bf702266a6c82cf09d60dd5b521eae47d2d8ad2c1d62879860b47a9ffc80ac240d319c0b2e083eaff8c1eb623e2a16631d88f71a9a8a19a2780de90909fd357cd1a8a06020 Key = f9c91042085580fef373c97bb8ba7627 Out = 8f67edf4fa970d13a73acfa21a920a50a61524c5be7cd310802ed42a51d870877bf78b2028c048c6967749016f24b2ea91401a74751e28d238dded82b8589df543c4813f9c4dc2d8 Key = 3fa9e00993988dce1ea88b8fee3ef8fe Out = f5fb6cfbf21ca0bc627565d8d194a427aba4acafa66091e2025feb607521ecaa3379d6a27e530cf49ae045746c948b18ae71c08f9dd717219cb9ed0119edaca0d0b6fd1374c429b1 Key = 7202478bb8b8d31f90afaf86af995991 Out = f2371b9c33fa87c709abd6b475c6d85b51cedd8fde3e59837d2bfe667a40332d38aaf58037574aedc23f273d0653c4c7507f73f98c655130cc0abd04939bb11f6223f565b210bdae Key = 79e776ef028056977624a91ab9371a07 Out = 38fa2231b93e4dcb6ea0c9d8a890fe4b3851c4603d94511f40ce0650f6bb75b3310829882778a65c78b789f30e85f2682be51eef8abb96d02ead6866c737aa5aa707da6dd347ad87 Key = 46fb2be061ac51008bd522ede4a65a82 Out = b29362ce87fc3bcae03667aa057a6012e6ade44cb883299aaebed7f617b4063cab6783f12737d0d132cfa3e138bcdcd0928ea2235c120b86d14d11567964486d11b4b4b76d227eff Key = 54992cbaecb27d3763bf3c8324d04ec2 Out = 624f95a81c9453cb9217e2f7e6e2465e37188a7d197a2796fbf59add94234652f708bf2c184653de04956bc7d80e1821f1125dec8d874dd9d62f7e0c0f1ebe1af126b4e89a2ece02 Key = 3c17404891c66968a37acff6fda5e721 Out = 78cf93907e627e675bc7c7926d35213df6810a7bb4056b8e8debda36b67e39f1dc2dfbf30137ef71b53d26065d15fefefde9ba106257d3f9e1c80609d5824b8aaa2ed2e5f5ebfa4d9b Key = 4cbbddd8b6dd92a5c3941278929410c8 Out = a67737dc705f76448adfa8781dbc784e421c241944d35c4ad25877d1b899cef4b99ca8d7799810e4c9c405c128576b42aff30b060e1e680a34e1a36aaceedb2ea8a27a3c88a5cdd1bc Key = c16860a3883e9af9b56b36fe60762d0f Out = 4e908f80be27cbe0c59003cec58b3db35eb3681749f621171a0e1da4508d0683da04c441e8c0bec39ccf3d73f2755a86fa25b427451544a29c1974bb5abf79da3b6845e01286ad42cd Key = d60b6db931a3ee9c94921780090e55ef Out = 3d8c0bfa0fc2e1614add5b6c05241d85b83621959ac3b0e59c5274b11666ebe5961638dd5841fbaeb1a13667034aa8f87ca290f2896c1c9b86710d4a877b2774d4bac64f83c18768ce Key = 795b72e59bbf2f374326176d1d633f92 Out = 1a07a26f6e5aff318d7fdda0d83e54564bf3b8e335c2e03b7d1c7055e0e30bbf90f6e98536f498f122b48b9af315e31b7a90cf80110d8e317f77e5875ee5539bb14a342983ea863f34 Key = 32c3412979de62ae6cbcdd381dfb6fe0 Out = 91a5f5d2222b330690a8cda1b99767f6fc93c1fb5fe7d176f229a1f48aa1f409215499eab80168d90b0db6f9f49ea6dba609dda927605304e7020cc556baebe257bb8eb4db85b4f82b Key = b61d33409abeaa13c1adf62001f154c4 Out = c89ee6943fdc5ccfe410852bee4776bb76439159e1cf30ebd17e0ac41458a38ee4e3747ec536fd191a06c9b104bdedc9a6cd714831bfc490a0475f1da3fbcc31cef7161cf609228d2f Key = 031f049b36b205a627e59d8ea0270ce1 Out = 467122a12b7a3641488f383e2c116aedd79d182bd45240afb9c7aa9129f056dab4a702d606cef6bf1f591786774f206675322131ce5a779f6e49c3adb18cb6f7fe2d5143969f702bd3 Key = 33010c79b8d88d217d8ab339d4f18011 Out = 064dfde663f4545e22423496965a997fd794e7365310d3cd4c0c36e995e90eaf0210fba4f083a8b3b98bbb991f6a0beb53b2fab1523b80dde0a34a754339c21d71b929bf8ff2af19be Key = 2d208490f2ad89c1e38f003b1654d788 Out = eed72f1d4be66210f36398496875c94fea57de272c7bbbbe4f71d1fe0f8be42ae2869873f9d6fcad31833d648d077a824c123596bd6677f904e527ba046ce31cfc2e3905b45d1f250ba3 Key = c63f59a8533fa524ff17c8f90c8fbc47 Out = cc006b080685a93a3b785455148ff6a8897a2e71112d41169d3804722d86f35cf896950f32c97c2ec95013c91f0bb3606500cb667364c322622bc69127c0daa4cb03368dabb29e706ce3 Key = 85ff5f072442756665a41f36cb2c99d3 Out = 42c94f45b8a83623d4d310c340474fa910213bf0fb6ebebc2eff281f529f3423d43d6718ed27c9431c5337fe66dd8fcda56fa874f1e93feddb1eb14f878d3fb17ec42e28d17a03baadaf Key = d6285c3777b4b57bfe63154807370f3d Out = a5fd605b3ca298e11cd098208b185ff0e4434e912208f59e09cece20b0bb52979b24503f867855932bab44ebcf9c3e29c8f58a858ebb10744efa6eef984787349f8f19ce0cddf7f6e1bd Key = 8df203bdbb72ac901b08095b53d29346 Out = 754778c7d3ef8ab8f1a3d4c2c0a21181fd4d5f7b6fc6ecbef37ed3e056e0047e4ce6e3245f037ac1f79b139fbcdf235e1d6d7650f88e33577dab7fe4933510099ad6c75e783f5f4c6d3f Key = 5977cd2f87f385bc05502bd5d0e7bd57 Out = 5e3db1831ee90fd25ab68d43c41069a76554164e2b0fcd3d6757d855c6c8f4e44dda0a2ea3e08ca4b97f75f7300047750cc03b699127d09214289419b2207c422c49f86070c5af0c5c78 Key = 687ef74e352bf67e5cd2eb1e401d6cbc Out = f4f35697eb5398435a1883481f74e58f7faece291526a74d218b5630733fcc62f73b0fa15f09bde1cf342aa2b1f7cdd368eb019ccc12017b4f9adc9fa158c6290734da14fd7f7c542170 Key = 2433ba7be8814aa32fb6d2d95df3fcf3 Out = 8ab97fcfec4396765365c4df1a8aa6a4861ce2707aa8815ca9f2e1f2ee7213733256cb215f5e218ae46dc05e68c5f6bf08a359849d210bbb6ebe711fb84270a2669ce2a1ae32341226dd Key = 2efdafaa360d48c474e9280552a91ad6 Out = 2857aede6efea1f56fe3f046db734ad98258391d67de7575a05bf596cccca25bebc573036a16ea28462e38dc280339d533c588921beb72d874778b44a827f5c18c10d99974e8eb451384 Key = 1b801a21fa50971afeba3cc75ea69a88 Out = 3a297aa69f0317aaa3c1ee3e4f351e0802d8e15d6f66c8917b804260571f8218c63bc93fbe6cba518fba8ae378438e6704f01ac60def5818086bad26df228eea7b5830acd42708fa5e73a0 Key = fedae848392459478b8c4e2305289445 Out = db3cf71dbf9947690eb969880ab95ad151e2f232fdb31377e40c24de62aa3c050f25a92cdc8d672ee957bb4b268a92c4103ccafdcedadce753747850b2e2a94e470d6aa9cdcb2865733222 Key = c84c96ed35a2ffa95a6c3977b9356e6c Out = 5a6efb09ebfc84f34807db71412eac64a3b314061534d509047d4f0e0406853071aa311f9a2d066630145b5ba2c9735fafe9051ce3f640e69d4a6522eee3218d05298051afdf16f91950cf Key = 13d01b6209cdc3ced578d985023dec6c Out = ca65a7fb8e47d6abe9365174bfd2a5d0b85a0b6f7c1850ef23e3c7bbcc12674083c97eb3c5fd7db7a051b181916d4fb282379352bda72d4060675f8c9152cbc2dc9c821ccfdf6813ac48fe Key = d09359c76b27acde36d4bab6ec393587 Out = 5f1583a530d7a00d2ff5a735188b967ff53143192414ec0e5a0143b0903ea29d7add66bb61f80e47d96eced0ac60f54b9477b8a95496d9da28e07ab545dc8686e8d05f1a95186692675097 Key = 6cb6976983b50cf36ab241130ef52c75 Out = 84ba8e7435ed4cfadb127e9b5e03f6ae05ef0545242c3ca2ebd149208a18017b0eac72b7ee136e306535d08309ebbc4e6ccd2853e21f227c94e2a42580a2aa9c2ac51762c7312d8f61b6db Key = ae59e0a76e3249d00869dea50a1dcfe7 Out = a4ab4debddde2772a2881d7ecbac8120991838bff9677105a0c7a93b0f07531888b5535fbe6111a74c95927c1cc44a6623baadec672c974e4f4c03f4490e1df0fcb914c416b0d2e816a4eb Key = edd209dc676b649df0ae3f5d06afb3db Out = 5b35491ed27af7ac39ae30099e4ce608c350a7654069083ff015a4bb2cd312c3c8b75a547f3bb3d52ae267210587a9ec3a8042612662db3dea73599a4c29c02cb4615cd380f5a21841b58e Key = a90a37717779a53b1bc16e375e9b3dfa Out = e4f0053bf0aee15008f249634e408f38906679517e6d4b855bd9f66329c6f1868a1a7c59a74b2c1fbfe863ebc9829ac168fbd0c40e91b927d32841f2c9b84306eca7ad82d8f1ee731e5020 Key = 3b9ab76a23ae56340b5f4b80e1f38dfd Out = f6912df095db1da8c184a92a082c1881693fc8dd6969a3f12b6e83ec841dbaf0d9ed9eebd7c8903987816dc4e6b0895adda9d3cc9ba369ce6986b790806f14e48094d8c037052ced2f6df202 Key = bee9217cd152443d54c058295b83bc2f Out = fdca49d58b33826fa156c80892e9ffc410675f1d50d260c975bba8859c8979a1faa1011e01cd34998d3822a249c6a2cda3839c5834c181b02b8144a8a09aaf277a29fa263b9d2fe2130acc9b Key = a7c6d74c265c1d9c07848410fafd5b01 Out = 0551654cbf6ac99a7b5afac0494903a86861bb879d3b4fc6098c5ba152dc67e3bb9f8696c92eeb16fd9cd1e2b51ed1c0c38d138faea7b429b685f2c0f0ac8deade3e8ffadc450eb8c422edb5 Key = b4396e7697fa2e6961ee9b8816d9f857 Out = 73279b248d4c9209f5605714a8b831427db9b438ac06ba56668eb3a708da20961aae24a0eb326ac659831108fa69770b8647076be3e8c13645c48e4617d15a9f5bde51396f46c43b701f30ca Key = c37c768af6a6ec8a11496340dc60ff11 Out = 4ec819caae4e235e1544e4bc8a85f9a034717dab307344fcf813558664afdddb82def5d0ee1ad2a416ee7d7c9d60790f6e4ab763c76facc28e5506bff7f95a5ed99f3f85e282d12e6078ad2d Key = 3294ea26ac9dab8eb11202a93f097b64 Out = 53a98dc970ed4c0ac24ddaad97d4176af0cd395cca2f2362f4eee38b5aeb4c96c96b001756a43f302595a1750de079668c1d7191a8e18792603cb150221cb766aa290f6a5fd7d2b7d3360893 Key = 9ae717ee20948b629be2a642a11c555f Out = f1714031f50b10c0c74d5ab172e95c81cab07c16c950e655146db4cd9ae359d1b6cfb94de245cd166e619a6f8e2a013b746355954222d7d261b8070bf7af62ca84d55d6bf997831314fac509 Key = 77a316cab162cff862e7bef3569a380e Out = b6519f1f8b4a2fdb2e7f094ac21bc9429b4da9677032edd4c2eb4b539eb087c7677714bd7740e381a1589e9d956672a7e1838ac06f97fdca31d37573ad7617e0db98a7f699773799450a2d50 Key = be9fd5155c64e40570b974ee30498f7d Out = efa65b675e2fb4129757a58148f09b2097682a5dcdfde8307225cbedd15dfe810af112ede83880797f4f6757f6804d905cd16bb62681b6222c7c60407053e4af6d4b19c4ac6fce2f7abe35b4 Key = 380ff14baee029db92ba4cabbf9e9cfd Out = 360b6a6ae5bd9ae31ceec95df42d95c1aa507ef96a2fa8363b21d7265b3006de29cbe04f395acda1eae8589680878391acf57af95dbcd3f322a29249fa9d8ff611b329b2d61156bb011cd4e46f Key = 80b0bcb1b47871aabdbdc48dc7c86a85 Out = 23055f7487d807dc67ffb121d0a986aa798ac2dae4d9c4798475401ddb6ba08567ed9773bd37eb2fdbbaf00ccb43ce8b18921a2019918ba2f276767554b6f3ae6ca139e0f64b800f5b506a29bd Key = 57848d34afd9b58791e3cce8beabc44e Out = 610bc2244384541c7e3a182e10009bf632bb0ae68c9534e78d2eb020891086e0a102c57bdd9c06dda05a924e2a1a04858f3e5621b6f57f035b882897dce95fb323e98cec3ce36ddbf1edcf9136 Key = 5d612eaf24c8fe6aad3eb05910c44f2b Out = 5df1e2a10ec4e43a9e314eab280a9254ee5928eb28664e9d8702a9397fa7cc362b75f287d424640cedfacef5f3e2e753a8990377e1c11b81135b5634e697f77ee2f1b247e636f81ef00225d1f8 Key = 3551f49ba2842bbd238bb67ffaf2fd73 Out = 19cc63b55a6b96b04fa8a22ab7c00db7f5252b8c1675a089e36928c5dee68adf2051866a54a516358fbf154bf9c223a588f9c879fb9e33d8cf333a320d78eff3a90a58a4eb7ac000df0f430f0b Key = ec17aece3369861d0206d1218ceae4e9 Out = c5150d6750193ed089c5f8a45662e418ed2e5ece896a8ee0675252d986037cc6eccb3d08dd51446a373c8af436669d6810ff6f63f322029cff3e1256b6e207fb5708ee861c99422a482498f453 Key = 41d9e57421bee79d5e23acb80d539e98 Out = b70dfc8f38a96b0743fd397813e448cb871823308b97cf73d84413c6705550ab8056152386355ae37bf624eeb4ec03ebbc364fad3d3b5d463694644b7974d259cf4a1aaae9c012cb642ba0c086 Key = b1f8fb9f1f080221101093b3c8dd98a8 Out = b8f0e5ad1e743bab0f43d4cf3d1934138f33c5c778f9d249efc11d194fe88c65b58fbf18c47ff972e31120e02a5ff3a3f181b43e5f0975e38115ce0a6748cbdd0aefc864af0bf4e4805650ba6a Key = 901494dcd7dd930c055f30129ae21c2c Out = 9db3f8cd0ca5be1f6a689b00acbca931a5de58d629e11602f55d3db1148791104bb234e9e8f2b7d7396065373cf47f8d12f49208413a1f849fab25c843ea01c6a86d8272ead1e3301f89a72a53 Key = 9e6cf1c497e49dc4cbf2b8e455d2df5e Out = 441cbd495af810621e9507826f2dc54252cf9381e5e5702a6be1f78aaef61f9ad9a274c02b841c184d3976b4c65ddcd42bdf47e974332ab850cee836483737c3895373e6cd5f313ed2e808748fa3 Key = ba54d45ae847c088cf8c4c15d0c9147d Out = dc549f54bf58a3e37d3d98f9e45adb1af28009838f2301a6d024803f49d570bf367516240c74246fb6de7bd5781939bb620e59da45ec8b9fe1136f289f84a3145708d92ac815f6c2eed131f21382 Key = d7811df03809c864b159e914b07974ec Out = d293cf5c6205e563477e555c6a864098748ae53b7e4773dbabc4d50b2b369ca2424b1a1f1fb104cf1fbe25876ff2bf69da04d1eff8ea4edbbeb8726ce8aff0ed983416b76218cc2c82e8bb045418 Key = b3dfb39d5d93bb59f2b9db8216b5f647 Out = 8d474da9e56603dad49af7e5f3ae7db668cb963b635c63ed92777a14c5a950f163c536054e11b6a6020433d5e9df95f841ed64a39887e76daf8b5e16096bc2d02b7bfa742a56ded86ee7e033e978 Key = 80ed8806ce20dd7d48558fad24c097fe Out = 41e325603caf25ae17957daf58608698ae98b878b5951f9a8b6ac451cea7046df9640cc0ee11b5156f619563e08d82cb51ac0a937e267c610d255288b94c6a063356900bca8aed7962ecc90cbfb8 Key = 8da1ddaedfd313edbcad743db2512b6d Out = efea6ea03a1035a6d49fd2b07d0112a5ca46efb3d921bec8d49c79d46761b658f813f9e6a4e7696e978e3041f46c67a8915e343bf594f895d4b2df6e38cd60264da3ad58c2757a7c8f9b79825425 Key = ed85ca41b7b6c8d78abd6eeb78b485f7 Out = 55991343384d28facc800cc6ab1de2f2a8abcd79971ea545b366ae7efdebf1acbf25b81e20ceeec684038369945df716c3b4e93c8acdf60ddce26236860408104d72d2be3e9ba4c5ea511aebdb82 Key = d261cabd0e90dcf0805b5534e2e8d67c Out = 113737dc3e7f9cdcd1308d27e6c9c9ea150f4f99ca2b51137f50e7387859cfa0194c112e0820c6c8653f018fff9be529e6fdb014ab9650a442a4516ad9ac399e68e22d0aa1965b2326ae1e210e13 Key = cdc4eeb150ad1da6300e33fe9ea8f831 Out = dfe774ee1cfb5272e95c241c28d6d790699a028ee7c1fab355c457a5f6cfe9f3ad5804b3102ea1c6b5e0a997ac6a76e8c834c9b4fe5bbf9f109322e7bf21452a0ba01f77400a9a20de00bbe41375 Key = bb3f7f8788ed74f0b9548bfcdb605905 Out = 1b78d63a8b985abfe65f1c5f338f033bc57cbe74299e0f719bb6cabb2ba94680ef8406aa90fc807880eea4baab02d54d0d43824d3ba7e0a3703375e39e20e53505e7b2cc7ecb3c47a18a0509f1a0b8 Key = 2eae76f4e7f48d36cd83607813ce6bd9 Out = a64a34e5dd79c1997fab6b1fb0ca1e7c42b1462fbe8427385cca3d71f04edd7eca815782b52414d27522103f90de786a102b8b585491465d1a99df8aeddb350ea9aed9c26fe740696733fb8239bdb0 Key = 899a87d074fe3387652cdc2dcc2d7bab Out = 9c5bae32c016cef44529912576fcd7a2e503835b3d886604c3b8897c9ee78eb7a36d7165737814b47b04448fde8d8e0bd0394b78b08047492b48f3c408246d14714b52d13026ac8ab1847d7ec2bcca Key = f3dff595bf0fe38fc469e1b3407c4faf Out = aba28ec1e2852e7b28f0ae4275e622778771eb9549ec704827d57cd54350b79070f9abf0c494a0877302f58f092ed046b3f4af9bc5fcc1e5b737693ff03a5ec40e1a849aeb1878f4408d73c7fe2e8c Key = dcb8bd1061401f3939033428245350ee Out = 5ee28159e0c177a2a56b6cb653b476ac8a6c2071af476b95950e314f31288dae1946681eec9679a2acfcf9c9b1014f8c03f77f41c1e6acf477535c0a3c608750bea01d13cb41946733e7dc0df2c0b6 Key = e891dbd84408149418b5d3448052bd89 Out = f10a75b535a3542b8e3b1b04b77122835ec4f7baf1f445daa8bf266c50fcc325006331d40e06f3dd4cc612c69c91b9da45eab649947d6494001d7a25cf09769c0f2ac168a1e31643d2ff4bb276198a Key = adbf674abb096ebd067c5c68f042bb75 Out = 1f8263f3c52725517c566df4e89fb45019225ed7c7504c7a4a87908c6ad423d219e3790cd696d5ed5035814ea3d9e2c1f69577f5ad73d8224aac8150d657062d4c1ec44d14202739ade6658c002769 Key = 4d65ca80dcc0df0b1ba48f27847441ee Out = 573c1d118854106753503fbf283fad35e1ed29b0f264bfef4a01f8837dc7cfc8fb02a6f30b82ccf6c41c962c938616795bda8c50835e33dec86ae7035fbfb9c098754f45620fa1fa049ca5724a7495 Key = 0db6b578ded2f151ed0f34d9a24bb4fd Out = 33030f8c04caa8e41dc04371d2fd1baad69ab299178417c77f4fd32a19dd7090e2e024edd5ecf7c0f391fc9852e3b44d3fd400c57fa01aec8f648046606f8d4e2d9f7a52302a7b535bde56de93cc6b Key = ff557fed91c7ef8c26f3ef431817d2ee Out = 7a696c7c9c722222a908fbd204f046e2f55ce6a3c7c6cacab7e584c95d8e5ce9219cc555b9c23078579fb438943271a31679f952efb8f918eb6fae893034b0510c088956b5c262f6f9524281e6d68f20 Key = 449ccf720646401190b02536e6a0bf6c Out = 8660d7a5d3a44f9890d6c90751f2fadda22b7adda5e0efa3cfe2031cc6b91a516186f3344f298e9a873151b4d1060ff203b1c767e47ba5e004de2a9f726aa0ba9fe6aa530d07c5c53132670989202235 Key = 9aa172fd559569e2898b147e1ce12452 Out = 59456e6058258042a84793f14f9474ab07a79372c4ec687eb30b59f478441854cf455c683ffe9763afa2db6c5dce10d06383f26ff63911baa611c662833840b702d42c7921d50c874ae837a0ee3aa3f6 Key = ab0de5d25eb1068b25c7bfb1f8bdd4cf Out = a3c58c5fb27b8eef8df1aa3545d9ae78543c2525295017cd9898db2792a15dd40dbd9e093a639c56600cc81f8922c4873c716f2db60cb4bc0d668d88e4ccf38ebf2f16bb7bd30ff7dce5568a67645139 Key = 00ee04102f7b4bb12c2a902b292fc9e6 Out = 7fc145f7f0bf7e4c27e7e158cbb1376cce01804fa5283af12fb51f25ef918c0a1dbbe714c78a702b9a9d8e80d727c73fc4b41978bed3f1a4f83a8f759beb8b03e874f6bb029bd22170ba1c71680cddc6 Key = a882259470d27a0bf1e2d4a17e85476e Out = 33c70f7de49238d80b55f02e0e737919de2542b2c8891b3261ae320694bd1ea7568dfd3806fc7ac60d6929637ee00c831b3a210104cc4b161d4e85f14aafa1e1ad067274c57249eebc29533495ad7641 Key = d7f41fcb33e4833d3ee5604b62c5185e Out = e3812ec3a89ac43bc56f270e7578f34b1998c62f7213ab77b7affcc5ce47612f5bb950290cae9bfc14730c5cc28ea0fb1af314aef8e28c23794e0b74dd900e04abf655123cd3efb0c4c45bc3713532b5 Key = da9439bd090dfc2eccc1203a7a82c5d6 Out = aa68baac0c6649f011d77e0d4b149d3912783726ebaa97683532638e6287cf8d811d700f848929bb32217cdd9a9a389f0bf13d1a19c0d97f7b2055534fc271997bee3345a49b530284e89383a9f6776a Key = 409f0d5343deb8595574cecf141b7351 Out = 054dbf64f9bf4d0eb7d1d123cc49b0173080daa22a929524dd29b05fd8c5dedc5fce7b3757a779b553448cd1cf86212c4cac79077324ad273ed2c037ad8a3ccd90ebe8f399771213d0b84d2882be67bb Key = 3da24559d335d128504357c23f7bdedf Out = c665fc5cb2f2e7ab50e762f99aecf157be29428a8ec3ea47b1076c710edb18419ac6f90a3c37f817e314492341ea41ff130304bb3c35e54c81eabb095c16c007ee703381af7b1e79676c222c4411723448 Key = 5f9620688c1ab390b018b5d4447a7710 Out = 67f1c4b7b53bda79d486fd8531ccacf374cd247575b49d45ac22880a1274f514cad225631cf1e6d6b9db435c702d585d32d5dfbd19c0fb896752e017a2332f335bacf4efe31f09efd1d72a5d0d246f42ec Key = f926be49a3d5ef3e6ac78099759d5e20 Out = 1b89b49ad3336ffdd944bbf897127bea6f206c49f639dde3f2d063134523b4b7cc7b652f6d129bff6a66ec57d80d4e494c49cbdd40dd7f30134fae193108fe47b34ede684a4beac23b087ecf70bbc50595 Key = bc8bbf2eedfd937413db47acb55fbe7a Out = 64bdf6c26d95bb69111ae6b22c20a6019ca1787e1b690eac140114d111573d3a06aa0a4feed03711be27602f26290fe72b34139a511a96524723a3c145af06a256f1bfa952787cebfce330dda0ade1c109 Key = 086fa00b43e0272a1042ee53566cbb48 Out = 5b32e5d6bb6d621cd8e6ed1c3f12bb9ab6690bfc2e10c116d90365c2d7ddac5e0ed0004df199dea9e9fda9e93b7cc43976d2c87dc00c63cc2b2fa0f3dd60c4baa0e16731c3f9a98f59371ba1c30dff2859 Key = d4864e1066c400faed9d69228cb96093 Out = bb406e05a5226929321dc9d373f54daa6dff6429280633032b9261c62cc763a7e0a6928d759d70c5d7ac0ea9e2e95c583482c01a5fe3f9188d55251be4c294229b4e85342eb11e3a6507a40588f01fb239 Key = 78b384369b2ea172724aa49f8581f223 Out = 224c6d9edbe16e2578f6439bf21c925b33bf9cfb4f12faa369aad25d400591da7a5feb56cfa2b57a501a32d49e2d2465763f66ef6a624e274af24d86810dc3e62eedc5742bac7c2802748e2b85e83ab2fa Key = b5f0d6509034cf5bccad1c8d2edec618 Out = c86a22a6e2d59f7cee21286eab5d70a04b596000c29dfafc08492876677b9ef3dba2992843bf92e09b9a33f6f593fc082aad6d2f1c6782ebab7d3a9fbef707732207fdfc29eae3bc1e725080eff08fc74d Key = fc77a08c0593ed01cb086e19f38177e4 Out = b1c3231dffdaf14651df7cc473d1ca0770dbeba594735eeaa5a2d2f1e55175cb8b724ba54bb88b542c84c32bf3472cf50a35bee66bc33329e754d1f352d0beac9b50d40468c66f698425218f0d4f02933b Key = b95abac35fd739a6d3612583964a17e0 Out = efc9eb8de4410091e9bd5340fb1ff99487c4efd096416cd98fcfd89f2f58aa9f3215f3a690f910cb1d22c7614bcf6343a4ce3ff0eba5b206de6fa1a8aca12950aac3f315d557be786d9dadc4901901c1dde2 Key = 1a9574d5e39a838b59b111a6fb2cba9f Out = 2bd78b044985d5b053315ccfac08f18670560aa0bb97e323a78b5954eb0822d84e67ea639df388c97d5e8e105cbf56e184bb15ff39efb299a4efd3cc54731adc0f16925b46421c50764e095b83efa772b4ad Key = ecd303f605ce836531243578b89034f4 Out = 980e30ef3ec20d065c5bc0217afe380a218d5a8f9cd0d93fadcde1e44f4852c11d1a22d0a00aaf4e80df8e0101f78e1b9d916ed608f0ca09708eb71bead8b43e3880ed9dbffc585891f66f18a3606d369412 Key = b560ebd7d836ee7d1b0fba532686ccf7 Out = df1143c0e7cfa2e8d4f0be58e1816d4940a21b4a276d41b318ed7b00640b324bb01136c9b2d1a693e67dca68a7a87505f88251895b6dd2547d2465d9b0fff5b6466b7de6f9cd18740e91da35b7c34cbfa918 Key = a38d3d173a6ee95fb72f38fe7b451a2f Out = 690a99982f2d399288db819a84f2b1b37b5269d43910b405220bc8883d52fbe60e124236d0aec89c22dc02a99d9877a72bf36b5485120dd8084e14517531b377164c467a65cb362747590e462f63449840b0 Key = 1dc2860c36f8a0cb16424598b8805f07 Out = 04b79a3bb249b910ab21ae6c97fd6a3c364083dc6d9de292e7a1346e61467dd71a95c1b83d197586a9e586dd5ba2351625d1b022d3fb4afeb3b538a7c153216581a9061ef86903cbc8808cfdf74d46a17412 Key = 297dbc3c364cb0804aadf0d16475923b Out = b859011963207243659d6a83c49e4c5919bbe5e79a0c9a31981d94262b3e837f8343e0c429c20b568dfa0cc7972e8c26f17ed764b065603e16e33b755cdb37a710d2883ad76ba75f665c66ebe4c671273e2f Key = 6cfa4240b15010ab3b94dcbce24fdc69 Out = b790f82c77cbb296417ad88f051471b9f38e4cf43a90ff6076953ab21dd03d0934035cc2ae14842ad89eb02bc071e3d14126c23d45671c2dd20aec1da024bf36f3dab07d1099093c0e455e4def481908f921 Key = d42a9a2369a7af82b7bda82081b7f9b3 Out = bfe54fc2d61f41eda65a4271b60c1e393712129b3f5931bf6f1fed34ba3c47c19f221952f13638d48105abe3b44dbd55e77f5bcba08899b0d4bc6a5258e5e2943c8b8e11257ed55bc2e696b4e5e05b912f75 Key = 9ab4d49d7a2878eb1cd8e761ae8adf98 Out = c502fd12129e9e4db867893310c68b04fda85501108ee8188bf80c415a92793b9005c32e7aff68c829a5fd665dd66165478d4e16794bf022db5ceec0d8128968a53d404424854d1de06d2b692ecb4d91affe81 Key = b54108207cb0a9b0b588da361f9af62e Out = d82c438046334a1d7d47cdad4bf3c346fecf572a7c8e72c9e0fb2376bbd2a6c4fcc8e5422e27dd93cbc5f3dbcec01ee66e7a1f179753b65c573f0cbacede17a727d0cefda1e29894725154cd3f39f2e0a7bccc Key = cf74770f0fa16711d04ed999e54d5ebe Out = bfe44679264a09cfb26712dd5f3dbc263d9b0f582b7565124b923564567667151168ac3b6cef20dd53f1db6b55c8f30ce556399fc85d71c62a57cd1ffedf5d6463882d08ee936b394818a1029ea158044c3e49 Key = 989dd16159e88aa582d0e2ad78fd7003 Out = 2ec59884921ecbe135dd2396c59508291dee1ad86d83dc4ed71a3ac5650e8bae2b20bcf5fb23d7299d1083c29fb2e503e13158bc0705643a9dfb37ff449b650a4419c49bdd4f737cbec809d71bd7f66f389bea Key = 08fe984ae6698a19c52a6e36550198ef Out = 22cb4952fdd0fa8492460517c5351ceb05bafd8720424a6c5aaade3232ef003f1817427031e2e66dbcb3564b2c911cbec7a4d7738204ceb556a4fc270ddd578e2d5ad1d9b3e12adcf7f6e7b43c81ddf5a96474 Key = ec083a82c1af14caade2d6afb4e5c635 Out = 54450f356d706906fb6be0d6d88a2b933cd2e2130d76b9edf49045a2037128ac36005330b28676ef1b61fa724a63f41ffd923a6e1c89bf997f823b958113384ec6bf0e3664e40d973f98ccbbe92101c36f47e3 Key = 97f4ddd3d1695b066c355b1a38fdbff6 Out = 70621d6ca96be36691cf34d738d271034644ad1e7a0a4ce959b3f69dbbc69de2112c827748ecad24aabc9781b2cded98d34cc8bae901d6bfce7d621c874fe99648fa23026029a4c5ac2169a8bae086ed5a9450 Key = 7ec904b376ecb972db147bbf79ef0ce6 Out = 0f233af03ebe37ac958197b5fd2141f93689392aa7d2cada5be572c529c8aee57f0a1036934cadc91afc70d6dccb5c938205880f83a3b7417990708e553f70652375f65bbd21807b1bad65ac810ba9d448824b Key = 65b08c32400326e6dd416f464c89141d Out = c6a1dc96f107562d6f06526fe74ab6fde876443d1c9584dd1e10cfb7b7660e8e8cda305fc10f09938c676236de34bd4196aaf5e2c5a14a4bcf798a9cff40450bb4b3b9af8d2f6dfcd81e537372d0d24db562a6 Key = f9fa5b7feb0ab50dabd286609f6e871d Out = 25064cc2c0e4093b8d7007230841ab969ef9be256ef06087d36959cb1026500f53ba46818c01ce47a2f9ebdd0433db9af7074c87e846f052e342bad14e9fa7a0e120621fd9c458fb13c66e4126f20bd7f5f76e35 Key = fe0e26b47df48b854b0b0320aa9b8a24 Out = aa6a03ee157c0827ad8ee47ad6278ac785936f5192be7faf2c85eead342326f2a791f56c26c276301ef16eac7774b7f7a0fd41785bc1d98178b274698171874f4aa5311105464666b5add8295787cf5f2daf6b16 Key = f6cb4f2efb487a05adcc5c523239619c Out = 728e20881d6ff0c864d620fb679b4e3d1dd2be402489e9cfeb82f81bb47b1c04d234ae5f62f6a893a563ce4ae93f28c832c5b988f30cebb66cade5b5c1eea2efb9bf0d8551c5d790ffbba9bd893563551f6e05af Key = 1d84bbbcf7fe765705746f98018a4ed7 Out = 66672d2bc224d99dc7b106a86432cd9f9456c6518f12863577d8d2891cb95d187252ec727682906ef17453f411032618828691e7210b01d7f5f184c2e758699500047fb6670449e776427d98cc48f524095f3338 Key = 7fb4a31e06b42c273c5c931a334b8830 Out = a44ed3d3656b3f89535304239759ad7cdb5027b93f7b26a0ed143f8fc35363a17ef654fc5ed07f4f6815d1bdfb427b0d324af6a34a367aab1aa9ca9da922e52d04876cb3f488a4558bb37df1cebfce741e263080 Key = c820321ea329841821ac4b1f3d047b21 Out = 70a9a93ecfbee007eaa964ae6f305c78947a603192625b97346fd58f7d061462dab9fe6e7201b477d2761eeec7ad95b2ac4df0658c9350d4183eb10b9353d9fea26a0254fd97c45030b947e35b0d4a0305e9212f Key = 76eab5d61ac50f3fb5b347d38db5ea34 Out = d7146d6cfedd7fc7267b7488e2111c5b6e768e4e67c3c78c10d6f4074daea55cf0c7917c5b738c2bd78ffc0ca9097984b3b64d4c11ba047aadbe4fb30771f37bcec703c4f533b3e02a8d6636efd161feb723f153 Key = 9b81904bd4bd65759dcf2980bbf769d2 Out = c689d4103105e054a96858702a78f8057d5eb3f3c999c5839fa8c9f4500203b89a3e56f3687ffb0c30315689c39cdd033a6e736edf9158e433e44d944a86926e5eaff3f049e922e4fc07d2c15092bdf1ed978c50 Key = 654464ffacdaa47acc09a9f10f84abd1 Out = 10afd4e9f29a19f3d7f16a11082825e49a5f7ea2502d0a5b28d4a5e924313ad05d9a8ab95105b60f72d1f9a4449f6868924af86cd652ad845465c244db14ab5b480800bb8ca09c8fa12ac22cd7849631f4c1656f Key = 239c34537020ac1fafb33dd3a6d9e9b3 Out = b7061ccd958ff0fa53e7693c4f1b3c649bfd1bea417ff0023f6ef24c362612322f1f992ced85b401d587b27cbbdb36e898b31ffccb7e14ad694cea5d26970a67dbfa59023b7f11e84ce8106948e7dfac71e570152f Key = 718b9d3439409930b8a8f1b8b14b9e32 Out = 35bd83d4f10f12d337d7bff45a4618d2dbca77918cd9a0b05ca38baa0e030f656ecc719a1b1fadfaa55b06c5cd7a14777a0078179203fb98ebff1169476d86d13890cf92c7ffec33a04fbb7f0f57e99ea178471cc1 Key = 9de2e6d4cd87952bda691c536bde8401 Out = b2b2739f6464964b7b32718dacdd1e917e9db46de6918519359b39faf4628f82d0f0dfa518f6a58ce0ddece317eaaa9157e619005c8b68c34c7241e823f2fb2a0d25944de48cc29611ca534e0110329133f8f45c31 Key = c020076f4e187750544f3ffa98fc028e Out = cd88d10a837672f0a39b616880ff3846faf9b20d6e3495750a148af06403b6435b345afb3fd1fc56202df9788086690b67c8f2029e6c32d7b94c7a0154aa466a296e6f3b348d75fef1d4820753fa3b4315b43f784b Key = 978aaeb400f5b60222a796c106d6bb7b Out = 0a674da0f0c48301d9703014f2e7337176f26fbe016380f3814ff7946057bd9ec16a3e589022f5b2e80ed32157db94bc24c0961c4ed0fb9accbb6d810f66b2bfd160854627dba674c858d59980f993b53a1e1050b9 Key = 9ac542038a470906b371d9ee376f7d65 Out = 325e85390bfa7d16127902e72107151ea5ea1b090c3de9e1ce4732a3a1cf5bb3ffc8a8401a48d75c313d0b5373968dc2189d3365a412731e70114fc7ca7ba86fd2d0568c2d5e4a8c5d503a873591b2334c8cb97ffa Key = 9f59902a4dffcf1ab26fda21692c4060 Out = 591d339c9cfd8062f423cd561acf930e2d1486a9838107d7046b8ee80fa2216b4adcbf77164f022d5508498846f1ec76cfc355c65057fc9372fdb5cde94c24935535fc1ef5bbe4fb39a215b04c8367c24ee69e7a8f Key = ed411f69891bc41fb9dbd242a45ad502 Out = ee6be928db5957ea5b93825ce93f0b7c8e67dd6b7caf04aa98b3ed93a6a40abafcd8a3cc424fcfaea10e8022fdc99dc164a514af7365fabe5d7c8c7ade6fcc17a2aeaae5a3af282cb9a275e22d235d13c0f2ea6a8e Key = cae31b16ad039d2dd96ecf7e704f81ac Out = b45004370644c1b97a8e1a9991f0f764ae555fa95c929a596038df34870159134ccb8a5d79e467722218b7aea2fc00af586c335907769b2fc9ca958785c6c4605ea3efb0660dce80e08254f44d85295949f6f038d8 Key = 245783a1944449ed14dc8284d163f168 Out = ecbd795610d89f353f6aa6e45444e130e6cf099362f5bc079fbea4562c7f5272d582440078b9a39e57716bbb26a65983fcea18458a89db03cc5373d597109007605d37ad0484db73dd463d6b3c07749b37d4fd027486 Key = c3cda27a5a342506b5650c2324fecb88 Out = 86f010e1609d6b5953bf116b197807715235c61a113612e4d72a557f16cb562ec658554d0b81489df342e4130bf91dae405e522cac94ec9bab0a085143ab7e69e9b8a7405eaf1f3d187065931c651c9d167838f56051 Key = 2530c74d87674e732696dac2a134160a Out = 75dfa7d28fd014e33a767eff1c2823e9de0487bb14c3c0c5b2c8a1e26df0f6d22e06ab6fe623a9ca643ed3431a1a0d6ac16c9d8875f3a8c7dfb98649ef420186c423e339ea6b3a786d2db1a5e4f114f8339220f4250d Key = dc3647e9f4abf20d5753c27f9a028fc8 Out = bd223fccea6248d3870e93057f3a52b394f516978650f101bc33b3d01adcccc203642d48e13eb32c69d73ec887538be226acedab48cd398d97dc8a29f1487f3367c0af3c309eb371a4e8e7222c2dd2bbca5d624f9273 Key = 46dd4243a48a2bfa67c338eb8f9a04d2 Out = 91beb82e4d27eb3ca460462a5ef4ffbbc1507312f26f6c98a91d3ffad79ff9c984ed18b790fb5f4280026e55ae87f35ee156254d8203e0d2d8cc9bc1bb4ac48737e546f46090c009621ccbde9a67e8b9164add3e2c2a Key = a263d35c6bac4c37461a4aa30af38db5 Out = 610d9fc67f912dab42f48609a38d887b14b728d4e934c83b0d74d99a6834b310b0ded64e8bbbb7e1bd39fda574c5e921233d6a05de89963527bc1434ca59ee2da4de5bba6659343fe4d2d4572b1dbef55df93baa89d4 Key = e583a579c4419c487bec6baa22cc8a4b Out = 109ba5fa32cab9537b84e2f5ae62d393ca9234f0374ce7f780e7da9a992a2c96c577fb5b37e604bf77e493ebc2ed3ba6059ffed3d83fd823d4a7e9788199950a287d7df302b57de98548ae64d1263d6d6629e52c5d4a Key = 33cec827126d7aabfe80f558e15f0a4a Out = 78ac2791ac35889601472d056bb03bdab2f2432d3219716d05a4ba8df1070ac4b3202c83b87a222448c4717a401987cbf903703c7e0dda210f24d92a7dd2db0960c53719133e41f82ddd9ec4f4d551a102755df8b867 Key = 6cb984bd378ea8a8a8dc1985c998c907 Out = 6c32227237860b2f9d9bb2984bb581c4b0244c393d26b5d7dece8e89c95cf8ce4f023ca7989de9c0842b380da41dfa9fdf7e6a23104496c5c15893e1f5953cb7505fdb0bd435912f3b98dac47f8331a0bf44dfbbe024 Key = 2cf70e14140dabe5e7faea5455c781d0 Out = b7d3d184b0f3733fd4445f0222f3ef8ad87c9ad182a8a4c7f1a90dc03f0ad58da50e06a92ea8437abc3899d30e3a1f37de573bb4f5f6a87393f8fb616a74cd7611b2f12e7796825201dac33b6bc7b4d32913a40ebcf661 Key = 78102c5dadc070d9a4df47f89a46767e Out = 366ce36ae5f09eb284c3acd7c506b67b46f66fafeb8838186b28fd5f6b0b6b4bb1513b5b640b5c848c796958da04b1dc004d14833dbc1962662eeecb3ecb66a2b538530896f8921b89e8e61a8584204baba11a1f44d208 Key = f1a909c2ba5a0fa27f1ae51d5be6a5b2 Out = c275c0898ebb6615a3063c898f4355cb2c834b9c84c605fa2c6a5d18033a13b6f9fd73ba7eddb6730ac9c2739938b7dd9d9b0f6e33bf81cb9af1138f35d4b31829fc16e061f4b7cd81ca90a7fd818121d9685f25a45df9 Key = acc647cdcffc06a34cc52cf167a43ef1 Out = fdba258ea41cba13367cfed0b2dc4ad60ab8cfcbb63e2d9f48fc6ccef9bf0395f670aff3773f23f5df3a4a686bdf3886c4bc5c8b686ce17e8ea22738d4584f8e1404743110c17bf148bc39ad37709bdd3a9959d87a55c5 Key = d29021c1dbd093103b0531c3c0dac9f8 Out = 88b412508bac420d17320fc6b4d0df4da7b8bba875e564f2407b0e48da816d8e66031efc2665f61adc277cc98c8c40c650e4a5781aca412980e5b703f8ebcc6ee49cd6f84894a67c32e6451a63c681ceec3dabbcd6e8c7 Key = 50a24a2318eacec5e998aac56fb0a06b Out = 1e1bba5ad0c96a53433e93739c9a4201e0c34a328f89c79c1a07b79d0c2159bedd42cdc07625636fd5117e1de5b3fc192a78e7a6d2532db2c8487f167f36dbf7597edbbab4c18ced29fbae63ddbed49cca6145d2055aef Key = 3dd19c57c6c747e991233d32786ab713 Out = 67b34180e0703ef38a8e81b6cb49c28fecadf90c063d7ff9a35fb5a7213507e0593703d9dd0c3169d5d5cc7fa04951d9c7c2335cee9429c306267c31b8d4da40f23139cf6e9a8597348dfcee75be3265552bcb5221f964 Key = fe2921fe883d15d432f315b145044341 Out = cef0394e00cb6ab771bcd0534d91a935a49868843e4640e4dee17adb5b0c2ae3d9e9d071c4ad9371d72d960991f321aa855ab984c8a2d2cc7ed60d05a7ed17446c12075f39ceded7214245fee9768b92afe686b8fb9c07 Key = 5b2d36153588a96c64a4971934f0c2a8 Out = 666918623581f7edf7a039ffc806f640cd4a162c7f5c2af950749ca9c6105a87c8c9bacf500cf2dfc97cd9413308e690ce7a90a9c1555e06c88e83a011b94c1ed5d4abb467b782c4a15eb27f73336389b77b2272f68060 Key = 76ace986dbcae5cca4e670d2d6bed804 Out = eba326d308c177e0fb5fe56b3700d1eb3c85e380bb3aeaba85185cb9ecac57191c8d7963a4104ce231c7b2b3a6d1f22d9de3e95f9b2523adde74f83d56dffa8d4efbcf91e204ca5b4171b2318e50a3c758d623a8e7b68a7f Key = a284af2d6496afcbed1622dcc3bfe496 Out = 85d0c53525cc56f90442c2c60b1db66f6c3cc8057bde34727c4f42eb5b3437828a448a90a92384a677a1928d048d81edd3d9b71bfb0f44475cbecaa2372ba7d5eef67e678e6742b39f855dd811a9296acc6737f37c53515f Key = 48ef65f0fc7dff9dc7ec83d701c1b95b Out = a714d83fbb05115c16fcbe215f4b4dd296b82ca6ec018e4a4d0d5f5ffbec4ca98f96265ba89822d6116383ca73191a195e7d377fa41d6118d23dfdc86e3ac2730ca1f2dd05146ebcf288f7c59cb2a3b603efa4a26db653de Key = 167db66c16e97184378ea7af8e3eb566 Out = ce68a8df65d0880ec5e997a9ef681e9744723dcb99aecaadd4beb324cb547b800e4fd9ff238c5dc3da0cf28d02892c91e2490da7cdec0de3eae65cb045361c3f5d3785bfb8d471178e437fe41c464cb0146965220c3e765c Key = 30527d359648617e1fbf04b93f2c9a9c Out = 272bda945953886aa162ac1f594634dc7bc60c088f98523355dab15741f58b3dc6bef5ceaa77f389da0ae742158c4255840fe7dd8d1b2efd11a7cee3fcef1fea69ed64352077622b2e04a5b5b6478ba9b26580274d7d476b Key = c0bf6c1400bf6c5a9fd0af6a20777c02 Out = 527f7ab6f283129208f3541c924d53b600cdedc3378c2f63d78c105c03c1993babe0c2da74631d17814f068f25c511385add940264454020100bbafcbb0299e2ccac4c15c41440981ea954f537e21125a7f3eff3e3af5da6 Key = 7bbcce4d1c78ffc7c5801e067568be5f Out = 381f591194112c920bd965d63d70cd516793e0668f5056d0ac735b625e210466f85d174910dec7d6facf7a6cc42d04fa786afcab8773297e4d9610bed6dbd79aef79b3ce0416707e9790b75386a67d8371f6caccc54a661c Key = 3d362300ec4cae350901b0130491beea Out = c30a95d7a2b3998226b68839b3df6df3b28d6db9222edf748ed1bd1bb8936a3c5afc8429c56a86990a69a4f6d0f72ec7aed57cb72776b66ae776dd87afe10b2dea44158a7203f45238d47142ec8d955d56e3b93e2eb157f8 Key = be0cf188e0b126bff77111b81d13308b Out = c65a6a2cd998915072a0d9486213c7f35bdd7cbbe72b38cccacdf4335a637698355e55e8081d4a476c60ae58f2c2dc102d5e7f912670582ec076e73ec9aa127da267b3f49d4fe9ee517c2a2e1bbf43c379367609189e1299 Key = 9bb1e1693f613b5c9aeefb2a4bc9dd67 Out = 913aa32803a6c6b6f6cfc10e01335b4abb8dc1fdbfadaaa0d5dbda064024c99846e5ad476c8c689914c4b6a171f4bf12dc95bfecf533a120c5f655c641e92916f871e8ca35b28aaeb2d2f1e3ef3f3b2217b39ec56de3a243cc Key = d245db39edd2d4b29cbf614d3ebd00e5 Out = eabce272fd8daa160475e886f48f8f3db5ce5d2bc36fa2ce4b263c346d3d702523d7fc9e2b9857788fe31856c7aa4989b554b29164c7b3f1c68a350c936f6e22891638919208b5d452c325e181a1e65e1992cac93d2b16d0ee Key = dfa21e90fe1598e7e1f1b8ac6430e1c2 Out = 607371bd8fbb3de03d347a2edd847e0c882ecda97a6cd9926869a513c68f89b59aea1816e1b6cddbccbfcb2ad3c6fffe635070e59bdd48be32dab5a4ee824657fe6373a1539f6b3b526758f52c981c825fdff97e7d593013d9 Key = 162c8a7db25b38089373fecc45a0eaef Out = cdaec2f7344c84e34cd30c8b72b8ceebb406ce3cb92f6ab9fac44bbd82e0ed5899ee460e32c23ec6b0417882dd24eca3ad3ede0885513b0d6e20ff1f30101cb8fa5ec48221e3dd3bcc8d455ef78409161ceec44a3653f15d87 Key = 0bede5175d695f1e3078d60ca97eac0f Out = 95b6e7cb9d5f589cc19ba31590bee236a5419e61587f1f2c0106a6e3ef90279d76d2145235784eec5cdc54061531e4ae6b9a75eee2e8085b9d384de98d4a6d5f517b777bad02747244221301d66df481438992e86bbe899e9b Key = 90d1e31f48a6ae1b75f28b857868ed50 Out = b1fa3ecb2d1149f28a1ab795c7fac6344cce27940540a430cb702360949854b74b6b5217960a4cbcedc77df6cfd0164d8f6dab6af3a8a16bf25ef278e548ea81baf29afe6758f9a359db1efcf93d4541eb637f239abf23e048 Key = 86edf88777c0c6848d97378e91677aee Out = a864e8abc946123d15ca584e947f55c2f4879b9bc478f5c0a96da1fffde7c72822939f706537283337e3061682dbf2e7e9cedb7a1029bd4562844fa1dc5a5d89713b951d52144ab2019221670bc330432dd60a7030aba15fd2 Key = adf49ed09c3cbec3076f07804695326e Out = f1b1fddd8e83eec8928ff7e3ff162a5fb6fd7db0239a838e4f8edd6a9596de6fa1ad5a2d6d970afc9f3d80a19fdf7b808494ca43c1671de8cc382872b05218303482306f7de9b0856592ff5236b8bcb1630789f810395034e4 Key = 4d92276a0b9d796495d9749ab185b552 Out = 469155b6309d36efaa322a57b06f38c8dfc28dad724ef236de5e1dbfd9916b24b92e21984d79e3aae659c25f8a013250b7dbc7717b86a3a9e253b9b48bc6c9a1a4d3e5eb1ce0bc1f51a45e9772fde8e92e9a6fd3f6d712906b Key = 16ba82c12f91dd56c22672cfea37e2df Out = 885ca547b3be364a574fbf80c809e8039270e4210855fc7d9a1fc1cf5cb9738bade939946b9d749e651a86fcfc5f1bfee814e75e99bb87cce1ae334c467c016d2220e79afda37f2cea38814c1cff5dcf338e7dff25880644646b Key = 82c4d29823dfc33b199bf1cf42b13b87 Out = 7073b2b20087a495eab679db96c5a4654fa319d59228b8ff3bd7a5e83b3238144501d1f5e08668d4101821fe4a68a69ba3953737e199051ae8a2a7683203ca6f6723e3786a74a98d75a9e7854b46632914a60a945ab70258c1aa Key = 84281575cf828fa7945fbd14ac3bf449 Out = 071024c3ba5f6cf1d94e4eef20b2b845c61d7eda5267a2239c01b48a779f8462ece7126330f54dcac7c207f9fed476c89292086db087625473eb45c3c107c29d0069be208f66979674c102ca64fe3acad9c6463c04219da62ed8 Key = 609eae5161f2ed247b32cbf7fc00ada9 Out = b852884f25c7985c3ce1bde9fc2f8d04f7baf839ea9b9e0f872d162642d6a7db1007552377cecc084d1c104db7817070f1a2a95fb40c9b593f5e80baa27acf09f7876cd4559d46b490fb482749bdab98fd159a04ec41473bfcdc Key = 6e49304323eb4e202655f3c8b16ebd6b Out = 5b5ed1a1618006c887286dde87906a3bcf304c7dd59976be7b936dc69c4368b24ec3d610ed5c3efeb062c359a423c387c5e398bc2498a25f34a57525b3d562b0fb4af98ccb4ab44751b830187df466473591e8179a5f805fc46d Key = c99bc8c3fbcc1a5ebd12ec3f50f3b9ca Out = bcd1233f4f6aaea40a9e6a498f3fd6a36c0ad569f108a4a83e714003ff6bac7231d17621046291cefafd4bf81567820d36bdde2c9fa32d6bc455b496357e9c26f9d01779fcf9ce1b8a9c0e0420d0e880e4628cf942b650f14dc1 Key = c6397920649ecce03f030350ef2b1d82 Out = a0853df02cfa66e8ee184f4f0e034f86f6d3c13b94e7519f6de592215b233c32eb76badffaed85878d3d03ffa42fb630a94cb6681e1808eb93ff23a99abfd4478bda460fda0e8ce15217ea36e1874b0f1edcbba89f51addcb63e Key = 2649ca7df44dbafbcc09f6378abd4e0e Out = 7bd949ee2ac44c91585467876835322986d8633f835c9e519b245cfa0c7674e960085079574f70b4329619a2986e2b49720a4c58510a0f00873ec0d37b4e25b6909d4515ce50a63de498ee3e7ddba3eded3fab5b765734705d90 Key = fe802e75da6b27959622843cab06ae7d Out = e835ae29c0c5b3ebd73f0cc016132e89e81c28feb17dedef264b062a2961bcdf49848b099a88af1117838c47a00c367ec9c123169da86906c1ea5c5619f5dcdaeac12a0388c0b59f703ea20d81570ddd6f934aece8a243ba7e8e Key = 0e2e58e8faad4908078be8c25279f075 Out = 6195ec783810cb1ef7dc60759a340d2b5864a108416e9a13a0184035218b03ea78f5b42f3870b39d8a17c9b2d04571b10709e0033286cca7d3bbc81800b7c9b2419a87a8b960a6f0c42014de50c95dd2b331b478022b98222f09ce Key = 9b8f0b7da813b900b17d2dd6e11c066d Out = b3395cfa98f182210fd3dcd47203a2efea68721ace7bf1f9c33ca88497359f69f4538a3eee304fa89ecd7be78b4646121c8103196d12d558b481cfdb08e5e7bc462f761cc66bcff4af44c3c7ce7518ccd4b77c465be01b271dcc63 Key = fedce262d788780ecc02443fb709155d Out = cb39c307d8ae775b5e49340105487797593642e176680c419f662cd966bf14f872b8743a6a59262384a3d7c7fcdacb819ca2116ae42f3dd3d19a90e19062194f0a4bfa2c6f6c06b1b0195fea3ef9fe4c4f807f7e470f88c128ca5d Key = b766868d7247eb82633ee43f7b4b015e Out = a34123cfbff9984537c704141e08a4d7cc557522cd3cd615116d17fb9412d9549e19effe65d8ed4cef3551916ae6b5abff9ac34c6bdc9d590881da86d658cdd8c633c051e588c231900feeae4ea336c16eae768a9129fe6e4eb70c Key = e67fb92aeb1541f1b88c88580e2b0801 Out = ea3b49e6304543cd1d0f9776819f80893c0850d281fe36520e1d9d04d8fe2bf07b463a99b90bb545f8a3443194c8ab17c5f42db7475f130f12a2658933e9cf76d93272142e5e553d77569ed896a80c5444a4e93c6da86a0e150521 Key = 109f1cd703960ad9dabecc228b45aa71 Out = cd6e67bdbff282562ae13d0b5c41c7fe2a53fa1572b31bda57982c3da2ab3a29ee0126072087d7dfaf7efa2601b98e476387ca65abba6772d73414dc8d8ae58fc4b0bc1bcf8dfcba04006774c0490defe5501de032c916b375fdbd Key = 144ab8edc40c3a4d3069848a634ba9fc Out = ce638d2d15871f995baa531f62e11bb39e7cb48bf3bcfb66a37376969a4e902ae6fbcfc014a7cb274ca145b50e05a983549b56e38aaadc5f65a84af7309175aee269e0153a47399bbc5f81e43142508630c553131441d6009b6cbb Key = dbce11dee7ed2a71d570fe2373baf01d Out = d98f62818391960624b1124aa4a5c49e5520a831164de025ee947e8431c9c3765ecfa59f51e5e6eec6d06cfaea0258627c28b8ddb6945843764b7c3772b589cda8939b667c6ddac8a0b27b7fbac0a25457ffed43c2f3e366c14f60 Key = 63da3bba88a85eef4d70033fdf79efac Out = 9146e34d280795a08a77bb9eba4637830543ec92ea21deeb2ae891f2cc79fd1d26da344747347fbb2bea3b2190075ee54a55fa4d4bfe3753535c61aa5e0bbf4a6d23ecf7b7ec345f0c84048106ece621a85862007c13e29725f22b Key = 63dc34d4260b7cb78ee6fa5a905970c5 Out = 7963578dbbf00723359a535e6bbbe1821b99940e388f1a4e37cbbd2b8a8f46b690de9cf8983ccbbe38c8b8d45e450a7756345f12693eb1c86dd446180613cf154c7e44c6e1a9c893a0e7a7b0dfe5cb478b182078ac913019e56a529d Key = 03bf6360606a59d72da6f939808323b6 Out = 89846cd880222474a17b8d37cf94b4c25dafa7dc2c86e470e1a5bb82e8eeae6973693a07fd58c9134b36e400c9f73979345b547fcf6ae990654903b139c86295783779c4ad399062bbdd9b86197dac9563507d6fe4365e3ec7302553 Key = 35d0778ed3521c5a83513af12182bd67 Out = 8e1bc23250b1eff58d8b9af008226533b30656329f799df1d0dfd170a16f170aa91197ce11711b8bb6c3aa68703ac889431c88df3c3865da7ab9fe07b928e0ffb68fb5e6ef901c5c2c05312a1e3d9744dbfc00582776d70acdc6182c Key = df979c72ed7521c494edb55249e9aaf8 Out = 1f6f2f5bcf1de8a552d404c2c1c308488060318aa74713b63d559ec7d459e66af4b765e99cc1f101e85963c77375bb37dedb42138cbb597ee7ef8ed0a6a298919b2a9d8ec4263ae75ca204ca89470744da42b219c4b5716a0e928aae Key = 43edfb5b8f26382eba01d9fa893c709a Out = e0df6374ae301a38b2375fe82cb0943fe0d804f055d35f36465cccc47d28f3fd39fe3f7f1875bd0c8279b8c053014254433aa487bb2fbc9538a838562b16b271fa45f46102df3ddf26e24ab1ef301a5903dd646192a060437e56f92b Key = 117e400be459e8a3ad8dea08787a6ed8 Out = 1bc6a0615443bbfcdf94c0924cc3de74904b57ac53005c86ff95e4631b4e96f0c33f94702cd74776176241d0760934d55b5f1215756f8ea46a3ec5efcc5641bea3661af3f329f385be13f9797a6a60cef86a38e33da6c0337f054540 Key = d988b2c54a2b2590b4c8fe3a5c2045b5 Out = 0ce8062f248c13b25473b59424ab87ff2346bc5c9da084e6122e5086fcf65855d90e6b1c67555c2810029eca45ec443bbca912a3002fe9a02b77042d5beac7863b90e4205f4e9ebb328d9a2bf88fd71a18e6e639e76534ae9b49ae3e Key = c7397340dcb02b06fa43ee8b470eb9e3 Out = 9718f1361178719edee51043c8c25a759d6332e1ea4cf2058eef225fb6f552fa3ab1fb52a1447fd5b5682b16adca948d98fd7c9b174c197e83bac4c93d7185d7cb589ffe2b49bb9879c8c25b88e936febc0540be8dafdb67ee9ce9d0 Key = 79ae98ee9cb0877a29b6b66c17e28b21 Out = da4d1c377cabf0e348e8407055d1b734ab842c2fba1ced7bfee9da12266fcf550400891cdc2e6088503696b84ebe6be2307e7166ad9c9307dae97681718a3fdd4735fcf09b9772199ab8c500991df8884b820f2c63b0535fabdd0e88 Key = 4543c9e6f06151e865d6b5ae75bff060 Out = aa653c86a214d56ff993fab200d453556eff2e531cb351031208c1cb8b9a594612c66e06284cf5008a5a45371ecbf92e10ff1706af7886bcac8eddf5042ae6f28827866716a5b1913a508efbc80f5e273c7c17cc17f1e02c5a356b1889 Key = b6be92ffeac8bde44da35dac3b4b5051 Out = e6cde5e95e4cc7784ce631189d0814c50045c00372d0b07c0541c7b2010e8db2756e0ccff9b3f10bfe312d4360af39de434c2e4797e39b0ff9ab30a38faaac791e6ca7bbf58ba9ed0a401df73172434c9d47065f314303f82df9b30d68 Key = dc49a889193e0116eaa195622cab490f Out = 86918a0e22d4defa3b0d79e2f7bb1cb126cff482cc89592497278497fb2f10e2b857fa602dde5d184cec3ad7d2ef28ff7106ae48f2d2d00e51c7176fe325110949ba12c05faccb31e24bd701403189a21af0d22d57aaf2625383b984df Key = c17ac143add1aa0248b909e1f31ee855 Out = 9b2d10c078d01d291c7e4b931df8f0ea21a22879bdbb871dcc823455d43f508b6c94840e4fbd0f261054e19f08ccdc60f7ec62b6b0fa1e5023be1d096434795644ed660d60e638ba110758709a5dfd8673efb8b5812dfbd0d4d3f1f79a Key = e03e900650a291c12453310530eb764d Out = dfdde877faf81002c0c4b1517b6201882aeeec7428529a1acda175ccb90ba34e4f200d61db41b455f152ab5a3fe5da4d950c5fe7228bd486abb1da756abd96988723b611ddbba6b00a47eabbfbd7d270f6fffc09600a6ffc72abe80441 Key = 47e6d70c01520668769d62d3ef3d9e0a Out = 30fd44c645ae813c877da92633e692efc24d01be938a839b52fc62e2905b6c5f510ebecad428d62025a1686e64f87d3c9bc00e1ec89947f76c04abbcce77cde07b590e03f023445b94530a97ad157b7eea40af6f61a5e390946483ec97 Key = 4bff8e8f6c673636d936c2e60e0b235c Out = 7e0ccdcb0b2768509e16f8228748de52cac312089068ca8f8ba47d4ddf73f077000b7a7763880b3efb1af5b16c743a7406157bf7400e43a11b4cfcb3b3a094561fe6fc25e1c6423803f532c700e63a31683909a6eaaae18bbf47f3a202 Key = f97cd1a658a0e3388d82f8092abf4843 Out = 872eb59d9d70b83f5d39e7de815b3bce0179b04048e6de9664344d3c64693e6b028f639ad8cc7247fc80abad96091967087f2e9c70dd202717de8e6bd8bd9f17a93928c5c172b98270e9ab41224d8577e60db4978846e54496ca2bad6f Key = 9fc3be491d72741ffcfd9f799b5344db Out = f9c53cfb3165759acedbdcb7388d7e63144d65f0c7eae56ec29cbea8e1deb5fb9c70f1d2796c900fe822195ef5ebdb92a65e4f312b588b4cf8b28073a891efc34c9c81c3fc647ba90e598e3f8151a15471bd716b029c8661b39c3b1b12 Key = 0226e31d4aa59d8c6d2f6d1718898f5d Out = 4ad124d90504a8e0c4d3c28db36e6d51bbc842eb0da64b4d13d89319649a00d6c44999fcab35dd3d1b661616b4a925bfe81b9392ed8eec1f0017b81d9425877eed43f0753e42e7a15a9c33eb4b96b217d9c9006c26df12d3ec4fc11d5c56 Key = b82c63b9b7e940269eeb55d51157081b Out = 7b9d06b952e929ebb1751f58adc0ea1863fd3eee907953cb2a6b47791a33f5b5231552e4b5cb38da4423668f3b9b042f903c9871bc6b2a5a6c10ad38efb7b23e59e3f443042662f47e1239cd2c44905f21ddd07505935cf2a016a1540745 Key = 4127250fd2738463c4147d299b4ecd7c Out = f99c7f56657824a577d0e341425a95d9c35793075a359433064ca004ed078d4d363f0d50c5047ad9a7579d5a9e469c8eb200fcf1ddb7690e87d11ed4e5383c334590921c11206f157a618bbde8037622f13aceed9b281b2bd7265c782b81 Key = 87a65a7b0e5d863d3acbafae5a4cc9c7 Out = b25eab758604a7c4e1f3d3a435277d12a8a86b61573a2375fb90f2acbb80b84006d8a24acb734cd868f5d04a9e537522c492587276cdc1d574283eae58dd51bbf4636ea328311264e3404488e9aba5c860eae958f80a665f46a9a3b06be5 Key = f2457c380ce6087cc27c5e7626a13a3d Out = ad37d7b12741105b2d783d20e29a2fc620aa4f5d39198360a9606842404d82a690f1934ffdc63efa17e57816e0412b93b6ca2a127f0110a37b79255d70d9b6559d655582d11bfd82939dfdeea95c557134b8a93e87af91ce0b4119190f31 Key = 3c4b7eb4d5969aa664f884f3a117de00 Out = 7075aaaafb02f5af3591b1da41b41437b64a49a00bea28270c4d8e620c458a765deeea46f318fa3551979239c1413b47daff72537789fc533b95d272c16f8e8580e44b0dd978ae7438cb6878f0a1235f418d07214e5c8c9b2051d30e42c5 Key = f83d0c37a194599ec17436ce1ce69bb1 Out = 2cf7d0ba7857c31f8caf57b27fcb25ff1c2b9cd230e79187ed0c714c769aecd8dc190bc18df91d5a94621ed17dbd4b2846eb1169697b1d251ca27ef07c07d62ad7a97bb4ee86a0cbf0f4b895d97a8a45138e711feb612ef066c8887bea16 Key = d95867886776f082fd694055756c35be Out = fc229e14f3ca6162113f4e2a6ea9a2af9f7126acc32d798a966da33dc4f6fa231b6cb338076028dd2a1d4cfc9845c9d8d0891dbeca5be6143eaa08ad85c3afe33fe4a0f9ea522eccf6d29b407d8f1fa989d1724329e8051cf151009a93eb Key = ea8122bf586c0761c478323686b051c1 Out = d662b85df275e45e42eb7c33015e4d1b30299e798cef08d5ee7d9de3e9e82e702d01f33fb3d7430f99b99fe36970307dd85d42abf025cffa7a70dbf3a0344791d7b1cb452f1a978d08455eb61114203e2b8d2d5d6ae1ef8df9caab3c6772 Key = 40a00772bbef188010b4b9096bfe0fb2 Out = e355665cc5d35bd12523cb97cee7718b1c7ca4e9e4c764022b23f1b39fce986a5394a05cd05bcfef0b82b850de612e8268a2fd3dc186cb6d29cd0810af1cbb5617d8822903d42f4995b3579a11dd890a14384085ccad0c34c7dbeb4bd4aca9 Key = 8e0b06f2020559773b451af0e25de692 Out = 43e46d8bc4afc51c50a096da3614f7aa0d1a3b6f3ff3d1da9efdfe8076d3db5c06b156e31e4d9cdf5c6cff8b74549af48232c128fdfd645c06a648555c2b094610a06efc24275531b0893d7bb17734a70c12414345227a7b4c47b28f06e5dc Key = 2c4647ca622566738f60b1e194a330cd Out = a9f641d7e5e4d0bf8891b7469cd51d7bc1133057c0a114906cee5ea0ac77a7155c53e486d6ec54113abc4f33b12c64aedd79928107ab30f2e46e83c18f651d51e2f6a0efac7e88f5a7d15b2d09091669253ff23777b08910ae4de11b7eb840 Key = 8af542a4d3b765385a97a614264f6273 Out = c145081d5d14b30a37e8275730c32febffbd23bae390a339908d8099bba5412d8c0bad0a579c79de2b44d6dbbeff22f42338a16c2e1251e5f9a0f5bba18320632ad9c02f35812237a7525e0c55ae9f74da353d28dba015b665e6728db77302 Key = aefd329afa04993117493268a638cca6 Out = dae4efd55b15b0525afba52fe0c6a1ad1a8ad163bad7df596f74a55d525ce3fbbd643a87feaee45fb436cf3bb7378c9f07bcb660b50a54bfd3f9c03272bc2193df3ce166e64e16213a034c6812f3ae15b4bcc8013deae67a46e90b204200e3 Key = f62de39e0c57636428f5ecdeb59e4bf9 Out = cf85fab95071106c6416b0fc20ed36e6d0f19ce619134c011083c274fadfa3ea7d394717fbe61a633eb521447b2dfe7b30643c7622e3bf538673d713109e108242df57e89af7bb873138fe71f608593642ac86ff54d4095b68b1767c99f002 Key = fbcdb8c3679e4075b9b80530aabeaa5d Out = eac9439eacbbe385198c6639c524c6e90b09050ac1c8e608ed376cf0ac660894e4c24867a19b15c2575ee64ff85f112caa895a579a2030f1a6b052b9c648bd38a7650f690786b8858f0a388bcab6d2fc77ca8ebc06bb17d6ab5a4390c9466f Key = 516a274984dee209aa7a263b5fb98be0 Out = b916db19c31e52d2a639b84676b23bb1b570f786c305382fbfeb78915f1baa8b7190dee198810ac0a5856ed800eb1e5acdeda8e0c5b8c5c965f23558fd6d5c6851fc37a75f08c10d5ba603fcee29a21385d6323182016c8a5e6380cb6e5870 Key = a0b24a038665422b20a499276a504270 Out = 9f56cab65ffe5283ab19d8dc47b7e66ce267dbdd775f166d7b27878aabba4f92b14ed234788b8811394dc7048ef6e4eff461c596fccc2c72be0fc8ad863c9630cd79ccf53616b7b62e15a55454e54616606f8c53ffff9c4d147e70a6fac500 Key = 35b09ab700bb7766618a6e99c3b34a3d Out = 420d9d05a91160186b48802c99e62623eca07e3c153db735ca2e0ebde9c1b97cd0b3b43df95bdc5e5490450926f736c494015e74fd8ecc879b80a3292ada05ebb2a332567140004d00dc585cdf186b42dd34b1a11b7ee5905a1797ff3a92e866 Key = d0a2cd13dce21f318bf8b428c33e523b Out = 9f8782cda197a20515a206354215fb5ce3d310307848e6c472ffab1a2663cccaf4ac540874f513f22384d9c821671915eb3a510c1b857db3cd490d0e7f356d9fb973dee568b416402074060c86151a5612c2ca9fc759e1828c68a08838c92730 Key = e7b5aade78b9b5b8419b98b49bdf169c Out = f237bc9d1531e56be09dd569fe24dbcb0425d319d01c0a3a8d68887281a948faa25f7e775c434add746e1fd9c2cca746e49fce81dc72ab1a7c8b6ace23dba3f28f3e7f09185e784057dc5be3d9fe09a5defcf7f90af2b0dc09c0256e291b6d4f Key = f2259981b060c3af5cf57d581fb56474 Out = 015e1a273921d13aa14a0fdf44300b3c7053a913f1c01893c690f94e9655ae9bf98f08299ca8f3ca8fc2c7a5338edc166c1c414ecc03452337b35709837e53baf05916d13d816fe0ed024e150925451d7e22797f4f7563cdc176f72122a76e40 Key = 6832b7adaac918587c17258d0c20228f Out = 8b6c5e626316100d9bd091a23447bd4fea16e695f88c96ee8aabe1f26d037eb344601bc228927febb990ba2d7ece2311ec40fee70907187d872e34d7b20e77bce771f8ffbb809034c8a6ca0e77ce1ec489b469cef85e516cccb3e6bfa770118c Key = a8ded9816defca8327c194a48a88ae4e Out = ed7397b2215c6c412bf444b1b96fc55c531aef025c6dd13fb4ab53fcc20c91917d82c8d6710a8d7b4c24d18b54150490e98ee01b4a4b9790d1878810a8392d3fa203b066327c0c67cace3a08c57d0d30b62ba43121d8d715637884f055c55ad6 Key = 7d3084706027fd271b9cf09c10f5788d Out = 3814484d1316a06f6ad466f9ca74dafe04cdf7ddb39931f9a20aa036c101f2ea9f8c1dd447ba3eba4d23e5f9f27cc2bfb38e3d123b73d7b8c2f495214ffbab5419e33ff3ac5e6cdc98a6b33cf87afe238dbbc30f08d99246c5a7196afff98489 Key = e90885359d2d90e26a87873125a19431 Out = 5c56b158ae664a4c91e3dac83a9133f79c526cc9f4d18effffed446d459990eb05057aecdbab0d73e06576de6ce4cd7414449538cb5308f44b32824efe8039580b3b7b7b6ac32b148b502989cc214401b98cc6454552afaea10f3b9d93a248e7 Key = b46abe8e27f1c3f2e443781300a951a4 Out = e821b757a34f90be1e210b4e0ad60a3585018216d54872e614e7f8647102d4e50968749d109caaea13dd5d5486fcaa6b1953c71ad6492446d38cacac908f8f67420d6aa27cb191a9e2ea7a62c59b5aa359cf7d61e550d31876910d87f07a1707 Key = d8ed3f491ff1eb57f89b90c2eb6395e2 Out = 521122e9c54a691ff0b1d0821ab8bb4c7c24cf0ea3dba6cddd36654198fa32c7294bf00a17e8cb6c1c747a720aff2460fca9a6d5899a298f184082ce43ec727ff7044c64dbd9a7d20e36652424b3e8f806e818c4da8181d6b35e6de5c5e287291d Key = 594970465717ec638b1b4662a3d64af3 Out = 4fdef9fd37b160be0dac8c801c34bf91977acf7ecfc12c3a3899599b480802bc2fb9cf69acd86271541b95716600bce499d5ac64bb557772fdda3b0a093571cc77ba9fd4796b3831fc86e385c2a6c126c084af60a2fdf5194f2dc08e0e522b7fdf Key = 2ab3a70f3b01836d8efceb67490c3c38 Out = ca7ca55bf123aba45287268c4050ab030b1415f4497d5fe8dbc5386ae37d24384a2fd6a715fcad48ff9e810c1d378fa70f1503767e9e338e33697206f863dc8015b4d1e9b8f81ddee22aac59d52055a1b0784a364369cc50f403045a1bdb25b639 Key = 095a4c37e386db92fa0a2e396103ffd0 Out = a972c62ff5b162006c11504dc86390bebdcc7390a36fd48303472ec827e1391ebf7ac988fd222907d6e8363f7a1e9a8c3a07a4b88d8c688793c7211a0e2d84739c8a0ed10744a06af282f160efc57c94cc48703262f6c021bf7c7ca717107cce05 Key = c60a221c975e14bf835827c1103a2906 Out = 0db7f7196eee8dd6994a16ded19cb09f05f89ccd2464333df2c017c6ca041fa0d54a4832a74ce86ce9b41d8e523e66ce6ef9df7c20aa70e0ac00f54eb072a472ef46cf2a933df0d5f9fafab6388a206f6bd1df50b0836500c758c557c8ac965733 Key = 0a13ad2c7a239b4ba73ea6592ae84ea9 Out = 5feaf99c15f48851943ff9baa6e5055d8377f0dd347aa4dbece51ad3a6d9ce0c01aee9fe2260b80a4673a909b532adcdd1e421c32d6460535b5fe392a58d2634979a5a104d6c470aa3306c400b061db91c463b2848297bca2bc26d1864ba49d7ff Key = 0f57c984515f870abd61eae36be9e28e Out = 0c17a085937ff76d8ef350679d7cc9d7ab31cb64a5f5f7cd71cec3a019b55a9cd5d33dfbe3617b879d6a923dcfd2169b47673dbb275a61ca945c976587007439ff15120ccf636814817b17865cf97ab8b9496dec7cf39fa87cea643cdb7ecba01f Key = b62cae6c9467bd3f5b9005578113d617 Out = 279f229ca3d66b28062d9dec470d659ba0551cf3b3859216caf8efe673d33fddcce0c3be71c68297f25b6af63d3035e31d1125562f93060ad4a27529d59da206f29f7e410060b28602b90cf7cc8e0003305b1884e12587be1a44c5a30e58dbb99e Key = 414701e1cb5de7f86b105462541b245e Out = 6a5c094c0098672e81ecda00188714db072f9d22bfb0a8d3800f58f015916143664ca0293c650ee0f5d9daebc65705d3787bbe126bb3304c9cc4af4a9080add283e63d19a2ec37ece52cc46fb2f81237ddc077084ecb80fcb2564215307cdddfc1 Key = 4bbdd6ec7993700d8b3e14749d727598 Out = b220d2a87c410cfaf64de61394fe36cb881c30c9a5338ab91737dbb8b71d516aa2678e55dc390c418ddd2c3d4d581065f0531f290bf82af3ca586a75f5c8259f4a1f15d253262737c41497f95843925d459b6ef4ae86e2aa9fd182dc954b2ed76564 Key = 53facdf0e84ce8a7e333ebb99e721ba4 Out = 18d04d4fde049c159a350541f478e86de0da52921e20be0e0a684dd2fbc4234dc10245d8d86d3909b029d4f6663cf54f9d1ec6a6dd7b8ec115c6a21f87f271d38fabcb28a1fc7e7a04961ce92b11be1a11a3b161eca133e602c5afb64baa9a3b6f8e Key = 8ac3fe4c529e116261c2f2138dbbd163 Out = c6072a836055313f7be49e0f13da9a74dcb4d8b1c9875a9b9bacd12c62740496402381020c575b48432d532d03774156e46302b4238c5569b75738e7875042dc3604d4f5e4fc0359cf35c28abb95ed6181f4dd9da758edc5620f7cbf4755a3371611 Key = e2423888aeeb5238ea996dba22efaa83 Out = d41783451ae576443c24e66cbc38e152d77a5e7ab837516f79642418e748b0268f8516e8b48b0974e3995e45cd16ddd61546c11d9ad8de41275493f42b2f56e7755ef80a178ebd93585f4a63ba71b11cc118c412b8fc66be0dcf5794ea7ab46084d5 Key = 59a71d4df2975ba3026ffd8060b932ec Out = deece278f71ab122d376fc050c6d3eeacc31d87b4e7788e57e0dd7fc1df1431931175313947d2e7e16d954244c8d67a956129ccfe5111dae58d82e2d6da9206a55ae1dbe5fad38b3a1a54364e88fe410c282e9d18d721ce8cb78667fb9525de60e57 Key = f7b207265f25f1de15aaaf02d910a4f2 Out = a2201f30d66fc165e39bc382e3bfed1e775323045c06f87fd97644fc06066509837cb7aeda41eb46e60ac9bdc3405c47e32e86b1df0b65a18571e46bd7874f6c7d6badba1277c0a466ba31c8027c8e05f750aa1c3e96a34cb7d32f4e1cb1cfe46249 Key = 5fd4e5d743263d2a7c25760f525325a1 Out = 352a82695a98221b5ee3c0a1c9b367f3faf25f9bb478e3f4ac93343019c58344fb1f8fdcc8f749003ab4025b8fff6f9517cbd1c992c09af5e8c5c4ceeb3c32410dbae2a3afb6393fe72484cd2df228e25abce1f7f863e86902116a022ae63dab47ed Key = 8cc7a0ed29f931ffe2481a03d7a1a0fa Out = 0c54ddaf92ff0f7fbf52b2928b33d04cbfe828310bba46f6b55167485a6a259ec05878a01b91a325993bb0da167284febd049667a66d0262e6496b0004b997f49b406cfe0f6442aca2d353e090ca63b1e359b1f18c90904c43db24544e6e1367f8f0 Key = c46c02445f99bb9636f15eeeaa5dfda6 Out = bc83d96b4dfe5cde802119930397fd19395c310d1ccc6e0907d6842f334c2bb79918628bc988f3bffafdceec39bddc950b26e2e5d73cac96b8f111e89949940bb7ae3671b66bdb80604c1d62a3a0f7358600c79b4ef27e2d8e0bcb586a8901c4ad47 Key = 3638ac940662a2968b69092ea2c940ca Out = d21bdb995875d735169d50122f485865d5398dd9c00f8ca44f89f01dee0b338a1b98218c3300c6ef63b5e265a9d2689f8b6b9184b755d1c097a3761113ebe6e771474a92c26fb6ea72c5b09312fe1cad62ed0aa8aeee4ea4533b2244cfac19b286a4f4 Key = 344865b2cdacf1295972a05c426dc7da Out = e2d1a4d9def540728e331ab40bce309a82e213889519cb1e36f6d4b97b72eae371122689cf58f74ed0e02205684b02c4baf23993ea020f60376956bfc8cdeedb710bb5f7e6a0e7d5f760c18e1109a209a78d73d0b62bb2d52b4d87e638875e72e77c0f Key = 7af104d3fdab4fccc673ca1ecbbb3558 Out = 1032c794b4a0cb50cde2edd6503c05f70902415ed39554ae2449018d6ea3f9f37deabf59841caedbfe2a588b785ff4c6795e7959f0243c09e7b8142d9c2685fb8e14eba8791f3b76ea59951476ba3798048dbbcc8aa9fc4623b5e9dfff9dc7216ec1f3 Key = 117a53bd0b2e8d4de92d07b664d9ec8d Out = 9a1b061851945923d9e3708cf478d916f0071e77f02e67e9878a86d2f4431b6741dbbf458939df528ff1d87407287bace42615da3cd1289ab8331db43dead27b2e37e8dbf38be77f9d852b11963f679d37c467d86e481a23d49d8070d7566e2227da32 Key = 87731049e003d2ed7601dc08be9cef62 Out = 7ecfd7f4959a4766cb410f7f0d8bc492ca2dc67c0479077ffb4409e9a09d3afe6981a01dfc0e91af4be6c4f91a77db4e850703eb5a6a478f7eb12558d504d7b2daef43b0e4911d0815ad6417d6e1f77500eb5f37dcd9f52bdcc927a9480e7420435d5e Key = d17eff1382dec06ddbdde5d74eb31570 Out = 3efd24a72ed0c563c7cb18f7e4c3241c6ada3ca9720bb09e38a7a34e8b73a874613572035b023b8db359993fa3a75f3203b7e43680fc7cc43a33bb46e63cf30fc525f52ce9f0ddde00f2d1456455c1dfe9655d5af40f1f0fecb88df69ee1fe6c955a94 Key = febef9c519665109a7f05a3d61fdbfad Out = 546c749e5f2656c4dc946fcc0c5259efdc66940088521891335467b7ec075ffaf9a0d63d76705f601cb5121aa1c34ab33b5789f3d0566ab790efd4f819ba824a5d9d1411a98ff2553fc38a1b0c57eb40109286c836d035713a57f860aee043d5c690ed Key = 062b3a066ad5ffb1b744ef664ab176b0 Out = 76d80c00380916abf175400e3df75da83f6347f442b7f5c5641e6f50ae1a4d59e1ed610605e943f7077c42b362226beae1b17878356330cf793c4a9e914192045ac56491347812f411e3316198df06c3fcb801450561db6f030a1a955631c7b80aa48c Key = 36e979be403888e229c356670b0bf56b Out = b5ab42cc7df6e2d683ffb420c7495b9e7029540968746e0273680cfa72fd9f53ac4e1c238c121b3e1e906cc118a2d05645378eb549eb7b7e58424c37bb50809603f6c0a2d60ba6df7bf3d3c516089da07d3d2f2355549c9a13371b18ffad95ee19b13b Key = 50fe04f09df6c01763377f8d24cf6bea Out = 3e08344e9d7a4db49cccbf8d04f99be0b9729b55afc65dcc8ac3433ac2c9c85a9db96e4d8155e30c29a73bfb46b58ee9c21ed15ba3828cca2d87eddc13d7252cbac494bbc4508df8a16c23956edb40f13acfddd74cb78aa4a16335953fb17fafff80b7fb Key = c9678b57b7fde91ffc933742ab80c2ea Out = 972a709f9a65cc30584bef5c512f91afaaba9284d9d9f22403de91ead2b93075faf529abcea7050268b54cdf452931f2c5e701ee84e983eb3f8c8f4d4bf6476b5f97b84548150c3b9d1fcc62bf0836fea05c8f9b3918f3d34a9c40e0fc5b054cbdda7ce1 Key = 66ef4bc26f210fa7648e1cbcb2455d10 Out = 627a66bc92bcd2af1f6b2b2bb40860ad0037ae48f20555a4528e2919fb05139c3084df345c698e100481fc6f72ec513d4ea574f78437d6e630a810434ccb0650d68cebbead88b5740ec03d156e691fd295fa76fc15f45c30fa4faf7a8d53aa16a126ea1e Key = dc07f0e6276a3aed9ca9e6f0bb119b4c Out = 73244620b09d42cb37034d128ff8ad7bf1fc48769da3bdf7769b559c9a5ee0b4d5d4ad602f8e2dbc73c552664bcd4b49610c0803a3b302740ba194e4e68ecb7ffee7a245b80c267abb51e348b08947ed97a0c30234f15b10beb6cee7664d6aea6c98493a Key = c6fbaed025a4a26c2e352c5039350c52 Out = ff902dd8c0ddf462f895c457a8d5906fd374f5eca50b869dd512c997e06ab4f8aa8e0c17985b4ea8f8b09890fbe906e430098815f1d605159f8c97e22c1ee11e8efff3bdb0bbfb00815705628295ca393279e538f05e3b838713c37d4531af4cef75b33c Key = 3244be36481072120df758c6f66bafed Out = 43889707c877b78708ea1d7d16f0fd716b8dc0b2693e2e1a3aec5154ec6bfac8cd980e2555cef060c40669cdf2434da2b2f93a4742d36aaedb6595317de46eab7e395f2b3b56b747a852d677d01b8316d182889c6d5b3749cacd48b646fc98da0b3860fe Key = 13bdc0a26c29559f87eb1b6818b296c4 Out = c1f181931d3b6b037d98f9eb0e417d10ca972551cb722e5153adbf32cc59d3ea72688735b1351fe7bc054acfc08ee7343f364c1a7a7c1aece71d4162efb348abc0b5e3e43ce24154c2a5c60da639750cfecb6469085487ccfcf76255b41b87b68db8171e Key = 28c06df4ebd554115f4fa03fe0eda6cf Out = 5172925f6e53ecfd84c76278e0a1ff50da67c25e049374b1c00e7184a9ad935b7efda368556d898ce41a3dedaf4ec316e4f02c4e256ed8122438fab43f9940c820cf16231b308934b64a4eff7daf532ee1c2c861ec033d15401db4f4da13f41aba80c9f6 Key = 474384149bd275a8edf219f1ad208603 Out = 98091e5c643459020f725633f68a2934976325ddf145d1793122703bdbe65277723a1031e789356fac4f57ca2d0e9ae19984096ec9c79dba5ac6817a697c0a7626378dc46be459379c93b67071e6f59e206cdf0d659366af464a5ee7d2b1fc56100840f5 Key = 941aebbf1d5fb5d2d5aabd422708e736 Out = 55267229e80edec4d9601189db639fe72873d36e4111c79049b817aa5de6aab0a8b74f146c0fae0ee40d44a973d7dac56ed75343d6500a5ecacde651c9198cc0cda2494cfa13f8230b77b865f2fb1e3585a0a961c3b3df2ba16bd62be17476f12ceb093244 Key = 767d93830e8a2dace93b9543f8cde588 Out = 3bac9d64522da9ec59dfe83fd31b55a4d1bb13b47953ba88a28b1f8758daece0d65f45cc53b15518a20a9d7e0a8c722e7065ecad9d8e16f38a62bb8897d956b250c15bb06f9bea0d68cd2f22b6921eaae308366030a8ce13b889f883cbd134f946b8bd42d3 Key = d76721a62ec03e15ca71d7831510bccf Out = 9e77b3600e96741830c33114e5be2f34f9082f56ccba8be31b88e41364f91cf2877f77825edf6f98707efe6cf9bf0cf056b6913b796418fe5e1b186ae748cd228eb54fafd2ddf6e1cc0af304522f3c8ec647ca6e9e4497dfa184f3693fbfffe0e7d326f527 Key = 535e5a7f716d302c1a9c687f79b8a262 Out = a0ab6c226d17a1185f90f40bb0d8649c8c7c0d6e2c5a87dba8bb059617d0ebdf3330a5c4b8a6471c446fffd97a83131c8dcca89d4583d360afd1f9cec3e0d5f84c064a72f31393b5ee7079d18eae9be71e8da3ad3b16fe87c9bcdcabe96b77630db717ef70 Key = a5e211822298a2f3a7c528780fe5fe94 Out = 3dc2107a7477f995baeb27a0c3043d0dc09499e1608361d6037b7ea18502fc913aad807231d5dea7a221625ebde0216abf9f9af7130e02b9fd6077985e33248e9d3a0c1cadf6522cc452f1bae924ff7ceef450d7f72b63320a31032f121ad37278f9961570 Key = 719918660d97edbccc57f50ed7703acd Out = 054d82d71e993b23f230836729902a2df897fc8a5c0d5cf1c458b83b0e9365938e3c7458dd75545c127cd4df33768158359aa629c1c70ff84d0532660dcf87979ea8a7c373fbf61fb44b1bf287734a8630119df2566875236473892cef2946b5926402476f Key = 07946f0b9de486eec05dbda3cbf7f913 Out = c75d04873e3b604a1f4f646bc95c10970059ac0d36b464a4b2a9534609a0f10e38965d8e1e82c21a250a43c69489253d43e8420e2a8a4f0281defb9e69619dc92c72ee1ea0ddd64a220c719d35a9a7db703441d44bcb3054e930d0ea56971d7f888f3d5aae Key = 8c9a42fe1f6f5747ed484070048e114e Out = 3ace1cb2216721f45ed1bd103c2ea9becce2ba7e4f8cec50543156a0c102a144cbf443801c0b89c8045a114c974367b67853987bbd80655e22e51bf6a673720ffd7938b62e9873fa170aee3162944a195dd679c39c2627a7f7ab92296c09248cf7a088db93 Key = 850153403ab7f3546259018cd4efb64d Out = 1f215477e35969dfd5e37a9deeedbd6d1e62a60d48f711ce588ff9adc5ebec3b10cce7cfba7a0249b82191e6f722dcd2e1e18b9b9a27f8f132781f62a3d8a90773b5c68c2af970b5eeb2a0cbfca52bb05f1d5867e375e5ee9cfb441992f16a5ed341194cfe Key = 13af457098d20013733c1712f28df929 Out = e5f79a7167dbbd69bc5b7c767860841954b5cb696fd00656b390e4cee28f3451ffa09e5f1973d4674538d40c254058804cb572c31d606ac42604901bcd8cd4896faa01fc6a61a52cfa61012731c0e934cc7f31567b4db332f84e0849a632811e3f8236554beb Key = 1ebf94ded5dea49b0e224e80fbc27a1e Out = b10d26a03b57ffe8267d92e53d3d7a799a46f758fe507e4af6b09f0ae4326dc8e12a6a05eee2bef1336e13050a720c136067d76d1500eaae3ec835d4f06c79ef1dcc5c1f6ebbf5536714ed1983623a135492995d851351b8840fc27f486c28bcb9457fbb33af Key = 22f14d90acd941f2172dc90803183774 Out = 2f92f3d218a54689b85b5f0b2dfccbc760be1764179703db424070978b3d8f94485de2934a7781ea79b550759c099746430ce5fff10aec1112c06e35c98ce1038d6d42ed1b7bfc3f496e45506ba758ddcd4b74765bac13496488c0621ed79efa45af659b8205 Key = 96ed480399f44039e3903b1232580a76 Out = 0bace09d8144b94e236f4cabe2c468bc3130cd836526c4ba6ea389800dbbcb73c12738ea94b38f28a7b5551b141db4ef619e54176447d89f7b908b4dcdf8a2d03b7c893ec8dfb6ac6343713da13e67ee14ec7cff6bb733a72e68f802e7b71dd3aacb12e2b0a2 Key = 49d9102276d0f4642b7fb8ddb25a182b Out = 1bef499c2d04933883235817a2ba23ce8dd918803b647d1796d9e47c724f5a0ddcdb248884a16dcc4eb4e4d584d8ddbb9230fd39c5436657230d8541d4152306dea4826cb55a8c6792b8c0fbe006ddb818b8535294b2f875fe7ec6e5d34c6941de500d9b61f4 Key = 9454c9c1832f83ee2318b0f0c95d761c Out = 4eeca4842f8303e3518939fbf80b8dc123704407087d6f3e7589cd49eaa5deb34e95f778ebae62b043b51084ba8c954730ac68b09525886034ecc7f2860fae169d893c5ee025e753dfdb105f28ffe3a01c8b0e5f86f6d807316e52e870d4700f1347551e6ef8 Key = 1b6ac54d9af64b82e9827cad693dde10 Out = 2e89dcf7bdd1303583aea92dda6d74ac4b3b62b534b17bed75df2ee5a24d2cf284f6fc54f83f121df396edb8d0925d8308ff9378016774165a90ec338450e9ffe979f071b499da31847f23c31e6ebcbc81b81ea508ba7450e88b3a2d1e48fcd57edcf115a906 Key = 530b34756f7cd9e9350cc8807f3a55d2 Out = 490c0292d0d84c6a53dea266e37391179cdfc9d23b2e81dd71496015c1b0fba489d2ea1cfd7c10d5c245dd9c60431de3ee6526491f0ef8af0afd4afe096d03324832f5881c9db92c3c07f20b66315a4b8305ff563f81095addd64410a6281cb1c0d6f11626df Key = 126305cf0d7022ed92805181bd90affc Out = 70de3c25e0bb4a3f4fe2ed1cc5b963e290d7e18c16158ff9f06d1d521b6e3deb8c87e0a9be5e8d5c9b97f80ba1c4b3da4e40d20660b7a339fa7c11d145e07e392e795b83fb0d4d16e5759173d031cb19e82ffdde8f9f1ee345e8e0dbb8f9450c7a304f58b904 Key = 3dc12debdcfc756f81bf57864883fefe Out = a42dd27202d07e71657ed9c1590ca2fb61f79713e35c4b4f106b6cef8949d804448f0da7336d9264919ad5e8c21f9ef7a9ed57ef77ab8138b98f895932474dc731b7c75a64eeee2e2fe267f790c3cf5a063a51aeeef339983b5133b254f5eeed6cad9a2576a649 Key = 09bbe68c5632a52835bec9a932876913 Out = 1683c8f279bc03e1830a21d4c44ff8a005ff663a5a7d4fd4a636b37722ff5f772dcb8b4ec7ba3e3405d6f558c5b5983976b4b7dc273b0f174ab75b5cc95df813e125a58c8f4e5a7d55fd8be2ddd02de52c99074a81c965b32a813be32b949a8dc02573fbdee5c1 Key = 084fc4394af7c4956946171a9d9f6466 Out = 2ef0e907affc45a8fafdbaeb0d6b7c5b79c3e9a2fda337fbcd1a25a77553cd18159d94e19bf34a88a2b6869d58fbe38884b709dbadb31e62cd0d1d5f0fafd6b8f47e62c3b2480a9095eeae5581d2a1c3f9eda8251b9ce337e12a242597fa842d4119ab03093eec Key = 106ed29ffb8e162a9c29045c4993b4c3 Out = 6e9fdb64260c1571388d3fb69d16bad057e6596784b4af27aa095d1c9fe810de61f39b259d5412ce02f22e64d6ded95f17805766681fcfa1c552d14ef78fd2cdc265c9643270d05150e4d20405f8ad9ec815f777f29fe19820fe78a2ff00f2c4b566bd947abd8c Key = 16fd337fbfc8c2475193185c0db111bb Out = 395e0c2e3a799317ab02fc19980dea3a30e4cdb67fbe46be7fe6321ea2278c6aaf182f8d932811d5332da0b8db22bb76df5443020aaad83acbb0aa41492c496ae8532a54f056dcaa7a6510a3e4d3412d5ed56b93749f59eb11fa5d14993f14f5b14c5e7218b6f1 Key = 6b5ed6aae8b2b7aa3df27829bfb1ab7d Out = a112f5038d23bbb3e52135cdd8b910624c9fc53bcef2ef38df981412fd34d136cfe164904a741084b6af9073790a9b5371e75501cbb70bedf06c083cfe940dbc531a5c3f7d68ee5e9f12f9e35858db3bc7ce42557efa74762ce6a6a67a13dd7b05e71baffdb552 Key = 89cad8eedea2096e624caed75cfff040 Out = 73a780a5742e564715d03a06f9a0e072c83bbec01413108f071c8376000bf47bc6065938c051ab2e1cff1d62f5d05e8563e965632292983f25e4e2ee62dc13f845363131b06f118da1d615bc76c5caa3c3f9776d9ed75b88ee30c897f042eeefa7be23ab99efd8 Key = 8213056de909def07c41a497d96f87e6 Out = 966714b5576a4f01ca1e1ce314b0712cd3ca0d36bb68ef0b21fbb96fd164a27173900985a476bcb3026e2bc62705e29e74d671113feea7d701611579bb092dbf79659e9403a6088494dfd76aa7726fb94f9a1d174dd19e0e924ab6d7f718e6e84031f61a480a69 Key = 68727636ff38c0ba8999dde3cbd95039 Out = 9b8eb393ffdb201881f2eb7b427dfcd6ba104fc64adcd44c3417c79299d37c0b9431c48e35a6c42ce3ecc8bf5780546e412c5dbf8b8a697e6dc6a8f814d2d7f0e4513388d202a3e86d6308262a8750ff116bf49e4896c8f46792cdce8eaab3a7b6345dc5ce4dad Key = df476aa202f8486eab12f8aa592d7ae2 Out = 1c2552a29df6a4a6b4925de9d8fc11a0ddb7fb87c6541443966cda1452f1166b6d57925159a6d9c6ad82a8aba2ab6d3540851f188398f322c8110f42fbf2ee42a1d1870e3fb0dbaccea5e915c291f117eb0a5a75af5beda20dae3a80eb3902cc8e8015eba366df23 Key = 3c2aa1e2dcac3712bcfcadbae94b871f Out = aa8997123ca64c7acc426804b9fe39d31cfa66c1f6c1fa75676edef8e652a4aeada79d6d5423c4696f82f5cdc309ce591b2ec831998d42e0129c31abe9cd23df294296688df046d561c626fe0688c48cb3392785ffeaba23ae646879aca823e0dacce6ac4e8e516d Key = 14d7bcf2511f204ee89d2218591d6a2a Out = 195aeddf9a049e8ff2f400ddbecc7e58b81d90411444a0d19539114f48f16130f2521302fd00da26acc42be9521db6a23b824db00bd3bec5b3e4b73e0adb861ab05ddc4a3c515d5aa06172c1f95c21778bf605010b26f7b70bdd09c82353f0f5d5c779b98f32d5bf Key = 65b1854cdd6744ae1eb66561fd6a9436 Out = 1c0666fc78895eb5cca43b4e807e6eb8fcf8c090645a409e4d157a587a9355c9955e909e8bd223902a87935f6dc0e3fbb8f3eff77640f6d50757e3036d7f82350f5bf8bf82c13debe70e0a4b903fda26a1cfb260e326e99b14671041fbbeb5f826734505a376722f Key = 6cf84f069bdb92bc3fdffa66d98cbfef Out = bb89a5377934c323efc5a0c9216cf49ade493a8519d0d92bba9d92bb20b2c85ad1856fbf959c38a339bf6e14db18fd2888cbe63decedee2377621a979c1f01a9cdb6116055402b2d85b932c3e6a8d68a73e69f27758a05d4ae1e5bb9b292767fc5d642fefcc0c86a Key = 7570184b5f8698c15bc29cce2ba62da4 Out = e307fdcb26a5688586eced3c4b96e2729a2efcf21cccb4f7536aff595a181d15b9ee589ca4e11d2dcad2415b7517f6313c82e57978a12c9598b8bfa10918a3cccc6d89ebe36e0478a54851c5d809b20c1814117575a19b7a09452600b2115822a0a95ebfbe451529 Key = 8b4e035d940c79210d8c7adfcf91c821 Out = 2920751e9e3861ff556ddbd24a9cb428caa9cec21cc26fab46d245863cef79da79f707cf1ac451e95f71bb4e3319201aed2ba1c45cd821367095c9c1e83ee17af65647dc30086ee5173215498f6f881b549bc1a45b6498276ead9bbe0a1bc2b239dfb479afa9965b Key = d9ca7043ea404b33ceb5cc52cfd53ccf Out = 6c598c2a3a8fa42303a237c4f4d44fe11eee354f4fca451235e3a7c435014cf9afea02c8116001cefb830226c6a7ebb6d63fab4c600a001942034ca77d432d26076a9f4a67153281f27cfad0c642bed981fcc7d8155ebae9e61b67b3ada996fe94092d4d81325d4d Key = 44c9323bbd117a434fa51f6ebcce976f Out = 6da86339a8f519f19beb2edb2f49f1b86f93bd543a055b2df5960cfbcac0373735faadfdd7ca825624c1fe61809b08de6a2dd034882d56dc22d80afbf5cc4e04ad6015fcc2256c9afd851e7ebb9a22c8906cb9709fc9ea27d07866c606f8b9a2a8475f272a5998d1 Key = 2937174a6a4d8e0038565e0ddf3b622e Out = 05a55ecef716281d434282ea5029a548c62681affeca3db2ca085bfb44884dc9c3f12589387838d9b25bf5b168cf89ed00d9cb2c4b244cb7ebc03376a9c5994a49021adad8b8b1769db2fc62ae9f7efcfe1f9554b02706081fadaf83908da468b6a627fd9fc784dd49 Key = 1e68876682b092daaaf3dff595bf0fe3 Out = e83f0db1bae5dc6fdac59ceeb06d08195f82a77ff2f81167e482a43604f0dc24442819a0f41735cf822ff50898a2554532dd7638c26f8b17a7cc331a9b5b50842e5f499872440411d558241dd561b960d300693fc9a330a873ef38f2865e591ebd8362f677e12e78bf Key = 70ef2bbde7b4a0567546785fe59009a7 Out = c7a5835e30c14573fa2530deda44d9a23de7c7b0cf6ff4ca464d2406f04cd7b26e250a53e0073d74a469394b5898d8e565e28e217a8f375a880136f29f3ecd222f19899e83ff2ebe72084647fff90cb1c43c7ac7c9ea9f6421e970e309be4c4725608b4f752696e214 Key = 8e5b32e2669392f4df60c3d32bfbb209 Out = 35ed88ab99bdc19ca6afd1f6571f54b9c0f0988012ad3a2897bf9645d646578210de256fd02006f50d78f9c8a30a0bab412fd13d38492c07297f01d813defd3f5fd58bfbf08f74437f68afdc09b02ab3ad21993b57463ad7e61e127567538403d9e2515dbf16d2cf02 Key = 4bcb511e4deac4999fec18cac3971233 Out = e332a0b2deec78ef0d2e911efa0df41ed4d9bf44df64735ed090a0e0cad5d907493c434a8a7742a4f01e3156c460ebbe49e9ce1a4518dc53dcf4703154c5787769a4cf2b381df5349972981622464da1e59558a74f7213978400a99b2a1563d443b7d333efb4c8aee3 Key = 8edda909d228c01fc010357cb54c732f Out = b52b0d291c060d1becd69ff1165e00056d4eb4dd165d56180b65fb1135b2e8af7e77126ecd0e99885c3ef5c8b619fc8f924feb645055b4411c1f79afdcb13ccc848dc118b8205757c55097aca1ad90f75239cbc87aa6b0641115ceda47b22d3929b183cd6ff40f9b15 Key = 6e7a7a8106a0842edeb5b0ad9822ce61 Out = 49a428bbc56e828ebe8a1f18b05b804a84053ac9ea70ed650e882e57555dd48b5b377f4484b4de9155830dfacd9ef51e131bcc6266aed7852169e231373e07116deb86948fecd4626818eb0e04ea4ea15283caf600545a2c45732bfe4abc8ae952892fbbbe2aa59ca1 Key = 2454964de16bad37d6b1a91216c053d5 Out = 0548e2e900e88c700bd19eb2d21c24117cc85ff404a96a3683d2b01e293933e683fb8a3cac18302bf5c2fde7177965fe81f56ca790fdcda807bb2883e4a42d13815990b3a23c8977e308bf6e26272f773eab53b04e41a3adf10bd7c5e47e2fa28e21bc7721a545d96b Key = 432dbae5e496e18fc783925048f59e45 Out = 513c1928a79340de90759c3b3e185c19ff7287e019c76c23bbb1e4fe532bf716c68a823ff9d54f83762132980d8e603be68c25ee738ee9c82e5df1baed0c7cc60ca2e660777e6062622874ed3a29d4ac2cc6bf801ae84742e17b36828f8ac997d03ee6ca5f4ec3905c Key = e63b13334669de132c6a0175e2eebdaa Out = 8b9eea8a21efdf5df278a108119e2c08b5d46cbff8d9da5bd736c298b29817a2f9476d61207831d7dae22536085929548b9fc1c9c934dd2aa953d8d468d99d1ed4706d24ad06af4bede7c8ca476b6b8717c9ae20c850c01df7c9708ea4801e8971dc9c089909dff39553 Key = 1a6424b778f6ada35c923ffc6b5a460a Out = 734850581ad0a8dec1e02acff288b53e2f406c6164c2642774d2b019a6763c81506f1d7f9a8d211f3aa3fac10642918553f56d2170462019782a4eb1d4f21ced6ce8fd443e2649182de8ba828cdd3848d40b73733821d09ff920bf3e30ab2f7c1bfebdf3437d6cd74213 Key = 7dd6c4bd79802a9ce17211f00eb52e26 Out = 1c87dac73688d4ca43164c921b210f4fdfb3cb317abdd602e430b799b99af9f1d71468cd69ffac3c287132cf87dcb5e09248c7d6d511b5f6bc837743ca941428f2afd353e11aea71c5067967d0383e3f2d703bec1629597f864018797f9676c9a3411a3b61d838f967ca Key = 6cc4129b570b607e7e6045693419c80f Out = 13be30abed76d1df524f7f21b5e6c891b1c1ba0a528430d45094c72f5a984684df67476b0ab99d99cdff823ee165e7f86d4a33df5d7a81ad5033e202b83d857af0bc8a100a2b5a5eb2636ba354837f50dcbd0580ae6b2c86d75609a183b3398ac6003fe603e921a7dadf Key = 132adb15f07596590ea2b832047c37d2 Out = 7976b6775e078ba641011bc19ab6e4bb9e5bb517eebd8a60cf86146ed5da631c386660f7e44f0d9f5367b873c593dfb63157af640cc2de2b81669b179b1cf0ae6feb0e2cc56f040d277977fbbcc85ebb6a60198c318f29eb81d225d378599c7022e7fb8ee3cd60286199 Key = 3948d633764cda309eb3483daf13aaca Out = a07ef491c0695671cdb1f9cc3213a890fc5be5451ceea42481488b691de3e4d114a3a701a19e57f3c570100a4988ae266083183f859100e3d38e30b78e124f06d201397649353a42ee9bd95e29c67c9ff7c9324e5846bb6601caa10218864bf599ac858792a928c75dca Key = 1a4348eb59ba8b6e2f615de259900a71 Out = 723882ebffcc92da4163f8757d35b5e2f06c5f3649b8fb9a1391a1475a807913a568a07d4e502aee3e010469d680233b94341159e24fd9949acf6f16e1c138a64a675a6ff2eb8ed4092118e2ba90439b361578ff846ad2679e3b8b14baa3084909e0019ede19e07cb37b Key = 74f67bc0a547214200d1f1c9ca986f14 Out = 2161c68a91c2392b35473bc0a56b016c27e57c4a9c8f536254aac0ccf798abaa6451d878bb5269ff0a310eb2739e0b84986d9b060480779da04be73ae311b9a5011cb3f75fe0c0843dfd7f566639512f3327a03a3ec534478ead7ce2d6073329f7677d9b18712eb9e6e9 Key = 7f173d6e9eb3b55ffd45386b5fcdd62c Out = 589ca3e4b85aa95ee4d143aa1d33289d6f58e99f94ccd87e4e977a7405b682df0d575b8da49247a4e00d413e98cfef6c627aed24de1acbce8f43b3f05f9314832841828ea41030ef4b3e56730d0b03ca8fb303f54a4ef929e9c807e8af6967e1d6921918ca37418092a7 Key = dae1795e946fda53ad7de6cbae7f0f03 Out = a2f54354cf50d90f8cb207056041d2574d5bdd85c6535e727ba2832f14c5f1cccc80d4f17878ca613c4725c2238c8281c3f45cbf5688a80fdc743850ca7a6463960e2c29900c3430448256f858fbd38ed5a494a74c6071054f1a1c9e0e4e3e1e2161a36010446b2acb918b Key = a29eaa776fdf391bd4fd346c5e289cb3 Out = f663d052b01108125781e0229bd90fa22e70504553f32ffbdd49f5348f77ed51564b47bc5934fcaa8cfd894e6f798923f4be380f3f18134eb465d6c2e657bbb2fff2d41543f83f494574ebcf36212de3e1d5ad7b2ad138fe80c79e99ac2eeef1a6cead2ad63dbafb134f69 Key = ad514bd737bd2d037ec4be9e03781a67 Out = 7a1b28be3910b9b0e8f280a31fcfdffc95aa8dc0a103ee862247448da8adc178303930f516fea613c493789cf4ab4ed8555348b71d89d9a161005c6990accafd490412cea1ee06bf3857ad6ce87674172ff8dff340a66ccf8a63438f5f5c181aad9f70726b1a953d3d29c9 Key = 38e19a4206f3315b5d457bfd3aab8d38 Out = 3bbb52d8657fb84f386f5d152ce4f5e91972c431f7505c9c791fb294c752a32903c038f3d596f60010a189b23381e3afccc318033662f654257d7a07086f1d66122aa4203aef798212c2a0fcaa3e3571b7439c911c5c3ebc89b23960cb2582b6014595ed31a1711742c02a Key = 5724ecf8da9109b898a428939e08db24 Out = 74ec9ae4e1cb431039d4d1bba001cb22b88c1319653fcb17a2fac28b6a27b5dfbbfa8869e8d349cf3d9cc03c05a73998a10f0bb83e5a54b55254ccbc5e21566d142e8718d1bce6c2a910ae72adf2dbc8a59455b21740be4d9bb0f2fb95ae5c4fcd35200526ce22853d6aba Key = c0e048e6f9a9cfef46cc86a3d943d4e3 Out = d4d3bdc941ef3e67407cb9e9cfe3fc9095e21630eec01e5261898c69cd2e6bd51624f77cffc223a13abcfc92f3968d67c327e8f23a0dc3428cb71ce51e9ca5ff0ead6e68f85af45a1a1be1359ff79cf04a388dd57eeb2b2eb65237e7f9e24a0c27e871444712f3a8c6c634 Key = c0d2cdb425527b63321e824db31f3748 Out = 495fddb0da4152ecb8aaa136698caf237b90e0fcc6c7de18a6fccfa888b0d9d69ba2723d8c9b6957b703847e83c0bd1dd70e5433561bf36605a4deadc29cd38563495ff2853753c6600a75893accd585703da0ccff18e91675f372c789de0a71893bb8c5e3d845bc1e1262 Key = 5620447d55f58aa14c29e1fd5206c336 Out = fc22b1f5de6b264701d85b576ff69db3dcc938cb97c19d142db48d2b2d9c8cb1b7ac613e2e72e316d55c467b77a371c36071e92acd277125501796e1e15264ee2a07ed4b022e3512a202fab366d40c7a0d447d37c943c412cab616b3ec9dbadb2bbe26195ac818f743c55b Key = 5ca8ccb4b37dfd52863f431aa1dde409 Out = 3cf86d9495d75beeac1b8a7a5749437f6c1c955b9b4c82b1bdbfeedadb9c37e8869b2a3f71fa26cbe6f7b6d38be51e739534a74c0254e91824a59d53249cceb4009d9aa55a549c62a22009ea10bd8f1f31ce4b01236fbf7b13218e4234ef6c8a17828b0cc5a1502b4b510f Key = 97755ae0a09a6a6a0d6fd6a8116dff02 Out = 8fda51bfe61c738597fbcc96a6e61c84a16e36cfae52d0c15c805e0599c111a966842ba825aff51414f13bb458de58ea8a1ffea40ef2ac9aceb18f2e0dc7c83fd1237b03aa800674595bea302894791c27ac9acc17c0fb0f3382861f7542191fe05ccab2bdf4a9555d16c268 Key = 0b4b92191d3c8cff2d02980bc15f78bf Out = 3fccf2d4c530db8f92d4d8094a9539a705b86b7d04bf06d765e31883058b51cccbaa1e9ca5c7adffc2c83df67cb5ec779012757a3511613fcabe716305f18949e4835995413a144fea763990aeb1c91f5b35ba7e29d378e7f8a2fec7bd801e7b981a9b7439fafeb4f7f21a68 Key = af477827c1b099ee305bf7fdcf57b102 Out = a7c6067b5931e71e9b1275e02432480e1ade37e37fd3be7d87fca9468f9b84af0e51e3af36105c821c57a8bf30fcd179842adbc06b7cba43902e2a5b2d0b60ef47f88e051e66ac768ebaa4bce0a6530b79e7968dc567c97eca47d4523d8d00368736b0a017c6923793d66fce Key = 0fd64c77822d78a61d266f569279a182 Out = c117a0b561948050582d0e4cf4b01bb85f5249b1b42c529cdc4fd83643a3dffe7cc2af27bc0461fac043f5854c7fa08ac27babc745c32fdca0fc7ec7e8cbaa8f52244384f6c724a0f5d623e17e0972f69217d936048f4ea6699af8c488fd994150b9c75c956658bf015b4e47 Key = a5c61c1e7aebf9db7f6920ccc39cc55e Out = d4aab320e2231efab9f9f9e464f5a6ceecbf37a1c8dfa4d8e96429f5b5b1dfabdc3ee4e4bfbf32e469bea725414fb2e17014973763e7884e91ba3b7608d7f00a0c03efe4d5241e4c1453b3f2ce35c63a59816fddbb83c834b4618d7cc9b86459462f499fa6c0d377e810b916 Key = 221710ca1c521ea4c3fe7aaf826691b9 Out = 3a72201d1c6173eb13d15c7b1840c8e3ce8765a96d52a14e2587022b2bd436c7bd7bf8f9c8f77d726d09d832e0177b2f384dc75659e7054cf31035952fe0048ca4dbdf2b336d70adbe754d11beb9f713724161095c7561534e0e142804f7fff6b1d2eee835ab8ca77d638d92 Key = 8988262b74bde31e5814142b9483a51c Out = 4c1ff9637e0b6f699285338fc412232b54049f33f0cf559fcb3c4218e504f0f985e7c6631a307bb267fbf4821b42d16c13b0b764aba4fae255695350c4735a6a49d815f1d1fb6471045c4b893f4bd0166d6788ab980c995ea50b90b9a4bfe60c0b683d8bc622a51a8cd3b478 Key = f0d0c516c8360b1c6c5f8ddf8a14800f Out = 4c1c47a0287d5cf2221a159abfd2bf7d7765b65b0b9e1cdfba262470f764c0a32141a50cc2035827bb7786ce9e7a85cae97535f895f548a09e993bfaf82dc4b8b29f7f65da04e30b193cc32e2235a45c70c851c2a3d50bc74a6c9a09f5bad173ab34c55932c41cca48089763 Key = 145b2653d32acb67c6027617ec3047c9 Out = 4e4154b103f5da35ad73cb9596b6a322470060011a18d92cbb05db67fb8bd45e7f918dba4483538386b141bbeaab7d59bdccd339a4b33a28215bf26649ca12ce921191d020423245b5bdf3323df4bb42c6b8cc21c75ed87884dda5e20b8be7e3f523da48ddf043e153f97f4f Key = f9ad1bde60a8d7e7cb16c1cf6b713df1 Out = 6929bbecb69eb1f22dace08e4643f607e65d6282390c99cfb2c40de12e9c8440f3adc72f6a06f44cc88e68097e2eec4e66a3a68212ce87b4e18fd06d6e8bca5c9082cbb44e1362e077505544d5f68485fe83d565ce6158ec7b82f6f37222103825f5e84ab0eb692ace74ebf92c Key = 4af6fac60e9f5cc9ca5c98feae688924 Out = cc58d57ce02eacab869a3991c347a105949a72373f21da93600ec5a5b9006408565d40acd5d1c14d0d261b4c61891a572a296dd9b5578d3c9a55a3f09162f043f79e4dab7484621bf7ba8e6f36d5c877c898e972757b958b675b7dfddbbd3225cc1433fd8d1cdff2e8d99bc554 Key = 7216a825029da1c9a9328d499b3ff98f Out = c34bd040adc38f1cde974f616eab153eca92c8409ed892881a0197d97c8c99830ec8934acab5f81b73f8c130f37b96af7cd3c8857daff83b903d272880c1296418088f5b4f54e53e37e01e2600a2e6c09114f9d0b17615971cd7a3aef356a598946576c2dc672eddbbed0be731 Key = c6fca8eac307c0346faa236bea158d6b Out = 65fed8fbc7748a007c58a1836ad023ec768196d61ddbf464a2669ae2a5096407a6cbf79206c1f48f7dc0253e5573dfbf5cac1ad2a3a30b04c95cbc7dcf835f5a238d7efd7ba167928bd75cc70a772c20b6f1971924ab820b464947449d7a9f8af5b9f3ede5024aa988a8d904af Key = 9c655cf55f6f81f7424d98dd4f2c2add Out = 649e69f3ee5f62728aa95fe9ba66d47a1e5caf09e98f2c012d8a710fce4ea83c783bad3437b50663011d017bceb20c7c626574e2b7bc57e4825f307e5b7bcb108b5f19165839ee98187f39414668bf7639cd4cdd2f1ebce7a012a210b6b959a1955ae34e69ccae90fbf27de8b4 Key = e81158ebede8655732bb44f1ffc419de Out = 6ec974566a8d02e8eeb87b8b7d334589730e51a4e645b463bb95df06131f696507a4c7a2ccc339823597d9fa3ac920f7a1eda0018121cbbfb8b06b5aa66da090f184c11d262f1fc32942d2732c3cfe63bccbee4caa0091dde7e5676a21c3bf216fbcb7048bc7532a5482e94f5a Key = 69c943b5aa1856b540d9cf596b57996e Out = c12ba83a07fbe16502b3eb980fb48bb30cfd18fe8abb937c332504f4922088275e3958e1eda90b12d5cd26a916f7893ea1b52d11a2d827de942b898c6ecd765511aea697e156d4d1b57b9018d161f9c7fd77af7dc1fa981e3a894902c8816a2763b619b18442ca846aecdbcfe8 Key = cca9f848cd5233308ee63532ac5da3b2 Out = b669067016fc393493fbc0b79748568f903655c0387b6130db8a6ede11f76f2a9c89bfa1365fa8bf6b69ea0da695f3615dd358436fe81c89720fec5ffa89377a24673fd74ce1eb44c929dc66f2f6e7bd8dac58943b6c443d44c63f5cb677a645627df04812269f6451e6fcc5a4 Key = 0a5465cf6cf76174f63555cb9b81fd6d Out = 3617ff610caf33b40672e3e10b0ad2e67036eef170559d1aa74bae35949760dbddacfe60ed1c6eaffd79b7f55d3ca6aaf2551b8e47551134393fc89536284cbeabf2f103a807b03538964b718cb067356a4152c5fe41814fe1d3eea86ece3a3111b51e255482b6548eb77399b2 Key = b3ddc063481e3d6bf604f92c0df2d9cd Out = c82868563cac7fcf0bde8c1fc84ac857e81f227ad409d549b3a551db4f3e167a25c0c5f979950da172d3996c7773573f87f419b5ba047fd37b72b2e6f932ed14a79fa63764a3ccebed3be023f7d322ec0e05ec4ab25009937255e44e7c8dba99418ab56a4ff1e67f92cffad1fdb5 Key = 2233052ec4ffc6bceb5a835bceb0caef Out = 0d74d2cb6cb0a7d56f1ca4cfd417e0abaec6ac3bf9d181a65e8714dd9ccf5ffff8f2c1fc8a9f898e7bb458f6fc092222f9c25d8af738a23fd7a49706840b12cf306b2bf0f32416d2a344d5ead6cc4f747c8d4801e536a6c1bda4e5a744ac2f4d8c8a2bead5a7e6590effbda6458e Key = ff389650d4a5c98701e10541c30b7c3e Out = 6821e1cf2ec37856875f012617e9a38ced50aadc9833bd101f313d277ee17357710ba4f0d0689e3c073fc8a14c70e77ebd43e9c09b923224f9dd7d4815e752810b61f09f069517f0401029e7f737bdeb9e9b2225cf139132a264ae9286b61252fc5c321f7871f995465fbe80a5db Key = 1167f21de69b7d4456e034d3d2313147 Out = 62d45017c59738f6ee0974fd5fd14545731c2a7ba11db2c75fd7d6a45e5857bb0b2963e05793cf382ab9797b372925a379ed0d004f3cce006621e754475a5de42a030bcb0c5788b35c9642c6b367d0ddda2ec4abb71f3679f679e3bdc3be4c587bff58c5cb37f3b9b1de72d491c0 Key = 8fd6cf674624c812bf8679b8e6075351 Out = 028bf696fc8fe6aed65af30105f9abc050a4122f5221639565462becc6d2175db8746b6cb0685d6e2fabfd241c5c4d281df189d7e57c18e6f58b18b630d69a66ae8f55b596ea4d2a69f5ed608631b9e248d862482bb37e4a8fb819d5839161a96a7cb8c2e151136f9048384bc4be Key = 2e5d50e50b55f4936e28cc5a734d0301 Out = 8844598631fc713e0a28c7f13ff2b3487536224b04f3852d24403907ddb93e137ec86aa231a2b8ac47545a36fbd134b2ef2cae9043de49de4ef0e3f5db4aff266de32cbb69a43eba3d6eb4367cc5b81e21436ffb584310810b04e628c59fe61fd85a4a0535d0544f4eaa52e5c33e Key = e9cabadf84852510dfeebb11c8a968b8 Out = d7d3e3d37ce458f9946250f230ab9aaf7320878621b69d669a545845ec74a5336c69698757e6b71121aa99d7170d9e3e53e521a6617f6864dd4b1dfd5d2917f2429f9daa6365c0aeafa72b96a1f025f8bfe21c730733c3434a84deb0b296462e0f194a600065613bdb5d26e90aaa Key = 2f16abfff5b155d2506724d43a160985 Out = 64949a44df3fffaaec9ea80bc64bcec82671bc648ca354f4e6dbb71de6a6c9a09d39acfbf8c8b76d918cd26f6c0cb541a5b7773156c90b324da460b7687cf47df303b124d85258a5d8dfeb659a36386c6b69a6e635c173a0528a095bb7edcbd399b1d27a75ee81eabf13970738e0 Key = d80f1434b53f6db3e00c5e1755106ddc Out = c1a2343dc6d702e12c9aa094df7e8cdad7391a8bd2da2f941b92e592d9ce5fb3f858b9a86535f6ccbf3cfc7dfa558982669d2e3af3b2cd65d98a39744b48ad7e33db35e7cdb9c59ec4ad07503d95890134d81d34f017673de63b5bc24315ebeeae28b9d91f6293766da05065f057 Key = dc97e13f6857bca492075cef6c86f80c Out = 025db653363a926ee3da59cc8aba70332fa7e0ccb3d5d5d0f52b7e5b6acadd3d5df1b8751cc0eeec2587a7aa3a5e5c4da5ca85bdce8d1176ff0c7066cc3bb37db9019f8bde34f4d6d937a67d91818959612abc5a269a48121b32c0012bc15853f2b93f88b38fda69d1c243a7299743 Key = 5260549334240e95e146697b85970732 Out = 87b4c60f8eea9021ef28c83338282c9c7ca1d36a920894751cc0c6fc53ca5de5d604c18ac44ebd42415a40cb376d70b1415d69af272a8432e7a429b4b0538f388df893f5bc7fbb888c377b7e49599dd66e93429628e10cce95efe8a7593f40f1750fd6fd357e5d08c31f4c83dbec52 Key = 69573bfa284efb046f8d445c10ee915e Out = 80de5c22ae25ccb9afebe78c23e53c185201dbcbf8171ddba9c9a4de9b841be850f753fb69c08731099dbd4ee88e46893cc236cad4800ac598b5a602a742e5353b7a90027569386ec6162c3d552537ee62421e532fe17d818a7758b5ddd84b7fbdcdcfc120395f301f11d232f91205 Key = bd9edbf5e45385dfb47988b3d966f31b Out = 9f63fc28f0875a7d9ea07d0abf88422ff572a386ee8abd073adf55b05ed5e8af0d78d17f7c63c0457eea90fb666afce7e959b513800599655d9295c48543df08c258c00409781755209f85dd6edbbf8ccc288083641b23918704258006f3c6f0da2e2be9cd5efa7541baa2e56f16d7 Key = e6ab22da057d5c5c360c8b7632795fea Out = f365e1c309fa4dba6a356540cc8bc2092da76b61c0466c5c131c93efbaef84b3d2fee287c975929d227992e751984d67365553d83c8cc87619eea0e39ae86fb8ee54409fbb635dff28bc5c9538361d65fb5d645a859c985e6ff076d77610e97369b560b4e2d6cd7c9ac8b1701d3d6a Key = 5d1e7cf19591197a1dd10bccee4a204f Out = ab06fbc60179e919d2c978227c25914f3d751d5d27a4f5d60afd0afef9151ab3531cb39bd4b4a0f720e38b1565ac6a6de51524a0f04b0c4377f00c5fcb9bac73297c4e36f014bad206228bfad7c19fe2741b426c46461c43ffe82ef80849e589f83c316748c032d546799e80b0bce3 Key = 50b3b88928085fdf7f309b52f8953e38 Out = 94c3e2bb8b6d3fa378feb46e28c7dfe9a18a94371d60b313970070b45780513792fc2748af8d5ab8ec0f1a88f2998a502b167ca795f611d7e49c297e0202d46114b93e6045dee0f85fc2a483d4cfeab2fe1f40e999ee37bdf2ce5cc0c247f3238a66d8f9d2fe07570f35394390f834 Key = 2ccab02be430118d6dc505e028b60e6c Out = 00f4f14abc14fcae4c9d630f2eba6f174ace360912f0dd97e9254d790f5784ff6b5f5872ad95cdf5e75f9915d871f26298a4b8c41cb0dc4889a2926043934a302d9563a8726bd318edfbbf690de672cd4ba32d2ec36088bc80774749d61fe667c849fb44e1eb0e81c15de0b7e2a04e Key = e82f476933f82c369c8c43b9fdeed32d Out = 7c702074e1b19e31985bfcf966c1f7c65b4fb920ae0b1c50b577c4afb26c5777f710bbb947f326c0337744f20f9e0079c697204f4cf8b6e5a87029d853f0dfdbe33d65748938760a9bc4323c5c321fdb9701be66d4e2db48008e8d5e6f7d07e28eb2f9e44d3c22009ca375b2b59c38 Key = 7e5be265445f183e8967bf4e8a0a2282 Out = 18090e3478500089d46b25e082a3ef1ab952b8f179f43b635bc1a5527547a98d840292f953933c878f5d52ba7888962eb493edd1469d6b4bb49748d2d34a7a60f21e2c628df227289d639f2248c17a41e3b1a94a67a92cceb8fc4b7b8f3cfc5c01db4180cea4a521b72b3e2359c25636 Key = 511af474bdb4c85547d47373c8fb4082 Out = 50397c1f6d1244b8a3741c1d82dfbe6f9b4357cbd8f3c2046c2ee95a0ade85cc4650873b08271ac33c539ad4333e2a328da5ef2348e6716b34451450579eb06a514e70923c3c7d16b97681d1f88bbc342543d0574f2bf97340e0537b03a06c3f06ec0a8928a2bf1221f50104e1f46057 Key = bc68ea4257af11182b6a79574bb2e680 Out = afb45ae47afd8fd788403ffc9ba5c0e181c4e26d576e0619b73108be3ff3586ceda06ca0644993d7e6bcc377ffc606c6c9c9957a8d490bad879f1154be414605130c66f439aaea712d3ac72e6ce67147c73f51b39859578c841f5ac6a46504c7d971dc7580541d0506762fb43411b8e3 Key = 8426213bba0d11b997aadbbea378d7cf Out = a5d05d79ccc47dda6f4513b318853ff5083a7f38c020c99a74243378b3f58d7f63959740fe233147a181bd01b301c0deaa62bbd2c3a67752c6fcf571ee5c6be642fbe06ab723158f46b7079babfb3284b6e4f53c8661662f9f9a6565fc5b7f8670e0967af195038ad007e2ea028e4741 Key = 2418c51840d4a18c0659ca2d11aac3bd Out = ead10062875ca8ccae84fca71c1115c9a22db6c6104c98c7acacc514c70205f9a724f8b0e70dd41da0e62648bd82143f9b44bfcf35b9016e30a65b2d3623739520f772d58f5285449b553ae093e941708687dbb83c1ef8887f99d6cedd97474a97f6352b5297cae4f99ef46e65894bd4 Key = b9494c5d50b8a88b3dc834f60c657914 Out = abbdf0354bd4ff1c6f7382bf7304845156a99a8cceeeb43f68bf053de5778e25b3ef9d5aa1bec8f7630ddab3a0a60cc6e804d4d9c2c8b19bdfead2afb34c4f36b5c991f1974fa3a3ba825534d6c0515fba2591e491b4faf77983acb212de82996811b442e896725e67b151732f2612bb Key = fdb178ade3731c45d4b74c02edb8a32b Out = 7aa8d40a76d995344b5f45300026e7aff6ee8eec7c9268b47c607243e1323fcf80d4506a9e3d03c5e1fb58d77a272b49389f0fff3db415016e3571070ba1e47d4f18eaf36103fa2cc9a7d271ec5fb2e1735d329a5fea1be34fe020764ae9e659230a59dba77ec1e29d3c65221fd1478f Key = 0b7bdd5600f2c20de56155f0a81389b6 Out = 5ef7e7f88b1b2bda0a3a85500e42351d1aee766d5b88e0422a4ea02dbc32df1a993606635db263a72fedc0823e9d42781809464365c972a1981211eb69bfb1ca76279a201896d8c692b3134b09dd209341a441b0257a96793afe2143d735dd14ee761809fad6dce36ab25089e8179209 Key = 0b0046b1a74f2cc849fbb4d096244b0d Out = 299e4c120dee32166f28068609435408bdae7745d69820e1a29505f258dab478095227789028f163e08c0b1e3ef87b9c9d253a87a827dd899827e109da10988ca7eda811cba37497c1cd3b8bcaf6dc12fc9c4e1eeb92a8990890a60a036786ff7047a9b4cb96100b13b478db4283c3a8 Key = 5de59710a7d3a9848ba30458a3d72ccb Out = c8fb73f7b7cb40156a0f7197134e2c06e8921f12fb04fe62bc8b7a8764666423ef82a312506428661dc2b6975a49cc7ae0d1a0a6ea0eb4fa0eb94b609ae0a8bf36c50427b4d17fcee199f68def8e3f3755269f752bf689edb73df0dbfcaa013103a950da1589cd6a8fac74493bdca39d08 Key = c8517c56ab3179c75f4013e57fb670cf Out = 0324b9fc6e229cb07f1c4d2dff72a1b861a170a228254923eaf7e9b738a790b7f850845605af55d25fe27e12b635a519bcce7e19b2948cfc465901972e6ee6ed203b056b9256d66c301b859d45b676d82da2032e6a7b84b5d00c29fa324c67c05ff093107e567fbdfb1efcd834f10ff685 Key = 28fe38432ad07e84701d764097e3b7ff Out = ea382f070e2e7b261530912785f6653ab6063d0fc4ea1b886493b81e9d3464e53f0178584672435906b8e6f788ae4d1c7ac349df26849c4cec24e006737a2b091666448fda33c4f42408a7539db879b30d163ace69f60ac42f2545f1eac02ff93d4f065d05ce236d164419da8373977c6e Key = 3d449e32c1a302c11eafb4692ab65b85 Out = a3aeb811ac22c245b03d759068783932140c27009158a97358e5df31328016d95b96714a97c16d3bdf473071e6fee67f3c776d47aa1b5f04c1760fb87a2745426b8fe9bf2fbd88428e063d0e29e25c9fef5a603b6ed7e48fbde62bb847efb8283c30a11a45864c0ddfbeccf7d3f712cbd1 Key = 26dab5f6ac4a9bd97da7577192144830 Out = e6280ae64b8a5495019bd49f4288f48020f065c3f6bb6abefd45b0881f9a145cd86d07fe495629ff325814a2f2aec63633c44f3f1dba89c84a564b2b1d5ba1e7dfa914b844c1b5699b724b43ca231fc08da3c9039b5a6898a496f7268def649a97c5576408aeae01fd2220c3662a797655 Key = 576a91eaa5902b37aafbba5723420b31 Out = 719296b4c6996e0db1e97966adb53f258d62357748cd5d031de7d8d84bcf4f8366fdb69722b46fb9e494d8c2de01d61286e406de11d97566319bfefea91a313376f252276dd47779123d371dc278674c80ce94def7d250bb9566aecfbf88ecb7fc35567fd1950ddf63cd681beb8ed2ce21 Key = d8b073f3054980846d03c5a38e6a6869 Out = 4a82d1e857779cbc5e7df655ca33823c1c4408549af6eccd13c1851c56e6689dd347b9a6f7d8ad7242a2b91dcd4ca3f3499399b437a6353a735ffa0d576e935310da18a4607ca60227496b210caabb6df800711a955483edd49a00a683bb910db1331017b31e17b149946d7ae6d8035d23 Key = 36be0f0e26d16c77ab435349e7bd9e82 Out = a3435e150829a1515c1a49859cd5c168b3a0b3de3e33c1898cd7f9569939981ef99a706d1684fa04774c9650d4936c96a15ed218e765ff9ad8057e97e4384214ec8a61b8f24e01a1ccc25b7328b4fe5e47b2ff782089a92218e08a54463fe7d3fe8fb69e36f02dcaa0abc0021900af41c9 Key = 7da093171f3b7b70243e7a9d607f1bcd Out = 1a91c390e9ef43144fc9dbd5e817e3bdd056a092ae508b311ea0825220419bedee792a1d9d2b8b2acb7a7b2d635d1cbc152bbbf78ed61431f5a8c15f0b0eda24092f31894410274ee9170bf7ef0d5796f487f03f73273a4378ca52be0177ee5ea2c1b6c2923da2106b2e935d2ec3b4c8c4 Key = 7eda6b38fd1caab32dec58865ab74614 Out = ab256f29e42f06b271a7479b86daea54684fc101aba4f30ff3f70096142ca27137fffbe6c26a6c24facd35fe72d43c586c718ac36fdaab06d344d3f1dbbca595a59829d7852b1c3522135713fcc0c04b51be34fc96cb9550581ab2a802d89c299985989132b46b10cbe4a369f1a20b43e244 Key = d1fb8ecc9e37321b3eed88f36c80b8e9 Out = 347914cf2c75837a6f8a562e9f27aa6fed8f247ea2d1748c2152ebf959bbfbe4c219d72e7163b166ae05a2b60f7574e74a2c81b506fa3ca943225bcad1247fee9c871f0008dec6f8b3325b3be49d85e4ef05bb664aa208115164e74484146aeec2f9d21859a3a37f2aadd8282ae384f84917 Key = 4168ddb3c4474a8c130b2b9b0ce87b3f Out = 12fdc1356313c9074b2cff4221ba153281e4b4d53073cd583e8162f5804bec9e39265976a4d5a2633c8188e034dc91c2dda3a38b4eab030c0c8bc349449ced1a5ec8ce8635e489f07d62fcc8ee12ac4e5a0be6af03a856880c63594829ad5a28d706824120fca6c4d04203f6edb0ca91fe1c Key = 2c275e327eb181cde419bcfee599f665 Out = 4738bac9204d5c1b351b53263a7f824278ae461224282b76d21967290fb00b29579a51780db15d481962e3131de58bec321f3f599454efb515c9a0021431c2ac7aad93464f9f58c98dd8fdc108616e602de7ac3e62a82d8e287021e2a3a59bab7532b11fadbb6afd3451401f1cab2880b517 Key = 6510268e8d5d31dc91bfffd5c40f99a9 Out = b108625b6dae80cecab34d05217b288522736dc83ad2ef73851602da8ca5b41d77d62f274961037da4b87a53e3452bfb4bf923e4dca6aceb4d69b3391653edb47d3fdb4c8dc4cf8d30074e56af610db792067223e095ca77a8eda6a947dc9752d2d6cdc09f583671e36d068a0360b253902f Key = 13cd2e0e56f42719974e011447994fd9 Out = 2942f5adcfb2aa6170bdf0c4ca78634cd25f1a1c2e6628fced08ced85c48ba842a165f479e83896bd6f4690b00aab716de3f4af4563050120f007063523a888ccdc85c44c35bb9b144d486d622bf83a137775b92012db11db17519a0ad715915e61fa646877efda575db02b4767320f845ef Key = 4ff8635b7bf62238d64741db26edd2e4 Out = 23d93704bf60c811d0bdf1a82357bced16e064e045cd2fd65ab5ab9e53cd3b2eb99ac04da55db524be817d2a3d61e95ad80c6464a10a8b290fddcb35bd742845b8a235ee582a4bd4088f5a92fa54c3fa5578a3a86f0332052001c9b29d30e798806efe8db410fa989f389e9d96ff0374dc48 Key = 27f79d936a6cc2dea2b84273e8209ee0 Out = b8deca8894b03d9ec8f67db054ee1191eab63f0cf082d49ba430d5d0ba809ef054f53a510ed589e8e9731e50bdeb5dd883eae82fb811b7bb17799c6b516baf3fce52558008e5fee8afed2417ed1c10e6332c091199fcb9aee54a1dc834ac47e3062e50be4d1f9f5cf9f85cd3d88a8a058d6e Key = 58bd6b3bf056c503581cb4b507026e7d Out = 119e6e5f274b406259e116b39b600a79a146370437d18e1dd52f55b95fb3d3a1a24afe4d9d20758b72ffbe13ba30147cb02da34a2e2cc1794539b265719325813c5f0d946c3f40a18722b33a90be8d390c3acc15ae00733ad6ad7e2c1c5c04637545001b1cf470be801b9a6e4f237dd86acb Key = 4264ea84632d4f5c0aec348450299556 Out = 309d6fdf6fad0c9a440faf8f3beebdd975b2319f719e6aa9229757961291a8efa01cda044f1177bc62488ace95a478de3dc94325a088bbed9faaa6083bc722f2cae1b1c0813beab8daf016484f0ca454494f3c502c41a983e35fce6d927d07fd6bd208aff231983a0afda70ebda2f09e1577f3 Key = 5a62727b9faa994bab5857f632619d40 Out = cf1f6723c853231d8855c994328c095bd5c96b31eec6a910032114d974a77912a04f9008ec6709c8f028c121b7f71244bff425c0b9d0fe4b727fe49b4a07bf7c0256fe5f7df089b33a5414db8bab0c6954b215b56e56d278a5b8c101817a1f870273b439b7ecea216115c332e190049c7412f0 Key = 798acfc8f0ee8730449007c1a47297ad Out = 693abd8af5650df916c73a7bdc27699818628f12cf6b4289be4479632b969b161f2df953f9236b44f1618d0b3494c58c933be0a3d7e911632d649f84d5c6dad00008876580d9bd6994d16b85f616e92929ce81c0e4de719f8734d650413417d1518a44fdf58eda50c0b05b95bd138dad846876 Key = ae78c93f52a72e76b3afd388b9270a4f Out = 41b757f14b92427abfc994ebfcd5ce62c11c1c0c2e98a91642d8a79fa373ef16282185faa3e87295d4788780d21f1fe02db8047de8f51eef6312a4aff23ea2d5d583c7623727037b6efc3481d72ac3c51b1a12819e52a51cea2a27f44a49361e767a83a81d16f209b26c4585a178532dc8ec7c Key = 6f820f4a63685f9ced8edb95f9c56799 Out = 547909e3f4cc11cf61586346cd701cb10050fd87cef101f0b02b13e5e8c1d5242456e0e65a35a9b84c13dc2c64cdbbea1cd8945e4e9bd5378c6224bde589d65bd6d6d0976cac8294902bac78da98ee1d773b77709bcb7ec7611a4b70f067cfeed858e74a62cc9fe4a9af91651844f98cf258fc Key = acbabfcf366defa6ba0115d2a440a388 Out = 01984a78679c5d41f1a78d8ea424883118c6323302b1b9ed8c9cc6761c137ca1766b68f10b47950b22ed0d617d9438e2893883fb42a850531424a7315eac7e9510775583f2c595aae8411664e1c066487b9537c2d870c24c9f0e831ac6359a3584b9b61a002f861103348679f93aa7319749ec Key = 1713437bf0e6f040751c469a9378488e Out = 804668bf702266a6c82cf09d60dd5b521eae47d2d8ad2c1d62879860b47a9ffc80ac240d319c0b2e083eaff8c1eb623e2a16631d88f71a9a8a19a2780de90909fd357cd1a8a06020be6006f92f2871b68c89b23997741e1ae1271340ed7f3f600d9e4779454aa0f88a540070947d436befe8bd Key = f9c91042085580fef373c97bb8ba7627 Out = 8f67edf4fa970d13a73acfa21a920a50a61524c5be7cd310802ed42a51d870877bf78b2028c048c6967749016f24b2ea91401a74751e28d238dded82b8589df543c4813f9c4dc2d8dfbc56380baa7e358a28ba88fa5adb6bb36e171edc84c9b16d35f44167575c9346cf8a9d10c6677483dc7e Key = 3fa9e00993988dce1ea88b8fee3ef8fe Out = f5fb6cfbf21ca0bc627565d8d194a427aba4acafa66091e2025feb607521ecaa3379d6a27e530cf49ae045746c948b18ae71c08f9dd717219cb9ed0119edaca0d0b6fd1374c429b15ac8c44d5ab15f0fd01d48a9324fd7cef740b771ad14130c5146393ee87370f889b2b4acc0523d2c7cb097 Key = 7202478bb8b8d31f90afaf86af995991 Out = f2371b9c33fa87c709abd6b475c6d85b51cedd8fde3e59837d2bfe667a40332d38aaf58037574aedc23f273d0653c4c7507f73f98c655130cc0abd04939bb11f6223f565b210bdaeeb64f1926b79de60aa036e03a6634bf2605687a11e55a5caa9b7cfd7bfb3fc3cc02e5ee9ceb1ea8d4338f307 Key = 79e776ef028056977624a91ab9371a07 Out = 38fa2231b93e4dcb6ea0c9d8a890fe4b3851c4603d94511f40ce0650f6bb75b3310829882778a65c78b789f30e85f2682be51eef8abb96d02ead6866c737aa5aa707da6dd347ad877d34886cf1c8620464d5fe783d5fda8737b3c342b4a028dbd07d8e1a865e2d0793b1a328bfb85381d588b3c9 Key = 46fb2be061ac51008bd522ede4a65a82 Out = b29362ce87fc3bcae03667aa057a6012e6ade44cb883299aaebed7f617b4063cab6783f12737d0d132cfa3e138bcdcd0928ea2235c120b86d14d11567964486d11b4b4b76d227eff0302aa8cd38d2205c86f080db3b20e500bef23014648264dbf8f5821922ce28da4750bdcc8aeacc9c7180e57 Key = 54992cbaecb27d3763bf3c8324d04ec2 Out = 624f95a81c9453cb9217e2f7e6e2465e37188a7d197a2796fbf59add94234652f708bf2c184653de04956bc7d80e1821f1125dec8d874dd9d62f7e0c0f1ebe1af126b4e89a2ece028e4087dfcb0d511218d4bbd40f6b52cc8df3c157d2e8a623f7c220c9e605c8b17a7e516adc8e8c8f5db22fe7 Key = 3c17404891c66968a37acff6fda5e721 Out = 78cf93907e627e675bc7c7926d35213df6810a7bb4056b8e8debda36b67e39f1dc2dfbf30137ef71b53d26065d15fefefde9ba106257d3f9e1c80609d5824b8aaa2ed2e5f5ebfa4d9b508a84bbb21385272cfa687c5487c07a06daac39bf817734b5eeb844ac758b1bdc356f1ca5b3e7e2e84803 Key = 4cbbddd8b6dd92a5c3941278929410c8 Out = a67737dc705f76448adfa8781dbc784e421c241944d35c4ad25877d1b899cef4b99ca8d7799810e4c9c405c128576b42aff30b060e1e680a34e1a36aaceedb2ea8a27a3c88a5cdd1bc50a07ce58e5a9e16d5b343d0827d9e0e7d5dc63bae2faf75d37bc36af41915268bd9b3e5bef0dc6821d3c9 Key = c16860a3883e9af9b56b36fe60762d0f Out = 4e908f80be27cbe0c59003cec58b3db35eb3681749f621171a0e1da4508d0683da04c441e8c0bec39ccf3d73f2755a86fa25b427451544a29c1974bb5abf79da3b6845e01286ad42cdf1de33226b6da5738ca1ddf9c98ae42175edcd4a94eec72729c26fd530b3bbe433de065bba5b37c7375b86 Key = d60b6db931a3ee9c94921780090e55ef Out = 3d8c0bfa0fc2e1614add5b6c05241d85b83621959ac3b0e59c5274b11666ebe5961638dd5841fbaeb1a13667034aa8f87ca290f2896c1c9b86710d4a877b2774d4bac64f83c18768ce854617fa8c8a101ec48e2231a624fa1583dd5f380db31a7873f80e4923bad109f088d2ef6154d1f7990504 Key = 795b72e59bbf2f374326176d1d633f92 Out = 1a07a26f6e5aff318d7fdda0d83e54564bf3b8e335c2e03b7d1c7055e0e30bbf90f6e98536f498f122b48b9af315e31b7a90cf80110d8e317f77e5875ee5539bb14a342983ea863f34ff922819b0207a44b36b6775239c9de2fdd9b8c574ee2f12463043e6907db1a37b4adba35e2c659fe2308b Key = 32c3412979de62ae6cbcdd381dfb6fe0 Out = 91a5f5d2222b330690a8cda1b99767f6fc93c1fb5fe7d176f229a1f48aa1f409215499eab80168d90b0db6f9f49ea6dba609dda927605304e7020cc556baebe257bb8eb4db85b4f82b97b9312f63b4734d24c9b87842238394079857c37b04f5879c15c0a75112d5a95588b0e465d0d3d8a397f1ef Key = b61d33409abeaa13c1adf62001f154c4 Out = c89ee6943fdc5ccfe410852bee4776bb76439159e1cf30ebd17e0ac41458a38ee4e3747ec536fd191a06c9b104bdedc9a6cd714831bfc490a0475f1da3fbcc31cef7161cf609228d2f38973e2ab9247e9d37eb7c9fe948aabb96b213921121e0ffef2d940473f0a8faef069992c2889a3b6e4d7d15 Key = 031f049b36b205a627e59d8ea0270ce1 Out = 467122a12b7a3641488f383e2c116aedd79d182bd45240afb9c7aa9129f056dab4a702d606cef6bf1f591786774f206675322131ce5a779f6e49c3adb18cb6f7fe2d5143969f702bd3f59eb25a597ddf2007be9a47144000dfc69dd3a4089032118d7f63666621ea3f800ccadae8908f32058240c9 Key = 33010c79b8d88d217d8ab339d4f18011 Out = 064dfde663f4545e22423496965a997fd794e7365310d3cd4c0c36e995e90eaf0210fba4f083a8b3b98bbb991f6a0beb53b2fab1523b80dde0a34a754339c21d71b929bf8ff2af19be8862af239c26b18126130194ecdb8482dcf236e3f6f029d6cc7ddcc09368d3933f31e17467c531e27dea949b Key = 2d208490f2ad89c1e38f003b1654d788 Out = eed72f1d4be66210f36398496875c94fea57de272c7bbbbe4f71d1fe0f8be42ae2869873f9d6fcad31833d648d077a824c123596bd6677f904e527ba046ce31cfc2e3905b45d1f250ba352d318e55e915686d14a3db0fa2698593877342f038c429e1976a01a9afe36edd9b67c4a39b7de2c065321 Key = c63f59a8533fa524ff17c8f90c8fbc47 Out = cc006b080685a93a3b785455148ff6a8897a2e71112d41169d3804722d86f35cf896950f32c97c2ec95013c91f0bb3606500cb667364c322622bc69127c0daa4cb03368dabb29e706ce3809918dd866b1d435cffd7ecb89c09af74aa0015ed914e90e46ec64ac0ff5e5ff12fa513056643606020fe Key = 85ff5f072442756665a41f36cb2c99d3 Out = 42c94f45b8a83623d4d310c340474fa910213bf0fb6ebebc2eff281f529f3423d43d6718ed27c9431c5337fe66dd8fcda56fa874f1e93feddb1eb14f878d3fb17ec42e28d17a03baadaf27fe0dc14e4536462a1944cf469803b2a7af0faa0e0c1b30318ddc2336df5f66ac1877a26c4b805a934b48 Key = d6285c3777b4b57bfe63154807370f3d Out = a5fd605b3ca298e11cd098208b185ff0e4434e912208f59e09cece20b0bb52979b24503f867855932bab44ebcf9c3e29c8f58a858ebb10744efa6eef984787349f8f19ce0cddf7f6e1bdf5058f7231d06c1460b1a4bc4bb19b298d9ab6d0e332bd8f16697950b212cb3c30223a414f4fce1cb41ef9 Key = 8df203bdbb72ac901b08095b53d29346 Out = 754778c7d3ef8ab8f1a3d4c2c0a21181fd4d5f7b6fc6ecbef37ed3e056e0047e4ce6e3245f037ac1f79b139fbcdf235e1d6d7650f88e33577dab7fe4933510099ad6c75e783f5f4c6d3fbf91a5068541bba1797344e8c6bb6a7f09b43568a3fee8f273bd1ba6f00908812caf2052b6a5525114efba Key = 5977cd2f87f385bc05502bd5d0e7bd57 Out = 5e3db1831ee90fd25ab68d43c41069a76554164e2b0fcd3d6757d855c6c8f4e44dda0a2ea3e08ca4b97f75f7300047750cc03b699127d09214289419b2207c422c49f86070c5af0c5c78bafe3024e3907ba5ead52bf31e1d4341312381e069b63204c42491de39a6e1427458a19d56252b1bd999db90 Key = 687ef74e352bf67e5cd2eb1e401d6cbc Out = f4f35697eb5398435a1883481f74e58f7faece291526a74d218b5630733fcc62f73b0fa15f09bde1cf342aa2b1f7cdd368eb019ccc12017b4f9adc9fa158c6290734da14fd7f7c5421702a36f7cb18de0dda08eda449b24a27b0fe8db9467bdfe908613a2dcdea13e3d075ccf6955c9bfe9c16c9ad95 Key = 2433ba7be8814aa32fb6d2d95df3fcf3 Out = 8ab97fcfec4396765365c4df1a8aa6a4861ce2707aa8815ca9f2e1f2ee7213733256cb215f5e218ae46dc05e68c5f6bf08a359849d210bbb6ebe711fb84270a2669ce2a1ae32341226dd8db1f233be8638209bc2b2ea18562b687f452fa7a952b7f5653f8b0f4945f2704c3fa2b5db3609df24b86855 Key = 2efdafaa360d48c474e9280552a91ad6 Out = 2857aede6efea1f56fe3f046db734ad98258391d67de7575a05bf596cccca25bebc573036a16ea28462e38dc280339d533c588921beb72d874778b44a827f5c18c10d99974e8eb451384c70c0e7ca81fcccb2a96a3cf9f7ae4ffd5f9ab1ecaa19e6af1bd9ffaff343e453fd29d17d8c787f1b11d8e9e Key = 1b801a21fa50971afeba3cc75ea69a88 Out = 3a297aa69f0317aaa3c1ee3e4f351e0802d8e15d6f66c8917b804260571f8218c63bc93fbe6cba518fba8ae378438e6704f01ac60def5818086bad26df228eea7b5830acd42708fa5e73a0694482057d386a9d8c15266561a478983b44e412727388405b678ff8fa6c33a64eec52b7fe422e16e7e92b Key = fedae848392459478b8c4e2305289445 Out = db3cf71dbf9947690eb969880ab95ad151e2f232fdb31377e40c24de62aa3c050f25a92cdc8d672ee957bb4b268a92c4103ccafdcedadce753747850b2e2a94e470d6aa9cdcb28657332229285c1450576573e7aa571a2f95537c2d1e1c30094f2840e65b4863fa38d79b8383383d58d12b084a56120 Key = c84c96ed35a2ffa95a6c3977b9356e6c Out = 5a6efb09ebfc84f34807db71412eac64a3b314061534d509047d4f0e0406853071aa311f9a2d066630145b5ba2c9735fafe9051ce3f640e69d4a6522eee3218d05298051afdf16f91950cfc7d2d8fdd6e113cafebd6f4311cd0738b42edc600e9df4825ad4e35ebd318120b91318afb50bbe0989bcc3 Key = 13d01b6209cdc3ced578d985023dec6c Out = ca65a7fb8e47d6abe9365174bfd2a5d0b85a0b6f7c1850ef23e3c7bbcc12674083c97eb3c5fd7db7a051b181916d4fb282379352bda72d4060675f8c9152cbc2dc9c821ccfdf6813ac48fe15d0f1ca09b7a3987d4a4e4749f8dd85e3e1839a2a1957383b4b05b962938942a333e024c5261a51d5e2db Key = d09359c76b27acde36d4bab6ec393587 Out = 5f1583a530d7a00d2ff5a735188b967ff53143192414ec0e5a0143b0903ea29d7add66bb61f80e47d96eced0ac60f54b9477b8a95496d9da28e07ab545dc8686e8d05f1a951866926750974082610309d64a076e2c857e8c1c74c19358c60cf4c6b57c4a4341bd7646bc123eb6f2f1a1062fb02b8ff9 Key = 6cb6976983b50cf36ab241130ef52c75 Out = 84ba8e7435ed4cfadb127e9b5e03f6ae05ef0545242c3ca2ebd149208a18017b0eac72b7ee136e306535d08309ebbc4e6ccd2853e21f227c94e2a42580a2aa9c2ac51762c7312d8f61b6db0d865415a90b741fffe4cedbd0fcb01dd78cfa5c31c5d0a42cec86c5a82691491730569cc9aa404cb17bfc6d Key = ae59e0a76e3249d00869dea50a1dcfe7 Out = a4ab4debddde2772a2881d7ecbac8120991838bff9677105a0c7a93b0f07531888b5535fbe6111a74c95927c1cc44a6623baadec672c974e4f4c03f4490e1df0fcb914c416b0d2e816a4ebd66021e3be3c5dd7fd7c123f257be354a5b11d005b19d8f201ad5a41f7bdbcd613b2b00ea31f81f3fe317017 Key = edd209dc676b649df0ae3f5d06afb3db Out = 5b35491ed27af7ac39ae30099e4ce608c350a7654069083ff015a4bb2cd312c3c8b75a547f3bb3d52ae267210587a9ec3a8042612662db3dea73599a4c29c02cb4615cd380f5a21841b58ea13f690e986a061cc5bc44738b483f360be1299c2cfe25c3de60f4b6aae8858113cd3952b94d82888b0d555e Key = a90a37717779a53b1bc16e375e9b3dfa Out = e4f0053bf0aee15008f249634e408f38906679517e6d4b855bd9f66329c6f1868a1a7c59a74b2c1fbfe863ebc9829ac168fbd0c40e91b927d32841f2c9b84306eca7ad82d8f1ee731e5020d44eb1512a0a6b5c5963b1c34b551f205710b91cc57a94dc309c93155026149d685a0b932cf6abb112d2f107 Key = 3b9ab76a23ae56340b5f4b80e1f38dfd Out = f6912df095db1da8c184a92a082c1881693fc8dd6969a3f12b6e83ec841dbaf0d9ed9eebd7c8903987816dc4e6b0895adda9d3cc9ba369ce6986b790806f14e48094d8c037052ced2f6df202d2f3fd3852d6464538972bea5b25ed1849f10a54fa175191cb44dc77558cec7dfe5994a3de31089ba438b4 Key = bee9217cd152443d54c058295b83bc2f Out = fdca49d58b33826fa156c80892e9ffc410675f1d50d260c975bba8859c8979a1faa1011e01cd34998d3822a249c6a2cda3839c5834c181b02b8144a8a09aaf277a29fa263b9d2fe2130acc9b110a8220ea8b6e8eced883431b7c0b9120b4017066e465f301f26b235b3d7e4530ca4f4405fa3b28c46e26 Key = a7c6d74c265c1d9c07848410fafd5b01 Out = 0551654cbf6ac99a7b5afac0494903a86861bb879d3b4fc6098c5ba152dc67e3bb9f8696c92eeb16fd9cd1e2b51ed1c0c38d138faea7b429b685f2c0f0ac8deade3e8ffadc450eb8c422edb546e029aa7a43b5c9723b450a981abd9040b0f546f2ee2d8f32d5b86c412afb8e89522af4e7434d11109ccd Key = b4396e7697fa2e6961ee9b8816d9f857 Out = 73279b248d4c9209f5605714a8b831427db9b438ac06ba56668eb3a708da20961aae24a0eb326ac659831108fa69770b8647076be3e8c13645c48e4617d15a9f5bde51396f46c43b701f30caf9c677659135603793dd3a1253f41d18fa66abc5584d231df2c7c1c274588133ac4ae6660d6604fd3e1fee Key = c37c768af6a6ec8a11496340dc60ff11 Out = 4ec819caae4e235e1544e4bc8a85f9a034717dab307344fcf813558664afdddb82def5d0ee1ad2a416ee7d7c9d60790f6e4ab763c76facc28e5506bff7f95a5ed99f3f85e282d12e6078ad2d5efee9757a534845a387a8ed02e7d4574379272d4f85319f3787ef951708ae3d2936c377bc38a14fe7813c Key = 3294ea26ac9dab8eb11202a93f097b64 Out = 53a98dc970ed4c0ac24ddaad97d4176af0cd395cca2f2362f4eee38b5aeb4c96c96b001756a43f302595a1750de079668c1d7191a8e18792603cb150221cb766aa290f6a5fd7d2b7d3360893a3c71795f47885a37d2b19948710769b88e093d5fd9c5d23f31a6a3246fac0edad71eb860ea54856cd9acd31 Key = 9ae717ee20948b629be2a642a11c555f Out = f1714031f50b10c0c74d5ab172e95c81cab07c16c950e655146db4cd9ae359d1b6cfb94de245cd166e619a6f8e2a013b746355954222d7d261b8070bf7af62ca84d55d6bf997831314fac509a853e5fba376e6b72ffad222316c5575a0abdb9636c4210e64e0988860ba103e904eeea8fa78e97d99b32b27 Key = 77a316cab162cff862e7bef3569a380e Out = b6519f1f8b4a2fdb2e7f094ac21bc9429b4da9677032edd4c2eb4b539eb087c7677714bd7740e381a1589e9d956672a7e1838ac06f97fdca31d37573ad7617e0db98a7f699773799450a2d501a56035d0336712adeb6c693157c3bd7785f6fa6f947619cbffb84d1b261f43f91a200e6a763676b8c089e70 Key = be9fd5155c64e40570b974ee30498f7d Out = efa65b675e2fb4129757a58148f09b2097682a5dcdfde8307225cbedd15dfe810af112ede83880797f4f6757f6804d905cd16bb62681b6222c7c60407053e4af6d4b19c4ac6fce2f7abe35b4ee994d9004c8bbc15aae025202603f0323c199e4d241fc2ccbd37e1fd8ffbbdd099c4616b0e9684335bf5d51 Key = 380ff14baee029db92ba4cabbf9e9cfd Out = 360b6a6ae5bd9ae31ceec95df42d95c1aa507ef96a2fa8363b21d7265b3006de29cbe04f395acda1eae8589680878391acf57af95dbcd3f322a29249fa9d8ff611b329b2d61156bb011cd4e46f076e4816c6c59d66f82004bb2237e51d637378f68f6807e6e7f8dd5becc6c2bd675c8bcd8b16348cbce4cc Key = 80b0bcb1b47871aabdbdc48dc7c86a85 Out = 23055f7487d807dc67ffb121d0a986aa798ac2dae4d9c4798475401ddb6ba08567ed9773bd37eb2fdbbaf00ccb43ce8b18921a2019918ba2f276767554b6f3ae6ca139e0f64b800f5b506a29bd374d85c283cb19f65a2055a804688d7f40348f8bc7c625e861976498eb42436bdafaf45d54e969b41a6e4c Key = 57848d34afd9b58791e3cce8beabc44e Out = 610bc2244384541c7e3a182e10009bf632bb0ae68c9534e78d2eb020891086e0a102c57bdd9c06dda05a924e2a1a04858f3e5621b6f57f035b882897dce95fb323e98cec3ce36ddbf1edcf9136c731fdce497a7d46bffc20558663292210df6d43ae75a6473f89f06e6ec66c05a2aca159098603fd05b6fc Key = 5d612eaf24c8fe6aad3eb05910c44f2b Out = 5df1e2a10ec4e43a9e314eab280a9254ee5928eb28664e9d8702a9397fa7cc362b75f287d424640cedfacef5f3e2e753a8990377e1c11b81135b5634e697f77ee2f1b247e636f81ef00225d1f8afae759b2e907cd3665685d840dec6dcc8cbfb280c6c3d3f555ba46a3a4d8a1ac427185491fb6fd76b3227 Key = 3551f49ba2842bbd238bb67ffaf2fd73 Out = 19cc63b55a6b96b04fa8a22ab7c00db7f5252b8c1675a089e36928c5dee68adf2051866a54a516358fbf154bf9c223a588f9c879fb9e33d8cf333a320d78eff3a90a58a4eb7ac000df0f430f0bb9d02fbdfd69d204f809a5abd06dae5c4dc8c3515c54aa6cc8740c94978a7ee94d572e8fb3ebc52ec7f525 Key = ec17aece3369861d0206d1218ceae4e9 Out = c5150d6750193ed089c5f8a45662e418ed2e5ece896a8ee0675252d986037cc6eccb3d08dd51446a373c8af436669d6810ff6f63f322029cff3e1256b6e207fb5708ee861c99422a482498f4533d855982400af491827d6e6908a4a9e33179c7420c37746f399e62bacd6e097557197276073d440a5dab7059 Key = 41d9e57421bee79d5e23acb80d539e98 Out = b70dfc8f38a96b0743fd397813e448cb871823308b97cf73d84413c6705550ab8056152386355ae37bf624eeb4ec03ebbc364fad3d3b5d463694644b7974d259cf4a1aaae9c012cb642ba0c08606112bbc7a7d22204924f5b5ef34df617fc478187995bce1d2b048f55ae79265c09a98d2642d201e7682f41c Key = b1f8fb9f1f080221101093b3c8dd98a8 Out = b8f0e5ad1e743bab0f43d4cf3d1934138f33c5c778f9d249efc11d194fe88c65b58fbf18c47ff972e31120e02a5ff3a3f181b43e5f0975e38115ce0a6748cbdd0aefc864af0bf4e4805650ba6af87a194ba91c9cfc6db0ac2f577965dbfc7aa43252efb63238612572049917ef253c19ef9f19d64c3be13ba6 Key = 901494dcd7dd930c055f30129ae21c2c Out = 9db3f8cd0ca5be1f6a689b00acbca931a5de58d629e11602f55d3db1148791104bb234e9e8f2b7d7396065373cf47f8d12f49208413a1f849fab25c843ea01c6a86d8272ead1e3301f89a72a53f68b012bea23d1ccb996e8417a6ff86f639d25b57572b16f2f113384a3d083220ebfbce8349728e3991e6287 Key = 9e6cf1c497e49dc4cbf2b8e455d2df5e Out = 441cbd495af810621e9507826f2dc54252cf9381e5e5702a6be1f78aaef61f9ad9a274c02b841c184d3976b4c65ddcd42bdf47e974332ab850cee836483737c3895373e6cd5f313ed2e808748fa3bf21730a73ee877d2afc37716eb236c36f56a163b0165628f9e294e2e15d730a73bc89e5943cc035d1fe5f Key = ba54d45ae847c088cf8c4c15d0c9147d Out = dc549f54bf58a3e37d3d98f9e45adb1af28009838f2301a6d024803f49d570bf367516240c74246fb6de7bd5781939bb620e59da45ec8b9fe1136f289f84a3145708d92ac815f6c2eed131f2138231c1fe248cc0277c3e7c949204f125a3e74a1f3834a7dbc8248b37a66afdde864cb30d094897907e3f4b17 Key = d7811df03809c864b159e914b07974ec Out = d293cf5c6205e563477e555c6a864098748ae53b7e4773dbabc4d50b2b369ca2424b1a1f1fb104cf1fbe25876ff2bf69da04d1eff8ea4edbbeb8726ce8aff0ed983416b76218cc2c82e8bb04541885aae8a317dad52e964172abc158eb7c6edeb47738e7b0e5bf7e112816b706e30f3404beb371f1931c8196 Key = b3dfb39d5d93bb59f2b9db8216b5f647 Out = 8d474da9e56603dad49af7e5f3ae7db668cb963b635c63ed92777a14c5a950f163c536054e11b6a6020433d5e9df95f841ed64a39887e76daf8b5e16096bc2d02b7bfa742a56ded86ee7e033e978343caee89883411e275b087703f7c76b49584d52a3868347d79d015de883e177c255851df2f3e3adbc01cb Key = 80ed8806ce20dd7d48558fad24c097fe Out = 41e325603caf25ae17957daf58608698ae98b878b5951f9a8b6ac451cea7046df9640cc0ee11b5156f619563e08d82cb51ac0a937e267c610d255288b94c6a063356900bca8aed7962ecc90cbfb8dd238821fb32066f6c19eac1fcb17de0be5d391cba0736e490b7c5d6f9048af933c338b1c8352becb5b32e Key = 8da1ddaedfd313edbcad743db2512b6d Out = efea6ea03a1035a6d49fd2b07d0112a5ca46efb3d921bec8d49c79d46761b658f813f9e6a4e7696e978e3041f46c67a8915e343bf594f895d4b2df6e38cd60264da3ad58c2757a7c8f9b798254254a9354de8dc4b2c8b334f2304a33bb50259cf0d9904eadd507aefba87f420ceabb8954ea47165066636a69ea Key = ed85ca41b7b6c8d78abd6eeb78b485f7 Out = 55991343384d28facc800cc6ab1de2f2a8abcd79971ea545b366ae7efdebf1acbf25b81e20ceeec684038369945df716c3b4e93c8acdf60ddce26236860408104d72d2be3e9ba4c5ea511aebdb82fdc8132a37c9beda4093a8f861e13764c4edae1ae9c42053e4542ffb15022e059206ccadc35965e4399614c0 Key = d261cabd0e90dcf0805b5534e2e8d67c Out = 113737dc3e7f9cdcd1308d27e6c9c9ea150f4f99ca2b51137f50e7387859cfa0194c112e0820c6c8653f018fff9be529e6fdb014ab9650a442a4516ad9ac399e68e22d0aa1965b2326ae1e210e131bde24ee8e08f863991945decd85b0108d87fd147dff6c8de15ec5808bea0c4be73151201c819da519280016 Key = cdc4eeb150ad1da6300e33fe9ea8f831 Out = dfe774ee1cfb5272e95c241c28d6d790699a028ee7c1fab355c457a5f6cfe9f3ad5804b3102ea1c6b5e0a997ac6a76e8c834c9b4fe5bbf9f109322e7bf21452a0ba01f77400a9a20de00bbe413752059ebf7eac5f4e3c6c6000575c1ccf2e3f654ea87e08d3734050b5df2d82cbaac1ff7a11ab50f9c39efd3bb Key = bb3f7f8788ed74f0b9548bfcdb605905 Out = 1b78d63a8b985abfe65f1c5f338f033bc57cbe74299e0f719bb6cabb2ba94680ef8406aa90fc807880eea4baab02d54d0d43824d3ba7e0a3703375e39e20e53505e7b2cc7ecb3c47a18a0509f1a0b80f2df81bd5c6ade84f69316606a2dbf6993c13daab34e680ec4f7969993905dcf93d574e22c4ec229d2227 Key = 2eae76f4e7f48d36cd83607813ce6bd9 Out = a64a34e5dd79c1997fab6b1fb0ca1e7c42b1462fbe8427385cca3d71f04edd7eca815782b52414d27522103f90de786a102b8b585491465d1a99df8aeddb350ea9aed9c26fe740696733fb8239bdb089aa5fa8efa34af1027433ae1f3f5292ea09ca5dd5005279aacf4869bec2061f92222285937ff1bf5a3c14 Key = 899a87d074fe3387652cdc2dcc2d7bab Out = 9c5bae32c016cef44529912576fcd7a2e503835b3d886604c3b8897c9ee78eb7a36d7165737814b47b04448fde8d8e0bd0394b78b08047492b48f3c408246d14714b52d13026ac8ab1847d7ec2bcca774c75e3eff18e5ccdbe0a354addd36ac9f9cd1e659ad6e730662fd7d3b6de62fa00751587a439bd8cdff0 Key = f3dff595bf0fe38fc469e1b3407c4faf Out = aba28ec1e2852e7b28f0ae4275e622778771eb9549ec704827d57cd54350b79070f9abf0c494a0877302f58f092ed046b3f4af9bc5fcc1e5b737693ff03a5ec40e1a849aeb1878f4408d73c7fe2e8c83366adb477b790520678515d491292fdfbf44bb5ef8cdb442e8becb87215f06a2bd3946d0571c4b8ca953 Key = dcb8bd1061401f3939033428245350ee Out = 5ee28159e0c177a2a56b6cb653b476ac8a6c2071af476b95950e314f31288dae1946681eec9679a2acfcf9c9b1014f8c03f77f41c1e6acf477535c0a3c608750bea01d13cb41946733e7dc0df2c0b6a57c46f3182f88b0e90d7d49e03608d3410c680c4bb0dd24be667217c30401e8bf1b12cc958e81a1f9690b Key = e891dbd84408149418b5d3448052bd89 Out = f10a75b535a3542b8e3b1b04b77122835ec4f7baf1f445daa8bf266c50fcc325006331d40e06f3dd4cc612c69c91b9da45eab649947d6494001d7a25cf09769c0f2ac168a1e31643d2ff4bb276198a830b240c138e3084cfaacdb13b5d936bb5db63e055ae9d21e717bd08635520136512657d4ea3c17c334d5f7f Key = adbf674abb096ebd067c5c68f042bb75 Out = 1f8263f3c52725517c566df4e89fb45019225ed7c7504c7a4a87908c6ad423d219e3790cd696d5ed5035814ea3d9e2c1f69577f5ad73d8224aac8150d657062d4c1ec44d14202739ade6658c002769ee38b52cd4d75bfd53ca5f42c903bd5b3122f79aaeefcde93f4ccd3585917fa902ea402dc7ca3a438ae97499 Key = 4d65ca80dcc0df0b1ba48f27847441ee Out = 573c1d118854106753503fbf283fad35e1ed29b0f264bfef4a01f8837dc7cfc8fb02a6f30b82ccf6c41c962c938616795bda8c50835e33dec86ae7035fbfb9c098754f45620fa1fa049ca5724a7495ce8019db939f9167ac3438a6c383aab7f25a187cb05aaaebdedb071f756c7f3ffcc065eeb67b1458a0d8d295 Key = 0db6b578ded2f151ed0f34d9a24bb4fd Out = 33030f8c04caa8e41dc04371d2fd1baad69ab299178417c77f4fd32a19dd7090e2e024edd5ecf7c0f391fc9852e3b44d3fd400c57fa01aec8f648046606f8d4e2d9f7a52302a7b535bde56de93cc6bd7a8a69e450d6076a946914186ccd0d5c60b7db15b77c90d7a6d3d55f1480202a98f955f7e7a199e70d49075 Key = ff557fed91c7ef8c26f3ef431817d2ee Out = 7a696c7c9c722222a908fbd204f046e2f55ce6a3c7c6cacab7e584c95d8e5ce9219cc555b9c23078579fb438943271a31679f952efb8f918eb6fae893034b0510c088956b5c262f6f9524281e6d68f2089b12728cd7177c43091165532fd7914b15498e2de96da0603ae308d4236f5c9b723e87b98ffce84b04dbf Key = 449ccf720646401190b02536e6a0bf6c Out = 8660d7a5d3a44f9890d6c90751f2fadda22b7adda5e0efa3cfe2031cc6b91a516186f3344f298e9a873151b4d1060ff203b1c767e47ba5e004de2a9f726aa0ba9fe6aa530d07c5c53132670989202235784bf782da655060e0af973cbf82f95088fa7a4ddb7a1e8b31689ce093fa7034133ee76cfbdb76f79b972d Key = 9aa172fd559569e2898b147e1ce12452 Out = 59456e6058258042a84793f14f9474ab07a79372c4ec687eb30b59f478441854cf455c683ffe9763afa2db6c5dce10d06383f26ff63911baa611c662833840b702d42c7921d50c874ae837a0ee3aa3f6b5c3f8d3c3d7404e77f431bfc240f9ee4a946135617d5ffe1125751fe1e71b25289db2cb28805c5ab516b7 Key = ab0de5d25eb1068b25c7bfb1f8bdd4cf Out = a3c58c5fb27b8eef8df1aa3545d9ae78543c2525295017cd9898db2792a15dd40dbd9e093a639c56600cc81f8922c4873c716f2db60cb4bc0d668d88e4ccf38ebf2f16bb7bd30ff7dce5568a67645139d531b06331bd49730685e5528912b30a86e627dfa291d0dec088a038fd0d5525214f508f37bc6316dd130f Key = 00ee04102f7b4bb12c2a902b292fc9e6 Out = 7fc145f7f0bf7e4c27e7e158cbb1376cce01804fa5283af12fb51f25ef918c0a1dbbe714c78a702b9a9d8e80d727c73fc4b41978bed3f1a4f83a8f759beb8b03e874f6bb029bd22170ba1c71680cddc6eb0b70d57267aa7b1916976ff7e88278fd968656f003d9cb95627a04a53e729092229c4ff8b8e96771dfa3 Key = a882259470d27a0bf1e2d4a17e85476e Out = 33c70f7de49238d80b55f02e0e737919de2542b2c8891b3261ae320694bd1ea7568dfd3806fc7ac60d6929637ee00c831b3a210104cc4b161d4e85f14aafa1e1ad067274c57249eebc29533495ad7641e7c49911f8ae9c7f33b60c69551f34cb256e17efe528b64181818430ba548bb99422f43b7acb619fb4c964e5 Key = d7f41fcb33e4833d3ee5604b62c5185e Out = e3812ec3a89ac43bc56f270e7578f34b1998c62f7213ab77b7affcc5ce47612f5bb950290cae9bfc14730c5cc28ea0fb1af314aef8e28c23794e0b74dd900e04abf655123cd3efb0c4c45bc3713532b5c5d1878d1875f3c1c11e8840b34d2400c282f0e60003a6086ec193e3f0da1dc11f8af352088bac778e6ea7b7 Key = da9439bd090dfc2eccc1203a7a82c5d6 Out = aa68baac0c6649f011d77e0d4b149d3912783726ebaa97683532638e6287cf8d811d700f848929bb32217cdd9a9a389f0bf13d1a19c0d97f7b2055534fc271997bee3345a49b530284e89383a9f6776a212d7b58284703bdeaf9667b39cc42cafe78725a30a2d617a95e051979e97437336ae3b22981a9015f7490ca Key = 409f0d5343deb8595574cecf141b7351 Out = 054dbf64f9bf4d0eb7d1d123cc49b0173080daa22a929524dd29b05fd8c5dedc5fce7b3757a779b553448cd1cf86212c4cac79077324ad273ed2c037ad8a3ccd90ebe8f399771213d0b84d2882be67bb54181c6f88f806ba667950afdda69ed94fcd7fc8ee4e1e4060d65809f49406558284fb66bfc8cf8f25cb185d Key = 3da24559d335d128504357c23f7bdedf Out = c665fc5cb2f2e7ab50e762f99aecf157be29428a8ec3ea47b1076c710edb18419ac6f90a3c37f817e314492341ea41ff130304bb3c35e54c81eabb095c16c007ee703381af7b1e79676c222c44117234482052a201d6d5c9a77a75f6a11906016c7caf31db658a34dcaa3631eebca8bcd04cab0518dc8110dd5f43ad Key = 5f9620688c1ab390b018b5d4447a7710 Out = 67f1c4b7b53bda79d486fd8531ccacf374cd247575b49d45ac22880a1274f514cad225631cf1e6d6b9db435c702d585d32d5dfbd19c0fb896752e017a2332f335bacf4efe31f09efd1d72a5d0d246f42ecba09fd410ce92087730a2c481d6729b58e51c8e33a93b76dd834a24894e26a240ee15df7b4f50e8b69ac56 Key = f926be49a3d5ef3e6ac78099759d5e20 Out = 1b89b49ad3336ffdd944bbf897127bea6f206c49f639dde3f2d063134523b4b7cc7b652f6d129bff6a66ec57d80d4e494c49cbdd40dd7f30134fae193108fe47b34ede684a4beac23b087ecf70bbc5059589d05ec9e3a283d37198ded7a51a7de83e3e3d15ba2151768a34aa2fc3c3747237a660851b03cd8323a00c Key = bc8bbf2eedfd937413db47acb55fbe7a Out = 64bdf6c26d95bb69111ae6b22c20a6019ca1787e1b690eac140114d111573d3a06aa0a4feed03711be27602f26290fe72b34139a511a96524723a3c145af06a256f1bfa952787cebfce330dda0ade1c109fd20e9453d4f56a781bc6365cb0322484e0b3dd5440dde762663d6fc17feaf1d3a9d5fb2d205e8486f1fc6 Key = 086fa00b43e0272a1042ee53566cbb48 Out = 5b32e5d6bb6d621cd8e6ed1c3f12bb9ab6690bfc2e10c116d90365c2d7ddac5e0ed0004df199dea9e9fda9e93b7cc43976d2c87dc00c63cc2b2fa0f3dd60c4baa0e16731c3f9a98f59371ba1c30dff28593d44c2e7c4a69d335e501d750b1e3bf1db6c2c3385c11b99a88b0a25edcd1f1b17e0da27bb0b9676475e7c Key = d4864e1066c400faed9d69228cb96093 Out = bb406e05a5226929321dc9d373f54daa6dff6429280633032b9261c62cc763a7e0a6928d759d70c5d7ac0ea9e2e95c583482c01a5fe3f9188d55251be4c294229b4e85342eb11e3a6507a40588f01fb2397360021f62dca3392673992efa9d87d78a9d32cc79dea8f07ab718351abe9117e097ada9db8350856ddefb3e Key = 78b384369b2ea172724aa49f8581f223 Out = 224c6d9edbe16e2578f6439bf21c925b33bf9cfb4f12faa369aad25d400591da7a5feb56cfa2b57a501a32d49e2d2465763f66ef6a624e274af24d86810dc3e62eedc5742bac7c2802748e2b85e83ab2fa0690424932434d8ee35e54b17064973aa095504ae3c36b6af5ad9c95ccc9792d45d7871f42ccb37c1a9376d5 Key = b5f0d6509034cf5bccad1c8d2edec618 Out = c86a22a6e2d59f7cee21286eab5d70a04b596000c29dfafc08492876677b9ef3dba2992843bf92e09b9a33f6f593fc082aad6d2f1c6782ebab7d3a9fbef707732207fdfc29eae3bc1e725080eff08fc74d1e3ae6486fd7f612633886d020e985608041334bdb659c3e7daa07f8adf8c6235ade2647384fbbd92d8ef3af Key = fc77a08c0593ed01cb086e19f38177e4 Out = b1c3231dffdaf14651df7cc473d1ca0770dbeba594735eeaa5a2d2f1e55175cb8b724ba54bb88b542c84c32bf3472cf50a35bee66bc33329e754d1f352d0beac9b50d40468c66f698425218f0d4f02933b2d34c960774074e9d96c918697bc0100d3a1ea1863bd81047f85c1dd4af6921a929daad113d88908921dbd59 Key = b95abac35fd739a6d3612583964a17e0 Out = efc9eb8de4410091e9bd5340fb1ff99487c4efd096416cd98fcfd89f2f58aa9f3215f3a690f910cb1d22c7614bcf6343a4ce3ff0eba5b206de6fa1a8aca12950aac3f315d557be786d9dadc4901901c1dde24c06bd1005348c75db67484b95903e9b42ec4bd7761f4fc74f28f129b5e55fd38a2a2e360c281f29544bf7 Key = 1a9574d5e39a838b59b111a6fb2cba9f Out = 2bd78b044985d5b053315ccfac08f18670560aa0bb97e323a78b5954eb0822d84e67ea639df388c97d5e8e105cbf56e184bb15ff39efb299a4efd3cc54731adc0f16925b46421c50764e095b83efa772b4ad876cab4f2c1ece9ff1e922b9155c44c2abc434009107edf6f43a10d6ea563d3cd1fb84c8c237287e1601a7 Key = ecd303f605ce836531243578b89034f4 Out = 980e30ef3ec20d065c5bc0217afe380a218d5a8f9cd0d93fadcde1e44f4852c11d1a22d0a00aaf4e80df8e0101f78e1b9d916ed608f0ca09708eb71bead8b43e3880ed9dbffc585891f66f18a3606d369412eb3d976661267d4058b942460b8d19c377b60eb60590778bd2087936ebaaedf91cc3f28ae55f3c4ae851b2 Key = b560ebd7d836ee7d1b0fba532686ccf7 Out = df1143c0e7cfa2e8d4f0be58e1816d4940a21b4a276d41b318ed7b00640b324bb01136c9b2d1a693e67dca68a7a87505f88251895b6dd2547d2465d9b0fff5b6466b7de6f9cd18740e91da35b7c34cbfa9182a917a8b681040fd802239cf364db757fd618d9a98ec4137adbc8ef26f5524a97cecf0181ecf2a4dd4d5a9 Key = a38d3d173a6ee95fb72f38fe7b451a2f Out = 690a99982f2d399288db819a84f2b1b37b5269d43910b405220bc8883d52fbe60e124236d0aec89c22dc02a99d9877a72bf36b5485120dd8084e14517531b377164c467a65cb362747590e462f63449840b04a067cf90e154b22e0e33fb9eeea23a06e2ff6aa69a09bc1ca73e2e7cdf86cde77aa3d662a5792a4938e2e Key = 1dc2860c36f8a0cb16424598b8805f07 Out = 04b79a3bb249b910ab21ae6c97fd6a3c364083dc6d9de292e7a1346e61467dd71a95c1b83d197586a9e586dd5ba2351625d1b022d3fb4afeb3b538a7c153216581a9061ef86903cbc8808cfdf74d46a17412cd18d39adb09e4ab8185d86c4b3cd1cb96b870b50ec956d38f9a46ae45be2ffa982f4a668d7032821c6b06ea Key = 297dbc3c364cb0804aadf0d16475923b Out = b859011963207243659d6a83c49e4c5919bbe5e79a0c9a31981d94262b3e837f8343e0c429c20b568dfa0cc7972e8c26f17ed764b065603e16e33b755cdb37a710d2883ad76ba75f665c66ebe4c671273e2f927a6bf6286c6d5219e9b8062a5bedc5c113361b1205caf18b2cde5c94073f04450c1bc4f42b0e90d0adaf33 Key = 6cfa4240b15010ab3b94dcbce24fdc69 Out = b790f82c77cbb296417ad88f051471b9f38e4cf43a90ff6076953ab21dd03d0934035cc2ae14842ad89eb02bc071e3d14126c23d45671c2dd20aec1da024bf36f3dab07d1099093c0e455e4def481908f921e200e62d01931897ca7b64cf444d90c88a24d27ef9ad08954bb6111e433b4479a0a4110ab25943ce8ea2dd26 Key = d42a9a2369a7af82b7bda82081b7f9b3 Out = bfe54fc2d61f41eda65a4271b60c1e393712129b3f5931bf6f1fed34ba3c47c19f221952f13638d48105abe3b44dbd55e77f5bcba08899b0d4bc6a5258e5e2943c8b8e11257ed55bc2e696b4e5e05b912f75207bada0791046751a0596470377929f8694d2bf562b1cb384ca9c5a70aa8527c6ab3a244a79eed4f0aa9fe8 Key = 9ab4d49d7a2878eb1cd8e761ae8adf98 Out = c502fd12129e9e4db867893310c68b04fda85501108ee8188bf80c415a92793b9005c32e7aff68c829a5fd665dd66165478d4e16794bf022db5ceec0d8128968a53d404424854d1de06d2b692ecb4d91affe814264d8a62e369bc74f06800d8a3751a52a403b1e849b683bcf76cfede685fa77d908c2f278eed9699b9c88 Key = b54108207cb0a9b0b588da361f9af62e Out = d82c438046334a1d7d47cdad4bf3c346fecf572a7c8e72c9e0fb2376bbd2a6c4fcc8e5422e27dd93cbc5f3dbcec01ee66e7a1f179753b65c573f0cbacede17a727d0cefda1e29894725154cd3f39f2e0a7bcccf3e4ecb20db348f9786efad37180386c9b26407498af6a9efdea9dcb0b5fa3afc6f525959f42aef291e769 Key = cf74770f0fa16711d04ed999e54d5ebe Out = bfe44679264a09cfb26712dd5f3dbc263d9b0f582b7565124b923564567667151168ac3b6cef20dd53f1db6b55c8f30ce556399fc85d71c62a57cd1ffedf5d6463882d08ee936b394818a1029ea158044c3e49d07b96e17934c62a7f658eb1c06cafa7c2fcd8967cffd518a774f5c58672ab90800e64b992d4e2ed375f8e Key = 989dd16159e88aa582d0e2ad78fd7003 Out = 2ec59884921ecbe135dd2396c59508291dee1ad86d83dc4ed71a3ac5650e8bae2b20bcf5fb23d7299d1083c29fb2e503e13158bc0705643a9dfb37ff449b650a4419c49bdd4f737cbec809d71bd7f66f389bea8a048e3a5a5d8777428014e651f8498a918ced87c67d68592df27d87830328d14c612eb224ceef01707aa2 Key = 08fe984ae6698a19c52a6e36550198ef Out = 22cb4952fdd0fa8492460517c5351ceb05bafd8720424a6c5aaade3232ef003f1817427031e2e66dbcb3564b2c911cbec7a4d7738204ceb556a4fc270ddd578e2d5ad1d9b3e12adcf7f6e7b43c81ddf5a9647486b172a4ac308ca9e56e944d9221f1b384c97267032b500ba9268d108df7c0a1d33e79c9db1cb27c418cc2 Key = ec083a82c1af14caade2d6afb4e5c635 Out = 54450f356d706906fb6be0d6d88a2b933cd2e2130d76b9edf49045a2037128ac36005330b28676ef1b61fa724a63f41ffd923a6e1c89bf997f823b958113384ec6bf0e3664e40d973f98ccbbe92101c36f47e348a367644ae8498a7983ba54228ebaa8c3bbb92366998f0016781ef0484e4c511ed5e1833592e7e599947042 Key = 97f4ddd3d1695b066c355b1a38fdbff6 Out = 70621d6ca96be36691cf34d738d271034644ad1e7a0a4ce959b3f69dbbc69de2112c827748ecad24aabc9781b2cded98d34cc8bae901d6bfce7d621c874fe99648fa23026029a4c5ac2169a8bae086ed5a94500b4297f69bf9cca5d060eb4b6f1c63a79370adba10be129e8dce755cbd3b168b8ea7c776b6c2fcf00207b38a Key = 7ec904b376ecb972db147bbf79ef0ce6 Out = 0f233af03ebe37ac958197b5fd2141f93689392aa7d2cada5be572c529c8aee57f0a1036934cadc91afc70d6dccb5c938205880f83a3b7417990708e553f70652375f65bbd21807b1bad65ac810ba9d448824b96b16d2b716b3bc8679f73b67f98d4b1b2fe96c2c86b9de8d425ce2ac00a1ff6526751d97f3593fcc3d02375 Key = 65b08c32400326e6dd416f464c89141d Out = c6a1dc96f107562d6f06526fe74ab6fde876443d1c9584dd1e10cfb7b7660e8e8cda305fc10f09938c676236de34bd4196aaf5e2c5a14a4bcf798a9cff40450bb4b3b9af8d2f6dfcd81e537372d0d24db562a63ad44665d5e8eb0afa46e3c58e3284f33afb420cae37ae41c12bb7b667c61448403d70dc8ec0627278a03669 Key = f9fa5b7feb0ab50dabd286609f6e871d Out = 25064cc2c0e4093b8d7007230841ab969ef9be256ef06087d36959cb1026500f53ba46818c01ce47a2f9ebdd0433db9af7074c87e846f052e342bad14e9fa7a0e120621fd9c458fb13c66e4126f20bd7f5f76e35738c85c21490d072674ccc19acbc14b8f9d5443757f42574f671f164a9346427b11fbc4fd8f740a866e36a Key = fe0e26b47df48b854b0b0320aa9b8a24 Out = aa6a03ee157c0827ad8ee47ad6278ac785936f5192be7faf2c85eead342326f2a791f56c26c276301ef16eac7774b7f7a0fd41785bc1d98178b274698171874f4aa5311105464666b5add8295787cf5f2daf6b163db20195e529c382252ded6060731a2e30cf0e5c708d61ed24c89e857be6b188fae3b1973fbcdb42a22fb0 Key = f6cb4f2efb487a05adcc5c523239619c Out = 728e20881d6ff0c864d620fb679b4e3d1dd2be402489e9cfeb82f81bb47b1c04d234ae5f62f6a893a563ce4ae93f28c832c5b988f30cebb66cade5b5c1eea2efb9bf0d8551c5d790ffbba9bd893563551f6e05af0648c94c057a3748d1f5afd4a0f40d57b74d0c29125314996368f52d24206f8cff0a68a3437f86dbc3a0d3 Key = 1d84bbbcf7fe765705746f98018a4ed7 Out = 66672d2bc224d99dc7b106a86432cd9f9456c6518f12863577d8d2891cb95d187252ec727682906ef17453f411032618828691e7210b01d7f5f184c2e758699500047fb6670449e776427d98cc48f524095f3338e3c6bfe35e7ec43475a5ded6ed279a9de11e36d9b044a2aa8f79249cd959811dcceee1c7f5a66beed8110a Key = 7fb4a31e06b42c273c5c931a334b8830 Out = a44ed3d3656b3f89535304239759ad7cdb5027b93f7b26a0ed143f8fc35363a17ef654fc5ed07f4f6815d1bdfb427b0d324af6a34a367aab1aa9ca9da922e52d04876cb3f488a4558bb37df1cebfce741e263080d1a33bb0083406ea5d2c137293bb72a2993987058947201fd5f441a83e4603ac0603ad65f54e06b35e3b76 Key = c820321ea329841821ac4b1f3d047b21 Out = 70a9a93ecfbee007eaa964ae6f305c78947a603192625b97346fd58f7d061462dab9fe6e7201b477d2761eeec7ad95b2ac4df0658c9350d4183eb10b9353d9fea26a0254fd97c45030b947e35b0d4a0305e9212fa1193a7a60b7bb68a61a9c80f658c46584c8cf022264225f733a6646d03c9bdde8900fa32719becb12bcbc08 Key = 76eab5d61ac50f3fb5b347d38db5ea34 Out = d7146d6cfedd7fc7267b7488e2111c5b6e768e4e67c3c78c10d6f4074daea55cf0c7917c5b738c2bd78ffc0ca9097984b3b64d4c11ba047aadbe4fb30771f37bcec703c4f533b3e02a8d6636efd161feb723f153f16a63f2ffe9f1507f4b77e963a52907e5b29fd502464d040417646b1410757c6691e13fdff1aef3853665db Key = 9b81904bd4bd65759dcf2980bbf769d2 Out = c689d4103105e054a96858702a78f8057d5eb3f3c999c5839fa8c9f4500203b89a3e56f3687ffb0c30315689c39cdd033a6e736edf9158e433e44d944a86926e5eaff3f049e922e4fc07d2c15092bdf1ed978c506786b134b10c8fb9cde9a231bfc821c07dc041a947fa49396c3221c5cebbc1abc92cd4c4a213180b883b3196 Key = 654464ffacdaa47acc09a9f10f84abd1 Out = 10afd4e9f29a19f3d7f16a11082825e49a5f7ea2502d0a5b28d4a5e924313ad05d9a8ab95105b60f72d1f9a4449f6868924af86cd652ad845465c244db14ab5b480800bb8ca09c8fa12ac22cd7849631f4c1656fee658ab65537abfec183b66ce97e3c86f54272b2d4c2914be3a3fd5925363d929530ac31c49d2eb2927ad69c Key = 239c34537020ac1fafb33dd3a6d9e9b3 Out = b7061ccd958ff0fa53e7693c4f1b3c649bfd1bea417ff0023f6ef24c362612322f1f992ced85b401d587b27cbbdb36e898b31ffccb7e14ad694cea5d26970a67dbfa59023b7f11e84ce8106948e7dfac71e570152fedf2320d405f9adb17542b4be48b419d0d6e3bf2c24de4bda0a6513d81f677824e037ebfc24909cc507b08 Key = 718b9d3439409930b8a8f1b8b14b9e32 Out = 35bd83d4f10f12d337d7bff45a4618d2dbca77918cd9a0b05ca38baa0e030f656ecc719a1b1fadfaa55b06c5cd7a14777a0078179203fb98ebff1169476d86d13890cf92c7ffec33a04fbb7f0f57e99ea178471cc1f7cda10dd84c1c4d847b29289dc9ac7d29835d3a568f75adfa41e438cff21202caadc6fcd9fa780f923826 Key = 9de2e6d4cd87952bda691c536bde8401 Out = b2b2739f6464964b7b32718dacdd1e917e9db46de6918519359b39faf4628f82d0f0dfa518f6a58ce0ddece317eaaa9157e619005c8b68c34c7241e823f2fb2a0d25944de48cc29611ca534e0110329133f8f45c31d99a3abfd7f39892307fbce482641a7bdc0938898508100150e2d868a97cf402d41b1d0e67fa463f6d4d4c Key = c020076f4e187750544f3ffa98fc028e Out = cd88d10a837672f0a39b616880ff3846faf9b20d6e3495750a148af06403b6435b345afb3fd1fc56202df9788086690b67c8f2029e6c32d7b94c7a0154aa466a296e6f3b348d75fef1d4820753fa3b4315b43f784b7b927e80266c93490b99ccfd7fe64a03ddeb373e41895b81707f3e95604c43fd7d730234fd8eff7226f4ba Key = 978aaeb400f5b60222a796c106d6bb7b Out = 0a674da0f0c48301d9703014f2e7337176f26fbe016380f3814ff7946057bd9ec16a3e589022f5b2e80ed32157db94bc24c0961c4ed0fb9accbb6d810f66b2bfd160854627dba674c858d59980f993b53a1e1050b961c16884c0290b98fa7a41a57a38831b9d1dbc9f9922c8543d69518dd4c98ef8a9dfe60b54d7eb7e0b545b Key = 9ac542038a470906b371d9ee376f7d65 Out = 325e85390bfa7d16127902e72107151ea5ea1b090c3de9e1ce4732a3a1cf5bb3ffc8a8401a48d75c313d0b5373968dc2189d3365a412731e70114fc7ca7ba86fd2d0568c2d5e4a8c5d503a873591b2334c8cb97ffab3c3e0cec7a9132b3f5e2f1426f168b54907bfe59d025625ee589b73e5496d18e20f83f8649e9ae0db6444d9 Key = 9f59902a4dffcf1ab26fda21692c4060 Out = 591d339c9cfd8062f423cd561acf930e2d1486a9838107d7046b8ee80fa2216b4adcbf77164f022d5508498846f1ec76cfc355c65057fc9372fdb5cde94c24935535fc1ef5bbe4fb39a215b04c8367c24ee69e7a8fb10b744e82486b8901e9c56d081a06ce8a0b69e8bd10a99d1129c2850caf8675b76a55f4561b38ecc7ca9296 Key = ed411f69891bc41fb9dbd242a45ad502 Out = ee6be928db5957ea5b93825ce93f0b7c8e67dd6b7caf04aa98b3ed93a6a40abafcd8a3cc424fcfaea10e8022fdc99dc164a514af7365fabe5d7c8c7ade6fcc17a2aeaae5a3af282cb9a275e22d235d13c0f2ea6a8ed2acc88b9fb827ddbbe855c5468a55650a613ad55e0bcdcfc47453519c0dd0f6c17bb72e687ca8793f5137a5 Key = cae31b16ad039d2dd96ecf7e704f81ac Out = b45004370644c1b97a8e1a9991f0f764ae555fa95c929a596038df34870159134ccb8a5d79e467722218b7aea2fc00af586c335907769b2fc9ca958785c6c4605ea3efb0660dce80e08254f44d85295949f6f038d8f9946515fcab666289bf16382598da81723ba81c9ecbc51c587695972d50ab2b3c2ee6d7299436c799c3206b Key = 245783a1944449ed14dc8284d163f168 Out = ecbd795610d89f353f6aa6e45444e130e6cf099362f5bc079fbea4562c7f5272d582440078b9a39e57716bbb26a65983fcea18458a89db03cc5373d597109007605d37ad0484db73dd463d6b3c07749b37d4fd027486e3f4574a01142d2ab7e7d2d87ff669ee0275cd1734ea00bcd78d8cee96fd6d8f24b50b3ea2ba23450a69d9 Key = c3cda27a5a342506b5650c2324fecb88 Out = 86f010e1609d6b5953bf116b197807715235c61a113612e4d72a557f16cb562ec658554d0b81489df342e4130bf91dae405e522cac94ec9bab0a085143ab7e69e9b8a7405eaf1f3d187065931c651c9d167838f5605157102ff8a7bc625869ef9e744c246ef6b2af6554a35c3ffe4ff7a2d7733d3b601b47b1102a6fd6bcc8b355 Key = 2530c74d87674e732696dac2a134160a Out = 75dfa7d28fd014e33a767eff1c2823e9de0487bb14c3c0c5b2c8a1e26df0f6d22e06ab6fe623a9ca643ed3431a1a0d6ac16c9d8875f3a8c7dfb98649ef420186c423e339ea6b3a786d2db1a5e4f114f8339220f4250d51da7f2e840e9a52166d0d012804aeed73996a53150e9c74c9aae08c2b5c0dcd38c72e7e2bb0f64fc56fd1 Key = dc3647e9f4abf20d5753c27f9a028fc8 Out = bd223fccea6248d3870e93057f3a52b394f516978650f101bc33b3d01adcccc203642d48e13eb32c69d73ec887538be226acedab48cd398d97dc8a29f1487f3367c0af3c309eb371a4e8e7222c2dd2bbca5d624f9273845b296b37a78f159d350d23e2ed281eaf4827d0c1c135c3d2050c00423c6dcea288605b927ac764e9c73a Key = 46dd4243a48a2bfa67c338eb8f9a04d2 Out = 91beb82e4d27eb3ca460462a5ef4ffbbc1507312f26f6c98a91d3ffad79ff9c984ed18b790fb5f4280026e55ae87f35ee156254d8203e0d2d8cc9bc1bb4ac48737e546f46090c009621ccbde9a67e8b9164add3e2c2a393008fd54e632c8bd030bb5069a1351f8de938b483b9e13cb0d3a3d9422b4a76b747b51ce0246288b9747 Key = a263d35c6bac4c37461a4aa30af38db5 Out = 610d9fc67f912dab42f48609a38d887b14b728d4e934c83b0d74d99a6834b310b0ded64e8bbbb7e1bd39fda574c5e921233d6a05de89963527bc1434ca59ee2da4de5bba6659343fe4d2d4572b1dbef55df93baa89d4efb2d0140a9fdac778f11703d46aec408f7e666dab59346fc0c75e621a848c964a64e89056eb8c4f242606db Key = e583a579c4419c487bec6baa22cc8a4b Out = 109ba5fa32cab9537b84e2f5ae62d393ca9234f0374ce7f780e7da9a992a2c96c577fb5b37e604bf77e493ebc2ed3ba6059ffed3d83fd823d4a7e9788199950a287d7df302b57de98548ae64d1263d6d6629e52c5d4a5c7f814678385ecc68236c865627a603d7bbee7b631edb4a7a9ef75bee493cb379fb929d6e8e9211aaeaeb78 Key = 33cec827126d7aabfe80f558e15f0a4a Out = 78ac2791ac35889601472d056bb03bdab2f2432d3219716d05a4ba8df1070ac4b3202c83b87a222448c4717a401987cbf903703c7e0dda210f24d92a7dd2db0960c53719133e41f82ddd9ec4f4d551a102755df8b8679589fe7740f61038a20e2f2573f7a81fcdad4426fa4f7227e26513ff5a8f1f557c58a237f1b43ca9d4933421 Key = 6cb984bd378ea8a8a8dc1985c998c907 Out = 6c32227237860b2f9d9bb2984bb581c4b0244c393d26b5d7dece8e89c95cf8ce4f023ca7989de9c0842b380da41dfa9fdf7e6a23104496c5c15893e1f5953cb7505fdb0bd435912f3b98dac47f8331a0bf44dfbbe0242f55f34c4453f029e708b3058e2ca33ad499ae767680d3376c554daf7ba327179381f7afa9729f7870880f84 Key = 2cf70e14140dabe5e7faea5455c781d0 Out = b7d3d184b0f3733fd4445f0222f3ef8ad87c9ad182a8a4c7f1a90dc03f0ad58da50e06a92ea8437abc3899d30e3a1f37de573bb4f5f6a87393f8fb616a74cd7611b2f12e7796825201dac33b6bc7b4d32913a40ebcf6614a5f73caf57df46bb7d5688578e7cf0aa298461d36239be9524787e49c8be6b111ad4e937dd978100fe024 Key = 78102c5dadc070d9a4df47f89a46767e Out = 366ce36ae5f09eb284c3acd7c506b67b46f66fafeb8838186b28fd5f6b0b6b4bb1513b5b640b5c848c796958da04b1dc004d14833dbc1962662eeecb3ecb66a2b538530896f8921b89e8e61a8584204baba11a1f44d208e9442e7e1a56fd6bdb7c8d86c0b2dcfb78527283da03206ef4ea0b56990eab1f0bdaf8518302c2a0912257 Key = f1a909c2ba5a0fa27f1ae51d5be6a5b2 Out = c275c0898ebb6615a3063c898f4355cb2c834b9c84c605fa2c6a5d18033a13b6f9fd73ba7eddb6730ac9c2739938b7dd9d9b0f6e33bf81cb9af1138f35d4b31829fc16e061f4b7cd81ca90a7fd818121d9685f25a45df9703f93b210b1bc21c9b8ebf0b46e19b8a96bb4fff133ccc380d73848d58d52904788762508abe228b6f5be Key = acc647cdcffc06a34cc52cf167a43ef1 Out = fdba258ea41cba13367cfed0b2dc4ad60ab8cfcbb63e2d9f48fc6ccef9bf0395f670aff3773f23f5df3a4a686bdf3886c4bc5c8b686ce17e8ea22738d4584f8e1404743110c17bf148bc39ad37709bdd3a9959d87a55c50bf4b8f18befcecea5146b3357008ee6aeb5519c71d63df3ecb0e021ef62f46dfd5e5ea05e8ad826dbd25e Key = d29021c1dbd093103b0531c3c0dac9f8 Out = 88b412508bac420d17320fc6b4d0df4da7b8bba875e564f2407b0e48da816d8e66031efc2665f61adc277cc98c8c40c650e4a5781aca412980e5b703f8ebcc6ee49cd6f84894a67c32e6451a63c681ceec3dabbcd6e8c750cbf2179ccbe5113660f0bed3d8101043f3b2b219fc7b63fb4d8d96952051887ddc28055bed5013ba3097 Key = 50a24a2318eacec5e998aac56fb0a06b Out = 1e1bba5ad0c96a53433e93739c9a4201e0c34a328f89c79c1a07b79d0c2159bedd42cdc07625636fd5117e1de5b3fc192a78e7a6d2532db2c8487f167f36dbf7597edbbab4c18ced29fbae63ddbed49cca6145d2055aef5a9e187e9c59039c8c04d28d0e9556c0320b1197ef89310ccc972f4ea86d2334c86aa365301ace1844b58de8 Key = 3dd19c57c6c747e991233d32786ab713 Out = 67b34180e0703ef38a8e81b6cb49c28fecadf90c063d7ff9a35fb5a7213507e0593703d9dd0c3169d5d5cc7fa04951d9c7c2335cee9429c306267c31b8d4da40f23139cf6e9a8597348dfcee75be3265552bcb5221f964186240145b69a00efc5d22ef7fd99cab58b7b7e6704f7726ca2dea0348d4a9cb92cd8355e38a3c3ac7d9d474 Key = fe2921fe883d15d432f315b145044341 Out = cef0394e00cb6ab771bcd0534d91a935a49868843e4640e4dee17adb5b0c2ae3d9e9d071c4ad9371d72d960991f321aa855ab984c8a2d2cc7ed60d05a7ed17446c12075f39ceded7214245fee9768b92afe686b8fb9c07b92f2edf377054fbcbdc36bc6b9c15d22a2af9e4f98b418e1390d0af6a5d8550aaa62dc4ef4c420c0f1cdb9e Key = 5b2d36153588a96c64a4971934f0c2a8 Out = 666918623581f7edf7a039ffc806f640cd4a162c7f5c2af950749ca9c6105a87c8c9bacf500cf2dfc97cd9413308e690ce7a90a9c1555e06c88e83a011b94c1ed5d4abb467b782c4a15eb27f73336389b77b2272f6806031a49b179445535725b460040193ff01835d8d9835bf5fcf64bc1efae196898d3076d22db9e9f78d05108111 Key = 76ace986dbcae5cca4e670d2d6bed804 Out = eba326d308c177e0fb5fe56b3700d1eb3c85e380bb3aeaba85185cb9ecac57191c8d7963a4104ce231c7b2b3a6d1f22d9de3e95f9b2523adde74f83d56dffa8d4efbcf91e204ca5b4171b2318e50a3c758d623a8e7b68a7fe585bf8bff11449d9e38a853e3931349e2dc9e81d03b8e7d49a59047ff8eb65bfa3b0c359b5951dc6e9a2b Key = a284af2d6496afcbed1622dcc3bfe496 Out = 85d0c53525cc56f90442c2c60b1db66f6c3cc8057bde34727c4f42eb5b3437828a448a90a92384a677a1928d048d81edd3d9b71bfb0f44475cbecaa2372ba7d5eef67e678e6742b39f855dd811a9296acc6737f37c53515f6487e5c2de814f3c9488e3d3fd332dbae0ce8b6e709edb2ef713a41c5a6166f35f4f7cf2ed57738daf7c1e Key = 48ef65f0fc7dff9dc7ec83d701c1b95b Out = a714d83fbb05115c16fcbe215f4b4dd296b82ca6ec018e4a4d0d5f5ffbec4ca98f96265ba89822d6116383ca73191a195e7d377fa41d6118d23dfdc86e3ac2730ca1f2dd05146ebcf288f7c59cb2a3b603efa4a26db653de85ef438667b087577320f11d8faf7cd6993c0a4b3a6adc1af8c07ef16fb4caf0849fbc47d84de649b3cc84 Key = 167db66c16e97184378ea7af8e3eb566 Out = ce68a8df65d0880ec5e997a9ef681e9744723dcb99aecaadd4beb324cb547b800e4fd9ff238c5dc3da0cf28d02892c91e2490da7cdec0de3eae65cb045361c3f5d3785bfb8d471178e437fe41c464cb0146965220c3e765c7bc55099685b8b3b1ecfcdaf5708366f43613cf07f3a00d56adffaa2564ca0e5874931659ab8cb9c2dcab7 Key = 30527d359648617e1fbf04b93f2c9a9c Out = 272bda945953886aa162ac1f594634dc7bc60c088f98523355dab15741f58b3dc6bef5ceaa77f389da0ae742158c4255840fe7dd8d1b2efd11a7cee3fcef1fea69ed64352077622b2e04a5b5b6478ba9b26580274d7d476b310ce8c55243b2b76eb9750e3c526a41168413be863958501af53608bc6d21cc08b58b770424b7720aa876 Key = c0bf6c1400bf6c5a9fd0af6a20777c02 Out = 527f7ab6f283129208f3541c924d53b600cdedc3378c2f63d78c105c03c1993babe0c2da74631d17814f068f25c511385add940264454020100bbafcbb0299e2ccac4c15c41440981ea954f537e21125a7f3eff3e3af5da61bc2d86132fd295422fbd200be479a84dc6f8c9a189f96006db074607af6284829b17edd7d6a9daf640aa4ad Key = 7bbcce4d1c78ffc7c5801e067568be5f Out = 381f591194112c920bd965d63d70cd516793e0668f5056d0ac735b625e210466f85d174910dec7d6facf7a6cc42d04fa786afcab8773297e4d9610bed6dbd79aef79b3ce0416707e9790b75386a67d8371f6caccc54a661c96b383d3d71be1357183f0d55d2c84a4a9591869b28d4264f9835bd6f8c1d413d0cbd8e46a8fd1bb8062fa3e Key = 3d362300ec4cae350901b0130491beea Out = c30a95d7a2b3998226b68839b3df6df3b28d6db9222edf748ed1bd1bb8936a3c5afc8429c56a86990a69a4f6d0f72ec7aed57cb72776b66ae776dd87afe10b2dea44158a7203f45238d47142ec8d955d56e3b93e2eb157f8b3f1f07f9ece8987009aa5f1e32af7e3d2449cda83bddbaa98e2389c33dbe220f703b4ced87206604ecfda4e Key = be0cf188e0b126bff77111b81d13308b Out = c65a6a2cd998915072a0d9486213c7f35bdd7cbbe72b38cccacdf4335a637698355e55e8081d4a476c60ae58f2c2dc102d5e7f912670582ec076e73ec9aa127da267b3f49d4fe9ee517c2a2e1bbf43c379367609189e1299c47e65beefaefda0fac5b01bc2b512a4095dfe33e53ed0d5c636f2d0382470785107cdfbbc9ea4e36cb041bd Key = 9bb1e1693f613b5c9aeefb2a4bc9dd67 Out = 913aa32803a6c6b6f6cfc10e01335b4abb8dc1fdbfadaaa0d5dbda064024c99846e5ad476c8c689914c4b6a171f4bf12dc95bfecf533a120c5f655c641e92916f871e8ca35b28aaeb2d2f1e3ef3f3b2217b39ec56de3a243ccddd777800bfa3fdab32e52a74c74c9b2e2b378070c1c0dd0ba6fc90b66cde14af542145e47cdfebe5315c4 Key = d245db39edd2d4b29cbf614d3ebd00e5 Out = eabce272fd8daa160475e886f48f8f3db5ce5d2bc36fa2ce4b263c346d3d702523d7fc9e2b9857788fe31856c7aa4989b554b29164c7b3f1c68a350c936f6e22891638919208b5d452c325e181a1e65e1992cac93d2b16d0ee10f929a785ecd563f63ebc214b43b177f31b61145451157100fea81479957a75319d445293947881ce3c07 Key = dfa21e90fe1598e7e1f1b8ac6430e1c2 Out = 607371bd8fbb3de03d347a2edd847e0c882ecda97a6cd9926869a513c68f89b59aea1816e1b6cddbccbfcb2ad3c6fffe635070e59bdd48be32dab5a4ee824657fe6373a1539f6b3b526758f52c981c825fdff97e7d593013d979ff891f45067d08a71bf9d746b629a3edecf09a3e16714c546ed14c5c981c938b1ec5e0d63681067ecdc1 Key = 162c8a7db25b38089373fecc45a0eaef Out = cdaec2f7344c84e34cd30c8b72b8ceebb406ce3cb92f6ab9fac44bbd82e0ed5899ee460e32c23ec6b0417882dd24eca3ad3ede0885513b0d6e20ff1f30101cb8fa5ec48221e3dd3bcc8d455ef78409161ceec44a3653f15d8750afe7bf4b2a2090aed7c8d8afd831c753d4a218f3b7dbafd139f8f8cb0704878c053f569284973ed2cf45 Key = 0bede5175d695f1e3078d60ca97eac0f Out = 95b6e7cb9d5f589cc19ba31590bee236a5419e61587f1f2c0106a6e3ef90279d76d2145235784eec5cdc54061531e4ae6b9a75eee2e8085b9d384de98d4a6d5f517b777bad02747244221301d66df481438992e86bbe899e9beb92842ae670010e9ffde75d6d9868260a8b88f8e439934b6389c906f0b040083e4cce8497c8e0cb908130 Key = 90d1e31f48a6ae1b75f28b857868ed50 Out = b1fa3ecb2d1149f28a1ab795c7fac6344cce27940540a430cb702360949854b74b6b5217960a4cbcedc77df6cfd0164d8f6dab6af3a8a16bf25ef278e548ea81baf29afe6758f9a359db1efcf93d4541eb637f239abf23e0487d63402d1e710b015cc72b402b4a1b306e47cff56667f9a941aaa5a00686c35c9e3b218c1164e2ad7328abb5 Key = 86edf88777c0c6848d97378e91677aee Out = a864e8abc946123d15ca584e947f55c2f4879b9bc478f5c0a96da1fffde7c72822939f706537283337e3061682dbf2e7e9cedb7a1029bd4562844fa1dc5a5d89713b951d52144ab2019221670bc330432dd60a7030aba15fd28ceab195288407fd9a8fc20e9eca26c0c6c61305c6e3b5955f8829f1b7d7f11747838126b2c231f450cdd68c Key = adf49ed09c3cbec3076f07804695326e Out = f1b1fddd8e83eec8928ff7e3ff162a5fb6fd7db0239a838e4f8edd6a9596de6fa1ad5a2d6d970afc9f3d80a19fdf7b808494ca43c1671de8cc382872b05218303482306f7de9b0856592ff5236b8bcb1630789f810395034e4b19b496777ab35a482fa68860b363d9973a35b34c34b2da8da0e21c16a9df5f12872431b16f9dc9f7d623e99 Key = 4d92276a0b9d796495d9749ab185b552 Out = 469155b6309d36efaa322a57b06f38c8dfc28dad724ef236de5e1dbfd9916b24b92e21984d79e3aae659c25f8a013250b7dbc7717b86a3a9e253b9b48bc6c9a1a4d3e5eb1ce0bc1f51a45e9772fde8e92e9a6fd3f6d712906b492bf148085f11f478147e2f95314c8dfb0f5bb243c5b692ac037e8f7fa8f5160696a1ec5756fde21115d981 Key = 16ba82c12f91dd56c22672cfea37e2df Out = 885ca547b3be364a574fbf80c809e8039270e4210855fc7d9a1fc1cf5cb9738bade939946b9d749e651a86fcfc5f1bfee814e75e99bb87cce1ae334c467c016d2220e79afda37f2cea38814c1cff5dcf338e7dff25880644646b56b79d1118ff36969ee957b5eb6842168d54b1a8aeb6c973c6c1ad80f1ba32448d0b2265634c9a078bcf1d Key = 82c4d29823dfc33b199bf1cf42b13b87 Out = 7073b2b20087a495eab679db96c5a4654fa319d59228b8ff3bd7a5e83b3238144501d1f5e08668d4101821fe4a68a69ba3953737e199051ae8a2a7683203ca6f6723e3786a74a98d75a9e7854b46632914a60a945ab70258c1aa4e9ae193fb6465b2f35b0d3b2b3a88e15574b7c13fa77e03f69bfd931839af6ff0aed8e63eeaed1c0e4a75 Key = 84281575cf828fa7945fbd14ac3bf449 Out = 071024c3ba5f6cf1d94e4eef20b2b845c61d7eda5267a2239c01b48a779f8462ece7126330f54dcac7c207f9fed476c89292086db087625473eb45c3c107c29d0069be208f66979674c102ca64fe3acad9c6463c04219da62ed882fba65f7a84bab4fcb3212b9c74236fd3f0bfb8b7f95377d2da8cfe459e93726c2db422e3c7ff894e9ae7 Key = 609eae5161f2ed247b32cbf7fc00ada9 Out = b852884f25c7985c3ce1bde9fc2f8d04f7baf839ea9b9e0f872d162642d6a7db1007552377cecc084d1c104db7817070f1a2a95fb40c9b593f5e80baa27acf09f7876cd4559d46b490fb482749bdab98fd159a04ec41473bfcdc73fd92de478da5b0720745fdf1d5c232ac7a9ccb473e0a62141e4692e77a939e5a4652072a4f1b66e94aa7 Key = 6e49304323eb4e202655f3c8b16ebd6b Out = 5b5ed1a1618006c887286dde87906a3bcf304c7dd59976be7b936dc69c4368b24ec3d610ed5c3efeb062c359a423c387c5e398bc2498a25f34a57525b3d562b0fb4af98ccb4ab44751b830187df466473591e8179a5f805fc46d8acb52dbaec54aa53f17407324a1fc809cdcba44a276c669b80f17d49417e28213cb3e9fd685f87acc28d8 Key = c99bc8c3fbcc1a5ebd12ec3f50f3b9ca Out = bcd1233f4f6aaea40a9e6a498f3fd6a36c0ad569f108a4a83e714003ff6bac7231d17621046291cefafd4bf81567820d36bdde2c9fa32d6bc455b496357e9c26f9d01779fcf9ce1b8a9c0e0420d0e880e4628cf942b650f14dc1934fc91b1a9ca3767f76a89ccbf9d0ba516a73ca78cacb4f44eca4afbf58009087a2914cbb85ef2300b31287 Key = c6397920649ecce03f030350ef2b1d82 Out = a0853df02cfa66e8ee184f4f0e034f86f6d3c13b94e7519f6de592215b233c32eb76badffaed85878d3d03ffa42fb630a94cb6681e1808eb93ff23a99abfd4478bda460fda0e8ce15217ea36e1874b0f1edcbba89f51addcb63e0c3ccd67a248d2b86d82dabe0056526b2adb194aeea1a37863d81ff420dce67c07b561046855c5a874280203 Key = 2649ca7df44dbafbcc09f6378abd4e0e Out = 7bd949ee2ac44c91585467876835322986d8633f835c9e519b245cfa0c7674e960085079574f70b4329619a2986e2b49720a4c58510a0f00873ec0d37b4e25b6909d4515ce50a63de498ee3e7ddba3eded3fab5b765734705d90bb35f116828b2675b0478f61c84e9e4b3f2a1473c62f904879130d75862c4f290d3697e5345a7393b12ae411 Key = fe802e75da6b27959622843cab06ae7d Out = e835ae29c0c5b3ebd73f0cc016132e89e81c28feb17dedef264b062a2961bcdf49848b099a88af1117838c47a00c367ec9c123169da86906c1ea5c5619f5dcdaeac12a0388c0b59f703ea20d81570ddd6f934aece8a243ba7e8e0b71cba8676a3e075939c8f7715ff1d0569c8fcc642ef15985fc9202d015517b3191ad1739a4314f36a62597 Key = 0e2e58e8faad4908078be8c25279f075 Out = 6195ec783810cb1ef7dc60759a340d2b5864a108416e9a13a0184035218b03ea78f5b42f3870b39d8a17c9b2d04571b10709e0033286cca7d3bbc81800b7c9b2419a87a8b960a6f0c42014de50c95dd2b331b478022b98222f09cee3b787040d92bec2f19acbd17c36ce63d1f8f9c8018220c746a35824b63a43d273d7b434a7fbb62f225f7c Key = 9b8f0b7da813b900b17d2dd6e11c066d Out = b3395cfa98f182210fd3dcd47203a2efea68721ace7bf1f9c33ca88497359f69f4538a3eee304fa89ecd7be78b4646121c8103196d12d558b481cfdb08e5e7bc462f761cc66bcff4af44c3c7ce7518ccd4b77c465be01b271dcc6371af6148d3aafe02b7ddeb3b870020eb18a641188496cf196bf25aec689871c4f1734509787202f2e588db Key = fedce262d788780ecc02443fb709155d Out = cb39c307d8ae775b5e49340105487797593642e176680c419f662cd966bf14f872b8743a6a59262384a3d7c7fcdacb819ca2116ae42f3dd3d19a90e19062194f0a4bfa2c6f6c06b1b0195fea3ef9fe4c4f807f7e470f88c128ca5dde379a6d42ee3651c9605d50b14c6854ca9f796c081a3555b14f5ad48b3fc9dc7abc5bbdff76e695deadc3 Key = b766868d7247eb82633ee43f7b4b015e Out = a34123cfbff9984537c704141e08a4d7cc557522cd3cd615116d17fb9412d9549e19effe65d8ed4cef3551916ae6b5abff9ac34c6bdc9d590881da86d658cdd8c633c051e588c231900feeae4ea336c16eae768a9129fe6e4eb70c85be9ca06f80acb09e8704a1be398be728a02f93f05669d0e69fd5e7a4a62a5afa4ed00ece7703f874deba Key = e67fb92aeb1541f1b88c88580e2b0801 Out = ea3b49e6304543cd1d0f9776819f80893c0850d281fe36520e1d9d04d8fe2bf07b463a99b90bb545f8a3443194c8ab17c5f42db7475f130f12a2658933e9cf76d93272142e5e553d77569ed896a80c5444a4e93c6da86a0e150521f4602577fb914648bbddb4a167577bc5d118a0a9a7d8f494d9a9feeaeb5acd04f6e2e54a112a134da093d1 Key = 109f1cd703960ad9dabecc228b45aa71 Out = cd6e67bdbff282562ae13d0b5c41c7fe2a53fa1572b31bda57982c3da2ab3a29ee0126072087d7dfaf7efa2601b98e476387ca65abba6772d73414dc8d8ae58fc4b0bc1bcf8dfcba04006774c0490defe5501de032c916b375fdbde9878d1d76bff1e017247b564cf63e4d7b618d16548b4a1a1ea107338aab1cf34112882d21bb1ec25b5bfda3 Key = 144ab8edc40c3a4d3069848a634ba9fc Out = ce638d2d15871f995baa531f62e11bb39e7cb48bf3bcfb66a37376969a4e902ae6fbcfc014a7cb274ca145b50e05a983549b56e38aaadc5f65a84af7309175aee269e0153a47399bbc5f81e43142508630c553131441d6009b6cbb10c2677f77d985736355c0438ce1073b8827e259d77b4be86bf0bc0c591b9024bf118b26f25c3f1327b0a362 Key = dbce11dee7ed2a71d570fe2373baf01d Out = d98f62818391960624b1124aa4a5c49e5520a831164de025ee947e8431c9c3765ecfa59f51e5e6eec6d06cfaea0258627c28b8ddb6945843764b7c3772b589cda8939b667c6ddac8a0b27b7fbac0a25457ffed43c2f3e366c14f6041e7418c75430f93026015f270c76ac439067b9172b83a8be37a2523373fcde47334e58a575a95530a672052 Key = 63da3bba88a85eef4d70033fdf79efac Out = 9146e34d280795a08a77bb9eba4637830543ec92ea21deeb2ae891f2cc79fd1d26da344747347fbb2bea3b2190075ee54a55fa4d4bfe3753535c61aa5e0bbf4a6d23ecf7b7ec345f0c84048106ece621a85862007c13e29725f22bccb00a295826b87dee1077bd87ed2fcbb7cd80d8e155816b3d4ba3a3ec50f5dcd3170ba894fa9ffb59109e40 Key = 63dc34d4260b7cb78ee6fa5a905970c5 Out = 7963578dbbf00723359a535e6bbbe1821b99940e388f1a4e37cbbd2b8a8f46b690de9cf8983ccbbe38c8b8d45e450a7756345f12693eb1c86dd446180613cf154c7e44c6e1a9c893a0e7a7b0dfe5cb478b182078ac913019e56a529d30d924db1dbac13639bd9468eb65dce9461c393ec1cb9e07ba95b0dc70452fbc1f7746d51fc24e5cfafed4 Key = 03bf6360606a59d72da6f939808323b6 Out = 89846cd880222474a17b8d37cf94b4c25dafa7dc2c86e470e1a5bb82e8eeae6973693a07fd58c9134b36e400c9f73979345b547fcf6ae990654903b139c86295783779c4ad399062bbdd9b86197dac9563507d6fe4365e3ec73025537af49e28f01643014ca574f9b396df2304aaa54a5370f9a8edda558873674c404246c8e403b71efd5892ab Key = 35d0778ed3521c5a83513af12182bd67 Out = 8e1bc23250b1eff58d8b9af008226533b30656329f799df1d0dfd170a16f170aa91197ce11711b8bb6c3aa68703ac889431c88df3c3865da7ab9fe07b928e0ffb68fb5e6ef901c5c2c05312a1e3d9744dbfc00582776d70acdc6182c215bb8e0ccb8f6dfb2372caffe2dce0f36f99692a30ef5f8ed5b41aee6cde5b4b19f9b85de355c1a404d49 Key = df979c72ed7521c494edb55249e9aaf8 Out = 1f6f2f5bcf1de8a552d404c2c1c308488060318aa74713b63d559ec7d459e66af4b765e99cc1f101e85963c77375bb37dedb42138cbb597ee7ef8ed0a6a298919b2a9d8ec4263ae75ca204ca89470744da42b219c4b5716a0e928aaefce734ec8803f98e1ba40e2221599a80467592769e1426a144191134eaf80def9e20957bf1ebc79d1fcdb5 Key = 43edfb5b8f26382eba01d9fa893c709a Out = e0df6374ae301a38b2375fe82cb0943fe0d804f055d35f36465cccc47d28f3fd39fe3f7f1875bd0c8279b8c053014254433aa487bb2fbc9538a838562b16b271fa45f46102df3ddf26e24ab1ef301a5903dd646192a060437e56f92bde50fc8d39b18b1165aba1a53248b338cf990e2f12177503a074ae7f1adb929731059efbe5433ebfffd228 Key = 117e400be459e8a3ad8dea08787a6ed8 Out = 1bc6a0615443bbfcdf94c0924cc3de74904b57ac53005c86ff95e4631b4e96f0c33f94702cd74776176241d0760934d55b5f1215756f8ea46a3ec5efcc5641bea3661af3f329f385be13f9797a6a60cef86a38e33da6c0337f054540b805ca573de4641b03453b1343ee8822b4ebdaaedaec89bee25371469e2027d00d83970ec26ec89d1e4bd38f Key = d988b2c54a2b2590b4c8fe3a5c2045b5 Out = 0ce8062f248c13b25473b59424ab87ff2346bc5c9da084e6122e5086fcf65855d90e6b1c67555c2810029eca45ec443bbca912a3002fe9a02b77042d5beac7863b90e4205f4e9ebb328d9a2bf88fd71a18e6e639e76534ae9b49ae3eabcf20ac1dc277395a2ff6a794f2bb398496b60aeb88163dee219371ad603a5e61f2d704ace1f653a98cffd9 Key = c7397340dcb02b06fa43ee8b470eb9e3 Out = 9718f1361178719edee51043c8c25a759d6332e1ea4cf2058eef225fb6f552fa3ab1fb52a1447fd5b5682b16adca948d98fd7c9b174c197e83bac4c93d7185d7cb589ffe2b49bb9879c8c25b88e936febc0540be8dafdb67ee9ce9d087c553b4f38251b22263c6ce1bf7899244c27f0e746ddb8c46e157f8c35bff0475558ad3bc5befbe523700e3 Key = 79ae98ee9cb0877a29b6b66c17e28b21 Out = da4d1c377cabf0e348e8407055d1b734ab842c2fba1ced7bfee9da12266fcf550400891cdc2e6088503696b84ebe6be2307e7166ad9c9307dae97681718a3fdd4735fcf09b9772199ab8c500991df8884b820f2c63b0535fabdd0e88d7553a1b82add27acdeee377c59d2db27aa58583dbc221b570faa7932f27b3102eaac0800898abec3cc066a1 Key = 4543c9e6f06151e865d6b5ae75bff060 Out = aa653c86a214d56ff993fab200d453556eff2e531cb351031208c1cb8b9a594612c66e06284cf5008a5a45371ecbf92e10ff1706af7886bcac8eddf5042ae6f28827866716a5b1913a508efbc80f5e273c7c17cc17f1e02c5a356b1889600702d587f3dc945fdf0a6df43b4756532aca67e9da6fa745bcace55f2169d262334f39d27de7cdee4507 Key = b6be92ffeac8bde44da35dac3b4b5051 Out = e6cde5e95e4cc7784ce631189d0814c50045c00372d0b07c0541c7b2010e8db2756e0ccff9b3f10bfe312d4360af39de434c2e4797e39b0ff9ab30a38faaac791e6ca7bbf58ba9ed0a401df73172434c9d47065f314303f82df9b30d6828cd5ca7ad9cb4b4bb2e01f66dddc0f65465ebbdf598bae38f643d232038492873171bf08cd948be2d1abb Key = dc49a889193e0116eaa195622cab490f Out = 86918a0e22d4defa3b0d79e2f7bb1cb126cff482cc89592497278497fb2f10e2b857fa602dde5d184cec3ad7d2ef28ff7106ae48f2d2d00e51c7176fe325110949ba12c05faccb31e24bd701403189a21af0d22d57aaf2625383b984df96ab6152626c3e53f536cb3cfd6dc3df33ff2b8844101a38872ef2132e9fb54e2e8bc67ef1a43466aba377 Key = c17ac143add1aa0248b909e1f31ee855 Out = 9b2d10c078d01d291c7e4b931df8f0ea21a22879bdbb871dcc823455d43f508b6c94840e4fbd0f261054e19f08ccdc60f7ec62b6b0fa1e5023be1d096434795644ed660d60e638ba110758709a5dfd8673efb8b5812dfbd0d4d3f1f79ae4fe2568af9ea23909c045f247e0653e9f03caabe8e2bfdc9bab7f1842e9a2f0c83f3b2bc03e5e577477bc Key = e03e900650a291c12453310530eb764d Out = dfdde877faf81002c0c4b1517b6201882aeeec7428529a1acda175ccb90ba34e4f200d61db41b455f152ab5a3fe5da4d950c5fe7228bd486abb1da756abd96988723b611ddbba6b00a47eabbfbd7d270f6fffc09600a6ffc72abe80441dfb93839dc679412351edc584072bc25c2f54a39c4deeb1edc8768f7a8597a941d8dbab5d0c7e9a0c569c7 Key = 47e6d70c01520668769d62d3ef3d9e0a Out = 30fd44c645ae813c877da92633e692efc24d01be938a839b52fc62e2905b6c5f510ebecad428d62025a1686e64f87d3c9bc00e1ec89947f76c04abbcce77cde07b590e03f023445b94530a97ad157b7eea40af6f61a5e390946483ec972281e98797073ab345dddfbee8feb633028fee2c3a86612058974246fcce650f4c2c496d0db43a15bcc30a59 Key = 4bff8e8f6c673636d936c2e60e0b235c Out = 7e0ccdcb0b2768509e16f8228748de52cac312089068ca8f8ba47d4ddf73f077000b7a7763880b3efb1af5b16c743a7406157bf7400e43a11b4cfcb3b3a094561fe6fc25e1c6423803f532c700e63a31683909a6eaaae18bbf47f3a2023011e68bc42ca70197595dd50501c1d4393055ac46fbcbf53f1bb20beb1e4c08546b58d38dca2876ed16a9a0 Key = f97cd1a658a0e3388d82f8092abf4843 Out = 872eb59d9d70b83f5d39e7de815b3bce0179b04048e6de9664344d3c64693e6b028f639ad8cc7247fc80abad96091967087f2e9c70dd202717de8e6bd8bd9f17a93928c5c172b98270e9ab41224d8577e60db4978846e54496ca2bad6fb54ae35553f69ccd9c82a7478b82796ca8e4577838d5939a2159380c906b5058a99a7db4a0cfc1f47e370fda Key = 9fc3be491d72741ffcfd9f799b5344db Out = f9c53cfb3165759acedbdcb7388d7e63144d65f0c7eae56ec29cbea8e1deb5fb9c70f1d2796c900fe822195ef5ebdb92a65e4f312b588b4cf8b28073a891efc34c9c81c3fc647ba90e598e3f8151a15471bd716b029c8661b39c3b1b123934f491fa7527734522c6e6ba1065f47b80e1c6f7f65f51fe8adb7f05b92f2e70d3cbdebc6ed50d9c444e84 Key = 0226e31d4aa59d8c6d2f6d1718898f5d Out = 4ad124d90504a8e0c4d3c28db36e6d51bbc842eb0da64b4d13d89319649a00d6c44999fcab35dd3d1b661616b4a925bfe81b9392ed8eec1f0017b81d9425877eed43f0753e42e7a15a9c33eb4b96b217d9c9006c26df12d3ec4fc11d5c569eae6b640b56df0a1bfeacb74623b1dfadf922ae0b987e6a110094fad040cfe685ef638300d3b334e87e58 Key = b82c63b9b7e940269eeb55d51157081b Out = 7b9d06b952e929ebb1751f58adc0ea1863fd3eee907953cb2a6b47791a33f5b5231552e4b5cb38da4423668f3b9b042f903c9871bc6b2a5a6c10ad38efb7b23e59e3f443042662f47e1239cd2c44905f21ddd07505935cf2a016a15407457ec0a706befed5cd2ed5463d41ac11b6c69594f1c19a1178fffb3a30d1f0822d3b207d57d4e51516ea0cf0 Key = 4127250fd2738463c4147d299b4ecd7c Out = f99c7f56657824a577d0e341425a95d9c35793075a359433064ca004ed078d4d363f0d50c5047ad9a7579d5a9e469c8eb200fcf1ddb7690e87d11ed4e5383c334590921c11206f157a618bbde8037622f13aceed9b281b2bd7265c782b811cfb7e73ac177f6c90c5dea78e98335a047d2fc2e04cc7f6603a347036db34d205b25f1fd16cdfcbe24cb3 Key = 87a65a7b0e5d863d3acbafae5a4cc9c7 Out = b25eab758604a7c4e1f3d3a435277d12a8a86b61573a2375fb90f2acbb80b84006d8a24acb734cd868f5d04a9e537522c492587276cdc1d574283eae58dd51bbf4636ea328311264e3404488e9aba5c860eae958f80a665f46a9a3b06be57a9737e70ca103badf718ff390c2eb082ce70a723249d0fd9c1efabc6f27f38826c84ac1270e4736c0940d Key = f2457c380ce6087cc27c5e7626a13a3d Out = ad37d7b12741105b2d783d20e29a2fc620aa4f5d39198360a9606842404d82a690f1934ffdc63efa17e57816e0412b93b6ca2a127f0110a37b79255d70d9b6559d655582d11bfd82939dfdeea95c557134b8a93e87af91ce0b4119190f31c6f43ae3dbf1ca2abe8e6f3aa8f61fb508fc7126a3dadbf49306d7dbc8789018723810a00e6d61b0e363fb Key = 3c4b7eb4d5969aa664f884f3a117de00 Out = 7075aaaafb02f5af3591b1da41b41437b64a49a00bea28270c4d8e620c458a765deeea46f318fa3551979239c1413b47daff72537789fc533b95d272c16f8e8580e44b0dd978ae7438cb6878f0a1235f418d07214e5c8c9b2051d30e42c554edf11c253a643b33d4a83184690255bec41c93d6c133d7f0a1369d379fe076664de833781f8a6009d5eee1 Key = f83d0c37a194599ec17436ce1ce69bb1 Out = 2cf7d0ba7857c31f8caf57b27fcb25ff1c2b9cd230e79187ed0c714c769aecd8dc190bc18df91d5a94621ed17dbd4b2846eb1169697b1d251ca27ef07c07d62ad7a97bb4ee86a0cbf0f4b895d97a8a45138e711feb612ef066c8887bea16314c2298e15a0dae54aee0578b6c9629965816d85b2f2deedbe16f0d573751f0bb004490598e30c99f8f2a27 Key = d95867886776f082fd694055756c35be Out = fc229e14f3ca6162113f4e2a6ea9a2af9f7126acc32d798a966da33dc4f6fa231b6cb338076028dd2a1d4cfc9845c9d8d0891dbeca5be6143eaa08ad85c3afe33fe4a0f9ea522eccf6d29b407d8f1fa989d1724329e8051cf151009a93eb42dfa5af32c065a864a395b4629d2c38fd885b2e5dec0994731efc5c807039753e506728b6bfc5edeb787a78 Key = ea8122bf586c0761c478323686b051c1 Out = d662b85df275e45e42eb7c33015e4d1b30299e798cef08d5ee7d9de3e9e82e702d01f33fb3d7430f99b99fe36970307dd85d42abf025cffa7a70dbf3a0344791d7b1cb452f1a978d08455eb61114203e2b8d2d5d6ae1ef8df9caab3c677219dd93b1f2974d4533c1c9dbaa1396113be3435c3d0a7120e65d56eb9a91b8e0602fa10e2e1833b1adde6b52 Key = 40a00772bbef188010b4b9096bfe0fb2 Out = e355665cc5d35bd12523cb97cee7718b1c7ca4e9e4c764022b23f1b39fce986a5394a05cd05bcfef0b82b850de612e8268a2fd3dc186cb6d29cd0810af1cbb5617d8822903d42f4995b3579a11dd890a14384085ccad0c34c7dbeb4bd4aca90d7f48933df3c873726bf9534b8ecf357729f41f583dbddb29de13e7db0862ca692f45546ea5185abc2f4d Key = 8e0b06f2020559773b451af0e25de692 Out = 43e46d8bc4afc51c50a096da3614f7aa0d1a3b6f3ff3d1da9efdfe8076d3db5c06b156e31e4d9cdf5c6cff8b74549af48232c128fdfd645c06a648555c2b094610a06efc24275531b0893d7bb17734a70c12414345227a7b4c47b28f06e5dc4ef4f8cd2cb5f614d1fa09c342265fae7e433aa1af31391951feb6bc9a77abc2555ad33fc88c8edd835665 Key = 2c4647ca622566738f60b1e194a330cd Out = a9f641d7e5e4d0bf8891b7469cd51d7bc1133057c0a114906cee5ea0ac77a7155c53e486d6ec54113abc4f33b12c64aedd79928107ab30f2e46e83c18f651d51e2f6a0efac7e88f5a7d15b2d09091669253ff23777b08910ae4de11b7eb84087edfba079bca6ce1e738d1dd2dc985b60751528ddeb853d911c5f45ede04c002ba5a88184d1733b1be512 Key = 8af542a4d3b765385a97a614264f6273 Out = c145081d5d14b30a37e8275730c32febffbd23bae390a339908d8099bba5412d8c0bad0a579c79de2b44d6dbbeff22f42338a16c2e1251e5f9a0f5bba18320632ad9c02f35812237a7525e0c55ae9f74da353d28dba015b665e6728db7730264ae5b7dc34d0eca9b9c80db05e4288a3371b8d4bf3ba5fdfc06343bc1d65d13f991bb1f08743300d7b632 Key = aefd329afa04993117493268a638cca6 Out = dae4efd55b15b0525afba52fe0c6a1ad1a8ad163bad7df596f74a55d525ce3fbbd643a87feaee45fb436cf3bb7378c9f07bcb660b50a54bfd3f9c03272bc2193df3ce166e64e16213a034c6812f3ae15b4bcc8013deae67a46e90b204200e3bcba92e992a51d109e237d9eab845d387f130b8bc56f7c4e4b9730e6a580d63452777851ce1d046aa27675 Key = f62de39e0c57636428f5ecdeb59e4bf9 Out = cf85fab95071106c6416b0fc20ed36e6d0f19ce619134c011083c274fadfa3ea7d394717fbe61a633eb521447b2dfe7b30643c7622e3bf538673d713109e108242df57e89af7bb873138fe71f608593642ac86ff54d4095b68b1767c99f0022ca251dd62ab9619fa36bf21fd8d88063035bcf50d14935dbd5bd29bed993f741d3ec018b135bb4c9f96f411 Key = fbcdb8c3679e4075b9b80530aabeaa5d Out = eac9439eacbbe385198c6639c524c6e90b09050ac1c8e608ed376cf0ac660894e4c24867a19b15c2575ee64ff85f112caa895a579a2030f1a6b052b9c648bd38a7650f690786b8858f0a388bcab6d2fc77ca8ebc06bb17d6ab5a4390c9466f32f308e7431d3e23dbb7f54101ddc2b21c0f00514119aa06043082392aabca8e14919bc923ab13289b9728c4 Key = 516a274984dee209aa7a263b5fb98be0 Out = b916db19c31e52d2a639b84676b23bb1b570f786c305382fbfeb78915f1baa8b7190dee198810ac0a5856ed800eb1e5acdeda8e0c5b8c5c965f23558fd6d5c6851fc37a75f08c10d5ba603fcee29a21385d6323182016c8a5e6380cb6e587081707abfc9ae66158131dc0d150253d9c610d4ab4abc01274e9003e484887899fade1a1b8aa0819b05b494a0 Key = a0b24a038665422b20a499276a504270 Out = 9f56cab65ffe5283ab19d8dc47b7e66ce267dbdd775f166d7b27878aabba4f92b14ed234788b8811394dc7048ef6e4eff461c596fccc2c72be0fc8ad863c9630cd79ccf53616b7b62e15a55454e54616606f8c53ffff9c4d147e70a6fac500cb987fcab7f968ffa02684197c2d889cd470fb873e1f2b909b9ccff676e8539cd56665d4523c97a2856981b7 Key = 35b09ab700bb7766618a6e99c3b34a3d Out = 420d9d05a91160186b48802c99e62623eca07e3c153db735ca2e0ebde9c1b97cd0b3b43df95bdc5e5490450926f736c494015e74fd8ecc879b80a3292ada05ebb2a332567140004d00dc585cdf186b42dd34b1a11b7ee5905a1797ff3a92e86693342cdfa8f0bc9d0d821ecff8660cf25e1fdcf0d29308a4cf01fc1375b157c12d69d96f9649bc200077bb Key = d0a2cd13dce21f318bf8b428c33e523b Out = 9f8782cda197a20515a206354215fb5ce3d310307848e6c472ffab1a2663cccaf4ac540874f513f22384d9c821671915eb3a510c1b857db3cd490d0e7f356d9fb973dee568b416402074060c86151a5612c2ca9fc759e1828c68a08838c92730f89996039257702113719050f691d4e663ffb1c20fcf0fb89dac9a9943decd6db226347828ad0aecf22a49 Key = e7b5aade78b9b5b8419b98b49bdf169c Out = f237bc9d1531e56be09dd569fe24dbcb0425d319d01c0a3a8d68887281a948faa25f7e775c434add746e1fd9c2cca746e49fce81dc72ab1a7c8b6ace23dba3f28f3e7f09185e784057dc5be3d9fe09a5defcf7f90af2b0dc09c0256e291b6d4fc3fd340c60e8fd1ab3eaa9766201bef2b2d4ab717786953cb8dbdd5c256ce8bdc40921da3d99bb0a82f3bf Key = f2259981b060c3af5cf57d581fb56474 Out = 015e1a273921d13aa14a0fdf44300b3c7053a913f1c01893c690f94e9655ae9bf98f08299ca8f3ca8fc2c7a5338edc166c1c414ecc03452337b35709837e53baf05916d13d816fe0ed024e150925451d7e22797f4f7563cdc176f72122a76e406da3969eacf9be5b2208dafd16584722030b8a9431cb0843cf8aefe7dc649d37ae0e68e9db715070926cdd Key = 6832b7adaac918587c17258d0c20228f Out = 8b6c5e626316100d9bd091a23447bd4fea16e695f88c96ee8aabe1f26d037eb344601bc228927febb990ba2d7ece2311ec40fee70907187d872e34d7b20e77bce771f8ffbb809034c8a6ca0e77ce1ec489b469cef85e516cccb3e6bfa770118cc0cb7d5f102e02ac685578bf8076264d5a262124dc864d83965886e54c2c52a60a0ffe92dd295244ca0776 Key = a8ded9816defca8327c194a48a88ae4e Out = ed7397b2215c6c412bf444b1b96fc55c531aef025c6dd13fb4ab53fcc20c91917d82c8d6710a8d7b4c24d18b54150490e98ee01b4a4b9790d1878810a8392d3fa203b066327c0c67cace3a08c57d0d30b62ba43121d8d715637884f055c55ad6689692249885dce01c96979f1a2b309943e14abb0ba8e227bceb381667579e10694bd442b99064aa88501431 Key = 7d3084706027fd271b9cf09c10f5788d Out = 3814484d1316a06f6ad466f9ca74dafe04cdf7ddb39931f9a20aa036c101f2ea9f8c1dd447ba3eba4d23e5f9f27cc2bfb38e3d123b73d7b8c2f495214ffbab5419e33ff3ac5e6cdc98a6b33cf87afe238dbbc30f08d99246c5a7196afff9848936a9152ea67c1fbde6177a2e9177291adce2f695a52baaf33e56e7b1390a5c92a58df0b062256212b4735f1a Key = e90885359d2d90e26a87873125a19431 Out = 5c56b158ae664a4c91e3dac83a9133f79c526cc9f4d18effffed446d459990eb05057aecdbab0d73e06576de6ce4cd7414449538cb5308f44b32824efe8039580b3b7b7b6ac32b148b502989cc214401b98cc6454552afaea10f3b9d93a248e782e711e94bca1fb4721d2ed5cc75f3d9d4e598dc43eeefa4a995a81d6334edfc31869a0a1aee45d4369cecd1 Key = b46abe8e27f1c3f2e443781300a951a4 Out = e821b757a34f90be1e210b4e0ad60a3585018216d54872e614e7f8647102d4e50968749d109caaea13dd5d5486fcaa6b1953c71ad6492446d38cacac908f8f67420d6aa27cb191a9e2ea7a62c59b5aa359cf7d61e550d31876910d87f07a1707ca0f3a8ecb0a431cf8966846ab9404d7cf37ae90f69d524565c5733e2875a960ab07d08eafbecdb7e468204c Key = d8ed3f491ff1eb57f89b90c2eb6395e2 Out = 521122e9c54a691ff0b1d0821ab8bb4c7c24cf0ea3dba6cddd36654198fa32c7294bf00a17e8cb6c1c747a720aff2460fca9a6d5899a298f184082ce43ec727ff7044c64dbd9a7d20e36652424b3e8f806e818c4da8181d6b35e6de5c5e287291d96a4b10386216816a3586cc788f6151906599ed22fee74ac853736c54c3f461549525b179f92c72892c374 Key = 594970465717ec638b1b4662a3d64af3 Out = 4fdef9fd37b160be0dac8c801c34bf91977acf7ecfc12c3a3899599b480802bc2fb9cf69acd86271541b95716600bce499d5ac64bb557772fdda3b0a093571cc77ba9fd4796b3831fc86e385c2a6c126c084af60a2fdf5194f2dc08e0e522b7fdf852b994d0614296a5f40b318dd35e55dc6c3627e186d0edbe2bb50cf83d345e3f82b802ee4d607c89a713d Key = 2ab3a70f3b01836d8efceb67490c3c38 Out = ca7ca55bf123aba45287268c4050ab030b1415f4497d5fe8dbc5386ae37d24384a2fd6a715fcad48ff9e810c1d378fa70f1503767e9e338e33697206f863dc8015b4d1e9b8f81ddee22aac59d52055a1b0784a364369cc50f403045a1bdb25b639cb864f960281b26160ec89e8ec6403e054c29b4adc3b1ae9ef69498f24e0e3ac328e2f89c71348c9dfb8f1 Key = 095a4c37e386db92fa0a2e396103ffd0 Out = a972c62ff5b162006c11504dc86390bebdcc7390a36fd48303472ec827e1391ebf7ac988fd222907d6e8363f7a1e9a8c3a07a4b88d8c688793c7211a0e2d84739c8a0ed10744a06af282f160efc57c94cc48703262f6c021bf7c7ca717107cce05bdac3c4d3ea0e930ce741647b731ed5a6b90150b942a9d8f68e5ec9cbfb1dd37c1937a56f4f052fdd99351 Key = c60a221c975e14bf835827c1103a2906 Out = 0db7f7196eee8dd6994a16ded19cb09f05f89ccd2464333df2c017c6ca041fa0d54a4832a74ce86ce9b41d8e523e66ce6ef9df7c20aa70e0ac00f54eb072a472ef46cf2a933df0d5f9fafab6388a206f6bd1df50b0836500c758c557c8ac965733fdaaa59f5ed661a1bda61e2952886a60f9568157e3d72e49b6e061fc08f3f1caf159e8eff77ea5221565d2 Key = 0a13ad2c7a239b4ba73ea6592ae84ea9 Out = 5feaf99c15f48851943ff9baa6e5055d8377f0dd347aa4dbece51ad3a6d9ce0c01aee9fe2260b80a4673a909b532adcdd1e421c32d6460535b5fe392a58d2634979a5a104d6c470aa3306c400b061db91c463b2848297bca2bc26d1864ba49d7ff949ebca50fbf79a5e63716dc82b600bd52ca7437ed774d169f6bf02e46487956fba2230f34cd2a0485484d botan-2.4.0/src/tests/data/timing/000077500000000000000000000000001322470703100167505ustar00rootroot00000000000000botan-2.4.0/src/tests/data/timing/bleichenbacher.vec000066400000000000000000000041001322470703100223600ustar00rootroot00000000000000# valid padding 00021F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F00F1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1 # invalid padding 00031F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F00F1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1 # no zero 00021F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1 # invalid length 00021F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F001F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1botan-2.4.0/src/tests/data/timing/ecdsa.vec000066400000000000000000000002051322470703100205230ustar00rootroot00000000000000# leading zeros 01 # no leading zeros FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF botan-2.4.0/src/tests/data/timing/lucky13sec3.vec000066400000000000000000000025611322470703100215240ustar00rootroot00000000000000# Lucky 13 Section 3 - Distinguishing attack: 32 bytes of data followed by maximum padding 0xFF, 18 plaintext blocks 00000000000000000000000000000000 00000000000000000000000000000000 ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffff # Lucky 13 Section 3 - Distinguishing attack: minimum padding 0x00, 18 plaintext blocks 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 botan-2.4.0/src/tests/data/timing/lucky13sec4sha1.vec000066400000000000000000000020321322470703100222730ustar00rootroot00000000000000# Lucky 13 Section 4.2: 4 plaintext blocks # Case 0: 0x00 padding byte 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 # Case 1: At least two valid padding bytes 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000101 # Case 2: Invalid padding 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000004030303 # Further cases (only for extended validations) #00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000020202 #00000000000000000000000000000000 00000000000000000000000000000000 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F 1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F #00000000000000000000000000000000 00000000000000000000000000000000 #00000000000000000000000000000000 00000000000000000000000000000101 #00000000000000000000000000000000 00000000000000000000000004030303botan-2.4.0/src/tests/data/timing/lucky13sec4sha256.vec000066400000000000000000000012611322470703100224520ustar00rootroot00000000000000# Lucky 13 Section 4.2: 5 plaintext blocks, now for sha256. 32 bytes of output # Case 0: 0x00 padding byte 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 # Case 1: At least six valid padding bytes: 80+13-32-7 = 56 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000006060606060606 # Case 2: Invalid padding 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000004030303 botan-2.4.0/src/tests/data/timing/lucky13sha384.vec000066400000000000000000000033101322470703100216720ustar00rootroot00000000000000# Lucky 13 test for SHA-384 (48 bytes output). SHA-384 uses 128 byte block length and 16 byte long encoding # <= 111 bytes: 1 compression # (111, 239] bytes: 2 compressions ... # Case 0: 160 bytes, 0x00 padding byte, results in (160-1-48+13)=124 MACed bytes 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 # Case 1: 160 bytes, 0x0D padding byte, results in (160-14-48+13)=111 MACed bytes 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D # Case 2: Further case with invalid padding 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000000000000000000000A # Case 3: Further case with 0x0C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0Cbotan-2.4.0/src/tests/data/timing/manger.vec000066400000000000000000000020711322470703100207200ustar00rootroot00000000000000# valid first padding byte 00021F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F00F1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1 # invalid first padding byte 01021F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F00F1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1F1FFF1F1F1F1F1F1F1F1botan-2.4.0/src/tests/data/tls-policy/000077500000000000000000000000001322470703100175605ustar00rootroot00000000000000botan-2.4.0/src/tests/data/tls-policy/bsi.txt000066400000000000000000000014401322470703100210750ustar00rootroot00000000000000allow_tls10=false allow_tls11=false allow_tls12=true allow_dtls10=false allow_dtls12=false ciphers=AES-256/GCM AES-128/GCM AES-256 AES-128 signature_hashes=SHA-384 SHA-256 macs=AEAD SHA-384 SHA-256 key_exchange_methods=ECDH DH PSK ECDHE_PSK DHE_PSK signature_methods=ECDSA RSA DSA ecc_curves=brainpool512r1 brainpool384r1 brainpool256r1 secp384r1 secp256r1 groups=brainpool512r1 brainpool384r1 brainpool256r1 secp384r1 secp256r1 ffdhe/ietf/8192 ffdhe/ietf/6144 ffdhe/ietf/4096 ffdhe/ietf/3072 ffdhe/ietf/2048 minimum_dh_group_size=2000 minimum_dsa_group_size=2000 minimum_ecdh_group_size=250 minimum_ecdsa_group_size=250 minimum_rsa_bits=2000 allow_insecure_renegotiation=false allow_server_initiated_renegotiation=true server_uses_own_ciphersuite_preferences=true negotiate_encrypt_then_mac=true botan-2.4.0/src/tests/data/tls-policy/compat.txt000066400000000000000000000021121322470703100216000ustar00rootroot00000000000000# There is no cooresponding type for this text policy but it is useful # for interop testing and fuzz testing # It is based on the default policy, but allows 3DES, SHA-1 signatures, # static RSA, and reduces the ephemeral key sizes allow_tls10 = true allow_tls11 = true allow_tls12 = true allow_dtls10 = false allow_dtls12 = false ciphers = ChaCha20Poly1305 AES-256/GCM AES-128/GCM AES-256 AES-128 3DES macs = AEAD SHA-256 SHA-384 SHA-1 signature_hashes = SHA-512 SHA-384 SHA-256 SHA-1 signature_methods = ECDSA RSA key_exchange_methods = CECPQ1 ECDH DH RSA ecc_curves = x25519 secp256r1 secp521r1 secp384r1 brainpool256r1 brainpool384r1 brainpool512r1 allow_insecure_renegotiation = false include_time_in_hello_random = true allow_client_initiated_renegotiation = true allow_server_initiated_renegotiation = false hide_unknown_users = false server_uses_own_ciphersuite_preferences = true negotiate_encrypt_then_mac = true session_ticket_lifetime = 86400 dh_group = modp/ietf/1024 minimum_dh_group_size = 1024 minimum_ecdh_group_size = 255 minimum_rsa_bits = 1024 minimum_signature_strength = 80 botan-2.4.0/src/tests/data/tls-policy/datagram.txt000066400000000000000000000014521322470703100221030ustar00rootroot00000000000000allow_tls10 = false allow_tls11 = false allow_tls12 = false allow_dtls10 = false allow_dtls12 = true ciphers = ChaCha20Poly1305 AES-256/GCM AES-128/GCM AES-256/CCM AES-128/CCM AES-256 AES-128 macs = AEAD signature_hashes = SHA-512 SHA-384 SHA-256 signature_methods = ECDSA RSA key_exchange_methods = CECPQ1 ECDH DH ecc_curves = x25519 secp256r1 secp521r1 secp384r1 brainpool256r1 brainpool384r1 brainpool512r1 allow_insecure_renegotiation = false include_time_in_hello_random = true allow_server_initiated_renegotiation = false hide_unknown_users = false server_uses_own_ciphersuite_preferences = true negotiate_encrypt_then_mac = true session_ticket_lifetime = 86400 dh_group = modp/ietf/2048 minimum_dh_group_size = 2048 minimum_ecdh_group_size = 255 minimum_rsa_bits = 2048 minimum_signature_strength = 110 botan-2.4.0/src/tests/data/tls-policy/default.txt000066400000000000000000000014751322470703100217540ustar00rootroot00000000000000allow_tls10 = true allow_tls11 = true allow_tls12 = true allow_dtls10 = false allow_dtls12 = true ciphers = ChaCha20Poly1305 AES-256/GCM AES-128/GCM AES-256/CCM AES-128/CCM AES-256 AES-128 macs = AEAD SHA-256 SHA-384 SHA-1 signature_hashes = SHA-512 SHA-384 SHA-256 signature_methods = ECDSA RSA key_exchange_methods = CECPQ1 ECDH DH ecc_curves = x25519 secp256r1 secp521r1 secp384r1 brainpool256r1 brainpool384r1 brainpool512r1 allow_insecure_renegotiation = false include_time_in_hello_random = true allow_server_initiated_renegotiation = false hide_unknown_users = false server_uses_own_ciphersuite_preferences = true negotiate_encrypt_then_mac = true session_ticket_lifetime = 86400 dh_group = modp/ietf/2048 minimum_dh_group_size = 2048 minimum_ecdh_group_size = 255 minimum_rsa_bits = 2048 minimum_signature_strength = 110 botan-2.4.0/src/tests/data/tls-policy/strict.txt000066400000000000000000000013661322470703100216370ustar00rootroot00000000000000allow_tls10 = false allow_tls11 = false allow_tls12 = true allow_dtls10 = false allow_dtls12 = true ciphers = ChaCha20Poly1305 AES-256/GCM AES-128/GCM macs = AEAD signature_hashes = SHA-512 SHA-384 signature_methods = ECDSA RSA key_exchange_methods = CECPQ1 ECDH ecc_curves = x25519 secp256r1 secp521r1 secp384r1 brainpool256r1 brainpool384r1 brainpool512r1 allow_insecure_renegotiation = false include_time_in_hello_random = true allow_server_initiated_renegotiation = false hide_unknown_users = false server_uses_own_ciphersuite_preferences = true negotiate_encrypt_then_mac = true session_ticket_lifetime = 86400 dh_group = modp/ietf/2048 minimum_dh_group_size = 2048 minimum_ecdh_group_size = 255 minimum_rsa_bits = 2048 minimum_signature_strength = 110 botan-2.4.0/src/tests/data/tls-policy/suiteb.txt000066400000000000000000000012221322470703100216110ustar00rootroot00000000000000allow_tls10 = false allow_tls11 = false allow_tls12 = true allow_dtls10 = false allow_dtls12 = false ciphers = AES-128/GCM macs = AEAD signature_hashes = SHA-256 signature_methods = ECDSA key_exchange_methods = ECDH ecc_curves = secp256r1 allow_insecure_renegotiation = false include_time_in_hello_random = true allow_server_initiated_renegotiation = false hide_unknown_users = false server_uses_own_ciphersuite_preferences = true negotiate_encrypt_then_mac = true session_ticket_lifetime = 86400 dh_group = modp/ietf/2048 groups = secp256r1 minimum_dh_group_size = 2048 minimum_ecdh_group_size = 255 minimum_rsa_bits = 2048 minimum_signature_strength = 128 botan-2.4.0/src/tests/data/tls/000077500000000000000000000000001322470703100162635ustar00rootroot00000000000000botan-2.4.0/src/tests/data/tls/alert.vec000066400000000000000000000007561322470703100201010ustar00rootroot00000000000000# Alert message contains the following fields: # - Fatal (1 byte): 1=false, 2=true # - Type (1 byte) [alert] Buffer = 0130 Exception = Buffer = 0230 Exception = Buffer = 0231 Exception = Buffer = 0030 Protocol = 0303 Exception = Invalid argument Decoding error: Alert: Bad code for alert level Buffer = 02 Exception = Invalid argument Decoding error: Alert: Bad size 1 for alert message Buffer = 020101 Exception = Invalid argument Decoding error: Alert: Bad size 3 for alert message botan-2.4.0/src/tests/data/tls/cert_status.vec000066400000000000000000000030361322470703100213240ustar00rootroot00000000000000 [cert_status] Buffer = 00 Exception = Invalid argument Decoding error: Invalid Certificate_Status message: too small Buffer = 01 Exception = Invalid argument Decoding error: Invalid Certificate_Status message: too small Buffer = 01000000 Exception = Invalid argument Decoding error: Invalid Certificate_Status message: too small Buffer = 010FFFF000 Exception = Invalid argument Decoding error: Invalid Certificate_Status: invalid length field Buffer = 0100020F3082020B0A0100A08202043082020006092B0601050507300101048201F1308201ED3081D6A14C304A310B300906035504061302555331163014060355040A130D4C6574277320456E6372797074312330210603550403131A4C6574277320456E637279707420417574686F72697479205833180F32303136313131383132313630305A30753073304B300906052B0E03021A050004147EE66AE7729AB3FCF8A220646C16A12D6071085D0414A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1021203E89ED07A424B72A35FAD167F48A4F25AD28000180F32303136313131383132303030305AA011180F32303136313132353132303030305A300D06092A864886F70D01010B050003820101007CB8774D813E6E0FBFA816BE53F5F3131EF9DED7B0928BBE50AC628C90C811DBBFE0E43A98BF3FB608CC230EFE31FE98BE99016D98DE73028F6C1AE8C34B0F20DD7E688604322538E721EF9D0D353EADE8818BFB63DA8078A7E2BF9E637282DE6C79B2289F0C13807A9D3B7532970FF0AA77CE06A06299B02274ED6C62DFC672485405C1859FEBDFC3B5B2D81A0A45382FFABBF75D6EAC1AD1AF12701DCDF87F0EFEB41933AED08EF78B35F48362A792E55027F00B3EE4571F30212A3EB7BE4B934F67685A4AF2BBF428280BC20D1A42E75DBE42C459541B4E1EE5BB99E0CCA166C2E9C2E6054F147F2FDF33F104E9076061640EDDB12B62BEAA82E0D60ED128 Name = Let's Encrypt Authority X3 Exception = botan-2.4.0/src/tests/data/tls/cert_verify.vec000066400000000000000000000034211322470703100213030ustar00rootroot00000000000000# Tests generated partially with openssl 1.0.2g # CertificateVerify message contains the following fields: # - SignatureAndHash Algorithm (2 bytes) [only in TLS 1.2] # - Certificate length (2 bytes) # - Certificate [cert_verify] Buffer = 06010080266481066a8431582157a9a591150d418b63d46154c4cd85bffcfdba8c7f6396f0ceb0402c2142c526a19659d58cd4111bf45f57a56e97d16eeecd350f6e9dc93662e4361053666e5a53c74fe11bd6cf86a9cf7a2488704c5121915820973280ed6afa3e8b79dfb799bddffb52caa2d1a0a895a0e7505d841a882bdd92ec9141 Protocol = 0303 Exception = Buffer = 008080c920a228dc3f32927fd8026a97fb8474603191a89c49aeeddd1b1caf7f28d6af7b9b7c0bc6b954e909f3d054eb3964d626402b7c932c019111bc854007c90c134d6adce505e5cd60292331f7645fba909017565fc60ee76a5eb6b6a89ab2a3d69be6c0e283ae5a84b1fc367c1a865c35dd8a1c93ac3d538d91a2d5128d8d52 Protocol = 0302 Exception = Buffer = 0080bb6b1df8c744f961ee3f5334448fac4af0f372763149972b88bec525a3196f87cf0204a50fd516b6808530252d1c6b79414b8b9194b3c5e2958adab5524bc124e16d9f3b05f5bf63c0b184709ce6586a0a4b267280b47576893406c381a401b10bcc5f111b14cd8ce889b5d48fbe47f465cf70bf23b71109f81d4574bbf6f93f Protocol = 0301 Exception = Buffer = 0601000100 Protocol = 0303 Exception = #Incomplete algorithm Buffer = 06 Protocol = 0303 Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected 1 bytes remaining, only 0 left #Incomplete certificate Buffer = 0601000500 Protocol = 0303 Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected 5 bytes remaining, only 1 left Buffer = 000200 Protocol = 0302 Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected 2 bytes remaining, only 1 left Buffer = 000200 Protocol = 0301 Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected 2 bytes remaining, only 1 left botan-2.4.0/src/tests/data/tls/client_hello.vec000066400000000000000000000171311322470703100214260ustar00rootroot00000000000000# Tests generated partially with openssl 1.0.2g/1.1.0a and TLS-Attacker # ClientHello message contains many fields, the following fields are checked: # - Protocol Version # - Extensions [client_hello] # no extension (empty renegotiation generated) Buffer = 030320f3dc33f90be6509e6133a1819f2b80fe6ccc6268d9195ca4ead7504ffe7e2a0000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000000 Protocol = 0303 AdditionalData = FF01 Exception = # with extensions: point formats, ec curves, session ticket, signature algorithms, heartbeat (point formats and heartbeat not supported, empty renegotiation generated) Buffer = 0303871e18983024eaee1be8ae6607d5ecad941d33fd7fc1d8554a9e1fbfda8d30880000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000055000b000403000102000a001c001a00170019001c001b0018001a0016000e000d000b000c0009000a00230000000d0020001e060106020603050105020503040104020403030103020303020102020203000f000101 Protocol = 0303 AdditionalData = 000A000B000D0023FF01 Exception = # with extensions: point formats, ec curves, session ticket, signature algorithms, heartbeat, Encrypt-then-MAC, Extended Master Secret (point formats and heartbeat not supported, empty renegotiation generated) Buffer = 0303e00da23523058b5dc9c445d97b2bb6315b019e97838ac4f16c23b2cb031b6a490000e2c0afc0adc030c02cc028c024c014c00ac0a3c09f00a500a300a1009f006b006a006900680039003800370036cca9cca8c077c073ccaa00c400c300c200c10088008700860085c032c02ec02ac026c00fc005c079c075c0a1c09d009d003d003500c00084c0aec0acc02fc02bc027c023c013c009c0a2c09e00a400a200a0009e00670040003f003e0033003200310030c076c07200be00bd00bc00bb009a0099009800970045004400430042c031c02dc029c025c00ec004c078c074c0a0c09c009c003c002f00ba009600410007c012c008001600130010000dc00dc003000a00ff0100005f000b000403000102000a001c001a00170019001c001b0018001a0016000e000d000b000c0009000a00230000000d00220020060106020603050105020503040104020403030103020303020102020203eded000f0001010016000000170000 Protocol = 0303 AdditionalData = 000A000B000D001600170023FF01 Exception = # empty Buffer = Protocol = 0303 Exception = Invalid argument Decoding error: Client_Hello: Packet corrupted Buffer = 00 Protocol = 0303 Exception = Invalid argument Decoding error: Client_Hello: Packet corrupted # Invalid cipher suite length (0xf0e2 instead of 0x00e2) Buffer = 0303e00da23523058b5dc9c445d97b2bb6315b019e97838ac4f16c23b2cb031b6a4900f0e2c0afc0adc030c02cc028c024c014c00ac0a3c09f00a500a300a1009f006b006a006900680039003800370036cca9cca8c077c073ccaa00c400c300c200c10088008700860085c032c02ec02ac026c00fc005c079c075c0a1c09d009d003d003500c00084c0aec0acc02fc02bc027c023c013c009c0a2c09e00a400a200a0009e00670040003f003e0033003200310030c076c07200be00bd00bc00bb009a0099009800970045004400430042c031c02dc029c025c00ec004c078c074c0a0c09c009c003c002f00ba009600410007c012c008001600130010000dc00dc003000a00ff01000000 Protocol = 0303 AdditionalData = Exception = Invalid argument Decoding error: Invalid ClientHello: Expected 61666 bytes remaining, only 230 left #invalid extensions length Buffer = 030320f3dc33f90be6509e6133a1819f2b80fe6ccc6268d9195ca4ead7504ffe7e2a0000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000001 Protocol = 0303 Exception = Invalid argument Decoding error: Bad extension size #invalid extensions length 2 Buffer = 030320f3dc33f90be6509e6133a1819f2b80fe6ccc6268d9195ca4ead7504ffe7e2a0000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff010000010000 Protocol = 0303 Exception = Invalid argument Decoding error: Bad extension size #invalid length of the supported groups extension (0xf01c instead of 0x001c) Buffer = 0303871e18983024eaee1be8ae6607d5ecad941d33fd7fc1d8554a9e1fbfda8d30880000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000055000b000403000102000af01c001a00170019001c001b0018001a0016000e000d000b000c0009000a00230000000d0020001e060106020603050105020503040104020403030103020303020102020203000f000101 Protocol = 0303 Exception = Invalid argument Decoding error: Inconsistent length field in supported groups list #invalid length of the supported groups extension (0xf01a instead of 0x001a) Buffer = 0303871e18983024eaee1be8ae6607d5ecad941d33fd7fc1d8554a9e1fbfda8d30880000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000055000b000403000102000a001cf01a00170019001c001b0018001a0016000e000d000b000c0009000a00230000000d0020001e060106020603050105020503040104020403030103020303020102020203000f000101 Protocol = 0303 Exception = Invalid argument Decoding error: Inconsistent length field in supported groups list #invalid length of the session ticket extension Buffer = 0303871e18983024eaee1be8ae6607d5ecad941d33fd7fc1d8554a9e1fbfda8d30880000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000055000b000403000102000a001c001a00170019001c001b0018001a0016000e000d000b000c0009000a002300ff000d0020001e060106020603050105020503040104020403030103020303020102020203000f000101 Protocol = 0303 Exception = Invalid argument Decoding error: Invalid ClientHello: Expected 255 bytes remaining, only 41 left #invalid length of the heartbeat extension Buffer = 0303871e18983024eaee1be8ae6607d5ecad941d33fd7fc1d8554a9e1fbfda8d30880000aac030c02cc028c024c014c00a00a500a300a1009f006b006a0069006800390038003700360088008700860085c032c02ec02ac026c00fc005009d003d00350084c02fc02bc027c023c013c00900a400a200a0009e00670040003f003e0033003200310030009a0099009800970045004400430042c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc00200050004c012c008001600130010000dc00dc003000a00ff01000055000b000403000102000a001c001a00170019001c001b0018001a0016000e000d000b000c0009000a00230000000d0020001e060106020603050105020503040104020403030103020303020102020203000f000201 Protocol = 0303 Exception = Invalid argument Decoding error: Invalid ClientHello: Expected 2 bytes remaining, only 1 leftbotan-2.4.0/src/tests/data/tls/hello_request.vec000066400000000000000000000002711322470703100216350ustar00rootroot00000000000000# HelloRequest message does not contain any bytes [hello_request] Buffer = Exception = Buffer = 01 Exception = Invalid argument Decoding error: Bad Hello_Request, has non-zero size botan-2.4.0/src/tests/data/tls/hello_verify.vec000066400000000000000000000015451322470703100214560ustar00rootroot00000000000000# Tests generated partially with openssl 1.0.2g # HelloVerify message contains the following fields: # - Protocol version (2 bytes) # - Cookie length (1 byte) # - Cookie [hello_verify] Buffer = feff14925523e7539a13d9782af6d771b97d0032c61800 Exception = # HelloVerify request has to contain at least 3 bytes Buffer = 0101 Exception = Invalid argument Decoding error: Hello verify request too small # HelloVerify has to contain valid protocol version Buffer = 010100 Exception = Invalid argument Decoding error: Unknown version from server in hello verify request # HelloVerify has to contain valid number of bytes Buffer = FEFD0000 Exception = Invalid argument Decoding error: Bad length in hello verify request # HelloVerify has to contain valid number of bytes Buffer = FEFD0500 Exception = Invalid argument Decoding error: Bad length in hello verify request botan-2.4.0/src/tests/data/tls/new_session_ticket.vec000066400000000000000000000007631322470703100226670ustar00rootroot00000000000000# NewSessionTicket message contains the following fields: # - lifetime (4 bytes) # - length (2 bytes) # - session ticket [new_session_ticket] Buffer = 000000000000 Exception = Buffer = 00000000000100 Exception = Buffer = 0000000000051122334455 Exception = Buffer = 0001 Exception = Invalid argument Decoding error: Session ticket message too short to be valid Buffer = 00010203000500 Exception = Invalid argument Decoding error: Invalid SessionTicket: Expected 5 bytes remaining, only 1 leftbotan-2.4.0/src/tests/data/tls/server_hello.vec000066400000000000000000000033071322470703100214560ustar00rootroot00000000000000# Tests generated partially with openssl 1.0.2g # ServerHello message contains many fields, the following fields are checked: # - Protocol Version # - Cipher suite # - Extensions [server_hello] # correct, with session ticket and renegotiation info Buffer = 0303ffea0bcfba564a4ce177c6a444b0ebdff5629b277293c618c1125f231e8628dd00c030000016ff01000100000b00040300010200230000000f000101 Protocol = 0303 Ciphersuite = C030 AdditionalData = 000B0023FF01 Exception = # correct, with session ticket, extended master secret, and renegotiation info Buffer = 03019f9cafa88664d9095f85dd64a39e5dd5c09f5a4a5362938af3718ee4e818af6a00c03000001aff01000100000b00040300010200230000000f00010100170000 Protocol = 0301 Ciphersuite = C030 AdditionalData = 000B00170023FF01 Exception = # incorrect, corrupted Buffer = Protocol = 0303 Ciphersuite = C030 AdditionalData = Exception = Invalid argument Decoding error: Server_Hello: Packet corrupted # incorrect, corrupted Buffer = 00 Protocol = 0303 Ciphersuite = C030 AdditionalData = Exception = Invalid argument Decoding error: Server_Hello: Packet corrupted # invalid extensions length Buffer = 03039f9cafa88664d9095f85dd64a39e5dd5c09f5a4a5362938af3718ee4e818af6a00c03000001cff01000100000b00040300010200230000000f00010100170000 Protocol = 0303 Ciphersuite = C030 AdditionalData = 00170023FF01 Exception = Invalid argument Decoding error: Bad extension size # invalid extension length Buffer = 03039f9cafa88664d9095f85dd64a39e5dd5c09f5a4a5362938af3718ee4e818af6a00c03000001aff01000100000b00040300010200230100000f00010100170000 Protocol = 0303 Ciphersuite = C030 AdditionalData = 00170023FF01 Exception = Invalid argument Decoding error: Invalid ServerHello: Expected 256 bytes remaining, only 9 leftbotan-2.4.0/src/tests/data/tls_cbc.vec000066400000000000000000000521611322470703100175760ustar00rootroot00000000000000 Record = 00 Output = 1 Record = 0A Output = 0 Record = 0101 Output = 2 Record = C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7C7 Output = 0 Record = 005F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F Output = 96 Record = A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A012A0125F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F Output = 96 Record = FEEF55FEFEF5F5FEFEFE5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F Output = 96 Record = 0A46464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646 Output = 71 Record = 0201 Output = 0 Record = 09030303 Output = 0 Record = 0903030303 Output = 4 Record = FFFFFFFFFFFFFFFFFF03030303 Output = 4 Record = FFFFFF00 Output = 1 Record = FFFFFF01010101 Output = 2 Record = 0000030100000000A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A13A Output = 0 Record = 1A1B271B1B1B1BA2A2A2A2A2A21B1B1B1B3A1B1B1B1B1B1B1B1B1B1B Output = 0 Record = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 Output = 1 Record = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090909090909090909090909 Output = 10 Record = AA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 256 Record = AA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Output = 0 botan-2.4.0/src/tests/data/util.vec000066400000000000000000000006151322470703100171370ustar00rootroot00000000000000 [round_up] In1 = 1 In2 = 10 Out = 10 In1 = 3 In2 = 10 Out = 10 In1 = 9 In2 = 10 Out = 10 In1 = 10 In2 = 10 Out = 10 In1 = 1 In2 = 4 Out = 4 In1 = 3 In2 = 4 Out = 4 In1 = 4 In2 = 4 Out = 4 In1 = 9 In2 = 4 Out = 12 In1 = 11 In2 = 4 Out = 12 In1 = 0 In2 = 2 Out = 0 In1 = 0 In2 = 10000 Out = 0 [round_down] In1 = 9 In2 = 10 Out = 0 In1 = 10 In2 = 10 Out = 10 In1 = 11 In2 = 10 Out = 10 botan-2.4.0/src/tests/data/x509/000077500000000000000000000000001322470703100161665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/000077500000000000000000000000001322470703100167435ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/000077500000000000000000000000001322470703100217145ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/cert_path_CRL_01_ee.TC.pem.crt000066400000000000000000000023701322470703100271370ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKBrtCby2r83lOiu2iEru4u2nQnopHEbzLWM M8sOIyBSqM2N2lJWRiOFZ3sX/RN3Az0ipLa0cqWvp6pMvvsXojCGRwsurueY2gBB seBF5xxe19Swr2lHGM67XwNLupTrSUDZGMR2KoJTg4n6Cs4cGgOlhZjz33wBTMaY 8IDrOgxuGVyXCUqLE3ESYHoUTpZfw53UspMG/vDY8f0Sk3FJl3aRWm1vrqiF78sQ sIMrf8flz03CTYUHtZ4nPQKRmmOCruNAd3JJfU6AYN4cDSi3noACjrYxj6c/6acM kKx61suCGD9SRluRwUEx2KMXEAN0I7UYETj0nJ5sCQ8RIgJd23cCAwEAAaOBsjCB rzA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vbG9jYWxob3N0L2RvZXNub3RleGlz dC9jcmwuY3JsMB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMB0GA1Ud DgQWBBSF+9xb3zooHvfVBEaeNGG+jIKIRjAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0T AQH/BAUwAwEBADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQAD ggEBAHP69ifAUrCLzBuDZmLX589Oz0makmtkNl9P+sEdtpIcO+px6AO4SMSPA37p p0C465HaQDP9Z+IqzDD0fILiR7mLh12imm552m1G5ACmLLG8Fc9H7655rG0tIOSd NgLo0YyE/BswQJNukA1DHBpUYx/P4qqy+zca3LEZd/mc5MKxVcw+PsP0WsNDUUC9 HbDUSm4TEpPsysY5v/LKF/m9TFCNuPXF3Z/xTNzRTkOKnH3vA+cWPruRC9sP7gYD UiRIl/L2buxEkVTX97zMOQd9o/bmv2k6KqNWIBIrtVj25OASeD/15vviaix6Vczz tlennFASeG9IAdNc0mPLvio5p94= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/cert_path_CRL_01_ee.pem000066400000000000000000000033061322470703100260430ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCga7Qm8tq/N5To rtohK7uLtp0J6KRxG8y1jDPLDiMgUqjNjdpSVkYjhWd7F/0TdwM9IqS2tHKlr6eq TL77F6IwhkcLLq7nmNoAQbHgReccXtfUsK9pRxjOu18DS7qU60lA2RjEdiqCU4OJ +grOHBoDpYWY8998AUzGmPCA6zoMbhlclwlKixNxEmB6FE6WX8Od1LKTBv7w2PH9 EpNxSZd2kVptb66ohe/LELCDK3/H5c9Nwk2FB7WeJz0CkZpjgq7jQHdySX1OgGDe HA0ot56AAo62MY+nP+mnDJCsetbLghg/UkZbkcFBMdijFxADdCO1GBE49JyebAkP ESICXdt3AgMBAAECggEAR3vm8aorPqUSZmMwETLvJhFQRg+UY1CbdlTM6ZFZprge v0YUQLdwFrkGBSyJ2eghGdd7pWygX+N3p6P+QF5mKBBVzQ5W4x3SGuYrUMBlfVdn /r9i0ttbGxgUfR/8OwrjgBGdf0IWrC9xwISa1wBfuTtDXoZhklzz7NVO6munWMzr 4CPLcAyhqTPI+PEVd4m+6kohcj2rma1P2pM8ae6bzQrCwMKEWM+Yrqvq5cyjjvK1 uzcH/LIL3XQUIGmrLucyY7MZTbx9+aHxNI4OlaF59yBdKs427mVdp6JmYM3mXmW2 ZopGDGxTq1KSHfO+2pXvqW9FzT24qgix8e/GMAKX+QKBgQDYis937dcHn3NTHtfR KVGZ47Mr9dit/C7EuZf+lwVFgwjDKXRdPxBnjJnZDPrYlVPFGOS5ZUJ2A536Kfut +gmLqvMAlwfdqV860ObeEAtm6foxRhrS7Fhlq22zMeQ7dQL1gH+Y9CDSWhLLKpuu MG9iDQBsRlAHtqx9VyfFKXZX7wKBgQC9pvSvpVjeT6xrPTHIceoMFHTHkB0zraoq 80k4RKx0YzMbHsjvH7XsZx2y577Uz6Ad2hhOHcNFa4G2e9emkVRGD8S0auvA8j2w IWKME5MgtugtgyJXaA7YFscCX5u4Y/KMFucmVa6jBJu3KODi3MOPnvnpgLXF05Qn ZfgCe+7s+QKBgQDA5d7tef0cuEkWmZotpD4h9XotxgKw8r6C1sX0sHmss47BtBMJ 4dzuMYz3kp1/BH8sTAGsueybjptTN8UQ9XU9axqvwtrp9jB0B5Yx6V8O3Y3YCRhq HsqcPzso71/eK11ob4C7M3ZtjHnDbIBkipceZHClA3nVdUBxI4u1EjtvFwKBgQCY ktx/AlLAZvCbRZvrWlmkZkCc2//iN3CTJS5eqkDjUXsn8lhMqAI/saVe7LnFk1OJ MJAlKCSUkKzGFlOjmX9m7gCd9Pa9PyUJsZIKhyTySLP5CWpzTy/CAHESI8CvUxkq QrKrUHsygt6TN7vURy69OHRtujKCeHjUSWCA/xt0YQKBgQDSlf9hZIRDnt7ZzLlL xx2LTTaHL2sgblF3ijpTTo3H5W7lMdzA8rjjqrweYFctIFlRfO2lEeZ+5LCiu4bd R6TFKMxXREUhcD7SAK45tA50ThuSI7HM+2S6KYQ5FltHxDOByJW4AZKcNdEUXSCi zSzyeuKCY2FT7bXuusya4bIMIQ== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/cert_path_CRL_01_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/cert_path_CRL_01_root_ca.pem000066400000000000000000000033021322470703100270740ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/cert_path_CRL_01_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/cert_path_CRL_01_sub_ca.pem000066400000000000000000000033021322470703100267020ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_01/description.txt000066400000000000000000000003521322470703100250000ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_01 Purpose: Checks the behaviour of the application when it cannot locate revocation information about the certificate. This path is invalid because revocation information for a certificate is not available. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/000077500000000000000000000000001322470703100217155ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/cert_path_CRL_02_ee.TC.pem.crt000066400000000000000000000023701322470703100271410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/cert_path_CRL_02_ee.pem000066400000000000000000000033021322470703100260410ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/cert_path_CRL_02_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/cert_path_CRL_02_root_ca.pem000066400000000000000000000033021322470703100270760ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/cert_path_CRL_02_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/cert_path_CRL_02_sub_ca.pem000066400000000000000000000033021322470703100267040ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/crls/000077500000000000000000000000001322470703100226605ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/crls/cert_path_CRL_02_root_crl.pem.crl000066400000000000000000000011561322470703100310220ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NDdaFw0xNzEwMjUxMzI0NDdaoC8wLTAK BgNVHRQEAwIBAjAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEABCvPRcHcaXOnwWsLhNbAnK06e/QHBX+aFal2tzjmmPpJ x6Wjl7gJ5NxN8Y9uzdAOBmftN5LgnLm8m5jQhzgqUoxtMEX4FEyKgD16za2Kzc6+ Mg7WGbnjIHCLt9T303K22YaArJX4fhjCZZmwRglP4392m88f+ynAUq3yD0VzOshm PivA6NVvM+tkVGvM3qOEJHhkyw2WZR5AYHcnB2IMtB9Xc1FD9h1YKU2r9fVHX/QD mbt6ZzNwPYWX/aaBqsDklF7LMkKKN1ApZ4ocoOBcVR2XYjGCWINOiVFJUR13mIdT 5F8DEKNd/l/erzp5FYowUKyNKZDgklQAvZZ1nLtg/Q== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/crls/cert_path_CRL_02_sub_ca_crl.pem.crl000066400000000000000000000012201322470703100312630ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBszCBnAIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ0N1oXDTE3MTAyNTEzMjQ0N1owFDAS AgEBFw0xNzA3MjYwNzI0NDdaoC8wLTAKBgNVHRQEAwIBAjAfBgNVHSMEGDAWgBTg jBmqaSWaGiUA9rMouhv3DfnPwDANBgkqhkiG9w0BAQsFAAOCAQEASVKeNF4ozBHs jKss2P4Wor9/yvCi6PH+f3fr774nbpW4hK7BqMDfLt1lyPMMRil/Z0FGsTF4wy9f CSnI/NNIqDLdPfL/Wq40swJvuR3p7CjGwEZjfYJ3Zbz+JZJBws7Eg6JtBLHAc9JQ uw9odU3oBt9w9DP0Oh3idfXAQp1Ho/nK+ssXOEo1ADETFjaVooXSpeJ7Khi/6Asq L8A/gDTbuT6K3bEusSXhMo1juAN3oDj7Ruev+CWx0EkxtM9AUBzw707kL7ELxm3g 8FsPC0ejfaQIPluaEBgTuaHtGCUCKnUeUYc2MHPJZZWSaNpqv9OLoAn/25tvsyvI pIKYuraHXw== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_02/description.txt000066400000000000000000000003011322470703100247730ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_02 Purpose: Checks the behaviour of the application when the target certificate is contained in a CRL. This path is invalid because the target certificate is revoked. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/000077500000000000000000000000001322470703100217165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/cert_path_CRL_03_ee.TC.pem.crt000066400000000000000000000022521322470703100271420ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ4WhcNMTgwNzI3MTMy NDQ4WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALduL9byjU+U/h7qafFgTBAnew60mhJenH/Z thGZMyPAWGH4tImhud5EZmBRZyd3PD38fO7B4FD7rwN0yf6OC0BZO4wrlbx7ZZ2F uBN74pm0Hmd2WBMaqt0l26xBVE5bXAMpV9KFF8qapNop9J7rLEYJ0VTV30mMeeB5 5gX2ureHqZ4UPH/ypcGVgAQs0klN1GPsV5gCegVJcI8h6kSFyXsy3SPPORGo1sqL VK/tiLS6UpnzsRAbOlz8PulqwcjL04wX2QHFR5Vo5xnZwZ/gQnLURfpWTDSH3AIA q6QvMZoIhsOI2UYbv0I81nynlDWCzm3dQO81zxDKNpODjGHDf3sCAwEAAaN5MHcw HwYDVR0jBBgwFoAU7+kybPy0OP1cbl+JnXRW196Iv+EwHQYDVR0OBBYEFNaDawpq cxm1hCAkKC7HHzR0KdngMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAcRxuJzzh vGt1btEKhLlHSTuY4BKArQ1+lCA2WDKrh3bvHr2VoOjJvop5Ag1NqEXfqm3k1oue lXWtx8NI9GBEXLmjYlK6YF/6qPeCHEBwpBLBoQiK4uNbnUHSVVw3ICcjsOYymHZY zJxl2/KvAg7WA7MSEK10y/jh7M5Q3oGIJBCZ51sSD3l+nkuBKWGF7vVcQI05Xxzh /4UsEXHDgcRU2hS5TEgOCafmCLlnDJuIxRkKRYRbMEURI+Lc53DUMH4XNpj7d6ro NIcOoHCbbHdzsRHrT+LaOXYKXWHAZyM6O8xSCqziurIHzK88KnFxKCaaOQuWiWqX TuymWaetwJxMoQ== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/cert_path_CRL_03_ee.pem000066400000000000000000000033021322470703100260430ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3bi/W8o1PlP4e 6mnxYEwQJ3sOtJoSXpx/2bYRmTMjwFhh+LSJobneRGZgUWcndzw9/HzuweBQ+68D dMn+jgtAWTuMK5W8e2WdhbgTe+KZtB5ndlgTGqrdJdusQVROW1wDKVfShRfKmqTa KfSe6yxGCdFU1d9JjHngeeYF9rq3h6meFDx/8qXBlYAELNJJTdRj7FeYAnoFSXCP IepEhcl7Mt0jzzkRqNbKi1Sv7Yi0ulKZ87EQGzpc/D7pasHIy9OMF9kBxUeVaOcZ 2cGf4EJy1EX6Vkw0h9wCAKukLzGaCIbDiNlGG79CPNZ8p5Q1gs5t3UDvNc8QyjaT g4xhw397AgMBAAECggEAIZ/XsinNQJjZynYDDKWv28g49RWjJpnkS0Vv7CLurm+M ZA0wnwgf58AXGjHh3GitiNlXV3b/tSilyNboTjrgkh+pXEUDEkV2d50zBJNRkwZj Cmk1tO7PAnH1pkpld2Wk5Ml32VXfahrV/E3zkwweFgqnrkr0Pum6z6zYvyAe0xSC Rx1YSAnJJ82QRlQTNlRS7KA3zEngJFrmZyT3l9UPK+6LNPKZ2GUySI1q85NuSGUv IBp2xPudQ9lL41LnxarPwN/R/uQHfYUD2fvlJ/XiyEEUOvZHueAWCrGOhkd7+IV8 eO/lQqdbxtMrntiBjE2csG8JAAYfs8MMwpCz20vb1QKBgQDe+8XKERx4Iz4Ie1IP JkDMoPlYZBQAlKYFl8W4q+jnV/VSvP0vo/9BTTRFPEj8nBHSvIsWc7d+1zdbV0Hr wG6g5RJebdKUyXnNNO/BSeNLv9oHsxFTLGg9Yr3X2DH4waxz+8Jy7s1874trTAFZ e3rExiVXBtd+lSUWccYdA2NDPwKBgQDSlyX7lR4SZNgnCnChT3K8B3StNwdCNj05 KlMBHGhw4OvLgzgiZyw/xy7yBg0dg93FvigSPibC2o7HiTFTZ5139QiM1eZlEdbX 20Qt9lnQZH+DKPegXu5i1+jt3JbFoBUidzfALiTmKrJN4PBgqVJKU/05S2E1J/qm cTbLIy9AxQKBgGt+Ac40S34atyfNkzRcY3aBz1HuBLp27kXZ8WXh8Ye8njXBh2g0 7bMkLaOGuUSVU/48B+zN4dJSm4v713p3rJ0BcMZ2uMIjEgV7lGygWuNEXC3EBAEN cj7NX+kyfnyFmMXcwtM3DXZB3/rci/YAEaHUR2HZmX6bFWLpe/C2ll5vAoGAZvRO NXjpgsSaiDuqZLKavSJIAIbunYg21kPC4MAqr0THAm/cebVHBMc0RE6BCvT07z/Q B1srSAfh1dtUqhn1+jdpPrE0OiVGi7E+29mcfy0iydS1e0nt8ZTs45z8eRGSQ49V SjdFAuHM2hYmbptZB82X9vLLS1mISOcAir9g0qECgYEAlhh3kd7Gycovds86aNdR MBEXHDUlupuJ72psITqPMEDnRgEdo4r2GmaWYrB23LYRNSwS/Cj4hoqrwhBvj0zt B20NiyOQJokabzQJ23rapSt8j1a/0hNBulfkK4zHIPVDGPay8DU8o0Ej/owLR0nd NJEuHh6JAJPqzFayiiJUKck= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/cert_path_CRL_03_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/cert_path_CRL_03_root_ca.pem000066400000000000000000000033021322470703100271000ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/cert_path_CRL_03_sub_ca.ca.pem.crt000066400000000000000000000023401322470703100300600ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0N1oXDTIwMDcyNzEzMjQ0 N1owIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl/5kwEMgB4olQhOEO/Ynp+FNlfNJ5IWa 4paxKoBQ4B6t5F433iL65Jjuxu7oIy+MldmhPapJ0Dy7d3qUE35SvAhGoGsJxWUa Q9T7Yl0FRSyj89ZH3NGf7BMOSAkUUZ1Kpd6v2nL1g2bwjm7L5sHA0WI+n0PmTUMh 6X9vD/dN53+XJ2MT4qqLNpUIUHNgcF3h+IM3DQ6hmTYXdYCOCdeJcOlh90VPVm07 raEI2BKttSh83ukiJq5G6KW9E3AWtNTIRSlLV/MZ3D/vTc+1EWYo53apPZkNMdpW FkxhWaPXzaUnwWoRiT5ZEh5tjm+rjtgeexogCIrcTcJe4Hhv63wWrwIDAQABo4Gf MIGcMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9sb2NhbGhvc3Qvcm9vdGNhL2Ny bGRwL2NybC5jcmwwHwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYD VR0OBBYEFO/pMmz8tDj9XG5fiZ10VtfeiL/hMA4GA1UdDwEB/wQEAwIBBjASBgNV HRMBAf8ECDAGAQH/AgEAMA0GCSqGSIb3DQEBCwUAA4IBAQBYLRroRr02zCEjVBu7 Jt9PRLGo2dlFDJLdOG9CFTsaXIdf1FPetF4cmOcjEef1yH+rSQsRgU8SwUvvraQc OxVYtL1DKFQ+CErbuHHL4iiP0R3IQpwY8J8POfqHqK2aLsB0mm4jsMAiNQbrXjSv R1fp7OMZSeS84tEsvOjg1JdbDQTCwVstTddWGqha+VuizaX/5OKqwJ2EFfwAX7uz NYqQsmSc5A/llIDJq3lmGhdlgCh1asDnUDht8IXQSpYSZs+XaQ44iFiEFpxYXA4K 9PKm5YUpRfhRXFQypE0p4EO6Uwog6ZjZiqof/iWGoZmxFcGPNSZP9AXZmQtnIvEF nKjZ -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/cert_path_CRL_03_sub_ca.pem000066400000000000000000000033021322470703100267060ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCX/mTAQyAHiiVC E4Q79ien4U2V80nkhZrilrEqgFDgHq3kXjfeIvrkmO7G7ugjL4yV2aE9qknQPLt3 epQTflK8CEagawnFZRpD1PtiXQVFLKPz1kfc0Z/sEw5ICRRRnUql3q/acvWDZvCO bsvmwcDRYj6fQ+ZNQyHpf28P903nf5cnYxPiqos2lQhQc2BwXeH4gzcNDqGZNhd1 gI4J14lw6WH3RU9WbTutoQjYEq21KHze6SImrkbopb0TcBa01MhFKUtX8xncP+9N z7URZijndqk9mQ0x2lYWTGFZo9fNpSfBahGJPlkSHm2Ob6uO2B57GiAIitxNwl7g eG/rfBavAgMBAAECggEAS7A7hMCIhSimeBqW6XMheUjJZYgi/mEH6Zkn/WWroIe2 iXffs0dRECAWG8thnw/xHrgiwr33hvKPWiaY8YIg+hDW9tCGq502sJuxWWDAHJvn wyesXoqm7BzrKjUXQLMmtqXHhW1k1DwhQ5RqBm3qsnoNfCsIVuY8z3WNnXJGAaaz 3FLI07W/3vhc2b8TtBEQ3wm8GIWFVvD+gqEEqGb+kYDDVEY/TuwkfvyCCFFasnSF 24ut7wCOlwUYJYUaKFKSlgTLRRskoDdG/QZEf5UBI+PzzVh5yb0INl6b/5fk5yss V2nbMUARe9kWW5dOJbl2fkWWdzscdVUUR9i6kwyMUQKBgQDKf2CFxBxJlWA5Y5ko MqQxZSidjYjS/feUkFwaYNrlwOm9/9u7paRxQfvpelmQu1dYEs5ewLpWII1UW811 DvSYAiJnYyv16Axq/Z+eiQ0JMGDrJyscJ0BXjBlHKa/Tqkt89sMAko0jGlJd/4TQ 6tbQ+UIIkGgXAliGbibwfiNB0QKBgQDAJwO8ChnuDUAvDyXdpai9JyplVQKRB5P8 eL8wQ2Eny8G2MjVJZYn/lWtbiFp3+WVEgMm5jWXKc0M5tL4jxLiohlXOEVHcFhbK KuT4usxXihT457gIeG0KGl2xijisNzYS7UaCzVHczKlEIPq5l7xhuk5gcAg6cMp2 O80LecNwfwKBgFgM9RqVQLuaUWIC9ejtxEmaNAP2NCWSuyIFd5ccwHIg5UJxy8kX aJ6602AdjG6Ll5o7azL2WM/0jZ+932PkIeUrIGyWSdo+kY/AQrT74Qg62hnGSU+P ncGzsJYqAUNnjDWFUxufnfFCk8g9wDHbu5bYm6b/q9M9eOLTaOkv4ALRAoGBAJ2m JMk9HGMT2goCCpYcGSH/pSf4JB/rML4eLvYhAfANmwOpk9CBD0RzSd6SM29lXXFj nJ2w5cfA43HP2YQtHTee530m9pt0QARkRvHPCGH19xjzvCiu7P8x/JbyCWc58RJ8 O7KLU9Os0l8EE9D7LeKcYTt8DzQrX+C7VZJJt1BvAoGAbu7y/AN8TpZQNwq6xeov 6+VjVi/+jSA6HC4nw5d2gmE2vJcDpGwOcMnx9smJB166GfaLocE7A63TI9aYu0jC 14BqWydeF9/43SsD4bLJl+ycvx4rjJU7xLE/N43dd/OV2vA6quBbtnW0Ev4XMigf DB8isvi6KpfogdoXwUQ65+4= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/crls/000077500000000000000000000000001322470703100226615ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/crls/cert_path_CRL_03_crl.pem.crl000066400000000000000000000011561322470703100277610ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBnTCBhgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ0OFoXDTE3MTAyNTEzMjQ0OFqgLzAt MAoGA1UdFAQDAgEDMB8GA1UdIwQYMBaAFO/pMmz8tDj9XG5fiZ10VtfeiL/hMA0G CSqGSIb3DQEBCwUAA4IBAQAMK8tpWc9KUUsoixQaaUjlKnKuF+lfiFVpesfhEgxn 091Nm4PjPBz0wO3qLuqVmdjJkc5yVfiOziCjwR68fPU6K1faaACBVX9imwZKxFbG 93N++IosVv3hB6bH0LcLsnXwNwXPnhLBoU7xPtcKQQtCxYMZDQzB+EfFiWJXTB9e ygjqRLRgml7UxzIetoYOXYLjsBI8AHMg5+Io+cCs8XiyFqw79VeFTJJNmWOSrl9+ uWKCj7s5lDRPxBUd9yG7DgQWzmj+DIW19b+umHrJSeguQWYJa1DRRkFzrzwuWv/E JTOHb6HeQdfEX+oi4PmUMnF8mJE4hEZeoB17d2Lp8PRG -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/crls/cert_path_CRL_03_root_crl.pem.crl000066400000000000000000000012141322470703100310170ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBsTCBmgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NDhaFw0xNzEwMjUxMzI0NDhaMBQwEgIB AhcNMTcwNzI2MDcyNDQ4WqAvMC0wCgYDVR0UBAMCAQMwHwYDVR0jBBgwFoAUx08Y hC18r4z8hj9PCEIT2SVAanAwDQYJKoZIhvcNAQELBQADggEBAFU+mEDmoZptI5PV +aQ8MCnW8Kpk2oj7m1+ZDBnMEIgu4NDtABu4mL8qhrjLskyjLASebH+7di+Y+Mz8 P/mWNlBZUH8+9tYu7uOd0YvsZnNQLTPPfi+HgHCgMssNTm5HCmqJ7ryTXwatIuMh Q2WpJ8rMbi4wLwIS5t3J7xcGR8hzxQFBBXvD6WqNITUSAyFJOVwXoAgZCqrxvz7x 7Sd/ojZitgGmKeuhzUiLpuTFkQTkV3WEe60Ti5TqvCGMKC+2H3MREQtFnA4P1Vbd FBCV19OMiFizc+tncVD4mzFN69QxuS0dqLEC7UZb396Rx8dAyCjYQW/OYaO/TohP Weiedu8= -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_03/description.txt000066400000000000000000000003001322470703100247730ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_03 Purpose: Checks the behaviour of the application when an intermediate certificate is contained in a CRL. This path is invalid because a CA certificate is revoked. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/000077500000000000000000000000001322470703100217175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/cert_path_CRL_04_ee.TC.pem.crt000066400000000000000000000023701322470703100271450ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/cert_path_CRL_04_ee.pem000066400000000000000000000033021322470703100260450ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/cert_path_CRL_04_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/cert_path_CRL_04_root_ca.pem000066400000000000000000000033021322470703100271020ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/cert_path_CRL_04_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300570ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/cert_path_CRL_04_sub_ca.pem000066400000000000000000000033021322470703100267100ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/crls/000077500000000000000000000000001322470703100226625ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/crls/cert_path_CRL_04_crl.pem.crl000066400000000000000000000011561322470703100277630ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBnTCBhgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ0OFoXDTE3MTAyNTEzMjQ0OFqgLzAt MAoGA1UdFAQDAgEEMB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMA0G CSqGSIb3DQEBCwUAA4IBAQCSvCbHdtfsVh5LW3fTShKjM6na7tboq3GhJXMG4SwN rtX5lBDsj5K4ht1WpBNxh/b2pSZxWgTfKM9ej87gqNCzEejPAy/TI9PgLqPqZ/o2 fhDSavz9WScqFq1dVBkooT6+V1TNFS270OOpm4sr2Bxfe0h73eG7VNfP0Tg2nn2P MGwIf0MzBVqRp6TFaVvAuU4u13GzeOjnp03SoUKjIJfRWMVdqifRIsjm6F0fWbIo HPzpa5UxcO4er3yAuaDhOg79WdOqcPoVMrAVpEdKZTS+CG2vZmJuFtI2AptiArLn 9D6yWQ+JxoCraHqVnLraSsWnBPgQHsU48GCPuG6tQnaq -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/crls/cert_path_CRL_04_root_crl.pem.crl000066400000000000000000000011561322470703100310260ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NDhaFw0xNzEwMjUxMzI0NDhaoC8wLTAK BgNVHRQEAwIBBDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEABIEMoE7G+s8/1uwAoZLvvu9qnUHK0UmIj4rqWl7MkCQj ScPObNNP7Bm6UxVfKG+qW7cCppX5t29coUn70bnjqfFFj4iAjddUSZLg8eI65/PS u7LPXaXRHAXuOm8yp9Nu7QgTyjKkzz6E1ChTLYU+7EmLevJr+uWTRqVFA4zMSlPJ 5CA/6TSL2PEp3wFXkB0mCMgASQ30PMqx2ok6uSRGKOZyeiXwW40nzpqAkYZeKy3/ 6fBr9TabsmYk2j8Cu369tZ15QCVUpdkcnMrpkwLwGpKAQFLIOJHRfz4EKvffSzuO B0RZm0C1E4TSyzjesqHqnE4vUPjAL3NpUOO1v43A9Q== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_04/description.txt000066400000000000000000000003501322470703100250010ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_04 Purpose: Checks the behaviour of the application when the signature of the CRL is wrong. The target certificate is not contained in the CRL. This path is invalid because the signature of a CRL is wrong. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/000077500000000000000000000000001322470703100217205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/cert_path_CRL_05_ee.TC.pem.crt000066400000000000000000000023701322470703100271470ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/cert_path_CRL_05_ee.pem000066400000000000000000000033021322470703100260470ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/cert_path_CRL_05_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/cert_path_CRL_05_root_ca.pem000066400000000000000000000033021322470703100271040ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/cert_path_CRL_05_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300610ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/cert_path_CRL_05_sub_ca.pem000066400000000000000000000033021322470703100267120ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/crls/000077500000000000000000000000001322470703100226635ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/crls/cert_path_CRL_05_crl.pem.crl000066400000000000000000000012441322470703100277630ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBwjCBqwIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ0OFoXDTE3MTAyNTEzMjQ0OFowFDAS AgEBFw0xNzA3MjYwNzI0NDhaoD4wPDAKBgNVHRQEAwIBBTAfBgNVHSMEGDAWgBTg jBmqaSWaGiUA9rMouhv3DfnPwDANBgUqAwQFBgQEAwIFoDANBgkqhkiG9w0BAQsF AAOCAQEANKuVzO3jmPdNuCvpB805d9qFmD3Zr/+zLreLev9+3zmqRFJPq4tLjSaT 3rOYlW0GlkHHMCcZK0GR/7LCIGtCx5IS6fBhkQxozlgTUaQVflOG1eTSZzSm1u0q 2QvdCU0tHNJ6dfWgOLwcquBejy3uToqIa64rVK09wiYI8ywB6q7Pl0s2DA/vuRNr jO2sK0xsOgcehA0ABbQyfIMdXP+N8bhamdCDFX4sieoOhywH527TqDBqByMYpXAJ bG9FVYi/3cBsdI3aOV421VC754q60gs2W44ThHuLklfSjI2xAFQLwWTMv0+YJoyE BYo8B1NOvGUze+qC5XB+IzwVMpBZXA== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/crls/cert_path_CRL_05_root_crl.pem.crl000066400000000000000000000011561322470703100310300ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NDhaFw0xNzEwMjUxMzI0NDhaoC8wLTAK BgNVHRQEAwIBBTAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAWltSnpmUp2mIbyqAFXo8DFYe/JZ0hQv67Rh6bBQqXkg5 s3OWn5IVNTi9QcEOiMO7fU+OR1oqjaiDkgid09uRXt0EHh0JuFmOCxhUGsqJu+H1 7wgFDZH78V925qDnJIWwT5aXSMEElGxDX55wrIyZRYZXuEfSt3NADVJHfFbahJoh CKAauvWROkHF55MlRKJG9prt2o0ZYy0D+vcEF4oFJN8ElsSW2Og7FtUsQKcqz7Nf 8TwSFdwyKyNphMfHz43WVswn683yH6hIdCWQ6O8regEhdMDO3xBFUYkXQnBX2oQv bb8C628rGFVa3LmhMfuHE3s3S4m/vPe3b8KZcGp3Dg== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_05/description.txt000066400000000000000000000004371322470703100250100ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_05 Purpose: Checks the behaviour of the application when a CRL contains an unknown non-critical extension. The target certificate is contained in this CRL. This path is invalid because it is allowed for an application to ignore unknown non-critical extensions. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/000077500000000000000000000000001322470703100217215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/cert_path_CRL_06_ee.TC.pem.crt000066400000000000000000000023701322470703100271510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/cert_path_CRL_06_ee.pem000066400000000000000000000033021322470703100260510ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/cert_path_CRL_06_root_ca.TA.pem.crt000066400000000000000000000022141322470703100302010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/cert_path_CRL_06_root_ca.pem000066400000000000000000000033021322470703100271060ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/cert_path_CRL_06_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300630ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/cert_path_CRL_06_sub_ca.pem000066400000000000000000000033021322470703100267140ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/crls/000077500000000000000000000000001322470703100226645ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/crls/cert_path_CRL_06_crl.pem.crl000066400000000000000000000012101322470703100277560ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBrzCBmAIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ0OFoXDTE3MTAyNTEzMjQ0OFqgQTA/ MAoGA1UdFAQDAgEGMB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMBAG BSoDBAUGAQH/BAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQBo4kTGBHMIYQOHbDeb YvCt6+W85V95LyxIx5PoDuVYQ3IhDnvwVmTFYin0tYx294rM4evQJL9haaryVBrJ HrCDvnYTqFWpXNvjICMvhWn1cuiFgWksK9Kz5aiVylABKNvpZcrM2awC+BUy+Q34 UY6HmG0495HMtN5mobu9F1ByPQavMee9vJyzA+QQBg0/b3IENnbvjJ3IK3wFY49y qkSYe5eZ7c2khCxkwS+ogFzAxksy/lu6a5eGGarZe154WCnGGR4cisMGKxMwf6S7 VtFXyctgLKhIyK6VtFn7AoTuBa4L09KuFgZ/Zc3srUXbnsO5ahTnYd3IAK2IBZn1 uWRU -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/crls/cert_path_CRL_06_root_crl.pem.crl000066400000000000000000000011561322470703100310320ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NDhaFw0xNzEwMjUxMzI0NDhaoC8wLTAK BgNVHRQEAwIBBjAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAXwSx2NtqRbBbXT/9A4SSDanhmiXJHwcevJHidPtzTyYu OkQC9QN63NucMczU9ukYxdhVEEIy5CLT94fzg44CwUFLMDJKTpM3qxuACbBLH2/j nmdyghy9/uGkSM/md7/8nlAYcxr9EgWQPgD7AYnaURKTT10CYl+hj4RC6BUsL9/P xfD+qGBsvHhnkhjBL2g4wkvjR/8P9/e2LqHUst1z8ioq7LmwigFtqsqreowRt7ie FEA8jGoUSmINKTqI3t3eg7axi6F7FP39CnRZqGQkYrdHtYWhZCVwfEcd0WbfYtpd zsJqB32IwS5IQHUl/hauIAfNUEjBCzxu6ifh2mLnYQ== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_06/description.txt000066400000000000000000000004371322470703100250110ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_06 Purpose: Checks the behaviour of the application when a CRL contains an unknown critical extension. The target certificate is not contained in this CRL. This path is invalid because it is not allowed for an application to ignore unknown critical extensions. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/000077500000000000000000000000001322470703100217225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/cert_path_CRL_07_ee.TC.pem.crt000066400000000000000000000023701322470703100271530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/cert_path_CRL_07_ee.pem000066400000000000000000000033021322470703100260530ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/cert_path_CRL_07_root_ca.TA.pem.crt000066400000000000000000000022141322470703100302030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/cert_path_CRL_07_root_ca.pem000066400000000000000000000033021322470703100271100ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/cert_path_CRL_07_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300650ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/cert_path_CRL_07_sub_ca.pem000066400000000000000000000033021322470703100267160ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/crls/000077500000000000000000000000001322470703100226655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/crls/cert_path_CRL_07_crl.pem.crl000066400000000000000000000011361322470703100277670ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBkTB7AgEBMA0GCSqGSIb3DQEBCwUAMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENB MQswCQYDVQQGEwJERRcNMTcwNzI2MTMyNTQwWhcNMTcxMDI1MTMyNTQwWjAUMBIC AQEXDTE3MDcyNjA3MjU0MFqgDjAMMAoGA1UdFAQDAgEHMA0GCSqGSIb3DQEBCwUA A4IBAQCqAxDrh0FjK4MByyedu+QZR+9ik/jPAFznR+9barO6nJtq6XifN3/X0jg1 6mV2zRU4/8P2UjTWblPqaBHAYA9iRYB7AoQB4FlUevvbET34HwgJ1MCoVtiK2FwX BfOLl0e/loRRQv4J8RSMk/zEu2Kg9NVsGw3mJxBYmkbsdVP98RY28AetMFc9e1sq hgdhWEDPbQkwoim8aSxQ66CSRVCsO0drrTMaJSGQlfGhU7DDHjgk87qJ7A8e4EpB pnot3uXVzIlqsbWbE/0GUxUY1Br0vEXmEbX3YNkwnXfzki/6s7Qz2wscfXSxs4cV m9YyKTWnnN0CYib4Q9hPG5Jiy7QO -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/crls/cert_path_CRL_07_root_crl.pem.crl000066400000000000000000000011561322470703100310340ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI1NDBaFw0xNzEwMjUxMzI1NDBaoC8wLTAK BgNVHRQEAwIBBzAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEASTn0oRz+84G6BOWfz7KWE6nTHA1ZUpxCbm4N3SS0C/5S 3OZn2G0y6FyzGm/dxA2HdChfdcYJaaNisNfDgZm+Lf0LoIRsOlMWTvtvh4FucUSW Y4d3g9abjXkxV3zLCUW4uOTxYzEMC8f2hRmpX7zU6bsLRxRi+wXG2VUQOA7i71RO Ltq5PLPGnA5+Vhv02+n1HFGyi12n5tKPuWPa4RmTpFw+FyOziDHAcEZ7OI7I7wA1 u50sc1LlBctugY12vbmjZjUGIMCeJhhThdojY8BPj6UX/wCBLPlaRWN4SKVoG8Nu bW2m0IyeXXGDDsjXcg3WEmjiJLVxVc7fkMvCapuq+A== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_07/description.txt000066400000000000000000000005031322470703100250040ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_07 Purpose: Checks the behaviour of the application when the target certificate is contained in a CRL that does not contain the Authority Key Identifier extension. This path is invalid because even if this mandatory extension is missing the CRL is still a valid source for revocation information. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/000077500000000000000000000000001322470703100217235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/cert_path_CRL_08_ee.TC.pem.crt000066400000000000000000000023701322470703100271550ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/cert_path_CRL_08_ee.pem000066400000000000000000000033021322470703100260550ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/cert_path_CRL_08_root_ca.TA.pem.crt000066400000000000000000000022141322470703100302050ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/cert_path_CRL_08_root_ca.pem000066400000000000000000000033021322470703100271120ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/cert_path_CRL_08_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/cert_path_CRL_08_sub_ca.pem000066400000000000000000000033021322470703100267200ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/crls/000077500000000000000000000000001322470703100226665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/crls/cert_path_CRL_08_crl.pem.crl000066400000000000000000000011561322470703100277730ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBnTCBhgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MTAyNjEzMjU0MFoXDTE3MTEwMjE0MjU0MFqgLzAt MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMAoGA1UdFAQDAgEIMA0G CSqGSIb3DQEBCwUAA4IBAQBV8ePdQ4Z7fo71zUhzJld+00QED0vsjMjFMgg9SOoB CQji7VGNpU7+438ohnOP9gscri1ZRpHdHqGpVTUepzgx48ZC8F3cUwE5ee24dyLu BT7Oez4DgcFclyLyjxSRp4jn5GxaCYHYMefm5JAh03IwI7DEr1X2uf1f7Ynnr0Q3 pLIlNwQbVrmenfEdNw1jq+iXh43fDTuDBtAMQZ3oSrY/vuWkVx092Gen1mT8e4oA nRaViNMjLm/fBIxhyUQ1nBR/nw4nQlYlEELJly7AJm78hSr3TWOXJ1Pq2tLYpE87 XFNYHmgJy+8Lp0IjD+FkO8L9Ur9FsPIqW9KXJQnBbRwG -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/crls/cert_path_CRL_08_root_crl.pem.crl000066400000000000000000000011561322470703100310360ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI1NDBaFw0xNzEwMjUxMzI1NDBaoC8wLTAK BgNVHRQEAwIBCDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAeWGlW8kiFICDuUFCa7F0VjKcFttYd5aUbJ0LX2A1VyQs rMSrdGuyyYXAgvPSoGfBcanTmft9JLtfq3UIZxKrbI0jY8uZY002DIgOp3rrZX8D OkcOZT2C80OjhuhIbmWIppY3YmNqoh67fv2rFWxYioK9oA1puHEKftrGLNd9QUJy hU3wvwlxj+VQEd1KaR2KTJdL9huVPiDWohqe2ZigOWuf3N4Af28iHHMeLX/MWoTZ n7d2ht5VmMarevzneISFdiboH6hOsLinVE1ESqyDPN7rFhlZNdagXiPU7QxR3SQq UO0MBY4Okp06qCrdug7VjcHXFrTFJh657uzVbJGHZg== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_08/description.txt000066400000000000000000000003511322470703100250060ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_08 Purpose: Checks the behaviour of the application when a CRL is not valid yet (now < thisUpdate). The target certificate is not contained in the CRL. This path is invalid because the CRL is not valid yet. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/000077500000000000000000000000001322470703100217245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/cert_path_CRL_09_ee.TC.pem.crt000066400000000000000000000023701322470703100271570ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/cert_path_CRL_09_ee.pem000066400000000000000000000033021322470703100260570ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/cert_path_CRL_09_root_ca.TA.pem.crt000066400000000000000000000022141322470703100302070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/cert_path_CRL_09_root_ca.pem000066400000000000000000000033021322470703100271140ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/cert_path_CRL_09_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/cert_path_CRL_09_sub_ca.pem000066400000000000000000000033021322470703100267220ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/crls/000077500000000000000000000000001322470703100226675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/crls/cert_path_CRL_09_crl.pem.crl000066400000000000000000000011561322470703100277750ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBnTCBhgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcxOTEzMjU0MFoXDTE3MDcyNjEzMjU0MFqgLzAt MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMAoGA1UdFAQDAgEJMA0G CSqGSIb3DQEBCwUAA4IBAQC8GIH8U26/QarHuHL058tGPnBPLTiNK/zHr5SLJOkz LTwcK+djJEUiZu5DSHA4txLkfpjLq4XrzPvkaU/x+zct9DTu/qMp3rlB3CJi65UD Zk/gQyxtfrApx8HGGuSMc2185Cc2oknY5+ms0BUf9U/hStEnHVke3pS0celxB3wq IduPVH4z4cniKibJRmvBBooaCpsLmZozIFNoNcMgFA5um0/eE4QVXaDpuQBx4vgZ PZcJwwiVwrTKb1q66In3NltPgtvdvG6EBAMYBX80c2cSkxNNP6hZrpXUzICp8A7u 6h3+FWO00yAud38/zWpC2i10ne0bEE91wfxdUK2endE0 -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/crls/cert_path_CRL_09_root_crl.pem.crl000066400000000000000000000011561322470703100310400ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI1NDBaFw0xNzEwMjUxMzI1NDBaoC8wLTAK BgNVHRQEAwIBCTAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAAGqI66MHfNv9xrUNDYfL6CEOZV4ef/NMss45u0dKo5tV Jq8pDromMR8kxqm0SOdI6Jrhrn+FppQI2TAkMbEzGxNKZmavpOBKOUscJ50ReI9S VfM/yBZDnt0hQzhNab+wTWMTfIadH3Ld1aVJYLAAbBpJzf74Av1mdfClVEQ+hv5e p+0JaPsLCkTWGrAzibxUY2Vb3UjSK/VxJC5Tgt8lgMptdz8/KfUgbvMklEllw05v PhZ+dlW1Gy65Wi45WpW6gwg+H+lFKYKCAsAB+AXp970+52DEmocm7KXMeiKs+JP4 60Kf6S9KY4O2gG3TWqT9rvqJC7jkwfTBbuuLEi4qLQ== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_09/description.txt000066400000000000000000000003371322470703100250130ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_09 Purpose: Checks the behaviour of the application when a CRL has expired (now > nextUpdate). The target certificate is not contained in the CRL. This path is invalid because the CRL has expired. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/000077500000000000000000000000001322470703100217145ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/cert_path_CRL_10_ee.TC.pem.crt000066400000000000000000000023601322470703100271360ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDajCCAlKgAwIBAgIC/u8wDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjQ1M1oXDTE4MDcyNzEz MjQ1M1owHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMnKBQr4thZFuPu4Faq7EINw3b8lmwWnRl hCMGgYrlH9ZzBEXF5e4OyC0yeZMGU2p1NFxXWYbXda5AKaz7UjfiTjxGMoGRWDAz pV2Pub6APad0yndST3SgDHTguBnD7ByVdONI99fzCP9MSFSLXT0p/KWxU3K/SPBY TKTm04dbEkZ1qY/E9yfhitiKwgQz2cyZb3vGVlyhZ1Um3nF/8d4I00wm9fMCCLzi fgLxIZiQDmmKtp+7pEdyoUdmPGTNCR/0fJURo3ueXR0ISDDaEpZmW7dq8r76uKhR 7G5/gLJuSC3ZHFrtpzP8vtJiioN09O6IzZOJ9eEZhQCNDuc9vAWnAgMBAAGjgasw gagwLwYDVR0fBCgwJjAkoCKgIIYeaHR0cDovL2xvY2FsaG9zdC9jcmxkcC9jcmwu Y3JsMB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMB0GA1UdDgQWBBSU aRmCp9NenGzH62G4/W51q3qSaDAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUw AwEBADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggEBAHNE pqC3muoivzfMnNFfjZOKhqnZofyjZf8na9g0/WXdmSXnAB52vKcJ3AUzq7MCMeBG zhUa2DNC7TKXCfUQEnB+NQ145NWEZ0TSuRI86TlWPL4tfKnA2y5kMUgOqcZTsGTw rxRUfo2mkORArJUVsT2Jy4YfGhbqjQtX3pK+xgjJpVJvnxJ3dc9fbWlaXmPD2uyh okTzlflWJUWvF6xDrguoId8vcM9bmcT18fnFWoyZE0TQQOPzLaiL3jaMAMq67blI +M1rduMN/eXDd9p21BmKhrw+SQY6Ami1gLRebg3TGybmtuEXhEQmNJ5CMUIw22kd Z5DisB60dg8Kch7B5oo= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/cert_path_CRL_10_ee.pem000066400000000000000000000033021322470703100260370ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMnKBQr4thZFuP u4Faq7EINw3b8lmwWnRlhCMGgYrlH9ZzBEXF5e4OyC0yeZMGU2p1NFxXWYbXda5A Kaz7UjfiTjxGMoGRWDAzpV2Pub6APad0yndST3SgDHTguBnD7ByVdONI99fzCP9M SFSLXT0p/KWxU3K/SPBYTKTm04dbEkZ1qY/E9yfhitiKwgQz2cyZb3vGVlyhZ1Um 3nF/8d4I00wm9fMCCLzifgLxIZiQDmmKtp+7pEdyoUdmPGTNCR/0fJURo3ueXR0I SDDaEpZmW7dq8r76uKhR7G5/gLJuSC3ZHFrtpzP8vtJiioN09O6IzZOJ9eEZhQCN Duc9vAWnAgMBAAECggEALQIHAbiboEDDI0rLmXZK6tOxaMBWmkRLdkkqqzOzqdLn CUXXU0DQrM+7oW68uJeAw2dRKKW404w/WD3SnzXmtREgkRBrD92mPLYTbpodHXhy bW5b8O8paEtVKllU0ZQOdZHQrSxXhE5mWhFPB5jq62F30RnaE9mnhMTXQS8mhxGJ XdqHvldeKg14SKYno2X3s4mW4hy3jPzrRDY59aSUSk2FKMFxPhLRtSTmJ8tby8uf lVlQs2KymQRVT1650BNo7D0JUveCOhSZ6MPze5E3QnIEv4WXx0RcLgcdfMYdTrZU m8+j6yr65oQCN1dKpySVHQw1ZAuo1apgGSUBsvYUAQKBgQDle4F9+Gvi9DrcYVTW CkvqL4OSbwfJMFUK28MiWoXSCeM1bMQRPXS2eOKGWUtdnBn2Cb243Ozytr4VT9DF JLlyegO4/y9oqUCmJ8OvYlb7hvxkUHtWZ3XbAr3o19I8ZHsxSoF+fjgwyesa2i48 MAiUjrkqvfKELRsGTT7g3McNYQKBgQDkQWdUsiLFnLKJQ+DQzGcLuk6abfkqbQOn LvOQSPbPNk+Qyo6dTSwJrj/L7Hr2ERag8nc7UJdm/ojfVyFNkMci1G9idwUr7r01 27m0VdaMCGgBPzgzyHYrB4XUSiOgkmbs5FYbUedgFQNLpXT2UgG6RH97i39Ma6WK zuw+x2OoBwKBgET+tRgisI0z0N6hhNg1kE2Aq5ZDO5wJpAf3utuBS+qyflV5thlY 2NZj0feCsV4bqNKIazpBchwnRU8zCBm9yOPaO3RLhP16pa1PF06LyoslMo0WhX6c 7JpEYMS43sS5kTBorjZRzKMekkkof+4oouvHXXS0V03WIeHrJ5SDzHUBAoGAB9/t xbFDm9e1HSE3X1y97VynG5LRttH9/0WSZ5bs1OdFxXQHiYvBCjB1yP5Gm7ipNDJJ RMWaA5aieDoUTw3AoQX9NcNvbT2WT4ZeGMehWEFt/SUGNlsjIIbo6hMIuaBzZpbW Fak0t07iRzjVGS5pGtkEIOoGIUfRdUGASwYr/P8CgYEAm4D3nknbs98dht5Zf75P KBfk/Q9Nk0YWAgMHdil0QRey4n63CkoxTGhIFUDeuYR1rgBgu9O9sTskMlP49w7a TydrzDTcvxqPr0zpnQE1i/994OB6k9i+9rLEzC2d5+EJhH1NB5GMK8BGsuNmBvNP Rt1w8yP4i+N8HA7+4woAE7s= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/cert_path_CRL_10_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/cert_path_CRL_10_root_ca.pem000066400000000000000000000033021322470703100270740ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/cert_path_CRL_10_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/cert_path_CRL_10_sub_ca.pem000066400000000000000000000033021322470703100267020ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/crls/000077500000000000000000000000001322470703100226575ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/crls/cert_path_CRL_10_crl.pem.crl000066400000000000000000000012201322470703100277450ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBtDCBnQIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ1M1oXDTE3MTAyNTEzMjQ1M1owFTAT AgL+7xcNMTcwNzI2MDcyNDUzWqAvMC0wHwYDVR0jBBgwFoAU4IwZqmklmholAPaz KLob9w35z8AwCgYDVR0UBAMCAQowDQYJKoZIhvcNAQELBQADggEBABcBwk1WvZDd ablyHmeu57sBz+XNn6r436UqgiGXZfyfT8nIBnkhjdLn1daOkCsNgL1/i5BOPSZy Qqpte3n53Q2BxN+ON3RpLfxbCwnbo4Y3mShCzKpKnsGg3Rq0758wj8HhVP7Kw+/g gfvYU+hw9HKlGCgkouAn5xt2lLC4KLYhGCHwVlxzLr43ur7gUTBYyJXfe6Fc0lvx lIDbIqrD6Kh9M+llhXpHOGIRqyT5d7wcOaR+IZkL/sDDAJ2ZZeRRCPjkDRHJvoJJ bVUacNXcCA6dX2Pg2QbqtZXNNrCd1+sOvjBsHYJYiwF3vwQZaN28yJwHCKimu3Xl bVcjLlfHYBA= -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/crls/cert_path_CRL_10_root_crl.pem.crl000066400000000000000000000011561322470703100310200ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NTNaFw0xNzEwMjUxMzI0NTNaoC8wLTAK BgNVHRQEAwIBCjAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAZd6IcgdotTqtJV8kG6P857c5AJMG5KO4O68NV8x1EBxO hPoqWL2KY9KjASKA+ISTwyyFtygdQhi6vn2FvB+g9z+RV/OyTH4oPNWNNT18Swhi CnjELf5FZIdP2y95V5XgWGL3EEB+1VOqt1l2NkD5S3LT0MEgkRkTpRBMb/R2RHdD 6mrrZA6efOFg0G3Ywp334uqPVZnOvFH78Ohzx5T18WV+f/4EPiH0PhvQELkvSB/d ++9VWADdsUd52nTAo2MlJBolj+XSfTdLuW0PC+WQ27B/qRT0wQmFJ+GsHis9MM2+ P5NFB3DqaZ1YumD+dzrPxLb4DtN2mraLUaBql/c89Q== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_10/description.txt000066400000000000000000000004001322470703100247720ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_10 Purpose: Checks the behaviour of the application when the target certificate is contained in a CRL and this certificate has a negative serial number. This path is invalid because the certificate, even if malformed, is revoked. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/000077500000000000000000000000001322470703100217155ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/cert_path_CRL_11_ee.TC.pem.crt000066400000000000000000000023701322470703100271410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/cert_path_CRL_11_ee.pem000066400000000000000000000033021322470703100260410ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/cert_path_CRL_11_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/cert_path_CRL_11_root_ca.pem000066400000000000000000000033021322470703100270760ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/cert_path_CRL_11_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/cert_path_CRL_11_sub_ca.pem000066400000000000000000000033021322470703100267040ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/crls/000077500000000000000000000000001322470703100226605ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/crls/cert_path_CRL_11_crl.pem.crl000066400000000000000000000012501322470703100277520ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBxzCBsAIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ1M1oXDTE3MTAyNTEzMjQ1M1owKDAm AgEBFw0xNzA3MjYwNzI0NTNaMBIwEAYFKgMEBQYBAf8EBAMCBaCgLzAtMB8GA1Ud IwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMAoGA1UdFAQDAgELMA0GCSqGSIb3 DQEBCwUAA4IBAQBGpPVtx/Dk8c+d5W7DZAICtVfE95ge/FMi4BJbcVaILCf33A9J 5BTploBvF/4SKGwq7v3PYzlTQAomOpx2kwPo738sA8ofFshbVCuCeMf0O8x7fKsE /eqk86njrpMebEV0fdkrkx2r5k7kiqWSo0Hwo3NxGl9sk+y9eVR/4FYDghLD+VJK 5OkPOuvMIveUQQPRh7+ucHvT1BpW4G8YnC6dl/w9hludrUGDNTDYvKAFvcUvWwdQ eTXV/6dbkPt/BVC7KMiex4ky3lOeiiAmwrRJLlUvvTHdORQO04CbThK0AtM0bRSN jlVnoEIEi1c62+qYZNsMi8PrUopEF93XFmYw -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/crls/cert_path_CRL_11_root_crl.pem.crl000066400000000000000000000011561322470703100310220ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NTNaFw0xNzEwMjUxMzI0NTNaoC8wLTAK BgNVHRQEAwIBCzAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAOf6d2ItpAAWMVOrgfxSc8OvzlFtlJXEZydF1YxGbv2Vp oSt1DRaBhrzY4ADQx/EnZkYIO2MgtrJ8PJyISkTW92938FZtff6QwJ6S/GYhpbBG 5naaJ2cHDoMS1HsKCo6/rA5837W0ZIcztomNxnYZd3EtGLcHRl7Np2TlCLzlPg8u Lm0zOKgY0W5TCp7WggK9wAaZiKeaCxe74aJYJ1Z+zOKnvR27U+RQ4gbt5bbYEVE3 2HvMBfRc3M3a7W8YzahspMnw90qW5NzLnsEgy8Z6sM/tONddCKXoMowDeP0YjXnM 7gRC6b8myWo7C9LyfSjeKvJqIW2Kf7ndgDA40LKRlA== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_11/description.txt000066400000000000000000000003461322470703100250040ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_11 Purpose: Checks the behaviour of the application when a CRL contains a CRL Entry with an unknown critical extension. This path is invalid because the application cannot process the critical extension. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/000077500000000000000000000000001322470703100217165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/cert_path_CRL_12_ee.TC.pem.crt000066400000000000000000000023701322470703100271430ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUzWhcNMTgwNzI3MTMy NDUzWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJmoYDdznQ+RwFtQO+bqi3mFmsZXGbDeYF+2 wJ8R85/dZTfTOENl4HA6iEPhiqWqk+GdqdM0hWCS3grpSiD30sX4svj2xBD/QwUf RcCjOL6LzoHElliKTZLG2zdpP2Is5K/XroJlnkJMR1nboxnFBs7wwqxkfhq0VifP uU/v6RkPhBJAemTC/O7ddpVJfjRT9kGQRTzLvfGluP3AqGZLg5aknoq1ZC4e1UML ShsGKpLktEmxpJ8k696a9ZaB4nGBKkzCjKtMpMhPJ5+ewO7a+/VBEuNT3vl0/Tyr ARaS9E7BNfjyi/ISM7QDyBAObR47xrmpAUZAnMQ3oKV6UewKlBkCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFDM6cLUxGHJ8VZXvq+QohhdcmUbcMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEAgot0zpayEur6dOzJULj8VwBZM7BRZymIJtIW0ZNc/4KnBy/bbLzbDvClIEWR OgmGY7wER14w/nVRiRlCipMXHz3WUViqLyRii1IJION3T2vhmndE1Xc1/5Kymz1B 2vUnnrN3pzfFpvXTJ1iE6PwtWL8VQNQxPLvEXzkKII3ESsCoEY/nCHGUnUWyTmDs Vz9SDjy9VDlyAx6CUrxWKCP54kIowKyKr9wLdh/+TpJ83O7tN1OItLHlws1Gqt8G X7X78d7px+sAm94kMnlZG0WNHDn3tnYbDvCAZ5UGCGX+AoD9axHxBZlWC/GDcdKl sVNDR9LC85Y28WLkjZWWbx13hA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/cert_path_CRL_12_ee.pem000066400000000000000000000033021322470703100260430ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCZqGA3c50PkcBb UDvm6ot5hZrGVxmw3mBftsCfEfOf3WU30zhDZeBwOohD4YqlqpPhnanTNIVgkt4K 6Uog99LF+LL49sQQ/0MFH0XAozi+i86BxJZYik2Sxts3aT9iLOSv166CZZ5CTEdZ 26MZxQbO8MKsZH4atFYnz7lP7+kZD4QSQHpkwvzu3XaVSX40U/ZBkEU8y73xpbj9 wKhmS4OWpJ6KtWQuHtVDC0obBiqS5LRJsaSfJOvemvWWgeJxgSpMwoyrTKTITyef nsDu2vv1QRLjU975dP08qwEWkvROwTX48ovyEjO0A8gQDm0eO8a5qQFGQJzEN6Cl elHsCpQZAgMBAAECggEAK9hYUCpcxD8OOOAdn6gIkW32uqbK7WWe8WDX+Ovp7RGD GtlaAh1VXCDPljMK2Xfhh6zx8xLXBjYSRuHHpb2hdp0fEJx1WPZFnPYN9Mh+XhzN mcjLL8uTFBFLJzYQgIaX4Lc2E/5EGN3kNDdQhH9skGsx2Xg5ZYxU0zpaQf2OsXgC 80rrVEzz0kJ2886WOP1Qm+xj7IjoCzZD135LM2g/ef4AJ2C43YhwiT18ueNTwhgM q5GPm3Icz9/MqwTOAW1PJWoLzga0VDqgX2qzSIEgD3LLkfBkFfgvS3Cy8X8YrixU qNVH5DqYSzVc9E3BFBwmH9LjqIDnFScHwAmmPiOOywKBgQDVmgCZ7NPfJBcAjilI cnQjff82Wfew9PMt7nie4M/Rp0So/VzHoIuoluyG+uDfjVqWojBtViSOl5OZ5Ee6 MQdvat57BS3t7dHsgbgrFWZbu36qOSPnCco1/tFG90J/mYeIN0Pwoj9YQOlIQouK do+VQp7Zcf1PnE94TD6bRVs9lwKBgQC4KF+LtsWPcG86k9wjgFlgrC9dhPgBS29g BDYrdjMYMvCGXi5GBLQQAQ5iGmb3X4loPyPPbgyJoawMf4yTCk8NVL4xqueBsPn5 kG0FJF2Za8Me1ZHh0qDGRlhLbvPGlnqFbpZ4FPIHIOqm/JKkwMaomtgkLrAY6MT7 3Rr25FFRzwKBgQDUE4SXT3GJMn74GS3Z9XFkL9wt7aOkeX/c0dHHBTSxVx8vneb5 eWhQahDLb9nHe8Q+nSfx1r6TKOHuwJ2KutVEBVqB0EGq4x4zcRQXCrdHSuBXSEZi RPEVLTxB9ot6v0e2shBtodm82S4FhbSgNFkY/D1VbfzwhyTMLv9WEMWnXwKBgQCC jqzeIh+Bh5ZzkuvYh1/V93xE8sXYNSCqk5HL0ip7F3IJ8K8hmKgHSJhn2IvzCFoj +89peX2N/X46BhslC4Pr0Y5dK+qguVUfJtMDeDqbUBiuvX6E+IxexPRH1kshGQGX o0UtsLu9bgqthBZ6kujEE7L0Q904a51rad959XfpZQKBgCD2keOIQi4ChFLAMxFu n9O6TU82d/0bdgJGp5s/X5q3EB7cGiGMGf5pr1NdCJYGXqf7kdmQeN7PBNu5qYPX bZ2GKaRjbbX7QR+T3jfgPhE7i/3lm+/d9w3lsZ5Gwlc20YTu2Uyj3hgXacb61+d2 Tx72Khaq6Njvbm1u7sfGXDtG -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/cert_path_CRL_12_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/cert_path_CRL_12_root_ca.pem000066400000000000000000000033021322470703100271000ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/cert_path_CRL_12_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300550ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/cert_path_CRL_12_sub_ca.pem000066400000000000000000000033021322470703100267060ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/crls/000077500000000000000000000000001322470703100226615ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/crls/cert_path_CRL_12_crl.pem.crl000066400000000000000000000013041322470703100277540ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIB2zCBxAIBATANBgkqhkiG9w0BAQsFADApMRowGAYDVQQDDBFUZXN0IFN1YiBD QSBObyBUQTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ1NFoXDTE3MTAyNTEzMjQ1 NFqgZzBlMB8GA1UdIwQYMBaAFCN/JVKvl3epiBIA4wDB5toErmdkMAoGA1UdFAQD AgEMMDYGA1UdHAEB/wQsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2Ny bGRwL2NybC5jcmwwDQYJKoZIhvcNAQELBQADggEBABP6PnvPgQw7nksO74MscSxq C5/lnosoTRaqxb+V/gp70SW/DwQRSPBG8tVPfKri37/nuWxupRCWtHMZQV/BRLr/ 2q3XLqOQgRuqWOy4nUjXKk5eWURIamyRH52GC0AY+br1FfyM3KtTkOXB/HKbhRR/ K0Mbz8TjB12gpcBAiHDlfUQZYghROHKzNe2JVFc7HbEww2ah6syeeaavNfoS9286 +2RymlzlxWRhEAd1rDtx33W0aKTTV0ukG5y696TEM6+nJjtIhUGAbNX2/gXEMUB8 HWWFn3QAOkks8bqblcRRt8y+OQr0g05yrt7uvE98Fy7LP0Xd6Z7qRaKUizv8r+Y= -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/crls/cert_path_CRL_12_root_crl.pem.crl000066400000000000000000000011561322470703100310240ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NTRaFw0xNzEwMjUxMzI0NTRaoC8wLTAK BgNVHRQEAwIBDDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAZyBUN/PktkNRUSdu7wTZU/QtHVNDLCWs1m+tnMMaRIJ5 Qm6lkpPpGKk9LMUhZt0BMRiLkQC/420iKlCrkysjyOOu1S1Dfg41xFYP/gACqLBP cYCqsuy8y6s4kd6KvanXYOn8z5lYlDfNma4VIyWyZSMfzI9PXyBbfVmk8JHrjjgl Xm0TJkoHEi1kJgHz4FhunXYOHw7g4ef/4fV5BA+NiqprpCA2fDuApzW8qVUzzbhZ QmtWM4qHTN88PkFt4tWyPfZESUk+fcdF5WepFLrP/gsXlT+u5/O2RtFS3IOeIenF TOlx5dIp0dyVtRQkZPFmWTqr8eT+Fl19AGR2MG2IXg== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_12/description.txt000066400000000000000000000004051322470703100250010ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_12 Purpose: Checks the behaviour of the application when the CRL's signature can be verified by a certificate whose certification path is invalid. This path is invalid because revocation information for a certificate is not available. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/000077500000000000000000000000001322470703100217175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/cert_path_CRL_13_ee.TC.pem.crt000066400000000000000000000023741322470703100271510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDU0WhcNMTgwNzI3MTMy NDU0WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKunhcakAtYifStzf2KMdg76EtHYy/kYoI80 4qBJC2ZKhiOEJa06MDAZr3t0Zhv2ND24S8tyjs0Ed2iSsyMXFRWv+3SgcWr4wJXS 1765HPNbjDGsu12ciuitf8G/OaiQg5RfnY/yJB+4CdSvmO1KyKptVkS3bSbzSxR7 ZHMSY7vy6C7eNxbMbzsL32Ty+Fs8yv60YtahkrmfHTRzgs5g8tmUHcZLZHvTeUTM AdYY3V8bVRkzfLE3oYpEBQNABHAgs3o/Z1whrV1y50eN19C1PH+ISEu4Iqti0dBJ QI/71yqE/pe+kBYxGUHNrXbsF6gD32ilEAEuW+63o1EK+EBufWcCAwEAAaOBtTCB sjA5BgNVHR8EMjAwMC6gLKAqpCgwJjEXMBUGA1UEAwwORGlmZmVyZW50IFRlc3Qx CzAJBgNVBAYTAkRFMB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMB0G A1UdDgQWBBTDBeNZY9qPnPXnjnWWJeq8ja2izjAOBgNVHQ8BAf8EBAMCB4AwDwYD VR0TAQH/BAUwAwEBADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQEL BQADggEBADqmJXusKHOx8UavL8SgubAbaAW4XMWrQirEIzzobjORA5TA7In8Nq1P F2BxlhV6V/yeQdUAZyDWYbCXRnPxdOwtOEVMinOCVkA9ez0IjKhFRS26IEOQXOKn XB5cdylee/A8tJ0Q0RrrPrNSklKr2BgI/IE3SG3Ny2KEBdTUEN0NFHhO8aeikB2f c9Ec9WDcMF/yHQGUFMhPw7tyZbMwEcDpUMdI9E4DzmSI3NRvaBzn6LA+9TDzRRN1 N2+2zZbE8IKnFYnDKPcDdcZ2+FyPY0px3Glv1FVLBVbOxp+90ZWeAjI6Dmfs6vBe IwhDXEXvU4sNahHJVIdT7gCbfHSLlFU= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/cert_path_CRL_13_ee.pem000066400000000000000000000033021322470703100260450ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCrp4XGpALWIn0r c39ijHYO+hLR2Mv5GKCPNOKgSQtmSoYjhCWtOjAwGa97dGYb9jQ9uEvLco7NBHdo krMjFxUVr/t0oHFq+MCV0te+uRzzW4wxrLtdnIrorX/BvzmokIOUX52P8iQfuAnU r5jtSsiqbVZEt20m80sUe2RzEmO78ugu3jcWzG87C99k8vhbPMr+tGLWoZK5nx00 c4LOYPLZlB3GS2R703lEzAHWGN1fG1UZM3yxN6GKRAUDQARwILN6P2dcIa1dcudH jdfQtTx/iEhLuCKrYtHQSUCP+9cqhP6XvpAWMRlBza127BeoA99opRABLlvut6NR CvhAbn1nAgMBAAECggEASGtlf7Bbd/9WArp4MFolRt1PilQmfiHbP3/m6wvWMOJZ JGvQv3xQr0Ju7C1oFPzy/mUeKSfcQnfTbv2RcUkAPsWf140HPMPU8IDjP9Z2dd+W TrDa3bw5SMBGKbYlO844jSUn4v6cKfupvh8VbGuELI7zegtPFENJ1krWzsuf4z9/ uQtpodVlQxunCIXltY6746fK+R0c20idUFPPv2A97nXSmHveYV34aPhQHXRsMKTu uPMmBRgvpEbtXQBZvSv8vF3/h5apaq4YuC7BJWeD06Aw8sQNd/FiKIkB1G8KFF3b kr/d9JHNzI+ye88yYJQGhqRkUS0lrpreSi36FLavgQKBgQDU+SuALHUSSVH3xFSN C4RS6Ax07ospHLnD/7rvv9ys0MpGtyJGiux97GDKeVKT0DQbh0tZQ76YJ45XtCTd Pb3lubhPm7UoDXFVq+T8LQh4vgpUPZ8Dv4YRR8ah7wne53++ZnxvdKU+bnT4p9ua TR2AmPi1idHtYN87zaO3haC7gQKBgQDOVV3OMbsL7OrEPlLpcHI5MK4/SrvzPGpQ BGTM7nQmtvdpQbylsgN37CnSJKgpoiaqyFErhaxcQtTFbvC4/oe6fsUUw9DCuQJz BOd1P/rN+efLTGVKWE6PTiCq+c19ekgv/3ONrmeBkVmhufsFgdanFDK1JCmGHYNT nHR+vjtM5wKBgQC3+6mAyOc6LO0Kxijk0BY4KQ7Z1VmS4qX4lGvBwlW5VYXpITwT BODYx+O2Bqk32J2rSm3lZ4i3mTR2v8E4/6WVV6PJ4hHV0Acgo6bl02GGLWZu7+z3 J/WB6CfIrOAyGHta2N6WyoYWMQYL6bbkzcm21m/FJJKeJxmyaCwO1vnMAQKBgCws rKOrk/8unuia60ddMqc52+RjDLA7vAsblbUmTCnJvFiFoWzcGs/++Mkr3fDj7WFc 97vYp5ktGb6XTOReYhK0d19FuRknYPXdE+zPYNPecBjfZ0QuectGj8nrJ2p41qGo EEZCE5jy1HzCg5KfRKSKt3x+nIFBKk+pTGuiMLH7AoGBAJ7VZFGObG8bXatDnPdM Q9g87Ja6iti7JFPp47O0FgUWwNHmPMY3xgzR/vUZGzezZ972wjsOteiIU1W6smc5 HNfPjj5jWNj6FPBWsQBXvZzjgZX7ps5NU8HYaMqsUzfvo31WpjnMeSgDLh7CjOYY Zfj/jtwh/dFOYiJ0nrYHmjsi -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/cert_path_CRL_13_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/cert_path_CRL_13_root_ca.pem000066400000000000000000000033021322470703100271020ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/cert_path_CRL_13_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300570ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/cert_path_CRL_13_sub_ca.pem000066400000000000000000000033021322470703100267100ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/crls/000077500000000000000000000000001322470703100226625ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/crls/cert_path_CRL_13_crl.pem.crl000066400000000000000000000012741322470703100277640ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIB1jCBvwIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ1NFoXDTE3MTAyNTEzMjQ1NFqgaDBm MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMAoGA1UdFAQDAgENMDcG A1UdHAEB/wQtMCugKaAnpCUwIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNV BAYTAkRFMA0GCSqGSIb3DQEBCwUAA4IBAQC2/Df+7pIVjhYPwm5CcPdo17fKqFEX T87rRxyh3fy7T9TrHUiAoEVZsNAfn/nEPxiKEDi4NCcQobrvZTgY8/bl+Xb8f8lB XKKYJAv7ShYNzWuF40ANRT+on+p3DfH086B/waK8TZISULwTsyAnkNF3eLbBnuDQ ShP0uJoFta0P44WgSTIMIN4NlwJg92DG0Ywv4sUAUWG7jrRDb9Ydn0J09zb+zVUa m1ZnFpVPwnEZKmQ02xMVmijKFqCHFBFc2dUXDilDN23UAuxKHo6YpkkUlu/DWsDH ZuKcjAIWfiMaCDBsuDuSrWXDX7uzsj5XXh07tEp2ePCGIZOaMSWakSMX -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/crls/cert_path_CRL_13_root_crl.pem.crl000066400000000000000000000011561322470703100310260ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NTRaFw0xNzEwMjUxMzI0NTRaoC8wLTAK BgNVHRQEAwIBDTAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAb4U0Ah0R63kL0XfznmvsmwZjsgEI4fdFf2QMUV1TCjCt uTCiK7NvsvWW1kTxRJQJtsboEFQiDnFLmx7gg1Gztm/CZSrTIXdOjHJQ97MX+AvC i5iCRFNKvbjQFryfuWI9/JRys7WqZWHp5biCS8T5YttzPxxlL+I1ZCbrzuuhLxTC jOTylugwgkVJ7D5SLRR7qjQsnMLVretJZuGWKlupsH2fhTu53z/DsC4UMsmOPks5 Vk5UC8n4zszrM7G+G+CPh3ju82E6cuFLV0BDgRfezosfH0/kcJ3++x2vaBkzXpdn zcMxKTgpb92TWtEzTFrVXXduBDFXKt0kt8zvfoUPYg== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_13/description.txt000066400000000000000000000007211322470703100250030ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_13 Purpose: Checks the behaviour of the application when the certificate's CRL distribution point and the issuing distribution point of a CRL issued by the issuer of the certificate do not match. The target certificate is not contained in the CRL. This path is invalid because the CRL located at the CRLDP of the certificate has a different distribution point and no other CRLs for determining the status of the certificate are available. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/000077500000000000000000000000001322470703100217205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/cert_path_CRL_14_ee.TC.pem.crt000066400000000000000000000023701322470703100271470ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/cert_path_CRL_14_ee.pem000066400000000000000000000033021322470703100260470ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/cert_path_CRL_14_root_ca.TA.pem.crt000066400000000000000000000022141322470703100301770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/cert_path_CRL_14_root_ca.pem000066400000000000000000000033021322470703100271040ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/cert_path_CRL_14_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300610ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/cert_path_CRL_14_sub_ca.pem000066400000000000000000000033021322470703100267120ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/crls/000077500000000000000000000000001322470703100226635ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/crls/cert_path_CRL_14_crl.pem.crl000066400000000000000000000004101322470703100277550ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIGYMIGGAgEBMA0GCSqGSIb3DQEBCwUAMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENB MQswCQYDVQQGEwJERRcNMTcwNzI2MTMyNDU0WhcNMTcxMDI1MTMyNDU0WqAvMC0w HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwCgYDVR0UBAMCAQ4wDQYJ KoZIhvcNAQELBQA= -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/crls/cert_path_CRL_14_root_crl.pem.crl000066400000000000000000000011561322470703100310300ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBmzCBhAIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NTRaFw0xNzEwMjUxMzI0NTRaoC8wLTAK BgNVHRQEAwIBDjAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDANBgkq hkiG9w0BAQsFAAOCAQEAO2aU2IabdYF3cJfJXKUrVOPxnJ94U1W/EpKuFbCWWO8d AvKDtmx57q+vGEK2Tg/wuj7wbOky/K9REDD+Q8iyJec7sTcwf6/C+Y4165r8rY4r 31ojldPFohrmE728fpLXJqSyjJaNVIvg1Efz5TNCZc90Yu2AXVBG82bA5lhOMD99 ol5Z2yERMPDMLwNDV2oRu5EMxp2Sfvk2oeoqwhEYQ6TBaOoN7QturEdDiQta+ZyY 6rGDWGepgZi+AKnS0yyK/sqSDsU0fwYscQXapE6qpshs051px11iplpjeBoifBCb 7+a6gdlHmsEq2/E/Ihp6P3p27jHldCAu0A3s8ETwSw== -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_14/description.txt000066400000000000000000000003561322470703100250100ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_14 Purpose: Checks the behaviour of the application when the CRL does not have a signature. This path is invalid because the integrity and authenticity of the source of revocation information cannot be verified. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/000077500000000000000000000000001322470703100217215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/cert_path_CRL_15_ee.TC.pem.crt000066400000000000000000000023701322470703100271510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/cert_path_CRL_15_ee.pem000066400000000000000000000033021322470703100260510ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/cert_path_CRL_15_root_ca.TA.pem.crt000066400000000000000000000022141322470703100302010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/cert_path_CRL_15_root_ca.pem000066400000000000000000000033021322470703100271060ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/cert_path_CRL_15_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300630ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/cert_path_CRL_15_sub_ca.pem000066400000000000000000000033021322470703100267140ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/crls/000077500000000000000000000000001322470703100226645ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/crls/cert_path_CRL_15_crl.pem.crl000066400000000000000000000011561322470703100277670ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBnTCBhgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ1NFoXDTE3MTAyNTEzMjQ1NFqgLzAt MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMAoGA1UdFAQDAgEPMA0G CSqGSIb3DQEBCwUAA4IBAQBBqsPMC7wZMLXas8fEtyuDNEc5YAGt5GbhSD5rPIRx 3MjMivzBTehHJGjltw11361jyxnUiGgncV3nXGeiYNsHUB3SCpamNOzw/2JkQH3n uF4JU3EqCq4hfSWA1+ZwQvSdhfyOQLqtOrns7dTCdbHXnYpdTWDxb0Mt231WOOME Ho/Rm1fQHrximADU1A3EQUSRjc6fJFT2bcujMRgO/mpNSRAgfrO/fDVCfm7NmTpr whfoUTHs1yNZ9LnFplHZnhAE1eRFVA93Y08Zjjtnw7eHg80E89cua1tcqkJ6LUnz upS2MmGA1dJ6Ek3LWFWHyJQ8dZghorJycxvOAElHSTPv -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_15/description.txt000066400000000000000000000004611322470703100250060ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_15 Purpose: Checks the behaviour of the application when the CRL for an intermediate certificate is missing. This path is invalid because revocation information for a CA certificate in the path is not available. Furthermore, no CRL with matching distribution point can be found. botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/000077500000000000000000000000001322470703100217225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/cert_path_CRL_16_ee.TC.pem.crt000066400000000000000000000023701322470703100271530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDbzCCAlegAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQ2WhcNMTgwNzI3MTMy NDQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJWomlxlqcdd/t7IQjIGy2M0nEP8Bah1ooLr Iq73gzeVFM4qIjKL2OyQYbJDLkMXWUmzmX5P5cGG3pjAJ+Van0ch+OL6Utj8RijJ Ufc10Oo/TIVzIXbMxIa1oLZ8gQ73nhFkNxQZxzgsKop8wPPTdo41p3DSw/+a9cD0 bmqgjSMDYydfuo/42bLeSmlLYhF18T5C1gUn+JXMvQJSI6kLPczsi+mQ0N0GtV0C 1whWBo1atAUK3OeYGRDzIXnE591vXICYg1JBjjEYe6VNK/B3vCEu/QFRLtF3IYHc loU4uurI8HfgeEbJ/H3/uDrUwgahuoIqRXtxNIQv1qGXwbAnPBcCAwEAAaOBsTCB rjA1BgNVHR8ELjAsMCqgKKAmhiRodHRwOi8vbG9jYWxob3N0L3N1YmNhL2NybGRw L2NybC5jcmwwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0O BBYEFITwNLOf7HFKC/d5A2X3c8Qdd3sQMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMB Af8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOC AQEABaLToWh/aCEOlWbi810W1FeAvkwJYSqyYK6hyFYiQ6dn0x4OnqytfVxYKaj6 wp1OOy/aAG9sSak2/Yp18J7U9Nnl/fz66TNBwjsipAo2auHsqfvrxQl4xEyovdzp OhJY4gLUPrmbecsmI4UTU6Xl9IGMDh9LPAn1ErYUvvolJp9Y6XlSb/jHT/7BDMmq JwToSRDikiaCKtrjQvtgw5vFUfcBqKlQmy70ZxIHW92E4cq1twugzc1RpO/c0mxj zjd8FaHJYT9q6z5fRhloqN6w46mS9nbt8xa4As9ULoMcpeVglDXXLh+A8HLLudWD ZB6LDkS9rU3WAqYfPzNZ5AR06A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/cert_path_CRL_16_ee.pem000066400000000000000000000033021322470703100260530ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCVqJpcZanHXf7e yEIyBstjNJxD/AWodaKC6yKu94M3lRTOKiIyi9jskGGyQy5DF1lJs5l+T+XBht6Y wCflWp9HIfji+lLY/EYoyVH3NdDqP0yFcyF2zMSGtaC2fIEO954RZDcUGcc4LCqK fMDz03aONadw0sP/mvXA9G5qoI0jA2MnX7qP+Nmy3kppS2IRdfE+QtYFJ/iVzL0C UiOpCz3M7IvpkNDdBrVdAtcIVgaNWrQFCtznmBkQ8yF5xOfdb1yAmINSQY4xGHul TSvwd7whLv0BUS7RdyGB3JaFOLrqyPB34HhGyfx9/7g61MIGobqCKkV7cTSEL9ah l8GwJzwXAgMBAAECggEAQYSdh0POjwRcdwWuzR3iXp0CqFSl2XkeWzg7Z+Pd4zB1 +kfBzuUgY3hV/OeiUibfpP9mfEDYMeAshSziimsg/dAmmJ/EM1BGGscABjzeKB7s DiQ4Cz1b8CmFoT5idb37yltYLYmXiMT1Hsm840G5Tkq48hCjU7xwSDf6Ot3sy92d X9Qc3ws2QVv7hhkuQJvyGl052OI4oU/U6HgnD/zxd5BetAa9zG5BkT2n3J81dDS8 YPpnA+5sO7GEL7M++QEZ+bJhhvXAga61jQflSNu1notf66U2HXn7X2R2Qk15V5JZ ySzRTBynbCLgfAXS35SavFenuuq0oINvV4dMbjiGoQKBgQDFtggOFPIVm77ZPXXQ +LNs7fNGM4aDQrvHri+j5xzuOTZ6kftJBCXUVNq5OuKbaxlhcaMJxr/z7xngXs8Z A+1NYNdiRNzJqU+uwNcY0QtvBpsSr5DEO6fiqb3WxAKyLJETeD9qIbTK36GShliz sqx5vpb64lg5coMfbiyouWnw0QKBgQDBx+EF3cpkgXYAd+lWFYl3yt6XEm9zfZZn VK2yW0+03xUVLyte1APdYxFTuD22W2cxq+1OyNGBT6jplL3f8Xb36LmmYWy7QYHx hbLYF7bD84zV4uLsItTQh7FXrtUw10+8s+fzUu/P4bacIuiebyiwdVH1g/AlUyYJ zqGWq6fYZwKBgE8wBm/lccS32avXEv487lh9wcdnUcP3EZD7sjcalRrRLYHQQG5R S/mMdwJjlGmdbs/5nMyIn09Lf/i+4IHrcbthQ0Mnw6q9tp2OvVhCOisg4TGNwhTm s+p0BAYmAdJtSTocGoIet/PduDAgwRxQPwaQEJax25Y+yEfpb9ewU79RAoGAF5Vj 5Xrgruqymcv+MePdHx8ph+lOdxfJvjmoChTi1nhv8GwVMy1Kax8rdKzvlcn5/SmX cAcwuDQhsovPr/mLKRDBx2YD/aYzUlmbMoFwVNjHQyChzWtPyzE4fBtjBtatdaHP kOV/GiW2O7pj5SRSJ2ef2el8yI4eCwOC1vt9KfECgYBW51G7ijf+dyLWQc+1IFWn QakMYPxzVO0LwiQwTALTDsNQv3QR2wBJslVgDMbR0oNkoyy4eJ/3A0z92bwMTyVq F610JDh+LyYcpCEHBQlRq8GCqilKHQYqdYQp5/luOQt+nWb/rllYm1x9Zlbakdf7 QIN5IZdQJkLNcMQ49t3Drw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/cert_path_CRL_16_root_ca.TA.pem.crt000066400000000000000000000022141322470703100302030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/cert_path_CRL_16_root_ca.pem000066400000000000000000000033021322470703100271100ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/cert_path_CRL_16_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100300650ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/cert_path_CRL_16_sub_ca.pem000066400000000000000000000033021322470703100267160ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/crls/000077500000000000000000000000001322470703100226655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/crls/cert_path_CRL_16_crl.pem.crl000066400000000000000000000011561322470703100277710ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBnTCBhgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUXDTE3MDcyNjEzMjQ1NFoXDTE3MTAyNTEzMjQ1NFqgLzAt MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMAoGA1UdFAQDAgEQMA0G CSqGSIb3DQEBCwUAA4IBAQBDaqIpNdY1OThvWbvtlGbUWX/DRz9CZYcNae1RXk14 6IXNhqtRMcvlVEeMqoxG5Q0kza9sAWUIPitUVKMgxpZpcjhwLTqn5W13w+cmnWBQ iP+mU0y9vSBdkipsmMTeFFw7UmWsN5wB8M4MropIrbSpeQfhEoCUXYfJl83vb/xA CLNSmP/f/6HxCom9kb026ZK9KPu1kDj98nBo5054AynHjX/O/rboroihNj5thgEI 1a0LoONEMVIjfH1krwVF5Sy1ZztV5tachny3rfl2E8SzDpLYPDhGuMj4GHOswYA7 fW/qjOe4hAy4BGfcNSkKQc7vIvevFoDIJIMVjY1WXDh0 -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/crls/cert_path_CRL_16_root_crl.pem.crl000066400000000000000000000012141322470703100310270ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIBsTCBmgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0IFJvb3Qx CzAJBgNVBAYTAkRFFw0xNzA3MjYxMzI0NTRaFw0xNzEwMjUxMzI0NTRaMBQwEgIB AhcNMTcwNzI2MDcyNDU0WqAvMC0wCgYDVR0UBAMCARAwHwYDVR0jBBgwFoAUx08Y hC18r4z8hj9PCEIT2SVAanAwDQYJKoZIhvcNAQELBQADggEBAFKIhW6Ym8+ob64o cRD7FrkGK29uITpPvjMqBTf3JigYOMFbwXwZYFUL2rNpqV20mJ3Ekfnax6+LkLwx MgiqyA+ryOy/lM/5LBcRaFpUeSaDbaF/mS7m4+RutUTwCsz9ga+PLOCd5+SlK1iC LVjLpl1sE/Y7eHlKhy2+QuCx/AcIMTk3Kh0i6eNMX1ztO/almHlkso3vJVw2HxvA /0l40S1+xphc2d0100ApsQ8RiK9BA2nttFUzsuLxmQ0bP0YBb+Ov+XY5uG3pJPch PN1ent2K4+8+Ia9lLKu85LsZyMyTS6Wh+KBeVf+yoTK+t4sdH/gi2wgRWHE8diXU bdjiRHA= -----END X509 CRL-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_CRL_16/description.txt000066400000000000000000000003021322470703100250010ustar00rootroot00000000000000Test Case: CERT_PATH_CRL_16 Purpose: Checks the behaviour of the application when the intermediate certificate is revoked. This path is invalid because a CA certificate in the path is revoked. botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01/000077500000000000000000000000001322470703100241345ustar00rootroot00000000000000cert_path_algo_strength_01_ee.TC.pem.crt000066400000000000000000000022521322470703100335170ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTMyWhcNMTgwNzI3MTMy NTMyWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANkAj2exG1hp1EwMp+GefEeSNb4cVGX3VjnM B49BM+pCiQrL9KvDThtfI+dbdefCgLMFwWkCOWQgNA0QBxQc+gDO46Xgbgg8Exno s6wdF5HHuNCbYT8qIjMIcfQ5ufn4gxLQk+/wN0Bz3XzlJKY8aV5qNTQZf+lNQL3S xMpDzLwGeTYvCIcDzbRCrRAbJ+ssogIkkktLYEKAN/fsoen1KYZPY4i9w8b003Yv tkKJalPip+/ISr8O9F6Yio0aRYaguSwRtTGfH0sHYkWbNyGGR8zd+00GkggVSIxs XGS2IJWL0SD3ZBw3Nc8yPADMlgriXF6oqp0A5NePq6RSxfiYWZUCAwEAAaN5MHcw HwYDVR0jBBgwFoAUDGEFpkgt32d8kbj8Nd9GGj8sdHUwHQYDVR0OBBYEFBzuHo5F uBuNj+7Jnfh/ZHWsk4L+MA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAM4vb+vXR 4rbm8eJnOx1Nnn0kCWLKtyy4E2Pw02utJBsm3LyLISjlsF5ep+sEB1H+QmwKfFHJ vb7YKvN7XHE6H47EX8Nf1IplyNU5rS2bcKCZvuXjKge+qRgF8xi9NGK6SZY6hgEh yMHJDU7/gs50E4PS1YSL5LN9lMf34mJfzG3nwtz2IY7asQaodCJUV3JZfeVG9et+ tXfZErNvXxTuHpZYeBMWtb04rnkKjEfOI60JAVnF80O+rmxVVOefzyKAUhOp6aEv /4cNI72JBdlfU1PCVsfRStrROxGnGjTPAMtLmrTIZN6poRfNOVRDg3w1jpIyIKcg GBUQ7J9V86h7wg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01/cert_path_algo_strength_01_ee.pem000066400000000000000000000033021322470703100324770ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZAI9nsRtYadRM DKfhnnxHkjW+HFRl91Y5zAePQTPqQokKy/Srw04bXyPnW3XnwoCzBcFpAjlkIDQN EAcUHPoAzuOl4G4IPBMZ6LOsHReRx7jQm2E/KiIzCHH0Obn5+IMS0JPv8DdAc918 5SSmPGleajU0GX/pTUC90sTKQ8y8Bnk2LwiHA820Qq0QGyfrLKICJJJLS2BCgDf3 7KHp9SmGT2OIvcPG9NN2L7ZCiWpT4qfvyEq/DvRemIqNGkWGoLksEbUxnx9LB2JF mzchhkfM3ftNBpIIFUiMbFxktiCVi9Eg92QcNzXPMjwAzJYK4lxeqKqdAOTXj6uk UsX4mFmVAgMBAAECggEAQ+c4eJaDe42WKHv3VpLsycqXNZeQ011rpmdRYELjd2T9 lBrRQ6Q4Pzlstzs38F89PYfKB01yXwHyt7mxtVoB4xnaQ3AwjjQaOAvImU17MBti mihc7FKHZBe67NTZfL6GaW9KM5Uj/O+kua3MY5ZY1HoAjv6Bt6P8Y8nd2XsQyC7c wAfNoAwhIAeOwmXXqNNbAroXJGUxajjbgMmSZRyadWTTBswXrB/4sjF8RAaeC4P8 YXw/Y5YjrA61L1vHdSK+kkJlRPGxq3JosaMeviyjyY+yYKpVbp5R8QBywTHU3cEp uYGKxj+81k0GQoCAtyHAbto7hYOGJ1JWMz/zW+XMmwKBgQD17JG3NuiLg4NmRSL+ lyecj9B7Csh8gjC21lyzlxLgu0cEzVhmork+ohmp9JPIzi5E0SX1vQtzQJIxoIqj 9pIdCkaF9hAFU8r4i/fK0JHSNwPBBgsNg6wuVNsRsYVB5SdAMJx4d3n6rW2jCcWl e+f6YiVlP48ZxltkYiYA4SGwTwKBgQDh5KMO128gAmNtcQbA7cTsATXaEMo4o2b4 WB6JhPKuIc5vs5LfMgf6VxBxj+qIT4u0orSFjqfeMJnyNg57WKqapX4E3dXWFh5Y aQrsUmkiZpqFLBQW9Wylm2weqEXycuzNX9bxtoV60ibPAsOqMFY4nAC3cj2y1tOT oT7Oixma2wKBgQDOw3j8HslDy23lxYkXnoSqaGvzl2xa6qcEgpRsVj+D/VFHo1KI 8JVpKKcFMuIx+dADAgm1Y51F6GtCGGWYV44fpm0G4owzvnCvqhbLSbLgmGqqlmci lKtmROfvJ18PuRfYK0bTLji7X6cHZgbsDJJM/MnOJ7MsC475hl/Ha4GElwKBgGml 4Ckh0uQ6mbvmv8zdp1rlmgUaEyn4KkF+HRIeLs4IG5+ccdWXdam8rIEgWQVVhrZ9 3kYUmShOvMFOTOmdZ3Uab1zhT5BoGdspjaVHScqACEa+fcrbD+xIS4HvG3+wBlZr O4Ei5zyxKttopJBlOP4S4Dbr5DVPSfbi1BgPcHM/AoGAJ5kFdhl0kvRohpVn76ob 79tcsrFA0yni5MW/BPj0T2FQTEKFByzA01Qsrj3g6rsXKTYFQgsFkMaRmH9okeuM XGSvlB7u+TCOl2gzGLA7XCa2bo2hEway/qNrSuD8pXAXgVgUHfBrz6ccE1T6eCG1 24oOASeMXZZAF6eBd45l8wQ= -----END PRIVATE KEY-----cert_path_algo_strength_01_root_ca.TA.pem.crt000066400000000000000000000022141322470703100345500ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----cert_path_algo_strength_01_root_ca.pem000066400000000000000000000033021322470703100334550ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----cert_path_algo_strength_01_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100344320ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQQFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjUzMVoXDTIwMDcyNzEzMjUz MVowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmWKRQ9e3y3NyyNHJoZGHZS7k0tzsgIAl jblMuxOru96CGNYxX+fABGJXrEtiZdo+ZkA3rFQ/iscDfuByfsx9h2ai3xFi+Sj5 Kdu4AX9GCk8ry7vcA7lBo+uMnbGeOkDYzFt2Y+b5YEi64VbAjzamoWNiwgvetZOZ Ejy3jauT26qF5Ei43Qs3AQvoK5hlLqUSB8LXMgPFuZLp6qMaAjCJ4lukrv+aegJ0 DCiwzez0podmTDe9FIpHoieqErT0P+vaFdziO2aqwINhzHW/vdFVn4G2UnnZgSVP 0gt3NbQxTvGjmS8Q+kTcJoXQyKwPO8PlcsjwxohwuKGRmNwb06c58wIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQUDGEF pkgt32d8kbj8Nd9GGj8sdHUwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQEEBQADggEBAHhBDj70/EwW3ZkhlAjfMd+b8Efzr0H7 nJh9U2qnyUyunBaMy7sndk8MAh/sNoyKmJim/ZcQ9s2oV6uT0aOybywLaDE558TL NZ06yHQs19VaJNCKJOrcAPPzAAXxBc2tgeMrNEqoZVoYrLUMHoklOGyqewwMH2jG f8gOCN0oL9IpVdyNMidEPQKr2k9U6JNgbQ2EF3jqA+5SgbrPTdrXgcY4BUtRTcTU brbGqTMPZPrH+QCj2ucoATw3+omoHWqN4EdJ+52xVPcQJRqWesZZ7x5mDSZc3h9h A2fwrXHA8lBwj7tlo6A+Xs8AV8eGs8CG3JILF2X+As98oEyBMbkhtT4= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01/cert_path_algo_strength_01_sub_ca.pem000066400000000000000000000033021322470703100333420ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCZYpFD17fLc3LI 0cmhkYdlLuTS3OyAgCWNuUy7E6u73oIY1jFf58AEYlesS2Jl2j5mQDesVD+KxwN+ 4HJ+zH2HZqLfEWL5KPkp27gBf0YKTyvLu9wDuUGj64ydsZ46QNjMW3Zj5vlgSLrh VsCPNqahY2LCC961k5kSPLeNq5PbqoXkSLjdCzcBC+grmGUupRIHwtcyA8W5kunq oxoCMIniW6Su/5p6AnQMKLDN7PSmh2ZMN70UikeiJ6oStPQ/69oV3OI7ZqrAg2HM db+90VWfgbZSedmBJU/SC3c1tDFO8aOZLxD6RNwmhdDIrA87w+VyyPDGiHC4oZGY 3BvTpznzAgMBAAECggEAOPEMH4TyMN+zgZTMByR5AJmnjhZA4DVye4oKT7ruOqjQ YDsICmQE9zuw83/q0Af0uU3mvR1rl2/pPs1BBAyTH1R9a1VPilLpKN5uEXQ3wrUA e7pKY8F++kUEJziclmCjez4LFexVsKZfZi8n/iKaOnikXYg9jef03/3VYI0NL3Mr 7KWdZHYXlv827E5sYHuQOSklL4aazaI0+14QXRChc7pgI+VbY6/7XLnvTOw/+tZt kvdNIlIEJ8FuColqNPqlSBbN2Xfl99gQvUelCA2yVl820iXHF1w2mXdbaqKX4IEL ypdSSG+CM+hrO8kPmKRAD9cFEb3dpDq8rw0cdXD6zQKBgQDIvMbXSPcvr8C57d2T 0gXMbhQosFZHlAjZYAAOX0WWhO20zvVwIJpQlpmqGVwjtPSFqsepA42/pTAk4ew+ tfF9PWtimLLQpk0YxDLLUv70aMA/YBGIA6Lsn/Srq6w8/+790UiuLKyK7tIC1NZb 7XMBX2X50/tBG/lj3upDbppeXQKBgQDDnJJdIR44A20YM8BFizGuUfmTOH4iVSb1 wwJWXnczcQCnnx98VSGAnuGsLdVlS5jxxxUSHlO37KltNfd3ne38XsN/r2/jw7Vp 57/IGy6dABZJkOsQknNYrp1SnOGp9Sws9Uv8A6T9Y1eIpq12+YeX/nUBg6dFkh7H 04a+su5UjwKBgGQbWKJGXhdm85sFl8m/JGslvmHoRq7dkWguavi/5GlDE3Rm/ZmU eMCVyj489WlNNeBvIbEU95zKWW8bSACiJbNKbQI3mn1ZYftm5NnnIwRqNO2mEDgf cCHHR3JRY8zr6ZikxTUvTEDhBtSopdokWYUmuSlU4OlAdSesJHHKd6t1AoGAbYW+ 1XHzj30rmf9vygBTgrzXNjzNMr/mnnffWShvKVg9+5w2btDjfzZ2OIc5EgwvyD+l Zo2gZjyV6FXtBwZf94u/fkBmL2qmqnNdh9bgVHt1/x6q3o6BEshBwb2hBB4H6+wz 7RjFSjJTEmnwecrgxpNsQ7rI70UPAudGbIOWubUCgYADvzuijPhbwSvlhi4qBwWB QiVHRbhEkiljEpG3BfWAjt017C7iL7wD/qU1q4Ryq1L596Rt9X7RKrZvF8OUdWXZ t5Fk/0NfITBHRHPG8oZBOBNNbL0ap53m01gL1C8kWcKt2g4bKiQxCEj5Y4sEsb4u U5O7lxpwyepVKmEaP3KWIg== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_01/description.txt000066400000000000000000000004051322470703100272170ustar00rootroot00000000000000Test Case: CERT_PATH_ALGO_STRENGTH_01 Purpose: Checks the behaviour of the application when an insecure hash algorithm has been used in the production of the intermediate certificate's signature. This path is not valid, because the hash algorithm is insecure. botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02/000077500000000000000000000000001322470703100241355ustar00rootroot00000000000000cert_path_algo_strength_02_ee.TC.pem.crt000066400000000000000000000022521322470703100335210ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQQFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTMwWhcNMTgwNzI3MTMy NTMwWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI49+vItPtsSX6rm2HzC1LoNgf2ScYt6YaHu yApzK9glqqGrbv+ISZ1n0l+Xi/H7bSTukHBbZS/gnXwKhRH8w+8lDM0X66YmsQ8B iVhHBE5WSvtBzmDELhiF12v++icoM8Xoe6UANdH/F3NyY7Xm3eaKkxdpI46eBRZt JuMsLD4Rh7w97tPV7lKfDfX73Z2TgjlbGbxwFNps8vQZlcfQCJmsNWNlAtIRRGQf zq6mDY6CvbXjhrZcpMhDk8QvN/OFIyGtbNmi8GKtMjMO8kCOaetZTa7bs38g0LwJ myrWGem1g6uLz2jYqXUAZnuwx/q2fXTAAQzQU8IDviaEpdDzPFECAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFNyleISc 4onS39HiiwfwVUasmGe/MA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQQFAAOCAQEAOgAzfkQD NW+qZDlJyOAVT26K6eLy1gQvT2tcLCAlQG4kg30tnA6onTcffdYZJ2QTYOLKGnXc dpljjZQsah99dngXyHTkzesOJKg3S+FLU5PppdgD/D+GxLh1+n17JKM8ZmNvQB/y CmpQZ+8dcuivoCp8iB1Hi0cbkvzOe8RpzIUsjLZ6rI+knzfoL6TT3vg3hk0nkpwn wZgzdtYOOOSTax5J3UBTtv6nkzihCyHbC6aH5GRMzHwA5+0oCf7nd+d8ZK2kb4Lz JofykPfTzX611NTk+r5Yc/4zThPg++gofHFRMmMewM8a0A+ORy4Evi4sU88Ea3ZR hn253wqotWl80Q== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02/cert_path_algo_strength_02_ee.pem000066400000000000000000000033021322470703100325010ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCOPfryLT7bEl+q 5th8wtS6DYH9knGLemGh7sgKcyvYJaqhq27/iEmdZ9Jfl4vx+20k7pBwW2Uv4J18 CoUR/MPvJQzNF+umJrEPAYlYRwROVkr7Qc5gxC4Yhddr/vonKDPF6HulADXR/xdz cmO15t3mipMXaSOOngUWbSbjLCw+EYe8Pe7T1e5Snw31+92dk4I5Wxm8cBTabPL0 GZXH0AiZrDVjZQLSEURkH86upg2Ogr2144a2XKTIQ5PELzfzhSMhrWzZovBirTIz DvJAjmnrWU2u27N/INC8CZsq1hnptYOri89o2Kl1AGZ7sMf6tn10wAEM0FPCA74m hKXQ8zxRAgMBAAECggEAHlh3uIHRlpARa9bq2ZcBJh4qnMvIwH5f5NmZwKz4bhj/ EZWOzSIovlV/aphcqUe/7bCdjPLan/+16VgfMoqvzE2lsP2I7v3zKSXlRLmF4CaF wZu06S0BPocTQb14ZbEsdmzWMAne8YmP2bfOMOjrbzsiDU0HYm4w3Kt1r+JlH+px DfTuak3D9XCpUwimtiL7V1SDk8v7cNkgEBCDfcGAo7yAbGoNW2j8LMHGDFBGFLdV P27thRNadLZfYD8Z2i6uq/iS5XI1xz2C1S7klzgDuJFGPw3W8ZLecwqU9ZHgcQ7u 0NTbQy3a8vAc4raVAY/4chlCDR0/I3J2P7zBV3+OaQKBgQDDo5nCXWfbH1tfgQNx aRp9SybqEnucMWzt1dgswudHA6GM/1m7EyHnkKYwBMwoRrerianspB9vl8seHsRS jykbJNJYx3O+bp5UXcq+iB/r2kk5IxoSQIgb4afXV+UnEWMLE6CKisS/oeYW4RSZ 8yiiJvBhfORETX2VPJbS3+BRnQKBgQC6INzatrZ3sxfCo9gel9iiTr7ZTKyOB+rd UXCAlpeUxKpMiBG6wp5B3pS7Lfg1qT/TJSnPdn9Qq9riAtzT4e/4Am+QprsPd7Ee U3/872ViZhzIFj3mNdthrpMqQYk7XyrzkS2FjkWaqAcPska221hkPhQ+/4GjeAwA bUsaNVghRQKBgBa2D0t4/G17nmff2j54LRMOfl3990uSkUqq4IWRureLvF1Z51jI R89SA3jflbO3Qesv+AH4q42Q2YuNlszewa7c/24++TjKLqcsnDSyKMKAfK+dW5Fy 3FogQBPHqFp4sj6+8Iwkv+JfMQ7G4lVc3QK18oHetcEYHdQNTJT+WFQhAoGAQOmF HKHsMQK8np0VmlXKr5BW7uHWrBIGzvjAC5h5dODBo78wr7mAB+jgZgc6MTy9jZ3A XyIsdK36wCfPa/W4Av6WehQr2NEdbD4ivMugyBhkoUNggxD1WbPQj0Qb4CDokdln ztQ3YiCHlenOz6bfxNYBqZbiV2hehyeWsaU4/yECgYBY0d9yd7ebJOveOYWA2Lu2 Xcw/AIzsazOaGCcM5BkIWpcZSqcXvZ7FQCqBoEL+HIAnyiGOPonTIC2nnRtcJLpg YyNq2X0t5fAc4F7ff8pxjKm/u2cV7h7L3PbmmHBUaKYRgWX3fzj9Z5QBCGF8dI+L 4KslPXPdFi7Ydx6ddeOeUw== -----END PRIVATE KEY-----cert_path_algo_strength_02_root_ca.TA.pem.crt000066400000000000000000000022141322470703100345520ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----cert_path_algo_strength_02_root_ca.pem000066400000000000000000000033021322470703100334570ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----cert_path_algo_strength_02_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100344340ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02/cert_path_algo_strength_02_sub_ca.pem000066400000000000000000000033021322470703100333440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_02/description.txt000066400000000000000000000003771322470703100272300ustar00rootroot00000000000000Test Case: CERT_PATH_ALGO_STRENGTH_02 Purpose: Checks the behaviour of the application when an insecure hash algorithm has been used in the production of the target certificate's signature. This path is not valid, because the hash algorithm is insecure. botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03/000077500000000000000000000000001322470703100241365ustar00rootroot00000000000000cert_path_algo_strength_03_ee.TC.pem.crt000066400000000000000000000022521322470703100335230ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTI5WhcNMTgwNzI3MTMy NTI5WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAMh+3tSIlj1ZbmP72KE+PT1yXxlu4lqOCsaN blYdRJjzJ5iPeu1Ax9FwJ28lO1seoPkDqfZH6CSbKNS6GnLYcyfc6Gj+e58OeJFV nJY2lC9fFbSwIZ9LHx6AN+lm5UCsQR3Uz0MOBRGfOeKlYxlaILQ33k9U7wLybag4 B5THktRQheudUwMWKjcR0X9Ylr1gndxms2ZMr1OplqKY06TZT22TEJwGOMuQjeKO B3WrEMEXLQjiHdvS4cGWQbnztIjL5gnIuzuKcq0yGGwZ+zjc2R9fnp0opTdSh12q EYNJHY/vnyf1HGD5ykjM9AVnwzKx0ZJZaNK6u/vuUNuJWAznWaECAwEAAaN5MHcw HwYDVR0jBBgwFoAULa5+XRvIsP9Shzl2HSl+gqv/Ys8wHQYDVR0OBBYEFKXmlXPO m1QPQCX/UG64UewAqQ44MA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAM58DmpZD s2Sm9iDSU84sxNsHX01u8sKU/5fxslFwMufhuA2SjwoMIhGAxh3GTdDKCx/xT0Iu l2svdI7ZvdMTrpgJYgLqQaugevDYPr/Ou5CWvtjyufFxoLiWV99KAiGkMujnjm9j Lc/Oi3x5waqy1J83Dgmm0XO1LAdvv+PLbj2gLNomwwvKp7ZfKkhBPpZ6kelND3rB EAWxpMHwHpGjiQiH0RWUZfcuI2DSeZRXnNK+yAOOVgt79Lpk8ctDYelXdWk/wJ9m +n5gmN1HnYzsZgUMWe3pzesKpnkX9q4/o5cVSZMZv3IxYwIOrq2JY04wRsb5S2Ev 412s4zjbtcihXg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03/cert_path_algo_strength_03_ee.pem000066400000000000000000000032761322470703100325150ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDIft7UiJY9WW5j +9ihPj09cl8ZbuJajgrGjW5WHUSY8yeYj3rtQMfRcCdvJTtbHqD5A6n2R+gkmyjU uhpy2HMn3Oho/nufDniRVZyWNpQvXxW0sCGfSx8egDfpZuVArEEd1M9DDgURnzni pWMZWiC0N95PVO8C8m2oOAeUx5LUUIXrnVMDFio3EdF/WJa9YJ3cZrNmTK9TqZai mNOk2U9tkxCcBjjLkI3ijgd1qxDBFy0I4h3b0uHBlkG587SIy+YJyLs7inKtMhhs Gfs43NkfX56dKKU3UoddqhGDSR2P758n9Rxg+cpIzPQFZ8MysdGSWWjSurv77lDb iVgM51mhAgMBAAECgf9Wmo5TuF+dAv/rTcIDEHbq15J6Wb8i/VtmiP15zhkBDNr3 nOURAGp10PrB95Jp0/AD8n4VaaevNvJZCKNeLURBQchCmtxA8U09nTd6c0IZaThf enGHGwHwpPkpfsi9CtzycTZ3ArBRIsQjXs6u35wvJ9VfS9x5f3kw2bld5H7ER/WC YQ9UGMF6G+D8XHPl8eqKAj4+90fb8BLBL8znLvbY16K3qEZrEtg8Ov0GUajzDBab Q5R/RAsWKYWUP1fHDYe3mjqxWWFSxctLlg7abKn9x1YXo59BBmMkntc27l7MQs8Q pYKS3gegTw6ScvAGxyLq54UtXa+a9wNssS29V+kCgYEA/So6JxyLjv7pbLUuX25q vGzDvvax04HzHB46ngtw2HIOuCDjTG2BFHTZHEUOysuJN49vbXHQgIQlDVWT6aHk NXPJ8339ahstssOB5JtkGdIbPLk1Iyo74DOSCfQYVj7cSSJHAKQqMp5phpDQSDwR wXol2E4gk/rUltGjZgx85D0CgYEAyr2mnRjbfc33FjfCwMKGOsnzgFiiszfoXm/x GfF/Vk0w+iujz+tjw6xipGcMO4TSPt4iu9Lt9NBl9sOPRbBAFJzLBz1qfBVlPOGo GeihvV40NBnQKn/Shibek53Ez+1N1IQIqSokWD4kATrEp55JjLwhTsn/f0+mQgSe lAOZDTUCgYBvnZRx9fXZn62OTfsZ+/Z3CITsxpr0I1DpzrINSAICi5bNu0I7SfQk 7rdh7VhuNHpU0ppP6GQCpUAottg1oziYEGqzPZLimwT00ZmNDq19bNKxXP5+eHpZ iKMUXFf2flRksgYX1Ej+dDUWLPaHQmSZpp7U1O0sEOR1cgvWTB8sCQKBgEaUNU+V Wrv2GuGKMetnDNGkgneY47MecG+H6thMQTcrEjTVQmbcnFN/TKvND+4cdBDcxhy6 9on2jriUJeltzTEf0HJJyCtAS4khSaMTYFMLW4MTxWs2KnT3TR74mo6EH0cvW9CA UjzCDUi8S7/Kk/JBgBrsqVyJvuhWsVn30q1NAoGBAKxb0zVEZTZS2D7H7fBkan2/ MwVc5172gZBC5Dkm+oerjrXcF5EgmXzzhymBQXL9Y4jpJC67YqNsHJo1c9HdKRi8 b3n0fVd02DZay1U6pfag2LUyMy3+HQGgL6VdTQYKZ7HBIsk3w/lnt1Nx6XYgrpYX y5XH9DUu6+QhZlv4XdyQ -----END PRIVATE KEY-----cert_path_algo_strength_03_root_ca.TA.pem.crt000066400000000000000000000022141322470703100345540ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----cert_path_algo_strength_03_root_ca.pem000066400000000000000000000033021322470703100334610ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----cert_path_algo_strength_03_sub_ca.ca.pem.crt000066400000000000000000000022141322470703100344410ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjUyNloXDTIwMDcyNzEzMjUy NlowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIDANBgkq hkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAiAiItGRU0P++AlTFnR5qyB8CLp+2XkFO 7zzzthc7Nnxef3oFXb+2zWuBkEI8FhvVm+bNwzwxHnWeqApwvhHqOVyWoJseN1og jJ1UIX94LE4scTdL0FxgJs632Enl4MsnpbhilOi9qLZwyQmAItrR5uopmYZ7PRee NhNnxnj60CYrMdWzOOEJf8DReElLWNPa6gk1cXiU3TPNAzVxH2KX/3MgHylznKni X+r9xadOxWC+ffaXmrjdz87NxKFI0t+OnTqrwBuTggqo1TGGmpEuksRTrCXejVeS RbfdsFYHMPDrliGasOWb/2tUWOaIZFHPDwIxZ4xSX4IsK20owdCcUwIBA6NmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFC2ufl0b yLD/Uoc5dh0pfoKr/2LPMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEAMA0GCSqGSIb3DQEBCwUAA4IBAQBB0FiTUy0BJcxDua6grGz4/PFd62FB1Eda 7ozlR31JM7oNmJHjNQjNu9BiO1LbkYveDGoj5L1EobA4ZqWQ5Tw9quC02WPRxeUQ EbSMIjvcIlSdGASESFN1wsCrYUp19hOpvRdbaqW/Pl2VLGQD+YFW4xP+6br5hAkd nI89hszoiQXbxpKoWGWnDd21Ufsu/MUmDj8XpOZJAcT8k6wnev0ad/1HaA1LnzoB 1J32I+Ni5OqVlkFeXTl8MwfOM5wgUcjQBJiqwc3/0rSDx8fZbhoo1r1CfM9n4hMy 3nzXbPOgtKRneIWCnQ3HEpDj9D2KaovdDYfHCLcNwjylB7E+yS4R -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03/cert_path_algo_strength_03_sub_ca.pem000066400000000000000000000015121322470703100333470ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIICOAIBADANBgkqhkiG9w0BAQEFAASCAiIwggIeAgEAAoIBAQCICIi0ZFTQ/74C VMWdHmrIHwIun7ZeQU7vPPO2Fzs2fF5/egVdv7bNa4GQQjwWG9Wb5s3DPDEedZ6o CnC+Eeo5XJagmx43WiCMnVQhf3gsTixxN0vQXGAmzrfYSeXgyyeluGKU6L2otnDJ CYAi2tHm6imZhns9F542E2fGePrQJisx1bM44Ql/wNF4SUtY09rqCTVxeJTdM80D NXEfYpf/cyAfKXOcqeJf6v3Fp07FYL599peauN3Pzs3EoUjS346dOqvAG5OCCqjV MYaakS6SxFOsJd6NV5JFt92wVgcw8OuWIZqw5Zv/a1RY5ohkUc8PAjFnjFJfgiwr bSjB0JxTAgEAAoIBAFqwWyLtjeCqfqw4g74URzAUrB8VJD7WNJ999866J3moPv+m rj5/zzOdAQrW0rln471EiSzSy2mjvxqxoH62nCY9ucBnaXo8FbMTjWuqUB2JcvYk 3TWS6sSJz+WGmUCHb8PQQbibKRskSzCxABc8i+9GxmZZp34Pvs63moRQpzVtxBtn MYKfP+B5GhgUXNO9iIzvPMo79vypHWfNuzRNiXziOGFpKLKNSoF2DzanJoIRFQGF o3UZn3DTWiHvfEunMXVNdI0QgfatmH3N22tPMhb0uwVT10RVJNQgyC5tfRMGKdIv 9+J837XjGjxYj+47jMgbudGSKNqILvX8gsHDlisCAQACAQACAQACAQACAQA= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_algo_strength_03/description.txt000066400000000000000000000006321322470703100272230ustar00rootroot00000000000000Test Case: CERT_PATH_ALGO_STRENGTH_03 Purpose: Checks the behaviour of the application when the last intermediate certificate contains an RSA public key with exponent e=3 and the target certificate features a malformed signature the acceptance of which indicates an implementation flaw that allows the Bleichenbacher's Low Exponent Attack. This path is invalid because the certificate's signature is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/000077500000000000000000000000001322470703100225645ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/cert_path_common_01_ee.TC.pem.crt000066400000000000000000000022521322470703100306560ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDQwWhcNMTgwNzI3MTMy NDQwWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJnf+SomZg2kmj9WC0/yQSxgvyuf833lwr/l /lzmQ5B+I7+k0SPr8iz26XwWHmjNPMwjb34fO6TQSE7qNdmjr+fplodoArAqzm1X m1qLGUDUKBNvq+YJDhONWQmFUSDYVAK07mILO+ocd7WweR1XBc0BL68WXBrQOQuk O/ebf+1FR/ojokEK6Z+WyB6LhvhZR/0Aub8TeVDaIh42w0azIXeS3GLrj4SUxmn6 3b5UK5sPXpuu14IkQd3TzWwbEDpJaycuTOeUFFh5t1JpqkNX7+l64fwKvw0Cs7Zz sPMPz147BYbnRaKYL77wTr+/bFCM5i4IjugosoSbtHIgnmjzLl0CAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFLRG1KI9 qCALStFaBW4O2PWgqVyxMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAEDMSJg+Q 09E/y/0jJTmc3ce7v1KY6dBMi/pfm8KbY62faXDm0ad7PQ7THWa840YrVnz+lCEC vzLL1locq2UDXuYS4dbgR1WcD16XyPBHJCQ4ctSEsMP3B0UjAhyEWGZxr+2ftBtZ y+o3Ch+i+nJwvJUbrznqdEI4PKZaftjK3CeYurS15VQxJOIisgP2tY101tsPcnlT Dzh9/1nmvXD0B34sRAeckxsXFNNz0vcuhxA/HLjRXCWy7+IFdKhqWoFscPHF8Ehe 2WjdionD8pTNYc+04DOVP47QoKkBkhosVeXYZfNlDh6TE5LVBve5oGD75ponkVfx 2AqDWMoYjl7GXg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/cert_path_common_01_ee.pem000066400000000000000000000033021322470703100275570ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCZ3/kqJmYNpJo/ VgtP8kEsYL8rn/N95cK/5f5c5kOQfiO/pNEj6/Is9ul8Fh5ozTzMI29+Hzuk0EhO 6jXZo6/n6ZaHaAKwKs5tV5taixlA1CgTb6vmCQ4TjVkJhVEg2FQCtO5iCzvqHHe1 sHkdVwXNAS+vFlwa0DkLpDv3m3/tRUf6I6JBCumflsgei4b4WUf9ALm/E3lQ2iIe NsNGsyF3ktxi64+ElMZp+t2+VCubD16brteCJEHd081sGxA6SWsnLkznlBRYebdS aapDV+/peuH8Cr8NArO2c7DzD89eOwWG50WimC++8E6/v2xQjOYuCI7oKLKEm7Ry IJ5o8y5dAgMBAAECggEABRVOEONl2auHYPJBu2lgV8v2ZMWK8KzHazl41q7QqpRQ MAOM2SfxPyUE/5FnfcTR7lh5VWxItyAeU2UPVFpA9GNWErEP7avsV9ZeDnar5eVc UZAN2LKR4Xl46ISb8n7S/6fkfB6s4wX/umPTDHIUgfo5DgqqDkS0rbrGNF7Rsg/b vGZbK59n05YOsm+NDa6dbvlSNfRIqq2OGVcEdEwaJyqjTdKeC1UNl4y0jj+u5lT0 kKHOYBSDSMl7DseBH4g+S6cpMMC909g9/XPqM3maug/+xKAH/1hQdoI8FbaYVe9G 9Q/7SMIE+FrjaF1XH/e9UcTA/+Vx4f0Ua3IXYxd4YQKBgQDJwQMxo/WliYhEs5Xl nk+KOi7xJ55PRizIGq5UyKuKEh/oktwOPmKWtJUGgbG4x8aUVrlQflYWft4FTbS8 tSCVNGFsWiCv55pw5tv0eQNWjn6YX4gNCmVHX4b1fFso/zWPFqk+ITS76+uspupj UJFtzJoZ4Ur9nZeZSzYldpbnOQKBgQDDP2H/kvbS7Ualafv1KOMuBiE45EIgli4H QT4yvdDot4kgdG4d1hak76hIKoPOOg5jroIAWPRwCSRjdjBrC+pN+qsyJtKCwrB4 PL1nWRMvkNHbkgKuTNX3iNwbmlXPz/2r2E4R0tLAweOrw174DfODjcO9MpBmkrZA sRVqQ0G8RQKBgDiPkNqo0aQf44EHK73c3QWufByFc99bmBBdUoRYYabqn+Fu0px3 puIDLEhPschQ0X4itf83++CAnrOz7jh9Ou45ahqbRdCqyGRghEeMaYApoJoNJjIp uO0Cfe5yd4gNzDEaNEZDvun0IPUdMla3bp3un0EkJQbm2GpUaJCmJ3YZAoGAO2Ss ivJJ4yAKvYbf/lPRx85VjNjixMbqeYp/QTA8vI4YSKciWDEn8kR1DH7iWXmPpwMO yMxGj044o4jwcZ/ORqpaKYdlwiE3TVwswaN3EqEbNY/VAPCepg4b5smsEOtUX1IN bZ6UPc69UyK7YPndecdGI+edxZYbmtJDkW+kL4ECgYEAmy1Uy+SOcEoGE+0TdR31 4T5EjKQZaky9XiNtD4cCu90wJREsJN0hrWVZEiLXzbUrbvSszIVGp+RRcKCOeIm6 lJGOIRZtPe2VEfDs2oo2JDc6V+ED3gEk7zjPGcOJDjoWbjM4Fh1TgUhqtqx3Usxp 5SH5UAf8N+n1d+MD1vCNiaw= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/cert_path_common_01_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/cert_path_common_01_root_ca.pem000066400000000000000000000033021322470703100306140ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/cert_path_common_01_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100315710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/cert_path_common_01_sub_ca.pem000066400000000000000000000033021322470703100304220ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_01/description.txt000066400000000000000000000002541322470703100256510ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_01 Purpose: Positive test checking whether the application can verify certificates. This path conforms to RFC 5280 specification and is valid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/000077500000000000000000000000001322470703100225655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/cert_path_common_02_ee.TC.pem.crt000066400000000000000000000023261322470703100306620ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWTCCAkGgAwIBAgIBATANBgkqhkiG9w0BAQsFADApMRowGAYDVQQDDBFUZXN0 IFN1YiBDQSBObyBUQTELMAkGA1UEBhMCREUwHhcNMTcwNjI3MTMyNDQyWhcNMTgw NzI3MTMyNDQyWjAlMRYwFAYDVQQDDA1UZXN0IEVFIE5vIFRBMQswCQYDVQQGEwJE RTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZ0Ps0lpySvuiuCm2jm 6idbJbRbBCRhabvapP2zm8rkh6AmOvJjvTaKsIA3U0HaYMcMyXYBa+KE/efTIIpA mlxNkMjYrT9r2SZY+ilatGaUV9g6bxugcqgrMCNbUCP6eXi+or5pU+u9qOv1TPfc tUiym1HFdxy4pbf/tMjAzJFEDyQpu75bkELofDbkmfV8R4y7n+HvqMgZL8TmfYud yW2W1V1gsbFaTIuCryT5fU4ao8mCeVSXw0sVQ41RTsCesmoqT8KBqf4B32CtvbBd eQmD+Ol1aYB77k9tbBFFuG8V8LY72u36ri7BMRh35s/K9e31q+5JjwEcj3v0UuPE aMECAwEAAaOBjzCBjDAfBgNVHSMEGDAWgBQjfyVSr5d3qYgSAOMAwebaBK5nZDAd BgNVHQ4EFgQUpfin/bltIvaoUCw/vqMNgaHsEDswDgYDVR0PAQH/BAQDAgeAMBMG A1UdIAEB/wQJMAcwBQYDKgMEMA8GA1UdEwEB/wQFMAMBAQAwFAYDVR0RBA0wC4IJ ZHVtbXlob3N0MA0GCSqGSIb3DQEBCwUAA4IBAQCb+S7DkPuhQ2VC1BnP7LR+JuFf osSqQJBwnM/iP6HEgTcRf6Twkz7Xb7samVd9eA7TVUKvLBa7wIW8jgYIub3nAwUZ Y4Hum0vRy2pBvNzqfW3dhD7ljbE98YQsAOnGCYwPO6I/5VYnnHH+7qAYvlyvG4nc 3YH9fKcrUjgSaoiQ+k/5jWSRoNdQJsQm8OFCGIUsSb0f2wThO+bcdOmnMATL8Vmh 2iGVmtZV7ijfxXpDy0/KWrkO6jXvVvdoynaY5nc0Sko8zEbyukO4WPKKRzri666l fK+XzunmiQ7Yr2TkNW160xviQkKbsRH8z6UZwkZhYELd7mc63NljT+bsjuH9 -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/cert_path_common_02_ee.pem000066400000000000000000000033021322470703100275610ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDGdD7NJackr7or gpto5uonWyW0WwQkYWm72qT9s5vK5IegJjryY702irCAN1NB2mDHDMl2AWvihP3n 0yCKQJpcTZDI2K0/a9kmWPopWrRmlFfYOm8boHKoKzAjW1Aj+nl4vqK+aVPrvajr 9Uz33LVIsptRxXccuKW3/7TIwMyRRA8kKbu+W5BC6Hw25Jn1fEeMu5/h76jIGS/E 5n2LncltltVdYLGxWkyLgq8k+X1OGqPJgnlUl8NLFUONUU7AnrJqKk/Cgan+Ad9g rb2wXXkJg/jpdWmAe+5PbWwRRbhvFfC2O9rt+q4uwTEYd+bPyvXt9avuSY8BHI97 9FLjxGjBAgMBAAECggEAT6nyW9+1jOCN11GCmUW40TuhkxjGPORt0V8fxEgJThUW 7I7sMske93oNCCstXM4Q81aKuLgxWqkQU7NI6LauQEdSy41PXpoofWBSa69ho5wA 92fdmjV6UU+k70yEiyzM/k9ofQ9DBOsJmE7MKuOKUjiAaP7fpcPpokcfh0b914HI rFak9dlJx0bQYVAfnRw+OAUZUErADAKr7BxlrI4ZepzE265L4Ms4qQARbjbgec6M ldHjSyJRqIFKIOWUIx2yaFDz6uJ3PSALSewyZQ6QNT04WhSHecAeONrctzYkE7fD EtHAVGxTrUC4/vB6WT5gtttqIvuv0k+eZbc3z9UBEQKBgQD6WVlcjY5PX6nH0yyz Xj26OWxrOlNCzm//M5ujTC4CyQAgQtIPLCmR8+wcp71SRnoZafG0H+iAqsK+j0ck osSY6llXQfHlCDOH7bGYUUTBO+wPvEsp8GVfcla3TzTxIREe4JkZOGOrNXoecnb+ 9DUdCa+faCzVzi4sZp5JRuac/wKBgQDK7wT72l6i7jcyHHvBQEpkLkLGrqfMtNtI 8g2bxCsEaFolyG/PzBQvDJXPHB4ruUiWyUvxVcr3UhinTTaG+zso+KQg6Ak6oUVn lVIMDxlx+enUUfplacqUYZzcNNK9yhHU9lLQ6EMNd7x7tNGtzlgiZ/1UglGh000y pkWE5I46PwKBgQDySPqlChKKWujzjTqbtT9ENULqW54s76GQeJ/N4HI/G8xVbJXj PThWGp2N9gDR2YddhRz42FCqBZlH115g5G4kF9mzCw1SPSeyC6Zu5WgHIzkI2ZBc 3F0fjIbEDZINM5VgLrm8oMhE8BJp2Rm1ER8+JRukyKtrmIkzS3UxMb8KfQKBgQCo LDJeINaCgZV+UrqAKS49HVU7X6wxacO8DNQYPRZFHdFvNE7szrv/TZesvimGpJKy Wvkzc5yzHvbNVqCUdgjN6Ffj6UcUrmdc8xK+aZj1ql0MFi/C8UvvcYFTv/bRT289 pDB3bbN7qrmpbuzA85p4UONQsHrD998m1UIRYnM3cwKBgEkNHkuG6Cfr8kB6JdRa CmIfcIKcvs2vtJn7EXZtlSMPQ+BZn/o15NFNgUop0nT2HTnZyxLEzm5g9ezPLH7p YYQrfGMmCbHQ3x+M0RoHMcmHvEnSJzTiTIOyL8CetQGedqqN9+aJxB+3JRUlFAcY fuX95LzezT31iwlz2FhPUJWC -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/cert_path_common_02_root_ca.ca.pem.crt000066400000000000000000000022721322470703100317740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDRDCCAiygAwIBAgIBATANBgkqhkiG9w0BAQsFADAnMRgwFgYDVQQDDA9UZXN0 IFJvb3QgTm8gVEExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNTEzMjQ0MFoXDTIyMDcy NzEzMjQ0MFowJzEYMBYGA1UEAwwPVGVzdCBSb290IE5vIFRBMQswCQYDVQQGEwJE RTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALeLheGyl5cQ+FBHHL1H gkjkwGmBobJby18OwdUuOY+SRU3bj1ywhpLMhHZh+e/ZLZtPFrGL4vIrUsbYBTKk fZNyNG2SlGmIoKW6S4tqbb19vu8P9BR0PFOuBU1Lxq6TNSpKLqVXRUWAmwW4xdt3 0TSSXrhN3O7ErYk+dZncUTOn4bwodsiso8W2avPhkmWZcpHF3ar4mvPWnRCBriJJ 0bD7S+kaccRlXO2lkfRNUMxPxyD8B8jK9RtWfBeF2JXak6XLOuiis6gysIAOTaOP FaWI6EshiWZVvmmKDTVW7QUyhxVs/iBWfZUeq8uIJcBBMLsXASHvrtwAL6LvIGZU kokCAwEAAaN7MHkwHwYDVR0jBBgwFoAUKpX2VIK2562i+XDczYDvy3hTY9IwHQYD VR0OBBYEFCqV9lSCtuetovlw3M2A78t4U2PSMA4GA1UdDwEB/wQEAwIBBjATBgNV HSABAf8ECTAHMAUGAyoDBDASBgNVHRMBAf8ECDAGAQH/AgEBMA0GCSqGSIb3DQEB CwUAA4IBAQAqe1L/K6J0/qJRGCs6XGK78w4PfBbOr1b4xTRJ92LrlWirxKcYNUu/ TQLITdlhWK9QAnQoLd35QKOmFXMaZWSf9v+Lt7cwFyzfFwmhI00tfGV1bHtdjkM0 zcsLIKmlfZU4ay7Dr/AonY1yss0yXa/0eklsJyhv5zKN0ggmSvmoB10Yx7QsO8Cs hraVRFsA6x55Klu2L+/F5RKmiZS+Ue+cSwdyR4M777h8LITH463r1ceERH9k+ngw n4RpiR33kRN6nXuQumRrdH59WWjDQBE7CbNzRT4SErfS8B8USVOOgHrgxUdAsjiY 3Bjr91WeoNPLj2LOD3lnpoXUEWTGmv/a -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/cert_path_common_02_root_ca.pem000066400000000000000000000033021322470703100306160ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3i4XhspeXEPhQ Rxy9R4JI5MBpgaGyW8tfDsHVLjmPkkVN249csIaSzIR2Yfnv2S2bTxaxi+LyK1LG 2AUypH2TcjRtkpRpiKClukuLam29fb7vD/QUdDxTrgVNS8aukzUqSi6lV0VFgJsF uMXbd9E0kl64TdzuxK2JPnWZ3FEzp+G8KHbIrKPFtmrz4ZJlmXKRxd2q+Jrz1p0Q ga4iSdGw+0vpGnHEZVztpZH0TVDMT8cg/AfIyvUbVnwXhdiV2pOlyzroorOoMrCA Dk2jjxWliOhLIYlmVb5pig01Vu0FMocVbP4gVn2VHqvLiCXAQTC7FwEh767cAC+i 7yBmVJKJAgMBAAECggEACKdpbpTPFO5V5uMTddEzUWCHufHEv/YYBqlZdkWxrRVG cz9Q6RvhnHZMIJDKCgcBYXs/JKvlzWlBg+KXjCW5TgRqeGga20b33BiGi1I/Tlnp cLgd2AEK/x8LXPOfsId8UDwjKuSMfZRsur5Vhd2GXaYxFRuGuTNIw1nQjaqXoYnK Mciq51667BZ1UPOtTv2QNWbVyenCxxOXF9qKhcQOfp/HgKldgqnycjI62QcQozTB k/BniadZNrG3qVPIkqGfpOKFQVeMRVddEr/AMi/pdVQH3hCVT+NV6J6azAOe/9OV 1yXLQyB/A3D9z+eCVHBC7KJ42eoNpEJVMejmDbdjAQKBgQD6TqTONN+1MeE0qmyz VuzCdlec0j838ffiYp6qn/rGWMlb7HsJfdCGmZKX4/quqlZ7i9sv25gCtsLmSCWd byUg14dFO8ZM+bbjQWoZsZJY30H81963Ncdtgo8Q9idEtYSXPkVb18oMo4SoBtTN Fx3mlBHAdO0lX8IMpYtWljpv0QKBgQC7uCvyzlJK98x6xKbjzqTNBiKY70vN+jex nK9JE2kJdyhRDEq495bmOSznkT3IjTquHSp/RkUZ/Zou/ft/DVdPeGvheMQTbboR qvAt0dVUx8+FCtXYSAf0Hch/GGDzas4cBT+gN//A+uFTZNGmNe4ncqC3x3JAuA+f E2tp0vcdOQKBgBroO1UjX+z1eLUVoOvCa18YI6DrBPq5myEN4uqKmgWaY8Lq7+r8 SF8/wP9s9XSzQOq1BRHm9DdOeDMTDGAZI4+dO6BYpZ9+tIdHb+VlLks5bLmGZx2g vVhrUX/MRjpfnOo5OnF+B+1F4qvBWDzXwFIaFrJun1OGMLD1Vr4vFgcRAoGBAKbN HfAguSr4SXAFca4XHoU3oGJ4r8kVP4vJCFBMuRa6FM7/tx3okuN7hpU1j8q3A59X Nz3kuN5BZFHBSUo6Foz9Gg89ei0xYRb153kvbPpqmdFEMYR/bOHT3SZiCTQCgaaQ W1sIp29Y/gNWIJwqa7YNuxXSWYl8hBT78oQT+5SxAoGAfskQ2rwoTUBHHijZyKU8 /Ock9T+iAuxoNOioWHcGzhlCW/lCkmEMjxHWVDUKGDOTOMAlSezcRsdxzeYhrPmA UlLboTu4qL3DZSRYxf0EfHxzN1hXprQIrH5rN5kWioNeQjyqFfxkehNRI173FJ1Z ehk3glfGhwtj5u0RleNL2b4= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/cert_path_common_02_sub_ca.ca.pem.crt000066400000000000000000000022761322470703100316060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDRjCCAi6gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAnMRgwFgYDVQQDDA9UZXN0 IFJvb3QgTm8gVEExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MVoXDTIwMDcy NzEzMjQ0MVowKTEaMBgGA1UEAwwRVGVzdCBTdWIgQ0EgTm8gVEExCzAJBgNVBAYT AkRFMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5X0jkDJ0Ah8sNZzR dQTs+jXNhMDrUWR61UVAuayiA6ksRgyinpG52t9iUcPXzlQ1EZGJlLVW7zaPO1R1 87h0lUg1nrR2ytjwV/ZqHWJOYi7Gx7oVkYw28f7Vw6Qgjq/rrMOqQC6arjpGz/ZA ByjU4WCIQclInOhY812NTwhcpvzd5Qws/66iN5HAoYkTAR2HFdzxl0wt6ks+H4dr ILJJsFYb6rykd0jVY6/L0pVrkcxKgy4ZtxVOJM4FHj7bWsxOsOtT5RVUUh5KNv81 xDEQTwQf8dTmeq6FNv58a2FwFRGGOHBN++E2v9DxKxwAa5t1y2iM2FkenhYo4kxY +8180QIDAQABo3sweTAfBgNVHSMEGDAWgBQqlfZUgrbnraL5cNzNgO/LeFNj0jAd BgNVHQ4EFgQUI38lUq+Xd6mIEgDjAMHm2gSuZ2QwDgYDVR0PAQH/BAQDAgEGMBMG A1UdIAEB/wQJMAcwBQYDKgMEMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcN AQELBQADggEBAFqSctaHT2fmAv5RzCdliMp5VbGH0whbjw5Vk5z3NMtu/jWT2zoY n7hM84PEBi7Yx51Vle3QOVrArCi5tCSJ+SxsZg9re/hGMjnVo27ufX4BKTM3+S7K 6pMMyPoFPEN0JsXao/cbMIrfXEKq4bgNSiwThpXTTgmegL9KBjJyhsMYAMN9/K31 Fzh5gFMLzhNt6+uJ6GlHrOjrVgDHxXI7TlZ+wviJ56+70JuGugL0N/BZlQf2jfVa xur+Cfy6Uwpeb45RrjvVPYnt6zP2ApuM3N0c4GjzaQLXd2nQ81/GDn+0NoANmwZH xDqzfl8Rs4qOOJYrAQ/DDsUcifr62q1uODU= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/cert_path_common_02_sub_ca.pem000066400000000000000000000033061322470703100304300ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDlfSOQMnQCHyw1 nNF1BOz6Nc2EwOtRZHrVRUC5rKIDqSxGDKKekbna32JRw9fOVDURkYmUtVbvNo87 VHXzuHSVSDWetHbK2PBX9modYk5iLsbHuhWRjDbx/tXDpCCOr+usw6pALpquOkbP 9kAHKNThYIhByUic6FjzXY1PCFym/N3lDCz/rqI3kcChiRMBHYcV3PGXTC3qSz4f h2sgskmwVhvqvKR3SNVjr8vSlWuRzEqDLhm3FU4kzgUePttazE6w61PlFVRSHko2 /zXEMRBPBB/x1OZ6roU2/nxrYXAVEYY4cE374Ta/0PErHABrm3XLaIzYWR6eFiji TFj7zXzRAgMBAAECggEAAYRghA9FU49Dsk4JV3HzJBtPcsF4vMbChh7pVODmiEop xAPI3m39scv4wSwfhNprKGTTKUPCoZ21eDGwfu44/RSnYBd20pP5EMfM/0k7VexT vZXGFzp7UYG7BYpT+cWBdBiuCzMTrDOv7KeG2FVFhQDnnbG4NGtXzTIQ4VUfka4G j9fo+d+8aZupvnl1lQBPWeqCWbHmotHw+CemNEpiV3I3bCGPGQFXc5nj4QMYmgFj DCGKUHbbMeaGbUGLDCCZE0TTjWWY90G4RLJfgiDcRiJUmFJKEoHXmoQdoSIIa/1y gPsr7B/q0HvlVQiklehi95C+mw8IgpyhY+JOHeNJAQKBgQD4f6Rgplcag4TUKwJK 9fsznmTAZVHYfxP2xc+iplHGWYFTJbFDjXQdGGfUw0bdTDnv6kxWThcDD+0TqoXI L2jwi6I1HVVrGsoMVqTyBLfQyNSQjMotAsF9619lyCNLAs9FN79iOnNXatrQmacM F4VJrpuabPyiF3pgDoIAf4JfQQKBgQDsapeeY0L5sCpCgL8tZzpYD2ir+m8iB3Vy IfUF0VUPeouXqzRPS/QP7SD6g9+M4d30qMiu387H5s66VXU9UR5pAgnajJKkURIM SqDBA6aCJkDbFe6SlyU+oG5m/564x0tEvO5uBJbTuGamvX4K5li4eb1Vzc8TtMMT tpLzLsxJkQKBgQDCvz3ypMoEtGfH40DzwF0y8gJhqcX/1m+t6Q61mITj3sd0g0it +VCzcKoG21dRHWkWddeHl8F/G98fl3crEMS8J6Ji3+9Odfs8ujagmUP5czrrYfsc VVmQtoLYAIZwRe5sf6kUcVxteQetjY2V82T4/sdhueIvohi86QHHJCbnQQKBgQDL kynF4HF+shxhsZ1tylLqGzKlzHs/0S5nvifP/6aAMqTbUDg2BBBAWo+oSEAKfz/x +hj8xIm5ht0ChK30w9Is1+2GPL/VMF4bKXPtYGhT7/6u6N7Lac1PdTQ8Cucw86Oz qACjyd3aqBH0iH1tg1ZoW6QWq6chr+i/I9q7/tM4kQKBgQC5UFctCkvd7EeE8Wah iJrMu9PQ7oO0JYArZT6PrGTS6wu3zN3Ow9LZl9vaRuKb/54mro/wSkxiNkOBM+JO nWYqhEhidZLzjkSrW2FD/MgVau7xaiX0BDfzKI0Owa9WbHaxUnYASkSE58qeQJit YEmVB4NI25BIcE2B4bVuoDGsPA== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_02/description.txt000066400000000000000000000003541322470703100256530ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_02 Purpose: Checks the behaviour of the application when no certificate is on the application's set of trust anchors. This path is not valid, because the application cannot build a path to one trust anchor. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/000077500000000000000000000000001322470703100225665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/cert_path_common_03_ee.TC.pem.crt000066400000000000000000000022461322470703100306650ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNDCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUyWhcNMTgwNzI3MTMy NDUyWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANWWb/WM6qRf7s6hmQD7tjE6KEZFquKOEiyu fem4aXHJYQKErypN3KTVO5bXcsEKI+vtRms9aLc+XpS6BLPppH0ctKlmjNA75bJl V00wkt3ov9bBIDkEXRI/Sp1yAAQvl53eYVdO5HMuRJ7McHesVRoKDEwEucX/nIWX Q2m50kP08UIuOhMAHq2RxJ6ARsXsDLLBeVJg514FuLPm6HcadjeQnGYmM27F/U7u nagI8EQKagmNHDIL3P96lJEFrCUSU+wnKXGEMePx8Bl1isZsGSClktCOm/g9aQRN hk7e/D9/KYs8D53v2pjLNS7bQutbA0o+kmll+PM8sgt1+IdEvFkCAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFErNMu0b A/uDQAPWCtBFunse+Ay8MA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDALBgkqhkiG9w0BAQ0DggEBABmhaAVENfoV fMtu//eyvlIxGF0yTTZZCyKHe7qQZZy2fTj9D7mwR1FiZzZ5qpmkDcJpqySTZJ45 amUnb7onEKJADhC8/+ggjfH7WimMhHon7shvgQSbv2VDeiifymMTLQioiBMxFFIE fw+kWPVetCGpoKkq+xxGr8NybZBaKF5zxiHyfCDvcdaqvJt7LFu4HQvn4SDIO6/d kb+OQdzJBfzl9xduOtTpgEPRK1wust9qwKOeyrSPhe/Uuq8FG3w9VQfEZrskMWn9 2JK+JM1Wkol2EDRe0djdue7Go9tkauAtre1D2/a1VhoywRqWjxsRMFypG9L+XeZw BFwgDEyWw1g= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/cert_path_common_03_ee.pem000066400000000000000000000033021322470703100275630ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVlm/1jOqkX+7O oZkA+7YxOihGRarijhIsrn3puGlxyWEChK8qTdyk1TuW13LBCiPr7UZrPWi3Pl6U ugSz6aR9HLSpZozQO+WyZVdNMJLd6L/WwSA5BF0SP0qdcgAEL5ed3mFXTuRzLkSe zHB3rFUaCgxMBLnF/5yFl0NpudJD9PFCLjoTAB6tkcSegEbF7AyywXlSYOdeBbiz 5uh3GnY3kJxmJjNuxf1O7p2oCPBECmoJjRwyC9z/epSRBawlElPsJylxhDHj8fAZ dYrGbBkgpZLQjpv4PWkETYZO3vw/fymLPA+d79qYyzUu20LrWwNKPpJpZfjzPLIL dfiHRLxZAgMBAAECggEAFsKj9iL42yDU8iSCyTnJibfklE52vhM9KRFEHiyWYfd/ dLT+dI/dCByn77RQSHVj7A96HlHqL4LAMfGbsC9g5asyLk4dCdCkMs09Tx6yu96C WOh2HlVSdLAVa687BLcsnThWH6dqzUJcMh7fikUtQWvaMRyczlZlj8/VcXYJi8+j jipexAxsXrhoWi4GV4CCkw5jS1HdjmdWHRwQJ+0OksxcHoBrwSOsVol6CWdL8+0g 0NNHATK0F53wGhClLdb9P2ZhEOvNBidaMAsFN+KwE4NxM3hnt/OC3yRZA+0pi8+J fPRdP8/ypLzWVuwQSAg3SkmpcTxgLH+Z9Rljhcl6YQKBgQD8P52MamXSsLsOc2jK ihqALdz+UJTKFSzBIpMQ0txX2jUg9R3oa2kKEPFAHGA3LA5sMdBNWBW30s3MTjWI 7Q5xE8VFvI7PnOYj44cJpBmJSVH59fLg8iU8JEG0b5jLMaiyFiCHBfoiaxOVphGi dYia5TtP2NCE6im9PqWaBZNm0QKBgQDYw6DtysvcA9kn36g5CDiDp6v4hUA81gGu wrmQSkCTGkmbItxjL5eCgafAW4tZHAzc76AAkVZZSdDVyYHuXFOS/jnAeAynVLbe zvu8rUgbZPBu7mYhvZtdx03cJO7zOYLONJacCuX3ygfTJ9D6ZxYJU2RRbHAfNSvB iafZnsnvCQKBgQCcpAB45sVuTZMLST2ksJf+Svy17GJJD1coZAkBZH+yCm39lllJ MBIdTyIRFs3k1PXr2A8rSGzMJxrnKRXzfon+TDGvuYTRhfQgCzWbFg1JhH9kgoed iqD2tOkcXER8wcypMjZmwp5u6yFRR7whr2zyCzGGxvPN5f+fZhy+BYJgUQKBgQCv BSYHWltIBoNsQpZdllmrU9LzEwRPGqy5ItkZvBpvrCYKcRdprp+y7GU6V7An/xIT whd63d7OsV9Bfza98yY35bVTxprQ8QHG3XE9Ytx54gKQT0V/sMyl56riOaAGG0WW obeJvvL4I9Q1lkySInIUjZTOebP+PrxZxIAWorOBoQKBgCjd9ZOVVrVFul5v3fyn rAKSMIZQ+r5InQtFROnPRbEFM3DQSmuZNGiCbF32yyZaSeOCPXLnnMi0ioQQP6EJ 3tg8YYBXXRDZ8cBGINezNsZbT6J5Vxk6YjrLd6a6s9l2IkezBCPBM2SuQZwbSpJe DyzAF757x+rbcAuLnsHwGFgv -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/cert_path_common_03_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/cert_path_common_03_root_ca.pem000066400000000000000000000033021322470703100306200ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/cert_path_common_03_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100315750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/cert_path_common_03_sub_ca.pem000066400000000000000000000033021322470703100304260ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_03/description.txt000066400000000000000000000005051322470703100256520ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_03 Purpose: Checks the behaviour of the application when the signature algorithm in the TBS part of the certificate and the one outside the TBS part are not the same. This path is not valid, because the application cannot decide which algorithm to use for validating the certificate's signature. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/000077500000000000000000000000001322470703100225675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/cert_path_common_04_ee.TC.pem.crt000066400000000000000000000022301322470703100306600ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDKjCCAhigAwIBAgIBATAHBgVVHSMICTAjMRQwEgYDVQQDDAtUZXN0IFN1YiBD QTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUyWhcNMTgwNzI3MTMyNDUyWjAf MRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBALuJ50KUpvsGjT9laQY0qA8tE3/kJix7fg4iD+KJVKDe NA0WOJED/CT/P8x/izoeXcTGSYelXuEr2q6+FdaQTqJSxh4FUkKxv2m3PPRJAORV 5790N/g7dIImDtzEb0cDxnV7q+55448u6KWTdruyOMTaNsjSbxIgiw2vBegCR3MG Yam9T5KWRonI+KumFnGcmm9MnNIHfFwLo3F0+8c1o4nCwdW3EaEYGNW4EDZhqO/9 EySnW23ms45kIJzFuC26ae8chzvJgHvNYF6+D4CnYIHaDO1fCo+y+5zSJKkcvIHm f/cyHQsBrWtRxI+8i5Mo91+X6yPS2xkPoDdOJT2RKsMCAwEAAaN5MHcwHwYDVR0j BBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFHQJQIGRv8BalTtl dgxITQaMOtmJMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEAMBQGA1Ud EQQNMAuCCWR1bW15aG9zdDAHBgVVHSMICQOCAQEAHLzQdww0YxZkhOqvG/frYHXs gar324D/2EQ79pdYpbzQgz2mcOiMJkhCSbKTiWHNbZ/rDIuAqVONvybMIG+T8jSK 4dbvJCGxXxdEJtiN41oQkvbc932BkNm74ILtb1NqFmLRDJSc5Kp0xISW+atAVZ6J 1dhhksCwMHUAW9R2Fffmm93qjWPObZniMtCGB/IKjZp6c6KWEWNk96U43FiBHMws ZYbPVhkGlGDqqpmnHf5dbM2dPxCbDDFxGfnu4gBU28MHd7AyGa1kDqvI+Jd81Fr6 d/MabU2vO/60Ua8JXcU+l4X+DKn/Wo0Pe6Hp21o7mhNAbvOETUjiuTO983lH0Q== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/cert_path_common_04_ee.pem000066400000000000000000000033021322470703100275650ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC7iedClKb7Bo0/ ZWkGNKgPLRN/5CYse34OIg/iiVSg3jQNFjiRA/wk/z/Mf4s6Hl3ExkmHpV7hK9qu vhXWkE6iUsYeBVJCsb9ptzz0SQDkVee/dDf4O3SCJg7cxG9HA8Z1e6vueeOPLuil k3a7sjjE2jbI0m8SIIsNrwXoAkdzBmGpvU+SlkaJyPirphZxnJpvTJzSB3xcC6Nx dPvHNaOJwsHVtxGhGBjVuBA2Yajv/RMkp1tt5rOOZCCcxbgtumnvHIc7yYB7zWBe vg+Ap2CB2gztXwqPsvuc0iSpHLyB5n/3Mh0LAa1rUcSPvIuTKPdfl+sj0tsZD6A3 TiU9kSrDAgMBAAECggEAB7qHAMvugRGD4v/Iubw+zCKlQektl49eolzN/x3TZ9kb F7T5j3m0u55B9f6wRqy3XDjNu/IukaSvMPIIJV0HbedvtGSvagHi67Y6Tq5ELqTJ qwQHmx/GzTxInYQs5SYnLh1IIx5RKKFGw4LAaxDNB8kfETH26NjVfN1gfBoSnA9Y 3bANhb0hg7OLmucc+H5LGhZ1zS4HVtlwbiyOFzUZy7p2vohYMBQqgKtFYRd2ED1o T7uRkXVeYPyfxfzr9DmfoxZvf3sBmvaxKSGGOmcu4ATpHjdmZ+0/Hxg30JURNIZ+ p5rEYlFCxseOGOMofGv9Th8SPiEzRIzeRB6aIl6P7QKBgQD7oh7Qo5X368x4EyR1 oks/7bqQqbZBW0AVYXNafNejmeTmvkHVaa88b9H0GaqoBgRUYnvQ1nsS6MaHACp7 irdvXjDiGz0IzHp6OZLcuGXqGwleYWwb3yPzFUO6rVdm0x8BeSDafgjWf28JfFei SxsfMFNw8iBOmisFD9qmC0gujQKBgQC+ywsFbCany24rJsZL50oP043bF7rqIYhv oCkpgQpR0Pk4SC9jk1V4NaSTqmMSci5nmw0B+Kkcg4Yt3I1nVuxOdoACBmMyMbBg m+7tmH4BDcC6orYpygKOegBa1jMVvbh8MUBKXMqbXFVGZnMT8XQ5E5oQ1jQFEh0Z kU66RC5SjwKBgB/23x03uoQswuN54wbCX/a19x4LQOiac9CDeYjEFQxmLyqUfn5i l20A81WjsQb5BLHHdNz5cdbcFOPvRHY/D8Ao4eLG/QDSILjH+XzqO5/6YT1I+Net h76IM/tRq6mXJfgk7+RxYCQHOg6laehmzAIxPFg7mZkCgnZ5JhgzlK69AoGATKQX e0gkhwbK7H6Y7WitcYoT08zGgsKRofV+U3PIh3Egi6FDmAZZMP6ra73oKkK/rVK1 ePNAS3nx7n5INxjNt/8WELosIr+fEE/TPJIjG51ArDgsYMELIdyUQ+kDgFpDv2+x Wa3InXwLrUn+NCar/zmGi/jf0KGkGt8p9tzolrUCgYA1ByNcy2V3aGwi3z+mkhVn 8H9LaboY32cSjv5uus2bC9wUmnRdeXKOJJUj2fwxbwT3tuwXRWha6PFOsOqKxCF0 YqQqFZe+cShwF2WIVq0MxouvfuYVH/PBr0Hec2oTb00MzKjA7iwUExtC1AIicCm5 GcW2hmWan2sX7iD5q7iwJw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/cert_path_common_04_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/cert_path_common_04_root_ca.pem000066400000000000000000000033021322470703100306220ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/cert_path_common_04_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100315770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/cert_path_common_04_sub_ca.pem000066400000000000000000000033021322470703100304300ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_04/description.txt000066400000000000000000000003571322470703100256600ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_04 Purpose: Checks the behaviour of the application when the signature algorithm of the target certificate is unknown. This path is not valid, because the application cannot verify the certificate's signature. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/000077500000000000000000000000001322470703100225705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/cert_path_common_05_ee.TC.pem.crt000066400000000000000000000022521322470703100306660ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVwOCAh53AwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUxWhcNMTgwNzI3MTMy NDUxWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKeVnt5JJgxeJz+wcf1UYSC5tgx3kitv9H5w sztyjbCAfHDku53Rz/UfjIk9ogNMKH1FJd2jzMUVcLDK9PQjxnrJTPzwfhr1JlvU T8F+l9AZkpfZ7c3NPmhzhZaxk1PrtlKas+k+kuyfrRQjCvOIXmb/OV2YRu03itGu r83tAPBB9qimWGGn8GMw134dd/zp+k4+30yuEISAPBZ/4kYmqrXk1N4owoNDYlf3 FjQLZyBIghMjTvA1XRzsQd47EKL3eE1PhVuRMx6/fdvAsdREWkBf6YEwbQmOsXSO 9WpTpS+406+M0OkO6i/50fesHIN7cMNVStgx+2Atu3EF+rrhZFMCAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFBicpmvx jFGW1xVi2vNHeFcDXqaxMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEArhzASa7h q/AqZUf98X4yeYWaH8gbGoZijL+diLRS4qPg1yPKuWE78wpVnkqD2v6vWoKeAFo1 JUhi8HhNJHQN+JrHhY+varZf/xUO15v6v6y0rR3Od/R81geB9ojalybauaMiVOR1 WGsdcvw/CEq6kDPxs0IwEIftCvyxq4olTS1z523N236U5moMc4aysIYzxFj1efH/ aEVOmlaCow0sPt8SPLLtw3A8b4Vq+PznkaBEd5Bl9azBrwF5QJipFVmJZmG6miKZ dYwrQmADfnvGEARoah9xpGc3WrA7TtAlGPyPzZ/SocsVkVf9DnAbQccun0twA/SQ 3tvyUmlDbhn8/A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/cert_path_common_05_ee.pem000066400000000000000000000033021322470703100275670ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCnlZ7eSSYMXic/ sHH9VGEgubYMd5Irb/R+cLM7co2wgHxw5Lud0c/1H4yJPaIDTCh9RSXdo8zFFXCw yvT0I8Z6yUz88H4a9SZb1E/BfpfQGZKX2e3NzT5oc4WWsZNT67ZSmrPpPpLsn60U IwrziF5m/zldmEbtN4rRrq/N7QDwQfaoplhhp/BjMNd+HXf86fpOPt9MrhCEgDwW f+JGJqq15NTeKMKDQ2JX9xY0C2cgSIITI07wNV0c7EHeOxCi93hNT4VbkTMev33b wLHURFpAX+mBMG0JjrF0jvVqU6UvuNOvjNDpDuov+dH3rByDe3DDVUrYMftgLbtx Bfq64WRTAgMBAAECggEAMUbK+JSste1HgDA7TGCv0KYa1C6ikdgxHa643Q2RgSk+ rhlr23uSuQKGWeKADZUqwK8A89uSvg7QXIPJJDKSzY78btGuWvHjzhOvQfed3yht 1O3VQXMM2zzAtq9PYVlJep+XsElgfWh0RZwKP9LE42c/sHgyvtTaok5JznTWlk5s t7OPCbzOWDMW9l9B5vLQ5wtBcFthG+OtT4ZY8kqiYKg7LDciXQEcR4aphICQs753 CiUziatiakAKSsKhFkinZ79waQc55xcFdazSOH1o8JqVK0LpeUlUPm+pgd4qx5N5 F/3WtId6rWDnb09LvjpnZ+qQqYHLgARKUaxLzQ15/QKBgQDkp5z9KDe8OC0t+lci aDJpJvC/erDpnOO56wvc1ubUxDDZa3l3u3A9ZSK1G/hRJjna8vMNaiHpQfZ74rph jwfkrQJmVTOvYQwVkGjHdeY5Z6VXUfsVdCHh5LFLHYlfb+GEYsdY+awrwFeqRcKA /cNWutIU4wEkBKVzyWD7hqu2dwKBgQC7oE7borUJXyubTrM1IXNi0aGIFtharX6J LmnfST9xC0mkQWo2HVZ6cjWWop/tDLMr78UNxoU4aWrlZXszDDv3jBj2xDaJ5Or2 doccOmJ+Q24WlkTUK5U97uQ8NeDrsK4V5dY+iMevD6NdzofyBj7JDZFUyk8Ojq/z I5Z/RODMBQKBgEZEbC4wKdChwuCaSiS8uKEv4lQ1tCBWonUEEoUvVYiVMh3etVli NL/pUJ0vl0P451atypuYvgscxk6UAorwlZBkypQAIv4GaNxHoKuLQ9DoVRtcijix k6gDy6g1z32QuFEiufhR4eMgHNCq13ckhN8mUmEw0azr8JyAillBrYtJAoGBAI15 5px0xr+nVJFKOZUhgQkNexjL6R4O3nAAYHKun7jUwxWpAbaGTrQLtF6+h4rOXbgO lu65N7D+xEzvRYOLgRg7OoOwFlPKGmX3oA9n8ua0X6mGa6X0qxdFMDI6ijwOQGZg pTkIGFHnn87XMekMToF5ypE973jRnNjgh9W1kTAlAoGBAIt9otaTQ/eN3NDPPRS0 9AlKiqwbN/2K3lzFyq11BEzZpJGSBv1BYBkCbBem8rKa5ZkkNE/tut6MBLBBs8e9 wFxdtXjav7aSfSosTTeIUf/j0Nym0ux1GCJ3HDB5KDkBU5VbFcPaEyJFfTinaA34 Hg3/xx2OM1G6pSUAa6KXsVQU -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/cert_path_common_05_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/cert_path_common_05_root_ca.pem000066400000000000000000000033021322470703100306240ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/cert_path_common_05_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100316010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/cert_path_common_05_sub_ca.pem000066400000000000000000000033021322470703100304320ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_05/description.txt000066400000000000000000000003231322470703100256520ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_05 Purpose: Checks the behaviour of the application when a certificate has a wrong DER encoding. This path is not valid, because the certificate is not a properly encoded structure. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/000077500000000000000000000000001322470703100225715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/cert_path_common_06_ee.TC.pem.crt000066400000000000000000000022521322470703100306700ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgIC/u8wDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjQ1MVoXDTE4MDcyNzEz MjQ1MVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0Oz1YEPWjv1QngOXKsu1V0AmapWkX0bTh nk52Ay8KNQp+QAWlklGi+WmkWlSQWkUtU2TFfB+wT77qmeDgtbsHCscmNnguFiQT fOea1e4ahq+GxupZdZj0TWj7OmYm/bAZiLCMSXcSYcd6UCl1DhXB3/b4zYELJ+yt Nzt1iC48pDtm9TRT6N52BWC7O3s7Q6wRwc3uURu1qL62fup7rkXs7bLaiTKXaDQi mzQVkDL/lKot+a7tYBK8TXdoH4jjJwodWZkdkI/PWAR8P0advNXSzQTHZ7uPzjL3 quOhqJai1XfzgZ0b9URHkdkdo5T9rfYMKmTk7qOZ9GyM4tXhwGSzAgMBAAGjeTB3 MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMB0GA1UdDgQWBBTNFbXo TQBiWAK8Rc58xvmnA/R3dzAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUwAwEB ADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggEBAHuqmDC1 svQzZt49QgENYOMcXg8tdnprFgMo6ufzea8MX6B7MI0D9tFmU7kzjlPcvrSlKKJG ACajAvF1JREX9L0/QwVCcmPA1UafUU15sxnnY6HWSUyroapt+96SOjCwE1dPv55I qQ7Y9RiJSHfVY63GgXSNB/lhQ7qfG3zVyuOewOr2UI99YB+Cg9fH8S6j1+VRkvj8 KOEjgJhI3LBpoFCbkEUBMCHcuF5AGXDw14k+8vqvKWmj65sbf6580TeZ/okDQhkW Pp39X0SkXY1xrLahdn2j6I64a1qEkepMcFpcmzkYIp6comHItva5L+nzFY/j6OBf k2bZ1ItEoiux2m0= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/cert_path_common_06_ee.pem000066400000000000000000000033021322470703100275710ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0Oz1YEPWjv1Qn gOXKsu1V0AmapWkX0bThnk52Ay8KNQp+QAWlklGi+WmkWlSQWkUtU2TFfB+wT77q meDgtbsHCscmNnguFiQTfOea1e4ahq+GxupZdZj0TWj7OmYm/bAZiLCMSXcSYcd6 UCl1DhXB3/b4zYELJ+ytNzt1iC48pDtm9TRT6N52BWC7O3s7Q6wRwc3uURu1qL62 fup7rkXs7bLaiTKXaDQimzQVkDL/lKot+a7tYBK8TXdoH4jjJwodWZkdkI/PWAR8 P0advNXSzQTHZ7uPzjL3quOhqJai1XfzgZ0b9URHkdkdo5T9rfYMKmTk7qOZ9GyM 4tXhwGSzAgMBAAECggEADdcuxgCNz8SPPEL6lci/z4M2X/94q2RmggNol+KoTh32 PFPDGz/tScxIsvjGd0w3W8Lq58kfnEHDfrvQ0fDV+AITFEaPXBqr+PZY/HVi35UD dCCUBpXjtRi5iYsM8f/+JTfWA8mKF1Z8ilJ1nJBqvOse42RrFuXUZK9R8mioarrT srblhC0wFei+ryRZvUN7Yq/zs4aw7drG713cL+WfYZAX7nw2KaruwS/tLq8bZ0Te +jst9cdQInn9HwRufX3QzyAGhmvZE62H9eHuo1f1f1365Vo7Le13CO8x3E05/hgE pvRMvhSHhhRcTgXlM5nVHGusKmVhLK7NBZFRIK59YQKBgQD+t+J+/Jq65hUjNX2h lxqcTdD5XbMUq3SlHh6cNZkDAzriN1xOC4XC9ca3OH/R3M8/6J/f/E/V5lqV7FvE F0AqN6XYSJfo/G9/NDu1aifbS8Q8yPilBDDHxduK6mDKQ7M4+IvX3nfunKZKnidm 5ZWZ9E1X4IKnIt6Vv/WhWCuITQKBgQC1I2eVE/FYbYK0g8GMkWEk8AEbrqYvA2w3 Wtk6PqqPaqQMfOA8GooTc/J65kldmMRdargqc8lAxfhvfeIW+uMDiYfXx8nCElaS svsobvFuX8rFoH9rbEoHyA6vf8fnyuil0r9hGHnA4hsWQDexQMvxUnZaOpZJwipN ZumHH8Ig/wKBgGAD8NztW2YYVN9wymqfCujgbGWTbG3eM5oKQH+htIvuK8QaGjFR JprXCpEGOyhgk78DcUB9W5rFul/JOM4x9X30fA+LTbgFcAIDLn60BVIkvVQsbY3G hpzHeHpk3xdfba+MASreMVdAtW5rL28aG8pszLrTZmyaOE06jtzC36YBAoGBAJTG k5k6XAxJRgWGAj62WZfBGOfnts7+fK+qiqjwN5679Cndlz9GfQolPY/7/V5Gz2H6 +XDE0RPGhprsRfqh7jtFhrGQgwJHlZvALdGz7dC+FQnlHULaGqPxiT5UMZkMa7Fn O5FATSBDlgPckuGfWuLG3DaX0ECcnaodUMmPKB95AoGAGx+NwOnddbdpsAM1qgfV p+msi8wsj4OG9ahkK0sAbF4CqjKfh9DH5W9Zmtee4TicLP3ALE5tZn/6uJQKqo15 rNc9c1Mgpx6yxdciwM5nrMwelu1kjf3MJdEDnfIPYoCIcW56XLpvIa+SGGv2ZzSe G8VXL9hdasyLtSefspL1P8Q= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/cert_path_common_06_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/cert_path_common_06_root_ca.pem000066400000000000000000000033021322470703100306260ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/cert_path_common_06_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100316030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/cert_path_common_06_sub_ca.pem000066400000000000000000000033021322470703100304340ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_06/description.txt000066400000000000000000000004111322470703100256510ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_06 Purpose: Checks the behaviour of the application when the serial number of the certificate is negative. This path is not valid, because serial number must be positive integers. However, negative numbers should be gracefully handled. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/000077500000000000000000000000001322470703100225725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/cert_path_common_07_ee.TC.pem.crt000066400000000000000000000022521322470703100306720ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUwWhcNMTgwNzI3MTMy NDUwWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAMRbXRwMucFlXZYdTdYU1VkeeqXtP3WRv4cJ N3feJbDnCBj77VHEmh3lJc1LDh6T4/NQ09dWwI8SpVR1jWXHZnPHoSUlDFtKfz71 iZbYgIHrTXX1QC1pb7p6wBwQInqMiVVkOVJGrQ6vCC412DtVz/pLlxVWTWJVcLqt Agz3q7tx4HsUPTq5Fze85KkYtAD7RIZ5shVcoDQqTNRuIpzxXfAMCB3aKazmEbMk VSugfckzHo5UQnhya8lTvmzNnAXTP8AEjcTJn/MIBi3YBo3BQ42GaVWejWxrHRET d11e+vItowQ9nUPh3vObXL8DkipcfF7mhc8QmDwdCZrZY+33sW0CAwEAAaN5MHcw HwYDVR0jBBgwFoAUieaTDzrQDI8wkKMssP97/A8aIL8wHQYDVR0OBBYEFA5CdNRP NrMPM/sm6O9yVsRUcNjfMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEArgArY3rE fzr02OEroAp9HU3vpq5LHHqyZIZywu1oqyQaKJoBx4fwsGqtbMwrqhqUmXijfWmv rdDBPyIEigYpIlo9NLKOgVBQPLJNPxKgqOBQpH6zLMXYxeMfH1Rp5lnsR0vLN5bz VvAdjtxXazxNdEDwXgO9OfAImOM6vPmkBisKj4Lk+4q4+KQCDZKEQfrrOQGqCOoK oKx3QNJNqajJD5Esy87SL56epnwonxeA3tDbbJsN+rK6Jk4hq/aNTX0QZ35zQKao qx4vMH7KzqRTvxDwnepZe+8hmFz1ASKDEV5RiFlB54Gt3WsVAnh/LIDC6gypzkkp /gaOLnOP+XrjjA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/cert_path_common_07_ee.pem000066400000000000000000000033021322470703100275730ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDEW10cDLnBZV2W HU3WFNVZHnql7T91kb+HCTd33iWw5wgY++1RxJod5SXNSw4ek+PzUNPXVsCPEqVU dY1lx2Zzx6ElJQxbSn8+9YmW2ICB60119UAtaW+6esAcECJ6jIlVZDlSRq0Orwgu Ndg7Vc/6S5cVVk1iVXC6rQIM96u7ceB7FD06uRc3vOSpGLQA+0SGebIVXKA0KkzU biKc8V3wDAgd2ims5hGzJFUroH3JMx6OVEJ4cmvJU75szZwF0z/ABI3EyZ/zCAYt 2AaNwUONhmlVno1sax0RE3ddXvryLaMEPZ1D4d7zm1y/A5IqXHxe5oXPEJg8HQma 2WPt97FtAgMBAAECggEAROW39HUkoo7iOR98Jb92osgWie0GpMaouQWLYHRirkFK bpXLDjNZTl8OlgudXy5OQBxe0ILAmxMUTt/WZt2B/eMQkHuA6/FmV52JExRRdwSs z9RnmeeSjBCxIseoiW6Ra5R4pn1lEK9qw+ghwKQaDz2BvDtleLj5Do9RFmK679Bm FybPgvm1usNIOPMpWbeLDmwtfBqyaZ5NIGMFnqwbtNIQMM+cgs8r7XYFGSq9m7q0 LtDW9gKqmYBQl+KZGlvwM7V3i3iu6tuXFZ9gzdpoQKzVtOWhRJYtBVtOOsyU6lst Au965W/rNPBRHY+agsUMs16CshyKJSSD6lRO0+h1owKBgQDwWhI6wwM+5Z4bMhq+ pEDeLLEzAh1SUnMnObpa5EyrhrnPDwkhEmqHwP1UuJBPioiiUNE+ErdkBHL1XCws plcAQucLS3O1entjktpFlMgrB5joGg9oUU4cejnZyJbbS81fG7vbBfIEkZow0Wva WCgN+H+iEA6yGnMNASgWiRNK4wKBgQDRJAgNhlHFi8JdOyCwWNDyJLBsUyE32MSa fqE1/NVotW/68HXJgTLI2tXu89X/oJcr1EZiyXMVqSL05E8+O+7RkEzqQijrS1Qf ASORCG8Sjh7RaxSeGSpr5WozC+WwgKnNn3uLBm0cLC8Gto/L4L+3nr9N2vKZkgvD iUwdwsUzbwKBgQCbahKJjpnlrMIcYbyrczhCsXFvQznEhm3RemGG7kKpUveI7PcB PJBH8cGda65c0H5jPpDea2nMMZhIEW66/GAbWiddxU8vlOB+VXHwNjFsqX/07Qzz bkds4JfRvAPYD17f1eYVzPVegOvMD06HJCPaTMny+CEYh0PHr+zFDaO88wKBgBAn Xk/dHhfKEbstw/qbAZiSaOYVDa3ImnbsbPtEih9KVFnnlNF5nziQXpHUV6Uk/Egw XzdmI/N6Wu7ba5t8+ZdKNAasEYkLCnZSmjKrmhiuzYaTZMZJX1NyJt/GfXlCltsB BIPafTb92qwEEdtHgsdmBZS34qEl/K6fvjdWQfEVAoGBAIqY4f0MbfwpaihBgH5Q bBaBPEEOhtvJLirRWnIZ8ssB1Tph7YKnFdaKdsB2FZy2dnbIns3qs+ZYEjeJcIg0 QphWaep3Gefq+0XvKLI6NzMogY3XxkNKywh7r/6m2hpR06R/se/SrPjRCvmh/d2L lZUe0UrB79o8vnW8O4NkDP+3 -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/cert_path_common_07_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/cert_path_common_07_root_ca.pem000066400000000000000000000033021322470703100306300ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/cert_path_common_07_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100316050ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDgyNzEzMjQ0OVoXDTIwMDcyNzEzMjQ0 OVowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtz1vzrbxATk8v2piez/GiF5dUjA7HJm3 hl3k4kyf0lU2b+8dmABxHeQZxfbIEo+MnHyHw4mj2Vswamyi83wGqUWzYPUEk6e8 sO59AXlqWb4O8T2BKsE+5vaTAcxcQ5tutqT+0Kjnl5GuKrUrmHU3cFJLRegFu70f SPDGshvlPCxQfT62TflZbq88mtNwMQ1Bpev+Pnqe5O5r4TEn/Fztr1/T9HJon3i2 DLqs7SgqAo2W3w2nUZ6DAugkVoEuEPHccTgjICzfX9KuTr9LAlMuoLYA0bFWqg/n XkVJsx4HwgTsErgeLChIdAvO7TxveXubzy8t6Hgn7iuJmLtag/BEgwIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQUieaT DzrQDI8wkKMssP97/A8aIL8wDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBAEVN5PR5BpSVViDtHGw7nKe53r99zKbj BScHN9rQNcDeG6C5mNpZsacDs21cmFdX9UptfAPY+WuqbpaGGpxJlX9t5rPqJHyp GXh7EXIJ3aisKjxv1vDUuLf/i8Q3Tn6HVb5nNBrd8ovWqP4Nmt8VKWjSvUdBYxhV g0agr/IYQBuh23oZXegAtj2CJo07thyimTUDX0DvOKykgcnRjcwwxElEtb3HDHGf qp0RGB55kXqKr1EuBKaVuNMc1WOY1tkB+AuGAM60B66JoKukPcuActVS8SbJqz0S oNk7wpeYZX7LNGtl/dw0Ymy7MicjW0BXv3GyWz0QPsiPGSE08D/rJXg= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/cert_path_common_07_sub_ca.pem000066400000000000000000000033021322470703100304360ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3PW/OtvEBOTy/ amJ7P8aIXl1SMDscmbeGXeTiTJ/SVTZv7x2YAHEd5BnF9sgSj4ycfIfDiaPZWzBq bKLzfAapRbNg9QSTp7yw7n0BeWpZvg7xPYEqwT7m9pMBzFxDm262pP7QqOeXka4q tSuYdTdwUktF6AW7vR9I8MayG+U8LFB9PrZN+Vlurzya03AxDUGl6/4+ep7k7mvh MSf8XO2vX9P0cmifeLYMuqztKCoCjZbfDadRnoMC6CRWgS4Q8dxxOCMgLN9f0q5O v0sCUy6gtgDRsVaqD+deRUmzHgfCBOwSuB4sKEh0C87tPG95e5vPLy3oeCfuK4mY u1qD8ESDAgMBAAECggEAF87Irx//0jvgk7I7122i2ub/0wTnOUETokaizXBNN6PQ rdxwiOZNzCdt3dXBiv/RsidP8Gz6t+vsL3er+Fy99NJUix1qmdCqaIakAUQIOF7E TD3EgYyYIqQY15v4xOP2D48CeJPpezz3Vx8w6d8Y8+QNWajazdi1ruFxv4R2VUno AZ/VvxygkN24ojDntmbqFeFPDw/LNYG1If8UemtuParjcJtiKo3r9JOt1cTHq31z fLIDUKHwY+YGxIBvivx6VxreqWgM7tI37aK0kbM4oGn0t2jRzBy9uQgquEGUKZ+W u15A2RG3hom7ATtQXREhIoFo/q6KGX45wfvMQ9/RyQKBgQDz4sBGx6H+kg6hWv9a JIREbbRmrZmeIQgPzbibD01PjuMa3qK4KudHASMIu4U1tH7hHnkMA/nDhkRWycvo w08YF75wUif+Hm/slQcb9N47FabnLpsaprXgA5zDxHYBoxIO8hfvNQbeS5/r/xCy MNthdRqTELmze7+18vUv00BfhQKBgQDAV4PGp0+T8I0zI2a2y4vzbLpnqXI08sXm l7BGpml1/NtVQYAdeK8usStGtalnr0hf4iXJyzc41RuABvmEGHNvfV2+0oHg1p8x sL29VgoAc65ok2CEj53rZqCX9VJbd9tuyqvm83IXFO6Pl6pagpNarqp2OKf5Hvtw ET0BLkteZwKBgQCqib2QANqbC4DlfZ8fZneC7f9+6ReJRmm/u0fCTcHuxuixikrY Y0/UC8x2t8GfWzZ5rnhQWZtWCNZSpctLWP8+xqOpIRnMDXaQRWlyOBkJ0csizykw SrDVE1GUZxVpcaEYCFuKLlc+LD2IpZQENjvBe0R43/IqunbFAT5IEf1qjQKBgEQq P79VaDRr2f63mx1JQc4BSIaYXKs7Jru0InrHWzS/ahPq5LaNILiRfV7P3ruqOSIS CYZciLORgu96iU8xQyfN7D1GaVT/euenVXcWWPEUDkltgZU5OKRGeL+h55AXCCNZ nFZ7DIH1nx4wh+UPxZ0rram8Jnt5aW6sDUyv1XIdAoGAAKKBPL7pC4qnNg2pcPy1 r0pr0ja0G1JmYMpf2jczbju8sKmHTDCINvse64A+Lwy6y8S8vUiT5SV4Uyx4DBvb IgusBULKQVcA9+XEUvtHyTnRTph5uwV95397KCyOTAxBTc7Qt7lWbKCG959wLau/ YobydYjg43NDOx+uoGYzniQ= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_07/description.txt000066400000000000000000000003331322470703100256550ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_07 Purpose: Checks the behaviour of the application when an intermediate certificate is not valid yet (now < notBefore). This path is not valid, because one CA certificate is not valid yet. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/000077500000000000000000000000001322470703100225735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/cert_path_common_08_ee.TC.pem.crt000066400000000000000000000022521322470703100306740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUwWhcNMTgwNzI3MTMy NDUwWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKYrzKlNQO4o4PvTXXSjqJ3jyFRiGEuSw9cp 3oqP3to39fFUeGf8TvkIOgp0ISdRYtIIiNfBXtevpq9OkSsgxFi16fTJ5VZGQd+e Cc0DsWA0n3gdaQhsW4i0OYjeOux2TrAawOV9wEWT+fgyt7HJpIz2kYq7LdH9Zv2E wiKQ+0P9Ju+IvYJSKqUH55Bf5UNbdBnj56GJoL9ZChIiJuGLN+Z1NkQn4IpvS6Zy bluE7BOy2/xx3++fHlG4k20iipjdm5l2UyrPdCLX9Ne+wa3on1wFexifYfxZUTSf 693y+aavHkTju+oHX8TcsHp/T8VjgjNrc+Z3MizUofQWtqVebU8CAwEAAaN5MHcw HwYDVR0jBBgwFoAUyWmLdbUlFFan+AeA+Q1LEqDnaTgwHQYDVR0OBBYEFIFHv2Io EE3xx/hKfOBQfAk38qFyMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAgEOfp6Nt cvwkvOFQpcSwohQXwiLWLTviwPZ8ynx6e9Kyy3MmVqDgPaWi9tD+dGNOLKxKvm7D bc8xHuf9F2pUDiVPWDVg/sr1HauI2QcZHJouNZI38O6I3XiHZuv4UoCACGqhg6zL F/KOBBUhgqi7Q7cFOnPuguNyMmUX7/hfqgmo5uW9vd+CoTA40o4vh2SRGCBTgTsM EPR/dk3d31jENoVBU/fHDqWY656bWB1XQBF/Z9oy9MN2Kp8b0hgAEvk7Sqttiibg HzLMwygTKjr03LYJ7ixu356FxKfi0UGBMpxBxhZQXywhMnp/mWHCi16TSthh1pUN 7X8pPA/g2oPRqw== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/cert_path_common_08_ee.pem000066400000000000000000000033021322470703100275750ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmK8ypTUDuKOD7 0110o6id48hUYhhLksPXKd6Kj97aN/XxVHhn/E75CDoKdCEnUWLSCIjXwV7Xr6av TpErIMRYten0yeVWRkHfngnNA7FgNJ94HWkIbFuItDmI3jrsdk6wGsDlfcBFk/n4 MrexyaSM9pGKuy3R/Wb9hMIikPtD/SbviL2CUiqlB+eQX+VDW3QZ4+ehiaC/WQoS IibhizfmdTZEJ+CKb0umcm5bhOwTstv8cd/vnx5RuJNtIoqY3ZuZdlMqz3Qi1/TX vsGt6J9cBXsYn2H8WVE0n+vd8vmmrx5E47vqB1/E3LB6f0/FY4Iza3PmdzIs1KH0 FralXm1PAgMBAAECggEASpQu0y9afGk5bJx0/cP0CgTw5LpwB/8TSU6/0/V1QgBK sCjGr3jkYs2H6ygqtxBGZ1iwPhFKBUiO6XA8JBydMulWWuiANwPqTbgK0wocwj5r 8gdVHBQx0r18cwq2bGk+sLgZKgaR1EhxMK1ml3MWGLQTJy4SBwSRhCfgz429T8ok SSxboNo7S8QRLeZLbcz2CRZaRx3iLUSeJIs4VgnVcJ0fUaV3Uz5eGBfpW9g3uELA iLBamSnsRHPJ1a+2MKZznd7T5N6E7Re4XbTOvGGDRimGa71MnDHBEzn91z/K+RKb dtr2aKeexcP5VHRUtkglwvrLZAA6VnJaXIO9ffs1eQKBgQDq8S7FXKu6FXfh3zN/ RQz+mo37tN1liA3mKcJ3HXW0s/SlKrGXIurux8GhcCk/j2ABnMZzT4ZIkIuv+l6z uz0iSq1AD1HnpbuOOpgMHA+4ZySMXIN4Au2W3rDfuIQ4lVW/0JKQB59ACJCCxyMV WUDzf6gHcBBluU0VOdeJ4YJoeQKBgQC1EKUZe+POgraMd0K6jANkkHlI9wzfTS9A LxYhTzQUTn35RyGRNwqSax3ya6NcDsUvDgcNWAO5q2YTmttxumKci51WWmiffwQG 7seaN6WC1r1+3vXR8skcDeK/s481IUNB5ySPNSMxZ5R9mEudvKXXJzyEM/rYqkS2 hLpoT/miBwKBgGDUxMUdO733STCz8KKc0A1DoA9E7RcCq0/YmEjFwJSYstU8MnOr NY7yj7C87JNAwX4IopY2CY9w29HM7ClBm6G9i4hiiAxkd1fYeIBNNIF5KUwceScG dev/noCmqQA1NGFZUn7AVXdr0DvGXYRYA/gX/iYKnwd+BvIfo+E1K61pAoGBAIuN I6JrkR2mMyo59O0wYqEMlN3+wyYMKCHQ6L6Ne/c2s/L/tshkYrqM4ozoFwUpwSJO LnNDZcOhbdAoZ3/VBpHfLUnT7pUXYTQyrxaWUvNvrKdvEolZFVWRAjV8ICDz3RGb I9tYOiKm0ZSnX4hYUH1uGT9PjMOXH9SIod8p3J3bAoGAOT0QhqJIsOFr4j1FHVBC tJ1+FxUnmhKXzhJMYlhQYhuStCsXzTy31KNSJo8lLSfHk7y0Md/QnxnuLadZYqq7 1zUfRzKcr+biAkCJv9O6BmGYAwe/ZtJwoP+S9tMKDpIIHeeFYy+gT647hdxleTWE fxDbeNb10VY4NiyOcmSofpk= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/cert_path_common_08_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/cert_path_common_08_root_ca.pem000066400000000000000000000033021322470703100306320ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/cert_path_common_08_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100316070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNTEzMjQ1MFoXDTE3MDcyNjEzMjQ1 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6TYO5NqlGaTwj4mQimN1g26cuLJ2FjI2 234pZqub2gB2TrUi8nPkPl00jYzsQ0XCxzqePeOl6nTjSZaQMfwuu3aRfjd5lwoC k11qcmjp1/LG5gqrnEUk606X/8Ku7iihQkwtu0MlhY5DXcqFHJkX7cjkk4AYHmW6 0X7yikyjRmexfK3ihDB6+BHGnhLk0WsaddEP4ox2sDWOW7/uGu6clYhhObc7CrGn FuaI50DgT/xuAJEQDsYVnc+XuUUMhcn5AWueyo3RvhGgf7wAE9ZMaHvYQ0PxP6/a b1I6EU696PB8iYqGJ93iKsMi+mZxCYGfU9Lh0J3N0CCU3MzOivbuEQIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQUyWmL dbUlFFan+AeA+Q1LEqDnaTgwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBAHt1DuS8S9cbciEXkFA7zHgUHAZ+8Axj C6jngQYUvM3pWZ9lYltO59ncxtFceiO7w5Rrlb26h6+a2POneAvMSmqBwXi8TyZ0 1VjeMC+Ewe6v+kpqOFcVHjbz9377S6hhr5SYsG1hOUt9OHjUvcEf7IrrTT7iiXw+ L1iDmakbU11P0/oc0yFOl5+wBh7JVTjx+Okryf9KVUiqdW3emjzfVZ09k14WgIxC 0Yq60+VDDjqFN2nAcPCPxClRg1ZKjcx26ZuK52id10gInwNMpJETzSq5PVw6Aes1 h1NDPpTZNCV4WRmNHzmCMBIUiz/BHU96OGwg0Y2+hNsVAR4GWuSSYPI= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/cert_path_common_08_sub_ca.pem000066400000000000000000000033021322470703100304400ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDpNg7k2qUZpPCP iZCKY3WDbpy4snYWMjbbfilmq5vaAHZOtSLyc+Q+XTSNjOxDRcLHOp4946XqdONJ lpAx/C67dpF+N3mXCgKTXWpyaOnX8sbmCqucRSTrTpf/wq7uKKFCTC27QyWFjkNd yoUcmRftyOSTgBgeZbrRfvKKTKNGZ7F8reKEMHr4EcaeEuTRaxp10Q/ijHawNY5b v+4a7pyViGE5tzsKsacW5ojnQOBP/G4AkRAOxhWdz5e5RQyFyfkBa57KjdG+EaB/ vAAT1kxoe9hDQ/E/r9pvUjoRTr3o8HyJioYn3eIqwyL6ZnEJgZ9T0uHQnc3QIJTc zM6K9u4RAgMBAAECggEAXAQ+4zCcFR695jzGobv1mYrS3pNXwZFFkNxaNI8Amwc0 pwCUjeqJQ8wd2L4iWLbVUCvCVTQV+ojtR1NXiMlynPf/FziHSr+h3Yht4D+iCNlb flf2d13W39tuYPVtdT3lxtVs8+beDrDfxsmKNQr45JMwETzpB1FnYZK/2y66+6Nc gLTeEWfj2sp9iUngvSy6EyDFKhLo/CZC+nSP7GmvgplD+dNTvFNjBvAnEnbfHoWd q672xWwZpNAEnaxjkCwjWUwIzhA/VSeARwUqwyYcCj4G5t8PYh/k9NxuFJ+SZHic yrz++vwK9t/aWoFj57OcrKKPVW3u1yU8WFzq79w+uwKBgQD7YFFsJnityLdDrlOb sapxVZvG72rPvIOgOKips/VRVDlZ/bvLH8JpVsd8CjmK/3DD6+VnluLhrVAVO1k5 T0u2u9+h02hINNSbBbZsRCGhPj0wsel6T22/dKiGt7UNEjpRd6r+Na4fjMJvno2i N+4e7DooI49Oz8JZaDGMUB17NwKBgQDtgDRM17dsN6Grb04WoN6Ad8K4CNs5BXka TxJGGbAoghT2vW1TmN84LvXU0/sG1Urzbpxq3I1kyX2Hypybi1v3BvCvcTapDws9 YIFHy7egeXWNw6z1hLx1hvttChi83KREMVAVFMMfan1elhELwKCNEb8CUAnJNNPe llaW0CFU9wKBgAYt4PKCo5bKB08/msiJ/oGYtCKYwgxnOukWW3cIeHBOXLaMmTAu EK5cNr0i1zVGgDQguVvphpw7kWtkMRZKj7bnOWEV/EtCGTPSWSCiMB1xlTl8NhwO lckOChJ9s5Klrw9PnMFw+l3GLQVnZV3meBEEh41zClPKoaFnAUjMs1zTAoGBANlR tomZ2fzr6sMz1gBeszpaW5KKiA5lM6sfL1l1p/tpDEW6j48vExIV5lwYnFpkUXDu hbJCnh7bQEJA44xwuHYRo6rlrV6EpYRECgfoIN52RVqy8lC2ZLwmB2p/EqO+QZEk jmK73M+iYZVrO63FVSPAWUeEdW/nJvdGGXVmfRmBAoGBAJVC0QAoW5EQLeDwn1o+ 7De4LlYQt8UH867KtHDv+AJPSCdyZQ+CvXhWdyZBdvOXAN1Ne24n2b5ixsOMf9Ay w1elBayE6OFeS4WuAeKRTj36gXebxBC+etADHM0MoeRbQSf4tXTKWi5R1sH8UxMd jM3IlJF6fH8I0Dmf/9zHqikA -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_08/description.txt000066400000000000000000000003201322470703100256520ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_08 Purpose: Checks the behaviour of the application when an intermediate certificate has expired (now > notAfter). This path is not valid, because one CA certificate has expired. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/000077500000000000000000000000001322470703100225745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/cert_path_common_09_ee.TC.pem.crt000066400000000000000000000022521322470703100306760ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwODI3MTMyNDQ4WhcNMTgwNzI3MTMy NDQ4WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALthLrGf3QvfuRB/oRJ0WCktf6kTvX7oxUPG /npKslY+Vi+NDGG5CcepM25Yq1UC+6kgCVut5SL5bsYPMDvs40ePsHBOE6n4kzIr c8aXvlh1ixP1qmR/S8zK+np9AewwYT8Ya9vE+mFlntY8LgjLKJWbCDIvpZLKBDTK Ca18B9FrJnl1z3EMCDT6deAIbJi7+Pf737FXJqbzIP+BfJ0rpNGRtd+kpUXONsSf 1wnf+bIuVGllEe77HEHICSXKsr6SAMM/7L9DSWFSC9ngU2RqGX6FJnyhXkKYo6Vs 7fHI5pTLw8Uh9C+utIeQvesDZ6aJKqncgPf44I8VO50yD46k56cCAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFOhiRviZ 86QTqOsmWa/OKICAZgHWMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAGxuY2YnK ZopNa19w2OdJ7Bt/RukeB6bNis6v7pbtyCsp68228P+yfl7s1FaPwYLcVCsiZitR C++Fbmv7gHoWbSaKu+pcwmQpaOku+j/QMByQYz+L9pzzaWepER8kK6FINFQUN1L7 ImG73mLNAKrwxfDTciCFx1fs21+f/kohMyLsaPl11K0RuaNwdIyQO+I0bGimGowa XF9D9OMhriJBzjiYhZEaPaBphMtOOTGGwE/XeJfF60VXVWZ/xPIjcIInhNr1etZT /aHAmcbQTZdRSiAlR3WiXtLsFpsVRrZeWotk9c7h1cfvEFPC4GvUn1qohj/u9ODo YTIduluudxG6Pw== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/cert_path_common_09_ee.pem000066400000000000000000000033061322470703100276030ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7YS6xn90L37kQ f6ESdFgpLX+pE71+6MVDxv56SrJWPlYvjQxhuQnHqTNuWKtVAvupIAlbreUi+W7G DzA77ONHj7BwThOp+JMyK3PGl75YdYsT9apkf0vMyvp6fQHsMGE/GGvbxPphZZ7W PC4IyyiVmwgyL6WSygQ0ygmtfAfRayZ5dc9xDAg0+nXgCGyYu/j3+9+xVyam8yD/ gXydK6TRkbXfpKVFzjbEn9cJ3/myLlRpZRHu+xxByAklyrK+kgDDP+y/Q0lhUgvZ 4FNkahl+hSZ8oV5CmKOlbO3xyOaUy8PFIfQvrrSHkL3rA2emiSqp3ID3+OCPFTud Mg+OpOenAgMBAAECggEAJ2VoXtogrIVuMITVBb9GZen2BENtPQiNqRFmoamg0zcq AbdjGgzAfKUbdiDYbPhCly1wKkFmgrL00lmRJ5hHtN0GGKahxcPIluzB28g9sfWM tzaYi6aj9jva6/PqepE1cQGec8d3aRDnk111xE2Ki+HbmEmiQzmMJtkvrbT9I89K UH6BaUhfjyK0zgnnOlsdnEXZ/C4e8mm/i6qLjGsyv1Unv1mGyx0O5EknwtHBHrHw qjfkiQxutU50JIkP5lDyKjiiec1IzylmUbRmaQognhADkQMzOV8ceTEeEfYKBLTy BxkuX9S0RO1iVe95KuENeNmvS1x6Bhok4fXEe29MoQKBgQDi/Ix1WwC9JhIfmhCt wfL8UjsJQG740BuDzr8s4NxvjNNFhZNoq95lzW3fMgZj0mDqz4sHhHzsfi9jL6xC RD7zxXvIgbyncV/VWHUTY8n5c+gckcmwq+Tg+X5xhtKziLEsc2hZiAyPlDv1duo6 QnNQuTdq5X0/Q8m2TMq5JHJ2dwKBgQDTVJ31yDO+G8cjL5Eg8yrcl2uXqXpf9JfH AQvmHVoqpmpeD4q43UUTP8ONYs+vGJ2oZSH7rxZQ4G2JYxl4fzar8zePVxOUfxMp widEb0WiHAdfjCZRjmjj1Fk3rI/nYTcFmnU5gUjtFx7q6V9d6aoMqZiK7uiNMxCb Zw7Wa5z0UQKBgQClNjaxsGQQSGaGk+ex4OoQF3Ya3Mgo16g/PrtNWfl4Q+L+xiOt 2vLL3EMtYkbeXyDlp9xEw3z90TaClg9mSDAd1E6teSisI0wih/jm/QnkRCXcrYxE yEiWK2KKFRzFSifS98kq6WhjFPyzRDNl5jnytm0MpC6OXrOxuaEQMuQRLwKBgQDD 5PYftRsxqHIpzZgMIRykKsCTb4h+li5zTCcJgj/otSZ4VpPS1VmIhFzzHJtDxd+v D0A3G4/mHIOtDO25YsL9FZF1D9SYnErZNJ5Ns4+qu6yiBzol84qLVnX1Q8KJSvZD /W+YhJ1jGUGRpA7A8S6uWi+K6fcrnCBSzW9Vl5+AYQKBgQCxPfQm4QFRPVW8BYFf vqnssYvb0tqiRRa+VGgTeqW/EFG03ZTZM0OpKGHBAiBRF2ZHq7DsrUvsr2jCnxJz 0vy/hmTPMCx7VQFA30C+b97OqkKcr9B/+SBFmilo39vZPTTaf/AJdLDN5UPo0ynu WGYKgGtfLnzJFt9X1tQDwf/ueg== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/cert_path_common_09_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/cert_path_common_09_root_ca.pem000066400000000000000000000033021322470703100306340ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/cert_path_common_09_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100316110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/cert_path_common_09_sub_ca.pem000066400000000000000000000033021322470703100304420ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_09/description.txt000066400000000000000000000003321322470703100256560ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_09 Purpose: Checks the behaviour of the application when the target certificate is not valid yet (now < notBefore). This path is not valid, because the target certificate is not valid yet. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/000077500000000000000000000000001322470703100225645ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/cert_path_common_10_ee.TC.pem.crt000066400000000000000000000022521322470703100306560ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDEyNTI2WhcNMTcwNzI3MDUy NTI2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANnpAKLZvLSvre4lA/8lDcf9XuoJAQ0PgB+6 z2atWrBVwbIqH3bFq1YMVo1JHTDOZ0yI8NK5o5xtcFsLuv33aJm9qol36pczGtAD Z7TatNXZoi9wgFud85lGvhky9ylWXKU4DoNcaaeqMmh5ETKcsOQ8qe7B68WhQ/Vi 71aPuJHjhkfyi28JaBpfH6QzuyJSKHB9fv+JLhvbJXRbDLT+Zbk2VuGeAK6I76m/ Jh4hSf1COI7ezqxtdJ0L7j+TbddhO/SfZCR21ZwgRw5uY3+vPghqrEAJpwebE7Pk QAIn06Yak+r/KKBF+Pni6+29m4sPJboarx2a3riAGpiBgRqQ67UCAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFERbPaoh NV/nsn0dnO1DCszXje1HMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAT23eJDAv QuRsPwKqhwwKYRzbIw1+jf7ExAseJCpTOFfSFJC9nf48YWKMBghq4gw/SepmzPOO SCpQuEB0gHjDKsKnbG+uKJvSUstU6WfIPaRm4I/kXyWTQpBGJph4xDOwsOgBU7Xs OvqFgvafJytmXaczeYyr2SEFiZBYrbjz3nYyGG/PUixylFW9OcbQ7daLDHUqh75S 0x2Isw0FN5s2xfs/0q40Jcd85NROfNrLyeLV9HnNq9OK7cpLyxVvcrJqAxZnw/it 5aYJUyRCg/43uTz+/VJBmAWxWLxWEbT2UdA+xqmzGFEaY7b6BdwJIPtbCMFiaHSr GkUYAUQGEJ6i+A== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/cert_path_common_10_ee.pem000066400000000000000000000033021322470703100275570ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZ6QCi2by0r63u JQP/JQ3H/V7qCQEND4Afus9mrVqwVcGyKh92xatWDFaNSR0wzmdMiPDSuaOcbXBb C7r992iZvaqJd+qXMxrQA2e02rTV2aIvcIBbnfOZRr4ZMvcpVlylOA6DXGmnqjJo eREynLDkPKnuwevFoUP1Yu9Wj7iR44ZH8otvCWgaXx+kM7siUihwfX7/iS4b2yV0 Wwy0/mW5NlbhngCuiO+pvyYeIUn9QjiO3s6sbXSdC+4/k23XYTv0n2QkdtWcIEcO bmN/rz4IaqxACacHmxOz5EACJ9OmGpPq/yigRfj54uvtvZuLDyW6Gq8dmt64gBqY gYEakOu1AgMBAAECggEAHOu5s+NmEi0GzoaHI0PNsm9EO5d6Vjtqa8ulXyE+2gxn qrfAeUj+1mrIyfOcNjAOsa+zFqSgvFAiC1NhO/esIEt16MzLi8myk00AZJZqTb+W sOkjgAVUoVEsRbfn6cqWfS8VbgXD2AbUrdzzlV4KdCBBBXkjS5V9qYG59ikY+/OR 0/QJxp4yXSQ3ojpAxd8iIs557gzGt1305/me5l/a+2cl/VTCSYN3nMql3miCSYIX nJ/KKBNsmRHp25AbSN39xutOIUYtBguIboWglUhTtLo4jVn1TffWEXsx8H2/V+VN t7cOMEIVM9hB29NM7jC7qet/1IpJl7uHMN3JeaaMeQKBgQDzVtVqGBL89zkJfZXG PEFu7SbG1yuIC55Ts+RF1fXYonYS0BzZ/be6uuFcrqmad8tLaygRY0uInQ83wRAd nplqNXya8XsQr70nEZ3lESRSnlps4GbzkmwXnwneZa4SXSGgPodEoKR/vH/f+PJy aGIN/bW7eRnYvvPdrzSgZPcJqwKBgQDlP3dCV9ipycalHmEe3XlTccd7N8R2M+Ow 6Fu7grZWP9WXsz20QDen8iezY5/tn1qFV0vgyOFE7deK1RpkgFJd0P+sC1vis75Z rDpMjBDObBEm1v83UMWd60H/yc9oO/HIJKVlObi9pFsq6pNz93rTuokK850oDnhu suGO9rRAHwKBgClDOzMfW/DrVw+l7QTNaOcPbbjf+bC7D6Dv6zBwZJzUh6MPCSVp 4YLXd6mIsJfR4nYqeIPiS4eh4le49CuhnjAlW7jGY/Dja/a5BQY3zun3kivOLYb1 +EBVJo5AvbC9fBs5HyTi/KHwa9ql0y7VRnNK50sf8OMRFjcsI4djN4S7AoGBAK0I HEHtAFIXRGI47eFYFU1QYdq1GwqE2+UZXLPJU0sCX3tjBL3agqe29RRHq9y1HKPs Yg9GUBGw27Gka4lT+ddp+rCm2jHgrVoNzuscBUto8gE44eWkh6RMf8JLVss8A6Cn WFdxG+m39kAMUkODlifdcbbcbdBgK7KSPgGkYCTNAoGAJgcfumqDBMgpY2KBw/Ko 6Nv1Qk0zf29aPve733e9tYoEPYPsq54IVudcOQMTeEvuFj+WGKSqnsVAni8FR5Fq KC27uIx1vCV6g+wMPqPQMnHT4M2feu1G+vxxKwfmKp6RprKpEVV59qhVidvzRR7T V30uvjLtM2DeZLB67fJrUhI= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/cert_path_common_10_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/cert_path_common_10_root_ca.pem000066400000000000000000000033021322470703100306140ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/cert_path_common_10_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100315710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/cert_path_common_10_sub_ca.pem000066400000000000000000000033021322470703100304220ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_10/description.txt000066400000000000000000000003171322470703100256510ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_10 Purpose: Checks the behaviour of the application when the target certificate has expired (now > notAfter). This path is not valid, because the target certificate has expired. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/000077500000000000000000000000001322470703100225655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/cert_path_common_11_ee.TC.pem.crt000066400000000000000000000022521322470703100306600ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBBQIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTI2WhcNMTgwNzI3MTMy NTI2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIzJdzaqP4imNOIOwAqwIs0IADZkqilKBB4s 1CWhz2D7W0o30CjsE7tDRt5ZWlO+x9jMIr3/pRO4/+Cewyx0dVKT7oihRaBPFa3o zLqqgsI7P7caHfK9UMnHqZa72tln7BCSqUeMeC/5Gim83njtceHYWL5b9MMPCKjh ROUdrkFxc8rt0ODvRUAMsq/zcutlO3BvxLcvdOoDNCUpup8NWq2QKKtznxXc+LN/ M0I44Q4AXyefjwPj1S1T8joAVJ5zEikFxnhtptMMBnqdXNqhp1ttoAYli1qxHpdo 7Phb/RxPHxrO9Flatkg7HJQAg/vBca8jIM4g7X5h+GRltNai3gkCAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFOU5vl4k v/lb10KegkKnzsy6o/GtMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAE+38Axj5 Mhj++eMIAs6kaNkuVAYyCgSzqXBb5ScMstAFVMceGBjq/DgBA0ee8wQ6KjQXbDk5 LUglcyNq1Zo0rh7pyC1tFne51skDurTN10LILb4gMdc4/DcZw35hGOQmv5/JGrAp TB9UU3MEEZ8vMSpUdingK3ePEjX52cVI9eZ4/kDl8CC4z4ReDd1hIJeh/pnSIgRs IWBO7JDOdW/b6ru1z4JWphaKPeQmhShCPEtLOrHNEvBtlVHLZsonCemXZcrMF7HL smT1shld8oeIrIp+SSy8HIVGYGaojdvDP1e7A+KkZzsVryrntvvQ2pGD1gT8zZxt amdGokZRws3gvA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/cert_path_common_11_ee.pem000066400000000000000000000033021322470703100275610ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCMyXc2qj+IpjTi DsAKsCLNCAA2ZKopSgQeLNQloc9g+1tKN9Ao7BO7Q0beWVpTvsfYzCK9/6UTuP/g nsMsdHVSk+6IoUWgTxWt6My6qoLCOz+3Gh3yvVDJx6mWu9rZZ+wQkqlHjHgv+Rop vN547XHh2Fi+W/TDDwio4UTlHa5BcXPK7dDg70VADLKv83LrZTtwb8S3L3TqAzQl KbqfDVqtkCirc58V3PizfzNCOOEOAF8nn48D49UtU/I6AFSecxIpBcZ4babTDAZ6 nVzaoadbbaAGJYtasR6XaOz4W/0cTx8azvRZWrZIOxyUAIP7wXGvIyDOIO1+Yfhk ZbTWot4JAgMBAAECggEAB3LZyjQ99gmAIwUvgylAQBuIIliXWaWjO+L4ivCpj4qg 8PdsvZuG7DmSIG23Dhb6DRX40RdbWSSosg5ISnvzYJ33yPYKYGHKxneajFY84pCe rX3132vFgFV+Wx2fhbDeQB64UtMjYTtjV1m5Jgn/BFlNUa39EExlc4Tun5YfS/JD /L2vBt/aNIbRgmEELLlOPqebcyMNJPx3XpwdkXQu8eYCotj100kRTCL1hbn6V9vC dxqx/xu6Pmd+1Qu/mpTOIa4dd0/Mu87jnFPG1qO9LJZZXcfIEisBCjCSG2YTuAKY 9Y3lVdbDZ3tqMABen28aGLAii8r6+ujqaMSH1ERdcQKBgQC+GQ817pI9sMjfchq/ W5SebyePouN1ZB3cjYQwmELoTBehs7viRp5Bp17DSQ36Pw4yN7KvZkFVMSsmqzaX fW5p6pD08e7oZUCk/baEszVQO4PDa6YrjTgUQ4xJHM4aD6L/S8tjqWYMdfeNLA0P vCtJ+ii+7WWx7Wx8J2RpBLg7GQKBgQC9mCB2FRBNz0GbijkMB9Qo1bIcPE3SuSd1 lKOdmuew/iAMH408KMOKTMZJgxfd0oKOVJdhADEiT7Mzo1gS86MjaepWZiWNdjFi acwKaVSGbSE/aFia/b5aNS1Jrzk7HULQ021DM+cr1pPzHwBuEf9q4YuzliQ/Fy6p kPbz4jgIcQKBgQCZ9Mep4SaVSdjVhp78/ZmW2uUKYlyfFU9N8Vru1FHTutSkxGDU +GZxO7D2rfLhCjJgH1Xa0hD1gxW0gpN7Cz3iD/QIPOxFUMOTHFu2i0ERUrH7EfMJ cJzLZI14JRkSaDmVU3hMpcQdMWkk71lAth/FERHw12k2OdhTkL+0gfsG+QKBgEOC b8ycI3oRWqMvzLBj+T+xGALF1lA6bbqIetob1nRHiNHISlopibctL03tyAnMc4CK znxTvSsihgTVHP9ikayCglbReH2uoFcSpPzwFJDpOvWBCkvmHmmwlbevFQnfmXMS Vc2gJaiOd5AScey/q9s7BKulwrJUZuEqJUUiQCGBAoGAHMWIIlOo/oBE5NWukIx5 vVW+RnLgrPNCWl4mfkD2siTHZu7V+FP/JYE1v3JNEgrIvDvu8LwtrBNW7BdHoGGE B+XFC2M+V8OmhsLjr3obY8thlsJ8CklYfYwyq1e07igXE+MyT/kEsJYjyarxYoVW O+bCv2vfxSG0o3PLMksiteM= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/cert_path_common_11_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/cert_path_common_11_root_ca.pem000066400000000000000000000033021322470703100306160ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/cert_path_common_11_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100315730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/cert_path_common_11_sub_ca.pem000066400000000000000000000033021322470703100304240ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_11/description.txt000066400000000000000000000003221322470703100256460ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_11 Purpose: Checks the behaviour of the application when a certificate contains an invalid version (e.g. 5). This path is not valid, because the certificate has an invalid version. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/000077500000000000000000000000001322470703100225665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/cert_path_common_12_ee.TC.pem.crt000066400000000000000000000024041322470703100306610ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDU1WhcNMTgwNzI3MTMy NDU1WjBhMVIwUAYDVQQDDEkxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAx MjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IEV4Y2VlZGVkMQswCQYD VQQGEwJERTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKtNBvS5Ahox GjNi4MxWzEtRjVKUIC0hnduJ3WzXhudVhklxEawhUttfWYON17krjDVfToIwSRSN aMhu+iRH1b+JPUtccsl5HitfUHnO4So0bjBsb9y99nijvKd1Ch467JbgXnHdEzlm C1kZ70/XU1c1b0jwfPXnAwJyAVvp9A7FaFr1o2TFFMtPpvCFx+DTPa+3HtMnnPGm gfbyO+z+GGUVjGmXPpRRl07ZndTeERNybPyO+QGiqM/gc/tPQvsMXPC2wNXpm+8/ NMC4HkfI8CVJJVte8F2/pm7EZO2jZM4n3Bvc47jMTyk5CSi+gKG+KjLTmgAFj9WG 4je0os/AwJ8CAwEAAaN5MHcwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35 z8AwHQYDVR0OBBYEFA198x9YJYgAHfWgMee59bILChUqMA4GA1UdDwEB/wQEAwIH gDAPBgNVHRMBAf8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG 9w0BAQsFAAOCAQEATq+s2w+lBcF48ocSqmY+gzqpEXWzr0XtZu8bCjJoBOJhd6XK SypOfYKJoXWhY7YSLzLvSp6R1GqYDE4V64a7EDMcAGDamoiz7eEMiLHz/LxR3oPI /ea3ecr4MM1TKEBRiMhQEmAf0DAzAU2POlsPP2iPrt14nads3iO7YSE5bcVq7IIX mLHM0SMrQr5ExjvepR8eZutQV3dGKHBEP6gKSSwCUDwTe+ltCGfepisqU1JqEVXo RTZihXdgghRGqNEZmJkugk9D/WN7ZMpNlCL0U64QMIhdQ1JfiX20v2hcGC/Eu8zk P94g2QgKPSvcQroQk0y8HamcPiJD/4p9REJsCA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/cert_path_common_12_ee.pem000066400000000000000000000033021322470703100275630ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCrTQb0uQIaMRoz YuDMVsxLUY1SlCAtIZ3bid1s14bnVYZJcRGsIVLbX1mDjde5K4w1X06CMEkUjWjI bvokR9W/iT1LXHLJeR4rX1B5zuEqNG4wbG/cvfZ4o7yndQoeOuyW4F5x3RM5ZgtZ Ge9P11NXNW9I8Hz15wMCcgFb6fQOxWha9aNkxRTLT6bwhcfg0z2vtx7TJ5zxpoH2 8jvs/hhlFYxplz6UUZdO2Z3U3hETcmz8jvkBoqjP4HP7T0L7DFzwtsDV6ZvvPzTA uB5HyPAlSSVbXvBdv6ZuxGTto2TOJ9wb3OO4zE8pOQkovoChvioy05oABY/VhuI3 tKLPwMCfAgMBAAECggEAEtvpl/gQWQWD5BlkNLWaS0aAtRE1aP0/owO5cCSwUk1S T0lBT/6L3+FOT73w0eQ595xKXpSQpHscXfNd2wWvl3qKrX58QrMbalyq1aY8Qt2/ 2IPvstE/zoX+8elgQktsGwDmVPR+YSjbYfq0I/RJqsW+vpHUvWvVTdJy/4Vbxw5a 81bDRvZVSC3dDOCC4I6C+Rt2K0qcGiulpXMZqNSG1WdH8prrX+4lR04Aq5dzvQBy hjV1xvsIgmUJg6h20efrgKg+ybayiBFkQQQWqyKFZNQT+Nm0ZRnqAPzvJPMZnxKp a1CiisAoA442+w8zoBjST7J/SN0vT9nJ5BPKQImQ8QKBgQDTQ7INtxpnt+2dhSXe Hbh+tdH6F0pB9E/kOclDlBRu5tzIDCOu/TMcfUjH2+Fnq04xkNp99CSQURMhSH85 LhCHzwfMGFx9vIgaejfQsQF1BOK8shXjmcpe4IfJtF5EwyqamgPzc+ZIzgp++3Z+ jmtWQFptE4iytp16TEhD2az9rwKBgQDPkvjdJwTdlV4gMgwcOarlyDNbaB67i+7M xW4eS+iIX8r6GU8ulEqs7+FLniPQoGbPmc6VTgDfVpnCxQDUwvIq0if9KyhtMVEE 0ZXtkelgPkyuNMomYjKQH455P8EcQI4l4t+q0EcjZUehGwITJJrGQb6JA2RGdMQN xgaqUpyYEQJ/bpUAni05pRChT9Jh/+GOsMR7JG0McXlwWAXnU3gvOd2dsxinlPDz z/XEItj1I06Hn2oy87rXaLMHUGSiM0vpWy0C59HYl/gXRcSzcok0OgxUonCVBI17 YC4m5W2D6no90q7LYqNH5tPyqoT1gUkK5hrJOk7/PoxX4awMJ3fJFQKBgQCwKgfT iP30IIRVxqPIgJitkw8jEGakvMnaN+SRCdM7ijD1uO0elvQZeSw3xOqYcMlQfzR4 Ok87PIAacJ+X8iscdGdD0ZDpuuULteQMT71E1Rq27k5x7P0EnAOKm7UEiTUaqkUw 7rqxK49zBzznijVg9QMDvUEpGogZOGsHujz0QQKBgQCAcb0SQ28989Y8W3XLm2Ol QbEePGlY4rXgGq9PeObYkHW6ZgvfMoSd5JFAUHscWUHy+fWCHhZVtQFzU4e3fLJe 4Qu/EjfR4hvDD1SkXeVjaJvTEPmybs8qjaxyciycZ112CetHzEqeM5j/ou85VUgL 6ZF60N6JF0zCM/rlRFgZeQ== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/cert_path_common_12_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/cert_path_common_12_root_ca.pem000066400000000000000000000033021322470703100306200ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/cert_path_common_12_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100315750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/cert_path_common_12_sub_ca.pem000066400000000000000000000033021322470703100304260ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_12/description.txt000066400000000000000000000004771322470703100256620ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_12 Purpose: Checks the behaviour of the application when a component of the subjectDN is longer than the allowed length. This path is not valid, because the length of one component of the subjectDN is longer than allowed. However, applications may decide to gracefully handle longer names. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/000077500000000000000000000000001322470703100225675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/cert_path_common_13_ee.TC.pem.crt000066400000000000000000000036101322470703100306630ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFTjCCAzagAwIBAgICArwwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDYyNzEzMjUxMFoXDTE5MDcyNzEz MjUxMFowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCy/ASeaqxzOjuqRJjTNLhazAla1pFuFn1h RLDGSMaknpbZTR3xE6eZ/vz706ztY2tus4K/sHbgpx+Vqo5/qiZ7Tt++w+h6tsv9 WP0+qhSAftPlkgQqNMyu4Ru0mHK1FU/euXV+2MP+9H0vSQbcXToLDbp/0sLh5RHn Xo7V6+sBqc3+9gcdPZwAUPGfR248li1D2cPJ45TOmNe4i5aX5FUaoJVrVGS1EOj5 2vue82N/RUnBn49HuEVO81Tdfn5Lmu/TzT+3W9G9wMqv4xH/7wPxtPOWev7zoOBg irFcUodTGB6qPglQphyZ2BAh++baqbpgKxGTddmLrAKEr9hu3YrptIr5e3r8Qjn6 1n8QO7DxF9dpe/AiH/iFnOKB35iJAzmu7nuFEQyeMcptmxIa5AMwHF/lH5nG67jb rsVpPOKa8PfzpJ1kCDK6QhonaNqY/byfrGa8dZsBsFolzbRHkwceLt8QaB+n//ju 1yYRl7nIKlbmNKAQ3enlGNhK7oL9N5WfCH+q2uzc+Tse4pZ7eTH5PQUo1j62uU+U PvQjmsFN5xog12MpuI2f5A4/FYn4vg4a/eD8tuakgzR1grulS97addRTO1oomZ/z CKv2GTwFZWN0Q1aLAkBnPtTlsKQm1r8+7UKLiRXdw4r5zRL4uBuFRSB4u/i6qV0P Sb1Wq6z0pQIDAQABo4GPMIGMMB8GA1UdIwQYMBaAFO+wmuj+0lTjduwK7L5y5d6N MNL0MB0GA1UdDgQWBBSyKunHW7hsq3rVBQLB+ScxlJZ38jAOBgNVHQ8BAf8EBAMC B4AwEwYDVR0gAQH/BAkwBzAFBgMqAwQwDwYDVR0TAQH/BAUwAwEBADAUBgNVHREE DTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggIBABBd3WwZYiNXQYrJUYEI AdxjMBpajMOwYZyzLPPuQhNgmFhd4WUJ83XTQMmnRFz+MZhhHUwyZNlN8d3ePplV U5KvXnZUI4A23St8CwDTxBrshLsKRsdVv2B7MgawaM3y+493uA4Oet8ErO/+bqi1 pGoVSkOBPWtqIGbwCoyOPTiGzdNpBx2k6tbtWiu7a3e3Tn+PLqTUCVrcOcgmwPXD 1QZX3ou0ySG+Av/Bi5cA0tkOo7sNerERnbJAroW3I+5F+qZW7wxJlE2IMX5dKb2A vtD7HK3D38XxF0FyQAbaoq8azTGPMSPneM0Pkluf6MMHefDk/HypmXSbLk6dCczy lz+jsWmt2ot2xVhaSiSdJx/LDa3McAC83fuVlyJXjkfb/06JzCEi3+DtO9+uJflP KH9I6XUIs6bDA5HwsJ8tJP2B46wcyWNWu3Foq/KcktDVXqTEdGu8fF2eNqlx62qS 7cayq9zu6YVCX8UxEsT1d9JonCGWmpqvH31mSrrFpSNyY1grkeKUcmIy3/IGOPUA DLney9POtShIB9iqek5YnYDRg8h7iPBHMvIvZpCGsBiHOdZgLz3IRxAUKoh6Cc01 PJjnpL9IdEAEmxCuFE1+ky9kOla5mI3hBq5Q2pPwdnRmA+AHjasIuk2M5n7v1oG1 OmjXgdHfonFtPIDKeLi1znZA -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/cert_path_common_13_ee.pem000066400000000000000000000063721322470703100275770ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCy/ASeaqxzOjuq RJjTNLhazAla1pFuFn1hRLDGSMaknpbZTR3xE6eZ/vz706ztY2tus4K/sHbgpx+V qo5/qiZ7Tt++w+h6tsv9WP0+qhSAftPlkgQqNMyu4Ru0mHK1FU/euXV+2MP+9H0v SQbcXToLDbp/0sLh5RHnXo7V6+sBqc3+9gcdPZwAUPGfR248li1D2cPJ45TOmNe4 i5aX5FUaoJVrVGS1EOj52vue82N/RUnBn49HuEVO81Tdfn5Lmu/TzT+3W9G9wMqv 4xH/7wPxtPOWev7zoOBgirFcUodTGB6qPglQphyZ2BAh++baqbpgKxGTddmLrAKE r9hu3YrptIr5e3r8Qjn61n8QO7DxF9dpe/AiH/iFnOKB35iJAzmu7nuFEQyeMcpt mxIa5AMwHF/lH5nG67jbrsVpPOKa8PfzpJ1kCDK6QhonaNqY/byfrGa8dZsBsFol zbRHkwceLt8QaB+n//ju1yYRl7nIKlbmNKAQ3enlGNhK7oL9N5WfCH+q2uzc+Tse 4pZ7eTH5PQUo1j62uU+UPvQjmsFN5xog12MpuI2f5A4/FYn4vg4a/eD8tuakgzR1 grulS97addRTO1oomZ/zCKv2GTwFZWN0Q1aLAkBnPtTlsKQm1r8+7UKLiRXdw4r5 zRL4uBuFRSB4u/i6qV0PSb1Wq6z0pQIDAQABAoICAFL6MW38CGz3L1gVq0Anbdxy QVgCp7OA66mffdC/RpBlEYw2i04LjaUAKOrazI3VjKXqxQ/3UHWAJU1un9eh22tJ OsOm8W2Kt3GBww49LXoQ0k3Y7uNeTRI6PGzyTCOVeMzJ8CXZeqwFTtAQLAUXl2Qu firqW/z8BNvd45xbXj0MKvsrtkqhGGSxIgN0yy99dAjDuVgskP1isIfW9v7+FVJd 5ke2/WVQLKJBGmwrbBJB3hrMzVEzpbYfa1WwYf7NGqh3vDVWdRtieNUoEV00wwBY oqE97lqmV7+KLQWfISutv/GvBwSDrjjIiVon/XOcQlJ5RRG3Dh8JpLU9DLsBLHe5 qZk1qwuyHPpV3kvo1dfC7lVZuOmff86A1BtZJt+SwyNepdxCi9tS8UxcRiJy7ncR qp1jKtZ556swkPEXHqkItaDgO/7RN6r2w1y/+K58s6lDqyJNv6X7QyTcPOgfJDK+ QSUSEEUomdvbl9XPBctx3EinFHDELtbd3pxktzIkN66lYoVv6p6VUgKmTrAg3w02 AHddzLxYUCeosgssLwtRHpY/eDeQD0zxWW9zZcjdf83ruAPqFdN/o0BVwLg2o/71 m62W6ZIEksgM6bidQDnDYuYcDXlh5rR7UJiFsLg0qwF6NVGS7YAEp+fdtxWC6mIz eizZIe8Vz9Mu3hAihgvVAoIBAQD5zrq4HfK56uJlb+Sj5XbknbIig9wKrlb7Kv0q p9LS5RjPBdWe2uhAHPt1FnRDq7Jh09xHBJ13XiJUz9faCLGUhYSrKvcmU2C48zhV +/BS9xrOJ0pNCRS5IQQ2hMfrX2MDpwPNmNKzTZrwWkoZn/eGiYJub4Xzx63SUzj4 +rg6RFsfsenKHSIJApuvNcnz8ROTkozMaY7sB5Rq701RzhXH63LqEMworcf49vm0 MtBUQJrvp7L8ZNKzFjeAll+oBY/EzbMdsr4znpb3Q7VlOvla113f426VBvNSsR74 Dt2qOIpalW98O0IvfiVaEdIYHpbuRhg0YvloBiA08onG13G3AoIBAQC3a9j8b/ms gBiPlsJyXHrPBFylPoKx1BQEjes83ONe7WUcrWFi6Ks6aXKKIKJHMIFO/IJ3IN02 QVpu5WsqlghFqqUv2myRmsMzGv2BFWOFo1GyGhYZfQG6QNb6KjrBzDLlJrb2X4If FfGJDbUd//pIazMyUzlwzCvtrK1ttmKJAnojFVUgwKTWjQXuozG/XU7fvNQ4GyfP VTpfJcqUZH2xJIX0aY2LXiVHOTQIclh4sZ/Oz+BYvsIaekTGNEl6qXH5yzjetlAe BpQPTX8axkTPEG1ABdeRcjBONOHGFEV67RgSLTVTTz78fPSfO1QxBYY5KFAJrj0D 1zdaAf018FyDAoIBAQDzBdAWwGPbxQtdHZ70Z47j2Bptg5Q0++h4zxieP8hVDTW2 aXmp4lMh1FA5V4/iKY4Pp/lbSb0bXIPPuKfIYL7Ju58WmmT4bxLguxVqaQAi5my4 c/bPvO7hL6KWm1SWwiRkcD297VfFwdDi1SPTjBFVXD98ypgpUm/i9r2tUtSZMtjn m8DStMbgtx3YNV70J+sgnOjHEEZPjwwvgADbfb8o0ADqf07uoCm0JilEyk5sOLHC RoZVDo0AVrPGMAR9RHPaRTdkw/hP5Y/+m2tEQTxGyNB1uB9jcfCT2OZE8slpCTpn 54se89Nuuq0B0+ZtOo0g3yY7CLKUJal9eRraS8w/AoIBAAZVZAW7fByXw8FZjFdU mC0D0osmMG8hiptppyDP484IVoB6AC3hKOB4easJW3En3J80mvCwItNXyF6h72Rm D90P+mo/mZYhiPH/0ZcefPRFYnHK8s5ogaHD0WiMAsFkYrGE97ZkL+MQ5+k6nvFt QGA1y2vGcepSMoYfe1GZhaeDfWIuv2TFIiwCbJ0D55jbCPky1QUm8uX25HAapvce zTRLtZBuAKQ6WQEvmXtdL27je0gx52ZJF/zAEhXiAlOI/FWKzejq1LNkuMIag/QR upiH0a3vRbVRAxgAPXeQhaGsBDPEed3pk5w2WGATNWIH9c2Ndc4PxS2XxeKGxQ6S wS8CggEAcY8j3HECYuP/3i0+1TxYP0SEBDOX92DsjdrSuSuAzGhce6bEfDzMCBYP 7QAr+kA1nUGlz6O2yCHplAGTawWvBe+JlFmztt85xu7BzPcN7loDthgV5dsxll9p yYI0L/syGOkMMZiMkWelYrw7Fm4C/Kj/Wm8nx+4lyb1oWfLFdwiOxEm7dI+1AIb/ t9qyJ1eAGRC3kXvK8Rb9O/OVCbGttB0NNgc7ANWXarYYK/yukJsS5vjJp7Pa2KRF QVUHXlQssIqJSqRNAZvQIyTUAsWq7JPZqx2k2vDOHhpSMf4DN9KbKJ6bYaaNmivv R/0OoiABpfkqlFBeCc0JKu1kSrWHmQ== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/cert_path_common_13_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/cert_path_common_13_root_ca.pem000066400000000000000000000033021322470703100306220ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----cert_path_common_13_root_ca_key_rollover.ca.pem.crt000066400000000000000000000030141322470703100345100ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13-----BEGIN CERTIFICATE----- MIIEOTCCAyGgAwIBAgICASwwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjUxMzI0NTVaFw0yMTA3MjcxMzI0 NTVaMCExEjAQBgNVBAMMCVRlc3QgUm9vdDELMAkGA1UEBhMCREUwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCw40B/upIRBI1qsZWeqMgnVX/Vn3MACJWD 3yXyCkJJlCkwM8cdWIr7mD6f/p5kH6WDJoPAYQvNwEVnJxzypzBdMkg+bOBpTD+m bJl18AUiyLsEv3QANdjwezBuEs5jCQCHjgl7Ig5he4IvdrRGMu1cXzKLrD4mBl8Y HIu0qzqzsrsSaQX54kMP+wjyDjP/pB7JZl9Mn4eS1Dd6dVxLTIbxAP347A4YGMzA Jmt6LZDfVNHYXcvI9MXzjvEs+SvGoE8eTg79ESERW+jKJBXvh6nzgkUBBu7zx0hb 5szSuAwqt6/TUATzFbc/5KzJWRDK6kbc3hh2qr07W6eDPoDu0s8Lnt7SYX5Jmk5f B/3JZy0zVHfO8x7ICEBXEiHJFlfxE2owgv/QZfk4C6c7MCvrnfvUTxGjJsoiuVAn r3jf3JbnUYY7MqD7wGktk30hd1OMmE/81SF8MERQe0mS/ZFJA9ljj+RgUCUgrWFX p7+wxGXc5hcGnO9liBkiediiY0xvpctGh85fmGDa/bM6JbDp/o0enanoEdZzLrMP 05XksBNoK0wpXrPyxT2QeaV4NSK/v66T4neoP/6W6y6BGMYM5FMmTrCpFUI7zj/X /fCQ8pK9mcISziTHrgVhdrojGFrcSlEcFfRY1FclZ0k8DpaViE03DZNhsRcmFj/y 6ohup0eORQIDAQABo3sweTAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBq cDAdBgNVHQ4EFgQUHOZyoERFb+Xefjmc6Nt/ORt3bEcwDgYDVR0PAQH/BAQDAgEG MBMGA1UdIAEB/wQJMAcwBQYDKgMEMBIGA1UdEwEB/wQIMAYBAf8CAQEwDQYJKoZI hvcNAQELBQADggEBAAY+0UQ57UwiZEQCjTn+L+itxXYDUzM35BaT9Oyg8Lf6nt6o ZWWEGZmz5MaYz7y+Mp7owRRHv1JhVOOSAsxoTZvG2UHp5oXW/iWPAQXW5hy1QC2A FbPhSwaSLACIq19K+zd1kHweOlU3byLq8p5T9o/c0DSKNvlG9OCQ5uTu2bdlOpTd XZfFz1eQMSZU8da/A/myb4r7pjXezIYXLDH1hPOgsek0X+022sxDCtfpVWCSU4UC 0U/KtFv+SCiHxsXjwmhs4jOxFX24APjEL+rjdmDlNDf5daslmqV58IOngfDDgZY+ S/Nw1m07gmR2ekrdbGqgz7J3LhDUrQ0NGfx/U9g= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/cert_path_common_13_root_ca_key_rollover.pem000066400000000000000000000063721322470703100334300ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCw40B/upIRBI1q sZWeqMgnVX/Vn3MACJWD3yXyCkJJlCkwM8cdWIr7mD6f/p5kH6WDJoPAYQvNwEVn JxzypzBdMkg+bOBpTD+mbJl18AUiyLsEv3QANdjwezBuEs5jCQCHjgl7Ig5he4Iv drRGMu1cXzKLrD4mBl8YHIu0qzqzsrsSaQX54kMP+wjyDjP/pB7JZl9Mn4eS1Dd6 dVxLTIbxAP347A4YGMzAJmt6LZDfVNHYXcvI9MXzjvEs+SvGoE8eTg79ESERW+jK JBXvh6nzgkUBBu7zx0hb5szSuAwqt6/TUATzFbc/5KzJWRDK6kbc3hh2qr07W6eD PoDu0s8Lnt7SYX5Jmk5fB/3JZy0zVHfO8x7ICEBXEiHJFlfxE2owgv/QZfk4C6c7 MCvrnfvUTxGjJsoiuVAnr3jf3JbnUYY7MqD7wGktk30hd1OMmE/81SF8MERQe0mS /ZFJA9ljj+RgUCUgrWFXp7+wxGXc5hcGnO9liBkiediiY0xvpctGh85fmGDa/bM6 JbDp/o0enanoEdZzLrMP05XksBNoK0wpXrPyxT2QeaV4NSK/v66T4neoP/6W6y6B GMYM5FMmTrCpFUI7zj/X/fCQ8pK9mcISziTHrgVhdrojGFrcSlEcFfRY1FclZ0k8 DpaViE03DZNhsRcmFj/y6ohup0eORQIDAQABAoICABCec+424TJSyIFAXgZMupa3 ebiLBTWjmNM4S/W0RmC+AtX8h2CXyQxfqW1EHC2Gq6OUIsdtrBDmAknxas7W1mcV 1Pkd0Ze9tN01/Cplz+sMtkV5QgojBQF9vCHGB+NWHS6fMaotRkdHtgYvk5Bk3dgn 5DUrNvZA8v5DmvybzyVtosCADYevXQ2gpZ6C/G+wQ77jAgvOO+FCVFQKYrl7CdKV fUcTJoqCX0+jocVrh95JDHjU7H3c7Bw4pIAiiPJdwrveKZpX2aYqicc0IhDMdjM4 B15UAG9MRzLF5HMycjIxP9u3+5RlyJRq2luweoYWAhe45iOADHdfN8XPlt2EAN+2 SIUBcOtuEXQhagaVAbFHVu+NwleOpHMZUxtRCwjiPesKMCAPopSeRhFLthK2sciT WETBNpBpsOaVYWpeEz6ockdOp6mtI+uVJAGPLWLMHp9l+3eYI89xR6g5X07W5RQQ 1+oG9y+2WtRwxjlqbxcbIZblyG7O+Kv635tBTLjCdE0eyGFglgGlYPYQjpANj463 DnDNTLCa2GrH8GT7HkZNQxDrJPbXpJp83vv5qXuOve74j9qFETMF3KgTFQHxuvAA F0aEVP9k8ay4IKxcskyxFeLCJ5f4PGUdG3gO/uhzJ1/kIzFL8T6RRc4m3OSZYxSh +2e+mlMITqLmJhLvC/ihAoIBAQDzJTwHOVkwOD2SMl8jyEmRfsTEt3SC65sMKr8D oXKv9eGJxbsCKE1cwK2GNSpw5q1KtNQOFuHJXjQeKJojxKAKzuER/2nJPUYCQmhs IqTLwimsRb4dAeALFfF+clnnJmQHtLTzhEoDXzD7fZ0AMmX2WU0xbgKOq3ZIVceY 5rjmQCQFex5hIp6xpR7tvuG/zsxJVbbZm6L7bTs0XhBNXHymPwKO8DJsGQV0utol Q+4ncIHeBv/mXtoopDbOgmo6cqyzWle/X1nIl1ZEA+lCPX9Nn97pE4noQdriBd7d lzqocNLPZg2KseZlulrvayz/yVzdDB5HpAZCiomrw2tW//AbAoIBAQC6PUaOIc/4 r0MoCkdhGJg6l9ozbMJ2FgUt8/a4T6L6Zh6Eysl0HXZYMvYHrPr2kbC6C1CkexXo rxXJhmM8FJqbtweZ2vzBf82wu9SEo1pEA2xNU5VYvqGsxj//o6MhMWDaEJ3+Oh3V le+kYuopoGLjLw97RuC569TYqmcBDrStChlmfWD+1eyphXtHt+kkCjN0RFf6zQcZ uuXKxN/FJJ9tKEeXwJB7eu72jY/X/IlonfUkh8/ysUBKl3Vt+ZYwDIePudORuJjg saPMqLn7HYdUyQONtueFuIyBY3LqF+p/2J7VHjMnZEhTT0N91lZsCN5Nkyph73P6 qmmZwPoCYiEfAoIBAFV29Q6k/dCRNDM7OW3ebN2TbZ6nzXBnWGyCafnguetXxhsj QYSUnfzITTYrYeulaawku5ToPh0F29Pt+aAw8QBbj4k/+fMecolAxmucEcj9SqCf MyAHFLVQ1T3Y+/jf6bE7t48RJOLihtkfYhw7mtNouFVzkbqMUltCq5H3J27nhMHY cOk7vgQ7Qg/XVIqTKgNs+YSrzDIMRw81MQ3AQKA+7atIirCsatqJAzyuD/wU89ET LMfQ92XpssoL1UMOI943FzjRT0HO0CfAKDF8ZE7orvXGRGc7HrDr11aUXa3vWmpE OOZTeeSwCF63kW2nXdjk9Y/A++JPx+x0GDrQY5kCggEACJcw/PdkT3VOJLesqTbo NrOwdfTLV4UWghMhy0ipHOG/AKMV/cwqHFFldd8tyFfaDgrdkmi3Dv+cgqo3Q5sz soET0a3/QLGzfDZ9zAx46nA5+6siVXCdpomShCk5KhvL+uMPVp25qJN89Vk2serb BN2z2hzf2tOdAs2BaNQT03OGzmp0Ie0eOIeWsy0xjN8HlpJceI4iiLZNSTghlkdl LzTPcJmKUJfQFAFdpDna4L+AgknddrVkYMxxtzvvCJJbYm7Q6oTYUG0BQDx8L7Ai APAwwMWyEkH8AS/kKhYmU/VbBjuZYnTGvUkHtPNBE0SpdGyYZOIVuHdJ3bTAE4IR QwKCAQEA1itpOqUb5z1LtNFGI6fqHtBmTaoRq3DUa9ZBGqd0Qg2XLGDhByqKyQ8y ufyR/cyuWT9XXvq6LFiRfKpskBplC5hY7nyaZWetTLgHKNdFsPNVuml772HoSbbz 5qX+C4VEDqo0i3ACbuq/3oRqNgPKq1hXoXu3SN5hm8Q5sZ/dxNJIoh5OZfd9SpNL ToPZisT9rbKB7H8+h7cAcofpxIOqVdKzN/Hjj/LNMfw5O/HS9ECX8ezT86+vaPG6 2Uvo15k4A8JaSST8RQvIgZb0fFXEht+bo4sS2RSgFcPmKn9N64xfXfAuCMdRtrG2 Sxhs0n+34U1bgI/y0I/cPraF9YFZuA== -----END PRIVATE KEY-----cert_path_common_13_subca_ca_key_rollover.ca.pem.crt000066400000000000000000000035561322470703100346350ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13-----BEGIN CERTIFICATE----- MIIFOzCCAyOgAwIBAgICAfQwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1MDBaFw0yMDA3MjcxMzI1 MDBaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL+IkzxtT9xP+YQj/gaCJdRobZXyiWmR nY5RAwpvbp4+bnhKuUupWcZydse3k7HA/Nz4wKIhC2xPjP/cORyvwtW9+MUz6g3t Wy2QpMPTFfKmP9pFQ8zpcUbTsquoVVHqUtMH8lFIfrNDYCEYA6MUySzCSYEe0wz8 2G8T8Z4ht1JTaBK3+GCrpUPCKAcCBRrOS37zf45cI788Wt1LKIzIOjuwSh5M1HFG VycRoQWrrzEodP/va7dGlsTDJ2ozfgHHRkfQI9S3jvQshktKPMYmRzyCqkMDAHRV 8NdFhv+SFZPfvPhed9nM0U5h9LhB4F6r53LQg7QXMLHqlVL5Q2EifwgurXtDjoeO bAzWHjXLI5dVoHCMsNNrQ7NF2OULdc+GpmFND4lBiz1Ptxd0mGNNGvczr5TeTplK gRCcF7Z/p/EC4ygl+4IgWK+wukQv8RMO0UJj1nk+KLHvtoGQv2Tjmx21y3W4f2zC 7pMCkUb5h5B+0x8g45wDizMd+aA0yQcVD4UkZsvx+dCRARG7jDCAGemDZ0DigH6Q Pa4ZWM9Jp7hPYblem1/EjxRvbxK8z0I/OiMQpVWRuuMU4UpyASkN6GSgUlWYVzrf t+YSvMXMPhvcbQ2tt8Ab6uH7ltlg2QvDX77TiWCGLEKP4Z3ibI3WzhP94DH1zurr uKuIcUv/TR5dAgMBAAGjezB5MB8GA1UdIwQYMBaAFBzmcqBERW/l3n45nOjbfzkb d2xHMB0GA1UdDgQWBBTvsJro/tJU43bsCuy+cuXejTDS9DAOBgNVHQ8BAf8EBAMC AQYwEwYDVR0gAQH/BAkwBzAFBgMqAwQwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkq hkiG9w0BAQsFAAOCAgEAbp9Jn+nVckYMCUA7J/qlyXIcwVfQ6FRzXcnJNlTy0mze qSOB3OASkDYwSlwE1gCUSwgaIu/T2C+DRnnxSezGIYiZLv+5iPtByzb3VbW/M6HG 3kCt6ztcFY3MI3Zea2g+9S3pKXXG3cY7wODYSnWlDTvZ8p/zC91Iwc38ziqu0ZPv qW+fAT4DKlvNfmvFkzCz0s1UtR4vN7s8K7MelbC70lhjaVoNPLWpgsUFzn/JRaQo pZ3Z9u+synDr9zMDH8itRIGxx9s8AOBrj+LEnJ8xea0qCeFiVuZC3jFVL/gaK0nK cHjXgJnvbTr/F3k86Lknwtqk88MYbzW4gBwjKiX1SzJT++rIQBAd3mF9QrOCgir4 7lB7shlEsHEGnhZwI3TzraV/gcK7Vr0kKPaGmck/HEa93i1zd9v5iHL6QuzH5cfU AqImVooasej3huftKK5keX92PprS6+j98bOa7KxAyM7/ZxPDRQakc0a4oSsfJGUM OpNVxwNwyToNVbpkaNY53Ug6C1vuIwK4XrYTdE3RmfZXbYjctR6yjkO9fAba5YHB KYQCb6DloX2YCQ4MQdilVTcldi0v1MAMKAb5oZ+mYju66FDN8ZL5IAyU8YSv9Svq OJJfCOzqjRiz8HR7TnearraMNV0/FAp7KMSZT9AcDJRhaLxLJDqOeQqpAuUwYNc= -----END CERTIFICATE-----cert_path_common_13_subca_ca_key_rollover.pem000066400000000000000000000063661322470703100334660ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13-----BEGIN PRIVATE KEY----- MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC/iJM8bU/cT/mE I/4GgiXUaG2V8olpkZ2OUQMKb26ePm54SrlLqVnGcnbHt5OxwPzc+MCiIQtsT4z/ 3Dkcr8LVvfjFM+oN7VstkKTD0xXypj/aRUPM6XFG07KrqFVR6lLTB/JRSH6zQ2Ah GAOjFMkswkmBHtMM/NhvE/GeIbdSU2gSt/hgq6VDwigHAgUazkt+83+OXCO/PFrd SyiMyDo7sEoeTNRxRlcnEaEFq68xKHT/72u3RpbEwydqM34Bx0ZH0CPUt470LIZL SjzGJkc8gqpDAwB0VfDXRYb/khWT37z4XnfZzNFOYfS4QeBeq+dy0IO0FzCx6pVS +UNhIn8ILq17Q46HjmwM1h41yyOXVaBwjLDTa0OzRdjlC3XPhqZhTQ+JQYs9T7cX dJhjTRr3M6+U3k6ZSoEQnBe2f6fxAuMoJfuCIFivsLpEL/ETDtFCY9Z5Piix77aB kL9k45sdtct1uH9swu6TApFG+YeQftMfIOOcA4szHfmgNMkHFQ+FJGbL8fnQkQER u4wwgBnpg2dA4oB+kD2uGVjPSae4T2G5XptfxI8Ub28SvM9CPzojEKVVkbrjFOFK cgEpDehkoFJVmFc637fmErzFzD4b3G0NrbfAG+rh+5bZYNkLw1++04lghixCj+Gd 4myN1s4T/eAx9c7q67iriHFL/00eXQIDAQABAoICADGmOSiOW4fMMW2IGPbd8Ol9 Qn7+tpEnnpSAOo4PcbjSjTdgg2TyGuP+0vyVgVMwKDwtvV2pvDjQ7Ed88k8V3qci jiSsfu0qTJrkplle1A8o+l9d2iP5lZQbF3M4+Rj5aYvrwOxCIxncCsS5YWP6ZOXV 3VD7yRDSUFaG8Hih29Aa79z+VIPWqsoEP/UFGIao2FgpzbR8/QU7I4C+1V2dH79O RQBSwTU12yy0/K0oIotXJfEcQqtpQHbz8bktbOoQGo9ODKO9C3EPQ6arsVJaJNgy NOmXExyVFI/xJXwFhdNlyaoGbwIF/nHXoaTL6toPrLkOBT3/Tu+n1BqEo+s/knb8 7U7GOCwXK9d7Ry2SU2ErbmFlR5x/Uxg1kWFfjiS0fp+fLKX5dd7fUXRr3UO6HT5+ SiKCw1yKhztSzweGITO3glEfSA+NgvZQ6fDwDXjNypvqnCT8EjFdaLGEjGLYcc/6 jmS+FJB3g3CmUCjLyVTzR0pL1uL85TWQ8u2Rr9214bFC8p12O/GYJ8penR8zSxnW N4ZHHkFdwwouxztnN1g7FYyHT3j65O8v4A+Fx9xANp6KMaA4Vzt37X9nytdY6eqr DaGBrttkR4F7SovyBRCKIMtY9Nb6ts2j72V5ygm+RgfbeFII9byZgjSJURiwoJ/T 3hUmATNpsIQ7ITFeQI8vAoIBAQDt9Dsz2/LLH1/zpuH0+BsAV7JbmgT4A2NxLtVX q46Hm/w5WXr8/Qf9Ve7kfHEDmYeDxNay1s5bGGp+EYxgybt78d7DJP6YLs0rQ2OS kE5JDxLCb4NrukHcwScKHm4SBwpbF5m0E87/DdTT4SRhflEurJMUcXVVnfPdleCf eHVnBhii39z0aoNJ5+eluGqnhBgXMsxNIXn/J2cKkTzZSbWPl3vn0EmP0EXsujpY eh9Wx9wyatHiKEu9rxe4Ph9Ul5pMl9RVoE484FLaHmISnaExL0PzWBOqIrlpJhvg nLRnNa/ckr6ibFdBys3hvHLU3OealKy1RRVBFOnwxV6X22zDAoIBAQDODxxHjyoL 5UEd421msKSjWTNvD3DpBZCUcFUzmu7pydCXBqpKb0v1zE+E4UQsixvlOMApEuqH b5zunoHddSCrHX1ZoMXL+0OPZgR03cadTpxwx/VEy4cRXiUI5uDhd2C4ep9wsbWH HvunEdsnCgb/nj04e3s+EvFbfcmQk5UgfMpDZj4gr+QlsShcfleDEGMyEC1EZ6M2 jcSnOBMXaTzqqigNlsUwgTQMaTFcnnYzbJtoeCAYXu4PdeXx0oq51NyLxAUlvxVG cq0yF+j6u389TOFG8TYNzV31PWbEtYiIdov8G1cmj8XTHw/nC8UtulhvSpIoS21z bYgUUOzz7RZfAoIBADxP0g2j6xcm3aghHVZ86EMe9zsWf7npCfRvHW36MscWd0iF 8JFdBQBmHoXVMMPrzxhL9OshXO5j8uH/SqhhmV6iAIdPwiQKgMA9dWh5oQ4NfwC/ SP0uGXF9l4qOCfIRzMMn6TJmbungtJf7kcAQRz1gSms9ErNftKbuTR++ZWt2dRob SaK9uIcr+1/arVXGOmDu5C+Mk6Jjd0+LXnPopdc+Ww53kZ2c+Yw164HvejABukMh Jg9/jSsHzShKvqAvSNGvDgeh+RKe/QECAHOddnTD+SIdqeZOpNYM7bXxohwi1G9A 1obOlRM89xAHNsfTMfTRSDEt0GRNi7oWHJK68AcCggEAYBeH1o8ayoVUgn2mbPb/ L/XPGIGY4/HmZHKmKPSdaYTlsyg2jZOtVqi6hHsQcb1FevWmFwFtQU95XYWphf6z B1kvNXbWBrPb46ltdppdnsokBiwZYsWO7Th8CNSyFjK3dhAo/kLBJov6SwT2sBPr A5Vlc0uSQ3ZN+56DOtq39nh7UkcBvfiIalNdQRTh9orT12rX0UiLQkuGY3yw2oAH Gl/TYdLnjiEShp8fl9OFx6FkL6mlPfg3CBqw6r6GVva/CqaUx+9+GmYsAmpICXUa dxm9DHo7/N/CazUBEcaeLxUpXp3ZXHA7jqKzpclFYHe/+dZKpmPWXLe9d8vtVCtB /QKCAQAE/2lnZQG3u36jpWsExzFKgml7DYFBsfv9ZyS0NuIlJgicPD1oXGyNYIn3 me9mIDgpgHmFjfRa0c4xAoEB1IfMjP3MQUavdg+riMaxd0HDbQ4inmF+N51d3Zwy BjoJUL0nwazgdvSmq/9haDWzEPYc9MaZdGE+buU9FUoB5Dk1BIocl83AQEnRhueJ +gmgdx+bEJVjoZZqwRn2qrrs6nihaKL18rg2o0vHlT+nDGDNcQf2pQrWBzYCpP/b UYSFJ112sfhPby4N4sF3tvd8GJBlSUwfxF6T27do9gOXEL8GR2fY+rgEEsPQbjlZ A+xsNK4J2N8gameHv4bKr/A2e0Dv -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_13/description.txt000066400000000000000000000004031322470703100256500ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_13 Purpose: Checks the behaviour of the application when a self-issued certificate is found in the path. This path is not invalid, because self-issued certificates are allowed in the path and processing rules have been specified. botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/000077500000000000000000000000001322470703100225705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_ee.TC.pem.crt000066400000000000000000000022521322470703100306660ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTUyWhcNMTgwNzI3MTMy NTUyWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJ6UeEYTXI3cnRaAkOLa+/VstMu74HuGazbH C0oA3B0DTDSBgAuiDnslKVp4SzewXnNmWedHB9vlbe3+PfLDSObatkC7ZvzmfR/j I4jeftisGDzV6EnT7SNmlelj8nX01R0sqlXilim0VCCq+H5eKNNyEKOdnxSQhnqE WIw6XzLH3ABNvV/aMQILwycJOg5xWjUSEsBSd5Emnbbtit6jmVbb/6w8CyhHhdcl SW7kNxtavhJD2IZKSMJ8IbYF2hk6b1KdjqYXXnXHORjzk+8AEAe28Ka4wBE+/wt+ cOeT4ZJtWX53koHfV0yd8Cb0hFd20ddF5k4cXT0bOKYXgne5tBcCAwEAAaN5MHcw HwYDVR0jBBgwFoAUgBBiRHuqS78aqSggFPV1Rz2pCo0wHQYDVR0OBBYEFNyRWvw9 vi2mOqKT7OWl5o4ueRjWMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAW/NZ08Pk wNcISY3WRhI4yL/n+O/WsOnq9ZP2m95EP2RQj2k8H01Vo8i5rK8esF85FVKVHzJb iOWdEkF5t4gehNWHVjfbgOLpgYjbIGvCGJgZofaLxQ9qOEuhQEue4YAuJNvoB8je W9GD3BRCqQyOhUYHuasLUYIGLGKbDULNcok9wOSGgpU0UATho6cLzPsGhoeHIF9+ 5Wxiof2YsSjAJpjema0pp6rrnrM67hfCsuDYSsRCsW42vLgycCFYKZlANSoSyf7C YkuUsvQklj3vpDZ+RwPbRSHqjzytuMfUUOIz8JAChT8TnR7uOL74pZIDfo2DLuWG bp/iYiNm0IgoLg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_ee.pem000066400000000000000000000033021322470703100275670ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCelHhGE1yN3J0W gJDi2vv1bLTLu+B7hms2xwtKANwdA0w0gYALog57JSlaeEs3sF5zZlnnRwfb5W3t /j3yw0jm2rZAu2b85n0f4yOI3n7YrBg81ehJ0+0jZpXpY/J19NUdLKpV4pYptFQg qvh+XijTchCjnZ8UkIZ6hFiMOl8yx9wATb1f2jECC8MnCToOcVo1EhLAUneRJp22 7Yreo5lW2/+sPAsoR4XXJUlu5DcbWr4SQ9iGSkjCfCG2BdoZOm9SnY6mF151xzkY 85PvABAHtvCmuMARPv8LfnDnk+GSbVl+d5KB31dMnfAm9IRXdtHXReZOHF09Gzim F4J3ubQXAgMBAAECggEAHjzgPDh35wMAnyhPuDoaXh9m0AxYjyU/71d/4xIL5qpY zxA8artxeHDLFFmougsyz11eWjfUm00Bq6ZViKNNFNvycaBqUGHgzQJCJdiLJmSW UI9XNjCnYJ8wiarJsk1Hj8MTDcJhcL1WZ05CiNIKhdsTqicljMXMJrNysPZ2bZea a2dfRDUuOJ7ViEE2uHvHMmxt5et4j9lzZqXCvFgqcN08Nm0Q5RWJAzbdBnszP2RD rRwda5esRTlzxqYMickHX+h+t8a7RpbqeWRenHingB7s/f5OzlUIP/zM4lfsXgPN dwQLYUu59mGPkj0I0v7pOznk+u2hDMSEAZs8eQVdsQKBgQDXkWE0j0+GeHdnK0Hu mUmjfLIpN3sIOuAbQJ2SsBKEXpw2ljgXINDERoIAdza/ie12jOlzKZHiBgJD+2h8 o10hR/jj7n3BlJEspWcl9lYm/XPxlugru4JnfOaETyh3VM7v4HXLnJF++QdPDQb0 V3Ps/2C+JjgN74fAlkaBqsR1JwKBgQC8UsfkZ5rE99UnDonT61j9DcmPkxOscHyW OpfYlzr5ei0kU39naXgV8MzoOg6Ych/aJm/NjGOC4CB8on8QFtRrxyU49u7H/EI0 o1hQVO0QKYZCSZFyTiPJiBP1LQwsKPH5a6m92sMRwY4rb3GKYubAijCu/IA06MZP GRoLHCN/kQKBgEwyEfbfFRAF8safzq1Et3e3Ms5I0w8kqGRZoZjg7ZqmSncs/+SE 7+YAuiDqAosPeMUnp7jSH8ORtilLazJrGBcUdpAyk3biSbJLQLt1aBxeCCaD3crf e4eS6XQo+re7XW4CnAB9dhw4b/HsO+IQK2TBG/P6VGPwn75eH8vjjY+PAoGBALFs jEb0FSxdEcSqPdAaesxuoOdTecWMdNRUf5rfYACKytzejbmv9CM3qtVfXUDixH+S luLg0SAMaI8DyRIvcBHanYb9nhlr4DQXcKy+VlpTxNnO1ekLFUxZl/P1bPJt4QtM E6962y1vXbIuXJo0c5ISn6s82M0AQVVkINU2vXsBAoGAc5RdGI9caVuuVb1fkFLx 6NU+zqYTHLaTcEt76Vemd7phQu6PiW3NXwT4hlQLsP/EJpTRQ85HjKcCEIPi68Be H+Cn1csWXWEFZ9OcXrvdRshb9iMuh8NH2My3R0fS/gcRrwijakTelqSiytS3Li3k sDIMu3mN2lF4S8Sxwg0RnyQ= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_root_ca.TA.pem.crt000066400000000000000000000022141322470703100317170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_root_ca.pem000066400000000000000000000033021322470703100306240ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100316010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjU1MloXDTIwMDcyNzEzMjU1 MlowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhDxgvyYOTaDKq8Rm5wg32tAZhS09dQF3 ctnnmO3TRg2Dh8S3WugJpNAk7MfiqsoKieVV7QgQWEgay1QfVmZkj2jb8BgpNqsl 7yy0vaYqvnCFyfP/NTXKKE+ntuRuYIYza0wnYia5/PKygBx/BxuzE7iQoTJC2Nq/ T+JTNGlVguLOYkwYu8nxOgVG9HTg0O1qi/ZYcdg9IhpoUArickVZOhBULftIOCw6 E5j2Mz6dPHzQLWPyfo2YgW9+MT/r7hqANNePvshroaPoxo/ksyW1eOJw7LdrS5Kv m133KwobwPQKqo8jffEufwYZu1s4XXUJSbUYl484OXi0FbNNulL6wwIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQUgBBi RHuqS78aqSggFPV1Rz2pCo0wDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBADicSXTGuEX3rCU3THlWgVNzCACVo9TM xWtI36Rb5CyiWnLYO7IG6S63mqpAUgkOz+aw3RqbcfIyjIV1FaAtKYM9+dGTNWhe DBXt9A2JiIgQqaRBYKzPUToA7N7i7Nx8bjPzoVIeUv+qjdg/XU8IDy8dlVpOFpqX ZIHAIyNrRMVt5gLAbKyxcANZi1ruDWh1Abj3rr2NCJRABaO9pTxwmMMrDcgQF11k 5rTBAcSCtIN18HBPOZteuU63DAMDLl73HabHyJsDIqA0wtSJy+fQTNvUlJm2EYpa W4C78PmJXEchLOgHFomdq4KRi/ayfLdLbYRFS8QJntflPaDH/4VWJMk= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_sub_ca.pem000066400000000000000000000033021322470703100304320ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCEPGC/Jg5NoMqr xGbnCDfa0BmFLT11AXdy2eeY7dNGDYOHxLda6Amk0CTsx+KqygqJ5VXtCBBYSBrL VB9WZmSPaNvwGCk2qyXvLLS9piq+cIXJ8/81NcooT6e25G5ghjNrTCdiJrn88rKA HH8HG7MTuJChMkLY2r9P4lM0aVWC4s5iTBi7yfE6BUb0dODQ7WqL9lhx2D0iGmhQ CuJyRVk6EFQt+0g4LDoTmPYzPp08fNAtY/J+jZiBb34xP+vuGoA014++yGuho+jG j+SzJbV44nDst2tLkq+bXfcrChvA9AqqjyN98S5/Bhm7WzhddQlJtRiXjzg5eLQV s026UvrDAgMBAAECggEBAIIM94FGpi6Ggoyn3iQ9muEiZNbrhVO7m4Ri9jkbPPva co9mUoWfS0zCQG52r2AU0ISJ/hXeJmUMlP1/wEoy7Zd1I0lgGbhgXjB5oVAbSlJ9 S7cwtr/YJPe8T0+6HSvlEFDoVptbRvOUpSUF4ZBWF6q/i85dJg0sJZclGXukVKsh hAzQdrrMJIO5iysUmXEs1+3HjnT7XiGeJvGUpJUu8Hu0lAMxMM7iHmYbnbjLFcqS qposhRYdJQPanFPO5eWwLzBAN9dhbwzGy3Daty8Q7QxSZ+DbH9ll72kChzEGwRCo 46504H4yTYudHwK7NZhliUcut5kjbsgGtLGczIzNAKECgYEAz9Ic1JJYgANJn8v1 SrP02ISa+zwMt9k3FL9js4d+zH7MLRxciH4URd1LmFgCxUSXUzxo9ouEbUMnKnll T/uEwaF0UwKPNRYMnV3NhgtIwAoGDPWYQP0OMrb45Z6hCxfH0Yvd6LwdTr5SShnd fViSDod+igaAjB1+5czccTTqYRkCgYEAouRmsuhBC1hPgzPoCQz8un/I39NPccFc Of7ZWMXa+2x4DLJjCVkvcDAQ/t1V65k00Q2lA1OU/xq6bcunEGIfFCakNT74jM/+ j6eNnaZUXgGZIXzjiZStPE55e6E3DS8QKjA809O2rJiRhA43Cei2xj+OVMTq1LQX PfqatBj0qjsCgYEAwjHcruZxvG1WBvRXqg6u5QREri9W0xUu2zxctg4O9pglwqGV 9hWabA517U2QiTWnEiiJDJkijdcKai419Z9aVnXAdTEXEMwhzYsx2egBezHipYl5 VIEjG1DPFAI/ClaWacEBA9GEsWg3DPdOeSqikOEb5W5eAJAvXB0qgL6ppUECgYBu Y3SJl8XEp3MzCfEceRWoWcLKlExJXe1fTCsE8wikzGxKxnVBN5RjZd+OqHZ6tBfL +IA0UecuPnHKyHGOM8C2Cj3L68HKw4XS2oypIrgYAONCg307lmsT7GZ9dtJ098jv nkMKlnY8XyR2Jp/78h4zGY0eO1idDvKVSQigNi1QUwKBgHbwzausAVX0UvejvaPa BqTTfJiCRI4/Wvafd/bIFUhe/1NMgl1E1gPogIwDCcyuKYrlXFYPsGiOtaBYsTkh 1Pe4/ypLvXIftgw930gN9JmXXYXNL0gwOB5IHuy+HT7RPdHLdI98IdaTdXKL/1O1 nWilWrOYgz2bJyh4P3C5uYSN -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_wrong_root_ca.ca.pem.crt000066400000000000000000000022461322470703100332170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNTCCAh2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAqMRswGQYDVQQDDBJXcm9u ZyBJc3N1ZXIgTm8gVEExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjU1MloXDTIy MDcyNzEzMjU1MlowKjEbMBkGA1UEAwwSV3JvbmcgSXNzdWVyIE5vIFRBMQswCQYD VQQGEwJERTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJDFQUi72lNX wO3/wvQO00iIx22PMBUgD0gE50m4GMjWmxTLTXRkkBTyIxIQy0ljBTT31YspEtG2 tEovUTRbiCsxPpssESrVdqwHxL9hObycXMvJ3PFxdcqUzSA2UEzY/I62GuBlo0ja TbXtys4WaTMJ9BoBQF7s+XDzgkPpbXRjuECIxsz9ePcccCmB8ocE6vGYz1r0Cotv mns68DXDZT4mUMtE/lkvNEPKpvI0MwvpsSFMh7+NKHvE1yeGw4LrwrA6tInPg0QQ mdb2ukoZps8QQyFVv10Mh18qgZYiC+LjiEV+9jKuAJhkhhQfaBIBEKCgnqcLT8Kp YP34qLwnuY0CAwEAAaNmMGQwHwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVA anAwHQYDVR0OBBYEFJluGjf1vc/EL8UqSKxU95GodVZ8MA4GA1UdDwEB/wQEAwIB BjASBgNVHRMBAf8ECDAGAQH/AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQCK3ytGjrgc 292f2rBlMKDVXAizd6fVvR47qXQWYO4+yjT6FLI6pycnfDHysAITcSZSzgfAd37f URBCuaVd5LWWIuoyNYtwc22T3NVHuHU32NHQaakj7BW/RZIqDc/zq7MjqtU2DTct vMHd0rBm9JBX6UYak7i6TvBLLcZszMH6JJ1oE08ujemCmUUFyooZ2GL5hDHrRk2Q ZEDjOmMMO3Y4z/aJa721/xVse1zMLq23Zbiv/695fl+xefmw1roo3bDITrVsReuj Qf5zPzNsEHsiQh5pA/pYDcu58+zEqUGm9GUE4gYzOu/tgHeNLmY9YhH3p6rMYMBl vAm3WL2XSKGy -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_wrong_root_ca.pem000066400000000000000000000033021322470703100320400ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCQxUFIu9pTV8Dt /8L0DtNIiMdtjzAVIA9IBOdJuBjI1psUy010ZJAU8iMSEMtJYwU099WLKRLRtrRK L1E0W4grMT6bLBEq1XasB8S/YTm8nFzLydzxcXXKlM0gNlBM2PyOthrgZaNI2k21 7crOFmkzCfQaAUBe7Plw84JD6W10Y7hAiMbM/Xj3HHApgfKHBOrxmM9a9AqLb5p7 OvA1w2U+JlDLRP5ZLzRDyqbyNDML6bEhTIe/jSh7xNcnhsOC68KwOrSJz4NEEJnW 9rpKGabPEEMhVb9dDIdfKoGWIgvi44hFfvYyrgCYZIYUH2gSARCgoJ6nC0/CqWD9 +Ki8J7mNAgMBAAECggEAAoa82BrRQy78bHwLJHezJc1kUiXHLukJqMS7mUqyBsvQ PbA7UHFju/k5SYb+9cgoPDgzuTSJ3QjHwVaUvSdHS2Mzka1qdPg+u98aEIBxkv1L Y+C04ulGYiNbxSyOso9ha6nR8vDAp5bYlSogpdhCCwRkGmCIXhNlRn75+GS5/0oM 21GNNYS6OVcnDc3M/y+fqQCXjBUyM+a3mymH7OklMtxC8xgJcNXs/Em1eNTZDpGN flHXrGSkL2h3u6uobWSHB/6NXd2t9lhwrs5gHhgyXVS12mYbfRoPGCqNRA6YToya 5OCPmby+jAthmKqjkx458gZZCUuLcTvs1LYe3hNxawKBgQDJvkEctHrlJWIE59XV Dg14g43EwMsOJHe1E2+WxmkOnQJbsWItNfEcLWjx2tlbsbtqhmJzrjI+j7qNIPY+ OUmEuTpm/C2aNzOhKvtW6xOsSyBXUutPKfubZSC5T6K/yx/HZwhhvk5c43iG1Tid y1AN6Zo6JNFC0PQlHu4nOrDlkwKBgQC3tIKoifqOHzJ96gkW46lZ7NiP57pTbg34 C8FTXHccv07bgw+uaP3AzzCyPblhSOCP7xllqGe5ZagTf09IXWttCTwBdL2yZGza iRVucOLnjSQc8QItkVQDirZE8NJvIGcCM3KotLqg8FEbytZg2S58nFJojIgBzS6j MA69wwhYXwKBgHmUtxjdi9LdHJ1oOm4T8fpXDfEtXzI+uAXgmLd9C4NLDEjGNiyY /Z3FoCFhiuy/x/sC0gJ1UMJzTDIRU1VcoPnjx1aZU8JE0lCm3qIbOdfzzqHRzw3+ dyvHXllPrP15JMW/SkXdssw4KkLX7S7rgGtiBRhVZ+eklf5pDY2GyWURAoGADcNa XqInwWoY8FIOaEaaM4CJIQ7taL7AEStgSoyM5/x1PgDttdVr3XwoW9JAB0fceywg rPsW+k7hbsSE/hjxqXOdqUZDyA+6EA1hK6sNdOegIwLzdNKEhtdnnHambWjyDroo BvezW8dlbD2gHhVnZDKaAfc1YV0r91HsaM8p2uUCgYBUPxU6pyNlZTFVbE3KYaQz kVNw8eoCrWw/FX8bJdmTe0uiNwcaBUrrVyRFV2X8IvFlgzHhclr7z2uJ3Siv8hxg LCpbqahiXs8DdS0J6ItqX5Vnhczf2K7/gUhwBLSsMVzJjUrMZHXq8BgV19aoCnV+ 08k/841kTbRk6KRM3oMTDw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_wrong_sub_ca.ca.pem.crt000066400000000000000000000022361322470703100330240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAqMRswGQYDVQQDDBJXcm9u ZyBJc3N1ZXIgTm8gVEExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjU1M1oXDTIw MDcyNzEzMjU1M1owIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRF MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhDxgvyYOTaDKq8Rm5wg3 2tAZhS09dQF3ctnnmO3TRg2Dh8S3WugJpNAk7MfiqsoKieVV7QgQWEgay1QfVmZk j2jb8BgpNqsl7yy0vaYqvnCFyfP/NTXKKE+ntuRuYIYza0wnYia5/PKygBx/Bxuz E7iQoTJC2Nq/T+JTNGlVguLOYkwYu8nxOgVG9HTg0O1qi/ZYcdg9IhpoUArickVZ OhBULftIOCw6E5j2Mz6dPHzQLWPyfo2YgW9+MT/r7hqANNePvshroaPoxo/ksyW1 eOJw7LdrS5Kvm133KwobwPQKqo8jffEufwYZu1s4XXUJSbUYl484OXi0FbNNulL6 wwIDAQABo2YwZDAfBgNVHSMEGDAWgBSZbho39b3PxC/FKkisVPeRqHVWfDAdBgNV HQ4EFgQUgBBiRHuqS78aqSggFPV1Rz2pCo0wDgYDVR0PAQH/BAQDAgEGMBIGA1Ud EwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBAFaJ5ee2lE7jwt4AqcPk hI9aUBofemgCj/d2/RjUK/9o0L6fDK8AVjeZTWKw/lDA/LXIC24AENDBbpTw13ap dTnSWM/D7AsKNP+wIYl4j5eAAQwrmpxgffaiVvfHi2s4MFpYpxx3xPmJCgwXtkrA 9Ra8u/qd9OFlPE+DzHnuvtkiOVzgbaZmbSLi0Uid22Y2qX6078BiHdpylYQeduTy 3DDELk1zN/uyHTx/qOSdp7tt6LCQb/rtT31hFO8OqFEDblw63iAl1n6wmHZnHZcJ wPmvdqHhyRaEVhiFCyGhDP7ANBg/p8TWlwii6Z3pjkZE6eO1AjE9LKEQ4Zy9kjPq eZ8= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_wrong_sub_ca.pem000066400000000000000000000033021322470703100316460ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCEPGC/Jg5NoMqr xGbnCDfa0BmFLT11AXdy2eeY7dNGDYOHxLda6Amk0CTsx+KqygqJ5VXtCBBYSBrL VB9WZmSPaNvwGCk2qyXvLLS9piq+cIXJ8/81NcooT6e25G5ghjNrTCdiJrn88rKA HH8HG7MTuJChMkLY2r9P4lM0aVWC4s5iTBi7yfE6BUb0dODQ7WqL9lhx2D0iGmhQ CuJyRVk6EFQt+0g4LDoTmPYzPp08fNAtY/J+jZiBb34xP+vuGoA014++yGuho+jG j+SzJbV44nDst2tLkq+bXfcrChvA9AqqjyN98S5/Bhm7WzhddQlJtRiXjzg5eLQV s026UvrDAgMBAAECggEBAIIM94FGpi6Ggoyn3iQ9muEiZNbrhVO7m4Ri9jkbPPva co9mUoWfS0zCQG52r2AU0ISJ/hXeJmUMlP1/wEoy7Zd1I0lgGbhgXjB5oVAbSlJ9 S7cwtr/YJPe8T0+6HSvlEFDoVptbRvOUpSUF4ZBWF6q/i85dJg0sJZclGXukVKsh hAzQdrrMJIO5iysUmXEs1+3HjnT7XiGeJvGUpJUu8Hu0lAMxMM7iHmYbnbjLFcqS qposhRYdJQPanFPO5eWwLzBAN9dhbwzGy3Daty8Q7QxSZ+DbH9ll72kChzEGwRCo 46504H4yTYudHwK7NZhliUcut5kjbsgGtLGczIzNAKECgYEAz9Ic1JJYgANJn8v1 SrP02ISa+zwMt9k3FL9js4d+zH7MLRxciH4URd1LmFgCxUSXUzxo9ouEbUMnKnll T/uEwaF0UwKPNRYMnV3NhgtIwAoGDPWYQP0OMrb45Z6hCxfH0Yvd6LwdTr5SShnd fViSDod+igaAjB1+5czccTTqYRkCgYEAouRmsuhBC1hPgzPoCQz8un/I39NPccFc Of7ZWMXa+2x4DLJjCVkvcDAQ/t1V65k00Q2lA1OU/xq6bcunEGIfFCakNT74jM/+ j6eNnaZUXgGZIXzjiZStPE55e6E3DS8QKjA809O2rJiRhA43Cei2xj+OVMTq1LQX PfqatBj0qjsCgYEAwjHcruZxvG1WBvRXqg6u5QREri9W0xUu2zxctg4O9pglwqGV 9hWabA517U2QiTWnEiiJDJkijdcKai419Z9aVnXAdTEXEMwhzYsx2egBezHipYl5 VIEjG1DPFAI/ClaWacEBA9GEsWg3DPdOeSqikOEb5W5eAJAvXB0qgL6ppUECgYBu Y3SJl8XEp3MzCfEceRWoWcLKlExJXe1fTCsE8wikzGxKxnVBN5RjZd+OqHZ6tBfL +IA0UecuPnHKyHGOM8C2Cj3L68HKw4XS2oypIrgYAONCg307lmsT7GZ9dtJ098jv nkMKlnY8XyR2Jp/78h4zGY0eO1idDvKVSQigNi1QUwKBgHbwzausAVX0UvejvaPa BqTTfJiCRI4/Wvafd/bIFUhe/1NMgl1E1gPogIwDCcyuKYrlXFYPsGiOtaBYsTkh 1Pe4/ypLvXIftgw930gN9JmXXYXNL0gwOB5IHuy+HT7RPdHLdI98IdaTdXKL/1O1 nWilWrOYgz2bJyh4P3C5uYSN -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_common_14/description.txt000066400000000000000000000005531322470703100256570ustar00rootroot00000000000000Test Case: CERT_PATH_COMMON_14 Purpose: Checks the behaviour of the application when it should construct and validate a path based on a set of certificates, for which a valid path can be constructed but where invalid paths can be constructed as well. Failing this test indicates that the application does not perform an exhaustive search for all possible paths. botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/000077500000000000000000000000001322470703100224355ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/cert_path_crypt_01_ee.TC.pem.crt000066400000000000000000000022521322470703100304000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUxWhcNMTgwNzI3MTMy NDUxWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKDcYK5nyMhopvMgchTBGhMBkqtryh/l5+Wh oeBEW395abj0PT7s5Pqn52H3W124g7iO1INKk3U1GOVM1rYa4AZxd8pmM5EeGxbj yvv+O/3NdknqskH2RZGr+o+VRHtMd41SMul9yah2820kOrINYw3NxVF20tgf9Jc+ cjwigoF2oyqKqXmLzk2zhBoEKnOISaimCyXiqXk0G4mngyK3BIU+OYTdgJQjCVZE M44A9/BFHLWr4mFiHfWvw9emee3J8jQZyVG/SkuC7fKS4xevGO5JKbj66iOyPMoZ Zkk1HO7VV3Uw89OlW8l4PPjqYZOgxLCtWQw9qQ1wAtb148WFCd8CAwEAAaN5MHcw HwYDVR0jBBgwFoAUIfJeVTKx+lTOP7Os93S6UaP4ERAwHQYDVR0OBBYEFCiVa1S/ do/B18ZtvnB/u2P1acaoMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAR/FIKCOu GLe/xE7vvtcpdPHu3CURds5P797boZurNNytA4CdZDmATyhRQFTsCmxCyC8hPmBl AQxqZJ75Za8J1IAGYGLjVMcKQe7JzH+2u22AUDuWItwMiKwO81Q+1LahaiUYae+p RxIHamu2qfkxue98ciq4BqKm/39JQlHcvTDvLNXOtU+3JzE0wYbot8eurD98kzCL NRSsgR+DRG0R6BIjGArjxwOhbD4cMc8q2ELpjqXy9iq/YKzNrhTZ3vCqco3/7qVL eTanIpFR8kPHcyXe/Gpham7+7icERbTHBpIqEz/tmCEwShuJUTEzeF75g9e2xXwO pIIGblmyVVcwiA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/cert_path_crypt_01_ee.pem000066400000000000000000000033061322470703100273050ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCg3GCuZ8jIaKbz IHIUwRoTAZKra8of5efloaHgRFt/eWm49D0+7OT6p+dh91tduIO4jtSDSpN1NRjl TNa2GuAGcXfKZjORHhsW48r7/jv9zXZJ6rJB9kWRq/qPlUR7THeNUjLpfcmodvNt JDqyDWMNzcVRdtLYH/SXPnI8IoKBdqMqiql5i85Ns4QaBCpziEmopgsl4ql5NBuJ p4MitwSFPjmE3YCUIwlWRDOOAPfwRRy1q+JhYh31r8PXpnntyfI0GclRv0pLgu3y kuMXrxjuSSm4+uojsjzKGWZJNRzu1Vd1MPPTpVvJeDz46mGToMSwrVkMPakNcALW 9ePFhQnfAgMBAAECggEAL6RVdhIC42grWgKYBxGR+WMT33VTLdNXtSkD2nokZ0K8 Tyz3HrXms14bJ2atRrqpOHYE9sWVmrcZIoB5bwHSq9XbVrSiPS6fc04QBkYr2mWJ zSaXmPWpcRVwZiodWC8zkUVxErpQiXaBbie2wpk4ZxQ0hoYcuCnutQSnrKvD3zec 8OAI2ULcW1snsWwG+uNihGxu3q1Np8cY8FF1m+3CpJS1D9sKW1FTGCKsJwNPRSmH Cn6lT3olLI/L8OgYcfWWAGC482D2Y8dn+7G/qGAlXfqziR+cVEbsu3NcFLiuiyxW hB8Gim6bfo37w5/Uh2+fR592RmR6pbMuBFO5IQyAIQKBgQDjD+JzR7cTXXTbH8Rb eD/rzV6bLQzoBf+1pI8nEgjmzGQJNLvglKSvtY2uQyLZeVKbuPMsSXtWDHwm7PPA 5Iq+RwHFu4YNWRiJPWO3fXp5EhaEZ0wbEYd6umRjNlz3kr/T63HRAFG1WT4gBh1v ztuKgMLB0jdCAHGFJfUaaJ8wdwKBgQC1XJ2wwcEH4XP7nNkPcA3QoWSRdScnfisG OqJfAE7AZEQgy5RrgDJgJnrL9rO5vyI+4hwvlutjdB9f0NIYUDQmoc0OX8e8ZXrU gp7xb9hHJhUHjbsU+XymHzdaR1ppNMubODfBLkN0dnxKqr2kn0j6C6L5sr91PWZ6 N0w1egzz2QKBgQDdBCk4bSYXA3ErmdBX+MS/kjf0c/WMI8qz1GpDbZqcjXcSPvJh uE5VejNe3JqfdSijy3NoOF6Fc8GlYiAiMlOawyNGhTIG7CKl88uMX+dG0gR4/NNn xbhKDgSJTfFQStfOP++ZsOXXz/ZY1ZrxqjioqIzqfOSsqiHVqQzbl9rcIQKBgQCk w25TTcLjOPRYq0cbWk6Cso0eBJO8ske+Efi/XBUvfifSr4C4JTAe3/aBZDAlWLpw 7JR0u6Q/pxh1wM2N3xdx3V7gZy2bP4pWlBB4AYc4JCXIxf8nb/zJIuTztI0ztQ4g hvNIIpKPtLD4WKOPclInL/kw5i5AAbce4yvuDWLFCQKBgQDh0qp+iHZLSrTrtrbO OZbpy3NXAUg3j1P1Cb+Fv4diUuLvB4FXTBW4dm2NM1kLrs8LLQL7V79M2EwTMDOp dlRDPFaIEWo5JGQLg/y087SAoq0ENT0Fd+gvQy9PYN8nVHfrYmbzzkQ0qQJPy53Q zsPTv8FTI17MA5WehFpKyDu0jQ== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/cert_path_crypt_01_root_ca.TA.pem.crt000066400000000000000000000022141322470703100314310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/cert_path_crypt_01_root_ca.pem000066400000000000000000000033021322470703100303360ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/cert_path_crypt_01_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100313130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ1MVoXDTIwMDcyNzEzMjQ1 MVowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoane1OJzB01mhY4CldHdKzF1E2cBct7a i0P6opyZojoL1i2Lxue7RYgy1VslmQ1wG0/ETVgGITh6jJgcvejOJqxOA6tVFsSI MrFTXXzhPWOVajEkNvBUDFAK++HPTU+YREampRTDWrkguOljP4uwnCyaQ0kG0WWj Y10RCWvnLTOZwMmnJicTvDmYnbyg67mdjFruk1MghOwnG1cTfSyIh32tIZhan/ro Dd7H7i1Cfkz9w7FNvcmSnEquwwXEH9AaqaLB/ZeEGgyyW14xGxjMRhIh3TjR2FyR 3qwjKmemSTlKI7WvsehDcuU2lbiQXXEQwVRZTLjMnS6wdSZO2eQsQQIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQUIfJe VTKx+lTOP7Os93S6UaP4ERAwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBAFRY7ixueAFLrx32Ma2ZT7k6ny6d6MGM KYJpp79ZLhPycsmzWYo9nhg7CmwSnic42IryrXhc80AsFNlSXlRzaWqtOD6gWEOf GqQaPCIVbqReP27wxqJo5q4eyacu0Yo0gZIRMiTVtXpTK1OkfhJEPAHheFxh+yCF 3AzFK7atqJbLdnOPOuV9mUWv+V7H/pVyTtWH47lkEyCfj42vo7yaX+aArhjpat+A X5kD0YnVorg11n6wpojsR6DtLwpmrhEMEEf0baP3zeDChPTzrRyx+1aUhdBCln+r wF9pKIvPKdF4DztCENEZTVhvRA81P2MkqTzOVQdBmp08cekeEa4vUE8= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/cert_path_crypt_01_sub_ca.pem000066400000000000000000000033021322470703100301440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQChqd7U4nMHTWaF jgKV0d0rMXUTZwFy3tqLQ/qinJmiOgvWLYvG57tFiDLVWyWZDXAbT8RNWAYhOHqM mBy96M4mrE4Dq1UWxIgysVNdfOE9Y5VqMSQ28FQMUAr74c9NT5hERqalFMNauSC4 6WM/i7CcLJpDSQbRZaNjXREJa+ctM5nAyacmJxO8OZidvKDruZ2MWu6TUyCE7Ccb VxN9LIiHfa0hmFqf+ugN3sfuLUJ+TP3DsU29yZKcSq7DBcQf0BqposH9l4QaDLJb XjEbGMxGEiHdONHYXJHerCMqZ6ZJOUojta+x6ENy5TaVuJBdcRDBVFlMuMydLrB1 Jk7Z5CxBAgMBAAECggEAG7taYo3y+gh0wwnMlztAM6HhCcJEfRpOBpBTfRQchbfr 4mJ/RRBo72FRCQkA7tufhMve6n6kVIwN97K7UXePb5JkspvwNX7it0F0gcfDkqaT 0bra0cLRxCfx7mn6x/IUtnehLBXe+h/iRV4h3Jt/oRbEorCzBvYmvEuRedqE9luL CqKQktW9aEl+gqPpCoHQPJHZ5APy6Zpa/yy7dfsf6lde8v9FXk1pxKyebM2JaUG9 o6Na6+h66uqThPuXb515YUrWlYugx8Kd21p7u/jBKmofKtlsWxljNV9g90YiJvok Wq6ZtKRWE8MrHEJ6PU4N2Xyxz08d0emggYkLHMxXzQKBgQDWd1/XP9LaqgK4V+7E khOmAChO7I4gnByCYcfitElL8Y3jSl261d5fsCVbddHHs/Y2Y4sKNuDhTaLOJI1z ugmRfssDHh6zP4KBINhD+29WJuBscB/6YtTD2hOUjEgZ36ExcSLWFupA86U6G1y8 Kn40NAnWsyxC0Nu+TzFeN89WVQKBgQDA+K/VqcMBVQzZxLc9NC/usTo8XzKNwYk3 JiCds03jXPB+UTWj7S8kD/9LhZ3kjl4RZua5lwKttjVIWKxwdGtjaYnUtpTSnvj7 rVEOHVKNRUoj74dVnHyN8H+RwDzs0VVNBjDPnV7xIy+YBjZEi7/1ZmzcCKVWwu0n k8l9NCAyPQKBgE0ru0La5mZkUoI+sd3tqkBLQjXUDPhS9Dc+NAyxTsaS7rlgowV9 u3y3B1o3tPqlGO1NOFS+loC7zN9ca8G+qX6/HxHKHsXlDnKkfO1JZjCb4JlkZz1T nreymuUS7UbSH1CJIz3iFPy2LzgPbHkQ2USzjO7CniSUvt1l5Z+/eU3ZAoGBAKOt TFeKmqDypue/dz0umsl3AdJbXOHoGp7wdBHPGG2VU1eRQlI8yBNqjjxcpURLjXZt NZ6Ne/Qj7KXksL7hwISd7A7Enw7XUJEIvQufy3mQIAbDEKOJDAzIxSu3RvYHyLaA Xb572R/nnGLyQe16K+PWcNdhbfxdchJzxB+yquxxAoGBAKoK+4ttDGwN6T6JFpqN 6IxO9srqAdauTnmFutzPX5BWRuITJEzNg8rn8Z9q1aIcaNhMMHZDVwbBrdi1JfaF c3ln7vsHV7FvGc1yk8GpQKBcZiXqQSOKGsRciGjc7hOiVTo6HE73ZYf1sQzgbp/B l0VW/4Byy7d0QBt60zVsEXcm -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_01/description.txt000066400000000000000000000003301322470703100255150ustar00rootroot00000000000000Test Case: CERT_PATH_CRYPT_01 Purpose: Checks the behaviour of the application when the signature of the intermediate certificate is wrong. This path is invalid because the signature of a CA certificate is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/000077500000000000000000000000001322470703100224365ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/cert_path_crypt_02_ee.TC.pem.crt000066400000000000000000000022521322470703100304020ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNDUyWhcNMTgwNzI3MTMy NDUyWjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAPTzDRCFx7e8LteH+ZyhKJGfFHCtDY6f1/69 MTFdMVbG5mzIS/fzKRQX24JxhODSpEUhJalm31+rY2/S6QmRLiP7l79lVLSegQFG YQzK7+czcmhS0aSfb8peMfh+hD6Iu5et+cySKw5kvgt6/gdQdBd3HGysXoarLHdL /k4q7CcBNLyOIsdfEptSQudmzEK+U0HWsK0FjvSn5EMP5pKGRiUJFUXVZgaX9VgG QA9FTsU8w2ISUHvLcAStH2xrxFSu30JdaxOMrpgYv4y5QMxzWB6qifYcIP5WnFlu 6x8W89JB5lb2KmGGClqThEjuZUE1KPJedz+96wgbcwgIBBcfdIUCAwEAAaN5MHcw HwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYEFKviY4/z gE5tIlAXl+SWZhenwBwAMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAlB7j/KSh vYSI8KIgtG6XOhkTu5dpor8zO/4mq/IcyPdaLmjBhPj+DMjskEzmZF3j5KiS/MFG bSH/helzooAo37aF1o62kmB5UxXfC5TE148waUZ/9I0FIizII78mFjC7djjNwZdv HDhNJ2gui5FbxLCrr+IblVslM+84C+uEoUddKoSOTAiCXSxy0jwoOVv/KIowS5Xe ih17jleq8K26Ivnv6nVLtdf/+BZLKhBBmebPJzJM/sCw3GruDpA5XeTLxqtmHJPl X9qV8WojqjNr5UjXswYTqVc/El/vba32Mw+KV9uHpGnItRR0tooDTUq/iIYS4HFh 1dreezsle8h+8Q== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/cert_path_crypt_02_ee.pem000066400000000000000000000033021322470703100273030ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQD08w0Qhce3vC7X h/mcoSiRnxRwrQ2On9f+vTExXTFWxuZsyEv38ykUF9uCcYTg0qRFISWpZt9fq2Nv 0ukJkS4j+5e/ZVS0noEBRmEMyu/nM3JoUtGkn2/KXjH4foQ+iLuXrfnMkisOZL4L ev4HUHQXdxxsrF6Gqyx3S/5OKuwnATS8jiLHXxKbUkLnZsxCvlNB1rCtBY70p+RD D+aShkYlCRVF1WYGl/VYBkAPRU7FPMNiElB7y3AErR9sa8RUrt9CXWsTjK6YGL+M uUDMc1geqon2HCD+VpxZbusfFvPSQeZW9iphhgpak4RI7mVBNSjyXnc/vesIG3MI CAQXH3SFAgMBAAECgf8ed0sLmlJCsMJRRpJ5qMBRivHizAB1H73mdwpQCAdPVTOl MS0qdWtDpfnQIoiYyw6X0F7koY+m3F6qhBbgwnmMIxYT+COWx9pPa2APguhfdl3t MxoDCHR8JaPXSkI0J9ktRHB2HlrrI79/c94wROLlwnCph/VoYdZOumT4X5h/tZEd OnDadx1P5EKn1Ee/r9G1ShmGTYsmuBuo+IZsO1CXsRMAoQ4FjSlaSgC29jMcAH4M CsB5XotJOdsdg8j09a70DKHKtZAEXzP+BiPdyao/PiP0sj8cDp4VDpQPD0j3TFOj 9fsqIWweCQqjr4ulWjtluU3XUisHSwLzvem/pVkCgYEA/1j47zDafHYEa2oM8+9y xeEshjnx0PgF9YYOPluQ3Qmyp3BO+it/Ed8RgzQoGiaSnGTZaAhK/gdgNb2awv6E kXOjVnDMSe7ZlnLE7K3hbhn5pUwZIfqCVFaVJekb+K47N1+O7WWe9LXldNVrPj/i rdSe1eqZumY1gyejiKKnKg0CgYEA9ZNG6u/lJEUMkvPzfFXArpCUUlEkXsoY/uAv 3DvWcmCJ5Wu8aemXsIgnayWWINyiBm+D+ySA2OUE36E84oA8LftEoeGbX7w6pkPM 5EI7x8BcpavfYclKgbqM1IrvQ0sxGRNseTBcbV586JZpuopGH5JRSdUkHb4rDSbl 1xPhrlkCgYEA7KhFb0pT9O5cgkEz6BGQyh076tthZ0+4Fio8oUa0KGiIj+7jA7G0 f5fC31tDn5kIYLKHXIfzGSU04hnsibTioPwP8llwvUUFnQ6ZvNIbELQ6UB0LXhaT HB9y9EPsjLrOXy/Ng/CfNiYvl+0FDBihuoJJA/H+sGdySTA/vK8jRzECgYA0FM8G hmgXYBmBlQE/jkQ2AW2jY5gODlhsvYkI8RvS2AyGvmmQIL1N8CJEBA2p3ID0UnQw MBavaSq2btClzMJ2kgKFPn6gOCBMILb0deONwosji6btay5FAxZZATorEGhSRB9O OGZxv4dIIJY9vJOQoIxi1zQ4ppskx+oYyhujyQKBgQDfejd1UNMg5Epk+NTazuf7 ctK+W1fryuOatcmzoJyHDcNhF1/N63s6nquozybTofDb6/e+Hptm9JZvxcZlCmLw Nu3b5qw3jo7kx+q5q+YPxeMKf1+78GiSM7enz/lNzITjHLr0lN3+vWxRYbetMoq3 GVe/D2BFpaM/oDNiWUTVFw== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/cert_path_crypt_02_root_ca.TA.pem.crt000066400000000000000000000022141322470703100314330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/cert_path_crypt_02_root_ca.pem000066400000000000000000000033021322470703100303400ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/cert_path_crypt_02_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100313150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/cert_path_crypt_02_sub_ca.pem000066400000000000000000000033021322470703100301460ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_crypt_02/description.txt000066400000000000000000000003301322470703100255160ustar00rootroot00000000000000Test Case: CERT_PATH_CRYPT_02 Purpose: Checks the behaviour of the application when the signature of the target certificate is wrong. This path is invalid because the signature of the target certificate is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/000077500000000000000000000000001322470703100220745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/cert_path_ext_01_ee.TC.pem.crt000066400000000000000000000020621322470703100274750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC4TCCAcmgAwIBAAICTiEwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjUzM1oXDTE4MDcyNzEz MjUzM1owHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6Pam5NEgftsyuDFsrXZ/opQfRNoB6hWVm zezfn6AMPyLia+K4LwVfa8WUoPDt1/jAcYjpF0mVUDGekDVy8w4TggEcUyiL+uzP HE2x/Va6xRbjPF5SPaY9B7stmLjTjuHxEipbuO9RdEOL+e9eIWhfeqxImuhHSxc6 2WYYKkHOSh7vtAoi5EAvnakKvoGa6z57R2BREQs6oXV55yK35mQ9qFjraepAU82o IAOjIaGcqkynDR4FTV4tW5c3cMIreShUrxUyqUyhIHHaFqN12qsiY6BbK4vJA5/k fwN9UlEefKCyAyi0j4PWMcVbyduVJLyDlBRpNxMWGLOPjFBdt1OfAgMBAAGjIzAh MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMA0GCSqGSIb3DQEBCwUA A4IBAQB3ozucLEH+f98LbdM0mQxSAOAExQHmZY3IejqKWraELH8tEgJFb7nQkkvn ZyEMpboebekhhdrOafRH1CO2hJNJtWq+fFyQS8A3jz4VXUGatHZVxJQ+qAAhzpgF KpazIsSk2baGb2Fac3qvDkGHWBSudkXYaFkeGRix3iytClnURojbre3ANWK9GBwt /50o3usyAlyf/pG8KzFFlM+c5XH5NTm9nHnxxXYomFz8NEJGgtflO+THeKbY/qFq MzefpTUYPI2Gk2JJQXGHDba46SefIeRmpCZRuDQaqxOCqHmQ8G4kPChe2occeHJM FFdzSRS1VscBzZG4iQJY2/OJOMF+ -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/cert_path_ext_01_ee.pem000066400000000000000000000033021322470703100263770ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6Pam5NEgftsyu DFsrXZ/opQfRNoB6hWVmzezfn6AMPyLia+K4LwVfa8WUoPDt1/jAcYjpF0mVUDGe kDVy8w4TggEcUyiL+uzPHE2x/Va6xRbjPF5SPaY9B7stmLjTjuHxEipbuO9RdEOL +e9eIWhfeqxImuhHSxc62WYYKkHOSh7vtAoi5EAvnakKvoGa6z57R2BREQs6oXV5 5yK35mQ9qFjraepAU82oIAOjIaGcqkynDR4FTV4tW5c3cMIreShUrxUyqUyhIHHa FqN12qsiY6BbK4vJA5/kfwN9UlEefKCyAyi0j4PWMcVbyduVJLyDlBRpNxMWGLOP jFBdt1OfAgMBAAECggEAHNgrCWD5tgEOVKXbmEJRChZGjoELR1k8r2jqVxIhFsnP 1yiQEyhOg+JXALd9HnZ/c3LCGnO9tO9C2Bo2pP3UQBziRibyVd0Vldgo3Q3DGSco QyZuPKeJWn9wM9Yo818i9ZQeKlmLUIlvYru2y9SPFpE9zfrr9GAYEh2/Nwk9wDtX RhAbjI1DIMmewCfttRvXAXEorrLj0iFouhF89KYStyLkk6Pm8Id3sqKA9zOKryAX FgfyOZTtSzwmBo9sK6xZ9iLL2zWL1Q374vAHoj796/9qz9d30ih/z9tFGp42MliZ 8aAckFryL1/DfdZgv2S1M/ZnSjD4U1zTMUQOQSMA+QKBgQD7pAd8Hwz90c/owBkf /JVQgFxFx0+CEFiZ+FRjw3XdnTluMXTb0U6oqPHPyavkx89X0elkTnQXYtD5nYs3 g2/nJQWN6XD9xw1UQszi/TxVnHV5bpqe1CwRtpYCn9FjSAUZampxsQhIsfeHqaK+ F9d5bWox/CiAvvWP3heZXnHnNwKBgQC9d5mQhCvgUUiT5SwTH/JPp6z3y5LBCtg+ cPn2nEpfrgZZL6+5rv3xPGmhNCN5FChvWaa33S5knHnt7PStTcTJwnbnxzk/oepv aBFOCzOHyQKh3wchHXCuzW69d+zqEvpRjo8yj5tcW7YcNk6dHnd/MFHP0ITRH+C9 Jk/3iada2QKBgAZpiZ9KE0SsggXGT12XTB6/Bprol0gTLo7N2yinpGs/RGVgcT/g t4Zot7C5zN2JkekE+lOKBD9MT1LtBs0lVkanlNqm5jAxUE+jXCE0nsL3t66eeOYv NehFpNDwTZ+gCDE7mvbGshVYI5ybYABED0OS3C/l4wpU02EVIbjQxUpFAoGAJmyZ 9SgI6e4yJORGQv6omqTrvDlJ4uJ7JnatCul5X9wgJ3g3UBYAJCtXVL0JMKX46VQq LoGpxffB9pGmsXrjHPPWP300zAXfUIavc79rzO7kHMXpYTriPmElQ0GOB46fu2iI +/0JyfpDfYc5/D1QiLfY76dfODYZ0uJxN0dwbEkCgYEAxdCf//3le7BMcFtwBFL/ jSTL/9y+XfGjnBcdMkPBZ+KsWMrR6hY5mGIcQsYa5Gr5sBplfSnKsi/IFYzGQWPJ a0eBuvHjci8KVfNa8iq/yvBm2gK0hdQKIQu+YE5RdaqCb1X0rDm+oBdqkhVhuwSX qsUgegAzhLeIXAzJihcMNhs= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/cert_path_ext_01_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/cert_path_ext_01_root_ca.pem000066400000000000000000000033021322470703100274340ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/cert_path_ext_01_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/cert_path_ext_01_sub_ca.pem000066400000000000000000000033021322470703100272420ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_01/description.txt000066400000000000000000000003361322470703100251620ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_01 Purpose: Checks the behaviour of the application when a v1 certificate contains extensions. Certificates of version v1 are not allowed to contain extensions and therefore this path is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/000077500000000000000000000000001322470703100220755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/cert_path_ext_02_ee.TC.pem.crt000066400000000000000000000020621322470703100274770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC4TCCAcmgAwIBAQICTiIwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjUzM1oXDTE4MDcyNzEz MjUzM1owHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCoDGFl61006uZ/U/dx1WfEAkqLEH3ZXp6y OSkPK52JchKnmzFJpTDU9sy/a7NNfMB5oIzEUace0zTWCBZ4LpiUv+4k8OJoP5E7 1UEx6Gtwl+vJht+fpYxaRqRASvGOq5Edf/jhQfyNw8WFYW5TmkBY/GMwhFt8hVGK j9Oaqkxt+L8DwzW5gOJ00rtCGKcyhJAT4WIR9Co/MFTfZwNLSDesU2kNsh74qcQ1 2xACOy+nH62VaSgeTL/Y9Gqm2S3JLr6Ep95t8x5L25lCVv4B3Cc782FpNIBD7mZC 8LXkL9JjxjviUPEu7XO8DGzYgJOlScMoxcz7T8pjs9IZCdposvhPAgMBAAGjIzAh MB8GA1UdIwQYMBaAFOCMGappJZoaJQD2syi6G/cN+c/AMA0GCSqGSIb3DQEBCwUA A4IBAQBGdsNlHf2KTCwDZCT+5W6g71CQlfd1XaMEnThmgl0O3bR1i/aUD8oi30V0 qTtzfzNEnr6Yf2Wcz1XMSC+eLFo+wH7Xi0KJsqvbazJ+wgsLMfuGodx6hU4+MYIo WO3pluOVnk25bFqIUQ0SzhIRpUyrKyDnpd8EqCO1LmsFBDKNl3uAky221XPL7P+n yUFJHnWxuI+v7B8mDjfvhM2OOKBAOAtFREbRmAC+G7hgjx6lOphzUYvcwrOSB9px c22hbdghtfp1mE7PtvqEiABfoYqgQVo9Fp6vVMC5uLFmxCSRx5/fi50cB3UexQH5 2nBPNqJ69bVjX+Ovc6LoACYCKsjp -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/cert_path_ext_02_ee.pem000066400000000000000000000033021322470703100264010ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCoDGFl61006uZ/ U/dx1WfEAkqLEH3ZXp6yOSkPK52JchKnmzFJpTDU9sy/a7NNfMB5oIzEUace0zTW CBZ4LpiUv+4k8OJoP5E71UEx6Gtwl+vJht+fpYxaRqRASvGOq5Edf/jhQfyNw8WF YW5TmkBY/GMwhFt8hVGKj9Oaqkxt+L8DwzW5gOJ00rtCGKcyhJAT4WIR9Co/MFTf ZwNLSDesU2kNsh74qcQ12xACOy+nH62VaSgeTL/Y9Gqm2S3JLr6Ep95t8x5L25lC Vv4B3Cc782FpNIBD7mZC8LXkL9JjxjviUPEu7XO8DGzYgJOlScMoxcz7T8pjs9IZ CdposvhPAgMBAAECggEAPZlkLm7rGJWubigCQSjfw3qvhnBCIWbMtzm6skPjmFlH O0bo9zzlPHtHLDe3XwUGrM7MKr5fiy4SZQ5L5jv2VDhSfBoMc/gxLYSLRFcU4w3d MV8OI8AURZc1aBfQmeKL7AtX2IJOqEyF39GKFn0pbzT8yvEJdAiOjkMQZtZb88ct Zu+/kq3gARD0MkxRTU12kbd3QVFOIknSFNfPqxq8WKjznKDbRFScbEvnz5KLsnKD hgqt4HqyAe1M9jSHBSteoiZ5Lqn4UikXG4YHdNmIFO/2N/W0R0IoURjxv7M1kIBZ 6+S5KCG6uz2JMzAcLmcqf4mbJC3JuR0/Fl4NxyhbuQKBgQDVUtzioljBktIN/XpG qRGHtxDCyM78wHlpiAM67fPpP7/sN3pnA5k1RtKN0B6/DYZpqxq9Jbxe6soBRk+z usiYoojz3kznfMkb+gulPShLsowBUxumKT1BRSJ2jq5/oUuptMWP/PjyKE9KvxrH KcnLIZ0AnX7A1D+ZFTzHZn9wQwKBgQDJqsq9gFIN54B3Wrb0hDgzIrnp4hoci336 WWetb8V2YbFVXqhsH7wDPT+EG9tLR/qJp+Ski8xQ5Xo1VhPsS/JQfi7zX1+4yMUW tR3YCilVxZzAeYs/GIud8ztOo/VbzKgXQ4WXuctMkn04xLfZelLvjHBDj6sPDKrr jqR7df4tBQKBgQCH9+TqX2gLGbXhTOsfFqwhwMFiJfQojdXVOeg1K24IAaYmvcW6 20RP/PA/i6PNSqWdvH2yidbi+OwAm/w5JpitEQwRxGNoONVGi73YeH6yoP8z6PD6 m9Z7P8GTp6X5m6lKZfp2qFtUnfTMQ7qhrzT70FTuC3S7G43d2PeAcQhRWQKBgE86 NQo75oCl6Xd6gRQQ+c9FHkr/VAjQ2H5JL40Yszft63BBjuNjmEahglmRZBbwQUJh XlcywOMrNFbN6WfU8m6jFCjy2DVNUvi30PC2FUUoLIwFdComp3s3Op6LlXIqNgNl uI9CI9eCWYW66wuangiUYOp5/9cav+9pC7+hPGlNAoGABmsnM7cpEFcamq8rR1Pv OzjoG3iHLcrt9LRG8de3o2z5iSKwYPPf4o0q1qY+wuT1sMvHlqt6eho0CZghgl9g fKxykPVyjAl0zF3SL4Xi63+c/nlesYdn0+Fb9aAU++O+q5Mbs/B0WKWFz3mClS1+ oKX+FAf36fcjp/4rPpUDefY= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/cert_path_ext_02_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/cert_path_ext_02_root_ca.pem000066400000000000000000000033021322470703100274360ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/cert_path_ext_02_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/cert_path_ext_02_sub_ca.pem000066400000000000000000000033021322470703100272440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_02/description.txt000066400000000000000000000003361322470703100251630ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_02 Purpose: Checks the behaviour of the application when a v2 certificate contains extensions. Certificates of version v2 are not allowed to contain extensions and therefore this path is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/000077500000000000000000000000001322470703100220765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/cert_path_ext_03_ee.TC.pem.crt000066400000000000000000000020321322470703100274760ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICzzCCAbegAwIBAgICTiMwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0MVoXDTE4MDcyNzEz MjU0MVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCl2MEA6NcQmuMkzjpIjXbJJlO8z6yhesK9 Idd4SObOeoq2HcY0g4wUjGDvAAAJv7WWXjh5/hxBkj504+U3SGkrlYAW5tBa5L5i s9eIO4yZnvUu/uQNgmYHAPRzxWSgMO/gYpU2vpn+pKhWuEmzuBQOtfkO0mXbrG5s d0Zihj23saGyatfrouQxuiB6Gtgq661FwOVa9r8Ih1di5cQ9hjAEsT5afsWqVCmf 9V3RPNqhPpOdsh+c9GQfl6r/TxEogQrEcrtaFELhVCxWBocqP6i/MmRpahxgz5Ph goLnlp79SGc+7kBREDBYKDYjHpDKOkMoXVSfOfjaiuGKHfvY2zOrAgMBAAGjETAP MA0GBSoDBAUGBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQBBFir+lZc3Xy/2NB1Z zfQ7W4+5HMxjbNvdvrthPabgdczo6QcqZVdRMW7OHYYJ6kHMI9BnX+1v4XRUG66F EG0dnfJTj9V2djh2dTHPnOExABI3Htc4B+kaxDDe9Bej/Seaq9rsmwl6WdO5Nrpj n3AHSzrAE+55o/S/iktKiMFEH8TBzOaWaqXH19A7l+v47/bYQeO28ansKfQoOZRT nuvaGvNYpHI6Xz6GNS12xNKeJQ+FJDKPuTyCzsk86gKZqI+gnwh1FFJ0Nb76nZa6 Br9e6Fwb9QWIU5vDNQqqii3UTlRskahTby7YdyzisJSiEmMnyxUiZ62jwRdnP0Fb OEuU -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/cert_path_ext_03_ee.pem000066400000000000000000000033021322470703100264030ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCl2MEA6NcQmuMk zjpIjXbJJlO8z6yhesK9Idd4SObOeoq2HcY0g4wUjGDvAAAJv7WWXjh5/hxBkj50 4+U3SGkrlYAW5tBa5L5is9eIO4yZnvUu/uQNgmYHAPRzxWSgMO/gYpU2vpn+pKhW uEmzuBQOtfkO0mXbrG5sd0Zihj23saGyatfrouQxuiB6Gtgq661FwOVa9r8Ih1di 5cQ9hjAEsT5afsWqVCmf9V3RPNqhPpOdsh+c9GQfl6r/TxEogQrEcrtaFELhVCxW BocqP6i/MmRpahxgz5PhgoLnlp79SGc+7kBREDBYKDYjHpDKOkMoXVSfOfjaiuGK HfvY2zOrAgMBAAECggEAM9ztOkoWG0i8eKGPQ2oNuAimzhhJnXPk2z1ugtyVZQOY RixYc8qhbzmZBJSE7oeHkz7ivW+USYMgyfAMmbWoweruE/tZM9ttmDMyVxV8Ofwm I2ytR3Y8TrtjNqMHfTrggNSDYgvH34SBaiEWVz/c8d7BRHvSQ5iQLZY9Kgld2ogO o+dX6bz4iH1RH5XGmsUL8elorbqCnkGIYvXhGU4pEqGIl3/P3XqqoE/atp9FAiZe 7tR5zYKnJ4p9dJA6PtgXyoxQ49uhrQ4riuDEXDsHEVyi+fj7qMSyucriaGRBK1fd SfX8F19n4w3q81DhG30QXwOuKNSoi70eoOWATornCQKBgQDTsiKInOj+TdyhqCY1 XwkbJ68XyBcPM+mr75OgHZZvjhowyknFRvquYXZ8/ckILtZawmpyDmdaaSoYvrLb kA/+oQIBwjXZG21f2Fjkjv6IEh+tV8RKy+JkY0wwV155khys0za1A/KI5yQYUjI4 /+aGN5afgWlhOnY81bYstpZ56QKBgQDIjjHXKqQClspYVHIbcqvbWO4AkspMMp9Z FxICwjGDVYmA5/7/aP7BwC9vJO61WyM55aYXOD5sO/NO0w966gxfjXhdNNt9ZPJ2 3QtcDnMB4WiTOWUk4dLnebH9G5/1m4YObQzTrUEJzB3UVxfE9vZMuaohvUqrfmid 6MkZpjjwcwKBgQC2eprh/7+nVh6VCojFAMKssaxwZ33ZEPqfxsgOAPMn/en9nKGy d9imcETewTSE5TrIyUVQQ7I7cONkqR0rvibLaqZ8NZiNKONC9w7JFam6SUUc+sat YsonlqCaGvXI/XXSU86YgmqSMAwhGtlH4O4pS8l+fOMFeItrLRz3tfxH4QKBgQCh rpDbp9KlC6+A2kNLgXyuztjAuZZBK6ZvCjxI4QlNmc3KkD1w5tJKnIchESMoLZsO d+cYXQ1l8EbMSzb1nm3vMnvQmGZChvk5fiZERpnM8E2AMwspWqzOU7t8E6M3O/Qs +RkYJVqDbXy2zKeq8HXLkPppTNM/wh7Q/vPwq6LHpQKBgB4UIMvbNaQfoKFr5eWa +acxmRb8/6t0jLExQJHxhfblx1TTbYsk4bevCBMSYpeFqCESx3HtXJH2rt9tHiwN 6a7dlFGYvCwjZqR+jHTNGLjggzQgZQXj64BfGRtKX8+qlG1aJ1mibH8h6E0zccLn GPKL7A1o7VC7LxBwU5VbCqFK -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/cert_path_ext_03_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/cert_path_ext_03_root_ca.pem000066400000000000000000000033021322470703100274400ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/cert_path_ext_03_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/cert_path_ext_03_sub_ca.pem000066400000000000000000000033021322470703100272460ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_03/description.txt000066400000000000000000000004151322470703100251620ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_03 Purpose: Checks the behaviour of the application when a v3 certificate contains an unknown non-critical extension. This path is valid because a client application does not necessarily need to be able to parse and interpret such extensions. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/000077500000000000000000000000001322470703100220775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/cert_path_ext_04_ee.TC.pem.crt000066400000000000000000000020361322470703100275040ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC0jCCAbqgAwIBAgICTiQwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0MloXDTE4MDcyNzEz MjU0MlowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDL035T3jh0PFlIyolm8d+OPFYfYXkDMNFm F0PIK6wZHHzwZRYhhFNUp/c6ctJqNViGcLf9lNwKuM7MSoSPrLpnE+whQNZ9j72/ JRm3X/2p08VoiFticoncK1XsuPXe3nZT7zCRn0fxpRdCGnz8QUE8ZySSRCvG83mY 6Ee/aCMpmCTiAPQD1/FDD2yQhYAtD08qNSC1sT6bG/GoRGgBWxKE+Dois+RFhX5W /fDRw/SknZn00OR0xSU/gcfKOdkQsul26o9YdrwsKzzovTcawThVYjdhQGwuYtOq Doaatr2TiMVlbS8IUyZPG7F0ivMZSXqWn9ZUIZzyUPY5p6Tymd2BAgMBAAGjFDAS MBAGBSoDBAUGAQH/BAQDAgWgMA0GCSqGSIb3DQEBCwUAA4IBAQBhgxNDI2ydzGwU 2bh/aYpE+u3wSWaxiGhKLYMNhyd62mcFU6staO5/EhFOYxunxs9Dy9f1QRXbDv9c NRQq8foEtaD/bwudthWngzCvnTaWBfXu7tcy0oTYGvRXU2Trv138iXuvq1hf9XLz 0SQ/smxb5oJxNClhNZwjt/ILSBC6j2LsRZ8HY6lT/v7tGwo834HQ300LEXPYSAfX b/+ZWY9rJjdqWjmviuUj0n+tBMJzupTsEVFEfrBqabySJvxVYKJ+gw/SwX5UV1BX Px43mtrPmkR3ETzn/+I47IayfdoWu2vWYF+ZAsbyT889ag5Wo+JZRPDz8S+QhJQR CMbFtMCB -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/cert_path_ext_04_ee.pem000066400000000000000000000033021322470703100264050ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDL035T3jh0PFlI yolm8d+OPFYfYXkDMNFmF0PIK6wZHHzwZRYhhFNUp/c6ctJqNViGcLf9lNwKuM7M SoSPrLpnE+whQNZ9j72/JRm3X/2p08VoiFticoncK1XsuPXe3nZT7zCRn0fxpRdC Gnz8QUE8ZySSRCvG83mY6Ee/aCMpmCTiAPQD1/FDD2yQhYAtD08qNSC1sT6bG/Go RGgBWxKE+Dois+RFhX5W/fDRw/SknZn00OR0xSU/gcfKOdkQsul26o9YdrwsKzzo vTcawThVYjdhQGwuYtOqDoaatr2TiMVlbS8IUyZPG7F0ivMZSXqWn9ZUIZzyUPY5 p6Tymd2BAgMBAAECggEAGlclPDFmRPSHlUtB9nZ2LYDJSxo4SUabHlZjVrr4wptW ig/bjE6iy43pT+RcIjLtUx0TVJyoKGU5qaz3n0RIfTRV5PY8FyiRnOIZMK7MWTtv h31s/Iv7b43UzNgaQ3L8V7HRf6rV4U80ckEkux9eZC/wH0wwBsXwMOfTsyist/Mg wgIoL9WjB9socpaGGj+MmHsjKAo+suRVrfoGK22TS+gjW+NLpTB4X6B1+J+3Ci58 kaqm8/mlRrBv86C536mDYIPUNqWa9Xvcd7b8VTYdP6jN83vizDSf9z/AargO3GF/ l9lvOFDvYLpIJRdE5/Z4GCzlZ9Cs1gZIixSSrbJvAQKBgQD+w4CiQ7zmxaMFA6VD 9+yBfMjuiQX3V80QvqQuU6aRFo0sMhZRhaIHM/XKw4Gs40JZT96jg+vqRLLi02E1 0KOFojinobY+bq62uiX7atPZk/P+yCLy8/v/oQNOk3XtPctE/62JyniVSCXwZ9rI DvmRn9EMQrpWegxWyc+8NMFNHwKBgQDM0LXa4Q7dGtF5MLIHJX0yMLxJnW7IURSV jt/HDif4RzieQvQTddmLSPiqIjz4drX4awPjKJvaPoEm7+TNzDWqda+qnxRuvCbc 9zEQwmRt5VvBF9m8sP0HlfL3jPY09Ne9NpBb1qzffFnCCSjF0v77OMCtEbQICmPw zmYpzSrhXwKBgHHgFWlyecd1ZA7juEWPVkny6yWkXeRXfLQVYvHKNlP4DpZItS0v XGN32FAP37DVzFx7lPrmBteqaYN2FKenYNBk2IolgH6bnsDSqBOfhp5kwdWKxARx Bp0W7ZF73GR1EJ0A5CMJO6kOnNa+tU5jUy7CjwC5+uyYlVdd0dtAgX7lAoGAL2vr j0Aottzsv0idD7aIZESQc+L1sX/EalRoT6hhbMTgwRPze0YAFpXQrWO8BjNGMrxk bAYM/90U/jTxHw03J76T68dlbbY2sVayj5TSt/cw5WZmTaAVFdqMJPEIWH6QLQkj J4BvCle6WIjSXetaikQ7qFa+/lWZijnfwbH1SbUCgYEAxQglnXz20cVIerpj1P7o cUUzjAvtD/TXn0RsyaJVyarznx6XMyE4KCWZQ6aREWGk48I2IE2ltdUT4wg/ESnb xqJVkniJYrmg5tqhS0XdlnZc/aaNTtaFALYc9STAO95XrVrJMuelidRV2Uh6NVpf Lpc1DcFKb9+7V1UPcDl4SWQ= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/cert_path_ext_04_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305350ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/cert_path_ext_04_root_ca.pem000066400000000000000000000033021322470703100274420ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/cert_path_ext_04_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/cert_path_ext_04_sub_ca.pem000066400000000000000000000033021322470703100272500ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_04/description.txt000066400000000000000000000003501322470703100251610ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_04 Purpose: Checks the behaviour of the application when a v3 certificate contains an unknown critical extension. This path is invalid because a client application must parse and interpret such extensions. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/000077500000000000000000000000001322470703100221005ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/cert_path_ext_05_ee.TC.pem.crt000066400000000000000000000020621322470703100275050ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC4DCCAcigAwIBAgICTiUwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0MFoXDTE4MDcyNzEz MjU0MFowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpz6pOzbJADidIOOE4JBW9z60AH75w0O/L 2saZEtC87DvCWcRkb/uojoKDOlyPUTVqoQvUDtX25wfqYqao9JMci9wHtPiMJ7Jk HfHb5nfbv4YxmERiWMgvc6+oa1f8pj98HVy+eNIwgWY9FpIilcjsOuweaKqXLRu2 Zea3ndUY9BfZ9cLnaZQBvnUdAF1NpNF6i/ApK9R/lpFJxvILU0WJoEDXMi9LfPMY JZMNzxudtCQHATzuK7r6Dydq4SRJDp7EqZdvyVAbfyLBpK8ChFg2dumUAqgualSM wnOpvjChF3LpNBI4T+M1ZkBqzEI+AONVq5/zWyYzOFWUftPjFgRrAgMBAAGjIjAg MA4GA1UdDwEB/wQEAwIHgDAOBgNVHQ8BAf8EBAMCBBAwDQYJKoZIhvcNAQELBQAD ggEBAGpIOCvV1lgYbCwkbiEHik2PHDS9s7Vrb7dAYNSJXT9AxKvqi62EriZu3S+0 Qcgc7pJIwZmNXzckJ4q5A7nDp52Ma3LL4M5SUiKc3NboqVFj/L2Erh3JrVHZ/COR WZ9fdMHLND987kdYaTtySvN/fCv5Qg4XC96316whS4iyMcB/fgev+eCNAOQiULBm XTyfklU13U6M4q9CIJrX1P2Ud04HSMdJ+yZRQoXNNef9E1tZAzFZdQiaDvfTiw/g mGKlEW1cZ9KRsmBpGelKH+XaBejaHGjWBCBHtFjPp/N5NZfpLMo92NOiv+UyUwwx MMaK20K4YCudaUW7QcFR6YBmPiI= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/cert_path_ext_05_ee.pem000066400000000000000000000033021322470703100264070ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpz6pOzbJADidI OOE4JBW9z60AH75w0O/L2saZEtC87DvCWcRkb/uojoKDOlyPUTVqoQvUDtX25wfq Yqao9JMci9wHtPiMJ7JkHfHb5nfbv4YxmERiWMgvc6+oa1f8pj98HVy+eNIwgWY9 FpIilcjsOuweaKqXLRu2Zea3ndUY9BfZ9cLnaZQBvnUdAF1NpNF6i/ApK9R/lpFJ xvILU0WJoEDXMi9LfPMYJZMNzxudtCQHATzuK7r6Dydq4SRJDp7EqZdvyVAbfyLB pK8ChFg2dumUAqgualSMwnOpvjChF3LpNBI4T+M1ZkBqzEI+AONVq5/zWyYzOFWU ftPjFgRrAgMBAAECggEAGsfNGdJ85cyVoLaVEQU33JCFEyZDzYerWctYqMl73ApR k7a+hKyDKYkYHNlhFu/SwcyWO0z/rN8GCOP4BAtWVsPZNpScN4EHNEeOCNp8VU62 O4TCZtQ49gAuWBxdwFL5DiTp/IFnfLjbm+S/Cpn0GbViiZqDf4YLVHprptJLH5Jq dnKaTxPBXGiPBjB44bViMJ6XJWZKwMrwaDfPlAUIKsK7n3LXDHk6OkSn3DBT8Y16 WuTvFNpFKji/bVjJHTWsHohT47SNf516AHGGvAKpbHOUapwJCQngpVK5PW7yPktF X8mLFFbnfi8mitYpebC/0wWIRpQQ0chqi3ratqFZYQKBgQDrM0DhNXolvpCfQR6F 7qwyt+o+eH0lLuygBQpQAEO0KAirX7FrTUx9hxWVodh5LZ7KSDkXl7FjUbBxluS0 rBsoCnKsAOvvxUk/Am2al2cx+Q7FMK3ye7dw0FBXDvB3+xRJHoPABTwSJRkjGKpt +EYf/7R7VzlClwqdzhCl2EMBsQKBgQC41A5mwGxeg4ek1OKZXuYHmw6Mtf0OoX3M w5JKvxBbGhI2QpPZkR44bwiF7OM4jhWRSKL+WVveS77tr+rwHNpl54nLD0evtSyH QTRGyNH3RpqoJvu/7xQbHR3gVJ8MedqNC92AmBFRtagv7CA4QjTzRufP6COFsPhZ lSwZxx8y2wKBgCC4H5V02Ao6KWpOJ83f9wqTNT39iwNKNNbJ/LZGYyTD0PjuNgNE XJi12xXWzwOEiit/wpl6m83CRnZ21Fgh/SEj2vH8qtXPLzJZxx+TYmK8UAa0j+5E sa86+4Iw7Nj0D81gNlnXIJUxnf6Y5tSnjjHTY6so5ilSU8LCMOSxYhjxAoGAB9Qz p/aOoJJBtKGv139FjxzqSNuMlIoSohHGqJPfRXydON8pFBYpiYpqegHGviaGk1jY Tp3KXmgm9jp1YSZXuelM1OUYzECIWlJQvI7VFfxPoL/F+iNOXrelBFORSR4AO+k8 wK2wTh27ugvucXOcepGOUCgtGQSeAG1pKM5ea/ECgYBjQWEOMmvBxR+GXUIGcnHP iPP9qoeZt0jVRxUAFnE7ZILm/2gvz0nnUt4ynxn6FsoRL1mu8c+HuJnrfOnT+SiM zHJ3JhtkrvmPiADf6B2dM2zoQdy8uAYZaNh2PFAbJJFtzN1kM6SJ/HG00+S5hbzD dsXoBt8pMCy3fFRAsovSoA== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/cert_path_ext_05_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305370ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/cert_path_ext_05_root_ca.pem000066400000000000000000000033021322470703100274440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/cert_path_ext_05_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/cert_path_ext_05_sub_ca.pem000066400000000000000000000033021322470703100272520ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_05/description.txt000066400000000000000000000004161322470703100251650ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_05 Purpose: Checks the behaviour of the application when a certificate contains an extension two times, possibly with different values. This path is invalid because this is not allowed and additionally the client could not decide which to use. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/000077500000000000000000000000001322470703100221015ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/cert_path_ext_06_ee.TC.pem.crt000066400000000000000000000022521322470703100275100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgICTiYwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0MVoXDTE4MDcyNzEz MjU0MVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz5ArwaRDadFpC7jOqP2nwF+YboLAgvLIG bc2JAEZaFaPOffO/Ouyh/O7zCOeRwo+AVswZ1hmXUgGO1mLl5lJ0Pktp22Qd2Ilg qTXE72Gc9DxMGhLjodCyx0g4dbORKFHhwxbIOgm/0fPL7zC+PusJfcZEw3XUF/rb 6BcUPmyPuwK9jvx0MNOx2ccRiHVqY9SC9jI0/9oqZUIz+ArpYiWfYlz7egkSDDpA AhuyKna9uL2vBC/iDVSBu+/A3jLUUpez2VY/duYTAA8Zc9xbqq/bLiHa+zQtMb3p qH66HGSnbmmI0ryKa/NMhrfa1p9th2ozM3SIDXDPsKNgWUGsvzhBAgMBAAGjeTB3 MB8GA1UdIwQYMBaAFIg7PemiPjGTRq83w7QDXMiPE66/MB0GA1UdDgQWBBT7YmQg RLhQkgvJVPMiEvYw/DneaTAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUwAwEB ADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggEBACh6kLHh 0In17oNclR+d/zBEKnDj62koIN5cQ4NeKU3bTqi7UVb6enYxYppEqHXEmN4/eQ5I U5Qqqz77VB7byFgtoPT37Vu6tFKhvGxsg+DNWbokfP2wYp54OXcXBQCktlQJHSua qwqXhk+WSoUPZfVH0fRr5WRBWM/4q6dobT4Lk2CvonRBWo420ylVnLum8xMhcFCH VfP9fa7ETfnVr1gl9B0OGKCQBw2pt2a5jya7gdD+GbbnSwxd3/0YbCAmy8uEwVEy tFPErOgB9SoYyMl/wpsj3iNbJOP14jqzEMvElYUtoGRFg3BBIIz3grvsfwfipcyT 0ZdOanAJ53+ml08= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/cert_path_ext_06_ee.pem000066400000000000000000000033021322470703100264110ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCz5ArwaRDadFpC 7jOqP2nwF+YboLAgvLIGbc2JAEZaFaPOffO/Ouyh/O7zCOeRwo+AVswZ1hmXUgGO 1mLl5lJ0Pktp22Qd2IlgqTXE72Gc9DxMGhLjodCyx0g4dbORKFHhwxbIOgm/0fPL 7zC+PusJfcZEw3XUF/rb6BcUPmyPuwK9jvx0MNOx2ccRiHVqY9SC9jI0/9oqZUIz +ArpYiWfYlz7egkSDDpAAhuyKna9uL2vBC/iDVSBu+/A3jLUUpez2VY/duYTAA8Z c9xbqq/bLiHa+zQtMb3pqH66HGSnbmmI0ryKa/NMhrfa1p9th2ozM3SIDXDPsKNg WUGsvzhBAgMBAAECggEAF6999TuQOYM6Yzej29WvqCotZRPaPOU7d3c7qb88hB33 THfvAQ3MHGQGPj+85cc9R8Ol6fzzr6XfiKQXr3eNAbs2CMEXRIq/Q9fjuYNfUeAi lE6WkBw9M1zj2HM+6mzpoxUhyclCgVwugnqC63mzTrOdyG4H9J4XrJ65czPo7V+T 8pIgqp89reiyJpSiyJ+2zbyOVUoGZPT8KfDDI+u9nwDnXzoFgzBsiG7kNGaFMqCw Amvtn1+CcevqBR0k+DElNs79ioCRruAEpMeKiLi/HGY80TiZQ2/VIuNbkJNqYF02 VJbm36aCcU22mUzkSxh3MIuJiYrWJEZlgq4MTRINVQKBgQD8WK02HaDtGZXBJ1Kj yMqxYcOEozCU9dHbrogNmuxa4kZY9jeU+XDgG0Hss++Irr3fM8BWKxGkN2jyuB6L PqEZuNnw1zgakhee57xiw64XCyY1Ijxy7WbvWdrovrSmJaPkqmzemV1beOq0/Oam bRbyUnTcvOizbTavYU37Gp7OnwKBgQC2fs8bX1EV/7RuXZfUQ5FDPwDGfqnef1ON egwgaZRkgy7ffwC/eYg5kq991yMAD+7GiWN5fpTd5++5GFG0a7Xmh510IyWK3/EG wyQMYVS+ZZqI2Psz4gpWYyssTwnJ9xQabZDe9q60jNkZaexdg+cZiQauqiwEhhdJ I7JGJuXtHwKBgDkaH+f1AGtmtLqGmW6yixtkkge7ncy3a4uYjPT3L7DJLz4GSUGO yHoN8PcNKJD3acPORCG7kTxlxXvXKiI8Q9w8NiUHroxkrq+opLp8qTJRtY2kd6VS D07uOFkefmZycgnWfthIQBXo4MOfztmuKdkfy43/uXCQsCUzkZ/WwETlAoGAc8Je VwuQILcxWWyO2Xr+krxNHpvL3rG/axeGx6yRD2zS97vU2qAZlAOCw/0KW4i/ujn9 2lw7y8LKogtWEG7eVFujub5tmvjQJ6zymdPHcHp8mt+gAFoamo+PHC0KlYzfuJ/V bEjnqulI8MDqyKrZla4AihyxjTENZjx5YdxcrpsCgYBPz9LjfYsDmTXj9vC3sGoV L1G1W4wkqIywWKj+h2KKrpdrPt6kROTxLgCph60idLI6xiOeJB0K5XiElKZNBtbC 0XCweW8FLBb8x+1nzXtMLxJy45ThPiRpK3cDR/dbk+M7Kqv0cVlo2v6MQNJQVozw ISkJoSrIUR4vSs8igcPY2g== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/cert_path_ext_06_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/cert_path_ext_06_root_ca.pem000066400000000000000000000033021322470703100274460ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/cert_path_ext_06_sub_ca.ca.pem.crt000066400000000000000000000022241322470703100304270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJzCCAg+gAwIBAgICUg4wDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1NDBaFw0yMDA3MjcxMzI1 NDBaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKiBqbV0p27AhYhiFpwSFTiZQ7hkBee7 Fig0jRXTKWtX+zjnRjZy8Puyg89En7l2MzdZk8RzlrYsE/tAWWdqjlrNRU0TCoom HmWms3Vjs6+z9UmcE6bOchUg7BjpAqKJHSguybqyw5V3RkTGh51r9HbiUngzbRYq 6IepXvhYk5tKrcmcNmUKP14JhLdKzTVMxEEQh/UEWx1guCdrFI5s+LYq6tHget46 KWDpueKHZxXalBCQN9v9I0y3nOHhwy+FOsUfX9WI1zsetpMByxGmO8UfFB9zx42I YvJoHPwSS1WdRofa6fXUsbVK8L7zBsxRP09Q68AWJtHvOgI0EFsBslMCAwEAAaNn MGUwHwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFIg7 PemiPjGTRq83w7QDXMiPE66/MA4GA1UdDwEB/wQEAwIBBjATBgNVHSABAf8ECTAH MAUGAyoDBDANBgkqhkiG9w0BAQsFAAOCAQEAeX3OGW/9h7NxsnUbgpC7SFzyLxjv +25VG8jtE+pbZdnQEEE17vfUdQXJ1FZsL6jLH+qQT6HfNF0p0rxjYjdBZNNnGTZX ujdyovRCGZU0xIvtCzyKeDRMEYHOxOcuqKcIb/MPNqERXY1lqFbfgKTtwVptifTg O8wRZ2pMuDtkZVLfmCVZzBx0sT17mDzd9FEZWIH6hTYMgV9mZrL2B9+bj5zjC7uN h+BF7Ftv+dPBQYsi41ltYTgVJMlOMNnP7ueceKiZhZ2/bsci/PiBEkaMrE/rZKJh UUMYWkOfmseYEr5LZvfjs5jVfHg6WYe8eK/Uap6xsXb11hFCeiNK10IwGg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/cert_path_ext_06_sub_ca.pem000066400000000000000000000033021322470703100272540ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCogam1dKduwIWI YhacEhU4mUO4ZAXnuxYoNI0V0ylrV/s450Y2cvD7soPPRJ+5djM3WZPEc5a2LBP7 QFlnao5azUVNEwqKJh5lprN1Y7Ovs/VJnBOmznIVIOwY6QKiiR0oLsm6ssOVd0ZE xoeda/R24lJ4M20WKuiHqV74WJObSq3JnDZlCj9eCYS3Ss01TMRBEIf1BFsdYLgn axSObPi2KurR4HreOilg6bnih2cV2pQQkDfb/SNMt5zh4cMvhTrFH1/ViNc7HraT AcsRpjvFHxQfc8eNiGLyaBz8EktVnUaH2un11LG1SvC+8wbMUT9PUOvAFibR7zoC NBBbAbJTAgMBAAECggEATtT6VE3S1tlyny9kbHd5PhVVvTnuGU9JOl37cy5qvjFW 8nQgQPDdFKObTqhIITfPFiHuI4YACBHu9yhPqzYKiyhlN32k/KSArAWlB1Ixig2i v2EpQGxsqr3QNocsGGYVIethrNpc7dvzH9HRODB9GfEfq+RDMI+6YV03dO/bflZb KqQSyfVtL9mO3LO3zSjKyscoSpjOzWy7gZJjVVWDeTc8w1gtQ9le01/GxXonveoz 3O2hOLeGqIuJiaTWYrR9ZhpqU9UB6ayPADupfgBC/lSH2RCgbu25kbTj/8lZxazf RU+G+tKTE+vouIJf9BRFv4d2MUM6RoYD6kGiftveoQKBgQDXKvTzmcZeJrkKKts6 FBNfe7+VlEOSnr05F8K0OnxjVVEj7UVdKG2qTTVhKhrJCmPClwFXKpq/+vZMmxYw XlE3KJI2uNfAV+OWyaEpLVZiYvNIFtC0wmQDPS1oQK5Ms3pNVKH+lftMzKVGhQc4 qqXG5y9t1CeWqsrml9jJoGS7bQKBgQDIe9vAY5geOX7p2N0VnFOLjNKssaKc0vlS p70tEDvbbPwxvzESDcgy9Ja0QWJSB3Cod/nV2ihhP4BNdhFXxbk062gvTjGoyJd3 Lx7jvWvcvC8m7mpIiRhYodZt41LyyPUCVUP40H1U9PI+FAVzkUkyTglUkXF9RKFi Ez16fhvMvwKBgAzbWD+mFKBTmALvhKH3ySCPeGcrsM32BkB/FvdF92DIHE0VRGvI mqTucB4aMfeJU2SxOTdIKG8IQ+dX7P9+40N0fSgf62Rm3AaKjcK0HtFKMFdCZb4n T2qSIUB1fPTAVLKCOBvKQnXYVJfeIwxTxgwYjFD3uFXcZrtYn2+M0fgRAoGAYT+j cwlcipy9MVXeuFLiO7kNoHNyO7wi8LMpEqjjQCb3lnH1rZo92GnIiJuGw9+UCERa Th/KopGY/Poeo4LnugHOwdOeRw82Wbvjsfj6T1KBVNMlfxXxV1z5lMhGPjq4jm8p z5HimclPkElJ86sv5FTyNbFvaaJW3ioTEk4F0iUCgYEAwU/n9HM8S67AYtcw4kWm BdtpY/AS2ZwOEBSBNxLp4LMMdqSaM3nFo0VOjrSoWhOh5kFYXiBb4UPDhIAwwamn c9d32a0IjTepWqIeTbZDV1bHZWjUVLKGbwyH/b0/FZhlrR7zXgRHAvRBPU8ejUC7 gR2KvXnwPQS6qawYqA6plW4= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_06/description.txt000066400000000000000000000005421322470703100251660ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_06 Purpose: Checks the behaviour of the application when an intermediate certificate does not have the Basic Constraints extension. This path is invalid because this extension must be placed in every intermediate certificate and an application must check that an intermediate certificate is allowed to issue other certificates. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/000077500000000000000000000000001322470703100221025ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/cert_path_ext_07_ee.TC.pem.crt000066400000000000000000000022521322470703100275120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgICTicwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0NFoXDTE4MDcyNzEz MjU0NFowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC14EqoEM0I9pvueykUMARNku1Xuqt/5DvW 3ck0ZbvtAbZMv1VTzzl7OB7qqp0VxxPdFVQTvnSZYK0/Zyui5BbbHa+AtVOPT/Aw YC5Vxw9tYgLpPTuaA+QJm58oG4EaE73YzYCHwuqouC0Y7ZrNQrJ+UNPwnXZw31BY b0BtEft4c6AwuJCz+qZMwFTPO7CqpTfpq/Gq3xzikIf41uhpoI/fC92el5zOl0P1 KOUpGD2w4VZmHo9zGbAIEvO5AJihqkHJjXY2Iu420gDV/Le3Zjl3mbIu+fnT/dox d1PMLIKWH6ZAVFXN8FYD8hqY2NfvDq3A2Bv9bJtwYZ9m23e3vSqfAgMBAAGjeTB3 MB8GA1UdIwQYMBaAFO5cE1l0RBLjSOfqN2NLCzwhT34EMB0GA1UdDgQWBBToIp6/ QDST9Qz8MLl06Bg3mp3X1TAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUwAwEB ADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggEBAB2u2BGM bNhvRrpXCTY6rubW88AEukLG/9FZ4whDJsaL/r4DOGoADQkZRbv6NgioBwJZa8hG EOaEECGGpDbSikx8bSOe/qXWOlsIO2GNtJ9d+osZ+4v40+520kxm+WFul5lpPt+z cdYb3c55DEKEf8yq0LEzrzn6ONWDGlF6JJnJQlzQqk+YPfLtB0mxmNzzNZxo52ZV PV6lkWMdw98ZNjk1Gpiv0kOUQyEOGu59FbLEYoHv/ct82ZMEb6AfmiyT3P+aeBzX K6SaSbU9yx8JhSq2uNW+9aiY/dEiWYZBOmDOamydT0QnCmzkraErSoovAe5ovPy6 RO5+SgTKOysoRZA= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/cert_path_ext_07_ee.pem000066400000000000000000000033021322470703100264130ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC14EqoEM0I9pvu eykUMARNku1Xuqt/5DvW3ck0ZbvtAbZMv1VTzzl7OB7qqp0VxxPdFVQTvnSZYK0/ Zyui5BbbHa+AtVOPT/AwYC5Vxw9tYgLpPTuaA+QJm58oG4EaE73YzYCHwuqouC0Y 7ZrNQrJ+UNPwnXZw31BYb0BtEft4c6AwuJCz+qZMwFTPO7CqpTfpq/Gq3xzikIf4 1uhpoI/fC92el5zOl0P1KOUpGD2w4VZmHo9zGbAIEvO5AJihqkHJjXY2Iu420gDV /Le3Zjl3mbIu+fnT/doxd1PMLIKWH6ZAVFXN8FYD8hqY2NfvDq3A2Bv9bJtwYZ9m 23e3vSqfAgMBAAECggEAR8oXHdy32dRhu1IA5neHk0kuBwVnQW2I0yirDVQkyAn3 d7bESvcOVN1TksQyihCQ/iC3la2FH6+B4vdpyXunq+i9SBwKthRTFf04/OG8bKwV wxPI7WOgxMwZF/83R+BH/QYsuCnPbzZ3kpHjGyc7BlIIPj8hK69x6t5K+2JwNNwg TyYhfeWLqoOc5FlYQ34NH7d8YyJeEzlHb7mDU8Pfh8cs+tIpRblJozUkDuD6y+Zp oDfPwJ/mVYo2QKOUmAOTWwNtutE6HP3R+39kRbdERWR3VrJEq1FJT7KoLEQtNZ+T j88A4RzARQvmozT4AHX0G19ONFTJF75nErjwWhyLDQKBgQDlrPUO4LiZfWisCenX S5/6OnXwNF5vxQJ3RoJjkxtqygD22LMBlvxKCNJtx4q/kExwbKHL7jQVtAAAhYcz VQvxHtsOkNed1iCEdIFV0Mq9JzXwVe4YBeNCslReBEXBkOMiHBIu/jAAGszRr1X9 Ep0aQKgTud6LHFjm52cQRnWTSwKBgQDKuNKjFMaFIJ4AnqmtQ/D7dhgLPn4XXDbW pn6qlE//0kzvsIVPVEyAL2B5RWNCRrWrW6iI8vYC25FFrXJT12k5Jwt7sCGHJqrl LvQDtm1jouHRV/vmqIiK1GNDD6P1tHNp3kvpkBFkQd0KaqLDX4d8VyOXjLj+iNro dCIhmDZdfQKBgQC6hyoK6DTj6zbcKbzxLikBxwLLjyx3J5AmIGx6xBlLND1uPHW8 v8ursNh9ccZcZ6u8zmzku1MvoR0zTz6LUPG+5KlRfg6u0B1elWQItuZAkpy60H7q obV9EGl2ZY/lcW8V36hg4+1F2H4peXWjb7+Jd6NJSfXUErSc6qgITsDkWwKBgQDA P4yKWd52S9trjQwuo7r6TiE5MJeVgb8Dyztee25uljqeKJIUDEbMXaGpADPEm5gX nMH0tiy1wxI+uOEuP5+rMqsCLqNtLy9sTx3cE3ojvklXJZBfSz7KIebMpx1/mxTE tqrZIeZMZOXBxiT7ETJEqcK4Kx0ZTiIDxnbD0zzjZQKBgEtR4MpYSl4cO6ZYQgSR ZwZ0m3WXapu1bVvRuYzoh2/1TRr8nZxWCUZzD6v1Jrho13PoM4PlHxYVcKIQOlUB tmRSOiutR3FZG4HcabUnTNyIPHIpkD98UmuMOmwqTuQOBCPnUQIrCvmUts1ge5SD N2EEVtMhObKgNdIDt8amRB+D -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/cert_path_ext_07_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305430ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/cert_path_ext_07_root_ca.pem000066400000000000000000000033021322470703100274500ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/cert_path_ext_07_sub_ca.ca.pem.crt000066400000000000000000000022521322470703100304320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgICUg8wDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1NDRaFw0yMDA3MjcxMzI1 NDRaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAI7cX7m5nLzPC2vRaE6s42uZCIh0lJVv R74r0lIvt3EMB8A9cjbqcq5g1vayoJao+NmVNMT6Wuv+fBaoGSuhZ+CCW/zCyep0 A9RXzOTWjGLT7btMQaqiBjG/ZVcMJMZOK5C6LpwUa8rWxyJKgrTTWraVIAagmQ1B bEL94FjUa5u1D295vsu+3Kg+lwx7q6RkUfT/w4lqas6x6fITDT/9dWXEIBk63/oB eGGqiOJFpCTMg2bKuI0XXfBgjPRzSSqlaeL80He/xu1k40z8hnr9vDVH2flGnfnb BZ9t8wS0MerV/aAoY9YrJkgI9vGRaZqnGaOgHy6s/vyZBcUYoJHekvcCAwEAAaN4 MHYwHwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFO5c E1l0RBLjSOfqN2NLCzwhT34EMA4GA1UdDwEB/wQEAwIBBjATBgNVHSABAf8ECTAH MAUGAyoDBDAPBgNVHRMBAf8EBTADAQEAMA0GCSqGSIb3DQEBCwUAA4IBAQABrNlI OnhK86vhWOlA/uSaGvoGAuoMFJN8viRu2bulw5BPX7Ci33oeHPuDuUuTcf5S3PQ+ om5t5sPaYTJ7Wqe+S+9E8b0Vk6VlYZLMFdjOi6WZmsILlaOzKNf6BU6w92pbFVID J+ChjlFSsKPJnGYq195F9W7VVCsMT5w3fdIfEZL1owL6j2uAHED/gi4AB4dMjLDk Z1pOzysAaWkxjEuZoLtZN4jOXvxE6qTtOOR/64yUOcRMYyBwddz0VDlGxhQCOP3S hiumnSArFd8tSmPv4d9uKuuLf4AevDL7GagrDc6Wwt4vBz3yheX90IbeTTC9tMFR XhIfHCLyTSIRS/rF -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/cert_path_ext_07_sub_ca.pem000066400000000000000000000033021322470703100272560ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCO3F+5uZy8zwtr 0WhOrONrmQiIdJSVb0e+K9JSL7dxDAfAPXI26nKuYNb2sqCWqPjZlTTE+lrr/nwW qBkroWfgglv8wsnqdAPUV8zk1oxi0+27TEGqogYxv2VXDCTGTiuQui6cFGvK1sci SoK001q2lSAGoJkNQWxC/eBY1GubtQ9veb7LvtyoPpcMe6ukZFH0/8OJamrOseny Ew0//XVlxCAZOt/6AXhhqojiRaQkzINmyriNF13wYIz0c0kqpWni/NB3v8btZONM /IZ6/bw1R9n5Rp352wWfbfMEtDHq1f2gKGPWKyZICPbxkWmapxmjoB8urP78mQXF GKCR3pL3AgMBAAECggEAFpPqhwo4JLjeF7idMQ3u1UL2z8YI84MGRh5b24RSDAo4 MWAkrFwqKrgAUTXS3myvA4gqslTUyMZL6zK+45/bMGa5zf0k9ypFrqn/pkzoG/hd coPvPt3jd7pFdFfleffBt9pM4nrxvDlseFVpSdW7WO7BhHqeJbOovf+slK1holZj OuYRIyvU+JJU/z11nxodhHwdMSzEupTFGMQ7gw+jz7uHoa1S4LXuRv2u4JEzHI/q mZAgpYNLk6rywzD8en4el2LWidvFv8s2NsoAb7J8VAMoKbytok4VZm2n1IAGEx6g /CCxrZCRWW7oCU8+YRJ10cA0j3NACc+GntIDggzQvQKBgQC/rfqEIklNVPgPgHK1 HNTKJDwhv3984jWiJrSC18xBpF3TzMwvZ/mIyRJ3uCK28OmCTM3VO9xUyOk3adaz knzgu0PXrNjiTdKhVk3jwJcBHKbU33slFwneaiA29I5lyh45yel856JdyOyw4E5R /rSOzLtgq4HaxNhq4v8NImThZQKBgQC+zKx/DwUFyxfTf6pgdmOn7pTNaxtKFSGw w5Z93lhbKBNNw5qCsirC+Pn/I+Gb7cDXnZWqyZaoPftuv6vt1RgcEboJWQNzP2Nx 062tsoGfJFt2sy0hPfpgAZVOkMzRB8x2XpCFOLO+DceL8ptZi3Dbrngh95/daor/ Ms7WeiHrKwKBgQC7J66xkaCtB0fmKu7VdD842ER2Vzqtv1nK56vdDcP8W/bZNOAx cX4uVtXXW01Z/sShW0im6XnqtvkwCAGA+IlCDNbjIXvrCz2cFl6bAJLwnP8wXr0o q+QQ7OJjhkn7jWwR1NpMAQeCNwsUcQ9H9EBsJe7XJt71srn1M4sBUhHaGQKBgDOi oGwiXHGc7O3H9wvz/jRMVOjiu5fo8B0uUWPu8Gp7Bf5dmUsVfI0XZFCwHTZduXqg owh9VdBiNdFa/eR3bvbptTciZ9SgqwD7EF2ZmYrABCCzjNsaMtAYnZeNiGBpg+Pk 46eqGLqub/pnxbMOEZTiOpC2uwTo+ITn8yIIG3XRAoGAXUbDa+MoEbQxnh5HX4z/ wIRSPOl03npF5W+US78Ji/HSvky3kqVBmaxYttEVaU3RoJkQcazmxdh3NAPrB+gO npaAsgHtOAzMRxFwMu4dcBvEzk1/CbXxxjvuPaY+GdZkm4Wxa17yvXKpUSUFUoAF V9hUB+7a3M5OsWxr2lE7G9U= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_07/description.txt000066400000000000000000000004371322470703100251720ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_07 Purpose: Checks the behaviour of the application when an intermediate certificate has cA=false in the Basic Constraints extension. This path is invalid because an intermediate certificate must contain the Basic Constraints extensions with the value cA=true. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/000077500000000000000000000000001322470703100221035ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_ee.TC.pem.crt000066400000000000000000000022561322470703100275200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDOTCCAiGgAwIBAgICTicwDQYJKoZIhvcNAQELBQAwJjEXMBUGA1UEAwwOVGVz dCBTdWIgQ0EgTDIxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0NVoXDTE4MDcy NzEzMjU0NVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnKvP4Oj27TOxu4fQY2XFjYwycJHN+ n+3NCATzEeKgcBQf+qY8LjUCHQaMCaFq+RkT58Q7E8bPp89nQENO904NUJv39/G4 WIfyU4VjCgod7Hpi/ziBN+JaG0HScAloh68KM/na6BS/PAIp5zmQAOGCgUkLjr3i IQja/SHkbgD+ClziqhCwE8RzVFRwn0ECnf4pAX0UDE5zxbTwAmKGl+VQkYp3qfig X+m4s8iURTReAkf5bmq/an0UXFcnvEdvz9Rs5eRbh4xS8OfbwS0jFtVyoX9xus8B XeuTsQQQM5bSuCJIlVSsG+2+EtmG88CdO//VEUKZJJLAxhXgG0enFj91AgMBAAGj eDB2MB8GA1UdIwQYMBaAFE/8cgLGhgiLwpTUhCp/RhfLtTuzMB0GA1UdDgQWBBSD bX+sBDBa0zyz+S4F412N8KPY1DAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0gAQH/BAkw BzAFBgMqAwQwDwYDVR0TAQH/BAUwAwEBADANBgkqhkiG9w0BAQsFAAOCAQEAL7TX pGoVGGeFmQaXB6TGbu4Yyrmz6nposq6HjS1jYCaigjjCI7m2RJlKvEJuVwDwtP1v 037VJE2VzfQLamhbzd16zK4EPbuNAxivQSxLUYCx/J2I3giwedSAN1UE4ZxrtXoW ul/LyC0YYuTsXZGrR9LYeNMQnO01VLhpz8QUlJsPpVEqpF87YP1Pseg5W4UBUuRp 1hDntGXEvmJXo3kkfYvYfA4P66/Ppz500zjWSWfheF6sxcBXvdADHOpjbZkFIuAu /ppmmg2YGYGoVGV52DiV5Ny6e/tSu6CY2JkUa0Qvh1hFXtbAg3iagwY8rnSNE5nU vtyJAd1c10ZEaDnzMQ== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_ee.pem000066400000000000000000000033021322470703100264150ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCnKvP4Oj27TOxu 4fQY2XFjYwycJHN+n+3NCATzEeKgcBQf+qY8LjUCHQaMCaFq+RkT58Q7E8bPp89n QENO904NUJv39/G4WIfyU4VjCgod7Hpi/ziBN+JaG0HScAloh68KM/na6BS/PAIp 5zmQAOGCgUkLjr3iIQja/SHkbgD+ClziqhCwE8RzVFRwn0ECnf4pAX0UDE5zxbTw AmKGl+VQkYp3qfigX+m4s8iURTReAkf5bmq/an0UXFcnvEdvz9Rs5eRbh4xS8Ofb wS0jFtVyoX9xus8BXeuTsQQQM5bSuCJIlVSsG+2+EtmG88CdO//VEUKZJJLAxhXg G0enFj91AgMBAAECggEAI/6oNLFZvHxWRpPpqvYbJ7Lasr5YjhHisuzAoBQgT7qC YtZmN/wdFtzoHXwvYSjM4Q/dHXlnLCxuiMV6GMVAbbaHNvARAMgzUZbxWD9/qSzT t4BMCurdFtjapfTQ2cypgJFrgdrKKNlDgAFVUDAYXrD26QGt2kSRsxGhXB3hodGA 57U/gnt/2+i+xT0OarlLS0GqhxkAl2yh8m3rtgwoCkSgmSETIcUvd6W0aeVda6K7 56jbrHFuwHomkDubRPRedfrbXkBDiIrBj1qDQGuyIlKo/u5DltQ3lwbqcHJhWkp1 /CVe9hgT1SoFqC0gX+0lgjS1Ozv7dxILyfQn5u8mmwKBgQDj8MTPs2z7hU8xKLpu D7eZJfxLmDsfsJmKzZoU7R0YVpmQpbolYWp0QUel65c0ZCD0DIfgpR7JDONov78V /TstwjwI94SeKKnH4H8GGvgwx9e2Pw4ASiR7tlXZQ932mx+CGOVMWSqSAhIIYN0e k/kwpz1XoOJzNyISNA4oGhrPBwKBgQC7vwQCJDn3sxPK7Jw89gss9FhBwGZF4CrO a5dwyPd+LBuk2dffv4B4hr1TSzFfewis6PouLPYLvmIU522Yn+5lslKJdC6VASfN X5ZRGjnBGmo6824TIjmQwBN5QJ+AJkGtyk7Ww0XJ+Wn1LsgweJo3BajAfjyKiJ/j x6B/BG6iowKBgANQh/whNs99g8ZKOlPJZLkUZVPQFeQDFGiBTuFJBWhKMhd5YXiT rxGbtWgDQgKgBh6mY/9vR0BTMKdgSm4ObaLftTHIL6SBIN7oM9Cp6bwD2+4pgpGc gmVOJHdxVjP004N3yzXOAiF3aD248t4z9qavd+PjUges4JD1MtOAda1XAoGAXmvy 2CDgBnNJwQS+juovNKyutmLNDNdwr9/sigyIbCxCuuXUa/Mj6XnaPcnTSvHVqyCA sjhqhf151omN1PSaMQs992M3CjlKiz9HmgJWiYd/ZaaH9ZeA3Au9v32AujKDVaQp glkzACEv6N9eTwJYjNOLy0OxrvqHb0c2sKrJ+YECgYA28LWNZrtuCMkgbl4V7Nek yzrDvx+RofvaWJ9O+EJzGBgQT3N9xpDQoc+l5dLwR/reMWTfprS4vWUsuAbD8Y90 75Cm8EHVmDdkb7c+ktwVSVRPNiW/xnRGs7uPA6gBwDQvkfYkfakQb8vKN7NQQpPV aNMgN2YUQC01A+6zOfqw8A== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305450ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_root_ca.pem000066400000000000000000000033021322470703100274520ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_sub_ca_l1.ca.pem.crt000066400000000000000000000022621322470703100310310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDPjCCAiagAwIBAgICUg8wDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjUxMzI1NDRaFw0yMDA3MjcxMzI1 NDRaMCYxFzAVBgNVBAMMDlRlc3QgU3ViIENBIEwxMQswCQYDVQQGEwJERTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMXvTDKUK0V8BQkelYfrJ7k5xiSX jgcYGSkYvnCQgsO/O/huGXjtnCjNFazb6JP+Ecdluut9HFBTJvx58msvMzP50oIv B2MYQtXZ39Chs940HIyqZW4NV0hlyKKGfE6MTVGewpQUeIp3+tfpPAXCc0h3SIf7 NYZ+T6UifTNMS8aAMwZ0vf/KbXEEyfrOasWBsdrO2CeN2m+4Y0XWXZL8uqjM3beI 5WAs2C2TImd3YWDtwpvmUMz6MocrGcV7Y93cJdlQabxwqYvlUe0ODqXu5jGdYOGq Kt8rmFDJDPKnSc+xtE6+ODnnv3RXtcb9qU2TB0tw8rOAiKx+2Nv8HaWqCDsCAwEA AaN7MHkwHwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYE FIQR8VcIMbQqpqDvbvbMlPdVbpnTMA4GA1UdDwEB/wQEAwIBBjATBgNVHSABAf8E CTAHMAUGAyoDBDASBgNVHRMBAf8ECDAGAQH/AgEAMA0GCSqGSIb3DQEBCwUAA4IB AQAiiH/FQcLHHQrWs7r1WkuD44Vw7rzQkah2Jp74ODQQVUIbV7L0YHBvMnEV0vM/ uFwhH416JNr0RU7eHSoGe8mLlxs1KDCRef6x3afp13B+UGV7YYYI788/POxdAdTy sbhMibG1rmtrjws5oT04NrwOpXoIBy3I56tsGFxz77fE/FHIbg9XSLhYih0lIu1D IKxXr3meTz52a2AVXAa7KfNDrt8W0wRdzo50zusZKV6M8a3Xa833vX7FJSoTPSYa /nZxZncT66oMopODmB5gUIKDOY3t9yrHfYdQW7qe7fyrGnIge8N1DFb6x9j0dK9J b4BCwXxIqBN5EqhHUVPha+DA -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_sub_ca_l1.pem000066400000000000000000000033021322470703100276540ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDF70wylCtFfAUJ HpWH6ye5OcYkl44HGBkpGL5wkILDvzv4bhl47ZwozRWs2+iT/hHHZbrrfRxQUyb8 efJrLzMz+dKCLwdjGELV2d/QobPeNByMqmVuDVdIZciihnxOjE1RnsKUFHiKd/rX 6TwFwnNId0iH+zWGfk+lIn0zTEvGgDMGdL3/ym1xBMn6zmrFgbHaztgnjdpvuGNF 1l2S/LqozN23iOVgLNgtkyJnd2Fg7cKb5lDM+jKHKxnFe2Pd3CXZUGm8cKmL5VHt Dg6l7uYxnWDhqirfK5hQyQzyp0nPsbROvjg55790V7XG/alNkwdLcPKzgIisftjb /B2lqgg7AgMBAAECggEACZjhFJwTPmBADOwltfG/UFTZIvxnj40p6Hs2/gA+cZKm gWoyjqbUE9+1ywGH/7z+9wXGEBWrN3MrXcHlRjCDXA7N7TADPK54Ic8ER3pqXT4g 8D/G1pThBDVN4CDYis/KDp4TCIO26zKGwCH382jf7Bs/MhC1IgX32KWZH9FK5J9M LXxJJWNCU03r8ZIO9JHVIowqvgcljwCbAfUoiZpB2exfTM+rX0R1rS7Ay8o4TMrk OHbGlk5XkUufj8j0riuLdp67RtJz4QY+zmjjkv/0TCrDA06dAZOhfVegGyiI03tA lB/wt/OOU5x7cX/OQlC1Ollrf/JiFcNtt7XORvW1yQKBgQDoify7MJ2JXnPcQAdU j3PNLU998AIrVZxbK2Y2PCiYEfWEcDQCHiBIYZTwl3yXOhj8Y03eyExe3cymU7O8 RCTj7y0brhXmxlU9Pnwk6SNGEwfryDZ7hm9dwnXAPnBA0isoG5if3QnTMbmjHPn+ 7UHbltv+9EMGpdRAESGwlSihXwKBgQDZ541qoGqmzMCg3EO6WK+voxuDLjx4jKED JMN4BzIrHUE3Zp564ZpNVb8klVQ7vlOUB20LiVgJxmIB2Htg4i1IqyY9hedklTcn WLA0q1n0fDgf/kdgmFrgmNDp7NozqQJrs+yR2I/BTpwbsEcyOKf/+3pn1aVggBYH NIkc5aW6pQKBgQCpj9TF+lElVcZOGDJAKspaFmwcfOJYDvkQUbkaWwuOt6m7hMWn taf8n4snVI75BtgpUY/6nztxAXK05dvtsBLmUgUmZe56dKy7F9EWaRnbgw0HlNqF gCW8zItoPx9DZP0rJdRI3bjIUz31/q8cgIzBPmP0qNAnDMyUWumiBWG3KQKBgAyR cnKn9f7Q6HteuPlSjC+RNNEIJay+T7sir7OIlrgt48kSPinQQVoci/3MLyOTArcT BpMXxOArdROuLM+VvA7o8De0NXhzss6uKtue1n1nfMU7oVpM71Ds/3++jYdVRDJ6 Gjb/SqtXoWFndXPMGMSG+LRsejFqsdqQiSgFht2RAoGAdoRawASHfFKPGTEWEPtX KzVRN8IeMiosqhYEvjbr9KSw2ee/LtAS2pXftx93gH9kVdlw4SpJRZpQMlsf5UrA eVhkcgCMHB+I8xMuPoB/0wkJUYMp9M5eeSsREtvdiD9nKLylXPhje7y5f7iNO0tV Q8S/gDZYJLK6I75tJUluKKQ= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_sub_ca_l2.ca.pem.crt000066400000000000000000000022721322470703100310330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgICVfcwDQYJKoZIhvcNAQELBQAwJjEXMBUGA1UEAwwOVGVz dCBTdWIgQ0EgTDExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjU0NVoXDTE5MDcy NzEzMjU0NVowJjEXMBUGA1UEAwwOVGVzdCBTdWIgQ0EgTDIxCzAJBgNVBAYTAkRF MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXvi79gkN4fub7WqyZDM 7Yd6Q1inwxHW7znIUhfguon5Ol8kUAZUggwYhtCG3RDcAPnU/z3z6fqyQrrIKEOV gnqdBNNBFK9l2o0deGtvDSTsAX758KzumdqV10lm8MPva/3fTnLEITISNHIN3hJw W8to6OfcniwUX7ovBimimSkb1iRQ6ECBg5sSOzK6Q8gtBxPl8zlSh7wYNDFVeTCN /FJ633PWVDVxbHXCJFM5HfYhKxxQYRy8yWmMO+BE3EXdkTfMf+0/LRNWYl2AhqEi CTM4JFgk5jLiuLzs/FBVdqM5OcTh5gzXCHJpuKCsBmksuvzhTgenKVv5K26G/SVq jQIDAQABo3sweTAfBgNVHSMEGDAWgBSEEfFXCDG0Kqag7272zJT3VW6Z0zAdBgNV HQ4EFgQUT/xyAsaGCIvClNSEKn9GF8u1O7MwDgYDVR0PAQH/BAQDAgEGMBMGA1Ud IAEB/wQJMAcwBQYDKgMEMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQEL BQADggEBAKZYftYumsfWlgqNPtucYuaVKVw/5QoUr1OQSJOzBciDLu7NUlvgFMji ZSSc5AdBzEnPkHbxu5dj2vd/Fm8egNY+qynOYI0zPOHPH/C9c2gE1RjD1rla+xNz bK7KmIeKbcVw7nyGsfLKDI4h+g6ZVyCY6qh8B9l22riSLsp1QHGgfhSkd0p6iZG0 h7JuuOAX5GihG8oORdoOu3Fm9UnQ8Kcj1z9GBQ9j6lsTuC7VxQH0cpbzdr8xdhRw cOhr8SsRgWXoHvwpGXCDJxFWAtCcNn+OdBVL6EcDAHORZzuvmu7kjewqcGkmUIhY GrNMPdpdDzqvw+FqVbnVvMhocxNwWLg= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/cert_path_ext_08_sub_ca_l2.pem000066400000000000000000000033021322470703100276550ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9e+Lv2CQ3h+5v tarJkMzth3pDWKfDEdbvOchSF+C6ifk6XyRQBlSCDBiG0IbdENwA+dT/PfPp+rJC usgoQ5WCep0E00EUr2XajR14a28NJOwBfvnwrO6Z2pXXSWbww+9r/d9OcsQhMhI0 cg3eEnBby2jo59yeLBRfui8GKaKZKRvWJFDoQIGDmxI7MrpDyC0HE+XzOVKHvBg0 MVV5MI38Unrfc9ZUNXFsdcIkUzkd9iErHFBhHLzJaYw74ETcRd2RN8x/7T8tE1Zi XYCGoSIJMzgkWCTmMuK4vOz8UFV2ozk5xOHmDNcIcmm4oKwGaSy6/OFOB6cpW/kr bob9JWqNAgMBAAECggEAAf+bezqIOnxmZnwuqLOJ8It6E+ORbT42Z8sXeNdCqzqI f5rvPlxxMSgEsflPZ3FeSjC61DLf3XRLHDXyiCPgCDYrvA5tpbJWk+viv+WtaOC3 BkfcY1W8NGvchNTSm5BHAkS/I/DYvZjP4sPVuZHIkANJc+qiRktV/efIqhFhALOO 0V+Q5e9Rrf6nFjlIc93WZ1oqvSY5PvigDKhUN38bljbp5paYIgXTT9/ltt5AFIqZ JGRUgEyqihXpIr9Z8Jm7Jf0F6xiz/Qk1pA9RQr4Y8V/+OwUZDOrmzFhgBqHDlzlF TurjX9rqxaK5gyDaipB26dnZCjuGB5UN+Z92KLttsQKBgQD72wt02QRTGAIxpYQ7 1KLlSi1OLdI1VSRZ2uJeegZLODvowl5JbPJhksGfsEWgD6Pggb/n/rFNM5gIvWQw iRDQCEnTbYoitLrcZsaihi6fjRcC9jGLgBVwTKAYpUOtpbws/T4xWqmbuYcUfcKn kJhXzLDfXzOZKQhb4X6P5rDKXQKBgQDAmhj615fGi42mk2wTjqPlAE1e7JUrq11s xzzZawGMAAXcl3omjALX83dVW8HrlPQtG23eY9p4MDxsmBDjqU2wisSKex6gYXsM E7/qdw8iMXZ5MbuYSgj0SwsUDei54giIVM/bS6fF7uOr5IPmLX4tc76ycE3X0VSV S73N+g398QKBgD6UIriZ47Ux1fm4Aq9LGl6Wm8M9J2oRCcM5291VvJKcGmavRPZB l8geyvV+uw4WVMXH94MRicSA+VnSlT5qED9gj9d09EnDVlrFPr3LUXJbgEhAG/dp j+ojX/Q/vB09fRBArF9fA52p76JrzR4Nk4zdU2VtJkj8JROPZ/8hdvQRAoGAcDCT AnLY/xdFQNW467936qn9Z6DJ17Evb3CzGjaBpSpSP8egqJmAAojYZ0lWsUKH5UqH +jYSCVaXq+38UJDLJ1391GiZU3TU9xj9/raxgwpq53e3vaLKinq4Dkt31+c5byhw F15/cQWRawxmZIr1Z8Z3O3u9bEyMR5biDfxtcBECgYEA0ojsWapz98LZ38ZKIlu7 +8jQ9Ytn3+8s0hI6LnqvlWQsgiyy5Ifg8RPu/f/JW+ywdj/Wpqn+ONKwe/bYwSYD GMuihUkMvcCZsN/oYNBy6nZxfNwrSIdPy/0abZeic4ZTS+EOF3itA9SzP+dv9gCl KVWOrecsUjraxsuZ93FvgW4= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_08/description.txt000066400000000000000000000005011322470703100251630ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_08 Purpose: Checks the behaviour of the application when the first intermediate certificate in a certification path of length 3 has pathLenConstraint=0 in the Basic Constraints extension. This path is invalid because the last intermediate certificate is not allowed to issue other certificates. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/000077500000000000000000000000001322470703100221045ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/cert_path_ext_09_ee.TC.pem.crt000066400000000000000000000021401322470703100275120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDADCCAeigAwIBAgICTikwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0M1oXDTE4MDcyNzEz MjU0M1owHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCo1lzqwjFN7vQdJUrk092dVqw5BfrU6i2F 9nsbbUsRwg4A8asro9oSewqVkCOdl4pMVaVoFNen8gL7wIbcRt8o6q8KiklywtUn 0rsLQEQVJtH7PJ1H4k5gXhPsz98S/C2Ek5guieko2fFdNXPdfW0eY0UpfE/Hngo1 ddcQ83ch6VWndmXa9wYH5kkHmjdXcFMSwfkhfMdNpWcx8BYiRQUIQ2s+p7LdQJ9n Ih96cxu+qaAgB3S2mxxYStnIkX0p2WnEDBOBlD9t3YvBSZm/tkh4Y2apYsOFe3zd UXR6e4pTwJP3ZFDeWuq529zIS7dYcXEfXHUcGrVU/5fCh/pGxY7HAgMBAAGjQjBA MB0GA1UdDgQWBBRpkprHIUGGNOoKx++Tuxbzw0LAaDAOBgNVHQ8BAf8EBAMCB4Aw DwYDVR0TAQH/BAUwAwEBADANBgkqhkiG9w0BAQsFAAOCAQEAf7xyd3qugJf1LQJY fCwl78c9KmjcSR5p0sB6MJ/g1iVKWckEZ9cMeCkru4cmRAmnkb0w+c94rKrBQ0lW zlkgddeUUcJFLZXv7ogtWOg/9K9SzYsTQlM1OFtL7I3k0NVKpYQe49i9wUbL+jUN d3tBJitVD5m9XYTKHej9uXqfqeTjxFqwJ1WUxhdHiBz2aBIZ7HaGW6D61NWlWd5Q CcLeX+EKRxiVs4gr13IfW4TyqVU/h/eX8JBbgeuMngx4hdqlRtjZeaxC27+t8zxD rejBlb7WCsoy+fYUWzm/BAlZ4RUYVGmcPceeSdRjhie74BHK7JgDG2tvSJXWmeVX TjBygg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/cert_path_ext_09_ee.pem000066400000000000000000000033021322470703100264170ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCo1lzqwjFN7vQd JUrk092dVqw5BfrU6i2F9nsbbUsRwg4A8asro9oSewqVkCOdl4pMVaVoFNen8gL7 wIbcRt8o6q8KiklywtUn0rsLQEQVJtH7PJ1H4k5gXhPsz98S/C2Ek5guieko2fFd NXPdfW0eY0UpfE/Hngo1ddcQ83ch6VWndmXa9wYH5kkHmjdXcFMSwfkhfMdNpWcx 8BYiRQUIQ2s+p7LdQJ9nIh96cxu+qaAgB3S2mxxYStnIkX0p2WnEDBOBlD9t3YvB SZm/tkh4Y2apYsOFe3zdUXR6e4pTwJP3ZFDeWuq529zIS7dYcXEfXHUcGrVU/5fC h/pGxY7HAgMBAAECggEAUwQT69pQI+G6ZhpQGPOTpClZxTALhWUfvR7UqUe0AadI +23YnDyUnUGikqes23AHsEDsc6DL6Og2T1L6/JRcZeH+70/PjX3/EPWswnt2/m94 D/Bd5VqA7yFS6r3LEaqtNuLbkQZ+fnerFgmSTvW9EZP+Dcfx8lTi8CZg+RS9Hw6u fDvvMI31NTYl5sto+KsvhhHPej2owG/fxMq+Zr2JkU2P9Op8BAZVACv6R1EXVS2z xsD6G0UTEF0x3/x+mRTtRnFtQERf+SH0ZbAsF8JRGMhnkFyFl2SWFrBgSwNqOBEl OPdc+HkQ6yjNp9z+ZkzTgcdwvEGnRXclXm27im3lAQKBgQDlgTArl8j9WbI/FIA9 MUpCM1NbNIMjIFH5VPs1SNEWMTKBLANXB4Q6wOcfgsJ9p7Kwe8PRdn5/ZQCncuiq zfLByMTMK3wqASb2tRwvu+Uq6t0KZe4Kv6vbkLQ94kVtEdWnKKX5CUx/WtNn9cUh OB5x8gZdMniKrXIX1SwLQc8VQwKBgQC8VDSYep9e1gaSfYObi+5TmH52K+rfbPCJ J50lmrFTI6gqXvPLk560bEKrqtMzxpdHL2mCfF5Xoc9j7hPcGigxzkquaMQwZE8B yw+HcQRlylXNMeHctrsvci/4WOGLXu+FxJoRy7q0zq+JSCUrlOwWMfPRNcDmNm/s j+iQxA/GLQKBgEDs5x+t9OIXOeG2fwDQrN1Ff9NRa7fIMOiELfzI+L16dXstZFR+ f93PLJMxfqvlgRuEJ8Vd7DNF84VrcH7BfGdt0J6hvqJzaP5qBetLEG2vu5BxfYH0 7z1SFmtbU6CjZvm++hUVmFp+60eBs57OLW62tS4wVQGGR7yORcN5fofZAoGBAKa1 L12uZjcP4/92pbJiOtS7D27Rz3Z5u67dZykrdz6uOKVRKiQSB5GUp6vIam7Ro4X6 /T3pk6Wk8a12yROz/9Ke1tLuoIRpttpSguuU6pykcDFUr6euBaKpRLdlDjpODl7u Oqf4HM0CjLZMK8MZb6byDu8p0xi2JXtVpDvJomD9AoGARXVqqdnQ5OptU89uWu/y /N7Rzmr+FlJzrMpMTJUWJ22OAcNgDccqYocyFV2AEVEvMJ0vQslQIeR1hiAs9Lgd cMuHXtxLZ2cVTeVUMaAdFngcUZzTwlRK0SIX+SNdIBkbw46A9M8fsLC3sVesn80y tmlLCJxHBIy+gDRNgG7gLkQ= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/cert_path_ext_09_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305470ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/cert_path_ext_09_root_ca.pem000066400000000000000000000033021322470703100274540ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/cert_path_ext_09_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/cert_path_ext_09_sub_ca.pem000066400000000000000000000033021322470703100272620ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_09/description.txt000066400000000000000000000004211322470703100251650ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_09 Purpose: Checks the behaviour of the application when the target certificate does not contain the Authority Key Identifier Extension. This path is valid, although this certificate does not support path construction because of the missing AKIE. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/000077500000000000000000000000001322470703100220745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/cert_path_ext_10_ee.TC.pem.crt000066400000000000000000000023541322470703100275010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgICTiowDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0MFoXDTE4MDcyNzEz MjU0MFowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCEmD6rh3DuDBugBy6cn7zxdY1zXzDBaga cO0yYVAPy3JpnIOgXSLTPDygMh3CPlmYRA7vTNd5XvAFd7yX64aafuZG5xIlHUdT NhM/vIZ8sSPMQzNTM8N5B8Q4ug31W8TDnYtGOOR8hUF4oAGp3jQWL3ZWDrfrGScD odW2N2/1yXYXkgwXFgh5OPI+NIShkuhjE1mY/0pAVuQroRqMTLVlqaq0u7h4DQiZ ukbBIVRq1cqftqCSvP/V8Abb/6UALVveBqFexeVR32Nv1QV4DdRlLTHuXcuNPsVm cfyN71zAtBJNejB2+Avk0x6UWB3f1WWZ9pwrb9MUr7hMUVLKoQH7AgMBAAGjgagw gaUwPAYDVR0PAQH/BDIwMDAuoCygKqQoMCYxFzAVBgNVBAMMDkRpZmZlcmVudCBU ZXN0MQswCQYDVQQGEwJERTAfBgNVHSMEGDAWgBTgjBmqaSWaGiUA9rMouhv3DfnP wDAdBgNVHQ4EFgQUC3QeGP9mP0PKP2xDlYgQ+aEdqRwwDwYDVR0TAQH/BAUwAwEB ADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggEBAEIfntYU 3+ha6aCeOJI7PPyikPtGwbm6Ig1II2elyh2NRx15Mn+aOJ8J2dS9XkRpEo6mwtIi aTW7QQWYd9ciXItnhOk8Py7I2GwOto6O4cY20OASrawDXMr45/pCbp8tyBHkCf8W 7ZRlwxhtr11oUbyDIxobPCJtxWiAFYUl7UkpokaKQGNl9ODv1po44UZNyr4w0i8f feWJKAZTCwVsXqqBxsLzUElG0O7T/bwCAmQTWPl2lubIM5FXru0NDnL8kp6WUFW1 xrgnoISSmD72DH8nvLqXip3U09Fol9pkCHfv7n0RCynniQfyFuWTXN8eAXtdrvNn Fym6gjWOQbwIWio= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/cert_path_ext_10_ee.pem000066400000000000000000000033021322470703100263770ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDCEmD6rh3DuDBu gBy6cn7zxdY1zXzDBagacO0yYVAPy3JpnIOgXSLTPDygMh3CPlmYRA7vTNd5XvAF d7yX64aafuZG5xIlHUdTNhM/vIZ8sSPMQzNTM8N5B8Q4ug31W8TDnYtGOOR8hUF4 oAGp3jQWL3ZWDrfrGScDodW2N2/1yXYXkgwXFgh5OPI+NIShkuhjE1mY/0pAVuQr oRqMTLVlqaq0u7h4DQiZukbBIVRq1cqftqCSvP/V8Abb/6UALVveBqFexeVR32Nv 1QV4DdRlLTHuXcuNPsVmcfyN71zAtBJNejB2+Avk0x6UWB3f1WWZ9pwrb9MUr7hM UVLKoQH7AgMBAAECggEAPzBRwD1R9qhxqIDxGanu+PtY6FK8RRmB5v4O1SEHOuVQ nt91ohDBJosN6FD5DIZVkLTUMglQfTWyq+0VDFgFDyezXbGd4FS8pPTN5qpBFbdt gvP8caJAipdDRf8aTWGwWsrgjqA2kO6oZxieAguV5QVWH+YR7yvU3qNiXL6HJzz8 mYPGTQiMnqbVbnfNstVXK9QmuWsGDjarmJ4R+MHebvWUVPSJVmCTKhxcgDu/M8WU q2oLdJYpthM0nDIGJjyOAUDMJ47Md9zXYUji1yz5a/RBERPUF5KqyJhoJjL7taWl dmLeZVVb2y2sobsQ6FJ8onf1U6Wa45yBhckxS4m8JQKBgQDiozcZlhv9vBppjWQm ZhnshMgTgPCkVS2/GCNW06vynVDu+nBU93vWT397S0xbVxUi+YHzl63+eaW8gVuq uPx4xF2TovEk3kzjxEngUolxvpgYBsjzidTK1E3k7nLSmVf0U8SHTIClmzHiilfp OU/QuT5nm1cWAcrFat2KlFaFFwKBgQDbNxHSOloEUWFCwxIZIib6SF5UnyKyEZ1c 604UvVnKLk3DtJLNyqBUjSrKD71bgdEGju3Hyumw1tLSN2Kt6E87GeooMGU4cD7P YJUeguw4EuoBHuIe/USzFUFEKrw0Dhb1YgOuNtgnYutZTp8u+ikrH7uxZDGvo/Vd e70C6T1AvQKBgQCcjQ3EmNIhBUxhWQ+zDpgdruLdxhV0DnqZI71VfsWpw01ipo/t wT5DnYp7ylmmRpMNI7jGYSIJRFJd0iVV2o5bhZj2IHnec8g9FRvK3nien39EKXup 7q2Upe5gku2x18bPuQVqSEgdHQTqbZGoQrSFg1A+FSmkw/wjPlxmG21gZQKBgQCa tx0+0KwjjAQnCGJHltEHp/fbpYzpPIFhyTkMbi9nAJMl4tYRpEbQJenjPoSYhuCt zkaH0fBpPNUCRNDCiMkSn1GiF7X4xU+vMS1NoX1yffbl35Qb5wiLlB7CK5805hTS DuEmHdMkyS3tlA3JLAnOQ9FGe76NhhxwZBqcaV0vyQKBgFmIZ50wiexkxMCTzs/W IJdSCsW9Zv+UZJi+h95HqMe+IDX2Jk/0IKVmxQN70mna/fBLRLJ0oa0P9wRBmzP3 TsUmQI9DxXy/sfRpmz3Zi6YkxJq7cLnDJcuKIQ83T1ydhC4Pn/JMFbwEU5G8dTZw JM7MpPZS13InT9Ys8tz/rdqW -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/cert_path_ext_10_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/cert_path_ext_10_root_ca.pem000066400000000000000000000033021322470703100274340ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/cert_path_ext_10_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/cert_path_ext_10_sub_ca.pem000066400000000000000000000033021322470703100272420ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_10/description.txt000066400000000000000000000003331322470703100251570ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_10 Purpose: Checks the behaviour of the application when a critical extension has a wrong value. This path is invalid because a client application must parse and interpret critical extensions. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/000077500000000000000000000000001322470703100220755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/cert_path_ext_11_ee.TC.pem.crt000066400000000000000000000022521322470703100275000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNzCCAh+gAwIBAgICTiswDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjQ0NFoXDTE4MDcyNzEz MjQ0NFowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKxAdXrHilNqADJ4QOq8yM+z/I6YdOc8Vu rQUj0GN3nF4c/HcisMTozogP4v4l+DmrbuFt21wTDRZ3mmX3PBe/0ZSiir9XUasu 1uQ3NZb+mVJtah+pmRkwp/u4+QXD7q8PTmydDqjEKIzc45VmuO3bhQLoPUrQ49uf f9wm+BEdPGWoKjtNbkhywHJRaog9Lsdrmx5e/UwuvJcVqrE5gIaWU5xbXfTrUVGA TVq0vshqWRDtz4E/55KB7acBHvu8V3JfQbo6kfwLtAKpWNpZl5CLCC8GUSo/eseN NbL9OSeRa50djsmdF+uNZD1RU19Gn5NSfV0b3KvRDaMmAGSrL0DxAgMBAAGjeTB3 MB8GA1UdIwQYMBaAFCRUOnIu+YyK56K445QfLeWbVgv7MB0GA1UdDgQWBBSIlCRH MJ9x2YiChJShBraqokumgjAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUwAwEB ADAUBgNVHREEDTALgglkdW1teWhvc3QwDQYJKoZIhvcNAQELBQADggEBAFNaB3BR 14XV8fjOaT/oBfCX3YrHa7mUnsAEYvM+VZHq75gvJzN1vc9kZ5iuzaGk2WlCd7ZU /MUGi2m317Ls2qh4STg8sfOmxVkLmMeF+S3ADSfr3mz50KrnWmuJ/2I4/e0D9lty 46UkUYVL+R+X364FwRPT6STv3XVrlSzkaknMg7M5HEfeCmzaOEgBkBdiBmHiAeqg d+wEGnZiJLxOW/5T6zUBPYiJM2Tp6HM1cQLLOSQtM4Lk8ZZ/l8E9fpQVIWyR3fCA mPsGCmzawEQ/gW4JKU8VqAbuBilBftHYFquI5wiCeYG+gaKwEqflM/I4ASrCwDYU IFlyHAWJy3w6Dsc= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/cert_path_ext_11_ee.pem000066400000000000000000000033021322470703100264010ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDKxAdXrHilNqAD J4QOq8yM+z/I6YdOc8VurQUj0GN3nF4c/HcisMTozogP4v4l+DmrbuFt21wTDRZ3 mmX3PBe/0ZSiir9XUasu1uQ3NZb+mVJtah+pmRkwp/u4+QXD7q8PTmydDqjEKIzc 45VmuO3bhQLoPUrQ49uff9wm+BEdPGWoKjtNbkhywHJRaog9Lsdrmx5e/UwuvJcV qrE5gIaWU5xbXfTrUVGATVq0vshqWRDtz4E/55KB7acBHvu8V3JfQbo6kfwLtAKp WNpZl5CLCC8GUSo/eseNNbL9OSeRa50djsmdF+uNZD1RU19Gn5NSfV0b3KvRDaMm AGSrL0DxAgMBAAECggEABZbStv13k+JGFeAseTUOHeK9Ft4tDyIM0qitSBfx7fWe +ICTDh8+RkaPJJT2uXg2qr2TNDKEPrgxItncLqz24KA3zyUw8gi7xb5Bqy3sfBcg 2QhAWC3yrk8rFqWynXyCUdMxFkE1sLaHb31MfHjjgZYQhvNNkSV+w85D9MUIv7wC Vql+qEk8z7V+RIKIAKgwZyGLJFXw7vusbvJ1+azQUFWfiZApHHMdfYY9MwMnyZo+ 71wcket5nH4ev1U7JNmspyQBp2RynY/wNuXgxzaTkgp5jnABgxfy/lJynZwELd2R MI2EUNYX+rY6cM62xHg1aQxp6Iuq+lwfWj4SqNWkoQKBgQD8p90vRrT+71HeDjqE /OIw8zArD/yDKEAIY7DoyNLsDfiFfWMf1kLuKZ0gFDmJzvYYPiTo+UCUvxP4nMjb 1QlxCtF33ZIOPB9hFI7/6UGxTTLtGMwXkwTiVkzuZXiKOkHFUcgXbprGo0yz9c/5 XMCwzneQIbU95Ii4mGZxmqMNOQKBgQDNcxwutJ4Qn80+vV7Yo/cgvAVycKXE2wmA FPm5HbyOQPFSE2BqAR0ialqIiDzb3ntXHwtSeqdXU6VJATaGxhluHmyal6dJtW1o tSf+tCodOSZxoDU56dOf4S7IIKBDg0V3+5L9hYMNInaaSWxcCeaN4MwPTa555P6L aeag9N8JeQKBgDLLrPRsSsdWZic2xR0nmnIs8mo19JaJ6RXGtTKX7Y/33xc3dk5Y TWyEgUqJxmembGPDWrhcJFfDcshw/RD1a8iGXEa1DUA/Zi+manmY89QpqStx6NZ0 gG7g2uazD+D6hW6eWpQbcJKvEiS8Luv7ceIaIH+hx0aCQ9qZCT+dz1pBAoGAGC0T g+t9Ljefz2I5ZwTkb9WwTmczGpcr5waQ3FfDeHnr69yb292FsCcTwD1H7BeiK/5b Nrl4N66AJLcf03w8QdkSrp5p8SKIXWnz6uUIj6fJ/lT77nS1knrNJn+wXEF2S0gv Y+XyJfmIO1+ogKwplUh+us5JWc64pW8w1H/8PwECgYAIxroGhtOnXaM0G3UAY9Ni n3x0GmPOMoKnIhHLOeCjjCqpG0MVSJKLriKjImOwKDwamrSKwE6Tsk080YHbc4js zE6Qf16VTzOUBTgRqvlDeiNJzH9K2EyZFe7m5qnkm7d2cJnLPPiL0t2iIENJst37 518w8lOhCJSxV1c/sEcRmA== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/cert_path_ext_11_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/cert_path_ext_11_root_ca.pem000066400000000000000000000033021322470703100274360ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/cert_path_ext_11_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJjCCAg6gAwIBAgICUhMwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI0NDRaFw0yMDA3MjcxMzI0 NDRaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAI6ulYPDygnRFodJgOAE4wZR8IJ4eIBq Gi7XnPDoKj59FrDUzFFsQovcZ6sbsT7IwWCQoVtdEVMnI9ltyNWA6EwEN4Y/i2q0 Ou6aMghmoFyhJljsp9YCHIeXAIQdmfAXlqyUWFtueFnmJ+PjyzaxI/1IvuprxG35 g5LSjn2BkjjVXgjFeIO8BcjkKpKYHlv1v7jJ3zWTvX9JWvYiXHTDmpV1/5vkmEeE +bePGdtaoDAakzTYBTwkQEVZsHUhNmd3aqNLxGbDAV30XK1enDed1J+B/GVf1KXU 4FhDUW3imybzxC5Z6ZokkFVneBH7K3P1ik25KeXNSb+yT58mG5M5JMECAwEAAaNm MGQwDgYDVR0PAQH/BAQDAgECMB8GA1UdIwQYMBaAFMdPGIQtfK+M/IY/TwhCE9kl QGpwMB0GA1UdDgQWBBQkVDpyLvmMiueiuOOUHy3lm1YL+zASBgNVHRMBAf8ECDAG AQH/AgEAMA0GCSqGSIb3DQEBCwUAA4IBAQAox+b00unlZZggQ1ZTEkJuQT+qooU6 W6r17wJND8TrD6ynhAFhaOwA8Wt6tzlw7L/Tu2PR/FoI3RtvQdbKz0X7kx5/bGyL CbkI2vUTmsX4ZavSNx53UhTW1KZcMnCsjcO51zDsn+X33OuQ/VqNDXkkK0t3dWsk +7ZTeTdnkkCFo+NKT1bGwd2WdkB6FGjcS2PFgBhDBJhH3JLXvtpIQKKFDvcwUMUX EDs+9KmRu8BxGJstvIVad1Xzige6BrZ/wkIYhZRRGAYrsW7jttnEokiI9eWsK9IU N+uAeQaGaFzxakJFXW/p7Mnn42joYUsinQpfNjzpcIFps4y+HJfAQTqB -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/cert_path_ext_11_sub_ca.pem000066400000000000000000000033021322470703100272440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCOrpWDw8oJ0RaH SYDgBOMGUfCCeHiAahou15zw6Co+fRaw1MxRbEKL3GerG7E+yMFgkKFbXRFTJyPZ bcjVgOhMBDeGP4tqtDrumjIIZqBcoSZY7KfWAhyHlwCEHZnwF5aslFhbbnhZ5ifj 48s2sSP9SL7qa8Rt+YOS0o59gZI41V4IxXiDvAXI5CqSmB5b9b+4yd81k71/SVr2 Ilx0w5qVdf+b5JhHhPm3jxnbWqAwGpM02AU8JEBFWbB1ITZnd2qjS8RmwwFd9Fyt Xpw3ndSfgfxlX9Sl1OBYQ1Ft4psm88QuWemaJJBVZ3gR+ytz9YpNuSnlzUm/sk+f JhuTOSTBAgMBAAECggEAB/prA7b4otWDQom1lCkvytpddgUvm0IbkFGX/ehEdvGq iXUfruCcZLrMfO7PqZajCf/SVvQQeD9mt7Vl4sraSmhctLP0SzFUX4PFnw7CgiV0 agnjHWJJNzt2QNzxHvHJuAEUQvoNjpzSD5IM6pQrgpHdE4l2vo3CebzucOYEL6to vS4k0ZwcebHahi9aexcJoebeXFqQXf413QuUHVGuk5JaajEX7NYaqgaSPY0XQEM5 G3n6HiZSzZzQ6btTLa4Bgt38BvPlTgXg1RRpO1pbLOXSEA+izvEHk38FoWEOgeQX OcrTGUlhZEqXOz9oA6U+gUasozOZZc9A2v46eZKMsQKBgQDD5LQ2LaSAblhgecu8 CdXLd5UUw9gq3RAoEQnXNgJenU1Kq9kEf/bsiCouZQDWI60KE5brLG1BRktmgqXv DMmqB1uXVW2gxBCmRTPmC4+AVNtroNrSEnTtOj3eVYGTPXwBG5KkKmiATDwhUsG4 M8HbD7TuPgJ982ay89haBv/WUQKBgQC6dii5DA0mVXQ4BCM6Z7WxYN1zGf3aVJsA bj6lx7D10F7z4rTB0Q/y1KzwK1AbGmWf48cKKyNoA+X0/wa9VNdmmM24smtBbH/Y 3g/Wi8pj3qZpPHPMkv5AbCELIrR5znO3FVeY6MmQOhJA94MHEBqYS/imvUdk/HKd xidtjGEbcQKBgQCvdpVsyelFGJGUqMOyhGS5wT0JwnpHuocUPF7CJCBvOxrWPaM/ gpdcOoL9136uUHpYQj+2Gq8p/prfETssKhogcEK8BMsTa0s2g1n/Pm+lFV0MxKH7 9IhDTR3JnnFXv4TpQRdScKH1+VMKziOyqLmFTEZV97kns/NTa1NpIEfcYQKBgQCQ TK0LN/ZdOjisuRcCNgx4bzwxvWWlN2CVHrxA059xPIafO00jyUUMaeZEH2Do+K64 5C+/AM9vycSGq25ty2C/N3XNf9ZdVThDfubG5HwGeeJTAsOjCAbXmFaiJYOB2HHY uB2Iam7CvQ4vVN0D9ESApBqT/1tnHa8dxqHwt3jXIQKBgCpdVx7ybwNDgdHkzPor PSVJoMyidCuFywIeUQMi2oY4lyj2jxqY6oowEzFzjGAM74eAdajD2DuGMFyzYHtn X6kQDI7JPE/MMB8OtUEQZyjlXCA5TLj5WAf/3HqqU39Osd1d4IV2BkDfK9lYMll4 lK8awVmbZbVMWQL3nRChfj6v -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_11/description.txt000066400000000000000000000004231322470703100251600ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_11 Purpose: Checks the behaviour of the application when an intermediate certificate does not contain the keyCertSign value in the Key Usage extension. This path is invalid because an intermediate certificate must have this value in this extension. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/000077500000000000000000000000001322470703100220765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/cert_path_ext_12_ee.TC.pem.crt000066400000000000000000000023221322470703100275000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgICTiwwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjUzOFoXDTE4MDcyNzEz MjUzOFowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjU010/9L5hfhFBXPWRmCoWYQW8bIL4urO Y2uGq51Jgr2UrTRXt/aVPfeogIsvFQdSyNbES4MdOm8NhS/Wjc3If3QqCwd1NP9b tpFPgmjenQmPke3Yo/SnSgIQ9rIwOn4cVi1JkWI5y8TG8QVWm6phZxb5iiR9xfjZ 26XIaReJ/RBAVvSieB6MJH8INppYU4UzIxZr+SjSbnR4g6sdGScfqUlvB+4suLuB 03t/63C/X+jCUwfq8QHw+DgsuiDq4FzNVc4E0XGqrJjTGrhVodEa/AnIzd80yXBj N5zps/6jqP8suurQLgixrnrpMd01kkpXwB1nBNqBQAe8I93Z5g0pAgMBAAGjgZYw gZMwGgYDVR0gAQH/BBAwDjAFBgMqAwQwBQYDKgMEMB8GA1UdIwQYMBaAFOCMGapp JZoaJQD2syi6G/cN+c/AMB0GA1UdDgQWBBT4CxwKv7mpfVrBiiBwRkHHEf7NjzAO BgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUwAwEBADAUBgNVHREEDTALgglkdW1t eWhvc3QwDQYJKoZIhvcNAQELBQADggEBAJZRINcDe+GPHAeFO8VpXKzGjDIe7VyF odkSOGJBiNvERqz9a3L1GDqm6kDjelp0YFBvV5goophLweUYT8QLciujvZs83Oo4 OMKuhGyT609tWxWNouwh1DkgcHdIBnDVX1cqeWtOsbypMRYK8bGD18nMd8Or1uj0 wsqF2WqCxF1X3TZtMru1nM20kilDD7et1BFUTxeB6mZG3fXjQwDeootVaeYN4H3x DeZU69PGWkE5h4m/qZMabrFjvncjHYmSuqmVDXPfFoyak6vr9p4rU/F8H2R/Rdzw kcwF36VK5LGsaJ6p0GL6F8AwIHnc01reoznOi+jtUiNU2PNIz+Qa/uQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/cert_path_ext_12_ee.pem000066400000000000000000000033021322470703100264030ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCjU010/9L5hfhF BXPWRmCoWYQW8bIL4urOY2uGq51Jgr2UrTRXt/aVPfeogIsvFQdSyNbES4MdOm8N hS/Wjc3If3QqCwd1NP9btpFPgmjenQmPke3Yo/SnSgIQ9rIwOn4cVi1JkWI5y8TG 8QVWm6phZxb5iiR9xfjZ26XIaReJ/RBAVvSieB6MJH8INppYU4UzIxZr+SjSbnR4 g6sdGScfqUlvB+4suLuB03t/63C/X+jCUwfq8QHw+DgsuiDq4FzNVc4E0XGqrJjT GrhVodEa/AnIzd80yXBjN5zps/6jqP8suurQLgixrnrpMd01kkpXwB1nBNqBQAe8 I93Z5g0pAgMBAAECggEABFGembpuFMUTJJgZURA5XBpJ4OVxRNkyRlTgsgX1uczo QHc4DB3EOnwSAXWsuIkA0ZKYA0bP58T0zNG5yx2i1GtyYe46u0G0gvNX8ldLeJ+E cjR0qqbjQE03ssUjPx082nj455odk9Osl2omLv0cy0iTlfOuNVk31GL3hk4pHi/1 Edg+GV8+uM7HCIBi+yL9lDA9/ulkIF10R2ZGyhtsfLB3/mbgU9lJNiDxWwjALoWa /3S+vDUzHWGv1MPuuJSYG/JTvb607dPitRVo8oZcmhi6ZrHgzPjif3n5uBNqjyhk LstRUEXojQFCQor9IvhQIQuhKuURXTNTS+wC2QndJQKBgQDhFWxnj9HFgn1USuv8 2s+LP5GjyDxOZA9schKbHMMnHYaUlwIJ4M0W1DV2OMsqxiVP9I66xKRy0sfw7FKZ aypd+1sSSDvPgei7Na3mxq/cDHoGyZxEqpkh8VU8akdGKfnE03YMjolIVvqgPA2Q YmmbGIeRIprxB7bVhadDkSPdJwKBgQC5wkioT3W72uZEZtAVXLnJ6m+XsdybicLx cgxJ/7arWQB7ZkwZXnFSViTRbmdxXPjIzc4FzrXWFfIOdcQ53qYWYCuG/V4je8/A hL0Gv1oU5YpbturFskR5hqSZzkmd8tKhbivjMRDoseLKTwHH4d1VFZlr1sUqSNV+ jERa55nVLwKBgQChclxvbBlrMk3zSEo89DYqC07Ly7R2Bg+KGch+ugLA68y8iBRO QZDZ7xzpz5Lq+3WIBELcdHAAbHA9v0UABn49Ky4HzwgXr3bf0YELJzi8/bYJaFNO bY+paRFaZGD7UuB07bifCR4vZTQf+vM/vVdCiDW1RL0eZgoe3d87979hwQKBgQCw 7Uiw7sXvgCY0XkyxHBllJSLWtDSv/H2t5Hep/6In/+SCpEO1IgwDZUM6KtLh2bCn 6cXiKClvWIWtmiOlDtjYlQ7ASxDf8SxGbOdxxs3w+1RV2JoyZIHt0f1y9VWO2Fog IcQxZ2l4iP2+vZOvowRh5umzGeO/S5H1L3pnrxIJRwKBgFqE5JLZJetiwGAgmVtj dfoUKLhesBODDCXrTS+dZBFjSB1ih1xXZaNNmMVXMRUi3WPs/3ET2PhLJXDQYn68 EwNdjS/XqUJnSuOSlOn2DYL3G59g2/c6DS/uXNRGxA5p+hUsS5UydQb96KDqUwie BxDCjymvW7qbg/PLsA/pV2iO -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/cert_path_ext_12_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/cert_path_ext_12_root_ca.pem000066400000000000000000000033021322470703100274400ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/cert_path_ext_12_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/cert_path_ext_12_sub_ca.pem000066400000000000000000000033021322470703100272460ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_12/description.txt000066400000000000000000000004421322470703100251620ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_12 Purpose: Checks the behaviour of the application when the target certificate contains a policy OID two times in the Certificates Policies Extension. A policy OID is allowed to be contained only one time within this extension and therefore this path is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/000077500000000000000000000000001322470703100220775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/cert_path_ext_13_ee.TC.pem.crt000066400000000000000000000023121322470703100275010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDTjCCAjagAwIBAgICTi0wDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjUzOVoXDTE4MDcyNzEz MjUzOVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHiUHn9iXfDWVR5lISY9eEwyMoSDGAgPmO J1YIsm+so2SswD/bcbH/49afippWp/sIkY7uMe7ITVPBZfF+daPmEoP8hT0E0/tp Sr7SF8xxOM3S6KmgwDW65FQNOph21xXtJ2/TmecwZeSlH9zbpLlDcqwVS9FXCEFp +oQCZNJwE5h3B0IYtIPkCeFr1il7IHcoxxyb4ic3KztKVa2coSXjrs17RgbtISwP jHiN7AzDj0zyOoZl96Bun2SNzZxycu2X/+yZddAalVFdXG3YIcXhLSr4LNtO88Qg r6PGPf0xHE2tUUys23gF27EFsEuDUfNuXgsL9sfyNqnREDrfeUwDAgMBAAGjgY8w gYwwEwYDVR0gAQH/BAkwBzAFBgMqAwQwHwYDVR0jBBgwFoAUlSqTLdADuLM6yzYg 0dte2ryVwekwHQYDVR0OBBYEFIcpAUcOgfJ7sGLK9VozyrJfJFPzMA4GA1UdDwEB /wQEAwIHgDAPBgNVHRMBAf8EBTADAQEAMBQGA1UdEQQNMAuCCWR1bW15aG9zdDAN BgkqhkiG9w0BAQsFAAOCAQEAEH8C9A/1ApL1Fm0eu8N4FGbt2UATn7+r5uY+cN4s kTR5IR7Awq/o4sVcOfRPXZJbP1CnIq4JATAGF47CknHwdAb5h2t92DynUB8n0RUT z/F8ILbrBrLXQRe/0+C2ARMiY0PpN/d1LwfkXg5+v4LdcI1ksYMxyslrGtAinO/J iFsDfNAXt13nnMdFKoeRRnQrNajpb7Nyr9rFe2hEZeLvdN1xHdl1vnt6YW+uAhl2 y9bcyO7uxic+H18k9OxWNGEh/JTyywb1dGOo+GWZSThQ/X/b/fKSytX4mig63VgO DziaAbOHIiKKfc7bxt5QwBB36UmpKtJ5Q8YRuwAXUgNiEg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/cert_path_ext_13_ee.pem000066400000000000000000000033021322470703100264050ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHiUHn9iXfDWVR 5lISY9eEwyMoSDGAgPmOJ1YIsm+so2SswD/bcbH/49afippWp/sIkY7uMe7ITVPB ZfF+daPmEoP8hT0E0/tpSr7SF8xxOM3S6KmgwDW65FQNOph21xXtJ2/TmecwZeSl H9zbpLlDcqwVS9FXCEFp+oQCZNJwE5h3B0IYtIPkCeFr1il7IHcoxxyb4ic3KztK Va2coSXjrs17RgbtISwPjHiN7AzDj0zyOoZl96Bun2SNzZxycu2X/+yZddAalVFd XG3YIcXhLSr4LNtO88Qgr6PGPf0xHE2tUUys23gF27EFsEuDUfNuXgsL9sfyNqnR EDrfeUwDAgMBAAECggEAW/Hkm7WyF8k9cfLWyMCXFAczUSGLJfLIi/eWTmWizgNw paXlBwKqCgb75AJjQiEfrQAdw6bgqA3x1UFbeXFN9/t6NEdVKb9gr1ERAxCSVW3e chxh5cAMQjVqgboJfWF5KhGtFu1pOcUKCgjXpaKO+ASERT/tk9QrCGG2qL+6tIeS snLsS5AipDvkXXh7rjQdOzRXjDcGioIIJQxxGR+Lx725d+hKrWsWSSa7bJVEkR7F P6VawJW7z/X0b+iDXZ1kYIKNdH/seJOPNBQLRo2UIeWjX0VOwfUf7y3AVIbV5bNw TcXy9euz/nFY7VXyNwK6Cw0XPx2dbTI2+dNijdCREQKBgQDn5gaqrbjN9qL+gXgR OWaYvYX2QUSohrhXN3pxheqMybn0lYpTrI0RP3hGMuuN4/jkO76ol4CTatlOppuY dKNs2XN05W6TdVORfNFCj0UHKbp3biKC6+Soa15IdSaMfuDlwh6mCJ/mbMmF9T4I axCdSXq7noL68UeW6oOZ8yZUGQKBgQDcRi/G9juifqTf1dICZZ6t16v4zUEywV0+ S3Yk36YnPjVuuY12DM+VJNMHQVX8Y/rkurNJTh4bEFsTYvYjtjCIKaHOBELFlsCT ynEVAHGSV+m+NEWVQBM0HqgsxEKTm93aQ7sGOv4IwDcgEEt5hKKtuREIgaEHrwol 8sMDtIKEewKBgQDNHqFM/WbW/87C0eBTU/OVLSa+YJMLgkayFsd+fNav+4s5dcCq LJmG5R5M8aN7mWfA8bu+QmwfeUaIFETTAHDBykIe5wX89q2Zpc8vUazcHiPqmgd6 yI80DeySqNUVNvFVKXSUplJRrm4+yGM7bQCAL8uZAyeWMi+BpSQM249OmQKBgEeG 3wLLeEfmueEZTI2Ms/8dVnF/LRmvInkVBfMpUInTsIQY6q+Xr1xtzbzAYYyIZrMZ URiPrkT5hamA7A5indXJNwpv5cLFlhknlprMPxTXSUaDMMkrOlElV1TaEgheh6bV cYivZUgwKnZV9DwsbqrcuoQ5m7GkDDaQYvT0C6G7AoGBALzBpOvMF5ewRFUOuURD LmdTDw4/i7fjZog3JzctAzXmDr/+JMBMwThte2EtoE43UdUoLiiMxy2epv97bfCT Q2yhedPvRenJJHNSvW9q+IAE5XZmzyv5mw3k5gD4e89mc/pATZY0e4FBTapGZSJp a6E0Gj368UbyGbzqg/wovuPg -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/cert_path_ext_13_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305350ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/cert_path_ext_13_root_ca.pem000066400000000000000000000033021322470703100274420ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/cert_path_ext_13_sub_ca.ca.pem.crt000066400000000000000000000023601322470703100304240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDaTCCAlGgAwIBAgICUhUwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1MzlaFw0yMDA3MjcxMzI1 MzlaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMJ1fJKqvxZtLbHaS0AQw5Z0QH59HRur lrBc4F/9BEbG3RKwYCsMp8gXuE9JXz0ngIW5UbXdjZkMbryyD2rJ86SkmgGQbe3A WFJ/9fwE70rJUbBbVE4Z71MSEKLZSDWooXG11ZSLy7PqSwDh4ogk78P7fzY4Knqd wLazgFCY6HS+s8rgxr6Sw4iT7OfXXN3IiALCAXfKvirUpp1Cf1NG0LYd3fVfSlH+ v19EvgH8UqJ0CIh2sYyy8Z2hgDyhQnImSmsntBPLGcO/7VEoJeTOD2u8Xju/ejfw KxUyd9ZEivC4vEkclOp7GKKDcBuYplQGqraiO9B9VCv/fEJx5Ys+m90CAwEAAaOB qDCBpTATBgNVHSABAf8ECTAHMAUGAyoDBDAPBgNVHSQBAf8EBTADgAEAMBkGA1Ud IQEB/wQPMA0wCwYDKgMEBgRVHSAAMB8GA1UdIwQYMBaAFMdPGIQtfK+M/IY/TwhC E9klQGpwMB0GA1UdDgQWBBSVKpMt0AO4szrLNiDR217avJXB6TAOBgNVHQ8BAf8E BAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkqhkiG9w0BAQsFAAOCAQEAJkVq n0iUdzC8YZWraYJb03MfIrhFV7zwx5DMmYWzGpj0XW9SCwGZSaIuSuvNK24sN12q TWf6SiZ5w6SM7T8EHD8//gRD66up76NsnKqtpZE8Xo+DeJ3lwRJReP+X4jRPb99g jiBBtN9V0gemRs03xqF/wgLx6z0Ce8/q3T3FjQWX3366IsCaj9GZg8Zpdwnkm9Uf Lu0oNSnErRXrkgIkTdU4LekPzK3d92QMUhAjMAAe/m4VuQh/neRzOOv1ZvtbFY+i DnoCwgBys8dMCnvMoPiVy6QvFqEm4n2imiIniSaXOXdyZeDGjQmT1Q8AezeSEozB MQ3qvChBWHiKvQxqOw== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/cert_path_ext_13_sub_ca.pem000066400000000000000000000033021322470703100272500ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDCdXySqr8WbS2x 2ktAEMOWdEB+fR0bq5awXOBf/QRGxt0SsGArDKfIF7hPSV89J4CFuVG13Y2ZDG68 sg9qyfOkpJoBkG3twFhSf/X8BO9KyVGwW1ROGe9TEhCi2Ug1qKFxtdWUi8uz6ksA 4eKIJO/D+382OCp6ncC2s4BQmOh0vrPK4Ma+ksOIk+zn11zdyIgCwgF3yr4q1Kad Qn9TRtC2Hd31X0pR/r9fRL4B/FKidAiIdrGMsvGdoYA8oUJyJkprJ7QTyxnDv+1R KCXkzg9rvF47v3o38CsVMnfWRIrwuLxJHJTqexiig3AbmKZUBqq2ojvQfVQr/3xC ceWLPpvdAgMBAAECggEAEksl16ZjKPjxvjQ1tWaI/95v3XZnsUgIemRCYhqrYafT pFkeCEQTL1UL7GmP9sYrO76eBpM71D9sgNPqH2G1n1zcysjg4+efEiPM6v3hL71A shaQF8jY0DfNg4RtW/RBO9v0pm+AT6yljFpeX/Bu80D1oWQnRYxm/3O43obZV3dv PeRANG8ECkqTL/DInE4L5Ycuwt2CUY6pMRSdK0vKow0inHP090oO9Ho958WcvXQU KJVrL6yQmV1a9X3OJbryfmXIXSxr88XjuMH9nW0iV0boDOuzHUvnheHtN+r1EI6D m5BdjeqtQX4U8fm0KqRGbM9Y7ed3+mp16hX6LMA1AQKBgQDrS1f2iBFMzcaoxBB4 +2ne9Qiq/l3CnshDIy2N0XKfXRlyEanaAY5WDSBpTPqkBwgZOAbJhsKxfkPhBa4l SP/XwmkFfPbf56v9CUKUdCSNNDKZgBduIrm+BgjmSYtGlB2i7L+HZ0a1wEIkPeAy nB/0fVzxSGfKujmMUA5PSTME7wKBgQDTkjaDAg28GdzfYoE4YPxv/d94mpO+PkcR /ii5tGQczPUgo+EBkEIXAEPmVvbdbYv6hoRYT1xO72UxeiEGbPrsSrn43+5r5mjj DMDDg0LDlX5H5Vr64P2IqqxRlXa8If5b0juteR5w/pK+zEgkQfWBQFbE405tdos9 C5V1Xp/j8wKBgBXuzwNHCb3MDLGcnSB55xOGaclurpS+slI3zD5FANdEGWQdq2SL 8pWo4ZWPPGnf0exv4YoVir560579JY+KL3cQQzPkwyp58PlETLWD4ghbjj/qxcRZ blD9RQUaY+YvVlfik7Pud5PnmQLB1c1B6mSi7u/63Nnz4/tlVwAjBaN3AoGAfEgt oXO5Yb/HkampwtamM5tshMo4885drWIhxkUDci+r50qdSG/Xgu9y84IubhCF49rV L5Me5HeYeCIH+GBYXinfaSUSR2wIPSgmrDMVKxNMJSvD8A/unzOzGhG0t/s4EfRD fjnh+fpxdYdG8ZWVhCGpVus4DPFQBcIiP9ogDqUCgYBVq6UW/hsjHQoz3agvZEWB slAAZeBURtHxIzTBrIGHz1I2BTLI25NNwI1tbvHoblt4pvTG2Qf4wAiz5pVJwUYG Z3Ml145cm+fUHwAKrBvrNJPrCAnrMDjVRO9ACQZebCx2Q7CasSziuWxVvn+bBdDK PsF2YDQ06a+gDRveH3/oVA== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_13/description.txt000066400000000000000000000004311322470703100251610ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_13 Purpose: Checks the behaviour of the application when the intermediate certificate contains a Policy Mappings Extension which maps a policy to anyPolicy. This path is invalid because it is not allowed to map a concrete policy to the special anyPolicy. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_14/000077500000000000000000000000001322470703100221005ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_14/cert_path_ext_14_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305370ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_14/cert_path_ext_14_root_ca.pem000066400000000000000000000033021322470703100274440ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_14/cert_path_ext_14_sub_ca.TC.pem.crt000066400000000000000000000023261322470703100303530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWDCCAkCgAwIBAgICUhYwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1NDhaFw0yMDA3MjcxMzI1 NDhaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMvm0v2xggWk+PT9LvKUSupiasTJcjF3 yZE6gdq0WgjTGSTMOdL6ujgEtvkILPvFAEOSdgTLlS4v3yasNN6svUcCKw6PAlSD YL7dVQVjOVnSlpd1SNIl1Jw+Y3gESgjUr0zTktsI1sAijvNTUOiV6yA8uZGmwtMv 27Dz0veLoR7v3ifyBFDTCkVa1UDdks1hDzr4AuxTdqhgvKZX6nWYWRXUieOduAd7 b/xFVkgK6BnL64Zf0OYNZxxypBrhKXomXPiyGFJBtsCGrOYqJ+vwRD7MHPDa2zEb 0G2o19zLyYh1b0Xk0bwoFjYV4tYPI9M1anwvR1tQVyGPgtZqJMwZ7m0CAwEAAaOB lzCBlDATBgNVHSABAf8ECTAHMAUGAyoDBDAZBgNVHSEBAf8EDzANMAsGAyoDBAYE VR0gADAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU fbgZmC5vRGZPEqRbU7bSLZiFoCQwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQI MAYBAf8CAQAwDQYJKoZIhvcNAQELBQADggEBAFkVD/ePIUowM3YbfJBIHWmByLCz E4KkD5YevP7nfVxM2qXfRH53a5jhWMfBmee3l1oQpzh03s6CtKMA+5wGhaWTQRpw E6RrZqbrR5CMdyqA4UqDQ2WaNbFJrBfxN2az4sFU2dqAekN9/2skaoFd7RwQg19Z 9+2D69Hd2qOHV7zw17TbQ7l1D9NlXX0t+076bfmkbrfWmx2wtQXU7PFsaD/Md4b+ 1FLp7UcV2096qNkxNwVOKeyvrAR7gQiTE8u8tqbH5bFnSrx5dsDmzlN6o/u1Jbba Axs2fPp5Ve1pWlYFCyLZJH+CDdthravoptBSU3Cnf49hFjOCUHStoTV5hnw= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_14/cert_path_ext_14_sub_ca.pem000066400000000000000000000033021322470703100272520ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDL5tL9sYIFpPj0 /S7ylErqYmrEyXIxd8mROoHatFoI0xkkzDnS+ro4BLb5CCz7xQBDknYEy5UuL98m rDTerL1HAisOjwJUg2C+3VUFYzlZ0paXdUjSJdScPmN4BEoI1K9M05LbCNbAIo7z U1DolesgPLmRpsLTL9uw89L3i6Ee794n8gRQ0wpFWtVA3ZLNYQ86+ALsU3aoYLym V+p1mFkV1InjnbgHe2/8RVZICugZy+uGX9DmDWcccqQa4Sl6Jlz4shhSQbbAhqzm Kifr8EQ+zBzw2tsxG9BtqNfcy8mIdW9F5NG8KBY2FeLWDyPTNWp8L0dbUFchj4LW aiTMGe5tAgMBAAECggEAAkprs91llq9x6m6uzN+q9JetZHXogbdddsA4L2FZ/EIP q1HlYCRX5NRq3QUYoIt4+MDVztu3dEQMWTXPIS4XoCTdSrPHh/0h3AubtwyUdOWc OvbWFYhxZwh+iD+1J1ocVpfRXkdANZSlRwTvzRfKnLUJaCJK8cPnnDP6pSu0rQSL 9mFB2KI4advnoLW/wEPPhHu2Wq8l1NggHONeu7+4xJEMY57lxL0cDrgmtaCFxcxJ oIwVXkf6wOH1ck234Nbv/oXalCIUMovZkKeuCCjHWsLonJl9g1mOnhUH8xXzdMyx bX6Pekkv3bbtA4egTM58hChcjvX9q9WmfnMR7544kQKBgQD7AsyaYqN/V+ofaMRZ udQvdu8tZ26jUFD2cE2PSKUUf9JlTIHmDSI2T1pKt5zFl1lb2LGM1xoXs4tqMViU FZUjrC6b2WB4vFKxWhb6pbYPjNBgshJa3P9EUmd/2jY27NZWQvYMO8Pqk15Rsrej gWQ9Zx/ZwJzdTatuT9LhMbyrVwKBgQDP9FJ9ZKikTiEaasQ5TacYx3RsMLz2TV4R bOzRPIIQAZTFmQaRYsU+1aRzuDIrEUMCo6DlroQ+JGnktDtUtktk1Ug5232jg05G wMVI9fl4inCAnKB0E1ho0Ba6WG5lPRZ9CZzXAm6MckYOYis9gOCSP2gBQ8U+aJJT cqsoVfmd2wKBgQDf+293k+0xBNH1lRcguaGNeSOT8GfZcyHLxgpvgPNNh4HGwq5n CfEtZUG8ynsqFhO20XYdpxOxcpVE/SN9gITEgDBXAXIESoe/mhRHNPdwiMaogj2+ ttVRsfaJL76Q5GWeM8I6yFnaSAYyALe9PwijghH5zNYs49HFbZVPPYKNoQKBgGuV Wcu3dKu0I9oX3DZNHyJppaiHOmsuMXlQYeAJrrv7JW1osoYqlCLiwjZ/16yCPKmz 33yT4aSIkCQavgsgWDbtRHVyQTiDqM5f0nDhmFOtQ3C2FyiWDYoEBY4YS9yiUu0T OQnfHzQXtnigfwBNmWDv3q2w0u1rijATxcqTWBU7AoGAX3JwozQCVXPAHvJ9Sx6q boyLJ7OI2XX9T464Kj6i+/muNHJEKI8btMqhIvyoonW3qBcFYx5RaZxWJylS85ht ued2w71jsWDk8lIzsWahzTWkfG8QFHZrMIuRBd3WR/ilyDxVFGnmWXThxa+2mwSM IzuzwRSQMvhVVXSpGRBfDsg= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_14/description.txt000066400000000000000000000005631322470703100251700ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_14 Purpose: Checks the behaviour of the application when the target certificate is a CA certificate that contains a Policy Mappings Extension which maps a policy to the anyPolicy. This path is invalid because it is not allowed to map a concrete policy to the special anyPolicy. The RFC 5280 validation algorithm does not explicitly verify that. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/000077500000000000000000000000001322470703100221015ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/cert_path_ext_15_ee.TC.pem.crt000066400000000000000000000023221322470703100275060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVjCCAj6gAwIBAgICTi8wDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0OVoXDTE4MDcyNzEz MjU0OVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvHq3DMxypKRALFJ9p4h0xJYLjcD23/N99 JoZzLcIpggkjbQxjq4cybvHSYz8odVulnl9smUP5edgbSEsgvj6XeDwgs3RvSQMu S4khlw/9A9GKotafRhcAjJmNmVbYVnPYhe1UF8euEvRX5y4lSRMyEwBve2d37sW6 0x6M1Ds9i98yYlHylBYM/hqvPDbTM2W13DX6qVWQZWT3Uqz+flsfujzzh08IuD/k gva/me5B0xjUYStATxPIW9ua1LADKWUezQFC+s81T39TLzvCQDvR8LrCeNGLeKih W/i8JXc71moETcvaEN25W4U774aLYR0WSIWF9W6bWmDqnbFjeCrpAgMBAAGjgZcw gZQwFAYDVR0RBA0wC4IJbG9jYWxob3N0MBsGA1UdHgEB/wQRMA+hDTALgglsb2Nh bGhvc3QwHwYDVR0jBBgwFoAU4IwZqmklmholAPazKLob9w35z8AwHQYDVR0OBBYE FMyyQYUefutUUfqxzShgz6zrDfZjMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8E BTADAQEAMA0GCSqGSIb3DQEBCwUAA4IBAQCGBmuhYoP9vRIh/fMMCQqE2hy5eeDI KzhZXv80KVS5aHHyX6eBbRP6L8m0FgL6xrnmok2gpH/JiTOmY/RvQFOw0tqcn7pn eJ5yHxAzZGCgsRoJ8qNNAwAU4TyiGhILZ1iCBt7rrOU42Uj1CuKa4xu/BFGM4ChY mhjqNPgaR8LWxNzU95ARHvFGXukzsssb2IpUTMcYwoajo6dM4KmHTjkH2w+HnHbD HsLQVgSt0spG+BPv+WZz8jCZ6UeMfAtazix6e1S0JuLjqeHOxtTyn6Al9gSvO1U/ KyLsbSTpQuKGn3iogzQywlL3U26EcR6jkbfWMcPAZ9/FcV5ShhHig+ND -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/cert_path_ext_15_ee.pem000066400000000000000000000033021322470703100264110ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCvHq3DMxypKRAL FJ9p4h0xJYLjcD23/N99JoZzLcIpggkjbQxjq4cybvHSYz8odVulnl9smUP5edgb SEsgvj6XeDwgs3RvSQMuS4khlw/9A9GKotafRhcAjJmNmVbYVnPYhe1UF8euEvRX 5y4lSRMyEwBve2d37sW60x6M1Ds9i98yYlHylBYM/hqvPDbTM2W13DX6qVWQZWT3 Uqz+flsfujzzh08IuD/kgva/me5B0xjUYStATxPIW9ua1LADKWUezQFC+s81T39T LzvCQDvR8LrCeNGLeKihW/i8JXc71moETcvaEN25W4U774aLYR0WSIWF9W6bWmDq nbFjeCrpAgMBAAECggEADcFcJsJwbha/bHXKbv4hPhRs0cHZDaDh5F1O7EpcDCsE 3fDmRNUnwaqWeU8gZxfCaVTyUkzYdDn043FSejG9wUoWQ8wbL9UAi49iJ+6xhWja YCIAUVlBD0liYMDHSI3DfCHkJw0JiAvaTSYa9gTMBDMbGQ0MoigLa5+PsI776qgq BnS73PDTCUrwwZqMEaahNOdQZH3SJOWA20qyUKzWqBDZ6dbOnx+/4un8s39RqAsR 1wNKE7Q5G7LBstGqcIPvLvMXngx1f30lSuWKbixLquemQF/7EHb9/GgD6KCVak9H JNIYbtmLyCdjBGMegXqRqCo1f0O37eGIAcbbErRi/QKBgQDjFTd9EqBVOmopo0EU QSIcAAlGTEEf7rTRUYjAuiDuQPUt5ubPa0s58tvYb+p7kmRKpHd3JieD85ufdu0D HRrzKSiMbFE7fV1FNfk8/+JQqHDfnj7j4NTUBnn83AIeFcBZnZwA76rPvUGXbMnf 1HgHneFyjpvDepWmUkJcyqGy8wKBgQDFa357PN+N1WTOGW7LHZM6wTnc0snycMht +PCK+gpzAG59Z9XvcPLlU+98Fn6vYKyV9+F0LfjQpyzV3eWajJp62Nrc1jiSwaGl PYYYCUuixm52b+TRjAX8KQpyzDYvEAgB+XxKWzytfmKs5yPWII2akijUNpiY23Oq JidZpsyJswKBgQDeJ9yQNM+8cZh4wakiWpI3GGX6axFvXwVwnjaObclXrR7v2CxI EayXtZsUhHC+kboiOAJUA3S3J3VBLYSz/h5mcwajUjiqXXwJAMOjxKYwyIkci+D0 6PjtsKRZFxfPPPJf+cwsMkxGTd3EeX6Jxn/i27c6bn++XsfW3jTkOKy2twKBgQCj 6qffDWEU89y6H3XVoh3PyAYSKtbQvQI+BVc8HXY1nGMhLuj74U1cSj/rSQYw+dTy xBlnDJCuNlBM1uxAUYQmgg3fFONuPuXHPHktVfJ+GcI4Bpn3vwptH2p0fMh0dRwg /5RKbMzJxMmLhHNF5EuOztKluRskt/mmif1cO9lSbwKBgCaozTIYt4LKTe+g00Hq fP6PH4qCaG65t/Td1AEXj/pytD3ks+MxHzYFKPn0xwe2gezuEJNJDR/bhI0MZ3/8 dwU5UJfCMqqSpZntyyRzIU6zScwnpAVcM7QoDRRyWQtYLX9LZ07hQRYDNNwogg4f FYFeJ0ybiL3NC/XKhJKpbnju -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/cert_path_ext_15_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/cert_path_ext_15_root_ca.pem000066400000000000000000000033021322470703100274460ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/cert_path_ext_15_sub_ca.ca.pem.crt000066400000000000000000000022201322470703100304230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDJTCCAg2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjQ0MFoXDTIwMDcyNzEzMjQ0 MFowIzEUMBIGA1UEAwwLVGVzdCBTdWIgQ0ExCzAJBgNVBAYTAkRFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm0xXD5IDqn5nBGRUxlk9EXP1/OCtdXc TrUkBXmY0jCSa6VS8ik+IPMNbmfr9y52xW1Imfqz4cw4t97wMXe583hTy+KEDhz1 J2I3TlCRrCCRz4laEZN+AiKT2SKX2VcjrWkxNq+T/rCAJMIjx1cO77/kbNCjL4t3 3fXKmOiW5r5ePQZ5BS5jolQAznsGWEcj3qsd3Ua7vn13ygqsav11Q63ZgZUcx7y1 Xzh5YllRwYoXPKreJMurf3WYWS2DAcpd4bmVwp0u+tOL+OYXOrqsCUwLQigFXuVe O+hsb5hbz28e4xC+Q1BsSlA2/NkIVR+96Rr3vj7pdDh9+DWrgiFeywIDAQABo2Yw ZDAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4EFgQU4IwZ qmklmholAPazKLob9w35z8AwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB Af8CAQAwDQYJKoZIhvcNAQELBQADggEBACSEBLrtrXcWiFDauK1dOFTRQdTFVPjW +Df6mjP7wqvIWLpPE5Uy6R1zXbqZbM2kcjfAR24mgQK/NrVqoEaVsmkuxhPOuqNG egL1bHCHnx3hdrUyA0rjp19YQc8fzbwT25z7Fe4K1MxBLZwbVjJ5ejE+wI7QzQsf Iw5TRtHd147ja9jfM5uKIWdmBXsCQ2lak3KEh+ahs5BDL/l0imvvzT/t5BSZqzsE oG/YtkS1RiZUWyu0q5cZ4/lnUspsIwFPq7P+ymf2zGAzeo/77o4uypCzdwdH3OKc eqHQrsoynYRYeoT5rvDmKbDd0098FEclLxgzdABmLQ7jeKSex41iYLQ= -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/cert_path_ext_15_sub_ca.pem000066400000000000000000000033021322470703100272540ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+bTFcPkgOqfmc EZFTGWT0Rc/X84K11dxOtSQFeZjSMJJrpVLyKT4g8w1uZ+v3LnbFbUiZ+rPhzDi3 3vAxd7nzeFPL4oQOHPUnYjdOUJGsIJHPiVoRk34CIpPZIpfZVyOtaTE2r5P+sIAk wiPHVw7vv+Rs0KMvi3fd9cqY6Jbmvl49BnkFLmOiVADOewZYRyPeqx3dRru+fXfK Cqxq/XVDrdmBlRzHvLVfOHliWVHBihc8qt4ky6t/dZhZLYMByl3huZXCnS7604v4 5hc6uqwJTAtCKAVe5V476GxvmFvPbx7jEL5DUGxKUDb82QhVH73pGve+Pul0OH34 NauCIV7LAgMBAAECggEAHOHK3sbDfxXguf8gH452dWYxQ/u3E4VASN/IetwahabA TntgvUHsHms+2kQA0hjGAuO0Y0ZXCiRDZf/2Rkp2dasGaqIMjWdu9246HTKzJXw7 IVMfyhKoxgIgkopgpaJF0wNlZ3nx5Gs4xFp9urpFla9xId/zID7zC0NAWzjLymtJ 95gnemdh8oE0xrIPkJBgp8G5JC8xyRcGXzTWQsDeYB15mM6FcPyFEOb8WRVNa6qJ LCbuO/ne/K+9GC1jHGJLVtVwBSJhv0semkYPy65JBLZhR13mQNrYUKL1HsRy6xyw 19e/YWydDFZopkxYIIQ8HbIeQluT58aUiVFlkRACIQKBgQDxtx2XNCq4VHc1MntW eXrRxypd/ivkaEUQEHcKapuGEdPm9DbYuJWgZ82OKsJ//4W0oJpVaXYNnFKpYtvT 1MLbG6n21l5xSLHsVCnmlaRLx8JFX0HncYB+0/jFgmWjRcysIn2J0mf38bAd+Efn Wt03NtfHbfGZQ5W0/awJLTos5wKBgQDJriKYm5PIToCc13hdsoB3ywCSZDISkJxY utVSEesFuvjpbYhXpTMVCGoP/iphPLZ7XiXmgaQ/C3MJIYXUbD8LcxyHDzWZ58gN UmgS7keZxBPednEmTcprHKYNSDnJIoYEMzgNx3GCBepzjXPPKLYy/vQSbRmKNLFN dmsrYqq+fQKBgQDDICiSDDnETeNhnVv1peFhAV+ROwLhws6ltjTywrbD1xZxpYm1 D+Ux9Tn530jeHT8pXlDYTGdRe3U7aiO9cE7QpBdjvQ/GcYG4HwUoMHrN9fc9GzXP iU/KkoGLp8U2tb0Q5FLldGYbwQ6EUw5wlGhqDyrHwlg7elSbJADB87G31wKBgQCl N3ov+oN+PJEv63Q3jdugRzUYt+wtOTpblfLbYMJf12PCFnDzG+pU+KeqolSlg88a EW6K/vlGjGKYwFWaR3L+NjbQja0jf7Vq9G890uXlGbQNMopPDrscNEPz7Y8pLpcL Kcppv1FFawM91kthEcDw1dusnKOnjLMS+kehKxslIQKBgG4Y0SYZrWHOUn8qCqNK zbitFLesrQlgqIvIokPH7O4qVKSLAWJzK7wGyeUCQNP5YOjtBM33A5Qwfu69VEeq XwN+lmiAnpUacWiQiJeNRp8+PUquIkLqsvmB4vn7jaHa5xkMa215lT7isJORasXZ n0cSN7T3e6V9K5hxufFzjnLI -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_15/description.txt000066400000000000000000000003761322470703100251730ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_15 Purpose: Checks the behaviour of an application when the target certificate, which is not a CA, contains the Name Constraints extension. Name Constraints is only allowed in CA certificates and therefore this path is invalid. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/000077500000000000000000000000001322470703100221025ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/cert_path_ext_16_ee.TC.pem.crt000066400000000000000000000022521322470703100275120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTQ2WhcNMTgwNzI3MTMy NTQ2WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJ0VVkBCR5AUENm8LmtosBm37JtkQX5WUveL xVeytcQsjNU4vin1YGJ1xaDEK9o1S3u9z0lFy9RSPETqORfCovdVqqFQOYigrlW6 AiX74hBb2o4yvhpK/eBITOf302NV4rL0qN7RDAB6IzKApIhNg92PNmwqwCmvgO1G 4WrFG09yOgcj5DYwuA3MLo+oXyD3S/6Q3YgLDgXNNGtoz7n0gIGwQwG64UIzmz/4 E9UQ1XuSyNZ9bS5tJl62C0Zm3Yv4En9ZonV2hUF6AJIlNNwxag+A70JUtozs/2sQ P1edFsOnZ9q0+6fqcLCdA3TbbQOmMswFQ44PSzjx/7y08PZRO0UCAwEAAaN5MHcw HwYDVR0jBBgwFoAUWnDTc6qUQNwzyWd7FHWFyw+YTpQwHQYDVR0OBBYEFErASPBR VvjVCumIUzsTSt//knygMA4GA1UdDwEB/wQEAwIHgDAPBgNVHRMBAf8EBTADAQEA MBQGA1UdEQQNMAuCCWR1bW15aG9zdDANBgkqhkiG9w0BAQsFAAOCAQEANTKudpq0 hWB6CcSC7jHg5yudj1EViQjTERVBw57iSUQH3bHpulumlc/nf57+IiiYuf/xwGEg 37qFG7IDnsR2v2EAcYYXiuqShpG0plcV5wMY3URBHeCJFrbTW81/6TJwmcrk3Blb 93lNynkg3d+INNEnA6jA1TwrOLNn7ylwXsnznhZcMy9Rpnvyb4QXwhFJLENsZBNN Qmi/5nRw2eoezuA9BmjFSdG60mk4M8rgWXjPQiBD9r53LUSjiHRTzDhvXuDnE6k0 ND33+7VClTvWpudqiOhVjlp3rJKezTe9Y3jxUsQ2+JOCk6Pu0Vuq3iKotm1wkgkQ u+9Oc28a9WN3pg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/cert_path_ext_16_ee.pem000066400000000000000000000033021322470703100264130ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCdFVZAQkeQFBDZ vC5raLAZt+ybZEF+VlL3i8VXsrXELIzVOL4p9WBidcWgxCvaNUt7vc9JRcvUUjxE 6jkXwqL3VaqhUDmIoK5VugIl++IQW9qOMr4aSv3gSEzn99NjVeKy9Kje0QwAeiMy gKSITYPdjzZsKsApr4DtRuFqxRtPcjoHI+Q2MLgNzC6PqF8g90v+kN2ICw4FzTRr aM+59ICBsEMBuuFCM5s/+BPVENV7ksjWfW0ubSZetgtGZt2L+BJ/WaJ1doVBegCS JTTcMWoPgO9CVLaM7P9rED9XnRbDp2fatPun6nCwnQN0220DpjLMBUOOD0s48f+8 tPD2UTtFAgMBAAECggEACieboHfTFytU6N5+GbogzZN9m5C1ndcyxzH6m0Vq9A2f 5RYlT6Jp4rOTsmWReCpt1h1aeHV8ociB1kAAr4UznSL6mYcNe8RMwNn6KD509Mhw ron1OXno7kYo7UNbdQEpBeyZu3MZgDEPyW9WM5bfPsQdU+Ic82pBvr+69CNd3/Am c4oGyecEZTMdDbPQmtV3HcIHHIGXvvYdAj5Pm71inS20Rwlz4FkxRGVZ6R8VvpMC W/HizcG/dy0RcEbx7+GZCMpnU/4VEpFemLT9dwfzrujegtjJ0gRa/VnkeI5pddMP tPTL+QuepQE0nHw/ouUpbgB7v8QkvnzH900cS0wqwQKBgQDYYq462ejsL0NMyLDl b7NrAq7jFztQtB9SWYT15uhRoEldF+8FemjhhMbIr/8SuP1p54uk07M0YueN6MNP 9YX8nK/ImWPEPKgBIV/HFYh7jUCeFu88PP0xsLLHM3D0clp36IbkBkguEV+rhZAC h04cKxm8nrwnXb1kQuK3yvMgPQKBgQC511lISDsrcsQ0MA2xcg53Xi9uQ1RWM2UN g5H2yPT/twuHPj8NvmGwpu7ZEwr7LV59KzGBejwba2YzFS+5zxyrg6EFlVTLX2P+ lwZlMcSad1dk4ptL0Sedm3RxBjqYQKwdWBtDoVYQJlGCIUZAmkQ/2T3CnpqICvhG ombklxjvqQKBgHzTQEr21eUZxqsOwu04KLo8jAK4riD6J29r8MWh9LbRzkCDxADX ApXF8J5o2K5GRPnI9seY0DISNB2q/rCrpCV7hfQkeGcFzq0IQaYpB9iuPW51MIEB ddYqZpd/V1PMe9/cJaR48z6QCy55GAA9aZPaUTh8IXJcIxspcnwv+VzJAoGAP9nK ljgjBEGRQfEEs2PhroeQukytzFQqMyNyYh0XeEh20IfFeD5iKCSiybhuPHCRF2Zg wwCxaCZVXdW4qRmM2y0FhPqSwLFMlOtkyh34U64PO91TyA/bkZ4YusCOH0ORHx/n diwXesL/nDs8fPPD4UANpTGDHJzQQsyHl6CGc8kCgYAbBuCgT2vqCp5j4hCPX28C XEDt6Um67UIBmfptJwD/ALx63nAhh9CX8aj+nWSyDrmVyXiDcyj6sqcRUrtl2JbM AOahh2FtkjijZgLJD+jgauaqM4/XsTgSC3mKbKAHPImm0+MUlQ+3jfD/wtLEigNZ rmwAa2zTwycJdaGxdE5pZA== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/cert_path_ext_16_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305430ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/cert_path_ext_16_root_ca.pem000066400000000000000000000033021322470703100274500ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/cert_path_ext_16_sub_ca.ca.pem.crt000066400000000000000000000022661322470703100304370ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgICUhgwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1NDZaFw0yMDA3MjcxMzI1 NDZaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAN7w8pFn/aIdoOAmsMkSRuZSiUXBT1Z/ yZWXJCZONZSNju0v5h0D1GUcOPH53Ld/CjbHr6OI6WTIWpzAV8oa6loOhBbLnmL8 mcxwghv0PSj1LNimorVrga7WiXJ+u8NDLMinINl1Smgvfkh59N4blXaG2IN4ePMX 3idqD3KUUTyQCE8rSCHR+XXXT0VEset0LStTuV7tpDX0xL43ja4oxgPOLKAv6u5c 3iS5mdkqtop6s+wU9eHLlGFCZQ6pMO1n0D1bycxvhBh6rW6aXFrV0M4C/2dZVQ06 maG9H+ltBmb+tfyl8SaKPZACdHnfh1ySCDGbccMH9f4KtJEibmJV5d0CAwEAAaOB gDB+MBgGA1UdHgQRMA+hDTALgglsb2NhbGhvc3QwHwYDVR0jBBgwFoAUx08YhC18 r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFFpw03OqlEDcM8lnexR1hcsPmE6UMA4G A1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMA0GCSqGSIb3DQEBCwUA A4IBAQArvbGyBruNR29tAAwhk+LbUwO6q3vz1oxKtQvI1g4WeT1lOAl9WGguwLr5 jCG7KEIwJcdmcIzGA2LVx6yo3hA6DkWk49VLFu2+KIgyIDYkfCbu0H8JXgwEGB9c lRc1FDWC0PqcNOeTydD9Td+M0ZTVGjG+bkM3tfGKTWePRXbf6Q9VC4e9kBrRue96 rKasKi2kUBCcJL2+RUJUpO5tVTSPzJwd8f7w50qj84yOrtX4Fad3jioR7wL+b/9a KLGgqneB1JPgDG5OrSbxjMtAi8lPvKYekEuFcHswFjeWIsZvV/hx35Do89rkggcO oQbvHxDmzWUPZMgCJtRhd3IhIcV/ -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/cert_path_ext_16_sub_ca.pem000066400000000000000000000033021322470703100272560ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDe8PKRZ/2iHaDg JrDJEkbmUolFwU9Wf8mVlyQmTjWUjY7tL+YdA9RlHDjx+dy3fwo2x6+jiOlkyFqc wFfKGupaDoQWy55i/JnMcIIb9D0o9SzYpqK1a4Gu1olyfrvDQyzIpyDZdUpoL35I efTeG5V2htiDeHjzF94nag9ylFE8kAhPK0gh0fl1109FRLHrdC0rU7le7aQ19MS+ N42uKMYDziygL+ruXN4kuZnZKraKerPsFPXhy5RhQmUOqTDtZ9A9W8nMb4QYeq1u mlxa1dDOAv9nWVUNOpmhvR/pbQZm/rX8pfEmij2QAnR534dckggxm3HDB/X+CrSR Im5iVeXdAgMBAAECggEAKmrbKCXKSO5MteE+qR8gXMGu6xX2560MGHlnkB84zBEr 9L50kKgyIOPABPAmmcYi1h3jseCCkaGaNfFVsrcwyB4zbRfkRI6tn4t3geSUP2b4 l6cK1axFAhRBFgb9aA8vpeTAmAdcNxr0Mst7dsf2RdUtvEPvdUchBkxEcKc+FqCw /KQmnOQw5LrwMNe4+0mSYknZsLO/2Zmyt0qVrohBP6AHiynCRaZtwighEQXPr2Gl nnq3IC3BTurnEHicif1UjOxBORYF0V9VxdDIa/yJDBS+WGr6JCu0lxfWqOem84Bc 6hpNRVE7T14fSQGNJaeeAmLMWBA7J5AV9YZ3evq2MQKBgQDym8kWld/X5fge8xq3 l+Dz4Q330R5MUKsrTgT63vjSyFWfl7pP29pt5uudmDhxyGZwUbGrNuBSTRS/Xv9/ aPx9joU44ouQv50sWqWcvdmOjsz6hUt5Wn/pRIOdM0oPYYEz8ingzrFaFeCOz5HM V17zkqedfDabfPStHRrg/dLJTQKBgQDrPz/8CHUEeh46stAnxUGsUK2msE676xDb WLb5qi1fd2oNi3/Yv3Bg7IWDYzLqNaInz/xzxErAOuefh5Vt+udJDIh5rSapSmX7 nxcTZIcCJKYaC/H0vgohqScuko0CCGzAbcFkj91Z8kH+Uds/0qHycVPN+gL59rne AphIMMbG0QKBgHVpaY9Rp0xQUp1/3808ZrUAlQb7IKOkYsKJdqWG5Xr1U2LyRkvB xdtsZ1kUwzRl3RW8o7SN0VBjV4gqTJJ318JYCCd4lDzQTxuZHw9VXgW9HHydp+Iq Jz9YVi3tFYmOEb53E0dmILTNY6kZ0aDII/7TWeVAqRjlB3EEZe6/SJT9AoGBANEO z4zp8xv8blrZx9RgH0HEHN4ydnXXq45So6DyFApv88Z/vyje0D7CUtB1Wqz65tUc p4w11/xHHMoP0sL/I4UuZyZCs0XlAQaA1h/8yWIlMZuaG/bU3+oUCecAg+FXnVXQ 8/mrRBoICY+6LO7l/9eV0NUOppB/K6RZh/03o57RAoGAaftasgzqr8nZOqqtdhzd M5GfYCofKiHCMW51VJpCrFQ+r8aLqIDicTYEOd1QJa1aDOftma8qDCPfiseght4r PO5QtrND6qCEnJgvUP/MpP/EFVfa9FZ27e+fSUlb5kXfrOzd5hs610UdSR+0PHQ+ wH+qwNzFx+kw7/sbolcSkng= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_16/description.txt000066400000000000000000000003411322470703100251640ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_16 Purpose: Checks the behaviour of an application when the intermediate certificate contains a non-critical Name Constraints extension. This path is invalid because this extension must be critical. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/000077500000000000000000000000001322470703100221035ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/cert_path_ext_17_ee.TC.pem.crt000066400000000000000000000023021322470703100275100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMRQwEgYDVQQDDAtUZXN0 IFN1YiBDQTELMAkGA1UEBhMCREUwHhcNMTcwNzI3MDUyNTQ3WhcNMTgwNzI3MTMy NTQ3WjAfMRAwDgYDVQQDDAdUZXN0IEVFMQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKwmpKT1zS7A8Yx/YFgrtcUfyig9jGBwVA0I yYIw6wDFp+L/QqT02Z3oQii/xoADbZlyHNZCrJR+7O+3ivcGSCxnYaTbEumFCcpQ 0VPThNG7ZAvOBm+Y7jfy8Wpwbg6LJgjf1d97TOjeUI5/3+JnMd3QzDXqxhuQDhGe YlGUahv6xGu4et9GhqWELinBH7YrC7Rs1+N7luU8XqhSplrDD7hXuXeVA4lttmck dT9y5zyQ3zsHDM3XacgZuR12x2u7bdNUpf9VkzSTKMvl34R4/Xp+UoHRkqN1zkEG Mdn2JML2XnfGFn0wmBzdtqVTv9Oy0jicRtctYAlUlJ1PzPv+1YsCAwEAAaOBjDCB iTAQBgNVHSAECTAHMAUGAyoDBDAfBgNVHSMEGDAWgBTFAxdfUwgDnER4iRx2Z3PR 7Qwj4TAdBgNVHQ4EFgQU/ISfLHd4jA2xChMZ05c2kZLqW/cwDgYDVR0PAQH/BAQD AgeAMA8GA1UdEwEB/wQFMAMBAQAwFAYDVR0RBA0wC4IJZHVtbXlob3N0MA0GCSqG SIb3DQEBCwUAA4IBAQA43OLqa/BmIJM3OxYJGUei2FuFnZSra9FjTo9HJG4BDMVZ /jbiZwPt4gao5Zluqe1ZurmYLPMaNYnK2+kWcoXgTFtsLlcYgVIv22qTgCAl9xVK gqzoU2g3Fl/KUa+ZatFjY+6YcyCFSH9xeVRBrXHCXa7iEL8Q3bqTGBOJUYlyd4+0 LxVJlCJvnX/EAMER6Dm4u/981WjhyDehpI8r968ZQ2n/C/g3KeghtsxbDVcHnukO PqLB/J5cb0ZbHqIJ10EKJgNoYs8/TdzPNB6hKMX6BYVQhr6chrKxkWxqxAXxEe7Y zn6JYLOLsrLUW89UHu/mDHlgp6QGJkH+kpnY4pYq -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/cert_path_ext_17_ee.pem000066400000000000000000000033021322470703100264150ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCsJqSk9c0uwPGM f2BYK7XFH8ooPYxgcFQNCMmCMOsAxafi/0Kk9Nmd6EIov8aAA22ZchzWQqyUfuzv t4r3BkgsZ2Gk2xLphQnKUNFT04TRu2QLzgZvmO438vFqcG4OiyYI39Xfe0zo3lCO f9/iZzHd0Mw16sYbkA4RnmJRlGob+sRruHrfRoalhC4pwR+2Kwu0bNfje5blPF6o UqZaww+4V7l3lQOJbbZnJHU/cuc8kN87BwzN12nIGbkddsdru23TVKX/VZM0kyjL 5d+EeP16flKB0ZKjdc5BBjHZ9iTC9l53xhZ9MJgc3balU7/TstI4nEbXLWAJVJSd T8z7/tWLAgMBAAECggEAE+oZ0cYS3lMOSPp94rVBFHSrpiFjQ89labyX0v+7BR6D CrdiC5hniY98rR9s5GeBHjxyfuFnpXtUCBxrbvgYZp/u+RXUB5TkSmCJq/DOxJRb lndW4eyxt2HbRjzgqRNfwFcPHrMyH8jX+M7CJNFbQMBkCeNcLNlqnI8oldddZFmv lcswGsbE5dHKMQURrG/GUqLxsTnjIQykXdi3VlXSqRcZR6+hyuGT6v+B7cirhGz5 Ume0AoWbNGCYq0+v3yyUaWaRD8xIC0U+eV7xqP2X99aoTNe9rxpeczOj9LPUYqGg 2mS6bb3PXmvXwjex4gPDeZ44oemEenB+ju3WjNKAAQKBgQDzSeJj6Vvv0qUs1vOD YGGc9h+5n1OzUJanqtpKlhyIR2VxXEuuoyWuAzhnpMReYwoM0uL6Qi6PPmla2chq cPIDU+MUDQlf63o8e9F3NM2v/K5FhDTwHHo2ugRQ5/g2RXIF6ZF4HbWpTmdpotmO +FoEYJk8tF3WQ5mIRC7Kx/sYAQKBgQC1JUEijiG1SMkInMF0H7XjuKz19wu82hSO 7QAP+1BpZxJwIL+aD1GHM0WSg1y6pyysEXt4ZvTWx2wIf7rFpra+2Ux6aOM2XLqW GITFsNqLWXsK+0TvYBTMGybqeoIsCyLMfRamkuNktqvwghcuo1PvswktP9KncaPf b0/T1HDNiwKBgQChxoCXBWbQC1cwgOK+eomOMQ+Zg/vJYg48Ad1T+YuRh0BKaCAf SXdVxehs6uB1DxBwxI6P8RA6yjqOYgDl3qLfWZnHDIAuW0wWChOYW/FmU/SiXy5A d/9AguM51XZ0yCrxCYZkxAS3R152nQZkDnr1LDLZbepz/tGKDiS7TM2IAQKBgF9U CLAfrjuR30HqBKCQ447ArD0Q0puDBNimfqbqccnWVUyu30Y7E4OcBtvwx4bu3UJ8 PMcDH4w8DG14kpjbgEZ1Ypr0wcXlDMhahNzokkpNP8RqsT9sB+XV0CgLap+1CI4m shndKU/iFiAOxhZkG5MEXCr08G3wDvZRxOfMX8S7AoGAP3cvBXIsLvBu/Z9iMG7e KVWwonHsFiyiuK0ezscr3/xDChSf7lx1YlEHW8BVy4n+gUstkHcd/aaqSA1OqYEg i1ehv8QKslktq2On9vUuJeYH07EZGs14D525U3siG9yVkoPgwLAkKmGFQp+j1rgc 2U6ozcr1ct2cJHlnxH35uJA= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/cert_path_ext_17_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305450ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/cert_path_ext_17_root_ca.pem000066400000000000000000000033021322470703100274520ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/cert_path_ext_17_sub_ca.ca.pem.crt000066400000000000000000000023061322470703100304340ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDSzCCAjOgAwIBAgICUhkwDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1NDZaFw0yMDA3MjcxMzI1 NDZaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAM5Kivd/4xVgizsRTSlrunbzax4/7A9w bvnf+RMN1hJ/SvB/L8wkUWQ62ulFC/ElA4zL5mvEsrlo1SJmrqGaNK9cqubHKimy SuNLZv2F2QT2PyfqcZpgr6pXPYSEsB8V+X15Ur4EH2fG+7mEb4wkB6VGv+X5jMns aSwso8cS0diQLukqeMMvbSk4ihegysXqC6X6auWn828QYDObkPRbOyeTXW6Op+Rp V6dSJhPq68h7FA5Wf6dHZ16zl5Awvw+IumPW1kJHb+7EZ/yQkkIRTzWNmB+QO/bw lFBtEMiqSwvpjhx/DLSWSpHbqn32HVQgzWJ7T7jgvR5E4yGMFqgK13MCAwEAAaOB ijCBhzAQBgNVHSAECTAHMAUGAyoDBDAPBgNVHSQECDAGgAEBgQEBMB8GA1UdIwQY MBaAFMdPGIQtfK+M/IY/TwhCE9klQGpwMB0GA1UdDgQWBBTFAxdfUwgDnER4iRx2 Z3PR7Qwj4TAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADANBgkq hkiG9w0BAQsFAAOCAQEACju/UnI2lb//vwvuozNDn+g+JJzIQn/RIOtboXeMWjlw 2+AG9wztJgdsAxuq9Kw5wBPNdnLCHZ+xALdX/3WUmgPodQUgB7/XKFobZSSePF60 e5LZGboevIdhCeRe4utpR4EqkXZpbspoVcpOegqyriPrJD3NKuDgNJGlwUWZ0zik 39mh0nbsICsvz+WuIVFpcToPj/YEWaJ+aJW/lkYQL49nd61SUBM+kfaERTmwZrWP j/sax/RJDwb4hke7UbT4ocWQ2jzzJjdNKKpGI/MvSf9DfVZr8eGYx9PvrFUnrLhD S1ZJ9oaNNNUqP3NY3jgo+FdwQak4HMyMKwlh8NY7PA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/cert_path_ext_17_sub_ca.pem000066400000000000000000000033021322470703100272600ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDOSor3f+MVYIs7 EU0pa7p282seP+wPcG753/kTDdYSf0rwfy/MJFFkOtrpRQvxJQOMy+ZrxLK5aNUi Zq6hmjSvXKrmxyopskrjS2b9hdkE9j8n6nGaYK+qVz2EhLAfFfl9eVK+BB9nxvu5 hG+MJAelRr/l+YzJ7GksLKPHEtHYkC7pKnjDL20pOIoXoMrF6gul+mrlp/NvEGAz m5D0Wzsnk11ujqfkaVenUiYT6uvIexQOVn+nR2des5eQML8PiLpj1tZCR2/uxGf8 kJJCEU81jZgfkDv28JRQbRDIqksL6Y4cfwy0lkqR26p99h1UIM1ie0+44L0eROMh jBaoCtdzAgMBAAECggEAAI0EZ/rIcXMrjAHU0ep+ufiWbaNADx5+vV4SvTFJRA1g 9tlwGDx0ly7tDLhpesBdjQ+yUtFYpNQZ1ZiumLHfuCQoNKuNekUGnCrEYKLt3GyH 6KRgn0fo0CyhdmwgSET3wJUFWoqKRu2qGGm5HoeuGYvh0UxkStm9widwXIS5WLmw m4IoHCLl4NowkQWUMZv/lqBabgUdtC1SxlWhEENwuGID3nXNTaAZp9bHbf6tYklo gHsTdngjLGQXlXOypT6aNZ9Hu8R8QzG602gG34BvaFXLfY5M1kmj0LxYjOgE4bC0 T0yC5D211DHx5GHnP+8oO7kXpIuonU4fT8wE8nptCQKBgQD1dclG4OTPJB/tRJlB V46k2YevlwCQREAYb4d3/JaCZsJpCqzhlf6rQAjoRmc2Q/HoLKVcf7jVEBRu1dza imNqNhHxmt8Y5w7LG4CxlJxH3wwd6fPrGWlRxsZ4vqshlBzsyO24ywvtt0o7Xkyl 5fjOgUDQIEm2hjTLzkv2HF44JwKBgQDXJjF6mSMZQ+ZDR9ho+QweNGV728Co9KXt kcAh5vChmytIimXHJN3T/VMWou9oCfW7Z23tsaZ/+tm11D9FJykJohTUfiCdt0N7 CMZTeFfnfbTuuZL2xWzHG7NXTer+AenjJnsbOR4CS4n+AT3Az5KKBslSxvXgnNYj JWrsniVJ1QKBgQCIRXwY/YIJ/eQ7tXnf7NwkaSALO6n0be+noUN0OabVfncwGd0g 4EUijcpkKbHjTpVecGrdj4rtvp+ZaOHT8kB/FsWffHufN6fe2sX30KlyvUHc2aWx P8pYvCIzpqcbXT8xtdtEXHWi478ydofXEnWvL9LruQEzdA6bl0xUtisYwQKBgQDN xs/oLHOvhIvFqf/IVvtKIF84GbSpZGUXViHnyxQ33UuGtCgoUpCAY3iG3AwS/AO1 3HT9tL5FBc4Y5QomwA+2EPnPS1syvcei83+M8jtRQ6A7++4ebDFgNpRPWkz56Sak hXeVUAnttAYllVZVBbNopJkFvRoKXLdLIkykR5XuiQKBgDm8GOKo7pDNY4KyM6CD gP8CLX10w14dFyPc1DmE33WzrJVVsQwmrbdowfMn+x2+8t3mjnO1d3WKttacKaJ8 PettTx66PoGhrQ7VY583cZ/DdsLHGNOdip7fm/rD7/ItacSKDcdWOcsS5iVf4145 hp591ZX/bu0jUStCp4IRHhni -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_17/description.txt000066400000000000000000000003431322470703100251670ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_17 Purpose: Checks the behaviour of an application when the intermediate certificate contains a non-critical Policy Constraints extension. This path is invalid because this extension must be critical. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/000077500000000000000000000000001322470703100221045ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/cert_path_ext_18_ee.TC.pem.crt000066400000000000000000000022141322470703100275140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIBAgICTjIwDQYJKoZIhvcNAQELBQAwIzEUMBIGA1UEAwwLVGVz dCBTdWIgQ0ExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU0OVoXDTE4MDcyNzEz MjU0OVowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+uhFThvbxc8vWJ2f8BQhW0BytQ32uUZps RM3tpa+69hGu0E1kyk7sizFBXcazbcnxz9ZqaAyjoq8w4L87zxB6u/CPMKDEIES8 8hxCSUD0zx4QvRuoi8t4lnn53UOv4/hUHQNep/YW5gAq3vmaf+kb+QNr5Oatu58k AboDKfX8DpKJycnSdeKAWoEUKwBVVbGLWqXkNRDk+Uuvo8Fg7Q77Tefh81aTUFTi 0JAG4133GSKwfI4316VWN69BHpMrNgm05HKTebn/z0r/c3MMvjXKsju0agjEU64w 8nKSpQXvu4VSic02zRrjez0KdeNm95zlN7c7c+so+kyXSizG/KelAgMBAAGjYzBh MB8GA1UdIwQYMBaAFKIure3osUOOy1Zt8ZNm86ToP4DoMB0GA1UdDgQWBBQz6tAD C7ETWqKlblb6yXA31QeVLjAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0TAQH/BAUwAwEB ADANBgkqhkiG9w0BAQsFAAOCAQEAjqZBOQPwm+NEegQPVklOffHAlO2nRVNym8i9 xkBGBOFYS3WuIL2M4xSjpnHN1u+4Vu1om11M4/RsvtKEb7NM0+FXAMZdzdiolAAz C/FLzMX8Frr6CjfcmVUoAEHcFKNAuDH09xo4YneGC9G9vgLcY9WfUyf5Te9O6p4B ES+kTsoXgYF1pJlrFcPiz+CQ4IeBe0Jr2Kg9GHEUYT3c/oDvcylRwAzk2mPWiIZB timRjGF65aD5LiDZ7FzN6IMMdOYTjJw66SGqXqOhuNpShsnwMbPDUrJfQ6LMIU61 cbMfTNOj6DNf/+Y8+LaiQb5WF52jdJDkGpT9LwqOXgsVgmRbJw== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/cert_path_ext_18_ee.pem000066400000000000000000000033021322470703100264170ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+uhFThvbxc8vW J2f8BQhW0BytQ32uUZpsRM3tpa+69hGu0E1kyk7sizFBXcazbcnxz9ZqaAyjoq8w 4L87zxB6u/CPMKDEIES88hxCSUD0zx4QvRuoi8t4lnn53UOv4/hUHQNep/YW5gAq 3vmaf+kb+QNr5Oatu58kAboDKfX8DpKJycnSdeKAWoEUKwBVVbGLWqXkNRDk+Uuv o8Fg7Q77Tefh81aTUFTi0JAG4133GSKwfI4316VWN69BHpMrNgm05HKTebn/z0r/ c3MMvjXKsju0agjEU64w8nKSpQXvu4VSic02zRrjez0KdeNm95zlN7c7c+so+kyX SizG/KelAgMBAAECggEAAfOh0OPlo1gExRBoXeV5BUXd1+xy2LFgWLnhhKXv5Oq2 1YrRig9lpwYUJYUw6IEzicqxkoC1vO8QnFe7nk0YCZOeKWZH46wHIJNyVoP52eMy 9O3CeGVdBOUuGifkHYaxC3qA7Rc1HG4kSynhbBAU0dHCaU28GztZLGEvehIUBPOR EEGS7nVcrwDZ+PivtzTnPi/86nSGedKQHrC/vUynsxy0RQ97Kd5DjGZQJt7idhol qorEk1+eMKThRTYcqNzf2xKztaaMPg1sZK9DjTIWJ4etdmn0Uzq9ensyY9iip2Fg DOFk0hveLxisNfh86txhay45peyUA3Um0nJjBb7fRwKBgQD7VQxQTBisYOuNM1fu bIZXyM2ZF0Osb6K+vXjlDpaHVTnvYYumOC7lKEcssikmTeIp9eSYuAZ5uzdBpeu9 DHrjmtKJYAlKCZ8wfjTY5Cha2s40UR9EfGmWbzhh/q25B8Tw7PptKcgNTY0gkhzM UpB7uQcSkmYEyfEkWIRPfz+9IwKBgQDCRN96jk55Lied5DZMhSin/hA8dkZadtml PeBI7i/suvUE+N82Mln9U2VBvrt3BTIFbo2OdHTroSix7R/THTDuNhrgHwUv3ovn kQN4qIA3sNrojCSuRii0vaobU4iCjvVb8XjkE7rSgfgy5jKAfpm97N6zVo18FZQ6 jljkfskIlwKBgQCfryaWsfKPOzkNyoxYsN0eUzfFx9E4culc9Pcl2YHsVErt+/UF U/b/o/qsvDmG278RV+i421tJ5pgx/qBryc0eZVTU8Y6VWs2outcK4tN8/j47YTtT gRR4/ws8v9pSkEwhov9tcjlnslkzU4I2k1K3ORT0SM3GxyOOKytNcxTlLwKBgQCW U6c+9cmhmeaMFmEyG0RXopC7yKYuMJPAez4IEVBCdnVNUKuhC5t5HMRY+JelxP5t F5wwZMto3j9YV25t9cO8QV/QmBByd1p5aUxvXKxC6/apRnDH7oBnQ/DSznPu22Lf r95lVyMU6/+8m0bvCYg8YIP/8HTxVN1r5mTBA57apwKBgF7cz6ovoWvkzdaR7oSC DPets54LE1Ri3JKUgUwh0NaUaAg6xGLTCwIFFfO74SXMh7Oz4HCTmeTF9brY+wuW oztrI3Rm9kH5wV9t+hGZ9TCBcOEwFBDZAaQ/j0MVNV+YbybpKzyhcbwC7h6lCz7/ gm5OW3CB/sPwtIsnNiCNXc4F -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/cert_path_ext_18_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305470ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/cert_path_ext_18_root_ca.pem000066400000000000000000000033021322470703100274540ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/cert_path_ext_18_sub_ca.ca.pem.crt000066400000000000000000000023121322470703100304330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDTjCCAjagAwIBAgICUhowDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjYxMzI1NDlaFw0yMDA3MjcxMzI1 NDlaMCMxFDASBgNVBAMMC1Rlc3QgU3ViIENBMQswCQYDVQQGEwJERTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALCFLJmzmejO9iDEac7Lcx7vwJtIcv+A i/3emB6Woi9JLnWwBeVOgAG1gs2DHBWvrWsxv5CB+udOAwcMXGnw3Oa6MyRZ+sPT wRVNGtmhEAV0PKMP2nwAnY5J4xhBRADt9G89ApKGTE3ZTj4Yy4soau0YV6+SfOe5 QcwvH+csEB9VadR/Xui3ju+qEG0lqpaGBUEgt0fj1vABXQly4dVrraP3antW5jr0 7zhgZfExzvUaZNxhIv1uEdz19UyprnvLYbEZ5GdRJDfdgVBuVQ9u07NSwQXPMBWT b/vCUHic/QUD3EteYE8AGQ+gkw9zedsPRuqyV7zke4rsHEPOPIGnU9UCAwEAAaOB jTCBijATBgNVHSABAf8ECTAHMAUGAyoDBDAPBgNVHSQBAf8EBTADgAEAMB8GA1Ud IwQYMBaAFMdPGIQtfK+M/IY/TwhCE9klQGpwMB0GA1UdDgQWBBSiLq3t6LFDjstW bfGTZvOk6D+A6DAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAN BgkqhkiG9w0BAQsFAAOCAQEAIXDrrLzt5W7eNFKM+ZyIJLT47usEIsFYmZY+D+h6 /d3UD5kRCMKbiptU+TdsKkwTNvfMWq9X34tu/+YgMOlkdOpxshm68iGMPtOA3QKl ruTIUGdJRmT1TG60euXMHaXnU74cM30BpSFwibzQfnltcPsFwu6hE8O0KRFzbFUO Ym6/j/P0zV+B36MM2LkceorI6NEbmKtnMQT+0lbBYhmvzlNnhIzZnmy58rX+bTZu hfo//BX5JLvJS2h3fzRjilLBuQOyCELmW5NQYQwZfgQBw3NZxpBhkj3Gsb4rWlNw dmUpvhK3aS35VKsV9CuOmBTl/Q56NLj6KM+H/8/f8u61Qg== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/cert_path_ext_18_sub_ca.pem000066400000000000000000000033021322470703100272620ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwhSyZs5nozvYg xGnOy3Me78CbSHL/gIv93pgelqIvSS51sAXlToABtYLNgxwVr61rMb+QgfrnTgMH DFxp8NzmujMkWfrD08EVTRrZoRAFdDyjD9p8AJ2OSeMYQUQA7fRvPQKShkxN2U4+ GMuLKGrtGFevknznuUHMLx/nLBAfVWnUf17ot47vqhBtJaqWhgVBILdH49bwAV0J cuHVa62j92p7VuY69O84YGXxMc71GmTcYSL9bhHc9fVMqa57y2GxGeRnUSQ33YFQ blUPbtOzUsEFzzAVk2/7wlB4nP0FA9xLXmBPABkPoJMPc3nbD0bqsle85HuK7BxD zjyBp1PVAgMBAAECggEADV2FWH1BozUpwVEN2oi2BpAhqxWWZiPItb1TvZvV24hf elgMbOXU3wxBbf0bicV7oc5U/QSSck60/6TJydhhFB6Mvm0KWycei1XYuW9ZWV2z 36bUz1HJRtuaVHJQoKoOZBkgUjwql98Nw7mN49NOG/XytwpQ5xy0T4Omlz1+BQPg IN+6Jqbm0TA7k32Wz/vtDKXP7FK2bVGNcDCTH3cq3rGQkE+WjOIdrHPRZQocZb+f +AA2EWUIeMr4R8Eeg1frValngOV1gjpZt3aZ7uzl600QIF6ATxMhQysMEa8LDaR3 omQ+ceFjJzX/ffFwKjsZV4pJatvrG2Ei7aR16vaRoQKBgQDmilMx+HVcIXPGk9oC +PqPJ2rZybw0vF2zrZ2eu0XgZzyowdQzlp9XKi+zAsYkevuZn+y0jjmA0XAqJ3ya /gxkT5JOIupb9JmQR33DVEeC+Gi7mSRm3R0tpkF1ogevkvDnet6WPWHFvUqi5NLv RZo4xSUlxgV1RvxtwsOyxdd/sQKBgQDEA6FTzzq8lOAaCe/MtrVk21p4Ho0FhSln qcBEElnkA1AUk5wNlHzO7UaolhJf9kV3hATAe8D30m6rLpi0pOyAH71V6yKIepPZ aohEeR41hexUTRHuiJ6NDk0fjaMiOqXR3oeJTJ7mW5I4OV5NZcP55h1S2rGyC8JM 93j7NejjZQKBgBFsWNdI+M2qtY5HdE2PNZiGGRw2k+PEbKx8rZHmg2RvSPVUGM6B Tq+Ov6YeyozNQqCcpo4KxavHqFt3OoKYOqWGIf+HwgCLHuP5kzak8vaiAYBUFZ00 jtT5YK8cPMp3J3/HGHVwVChWowJmms58iyhJNgKB0b3ITKGa+6FSNHQxAoGAFCxv eSm12NzVp7hoFsCjMKsmx4AVcYD//uxInnjpCX+RyVxbzkX/BmkDQayYXYoCIkfT GWBjPt5Ih5O3IbhrotAhc2tM1ZEQEGtXdPymMEoFRbPc6ZjkAI59P4cbSBWTJWNq vaXGIN1B0kmNPBgCMIEPeYyKh1GQgM1jhS9KNcUCgYEAsBezNeyrU1fb7DlTycw/ hwsPmFriD6Lr4S7Vdo+RnDLhzIYrgZF+hZRg4B7EQunPMWoR28cRwiin5oPASIVb 5LOI8smcQMN9biPEXhUu42n5Fz0TiwDzFiAAwJ4mmYRpUAO94BZ4ptZryyznNvRp fbG1kbR0PtVc5sEoP+tbU2Q= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_18/description.txt000066400000000000000000000005711322470703100251730ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_18 Purpose: Checks the behaviour of an application when the intermediate certificate contains a Policy Constraints extension with requireExplicitPolicy=0 and the target certificate does not have the Certificate Policies extension. This path is invalid because an explicit policy is required but the last certificate in the path renders it impossible. botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/000077500000000000000000000000001322470703100221055ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_ee.TC.pem.crt000066400000000000000000000022561322470703100275240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDOTCCAiGgAwIBAgICTjMwDQYJKoZIhvcNAQELBQAwJjEXMBUGA1UEAwwOVGVz dCBTdWIgQ0EgTDIxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNzA1MjU1MloXDTE4MDcy NzEzMjU1MlowHzEQMA4GA1UEAwwHVGVzdCBFRTELMAkGA1UEBhMCREUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXLBydgzs1NaXY49PdNvE1WIccB03H w3Idt7crDBD1T0MksHqxDZjCaTtcDyDrxqPVy8zAKOL6Dz0fPV6nlH+nu4oOB2hs TjROXgAr3eIo4gmQX5KZnk/dSkydVJJajC9jhIlvdna2P0faXh0ChBcHlgcCqXt9 Lx+wdsnRBQ/wUnUQI5RN4qVUmWgi5/f60Xf+Gd1gu7+U9f8thhRGLvCKf2z6Me3C DUyuRcs4MKVVPXTX13FBLny4bne+meV0w9VcKI9+oPXyaifzEbsmMUSxMK+HWAmD 1bAthf4aFc+RGLnE6A6akHw4V5nMfdPtOQ5D6QnxXJO46uICFBhkrATZAgMBAAGj eDB2MB8GA1UdIwQYMBaAFMEN04RhXUVQxBsLng5OBuOIdBjiMB0GA1UdDgQWBBTT h5Tc/TFMBsPYf8DIn5cEHIwZmzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0gAQH/BAkw BzAFBgMqAwQwDwYDVR0TAQH/BAUwAwEBADANBgkqhkiG9w0BAQsFAAOCAQEAXv1Y w50WNOGTAFe3mUpkpKYc3jBnHNbBQpfuPq4bokwV5/BAkKQVD8ztndARVu8dqpnu u6gXrXNPXV6TLd3fgvYzuVWCQ/Lvg5ylAL5qZds9NB0zQZ2hX9Djp88wApmcZYVj QZvovZ42UrK1mIxW0hTPJTqZzBHrkuowSuJUOBL5rOc0eeoBxk3KuGhvxDjXoys8 74c+z22xlsADHeounzxFfagjcx7KhgXsR+amb/rTZqPFs9XuXhFESsuCg259MGNl OYZf1bPD7mrFK5ykk6JkUh2ItX+pd5SOhSsQrsHTgBL7MWO3aQqzpS1NjSAYolNM bOjlToUPKxkQjOYCqQ== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_ee.pem000066400000000000000000000033021322470703100264210ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXLBydgzs1NaXY 49PdNvE1WIccB03Hw3Idt7crDBD1T0MksHqxDZjCaTtcDyDrxqPVy8zAKOL6Dz0f PV6nlH+nu4oOB2hsTjROXgAr3eIo4gmQX5KZnk/dSkydVJJajC9jhIlvdna2P0fa Xh0ChBcHlgcCqXt9Lx+wdsnRBQ/wUnUQI5RN4qVUmWgi5/f60Xf+Gd1gu7+U9f8t hhRGLvCKf2z6Me3CDUyuRcs4MKVVPXTX13FBLny4bne+meV0w9VcKI9+oPXyaifz EbsmMUSxMK+HWAmD1bAthf4aFc+RGLnE6A6akHw4V5nMfdPtOQ5D6QnxXJO46uIC FBhkrATZAgMBAAECggEAKCjVw2k7mvwDEva8s3A+d0IpX2gWkobuLNE96NUk8iAD zFx63cJHpVteJpm1P4QwzmWt9px69ohzFDpQSQ88fyoPw3wK95HmDc1aE1XjkNVV SyKnWjATwF3ObFvdP/SjoJubShguYmfvqXhAylgsczBDaTIIOA5cSAN3ueELv0LQ p3sYf5j0+jafeZ6vHP9h83pZwab0Gg4fZcBxug4gmTB3unpifvIIs7kJJ0fSQEXR 022B+Ca4An2GkOA3iAd9epFDP1j7VLhQmldnJE8Hq4L3kgR9biJqUzaOnkLVaEoA PB2JQJJAzKFDqiOMKzQRZuMpaj2z/aN2p0dyYoE0DQKBgQD/Kusr+mSHZxoDJqXg bMIFY9zfXIvhv/wOiQRiDwRIpzb+jE15qJ0v6M1nAtjrFlWm1/Fg0aml3dB04aV5 RR9FSh5AuWlq7cxRKOjJrjkHpAqsdK1O29KQQgaRTw5Gtnk/f9ysonv3WieDtAI2 usKPuE1f/SjHXgzgwJcDBJ++bQKBgQDX38tiAbkyw6yDhWn5DAG6zOwcpr080DyF lmNUE4RS0JDPsCgrmAr8JIfa/YUcmFLhnuf0iKPxHEVta6+Cl0CIIxpZOOCGwoz5 TcXQDlo3/FLl5zuB7jTfxPg8mjE6Jbv84tLVvdg+7NjtDOY92AyckbJ1uNhGiDi7 WkbuX++snQKBgEU17vPOxtWzMWsJYJSu6zFrFM3A3HAvEr8eiwHN8OuD73a7t4f4 JCqKiqwWKaAaPsEycVZBiDJlJ9WMHsX16bVxlSMZJ27JcVHSNtH9X5qi9AIy448w MLzQK9feCZFEjT6b/88Tg2xkF7Oxb6hIn907sEEI+baZ3ARaOJuo9WtBAoGBAI3v dTgBThVUlo77H0xCWrjJl8zWzMG5YLGsya40DuKsgyoq9p6DH2XdVv3jhqvgc04p PvWHCdOz9OoWzZUdga6A9ggH34h7Tll0i0VaynLZEmBbAsNRLa6bQWQHNaq3uLxz HpCufAoTjCWAP7oV3WTsXtwMJxdo5XQ5zT1aEqn5AoGBALys+6FvrwDEs3QkPBqL aNlgT8rFU9mQvXNxkqDgPz/vyoVGgauM1+ZEAykzLGwV2lIE6TOogLG5Heb2qcXV Zrf5WfiF+2I9qvusLTAjUqkCFGj/9m6uCJ/2im16acu9OjY1OaX85VJHN/sc3t0X R7iytdG+ofR7qWZsKVd4x4Mk -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_root_ca.TA.pem.crt000066400000000000000000000022141322470703100305510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDIzCCAgugAwIBAgIBATANBgkqhkiG9w0BAQsFADAhMRIwEAYDVQQDDAlUZXN0 IFJvb3QxCzAJBgNVBAYTAkRFMB4XDTE3MDcyNDEzMjQzOVoXDTIyMDcyNzEzMjQz OVowITESMBAGA1UEAwwJVGVzdCBSb290MQswCQYDVQQGEwJERTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAI9PB4xgmFlKxkbnda4ObABjxIdZ9scX070S 6zCiBOtEVQK9FrNz43z4EqWfjyx+o6/uj/KdCAECqJ/g4iObS/gLKRaEINwTpHXa cr4XoE5Mr664P+YpEJxQz8LrZTsrGyaGRyNYC6gr6VZ/w977gFMsv6jlbOQ05wm1 cCgJpj8xBMlARNtC8GsGQ4nXzz3NSrU0whGeRfcP0iWpHheKvkad6+qdgKk1ytL4 L8dRf9FeD7095twXvSbjASjdgyGkk6R7R2CqcP5r0JgY4HiyXEWI9IW727JtS7lU 8C7ZnE2dnLUnsk19xa/OON02RiotSmHCH0F41rCwJkGNypyJ7+sCAwEAAaNmMGQw HwYDVR0jBBgwFoAUx08YhC18r4z8hj9PCEIT2SVAanAwHQYDVR0OBBYEFMdPGIQt fK+M/IY/TwhCE9klQGpwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/ AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAVLt1+CTl/zT3mSsekJpmZe0zNrsvcYQEx 9PpQ2SgyQnRWnUuBQPdADBmGIWPEH8ljvT+RqafJWDbMhbvwsy6zz5LUjWI+g3qo BIA7ZLUiI11YSabpWKzLbZbSbxYDyzzidmDaLUpb18k4rUStCvUbkyEY5CfWJOf8 /F0H/0p2rH4Wp9iFCgtek5stkvVvdIXttdvkyhbfh59E+eDkfOIdEYm1mcKf7BiB iLXe1bUv1HGg89TTthfgoC1SqKBo3LkCNxbaN0ekH0ZWWmq9oL99Jikjg5RZ9hpS 4ztmjkwZM4bkIEKih4IT5PDB6F2Tna0cWmdaOtf9VO6xBF2CFWLi -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_root_ca.pem000066400000000000000000000033021322470703100274560ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPTweMYJhZSsZG 53WuDmwAY8SHWfbHF9O9EuswogTrRFUCvRazc+N8+BKln48sfqOv7o/ynQgBAqif 4OIjm0v4CykWhCDcE6R12nK+F6BOTK+uuD/mKRCcUM/C62U7KxsmhkcjWAuoK+lW f8Pe+4BTLL+o5WzkNOcJtXAoCaY/MQTJQETbQvBrBkOJ1889zUq1NMIRnkX3D9Il qR4Xir5GnevqnYCpNcrS+C/HUX/RXg+9PebcF70m4wEo3YMhpJOke0dgqnD+a9CY GOB4slxFiPSFu9uybUu5VPAu2ZxNnZy1J7JNfcWvzjjdNkYqLUphwh9BeNawsCZB jcqcie/rAgMBAAECggEAE3SOA0jn1ejOAzk6uNmyCtmAiEQ2ju/VVIwEIZLqql/u pJO0HcJZZhFYQrjnMIoJbIHYHqlNOV85h5RO+bjZtupuS7q9//KrYek5U5o/LpzA QFmOKeUgTABikZqbIHhpKVvoaMwer62Kci5Kkp6VMiAsmDV8CNKFHRnPM02gDrWZ ETRbxiQESVoHhcGgmAHIM0WEbNQFUcknsiEUOGTO8FnxpALWn5aBnMKaffj6D+aJ rfQidNGUzlsxAkMjR3neTe3FE+pH269bWkw0qRtPBMv9/NYGb3QvDvjzU/nO2/6C T3IW2OuuP5k4WHzjQ+ixMMHDuatUzNraYXw3GFpkuQKBgQDCnjr5olfTduH3O6pZ ddjujUtl5lKkOozbQ5Oswk9I02LcNWZadK5flzzpgkz6SHd4mqeMU2j9OaJYmSEA h/ux9VDkffx7H191EecKcMTh93v8AUHOv1u8caxmi3ryGcqqzrQKrSx7t60Yy1qc c5KCUNifavg/hQk6XasJ3cxzowKBgQC8gf/Z/X5N9U6/ON3gsZKStVcJr4KG3Oun /kOVuh6wvgev4Ug9z5kzIxhwje9FiEUIBHZbCyiOt3/fTI0vxzBlMrDH6tEbz0sm Lw7h8s8aoYV75CvYx4uyYPRcXGCo5OcjxmprdNXrQRR4seDZZrFsVDbD+YlvMcMO CziDkQUXGQKBgQCZFdvwByosdaQTVISP8Coeo1f+pKi29DNeOg7MYt/4ugZWj06e so+DM7S/PTaN3TjUzlojAG1iWtZ/+JvEDjMG7Z+ezBcxRiFRNi7VwJSt5n1JYjfA iDeByKzC0M55553Ks+NdTpDiFD39deAllqdVCIENDRiO5ne2yH1EuoobHwKBgFv6 6saJRFnxumzf6JO80ZI4XbHiK8R2g55DGOM0H8mJz+JoAIH4i/5Bv6kb+IZrCZPx 6XZfKXkJ3KEujy2i+eBHLa8+yq3RJhAJoi9p9Ng/vAxJt4NdSrLNUC7I/HksyAPS yxaHueHCraR+1wH9c9Ex/k79savKEi0GGJtJ5bvxAoGAHMvb16uT7//TQ6d8XgrQ 0gJvsMxtmyW9ehE+2vev1nXZy9quRGD7OnXfgMvVD9axB1fm3yua+CtjZegGYYAH 5v4ZS64n/1WmWxJ5UmNCKjSIYnelkh6vFGnrM7a/+G4T9WK8vcc7ThrlXPMZpDR4 IQI7esjsMFV2ufSob8ylCb0= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_sub_ca_l1.ca.pem.crt000066400000000000000000000023221322470703100310320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgICUhswDQYJKoZIhvcNAQELBQAwITESMBAGA1UEAwwJVGVz dCBSb290MQswCQYDVQQGEwJERTAeFw0xNzA3MjUxMzI1NTFaFw0yMDA3MjcxMzI1 NTFaMCYxFzAVBgNVBAMMDlRlc3QgU3ViIENBIEwxMQswCQYDVQQGEwJERTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMYvXC3539fBtnwA/4+GM2KJGt1o SYkGFdtJAhUkekxAqFE43c4ki3t6ZLf/YxlJ+Z+9rfvNFjzL+Isg0j9OuWvk8/SR y9Wg/chbyttoHp27hcBwbMElhNNfMp57xxUYZ+YwOQCmEr+EJxIzLc3u/5XOP0Kz Xe72HQHdDP8D5Zgh1/dHFY2WBH1JeRPgPfFWI+W0uT3l4E4IKLTAgrpCxEKCwfb7 //VCqSVRAqMEPyLKi0TRfDfItm0iL+93aPIWuak1W+V4lsnVjnU8+HpTK+rQPgfA 56iaSyoT90GfZOQosyW7Ba8FGZ5UyvyYyn/tjaspvqQzjN1XDMoOGvrGCeUCAwEA AaOBkDCBjTAfBgNVHSMEGDAWgBTHTxiELXyvjPyGP08IQhPZJUBqcDAdBgNVHQ4E FgQU5WWjyo3VblawPn6rXlc4mhYD/eEwDgYDVR0PAQH/BAQDAgEGMBMGA1UdIAEB /wQJMAcwBQYDKgMEMBIGA1UdEwEB/wQIMAYBAf8CAQEwEgYDVR0kAQH/BAgwBoAB AIEBADANBgkqhkiG9w0BAQsFAAOCAQEAcySwmOlpdXkUd3qt+Yu853UT54VPCThd aLqafBtV9QkLaNk/+taicJRm6ZeXrE0w+r3frh72b4YAM0+s18guzmjHJmYtzyoq 82YV2QFFlW0QLV5M7HlFhebXSu4mzst77GYmgdcfhw9CZhb89MKCRowbgXyGFGZl GNcaN0oUTz/KKO/yW8I8B4aI2iKrFMD6X/yhCTYYT+8ocs/r4ZPwTzwQHfD63Yyr wAyhytrItnF3ecP9BfrMaKNebJUZr/vEfSVNTP60I0h0mFRpFWcVgWPTCPXGhT+z h2e30QB8aQSFcwV5VifvG+Jd6O3YdEN5yiF2M1sOeQSrvg4vgQqvaQ== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_sub_ca_l1.pem000066400000000000000000000033061322470703100276640ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDGL1wt+d/XwbZ8 AP+PhjNiiRrdaEmJBhXbSQIVJHpMQKhRON3OJIt7emS3/2MZSfmfva37zRY8y/iL INI/Trlr5PP0kcvVoP3IW8rbaB6du4XAcGzBJYTTXzKee8cVGGfmMDkAphK/hCcS My3N7v+Vzj9Cs13u9h0B3Qz/A+WYIdf3RxWNlgR9SXkT4D3xViPltLk95eBOCCi0 wIK6QsRCgsH2+//1QqklUQKjBD8iyotE0Xw3yLZtIi/vd2jyFrmpNVvleJbJ1Y51 PPh6Uyvq0D4HwOeomksqE/dBn2TkKLMluwWvBRmeVMr8mMp/7Y2rKb6kM4zdVwzK Dhr6xgnlAgMBAAECggEABI169x1p3Hl5OTEGrePd01Il+VcXdVvb7a0oLJcpbg4A L9l4Eu+4+o2tuaJWwvJ1lwtS71lfPOdMntmSqtyims1oI0KkJZSsr8kYCGFEbsgr gueyP9+eRQLHVWevg5cLb/jEnnSyMo8VHLBrSXNHkMfroRsgucgSk4Ph9AvBXvTB r29QcwsNa8gQ6OtGeyNjA2aKWwl7wGRmLQh/cUEGMtV26Bbfhf2xiFI5KRzgv7yO D+c5sVaNwpuj2fgiloSs1Q2z7/LTEerlvuXM+kkRApNII32yllKI/xVLTyi2wG3/ Fa/7WnTHLX0xUkhZSt9SD5ZaeAkGsZIP26G+UiMRkwKBgQD1y54DsXF7dwXhxkxA NWSOzSrf9VUcZltUnyA9l5gvmHBW3kWIxtJtKLKjweLDB7xVCJnyzGwB6uom+FGC HQYIG7nRYJ8433E8vmGR7nXaH8EiinHoKzEwKfTrGH8eScgKlPfDjsBOMfCpi25f GAY/MgjMZzG8zCroZwMyEiC2zwKBgQDOabnseYRyGM0J1GQOU/wZbPStZi4tGQwK goJYu4pzXCoZNirtC19lY8qVvwfU7ww0oH5X7RArQZ6T9QZZVI2H2mvQS8FNdxuu 2QcfdCLRIaV5ZFcPz4VHRs9Qx/FGJ00Z3jTBVDHP4laPNYlgOv4wTmCeK7+ghgid gnu90rqhCwKBgQDHXj9vM3Ce+q30scmLk0NbaSNLwU0l2ghenSujieDRSk5kx6mT BeIM1KQBm/R4yT+DoZRtkk5RR+Bhd611YmFQFl0kbcD4epT49lth6RACuxsHD1DR RqeBL6cPQjFpueLeYnKNVq65Ply8yPHfhDcc71KfqVx4jQqIs3WuGXIblQKBgQDC 0PjhH2QJSC0lbOeuukfDO5nHmxxUBkLeHIWn+AHZlZBKUVy8dDJqgIAxS6a5q5FK jnwQwrezC/D+1pFSeMJICbgeVZGxaoyfP0lAv50o42fJphGh44x4VHXRWZT4UJmt o5MJMUz+VzK5YZ8ySxukPiVkxAfOGxNAjmn6JE1vNwKBgQCSmStJeyfKDsjwsLka WZfu4t2IRwhbhlfx9I+Zlo+W0QBp9uAgaMU2Kl5JmHRCpv5M7nOEo7mFJzqjkBAb /VbwD4T0IQe7VwNr1O/g5ZIcYzPo0hqieE1Te2lYvN6/NUzOTTtPxU6uROizB8UU bN6twW7zpQsJ6g8rF0sRNl37RA== -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_sub_ca_l2.ca.pem.crt000066400000000000000000000023441322470703100310370ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDYDCCAkigAwIBAgICVgMwDQYJKoZIhvcNAQELBQAwJjEXMBUGA1UEAwwOVGVz dCBTdWIgQ0EgTDExCzAJBgNVBAYTAkRFMB4XDTE3MDcyNjEzMjU1MVoXDTE5MDcy NzEzMjU1MVowJjEXMBUGA1UEAwwOVGVzdCBTdWIgQ0EgTDIxCzAJBgNVBAYTAkRF MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqjnbvnWP+qxoOn/Z2ipf +8/S5tRHyyZar9pUfk6iFn+MQbJk9SNteyin5Ed/oJhaC5GRtXaEFeovqNaWjpWr vBJd3wMQVVJon/JirABTR/pDOdcbc4KOxi/NKTBC9UQXpsLnUUcYcOijD1FY5XLd tK2QLLn9ZGeN/SdoUQQrv28lMRMkAFDOc3oQ9kXRAXb1HQohd/tGQiE7Tbb1BpSl 5tDXOKauMp5fUNq908SdE66NOxHT5ZqRjKtnP0WptMdv//WZLqiaIH+WsrWBPKnG r10CTGo0tBjY17yunbikAs3qag2nG0B5n7r+9CoBDtRvMGMdmW4CZiar3byvSuv6 4wIDAQABo4GXMIGUMB8GA1UdIwQYMBaAFOVlo8qN1W5WsD5+q15XOJoWA/3hMB0G A1UdDgQWBBTBDdOEYV1FUMQbC54OTgbjiHQY4jAOBgNVHQ8BAf8EBAMCAQYwEwYD VR0gAQH/BAkwBzAFBgMqAwQwEgYDVR0TAQH/BAgwBgEB/wIBADAZBgNVHSEBAf8E DzANMAsGAyoDBAYELQYHCDANBgkqhkiG9w0BAQsFAAOCAQEAFa/4PazczC+cUA9m /HKDoOwN12P7X6sUxD7xVVUsc66/AKpHol8GitaIryCpH3RG8O2f6yAi7cpLzwed KSwKs/cU8PB4mxgAJx0e5gDhTFpDQm4vj4dtFdkUl0j7v9GA+ZpZcCIlTF2sKEkg PJxEFbXs9hjlI5wQfMUhUz3Hxts8w1HNrriYUABlYqNxENC7Wul94Rqa8qa5ON7w /wzN2suM2uzo/Kq11lHumAKJsrw97kRssJIvMcdeiTs8J+zx2BBcPadQBqYz30pS B46pHIaW8CBwTO2R3Zo7XM/ZtHQXk708vLzZjgj4TTpYLHXKGw2Hrffo/nPYtKcj +bGWFw== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/cert_path_ext_19_sub_ca_l2.pem000066400000000000000000000033021322470703100276610ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqOdu+dY/6rGg6 f9naKl/7z9Lm1EfLJlqv2lR+TqIWf4xBsmT1I217KKfkR3+gmFoLkZG1doQV6i+o 1paOlau8El3fAxBVUmif8mKsAFNH+kM51xtzgo7GL80pMEL1RBemwudRRxhw6KMP UVjlct20rZAsuf1kZ439J2hRBCu/byUxEyQAUM5zehD2RdEBdvUdCiF3+0ZCITtN tvUGlKXm0Nc4pq4ynl9Q2r3TxJ0Tro07EdPlmpGMq2c/Ram0x2//9ZkuqJogf5ay tYE8qcavXQJMajS0GNjXvK6duKQCzepqDacbQHmfuv70KgEO1G8wYx2ZbgJmJqvd vK9K6/rjAgMBAAECggEAGxebTCxMzoIrEohvpUPSQ/MXJ2rIxGHl1BAlG3crX/ZL 3dblL4jEb3IQiooAm5Az4Jx5+s4ShqRfknkYvDfA/e1UaF6F9nZntXEv2B0zJAUG Nwnv0goI7C0Gc5Q9S+ja9M0XYL22e53i+diiE96cv5lSFXRCinzawdxIQ4Cs78of l3eV5AOsbkMjH0cAo2+tvWgtraZXJZ24hbvSNl2LvmPTdFFoDicwKHK5uWBwgaLC wv0qGzIJqMWe+61bo/8qGPx2eq0BoYLHG9uw5aYwL9f1NkKXYKsXV4T0GpBOXlEf HFrvsW6r/lVfONcYLxWFxjC9SlCfGQQ0h7NIIyyecQKBgQDhF4GjK4nC7rKHzcRm jgtWqWt5ozdygPI11LLMXGMxiFPY1igfp2cKcwk/aq78ZZYC5kHewx8NEWcn/eHu fw9tQ7ykp1jDsAbTEG53BqEXGEkT251NAp/mfxvxNeNWLJrErtRarGrFLS9/eaAL yutl+/H9EboklgYoY9I5B29jsQKBgQDBmbFgWHOJkz8A7qEN6VTWnfvR/RbczMif dYwU4NUuUuPJCT7k8om0LW1/7f7K+pEJ6gBRaLjhLKKJXoOkZnqjOIut+aKqA+5G bCCcZUDbhaYDLKkUoDgdcRQBRIedEnRAI/+brK/+6XkppSm8LEUaDHXaJomUj1AN knB5Ey3Q0wKBgBUNz9BlWCNllEljk8VL7/+RJT5hZ+RL71vdo0O+OID/kWgsz9/2 FotBq1HFNszg66ElzG97rMHaKN3yv1lBhT3hIhn8lS7onhrL5Kk5c4Pnf55d4l67 qh0zMnfjZHpA/dD70V0R14LN8S1pQPEZb99AK6hSKikV50mL3LP84AxhAoGBAIew XcaGF+xLnHPdzFmAuSp2reFefmCg0tgYPecAMcn25JmpdkBm0SbMVBu+xb6j4XXO YQyt1i5T51NaP+/At6GgZx23gk+g06bd7/lNaiixwkolShgft1TDRV8iFd576ahu 0p7caLnED1yl2tt9N61rIEqWigTqcRQiF9x0Gb9rAoGAT98G6jErKan9QIs2JPAu Pr6Y/10YB0u9oXTg/AtiPyrkTiiYjCmAn+InVSq8X2c/0MX8Hrt3/mqKq41UE0lD OLoRfFNAosy1NJMepxE7B5oBUFfotAQkp/4tO7iAQZpM1HN6rJG/w610KcVfj0eM UXkHny3cEbCVb3o48GZX3x8= -----END PRIVATE KEY-----botan-2.4.0/src/tests/data/x509/bsi/cert_path_ext_19/description.txt000066400000000000000000000010121322470703100251630ustar00rootroot00000000000000Test Case: CERT_PATH_EXT_19 Purpose: Checks the behaviour of an application when the first intermediate certificate in a certification path of length 3 contains a Policy Constraints extension with inhibitPolicyMapping=0 and requireExplicitPolicy=0. The next certificate in the path has a Policy Mappings extension which maps the only valid policy of the path to another policy. Every certificate has the same policy. This path is invalid because the inhibited policy mapping renders it impossible to have a valid policy. botan-2.4.0/src/tests/data/x509/bsi/expected.txt000066400000000000000000000063311322470703100213100ustar00rootroot00000000000000cert_path_algo_strength_01$Hash function used is considered too weak for security cert_path_algo_strength_02$Hash function used is considered too weak for security cert_path_algo_strength_03$Signature error cert_path_common_01$Verified cert_path_common_02$Cannot establish trust cert_path_common_03$Invalid argument Decoding error: CERTIFICATE decoding failed: Invalid argument Decoding error: X.509 Certificate had differing algorithm identifers in inner and outer ID fields cert_path_common_04$Certificate signed with unknown/unavailable algorithm cert_path_common_05$Invalid argument Decoding error: CERTIFICATE decoding failed: Invalid argument Decoding error: BER: Value truncated cert_path_common_06$Warning: Certificate serial number is negative cert_path_common_07$Certificate is not yet valid cert_path_common_08$Certificate has expired cert_path_common_09$Certificate is not yet valid cert_path_common_10$Certificate has expired cert_path_common_11$Invalid argument Decoding error: CERTIFICATE decoding failed: Invalid argument Decoding error: Unknown X.509 cert version 5 cert_path_common_12$Warning: Distinguished name too long cert_path_common_13$Verified cert_path_common_14$Verified cert_path_CRL_01$No revocation data cert_path_CRL_02$Certificate is revoked cert_path_CRL_03$Certificate is revoked cert_path_CRL_04$CRL bad signature cert_path_CRL_05$Certificate is revoked cert_path_CRL_06$Certificate is revoked cert_path_CRL_07$Certificate is revoked cert_path_CRL_08$CRL response is not yet valid cert_path_CRL_09$CRL has expired cert_path_CRL_10$Certificate is revoked cert_path_CRL_11$Certificate is revoked cert_path_CRL_12$No revocation data cert_path_CRL_13$No CRL with matching distribution point for certificate cert_path_CRL_14$Invalid argument Decoding error: X509 CRL decoding failed: Invalid argument Decoding error: BER: Tag mismatch when decoding got 65280/65280 expected 3/0 cert_path_CRL_15$No CRL with matching distribution point for certificate cert_path_CRL_16$Certificate is revoked cert_path_crypt_01$Signature error cert_path_crypt_02$Signature error cert_path_ext_01$Encountered extension in certificate with version < 3 cert_path_ext_02$Encountered extension in certificate with version < 3 cert_path_ext_03$Verified cert_path_ext_04$Unknown critical extension encountered cert_path_ext_05$Duplicate certificate extension encountered cert_path_ext_06$CA certificate not allowed to issue certs cert_path_ext_07$CA certificate not allowed to issue certs cert_path_ext_08$Certificate chain too long cert_path_ext_09$Verified cert_path_ext_10$Invalid argument Decoding error: CERTIFICATE decoding failed: Invalid argument Decoding error: Decoding X.509 extension 2.5.29.15 failed failed with exception Invalid argument Decoding error: BER: Bad tag for usage constraint: 16/32 cert_path_ext_11$CA certificate not allowed to issue certs cert_path_ext_12$Certificate contains duplicate policy cert_path_ext_13$Unknown critical extension encountered cert_path_ext_14$Unknown critical extension encountered cert_path_ext_15$Certificate does not pass name constraint cert_path_ext_16$Certificate does not pass name constraint #cert_path_ext_17$ cert_path_ext_18$Unknown critical extension encountered cert_path_ext_19$Unknown critical extension encountered botan-2.4.0/src/tests/data/x509/bsi/readme.txt000066400000000000000000000012731322470703100207440ustar00rootroot00000000000000The test cases were developed during a project with the German BSI. Each test case contains * An end certificate that is to be validated: contains "TC" in its certificate file name * A trusted CA certificate: contains "TA" in its certificate file name * A set of sub CA certificates that may or may not be needed to construct a patht from TC to TA * A description.txt file that explains what the is meant to be tested expected.txt contains the status code that is expected as the path validation output for each test case. The expected output may also be the message string of an exception. Certificate revocation lists must be checked if and only if the test directory has "CRL" in its filename.botan-2.4.0/src/tests/data/x509/certstor/000077500000000000000000000000001322470703100200335ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/certstor/cert1.crt000066400000000000000000000017651322470703100215740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICvjCCAaagAwIBAgIBATANBgkqhkiG9w0BAQUFADAQMQ4wDAYDVQQDEwVjZXJ0 MTAgFw0xNjA4MjUxMzQ2MDBaGA8yMDk2MDgyNTEzNDYwMFowEDEOMAwGA1UEAxMF Y2VydDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDc8LorF3s8LuOi M6odFrxwz3g5ou53DH7VHmxRUbxfweB+/IqTDtdX+vkodWJs7asqiR4M3jxyjJRV HcvIoUiNRF8oIXrshKyWNRtzlgVQnxKcwYu4SGgzx4anUYNMdL5av172CFdzh0lg 84oXgfx+EdRw9F2CZpWpH26mklx0OqqOQJQOyZzbFe1fJG5hwD6CL+Gcva/KqS6p 2p0CCJaeRdwhuYxJIGjxkqYj6npChnz3QaWXkytcHR2+4RsSYs6Yh/FEtGeoBCQu kzrUgzbiQ/lrmJyW1nxb7lyTHA4J+D1aZ0pjX57N2nqaOY8288O5w/wLR3KMyctJ XBiJq0NDAgMBAAGjITAfMB0GA1UdDgQWBBQPl0HKiP7UeJp44xZwTbZHC4BvhzAN BgkqhkiG9w0BAQUFAAOCAQEACMl5HRIbx33M15hjQ7tcaXerja6qOMOe8JN3o36a 6w8V8dqQMqGWuyUBtX4kNLvrleWwC/6soltTT1Y9D0uw2lM37pXTsI3UL4b4bGX+ WPNVT2Gowdd9eqpn795u9EErGXi2bn7IoIiKAvzHI+eDChFR5OHxulj6b4FTGa9s G/V0RNuTx2wvB4v5XQjWhK6Cy1V8giI2X0HiGvbu9I5lo01lj523m6G1lIXU5zmX +8dNxEfrVqk7RT3Y65QnrrUjhxZlNL6vh3z+JDlQqGi0y/RsDnXVXbH1C4wBawr9 P7248MakA6ehPikut/4+tZic+1myb0arDKVhEeht4C0KTQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/certstor/cert2.crt000066400000000000000000000017651322470703100215750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICvjCCAaagAwIBAgIBATANBgkqhkiG9w0BAQUFADAQMQ4wDAYDVQQDEwVjZXJ0 MjAgFw0xNjA4MjUxMzQ3MDBaGA8yMDk2MDgyNTEzNDcwMFowEDEOMAwGA1UEAxMF Y2VydDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDc8LorF3s8LuOi M6odFrxwz3g5ou53DH7VHmxRUbxfweB+/IqTDtdX+vkodWJs7asqiR4M3jxyjJRV HcvIoUiNRF8oIXrshKyWNRtzlgVQnxKcwYu4SGgzx4anUYNMdL5av172CFdzh0lg 84oXgfx+EdRw9F2CZpWpH26mklx0OqqOQJQOyZzbFe1fJG5hwD6CL+Gcva/KqS6p 2p0CCJaeRdwhuYxJIGjxkqYj6npChnz3QaWXkytcHR2+4RsSYs6Yh/FEtGeoBCQu kzrUgzbiQ/lrmJyW1nxb7lyTHA4J+D1aZ0pjX57N2nqaOY8288O5w/wLR3KMyctJ XBiJq0NDAgMBAAGjITAfMB0GA1UdDgQWBBQPl0HKiP7UeJp44xZwTbZHC4BvhzAN BgkqhkiG9w0BAQUFAAOCAQEA0Hdd2iHHBuCfJntTMe3M1H6wGKLqjozD/11yIS7k Fvu42gke5PE9zI2O3wgDeFeyer7OkA1KI1KK08w33kZBICqKdwXAFH9RYLwM8hUB z1zM1nQwVfQlTl8yi2LptD7o5oPZ1dgBetn2eOCKCguC0rAS567JdivD/mxzXorH DJTXN8EtZH0yJH6AjFarMobVNGyy6eSwNKCK9nKPrkElTktW5UajkXe9NErMaU7f 4KmJArN4PsJjj6Qx2Z6/pj2gS3A7IMbbG2jDK2tAlgrQkCEoVLY3+toov5II542k ZNej7/z5X9Fcft+/o/+ILufK9H2uAQWHmL4zzHXefjTH6g== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/certstor/cert3.crt000066400000000000000000000017651322470703100215760ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICvjCCAaagAwIBAgIBATANBgkqhkiG9w0BAQUFADAQMQ4wDAYDVQQDEwVjZXJ0 MzAgFw0xNjA4MjUxMzQ3MDBaGA8yMDk2MDgyNTEzNDcwMFowEDEOMAwGA1UEAxMF Y2VydDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBvhpDLopDxvrn Uo/zN4dEz39wfIepWno0soJBfvV2EuDTp4S89r0Q0dUeThKYlOlyTk3IR5QmcnoG 7XD9+J+CXvcJI3X2h6uKL+f+2XL9tmSoVmw1u7QXK23cKkhpYIszkh/OK2gY9vfx 0Tudt0lc8Bxa4iK2lnZwbd6kcQJbWSX4gcF1Hxdfp9mrGg+/f623GW+RAnQVaC50 HvBLFuWxNaLbcOD0vSkLRutkiI9t9Ng3G7ADJ5xuHY6W68BmEG9DDfKO3Y5kfhIz mE/q4X9PcbpBAemzWX0YtNzh6aNqhOw/eKmApC0NbeVurZxYHVnRprO+/X/9WK5D i5K3E651AgMBAAGjITAfMB0GA1UdDgQWBBRo9BOhV2RYDu9UhucTMvIkp/ungTAN BgkqhkiG9w0BAQUFAAOCAQEAo7AW86pfkFJt9dRn0uF2evp/vaMEt0LjPfxlYlWd UgO6OS+s139HPujd+LwmyDN17d99KDb/EjLgdlXm0rnkMMTH9aAaXwoskxNP81vL ol+f5bAo/uHGLf00K4WhvJ8pS/94AhZmoo6hzEVqLuZCt7q2ugrQdxPhLxfrnPWm IovZxXOmViVYiqU88QVepTbRYF8QByQg2vFiXA9/rGnIKL2UDwci7rBO4mTheGyD GotaVth7XAN4t61JVnjHbClxBMgxILR74arkbzTesEYvcLozXfPNriXZfqbHDBTC AISmmx4Hh2G3+NC0Q2qqKQPpiKZKSahTMgb0Bja+Kaqb6w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/certstor/cert4.crt000066400000000000000000000017651322470703100215770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICvjCCAaagAwIBAgIBATANBgkqhkiG9w0BAQUFADAQMQ4wDAYDVQQDEwVjZXJ0 NDAgFw0xNjA4MjUxMzQ4MDBaGA8yMDk2MDgyNTEzNDgwMFowEDEOMAwGA1UEAxMF Y2VydDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD72rrxGisXsflB yHtIZI4iNHc7Lbgu0CzxsksgzEYzrRNeW/6I8imu47tfZjY1f+XR6sEtROPwZ9vW Pqj366SGpYst+FHtmz7k8Wb5JeI0KAsr0JYyIPgMPDSTqpLIRFrMwhsFLo0tR5b6 /oT8oSNSX+3jQlcwGJWrIQlIkrYzHxvkXiNBcikqTne9+zrAgVobjEvbeedvM+9n A9JUgScOQjnJ6YDiGaZ+0n6OzYF7duGHTKTlb/+3bJpbrOlgDrkCgZMMIUaAqDra 2w8pArUI9sAVex6djUjavI9WzcjX7okjhqbru+TtXEL4FeUF5hAPRi8k02axwuBq 9jGBRpRhAgMBAAGjITAfMB0GA1UdDgQWBBTW4dmVCqZjKmKS06pvbiAPeCXbdzAN BgkqhkiG9w0BAQUFAAOCAQEABcOEZ4gfcNLfYc5l0rRkie1OIOHQas4gIYXLLAxM Jh/gV730yR67NLUm1O/99St7GWLzuNpI7EgXhWA5HvaVCUUc92wxmyzrzZl1OmD8 bAKHVtLUsL5dPgiK0zeJmiN03v2DjME/yLinbN4DtjDtzBFS7+vFCFPnrys2Mw5L JtSIfuDKF7f3FWuwsnTSNogG78hYVFQ/DA5YfftI3cPUO4eLLZazRCL3wpKJ6uE6 2npn2S7e4kgMtstGydLaO19AyuMTG9+TLn+04h5yWdoIrmyAXsJZoFPn76d+8Mc8 St04VY1xDjwZfxi83Wnywb6BMbW8BEHvfnOvC3K1YmcNww== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/certstor/cert5a.crt000066400000000000000000000017651322470703100217410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICvjCCAaagAwIBAgIBATANBgkqhkiG9w0BAQUFADAQMQ4wDAYDVQQDEwVjZXJ0 NTAgFw0xNjA4MjUxMzQ4MDBaGA8yMDk2MDgyNTEzNDgwMFowEDEOMAwGA1UEAxMF Y2VydDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmAHBoCnzfzQmG evf6RDAdAy8Am2xcM70IxPHs2ZJV7kpswz0IH3dQqprHDAKLTnduG4YmeyHXf0JL hIIc49mwoXpc+c/brNHDdJBC/B7AF1gb8l9wkLCQEl1FyOJn3CnAuVuXwub/o48f zZQNJ10oGFKXwYHWCe9g8CGScDoRbD6p7+4xx7/k6ukD5EY9W8UoiXTuCkqGhi0z lbGCxpkHE4lwRMeAKCY1rhXhH3ue0tXe0/RTrR9rYKs4rjt3rBGcFNGELRhWd261 2/SMN1fCfKK/N2PQZm0O3pnZ7dP/JaQ7phIqVQxts0gDehoA16u7qGgJzwEkJECC tFCLxU/PAgMBAAGjITAfMB0GA1UdDgQWBBTkMbO1+qNf/EfUGdkQ8oxq3T99HjAN BgkqhkiG9w0BAQUFAAOCAQEAVjOXcX2qbo7YaEYECIL0u35qc8L1qpovA0wpNjFN AzF+NbidJJfYAiFCkJgyE1Hl+ycsE2sxfWUky4Hv+ZWQDWb0yEqanbcrsfIHdReP 40MQCvnJFGZ4N9lBqRUA6y3dc7FY61syamz9uemctq0FVfnXpCKtneje5xIBd0Hq fbkSb+yqfheQ/Nlou2iU/7gBC63Lm5D5lGQASS/acJN0jBQQY18mq/TPH9aFyzuj 9U73anXRLqIJJsbc1OBQmQP3S7ozMKpYy5VIHJ0glE1xPWImIAQDVES64whjr93Y Nz8T9lwyby3D+vQtR9oWxA3aIPEKmcVPeFHA9b+fA+D1tw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/certstor/cert5b.crt000066400000000000000000000017651322470703100217420ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICvjCCAaagAwIBAgIBATANBgkqhkiG9w0BAQUFADAQMQ4wDAYDVQQDEwVjZXJ0 NTAgFw0xNjA4MjUxMzQ5MDBaGA8yMDk2MDgyNTEzNDkwMFowEDEOMAwGA1UEAxMF Y2VydDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dh63j9uRBb7m Axz65SrG94zowLFFkVm35Bbp+POwTGXWQFuQybXSJm+ltU8gI86UmRn0w30Vo0RF GHMfwq4W1tJ/Oxydduk8/QZxBSP91MKFfk7cDjJbPvXhqNEQI7EhRHuBTKk+27Aq zugEsSNVxOPReSA7dOOiX37hxV1sDU1fzEDg0U2P/VTGA+T0FQ5dfwI4CMUyCB9b WuFTgwPDmutV6eANlmEhvRvIzMUeYxrTTtgjOsKYKkbbZfBis09uMZ3xjLBDfsK/ Uel5xNSEreh+/vhgURsYWsTFNO8NgJELy7mmRaX9hmz1lNwnNo6PMLF9vWh+Nulq 2dBkQi3ZAgMBAAGjITAfMB0GA1UdDgQWBBSwyEY1ySgpquTbrMaFPHgbabe0RjAN BgkqhkiG9w0BAQUFAAOCAQEAO44gBp8zORkGbm4o+U0AGY8/lHkg4EuAloZp+o1z y3J17DSK2nTjzkM3ot4inc84eeQ3EXkcu3lNqii6xblORQGvAIyGC287cueY/e4R S7OfPo5GfmFXSsv31doKc53H1BHOXprqoHAp4Vo0V/nRzCWFQ10MoYiCdP5fZeMY W83/YTnElGLcnXXFdKIWaCHT13phYXpefYtGIv/NY+dyBzqwxusK5qUPomLbt1Qr UGCsGj46oqya+zKq2H+7gIu6xn+PEKqcH5ZYpMONNuoqE68gq7qlpKuRFvkJ0CYx LYvsZV9jmFl15ZDqlIXibXRQPI0lwJGQRaUQhYEZ7CG4zQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/certstor/key01.pem000066400000000000000000000032501322470703100214670ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDc8LorF3s8LuOi M6odFrxwz3g5ou53DH7VHmxRUbxfweB+/IqTDtdX+vkodWJs7asqiR4M3jxyjJRV HcvIoUiNRF8oIXrshKyWNRtzlgVQnxKcwYu4SGgzx4anUYNMdL5av172CFdzh0lg 84oXgfx+EdRw9F2CZpWpH26mklx0OqqOQJQOyZzbFe1fJG5hwD6CL+Gcva/KqS6p 2p0CCJaeRdwhuYxJIGjxkqYj6npChnz3QaWXkytcHR2+4RsSYs6Yh/FEtGeoBCQu kzrUgzbiQ/lrmJyW1nxb7lyTHA4J+D1aZ0pjX57N2nqaOY8288O5w/wLR3KMyctJ XBiJq0NDAgMBAAECggEBAKINOy+CIJSq+7Gr3VlKpNrFgbQcqnXNR3X/w4j9v4Io zQW3K9jjKNXSMlAXkSK+TC59tfnQQ1vteprXqPG2QmXDQVxI+kVipsfhmgn0fl98 3YT2fQmkqjFYZo5wvjIk6r3a4cbppWMKVqry1lWZtN2vLDfRNIkBv0H12Q36CjAA vpjOCgowhfqtjfI7X+iPGp95Wc2p4AUfgj6W76ZQs0FmsVoXkiZCeQbU9yMLtMNW fUiKgCpc5y3s/iQObalsSu8i8O3wBWH1h93w/PqRPGVnucC39iAat12RvFW+cnF6 zcs0lveidFxxuMvsZX4nzMP2q3pUm4c9GxBo3C71RykCgYEA9xNgckPS/H9Qmd3X 7V5eRnaeIA4jmnFs5uX8Bri+0BsjY86Sjo/5hKyTh8woSVgombJ4JkwkFzIvo9P4 +EWzPhQEmMEYHEc5JwIrolfpWGfyDjDZw7nlsUrMAWz9IRPeHeq4o420iGawkofo xn+mWPHa8NWqQ0tLLqroG0nyRz8CgYEA5OuvmvII7gsGfkFjla65xF9U7hccgsvt K7bY5IOJ4KkpBvlnhsD7kNX44eAAOcAkt/iE64jSl2vdKy1c5ci36cziZeoGCLjW ZcGwg+fEva8nyADJpKI/RRkVvBWXT8OBvNugWJPz2NFAMXYV9bA9L1OIA05eBzPF soPxOCr4pv0CgYEAhrLwpLrnPrLmLUxtmMIW4ZFveYhbzqpBtcvyT3POy0PQUmxf KAvD+5neQG2EFSBT2h8bM73U+zRoFofMtwXAx3pAW0sCKwCFXwfm4/XLiF/67dOi FPu3BqYBfFF/2tWrBWJe0QPDRY2+e9ROilEzTlBkjWHfFhrpXQLd0WrKBB8CgYBA WuGrNY+9G+xfYhKU6eHfis1dgbHKM3ohZ+3hj/ka53NZOpQYFfii5wRou4hUs+ee sIbtkDFj0DcFBGOxVZQebjLXY8r+eLgNMz5kVqvAh5UvbMlDNzmCO2MY1RkMm3HF nhidzjonIexh+0iBIWKSA3GhPE7Cx5M0dFND7xCoIQKBgHZ4W0HHhYLTAxaUlp3F afRTMJhhn4w1N3uzEtNa96VEq3dUwD/Fr/7eLg9Ap/eCrVnJkmR1qHhs+KI397CK L+bL9nXEDZZRQV2Ch2EV+6ruU5vV3MvfH9MOg3a9phj25bSAMdQMIXSB0rBee9ss aCEgxxyjdAsdN4ESs8q3duJF -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/certstor/key03.pem000066400000000000000000000032501322470703100214710ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBvhpDLopDxvrn Uo/zN4dEz39wfIepWno0soJBfvV2EuDTp4S89r0Q0dUeThKYlOlyTk3IR5QmcnoG 7XD9+J+CXvcJI3X2h6uKL+f+2XL9tmSoVmw1u7QXK23cKkhpYIszkh/OK2gY9vfx 0Tudt0lc8Bxa4iK2lnZwbd6kcQJbWSX4gcF1Hxdfp9mrGg+/f623GW+RAnQVaC50 HvBLFuWxNaLbcOD0vSkLRutkiI9t9Ng3G7ADJ5xuHY6W68BmEG9DDfKO3Y5kfhIz mE/q4X9PcbpBAemzWX0YtNzh6aNqhOw/eKmApC0NbeVurZxYHVnRprO+/X/9WK5D i5K3E651AgMBAAECggEAdRxzhY6ZV1TtD20xxIQZSTfgQd+UpYMigb4xzGNw/rl0 m5wUOaEwMf2UxKfOx9qjrku06s6RuBfUuWFHvs1NpiG/VA/SW34w6+v/YWaSAtkA yVzMNkLLHoJK+x23/bK1EixO+3Hzj7uhrtOaJMDJINunWCx/bT1QRK+1OFNzaEFS txMyWKXmvFpo5dAKAaUw1Nqijcd9PCko/nfo9z2+0dxYyXiQKiH90MNt6FHZ2pS6 KdkQTnb/WXiGrf3ocLAzLvBMQb1nK14ejRpUkDfVAk0GYcqL+SBuEEgvU6tLw3S9 AEqs6Eca/OgpLDPU8XGU4cGnLeLzC26RpBJ8/AnpNQKBgQDmFD0dy+vXJ+3uAvzj dNpgT8V8L9POYGMcpO4pCBaXBkXEu2NsZQrh3uC2JGTAMBqDvkD/g+riITJKkPMc G47njX9f8PjxuGvGDBIOPs1K23TFu1T2rIpbhyEQVQiHPripxw3cWkZcwMSK9U3O I/xnO1WK+d+8IYE7rvhNW+cgBwKBgQDXkeArNOEHog3oedG1aJcbuNHYOQhEqPpp kynunZPGNug5pN/T/ZXHsfpPkPUrtNgR4cKXRYpuL4ecdi1U7MfTpUaJjnhOXwVU EAxMMGjGM12rpIbN8thCz+QF9iAJQFnUnoiIXC1WyMERtRkMyCKwtz60IVmz0S50 Q0r8AbzmowKBgQCq3jbxTQNuO0IxM9jZl2uigTu52c8kAmM436fbox0btdXUoBHb a0LkseAShP6p2E+orX+aAz9KBrtRs0pJApJjlqsU9mH7Kion38j8+Vj/EfIr8s7L jyIFjVpZxbzarBL6S1EY55Y/xg1w4XKR+Bm4FNGXr7CgCAXw7CWNVgZUuwKBgQCR I8F3tcGxHvYYSTTd3E6pNpXq6/NaLx9yx8faxbPCKCPQ8+ZT2A/phTZQLfw0ci1s VMFskkCzEUNQH+1DmaytHkFQymDL+4Qd5jQxdAKHN/xgXYT50wCyc0BGl0FYmUAi PJ8WmGFaZg4/+tuj1Hgu3SHVrAK2ZCfP1aL967mg2wKBgDAGXaweI/CSzO9AhuTV QhZy5eDgcjm2SJICqNJ2Welt3JyTz7zgxkgShPT0gXTADqfj5WmJ6edbYhSDfC6p VAQlfixcogRX1Uxb3GhHCM85r6huOv71L9vX6tVo7ggUGN3rysRPAkf4mk8Cx4F+ gUid5rlxYk2QhKirTaM1KZH6 -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/certstor/key04.pem000066400000000000000000000032501322470703100214720ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD72rrxGisXsflB yHtIZI4iNHc7Lbgu0CzxsksgzEYzrRNeW/6I8imu47tfZjY1f+XR6sEtROPwZ9vW Pqj366SGpYst+FHtmz7k8Wb5JeI0KAsr0JYyIPgMPDSTqpLIRFrMwhsFLo0tR5b6 /oT8oSNSX+3jQlcwGJWrIQlIkrYzHxvkXiNBcikqTne9+zrAgVobjEvbeedvM+9n A9JUgScOQjnJ6YDiGaZ+0n6OzYF7duGHTKTlb/+3bJpbrOlgDrkCgZMMIUaAqDra 2w8pArUI9sAVex6djUjavI9WzcjX7okjhqbru+TtXEL4FeUF5hAPRi8k02axwuBq 9jGBRpRhAgMBAAECggEASRulSHegKrCu+jmID+uglq1ELxmGbZBge4iV5l9lwXps NOffa0FgeDQDIB47fiwyOk065jkpMY/0cKyfv9fXWn6TeDStE5wNFcg9a/VjRGCb XYyfDM4lMugHGxZYpWmyMd3mmgp5ULuHSDS5xdvAtRjDpUSMqpl4WMSuPTLZUN0T gGpuyOFT5xF+BaQS/9Ech8Jk/FyWHCBn9Z4GE1u/DefEgA20jIcFLGVTGuIpx6J8 HxuthrH9F4a1fFWO3tFwbES+XmGwNhAuMzSUvDJjUwTy6+g/YoKS2DreZFdYmHQD 2tah5gHixyD2cmoJ2uJeASloXZKUUK6KAh/44OCfAQKBgQD/T0Hx19kEUJ7Po52R 6fL6LmD00p2cYy4mzYpAZZqJCotyLrkfqx0u54zFmVgqsgjeng+121IRshZ6RV2K 8fGCeQRkB+1XKIEHoCSaOVCpiDPU8i6nD4fDfPSHhgMLkdcWEVbLWDbCI+cbujjg aRjsWZ20RvRZaJ5grpFXv6vHtQKBgQD8iRSrBC/m8bpafxnv1kkYUz1BFwy0Nv8N 2OjxFI4X9rQp5XCx0TSjrtCaKsiZnY6v/xgpWxQwo1ITILYihBI+GolQIbL8KJCk potJ3UxtLfjhcANTdCiLP+JslwMw5XbhUtpsvQX8jmnGTt220ghx0YxcoTkGWh0I 4KWCi6ZtfQKBgH/n9DC2I5oezcFWxf0xCLLAA4ED90Q/CAMWnDmw7V/UsZHNyJ8N +fvis0rXjS0urnThGRvRueb1on81Oyz+EzF7cXCv6/7rYuEwIMZHCps0iksX3bmC dVDBzDwNLn9gXDJJE4OiOSTAGetxO0dqP7tBFloX5hjY6eej7VrZwrS1AoGBAJOk 4XyK2ia/tSArp1Jdiia6o9lmTHsgnEXQR4CLb/f6uKK2DgkoMwpvrm40DUwincWv 8sRbB5bYJaghO9s6NCAzC4zZ5vceEFLzPARXadN7SUMkZg1ooDupggvSzn7L6ZEb C7D/YnyiFp1mhqHYci95QAL4D4rzLH6AOMP2ObtRAoGAJWRKgEX8vo1/chkcWYr7 l4NNedCOHPceKnWa36Rg9J2ZMMZSVEEsjWluHylpwayMc5E98jEy5thNxm15Bnr8 IUwMngDhrDreoPeoKXCgH/il0T5EKloOdXwYTARw+3gRM/lIJOYHfegjqQxzwsyI mlBDlfWh+LtgbCuIsgqCyEo= -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/certstor/key05.pem000066400000000000000000000032541322470703100214770ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCmAHBoCnzfzQmG evf6RDAdAy8Am2xcM70IxPHs2ZJV7kpswz0IH3dQqprHDAKLTnduG4YmeyHXf0JL hIIc49mwoXpc+c/brNHDdJBC/B7AF1gb8l9wkLCQEl1FyOJn3CnAuVuXwub/o48f zZQNJ10oGFKXwYHWCe9g8CGScDoRbD6p7+4xx7/k6ukD5EY9W8UoiXTuCkqGhi0z lbGCxpkHE4lwRMeAKCY1rhXhH3ue0tXe0/RTrR9rYKs4rjt3rBGcFNGELRhWd261 2/SMN1fCfKK/N2PQZm0O3pnZ7dP/JaQ7phIqVQxts0gDehoA16u7qGgJzwEkJECC tFCLxU/PAgMBAAECggEAfwzQ+2AjiOqVwr508q+jn2DjZXSPL9ZNdNu/SYaQEIKr paicGo5ytGOOyI8xl0s77yLTvrn5AcUdiUzmhJQC9cPxMh3kb35KoWyiSRJLurtj LSiI0U98Qxg7GQER/2mq7x0us+1w/PFCxpWCHbsl+lz7QbjR1W6PLsM6/qg0WUYi 5cfh9/xIrwY/jZDHMfB01R41NFF5+sD4FsDuWoDP78Cv8E203U5al84SH1xawb/1 KhbPKivHYQu+Dxp/T2CbD1zdns+ViC8p5ZQXyAbs9+32HpHO0ESTj48XGFL2yFmX dz77OlwF/FCpnteQmGOpH7bVcQ7GCypF4ecgOZpGwQKBgQDSR9iXhape110aVrAQ pu6MPykDwePdeJKKrOR2CzXo1ndbF3nAUD818cR/XY8dPAvw3X+gCiToAvgpzChB 33QICE4rDXIGZ0p8RzGF7MJqpQAGolhKN1EZqM8WSSalD1k7fZ+CvAeBmhjF/Of+ le5F1j1uc8iexOLAegE8TcNELwKBgQDKGAqsGuFukj357+SpxsA8fdXBdQnmReEK 6jslVGzFUQ0zVAM9edOiy1pYjUyr89E8N9pmHWPO9cgzYgmQOQoDtURtegwR+zzC EK9a/PGpkpfWkuGYAf1DKwG0c9L2WYAwvUxxm5j6tv0Ok2iHkRYruLLoHHzeJic8 Y0F0BA6mYQKBgQDKq36BA85iHJZadWS6l/ng6FsiiPSTF8u9pseHUmTCJjrha+3n wjA6UOv/ifAO0Dn+C64fVMefaoU+28uNOc4+k6qragkVTOaIg6Gin7/+Q0uUGVKZ LVmYLpBxvU1m1zU81mYv/gQKELiB0rDTOjRt0QBifWvGQqL9ulmIgraJ9wKBgQCL MkwHhuxHEIuHn2hMWA0InVOh0E9lQDRlJDhg2emhbtY8yF0C9uqCcrZjz89DkMhJ Rd8z/oJEhp3CZoBXyjHPpAbhsPKnX/jVYlClxxtcxQ+4R6sC3DvpC7I87Jod/D+D Up9YkOepqGhcpcOVvKUcsDbqENUg3f6gZW0rz6+XgQKBgQCJEWS+y0aSEalRDhVw xcIWtEVle9I4wuzuOCKSGzIkWiV0KSzDmLEsfFHQ/F7k09kvBmrIjRQuIm6e3PaK vffCp8DG/ctabF4RtQHWhnjFVxkPdm4EZSP7SFodi2aA+MNmUw5f7BnoZR7wCaZp 25u8dPwvYEfjC3bFY+fdpKPwdg== -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/certstor/key06.pem000066400000000000000000000032501322470703100214740ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9dh63j9uRBb7m Axz65SrG94zowLFFkVm35Bbp+POwTGXWQFuQybXSJm+ltU8gI86UmRn0w30Vo0RF GHMfwq4W1tJ/Oxydduk8/QZxBSP91MKFfk7cDjJbPvXhqNEQI7EhRHuBTKk+27Aq zugEsSNVxOPReSA7dOOiX37hxV1sDU1fzEDg0U2P/VTGA+T0FQ5dfwI4CMUyCB9b WuFTgwPDmutV6eANlmEhvRvIzMUeYxrTTtgjOsKYKkbbZfBis09uMZ3xjLBDfsK/ Uel5xNSEreh+/vhgURsYWsTFNO8NgJELy7mmRaX9hmz1lNwnNo6PMLF9vWh+Nulq 2dBkQi3ZAgMBAAECggEAfDawBtr7MgZZVQXffyK2PAJa0NJcpuaXsreIylcctY4x ChnhrniAi0oF0tefC8xOCSCjYtSz8na7MK3J9J23c2PeV+oSZa5rVj/xdDHRmf5e lhTscNuh6i7KF+uNPY6Y992lN21iXMK9qiNC/KiCKR5P2qsWFcUZ5P/E+RJjoI2r FMjHMSMmi3zDN/A3N9Izmuq3IByDcmwhXf6LOJw3oRYNEwHCfqaz2WjirljBYhu7 LfCIGTe1+CV8Hkndppc523y4j89++qlAlh25eFC5BEHTFUUz7FCvzpSu3oga9Wr7 UQTQe7HSLpAu6eHO1jabS/CTwsdGb3+CvaH/A+MLcQKBgQDlQar3TN50tIgsCw4U TSE+FG8TqwNxbprTYwyDaNt++G2Xf10B+u1EEtCDPhTL8HyO9RowLbWG4G0cdkFl TZs+3I3vqKHOQ/rNVcIVJUC33i7oQyVTWmFXic3RPoTl1BpnSfNk+tG60HOxcwls cxD7UyIZu5vuiDyLmVgZze0LVQKBgQDTkAsELc67Mbj7QRRccKFYdk5La5GF45E2 lGt1czXkIHTpoqN/yLzeEaqfKO6uj7UZRENWJoI9wBJRDux6cdybR7z0YNUz4n+S cNjAqY9uJRT+ObEQKG+ik88C9lFpw/jVk2UtIo15OEvFp/gKoxF+UYxpNLQ9c788 vQZCIzwAdQKBgQCwb1JpUpJdlNa7tqJWQ2nTAhzeMR3MPYgQKUlnFNrgI8cL8ewd awUQ/73TU4Lj1Se3SbCm5Xav36Z5YhVAJnLU9R6TE9+7A5xQTLC6X1ooZ2kIPSzL smH54ccxQwE6c3sChOo5i8K/GFABf/v/p6qpETjMPxNphxW5hgFEkrPcpQKBgE0x zOM8d6dUMEP1biGAs06c9FqOqG2rKGw64a7cV/iiYyZwwqm4rDl3RsOGYvjs1M6g WtWPfYxcjhJnmJ/g9fbuySJ+Rq0E4zmi1WQPOpedDjjpAhN8PaebuThCelhWOnBr tMowRmDJytQXQulWsOZfiRVGNtIJbukRq7vsMVOVAoGAeEBXbWHKeGc8Qy7NRFVx 9ZsSiPwk3PSYeRRcvRuHuQxN3PE196oP0AAG2F7k8gJmKHon4K1cEZ4VJjTpFN3P RB3SWcwAIKuzeDU89Zs5UTJ8nHQYdxZK/RmUsCWpqcxHK+cpo/c2TrOdgPuF+sbK PZ3qHGP8C1j5q/3xWjM2puA= -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/ecc/000077500000000000000000000000001322470703100167205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/ecc/CSCA.CSCA.csca-germany.1.crt000066400000000000000000000015361322470703100233670ustar00rootroot000000000000000‚Z0‚ 0 *†HÎ=0P1 0 UDE1 0 U bund1 0 U bsi1 0 U456710U csca-germany0 070719152718Z 280119151800Z0P1 0 UDE1 0 U bund1 0 U bsi1 0 U456710U csca-germany0‚0Ô*†HÎ=0È0(*†HÎ=×Á4ª&Cf†*0%uÑׇ°ŸW—Ú‰õ~ÈÀÿ0<h¥æ,©Îl)˜¦ÁS QN*ذ*YÊÒŸC%€ö<ÏäA8‡±©#iã>!5ÒfÛ³r8l@ 9 )­,~\ô4#²¨}ÆŒžLãLnýîÀ}XªV÷rÀro$ƸžNͬ$5Kž™Ê£öÓvÍ×Á4ª&Cf†*0%uÐû˜Ñ¼KmÞ¼£¥§“Ÿ:6JKéP*¹ÜhUÙ Zo^^H9_ƒ Õ|«¯òV`~öu~Ɉl¢"Ø< K™úCÅ©¼á£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U–E-åˆùfÄÌßÑóõ4qç0U#0€–E-åˆùfÄÌßÑóõ4qç0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20070719152718Z20271119151800Z0 *†HÎ=A0>Æ´ƒýL“µžž+sN Á‚úcúîA¨íÕÒy8Ú¸•d¡¶–®ßt–ˆ)Á8ðë/b;botan-2.4.0/src/tests/data/x509/ecc/ecc_private_with_rfc5915_ext.pem000066400000000000000000000003611322470703100250000ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgfKBDxcP88OEfI4v6 k8JFIQquWzap0+HHXE7N6DzuvamhRANCAAR7M3jrGYZXDSqbcSAmd0wO+V8Wx49D jqUVeAbI24rCMk3+mUTTFwwQn0p9nTdf56a1VNl4P9XUM5cbJnqwh5Yl -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/ecc/ecc_private_with_rfc5915_parameters.pem000066400000000000000000000004021322470703100263370ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgQsaM/yuLh6H7UPb+ 1oizCkiyxY9Q4M9A+lfRxmwgZMWgCgYIKoZIzj0DAQehRANCAAScslLLwFzPl93W 50kyRwyO222/yBoKAeheP45kM7QVuxul7flLp+heb0kk9zL0m0xH3PEoRBw32+77 2L1OXOsH -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/ecc/link_SHA1.166.crt000066400000000000000000000015321322470703100214570ustar00rootroot000000000000000‚V0‚ ¦0 *†HÎ=0P1 0 UDE1 0 U bund1 0 U bsi1 0 U111110U csca-germany0 070718113047Z 260118102809Z0O1 0 UDE1 0 U bund1 0 U bsi1 0 U88810U csca-germany0‚0Ô*†HÎ=0È0(*†HÎ=×Á4ª&Cf†*0%uÑׇ°ŸW—Ú‰õ~ÈÀÿ0< "3«Lª…‘µÍ S{Acöã3†êqEq¬ÚÐLeb)ìI˨Q—"†J¯\å<©¥õO²¡‹9Y1­iNL±ÝåSþºîïH–²ÀSXW}hwŠœ/^ºè>ß#}ÄýÅuËŠ.®¦kw2¦ŠÇ".×Á4ª&Cf†*0%uÒV Ð·„†ñÂ~j••Í:ѵu±lxË!äŸDâ†1x›1Ÿìì–«|zÅž1Þ*UÝHà–wåïÃ>ƒLS|*å#o0À¤ñQ£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U»…‡(-›Ú“` åjòÚ[í0U#0€“ؼ“v¯¢E‘š‚MSû.Q+0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20070718113047Z20271118102809Z0 *†HÎ=?0<H¶¡w´ž¥u$‘d®—ÉÌ*Ãó¥§ãl—:vôþÅ´`6ôvÛøCô‚Û­/CWþq–Ãbotan-2.4.0/src/tests/data/x509/ecc/link_SHA256.cer000066400000000000000000000033761322470703100213110ustar00rootroot000000000000000‚{0‚ 0 *†HÎ=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220102116Z 280820101014Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany0‚30ì*†HÎ=0à0,*†HÎ=!©ûWۡ>f ƒrn;ö#Õ& ( HnSw0D }Z uü,0Wîöu0Azÿçû€UÁ&Ü\léJKDó0µÙ &Ü\léJKDó0µÙ»×|¿•„)\÷áÎkÌÜÿŒ¶A‹Ò®¹Ë~WË,KH/ü·¯¹Þ'áã½#Â:DS½šÎ2bT~ø5ÃÚÄý—øFaÉÂwE-íŽT\TÇ/i—!©ûWۡ>f ƒqŒ9z£µa¦÷‚—HV§Bg(„ïžè‚T3 ýâòóq¸d¬c°¾¢ ¨[Á‘5ZÏ‹ùwj§é÷ËÎrrÒ‹à%MêÉéÔLگʊÁ£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U™•K}{ëâk$£§í¬•³££0U#0€¦¬dÅI¨BÚ™~bà 3—å»0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20080220102116Z20280620001014Z0 *†HÎ=H0E!¡“œ.Ä%àÅ“W65„ó‚!¦C{ÿaÈ‘èâÁÎÅs~r CfŠr‹p:}¹v«û9È[ìîÆjy{ÚP›íåÕ.0‚{0‚ 0 *†HÎ=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220102116Z 280820101014Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U610U csca-germany0‚30ì*†HÎ=0à0,*†HÎ=!©ûWۡ>f ƒrn;ö#Õ& ( HnSw0D }Z uü,0Wîöu0Azÿçû€UÁ&Ü\léJKDó0µÙ &Ü\léJKDó0µÙ»×|¿•„)\÷áÎkÌÜÿŒ¶A‹Ò®¹Ë~WË,KH/ü·¯¹Þ'áã½#Â:DS½šÎ2bT~ø5ÃÚÄý—øFaÉÂwE-íŽT\TÇ/i—!©ûWۡ>f ƒqŒ9z£µa¦÷‚—HV§Bg(„ïžè‚T3 ýâòóq¸d¬c°¾¢ ¨[Á‘5ZÏ‹ùwj§é÷ËÎrrÒ‹à%MêÉéÔLگʊÁ£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U™•K}{ëâk$£§í¬•³££0U#0€¦¬dÅI¨BÚ™~bà 3—å»0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20080220102116Z20280620001014Z0 *†HÎ=H0E!¡“œ.Ä%àÅ“W65„ó‚!¦C{ÿaÈ‘èâÁÎÅs~r CfŠr‹p:}¹v«û9È[ìîÆjy{ÚP›íåÕ.botan-2.4.0/src/tests/data/x509/ecc/nodompar_private.pkcs8.pem000066400000000000000000000012641322470703100240260ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIB0QIBADCCAYcGByqGSM49AgEwggF6AgEBMEUGByqGSM49AQECOgthcsnViAAA AAAAAAAAAAAAAAAAAAAAAAAAAEdshQ7mkmMLkJZUVU4Ol915g3uKHPNUo9AwD+x4 7PkweAQ6Cjd97ea1IzM9NseOmw6qO/SM6TBB9tT8NAFNCPaDOAdJje7dQpAQHFhm 6N+1iUhdEzV7nnjC1/vp/gQ6CprPjIumF3d+JIUJvLRxfU2zRiAr+eNSzVYzcx3Z KlG3Kk3Ds9F8gj/Mj72k2gjyXeqJBGCHNCWVpwR1BAgVI9A9TxLNAoed6kv2pPOn 3ybtiI8QxbIjWhJ0w4ai8hgwDe5u0heEEWRTO83JA/B6CW+fv07pW6wJihEfKW9Y MP5cNbPjRNXfOiJWmF9k++bQ7cxMYdGL72gd05nfPQGUxaQxXgEuAkXs6lY2W6qe i+H3AjoLYXLJ1YgAAAAAAAAAAAAAAAAAAAAAAAAAAABHbIeQSOXYXqco7S6hwduS xOT5ZSNk/c26d1X6bDYvAgEBBEEwPwIBAQQ6CQZ+cOjNmFKHK7JoXGdAPByb7XfI kTIoUEiQxOiDRUH9pUqf0lpcCHhjtTb9hQZ1RGYrjqsccdL6ng== -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/ecc/root2_SHA256.cer000066400000000000000000000033761322470703100214210ustar00rootroot000000000000000‚{0‚ 0 *†HÎ=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220093442Z 280820225031Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0‚30ì*†HÎ=0à0,*†HÎ=!©ûWۡ>f ƒrn;ö#Õ& ( HnSw0D }Z uü,0Wîöu0Azÿçû€UÁ&Ü\léJKDó0µÙ &Ü\léJKDó0µÙ»×|¿•„)\÷áÎkÌÜÿŒ¶A‹Ò®¹Ë~WË,KH/ü·¯¹Þ'áã½#Â:DS½šÎ2bT~ø5ÃÚÄý—øFaÉÂwE-íŽT\TÇ/i—!©ûWۡ>f ƒqŒ9z£µa¦÷‚—HV§BW„·q>D\¢R„.86œÌ4Žþ`ebdÖíõ–‡ãþ bŒÕÆ0êÆÊ©Yé(ݵe Faƒä×tHÍþ¥ÿV.£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U¦¬dÅI¨BÚ™~bà 3—å»0U#0€¦¬dÅI¨BÚ™~bà 3—å»0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20080220093442Z20280620225031Z0 *†HÎ=H0E!©›§ýKªÈÜYÝé”ìA†$C|¾Ëë´ò«¨€h»K E‹€áqsˆ¤ Sã’z‡8=³T £2mº t$½ˆjn 0‚{0‚ 0 *†HÎ=0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0 080220093442Z 280820225031Z0M1 0 UDE1 0 U bund1 0 U bsi1 0U710U csca-germany0‚30ì*†HÎ=0à0,*†HÎ=!©ûWۡ>f ƒrn;ö#Õ& ( HnSw0D }Z uü,0Wîöu0Azÿçû€UÁ&Ü\léJKDó0µÙ &Ü\léJKDó0µÙ»×|¿•„)\÷áÎkÌÜÿŒ¶A‹Ò®¹Ë~WË,KH/ü·¯¹Þ'áã½#Â:DS½šÎ2bT~ø5ÃÚÄý—øFaÉÂwE-íŽT\TÇ/i—!©ûWۡ>f ƒqŒ9z£µa¦÷‚—HV§BW„·q>D\¢R„.86œÌ4Žþ`ebdÖíõ–‡ãþ bŒÕÆ0êÆÊ©Yé(ݵe Faƒä×tHÍþ¥ÿV.£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U¦¬dÅI¨BÚ™~bà 3—å»0U#0€¦¬dÅI¨BÚ™~bà 3—å»0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20080220093442Z20280620225031Z0 *†HÎ=H0E!©›§ýKªÈÜYÝé”ìA†$C|¾Ëë´ò«¨€h»K E‹€áqsˆ¤ Sã’z‡8=³T £2mº t$½ˆjn botan-2.4.0/src/tests/data/x509/ecc/root_SHA1.163.crt000066400000000000000000000015341322470703100215040ustar00rootroot000000000000000‚X0‚ £0 *†HÎ=0P1 0 UDE1 0 U bund1 0 U bsi1 0 U111110U csca-germany0 070717105430Z 280117094335Z0P1 0 UDE1 0 U bund1 0 U bsi1 0 U111110U csca-germany0‚0Ô*†HÎ=0È0(*†HÎ=×Á4ª&Cf†*0%uÑׇ°ŸW—Ú‰õ~ÈÀÿ0< "3«Lª…‘µÍ S{Acöã3†êqEq¬ÚÐLeb)ìI˨Q—"†J¯\å<©¥õO²¡‹9Y1­iNL±ÝåSþºîïH–²ÀSXW}hwŠœ/^ºè>ß#}ÄýÅuËŠ.®¦kw2¦ŠÇ".×Á4ª&Cf†*0%uÒV Ð·„†ñÂ~j••Í:‹]O¹½É-gúÜæª&\*X4H½ŒŒ öob%N©vä‹ßq?¤PyÒwb•ÀÊ\a|¹å£‚0‚ 06U/0-csca-germany@bsi.bund.de†fax:+4922895827220Uÿ0U“ؼ“v¯¢E‘š‚MSû.Q+0U#0€“ؼ“v¯¢E‘š‚MSû.Q+0AU :0806 0)0'+http://www.bsi.bund.de/csca0Uÿ0ÿ0+U$0"€20070717105430Z20271117094335Z0 *†HÎ=@0=…Ì©maÍâØs‡´[ëÁØ{l:©¶wy%a¿C…ÂìýÜð$Á³C >yăÜŨôÇ• abotan-2.4.0/src/tests/data/x509/ecc/withdompar_private.pkcs8.pem000066400000000000000000000002751322470703100243660ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MGACAQAwGAYHKoZIzj0CAQYNKwYBBAHAbQMBAgkAIQRBMD8CAQEEOgG97/hDkXbJ tgF36JmM7NliJIlDFzTm69KYouwhjPOsh6hKo5NPTtsmHafplOqpUf0TyAhB1Q88 3xA= -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/extended/000077500000000000000000000000001322470703100177665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/extended/01/000077500000000000000000000000001322470703100202065ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/extended/01/end.crt000066400000000000000000000021371322470703100214710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAbMQswCQYDVQQGEwJERTEM MAoGA1UEAxMDSW50MB4XDTE3MDMzMTIwMzYwMFoXDTE4MDMzMTIwMzYwMFowGjEL MAkGA1UEBhMCREUxCzAJBgNVBAMTAkVFMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAt3ZPYYEIMIAViK68jKugGUMIISV4X7JjUz3/k44E2E2ovPem7mhq JPOzKpaS9+AOzEIJQIT+a6Re4+DmUNvW9Zm6P2J4Lrc8ixoCejMSwrtyqCCTJ+ef i6o82d0Tgge4ZnudiIzozUJy1rAS5T+rV6re3SUdKdjgLkva735Bve67/gS9eh5L AIQpN8ZPa4+qzbwfGZe3PGgOV2701LzQCrVRe7KWpm1ZjOi5WTRh0xAHiC6WpM2F eF0aRkC18Sat3FTi0ba2cqikttPnghFhShLUyUvn/LrLsk/ajGaArbV88Hk+p8l/ pXhNh1X0zftxS/Fa1QCFbb4OxQMSmGZgMwIDAQABo1wwWjAMBgNVHRMBAf8EAjAA MB0GA1UdDgQWBBRH3e2M6wVjMMj76gDRe1/q5KkFwDALBgNVHQ8EBAMCBLAwHgYJ YIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEA TF2AdhF57cBnjmeiv+HKKgjybWvA2X14k+rdRasNg87oJ/v2Kf/llJkUu2vs44tQ 8HrmET6nq+0dPdJL4SsgyYqCW82hGh0W1saSFyCq+Wbk4DSFbHopOxlbbgX4GUJ/ wfRY6BVRhz3IdPR4TM0zJ4o3nk+OTfBi+3ckfaK5DYNsnYbZwoG92ISMSRHGmg6g UYXOVmHmzIFK0ESl8+om2VsbWPRUCBOtU1BJLYwpx4RyIBBYPHR4npu+OpNrcBzR MaZuHuoKbqvZlvCclbd37YffyWryOGEf+YcjQPy8BqFMUQBBRH9gW4Ph819UYFpb IozFU/jYzXzXoxG4hMqtHA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/01/int.crt000066400000000000000000000020721322470703100215130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC8TCCAdmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAcMQswCQYDVQQGEwJERTEN MAsGA1UEAxMEUm9vdDAeFw0xNzAzMzEyMDM1MDBaFw0yNzAzMzEyMDM1MDBaMBsx CzAJBgNVBAYTAkRFMQwwCgYDVQQDEwNJbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQC7vyhLG+LWNHi/7MdX971HRqc8TD0aSG4nbclEeV+mGPRhdbVD A+ZQn8Bj26iqRMJ8WT6+/M1rycOaAcEsfGSjPCSqrBuyo973nqMgiTfCgucFYtj/ jkUArJQ8yuNJkLXkQK+4S0iSA1h7nPLwC967qPKcJnQgeHJDjKU9AefXoda66zxO kbaX4y5oY346tWP/0pjDeo2zix15jajPrAvCtDFJrYni71ixFNHZRI159cscSvfR I2lNnkUJ/M/6UnwflYgin7N/DHk/oad96bXatuKmdCWA/5R4FAnAhwdL7sbTy4LL jV8amewEhSn51iSFqVIm6wO7NiZw8D3/603TAgMBAAGjPzA9MA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHs9prehJUV7V9rn0KlYPmZqzRXXMAsGA1UdDwQEAwIB BjANBgkqhkiG9w0BAQsFAAOCAQEADsKaZEuxy9upg0HTxWy2RfY8im+Xg5qkU2IW +vSFr1QoZWVn59y3WzeoBqi9dFquQyUjTvPUHJoplh9CvHWZbL0ih/NUt70uy/Jz kyacpcFEbiAZD6sPCe6JwOSrEAEnTRDpP2Gn6gRxVOXGptMFpX54yxf4shZJnyy/ r1iY11WQGy4qJS+20eUj4CxqletBzKfMiar9oX9sJl/Go1KzZexnIqli2v1/KevX 6PRc+ubmz4aZzkRzP9v0Ie8YxJmjY5LLnhjY/G2GV8I6p8y5UqYkYRPvGJXB5WAi 1b6uvuEhgatAelk1mn95Pv7W8ASLWbbV4OippdZUdOCkxs/D+w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/01/root.crt000066400000000000000000000020761322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC9TCCAd2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAcMQswCQYDVQQGEwJERTEN MAsGA1UEAxMEUm9vdDAeFw0xNzAzMzEyMDMzMDBaFw0yNzAzMzEyMDMzMDBaMBwx CzAJBgNVBAYTAkRFMQ0wCwYDVQQDEwRSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA86tiSCsS6wRGe/iylnLS3WnxcWM/x8qrQZQ5JAaB7LMR6Dfp DSBk9vU4/h0CbYVr9+7an3dEDA6Raoh+qLDklspqDQ5cXlYee8GMutQbSTxtKA+4 fgIrT18JyBu993IBszwj01BVD+Ibun+Bw/pg7dYD3w+T60njMb4EirU5/0e1CKxB iv5UEY7R6DkIU4QXHzvj0Dstls5XTsIAODuh4IEwsnMq9ZQi7Cl4AflUABAY0w6B nEhbb3wMmg1ndDnv9RcOP3IQzIFuQG3i8SdH1Rik/00N9Mom7sRCulrPhZoNFbTV tQ9PZ8iQPUNzJNrIkWZ/O9uN023wtbiGlgSytQIDAQABo0IwQDASBgNVHRMBAf8E CDAGAQH/AgEBMB0GA1UdDgQWBBRfG0Pzn9XuCESFgLCJOWpwAC/XFDALBgNVHQ8E BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAH2RqhCbx3SjljbbqPq8dxUccLvtIf/S oxPn7ogdG3WuwfCQzXJ7v0HwcLTytF+/zYYgPTip9RmQdVqym9YjlDAG5NlFQm3b jYZQ0gUrG56tb57K1YjQcrUU15ewbILZU0N0gfs+p1PMUkFsVVsPienO7j0aRKmB U6Ecgma8kS/++QvlFlgXE+shdzXjN92nuqHeJ8aNaPb7ueD6b82+LK8ZuCPPtHUN EdCzKWYlHzMKklLVbfzXbHG5yiiim9OaFqsY+7ljWJiT//s5bbGRJjBb2GCSwVvI wOubEvVrJ02l7U69LxaHsXXRlKw3vq1Z3HbKAIJlWMIPvaFQKnY9RdI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/02/000077500000000000000000000000001322470703100202075ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/extended/02/end.crt000066400000000000000000000022341322470703100214700ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDOzCCAiOgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgSW50MSBDQTAeFw0xNzA1MTcxMjQyMDBaFw0xODA1MTcxMjQyMDBa MBoxGDAWBgNVBAMTD1BhdGhMZW4gVGVzdCBFRTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAMrhTUs/sAT4S2JMYFh8Z7bSzgQLqt3l+cAW1mgiw3ydh0+L aytLRmyJrX0K6B2zEZKilbPXPJW2O1fY5lIvrYz0HGJRcQWRhZ9IaAqkWNSrIGR6 bCodpDH/Lr3nUuvsaLobFs+e+YLdXu1TwQMBieIi5eXuwaPIpcGi8Byl2iBsS9UT CYDj08rwOwF8f/zgWJK/2to2TraHTHw+rjlOL5MEXxjLC50ZnKaAzw4K49mnRv8U exzs67250Sa0ZONB3nh1/Z+FBNIsdXcNDoMtn04/sk1F/TF3f8jA3h+HOvfGrE6O dqJ6DJK4UD/RqfRiD0+6Spcx+eu2rR2ss9ISKJ8CAwEAAaOBhjCBgzAMBgNVHRMB Af8EAjAAMB0GA1UdDgQWBBTrUJdF9MaI2YaBus2Teo09rq/YEDBHBgNVHSMEQDA+ gBRBtmp9tx8Q7LqmvCh8n9jxgmLcsqEjpCEwHzEdMBsGA1UEAxMUUGF0aExlbiBU ZXN0IEludDEgQ0GCAQMwCwYDVR0PBAQDAgXgMA0GCSqGSIb3DQEBCwUAA4IBAQBA q9bK4nMz0H2vLmSfiqbNB7chjKztAzQkD1YZTDmyuDVFXNu6ooClWOIOAPj0/XrL s2LHz0KodS4QkEStoK8lsFDmo6lNCKVkGsSNUUwmWa2P43EpmzZdVSd0tk/BSA0O dPifwTncW9hsseHoe5G29ddLdnRE9MH/5rrLOMFPSa0wHOXNqbt6wAANTwrBY+QV xFQSmkBiICqJqCpcqe7gH/x9lgNYdQxBCnR6pitj6uxmOLl40qzfVfzKQe8hovyA piOjaYJ4i4j7xl3nlsw4CjaRitpDwLXjL8LQfdoOD/FWj18+DFcH59azqBjoyr6x OtnVSv2VDcvcvhNHiqCy -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/02/int1-2.crt000066400000000000000000000022541322470703100217360ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDRjCCAi6gAwIBAgIBAzANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgSW50MSBDQTAeFw0xNzA1MTcxMjQxMDBaFw0yNzA1MTcxMjQxMDBa MB8xHTAbBgNVBAMTFFBhdGhMZW4gVGVzdCBJbnQxIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAoQGuLP6gafHVnoyFbtTVBV+Svc6TwG6nBLWMj5oI csWF5815WuDKJCIef0FzT81ew2PqxJKqvwu68+IW6v5EmIMO99fig80/o/IVWwuv /ycRIth4UJsEpg25QUiFwBcmeJ3Hhjrf+2cPqKLT7dCiz+FJY6fXQdpo8vtJVMSa 8u5oA0NoSYnVnRrT8mDP2io1egWkwdFjn4JLZ99UYVBCEi/Pp3DNhtkn3rwaIm6v SGxKxtgHWqTmldeCB+k7YVOPOYLbAlhNknpXFiU4Op0hEFMtgnUXGH5s2bJNM0sS VOBG78UIfRPxumkPYelzPCUsYbRJ7PulybtNdtWFPtlDewIDAQABo4GMMIGJMBIG A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEG2an23HxDsuqa8KHyf2PGCYtyy MEcGA1UdIwRAMD6AFNtU+/YoX0TQdnd50WtkXsyilRoGoSOkITAfMR0wGwYDVQQD ExRQYXRoTGVuIFRlc3QgUm9vdCBDQYIBAjALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN AQELBQADggEBAKWTS0/h4bDNbBQaELSMbYyyNw+WQKRJKRawoC9d89JywD/1xjM2 byCySAOdsuWX5t8PuDIHjLu4vykF792Cpx3ToWztHTPYkpg/Ci25H4Vvhbdlb62X h712cQ0hEdrNC5Uahl3jUpYfdktF8un3fp33yazlF2PHswWtgFBpU3u0GZi4R7ft CsY1XzzxaEjBwfu8vDLf/kkdJBpXh97rkGhfogNSJ4+EAlqbJ+rTj1ucW7ou9M9d vvIHAx1lJWERoSDUDOIigpJaHSs2kIvF1/+pCW7pJiZ2EwD5S0Kj0m+6Evic/Vo0 6Ff9EE6WPEMY4p3ykFc6+TIOj8Xbw03VFWI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/02/int1.crt000066400000000000000000000022541322470703100215770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDRjCCAi6gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgUm9vdCBDQTAeFw0xNzA1MTcxMjQxMDBaFw0yNzA1MTcxMjQxMDBa MB8xHTAbBgNVBAMTFFBhdGhMZW4gVGVzdCBJbnQxIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAvcX2nM3+B9OTzmVbl80c6rBnoCCINvrsRNEqPET5 zF5NSGZzJJo3GF9iZCov4rLSWIgyHqekWIbs5JximdIc5JaNkEeic6RYU4u+5GFI ki2qXfNiqIPgxAO2F8/7W0nXa5B+2kH8d62m2um8ONY6f1NkBM+bTLgMb78K3js4 eftYjRVd3EFzBEiIVKj3VyGRtbiNWZCRbT7/X4tCjYVwjFZejbyZkQJv5qhbWv0X Il/6gNbvN5P1Iumy5yBfKwonJiYyLv3DZME5sexzAJa7OxNEwJApuY+93soA0iLd 1WyzNpeL4hzNvpYUi5YuiLjA5oHLPmFYN96wKUAP9yWhfwIDAQABo4GMMIGJMBIG A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFNtU+/YoX0TQdnd50WtkXsyilRoG MEcGA1UdIwRAMD6AFOphOYxY6kM+m0UT5FTvNLzki+2HoSOkITAfMR0wGwYDVQQD ExRQYXRoTGVuIFRlc3QgUm9vdCBDQYIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN AQELBQADggEBAHyi1KRBgrpu/bxiioRchfZN9AtVS2qeohA0WkDZbdbgI5j/sqgy IfVVQizBJVeTfFuv6C2davHnnpoDUTYwY4tiQz4ZJtTm2zLmUw3ennujlLJeBP5O ykjcU7lxAmf6vAdMvqRuIHvx/nYgE2G3T6sx7Doa5kdruCHosLvuUU6sP0cQjxsH x0gbDTvE+DjIjrSlCAVBwNB0zcOHG0A/fV2SEHy4Pi/JthEvXExngXnNMFlPEA58 1FL8M0bpxW3M2tchFoGhTrSDt4hkYqsV1kGK8zXgqT9PxyaSE9lvNjBVtGNbt+9Q jMbhRokpXaUALVxpHN5gC2YOO9yYD40EPUU= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/02/root.crt000066400000000000000000000022541322470703100217070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDRjCCAi6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgUm9vdCBDQTAeFw0xNzA1MTcxMjM5MDBaFw0yNzA1MTcxMjM5MDBa MB8xHTAbBgNVBAMTFFBhdGhMZW4gVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAwGl+aRGnJVyfSZlnoD+r9R8KjsJE6aduNtmDrTxE XkKceCfcqDyCVyF7jufmxrLnSEHEz4cx3hMGkG3SrsWmpzoIrSbvLliJs8uopBHv yojTRoCMHP6BQeRIFl/Z9g0NMpP+wC2a2pLL6Notsc2WCMbZOelx8JpyZDgHMmgg JiHydtTf5jw6U8O/KRoAJcd8cNMnWHb+ibwZ621WpFk38C9RA95lNhF3GoAKRAxb 4VV0b1UXDfWEo2ame7PHJv2COv4ufWfMVn011nrUYU8AuzJX+mZj3dFqbvri9rB1 KVzYkZkhf+ih3BMbH/ZZn18LU3IDwkLubYpE9Vnd75DxsQIDAQABo4GMMIGJMBIG A1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFOphOYxY6kM+m0UT5FTvNLzki+2H MEcGA1UdIwRAMD6AFOphOYxY6kM+m0UT5FTvNLzki+2HoSOkITAfMR0wGwYDVQQD ExRQYXRoTGVuIFRlc3QgUm9vdCBDQYIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN AQELBQADggEBAHAIh/0/urh5Z5uY0D5XtGQ5ZVHSGb23i15mVFDQafMy1G5wsKRx /cO/Gg7U0TuAl8mxvOlJtLCIC/1RybRegmhkzsxWZVaavxlZvRW+mpquJBA32+Qn Tc8tdYftICzgowdCl0m2RlZJXDOc6//8LUqcIsz85XOeBjMMRSrkGIJU/Iq4xSyd zIqH+iilsP5r9MzBWCtwWFzy/noZAtl9aaHFtCPVTAE6L4rXxPEKFJ65nQdSl2pN 4KqR6JImoGLoat87sVDjs4GJdbcyx6GSo8Qgj7cbxGkkD87jfPeqFMCJlf0bkTxX xgbGs+HNsuzjl5bfZtCFLDYVGrJ+TlFTn/s= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/03/000077500000000000000000000000001322470703100202105ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/extended/03/end.crt000066400000000000000000000022501322470703100214670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgIBBDANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgSW50MSBDQTAeFw0xNzA1MTcxMjQ2MDBaFw0yNzA1MTcxMjQ2MDBa MB8xHTAbBgNVBAMTFFBhdGhMZW4gVGVzdCBJbnQyIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAoQGuLP6gafHVnoyFbtTVBV+Svc6TwG6nBLWMj5oI csWF5815WuDKJCIef0FzT81ew2PqxJKqvwu68+IW6v5EmIMO99fig80/o/IVWwuv /ycRIth4UJsEpg25QUiFwBcmeJ3Hhjrf+2cPqKLT7dCiz+FJY6fXQdpo8vtJVMSa 8u5oA0NoSYnVnRrT8mDP2io1egWkwdFjn4JLZ99UYVBCEi/Pp3DNhtkn3rwaIm6v SGxKxtgHWqTmldeCB+k7YVOPOYLbAlhNknpXFiU4Op0hEFMtgnUXGH5s2bJNM0sS VOBG78UIfRPxumkPYelzPCUsYbRJ7PulybtNdtWFPtlDewIDAQABo4GJMIGGMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEG2an23HxDsuqa8KHyf2PGCYtyyMEcG A1UdIwRAMD6AFNtU+/YoX0TQdnd50WtkXsyilRoGoSOkITAfMR0wGwYDVQQDExRQ YXRoTGVuIFRlc3QgUm9vdCBDQYIBAzALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEL BQADggEBAJMJUlCtT9OCt6G/jNRcZrsxprlVvGBpLItHF6Kol+gs/Pz93c3rLxj6 czp2OqjZFsm6k0Fl6kSrBQHRH/dZdKZlsNtMnrF0RXonuJVBaSONKC6SFOc4E9qa nNfx/AB40IGdhKbgHNS/92Q4kIwV2JfbQPXTmOvFTtFH/saUoTmlMWaBIeEEjQX2 /NjyCvSUvKVwAgTF/HWspzjuEVukiCszVOQV8UuhEnLSdvztuguf0CkM93W17x7t //R04hz+TOLCAp5OzeZB4y4UE+oroo1ynzdTnQ7PHMxh67+mX2piawc00zyHqqTf 09z9uN4HmyJNQ4FXUvhC0Q+tISCaB68= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/03/int1.crt000066400000000000000000000022501322470703100215740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDQzCCAiugAwIBAgIBAzANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgUm9vdCBDQTAeFw0xNzA1MTcxMjQ1MDBaFw0yNzA1MTcxMjQ1MDBa MB8xHTAbBgNVBAMTFFBhdGhMZW4gVGVzdCBJbnQxIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAvcX2nM3+B9OTzmVbl80c6rBnoCCINvrsRNEqPET5 zF5NSGZzJJo3GF9iZCov4rLSWIgyHqekWIbs5JximdIc5JaNkEeic6RYU4u+5GFI ki2qXfNiqIPgxAO2F8/7W0nXa5B+2kH8d62m2um8ONY6f1NkBM+bTLgMb78K3js4 eftYjRVd3EFzBEiIVKj3VyGRtbiNWZCRbT7/X4tCjYVwjFZejbyZkQJv5qhbWv0X Il/6gNbvN5P1Iumy5yBfKwonJiYyLv3DZME5sexzAJa7OxNEwJApuY+93soA0iLd 1WyzNpeL4hzNvpYUi5YuiLjA5oHLPmFYN96wKUAP9yWhfwIDAQABo4GJMIGGMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNtU+/YoX0TQdnd50WtkXsyilRoGMEcG A1UdIwRAMD6AFOphOYxY6kM+m0UT5FTvNLzki+2HoSOkITAfMR0wGwYDVQQDExRQ YXRoTGVuIFRlc3QgUm9vdCBDQYIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEL BQADggEBAK+euvQn4INuV1Dy12Vf8MYQQgFptU+ysBI8pXHxVjrR3VSk+LlNNwQ3 50bKF/fNOb9YjosBYnPf/oL1O6yUEN+lNfsDwDK7P42poiUy4x+1oRua9AVYFKdP LTDhyfK/LQNMG3UizZLU7UwHZDTGpzeozUQB8yRIIJpnBw3hkD3ZK1GUGHiGPCN7 A3f/D6sCRU3K9JIGrPjx8Nfuh9OEMsVDMCE2rGyhNz24EajFZoX+4C6lxzwDHMqR l7dW7TeplPalUHlpp1o+rJiJVxXTuL1cJr6jqmM1Uzbm/d/b2kwDyyX5xmTQBJ2g MqKPmIPvcEEsfuzOZCDb2HhSiaUI39M= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/03/root.crt000066400000000000000000000022541322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDRjCCAi6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDExRQYXRo TGVuIFRlc3QgUm9vdCBDQTAeFw0xNzA1MTcxMjM5MDBaFw0yNzA1MTcxMjM5MDBa MB8xHTAbBgNVBAMTFFBhdGhMZW4gVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAwGl+aRGnJVyfSZlnoD+r9R8KjsJE6aduNtmDrTxE XkKceCfcqDyCVyF7jufmxrLnSEHEz4cx3hMGkG3SrsWmpzoIrSbvLliJs8uopBHv yojTRoCMHP6BQeRIFl/Z9g0NMpP+wC2a2pLL6Notsc2WCMbZOelx8JpyZDgHMmgg JiHydtTf5jw6U8O/KRoAJcd8cNMnWHb+ibwZ621WpFk38C9RA95lNhF3GoAKRAxb 4VV0b1UXDfWEo2ame7PHJv2COv4ufWfMVn011nrUYU8AuzJX+mZj3dFqbvri9rB1 KVzYkZkhf+ih3BMbH/ZZn18LU3IDwkLubYpE9Vnd75DxsQIDAQABo4GMMIGJMBIG A1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFOphOYxY6kM+m0UT5FTvNLzki+2H MEcGA1UdIwRAMD6AFOphOYxY6kM+m0UT5FTvNLzki+2HoSOkITAfMR0wGwYDVQQD ExRQYXRoTGVuIFRlc3QgUm9vdCBDQYIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN AQELBQADggEBAHAIh/0/urh5Z5uY0D5XtGQ5ZVHSGb23i15mVFDQafMy1G5wsKRx /cO/Gg7U0TuAl8mxvOlJtLCIC/1RybRegmhkzsxWZVaavxlZvRW+mpquJBA32+Qn Tc8tdYftICzgowdCl0m2RlZJXDOc6//8LUqcIsz85XOeBjMMRSrkGIJU/Iq4xSyd zIqH+iilsP5r9MzBWCtwWFzy/noZAtl9aaHFtCPVTAE6L4rXxPEKFJ65nQdSl2pN 4KqR6JImoGLoat87sVDjs4GJdbcyx6GSo8Qgj7cbxGkkD87jfPeqFMCJlf0bkTxX xgbGs+HNsuzjl5bfZtCFLDYVGrJ+TlFTn/s= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/extended/expected.txt000066400000000000000000000000431322470703100223250ustar00rootroot0000000000000001:Verified 02:Verified 03:Verifiedbotan-2.4.0/src/tests/data/x509/misc/000077500000000000000000000000001322470703100171215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/misc/cert_seq.der000066400000000000000000000023671322470703100214320ustar00rootroot000000000000000‚ó0‚}0‚æ E0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.020Ÿ0  *†H†÷ 0‰¤AÑ;çgSkû¶ª@ÙŸq &4· †JÔ¾ÔfÔ ka'•éfæò$†;Ý'±{Y›:¢-–|ȼIý80‚n0‚× F0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.020Ÿ0  *†H†÷ 0‰Ðp“ÖuŸ{í@1è ©]ÏSàÅýOÓ·¢ÛµHy|Hõmyyy¿jªÊ‰xT,¨ßê5å"Ùð-­DYîm6¬Â¿gu0s¤[“(öhŒéŸ,(\ía—ÅÈ`b4LM=2iEéëH£î/þª.ú—šóOÄVý‚4Çý¬ìüÇM£:080Uÿà0U [_ÁD&ÞÝÍ0U# 0 €¡2••Ÿ 0  *†H†÷ <˜6â®ð OV\E-Èh{»q†LÀ¦EL ŸFù筡ß@™K«§t+ ÃÉ«LÐPálÁvØ(JAžZÜ'°ẗ¡ó2ˆ¨Õ…Î`XAéÐH»k"ºÕËVz§Û=è(;ÿE2O€‘“®ùî—f£–ÛH)Áa nxi´ìwë(@¶÷G­€z±‰Íð×yN;Ì0…oMZ`ÂæÄXEKüRÃ÷§ƒ$ÈßiWbÞžËÈý<€`Ú×á4Åêû¥@òÍ{›l_ ³d0¾„”˜i‚innV”’jÎzÇ-˜ÃBqJ¬!¡>„¾ „Ú/Á\¹ˆYH€b†)³ƒ “ÞþÕO¢fhcäÇ”˜o›Éü—C‰aDÑ?\€± ‘Dbotan-2.4.0/src/tests/data/x509/misc/opcuactt_ca.pem000066400000000000000000000032501322470703100221110ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMAXkiTXQ8mQnY n+99br/MU9dRvUzliOZRu0owQnAgTtH2Rl+Q9icXQyhcowaiCv6DFrvPlR1MKMux kJngiOYLI10gLgXjiO4pd53IPNa60+6j4Xgobl7lfCGnSwbYVE8OYl0MyjfrC8Ca OmbYYVLvgBSW2fPyBHrucCBTB+f4FT+Wuu473hmNHrRx8WT9H9GjRcUQ+RkDqI8S 1ydcQdGu6BWTHCvvRtdxvDk+4WzBdtgoSkGeFBZa3BAnsHTMiKHzMogeqNUGPHVJ hBobqxLha1ztkRvaIByuidNN1lZAhnonkFNU5QAykPqSAaem1RwPi6xA5VQUxCoz LmZBvubHAgMBAAECggEBAJtOM82tcWQAjcJgX436FgGTgkQz/KpxggWOs3fx3DJ8 TtNR18cf3bqT4dJEOfR6si9Ry0DIoDkuhYN0NfD9x0OLdIXfA5So1cazzWZ3CnHI jdAtAbCl9ZB245fcQiXGaTjmIThvagqCM+o1s73euaiitQnyewgv6PZEXhdX2Xy+ Mqm1gXi0edyegSdjVRYd1vfx0S52R1TfoLWUy471VlOsKTo+ukUARryB36VA8iNh 0Wn2419zMyjt1ocOIU0RGFFag7wjZ7rGhv+p9Bb92gBrKkbC/2UWgJRpO4OZ17zX R3AajPW30e4iUYgFqvDpEhi48N9G7zAxia1FWF0VR8ECgYEA/KVK6trcbxy8Ohqd hBQUkElCAnBvkIY+OStAieLMppVEvQfMgTWiOCzub4hiGKkPZUK9ibmQgDzcXbZy bB1cXVK6nwAEfABTYzifu2ADJCDOBd3B1PXW2waLHuMVI0CEnySmADDUJ5+LmZm/ um6j4iGcJIGZjGNVMQTdTampcs8CgYEAzrbcOMBaQZMW5fDD21x/tGwiNmyIBpNC M865xHjRHFvGdVkWoIvm2wLV5O7AZMzqc5h6sOxCTj2E4dlWnshn0pTBR48epyXl cv287G2czafQsttyEJq83InV3JlwycyOy2/EJOCuL/T2O8nGJlNTTUEQbC6Udu8v /r/HGkO9qokCgYB0LaqCzzwY2FTyPzT5/KXsJ9Pz/TJAeor4jRwzjBjh7bhbWM/B ByHexUKsBUJe5rdOsF8qiyuY3OPVMEXz05iazaVF4qMtRpUSBoLljmRDY9Z5uh0d SiOQOrUU8gXRXSTfbeHsKogU5Hg0nRAesiwom54K55HtjewqC3uc8A0c3wKBgQDC XNNiFRKIN7o/CAvQFQAKb+YXUCLyM8H6nnSzFHph9LT8n4CUAhdVdCwTrp196eLE P+mUswCBOnzYMpesgniEWtQE6cADn7FHVuctUr8t641irs1oaWYM4xkP68JOLCVT iUpe9lcxxl1DyCuk25ImwHelkIKN9cYl/MJDotASKQKBgFMX48y7qyqYTZUnXHza g8yVwpU3DaynPNd7IHwC2/Nj1jZW79Tg8YHzKxujvHSByyqt7UOY8oMTdywzqAh5 JH3Z9JfPKFTp18cNk8Z0vhPnNV5lQPPXKaWsW7YW62AuDYTX/CwL9+Z+sCIQ/WBz MMcuPWIKk0t5acScslBtLdk3 -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/misc/rsa_key.pem000066400000000000000000000046641322470703100212730ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIG/AIBADANBgkqhkiG9w0BAQEFAASCBuYwggbiAgEAAoIBgQDdQRpj4Rbm/cHf ep44Aqwo88WiF74nzzu3A/Ebj2bs/ATjOMEAzlWa4m6WzI1QJgtkizGfRTjOJVQ0 fAQnkHNa5tKJk4HOTGzDJC1p4/VIU615gocdOKAwjBflxDCcGAkI5iDKffskYl7n /0c9GmfCQmG13qbFGJXbQDSPoXyYcngNxfCIL90dIL/9/B/PCu9OGDcqKYCTAVTj FFLlliGNTT5tmjasrgdpGJF1cN+V94OoRznwiNCRgNzvpgAxYfoED7BVTUzjcq/E 2dRHPDYdAO/kN8Tk1q/U71A8aAK4x3pAuprj1ujfAqPbTLkDlT6IfxGwG05Avxeh Kqyk3tP0NnAjh6pg/bYAXoM9l32O68T0WKRBQFoUFMhg88qJm8o1CEvudr8VVZ/8 i3S6VekQ8BFTJUN3P0qO7TINFha88OnUqBFGMRJBvXEyFXtHk4IOt0BTQB+e9/ku diMduz8ekpVzmjrAPF5TP4cJrT7v3013Z4ECrdhCBAPl65t+rqUCAwEAAQKCAYBL 9r89zZlUY4l91haeemRrhw6y0V4LQv5onqTYZorbEMgIz4KMaUtA6z827TITc4xz z8qQuW6AcJaRkobGorTIX/mnHIrzro+lDDW/ZnHfjENCNct3/+oX4PGPhKV/4kyv znsxqsFgQ5n8I0xtMTSwoKP1kmVFxGQnK8sgCTzDBoIrkGs+Btju2ECyzi6JomJ5 OJ0wD6HCVzGy6VZw1vPcFMo7TTg6X2HR9opyfPd3AM0mKJY+/GpHmqvAaAkm61EN Mc+bnLgTVVd8khOUrAgkWVjfiCTi+LV9kMQ3YXr9QxtgmmsteW0s8ZTD//JRNR8w fB2y7mkQHR51YN7nfJ9JvpqrEJ6Qr3uUTtVjlI0GCr2oizL0VZdugMlkv8y16pZU zsI+wNJsis92Sq7KCWc6l1iyKCfJDPig0+hbHkQnNI6NlZfYcbotZ4RhVtjijpDn 95dhA1wK2iGjW/L8lAlfiYTuM4IJ0vrVvzbZGT4hwgmRpamp0qHCqWUgySzFZD0C gcEA5iuI/sqtf15DtAi5TWLs4ABKcrwu/ic/AD8hxqZautXzylxHeo9Scq0N9R+l SQcwucss29gRRoXZwKn5i0MTjTTLwX3SWC3rlNdadIwGvk59x7qBgEXjzeWCJe+D HXGPnLaoUwLsyflHaLHcF4V2XoeY5t0/qG5zQ0/BVtedFpheK/KqZo8cfWG4cbZ5 0GZDxLyDBsGv4ayDju/aL/VQiGxLF3BHr7rGdAikcF99Smc4umw84APjAfqTU4qV nfBLAoHBAPYVbk32UlfskdEEnrRzqpnEaZa+PX+Wzb7xfVBuW+dY25Q8cmGjfF1x uY9teu4ia6D/Ke8lWaRnG71PICiTLPi0eg1JL3Qzgm1SJQmZoK0wL00xRbizbMu6 hZ5cYR2Z/CnVS9k4CClfyConSmuh3dBhcoYZGH1J/WZvvz+4TMipvIupJ68LkXO+ DtJ4Qr5ksN0JUjhtZ3FoCJm8+50+nHtJ/5d9yS5TarImAYHgfIpyNOTbMKnSkXfX Mzk2PPLmzwKBwDojgQUq2Mw1WVCea3/6nu6t5CA7HHuiGi3LxJJS7tQGuv/Ac2Wn 0iGZSM9D4RIjONGVWo1ldGel46zgwmHE3alrTpRfXcRcRQdhpj2OKR3k4ayTlaZ7 AOG/OTKv3ySOzMG++aGOOZWC2+C8HGXslkumYJ7f//Zhf8fe220+JTXR4uei8hvZ xk59YoOGnhpf2npVS5tnTS/pzYlLWIeIpYDwKb+P4uumd/5TOIYR+KnUjOW59V54 XNzhGFmfxc8RJQKBwBK16HAnFXW3+BJTbpm73bHZXEno5xYnajdldyjBa114xSFN Q0knPBKCziAYq+slVNel7xNO3LUCXfqT5JcRMa8rUchm0yPbssQLJePH+Y6Rhlcx MuLrSY9n/DbhQUUV6zVnEWBPwVccAEUsPZ1Xbl0ku6d0iwcjtA+w2XLH2Za8SSi5 UNofYAzT256nJDQDxerYhZbiwqW9ykGeO+dl1lINe1CScNSD5S3sc9rjLbT9IAZy oA2ZhBP/mdZ0yEeTwwKBwE5evNH1Ze56EJpO17fDs6shqECYsOCWWauFVHQinnrO +aO8ZnwOfLVy2AEAkusjadsmjMBM3NdFNK9L2mvdfFKOwZ/Cwrm2vnwh2kSFTksD I29WFj6jwBHNBE+dCYXraRjqIFrP9puKg2ECydp9g4ruxX4Kf6thpz1ML7GAnx/K xdVBeDJisyxk1g3WijkGfGne9bozZiWLo4jW96+qn2/0//jB8B5ORDIn8kS/TfFN ezTQp0HUwoiHK+bS2l+FQg== -----END PRIVATE KEY----- botan-2.4.0/src/tests/data/x509/name_constraint/000077500000000000000000000000001322470703100213525ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/name_constraint/Invalid_DN_Name_Constraint.crt000066400000000000000000000020621322470703100271770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC7DCCAdSgAwIBAgIBAzANBgkqhkiG9w0BAQUFADAiMSAwHgYDVQQDExdSb290 IEROIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDMxNjI1MDBaFw0xNzAzMDMxNjI1 MDBaMFExCzAJBgNVBAYTAkRFMQwwCgYDVQQIEwNOUlcxDzANBgNVBAcTBkJvY2h1 bTEjMCEGA1UEAxMaSW52YWxpZCBETiBOYW1lIENvbnN0cmFpbnQwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsHLRRWXgXFv0rpmrqjELvS8jrCjObZkML uWHpgJIev59IEXcf/WXQyMNSzSudFB2JKNatyEUxKshD5eGSHYTb5qNPfEBYEMC3 GCp+yXA3xKd1K7hnKOpdApTKN305K1ubZqkrY9SH2EdtMMfTqPIqTmG8VWtCtlOp svK6v8uwI17QdlC0pi39bkR/z2EZfZPkEHgB0rqK37FaWBgLoTsTEb0PL1aZkEYO Q8Wyvz7VieakIhDk/QMX22AEp8ig1LI99FvS8o4VOAYgjjCzIKWEos+p/hCYKrCe EpZ5GMI0O/13PCDaXRNywo20fhrV3Byzg57WSfsewnd/SztiY5t1AgMBAAEwDQYJ KoZIhvcNAQEFBQADggEBABZCqDTZdTy8KgOvpZCUaST52iAHIGFkqhi3XYF1gaj2 ADgMzonuttj+DAiYzS2wMts+TdrHFVuytmMsbIoWNXtRq/CAoQIg/tmpeb7AB5iS LGc5nxf+9nnCW276XmmA2cA8GCfbL0WDPZrfHRsw8jEAtyOP4bQEO3iqNcnQBK63 nP0fdCfqM9ImN0eVhxA04IkP8d6utC1CoIlDyqqike7+2o+PXCrWlmb/WeZD+Hym 4eJe8y5Q5YJ6G5F03Z1zuU5SVLKYJImdx1qiTXqUX2qBh4NKmVFgAImJOrbtj1qk //pH1Fb3w5xK9akaGcXYTTDUDZu1HM06LbAd0pwlRBI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Invalid_Email_Name_Constraint.crt000066400000000000000000000020521322470703100277240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC5zCCAc+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADAlMSMwIQYDVQQDExpSb290 IEVtYWlsIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDMxNjIxMDBaFw0xNzAzMDMx NjIxMDBaMCgxJjAkBgNVBAMTHUludmFsaWQgRW1haWwgTmFtZSBDb25zdHJhaW50 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApLQNwVt6i6aYP67ZyaAH u/uqKg7P6K9xocb/aSlnfj3A4ee5nmxi3xoCghuXKV4lSXIE68Rppak81dCG9Bou x8S5K2DZ20AX11Pk5ulMMZGaQdOPZEBbPIxSqPdWKHwSLtkLxw7F+KN1MdB5lCf0 YbXn4niqTF8eGrGEcfatYDFOYI5NVwlRHMqPoyv9JaJC68a/njhFV33DM/J1cTvM gIMbF8nnUKqfzyGwP1q5A2ep9DmH6LpOzpEzcp3d7DPCTAK7q64vSr/uOALt6Vsg LAHAOmberdVB/GUBCqa3F/eDo8s4lw+kdq5ow72hM1jSP7LeRb2OHcUJa3bl1cKj cQIDAQABox8wHTAbBgNVHREEFDASgRB0ZXN0QGV4YW1wbGUubmV0MA0GCSqGSIb3 DQEBBQUAA4IBAQBit9P5NiMg8jjBtoXTBwUHBFA/B/KdxXx2AFsS6rx2xb5m09WG joFvv2le+GixwKUHAyseTtYshO+s1HiCSHcnp7j5RfcjMdraJWrACKzmEqA6J+KM mSa4opop91JFEY7ydnNqGf9biJ1dxiAs8XQ+ldbMuFxYc5CrNG8uoNvWGFZRegGS rR3pLEHeG5waGVExBMzMSIA3k4qIeh1JsiXIorQGwLfSQEPkCVIbRw9dpUOWLmDK SIlnL86z+OZDQDScOuLdh9j5mNWNIS9GH+VH7H+f7l8F0y96IbFumzby8DdTZiXf MuLW1n9aD7h787KRc6ExRx4qw4uWMl0tXSmd -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Invalid_IP_Name_Constraint.crt000066400000000000000000000020221322470703100272020ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC1TCCAb2gAwIBAgIBAzANBgkqhkiG9w0BAQUFADAiMSAwHgYDVQQDExdSb290 IElQIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDkxMDUzMDBaFw0xNzAzMDkxMDUz MDBaMCUxIzAhBgNVBAMTGkludmFsaWQgSVAgTmFtZSBDb25zdHJhaW50MIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqPSMstg2PL5m4NlT2sVweNGmpRl1 2qZaV8VF01WweYdvE0DRw1aNzBzkbeIpbrVdvgxZIPeEOpusQQJPUtBuemMuKoNt O2zCEheILKwsESq3YhrXvpgs2679nK62Dfr4PbT1KUfsP4Kruf2cAuHsRO0hhT4i tZUcU6JCw5KDPihk+joALcZ4qdeKuAZHSopPlg5LFoRKb2mXDfm6j25bngMiysew XdCXeYCoL9+ROthrgz4H3t5mEcSAVS8dwqfjUIZznVlUwYfw5ThqIHJYWZHOOozr sgTicfiFKSje/XIGoHmgdrT6HI5ZOufKtXMgpco1vjdnnRuxG99ilYboPQIDAQAB oxMwETAPBgNVHREECDAGhwQKAAEDMA0GCSqGSIb3DQEBBQUAA4IBAQAi6yVuppWf kPQNWRjW45/6AB/yH9HPN46saVHHuGREaH4kxhmzrEBjS1CdbinvbtHm5SfN3qau eUWwabGvgvSBqxRxhV7HyagZTP1rfMDqjkQSICjOM24NJRBn+OxC87kxwtbi8z4d zcL4bULErtzZS70A8xuEemEt6LEBSOkrsDfN3sN2UJWQ5ifAgLELXr05FVHyt6Rf 8xzbu5uvO8nUfRNCYEkrzSAU6oREwYpbJkimpoLiykERRNd6hJmd2xxupBKL6Cf0 vXk/uaVeiHjchk4cFwpDPgK7PQJlWUb9HVEGjJQY/7STcVMl0Rk9NDmta6kW57q1 Y6gSmXgGZBt1 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Root_DNS_Name_Constraint.crt000066400000000000000000000023001322470703100266520ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIBATANBgkqhkiG9w0BAQUFADAjMSEwHwYDVQQDExhSb290 IEROUyBOYW1lIENvbnN0cmFpbnQwHhcNMTYwMzAzMTYzMzAwWhcNMjYwMzAzMTYz MzAwWjAjMSEwHwYDVQQDExhSb290IEROUyBOYW1lIENvbnN0cmFpbnQwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnc8QujqwM6w/QoC8fAEIXrWIf6+IV WznKMPwCqogoq1dw+9Url/4yhUqFNWZiPf7h8Cxm2oqLesq0LJ4IQcTrqwDfflZw dHiw9Tj6woks5YEq8k4cxDOVjJPftPOL+drVCMDQnpRctEtcNcbOmNFsCrWSGl7t bBvhWjARAfQvCfMTILkhJj6Bh3wHdxbxzy5m4rqQuG+gyAzEQBIPbhIYkrjhaFdx FUnPmk2uhYXDmpOuln2zuE1BKi/HqG1iytRgm0DfuayrqPKHustUhdcOQdJnxy/q 3wthcsP6i8YX5eeV332BDXPVijWHJ9AHilGITYfRssUwyoI+sxEZB035AgMBAAGj gZIwgY8wDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUcvuTsCu3ovZJQRVo6494 7kehuVUwCwYDVR0PBAQDAgEGMB0GA1UdHgEB/wQTMBGhDzANggtleGFtcGxlLmNv bTARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZp Y2F0ZTANBgkqhkiG9w0BAQUFAAOCAQEAB7JEZgAGO3jLaXWFUdV9k1nXvngKR/yV AKvr1KIl8f7azR6khnnIY/UpbYQJHSNCKt3J+DEmWzrI8/ayfDW1Ty7/2u+IT0iw P44TOFIFSN7q4x1nLiHN1PFZvNc8ENHpqSubqF2ooGWIakSbO1LrmHqVgPMkcMJk 5tUIcwmlCMOdFvy6ejVjw/l7aawAG+sOLTzjheYeKIngilejPthBhMxsniqVlzCY 5dTV+jplLzOqOANSyhzhlu0cywJbhifG+Vzq59raPzzk9tXEXKsi3qO0B7J+5Y9f fwIHNf8ZZ/4ODDBYS7BHAemgXcXrVMtJfwHQCjracE6RYx5NpzRU1g== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Root_DN_Name_Constraint.crt000066400000000000000000000023001322470703100265270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDVjCCAj6gAwIBAgIBATANBgkqhkiG9w0BAQUFADAiMSAwHgYDVQQDExdSb290 IEROIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDMxNjIzMDBaFw0yNjAzMDMxNjIz MDBaMCIxIDAeBgNVBAMTF1Jvb3QgRE4gTmFtZSBDb25zdHJhaW50MIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtbIHfxTBz1AVs6kMHeeOeiNy+RC4EDuT ArRrD0NpATiYOM+O0MTwk+pJtlCge77dTEnXEhHfXpYV5MLDvPx4B95v49BGshLn 2GOUcMuP4rextDb12hr/5oBKksFiWgBuuKc+XwDD8yh7i8KbOtJelWiRg7ge97sr Hw6eiPmKlDDmTN39aN5O68YIJfkpDIr08ncLWCC6WRpjMU/eRdYMce6LIaB+bHEx P5uwQD10e6XCnOVHaOc3kTmhbivIugrrE7VS4lq+t42amSDf9V4NWZ7d65dvIzGK DEics4ZGaizeN3BYMMNfPUfjJ0iqTbPYi+29gkE5/AQKVs1b4b4G/QIDAQABo4GW MIGTMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOYXX2m7K9gJL3EE2CtZdlut kC6cMAsGA1UdDwQEAwIBBjAhBgNVHR4BAf8EFzAVoRMwEaQPMA0xCzAJBgNVBAYT AkRFMBEGCWCGSAGG+EIBAQQEAwIABzAeBglghkgBhvhCAQ0EERYPeGNhIGNlcnRp ZmljYXRlMA0GCSqGSIb3DQEBBQUAA4IBAQALCFfBog6/kTwd1gGBnVhxJ9eKzzVS NyOl0T1SVjVHRul9AK8kP/8pyw7GtZE/hdAwSjyYbO6VaOT6muVtiAy9TQrGPSpA LPbk9RVLEn0vqnUBUkE3kX2T9WVM4jJqh7CsvO6OPTczCf1EqiJmmNhp91jCAPgX C375wkZEEI5thOZnblD5zDWpM+tp3RiIiFUZiZ1IT8ALgT3elFnqNePuOYZ/daaK +ehnF0gpr0KoLkgZ+HRoXoBIK0rz1TNCDzIfnc2Lx2G/SftBtuoVSp3TgPJO/7SP X9zsKBv3St40ZQ8ZUi3DqTwOCFYm6ODbESJPR3uJQhil1XVCr1GlGBYl -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Root_Email_Name_Constraint.crt000066400000000000000000000022741322470703100272670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDUTCCAjmgAwIBAgIBATANBgkqhkiG9w0BAQUFADAlMSMwIQYDVQQDExpSb290 IEVtYWlsIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDMxNjIxMDBaFw0yNjAzMDMx NjIxMDBaMCUxIzAhBgNVBAMTGlJvb3QgRW1haWwgTmFtZSBDb25zdHJhaW50MIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3fLWMKDgTjWtsla75PAa4yvB 4LMkiaYfXdKSAE3MNgoY64o1LhajQ0/LrJ8USY/2GLv9vVIufBqFFHwHTiUYiyAM odLGphQ/YitGE/ZAkef0NKkzRh5InCQSopP7SntZ//QoqsaJqKgdZl6UN+5eP9SA o9AbTDhpZxYmEWpT8Sk+5igBvepr7mBQ7ZAnJnTeGJE/IjrjCx7C2pInV2FxJNph 3Ou5LpqH3SBFOMnzootP6AWcPIfVgIY9CxJdITReQ7o3vFs/pn08DONV08eH4fDd 8xJWjNk7GfhhYEKfFP1Fk5CXAwlurPoydVuyU53SA3ICTpnstbUnJGAedUhBnwID AQABo4GLMIGIMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFL5lAY1YFiV6918j DM0v+NcRNuV/MAsGA1UdDwQEAwIBBjAWBgNVHR4BAf8EDDAKoAgwBoEELmNvbTAR BglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0 ZTANBgkqhkiG9w0BAQUFAAOCAQEA2QfSxzwYMYdSzs4Ntsda3mhroewzjf//LYbg DxXYw6QocnMkQnp3JIokaoTlcvh0FnqlxwVeXI7DYssNFBeEM9tkl9/KTqNWzZxq R3Ui5jpW3wuEnIJLN3Z3xnhH1dTXKlnuYc28aQuwmMySemJ6PD06HbntJRcu8qCY XbEHlwRoueGtFsRyHylOcdFrSS4XWKcSZ0O4dd2GdDYy1oSo5B/7uad/OBV7lAX9 iww0t64k+grM/mM+OgBJTj9cQCR0CP0cAVsVdSCw0y1asvoc7ainpEuYWT7H/3/d uG1lewFoWdDXkSkppwLO1h2wvkffBmzPgnjfkZ/ByLGeBLk2og== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Root_IP_Name_Constraint.crt000066400000000000000000000022701322470703100265440ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDTzCCAjegAwIBAgIBATANBgkqhkiG9w0BAQUFADAiMSAwHgYDVQQDExdSb290 IElQIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDkxMDQ5MDBaFw0yNjAzMDkxMDQ5 MDBaMCIxIDAeBgNVBAMTF1Jvb3QgSVAgTmFtZSBDb25zdHJhaW50MIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0qbHmORvktt3Z3/wu+RgO3bSqIb1tIKy QVOCAFz52gpFoI1PL7Sqs+O6rz9iQN57ntIpBw9WfydMk98UWFOsM5ICLci4J5jz gm0Go8clJRe/gL1q3ORRgM8CPAdt8eZrvZzO3SM1rhUC5QLjzzdCs+xzBmiJRzq0 hyiQZl6FSlQEwrGuBfPKFuRA56zYyXISLftm2wHwXK+9sF/sErghaFUUDIGfalfs 6TnsdvghrTlkcTfHg1ftsXq8YnxuCS+yWuKhbiMcoj7eNaGmc4/qY4oyxMkciprN Jir4eowwSklG7RR6tEz32K2yfUaOlx206KtT9r4AAwaNX7VX8RZ5qwIDAQABo4GP MIGMMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHJ0ggZC8ZUlgwPyCQZHM7sQ DcE9MAsGA1UdDwQEAwIBBjAaBgNVHR4BAf8EEDAOoAwwCocIwKgAAP//AAAwEQYJ YIZIAYb4QgEBBAQDAgAHMB4GCWCGSAGG+EIBDQQRFg94Y2EgY2VydGlmaWNhdGUw DQYJKoZIhvcNAQEFBQADggEBAL2zm2nBuKk/OH32bdzAy8TILh+b2ZiiGCWy+7QQ CCfRyKpCb6zoMq6uTqlFmXoQ5iUFih51fleP3qeQ4H3mMqIqoThPA1suQzgha/O8 jO6TIFYIo3+XTSfleGNpNUxfm8SqsZc0K6huerZZJW8e89dMddHxFa43T/RLKGpY P6VIu0JIweavOZTsUcd0JAqCSEnlyTJF3o5hP3thfbZMUZxgXM9sV4ucVBUE/o+U q3JMWLkE5OxrRG37z8+5yIOZi7Y8uOKncueUvyTzyHPp9S5SUombIOg/K8NoaCEt HkqILLcDJAihb7/odRS35Zw8ZPDVHCL0LtS1c2zEVnXbETc= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Valid_DNS_Name_Constraint.crt000066400000000000000000000020361322470703100267740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC3TCCAcWgAwIBAgIBAzANBgkqhkiG9w0BAQUFADAjMSEwHwYDVQQDExhSb290 IEROUyBOYW1lIENvbnN0cmFpbnQwHhcNMTYwMzAzMTY0MzAwWhcNMTcwMzAzMTY0 MzAwWjAkMSIwIAYDVQQDExlWYWxpZCBETlMgTmFtZSBDb25zdHJhaW50MIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxPaa6o2mZoq85YKSUYWFP9Ttl8Ux X+hDEKzvVS9+V0dbdAE0WHLxZnq22UAVsQ/a2RlYcXGMGOyztJ+zTKqjyeSadNat gIyh0BD3B2xhKxz1Zf2ZixVWZcwu5t/ZcboIF4Q8IKgiEzPUjcWRErk88ldMh7Zt 9vIZMcGNnlzCWeuk7I91WoS9qs5mLXRecL/SrGm2gS+ByhirNNpSlPMC+4hvFShE /Z82BEM2gqR6YOsfGjlz65DBqAfME8Pd/IWuHA9sb1t6s0/dTCYQ5RWoCkKBHe9Q CWtBK7MezgYcJqFFzPlMjMS1K/z51RXBHOetxqsommSJiKg189NKX0xYhwIDAQAB oxswGTAXBgNVHREEEDAOggxhZXhhbXBsZS5jb20wDQYJKoZIhvcNAQEFBQADggEB AErxPj6k5vksK5msdV+0dCFr3j7L/qCBU5vAwuGQF+qW7P/3tG2GKbsTtDW64fDn coWDA3P/LU9Rat4qh36VGVOlAOfGLxfA6QbFeGpIj9oQ+LLQrcWovELGaQoXMJly r4VRpCzoe4B2xDp1ivJo5tprwmskRiL1kRkVauQ9tlCn1b0EyDfr2iX4CEZESlDm my7BVAM6zOGBMs76R8mobP8YtB7zRsC5EVuvDz0j0YDfPKTedMKtP1Po+sYfNmHy 4EBgYjdh83zOzUXhG4qxaAn7LlnEjzrI+b22ouKXucXShNeEtQdBa6QSAWlAyqyS MxdsIT7d9oSqYMIBvWHx89I= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Valid_DN_Name_Constraint.crt000066400000000000000000000020561322470703100266530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC6jCCAdKgAwIBAgIBAjANBgkqhkiG9w0BAQUFADAiMSAwHgYDVQQDExdSb290 IEROIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDMxNjI0MDBaFw0xNzAzMDMxNjI0 MDBaME8xCzAJBgNVBAYTAlVLMQwwCgYDVQQIEwNYWFgxDzANBgNVBAcTBkxvbmRv bjEhMB8GA1UEAxMYVmFsaWQgRE4gTmFtZSBDb25zdHJhaW50MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEApu0vAiLdowRssVHCzK31e3A3vso8wECeBY/1 esASJqMjusWjxPq9tp002KT+1CAYD0Du6I6KPjAXUp38AXglQTcA/JjL3LTQrGXw DCwL1vzK6WzJew6beQnyskscbAQ+iPxzsWn7Nb9fCUQF5fSoZBVP06KEh4Q3dgxb feYbGQC3cZIR93YHUm2wiO27mCE9xx7xwqIGux+V/Kzt4+tsUpduJn/tPGJVUq9n oCmSb8rW9B0pbtwXt1QmxjShBGodXefExY8JAmkNmOLxARCgddyK0Xmoyl7Teo+L BBtosdV23VNe3L+oQi/OAb1pn82u1hOgbQhttUyzlungnsWjfwIDAQABMA0GCSqG SIb3DQEBBQUAA4IBAQBwWrY+5e+tjYokgNpWZHV3buxqOt2CAjN7FvPcd6adJeDV GFcBjCGX2qmh1AvqYXliBZTl9rh406Wfz7ssBAzPrxlgyAPInSCfrAbPIH+wpx2G DR2xNp+uybtIPXMH8LRSGuRZIkaWAvFTKtJMDq96xXUt0iPZJ7gUDS26QQnTFKqz /ctGxQgno7R+0/8OT/FjwRV2zesB9PI1vJA2Vo082cPyLrSnc4B1/awJy1GGnSyr XwCyrwYVU17fjhyjYRpIWF4W9WGRbzSOCCRZvxtxPvTpMeC83hDr0i5ZzgjNrxjg gwheK0rKj14494bf3S3WHQBsFKuoQ/2/kNbzr/OW -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/name_constraint/Valid_IP_Name_Constraint.crt000066400000000000000000000020221322470703100266530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC0zCCAbugAwIBAgIBAjANBgkqhkiG9w0BAQUFADAiMSAwHgYDVQQDExdSb290 IElQIE5hbWUgQ29uc3RyYWludDAeFw0xNjAzMDkxMDUyMDBaFw0xNzAzMDkxMDUy MDBaMCMxITAfBgNVBAMTGFZhbGlkIElQIE5hbWUgQ29uc3RyYWludDCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALYPp5KI+Bhr+jJwg33UWg1Pdr8hbBCg AWWyulQW++LlmjnlhGNGOTBW8L4p4rCBbBJ5EHgsLdOpm24fFw4G/yj4cakQKZyf 1eIgvJ5nHmFSTJH2TNWZppeRCK2zbFa3ZaBuiOoyNPVsFii35NLVNiHy8xjRDerw SjkB9PIxwdB5/jZiAYU5FPE8Y1zsaIXOIC+RaPygdt/qwnsDrqqJLQDCuN7WLeYO zxZfs306z1FT7uZOfOEzfFrqS9ZiQA5ZhWc38IhmkGDdjJlZtKb6abLdDHR/QjWH upnm/wJ+w2AtBfhIU1aLHSduX8MVvJRRSkAl68o6HJUKRayWA+5t8ksCAwEAAaMT MBEwDwYDVR0RBAgwBocEwKgBATANBgkqhkiG9w0BAQUFAAOCAQEAa4ZrteRtAghe Lvwr1hgg+MKG3U3+1kq9VWbM6TbjcB6YuWWbWD/pPeMeq3k8+5xDw7eTWLkYyyAL nyFSKUHhYppabmkvtxmYpwIzqdhrm7a3Ej+3FDwAjvjgB2DoT60oQ6TB6P1do43O LcnAIDOmuknAml5wz8jndNHGcYPy2oJLq0lzWjVxmdhF3KbfSTa50yj9CeXkLD1C Dvf53AVpcsQXxI92omp+OFvx5d7uc8iIE2KD2d0gKGw0vZPQsdA0VMDwTxcSNbeZ KlMIV0lhRVLX41vjU9J+Ax7Izt4EymoMD8UWqI/w1Hv2RwHvy3IGNOjPsMVCs06A 2dWXjqwbWg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/nist/000077500000000000000000000000001322470703100171435ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/expected.txt000066400000000000000000000035061322470703100215110ustar00rootroot00000000000000test01:Verified test02:Signature error test03:Signature error test04:Verified test05:Certificate is not yet valid test06:Certificate is not yet valid test07:Verified test08:Certificate is not yet valid test09:Certificate has expired test10:Certificate has expired test11:Certificate has expired test12:Verified test13:Certificate issuer not found test14:Certificate issuer not found test15:Verified test16:Verified test17:Verified test18:Verified test19:No revocation data test20:Certificate is revoked test21:Certificate is revoked test22:CA certificate not allowed to issue certs test23:CA certificate not allowed to issue certs test24:Verified test25:CA certificate not allowed to issue certs test26:Verified test27:Verified test28:CA certificate not allowed to issue certs test29:CA certificate not allowed to issue certs test30:Verified test31:CA certificate not allowed to issue CRLs test32:CA certificate not allowed to issue CRLs test33:Verified test34:Verified test35:Verified test36:Verified test37:Verified test38:Verified test39:Verified test40:Verified test41:Verified test42:Verified test43:Verified test44:Verified #test45:Explicit policy required #test46: #test47:Explicit policy required test48:Verified test49:Verified test50:Verified test51:Verified test52:Verified test53:Verified test54:Certificate chain too long test55:Certificate chain too long test56:Verified test57:Verified test58:Certificate chain too long test59:Certificate chain too long test60:Certificate chain too long test61:Certificate chain too long test62:Verified test63:Verified test64:CRL bad signature test65:No revocation data test66:No revocation data test67:Verified test68:Certificate is revoked test69:Certificate is revoked test70:Certificate is revoked test71:Certificate is revoked test72:CRL has expired test73:CRL has expired test74:Verified #test75: #test76: botan-2.4.0/src/tests/data/x509/nist/root.crl000066400000000000000000000005631322470703100206340ustar00rootroot000000000000000‚o0Ù0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor 990101120100Z 480101120100Z0"0 ' 990101120000Z0 0 U  #0!0 U0U# 0 €«šëùÂçT0  *†H†÷  ¹jg£%»BüÇ×_ûq‡ Þ¶œ€ÌGÜô”þçïȹ;j~ùGj¼¿Yà¯Eܳœ¸ˆ8(.ZÕOªÃr°ÙûXº@…ZûôÃÝ?¥yǸ{Sp ãåžÛmx>€+“2”ò‘lû;´rˆ’ŠŠm#´xF@©-æÍ botan-2.4.0/src/tests/data/x509/nist/root.crt000066400000000000000000000011601322470703100206360ustar00rootroot000000000000000‚l0‚Õ †Ÿ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0Ÿ0  *†H†÷ 0‰Óó¹Á3·?§'öA\œyªÒ•·„ÎÚ£åX >N‹V¿>ª!-Pþó.zËÏóÓ¸_WŸ—€¯•Wß4Ô½ó®Mç|¦ ÔNÚca>=*7ÏÅ<Éùúð9Hx½°Ýõ$F3¡FŸŸ»Ï7” Cª¬‘xºó„*‚+G£8060U «šëùÂçT0 U0ÿ0U# 0 €«šëùÂçT0  *†H†÷ Va¬‡‹OëdÃ…YJhá;¥!ÁY.‘¬hþÿcmîUÔ ‚L7¼Ž©&aþFú8\Šj·G˜r¹µV€îx•ôcp&9› „»b_ß,¡=üÐ:»ØÌ6¢«­>æáR´uì'•¦cÏÓÌôNغ¸­­Ìe§ZEbotan-2.4.0/src/tests/data/x509/nist/test01/000077500000000000000000000000001322470703100202635ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test01/end.crt000066400000000000000000000012121322470703100215370ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.01.010Ÿ0  *†H†÷ 0‰Æ4ìo àY¼_º.“»§¹pй×å׿ÊJŒ#Ø`³kˈˆÇØH~dùöãyFAäa÷%GqóP”Nò|j7¶ F¿œ–¥â¯ Ê‹ðŒºCJŽj‡óFNÏm]RG«™Ç$Í1}ïÑÙói$ûü3n)«oRu€*»à©,1Å· =;êµ£R0P0Uÿà0U 0 0  `†He00U ¬Ûüñ¼.Ò0U# 0 €«šëùÂçT0  *†H†÷ +ˆO‚…­e±ß꥟Eù«>¼ý„1õëŽ ¬š)ÙŽÌ_;“¶š5Ξ n>Š-Hçï†èó#¦«r:¢XÑ]zVйn½¼÷eažyCŠô¨¹Ue;&=®ˆ^´{*BÅ…=©§nÇCàAåñrx®µi€ÖWÎ$K·_œbotan-2.4.0/src/tests/data/x509/nist/test02/000077500000000000000000000000001322470703100202645ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test02/end.crt000066400000000000000000000012121322470703100215400ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.01.020Ÿ0  *†H†÷ 0‰¼ ­”úl•МÜÞÊgù°F àÝÊo}d#öÜñ¬L'ÕÛ>þ§€Þ„kŸókWužüªFªPõ<êÙu hµt¾Ì'- õ?¾›Þ²yþoÇNý HDwÐN3<pS.JÂøõeçÚ-ÁDäW¬[Á¾Èô¢¬à/9¸£R0P0Uÿà0U 0 0  `†He00U ™’Žãa³ø0U# 0 €æŽ@›OM”æ0  *†H†÷ +¼3"å!ŸÐ²¨÷ü ÆjÝä‘´TÙE]•UNXÝI œkž7ˆv4ÜÔDç¦ÆqÎw®XÔ¥bW)NM¹¤ìém?¢ò‘ Ù5ÞCî*’ÑZ- íU?°LÇG€âÃOàËlxj…±r‰o'‹¬È#¾zfÔ*(›Òbotan-2.4.0/src/tests/data/x509/nist/test02/int.crl000066400000000000000000000005171322470703100215630ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.02 990101120100Z 480101120100Z #0!0 U0U# 0 €æŽ@›OM”æ0  *†H†÷ —n–ƒQª«t}Ýsã‚V‡xˆ¼Íĉр ©¸Ÿ‡•w$ ¼>,µôlÙt½¸àj[8à€!*6.\ݦJˆ]« o'¸j ~]û^p°Óc‰ŠýçŒT:2^Ê't“š‚)šRï­x›áסËŽörHNtWwãá€k¨N+botan-2.4.0/src/tests/data/x509/nist/test02/int.crt000066400000000000000000000012311322470703100215650ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.020Ÿ0  *†H†÷ 0‰Ö9ž!“âº5åøè‡ Š_(%…·åÌÚÓÇ *cé­Ð¨ïºÏ<ûU¹ƒ)N‰„ûâb‡@køôf8XtgÔµ¡:KoK7::d Ž¢{ˆ·øÎjÑE›9“g¿ «Û7úÎT7‚ 3ä¸nFÁÌO€Z´½€'@„I£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U æŽ@›OM”æ0U# 0 €«šëùÂçT0  *†H†÷ Ü.Ø{ŸÓ{^ # ?,­Ÿžšm7v§åH*gÉJmÇWPüýå=t­¯æ¸Ý{Å«Œ!+EŠ,ÁÈJ¶ŸSÕ÷– §IG*¥k¤äBÄ·é={ÿ 6Ÿ<µóØ…ðØ6Èåu¼a“_68ÕÅÄwF|…Äö±Õ‚%!(†t¨botan-2.4.0/src/tests/data/x509/nist/test03/000077500000000000000000000000001322470703100202655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test03/end.crt000066400000000000000000000012121322470703100215410ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.01.030Ÿ0  *†H†÷ 0‰ÐÖô#ÿþEÖÕÇ_ðÈREÈzrø9Ë‹¿ñ(ú¢Jâ^=äžpJ"K¤§Ü°îiäÄå ÀséqµÃùÛ¢ÃÉfëXcÑ+lG8CƂ֤5;Ñ“›?ÝIê;všÛsƒUyÈ0Ëý¾—\Vi OÂßdÏNÿZkÙ«£R0P0Uÿà0U 0 0  `†He00U ? °–Ø‘«>0U# 0 €ÏO„ÊFØ›0  *†H†÷ –~6‰Þ&³À‘/I«?Û£ØÔÈ;\J4Õ aeqÌ+C´à·8ä6o_ hÊúòuÀè<4² ´ $TNbo–¨­W𠼆¯øYü¢Aéºâ¸âéƒqÒ¢iNËÒ‡Õܳýáä•£ÓÃõlV¡ùJîç3botan-2.4.0/src/tests/data/x509/nist/test03/int.crl000066400000000000000000000005171322470703100215640ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.03 990101120100Z 480101120100Z #0!0 U0U# 0 €ÏO„ÊFØ›0  *†H†÷ £#¿ÅÊIÐæãâ´×„q]ís3²[{öxäpž‰ý¦ß¦EÂ3̺ºãU‚š¤–#ÞRñ»IÀÇ$N”Rp"Þ/?ó;3‰îæ¤ßv–‹×¹ â..¡:¤Z“ï® $wÍ’ †„˜YUpí'u;ýÉ@öì•Í6³ÑâDbotan-2.4.0/src/tests/data/x509/nist/test03/int.crt000066400000000000000000000012311322470703100215660ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.01.030Ÿ0  *†H†÷ 0‰¸EókøòÊq^ €ÆíÎH•Ÿ¢±/øîs²ìTu0'£ÈCÁ—¬ðõq ˜ÕaÎÂt€©D ÆŽ–=ɤi»±×i<®²xª·o»¹|¾­o·ŠT3³? {Œø¬ ä#]/WåôUžH§ñ,ãoÃb¨7Dzl7ù£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ÏO„ÊFØ›0U# 0 €«šëùÂçT0  *†H†÷ C誔[Û¼7£;ù¾D!áÙK”jíE¸NnCλdï÷$Ö½4–  tâÐF#‹²8+usÝl;­Thå”7ÇÏt–Œ*Zš˜9L¤¼f4F Ëê}¥‘GµQÓ`»Åß’É—|ÎBQp2 ÷ý ‚YÏ}àÙ´—botan-2.4.0/src/tests/data/x509/nist/test04/000077500000000000000000000000001322470703100202665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test04/end.crt000066400000000000000000000012121322470703100215420ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-CP.02.010 990101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.010Ÿ0  *†H†÷ 0‰ìØ«i®¬YxÁˆçRÜÔ^UÀ¯t8Á‘~.õbüF8¹×ƒ]‘–嬢wͲùäÃ(T³£RâüÓQs)z¡Ç0)‹yçêĦÏvƒ¢)Eð„9Üù^ŽuÉv{lj^8Ã¥?«,‰ypÍÆCž†À~àÓ> 'YgóJõüº„Ãô£R0P0Uÿà0U 0 0  `†He00U ?›UtL±¢×0U# 0 € &J`æÍ•0  *†H†÷ ‘\}Ký´*ü¨Éß2“N ¡W–¢XñŠo7"ClÕzžÖ‚Æ܃Pº¸_0>J¨jß ‹à®L‹H‰DIÌZˆ–¼'¸ë¿‹Õ½ ¶ôA2_[qøÑ»Þ–MŸ‰A—un)v«?“4<¤ù9kÍÙÃË5åǽ^™"°¸®b¶!*H]~botan-2.4.0/src/tests/data/x509/nist/test04/int1.crl000066400000000000000000000005171322470703100216460ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.01 990101120100Z 480101120100Z #0!0 U0U# 0 €6Â\Å jvè0  *†H†÷ ”•UúÙªü‘„eÍ`X¤×¯gx|ªpòMX€PxÖ™ôœ«R‡˜¬Ã†Ì}‘ ^s0Kî[oˆ¤ÍÜ"¥eo6s^¦}Þ2c%æÙóIp(!ÒS<}Û꫽ˆÒ2ê~n¤¬‹Âa¨¦ô%²ŸËwVœ58,ãÆµGqñÏÇÄ?½botan-2.4.0/src/tests/data/x509/nist/test04/int1.crt000066400000000000000000000012311322470703100216500ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.010Ÿ0  *†H†÷ 0‰¿•íX¬ä–.Î̈­‚ÌY³8;còHT×gõ? [‹Ÿ¤l'|…zØEWŒc'JoÊ6ã¯=h´ƒIš±‹åd€__Ô>ÑòÕÈ`\ë`>§xÙ’Fþ'Q²°çâõÁAÔò¥À¦“­RÕGJJ® |4(Âàì\üƒu£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U 6Â\Å jvè0U# 0 €«šëùÂçT0  *†H†÷ 9÷‰EûÒe/Ùï»~òÍæúþ8¼:ÆØµoÔ\Ä~9ÔýF+^­§i7üT/èp_¨[MÙ*°^©fÙWŽ y QgXSÙª[Zó°W7Ȱ;$D6ÐÍ#ž2`s<?Ø+B­H»W¤´½ä2í×q/_botan-2.4.0/src/tests/data/x509/nist/test04/int2.crl000066400000000000000000000005171322470703100216470ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-CP.02.01 990101120100Z 480101120100Z #0!0 U0U# 0 € &J`æÍ•0  *†H†÷ „ÏC\­4ÍÐeÞ; ^ä s/{1)3@X9Ró#r›Eušö%™ ÚýõÄP¾‰Ì´á¤„÷‰,5»#˜_G_•/7:è|åšµ¥Oúfœ¤+”­ K|q&2‘Xà} RîØ’J´* ÷†Qz¾‡òØÄ/¥,kUUƒ!Ìf'U•botan-2.4.0/src/tests/data/x509/nist/test04/int2.crt000066400000000000000000000012311322470703100216510ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.010 990101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-CP.02.010Ÿ0  *†H†÷ 0‰±þb(ÔÆ¿ ßG²ŽÉo# /БWôöçÀë¸6T¸jˆFÀsöMíŽÝžÿiû/ÈI{›`Õ ¶g?G—%1ãuœ[Õ<„ˆÊȽ»|V”ô`úÿ†ò‹ÚKÒof{Jx­’5ãïC-$‘|â«R¤µcf°rM¹£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U  &J`æÍ•0U# 0 €6Â\Å jvè0  *†H†÷ qû5¤}vCa¿ƒN$í±Æf>ÖeõÎÑÆËî¡“ŽÈ,hÜþSÝR‘¨H>…³Z—yÀ•rB^2Â%AÈ_Äê]m˦m¥ÎCÏN©=3v‚߸Ôɰ¿Ê–§8‹ šZ¿,bCÉ¢U‘˜Œ$ö°ód6±vbotan-2.4.0/src/tests/data/x509/nist/test05/000077500000000000000000000000001322470703100202675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test05/end.crt000066400000000000000000000012121322470703100215430ustar00rootroot000000000000000‚†0‚ï  0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.020Ÿ0  *†H†÷ 0‰¿Ò­Îžò¥ð/≳Ÿ¯ø›‘—R£• | Ž8í“"§/ Qó©ëøo¶ðÅ0˯¾»;=Å ¦©ƒ0Mã3¸EòœjlEEâŒ)Á/5UB8ìà»ä»Tšw^(c!‹8ÌÙÁ‘cFŸ)i¬ùƒÎäïA<ÞQLqÈwéÌðç{ £R0P0Uÿà0U 0 0  `†He00U >ÜÙ'äéu0U# 0 €úÔN#0  *†H†÷ xf£¤ÓµÇ\)ì–õA% _?Ã+SJÓ…+ñÿ°~LʔÉòtiÃ7:½#Ûö­ä "(9Ö´5°×÷MòcËä‡ù€jO°Eµ T«Ý¸è;„ªø™hÊú‰¢n Š õYz<åµÝ £ƒ4õ¿%¢žAE`e¶botan-2.4.0/src/tests/data/x509/nist/test05/int.crl000066400000000000000000000005171322470703100215660ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.02 990101120100Z 480101120100Z #0!0 U0U# 0 €úÔN#0  *†H†÷ ¹@rYì\vCdÝá^ù±¹tÕ<¾YÉ0ô5›/ ãÃòfâÿmørã2ÒÊkO†ÖÛS°œH€ÖŠOÞ¤æß¬O%9A‡/øÑ\±ËЀÁB‚Y¹ˆÚš² À ¡dbÑTy¿‰[~ß_I:TÊÈL¹jÀmdbotan-2.4.0/src/tests/data/x509/nist/test05/int.crt000066400000000000000000000012311322470703100215700ustar00rootroot000000000000000‚•0‚þ  0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 470101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.020Ÿ0  *†H†÷ 0‰Ç&iQ)¿¦ÎµŠ*†{Ø1ýU ,Ù†­q‘`£&a,NC›.Œíweí Yü/ÍßJ,¡Ýy N·8j!ªhÔû ™\ m†¥ä¨]ωÚí­ÞäJbèt&N6\¼¾Û„µ/¿z¾Üí®}Óì½> Ô ¢¹”œ£Þ¯µ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U úÔN#0U# 0 €«šëùÂçT0  *†H†÷ ˜ì…«kÙ­CCUd\Ë6/f5¹3{_ªsÄÑ]}F˜}ð«H"<ë>dÈ52gÆ1¥qwèǬÈ4ÝeÑéMåmÆ¿?XH’ªêÝ17:D§>ÛÁÀáGÔ¾ÕÊñ¶a™ÏÞ”^ÄT<×(JsË‹ÿõ¢…(botan-2.4.0/src/tests/data/x509/nist/test06/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test06/end.crt000066400000000000000000000012121322470703100215440ustar00rootroot000000000000000‚†0‚ï  0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.030 470101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.030Ÿ0  *†H†÷ 0‰ÉVèS‹Âl)“:§L0á ã¦6!*|÷rðIÑ™¨Ç¸Ã6g g?Ñìƒ8À’arBC2¤'Û0•=°ÊÌÄdtG‘Jñ:‚X?øgÞ*cKüCª¡ð©ÒÁdl3ä{ìCÚÓ!-Õ24¬§>:RBf-~€=ððû²ÜH kb䃣R0P0Uÿà0U 0 0  `†He00U sõú’žíx$0U# 0 € dþü÷p0  *†H†÷ JÛ›ƒpó„˜3`ï™™4iÉ]dln…Ô)ÔœÐGSFç`ÂcãÕØÌ4£Ðu\݇=Ö·ð­&?>»ÕCÛT¢vvó/Þ°TAÒS-þ.ûê€ï|+Ä]®qU23Ôw>ˆ¬ÀªÈr÷ƒ-Ùf[Üž­l{6Ðsbotan-2.4.0/src/tests/data/x509/nist/test06/int.crl000066400000000000000000000005171322470703100215670ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.03 990101120100Z 480101120100Z #0!0 U0U# 0 € dþü÷p0  *†H†÷ ”X¼üa‹#âBG{3ˆ‹»à> Lþ_ù HÒ+(Ÿ™ø7zØ&ýõ…6QEýô–\{XXè”"¿S­’‘»Uô†½lS5¢Cè^«-±£Ç§•‰±P˜¿EÐs%¸jF"F¤—"f'5YMɬb&6¾ä`=]Z¯XèãÏŠbotan-2.4.0/src/tests/data/x509/nist/test06/int.crt000066400000000000000000000012311322470703100215710ustar00rootroot000000000000000‚•0‚þ  0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.030Ÿ0  *†H†÷ 0‰š'³\:ööØ^‡ŒÁuGðE®>¤¡_÷}µåÏ¥U‚ô‰Ó«æ¥c]Pi(öí4Îsˆ"ÙŸÙoüæý²9Ûƒä Jçà€’™huBðÃã+‡÷â¡%oDà9ý#IöÂ3 ŠÙŒEÑ6¹n.ÁZGçkì3'§l5qTŽãƒRÿ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U  dþü÷p0U# 0 €«šëùÂçT0  *†H†÷ ¦¾¤ uXæ6-Û|ö}Ëš1…¡ñÀPÅŦ¯\)W+ ¶Óü´Ñ­½Á·°)ûœRˆ[cŸŒ×(†:JF¹Õ˜êbæó{JfÙ v±l¢óÉÉÀ]{k9ò &U¬jEô¸õ>k”)¼(0\sl¦îIÏ¥°´[ 8>:s:éBXbotan-2.4.0/src/tests/data/x509/nist/test07/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test07/end.crt000066400000000000000000000012121322470703100215450ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.040 500101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.02.040Ÿ0  *†H†÷ 0‰°Wäb¶ü,Ál 3ç¦$Ö²RmÊ»ˆ)W,Í„’ Á»è[;6ô¿Ù­—B‰½SXŸÁÇ•B%ÜÜi>aÛ®ŒÙETäDçýPåƒõ·ë#¸>çh8šÍ§íëÂ;}ÛúA„‚4׌eñÒCZÑÊôkûž½EoSÌí:!å^L>ð‡£R0P0Uÿà0U 0 0  `†He00U ¸¥ïåiM`0U# 0 €X§y0IY0  *†H†÷ ŠíÉQ»Ê•²jêB¾²g’ @"fÛG¯QôŽäqĬʱNNšõkä*‘Ä6ļ§<Þ¼yÂéœì§Ç|cÚÅ–IVìD£òÒ#ž±å*º·Èp&âXs¡`<·UóÛÒ¨Õlr”8rÄjQ@¬ÈeB|‘e±‘4‰¼7z¹VNpbotan-2.4.0/src/tests/data/x509/nist/test07/int.crl000066400000000000000000000005171322470703100215700ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.04 990101120100Z 480101120100Z #0!0 U0U# 0 €X§y0IY0  *†H†÷ VТ"‡$¶uŽÁhš9ÎíMBo¼~~!…rõá˜ÈEíÀÛ/ovƒ*çº~ßéGÁ”>}“1t¾ÕšÁỘ;Ø+ @àݦÕr|©H…MdS ðuewÂLŘdjZGD4x½[*¾Ë¤WwJ ™ 6¸cvÇ*mψ‹‚£TG6Ôã±'´]jÀö'ì»ÕÕï÷ï¿‚Ÿ6!#' ¶ô´(2ÔL4˜üê0 Êe¥ðžßQbotan-2.4.0/src/tests/data/x509/nist/test08/int.crl000066400000000000000000000005171322470703100215710ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.05 990101120100Z 480101120100Z #0!0 U0U# 0 €Þãa#ä.#Š0  *†H†÷ Y•ÙQ˜â–¤ÒB8Óÿ«Ú™læÜI}½.mŸ…ËsæIáä-F_þ‡=wÁʽ °ˆÑ3x_ƒ*¸ÉdàWåeÇ<¹P+ÂÝ\¸-R‰qÀä`wSP&ƒ03°gÍcùú²zæêW¾Kc#К»‘3C¹°I\´ùúæbotan-2.4.0/src/tests/data/x509/nist/test08/int.crt000066400000000000000000000012311322470703100215730ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.02.050Ÿ0  *†H†÷ 0‰¶wÍThºz£*,äd–K•Y”<[iÙA)ò¤}}‚c™Ï8¶ã欛µ›\öˆ2CiœfQŠÔfäµM¸g¯;¢f~¦-'Ö熙N@Y$Wª2J$H¡áYŒ ï’e&IžíJs¼Ú¥Ÿ»VT[ȧ_(•‘A£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Þãa#ä.#Š0U# 0 €«šëùÂçT0  *†H†÷ ÿ‘¦Ob´…u¡ð(y¶ëï)3Œ‹µ¿ 8ŒQíl‘&j,<·íË^¥s¨SCÛeÜóý¿çÅ…´òÀ’,ÍÑÄn²„–Ád‘´ó¶×ò ðj -ÚD ÓÌM¶ŒÑp.£Ôy™õPstå@©\wÛ™)—iµW»pþj×2botan-2.4.0/src/tests/data/x509/nist/test09/000077500000000000000000000000001322470703100202735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test09/end.crt000066400000000000000000000012121322470703100215470ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.03.010Ÿ0  *†H†÷ 0‰ŸÀ-¦~1Óq(1ø÷îãRoµì2å~9Í…bw¼Oi ÜZd/НwƒdÐð†>HtÏò¡ƒßÏûWý¦“IMÓ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U âb::;4¢{0U# 0 €«šëùÂçT0  *†H†÷ 1Q³S§ø`áéV¾bႌs”eŠÀô¹uƒëØ–Dá[æPRÖ¥)yúv•nkê“$97N ðçHoàËHo`{1„°’ l|ó{§qB”ÎëýQΪ ¿4þ)‹ñǨ0Ÿ£¾Ÿ±’°H~L«Xgšž%qaõ botan-2.4.0/src/tests/data/x509/nist/test12/int.crt000066400000000000000000000012311322470703100215660ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.03.040Ÿ0  *†H†÷ 0‰ÛR(·s7”ClÍ—ë†rt-ÀFÄ Ç½ñÇêe ß¹«(&?V0‹ô9kj*r‹ï«Ø#×l!I¶)–ÕþߚÓ/y~šlvǨ­€â’ e:8Úè´w =Û²V×}ÂùoÌ(s Ò×oµ9>HšêîZ¬ú+ÿoüG y?€8ȳ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Ü7£Yáy0U# 0 €«šëùÂçT0  *†H†÷ Ÿúkïùèc(×H¡ýâäÞ^o£Ä„Ð'Ï$¦Äi#"5Šy!VR…;ñZ4蘑GÁvE6>õ«¸3áð»«7C+üÅÕ4©?.Ø„RôIj· uì ÷U'dÖùќźÒGx¡q§ur9ÝRëv¡Ï¬ý9æ©Ô%botan-2.4.0/src/tests/data/x509/nist/test13/000077500000000000000000000000001322470703100202665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test13/end.crt000066400000000000000000000012121322470703100215420ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.99.990 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.010Ÿ0  *†H†÷ 0‰ø€d¥ÏŒ¯#½£cß…rŸ"+·P´\¬ò…[–5ÏŽ2ÌÚ“éB‚XqÌ2‰¥ª½%Ô$# —/ÁÅ[¯Ÿ¹z#×+·ŒT”LÝrËi¡à‚V_Œ²zúéÄ•Üj•nŽéü×érº·ˆ7~Û(‡Ðð;ê£TüÝÿ£R0P0Uÿà0U 0 0  `†He00U %“Ãmý±6ÿ0U# 0 €9›ß¦»Ö0  *†H†÷ eþ ÕÇ |0` pˆLà g½‚GlÎj}·TPw»ÛìáRðÊÎ@"# ·KŠ74]bâ™®/=j®ËúN~ë]wñM˜?&§¥ùŒ (4ö¿#‰&à<ˆ‰¸M9;3¾oC Lñ´W6Ô6íîÁ6×*nLй0Sï=øì#botan-2.4.0/src/tests/data/x509/nist/test13/int.crl000066400000000000000000000005171322470703100215650ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.01 990101120100Z 480101120100Z #0!0 U0U# 0 €9›ß¦»Ö0  *†H†÷ {¿sˆE ?ù¯¢â}¹ø­×.ŽqÐZ);ån¹xiÿ\`+F°j'ÈÙT‘8þºC¼æÙ]!B…”ó<Ü…‘ezÅ2©})ISёуÜ7ÕûŸ¢u–~e73`ïX:×€#—>nµø*ãé£ ÒËfxÂú7ÃÍj_?2•ê{Íbotan-2.4.0/src/tests/data/x509/nist/test13/int.crt000066400000000000000000000012311322470703100215670ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.010Ÿ0  *†H†÷ 0‰¹PŸŠ2?-lëÜá˜/hÃSȤù•q•£Õ|’*6yø_ƒ“ìÙ¢.¨‘»E^áâ‘„†›‚' !yØ,g2¬g0ttýKΠгv`ÒWäùÀF| ÉÕ7ƒ­»…È•d "• Kkòzß‹»}}‰{£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U 9›ß¦»Ö0U# 0 €«šëùÂçT0  *†H†÷ \̬ra©)"ÆÞ%´Ä z ´úpΫlS–Å™¢TÔ~Í+ =ÔqøK$èÎZ( HÀcŒ€…žQ_¤’$¬}|{d?et)¬·^*.MéŒÑ™OíÔvÀi.4¤•X~° ê»±3¤îñ2ZÔ¯«`Þs¡/·ZUf[botan-2.4.0/src/tests/data/x509/nist/test14/000077500000000000000000000000001322470703100202675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test14/end.crt000066400000000000000000000012121322470703100215430ustar00rootroot000000000000000‚†0‚ï 0  *†H†÷ 0^1 0 UUS10U U.S. Government10U Testing1 0 U DoD10U CA1-CP.04.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.020Ÿ0  *†H†÷ 0‰³;™ú¾†’ß½jeB_#ö€W -€²gÐ þb~µZѼ+o¥·ö¼k*Zþ¯‰÷tU‘ X¡Pp‘âF { ÉWUg}Òâ×ã©àâ¦@»8©—Wv\ŒgAÞ·Ý„”ü?]‘1® Üô!÷oErÇ8÷£ø—šE¼ñ£R0P0Uÿà0U 0 0  `†He00U £´ºá.­æ{0U# 0 €R9ƧޢµC0  *†H†÷ ¤ÔùcïIso&å #›ïüH©<Þ œ…·À/A@}ZguúC¾¢òIæÖÐAmÁ˜¹!0„·—¨MÒý¡Ø&Xœú®Öù4M[ G; ™¸‡œø0"'h5);tÁ±ºe8û ‰$S¢Ï —|?mõ\™Øõ{TPnˆbotan-2.4.0/src/tests/data/x509/nist/test14/int.crl000066400000000000000000000005171322470703100215660ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U CA1-CP.04.02 990101120100Z 480101120100Z #0!0 U0U# 0 €R9ƧޢµC0  *†H†÷ fEÉh‘¸@14ÛTG±ZëöW û›ãØ?ô¤~éB•¦ÃÙqêømÒ”SšéÐ?|u†Õ,Ø8)ÇtŸA†Ü€¡k¯&G¨ÊÛ}?qxÕ/`årSE£Qæ&oÆøxndŸâ^šäÅì(J šÇâ¨:µäàÚHGR[Z$ˆabotan-2.4.0/src/tests/data/x509/nist/test14/int.crt000066400000000000000000000012311322470703100215700ustar00rootroot000000000000000‚•0‚þ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U CA1-CP.04.020Ÿ0  *†H†÷ 0‰­xJì¥Î^‘#ž—ü&Ž×CAÔË…óÄYIÆŸÑC=¸Åرs§å g Á؇*û<<§Á»ÒÇg Ì`ºÀg½fºâÔË^Š´=>œ;Ó­ˆ"W¥£%Šì/ë4ž’¬½º­ 1óÖÖцո×? y_;I•îGršÂ2'£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U R9ƧޢµC0U# 0 €«šëùÂçT0  *†H†÷ G§æ7ïiä²ý«%A¶=«±_ |ZæJô[Ešê^Þ_q:¼à@>Lk×:SkÓŸõˆ´oóa¬Ypâ°åSÍð$µûIåW¼>köÎ(–U*[uê*Œ4iÂ÷Fp#BÛ¯ŸÊûùN³ü»:#º¹ufUQF¨¶°†è¥Uù¯Ìbotan-2.4.0/src/tests/data/x509/nist/test15/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test15/end.crt000066400000000000000000000012161322470703100215500ustar00rootroot000000000000000‚Š0‚ó 0  *†H†÷ 0b1 0 UUS10U U.S. Government1 0 U Dod10U Testing10Uca1 - CP.04.03 0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.030Ÿ0  *†H†÷ 0‰¶EÝ*tȬÁ;‡:g¤ƒÆ\eÙ :_æTŽ×Üïufé‹ÜzHA:åæ×˜€¾¶>“°4/wQCK~®ª*¾ÏìÊEÜ‹¥JÚvøñk¢!ƒ¦’£¤sSXâ]äIâÅ`Záúr¤>èbþÑöµ±çur»4Àƒa.žo£R0P0Uÿà0U 0 0  `†He00U pWC€ðª0U# 0 €Ÿ„.õ¬“0  *†H†÷ #Hø;÷Œ¢W?Q©Óq‰Ïp)6¶n‹ûð¯UfÕ5Š£@ ™Àwc1#>f{ôµ#cÉ.Ôaô£û•EvÑ#ÁJ´MBûÓ»8;NP"@ÿ¡yvòmlmDÚ„+eè$r~È@5 žçÍÑcâDÞ¾‰:jaÉÈ>©æk/ª=—@'}ž£&Ρ6ïÐ9)éç£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Ÿ„.õ¬“0U# 0 €«šëùÂçT0  *†H†÷ ®& ¡éHò8jñ7Zã©b3‚ ü§\)lA`+š?-ŠOxÂw¦ß š6©lsçoÍÎQ ýÜ®Šüÿ KÛòíXBûš )¡r¤'ÞºY£–ÿ±å(ÏfÖîÌÜ%Är œ²°)Þ`óz5]Wv£C­˜v71‡Í}ØT¿Ü€Tt6õÂhÂçúÚ©š¢~›>ä €—½R+<«§ÍèS›óf;TVõÜßµ3 EçT|•ŠÕ‡Ní2RÔ Cbotan-2.4.0/src/tests/data/x509/nist/test16/int.crt000066400000000000000000000012331322470703100215740ustar00rootroot000000000000000‚—0‚ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U Dod10U Testing10UCA1 - CP.04.040Ÿ0  *†H†÷ 0‰á_æøGÂ*Nžw©¢HÎ ÐÜ€œiù~¼æ+|H¡%ÀFÄÌâÐ÷)íãiÙ8ˆ‹ß1¼ûÄå­´À›¿=GÀC¯-^œý!ß×­Ež¬LeBÏ/ÙÏÁ¢*«rJ¤TRor(n¼ŸÊÆå›· 0‰8Žî+^fÔÅ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ⢾ê âÁ–0U# 0 €«šëùÂçT0  *†H†÷ a‡ž`O.a¶¨ñ[P¡ÚkF)!~Ë'=O˜;³Â"¶u‹øH9„ú‡sUÖ? Ÿ”¸*®ï¬õÑ‹m‡v¤sù{Ëü›¡´]È—,¶¡öJu…V T­(å,Û¹Dò¶*˜]†yDªË:ATT²Xƒ9ßõ&¢{/gÌ7botan-2.4.0/src/tests/data/x509/nist/test17/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test17/end.crt000066400000000000000000000012141322470703100215500ustar00rootroot000000000000000‚ˆ0‚ñ "0  *†H†÷ 0`1 0 UUS10U U.S. Government1 0 U Dod10U Testing10UCA1-CP.04.05 0 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.050Ÿ0  *†H†÷ 0‰Á›"Râs}uò[ÑŒ²ú¶-WÈ1ùÝ>ñiä.¼ª©6¹$é½–ñѺGë>,ªic6¶ßÀ}˜@tì§šÎЇídM¢/ žŽ=+aC覺µ#Øå…ŸÅo^îðnáéá9ǵ@ŒKwö抦ûò<ËG“(ÃG£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Π©iøÆ©0U# 0 €«šëùÂçT0  *†H†÷ Ë…Ñ$ZŒ ÔhœÙß@ØÊ˜_ñÚ8« ŠHa]$šèm†üüÛ¥,wOíÆò‹~6qaµÿYZŽÊ …µü×ÚòZ%³HšCOV“c›^Ð:ôÐ)sìt“•Çè8î¡]?›S5çp8½ýYïÍÝ8ü533ª×Û~êÖxBÄbotan-2.4.0/src/tests/data/x509/nist/test18/000077500000000000000000000000001322470703100202735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test18/end.crt000066400000000000000000000012121322470703100215470ustar00rootroot000000000000000‚†0‚ï $0  *†H†÷ 0^1 0 UUS10U u.s. GOVERNMENT1 0 U DoD10U TESTING10U ca1-CP.04.060 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.04.060Ÿ0  *†H†÷ 0‰ª¼¬ײíQVmïOºì ËŸÉ? |wÂ÷ó¡jæ[G&–}Źkqֈ̂)i°'¬êoß»µEø?i믭ƒšúåòy>VŽh)Ò’÷±r6À®$÷wÀ p"ÕZ­‘X>‰•ô%×¾øw/ÏŽ2¾~¥¹ó£R0P0Uÿà0U 0 0  `†He00U ßsaÚ9a~0U# 0 €Ð ŸdIõÐ0  *†H†÷ £Áž0h$QG7Nß»š²ìˆ¥MH2 zc7¦ž•‡¢$Åú’ Ü89ǸvÙƒp$ÿy›ÅåÖ÷¤LØüн’¿ª+©=bkíp臹ît!MfxAšqŽ Ú‡€ã˪(Œlç[Z ˜¿ÒØXùî€ß±Eg[botan-2.4.0/src/tests/data/x509/nist/test18/int.crl000066400000000000000000000005171322470703100215720ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.06 990101120100Z 480101120100Z #0!0 U0U# 0 €Ð ŸdIõÐ0  *†H†÷  ;[¢ºöÜ fqñè*2Î~?Ðë'lŠ›fžÙN 4‰Š°¿ÅØôfý¤äU¼áZӵВd4õ _OkQìIoþp;s–ˆ®$‰Ì¥‚yR#ôëç(5BU*ÔJEžTŸ¼i¶:·X]Æß QçÕÄk™ÝÝbotan-2.4.0/src/tests/data/x509/nist/test18/int.crt000066400000000000000000000012311322470703100215740ustar00rootroot000000000000000‚•0‚þ #0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.04.060Ÿ0  *†H†÷ 0‰ô·G_{Í’»Ÿ%ÙøvÄÜàš›P=<ÏžÞÃÁ=°Õ|QƒûHc°¶ õog¤÷ªR+ˆéÏ!:ÿ‚µó›{³–ú Sõ€åg–ù)¯äÈ_ìh×{ϪÆê?l½Ã±¶Ø}ó+û›Õýœ4Žï`œ|5È"­´M[§—£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Ð ŸdIõÐ0U# 0 €«šëùÂçT0  *†H†÷ møq¸ÐX‹<_1“\Ê#zÖ?»-vY£t¦1MµRc¡<æu6È’åB#áu%»w†JM'xæ’'C¾ˆÌ›á®öïúJ ?t A¾¼M[J1Ç·"µùDb™ŽÿC£œb;s.\botan-2.4.0/src/tests/data/x509/nist/test19/int.crt000066400000000000000000000012311322470703100215750ustar00rootroot000000000000000‚•0‚þ %0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.05.010Ÿ0  *†H†÷ 0‰¬†‡ ·!¬ÅáÚ‹•MR©ø{¡9Óחµ¢Ð ¦í¤Î v«Y‚ûRÎä9‘W“ÁUß ºà€ûPæÌZßb_§0(ã€éÓÿÆÓ¼äx¿ŸmjÑ1~¡Vµ×Üîp ,Œâ{—­ùXI¶ž5i0wíI✣î4c6­í$¬G®­£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U iH¿?m(à·0U# 0 €«šëùÂçT0  *†H†÷ XÞ&^*”ÊÆ`Låv%‹ ]Õæ¤>à¾Þ….·UÀˆÁ‚Úb|*žp3]éÊX ÝÇ‹Xí}¿g·šž HÕ;üÏ'PpW«h‚à–ÁßÙFT¸¯Íê2†úð/Â`>»¦aqCÙx8Á#ÿsÏsúbotan-2.4.0/src/tests/data/x509/nist/test20/000077500000000000000000000000001322470703100202645ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test20/end.crt000066400000000000000000000012121322470703100215400ustar00rootroot000000000000000‚†0‚ï (0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.06.010Ÿ0  *†H†÷ 0‰è{•L Eë{·ð#©¨Û°¬Ðë…ñíý]«É6ë’FÉUJ–Ÿ†7>çôÒíJßÕNÑÛ,ϳ& …õ«´9ÎP+Ã-¸ª•ÓÉ¥¤AË8»ŽEÎó~¨wûÄE­3¯½s.ÐWúS)^¸_ ò<äÁóïk §›K£R0P0Uÿà0U 0 0  `†He00U k ´<õ=Ï+0U# 0 €€&—>¾ Í0  *†H†÷ ?>ÛRö„W³2޼,“¿²ˆüá~õ®õO´ë…ˆÖLž©ëÑ‚|”r†ïB-ñZ—Q…o½œãÐG̲ÉÃÇ?v£µfœäv}tÓÉ‘oЇ]¥ö £ŸNµ\ÐáyÛo`+—† Û÷“0ÛŠlÀþ÷ï.ÓQibotan-2.4.0/src/tests/data/x509/nist/test20/int.crl000066400000000000000000000005171322470703100215630ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.01 990101120100Z 480101120100Z #0!0 U0U# 0 €€&—>¾ Í0  *†H†÷ nB^÷5¯;BnкĖw‰‘ Ŷ o:ô°†`£>¥XÞZÂ<ÔÍØæ©êb )îî‰à?áÀ¸Lí¹¾Jƒ{+5ʹô; c  / ö`žˆƒ´U,T ú›´ã'vÀ"ØFŸKkCµrá@é{á Âýù¥¹2PŽÚîÉù7botan-2.4.0/src/tests/data/x509/nist/test20/int.crt000066400000000000000000000012311322470703100215650ustar00rootroot000000000000000‚•0‚þ '0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.010Ÿ0  *†H†÷ 0‰ÈàÅÙO}Añ£ÿøEîÀÇJ–x2êvþýv‹Cap=»éo™¤„¸j R_r/F"'Ê|ÖÙ½ü¶ÅÍ÷8 SQõyŠf2÷¿@ØÑâ‹E§¡JɆÛXÝ݈ÍB %”^›ži'hÄsÍ[‚d+’â¯Y¿´ª¶ ãÅ%£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U €&—>¾ Í0U# 0 €«šëùÂçT0  *†H†÷ Ñ›Èg'“}©êìj» ­ñîöd$¾L„1É\ŽÅNA_–Öf’ç)rè*’vÑ›.\-œ7’1Üc²tE3 šÁ¦.¤a– ®»¯Ð<¬Ëds‘øÎçOeܽ{»_|+í\i!”D¿€êåÅ>sÝ~“ç£nÓ¼>Úbotan-2.4.0/src/tests/data/x509/nist/test21/000077500000000000000000000000001322470703100202655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test21/end.crt000066400000000000000000000012121322470703100215410ustar00rootroot000000000000000‚†0‚ï *0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-CP.06.020Ÿ0  *†H†÷ 0‰®ô Åâ+ã¦ÇG† KJ{p4•Ç9ìÖ·ûY;”û˜OY?¯øí‹T­›ÁîL “^ÓäþAé» ³Wo%¸“Ÿä·€b…ànfWŒ…øˆ—ËŠzÛ* qä ꡦ5e*yþ(8 CþÖ6ºcX´ÆûÜÒw£R0P0Uÿà0U 0 0  `†He00U  Ó"$Ò;Õ0U# 0 €h|V9Ñì-µ0  *†H†÷ £ø›˜Œmz+r™lÎ0œþÎò3ý,œ¾ü¥ŠL9ÏÙ3Ê‘ˆvN> ©}tøÏóÀPcä;"lÂ!ÒÜan*gs!ÁàæK1ĵu€ðc™÷†/Z®SƒeVÔáBÛ¬B=y(¶L“MLƒ¤oÊ9q,El„.é˜MCbotan-2.4.0/src/tests/data/x509/nist/test21/int.crl000066400000000000000000000005631322470703100215650ustar00rootroot000000000000000‚o0Ù0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.02 990101120100Z 480101120100Z0"0 * 990101120000Z0 0 U  #0!0 U0U# 0 €h|V9Ñì-µ0  *†H†÷ `f€ÍZvT™Þ኉ßH ¤ûöN¾Ó±h`4h‡¤ôì©°ê`³hì](^/JkþÿVDï´+{ÊÕÃÅ\§àÜc¥ûû@ 2'uLu8}UTÑ’i­1îÑ;5A³\“O{AsÐoH(GׯÖaÉ29—X$Ü´"‰ botan-2.4.0/src/tests/data/x509/nist/test21/int.crt000066400000000000000000000012311322470703100215660ustar00rootroot000000000000000‚•0‚þ )0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-CP.06.020Ÿ0  *†H†÷ 0‰¿!èÕÜ9žhµ¼;l«çï ;5 åbÉ[9õ£)A†UúO\ä‰TiKô#x‘Z…Æ|JoÔ”êÁ˜ërq³ó5týÍ ¶”Þ„ ±QdM{UZ²œ—XûÀÝ»øÛö(Êðpy­Õz¢d™ œí“Ž»–£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U h|V9Ñì-µ0U# 0 €«šëùÂçT0  *†H†÷ »7ªþZ©Ò«:ÚJÊè@<Õ(¥‡.6—ò¦Êq7™[½ð`A-P8»ú´úmÅ%Î=’4î å Xx/|•REuû@O2Têy¬«¯>Ô(?¸%Å:‹S¤ÜõQ]ú&…¦«µ(voöÕØ`y´ä•£eåSÛ»O²sbbotan-2.4.0/src/tests/data/x509/nist/test22/000077500000000000000000000000001322470703100202665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test22/end.crt000066400000000000000000000012121322470703100215420ustar00rootroot000000000000000‚†0‚ï ,0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.01.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.01.010Ÿ0  *†H†÷ 0‰úäÕú,í!zb 0Ây_Ñ VÛ²m6_‚ßf‰×)ᑆWÏ‹iZͦ2«W¿Ù³ŽÔ0§ôÚHïeÓ¤i¹80·®D:?²©MÛ¸¾yÓj@£€6WD G‚hœmHZê³¢‹ ±ôïU×ܰ{š\ZñTEƒ©9ÁQàÉ£R0P0Uÿà0U 0 0  `†He00U lŽ„k™0U# 0 €ôrF$•û…ë0  *†H†÷ c623LÌØY~ÐÏ´ß.¸¸V™9àÇŠöøà(lÁ>×9ZWT«ûxj¤iŽ þ@QßW"£¿º/¿€Vž¸âÈøæ+åv(q€ã0ÍÌ=©µÑsìY¨a£msÜ0{z«y¡ÊŒkYûÇœAíq¨î¬}lKt8ËVŽ,ŸÏbotan-2.4.0/src/tests/data/x509/nist/test22/int.crl000066400000000000000000000005171322470703100215650ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.01.01 990101120100Z 480101120100Z #0!0 U0U# 0 €ôrF$•û…ë0  *†H†÷ W€Ì˜ðÆzù§Œ’ùÒ)@IWQ™'èNÊÇ[˜­aI£ä÷y©<årò㹫H ‹ä0©aÐ5Õ¼^D$XUŽ«Í_Q›aÑzšùOÃxxÕÄ|X°±J߯ٲälh|ñ)ŽN…óõ—¶|õùp‰5Y–Å-ç[%1wbotan-2.4.0/src/tests/data/x509/nist/test22/int.crt000066400000000000000000000012101322470703100215640ustar00rootroot000000000000000‚„0‚í +0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.01.010Ÿ0  *†H†÷ 0‰Ã:íIýR3lq-ƒÁýŸ°s¦"=âjÓ<Ë­Uì*ÍD,BY2u:ÏþaV:/ó7í~,ÀÑLÉ 7¼/ï¿FSúð`ä›¶:ê@-ÇmFfC»ÞöY7î¯z%^¿^…Dáa´!ÎÃÖžÁÖ÷-DþðÂ]Iº¼ P¢8޳E£R0P0Uÿ0U 0 0  `†He00U ôrF$•û…ë0U# 0 €«šëùÂçT0  *†H†÷ ™f'ÑöèԢʇg&dž+¶½8¾v:|m/7.¬KÊìb¾<˜ £h“kïü_›p¶£8}™ ™M“¤©,Uñ )Hrç³R/fÌŽ¾øÉ‡p}) £Þw ƒ¬tÃÍü|nö/ˆ…}VÔNÿåúǰUüìZ=KÍbotan-2.4.0/src/tests/data/x509/nist/test23/000077500000000000000000000000001322470703100202675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test23/end.crt000066400000000000000000000012121322470703100215430ustar00rootroot000000000000000‚†0‚ï .0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.010Ÿ0  *†H†÷ 0‰ÖÓUà1:&À;r†«XÝZŠ\:ý´¢Mú())¾0‚„tfu†ëVn)¾w™ö§æ‹À4°Í÷_Ú0±N˜õîsìNAX‹‘~„qˆŽŽ§¯”jÙ­¡Ÿõ»\&E º1r mÂ1B¬™æiç›Ç1Q»ZZh(ÛÃ × GþĹ£R0P0Uÿà0U 0 0  `†He00U Þ 6Ò!#0U# 0 €…?F¦‡¯0  *†H†÷ @iuîäöÇ’·¢ZÐ"—¬"ƒê&|NH³‹{*À»’QðËh²Vð:Áÿ×Ì2éoÆŸB“[¦X!~¬œàµû±×äâ`• |´:C½À ʇ ðû¬wîö÷'ZIâÀVš Þµ;IÅWÓ2hØX§ƒlqNjƶa2botan-2.4.0/src/tests/data/x509/nist/test23/int.crl000066400000000000000000000005171322470703100215660ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.01 990101120100Z 480101120100Z #0!0 U0U# 0 €…?F¦‡¯0  *†H†÷ &Èß¡-ÅÔ£)qPN Vz?“vÑ6 !Æè¡”7F7üzq$¢VÒQî¡éTzxkäIöŽ£« A¹÷‹„㣘Ì\ÁWäqvÄʾ˔ŸB|•èÄUY1%à±2ëcö%¦&¯ójBßÄ~ç«0õê¢ botan-2.4.0/src/tests/data/x509/nist/test23/int.crt000066400000000000000000000012261322470703100215740ustar00rootroot000000000000000‚’0‚û -0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.010Ÿ0  *†H†÷ 0‰Þ˜˜œì×;F©7^¯Z2°AN(èR»aòÙíç´É. §ú»74}7Þ»­Óv。©Wª³[¿#µù!}›~I^·ªŸó’èªÊéÏØŠCb\¯Ïg,‚\Ê y£Ž¶?&ØØÙnY‚fû@—• 9ì;Üa;g—Äú;@Û£`0^0 Uÿ00Uÿ0U 0 0  `†He00U …?F¦‡¯0U# 0 €«šëùÂçT0  *†H†÷ Z‰RèËjœiÏðèü8ðs3¾”@,P<à#Ãâq0¦rµ‹TU }>Ë ó2¶–…ª¾@#ª² q Ù­õ1l#j„¤´•˜£È 7‚a·ãÀgm­ÌK0îp°ˆÃ6ŸXÞ(_÷nÚKÙŸÔ®ÎË»CÉvµ³N°j§botan-2.4.0/src/tests/data/x509/nist/test24/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test24/end.crt000066400000000000000000000012121322470703100215440ustar00rootroot000000000000000‚†0‚ï 00  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.020Ÿ0  *†H†÷ 0‰ª ©a±ôJIÿA»9)È„8!•Ø(¤ÄãŪ8–÷·£1Fù]çåý “}Þ‰ïŸtlψ«5Ícº®'ß$² áCšß-rÁ&â Þ ]å\dÌ…æg››ŸÆeé :6ìðÿól·k–íCô&VdÅÎ5ˆ­v[’ƒi¨0fÞÁ-£R0P0Uÿà0U 0 0  `†He00U ?Ã{:cF²0U# 0 €+o;¶=¦0  *†H†÷ ÂJE¢¯øç ­KN‚qýA×AÐHô¡NçþG†÷– *Ùe yáR>§©øxójþ*˜é 1Tf†£êF¤$ÔŽ– Ñ"$¸R ¿pª-™á¯ÎXÊ‚‰ndMi«tïºz"+"[ 6æÈ*,EÝöW «M¸Æö6yPS—«_Ÿbotan-2.4.0/src/tests/data/x509/nist/test24/int.crl000066400000000000000000000005171322470703100215670ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.02 990101120100Z 480101120100Z #0!0 U0U# 0 €+o;¶=¦0  *†H†÷ 9û—Áø²FÏdÎòÕ]×?pï $Àgœ7vJ›÷‚³òG§í÷Èyªƒ‘÷ÎT:SGL{@éù‹¸^1ƒ|ѼO÷3þcÉ h»¢XxŠI0?”–·²²ö/Q}ŒTýb3Ú€‘x|Éÿ-’%viÄL$ŠMxbotan-2.4.0/src/tests/data/x509/nist/test24/int.crt000066400000000000000000000012311322470703100215710ustar00rootroot000000000000000‚•0‚þ /0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.020Ÿ0  *†H†÷ 0‰èx öü «ÊK&„µ³’Œ{@ϧæÎüÉ®L¾^¸qÅn#1±ÌéÞbÿe…²Ý‘­”* d”gKÍíÃH¤SÛÐSpì1}K)‰ëÊéÛ“uW’DŽyGÃäo¹·F’‰ÖÍCI¶5 ¸'yèØfGˆ³àZa›Ö;ð7ØÅ+ £c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U +o;¶=¦0U# 0 €«šëùÂçT0  *†H†÷ ¢Ñž4\æ’ÛÜÆ‘r›€Dy/ÖU¾-è/l0gHûÆž½~ keË‹º›¼{•'²–¶·7NzW«;¬­}d:îãiLëœÑ Ý“÷÷´& w8,PË ªü¨ù훎—¸'Åe E¯Þ×Ý/å «‹¬cFz…-$}—ˆbotan-2.4.0/src/tests/data/x509/nist/test25/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test25/end.crt000066400000000000000000000012121322470703100215450ustar00rootroot000000000000000‚†0‚ï 20  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.030Ÿ0  *†H†÷ 0‰±›£Ü„º6}DU>Vl[çäqÕWHýÄÿ˜WWüH8[¸˜G؇kA„ýª Áö)ºÑÖØ–æÞ½03sJ*ª{ç bºîÄÞ®¢šÝi-±–×sU/ï5…—œ)óœXŒÄȪ ¤<€8o’L€D[/ãA—à Ýa¸Mä<¿ëØ!«£R0P0Uÿà0U 0 0  `†He00U KñÛ ¤‹ù0U# 0 €>À`öÓ0  *†H†÷ X|¸°zÓ’¦5^0Ác•é4L¡?¨mrxØÖ賌#ÄùIS,]!`Z²Ãäy‰ŽbÈœ0 ДqPºKÏéRÉhXòÅCš ž‰ U~·;ýJ÷g,¬~žK–Sõ¦S€ÜßäÔyb–:tù¹Òˆ8@×íá& ÈÖQÔj÷#botan-2.4.0/src/tests/data/x509/nist/test25/int.crl000066400000000000000000000005171322470703100215700ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.03 990101120100Z 480101120100Z #0!0 U0U# 0 €>À`öÓ0  *†H†÷ Uä"µ=EEF‰–é‘øÙ¯¥Gšñ§©†©vŽE?é›Ël§RÛe•éan·ó;p“`xOWû'iÄ’†˜Ì¶Âa÷XøóÕþò›^O ½ïšð cF'Ld¼¥Â+Wi4 gaƒÒMø~Jÿ‡›õŒ¢.)Û"aXjábotan-2.4.0/src/tests/data/x509/nist/test25/int.crt000066400000000000000000000012231322470703100215730ustar00rootroot000000000000000‚0‚ø 10  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.030Ÿ0  *†H†÷ 0‰»,[~Èb-@Z’ø´Ü€ˆ¯œZqO@v]ÃnÚÔTÝxŽ¥ö¦× tÆ+¾¼9ø¤ÿâÖ9Oâ°àyw ±ËÈCÕÉS–ApA.® ³åûƒ„Zਅ¸c'ÔŽ[‘°?ji|Q«Üã~‰Á´G½o¢fa†5…£]0[0 U00Uÿ0U 0 0  `†He00U >À`öÓ0U# 0 €«šëùÂçT0  *†H†÷ 5—É4×øQ¡µ ù{˜¸Ñ×€‰/ª“ûÝHÈ7fr?îù#‹õ½¬Ž†ö[¾´Ø”Ãæ¹èüù¸Lñ„ئ(ŽQ@7 Ò( ÈõM‚`\ Éܤ’o*c µ„èŽÏµj#Úe-`5×R2²p€·ƒm§7uU!botan-2.4.0/src/tests/data/x509/nist/test26/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test26/end.crt000066400000000000000000000012121322470703100215460ustar00rootroot000000000000000‚†0‚ï 40  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.02.040Ÿ0  *†H†÷ 0‰ŸåÞ]>¼Ô%»‘ 7æ EŒbóCñ>üR˜—¼IÁµé{å -€±–jÄô³/ë^,žgö^Ç<þ¤ëûâæ­Ò\jõŠÙÞzK[f £`ŸÄ²´3±uý¸d­ŸöÛH¼êë(Ž»á#|”-ÒD†^7Öåˆ5et¥Ÿ¯©£R0P0Uÿà0U 0 0  `†He00U #­MKà¾60U# 0 €Œ9¼+–©0  *†H†÷  ê£'ž¥/6Êl ¦)= Ó ¥äªÈY†Ì¹ùË“­µö4igg¦¬icaV Î9œŸ-zË©íŠÿP<Ø¢°1Ûµ“î”V½êϧ3úßÁaÏXŽ;*¸úâÀ™¿3ûZ\AJ½Ò ÒêÞ÷y†—a´QÀÂ;’o{ˆxbotan-2.4.0/src/tests/data/x509/nist/test26/int.crl000066400000000000000000000005171322470703100215710ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.04 990101120100Z 480101120100Z #0!0 U0U# 0 €Œ9¼+–©0  *†H†÷ W–×íkòÅžHí_þe;òÙŠ;´‰/L¾ê9Q6^oû3Cù“O…ÒC(C?CIDh ›{A;ÜÓ&3Z‘_WZ>ú1î_S1ãeï%¤ºë±úÈÞF±Ô$0ôø*­–9ÙÒúó7W„½×Ü×üm*cHed’¢¦botan-2.4.0/src/tests/data/x509/nist/test26/int.crt000066400000000000000000000012261322470703100215770ustar00rootroot000000000000000‚’0‚û 30  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.02.040Ÿ0  *†H†÷ 0‰ßæîh¸d%BgM}Ζ]Ñ\¥¦¶¯š¯ÕJ2g·’Ÿq°ÛQ¥p–øVNCŠÅ¿HÛO0|a¶€­ìÈÂëe'û±j5èCÚ¦a_«§WiŒÁRçë¸L‚gÉîØ„Ãçl.=N‡@M¿lB%i0÷·Ø_¤=<õ¹º†Ö¡Bm;£`0^0 U0ÿ0Uÿ0U 0 0  `†He00U Œ9¼+–©0U# 0 €«šëùÂçT0  *†H†÷  y˜ÿMǾ8ÉW³ÝSí™{Þ ‡žX:ư:ã¼ixé,UpW*j¶9Sj Y;`ÛeIJ¢Kdåª1ª.Ò˜zÙ;k^êKÿ!-ø~JYÛä.F ‘òÂo%‘Ï/ê<½„ÑlWMð›Ý£Ó¹MªñݱðÁvߤfÛbotan-2.4.0/src/tests/data/x509/nist/test27/000077500000000000000000000000001322470703100202735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test27/end.crt000066400000000000000000000012121322470703100215470ustar00rootroot000000000000000‚†0‚ï 60  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.04.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.04.010Ÿ0  *†H†÷ 0‰ÍJÚ(gH‹¡Ä ºýé ¨9h_–T¡àzv}«£¯[¸Âéñ§êŽxÄU)N¡›¨}N ¸qS×™ÏkRõ3a3Å5&!Ÿ¢[å dKó4õÚLQ< ö1MÙñöj/&‰zøßŒ>ÁâæñT â2F£‰ìÂ¬Û `±I–ÊÙ£R0P0Uÿà0U 0 0  `†He00U NÂñþõyÜ0U# 0 €lË™ïz'¹›0  *†H†÷ x§íÑ<ý½óB‡Z*´ÝZ!r._΃¬Mç}ÑO^гôž^Œµd¼—¯Jg×&²„¥òK;‹ášÎäáþÖ"ù®¦/„ˆ[œÊW º^ ¢½fæ k,|«pIbotan-2.4.0/src/tests/data/x509/nist/test27/int.crl000066400000000000000000000005171322470703100215720ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.04.01 990101120100Z 480101120100Z #0!0 U0U# 0 €lË™ïz'¹›0  *†H†÷ 2NƒG;sÔ …œZõ( [Œ²ðÆÔ)•ýž!ÏÿÍIUµ~S¬@¿Š5"ØÝê霽0ó2©iÝ2}ݨ‚S¶ÿâ*"$Ö}Ñ’Rѧ\uŸ€d)kFoÑíI:¤k>€N®¬çѾp†ò6ÔÄÆêVü@nw9Ê ¤botan-2.4.0/src/tests/data/x509/nist/test27/int.crt000066400000000000000000000012231322470703100215750ustar00rootroot000000000000000‚0‚ø 50  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.04.010Ÿ0  *†H†÷ 0‰Á´Ü)¯ÒÙ]‹FÐ)õ6õ™ß3vÿ&ý¬tîssðd°îÉHøË±õÑ/¹Xµ×Dï^ï9Næè »ø02¥»ëHþ»niÕÆÃȃÄП;² ²Ö‡9%›5ü‹>°ò”cƒÓ{7øAÏgö´XÞ^™~Ù2HH‹ëí‹I£]0[0 U0ÿ0 U0U 0 0  `†He00U lË™ïz'¹›0U# 0 €«šëùÂçT0  *†H†÷ …¤ÒslZ}ÓÿAÇŒ›Ö þ¶IæàÒ–bÁÝrQÚlo…£7`á×¥;Q]!Jc{XYW©®÷s£è…@å~"åškµ/©°)ÖgmqE¦o&Á“B‰ñ¹ ô•1”ÉoãLSÚ€Œ×3Ù¥ùªz`CPòv:Žúbotan-2.4.0/src/tests/data/x509/nist/test28/000077500000000000000000000000001322470703100202745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test28/end.crt000066400000000000000000000012121322470703100215500ustar00rootroot000000000000000‚†0‚ï 80  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.05.010Ÿ0  *†H†÷ 0‰¹\R×»óžò7¥S;a×Op«6úζ›‹9­K.?KxÑúûÀ³E™Ì±Kmù´F¨"Œ’Ô ‹-[ á+$]i6›éÃ*n@‹¢²Ç‰åv˜- YHL sa§.Ó¶bäÄ5Lô:l†ÊÑÖ{il8muG<¯åœã-9¢[:´°·ñ£R0P0Uÿà0U 0 0  `†He00U ‰x+D\ ý0U# 0 €'`Å·y0  *†H†÷ ‡#ºHþ›­`Ã)œ@e žŽ›Ÿƒº)I)©²ËÒ¨Nºë=J†ó‚t¸œ«ZêÔ"¾š’»y*ô~M=1¨tx$j,±¨–ò¸ ºÌx?D®æÕ¯§&^8–ê92~<²ˆî9ûŸÂéõ³]{ë4v’ÀˆGô<Æ‹œ=¯¼°$ÕJ>botan-2.4.0/src/tests/data/x509/nist/test28/int.crl000066400000000000000000000005171322470703100215730ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.01 990101120100Z 480101120100Z #0!0 U0U# 0 €'`Å·y0  *†H†÷ +¶&cÓã_©UìØOO7÷t¶–ZC&©b…m6­ã¢ÌZÊ]˜wMuæ¡{#•"^Ñœ¼Ävo¦)°‰ùÅg˜jã rÌxó4Ê\l…¶ Œ´õ†&¾f™a˜·_IQøä¡*“KÎ}S?iaº[`n”xÈ8Y…87¹¤;botan-2.4.0/src/tests/data/x509/nist/test28/int.crt000066400000000000000000000012311322470703100215750ustar00rootroot000000000000000‚•0‚þ 70  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.010Ÿ0  *†H†÷ 0‰ÌÝ¥¦}Î̃©gZ:ECÛŸy3¢k¥!J§ùŠ_äáÿ³×KF¨5g)ÕÝ‚Ë6‰<ÿØ•A&®^&}Á ¹lwˆ)Øïz_»èPÄ»ä7,^Ù{Ðþ±\<ÃòíOvOró7V;¸wç5àŠòµæ9`@øpUŸÓÕÙ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U '`Å·y0U# 0 €«šëùÂçT0  *†H†÷ J÷\|¡ÙÝ] ])¶K#tþ¡#ºŸÔö¸²œ„wGl!¤¿ù ¬óZƒï–A^©É‹Â.w™"~ú¡ä4á5_e„ ŽV0›ôü-ˆi¬HÌ¿:Å7¼ñüîµo|Â((ͦÊO界f†‰`m íœX3yCÕ0Ñ—¯Më¤botan-2.4.0/src/tests/data/x509/nist/test29/000077500000000000000000000000001322470703100202755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test29/end.crt000066400000000000000000000012121322470703100215510ustar00rootroot000000000000000‚†0‚ï :0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.05.020Ÿ0  *†H†÷ 0‰ÃìXÓðzšˆ¹èP#ÀxªçM¨t¾.V¬Î;1zömŽÍhYQŽæ#N‡Ý’?È;–ImÚ¸®;MÝÓ¾©Ç;5>«ÎÔånùÀ2æ]%–q—®ø/vwÃyÿ>ž¢7‚í;‘ÛÊ«;‹ÍÀìúzòVÜ®ê$_@5óªU£R0P0Uÿà0U 0 0  `†He00U š &Q93Á±0U# 0 €ôþüE«îYo0  *†H†÷ L*aUt‰‡X¢cêÅ´Ú¥ ‰;õ™„ß[¬%ÏóÏ£Eù:póN‡P9„ÎW¼av½ÓŽtåä@×SMMXÞÏÀ±á–º¦ÖŽÊ&öfÑúÕd¾çƨô-›Ra|¸ÿ¯ÛÐîØûÌ‚rVœ´Wž‹*Hpå{å˜Éú$é¯botan-2.4.0/src/tests/data/x509/nist/test29/int.crl000066400000000000000000000005171322470703100215740ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.02 990101120100Z 480101120100Z #0!0 U0U# 0 €ôþüE«îYo0  *†H†÷ ”òáø#*EÆËB„½”•&9¶;ð t…ý4ÒGœ÷tçþßÔÒ˜Tž^Éê!ýb¸³é8¥ äOÏØ/ 2Q—5:ê)•ÌËlÈ–çÄ×)—Š,âÂåì×E*p"ÀVÆJ6ü<?ædïÛ “œ<$ÀI!±Uç[É\²:fg >botan-2.4.0/src/tests/data/x509/nist/test29/int.crt000066400000000000000000000012261322470703100216020ustar00rootroot000000000000000‚’0‚û 90  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.020Ÿ0  *†H†÷ 0‰«´†*£b,ð'z-ߟÉ`»çšê"Š»¨¡¤èî3ŠL¡9LíœyÁy€ŠY§ðÁZßÚžî*)ÜÞ€N¤ÙI-\·r=xòIVHÑ^Ó¸à‡u5hOˆ¬w¥£ÓZÉLÒWÐe]¾à»ÊP¦ú“kýü„Ô=½Ø¥ÿ„m£`0^0Uÿ0ÿ0 U0U 0 0  `†He00U ôþüE«îYo0U# 0 €«šëùÂçT0  *†H†÷ ÒÀ™`XI¬Ôjþ‘¶ãEµ˜ ®T6‹˜µßÅsDzþJ¿ ‘þR B¨ „&eRyl•KŒó¨<9¥GÄ’Ñk"ÐÇB@+O 6…+eOL2ìv!£!òèÿyPOj ÑÄ}†Tb3½®z3r'“²ÚB]%ga{R‡pR9íæbotan-2.4.0/src/tests/data/x509/nist/test30/000077500000000000000000000000001322470703100202655ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test30/end.crt000066400000000000000000000012121322470703100215410ustar00rootroot000000000000000‚†0‚ï <0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.05.030Ÿ0  *†H†÷ 0‰Æ1u&jî¤Ató³è¥Ða€·)€Y;!}–B¹±Ê•ÛV¯|ªçNEøB9˜ËÍãþj6(œZÄX˜ XÐ h«E¾IïŒW¦´™ÂÞœT¯ %+4­Àuøtƒ”|]ZŽéGômåżQ­~5ò‹·¡?¿°³ûæm½ á£R0P0Uÿà0U 0 0  `†He00U ;‚-ôÕkä0U# 0 €÷N5¢,/È0  *†H†÷ A‚¬ }Ï;½Cª÷ŠßO6Gš7c=V&3Å䪪‹¹Ó|bóa÷[}OýÄH#» X_¦¿îA•D™D'¼;Á²¯=PÚ¤Nžˆ.Mü!2Iöþ±Ô‹Ý»xÚ•]Ý÷ Õ JÜ:êº\$g7è éNÙ€#tuGbotan-2.4.0/src/tests/data/x509/nist/test30/int.crl000066400000000000000000000005171322470703100215640ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.03 990101120100Z 480101120100Z #0!0 U0U# 0 €÷N5¢,/È0  *†H†÷ $té“äQ°=Rþ}'Q1hÐN5sßÕÚ¢|v²MüXw+{ð½é)#¾Ý<Øüƒ}¬o±PÖè Ï ªW2qg’9äÉ¡b†¹Ìuö´i°µE—|«kì>Õ­‘4dã«|eÂâöéÓaŠ&{·’÷|„‹ÍXZ`À^@åvbotan-2.4.0/src/tests/data/x509/nist/test30/int.crt000066400000000000000000000012261322470703100215720ustar00rootroot000000000000000‚’0‚û ;0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.05.030Ÿ0  *†H†÷ 0‰šèDÒýTò´²ñì/b‹–ÒãÊí.m(È– ¹PRJ!¨šØø@Ô‰Í §l;Mv¢›GY:0ú3' ½rµ±{4dO ·BÙb*;^äùâá9‰:îJÕñ±Lbgˆ\uËÿÚåä´ñ„iýKw Õ,ß…¸«Ì—£`0^0Uÿ0ÿ0 U0U 0 0  `†He00U ÷N5¢,/È0U# 0 €«šëùÂçT0  *†H†÷ c˜À»þLXdoÑ3é/ ¦QæëVQ轋ÌÜçnŸ²ÈÁø“š ðd—ÆìÆQ²ÒFľo“•sxdJÇճͫNlK_e…Ð ŠÎC.@³“9X\åêìr#ë/Ýj³ˆ<‚VS?æÇLKüµ„ÔߊÍ5abotan-2.4.0/src/tests/data/x509/nist/test31/000077500000000000000000000000001322470703100202665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test31/end.crt000066400000000000000000000012121322470703100215420ustar00rootroot000000000000000‚†0‚ï >0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.06.010Ÿ0  *†H†÷ 0‰íU:]¹17ôëÂ΃9:l¡ðÅîœÐâÞ”bá#»þ£}%0×¥üË=Æ‘hã!$‡ › ë Vf„M]ÃˆæØ‘6Gƒ•]³( W(,‹š¤†±<@Òüc6òlêØe„•ÿ€ˆ I¾NŠô£XÝ&ôK™ë×£R0P0Uÿà0U 0 0  `†He00U =\g}Q•0U# 0 €Ô}¢rŸ.0  *†H†÷ ¥95=rzs6ŸDÝe8`Ù0OÝ(Ó£`Ñ»©ÿ —µw$s¦ÊôçÁN½ûvÝ’©Ñˆ](oûXdrƒo lù¸â~Òø_ãpCÓZs—êM“Kµ3Ùö|·­b:£_‹/3÷ ?à$ È;§k_vCõ}°Ã‘botan-2.4.0/src/tests/data/x509/nist/test31/int.crl000066400000000000000000000005171322470703100215650ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.01 990101120100Z 480101120100Z #0!0 U0U# 0 €Ô}¢rŸ.0  *†H†÷ Ä~?šOÎ;?+Ÿ˜]g¡¿SJ cùÃ9É훂ÿ75]ÜF¢šûå9îâ#õÑÝ¥%ãÉ%‚Œ<žÁwä+«pÎoq¿ã-Ù=>£K}(…ìlÇ\JøMü¤2]-~$lÄë` Éy½Y C÷“´Ì_ ±>_Nô¾¥Xbbotan-2.4.0/src/tests/data/x509/nist/test31/int.crt000066400000000000000000000012311322470703100215670ustar00rootroot000000000000000‚•0‚þ =0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.010Ÿ0  *†H†÷ 0‰æºÒý=Á-{×0@Ð- Ö·B:ÊË6òb¹(Ãw9żúY/Ñ©JýÎÀÅ’zNXĦ¬É^Ú>¿…V6޵¹ ¥ K0çrÒÆ†×Úqß‚•¥ $¦òÞEœ’t,)Ñ5®›XGò[óèå58›¨è¾ÉxL¾4ˆâÒ¸¯x3£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Ô}¢rŸ.0U# 0 €«šëùÂçT0  *†H†÷ j5Œm3/ÈÒÙU#ðL¸ˆÔ¼ò矽ØEàæ–gÈÓp7WbeòEˆë=a ÜV¸4Âàh2–fÆ$9ÀãÂ>A¿E±OK¦³C[› K±»¢_ÕöôìT³ÊìÕ}§@ ¹c°sæ“y-ð¿ŒFö‰xätÞQ›À*OÍlÈŠbotan-2.4.0/src/tests/data/x509/nist/test32/000077500000000000000000000000001322470703100202675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test32/end.crt000066400000000000000000000012121322470703100215430ustar00rootroot000000000000000‚†0‚ï @0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.06.020Ÿ0  *†H†÷ 0‰ÉÎ_~5ÙüZÉèˆtmë–héšyí‹Â)G¾aúòJ «]Œ ÜÐŒˆ|š*1 |=Vn+YtfLAžÃôöM=5rÄ £û……‰4mkÇt;±é0i±Ày³:0ÕܑرO!«¾ÿæE ÔdH"^Ø Lj?r¨ºµ‡ù£R0P0Uÿà0U 0 0  `†He00U `7Ó„HÍ/o0U# 0 €î=‹;Pœ°N0  *†H†÷ &!Ó 2Æd®KË» dzw’Ôá‰ü°·?› 5¨—ë\dåÙwJ¼¦¸”˜–3ŽHè†ïKõO Ùa#Ð iØœ[ÂÌà½ê§.ÿa^wð¿ša'§q?¡¤Jx.àAXÌx/ç¦ï錸ƒ7û.bv’Þhb]0™botan-2.4.0/src/tests/data/x509/nist/test32/int.crl000066400000000000000000000005171322470703100215660ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.02 990101120100Z 480101120100Z #0!0 U0U# 0 €î=‹;Pœ°N0  *†H†÷ %èûÛz•· ¼$Ïo¦ŸN‹2ui¤õÖnÛêŸCy˜GAñ6ïX<åÎ@pk¥ “Ê%Rc׈|L)»‘æ¥}Ô {am…dèg Jïƒ-I*ý˜I83%%üÈ6{™²peaÕ+4ò¤iѺÎËZ¾DG‘¸ xí?»q—botan-2.4.0/src/tests/data/x509/nist/test32/int.crt000066400000000000000000000012261322470703100215740ustar00rootroot000000000000000‚’0‚û ?0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.020Ÿ0  *†H†÷ 0‰´&„ç=¢?=ž –×m8cpA*|îÛÇ.•²å¦Ÿ›‰Æù9WÐZ퇼y2_Ùh±³T¤rE5Ñ8éðùªŸèK°§ÜÕÀÑÜ 'Õok9êµ›LŽÝRÿ!¯ÛÎobÊOÜÑ®¤¯Äk3qTÂx1I0a\õˆ¼—U£`0^0Uÿ0ÿ0 U0U 0 0  `†He00U î=‹;Pœ°N0U# 0 €«šëùÂçT0  *†H†÷ }r!Ò†%3jZ€³Næ*N] jû_ª&Ï‚‰o†ýy¦ŽÌ:ÉT"ÛìèÈbÑØÀÓÂí&sÐÞ¹÷Ùé›?üÒ¥Fî¸û—*ê1MÐpâoJ•)ãw<†—=¤×vz'i;vÊBdpðÞ¢Þ¯ˆ¶%Š£fbotan-2.4.0/src/tests/data/x509/nist/test33/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test33/end.crt000066400000000000000000000012121322470703100215440ustar00rootroot000000000000000‚†0‚ï B0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-IC.06.030Ÿ0  *†H†÷ 0‰¶pøjovW†–gjgüÄ;`Ô ®Ë” œLÑm˳¯“µ[†é¢ã¬üH]âõÀ´µþï@Úw 4\Xbù±÷â˞ݲ߽;;àÇ-Oª™8ŒÌ* açñeZœÝ£ T÷ŠÂÇçCИ{áêÒÚ‚Lމv™6Žüªw£R0P0Uÿà0U 0 0  `†He00U $ç² {ß&Ð0U# 0 €§%ÀmVúÃ0  *†H†÷ %¼õF*[[«®ìŸØéuŠ®Tå.=’öø½¢4^È$kzµ]Gd)¹Ý ª“¨8¸®ð„n4ï+\gˆ\TEïå´L©£Ä+`tV´@Wòå>DiúÉÍYvB^hJƇŸœ!|€šˆ•úyL¦ÂˆÄUˆ¿ dµ7IÒª½Öbotan-2.4.0/src/tests/data/x509/nist/test33/int.crl000066400000000000000000000005171322470703100215670ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.03 990101120100Z 480101120100Z #0!0 U0U# 0 €§%ÀmVúÃ0  *†H†÷ (*{V&5q¨×¥¸Â"§¼Êýñ$#6 {FšW^ÅxvyöraFÛÕyË?‡ ÒSÁ¡a­—È1ÇhJÝ~ÙÞT€¶}vXRG8þSæ-™‡Ì%€nãÃДX#7i‹ mr›lQõDa/û²ÝªÕþh|€~»ð® Öžbotan-2.4.0/src/tests/data/x509/nist/test33/int.crt000066400000000000000000000012261322470703100215750ustar00rootroot000000000000000‚’0‚û A0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-IC.06.030Ÿ0  *†H†÷ 0‰®RÒµcƒÅK-Jˆ«îÓj¦³ÀÉœ“ÇQcÀ%oG…~w¨cþÊ;èßà¢Q_³ ¡v靖¯š:ç£{a!¤ôcî'nR\®Ñ'**ÌoñÙP,Ào}UuCfydAbBr&±`‹¯ÓÏÅ ^i‹Ï+dÒ„ÛS£`0^0Uÿ0ÿ0 U0U 0 0  `†He00U §%ÀmVúÃ0U# 0 €«šëùÂçT0  *†H†÷ ¨˜T~«×Gåæ¡¾ }ø³òRÞK´u¸q4/©CNX@.paJIަƒ Ì{ôU×q;Ù¯?yÊoˆý8_™­å‹­èw„õokõ.&}bD¸gi¯íÆÇ¼ãâ O›Æ@ú[ -ùÄÑÈa $êCžÛë{oD<ÙiãñJ3ždbotan-2.4.0/src/tests/data/x509/nist/test34/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test34/end.crt000066400000000000000000000012121322470703100215450ustar00rootroot000000000000000‚†0‚ï D0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.010Ÿ0  *†H†÷ 0‰´M-p¾þyÖ Á?ÒXÃ>)uËÏNÀùNäÔx/ ‰$–¸î/™¹ümùŠô&¬#eêè- ÛüY±åìÈ >íÃÒ§#DžeågE±¨Sê õao)a†9‹gƒRB°Îë s"6;wΙ.PeôÅ”nZtH¾Q äž+íC£R0P0Uÿà0U 0 0  `†He00U {"ÒÕZN”0U# 0 €;U:ôt0  *†H†÷ ½žI —ä>ø?rU¡«û~×',lã*0åîX3ÒןZ$>×ê=jÙÃÂ=‚£ßl®—…äG­¸i¾ž²–&½[Væ)ööw¿$$—9áwqð¤˜òçO"fH´zeq¾wLï ¸÷('ùÖç÷Vp¿B=u™botan-2.4.0/src/tests/data/x509/nist/test34/int.crl000066400000000000000000000005171322470703100215700ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.01 990101120100Z 480101120100Z #0!0 U0U# 0 €;U:ôt0  *†H†÷ Ö×1JBP§l˜`- =ê;Fí wÑ“‚ÖÄFÙ@åh>Úº@ŒKúÝÝjd€à¥çîPÔóæÍÞjÇ´Ž¢ÉamíëêØ¡¶Io7dsìéQâµ½W ”мOÓ^9œÇyBôßðùÍJ5lØ,Àu·ÏôZ¨tL“‘ºbotan-2.4.0/src/tests/data/x509/nist/test34/int.crt000066400000000000000000000012311322470703100215720ustar00rootroot000000000000000‚•0‚þ C0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.010Ÿ0  *†H†÷ 0‰ÑI%X\xòtÀž‰ýwĉo›gvdòk0í9oVœN¢ÝêQmé[K 3ºÝbò\˜ŸÓR s'¡ $¾2Â’ÚãJ±1.y¥0¯û uª ¨OîŠr—ß”ù ¢Õd#ÓXévh,d° t:¬vï~Ý팾]yu£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ;U:ôt0U# 0 €«šëùÂçT0  *†H†÷ pu•á3ì/ˆ †Ö€‡õøä³0ø´›àš®G±  !ov'4~ľò «ÁüÐ\ «LcâÔ1À ²'^ëËÕ<ø f+P&À¶ "ËÓë +O!riÀ]â;©¤JzŒë("Ѹ3\2A”SIðd¡n"gbotan-2.4.0/src/tests/data/x509/nist/test35/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test35/end.crt000066400000000000000000000011621322470703100215520ustar00rootroot000000000000000‚n0‚× F0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.020Ÿ0  *†H†÷ 0‰Ðp“ÖuŸ{í@1è ©]ÏSàÅýOÓ·¢ÛµHy|Hõmyyy¿jªÊ‰xT,¨ßê5å"Ùð-­DYîm6¬Â¿gu0s¤[“(öhŒéŸ,(\ía—ÅÈ`b4LM=2iEéëH£î/þª.ú—šóOÄVý‚4Çý¬ìüÇM£:080Uÿà0U [_ÁD&ÞÝÍ0U# 0 €¡2••Ÿ 0  *†H†÷ <˜6â®ð OV\E-Èh{»q†LÀ¦EL ŸFù筡ß@™K«§t+ ÃÉ«LÐPŹI™óÕ:úóoì•‘7ôç¹B~ •-7öÛmTÊ }êDDO¨8“1Ńbotan-2.4.0/src/tests/data/x509/nist/test35/int.crt000066400000000000000000000012011322470703100215700ustar00rootroot000000000000000‚}0‚æ E0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.020Ÿ0  *†H†÷ 0‰¤AÑ;çgSkû¶ª@ÙŸq &4· †JÔ¾ÔfÔ ka'•éfæò$†;Ý'±{Y›:¢-–|ȼIý8botan-2.4.0/src/tests/data/x509/nist/test36/000077500000000000000000000000001322470703100202735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test36/end.crt000066400000000000000000000012121322470703100215470ustar00rootroot000000000000000‚†0‚ï I0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.030Ÿ0  *†H†÷ 0‰ô—O—ê7ÓñÆ8é­±äëË" î§­ª ^f(ºF¼ÅU>1õÓTBÿP*:HÿóéþæiçR€åôeÐÊC›¨ ;Îf°¯ž‰ïi-\[UÆŒ+–£Y’Ô£w9”³åDÆÙÞï\æb魉·Mö­W£R0P0Uÿà0U 0 0  `†He00U 2šZûfÒh0U# 0 €-PÁBÜÈö0  *†H†÷ ŠDP n‹GÑV",'ÏVÙЬ~­–Pˆú1±Ñ èÜ,B{=>òúðÝ0ìM!?èSk†ë!dHÜd)Ô’q±ôé$I%jãƒÿ¤k”ÇX8+"ò ýCë>–/ÿx^¸Ç X*ýÚ]÷sÓ!O¤˜ jËC¼‹âž·çã!Pbotan-2.4.0/src/tests/data/x509/nist/test36/int1.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.03 990101120100Z 480101120100Z #0!0 U0U# 0 €L˹A¹õ n0  *†H†÷ É˱¯;ò؈˜|Yô àaÄ„m"~çjÉK¦ºø‡&B f“ðb=°–Øò‰¨Î°ÀZ¯&•ÃìƒkÚU7£àM@#Y— pì²ÝÍ3kžsV9˜užw&fÞCÖ{¶4ÃÌ\ýr/‹x‚ª\ù9rÍ%ªñÜau¾Ø¢Îbotan-2.4.0/src/tests/data/x509/nist/test36/int1.crt000066400000000000000000000012311322470703100216550ustar00rootroot000000000000000‚•0‚þ G0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.030Ÿ0  *†H†÷ 0‰Ëýx ¾‡¬ÍÀ3f£žý@·›¼ÜfÿE÷~þŽÖ2ø[uÛvðM!šnO!L~¡ù=¬‹vD{Ä雓€*dƒnjÍØÔ#ÝÎË;µêÚ+@­©M—XÏ`¯‚”0G·}ˆÃvÀ—´jY~÷†]دûrñ¸\*5§žQÔ®Ç\eêõ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U L˹A¹õ n0U# 0 €«šëùÂçT0  *†H†÷ ¸)ó]±àó³Èa„[(—(2€ÜÜ«±¤Ö’nÙµØ4¦{󙢹œÿ¹(÷°’îïS§»Ndò‹[c64veZ¢ÐƒÍô“§<:¨veÿ+‰/œ*½&Šiã[W*còý3¡ÒX†mÞÄ8²–}J¹üWá¸N=é¤rJbotan-2.4.0/src/tests/data/x509/nist/test36/int2.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.03 990101120100Z 480101120100Z #0!0 U0U# 0 €-PÁBÜÈö0  *†H†÷ mÈÔûÉz¥(¤ð÷.#5§t?ÃË‘|åoa=%Ù qîã>ãÌ ÷ÀÆ{“—yÉY‰¯Œ¦"y»z†×8h/V‡¯äjÈšã‰b‚ãúÃ蔓÷íSž&­‰ô©ë÷i(ßübí¥À¼-ঠþÛFïĸÁu\õšñüßÇô®botan-2.4.0/src/tests/data/x509/nist/test36/int2.crt000066400000000000000000000012311322470703100216560ustar00rootroot000000000000000‚•0‚þ H0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.030Ÿ0  *†H†÷ 0‰®ÔZ¾€lþDŒ¢­4Œ`vØ0æÛË»J·Ó'ä³ò>/ȉd92/ü!·Îd!»Ö]ºZ—~t¨!•M¶Œ–zb÷Àø[Ò÷¼ r ®¼ö”:g—ò0>|¥‚Þª±Âxní1ÖQµ}BFY!„xÔ‰}Øu䉳£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U -PÁBÜÈö0U# 0 €L˹A¹õ n0  *†H†÷ ”EN©wy5;Á=%ûðI†Q¹‰ jp,9¢EfÅÏŒ³Ž]Aíuÿ0l®º£r—\µÉj²ŽàÉð©U= Ý‘gûù›:9ÃñtüÂZÂî%êÏ]ÔYÜÂtD@Iö$¹[’VD4ÓäW%n Άz½ŒŠ•£ÖƒœŠÿL2‡botan-2.4.0/src/tests/data/x509/nist/test37/000077500000000000000000000000001322470703100202745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test37/end.crt000066400000000000000000000012121322470703100215500ustar00rootroot000000000000000‚†0‚ï L0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.040Ÿ0  *†H†÷ 0‰ë_ë“ÉՌݹŒOË@%ü™1Ô™`C e%>»ØÈ‘ùŠDR¿tRÕvFà–®¼ §5®AŠ`Ž™T‹ï>sßiÖg³Ø¹HÎKdT¾k’_mÒ%ß^l(|j“Àn¾V Ñ)q?QÎ&ñ7@–D:¶¹{9Úç(o©L£R0P0Uÿà0U 0 0  `†He00U â#h22¢\É0U# 0 €¬ë·ä4)0  *†H†÷ ˜èéØK©P&‚1Ÿˆbµ~OdrArµ;2;¢‹ubÿnežb/Æí‘9ïÿ²UP&áÈóH ’À K¹§~N.Üš`9nÎv)bI}­'n©U¥2RA’÷Þβ1XËØ…ÑH)yjáq¯= F•wk¥ðö8 Í÷–botan-2.4.0/src/tests/data/x509/nist/test37/int1.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.04 990101120100Z 480101120100Z #0!0 U0U# 0 €Õ-ô~"êL0  *†H†÷ ‘¸y²Ÿ¼HC@»±¬.‘ïþ¯&$· ¸@þŠžoÆÌ/R%[Êã%îEOçÞ‡²›±, 1DÏ¥jáÓ®ñpµE޸ĉ¼¦Î&LAóùÈæFDƒ>Õ„ÜÜòÛþÏ·Ô•¾ÂJj ,)Œ­ rŒnØŠ{ÕL¶¶êbotan-2.4.0/src/tests/data/x509/nist/test37/int1.crt000066400000000000000000000012311322470703100216560ustar00rootroot000000000000000‚•0‚þ J0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.040Ÿ0  *†H†÷ 0‰½ƒò> ø„Ÿ}p’+%Cõy°ïKÍ“§q‚½ÞV_rFÔÃÒC1O70ËIͳ²)@Ó{ú«ìëàÔkEl`wàь᪤£1ÿ¹àN} "®`ggŽÇA[ŒVô1ÄqåCK© ³ÙEpÝ–úk‚oߤ?EÎ_IHÏíÅÀ+£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Õ-ô~"êL0U# 0 €«šëùÂçT0  *†H†÷ Ä÷´¼Í¾Šæ$±y2Äí¢‰›|1€6‚èÊ?MdCë=À1äªçÿBu±š5Üͦ͞TÛ¤Ñý_C’ÛnH$^&\Ú_‘ˆlÏÿ£4ñ£F“v§B¾k0Añ¯ÛŸßY:X'rÿ¾½‹Y°(þ‘¦˜vžDrao Àí äubotan-2.4.0/src/tests/data/x509/nist/test37/int2.crl000066400000000000000000000005171322470703100216550ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.04 990101120100Z 480101120100Z #0!0 U0U# 0 €¬ë·ä4)0  *†H†÷ Ž•(](ô~Ö›Œ5$A¬Èœc¡IýTý†pfù•ú÷«{傸/jw•öä5dƒ5€ðJúåãHÄ( …''!@m·­Áœ¸2eÍ2~óÂ×N±]šK‡JŽaAL˜³×WÇ,‰Ô3>ÕL’ýƒßüâE° b>/ˬbotan-2.4.0/src/tests/data/x509/nist/test37/int2.crt000066400000000000000000000012311322470703100216570ustar00rootroot000000000000000‚•0‚þ K0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.040Ÿ0  *†H†÷ 0‰»`+Më´¿"Ó³i!ªN÷Ä7„‰t¡½þÑ·Š’fÒÁAPJ{û $Bw%v_ãœ)¢YB<”ÆUˆœ©YòW|f üWh¢ ?šE² tbĶÌF”´“.êì·F³6qoíÆ¹¿-{týÕæˆë.}"6ìF¥I£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ¬ë·ä4)0U# 0 €Õ-ô~"êL0  *†H†÷ PŒÿ1':+—š <²F€‚n«HûÜSþõÕ¿FÒ«³¦*¼LøÎ¢åyÚ•†}¤Î‰®Fà6û‘Õ‡ZÃð}9ÓÌ®…¥ŽÌ"ùB>´üŽ"³–¾8$óg$x·¢CÇmSídt[4MÂj™ïîºâ©s·¿pñ¿o\>botan-2.4.0/src/tests/data/x509/nist/test38/000077500000000000000000000000001322470703100202755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test38/end.crt000066400000000000000000000012121322470703100215510ustar00rootroot000000000000000‚†0‚ï O0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.050Ÿ0  *†H†÷ 0‰¼Ÿaо‚Ë·BQ µŽÉJBsú'½dkÀNï0ŽïŽ©èGÉ—u`ÖæïCïUæ–ÿÈpVŸ\é€QœºêŸÈ«Áb骖î%\¾VJ°ê¡ Ƴ ø$W? v;.{¨K¤ªï¤ s…Ä$ð&ÄÚ۠džIöQ([£R0P0Uÿà0U 0 0  `†He00U i]Âwÿ7¯O0U# 0 €P¯ˆ‚˜˜0  *†H†÷ T•ó‚ŠÖ§z­×¡œ¼I1ýGg¢nªœ¨B<ÖXÀÝ) ˜Ì^ð$2bCºù ‘ÚT]"1 y%gñ>Ó= :˜U/DäÀ‘ænt¯o5$%‡—<#ûj 8nîHßg(ÖqU¬ݤeâÅôÔÔ`â¸|Ñ>h’{šÌ>1\1öÁbotan-2.4.0/src/tests/data/x509/nist/test38/int1.crl000066400000000000000000000005171322470703100216550ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.05 990101120100Z 480101120100Z #0!0 U0U# 0 €ŽÀ£šÌØs0  *†H†÷ dŒÍ¥tüôÊeBpÊí‚¥­ ¼7¬O›Q®˜“%4h•u£Iñ>º9¼¨9a>³âüç­–áà•ëéºòص–b;©&Ư°¢¾¹tQÉ ¤?ƒã¼¢ H×lRK ÿÊ[Z_mu,5hóW™9fËbîðÆ=¿¹ºbotan-2.4.0/src/tests/data/x509/nist/test38/int1.crt000066400000000000000000000012311322470703100216570ustar00rootroot000000000000000‚•0‚þ M0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.050Ÿ0  *†H†÷ 0‰ÅÌA3Wü”äH:çòª–s*–3å£ò·À 0#9´Lû\WöÛ·­7iGØ +oNÑS†ÓKeþS`$íNDìù®¶AnÇð|‡‡ñ ‹¼3ì?Ž%Ó_¿¼v$Áó’cøpK‰ ƒðXž»'R/]‘f^? |Ñ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ŽÀ£šÌØs0U# 0 €«šëùÂçT0  *†H†÷ XÅtçG0ÒW™RO³ºß`ÿ[ÿ,r­&«ØÆª:ȲNô”jk“Žïº‘WÒ-é@8$vàD,^vLÿ”*ƒu›ý!I]`ÜwÖAh!ñI‰~cá¸ÕˆnPTŒgˆÍ ‹sß½Ëø€Ä³é-ðq3ìÖ/׈åè­i¼¤Nbotan-2.4.0/src/tests/data/x509/nist/test38/int2.crl000066400000000000000000000005171322470703100216560ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.05 990101120100Z 480101120100Z #0!0 U0U# 0 €P¯ˆ‚˜˜0  *†H†÷ •:‡bÿóѯ Õ5+UmlsÌ7òÀQ‚kXRÔJ> ÿùÀ¡¿!Åo²Êã~³©T@ß×N®îÑ"ñ¼ˆ±5+–e%¢æû¦7c€ï´±;*˜,)Á]7yµfÅ?îv6“S18­ CÕõ‡E¢4g„/•ʱþÃ3Sšbotan-2.4.0/src/tests/data/x509/nist/test38/int2.crt000066400000000000000000000012311322470703100216600ustar00rootroot000000000000000‚•0‚þ N0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.050Ÿ0  *†H†÷ 0‰™ÍØþ‹‚»F27(L6¢=Zß`cÔN_ZÄ– ’<“û–°N‰°!Jf“¢¸nD„f…Üa¸jÝåG)èm(dºd5š >+)…¬#·y’ù«RÄÜäÚÎ ƒâBn+`Ú²/ïùmev¤•Hmûë5kCœ]Œ5å£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U P¯ˆ‚˜˜0U# 0 €ŽÀ£šÌØs0  *†H†÷ kw>Ð:Ü«¸–?²¾€NŒÏýM "Îâ­uŸXZÖ'²ŠûTÇ2X›™˜Ø†Ìí+Sù®nª/¡ÀË †´Dö)ªg^œ‚#(š¹d˜ç¢_XXƒïu¬¨•}WJýoÓ™ ¾fœsrý$3ËÓâLËç"b[òY¼\botan-2.4.0/src/tests/data/x509/nist/test39/000077500000000000000000000000001322470703100202765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test39/end.crt000066400000000000000000000012311322470703100215530ustar00rootroot000000000000000‚•0‚þ S0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.060Ÿ0  *†H†÷ 0‰¾#$Ãh1×}³nÎÏK­RUD»à?IiZ¼vØtÄ\ðÁ鉫؃*m™YஂsÜGC9ªÂHg ì9œHLÃŽŒWzbKë8v¶üCR‡yEû§eˆA§yÉæ’©5¾¹¤¹zD#F’{I¥Û¼Ã‘–o£c0a0Uÿ0ÿ0Uÿà0U 0 0  `†He00U 1ÿÞG&¤+0U# 0 €Ò‰2a£0  *†H†÷  GD82>â¸uϦÚ±Ô­ê±ÔÙÌìh +’I5iÈè46ªør´TÞÊPŒ ²aßá§Âä׸—é÷UÿÜ(—@ñLhZ˜â@Òäeï¯Á+‡PIE¹cÍð=ð$GËè Eå Zôq-võÙf Å7ð Ùbotan-2.4.0/src/tests/data/x509/nist/test39/int1.crl000066400000000000000000000005171322470703100216560ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.06 990101120100Z 480101120100Z #0!0 U0U# 0 €}‹«JRÃÓ0  *†H†÷ D¾. ›ßqØjtßÁOáXCt3»›ºd¼·£CÓ©y$Ø—v¿ŒÙO7cܺ¦WOYpKúb‰dœ×XÐô©KUá³™õ!>ž9ÍeA99˜ÇÿΡqB¦/ò·Ã“·AŽ.ÐC4¬¾f¥L`§ y”'‹$™’k@ Ø|ƒônbotan-2.4.0/src/tests/data/x509/nist/test39/int1.crt000066400000000000000000000013021322470703100216570ustar00rootroot000000000000000‚¾0‚' P0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.060Ÿ0  *†H†÷ 0‰£x0iã»êµåvÀ˜“°‚\]œFDêðiT›;˜yî‚é;ùFó1¼õ½ƒZ3Ŧ† kÉ{Îý^¨5YƒrBî—p§C»Á0ØÝ!€‰Ñn{ytL÷êí²åJwóþP±u…g(Ȱ±ùÏÁ¯" ÊÉb£‹0ˆ0Uÿ0ÿ0Uÿ0=U 6040  `†He00  `†He00  `†He00  `†He00U }‹«JRÃÓ0U# 0 €«šëùÂçT0  *†H†÷ æ\RLݵ ¸Á§f„ùMhLýŒ¤VP=jð¥¡e‘uˆ$;¢·T„ê$÷OÄ;µc¤Ìç s†HœÇf¡[‚°ã¬1ùÖ-;ãÿQÌø½y9®Çû!,n/fµbÎŒeõ Îõ¦Ó3øÕðÈ"Ô€z-Õ šÚ,`smbotan-2.4.0/src/tests/data/x509/nist/test39/int2.crl000066400000000000000000000005171322470703100216570ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.06 990101120100Z 480101120100Z #0!0 U0U# 0 €ÄeLL™¥Õ0  *†H†÷ pL«²áV­ èÞ_ÃÔé5¸–¦•Kc«nY™œ½À$±u–YB—M3—Ú„`Î[þw}_ [™}Ù»"Ø?å@ß5GPv.Y¥½ËláL Ô—s×â—’P¢Øh5_m ‹çl­¡9:ÑÖþ6n:äñs:rÝî5¬Hbotan-2.4.0/src/tests/data/x509/nist/test39/int2.crt000066400000000000000000000012631322470703100216660ustar00rootroot000000000000000‚¯0‚ Q0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.060Ÿ0  *†H†÷ 0‰¼ º˜Qþ7îÚ•@O–Š˜B5˜¦$zï!’éñåväØ.*}FË 1øªÃTÌú "d0äÍH@룺™qŽ¥qËŽhtú]õ:ÀÿíAKáÏrɯ&ˆ.#å5Äñ˜¦èÌÖëUG!i™JÌS¯Y@}ÝÏñQ£}0{0Uÿ0ÿ0Uÿ00U )0'0  `†He00  `†He00  `†He00U ÄeLL™¥Õ0U# 0 €}‹«JRÃÓ0  *†H†÷  &Óêc›‘8Ÿ¶A„Þ’wÒQÍ ¸÷ýÉà"üFO9Ä2Ó­Þ“„¢û]¾½NÑ5ÝÌ!š3ÖŽÑ¥dè.ùÕkNæb‰wïŸ.§á„•[óGï/ް S5‚:›Óy;«’`µ>®t½É)¨»oÑÅ…¹§ò×·®1Q¦A¿Ñbotan-2.4.0/src/tests/data/x509/nist/test39/int3.crl000066400000000000000000000005171322470703100216600ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.06 990101120100Z 480101120100Z #0!0 U0U# 0 €Ò‰2a£0  *†H†÷ §{N}‡ ®Sd£ÎøîJÒ À—j\Mh†v×ÓjVk2Û‚öõ B­ ÕíBô-áB\ÛåæÎì˜IϹ™ç²¡ÍÞ›Ý(J.yÖ5¤ùÒPú×+õ Åchýg÷ÍÀE±vlãàÌt Öã“ ‚WŒÑM¨À¨+Ëmbotan-2.4.0/src/tests/data/x509/nist/test39/int3.crt000066400000000000000000000012461322470703100216700ustar00rootroot000000000000000‚¢0‚  R0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.060Ÿ0  *†H†÷ 0‰¬B¢1Ѭ±¤<5Ûœ–òµ¹¶Í‘|¯¯DCªqŽ£$ãÈËg~|mÉd#Au©Yb‡îMcô­ê¯¨j¬?‘K{šÎðÁ©Y§Ð‹ »¦šDš0ð€u…Ûƒ`šC2±Ñ¥õélm‡ÝüÍÕw—ü!Q˜CΆȭª®lˆs*™_£p0n0Uÿ0ÿ0Uÿ0#U 00  `†He00  `†He00U Ò‰2a£0U# 0 €ÄeLL™¥Õ0  *†H†÷ «ý˜àß_†Ñg‡ÅLªâÚºÁà¬i:´‹Ì©îÈíNæ8åÞô¥!ÔPgÞœôþ–ÁbÄ ¯m¿Å¦´O*žiŸ+2‘¥¼¸,/_[¤ˆ>HÅ8ŒìÝRËËçW_r'g®3(½´Ê!Q¡Çœ¬®8fÈ»botan-2.4.0/src/tests/data/x509/nist/test40/000077500000000000000000000000001322470703100202665ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test40/end.crt000066400000000000000000000012311322470703100215430ustar00rootroot000000000000000‚•0‚þ W0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.070Ÿ0  *†H†÷ 0‰¿Fe`|`AÂR\2è?'j<6Oí©!èIЫÍúž™]ê²Ý1Ëy^÷ Iå¾§îØ÷þ5L¸rФ¤NfrmÚ=~NkOºWª¥ýCgJ—)Ër/r¨öpFv/ZèþĨL3¡<Æ=~%ÎÙÓûÌN>©Þe£c0a0Uÿ0ÿ0Uÿà0U 0 0  `†He00U ÿ.{ÚWÑÈ~0U# 0 €P2®îDC½0  *†H†÷ 6_st›j­x8þ9=⽇í9+¥‰m‹Z€_B…`²èh54C_HçƒÃcõEc(9uXøUéÀþë—švØŽeZÿ‡Pš[ññNZ(»3xÏ\Â\À»J£á\³|Œ;„¢Åbú€ÿ~‰X¾Oh |~B‡lãFfT`°botan-2.4.0/src/tests/data/x509/nist/test40/int1.crl000066400000000000000000000005171322470703100216460ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.07 990101120100Z 480101120100Z #0!0 U0U# 0 €/zñ±7Ò0  *†H†÷ âQï\\×qYîäiÀÃŽSœ7VÃMW¹ð`CcÈh1Ž~8TU3«ŠÛçT»º¢*a!z°]-y}YTI¡·äD}-ÑÀg¹'G=Ü’¶k ëòŽÏ½émýX¿úøAÉŽÑ9S‹ýܨ]åúzú"a¡¹ÀâÅ-botan-2.4.0/src/tests/data/x509/nist/test40/int1.crt000066400000000000000000000012631322470703100216550ustar00rootroot000000000000000‚¯0‚ T0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.070Ÿ0  *†H†÷ 0‰ìÝŸÅ~NȪ~Ï1‰LÓÜ[)Xl? û;–=Ýœ=¾Ó,ò/¸p#N|>}í\yoz⌦ïÍe v y¦FˆHWª|”!–b‹ŽT˜È#xÆÕ‹»àïVcÔdÖO QÃ~–öYz—‡ÒòE†P~WLK¨Êžni:‘\ù\=‘G VÑõv Rzõbotan-2.4.0/src/tests/data/x509/nist/test40/int2.crl000066400000000000000000000005171322470703100216470ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.07 990101120100Z 480101120100Z #0!0 U0U# 0 €Iž5ÑÎD0  *†H†÷ 2°4zå×CÉ v·¢PX]Œ×‹Þ3Ä;A"ùn)=u ˜£>¢õ76©.§?¸½R—o˜°ëni®S'Ô«€Ž—Ó§K ½J–ÜtÇÆQ¹0rÁŸÒÛß ‡¡¹ðzA23—g%‡B³<ŒPHeÌÔéLåê‰CŠbotan-2.4.0/src/tests/data/x509/nist/test40/int2.crt000066400000000000000000000012461322470703100216570ustar00rootroot000000000000000‚¢0‚  U0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.070Ÿ0  *†H†÷ 0‰«;ÿ|ÃÞƒ–Nk]sÛ ð€gÇ’|V;ühTÚÂ'søôvÐ[Dãà¡H*•KI¶™<‡T%Óô‰-S« ó™•¿W~‚—&· …ý¬4ÉÉG ˜'µ]}|P çÆ¤³"‚tÿcŒº[JÊs:RúeVú#ƒ Íræ:|½£p0n0Uÿ0ÿ0Uÿ0#U 00  `†He00  `†He00U Iž5ÑÎD0U# 0 €/zñ±7Ò0  *†H†÷ oп­#ȉžuEí ‰tB”55í™/Ôæ³Àup¿G7»Íüùs²Bº\Ý«†æu3VC"7ž³e•ö§àeu­ ™ß ³†.TEmN5Ï4su5L\Jbotan-2.4.0/src/tests/data/x509/nist/test41/000077500000000000000000000000001322470703100202675ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test41/end.crt000066400000000000000000000012311322470703100215440ustar00rootroot000000000000000‚•0‚þ [0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.080Ÿ0  *†H†÷ 0‰ÓXÚz;=ýÃ<Póa[7Qõo^­ê?ê«ç¾YH4îšSZ8y5Áù“=“Ä­Í4üÇâÌÄ®™6F]µ„FV†3Næä±}WþNŠ6ˆçì=Ø1”¨“ \—°‰É§pSQ €‹…#‘^€ŠÔ#Ðf<úä3ïßNæŒÛÑeMa£c0a0Uÿ0ÿ0Uÿà0U 0 0  `†He00U ;TÍ&Õ°j"0U# 0 €À[_d¿*¥0  *†H†÷ 6cý‡!gbø¼ÛQ{Á A½ÐÜ(ÈôìËwù)µCª0üÊ<¾Û:Ö5Ø‘°gžZèqU‚œ8>u>Ò#œÁÒää.Ü¢¯öø¨‰q&rdIO¡o,zÆ q¯(×szÔŠK9¾¾i<Ç‚0CªAt0cÅ8c€à¨å¨Íbotan-2.4.0/src/tests/data/x509/nist/test41/int1.crl000066400000000000000000000005171322470703100216470ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.08 990101120100Z 480101120100Z #0!0 U0U# 0 €\köøßWÊ0  *†H†÷ †Lñíö'Ï7©Zá׹ŠÎüaŸ§üî ‹ÚMsglêìÆ£)üÁ¡uÐÝcáåÔÊÖ̹£–貋$9×ÇÌæLt‡@*pÜnñ„k1Ví›G “ÿÕ¼?U¬H´^ØÑEê‚”û·>r03Éy>’•€Aû…ÆùÒ"([Nò À1”tHÓŸõµ8rÏl¸Ž¯Òõ£p0n0Uÿ0ÿ0Uÿ0#U 00  `†He00  `†He00U \köøßWÊ0U# 0 €«šëùÂçT0  *†H†÷ —í6™,•›1‚U´ÅÁå.>)hã òï?ðÓ¸¹&Œýƒ-‹ úSâM`7^WÎoûh{7KÙ–hiû¶WBêO(º¯ú„á†I?³ˆrR3ƒñEA@ôO½a0‚`Ȧ¹ó­Tsò±ºº«%\Øs½Á©FŽËÆ):ezðƒbotan-2.4.0/src/tests/data/x509/nist/test41/int2.crl000066400000000000000000000005171322470703100216500ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.08 990101120100Z 480101120100Z #0!0 U0U# 0 €/Lr€dàç0  *†H†÷ 7 P°D倯³ÛåQ'FâÓ€Ù2A0™"¹úJàÁ¿…¿~s%|b3!æ½?Ý’OÔ9ÿ6þÎ5`ÈŸ>*Fa…à‚ûŽ¥í_Ž#YþUþ–Tê‡õÝ]€d&íñ#×\X®„ÆœÚEð¬òb•^ æ[†nÌÝ +=p¸æ‰botan-2.4.0/src/tests/data/x509/nist/test41/int2.crt000066400000000000000000000012311322470703100216520ustar00rootroot000000000000000‚•0‚þ Y0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.080Ÿ0  *†H†÷ 0‰¼œ¶\0±Ø+jn Фˆ_í.œ“c½h¯Ýùù»ÿÊ•e°@¢Ô2Ôú%´Q‡dœ:%Zø¼h NÑÿWV°/èUUocÞ‹ß×Q8Z7ï]gÍ䜣zˆ­¤b¸Á±M×®V)ûÈ6êg_²PÁB·hlRç{ºnE£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U /Lr€dàç0U# 0 €\köøßWÊ0  *†H†÷ >O‹ÊÍzŒ¡§ž8G«/~¥ÿã}öþʼYX«¡“Cê€a3ÿHãìYï ‘6‰):ZJò4ª´”+¯Q€bý¢bçGN õÏó(°+O•š…{šˆ\BŸ1h*þ М °|VŒ…–Ü~ Däí)ÜÿãN6|œ\ä¿botan-2.4.0/src/tests/data/x509/nist/test41/int3.crl000066400000000000000000000005171322470703100216510ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.08 990101120100Z 480101120100Z #0!0 U0U# 0 €À[_d¿*¥0  *†H†÷ ’`ñ·êùöYi¤©¦öd“¡ÿ}«7!½-òï  8½mí¯`âòÐÕ5Ÿßù® ¯îƒ®)=DâÃvÿKÃU=%⼦Fl„ñu¸ÄÎfgÉP'Ó_ØÈi(sµ$œ©Á’?F·GÃ^×#.Ú—e0Íù–Q4•]î÷”6½botan-2.4.0/src/tests/data/x509/nist/test41/int3.crt000066400000000000000000000012311322470703100216530ustar00rootroot000000000000000‚•0‚þ Z0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.080Ÿ0  *†H†÷ 0‰¯Ë¦Í;%Z?ÂSÂ,’­ÒêÝJ¬äjR¹€Ã.N*+箸±¿¦t¢÷…Ê­Ô»hj?œ‘T°?DK‡Z÷ÿA@-˜ˆŒoHY·Š›ÜÿTDè·8eÕ¨Qdô«s°5q&Ä Ž,F[±™Lj܉y­ë,G£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U À[_d¿*¥0U# 0 €/Lr€dàç0  *†H†÷ y˜i 1É_ËëTTëÉé‰5×â¬ÀRÚ"…³ÖŸZªuz>€2ŒãµÜ¨µô€ØïÓ®CÀ?‚½EÏ™ÐþÚõ©_ý¡$øþÇùí‰ÙA='„¼Ê®¾}†òŠw¡‚‡(@Œºâ³m6y2ȈÁ(Éœ½_õ­ÖuÅóøbotan-2.4.0/src/tests/data/x509/nist/test42/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test42/end.crt000066400000000000000000000012121322470703100215440ustar00rootroot000000000000000‚†0‚ï `0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.090 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.01.090Ÿ0  *†H†÷ 0‰¸Ž 0RMG7ö­ÜÏ/j$)8 úSλqº·è4ôF;Š*O ˲¨ôF“4áÕ÷Ö£¡ª07ò!ÙQS¥Mm«ñ*!)÷€5ß®‡mMèÂÇšÝg¸ëÎŽËÕàO²+#׫€™SyEØ€£üUGl…ÃHãýc£R0P0Uÿà0U 0 0  `†He00U ’Þwßz0U# 0 €¥ÅœT‚.ëy0  *†H†÷ Ñ+æj¨Úy –qvÛ|e ;í|Îű޵Ÿx$ðÑ ÖA¤ë*5“KôÍË2áãÁM;Ö0¸3µê?YgEóçv¬è¬ôUQ ïĺ‰:d"ÿÆ ÚΙI4Ž>¸çÄé¸-œ³4š‰ôR–ù¢ ¸5 'Upà::A•ä]|botan-2.4.0/src/tests/data/x509/nist/test42/int1.crl000066400000000000000000000005171322470703100216500ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.09 990101120100Z 480101120100Z #0!0 U0U# 0 €•DÊÙ¸t;V0  *†H†÷ G:¨qŽY•ØM_±l‰€Kn')|¸Ÿ 1ȤpË­å" M;NÏê·ÁÉX ëÓó=L3nd5Ø0ÊõoÍoïgˆÑŸ.°¡7ª›Õ11½€ö oNPðéùê{»óçŸ2^®üñXšx믒<0~eªL¢+÷[à>¡8ñàbotan-2.4.0/src/tests/data/x509/nist/test42/int1.crt000066400000000000000000000012631322470703100216570ustar00rootroot000000000000000‚¯0‚ \0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.01.090Ÿ0  *†H†÷ 0‰É©$ª8Ü• |×’Z: µ—€§ ­NŠ™r18ɤÊD9$X¬B (Á§ú·ÞÇíèl$öޱ™±SÙ9г>‡Vªld;@ ¬ÇÍtJuÇâ6‹ m¼å‹Ú…­¶«;·É|s­ E2cÜß'.-˜´ÿH‰áX'ó!+£}0{0Uÿ0ÿ0Uÿ00U )0'0  `†He00  `†He00  `†He00U •DÊÙ¸t;V0U# 0 €«šëùÂçT0  *†H†÷ žµœ½$ÌÔV÷’~J®S¾ƒt|´Œ÷BP7ëjœV3éÍùÕUÑ”ë ©à*ÙH_É(ãj¢(g<¯h:£ÅØêûþG&]œÁ}™üYÉÕ‚Ïc{YÙ½3ÐbÁt÷ƒª´&-¤ÞÇ€ÖÚžŒ dЧ ˜Š|lZjŸ‡O;¬¬botan-2.4.0/src/tests/data/x509/nist/test42/int3.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.09 990101120100Z 480101120100Z #0!0 U0U# 0 €Êš^mŽš10  *†H†÷ ŒWôÅBÐËÅH&ߪ`¤çï$­ŒÛ¯Dîjì-^h³_Mü•*S‹§ À¦ »~¤ éø¡¯¨.î ž†,­Êgõ¢'*â¨#+å„ÔÖÕÈÀìHäÚSŒü:šµ÷¾h„áwïÔ`kz;÷¶ç§Á”h]³ßobotan-2.4.0/src/tests/data/x509/nist/test42/int3.crt000066400000000000000000000012311322470703100216540ustar00rootroot000000000000000‚•0‚þ ^0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.01.090 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.090Ÿ0  *†H†÷ 0‰ÇR‘ဠ4³²Â{é« à̳-jÕ·g X“¤ÄŒÈT©‘jÅQLnjцὟïF³×wŒ¥@:7J5ž;n¦]_¤@SxõtïKƒn“og|î C &B”‡ ØÁæ™öu *_ÖÅ7‚œÌ*‘ô‰€Apr(ç£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Êš^mŽš10U# 0 €!˜c|ú¥è0  *†H†÷ ;$” g&…hE"‘¡Óˆ{ô|# í"ÃnÙ;‰ÌRã7ÚR›ÝØú–müÖàã®×ŽÔÒ¾×(m <’Š›Qôi‘ýøKìÒ~ϳ8|BAŽ7ž#ßÚ‹‡¸SMQßÂÂq›cº;Nv^z͹.–ðën™Ý€ãs}ÀˆÈbotan-2.4.0/src/tests/data/x509/nist/test42/int4.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.09 990101120100Z 480101120100Z #0!0 U0U# 0 €¥ÅœT‚.ëy0  *†H†÷ ¥eÔ‰¡O3x¬æ:UZ!E‰ƒ€« –Iæa|ò]èȘlj‰"Œ E÷ˆ—Ï9ý´Šc{gÉwð4W§@þ2æLLãm§éc@¾jõ+ _ŽK²;LhÀúLî&Y<ŸLÉ?¤[S”ÇÚ‘act¹Ûi.µ€gv|¶Ûfbotan-2.4.0/src/tests/data/x509/nist/test42/int4.crt000066400000000000000000000012311322470703100216550ustar00rootroot000000000000000‚•0‚þ _0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.01.090 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.01.090Ÿ0  *†H†÷ 0‰Ñó÷7劀³ 2,ÂTÛ(h`Lë ´‡mó'O;ƒòBωó­L‰PÓ,ïkR|ÑÕ=âGj3ä¯XÂò“+#UçÇûÝ“É!èáÄÉŽe«,w2iŒG-sÊMü‹vI?v!¿ßN5²MŸdÛƒ_îŠ6y"*BR*™zŸ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ¥ÅœT‚.ëy0U# 0 €Êš^mŽš10  *†H†÷ rH×SCü=o|ñ Q°ÆRûf³8‡‰+„ 2É© !:gùëÊXçèV‡û¢´j;®—¼®îØ_Pì>ßy>ù ƒŠ>"fjßåRr˜'! 7ìã¡€}î›Q J÷6•ª†d.Ï釜¨ŠÝˆÄHg¤Û4è$g9«Í¶%AMbotan-2.4.0/src/tests/data/x509/nist/test43/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test43/end.crt000066400000000000000000000011621322470703100215510ustar00rootroot000000000000000‚n0‚× e0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.010Ÿ0  *†H†÷ 0‰ªËµÀÐò˜Ò«R ™LûȽ¼£Ï˜k7Õ±ë¤1éhD ô›€»´ç$ú¨Ûˆ§´½åû1yÕß͈n•Â08ýG—0ÿ± çüVJÔÐ ÈXægÜôȱˆiR5;ÐVT0“SvÂSWAƒ­A–ë#tå6©†­„THŸ9í=sñ¾ÿåt\ŸÇ€‡wôûŸwÔèo^t\Ó,ö¾¨áb1µlLE¯ ‚“Nbotan-2.4.0/src/tests/data/x509/nist/test43/int1.crt000066400000000000000000000012471322470703100216620ustar00rootroot000000000000000‚£0‚  a0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.010Ÿ0  *†H†÷ 0‰¸šíhp}ê+RH¹,9¶Ì晀Cá¸Ó’[~:ó:IбŒD wâ~—`Šøu|Å$úb¹ae3Ðo?yÚ®)²a<ÓZŸ(¦Á³LìL´„ÎB›TÀÐó‹mƸIZZÕFZ.e9Ãäz Rû£cÉÙŠ²8úP´bùªÊg·£q0o0Uÿ0ÿ0Uÿ0U 0 0  `†He00 U$0€ 0U †F/F×¼?0U# 0 €«šëùÂçT0  *†H†÷ Ç9¢$‹ÔèRgçQ>_»,Á'`çG„S3úµ+pŽYm¾aª´mÇ1[8'”ç õ\ úƒ)†=Ïí> íÕ„Ÿæô¸ Týÿ¦2DG옛T`ü©…IWyLß⤣߄¥' 7 ÓGÊ3ù™¥1ñÉK—èÀžbotan-2.4.0/src/tests/data/x509/nist/test43/int2.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.01 990101120100Z 480101120100Z #0!0 U0U# 0 €$ûz¨§Ey0  *†H†÷ ‰Fâ© ×þàŽP6bÿ±'eÊ’‚ 2·•ßOæjýµpÈLOC©œÂKÜu¼piàlC¾•ï-T žÎ)~Ñh\úÓèÚ?RqãêÞ²©^Y3uû¨?ÚÁ{Ì;¤3x‚à9ô¦Þ’îùä#åˆâMJ&+…¨á· •jbotan-2.4.0/src/tests/data/x509/nist/test43/int2.crt000066400000000000000000000012311322470703100216540ustar00rootroot000000000000000‚•0‚þ b0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.010Ÿ0  *†H†÷ 0‰¶®›nDLáñ ÝO,ðjû=,ù¦Ÿ2ðQš¤Šêl.ï÷:pƒRµð^ b ¤ð}Ѧ²¬ÒeŸvë÷ph0f×-3FÑP×r‘…;È<ûlî‹ß·5? Ì.{ÉjFªÁ¶çÂW p«K…õõü¯y ä3cñg f=ýï£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U $ûz¨§Ey0U# 0 €†F/F×¼?0  *†H†÷ RF77½ÿ¦íühlQ€‚{:nAVõc=¤@à*[;ƒÖýWIIJޕj¡†H­±›_m­¡6;wq©¯>†/| ¤GO=LGýÁXÉú°ë‚)Œ1¼áÛ^'šŒÎ¿ñã€]@¡wùYˆ8ÛØáÍ€É*³ÕfPv„ûÞbotan-2.4.0/src/tests/data/x509/nist/test43/int3.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.01 990101120100Z 480101120100Z #0!0 U0U# 0 €gÜŒ•º10  *†H†÷ 6Œ/ûY>…=ýÝq)YÄç_!>M‘×pêaã(»ÛABL0ïÊmHy ªa°*»xŸ5”Šs߀˜Ø<ˆ›2]2ŸqÉL ‘ücÒC7Kè{#¯Ób]Ê#ú¸`Ö#oãÅ#¦¯EŠ;_*ê¿ ïžÈcÜ˵ÎÒa…89botan-2.4.0/src/tests/data/x509/nist/test43/int3.crt000066400000000000000000000012311322470703100216550ustar00rootroot000000000000000‚•0‚þ c0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.010Ÿ0  *†H†÷ 0‰³Åü¢çh0ÿ›mëÿZ4Ýc|`}F‰üÆ ÞƒÃ-ûîq™7ks`=ÿ–âi5 L2^¦›Þ44f3ñ(îvsör³B QÖ6V3ÝÂm`ž¼¬JÄSä´‚va°4hU¤ÕøSïA¡‚žkaµzð!™\¡Å0óAº%£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U gÜŒ•º10U# 0 €$ûz¨§Ey0  *†H†÷ LÙÑ1 ¯O\HÅ â–¹mèî_b1ËóŸd€%%k}òÖÚÑæt†¤1¡LrŸÉ>² CéWjﻩóYpò’©(=GmÝùåQ8u†{hûÜéYåtaŸOq© _¬pÑ #œ×Py©^aŸðrf~9eG‹A@¬„ˆbotan-2.4.0/src/tests/data/x509/nist/test43/int4.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.01 990101120100Z 480101120100Z #0!0 U0U# 0 €É› 6ü²!‘0  *†H†÷ ²p=,‹iŠç(<¾9˜·NŒiÞ·¿‡„Ù5â­!¼Ó``u¼HâϘ½þ¦‘‘n!¶Ó°i'PÖy`Xñ2Þá‚W•*ÖÃcŽ« Þàv¥ÀtºL£è·ç'Ð×Öjyg.K)™ÌèP’ÉhœÚx´kž;úØbÉÓÒ•*–AwICbotan-2.4.0/src/tests/data/x509/nist/test43/int4.crt000066400000000000000000000012311322470703100216560ustar00rootroot000000000000000‚•0‚þ d0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.010Ÿ0  *†H†÷ 0‰Áë¨KgVÀª˜ìG+úèµs©qÂP8‹ÞJV?S6f%®}H./9](]ªíõ: †ÃOðöè0ËÞšD¿“Š[£ãÈBjþ\\_·a1îÈeÕÒ±Û%H¸q!Ýô)† s•Än¢þ.mË(';0³Ìw¨ê‘=¥ƒ·%¬Ñ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U É› 6ü²!‘0U# 0 €gÜŒ•º10  *†H†÷ s±¸,Aê§ò¯ñ2‰rGñ[(3çƒë7Þáš™RLFF?|‰ðÕ¸ëÊ+(ÕOW¸ÐKG–yPt èˆÞ³xüµèYûÐð Ñùdý§G"Ìgÿ~;0zÒ@^Â'1=´ ºë¹ÞR±-áú þX#­u¢½—Rbotan-2.4.0/src/tests/data/x509/nist/test44/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test44/end.crt000066400000000000000000000011621322470703100215520ustar00rootroot000000000000000‚n0‚× j0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.020Ÿ0  *†H†÷ 0‰Ð+âd»v:Œ¯¢SDW;d²ý´ŒSìʾAÀÝ­àHEá<½Ì3ÿ÷dUÜk|8­s”U €5 ÜËLÞì%í?c CÚB}>ÃF@½›AÄšxëÅ>4ÜõE±®™¬³Ò(™#¸œK˜÷‹Zå_׬a´M ¬Þ§cŒZEK+£:080Uÿà0U 0Ð?„<Ãe0U# 0 €ýÒ¦¸nè0  *†H†÷ žc_ûxɧ‰¨á€óœ“2zÁÕî²HgEt>]6®ÄEÌø)…£eœV¯µµÀü_¦¥üŽçko•¹‘d ³¨Á[lÆÜ$Øúýûk!ë¥ Í×ò\›!™T“æî gsž‚À2º¬€nAÔ‹ä4S¥vÞ¶á¡ãxêîbotan-2.4.0/src/tests/data/x509/nist/test44/int1.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.02 990101120100Z 480101120100Z #0!0 U0U# 0 €yjo­’wmç0  *†H†÷ ¼ƒ˜²ÃvNªÎe˳¶_F¶ŠÜÏÎÜr€%;\UËô0Îrl?PöÉ jTžC™1¡ßDX§ù÷ ¨×•u‡ö3KQñô4Y{Â-´¥“¹êáÛùdš3¦=Z —Ÿy{¾ÖÇAp÷’ö¼×„Ì‘2Ö^ÒþƬQJ¾¦botan-2.4.0/src/tests/data/x509/nist/test44/int1.crt000066400000000000000000000012471322470703100216630ustar00rootroot000000000000000‚£0‚  f0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.020Ÿ0  *†H†÷ 0‰ミ—YœÖÀ:WlFÈ[ y” kuVϨfËòîØü ³Ì¯?¨OÃñ^ÜE{œº»p”‹„F5ÀšN Öy5…¨|Ï[vdi›³†˜¾p*žg3yœûê+_Zú_|ÖÔQWι¡óÌy¡šÉ–²G•Œ×E ÌÆ°;£q0o0Uÿ0ÿ0Uÿ0U 0 0  `†He00 U$0€0U yjo­’wmç0U# 0 €«šëùÂçT0  *†H†÷ ÒbkYRž73ù+Û[¢_¿ºýII÷{Pvô³Ü_Ì/HèVñä"¥~'}¦3uèÞ÷á6ý±Ìd‚áóõ/Ê ˈ6á#£2¶óÌ={†K‘:‹ëÔç²Rb'(£ãÑð6cµl+r-וˆIed6Jbotan-2.4.0/src/tests/data/x509/nist/test44/int2.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.02 990101120100Z 480101120100Z #0!0 U0U# 0 €(VUâøß8ä0  *†H†÷ ¤² _ö bŸŸ¼‹L JŽxiT”Wš¯þº>£í˜)+¡ÁŒs¯ëŽêåø½ÙLºØÔP‹ãô”zÉŰ20eƒ†|»ª;Ü_\º½ ‹{ ¿—z2|W Šaf6wMy|%XOÖÒ5UßGA[œ´\sA¢PuZw׫;Ë—,botan-2.4.0/src/tests/data/x509/nist/test44/int2.crt000066400000000000000000000012311322470703100216550ustar00rootroot000000000000000‚•0‚þ g0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.020 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.020Ÿ0  *†H†÷ 0‰Åऊƽ}¾Ërâég»£48ÛßBøFȹ²’À’¶Fˆ©Ý΄-^hRç§&­áÑÚ²ÄÕÓĈ¸®bksˆy«eÕHÊé.z˸€;uViS ³]t4VR2kP{MvyÙæbTUoC&Á¬GBž*¨.ëí@€}7ï“nî÷˜ÞŒ_J¯€[«º/>qbotan-2.4.0/src/tests/data/x509/nist/test44/int4.crt000066400000000000000000000012311322470703100216570ustar00rootroot000000000000000‚•0‚þ i0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.020 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.020Ÿ0  *†H†÷ 0‰ Ó$,=žóî`Ïøî!+‹by/ëæ˜qÍ=¿ùK~$¾¹÷BÙz¾@À"|öïFÏq£j´¸¼öêl«TÇò)G,¦­+aø\DÄX<}&ö*ÑFºŒÉÈ+ôiˆí¹ŸZ½¯kâý8—!O Öa° /Eúüû$³ká[-¸Çräæ±øûÉŒ¡€ %Ãí×'*¾o¯ðéÌnLßóêØÜº'b¡^DË”™Oع^æbotan-2.4.0/src/tests/data/x509/nist/test45/int1.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.03 990101120100Z 480101120100Z #0!0 U0U# 0 €EÒ%ÙšR ±0  *†H†÷ B±ÊU]Œ$òK5Óèê…]ÄrT¦b ™m„­ œ¥ HöpÀ$»e7›Q´ã¾]]]§¾xnÇ/ˆA[y8Ÿ5ŸLa™BØ'ذ–ô10´ÝxU½ÛÇ43 Mo-|£*?WÜœK"p_5&Í„T¶ˆG“kÝåÞGï3botan-2.4.0/src/tests/data/x509/nist/test45/int1.crt000066400000000000000000000012471322470703100216640ustar00rootroot000000000000000‚£0‚  k0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.030Ÿ0  *†H†÷ 0‰«PʌŞ,J±ú°«öË©Ø)¨ ½AÚ~ŠÂþ3ÿ“µ=é]in6ÓOĤTÿ: ‚úË%IªF.ø¡ Z‹S¾Ï½l¢<ä¸ÒÚIæö“Êçvžh°½3ªÚ®7N¼_ ‘Ûr´#üGõ6ˉP¼?åÁ÷I8”zý6à*ï¡£q0o0Uÿ0ÿ0Uÿ0U 0 0  `†He00 U$0€0U EÒ%ÙšR ±0U# 0 €«šëùÂçT0  *†H†÷ ¦i¾ç¡é2Ç”óÄ –¡‚õ/Úd›o.K‡Ö’¢fw%2”o ½BT뤓2Óev4À‡{•<>öù¢Aa†ÃËzL`—£ð­ wàqÄçÐ1\¬;-ì¾Ó *ÆN#ôïSôÅZÈ![Ò!»´•"&i'(ÀvÆB!p7¼KÇfÇbotan-2.4.0/src/tests/data/x509/nist/test45/int2.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.03 990101120100Z 480101120100Z #0!0 U0U# 0 €qàcÿ¨žî0  *†H†÷  á!_ó-{˜[-‘\"€à QâîÀöá wTÐöÔ˜°¦A˜ñž/zÔ)³åWçα+<ú¿¤£ù2dÞ7Ç !“¦»<¼QqP‚‹¬»ÒlÄ,'éô¹47ñÏ. ¾vU"W —°y,õ3Ùž]¦âámA±*šÌÑ=НiAbotan-2.4.0/src/tests/data/x509/nist/test45/int2.crt000066400000000000000000000012311322470703100216560ustar00rootroot000000000000000‚•0‚þ l0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.030Ÿ0  *†H†÷ 0‰¦O¼ õl½hcÖÇ"®¬“¤là+|Î{&RlAÏ$Ë™# ÚZ˜Êrf8ú­Ý««×” …]›Jÿ_Ðtþm¬Ómˆ‰‡}‰+çhÈþ‡vŸ ¶sg¯zKAðï$qÓO­y¿!â¢Á²H[^§ÔÊȤ%£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U qàcÿ¨žî0U# 0 €EÒ%ÙšR ±0  *†H†÷ †VèG˜3ainX†…3”u*?®šë¿G8Ôb^2ßù3fg{°ÄÚ0eS»;!éÈ ä“áÎÇœê( ×Íxnùž®a´!”œÎ©ŸÏà½Î|ùÉ yh'¹#ý.¢P‚³Ã‘mbi „h5Q,^#TPÁq Åðµ¦Õ‰²NTbotan-2.4.0/src/tests/data/x509/nist/test45/int3.crl000066400000000000000000000005171322470703100216550ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.03 990101120100Z 480101120100Z #0!0 U0U# 0 €snÍC:ü»0  *†H†÷ +ü⯰‚Õ€ÓVº¡ÅÇõ·Zá\yn¢¾…èß>±RïÎí®zq.æ8÷æУ(˜{‹Wò£·\F‹È[„‡òÂUT…ó+L*SKNQþöRd ~z„÷˜/v¸¡±Ýð¹¹r5žÚwݹ?/èÉú”¢P+äU»ƒbotan-2.4.0/src/tests/data/x509/nist/test45/int3.crt000066400000000000000000000012311322470703100216570ustar00rootroot000000000000000‚•0‚þ m0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.030Ÿ0  *†H†÷ 0‰Ä¢äe©1Pˆ”Áϲ†:oGT!´k7ÅøCßQj´]TWF¹•¾Aõ¸Del\,€`‡±òâcµ¦Rµ{­÷ØöOž¹è%·öò–ž‰Ÿ ©À dJF=b‚˜Ppm·«\?¿ð±qrhN \±wư™K7>áŸþ?ä÷*K£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U snÍC:ü»0U# 0 €qàcÿ¨žî0  *†H†÷ 4¼\.òj+½às~_«SÄg ÖÎ7‘|ɨµm©¶à6Ža¥< 26Ljßß¹nÚŠÎÕˆFí³VÕcòNõ'!ˆ †] Çç@*\Ô0ŸÕœ¥+FGæÊ\q÷ŒøÌÇ#X"GÑŽðÑ×É/Ø7sº^[åB*9DFuîbotan-2.4.0/src/tests/data/x509/nist/test45/int4.crt000066400000000000000000000012311322470703100216600ustar00rootroot000000000000000‚•0‚þ n0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.030 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.030Ÿ0  *†H†÷ 0‰Í»4Ü“óƒ7.Šy4$2¥¹“Õ?ůCC­‚ žþW¦ â*`H‹dÜ ôx¢§o!³åzÊJÏU^]2ܬ:ÚxÃ!ÜÝ¿NÇÊ©LàˆZeoÔJ.„U-å¸bö‰Ó¥Éýïø´Kµl3i袊££c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U :kó F­0U# 0 €snÍC:ü»0  *†H†÷ ¬NªPÉã^ yx¨€ÏD— ]bÄ®ÙÃ@ÅÔ¡éq`ª½úœh¯.$LÅd"\í¬ ]mtš{Ä‘œ¦0‰—‚6Àˆ'r|Š:Œï_Oª„ ÉÕÁôÄ«^©”Ø,š‘,Á¥¿6VŠ7gxttut©%× ¢&%ÈÊbotan-2.4.0/src/tests/data/x509/nist/test46/000077500000000000000000000000001322470703100202745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test46/end.crt000066400000000000000000000012121322470703100215500ustar00rootroot000000000000000‚†0‚ï t0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.040Ÿ0  *†H†÷ 0‰à•&kk[ÆvXa‘61 Ê&}qh…CÂ\Kà-'Pé£UŒþ¶«A6=˜£Á÷õ7Q~ %‚tBÇÑoÿjײñg°ÁeQéºkƒ… WÚü#‹Ñà¸k©p‘ÓŠš¨1K%Yâ±]Ìóá@‡¦ï˘ì»5T˜êsaj £R0P0Uÿà0U 0 0  `†He00U 8Þ”9„“.0U# 0 €&7ï¡™ 0  *†H†÷ ^‹ZÔÝT¬ÌcÙ¯ït‚=Ùh¼¸G­pz=¾h‰UŒpÍ/f6\}™E.iXûz<• )íF~˜%e‹zÅjxS£ÈÛ±÷¿×œd÷O\4'ì†îbotan-2.4.0/src/tests/data/x509/nist/test46/int1.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.04 990101120100Z 480101120100Z #0!0 U0U# 0 €Á|§`4˜0  *†H†÷ >RKر<«ƒøÏ‡Ê“pj.ãõ|Tc!±•žÊáàÊ_•^ÈÿçÉ™ö„Z4äŠFØô´¡Ùò…¸It£øƒŸ‘™O@f¸BfªþùG^K7²8Ù,ù䄆ƒˆˆ7… '™³*ÈuÐîÝÎ,é¿8Uk4]Eéî%i%botan-2.4.0/src/tests/data/x509/nist/test46/int1.crt000066400000000000000000000012471322470703100216650ustar00rootroot000000000000000‚£0‚  p0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.040Ÿ0  *†H†÷ 0‰Å¡ØL™FaéîØ„lN$úï#§³=%w*`ƒù(-ŸüÎÓÇUûŸ6~…ÉúNgäA]‹zUNhíåB°bc¨Çt ´sLï©¡éU¡T“+(m1HG±Ñ>—-£=OhæÙW ¶,^úolŠÂ'J<’é81dózpÊ'£q0o0Uÿ0ÿ0Uÿ0U 0 0  `†He00 U$0€0U Á|§`4˜0U# 0 €«šëùÂçT0  *†H†÷ º2v õÆ7Öûü¢™¾†’À_Ò{˜™bvÝ>u‚œ¬œÝ@†PÍÞA0ÒÓ™š?2KϪK¶hüàäH™Ñìž%¤zk†¢ %=ÏñâzÝ}˜zÐvÝ'¶‹åcÀs€J]FÎ5Þ¯‘oòâÜk*gŒ>ÙT)˃«»‚•½1cbotan-2.4.0/src/tests/data/x509/nist/test46/int2.crl000066400000000000000000000005171322470703100216550ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.04 990101120100Z 480101120100Z #0!0 U0U# 0 €H§§AyÅ0  *†H†÷ œ-Ë£VzüuïØ‹BÕïK÷$1â›¶¥. QÔÒϯŠûk±2¬1W7G!0Ûß"6e?iVÕÝK×ó–¯1Ð4üœš1dŠ6–Òj^5ó006¿8uC·ùŸîÇaƒ>#i3ìp>ü,,ÿ]‰˜ìª»º#…vt3'¢ÖŽo*Ëbotan-2.4.0/src/tests/data/x509/nist/test46/int2.crt000066400000000000000000000012311322470703100216570ustar00rootroot000000000000000‚•0‚þ q0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.040Ÿ0  *†H†÷ 0‰Ç©ø!šN ÁÖÒz˜€÷‰×Ïòª±sÍÊfUÖ@U4|wLs¡û*;¹w¿u>ÉrÕ|²u¯ C@J>žw¨Í)¿=';„´ðh¿ELÎÉ*Á« ÂÁ‚­‰¸ƒ{äÿC}J®imìGq¤Û‡¬(II†uÔ§£Ø¦Vô£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U H§§AyÅ0U# 0 €Á|§`4˜0  *†H†÷ :†X“‚“Ï5F’!É@iiùªÀ‘cÏþ ãý%¤~¶yj¥™Š$Yc“¯¢À(Åz¹HÉ„M<§˜îg•wÚ'·Eo’ÕO´¿Óÿäê§ÑÍA Æmrsüˆ±d1­ÞÐ+4ÄG~Ç#«åhÄŽÎå¥&Ð¥q­¨Âí2botan-2.4.0/src/tests/data/x509/nist/test46/int3.crl000066400000000000000000000005171322470703100216560ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.04 990101120100Z 480101120100Z #0!0 U0U# 0 €h"Yþ ¥ô0  *†H†÷ :mŸ›rp9ÈKÝy´FsbLSÁ‰ôÂ5+y’›öãqf¼&,jùCöº,˜Z%¦^t]TF±ºs—ürÓ`HõSI€tS–©!«—]2íc¬³k V¹›Ùq-EöK×T¿3>_2›£zÞÅ’áHÃ2ëÞÉúȆ¡›Áøûbotan-2.4.0/src/tests/data/x509/nist/test46/int3.crt000066400000000000000000000012311322470703100216600ustar00rootroot000000000000000‚•0‚þ r0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.040Ÿ0  *†H†÷ 0‰¶¶ucð¡Æ oûÃafL§|Ž) n9Þé®ú⢆GNXŠàÿ.¶[^ŸJ=~§Šv™C{í¼ç*ø¯H-þOXÈV>’œQ‡ÓÉ¢ö§ìÇ$LŽÿÒZ)lÉf%bâG›[èp6™s±RbÀ[¹kâèÃz/òŸð £c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U h"Yþ ¥ô0U# 0 €H§§AyÅ0  *†H†÷ Û %­:«{ãR 4Nœ¦LKPQ&«„¼hùû„GÚœbë¶ØwYLñu¨P¶G[.#amM08)Bm)cZpû ÐvÃì#ê·„Ç9Ãíúoý ¨z²ö·?²U®#íOûD ã$뱄5>'è=>ÓaÌÝlv e|botan-2.4.0/src/tests/data/x509/nist/test46/int4.crl000066400000000000000000000005171322470703100216570ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.04 990101120100Z 480101120100Z #0!0 U0U# 0 €&7ï¡™ 0  *†H†÷ Îr½zK$—‹–Sí—ªÏ^0½{³|ð*QÑÒ9y.ÓóbQ‰º,eúOÞw½Ì0$XL¨z`nuÀC¦ \ß»fKhnŸ1Uúl*üÍ?§U(ûžêL õfÜP^botan-2.4.0/src/tests/data/x509/nist/test46/int4.crt000066400000000000000000000012311322470703100216610ustar00rootroot000000000000000‚•0‚þ s0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.040Ÿ0  *†H†÷ 0‰àvOì˜2yÉ– ~ºH ,Æ5—‹;ÔHß&ÎÇÁ3v»pÃ#¯òJº>üN¼N­Ö4›OÄÍ¡ ÇBŒWzz¤ƒiSd:5cQ¿‹ÒuÕ~µØ¤RÎ7«Y.| †âÏ‚³œ©¬ÆŽ•uŒ2Qáæ’‘œ/œ¾ò¢ì¤#]D™Ã£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U &7ï¡™ 0U# 0 €h"Yþ ¥ô0  *†H†÷ ;o˜d•œ1†xÙH¡°}<Òh‚õ1,fàßz˜6}cãk÷Ð꿦0ÁSI¢™;Ö…¬¢ £ ܦ»¨yØgK1Møk5¡DŸŽEF÷µiû±,K~tâ›…j˨ÿõ Ø$¸d »'@ dª ìÏž¶ùQ¦5$RŒ¸¼†E§botan-2.4.0/src/tests/data/x509/nist/test47/000077500000000000000000000000001322470703100202755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test47/end.crt000066400000000000000000000011621322470703100215550ustar00rootroot000000000000000‚n0‚× y0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.06.050Ÿ0  *†H†÷ 0‰¼•2IO¿{°Lü˽,\Œ HKzç(”ïX›(GÀŸúu|·­”9®ÔU#˜«M9³½³ýèG|ííʼnûÑNÂ#—RøL"ÂÙ¯¤÷|fg þ6ìù5~nj Ñ&fzr"ZJh¢"ÇmÁ—ã¯IQ8¿5Ëà´“Ý»ùÝ£:080Uÿà0U J0 0H 0U# 0 €Âj´~è_I0  *†H†÷   ÝÂT‡òg[ ef“Þ¬b0åÆÀÚG˜'FàÃZ!Z ýmÞ´šÂ¤”ù[úâžärà%éÆï!sÁûí}Wmã¡Ô³Rq´òYô…¤KñQjKú”>þSÌ›ÃGÀ eir]BrpCâ5`å?;ô¡k§)¢†’-B botan-2.4.0/src/tests/data/x509/nist/test47/int1.crl000066400000000000000000000005171322470703100216550ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.05 990101120100Z 480101120100Z #0!0 U0U# 0 €!kÁª³µœ0  *†H†÷  }îÃMúŸ Øz¦„\<ÃÒÂz„w]¯îj¨*‡ˆ¿V@î.‹µ[ î«sÎÚàfaoøgF§/(·2Òúè¼&¶ñÜŽÝ&^ì‹j´ôG®>>•›OÕ:L†øv£¬„¼£†\)Åökñ†Î"IÛ Lþµñ +D)&Abotan-2.4.0/src/tests/data/x509/nist/test47/int1.crt000066400000000000000000000012471322470703100216660ustar00rootroot000000000000000‚£0‚  u0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.050Ÿ0  *†H†÷ 0‰Ì!KPü(.wÀÀ'ò5,t<»µƒ²S‚âs[Z~B´‚àghF!˜DžÏùP•òG¼Ìº5 }! ƒ99]1€Ša1[ÿÈ7a¤•„ž£–9àÝq5ãjºÐ]™kÆRTEÒ+wÔ?Qºþ>13?v´I—£²Ø¹Œp[ã£q0o0Uÿ0ÿ0Uÿ0U 0 0  `†He00 U$0€0U !kÁª³µœ0U# 0 €«šëùÂçT0  *†H†÷ ·?P?1ŠM'J¯‹n¯Ó†Q`ÐYµ«Ýw÷eéÝ¿¹ ýEPÊ_—nV Æµû6›a¿¯ú[Êh8ï&ê¹ùç8Ä+ ì5ôrc¶õ˜H½Ã…g¾lUjDµ*gâlyi0ш kWãVgÂ]pT '‰M’æuÝbotan-2.4.0/src/tests/data/x509/nist/test47/int2.crl000066400000000000000000000005171322470703100216560ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.05 990101120100Z 480101120100Z #0!0 U0U# 0 €T¦™Íõ{0  *†H†÷ C>îuõ8ÈÅ,~Aædb%ÚV}å§þþ»1 £A!{Ee–M÷Û Ç8h‘•’ïAÙmÈ`Šš).ÍÃÏòü˜8& ‚éÍ‹"Ðc]V¯-Ú^÷\‚:–]UeœÁjç;k¼)|íUC§=gÆÕH"·t„w€Û…SÛlâ‘ZÅbotan-2.4.0/src/tests/data/x509/nist/test47/int2.crt000066400000000000000000000012471322470703100216670ustar00rootroot000000000000000‚£0‚  v0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.06.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PP.06.050Ÿ0  *†H†÷ 0‰·ê=‘vYK êA¬CÒ ~²˜¥êä5@|¼´ìAÐ Ô„ _̨ӯ‹ô•9 ÂzêÃF„œ=¹‰-CÎ#1fuò`óJû.“&†\!¿·nôŠæÀ¬!V’Ç!ÇõÔ€˜@^{U½"»ŸF=ùØ$ï2ñšq†£q0o0Uÿ0ÿ0Uÿ0U 0 0  `†He00 U$0€0U T¦™Íõ{0U# 0 €!kÁª³µœ0  *†H†÷ #¬Qó QK¾Ë MõybÁŸÃ²î*,4é³ ´°>uê15fÄO'˜½È ø½­jÀvèIJè‹mH«&‘Ïÿ"Í#Ž.q¢Ë‚_ ¬À òãÎk™åv¹CJ4Ô9\™iVÂçb·øž;½WsÈ´!I¤Ô%}v¦ŽW’botan-2.4.0/src/tests/data/x509/nist/test47/int3.crl000066400000000000000000000005171322470703100216570ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.05 990101120100Z 480101120100Z #0!0 U0U# 0 €Íàûì~c0  *†H†÷ ’%º‡Ö¼¿âMߩҤšb€u.¬ (‘OÐ?íùƒOW€Ý¹ÀP<¼ Ñ’”JÛ7´iÙzME¼ƒÍáÔ×H~]›•¿7«0(Îx¡²FM༼×MYfc&u‡RssĆ©&{¨™Î<fŠ7gHb;W5þÞjÍ0botan-2.4.0/src/tests/data/x509/nist/test47/int4.crt000066400000000000000000000012311322470703100216620ustar00rootroot000000000000000‚•0‚þ x0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PP.06.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PP.06.050Ÿ0  *†H†÷ 0‰ñÇžÑâ>¸ÅÖã¥9{­âÛËôöÊn+ ½Ñ d oÄý…ŽË†Ñ¢E` lè@d A]/õ“¾êê®Åw¥Y„…FCÍ1MÔ1s]Ä!²‡Ù™bžû<Ë¡C]ˆ¿vƒ[ÒN½=ø|¡+·wIîí¡rðŒNi*߀á›Á£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Âj´~è_I0U# 0 €Íàûì~c0  *†H†÷ lÑ¢´ò‡¬ßg`ÒWÞg ²[Ù85gáRÎ:‰#¥êYÇ5z€çú´¤á~ Ò7ÕL…õ V>Ð×-S¹ˆW¼ßMX>aÕU"ùdÊà!»~¿9+Të†:Îú?ÙuY ¾ýdYuÊ ÇÏŽ™÷G^ýt‰bÃV§botan-2.4.0/src/tests/data/x509/nist/test48/000077500000000000000000000000001322470703100202765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test48/end.crt000066400000000000000000000012121322470703100215520ustar00rootroot000000000000000‚†0‚ï {0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.010Ÿ0  *†H†÷ 0‰Ö-®Ú`ÄÙ~ö1wLÝAõ´„"ùÄ*‘lš»E(†Ž6’!E¸R!È™”Nh¥õ?ÉlBJéžì›R/™ôÝʆ‹P0ÿÏù)æÇ››£˜_VZ‡b>K³k&KÑHÝs€ô× äÞeßå¿X…¦”Y¿§ªV¨j” ±½I£R0P0Uÿà0U 0 0  `†He00U f7w L&0U# 0 €¡*×-§0  *†H†÷ j»'×àÒóŠÇ-(êv%q,=Ûí¥§ ô|7»€PúuYä€"2s’›³³„`´ŒX„s•õc[Ôpþyw"7ÐöŒB÷âËý;÷jÿnp)ç‡ýèmYIè4ËxSýcÚb§}¡b®[jõ.ökø$4¤ÔýÈ}botan-2.4.0/src/tests/data/x509/nist/test48/int.crl000066400000000000000000000005171322470703100215750ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.01 990101120100Z 480101120100Z #0!0 U0U# 0 €¡*×-§0  *†H†÷ G%ýÛâè\=Ÿ ÃÃÛ:›q*»àÂZô’êi<î2t%8’! µQŠúF93ú}J@*0¼šk£:#„ä%é Ý ž6!¦ûÑYYtP„û0ß½y(2øwâú\/UIǢás!TᙪH{ßOý=‘Ÿ—Èô2botan-2.4.0/src/tests/data/x509/nist/test48/int.crt000066400000000000000000000012311322470703100215770ustar00rootroot000000000000000‚•0‚þ z0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.010Ÿ0  *†H†÷ 0‰©ÚñÕ_O'ȧ¾KÃOÒNgÕçƒm“m…áP{WÃܯfcäF­—Á-v\u‘bÆ'd“-ä ;üCvÈðr3j3à'1 oŸ‡+Ôl\Kâm³yldv«7µr‰s¾ð޵Зö¬æ¬‡WÙÂh¤G&ÇkÎ u$Š=ñ%,ã£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ¡*×-§0U# 0 €«šëùÂçT0  *†H†÷ ]ÈQ/x>]¹wr¥ã\¹ä ÉcѸsKFO, Š-Å•uÈ7}ƒ.'”²¤Ã)Ķ•ŒÞñ«B£0½`.#Ð>M|ˆ “8 n[ãR]n0ݤªB'Df¡ß Eµ²ÏSºH»‹_—ŸNö™ö¥¬?¾Xx+ë­ÒÑPØ!©YПbotan-2.4.0/src/tests/data/x509/nist/test49/000077500000000000000000000000001322470703100202775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test49/end.crt000066400000000000000000000012271322470703100215610ustar00rootroot000000000000000‚“0‚ü }0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.020Ÿ0  *†H†÷ 0‰âlÏ̬ïW¼P• 0@¡ÅP¼âª Ó Þ‘¥oŠH‡°u<›ŸÄ;³ëôX>ø Dkú´× £ XUGïo!“Ž#}ì¼Ýg´ÉÐìéjÀ½°«ÉA‡«ØFã:«„åÅÄ ü!†k Y‹&Ø ‡Ú ¼Û‰£_0]0Uÿà0#U 00  `†He00  `†He00U èŒ,M¥æíz0U# 0 €èYá%¨aœ0  *†H†÷ Wø&͵۰Ÿ’'‘÷m´ªËùxˆq…XT»´Þ‘dû’×ZUsQ¶‡_ ^Où‚£'.ä1B9V¶à´—¾Ã&Ív 88ŠÒžûC’4ÕÝÈé§ú--Iñ±cuõ[á,aBòüÝ(½s‰‡`Ó=ŒÇ‚%0x¾ë3SÞÍdLíò¦kùf'ˆVÌ-LñyÕwâWP½Þ^²™lbotan-2.4.0/src/tests/data/x509/nist/test50/int.crl000066400000000000000000000005171322470703100215660ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.03 990101120100Z 480101120100Z #0!0 U0U# 0 €kS­’0aÛ0  *†H†÷ qAèMþ—w’†kºu|FÉÔ¢ù#RG :[…æa’«cì«ûäW”'Õ)¨%#ÄxˆAË­ -QÙTn'Y¼½ðóò¹=¨•Žw¡63Øž|÷>4„L7A’Ö eº[o´Š§+±fôîD/ƒÔ;¤Âáûê­botan-2.4.0/src/tests/data/x509/nist/test50/int.crt000066400000000000000000000012241322470703100215720ustar00rootroot000000000000000‚0‚ù ~0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.030Ÿ0  *†H†÷ 0‰Êd8ºnTw˜¼iB(‰É×`¡žÓ@Ÿ‹uð=ˆe5ã¼I/—…pDVˇkç9ÔVü1×–p?ªÄUoD¹z¨`pñ€~bqÏ»9Ê„­ù¢C}+‡¯©™¯Ä…Èçµz°"©äÖ«z˜I;ÇÕ ;y,%l @:ï÷o£ ãqy÷£^0\0Uÿ0ÿ0Uÿ0U  00U 0U kS­’0aÛ0U# 0 €«šëùÂçT0  *†H†÷ Íí×|I&¶‘ˆÀÁ‘q…3Qç½01Ô‘ˆ]òY$m:1/ðÔÕ?ÓÖ‚IòFªL¥4ÇS»† %Aõ-G éfKísµâ«Ð–W0e÷+¡¾K·}ªóë8T­ïæ:Ä.à¶œ48SL dEðßô«$ŒIü±=Öm @½Ø1RnTbotan-2.4.0/src/tests/data/x509/nist/test51/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test51/end.crt000066400000000000000000000012131322470703100215450ustar00rootroot000000000000000‚‡0‚ð 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.040 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.040Ÿ0  *†H†÷ 0‰Ï%f¿pÖ[»das jàrqw·Fíª»§4ôþ>8Q=‚ê¹uÁœ.€&4±¦]ÏüÔ{s6oƒ„íê\6×<=æŸÅ»K´*nZwóAž"UpLÆLceÒÑçz_ý~?ù?í©r”´ÍÉ¥í) i½ŠØ rÏE£R0P0Uÿà0U 0 0  `†He00U ©½ ìŽ3X~0U# 0 €˜€‘ìJë÷;0  *†H†÷ EòvTä‘–˜+«$(x#ñ~>\vÆá"c m7ƒÉTï]!ýl–PÊv ¯I%åã=š"`œŸµ¯ú÷¯oÍx.$;‡B—h.o,?kíöïØCœÐüf7Ðb^ß?'M0枆3ËFƒJs湦botan-2.4.0/src/tests/data/x509/nist/test51/int.crl000066400000000000000000000005171322470703100215670ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.04 990101120100Z 480101120100Z #0!0 U0U# 0 €˜€‘ìJë÷;0  *†H†÷ pÝÚŒ^ĵ½½WœîÝî\Ͷê/s-j¢>9'úÎìAj5)Y(M‡P`äúøWßòcfoDĺâÕøFÒ¯ÌÅÑ&Ðíÿi·ËUAŠ·—”CÔ7`¦ÀÝ /kåɪý½X_ÅjòøºÕo _ä‹^Åxbotan-2.4.0/src/tests/data/x509/nist/test51/int.crt000066400000000000000000000012321322470703100215720ustar00rootroot000000000000000‚–0‚ÿ €0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.040Ÿ0  *†H†÷ 0‰²³7N£×0óé[™‡ã¶R°p«pHŠÅ4¡R˜+·Õæ"ü\ <–æÄ¿÷ Œ7Óyî‹s[ŠižäöÎÑ8Dé¤5½1/«´Ñ×’×!£\2Ôo`ñ¶tÎ&[ô¶1Î¥åȪ Ÿ/6àKÚû²ØªÆ]xCð=pÛÓ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ˜€‘ìJë÷;0U# 0 €«šëùÂçT0  *†H†÷ ¾1ÁÊWeÓLöCÀŒ¡YZÿ“õÇ O˜ú’’øuú8vÏK—Ù?ÿ_VLñ,ØpC¾Ö¾ù%LèËÃÃܘM¨rRìä@> ü;oÞ;ôA XJgôKy¼t1ý‘æ? DQÒ¢´î ”æ°µX2­yâd׬cBªt+botan-2.4.0/src/tests/data/x509/nist/test52/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test52/end.crt000066400000000000000000000012131322470703100215460ustar00rootroot000000000000000‚‡0‚ð ƒ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.050Ÿ0  *†H†÷ 0‰¸‘SÀêˆû½oð'ba·»ÇJ˜½ãyÛˆzú"á J¯ÎåJV«ÐTšH³Ü2;÷ž¬ç¶g—ýÈÓÛËS¡x¢íŒïDÐönðEÎ(¸ÞXõæ% óƒôë­d¬­Ú+—»;Õ„PY[‰kÔUKd¨³[²Yå qfðQ-.å¡£R0P0Uÿà0U 0 0  `†He00U ÚMvÍ×PA0U# 0 €4ž»øX0  *†H†÷ eZ@Û]à¸(U”>S-eJ¾¬¢°f¨@™rúÌ'©0]&Á­9½Úgð-X^£Åæ¦XØŽÜU¼µ3m{§“\õÚM"!ë µ…'sÿH- µMKÁÍfo^±ï˜3 òa“ø…°÷€_CRÿÚï¿Ü¾ÁçÕ9ÆnLbotan-2.4.0/src/tests/data/x509/nist/test52/int.crl000066400000000000000000000005171322470703100215700ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.05 990101120100Z 480101120100Z #0!0 U0U# 0 €4ž»øX0  *†H†÷ ¿‘ìƒÙ;WÆ öv”†ÛP¨È¿O­Glo›ï¬x”ÕÅõÌ•—´r“‘ü öô<±#q¸!çGG,Ëò ƒY†Àó¦«'9y’u0-€çί6úÂ(“ês÷ˆÈöÏùò½©ü/} 4½ 5Ю<Ñ?Àå˜BŽyÕúW|’ª Šbotan-2.4.0/src/tests/data/x509/nist/test52/int.crt000066400000000000000000000012321322470703100215730ustar00rootroot000000000000000‚–0‚ÿ ‚0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.050Ÿ0  *†H†÷ 0‰À}ø=)̸@¤M,Ú…®q]c”N)Á4òy„fÉ­÷B)Îb¿ê“ê$™aßa pk_4#zìòµÏ‰h,S/dfmg€Q²åá;.ã¿j.‰ìíÑ2¡c8nµ*¶¸ 4ó¾yÔÇJ<é¢ï­ æÎƒFSrsO£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U 4ž»øX0U# 0 €«šëùÂçT0  *†H†÷ ª‹ª¥80|-Ï:>Ñ—|Vï¯cÌs‚a Ÿl¨ÐD½†¿ ¯WÆmI_S†*þj°ex:…'3¥ìB î-P)5:ó+êqš5|³.X”£'6°È«[GÔ (ÀÑ®5ºÝbotan-2.4.0/src/tests/data/x509/nist/test53/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test53/end.crt000066400000000000000000000012451322470703100215540ustar00rootroot000000000000000‚¡0‚  …0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.060 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PP.08.060Ÿ0  *†H†÷ 0‰çi…?–ï®ø¹‹C € +Ëø+ˆNÀ¦aã°Ð\wyh¼T LÈ㌰‰ÎTòŸâžùáÇ]§»íXC¿4ºxG·‘ÿ¶×šc, ÅüŒ­vÕZù¼KóFoÀq}´f pSXf{ÒÒœ©YÇB=ý *oÕ»£l0j0Uÿà00U )0'0  `†He00  `†He00  `†He00U †ÊŠG ±0U# 0 €óÍû$a{¼À0  *†H†÷ lr·–J›.µ–ï]ÛkŽØ}áÏ ãšWf)®Š+wŽ]ÚtHÇ šƒ‡RÕ„E­çÕwm)ä}ûš>µ o™79êø»£YþÅUTÛÕÞšÆÒô‹‡&ªþ›fL-Âcƨ¯§ÚOf3Qn@FËÚ¡TÔ×|4¤2ÍuŽÿ+ÀÕbotan-2.4.0/src/tests/data/x509/nist/test53/int.crl000066400000000000000000000005171322470703100215710ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.06 990101120100Z 480101120100Z #0!0 U0U# 0 €óÍû$a{¼À0  *†H†÷ æ¾”-ð?ºïÞ£Ž¾°ºîñ ˜Õ¬ì-[´¾Ø/ÇæãjåîãD®‡;)Ï€î¨/šä‹0‹û«“¼'nŸ@ë¸ew`0îÃVŒ&[v5[ŽW \½ÝŒ&ËgÏÍbÀ¨:ì1… _XHŸêÍ-C0>÷Ô abotan-2.4.0/src/tests/data/x509/nist/test53/int.crt000066400000000000000000000012641322470703100216010ustar00rootroot000000000000000‚°0‚ „0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PP.08.060Ÿ0  *†H†÷ 0‰•"ÿOöÙ nÂ6=Å´Ã×f¨ÄË?xÊ`û+±%ˆå·/ç›$é-V½á ²Fhæ¦P"ù,W*ꙜР¹ËtÉãŽço>:ueŸT çӴÞq.Ty{À5Ü8;!êh˜EZ%Þ¯Á6¹7Ø# dqʥţ}0{0Uÿ0ÿ0Uÿ00U )0'0  `†He00  `†He00  `†He00U óÍû$a{¼À0U# 0 €«šëùÂçT0  *†H†÷ *hÇ5ˆé]­Á€éë‘®ó9üóp§#O,ØQº›ë)Û±bh>d9MÙ$\\:ìIŸ EðÖËÀ¸Œ˜K=ÉI$ ±ç÷xósK6‡œ¶ÁÝ[Q0˪– Èb°1¿óÊé¿Ýü;Én‰A0–Ú%̤Úù'êuÒBÒÓàŽŽÞöÓÇhbotan-2.4.0/src/tests/data/x509/nist/test54/000077500000000000000000000000001322470703100202735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test54/end.crt000066400000000000000000000012131322470703100215500ustar00rootroot000000000000000‚‡0‚ð ˆ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.010Ÿ0  *†H†÷ 0‰ÂCéæ>åtÀã„ZÔE¤§ÑàKŒ7¹r{ýXb+–ÀDZÃ8ìcWÉæ¯˜hQŠøbÙ~ëDÐ+ñtò\rsÚÊ%9 ê/¸Š©¯io[Ùè Éžm:jeýEHUšõßÏ`Œå(ÿ¯½Ñ´¿r8º­îÈ·¤I‡S"y£R0P0Uÿà0U 0 0  `†He00U ‹Ü‘¡r0U# 0 €™ŠÞ1S"^¥0  *†H†÷ ›G˜Óo ßô¸VÇvõ/ à^g× úSÉD¸_Ìàp°Ï¼:VõúæéŽf—dŽ¡ÁÊÞø¶Z†(ûצ™ÜæäyTÜaÓ“H:1‡›YÉçµ?‹Ñþ²á–yì*P;ųl¦Üe’“­¶+QÅ6S¥e æx]OÂç2…m3çW¸botan-2.4.0/src/tests/data/x509/nist/test54/int1.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.01 990101120100Z 480101120100Z #0!0 U0U# 0 €cÓᜫ}¨0  *†H†÷ wÆò8›¯Ì£pf' »%/gµ5PÖÃù]Y­ —q•°´jæþlvÆ=njxFš\!zC+ᄀ?‚¥ÞŽ …—uÐÅ–]ð»¤Ã5`»_ (8]…ÌXÃÖ»´!i¼Ö4Ö•zã níÒW:42oD/ ’botan-2.4.0/src/tests/data/x509/nist/test54/int1.crt000066400000000000000000000012351322470703100216610ustar00rootroot000000000000000‚™0‚ †0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.010Ÿ0  *†H†÷ 0‰Ä5vwº—n¯;0bšÉ.ÈÆ‘h{ô³¸j¨Bà ÊòÌ]%ºAÑ™„¥ü´#*žSéô#[¥Ž-AhM)9¦>‡À |gÁrgŒ¥±ÔR{¬9žeŸØ®Úòú—¡hçËf93GPC«OΙÄ! õ‰¶F¶Ì~©à!Õ˜Þ‘C*‰Õ˜jÁþ‹„ æ@õÍrK?ÞýÙ6’/#²ƒ°x&é«Öd,×ubotan-2.4.0/src/tests/data/x509/nist/test54/int2.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.01 990101120100Z 480101120100Z #0!0 U0U# 0 €™ŠÞ1S"^¥0  *†H†÷ dWœØÎ~Ÿ)OIõtÁÇÙüË›LømË.vo ›)-Ïì¨ýÄÜ좳Í\hI@“N`  8P9ñ*ø…ùºóa¸û¢Ÿ±&¤û`'žøµÛ:16mn1[vlÁÇ•DU:œ¿~ Æ[§F Nk¯K.¬ðÛF™ šubotan-2.4.0/src/tests/data/x509/nist/test54/int2.crt000066400000000000000000000012321322470703100216570ustar00rootroot000000000000000‚–0‚ÿ ‡0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.010Ÿ0  *†H†÷ 0‰ÜÔ(mí¾…C>/¨ªJüàɵn̯'¦A*ƒgPÎá¹_]ë«Ökºˆ¨‘9Á—ñ–1¬ø½:¸wõ…kJí„QkêBè¸A'áÒ%Ì®žý ¯å!TǘH¢b¯ídµ6çWIˆXhW¦×Çkh¯ÍïXUOÇjw’Ëå-£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ™ŠÞ1S"^¥0U# 0 €cÓᜫ}¨0  *†H†÷ 9-88Fw¤f¥L»XcŒ¾Uיâ/u8ÌaÅY!4 ‘q‹xO)ÇÔ6üòѱQ6ª9w["J Lnû57$'«Iš›HÀÓî’Q†z×Õ¢Ü º]„‰Y}\þh ÞË’ •€À»ó2t(ÌŽ‹öØçR=r⤎«—gqbotan-2.4.0/src/tests/data/x509/nist/test55/000077500000000000000000000000001322470703100202745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test55/end.crt000066400000000000000000000012321322470703100215520ustar00rootroot000000000000000‚–0‚ÿ ‹0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.020 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.020Ÿ0  *†H†÷ 0‰Óú×9œy´ZÃÏâ“c–#2«êo‘Þ¬ðs{ ÓNH·49}¹l£ÞÖGË®x_H톃v²B<ÃV©¹Nîûe ®É¾”SÏŸcgªÀ>e [‹|šýSbC当qÛÀÔj~ŸrUc?k9²ã¿2àÜŸ;wk±ðmƒ£c0a0Uÿ0ÿ0Uÿæ0U 0 0  `†He00U 0VTΧw¯0U# 0 €ù4 ] @¶n0  *†H†÷ É¥MàÎÆã—›‘ ?{øCë~ æTŒµQÈz.ï}vúèFíƒ;Áažþ•f“/b€æ R¬}‡ Û}/×7Ñ—iã,²< þ£:—0¬¼Á» lŸqþÛë¸)<žà÷i™f¬x0É×"…1Äj‡çAÖ¨Q÷ñB 9QÀbotan-2.4.0/src/tests/data/x509/nist/test55/int1.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.02 990101120100Z 480101120100Z #0!0 U0U# 0 €i;¨6Û[0  *†H†÷ dK~4n^ Îfôê’âlUVY¬%Q¦ŒûD~ë5ÏPM›`¾xÀ·p·þcêËb° ÷x:E¤ÂqÀd¸åÁ XâvÖ#ì+±ŸVîøx†•QE»¨hŠ}FƱƒqöÌù¸XÍ€ÙŠ!ge'‹Jb‚ ™“èùbotan-2.4.0/src/tests/data/x509/nist/test55/int1.crt000066400000000000000000000012351322470703100216620ustar00rootroot000000000000000‚™0‚ ‰0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.020Ÿ0  *†H†÷ 0‰á †\G•()õi vî¿„ä*~/?¸2W’K‘¤® å+©x¤³°-„æ~oÙª/‰hJÔƒÆ\ãlŠiÛ$ÌìYd3R{›N·Q=÷gí"ˆ".(µ»¶ ò&µb¾ži z*aWŠ‘zŒr8(œñ…Ǥ×kË·þØö2b*ÎMVZˆïi)@ŸÆLYr ˜!0v›<íQëoFþId\YcØÈRpö}@Ï5!ýáÍèû«Ð0ë#«£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ù4 ] @¶n0U# 0 €i;¨6Û[0  *†H†÷ ÂxøPÆœV„ÖèñºF‘¶Ü)=ä|¦+1ìdÂûø%%KóžÕeJ°jõaÀ—×EuÊ›è˜3‹/€Íáp™à³73ÐËÆ³øR2XCàfs²@&¼ÿ[žÈ}l-`eÆ9[Vn‚8GF‚›ñ £øvÈ“xátmxpbotan-2.4.0/src/tests/data/x509/nist/test56/000077500000000000000000000000001322470703100202755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test56/end.crt000066400000000000000000000012131322470703100215520ustar00rootroot000000000000000‚‡0‚ð 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.030Ÿ0  *†H†÷ 0‰°· }‚óÿSÞh%™Þ–"’ DdºÌºéEhTp3+’¾ÄóEJ¨Ò’¼È_Ó…}è¥[šÍdèf¸í‘¢]Õ%ä c}-”¼­2 bŽSНç܈“u±3ŒÄ8'ÉVtÊÕh#üÿP–Wñ›¨%õÍ£R0P0Uÿà0U 0 0  `†He00U Ä.+Ÿm0U# 0 €ñ6'­UêÙ0  *†H†÷ >¼iÿ®š¾|¿™øzŸlÕ4Ô L@bu×Àt%©x\ù–œ_›‡@ZᦶS2*Å÷$¾ÀìC½ÿª| hhÓuªAÌ•CûI÷ú Xû[³)ZkÓSw‘ÀxÇX}ˆÌk÷Üýû¦P¬å› ¿e„HÍwûjãö€- ­botan-2.4.0/src/tests/data/x509/nist/test56/int.crl000066400000000000000000000005171322470703100215740ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.03 990101120100Z 480101120100Z #0!0 U0U# 0 €ñ6'­UêÙ0  *†H†÷ èYÁ-u­à÷ ý\DX‡¶UßÜ®þÙ½ pPÁƒÂH²•;é‡ÿíûSùSè1¤£©€èxùÓAä37Û±|E;m’vÝ<&¨óН¿9z˜3¨W°$AÀKrsK2=Ö­bÄÖöô°Õà&°É€=L©‹˜é$¬é botan-2.4.0/src/tests/data/x509/nist/test56/int.crt000066400000000000000000000012351322470703100216020ustar00rootroot000000000000000‚™0‚ Œ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.030Ÿ0  *†H†÷ 0‰ëLºWe¤4 wá×~vA•ó‚žúøx'ÈY ¸ý6Gª'ÃÞ¼fNËû"¸=òÃHxÛ­s=lz¾—‰@3Ôå}×LéƒZezÜ–D^kíÇÅÚÞž:ÐdK+›mÑšüWè@öƒ¯Â¬§¬ˆC`/í 16ñȪë£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ñ6'­UêÙ0U# 0 €«šëùÂçT0  *†H†÷ Ql2*Ñ#ÝD…_.U²§”u#⦫—¼²ÝÅi< ‹£-,ûŽ—äÇ]œ¹zmOÝ´•M%!NÏ—«[UNµô™e²{È?ÀÒÈŒ CsÎßK% ÏwcA 6‘ã«WÚ¿Ø qîh¾Ïž#~÷aZ‰òÁÓàOÅûbotan-2.4.0/src/tests/data/x509/nist/test57/000077500000000000000000000000001322470703100202765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test57/end.crt000066400000000000000000000012321322470703100215540ustar00rootroot000000000000000‚–0‚ÿ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.040 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.040Ÿ0  *†H†÷ 0‰׆×sW‰kÛâ½cͰκ_n ˜öÁ‘çÒ@{ ARD´{¹ìV³. ˆxe€Kùcáh’kÝ­cœ)çˆzòo&Á-w ñ]¿†µJoHDk5Þ àÈ㢠ÿ.÷5Ä»ÁæW-6k5cÊ»~> Ãš¦j€#¦p>µ>ߣc0a0Uÿ0ÿ0Uÿæ0U 0 0  `†He00U a^_ÌÓ0U# 0 €|K9ÙÔ¢0  *†H†÷ ‚%EßÑWÜä7§ øL»ÊâUÌ50jÛZ¶ Ré ÛÉ™üø¼j5¬¦‹geµUújoóyµœ3Fï ÉN Ïâ=ò9ydòõ"vŸì×ê¼ÓÔcÒ¹èÍ.ûL<¬>Ðñ•Þ£TˆŒöh¬ƒ#{ÍK¥ƒ…y»ïbotan-2.4.0/src/tests/data/x509/nist/test57/int.crl000066400000000000000000000005171322470703100215750ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.04 990101120100Z 480101120100Z #0!0 U0U# 0 €|K9ÙÔ¢0  *†H†÷ oÉW×Ô¥TÔdsÔŠ6”Ke &ë·ceó ò |Ç©uëÛªìà;°.};¢~Y©î‰ê‡S¿¤kA¨ë…ÁãâñÚ•Î{ÆÙ¼Ù“Aï̹}3{Ï‚SJøwvÅ.2OŠláð]½{Öq1è7ïXvÆ:Ù«¨˜"‰´%WÄ"botan-2.4.0/src/tests/data/x509/nist/test57/int.crt000066400000000000000000000012351322470703100216030ustar00rootroot000000000000000‚™0‚ Ž0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.040Ÿ0  *†H†÷ 0‰Ó¬ØÔ oÒDìáu8b¡à¶ò`‘ÒØÅ½–fŠÝ®nÿÔræ°;÷E{ë/@kæo£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U |K9ÙÔ¢0U# 0 €«šëùÂçT0  *†H†÷ !æ æ¨ AëÙÉŸ¹ ÝÈ`Åïôe½5 íËÆÊšïnÀFfDßäl1‚5\,v9FUö9½¾9Þ3üñMùóº€Ù”pÆ^+DF§Y.tÔ9Ëh¦{a'4HCLk¡Ô’Q~Ž+• ¸cIetÜ;OúVRÃ9x%c*botan-2.4.0/src/tests/data/x509/nist/test58/000077500000000000000000000000001322470703100202775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test58/end.crt000066400000000000000000000012131322470703100215540ustar00rootroot000000000000000‚‡0‚ð “0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.050 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.050Ÿ0  *†H†÷ 0‰Â\˜ó(g ÈãSÈæº±ï ¦H)YÛ^R%ßo¼£ ~™çd‚}‘{}²i Mè Æcï)®[!Yµ§|ëåרâÿ9 FPçGõ¥„P¿å~{?ºXoßøí¦îÑÇl,…žã½àzYKËóòlQ@¢ãÛ¸cR³Í6ëe£R0P0Uÿà0U 0 0  `†He00U o.S=¢¦p0U# 0 € UÞl×`ü®0  *†H†÷ ^’Çv®ø'j8Ù£ÎÌ8yߥ’‘4Û_ÖæPÜ Ü„—ýñ…Z£K¾›2ªÞbyž7ÙÜÒÃÑnù^` M0µoRÔÊ1Ì“"ŒÑ®æ„ÞŒ¤­¼Œ0ët¾BW]¨}Gt[&ÑwÍŒÞ!)³yÎDu£WQ°]ï.6…'ëüûbotan-2.4.0/src/tests/data/x509/nist/test58/int1.crl000066400000000000000000000005171322470703100216570ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.05 990101120100Z 480101120100Z #0!0 U0U# 0 €žÿšK‹¸B0  *†H†÷ æ.9€DÅ¥ô ÇÒTŠ˜L ]°ò­FEÜÝÓŽÅ#Îó_@,*ÂTÉ^±ât#Îò4a1&\vÌNR®Ž\Œè°:—“‚×!¾”Ý Èlæ÷¼"O¦Êç¾qø)RŽæPÙ=­s,ÿø6Þ2›D òt•WÂ(†;dìÁ=¤botan-2.4.0/src/tests/data/x509/nist/test58/int1.crt000066400000000000000000000012351322470703100216650ustar00rootroot000000000000000‚™0‚ 0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.050Ÿ0  *†H†÷ 0‰þµAfxŽ&Ã…DewŒùïÓ—¬D¿?}A»~rB°‹}¾¸Úü0 ·®‰6]ütn~l¬–h[ÍëÅ|MžœjnxÍÜhq”W&•E:}ýBðaÓÖýÉ? ¥jGO‰ Ç òp¦ˆ³"Ik  æŸêÝ7…ßÛ }S–·÷£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U žÿšK‹¸B0U# 0 €«šëùÂçT0  *†H†÷ 0´bŒ1$¦ió•†ívU0ÿÅÐØ8s´{s‘MRÞHý¬¦´ÉHÜÕ©Û`òE28ºX"é_3ë,£vøVIýþ]c" ²__MEøeý«ÄfŒ¦ixvAõ)¸ ÂhI¡þG g@:iG+ú€ØCþIÍ]˜“#nöbotan-2.4.0/src/tests/data/x509/nist/test58/int2.crl000066400000000000000000000005171322470703100216600ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.05 990101120100Z 480101120100Z #0!0 U0U# 0 €É«½ô}LÙ0  *†H†÷ vÃ^º<±ß˜€äawÙi’åœzAD4É>ˆƒ‘çñxn—é7&CO¸JÍ™ôwŒ/á[Íò÷¿™ÒÕârðàÛ×ÿšMâ½h¥®>*°7g=ÑsøpAûÁËfƒFµŽ­· ‚³æÅe¯~€à‘æ9¸ .Ö;botan-2.4.0/src/tests/data/x509/nist/test58/int2.crt000066400000000000000000000012351322470703100216660ustar00rootroot000000000000000‚™0‚ ‘0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.050Ÿ0  *†H†÷ 0‰®*ø¤º¯DïôóhåØtò€ ÚUl—»ônmü^±í<õ¯úmtâjõùõ?LóŒ•ÇlòÙúQUf­x3½>cxŒ›]4±ºê=doðd3T¯]¬8yáQ×vü@`%ììfˆ¦µ¦ 1d⣄U7`8‘D¯*$jA÷£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U É«½ô}LÙ0U# 0 €žÿšK‹¸B0  *†H†÷ Ž*$^’L(¾zU¥’퉜i Ðñ8‹&ƒ Ô´÷­'¨l #ÿ%¶`;Ë@y‹K/*4B„³©|)M=SÂÇÿ¦s¾~,o‡W•ú¤ÙAÿ–º‹7EË—Ë@#^ öž€"Ÿh8C7WÖ´¢$9î€ëeO¾Ê‚ò 6UÌbotan-2.4.0/src/tests/data/x509/nist/test58/int3.crl000066400000000000000000000005171322470703100216610ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.05 990101120100Z 480101120100Z #0!0 U0U# 0 € UÞl×`ü®0  *†H†÷ ©‡±¢2‘š5ìí”Fš{Ìtà¿Õ±ð=]¼ÍH »€W‘Hx­‹à·[5Ÿ ˜AC§Ò}h¿wiýÛ΃oX(¤ÙZÐ-ÞgqÀ…ˆ-8âÔÖ6§îïWj#®Ðd³”Œ[J¸£r=$.ð[-âfäa·‰Pâ» ¬pÌ…botan-2.4.0/src/tests/data/x509/nist/test58/int3.crt000066400000000000000000000012351322470703100216670ustar00rootroot000000000000000‚™0‚ ’0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.050 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.050Ÿ0  *†H†÷ 0‰µ¶üðÆÞL|.œßX-2&˜y‡r×d–VÑm¯¢Ë5ƒÏ×ó¡4ë·_lâ•Taõ«4¾ã›®ÒTö⤽¾5¼K0N, |ÅXFeŽìCþ ß_Þh ÂyŸå#[ì¡tgjsTId_б*ìÔËvº\®Á`5•'DÆ“Qã£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U  UÞl×`ü®0U# 0 €É«½ô}LÙ0  *†H†÷ m¼ˆweéÓ³öý¦/¦õã2îx„.2/×Ì‚}kâ%ÐÑ;b+`¦ˆ©øxøóìÃñüÞ'à Wà½Àßp ùØÌ@9TR>äðà_9»ð‚êÝ_¼áMâ7¦‹4ÄKÝæuËg±4iSÐ BÉ.D@„Ž? ž˜ tbotan-2.4.0/src/tests/data/x509/nist/test59/000077500000000000000000000000001322470703100203005ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test59/end.crt000066400000000000000000000012321322470703100215560ustar00rootroot000000000000000‚–0‚ÿ —0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.060Ÿ0  *†H†÷ 0‰Ý«¨—#^x»#?[“O¯‚m5GpÙ«¤ih| ÉveÇ¢7ögé(¼lb<[? á‹—¼Ëu£àÀ™£¨pf&ÂH}kæ^p*K¦;8›3œÇK؉rŒk9fœaM\Š.`"-,†yâo8•jVÍetFVY§?E~ £c0a0Uÿ0ÿ0Uÿæ0U 0 0  `†He00U ¶nK¾ô5Àì0U# 0 €ª`RcBy0  *†H†÷ c5ñ¤v‹ËÒË …ÂëDÝWrI O6˜hmò¨ o\5A|î’4&]œ”Í [\° ¨a÷aL€ -û+$ºâW´D»ŒÌÞ»RÒæKU x!ú8¤øL ¶\\ØcXb~JZó¾šG+í‡S{G¾‹ hê¬`botan-2.4.0/src/tests/data/x509/nist/test59/int1.crl000066400000000000000000000005171322470703100216600ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.06 990101120100Z 480101120100Z #0!0 U0U# 0 €mCŠêÁ^š0  *†H†÷ ˆs5Ä[˜·«C±Ê³Â=&,sÇP¹Ñãï7#ÔƒB§WMÃw…Û|ôÜ*SŸ1ï&éó{›${DþŸ'=nd7nV@éX‘špÊD^4ó–^½MÞ|³&9¥OÆ#»ç™asý¨sË¥…Àûž‡Î¶¨vÍS¸†Š™`Kƒ@÷|çbotan-2.4.0/src/tests/data/x509/nist/test59/int1.crt000066400000000000000000000012351322470703100216660ustar00rootroot000000000000000‚™0‚ ”0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.060Ÿ0  *†H†÷ 0‰Áà€ˆAŒ/'&¡ØëPÂAl†Ká_jýÓ¥ûúT!¯MIÔöß63…(ð‹5Ë •ù‡ï¶ôW¨ü8¯—gÈåøÕLc tÖcÒÃGº€ÊO3ºâĚئ#èÆ¦lôË|io'¹V•I^ôl“q€£´†@A ÷¾Oߪá£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U mCŠêÁ^š0U# 0 €«šëùÂçT0  *†H†÷ Áo´XŒ ÃúŸp«©ÒÎJå ´»¹èW ¤ˆª-Q.öû_/hoÑå±%Â.òm†y)DøùÚU1Ybù!¾QeÕà²üÞŒ‹M › ËäkªÒXx0&¯*[%†¥ùƒNo‡ó³Ì}rЫ³ð`0äiA¸ S@T'Ûbotan-2.4.0/src/tests/data/x509/nist/test59/int2.crl000066400000000000000000000005171322470703100216610ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.06 990101120100Z 480101120100Z #0!0 U0U# 0 €MíK€›C0  *†H†÷ ¸4…[RŽsŒxÔq¯u°üÛb¤=²ë4¡ÞkQ¢ŽÐè¼›îŸ)™4Lâ£0N‰Hó3 mÖæá£ÄÂQÑj‚Oóì±$‰Jhv½ÎØÏ„ŽÁ*ˉÇûpRrÝÌÍíãÅ©¹õ«é_ÿ2šPjÏ3ª*´Ojm:Oå”~ëTç|Óµ+botan-2.4.0/src/tests/data/x509/nist/test59/int2.crt000066400000000000000000000012351322470703100216670ustar00rootroot000000000000000‚™0‚ •0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.060Ÿ0  *†H†÷ 0‰ÁþO«ì›Äè¸1°ÛKTõH,çïÈZ ª’ÒÎ1A<¾lëôü"ZU4Æ1_(‹jDË{­üÓL÷ï¾|1°Ð4ûq+8·Ó «õh´À;˜a¥^Øå•íwj×,Ft¤¿Ù’d7ú:Rxu‚ž1[w— OJðƒ!£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U MíK€›C0U# 0 €mCŠêÁ^š0  *†H†÷ 7L¦áÇúxÑT™,œTaìôwä ÚNçWÞæèGd¥mÉñ›¾áPˆFo»-‘TY-¦h(?0ÇE†ÏŽ#¶™êà@üºŒ{±¡%"?:÷ UÙRÃq{¸÷!ÂK©²uåJ†~r¦Òk†&ëøîh…éodœÙ#sÊbotan-2.4.0/src/tests/data/x509/nist/test59/int3.crl000066400000000000000000000005171322470703100216620ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.06 990101120100Z 480101120100Z #0!0 U0U# 0 €ª`RcBy0  *†H†÷ p÷Îùö*cµ î(±"9@«–&G…4è‡c1–·GUqÌÞ÷©¥%06“áAœ•à0õý#?÷Ö‡ò^V}N¡6mÐ";HãЖdRÄw;”©ý~±lc G’°½ä˜IÎ |d¹+_i~#Ѹ.ÌЗHS~4™‡/4µËbotan-2.4.0/src/tests/data/x509/nist/test59/int3.crt000066400000000000000000000012351322470703100216700ustar00rootroot000000000000000‚™0‚ –0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.060 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.060Ÿ0  *†H†÷ 0‰­˜”2Ç_‚¤´©ó,&#žM;ô€à\Ck‘ndtÁ! ™¢ Gᕇ­æJ³rïÎsü¹'|xBü‘ãpàüé¤õ,_ɯõ%¬T ž’óAUð`.ÎE%„e9ò9p&XÊcŸ%àe¾2ìvŠƒÉÃ#š¢/ÿÀ<¾êcjßr`@jË£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ª`RcBy0U# 0 €MíK€›C0  *†H†÷ 8—­ç@ ÔPM]“* ¹H7O•ÌãíÆYPIˆ’¢EøæÄpœÖ©¿:ìJ‘¾Qꎅüªž"IÈhegNNNþ®ªÕ‰èÃ\Ù™¥„þŠ"$qÎzïañuŸO ì!àkÃjé¦â“fYátÞ{š°zØÑoaÖé9¦…nÍ¥ƒ§Àbotan-2.4.0/src/tests/data/x509/nist/test60/000077500000000000000000000000001322470703100202705ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test60/end.crt000066400000000000000000000012131322470703100215450ustar00rootroot000000000000000‚‡0‚ð œ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.070 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.070Ÿ0  *†H†÷ 0‰­&Í^"p¼à|ß2ë¶'›«ÐyP@T¼öçÀluâp‡ 6ká7ºX¸7>\î6Ø¢:™H:Q0 ëVÁ¥€éÞÃÎüAï|>ýuæ ŠppA‹¤®‚_+Õ£˜›FfàìjZn÷àèîzÉs0Ë‹É?ª?ùݶûx“£R0P0Uÿà0U 0 0  `†He00U I•º¶~íEÅ0U# 0 €Dq› F®‚0  *†H†÷ ^»é|»ß…”Ž9¾¹gèyc¤çÑUmZ€|ä1šg€­Â1õ F\éG¼O‚<ì;"WC·¯”ŽëmÓCÍÄ,ˆ3j\9—†Q .ä2VŸD‘Ã4Ì%® 䯻Âø±#ÖË¢¹àêÙUï"P¼.þ8³vä™botan-2.4.0/src/tests/data/x509/nist/test60/int1.crl000066400000000000000000000005171322470703100216500ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.07 990101120100Z 480101120100Z #0!0 U0U# 0 €´”~]ñŒ°0  *†H†÷ &Ö„#_Òõý¸T¥”# áçË hqͱVêIÀÑ3÷ü­øRÙ|ÚÓüLè®ÞUKBþ2«‹£©ôI‚×­pñ›/Hû°É¡3Q`φ?qè9#ë1%…³s•~è¾™Ú ô–Dû¶’Îî<¤Ã‚›$Ês)¹˜botan-2.4.0/src/tests/data/x509/nist/test60/int1.crt000066400000000000000000000012351322470703100216560ustar00rootroot000000000000000‚™0‚ ˜0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.070Ÿ0  *†H†÷ 0‰äyã“Kºª½g{÷êSÔ'c» W^µ‡M·ƒ²+#dË ÒÀ‚Gœ@)„,%$¸¿ÿ AGq•wгÑ$(S È[ ‰+òË›o« Õ§ð Kã7+E¢%8I2lI´ýõ=¨s#œW"MLàCŠ>Vy¢#·ôS¥£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ´”~]ñŒ°0U# 0 €«šëùÂçT0  *†H†÷ ÒÎúA"³ ÌHxeÁy.×ç=™gˆ=#nå‰såÞv©­¶˜Ùß—ëÖ‘{d5QÌ“w„áù'k yÙÛ±•O«.Öj;’à/Ò« M}öòøm_ƒù#Ÿ.4P0z„É»—ˆü˜B°WMÓZóÕ[óçÐ^?¢±áúÉCNbotan-2.4.0/src/tests/data/x509/nist/test60/int2.crl000066400000000000000000000005171322470703100216510ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.07 990101120100Z 480101120100Z #0!0 U0U# 0 €$þ|17±š0  *†H†÷ .%~ZW†ãˆÆA`µns÷ê„wys†:bY ¥'!xÄL}ëÎI-æN-0Ý4ÉÆU‚”pŸvrBÇ-żµ¦®Ôžâ@é†cþê!=Ž–fƨ«› x8ÎUH~f™éôÓ«Ö·î·QƒG<4µŸ§„?Ï5Ø>ï=~£Š-/tzbotan-2.4.0/src/tests/data/x509/nist/test60/int2.crt000066400000000000000000000012351322470703100216570ustar00rootroot000000000000000‚™0‚ ™0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.070Ÿ0  *†H†÷ 0‰»¿ ™>GÂ`GïŠñòË€f¥Ëõݘ뀾-Á0R:Fgä²ýÇä>à9X€‘V dƒ>§ƒ–P€À ð_uÌ‹µåû4ֱʈ°Õ{/SÛê g*JÝ.°­¥¹bŽÑ¼x úÙ]R#Èo‡‡¹Y12“;ÔXŸo4‰ô›£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U $þ|17±š0U# 0 €´”~]ñŒ°0  *†H†÷ ÚJ¯ß‰pqy[("MµÜ­ƒu°PÒ™O ¦£ò¬Ý¿ ‘Á‹§¶)eËOmWÐÜ+ /y.¨s}^ºSòqñDÔ_iÛÅéÒ÷NÈ èp‘ªíp“Éõ¸Wq!]°Î$$­î×qV+–éB…ôàuž{˜OÆýÂý0‚Qbotan-2.4.0/src/tests/data/x509/nist/test60/int3.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.07 990101120100Z 480101120100Z #0!0 U0U# 0 €¬<&Q̽Wî0  *†H†÷ IŽ;§Þ#EgTë=/6`·g¦Ju ý¥FÚ&”g‡yõAh=‚Ư’|ÍÇN\ü‚°€<¬.–øÃá§ÿ›­Ðþ’[Ê]ÛlÌg¦ <÷ !D3œ€Ê/õ´/  /¾›i.gW›}Î ›¯é?>@Æ?ƉJ=Ñbotan-2.4.0/src/tests/data/x509/nist/test60/int3.crt000066400000000000000000000012351322470703100216600ustar00rootroot000000000000000‚™0‚ š0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.070Ÿ0  *†H†÷ 0‰¯¶ÌÅïžD®4'Wr‡D¸*ŸÎ•Q >¥h’=Cãq|3hì'"kðÇnXu—C·ŸÈÿØa¨#~÷_.xÁ9ÐÉ(3\mÉ«D‰pX±’Uœ)ì²Ûtú•!ìT• ;=« ›ô1á+ÑW½ Âë3ÕÜÁI¶²hY£(m £f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ¬<&Q̽Wî0U# 0 €$þ|17±š0  *†H†÷ I1ʧÙÍ1³:ƒûÄU‘ïšâ¨£ºç8GezØL3ð b0pqGå ÆáÒóaóßá|^\˜# kÜUÀ´ì³\€ÛÆ.ÇÔ?™å;O§\£ð'˜çkÙrú^nb.pãäPñγ°{ ±%ÆI>Œ Edⓞî—öÎbotan-2.4.0/src/tests/data/x509/nist/test60/int4.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.07 990101120100Z 480101120100Z #0!0 U0U# 0 €Dq› F®‚0  *†H†÷ 2”Ot#º4þbúØÏÒ~ Ô>îìTÅF&>ÓÛ°¼ 1eHò’ "£øì*¡åõÁèk_"xurd"ß-ˆr¾m±ßmjs3¡ß†1Ú9¾Ÿ‰Û[@%üâÆIk׌ݱa‚‰µÜg-êÖNŸòqê?i÷…botan-2.4.0/src/tests/data/x509/nist/test60/int4.crt000066400000000000000000000012321322470703100216560ustar00rootroot000000000000000‚–0‚ÿ ›0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.070 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.070Ÿ0  *†H†÷ 0‰îcRñÑ³Ò  °QÌý²¥ÓLj[3w0s´…Šg¹"\e!  áe[Ÿ>­¯±Ü‡|¥´®Õv-ÿ\AGköP˜Ø ëóõLäå¢îXòLMÕ„þܪ'h[eõƒï·ât7VM“o WDöùx¤ÎSšêä/OIG£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Dq› F®‚0U# 0 €¬<&Q̽Wî0  *†H†÷ 'ÛªnD™ÙåE4²(|Fì°…J:ëp—úz~ȼïëZob»¾†náà fø;2°­-È»|ÊMG)굋èiÁ2®xñâö}O×ècóv×·û{c…¨wñº…Ì:'øÞš§ƒ Y4ßt¬Š5+Ï zv¶´k…ŠÉ•_C8]ebotan-2.4.0/src/tests/data/x509/nist/test61/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test61/end.crt000066400000000000000000000012321322470703100215470ustar00rootroot000000000000000‚–0‚ÿ ¡0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA5-PL.01.080Ÿ0  *†H†÷ 0‰Âd… ܪháDº ÐÞä (‚ÜZżéV|3èžó§žwÎg¦¢þ|hâÂÚ¬H²Âàˬ8H •ÐX³YX™†ô숦¸°ÔºòÈaoKç/9O¤5 þÊT¥¼U³;žúe*›eN æI£Þ!&3‰v»Æ¦d(Nãc0a0Uÿ0ÿ0Uÿæ0U 0 0  `†He00U ·À¤=ËöM0U# 0 €S®øv… |0  *†H†÷ m€4·?‰¿ZË=о¿]ÿÆìLJ¼‘¾oZi=·Vÿ»G#ËÓ¼Îyöv`·9!K–@¼ÐS‡Pôìžès‹+l~¿YÇ}â“ÇûÂë6yM¹»cˆé†HçÇ”a;à72º[Ê0jÆ 7§È)Œ‹¤µÔÇ06°ôý˜ðIP$©v‡£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U óÝcµª00U# 0 €«šëùÂçT0  *†H†÷ }é/`ù‘&Lá³Í®8õÚ^¶`H5¥³qh,‰%´­Ú"Ë#OJQ5:çÏ<}é;ºyÅÆ"÷BÂ#ÿô¶U ó.ÚP±MÊì„V7À,÷(ð7P§m!–îZ÷úç ¤ŽÒéǪãýüžßºGÔŒ¥'¡á%JÄ"9botan-2.4.0/src/tests/data/x509/nist/test61/int2.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.08 990101120100Z 480101120100Z #0!0 U0U# 0 €Xñ3tdm¸M0  *†H†÷ _ÿˆ@1ìòÓ‹lzi†ËiÃÑiD£2w¼àÀÚF"®£w‹èVÊ{^3Ú`l3e»ÇÌCŸÙÐÔ[…ÁYØN€ÕËz˧¸¬c¡ˆ±Õ¡­ƒ*%òŠ15Œ¾,õR;n¦Á”Y-Uª¸ ú ™«[Ïó"T}•fÇ>yÐæ`îž²botan-2.4.0/src/tests/data/x509/nist/test61/int2.crt000066400000000000000000000012351322470703100216600ustar00rootroot000000000000000‚™0‚ ž0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.080Ÿ0  *†H†÷ 0‰©–h–¸ ßxµ¬L?ZbŸÆ¹> Ò“·Óú¨k% Q3–ålµ©+-5"¤7Ó»|´‡´6ÈÑ¢˜{ùð0n5}²]ÉÙÝq±ä–ƒÅâã1aÞŒs“º(îØ«<–ka¿ô@t¾Š*ýwØj²B޵›-lþ=þôÜ,lðÌ÷£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Xñ3tdm¸M0U# 0 €óÝcµª00  *†H†÷ “‰(›M/ä.w×7–Aø ų¶s°ÓÇ‹†¹Ï‹%CŒ>]ùL¿† æ‰GéE&Ó`ürþ–Æ y;A| @oÆW„¬Ï뮑33¸ÅEÌû´üšÙõüdÐgH8è¾Sz¾fG¶),Žº‡v´i[¬ã\=½¢ò a™botan-2.4.0/src/tests/data/x509/nist/test61/int3.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.08 990101120100Z 480101120100Z #0!0 U0U# 0 €`aâH†´s0  *†H†÷ K ~걃* TµwÎ$/&PöÍ^±üúq›a£ÑO¹xYÈlÃæ¯„ÔcÒ9”ÉË"%ÖkÁĺ¥‰„‡\°sí6Ò$—+Ÿ{XãƒÕ3Ó ‹Ž.Ÿ^²£'¬ÏÔN’¿`¤ÐF½›/ç1@ÖX՜ըC ²âäÿ botan-2.4.0/src/tests/data/x509/nist/test61/int3.crt000066400000000000000000000012351322470703100216610ustar00rootroot000000000000000‚™0‚ Ÿ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.080 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.080Ÿ0  *†H†÷ 0‰¢íűÏ9$!‡¾*¼ …¤#Œd*Ëbƒ±m4S™qùrhOÇŠwšqКÑ#çþ9 µ^‡Næ wœÕa|Hç¯yTøwœoúdjV®¥Ò?·DÈé%ºvèÑëÙÅŸªæC(HÚ´To—åªxêóq·ºbB$ÃzEP´…e£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U `aâH†´s0U# 0 €Xñ3tdm¸M0  *†H†÷ Úš%»°òÐóy×·rÙzg§„ ÷.$`p²(º¿÷q™E³¢E!ý‡i )Ñ…J-·6g¼®§ã3v´tÃ4(5/ygN×t+•éœ-2y­×v²·8eA¨/0ô5½§—)=‚ËèRDÈzEœ°}Êbotan-2.4.0/src/tests/data/x509/nist/test61/int4.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.08 990101120100Z 480101120100Z #0!0 U0U# 0 €S®øv… |0  *†H†÷ rSTœq; ÷ÐT»Å÷}ŒÔ@¼t ÷üÓ-|ÇäËÀü¼4æ?mtü.Y“ÚP³êË ×hAÖ&´$Î|ÔäŠÑ>5)ŸKÑA>baF&<ôñ{Ւ޵ÄÇJývÝ“]<†Êèæ­OÖ!Vå`#1«àƒ,+oä\á_$Ç-BT·ËòDõŒ¨4ÛáDÝÇXÐÜšnZ'›8íñãyŸcQ{a|xñža”yi@¿#ÜÝŠ 2¹`¢ô²_!íN4Ÿö~ðÚµ>botan-2.4.0/src/tests/data/x509/nist/test62/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test62/end.crt000066400000000000000000000012131322470703100215470ustar00rootroot000000000000000‚‡0‚ð ¦0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.090 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-PL.01.090Ÿ0  *†H†÷ 0‰¾ƒSîª9þüç÷æj•UJâp…yÇæée€€áU‡&dUËõçEßæa;´EHG« Y&æØÆx#v“sFuœ3ÿ!öA ñh¤JªqQ%üÛÐnX³áýØ"ܤÕÊÎ@¯³7呇kK `87¯­°ËírÚ»\¬|Ń‚y뻣R0P0Uÿà0U 0 0  `†He00U Fp½¤•‡û0U# 0 €·Ôì±Íw‚0  *†H†÷ y¾þô;WëËujŠ¢§6ƒ¡tÓ!Ja5ax×Q©W7Ø‹#U§“mÁ°„_•¿•JeFõ×ŲDmof?yßL$DQÙ¸öæ£û3°øà¢Áhk„)tá ÍËkБ¾?ޤh8q$O¾ßÁ&ëúcªldÖ·ïŸx»Kæ÷Lͪbotan-2.4.0/src/tests/data/x509/nist/test62/int1.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.09 990101120100Z 480101120100Z #0!0 U0U# 0 €îí«‡I à0  *†H†÷ mw5BvL Î>¢fDQk T…r@ÓÁœ¹hÙ袾by™µ³Éò«}Qæ‡É[_Ï„"Kr¬°ÿRœÞÑ þŸ-òApUv—‚“"éò› *[yYÃ5ʃš,:&‰GÈ9ãh30ÛÝÀñ í¤ï‡Jbotan-2.4.0/src/tests/data/x509/nist/test62/int1.crt000066400000000000000000000012351322470703100216600ustar00rootroot000000000000000‚™0‚ ¢0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.090Ÿ0  *†H†÷ 0‰âÉew+…üù—h´¯›ØÇ+ $$iÔã%•Å=›Æ„6ºÀ˜6£5Ë.Nrí°–`NLJ n(½Â’œ”üGô¾‚ª>]åÖÑ0Ñ c8Ýl>Ò›¸ù쟫[9r™­kiA'˜h/X=#˜ÚkœÂušæ3tç:‡ãÂÓ£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U îí«‡I à0U# 0 €«šëùÂçT0  *†H†÷ ví‡Aã(¡ekÏŸYùí:~gΤ~´i ÎK¨½dâ’ .ðá-èŠJ;³;HÜçÅ¥öºSb‹g{*·¨Co©•W*:Ált®$]Å ysÇ%$[ß©øÖô‰…JÀwC o ‚+ hR¬n~\1„®ƒs.¼¹«ºûbotan-2.4.0/src/tests/data/x509/nist/test62/int2.crl000066400000000000000000000005171322470703100216530ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.09 990101120100Z 480101120100Z #0!0 U0U# 0 €£°G]þ?ðe0  *†H†÷ «§§^ÛÈvÉñ³Z}u†¢HgÐ bY>ƒ&Á#‹ÈŽÎÃë" qå™`C„-4|ú£úzi±ø0šµ.>´®Ê4àÞ1oññ§Wà €ËùÜìl´’cÑq¶§‚=öz¢Q‰B(¥ÖIdÿ¼béš2ré'¿botan-2.4.0/src/tests/data/x509/nist/test62/int2.crt000066400000000000000000000012351322470703100216610ustar00rootroot000000000000000‚™0‚ £0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.090 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.090Ÿ0  *†H†÷ 0‰ïKû\fN†G“6ô’º7AÚê~öõËõSÝv˜N5<ýµ§Úú;ø[¹ãIËöÔ"[6Uæ¹@Äå]ööêKŸ†ÜB¨»ú™kâ ñ¼%Û®ð¾k‚d¯dšDŠ"Ÿ’avG?~Ìóá99ñ—  2„çYëBª™¦”ý5m¯£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U £°G]þ?ðe0U# 0 €îí«‡I à0  *†H†÷ Þõ ±ëÓëŸë0Ž ’û¡àŽÅ0½œ‘:ïO;Y¬ö¦¦Jftfe8“÷ƒ™ÎêÑßß„Ûô$äÀ÷O‰Á^ì_–D›$w™APÔ—&¹¢ü¹=ëW`ÆÞQ„ÈÅ·ÿeëFõìÝ`J!$qÊÊ2§AÅ÷¡™„x„Ûè&botan-2.4.0/src/tests/data/x509/nist/test62/int3.crl000066400000000000000000000005171322470703100216540ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.09 990101120100Z 480101120100Z #0!0 U0U# 0 €ñŒo4«Ah0  *†H†÷ ­ ±®ìh¤VÊ¿±ü"âx†Û°fpS©ø4˜XôØîÊØã1›ÐŒÁò¡¬ª¦qyL o\¸×ŒÕ ì‡ý4±FµÌòcÉ^º[™Ø<ûM$A·ýîk nUIþÎcUêSÎrIBPen‹/ ÆPÝh„øY>×åììß botan-2.4.0/src/tests/data/x509/nist/test62/int3.crt000066400000000000000000000012351322470703100216620ustar00rootroot000000000000000‚™0‚ ¤0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.090 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.090Ÿ0  *†H†÷ 0‰ÀÂæηj.âã¿ÖçÌg¢€%l¥Œ¶/ÏxB¢ì°_4Ñhﵑ׺@Š5¾!*Ú$6ïn{t_£_±æU¢Ñlyæja&äm㊠= Ãf‚C#ÑÌoZѰÔ׬æ(V7RŽýtî—\²`íÓr¶©âðz϶!£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ñŒo4«Ah0U# 0 €£°G]þ?ðe0  *†H†÷ ß^‰•ækiô^ ݽŠåWò¨!¥Æ{ƒ'#é•Rdö°–ä/ñØ;º‹àÄlV̱ª ¸Lº[1¡ø|ˆ… ¿ à1÷sÖaÎk?ivcÇ{(›ä§Q™Á¿6¤¦OÏL·µ„Kƒ˜Ff$õï:ü¡êT\aTžõV唬´Ð)¯üÆìÐêÄÖVnç'botan-2.4.0/src/tests/data/x509/nist/test63/000077500000000000000000000000001322470703100202735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test63/end.crt000066400000000000000000000012321322470703100215510ustar00rootroot000000000000000‚–0‚ÿ «0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.100 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA5-PL.01.100Ÿ0  *†H†÷ 0‰ݼt«,á›éº6© ¥,ƒ¡LXÿô8{³Ä—¦Tãn¢ŸOOö"…®ÍÕªo6¶ÐP™¬£!¥ƒæ?M(W÷½ÔÐ/ý¤K²WûVÓ›êø¼þ¦¸à##gTi@ú@ãdªBaùÞäw-™ì@ø‰Þ`|©Rßn5€E_±È¶>Íívðbotan-2.4.0/src/tests/data/x509/nist/test63/int1.crt000066400000000000000000000012351322470703100216610ustar00rootroot000000000000000‚™0‚ §0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-PL.01.100Ÿ0  *†H†÷ 0‰¯‚æºøRšÎô {€ðÏŽ\°«Á=[\05µc[4‹ï4psÊÞ†ñNMR¦°P;:Ö%é·oörÀÍV”6«kô‘!† 8Š[ƒ”|¦P#£îàp„8º O¶t¾%je‚ÙŸþŽÛ¤=Ó–,[nôqU¨%ÿdDœÓhb·ã¬öér^ìõ0U@ŒeТÿ©HJwx"ù´Z ˜^Ÿ У’¸©Îꑵ›Ÿnbotan-2.4.0/src/tests/data/x509/nist/test63/int3.crt000066400000000000000000000012351322470703100216630ustar00rootroot000000000000000‚™0‚ ©0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-PL.01.100 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.100Ÿ0  *†H†÷ 0‰²d”/õƒ©MyÈÂwïTûRÝÞb¤}7'h+©9K†NoG*'*w ÅSÛéÄ6<È}h uP®ÔøæVÍ Ƕ±Å³«E¶ã‹yøÕ€ØÅò|¸½O‚‰<ü†°©HSdvĬ``·ûpèæüæ„|Íc‰ ÚæY£f0d0Uÿ0ÿ0Uÿ0U 0 0  `†He00U vÓ¸¸£ H0U# 0 €17t5äK´ñ0  *†H†÷ ­·+}cÑíge¿5ûÍ®ŽÈåld)(êéG›Î<᜻osˆæ|]Ó)–ÁB” cDÀ…5ªLr%€rKžß‘‹Î?-óú7îñ¨œYºÓ ­Ä]‰^àT={u‚ÕN݃T;n·ëp¨xh«JÈ™åõÔ [õbotan-2.4.0/src/tests/data/x509/nist/test63/int4.crl000066400000000000000000000005171322470703100216560ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.10 990101120100Z 480101120100Z #0!0 U0U# 0 €´àc8 Üæ0  *†H†÷ lmÑCZXÿÅEz ‘?&:¹‰naZýí—i÷1B#‚›ŠÍÎ鄶б¼?P÷肵.t‰ŸÞÏ,-_AKŸqAA—y\e®*XðHÇ5jðƒ.ÿLjs•Ÿr`ê ÓªœròþÌ]•¨ ² ÑÊ;ÒXu²ƒéê‹ £botan-2.4.0/src/tests/data/x509/nist/test63/int4.crt000066400000000000000000000012321322470703100216610ustar00rootroot000000000000000‚–0‚ÿ ª0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA3-PL.01.100 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA4-PL.01.100Ÿ0  *†H†÷ 0‰®g,)ê#¤šîädëÈ(~/˜· ºxa¶GÆ€’0lï ˆýŽëE¨À)*_×Üï}żûh 8ù€²êà瀦©Û¾†Gh‘X¼t‘âMOKu-“zëÅ¿ŽÞ‰z3«‚¹,‡½må6°>$ç+{;W‰A ï¨æfCéÛ£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ´àc8 Üæ0U# 0 €vÓ¸¸£ H0  *†H†÷ L|Âc T÷Êèq×JB—’Þ 7:éPÊ»ä/G¶{Ž´X Ú†?8,zí¦RLJaõ¨:ÏŒËæ¼ÆØô˳‹±«ôü¾:eR®t­qY‹Q§©¿9îÃK¤zëåo÷({Þšh›ŒsE·äµµ$¢þ,LwÑ¢botan-2.4.0/src/tests/data/x509/nist/test64/000077500000000000000000000000001322470703100202745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test64/end.crt000066400000000000000000000012131322470703100215510ustar00rootroot000000000000000‚‡0‚ð ­0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.02.010Ÿ0  *†H†÷ 0‰²‘œ «±‰®;ɉOÅé4ض-4ÛQDíx€i _Ïa1ybë¸ïQŸ_èñû†©ÇŠý­ ­Ëëÿºaä ñnÞ'6`¿ZuŽ{ ÇÔ6­gxôfû–¬äŸø¯oèU—å®É”¹RöõUT/ÐKü÷O²];m„ôãz™7&I(»£R0P0Uÿà0U 0 0  `†He00U R$V¼{50U# 0 €eÐÓº¢«ö0  *†H†÷ O¦Åf»¨xQ×±…c‘6'XÒnBA»$²­{˜–‘ú3%$ñH~ùfa)ÛDSÛǪ°i½ÒI¡K•2I´‹MÇ×{vT¸÷ƒºÆ¥¢œc w…²áUƘßS©0®fMSììj‚ë6/4¿f”.Ë©ÁüQ÷HÒbotan-2.4.0/src/tests/data/x509/nist/test64/int.crl000066400000000000000000000005171322470703100215730ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.01 990101120100Z 480101120100Z #0!0 U0U# 0 €eÐÓº¢«ö0  *†H†÷ ưÇÌ©èÖi ¨ôîoG=NŽ£ p†N)UÔMv =$9¨¾4ùm¹Ö¤6ÀÀ¾¶kÌåÔn'Ýßxv{qÍ7þÍÓÎ%ý,Ÿ4æ)9Á><ä ˆ Þë0ÂO­ :àÜÛ8š¬³a$ôêp Ç“8)vºó^¯Ø×/Ûbotan-2.4.0/src/tests/data/x509/nist/test64/int.crt000066400000000000000000000012321322470703100215760ustar00rootroot000000000000000‚–0‚ÿ ¬0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.010Ÿ0  *†H†÷ 0‰Ü~cqåÿÕtœ¥ÇB‹[ýÀ6Uö\æúÑ»æcÀ¨ 覬袲’O&Ø_÷ÓnvÃ)=ô¬p ónVt_~Á2潇>ê™ÇZò*A¦¡ñL^&Ùäµþ‚´Šãc§Ëuj"ú\ˆ¬oÐlñ#¿²ò’6¤Änm³zº¶–ç‚£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U eÐÓº¢«ö0U# 0 €«šëùÂçT0  *†H†÷ 2­7sŽim{EøÄ°º1š+û» BÐ8ݸ1ð%pÛ¼Þ~¼xñ—e«Ëy”Ð&¥¦~Nâ…µ@“Ëq“¨¹`ÏÙ/BoF( d I ŽgÝ{ŸÇEÔ¦BÍÖô° UzŸ¹Çµ¶–zúáëñö_ÊÉ1M½ ;3÷[‡«\°rbbotan-2.4.0/src/tests/data/x509/nist/test65/000077500000000000000000000000001322470703100202755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test65/end.crt000066400000000000000000000012131322470703100215520ustar00rootroot000000000000000‚‡0‚ð °0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.03.010Ÿ0  *†H†÷ 0‰Ï·âóôù§­Üla=òjŽå\äxkÛý“. ØF’õ‡È¾ V ¡}ûÉŒ ]ÿ‡xcÔåÉHÚæïÎwrÙƒhu~ýß×ê‰.E\å+6®ø9×-u{îAŽš©ÚA•Jz JB£Q9dQéDñjÿ@Ù'Zèb‰è9|‡£R0P0Uÿà0U 0 0  `†He00U áÌÞå±g+0U# 0 €Ãs't©Èâñ0  *†H†÷ Pnv…ôM’¿Ê…­)ð EŠþ\í òØ ”ÓúVÖþ_ú ÖB»¿2œÎ_™éû~Ñ\Ÿ¡,€ƒ_pÝ¿B~«Óìqû…Ä:¯Ö@üÐ=^œÍ·Ÿ™xó •~bÉ­ß u?ºÒ‘æÑ¨šLfµïÄ„Zûd …Ýbotan-2.4.0/src/tests/data/x509/nist/test65/int.crl000066400000000000000000000005171322470703100215740ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.03.01 990101120100Z 480101120100Z #0!0 U0U# 0 €p #ŨËj0  *†H†÷ “ €#ZëÏ«N˜JA<î%ú˜Úv×…Å7§U¹¢eaÉá“HsíÛÕšähbµWÉt\\ÿîæCD„åöüÜ›«Ëóë\•ƒù¨òë‡ðäâýç½ÄÅ, ¯rP‚%Ó7ÌC‘Fs¹<úîbÖÑÇÀë@ñ¨;½edLêWÕ'botan-2.4.0/src/tests/data/x509/nist/test65/int1.crt000066400000000000000000000012321322470703100216600ustar00rootroot000000000000000‚–0‚ÿ ®0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.010Ÿ0  *†H†÷ 0‰±‘¼ÂÅw*ê>ŽÙÊĶà*C!è+;Š€Ó5AHP0ÉÒSÔuS0; G2L!¯ 6tEU¸']4/”o[±»p!ß·ç¯÷ÈûÕ°ÿrÂ֓ɦ‹§Ó‹Ú÷T±¶&ǸçϯP=Zîrîš#[É㥿6ü+°Üy Gߣc0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U Ãs't©Èâñ0U# 0 €«šëùÂçT0  *†H†÷ ; ©ŠX#‹|5´lõpÊÖÅœjšŽ§Ë búŒE£j1Iñ.+M١ؖ¹NZÓ$³¶ðr\]SLÛ«ìûfq-¤¦„-Atå£,3k€97¸ÂM2ÊÄ'‰k]GÕGG¯±pºŒ8;EoO™Šûý$¶ª×Ñ¡sg%©botan-2.4.0/src/tests/data/x509/nist/test65/int2.crt000066400000000000000000000012321322470703100216610ustar00rootroot000000000000000‚–0‚ÿ ¯0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.03.010Ÿ0  *†H†÷ 0‰·¼«T±]éìä|®îc¼{û>œø\-óèú™PS VCcá»4^U^#5« ´Ò½0…¨y_žWzDŠÊ9¡¶ýø¯…­Eê 5“³Ò/ó§ HËhÂsITe@/ÑD¦‡õ@¢éîGçÓÁ#’¦/9Ç/n+]Ù/'å9k§£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U p #ŨËj0U# 0 €«šëùÂçT0  *†H†÷ ¿F¹ñbyÛ³–Œ¶Åí(s냿(‹JX t¾k²®øApùk^)C›ëç5›µGôþõÕàB€¢Ð*ë*ž`1&OÙ¨íÃøUËÆÂÒUl>àw,½Ò,‚ ŒáOã½îoúiþ‘Š´X“¦dtÏunÅ.ÎÅøÒì§botan-2.4.0/src/tests/data/x509/nist/test66/000077500000000000000000000000001322470703100202765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test66/end.crt000066400000000000000000000012131322470703100215530ustar00rootroot000000000000000‚‡0‚ð ²0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.03.020Ÿ0  *†H†÷ 0‰Ío¡Æ= ªë —ò±Ï¶m`7¯ \YðY°xnÛÖ}…xûê¿ÿ³»ï‘Tċɼ·^rÍŠW}”G¡å»§“qKå„Ï&t!Ðb:[!\¤'âëâ0O+!  ¥ºŽ¥ƒµøÁ {ì³üé½€:ªÚl“ÊöÂa½¶¼'&Y6 Ä 31[d¨ÄdL¼j¼`"ï Ë¥{Œ¥C/=v z=LúvWŠPƒúŸAN8àå±”¢Rbotan-2.4.0/src/tests/data/x509/nist/test66/int.crl000066400000000000000000000005641322470703100215770ustar00rootroot000000000000000‚p0Ú0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.01 990101120100Z 480101120100Z0#0!² 990101120000Z0 0 U  #0!0 U0U# 0 €«BPéf0ûº0  *†H†÷ Ðx:°¨•\‡Šë6Ь«L35sØ®¼ù*Ô°#”Õº»áÒNP/…;Qïå˜û©³¶ÛªËÅ«?_eÖ^“%›Î ßáÖTáŠ9®iw$GXŸpq÷â¶µ®´íwíîÿ›A¡¢MË™¹ájÂýq¡t'1éÜÛsæbotan-2.4.0/src/tests/data/x509/nist/test66/int.crt000066400000000000000000000012321322470703100216000ustar00rootroot000000000000000‚–0‚ÿ ±0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.020Ÿ0  *†H†÷ 0‰¾„îsbØèsˆ´Ùþ…ò_LÁ~ø;Ydœ Œkê%È«Cú…A>!Ï„Q\Ü» kÞÌǃ5'²w©/H} þIY•ÈóÕ‹—Š ½k ƒÎgñ×ãgü)ð9ÿ®‚ƒºÐACH Û‚ zz¿ü„@7üˆŒˆ¿11^¡£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U «BPéf0ûº0U# 0 €«šëùÂçT0  *†H†÷ qðïÉ€›™Wû882Ü Ü[ÔÜu–ÅGcJ‹ÚÇ!Ž~ð­-´¾ïZ4õv;0k·Šq¾V1ˆ«ójY£è œDÓ,â†WØ™àK9¿ê‡,,*~n;øB j‘GÌJÚµŽ²B"RˆÄ‰T”ŒÌz,MSùÉebotan-2.4.0/src/tests/data/x509/nist/test67/000077500000000000000000000000001322470703100202775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test67/end.crt000066400000000000000000000012131322470703100215540ustar00rootroot000000000000000‚‡0‚ð ´0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.03.030Ÿ0  *†H†÷ 0‰¹,Ü@éfç^“l¤¬Uíð—Ò¼ˆÈ4š“ÿ?üb²yîJ àô×cηjéß4Ø~òS™è,]nDNYÅF=ìó¿\ ‘‘)ÆsH6ÔψÛcOÎzþ´¤ô”E{K9V³‘ome¶6²&ÆÕìùµ$ .;‘£R0P0Uÿà0U 0 0  `†He00U ÅvȾªlJ0U# 0 €v-ßÒØtIô0  *†H†÷  üž²Z¨Lœ" tðXMJšÆ9/á)¨œ0ÉÓª¼>üþaP¢­zƒ$5J|yìS‘i4/½‹àßÞ\ôún¹Î5Wàòð¾^yŸŠ³áÌŒ·Â¯›¹Û § ¦,&`qÍö— ´­†Y¡pžÌ1gjýK_fImíÉÌ—†/,?botan-2.4.0/src/tests/data/x509/nist/test67/int.crt000066400000000000000000000012321322470703100216010ustar00rootroot000000000000000‚–0‚ÿ ³0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.030Ÿ0  *†H†÷ 0‰»ú4»¬ ͳ ¸mžNV¾i T"»£H,´¹¶öÒð|ò^N Lº]èy—-×¥²&FDÖšZe‡Òbå^«rZü±tCR<^×lËzù­~’÷óG1õ-© €Õ”bPܦ˜‘ç›]á·û,ø«GÐL®Ü“OaÝãc0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U v-ßÒØtIô0U# 0 €«šëùÂçT0  *†H†÷ Š®ÌÆs®…Œü *Àž`G`&*d5ô—ì u¼ÏÊ(¤±­ÃT)sA…|˜ ÑÊiiwÞæPÒè‹ÙÓè®·Q×*ï82ðca¨°Øï8ÌûË´m¦‹6Œ,.™Á’ù(Béb—ב<:®Èýq¥]ßO^ÆŽ‘½ $botan-2.4.0/src/tests/data/x509/nist/test67/int1.crl000066400000000000000000000005641322470703100216610ustar00rootroot000000000000000‚p0Ú0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.02.01 990101120100Z 480101120100Z0#0!´ 990101120000Z0 0 U  #0!0 U0U# 0 €v-ßÒØtIô0  *†H†÷ DZv§¢ÏÍêã·AUœæ Ü5!̬µFë^•D"çPþíÜx=kQ±VAO!Ì’e£Y%„ %I«µošâꊮš'êÆö²qhiÆà4²1 eBiâ<^«GoòÃ^*®H#Ds'lÈ«-ä'{Y`S‚ìbotan-2.4.0/src/tests/data/x509/nist/test67/int2.crl000066400000000000000000000005171322470703100216600ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.03.03 990101120100Z 480101120100Z #0!0 U0U# 0 €v-ßÒØtIô0  *†H†÷ ]”™É+íN„O/YFhŠP"LQ_B"˜Òa"„xÖÐ8EO%u½5ÈÞsR¿È[ýw1ߢâWU¿¯ÌFxÏÁPfa›ŒúcÀ¢Æu7|ÚÈŒ¿¤ýßkZÕF_€,\ÿʱƒÙÇöž²>œLã®é2تé?tð$ñìÃâÅvbotan-2.4.0/src/tests/data/x509/nist/test68/000077500000000000000000000000001322470703100203005ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test68/end.crt000066400000000000000000000012131322470703100215550ustar00rootroot000000000000000‚‡0‚ð ·0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.05.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.05.010Ÿ0  *†H†÷ 0‰½5iþhšÛG9€ÍÃ¥ÄìdÍ ÷ †þ9ZÒ•Œ­22¸†Ó·1«Ú¼ÆML°%Ö…Ÿ”£û¢]tNhR8×ÇŠ$Ä’m žwDÆåGpþÝÝ…‡‹Ì±&UÍ+ÓJ¹¿à‹ Û5 hõ{ÕKè±4÷lÙŽkZrà´µCkŸ§£R0P0Uÿà0U 0 0  `†He00U cO9wB.–w0U# 0 €“£·WÕR0  *†H†÷ ´è…ðD=ÜÙèP5+Zèf„v(ǽ18û–«4›"过!)sP% áˆ™<5™Ë§þã͵ÝOã¾kÜ—æ Öç’™íxyÐõ˜˜N2æ™ šyꀂÖ!!1” jôûûRšd&R•†§ŠÙÍ6´º€I§ªNùl¤Sbotan-2.4.0/src/tests/data/x509/nist/test68/int1.crl000066400000000000000000000006111322470703100216530ustar00rootroot000000000000000‚…0ï0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.01 990101120100Z 480101120100Z0806¶ 990101120000Z0!0 U 0 `†He ÿ #0!0 U0U# 0 €þy ÎƼ0  *†H†÷ ‡NhéB–.´¯z•c“u|GìHþ²úAL—}Ø_-|ÅKÕ¤¶«î˜)^"þºYx_Ï@jµ#¼7ô‘Ë% ëw6LÅ?­xÏëîÛM->Ñ]ÌÍì0ÿ?©€’è€ô×à DÖ„þ±Ñ‡a‘X•¥˜7U–¥µ¢Äà†Å3êóKûbÝIö²LÚ…°º 3Bõ‡:ö (¶L€z+DV*ƒÁ&ö–QDRüo£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U þy ÎƼ0U# 0 €«šëùÂçT0  *†H†÷ µù÷Œ¹¸^·°¨DwŠg˜|B!»™Ï¤@3#i%8(œ URô˜–­@l=Ó!_†úk–íõB¾‘zϘ2±ºãrZe]è=™œÆÂøLqñþ¨SQ£}?Ò8?eB´ÿ‘å÷Ù\F“:´†{hR ‚…£\_ýÓL <°“Hbotan-2.4.0/src/tests/data/x509/nist/test68/int2.crl000066400000000000000000000005171322470703100216610ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.05.01 990101120100Z 480101120100Z #0!0 U0U# 0 €“£·WÕR0  *†H†÷ |ã&"ÔT®¬Ÿ@@_ÄOJV¸ å½›®˜DbpíP/ÖƒT€Æ$Ö—oYWa, Á+ ÀGÝ:)µ•‹;Å7X$(bö:ëñsÇŸ_‚j¯ÅOšüs ±gýóU^*nÖÁ¶>’YLI 2P¤Ö!¼£botan-2.4.0/src/tests/data/x509/nist/test68/int2.crt000066400000000000000000000012321322470703100216640ustar00rootroot000000000000000‚–0‚ÿ ¶0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.05.010Ÿ0  *†H†÷ 0‰¶^!_¡åC>• SÈLj:„ì¼ì²ü× Ø”-ÿ¡~-˜î8Â!Ͳ;fÕ3uóRxò`0XpE§þ×¥";%'æ“9žÎœ‰sèf÷¥Öi£êO)´SZã>Œ¾¼ûZNp(êæÈÜxãCðodGÖ Ïͤ9²“íí"2M¦!Æ‚ÚÓÆõ botan-2.4.0/src/tests/data/x509/nist/test69/int.crl000066400000000000000000000006111322470703100215730ustar00rootroot000000000000000‚…0ï0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.02 990101120100Z 480101120100Z0806¹ 990101120000Z0!0 U 0 `†He ÿ #0!0 U0U# 0 €X¼èÁ˜Ë0  *†H†÷ S èõ£ÏfÀÕrIƒWuí«*&$eˆ!nÔøŠ ² J:#çÜ~ޏ…'˜¦ÞÁ½Ãqp7âŽ`ÙÕÉs¦²/ÏIE;¢0±–´¼Nπ袶?»#†-Çš^k›¾.éUBßƲ㘰ØÎÇT\†³‹¾>xç#áÚ«©nÓbotan-2.4.0/src/tests/data/x509/nist/test69/int.crt000066400000000000000000000012321322470703100216030ustar00rootroot000000000000000‚–0‚ÿ ¸0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.05.020Ÿ0  *†H†÷ 0‰¢ã\;\¼¡ÏG^KìZ!¯ôNCÖ¿PbŒ\@ò‡·­Îoì¾Ãÿ ¾$Î÷´§'U·Q7œ¿»„ºfÞ2M7+¾ž/—ÿ庋9sG„%Û¬f¯Êƒÿˆª[|þßËÞ<Ýø‹ÞG¹‘  cã›-_K¤×côó´¶´÷£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U X¼èÁ˜Ë0U# 0 €«šëùÂçT0  *†H†÷ UYTÆD±¥n/J—ä»=ãì|€%Ä÷ññ¹-àQÛö©o»Q†0m ”õ#‹×ª®¨0ÛæXÚbãXV\_v'ÝÒ”2v‘5ˆ4Æj /4ƒšÕ Eˆs¿DÁê?*ûLyCCެuôÒ"që.d^¯c\z}¾ˆÒÔÇbotan-2.4.0/src/tests/data/x509/nist/test70/000077500000000000000000000000001322470703100202715ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test70/end.crt000066400000000000000000000012131322470703100215460ustar00rootroot000000000000000‚‡0‚ð ¼0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.06.010 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.06.010Ÿ0  *†H†÷ 0‰ÙTs²Ù[©‚Ød›TøépžìX„˜°½ž¥Ûüû±µ³§xèØ«x¿iÄ1’HÙv6¹FÐmGMMŒhC•¨}éo^äÕþœÆ<Êýï?·[§Äµþr#7OºÔBo˹ä-–Ã_Sé Ú/+§XOC¨[£œ¿+¨™é¬§•£R0P0Uÿà0U 0 0  `†He00U ®i:á/¼c0U# 0 €¯õÏÕÛ»hÆ0  *†H†÷ ]É*É#³ˆéøhz/XY‹f:êg÷ è(dœØv>Ú¦.F¶ 6K"Ÿ`[ÍèHVd‘oHOå®c»ÌЋ|4pUÓý<¢z&AúÄ<#á§ÙE•Nï(iPø‡ZÓa.–=âÌ 3;8b¶b(øÅ”!¼ú7U´X+'ñ¥ûbotan-2.4.0/src/tests/data/x509/nist/test70/int1.crl000066400000000000000000000006111322470703100216440ustar00rootroot000000000000000‚…0ï0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.01 990101120100Z 480101120100Z0#0!» 990101120000Z0 0 U  8060 U0 `†He ÿ0U# 0 €ä¸_uê‡"X0  *†H†÷ ”žÅº ª‹UŽ¢‰k|e~FÂãp uGdà3ÞG욣2 0¿<íÒ¤ÛŠxx ň&/gÂÊgøuÓáb”¨'É|¾Ž"˜Â«úÔç2x6“ dô2E@+XÒ¬¸DµGcˆKkMŠÆç¤M·†2RÓqÅùÊkð'Žÿ†?åbotan-2.4.0/src/tests/data/x509/nist/test70/int1.crt000066400000000000000000000012321322470703100216540ustar00rootroot000000000000000‚–0‚ÿ º0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.010Ÿ0  *†H†÷ 0‰škáÉä-Äçºf8Æ^:d]W/Šó¦(,ᓚ­ø5!ÓýÞjͨÆ¡^uDÍ#¯‘çVõJ¡{4áË “C|W„ QqAȹæE¹-ä<—Q¶º 2g¶~?˲–º^›xF3“ŠX\#i§}žÒùªÅî b ìhU£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ä¸_uê‡"X0U# 0 €«šëùÂçT0  *†H†÷ °´ÜRPÑ„®@GI€‡Ê©@ç˜ÊA ÙàýÎu„Cø'ø†¢ñˆ¶胢ldz7Œï´×‘i7”Ãn‰Æý‡ºü^ä©®ðä]m¼º°°'›ìoKƒ6¹ #2R PÕ$a¸#›iyÚ™óɤ?nmá „¾…̵QÁbotan-2.4.0/src/tests/data/x509/nist/test70/int2.crl000066400000000000000000000005171322470703100216520ustar00rootroot000000000000000‚K0µ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.06.01 990101120100Z 480101120100Z #0!0 U0U# 0 €¯õÏÕÛ»hÆ0  *†H†÷ "d`ŸÐ;§^ÄâKá'½ŽÄ‡ÍìÝòעݿ‡.Ö —[04 –Ybz[»±Œ„žIbÜ,hmbotan-2.4.0/src/tests/data/x509/nist/test70/int2.crt000066400000000000000000000012321322470703100216550ustar00rootroot000000000000000‚–0‚ÿ »0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.010 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA2-RL.06.010Ÿ0  *†H†÷ 0‰Ø‚«[¡Ãd•EÃw¸p.ïþ3Æ\±#€|ó½;6«•|dÏ$_ZŽi’›Y(Þ/™úú¸±,‹Gè¿»BøpÍárT(3錠Ð}ë¤9uŸOÁR:t­’É®!T£r\ü5[ö\¾]`C|оOY±Ž¿17Σc0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U ¯õÏÕÛ»hÆ0U# 0 €ä¸_uê‡"X0  *†H†÷ ¿1P¾òŒæöœ¸Ñ®(þAÛ’I…5 ø³Ü¢Ü¥×¹\l6ú®Åæá¨ðcè6;ÕùÑ™O08ΈÛóÏ—bDAû43<.F?›ð.àaÕzYú©ev$fИ"½}Š‘é]Š@#QF/ì”÷Hýø²;jÙï±wÖñ¹ðÆÙ»botan-2.4.0/src/tests/data/x509/nist/test71/000077500000000000000000000000001322470703100202725ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test71/end.crt000066400000000000000000000012131322470703100215470ustar00rootroot000000000000000‚‡0‚ð ¾0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.06.020 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.06.020Ÿ0  *†H†÷ 0‰÷S<+Ÿ‘”ý4>~=ˆùKL Ÿ·5#zì›7f`XœzÜG5ãŠ\¸5Ý[ªFÀ'ãwõò£®K¬©½“ùó„y-âÓáüÛ‡Tíþ+ëÛööX»þAT~•ÔìW§öTˆ¸þð(Ä?è„þÍkek¡¿ç.5eú4=7‡(£R0P0Uÿà0U 0 0  `†He00U øjï™è/ïV0U# 0 €SZ2;æEÂa.²[z‹õ!tbotan-2.4.0/src/tests/data/x509/nist/test72/int.crt000066400000000000000000000012321322470703100215750ustar00rootroot000000000000000‚–0‚ÿ ¿0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.010Ÿ0  *†H†÷ 0‰Æ1ñI ŒI Ð%æäÛdðßá'Èa’}ªV‰˜{¬3ˤ v¾{®šTáL ³eºm]Ÿ ­¾âüªr›Œ(Ý™N"þ(ì3”ºt ˜D‘÷)ì3U_Ÿ£û¹º‰ÝœQj³©jÂñÉ)-4 B®NO5ÑÖJ¦ÈÕq£õ?/û1IUZ½ê ÊœX}7r›èbotan-2.4.0/src/tests/data/x509/nist/test73/int.crt000066400000000000000000000012321322470703100215760ustar00rootroot000000000000000‚–0‚ÿ Á0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 500101060030Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.020Ÿ0  *†H†÷ 0‰Ð+Äæ€>ÜY9:¥‡ô×ΕѴ )³¹ó!2Qf.ãÍ‹&6Ó}NÊôÀ Cã_Ù8ÛàÃ3g]Ô Í¯žÅÑP°^åÈJÁYÄ«=Öó;õ23¤ì Ûñ911)V–›Bé]ÞD9§’öÛ"³÷snIü±ën: ¸Í±£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U †ù!®°)Áí0U# 0 €«šëùÂçT0  *†H†÷ >gŠ¯á¶ ™ß¬Ï†EìTúd„8Üäžoë~‰²û­Ó. 3,Ö`ã‚én®g‚M%iÔBŸp5Å¥HÔyGz}w¢üÃÚ /€–m…ï KÿÎtÉT 2°OÈ•jo1KS,4'¸ÓÈ•Ž_G«½-õ3ãßøbotan-2.4.0/src/tests/data/x509/nist/test74/000077500000000000000000000000001322470703100202755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/nist/test74/end.crt000066400000000000000000000012131322470703100215520ustar00rootroot000000000000000‚‡0‚ð Ä0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.030 980101120100Z 480101120100Z0`1 0 UUS10U U.S. Government1 0 U DoD10U Testing10UUser1-RL.07.030Ÿ0  *†H†÷ 0‰ÔêgœÛ‹iX©íñV«>£ùidŸòt=A¤YÂbY5}Á'­]¨ÿäWty{a!öF/ý8©²„‘R=­ ¿³þˆp¾&ÕACÒwIH±dÊ•ý1è5/<Ï6‚¿œ£dñ„Ø37@åõxI1>)½Bæ£R0P0Uÿà0U 0 0  `†He00U `Ö ºù=0U# 0 €\%Ùza”R0  *†H†÷  tó†k†qD÷ ìÖ3óKÌ]×`:—ÆA°.ù¯A‘®ˆ*‰ôîÕT Ös0íÁDÙ±XOª Bps욎L\º½¡¨:8OxùBvÓwض¶WÔR5Èg!h†>`“WIHî5ó¢ìÞ`“ô—,±KdA }†botan-2.4.0/src/tests/data/x509/nist/test74/int.crl000066400000000000000000000005211322470703100215670ustar00rootroot000000000000000‚M0·0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.03 990101060100Z20500101120100Z #0!0 U0U# 0 €\%Ùza”R0  *†H†÷ 3 É|?^¡ÊSdPL8Ïßÿ<‘NlÓÙ ‡fÌéЭí5΋”Uè2_H/ù¹¦$Øœ+LE|~Ší¼y|4¶1T!JÉÜ«¸QŸ)Å´\Й°Gšd³ÐiºÜ¶ „š(`)*Û¤l¯½<3>¥—¯CwUõ]ybotan-2.4.0/src/tests/data/x509/nist/test74/int.crt000066400000000000000000000012321322470703100215770ustar00rootroot000000000000000‚–0‚ÿ Ã0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.07.030Ÿ0  *†H†÷ 0‰ñ Æ] U3k: ©9#¯—³4ªhæ`˜îÄwaô\3t›ÑÑØ’©åb“IG™kâ.Íld³-þèé Á*17Óä÷Ì’ŽÎÐ¥}Û¡¾xòšPÌoaoXA'«ÇÕ$|3©I¾ÑØÅð\¦Úkøá2hR8i÷C£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U \%Ùza”R0U# 0 €«šëùÂçT0  *†H†÷ ùD`aQ®9¾¶V@xn“’»)f翨ˆî #¤»¦ú(—÷W--Î>üÉ.YÊþÛi?É®ßú$Ÿ‰Š$Žt$‚†bMÏ’<Ž\ æÎÎj„]'8þ†¾løjÃê™J¦¸¦\ùSšÑ6˜+ß‹YPD…ä°ºe»F©ò}è‚j;ä»Ȏݱë°i ”옣GÏ|0cMl¬Z@ÒÄ^ÂÊ”C°Þ‰‡£R0P0Uÿà0U 0 0  `†He00U ÄöØcP0U# 0 €0{Ï¡"¹ 0  *†H†÷ †¢; yú̳1¸TUkÓS7IÊÄò•/c„éO“;—slÕ¼¦­Iú:¸×{ì:!ö,®u‡Œªp#T‹"‹!Í_34Uh36ýÕ l+Q'¼Ã(ÖTUë/°T‚¸…N‡|ÃnzJXSçnøˆtœ_ËKbotan-2.4.0/src/tests/data/x509/nist/test75/int.crl000066400000000000000000000005361322470703100215760ustar00rootroot000000000000000‚Z0Ä0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.08.01 990101120100Z 480101120100Z 2000 U0 Uÿ0U# 0 €0{Ï¡"¹ 0  *†H†÷ ’1t Dmåu¶‹½ ÊÊd‚È`‡ž©à“.r»F¹VîÝ/Ò•íntzôÞIUxÖèbÔÀ\qÊqÔÇQpo±«EI"œ+ sî|W m‡‘õÐË‚¹ÍûDÞ3™æÏ²Lx°ÞÏÐHJíù4œ˜©ãM“®žóizÄrbotan-2.4.0/src/tests/data/x509/nist/test75/int.crt000066400000000000000000000012321322470703100216000ustar00rootroot000000000000000‚–0‚ÿ Å0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.08.010Ÿ0  *†H†÷ 0‰³fLIw Tæšw‰è­uÒt€ Š_ŽL`7œo]nùÕ+ih„@†ÑTô39œA}rÖ¥ÚÞÀô%wÓQŒXûŠß½`Ô!îó …œ(úšôçMÔĹ]ÔRÕ Xbhý(ÀZáðKEôÊW83¿¨6¢á›vwbVDx>|£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U 0{Ï¡"¹ 0U# 0 €«šëùÂçT0  *†H†÷ Ð#Í®Ìá¸Z¿ekˆä<–ƒr˜×qxæ°%˜¬œ’ Þõ!Û‹¾m×’B**g‡|ÐMþÛ§>ž¹÷ knIY¹\aµSúÉ£n‚}@W‰úˆ5‚òÞ¡œsQú¼9DDkÖ¥Šj€Õ“e²fˆ I)q´‰¥×@æ稭5Ïúg ÿhÍ%«È×Ü4–fý—¥6Xçܼ°Äzxw£R0P0Uÿà0U 0 0  `†He00U êâÔ˜'%òã0U# 0 €„˜á»Æ0@S0  *†H†÷ 9•í1ËnYÐ{f[ k(øÉ¿éí83ncBçÊT>H-ÆrE?Œ«ÌÐ}VIùãfœÐ´”î.ÎéÇùJ£Bª°ç$µ 8ÛÍ/Ø‚2fNë3ƒ0Œ‰;„[É+Ä$N}ƒuÎ=—Ñ4$šVèõž?÷~Æåö†t«”botan-2.4.0/src/tests/data/x509/nist/test76/int.crl000066400000000000000000000005401322470703100215720ustar00rootroot000000000000000‚\0Æ0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.09.01 990101120100Z 480101120100Z 4020 U0Uÿ0‚ÿ0U# 0 €„˜á»Æ0@S0  *†H†÷  Mv ªSþº‘HÀä©u¥J ?¨\Øötˆ³àågeãu;§Ž ½ Vñr¡Ã¾(B]DÅNlî`Ú t$Š39¨7"¬¸(Õ¾–’’Å~ÔAΣ¨Ø¨£¥;/ZÇ)ÅÓ×ý%¤Ú1:XñÞ³ÕFl~Ò²ü¿sÝ¥3òbotan-2.4.0/src/tests/data/x509/nist/test76/int.crt000066400000000000000000000012321322470703100216010ustar00rootroot000000000000000‚–0‚ÿ Ç0  *†H†÷ 0^1 0 UUS10U U.S. Government1 0 U DoD10U Testing10U Trust Anchor0 980101120100Z 480101120100Z0^1 0 UUS10U U.S. Government1 0 U Dod10U Testing10U CA1-RL.09.010Ÿ0  *†H†÷ 0‰²ù/.þ_0V/¢—;Æ»8¬1Þö"û,ýUxÕ ‡I£Äžè Cø.†°Giñ¡ÔÛf”Fæ<žCß]³Çã¼±ð ’e‚Ñ*8:úÝê$IÛ?]Z€"^Q\ùbËsù.›N×@DÈ:3ÏÇ'ÍðEz¸*]<ä±Tù£c0a0Uÿ0ÿ0Uÿ0U 0 0  `†He00U „˜á»Æ0@S0U# 0 €«šëùÂçT0  *†H†÷ {ƒçV²ŽýZþ@Š .ç‚tá~c=Õz‰œ°0,Ù_ûj¨èغÌÊxÌU}|eØK<æ™ù¨M¹>dp~Iu3@³ XWYRz7ë³Ç[û‹Î©e)DŸH`ø¡iš7_ݵž²ßFÞ2§é jz ¿þ3 botan-2.4.0/src/tests/data/x509/ocsp/000077500000000000000000000000001322470703100171325ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/ocsp/geotrust.pem000066400000000000000000000023651322470703100215170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/ocsp/gmail.pem000066400000000000000000000031731322470703100207320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEnTCCA4WgAwIBAgIIQkg+DF+RYMYwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl cm5ldCBBdXRob3JpdHkgRzIwHhcNMTYxMTEwMTUzMDAwWhcNMTcwMjAyMTUzMDAw WjBjMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzESMBAGA1UEAwwJZ21h aWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw15ghutT7Ne eTd1u+TXCoyDK0/XwotRrrfP3+HU6f611WbUi+Eb4mpZ7ZnjBUBOWizRqr7XwURV 7LpwC/Xxn2OlK+yFFeTZYRyZqKhtY3UQsbztAlc8s7LmBTU2bC2wR942SfTpEufB j+Qloc8WnyVVGqU3IhV1vLPZiNwUtRMKSZiuUDOH0M10icmXDyAl3zNw119ax6bf P4fROHmLydGP6xcAXEQ9MnJ8cec5V3R505UaxVMROF/TZ2PricWyoz53Tu8AGHXT 81AH/Gq51ettup+CeYFdpxC4lEvZZwxeHo0kHkFv4od8g3HDYkjKfYkOi4vfFg1Z hMJG02d17QIDAQABo4IBbTCCAWkwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF BwMCMDsGA1UdEQQ0MDKCCWdtYWlsLmNvbYILKi5nbWFpbC5jb22CGHBvbGljeS5t dGEtc3RzLmdtYWlsLmNvbTBoBggrBgEFBQcBAQRcMFowKwYIKwYBBQUHMAKGH2h0 dHA6Ly9wa2kuZ29vZ2xlLmNvbS9HSUFHMi5jcnQwKwYIKwYBBQUHMAGGH2h0dHA6 Ly9jbGllbnRzMS5nb29nbGUuY29tL29jc3AwHQYDVR0OBBYEFOssHSlSYSvxTr/l pRnYGdp+QKZoMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUSt0GFhu89mi1dvWB trtiGrpagS8wIQYDVR0gBBowGDAMBgorBgEEAdZ5AgUBMAgGBmeBDAECAjAwBgNV HR8EKTAnMCWgI6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0G CSqGSIb3DQEBCwUAA4IBAQArrTNbfuMTZTUrfImB3oS0ffMhbymSV8wCPvuC8+LO yj/1rclI+0NRI32oUgwyjk9xOkPY/uUBk3KXl2b39R4tr67acyUPtuVGY5Nam3Jk c/7oqREBJr+M/Qr7nYQqTMzh4LXekl/Nh+ZHRnRzYP+q0DE9f8AkiIs9ESziym1d UY7u/IgelaCyh8CNZoYqui7I4DPfegz/De39rtbCPunC9VQtlMDas4FIOjQrSTIz tV/xNJMR9ka57B4YLfzoTHq7w7zw+fqeebpyKa4MqOzK9kgrfASYe1YpWEy0SBBT 4zfVLXqyr5eDeaJJjpRJEcSopc0nIN9qBCLc2K7GI54v -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/ocsp/google_g2.pem000066400000000000000000000026241322470703100215050ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIID8DCCAtigAwIBAgIDAjqSMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMTUwNDAxMDAwMDAwWhcNMTcxMjMxMjM1OTU5WjBJMQswCQYDVQQG EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7 qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEACE4Ep4B/EBZDXgKt 10KA9LCO0q6z6xF9kIQYfeeQFftJf6iZBZG7esnWPDcYCZq2x5IgBzUzCeQoY3IN tOAynIeYxBt2iWfBUFiwE6oTGhsypb7qEZVMSGNJ6ZldIDfM/ippURaVS6neSYLA EHD0LPPsvCQk0E6spdleHm2SwaesSDWB+eXknGVpzYekQVA/LlelkVESWA6MCaGs eqQSpSfzmhCXfVUDBvdmWF9fZOGrXW2lOUh1mEwpWjqN0yvKnFUEv/TmFNWArCbt F4mmk2xcpMy48GaOZON9muIAs0nH5Aqq3VuDx3CQRk6+0NtZlmwu9RY23nHMAcIS wSHGFg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/ocsp/identrust.pem000066400000000000000000000022601322470703100216560ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/ocsp/letsencrypt.pem000066400000000000000000000031571322470703100222170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8 SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0 Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj /PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/ wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6 KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/ocsp/randombit.pem000066400000000000000000000037101322470703100216150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFkTCCBHmgAwIBAgISA+ie0HpCS3KjX60Wf0ik8lrSMA0GCSqGSIb3DQEBCwUA MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjExMTgxMTE2MDBaFw0x NzAyMTYxMTE2MDBaMBgxFjAUBgNVBAMTDXJhbmRvbWJpdC5uZXQwggGiMA0GCSqG SIb3DQEBAQUAA4IBjwAwggGKAoIBgQCxYsED7KF8RGFWcq1tQdvRExLdDjGJcw1j 4uV6a/yt2v/wDSUPIXNak9Psm5V56AH2tV/nMuwiFAyqlZiPFcCD5clXoIkJBW2c hXYM1js6tNlX6iBA0Cl/ug0+sNYiJP7GZAZFGLy7itGYpLn5DtawQfWxt4ENoZ+x MQVAjRrb2oH/BNTBvvMjJNehxkf4RGo9BiwNHwxw/3SQHsObzLvYwnIe7pNCw5gu Ol4ekligjh481WIvOS6/dOu2FOuutKKsOFasxyaE8qArs2Nwb0fSS+LG3U7t7jP5 MuBS+kfp1/jQ8qvV5dJpKcw6D2q4qjmOiAHSXOY/+1GoaKus6xB7NTXbiMsHR/VH hnupKYzsR3Fs4+agHXpM/8n6erVsXtwPdw6uFwrVlpAOvu56PiSgaBZLpex/Z4bk tqcCQ2EJcjKUU5Ht5TKUFaXv7v/WLkbGdbdVDHh9cEnOthGme8QgaDPZp+mND6Bs QyJQgpQ57hsS55l9XehXzNu5SOr/F58CAwEAAaOCAiEwggIdMA4GA1UdDwEB/wQE AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw ADAdBgNVHQ4EFgQUpAkBML2UJvHr4dXnxC2gVnY5NAkwHwYDVR0jBBgwFoAUqEpq YwR93brm0Tm3pkVl7/Oo7KEwcAYIKwYBBQUHAQEEZDBiMC8GCCsGAQUFBzABhiNo dHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3JnLzAvBggrBgEFBQcwAoYj aHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wKwYDVR0RBCQwIoIN cmFuZG9tYml0Lm5ldIIRd3d3LnJhbmRvbWJpdC5uZXQwgf4GA1UdIASB9jCB8zAI BgZngQwBAgEwgeYGCysGAQQBgt8TAQEBMIHWMCYGCCsGAQUFBwIBFhpodHRwOi8v Y3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYBBQUHAgIwgZ4MgZtUaGlzIENlcnRp ZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1cG9uIGJ5IFJlbHlpbmcgUGFydGll cyBhbmQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIENlcnRpZmljYXRlIFBv bGljeSBmb3VuZCBhdCBodHRwczovL2xldHNlbmNyeXB0Lm9yZy9yZXBvc2l0b3J5 LzANBgkqhkiG9w0BAQsFAAOCAQEAXAh1j/hxsJMCMSfQWLSDMNQQirlWJafG2mao P5ZwjkGyPoM6q1E/G60TRFSbqwvI9b1SrMipuz5fqf6q7VTac2DZyC7hx5RXvDk3 ZD93DYYlwOw1RMrfUZtk7F1maqxESxd3V7L8DQWaPx01KZj4kJkP/cwT3t0GWgF2 DLdltmWqjuFdrxY+XYTdvsk+U85rhosm/4UGlJENdagRMAoRuco/y7MRuKSCWewN Vc57atZpfZahpqG10Bld8uf3ApP5eoNWKxbePFMhdWyj8o1N6p57pRn+Qp/mV+0B I6IbQv9+D/qEFgHkHDPClaoRjM0+bRI53+uTt5I70VcimVY+wg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/ocsp/randombit_ocsp.der000066400000000000000000000010171322470703100226300ustar00rootroot000000000000000‚  ‚0‚ +0‚ñ0‚í0Ö¡L0J1 0 UUS10U  Let's Encrypt1#0!ULet's Encrypt Authority X320161118121600Z0u0s0K0 +~æjçrš³üø¢ dl¡-`q]¨Jjc}ݺæÑ9·¦Eeïó¨ì¡èžÐzBKr£_­H¤òZÒ€20161118120000Z 20161125120000Z0  *†H†÷  ‚|¸wM>n¿¨¾SõóùÞ×°’‹¾P¬bŒÈÛ¿àä:˜¿?¶Ì#þ1þ˜¾™m˜ÞslèÃK Ý~h†2%8ç!ï 5>­è‹ûcÚ€x§â¿žcr‚Þly²(Ÿ €z;u2—ðªwΠb™°"tílb߯rHTÁ…Ÿëßõ²Ø E8/ú»÷]n¬ѯpÍøþ´3®ÐŽ÷‹5ôƒb§’åP'ð >äW0!*>·¾K“OghZJò»ô((  Bç]¾BÄYTNå»™àÌ¡fÂéÂæO/ß3ñé`adݱ+b¾ª‚àÖÑ(botan-2.4.0/src/tests/data/x509/ocsp/resp1.der000066400000000000000000000030731322470703100206630ustar00rootroot000000000000000‚7  ‚00‚, +0‚0‚0ž¢â£8qÚ"²“¿¨a©y6T?÷20161120152626Z0s0q0I0 +t$gŸõà˜?^>k e*TuY«çÝ: Y¦dcÖÏ WÕ‘çjbZeCz~Ñ.äF 9|€20161120152626Z 20161127152626Z0  *†H†÷ ‚8J‰f>~§«u»—‚ìJ3*3†ùø· däØÐõ—¨š ;…:¯²® 9š¡æ?Ó¦¿«]c?Fm”” ºûXEüb%T¦îý“ñPÚwžÔäŠ:7¬kScõ²¬Ù™Hþœ“J5·GA¦úøùÿÎHÕt°bM…ôq½§Í'bT‹nJ,èWBVEÙK·¬À@£Gñf‚È­ÿl»â¬~]„ù4d¨^­+ò-d)‘ € |Ô©8àñ7ÿÝ @z€f6š$ a¯åvž….ƒm‹%;×Gdí¥buˆ‹¨pKðʤ‹Çu!€¾ ßW®x¯ãvµÜõõ ‚`0‚\0‚X0‚@ JÑVi‡¹;|áá½x0Y0  *†H†÷  0w1 0 UUS10U Symantec Corporation10U Symantec Trust Network1(0&USymantec Class 3 EV SSL CA - G30 161115000000Z 170213235959Z091705U.Symantec Class 3 EV SSL CA - G3 OCSP Responder0‚"0  *†H†÷ ‚0‚ ‚™[Nïo`›nÇ”e\y”„&ç"A›Ë àqÓT,™é·vuÙ·®(ì.ÿä[ØÈØÎϯ ³Ô¸¤K úføWfä•2| Ãç¦:jØðÆ0¾[7`uü2ìÃïí‹25¬†§ À¢¥ß<'0+×ã]¼&AáCCDÿLô:ÆôaUïb’£lF±ÜŽUf·»Žå  ¡°ä5áš3o8o¢çëw&hdÏY§íôù”jÍ`þÎ 3goÌ€2^[˜È­ 8ÛÂSÒÄiŸÔ´ÐB@CSöAsŒÇC…šKæq*É ä÷§ÀükA“8¬ùØDÂ$ÃÒX˜–ºš$Pÿ✧¯îì”§XPº½_Sý^r plE–µ¢ÛH\ܯº&©²ú;!›mK{á.` oY*¨úP`fcLJq^¤€ÑâæÃ>ÜvEÙƒ€½þ;=C ?ାz¡9² îtkì!1ïA…ðVôT8Wš'‹ ¾ug£z´NpB)!'[4 ‘4àpõ ÛI,„Òz]º˜¨ùKØ?mß/botan-2.4.0/src/tests/data/x509/ocsp/resp2.der000066400000000000000000000007171322470703100206660ustar00rootroot000000000000000‚Ë  ‚Ä0‚À +0‚±0‚­0–¢Jݼöhµvõ¶»bºZ/20161121190547Z0k0i0A0 +òàjù…Šp›I#z©µ(~dJݼöhµvõ¶»bºZ/BH> _‘`Æ€20161121190547Z 20161128190547Z0  *†H†÷  ‚2¿ªÞ5^\“¸….û:ˆ(wÛ’íãÖŠæ™Î´^®»ÄÒ×úôê}çþŧ×O #sG˜L¯GåjµÐ˜ü0iËÌ]@À‘n˜÷#50Blö!´`¹Ü·9'þ?@D‹w“-av–ÃWÒÕÔÜ;*X™PFÍ(F€’aA[N5AÅ*Ôv ‰Àpäq»žM˜Úêwèü"âõwñ¯óàNÇö—(ïɶ?°DšÔ—¯ÓÑܨßVœU½áRf]ÝþBtÏš¡L¦>ðЊÀ’L:ùb¬®ÛÌ%iT¸ÒÕ’[•ƒ¤1Kg€Ã†Ó×Ö·bd\Ûbotan-2.4.0/src/tests/data/x509/ocsp/resp3.der000066400000000000000000000007301322470703100206620ustar00rootroot000000000000000‚Ô  ‚Í0‚É +0‚º0‚¶0Ÿ¢¯j:”Z ØêVsßC´:(Úç20161121215648Z0t0r0J0 +zá>è Ä*,´(Ëç¦F@â¡é¯j:”Z ØêVsßC´:(ÚçÏ”!ý|ŒiÀÿTÀhÞ-í€20161121215648Z 20161125215648Z0  *†H†÷  ‚‡Tš„ G·ød’⦫. ÀJá‘ ²bn§Ž»aTλÿçô•ˆ¾{¿à­ýóë§£¼Yr{-þªŠ£š÷v¿©CÅZÌ­Êö@—¶ÿ»+ëâ:zMü_à Ëtà¤uï@Œêè7£ú©~t¢JÝÃt׎:Q»ÓÜÊF”/ëw•¯¸Ë¿i‘ÀL_Ì0Ò2Lg¥>åü@ÆÎt´Ö5&º¿BíÙEwëÚ.ÅÁv\ ظ>úZx§ R¿Knµ­xYW_ʈÒê¾ø²0¦¶‹m%í,á›-Á^¸e‡ØÝz>‘öˆÚ¼”]¥ª¬šŽxµ I± QUWŠ¥%botan-2.4.0/src/tests/data/x509/pss_certs/000077500000000000000000000000001322470703100201735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/01/000077500000000000000000000000001322470703100204135ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/01/README.txt000066400000000000000000000000161322470703100221060ustar00rootroot00000000000000default paramsbotan-2.4.0/src/tests/data/x509/pss_certs/01/end.crt000066400000000000000000000032501322470703100216730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEvDCCA3OgAwIBAgICEAEwPgYJKoZIhvcNAQEKMDGgCzAJBgUrDgMCGgUAoRgw FgYJKoZIhvcNAQEIMAkGBSsOAwIaBQCiAwIBFKMDAgEBMIGzMQswCQYDVQQGEwJE RTEPMA0GA1UECBMGSGVzc2VuMRIwEAYDVQQHEwlGcmFua2Z1cnQxHjAcBgNVBAoT FVBTUyB0ZXN0IGNlcnRpZmljYXRlczE5MDcGA1UECxMwY3JlYXRlZCBieSBNYXJ0 aW4gS2Fpc2VyIChodHRwOi8vd3d3LmthaXNlci5jeC8pMSQwIgYDVQQDExtQU1Mg dGVzdFJvb3QgQ0EgQ2VydGlmaWNhdGUwHhcNMTAwNzEzMTk1ODI1WhcNMTYwMTAz MTk1ODI1WjCBrjELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjESMBAGA1UE BxMJRnJhbmtmdXJ0MR4wHAYDVQQKExVQU1MgdGVzdCBjZXJ0aWZpY2F0ZXMxOTA3 BgNVBAsTMGNyZWF0ZWQgYnkgTWFydGluIEthaXNlciAoaHR0cDovL3d3dy5rYWlz ZXIuY3gvKTEfMB0GA1UEAxMWUFNTIENsaWVudCBDZXJ0aWZpY2F0ZTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBANkLrMSIIRkN3xdaGievqVyBzyAsdQoi i1+gJkMDTVOL7b8f3esH8yDgNkQOa8tCtdNxFhq/cZsldSJuZXFb4gUtQZc1DwLo 4GIw6L8uk+CCCt9NeaJeTab31SZG18JRRHRRvb9C4q0QeaNfspKELXeV0KFnrh4K 69v5i/AN8GK/RQWYxqlLgY8v2YwIWwPmqFAhJrVXJHEzcHdVHIfpcuTuH4Nvrxmb H6XvSX4uraHlneGYMsPePhfGunbOfXQgdLQMyM5Sj2LXmkxr8pVz7V6KJQIVAl0r 4oA34lAB0zKYfkJJDPyghBCemwhCe0tEUx0fitrj1rBoENI8NP7AZvkCAwEAAaN7 MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQg Q2VydGlmaWNhdGUwHQYDVR0OBBYEFCjZAcd3fo5Rjx8u3PHUNIp5ZbQ7MB8GA1Ud IwQYMBaAFN8f4gGiPvT5afg6x5bWmQ0vts4zMD4GCSqGSIb3DQEBCjAxoAswCQYF Kw4DAhoFAKEYMBYGCSqGSIb3DQEBCDAJBgUrDgMCGgUAogMCARSjAwIBAQOCAQEA rO3xdxs9GkamZwXImt+wRWwYs+MpPEVFyMFq5CY2gmbuKKNb/x15MxmXg6ic9VzM SC/flOVlcN+4e305FApeR4yhkf5oYC5b52jXsD2Vozt7jELeXFdiw3Ylfe1G1vcZ vVSHngekonYIVFxMw0IXiEVphwX7SmfjTjgzhN0n+1LOppdktpbx69Yv66Yr6K2a 8joa1Sguz1LJmzwDUtAaVQkZv7W3O41GpRSXk5Kahv5DgeN/1U+caHiNLK9tKfNE xD0kXtALc/VKdhsOTrv6i2X/HopFPwEifSPxwp32KePtnb93Ueqkc3jFMm0lxvy2 Hgwyk/rtCq5eH32tODWomw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/01/root.crt000066400000000000000000000036231322470703100221140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFazCCBCKgAwIBAgIJAKmJV6cI/tYpMD4GCSqGSIb3DQEBCjAxoAswCQYFKw4D AhoFAKEYMBYGCSqGSIb3DQEBCDAJBgUrDgMCGgUAogMCARSjAwIBATCBszELMAkG A1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjESMBAGA1UEBxMJRnJhbmtmdXJ0MR4w HAYDVQQKExVQU1MgdGVzdCBjZXJ0aWZpY2F0ZXMxOTA3BgNVBAsTMGNyZWF0ZWQg YnkgTWFydGluIEthaXNlciAoaHR0cDovL3d3dy5rYWlzZXIuY3gvKTEkMCIGA1UE AxMbUFNTIHRlc3RSb290IENBIENlcnRpZmljYXRlMB4XDTEwMDcxMzE5NTc1NVoX DTE2MDEwMzE5NTc1NVowgbMxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4x EjAQBgNVBAcTCUZyYW5rZnVydDEeMBwGA1UEChMVUFNTIHRlc3QgY2VydGlmaWNh dGVzMTkwNwYDVQQLEzBjcmVhdGVkIGJ5IE1hcnRpbiBLYWlzZXIgKGh0dHA6Ly93 d3cua2Fpc2VyLmN4LykxJDAiBgNVBAMTG1BTUyB0ZXN0Um9vdCBDQSBDZXJ0aWZp Y2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMZnLiVdh/4aR2Gj FKBiDmuNe8o6NJSgNRMXv+zweb1CQRUQ4HzdiZDRBTxAGM+83/ofeD3ALUyDGniX fbjxv05QyPGnJDjJYpdQ3ilM4MXoEYz7ZfB4/AVh1zvqELFR3a2TZ78oQGYJBeF3 vAmVuDwCrZ8J7xddABt7ceqDtzhhNcvOWDZxXtzK5yDtb4N/RMJZtbK6ZNsLV/+J OMHT+22xycE6tE2gMCqUUC2b2MpnW71GqtkKxaA36VXl/c4Z0IhNE2Zx3qy5NVsU Z+NYw6JrWtEw+kf2j0bKj5w0LMlERKbNib4kofcMJ8qPEIvk1u6T30vKUb7HQdU7 2OuTWQ8CAwEAAaOCARwwggEYMB0GA1UdDgQWBBTfH+IBoj70+Wn4OseW1pkNL7bO MzCB6AYDVR0jBIHgMIHdgBTfH+IBoj70+Wn4OseW1pkNL7bOM6GBuaSBtjCBszEL MAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjESMBAGA1UEBxMJRnJhbmtmdXJ0 MR4wHAYDVQQKExVQU1MgdGVzdCBjZXJ0aWZpY2F0ZXMxOTA3BgNVBAsTMGNyZWF0 ZWQgYnkgTWFydGluIEthaXNlciAoaHR0cDovL3d3dy5rYWlzZXIuY3gvKTEkMCIG A1UEAxMbUFNTIHRlc3RSb290IENBIENlcnRpZmljYXRlggkAqYlXpwj+1ikwDAYD VR0TBAUwAwEB/zA+BgkqhkiG9w0BAQowMaALMAkGBSsOAwIaBQChGDAWBgkqhkiG 9w0BAQgwCQYFKw4DAhoFAKIDAgEUowMCAQEDggEBAJ8GcFT/Jdhz65JK0c9EFdAq 8FKa9VWX7QDQlIuu0UbZaHYaFmY1NbXcxlvTOD1ArByCHpFQ8+wrXgLrxedlm/fI 9WkvFsyvC1kSeV88C90E3mh+w9i2Qsz0Gjj2RjD98cPsqqQO7q/7uvKNcHMN5nKi VuIPMr5fisx0C/IBQAunBfzBfdGmjoNaahDBYCKiyAaU7A+dYorRbMJF7SxBhTr1 WI/N3LlBKLF5mvtDYg7sXx6ULR/xAKKkVeUTIgGMYq/s46ZMP11QrfRHx4zNAwP9 aARZeUz1X0/LM6LgaQvVIhZqbyB637eZhusOP3226TDn7hGx/UdS0UxSwfjrzS8= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/02/000077500000000000000000000000001322470703100204145ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/02/README.txt000066400000000000000000000000151322470703100221060ustar00rootroot00000000000000empty params botan-2.4.0/src/tests/data/x509/pss_certs/02/end.crt000066400000000000000000000030421322470703100216730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEWjCCA0KgAwIBAgICEAEwDQYJKoZIhvcNAQEKMAAwgbMxCzAJBgNVBAYTAkRF MQ8wDQYDVQQIEwZIZXNzZW4xEjAQBgNVBAcTCUZyYW5rZnVydDEeMBwGA1UEChMV UFNTIHRlc3QgY2VydGlmaWNhdGVzMTkwNwYDVQQLEzBjcmVhdGVkIGJ5IE1hcnRp biBLYWlzZXIgKGh0dHA6Ly93d3cua2Fpc2VyLmN4LykxJDAiBgNVBAMTG1BTUyB0 ZXN0Um9vdCBDQSBDZXJ0aWZpY2F0ZTAeFw0xMDA3MTMxOTU2MzVaFw0xNjAxMDMx OTU2MzVaMIGuMQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMRIwEAYDVQQH EwlGcmFua2Z1cnQxHjAcBgNVBAoTFVBTUyB0ZXN0IGNlcnRpZmljYXRlczE5MDcG A1UECxMwY3JlYXRlZCBieSBNYXJ0aW4gS2Fpc2VyIChodHRwOi8vd3d3LmthaXNl ci5jeC8pMR8wHQYDVQQDExZQU1MgQ2xpZW50IENlcnRpZmljYXRlMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0rRh20Rw3OclYSckr188QwCMinUq82WO 87DteNidh9EQTTOp5pEeNiTOs+P7bmYlLJdRdt+xzIJsUtm8I4wX0BCDoy6mYIY/ f53zcRIfOxJ/KXDqI+0ryqHMpJqPwXMehLnNwnIVCoHmCi5aC+oD/lMfLWnxd/sK bOrkd6nDOxQFWc0ELCb+nRK836Zww0bHFXLAohW1LY20uCz2ejHsbDmLKQr7gww3 QvRqqvJzPq21SvmApXG+LUXpNvFWYxKY1QxJd9oeMZFvFn4i9nEoquAk4j7VzJH7 FYn355G05qMuc7UuXc+jLUU3rtiqvRg1fmnQ+fq75eWbsSaRyUs+vwIDAQABo3sw eTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBD ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUIFkXI3ppBF8PJaFvhUf/FF5EbZwwHwYDVR0j BBgwFoAUzggLIT/lwChtaNDss8YusBT+BsMwDQYJKoZIhvcNAQEKMAADggEBAEsy xXoyQG9sk9ISZLjKn0lmPtHsT0K3guD2TLEG72Kp/3w1B3Pob/BstHkabd8hB3Mv xQCeu0zPLxSXF9AT71mPEX63dcZ6I+0eIy95q/xxGYcrQ6wmQMXF/X1DeKOWC4/V IgC3UDypuGPd4z7NyyvYB3WodJVCn+P/TvyEXy3eopNI2GS+JaSmk/1CE23BA6Cn bNejFoWaL4RVmifQsqw44vnI+tFvlO3H4JVgkaezt6RpPpz+kzY3mEqCsisgfGrE QrITP7+uiqilzOn/jsovQJDAsZSSIHlGkwrkqJd2SjIawpoPwLQ6DZrmCBc8A2t4 2n4EHJ7mVPcwMUJ5Oyk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/02/root.crt000066400000000000000000000034151322470703100221140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFCTCCA/GgAwIBAgIJALCOVlO1QTu1MA0GCSqGSIb3DQEBCjAAMIGzMQswCQYD VQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMRIwEAYDVQQHEwlGcmFua2Z1cnQxHjAc BgNVBAoTFVBTUyB0ZXN0IGNlcnRpZmljYXRlczE5MDcGA1UECxMwY3JlYXRlZCBi eSBNYXJ0aW4gS2Fpc2VyIChodHRwOi8vd3d3LmthaXNlci5jeC8pMSQwIgYDVQQD ExtQU1MgdGVzdFJvb3QgQ0EgQ2VydGlmaWNhdGUwHhcNMTAwNzEzMTk1NjAzWhcN MTYwMTAzMTk1NjAzWjCBszELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjES MBAGA1UEBxMJRnJhbmtmdXJ0MR4wHAYDVQQKExVQU1MgdGVzdCBjZXJ0aWZpY2F0 ZXMxOTA3BgNVBAsTMGNyZWF0ZWQgYnkgTWFydGluIEthaXNlciAoaHR0cDovL3d3 dy5rYWlzZXIuY3gvKTEkMCIGA1UEAxMbUFNTIHRlc3RSb290IENBIENlcnRpZmlj YXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2haEKyn8mtVODAPA EMV9VlNm+HPBh+Mve5nPoU4PZ198E2JQ1llvXbDWmhuKzn/ZyB2janx/imvylkOq Jmkdqka+VC+69/pDmhHKp2qHL6S/alPG6E2kQhy4FVIEU2Qme6niMZY4005237Pi fWc1MBEU2c6jdkUIbw5SrWub5dbMIi71lUPHzaLqGovkLaWg2+BnPOSdg13t3jLt N6Dm9VMpDE0sOu/t582bc2MfCmO/vIsSpu2/iA+gB4vecDBJGyOISYKKvjnc4N2s Obok9ZgJKeTM40hGXEGzE+cTEDkkh8ydlGVRIJe3o5wjuLH3P51/EFVu0PhCSyV6 FGIO1wIDAQABo4IBHDCCARgwHQYDVR0OBBYEFM4ICyE/5cAobWjQ7LPGLrAU/gbD MIHoBgNVHSMEgeAwgd2AFM4ICyE/5cAobWjQ7LPGLrAU/gbDoYG5pIG2MIGzMQsw CQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMRIwEAYDVQQHEwlGcmFua2Z1cnQx HjAcBgNVBAoTFVBTUyB0ZXN0IGNlcnRpZmljYXRlczE5MDcGA1UECxMwY3JlYXRl ZCBieSBNYXJ0aW4gS2Fpc2VyIChodHRwOi8vd3d3LmthaXNlci5jeC8pMSQwIgYD VQQDExtQU1MgdGVzdFJvb3QgQ0EgQ2VydGlmaWNhdGWCCQCwjlZTtUE7tTAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBCjAAA4IBAQCBgFRdPf+k9up9PwwbHORNe8HP c7+yXPDK/qH74bJMQvaNOpXhvb0KWDcj5GPJ0l+eVatV1UzyDZT6exqaBTeWjgKW 1HMfF9z3Ybs1PTKt8IASFNMe4Nizx6vuAvnP/GXTz7LwOZt7QYBTaAOKUQqB/yBQ D9Vn+P+nqgQCBfFhVXPurUFpAt6npnKpKIG8wmMBoeeuWpzMFs0Rnf9TFJt9SkAn M8J806yQWShmibcQWmmveHtN8s/69FUUIu6q1h0A8qxISj87CdC4XKvLRV6DSu4C +b/CfhHaOR8lINDcVYg4j3VZU24nmPlWcH4yXO8gbnoMOLnf36/Ezw3wnVIV -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/03/000077500000000000000000000000001322470703100204155ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/03/end.crt000066400000000000000000000063461322470703100217060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEnTCCA1GgAwIBAgIGAWAB9W4PMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDBjMQ8wDQYD VQQDDAZQU1MtQ0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3Rh bjEPMA0GA1UEBwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMCAX DTAwMTIzMTIzMDAwMFoYDzIwOTgxMjMxMjMwMDAwWjBlMREwDwYDVQQDDAhQU1Mt Q2VydDEUMBIGA1UECwwLQm90YW4tVGVzdHMxDjAMBgNVBAoMBUJvdGFuMQ8wDQYD VQQHDAZCb2NodW0xDDAKBgNVBAgMA05SVzELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCxW+LMi18HK+SRoKI3m2d3sMnI0GH5UbaI q3l5RdxFD0iUdiBVI6trbxPcDSNVovPOs2Y5C0tO1Wh6E9weU4Qck/oB3hn0XI9y cyWzgdj/tTfE4/2P96Mo5jRi1AsM3GXGsKmuKULCYItjuGeEbz31tMmaOCQ8o41a 8eQrYljFWgWkEMUa1AmjoTTzR5WjkuHUtpUFvSjFk7+ZNRFv+WxvZ8KB9Zdb/HDJ XIKdOL5CuL+3iSQn0yZM3iU5kTxkTjCC8jcCNTe3s/VsAX/ij5+jmU8ln/sAqOGC lGmIlZcYi7ojw53Wvvw8duNFZPyK1PoI5UVINeK2uSW2vt33Ot9fAgMBAAGjgeow gecwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwgZIGA1UdIwSBijCBh4AU NvWUOAnGk/vcVjyy75iIFkmxn1yhZ6RlMGMxDzANBgNVBAMMBlBTUy1DQTEUMBIG A1UECwwLQm90YW4tVGVzdHMxDjAMBgNVBAoMBUJvdGFuMQ8wDQYDVQQHDAZCb2No dW0xDDAKBgNVBAgMA05SVzELMAkGA1UEBhMCREWCBgFgAfJIKTATBgNVHREEDDAK gghQU1MtQ2VydDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwQQYJKoZI hvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgB ZQMEAgEFAKIDAgEgA4IBAQAIvskMuvUUlpCj6aAg1p8+CuMPWTyfjayqiJ+8IDIp up51n4H5IpAhnp4MsXQ3oySsXSe7RmgkOFTrei8U2B9v+nf2ebCOjEl//cgEHMqC pVAJUcaiG/TL2RhZjzAXebk7R4Wia1ZXKiMLvFk84aVbSFfdb1S+RnwqpAMC+VAy Qb3GzShRSDUkk1TiuujBdKa/mnv2Qs2OBHcjD6elXVnp+bYbsvET1uizRaQ8yEOD DnZhzEGxWsZKsnsApJt/iEZnK5bdLeS7FCp15BgPlphNjvFV6lO75Tv4x1JGsHZl FFYJzCWCZd1Egp5c5zMAC/PRjRUQ04sAmynOHEs0jp2T -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEajCCAx6gAwIBAgIGAWAB8kgpMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDBjMQ8wDQYD VQQDDAZQU1MtQ0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3Rh bjEPMA0GA1UEBwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMCAX DTk5MTIzMTIzMDAwMFoYDzIwOTkxMjMxMjMwMDAwWjBjMQ8wDQYDVQQDDAZQU1Mt Q0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UE BwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg6QT4bJpuTGy2+eG1h4O22XQwCWz2wAmerQd xK1oFeXzfOUR0cnpGBDvhIzprK7Ino0SKuV9WBDCw8wQakx45Y1YNoQJ7Y816B1d cu2IsRX5T+CwAC5awJIMOYKN+izb7ad5ZvOBKZbr0I0kTut7ZtKJS67IUH/RqxXY KsOLOkTtpiTKGMLMUPOjFgbhVxzn8z9p8zgwNbrSXlUVazsov3JfB6xVQRu6wNSw i1K9c3NmJPD+jN+F2Ga1Y1bhEI2GJUBsulg5nfJ9y+p5Xez8OsqM3vMZ9ukhl0l9 UwHxebwzRKL/yad3iXiPAV7a2tluZs2WgnlHlTTMSVBDTgzVgQIDAQABo4G5MIG2 MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MIGSBgNVHSMEgYowgYeA FDb1lDgJxpP73FY8su+YiBZJsZ9coWekZTBjMQ8wDQYDVQQDDAZQU1MtQ0ExFDAS BgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UEBwwGQm9j aHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFggYBYAHySCkwQQYJKoZIhvcN AQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQME AgEFAKIDAgEgA4IBAQAj45MXBTbkT7M07h+EFBnjCTZ7SriCw3nhZAjSqK35EjGH l66YRr/oaqgyWaL67TBDNG0yUtW42chOXmbvgwryvKganUjJsOmaYqOng1V4C6N2 2ld+pMvQSLG1q6O1lfJLKRMKfbEuwoza8CiBXqzrKFA1LIc8RgWQ83pyGSsdK6yq fpExGBDk8tZI5pVLiSfINcqStr+tSt8egrkD4O437li0paALfL719jVjH3vL6L+T dZ89ty1Pv30bvipPe0SUGtiUiNEvdR+ia8WJtjKq18mKwklPH/DmhS5IuNawwoo5 XXNV7igmlyKvO+yoa67HNw1w0d4tRCEQJnM38zuV -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/03/root.crt000066400000000000000000000031201322470703100221060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEajCCAx6gAwIBAgIGAWAB8kgpMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDBjMQ8wDQYD VQQDDAZQU1MtQ0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3Rh bjEPMA0GA1UEBwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMCAX DTk5MTIzMTIzMDAwMFoYDzIwOTkxMjMxMjMwMDAwWjBjMQ8wDQYDVQQDDAZQU1Mt Q0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UE BwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg6QT4bJpuTGy2+eG1h4O22XQwCWz2wAmerQd xK1oFeXzfOUR0cnpGBDvhIzprK7Ino0SKuV9WBDCw8wQakx45Y1YNoQJ7Y816B1d cu2IsRX5T+CwAC5awJIMOYKN+izb7ad5ZvOBKZbr0I0kTut7ZtKJS67IUH/RqxXY KsOLOkTtpiTKGMLMUPOjFgbhVxzn8z9p8zgwNbrSXlUVazsov3JfB6xVQRu6wNSw i1K9c3NmJPD+jN+F2Ga1Y1bhEI2GJUBsulg5nfJ9y+p5Xez8OsqM3vMZ9ukhl0l9 UwHxebwzRKL/yad3iXiPAV7a2tluZs2WgnlHlTTMSVBDTgzVgQIDAQABo4G5MIG2 MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MIGSBgNVHSMEgYowgYeA FDb1lDgJxpP73FY8su+YiBZJsZ9coWekZTBjMQ8wDQYDVQQDDAZQU1MtQ0ExFDAS BgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UEBwwGQm9j aHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFggYBYAHySCkwQQYJKoZIhvcN AQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQME AgEFAKIDAgEgA4IBAQAj45MXBTbkT7M07h+EFBnjCTZ7SriCw3nhZAjSqK35EjGH l66YRr/oaqgyWaL67TBDNG0yUtW42chOXmbvgwryvKganUjJsOmaYqOng1V4C6N2 2ld+pMvQSLG1q6O1lfJLKRMKfbEuwoza8CiBXqzrKFA1LIc8RgWQ83pyGSsdK6yq fpExGBDk8tZI5pVLiSfINcqStr+tSt8egrkD4O437li0paALfL719jVjH3vL6L+T dZ89ty1Pv30bvipPe0SUGtiUiNEvdR+ia8WJtjKq18mKwklPH/DmhS5IuNawwoo5 XXNV7igmlyKvO+yoa67HNw1w0d4tRCEQJnM38zuV -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/04/000077500000000000000000000000001322470703100204165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/04/end.crt000066400000000000000000000063361322470703100217060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEljCCA0qgAwIBAgIGAWAB9gf1MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDBjMQ8wDQYD VQQDDAZQU1MtQ0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3Rh bjEPMA0GA1UEBwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMCAX DTAwMTIzMTIzMDAwMFoYDzIwOTgxMjMxMjMwMDAwWjBlMREwDwYDVQQDDAhQU1Mt Q2VydDEUMBIGA1UECwwLQm90YW4tVGVzdHMxDjAMBgNVBAoMBUJvdGFuMQ8wDQYD VQQHDAZCb2NodW0xDDAKBgNVBAgMA05SVzELMAkGA1UEBhMCREUwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCD9AimnF+OhedVEzGPoKdkMufi7LD9TAWH hmpUYe7bHEd5m5IPg3CognneOuPKSMipg2TIyuEeV8XgD/TwGJHyeoVWjqQThq0S vi4nQI5SS3pqTpyguPDzvUaHepbKf9/LnhWHFngFrv1GRG5dvJrwMumED5VrIEdK Hb2GfG6P67nOIekZfnv6JMwHOjuiJ6rlKVtPDoXqdm4knl8k064QldyWG3ZmP5Dz K1KouRsb1Dyf/kmiY0dUopGe7236wtYAZFj2RJByFV+QbCV6+hUk8qaiw6W3JApv jltztIZuz4Y63Cz6m5ROb8f0osl/3Vq4tniOvfMovUoFVjzcHAhdAgMBAAGjgeMw geAwDgYDVR0PAQH/BAQDAgUgMAwGA1UdEwEB/wQCMAAwgZIGA1UdIwSBijCBh4AU NvWUOAnGk/vcVjyy75iIFkmxn1yhZ6RlMGMxDzANBgNVBAMMBlBTUy1DQTEUMBIG A1UECwwLQm90YW4tVGVzdHMxDjAMBgNVBAoMBUJvdGFuMQ8wDQYDVQQHDAZCb2No dW0xDDAKBgNVBAgMA05SVzELMAkGA1UEBhMCREWCBgFgAfJIKTATBgNVHREEDDAK gghQU1MtQ2VydDAWBgNVHSUEDzANBgsrBgEEAYHrfQ0BATBBBgkqhkiG9w0BAQow NKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUA ogMCASADggEBAGcIe3q6jTKjSGrD2xi512DUnZEPhqxrU7lUiXc+Q86QUQmr070R jy8g5uMHGe+/UUFbA0CMpopQgk6tIB1mfm6x5dX2SaQ6wgnEUx3FaSSVDQQGab/0 Fb142s+2I3gt28uLr40YGZuRYz4GKdgZdC4D1+KR6ef9vRNdCfgwVCAUJFmuplSf yQo3/rufmV7PUS8M2q+/GYehoR/h8fX1TKCpeQQMrA8LLvt+FCF6J4xrwf9F5O+p lIDNFHhvKeN7ORLy+Xvxy3E9CD0pqbxn7CrAd/Arl3GCGAjELfncWaP7qV72RmkG LHNDGT/zvvX+TU3R1Q7eI5fiIL/OJvGn5/w= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEajCCAx6gAwIBAgIGAWAB8kgpMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDBjMQ8wDQYD VQQDDAZQU1MtQ0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3Rh bjEPMA0GA1UEBwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMCAX DTk5MTIzMTIzMDAwMFoYDzIwOTkxMjMxMjMwMDAwWjBjMQ8wDQYDVQQDDAZQU1Mt Q0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UE BwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg6QT4bJpuTGy2+eG1h4O22XQwCWz2wAmerQd xK1oFeXzfOUR0cnpGBDvhIzprK7Ino0SKuV9WBDCw8wQakx45Y1YNoQJ7Y816B1d cu2IsRX5T+CwAC5awJIMOYKN+izb7ad5ZvOBKZbr0I0kTut7ZtKJS67IUH/RqxXY KsOLOkTtpiTKGMLMUPOjFgbhVxzn8z9p8zgwNbrSXlUVazsov3JfB6xVQRu6wNSw i1K9c3NmJPD+jN+F2Ga1Y1bhEI2GJUBsulg5nfJ9y+p5Xez8OsqM3vMZ9ukhl0l9 UwHxebwzRKL/yad3iXiPAV7a2tluZs2WgnlHlTTMSVBDTgzVgQIDAQABo4G5MIG2 MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MIGSBgNVHSMEgYowgYeA FDb1lDgJxpP73FY8su+YiBZJsZ9coWekZTBjMQ8wDQYDVQQDDAZQU1MtQ0ExFDAS BgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UEBwwGQm9j aHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFggYBYAHySCkwQQYJKoZIhvcN AQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQME AgEFAKIDAgEgA4IBAQAj45MXBTbkT7M07h+EFBnjCTZ7SriCw3nhZAjSqK35EjGH l66YRr/oaqgyWaL67TBDNG0yUtW42chOXmbvgwryvKganUjJsOmaYqOng1V4C6N2 2ld+pMvQSLG1q6O1lfJLKRMKfbEuwoza8CiBXqzrKFA1LIc8RgWQ83pyGSsdK6yq fpExGBDk8tZI5pVLiSfINcqStr+tSt8egrkD4O437li0paALfL719jVjH3vL6L+T dZ89ty1Pv30bvipPe0SUGtiUiNEvdR+ia8WJtjKq18mKwklPH/DmhS5IuNawwoo5 XXNV7igmlyKvO+yoa67HNw1w0d4tRCEQJnM38zuV -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/04/root.crt000066400000000000000000000031201322470703100221070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEajCCAx6gAwIBAgIGAWAB8kgpMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIDBjMQ8wDQYD VQQDDAZQU1MtQ0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3Rh bjEPMA0GA1UEBwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMCAX DTk5MTIzMTIzMDAwMFoYDzIwOTkxMjMxMjMwMDAwWjBjMQ8wDQYDVQQDDAZQU1Mt Q0ExFDASBgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UE BwwGQm9jaHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg6QT4bJpuTGy2+eG1h4O22XQwCWz2wAmerQd xK1oFeXzfOUR0cnpGBDvhIzprK7Ino0SKuV9WBDCw8wQakx45Y1YNoQJ7Y816B1d cu2IsRX5T+CwAC5awJIMOYKN+izb7ad5ZvOBKZbr0I0kTut7ZtKJS67IUH/RqxXY KsOLOkTtpiTKGMLMUPOjFgbhVxzn8z9p8zgwNbrSXlUVazsov3JfB6xVQRu6wNSw i1K9c3NmJPD+jN+F2Ga1Y1bhEI2GJUBsulg5nfJ9y+p5Xez8OsqM3vMZ9ukhl0l9 UwHxebwzRKL/yad3iXiPAV7a2tluZs2WgnlHlTTMSVBDTgzVgQIDAQABo4G5MIG2 MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MIGSBgNVHSMEgYowgYeA FDb1lDgJxpP73FY8su+YiBZJsZ9coWekZTBjMQ8wDQYDVQQDDAZQU1MtQ0ExFDAS BgNVBAsMC0JvdGFuLVRlc3RzMQ4wDAYDVQQKDAVCb3RhbjEPMA0GA1UEBwwGQm9j aHVtMQwwCgYDVQQIDANOUlcxCzAJBgNVBAYTAkRFggYBYAHySCkwQQYJKoZIhvcN AQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQME AgEFAKIDAgEgA4IBAQAj45MXBTbkT7M07h+EFBnjCTZ7SriCw3nhZAjSqK35EjGH l66YRr/oaqgyWaL67TBDNG0yUtW42chOXmbvgwryvKganUjJsOmaYqOng1V4C6N2 2ld+pMvQSLG1q6O1lfJLKRMKfbEuwoza8CiBXqzrKFA1LIc8RgWQ83pyGSsdK6yq fpExGBDk8tZI5pVLiSfINcqStr+tSt8egrkD4O437li0paALfL719jVjH3vL6L+T dZ89ty1Pv30bvipPe0SUGtiUiNEvdR+ia8WJtjKq18mKwklPH/DmhS5IuNawwoo5 XXNV7igmlyKvO+yoa67HNw1w0d4tRCEQJnM38zuV -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/05/000077500000000000000000000000001322470703100204175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/05/end.crt000066400000000000000000000042501322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGNjCCA+qgAwIBAgIIA3YyOyA0LO4wQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTEwNTEzMzkyNloXDTIx MDIwMzEzMzkyNlowczEjMCEGA1UEAwwaU3dlZGlzaCBSUCBEb2N1bWVudCBTaWdu ZXIxCzAJBgNVBAUTAjI0MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3MxGDAWBgNV BAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQC7DEwj/dHgLCYKl+oyWVr8MhaiPunPZ4+LNHqKQj3s woSHEspabQTjWnmxG1pOIPK0G0+Jt7qr8OhXSXKoC7wT+dMVaXH+dS8nCWxqnEut GCeKwQrpYr/uoafO8NvwnuSF88blClgzLk2t2IJ6goQ+YNzSgpUcXv8wqkZA5W/u s0iZARsCi3jG/0N5ah7peiPRpqL//cmxd+lWq/na/IWOoyG6WT5Z5Dz+Vp4SXhg7 V4vJF7Yu+LuulCziP31FPBpL3zzUGR1ePter5R6LnfbevyJoxFFGWw9V3fgC+chH cMhtAWWEphJbOyjAxtcANAjWY0B3ak/GbdEzvowoZQ31AgMBAAGjggGIMIIBhDAO BgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFCyOqJ4Syd/QWcktZd6loDemnZ6pMB8G A1UdIwQYMBaAFA4wULiS85liyEcZLpjk0/qoQxmsMCsGA1UdEAQkMCKADzIwMTUx MTA1MTMzOTI2WoEPMjAxNjAyMDMxMzM5MjZaMBcGA1UdIAQQMA4wDAYKKoVwVGQJ AQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3ZTI3Njgx MjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+kEDAOMQww CgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4BgNVHRIE MTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEB CDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQCR/5i6YCVpZFYlf5Exds9tdliztg8U SHU1ii/UDn7aRFD7EvVWtoAraC8/2prLYWw2T+0WWN058lJOpSoyt0R/mh1tVUEm 5Lxr+r3daCH5/I7Z9vvnmniewLKN6E6MRA5Ko/2xKuOTOi9NkgyTUVKMe6Q+LzBw Bx6X++P/uM4zghVuoxT7czN+Zx/Imo6aY8p1qxdYixG2X5FDxocdBHmdwEX6UeVO 9cG+pf0U97vO2785IJv+lJgP/1Z2Xs1aBn7nzgoHWM5yQTXchYnCR6byUn95HhZ3 +EhYHg4Fv8b7Gx7+VjyKhvWl5Q1xQHmEUFECbxxMji4vN47dObErifebSKpZ4mre mXtRkrTe3Kcu+bnzMxk78CWyVqtOqkrWABG/woXLxAxQKo+G7TJ6y97+koGgYN1r YULiBlsqcdxybDtUeoq8JoNIudPgBetaDZFLf2z4QEPZBl6uhVcRAwaYWRmNOgbN AxtYO/+yAKQPtq3mmojs+99oxS6i+Tria6AlogJJcUtl+TXQtMrzcmG921eODtTG RI7pvRp3b3gDJN1wk2oK2DUwesrkMIqe+2g91Ps8HfPXfSXDl97yBwQQv6crlcDR Bx/PfoqU4AEUdKRBMvIF4CvDCwdyVNpT0xBkPeATVNjgX5hH6+N89al1rh/ALfVM rGSju/pBymRfgw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/05/root.crt000066400000000000000000000047141322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/06/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/06/end.crt000066400000000000000000000042501322470703100217010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGNjCCA+qgAwIBAgIIS0EslWJVqbgwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTEwNTE0MzY1OVoXDTIx MTAxMDE0MzY1OVowczEjMCEGA1UEAwwaU3dlZGlzaCBSUCBEb2N1bWVudCBTaWdu ZXIxCzAJBgNVBAUTAjI3MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3MxGDAWBgNV BAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDLOLK0ofw7Jv6gsZE4LCqfLJTCY4ekPS32r0cjgf2S 1Y3CwhtuukOzGEvUOJDl7h+POH0bdkQGjg4xFD+IbnZCHpTH/JqQuUVDAg70A5zr bjw66pWlg5d2gLEvBUdPM2RY8wD9HUY5KF608c8vTVpNdEsY0S47hIUk4gdPzzPR SU1kHKJEfac8+dzlVZBPUHTj/+3xSW/cNdFsSpXqT/sujFV9tnyN6oKAs9JfRHNV 9RJKzDqbDvTDRWYPIt8EJww5VnK0dbSX2A80VFZm5L6wIlGFKmTKbSAq9ZMm+89S HbeN3frUIBc2wzVJZxEUVejXKV957h2J59kBLRmwficjAgMBAAGjggGIMIIBhDAO BgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFDuHTQuuyxWwBZZSLf1y2yHYJbHYMB8G A1UdIwQYMBaAFA4wULiS85liyEcZLpjk0/qoQxmsMCsGA1UdEAQkMCKADzIwMTYw NzExMTQzNjU5WoEPMjAxNjEwMDkxNDM2NTlaMBcGA1UdIAQQMA4wDAYKKoVwVGQJ AQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3ZTI3Njgx MjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+kEDAOMQww CgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4BgNVHRIE MTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEB CDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQBOUd1lP/h6XEAcHGieL7l5mMfoxVlx H3XiLz7CnjFrSiBvYA3vyB/XfiLV0PTjIrHcJjPpDTSUDt/cPdMOFDemjKZPsdZA iCkZ0Jfo0BUZGLsx+cZVIRuIEssKqRlOC1g3AayqXujEWzEz2kDJDYAJPdM45HVk W0275hCtFVZO8rKiqTZsrWjUSG/AtWtoTCoKDfObtdXTODaJUiBCA0/KRXjhlGDU 7F+FaODtzkwU6BQPCR1QNZMb0W8AKvKVc3DI7SurTZzIz/kid7Z7aTIn7tj8uzNp 8RIwdcnGpFaVAym+bpZOMV3cOQN9wLYLuZQFvFi0u8WsicwMNrOQq/HcoGjmHpZE 86cSh87Yy8nCBWGFM1BTpEwJbbgbi/BsGx49l2HzdOkxmCf0ZjFnvzaluRSVItTx iCPdyAQTHvqjV+WOzbPxIBfr11OF81D98UNEvwBW5X+EzOqFFpvZy+OXczj2LPAV x1FkdvcFmcdzoNCtlAFTdG7tw2FJBEHnqG5t9JBZx/d7VlTbaFAOx8AWUYiJDJyL jXRhFK+DRWIt3Umd0DEYvaz7ftN5WHOy3TnLJEeJyxv2Ir8obDnHItBM85DXJD1F 9A2tQ7qnBqu6MKuiAlPe/K64+KppmtiJq9TgAjY/f1cLc1VjXv+gHSI81FHmx0Eu COEg9Dyzi5TSkQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/06/root.crt000066400000000000000000000047141322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/07/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/07/end.crt000066400000000000000000000042601322470703100217030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGPDCCA/CgAwIBAgIIL/52TY28sFswQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTEwNTE0NTMzMVoXDTIx MTAxMDE0NTMzMVoweTEpMCcGA1UEAwwgU3dlZGlzaCBQYXNzcG9ydCBEb2N1bWVu dCBTaWduZXIxCzAJBgNVBAUTAjQ4MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3Mx GDAWBgNVBAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwZXpCxwAfncfl0VZqA2jOqtX40x4VprVY Di05wXD3CbRvRkYPLGz1BSjc2fV+1i/9f4jn8GmIUh9cxz/y3fk23MRtyswYn1AM mIxfek4xQOgtjGimTgqRWsnUAHteCF8aQbQhWsGL3ypjc0aPc0JtpFDgr2HLSLyf oPGp2Iu9QrY7VgwyrXA12QOy2adLW4t142+pNaBa5FpVLUwVDLfwNBIb1Fct9gyt 6gLR5d9Z/PtGuD9+SEteHqFfGut3jJDje+tADPj89xYGjazSTrR0tls6X3+Qtxo4 Zv1t35gMZ7kX8cF1S0+pT0EsU3NIksMbRTHtCbQEqHLjhrEEGFoJAgMBAAGjggGI MIIBhDAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFFpTLgf2tryo+sWpfP9NX93Y vDElMB8GA1UdIwQYMBaAFA4wULiS85liyEcZLpjk0/qoQxmsMCsGA1UdEAQkMCKA DzIwMTYwNzExMTQ1MzMxWoEPMjAxNjEwMDkxNDUzMzFaMBcGA1UdIAQQMA4wDAYK KoVwVGQJAQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2Vu LnNlL0NTQ0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3 ZTI3NjgxMjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+k EDAOMQwwCgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4 BgNVHRIEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2Vu LnNlL0NTQ0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqG SIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQBz7rarl87PB3s2p/7ZtzSj T8gjBWFtSVmE1p2ZTzfOCTnj0SvA3LGaTBc7dVPUqWzF0SUoqEdNSR8SuoVdTztO XqGLNEdIwlzWva3lsrPQN57xwUGDibkgyesOvu1rX6fWGzxVbytWYNd4fLhfAKuP q0MTEhnYoT5UBGiYhs04uds7eTMJgrYVbipxCTQMeCQIaAsJd/1tRLU0VNw1xVqc Q6ahIn7pTctKCAuIRvVlA1le2ZY2a8OUtecipOvB5uXYX23kJloeqatTdIkHp+yl lSjeD/EOB5Z/fsf+/0EqxPWXbMdi5wVaXPDaWTFgqoHy6u8/NGp2BOLOiAkjwwfl QZQmaTqojkQm6fbcelvtDWRFrwyuseVuXE3dJEXIjW9DDNwJ9wlroQSeZCCzvJKl 5JV2mneLBhVHYJ7zuaWe8kfnNRalDE2ZXiFmNLxhVRlNZYSe7FOXuqjQYrQRwvTx naFkMfDU50f1YS1oiW8QYI59qNaDIzWpLaDg4K6OxtDWXnA0I88bZOsdK8Spunrp IUmuPWKNNo8cKc+yPe/AQgwveNYqG5AfJ53eY4D/rSxxnrQy9lb5bLhLV+nc0Dgd EYs5hOI6MkfI5iWiol8B1KSU3rCkoZcb8LxN7DH++juRIiK//bBsJbV9++dNuW1e roo9RE/mjjWU4QpA831rHA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/07/root.crt000066400000000000000000000047141322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/08/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/08/end.crt000066400000000000000000000042501322470703100217030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGNjCCA+qgAwIBAgIIc3BzihYzDiowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTEwNTE0MzQ1MFoXDTIx MDcxOTE0MzQ1MFowczEjMCEGA1UEAwwaU3dlZGlzaCBSUCBEb2N1bWVudCBTaWdu ZXIxCzAJBgNVBAUTAjI2MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3MxGDAWBgNV BAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCdJplcoOXHyN1tbCHAhBj0UXgqp7ZHooP9KEVCI9SJ S32BEGfMbAxKwX1EcF9oiqAomQmGma/9u2GD/peYtb3tCyQhJZHjITOvO1EK1JzW 7ZoeRUi/gbnmjoL5sVCHI8nh7sWtA7kdZ4K1f4xyBZlvFSude6miNO9LU3Y9PdR2 8OiAd19fU79fEMnJBeVkkCrB4WtT3C2Cv8mjOETlpNZD1x8fGJ0jbWXpPhU0N1Cm lJMJPs6xQd8xVFW6zkqNu8Gcchlw1ieqD3GkUD6FUBYz93cPY5k+SanmvF7CfU5H FCs7lOf+mfkvJemu1zW7DiMoKpV8YDTWcON/Cw46YudxAgMBAAGjggGIMIIBhDAO BgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFIyWFgFJyJ9cMqz9TEU9vElp++C2MB8G A1UdIwQYMBaAFA4wULiS85liyEcZLpjk0/qoQxmsMCsGA1UdEAQkMCKADzIwMTYw NDE5MTQzNDUwWoEPMjAxNjA3MTgxNDM0NTBaMBcGA1UdIAQQMA4wDAYKKoVwVGQJ AQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3ZTI3Njgx MjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+kEDAOMQww CgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4BgNVHRIE MTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEB CDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQClOqhqx66A3ws2tcqo36OWIUb3L8tV p9EM7c25iFltZK9HXNksn+aCwxZhMEwdyh24LfOQJ1yjPslYkqujOgO3FSe/xz0O pY53G81VDnfwCtxvcCbxtcRa0pURB84LP5es72hZuDmgTGibslo1WWZ2v9M/kVsI VtTe+TElWyxnd/RjAWIyr3fLDkgqh/kKYj0SL5CAV04adzqNM1M5s1wj8TKY6rXj ZhSxMGFRKAbNiRS1RVDSCEhDw/MFxtYp2a3nQK0XqJ0q1kiKjga/6OBMu2k6o5ps J4Elh4lDNGcNvJiCD/4VB9eDYXS7pvoz3Wr0CIyLawzWDfwOWuRXbWy+XkXr1KqU 9DIOT6Mt7phc0XP9DfDAwppER3pOQIJ2Z8BfF62DRhll34jO9Tvds91jeAd4/bWG rdHqLZab60usfb+TVO0pWb2+Cr2iAdd51mUCSFvs+K3CuV3FSv8b4YN2Uvqlc/iB diZLtUYKxOsp0cSJC5JkgD0eMn//6hspeUz4CPF0gbWhlQE3KJUl21BIs2i6kpEW 8p/48xV7AeX6uXZmAsSt5vJyo3BtEN1Q4O1OaMHnE4gugN7o4MShoh1Z1qALbYQQ Askm0AwaM5AI8GTCzZvqj4FaDOKXADEi3aeSNw8HrjiA0OeyVMRDLIjFzKxiWU3i FoQMt3DImAKF1w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/08/root.crt000066400000000000000000000047141322470703100221250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/09/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/09/end.crt000066400000000000000000000042601322470703100217050ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGPDCCA/CgAwIBAgIIU9yG3gmH3P8wQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTEwNTE0NDUwN1oXDTIx MDIwMzE0NDUwN1oweTEpMCcGA1UEAwwgU3dlZGlzaCBQYXNzcG9ydCBEb2N1bWVu dCBTaWduZXIxCzAJBgNVBAUTAjQ1MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3Mx GDAWBgNVBAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCa5JAHUtE6SMTwjxRgJE3GmulrKniKGFDD ruaxS4tFKih8E2b88N/BZacXijDM58qBOs8jqhxlx9z5lyq0cXgpEYrG8liF/Ay1 h+rhxWIWveRPYyzM4Aq9qyyYQGE7DWL25b5J7CxFp1ZvwlYOs3fPS4yntAA+Gr76 1aXi7Y2osUQCgWzMVzXV2CVr1Ghdx+vN4JAw30BgEMO++MrEThvpxIzlO70j9X4z whrJcDZoLo72P0k37fIAzc1ktu3CXtT5iZEfOk1oBDNCsQG+i5vsi4IRvQsSwowL NKBB1LPGNhLMWK0LbTT5ux+/qYRlEGqmZ/321aJmdIbwfSzp8i3FAgMBAAGjggGI MIIBhDAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFJwB0Rlj8n5Yiq6MfvwfPmS3 KzSwMB8GA1UdIwQYMBaAFA4wULiS85liyEcZLpjk0/qoQxmsMCsGA1UdEAQkMCKA DzIwMTUxMTA1MTQ0NTA3WoEPMjAxNjAyMDMxNDQ1MDdaMBcGA1UdIAQQMA4wDAYK KoVwVGQJAQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2Vu LnNlL0NTQ0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3 ZTI3NjgxMjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+k EDAOMQwwCgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4 BgNVHRIEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2Vu LnNlL0NTQ0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqG SIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQBNfU0xaepFM+rlWvy3RSzs Dzg1lcjP4Pwf+Rya2gXin8p8YIv2De+/1OWUtKgP/gNNwPJqzT+Ea39l0YrwVV5u orTEwgopvFCKYTyl6hapX8aiG7L6zU7TXN2ON/AfxrEpZZLN8ielhUgsTjlb0O9t yzOqNSRMhaumjxpXmKy8MgvGshLhY/8lw5jbpNUVSPRBF2HY3JP/2pMw7mpC/4TF jHpDCbUBGlhFgVajIJsWfOduQ7+Rej0L700EKK3XgIXbL/reY8zItCoTu6nN6QZn M4U25zg445JPjYnedyKuRuE37xm//zjtwWGp7f/tJc2NpAcuGUWn8Z3b0NpWZJKJ Uw1PTFbyIcgEk+E+NvaVGLPpl+to31oq2m0T2/kTaoqKGYpuTOxEhlEQKX3TKBDi Rocs9jsx7EkUTA1adVtGGtmA9o20ume4AG86jPTLPiuoFxgi4Ks73kXl+UiXIXGM vMzi3K/lS6By5ntYtcR7HbAOe4UetsPinpOXJVj3uvmiQDreBah6m9ZcA8vQBlna oBPhgE4zFB4fsQABEkg1cM44PSnOCfiu1bEAAgaRCeOpbJOklCIDwJQkkOq6q+jO zrf38ODXbS5s4BDCWMMgZWHkPA/+eLivthpjwgEi6ZpWJTQ2pe51a5cFTlryRLDB r4F888zukDqM0xd81fetNg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/09/root.crt000066400000000000000000000047141322470703100221260ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/10/000077500000000000000000000000001322470703100204135ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/10/end.crt000066400000000000000000000042601322470703100216750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGPDCCA/CgAwIBAgIIJ970GrM5mAcwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTEwNTE0NTE0NFoXDTIx MDcxOTE0NTE0NFoweTEpMCcGA1UEAwwgU3dlZGlzaCBQYXNzcG9ydCBEb2N1bWVu dCBTaWduZXIxCzAJBgNVBAUTAjQ3MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3Mx GDAWBgNVBAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDxP34jqaF+cShyWXLDymvwC9sKkWSFlhQA wDEM5C8UN8mZtAPsBdQOgr7y4upOyjg39Y1J2k0uY0ljdXw09efZ4MTx51ceZZF9 mTEZlDefqzoLD40/IECnYD0KLayhp7JFyoJcBj4HN90URjYrHVagCQD07K63zPAo U1yoI2OBleAf5ouHLm9zim0rcqAHhH2Zt6qZdswcKRTnOX+AfsnLRYS4/TDraNV2 iCdocXFbnrIEQAoQJkT3LFClhTxruutQg28lcwrliWvdVDVK7/rbB/28FJOadpRm PMZJHDreVWRKVmBCXYcIfeMGQ7LabyE/fpJckRu0gYdMG9ghjOwLAgMBAAGjggGI MIIBhDAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFDbZOiQNFZT+Nyy6fHf5Li5z /dOSMB8GA1UdIwQYMBaAFA4wULiS85liyEcZLpjk0/qoQxmsMCsGA1UdEAQkMCKA DzIwMTYwNDE5MTQ1MTQ0WoEPMjAxNjA3MTgxNDUxNDRaMBcGA1UdIAQQMA4wDAYK KoVwVGQJAQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2Vu LnNlL0NTQ0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3 ZTI3NjgxMjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+k EDAOMQwwCgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4 BgNVHRIEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2Vu LnNlL0NTQ0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqG SIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQCifvZBxGhbsWVer+Ki6q/m LqzGDj4zD0LLWEmUfsBaSLbFHps2bpqv8+jtVkoRH+k/XdKEctmfibe5KAG9t0IO Fww5FdoRirSX0HaiN2B3MQTzkVzOmmUPZx+xtpU9Ivq8a9b3oYHLGSylXw6wM8iU jNWnpWyRwWRYMaDBdus0dZrVst0VnKZ0p8/P49RhRmx36QJhJZaBvue+/YQQPdJa Bp5N+jaLzZh9mVSG/sTwUIi0JjDCpx2ZtGf9jggvy8tBTlrywPd5PFZ3r00vI1W7 LgEZDJ5wKyaqN2UP47A+oIqF5yAwiLFrzojfOpAAFQp7RSQgaLSSw+R82yFWJkbK ElMe30ED6EsswkOqwC4+4ajo4nXZyxDmgFHCO67lcw7V4Pptyq3zGL0AZJWwhlbq DyLYGztUJHA/bmIUhZ+U/4TeFT3bbxpOVDeSqldoeBcbjcNDE8xF1aYmpDZX8K9H vdsNqh4OjTDuq0rkNPPUEimwwLfvaEAFh7ndm+CokyBCD4IyF48tvg3kvLBIUuUG 3Y7BLMZQgTYGyMkWJ6dnSO3MXM3HDGlDmX4Yql5e4ATsrdhGnXkurrotGW6USr4S l3ydOYrTIWLKTRnyvSicukIbtf+ZGs5AwoZEJ6IQyqAE4WOiPi9IcXX4IEHjTuk4 +QtoggW5ZANydMjfZsSo0Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/10/root.crt000066400000000000000000000047141322470703100221160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/100/000077500000000000000000000000001322470703100204735ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/100/end.crt000066400000000000000000000021271322470703100217550ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDBjCCAe6gAwIBAgIBSDANBgkqhkiG9w0BAQowADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTQwNjA1MTU1NjUzWhcNMjQwNjAyMTU1NjUzWjA0MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEA3RGKn5m6sGjKKuo7am1Zl+1OyVTkDe7OoH2gHqroDsK7 E0DbihKOiRMkpcX1+tj1kNfIysvF/pMdr9oSI3NSeUYauqBXK3YWMbOor+c4mwiL Y5k6CiXuRdIYWLq5kxrt1FiaYxs3/PcUCJ+FZUnzWTJt0eDobd5S7Wa0qQvaQJUC AwEAAaOBnzCBnDAJBgNVHRMEAjAAMB0GA1UdDgQWBBTu88f1HxWlTUeJwdMiY7Lf p869UTBjBgNVHSMEXDBagBS0WuSls97SUva51aaVD+s+vMf9/6E/pD0wOzELMAkG A1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBU ZXN0IENBggEAMAsGA1UdDwQEAwIFoDANBgkqhkiG9w0BAQowAAOCAQEAGUdim4uy /rBDFMF8qhjH1qsv0o8ON4HgP3YXbdKdIMfd+p5KtoqHQnrkixWxaIvfORnR4mGm f8H5BimwIkNLxy7zS88TVDOYel8g7B2yl0nq4biki83NStNBYZJjxKT0ud5O5mGd jHdy9vTEc7h8q+SHzRdgpNFXyKY5OQYng1LHco8h1UR8/nmPMuDtocHMnmMXu68a 69+TtZxx90/V4gJZOoL1iCi8HEsKoJzm/L8ji54OYt7FxgFfE3VmLsXeMaWYO8GS BUxh5kqZ25O8hQXK5ywfuVK83Do/SsoClbgx9mboybseGVFIJaxs9e66GFDMoI3B 09JqWv4DoLNnwg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/100/root.crt000066400000000000000000000024041322470703100221700ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/101/000077500000000000000000000000001322470703100204745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/101/end.crt000066400000000000000000000023101322470703100217500ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBFzA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCBKEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgSiBAICAOIwOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTczNloXDTI0MDExODEzNTczNlowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCBKEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgSiBAICAOIDggEBADJExjfWWvL28lgj+GGgviqo PHZLxI0pLQUnFJQ9Kpu6jxfICseBF00Z6BJE/RcYDpIie5GDt/8u/i6xB6Li29Pm g5nANgd/Y3fFnW7d0ydVjiSnetlPuf/jTlWQl6mQTH2xqYu8J8d3JRxQdRiDYbVm uywW2d6rksiqm6dPD5l4A5DcemcYo8f/1Ifj5WNDCV8/OHex+AnW2ccDvWAnVgSR B2VpOXJzVFuBsuf4tGVm/2TUMSB6NcvFc6TeJk1kzbZxii4QjKXtH1SfrVP59iEe l17NYAEWARjBpQWBiutRG+QM2et0sNiUBuWxTkvd0eSgencNysVAOsZqrqaX3CY= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/101/root.crt000066400000000000000000000024041322470703100221710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/102/000077500000000000000000000000001322470703100204755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/102/end.crt000066400000000000000000000023101322470703100217510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/102/root.crt000066400000000000000000000024041322470703100221720ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/103/000077500000000000000000000000001322470703100204765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/103/end.crt000066400000000000000000000023101322470703100217520ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGTA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAqEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAM4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc1OFoXDTI0MDExODEzNTc1OFowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAqEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgKiBAICAM4DggEBABf8Gyq2VYuN1EBW1nOapDQp B/KuafNW2GEJ7FmQKNyA7MIj1Yqo2MtJ6/OQojRQ3F5rnO4yjmvIPsXeQaMxJBiI aaoAlLpH++F+oXMq/0aS0WSZrSLrsh2Fpay9cBDGwek2rDOX9kM+ZcPzGitVwWKX TnOW22hpcl7u95CpZH+JZTcto5nL3tTyV9pIy+tSKQQfjPB+G0TAZCsOkbCGPLug qdjvqFQwOf15VxQMj7NRiXjlqJvsx+I7B2AIhrs4DzQMEyiWq9S/PzpQuFU5v/Kg s2iMLJ5ygv5aN3PYqGlE1ZmvgyRp5h/LaTGI2L6lzRTnecOhtPv30N2tyaDAEfo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/103/root.crt000066400000000000000000000024041322470703100221730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/104/000077500000000000000000000000001322470703100204775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/104/end.crt000066400000000000000000000023101322470703100217530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGjA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCA6Ea MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgOiBAICAL4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTgxMloXDTI0MDExODEzNTgxMlowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCA6EaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgOiBAICAL4DggEBACdVozFq6rUiXo+ib5Y2oPsR 6xxl4Ydn3LpUoYrPpTOrhcXJWW/tOLHGuCF/mSRfUzKaMIfL418cZHYnvumvuttu 6z3tp5E1VsiZCU2MWJnzjKSxFBOss43AmpJHHoapGFZu2pxObBPqegAKHYkKWOLk tJDj47PurWgEek9j1nL7Pc1tVf59fm/ySp4fWkXLLvQiKid1516VioLyacUvK3zU 6Egz8jMt7D5c9KpaExLRTANVsThqO5/dmR36bOwm3Hpbde7DNdgxru41tiLMqJs/ 5pX3ceaJ1XQ/l0idj5/9ipvqHHUguyk7H22HwQHQdSD9oIha8kEM3P6CjpfE7yY= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/104/root.crt000066400000000000000000000024041322470703100221740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/105/000077500000000000000000000000001322470703100205005ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/105/end.crt000066400000000000000000000021231322470703100217560ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDBTCCAeegAwIBAgIBFjATBgkqhkiG9w0BAQowBqIEAgIA6jA7MQswCQYDVQQG EwJOTDERMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3Qg Q0EwHhcNMTQwMTIwMTMzODE2WhcNMjQwMTE4MTMzODE2WjA0MQswCQYDVQQGEwJO TDERMA8GA1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkq hkiG9w0BAQEFAAOBjQAwgYkCgYEA3RGKn5m6sGjKKuo7am1Zl+1OyVTkDe7OoH2g HqroDsK7E0DbihKOiRMkpcX1+tj1kNfIysvF/pMdr9oSI3NSeUYauqBXK3YWMbOo r+c4mwiLY5k6CiXuRdIYWLq5kxrt1FiaYxs3/PcUCJ+FZUnzWTJt0eDobd5S7Wa0 qQvaQJUCAwEAAaOBkjCBjzAJBgNVHRMEAjAAMB0GA1UdDgQWBBTu88f1HxWlTUeJ wdMiY7Lfp869UTBjBgNVHSMEXDBagBS0WuSls97SUva51aaVD+s+vMf9/6E/pD0w OzELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xh clNTTCBUZXN0IENBggEAMBMGCSqGSIb3DQEBCjAGogQCAgDqA4IBAQDAog/jXydR vDIugTzBXtfVK0CEX8iyQ4cVzQmXWSne8204v943K5D2hktSBkjdQUdcnVvVgLR6 te50jV89ptN/NofX+fo9fhSRN9vGgQVWzOOFiO0zcThy749pirJu1Kq5OJdthIyW Pu0UCz5G0k3kTp0JPevGlsNc8S9Ak1tFuB0IPJjrbfODWHS2LDuO+dB6gpkNTdrj 88ogYtBsN4D5gsXBRUfobXokUwejBwLrD6XwyQx+0bMwSCxgHEhxvuUkx1vdlXGw JG3aF92u8mIxoKSAPaPdqy930mQvmpUWcN5Y1IMbtEGoQCKMYgosFcazJpJcjnX1 o4Hl/lqjwCEG -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/105/root.crt000066400000000000000000000024041322470703100221750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/106/000077500000000000000000000000001322470703100205015ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/106/end.crt000066400000000000000000000021221322470703100217560ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDBTCCAeegAwIBAgIBFjATBgkqhkiG9w0BAQowBqIEAgIA6jA7MQswCQYDVQQG EwJOTDERMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3Qg Q0EwHhcNMTQwMTIwMTMzODE2WhcNMjQwMTE4MTMzODE2WjA0MQswCQYDVQQGEwJO TDERMA8GA1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkq hkiG9w0BAQEFAAOBjQAwgYkCgYEA3RGKn5m6sGjKKuo7am1Zl+1OyVTkDe7OoH2g HqroDsK7E0DbihKOiRMkpcX1+tj1kNfIysvF/pMdr9oSI3NSeUYauqBXK3YWMbOo r+c4mwiLY5k6CiXuRdIYWLq5kxrt1FiaYxs3/PcUCJ+FZUnzWTJt0eDobd5S7Wa0 qQvaQJUCAwEAAaOBkjCBjzAJBgNVHRMEAjAAMB0GA1UdDgQWBBTu88f1HxWlTUeJ wdMiY7Lfp869UTBjBgNVHSMEXDBagBS0WuSls97SUva51aaVD+s+vMf9/6E/pD0w OzELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xh clNTTCBUZXN0IENBggEAMBMGCSqGSIb3DQEBCjAGogQCAgDqA4IBAQDAog/jXydR vDIugTzBXtfVK0CEX8iyQ4cVzQmXWSne8204v943K5D2hktSBkjdQUdcnVvVgLR6 te50jV89ptN/NofX+fo9fhSRN9vGgQVWzOOFiO0zcThy749pirJu1Kq5OJdthIyW Pu0UCz5G0k3kTp0JPevGlsNc8S9Ak1tFuB0IPJjrbfODWHS2LDuO+dB6gpkNTdrj 88ogYtBsN4D5gsXBRUfobXokUwejBwLrD6XwyQx+0bMwSCxgHEhxvuUkx1vdlXGw JG3aF92u8mIxoKSAPaPdqy930mQvmpUWcN5Y1IMbtEGoQCKMYgosFcazJpJcjnX1 o4Hl/lqjwCEG -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/106/root.crt000066400000000000000000000024041322470703100221760ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/107/000077500000000000000000000000001322470703100205025ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/107/end.crt000066400000000000000000000024751322470703100217720ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDsTCCAmmgAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBKDAUMRIwEAYDVQQDDAlsb2Nh bGhvc3QwIhgPMjAxMjAzMzAxMTQ2MjhaGA8yMDMwMDEwMTAwMDAwMFowFDESMBAG A1UEAwwJbG9jYWxob3N0MIIBUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQC AaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBKAOCAQ8AMIIBCgKCAQEA r+oAaTK0SFtKChcNyiS56Tm7NJgIgeHC5fZ4dOVz63GIBsP1tJ/wSsTZePeqSky/ DDeTj4tpyy6+Cdq04yji/ZKv4o4IVCdVW2Stf7Sf4cLQm8so7B35WZ3Dp0OPAGmn 2oviJ7S6EDRrqwdOciOSzd5siGCkPlPbOzp+7iGXXVc/BF+EDaw5Ge24OGhgSjE7 z/Q/U24y+g02C6ybqAqsXE7y7kgBgElHHNcuaciHFA7HnDEMU/4USIsJyA2p5WOO TwSyhi7MZ0VYZatcfESlj/ZB/u2YSHOsWzryYzT8Lct2szseR4ujiuNS3SGODVUZ 5HF2278L/hPbFiX89T9MkQIDAQABo3oweDAJBgNVHRMEAjAAMA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQUVIk5QUZ/Tn+Yvlpb+8akSFtSegAwPAYDVR0jBDUwM4AU VIk5QUZ/Tn+Yvlpb+8akSFtSegChGKQWMBQxEjAQBgNVBAMMCWxvY2FsaG9zdIIB ATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDAL BglghkgBZQMEAgGiAwIBKAOCAQEAqIcn0OB/2p3HcSVE0tvMn1JhsN4N05/XencZ /HsgZenxvE4LZ106XCbPvES224aSGZWt49Oidmk6A9E+26plUiiOHT0K1Ye0fXaY npPOyeXeEhhw9+DSL08V+vItwT0lN6rD/H1RrDuHGvw68A5ZDE34+PPgFPnpq2uA anUaLZXSI55Hq1qbWumCCJAJSlOwqOLjuwjF9nxtT008UOvhAkeJ/eLkRubNGTFC EMXCKURFxvTQtwlPG1MPfQeze8se1L40EnNRjXnJOJouu9kZApv3mKbKvEVGRoAA eK3G/hzEfON+dYfmhSi13OyNDB394aUU0xlBXj3EX2wBiCZ1lA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/108/000077500000000000000000000000001322470703100205035ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/108/crl-rsa-pss-sha1.crl000066400000000000000000000014341322470703100242070ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIICJDCCAQYCAQEwEwYJKoZIhvcNAQEKMAaiBAICAOowOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBFw0x NDAxMjAxMzQ2MzVaFw0yNDAxMTgxMzQ2MzVaMCgwEgIBChcNMTMwOTI0MTYyODM4 WjASAgEWFw0xNDAxMjAxMzQzMDVaoGcwZTBjBgNVHSMEXDBagBS0WuSls97SUva5 1aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NM MRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBggEAMBMGCSqGSIb3DQEBCjAGogQC AgDqA4IBAQB8ZBX0BEgRcx0lfk1ctELRu1AYoJ5BnsmQpq23Ca4YIP2yb2kTN1ZS 4fR4SgYcNctgo2JJiNiUkCu1ZnRUOJUy8UlEio0+aeumTNz6CbeJEDhr5NC3oiV0 MzvLn9rJVLPetOT9UrvvIy8iz5Pn1d8mu5rkt9BKQRq9NQx8riKnSIoTc91NLCMo mkCCB55DVbazODSWK19e6yQ0JS454RglOsqRtLJ/EDbi6lCsLXotFt3GEGMrob1O 7Qck1Z59boaHxGYFEVnx90+4M3/qikVtwZdcBjLEmfuwYvszFw8J2y6Xwmg/HtUa y6li0JzWNHtkKUlCv2+SESZbD3NU8GQZ -----END X509 CRL----- botan-2.4.0/src/tests/data/x509/pss_certs/108/end.crt000066400000000000000000000023101322470703100217570ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/108/root.crt000066400000000000000000000024041322470703100222000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/109/000077500000000000000000000000001322470703100205045ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/109/README.txt000066400000000000000000000000321322470703100221750ustar00rootroot00000000000000crl with invalid signaturebotan-2.4.0/src/tests/data/x509/pss_certs/109/crl-rsa-pss-sha1-badsign.crl000066400000000000000000000014341322470703100256150ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIICJDCCAQYCAQEwEwYJKoZIhvcNAQEKMAaiBAICAOowOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBFw0x NDAxMjAxMzQ2MzVaFw0yNDAxMTgxMzQ2MzVaMCgwEgIBChcNMTMwOTI0MTYyODM4 WjASAgEWFw0xNDAxMjAxMzQzMDVaoGcwZTBjBgNVHSMEXDBagBS0WuSls97SUva5 1aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NM MRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBggEAMBMGCSqGSIb3DQEBCjAGogQC AgDqA4IBAQB8ZBX0BEgRcx0lfk1ctELRu1AYoJ5BnsmQpq23Ca4YIP2yb2kTN1ZS 4fR4SgYcNctgo2JJiNiUkCu1ZnRUOJUy8UlEio0+aeumTNz6CbeJEDhr5NC3oiV0 MzvLn9rJVLPetOT9UrvvIy8iz5Pn1d8mu5rkt9BKQRq9NQx8riKnSIoTc91NLCMo mkCCB55DVbazODSWK19e6yQ0JS454RglOsqRtLJ/EDbi6lCsLXotFt3GEGMrob1O 7Qck1Z59boaHxGYFEVnx90+4M3/qikVtwZdcBjLEmfuwYvszFw8J2y6Xwmg/HtUa y6li0JzWNHtkKUlCv2+SESZbD3NU8GQY -----END X509 CRL----- botan-2.4.0/src/tests/data/x509/pss_certs/109/end.crt000066400000000000000000000023101322470703100217600ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/109/root.crt000066400000000000000000000024041322470703100222010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/11/000077500000000000000000000000001322470703100204145ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/11/end.crt000066400000000000000000000033711322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE+DCCAqygAwIBAgIESUK/qjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0xMTA3MDcxMzM0MDNaFw0xNjExMDcxNDA0MDNaMDcxCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEMMAoGA1UEAxMDRFMx MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvIxpMaAur885zUKXOqiy F45Iq75v30vZeBaJL6MyXGe2eEsgbxrVQBrw74ASIqJyGrWIj9SIchj59j6cglkT yYJSGS+z0ijrlwyQVVZQIDuPsHkz0dsPhEsRwkZE4raCDAKLQuWRqtUHKs2biMKQ OmNVo3YgvKgbzq0JkgJsbw+tcmZj+1Oa5xtPUJ5ELP4XdYYoHOiQMPtvLBdAyCmC aRkFKvOkxn3ANg5r12al3k9+aAJy+1AqG2PuiwZ4XTafsQz6SQ9PSt0v87EBvD6X 2wbfociRPo6A6y4qzbZ17lz8sUz4KgpBCAZJR63dxWrGGN2yj7S+uLC2yXXIu8gd VQIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDExMDcw NzEzMzQwM1qBDzIwMTExMTAxMTQwNDAzWjAZBgNVHSAEEjAQMA4GDGB8ZQGCGwgF AQIBATAfBgNVHSMEGDAWgBQtsW3hQwPYdcOHuaoVEAG1gRZPGDAdBgNVHQ4EFgQU LC3urhXOSPeVpGD8j1KrHiCN0UQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQME AgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQAj//9Y HXW41JlGel4YJw6V25RGAP0L8JD8K7hZVvPaq3IXCwJsBHH9YOaks93W1j9kYURH 3NT+N50Jy5pIEk6Wb68YqoCH+59Lf17je5GpC3rPJEfJ3aZvdc2NziIcdtsvDZGV GN5vd3HXkENXUm9yOVImu5VDiOo8EzfGIQwSTiyg6IDaRIjV/GzUc48+Xltrwvis Vl++Bn30qT5Ayytw0r6smI3TRKmmvRCKJbGhD/e/YfHqq6ooNJy/X5sPPm5K8lfP sDMMXKqu7++bYSlej5gF5NVr3kcfMV4YlO8Shd81rGUi6c6qqHWJQfKOV8CsfQbI N3Nv+amWxFvCDmnchC2e7VNkO1GBFMrF+mcOT+RG14EoWFGcNvr1stYOQRSlrGab S5jyQSa6gGJo0mLG7eMr4BC8Oa3G0OD+ZJo/927UB6as+2SUyq7W6B2cN587qXgq AlZRBjT/vyYhlq+WcL1dmmiuMdTK9E+X5+YlgvuoXeQ65ZYsTf8uhNJU4Kd5XSF2 NvSdJkCAsoQEjJ/i1D47dcD5YEpRPzmnY74Qw/jyZ0mjpXShv94ovkjlCXIdt2ny 8KIeO3By5QWEU93kdoNGwqf2lperZklWewhz960D9g+mdTJuQjdd4zsSj+fxc5kZ 4CohFXzUOZRW53LZAhiO3n/8kWThh/5Z/6CsQw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/11/root.crt000066400000000000000000000041221322470703100221100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIF+TCCA62gAwIBAgIESUK04zBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0wODEyMTIxODMwNTNaFw0xOTA0MTIxOTAwNTNaMD8xCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEUMBIGA1UEAxMLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC20yCfEODF wBEoS9ASPdRy7EBiVs/Z+XKDrNBG3SMInbcQnl3TTN6AOojRDa8rlyME+ypDgbLI dcXd2+KjIZR01henLenwGyVdZMoUUyMdtDwsXU7znDPBGWWO60GDc5BLOblHAxRc H3xi+NFs/2Fku6YXfCuyaMsMngSfkiDEL/cioAvwMTR9xlzLx6TdmFJJi/019H/t x0304pZN/lGCPZhjYlNKKk71st+/f9u5bu7KN7af81Oh4RmrH1SK70+YZ427yEtO fvPVOAaBlyefmQNipRK4G9ydA9b4/OiH+4m/pZharendskeu+2OFwYah/aqSbkEn D0VPbju2x3CyWB1jaOFgJbnXmO6peOoK1ylmw0JVOW1VyAHluWJ1cnDavGaSXQCV Vx4s1HKGAOK7XmAhNNFZ3+IosraODY/VlsKAcTolqYfw37rHwPpHnCDf4aJytZ/D Z4+9d3xlaws6ibtTwl2gCftGn3LO+UbzjAb8/uLGiqpGdkwNg5IOfSGSw+JGFgOA f8+jRXVDr1gh190UG2XEmuqrQRL8SVgUYHdqPDO25ld5dPQrZ2SZYYm3Vic2kY5G mcEYGxHCVT4VEZ9WJmPuh2H6vBKS8YG9Fq5mve66nr3OCSgnG95BvVRf4L4hoWcL zy/ST06wGYtgEe18MjdURmyTi9ngOJVerQIDAQABo4GUMIGRMBIGA1UdEwEB/wQI MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCsGA1UdEAQkMCKADzIwMDgxMjEyMTgz MDUzWoEPMjAxOTA0MTIxOTAwNTNaMB8GA1UdIwQYMBaAFC2xbeFDA9h1w4e5qhUQ AbWBFk8YMB0GA1UdDgQWBBQtsW3hQwPYdcOHuaoVEAG1gRZPGDBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggIBAJTZM0S8uNtK2kh+VLT8PTLO93YFvIhF6PgeyhT+LNoe4wfH jRXZjmH2tWanSB55OTV19mo5hGqgmno0kMX0LwNLPJZIF1gsOkaBj0FmkK0Ws2mu ZE7mErAGGbMD17ksxvOFUIrmfH62qhFfPNV0Ri9cm7ZlePtPYX2BIJlFIVutCMOh hStYRYTdEeG+L6sS4J7fB6uefpqTQk3BOWwS+h9xa2PDgaZs2ZpNreo8xt6eyMlL c3trMA0CmrQWNCSZt2a32sqUK1yWbzzXVC6ZuugpLg1Nyev6iaqWwBgO3MmyMZRk Djm2AN1gm8wriyYBqPfmgP6UIuU6f2rSXUvr9Dip4iyGSM0SvP7AzQmKIlXMWHKQ z+CoATKgvzcRPfPQ9FBT2wu4xJxa6Oju7c48ktQiSGsoqMkBTbaUrNqqTglXkJ/U lqiLNxbsP/iSOLXxaPR/lGqPp4IW2JXQpR0nqb/nCBuz/Ng484pwPwwuKlQr8yc8 uB1qrrKsfZd/F+twc2NxHqD41zT258AERqOXg7YRBvurqo975pdRlysXKBK5Ft78 lUrC5BTJij5eGR8IAuwI6CVFUIeikUiwcy44fU7UkJcPFaVp9CnlPuVRPdI6oQ0U +nXnpd8QABTCJPXfEe+4veo7jCj27wrKC5loUWIt/1sRJkURa6Mj013ohAk6 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/110/000077500000000000000000000000001322470703100204745ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/110/crl-rsa-pss-sha224.crl000066400000000000000000000016221322470703100243460ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgShGjAYBgkq hkiG9w0BAQgwCwYJYIZIAWUDBAIEogQCAgDiMDsxCzAJBgNVBAYTAk5MMREwDwYD VQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw MTM1NjA2WhcNMjQwMTE4MTM1NjA2WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB FhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r PrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG A1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG SAFlAwQCBKEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgSiBAICAOIDggEBAEJI i9sQOzMvvOTksN48+X+kk/wkLMKRGI222lqU6y6tP1LX3OE/+KN8gPXR+lCC+e0v TsRTJkpKEcmHZoP/8kOtZnLb9PdITKGMQnZ+dmn5MFEzZI/zyrYWuJTuK1Q83w0e Mc88cAhu8i4PTk/WnsWDphK1Q2YRupmmwWSUpp1Z2rpR+YSCedC01TVrtSUJUBw9 NSqKDhyWYJIbS6/bFaERswC8xlMRhyLHUvikjmAK36TbIdhTnEffHOPW75sEOEEB f0A3VtlZ7y5yt2/a6vOauJCivxKt/PutdHfBqH43QQmoVLWC2FmT9ADTJwcsZB3D a6JSqCIMRCQY2JOUn0A= -----END X509 CRL----- botan-2.4.0/src/tests/data/x509/pss_certs/110/end.crt000066400000000000000000000023101322470703100217500ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/110/root.crt000066400000000000000000000024041322470703100221710ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/111/000077500000000000000000000000001322470703100204755ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/111/crl-rsa-pss-sha256.crl000066400000000000000000000016221322470703100243540ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgGhGjAYBgkq hkiG9w0BAQgwCwYJYIZIAWUDBAIBogQCAgDeMDsxCzAJBgNVBAYTAk5MMREwDwYD VQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw MTM1NjE2WhcNMjQwMTE4MTM1NjE2WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB FhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r PrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG A1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG SAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAEZ4 oqp9i5eXrN6aCSTaU1j07MVTFW/U1jQAq6GseB6bEvoEXFMUHJsgAObqCK9flfEC FEqXqWSo33hhPU7AKKttbDLjUYRNnQAPRUnRIl1/a1+UjqgKchWWD9ityeW8ICxo IdATX9reYmPDLIMqTC7zuflYkvrvdEOuBORQP5mn4j8t84MSQF/p4qzaU0XxLo4X ckzZCcHpa45AApCDjJMd9onhFVCYsykiYrF9NQFO8TI4lQ5jv79GoufEzvhY1SPB r1xz4sMpfyaoPaa3SM2/nD65E5jzXell2u2VWNGKv4zAQP0E5yGel+1rklBltadb XLdJyyak33CLBKu+nJc= -----END X509 CRL----- botan-2.4.0/src/tests/data/x509/pss_certs/111/end.crt000066400000000000000000000023101322470703100217510ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/111/root.crt000066400000000000000000000024041322470703100221720ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/112/000077500000000000000000000000001322470703100204765ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/112/crl-rsa-pss-sha384.crl000066400000000000000000000016221322470703100243570ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgKhGjAYBgkq hkiG9w0BAQgwCwYJYIZIAWUDBAICogQCAgDOMDsxCzAJBgNVBAYTAk5MMREwDwYD VQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw MTM1NjI4WhcNMjQwMTE4MTM1NjI4WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB FhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r PrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG A1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG SAFlAwQCAqEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAM4DggEBAAco SntUGDLBOAu0IIZaVea5Nt1NMsMcppC0hWPuH1LKAwyUODBqpT+0+AuALK0eIdYR a7mAB+cv2fFwmwxnQWJ1Fvx4ft/N2AAfB83VRKpSo3xR8bxloHfTWKmyxJHmH9j1 EYmLS86rj3Nhjf4m/YlQQ3Im5HwOgSgBOE8glq5D+0Wmsi9LsNEZXEzMw7TMUgbs y9o/ghYF/shKU4mewK3DeM9gQiTcH5A4ISXR87hBQ08AKJRAG1CLvTyzqWiUUY+k q8iZDYF17sHrPi2yn8q9c4zdxiaWDGDdL0Lh90wXGTAageoGEq25TMuL5FpX+u1u KUH/xf1jEnNzbYNGiZw= -----END X509 CRL----- botan-2.4.0/src/tests/data/x509/pss_certs/112/end.crt000066400000000000000000000023101322470703100217520ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/112/root.crt000066400000000000000000000024041322470703100221730ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/113/000077500000000000000000000000001322470703100204775ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/113/crl-rsa-pss-sha512.crl000066400000000000000000000016221322470703100243510ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgOhGjAYBgkq hkiG9w0BAQgwCwYJYIZIAWUDBAIDogQCAgC+MDsxCzAJBgNVBAYTAk5MMREwDwYD VQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw MTM1NjM4WhcNMjQwMTE4MTM1NjM4WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB FhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r PrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG A1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG SAFlAwQCA6EaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgOiBAICAL4DggEBAB9F ywBfxOjetxNbCFhOYoPY2jvFCFVdlowMGuxEhX/LktqiBXqRc2r5naQSzuHqO8Iq 1zACtiDLri0CvgSHlravBNeY4c2wj//ueFE89tY5pK9E6vZp7cV+RfMx2YfGPAA2 t7tWZ2rJWzELg8cZ8hpjSwFH7JmgJzjE5gi2gADhBYO6Vv5S3SOgqNjiN1OM31AU p6GHK5Y1jurF5Zwzs+w3wXoXgpOxxwEC4eiS86c9kNSudwTLvDTU0bYEQE1cF+K0 sB8QWABFJfuO5kjD2w3rWgmAiOKsZoxd1xrda+WD3JhDXnoVq3oVBIVlWVz6YID8 enMfMvwScA5AImzu9xA= -----END X509 CRL----- botan-2.4.0/src/tests/data/x509/pss_certs/113/end.crt000066400000000000000000000023101322470703100217530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDWzCCAhKgAwIBAgIBGDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wOzELMAkGA1UEBhMCTkwx ETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBMB4X DTE0MDEyMDEzNTc0NVoXDTI0MDExODEzNTc0NVowNDELMAkGA1UEBhMCTkwxETAP BgNVBAoTCFBvbGFyU1NMMRIwEAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcN AQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7C uxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsI i2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCV AgMBAAGjgZIwgY8wCQYDVR0TBAIwADAdBgNVHQ4EFgQU7vPH9R8VpU1HicHTImOy 36fOvVEwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJ BgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wg VGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEaMBgGCSqG SIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAH0+knqkcLaxeDkenBQgd4Qg 3ZyAhtpiLU689mw+3cXB/uzFrCIxEL5aGh1eSj+DszB+FtsZ06ux7JVQqVOA2Wm9 yLxC6wF8OOYj0nBa91BWLhRAHLhmIdWsVk7Hl9KojZd4TwV2N+ZEV/BLxyoRvK4H V4xCpzgDSiTPe8Etk4r+0akbr6bsOUBayPb7MGLHubZKq8NsFAmmynp+fPmHd3SE 0ooJdiZ1MmKPKLE5Og/hXCI8qeiXQUR6oQ7b2XONsrI2HIj2SA9dA5qmHwE5PbMu zqxQ3R83boqLXbkFORn+UiYLmffqdoWuNy00BHMCrxRA9DUv+WyN4npLMF8rOJw= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/113/root.crt000066400000000000000000000024041322470703100221740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny 50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH /f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ 7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/114/000077500000000000000000000000001322470703100205005ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/114/server9.req.sha1.csr000066400000000000000000000012031322470703100242250ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBojCCAQYCAQAwNDELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRIw EAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0R ip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7CuxNA24oSjokTJKXF9frY9ZDX yMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsIi2OZOgol7kXSGFi6uZMa7dRY mmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCVAgMBAAGgKTAnBgkqhkiG9w0B CQ4xGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMBIGCSqGSIb3DQEBCjAFogMC AWoDgYEA2n8SOoiJCs+YyH2VXoUVxhutdXGP4+7cECakl2mmVEKhxXDMEG7hEFkB mkk4b1kRNOQHKqUq3crfi0OkMcPGkPiLlYLKgT51CgsBhuJaMsdCYo/5POgTZD4u FI5gfyO70Xpq9QmrWEqqTdalRG7+UmGa3VEUVyXTDnQZfU1N2QE= -----END CERTIFICATE REQUEST----- botan-2.4.0/src/tests/data/x509/pss_certs/115/000077500000000000000000000000001322470703100205015ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/115/server9.req.sha224.csr000066400000000000000000000012741322470703100244050ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBzTCCAQYCAQAwNDELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRIw EAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0R ip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7CuxNA24oSjokTJKXF9frY9ZDX yMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsIi2OZOgol7kXSGFi6uZMa7dRY mmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCVAgMBAAGgKTAnBgkqhkiG9w0B CQ4xGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMD0GCSqGSIb3DQEBCjAwoA0w CwYJYIZIAWUDBAIEoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCBKIDAgFiA4GB AMlYYZKqpDqg5UZZq3NB3QUR9qftY/52/0gPfruw5s2gNtFmG1uyEBJX/oc7C/fU lxo74HDraWJyvP7c3MMhOuwr/RfPNQhA2Hgwz9RuJIBhQrJfiZuHsCfiKVofMuMf ar/4EKfyoELDdilhg6i+abahGOkqyXsjavFtyDSeCpXH -----END CERTIFICATE REQUEST----- botan-2.4.0/src/tests/data/x509/pss_certs/116/000077500000000000000000000000001322470703100205025ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/116/server9.req.sha256.csr000066400000000000000000000012741322470703100244130ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBzTCCAQYCAQAwNDELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRIw EAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0R ip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7CuxNA24oSjokTJKXF9frY9ZDX yMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsIi2OZOgol7kXSGFi6uZMa7dRY mmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCVAgMBAAGgKTAnBgkqhkiG9w0B CQ4xGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMD0GCSqGSIb3DQEBCjAwoA0w CwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIDAgFeA4GB ACUaCTidvzWVJNKmRrriufThGUfw5Xgdsc3Ga8Cx+vRf+bPZmR3NVkc0Zq9uc0+8 d1WXaLzbmge6IbcvTPWCLNDAWI9UzoQ6WS9myM3eDEGdruClYwb5BVLx3MvhvooK L/H6snE1dHNPXyCNVFTJIll3bRlVMRsfZpDhmz8/ImJ4 -----END CERTIFICATE REQUEST----- botan-2.4.0/src/tests/data/x509/pss_certs/117/000077500000000000000000000000001322470703100205035ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/117/server9.req.sha384.csr000066400000000000000000000012741322470703100244160ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBzTCCAQYCAQAwNDELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRIw EAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0R ip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7CuxNA24oSjokTJKXF9frY9ZDX yMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsIi2OZOgol7kXSGFi6uZMa7dRY mmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCVAgMBAAGgKTAnBgkqhkiG9w0B CQ4xGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMD0GCSqGSIb3DQEBCjAwoA0w CwYJYIZIAWUDBAICoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIDAgFOA4GB ANfZGK6nE/CP9PuALFzbA/mvOnYlI60pMowscRfCYpvR25iQJVhAJfYVXADRN3qd NAiFWNVcjFMIkRlq7qifBN97VHGeYoWIuw9gYEb3OqDGzOsYP0KIgMNt8/A4qCkj 5MzolOYyT+N+QFGV0pdCNpX7QppfNdFyFAmWXa171RzG -----END CERTIFICATE REQUEST----- botan-2.4.0/src/tests/data/x509/pss_certs/118/000077500000000000000000000000001322470703100205045ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/118/server9.req.sha512.csr000066400000000000000000000012741322470703100244100ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIBzTCCAQYCAQAwNDELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NMMRIw EAYDVQQDEwlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0R ip+ZurBoyirqO2ptWZftTslU5A3uzqB9oB6q6A7CuxNA24oSjokTJKXF9frY9ZDX yMrLxf6THa/aEiNzUnlGGrqgVyt2FjGzqK/nOJsIi2OZOgol7kXSGFi6uZMa7dRY mmMbN/z3FAifhWVJ81kybdHg6G3eUu1mtKkL2kCVAgMBAAGgKTAnBgkqhkiG9w0B CQ4xGjAYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMD0GCSqGSIb3DQEBCjAwoA0w CwYJYIZIAWUDBAIDoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCA6IDAgE+A4GB ACxWBhPkhyVlBY/mwkrW7OjYsaN2/ZlFSv76w63b61BpigReJsggMut5EPOgfGYJ rzygKDlF/NtmMN22jWrFup9LsZJAX0gYbLmliiaG9Hch+i/8b42oaQTDWGFZ9LiY W7F7X0f9lpzNKOtQ8ix0s+nYS2ONyzfu55+Rlzf8/63M -----END CERTIFICATE REQUEST----- botan-2.4.0/src/tests/data/x509/pss_certs/12/000077500000000000000000000000001322470703100204155ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/12/end.crt000066400000000000000000000033711322470703100217010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE+DCCAqygAwIBAgIESUK+tDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0xMDA2MDMxNDUxMjhaFw0xNTEwMDMxNTIxMjhaMDcxCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEMMAoGA1UEAxMDRFMy MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7PTUuM+8ds3xrWb+V6DV y3/v+sK7Hq6AtljhtdloM76UsBDkW9Jszwdd8GxKnqjvQXXYf8jx9ryTSZXAqk3u omDfMWVkxbzoJFFMZ3/zvOxl3LjPuK9ZYMu14GFYFRYNOl3YB7eo7TE75PnBCJdV mwr3Qv/lg8cWvl6r19G7lDFtR3XemYMTc9yQiS49AAmJKQxSx9em1wUNoE4T+EUN fdQUiFde3YXQb2itmH+QSCVUF4/PAzE+aQfqVfIOLXuJAiFFX7Pa0ixAJdiWBRtL R3KHSARupK/75W2u8bZ2CjodVtYcDclafV5WzQvSaAP5ePpRvZUPmE7PrbDmLD25 MQIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDEwMDYw MzE0NTEyOFqBDzIwMTAwOTI4MTIyMTI4WjAZBgNVHSAEEjAQMA4GDGB8ZQGCGwgF AQIBATAfBgNVHSMEGDAWgBQtsW3hQwPYdcOHuaoVEAG1gRZPGDAdBgNVHQ4EFgQU 4EPM69b0eowXbNd0fhrgWQXEvxwwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQME AgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQBw4Uf7 l2j9lE5ElPytlF9xy9WksDdXwHMys0NS00wO83dhSKcr3y521wVJbxasymTvc9LD TuxZrfV9A9RaYRZSz47wuUR7dCn4ibFYeRGBWZrWfX7v9FnvkwzksPOokHeITXIu Qston9LmpebRlEI/syWqqw3zfkZ5YRf0EdAlb9Z8nbb9BBopkChcgUOuTYkvgwEA UDoYCcbQHBgGa4utCpbpigCPSspPdLEmBOn1Wmh1zsmBa1u6HiEgFE84ZKNi1T5u wCdkDeDLMSaC6FJARmfzHOkercFhQE/BCNupxlRZZa6PnkjUckX3Kczz7B9fcLo4 TWVmJc4/C1tNNKE5O8NQD5bHIc5oyIQBYvBmLIhqc88DCegSa3J1Qnmq7F6O8C1y SS7WTo/NpIVnzU4IcEDAC1TAp4/genjH3jywzA29Nk+eKqOgQOByZx0bLNJjXrB+ NrsUH6oWwHgXtIpCqfmvCnZIkjGdKss/mxljgrQcZloIY+k2u8tmc7ErVT8hKRor 8d49M1cSKk5NKVFU2yuuFQ7hd77uJ0b0cVV+6gtQ+AUN7obHXQ8BS7SJTiRd6IWR zffcyQsxMkuKX64lO7C4V/QWOQKwE95kY/g4vYh2qZ/i8xKz7jT3vBFEpWIYhRZc 2jh3mTmArC50Yi/0eAViLPh9q9LRk/uzPo6MfA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/12/root.crt000066400000000000000000000041221322470703100221110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIF+TCCA62gAwIBAgIESUK04zBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0wODEyMTIxODMwNTNaFw0xOTA0MTIxOTAwNTNaMD8xCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEUMBIGA1UEAxMLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC20yCfEODF wBEoS9ASPdRy7EBiVs/Z+XKDrNBG3SMInbcQnl3TTN6AOojRDa8rlyME+ypDgbLI dcXd2+KjIZR01henLenwGyVdZMoUUyMdtDwsXU7znDPBGWWO60GDc5BLOblHAxRc H3xi+NFs/2Fku6YXfCuyaMsMngSfkiDEL/cioAvwMTR9xlzLx6TdmFJJi/019H/t x0304pZN/lGCPZhjYlNKKk71st+/f9u5bu7KN7af81Oh4RmrH1SK70+YZ427yEtO fvPVOAaBlyefmQNipRK4G9ydA9b4/OiH+4m/pZharendskeu+2OFwYah/aqSbkEn D0VPbju2x3CyWB1jaOFgJbnXmO6peOoK1ylmw0JVOW1VyAHluWJ1cnDavGaSXQCV Vx4s1HKGAOK7XmAhNNFZ3+IosraODY/VlsKAcTolqYfw37rHwPpHnCDf4aJytZ/D Z4+9d3xlaws6ibtTwl2gCftGn3LO+UbzjAb8/uLGiqpGdkwNg5IOfSGSw+JGFgOA f8+jRXVDr1gh190UG2XEmuqrQRL8SVgUYHdqPDO25ld5dPQrZ2SZYYm3Vic2kY5G mcEYGxHCVT4VEZ9WJmPuh2H6vBKS8YG9Fq5mve66nr3OCSgnG95BvVRf4L4hoWcL zy/ST06wGYtgEe18MjdURmyTi9ngOJVerQIDAQABo4GUMIGRMBIGA1UdEwEB/wQI MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCsGA1UdEAQkMCKADzIwMDgxMjEyMTgz MDUzWoEPMjAxOTA0MTIxOTAwNTNaMB8GA1UdIwQYMBaAFC2xbeFDA9h1w4e5qhUQ AbWBFk8YMB0GA1UdDgQWBBQtsW3hQwPYdcOHuaoVEAG1gRZPGDBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggIBAJTZM0S8uNtK2kh+VLT8PTLO93YFvIhF6PgeyhT+LNoe4wfH jRXZjmH2tWanSB55OTV19mo5hGqgmno0kMX0LwNLPJZIF1gsOkaBj0FmkK0Ws2mu ZE7mErAGGbMD17ksxvOFUIrmfH62qhFfPNV0Ri9cm7ZlePtPYX2BIJlFIVutCMOh hStYRYTdEeG+L6sS4J7fB6uefpqTQk3BOWwS+h9xa2PDgaZs2ZpNreo8xt6eyMlL c3trMA0CmrQWNCSZt2a32sqUK1yWbzzXVC6ZuugpLg1Nyev6iaqWwBgO3MmyMZRk Djm2AN1gm8wriyYBqPfmgP6UIuU6f2rSXUvr9Dip4iyGSM0SvP7AzQmKIlXMWHKQ z+CoATKgvzcRPfPQ9FBT2wu4xJxa6Oju7c48ktQiSGsoqMkBTbaUrNqqTglXkJ/U lqiLNxbsP/iSOLXxaPR/lGqPp4IW2JXQpR0nqb/nCBuz/Ng484pwPwwuKlQr8yc8 uB1qrrKsfZd/F+twc2NxHqD41zT258AERqOXg7YRBvurqo975pdRlysXKBK5Ft78 lUrC5BTJij5eGR8IAuwI6CVFUIeikUiwcy44fU7UkJcPFaVp9CnlPuVRPdI6oQ0U +nXnpd8QABTCJPXfEe+4veo7jCj27wrKC5loUWIt/1sRJkURa6Mj013ohAk6 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/13/000077500000000000000000000000001322470703100204165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/13/end.crt000066400000000000000000000033711322470703100217020ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE+DCCAqygAwIBAgIESUK+LzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0xMDAxMTUxNTI1NDdaFw0xNTA1MTUxNTU1NDdaMDcxCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEMMAoGA1UEAxMDRFMy MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApK6tUOlvRSzNc5gHI5t5 v5nJGkhiSremqMvYIU3BRnoNVUMoDKmbAZuS6R3kZ0uXo5uE4MkLpAhYPR4qkIGr ejv4B7JgNYbhMLLTt/84SGkQvL1e1P2355eIjE85UX9ulnNLKXHDitDekAW/ciWy q+mPvttaxxxc3i7th7Hw6isYgE7PR5pvCzzy5wQfvKqepGATgbeN6x85iLACzmys YOLLYbqbfuA6WHAwlT9Dk8ZXfOKeFskfBTag70EBa2xdU68RS2/25y0oCKD0c1Eh 1W/jEckxAtfCNglufDOoAsHFXA0n8L43QZN8zBnqajOeQk+E16v/M+8MXkno5+l0 DwIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDEwMDEx NTE1MjU0N1qBDzIwMTAwNTEyMDk1NTQ3WjAZBgNVHSAEEjAQMA4GDGB8ZQGCGwgF AQIBATAfBgNVHSMEGDAWgBQtsW3hQwPYdcOHuaoVEAG1gRZPGDAdBgNVHQ4EFgQU rVnXlhrT4uOS0QtxMT2jHLPQxZQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQME AgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQBFa9wU CNU1aGlFtKW6/yTY2wHD+z4+FbrwSdlTor6BlXFPfbcFtR6/a9nQyoA7FeyykYA/ pfYg1hKRMzSatxSe/R5ezKY+B2Ic784OoeqnIFXE+CnA2CZ4I5u85fUAcBlz2vm/ XHHFhRPb43YPkTVFdaIzDjnKmyb6foss9w7OXEmfNAmMvdN8su99nkO/H79m/JAr tqOWduEafnN7sAd9ibSLf2hMsUmMFgOYbzkhKOYIhE2s5f++FyC8bZY1tx72BaNf 7dAfzHk/6zQg5zK65NeqI7btCMWZJ6cL8MeoY/WGujcC5G8iavZUP78VpOzJPqrV K6Wm8q9u2GKjJ2iipQeVPZGFdC0ItFSFQFGSQTuV3ygotHx9vtibpMbBRUrxyrPv rH5sNQbDOJd+6IkBKrIm7U6WaZ933KGTvajYcgJX5vQ8VZlJFrQLD62sYShX5kcz V1Ih093PSO39tWoy+/GZ/WpmakKM64MIBt6gQyTiNnNAJU4dmva5ecav697yrgl+ GS3qoPyNYMFy1/ijJFzBfbkHmcZQQcyy8zWImPF+KfGi+VkJ9r70Hi+q9sAqvvPT LtGX3buhToHTmyANOgwoIWK5ZNNfgHYRZ8U0PcOtKEZAQENTkdZrcFxgbtJ2G/1u Tolcoo7Bry2bftPqs3o8LTx/NCmbDVj/gqCNWA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/13/root.crt000066400000000000000000000041221322470703100221120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIF+TCCA62gAwIBAgIESUK04zBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0wODEyMTIxODMwNTNaFw0xOTA0MTIxOTAwNTNaMD8xCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEUMBIGA1UEAxMLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC20yCfEODF wBEoS9ASPdRy7EBiVs/Z+XKDrNBG3SMInbcQnl3TTN6AOojRDa8rlyME+ypDgbLI dcXd2+KjIZR01henLenwGyVdZMoUUyMdtDwsXU7znDPBGWWO60GDc5BLOblHAxRc H3xi+NFs/2Fku6YXfCuyaMsMngSfkiDEL/cioAvwMTR9xlzLx6TdmFJJi/019H/t x0304pZN/lGCPZhjYlNKKk71st+/f9u5bu7KN7af81Oh4RmrH1SK70+YZ427yEtO fvPVOAaBlyefmQNipRK4G9ydA9b4/OiH+4m/pZharendskeu+2OFwYah/aqSbkEn D0VPbju2x3CyWB1jaOFgJbnXmO6peOoK1ylmw0JVOW1VyAHluWJ1cnDavGaSXQCV Vx4s1HKGAOK7XmAhNNFZ3+IosraODY/VlsKAcTolqYfw37rHwPpHnCDf4aJytZ/D Z4+9d3xlaws6ibtTwl2gCftGn3LO+UbzjAb8/uLGiqpGdkwNg5IOfSGSw+JGFgOA f8+jRXVDr1gh190UG2XEmuqrQRL8SVgUYHdqPDO25ld5dPQrZ2SZYYm3Vic2kY5G mcEYGxHCVT4VEZ9WJmPuh2H6vBKS8YG9Fq5mve66nr3OCSgnG95BvVRf4L4hoWcL zy/ST06wGYtgEe18MjdURmyTi9ngOJVerQIDAQABo4GUMIGRMBIGA1UdEwEB/wQI MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCsGA1UdEAQkMCKADzIwMDgxMjEyMTgz MDUzWoEPMjAxOTA0MTIxOTAwNTNaMB8GA1UdIwQYMBaAFC2xbeFDA9h1w4e5qhUQ AbWBFk8YMB0GA1UdDgQWBBQtsW3hQwPYdcOHuaoVEAG1gRZPGDBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggIBAJTZM0S8uNtK2kh+VLT8PTLO93YFvIhF6PgeyhT+LNoe4wfH jRXZjmH2tWanSB55OTV19mo5hGqgmno0kMX0LwNLPJZIF1gsOkaBj0FmkK0Ws2mu ZE7mErAGGbMD17ksxvOFUIrmfH62qhFfPNV0Ri9cm7ZlePtPYX2BIJlFIVutCMOh hStYRYTdEeG+L6sS4J7fB6uefpqTQk3BOWwS+h9xa2PDgaZs2ZpNreo8xt6eyMlL c3trMA0CmrQWNCSZt2a32sqUK1yWbzzXVC6ZuugpLg1Nyev6iaqWwBgO3MmyMZRk Djm2AN1gm8wriyYBqPfmgP6UIuU6f2rSXUvr9Dip4iyGSM0SvP7AzQmKIlXMWHKQ z+CoATKgvzcRPfPQ9FBT2wu4xJxa6Oju7c48ktQiSGsoqMkBTbaUrNqqTglXkJ/U lqiLNxbsP/iSOLXxaPR/lGqPp4IW2JXQpR0nqb/nCBuz/Ng484pwPwwuKlQr8yc8 uB1qrrKsfZd/F+twc2NxHqD41zT258AERqOXg7YRBvurqo975pdRlysXKBK5Ft78 lUrC5BTJij5eGR8IAuwI6CVFUIeikUiwcy44fU7UkJcPFaVp9CnlPuVRPdI6oQ0U +nXnpd8QABTCJPXfEe+4veo7jCj27wrKC5loUWIt/1sRJkURa6Mj013ohAk6 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/14/000077500000000000000000000000001322470703100204175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/14/end.crt000066400000000000000000000033711322470703100217030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE+DCCAqygAwIBAgIESUK+0DBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0xMDA3MTUxMzU4MzhaFw0xNTExMTUxNDI4MzhaMDcxCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEMMAoGA1UEAxMDRFMx MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwHRoTSoz69zq5AN+cV2l YQt3004e0MSUdObS7D9h9/rIgHsSm0BJd3y8lTpOUwWG8W3rbaHDa2ZmBo+NskVo no8WUacuBqkhibd+g3hG8NVRclTFZUK2oHerVGRgUHuYBpE7pBDANPRUenYiO7AW beyITrf4WpfhoDSXC7b0RoEObuLGkhN+KQU+rBIjd8HvQf5mjQJPNjj1L2IceIwd pbLwtlpPVebQuCRVmF6H6WZhawnXOjQBNUP1B/1kLlg4XwQceXh3mY7X47J+dv0G ND2eWm9PHsqoAnCtf+QTbOQpbqOFiyzRw3aUfnaaXIwXHlc7ZYm8sWGcg0xDCWzR gQIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDEwMDcx NTEzNTgzOFqBDzIwMTAxMTA5MTIyODM4WjAZBgNVHSAEEjAQMA4GDGB8ZQGCGwgF AQIBATAfBgNVHSMEGDAWgBQtsW3hQwPYdcOHuaoVEAG1gRZPGDAdBgNVHQ4EFgQU IhprWMoJ0i9wpMLpe1a5Uq7mvjcwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQME AgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQAt047C llnvDbaGYGWlAhrixFw22wJjcZDIt3p7PPq0C1cCrE9yausuD/ltrdNK3ysX1b84 evhRyC6WZdYDNeCepCDTp5GqzDEk73bjKHsQlY9VmTY3m7HjzFVBIrnZAlGMl0MN LFDgShzDHNX2vlxL/qTz/zyIGAfvOvAFdog3Q/onGRYvu7CabSEKHb8jxrwCO++T tlWg4GCCx03rgKzruEUl2oybdFhbP6PEYXidvXOUUEkMlJ8dFjmJ9d3nBCPrMbPd 3eCTOTRTLA+VhVYlXLuhzi4ZzhmK86IVLRaVHva0BDos1tkp2uwWLzZRy0+CPE3J Cga0yLpcSrztGV+yzS4vRQXsHhvWH5hMxHUX3bmDpAEYY+uhvx4AYkjvpk3LzaQ8 SuEDQgI+aAfvAFgW+wAwFmcDgQdXQOGdFZ16fmreD8V9nI9VwpmtK1muSSD6zc8w QW7lVIedSX2OG9Ml4aUa/NGDtwTgfZ6xnPaqSkrr8EHUsGGbw9U6pSQCSLQf6zfW f4XZG6qjys04kJL+qilPZTrlliToByLbWrQOII/46qJvqsoy9XFEDvgxFNjvqDVV j6V6n6IbzyMJFkTj6i4PH6Mt+Olr8AYPzbM5FoXwl0db+7kAvY6WnASkfVTwb2tM Na0Ngjf4IIKDoR3zVxC62H/Qg+AhSC9RgtAP0w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/14/root.crt000066400000000000000000000041221322470703100221130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIF+TCCA62gAwIBAgIESUK04zBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0wODEyMTIxODMwNTNaFw0xOTA0MTIxOTAwNTNaMD8xCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEUMBIGA1UEAxMLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC20yCfEODF wBEoS9ASPdRy7EBiVs/Z+XKDrNBG3SMInbcQnl3TTN6AOojRDa8rlyME+ypDgbLI dcXd2+KjIZR01henLenwGyVdZMoUUyMdtDwsXU7znDPBGWWO60GDc5BLOblHAxRc H3xi+NFs/2Fku6YXfCuyaMsMngSfkiDEL/cioAvwMTR9xlzLx6TdmFJJi/019H/t x0304pZN/lGCPZhjYlNKKk71st+/f9u5bu7KN7af81Oh4RmrH1SK70+YZ427yEtO fvPVOAaBlyefmQNipRK4G9ydA9b4/OiH+4m/pZharendskeu+2OFwYah/aqSbkEn D0VPbju2x3CyWB1jaOFgJbnXmO6peOoK1ylmw0JVOW1VyAHluWJ1cnDavGaSXQCV Vx4s1HKGAOK7XmAhNNFZ3+IosraODY/VlsKAcTolqYfw37rHwPpHnCDf4aJytZ/D Z4+9d3xlaws6ibtTwl2gCftGn3LO+UbzjAb8/uLGiqpGdkwNg5IOfSGSw+JGFgOA f8+jRXVDr1gh190UG2XEmuqrQRL8SVgUYHdqPDO25ld5dPQrZ2SZYYm3Vic2kY5G mcEYGxHCVT4VEZ9WJmPuh2H6vBKS8YG9Fq5mve66nr3OCSgnG95BvVRf4L4hoWcL zy/ST06wGYtgEe18MjdURmyTi9ngOJVerQIDAQABo4GUMIGRMBIGA1UdEwEB/wQI MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCsGA1UdEAQkMCKADzIwMDgxMjEyMTgz MDUzWoEPMjAxOTA0MTIxOTAwNTNaMB8GA1UdIwQYMBaAFC2xbeFDA9h1w4e5qhUQ AbWBFk8YMB0GA1UdDgQWBBQtsW3hQwPYdcOHuaoVEAG1gRZPGDBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggIBAJTZM0S8uNtK2kh+VLT8PTLO93YFvIhF6PgeyhT+LNoe4wfH jRXZjmH2tWanSB55OTV19mo5hGqgmno0kMX0LwNLPJZIF1gsOkaBj0FmkK0Ws2mu ZE7mErAGGbMD17ksxvOFUIrmfH62qhFfPNV0Ri9cm7ZlePtPYX2BIJlFIVutCMOh hStYRYTdEeG+L6sS4J7fB6uefpqTQk3BOWwS+h9xa2PDgaZs2ZpNreo8xt6eyMlL c3trMA0CmrQWNCSZt2a32sqUK1yWbzzXVC6ZuugpLg1Nyev6iaqWwBgO3MmyMZRk Djm2AN1gm8wriyYBqPfmgP6UIuU6f2rSXUvr9Dip4iyGSM0SvP7AzQmKIlXMWHKQ z+CoATKgvzcRPfPQ9FBT2wu4xJxa6Oju7c48ktQiSGsoqMkBTbaUrNqqTglXkJ/U lqiLNxbsP/iSOLXxaPR/lGqPp4IW2JXQpR0nqb/nCBuz/Ng484pwPwwuKlQr8yc8 uB1qrrKsfZd/F+twc2NxHqD41zT258AERqOXg7YRBvurqo975pdRlysXKBK5Ft78 lUrC5BTJij5eGR8IAuwI6CVFUIeikUiwcy44fU7UkJcPFaVp9CnlPuVRPdI6oQ0U +nXnpd8QABTCJPXfEe+4veo7jCj27wrKC5loUWIt/1sRJkURa6Mj013ohAk6 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/15/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/15/end.crt000066400000000000000000000033711322470703100217040ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE+DCCAqygAwIBAgIESUK/PTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0xMTAxMDUxNTAwMTdaFw0xNjA1MDUxNTMwMTdaMDcxCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEMMAoGA1UEAxMDRFMx MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAprT1DhfNRT8wsx0SSOuD Qixn10BKXGvAIMhNmkpc9tK7T41ofhPuFhxpu6HRDwhOpGRNw5xdz9Ptb9WtiQRh Nv9BU+e/hI2y0rZ7kY/Bk7nREGoX+Wbc6xv8i0abB+fxrAWFCGTSNzb/nC6qNgcS T9/XdNhp8eDbYZuRr4xpkhUaUNp7b7Ze2jok6p7jpTGWUV34w2a3RAGpSenQOOtF duoZsvAYbG1EX5SWWxPTtwq/zR3Qh/d1pUv/MvVyk+n6HuYeMxney6UnBjQ34iRA /aS2xXXeT99CNGY6b8h3vZnAtpnhu916yZ1gbc4M0UirEwaEdjZr0QqChANGF8en uwIDAQABo4GbMIGYMA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDExMDEw NTE1MDAxN1qBDzIwMTEwNTAyMTAzMDE3WjAZBgNVHSAEEjAQMA4GDGB8ZQGCGwgF AQIBATAfBgNVHSMEGDAWgBQtsW3hQwPYdcOHuaoVEAG1gRZPGDAdBgNVHQ4EFgQU cj9eZoMLUhmSkAjv3GYWBuLur4QwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQME AgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQCSJzgS FZUmdgX895IOklhNjzmqZgP6o+bJdJrlVyENDXpjy7gH5MznGru4K+0Cd45fO7JV yV/7PUkm7yjRkCA5byyTRPnvQ3ltPyVYosIK2UaBLy+VYHL+IhqZZxagzUbHJzOW BFalW/BB0rxXJvDdv/E8T/W1lXjIE+0aaB6gviP7/JbbFaNcmC5k5/p+v+CsVtP3 twt/iVsyOyrGJwqJJHNpa5b8SlahgNVrdjDLETbo6gQbxIfoteWhHd5Om8ifuiCp RZcTHfN0Oz0vR3VMe6t/PB2uNvdR3rlVgmS2FSk5wc18CohK5PoS8DbZJE8BrXXa 5jAXCzeMs0Pu34djoDd6qfGAZ/OjlQTyd788agKw5L3T1xxaXf4Dnw2yi7ocSUAg 4+Da139jvWYNCxrSITspY59ofjpAe42/YVxFHBYVOjrxHQ4/O8XXpssH3fFkHaUh 8ClRAYXmlyuGfr35V7SwFfllKCbzBdyFz0xG8T9OkHOHLNFLYMzULfwGuzcVlcWB afRfDPi/1CwamyvYDNvr/U+zmJ8ziaWhzkJFcKqGVxLBM8dOrGcVrzIWGK7AorBF /ekAET0ZItgwk6LkoHdy9vwVsTuSFdgyQ//BE4JrbwqKInJ8Euc9wtlzTXNvwkIg CMZPslf5xbLTauUqyZ9lXkIxO3fHtCoAHUb0sw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/15/root.crt000066400000000000000000000041221322470703100221140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIF+TCCA62gAwIBAgIESUK04zBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCY2ExCzAJBgNVBAoTAmdjMQ0wCwYDVQQLEwRwcHRjMRQwEgYDVQQDEwtjc2Nh LWNhbmFkYTAeFw0wODEyMTIxODMwNTNaFw0xOTA0MTIxOTAwNTNaMD8xCzAJBgNV BAYTAmNhMQswCQYDVQQKEwJnYzENMAsGA1UECxMEcHB0YzEUMBIGA1UEAxMLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC20yCfEODF wBEoS9ASPdRy7EBiVs/Z+XKDrNBG3SMInbcQnl3TTN6AOojRDa8rlyME+ypDgbLI dcXd2+KjIZR01henLenwGyVdZMoUUyMdtDwsXU7znDPBGWWO60GDc5BLOblHAxRc H3xi+NFs/2Fku6YXfCuyaMsMngSfkiDEL/cioAvwMTR9xlzLx6TdmFJJi/019H/t x0304pZN/lGCPZhjYlNKKk71st+/f9u5bu7KN7af81Oh4RmrH1SK70+YZ427yEtO fvPVOAaBlyefmQNipRK4G9ydA9b4/OiH+4m/pZharendskeu+2OFwYah/aqSbkEn D0VPbju2x3CyWB1jaOFgJbnXmO6peOoK1ylmw0JVOW1VyAHluWJ1cnDavGaSXQCV Vx4s1HKGAOK7XmAhNNFZ3+IosraODY/VlsKAcTolqYfw37rHwPpHnCDf4aJytZ/D Z4+9d3xlaws6ibtTwl2gCftGn3LO+UbzjAb8/uLGiqpGdkwNg5IOfSGSw+JGFgOA f8+jRXVDr1gh190UG2XEmuqrQRL8SVgUYHdqPDO25ld5dPQrZ2SZYYm3Vic2kY5G mcEYGxHCVT4VEZ9WJmPuh2H6vBKS8YG9Fq5mve66nr3OCSgnG95BvVRf4L4hoWcL zy/ST06wGYtgEe18MjdURmyTi9ngOJVerQIDAQABo4GUMIGRMBIGA1UdEwEB/wQI MAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCsGA1UdEAQkMCKADzIwMDgxMjEyMTgz MDUzWoEPMjAxOTA0MTIxOTAwNTNaMB8GA1UdIwQYMBaAFC2xbeFDA9h1w4e5qhUQ AbWBFk8YMB0GA1UdDgQWBBQtsW3hQwPYdcOHuaoVEAG1gRZPGDBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggIBAJTZM0S8uNtK2kh+VLT8PTLO93YFvIhF6PgeyhT+LNoe4wfH jRXZjmH2tWanSB55OTV19mo5hGqgmno0kMX0LwNLPJZIF1gsOkaBj0FmkK0Ws2mu ZE7mErAGGbMD17ksxvOFUIrmfH62qhFfPNV0Ri9cm7ZlePtPYX2BIJlFIVutCMOh hStYRYTdEeG+L6sS4J7fB6uefpqTQk3BOWwS+h9xa2PDgaZs2ZpNreo8xt6eyMlL c3trMA0CmrQWNCSZt2a32sqUK1yWbzzXVC6ZuugpLg1Nyev6iaqWwBgO3MmyMZRk Djm2AN1gm8wriyYBqPfmgP6UIuU6f2rSXUvr9Dip4iyGSM0SvP7AzQmKIlXMWHKQ z+CoATKgvzcRPfPQ9FBT2wu4xJxa6Oju7c48ktQiSGsoqMkBTbaUrNqqTglXkJ/U lqiLNxbsP/iSOLXxaPR/lGqPp4IW2JXQpR0nqb/nCBuz/Ng484pwPwwuKlQr8yc8 uB1qrrKsfZd/F+twc2NxHqD41zT258AERqOXg7YRBvurqo975pdRlysXKBK5Ft78 lUrC5BTJij5eGR8IAuwI6CVFUIeikUiwcy44fU7UkJcPFaVp9CnlPuVRPdI6oQ0U +nXnpd8QABTCJPXfEe+4veo7jCj27wrKC5loUWIt/1sRJkURa6Mj013ohAk6 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/16/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/16/end.crt000066400000000000000000000037351322470703100217110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBHzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMTAwNjA0MTYwMDAxWhcNMjEw NjA0MTYwMDAxWjByMSgwJgYDVQQDEx9Ib25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQg U2lnbmVyMRgwFgYDVQQKEw9Ib25nIEtvbmcgQ2hpbmExHzAdBgNVBAsTFkltbWln cmF0aW9uIERlcGFydG1lbnQxCzAJBgNVBAYTAkNOMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAn4OsVb2eHwBTDIz4ZMRpUTzLt7yikScqjRm50NbPCWek xCqSqIEJfQE4ys+xT8VoDgIDUE51DxkYjUxq66Pf2HH+MflORuV7OTilhQV3kAHM KktFheYumTni5GcawZTc2GyBQ3KfUMMkn7Y8k18ER/S7QlDpHl6enMWqf4pXGIr1 COw6lqTw8TIRs8/YGpp+oQ3f3Hg5ZeKRDQcivmmythW1LHmJC7HABCn6D3Q8lhHM 94XYtlejmscWdajPxQWJHlRr5i8xyqzp/av6h7RN7Iprm7t+nhHZlrJ5Px/zoEUr eHAy8T/hqaSmF5r0bBcytfQY8WHCEh4iU+3kLzB8mQIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBQ7m+1s4nN3BMJqJvm3TOl0sPNNrKGBjqSBizCBiDE+MDwGA1UEAxM1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdy YXRpb24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ06CAQEwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQCBZdgeXx+HC1NXk6hoU5MIplzyicm7lo4aubVA g7c4v0KEaZs9H7ZTNOXPGrLC2Qym+EgXGAj6FJlM1HOCMidgV652V5fBBc4tTb96 sjufVmpYLN0qWQ086T3ULpfR9MX7YKaNbYw9QkBEu+A/7hrMoxdsl3D+ZQ2j2Pf2 aqv/tYSQscF4wHui0yC+m4UZvd1baQa/2Szwxpg220JGsEDJf2ptqgLHMUwsFjU7 5hDdxVZUJwfO+VooCs7xAVkIDq2vLjCj9HVckoNZ6GDu3o37Z4ZUYJgzN0K1CsAw ADJRKXHz9w41xfqNLDJdXOkIBOYyH4OxzDhll1ojf2nOtP5wqcrcgh1P4NbVQ/zz /FY0yfinS94KYPjd+j8I/V1sDb9rQreK9LF6OKtLTNKadmXu0XqWBSI0audZNdYQ d5ekziKVWrICePuTtN6MBaZGxYEjN682732+aosPPJZPm1PFRQOQY8qHlsbEmaTl Rve6a++6TQdLnoboiNQ+RIOm5Wwl2GUxAhXRPjyAzT1D0fHd/ICtyOm4TKgbz879 RHarjQFsYrHSyfa3Rt0G1sYAYDDjd2UX0hk6tnQYnZMkZ5mpnmLQmsoSamuxGgVt x/jQjuIfUCnbsXkOPGj1AG+9l0dN9XRdoNxSnqVQ5pukMIs2dG38vPBuMHnWSVit 1lztYQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/16/root.crt000066400000000000000000000042401322470703100221160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDYxMjA0MTYwMDAxWhcNMjIx MjA0MTYwMDAxWjCBiDE+MDwGA1UEAxM1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxGDAWBgNVBAoTD0hvbmcgS29u ZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRpb24gRGVwYXJ0bWVudDELMAkGA1UE BhMCQ04wggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCQXKBG8WK3H2t6 j8+PtWdh6JbpqbS3Bv+BqZ7VngFoUX+iDJlIjAWPuhmUPBLGVQgIk5sGGjrbfixQ lqLqGK1p27ncsmsd3f1wtXyQlQJbkGzmw/vxb9fX5D3wSWAUggZfK6Eexz47DAls mrDuY/Cr882eVgrniAIiOXmWqRqV3WUTi0EU6jFNBOKteS0jtohy4c/p2A933w/V OrIJPse7uZSn232/sTsiRAPWoJiGEozJqakFR65K/OcobBcCcefGcV9vw60OKb9B ra8yd1IBoZDyK7DXfPIKst1ZI+RZJvVPAhNWG3PxXfztE5D71Ga3UjvPcI2VQ7th pilXMkn3PB74m9pPhwTXI5qB8r67xGvvMlCZKNV7hBSmAYNH1AvhgLSxHJp2D1wo Pgf3dShZdHlu6IO01sLTmE5rkhb5t5KuljgxKd+oATr6d5GTqCWH90EfvHZiowRv 6BfjFKwevyJODrD9UctuC6vL1Kh6bF3ZuLUhWO2EpiRw9es9XPgHZ5CW2xGNb2u/ x3gVed8vaSEukyjMktaZ7HwzKTJk5QquxmGZj+HiI/xzAGQUwvk/GaHQqFfBmOXi USSr9KnWy6bdojHLC0dESIcJYFqLQbldH9aJZszrwtexsrVHUotPNTsVgMYaxejr Uzxfcd49wBLcD0UiNnIcAyAtNtn8RwIBA6NFMEMwHQYDVR0OBBYEFDub7Wzic3cE wmom+bdM6XSw802sMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAOv7wU3MNJQv41vW16l9zkoT+Y2FomVJNcNLKw m45B/GPcYDA5B4NCDoqjzl8087oIatrchsTlVFdd59mWO/11YmeUFn4HbpnSQq5n bVgdKABfLJtjwGPxA22cA5+Q9rpZmziQ9PtgZkhF+oldQgQeht4NG72O2sfN2DLN SdqfFKx0dzYQJdqca1uDnk0fxQWakuezDXLEI96QDsoM7bFOkQr961yQCW4pZKLr XOqwXblmdO2FUS7470AnbVrFb8zNdxZc12x648D5oxNY70ZidoeOzgbdwbOWYhBt 7SEU8KZfIJzxkhgMHqlkkBfIqc9aU3XiZ1MAGs5KJtUUoql1DN8v+VZCRknnOYhq 7Vo/U6Ukzb0gPDSlcn1xvHYqwa/SPKT2uB1lHHT/Qz1rHCR3oRMAd3H5OTqVM82A duvM9dokzAeQYX25e7yU6S6XlBH06a+VHx1jLCoo8bMwlLbleW88Ye49GG7mWdSg O5AHCUeyr3893VchN+8E4syalN5arZiCiiTt/mqot8trHp2lhNjfT3vxSmytXtzr JNo3E8LVmHZMAYTvaNyY2Kl8DnQzQlKBTnWPWvjdp4BC18jwKEfJJoqfKpFUCJBh bZ8+tCznz9pYyvNMPxx8tQV0ELr3KJAOrjBEDd4TLZ+orqRxOZ4HqcXVTYo6zDAq K1JDmg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/17/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/17/end.crt000066400000000000000000000037351322470703100217120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBCTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDcwOTA0MTYwMDAxWhcNMTgw OTA0MTYwMDAxWjByMSgwJgYDVQQDEx9Ib25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQg U2lnbmVyMRgwFgYDVQQKEw9Ib25nIEtvbmcgQ2hpbmExHzAdBgNVBAsTFkltbWln cmF0aW9uIERlcGFydG1lbnQxCzAJBgNVBAYTAkNOMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAkcH3Yh5rFdZbrc4dC3xaksMIPn0HeovTbWu2SpYj/LEE Qg75ROIKFQJaB6UqJMQXoeMgLvLyMpH/PzwksFe0AHl9AfrfxIa8ejcakTsF1KT7 tROZZZrEEPE/dg8/nJC5It+qJFDbKqBCnGvp2KN3rayo264bvyLhVn4WSgx32Tlm 0C2In8ZweoArD77AVdJUgqNgAj7XQ9wvrFqvd88QPqpeBs+tDhC5TN4qZPEp0dAQ seZtM120g2XMe1hKi+EHcKiBWFoIVX9+cNlGD93dZyiIiwQC1sDT/g2RyylWLVsw l9vz5CLBNCi8Cl9pyRNDghffcKzdzXgTuewrh3TFYwIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBQ7m+1s4nN3BMJqJvm3TOl0sPNNrKGBjqSBizCBiDE+MDwGA1UEAxM1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdy YXRpb24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ06CAQEwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQBF/ZoxgTPT+32Hz15aPIH4+OlXTuNbOJ/YAaCM muewznFV5ldRklgZaUOnmOjLj/FH8u5MnzTBSXfCfF7aVk6wGUWKN+2pHQkbXFMd qbVH9UNnxW5e7AzotyGfToEYVq24DeJ1mL6Db6UkjkiLa672GQjIzn3NVykqsMi0 uEPLitHYPxrPVvRRgZWMBP7kKs/jwJi0trDRgHuiIkN2FT5qWMsCu3NKuYdR7Jzg qxSlx+uLxeBLJXmG7qs+6qfseTDFoy4sScUzKpjsJnx4+7vAP1r+a9ekF4nFvVc+ l2Qky7TKC43Z5PH5nB2zoLAA2qyOSQ1fdkKuWOqEI/cooLERcTqaxwBLV2smTQd4 Gz5aySUxhRNgrio0NGJvtwJVIKBN6TwQZw305Hz77uXjWxF3TklvM8Xpd4DH6d+U /ZQYGB377RWjP1U4JrBvCEwN2tH4gU7WE2kGznNUH/dzV7p5giK5ewFDexlMIqhr dSvzQngs6mPMdih7+3bb0Pkv+fsvutIQ32E/Qg/gSwEeXUb63WhH3Y15zia4xceC CTIY2W3tXr9tKkDyUvQxXs5XQbcAE9cMpje99Nz7slRTkjYU29uDUnCZ0S9j2zM9 DxxOB/nCpJQZUloLB5XFsvy2mbnBOrnYTmto1ECQVHMuLmEf279OUz/aLO3nNp7U cLUhpw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/17/root.crt000066400000000000000000000042401322470703100221170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDYxMjA0MTYwMDAxWhcNMjIx MjA0MTYwMDAxWjCBiDE+MDwGA1UEAxM1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxGDAWBgNVBAoTD0hvbmcgS29u ZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRpb24gRGVwYXJ0bWVudDELMAkGA1UE BhMCQ04wggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCQXKBG8WK3H2t6 j8+PtWdh6JbpqbS3Bv+BqZ7VngFoUX+iDJlIjAWPuhmUPBLGVQgIk5sGGjrbfixQ lqLqGK1p27ncsmsd3f1wtXyQlQJbkGzmw/vxb9fX5D3wSWAUggZfK6Eexz47DAls mrDuY/Cr882eVgrniAIiOXmWqRqV3WUTi0EU6jFNBOKteS0jtohy4c/p2A933w/V OrIJPse7uZSn232/sTsiRAPWoJiGEozJqakFR65K/OcobBcCcefGcV9vw60OKb9B ra8yd1IBoZDyK7DXfPIKst1ZI+RZJvVPAhNWG3PxXfztE5D71Ga3UjvPcI2VQ7th pilXMkn3PB74m9pPhwTXI5qB8r67xGvvMlCZKNV7hBSmAYNH1AvhgLSxHJp2D1wo Pgf3dShZdHlu6IO01sLTmE5rkhb5t5KuljgxKd+oATr6d5GTqCWH90EfvHZiowRv 6BfjFKwevyJODrD9UctuC6vL1Kh6bF3ZuLUhWO2EpiRw9es9XPgHZ5CW2xGNb2u/ x3gVed8vaSEukyjMktaZ7HwzKTJk5QquxmGZj+HiI/xzAGQUwvk/GaHQqFfBmOXi USSr9KnWy6bdojHLC0dESIcJYFqLQbldH9aJZszrwtexsrVHUotPNTsVgMYaxejr Uzxfcd49wBLcD0UiNnIcAyAtNtn8RwIBA6NFMEMwHQYDVR0OBBYEFDub7Wzic3cE wmom+bdM6XSw802sMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAOv7wU3MNJQv41vW16l9zkoT+Y2FomVJNcNLKw m45B/GPcYDA5B4NCDoqjzl8087oIatrchsTlVFdd59mWO/11YmeUFn4HbpnSQq5n bVgdKABfLJtjwGPxA22cA5+Q9rpZmziQ9PtgZkhF+oldQgQeht4NG72O2sfN2DLN SdqfFKx0dzYQJdqca1uDnk0fxQWakuezDXLEI96QDsoM7bFOkQr961yQCW4pZKLr XOqwXblmdO2FUS7470AnbVrFb8zNdxZc12x648D5oxNY70ZidoeOzgbdwbOWYhBt 7SEU8KZfIJzxkhgMHqlkkBfIqc9aU3XiZ1MAGs5KJtUUoql1DN8v+VZCRknnOYhq 7Vo/U6Ukzb0gPDSlcn1xvHYqwa/SPKT2uB1lHHT/Qz1rHCR3oRMAd3H5OTqVM82A duvM9dokzAeQYX25e7yU6S6XlBH06a+VHx1jLCoo8bMwlLbleW88Ye49GG7mWdSg O5AHCUeyr3893VchN+8E4syalN5arZiCiiTt/mqot8trHp2lhNjfT3vxSmytXtzr JNo3E8LVmHZMAYTvaNyY2Kl8DnQzQlKBTnWPWvjdp4BC18jwKEfJJoqfKpFUCJBh bZ8+tCznz9pYyvNMPxx8tQV0ELr3KJAOrjBEDd4TLZ+orqRxOZ4HqcXVTYo6zDAq K1JDmg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/18/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/18/end.crt000066400000000000000000000037351322470703100217130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBHTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMTAwMzA0MTYwMDAxWhcNMjEw MzA0MTYwMDAxWjByMSgwJgYDVQQDEx9Ib25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQg U2lnbmVyMRgwFgYDVQQKEw9Ib25nIEtvbmcgQ2hpbmExHzAdBgNVBAsTFkltbWln cmF0aW9uIERlcGFydG1lbnQxCzAJBgNVBAYTAkNOMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAlYPWw9j43pOzz4ZxENiqIvZ3C73X3p8QD6IAIguz0dgr E4RMQNs/NLG5hoUFELy2Ilwkem22jcpSWaU7aPkZO7/FkAIClsbIvZCgApBSzCBR k1ccfVWjuqVXjvYoowZ4sO/HpOT2rBAC0fStTdpP6ovOz9rK8ZbRTIqviYIwtw1G XDs9zddpr/uwCMjlT2BiZwLynHuKPkHoq0ubOLEPuo5SRi2O1zRrZYjEiTUFXj0E lYP5ArWO8G+XPP1S4mlTLQmLd0ozuCGjpWMBXA4KFf+D6RhiJd8ppqW+fUCBKKen JVA74xvCYM+ubFSbxGOuPklhQOfQOKPAUvBlmo0QbQIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBQ7m+1s4nN3BMJqJvm3TOl0sPNNrKGBjqSBizCBiDE+MDwGA1UEAxM1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdy YXRpb24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ06CAQEwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAf8o356mAelJCkoWtEbj0gZ76ot/SDBJAa6r9u 2eI9WzCZZ3B9UBscnuCJwe56ndDvzAyCE9BvsnBXa1+2gthmQmWX5ig+RPjsLkbV RiO2vuUg0an2TbaMCHPtnH8XBMRv8RxCgtqLMKpebLoJR8Ss2PW1Uw+ySzbGTYky WUZyDmw1jx9cfqzkB6oSE9X5VO5WyWPZCe+8q2zcx6xf8rZm/O4oX4mz64pGn29d ofq6FaIBgq+bacyGuqhbnz7JLm6nGWH3Z4PeXAid6EtlxXuEbZjjRiBplFqSQui7 U46A79P2CBg4GgAAIw2IBLumv7zgqEctvLYF6/pGtJwaxRo5CpIcZXcydlEvrcvO sxv8FsHPVc10GmyIKItCJ9W8FJ8Wgzvnpr5C3VONxpR8jyOP1k7hCmVZ30+Zgf7y 3RDlviy+sAAQB7/dWqvL35BJ7SFklxm7R4qPlCtJMbdsSx1cmb11YJZC9rUGlgFA iFoDck9qSiZyo6MzncO4glKX7qsy3vlFX/DmNJCWOu37N5XZppZD4Gs5e1GLrpKu B7avLfAszPvveeIb2h3FEQbHjIAnN1MHBgsTarVOrqfHEpdQRpYthd0a/mIfnT78 89CCS8dWzfZ8GvWxl2QSO16ldnCQvWQB03nbYG93+qSGDzIJo/CEhqliBOvLEZrA 6FeIjw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/18/root.crt000066400000000000000000000042401322470703100221200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDYxMjA0MTYwMDAxWhcNMjIx MjA0MTYwMDAxWjCBiDE+MDwGA1UEAxM1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxGDAWBgNVBAoTD0hvbmcgS29u ZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRpb24gRGVwYXJ0bWVudDELMAkGA1UE BhMCQ04wggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCQXKBG8WK3H2t6 j8+PtWdh6JbpqbS3Bv+BqZ7VngFoUX+iDJlIjAWPuhmUPBLGVQgIk5sGGjrbfixQ lqLqGK1p27ncsmsd3f1wtXyQlQJbkGzmw/vxb9fX5D3wSWAUggZfK6Eexz47DAls mrDuY/Cr882eVgrniAIiOXmWqRqV3WUTi0EU6jFNBOKteS0jtohy4c/p2A933w/V OrIJPse7uZSn232/sTsiRAPWoJiGEozJqakFR65K/OcobBcCcefGcV9vw60OKb9B ra8yd1IBoZDyK7DXfPIKst1ZI+RZJvVPAhNWG3PxXfztE5D71Ga3UjvPcI2VQ7th pilXMkn3PB74m9pPhwTXI5qB8r67xGvvMlCZKNV7hBSmAYNH1AvhgLSxHJp2D1wo Pgf3dShZdHlu6IO01sLTmE5rkhb5t5KuljgxKd+oATr6d5GTqCWH90EfvHZiowRv 6BfjFKwevyJODrD9UctuC6vL1Kh6bF3ZuLUhWO2EpiRw9es9XPgHZ5CW2xGNb2u/ x3gVed8vaSEukyjMktaZ7HwzKTJk5QquxmGZj+HiI/xzAGQUwvk/GaHQqFfBmOXi USSr9KnWy6bdojHLC0dESIcJYFqLQbldH9aJZszrwtexsrVHUotPNTsVgMYaxejr Uzxfcd49wBLcD0UiNnIcAyAtNtn8RwIBA6NFMEMwHQYDVR0OBBYEFDub7Wzic3cE wmom+bdM6XSw802sMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAOv7wU3MNJQv41vW16l9zkoT+Y2FomVJNcNLKw m45B/GPcYDA5B4NCDoqjzl8087oIatrchsTlVFdd59mWO/11YmeUFn4HbpnSQq5n bVgdKABfLJtjwGPxA22cA5+Q9rpZmziQ9PtgZkhF+oldQgQeht4NG72O2sfN2DLN SdqfFKx0dzYQJdqca1uDnk0fxQWakuezDXLEI96QDsoM7bFOkQr961yQCW4pZKLr XOqwXblmdO2FUS7470AnbVrFb8zNdxZc12x648D5oxNY70ZidoeOzgbdwbOWYhBt 7SEU8KZfIJzxkhgMHqlkkBfIqc9aU3XiZ1MAGs5KJtUUoql1DN8v+VZCRknnOYhq 7Vo/U6Ukzb0gPDSlcn1xvHYqwa/SPKT2uB1lHHT/Qz1rHCR3oRMAd3H5OTqVM82A duvM9dokzAeQYX25e7yU6S6XlBH06a+VHx1jLCoo8bMwlLbleW88Ye49GG7mWdSg O5AHCUeyr3893VchN+8E4syalN5arZiCiiTt/mqot8trHp2lhNjfT3vxSmytXtzr JNo3E8LVmHZMAYTvaNyY2Kl8DnQzQlKBTnWPWvjdp4BC18jwKEfJJoqfKpFUCJBh bZ8+tCznz9pYyvNMPxx8tQV0ELr3KJAOrjBEDd4TLZ+orqRxOZ4HqcXVTYo6zDAq K1JDmg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/19/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/19/end.crt000066400000000000000000000037351322470703100217140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBDzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDgwNjA0MTYwMDAxWhcNMTkw NjA0MTYwMDAxWjByMSgwJgYDVQQDEx9Ib25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQg U2lnbmVyMRgwFgYDVQQKEw9Ib25nIEtvbmcgQ2hpbmExHzAdBgNVBAsTFkltbWln cmF0aW9uIERlcGFydG1lbnQxCzAJBgNVBAYTAkNOMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAkCmytswqKhRuvUQQzRTVccucsU0KzBo2mdd4UWXwNx+d RlboJLtEJ9CJWN26L8Mn14RXqOOXhlkKG+ZrhxyeQvCjHHTgd9VN4HKomq/lMV9u PHh0Q/rvHQPyoVHooxR131+xHoIUPZbcQzwIk+mYGwUPZLe9Hz1Hmz3S/6cPpth0 09TksJdUFNHlfUmsLg17rGN/lEEJoe6/Rehf13Hg9O6VM+f7L4jxaY0RVmbFYya2 hnAKa7t6o+L600UdzZItaFzyZQiAgwoIFTpFuoZdXK+mql6EOWQviS3o9kAkUBVC qe9eANQEDSStPMaz7tHynhq/h+OrPCNCHS5BeokBDQIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBQ7m+1s4nN3BMJqJvm3TOl0sPNNrKGBjqSBizCBiDE+MDwGA1UEAxM1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdy YXRpb24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ06CAQEwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQA+3UzAfBFeVL9/a6JK68t9MVn06U0Tw87q9T4s LRcn6+mD4avoA0SS2mMhQrC7uY4aMBdMKZuD+xdcoUIJ39yW2UEIbYRiGue5zveH l8Lah4ozeFnSQHiNcTDijQPAXB1m+gJcDgzwL0weqUq3ngeB3yt8hkLrb/JXMHeq mNFJ7hl4wQUVxX6BxCcRZS0DPdwi5wHvVAqjtEALAV715suw6kCc45rFCsa3MaU1 12zOkqEoIro2doMVOuqxxU43kWmFur2aX/5WmuosE/KoWUgPxhNle0JvzRaHh5Y3 BKqS9K9BCg3EPWo6/eIZ5bLQMKJ8yRvRvU1sa4wkJ/6cqUuSCD8UK8lB2HXkAEPT ZERVMUNzK0fLBUW/pJfL0KpW847lnCznvwgUjzUrpCkAMpSKBSqp/tPHPsPTdDjW /8dFjjJyu6kSBf5lcRCZDNOmpL0kc2iXr9t2PizHv3UZQRyx1NG9YWSMHdMgBh4X 3ydw10u5wEjBEezDAtqRhIa/+WnPZ9KyKy2ijPrG5qEWIZ99NxXxmjBAZFKdknfw DJkrwiQo5IcWtMU7ZLJ7tZiOk/4jtrndomK+Y0pj4jhnKnZifWmwPWx70T9e1ju6 b2jqXPQNGy97UlVfQ/GeVp4knR21I60vrSdeqQ/4NsTTz9o3Su4hskyX4INN7una 4Q+HqQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/19/root.crt000066400000000000000000000042401322470703100221210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDYxMjA0MTYwMDAxWhcNMjIx MjA0MTYwMDAxWjCBiDE+MDwGA1UEAxM1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxGDAWBgNVBAoTD0hvbmcgS29u ZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRpb24gRGVwYXJ0bWVudDELMAkGA1UE BhMCQ04wggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCQXKBG8WK3H2t6 j8+PtWdh6JbpqbS3Bv+BqZ7VngFoUX+iDJlIjAWPuhmUPBLGVQgIk5sGGjrbfixQ lqLqGK1p27ncsmsd3f1wtXyQlQJbkGzmw/vxb9fX5D3wSWAUggZfK6Eexz47DAls mrDuY/Cr882eVgrniAIiOXmWqRqV3WUTi0EU6jFNBOKteS0jtohy4c/p2A933w/V OrIJPse7uZSn232/sTsiRAPWoJiGEozJqakFR65K/OcobBcCcefGcV9vw60OKb9B ra8yd1IBoZDyK7DXfPIKst1ZI+RZJvVPAhNWG3PxXfztE5D71Ga3UjvPcI2VQ7th pilXMkn3PB74m9pPhwTXI5qB8r67xGvvMlCZKNV7hBSmAYNH1AvhgLSxHJp2D1wo Pgf3dShZdHlu6IO01sLTmE5rkhb5t5KuljgxKd+oATr6d5GTqCWH90EfvHZiowRv 6BfjFKwevyJODrD9UctuC6vL1Kh6bF3ZuLUhWO2EpiRw9es9XPgHZ5CW2xGNb2u/ x3gVed8vaSEukyjMktaZ7HwzKTJk5QquxmGZj+HiI/xzAGQUwvk/GaHQqFfBmOXi USSr9KnWy6bdojHLC0dESIcJYFqLQbldH9aJZszrwtexsrVHUotPNTsVgMYaxejr Uzxfcd49wBLcD0UiNnIcAyAtNtn8RwIBA6NFMEMwHQYDVR0OBBYEFDub7Wzic3cE wmom+bdM6XSw802sMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAOv7wU3MNJQv41vW16l9zkoT+Y2FomVJNcNLKw m45B/GPcYDA5B4NCDoqjzl8087oIatrchsTlVFdd59mWO/11YmeUFn4HbpnSQq5n bVgdKABfLJtjwGPxA22cA5+Q9rpZmziQ9PtgZkhF+oldQgQeht4NG72O2sfN2DLN SdqfFKx0dzYQJdqca1uDnk0fxQWakuezDXLEI96QDsoM7bFOkQr961yQCW4pZKLr XOqwXblmdO2FUS7470AnbVrFb8zNdxZc12x648D5oxNY70ZidoeOzgbdwbOWYhBt 7SEU8KZfIJzxkhgMHqlkkBfIqc9aU3XiZ1MAGs5KJtUUoql1DN8v+VZCRknnOYhq 7Vo/U6Ukzb0gPDSlcn1xvHYqwa/SPKT2uB1lHHT/Qz1rHCR3oRMAd3H5OTqVM82A duvM9dokzAeQYX25e7yU6S6XlBH06a+VHx1jLCoo8bMwlLbleW88Ye49GG7mWdSg O5AHCUeyr3893VchN+8E4syalN5arZiCiiTt/mqot8trHp2lhNjfT3vxSmytXtzr JNo3E8LVmHZMAYTvaNyY2Kl8DnQzQlKBTnWPWvjdp4BC18jwKEfJJoqfKpFUCJBh bZ8+tCznz9pYyvNMPxx8tQV0ELr3KJAOrjBEDd4TLZ+orqRxOZ4HqcXVTYo6zDAq K1JDmg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/20/000077500000000000000000000000001322470703100204145ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/20/end.crt000066400000000000000000000037351322470703100217040ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBJTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMTEwMzA0MTYwMDAxWhcNMjIw MzA0MTYwMDAxWjByMSgwJgYDVQQDEx9Ib25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQg U2lnbmVyMRgwFgYDVQQKEw9Ib25nIEtvbmcgQ2hpbmExHzAdBgNVBAsTFkltbWln cmF0aW9uIERlcGFydG1lbnQxCzAJBgNVBAYTAkNOMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAohHRG1r7ZaQrSmmh4IAxap8Jv0qZfg73Xc9ArCWdTsJq y0tkF4aVW7HM+OmJ+c+4+YB+/2EE7zwshBo+Owl7tYKvdL0D/fWNyuUU6bee5z0R VheEp5dAHTe89WIHeVl4QdJHM9FCXpjUpJp9HMD+bQZpv3ip+Etf7Noi+5Ckp+jy 4mhFS33X9F0e+6+cUdYlj6yLD7RQz7M8nYIF5V0kjb7gPPUnqGFDS2HvvF8CtY6U 3aLubL+11ruIAVkLONYq8UApytAJTCZAXLFUMN/CXKD981K7BCPQ6C7zlRJa/WJC BlJcqcQJ0jRWqsTz0729971cIxsXUvrHnt4my9tY3wIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBQ7m+1s4nN3BMJqJvm3TOl0sPNNrKGBjqSBizCBiDE+MDwGA1UEAxM1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdy YXRpb24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ06CAQEwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAT+F0g9a9PI0Y1AxtQulRG3YOZlC+vhUXhhtar rZps/GFaCityPuIexlmTr2UTxBZOqVef8kp9/DO/entokCh1461uyyV3xTa+ji8+ VH0TMtizAjNwniFA9//Ll+c+z0IoTk+zTbUYBRaD8Niu3OuSl32NwcW3x7x57CTx m+2wUKrvcybFRqsdKDKCpJdiFqFCSyNJmy0K+74Q3tAgYJ6+LhmItkiwxBa+uvd4 MVoW7T7igYXCs/Ln2kxCYwHHyhLZBbtMAoiN/YgAIGy7jcYvY1gBV5fNtCa9g+im kh0ZXBwVpE3sfTCka0iwC82QVwyLtF83k27E98XyLKUITKZP9d+nH1I6dZwxX232 C8vVmvm9ViUc8LQ+Y4JAJPpSy6PXAwfU/z/61jHIwbR5Z1PG+Zn3zdKeqkFngob5 HKCBF69LaJWBdre3HaP5gEpD97K0DjQ5XGOqsaTDd6RBCVVSIzZRPlizlEo3mGMC Wm+NY3sOpJdrSsDZ39PvzD+7mdCsmcHE7GRsHYDoUcfwgwbqBNew3oT6efrh11oq TLPIDKcEozWc2sGnTwygKZmvYyUKIUOKEom5bK2k/4UdltVb0/Mr0vewxLQCZY6+ PT61toY7stF+ug4LTH/SxbsPMeX8vxPIxfU1GNPCOLyNP9IlHYK4atXp9GPXsu4Q 2QLI1g== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/20/root.crt000066400000000000000000000042401322470703100221110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDE+MDwGA1UEAxM1SG9u ZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxGDAWBgNVBAoTD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRp b24gRGVwYXJ0bWVudDELMAkGA1UEBhMCQ04wHhcNMDYxMjA0MTYwMDAxWhcNMjIx MjA0MTYwMDAxWjCBiDE+MDwGA1UEAxM1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxGDAWBgNVBAoTD0hvbmcgS29u ZyBDaGluYTEfMB0GA1UECxMWSW1taWdyYXRpb24gRGVwYXJ0bWVudDELMAkGA1UE BhMCQ04wggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCQXKBG8WK3H2t6 j8+PtWdh6JbpqbS3Bv+BqZ7VngFoUX+iDJlIjAWPuhmUPBLGVQgIk5sGGjrbfixQ lqLqGK1p27ncsmsd3f1wtXyQlQJbkGzmw/vxb9fX5D3wSWAUggZfK6Eexz47DAls mrDuY/Cr882eVgrniAIiOXmWqRqV3WUTi0EU6jFNBOKteS0jtohy4c/p2A933w/V OrIJPse7uZSn232/sTsiRAPWoJiGEozJqakFR65K/OcobBcCcefGcV9vw60OKb9B ra8yd1IBoZDyK7DXfPIKst1ZI+RZJvVPAhNWG3PxXfztE5D71Ga3UjvPcI2VQ7th pilXMkn3PB74m9pPhwTXI5qB8r67xGvvMlCZKNV7hBSmAYNH1AvhgLSxHJp2D1wo Pgf3dShZdHlu6IO01sLTmE5rkhb5t5KuljgxKd+oATr6d5GTqCWH90EfvHZiowRv 6BfjFKwevyJODrD9UctuC6vL1Kh6bF3ZuLUhWO2EpiRw9es9XPgHZ5CW2xGNb2u/ x3gVed8vaSEukyjMktaZ7HwzKTJk5QquxmGZj+HiI/xzAGQUwvk/GaHQqFfBmOXi USSr9KnWy6bdojHLC0dESIcJYFqLQbldH9aJZszrwtexsrVHUotPNTsVgMYaxejr Uzxfcd49wBLcD0UiNnIcAyAtNtn8RwIBA6NFMEMwHQYDVR0OBBYEFDub7Wzic3cE wmom+bdM6XSw802sMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAOv7wU3MNJQv41vW16l9zkoT+Y2FomVJNcNLKw m45B/GPcYDA5B4NCDoqjzl8087oIatrchsTlVFdd59mWO/11YmeUFn4HbpnSQq5n bVgdKABfLJtjwGPxA22cA5+Q9rpZmziQ9PtgZkhF+oldQgQeht4NG72O2sfN2DLN SdqfFKx0dzYQJdqca1uDnk0fxQWakuezDXLEI96QDsoM7bFOkQr961yQCW4pZKLr XOqwXblmdO2FUS7470AnbVrFb8zNdxZc12x648D5oxNY70ZidoeOzgbdwbOWYhBt 7SEU8KZfIJzxkhgMHqlkkBfIqc9aU3XiZ1MAGs5KJtUUoql1DN8v+VZCRknnOYhq 7Vo/U6Ukzb0gPDSlcn1xvHYqwa/SPKT2uB1lHHT/Qz1rHCR3oRMAd3H5OTqVM82A duvM9dokzAeQYX25e7yU6S6XlBH06a+VHx1jLCoo8bMwlLbleW88Ye49GG7mWdSg O5AHCUeyr3893VchN+8E4syalN5arZiCiiTt/mqot8trHp2lhNjfT3vxSmytXtzr JNo3E8LVmHZMAYTvaNyY2Kl8DnQzQlKBTnWPWvjdp4BC18jwKEfJJoqfKpFUCJBh bZ8+tCznz9pYyvNMPxx8tQV0ELr3KJAOrjBEDd4TLZ+orqRxOZ4HqcXVTYo6zDAq K1JDmg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/21/000077500000000000000000000000001322470703100204155ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/21/end.crt000066400000000000000000000035021322470703100216750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBfjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMTAyMjAyMzEzMFoXDTI0MTAyMjAyMzEzMFowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCypu7DsNKhL3/N6mMPhYBKPH1dBvUA 55au+etGdP7KmpvhFij9h6jdAU/RAa80Bp25zQVLyd6Hro2j+m6GMZVNxMGa5wDp 5Cx+PX08EI8mYrUCpXMjL40hMV7sIn8lsO+XHCtEwivpGD5Vxj2zH10pDKkY8PWF gNQdmJvkj/2gczeTbLWFsg17e1Rq0XsFh8iYs33uXk6AIiQP+F2L3s8Z69celYuS Ri4+td6dnjt1CeJpe8zuxyUnwosgrAoB2uFei66ETXqBP78hO1P9thH3EwJsPNGq ZgXKzXlX/lYuLVyUOG46XDhBJSko8SbWuR+BdU9T+NOlC4/dClCZj8iHAgEDo00w SzAfBgNVHSMEGDAWgBQ/qGoWopAU1VK5PNVM+5EUtrMdGjAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAF8cRbZHi8KrmnG5uy9zC6brgTc8NPTiVt2dYcjR2w4n8BdDxZjG4vsZNUF+ zDCgIrqbHBIPNJRLmihFvpek/9Tt6yuV37p8fGeP03lMHfalKMKW0qQw+mt3KOEs REsoDEqxS4F6Odr8ft4EpTtB8w4I4hxjGHAPvffXnTCeoxYQ0nKOt8TfRUVJfwpj chAV3cFwC8V5fQnUCIXhfOl1mK8iEjNLMEFnKPhhzNyzJeqBJTJo6/gCcg5tfjZz nabGdBc0TgNeDo5upv0MsPXuNYV/ATV/Gky0saGHIb2DXjRAJiX2q/5RdXEMmVOR gqg9YQM5fln1EKIgVAYNg5WprmMkRcmbp2kAJviDSdd+A+gu5YWe7a60W66DgSBZ voMQIb4RTEZwSJGFO7Ty2dGdwqwksPM867balCxgHKRdLfMgx8kFvf/hfJVGyMfP 2VMwXAU/6IMh6TF+bKsTDeKBSOt9zLelVx/KzwLbsYlOfCrT/yelMmLJOl2kzecJ mhN23f6w8DM85iSqFBimLcipjRIkVKFSvN4hKiAsZEsXCI7J/++RxQ4rh/FabsNV 2GYlvbe8kiDIEYhk+o7Q/s1DK2sTqq+WxexUhCIlZe90EOFxG9EsPyQQH4FdLDn5 wT2l4T8yBjb1go/PVSm5au8QWCFEeMRSxzwsYsPkRuAPjJIj -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/21/root.crt000066400000000000000000000042071322470703100221150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBdjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDUxNDA1MDczMFoXDTI5MDUxNDA1MDczMFowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAx/E3WRVxcCDXhoST 8nVSLjW6hwM4Ni99AegWzcGtfGFo0zjFA1Cl5URqxauvYu3gQgQHBGA1CovWeGrl yVSRzOL1imcYsSgLOcnhVYB3Xcrof4ebv9+W+TwNdc9YzAwcj8rNd5nP6PKXIQ+W PCkEOXdyb80YEnxuT+NPjkVfFSPBS7QYZpvT2fwy4fZ0eh48253+7VleSmTO0mqj 7TlzaG56q150SLZbhpOd8jD8bM/wACnLCPR88wj4hCcDLEwoLyY85HJCTIQQMnoT UpqyzEeupPREIm6yi4d8C9YqIWFn2YTnRcWcmMaJLzq+kYwKoudfnoC6RW2vzZXn defQs68IZuK+uALu9G3JWGPgu0CQGj0JNDT8zkiDV++4eNrZczWKjr1YnAL+VbLK bApwL2u19l2WDpfUklimhWfraqHNIUKU6CjZOG31RzXcplIj0mtqs0E1r7r357Es yFoB28iNo4cz1lCulh0E4WJzWzLZcT4ZspHHRCFyvYnXoibXEV1nULq8ByKKG0FS 7nn4SseoV+8PvjHLPhmHGMvi4mxkbcXdV3wthHT1/HXdqY84A4xHWt1+sB/TpTek tDhFlEfcUygvTu58UtOnysomOVVeERmi7WSujfzKsGJAJYeetiA5R+zX7BxeyFVE qW0zh1Tkwh0S8LRe5diJh4+6FG0CAwEAAaNfMF0wHQYDVR0OBBYEFD+oahaikBTV Urk81Uz7kRS2sx0aMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQAaxWBQn5CZuNBfyzL57mn31ukHUFd61OMROSX3PT7oCv1Dy+C2AdRlxOcbN3/n li0yfXUUqiY3COlLAHKRlkr97mLtxEFoJ0R8nVN2IQdChNQM/XSCzSGyY8NVa1OR TTpEWLnexJ9kvIdbFXwUqdTnAkOI0m7Rg8j+E+lRRHg1xDAA1qKttrtUj3HRQWf3 kNTu628SiMvap6aIdncburaK56MP7gkR1Wr/ichOfjIA3Jgw2PapI31i0GqeMd66 U1+lC9FeyMAJpuSVp/SoiYzYo+79SFcVoM2yw3yAnIKg7q9GLYYqzncdykT6C06c 15gWFI6igmReAsD9ITSvYh0jLrLHfEYcPTOD3ZXJ4EwwHtWSoO3gq1EAtOYKu/Lv C8zfBsZcFdsHvsSiYeBU8Oioe42mguky3Ax9O7D805Ek6R68ra07MW/G4YxvV7IN 2BfSaYy8MX9IG0ZMIOcoc0FeF5xkFmJ7kdrlTaJzC0IE9PNxNaH5QnOAFB8vxHcO FioUxb6UKdHcPLR1VZtAdTdTMjSJxUqD/35Cdfqs7oDJXz8f6TXO2Tdy6G++YUs9 qsGZWxzFvvkXUkQSl0dQQ5jO/FtUJcAVXVVp20LxPemfatAHpW31WdJYeWSQWky2 +f9b5TXKXVyjlUL7uHxowWrT2AtTchDH22wTEtqLEF9Z3Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/22/000077500000000000000000000000001322470703100204165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/22/end.crt000066400000000000000000000035021322470703100216760ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBezBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDczMDAxNTgzNFoXDTI0MDczMDAxNTgzNFowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC0Gb2qEp1keU5x+DTs+AQO0K4eiX7L eClPX64QE+ayPCHunYNyj+pPH0x0Z5fCeKYQWI0wVsKqxIvnqV3BSLgmdb4GN9Sc 2DS26dwgSoW/d8jnbPamvTmNd/NJv8qqS/V+f1KAMiwS9+lff1pxNNwbTholaUG3 fC+JvKeD7ZNGgy2f7FyG2xvHMOEzE/eKJeG0SvxGGL/dq9aABswJWQ245pRSKLUh ZvTqG26KSJEj5f33N1n1t+dSI4eoaPiTuJ8m49KkLRFRVRsX0KlW9C5iO8kTPnrw JBgSKe8FkGvFTS3ucFEUePkB+2mS66i06PaXAHsFcxRcq+VNayWEQRejAgEDo00w SzAfBgNVHSMEGDAWgBQ/qGoWopAU1VK5PNVM+5EUtrMdGjAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAGOFLtSGrRwPfttLNyJ2JOX1/8ix9knvdmQJFOinlQfl9BH/pOsOQoyiQ+yk k0WGg403mn01Y6o4RdXKdqbTAYQ3BypgGtVvzwttLw9qwZlsJCIPM0fRzlthaCFT iNMQmvxFHN4GNGBEQVIpmBViAL1bDf99fufzOi1GSkJpzzIiAMLXd8PQR7ub9WnU PmnsEN1MkaEMrH9vKHCyFRErWE1FZfD5rQAnAAiS8zWeuckQteaAgBRlclWCzRCS Mg4DG5cwC65qvn6kc/AqR4f3VsYXH2A6l56gz8+nxJy1sIocurCLy3gZ0iN8IJAJ jPTDryd1WEUPE5AHqMHv75giyLoDZ4wI333a19gFmb/7eUX3aGBfmEzA2wsmp7K7 dMEk5mSmuCiXKbLZY9tH4SwyhUKrv1JRdl77wokAQiP+JNHTQViIdPXvZSZSak68 5eLDIIMQtowozPemcdTkPJBHY9C2Cq8Ew+q7DcMySlF55y669SqW9XDndnKFpKPA 7l9TcnljLRzhiBrY2I63GGzIJA5yA13k5AVxXN4R1p6mAnj0i91LZtj+tQ+xMYli 2rNy+Lzoeabxi4dY+Am9D4JELFfRCJiH11vrlu/YiDpBjIq1g4ptHKkKOOJlWiiV 9shsv4BLQg11eBoeD7IOpKlzOeAXf6hJqc1ZfpaRNiozbHSt -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/22/root.crt000066400000000000000000000042071322470703100221160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBdjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDUxNDA1MDczMFoXDTI5MDUxNDA1MDczMFowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAx/E3WRVxcCDXhoST 8nVSLjW6hwM4Ni99AegWzcGtfGFo0zjFA1Cl5URqxauvYu3gQgQHBGA1CovWeGrl yVSRzOL1imcYsSgLOcnhVYB3Xcrof4ebv9+W+TwNdc9YzAwcj8rNd5nP6PKXIQ+W PCkEOXdyb80YEnxuT+NPjkVfFSPBS7QYZpvT2fwy4fZ0eh48253+7VleSmTO0mqj 7TlzaG56q150SLZbhpOd8jD8bM/wACnLCPR88wj4hCcDLEwoLyY85HJCTIQQMnoT UpqyzEeupPREIm6yi4d8C9YqIWFn2YTnRcWcmMaJLzq+kYwKoudfnoC6RW2vzZXn defQs68IZuK+uALu9G3JWGPgu0CQGj0JNDT8zkiDV++4eNrZczWKjr1YnAL+VbLK bApwL2u19l2WDpfUklimhWfraqHNIUKU6CjZOG31RzXcplIj0mtqs0E1r7r357Es yFoB28iNo4cz1lCulh0E4WJzWzLZcT4ZspHHRCFyvYnXoibXEV1nULq8ByKKG0FS 7nn4SseoV+8PvjHLPhmHGMvi4mxkbcXdV3wthHT1/HXdqY84A4xHWt1+sB/TpTek tDhFlEfcUygvTu58UtOnysomOVVeERmi7WSujfzKsGJAJYeetiA5R+zX7BxeyFVE qW0zh1Tkwh0S8LRe5diJh4+6FG0CAwEAAaNfMF0wHQYDVR0OBBYEFD+oahaikBTV Urk81Uz7kRS2sx0aMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQAaxWBQn5CZuNBfyzL57mn31ukHUFd61OMROSX3PT7oCv1Dy+C2AdRlxOcbN3/n li0yfXUUqiY3COlLAHKRlkr97mLtxEFoJ0R8nVN2IQdChNQM/XSCzSGyY8NVa1OR TTpEWLnexJ9kvIdbFXwUqdTnAkOI0m7Rg8j+E+lRRHg1xDAA1qKttrtUj3HRQWf3 kNTu628SiMvap6aIdncburaK56MP7gkR1Wr/ichOfjIA3Jgw2PapI31i0GqeMd66 U1+lC9FeyMAJpuSVp/SoiYzYo+79SFcVoM2yw3yAnIKg7q9GLYYqzncdykT6C06c 15gWFI6igmReAsD9ITSvYh0jLrLHfEYcPTOD3ZXJ4EwwHtWSoO3gq1EAtOYKu/Lv C8zfBsZcFdsHvsSiYeBU8Oioe42mguky3Ax9O7D805Ek6R68ra07MW/G4YxvV7IN 2BfSaYy8MX9IG0ZMIOcoc0FeF5xkFmJ7kdrlTaJzC0IE9PNxNaH5QnOAFB8vxHcO FioUxb6UKdHcPLR1VZtAdTdTMjSJxUqD/35Cdfqs7oDJXz8f6TXO2Tdy6G++YUs9 qsGZWxzFvvkXUkQSl0dQQ5jO/FtUJcAVXVVp20LxPemfatAHpW31WdJYeWSQWky2 +f9b5TXKXVyjlUL7uHxowWrT2AtTchDH22wTEtqLEF9Z3Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/23/000077500000000000000000000000001322470703100204175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/23/end.crt000066400000000000000000000035021322470703100216770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBeTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDczMDAxNTc0NloXDTI0MDczMDAxNTc0NlowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC39utMhY5hS2SlUWwxN0fsjpp/P6+j UAMW6SWLdlU6k5Koh8t2pygoinRMc4Z/Q87/KfeNagdTJJ77YkNYnwCa9sAmlHO4 G0rzlpxGf61u5Ee8Kt8owBeSSlC3WXlyhlJ0Qmps38ooJm6eg45tB0MglrTccjHH EsD3HQqcPXDDr8WOQ46hxCIhBzJNU/l+NVaHzvTebywVO7d3F5Rd8wWH+VTnB2ig c9a8+mUz0TQ7QFkVsc8PupU/ng3sLQVHEbrcZ3S+7khxw9DCusqlmyTcuPh0bao2 KmVU3xYGnM5zgiFgGwnxrA4Ikw64iQbJFK+iue9T9jIOzF/FTzxrucGfAgEDo00w SzAfBgNVHSMEGDAWgBQ/qGoWopAU1VK5PNVM+5EUtrMdGjAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAKKfI8r/G4cUpV7Tj8ZauMMmcd7bOjhM6RCJJEZIc7WMCtUtWWAXJbihtB0T 2m2khwCW4s3VjkXbAqEzXGO4mQMvV+0i5sdGu2zln25imWMnEJnhaqPuQ1yZv6/z FDFCwZ+w0C5mwHn+ox++xyPor3YswiUsK5EoT/6nPdZ4g0YI2ID6nUxuU5N0Zo0i cR2qxmAxNXFV6DeWTtlF3Ro5nS4SRsVlpPrMp2+fc7KltpaXAvqzesyWKn9mfcNC ISGUMoHH2bFdQzJJp8ToOYVm07DoiF8mztv835NtR2+tghUt5/Eg2GGg+OxARp+0 fd4PCqWriTH3d5jHgFBgChC1/Obb+FFHSugKKudf5PKLBqMgdxHmdSHK2XTsbc1A /bnayUI/ajicmnMYKMLYmX7gsGe6fqEp9CgDkdMUKMtwdPcr09kr7m/G1erCCq3G x/1RPvEaj5rRswWmRk9c7qBwObrGNAyA3TdqEFFcGhuWBoy5hCGKSoppWmEGENKy VAXTnjCLrt4PUr/NFtw/cBiuFvJ1v1x9GGd7FVpsOOlGftIGCxbYbrDkTex09GNH Itye3jVAs/W2fAGMhl3SartM5MlyYOHOxAlt2AMK0yTEmJAK05VpYmDpYzNGEJTP 5C9CNM6jj51SOI6ekrCHdtOGu8XXcj3XKRAsFSFQgBkPrhl3 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/23/root.crt000066400000000000000000000042071322470703100221170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBdjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDUxNDA1MDczMFoXDTI5MDUxNDA1MDczMFowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAx/E3WRVxcCDXhoST 8nVSLjW6hwM4Ni99AegWzcGtfGFo0zjFA1Cl5URqxauvYu3gQgQHBGA1CovWeGrl yVSRzOL1imcYsSgLOcnhVYB3Xcrof4ebv9+W+TwNdc9YzAwcj8rNd5nP6PKXIQ+W PCkEOXdyb80YEnxuT+NPjkVfFSPBS7QYZpvT2fwy4fZ0eh48253+7VleSmTO0mqj 7TlzaG56q150SLZbhpOd8jD8bM/wACnLCPR88wj4hCcDLEwoLyY85HJCTIQQMnoT UpqyzEeupPREIm6yi4d8C9YqIWFn2YTnRcWcmMaJLzq+kYwKoudfnoC6RW2vzZXn defQs68IZuK+uALu9G3JWGPgu0CQGj0JNDT8zkiDV++4eNrZczWKjr1YnAL+VbLK bApwL2u19l2WDpfUklimhWfraqHNIUKU6CjZOG31RzXcplIj0mtqs0E1r7r357Es yFoB28iNo4cz1lCulh0E4WJzWzLZcT4ZspHHRCFyvYnXoibXEV1nULq8ByKKG0FS 7nn4SseoV+8PvjHLPhmHGMvi4mxkbcXdV3wthHT1/HXdqY84A4xHWt1+sB/TpTek tDhFlEfcUygvTu58UtOnysomOVVeERmi7WSujfzKsGJAJYeetiA5R+zX7BxeyFVE qW0zh1Tkwh0S8LRe5diJh4+6FG0CAwEAAaNfMF0wHQYDVR0OBBYEFD+oahaikBTV Urk81Uz7kRS2sx0aMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQAaxWBQn5CZuNBfyzL57mn31ukHUFd61OMROSX3PT7oCv1Dy+C2AdRlxOcbN3/n li0yfXUUqiY3COlLAHKRlkr97mLtxEFoJ0R8nVN2IQdChNQM/XSCzSGyY8NVa1OR TTpEWLnexJ9kvIdbFXwUqdTnAkOI0m7Rg8j+E+lRRHg1xDAA1qKttrtUj3HRQWf3 kNTu628SiMvap6aIdncburaK56MP7gkR1Wr/ichOfjIA3Jgw2PapI31i0GqeMd66 U1+lC9FeyMAJpuSVp/SoiYzYo+79SFcVoM2yw3yAnIKg7q9GLYYqzncdykT6C06c 15gWFI6igmReAsD9ITSvYh0jLrLHfEYcPTOD3ZXJ4EwwHtWSoO3gq1EAtOYKu/Lv C8zfBsZcFdsHvsSiYeBU8Oioe42mguky3Ax9O7D805Ek6R68ra07MW/G4YxvV7IN 2BfSaYy8MX9IG0ZMIOcoc0FeF5xkFmJ7kdrlTaJzC0IE9PNxNaH5QnOAFB8vxHcO FioUxb6UKdHcPLR1VZtAdTdTMjSJxUqD/35Cdfqs7oDJXz8f6TXO2Tdy6G++YUs9 qsGZWxzFvvkXUkQSl0dQQ5jO/FtUJcAVXVVp20LxPemfatAHpW31WdJYeWSQWky2 +f9b5TXKXVyjlUL7uHxowWrT2AtTchDH22wTEtqLEF9Z3Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/24/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/24/end.crt000066400000000000000000000035021322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBfTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMTAyMjAyMzExN1oXDTI0MTAyMjAyMzExN1owgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDxpBVhzobyha46IUb8WdudooWE5Ief WtqJ3yR1jjrUf9kbKyZzateafKS6B+JfL8Q71PvoDujLg8iyz4o0Jj7xScJo/BdR kE3Nj1KbCCVyp7wx6iC13RN0I1fpbhANkIak5fN6G4QIBXUgzXntn6+ARF4wuKmC hAVJbEi6mO1ZcsEteUsKF4JMl8NUumkRbl3/IFZo56L3bJawRI9IdIkeIGOWYZwE GJfY3j9t4WTb+w/8vY/3TzQJu09gBCjUnfsMOGoIGEzohtwlIbf1ym8YIxchsuuf s/pXnTkxvSF5v76dYQMuw1uWy0IXGIQRiVYU1xf4qKxzkDgJBeLDgQLRAgEDo00w SzAfBgNVHSMEGDAWgBQ/qGoWopAU1VK5PNVM+5EUtrMdGjAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAKlrmtS5xchDGITBcGTDao+YU95G2GnOQIBtEyr7Yp7efXFwsAk+LQ+j6zNI FXNxr/xR3jEWv356+H0gsv0XPeLVtKlGcmdJkCqwMMehwzD2C8szImEqTTZ4Dvjw X5yUno6X0s+u1d/8ZSTTu7CXDTl7LO1O8FTU+ecW4pITRlwHMIteMEX15vqcOrox F690FPru3GgAE51vTExDOvpkSJ/fP6HB7QJiP4kDXpR8wHn2uOt1PbRoZOAm/LI4 dAxx5xRWv5dpAzG1Y3+t6oQFIY5Vnad5+TtSQaN4s3Znrd8rI8KPcIYd+su5jqij 3sVHCEZFvjgNmlEIJ6ide1yzK530BU4GAusVJLmE2IF3QrDGKNXfk4INiQ3DYEib pkVGOiwujvN7v5WynELsRBkMIyzKJMfDjJjnpRQY6zGqKq+t9ldWtOQYFXVyztYq 1NQb06KJmUVFvuVeG8ARdPDWPUqnzp3WTptlsUiIVnlPEBgA9TXCMKZScWviatNV Zo3t1DV60OJO/jOPyEAEMhHFMHO0g3VIUroafy7PQPlPFm/Yl9dg6mgYhJtR2xym NTAp0Nj1a+etckwkW5AP3A8zZZJAB9mCRsNyLoUVBI8sI+UMunCmdkhXddncFzvv 8LFzLCIhY4jq0N8k5qo2LXtVQIZegMxfqeVyx6DvsvE6pmYV -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/24/root.crt000066400000000000000000000042071322470703100221200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBdjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDUxNDA1MDczMFoXDTI5MDUxNDA1MDczMFowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAx/E3WRVxcCDXhoST 8nVSLjW6hwM4Ni99AegWzcGtfGFo0zjFA1Cl5URqxauvYu3gQgQHBGA1CovWeGrl yVSRzOL1imcYsSgLOcnhVYB3Xcrof4ebv9+W+TwNdc9YzAwcj8rNd5nP6PKXIQ+W PCkEOXdyb80YEnxuT+NPjkVfFSPBS7QYZpvT2fwy4fZ0eh48253+7VleSmTO0mqj 7TlzaG56q150SLZbhpOd8jD8bM/wACnLCPR88wj4hCcDLEwoLyY85HJCTIQQMnoT UpqyzEeupPREIm6yi4d8C9YqIWFn2YTnRcWcmMaJLzq+kYwKoudfnoC6RW2vzZXn defQs68IZuK+uALu9G3JWGPgu0CQGj0JNDT8zkiDV++4eNrZczWKjr1YnAL+VbLK bApwL2u19l2WDpfUklimhWfraqHNIUKU6CjZOG31RzXcplIj0mtqs0E1r7r357Es yFoB28iNo4cz1lCulh0E4WJzWzLZcT4ZspHHRCFyvYnXoibXEV1nULq8ByKKG0FS 7nn4SseoV+8PvjHLPhmHGMvi4mxkbcXdV3wthHT1/HXdqY84A4xHWt1+sB/TpTek tDhFlEfcUygvTu58UtOnysomOVVeERmi7WSujfzKsGJAJYeetiA5R+zX7BxeyFVE qW0zh1Tkwh0S8LRe5diJh4+6FG0CAwEAAaNfMF0wHQYDVR0OBBYEFD+oahaikBTV Urk81Uz7kRS2sx0aMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQAaxWBQn5CZuNBfyzL57mn31ukHUFd61OMROSX3PT7oCv1Dy+C2AdRlxOcbN3/n li0yfXUUqiY3COlLAHKRlkr97mLtxEFoJ0R8nVN2IQdChNQM/XSCzSGyY8NVa1OR TTpEWLnexJ9kvIdbFXwUqdTnAkOI0m7Rg8j+E+lRRHg1xDAA1qKttrtUj3HRQWf3 kNTu628SiMvap6aIdncburaK56MP7gkR1Wr/ichOfjIA3Jgw2PapI31i0GqeMd66 U1+lC9FeyMAJpuSVp/SoiYzYo+79SFcVoM2yw3yAnIKg7q9GLYYqzncdykT6C06c 15gWFI6igmReAsD9ITSvYh0jLrLHfEYcPTOD3ZXJ4EwwHtWSoO3gq1EAtOYKu/Lv C8zfBsZcFdsHvsSiYeBU8Oioe42mguky3Ax9O7D805Ek6R68ra07MW/G4YxvV7IN 2BfSaYy8MX9IG0ZMIOcoc0FeF5xkFmJ7kdrlTaJzC0IE9PNxNaH5QnOAFB8vxHcO FioUxb6UKdHcPLR1VZtAdTdTMjSJxUqD/35Cdfqs7oDJXz8f6TXO2Tdy6G++YUs9 qsGZWxzFvvkXUkQSl0dQQ5jO/FtUJcAVXVVp20LxPemfatAHpW31WdJYeWSQWky2 +f9b5TXKXVyjlUL7uHxowWrT2AtTchDH22wTEtqLEF9Z3Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/25/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/25/end.crt000066400000000000000000000035021322470703100217010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBejBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDczMDAxNTgxMVoXDTI0MDczMDAxNTgxMVowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQD98JqVDyxf69vjGDpYcUxBLS2tiuBW iwWIqSeIqCsb0RR8hePU7jBj7BnAXHTet6B2T4e48C5l7OO5E/nDEPYfZpLz7KoK ud4pUhpEB2W0CjrZbS3P7VzWsFv0gQNu1xfj90C2UuprhCdcuFKQqbXr6aM2UKkq Nlr6G5li3WwTeSkiMnXa/RBTOHS7Iy+uj5x4V2oiZFLFKKNwgWFYRll+aAJcjlWk Rqfo6I68N6JEsujS76+0LV6O0H+OHPctbmvo3ALmRIKyrXpmtK8h39Q2rkndawPg YHtKhXd4hIAV3XcIHII/eEJbVAl2axi1uZOkuYbuJlVinMvAoyqjb/abAgEDo00w SzAfBgNVHSMEGDAWgBQ/qGoWopAU1VK5PNVM+5EUtrMdGjAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAC9Q50YEjUHkW7fHPEWy8uVMsaCQLh3fcVu/Yv4Jtc/DSOcV+qmgXgX3/hOH Y+ap5Ior/jUUGV9TleY9yqcMyc1uajDqk9EA2HBUQGxE+pJo+YsVPU9hR5H/8v90 2MCclZPphemVeollwWXW6L0anH36J/qPnsq+4YtX8oMPr8l1Fvqdat66xpaEioAp mXKZ0za9jsHVWLmwR5Ox+FnnxBymH6IS5CItOaZp+QYr88c3hIVGDKIzrJG0Q91J /n/DigrZ+aZseaCtrn9MKtWw5I4dtUiVq4uVOOAcg/yPPiT2VkdLBVX7rrN2gXce e6kMhG/EbmJNjRlyDqb1wX8ctlZYis4AmgKYxjYKzHO3k62Db40jx90aKTeZMSK1 hDYNbPddeqkvSPPVZhoe17E+4nNTII18TpdXhw9OcHMT/zk+GsFJAtYQbqUMYGpF lv31xS8eS6Lu+4ZSahhQja2Lg/UTyqJG6OnwALvE/4igm+hMC5z8C3v1FQo7f1/b hoKoL8yoFxM9GRvyiNZFmSEgE+VUALQCxQnfOC8wfz2fMEfTPqDEncplxAcCQ+mz 0xgD03mVGnfgHy5Im7kRFHszpjbU8jvetrqQHYTiGxjg25j93eDPfYZuEA+hmf0P 06KbW+b0CfTO+qGyPPHI2+eK/yv7/DRWGmgOfhpDcorYOeeL -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/25/root.crt000066400000000000000000000042071322470703100221210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBdjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDUxNDA1MDczMFoXDTI5MDUxNDA1MDczMFowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAx/E3WRVxcCDXhoST 8nVSLjW6hwM4Ni99AegWzcGtfGFo0zjFA1Cl5URqxauvYu3gQgQHBGA1CovWeGrl yVSRzOL1imcYsSgLOcnhVYB3Xcrof4ebv9+W+TwNdc9YzAwcj8rNd5nP6PKXIQ+W PCkEOXdyb80YEnxuT+NPjkVfFSPBS7QYZpvT2fwy4fZ0eh48253+7VleSmTO0mqj 7TlzaG56q150SLZbhpOd8jD8bM/wACnLCPR88wj4hCcDLEwoLyY85HJCTIQQMnoT UpqyzEeupPREIm6yi4d8C9YqIWFn2YTnRcWcmMaJLzq+kYwKoudfnoC6RW2vzZXn defQs68IZuK+uALu9G3JWGPgu0CQGj0JNDT8zkiDV++4eNrZczWKjr1YnAL+VbLK bApwL2u19l2WDpfUklimhWfraqHNIUKU6CjZOG31RzXcplIj0mtqs0E1r7r357Es yFoB28iNo4cz1lCulh0E4WJzWzLZcT4ZspHHRCFyvYnXoibXEV1nULq8ByKKG0FS 7nn4SseoV+8PvjHLPhmHGMvi4mxkbcXdV3wthHT1/HXdqY84A4xHWt1+sB/TpTek tDhFlEfcUygvTu58UtOnysomOVVeERmi7WSujfzKsGJAJYeetiA5R+zX7BxeyFVE qW0zh1Tkwh0S8LRe5diJh4+6FG0CAwEAAaNfMF0wHQYDVR0OBBYEFD+oahaikBTV Urk81Uz7kRS2sx0aMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQAaxWBQn5CZuNBfyzL57mn31ukHUFd61OMROSX3PT7oCv1Dy+C2AdRlxOcbN3/n li0yfXUUqiY3COlLAHKRlkr97mLtxEFoJ0R8nVN2IQdChNQM/XSCzSGyY8NVa1OR TTpEWLnexJ9kvIdbFXwUqdTnAkOI0m7Rg8j+E+lRRHg1xDAA1qKttrtUj3HRQWf3 kNTu628SiMvap6aIdncburaK56MP7gkR1Wr/ichOfjIA3Jgw2PapI31i0GqeMd66 U1+lC9FeyMAJpuSVp/SoiYzYo+79SFcVoM2yw3yAnIKg7q9GLYYqzncdykT6C06c 15gWFI6igmReAsD9ITSvYh0jLrLHfEYcPTOD3ZXJ4EwwHtWSoO3gq1EAtOYKu/Lv C8zfBsZcFdsHvsSiYeBU8Oioe42mguky3Ax9O7D805Ek6R68ra07MW/G4YxvV7IN 2BfSaYy8MX9IG0ZMIOcoc0FeF5xkFmJ7kdrlTaJzC0IE9PNxNaH5QnOAFB8vxHcO FioUxb6UKdHcPLR1VZtAdTdTMjSJxUqD/35Cdfqs7oDJXz8f6TXO2Tdy6G++YUs9 qsGZWxzFvvkXUkQSl0dQQ5jO/FtUJcAVXVVp20LxPemfatAHpW31WdJYeWSQWky2 +f9b5TXKXVyjlUL7uHxowWrT2AtTchDH22wTEtqLEF9Z3Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/26/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/26/end.crt000066400000000000000000000037651322470703100217150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBOzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xNDAxMjExNjAwMDFaFw0yOTAx MjExNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAl9R8zu89ZcKVrhfe TizKp7KQHDuntSfaD/3IMplVayuyjKJpL4UxMm7ixmOmewhd860fBWMjgC3SQn30 L6LPsRGbUdQCPNbFWs2laa4xNvWqoDKwxa/zjzjtkM0zciQvyARUhD6Dy0NkK1/C H7GMV2f34dVkxqdGtxntGNWV+cEA5wm6Q1SWkPTv5uGgEdIOP4YHP/rxDAw/yApd Bt7VFfkcuKLDppY13zjk27OFJVGpIeHCXstTKuBkTJturJAaTwVUxGsrCVmrhlTi 1beyrW5YJm0r98pORbiGdDgOCZJTPKzPutNnxSz+akmOC264h8ZeyoefV8UAvSoO qYxWBQIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBRtckHLKyFzYmEZTALTOesDxx1T 3KGBjaSBijCBhzELMAkGA1UEBhMCQ04xEjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUG A1UECwweSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MTswOQYDVQQDDDJD aGluYSBQYXNzcG9ydCBDb3VudHJ5IFNpZ25pbmcgQ2VydGlmaWNhdGUgKE1hY2Fv KYIBMzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBAG6YHGkL521w TC058/sGYf0k+FqWV1HK20UFjiX3Iam1VbrbWwtTjqI+Qn6tX0pmwlECepmEGgym hQeIOcSO0zdBeMe8Drj+Fr3yXcLXscrfccKWkPyT0wKCjaizb3WK8wRM7HhybrZa UK/N5/SX9O1fzzcGML+y9OPPpeyAZQT26NbWSX/FvFWcuxVe3UT3jJ5Fd59u60y8 etL5gfLlkbtxmI/jWfbAce84zh8ScqU9VoiHrGeWfNPknLeZ1h0fDfO6hm2y6MtT 4fTwGicU2HqfZ9qwBNGQIQCTeTsbI4jPDr4GtKiRy/QxMhdc8rH2bE93JZDXdO65 0+ljBnPBfbrDP37ADbe7Xw9B+nkWM0yaYFHRiMZAAUjA7tyXnnYLRx5CIaMYONJt ArtwilFG3p7w9sSlnww0asWb1mQNK3zM70fRhHQqeOCtETwZ7WGOvj1N8lVImthV uXCTsP87Nt4hDgY4QShVQSBVeuuyD57DLvXktbAc+LT6adY6aBuXo9vWwsYfGQ9l VZjjQ4KNUaIwB+SUOtmkZ8vpYfkf78hAHuKCF7BsCa2NwbePrXl5ZKRPPfG1bvop U5fSxK8BFjAl8BbNd9Sf7SOtsbRW5J1MoBGjHA0I7jIRhmAClHJt3u7JOCTOA8NV lLE17G5T/HFOrFD0Qg48ekZFNnk2g4zA -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/26/root.crt000066400000000000000000000042341322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBMzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xMzA3MTAxNjAwMDFaFw0zMzA3 MTAxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk36aawkcMmYilDNV N0fuiObdvnW6CnYeLvpuY9PDUMojs6rVrvSJgNX4znqFx3djaXoeunXfxSNUA+Ec AbJHUTOYxpzUiy7hLT8zPzeoEFtcXhdEBddQ18isujcf1MvSE55MvjOpQ+4OUey5 cz8uayuarycxF6MVkFRlpYY0k8mRsUQZqzGysNrYNti5fr3T1QbMqvufAeKkYW3n Dx+0P0Ct+bmBEASnmpor5I9GFC8xocaTnhTXK+X1ruKq13d5IaMisEow6HBq0ym0 liit+d74Ul6sHt8xz1AmQzYO3m8icqFS0yKbD5CXeAS0j1y8xVXqCtUQO8aTxlEU NhR4JJqUXTmGuRiF3JMFh8eGT3dAJKt8euwK2xRBNk+Ml8in7typTq+QOrF7Cnn3 VzGVelw9YzrQR01/nBp/eiIT97ArpSNz1VjNaFNSFtHRQbon4FBwcZbLfJEGl6AL 2iEUOq8G4xq2/kpUaGffzgMyibRujBmjvWv2LeqxKH/ROcKB3Z72sgUiEoxVPIzX c/RiV5NtngQoI77gRNfiSS3NLdSKopPbVpWKk3bWDeVusmCSy9n55sgQ5KpbhN7R a5fcmEeKKNYopv9oiwZln0aRmenT5omGY9DP2evkm8KjDmseZ0maMmOfhr0unr7B bsOqOsIFNKCnPRWJxljH1+GfJLUCAQOjRTBDMB0GA1UdDgQWBBRtckHLKyFzYmEZ TALTOesDxx1T3DAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAEH2OX7BVQfzVq5wRB69SB3DNuHf1shi3HzMS22oB px2xrDzxDIisyYrlIjwMXOdA4eK1wz1MUOaPm/P7OsJpGO0gam5WoiNYIatWTcX/ ojg/ZsMm/83o1/lZKx8/oDS2SeMUIjuILawPynXwxjRAyUbLdlHo9sVbsssWEoI/ r1eG0UjDvLTnbeFlt+f85fJGv8bM1VN7Wjx+2fDpo9Vpc8CB/A6c3p+r1Omg3/zJ teLuKE+R7cekDaAQ98TQQJ4QB4kvKDB3EK2hQMKCdCohEhRD3ozemOdJpxBajlEO 6Y/UuItNRyC16+W2XzxzaCkOQbe6UBOVYPM0hQcK/CfQU9FInY6E4ULN1BDzYnbN eczSWvJbxdHUCEJixpCPdOdslbEM1wStTXxCZsUDJPSwVCYvWM7XcD5waJ5tr4S5 6EAC/EIk5EkrbeEXQSwKubE+Vs6s3lg5KUXwUP42FWv7rkSOR78F88n9X6Dz2e3h Di2uGWn3kjgxChKVmvbdF9wG+sw4CjVfBwSbHomoTKj976Y1ddmrlcla9ar9BOLi 7czP8+y0yuOFhzOC5wir897u8rTDneCIIB+qaS9AZBAffHxznP8CYBi7bXflkN+T 3YVlUVPjJZy3v2864F1oUmfqb8Qkzc5Ac7419FdemeMyihSZbdPq4phmRrwXj3vb 3TI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/27/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/27/end.crt000066400000000000000000000037651322470703100217160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBQTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xNDA5MjgxNjAwMDFaFw0yOTA5 MjgxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEArX3Ny4lu5UP92CbK 0LsQr6ahi+VhhDhgzno71Xj7CkhCcvj4k/PAd9CRhNBZuxEp2Za4tb7rwXgk3Cbn /nl1zmmcYwbx04UXpScRjrfjIjZtq9e5JL77t1QDYbuLqQ1zMm6aZ7Ies5jRTcz2 i2Km/d2kKY4yOg0Mc/bACEXIn6Nva5kFvpmp7LNgRFgLdKo0PUcwZlEg4BnDtfKz rKjvVkq/6vkGGdhN98KAKHjAzDY+37DX1dNJDh3gzLUQHqXwrBPZx3AA8juCO3ML 92kKWFBQFgYatGq5FV1FoIe/KqBDWeD8hewzxkUzt9/+kqIsG2lJ23BwcENQUizV HZGGfQIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBRtckHLKyFzYmEZTALTOesDxx1T 3KGBjaSBijCBhzELMAkGA1UEBhMCQ04xEjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUG A1UECwweSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MTswOQYDVQQDDDJD aGluYSBQYXNzcG9ydCBDb3VudHJ5IFNpZ25pbmcgQ2VydGlmaWNhdGUgKE1hY2Fv KYIBMzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBADA+tSE6sgXi wbwnitSLnuav+xiI90000prEH6he0llEWEkdgYkVqWkEA3FWNaylFTU7buu2bW64 SwlTynwYtqOi7syw9MtH3rZCsyD7oz5TC92K1mOX90vGHCWeLsZnH0yCYZMXXZ3k Q3bhlc1gb4LHACQjEhoX4SlJlWj21jDIXlxD8g6ULBD5RSQKb+h+u1gBdICnGio3 V0Syo4G4Ltm86JHU7uJHyNcdNnJZzE95ts9m6YXs550wESeyc2ET521tIUo9ELip Nzl5v4LSKVn0y3T+eWtcWZ3RxONSArabA9CRfc1dOcVq/0F2Th7LeMFJcH4Fo0hc dsJOLecBRQgl0IC5fWjT34B4hmAU+WhITfnoGIfYzu0lMJX0BAsa2TcohRgFuZhN 0KYX0HrDwbAvyDlY+UCFXUJPWLtNqQJ5eTTG5OWZkJT5IrLQ5BL9isyGgKH9Q9ty +Zaju1rk1719gTf+lS/RVj7qJKXSA2QkHhOfvXcXiMKnRrkuNQ8Pk/WFW2JbOltB O9nj9/0bZl/txn8Ai5mY+yvoVQhg3ju0TqR6r1kDXpNEPNH6NPoTdNj4eFeESr1F Zz0aQzcl8nR5M3AnNtcLey+PX9kJMHvx8cqA2g3WSL2eptWTuMhVeCQZytN3M0Bh i0MX8B6KA8PfO7wK7Ie5KUKkiHaxCa4m -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/27/root.crt000066400000000000000000000042341322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBMzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xMzA3MTAxNjAwMDFaFw0zMzA3 MTAxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk36aawkcMmYilDNV N0fuiObdvnW6CnYeLvpuY9PDUMojs6rVrvSJgNX4znqFx3djaXoeunXfxSNUA+Ec AbJHUTOYxpzUiy7hLT8zPzeoEFtcXhdEBddQ18isujcf1MvSE55MvjOpQ+4OUey5 cz8uayuarycxF6MVkFRlpYY0k8mRsUQZqzGysNrYNti5fr3T1QbMqvufAeKkYW3n Dx+0P0Ct+bmBEASnmpor5I9GFC8xocaTnhTXK+X1ruKq13d5IaMisEow6HBq0ym0 liit+d74Ul6sHt8xz1AmQzYO3m8icqFS0yKbD5CXeAS0j1y8xVXqCtUQO8aTxlEU NhR4JJqUXTmGuRiF3JMFh8eGT3dAJKt8euwK2xRBNk+Ml8in7typTq+QOrF7Cnn3 VzGVelw9YzrQR01/nBp/eiIT97ArpSNz1VjNaFNSFtHRQbon4FBwcZbLfJEGl6AL 2iEUOq8G4xq2/kpUaGffzgMyibRujBmjvWv2LeqxKH/ROcKB3Z72sgUiEoxVPIzX c/RiV5NtngQoI77gRNfiSS3NLdSKopPbVpWKk3bWDeVusmCSy9n55sgQ5KpbhN7R a5fcmEeKKNYopv9oiwZln0aRmenT5omGY9DP2evkm8KjDmseZ0maMmOfhr0unr7B bsOqOsIFNKCnPRWJxljH1+GfJLUCAQOjRTBDMB0GA1UdDgQWBBRtckHLKyFzYmEZ TALTOesDxx1T3DAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAEH2OX7BVQfzVq5wRB69SB3DNuHf1shi3HzMS22oB px2xrDzxDIisyYrlIjwMXOdA4eK1wz1MUOaPm/P7OsJpGO0gam5WoiNYIatWTcX/ ojg/ZsMm/83o1/lZKx8/oDS2SeMUIjuILawPynXwxjRAyUbLdlHo9sVbsssWEoI/ r1eG0UjDvLTnbeFlt+f85fJGv8bM1VN7Wjx+2fDpo9Vpc8CB/A6c3p+r1Omg3/zJ teLuKE+R7cekDaAQ98TQQJ4QB4kvKDB3EK2hQMKCdCohEhRD3ozemOdJpxBajlEO 6Y/UuItNRyC16+W2XzxzaCkOQbe6UBOVYPM0hQcK/CfQU9FInY6E4ULN1BDzYnbN eczSWvJbxdHUCEJixpCPdOdslbEM1wStTXxCZsUDJPSwVCYvWM7XcD5waJ5tr4S5 6EAC/EIk5EkrbeEXQSwKubE+Vs6s3lg5KUXwUP42FWv7rkSOR78F88n9X6Dz2e3h Di2uGWn3kjgxChKVmvbdF9wG+sw4CjVfBwSbHomoTKj976Y1ddmrlcla9ar9BOLi 7czP8+y0yuOFhzOC5wir897u8rTDneCIIB+qaS9AZBAffHxznP8CYBi7bXflkN+T 3YVlUVPjJZy3v2864F1oUmfqb8Qkzc5Ac7419FdemeMyihSZbdPq4phmRrwXj3vb 3TI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/28/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/28/end.crt000066400000000000000000000037651322470703100217170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBPTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xNDA0MTUxNjAwMDFaFw0yOTA0 MTUxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAsffbK36xd4JyfKlp MHLXg4qck8ThIbz4v2/Q2pfDqHj5fQE78V2+ViZfU4aRVJLztCTK6XzgvP4frheh ESAPLWFxClfs2MC3TsVeKIcwpnp+6RkBLjnmGnIoI29P2mwK8hBcq4sOA4BraexX iG3zxpmYI/2gp2xvDGY3JZRUpyCfo893b6alf4vhoNCf2CYZ+WNKDkyBRvowBNQj 5t5ZaktWLDNQiX1Wpq4uLK8M9hEzMOMsD5qUq7f/hGS4xdEGs4mWLJtolHUCBswx GZl8KjcPdLQIb+1JsJbvFPGAn1BBLLe3sOpEIY+NLMfVfHPx5frGEredXzkLpO1S orVB4wIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBRtckHLKyFzYmEZTALTOesDxx1T 3KGBjaSBijCBhzELMAkGA1UEBhMCQ04xEjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUG A1UECwweSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MTswOQYDVQQDDDJD aGluYSBQYXNzcG9ydCBDb3VudHJ5IFNpZ25pbmcgQ2VydGlmaWNhdGUgKE1hY2Fv KYIBMzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBAFoYnsVYOMvL SFNLKLkHQvildUYWFoS8W8sfNysTKq/VFXxm1bMVBakPhbm2EL1CAlKY1dg1PCEE 89GQ1FbTtiQFQW8pSNe0+xLip4sXAxYsjFpSH2lRUYnlo394PYaUEzKH6Izhc6H/ 5RabcAatB3DwVXD1edIpOK4V2a5q/X+8c15XqwIyOsXTwouvaYPWJZ8FDauaKoyq GLfRKcNFzQK3n8tk8sQJCsEwpFM4FTUJjdcPwB/8mDUFoDgmoITQzYlfV1H3/VCp ai7zHUCYIL0aPqCIgpyW7ATPnFbCQbUYXqq6rxkCCC/iAmL07VyuDf3/+NPRAgoW WxSkgQKLhQPkOOkxGddL07cL9uQAvFewO74ZLkX/W2qILQTjdzcRGNyvGbTl3sK4 ++j2AQ3mt6zcWU1R3WNpsaEzW4ikREDZCvFEUIInjMTZodb5butN5axAZkFp8FCb IQBH0FaCTvHv9SXLK9XeDf7rSkyN9azvI5+ZUD0wjzruOoZqOPMtLFqOn8eDc94D mHaMe+l7ExSKywK0+TRZrhZb7h06TgJs3srGl5wkpcvucd37nBDxHI6Vt76k6CVp qD7dGSuBZW+UfKJamBTG9VPKZgqfPQC2MWWXn48qR9enl+uyf3TxqWr+qjPO5QV3 nrlMivRYQuGipNWzceNzi2vmZ4Jrd/1W -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/28/root.crt000066400000000000000000000042341322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBMzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xMzA3MTAxNjAwMDFaFw0zMzA3 MTAxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk36aawkcMmYilDNV N0fuiObdvnW6CnYeLvpuY9PDUMojs6rVrvSJgNX4znqFx3djaXoeunXfxSNUA+Ec AbJHUTOYxpzUiy7hLT8zPzeoEFtcXhdEBddQ18isujcf1MvSE55MvjOpQ+4OUey5 cz8uayuarycxF6MVkFRlpYY0k8mRsUQZqzGysNrYNti5fr3T1QbMqvufAeKkYW3n Dx+0P0Ct+bmBEASnmpor5I9GFC8xocaTnhTXK+X1ruKq13d5IaMisEow6HBq0ym0 liit+d74Ul6sHt8xz1AmQzYO3m8icqFS0yKbD5CXeAS0j1y8xVXqCtUQO8aTxlEU NhR4JJqUXTmGuRiF3JMFh8eGT3dAJKt8euwK2xRBNk+Ml8in7typTq+QOrF7Cnn3 VzGVelw9YzrQR01/nBp/eiIT97ArpSNz1VjNaFNSFtHRQbon4FBwcZbLfJEGl6AL 2iEUOq8G4xq2/kpUaGffzgMyibRujBmjvWv2LeqxKH/ROcKB3Z72sgUiEoxVPIzX c/RiV5NtngQoI77gRNfiSS3NLdSKopPbVpWKk3bWDeVusmCSy9n55sgQ5KpbhN7R a5fcmEeKKNYopv9oiwZln0aRmenT5omGY9DP2evkm8KjDmseZ0maMmOfhr0unr7B bsOqOsIFNKCnPRWJxljH1+GfJLUCAQOjRTBDMB0GA1UdDgQWBBRtckHLKyFzYmEZ TALTOesDxx1T3DAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAEH2OX7BVQfzVq5wRB69SB3DNuHf1shi3HzMS22oB px2xrDzxDIisyYrlIjwMXOdA4eK1wz1MUOaPm/P7OsJpGO0gam5WoiNYIatWTcX/ ojg/ZsMm/83o1/lZKx8/oDS2SeMUIjuILawPynXwxjRAyUbLdlHo9sVbsssWEoI/ r1eG0UjDvLTnbeFlt+f85fJGv8bM1VN7Wjx+2fDpo9Vpc8CB/A6c3p+r1Omg3/zJ teLuKE+R7cekDaAQ98TQQJ4QB4kvKDB3EK2hQMKCdCohEhRD3ozemOdJpxBajlEO 6Y/UuItNRyC16+W2XzxzaCkOQbe6UBOVYPM0hQcK/CfQU9FInY6E4ULN1BDzYnbN eczSWvJbxdHUCEJixpCPdOdslbEM1wStTXxCZsUDJPSwVCYvWM7XcD5waJ5tr4S5 6EAC/EIk5EkrbeEXQSwKubE+Vs6s3lg5KUXwUP42FWv7rkSOR78F88n9X6Dz2e3h Di2uGWn3kjgxChKVmvbdF9wG+sw4CjVfBwSbHomoTKj976Y1ddmrlcla9ar9BOLi 7czP8+y0yuOFhzOC5wir897u8rTDneCIIB+qaS9AZBAffHxznP8CYBi7bXflkN+T 3YVlUVPjJZy3v2864F1oUmfqb8Qkzc5Ac7419FdemeMyihSZbdPq4phmRrwXj3vb 3TI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/29/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/29/end.crt000066400000000000000000000037651322470703100217200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBQzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xNDEyMTgxNjAwMDFaFw0yOTEy MTgxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAq4ly12RqsXyj6uU4 OjCdBMPgKWCp5T7x/iGgQk9N8QBcYSTjl+hd/XhJvD5AZvJ16L8qrZT9tSkUfaPl 6lOhr8/cjS5QYymxZC+cm6De9jOQosJ85R36HmSRYnUxDYMkkOJE1mttdZjOvGsy QywTmWgoSnXhAKVQ5T8ciCgTLIdrsTHZQ4+yLq+XCOgR4zkXo6h5isRLiu2vTOPw jUyaH6rllMLVP+Va04E/DG94EvI/Y6A7397nFwZeUdD3A69C7Xqb1/p/3GWenyCn BYT7qrHcnN5x21y3hOl8h5g5WzXD4DMKqS09gNf3PLN/OouBRn7wk0YkvtadRlJU JKyPJQIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBRtckHLKyFzYmEZTALTOesDxx1T 3KGBjaSBijCBhzELMAkGA1UEBhMCQ04xEjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUG A1UECwweSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MTswOQYDVQQDDDJD aGluYSBQYXNzcG9ydCBDb3VudHJ5IFNpZ25pbmcgQ2VydGlmaWNhdGUgKE1hY2Fv KYIBMzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBABDu6Oku/mT+ Ny3qjuLOyRIZD3TAc4W1m4X1cKIJ5vPjESyTQ/4q//1Qytr7xSMVU+cCX6Vcihby 2etFoBsqxL0KUm+DmHhlfoVNS8Yck72HiaxneQbSmltF+4PT/t+WwbFlcWEOFb7w ggfnwT8DSZYSwkP3Scm2NnsX3N4l6X+WWFsgG5mLaPQs9spQIZJidaYCe9oA57fW kuT7c9rlzyK9IvMDVxErihOI1IXDBK01yiPaWcS211iR1su2ae1J9XSfSmbEvNUC 3ynPTKigD7Yyn5IU2n7ZmH2wgeNmkfzhpkPWgBjCiVWecfmTFfkm9MKqXX42wDaI xkBhG+aJygMCEVB8i4eVd/CqWfRRG/Tysg8usZFkYvcT3aEj4WfF3bDBJjRojJ0k aPpU5ic26RwNdxV0gtQVX8IgdRJIVMbfRtdzWJlGOERcONQmCF8ePek5QEc7n3J7 Dq4YN5IPMmrDp/o8SH+u8//qfwj0goPJotDBpAFQ3m59oUnX+1hc2jkayBe1KNAD zZGH1WavWjQLlWeEGFEYWFdVM4hCNdbpl6W9CZSJkrVrCZOZsIbcSxcYlmQYh9bL tQOVH4hZ9wwvZbUSc7rUpxypJMRs+q49yhL2Ah0UQERFJTQljLj4OUb5osy6E2Ln N5ZxHhz7i7LtOIXADkkejenMWFDt03It -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/29/root.crt000066400000000000000000000042341322470703100221250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBMzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xMzA3MTAxNjAwMDFaFw0zMzA3 MTAxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk36aawkcMmYilDNV N0fuiObdvnW6CnYeLvpuY9PDUMojs6rVrvSJgNX4znqFx3djaXoeunXfxSNUA+Ec AbJHUTOYxpzUiy7hLT8zPzeoEFtcXhdEBddQ18isujcf1MvSE55MvjOpQ+4OUey5 cz8uayuarycxF6MVkFRlpYY0k8mRsUQZqzGysNrYNti5fr3T1QbMqvufAeKkYW3n Dx+0P0Ct+bmBEASnmpor5I9GFC8xocaTnhTXK+X1ruKq13d5IaMisEow6HBq0ym0 liit+d74Ul6sHt8xz1AmQzYO3m8icqFS0yKbD5CXeAS0j1y8xVXqCtUQO8aTxlEU NhR4JJqUXTmGuRiF3JMFh8eGT3dAJKt8euwK2xRBNk+Ml8in7typTq+QOrF7Cnn3 VzGVelw9YzrQR01/nBp/eiIT97ArpSNz1VjNaFNSFtHRQbon4FBwcZbLfJEGl6AL 2iEUOq8G4xq2/kpUaGffzgMyibRujBmjvWv2LeqxKH/ROcKB3Z72sgUiEoxVPIzX c/RiV5NtngQoI77gRNfiSS3NLdSKopPbVpWKk3bWDeVusmCSy9n55sgQ5KpbhN7R a5fcmEeKKNYopv9oiwZln0aRmenT5omGY9DP2evkm8KjDmseZ0maMmOfhr0unr7B bsOqOsIFNKCnPRWJxljH1+GfJLUCAQOjRTBDMB0GA1UdDgQWBBRtckHLKyFzYmEZ TALTOesDxx1T3DAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAEH2OX7BVQfzVq5wRB69SB3DNuHf1shi3HzMS22oB px2xrDzxDIisyYrlIjwMXOdA4eK1wz1MUOaPm/P7OsJpGO0gam5WoiNYIatWTcX/ ojg/ZsMm/83o1/lZKx8/oDS2SeMUIjuILawPynXwxjRAyUbLdlHo9sVbsssWEoI/ r1eG0UjDvLTnbeFlt+f85fJGv8bM1VN7Wjx+2fDpo9Vpc8CB/A6c3p+r1Omg3/zJ teLuKE+R7cekDaAQ98TQQJ4QB4kvKDB3EK2hQMKCdCohEhRD3ozemOdJpxBajlEO 6Y/UuItNRyC16+W2XzxzaCkOQbe6UBOVYPM0hQcK/CfQU9FInY6E4ULN1BDzYnbN eczSWvJbxdHUCEJixpCPdOdslbEM1wStTXxCZsUDJPSwVCYvWM7XcD5waJ5tr4S5 6EAC/EIk5EkrbeEXQSwKubE+Vs6s3lg5KUXwUP42FWv7rkSOR78F88n9X6Dz2e3h Di2uGWn3kjgxChKVmvbdF9wG+sw4CjVfBwSbHomoTKj976Y1ddmrlcla9ar9BOLi 7czP8+y0yuOFhzOC5wir897u8rTDneCIIB+qaS9AZBAffHxznP8CYBi7bXflkN+T 3YVlUVPjJZy3v2864F1oUmfqb8Qkzc5Ac7419FdemeMyihSZbdPq4phmRrwXj3vb 3TI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/30/000077500000000000000000000000001322470703100204155ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/30/end.crt000066400000000000000000000037651322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBPzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xNDA3MDkxNjAwMDFaFw0yOTA3 MDkxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA3vBOZu9D6IIvQffZ dskff1YMp/dh3K2pyLeH9O42mFPN4yYJ+MRlnZNaBBD39Xau5qNOun/n0hx+UWLM ZS0+0k4YlhZHXViXyrmkvrdYXEnQ4PeulmS3siudxxIvUfiL6d/MiO09+FV494Xp GwUNi61TQarly0q7NTn4H6o5TAMg3Esgogv20H8zLb/W0RP7adpXqGjVr6MOW8XD dy87JygMnAuNETUiujaVrLtAoyCcZpA5Ismqi3QSjOSybLITgVaQYzjHU8TvLmw1 /+tytTBACyCzlhxmdLfmYkPK57L5BL4PGvP9pCo2InjR7p2FhbmB+fQMSB7oy0Eq X9WPJQIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBRtckHLKyFzYmEZTALTOesDxx1T 3KGBjaSBijCBhzELMAkGA1UEBhMCQ04xEjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUG A1UECwweSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MTswOQYDVQQDDDJD aGluYSBQYXNzcG9ydCBDb3VudHJ5IFNpZ25pbmcgQ2VydGlmaWNhdGUgKE1hY2Fv KYIBMzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBAELBRIItoUM2 H6HkwkifbPKrswdHG8FlPSuNWTIKgp4sEx3hLpPgz5ktwchXb+B/KknlCuU3I/Vy livZLHXAvClGDhiKgyjE1/o4uJXlz8AAd+ZI4GqqefjKs0OSEKsZ0CAN66c3+GlL g9bF0UpooqcONLjBmZ+Rq6rKcQWoW0pa4iEbsYOHtIqoRmxVUQMCMdb6nzXmtp3l AZP6304Owp9/K8+fuRr4vzKeXqKrNRqSw1LgUbTzgCToIs45gB4a8rTho6BC3jUf fyTOh3CWdHRdUtpZd+gDVE0FLUhYuZeLDqzDHXOxbJ3CqnTBB3qwJXYYQ+79TqNE AXgiQcS6FpweKJS44o2mmqfPMEaKEJu9KNH5BNlkWctO1J754HaHbnygoaWTQZbI I4MrWzka/YeWMaCb+jJnR3BvHyFKfAVMe4cEhhjMLD7GEpb3ZhSyjaRfvU7O0Ive UH6hwNTPMJJKInbzUzzlqDA8psR4JgFpKKUxSpI8NCSSWp3c1GVHpi/+Dm/CH3DE jlUR+8rHVgYfteLBtG325yL9p1cBpmPJeEdvZhYav6OoDHDroxldM6/zQjEXHons jTaTvh5+SLLqo5Gqbxs7vZxe28IhpI+7t76rUQxSmmD0r4NwTCVJmW67HsVLj48s cmn2cyNGoksYev71FP4xfRdfrWndgQ6Z -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/30/root.crt000066400000000000000000000042341322470703100221150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBMzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzELMAkGA1UEBhMCQ04x EjAQBgNVBAoMCU1hY2FvIFNBUjEnMCUGA1UECwweSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MTswOQYDVQQDDDJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTAeFw0xMzA3MTAxNjAwMDFaFw0zMzA3 MTAxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk36aawkcMmYilDNV N0fuiObdvnW6CnYeLvpuY9PDUMojs6rVrvSJgNX4znqFx3djaXoeunXfxSNUA+Ec AbJHUTOYxpzUiy7hLT8zPzeoEFtcXhdEBddQ18isujcf1MvSE55MvjOpQ+4OUey5 cz8uayuarycxF6MVkFRlpYY0k8mRsUQZqzGysNrYNti5fr3T1QbMqvufAeKkYW3n Dx+0P0Ct+bmBEASnmpor5I9GFC8xocaTnhTXK+X1ruKq13d5IaMisEow6HBq0ym0 liit+d74Ul6sHt8xz1AmQzYO3m8icqFS0yKbD5CXeAS0j1y8xVXqCtUQO8aTxlEU NhR4JJqUXTmGuRiF3JMFh8eGT3dAJKt8euwK2xRBNk+Ml8in7typTq+QOrF7Cnn3 VzGVelw9YzrQR01/nBp/eiIT97ArpSNz1VjNaFNSFtHRQbon4FBwcZbLfJEGl6AL 2iEUOq8G4xq2/kpUaGffzgMyibRujBmjvWv2LeqxKH/ROcKB3Z72sgUiEoxVPIzX c/RiV5NtngQoI77gRNfiSS3NLdSKopPbVpWKk3bWDeVusmCSy9n55sgQ5KpbhN7R a5fcmEeKKNYopv9oiwZln0aRmenT5omGY9DP2evkm8KjDmseZ0maMmOfhr0unr7B bsOqOsIFNKCnPRWJxljH1+GfJLUCAQOjRTBDMB0GA1UdDgQWBBRtckHLKyFzYmEZ TALTOesDxx1T3DAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAEH2OX7BVQfzVq5wRB69SB3DNuHf1shi3HzMS22oB px2xrDzxDIisyYrlIjwMXOdA4eK1wz1MUOaPm/P7OsJpGO0gam5WoiNYIatWTcX/ ojg/ZsMm/83o1/lZKx8/oDS2SeMUIjuILawPynXwxjRAyUbLdlHo9sVbsssWEoI/ r1eG0UjDvLTnbeFlt+f85fJGv8bM1VN7Wjx+2fDpo9Vpc8CB/A6c3p+r1Omg3/zJ teLuKE+R7cekDaAQ98TQQJ4QB4kvKDB3EK2hQMKCdCohEhRD3ozemOdJpxBajlEO 6Y/UuItNRyC16+W2XzxzaCkOQbe6UBOVYPM0hQcK/CfQU9FInY6E4ULN1BDzYnbN eczSWvJbxdHUCEJixpCPdOdslbEM1wStTXxCZsUDJPSwVCYvWM7XcD5waJ5tr4S5 6EAC/EIk5EkrbeEXQSwKubE+Vs6s3lg5KUXwUP42FWv7rkSOR78F88n9X6Dz2e3h Di2uGWn3kjgxChKVmvbdF9wG+sw4CjVfBwSbHomoTKj976Y1ddmrlcla9ar9BOLi 7czP8+y0yuOFhzOC5wir897u8rTDneCIIB+qaS9AZBAffHxznP8CYBi7bXflkN+T 3YVlUVPjJZy3v2864F1oUmfqb8Qkzc5Ac7419FdemeMyihSZbdPq4phmRrwXj3vb 3TI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/31/000077500000000000000000000000001322470703100204165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/31/end.crt000066400000000000000000000030151322470703100216750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETDCCAoCgAwIBAgICALswQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTE0MDczMTA4MTY1NFoXDTI0MTAzMTE0NTk1OVowSjELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExFzAVBgNV BAMMDkRTMDIyMDE0MDczMSAxMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKC AQEAxU5IKVizI6gf0hB/NIJMyLvisUTYR62fUOrR//OJjoebi498PWLn4+tWwQpP 65XYHR5DqYcZ/Kn47uCAtdG5Ws2Sowj7KsOFinT4+6kvll+wp6Fu/2G063wkVpgt toShVuKYdCv1r2memTC5LYNIuHSWzrzPPHtXlN/IF6hok7t3pNcCbWm2bHqNlCbt d8kCv7ezl3DivYW+UUhQjibTbRery5bUKctVt5MDlRnlhD4L3vQ9gS8HjuR6pAQ5 qmgfg4DsVcBLbYNx1qJ+p7BzjIlhhUv7f5PeWOy9PMLCKRlmrsv1EmBY6mSJR5zj UcOMT3xzgXvc87qBt7Y2+1LNjQIBA6NgMF4wHwYDVR0jBBgwFoAUfAYmGuN94z/6 1hRw5au/bRR9J/AwDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIwMTQwNzMx MTcxNjAwWoEPMjAxNDEwMzEyMzU5MDBaMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZI AWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEA JydNd6NknBUxGorOmSuY1lrSanIkChXcvxbaOSEBGAS6vwiyYtzlHpu/L2AMnkK9 I+b9VxBA6FiZXbJd9ztRCCaz4/Z1hqbnV12p28h3MsQEMRplPrePx7lTHAFeTK2E fRnUZhAzpkoeK9+ruXZDFLeXM/N5rCmP3XFfI/+ySdEu+/PxkdQfo5egt15PFlPb hWl5o3YvwuZ73Az36S4iuPmz+uBo9yeq1ufQV2IGQqwKFTz3EA3tAeQnuxtQq5Ph ksujC9AWHw4o1W8F1susYvnIoJMH4UniEINerqBzzxtmxYkPOGAVbvpJI7+hyEnM fCr5NUKjuzQHjBFviOlXzlBvcywNAxiIhUUtzxW+dqD+rGVG7FhBhX94S+NKXK17 XJR/DyWRE7jDCc8PLfqAelln3B8BWfEozKDtrY3MhwVVmUz36N+SfJfHIrPTTG8W 0TEFLiptEZ5tngziH6dXMMpTNvRlQ9kUmHVJnv+fVPuJn3fpjWnKe4EIKy8BJYtw -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/31/root.crt000066400000000000000000000033101322470703100221100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1DCCAwigAwIBAgICAKMwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMDUzMTA4NDE1NloXDTI4MDgzMTE0NTk1OVowQDELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExDTALBgNV BAMMBENTQ0EwggGgMA0GCSqGSIb3DQEBAQUAA4IBjQAwggGIAoIBgQDH/nWcas+e p0xr3OGgYFg0z0lziSszRIEfBPVm5MXT4I+6zRpttP1rT+bOQSyJw6ceEGTDNVmC bEKKENsLXMBnPwJPRUCNtTUoOLTAx3ydLwbjyu4OxMkTXl3LnhwFZkx+aNmmmFXX ik/KiybEK60bdKzvBFffAUMwJ4dWidt4tsAsDMpzqbIskX/rUTk30EHu+oxQVfjA 8T3E/wY2Ftlw7HMQJ+Hpt+YS6FSIMxov0mOOTuASLQH0yNRT8aKreRL5Li7tIYwJ 0iymEHWs6ZAHNlRyJVrkhlzmZBMmH0n59ljd68e7RZtebcF+2/j82aYNG1QYdey3 pIYR32WR7Evpl6dVdzBDSZuJfvXU5qO7hyMrkb+AG29MUZUGMsQwQAhw2y/mGylv H3mWzOjtRqXeLLfAc1kdwrVCWqRo/HJmAyh0bRMTQq4qbZf59Bct4tXE83+pqqWn nJh7l8TGl5UQ8Z9dcWaqiOSgu6YXrKabTxTr6cEp0KSLFSY89wMVYI8CAQOjcjBw MB0GA1UdDgQWBBR8BiYa433jP/rWFHDlq79tFH0n8DAOBgNVHQ8BAf8EBAMCAQYw KwYDVR0QBCQwIoAPMjAxMzA1MzExNzQxMDBagQ8yMDE4MDUzMTIzNTkwMFowEgYD VR0TAQH/BAgwBgEB/wIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBADgilI6lg++h Ksepo0VexD4+zwQFYaygu+dpMLtd5fbyL/ewqYAPt9NReNK1m8mcl5k3isKvcOvp p36hxn+DQioBHOEruBxEsmS6yueyE6ZHOANJ0caU31+GO1g+pggmEjjzA+TxhMG8 AcJsBgquDZmLVGryb5VvbAfotXe6FwiiPtLsHzB1dYoiy1Uyu2HT8cYHRZ5l1v43 sVqhz+TcdVN+i2E/O8H/ctQYje9ePbepLRetXbiwgpOlYEY90E1XtYeRGpD+91K6 jKJv6H1PTs88wgMvtDVrPSNHCSz/xWDHylBjwR24ycYMArq6h9hdhOKsXsQHllht CA9hr362OsNfHEDxQAYfSoOCz9v13IyJBFtUY8trDVBVO7RWmChZh0OT5ocEGNW3 mAO5FRtkWQ9O8vdlPdxBkpWX9rn1B2epyPRmH78wo79Ar49d4rLSnR+M1xLt0ClO KhV8xz1D7zCkDtel4dbPmFeyCHXDE5AtgTlSGb/Sfr/gz4bwghJWVQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/32/000077500000000000000000000000001322470703100204175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/32/end.crt000066400000000000000000000030151322470703100216760ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETDCCAoCgAwIBAgICAKgwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMDUzMTA5MDYzOVoXDTIzMDgzMTE0NTk1OVowSjELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExFzAVBgNV BAMMDkRTMDMyMDEzMDUzMSAxMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKC AQEAwrT9WhsQX7umZjHzWmNJRXrLjWLXk1MvpDshDNkAK4KiP7NZPph8+Q2S6MNr 2Gz6Hxfpvhpy+mnjepgR+L5i0hMV5PFJIcq6l+5Nur2zIEypW8mw/4HjqwJukOpL eeHQY3jutDFs47OdQPEl97GoltphLb6gJug0N4pd3IN3WFYS0BfeMNGiObspRpqD wYlrTs5bZmgaVLhc144gDvfTG3Vge/GxcupAfXiqZMY12TmQUXDofnXF86SvlCVi UV2okacnz2r6jaOUKZ0Ab07eSg/C0dsCIpIZ1yxZim/ksNtn+2yfP1sSFlRqC96K RjEZZa9r3DkvF/R2S6sC8LnaxwIBA6NgMF4wHwYDVR0jBBgwFoAUfAYmGuN94z/6 1hRw5au/bRR9J/AwDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIwMTMwNTMx MTgwNjAwWoEPMjAxMzA4MzEyMzU5MDBaMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZI AWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEA sCokXkiQFEaGQVUJD+P8xLTadJrWYbsGqq+IzfjWorFaUZk1WpfX/IoSwFkdbmQd ewQ0zupK3me2N2uoe9K5aCIUc8LGN3Me3tZ7ITAn9IAA59i2fkR4b4vbBUDWCLwc mbjmAsOuSMkOKNTfQki2afU3NMENiRloefW7oVJ4yJ5vEOqMQy69QoK/HQYAxgld 6xFV6XS2zxpXMVV9Y8a8ZE9RSrp1TCmRV58RePSzhMjQaTGL4xN0gdB1S6U8831s c/5JymwNjakqAy75jKlGdLzcZlNQ3Wa53/x703dCgkUjHFQh9Wrza5byrGDJ+zY/ s/4/VjzicQtbHpTqDhIUo+bkxwoKNQpgs7KdtZQFBjSMfAqvhh37O6SQAndYxO5J POHEoZgCsKhX3A1nR3MGyzV55GqWAf/6XiG1/2FU10WL1od5fgo+5KU0LbVquR7N fYq9yz8W7MeHg2jx22/jsGKEv9azciD46S2yDrGsD5zs/DMb6tG0HC4W6MEtM74F -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/32/root.crt000066400000000000000000000033101322470703100221110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1DCCAwigAwIBAgICAKMwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMDUzMTA4NDE1NloXDTI4MDgzMTE0NTk1OVowQDELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExDTALBgNV BAMMBENTQ0EwggGgMA0GCSqGSIb3DQEBAQUAA4IBjQAwggGIAoIBgQDH/nWcas+e p0xr3OGgYFg0z0lziSszRIEfBPVm5MXT4I+6zRpttP1rT+bOQSyJw6ceEGTDNVmC bEKKENsLXMBnPwJPRUCNtTUoOLTAx3ydLwbjyu4OxMkTXl3LnhwFZkx+aNmmmFXX ik/KiybEK60bdKzvBFffAUMwJ4dWidt4tsAsDMpzqbIskX/rUTk30EHu+oxQVfjA 8T3E/wY2Ftlw7HMQJ+Hpt+YS6FSIMxov0mOOTuASLQH0yNRT8aKreRL5Li7tIYwJ 0iymEHWs6ZAHNlRyJVrkhlzmZBMmH0n59ljd68e7RZtebcF+2/j82aYNG1QYdey3 pIYR32WR7Evpl6dVdzBDSZuJfvXU5qO7hyMrkb+AG29MUZUGMsQwQAhw2y/mGylv H3mWzOjtRqXeLLfAc1kdwrVCWqRo/HJmAyh0bRMTQq4qbZf59Bct4tXE83+pqqWn nJh7l8TGl5UQ8Z9dcWaqiOSgu6YXrKabTxTr6cEp0KSLFSY89wMVYI8CAQOjcjBw MB0GA1UdDgQWBBR8BiYa433jP/rWFHDlq79tFH0n8DAOBgNVHQ8BAf8EBAMCAQYw KwYDVR0QBCQwIoAPMjAxMzA1MzExNzQxMDBagQ8yMDE4MDUzMTIzNTkwMFowEgYD VR0TAQH/BAgwBgEB/wIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBADgilI6lg++h Ksepo0VexD4+zwQFYaygu+dpMLtd5fbyL/ewqYAPt9NReNK1m8mcl5k3isKvcOvp p36hxn+DQioBHOEruBxEsmS6yueyE6ZHOANJ0caU31+GO1g+pggmEjjzA+TxhMG8 AcJsBgquDZmLVGryb5VvbAfotXe6FwiiPtLsHzB1dYoiy1Uyu2HT8cYHRZ5l1v43 sVqhz+TcdVN+i2E/O8H/ctQYje9ePbepLRetXbiwgpOlYEY90E1XtYeRGpD+91K6 jKJv6H1PTs88wgMvtDVrPSNHCSz/xWDHylBjwR24ycYMArq6h9hdhOKsXsQHllht CA9hr362OsNfHEDxQAYfSoOCz9v13IyJBFtUY8trDVBVO7RWmChZh0OT5ocEGNW3 mAO5FRtkWQ9O8vdlPdxBkpWX9rn1B2epyPRmH78wo79Ar49d4rLSnR+M1xLt0ClO KhV8xz1D7zCkDtel4dbPmFeyCHXDE5AtgTlSGb/Sfr/gz4bwghJWVQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/33/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/33/end.crt000066400000000000000000000030151322470703100216770ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETDCCAoCgAwIBAgICALEwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTE0MDIxMzA5MTAyN1oXDTI0MDUxMzE0NTk1OVowSjELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExFzAVBgNV BAMMDkRTRFIyMDE0MDIxMyAxMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKC AQEAycuo3EvnPX2XqHQ//AXb3z9YIfi3xDIbrW0XoqAHAZ8pCvI0AbVGCD4PuIP0 Ixz5HF+9hHhmm3qV1+1lFpDVwDLFla0YXSPcbTRPekaUC70uoW3ZcZ2hxwS2mFF1 3kZap1MX5vXuKPSJb6LezEudvB3L4P7xW1wkVWMxQliKPGFWhTv1F6v3bZszT+ni c18atmrj6VydZWeCZfmgWqEF2uPoep4ey3KHmOzQOOpJTwb3z7UER5nySArpcq0F ud8XH1zj1FZ4J+HIqHsByvyFEgP7xXt4eDTI5skJSmTo+JnTZu02W5BTjEavUm1j H/l6Cxxk3w/lxd88Xv/0xakQJQIBA6NgMF4wHwYDVR0jBBgwFoAUfAYmGuN94z/6 1hRw5au/bRR9J/AwDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIwMTQwMjEz MTgxMDAwWoEPMjAxNDA1MTMyMzU5MDBaMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZI AWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEA djH6jsVQocTA9LJdH8jWeKKHwA787GtF1taFvOrsLEHC0T++9ODEKDfQbFkDCO8H 7rzLMxtjRKfZIYwHOQ5bqu/FUZwJYelhZzHk8R0eJOyiRDNX9Trs4eIyVhWE9Hjf /cYCJe/yd0KGWBIu/UhBZ/c68InyD1IRGqymFCFNP6ekKO01noxyoEvj1GM7iy08 VdyCPgpylYkChwF7vC3wWcm2aKEcQFsjJa3ewNmLxsUQen50+4Vzd6pZ1SAztgHA UmfCA5GusFAsClHbSOBcWNx0/cbcQUM7fwYmhpeTbdM4qvHJfea/qqeiTZqnCP2i RbFQDwnnVv4GCkguf0eq0YkR3NVSiZm1c2QgSDdT+nX77BwxxQlRREmO57vCvZ7I y8z95ip02cgrcDGmNCTaQZ4BUbjFVTbW3ESfMY/tLc0LrfJDvP5q3HcqQZ7TdbZa lxkcS28PLQHRUUSpgE/ehrR83iqJDcfEmTNf6NZPDt0n+BzgWcXwcBnDiWewk3/7 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/33/root.crt000066400000000000000000000033101322470703100221120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1DCCAwigAwIBAgICAKMwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMDUzMTA4NDE1NloXDTI4MDgzMTE0NTk1OVowQDELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExDTALBgNV BAMMBENTQ0EwggGgMA0GCSqGSIb3DQEBAQUAA4IBjQAwggGIAoIBgQDH/nWcas+e p0xr3OGgYFg0z0lziSszRIEfBPVm5MXT4I+6zRpttP1rT+bOQSyJw6ceEGTDNVmC bEKKENsLXMBnPwJPRUCNtTUoOLTAx3ydLwbjyu4OxMkTXl3LnhwFZkx+aNmmmFXX ik/KiybEK60bdKzvBFffAUMwJ4dWidt4tsAsDMpzqbIskX/rUTk30EHu+oxQVfjA 8T3E/wY2Ftlw7HMQJ+Hpt+YS6FSIMxov0mOOTuASLQH0yNRT8aKreRL5Li7tIYwJ 0iymEHWs6ZAHNlRyJVrkhlzmZBMmH0n59ljd68e7RZtebcF+2/j82aYNG1QYdey3 pIYR32WR7Evpl6dVdzBDSZuJfvXU5qO7hyMrkb+AG29MUZUGMsQwQAhw2y/mGylv H3mWzOjtRqXeLLfAc1kdwrVCWqRo/HJmAyh0bRMTQq4qbZf59Bct4tXE83+pqqWn nJh7l8TGl5UQ8Z9dcWaqiOSgu6YXrKabTxTr6cEp0KSLFSY89wMVYI8CAQOjcjBw MB0GA1UdDgQWBBR8BiYa433jP/rWFHDlq79tFH0n8DAOBgNVHQ8BAf8EBAMCAQYw KwYDVR0QBCQwIoAPMjAxMzA1MzExNzQxMDBagQ8yMDE4MDUzMTIzNTkwMFowEgYD VR0TAQH/BAgwBgEB/wIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBADgilI6lg++h Ksepo0VexD4+zwQFYaygu+dpMLtd5fbyL/ewqYAPt9NReNK1m8mcl5k3isKvcOvp p36hxn+DQioBHOEruBxEsmS6yueyE6ZHOANJ0caU31+GO1g+pggmEjjzA+TxhMG8 AcJsBgquDZmLVGryb5VvbAfotXe6FwiiPtLsHzB1dYoiy1Uyu2HT8cYHRZ5l1v43 sVqhz+TcdVN+i2E/O8H/ctQYje9ePbepLRetXbiwgpOlYEY90E1XtYeRGpD+91K6 jKJv6H1PTs88wgMvtDVrPSNHCSz/xWDHylBjwR24ycYMArq6h9hdhOKsXsQHllht CA9hr362OsNfHEDxQAYfSoOCz9v13IyJBFtUY8trDVBVO7RWmChZh0OT5ocEGNW3 mAO5FRtkWQ9O8vdlPdxBkpWX9rn1B2epyPRmH78wo79Ar49d4rLSnR+M1xLt0ClO KhV8xz1D7zCkDtel4dbPmFeyCHXDE5AtgTlSGb/Sfr/gz4bwghJWVQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/34/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/34/end.crt000066400000000000000000000030151322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETDCCAoCgAwIBAgICAK8wQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMTExOTEwMDEzMloXDTI0MDIxOTE0NTk1OVowSjELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExFzAVBgNV BAMMDkRTMDMyMDEzMTExOSAxMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKC AQEA0ed/CTeGnve7ELXE2sM/+1I3sF8gnVwBqx8dHQu0uGod2I8FUAuTrhnY3OtN Lo/iSyFFjrVdhnNnoZd92kmONkEUYHddOzaBLlpw2Ay3E6E5MAvkXa58DnIf81m3 um6QXrsHsuKrhIoEUunt3GK8SnsLIXErpFyMyEZy+DZIY3WcFsT3kheS0ChSM4+c OxcFMYdQri2xK0iCGBcesX9TBvgnKzQpYEqAqH8Q81DIpM6DPtZJD2GbVTlgHP2B u5EAOTcrdWUUdkLNCjy43BweGYROq5+Qaed+KuJAeaCVnbowQte6EKV9jwps7p7o pFZmbbjBQ/MSnflc6u+iyKwMRwIBA6NgMF4wHwYDVR0jBBgwFoAUfAYmGuN94z/6 1hRw5au/bRR9J/AwDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIwMTMxMTE5 MTkwMTAwWoEPMjAxNDAyMTkyMzU5MDBaMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZI AWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEA Y+27feE2moGjqonS7Mlkob5fw4Yl5YbM/I4PlO+NKUot7AzwZ167zmgo/SG4TCCb QSoPJsf41Z0p3mzngbES/cyvWFAzd8ttvArGOtS3GM8KKi8JnA9O/2A23VtUdoE4 WCuU3+k7MDNjssMFM4u8nX1dSr3zfzNXE79NiaaQDR9GH+22rarBq861RGCmO4fe XOuZjKqmSWoF7Bwx2JCMNfkv7xeYu47kGw+8giZIiLHDf/V0bP46tR1nnJlgzP7X UM95UK/IOwYjCG9yQxoHVXEFqueihtIvQrXiKsMSIY7cug3dzXBNxw7GGLr4JZZG XSwW8p1zalGuEk2sB79tNzLZdLMDZjm3dmENwEPtrsQCvfc0zCIjr6phIKAHgg8j 6lmdSBH0PWkN4z61Gi0pMcM4jpw+nAjA84tUnN8nrj2y0J100HhRYYkRUgeJb6WM xnPz1hwFV4nKECVCEx/Xmx7+GAuh4VQIRaxA4yoF6RIrXvPrlmw6A1J98HMbUNLq -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/34/root.crt000066400000000000000000000033101322470703100221130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1DCCAwigAwIBAgICAKMwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMDUzMTA4NDE1NloXDTI4MDgzMTE0NTk1OVowQDELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExDTALBgNV BAMMBENTQ0EwggGgMA0GCSqGSIb3DQEBAQUAA4IBjQAwggGIAoIBgQDH/nWcas+e p0xr3OGgYFg0z0lziSszRIEfBPVm5MXT4I+6zRpttP1rT+bOQSyJw6ceEGTDNVmC bEKKENsLXMBnPwJPRUCNtTUoOLTAx3ydLwbjyu4OxMkTXl3LnhwFZkx+aNmmmFXX ik/KiybEK60bdKzvBFffAUMwJ4dWidt4tsAsDMpzqbIskX/rUTk30EHu+oxQVfjA 8T3E/wY2Ftlw7HMQJ+Hpt+YS6FSIMxov0mOOTuASLQH0yNRT8aKreRL5Li7tIYwJ 0iymEHWs6ZAHNlRyJVrkhlzmZBMmH0n59ljd68e7RZtebcF+2/j82aYNG1QYdey3 pIYR32WR7Evpl6dVdzBDSZuJfvXU5qO7hyMrkb+AG29MUZUGMsQwQAhw2y/mGylv H3mWzOjtRqXeLLfAc1kdwrVCWqRo/HJmAyh0bRMTQq4qbZf59Bct4tXE83+pqqWn nJh7l8TGl5UQ8Z9dcWaqiOSgu6YXrKabTxTr6cEp0KSLFSY89wMVYI8CAQOjcjBw MB0GA1UdDgQWBBR8BiYa433jP/rWFHDlq79tFH0n8DAOBgNVHQ8BAf8EBAMCAQYw KwYDVR0QBCQwIoAPMjAxMzA1MzExNzQxMDBagQ8yMDE4MDUzMTIzNTkwMFowEgYD VR0TAQH/BAgwBgEB/wIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBADgilI6lg++h Ksepo0VexD4+zwQFYaygu+dpMLtd5fbyL/ewqYAPt9NReNK1m8mcl5k3isKvcOvp p36hxn+DQioBHOEruBxEsmS6yueyE6ZHOANJ0caU31+GO1g+pggmEjjzA+TxhMG8 AcJsBgquDZmLVGryb5VvbAfotXe6FwiiPtLsHzB1dYoiy1Uyu2HT8cYHRZ5l1v43 sVqhz+TcdVN+i2E/O8H/ctQYje9ePbepLRetXbiwgpOlYEY90E1XtYeRGpD+91K6 jKJv6H1PTs88wgMvtDVrPSNHCSz/xWDHylBjwR24ycYMArq6h9hdhOKsXsQHllht CA9hr362OsNfHEDxQAYfSoOCz9v13IyJBFtUY8trDVBVO7RWmChZh0OT5ocEGNW3 mAO5FRtkWQ9O8vdlPdxBkpWX9rn1B2epyPRmH78wo79Ar49d4rLSnR+M1xLt0ClO KhV8xz1D7zCkDtel4dbPmFeyCHXDE5AtgTlSGb/Sfr/gz4bwghJWVQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/35/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/35/end.crt000066400000000000000000000030151322470703100217010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETDCCAoCgAwIBAgICANQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTE1MTIxODA3MzQ1NloXDTI2MDMxODE0NTk1OVowSjELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExFzAVBgNV BAMMDkRTMDEyMDE1MTIxOCAxMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKC AQEAwDkxZoGpGpzuoDswDUC04ZjxHPBkgeVzxh/fltn70ynnrwMwGeGMVPQX5Hul 7Ft1PZh098A0J/GCoTq1jTXPWuZEwb6gqP3fj47C4COEAzhzCW4XVsGB0le7J6Sf wHLxh4FVJc+/rMxTsNlAKtSJcRky+yagBMg1ItY/1UN3JHNCsi6p61/NnGp7lpZQ hsziQ1uC76YlZsOXT5v9a4YANRsgMNcr83NzQjTa7AL5Czl0uKvhDevsODtnwPXT yQNGA+Ryjh90lalP8zNXsm0AscZXWePvfhgcFU1naFMILJ35ktBLQq0CM+qTHgGA Ds4AKbk3zIZEgRRE+bM/sYuR2wIBA6NgMF4wHwYDVR0jBBgwFoAUfAYmGuN94z/6 1hRw5au/bRR9J/AwDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIwMTUxMjE4 MTYzNDAwWoEPMjAxNjAzMTgyMzU5MDBaMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZI AWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEA OQWySbwmUxl/wWc6bV1wPv439/EJum5niSRD3WKOCJ2unQi021JZ0H9r2AwzDjqh 7fiiy7+7PCWoglePybhOrQMY+RIUEpEPq8B3oqDZhZo2ee50zICIAp1sU441oV0k aeuqAXCu/LxEsCq7+YrjXW1+QR9uAO2vV8ZlUzJZYYgDrbX/A7vuZDHkHa2U/ypT 7TrwHuk9bu5zViVNlBaF3L0yrqDfYjmgxFEo+SkchCXYuQ34SBqL7RV63r8vR9Ut ++ETcWrqeYuVY1l/ahOHHF5WYyOW9zTUCNZCGEOHlYa/zTV0e9OEVW5hOJhdzUg6 8/hlUzQmzF17dp+jIRXTYEaTof/sGyfFT7gmAw3V4i0FzUz+d2jEFU0mZkyzVYON 5CV1RPTUx7UeWlPLua/mr6mpTNM0Rl6UItLObMp2oldmXULP3B13lI5hNwt6Ej25 DDGmofO39BD+YH275cF4HDUk5yLFzt/ab6qnNk998MNglPKV8yLaWEEdbEW9Fs7c -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/35/root.crt000066400000000000000000000033101322470703100221140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1DCCAwigAwIBAgICAKMwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMEAxCzAJBgNVBAYT AktSMRMwEQYDVQQKDApHb3Zlcm5tZW50MQ0wCwYDVQQLDARNT0ZBMQ0wCwYDVQQD DARDU0NBMB4XDTEzMDUzMTA4NDE1NloXDTI4MDgzMTE0NTk1OVowQDELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDTALBgNVBAsMBE1PRkExDTALBgNV BAMMBENTQ0EwggGgMA0GCSqGSIb3DQEBAQUAA4IBjQAwggGIAoIBgQDH/nWcas+e p0xr3OGgYFg0z0lziSszRIEfBPVm5MXT4I+6zRpttP1rT+bOQSyJw6ceEGTDNVmC bEKKENsLXMBnPwJPRUCNtTUoOLTAx3ydLwbjyu4OxMkTXl3LnhwFZkx+aNmmmFXX ik/KiybEK60bdKzvBFffAUMwJ4dWidt4tsAsDMpzqbIskX/rUTk30EHu+oxQVfjA 8T3E/wY2Ftlw7HMQJ+Hpt+YS6FSIMxov0mOOTuASLQH0yNRT8aKreRL5Li7tIYwJ 0iymEHWs6ZAHNlRyJVrkhlzmZBMmH0n59ljd68e7RZtebcF+2/j82aYNG1QYdey3 pIYR32WR7Evpl6dVdzBDSZuJfvXU5qO7hyMrkb+AG29MUZUGMsQwQAhw2y/mGylv H3mWzOjtRqXeLLfAc1kdwrVCWqRo/HJmAyh0bRMTQq4qbZf59Bct4tXE83+pqqWn nJh7l8TGl5UQ8Z9dcWaqiOSgu6YXrKabTxTr6cEp0KSLFSY89wMVYI8CAQOjcjBw MB0GA1UdDgQWBBR8BiYa433jP/rWFHDlq79tFH0n8DAOBgNVHQ8BAf8EBAMCAQYw KwYDVR0QBCQwIoAPMjAxMzA1MzExNzQxMDBagQ8yMDE4MDUzMTIzNTkwMFowEgYD VR0TAQH/BAgwBgEB/wIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBADgilI6lg++h Ksepo0VexD4+zwQFYaygu+dpMLtd5fbyL/ewqYAPt9NReNK1m8mcl5k3isKvcOvp p36hxn+DQioBHOEruBxEsmS6yueyE6ZHOANJ0caU31+GO1g+pggmEjjzA+TxhMG8 AcJsBgquDZmLVGryb5VvbAfotXe6FwiiPtLsHzB1dYoiy1Uyu2HT8cYHRZ5l1v43 sVqhz+TcdVN+i2E/O8H/ctQYje9ePbepLRetXbiwgpOlYEY90E1XtYeRGpD+91K6 jKJv6H1PTs88wgMvtDVrPSNHCSz/xWDHylBjwR24ycYMArq6h9hdhOKsXsQHllht CA9hr362OsNfHEDxQAYfSoOCz9v13IyJBFtUY8trDVBVO7RWmChZh0OT5ocEGNW3 mAO5FRtkWQ9O8vdlPdxBkpWX9rn1B2epyPRmH78wo79Ar49d4rLSnR+M1xLt0ClO KhV8xz1D7zCkDtel4dbPmFeyCHXDE5AtgTlSGb/Sfr/gz4bwghJWVQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/36/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/36/end.crt000066400000000000000000000036301322470703100217050ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFbTCCAyGgAwIBAgIESULI4zBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xNTExMTcxNDUwMzhaFw0yNjA1MTcxNTIwMzhaMDgxCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzENMAsGA1UEAwwERFMw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALoGmRjMB7q4YvpDqdan odZclrtf2EmRWaRSZypxefgAKQqlr8hUEZaAWb7o8OR9EmeqKyir0oyfZfRFOIIU oguFBN+/L/6jZKVVEjBMoZpgBs7L8Ufkou8TUuNY5HYeoffWJIT2tgCHVqdRr3uF mOeWzLilwh8uLqguucyzeFlx8vvzAOCC23s4f5Fncog4TOkgbAm7OCYFW/iM0bB0 LkXkM3xFuqGHz227dOOLShgSROkXUfGjSyAVD8myu8hmPn/Sw0iKc4g0mxcU64pp ls5GFDp2jNaY18+pB24cOMf/lP3xblW5iYEm1GxqyHBz21acEJUu9CBKvtZnKIYq uH8CAwEAAaOCAQ4wggEKMA4GA1UdDwEB/wQEAwIHgDAVBgdngQgBAQYCBAowCAIB ADEDEwFQMDkGA1UdEgQyMDCkEDAOMQwwCgYDVQQHDANDQU6GHGh0dHA6Ly93d3cu cGFzc3BvcnRjYW5hZGEuY2EwOQYDVR0RBDIwMKQQMA4xDDAKBgNVBAcMA0NBToYc aHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTArBgNVHRAEJDAigA8yMDE1MTEx NzE0NTAzOFqBDzIwMTYwNDE4MjMyMDM4WjAfBgNVHSMEGDAWgBSMjpdpRn6tBofb vfhe5ubFyS8HIjAdBgNVHQ4EFgQUAL74agAkgOrvgpuaSzuR2/E5ifYwQQYJKoZI hvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgB ZQMEAgEFAKIDAgEgA4ICAQCbcB3ESG6A0uX6pOxetmF0Giupoybpi5n0kt/N25k9 6ii5tsoH/gb0/EsKfXbgUY32kEr8fEf2yPU+dgsyQsG31qwnRfM/LDZflL4lrPBC 12ltZa+RydEnz7AyH9l7xdch/24RL/ShOfhQCST1i+Kz3q5h06T9RjMYIhXa872u ommz5Y7qJULCbCDD91aP+3e9pFH+m01gka3f3b7RJlN5YkDnnMcJtawOVb4Y0fIZ +QMiZUhLL36ebHPIeJH00/DFuo09R7eA4G6AVkDeWKuR/84GpjV+ogpvXNuYPr+i jRCH2JJtCGTKWpDv3cdzRsTSl3paHpSnKh7VCUOHoKgcAYTIhV1WrX0ycHGNCu5t Xo4YmWOzkeFig2Oj8WQtAb9pR2VM/B79j2jVqmhLwv2TGa2VbjmT/gmhU9cTauGR TaW4IMpEnU2t5OJoa6T9KcQSmmlYn/nghNg0q9ClAZO8Kaqv75FI0OZXAjTtHE1z PMGT+/OCC/oVtSJ+nin8ieoAkdH2WZNs5JzRdu2msB+aWd0otKeJS8ttl17tXTPm 7LyxY1Vw0jTsrpD9Mm9ZgWJCHBhYxhAnH3KGW5uQnbGFsYseoiwx+hFJtT5QZLZM hptRsCleOCVMtARyNWGSeM3vQWyQt3v0eULIh4HgADuMu0yuQywSGNPMV3G4mhJj uA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/36/root.crt000066400000000000000000000043651322470703100221300ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGcTCCBCWgAwIBAgIESULC/DBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xMjEyMDUxNTU3MzdaFw0yODA2MDUxNjI3MzdaMD8xCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzEUMBIGA1UEAwwLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDL5DZMQCWD 1k+MnU07pU6+p0sixT1s625/XxUQCgQtWpxDBMIYd8llqZnBsy/leHjZfzuNqMro dCHg3BjqpWLLEIXsEOsU7TpG/qx6dBTQEq3Z69ZPnuGhwmHFHkRxBqJd1ZNKsP3i nTQ7QhGZKp7zB+6kUW9Mi7lfhPovp3UVx5fUce3eCKZ7J08qLQiY/nc+jI+iqVhE Auvy7q/Wy3j2hVJCdll2x5YAKolONxILgn42FCCMZxADCEXAo04h/Lsi1cPJ1veS zTYKFc+vKW6VqFsEuw5mUkJMTk/JI2/vsV9SEucSCDpFMUeJrS1YeSd4f1nzZIHM ccSdqkDFR4ievIU0+D3gUADtCq1TZYbjemqQVf1xEGniCuK4Q73qksL+th+ffsFq yIeQpfzYLF4YC6ICrBsQiPv8vi2pMHj+BTtOaGtTeF5dSwiJ+NanVVokKUJnXtD1 Zwrx/UQJUC9+HcSFTooKGidYG9DDJn45BSTc9LLbo4oBfjLT9k4pyqNYOS5niOjH ue3ZRzUDeAfwMMpatorm82ElbEGWTU+HFadMmR2HZk+e0XzYnpY9pdYpBfO38P6o V1g1j5Iei8p5d+yDWrIZCxyd7X80Vy9cGfVTY2ljd3uBXCXt1VZWenaRRyX4QQcH RUr/Eu4/WoBIHHMeofPv1mZf3Lmm+V0FnQIDAQABo4IBCzCCAQcwEgYDVR0TAQH/ BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOQYDVR0SBDIwMKQQMA4xDDAKBgNV BAcMA0NBToYcaHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTA5BgNVHREEMjAw pBAwDjEMMAoGA1UEBwwDQ0FOhhxodHRwOi8vd3d3LnBhc3Nwb3J0Y2FuYWRhLmNh MCsGA1UdEAQkMCKADzIwMTIxMjA1MTU1NzM3WoEPMjAxNzExMjEwNDI3MzdaMB8G A1UdIwQYMBaAFIyOl2lGfq0Gh9u9+F7m5sXJLwciMB0GA1UdDgQWBBSMjpdpRn6t Bofbvfhe5ubFyS8HIjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRww GgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggIBAKk/X412wl6IoRZ9 Q+jUbYjLlv9gvs+xzCPJIgpeCgqQ4QWUaOmC0Dyy0VAOWA1chF9kMkL/q305Ejz9 biP0J7ImzgvpkYZo26wGiP0X/m8yyiT2wo3tIdWlG/2C6av9BxZotmZqvXZcRMfs C9Do6ELxe5PLRCVmFwODhPasIfyrLuaTx8nEbTCeUwWyTSD5TodyQjOOnijywKu+ hV6d1Fh60u7AtNxOGSUTyQzfkhNYtWtY5vD/zOYnYDtPUL70pVV6kHC/OF8iSPS5 iM0+DS+vKAOXclQxKqPcRnOsJ9Zy2svcBCvCgVOO3QMb+m90s59AQQGeZDGVVI5s LsJ3Q6o+AgoDz1v7mXiVkAqYj3ZLMhiWf6/o1I4A8b9Dw8fUKdd+LF5NPjhhUrZG +/KxvCjYhtwcyw01QHl9VZY4yNywfuI+hXomZHXBKhKFBorISM9gwyMLTMVce8tw 8Pfyd/Vk57Hq+FAhzH9TgyyTADaBEmiAlnyZA3Xg4LKsY+7SXMRtVzYwWVB+9ohI lj5Ub/G8MHmT2IujyuEyNCHokrrvlYQzn3ORYAtRbplAH1fGLwH43I/shqqcYGRt bnL9d29vwYnQ1qBiM8yBslZCS/2nKS5jMCZFUobL1e31eW5t03R7eSFwDHCw4aZV Q5qDALmOAOGWdakTLnfOMdiGBqGB -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/37/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/37/end.crt000066400000000000000000000036301322470703100217060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFbTCCAyGgAwIBAgIESULGxzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xNDA4MDgxNjU4NDVaFw0yNTAyMDgxNzI4NDVaMDgxCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzENMAsGA1UEAwwERFMw NTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJMw/4rhXQlmVS6j92eM JCHAf3hR8qp3X3MrDhoR7pxiqGyRsNWtE5cdx79fM1mkIzUKPCyGlUcwKigAQbpE cBCiUqvu55DznABk4IWY7b4FyhnvEfGN4xVUQLyOdJWdS0B12xlS4eHW+zemEswV 6FoaC72JTIEVkxPCj7g5poAUcEzxUmOR+7eybJIFgvtEvCKbplG6TlYJ3jPMTRmO 5+l7EJqjhvSTdCfvayPaq5vuIpHn3EP8NCvlbJ9O915ie/gJ5JQ/TW6I6PafoEuz xakXyqlxxeRCwUjsEhAILtPvh6IJDcZXDvWqT8ryE6CEtnsvTLrT0UWNPlwz7PQj SJsCAwEAAaOCAQ4wggEKMA4GA1UdDwEB/wQEAwIHgDAVBgdngQgBAQYCBAowCAIB ADEDEwFQMDkGA1UdEgQyMDCkEDAOMQwwCgYDVQQHDANDQU6GHGh0dHA6Ly93d3cu cGFzc3BvcnRjYW5hZGEuY2EwOQYDVR0RBDIwMKQQMA4xDDAKBgNVBAcMA0NBToYc aHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTArBgNVHRAEJDAigA8yMDE0MDgw ODE2NTg0NVqBDzIwMTUwMTA5MDQyODQ1WjAfBgNVHSMEGDAWgBSMjpdpRn6tBofb vfhe5ubFyS8HIjAdBgNVHQ4EFgQUCgTVsbYAhBjhmpYCGSyyPOgodAAwQQYJKoZI hvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgB ZQMEAgEFAKIDAgEgA4ICAQCOLoKd5oOD4TVkqGU5N88kYLL/ntEUknmchY6rYUWs gng5WC9mB8ir8natLsaMOfJIUEYfjiOuFXg0K+nDwrYxFYQZ1IvLy4xA4P/52xru 9+zF/lz00kjbhProjVF4Z0sc7kl1o8ZsbRiy8VQ6RWOG4p0Gpa2RF5yNd9FVzMbh KsyvVa+7Zbh3O8a2qeGQK9KE5jKbru7zWtK5oUoDUeI2dHrtv4SGDn5pqbjfMuGd aueDTR5lGByae5LmrKDYFESdg6skDWa/PN26ngwQrXXrvbsP/Qya5MEzW6lpg04L WFeyRG33aVdCuHTAFvROeWU3HaIuhKX1vJqKos3J3oTHi9kBqzGqY6J0yRWhfBoA b2yGKwSi5q5bVzimnxcmSmT+nRNj1Almg30vQedqiM/Hx9aZcRLeIdybsBWvl5DP Gn5+couopTfQZIIj+y8SMnAjUlwg/iBLVZ/Zd2RUuTPthQnG4PM/HywL35zRFj6W RhgYG5OrzMxzmZiH68DIpGHp70JecuFntX7fhERtepLPn4msi2moZMQX7sAUt78w q6HzsCJ4ymCRAKr5Z46AX4/F5QuA6EvJOwvlhN9UZnx2Z6miY1SuIZvvt8yu75zG KC1jz7M6G+ahlWCRekKSZapXQQah/7Mr1ICZRUp1ASi01FDseJPP5+n3sWj4/mQr mA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/37/root.crt000066400000000000000000000043651322470703100221310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGcTCCBCWgAwIBAgIESULC/DBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xMjEyMDUxNTU3MzdaFw0yODA2MDUxNjI3MzdaMD8xCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzEUMBIGA1UEAwwLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDL5DZMQCWD 1k+MnU07pU6+p0sixT1s625/XxUQCgQtWpxDBMIYd8llqZnBsy/leHjZfzuNqMro dCHg3BjqpWLLEIXsEOsU7TpG/qx6dBTQEq3Z69ZPnuGhwmHFHkRxBqJd1ZNKsP3i nTQ7QhGZKp7zB+6kUW9Mi7lfhPovp3UVx5fUce3eCKZ7J08qLQiY/nc+jI+iqVhE Auvy7q/Wy3j2hVJCdll2x5YAKolONxILgn42FCCMZxADCEXAo04h/Lsi1cPJ1veS zTYKFc+vKW6VqFsEuw5mUkJMTk/JI2/vsV9SEucSCDpFMUeJrS1YeSd4f1nzZIHM ccSdqkDFR4ievIU0+D3gUADtCq1TZYbjemqQVf1xEGniCuK4Q73qksL+th+ffsFq yIeQpfzYLF4YC6ICrBsQiPv8vi2pMHj+BTtOaGtTeF5dSwiJ+NanVVokKUJnXtD1 Zwrx/UQJUC9+HcSFTooKGidYG9DDJn45BSTc9LLbo4oBfjLT9k4pyqNYOS5niOjH ue3ZRzUDeAfwMMpatorm82ElbEGWTU+HFadMmR2HZk+e0XzYnpY9pdYpBfO38P6o V1g1j5Iei8p5d+yDWrIZCxyd7X80Vy9cGfVTY2ljd3uBXCXt1VZWenaRRyX4QQcH RUr/Eu4/WoBIHHMeofPv1mZf3Lmm+V0FnQIDAQABo4IBCzCCAQcwEgYDVR0TAQH/ BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOQYDVR0SBDIwMKQQMA4xDDAKBgNV BAcMA0NBToYcaHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTA5BgNVHREEMjAw pBAwDjEMMAoGA1UEBwwDQ0FOhhxodHRwOi8vd3d3LnBhc3Nwb3J0Y2FuYWRhLmNh MCsGA1UdEAQkMCKADzIwMTIxMjA1MTU1NzM3WoEPMjAxNzExMjEwNDI3MzdaMB8G A1UdIwQYMBaAFIyOl2lGfq0Gh9u9+F7m5sXJLwciMB0GA1UdDgQWBBSMjpdpRn6t Bofbvfhe5ubFyS8HIjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRww GgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggIBAKk/X412wl6IoRZ9 Q+jUbYjLlv9gvs+xzCPJIgpeCgqQ4QWUaOmC0Dyy0VAOWA1chF9kMkL/q305Ejz9 biP0J7ImzgvpkYZo26wGiP0X/m8yyiT2wo3tIdWlG/2C6av9BxZotmZqvXZcRMfs C9Do6ELxe5PLRCVmFwODhPasIfyrLuaTx8nEbTCeUwWyTSD5TodyQjOOnijywKu+ hV6d1Fh60u7AtNxOGSUTyQzfkhNYtWtY5vD/zOYnYDtPUL70pVV6kHC/OF8iSPS5 iM0+DS+vKAOXclQxKqPcRnOsJ9Zy2svcBCvCgVOO3QMb+m90s59AQQGeZDGVVI5s LsJ3Q6o+AgoDz1v7mXiVkAqYj3ZLMhiWf6/o1I4A8b9Dw8fUKdd+LF5NPjhhUrZG +/KxvCjYhtwcyw01QHl9VZY4yNywfuI+hXomZHXBKhKFBorISM9gwyMLTMVce8tw 8Pfyd/Vk57Hq+FAhzH9TgyyTADaBEmiAlnyZA3Xg4LKsY+7SXMRtVzYwWVB+9ohI lj5Ub/G8MHmT2IujyuEyNCHokrrvlYQzn3ORYAtRbplAH1fGLwH43I/shqqcYGRt bnL9d29vwYnQ1qBiM8yBslZCS/2nKS5jMCZFUobL1e31eW5t03R7eSFwDHCw4aZV Q5qDALmOAOGWdakTLnfOMdiGBqGB -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/38/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/38/end.crt000066400000000000000000000036301322470703100217070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFbTCCAyGgAwIBAgIESULGojBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xNDA2MjUxMzI1MzFaFw0yNDEyMjUxMzU1MzFaMDgxCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzENMAsGA1UEAwwERFMw MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMEp6hW6+JO0lzfSXgaG ftI24gh+Pz4JrB47iTToDmQTOIq9bjQaMfdomvjC0xPsnUOnAyaN71cyW7zaDUid NGo+7iIBS5/THByhp8TC/96eUtQSNjHT43fjYFfHQYZL60dpNVKJPi2vDK6oDfLI baQTep02BMETGqncGbvk9f+v0xxC1p7anm50cIkV+V2dFI/eBVCXeErAEmRtVZ/i g+6RVc2Rj385KvmrLImkbKIBjzbearj2lPdQLAvRBCgsg55uyAaXeea3dzPQoBJ/ wY4IJ8Gpqdm6kjNL02mzAgb/d8xNb85410cYH6cgfnquM9tzbzbu/LsY8WWM5ujg jCkCAwEAAaOCAQ4wggEKMA4GA1UdDwEB/wQEAwIHgDAVBgdngQgBAQYCBAowCAIB ADEDEwFQMDkGA1UdEgQyMDCkEDAOMQwwCgYDVQQHDANDQU6GHGh0dHA6Ly93d3cu cGFzc3BvcnRjYW5hZGEuY2EwOQYDVR0RBDIwMKQQMA4xDDAKBgNVBAcMA0NBToYc aHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTArBgNVHRAEJDAigA8yMDE0MDYy NTEzMjUzMVqBDzIwMTQxMTI1MjM1NTMxWjAfBgNVHSMEGDAWgBSMjpdpRn6tBofb vfhe5ubFyS8HIjAdBgNVHQ4EFgQUCmPVagPm3WrhHG2eGoLk0C1jfSEwQQYJKoZI hvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgB ZQMEAgEFAKIDAgEgA4ICAQBPsxuoPQ4LYjC4LK/rmm8jp+cGygB699ctHaIkq2L3 HWvFKZ+FQzZboMUiFYegSOUcENwPAizsTVi1ymn/PlNBqz4VyRym3WkviN/o0dEA 13o1E1xajq1y+HcQGdsa/NpLKX26m4Ab0KVYb7gARcCOGgVAxjnQXPOQKSBcAnoK dgGgsgnEw/5UZlcBwQNAaHQT75uOE0iT1IbICABCBMSZg6w5PBmYYxHdL6APM8Gh ZcEpDc14jwiNQjRma1D0u0JCCffoMf2BLSotdWq6RtxJBy/6bqOYUAxi1gr/O11/ 6N5MkyS+CtWO9OfhAWASKTq7WhISrvrFemDFE7GYjN+QK6mPxiuvfslEYrJodrE8 uX9tPAex2wxj0h3wwYY/5p7fKOiWXbM4FvvNdthg0TmrwL2Of3yLZUWKI7qJku8m gVxjSrJxcRhkHKD0PYrx/sM+CXxzqdm0/EKqciBZB8grM5rx3h/g4durT49mvZWZ 7188YshieWFU5GnH2AAx7bwZQBVqcWzPrzGDQrIKD3LeSW2g2ybj4uLge2WH2Cja 1qBhsN5yUW0+gIiPQDO4zFTdL4TcTWQGGfkYaJLd5kQ2+xI2aoHaDNPof16LcfqN Joic30+Lt60Z7zq8tR3NqQpZFr6tMHuJ242AJlOI3rqQcPqemUKxOGILRBxpx3pg mA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/38/root.crt000066400000000000000000000043651322470703100221320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGcTCCBCWgAwIBAgIESULC/DBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xMjEyMDUxNTU3MzdaFw0yODA2MDUxNjI3MzdaMD8xCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzEUMBIGA1UEAwwLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDL5DZMQCWD 1k+MnU07pU6+p0sixT1s625/XxUQCgQtWpxDBMIYd8llqZnBsy/leHjZfzuNqMro dCHg3BjqpWLLEIXsEOsU7TpG/qx6dBTQEq3Z69ZPnuGhwmHFHkRxBqJd1ZNKsP3i nTQ7QhGZKp7zB+6kUW9Mi7lfhPovp3UVx5fUce3eCKZ7J08qLQiY/nc+jI+iqVhE Auvy7q/Wy3j2hVJCdll2x5YAKolONxILgn42FCCMZxADCEXAo04h/Lsi1cPJ1veS zTYKFc+vKW6VqFsEuw5mUkJMTk/JI2/vsV9SEucSCDpFMUeJrS1YeSd4f1nzZIHM ccSdqkDFR4ievIU0+D3gUADtCq1TZYbjemqQVf1xEGniCuK4Q73qksL+th+ffsFq yIeQpfzYLF4YC6ICrBsQiPv8vi2pMHj+BTtOaGtTeF5dSwiJ+NanVVokKUJnXtD1 Zwrx/UQJUC9+HcSFTooKGidYG9DDJn45BSTc9LLbo4oBfjLT9k4pyqNYOS5niOjH ue3ZRzUDeAfwMMpatorm82ElbEGWTU+HFadMmR2HZk+e0XzYnpY9pdYpBfO38P6o V1g1j5Iei8p5d+yDWrIZCxyd7X80Vy9cGfVTY2ljd3uBXCXt1VZWenaRRyX4QQcH RUr/Eu4/WoBIHHMeofPv1mZf3Lmm+V0FnQIDAQABo4IBCzCCAQcwEgYDVR0TAQH/ BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOQYDVR0SBDIwMKQQMA4xDDAKBgNV BAcMA0NBToYcaHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTA5BgNVHREEMjAw pBAwDjEMMAoGA1UEBwwDQ0FOhhxodHRwOi8vd3d3LnBhc3Nwb3J0Y2FuYWRhLmNh MCsGA1UdEAQkMCKADzIwMTIxMjA1MTU1NzM3WoEPMjAxNzExMjEwNDI3MzdaMB8G A1UdIwQYMBaAFIyOl2lGfq0Gh9u9+F7m5sXJLwciMB0GA1UdDgQWBBSMjpdpRn6t Bofbvfhe5ubFyS8HIjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRww GgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggIBAKk/X412wl6IoRZ9 Q+jUbYjLlv9gvs+xzCPJIgpeCgqQ4QWUaOmC0Dyy0VAOWA1chF9kMkL/q305Ejz9 biP0J7ImzgvpkYZo26wGiP0X/m8yyiT2wo3tIdWlG/2C6av9BxZotmZqvXZcRMfs C9Do6ELxe5PLRCVmFwODhPasIfyrLuaTx8nEbTCeUwWyTSD5TodyQjOOnijywKu+ hV6d1Fh60u7AtNxOGSUTyQzfkhNYtWtY5vD/zOYnYDtPUL70pVV6kHC/OF8iSPS5 iM0+DS+vKAOXclQxKqPcRnOsJ9Zy2svcBCvCgVOO3QMb+m90s59AQQGeZDGVVI5s LsJ3Q6o+AgoDz1v7mXiVkAqYj3ZLMhiWf6/o1I4A8b9Dw8fUKdd+LF5NPjhhUrZG +/KxvCjYhtwcyw01QHl9VZY4yNywfuI+hXomZHXBKhKFBorISM9gwyMLTMVce8tw 8Pfyd/Vk57Hq+FAhzH9TgyyTADaBEmiAlnyZA3Xg4LKsY+7SXMRtVzYwWVB+9ohI lj5Ub/G8MHmT2IujyuEyNCHokrrvlYQzn3ORYAtRbplAH1fGLwH43I/shqqcYGRt bnL9d29vwYnQ1qBiM8yBslZCS/2nKS5jMCZFUobL1e31eW5t03R7eSFwDHCw4aZV Q5qDALmOAOGWdakTLnfOMdiGBqGB -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/39/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/39/end.crt000066400000000000000000000036301322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFbTCCAyGgAwIBAgIESULEpzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xMzA3MDkxMzQ5MjFaFw0yNDAxMDkxNDE5MjFaMDgxCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzENMAsGA1UEAwwERFMw MzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANGkCY118wuiI4IqLAJX eUkPWi+ZAmDgFab+GEGXwnVkD1etPacY+HbDOFPgOV9gfrZiFCzIYng0e2itNw/u AEU4llfunFhDbxFkZlj9MCmIUcecb5l3JFPnViqUuNC4bfRuIgSl/F5ttkeyTkLa UR4aMusq79WDFqXspvfS9pfebc73iSi4QXyAfOCHABhqFId5IxPwoWXCRkKxeWxW G5gx1/MT34o5yabhlw11/N/RSGqrY8MAZ4vj3duc7LvLOIMjf+Xk+Oe2FfEuvASK VgmMS4u8QAUs/Nnml8hNa7tOC4dH13fYvNmmfhTjNskSqIlqaer19qoZptYnbZ3l Sf8CAwEAAaOCAQ4wggEKMA4GA1UdDwEB/wQEAwIHgDAVBgdngQgBAQYCBAowCAIB ADEDEwFQMDkGA1UdEgQyMDCkEDAOMQwwCgYDVQQHDANDQU6GHGh0dHA6Ly93d3cu cGFzc3BvcnRjYW5hZGEuY2EwOQYDVR0RBDIwMKQQMA4xDDAKBgNVBAcMA0NBToYc aHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTArBgNVHRAEJDAigA8yMDEzMDcw OTEzNDkyMVqBDzIwMTMxMjEwMDAxOTIxWjAfBgNVHSMEGDAWgBSMjpdpRn6tBofb vfhe5ubFyS8HIjAdBgNVHQ4EFgQUGj7tok74m4K0yecq73WIrUi33HwwQQYJKoZI hvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgB ZQMEAgEFAKIDAgEgA4ICAQAojBNBMN+FrHuJnMH1q1GeCBODmW43HDXKKjzPZIWy mv+LwRBUBFOVLRqcMInIIVvR1E2lH3EtuoKptmLQqUdimoT7EVAIA4SdujfWGWxt 7qZnslcZf04Rgi8iOB2EpU8P8uF54g95L7NGwUHHfO0+0tAiIm/B/pil3dlp+kjC Rx4ii3//NzrLgRlCzMKOwajCw/GmoHLedod7ZduO6eFN81InLocC1TquNWDVXlS/ IheyIDGhgmVRQU5uuH98/3GLTSQpRV03Ifv+RW3l7He1XEnCxQbbvO6haWzbrzev zxaIGerNBwKQv+AQNUREaBopRBJsuatcFpt+T74Qhh9w9tg1u31A8Y4MRL5iTepS h+TCEnwNcRZnhh6orRR3dGWP9sH47dwZpd61X0v+lgTYXZ+RDIBNBViXXK8C4tJz oxgO9rPu/fTJ9tCFkRV+UC3GDw0qOWlqP5KYLpjWyIGoIjijFn2w3Pq6XgGwV2lG TV2Fb1XE1oGZHzSSSBYhi6CzNvmFQ1swL8/i86NCqSplZrHgXlijP84KVAO/kUB5 UIwJViPGqoU9Ys2pzS8ip2pTQiAWg93UU7rooNminIOezaDBVjPAcHZe3gNZIeRf 2NqPBwvenZ8ea3b/2AUlnWJDUCK8m/oSSleZzi6IoqggunzNPRnrrPmqmVD/ZgHm /Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/39/root.crt000066400000000000000000000043651322470703100221330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGcTCCBCWgAwIBAgIESULC/DBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xMjEyMDUxNTU3MzdaFw0yODA2MDUxNjI3MzdaMD8xCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzEUMBIGA1UEAwwLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDL5DZMQCWD 1k+MnU07pU6+p0sixT1s625/XxUQCgQtWpxDBMIYd8llqZnBsy/leHjZfzuNqMro dCHg3BjqpWLLEIXsEOsU7TpG/qx6dBTQEq3Z69ZPnuGhwmHFHkRxBqJd1ZNKsP3i nTQ7QhGZKp7zB+6kUW9Mi7lfhPovp3UVx5fUce3eCKZ7J08qLQiY/nc+jI+iqVhE Auvy7q/Wy3j2hVJCdll2x5YAKolONxILgn42FCCMZxADCEXAo04h/Lsi1cPJ1veS zTYKFc+vKW6VqFsEuw5mUkJMTk/JI2/vsV9SEucSCDpFMUeJrS1YeSd4f1nzZIHM ccSdqkDFR4ievIU0+D3gUADtCq1TZYbjemqQVf1xEGniCuK4Q73qksL+th+ffsFq yIeQpfzYLF4YC6ICrBsQiPv8vi2pMHj+BTtOaGtTeF5dSwiJ+NanVVokKUJnXtD1 Zwrx/UQJUC9+HcSFTooKGidYG9DDJn45BSTc9LLbo4oBfjLT9k4pyqNYOS5niOjH ue3ZRzUDeAfwMMpatorm82ElbEGWTU+HFadMmR2HZk+e0XzYnpY9pdYpBfO38P6o V1g1j5Iei8p5d+yDWrIZCxyd7X80Vy9cGfVTY2ljd3uBXCXt1VZWenaRRyX4QQcH RUr/Eu4/WoBIHHMeofPv1mZf3Lmm+V0FnQIDAQABo4IBCzCCAQcwEgYDVR0TAQH/ BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOQYDVR0SBDIwMKQQMA4xDDAKBgNV BAcMA0NBToYcaHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTA5BgNVHREEMjAw pBAwDjEMMAoGA1UEBwwDQ0FOhhxodHRwOi8vd3d3LnBhc3Nwb3J0Y2FuYWRhLmNh MCsGA1UdEAQkMCKADzIwMTIxMjA1MTU1NzM3WoEPMjAxNzExMjEwNDI3MzdaMB8G A1UdIwQYMBaAFIyOl2lGfq0Gh9u9+F7m5sXJLwciMB0GA1UdDgQWBBSMjpdpRn6t Bofbvfhe5ubFyS8HIjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRww GgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggIBAKk/X412wl6IoRZ9 Q+jUbYjLlv9gvs+xzCPJIgpeCgqQ4QWUaOmC0Dyy0VAOWA1chF9kMkL/q305Ejz9 biP0J7ImzgvpkYZo26wGiP0X/m8yyiT2wo3tIdWlG/2C6av9BxZotmZqvXZcRMfs C9Do6ELxe5PLRCVmFwODhPasIfyrLuaTx8nEbTCeUwWyTSD5TodyQjOOnijywKu+ hV6d1Fh60u7AtNxOGSUTyQzfkhNYtWtY5vD/zOYnYDtPUL70pVV6kHC/OF8iSPS5 iM0+DS+vKAOXclQxKqPcRnOsJ9Zy2svcBCvCgVOO3QMb+m90s59AQQGeZDGVVI5s LsJ3Q6o+AgoDz1v7mXiVkAqYj3ZLMhiWf6/o1I4A8b9Dw8fUKdd+LF5NPjhhUrZG +/KxvCjYhtwcyw01QHl9VZY4yNywfuI+hXomZHXBKhKFBorISM9gwyMLTMVce8tw 8Pfyd/Vk57Hq+FAhzH9TgyyTADaBEmiAlnyZA3Xg4LKsY+7SXMRtVzYwWVB+9ohI lj5Ub/G8MHmT2IujyuEyNCHokrrvlYQzn3ORYAtRbplAH1fGLwH43I/shqqcYGRt bnL9d29vwYnQ1qBiM8yBslZCS/2nKS5jMCZFUobL1e31eW5t03R7eSFwDHCw4aZV Q5qDALmOAOGWdakTLnfOMdiGBqGB -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/40/000077500000000000000000000000001322470703100204165ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/40/end.crt000066400000000000000000000036301322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFbTCCAyGgAwIBAgIESULJLjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xNjAxMDUxNDU0MTdaFw0yNjA3MDUxNTI0MTdaMDgxCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzENMAsGA1UEAwwERFMx MDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALggS7dWg6moNWLMs4ZJ YyhX4R0YcjvZt4KkG1aExGPWmLJoYEu58QGH4/xw/z5uFGQLntsPkoREdvmH+Mb/ OxZUOPYCPOwXN/LpDg7MSfMQbgXhnB8J92MOFQUw5CA/Ev7ec1iYwGGSME2uM/mz 3zWQx3QIMZS4skRrKCgSyMnumIcCJHVbYgLjL8SWmAmyM6uxQ0nL2Ko1mVQK9OSX lGKiKApzMxMuPXKXjznqPw45BNiJDVG3mBvMAKQjBTTlJ2B+e4sjPnEZv1bTJRZk VuSg8ar/qWeOVp9o0lvCyUSAM6cE4+zOzSHX1Nzy8obDTSuYZubNLRFYasfZAKGv HcUCAwEAAaOCAQ4wggEKMA4GA1UdDwEB/wQEAwIHgDAVBgdngQgBAQYCBAowCAIB ADEDEwFQMDkGA1UdEgQyMDCkEDAOMQwwCgYDVQQHDANDQU6GHGh0dHA6Ly93d3cu cGFzc3BvcnRjYW5hZGEuY2EwOQYDVR0RBDIwMKQQMA4xDDAKBgNVBAcMA0NBToYc aHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTArBgNVHRAEJDAigA8yMDE2MDEw NTE0NTQxN1qBDzIwMTYwNjA2MjMyNDE3WjAfBgNVHSMEGDAWgBSMjpdpRn6tBofb vfhe5ubFyS8HIjAdBgNVHQ4EFgQUGlKToS9QECMlYKFCZ12AIMioXd8wQQYJKoZI hvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgB ZQMEAgEFAKIDAgEgA4ICAQAP5WX+DuZZcAM+ONvMz8oJ571W3cbnCSNwqzPFnnLR YMWKGx4O0wj9WbshF6VsNe+BzthL+mGyoGS8BSxYCT1JmRUNlTDITdZisNnSpjBg c2RKBIZy4Cjca7MeDY0ZtTQRvyXx792kNCFHm+othSSWWstARub4qKyywQ7wnQgF y72zsCpSNcToM92ZiUB9nBGYul4oE+QN1ejsGcyZ1NSDIAUKFwY1lwFmf2XAEV/t tdWfU7vlZrvGDgrUGmO0DFiPtCGUllU0ZnnbJfzeRmYlGhwXypmNfKHIN/drHHWd pBpT0seRi6FpvCN1qxy9WaYraUDdNHactivWwoFOAHY7m0NTx67/YfHWQC3mSAui 3a06FR36HIESgL9QfBzQhivi8dvqjfmQHuX8LgqrDf/6wRpjUey4K0UQhaXCiJmX yVvYDSuhSudKjHKtDed7NELq8AklEvgz1UONDZtYC6xA/cpuwgMZ8/9QswIkAE6A ceOl+lLdmNFcroZFqEiPhLjlwokAVzJ25EAdOtx2WhNOvQItisuxlKkWm23OPz0i Cuj/JmN5nxY/nrSKcOWhVBHRxjBOga2VEg/IOOSTfqiv02b0UOOF3PnOxnChkpZw kGErE1NiRlIO6VZRCGQN5Ix84iUM9OJMRoyRUmR889kxHy8njNGuQSVO+RIXc0Pp oA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/40/root.crt000066400000000000000000000043651322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGcTCCBCWgAwIBAgIESULC/DBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwPzELMAkGA1UE BhMCQ0ExCzAJBgNVBAoMAmdjMQ0wCwYDVQQLDARwcHRjMRQwEgYDVQQDDAtjc2Nh LWNhbmFkYTAeFw0xMjEyMDUxNTU3MzdaFw0yODA2MDUxNjI3MzdaMD8xCzAJBgNV BAYTAkNBMQswCQYDVQQKDAJnYzENMAsGA1UECwwEcHB0YzEUMBIGA1UEAwwLY3Nj YS1jYW5hZGEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDL5DZMQCWD 1k+MnU07pU6+p0sixT1s625/XxUQCgQtWpxDBMIYd8llqZnBsy/leHjZfzuNqMro dCHg3BjqpWLLEIXsEOsU7TpG/qx6dBTQEq3Z69ZPnuGhwmHFHkRxBqJd1ZNKsP3i nTQ7QhGZKp7zB+6kUW9Mi7lfhPovp3UVx5fUce3eCKZ7J08qLQiY/nc+jI+iqVhE Auvy7q/Wy3j2hVJCdll2x5YAKolONxILgn42FCCMZxADCEXAo04h/Lsi1cPJ1veS zTYKFc+vKW6VqFsEuw5mUkJMTk/JI2/vsV9SEucSCDpFMUeJrS1YeSd4f1nzZIHM ccSdqkDFR4ievIU0+D3gUADtCq1TZYbjemqQVf1xEGniCuK4Q73qksL+th+ffsFq yIeQpfzYLF4YC6ICrBsQiPv8vi2pMHj+BTtOaGtTeF5dSwiJ+NanVVokKUJnXtD1 Zwrx/UQJUC9+HcSFTooKGidYG9DDJn45BSTc9LLbo4oBfjLT9k4pyqNYOS5niOjH ue3ZRzUDeAfwMMpatorm82ElbEGWTU+HFadMmR2HZk+e0XzYnpY9pdYpBfO38P6o V1g1j5Iei8p5d+yDWrIZCxyd7X80Vy9cGfVTY2ljd3uBXCXt1VZWenaRRyX4QQcH RUr/Eu4/WoBIHHMeofPv1mZf3Lmm+V0FnQIDAQABo4IBCzCCAQcwEgYDVR0TAQH/ BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwOQYDVR0SBDIwMKQQMA4xDDAKBgNV BAcMA0NBToYcaHR0cDovL3d3dy5wYXNzcG9ydGNhbmFkYS5jYTA5BgNVHREEMjAw pBAwDjEMMAoGA1UEBwwDQ0FOhhxodHRwOi8vd3d3LnBhc3Nwb3J0Y2FuYWRhLmNh MCsGA1UdEAQkMCKADzIwMTIxMjA1MTU1NzM3WoEPMjAxNzExMjEwNDI3MzdaMB8G A1UdIwQYMBaAFIyOl2lGfq0Gh9u9+F7m5sXJLwciMB0GA1UdDgQWBBSMjpdpRn6t Bofbvfhe5ubFyS8HIjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRww GgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggIBAKk/X412wl6IoRZ9 Q+jUbYjLlv9gvs+xzCPJIgpeCgqQ4QWUaOmC0Dyy0VAOWA1chF9kMkL/q305Ejz9 biP0J7ImzgvpkYZo26wGiP0X/m8yyiT2wo3tIdWlG/2C6av9BxZotmZqvXZcRMfs C9Do6ELxe5PLRCVmFwODhPasIfyrLuaTx8nEbTCeUwWyTSD5TodyQjOOnijywKu+ hV6d1Fh60u7AtNxOGSUTyQzfkhNYtWtY5vD/zOYnYDtPUL70pVV6kHC/OF8iSPS5 iM0+DS+vKAOXclQxKqPcRnOsJ9Zy2svcBCvCgVOO3QMb+m90s59AQQGeZDGVVI5s LsJ3Q6o+AgoDz1v7mXiVkAqYj3ZLMhiWf6/o1I4A8b9Dw8fUKdd+LF5NPjhhUrZG +/KxvCjYhtwcyw01QHl9VZY4yNywfuI+hXomZHXBKhKFBorISM9gwyMLTMVce8tw 8Pfyd/Vk57Hq+FAhzH9TgyyTADaBEmiAlnyZA3Xg4LKsY+7SXMRtVzYwWVB+9ohI lj5Ub/G8MHmT2IujyuEyNCHokrrvlYQzn3ORYAtRbplAH1fGLwH43I/shqqcYGRt bnL9d29vwYnQ1qBiM8yBslZCS/2nKS5jMCZFUobL1e31eW5t03R7eSFwDHCw4aZV Q5qDALmOAOGWdakTLnfOMdiGBqGB -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/41/000077500000000000000000000000001322470703100204175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/41/end.crt000066400000000000000000000042601322470703100217010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGPjCCA/KgAwIBAgIILrLXpQDZfIQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE0MTAzMTExMzczMloXDTIw MTAwNTExMzczMlowezEjMCEGA1UEAwwaU3dlZGlzaCBSUCBEb2N1bWVudCBTaWdu ZXIxCzAJBgNVBAUTAjIyMSAwHgYDVQQLDBdBQiBTdmVuc2thIFBhc3MgUTQgMjAx NTEYMBYGA1UECgwPQUIgU3ZlbnNrYSBQYXNzMQswCQYDVQQGEwJTRTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL861YxdRDvxVJcFIIOk32VWV4pwXmnn nkCH+CifA54jsrSRkCjEfCUhG+9CkNK06qUkpAibqyBTFZFwG3/mIJgxUouwcEHX HKDaRZbUlIonBLi5ZCPguMIkg8ViCfCZleJSJ/nPvZB9Ajgc0hVhGVO2TuaPqJoL qK0yqH+qHVjpErc2WkwBDFotcRzOWce8n2OtNOmPLeUAQQl4Gpz8fOZQs4LBd6Yc CqO2Ub1mrizFH3/xsKa5s2lJUHCX50BCLZYpm4QnKTsd7MlZWreWhrLK0ZnsU+n7 d8HaXT+jIRo/s+jHzrdNcAICGmYLvdseL0V0JpeXwV3frX8uaogcs2UCAwEAAaOC AYgwggGEMA4GA1UdDwEB/wQEAwIHgDAdBgNVHQ4EFgQUDnGH+sTTmgAoFUA7cWZ1 HNMvEuwwHwYDVR0jBBgwFoAUE/iqb1pSoBtX8tdu/DpXXCJeJN0wKwYDVR0QBCQw IoAPMjAxNTA3MDcxMTM3MzJagQ8yMDE1MTAwNTExMzczMlowFwYDVR0gBBAwDjAM BgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgwVqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlz ZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVmNDEwNTc5M2RmYjEzMThhZTVhNjgxZWVk ZjdlMjc2ODEyN2QuY3JsMBUGB2eBCAEBBgIECjAIAgEAMQMTAVAwOAYDVR0RBDEw L6QQMA4xDDAKBgNVBAcMA1NXRYYbaHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NB MDgGA1UdEgQxMC+kEDAOMQwwCgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlz ZW4uc2UvQ1NDQTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJ KoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggIBADBZoP5GCuMxqwz888Lf ecwgPFW0irE3usQnNZxMF+fZ06k5pwLpe1JvCF4K224RY5OzGWi8lJODrPKrjwHk WkIgymhNqgGWDJnbxxuUgR4/XKitoD11ZYF8kaTRPsTUtN8NYyIkB9M5B73A7f/X cA5dgXbJAKTJPqAxpHRdJ/x6Zv0WoswAh79/qq6Pllx+9mHT/G0mjviPvdi8EbTU r6BlYypaTAnhawbK7WAzQr8NTC8TjQUmErTDwkuLuw0zTH6JvcE+5JpKWOXQenJF 0pXdgyNUjBuWLB000EwvpAiBASGYIGvz1E9MEV9L85dsa565tuTaV056I7GKiEEZ GrVOp6F2DcnIxSWVyHyZo2Qvybxa83nIwEvJPp90WEjqywXPHQFW10NMU0Roq0Z9 bjJchFqlIV3OKJDOguooZTT6XyKKnAfKEPtlD+yrNF+DWpgUxIevqJRKfVTvqTsO gMt5bmxknkGzhI/NqRrunuvFXPVgHkFWGNfjNESnfhfGkbyEkCm98b4BhHuijA6p xcwdlfmfts09C/2caCfu/hJWTTsUABRpgyayv5SW5MF7/SjkbZhZ3sdNML+2US7r KPGAJyI2ozyY8Vq6rrVdjeL/0LuU90r5K2ex1R3y6ItofeYjZIbo8qeDX1smoQRg AL5Dzy0uoEYsdaeqaAecfYnU -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/41/root.crt000066400000000000000000000047141322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIEmYftqGzCYQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTEzMTIxMTEwMjA0N1oXDTIy MDUwNDEwMjA0N1owTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO4Sn5Fl67Cu9bJPCXOjCOGG3D 9DdUqKf1rbej88v/kFGHkRk0bEkRm0CaziRUwPxxQsRrdTSn2IePX8rqm7PBlVg/ AKHixuXPef9YPx9tp9V1Zd3gKxZThenfIHuoLwkUjto8iADD2WNDhrvkQRl6f9RG 9lFKVsxpENEIMQ/JR2AL1KBqRFcMsyWCga5jq9SJQjUMI/uH9yl6Tk4Z6tTlypMm j4POS82qRndrOtXPmaDQCt4NTzvlMDXnlOxLmO7Oy2g89Kov6R3yjFJS68GZDfVB DvNwzeKdimliQwjeO28x7hgeaLTNhXvJ0FxVecDVCisjBEMzKFi+X6KImieCbxCn Izz+KXns33M0+iBUezqkvbtBhG9U/VtTv3e7RcgcaOXi8MBXtSig89l42WSMDnoM 7EE5hXQDdZyM9n5r5nEZnnIoFCsodDkQcrAiV7/1up6dHjId7JQT50bwL0MAcf5i DiboqFh3zU1b5HZEiQvFqkLihO5+IyfqL3qleoldmwfImCUq5Xjv8lKxXU5LIL0g V/c0vLX0O/vqtw74UebvQKQQ9DcZIt8lzaIbj5FrI9Gk5bYbBa4ykHnIqa6jnSxI PyxQImVmkhaLgOZHQivS9nnUSWxFajdxknhP2bU4qqXdNumzeh+4CX5+5ej8k96u zlc3rv/mP7qz7ppBlQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBP4qm9aUqAbV/LX bvw6V1wiXiTdMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUE/iqb1pS oBtX8tdu/DpXXCJeJN0wKwYDVR0QBCQwIoAPMjAxMzEyMTExMDIwNDdagQ8yMDE2 MDUyOTEwMjA0N1owFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFweKSNX+2NX3WPfbr9gSh7WIiYc97L9nSpZSL9bWnFp+grUQLrWsWqZPMzkq nrdSyGHaix1vJV7VDFh0RR+tH9TlewuHyOvgjCSZZ4adyVv5kgK613dEXnn+4neb pIqVWYAumCPX8AFSSIzm7BaPiP5mDygNnYe1Sm1qHE3qCfhMEU8j7yS2svQEpYlj PydDbAmN31iTlXdDIbr491llt0KzdqmgH9O34TmQYMsbrWdgmoPnD9OflSvwB+PJ 8OqZrUbafxJWZyr4wDkrQYwAtT1DjRqeIgfUYROLeFznTlSnF3nBi1QKy1NDYX9h ppfaGEsJrmtSMzKje7LlaODxy5wfypIciW1i1YiLbp0ZBjbsXV8V7B+XY10WqolO 8eDZQai65kWV9VFHqMUDV3TvTLGLrfI2CBzqZqGIn5PWe1Qkzfvl3ME7NGix/sX+ i1/dy+0/taiLZMg/JSKheITJPeVTHhW8kFLg4ZzPsMBS/9flVC7LQfFDe80BEwra S/MU8W4e4+91+r6yzd1UD0ae+SwVR7p6/3fVMytu4Xv6CcxhuuxNXQIHaW/Z6eb0 B7a+Ij2QO4WcnLN8YfpRnJ+s0nbrSq9khg0EfyNNicXmDe2sR5uwDWJw3LrpNewh IfAHXXedDVIa7+T2tK/E6kUXQNTTQFc7z8+GFCU+cQth+Hk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/42/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/42/end.crt000066400000000000000000000043001322470703100216750ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGSTCCA/2gAwIBAgIIape7+KR6xYswQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MDgxNzEwMTkzN1oXDTE2 MDgxNjEwMTkzN1owgYUxKTAnBgNVBAMMIFN3ZWRpc2ggUGFzc3BvcnQgRG9jdW1l bnQgU2lnbmVyMQswCQYDVQQFEwIxNTEhMB8GA1UECwwYUmlrc3BvbGlzc3R5cmVs c2VuIFEwMzE1MRswGQYDVQQKDBJSaWtzcG9saXNzdHlyZWxzZW4xCzAJBgNVBAYT AlNFMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsd4zyaCVT3CwhnZ+ c1oNOiU/nV7RLnxG7pqLssSwqY+wMqbv8gJHmaVeoy/yZd+zlrnU5EL5MocKMh2c tkhHGfLBtJGZ+oUrelsUpOQR7tAbG8Sb5I5hZ+Z8uw6EIa6ZlWjJNvMtEGpcQqyo 3pnq+DCA7u/rRxidHk4Ij0RtPAZ6sO73fYj2BuE9pNIs2BXu+wbakseYQIpl/HxI XiOJ4e/FdhX6MU6njx0yJdIxgM5fbTKPNupeqZaDtLQvMr8eNelO5ewC5Veh6Ulf Ag1+Pvl+gYvkoJgcAmr5KZi+M/Ksgdt+IpzT+0D1lRiPTazB84s0E7IaOs+YX71f Q8HhQQIDAQABo4IBiDCCAYQwHQYDVR0OBBYEFBvA5pR9r0PcFbI/bawtPHecg7Ik MB8GA1UdIwQYMBaAFBP4qm9aUqAbV/LXbvw6V1wiXiTdMCsGA1UdEAQkMCKADzIw MTUwODE3MTAxOTM3WoEPMjAxNTExMTUxMDE5MzdaMBcGA1UdIAQQMA4wDAYKKoVw VGQJAQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2VuLnNl L0NTQ0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3ZTI3 NjgxMjdkLmNybDAOBgNVHQ8BAf8EBAMCB4AwFQYHZ4EIAQEGAgQKMAgCAQAxAxMB UDA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xp c2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYbaHR0cDov L2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAgEAjI4u rtq7rCFy6eGgPWqrFIj8JO5ZUlPQ/7TwXjdO1Bt/2JvPV5ZZqmJ7yIQ4COxY+CxY pO+uCsS9XJc3Qa+lPlNJfZsX+oQbQODj1hCLx0xeHkA5AiD1C8mJiXvPdnGeiU1r enQlz90vW4PmJRJSpe3VruDVF55Sy5JU4KW4USmxuDDEwqhIprDkrCjn8VlcvzpN q+GH2K7v/9egKZkR8RmKOVBDHoMk+jnV9fHGSjMbIkxcGLbPwo6MsnxrKymguDgQ RCaQaogO9zlhsfW8biEH5bbSsaPo7JJI/b6GetuBUyH+wyoqJu8xH4oAL2lMnpRz lriC2UZt92RBD2Cfh4MbEQjB8P/ORtCK2g9Q3kozdUx4OoHWPGwScUIPmyUwk1YT C8jd4hUBi0pi/euyfHYw0AEyZgOws0Ll+fBaWZgVUVJYdl6uLgxBUEPgE6C27R0/ T/A0ldGVyre/OhsANZ11vEl90mqicTLTkX+0yk+5xybgkOQbqbvEEcsO63gSH2Qz GsvTHssTqfl3vARrdw3WtITvJOfSVFTKTPy/kH7Se/0LKlPEFiZzHc+EF2D1GtFh 6Lg4jFmLQobyU1qInJHFZ1JfILCDj//qYT1YoYeboGmqkUz3OdqzjDGmj3w9RoTB 243Xxk9GmFAQ0mXI1ed1Db5HHUYt5NIhgbW6fB8= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/42/root.crt000066400000000000000000000047141322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIEmYftqGzCYQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTEzMTIxMTEwMjA0N1oXDTIy MDUwNDEwMjA0N1owTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO4Sn5Fl67Cu9bJPCXOjCOGG3D 9DdUqKf1rbej88v/kFGHkRk0bEkRm0CaziRUwPxxQsRrdTSn2IePX8rqm7PBlVg/ AKHixuXPef9YPx9tp9V1Zd3gKxZThenfIHuoLwkUjto8iADD2WNDhrvkQRl6f9RG 9lFKVsxpENEIMQ/JR2AL1KBqRFcMsyWCga5jq9SJQjUMI/uH9yl6Tk4Z6tTlypMm j4POS82qRndrOtXPmaDQCt4NTzvlMDXnlOxLmO7Oy2g89Kov6R3yjFJS68GZDfVB DvNwzeKdimliQwjeO28x7hgeaLTNhXvJ0FxVecDVCisjBEMzKFi+X6KImieCbxCn Izz+KXns33M0+iBUezqkvbtBhG9U/VtTv3e7RcgcaOXi8MBXtSig89l42WSMDnoM 7EE5hXQDdZyM9n5r5nEZnnIoFCsodDkQcrAiV7/1up6dHjId7JQT50bwL0MAcf5i DiboqFh3zU1b5HZEiQvFqkLihO5+IyfqL3qleoldmwfImCUq5Xjv8lKxXU5LIL0g V/c0vLX0O/vqtw74UebvQKQQ9DcZIt8lzaIbj5FrI9Gk5bYbBa4ykHnIqa6jnSxI PyxQImVmkhaLgOZHQivS9nnUSWxFajdxknhP2bU4qqXdNumzeh+4CX5+5ej8k96u zlc3rv/mP7qz7ppBlQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBP4qm9aUqAbV/LX bvw6V1wiXiTdMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUE/iqb1pS oBtX8tdu/DpXXCJeJN0wKwYDVR0QBCQwIoAPMjAxMzEyMTExMDIwNDdagQ8yMDE2 MDUyOTEwMjA0N1owFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFweKSNX+2NX3WPfbr9gSh7WIiYc97L9nSpZSL9bWnFp+grUQLrWsWqZPMzkq nrdSyGHaix1vJV7VDFh0RR+tH9TlewuHyOvgjCSZZ4adyVv5kgK613dEXnn+4neb pIqVWYAumCPX8AFSSIzm7BaPiP5mDygNnYe1Sm1qHE3qCfhMEU8j7yS2svQEpYlj PydDbAmN31iTlXdDIbr491llt0KzdqmgH9O34TmQYMsbrWdgmoPnD9OflSvwB+PJ 8OqZrUbafxJWZyr4wDkrQYwAtT1DjRqeIgfUYROLeFznTlSnF3nBi1QKy1NDYX9h ppfaGEsJrmtSMzKje7LlaODxy5wfypIciW1i1YiLbp0ZBjbsXV8V7B+XY10WqolO 8eDZQai65kWV9VFHqMUDV3TvTLGLrfI2CBzqZqGIn5PWe1Qkzfvl3ME7NGix/sX+ i1/dy+0/taiLZMg/JSKheITJPeVTHhW8kFLg4ZzPsMBS/9flVC7LQfFDe80BEwra S/MU8W4e4+91+r6yzd1UD0ae+SwVR7p6/3fVMytu4Xv6CcxhuuxNXQIHaW/Z6eb0 B7a+Ij2QO4WcnLN8YfpRnJ+s0nbrSq9khg0EfyNNicXmDe2sR5uwDWJw3LrpNewh IfAHXXedDVIa7+T2tK/E6kUXQNTTQFc7z8+GFCU+cQth+Hk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/43/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/43/end.crt000066400000000000000000000042741322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGRTCCA/mgAwIBAgIIG421l7KvpscwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE0MTAzMTA5Mjc1OFoXDTIw MDQyMjA5Mjc1OFowgYExKTAnBgNVBAMMIFN3ZWRpc2ggUGFzc3BvcnQgRG9jdW1l bnQgU2lnbmVyMQswCQYDVQQFEwI0MTEgMB4GA1UECwwXQUIgU3ZlbnNrYSBQYXNz IFEyIDIwMTUxGDAWBgNVBAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0Uw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC/HsfDPfUT5DnC/iJP3gY 9cqhI5W9QFpasn3vszdqltR98ZbuKbPCZ3Resmv4LJQngh8vmBw6LWz9I+2TszIi sY2i6PfV8uWSfGXPioyg9MIWKH9Qm6Q21j/pUGDvj1fvl9WvcLWwbSJNjzw51CuG 8QO6swF71dyysiCtfr2DobfUAaito9werwHTdS3gitYqDKRdiW4ku7W7heaGi1A6 irIVkAE5csUY/BL9Pk1wGFyi2xcASRkAFj076iDYCHb0bmjupHa/9H1IO+ySrszi IuOU6adty9h0ZTEFpRocc5ySKRZVyIWRmcX7sn6RfbbEmnnIvJ20XD9neMY826Sx AgMBAAGjggGIMIIBhDAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFE4scD7qH+xX 98y8qW7xZcbNeLlYMB8GA1UdIwQYMBaAFBP4qm9aUqAbV/LXbvw6V1wiXiTdMCsG A1UdEAQkMCKADzIwMTUwMTIyMDkyNzU4WoEPMjAxNTA0MjIwOTI3NThaMBcGA1Ud IAQQMA4wDAYKKoVwVGQJAQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1 YTY4MWVlZGY3ZTI3NjgxMjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgG A1UdEQQxMC+kEDAOMQwwCgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4u c2UvQ1NDQTA4BgNVHRIEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQChghoEhP9v 0gDTWce2wOG3sJf9KTaowzjgeCexYwjHsK69qeZkg/t2I6gKcFyDCYqrUvB2uS6Q XE3WLLyQ52OxzO/go8f0Jl6okyLzPJx1mKahuP4piU+LkOytYzBQIZg/eKUUT8dP EFhB5eCGfBHVbdbTgCxWL9BvlOb+z/AL2Mph+tzQpsrZO9ZYOhZKW39dpFFDTqaa D60iBTAwZxeVLuY/dX0MH8OXRyhX5URLFc+cSN3Rk5t6qNnGn+KPrPPyJaJakBNB 6sQkcDDX1qoKv+lvCC4RC2ps5p4UIdJ2YC2OPo+2JlbMzOA6hQG0AAOhtgsKrrjy MqQbjSDbNFlqnlkBOSV1bsFG+qQqhqiyn7S3wxBAF1XXVM7Pjfr+LRB2VybL7VOs JfUh3dAb4dZ/o2IjXmxdO+n7Mph2IymvV5UT+dU/yTrz4gLG32d4EIaJI9uYth3a hfSG3ITjjckaQ0OOOEQ7YoV8ogNyysMwVyCE6d7jvN4PLlxrU57WH3zRSWinrPO5 ZwQWugMIthXIwzcMyK3BMpm5Q2lR6rnBSJ38PIVz+/UEkmWs8Yjw+h+daMuwwNXZ INoOGStT9PYLznuX55TkCXMrh6Z7jnxisHo2diq2dJfqnCk6O6PfT1CK5ceH8Av/ GgNVHKLiE9x5MhFvhCX4Yk0sKSoRF5P+sQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/43/root.crt000066400000000000000000000047141322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIEmYftqGzCYQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTEzMTIxMTEwMjA0N1oXDTIy MDUwNDEwMjA0N1owTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO4Sn5Fl67Cu9bJPCXOjCOGG3D 9DdUqKf1rbej88v/kFGHkRk0bEkRm0CaziRUwPxxQsRrdTSn2IePX8rqm7PBlVg/ AKHixuXPef9YPx9tp9V1Zd3gKxZThenfIHuoLwkUjto8iADD2WNDhrvkQRl6f9RG 9lFKVsxpENEIMQ/JR2AL1KBqRFcMsyWCga5jq9SJQjUMI/uH9yl6Tk4Z6tTlypMm j4POS82qRndrOtXPmaDQCt4NTzvlMDXnlOxLmO7Oy2g89Kov6R3yjFJS68GZDfVB DvNwzeKdimliQwjeO28x7hgeaLTNhXvJ0FxVecDVCisjBEMzKFi+X6KImieCbxCn Izz+KXns33M0+iBUezqkvbtBhG9U/VtTv3e7RcgcaOXi8MBXtSig89l42WSMDnoM 7EE5hXQDdZyM9n5r5nEZnnIoFCsodDkQcrAiV7/1up6dHjId7JQT50bwL0MAcf5i DiboqFh3zU1b5HZEiQvFqkLihO5+IyfqL3qleoldmwfImCUq5Xjv8lKxXU5LIL0g V/c0vLX0O/vqtw74UebvQKQQ9DcZIt8lzaIbj5FrI9Gk5bYbBa4ykHnIqa6jnSxI PyxQImVmkhaLgOZHQivS9nnUSWxFajdxknhP2bU4qqXdNumzeh+4CX5+5ej8k96u zlc3rv/mP7qz7ppBlQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBP4qm9aUqAbV/LX bvw6V1wiXiTdMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUE/iqb1pS oBtX8tdu/DpXXCJeJN0wKwYDVR0QBCQwIoAPMjAxMzEyMTExMDIwNDdagQ8yMDE2 MDUyOTEwMjA0N1owFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFweKSNX+2NX3WPfbr9gSh7WIiYc97L9nSpZSL9bWnFp+grUQLrWsWqZPMzkq nrdSyGHaix1vJV7VDFh0RR+tH9TlewuHyOvgjCSZZ4adyVv5kgK613dEXnn+4neb pIqVWYAumCPX8AFSSIzm7BaPiP5mDygNnYe1Sm1qHE3qCfhMEU8j7yS2svQEpYlj PydDbAmN31iTlXdDIbr491llt0KzdqmgH9O34TmQYMsbrWdgmoPnD9OflSvwB+PJ 8OqZrUbafxJWZyr4wDkrQYwAtT1DjRqeIgfUYROLeFznTlSnF3nBi1QKy1NDYX9h ppfaGEsJrmtSMzKje7LlaODxy5wfypIciW1i1YiLbp0ZBjbsXV8V7B+XY10WqolO 8eDZQai65kWV9VFHqMUDV3TvTLGLrfI2CBzqZqGIn5PWe1Qkzfvl3ME7NGix/sX+ i1/dy+0/taiLZMg/JSKheITJPeVTHhW8kFLg4ZzPsMBS/9flVC7LQfFDe80BEwra S/MU8W4e4+91+r6yzd1UD0ae+SwVR7p6/3fVMytu4Xv6CcxhuuxNXQIHaW/Z6eb0 B7a+Ij2QO4WcnLN8YfpRnJ+s0nbrSq9khg0EfyNNicXmDe2sR5uwDWJw3LrpNewh IfAHXXedDVIa7+T2tK/E6kUXQNTTQFc7z8+GFCU+cQth+Hk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/44/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/44/end.crt000066400000000000000000000042501322470703100217030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGNjCCA+qgAwIBAgIIQJIvByixO9QwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTEzMTIxNzE1MTkxM1oXDTE5 MDgzMTE1MTkxM1owczEjMCEGA1UEAwwaU3dlZGlzaCBSUCBEb2N1bWVudCBTaWdu ZXIxCzAJBgNVBAUTAjE3MRgwFgYDVQQLDA9BQiBTdmVuc2thIFBhc3MxGDAWBgNV BAoMD0FCIFN2ZW5za2EgUGFzczELMAkGA1UEBhMCU0UwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDKBXAqRW0s/AnDV7M363nUPuY0XjhfwRwH4v9dotw3 R6nGBbbR/Y0sfNgcSxfL4k/pfIutsF/S2R9Yij4/lNDDz5t9BaPqep03yxB00FFZ S18kcu1vswYtL0ne2SyFP3Kvwpl5Vh3gAzQs/raYONDRzUGGsxU+VppnpwQx3eRY +m76dxZYo5v24QatlGegD+YuNBMRjAEp0W9C8C9PCImRx06UogsieKhYq6x2xUX6 xrsiZE94O/WnfbD91iGHgCgSggPCiC6A0yPcCr9SOuJ8XlBzIFBe2cP3J0nFROLm TWFKRwCNS2l5GR0SRx3kI0GMEoQ1BMfi/HVNRE5KWEf/AgMBAAGjggGIMIIBhDAO BgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFE6F+Mcaxw6k1FhbtUFQMNGfAo6zMB8G A1UdIwQYMBaAFBP4qm9aUqAbV/LXbvw6V1wiXiTdMCsGA1UdEAQkMCKADzIwMTQw NjAxMTUxOTEzWoEPMjAxNDA4MzAxNTE5MTNaMBcGA1UdIAQQMA4wDAYKKoVwVGQJ AQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3ZTI3Njgx MjdkLmNybDAVBgdngQgBAQYCBAowCAIBADEDEwFQMDgGA1UdEQQxMC+kEDAOMQww CgYDVQQHDANTV0WGG2h0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQTA4BgNVHRIE MTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xpc2VuLnNlL0NT Q0EwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEB CDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQAlP2lyeQuzpIqKfaQlW6EroD2qqiaX 0pzmcJByFFVKx/j1mUolhNQCaTXeWx6Jqhok1jwR8I7b5a09Iq1jf3BqECviII+1 AurG03RnPqxrOhKFsXbV7wDLhshmIpstlWSzBupEZc2YbTnVmd1D+mEPj3CDTfkx 1CVmYcmYuiPPCUL4os1+k0eRfz3fdBAlrL4F9fWAoJurnV3Y1dY3Z3Nq2rH5lp/N x5vXIXonNQclvAjlUFo/Avbb1RZHMxFTEZEJbrl5M+L5w8lYOwo7eTh5fOWG1hYQ WaJ8emFRoDlZHImhnCi9CI+id0wi6H2hNzOQjxJcUPgLsZWzWNVMcciJTtBrRWKz 6pmpcirhN/Id2MztUhUfefQXSt88LbV/90HwJVfbz2RVc9JEIN4qxqyKksGqq4Kw RdFqdT22qCc/h4fy52z3ihO1scYh6QJBt9kfIS04lpHnnLrWH7LG84ed57VfBfEe CXDVfnDryPz/FtwECk4LtDCp3RjlG2ZUSZ3iZZAHhbDdwoGdiELgSAR0oO+c2NP+ ceVrBFsyxVKu7LxKegF2UK3ijQjHRXhkjh7SxiO69uMMyuLj38zjtrWKrr/f2P94 AywETgtXzinByo1mntvmc9C31m1TmSCslip0Ie795fFcE7fGVwCKrzbcF8HnroUn 2OqfKJrs+5LP8w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/44/root.crt000066400000000000000000000047141322470703100221250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIEmYftqGzCYQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTEzMTIxMTEwMjA0N1oXDTIy MDUwNDEwMjA0N1owTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO4Sn5Fl67Cu9bJPCXOjCOGG3D 9DdUqKf1rbej88v/kFGHkRk0bEkRm0CaziRUwPxxQsRrdTSn2IePX8rqm7PBlVg/ AKHixuXPef9YPx9tp9V1Zd3gKxZThenfIHuoLwkUjto8iADD2WNDhrvkQRl6f9RG 9lFKVsxpENEIMQ/JR2AL1KBqRFcMsyWCga5jq9SJQjUMI/uH9yl6Tk4Z6tTlypMm j4POS82qRndrOtXPmaDQCt4NTzvlMDXnlOxLmO7Oy2g89Kov6R3yjFJS68GZDfVB DvNwzeKdimliQwjeO28x7hgeaLTNhXvJ0FxVecDVCisjBEMzKFi+X6KImieCbxCn Izz+KXns33M0+iBUezqkvbtBhG9U/VtTv3e7RcgcaOXi8MBXtSig89l42WSMDnoM 7EE5hXQDdZyM9n5r5nEZnnIoFCsodDkQcrAiV7/1up6dHjId7JQT50bwL0MAcf5i DiboqFh3zU1b5HZEiQvFqkLihO5+IyfqL3qleoldmwfImCUq5Xjv8lKxXU5LIL0g V/c0vLX0O/vqtw74UebvQKQQ9DcZIt8lzaIbj5FrI9Gk5bYbBa4ykHnIqa6jnSxI PyxQImVmkhaLgOZHQivS9nnUSWxFajdxknhP2bU4qqXdNumzeh+4CX5+5ej8k96u zlc3rv/mP7qz7ppBlQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBP4qm9aUqAbV/LX bvw6V1wiXiTdMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUE/iqb1pS oBtX8tdu/DpXXCJeJN0wKwYDVR0QBCQwIoAPMjAxMzEyMTExMDIwNDdagQ8yMDE2 MDUyOTEwMjA0N1owFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFweKSNX+2NX3WPfbr9gSh7WIiYc97L9nSpZSL9bWnFp+grUQLrWsWqZPMzkq nrdSyGHaix1vJV7VDFh0RR+tH9TlewuHyOvgjCSZZ4adyVv5kgK613dEXnn+4neb pIqVWYAumCPX8AFSSIzm7BaPiP5mDygNnYe1Sm1qHE3qCfhMEU8j7yS2svQEpYlj PydDbAmN31iTlXdDIbr491llt0KzdqmgH9O34TmQYMsbrWdgmoPnD9OflSvwB+PJ 8OqZrUbafxJWZyr4wDkrQYwAtT1DjRqeIgfUYROLeFznTlSnF3nBi1QKy1NDYX9h ppfaGEsJrmtSMzKje7LlaODxy5wfypIciW1i1YiLbp0ZBjbsXV8V7B+XY10WqolO 8eDZQai65kWV9VFHqMUDV3TvTLGLrfI2CBzqZqGIn5PWe1Qkzfvl3ME7NGix/sX+ i1/dy+0/taiLZMg/JSKheITJPeVTHhW8kFLg4ZzPsMBS/9flVC7LQfFDe80BEwra S/MU8W4e4+91+r6yzd1UD0ae+SwVR7p6/3fVMytu4Xv6CcxhuuxNXQIHaW/Z6eb0 B7a+Ij2QO4WcnLN8YfpRnJ+s0nbrSq9khg0EfyNNicXmDe2sR5uwDWJw3LrpNewh IfAHXXedDVIa7+T2tK/E6kUXQNTTQFc7z8+GFCU+cQth+Hk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/45/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/45/end.crt000066400000000000000000000043001322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGSTCCA/2gAwIBAgIIXZZQ1URLRE4wQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE0MTAwMjEwMzQyNloXDTE1 MTAwMjEwMzQyNlowgYUxKTAnBgNVBAMMIFN3ZWRpc2ggUGFzc3BvcnQgRG9jdW1l bnQgU2lnbmVyMQswCQYDVQQFEwIxMjEhMB8GA1UECwwYUmlrc3BvbGlzc3R5cmVs c2VuIFEwNDE0MRswGQYDVQQKDBJSaWtzcG9saXNzdHlyZWxzZW4xCzAJBgNVBAYT AlNFMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhUr6VCCliDxzwpf/ V0X3m9465UWVSq6vRw1JBgcU2ijUzRXOsvucpwb9hJ+waig+AdYrEC0OuS/3P8/7 mlela4xO+xzJ3ncSczDk7Bk4Fna7UYU5Nwfne4p6R5dojdxBFB5ZLpP25J1U4BbP 0JPFEBpwrpIIY/5PB2T9Od1sVE/9T8v9fbWWcyVZdIKqvzOUKvQwKGpUISjfh1MM QXszizgPtEEQyh/cZ7zSncA1/rr8CUIlzd5cPTbscgyCZ16WQrXwjJzC1ezivxML JdW/UEDhr/Po71IHTUtr0zExgQO3iEishcGjHYXJma3+L6CsF+QX4R1jFgs2RFui vA5YZwIDAQABo4IBiDCCAYQwHQYDVR0OBBYEFIspxV415ag7bkyoFuyjxTk7M/aP MB8GA1UdIwQYMBaAFBP4qm9aUqAbV/LXbvw6V1wiXiTdMCsGA1UdEAQkMCKADzIw MTQxMDAyMTAzNDI2WoEPMjAxNDEyMzExMDM0MjZaMBcGA1UdIAQQMA4wDAYKKoVw VGQJAQMBATBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vY2VydC5wb2xpc2VuLnNl L0NTQ0EvU0VfQ1NDQV80MTE1ZjQxMDU3OTNkZmIxMzE4YWU1YTY4MWVlZGY3ZTI3 NjgxMjdkLmNybDAOBgNVHQ8BAf8EBAMCB4AwFQYHZ4EIAQEGAgQKMAgCAQAxAxMB UDA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2VydC5wb2xp c2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYbaHR0cDov L2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUD BAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAgEAVXE/ WqzmqKRiOHnTyzhpWn5GZVUTK5rRU7I1IM2A+gGA+jq2U+m3SuU+DesM7BcatI58 fiFdtt5VfA8NTiU9K41iiPQ1Tfl8mY/CJ0NzeNiOihgiv1JhkT78JZBXhYAtStEM NzSopM4U80Oz8HvxHTEbpy1YAq9UimgkTD2iOjG9HJHY5arSzazYHaTqCCgZQAb/ rHDMtN57dyuUdhr7dRPjok5shzgvP85xE2QSecMMofEqFckg5XQO57f0a40r5KxR xnyMy9oU3VbkH0kFo+uzIs+yp2+pxb3ZWXlr7tMzef9Yc45IKKVjFmp52CKFhf/P V3I8r7r57hPMZElkZV+zHM9FGeTsNMYOIflgGQol3ysK3g1b+RpH7f3WcgKU7zQP edpnfiToQmgQ6s+AhYXd2XSE+R88QtjWQhmSyUgxl0fQW8tFa+NotIcSSRePahEF LqQgYM6oyn16QpV98biYA0WpupueEpovYXz386Q9+rl5d58fDqn5sqGB6z57O/LW xpbyZrxbTJ3nIjemjXHNWkVZHXjKh2G6ZQdSaHnL83C51Gd0YlNpeiKSmjRj2SvL 0GlPb2JLrysXLeL/2bi9CHVFkUC40VXIBuzYQgyC0pITz3XLRaTPDfxraVmg1aU0 HUy7rinJZ1di26NfPAPTdh75PH8ZseE8+LxZuz4= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/45/root.crt000066400000000000000000000047141322470703100221260ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIEmYftqGzCYQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTEzMTIxMTEwMjA0N1oXDTIy MDUwNDEwMjA0N1owTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO4Sn5Fl67Cu9bJPCXOjCOGG3D 9DdUqKf1rbej88v/kFGHkRk0bEkRm0CaziRUwPxxQsRrdTSn2IePX8rqm7PBlVg/ AKHixuXPef9YPx9tp9V1Zd3gKxZThenfIHuoLwkUjto8iADD2WNDhrvkQRl6f9RG 9lFKVsxpENEIMQ/JR2AL1KBqRFcMsyWCga5jq9SJQjUMI/uH9yl6Tk4Z6tTlypMm j4POS82qRndrOtXPmaDQCt4NTzvlMDXnlOxLmO7Oy2g89Kov6R3yjFJS68GZDfVB DvNwzeKdimliQwjeO28x7hgeaLTNhXvJ0FxVecDVCisjBEMzKFi+X6KImieCbxCn Izz+KXns33M0+iBUezqkvbtBhG9U/VtTv3e7RcgcaOXi8MBXtSig89l42WSMDnoM 7EE5hXQDdZyM9n5r5nEZnnIoFCsodDkQcrAiV7/1up6dHjId7JQT50bwL0MAcf5i DiboqFh3zU1b5HZEiQvFqkLihO5+IyfqL3qleoldmwfImCUq5Xjv8lKxXU5LIL0g V/c0vLX0O/vqtw74UebvQKQQ9DcZIt8lzaIbj5FrI9Gk5bYbBa4ykHnIqa6jnSxI PyxQImVmkhaLgOZHQivS9nnUSWxFajdxknhP2bU4qqXdNumzeh+4CX5+5ej8k96u zlc3rv/mP7qz7ppBlQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBP4qm9aUqAbV/LX bvw6V1wiXiTdMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUE/iqb1pS oBtX8tdu/DpXXCJeJN0wKwYDVR0QBCQwIoAPMjAxMzEyMTExMDIwNDdagQ8yMDE2 MDUyOTEwMjA0N1owFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFweKSNX+2NX3WPfbr9gSh7WIiYc97L9nSpZSL9bWnFp+grUQLrWsWqZPMzkq nrdSyGHaix1vJV7VDFh0RR+tH9TlewuHyOvgjCSZZ4adyVv5kgK613dEXnn+4neb pIqVWYAumCPX8AFSSIzm7BaPiP5mDygNnYe1Sm1qHE3qCfhMEU8j7yS2svQEpYlj PydDbAmN31iTlXdDIbr491llt0KzdqmgH9O34TmQYMsbrWdgmoPnD9OflSvwB+PJ 8OqZrUbafxJWZyr4wDkrQYwAtT1DjRqeIgfUYROLeFznTlSnF3nBi1QKy1NDYX9h ppfaGEsJrmtSMzKje7LlaODxy5wfypIciW1i1YiLbp0ZBjbsXV8V7B+XY10WqolO 8eDZQai65kWV9VFHqMUDV3TvTLGLrfI2CBzqZqGIn5PWe1Qkzfvl3ME7NGix/sX+ i1/dy+0/taiLZMg/JSKheITJPeVTHhW8kFLg4ZzPsMBS/9flVC7LQfFDe80BEwra S/MU8W4e4+91+r6yzd1UD0ae+SwVR7p6/3fVMytu4Xv6CcxhuuxNXQIHaW/Z6eb0 B7a+Ij2QO4WcnLN8YfpRnJ+s0nbrSq9khg0EfyNNicXmDe2sR5uwDWJw3LrpNewh IfAHXXedDVIa7+T2tK/E6kUXQNTTQFc7z8+GFCU+cQth+Hk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/46/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/46/end.crt000066400000000000000000000027751322470703100217170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEPzCCAnOgAwIBAgIBEDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDMwNzA5MzUyMFoXDTE4MDYwNzE0NTk1OVowPTELMAkGA1UE BhMCS1IxFTATBgNVBAoMDGNlcnRpZmljYXRlczEXMBUGA1UEAwwORFNEUjIwMDgw MzA3IDEwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC/LvGznzIW6hnK dbUGixt0cd3SSDh0WqVL/CuMsasSJDjESYdHdB0AQ6btvty8QkmGYwgnHqXKecTP wl9G3tTKtZYQ2e7Dq43hnOW2HEWe/G0EawMETcydHrv8ZnlJhnQkcX2e3dsY4DfW +9me7sakpZw9v7xHGahSTv7rwmQe6jfNJVeXIQVg5NXcDboWa/+PwXepfRFG1y7s yg+k8oYjuBifCbZtnFo5jkusOCAtZv6rJwq59smSYy580+PHx3ynLrsTqF67WpCf GMuag0HIHb3OnoOMYEaG1/DLiVsKvFPVk4tjYkn2zgGwDisv/HRWIZoZ5kguDirg XWsz0XLjAgEDo2AwXjAfBgNVHSMEGDAWgBSNiztW7sNuEawFnUCcz2KTZC9HNTAO BgNVHQ8BAf8EBAMCB4AwKwYDVR0QBCQwIoAPMjAwODAzMDcxODM1MDBagQ8yMDA4 MDYwNzIzNTkwMFowQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoG CSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQBCTZEH6+TCctd4rBrb n1o1hBdp5WbR9z7i9VO5QgGIRo9xpxIBNVmeQvyy2g6NKxaWAbXeekyKnqmmP0lC FXlxN6X86Ik+Eys/9+h4UWHt46hkrFCxBgsNdYiTL/g9i5Y2X2oY9qrqU+qJH3BA 6OdEPP3r1JlprzUpxWqtquiBh2vjEP7rQCm87N5i7AcKVdRLEWZvtvPxaN+/KI6U IGbeS+1rZ7zJ7tD3vi5sp5N72A8SvEy0ZAA3VoAS6O0lPY8jL/aDFOIcr+0EQwsD 28d6e+sTGyN6TPtcuRlIT51upxlTZElGq+8VvGrUp7BpGL4tdvyWYaFIWn5OiTfJ OX+++7ekKw3eVuYuAS3BCIvuQO6IrZe/TFtxthDa0lwcjm3IXklfsvRS+xYFsCR/ K9pdHZaqIUfZXN1yg0J1gR6UUFUpAFMjOzYW12vvygG/29iqs6e6cfz9HgbTmRUR GXVhXbz6Q6pnaVg1976fvM3ajdyewLtHBGckK5Q9tFFfkK4= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/46/root.crt000066400000000000000000000033101322470703100221160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1TCCAwmgAwIBAgIBDDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDMwNzA5MjQxN1oXDTIzMDYwNzE0NTk1OVowQTELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYD VQQDDARDU0NBMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEA1v8yx07z 90mNKAafu1kNKOoRmc9qbIKH0Fjz1JEtu+5A5X65q9NUfm7uWjaX5mQTkRuEjeP1 xoWy6g3ReAgRd/62GOFeNGDpnBRcfxtUGUyT5yHxQMWhgdyVgT0452LE+LQUr2xu vrzOWPpsigu5ZeDD13NlNGEeYTUxvtKnkskqizmtP2yinGqInWUh27i2hHNqtyBZ tcf/CC+E4ilDS6h/lYokhXGpMio8P0QeuPelkQdwRR3+y3Eek87dq2Tb3Uwn0BhB ccV/ofq3Lr0vn0kJUL9ukGfnz9CEldhRUgDQ51HebCcQwk9IVJbP4DN/wwaJrqun BRz5k1cfL/aRuvi8AoEDCjoZLdqq+nbC5mHKdhLi6V91AF1p7n6hFqs4huWdlrP5 +zO53Srp7GDTjpgZu9kjfljZu0w0XGqZxxzi6uIggEJftUUrHvlv09SXTg2KFxp2 GBSWy08oHHwsrQh6ERxvvzN1idwASBQ1Aq9MMaYyISRcfceH0jv4SrSPAgEDo3Iw cDAdBgNVHQ4EFgQUjYs7Vu7DbhGsBZ1AnM9ik2QvRzUwDgYDVR0PAQH/BAQDAgEG MCsGA1UdEAQkMCKADzIwMDgwMzA3MTgyNDAwWoEPMjAxMzAzMDcyMzU5MDBaMBIG A1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQCAdkGmB+BN ZQMIX6A9LjC2tg9Ds6PiyQJKGoryY3PBZ2oUk5XXr0NebxqDpaQ4AtBtveSJqthS t4o86mp6WOBKkLzAfaG8fpnGz1eb6b/5TMAExOnsdLTLSO7k9PDZQbTsxLeP7Nxw WWh7smSvGhGy30nljIL4yC3U4KRE4T8xH2K+ugxwIj/q8eUuDdZRuFRnXaFxPYKC w8vS+fac/H+qUfOlA/cIG4z9lV9bQdUAwDetqjWW6HLcHK62kokhEoZec0ZBTl3t cL+K7ouUtbKHxFbOO3DJX//r0IWozeLawRmFOPshNYtERJg2FXi/VnPrrn1sHv71 pAMWZNuLQBitVyq5U8YOt+gAvwlVwd/nXfV8F6f3eCM52N++TF708aPwQqXkvjjG SN8v66yfJE5x5yPS5tABJGp7loH7TvvWRYfC05gvHg6ses7stDJS9mageS5Po6Dh jxCzEPIwIs8V2bSN+mBkTahovz434Zu8x2IqtkX5f+55hHPxkws9YCo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/47/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/47/end.crt000066400000000000000000000030221322470703100217020ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETTCCAoGgAwIBAgIBbzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTExMDkyODA5MTk0OFoXDTIxMTIyODE0NTk1OVowSzELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMRcwFQYD VQQDDA5EUzAyMjAxMTA5MjggMTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC ggEBAMlVCAtnfwtm/yRq9Mlq9GaSIMaDO6tENF03bngMHZfwC/iSL/ET33uobbLO 4dN0jtIVTq3PnOb3G8X8LJ0Oe/WTPZb8WVT+/W5DKof3X7iKFexxChTLjD0CD6B0 tvK+UxkXoZngEbMRs5KPCHRVaG7pQbBNJsApweP9sdYEwNncCLcALS6uEpTZQIQp hylxg4nMkIuuhYnMJFPiidQ7Dkb9XQhp52xZ/CPwXBeRzLR2b9OCh8e3D50zam2t npmPYUApzDVEG8R7nb3hVRms9w+rByDeLYCfpZn67sQqVyDpSChsUIT7+UisdA1D Co+797Vqpk6vIplIfzOMDc1j+8cCAQOjYDBeMB8GA1UdIwQYMBaAFI2LO1buw24R rAWdQJzPYpNkL0c1MA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDExMDky ODE4MTkwMFqBDzIwMTExMjI4MjM1OTAwWjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGB AAlMLuWIhUTceet6cuYowJI1fbWuPA5lOGIw0BZnUnqaeg4/QhyrHvxelTaTMsbr 1HUOBlV6H+nW8aG6tH5rVupgY4CArJouKEbEpT04HCLhqavrN1ACx2ET9JAR32Xb vBFVv2NbqYGWkoqoTPChhZCubsMt3cJ60aBe888CXUuq9X9Dm7fQ7Va7+JnAERTV Mn8sQ79TA8UJwiaWFOO/62TkekUhRpa1Sn5F4AZzsGkYHyl+C6byTMUDKL9JYtb1 qXlS1vdwH4UAs7P7c7RWoqg/dmtrSumCWCVJ1HSDuwMFl4BwGsElW84PPiKd6/dp 9dNI6OwwRK2xroMj762NffYZyUn6U0KtFNCN4wFf5X0U+6cYvILtcF20u4k513uk s+d+nMBc90AVSyR/mGrJnHWCr4wobNXtjMKIuubfit+mBsX2QobrqGj0Fl1QLy6S yhmkB1/Yl27QhgVQxklcTVRtQAF6fCE64RpLhSklZjrgnCpIRhdgqVruo4T83NP8 FA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/47/root.crt000066400000000000000000000033101322470703100221170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1TCCAwmgAwIBAgIBDDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDMwNzA5MjQxN1oXDTIzMDYwNzE0NTk1OVowQTELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYD VQQDDARDU0NBMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEA1v8yx07z 90mNKAafu1kNKOoRmc9qbIKH0Fjz1JEtu+5A5X65q9NUfm7uWjaX5mQTkRuEjeP1 xoWy6g3ReAgRd/62GOFeNGDpnBRcfxtUGUyT5yHxQMWhgdyVgT0452LE+LQUr2xu vrzOWPpsigu5ZeDD13NlNGEeYTUxvtKnkskqizmtP2yinGqInWUh27i2hHNqtyBZ tcf/CC+E4ilDS6h/lYokhXGpMio8P0QeuPelkQdwRR3+y3Eek87dq2Tb3Uwn0BhB ccV/ofq3Lr0vn0kJUL9ukGfnz9CEldhRUgDQ51HebCcQwk9IVJbP4DN/wwaJrqun BRz5k1cfL/aRuvi8AoEDCjoZLdqq+nbC5mHKdhLi6V91AF1p7n6hFqs4huWdlrP5 +zO53Srp7GDTjpgZu9kjfljZu0w0XGqZxxzi6uIggEJftUUrHvlv09SXTg2KFxp2 GBSWy08oHHwsrQh6ERxvvzN1idwASBQ1Aq9MMaYyISRcfceH0jv4SrSPAgEDo3Iw cDAdBgNVHQ4EFgQUjYs7Vu7DbhGsBZ1AnM9ik2QvRzUwDgYDVR0PAQH/BAQDAgEG MCsGA1UdEAQkMCKADzIwMDgwMzA3MTgyNDAwWoEPMjAxMzAzMDcyMzU5MDBaMBIG A1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQCAdkGmB+BN ZQMIX6A9LjC2tg9Ds6PiyQJKGoryY3PBZ2oUk5XXr0NebxqDpaQ4AtBtveSJqthS t4o86mp6WOBKkLzAfaG8fpnGz1eb6b/5TMAExOnsdLTLSO7k9PDZQbTsxLeP7Nxw WWh7smSvGhGy30nljIL4yC3U4KRE4T8xH2K+ugxwIj/q8eUuDdZRuFRnXaFxPYKC w8vS+fac/H+qUfOlA/cIG4z9lV9bQdUAwDetqjWW6HLcHK62kokhEoZec0ZBTl3t cL+K7ouUtbKHxFbOO3DJX//r0IWozeLawRmFOPshNYtERJg2FXi/VnPrrn1sHv71 pAMWZNuLQBitVyq5U8YOt+gAvwlVwd/nXfV8F6f3eCM52N++TF708aPwQqXkvjjG SN8v66yfJE5x5yPS5tABJGp7loH7TvvWRYfC05gvHg6ses7stDJS9mageS5Po6Dh jxCzEPIwIs8V2bSN+mBkTahovz434Zu8x2IqtkX5f+55hHPxkws9YCo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/48/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/48/end.crt000066400000000000000000000030221322470703100217030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETTCCAoGgAwIBAgIBHTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDYyNTAzNTcyNVoXDTE4MDkyNTE0NTk1OVowSzELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMRcwFQYD VQQDDA5EUzAxMjAwODA2MjUgMTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC ggEBANJcONFA4+JhlYp8FBMfHsbckh8FZ1Vm1uAqxs2oxmFC3iDM0VeT1WV0xhJt 70xVSnrmrj99DAp9HyuAOpB+ujlNqT9IL+UCgKKU1wX+Y+jXBysusKHnJc4/RjFV DulEPPyRYHMMTZmM/Xt9pmhyOWEmgBNM05tGQ6FfXkwhw+1+AnnAUor8HqjMChWi 7eKXO9GGXVw7jLeW6kem4ArEA4gQ9tVQKGa74ZUt6tRhgHggv9qw+O3N9e28Wgsm l4dQ7pQmuDAxpqHoQAP9dOI2MjvUNR6OOq6X8LAVus8disg/qtTEJQ+TsZwciPV0 Y8JArPOO375QtZ9imyyhE7smw/kCAQOjYDBeMB8GA1UdIwQYMBaAFI2LO1buw24R rAWdQJzPYpNkL0c1MA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDA4MDYy NTEyNTcwMFqBDzIwMDgwOTI1MjM1OTAwWjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGB ALsTp3++eF4RcPLg30TJiS+YBMyNsKb/IeWLs2v2qRoOqJpwa79oOf8phTdAkzzL t+DuHuSHe/+5d26vmbOOTS5QC42E90LaCOx+6YJea6fbNaqMVaBRjJg45LUX9eUN nfNoICK8FRKiDJ25qphybtRHc+YcUcd6N+Y3f0jWsBMyrCftGj6TtQceh3qTNT5T PgcSbQ4lxLH3Dqof+IM/FBMsHtWYhxxxafJVffPHy9Iwcc6XoYawRJFFGywFOE6C Wo2Y019m9e71Vd6oqYilIXRXdJoRoaLEwzD+NUP2y/zux6PaXb9MxeKVM1o1A1WV Tes+m/EdWWXzq9tbMhT+p5oUHEdnqRNZ6nAXoO9vIvoqN8Tvk1WyP66iXjgYHTYx WX0spsCl03Qk0uveCFeZV9+ihRYFVvEa1U2/3R45olL812HcPdUSXMgUOCwssWJY Eg12EANRmeRm3aCGdxTLsv7PacZJzSXi2QZXWEc77ZGavca8tGrvUBcYw+FKt6y1 Xg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/48/root.crt000066400000000000000000000033101322470703100221200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1TCCAwmgAwIBAgIBDDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDMwNzA5MjQxN1oXDTIzMDYwNzE0NTk1OVowQTELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYD VQQDDARDU0NBMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEA1v8yx07z 90mNKAafu1kNKOoRmc9qbIKH0Fjz1JEtu+5A5X65q9NUfm7uWjaX5mQTkRuEjeP1 xoWy6g3ReAgRd/62GOFeNGDpnBRcfxtUGUyT5yHxQMWhgdyVgT0452LE+LQUr2xu vrzOWPpsigu5ZeDD13NlNGEeYTUxvtKnkskqizmtP2yinGqInWUh27i2hHNqtyBZ tcf/CC+E4ilDS6h/lYokhXGpMio8P0QeuPelkQdwRR3+y3Eek87dq2Tb3Uwn0BhB ccV/ofq3Lr0vn0kJUL9ukGfnz9CEldhRUgDQ51HebCcQwk9IVJbP4DN/wwaJrqun BRz5k1cfL/aRuvi8AoEDCjoZLdqq+nbC5mHKdhLi6V91AF1p7n6hFqs4huWdlrP5 +zO53Srp7GDTjpgZu9kjfljZu0w0XGqZxxzi6uIggEJftUUrHvlv09SXTg2KFxp2 GBSWy08oHHwsrQh6ERxvvzN1idwASBQ1Aq9MMaYyISRcfceH0jv4SrSPAgEDo3Iw cDAdBgNVHQ4EFgQUjYs7Vu7DbhGsBZ1AnM9ik2QvRzUwDgYDVR0PAQH/BAQDAgEG MCsGA1UdEAQkMCKADzIwMDgwMzA3MTgyNDAwWoEPMjAxMzAzMDcyMzU5MDBaMBIG A1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQCAdkGmB+BN ZQMIX6A9LjC2tg9Ds6PiyQJKGoryY3PBZ2oUk5XXr0NebxqDpaQ4AtBtveSJqthS t4o86mp6WOBKkLzAfaG8fpnGz1eb6b/5TMAExOnsdLTLSO7k9PDZQbTsxLeP7Nxw WWh7smSvGhGy30nljIL4yC3U4KRE4T8xH2K+ugxwIj/q8eUuDdZRuFRnXaFxPYKC w8vS+fac/H+qUfOlA/cIG4z9lV9bQdUAwDetqjWW6HLcHK62kokhEoZec0ZBTl3t cL+K7ouUtbKHxFbOO3DJX//r0IWozeLawRmFOPshNYtERJg2FXi/VnPrrn1sHv71 pAMWZNuLQBitVyq5U8YOt+gAvwlVwd/nXfV8F6f3eCM52N++TF708aPwQqXkvjjG SN8v66yfJE5x5yPS5tABJGp7loH7TvvWRYfC05gvHg6ses7stDJS9mageS5Po6Dh jxCzEPIwIs8V2bSN+mBkTahovz434Zu8x2IqtkX5f+55hHPxkws9YCo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/49/000077500000000000000000000000001322470703100204275ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/49/end.crt000066400000000000000000000030221322470703100217040ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETTCCAoGgAwIBAgIBQDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA5MDYwNTA2MzI0OVoXDTE5MDkwNTE0NTk1OVowSzELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMRcwFQYD VQQDDA5EUzAzMjAwOTA2MDUgMTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC ggEBAMrsX5Rz+f3//hGmE5y0Nw3p/KB75gNofbKd+QdKgTX6ooGjSYekfcH3Vj8D dYXI9bAhhUDNf6Mp3qd43mIvVi8Kav9JdG+R4N4moaE9M0uplz4lfoHDN4dBHki1 9NL4K/5f4Gzb9QNxfGIcL4ZZdDUeMjc9xR3MHeCUQ4dSTeccvhscvxhTcMdIFeGH eWDKV/sEecDqtLBglxKlgCiVCVn221cB9GMv99jua6jpF58mUWqB1pa9tZ7Ui2/i tLkIgMb1Vl2hZzlFVcxMnYmbbT0FI8BoxEdO+owiwwuBehYZ++xH4OdD12rldNYQ RAgiXn/ibiaIWzYRHC6gC0X9UmMCAQOjYDBeMB8GA1UdIwQYMBaAFI2LO1buw24R rAWdQJzPYpNkL0c1MA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDA5MDYw NTE1MzIwMFqBDzIwMDkwOTA1MjM1OTAwWjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGB AGwRMBV0Lt4QUogi2Eoj65E0JI/Fr4pu+zltUL7FUmpgLFQz7lt16qYDAoj3pgfs 1+Ky8dZAOi6qe2al3qAOPQjbnYIBGgmbl8F0jpUN5nEoM/4AU4juABN+ppAs/iFX u070bw1uWZzuiaMjWO1AnMuzn2Y2n0SsulyR4HxJ13vXj4NmD+potUOOO2i/6MfN t7Z8l/7/lQkhHC9EWyVcYlsWxcXefSAiUEyXgePqWSwozg8kHR7W9dStaDKTtsgS P2S9IIjjQpzwhDe3nrzsi63buhXl8+ZM+HPWC5DCbbP/e6U/7epd8ufRmcXB6sBw BP31hq6qoLlVre7czzy7ap5cCWdlQqVyQeJs9+GxajfvKXbpWv9gz6om8/iQf7mM fm44k8MWfqo15xxk1CY8qxXdiStAYcdJ2oyKDn09HlhxRUxjuqxTA/E7b6sSt/om Eqs2+/PB7JyDR7cT6bNIOycO4O773uY+SgOGfK/2p9rhcXBBVautwBF3ZB37Rtze KA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/49/root.crt000066400000000000000000000033101322470703100221210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1TCCAwmgAwIBAgIBDDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDMwNzA5MjQxN1oXDTIzMDYwNzE0NTk1OVowQTELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYD VQQDDARDU0NBMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEA1v8yx07z 90mNKAafu1kNKOoRmc9qbIKH0Fjz1JEtu+5A5X65q9NUfm7uWjaX5mQTkRuEjeP1 xoWy6g3ReAgRd/62GOFeNGDpnBRcfxtUGUyT5yHxQMWhgdyVgT0452LE+LQUr2xu vrzOWPpsigu5ZeDD13NlNGEeYTUxvtKnkskqizmtP2yinGqInWUh27i2hHNqtyBZ tcf/CC+E4ilDS6h/lYokhXGpMio8P0QeuPelkQdwRR3+y3Eek87dq2Tb3Uwn0BhB ccV/ofq3Lr0vn0kJUL9ukGfnz9CEldhRUgDQ51HebCcQwk9IVJbP4DN/wwaJrqun BRz5k1cfL/aRuvi8AoEDCjoZLdqq+nbC5mHKdhLi6V91AF1p7n6hFqs4huWdlrP5 +zO53Srp7GDTjpgZu9kjfljZu0w0XGqZxxzi6uIggEJftUUrHvlv09SXTg2KFxp2 GBSWy08oHHwsrQh6ERxvvzN1idwASBQ1Aq9MMaYyISRcfceH0jv4SrSPAgEDo3Iw cDAdBgNVHQ4EFgQUjYs7Vu7DbhGsBZ1AnM9ik2QvRzUwDgYDVR0PAQH/BAQDAgEG MCsGA1UdEAQkMCKADzIwMDgwMzA3MTgyNDAwWoEPMjAxMzAzMDcyMzU5MDBaMBIG A1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQCAdkGmB+BN ZQMIX6A9LjC2tg9Ds6PiyQJKGoryY3PBZ2oUk5XXr0NebxqDpaQ4AtBtveSJqthS t4o86mp6WOBKkLzAfaG8fpnGz1eb6b/5TMAExOnsdLTLSO7k9PDZQbTsxLeP7Nxw WWh7smSvGhGy30nljIL4yC3U4KRE4T8xH2K+ugxwIj/q8eUuDdZRuFRnXaFxPYKC w8vS+fac/H+qUfOlA/cIG4z9lV9bQdUAwDetqjWW6HLcHK62kokhEoZec0ZBTl3t cL+K7ouUtbKHxFbOO3DJX//r0IWozeLawRmFOPshNYtERJg2FXi/VnPrrn1sHv71 pAMWZNuLQBitVyq5U8YOt+gAvwlVwd/nXfV8F6f3eCM52N++TF708aPwQqXkvjjG SN8v66yfJE5x5yPS5tABJGp7loH7TvvWRYfC05gvHg6ses7stDJS9mageS5Po6Dh jxCzEPIwIs8V2bSN+mBkTahovz434Zu8x2IqtkX5f+55hHPxkws9YCo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/50/000077500000000000000000000000001322470703100204175ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/50/end.crt000066400000000000000000000030221322470703100216740ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIETTCCAoGgAwIBAgIBRzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA5MTIwMjAxMzUwM1oXDTIwMDMwMjE0NTk1OVowSzELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMRcwFQYD VQQDDA5EUzAzMjAwOTEyMDIgMTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC ggEBAMHUIOxWrNEKYwAI2zt6JVHMbJtGZAreGbo0+7BWP467B9/Rn6AhfcJqYd0j 5cmD7ruBBeXKWV4UJuLeZrSDiw7q6j+YfT1AlSbvgdd47evL/UouQFAyMRtIYVEk kK8bL4h6P6/zsp+LuuuiwRypSn4QNdQ+tf/Y7h/+klGc4nt4eOi6oDl/GdPQ2QON rBmOg20W7L3g6rKOYU0RZxcHNfRXSD1pTcfbpzpREvLYPj4+UchDo5zUVuwU9MI8 Lyx7vw99HhEIs1oX8fH1JVxOswEx1CKHshsDdDMEohfKLnQmAwLpeP42vrspM9W0 d1pYX1vel7+YfCo6dDTgkHlRwGUCAQOjYDBeMB8GA1UdIwQYMBaAFI2LO1buw24R rAWdQJzPYpNkL0c1MA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDA5MTIw MjEwMzUwMFqBDzIwMTAwMzAyMjM1OTAwWjBBBgkqhkiG9w0BAQowNKAPMA0GCWCG SAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGB AMuZn8M97NQWlsQ8kJDuhBIVFajHUKIXGfj0YIv/7sydPDnJN+1gmxRagenIpKY2 /0QTKOR5lFX/X0F7dPezQpddd4dPuSe0+a3Elvt8yHWnLdLyEX6JPtrJ+n1lXMiY ZisjiVzIq5g/dIL08oOTNh3TjnL0+nKrwt7LD8BzB5lKZ/e1JgsqPYp69/iy7FUm UJwrQdKAsX7Qz/YQPQ96FPWBRTEkUPh1M2eUDWnzfvAUZ1NK4YcySo8Y+LUs7Kba Ij0ztEB/xVfHLqAaLlRe5wZIBL2XbvwitpeJ2Im12MWiQ+WZ2owcK1QjBSdDHHK1 7XmnIrnGds9r3rxrqKhYUjtFir4HhdDvnl7fBoC335lC4rcOzB8fGnKBwt3Sywlu JeCJxPvI2s5XJD2tLoyxRwDykKihNTZ1GmOy5ElktuOgPcENIoFDgM2ufDznCGxB bPcdaVFD9R4qZx66xx82wI+Ogs1/9+W4HaGzJcrsUWRnlIH517ETjlI6eI/7++XJ lA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/50/root.crt000066400000000000000000000033101322470703100221110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE1TCCAwmgAwIBAgIBDDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwQTELMAkGA1UEBhMC S1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYDVQQD DARDU0NBMB4XDTA4MDMwNzA5MjQxN1oXDTIzMDYwNzE0NTk1OVowQTELMAkGA1UE BhMCS1IxEzARBgNVBAoMCkdvdmVybm1lbnQxDjAMBgNVBAsMBU1PRkFUMQ0wCwYD VQQDDARDU0NBMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEA1v8yx07z 90mNKAafu1kNKOoRmc9qbIKH0Fjz1JEtu+5A5X65q9NUfm7uWjaX5mQTkRuEjeP1 xoWy6g3ReAgRd/62GOFeNGDpnBRcfxtUGUyT5yHxQMWhgdyVgT0452LE+LQUr2xu vrzOWPpsigu5ZeDD13NlNGEeYTUxvtKnkskqizmtP2yinGqInWUh27i2hHNqtyBZ tcf/CC+E4ilDS6h/lYokhXGpMio8P0QeuPelkQdwRR3+y3Eek87dq2Tb3Uwn0BhB ccV/ofq3Lr0vn0kJUL9ukGfnz9CEldhRUgDQ51HebCcQwk9IVJbP4DN/wwaJrqun BRz5k1cfL/aRuvi8AoEDCjoZLdqq+nbC5mHKdhLi6V91AF1p7n6hFqs4huWdlrP5 +zO53Srp7GDTjpgZu9kjfljZu0w0XGqZxxzi6uIggEJftUUrHvlv09SXTg2KFxp2 GBSWy08oHHwsrQh6ERxvvzN1idwASBQ1Aq9MMaYyISRcfceH0jv4SrSPAgEDo3Iw cDAdBgNVHQ4EFgQUjYs7Vu7DbhGsBZ1AnM9ik2QvRzUwDgYDVR0PAQH/BAQDAgEG MCsGA1UdEAQkMCKADzIwMDgwMzA3MTgyNDAwWoEPMjAxMzAzMDcyMzU5MDBaMBIG A1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQCAdkGmB+BN ZQMIX6A9LjC2tg9Ds6PiyQJKGoryY3PBZ2oUk5XXr0NebxqDpaQ4AtBtveSJqthS t4o86mp6WOBKkLzAfaG8fpnGz1eb6b/5TMAExOnsdLTLSO7k9PDZQbTsxLeP7Nxw WWh7smSvGhGy30nljIL4yC3U4KRE4T8xH2K+ugxwIj/q8eUuDdZRuFRnXaFxPYKC w8vS+fac/H+qUfOlA/cIG4z9lV9bQdUAwDetqjWW6HLcHK62kokhEoZec0ZBTl3t cL+K7ouUtbKHxFbOO3DJX//r0IWozeLawRmFOPshNYtERJg2FXi/VnPrrn1sHv71 pAMWZNuLQBitVyq5U8YOt+gAvwlVwd/nXfV8F6f3eCM52N++TF708aPwQqXkvjjG SN8v66yfJE5x5yPS5tABJGp7loH7TvvWRYfC05gvHg6ses7stDJS9mageS5Po6Dh jxCzEPIwIs8V2bSN+mBkTahovz434Zu8x2IqtkX5f+55hHPxkws9YCo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/51/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/51/end.crt000066400000000000000000000035021322470703100217000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBXjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTExMTAyNzAxNDcyMFoXDTIyMTAyNzAxNDcyMFowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCvRLxWm/OcswLkoGPtJ1ryJ+MFdNtf jxvBFfBXlA9J4GLdGOmkr+/R8kCPDF9MS2K+U0Ql3+6SKMOzqwwWhvDlUeR2AUiv GSQDTODBzFeoosmx56nlS8AssXfHh8MNMJWoFaUf9VJWujjNkcg5+OR3ZJORCqaL G6ojytLRj1G2yeQLDPOLG5VOewQBGcFw3bP2PWbhDRgUZZB9yvYTSc4NuXXraRi8 K2A1az3tm6kWuXpkiVT29fB8k6nfcussLUZFsTBE1BbJmpvxw+t50rfzbOqISF31 ZR73keCPnhuoegy3/mmtRY63mnGpswqKBN68YyAMtyIqf87XIbSg2N/fAgEDo00w SzAfBgNVHSMEGDAWgBRYEi7roynd/MKGQtIFv2dbjC9+1jAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAEMsG3M7gE355MhUQYbIlkrqaQaZ8xutIJdXtZlkgH77z9cDYfNZyB1+Wrxf Xb4wAdQpoeSqEWPfQm8hK/fHgEb0uOQtiSYMYhFFQCXY/4uS+rW/jwErVZ20eslQ T4S1BwKEOwbY+zA4dvSZC+MSg35AmNNKjkudKiXjpI1PUvamk/OdkO/Zzf7qi4mT JB9Nh6IFzCtgr8xPqTdGqshIqHBL1AwL2cpce1Fjj7idvglJIQNzY0sG3jtcsc9r zlEDUH3QHkA0aavPurr90mx38h83FuZidi9MZnG5pZJou5g1IVpf1zoqcqcGx7o9 2gvqp2dp9s5YJHhtfnfLVd3n5xOktqFQOFWggC2U+s75om8qaYiexlHg14tCLPVr 1ky+uplwTuWJ8YhicPDSXvkRjzOtFc825ENRai0/HIURwIVVuaTEDVxOmv4Sgx8g Eu/cWMgWvUgidkZs989HQ1R7HnhDmvbm0Z9T8NIIbRCMj+at/CG59aEVxl1eOl1O lmmLxdGQULp3BAr5U3ySARumgkiNjuWY/6hr9BHuC1j120qriLpTqKPj1Anwv1Zp N7mMCwiqdTQFxSI/Rs6Ve8/k8GoMzDon+Hf2Q7DSRBhZUUjaNuBltJqJGdJvX7+E MpvvGZCQoDG5zGcsTBdp0rsO2or8OHUOiBDbQQgQeDcQk2ms -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/51/root.crt000066400000000000000000000042071322470703100221200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBKTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTA4MDYyMzAxNTczMloXDTI0MDYyMzAxNTczMlowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJQ5t7CI17BeMhw+ kQVP7+cS8PNTkqUkDfsyXz9BaVMzSSXoLIyCyyCgMLUdKnbMEE405LpMCUseoncM ugH6DV7daRht/2ZwI0w5dvFRZfEDOIP3VxZNFEi/qnWhTk2H/MHjFl/BqcENg1Ur egh0mXL53lYkhszt5jdPOivAE84mX54cLQeJzAeHgHATcCxOSPmB4wxBBfAO/O8F kVO0Q5F62O4qq+vEuLAz0RUMYR9yyjEQdxOTxACvSqH4wDsaV1hFgsRUGv8cAXlh OKmqBQr+QeHMEGTuTCbGUu5qsukAIoLofiub72AI58sTnnyGFrEAQAjvI9AuuBSp AcwCT3MB8UidsZWwa5j97dK3EmutnZmw0JWOajnp3BexEe2ykgYSMvcMHFcdkUlW cBML40nG8OfoMEy24Y9uhk2WdLxAbijpBPHlCvjEvPZZcz8Lh3Dl78U7to4Furvq nbWEAywjaq+F90krxlywsHw73rxyvLf+u697wvjlxbf1RcklIkyP/P7XiAF7yx3s xXHasKBAfdDfA6FCp4TCkQtMA9POWKa36O3P96SXAofliNBsKHbjaQx3mu4UGbHd eqW6GT+/hO1KC5oUl5x+6mkyOnJ8eT2LZZZjTE3oYAPt17sTeWhcGumlzq5JN+O6 T1ASeHxyTPBZY9AltyFQw44/0+UCAwEAAaNfMF0wHQYDVR0OBBYEFFgSLuujKd38 woZC0gW/Z1uML37WMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQCON478iP4WqiqWO5Wp49rbjoReFS+8d9ows94+/OaM8hn9AJBM/oiTYP/JEhxz 2qop9Zf7aKEmt8d/SkUHxb3odHjlgQyRm0f/wwVFDrj9ZtRyC3xG8JLhe+Q24ymC o5GiP9RoFB7hbvov6XQ2MxQnYn7ottiuPduHbQ/xV3yl81ovu/xoGaE1UU9fxzm1 LlBsSAau61BHQxLgx18Afkh3ucu1VOJaRuqQeHLdaeMIJ7FYjsuiyKnCMTaTHHyb jF1XM2kSlTxrXbkEYgzX/oJntZZrVY6dGk3jwphreNQKOanXBWPNX6t11e9+q0v0 LIyv8dm5//Luvd3sOJ1W8VNeR6dEG+HD11k5kMp9Qnknr9uQZHJ972t9xGcBuXmJ 0VBGmhlHCNujBQn0dH1aLPg3/HjODLMqWla812a09sv2KfxFHsDsEhV2lB4NWaDy x3xjN4POSJcOsaQ1rl5oARQ8sa2dLe5fI89b7KRR8gQl4bFZLHEUK69PzvFYGNTS bFKW/n+i/1VImD4EEA14Yan6TWUuv98H4dYoyiBElIUElCeLpo5YzIzDq1+avTUO hATMdW8WHolZLQqgmOHmGtRrXyFx5wPDStooX9I/GpwlSt1Oe/Pj5xKHZyqG9bWK oxd+k3kdlcjur1H4a7r+tc8n/23+AgdrcpM9GUX3Vm5jiA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/52/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/52/end.crt000066400000000000000000000035021322470703100217010ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBcTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEzMDIxOTAxNDEzOVoXDTI0MDIxOTAxNDEzOVowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCxiv6l99/1U4Xfs4l/6ZOIjJMhKY2G dfzzE35yL9UW4TJfUFTIiGSLhJjPAODIVMvzHiDOe8I7hAnWQZMmGACcvuZ2/OE2 DwoX8gre7pyqOlx6ZS9C5mPdApYXi+A4oV/hxuq13LWJRa2IQkBtw34ayhynBvEl zBMAWqehc8TaoO2fviN4lstg/12K/yLuU5E9NJ/dRI6CM1kimIKpzq8omSgCvClT tIuPRIRhq6Vu9S8jtzWSMuPfs1LyiJ6wHaLFZEfsF169gRPiTkqL4sxGi6658Yea 47hsslvDhxuVG5QYeSADIYhy1SE/4241Ptj8w3JpIY7APdWryVr0xFrlAgEDo00w SzAfBgNVHSMEGDAWgBRYEi7roynd/MKGQtIFv2dbjC9+1jAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAJjRHUPmPzAcnhmD4y4cGBdA6K5f/sbgec19txFOPbT9ggRP5E61q7Ym0bt3 QL/5OJlQTJhuTHTUWMf4ycBabp2AVdQkTKP2QJ68E9VKPn8U6mgYtQhrk0RxgBEu sAo3tDXV9OQDQ32OSt2QUwAfZD0youhO/l6pM3lqmvepdBbqoR/fpgelxPQ38AVp 47jfw9wX4fYSoufEkNIkiZ3OsWoQi2OepMLh9KXpAnBrmX6gTiqdoNXc3bKIS3o6 GB+ZHtnHWtKmzS3Jlc++6F1oM3feg6a3bM5kpkgj93BOMN2LgrTVo9zVAJHO9nfG 4kkl8C85t3YhFhr2Y7dRnFYY4cJSJwML9bxYijxOadqlQ9VajGFKNz1neUt5xPYZ N57Y2h07w2YR2D1qNGkGJ7IfB+tAz1ePT61jtEUKKB9kgnpuq9I6uZ6cHmm3p0vj 0U6FV10xvwkSVEKOfuR+q7gOp75Np+vERBKD/dL4Gdq5eGts34VtZKp/qYZfCPVu Tp38e0iTR8TM6z33BM5ZArC0SehAzGtRSiUVwLLruUVprCrICfi43QHx/qKxX6J8 XOOytTfTxig3hu0RKYIh+Bh5xqbZpAmrKjhA6uRMJO+YziBDNOR0uPleePcWB7Rd OlRf+FhbyqGbvNDvEZO7WOjIqb1IMxexC8zQ7oIk61b/ESJC -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/52/root.crt000066400000000000000000000042071322470703100221210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBKTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTA4MDYyMzAxNTczMloXDTI0MDYyMzAxNTczMlowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJQ5t7CI17BeMhw+ kQVP7+cS8PNTkqUkDfsyXz9BaVMzSSXoLIyCyyCgMLUdKnbMEE405LpMCUseoncM ugH6DV7daRht/2ZwI0w5dvFRZfEDOIP3VxZNFEi/qnWhTk2H/MHjFl/BqcENg1Ur egh0mXL53lYkhszt5jdPOivAE84mX54cLQeJzAeHgHATcCxOSPmB4wxBBfAO/O8F kVO0Q5F62O4qq+vEuLAz0RUMYR9yyjEQdxOTxACvSqH4wDsaV1hFgsRUGv8cAXlh OKmqBQr+QeHMEGTuTCbGUu5qsukAIoLofiub72AI58sTnnyGFrEAQAjvI9AuuBSp AcwCT3MB8UidsZWwa5j97dK3EmutnZmw0JWOajnp3BexEe2ykgYSMvcMHFcdkUlW cBML40nG8OfoMEy24Y9uhk2WdLxAbijpBPHlCvjEvPZZcz8Lh3Dl78U7to4Furvq nbWEAywjaq+F90krxlywsHw73rxyvLf+u697wvjlxbf1RcklIkyP/P7XiAF7yx3s xXHasKBAfdDfA6FCp4TCkQtMA9POWKa36O3P96SXAofliNBsKHbjaQx3mu4UGbHd eqW6GT+/hO1KC5oUl5x+6mkyOnJ8eT2LZZZjTE3oYAPt17sTeWhcGumlzq5JN+O6 T1ASeHxyTPBZY9AltyFQw44/0+UCAwEAAaNfMF0wHQYDVR0OBBYEFFgSLuujKd38 woZC0gW/Z1uML37WMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQCON478iP4WqiqWO5Wp49rbjoReFS+8d9ows94+/OaM8hn9AJBM/oiTYP/JEhxz 2qop9Zf7aKEmt8d/SkUHxb3odHjlgQyRm0f/wwVFDrj9ZtRyC3xG8JLhe+Q24ymC o5GiP9RoFB7hbvov6XQ2MxQnYn7ottiuPduHbQ/xV3yl81ovu/xoGaE1UU9fxzm1 LlBsSAau61BHQxLgx18Afkh3ucu1VOJaRuqQeHLdaeMIJ7FYjsuiyKnCMTaTHHyb jF1XM2kSlTxrXbkEYgzX/oJntZZrVY6dGk3jwphreNQKOanXBWPNX6t11e9+q0v0 LIyv8dm5//Luvd3sOJ1W8VNeR6dEG+HD11k5kMp9Qnknr9uQZHJ972t9xGcBuXmJ 0VBGmhlHCNujBQn0dH1aLPg3/HjODLMqWla812a09sv2KfxFHsDsEhV2lB4NWaDy x3xjN4POSJcOsaQ1rl5oARQ8sa2dLe5fI89b7KRR8gQl4bFZLHEUK69PzvFYGNTS bFKW/n+i/1VImD4EEA14Yan6TWUuv98H4dYoyiBElIUElCeLpo5YzIzDq1+avTUO hATMdW8WHolZLQqgmOHmGtRrXyFx5wPDStooX9I/GpwlSt1Oe/Pj5xKHZyqG9bWK oxd+k3kdlcjur1H4a7r+tc8n/23+AgdrcpM9GUX3Vm5jiA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/53/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/53/end.crt000066400000000000000000000035021322470703100217020ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBXzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTExMTAyNzAxNDc0NloXDTIyMTAyNzAxNDc0NlowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDI2GjVtIDcw0uwmcAgpeoK3juuisbi wA5SaVxdKGpFVv08PtvgjPMbn9wminvKHafpgEuljW9kQfq6/r27xFxVsy3rtgR0 /kCXW1FadbNvwJ/elW8PPCE9fgaL5KIDFJ4qFJ/K27N1X722FuNKb2Kik50h5lwY 9Qzt/C3w56hSLFp8veclPtmulpim+HtQEOB4hUL/5zjV1CvRrLhl4CFlw7ZSUn3c LV9guiTO8SWcZXoHfJI91vAhNoztb8s7ehPpPd7dwlB7A/sYTyBQ+a+bsurmL97q eYBqrrCPr9rTBoN+aJfHaL/7HsnkGGBMfhxlA1ujDRIoEhb/mGCThA17AgEDo00w SzAfBgNVHSMEGDAWgBRYEi7roynd/MKGQtIFv2dbjC9+1jAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAKuHJEj0/gMQH0h7JSaCA/AfigY8U/tIbw/4vGCzjz/fCS/0f3SfP1SGfjYw 9e1A6k8hynagMDoeeXWkaHwRAQKBGTzElFdF1cDjwAfbpu9om02JEOLagOFsN39H Um/7TJW+DODbT40L2wVWFR7Zd0H3vIo1GY2Fr4vAOdDbjM9K+LxL8aVdVb7yqF6P OfJtsockGL5rUUDSwKqgSrMaSuJzoKTVAhFZz3ajV+ZUnWNbStaGk1QhAZ30clgA TM0URjz/lBOWNfYiy97Pcs+N4MOJ3qIXPZi+XlrRQcPf4xHFQWFuJUlLZhNji5Ix ExuXmEplnYO7ELQrtZsQBj6lfqbFJhAVMQb35E/tyOI0kKRhpWaw3R/FDu2K1o0t IO17uP3YxcpVRvIlPk99cXxzNZ7B6jSw/5dEO9bpM4lkur0AHbFGxtOTpYAbhwnD 24rLhcXG7ZtNZet71ibC4MHstrouyAscsQk3fSZPuuck7xcxL96ricZ4JuI6hv3T TKjuRdAb5SJCBz7ZF1mZy8SR93i7hJbWA2bNuoFgZJ1xMWLJZETDYJrPbNF4PR/7 0v/kymmeHXO+23rnQ83opTj/t5EwjDij38C6cUm232ZuzOuoQw5DFL72+wqq4e5a uo1FSEa2RrgI56uMQOV/o5/7ws2HfzqPue6k2c6VSqXUu7cj -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/53/root.crt000066400000000000000000000042071322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBKTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTA4MDYyMzAxNTczMloXDTI0MDYyMzAxNTczMlowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJQ5t7CI17BeMhw+ kQVP7+cS8PNTkqUkDfsyXz9BaVMzSSXoLIyCyyCgMLUdKnbMEE405LpMCUseoncM ugH6DV7daRht/2ZwI0w5dvFRZfEDOIP3VxZNFEi/qnWhTk2H/MHjFl/BqcENg1Ur egh0mXL53lYkhszt5jdPOivAE84mX54cLQeJzAeHgHATcCxOSPmB4wxBBfAO/O8F kVO0Q5F62O4qq+vEuLAz0RUMYR9yyjEQdxOTxACvSqH4wDsaV1hFgsRUGv8cAXlh OKmqBQr+QeHMEGTuTCbGUu5qsukAIoLofiub72AI58sTnnyGFrEAQAjvI9AuuBSp AcwCT3MB8UidsZWwa5j97dK3EmutnZmw0JWOajnp3BexEe2ykgYSMvcMHFcdkUlW cBML40nG8OfoMEy24Y9uhk2WdLxAbijpBPHlCvjEvPZZcz8Lh3Dl78U7to4Furvq nbWEAywjaq+F90krxlywsHw73rxyvLf+u697wvjlxbf1RcklIkyP/P7XiAF7yx3s xXHasKBAfdDfA6FCp4TCkQtMA9POWKa36O3P96SXAofliNBsKHbjaQx3mu4UGbHd eqW6GT+/hO1KC5oUl5x+6mkyOnJ8eT2LZZZjTE3oYAPt17sTeWhcGumlzq5JN+O6 T1ASeHxyTPBZY9AltyFQw44/0+UCAwEAAaNfMF0wHQYDVR0OBBYEFFgSLuujKd38 woZC0gW/Z1uML37WMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQCON478iP4WqiqWO5Wp49rbjoReFS+8d9ows94+/OaM8hn9AJBM/oiTYP/JEhxz 2qop9Zf7aKEmt8d/SkUHxb3odHjlgQyRm0f/wwVFDrj9ZtRyC3xG8JLhe+Q24ymC o5GiP9RoFB7hbvov6XQ2MxQnYn7ottiuPduHbQ/xV3yl81ovu/xoGaE1UU9fxzm1 LlBsSAau61BHQxLgx18Afkh3ucu1VOJaRuqQeHLdaeMIJ7FYjsuiyKnCMTaTHHyb jF1XM2kSlTxrXbkEYgzX/oJntZZrVY6dGk3jwphreNQKOanXBWPNX6t11e9+q0v0 LIyv8dm5//Luvd3sOJ1W8VNeR6dEG+HD11k5kMp9Qnknr9uQZHJ972t9xGcBuXmJ 0VBGmhlHCNujBQn0dH1aLPg3/HjODLMqWla812a09sv2KfxFHsDsEhV2lB4NWaDy x3xjN4POSJcOsaQ1rl5oARQ8sa2dLe5fI89b7KRR8gQl4bFZLHEUK69PzvFYGNTS bFKW/n+i/1VImD4EEA14Yan6TWUuv98H4dYoyiBElIUElCeLpo5YzIzDq1+avTUO hATMdW8WHolZLQqgmOHmGtRrXyFx5wPDStooX9I/GpwlSt1Oe/Pj5xKHZyqG9bWK oxd+k3kdlcjur1H4a7r+tc8n/23+AgdrcpM9GUX3Vm5jiA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/54/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/54/end.crt000066400000000000000000000035021322470703100217030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBYDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTExMTAyNzAxNDgwNloXDTIyMTAyNzAxNDgwNlowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDUA2/eueKJWs9iqIILxn2SA9I68igF /jQU3sNPdSkse+WKT8AuCxsys3jxvp5u623MovzNunh+MtVFrOUvpir0AC95gjT5 9aAExXAvKuwKwlVJl0TEhJFYSzP9dujpcVRECTM7a2GQaznYqqtxVguVV9bkLImM d0yrXEgokpMxgnHH15k1OY9o66xq9YtQFAcE+TTgqvl4XFBsgUCqBt/rrlL14QSA sp8/SdZySyB/4yoovUzuO8+dmquLxxZHbkSW+iJpTq9s7ftzl6F6RAltToLsg3lo d6WuI3ebqy3IEKfVjs3jOIvFKDOIuJW4Ax+qPPE2HwyKh616zzvGlVjzAgEDo00w SzAfBgNVHSMEGDAWgBRYEi7roynd/MKGQtIFv2dbjC9+1jAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBADDYy25ffaDn59aaIB2DgYyAdlqatlXh1eARnW7mcRZIp0g+6D8tm8OcucPZ kB3q39zUXPqXrLvITjFiCdGeddmYcApXF8aMUZkx16bAkGGcAp7vlU8I7zcZ4fEX 7t3xGRX4eKMoC5eCtgx8bz5FWMO2PlJuq5GtUe3sVxOfmFlTdVms+YqrwBFUdkIb ItN8PkHUOmCpQh6L1wWQscDKzMNDjJfooILZ2hdTKV6rocmzRwFp+z4m18swDEKx gLuto0q7rf1xdBCVqkssCEoWXia23+xNjthmPRMnjyQzsqzzwM7xR5/0JFg/Uxb0 lsHTX5xwdK251IXAztNTwSOW1v2bc0kt/mOfjg6VqqR+SAd0wM0GYK66dMgRyu9a DCVhoAxbtF9CXwcYEj0RvTn9j3S0JFX4fjXu74P7T1U5zH06tFmDxcCln7pgHAro Ns3MzCDoYZM/H7G3NXhRw+zfz2Ej+rkJo6TPXI1zPEYI7PEJfvg7L//MvPvASmSA 70RC4J1AQROVHpRfH2sTpXJIa46y+jChHVbYlkSFbFmj2I4E7yAAR2TeB0m6W2Yn FJ0uFb5O596Zm0XfP2kWAE4vI6yNWP3mt3zfzLIxDDa5k3Dhocdw1Idlc826T952 AjP+orbl0BiQ8b5aUyn5HqfymmijPTZgRY/yCquzPCTToOQW -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/54/root.crt000066400000000000000000000042071322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBKTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTA4MDYyMzAxNTczMloXDTI0MDYyMzAxNTczMlowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJQ5t7CI17BeMhw+ kQVP7+cS8PNTkqUkDfsyXz9BaVMzSSXoLIyCyyCgMLUdKnbMEE405LpMCUseoncM ugH6DV7daRht/2ZwI0w5dvFRZfEDOIP3VxZNFEi/qnWhTk2H/MHjFl/BqcENg1Ur egh0mXL53lYkhszt5jdPOivAE84mX54cLQeJzAeHgHATcCxOSPmB4wxBBfAO/O8F kVO0Q5F62O4qq+vEuLAz0RUMYR9yyjEQdxOTxACvSqH4wDsaV1hFgsRUGv8cAXlh OKmqBQr+QeHMEGTuTCbGUu5qsukAIoLofiub72AI58sTnnyGFrEAQAjvI9AuuBSp AcwCT3MB8UidsZWwa5j97dK3EmutnZmw0JWOajnp3BexEe2ykgYSMvcMHFcdkUlW cBML40nG8OfoMEy24Y9uhk2WdLxAbijpBPHlCvjEvPZZcz8Lh3Dl78U7to4Furvq nbWEAywjaq+F90krxlywsHw73rxyvLf+u697wvjlxbf1RcklIkyP/P7XiAF7yx3s xXHasKBAfdDfA6FCp4TCkQtMA9POWKa36O3P96SXAofliNBsKHbjaQx3mu4UGbHd eqW6GT+/hO1KC5oUl5x+6mkyOnJ8eT2LZZZjTE3oYAPt17sTeWhcGumlzq5JN+O6 T1ASeHxyTPBZY9AltyFQw44/0+UCAwEAAaNfMF0wHQYDVR0OBBYEFFgSLuujKd38 woZC0gW/Z1uML37WMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQCON478iP4WqiqWO5Wp49rbjoReFS+8d9ows94+/OaM8hn9AJBM/oiTYP/JEhxz 2qop9Zf7aKEmt8d/SkUHxb3odHjlgQyRm0f/wwVFDrj9ZtRyC3xG8JLhe+Q24ymC o5GiP9RoFB7hbvov6XQ2MxQnYn7ottiuPduHbQ/xV3yl81ovu/xoGaE1UU9fxzm1 LlBsSAau61BHQxLgx18Afkh3ucu1VOJaRuqQeHLdaeMIJ7FYjsuiyKnCMTaTHHyb jF1XM2kSlTxrXbkEYgzX/oJntZZrVY6dGk3jwphreNQKOanXBWPNX6t11e9+q0v0 LIyv8dm5//Luvd3sOJ1W8VNeR6dEG+HD11k5kMp9Qnknr9uQZHJ972t9xGcBuXmJ 0VBGmhlHCNujBQn0dH1aLPg3/HjODLMqWla812a09sv2KfxFHsDsEhV2lB4NWaDy x3xjN4POSJcOsaQ1rl5oARQ8sa2dLe5fI89b7KRR8gQl4bFZLHEUK69PzvFYGNTS bFKW/n+i/1VImD4EEA14Yan6TWUuv98H4dYoyiBElIUElCeLpo5YzIzDq1+avTUO hATMdW8WHolZLQqgmOHmGtRrXyFx5wPDStooX9I/GpwlSt1Oe/Pj5xKHZyqG9bWK oxd+k3kdlcjur1H4a7r+tc8n/23+AgdrcpM9GUX3Vm5jiA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/55/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/55/end.crt000066400000000000000000000035021322470703100217040ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFMDCCAuSgAwIBAgIBRjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTEwMDQxNTAxNTgxOFoXDTIxMDQxNTAxNTgxOFowgZMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKDBNKYXBhbmVzZSBHb3Zlcm5tZW50MSgwJgYDVQQLDB9UaGUg TWluaXN0cnkgb2YgRm9yZWlnbiBBZmZhaXJzMRUwEwYDVQQLDAxlLXBhc3Nwb3J0 RFMxJTAjBgNVBAMMHE1pbmlzdGVyIGZvciBGb3JlaWduIEFmZmFpcnMwggEgMA0G CSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQCtYT9LpGckN+VOnI6Vtmc6/WlzNsDr 01zfQ4LCbQmlEE3o1boXE4hXLwkQ0yLFb3FB2O9/7tq9atx2FJp5uoL44hhBQNQJ mlmiGTioNQlKftGrEOSFnIcTj86jT5TEf2y/qgsZbe4lTYgTt7Uqf0mEkd+O0zio sKbGfPl73KkB5ghWY2ibYKOMURwqF0zMDCW2LLNvk4Wx+95SNsf7+heX7uLtSOV0 NuCSTjlthtwiY1sotCTutAqwBFtY4KJ6JjBXW8TrUy/z/kti+4Ra29NLDTg+yibP 4jxod72umNTWGwVcnG37yTMYlPIAttYZ/m+I9xSFGmrRq27YOqZmmIdFAgEDo00w SzAfBgNVHSMEGDAWgBRYEi7roynd/MKGQtIFv2dbjC9+1jAOBgNVHQ8BAf8EBAMC B4AwGAYDVR0gBBEwDzANBgsqgwiGj34GBQEBAjBBBgkqhkiG9w0BAQowNKAPMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAD ggIBAAQM0YxEg+hEjoZynCUKgXg7pM03i8tCNNHKFQPzUUrOSZgdjHydB7SrdgjO f7YPTSARKchUPLi39xU+fvXgujkaMT0L9na8PQICoOBG/HiWG5i1XwdBeYhobY56 lUsPLgWBDfdso2plWE0em4TqMvrz+NAvcIhQCYQsUCd8u5P4zk7EsVS3Eyr8UYaW R5PzpwEKUaGzDM/qO3siihX8MzZ8wliEP78bh4bQPQ7Gu4ZxpLQ3kIvCs4baPSep 2GJduRieeptw0T/Nifxpn+Z91xwiVxnEaGrW+/xj6+PYMJD9nUB3rqaxQS9IiyoH LIOJp5osh7/QaeYTdER2QysbT65AKUamwupH/Hn3S43JvnPKzbT6e3pAy8Fisdww J8xUl4p/YlynjPWUclFLC2lfFp+uzyFa26CXuuWH0yVBqqsFqY8oW1X9NCc4YH8o jIV3GPf1yVVYgYBMNnYg8tW0oBofeSbQI2uVJFKbNDd9Xpa23kb1vLv/bLnTDuyN QSESTCLTiWp8cKN9/qgCA/jf5bz5PPtU5StGVnzs6gbxWrPe4WN8BZmAjwQ6+KLn lpFzANWqOgFmR8dnt4JZKxH2IeyTAs/BDeI42G+mx+s/MZZ05Z2E7QTF2hQOA2D1 j1M3OkDbnOFmX9XkOY/LUZUZHD12X9ME2B2B9pira0H7NhEB -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/55/root.crt000066400000000000000000000042071322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGHjCCA9KgAwIBAgIBKTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTA4MDYyMzAxNTczMloXDTI0MDYyMzAxNTczMlowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJQ5t7CI17BeMhw+ kQVP7+cS8PNTkqUkDfsyXz9BaVMzSSXoLIyCyyCgMLUdKnbMEE405LpMCUseoncM ugH6DV7daRht/2ZwI0w5dvFRZfEDOIP3VxZNFEi/qnWhTk2H/MHjFl/BqcENg1Ur egh0mXL53lYkhszt5jdPOivAE84mX54cLQeJzAeHgHATcCxOSPmB4wxBBfAO/O8F kVO0Q5F62O4qq+vEuLAz0RUMYR9yyjEQdxOTxACvSqH4wDsaV1hFgsRUGv8cAXlh OKmqBQr+QeHMEGTuTCbGUu5qsukAIoLofiub72AI58sTnnyGFrEAQAjvI9AuuBSp AcwCT3MB8UidsZWwa5j97dK3EmutnZmw0JWOajnp3BexEe2ykgYSMvcMHFcdkUlW cBML40nG8OfoMEy24Y9uhk2WdLxAbijpBPHlCvjEvPZZcz8Lh3Dl78U7to4Furvq nbWEAywjaq+F90krxlywsHw73rxyvLf+u697wvjlxbf1RcklIkyP/P7XiAF7yx3s xXHasKBAfdDfA6FCp4TCkQtMA9POWKa36O3P96SXAofliNBsKHbjaQx3mu4UGbHd eqW6GT+/hO1KC5oUl5x+6mkyOnJ8eT2LZZZjTE3oYAPt17sTeWhcGumlzq5JN+O6 T1ASeHxyTPBZY9AltyFQw44/0+UCAwEAAaNfMF0wHQYDVR0OBBYEFFgSLuujKd38 woZC0gW/Z1uML37WMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMBIGA1UdEwEB/wQIMAYBAf8CAQAwQQYJKoZIhvcNAQEKMDSgDzANBglg hkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IC AQCON478iP4WqiqWO5Wp49rbjoReFS+8d9ows94+/OaM8hn9AJBM/oiTYP/JEhxz 2qop9Zf7aKEmt8d/SkUHxb3odHjlgQyRm0f/wwVFDrj9ZtRyC3xG8JLhe+Q24ymC o5GiP9RoFB7hbvov6XQ2MxQnYn7ottiuPduHbQ/xV3yl81ovu/xoGaE1UU9fxzm1 LlBsSAau61BHQxLgx18Afkh3ucu1VOJaRuqQeHLdaeMIJ7FYjsuiyKnCMTaTHHyb jF1XM2kSlTxrXbkEYgzX/oJntZZrVY6dGk3jwphreNQKOanXBWPNX6t11e9+q0v0 LIyv8dm5//Luvd3sOJ1W8VNeR6dEG+HD11k5kMp9Qnknr9uQZHJ972t9xGcBuXmJ 0VBGmhlHCNujBQn0dH1aLPg3/HjODLMqWla812a09sv2KfxFHsDsEhV2lB4NWaDy x3xjN4POSJcOsaQ1rl5oARQ8sa2dLe5fI89b7KRR8gQl4bFZLHEUK69PzvFYGNTS bFKW/n+i/1VImD4EEA14Yan6TWUuv98H4dYoyiBElIUElCeLpo5YzIzDq1+avTUO hATMdW8WHolZLQqgmOHmGtRrXyFx5wPDStooX9I/GpwlSt1Oe/Pj5xKHZyqG9bWK oxd+k3kdlcjur1H4a7r+tc8n/23+AgdrcpM9GUX3Vm5jiA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/56/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/56/end.crt000066400000000000000000000037351322470703100217150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBMzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTIwNTMxMTYwMDAxWhcNMjMw NTMxMTYwMDAxWjByMQswCQYDVQQGEwJDTjEYMBYGA1UECgwPSG9uZyBLb25nIENo aW5hMR8wHQYDVQQLDBZJbW1pZ3JhdGlvbiBEZXBhcnRtZW50MSgwJgYDVQQDDB9I b25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQgU2lnbmVyMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAgce60T0fQ0lHpjrf5vdBBY6NGQvOLamwSFEfJtbugjie qoROwsCZDFmZD2eZJehIhhkAjJFu71rPSf6XhhXxrRrVDo4Pmhdf5XI87VwRcyck uBSUgT3oOFquryUnvv3J59DLikjAviPcyn5p7ViUU2VZ7tCFXiE+qwZFiTCudw3B 1jVRJudC2IRhnFoewh1xNdnF8TxxkzfjmhJZTakUIvZaxTT9C2OZ6UdDTQxCprf6 4FPrwXCBZw0GW/9734yFY7H10ZEneXt+JgYSovMYegZltnUjGNtJtDCokvddoB9V sx/aQGO2GxgJpf6AKNwtEQONABtx6M0KM0oZBJagMwIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBShS2ZQbbm9+cB2dOphiptaiNis36GBjqSBizCBiDELMAkGA1UEBhMC Q04xGDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRp b24gRGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCASkwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQB/VbnCTTV1dQ5IL1E3fx/+UK09DZQSl0uNKusL HGWTJta3IjUs0q5WZKvvZ2kQPYO7A+XHB/AzPoYkC8VzBnKmQfHndz6t/uZwR5dA WZCBuuiBu1fIpD6U9ALnNtsdbQwp6EhgajdaC83HREk2U0A1t2SpfczuPpHr/PZl Fcr2O4pP3VrNcYUAum9mBPHp2yS3fwc98hiEfIhEjKqBpaj5tgvn9K9OyyqPH58n Stg/Sxgd8zoWhiymznZ53aaNWM2EbR+6QNjiRsCwICMWAr5BBSZOa6zmont8yyRg CDR66nRSu5G/NXpGqCpEnl3gTmMKlObIJvZ7tdJd6e/2BwqQRSESDmnkHO2RM/Cz vp3OhKILEBKxdKyeGCi4wHIMD39+L0tvm/k2CxNuIy0MjwIH0KdwusH3K7Np2rtg +Z72pWvDPspXWItXcYGMIwBlgXoeBrpmWtaEuDR8PCE5rjph2q4R5oqm5wrjCJmu MHySA7s28UQo9SN0iPZdQxwHuoT7KiY7aTFqNXkhiWnBarMhjuqJmDKyTLym2mHs Ax5/qNF3wpFKEEoLtGvrACTNXRyXZE+YXyLDEx/xxv20sBNZO+EobpTlzz1QxT8R rArW6pePeqjUNDseKSpaz4wGadOvZ4Z7VfnXQqBVTKG0F9SaHbzBCcf9zEQ7rTJk rstAkQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/56/root.crt000066400000000000000000000042401322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBKTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTEwNjEzMTYwMDAxWhcNMjcw NjEzMTYwMDAxWjCBiDELMAkGA1UEBhMCQ04xGDAWBgNVBAoMD0hvbmcgS29uZyBD aGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24gRGVwYXJ0bWVudDE+MDwGA1UEAww1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCgq+637INet9ru Quy970VFXuRF63ymLaQlLcpTWg7VBAtjdchOUX5q8DBmWzzJtxp6EsDlhFMAz6m3 6/scHnxsmE7LZGJllnzvPmEmiZi41oWvBxVyHNah91itMMxMGWDurIlH66/1sqkz 0iYVdZItIYktGXtlSt1wPRfUyvbPMRwrGHiF5eUt8vqhVMzw667q2xU0EuBDDv8c dJam6lE/2Y9a8nEhsL4lJVgvMJl0twLHDzFLlYzWMSNfqxvcdWmq+IT7dLScQJdj 7r3QtBL2XGMxgCvY5fMcYJ+yQ1BhjdCLK36uh3EVevVgXCa7wDeG9gfBFDqBX6Ud R6C8DOln0dSeoG7kNTDd0iHannA0KiGztEPae12oP1wJQkE1kh/R6jBB2pXW0OF9 df6h7zkw2vCgBGzKAgm2wDsAxOdo7v2y2rz+dRnBmBTFESNhDyArg8mIwbabfLnp pHfTQArtXw4JNgEum+nyyfLsw/4f4121rWCzOnpM+51GL2SNzLj0S3XTnX538WE9 2EfGS8dY68I6cqEUxtyD8zfjSTxKCo5+j940yK5EHUpeKNJRXHE7t7pbm15xHdJS 3QS0oaPf5WnMM+t6hiA0Ga7+k7rTwm66eZAgUMr7QdseLO/VuIY8n5XLUgSlC/nq 0hV/1vPk6kIYS0EvZ8NakODbT/LBwwIBA6NFMEMwHQYDVR0OBBYEFKFLZlBtub35 wHZ06mGKm1qI2KzfMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQB63sCxn9yon6XPXjMyl0SiDiIQ6SL50/izARIi ggrPQeY47Sfq4wtEOD+HNy3C2tmF3m+s6FpQG3ZO3eKu5wrWss2Mc0pwTSKSdrdL c3zfPAgi6A+P+71+hy7axtaUYmlxcU6RT4NYT8H5H8xWZrRCv4gItWfrfyfHlmxA LETGF6E4zobVVzrlC8IHMrDvNWmcilgLLF6Fh8BTC1TFpBI5G4juFXxGB2f8CWSA H3nqZ0Aw2kkY4QvQ5guOKVnz0o5d9tgSQKlN6FaYLqVKWqgdd5739MHDe79sKTnN 6ir3WmemK+lGGLgRwS+t61RqBaLsTMl7UOF+xypSkFZCo+WkmAek2XyFYv8R5dSB Z5ErBWRyty2aRmKBckFnTwgzTw6Yt0nqLtYLQePml2CO+NAhNMIT6ztBxmqlQ/LM fR3L8r0ke5AJNCWa0FuRsvkNtoxCzirxyEPiSQITuOMpWCqQOKTu3yAK1zCOvC58 3IfeU2eNI/B30wF1EERZcsWKPybCsLKs3prf85l+W23o/zWSPIVTPd8TIKZnONs5 zIlEq0sNB6AhmfJm+t3SVtPIwETTHPiFONpxmCViVNbh6+v0WRGLL6+MbYXHj5jU PQlHenD9lEvYlVA4VKpjOMo8MAiTB9mCe0cmswYr5XBzRPfd8avFq96g/oCmZs/i xS54jA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/57/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/57/end.crt000066400000000000000000000037351322470703100217160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBSjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTUwMjI4MTYwMDAxWhcNMjYw MjI4MTYwMDAxWjByMQswCQYDVQQGEwJDTjEYMBYGA1UECgwPSG9uZyBLb25nIENo aW5hMR8wHQYDVQQLDBZJbW1pZ3JhdGlvbiBEZXBhcnRtZW50MSgwJgYDVQQDDB9I b25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQgU2lnbmVyMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAj1YV31XFgkXpDqNcYAOZ32W0/iIcfP0IOwphBCZJ1DHI BDGJ6FeUJ7P4gapJxheHrwy7yQF1+Daw3ZwpNbjO9SSsF9qYwvsa1duQbUFfZqG1 y9l+rVIgeMVt8Fi91rpxJ4Ol8wSdsIATY2GuFNWv1QxvAeHmOyTkCkNWCzWcE9z7 miIm468HcDbgwzt6GIpYQbQJm7NrQYXVccHrUuyZvVHddNtT7ZnWzHKBrHCMD9Xv Fa+X2TKlOJjAbaC38Hqak6HMcsqU1uBrddjNvOKKPN8iZwOoZ/Tof5FYyg57STKf eGEQ3yOqUHiVFHTqIY6NWf4BN4E9Fh0YyJYZpryfNQIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBShS2ZQbbm9+cB2dOphiptaiNis36GBjqSBizCBiDELMAkGA1UEBhMC Q04xGDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRp b24gRGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCASkwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQAgOjUqyVYJ7dIAv4eMukSfM+93LgDBn//avJqA RhG9G6gJFn9r17Jjt22x23E/nRNGCP25QTkODX8omo6FmmE603oAiLIKwoRExhDO byWS/1xC3wv+tM6bo3NjtwR/XQq8WwnHJw+L/cfMjJD1b8WzIQ/jAy7WXX9udEyb ZSMV9h6Vs4su1x6r4waSnBS1etuyeDpldXqrzGIcYLY4cjEyqtPyYX/BqCtJX6Ut vN2So2S554kjLKL4S1omyXo7DN+3RayX/fms7Ac7nWAbsEaiXdnFFUeCcaXMOdzA pXHQEHZXUp3P9hoGmkYjs2nXzCDjbfkYmoRnYWHAMSpmyrrnI0Yrwf1T5DQw24Dv fecDEaeoR4pphr45Wl1S+xShCQ1JlpHfpTuiueplSc3rBltu0zcg6ZjrzYZ+110c xglGqkFTBIvr0nAY4t/1gBx5rJdBCt++6b1PA2M3St90PXZeLYWDVw8zWDZvz1PB RanBHamb1GGBMZgo4raINWKvbaNGei3IhNNUxGJS50rv3o9/NiQVRukBpOSBtNNE /AeUkgVqhs50j2VFpl2xtjTptplwioHFTS+xr4arzcvKgUCXO8FZXo/FQdo8WGEq HOvPOPxqLILMX9yGLH416cBJqhaz2+/XcD3MlGzAwDWu1ZTBslCG6YY0JjBQP3w3 FqewKg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/57/root.crt000066400000000000000000000042401322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBKTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTEwNjEzMTYwMDAxWhcNMjcw NjEzMTYwMDAxWjCBiDELMAkGA1UEBhMCQ04xGDAWBgNVBAoMD0hvbmcgS29uZyBD aGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24gRGVwYXJ0bWVudDE+MDwGA1UEAww1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCgq+637INet9ru Quy970VFXuRF63ymLaQlLcpTWg7VBAtjdchOUX5q8DBmWzzJtxp6EsDlhFMAz6m3 6/scHnxsmE7LZGJllnzvPmEmiZi41oWvBxVyHNah91itMMxMGWDurIlH66/1sqkz 0iYVdZItIYktGXtlSt1wPRfUyvbPMRwrGHiF5eUt8vqhVMzw667q2xU0EuBDDv8c dJam6lE/2Y9a8nEhsL4lJVgvMJl0twLHDzFLlYzWMSNfqxvcdWmq+IT7dLScQJdj 7r3QtBL2XGMxgCvY5fMcYJ+yQ1BhjdCLK36uh3EVevVgXCa7wDeG9gfBFDqBX6Ud R6C8DOln0dSeoG7kNTDd0iHannA0KiGztEPae12oP1wJQkE1kh/R6jBB2pXW0OF9 df6h7zkw2vCgBGzKAgm2wDsAxOdo7v2y2rz+dRnBmBTFESNhDyArg8mIwbabfLnp pHfTQArtXw4JNgEum+nyyfLsw/4f4121rWCzOnpM+51GL2SNzLj0S3XTnX538WE9 2EfGS8dY68I6cqEUxtyD8zfjSTxKCo5+j940yK5EHUpeKNJRXHE7t7pbm15xHdJS 3QS0oaPf5WnMM+t6hiA0Ga7+k7rTwm66eZAgUMr7QdseLO/VuIY8n5XLUgSlC/nq 0hV/1vPk6kIYS0EvZ8NakODbT/LBwwIBA6NFMEMwHQYDVR0OBBYEFKFLZlBtub35 wHZ06mGKm1qI2KzfMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQB63sCxn9yon6XPXjMyl0SiDiIQ6SL50/izARIi ggrPQeY47Sfq4wtEOD+HNy3C2tmF3m+s6FpQG3ZO3eKu5wrWss2Mc0pwTSKSdrdL c3zfPAgi6A+P+71+hy7axtaUYmlxcU6RT4NYT8H5H8xWZrRCv4gItWfrfyfHlmxA LETGF6E4zobVVzrlC8IHMrDvNWmcilgLLF6Fh8BTC1TFpBI5G4juFXxGB2f8CWSA H3nqZ0Aw2kkY4QvQ5guOKVnz0o5d9tgSQKlN6FaYLqVKWqgdd5739MHDe79sKTnN 6ir3WmemK+lGGLgRwS+t61RqBaLsTMl7UOF+xypSkFZCo+WkmAek2XyFYv8R5dSB Z5ErBWRyty2aRmKBckFnTwgzTw6Yt0nqLtYLQePml2CO+NAhNMIT6ztBxmqlQ/LM fR3L8r0ke5AJNCWa0FuRsvkNtoxCzirxyEPiSQITuOMpWCqQOKTu3yAK1zCOvC58 3IfeU2eNI/B30wF1EERZcsWKPybCsLKs3prf85l+W23o/zWSPIVTPd8TIKZnONs5 zIlEq0sNB6AhmfJm+t3SVtPIwETTHPiFONpxmCViVNbh6+v0WRGLL6+MbYXHj5jU PQlHenD9lEvYlVA4VKpjOMo8MAiTB9mCe0cmswYr5XBzRPfd8avFq96g/oCmZs/i xS54jA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/58/000077500000000000000000000000001322470703100204275ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/58/end.crt000066400000000000000000000037351322470703100217170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBQjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTQwMjI4MTYwMDAxWhcNMjUw MjI4MTYwMDAxWjByMQswCQYDVQQGEwJDTjEYMBYGA1UECgwPSG9uZyBLb25nIENo aW5hMR8wHQYDVQQLDBZJbW1pZ3JhdGlvbiBEZXBhcnRtZW50MSgwJgYDVQQDDB9I b25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQgU2lnbmVyMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAvKJdq7eQWErRv1jOGmPJIEYlXSVCnCcTQB/8Gek81h2K 405y9hSx5fRmsuc4/BEBysEwvH00FyI0rVwrW9W8MuRuvCv74COON585WnYWxOvG jHfhzjHGfWjpdaGC3JaQ+qH196FPc3RK9rB7xaHD3iM/xFU7mZWBlMuUl/6eZK89 Od/bKzq/9sl2jWwgSHqCq3DsA7entjQ2zwW72e2a1kYWzYW7QsDCn7mpC3uEkY1J xnFVP9570M8y37/KRRnmN3rKbEn+GhIHplJo/dzSNGqbwZ1vTlXuFviVzowHJEeZ AWsA1U/Okm/JsZda+Vz10KgN5z0Oj5/vjbpKU+su3QIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBShS2ZQbbm9+cB2dOphiptaiNis36GBjqSBizCBiDELMAkGA1UEBhMC Q04xGDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRp b24gRGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCASkwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQBheZUkdIcW40SFfQKknQ1sn6nKotWAvM4qAzdK pAeBnU8zT9y5zeXEKuERAOCsfztzdW6p8rofdvMVnzieFgff8gbcf/GNWp12Zb/j eX2Eh1IkDOKeRdgiSq08q4Y0YrdWKn53Djo0EKwEiv+Zx6Dt/xRwngatvJ5vqQit gmGuIDCrkioF4KOjGPR4ZtQVVXV7gwMk9fQoDQpNsits6uTmeoj3QBtoxqoo6bSz F5N/XqjjC9pS1YkTX+WLhlANOfvoAdj6WP6bR4lovkfegrUOIkY+/1Guu+tocUtO LQT/LGMNDDXbwWN5fnahfeBykM/WKsIIO0pM96i45L59CJpOoyk9o23oDeHnY5vL Wwxh73X1pL5AxHYpG0hI/AtGVcUSRIVqwZzAZqZa01iX9inWXMSMr1RfynJoi3AM JoibkqlvP3rvdXJMTowQl+QHNsGuITgjqcp7JzcqgqZ2yM5kwSoj4rgEjV8+mj+Q ybvS1CLtDnhReQDL41Qgl3lAfSO1+BAUyhwdOmuCy4zso3O3A+p4U90hjHYoDCxU Qgb2L6NuqLxaVD116RWI6Rt6sT697+gcQtgkLhkVIMN22pXGquDc3K6sFysMcZWf aEb8SKP+nvmvfZEzTqY5xzIoqJbzkPAQ9qzHcvd+wDlJsxDc17JizkVXvVyJm43/ 24PAgw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/58/root.crt000066400000000000000000000042401322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBKTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTEwNjEzMTYwMDAxWhcNMjcw NjEzMTYwMDAxWjCBiDELMAkGA1UEBhMCQ04xGDAWBgNVBAoMD0hvbmcgS29uZyBD aGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24gRGVwYXJ0bWVudDE+MDwGA1UEAww1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCgq+637INet9ru Quy970VFXuRF63ymLaQlLcpTWg7VBAtjdchOUX5q8DBmWzzJtxp6EsDlhFMAz6m3 6/scHnxsmE7LZGJllnzvPmEmiZi41oWvBxVyHNah91itMMxMGWDurIlH66/1sqkz 0iYVdZItIYktGXtlSt1wPRfUyvbPMRwrGHiF5eUt8vqhVMzw667q2xU0EuBDDv8c dJam6lE/2Y9a8nEhsL4lJVgvMJl0twLHDzFLlYzWMSNfqxvcdWmq+IT7dLScQJdj 7r3QtBL2XGMxgCvY5fMcYJ+yQ1BhjdCLK36uh3EVevVgXCa7wDeG9gfBFDqBX6Ud R6C8DOln0dSeoG7kNTDd0iHannA0KiGztEPae12oP1wJQkE1kh/R6jBB2pXW0OF9 df6h7zkw2vCgBGzKAgm2wDsAxOdo7v2y2rz+dRnBmBTFESNhDyArg8mIwbabfLnp pHfTQArtXw4JNgEum+nyyfLsw/4f4121rWCzOnpM+51GL2SNzLj0S3XTnX538WE9 2EfGS8dY68I6cqEUxtyD8zfjSTxKCo5+j940yK5EHUpeKNJRXHE7t7pbm15xHdJS 3QS0oaPf5WnMM+t6hiA0Ga7+k7rTwm66eZAgUMr7QdseLO/VuIY8n5XLUgSlC/nq 0hV/1vPk6kIYS0EvZ8NakODbT/LBwwIBA6NFMEMwHQYDVR0OBBYEFKFLZlBtub35 wHZ06mGKm1qI2KzfMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQB63sCxn9yon6XPXjMyl0SiDiIQ6SL50/izARIi ggrPQeY47Sfq4wtEOD+HNy3C2tmF3m+s6FpQG3ZO3eKu5wrWss2Mc0pwTSKSdrdL c3zfPAgi6A+P+71+hy7axtaUYmlxcU6RT4NYT8H5H8xWZrRCv4gItWfrfyfHlmxA LETGF6E4zobVVzrlC8IHMrDvNWmcilgLLF6Fh8BTC1TFpBI5G4juFXxGB2f8CWSA H3nqZ0Aw2kkY4QvQ5guOKVnz0o5d9tgSQKlN6FaYLqVKWqgdd5739MHDe79sKTnN 6ir3WmemK+lGGLgRwS+t61RqBaLsTMl7UOF+xypSkFZCo+WkmAek2XyFYv8R5dSB Z5ErBWRyty2aRmKBckFnTwgzTw6Yt0nqLtYLQePml2CO+NAhNMIT6ztBxmqlQ/LM fR3L8r0ke5AJNCWa0FuRsvkNtoxCzirxyEPiSQITuOMpWCqQOKTu3yAK1zCOvC58 3IfeU2eNI/B30wF1EERZcsWKPybCsLKs3prf85l+W23o/zWSPIVTPd8TIKZnONs5 zIlEq0sNB6AhmfJm+t3SVtPIwETTHPiFONpxmCViVNbh6+v0WRGLL6+MbYXHj5jU PQlHenD9lEvYlVA4VKpjOMo8MAiTB9mCe0cmswYr5XBzRPfd8avFq96g/oCmZs/i xS54jA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/59/000077500000000000000000000000001322470703100204305ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/59/end.crt000066400000000000000000000037351322470703100217200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBQDA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTMxMTMwMTYwMDAxWhcNMjQx MTMwMTYwMDAxWjByMQswCQYDVQQGEwJDTjEYMBYGA1UECgwPSG9uZyBLb25nIENo aW5hMR8wHQYDVQQLDBZJbW1pZ3JhdGlvbiBEZXBhcnRtZW50MSgwJgYDVQQDDB9I b25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQgU2lnbmVyMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAj7Of1QFfkIYXXPWxiEvoIfCoj5zNzggZs8ZmldaEiPO8 nAxHoInDFp0zEXySq/MGgzRHOBOSbseP7VDby17fhmDbmT1RA9szn7udW5dlc2ud 4FZecLP3uYNFkewQhwS79nMH3liqGopcBMl/MmqaIkdwyChDR7/pcpxzSnHHf7m2 SaIWFcVSLwGYLZuotIG7JaQvwIoQsg44FHZWvW2KaAsN7O7sd8Lgu5pVtEoQxCu7 oRk1CnVR2Yy+JjkLiAO+MJ0oiwJuoUaaO2QMs24xOesWsscssH0ytGJvtOauYGMJ XLuDlhy1bWHqPyI1uJqsrKcDbKerj/0qDPoqICMGiQIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBShS2ZQbbm9+cB2dOphiptaiNis36GBjqSBizCBiDELMAkGA1UEBhMC Q04xGDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRp b24gRGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCASkwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQBZwa6j/twA6c7iM+LG3pbz7uQB6QeegINkeYin KjUojCRGIMNK+oFdTw4+9d1uX212hX1T1bTIQ2BJ0yvcZpqnci4Z+2OBvBpZyNQD NIt5u5BmzMVuS0SwEbH7DHj5LKX+O8I/aRucnKTPD88wSIEiI66dszyDbC6KIVxq jP/Aawy1Nf3b3bbB4YCHh8fBxkvHd1gNxjsMH6077G6ei9EPGMvfBvGCIoK30xjj 2hC+ccx/X6jDI33c9mkOo7sB/XNEaPdl4v2wmYX8gJrE+9fu+yKqKGF4axhKcAIA FiLZce/Ma67ffmH6TPhZu+sRwWncUbr+hplAE8dMhpfWroClk3twlFY1Myg6+u6J Dd/PWsKUR87sZecewWf7TEhDK/0dM4qXEG7w3+yhWjlit7FROcEbX1Biz037JhDY F/JkvZ3TnZhNjpNuSKWJc5qsHa8BqilEnryx1Dz/ENf4XZy9RAMWQIZ6oVTvw9Au gVBPCiDhHY05Oblxvhz1yJ8t4pA5k/RvBvLKAVXi/jSFzCw8uHEHKIPDZnhhqZMZ jKNa3OsL4zrcgHPX0bsVxEGiLkB0GXBcKOYEozzA7V7nRlJEbfLtl4KQ6erIwbsc XLpR0gBk9Vi61Ovsoo2bqoUleo9nA51LzxzQzDmeu9J+eIWfvnvyiFZUvVmmZwsD XQszZw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/59/root.crt000066400000000000000000000042401322470703100221250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBKTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTEwNjEzMTYwMDAxWhcNMjcw NjEzMTYwMDAxWjCBiDELMAkGA1UEBhMCQ04xGDAWBgNVBAoMD0hvbmcgS29uZyBD aGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24gRGVwYXJ0bWVudDE+MDwGA1UEAww1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCgq+637INet9ru Quy970VFXuRF63ymLaQlLcpTWg7VBAtjdchOUX5q8DBmWzzJtxp6EsDlhFMAz6m3 6/scHnxsmE7LZGJllnzvPmEmiZi41oWvBxVyHNah91itMMxMGWDurIlH66/1sqkz 0iYVdZItIYktGXtlSt1wPRfUyvbPMRwrGHiF5eUt8vqhVMzw667q2xU0EuBDDv8c dJam6lE/2Y9a8nEhsL4lJVgvMJl0twLHDzFLlYzWMSNfqxvcdWmq+IT7dLScQJdj 7r3QtBL2XGMxgCvY5fMcYJ+yQ1BhjdCLK36uh3EVevVgXCa7wDeG9gfBFDqBX6Ud R6C8DOln0dSeoG7kNTDd0iHannA0KiGztEPae12oP1wJQkE1kh/R6jBB2pXW0OF9 df6h7zkw2vCgBGzKAgm2wDsAxOdo7v2y2rz+dRnBmBTFESNhDyArg8mIwbabfLnp pHfTQArtXw4JNgEum+nyyfLsw/4f4121rWCzOnpM+51GL2SNzLj0S3XTnX538WE9 2EfGS8dY68I6cqEUxtyD8zfjSTxKCo5+j940yK5EHUpeKNJRXHE7t7pbm15xHdJS 3QS0oaPf5WnMM+t6hiA0Ga7+k7rTwm66eZAgUMr7QdseLO/VuIY8n5XLUgSlC/nq 0hV/1vPk6kIYS0EvZ8NakODbT/LBwwIBA6NFMEMwHQYDVR0OBBYEFKFLZlBtub35 wHZ06mGKm1qI2KzfMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQB63sCxn9yon6XPXjMyl0SiDiIQ6SL50/izARIi ggrPQeY47Sfq4wtEOD+HNy3C2tmF3m+s6FpQG3ZO3eKu5wrWss2Mc0pwTSKSdrdL c3zfPAgi6A+P+71+hy7axtaUYmlxcU6RT4NYT8H5H8xWZrRCv4gItWfrfyfHlmxA LETGF6E4zobVVzrlC8IHMrDvNWmcilgLLF6Fh8BTC1TFpBI5G4juFXxGB2f8CWSA H3nqZ0Aw2kkY4QvQ5guOKVnz0o5d9tgSQKlN6FaYLqVKWqgdd5739MHDe79sKTnN 6ir3WmemK+lGGLgRwS+t61RqBaLsTMl7UOF+xypSkFZCo+WkmAek2XyFYv8R5dSB Z5ErBWRyty2aRmKBckFnTwgzTw6Yt0nqLtYLQePml2CO+NAhNMIT6ztBxmqlQ/LM fR3L8r0ke5AJNCWa0FuRsvkNtoxCzirxyEPiSQITuOMpWCqQOKTu3yAK1zCOvC58 3IfeU2eNI/B30wF1EERZcsWKPybCsLKs3prf85l+W23o/zWSPIVTPd8TIKZnONs5 zIlEq0sNB6AhmfJm+t3SVtPIwETTHPiFONpxmCViVNbh6+v0WRGLL6+MbYXHj5jU PQlHenD9lEvYlVA4VKpjOMo8MAiTB9mCe0cmswYr5XBzRPfd8avFq96g/oCmZs/i xS54jA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/60/000077500000000000000000000000001322470703100204205ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/60/end.crt000066400000000000000000000037351322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFoDCCA1igAwIBAgIBOjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTMwMjI4MTYwMDAxWhcNMjQw MjI5MTYwMDAxWjByMQswCQYDVQQGEwJDTjEYMBYGA1UECgwPSG9uZyBLb25nIENo aW5hMR8wHQYDVQQLDBZJbW1pZ3JhdGlvbiBEZXBhcnRtZW50MSgwJgYDVQQDDB9I b25nIEtvbmcgQ2hpbmEgRG9jdW1lbnQgU2lnbmVyMIIBIDANBgkqhkiG9w0BAQEF AAOCAQ0AMIIBCAKCAQEAmWUJDCP/QWogp5xRwK8QnwIp1w1KjGtEi/ulzaqCOLU1 vo5BvOeu0qnIJLWuARtVSE0aRiO1U7hTjS9ksfQd72+k/tRc4Ei+7/gmYkvxI0V/ wq9wha0Qp2tSzk0TBq8Pa1xAsNpkbR9NHTzrGIqSdpPDBo1/lypAqciZmwyl9x9c VToB2/C8Pb9lhJpmCkPR6Zqz6ABWIRIvhANEdxucftsbTKq+nAKOVqK2SrARiuBq zXr0UEsun8Mufun2fcTKhVWJLWRMDtINogU22CqCVVngMmi9VYGlmO4watJNyY/k 1MeVVaS+9r9SYZGIjS47F8Nx3DBj/pQByCjd8gz2wwIBA6OByzCByDCBtQYDVR0j BIGtMIGqgBShS2ZQbbm9+cB2dOphiptaiNis36GBjqSBizCBiDELMAkGA1UEBhMC Q04xGDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRp b24gRGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkg U2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCASkwDgYDVR0PAQH/BAQDAgeA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQBwSKWngkH63vFGdR+8QAUt5aI2Yk3+Hli/TcTm gaWMRHKiByZr9aMqOlcBA7Px2lFVOZ98tKjfGkEU4dyYctHdaHadUT6UBDyeTtoQ P+PzXxL5cHNlfs7JLGySM7CgfAruexJ/oti/YBUATx/xQBJWj8yXh2UpvY6eN6RQ YfxR+Z32XD2gZczpIezmTSGE195exEt2wjK2+TLCwjP635ohn3Z05vPkclFYBOIa 7sI+/BZZoJfDfqJERNKTsbboRMJUr0vryJ0QpbzZRNZ2Cga2JlV/FvGaATajUeoR KzbVjhWftpUL55I6iAO0lyrnZ7vnDBZS5bhH8gUJxNnwK5iI+HQ6nqnG8HSNz1J2 BYPOic6aX9r4NcnlAYAkeApCBm839y9JpP12RUEj62E/MzmkUATXAllpz1f77u7i 2xvUhMxIdgw9RyMFKxnLAvO87gmCe13mWlMEjmvsRWPIvJTBJc+u0B38X+UIy7/F WU2qwP/s1cjXr6tY9jnKbJ1dqkltq2bXflBaMiNdeYAIbWzftvIkE2cvAsGmf6Ua qKRbUFEdUo79sI/NXtkiPA/NR3vRNt0+Pa/ZRsEw7v9LPkRVsavB3O2Kvo65RM70 TqRwzLeKiNJkkbr+EcTncb19HJ53FGss8qsqETtVeuNu1c4CeOGzZkqjvthaENXL TmrSkg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/60/root.crt000066400000000000000000000042401322470703100221150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGMDCCA+igAwIBAgIBKTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBiDELMAkGA1UEBhMCQ04x GDAWBgNVBAoMD0hvbmcgS29uZyBDaGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24g RGVwYXJ0bWVudDE+MDwGA1UEAww1SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2ln bmluZyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTEwNjEzMTYwMDAxWhcNMjcw NjEzMTYwMDAxWjCBiDELMAkGA1UEBhMCQ04xGDAWBgNVBAoMD0hvbmcgS29uZyBD aGluYTEfMB0GA1UECwwWSW1taWdyYXRpb24gRGVwYXJ0bWVudDE+MDwGA1UEAww1 SG9uZyBLb25nIENoaW5hIENvdW50cnkgU2lnbmluZyBDZXJ0aWZpY2F0ZSBBdXRo b3JpdHkwggIgMA0GCSqGSIb3DQEBAQUAA4ICDQAwggIIAoICAQCgq+637INet9ru Quy970VFXuRF63ymLaQlLcpTWg7VBAtjdchOUX5q8DBmWzzJtxp6EsDlhFMAz6m3 6/scHnxsmE7LZGJllnzvPmEmiZi41oWvBxVyHNah91itMMxMGWDurIlH66/1sqkz 0iYVdZItIYktGXtlSt1wPRfUyvbPMRwrGHiF5eUt8vqhVMzw667q2xU0EuBDDv8c dJam6lE/2Y9a8nEhsL4lJVgvMJl0twLHDzFLlYzWMSNfqxvcdWmq+IT7dLScQJdj 7r3QtBL2XGMxgCvY5fMcYJ+yQ1BhjdCLK36uh3EVevVgXCa7wDeG9gfBFDqBX6Ud R6C8DOln0dSeoG7kNTDd0iHannA0KiGztEPae12oP1wJQkE1kh/R6jBB2pXW0OF9 df6h7zkw2vCgBGzKAgm2wDsAxOdo7v2y2rz+dRnBmBTFESNhDyArg8mIwbabfLnp pHfTQArtXw4JNgEum+nyyfLsw/4f4121rWCzOnpM+51GL2SNzLj0S3XTnX538WE9 2EfGS8dY68I6cqEUxtyD8zfjSTxKCo5+j940yK5EHUpeKNJRXHE7t7pbm15xHdJS 3QS0oaPf5WnMM+t6hiA0Ga7+k7rTwm66eZAgUMr7QdseLO/VuIY8n5XLUgSlC/nq 0hV/1vPk6kIYS0EvZ8NakODbT/LBwwIBA6NFMEMwHQYDVR0OBBYEFKFLZlBtub35 wHZ06mGKm1qI2KzfMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEA MD0GCSqGSIb3DQEBCjAwoA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsG CWCGSAFlAwQCAaIDAgEgA4ICAQB63sCxn9yon6XPXjMyl0SiDiIQ6SL50/izARIi ggrPQeY47Sfq4wtEOD+HNy3C2tmF3m+s6FpQG3ZO3eKu5wrWss2Mc0pwTSKSdrdL c3zfPAgi6A+P+71+hy7axtaUYmlxcU6RT4NYT8H5H8xWZrRCv4gItWfrfyfHlmxA LETGF6E4zobVVzrlC8IHMrDvNWmcilgLLF6Fh8BTC1TFpBI5G4juFXxGB2f8CWSA H3nqZ0Aw2kkY4QvQ5guOKVnz0o5d9tgSQKlN6FaYLqVKWqgdd5739MHDe79sKTnN 6ir3WmemK+lGGLgRwS+t61RqBaLsTMl7UOF+xypSkFZCo+WkmAek2XyFYv8R5dSB Z5ErBWRyty2aRmKBckFnTwgzTw6Yt0nqLtYLQePml2CO+NAhNMIT6ztBxmqlQ/LM fR3L8r0ke5AJNCWa0FuRsvkNtoxCzirxyEPiSQITuOMpWCqQOKTu3yAK1zCOvC58 3IfeU2eNI/B30wF1EERZcsWKPybCsLKs3prf85l+W23o/zWSPIVTPd8TIKZnONs5 zIlEq0sNB6AhmfJm+t3SVtPIwETTHPiFONpxmCViVNbh6+v0WRGLL6+MbYXHj5jU PQlHenD9lEvYlVA4VKpjOMo8MAiTB9mCe0cmswYr5XBzRPfd8avFq96g/oCmZs/i xS54jA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/61/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/61/end.crt000066400000000000000000000034361322470703100217070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFEzCCA0egAwIBAgIETyfPezBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE1MDExMzAyNDY0M1oXDTIxMDExMzAzMTY0M1owgZ0xCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEP MA0GA1UECAwGUGVybGlzMQ8wDQYDVQQHDAZQZXJsaXMxKTAnBgNVBAsMIEJhaGFn aWFuIEtlc2VsYW1hdGFuIGRhbiBQYXNwb3J0MRwwGgYDVQQDDBNNYWxheXNpYSBE b2MgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnBmgJOod VtQSmr8FWJR9XFWBIMV5rWz+S1FAucrWtRaCZi+aCHXsLKMQq2A8msaJUVHxHZQh L3sWfyU1JCN4mUIJZWGlzMxP9+teL2v6Ib7qxQ0W9cw+Q1lcs/pm/PsIS7FQ82mn hzX9y3Afb6LRgRxSpBMddMzUC1wPTTVNYxLHiSAXoFebmZXLEbWCbUnj0Z2jxg66 2Ner970FJPCXG1AeTpiWoJLpWD/vLIOfQIUWTteFlRYkD5taXHSn30wKeXL5kxbE 6mY+enN5qlkhbXx9oLQbJYS+1SXEkWQ+Ios8nYvYz6Rke5dw7QSnblL268Lq6i1K VA8eK9aVA6iGjQIDAQABo24wbDAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIw ADArBgNVHRAEJDAigA8yMDE1MDExMzAyNDY0M1qBDzIwMTYwMTIwMTgxNjQzWjAf BgNVHSMEGDAWgBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAP MA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMC ASADggGBAH3NLm9aCcowt6EszCDa7VYiOFsN9kR6iKE9Sq1cSoBd4LZvHX76WnDq YDnKw/+qpgtZypAtJ7K3R38e6+SaUddgvhcBYNRicCBv8+qxp44mms6obJY8e1Yf GeDJT7tOL47Dy1D6AN2oNg9oxZnv/qqKFjmoAJNpxfxsecTEgesOdtUzh48wQHTL UHmSJw1Di5R5LazxpucOFA+p3x0Y/BaBxkVnYUB7TyRZ8j/qi1Xbhk8ZpJh6scOS VWB3ghM8e4ns+E1RYQCyEQ2ky0FGASFy1rW3Wdr2fDSXtKR5K9zA4msrT3MJJmw3 Jz8DC14aGyOYrHIz6JHVr91NlYsYYFjgCmb0/UPp61dN6IuGuJ22vabrqu8SDiOs KVnf4PFas4n2r67tZjWEI+3BuczcvUJ/jKLK72CG60kaEm27/NIrlhED4+oETH2/ QGy+uG9kFY7innMtgr/aJPIRb4fQGV3CDkPLxapcBxe3BkV+qo4fPkjDLdol3Teg MpXLJh8S2A== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/61/root.crt000066400000000000000000000037241322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETyfFjTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE0MTAxNDAzMzAzMloXDTI0MTAxNDA0MDAzMlowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyjTj 0smBAi13CocOD5rY7HjvaUT7YFGHdnpInezRas0h0wy/5OLr0/Dt3ik9RAmdmdn9 9gFtla5xbX5uIzJ6aGTFE9C0s3ajfkiJu5YI+K9y3MJbelmCgyCHHM6LsIAQkgvp /CNn4dOQxcsLlOGU0zWNWkJQFUKzQN+AZ1xCnQbMzrUw+pWNPV5O+VGomzhobRP0 n5nQT7YhZgEH+UFT1nQz+1FZcydyQU+XbBt6sVu/V6Ty1TLlE5GdHJbZPT7iyIHY MgqqmWbbmt4FQpSmSjB5aPz9uLC/EhrkDQygrnPQ0fQ5ld3FfmYn5iFTystw4SKg 6JYJOYl9ntml0NmTwsjfRQWHm65GJAZnySVcGlwBtkuqmqHlmdLwabNm+zkh+y+B M9sn0hbnt7RjRAf7P0ujCQ0zaJ3e3jKePpZlggGqxiYO6IMda4qKfq8tFRL0uMO7 xHUwP4N0XdS8xfpzW+PjumvuFCWlLD4FwEIdbV29s9N7l6+zdoxlErD65TaFAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTQxMDE0MDMzMDMyWoEPMjAxNzEwMTQwMTAwMzJaMB0GA1UdDgQW BBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAGXN mF36lTCZeo3uqN7AZFc/czK5w+F/rYTFh7FJ/UCXgAT22+IiWZA2LKkf5qLJdc7H U1WujA+blmeckWCpsWEVhooHHYi1q+ULEq8sKa9Hyh7ApEVfeZIaqZxAHjfYLucz fzh8p6JWyub+Rt5sf+h24tS9eidhi8EuG+eoUKadbiZSRguf5jw77OUuK5A54hUd kkseDUGyqjTmSY+bInsA7jrjs3sAR6+ZZaF5oY/7/5z6X9BJ2H3RQ6MGJG7AOGms XPnIG4vXlf4ZzquyR+aONZnbLfOxX+VICrdi+Mavq1juTkvLMp38VLqCII4K1FGs 9+D8FIeW9mpvTu08z2WGoAfEMZ41+Hzca+KujA3zUcNZ7/poPofPq9QmWFGKWJJx 1dX9mKKtJ9IhQ7LeYBoCjnZCuRj6hHl8pX2XlwvJqzVzGE7QqVgfx7K3ScUzlSht CgOrPcXHPRkweS9O9xsXf+HlQIr3bsq9u+3xkrt9RgR1H0mWO6wJr53ii1DFHg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/62/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/62/end.crt000066400000000000000000000034561322470703100217120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFIDCCA1SgAwIBAgIETyffVjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE1MDYwODAwNDcxOFoXDTIxMDYwODAxMTcxOFowgaoxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEc MBoGA1UECAwTV2lsYXlhaCBQZXJzZWt1dHVhbjEPMA0GA1UEBwwGTGFidWFuMSkw JwYDVQQLDCBCYWhhZ2lhbiBLZXNlbGFtYXRhbiBkYW4gUGFzcG9ydDEcMBoGA1UE AwwTTWFsYXlzaWEgRG9jIFNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAJyN30vdKKj4IJy8gLbG4Z9JEzWfQhkzf42vdE+v2Ccb+/AgFemzmLXX UGB9uil6IThozLRFdWP/XEmwOTOmWk4KuLM+bcDSH22tSk5quGveTWrXm9DT96Dd RYfDfTgHkfIIn8oxtuyT0ykRMJEac3JXyHNpVDtS0k2F/xGsDdc5KhlwUpFzsSno O/I1mSeV36WAJDOpq1uzEQJc497E2mWR+YCSuqfW2Zxegssuig4YycVCOgWyMAJP j2hN4O8k6KGeKy0IiPaPg09Kola6s3JOaJSp4NdIwQq8F+3A8ThAVs4fkH78ysgB l5qNGWOolq/1i5g+B6CEdx2zTKZpkaECAwEAAaNuMGwwDgYDVR0PAQH/BAQDAgeA MAwGA1UdEwEB/wQCMAAwKwYDVR0QBCQwIoAPMjAxNTA2MDgwMDQ3MThagQ8yMDE2 MDYxNDE2MTcxOFowHwYDVR0jBBgwFoAUsFB+C/YzBmKT90m5OSxLLEo40v4wQQYJ KoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglg hkgBZQMEAgEFAKIDAgEgA4IBgQCrkHoP6NtI52lxqXBqcz24sHeLLYDnaAap6GHz NbDiBOyIorBSkXIYfQRez8cpSwQKycmpqL0ToG3YxMbgP4HTNykOguWC9DrbhxV7 S46v53t8sDJxpaMJymQajxhByydP8VbZdljSdVCSP5ug+d5PcqC+y4rJ4v7289vx dmRyA4R5OHO8xWTex/QxxqhtUe1/20+Ahh/hwVFR5y0nR4NS1vOJdKY63VBYyz6P zJ6Ic0Fc+rdLaK0JWcsKTvrECBBD6AdOYpp0MFBqgxiaBQpNmaaGZ5iGrX/Z7YXH A1AaXsShlSMetprkARbL1pRrRAdbVdLTRh1yxUJO6uJT7wFZR9VtbbNX5st89bwK g9plREv+HcADzew5bJ+KKn2MUYvpHoMT0wPFLTBw+ogSGrtdq3AgJq209GDZhvl1 6Blna88yf/rT96jupGINvzP99Fm5dgx20pUsjvqC3KyErxfZsOKFfHf8qmMloR6Y EHHVoYFsLVaEpHnbjsCwEy28Dhc= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/62/root.crt000066400000000000000000000037241322470703100221250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETyfFjTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE0MTAxNDAzMzAzMloXDTI0MTAxNDA0MDAzMlowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyjTj 0smBAi13CocOD5rY7HjvaUT7YFGHdnpInezRas0h0wy/5OLr0/Dt3ik9RAmdmdn9 9gFtla5xbX5uIzJ6aGTFE9C0s3ajfkiJu5YI+K9y3MJbelmCgyCHHM6LsIAQkgvp /CNn4dOQxcsLlOGU0zWNWkJQFUKzQN+AZ1xCnQbMzrUw+pWNPV5O+VGomzhobRP0 n5nQT7YhZgEH+UFT1nQz+1FZcydyQU+XbBt6sVu/V6Ty1TLlE5GdHJbZPT7iyIHY MgqqmWbbmt4FQpSmSjB5aPz9uLC/EhrkDQygrnPQ0fQ5ld3FfmYn5iFTystw4SKg 6JYJOYl9ntml0NmTwsjfRQWHm65GJAZnySVcGlwBtkuqmqHlmdLwabNm+zkh+y+B M9sn0hbnt7RjRAf7P0ujCQ0zaJ3e3jKePpZlggGqxiYO6IMda4qKfq8tFRL0uMO7 xHUwP4N0XdS8xfpzW+PjumvuFCWlLD4FwEIdbV29s9N7l6+zdoxlErD65TaFAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTQxMDE0MDMzMDMyWoEPMjAxNzEwMTQwMTAwMzJaMB0GA1UdDgQW BBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAGXN mF36lTCZeo3uqN7AZFc/czK5w+F/rYTFh7FJ/UCXgAT22+IiWZA2LKkf5qLJdc7H U1WujA+blmeckWCpsWEVhooHHYi1q+ULEq8sKa9Hyh7ApEVfeZIaqZxAHjfYLucz fzh8p6JWyub+Rt5sf+h24tS9eidhi8EuG+eoUKadbiZSRguf5jw77OUuK5A54hUd kkseDUGyqjTmSY+bInsA7jrjs3sAR6+ZZaF5oY/7/5z6X9BJ2H3RQ6MGJG7AOGms XPnIG4vXlf4ZzquyR+aONZnbLfOxX+VICrdi+Mavq1juTkvLMp38VLqCII4K1FGs 9+D8FIeW9mpvTu08z2WGoAfEMZ41+Hzca+KujA3zUcNZ7/poPofPq9QmWFGKWJJx 1dX9mKKtJ9IhQ7LeYBoCjnZCuRj6hHl8pX2XlwvJqzVzGE7QqVgfx7K3ScUzlSht CgOrPcXHPRkweS9O9xsXf+HlQIr3bsq9u+3xkrt9RgR1H0mWO6wJr53ii1DFHg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/63/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/63/end.crt000066400000000000000000000034461322470703100217120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFGTCCA02gAwIBAgIETyfuaDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE1MTAzMDAzMTIxOFoXDTIxMTAzMDAzNDIxOFowgaMxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEP MA0GA1UECAwGTG9uZG9uMRUwEwYDVQQHDAxBdGFzZSBMb25kb24xKTAnBgNVBAsM IEJhaGFnaWFuIEtlc2VsYW1hdGFuIGRhbiBQYXNwb3J0MRwwGgYDVQQDDBNNYWxh eXNpYSBEb2MgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA vFARaG4K3lsfL2glqPH6L0MbDZgUJKqOi+P4nuuLintBN0+zbzas66wWSXuAnos8 X76FebymktZYB9jEPyEAdUcNK4Zawb8XP5HBBVgy9YbDE2YFltklkoUpCA5s8wfJ Jupr/RGZzrGYWYCemf7obioXEJC1bu2EMZaHbf+AB52dQlQ2zmigiPUvemqVdHOk /Qf/MfgJtkFVZjAvn3h1Xbb3LzvOLBbxwXmMLKVzZtPVX9muzXTkKpZrp0ZIYkt9 K+F5wbX6KPNxVZBMQdpfS6fdQ6dIoub7aTblw60DQTd6FRYxdzLrhkZKVf2bhP4E SspCRLQkyA5yLogi+j4Q+QIDAQABo24wbDAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0T AQH/BAIwADArBgNVHRAEJDAigA8yMDE1MTAzMDAzMTIxOFqBDzIwMTYxMTA1MTg0 MjE4WjAfBgNVHSMEGDAWgBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggGBAAE5Jd7JUoQSt5fQRH2zqHILmXvIIdOq90KMKQkj+oPZDLNC OV8YLgfkbSkBE694q8YbxQav6Av7Ts27ceTeZEFeJKTuXOGVAcsBK5OCQWMWaEqx nQfkxcP+SVbMDLMUhuD+XirQJ9/y2whnMyXOBip2WHik/bNQDCDlq08U+77Qgpqu y/jDYiXRsqMjJFfu50+C/gFhZHRUalgq7oaBeEPVJ+504/V2RwnPGQz0TCCJshnu mkyyYiO7X/rVjKm97p0ayGxgPCd/ymtcJSN6rgM+tYLVkZquNWc4IUi6bCmj/Nva uN7qt/ZfyH155B6nVJfpQ55ntPcqhiBjmTZl3uXOOYJl7gIIA1IYCAn4Xe1nmRLe pgOQ/v9f8CioxSRmYoPREECZ5BtW4Scyiv56Gf26pHuMMAp8PqQVQvJVHFYRmINs SGBvUG0gPsSIDu2gHT9bA/cj7enkePfa6HpZQLFyItYLoK0Yxpvg2Y9wacQ+bLe/ 3U9fibU5v2LIp8LATA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/63/root.crt000066400000000000000000000037241322470703100221260ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETyfFjTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE0MTAxNDAzMzAzMloXDTI0MTAxNDA0MDAzMlowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyjTj 0smBAi13CocOD5rY7HjvaUT7YFGHdnpInezRas0h0wy/5OLr0/Dt3ik9RAmdmdn9 9gFtla5xbX5uIzJ6aGTFE9C0s3ajfkiJu5YI+K9y3MJbelmCgyCHHM6LsIAQkgvp /CNn4dOQxcsLlOGU0zWNWkJQFUKzQN+AZ1xCnQbMzrUw+pWNPV5O+VGomzhobRP0 n5nQT7YhZgEH+UFT1nQz+1FZcydyQU+XbBt6sVu/V6Ty1TLlE5GdHJbZPT7iyIHY MgqqmWbbmt4FQpSmSjB5aPz9uLC/EhrkDQygrnPQ0fQ5ld3FfmYn5iFTystw4SKg 6JYJOYl9ntml0NmTwsjfRQWHm65GJAZnySVcGlwBtkuqmqHlmdLwabNm+zkh+y+B M9sn0hbnt7RjRAf7P0ujCQ0zaJ3e3jKePpZlggGqxiYO6IMda4qKfq8tFRL0uMO7 xHUwP4N0XdS8xfpzW+PjumvuFCWlLD4FwEIdbV29s9N7l6+zdoxlErD65TaFAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTQxMDE0MDMzMDMyWoEPMjAxNzEwMTQwMTAwMzJaMB0GA1UdDgQW BBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAGXN mF36lTCZeo3uqN7AZFc/czK5w+F/rYTFh7FJ/UCXgAT22+IiWZA2LKkf5qLJdc7H U1WujA+blmeckWCpsWEVhooHHYi1q+ULEq8sKa9Hyh7ApEVfeZIaqZxAHjfYLucz fzh8p6JWyub+Rt5sf+h24tS9eidhi8EuG+eoUKadbiZSRguf5jw77OUuK5A54hUd kkseDUGyqjTmSY+bInsA7jrjs3sAR6+ZZaF5oY/7/5z6X9BJ2H3RQ6MGJG7AOGms XPnIG4vXlf4ZzquyR+aONZnbLfOxX+VICrdi+Mavq1juTkvLMp38VLqCII4K1FGs 9+D8FIeW9mpvTu08z2WGoAfEMZ41+Hzca+KujA3zUcNZ7/poPofPq9QmWFGKWJJx 1dX9mKKtJ9IhQ7LeYBoCjnZCuRj6hHl8pX2XlwvJqzVzGE7QqVgfx7K3ScUzlSht CgOrPcXHPRkweS9O9xsXf+HlQIr3bsq9u+3xkrt9RgR1H0mWO6wJr53ii1DFHg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/64/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/64/end.crt000066400000000000000000000034051322470703100217060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFAzCCAzegAwIBAgIETygAmDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE2MDQxMjA0NDk1N1oXDTIyMDQxMjA1MTk1N1owgZsxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEO MAwGA1UECAwFSm9ob3IxDjAMBgNVBAcMBUpvaG9yMSkwJwYDVQQLDCBCYWhhZ2lh biBLZXNlbGFtYXRhbiBkYW4gUGFzcG9ydDEcMBoGA1UEAwwTTWFsYXlzaWEgRG9j IFNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMSoNqL4nweD luzwTXUn8iD5MNWAMJNiKeRmay0LQkHnOzYpXI0Ues70aJxvpuDg6/BpjKQXOO2e pf0UMogBMJg2VqEwQas7sbTNFGUEnOnc5yn8uYcUaBwWsCworBSxEJgsw5C8GQdW YocDRyqERg/aZ33I+ACsU0znLLDbLIqRlipXV8Hjqbwl42d/YpNRHqq18UM87H8S wPo2rkOvlI2SoH9zMYjs+llJCW43BDpkhgTxVToNnA31Pjz0VbI3qU8XfkU5AM6N nm53mm5t07jY8cIjiunXosCklDeSHKwr/xJQ+ZufC8kAqhc5JuFXdnvl/S+Yq7ao OI36vAhKRJkCAwEAAaNgMF4wDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIw MTYwNDEyMDQ0OTU3WoEPMjAxNzA0MTkxNjE5NTdaMB8GA1UdIwQYMBaAFLBQfgv2 MwZik/dJuTksSyxKONL+MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQCh HDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEAjw8u0DmtxElH vXKv3AW6pSGqL242CsBzYkqcitV+z9njQdzBM++3u9nKs7OUOf+HZkXJQo4dXUm6 rdBI5cZWsc4JOAjo6Zb9PpglntBT2Ru7wy0/lUxO49g85SS4xv3n7zBcVR69R/nB NXnoAqOvV/IZf5NZKaCKJt3w2KIzz1vTDKEorwgn8xR8fAftXoauUxaqK7v/LDkA 9454qc24/1Gk+RqH5186+HtHY37ArVLE1fRw5TTHXIwZ1UCk8wdJXvoaLwUpKo/A v+zKxiuSWKNnXlcIs6yAA4z8ywFSjqNtaNtxi0kqPa1sFrovc/NVvnchIFy7NLOW dNU/ncp6JWkJV51vnPn6aRAXxYO4A3iP43Qn6msFe6bu96Fe7dkXvVvG1ETkiW/1 mCgwRI+NVQUMOZZyKaFqgrmOwVxOmIJaR6X9dNBgjdnIUnG7trJOOnBHd42qAA+K rl4MVFgvTNc7Se+WyVJtl4HQOVLaOYdz2XHYg/KK1PvlYxipFVo/ -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/64/root.crt000066400000000000000000000037241322470703100221270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETyfFjTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE0MTAxNDAzMzAzMloXDTI0MTAxNDA0MDAzMlowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyjTj 0smBAi13CocOD5rY7HjvaUT7YFGHdnpInezRas0h0wy/5OLr0/Dt3ik9RAmdmdn9 9gFtla5xbX5uIzJ6aGTFE9C0s3ajfkiJu5YI+K9y3MJbelmCgyCHHM6LsIAQkgvp /CNn4dOQxcsLlOGU0zWNWkJQFUKzQN+AZ1xCnQbMzrUw+pWNPV5O+VGomzhobRP0 n5nQT7YhZgEH+UFT1nQz+1FZcydyQU+XbBt6sVu/V6Ty1TLlE5GdHJbZPT7iyIHY MgqqmWbbmt4FQpSmSjB5aPz9uLC/EhrkDQygrnPQ0fQ5ld3FfmYn5iFTystw4SKg 6JYJOYl9ntml0NmTwsjfRQWHm65GJAZnySVcGlwBtkuqmqHlmdLwabNm+zkh+y+B M9sn0hbnt7RjRAf7P0ujCQ0zaJ3e3jKePpZlggGqxiYO6IMda4qKfq8tFRL0uMO7 xHUwP4N0XdS8xfpzW+PjumvuFCWlLD4FwEIdbV29s9N7l6+zdoxlErD65TaFAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTQxMDE0MDMzMDMyWoEPMjAxNzEwMTQwMTAwMzJaMB0GA1UdDgQW BBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAGXN mF36lTCZeo3uqN7AZFc/czK5w+F/rYTFh7FJ/UCXgAT22+IiWZA2LKkf5qLJdc7H U1WujA+blmeckWCpsWEVhooHHYi1q+ULEq8sKa9Hyh7ApEVfeZIaqZxAHjfYLucz fzh8p6JWyub+Rt5sf+h24tS9eidhi8EuG+eoUKadbiZSRguf5jw77OUuK5A54hUd kkseDUGyqjTmSY+bInsA7jrjs3sAR6+ZZaF5oY/7/5z6X9BJ2H3RQ6MGJG7AOGms XPnIG4vXlf4ZzquyR+aONZnbLfOxX+VICrdi+Mavq1juTkvLMp38VLqCII4K1FGs 9+D8FIeW9mpvTu08z2WGoAfEMZ41+Hzca+KujA3zUcNZ7/poPofPq9QmWFGKWJJx 1dX9mKKtJ9IhQ7LeYBoCjnZCuRj6hHl8pX2XlwvJqzVzGE7QqVgfx7K3ScUzlSht CgOrPcXHPRkweS9O9xsXf+HlQIr3bsq9u+3xkrt9RgR1H0mWO6wJr53ii1DFHg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/65/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/65/end.crt000066400000000000000000000034361322470703100217130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFEzCCA0egAwIBAgIETyfPczBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE1MDExMzAyNDU1NFoXDTIxMDExMzAzMTU1NFowgZ0xCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEP MA0GA1UECAwGTWVsYWthMQ8wDQYDVQQHDAZNZWxha2ExKTAnBgNVBAsMIEJhaGFn aWFuIEtlc2VsYW1hdGFuIGRhbiBQYXNwb3J0MRwwGgYDVQQDDBNNYWxheXNpYSBE b2MgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnyzXc6Bz d/3GYUlI9y7ouX94cbpbVHJw8N+46P0X2IRPL3VtFot2/DZz8PjYo/c/b5EHtQpT cD9HQBtNNFw4aLHmc2zD7MuWhYYQz4wtywpu8d6lk/tnT1Y30RSJD5A2ClTKIbLy xA3LsofflSkfw4q9cs9ZuVY88JS8x98LeucNKIJKVVyPR4z2D8ieyWASFi80WwAR RCuY0Hm4VgvFSuBEg5u9mWlsn1lgdvyjANj7nXpUA20TbLHgeYHBanoYMVZtrNes na1gdw6LHX5DWF2W15nNUnMybDR2ohp1fchjqzvb7K2q9hBkWlWOQR/Cxru/vtf2 Qm20I67El5QdhQIDAQABo24wbDAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIw ADArBgNVHRAEJDAigA8yMDE1MDExMzAyNDU1NFqBDzIwMTYwMTIwMTgxNTU0WjAf BgNVHSMEGDAWgBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAP MA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMC ASADggGBAFyoaJatm8P8/Z4AuTIu/tmoIFEysvRrFY8WAMRixByq5o2wNmEJ+Qh0 D/p0Z827zag7IIy6UAoIt+PJZDSNCDlQ04BQb5JUmjbJKkmhdBzv+bERLdD1xlRn YQ/IyRUYeCfbBHg6xbZe55EgAcCIZslM9J4BSrDrUO5+kXDETtCq9HIG7y2yguEu TM7KmeGseGilXOqRqezvbE7vZqODnQVsIJDiY7qUOEMoUJE/mVPqU4ccv3r32Rug Q7kOea2eKLUeAVZKZTf2fBFCBTGLezsMvuyHFHaR2/SFwKEmjuLvDhzYkDX+X3EW slbAffRYjpAaYrnHadNVJ7qLulYO5iPPdWdcBzEfFo58yCpTG4TmqMAnXC9ck+0y RlfUfCUHzLOPL4qR5vlLnMAZ7YqyfOa11EbdVDVVZBg95Hm8DAftMuK9XGXzWsTk vbaGIlQh6JUkq2w09WxNlbpyi+BckvNKTbJtA99RuIEP3o5gc4M1g5pX87Rlipk+ v7/Uf8YhGg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/65/root.crt000066400000000000000000000037241322470703100221300ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETyfFjTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE0MTAxNDAzMzAzMloXDTI0MTAxNDA0MDAzMlowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyjTj 0smBAi13CocOD5rY7HjvaUT7YFGHdnpInezRas0h0wy/5OLr0/Dt3ik9RAmdmdn9 9gFtla5xbX5uIzJ6aGTFE9C0s3ajfkiJu5YI+K9y3MJbelmCgyCHHM6LsIAQkgvp /CNn4dOQxcsLlOGU0zWNWkJQFUKzQN+AZ1xCnQbMzrUw+pWNPV5O+VGomzhobRP0 n5nQT7YhZgEH+UFT1nQz+1FZcydyQU+XbBt6sVu/V6Ty1TLlE5GdHJbZPT7iyIHY MgqqmWbbmt4FQpSmSjB5aPz9uLC/EhrkDQygrnPQ0fQ5ld3FfmYn5iFTystw4SKg 6JYJOYl9ntml0NmTwsjfRQWHm65GJAZnySVcGlwBtkuqmqHlmdLwabNm+zkh+y+B M9sn0hbnt7RjRAf7P0ujCQ0zaJ3e3jKePpZlggGqxiYO6IMda4qKfq8tFRL0uMO7 xHUwP4N0XdS8xfpzW+PjumvuFCWlLD4FwEIdbV29s9N7l6+zdoxlErD65TaFAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTQxMDE0MDMzMDMyWoEPMjAxNzEwMTQwMTAwMzJaMB0GA1UdDgQW BBSwUH4L9jMGYpP3Sbk5LEssSjjS/jBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAGXN mF36lTCZeo3uqN7AZFc/czK5w+F/rYTFh7FJ/UCXgAT22+IiWZA2LKkf5qLJdc7H U1WujA+blmeckWCpsWEVhooHHYi1q+ULEq8sKa9Hyh7ApEVfeZIaqZxAHjfYLucz fzh8p6JWyub+Rt5sf+h24tS9eidhi8EuG+eoUKadbiZSRguf5jw77OUuK5A54hUd kkseDUGyqjTmSY+bInsA7jrjs3sAR6+ZZaF5oY/7/5z6X9BJ2H3RQ6MGJG7AOGms XPnIG4vXlf4ZzquyR+aONZnbLfOxX+VICrdi+Mavq1juTkvLMp38VLqCII4K1FGs 9+D8FIeW9mpvTu08z2WGoAfEMZ41+Hzca+KujA3zUcNZ7/poPofPq9QmWFGKWJJx 1dX9mKKtJ9IhQ7LeYBoCjnZCuRj6hHl8pX2XlwvJqzVzGE7QqVgfx7K3ScUzlSht CgOrPcXHPRkweS9O9xsXf+HlQIr3bsq9u+3xkrt9RgR1H0mWO6wJr53ii1DFHg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/66/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/66/end.crt000066400000000000000000000034361322470703100217140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFEzCCA0egAwIBAgIETyeAZDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEzMDEyNTAxMTE1MloXDTE2MDEyNTAxNDE1MlowgZ0xCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEP MA0GA1UECAwGUGFoYW5nMQ8wDQYDVQQHDAZQYWhhbmcxKTAnBgNVBAsMIEJhaGFn aWFuIEtlc2VsYW1hdGFuIGRhbiBQYXNwb3J0MRwwGgYDVQQDDBNNYWxheXNpYSBE b2MgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0LVL3N/q ZkEhzdg+0ooJHO2veu6INDX1VswBANexo0/7fSSa0W5udHhBwhYD9KQOT9Tr9qwq dS/3Qa6m9MMN48hoHw4WKYQqqeiilagtQ43SkecSKPrzl0VmrPkaVLS1kORhhsJc HvUBP6GDbtKP+hO5vbSj/sQzkFt2RmZHJoHwrs87PJqnKpZ10o7XUimi8jfR67Pc 8C7JaBCxTNUj3MAcEOcF/V1SNLYJfawDxi3A2c6rIb6GS1pJ89o3hGZSXZ93SxH0 /6YUzQyBVI3gVq7KRRvfrUWZcUd3Xuhf8KVncDGj6W/fdnI32l2ul+Ps8LPbcx+P Ms8Pznn0PqOhdQIDAQABo24wbDAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIw ADArBgNVHRAEJDAigA8yMDEzMDEyNTAxMTE1MlqBDzIwMTQwMjAxMDg0MTUyWjAf BgNVHSMEGDAWgBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0BAQowNKAP MA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMC ASADggGBALEHUumBsTehINfcjuQgzxinjZcrKSowP0x7DQv9SwfHzKMsp4Bas68+ ULVTk/tMDDFN94HhGLwK74dmXATU7l/o+/OXSdQTbrIrNBAr14QCOug0vBxwFUtD mgznJL1zWmmg4J6aYI287G8sgbHK+gq2Zc2KVVolmcyhrLDHqwOuztonMDMBNjv0 KGhTqdOjI9Rdrvg6qNjWsRUDuI7LTuriBzMcU95xVAlwm+NPlHgy579U8ZRy5VUP v2WTrr/jbt2Ds5OVCuKFYB/9olfIX2QzJjqNKdQnyGgQxT+9aG4wutNqQ18CAL8n RiHfxSCnhR8Nsu6luSv5L+TvfuqMbXrubgRJgVTHNLeFsQUXAaMEJPPKIYOMGVL0 XeSEET1f0nDWlG7loF05bOFzKds810dSM4FCxB161nboY8fXl4fBew2b0wbTqRxt aXNeYeIqIs9wdggL2H5bVZtNxePl0Ehc65ZhufzgUu/CKjjA/Us4RKfqTIvQYGd1 FIeNTk6+Jg== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/66/root.crt000066400000000000000000000037241322470703100221310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETydbzzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDEzMTAyNDE0MVoXDTIyMDEzMTAzMTE0MVowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAsmCW X0c6LqdU9K8fM2t5HPzhlR/1SoHffSPCUlcfpefSfpQyMFi2XKuZrYAVFGnkBQ05 iO4gYOsYxmYxFQA3Pp5tX5tFK34UNeJDa9lpc1EME89WWLtxwE2nleaCTo5hrtpZ 8JpN71Ib11799xkhVBbI78HIVkxQsMmDAPR97HPp/0bgYfHMJOUbYh4LnYdztI/s sQzvmP1aw/NvTlkMPoH3Qs4sMbrSUi5sNy2xRIdT8lsBdwJCwNwgKRuRfqTsl3I5 DCF3lyfhmUzPYeq/GlZwzQgYsAyKmqi45Q4npqFQsWa8XhoyutN044Dd3Z2HDzjk al2xD6h8OIhB8DBJORPPcIHrbDItfX36mnGAePziysB8Osy0FMiRZI6q/5l7gXo+ abwCaGDa241rkQ0ZlrgKRwbR4kgOmyYVg+Pr3iRPzV/uZy5lD011d+/NG6qoYaEY mimDcIHnDToK+dYthlc9WhxpN6Ho4Lq0XROvPoqAnKmiDw3aYcKGmgZABZlfAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTIwMTMxMDI0MTQxWoEPMjAxNTAxMzEwMDExNDFaMB0GA1UdDgQW BBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAAt7 soo2p/8tG7VWwaFinxm+gUTkBtu5ZhJzGOlxOSwHjt6xwrKkilAyb17/Y9CpSach XNieFUvVGqrEXaHFdSjjttdRfpuYmf2t8agY2kyNZ0QhaPYsYZbW+hu01Po0bQLK DXCHGNttQRCx01aMdpklF79EUr5+ISNdntv7TreoRQp+20/lXaW8dGqegnpbszZ1 jHjuk2O/5+PfGH9fb5vFxNeT922Veb58IGzXDvSOq/21nylIjSk+JKIeQXjxeF/2 xqZDKcdZLlck0ueiDIVFiBkLnL3PExHPgnCVRLTyovVij1dVydbvp3zbpDV7ZX4C aenM5GijYPcC26BhSucayId2pScz4nAUy/twgqUVH7tjGHKR4vZp8vy+1OZuWi/w T6mHDw/O/XAlqnMHgKR2zOS+FDB8cipjbi5Kfqm4VtLxLl9Akgnsn+fFnWXpygqx vz1GqP8kMIHJT7TWZtWGu4LR8uDhA/VF6w7OikQ4z8avtm5kCZwOIeNNF2nJcA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/67/000077500000000000000000000000001322470703100204275ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/67/end.crt000066400000000000000000000034321322470703100217110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFETCCA0WgAwIBAgIETydcPjBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDEzMTE2MTA0N1oXDTE1MDEzMTE2NDA0N1owgZsxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEO MAwGA1UECAwFUGVyYWsxDjAMBgNVBAcMBVBlcmFrMSkwJwYDVQQLDCBCYWhhZ2lh biBLZXNlbGFtYXRhbiBkYW4gUGFzcG9ydDEcMBoGA1UEAwwTTWFsYXlzaWEgRG9j IFNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL4zlBCaAfrg 67CfvALxESUS2KhK8YgIia9ffog6bsqd6OTur8z1MhG0q2Hh30Si4XM3H3qMwxLe sXa+nHh6szWJKEqHW83e/wDeBJurvrE1QIivepA/wktfYRxiPZh8uaB4HdSRCy5U QpO3FCwzRv9MFDSmjNXahCUJUvWqUFmvN1yUhdUVQ8Rz9rTnDn9ly1QDREN+0pg3 Uyi50IVPvHDNJ0d0n4fBGcoKYIKB5QqwHNfFaK8MeKBZfCo8FCwoPB8d+wDIwxBC ccA33qSTJHXQ1HDOLKKhxK0Jp56S3SY7mj60D/5vY4y1nUEHogKQDa3Nl2YIr1f6 Ry+05H+9VnECAwEAAaNuMGwwDgYDVR0PAQH/BAQDAgeAMCsGA1UdEAQkMCKADzIw MTIwMTMxMTYxMDQ3WoEPMjAxMzAyMDcwNzQwNDdaMAwGA1UdEwEB/wQCMAAwHwYD VR0jBBgwFoAUtjTzUp4u1e13c3moW+ZKXa3g9ZwwQQYJKoZIhvcNAQEKMDSgDzAN BglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEg A4IBgQBrzfB58AQQzGmg+NG7dYcVwE0sad0XT/U1dSdLxk02FWsQ5TRgjC9eT6IQ ufjbCHrWY3pCBK2x9ZDtndA1/QzsjsXqy8KeixVL8FSscWdSwOK3FQsKmfXLa80J xFPYSg4XEkwv/VDy99xNxHrFHU+fUUQHSdpE2LSkECgqujfylUxUPKE+fYwdonmL qUBuyCbcAfcSDmQHPZHp32x/kQQPYP+MoR42sbCTIOFJjm7gppGH2CH0mkiHOhfe eBeGXJHUufVov5HwYx+zknG2k5FRYNeLKQEZR/ayL34UfLRSDM6bJlcG+UeGG3Fn 8ny1IqB7CqOdW0wweKJavulvj2XMpUKGNAMlALPiPYEQ4YbcUTfRzh4+2c0PElv/ Gy+uurc4iYcB9ebpWyHL5bKQUM+isK0M7Jem1/BEtGbnDlU8wWzhN0Yidz760cj7 sn1E1r3+0xVbV3ayiQOKFCfEuiKdjVN7xlR8aQFLw1mYk4UHO9SIgcqwtho+EkLx V3Zy7EQ= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/67/root.crt000066400000000000000000000037241322470703100221320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETydbzzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDEzMTAyNDE0MVoXDTIyMDEzMTAzMTE0MVowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAsmCW X0c6LqdU9K8fM2t5HPzhlR/1SoHffSPCUlcfpefSfpQyMFi2XKuZrYAVFGnkBQ05 iO4gYOsYxmYxFQA3Pp5tX5tFK34UNeJDa9lpc1EME89WWLtxwE2nleaCTo5hrtpZ 8JpN71Ib11799xkhVBbI78HIVkxQsMmDAPR97HPp/0bgYfHMJOUbYh4LnYdztI/s sQzvmP1aw/NvTlkMPoH3Qs4sMbrSUi5sNy2xRIdT8lsBdwJCwNwgKRuRfqTsl3I5 DCF3lyfhmUzPYeq/GlZwzQgYsAyKmqi45Q4npqFQsWa8XhoyutN044Dd3Z2HDzjk al2xD6h8OIhB8DBJORPPcIHrbDItfX36mnGAePziysB8Osy0FMiRZI6q/5l7gXo+ abwCaGDa241rkQ0ZlrgKRwbR4kgOmyYVg+Pr3iRPzV/uZy5lD011d+/NG6qoYaEY mimDcIHnDToK+dYthlc9WhxpN6Ho4Lq0XROvPoqAnKmiDw3aYcKGmgZABZlfAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTIwMTMxMDI0MTQxWoEPMjAxNTAxMzEwMDExNDFaMB0GA1UdDgQW BBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAAt7 soo2p/8tG7VWwaFinxm+gUTkBtu5ZhJzGOlxOSwHjt6xwrKkilAyb17/Y9CpSach XNieFUvVGqrEXaHFdSjjttdRfpuYmf2t8agY2kyNZ0QhaPYsYZbW+hu01Po0bQLK DXCHGNttQRCx01aMdpklF79EUr5+ISNdntv7TreoRQp+20/lXaW8dGqegnpbszZ1 jHjuk2O/5+PfGH9fb5vFxNeT922Veb58IGzXDvSOq/21nylIjSk+JKIeQXjxeF/2 xqZDKcdZLlck0ueiDIVFiBkLnL3PExHPgnCVRLTyovVij1dVydbvp3zbpDV7ZX4C aenM5GijYPcC26BhSucayId2pScz4nAUy/twgqUVH7tjGHKR4vZp8vy+1OZuWi/w T6mHDw/O/XAlqnMHgKR2zOS+FDB8cipjbi5Kfqm4VtLxLl9Akgnsn+fFnWXpygqx vz1GqP8kMIHJT7TWZtWGu4LR8uDhA/VF6w7OikQ4z8avtm5kCZwOIeNNF2nJcA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/68/000077500000000000000000000000001322470703100204305ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/68/end.crt000066400000000000000000000034461322470703100217170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFGTCCA02gAwIBAgIETydktTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDUwNzAyNTI0NFoXDTE1MDUwNzAzMjI0NFowgaMxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEP MA0GA1UECAwGTG9uZG9uMRUwEwYDVQQHDAxBdGFzZSBMb25kb24xKTAnBgNVBAsM IEJhaGFnaWFuIEtlc2VsYW1hdGFuIGRhbiBQYXNwb3J0MRwwGgYDVQQDDBNNYWxh eXNpYSBEb2MgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA vzOncG3ibINrblIU4Ze7HOAACme7iie6R54f5tHl7E2trJO+6/2mEgQNfjGL0XrB AVaTBeXh0BR5oMrGEOfIESYBGg2DiQo9SJbxW54qGrbgv4R14+N2X8MdfQz66Mjp eACC/0y1ZCffuH4fJO7Qw0Iuwg68BnJhn/39IJt6ppLa8KsAzq0oLv7uJu4z1F0v INAe83mc/0oPp/IINQPGoG8+q5AkvGKhjuTzVNH9Yt81JetLdk05KZWz5NAE+Q+P dx9B8u0jobdham6TFJrm6jB478j8osklOYEzuRFM4nowmTqJ03BfgUbrK9dDchOL g0+Mm1c/5UlXthxlRByvyQIDAQABo24wbDAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0T AQH/BAIwADArBgNVHRAEJDAigA8yMDEyMDUwNzAyNTI0NFqBDzIwMTMwNTE0MTAy MjQ0WjAfBgNVHSMEGDAWgBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AQUAogMCASADggGBADq5NqISaGNqrqyu0W9Fe/L4P8MW+AtKMggfjBhul2hLl+Nk VF4zApCljrWJvgnFtwdzGjlUjIDBaTgPlaFRsdGZfE2RO0pk4hVrR16mROI0SgSU Y3X2LtzIZFrDB/iCaGzXGa3NRObtTvcSkmzZ+Fg/vl4+PUkkStqkygiRsR+hXYFI 2RFvGd374kQ+6o0ht8kTzY350BDwxtYmvNXMx2gUCMdQVkFulbKYSU9egBY3CDkQ YFJEtnEXwxYL+J/yMowd0hB4l967yyVO/vOKJoyjFiV0wbN3f0E5IpMkAfGjc2c+ 7DyvV0H69Fvak9/adYmwzjtZp0Cf46rF8DRIrn13tksqWW7bWzPLpKGWRYFJuJFE z3Ubk8CqRkHxHeP6ELGieaidbq3O7TeHXmLoJlepBts7gF4TcSrtnnNrX8xWHey0 m5A4D7GLK187CYw4Ar+xLOPW4Mvcp7jq14UqfKaJVUM7K5j9TVZe/lh+GEgv2lDB Nqu4PCp6/9RtSIjx5w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/68/root.crt000066400000000000000000000037241322470703100221330ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETydbzzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDEzMTAyNDE0MVoXDTIyMDEzMTAzMTE0MVowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAsmCW X0c6LqdU9K8fM2t5HPzhlR/1SoHffSPCUlcfpefSfpQyMFi2XKuZrYAVFGnkBQ05 iO4gYOsYxmYxFQA3Pp5tX5tFK34UNeJDa9lpc1EME89WWLtxwE2nleaCTo5hrtpZ 8JpN71Ib11799xkhVBbI78HIVkxQsMmDAPR97HPp/0bgYfHMJOUbYh4LnYdztI/s sQzvmP1aw/NvTlkMPoH3Qs4sMbrSUi5sNy2xRIdT8lsBdwJCwNwgKRuRfqTsl3I5 DCF3lyfhmUzPYeq/GlZwzQgYsAyKmqi45Q4npqFQsWa8XhoyutN044Dd3Z2HDzjk al2xD6h8OIhB8DBJORPPcIHrbDItfX36mnGAePziysB8Osy0FMiRZI6q/5l7gXo+ abwCaGDa241rkQ0ZlrgKRwbR4kgOmyYVg+Pr3iRPzV/uZy5lD011d+/NG6qoYaEY mimDcIHnDToK+dYthlc9WhxpN6Ho4Lq0XROvPoqAnKmiDw3aYcKGmgZABZlfAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTIwMTMxMDI0MTQxWoEPMjAxNTAxMzEwMDExNDFaMB0GA1UdDgQW BBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAAt7 soo2p/8tG7VWwaFinxm+gUTkBtu5ZhJzGOlxOSwHjt6xwrKkilAyb17/Y9CpSach XNieFUvVGqrEXaHFdSjjttdRfpuYmf2t8agY2kyNZ0QhaPYsYZbW+hu01Po0bQLK DXCHGNttQRCx01aMdpklF79EUr5+ISNdntv7TreoRQp+20/lXaW8dGqegnpbszZ1 jHjuk2O/5+PfGH9fb5vFxNeT922Veb58IGzXDvSOq/21nylIjSk+JKIeQXjxeF/2 xqZDKcdZLlck0ueiDIVFiBkLnL3PExHPgnCVRLTyovVij1dVydbvp3zbpDV7ZX4C aenM5GijYPcC26BhSucayId2pScz4nAUy/twgqUVH7tjGHKR4vZp8vy+1OZuWi/w T6mHDw/O/XAlqnMHgKR2zOS+FDB8cipjbi5Kfqm4VtLxLl9Akgnsn+fFnWXpygqx vz1GqP8kMIHJT7TWZtWGu4LR8uDhA/VF6w7OikQ4z8avtm5kCZwOIeNNF2nJcA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/69/000077500000000000000000000000001322470703100204315ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/69/end.crt000066400000000000000000000034421322470703100217140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFFzCCA0ugAwIBAgIETyecNTBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEzMTAwNDAyMTkwNFoXDTE5MTAwNDAyNDkwNFowgaExCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTER MA8GA1UECAwIU2VsYW5nb3IxETAPBgNVBAcMCFNlbGFuZ29yMSkwJwYDVQQLDCBC YWhhZ2lhbiBLZXNlbGFtYXRhbiBkYW4gUGFzcG9ydDEcMBoGA1UEAwwTTWFsYXlz aWEgRG9jIFNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLf 6yqAP8I+Ct9Abs6iB8uiEyl/gF0BG6WSVUcW6CHTYxJjp+8UcvPgw0YtXzgPYnAW TzrFi9ZuXo/G8f1Zpv7hncSwnV9csxYRvuW3i2tCCRL4T3dvl6AZLTcM1ax5Ju0D Yun39W7T4EG9DsYB3jv+kcrDUZGISMo+DzRoYMSjB5hF3oIvOPQK27zlZp3QUjVy 5zIjhPR+1/0qJwvXnqG5pY5EWMqUK90gg7vw+vP/8cFCfKVt0lSTtouYUeaAsTt6 n4jv9eYe6uLX69iEwC1YKH3iA9RIUwvedDOar1uAtL/2hm+RzSK1UilfFn6yj4B7 +EKBhyCPKsas5XYOJ5kCAwEAAaNuMGwwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB /wQCMAAwKwYDVR0QBCQwIoAPMjAxMzEwMDQwMjE5MDRagQ8yMDE0MTAxMTEzNDkw NFowHwYDVR0jBBgwFoAUtjTzUp4u1e13c3moW+ZKXa3g9ZwwQQYJKoZIhvcNAQEK MDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEF AKIDAgEgA4IBgQCbef1fWGiqbJFGFEytt3Lim/MOhjd96Z7UiJV7VkwOoU+6IRL3 7JWi6oiiLXQPiFmsC4RLhEFd+hvhFUe7+iQ9dm23+5VRWO7KCqNoMns0h8KYmJuF FYGyvyZmw6xBqMCVAOjOYNA3jZynAWtyPm8NYbYOBhqxG2KIRKpeA4Pj9hhDDDCR +9fuhOvOoyZ7TSUUQPsH8rQoZsYQCehfi/bb72Qr5qUi8ET4PJDVOQrXXXhlqgij yDA8MCjCTKEesm+Y5vbw0/4VzHgsCV7JLki2sShWAzOEDPDd5vDtbPoKoIW+2Wtl LS3mkcFgwPFGnAyOl5j/2Lsz5Q9HsEBMtUAyXhd7HX+RfJ6i5cSWF8bk9geTZCnF 3zt+E58K+RDzbreedToI4Pv1rqpl/aN1T5hkc27du3hkPSTYaEtgBp7SpbXFVVMn wyN8kP/1FmqlSO7tSX6Jqsun95F6o49osAsFdlOTJ2g0bKAD7zFMheOq4tD532n/ so1d+S4IIVpKMxg= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/69/root.crt000066400000000000000000000037241322470703100221340ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETydbzzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDEzMTAyNDE0MVoXDTIyMDEzMTAzMTE0MVowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAsmCW X0c6LqdU9K8fM2t5HPzhlR/1SoHffSPCUlcfpefSfpQyMFi2XKuZrYAVFGnkBQ05 iO4gYOsYxmYxFQA3Pp5tX5tFK34UNeJDa9lpc1EME89WWLtxwE2nleaCTo5hrtpZ 8JpN71Ib11799xkhVBbI78HIVkxQsMmDAPR97HPp/0bgYfHMJOUbYh4LnYdztI/s sQzvmP1aw/NvTlkMPoH3Qs4sMbrSUi5sNy2xRIdT8lsBdwJCwNwgKRuRfqTsl3I5 DCF3lyfhmUzPYeq/GlZwzQgYsAyKmqi45Q4npqFQsWa8XhoyutN044Dd3Z2HDzjk al2xD6h8OIhB8DBJORPPcIHrbDItfX36mnGAePziysB8Osy0FMiRZI6q/5l7gXo+ abwCaGDa241rkQ0ZlrgKRwbR4kgOmyYVg+Pr3iRPzV/uZy5lD011d+/NG6qoYaEY mimDcIHnDToK+dYthlc9WhxpN6Ho4Lq0XROvPoqAnKmiDw3aYcKGmgZABZlfAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTIwMTMxMDI0MTQxWoEPMjAxNTAxMzEwMDExNDFaMB0GA1UdDgQW BBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAAt7 soo2p/8tG7VWwaFinxm+gUTkBtu5ZhJzGOlxOSwHjt6xwrKkilAyb17/Y9CpSach XNieFUvVGqrEXaHFdSjjttdRfpuYmf2t8agY2kyNZ0QhaPYsYZbW+hu01Po0bQLK DXCHGNttQRCx01aMdpklF79EUr5+ISNdntv7TreoRQp+20/lXaW8dGqegnpbszZ1 jHjuk2O/5+PfGH9fb5vFxNeT922Veb58IGzXDvSOq/21nylIjSk+JKIeQXjxeF/2 xqZDKcdZLlck0ueiDIVFiBkLnL3PExHPgnCVRLTyovVij1dVydbvp3zbpDV7ZX4C aenM5GijYPcC26BhSucayId2pScz4nAUy/twgqUVH7tjGHKR4vZp8vy+1OZuWi/w T6mHDw/O/XAlqnMHgKR2zOS+FDB8cipjbi5Kfqm4VtLxLl9Akgnsn+fFnWXpygqx vz1GqP8kMIHJT7TWZtWGu4LR8uDhA/VF6w7OikQ4z8avtm5kCZwOIeNNF2nJcA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/70/000077500000000000000000000000001322470703100204215ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/70/end.crt000066400000000000000000000034361322470703100217070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFFTCCA0mgAwIBAgIETye+5jBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTE0MDgxNTAxMzAzN1oXDTIwMDgxNTAyMDAzN1owgZ8xCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEQ MA4GA1UECAwHU2FyYXdhazEQMA4GA1UEBwwHU2FyYXdhazEpMCcGA1UECwwgQmFo YWdpYW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxHDAaBgNVBAMME01hbGF5c2lh IERvYyBTaWduZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGInX7 JmAuGJoo8B9XRneGwGPy6E9FUUJSMspYqy/qoH+orgsGxnkq8b5Fwh2+5rTtvemq qybx4VLzcIfTGBtcBortStfiIM0bSWeLTYnchH2ynOq6FonygItmbsvaBkxJH0dt KO+t0n4niASYAlra5LG8Y8PjxzbmG5QKOqCQISi8RmvDuOhfAl4Ik1QBPhdopggH sr3cHVijt5jDQcfnWGuaYsHzqvwtbEsp0+Ns5R/DZLOQgdUscBIfeBmU5oDuhdzN at5EU9Xi5cMKkYXrdlmc6+E/A4jFXb2+GZWCweOZTnaB5Kp5Jn47V6F033st64kr sONUPQz0AtL53h8FAgMBAAGjbjBsMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E AjAAMCsGA1UdEAQkMCKADzIwMTQwODE1MDEzMDM3WoEPMjAxNTA4MjIxNzAwMzha MB8GA1UdIwQYMBaAFLY081KeLtXtd3N5qFvmSl2t4PWcMEEGCSqGSIb3DQEBCjA0 oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCi AwIBIAOCAYEAAdIgRzU8QFavouxowiHB9WaH9mYGxUNOyWALd+BVA9BrLbec085j dn1axg6FT+aFScqbC/K/LC/ab/xwsILWWLtqB8CJg2crWhKyd20xvYJ9O2Ve4WJ1 53HWxrheyG2JsGxfUR0OQJMiCtU3J/H8O0odywZLyaWYWOE1BGdDRc/N8erHKdJB WTOoNYJR1gzTATyEuYxcL9migoyV5q06e9SoA5IP0c+AUfHx37gkGsBMwDmN1m6+ 2z5AHYTFXj6KgaPdrKuGsbf8go2KCjmU13UHAp1BxByNKVlKDPyAK5NDKqYGJYtv fqTd0yNCUQ+6ffrTfkuTAFvr/GjzKNSyGIcNg0VOayizUuCPf+Nz8uSfICf3hMF1 9SLahWN6rOjkbnei95flfol461ELX8Vq1V713AUiCZV5zy1BZQXlNSaZvp4ph5sn sCaX2uCa95siMGs5Lp7xE8TIgVQ+R5m0f0uhnYM0G2Nt/E5ytJqpSKoIRXJG7NGQ 2izBB9FFiaPz -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/70/root.crt000066400000000000000000000037241322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmjCCA86gAwIBAgIETydbzzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwgaAxCzAJBgNV BAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTELMAkG A1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdpYW4g S2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENvdW50 cnkgU2lnbmVyMB4XDTEyMDEzMTAyNDE0MVoXDTIyMDEzMTAzMTE0MVowgaAxCzAJ BgNVBAYTAk1ZMSMwIQYDVQQKDBpKYWJhdGFuIEltaWdyZXNlbiBNYWxheXNpYTEL MAkGA1UECAwCV1AxEjAQBgNVBAcMCVB1dHJhamF5YTEpMCcGA1UECwwgQmFoYWdp YW4gS2VzZWxhbWF0YW4gZGFuIFBhc3BvcnQxIDAeBgNVBAMMF01hbGF5c2lhIENv dW50cnkgU2lnbmVyMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAsmCW X0c6LqdU9K8fM2t5HPzhlR/1SoHffSPCUlcfpefSfpQyMFi2XKuZrYAVFGnkBQ05 iO4gYOsYxmYxFQA3Pp5tX5tFK34UNeJDa9lpc1EME89WWLtxwE2nleaCTo5hrtpZ 8JpN71Ib11799xkhVBbI78HIVkxQsMmDAPR97HPp/0bgYfHMJOUbYh4LnYdztI/s sQzvmP1aw/NvTlkMPoH3Qs4sMbrSUi5sNy2xRIdT8lsBdwJCwNwgKRuRfqTsl3I5 DCF3lyfhmUzPYeq/GlZwzQgYsAyKmqi45Q4npqFQsWa8XhoyutN044Dd3Z2HDzjk al2xD6h8OIhB8DBJORPPcIHrbDItfX36mnGAePziysB8Osy0FMiRZI6q/5l7gXo+ abwCaGDa241rkQ0ZlrgKRwbR4kgOmyYVg+Pr3iRPzV/uZy5lD011d+/NG6qoYaEY mimDcIHnDToK+dYthlc9WhxpN6Ho4Lq0XROvPoqAnKmiDw3aYcKGmgZABZlfAgMB AAGjcjBwMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTIwMTMxMDI0MTQxWoEPMjAxNTAxMzEwMDExNDFaMB0GA1UdDgQW BBS2NPNSni7V7Xdzeahb5kpdreD1nDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFl AwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASADggGBAAt7 soo2p/8tG7VWwaFinxm+gUTkBtu5ZhJzGOlxOSwHjt6xwrKkilAyb17/Y9CpSach XNieFUvVGqrEXaHFdSjjttdRfpuYmf2t8agY2kyNZ0QhaPYsYZbW+hu01Po0bQLK DXCHGNttQRCx01aMdpklF79EUr5+ISNdntv7TreoRQp+20/lXaW8dGqegnpbszZ1 jHjuk2O/5+PfGH9fb5vFxNeT922Veb58IGzXDvSOq/21nylIjSk+JKIeQXjxeF/2 xqZDKcdZLlck0ueiDIVFiBkLnL3PExHPgnCVRLTyovVij1dVydbvp3zbpDV7ZX4C aenM5GijYPcC26BhSucayId2pScz4nAUy/twgqUVH7tjGHKR4vZp8vy+1OZuWi/w T6mHDw/O/XAlqnMHgKR2zOS+FDB8cipjbi5Kfqm4VtLxLl9Akgnsn+fFnWXpygqx vz1GqP8kMIHJT7TWZtWGu4LR8uDhA/VF6w7OikQ4z8avtm5kCZwOIeNNF2nJcA== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/71/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/71/end.crt000066400000000000000000000037651322470703100217150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBMTA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0xMzA1MTQxNjAwMDFaFw0yODA1 MTQxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAnEZmgdFgQDfDJbKZ yQs2AS4XXHD/6GxtygEhApPfNDBAVIP//vajOCw6JTnYLNTnkBbZSTimE85x4cuV kiU0XNd9ivYijbyogvPptYufx5TdRyoGYDvrL+L680ZQSAE7ICZMRzP6Pc7R4zKl SbsGeCRpUlDZoTMVsPzgxHw9yGYEQnCgGoFmUl8W+b2RCodOw/nuycMGIfPvBVBa LBlNjmiN7WH8+vR68JIXtsXF5Yng2+j5htZ16bnnaDVPk8f96j7KSYEDFCBF7Zpj qnyQ50NAqEj47Ya6E2RmuOGa1as/c1VWeg1yj6lg8RJYWyPP0qMDkeoGX+IJ6cOQ l1ZcKQIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBTKh9g4YhxVW2p/HR45LL5jtKwn BqGBjaSBijCBhzE7MDkGA1UEAxMyQ2hpbmEgUGFzc3BvcnQgQ291bnRyeSBTaWdu aW5nIENlcnRpZmljYXRlIChNYWNhbykxEjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUG A1UECxMeSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MQswCQYDVQQGEwJD ToIBCzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBADNTybY3Idpv uBQQk24oSGcfG7FXH+V85SMlMUrSIPPIsWP3/SOJsK7lVPj//ndIsr5b/WHc3bJ4 C0uN37Lx5NVT1+ql4W4ISDbxsYPqTFhwfq4eBuouLXrKuWORWQwX+KAcqYEsVjN/ wWuMShrZghdv14HgnuDVH+SGVo8R1fO5YkrwLA14drPofEx6Fo7ojuTkkePYzsBc KhoQaz1qpxgR+FIRLorcfiBtVY60dTUn69+i65Sr2bq6UsDxUDN5ErXC/Pjoohu5 cDyvtU4o3eeJV3qPZmjlrQPMmwNTRAaQSo43mfV59waSReSJSW31m1pspFkSPCCY V4ZL5Kz2CL+iwRC/N90BKTWe3b8EONUxrYKZEmWLLKY7jKAcGJFnVdAwm0bu31HD 5PASrAWbPGlaWAVo7cAK4N+1Wth+xs179uggZULjocusSEgdmToSwPt4fZfbNyjc g/8YpPn7X56xOG5OmNYQVytUpSUV2CzD+mxpARwutVqLYVhv9vHlU3OCHkYtvYgt 0pRrsiaMAE0ubslYBrXTnQwatVXpFsF2OFWI2L9Yu5UnYR5c1UPF46T3yYILp9rk iqMWw7EE8sfJstgWYqWetOD3o+le83sOIcRrW43qWljkOqmAPSKcacHr1HOu+BjO f0rwKp/JvuyxTW/yOKYuoBclzYeTwPOa -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/71/root.crt000066400000000000000000000042341322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBCzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTAxMTIxNjAwMDFaFw0yOTAx MTIxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk8PyHxaVxnxks19d k3M7KNsYqdo3kfsWjQzca+nNYPJQZ27dFCiv/zS4kP1V8RB4PHDFwSuPxbHq8hzj nmkGdhwKTthvwaJ/14VLo4dilfhkdjFr6KaEc4JfTot31cIO0Xpq2Q2ebODcogbn PawBfPP1M37SFBu3ov7HystedOR29Ko0qWUHst/z/8vIS6TWOq7hUlDaMTJOWGWW F5Srttokn5gQXn+0wU64Uv6LvLyx41QHm979vqbkXIwnumzVETwDwTLeh7j7JoVV XWe9aVb0exvvwzR3ZmseMG7xO9VfQ6WEMdMFTuMI/hrt+mxZ6qkNUTinLrKp6Fv7 HsSLh4IwjJGX+vR+qb0t4bAJbT9Kh5zl0XLUuVRx7be8sDxLiGgSu6AgwUE5fKdK o2/4BHRA4Er6YcmrQmNhhZ4trdxdPZm/FRyTOdy+fMNI4ftbu87PITEIObS5eQ2H 2SMuN7VZulLgOae6iJZDelZrh3Ci7N0HfXRru1QKIcV+z5KWc0bNY83IiB/ilUeA EyRftj2qtfhL9YcviG7hr32mRcGpXoxktiQtl0AqhldWmOeTkx+uqrSze4PaBMLP 9i9KLk2GgRyjQmm8EQEaDCaEKTNwBaB9pDmr1jBr903iQUG8MVcGn8R+v5UXHzt/ iYxjXtY1BKQF3ozz44RgjsK1dW0CAQOjRTBDMB0GA1UdDgQWBBTKh9g4YhxVW2p/ HR45LL5jtKwnBjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAa72EzcqQGVLnIPbwhqn6g7TbGwPW4XaUkfEHiGWt njthE51/u0Q/rffR8ua49Ba4DeOo3vGVAJAyZnGQpYPrWs9P6HA7W+YfbO4NZ1px PCLXHSs84f3czUNHnsIfW0UK5zNVX9/9/J0eG9Q+jYrkVkprFmsTTdCblW3PTYb7 Ecq+p0euEMcqguSs5P9r9pVJQLhXnua02oUGgwNHX2jbPhmGqcMw2tiCk/2VJMQ6 ypzPwjrdpDIiS6ThpUlKtH09gZ16RrAVBaio2b7ZENhjW60m7I1OlPSyZ4kgdEMU h2zJCuTuBjdzSk+cEl/xYCwj5OxQm1yMLS77ZVIhdTdz/JGP+pUNRN0SR5tVXWsm GYyzqZlSLk8LTO7alBnFonwGCp6cOneyJWmAbo5fNZbhqVGSgX4ToSFrGM26bHlp lbfWmriNgX6PYUq5toNqBQrb1dW7Kk3JIJ8ItUYjiV5JAB4/G3yJ8ejyQ5UkaBIM Wj4ml0U4sot5SGViTzTnMnTnhn705Nr5eOgcnMi+3Ps7MXszDgKvxub4la3l09+4 BM3o7hv2Wn1DUa0bFXkYYnPYZyX3eOmNnTX6CqkHa/0XkzxX2DeHyd4OuK7H/yEY uw7E9GREiLer7BxPMfTSGcqln8T541tRHDowwF5C69FuKFn+jdVYu8uBsstFNNt/ F3A= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/72/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/72/end.crt000066400000000000000000000037651322470703100217160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBGDA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0xMDA3MjYxNjAwMDFaFw0yNTA3 MjYxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBEb2N1bWVudCBT aWduZXIgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAjKTJgrDI6ywk9Lhn WbeQJW1ndAo/28BnvvRWpWlyfF3oSPrIDciqkqjUt07d3rbKmQksLRN3AbV6d64o 9dorEq5IsDc/sWrpv50SJMt1n4z5jxuJU5lD2dMXBmFYe7wHxlcLsJJ6TJFFo1Br kfabsTWB0j/cg6d0W5AtUdI2JAQXe1tqMhdb5dGXUUS8dHIPJgtOagZO1wxrvocd RD2v7NDlGcCSfBfvi3L9lci67hlv4FxoNrj8RnDumA6SB4P6rYrMAz2zlwcExZdm 4ZOCBipBEvSZDmwvGdsd2fg4LsXIXUAbVemC01nTGLVsopwshs/QvHLVkTe00tSR 2/8nswIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBTKh9g4YhxVW2p/HR45LL5jtKwn BqGBjaSBijCBhzE7MDkGA1UEAxMyQ2hpbmEgUGFzc3BvcnQgQ291bnRyeSBTaWdu aW5nIENlcnRpZmljYXRlIChNYWNhbykxEjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUG A1UECxMeSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MQswCQYDVQQGEwJD ToIBCzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBAGAcCtqjCP0f 7enuWyBOR6fohUM48//uyzegj/sBf640W0mbm4G6psYZxQBJAyCuM2bWc8Hv0WBo cBwnl5O9Mz1JPrscHCG/qIHR+bvpNg5ebFJm97a6Lsh44nVKPSbHwrJFIgqqAnKn HwV8MutACDR1VpDgYBjoJJT9/owYurc9Eq1Q+6w5f3W7grx39zse+1A6ouwqqUuk 0YchWglaZxCryYkzxPnHAjC5YuV6XqCt8OWm7ULw8XhGc5VwfUl6QvRWrou6FUOg MbakmqCdhVb3AfQKKsvXSZOssyaiVUXz8c4Mfilc2pUJ10j0fWvn7Ez+oL1c3T5M E5899xL+LJ5/fs2rkDpCIPFqNAEY5xWpBqWD61JjNOMB30mCSqKA1cGO+85izULu bFAvMm53SKQvWbdgusDg9VAiPQ4R6TLKi2etoXxL7oE7+SDGBnjatBUKeTAdk657 0HOvLF03HffcLa5HYtzD5dMhGb1nwCpnVgFE4g6PRKbYUxW0SvGfw2HUQqXH5aAb +ggwnlg9lbmt0LRsfwtUULHpQ7aW61K3dNjMx4+1nIeBbiduWRbULSP0hNzBM6hy 3m0uvWvebEwWfz6bkxB7ySTZ6KgHPeZ5FLwrEC6ZvhZ38See2lW+ApjG6f1WK4hN JZeom/4BCrxZ41DcjIlLfjU8GRBCc2o8 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/72/root.crt000066400000000000000000000042341322470703100221230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBCzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTAxMTIxNjAwMDFaFw0yOTAx MTIxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk8PyHxaVxnxks19d k3M7KNsYqdo3kfsWjQzca+nNYPJQZ27dFCiv/zS4kP1V8RB4PHDFwSuPxbHq8hzj nmkGdhwKTthvwaJ/14VLo4dilfhkdjFr6KaEc4JfTot31cIO0Xpq2Q2ebODcogbn PawBfPP1M37SFBu3ov7HystedOR29Ko0qWUHst/z/8vIS6TWOq7hUlDaMTJOWGWW F5Srttokn5gQXn+0wU64Uv6LvLyx41QHm979vqbkXIwnumzVETwDwTLeh7j7JoVV XWe9aVb0exvvwzR3ZmseMG7xO9VfQ6WEMdMFTuMI/hrt+mxZ6qkNUTinLrKp6Fv7 HsSLh4IwjJGX+vR+qb0t4bAJbT9Kh5zl0XLUuVRx7be8sDxLiGgSu6AgwUE5fKdK o2/4BHRA4Er6YcmrQmNhhZ4trdxdPZm/FRyTOdy+fMNI4ftbu87PITEIObS5eQ2H 2SMuN7VZulLgOae6iJZDelZrh3Ci7N0HfXRru1QKIcV+z5KWc0bNY83IiB/ilUeA EyRftj2qtfhL9YcviG7hr32mRcGpXoxktiQtl0AqhldWmOeTkx+uqrSze4PaBMLP 9i9KLk2GgRyjQmm8EQEaDCaEKTNwBaB9pDmr1jBr903iQUG8MVcGn8R+v5UXHzt/ iYxjXtY1BKQF3ozz44RgjsK1dW0CAQOjRTBDMB0GA1UdDgQWBBTKh9g4YhxVW2p/ HR45LL5jtKwnBjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAa72EzcqQGVLnIPbwhqn6g7TbGwPW4XaUkfEHiGWt njthE51/u0Q/rffR8ua49Ba4DeOo3vGVAJAyZnGQpYPrWs9P6HA7W+YfbO4NZ1px PCLXHSs84f3czUNHnsIfW0UK5zNVX9/9/J0eG9Q+jYrkVkprFmsTTdCblW3PTYb7 Ecq+p0euEMcqguSs5P9r9pVJQLhXnua02oUGgwNHX2jbPhmGqcMw2tiCk/2VJMQ6 ypzPwjrdpDIiS6ThpUlKtH09gZ16RrAVBaio2b7ZENhjW60m7I1OlPSyZ4kgdEMU h2zJCuTuBjdzSk+cEl/xYCwj5OxQm1yMLS77ZVIhdTdz/JGP+pUNRN0SR5tVXWsm GYyzqZlSLk8LTO7alBnFonwGCp6cOneyJWmAbo5fNZbhqVGSgX4ToSFrGM26bHlp lbfWmriNgX6PYUq5toNqBQrb1dW7Kk3JIJ8ItUYjiV5JAB4/G3yJ8ejyQ5UkaBIM Wj4ml0U4sot5SGViTzTnMnTnhn705Nr5eOgcnMi+3Ps7MXszDgKvxub4la3l09+4 BM3o7hv2Wn1DUa0bFXkYYnPYZyX3eOmNnTX6CqkHa/0XkzxX2DeHyd4OuK7H/yEY uw7E9GREiLer7BxPMfTSGcqln8T541tRHDowwF5C69FuKFn+jdVYu8uBsstFNNt/ F3A= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/73/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/73/end.crt000066400000000000000000000037651322470703100217170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBJzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0xMjAzMTkxNjAwMDFaFw0yNzAz MTkxNjAwMDFaMIGHMQswCQYDVQQGEwJDTjESMBAGA1UECgwJTWFjYW8gU0FSMScw JQYDVQQLDB5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxOzA5BgNVBAMM MkNoaW5hIFBhc3Nwb3J0IERvY3VtZW50IFNpZ25lciBDZXJ0aWZpY2F0ZSAoTWFj YW8pMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAgce5N1smPeLP/psc tASxwk7+2ky12vw/O+7DnF62FZZaSExFdQ8+m1wZWZy0ZrEmoW9tg/dU5apOFGg2 XkIfhWjWrr9jQdkJ32ymmU05O3XmxeZpK2NcwBtRnDE/voL85U8dgNr7fFvVlZMo M+lFnzvRYy4JttuaHNkwXZI5I83gGOVZZnF/J6qvTZjjSaUQfc9OuZWlwIxsXMnT W8Ejskx3Lwou7JYOW2NUoKCPk4QeBIwhaRcfNAMlCdswKKoxu04+GyK2jKXUuZt6 r5tQhPyua1+h6B8SKYn0kMtuID1HR5oCsHM5EDGjqTLsvyPf+TGuWF2VEGZIhrVh ZU87DQIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBTKh9g4YhxVW2p/HR45LL5jtKwn BqGBjaSBijCBhzE7MDkGA1UEAxMyQ2hpbmEgUGFzc3BvcnQgQ291bnRyeSBTaWdu aW5nIENlcnRpZmljYXRlIChNYWNhbykxEjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUG A1UECxMeSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MQswCQYDVQQGEwJD ToIBCzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBABBfzkZsAmYi Zmu/C+e1dE6f/RepBlEnQX2A9huWAbgFHq5G4mZMLek78jjy9lBkV57N3DMTq/8X HKio3f19IKDWgSq31ryk3p6X58amy2vwG0jHzb3e7i4PzwjstqsAWRKT/8Ldcm6I wZ4Wq3fvuIhObEDI4tfX7KlWmFsqZcbcK1IY5TFAVJa871C17NRLQ28eA9AxOwVu ftNxkx/pY9AxFn+iq12DDIZE2qeGVONLb1X2LDsTCCfDbbDgW89G9p9a3Kz61Dsa YVnd1gEDnqjmppaO3lhgD25HX8Ihyy6JGFXKIGuZW7W/RVQ8AAVC+RFi+r3Dcr4x u0/n1zkPez1qEU7CKISJpHRT2EndP2G+2z8YiXEQB+etAb86oMBJeCulknkH9c5T b+iqYxMZQADhla/HKxoxZk8h2ebe1a+39SmYM/rtY7bogSLCQ1swQ35Rbny1iPqC pTKVjWH44C9Jk8k+veTxr/tCFf5KRHCjtEOZSUEqUdNBS0ddQ4jj+vP7Tr8cfX/j tqPXunM2u2mxW9ChUa5s/b/UiJdT8PahYU8lSmggMntIBZlu093DsOd0wTMf9Z+v Sd6Oc0ij5/1tFJNocbtR/a6znamJTL8aziIZiQiXEMfkFd1dTEaNvLVFG97mB9DH Zmv44B55HB9rmXerpYbvC1dnNgRcyUuS -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/73/root.crt000066400000000000000000000042341322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBCzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTAxMTIxNjAwMDFaFw0yOTAx MTIxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk8PyHxaVxnxks19d k3M7KNsYqdo3kfsWjQzca+nNYPJQZ27dFCiv/zS4kP1V8RB4PHDFwSuPxbHq8hzj nmkGdhwKTthvwaJ/14VLo4dilfhkdjFr6KaEc4JfTot31cIO0Xpq2Q2ebODcogbn PawBfPP1M37SFBu3ov7HystedOR29Ko0qWUHst/z/8vIS6TWOq7hUlDaMTJOWGWW F5Srttokn5gQXn+0wU64Uv6LvLyx41QHm979vqbkXIwnumzVETwDwTLeh7j7JoVV XWe9aVb0exvvwzR3ZmseMG7xO9VfQ6WEMdMFTuMI/hrt+mxZ6qkNUTinLrKp6Fv7 HsSLh4IwjJGX+vR+qb0t4bAJbT9Kh5zl0XLUuVRx7be8sDxLiGgSu6AgwUE5fKdK o2/4BHRA4Er6YcmrQmNhhZ4trdxdPZm/FRyTOdy+fMNI4ftbu87PITEIObS5eQ2H 2SMuN7VZulLgOae6iJZDelZrh3Ci7N0HfXRru1QKIcV+z5KWc0bNY83IiB/ilUeA EyRftj2qtfhL9YcviG7hr32mRcGpXoxktiQtl0AqhldWmOeTkx+uqrSze4PaBMLP 9i9KLk2GgRyjQmm8EQEaDCaEKTNwBaB9pDmr1jBr903iQUG8MVcGn8R+v5UXHzt/ iYxjXtY1BKQF3ozz44RgjsK1dW0CAQOjRTBDMB0GA1UdDgQWBBTKh9g4YhxVW2p/ HR45LL5jtKwnBjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAa72EzcqQGVLnIPbwhqn6g7TbGwPW4XaUkfEHiGWt njthE51/u0Q/rffR8ua49Ba4DeOo3vGVAJAyZnGQpYPrWs9P6HA7W+YfbO4NZ1px PCLXHSs84f3czUNHnsIfW0UK5zNVX9/9/J0eG9Q+jYrkVkprFmsTTdCblW3PTYb7 Ecq+p0euEMcqguSs5P9r9pVJQLhXnua02oUGgwNHX2jbPhmGqcMw2tiCk/2VJMQ6 ypzPwjrdpDIiS6ThpUlKtH09gZ16RrAVBaio2b7ZENhjW60m7I1OlPSyZ4kgdEMU h2zJCuTuBjdzSk+cEl/xYCwj5OxQm1yMLS77ZVIhdTdz/JGP+pUNRN0SR5tVXWsm GYyzqZlSLk8LTO7alBnFonwGCp6cOneyJWmAbo5fNZbhqVGSgX4ToSFrGM26bHlp lbfWmriNgX6PYUq5toNqBQrb1dW7Kk3JIJ8ItUYjiV5JAB4/G3yJ8ejyQ5UkaBIM Wj4ml0U4sot5SGViTzTnMnTnhn705Nr5eOgcnMi+3Ps7MXszDgKvxub4la3l09+4 BM3o7hv2Wn1DUa0bFXkYYnPYZyX3eOmNnTX6CqkHa/0XkzxX2DeHyd4OuK7H/yEY uw7E9GREiLer7BxPMfTSGcqln8T541tRHDowwF5C69FuKFn+jdVYu8uBsstFNNt/ F3A= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/74/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/74/end.crt000066400000000000000000000037651322470703100217200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBEDA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTA4MDYxNjAwMDFaFw0yNDA4 MDYxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBEb2N1bWVudCBT aWduZXIgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA2W4kae6gIXhBl0EK i2saC9mj7ic6xS7H4/PXCeWUMZfRy+QV66pZN4J9jEEjSgSuyVPg+ew5SjTunjMm kDZ0ZmpC9ea1AIKiDuI5h1p5bw9sG/4A5yUPMMXCSvdI6DESzneiO5n5NtJ12mdn 2sUlmiT+2PJOt+6lPcvXW188pedtbxLuQo871CDhMwH7muMq5PBDx2cP8lsQBx0T SwziTq583lhr+XFAoWOFmoJwrWaB9Ebr+jeBYk9P10ofHmo8ccbjuXlkJM10Vcpf 7fVSNWNixUt6Ji8IQ5u86JgVQJtQvnwkNOoPbyXKxzbx3jheC73bV5jB0Gaky0h9 ufIdKwIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBTKh9g4YhxVW2p/HR45LL5jtKwn BqGBjaSBijCBhzE7MDkGA1UEAxMyQ2hpbmEgUGFzc3BvcnQgQ291bnRyeSBTaWdu aW5nIENlcnRpZmljYXRlIChNYWNhbykxEjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUG A1UECxMeSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MQswCQYDVQQGEwJD ToIBCzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBAEDMy7AK/oD/ B3S0uYpA5ybj6IP1d56k0LoD+Avm0Gpqkco2uYUl+633EqTdCeHpuWcQvj6w8QHm 4LwipIUWR67d3uuP9hkKzmnZzR95TLhQ570ziK3NR2aGJVd875mjXFu69KaRDzEv ThE3Kp6r/xYAwZ+761CKh/pi+C9jsXJ4E1RU8sBL9cN45ldVZ1VHRsqazCq5h1aT 38qykFC+zOUjtEQ8fpva9CegtkPfK2IBV6lKHRMEWvZVcPryzRhlGXntjKDRw+ce SCJqe9qJCHr+dDflPDP6vDhG293CRj4wnl1zv286zyuNJei0GMrmNf8VBD08zAe6 HRWReCdumr3/MpZOdqqDfBwe/kUBQOWopnKFS0O/g+QhyRU3DqtkUAX4kQgo3C/u xulatfTYA8kwiurburr7xvVP/25aMIY3mSQAMkwjOmoGRcX3Dawk7XOvQFPGnCEz 0gwXe4yg0qLhrIAbfs66ig/c6O58xXsT3nh3j3n6J/K22oXV7l9UgwEx/3500fTe TYylALOpjM9PBm0soZfyHDjncTrYSioQgM749CReZjmxZxC/n6A0lEnvy1GxxKnW H0dkuYlWFrr9JGhBXyckrn9jAL96JFg8981mymmNYeb8G1Q74n9fAxVkg1F1Oj4U 3LCANCRlYxqvWC3GLiPKN3/jhvolEBoe -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/74/root.crt000066400000000000000000000042341322470703100221250ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBCzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTAxMTIxNjAwMDFaFw0yOTAx MTIxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk8PyHxaVxnxks19d k3M7KNsYqdo3kfsWjQzca+nNYPJQZ27dFCiv/zS4kP1V8RB4PHDFwSuPxbHq8hzj nmkGdhwKTthvwaJ/14VLo4dilfhkdjFr6KaEc4JfTot31cIO0Xpq2Q2ebODcogbn PawBfPP1M37SFBu3ov7HystedOR29Ko0qWUHst/z/8vIS6TWOq7hUlDaMTJOWGWW F5Srttokn5gQXn+0wU64Uv6LvLyx41QHm979vqbkXIwnumzVETwDwTLeh7j7JoVV XWe9aVb0exvvwzR3ZmseMG7xO9VfQ6WEMdMFTuMI/hrt+mxZ6qkNUTinLrKp6Fv7 HsSLh4IwjJGX+vR+qb0t4bAJbT9Kh5zl0XLUuVRx7be8sDxLiGgSu6AgwUE5fKdK o2/4BHRA4Er6YcmrQmNhhZ4trdxdPZm/FRyTOdy+fMNI4ftbu87PITEIObS5eQ2H 2SMuN7VZulLgOae6iJZDelZrh3Ci7N0HfXRru1QKIcV+z5KWc0bNY83IiB/ilUeA EyRftj2qtfhL9YcviG7hr32mRcGpXoxktiQtl0AqhldWmOeTkx+uqrSze4PaBMLP 9i9KLk2GgRyjQmm8EQEaDCaEKTNwBaB9pDmr1jBr903iQUG8MVcGn8R+v5UXHzt/ iYxjXtY1BKQF3ozz44RgjsK1dW0CAQOjRTBDMB0GA1UdDgQWBBTKh9g4YhxVW2p/ HR45LL5jtKwnBjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAa72EzcqQGVLnIPbwhqn6g7TbGwPW4XaUkfEHiGWt njthE51/u0Q/rffR8ua49Ba4DeOo3vGVAJAyZnGQpYPrWs9P6HA7W+YfbO4NZ1px PCLXHSs84f3czUNHnsIfW0UK5zNVX9/9/J0eG9Q+jYrkVkprFmsTTdCblW3PTYb7 Ecq+p0euEMcqguSs5P9r9pVJQLhXnua02oUGgwNHX2jbPhmGqcMw2tiCk/2VJMQ6 ypzPwjrdpDIiS6ThpUlKtH09gZ16RrAVBaio2b7ZENhjW60m7I1OlPSyZ4kgdEMU h2zJCuTuBjdzSk+cEl/xYCwj5OxQm1yMLS77ZVIhdTdz/JGP+pUNRN0SR5tVXWsm GYyzqZlSLk8LTO7alBnFonwGCp6cOneyJWmAbo5fNZbhqVGSgX4ToSFrGM26bHlp lbfWmriNgX6PYUq5toNqBQrb1dW7Kk3JIJ8ItUYjiV5JAB4/G3yJ8ejyQ5UkaBIM Wj4ml0U4sot5SGViTzTnMnTnhn705Nr5eOgcnMi+3Ps7MXszDgKvxub4la3l09+4 BM3o7hv2Wn1DUa0bFXkYYnPYZyX3eOmNnTX6CqkHa/0XkzxX2DeHyd4OuK7H/yEY uw7E9GREiLer7BxPMfTSGcqln8T541tRHDowwF5C69FuKFn+jdVYu8uBsstFNNt/ F3A= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/75/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/75/end.crt000066400000000000000000000037651322470703100217210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFtDCCA2ygAwIBAgIBITA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0xMTA3MDYxNjAwMDFaFw0yNjA3 MDYxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBEb2N1bWVudCBT aWduZXIgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAgB8+WjMOqGpX2x91 LhzWIzvFH0if6EGXOZrPjpndtzSgs6wMpHYQbV8ENZfSgd/fQl0zRKGqC/067e8R hgPaHNYQGtHlD2SilN2Ii00tKAdu9VlBTv7iflOt/LWXYraDWLm47/brI6ThgPj/ FkYlZZ7CfF++WfayfiIf4/f7y01s/vIdCbcmooP3lSfTzPo6ceaKnpPIzj/7FIcV QoDEulVKP3XiJYwee3gXswYIZ8Z4JCGfULjqovFdmRym6A66lgt9+AICxJXEIthZ BKEjJ7+EV8TQ1HovonI6NzdgOdxG5231wRQLchnVdm7IAKJibUyHC5dUFoqLTEQt /wjThwIBA6OByjCBxzCBtAYDVR0jBIGsMIGpgBTKh9g4YhxVW2p/HR45LL5jtKwn BqGBjaSBijCBhzE7MDkGA1UEAxMyQ2hpbmEgUGFzc3BvcnQgQ291bnRyeSBTaWdu aW5nIENlcnRpZmljYXRlIChNYWNhbykxEjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUG A1UECxMeSWRlbnRpZmljYXRpb24gU2VydmljZXMgQnVyZWF1MQswCQYDVQQGEwJD ToIBCzAOBgNVHQ8BAf8EBAMCB4AwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQME AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggIBAGAkLRygBsPK Lk98x0p6HbN321M/wIC7AfzoDMOQMyMLxkwweQ/zQj+akO9qhb9ZIadHGz3bPDc4 sVUb8IGVT1u5t5U4bGJ1faUjM/zb+jNL41zPGBsWrCktQ6D6h1nSf2jzaWtk/jf9 ktaRRcX/FH7Rod9NOKiMYlwQ3dAiaTeCwxEqJXauiIEnxj9uLcXjJ4vCRYx7nyJl JQSPTMf4gpjK9LWheLZGqgjxEl+bWCDDsyjLuPrzlNo04B8OtrYVfaR/jjUOAkU+ UJcrGF73XxYs5vWAL0+G3GirG+RZvjbYE4DzxSEYL1rfcbiVEbYq7BYM8ByJ/auH EZP53U7sFhkLbToBPBE4LZ/12/KDiuB9PmuXQE6LZE0KTvnctDurfhKGutTIlS5V 725Y4yKS5lPSnqYgnc5VpohiNzUZSwkSks4TGY518zd7zmkzju5XYATp+tJPOkZO In/9d0Zra7Xk/KROQBvqKddFTWcdE8+WrvLQr8sGdx9rfvfmPY0lF2EKPttzSD8J yvtAZRNL2cdXIC0pBakYjaI/bM0FfZJcLrTGVS+huh3YeEijhkSNT3VmQVosLiqo lFys1aKvvUp7bRaWxtM+TwFcg5l6TvY89RKyfEb0yosMDNojU80ALJB58opdrWZh 7KMY94Pxw7TGwOBTF7qrLc5eHJbnx63n -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/75/root.crt000066400000000000000000000042341322470703100221260ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBCzA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTAxMTIxNjAwMDFaFw0yOTAx MTIxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAk8PyHxaVxnxks19d k3M7KNsYqdo3kfsWjQzca+nNYPJQZ27dFCiv/zS4kP1V8RB4PHDFwSuPxbHq8hzj nmkGdhwKTthvwaJ/14VLo4dilfhkdjFr6KaEc4JfTot31cIO0Xpq2Q2ebODcogbn PawBfPP1M37SFBu3ov7HystedOR29Ko0qWUHst/z/8vIS6TWOq7hUlDaMTJOWGWW F5Srttokn5gQXn+0wU64Uv6LvLyx41QHm979vqbkXIwnumzVETwDwTLeh7j7JoVV XWe9aVb0exvvwzR3ZmseMG7xO9VfQ6WEMdMFTuMI/hrt+mxZ6qkNUTinLrKp6Fv7 HsSLh4IwjJGX+vR+qb0t4bAJbT9Kh5zl0XLUuVRx7be8sDxLiGgSu6AgwUE5fKdK o2/4BHRA4Er6YcmrQmNhhZ4trdxdPZm/FRyTOdy+fMNI4ftbu87PITEIObS5eQ2H 2SMuN7VZulLgOae6iJZDelZrh3Ci7N0HfXRru1QKIcV+z5KWc0bNY83IiB/ilUeA EyRftj2qtfhL9YcviG7hr32mRcGpXoxktiQtl0AqhldWmOeTkx+uqrSze4PaBMLP 9i9KLk2GgRyjQmm8EQEaDCaEKTNwBaB9pDmr1jBr903iQUG8MVcGn8R+v5UXHzt/ iYxjXtY1BKQF3ozz44RgjsK1dW0CAQOjRTBDMB0GA1UdDgQWBBTKh9g4YhxVW2p/ HR45LL5jtKwnBjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAa72EzcqQGVLnIPbwhqn6g7TbGwPW4XaUkfEHiGWt njthE51/u0Q/rffR8ua49Ba4DeOo3vGVAJAyZnGQpYPrWs9P6HA7W+YfbO4NZ1px PCLXHSs84f3czUNHnsIfW0UK5zNVX9/9/J0eG9Q+jYrkVkprFmsTTdCblW3PTYb7 Ecq+p0euEMcqguSs5P9r9pVJQLhXnua02oUGgwNHX2jbPhmGqcMw2tiCk/2VJMQ6 ypzPwjrdpDIiS6ThpUlKtH09gZ16RrAVBaio2b7ZENhjW60m7I1OlPSyZ4kgdEMU h2zJCuTuBjdzSk+cEl/xYCwj5OxQm1yMLS77ZVIhdTdz/JGP+pUNRN0SR5tVXWsm GYyzqZlSLk8LTO7alBnFonwGCp6cOneyJWmAbo5fNZbhqVGSgX4ToSFrGM26bHlp lbfWmriNgX6PYUq5toNqBQrb1dW7Kk3JIJ8ItUYjiV5JAB4/G3yJ8ejyQ5UkaBIM Wj4ml0U4sot5SGViTzTnMnTnhn705Nr5eOgcnMi+3Ps7MXszDgKvxub4la3l09+4 BM3o7hv2Wn1DUa0bFXkYYnPYZyX3eOmNnTX6CqkHa/0XkzxX2DeHyd4OuK7H/yEY uw7E9GREiLer7BxPMfTSGcqln8T541tRHDowwF5C69FuKFn+jdVYu8uBsstFNNt/ F3A= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/76/000077500000000000000000000000001322470703100204275ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/76/end.crt000066400000000000000000000030761322470703100217150ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEcDCCAqSgAwIBAgICAXowQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTUwMjE3MDkyODM3WhcN MjUwNTE3MDgyODM3WjBmMREwDwYDVQQDDAhTVENfRFNfMTEXMBUGA1UECgwOQ3pl Y2ggUmVwdWJsaWMxKzApBgNVBAsMIlN0YXRlIFByaW50aW5nIFdvcmtzIG9mIFNl Y3VyaXRpZXMxCzAJBgNVBAYTAkNaMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAtVs6Okh2uGBZuM92ybB30258BKUyQt0gei1I/F/c62ps6hbu7AA0p8qm e0KXdxa4X8iOa0WqDMe10bbMHW0wceUkbDnFFHCzqb4SJ1MKrtx05eQM5nQNsrCu IkOVZdzRWfgVANJw4ySmMMf5kaskYY0I2phXrzIHMqFg7I7b2IrWN4EIztO4OPsl Xq1fdq58C9tOBp9JWHtUmzZpo276yyL94GE4uddJBjqn3ts6P7agJAmB/WM7uUzm OhlbfdeLuptlpQA+tp+/c8FH8eOLp3VU5TUawQaBXqtCSQFxIECjyMVOqCfX7fUz dWJBuX0Junt+K+EHkBB/y8BPeQb1qwIDAQABo08wTTAfBgNVHSMEGDAWgBTroU+P PGmK2rYQmxI1KM7UZUoIWTAOBgNVHQ8BAf8EBAMCB4AwGgYDVR0gBBMwETAPBg0q gUu3GAEBAQGJyLJrMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAa BgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEAf1146grmEsppDRaK yfOXzoYknppNb8gid+LRgceZmtHiHA1ufGyfTIP8GgqeK2IP/bTwuyTMGRDVtX/g RpAV1omuuUYNvpPyNMTf+oR6xpmU+Mtba8W1tdqtldypHoyZMllc8SmXMNh8NnSD zX7DDGWAtYXHR2mpfmpEc4EqNOtQvofbSPtKxx95fJMsk2QXuZeNZ9qoQkSCnbeP Y0GNzDNfABmgPWLUO+kV+nvC8ETQOMAoef0II9cp5t10sPmvzK1px+4wWY63OJUO vetDwaFl/3BOuTHhlVhFf0F6B81thZJRVdqUO0lD749WkGa/KLGeKiLf9cFLL3LZ UJx+j2Pvj9j/SEZGWJ8IXR8vkp1SlTFWWfoVhZtxyN1ILlu+YMl3AF8uvobE16DL TEeoWLldsarVu5+bv29h9W2r8MWh5aCLoAweqeyUFXPKWBUL2uiL/bmsOUzuKf1l l89AeEN/+mjkSV3xI9PhUv+9qfJy7OGBJpvAtcQshwLChHKf -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/76/root.crt000066400000000000000000000033611322470703100221270ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBdDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoMDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLDBRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAwwHQ1NDQV9DWjAeFw0xMTAzMjUwMDAwMDBaFw0y NjA2MjUwMDAwMDBaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECwwUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdFhq+ScQXepAA 0kp0IwF/nEv+Md3Wx41Y6WRJkTVVyU6CFPlvr/F6XLGX/ILJtM8QL97CgojDVQbE ccNxUsZ+yjtB4n52ttWYLBN5nktJksP2aBVMu1fqoyTqBhaf0JtkpQjWKNVJYbUH k2pXkzGUJ+YHG04jOEYIKNclY82f1Ho1Wd7di4gZ1LCBRTzIU9JVPEMOZdmLx1qQ InOWf8deZ4Gmkj5UqzXt7vGQF/TbIedhmfnbulvyHN3UEDMZgVgzkF2fIOaBwu5s kfo8e08/J155hZIJtUjXk/moLF8U/4ETo7qER1EkoJ9KIRIvoPwPk2QAI4JP0Hd6 GgUMEsz0dmTxKHcJZAWXcDaKcwTrG7/xhPTAffdOZnTnOpYQPcKmjUvogqY839VQ mwYyo+s51tVrAIe2YcdHhIdBY5SLOhHsDNadpRrBYIa8vzUgtfUH50US7dZuwUu6 WbUiQu5vmDjvGEUa7F6eehCCf9xXkbPJZoE63t/NJYvHSFa1wDcCAwEAAaNhMF8w HQYDVR0OBBYEFOuhT488aYrathCbEjUoztRlSghZMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnKmXwwEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAEcppLLH0xAkWXbBMXDa1hwqOZfKVdoUVDNT G20V3VbDT74R2yFCLWBge9rr7S2LfF/w4Xrl3kyZ2Tn0dYoOmBcqVzH6nCYrniGx apPmSkAexI/bjW55BOMe6CVI9qdKayqm99om/2+R+VSAKaopwOKn9IQ+4itNA0VI 0ZDHbI/pdJClRZ0OPA8DREz7+hZWMNb7S4aAYGdd1fLo0uDKf/siFkUUfkpBtkgr 4Enb1e8NMU0a5abpI25NgURB+OWhfArLB9jFmnlql6TZADLZfw49bEmr4KOddxyk toBmFgu4/uQXcukNWB487iREvEPPIL7A90W+W3ymtlol76SChKKBGexaaNA1JW+O sRxoN5FnXTBhyRm96lZOfvF7SjCQHMCaIeYaQ4ajjPJgxB0EbyyJMeSrjh4yJPEH pKc3AM9MUCxC0LO/qb5oBio8TQqHYnpyvp2CsvPSezPGh/40hxsKTL8GqTxB5m9G g6qpdcDQxM6VtrnTh08nMjaKnfXVJQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/77/000077500000000000000000000000001322470703100204305ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/77/end.crt000066400000000000000000000030761322470703100217160ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEcDCCAqSgAwIBAgICAbYwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTUxMjE1MDc0MjM1WhcN MjYwMzE1MDc0MjM1WjBmMREwDwYDVQQDDAhTVENfRFNfMTEXMBUGA1UECgwOQ3pl Y2ggUmVwdWJsaWMxKzApBgNVBAsMIlN0YXRlIFByaW50aW5nIFdvcmtzIG9mIFNl Y3VyaXRpZXMxCzAJBgNVBAYTAkNaMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAyAdgNkEcV98OCru8m36absU/F2GwqDx+jEoDOaPmNGQ0QRxhlFV3Ihux IWA4N21oV8LLEu4VKZHslO7PgoyGMDNuYRk4jjr4vB1UMpXad/90wFHhk7QDhr0O jWdvmdfd3agYoNy+xETM/GzpUIwlHn2RUnnC0kW9xe+whktVOkdMz0sflTwEnAAj ELr10MWX42OIsw7zlnuk3JmYa8R/7xfD+Lc2AEjhg/YZYyMdd1k9VuD5FwQA/tlE IwAChexSc2lzX7vJBEvN3OSLjerM/DtFPqTQBQIgzyz+iCz2JuS6W7psuYjlYNYs JErWY6ZovzeEcs/eImDfqTqbTDKdgQIDAQABo08wTTAfBgNVHSMEGDAWgBTroU+P PGmK2rYQmxI1KM7UZUoIWTAOBgNVHQ8BAf8EBAMCB4AwGgYDVR0gBBMwETAPBg0q gUu3GAEBAQGJyLJrMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAa BgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEAa7tpwWrDx4AzMJ6T F8NoSTujEJWBNe1jj7tUxfg4jhUG2OZ+v/czTBnQ7usOQ26LzrJw9HKq16WLMQ2x GrZsSNscr90JhepeL5IQVgRruORn66L/Ssvppb5hNok7ETLbjZS8z+c/NjNIx7io hJDLCsOu1XHPSes2Z80p/v9ThoBPjVTLQWyyk4Q4ql1z9UAv7BzssBHe3/hO0Y60 CCpaAgZukDQETIwxvsxWpxTgWz7yLDw1b/kSsxRHWVcstOFjFEg14bSGfYUSa4o4 rc2tiIH/ovAhrB1gjSXXB/w9SRY2ArOakxHNIKQJjyrTC7fribgBW46cKHxeilqp Kg4m9vmAVWezwp2F3g7tOk156uzby2HqLlN1tShPVTolBKUfw2TYp0eWe8ox2ME9 INlGX17m7zAvdDJp03hBhKQTiddTLPBSG7l7GMsF5h2wAJF3b7Qq/UoHJbeZk+uS rLanyt3iieO+XE7xDWIkECF7ktiHiuUBFg/A24hcb15euwf+ -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/77/root.crt000066400000000000000000000033611322470703100221300ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBdDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoMDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLDBRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAwwHQ1NDQV9DWjAeFw0xMTAzMjUwMDAwMDBaFw0y NjA2MjUwMDAwMDBaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECwwUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdFhq+ScQXepAA 0kp0IwF/nEv+Md3Wx41Y6WRJkTVVyU6CFPlvr/F6XLGX/ILJtM8QL97CgojDVQbE ccNxUsZ+yjtB4n52ttWYLBN5nktJksP2aBVMu1fqoyTqBhaf0JtkpQjWKNVJYbUH k2pXkzGUJ+YHG04jOEYIKNclY82f1Ho1Wd7di4gZ1LCBRTzIU9JVPEMOZdmLx1qQ InOWf8deZ4Gmkj5UqzXt7vGQF/TbIedhmfnbulvyHN3UEDMZgVgzkF2fIOaBwu5s kfo8e08/J155hZIJtUjXk/moLF8U/4ETo7qER1EkoJ9KIRIvoPwPk2QAI4JP0Hd6 GgUMEsz0dmTxKHcJZAWXcDaKcwTrG7/xhPTAffdOZnTnOpYQPcKmjUvogqY839VQ mwYyo+s51tVrAIe2YcdHhIdBY5SLOhHsDNadpRrBYIa8vzUgtfUH50US7dZuwUu6 WbUiQu5vmDjvGEUa7F6eehCCf9xXkbPJZoE63t/NJYvHSFa1wDcCAwEAAaNhMF8w HQYDVR0OBBYEFOuhT488aYrathCbEjUoztRlSghZMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnKmXwwEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAEcppLLH0xAkWXbBMXDa1hwqOZfKVdoUVDNT G20V3VbDT74R2yFCLWBge9rr7S2LfF/w4Xrl3kyZ2Tn0dYoOmBcqVzH6nCYrniGx apPmSkAexI/bjW55BOMe6CVI9qdKayqm99om/2+R+VSAKaopwOKn9IQ+4itNA0VI 0ZDHbI/pdJClRZ0OPA8DREz7+hZWMNb7S4aAYGdd1fLo0uDKf/siFkUUfkpBtkgr 4Enb1e8NMU0a5abpI25NgURB+OWhfArLB9jFmnlql6TZADLZfw49bEmr4KOddxyk toBmFgu4/uQXcukNWB487iREvEPPIL7A90W+W3ymtlol76SChKKBGexaaNA1JW+O sRxoN5FnXTBhyRm96lZOfvF7SjCQHMCaIeYaQ4ajjPJgxB0EbyyJMeSrjh4yJPEH pKc3AM9MUCxC0LO/qb5oBio8TQqHYnpyvp2CsvPSezPGh/40hxsKTL8GqTxB5m9G g6qpdcDQxM6VtrnTh08nMjaKnfXVJQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/78/000077500000000000000000000000001322470703100204315ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/78/end.crt000066400000000000000000000030761322470703100217170ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEcDCCAqSgAwIBAgICAOowQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTMwMjE5MDkyNzA3WhcN MjMwNTE5MDgyNzA3WjBmMREwDwYDVQQDDAhTVENfRFNfMTEXMBUGA1UECgwOQ3pl Y2ggUmVwdWJsaWMxKzApBgNVBAsMIlN0YXRlIFByaW50aW5nIFdvcmtzIG9mIFNl Y3VyaXRpZXMxCzAJBgNVBAYTAkNaMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAtjLsEC7/dEgNZDQR5bLelWuzucpW/81XkEXiQ+Jy1L9VI9U5AU2Vn//5 ysM4Xb3fqdMoUlmLb251Nr7U6QnU3wKYpLfjffpRgd9ge7f38SPWE54RhBLX5khv U6+rQACovW4rdb4vrtg1PaR8Z3QYt4TnN0+V7xGhFSSZCWcm18Y8v3gcMo79HvQ5 t3pEQ6FXKD8c8E7yIXt+3GPHDD3/EF6xBxa0BeD8GqpTk9hKIWo9zkWfjJZeVxmA q1R9CaVvycCkBqf03cPL3j7DvMJbcT9r119+MGOcxA720vIOivQfnUZLe45qVx15 ezTSBuvex+9Q0KWIs1p/hOsI4dE4fQIDAQABo08wTTAfBgNVHSMEGDAWgBTroU+P PGmK2rYQmxI1KM7UZUoIWTAOBgNVHQ8BAf8EBAMCB4AwGgYDVR0gBBMwETAPBg0q gUu3GAEBAQGJyLJrMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAa BgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEALnNk81796Snh8+S8 etKQwXN+evxnsmHfQ8eOjpVUkN+mjzh/bqk1Rpbe+kbKG457Uiw2XtkXxW/y2rfA jV5M7AxbhuzNjN/BCAn3Z0ybrXukZKV90Ye5gHXEOY2hYEKbiG1b/mdqMKFBkT64 lo33xQkiNlkWSIdzVkamQ8oY9HJ7Thz6/D77Lb99Xs3Nio5mq2VNeEH3S80pqsXB zSd9o5NZwiamyLode7B5nKZ6x2U3OI7aBnfKhAZ/sq9GIOU9p0u/YgQ6KNQa/EpA LoRv8oKZRsISa/jE/2Wb2ThoBUFtU0NkNFo4KJl7yk218zdr/zbmVYltNKhUcPgZ n7rPtjusMnBCZ1eHMj+DWS5gbtbDXqMiUZpum4pVmhT4la2eSscEC1fAXCs5BYGT FJCVq6Ty+jHzTkqev1BfR3Vj5P8mKeL+a3HaXoM+WbRhHs+crZyLpraIlF6Lw6Zm eqRzfwrQ/mkaWwkCtQ+D7h/0+GLeWyGojuDtx2xG202lJSgg -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/78/root.crt000066400000000000000000000033611322470703100221310ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBdDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoMDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLDBRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAwwHQ1NDQV9DWjAeFw0xMTAzMjUwMDAwMDBaFw0y NjA2MjUwMDAwMDBaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECwwUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdFhq+ScQXepAA 0kp0IwF/nEv+Md3Wx41Y6WRJkTVVyU6CFPlvr/F6XLGX/ILJtM8QL97CgojDVQbE ccNxUsZ+yjtB4n52ttWYLBN5nktJksP2aBVMu1fqoyTqBhaf0JtkpQjWKNVJYbUH k2pXkzGUJ+YHG04jOEYIKNclY82f1Ho1Wd7di4gZ1LCBRTzIU9JVPEMOZdmLx1qQ InOWf8deZ4Gmkj5UqzXt7vGQF/TbIedhmfnbulvyHN3UEDMZgVgzkF2fIOaBwu5s kfo8e08/J155hZIJtUjXk/moLF8U/4ETo7qER1EkoJ9KIRIvoPwPk2QAI4JP0Hd6 GgUMEsz0dmTxKHcJZAWXcDaKcwTrG7/xhPTAffdOZnTnOpYQPcKmjUvogqY839VQ mwYyo+s51tVrAIe2YcdHhIdBY5SLOhHsDNadpRrBYIa8vzUgtfUH50US7dZuwUu6 WbUiQu5vmDjvGEUa7F6eehCCf9xXkbPJZoE63t/NJYvHSFa1wDcCAwEAAaNhMF8w HQYDVR0OBBYEFOuhT488aYrathCbEjUoztRlSghZMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnKmXwwEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAEcppLLH0xAkWXbBMXDa1hwqOZfKVdoUVDNT G20V3VbDT74R2yFCLWBge9rr7S2LfF/w4Xrl3kyZ2Tn0dYoOmBcqVzH6nCYrniGx apPmSkAexI/bjW55BOMe6CVI9qdKayqm99om/2+R+VSAKaopwOKn9IQ+4itNA0VI 0ZDHbI/pdJClRZ0OPA8DREz7+hZWMNb7S4aAYGdd1fLo0uDKf/siFkUUfkpBtkgr 4Enb1e8NMU0a5abpI25NgURB+OWhfArLB9jFmnlql6TZADLZfw49bEmr4KOddxyk toBmFgu4/uQXcukNWB487iREvEPPIL7A90W+W3ymtlol76SChKKBGexaaNA1JW+O sRxoN5FnXTBhyRm96lZOfvF7SjCQHMCaIeYaQ4ajjPJgxB0EbyyJMeSrjh4yJPEH pKc3AM9MUCxC0LO/qb5oBio8TQqHYnpyvp2CsvPSezPGh/40hxsKTL8GqTxB5m9G g6qpdcDQxM6VtrnTh08nMjaKnfXVJQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/79/000077500000000000000000000000001322470703100204325ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/79/end.crt000066400000000000000000000030761322470703100217200ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEcDCCAqSgAwIBAgICAKgwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTIwMzIwMTM0NjE5WhcN MjIwNjIwMTI0NjE5WjBmMREwDwYDVQQDDAhTVENfRFNfMTEXMBUGA1UECgwOQ3pl Y2ggUmVwdWJsaWMxKzApBgNVBAsMIlN0YXRlIFByaW50aW5nIFdvcmtzIG9mIFNl Y3VyaXRpZXMxCzAJBgNVBAYTAkNaMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvuyw42hDp2xh9letbovYbDnlLlBS5/eWiEndXeDtplSaB01643tpt8+m +5oYlHV4XUHdmcz4N5yFMRXWeIN2RcVlhtnP8q2XRcdKGukI0f26nl9rwkmQIzTP DmXPcJ13qpmahqWU92z5kLSsT1jMolGWXZP7RK+TfTSWQcTtqJnR3NOZzLYsDTvq tOPHsK9ugESBLLP05Gu/a2ZmSMI3U6kcZAk0AVyJoi5ikrPwJOl46Y2ffcrNu2ub wKISy+FDBatI7ip8xuTlETEFG9fqjTnk8px0B2L/mpA+C98R9fhEjTHFfegTS+P9 mc4nP13KuYh4TX/pUKXlB1sIGo+FkwIDAQABo08wTTAfBgNVHSMEGDAWgBTroU+P PGmK2rYQmxI1KM7UZUoIWTAOBgNVHQ8BAf8EBAMCB4AwGgYDVR0gBBMwETAPBg0q gUu3GAEBAQGJyLJrMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAa BgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEATq3RiRYMWhCmXRRU qtoUoufIKqEBGyeXZ66g19iT41pBPlyOvI4rGNznao0ElIC9Z8gsA4CgX8oIu2GJ Xmjm1/ECXOVl8SPdsDVCCqdQ+Fnj+f+SmFJ6i1aURQYWVeAGfT5toYY42aij40ch q2jZY3j7u2m1bNpoxuga6UjvEvtqkiamuVN+0p5FnSmMLAQ1PTPqR+8hjHgAFT8t XzHDfBiSdIm2+dPb1BJMWVsnRDF3KIaU1s1ZQ2fhkFnF9JQqjQErkc28Rc0D/fxV EkthiWXDRx/znNBJte365oeF26SqWautjfLxrocZew9bJLkrXNL48VzC1dEs/bD1 c8mYghSG64AJPZvwpYcClgmqsRFP5O2mETFfb40esGcguZJE4hGxA/eZRBrbi0Ws PXfuQxbos5ziBgH95D+mRFKpUHBPZO9mNgqj1KRLY+6405loiP1/FnHBKf4XWqrl 9wDMKVFZZd1g3fPNXXwyRnEEXZH4cvBT41q0Jxcyv30AYe9m -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/79/root.crt000066400000000000000000000033611322470703100221320ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBdDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoMDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLDBRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAwwHQ1NDQV9DWjAeFw0xMTAzMjUwMDAwMDBaFw0y NjA2MjUwMDAwMDBaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECwwUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdFhq+ScQXepAA 0kp0IwF/nEv+Md3Wx41Y6WRJkTVVyU6CFPlvr/F6XLGX/ILJtM8QL97CgojDVQbE ccNxUsZ+yjtB4n52ttWYLBN5nktJksP2aBVMu1fqoyTqBhaf0JtkpQjWKNVJYbUH k2pXkzGUJ+YHG04jOEYIKNclY82f1Ho1Wd7di4gZ1LCBRTzIU9JVPEMOZdmLx1qQ InOWf8deZ4Gmkj5UqzXt7vGQF/TbIedhmfnbulvyHN3UEDMZgVgzkF2fIOaBwu5s kfo8e08/J155hZIJtUjXk/moLF8U/4ETo7qER1EkoJ9KIRIvoPwPk2QAI4JP0Hd6 GgUMEsz0dmTxKHcJZAWXcDaKcwTrG7/xhPTAffdOZnTnOpYQPcKmjUvogqY839VQ mwYyo+s51tVrAIe2YcdHhIdBY5SLOhHsDNadpRrBYIa8vzUgtfUH50US7dZuwUu6 WbUiQu5vmDjvGEUa7F6eehCCf9xXkbPJZoE63t/NJYvHSFa1wDcCAwEAAaNhMF8w HQYDVR0OBBYEFOuhT488aYrathCbEjUoztRlSghZMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnKmXwwEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAEcppLLH0xAkWXbBMXDa1hwqOZfKVdoUVDNT G20V3VbDT74R2yFCLWBge9rr7S2LfF/w4Xrl3kyZ2Tn0dYoOmBcqVzH6nCYrniGx apPmSkAexI/bjW55BOMe6CVI9qdKayqm99om/2+R+VSAKaopwOKn9IQ+4itNA0VI 0ZDHbI/pdJClRZ0OPA8DREz7+hZWMNb7S4aAYGdd1fLo0uDKf/siFkUUfkpBtkgr 4Enb1e8NMU0a5abpI25NgURB+OWhfArLB9jFmnlql6TZADLZfw49bEmr4KOddxyk toBmFgu4/uQXcukNWB487iREvEPPIL7A90W+W3ymtlol76SChKKBGexaaNA1JW+O sRxoN5FnXTBhyRm96lZOfvF7SjCQHMCaIeYaQ4ajjPJgxB0EbyyJMeSrjh4yJPEH pKc3AM9MUCxC0LO/qb5oBio8TQqHYnpyvp2CsvPSezPGh/40hxsKTL8GqTxB5m9G g6qpdcDQxM6VtrnTh08nMjaKnfXVJQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/80/000077500000000000000000000000001322470703100204225ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/80/end.crt000066400000000000000000000030761322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEcDCCAqSgAwIBAgICAOQwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTMwMTIyMTAwMjAyWhcN MjMwNDIyMDkwMjAyWjBmMREwDwYDVQQDDAhTVENfRFNfMTEXMBUGA1UECgwOQ3pl Y2ggUmVwdWJsaWMxKzApBgNVBAsMIlN0YXRlIFByaW50aW5nIFdvcmtzIG9mIFNl Y3VyaXRpZXMxCzAJBgNVBAYTAkNaMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAy88PFA+udFZr8gw1BD4X6rmEBqrh7OIY+egMuiSnH3zFpy9u3WeP4g8A gbBvv8zcJaVh3WykytbRRzni6pSDmwXOb1joZkwCiT8cWdzem96n13FM2Vchpz7J H9ipoNim/iyNjMGHtvYnhvyC0Rmu8NZpnkKM4qb8fXwyDrDYufGXdkSDHy2K6BFE 79voy/03/KH8YsgzDuvr/OvohebSJi2emcUU7JdASrzk7sBtQJWSxVfBihXTtnFN sZkxTo+E1V+gfrxau1XqHP613eK9y5Zj9PHuV19AkWXVNvEGUlFtmMODmgJSWXmb aJj/EijdePEMvVdVx+g20mdpdO2c6QIDAQABo08wTTAfBgNVHSMEGDAWgBTroU+P PGmK2rYQmxI1KM7UZUoIWTAOBgNVHQ8BAf8EBAMCB4AwGgYDVR0gBBMwETAPBg0q gUu3GAEBAQGJyLJrMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAa BgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOCAYEABgfmO+NJxVgD7ebq UW5VPBsO11aYL6AvKGtG3JjXnd0/8B9xoysGlcsoUp60m3alg0Oqb34ROcv5SLGM jgD8TNGOvy3MnbJnkEsO3JUWg0i8Zc8wYPH/q/jhcPIVWp46Oj9ogR97eaTxY4In yAkMYzYQ9U01AzBgtJ6nmHgNPzuXBxxl1K9scda3bemBG4fXO4sfEBOekA/3Gs6+ o0dx3dvzt5V6T+YTUxJA+a/HWqyUMBEWNiee/8vff/m8tj7q7mfvUME52aNKTBJm s7YgKdXhTZyw/C2YE5gIj0r4kT0RCIRX7vrjBfiDXThlhrt+TfBNjrSDEtSnOQfQ cvoMDmAxkz4M4dJn/iAp6K1nbSMrGyhApdWuA189ldMVaQdG4ifB+HzQz+eeG7fH Q1K0ndvF/Z2ARUsZ4GK2vUadCg2aC0CQI5XJXpp9MX9pAWRjioQdq7PjtbJzYcLg Tq9VCbZNWzAickgdRMhrJymOkKYZffNBvsRP76x1G9eSfPU+ -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/80/root.crt000066400000000000000000000033611322470703100221220ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBdDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoMDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLDBRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAwwHQ1NDQV9DWjAeFw0xMTAzMjUwMDAwMDBaFw0y NjA2MjUwMDAwMDBaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECwwUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdFhq+ScQXepAA 0kp0IwF/nEv+Md3Wx41Y6WRJkTVVyU6CFPlvr/F6XLGX/ILJtM8QL97CgojDVQbE ccNxUsZ+yjtB4n52ttWYLBN5nktJksP2aBVMu1fqoyTqBhaf0JtkpQjWKNVJYbUH k2pXkzGUJ+YHG04jOEYIKNclY82f1Ho1Wd7di4gZ1LCBRTzIU9JVPEMOZdmLx1qQ InOWf8deZ4Gmkj5UqzXt7vGQF/TbIedhmfnbulvyHN3UEDMZgVgzkF2fIOaBwu5s kfo8e08/J155hZIJtUjXk/moLF8U/4ETo7qER1EkoJ9KIRIvoPwPk2QAI4JP0Hd6 GgUMEsz0dmTxKHcJZAWXcDaKcwTrG7/xhPTAffdOZnTnOpYQPcKmjUvogqY839VQ mwYyo+s51tVrAIe2YcdHhIdBY5SLOhHsDNadpRrBYIa8vzUgtfUH50US7dZuwUu6 WbUiQu5vmDjvGEUa7F6eehCCf9xXkbPJZoE63t/NJYvHSFa1wDcCAwEAAaNhMF8w HQYDVR0OBBYEFOuhT488aYrathCbEjUoztRlSghZMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnKmXwwEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAEcppLLH0xAkWXbBMXDa1hwqOZfKVdoUVDNT G20V3VbDT74R2yFCLWBge9rr7S2LfF/w4Xrl3kyZ2Tn0dYoOmBcqVzH6nCYrniGx apPmSkAexI/bjW55BOMe6CVI9qdKayqm99om/2+R+VSAKaopwOKn9IQ+4itNA0VI 0ZDHbI/pdJClRZ0OPA8DREz7+hZWMNb7S4aAYGdd1fLo0uDKf/siFkUUfkpBtkgr 4Enb1e8NMU0a5abpI25NgURB+OWhfArLB9jFmnlql6TZADLZfw49bEmr4KOddxyk toBmFgu4/uQXcukNWB487iREvEPPIL7A90W+W3ymtlol76SChKKBGexaaNA1JW+O sRxoN5FnXTBhyRm96lZOfvF7SjCQHMCaIeYaQ4ajjPJgxB0EbyyJMeSrjh4yJPEH pKc3AM9MUCxC0LO/qb5oBio8TQqHYnpyvp2CsvPSezPGh/40hxsKTL8GqTxB5m9G g6qpdcDQxM6VtrnTh08nMjaKnfXVJQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/81/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/81/end.crt000066400000000000000000000037241322470703100217110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFmzCCA8+gAwIBAgICAdAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTYwNDE5MDY1NjM4WhcN MjYwNzE5MDY1NjM4WjBmMREwDwYDVQQDDAhTVENfRFNfMTEXMBUGA1UECgwOQ3pl Y2ggUmVwdWJsaWMxKzApBgNVBAsMIlN0YXRlIFByaW50aW5nIFdvcmtzIG9mIFNl Y3VyaXRpZXMxCzAJBgNVBAYTAkNaMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA1nLs9WfyBTzhezgznmSxBUhXPhfX2Nt9PgGv9rZAT5+tK1Y9BQ0Wcshv 77U1cMvBq9usbO6KVM6UxniNPBSDcpKgfsKrNeo7UpK94xSsqClec7c1Rr9dgDfy P5/y+Jl6AzIlxwgcrjwRaKJS8GkAsvgqTYGRm8pMWzC0FBgw4wXr138YeDV5GTBb rpfE2hPJCTMDhwGMWrKk7I9PvxWspDL01yYzNkUGbmdK2InpPYKi/KGtq7tLzcz5 zY/JUBYFlfvcRMBweUE6dSj2GGcEafK63WjexJAdKnFA6OBQR9zIAUlxj87WtgSS bM5v4XYOFzO+gHSUVU/Qhk5o7BpuSwIDAQABo4IBeDCCAXQwHwYDVR0jBBgwFoAU phOLMZIFRA6Q3caO9sRL3041fVAwDgYDVR0PAQH/BAQDAgeAMBoGA1UdIAQTMBEw DwYNKoFLtxgBAQEBiciyazBaBgNVHR8EUzBRMDCgLqAshipodHRwczovL3BrZGRv d25sb2FkMS5pY2FvLmludC9DUkxzL0NaRS5jcmwwHaAboBmGF2h0dHA6Ly9tdmNy LmN6L2NzY2EtY3JsMCsGA1UdEQQkMCKBDmRzX2luZm9Ac3RjLmN6pBAwDjEMMAoG A1UEBwwDQ1pFMFgGA1UdEgRRME+BDG5pbXNAbXZjci5jeoYtaHR0cDovL3d3dy5t dmNyLmN6L2NlcnRpZmlrYXR5LWNzY2EtY3ZjYS5hc3B4pBAwDjEMMAoGA1UEBwwD Q1pFMCsGA1UdEAQkMCKADzIwMTYwNDE5MDY1NjM4WoEPMjAxNjA3MTkyMzU5NTla MBUGB2eBCAEBBgIECjAIAgEAMQMTAVAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4IBgQCC pUonuFzIARVxVOOMD9VHEMhGGQa3FjPmUCIpM3lxL68R7R8JgD+T1yzffeZqrlCn AVk6Ga/TTRiJB+ih4++Pz9qPQRxo2nbmI2qF9CPUPa1vQk086m1asVR8E0wdkoHp ZBZ+MHZPb68nFSoUX19hnWWXfxiIyXzFVwxUn8aHa6tQvi/viNHVGIPkWASKPDrO o5xqLAfTn1CgtE5gIYsdnQ2NW4veQY7Eh9NxFwwafjF9qlwhc+/Ep11zlNmVuOGU tu8sW5uOOh69CD2ZBIfxEutJtGdMMswhOMLMDGRJsfRyiZj3V9IDE1HpusoeoD7C kR5Mm6c+oZnaESUaGaat4c51J/+NSS2OFRr2BhgKHL05d9kUsyGaGYxJiP95DIr3 B5Op5vgGY50Ahds/gUh96NEMTOZhSZLcHc1ZJ/S+4JLHcegPrQPenFKdbjVNd/di K6CK6bPGJmXViyu2mPU7ySTfOYnPrPPuREjwppS4Lz6SJKpJlxGrCspd1m+87yo= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/81/root.crt000066400000000000000000000042441322470703100221240ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGNDCCBGigAwIBAgICAc0wQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMFcxCzAJBgNVBAYT AkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1YmxpYzEdMBsGA1UECwwUTWluaXN0cnkg b2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NTQ0FfQ1owHhcNMTYwMzI0MDc0OTEwWhcN MzEwNjI0MDc0OTEwWjBXMQswCQYDVQQGEwJDWjEXMBUGA1UECgwOQ3plY2ggUmVw dWJsaWMxHTAbBgNVBAsMFE1pbmlzdHJ5IG9mIEludGVyaW9yMRAwDgYDVQQDDAdD U0NBX0NaMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAseIKY10P+zGf DgoU0MbZ3Ux3d8wNN7KRRhBJh2xYnIgqDCTO00Gd8ZffEeT1gq0v8bO0jQYV7THM +zFgC2WsuUq6NAzc6ATLoG3qwd/IOaOI+lQqVfu25ua1WdMJOCK1vk8+MIYBoHQ6 3rdUEULehQxL1lEqMUc33g97sswr0CeCS+05+nvGxyUKSkIDV37nckO9Vnj3Pkd/ avMHWb0mSSvJ70dnmH3FmKA9KfU8AFKc9/4R+wnM94YuE9zC5e2J0/2cc8LYcC3L iRKXeBRx8ZR60Kl2eTtDF/o5lCRUcIlyiQfd/rIZ8PeCIFeQeEyMIy3w1OmMBrTm pySn7a5Hh/X4ZOzfRM7Zy/FgHG2JInqFhO540yA09apll0EQ31UhPoQInTIi/rw1 Q3y9dFdoB4PqWireG1SWyvQqvAZfxTqiLSH46eMHH/g6BfSA4uogXgBKuGk8UilE Wiozq/+dcrOvHSUvhDU+usaUn5w6RQjbRJlVw45lczcd9t5wmKBZAgMBAAGjggGg MIIBnDAdBgNVHQ4EFgQUphOLMZIFRA6Q3caO9sRL3041fVAwDgYDVR0PAQH/BAQD AgEGMBoGA1UdIAQTMBEwDwYNKoFLtxgBAQEBiciyazASBgNVHRMBAf8ECDAGAQH/ AgEAMFgGA1UdEQRRME+BDG5pbXNAbXZjci5jeoYtaHR0cDovL3d3dy5tdmNyLmN6 L2NlcnRpZmlrYXR5LWNzY2EtY3ZjYS5hc3B4pBAwDjEMMAoGA1UEBwwDQ1pFMFgG A1UdEgRRME+BDG5pbXNAbXZjci5jeoYtaHR0cDovL3d3dy5tdmNyLmN6L2NlcnRp ZmlrYXR5LWNzY2EtY3ZjYS5hc3B4pBAwDjEMMAoGA1UEBwwDQ1pFMFoGA1UdHwRT MFEwMKAuoCyGKmh0dHBzOi8vcGtkZG93bmxvYWQxLmljYW8uaW50L0NSTHMvQ1pF LmNybDAdoBugGYYXaHR0cDovL212Y3IuY3ovY3NjYS1jcmwwKwYDVR0QBCQwIoAP MjAxNjAzMjQwNzQ5MTBagQ8yMDIxMDMyNDIzNTk1OVowQQYJKoZIhvcNAQEKMDSg DzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKID AgEgA4IBgQBiN33okPFHvSgFrLJ/XuW2Yd2I/Z9Fsxf6udY9BovENWL+8iK20D1Q 4xW/uKNES8soOVLxKhRDJXu/248vbcZG6hBKNJU37ozYEVvAFvPNKF/Rbab1GnEq zirv6ah9oWQUmObm22lq0XWv0zLcH96JBb8i+AfAwpq52tfFDVihXdSMxKVVtM5F 3aGdIY41DB+Gua4lJVf3kMemRiMXLxVVxocFAqqabPPwt01zEQqV0v0GjZshbYJz VUokiXvi0hdjvYK5XUw3EI0Xv0mUJG1CTWaNz/dISD9MkvbUXPRYEgy3hAEcRZpD JZTKMqMx749WAC8wI7zo/l0wKzkyHnO4OJ5IJgyHafLFDDpwsPTYvFnaBk+OpQbx +4/ahNmj0thMTFmJxNqwWQOfwFv6RB75MjmVXtPxEeOeOYPRuffGO7LcM4JPRI8E mx69S/pKMzdSpRQ+5qyLmnybLVmHwCHhM+RN3RL5jOHmg14ouEgB6cQzXdOefGyo PZaZdmnd2YM= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/82/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/82/end.crt000066400000000000000000000047141322470703100217120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHDzCCBMOgAwIBAgIIZjSK6/NPzgowQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgME8xIzAh BgNVBAMMGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRswGQYDVQQKDBJSaWtz cG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMB4XDTE1MTAyNzEyMzIxNloXDTI0 MDMxOTEyMzIxNlowTzEjMCEGA1UEAwwaU3dlZGlzaCBDb3VudHJ5IFNpZ25pbmcg Q0ExGzAZBgNVBAoMElJpa3Nwb2xpc3N0eXJlbHNlbjELMAkGA1UEBhMCU0UwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC4cSXeMAuvtH1wVcrG3cZu/joz kRWaCwnVM1NcnZpCjfdaVftSvvSlxMZHT0fPpTZswsmCdR4yrHe7d4Z6lj+Y8+Uw rT6qpSRcDDJFW7mDNYj/iELyeBu1mwphaTwsNE2Gr8ZOV1LvMQjxBe4T+kaIUiRZ KZWsKajgo1Ipg9ROg+7eTWp0WE7AZstGfqcxAyU9MrxtqRW4KIKCfIbW6NeyWvVj FTYwFRsU0DjHYwyW2VY+oyDV8KtYNE0FkHH0uI6ygF6ohDntRjqDw2QZrHX8/SPj vEIOxVG3pEK6nWr/9yqTahwJycGsqPGmsLxAXrzF9FZxfWF+W8mT4XJc2GxqaVYQ 00BY9SsrSyT5aXlZAAfNYlBbAX4lO2vY2r4j3qmubkfwjJY5wlxUZVoLlhlRogL1 UR9cFgPrZhAx0PT7lf2ZwohVqKFpyjHmpszFvxQi0Q/QxPjUEfQQIKbAgR7WE01Y L1LALvjDDnI50n7blaHdRuJdiRPxHVWtnvFo9j9YeaRfx4JR6RUCicnrRx2TnLD4 9OsRik82x/iOt4K1xbXtX1oquh/vEu71AXIe069tnPS2roNYoJnqneFwdDw79hsP uCg/Y8GhgpxrGcq7OFue6KZk+FLKOFAOHaTou0c9mcRwX0HzgnsQLwz4RYEGhLq+ dnHdIDzBoBtfHkmVkQIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA4wULiS85liyEcZ Lpjk0/qoQxmsMBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUDjBQuJLz mWLIRxkumOTT+qhDGawwKwYDVR0QBCQwIoAPMjAxNTEwMjcxMjMyMTZagQ8yMDE4 MDQxNDEyMzIxNlowFwYDVR0gBBAwDjAMBgoqhXBUZAkBAwEBMGEGA1UdHwRaMFgw VqBUoFKGUGh0dHA6Ly9jZXJ0LnBvbGlzZW4uc2UvQ1NDQS9TRV9DU0NBXzQxMTVm NDEwNTc5M2RmYjEzMThhZTVhNjgxZWVkZjdlMjc2ODEyN2QuY3JsMA4GA1UdDwEB /wQEAwIBBjA4BgNVHREEMTAvpBAwDjEMMAoGA1UEBwwDU1dFhhtodHRwOi8vY2Vy dC5wb2xpc2VuLnNlL0NTQ0EwOAYDVR0SBDEwL6QQMA4xDDAKBgNVBAcMA1NXRYYb aHR0cDovL2NlcnQucG9saXNlbi5zZS9DU0NBMEEGCSqGSIb3DQEBCjA0oA8wDQYJ YIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCiAwIBIAOC AgEAFLPYUFm8KT6VfrcyeoyszYaf0xZYk8TALErw1kCbS/sJR9x3kkQ6gxL0RNtX Xnc94+SBJQU7Y8jFJiKlPkCLhLVefaaDxRGD0QEkYmGmVHKxMq2oagverzypcz9O K0x39uskzGtL1Fq2y+5TE53+d9ksv/lFZmgMhEb6mKs+mOW1a01+AG9LCv30L1I8 3o0r3Wq5aDksKr8NNQgDvcMfgdK0UZYlhTpoPfrU7tqQR7NHgFmkHWgNd+TtYO+1 GBgqQLK5j/g4VOqq17BaTMvIrL6lEG8o8t7hPGkCeeDdg3pHVm0OwcNjAi2l2jJl D1NUAnkmLV4ZiY7ifLHUuceQOklUCZ0tgSvpeIvebvqdi6H5OLAXRk9nhh57xgIS VNEmupANRQclCgg3aapz359/0c2cgawzdrmRzRwsXZERxya+7QKw5UwQc44P7ouW MQEVuTTC5fgJGvtxU4WkvzJ7VnbeNnvU1k541ZRUGi7iini/lyYNZuUOCAvc0Skd 2aBxAWBsyGJibClD8Gix89qJb5wbC+FIJcjkONf2xKvPCnCYvddNLLifrzDosSuz NUvo96uBvTaFvZf+l414lFFOH473UrosTXljId/onQD9LkyCHrQgcvMI+7/P+Iio g2HOhYr8ST5RmTFvH9JNxJQjJ6xW9Tst3wzdvD53uGY6RCk= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/83/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/83/end.crt000066400000000000000000000026401322470703100217070ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIID+zCCArSgAwIBAgIIImPeveaxBkIwPAYJKoZIhvcNAQEKMC+gDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFADBPMSMwIQYDVQQD ExpTd2VkaXNoIENvdW50cnkgU2lnbmluZyBDQTEbMBkGA1UEChMSUmlrc3BvbGlz c3R5cmVsc2VuMQswCQYDVQQGEwJTRTAeFw0wNTA5MjYxOTAzMDJaFw0yMTA5MjIx OTEzMDJaME8xIzAhBgNVBAMTGlN3ZWRpc2ggQ291bnRyeSBTaWduaW5nIENBMRsw GQYDVQQKExJSaWtzcG9saXNzdHlyZWxzZW4xCzAJBgNVBAYTAlNFMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnT3OKLYsTrHJRLUbKeoZCuABgIYSBvHy MvaKlwvJ18phNsW2RTVKY1MgT10/QuMSjVghPLnb1axJ1exsbUEP2x5EfsLFSi8a FbMVPJxg6933+frjOViI2Zs/yf6NrO9qTqMjBYS2Ht9aH6UqXfxYW3Wvof3Kwihn 0rCPz9VQUObLcym5Eb41Ry3bhCL+1W6eyQJ2Dk5JXPBP3EbNKJVedwosWE3nl+Ib vsKOnNnrzYZBVZEbn8puUAhSJ39WPeCN9AH5RoWf2C3fu/hmqYmX9cZFcH3k/zvx rn50xcJs7WWla4bHgO1F95uVvbjF5lXAmMKC45nN8kWuXk5Q7/zmIQIDAQABo30w ezASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU OtRdqXuSyO2ch41v7Arfw8gEih8wHwYDVR0jBBgwFoAUOtRdqXuSyO2ch41v7Arf w8gEih8wFQYDVR0gBA4wDDAKBggqhXBUCgEBATA8BgkqhkiG9w0BAQowL6APMA0G CWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAA4IBAQCS lwvA1699I6JNKrqK4Rbr7WTLWxCmJ0ZZ8xq6hqyEsh+IaR72frqRjd0dWjs2kMEB /Q8zPoFm7Gp0vh+IYs97q9Y2iuOucmU1toR5PWSDGTm6x05H7mYrCZGUkv3SxjYd yQg2iDaTOYLKYlvwLrMht5l6DewuPfU3u4iSoOSLlFPFy+8wHhBggonuMtPauJta rylS4F+e5mF2hMb9WYQ1ixHk+S5w5u5/26mzPR4FyHwF4YQWTSsTdDH9NIv6PSvG FOpMbekwwyO1GyqAjSAJsFqAlmAXO0ZsZ2KBxCubqdyILv7ii2/HLK3OqbwOSe0k iyuOcEEn7cNtfA0IwPN6 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/84/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/84/end.crt000066400000000000000000000050461322470703100217130ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHUjCCBQagAwIBAgIIBU9VRtdAbrwwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMIGEMTUw MwYDVQQDEyxHcmFuZC1EdWNoeSBvZiBMdXhlbWJvdXJnIENvdW50cnkgU2lnbmlu ZyBDQTE+MDwGA1UEChM1R3JhbmQtRHVjaHkgb2YgTHV4ZW1ib3VyZyBNaW5pc3Ry eSBvZiBGb3JlaWduIEFmZmFpcnMxCzAJBgNVBAYTAkxVMB4XDTE0MDMxMjEwNDcz MVoXDTIyMDYwMzEwNDczMVowgYQxNTAzBgNVBAMTLEdyYW5kLUR1Y2h5IG9mIEx1 eGVtYm91cmcgQ291bnRyeSBTaWduaW5nIENBMT4wPAYDVQQKEzVHcmFuZC1EdWNo eSBvZiBMdXhlbWJvdXJnIE1pbmlzdHJ5IG9mIEZvcmVpZ24gQWZmYWlyczELMAkG A1UEBhMCTFUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDN2bxAe2Y5 D9GLcHMs/UlHDbKiw+x0oJ/QefRazv4Vh9jx80o8CG7GDo16ARGw4RP3KRzjKm9m 2ug4sLDHrQXqLxR+LjKJJnwvJJZbbG53PKaE07bLs8/zOd9iKezvig8cZDJ5CSka Zg4oxW0N6V6KYMvL0MovjCjCIwcBugaa46ad9HjUKdtnyu5WnduTEdru0rm3omHm X5mUdN/JaRWnbhHbnW0VlEvVB/aN0Wx8mbAFkMXzqrZVUTn3o+urjx9NticdsTuQ 6f9EVq7OVxb1Erzmnw4HChfDx2bmSIknVAzJQSfaLVOOaxXD7+8g+DBLgqleXMrn OTnKQ8zutprFWE2sT8muMJ00WIUIKXhCGyN4UyZmxNVmU9PIVPiJ2z0UDSmxVIL7 ENzi0eyaGJvQT01U8l5IzDIDXqwZd97tgQ4lq/LjpXOq3dePXHkKM17dr5dvj3K2 kXEaWimNXAFoEitDAkJTtnS7Xu5xiBiG3e8sQy/Zi4owSgZWhj4pjIAtl4WuCW33 2+f78QhQNBVSGZaS/Kgt4lHsc2IuuP+akZlbV1RltZVOL3LW6lTZ4oKYGT2p9ExQ qJwgHl2C1Ga31KUXbA3Pl0j54X3cv9A4720z9fVeAwLtyFCq7BfPC3hZw/4asBCy HNJ+kED0k8PW9oGE1Yy0dfw4rc2nLdBB2wIDAQABo4IBXDCCAVgwQQYIKwYBBQUH AQEENTAzMDEGCCsGAQUFBzAChiVodHRwOi8vY2EuR0RMZVJQLmx1eHRydXN0Lmx1 L0NTQ0EuY3J0MB0GA1UdDgQWBBRv0Yag4M+Zgll2Vp03LOgnqH+n4TASBgNVHRMB Af8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFG/RhqDgz5mCWXZWnTcs6Ceof6fhMHYG A1UdIARvMG0wawYEVR0gADBjMBUGCCsGAQUFBwICMAkMB0lkLXF0LTEwMwYIKwYB BQUHAgEWJ2h0dHA6Ly9yZXBvc2l0b3J5LkdETGVSUC5sdXh0cnVzdC5sdS9DUDAV BggrBgEFBQcCAjAJDAdJZC1xdC0yMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9j cmwuR0RMZVJQLmx1eHRydXN0Lmx1L0NTQ0EuY3JsMA4GA1UdDwEB/wQEAwIBBjBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggIBAEsOtQ1UQEkDLYHnwBBdtkM6Eq+pXcYIaswm FPYs0g9MTTSbjh74vPEzeW7+Bgc8QpyMffyz87PxK2aV1E+MmiNqSQg5no60Azq5 mCNMdSpJ6prj+EkxzuLJQtjC+O3HodqUDieZjuU134vaYxnDjxIMOt2YDLtTv4iy zi/xWzq7G3imblsU4TanYuzghAeDMr1VQUc5Mn9r33mx6aakmv8sB8VFir+79LfA pZIORvBLGkr6ymnzCM/nyzLB5R/9otq+GUYs7nAHpqkb8ANaOTi51SK65lj/UfC3 LrBkaq+cdzzvgZOodVwtEKhqnlKZevJ7Z8PLHV0cQguT1dzWV5Rq4NsiRoFeiRSJ LbIJvttH6HlCMTfunmUFdaXSsGPbnebmdVIwkOea+S9QYs9wZb2j1+mULv6LdoVg a89IeTwx0hFWUJOzQynNHvFSOTKlFR3MANuF5nruTv/FstSax3sLO3TbVP4+HhOs DIDSZk6EF/Wivs+L6KIMUpwMWqI2CV+o9G58PP+SK0xeF11hlI3lG4NdfiUXdC10 f8husKOEbxX/44KfSdZGKMv+cfiGXvCnNyBxr7sENbD7M2vALy+rx8bh8+4TKKuZ U7lZLQh3YqVv/Ko4dGvHLES4SPL3tLggigIM5moa1+HYRfOKbd7S88Nvze3CW4k4 G0BLUzUY -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/85/000077500000000000000000000000001322470703100204275ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/85/end.crt000066400000000000000000000033451322470703100217140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE6TCCAx2gAwIBAgIEAQAABDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATAwXzEUMBIGA1UE AwwLQ1NDQSBTZXJiaWExHTAbBgNVBAsMFE1pbmlzdHJ5IG9mIEludGVyaW9yMRsw GQYDVQQKDBJSZXB1YmxpYyBvZiBTZXJiaWExCzAJBgNVBAYTAlJTMB4XDTA4MTAz MDExMDAwMFoXDTI0MDEzMDExMDAwMFowXzEUMBIGA1UEAwwLQ1NDQSBTZXJiaWEx HTAbBgNVBAsMFE1pbmlzdHJ5IG9mIEludGVyaW9yMRswGQYDVQQKDBJSZXB1Ymxp YyBvZiBTZXJiaWExCzAJBgNVBAYTAlJTMIIBojANBgkqhkiG9w0BAQEFAAOCAY8A MIIBigKCAYEAsZxHWknuRqDDgHEJlBVVHGv5UDEAYcu7VSdbvnqJ8OxoOBM0QP5f YZZpWxtXY0dy4ny9eZiQXVVFw3lKzgWnSYRqcaSkaYhgrjsF71S701U68lr/wPEX cnqb4UP7M6ZF2TJkDlFdZRLFAZ2Xm/BVCClBvikmMfwHHgxYamP+o/oHB0xzGfLL 1xC+R0MZzjCn4WaduVYLp05+UsmDFANxmm3Q6UNJoR5aH6ajRux5GaTXu3JYSOAD Dai/SA/a+ZxJVuzNO98JaLgvzw7Cvr9KyoOD2nPMBGSjSeLfvevX9tMc7XYFoS7o khGqn8VQJz6xYrmQIwbAJlz5os+OYJqVbE7W1oqSJfeTTkQy6eE+rq9fIKMX/nCL ujN5Tmj87cm2x4jqZD3u/+4PKXHGmNjCVQVe6KqcKUg6C7tWG6lhRIenIVT1AcEu JQCSzzI/RYYcSzfj2yQYbz8cQtO6Gr3/rP5BB2BSWmLQxiAQ3IUN8h9FJVdQLxzj QM7f0Rz7AYFfAgMBAAGjRTBDMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/ BAQDAgEGMB0GA1UdDgQWBBR/tJ/Vzw/j4SyudCzJLiBc+SgOajBBBgkqhkiG9w0B AQowNKAPMA0GCWCGSAFlAwQCAgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQC AgUAogMCATADggGBAHy1/DjTFSl/rdNB39lcV21YUHKzXBq9u1oB0dXIncQ503pI 6u3mWf5vSO7cFrsBO5azjPcw4ShVBqw+5GyT9kcBBskpBUaC0rSi1SUfJMP2/1AK KG6cc/P6FvEF9uk+LRXK5i1wBHz47INEyzC6G5KTTKNLWbdbKdHX73MIwlZ5vrbb /6n6P8xQmfcFhLgMU21bpTdoRnL+2xL9LBhMRqai/FWq9PdNjVtCNUEQhdvJTZ0x 2yZYPOe0ZPKeNeMhAeEAFfyn+8ctnxsIoyAkN+aSNV7cKH09VFa7js/+cuEQN9nj RJeb9JD+Q7sUEZFMFPQDwc2D2DYUO5vwBZcGHIlfIdcsXVgb5PqC7pl4w+qqI2tg h3q1P+YU5Od5Btt8m7Soou15HqI9w+TrApMQesawzJBUUZy7o3lq5a+zrpXITVL5 xFiXUKUzji/CfILkQxBdk7t1zlTv4lUtq4MRGgGnuNr/WYbSykpKJkcwp0s7UbZo U4b17jPsOSvCkbjZzQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/86/000077500000000000000000000000001322470703100204305ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/86/end.crt000066400000000000000000000040251322470703100217110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFyzCCA3+gAwIBAgIESj6zeDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwNTELMAkGA1UE BhMCSFIxDzANBgNVBAoMBk1VUCBSSDEVMBMGA1UEAwwMQ1NDQS1Dcm9hdGlhMB4X DTEzMDQyOTEwMTY1MFoXDTI4MDQyOTEwNDY1MFowNTELMAkGA1UEBhMCSFIxDzAN BgNVBAoMBk1VUCBSSDEVMBMGA1UEAwwMQ1NDQS1Dcm9hdGlhMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEA2wqjVlsgZX6sLWzX1PUvz7/uTSj1ZGfalLpP +J0SsBrPV88av7IjyiM+OJHhvgFvsS1M4KCIC5N2qZOEj1wMkQ1IUjKtdXTPsoY5 1gX6vmEYQbyrLqLAsZSfdKJKazWANiYfGZAmUqBx9nYT2o1F03YYA+Z8TNglGS/y YsDoPWGSmbFhiAoyzspV3KCKehYpAFrZ+4rKNHht5EmLLo4Ge1DcbiGFi14Q8iTJ BxDony3vUMO7ih1fRa1GD07CFfi8BJlZ1IY9XL6BcWHLS4RpEmueK6ACK5ppo0EL VNNTLqtg+8KxyMC2Ps4RoBd0XP/1eRygCzqX7y5LlZuLbrO/AScE3W7BsQUsl3z4 iE5H1ET2lxVqqjvCcYtvFGYpNzVwCrZhdvtDb4kKs/lewMjPZttDZSrzqUIh7mtt 3NKStcAeTwu8dOMATXmkf2p7yMjNXoWPCLwmd2wAsA+880qqo0wKA2/GftVeFqNX dV+P+Oti0sLQuEZWc6HuKw6rEWI8ncqGoAB1JGFjLFhi748E7mxEfMSCt57rJXeZ d2Tua0cmMEk/Or/EbXvEbI+WjZtG9oADqlJM6QQtJ6jnzxiJZEc/rpZ4ea3QPeuR GZpz2mPNFQXuYE7pUc9/764y4SvcajRT/b98z9Vm1DXsjMY+vnPJcUZLHUrO4usu FJjHLXcCAwEAAaN7MHkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMC AQYwKwYDVR0QBCQwIoAPMjAxMzA0MjkxMDE2NTBagQ8yMDE3MDEyODA0NDY1MFow EwYDVR0jBAwwCoAIRB/IlE8eh18wEQYDVR0OBAoECEQfyJRPHodfMEEGCSqGSIb3 DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUD BAIBBQCiAwIBIAOCAgEAVJviBZ6P4CnXxsnmsCg5DyLxlMES9VYpvW2cVT1RdZIF n3LucJVP2G5IzbRyNh1IjZmAzdEeYKbabqxvh7tkVIo2rCEVpy+TH5gB0s+K1LBl YwNWWVxZcqrcZzUwXp0wGv3A5nGs2vRr7up6yLChOyJRgoWJulbb1FYLy7z5FQO3 ICezhP3q1TI6Ri1pTKX0rnrgMlHinjZ98AkJMPHz3E7DRq6oCjPfde7kdKLScGJY 7RmWZFhRCt8OtlqprMMZuP5pztVI2vhcXRvgt5cFwQ8JFNPszwyj3U1jJ53MEUAN pgjNr45AqgjQ7dfrtI7LcDAeN39jAs2QU8xpQewJ/ETtnKP9YgEoxSEs2IYcS1w2 L8fTD1zakonAwl4JlX//o2mIqAPKvRICAG6yMeMBzTaXzBDDM5xyeaaHSj+fsF9U 87/TDNMVig2fTvk0uxd4Vz/Io0k7KMrLsdYvATGflNxXnQN/khtJqHZ8L/RiJbEC lnN6lm7aK5ViSIpGign9YyR6YFox8Je/UYfLZDT4WqeuBcF3sD63rsQE2OeJ4D+w 61L4JNIwsscixKpCXUEta1CAracC7WlkbSeFXbtI7SDz7FeHpqWr52R8vjCCUCp9 x4MnwRLaKcmGSPD8Kq1E7W8RZSz93PRTv9N653Li9ikLMaAbrWDxN3sx6AD0FDI= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/87/000077500000000000000000000000001322470703100204315ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/87/end.crt000066400000000000000000000034151322470703100217140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFBzCCAzugAwIBAgIEAQAAATBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATAwbjEYMBYGA1UE AwwPQ1NDQSBUYWppa2lzdGFuMSQwIgYDVQQLDBtNaW5pc3RyeSBvZiBGb3JlaWdu IEFmZmFpcnMxHzAdBgNVBAoMFlJlcHVibGljIG9mIFRhamlraXN0YW4xCzAJBgNV BAYTAlRKMB4XDTEwMDEzMDEzNDkyMloXDTI1MDQzMDEzNDkyMlowbjEYMBYGA1UE AwwPQ1NDQSBUYWppa2lzdGFuMSQwIgYDVQQLDBtNaW5pc3RyeSBvZiBGb3JlaWdu IEFmZmFpcnMxHzAdBgNVBAoMFlJlcHVibGljIG9mIFRhamlraXN0YW4xCzAJBgNV BAYTAlRKMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAohbH2ngtcEVo gofwUKMo0ZiekFXjkuUeXfKNMnZ2ESC8IZhGO2wK1EjxsW0of0BWGT+e3Of0gyTf kXbdjWVpXm/8txWj+V1p0JGfac0bfWnf+AKHbMWtgqqVxvVPaC5ESFIF9uVRlWrx mJHQbs1l9zL2mhfRiDf8uU8y5tGFNbCLqulIyxh5b5KJU0DakZz/kIs5CC0v71DT q4XsgyAN+TZbDB39bzZPO7qRjykLs5m81qfigWilQOZPbpIH2ypvN9ziFOHk6aay SAK23e8EJhWSLLcvH7/f6PXbcSOmiJ6MAIFhPfWrq0fYDTYqWqa6K/7R1ZJS/0Ab z3/bsRhT91/wdZi0O1CsQhjN9WcEoMS2UOzn+AMiTyoOBDg4gDUuB/qFhBm5OqFZ QH9Ugi3/WJa2CJZP9SQG7tPHfnnNZhGFu9eAejMb4uto6LO1YUYDHpGtW9JcvbwE dN+lCavygLkE1ShLbj6a5docnB3dOQkPTFktA7xxAEvDU7Q6n6gFAgMBAAGjRTBD MBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQi rKl79kH4sIVWUEy6Y+7KURqkETBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATADggGBAI6XPDfN 3WdrqUvwiBP23o4vO7AO6WWSJI5JFnl0lWPewCJNPfTA0Mq13+3Sri6UsA6mfrjo MKOkM6VAKLmKqKEi0CqyMMAl9v5fd3fZOiieeUov/wM4qei70WJo7KbQSgSfrWM8 qBRmKk1aK9UuRxXbg0ORZLY9py1rt9RuptHzUYOj19Iaj2Ms5UmziDSSL8PEW7bC KVf7dztYLZw+c0jb0b797P0ZERZpZs6DULn7XFs5OpUiTwQjy0MG/1AYLstcQTLY 0NYxWzLY7Xh1SkP/6kH+lkR4t8IyUyqT8/A/96NCb85i14qDq1K2Ju8I2+8mj+vj 7jG4YcDRsiTCQfbqHOr0AcWuQ1FWg8pITHXQN1ZHadllkIcIzNrxQVD8tZ5M39wC r7n8MKUShr7e4hIgbwxamEayPSL9sXF/e2pSvPDOc86dZ6AaQZZGK/s7F4cLClrr dyiNoW8LUDRZUqV7O4pB2i9gEyLbVk3zL0wr3qpj/x+xQdLXVLErV1YL8w== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/88/000077500000000000000000000000001322470703100204325ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/88/end.crt000066400000000000000000000042031322470703100217110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGGzCCA8+gAwIBAgIBATBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMB4XDTA2MDIxNDAyMjI1MloXDTIyMDIxNDAyMjI1MlowbjELMAkGA1UEBhMC SlAxHDAaBgNVBAoME0phcGFuZXNlIEdvdmVybm1lbnQxKDAmBgNVBAsMH1RoZSBN aW5pc3RyeSBvZiBGb3JlaWduIEFmZmFpcnMxFzAVBgNVBAMMDmUtcGFzc3BvcnRD U0NBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAm61nE843Wf3ZHahe Kd17tsvpzt3cFnGYVy3SPDYiBC2QfoJrtOIcfw3O6sPXsK7gWR5KoGnAXfZw3RVo JPJHgZtjjzNib5b2JZmuoU+d/0wvUrmqVC2w3Mp6QGvG81/0SgX29fkhpmhxU630 pzZmC/KeEZ4im3sMJ2saQxWNXZd91nON7HgnoHBetHNsV20EKYKGNrtoBPTkQpdG jhdHI34KMz9xlGuiWJZqB0JZjjzGvsYPdbAYK1EdvEGbh1nf7QIZBgL71SGHYycw GXNHNFZ83RBl/yltUUWfW7LeW4hr/iw5YsR1+a1aS4xKkOjPX5sKWypiK7cfJ4OF 2pUwgnZwwT1yjjOQpZKn+CvBkBZvQ1w1Th9p8TjXLr/8HH0NBo0zlOCdjTFODXJa RUeQrE6lX9zYLhsaAjfgcPjogOIqFK0dBZwhxYC0di9/xJoB29CzImayTD4JtqR3 yFMXaxvfQFapuJXsg0iV4kx//LaHX9hgdg0aZ8tdee352V5ALmUGkuLar4xoN/ai WBg6nQzT9tlMVRv9nR6gbAOly4u+TmoUSatiuTy30n2HbDVKc2gk2irK8uMBiTGb wgQb8WNpLxylPz4CflQA8RwG8yJNQ5qldg9L/bsqDgmyecVjYpgW/N1cAtdb0Irx 6yFO0l7wrRVx1pThq0uTLfBC4yMCAwEAAaNcMFowHQYDVR0OBBYEFGJbhox42j4x leg5Iv51LUB1zqCQMA4GA1UdDwEB/wQEAwIBBjAYBgNVHSAEETAPMA0GCyqDCIaP fgYFAQEBMA8GA1UdEwEB/wQFMAMBAf8wQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQAR 6zyDF4lstYNehyCCFEUqRw2UyVTZTVAql1sVv5MmvbDonNx8hUBCQvxeTVqQYY3s UcXSWuJkd7TSM7RBeIwYggxruHBiQ+WU8GZxeCEPKCrxKyxI0CprDa/rN1wWO5bJ wfBihF7JkehR1rFjeG/GoVeguJXjCxGKwtj8mJdsH6aQ6tv+YPqqaACldxobBmkT Vmqx4BailVEQx0bzZWctXblN1FxLYclPGXfellntWuWEV8jzd6Jz8wan3SJ+mSKC loIaRUD4belfVCLSi8RSwv70O2D5ZOfGKC/mPZY1o0KVomArxtKwYFpRZZBzWHm1 QaudneaHIOMM7Sr65bcwN1TZ5ZQk46XBa4QwLCBIZECih0wr6NeUI9sDzs89MYMz yBij853vWpaIp6mEoYJe2H87XUkbzmUD/gDWbhpOKiNPAqWtn6pqvc2/29DIBirU ZN8Z4q/TKs96UumHRsp5e7pqE5UXqT1SDHg90phLD2qyHQhEFdfZAvOB1Y0zKYDV 7ZgBmxWyS/nvAsEj0nQQZgoozexZsnf7hte1sXAKPIt4Tap/52VW+N+G6HZY1YIa gk1o44SWnI9Trge3bpE5Re0i+43RK8ELZ2PsBHWr3CjzRxKAPacNxf5XP8O47D+0 bPfKJZ5EyZcHkouGtpvWuqLw18q98y1pd1u4LnmKzQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/89/000077500000000000000000000000001322470703100204335ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/89/end.crt000066400000000000000000000043451322470703100217210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGZTCCBBmgAwIBAgIETQDrlDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AQUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwdTELMAkGA1UE BhMCS04xPDA6BgNVBAoTM0dvdmVybm1lbnQgb2YgU3QuIENocmlzdG9waGVyIChT dC4gS2l0dHMpIGFuZCBOZXZpczEYMBYGA1UECxMPUGFzc3BvcnQgT2ZmaWNlMQ4w DAYDVQQDEwVDU0NBMTAeFw0xMDEyMDkxNDE1NDBaFw0yNTEyMDkxNDQ1NDBaMHUx CzAJBgNVBAYTAktOMTwwOgYDVQQKEzNHb3Zlcm5tZW50IG9mIFN0LiBDaHJpc3Rv cGhlciAoU3QuIEtpdHRzKSBhbmQgTmV2aXMxGDAWBgNVBAsTD1Bhc3Nwb3J0IE9m ZmljZTEOMAwGA1UEAxMFQ1NDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK AoICAQDE6hsUtes/CtcmBQDzktGftKnXa1PnuTSR8woZqCHh3fTwgzAq0HzGB3qr TP7vnI7h4QWgnG7331DzC/fiv/g4V34Fw7p+hy4o7LWIbFm7YSmu/zRrYNIgcW/h bTuLeQGnlL/F+p5OKPYKqinTebghNuFRP+kmrjloQJrSlz4xIAzyEd39J158G+ep t8/xM/g1oLBcPCkQbOIY+/kzuHWqfB1QM9Ebts8W1bHhnHQwj57Ap8NmauUSlFPd TB0RlC8RcCyufHxnn2Y5g7evXmWJzqUdZbBXosp0hSJjbl6caz+tqsvxgVG5fqcB Z0BbYvpo463DOjOP2pogk+wNQ16vD5kBC4VxFm1GbOua6Wqk0tGmTC73jmcJKMX+ YBhhvrcZis96TXAVbldz//kITf0Xv78BKim7Yk3AKTzdBiRJM9ua3bQ0k22aYi/J uBsCYk9pGGec6Sl+Lbpz32L2IfstJh6lvyjUaxLhm/67JyK3DIWHukuuMvKxlLgt Z1qjX98MiXlTD8X1sED7+Y2SCxpChgkvu6fwBdArwZ/0Zn9Pj0FEl9f+SnYwtjRI tTLIxejcf1UO0SRfYx965dTK+H2Mhw13Ncdw3LPlq7fPY7qHPYPFlQpxecKkfClN FQ5al2SEEV7Rq/YGfJPcLsVLFWtQIdeK/P+3hNi15PGjKpzt7wIDAQABo4GUMIGR MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1UdEAQkMCKA DzIwMTAxMjA5MTQxNTQwWoEPMjAxNDA5MDkwODQ1NDBaMB8GA1UdIwQYMBaAFBGA o1EK+CmDPdLY8G7BliztJF6YMB0GA1UdDgQWBBQRgKNRCvgpgz3S2PBuwZYs7SRe mDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEI MA0GCWCGSAFlAwQCAQUAogMCASADggIBADNI/obDk1PSy+yeEdsbcv0hum7nrY7Q r6YUUL030qxl3/GPnV7hIovOEYwbpjAX34o2vD19oBiUuP8LCMeI/UdDaWZdBtFA ZzfLqxvOMDQ9FnepBk9RWKUtFcf+MqlgneAtTgVrLYVRwVvwlV6mOVtSdgmQHPGn qHwFv2x+6gGzO/O+skRw/SjjEgTuxKUD0JaT6q3bjDIgXlTOLMDqO2OtfD7nl68n UksHdczVsecV+XcZszVXEj8F53lmWXSFduLhLRbqkC9jcMTmElOR0UnnbSRtdDjL Xr2HLVGHAE1Grzm4cTFTq0HAcJGFzxlkXGMDduLElO9QsqnZnNRtyUF4r0SaqANl Q4P5rowoqOavCIfhphZBxK5Dak/zuobxmL6jkA3AfZCZHw884qHW735auMJJ5pJc MZ1xV4GvngehSYSsSsUgD73UokW72TDI9jT8AQVJX2epteqLqmvC0uRd/DXoMFAv MiwMr4fMbjcnK7XmjrQA/HtKFji0munVGZHUg6Fvr6/yXho4r5YCI8lyGk3grvu8 QDsmQXw1RA/WkpvMMODRgy1nLGMNeeKg3a9hKjHvFFTGCPSB+RxK7xmY/U/z5T37 JEUke7dUJd8Rn0jdcaJgzETxEOXGcLX3VZFfwgDmVdJIXkahHFsrtD2RyLrcG7p5 CPkoA02OgI15 -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/90/000077500000000000000000000000001322470703100204235ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/90/end.crt000066400000000000000000000042341322470703100217060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGLjCCA+agAwIBAgIBDDA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBhzE7MDkGA1UEAxMyQ2hp bmEgUGFzc3BvcnQgQ291bnRyeSBTaWduaW5nIENlcnRpZmljYXRlIChNYWNhbykx EjAQBgNVBAoTCU1hY2FvIFNBUjEnMCUGA1UECxMeSWRlbnRpZmljYXRpb24gU2Vy dmljZXMgQnVyZWF1MQswCQYDVQQGEwJDTjAeFw0wOTAxMTIxNjAwMDFaFw0yOTAx MTIxNjAwMDFaMIGHMTswOQYDVQQDEzJDaGluYSBQYXNzcG9ydCBDb3VudHJ5IFNp Z25pbmcgQ2VydGlmaWNhdGUgKE1hY2FvKTESMBAGA1UEChMJTWFjYW8gU0FSMScw JQYDVQQLEx5JZGVudGlmaWNhdGlvbiBTZXJ2aWNlcyBCdXJlYXUxCzAJBgNVBAYT AkNOMIICIDANBgkqhkiG9w0BAQEFAAOCAg0AMIICCAKCAgEAiGZfE+LBBbhrOYPR CrFFRW+QLOm85P486V+dwuoVL7Sv7jGaVAfOW5OFQfkxjCV5d9xET1KTSpfKUj0n w431MR291It8miSCY/IGekamwsfJ7GMZU8KuAI296TPRhkEnWH3svUPmWbIefB2T gWXK0Yq0TtTtnopKNgkUdxaVcudbQQIJfQMljgrPWAp7CA2wNximJ/6U3D+MJFCI rHppbzk54C/inj9M5/QMZ3pwRbMtwmeTUToaKueY5HrcTXdSDCY1S6SKZYDvp5rc 0tt9SI+DAI8PcwH5yInLUDKf+KvMb/PcLUJy47AGlg0RYUUa9/Z1STo6IqY9dR3q UIHq932fhsuaTH2JiPHcHeQmQyDco0xvBEpmBYMU/2Xowc2uXOX5R/56HzKU4ZvJ HeK9tNr8OFIhRKdvDmuwfaYqdQB1xvWwKv8F0tLVB1kbY/zCf5vUEmEjN9XA+ZOj c4Ic/QSvkbHNx1RQHX+5ZB7kWwQTwAIH4qiDPHMhItC0gR0fuKrngMTf2GjMn/tF bMu2gNnei81M99HOtTV30Cm+qAfGkH8tvLr6QH6JnrV40lfqRWWCWGy2yMJm4vDh b3K846nUXISlSG2YQPI8oSarU0twVfOj6oeLwZGm+wqfvwGhTl+nwnJsB1IBuG4w CKRtLsd+qv8ffFS6w70uw8pagBECAQOjRTBDMB0GA1UdDgQWBBSEQ1MZ3sS1I27q xnIOgsIlAFDWvjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADA9 BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglg hkgBZQMEAgGiAwIBIAOCAgEAO27lpZDiFEPzUDpTdoKxx5iUl7ZCIjp+56P6jo0S RnmTETDuKDseNiXk7SbW/1HqidOM28pBOICUZZ+alhXAdHB66oQiFnISFAggbj9Q y3j/RTk6IzHUTJihOYcVWG3IFrxgTY/+/R1T3rVEOWHdb+J4tI6z6UND2TXw5idq jYZHH1jKAiCPCyR/4s+xvOXCdFUfTajOPG4w6J1v5ShpiqZcxlaUnU1Q8p41HtiT wsgbX5HU6n+uUydjsY5C14efRLc5g+2eVG5eqdldhnQCyK1y9rLFX84SBWPzF4QE QAX3gTKjt2dKIqutDYYRbtBWKD1AJCjbcRYSylS/6qen7I9zD7VxAn2pxGuA49ri qXnHFtdyd6ifXgoy5TUctmLpBKqna4eSyNUx6l+kxC0990m7mY2jS17OFkpZqC+/ bi6M4G1TeYfgXDHYwirrAUxKtsNTml9OsSDv+KYmF8tNR0OSTs1ROrL2dKyykv9r f80IpXPTgjbgDaoSItwWV/b1e1qeePnO/T7eprg1XoMdwjjCU1FT/toUQwqpdVJk Y4e2622WZJCgG2rqSbPfBVn3s1/EjLHR2xleOvMH4I92fNex86OgHucE3U5Qssnk A9jNfn+3SqiavAIcxvogsGa0bGqLVA2tK+dkUEfVHuaTBJCMRFpic7wanssQPTOZ DLQ= -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/91/000077500000000000000000000000001322470703100204245ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/91/end.crt000066400000000000000000000050461322470703100217110ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHUjCCBQagAwIBAgIID3ZykzVa6kgwQQYJKoZIhvcNAQEKMDSgDzANBglghkgB ZQMEAgEFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgEgMIGEMTUw MwYDVQQDEyxHcmFuZC1EdWNoeSBvZiBMdXhlbWJvdXJnIENvdW50cnkgU2lnbmlu ZyBDQTE+MDwGA1UEChM1R3JhbmQtRHVjaHkgb2YgTHV4ZW1ib3VyZyBNaW5pc3Ry eSBvZiBGb3JlaWduIEFmZmFpcnMxCzAJBgNVBAYTAkxVMB4XDTExMDMyOTEwMDAx OVoXDTE5MDYyMDEwMDAxOVowgYQxNTAzBgNVBAMTLEdyYW5kLUR1Y2h5IG9mIEx1 eGVtYm91cmcgQ291bnRyeSBTaWduaW5nIENBMT4wPAYDVQQKEzVHcmFuZC1EdWNo eSBvZiBMdXhlbWJvdXJnIE1pbmlzdHJ5IG9mIEZvcmVpZ24gQWZmYWlyczELMAkG A1UEBhMCTFUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDwieSrUE1F SL1xvHG7PAYVN2L8eskwu0To4IzdlbaU3+h3gcmRziQvPZb7OvpR8GPTu2o229nB /5c4zjhleIvSvxVSxDx+dCboLE1F1S6wDitINjM4AYwnYqnbOo3vvkg4HK/aVKwb EGoEdeQvljGSgru6gIylZ4MWmXWA3VRlg2EcKgI+FvHlu47vg+Mhn1LzXevYvLVe J5IKVDGwW6SNIQDY0P3cu6DmBaImDp3B3uBrTI4r8Jljyi03shNLit0KFlDEjaTT V9qlXOfH01Wd/gkeSQwYEe3I/64PSo/aKKcOc45pRQITudM2nM2G/MYVcGkFI6pi GCtZWaOBihGO3ORah7QffbnYbhy3VJ3NBo4ZAqyGzns4ClXuS/bqif2hvmLCP49Y D8m/D9swyu4umH//rj4O83TryphiRLhJzqvy5gIPpmteP3kOz+wJXEvNQHakwuQq WRG0at3KPu+G0J29M/Cfr4JkB4L/Da3dzJHRdsIt50SMpLw57Qc0egtrv6X+MWAA x2RkyeqJ6wEDw+2q+G0As/u2/NgkzgiwBSNqiz/PvObysZCQ/mYD0Wx2r7B7E2lQ b6gJ1++gYrMYv2eU3toYyVvLPaFJSmePtrYzDMfDIZaK//0DOpuuu8f2Yku8lc1y 9Mw2OTP6Bor65Dtdyg4SBq1oFUhzK9rBxwIDAQABo4IBXDCCAVgwQQYIKwYBBQUH AQEENTAzMDEGCCsGAQUFBzAChiVodHRwOi8vY2EuR0RMZVJQLmx1eHRydXN0Lmx1 L0NTQ0EuY3J0MB0GA1UdDgQWBBS5+/R79wVs8f2BH0/lvta3oj6GxTASBgNVHRMB Af8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFLn79Hv3BWzx/YEfT+W+1reiPobFMHYG A1UdIARvMG0wawYEVR0gADBjMBUGCCsGAQUFBwICMAkMB0lkLXF0LTEwMwYIKwYB BQUHAgEWJ2h0dHA6Ly9yZXBvc2l0b3J5LkdETGVSUC5sdXh0cnVzdC5sdS9DUDAV BggrBgEFBQcCAjAJDAdJZC1xdC0yMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9j cmwuR0RMZVJQLmx1eHRydXN0Lmx1L0NTQ0EuY3JsMA4GA1UdDwEB/wQEAwIBBjBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggIBAIgnvwZPDmwtwBl0IIq74BISUlGSoQSQT9Ji Cz0iQexureeFxgTvDZCSHUkktFwXdQMNdzvPMvmpkvhuCI3UP1RAQSuXIRifMt7L GI151F/DEHL3zfEhtUVFzn3k+JBtEQM/gFUoCFTOnWy9xIFHSmcMxTqSzGk2Cdtt 5EoQkOvna7D7YkQm4UwwO5kYZkzs59gQBvyIWQrMkAKR+1wOewPo+gX0A6T1ASJf M45fg8ADtbEocUVAmMSiwMEnHlLhm1flJMk+E1dnBBgvSngiW0ibchpVk7TYju7l MnvhpnNIJKS2s5JC4MHdVfH9RAF5IWi8/072VwZs2wOF3XuiY4mIw2yfd8sAVmge kfbu5pJoKtpD1CErcrO259/Pkva23UhvGClaNwv8pDVI9AUyNemx/TfFHle0rWOn BtRbFP6jg29d/e3fVjoAcFPBvjJfQNG7lRbptBrg/lIXvijY4Vu6oRLsdVQRMKyR cjLjxlbYeE3sZ+zv5k6ksEzV5OF1BnIz/oVxIXsp7Jr1UT2f4yJLeIW5763dFYwD t3YLpaDiOy01VRRee6MFQoIDEgzsbkhAch50vF03U8GMHojUgcmty1Fti7+rvfVR tS/OfS1i+ThprX4Bb9bdIpo/rZxYYeMFOk3QFxgg5g/nVtL7g1QLgDAXxBYlsHtS T/KEiFex -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/92/000077500000000000000000000000001322470703100204255ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/92/end.crt000066400000000000000000000033611322470703100217100ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBATBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoTDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLExRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAxQHQ1NDQV9DWjAeFw0wNjA3MjQwMDAwMDBaFw0y MTEwMjQyMzU5NTlaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKEw5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECxMUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMUB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCvUZnqqCTF+LC1 aqVLMoUsigvNhOcqWfKu+XGy4NvS3Je0LICgRZe9A3IUnf5N0ArDN3jdmJrX1ug0 0XwuRgG+80OifmMH32kFLyB0+RbPFmOJWi3v7mxwMdtLQw1xTdhgv/WMPRaxnlbf Qm3IZXhwTvrBsZmI6q1y54ibmOc63UsAZdqDc+t9AIX11oFwq3zO4MBxMkCYsEfh JoylB9Uhufdk5pGEdTWUTs8aRuPFWrS3WzhSmoWDiR8hCiZnYhSJx5I8g/vKfRyj JtpJXaqvWRbnfnL+iSJl5cCUH9f+bIL026BZY6tF8EsNiloay/qewEKAlNdxXczJ l9OShkUuKeVrpYlUhD/B9g6vXUMrkznax5l273KS79kk8GgcwZmY87qZwp1wE/Q6 Rc/iDl4Bcum/nezXVrb+vnMprbSwid7Wt7e5z2rXtsP/56Sa01N/kJ3C+UKlSuhd 9kTOvmLPUMwOVKld75WqRKZbw6B+JtNvBCeyu89wrGkt527RF3kCAwEAAaNhMF8w HQYDVR0OBBYEFLSBmfXskNo/DW+fOn3n4MF1lJYsMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnIsmswEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAChyozpMnqq+HarcDKatzMbFnbG4YlgbZXfS kVsAK3y8qWli1oVI6TW8U199xsR/GVACjJ1YLE8hiHjmtG8mSh8MUM7qqf0JnjFo 3g5/q/jJH7+d6BnPGWsc0s/vwzfla1Oa/bozYeOYq9drMkDzTfOGNEDWisWma4RR B5F7ithB+/7dxnZ3xOrJcoemkw4qeCbZN86FToMo2eNc8CbtlI6AixDzzKC67LS8 YiObOFwpn5U09aBwcW5oUVGvVmeeQ9XRb7nkocHm6ElpWlhwvFVejFQR0hDSKazf eFrRYPb7n2MsAg1wLHABOJPoEA7yENjXh5maybtv+ksUFdJ469f4n4cvVyQOeDtZ XBDmG2YOVyaSOjxVkHsTbR2PTW1s9cvLZwxf/6Nnq9gpzIf+VzBJSxGyrwDWkKnA tnFnFsk3q93/7t0qmIyf2sxCi95CfTFlR2Brs5GwqCczFT5DzMt4NKXWiAx0DfC+ 6MTSBMSW5O/G5ZryNPNl79qLqhXn+Q== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/93/000077500000000000000000000000001322470703100204265ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/93/end.crt000066400000000000000000000050051322470703100217060ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIHODCCBOygAwIBAgIEVjo8gzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQC AgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATAwZTEfMB0GA1UE AwwWRVUgTGFpc3NleiBQYXNzZXIgQ1NDQTEXMBUGA1UECgwORXVyb3BlYW4gVW5p b24xHDAaBgNVBAsME0V1cm9wZWFuIENvbW1pc3Npb24xCzAJBgNVBAYTAkVVMB4X DTE1MTEwNDAwMDAwMFoXDTI3MDIwNDAwMDAwMFowZTEfMB0GA1UEAwwWRVUgTGFp c3NleiBQYXNzZXIgQ1NDQTEXMBUGA1UECgwORXVyb3BlYW4gVW5pb24xHDAaBgNV BAsME0V1cm9wZWFuIENvbW1pc3Npb24xCzAJBgNVBAYTAkVVMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAohP/iOVhnNuN8Bh3/+ddPBipDmXIXtuxl8Hy 0PUVMYMbh0w6na5HCziXibHYqiS/GNPREnv9v6DT27jh82hDtr6x0jmlPKQmLJsP yAa8nRkVPamWnUP/dkbtNl4hpiVRnhlMh2Poc5Rxfjrdqywersi8TJChj4FnqV6p JeVsur/LXow/T6WwBMzYu40LUcPAlOZvHQwukg+pmskJ6Sk5MsCMMUf799vmFIEc eTcY2StNtb8oMxeGO7fwgoWmVPn+XWOeukgEdQgZQr3l+ohlVvf6PxXgBa59ToIy NhbivuhXz2NRsoN9YwPc6ZdNTZTgjoFEw8v8VIS/TzCc+0PPdnrZ8WxaxrAOeDSX yuCKcR6m2ubJPRJ3C3M954FXE5OXpEtil0G4MezZxjEbiVT4GRtO5O0qpJ0ukdeX TaR/0Qhgl6ol1we0BC7BjmkDf07nxbjrWOdTcImyX4F/gr5kyiPOXN0jG/Ehs2SA /ajkgerMEkfgg+HAwfSexh4frL6c8pBZ2s29SsCIPw5zQ71iF8yKZMAuqjdvwgwk TtWDBYa3u3ZYcGtB/3OWnJnP7npDciKxiztbtO6Xm/ak2m6/xTiGzg0asON/+YQw PDiJDwhu/l3hZZWHeiFgT/MBFnEHl2IcmrNFaFIwz9gqxmEf6lghhueChSpDA4if eEHUImECAwEAAaOCAYYwggGCMIGSBgNVHSMEgYowgYeAFLzJa1HIIq419SeHZio3 OjmKIvw/oWmkZzBlMR8wHQYDVQQDDBZFVSBMYWlzc2V6IFBhc3NlciBDU0NBMRcw FQYDVQQKDA5FdXJvcGVhbiBVbmlvbjEcMBoGA1UECwwTRXVyb3BlYW4gQ29tbWlz c2lvbjELMAkGA1UEBhMCRVWCBFY6PIMwHQYDVR0OBBYEFLzJa1HIIq419SeHZio3 OjmKIvw/MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMCsGA1Ud EAQkMCKADzIwMTUxMTA0MDAwMDAwWoEPMjAyMDExMDQwMDAwMDBaMCMGA1UdEQQc MBqBGGV1LWNzY2FAanJjLmVjLmV1cm9wYS5ldTAjBgNVHRIEHDAagRhldS1jc2Nh QGpyYy5lYy5ldXJvcGEuZXUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cHM6Ly9ldS1j c2NhLmpyYy5lYy5ldXJvcGEuZXUwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQME AgIFAKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgIFAKIDAgEwA4ICAQBPKYKV KV3MU6+e4I1C8XhbhHFuOnB9zNtGlPa2hrSJ0IbpJpg6LEx7RFE5ML3eT/4LCSsf sf5vK7xJGtA1ojw8Gd72ZrHgSTd4NKlU4rAE7SNmA+datHTrii3MAuCWfBrOQZRa f/4ej0yIPSVeP6BwOuFT6iiCq+SWiFEZzHW2mZJujWURL/BEgwC4+yYFwK04qk0H MkwKkQjRPbAjmdKtcxLxf5Euf1ZT0VB8SvzcBs+63dFF/ttJ47MlxRMp0A/OqteO XLWWbIlIZRM1W9VBZTGrEtZ8ZX6kMcSQRKkKCMs1DjGkmZx0lj9alfF/06x+ugSj UYMN/Ih+OHZpSvfZsVUcfuUqlLJCuXtMWGs4PDaW6k68g7GUU1serwggngU9qgGf fDaQaSBDhL1XVNoXJ2BHGOI/FTiUUotGb1y0Sj75mRW2pQHijd1f+1TQOzVTf4ab 5JBo3Iuz0P2eLciCbZbCRs90rPwQFVJaVe2NAaBNckP+2IaKOiaI/gbKZC3MpDwX Bdt4bjFHHzZ+XGugg4vlkNQQ46vRxr10bFg+CPaNplg/HMZPjJVOuxg3amYfanIr 2mSPScKJA9fJZuxOd7rGIb4Z1Bvs16S2WfNPTZRnQjxAqXir9Wa2xxvw3GriU6Dd C2ceDox/pCY0HZZvVMOh/AYHDptR0uO4jSdjUQ== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/94/000077500000000000000000000000001322470703100204275ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/94/end.crt000066400000000000000000000042541322470703100217140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIGOTCCA+2gAwIBAgIBMzBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAweDEYMBYGA1UECgwP U3RhdGUgb2YgSXNyYWVsMQ0wCwYDVQQLDARQSUJBMQswCQYDVQQGEwJJTDEQMA4G A1UEAwwHRVBQQ1NDQTEhMB8GCSqGSIb3DQEJARYSY3J5cHRvQHBpYmEuZ292Lmls MQswCQYDVQQFEwI1MTAeFw0xMzA1MTUwNTQ5NTFaFw0yODExMTYwNTQ5NTFaMHgx GDAWBgNVBAoMD1N0YXRlIG9mIElzcmFlbDENMAsGA1UECwwEUElCQTELMAkGA1UE BhMCSUwxEDAOBgNVBAMMB0VQUENTQ0ExITAfBgkqhkiG9w0BCQEWEmNyeXB0b0Bw aWJhLmdvdi5pbDELMAkGA1UEBRMCNTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQCnhHbtAORq1v79D3EBZi3IpKfkrzg2FImnShF9i63PLT6ggTg79ezm k36hq0lBu6kF3dXEG0kUFw1P1vX2ZnnWJj+HRlvgw6DaDOUiTCvYJTdTzPyfzO21 Rt1o2CFOwjg8251sQ1CkRkK8WyNIQWygPPZt/QBdGb7TJBDr1xY3/1LgOn1R3QrV /cfHONQ6K5UbacOE7SP2x5dw1pzax3EH7CpnIq4ZB6RwtpVazD6utQ30GDb7kiYQ 2y7AlzzT28TIoxKl5cIv11Iy3O9uzqMKBNychUR3vC565V0f1TffonozU/L4bh3G jVixdyG8TlBqmbKZkAMDyMDucYMVEONGpxRwEQRe2dDotnN6KluH3+Xk2IFcL/3I zLe8cnah+zTUderEvISUopRrVQSde4QyfpnrU7VRHdhvLGhjAN4vucAKiPZduBHx iL7YZZS3p8VjPHRGfokhHWqgGFeZmNAAS6JsbjD/S2zC2ACKXk5xzdNfbFZOfeVf YsKgyl1I5h1zVTS9YflBVARXOxSgxGFx48PFTYthG6FbovOcujBwaQCvaUV0DsMZ GbNVSOnwjSCk9CU/Hg552Em00xIKa0AlDflna3/eufIH65fCPu++sEaZBxpYbCLl qYlgubwZC4iJw2fyl9rN4zf9q0xsPtzn07P2kFZAj10htpJCUJPeIQIDAQABo2Yw ZDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU 1L5MDvZ0tgHoP3M5ZIUWgdBuD5swHwYDVR0jBBgwFoAU1L5MDvZ0tgHoP3M5ZIUW gdBuD5swQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEFAKEcMBoGCSqGSIb3 DQEBCDANBglghkgBZQMEAgEFAKIDAgEgA4ICAQAG5AqH3uxiXuHvPXl2LLH1Wr3k Hdwg9AqRAoLS9Hyo7lop1EP6hIoQ+VZb8E+dfrgSQIrTsDihXjPRI6X/HfjhtEnx b5+q2tKQ67Xx7G1qZr0IdfuWnfhk17McvLjFHrZHyi/3HLRfsltotgGVY2A8rXWe FfgpHtNUQvEhBcrXkqttUiiWgWEUEvyNPbPk72o5Pyir1XCd0eefy/AfJtM4nTII DiyevjRFf3LP8vrgKEDMsTQzcauAbE09nwT2eNIn3CWIqBhdJLt6wgczpUXMj6Qm 7mCYYoVgftLdGJHSx/uUr1lpO8+VKy5YMR27fcy7+N6XZ/D5Yp6xfZ8Rr76z3yQv fEL8XzS6rXSnqkrnX8Q5gegdkNbikcBQgf5MQL/wNtptPabmBl7+v+90xIfNJtEV UmarfGGNh8iRlpK6LU9FETyMBJdx268e2iyW7A5g8dCBc3bsLMsQyWLMIJ1z6JMX LSma+EtMD5Gq6T3Tm0WS4x6jl/pY8FaAY3Mz1S9oD/Hiz53YzFCqSnyDN3Np3M5a 7M9eMYNDV+MjJN7rfm5vtLARbiX/GIEw7fWPLMDtba2tQTK1ZhaUy3hsGDF+Pu4o 8ia4p8ELpXyykk3VGI0D9hLTUEYg1PA+p9ePSxuqCUG37ZWxk+o6EIhKChm8aJkd gYPFbd/9XZ0twqADbw== -----END CERTIFICATE----- botan-2.4.0/src/tests/data/x509/pss_certs/95/000077500000000000000000000000001322470703100204305ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/95/end.crt000066400000000000000000000033601322470703100217120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIE8jCCAyagAwIBAgIBdDBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUA oRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAQUAogMCASAwVzELMAkGA1UEBhMC Q1oxFzAVBgNVBAoMDkN6ZWNoIFJlcHVibGljMR0wGwYDVQQLDBRNaW5pc3RyeSBv ZiBJbnRlcmlvcjEQMA4GA1UEAwwHQ1NDQV9DWjAeFw0xMTAzMjUwMDAwMDBaFw0y NjA2MjUwMDAwMDBaMFcxCzAJBgNVBAYTAkNaMRcwFQYDVQQKDA5DemVjaCBSZXB1 YmxpYzEdMBsGA1UECwwUTWluaXN0cnkgb2YgSW50ZXJpb3IxEDAOBgNVBAMMB0NT Q0FfQ1owggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdFhq+ScQXepAA 0kp0IwF/nEv+Md3Wx41Y6WRJkTVVyU6CFPlvr/F6XLGX/ILJtM8QL97CgojDVQbE ccNxUsZ+yjtB4n52ttWYLBN5nktJksP2aBVMu1fqoyTqBhaf0JtkpQjWKNVJYbUH k2pXkzGUJ+YHG04jOEYIKNclY82f1Ho1Wd7di4gZ1LCBRTzIU9JVPEMOZdmLx1qQ InOWf8deZ4Gmkj5UqzXt7vGQF/TbIedhmfnbulvyHN3UEDMZgVgzkF2fIOaBwu5s kfo8e08/J155hZIJtUjXk/moLF8U/4ETo7qER1EkoJ9KIRIvoPwPk2QAI4JP0Hd6 GgUMEsz0dmTxKHcJZAWXcDaKcwTrG7/xhPTAffdOZnTnOpYQPcKmjUvogqY839VQ mwYyo+s51tVrAIe2YcdHhIdBY5SLOhHsDNadpRrBYIa8vzUgtfUH50US7dZuwUu6 WbUiQu5vmDjvGEUa7F6eehCCf9xXkbPJZoE63t/NJYvHSFa1wDcCAwEAAaNhMF8w HQYDVR0OBBYEFOuhT488aYrathCbEjUoztRlSghZMA4GA1UdDwEB/wQEAwIBBjAa BgNVHSAEEzARMA8GDSqBS7cYAQEBAYnKmXwwEgYDVR0TAQH/BAgwBgEB/wIBADBB BgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAQUAoRwwGgYJKoZIhvcNAQEIMA0G CWCGSAFlAwQCAQUAogMCASADggGBAEcppLLH0xAkWXbBMXDa1hwqOZfKVdoUVDNT G20V3VbDT74R2yFCLWBge9rr7S2LfF/w4Xrl3kyZ2Tn0dYoOmBcqVzH6nCYrniGx apPmSkAexI/bjW55BOMe6CVI9qdKayqm99om/2+R+VSAKaopwOKn9IQ+4itNA0VI 0ZDHbI/pdJClRZ0OPA8DREz7+hZWMNb7S4aAYGdd1fLo0uDKf/siFkUUfkpBtkgr 4Enb1e8NMU0a5abpI25NgURB+OWhfArLB9jFmnlql6TZADLZfw49bEmr4KOddxyk toBmFgu4/uQXcukNWB487iREvEPPIL7A90W+W3ymtlol76SChKKBGexaaNA1JW+O sRxoN5FnXTBhyRm96lZOfvF7SjCQHMCaIeYaQ4ajjPJgxB0EbyyJMeSrjh4yJPEH pKc3AM9MUCxC0LO/qb5oBio8TQqHYnpyvp2CsvPSezPGh/40hxsKTL8GqTxB5m9G g6qpdcDQxM6VtrnTh08nMjaKnfXVJQ== -----END CERTIFICATE-----botan-2.4.0/src/tests/data/x509/pss_certs/96/000077500000000000000000000000001322470703100204315ustar00rootroot00000000000000botan-2.4.0/src/tests/data/x509/pss_certs/96/end.crt000066400000000000000000000023661322470703100217200ustar00rootroot000000000000000‚ò0‚& t0A *†H†÷  04 0  `†He¡0 *†H†÷ 0  `†He¢ 0W1 0 UCZ10U Czech Republic10U Ministry of Interior10U CSCA_CZ0 110325000000Z 260625000000Z0W1 0 UCZ10U Czech Republic10U Ministry of Interior10U CSCA_CZ0‚¢0  *†H†÷ ‚0‚Š‚¾IÄzÒJt#œKþ1ÝÖÇXédI‘5UÉN‚ùo¯ñz\±—ü‚É´Ï/Þ‚ˆÃUÄqÃqRÆ~Ê;Aâ~v¶Õ˜,yžKI’ÃöhL»Wê£$êŸÐ›d¥Ö(ÕIaµ“jW“1”'æN#8F(×%cÍŸÔz5YÞÝ‹ˆÔ°E<ÈSÒUT«5íîñôÛ!ça™ùÛº[òÝÔ3X3]Ÿ æÂîl‘ú<{O?'^y…’ µHדù¨,_ÿ£º„GQ$ ŸJ!/ ü“d#‚OÐwz Ìôvdñ(w d—p6Šsë¿ñ„ôÀ}÷Nftç:–=¦K肦<ßÕP›2£ë9ÖÕk‡¶aÇG„‡Ac”‹:ì Ö¥Á`†¼¿5 µõçEíÖnÁKºYµ"Bîo˜8ïEì^žz‚ÜW‘³Éf:ÞßÍ%‹ÇHVµÀ7£a0_0Uë¡Oâ+MEHÑÇlét¥E<DLûúV0ÖûK†€`g]ÕòèÒàÊû"E~JA¶H+àIÛÕï 1Må¦é#nMDAøå¡| ËØÅšyj—¤Ù2Ù=lI«à£w¤¶€f ¸þäré X<î$D¼CÏ ¾À÷E¾[|¦¶Z%車„¢ìZhÐ5%oޱh7‘g]0aɽêVN~ñ{J0Àš!æC†£Œò`Äo,‰1䫎2$ñ¤§7ÏLP,Bг¿©¾h* #include #include #include #include #if defined(BOTAN_HAS_OPENSSL) #include #endif namespace { std::string help_text(const std::string& spec) { std::ostringstream err; err << "Usage: " << spec << "\n\n" << "Available test suites\n" << "----------------\n"; size_t line_len = 0; for(auto const& test : Botan_Tests::Test::registered_tests()) { err << test << " "; line_len += test.size() + 1; if(line_len > 64) { err << "\n"; line_len = 0; } } if(line_len > 0) { err << "\n"; } return err.str(); } } int main(int argc, char* argv[]) { std::cerr << Botan::runtime_version_check(BOTAN_VERSION_MAJOR, BOTAN_VERSION_MINOR, BOTAN_VERSION_PATCH); try { const std::string arg_spec = "botan-test --data-dir= --pkcs11-lib= --provider= --log-success " "--verbose --help --run-long-tests --run-online-tests --test-runs=1 --drbg-seed= " "*suites"; Botan_CLI::Argument_Parser parser(arg_spec); parser.parse_args(std::vector(argv + 1, argv + argc)); if(parser.flag_set("help")) { std::cout << help_text(arg_spec); return 0; } const std::string data_dir = parser.get_arg_or("data-dir", "src/tests/data"); const std::string pkcs11_lib = parser.get_arg("pkcs11-lib"); const std::string provider = parser.get_arg("provider"); const std::string drbg_seed = parser.get_arg("drbg-seed"); const bool log_success = parser.flag_set("log-success"); const bool run_long_tests = parser.flag_set("run-long-tests"); const bool run_online_tests = parser.flag_set("run-online-tests"); const size_t test_runs = parser.get_arg_sz("test-runs"); const std::vector suites = parser.get_arg_list("suites"); #if defined(BOTAN_HAS_OPENSSL) if(provider.empty() || provider == "openssl") { ::ERR_load_crypto_strings(); } #endif Botan_Tests::Test_Runner tests(std::cout); return tests.run(suites, data_dir, pkcs11_lib, provider, log_success, run_online_tests, run_long_tests, drbg_seed, test_runs); } catch(std::exception& e) { std::cerr << "Exiting with error: " << e.what() << std::endl; } catch(...) { std::cerr << "Exiting with unknown exception" << std::endl; } return 2; } botan-2.4.0/src/tests/test_aead.cpp000066400000000000000000000321231322470703100172060ustar00rootroot00000000000000/* * (C) 2014,2015,2016 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_AEAD_MODES) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_AEAD_MODES) class AEAD_Tests final : public Text_Based_Test { public: AEAD_Tests() : Text_Based_Test("aead", "Key,Nonce,In,Out", "AD") {} Test::Result test_enc(const std::vector& key, const std::vector& nonce, const std::vector& input, const std::vector& expected, const std::vector& ad, const std::string& algo) { Test::Result result(algo); std::unique_ptr enc(Botan::get_aead(algo, Botan::ENCRYPTION)); result.test_eq("AEAD encrypt output_length is correct", enc->output_length(input.size()), expected.size()); result.confirm("AEAD name is not empty", !enc->name().empty()); result.confirm("AEAD default nonce size is accepted", enc->valid_nonce_length(enc->default_nonce_length())); // First some tests for reset() to make sure it resets what we need it to // set garbage values enc->set_key(mutate_vec(key)); enc->set_ad(mutate_vec(ad)); enc->start(mutate_vec(nonce)); Botan::secure_vector garbage = Test::rng().random_vec(enc->update_granularity()); enc->update(garbage); // reset message specific state enc->reset(); // now try to encrypt with correct values enc->set_key(key); enc->set_ad(ad); enc->start(nonce); Botan::secure_vector buf(input.begin(), input.end()); // have to check here first if input is empty if not we can test update() and eventually process() if(buf.empty()) { enc->finish(buf); result.test_eq("encrypt with empty input", buf, expected); } else { // test finish() with full input enc->finish(buf); result.test_eq("encrypt full", buf, expected); // additionally test update() if possible const size_t update_granularity = enc->update_granularity(); if(input.size() > update_granularity) { // reset state first enc->reset(); enc->set_ad(ad); enc->start(nonce); buf.assign(input.begin(), input.end()); size_t input_length = buf.size(); size_t offset = 0; uint8_t* p = buf.data(); Botan::secure_vector block(update_granularity); Botan::secure_vector ciphertext(enc->output_length(buf.size())); while(input_length > update_granularity && ((input_length - update_granularity) >= enc->minimum_final_size())) { block.assign(p, p + update_granularity); enc->update(block); p += update_granularity; input_length -= update_granularity; buffer_insert(ciphertext, 0 + offset, block); offset += block.size(); } // encrypt remaining bytes block.assign(p, p + input_length); enc->finish(block); buffer_insert(ciphertext, 0 + offset, block); result.test_eq("encrypt update", ciphertext, expected); } // additionally test process() if possible size_t min_final_bytes = enc->minimum_final_size(); if(input.size() > (update_granularity + min_final_bytes)) { // again reset state first enc->reset(); enc->set_ad(ad); enc->start(nonce); buf.assign(input.begin(), input.end()); // we can process at max input.size() const size_t max_blocks_to_process = (input.size() - min_final_bytes) / update_granularity; const size_t bytes_to_process = max_blocks_to_process * update_granularity; const size_t bytes_written = enc->process(buf.data(), bytes_to_process); if(bytes_written == 0) { // SIV case buf.erase(buf.begin(), buf.begin() + bytes_to_process); enc->finish(buf); } else { result.test_eq("correct number of bytes processed", bytes_written, bytes_to_process); enc->finish(buf, bytes_written); } result.test_eq("encrypt process", buf, expected); } } return result; } Test::Result test_dec(const std::vector& key, const std::vector& nonce, const std::vector& input, const std::vector& expected, const std::vector& ad, const std::string& algo) { Test::Result result(algo); std::unique_ptr dec(Botan::get_aead(algo, Botan::DECRYPTION)); result.test_eq("AEAD decrypt output_length is correct", dec->output_length(input.size()), expected.size()); // First some tests for reset() to make sure it resets what we need it to // set garbage values dec->set_key(mutate_vec(key)); dec->set_ad(mutate_vec(ad)); dec->start(mutate_vec(nonce)); Botan::secure_vector garbage = Test::rng().random_vec(dec->update_granularity()); dec->update(garbage); // reset message specific state dec->reset(); Botan::secure_vector buf(input.begin(), input.end()); try { // now try to decrypt with correct values dec->set_key(key); dec->set_ad(ad); dec->start(nonce); // test finish() with full input dec->finish(buf); result.test_eq("decrypt full", buf, expected); // additionally test update() if possible const size_t update_granularity = dec->update_granularity(); if(input.size() > update_granularity) { // reset state first dec->reset(); dec->set_ad(ad); dec->start(nonce); buf.assign(input.begin(), input.end()); size_t input_length = buf.size(); size_t offset = 0; uint8_t* p = buf.data(); Botan::secure_vector block(update_granularity); Botan::secure_vector plaintext(dec->output_length(buf.size())); while((input_length > update_granularity) && ((input_length - update_granularity) >= dec->minimum_final_size())) { block.assign(p, p + update_granularity); dec->update(block); p += update_granularity; input_length -= update_granularity; buffer_insert(plaintext, 0 + offset, block); offset += block.size(); } // decrypt remaining bytes block.assign(p, p + input_length); dec->finish(block); buffer_insert(plaintext, 0 + offset, block); result.test_eq("decrypt update", plaintext, expected); } // additionally test process() if possible const size_t min_final_size = dec->minimum_final_size(); if(input.size() > (update_granularity + min_final_size)) { // again reset state first dec->reset(); dec->set_ad(ad); dec->start(nonce); buf.assign(input.begin(), input.end()); // we can process at max input.size() const size_t max_blocks_to_process = (input.size() - min_final_size) / update_granularity; const size_t bytes_to_process = max_blocks_to_process * update_granularity; const size_t bytes_written = dec->process(buf.data(), bytes_to_process); if(bytes_written == 0) { // SIV case buf.erase(buf.begin(), buf.begin() + bytes_to_process); dec->finish(buf); } else { result.test_eq("correct number of bytes processed", bytes_written, bytes_to_process); dec->finish(buf, bytes_to_process); } result.test_eq("decrypt process", buf, expected); } } catch(Botan::Exception& e) { result.test_failure("Failure processing AEAD ciphertext", e.what()); } // test decryption with modified ciphertext const std::vector mutated_input = mutate_vec(input, true); buf.assign(mutated_input.begin(), mutated_input.end()); dec->reset(); dec->set_ad(ad); dec->start(nonce); try { dec->finish(buf); result.test_failure("accepted modified message", mutated_input); } catch(Botan::Integrity_Failure&) { result.test_success("correctly rejected modified message"); } catch(std::exception& e) { result.test_failure("unexpected error while rejecting modified message", e.what()); } // test decryption with modified nonce if(nonce.size() > 0) { buf.assign(input.begin(), input.end()); std::vector bad_nonce = mutate_vec(nonce); dec->reset(); dec->set_ad(ad); dec->start(bad_nonce); try { dec->finish(buf); result.test_failure("accepted message with modified nonce", bad_nonce); } catch(Botan::Integrity_Failure&) { result.test_success("correctly rejected modified nonce"); } catch(std::exception& e) { result.test_failure("unexpected error while rejecting modified nonce", e.what()); } } // test decryption with modified associated_data const std::vector bad_ad = mutate_vec(ad, true); dec->reset(); dec->set_ad(bad_ad); dec->start(nonce); try { buf.assign(input.begin(), input.end()); dec->finish(buf); result.test_failure("accepted message with modified ad", bad_ad); } catch(Botan::Integrity_Failure&) { result.test_success("correctly rejected modified ad"); } catch(std::exception& e) { result.test_failure("unexpected error while rejecting modified nonce", e.what()); } return result; } Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector key = get_req_bin(vars, "Key"); const std::vector nonce = get_opt_bin(vars, "Nonce"); const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); const std::vector ad = get_opt_bin(vars, "AD"); Test::Result result(algo); std::unique_ptr enc(Botan::get_aead(algo, Botan::ENCRYPTION)); std::unique_ptr dec(Botan::get_aead(algo, Botan::DECRYPTION)); if(!enc || !dec) { result.note_missing(algo); return result; } // must be authenticated result.test_eq("Encryption algo is an authenticated mode", enc->authenticated(), true); result.test_eq("Decryption algo is an authenticated mode", dec->authenticated(), true); const std::string enc_provider = enc->provider(); result.test_is_nonempty("enc provider", enc_provider); const std::string dec_provider = enc->provider(); result.test_is_nonempty("dec provider", dec_provider); result.test_eq("same provider", enc_provider, dec_provider); // FFI currently requires this, so assure it is true for all modes result.test_gte("enc buffer sizes ok", enc->update_granularity(), enc->minimum_final_size()); result.test_gte("dec buffer sizes ok", dec->update_granularity(), dec->minimum_final_size()); // test enc result.merge(test_enc(key, nonce, input, expected, ad, algo)); // test dec result.merge(test_dec(key, nonce, expected, input, ad, algo)); enc->clear(); dec->clear(); return result; } }; BOTAN_REGISTER_TEST("aead", AEAD_Tests); #endif } } botan-2.4.0/src/tests/test_asn1.cpp000066400000000000000000000176221322470703100171650ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ASN1) #include #include #include #include #endif #include namespace Botan_Tests { #if defined(BOTAN_HAS_ASN1) namespace { Test::Result test_ber_stack_recursion() { Test::Result result("BER stack recursion"); // OSS-Fuzz #813 GitHub #989 try { const std::vector in(10000000, 0); Botan::DataSource_Memory input(in.data(), in.size()); Botan::BER_Decoder dec(input); while(dec.more_items()) { Botan::BER_Object obj; dec.get_next(obj); } } catch(Botan::Decoding_Error&) { } result.test_success("No crash"); return result; } Test::Result test_ber_eoc_decoding_limits() { Test::Result result("BER nested indefinite length"); // OSS-Fuzz #4353 Botan::ASN1_Pretty_Printer printer; size_t max_eoc_allowed = 0; for(size_t len = 1; len < 1024; ++len) { std::vector buf(4*len); /* This constructs a len deep sequence of SEQUENCES each with an indefinite length */ for(size_t i = 0; i != 2*len; i += 2) { buf[i ] = 0x30; buf[i+1] = 0x80; } // remainder of values left as zeros (EOC markers) try { printer.print(buf); } catch(Botan::BER_Decoding_Error&) { max_eoc_allowed = len - 1; break; } } result.test_eq("EOC limited to prevent stack exhaustion", max_eoc_allowed, 16); return result; } Test::Result test_asn1_utf8_ascii_parsing() { Test::Result result("ASN.1 ASCII parsing"); try { // \x13 - ASN1 tag for 'printable string' // \x06 - 6 characters of payload // ... - UTF-8 encoded (ASCII chars only) word 'Moscow' const std::string moscow = "\x13\x06\x4D\x6F\x73\x63\x6F\x77"; const std::string moscow_plain = "Moscow"; Botan::DataSource_Memory input(moscow.data()); Botan::BER_Decoder dec(input); Botan::ASN1_String str; str.decode_from(dec); result.test_eq("value()", str.value(), moscow_plain); } catch(const Botan::Decoding_Error &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_asn1_utf8_parsing() { Test::Result result("ASN.1 UTF-8 parsing"); try { // \x0C - ASN1 tag for 'UTF8 string' // \x0C - 12 characters of payload // ... - UTF-8 encoded russian word for Moscow in cyrillic script const std::string moscow = "\x0C\x0C\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0"; const std::string moscow_plain = "\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0"; Botan::DataSource_Memory input(moscow.data()); Botan::BER_Decoder dec(input); Botan::ASN1_String str; str.decode_from(dec); result.test_eq("value()", str.value(), moscow_plain); } catch(const Botan::Decoding_Error &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_asn1_ucs2_parsing() { Test::Result result("ASN.1 BMP string (UCS-2) parsing"); try { // \x1E - ASN1 tag for 'BMP (UCS-2) string' // \x0C - 12 characters of payload // ... - UCS-2 encoding for Moscow in cyrillic script const std::string moscow = "\x1E\x0C\x04\x1C\x04\x3E\x04\x41\x04\x3A\x04\x32\x04\x30"; const std::string moscow_plain = "\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0"; Botan::DataSource_Memory input(moscow.data()); Botan::BER_Decoder dec(input); Botan::ASN1_String str; str.decode_from(dec); result.test_eq("value()", str.value(), moscow_plain); } catch(const Botan::Decoding_Error &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_asn1_ucs4_parsing() { Test::Result result("ASN.1 universal string (UCS-4) parsing"); try { // \x1C - ASN1 tag for 'universal string' // \x18 - 24 characters of payload // ... - UCS-4 encoding for Moscow in cyrillic script const Botan::byte moscow[] = "\x1C\x18\x00\x00\x04\x1C\x00\x00\x04\x3E\x00\x00\x04\x41\x00\x00\x04\x3A\x00\x00\x04\x32\x00\x00\x04\x30"; const std::string moscow_plain = "\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0"; Botan::DataSource_Memory input(moscow, sizeof(moscow)); Botan::BER_Decoder dec(input); Botan::ASN1_String str; str.decode_from(dec); result.test_eq("value()", str.value(), moscow_plain); } catch(const Botan::Decoding_Error &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_asn1_ascii_encoding() { Test::Result result("ASN.1 ASCII encoding"); try { // UTF-8 encoded (ASCII chars only) word 'Moscow' const std::string moscow = "\x4D\x6F\x73\x63\x6F\x77"; Botan::ASN1_String str(moscow); Botan::DER_Encoder enc; str.encode_into(enc); auto encodingResult = enc.get_contents(); // \x13 - ASN1 tag for 'printable string' // \x06 - 6 characters of payload const auto moscowEncoded = Botan::hex_decode("13064D6F73636F77"); result.test_eq("encoding result", encodingResult, moscowEncoded); result.test_success("No crash"); } catch(const std::exception &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_asn1_utf8_encoding() { Test::Result result("ASN.1 UTF-8 encoding"); try { // UTF-8 encoded russian word for Moscow in cyrillic script const std::string moscow = "\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0"; Botan::ASN1_String str(moscow); Botan::DER_Encoder enc; str.encode_into(enc); auto encodingResult = enc.get_contents(); // \x0C - ASN1 tag for 'UTF8 string' // \x0C - 12 characters of payload const auto moscowEncoded = Botan::hex_decode("0C0CD09CD0BED181D0BAD0B2D0B0"); result.test_eq("encoding result", encodingResult, moscowEncoded); result.test_success("No crash"); } catch(const std::exception &ex) { result.test_failure(ex.what()); } return result; } } class ASN1_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_ber_stack_recursion()); results.push_back(test_ber_eoc_decoding_limits()); results.push_back(test_asn1_utf8_ascii_parsing()); results.push_back(test_asn1_utf8_parsing()); results.push_back(test_asn1_ucs2_parsing()); results.push_back(test_asn1_ucs4_parsing()); results.push_back(test_asn1_ascii_encoding()); results.push_back(test_asn1_utf8_encoding()); return results; } }; BOTAN_REGISTER_TEST("asn1", ASN1_Tests); class ASN1_Printer_Tests final : public Test { public: std::vector run() override { Test::Result result("ASN1_Pretty_Printer"); Botan::ASN1_Pretty_Printer printer; const size_t num_tests = 5; for(size_t i = 1; i <= num_tests; ++i) { std::string i_str = std::to_string(i); const std::vector input1 = Test::read_binary_data_file("asn1_print/input" + i_str + ".der"); const std::string expected1 = Test::read_data_file("asn1_print/output" + i_str + ".txt"); result.test_eq("Test " + i_str, printer.print(input1), expected1); } return {result}; } }; BOTAN_REGISTER_TEST("asn1_printer", ASN1_Printer_Tests); #endif } botan-2.4.0/src/tests/test_bigint.cpp000066400000000000000000000517401322470703100175760ustar00rootroot00000000000000/* * (C) 2009,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_NUMBERTHEORY) #include #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_NUMBERTHEORY) using Botan::BigInt; class BigInt_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_bigint_sizes()); results.push_back(test_random_integer()); results.push_back(test_random_prime()); results.push_back(test_encode()); results.push_back(test_bigint_io()); return results; } private: Test::Result test_bigint_sizes() { Test::Result result("BigInt size functions"); for(size_t bit : { 1, 8, 16, 31, 32, 64, 97, 128, 179, 192, 512, 521 }) { BigInt a; a.set_bit(bit); // Test 2^n and 2^n-1 for(size_t i = 0; i != 2; ++i) { const size_t exp_bits = bit + 1 - i; result.test_eq("BigInt::bits", a.bits(), exp_bits); result.test_eq("BigInt::bytes", a.bytes(), (exp_bits % 8 == 0) ? (exp_bits / 8) : (exp_bits + 8 - exp_bits % 8) / 8); if(bit == 1 && i == 1) { result.test_is_eq("BigInt::to_u32bit zero", a.to_u32bit(), static_cast(1)); } else if(bit <= 31 || (bit == 32 && i == 1)) { result.test_is_eq("BigInt::to_u32bit", a.to_u32bit(), static_cast((uint64_t(1) << bit) - i)); } else { try { a.to_u32bit(); result.test_failure("BigInt::to_u32bit roundtripped out of range value"); } catch(std::exception&) { result.test_success("BigInt::to_u32bit rejected out of range"); } } a--; } } return result; } Test::Result test_random_prime() { Test::Result result("BigInt prime generation"); result.test_throws("Invalid arg", []() { Botan::random_prime(Test::rng(), 0); }); result.test_throws("Invalid arg", []() { Botan::random_prime(Test::rng(), 1); }); result.test_throws("Invalid arg", []() { Botan::random_prime(Test::rng(), 2, 0); }); result.test_throws("Invalid arg", []() { Botan::random_prime(Test::rng(), 2, 1, 1, 3); }); result.test_throws("Invalid arg", []() { Botan::random_prime(Test::rng(), 2, 1, 0, 2); }); BigInt p = Botan::random_prime(Test::rng(), 2); result.confirm("Only two 2-bit primes", p == 2 || p == 3); p = Botan::random_prime(Test::rng(), 3); result.confirm("Only two 3-bit primes", p == 5 || p == 7); p = Botan::random_prime(Test::rng(), 4); result.confirm("Only two 4-bit primes", p == 11 || p == 13); for(size_t bits = 5; bits <= 32; ++bits) { p = Botan::random_prime(Test::rng(), bits); result.test_eq("Expected bit size", p.bits(), bits); result.test_eq("P is prime", Botan::is_prime(p, Test::rng()), true); } for(size_t bits = 5; bits <= 32; ++bits) { const BigInt last_p = p; p = Botan::random_prime(Test::rng(), bits, last_p); result.test_eq("Relatively prime", Botan::gcd(last_p, p), 1); result.test_eq("Expected bit size", p.bits(), bits); result.test_eq("P is prime", Botan::is_prime(p, Test::rng()), true); } const size_t safe_prime_bits = 65; const BigInt safe_prime = Botan::random_safe_prime(Test::rng(), safe_prime_bits); result.test_eq("Safe prime size", safe_prime.bits(), safe_prime_bits); result.confirm("P is prime", Botan::is_prime(safe_prime, Test::rng())); result.confirm("(P-1)/2 is prime", Botan::is_prime((safe_prime - 1) / 2, Test::rng())); return result; } Test::Result test_random_integer() { Test::Result result("BigInt::random_integer"); result.start_timer(); // A value of 500 caused a non-negligible amount of test failures const size_t ITERATIONS_PER_POSSIBLE_VALUE = 750; std::vector min_ranges{ 0 }; std::vector max_ranges{ 10 }; if(Test::run_long_tests()) { // This gets slow quickly: min_ranges.push_back(7); max_ranges.push_back(113); } for(size_t range_min : min_ranges) { for(size_t range_max : max_ranges) { if(range_min >= range_max) { continue; } std::vector counts(range_max - range_min); for(size_t i = 0; i != counts.size() * ITERATIONS_PER_POSSIBLE_VALUE; ++i) { uint32_t r = BigInt::random_integer(Test::rng(), range_min, range_max).to_u32bit(); result.test_gte("random_integer", r, range_min); result.test_lt("random_integer", r, range_max); counts[r - range_min] += 1; } for(const auto count : counts) { double ratio = static_cast(count) / ITERATIONS_PER_POSSIBLE_VALUE; if(ratio >= 0.85 && ratio <= 1.15) // +/-15 % { result.test_success("distribution within expected range"); } else { result.test_failure("distribution ratio outside expected range (+/-15 %): " + std::to_string(ratio)); } } } } result.end_timer(); return result; } Test::Result test_encode() { Test::Result result("BigInt encoding functions"); const BigInt n1(0xffff); const BigInt n2(1023); Botan::secure_vector encoded_n1 = BigInt::encode_1363(n1, 256); Botan::secure_vector encoded_n2 = BigInt::encode_1363(n2, 256); Botan::secure_vector expected = encoded_n1; expected += encoded_n2; Botan::secure_vector encoded_n1_n2 = BigInt::encode_fixed_length_int_pair(n1, n2, 256); result.test_eq("encode_fixed_length_int_pair", encoded_n1_n2, expected); for(size_t i = 0; i < 256 - n1.bytes(); ++i) { if(encoded_n1[i] != 0) { result.test_failure("encode_1363", "no zero byte"); } } return result; } Test::Result test_bigint_io() { Test::Result result("BigInt IO operators"); const std::map str_to_val = { { "-13", -Botan::BigInt(13) }, { "0", Botan::BigInt(0) }, { "0x13", Botan::BigInt(0x13) }, { "1", Botan::BigInt(1) }, { "4294967297", Botan::BigInt(2147483648) * 2 + 1 } }; for(auto vec : str_to_val) { Botan::BigInt n; std::istringstream iss; iss.str(vec.first); iss >> n; result.test_eq("input '" + vec.first + "'", n, vec.second); } BigInt n = 33; std::ostringstream oss; oss << n; result.test_eq("output 33 dec", oss.str(), "33"); oss.str(""); oss << std::hex << n; result.test_eq("output 33 hex", oss.str(), "21"); result.test_throws("octal output not supported", [&]() { oss << std::oct << n; }); return result; } }; BOTAN_REGISTER_TEST("bigint_unit", BigInt_Unit_Tests); class BigInt_Add_Test final : public Text_Based_Test { public: BigInt_Add_Test() : Text_Based_Test("bn/add.vec", "In1,In2,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Addition"); using Botan::BigInt; const BigInt a = get_req_bn(vars, "In1"); const BigInt b = get_req_bn(vars, "In2"); const BigInt c = get_req_bn(vars, "Output"); result.test_eq("a + b", a + b, c); result.test_eq("b + a", b + a, c); BigInt e = a; e += b; result.test_eq("a += b", e, c); e = b; e += a; result.test_eq("b += a", e, c); return result; } }; BOTAN_REGISTER_TEST("bn_add", BigInt_Add_Test); class BigInt_Sub_Test final : public Text_Based_Test { public: BigInt_Sub_Test() : Text_Based_Test("bn/sub.vec", "In1,In2,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Subtraction"); const BigInt a = get_req_bn(vars, "In1"); const BigInt b = get_req_bn(vars, "In2"); const BigInt c = get_req_bn(vars, "Output"); result.test_eq("a - b", a - b, c); BigInt e = a; e -= b; result.test_eq("a -= b", e, c); return result; } }; BOTAN_REGISTER_TEST("bn_sub", BigInt_Sub_Test); class BigInt_Mul_Test final : public Text_Based_Test { public: BigInt_Mul_Test() : Text_Based_Test("bn/mul.vec", "In1,In2,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Multiply"); const BigInt a = get_req_bn(vars, "In1"); const BigInt b = get_req_bn(vars, "In2"); const BigInt c = get_req_bn(vars, "Output"); result.test_eq("a * b", a * b, c); result.test_eq("b * a", b * a, c); BigInt e = a; e *= b; result.test_eq("a *= b", e, c); e = b; e *= a; result.test_eq("b *= a", e, c); return result; } }; BOTAN_REGISTER_TEST("bn_mul", BigInt_Mul_Test); class BigInt_Sqr_Test final : public Text_Based_Test { public: BigInt_Sqr_Test() : Text_Based_Test("bn/sqr.vec", "Input,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Square"); const BigInt input = get_req_bn(vars, "Input"); const BigInt output = get_req_bn(vars, "Output"); result.test_eq("a * a", input * input, output); result.test_eq("sqr(a)", square(input), output); return result; } }; BOTAN_REGISTER_TEST("bn_sqr", BigInt_Sqr_Test); class BigInt_Div_Test final : public Text_Based_Test { public: BigInt_Div_Test() : Text_Based_Test("bn/divide.vec", "In1,In2,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Divide"); const BigInt a = get_req_bn(vars, "In1"); const BigInt b = get_req_bn(vars, "In2"); const BigInt c = get_req_bn(vars, "Output"); result.test_eq("a / b", a / b, c); BigInt e = a; e /= b; result.test_eq("a /= b", e, c); return result; } }; BOTAN_REGISTER_TEST("bn_div", BigInt_Div_Test); class BigInt_Mod_Test final : public Text_Based_Test { public: BigInt_Mod_Test() : Text_Based_Test("bn/mod.vec", "In1,In2,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Mod"); const BigInt a = get_req_bn(vars, "In1"); const BigInt b = get_req_bn(vars, "In2"); const BigInt c = get_req_bn(vars, "Output"); result.test_eq("a % b", a % b, c); BigInt e = a; e %= b; result.test_eq("a %= b", e, c); // if b fits into a Botan::word test %= operator for words if(b.bytes() <= sizeof(Botan::word)) { Botan::word b_word = b.word_at(0); e = a; e %= b_word; result.test_eq("a %= b (as word)", e, c); } return result; } }; BOTAN_REGISTER_TEST("bn_mod", BigInt_Mod_Test); class BigInt_GCD_Test final : public Text_Based_Test { public: BigInt_GCD_Test() : Text_Based_Test("bn/gcd.vec", "X,Y,GCD") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Mod"); const BigInt x = get_req_bn(vars, "X"); const BigInt y = get_req_bn(vars, "Y"); const BigInt expected = get_req_bn(vars, "GCD"); const BigInt g = Botan::gcd(x, y); result.test_eq("gcd", expected, g); return result; } }; BOTAN_REGISTER_TEST("bn_gcd", BigInt_GCD_Test); class BigInt_Lshift_Test final : public Text_Based_Test { public: BigInt_Lshift_Test() : Text_Based_Test("bn/lshift.vec", "Value,Shift,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Lshift"); const BigInt value = get_req_bn(vars, "Value"); const size_t shift = get_req_bn(vars, "Shift").to_u32bit(); const BigInt output = get_req_bn(vars, "Output"); result.test_eq("a << s", value << shift, output); BigInt e = value; e <<= shift; result.test_eq("a <<= s", e, output); return result; } }; BOTAN_REGISTER_TEST("bn_lshift", BigInt_Lshift_Test); class BigInt_Rshift_Test final : public Text_Based_Test { public: BigInt_Rshift_Test() : Text_Based_Test("bn/rshift.vec", "Value,Shift,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Rshift"); const BigInt value = get_req_bn(vars, "Value"); const size_t shift = get_req_bn(vars, "Shift").to_u32bit(); const BigInt output = get_req_bn(vars, "Output"); result.test_eq("a >> s", value >> shift, output); BigInt e = value; e >>= shift; result.test_eq("a >>= s", e, output); return result; } }; BOTAN_REGISTER_TEST("bn_rshift", BigInt_Rshift_Test); class BigInt_Powmod_Test final : public Text_Based_Test { public: BigInt_Powmod_Test() : Text_Based_Test("bn/powmod.vec", "Base,Exponent,Modulus,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Powmod"); const BigInt base = get_req_bn(vars, "Base"); const BigInt exponent = get_req_bn(vars, "Exponent"); const BigInt modulus = get_req_bn(vars, "Modulus"); const BigInt expected = get_req_bn(vars, "Output"); result.test_eq("power_mod", Botan::power_mod(base, exponent, modulus), expected); /* * Only the basic power_mod interface supports negative base */ if(base.is_negative()) return result; Botan::Power_Mod pow_mod1(modulus); pow_mod1.set_base(base); pow_mod1.set_exponent(exponent); result.test_eq("pow_mod1", pow_mod1.execute(), expected); Botan::Power_Mod pow_mod2(modulus); // Reverses ordering which affects window size pow_mod2.set_exponent(exponent); pow_mod2.set_base(base); result.test_eq("pow_mod2", pow_mod2.execute(), expected); result.test_eq("pow_mod2 #2", pow_mod2.execute(), expected); if(modulus.is_odd()) { // TODO: test different hints // also TODO: remove bogus hinting arguments :) Botan::Power_Mod pow_mod3(modulus, Botan::Power_Mod::NO_HINTS, /*disable_montgomery=*/true); pow_mod3.set_exponent(exponent); pow_mod3.set_base(base); result.test_eq("pow_mod_fixed_window", pow_mod3.execute(), expected); } return result; } }; BOTAN_REGISTER_TEST("bn_powmod", BigInt_Powmod_Test); class BigInt_IsPrime_Test final : public Text_Based_Test { public: BigInt_IsPrime_Test() : Text_Based_Test("bn/isprime.vec", "X") {} Test::Result run_one_test(const std::string& header, const VarMap& vars) override { if(header != "Prime" && header != "NonPrime") { throw Test_Error("Bad header for prime test " + header); } const BigInt value = get_req_bn(vars, "X"); const bool is_prime = (header == "Prime"); Test::Result result("BigInt Test " + header); result.test_eq("is_prime", Botan::is_prime(value, Test::rng()), is_prime); return result; } }; BOTAN_REGISTER_TEST("bn_isprime", BigInt_IsPrime_Test); class BigInt_Ressol_Test final : public Text_Based_Test { public: BigInt_Ressol_Test() : Text_Based_Test("bn/ressol.vec", "Input,Modulus,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt Ressol"); const Botan::BigInt a = get_req_bn(vars, "Input"); const Botan::BigInt p = get_req_bn(vars, "Modulus"); const Botan::BigInt exp = get_req_bn(vars, "Output"); const Botan::BigInt a_sqrt = Botan::ressol(a, p); result.test_eq("ressol", a_sqrt, exp); if(a_sqrt > 1) { const Botan::BigInt a_sqrt2 = (a_sqrt * a_sqrt) % p; result.test_eq("square correct", a_sqrt2, a); } return result; } }; BOTAN_REGISTER_TEST("bn_ressol", BigInt_Ressol_Test); class BigInt_InvMod_Test final : public Text_Based_Test { public: BigInt_InvMod_Test() : Text_Based_Test("bn/invmod.vec", "Input,Modulus,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("BigInt InvMod"); const Botan::BigInt a = get_req_bn(vars, "Input"); const Botan::BigInt mod = get_req_bn(vars, "Modulus"); const Botan::BigInt expected = get_req_bn(vars, "Output"); const Botan::BigInt a_inv = Botan::inverse_mod(a, mod); result.test_eq("inverse_mod", a_inv, expected); if(a_inv > 1) { result.test_eq("inverse ok", (a * a_inv) % mod, 1); } if(mod.is_odd()) { result.test_eq("ct_inverse_odd_modulus", ct_inverse_mod_odd_modulus(a, mod), expected); } if(mod.is_odd() && a_inv != 0) { result.test_eq("normalized_montgomery_inverse", normalized_montgomery_inverse(a, mod), expected); } return result; } }; BOTAN_REGISTER_TEST("bn_invmod", BigInt_InvMod_Test); class DSA_ParamGen_Test final : public Text_Based_Test { public: DSA_ParamGen_Test() : Text_Based_Test("bn/dsa_gen.vec", "P,Q,Counter,Seed") {} Test::Result run_one_test(const std::string& header, const VarMap& vars) override { const std::vector seed = get_req_bin(vars, "Seed"); const size_t offset = get_req_sz(vars, "Counter"); const Botan::BigInt exp_P = get_req_bn(vars, "P"); const Botan::BigInt exp_Q = get_req_bn(vars, "Q"); const std::vector header_parts = Botan::split_on(header, ','); if(header_parts.size() != 2) { throw Test_Error("Unexpected header '" + header + "' in DSA param gen test"); } const size_t p_bits = Botan::to_u32bit(header_parts[1]); const size_t q_bits = Botan::to_u32bit(header_parts[0]); Test::Result result("DSA Parameter Generation"); // These tests are very slow so skip in normal runs if(p_bits > 1024 && Test::run_long_tests() == false) { return result; } try { Botan::BigInt gen_P, gen_Q; if(Botan::generate_dsa_primes(Test::rng(), gen_P, gen_Q, p_bits, q_bits, seed, offset)) { result.test_eq("P", gen_P, exp_P); result.test_eq("Q", gen_Q, exp_Q); } else { result.test_failure("Seed did not generate a DSA parameter"); } } catch(Botan::Lookup_Error&) { } return result; } }; BOTAN_REGISTER_TEST("dsa_param", DSA_ParamGen_Test); #endif } } botan-2.4.0/src/tests/test_block.cpp000066400000000000000000000120271322470703100174070ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include namespace Botan_Tests { class Block_Cipher_Tests final : public Text_Based_Test { public: Block_Cipher_Tests() : Text_Based_Test("block", "Key,In,Out", "Iterations") {} std::vector possible_providers(const std::string& algo) override { return provider_filter(Botan::BlockCipher::providers(algo)); } Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector key = get_req_bin(vars, "Key"); const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); const size_t iterations = get_opt_sz(vars, "Iterations", 1); Test::Result result(algo); const std::vector providers = possible_providers(algo); if(providers.empty()) { result.note_missing("block cipher " + algo); return result; } for(auto const& provider_ask : providers) { std::unique_ptr cipher(Botan::BlockCipher::create(algo, provider_ask)); if(!cipher) { result.test_failure("Cipher " + algo + " supported by " + provider_ask + " but not found"); continue; } const std::string provider(cipher->provider()); result.test_is_nonempty("provider", provider); result.test_eq(provider, cipher->name(), algo); result.test_gte(provider, cipher->parallelism(), 1); result.test_gte(provider, cipher->block_size(), 8); result.test_gte(provider, cipher->parallel_bytes(), cipher->block_size() * cipher->parallelism()); // Test that trying to encrypt or decrypt with now key set throws Botan::Invalid_State try { std::vector block(cipher->block_size()); cipher->encrypt(block); result.test_failure("Was able to encrypt without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to encrypt with no key set fails"); } try { std::vector block(cipher->block_size()); cipher->decrypt(block); result.test_failure("Was able to decrypt without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to encrypt with no key set fails"); } // Test to make sure clear() resets what we need it to cipher->set_key(Test::rng().random_vec(cipher->key_spec().maximum_keylength())); Botan::secure_vector garbage = Test::rng().random_vec(cipher->block_size()); cipher->encrypt(garbage); cipher->clear(); cipher->set_key(key); // Test that clone works and does not affect parent object std::unique_ptr clone(cipher->clone()); result.confirm("Clone has different pointer", cipher.get() != clone.get()); result.test_eq("Clone has same name", cipher->name(), clone->name()); clone->set_key(Test::rng().random_vec(cipher->maximum_keylength())); // have called set_key on clone: process input values std::vector buf = input; for(size_t i = 0; i != iterations; ++i) { cipher->encrypt(buf); } result.test_eq(provider, "encrypt", buf, expected); // always decrypt expected ciphertext vs what we produced above buf = expected; for(size_t i = 0; i != iterations; ++i) { cipher->decrypt(buf); } cipher->clear(); result.test_eq(provider, "decrypt", buf, input); try { std::vector block(cipher->block_size()); cipher->encrypt(block); result.test_failure("Was able to encrypt without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to encrypt with no key set (after clear) fails"); } try { std::vector block(cipher->block_size()); cipher->decrypt(block); result.test_failure("Was able to decrypt without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to decrypt with no key set (after clear) fails"); } } return result; } }; BOTAN_REGISTER_TEST("block", Block_Cipher_Tests); } botan-2.4.0/src/tests/test_c25519.cpp000066400000000000000000000121301322470703100171400ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_CURVE_25519) #include "test_pubkey.h" #include #include #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_CURVE_25519) class Curve25519_Sclarmult_Tests final : public Text_Based_Test { public: Curve25519_Sclarmult_Tests() : Text_Based_Test( "pubkey/c25519_scalar.vec", "Secret,Basepoint,Out") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { const std::vector secret = get_req_bin(vars, "Secret"); const std::vector basepoint = get_req_bin(vars, "Basepoint"); const std::vector expected = get_req_bin(vars, "Out"); std::vector got(32); Botan::curve25519_donna(got.data(), secret.data(), basepoint.data()); Test::Result result("Curve25519 scalarmult"); result.test_eq("basemult", got, expected); return result; } }; BOTAN_REGISTER_TEST("curve25519_scalar", Curve25519_Sclarmult_Tests); class Curve25519_Roundtrip_Test final : public Test { public: std::vector run() override { std::vector results; for(size_t i = 0; i < 10; ++i) { Test::Result result("Curve25519 roundtrip"); Botan::Curve25519_PrivateKey a_priv_gen(Test::rng()); Botan::Curve25519_PrivateKey b_priv_gen(Test::rng()); #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_AEAD_GCM) // Then serialize to encrypted storage const std::string a_pass = "alice pass"; const std::string b_pass = "bob pass"; const auto pbe_time = std::chrono::milliseconds(10); const std::string a_priv_pem = Botan::PKCS8::PEM_encode(a_priv_gen, Test::rng(), a_pass, pbe_time); const std::string b_priv_pem = Botan::PKCS8::PEM_encode(b_priv_gen, Test::rng(), b_pass, pbe_time); // Reload back into memory Botan::DataSource_Memory a_priv_ds(a_priv_pem); Botan::DataSource_Memory b_priv_ds(b_priv_pem); std::unique_ptr a_priv(Botan::PKCS8::load_key(a_priv_ds, Test::rng(), [a_pass]() { return a_pass; })); std::unique_ptr b_priv(Botan::PKCS8::load_key(b_priv_ds, Test::rng(), b_pass)); #else const std::string a_priv_pem = Botan::PKCS8::PEM_encode(a_priv_gen); const std::string b_priv_pem = Botan::PKCS8::PEM_encode(b_priv_gen); // Reload back into memory Botan::DataSource_Memory a_priv_ds(a_priv_pem); Botan::DataSource_Memory b_priv_ds(b_priv_pem); std::unique_ptr a_priv(Botan::PKCS8::load_key(a_priv_ds, Test::rng())); std::unique_ptr b_priv(Botan::PKCS8::load_key(b_priv_ds, Test::rng())); #endif // Export public keys as PEM const std::string a_pub_pem = Botan::X509::PEM_encode(*a_priv); const std::string b_pub_pem = Botan::X509::PEM_encode(*b_priv); Botan::DataSource_Memory a_pub_ds(a_pub_pem); Botan::DataSource_Memory b_pub_ds(b_pub_pem); std::unique_ptr a_pub(Botan::X509::load_key(a_pub_ds)); std::unique_ptr b_pub(Botan::X509::load_key(b_pub_ds)); Botan::Curve25519_PublicKey* a_pub_key = dynamic_cast(a_pub.get()); Botan::Curve25519_PublicKey* b_pub_key = dynamic_cast(b_pub.get()); if(a_pub_key && b_pub_key) { Botan::PK_Key_Agreement a_ka(*a_priv, Test::rng(), "Raw"); Botan::PK_Key_Agreement b_ka(*b_priv, Test::rng(), "Raw"); const std::string context = "shared context value"; Botan::SymmetricKey a_key = a_ka.derive_key(32, b_pub_key->public_value(), context); Botan::SymmetricKey b_key = b_ka.derive_key(32, a_pub_key->public_value(), context); if(!result.test_eq("key agreement", a_key.bits_of(), b_key.bits_of())) { result.test_note(a_priv_pem); result.test_note(b_priv_pem); } } else { result.test_failure("Cast back to Curve25519 failed"); } results.push_back(result); } return results; } }; BOTAN_REGISTER_TEST("curve25519_rt", Curve25519_Roundtrip_Test); class Curve25519_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "" }; } std::string algo_name() const override { return "Curve25519"; } }; BOTAN_REGISTER_TEST("curve25519_keygen", Curve25519_Keygen_Tests); #endif } botan-2.4.0/src/tests/test_certstor.cpp000066400000000000000000000333551322470703100201710ustar00rootroot00000000000000/* * (C) 2016 Kai Michaelis, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_CERTSTOR_SQL) #include #include #include #include #include #if defined(BOTAN_HAS_CERTSTOR_SQLITE3) #include #include #endif #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_CERTSTOR_SQL) && defined(BOTAN_HAS_RSA) struct CertificateAndKey { const Botan::X509_Certificate certificate; const std::shared_ptr private_key; bool operator!=(const CertificateAndKey& rhs) const { return std::tie(certificate, private_key) != std::tie(rhs.certificate, rhs.private_key); } }; #if defined(BOTAN_HAS_CERTSTOR_SQLITE3) Test::Result test_certstor_sqlite3_insert_find_remove_test(const std::vector& certsandkeys) { Test::Result result("Certificate Store SQLITE3 - Insert, Find, Remove"); try { auto& rng = Test::rng(); const std::string passwd(reinterpret_cast(rng.random_vec(8).data()), 8); // Just create a database in memory for testing (https://sqlite.org/inmemorydb.html) Botan::Certificate_Store_In_SQLite store(":memory:", passwd, rng); for(const auto& a : certsandkeys) { store.insert_key(a.certificate, *a.private_key); } for(const auto certandkey : certsandkeys) { const auto cert = certandkey.certificate; const auto key = certandkey.private_key; const auto wo_keyid = store.find_cert(cert.subject_dn(), {}); const auto w_keyid = store.find_cert(cert.subject_dn(), cert.subject_key_id()); if(!wo_keyid || !w_keyid) { result.test_failure("Can't retrieve certificate"); return result; } const auto priv = store.find_key(cert); if(!priv && (certsandkeys[1] != certandkey && certsandkeys[0] != certandkey)) { result.test_failure("Can't retrieve private key for " + cert.fingerprint("SHA1")); return result; } result.test_eq("Got wrong certificate", cert.fingerprint(), w_keyid->fingerprint()); if(priv) { result.test_eq("Got wrong private key", key->private_key_bits(), priv->private_key_bits()); const auto rev_certs = store.find_certs_for_key(*priv); if(rev_certs.empty()) { result.test_failure("No certificate"); } else { const bool found = std::any_of(rev_certs.begin(), rev_certs.end(), [&](std::shared_ptr c) { return c->fingerprint() == cert.fingerprint(); }); result.test_eq("Got wrong/no certificate", found, true); } } if(certsandkeys[4] != certandkey && certsandkeys[5] != certandkey) { result.test_eq("Got wrong certificate", cert.fingerprint(), wo_keyid->fingerprint()); } result.test_eq("Can't remove certificate", store.remove_cert(cert), true); result.test_eq("Can't remove certificate", !store.find_cert(cert.subject_dn(), cert.subject_key_id()), true); if(priv) { store.remove_key(*key); } result.test_eq("Can't remove key", !store.find_key(cert), true); } return result; } catch(std::exception& e) { result.test_failure(e.what()); return result; } } Test::Result test_certstor_sqlite3_crl_test(const std::vector& certsandkeys) { Test::Result result("Certificate Store SQLITE3 - CRL"); try { auto& rng = Test::rng(); const std::string passwd(reinterpret_cast(rng.random_vec(8).data()), 8); // Just create a database in memory for testing (https://sqlite.org/inmemorydb.html) Botan::Certificate_Store_In_SQLite store(":memory:", passwd, rng); for(const auto& a : certsandkeys) { store.insert_cert(a.certificate); } store.revoke_cert(certsandkeys[0].certificate, Botan::CA_COMPROMISE); store.revoke_cert(certsandkeys[3].certificate, Botan::CA_COMPROMISE); store.revoke_cert(certsandkeys[3].certificate, Botan::CA_COMPROMISE); { const auto crls = store.generate_crls(); result.test_eq("Can't revoke certificate", crls.size(), 2); result.test_eq("Can't revoke certificate", crls[0].is_revoked(certsandkeys[0].certificate) ^ crls[1].is_revoked(certsandkeys[0].certificate), true); result.test_eq("Can't revoke certificate", crls[0].is_revoked(certsandkeys[3].certificate) ^ crls[1].is_revoked(certsandkeys[3].certificate), true); } store.affirm_cert(certsandkeys[3].certificate); { const auto crls = store.generate_crls(); result.test_eq("Can't revoke certificate, wrong crl size", crls.size(), 1); result.test_eq("Can't revoke certificate, cert 0 not revoked", crls[0].is_revoked(certsandkeys[0].certificate), true); } const auto cert0_crl = store.find_crl_for(certsandkeys[0].certificate); result.test_eq("Can't revoke certificate, crl for cert 0", !cert0_crl, false); result.test_eq("Can't revoke certificate, crl for cert 0 size check", cert0_crl->get_revoked().size(), 1); result.test_eq("Can't revoke certificate, no crl for cert 0", cert0_crl->is_revoked(certsandkeys[0].certificate), true); const auto cert3_crl = store.find_crl_for(certsandkeys[3].certificate); result.test_eq("Can't revoke certificate, crl for cert 3", !cert3_crl, true); return result; } catch(std::exception& e) { result.test_failure(e.what()); return result; } } Test::Result test_certstor_sqlite3_all_subjects_test(const std::vector& certsandkeys) { Test::Result result("Certificate Store SQLITE3 - All subjects"); try { auto& rng = Test::rng(); const std::string passwd(reinterpret_cast(rng.random_vec(8).data()), 8); // Just create a database in memory for testing (https://sqlite.org/inmemorydb.html) Botan::Certificate_Store_In_SQLite store(":memory:", passwd, rng); for(const auto& a : certsandkeys) { store.insert_cert(a.certificate); } const auto subjects = store.all_subjects(); result.test_eq("Check subject list length", subjects.size(), 6); for(const auto sub : subjects) { std::stringstream ss; ss << sub; result.test_eq("Check subject " + ss.str(), certsandkeys[0].certificate.subject_dn() == sub || certsandkeys[1].certificate.subject_dn() == sub || certsandkeys[2].certificate.subject_dn() == sub || certsandkeys[3].certificate.subject_dn() == sub || certsandkeys[4].certificate.subject_dn() == sub || certsandkeys[5].certificate.subject_dn() == sub, true); } return result; } catch(std::exception& e) { result.test_failure(e.what()); return result; } } Test::Result test_certstor_sqlite3_find_all_certs_test(const std::vector& certsandkeys) { Test::Result result("Certificate Store SQLITE3 - Find all certs"); try { auto& rng = Test::rng(); const std::string passwd(reinterpret_cast(rng.random_vec(8).data()), 8); // Just create a database in memory for testing (https://sqlite.org/inmemorydb.html) Botan::Certificate_Store_In_SQLite store(":memory:", passwd, rng); for(const auto& a : certsandkeys) { store.insert_cert(a.certificate); } for(const auto& a : certsandkeys) { auto res_vec = store.find_all_certs(a.certificate.subject_dn(), a.certificate.subject_key_id()); if(res_vec.size() != 1) { result.test_failure("SQLITE all lookup error"); return result; } else { std::stringstream a_ss; a_ss << a.certificate.subject_dn(); std::stringstream res_ss; res_ss << res_vec.at(0)->subject_dn(); result.test_eq("Check subject " + a_ss.str(), a_ss.str(), res_ss.str()); } } Botan::X509_Certificate same_dn_1 = Botan::X509_Certificate( "./src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_sub_ca.ca.pem.crt"); Botan::X509_Certificate same_dn_2 = Botan::X509_Certificate( "./src/tests/data/x509/bsi/cert_path_common_14/cert_path_common_14_wrong_sub_ca.ca.pem.crt"); store.insert_cert(same_dn_1); store.insert_cert(same_dn_2); auto res_vec = store.find_all_certs(same_dn_1.subject_dn(), {}); if(res_vec.size() != 2) { result.test_failure("SQLITE all lookup error (duplicate) " + std::to_string(res_vec.size())); return result; } else { std::stringstream cert_ss; cert_ss << same_dn_1.subject_dn(); std::stringstream res_ss; res_ss << res_vec.at(0)->subject_dn(); result.test_eq("Check subject " + cert_ss.str(), cert_ss.str(), res_ss.str()); res_ss.str(""); res_ss << res_vec.at(1)->subject_dn(); result.test_eq("Check subject " + cert_ss.str(), cert_ss.str(), res_ss.str()); } } catch(const std::exception& e) { result.test_failure(e.what()); return result; } return result; } #endif Test::Result test_certstor_find_hash_subject(const std::vector& certsandkeys) { Test::Result result("Certificate Store - Find by subject hash"); try { Botan::Certificate_Store_In_Memory store; for(const auto& a : certsandkeys) { store.add_certificate(a.certificate); } for(const auto certandkey : certsandkeys) { const auto cert = certandkey.certificate; const auto hash = cert.raw_subject_dn_sha256(); const auto found = store.find_cert_by_raw_subject_dn_sha256(hash); if(!found) { result.test_failure("Can't retrieve certificate " + cert.fingerprint("SHA1")); return result; } result.test_eq("Got wrong certificate", hash, found->raw_subject_dn_sha256()); } const auto found = store.find_cert_by_raw_subject_dn_sha256(std::vector(32, 0)); if(found) { result.test_failure("Certificate found for dummy hash"); return result; } return result; } catch(std::exception& e) { result.test_failure(e.what()); return result; } } class Certstor_Tests final : public Test { public: std::vector run() override { const std::string test_dir = Test::data_dir() + "/x509/certstor"; struct CertificateAndKeyFilenames { const std::string certificate; const std::string private_key; } const certsandkeys_filenames[] { {"cert1.crt", "key01.pem"}, {"cert2.crt", "key01.pem"}, {"cert3.crt", "key03.pem"}, {"cert4.crt", "key04.pem"}, {"cert5a.crt", "key05.pem"}, {"cert5b.crt", "key06.pem"}, }; try { // Do nothing, just test filesystem access Botan::get_files_recursive(test_dir); } catch(Botan::No_Filesystem_Access&) { Test::Result result("Certificate Store"); result.test_note("Skipping due to missing filesystem access"); return {result}; } const std::vector all_files = Botan::get_files_recursive(test_dir); if(all_files.empty()) { Test::Result result("Certificate Store"); result.test_failure("No test files found in " + test_dir); return {result}; } auto& rng = Test::rng(); std::vector certsandkeys; for(const auto& certandkey_filenames : certsandkeys_filenames) { const Botan::X509_Certificate certificate(test_dir + "/" + certandkey_filenames.certificate); std::shared_ptr private_key(Botan::PKCS8::load_key(test_dir + "/" + certandkey_filenames.private_key, rng)); if(!private_key) { Test::Result result("Certificate Store"); result.test_failure("Failed to load key from disk at path: " + test_dir + "/" + certandkey_filenames.private_key); return {result}; } certsandkeys.push_back({certificate, private_key}); } std::vector results; results.push_back(test_certstor_find_hash_subject(certsandkeys)); #if defined(BOTAN_HAS_CERTSTOR_SQLITE3) results.push_back(test_certstor_sqlite3_insert_find_remove_test(certsandkeys)); results.push_back(test_certstor_sqlite3_crl_test(certsandkeys)); results.push_back(test_certstor_sqlite3_all_subjects_test(certsandkeys)); results.push_back(test_certstor_sqlite3_find_all_certs_test(certsandkeys)); #endif return results; } }; BOTAN_REGISTER_TEST("certstor", Certstor_Tests); #endif } } botan-2.4.0/src/tests/test_compression.cpp000066400000000000000000000204461322470703100206620ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_COMPRESSION) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_COMPRESSION) namespace { const char* text_str = "'Twas brillig, and the slithy toves" "Did gyre and gimble in the wabe:" "All mimsy were the borogoves," "And the mome raths outgrabe." "'Beware the Jabberwock, my son!" "The jaws that bite, the claws that catch!" "Beware the Jubjub bird, and shun" "The frumious Bandersnatch!'" "He took his vorpal sword in hand;" "Long time the manxome foe he sought-" "So rested he by the Tumtum tree" "And stood awhile in thought." "And, as in uffish thought he stood," "The Jabberwock, with eyes of flame," "Came whiffling through the tulgey wood," "And burbled as it came!" "One, two! One, two! And through and through" "The vorpal blade went snicker-snack!" "He left it dead, and with its head" "He went galumphing back." "'And hast thou slain the Jabberwock?" "Come to my arms, my beamish boy!" "O frabjous day! Callooh! Callay!'" "He chortled in his joy." "'Twas brillig, and the slithy toves" "Did gyre and gimble in the wabe:" "All mimsy were the borogoves," "And the mome raths outgrabe."; class Compression_Tests final : public Test { public: std::vector run() override { std::vector results; const size_t text_len = std::strlen(text_str); for(std::string algo : { "zlib", "deflate", "gzip", "bz2", "lzma" }) { try { Test::Result result(algo + " compression"); std::unique_ptr c(Botan::make_compressor(algo)); std::unique_ptr d(Botan::make_decompressor(algo)); if(!c || !d) { result.note_missing(algo); continue; } result.test_ne("Not the same name", c->name(), d->name()); const Botan::secure_vector empty; const Botan::secure_vector all_zeros(text_len, 0); const Botan::secure_vector random_binary = Test::rng().random_vec(text_len); const Botan::secure_vector short_text = { 'f', 'o', 'o', '\n' }; const uint8_t* textb = reinterpret_cast(text_str); const Botan::secure_vector text(textb, textb + text_len); const size_t c1_e = run_compression(result, 1, *c, *d, empty); const size_t c9_e = run_compression(result, 9, *c, *d, empty); const size_t c1_z = run_compression(result, 1, *c, *d, all_zeros); const size_t c9_z = run_compression(result, 9, *c, *d, all_zeros); const size_t c1_r = run_compression(result, 1, *c, *d, random_binary); const size_t c9_r = run_compression(result, 9, *c, *d, random_binary); const size_t c1_t = run_compression(result, 1, *c, *d, text); const size_t c9_t = run_compression(result, 9, *c, *d, text); const size_t c1_s = run_compression(result, 1, *c, *d, short_text); const size_t c9_s = run_compression(result, 9, *c, *d, short_text); result.test_gte("Empty input L1 compresses to non-empty output", c1_e, 1); result.test_gte("Empty input L9 compresses to non-empty output", c9_e, 1); result.test_gte("Level 9 compresses empty at least as well as level 1", c1_e, c9_e); result.test_gte("Level 9 compresses zeros at least as well as level 1", c1_z, c9_z); result.test_gte("Level 9 compresses random at least as well as level 1", c1_r, c9_r); result.test_gte("Level 9 compresses text at least as well as level 1", c1_t, c9_t); result.test_gte("Level 9 compresses short text at least as well as level 1", c1_s, c9_s); result.test_lt("Zeros compresses much better than text", c1_z / 8, c1_t); result.test_lt("Text compresses much better than random", c1_t / 2, c1_r); results.push_back(result); } catch(std::exception& e) { results.push_back(Test::Result::Failure("testing " + algo, e.what())); } } return results; } private: // Returns # of bytes of compressed message size_t run_compression(Test::Result& result, size_t level, Botan::Compression_Algorithm& c, Botan::Decompression_Algorithm& d, const Botan::secure_vector& msg) { Botan::secure_vector compressed(2*msg.size()); for(bool with_flush : { true, false }) { try { compressed = msg; c.start(level); c.update(compressed, 0, false); if(with_flush) { Botan::secure_vector flush_bits; c.update(flush_bits, 0, true); compressed += flush_bits; } Botan::secure_vector final_bits; c.finish(final_bits); compressed += final_bits; Botan::secure_vector decompressed = compressed; d.start(); d.update(decompressed); Botan::secure_vector final_outputs; d.finish(final_outputs); decompressed += final_outputs; result.test_eq("compression round tripped", msg, decompressed); } catch(Botan::Exception& e) { result.test_failure(e.what()); } } return compressed.size(); } }; BOTAN_REGISTER_TEST("compression", Compression_Tests); class CompressionCreate_Tests final : public Test { public: std::vector run() override { std::vector results; for(std::string algo : { "zlib", "deflate", "gzip", "bz2", "lzma" }) { try { Test::Result result(algo + " create compression"); std::unique_ptr c1(Botan::Compression_Algorithm::create(algo)); std::unique_ptr d1(Botan::Decompression_Algorithm::create(algo)); if(!c1 || !d1) { result.note_missing(algo); continue; } result.test_ne("Not the same name after create", c1->name(), d1->name()); std::unique_ptr c2(Botan::Compression_Algorithm::create_or_throw(algo)); std::unique_ptr d2(Botan::Decompression_Algorithm::create_or_throw(algo)); if(!c2 || !d2) { result.note_missing(algo); continue; } result.test_ne("Not the same name after create_or_throw", c2->name(), d2->name()); results.push_back(result); } catch(std::exception& e) { results.push_back(Test::Result::Failure("testing " + algo, e.what())); } } { Test::Result result("create invalid compression"); result.test_throws("lookup error", "Unavailable Compression bogocompress", [&]() { Botan::Compression_Algorithm::create_or_throw("bogocompress"); }); result.test_throws("lookup error", "Unavailable Decompression bogocompress", [&]() { Botan::Decompression_Algorithm::create_or_throw("bogocompress"); }); results.push_back(result); } return results; } }; BOTAN_REGISTER_TEST("create_compression", CompressionCreate_Tests); } #endif } botan-2.4.0/src/tests/test_cryptobox.cpp000066400000000000000000000037231322470703100203510ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_CRYPTO_BOX) #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_CRYPTO_BOX) class Cryptobox_Tests final : public Test { public: std::vector run() override { Test::Result result("cryptobox"); for(size_t i = 0; i <= 128; i += 7) { const std::string password = Test::random_password(); const std::vector input = unlock(Test::rng().random_vec(i)); const std::string ciphertext = Botan::CryptoBox::encrypt(input.data(), input.size(), password, Test::rng()); // First verify decryption works try { const Botan::secure_vector decrypted = Botan::CryptoBox::decrypt_bin(ciphertext, password); result.test_eq("decrypt", decrypted, input); } catch(std::exception& e) { result.test_failure("cryptobox decrypt", e.what()); } // Now corrupt a bit and ensure it fails try { std::string corrupted = ciphertext; corrupted[corrupted.size()/2]++; Botan::CryptoBox::decrypt(corrupted, password); result.test_failure("Decrypted corrupted cryptobox message"); } catch(Botan::Decoding_Error) { result.test_success("Rejected corrupted cryptobox message"); } catch(Botan::Invalid_Argument) { result.test_success("Rejected corrupted cryptobox message"); } } return {result}; } }; BOTAN_REGISTER_TEST("cryptobox", Cryptobox_Tests); #endif } } botan-2.4.0/src/tests/test_datastore.cpp000066400000000000000000000040751322470703100203070ustar00rootroot00000000000000/* * (C) 2018 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_X509_CERTIFICATES) #include namespace Botan_Tests { class Datastore_Tests : public Test { public: std::vector run() override { Test::Result result("Data_Store"); Botan::Data_Store ds1; Botan::Data_Store ds2; result.confirm("equality", ds1 == ds2); result.test_eq("has_value", ds1.has_value("key"), false); result.test_eq("get1 with default", ds1.get1("key", "default"), "default"); result.test_throws("get1", "Data_Store::get1: No values set for missing_key", [&ds1]() { ds1.get1("missing_key"); }); result.test_eq("search_for", ds1.search_for([](std::string, std::string) { return true; }).size(), 0); ds1.add("key", "value"); result.test_eq("search_for", ds1.search_for([](std::string, std::string) { return true; }).size(), 1); result.test_eq("equality", ds1 == ds2, false); result.test_eq("has_value", ds1.has_value("key"), true); result.test_eq("get1 with default", ds1.get1("key", "default"), "value"); result.test_eq("get1", ds1.get1("key"), "value"); result.test_eq("get1_memvec", ds1.get1_memvec("memvec").size(), 0); const std::vector memvec = { 9, 1, 1, 4 }; ds1.add("memvec", memvec); result.test_eq("get1_memvec", ds1.get1_memvec("memvec"), memvec); result.test_eq("get1_uint32", ds1.get1_uint32("memvec"), size_t(9010104)); result.test_eq("get1_uint32", ds1.get1_uint32("missing", 999), size_t(999)); ds1.add("key", "value2"); result.test_throws("get1", "Data_Store::get1: More than one value for key", [&ds1]() { ds1.get1("key"); }); result.test_eq("get multiple", ds1.get("key").size(), 2); return {result}; } }; BOTAN_REGISTER_TEST("x509_datastore", Datastore_Tests); } #endif botan-2.4.0/src/tests/test_dh.cpp000066400000000000000000000113001322470703100167010ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include "test_pubkey.h" #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_DIFFIE_HELLMAN) class Diffie_Hellman_KAT_Tests final : public PK_Key_Agreement_Test { public: Diffie_Hellman_KAT_Tests() : PK_Key_Agreement_Test( "Diffie-Hellman", "pubkey/dh.vec", "P,G,X,Y,Msg,OutLen,K", "Q,KDF") {} std::string default_kdf(const VarMap&) const override { return "Raw"; } std::unique_ptr load_our_key(const std::string&, const VarMap& vars) override { const Botan::BigInt p = get_req_bn(vars, "P"); const Botan::BigInt q = get_opt_bn(vars, "Q", 0); const Botan::BigInt g = get_req_bn(vars, "G"); const Botan::BigInt x = get_req_bn(vars, "X"); Botan::DL_Group grp; if(q == 0) { grp = Botan::DL_Group(p, g); } else { grp = Botan::DL_Group(p, q, g); } std::unique_ptr key(new Botan::DH_PrivateKey(Test::rng(), grp, x)); return key; } std::vector load_their_key(const std::string&, const VarMap& vars) override { const Botan::BigInt p = get_req_bn(vars, "P"); const Botan::BigInt q = get_opt_bn(vars, "Q", 0); const Botan::BigInt g = get_req_bn(vars, "G"); const Botan::BigInt y = get_req_bn(vars, "Y"); Botan::DL_Group grp; if(q == 0) { grp = Botan::DL_Group(p, g); } else { grp = Botan::DL_Group(p, q, g); } Botan::DH_PublicKey key(grp, y); return key.public_value(); } std::vector run_final_tests() override { Test::Result result("DH negative tests"); const BigInt g("2"); const BigInt p("58458002095536094658683755258523362961421200751439456159756164191494576279467"); const Botan::DL_Group grp(p, g); const Botan::BigInt x("46205663093589612668746163860870963912226379131190812163519349848291472898748"); std::unique_ptr privkey(new Botan::DH_PrivateKey(Test::rng(), grp, x)); std::unique_ptr kas(new Botan::PK_Key_Agreement(*privkey, rng(), "Raw")); result.test_throws("agreement input too big", "Invalid argument DH agreement - invalid key provided", [&kas]() { const BigInt too_big("584580020955360946586837552585233629614212007514394561597561641914945762794672"); kas->derive_key(16, BigInt::encode(too_big)); }); result.test_throws("agreement input too small", "Invalid argument DH agreement - invalid key provided", [&kas]() { const BigInt too_small("1"); kas->derive_key(16, BigInt::encode(too_small)); }); return{result}; } }; class DH_Invalid_Key_Tests final : public Text_Based_Test { public: DH_Invalid_Key_Tests() : Text_Based_Test("pubkey/dh_invalid.vec", "P,Q,G,InvalidKey") {} bool clear_between_callbacks() const override { return false; } Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("DH invalid keys"); const Botan::BigInt p = get_req_bn(vars, "P"); const Botan::BigInt q = get_req_bn(vars, "Q"); const Botan::BigInt g = get_req_bn(vars, "G"); const Botan::BigInt pubkey = get_req_bn(vars, "InvalidKey"); Botan::DL_Group grp(p, q, g); std::unique_ptr key(new Botan::DH_PublicKey(grp, pubkey)); result.test_eq("public key fails check", key->check_key(Test::rng(), false), false); return result; } }; class Diffie_Hellman_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "modp/ietf/1024" }; } std::string algo_name() const override { return "DH"; } }; BOTAN_REGISTER_TEST("dh_kat", Diffie_Hellman_KAT_Tests); BOTAN_REGISTER_TEST("dh_invalid", DH_Invalid_Key_Tests); BOTAN_REGISTER_TEST("dh_keygen", Diffie_Hellman_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_dl_group.cpp000066400000000000000000000136501322470703100201330ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_DL_GROUP) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_DL_GROUP) namespace { class DL_Group_Tests final : public Test { public: std::vector run() override { std::vector results; Botan::RandomNumberGenerator& rng = Test::rng(); results.push_back(test_dl_encoding()); results.push_back(test_dl_named(rng)); results.push_back(test_dl_generate(rng)); return results; } private: Test::Result test_dl_encoding() { Test::Result result("DL_Group encoding"); const Botan::DL_Group orig("modp/ietf/1024"); const std::string pem1 = orig.PEM_encode(Botan::DL_Group::ANSI_X9_42); const std::string pem2 = orig.PEM_encode(Botan::DL_Group::ANSI_X9_57); const std::string pem3 = orig.PEM_encode(Botan::DL_Group::PKCS_3); Botan::DL_Group group; group.PEM_decode(pem1); result.test_eq("Same p in X9.42 decoding", group.get_p(), orig.get_p()); result.test_eq("Same q in X9.42 decoding", group.get_q(), orig.get_q()); result.test_eq("Same g in X9.42 decoding", group.get_g(), orig.get_g()); group.PEM_decode(pem2); result.test_eq("Same p in X9.57 decoding", group.get_p(), orig.get_p()); result.test_eq("Same q in X9.57 decoding", group.get_q(), orig.get_q()); result.test_eq("Same g in X9.57 decoding", group.get_g(), orig.get_g()); group.PEM_decode(pem3); result.test_eq("Same p in X9.57 decoding", group.get_p(), orig.get_p()); // no q in PKCS #3 format result.test_eq("Same g in X9.57 decoding", group.get_g(), orig.get_g()); return result; } Test::Result test_dl_generate(Botan::RandomNumberGenerator& rng) { Test::Result result("DL_Group generate"); result.start_timer(); Botan::DL_Group dh1050(rng, Botan::DL_Group::Prime_Subgroup, 1050, 175); result.test_eq("DH p size", dh1050.get_p().bits(), 1050); result.test_eq("DH q size", dh1050.get_q().bits(), 175); result.test_lte("DH g size", dh1050.get_g().bits(), 1050); result.test_eq("DH group verifies", dh1050.verify_group(rng, true), true); #if defined(BOTAN_HAS_SHA1) Botan::DL_Group dsa1024(rng, Botan::DL_Group::DSA_Kosherizer, 1024); result.test_eq("DSA p size", dsa1024.get_p().bits(), 1024); result.test_eq("DSA q size", dsa1024.get_q().bits(), 160); result.test_lte("DSA g size", dsa1024.get_g().bits(), 1024); result.test_eq("DSA group verifies", dsa1024.verify_group(rng, true), true); #endif #if defined(BOTAN_HAS_SHA1) // From FIPS 186-3 test data const std::vector seed = Botan::hex_decode("1F5DA0AF598EEADEE6E6665BF880E63D8B609BA2"); result.test_throws("invalid params", [&]() { Botan::DL_Group invalid(rng, seed, 1024, 224); }); result.test_throws("invalid params", [&]() { Botan::DL_Group invalid(rng, seed, 3072, 224); }); result.test_throws("invalid params", [&]() { Botan::DL_Group invalid(rng, seed, 2048, 256); }); Botan::DL_Group dsa_from_seed(rng, seed, 1024, 160); result.test_eq("DSA q from seed", dsa_from_seed.get_q(), Botan::BigInt("0xAB1A788BCE3C557A965A5BFA6908FAA665FDEB7D")); // Modulo just to avoid embedding entire 1024-bit P in src file result.test_eq("DSA p from seed", static_cast(dsa_from_seed.get_p() % 4294967291), size_t(2513712339)); result.test_eq("DSA group from seed verifies", dsa_from_seed.verify_group(rng, true), true); #endif result.end_timer(); return result; } Test::Result test_dl_named(Botan::RandomNumberGenerator& rng) { const std::vector dl_named = { "modp/ietf/1024", "modp/ietf/1536", "modp/ietf/2048", "modp/ietf/3072", "modp/ietf/4096", "modp/ietf/6144", "modp/ietf/8192", "modp/srp/1024", "modp/srp/1536", "modp/srp/2048", "modp/srp/3072", "modp/srp/4096", "modp/srp/6144", "modp/srp/8192", "dsa/jce/1024", "dsa/botan/2048", "dsa/botan/3072", "ffdhe/ietf/2048", "ffdhe/ietf/3072", "ffdhe/ietf/4096", "ffdhe/ietf/6144", "ffdhe/ietf/8192", }; Test::Result result("DL_Group named"); result.start_timer(); for(std::string name : dl_named) { // Confirm we can load every group we expect Botan::DL_Group group(name); result.test_ne("DL_Group p is set", group.get_p(), 0); result.test_ne("DL_Group g is set", group.get_g(), 0); if(name.find("/srp/") == std::string::npos) { try { group.get_q(); // confirm all our non-SRP groups have q } catch(Botan::Invalid_State&) { result.test_failure("Group " + name + " has no q"); } } if(group.get_p().bits() < 2048 || Test::run_long_tests()) { // These two groups fail verification because pow(g,q,p) != 1 if(name != "modp/srp/1024" && name != "modp/srp/2048") { result.test_eq(name + " verifies", group.verify_group(rng, false), true); } } } result.end_timer(); return result; } }; BOTAN_REGISTER_TEST("dl_group", DL_Group_Tests); } #endif } botan-2.4.0/src/tests/test_dlies.cpp000066400000000000000000000142041322470703100174140ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_DLIES) && defined(BOTAN_HAS_DIFFIE_HELLMAN) #include "test_pubkey.h" #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_DLIES) && defined(BOTAN_HAS_DIFFIE_HELLMAN) class DLIES_KAT_Tests final : public Text_Based_Test { public: DLIES_KAT_Tests() : Text_Based_Test( "pubkey/dlies.vec", "Kdf,Mac,MacKeyLen,IV,Group,X1,X2,Msg,Ciphertext") {} Test::Result run_one_test(const std::string& cipher_algo, const VarMap& vars) override { const Botan::BigInt x1 = get_req_bn(vars, "X1"); const Botan::BigInt x2 = get_req_bn(vars, "X2"); const std::vector input = get_req_bin(vars, "Msg"); const std::vector expected = get_req_bin(vars, "Ciphertext"); const std::string kdf_algo = get_req_str(vars, "Kdf"); const std::string mac_algo = get_req_str(vars, "Mac"); const size_t mac_key_len = get_req_sz(vars, "MacKeyLen"); const std::string group_name = get_req_str(vars, "Group"); const std::vector iv = get_opt_bin(vars, "IV"); Test::Result result("DLIES " + cipher_algo); std::unique_ptr kdf(Botan::KDF::create(kdf_algo)); if(!kdf) { result.test_note("Skipping due to missing KDF: " + kdf_algo); return result; } std::unique_ptr mac(Botan::MAC::create(mac_algo)); if(!mac) { result.test_note("Skipping due to missing MAC: " + mac_algo); return result; } std::unique_ptr enc; std::unique_ptr dec; size_t cipher_key_len = 0; if(cipher_algo != "XOR") { enc.reset(Botan::get_cipher_mode(cipher_algo, Botan::ENCRYPTION)); dec.reset(Botan::get_cipher_mode(cipher_algo, Botan::DECRYPTION)); if(!enc || !dec) { result.test_note("Skipping due to missing cipher: " + mac_algo); return result; } cipher_key_len = enc->key_spec().maximum_keylength(); } Botan::DL_Group domain(group_name); Botan::DH_PrivateKey from(Test::rng(), domain, x1); Botan::DH_PrivateKey to(Test::rng(), domain, x2); Botan::DLIES_Encryptor encryptor(from, Test::rng(), kdf->clone(), enc.release(), cipher_key_len, mac->clone(), mac_key_len); Botan::DLIES_Decryptor decryptor(to, Test::rng(), kdf.release(), dec.release(), cipher_key_len, mac.release(), mac_key_len); if(!iv.empty()) { encryptor.set_initialization_vector(iv); decryptor.set_initialization_vector(iv); } encryptor.set_other_key(to.public_value()); result.test_eq("encryption", encryptor.encrypt(input, Test::rng()), expected); result.test_eq("decryption", decryptor.decrypt(expected), input); check_invalid_ciphertexts(result, decryptor, input, expected); return result; } }; BOTAN_REGISTER_TEST("dlies", DLIES_KAT_Tests); Test::Result test_xor() { Test::Result result("DLIES XOR"); std::vector kdfs = { "KDF2(SHA-512)", "KDF1-18033(SHA-512)" }; std::vector macs = { "HMAC(SHA-512)", "CMAC(AES-128)" }; const size_t mac_key_len = 16; std::unique_ptr kdf; std::unique_ptr mac; Botan::DH_PrivateKey alice(Test::rng(), Botan::DL_Group("modp/ietf/2048")); Botan::DH_PrivateKey bob(Test::rng(), Botan::DL_Group("modp/ietf/2048")); for(const auto& kfunc : kdfs) { kdf = Botan::KDF::create(kfunc); if(!kdf) { result.test_note("Skipping due to missing KDF: " + kfunc); continue; } for(const auto& mfunc : macs) { mac = Botan::MAC::create(mfunc); if(!mac) { result.test_note("Skipping due to missing MAC: " + mfunc); continue; } Botan::DLIES_Encryptor encryptor(alice, Test::rng(), kdf->clone(), mac->clone(), mac_key_len); // negative test: other pub key not set Botan::secure_vector plaintext = Test::rng().random_vec(32); result.test_throws("encrypt not possible without setting other public key", [&encryptor, &plaintext]() { encryptor.encrypt(plaintext, Test::rng()); }); encryptor.set_other_key(bob.public_value()); std::vector ciphertext = encryptor.encrypt(plaintext, Test::rng()); Botan::DLIES_Decryptor decryptor(bob, Test::rng(), kdf->clone(), mac->clone(), mac_key_len); // negative test: ciphertext too short result.test_throws("ciphertext too short", [ &decryptor ]() { decryptor.decrypt(std::vector(2)); }); result.test_eq("decryption", decryptor.decrypt(ciphertext), plaintext); check_invalid_ciphertexts(result, decryptor, unlock(plaintext), ciphertext); } } return result; } class DLIES_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; std::vector> fns = { test_xor }; for(size_t i = 0; i != fns.size(); ++i) { try { results.push_back(fns[ i ]()); } catch(std::exception& e) { results.push_back(Test::Result::Failure("DLIES unit tests " + std::to_string(i), e.what())); } } return results; } }; BOTAN_REGISTER_TEST("dlies_unit", DLIES_Unit_Tests); #endif } } botan-2.4.0/src/tests/test_dsa.cpp000066400000000000000000000034561322470703100170720ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_DSA) #include #include "test_pubkey.h" #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_DSA) class DSA_KAT_Tests final : public PK_Signature_Generation_Test { public: DSA_KAT_Tests() : PK_Signature_Generation_Test( "DSA", #if defined(BOTAN_HAS_RFC6979_GENERATOR) "pubkey/dsa_rfc6979.vec", "P,Q,G,X,Hash,Msg,Signature", #else "pubkey/dsa_prob.vec", "P,Q,G,X,Hash,Msg,Nonce,Signature", #endif "") {} bool clear_between_callbacks() const override { return false; } std::unique_ptr load_private_key(const VarMap& vars) override { const Botan::BigInt p = get_req_bn(vars, "P"); const Botan::BigInt q = get_req_bn(vars, "Q"); const Botan::BigInt g = get_req_bn(vars, "G"); const Botan::BigInt x = get_req_bn(vars, "X"); const Botan::DL_Group grp(p, q, g); std::unique_ptr key(new Botan::DSA_PrivateKey(Test::rng(), grp, x)); return key; } std::string default_padding(const VarMap& vars) const override { return "EMSA1(" + get_req_str(vars, "Hash") + ")"; } }; class DSA_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "dsa/jce/1024" }; } std::string algo_name() const override { return "DSA"; } }; BOTAN_REGISTER_TEST("dsa_sign", DSA_KAT_Tests); BOTAN_REGISTER_TEST("dsa_keygen", DSA_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_ecc_pointmul.cpp000066400000000000000000000021451322470703100207760ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ECDSA) #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECDSA) class ECC_Pointmult_Tests final : public Text_Based_Test { public: ECC_Pointmult_Tests() : Text_Based_Test("pubkey/ecc.vec", "m,X,Y") {} Test::Result run_one_test(const std::string& group_id, const VarMap& vars) override { const Botan::BigInt m = get_req_bn(vars, "m"); const Botan::BigInt X = get_req_bn(vars, "X"); const Botan::BigInt Y = get_req_bn(vars, "Y"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); const Botan::PointGFp p = group.get_base_point() * m; Test::Result result("ECC Scalarmult " + group_id); result.test_eq("affine X", p.get_affine_x(), X); result.test_eq("affine Y", p.get_affine_y(), Y); return result; } }; BOTAN_REGISTER_TEST("ecc_pointmul", ECC_Pointmult_Tests); #endif } } botan-2.4.0/src/tests/test_ecdh.cpp000066400000000000000000000032671322470703100172260ustar00rootroot00000000000000/* * (C) 2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ECDH) #include "test_pubkey.h" #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECDH) class ECDH_KAT_Tests final : public PK_Key_Agreement_Test { public: ECDH_KAT_Tests() : PK_Key_Agreement_Test( "ECDH", "pubkey/ecdh.vec", "Group,Secret,CounterKey,K", "KDF") {} std::string default_kdf(const VarMap&) const override { return "Raw"; } std::unique_ptr load_our_key(const std::string& group_id, const VarMap& vars) override { Botan::EC_Group group(group_id); const Botan::BigInt secret = get_req_bn(vars, "Secret"); std::unique_ptr key(new Botan::ECDH_PrivateKey(Test::rng(), group, secret)); return key; } std::vector load_their_key(const std::string&, const VarMap& vars) override { return get_req_bin(vars, "CounterKey"); } }; class ECDH_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1", "brainpool256r1", "brainpool384r1", "brainpool512r1", "frp256v1" }; } std::string algo_name() const override { return "ECDH"; } }; BOTAN_REGISTER_TEST("ecdh_kat", ECDH_KAT_Tests); BOTAN_REGISTER_TEST("ecdh_keygen", ECDH_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_ecdsa.cpp000066400000000000000000000075261322470703100174040ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * (C) 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_ECDSA) #include "test_pubkey.h" #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECDSA) class ECDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: ECDSA_Signature_KAT_Tests() : PK_Signature_Generation_Test( "ECDSA", #if defined(BOTAN_HAS_RFC6979_GENERATOR) "pubkey/ecdsa_rfc6979.vec", "Group,X,Hash,Msg,Signature") {} #else "pubkey/ecdsa_prob.vec", "Group,X,Hash,Msg,Nonce,Signature") {} #endif bool clear_between_callbacks() const override { return false; } std::unique_ptr load_private_key(const VarMap& vars) override { const std::string group_id = get_req_str(vars, "Group"); const BigInt x = get_req_bn(vars, "X"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::ECDSA_PrivateKey(Test::rng(), group, x)); return key; } std::string default_padding(const VarMap& vars) const override { const std::string hash = get_req_str(vars, "Hash"); if(hash.substr(0,3) == "Raw") return hash; return "EMSA1(" + hash + ")"; } #if !defined(BOTAN_HAS_RFC6979) Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override { // probabilistic ecdsa signature generation extracts more random than just the nonce, // but the nonce is extracted first return new Fixed_Output_Position_RNG(nonce, 1); } #endif }; class ECDSA_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1", "frp256v1" }; } std::string algo_name() const override { return "ECDSA"; } }; class ECDSA_Invalid_Key_Tests final : public Text_Based_Test { public: ECDSA_Invalid_Key_Tests() : Text_Based_Test("pubkey/ecdsa_invalid.vec", "Group,InvalidKeyX,InvalidKeyY") {} bool clear_between_callbacks() const override { return false; } Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("ECDSA invalid keys"); const std::string group_id = get_req_str(vars, "Group"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); const Botan::BigInt x = get_req_bn(vars, "InvalidKeyX"); const Botan::BigInt y = get_req_bn(vars, "InvalidKeyY"); std::unique_ptr public_point; try { public_point.reset(new Botan::PointGFp(group.get_curve(), x, y)); } catch(Botan::Invalid_Argument&) { // PointGFp() performs a range check on x, y in [0, p−1], // which is also part of the EC public key checks, e.g., // in NIST SP800-56A rev2, sec. 5.6.2.3.2 result.test_success("public key fails check"); return result; } std::unique_ptr key(new Botan::ECDSA_PublicKey(group, *public_point)); result.test_eq("public key fails check", key->check_key(Test::rng(), false), false); return result; } }; BOTAN_REGISTER_TEST("ecdsa_sign", ECDSA_Signature_KAT_Tests); BOTAN_REGISTER_TEST("ecdsa_keygen", ECDSA_Keygen_Tests); BOTAN_REGISTER_TEST("ecdsa_invalid", ECDSA_Invalid_Key_Tests); #endif } } botan-2.4.0/src/tests/test_ecgdsa.cpp000066400000000000000000000040021322470703100175350ustar00rootroot00000000000000/* * (C) 2016 René Korthaus, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_ECGDSA) #include "test_pubkey.h" #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECGDSA) class ECGDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: ECGDSA_Signature_KAT_Tests() : PK_Signature_Generation_Test( "ECGDSA", "pubkey/ecgdsa.vec", "Group,X,Hash,Msg,Nonce,Signature") {} bool clear_between_callbacks() const override { return false; } std::unique_ptr load_private_key(const VarMap& vars) override { const std::string group_id = get_req_str(vars, "Group"); const BigInt x = get_req_bn(vars, "X"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::ECGDSA_PrivateKey(Test::rng(), group, x)); return key; } std::string default_padding(const VarMap& vars) const override { return "EMSA1(" + get_req_str(vars, "Hash") + ")"; } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override { // ecgdsa signature generation extracts more random than just the nonce, // but the nonce is extracted first return new Fixed_Output_Position_RNG(nonce, 1); } }; class ECGDSA_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1" }; } std::string algo_name() const override { return "ECGDSA"; } }; BOTAN_REGISTER_TEST("ecgdsa_sign", ECGDSA_Signature_KAT_Tests); BOTAN_REGISTER_TEST("ecgdsa_keygen", ECGDSA_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_ecies.cpp000066400000000000000000000455571322470703100174230ustar00rootroot00000000000000/* * (C) 2016 Philipp Weber * (C) 2016 Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ECIES) #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECIES) using Flags = Botan::ECIES_Flags; Botan::PointGFp::Compression_Type get_compression_type(const std::string& format) { if(format == "uncompressed") { return Botan::PointGFp::UNCOMPRESSED; } else if(format == "compressed") { return Botan::PointGFp::COMPRESSED; } else if(format == "hybrid") { return Botan::PointGFp::HYBRID; } throw Botan::Invalid_Argument("invalid compression format"); } Flags ecies_flags(bool cofactor_mode, bool old_cofactor_mode, bool check_mode, bool single_hash_mode) { return (cofactor_mode ? Flags::COFACTOR_MODE : Flags::NONE) | (single_hash_mode ? Flags::SINGLE_HASH_MODE : Flags::NONE) | (old_cofactor_mode ? Flags::OLD_COFACTOR_MODE : Flags::NONE) | (check_mode ? Flags::CHECK_MODE : Flags::NONE); } void check_encrypt_decrypt(Test::Result& result, const Botan::ECDH_PrivateKey& private_key, const Botan::ECDH_PrivateKey& other_private_key, const Botan::ECIES_System_Params& ecies_params, const Botan::InitializationVector& iv, const std::string& label, const std::vector& plaintext, const std::vector& ciphertext) { Botan::ECIES_Encryptor ecies_enc(private_key, ecies_params, Test::rng()); ecies_enc.set_other_key(other_private_key.public_point()); Botan::ECIES_Decryptor ecies_dec(other_private_key, ecies_params, Test::rng()); if(!iv.bits_of().empty()) { ecies_enc.set_initialization_vector(iv); ecies_dec.set_initialization_vector(iv); } if(!label.empty()) { ecies_enc.set_label(label); ecies_dec.set_label(label); } try { const std::vector encrypted = ecies_enc.encrypt(plaintext, Test::rng()); if(!ciphertext.empty()) { result.test_eq("encrypted data", encrypted, ciphertext); } const Botan::secure_vector decrypted = ecies_dec.decrypt(encrypted); result.test_eq("decrypted data equals plaintext", decrypted, plaintext); std::vector invalid_encrypted = encrypted; uint8_t& last_byte = invalid_encrypted[invalid_encrypted.size() - 1]; last_byte = ~last_byte; result.test_throws("throw on invalid ciphertext", [&ecies_dec, &invalid_encrypted] { ecies_dec.decrypt(invalid_encrypted); }); } catch(Botan::Lookup_Error& e) { result.test_note(std::string("Test not executed: ") + e.what()); } } void check_encrypt_decrypt(Test::Result& result, const Botan::ECDH_PrivateKey& private_key, const Botan::ECDH_PrivateKey& other_private_key, const Botan::ECIES_System_Params& ecies_params, size_t iv_length = 0) { const std::vector plaintext { 1, 2, 3 }; check_encrypt_decrypt(result, private_key, other_private_key, ecies_params, std::vector(iv_length, 0), "", plaintext, std::vector()); } #if defined(BOTAN_HAS_KDF1_18033) && defined(BOTAN_HAS_SHA1) class ECIES_ISO_Tests final : public Text_Based_Test { public: ECIES_ISO_Tests() : Text_Based_Test( "pubkey/ecies-18033.vec", "format,p,a,b,mu,nu,gx,gy,hx,hy,x,r,C0,K") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("ECIES-ISO"); // get test vectors defined by ISO 18033 const Botan::PointGFp::Compression_Type compression_type = get_compression_type(get_req_str(vars, "format")); const Botan::BigInt p = get_req_bn(vars, "p"); const Botan::BigInt a = get_req_bn(vars, "a"); const Botan::BigInt b = get_req_bn(vars, "b"); const Botan::BigInt mu = get_req_bn(vars, "mu"); // order const Botan::BigInt nu = get_req_bn(vars, "nu"); // cofactor const Botan::BigInt gx = get_req_bn(vars, "gx"); // base point x const Botan::BigInt gy = get_req_bn(vars, "gy"); // base point y const Botan::BigInt hx = get_req_bn(vars, "hx"); // x of public point of bob const Botan::BigInt hy = get_req_bn(vars, "hy"); // y of public point of bob const Botan::BigInt x = get_req_bn(vars, "x"); // private key of bob const Botan::BigInt r = get_req_bn(vars, "r"); // (ephemeral) private key of alice const std::vector c0 = get_req_bin(vars, "C0"); // expected encoded (ephemeral) public key const std::vector k = get_req_bin(vars, "K"); // expected derived secret const Botan::CurveGFp curve(p, a, b); const Botan::EC_Group domain(curve, Botan::PointGFp(curve, gx, gy), mu, nu); // keys of bob const Botan::ECDH_PrivateKey other_private_key(Test::rng(), domain, x); const Botan::PointGFp other_public_key_point(curve, hx, hy); const Botan::ECDH_PublicKey other_public_key(domain, other_public_key_point); // (ephemeral) keys of alice const Botan::ECDH_PrivateKey eph_private_key(Test::rng(), domain, r); const Botan::PointGFp eph_public_key_point = eph_private_key.public_point(); const std::vector eph_public_key_bin = Botan::unlock( Botan::EC2OSP(eph_public_key_point, compression_type)); result.test_eq("encoded (ephemeral) public key", eph_public_key_bin, c0); // test secret derivation: ISO 18033 test vectors use KDF1 from ISO 18033 // no cofactor-/oldcofactor-/singlehash-/check-mode and 128 byte secret length Botan::ECIES_KA_Params ka_params(eph_private_key.domain(), "KDF1-18033(SHA-1)", 128, compression_type, Flags::NONE); const Botan::ECIES_KA_Operation ka(eph_private_key, ka_params, true, Test::rng()); const Botan::SymmetricKey secret_key = ka.derive_secret(eph_public_key_bin, other_public_key_point); result.test_eq("derived secret key", secret_key.bits_of(), k); // test encryption / decryption for(auto comp_type : { Botan::PointGFp::UNCOMPRESSED, Botan::PointGFp::COMPRESSED, Botan::PointGFp::HYBRID }) { for(bool cofactor_mode : { true, false }) { for(bool single_hash_mode : { true, false }) { for(bool old_cofactor_mode : { true, false }) { for(bool check_mode : { true, false }) { Flags flags = ecies_flags(cofactor_mode, old_cofactor_mode, check_mode, single_hash_mode); if(size_t(cofactor_mode) + size_t(check_mode) + size_t(old_cofactor_mode) > 1) { auto onThrow = [&]() { Botan::ECIES_System_Params(eph_private_key.domain(), "KDF2(SHA-1)", "AES-256/CBC", 32, "HMAC(SHA-1)", 20, comp_type, flags); }; result.test_throws("throw on invalid ECIES_Flags", onThrow); continue; } Botan::ECIES_System_Params ecies_params(eph_private_key.domain(), "KDF2(SHA-1)", "AES-256/CBC", 32, "HMAC(SHA-1)", 20, comp_type, flags); check_encrypt_decrypt(result, eph_private_key, other_private_key, ecies_params, 16); } } } } } return result; } }; BOTAN_REGISTER_TEST("ecies_iso", ECIES_ISO_Tests); #endif class ECIES_Tests final : public Text_Based_Test { public: ECIES_Tests() : Text_Based_Test( "pubkey/ecies.vec", "Curve,PrivateKey,OtherPrivateKey,Kdf,Dem,DemKeyLen,Iv,Mac,MacKeyLen,Format," "CofactorMode,OldCofactorMode,CheckMode,SingleHashMode,Label,Plaintext,Ciphertext") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("ECIES"); const std::string curve = get_req_str(vars, "Curve"); const Botan::BigInt private_key_value = get_req_bn(vars, "PrivateKey"); const Botan::BigInt other_private_key_value = get_req_bn(vars, "OtherPrivateKey"); const std::string kdf = get_req_str(vars, "Kdf"); const std::string dem = get_req_str(vars, "Dem"); const size_t dem_key_len = get_req_sz(vars, "DemKeyLen"); const std::vector iv = get_req_bin(vars, "Iv"); const std::string mac = get_req_str(vars, "Mac"); const size_t mac_key_len = get_req_sz(vars, "MacKeyLen"); const Botan::PointGFp::Compression_Type compression_type = get_compression_type(get_req_str(vars, "Format")); const bool cofactor_mode = get_req_sz(vars, "CofactorMode") != 0; const bool old_cofactor_mode = get_req_sz(vars, "OldCofactorMode") != 0; const bool check_mode = get_req_sz(vars, "CheckMode") != 0; const bool single_hash_mode = get_req_sz(vars, "SingleHashMode") != 0; const std::string label = get_req_str(vars, "Label"); const std::vector plaintext = get_req_bin(vars, "Plaintext"); const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); const Flags flags = ecies_flags(cofactor_mode, old_cofactor_mode, check_mode, single_hash_mode); const Botan::EC_Group domain(curve); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECDH_PrivateKey other_private_key(Test::rng(), domain, other_private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), kdf, dem, dem_key_len, mac, mac_key_len, compression_type, flags); check_encrypt_decrypt(result, private_key, other_private_key, ecies_params, iv, label, plaintext, ciphertext); return result; } }; BOTAN_REGISTER_TEST("ecies", ECIES_Tests); #if defined(BOTAN_HAS_KDF1_18033) && defined(BOTAN_HAS_HMAC) && defined(BOTAN_HAS_AES) Test::Result test_other_key_not_set() { Test::Result result("ECIES other key not set"); const Flags flags = ecies_flags(false, false, false, true); const Botan::EC_Group domain("secp521r1"); const Botan::BigInt private_key_value("405029866705438137604064977397053031159826489755682166267763407" "5002761777100287880684822948852132235484464537021197213998300006" "547176718172344447619746779823"); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), "KDF1-18033(SHA-512)", "AES-256/CBC", 32, "HMAC(SHA-512)", 20, Botan::PointGFp::Compression_Type::COMPRESSED, flags); Botan::ECIES_Encryptor ecies_enc(private_key, ecies_params, Test::rng()); result.test_throws("encrypt not possible without setting other public key", [ &ecies_enc ]() { ecies_enc.encrypt(std::vector(8), Test::rng()); }); return result; } Test::Result test_kdf_not_found() { Test::Result result("ECIES kdf not found"); const Flags flags = ecies_flags(false, false, false, true); const Botan::EC_Group domain("secp521r1"); const Botan::BigInt private_key_value("405029866705438137604064977397053031159826489755682166267763407" "5002761777100287880684822948852132235484464537021197213998300006" "547176718172344447619746779823"); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), "KDF-XYZ(SHA-512)", "AES-256/CBC", 32, "HMAC(SHA-512)", 20, Botan::PointGFp::Compression_Type::COMPRESSED, flags); Botan::ECIES_Encryptor ecies_enc(private_key, ecies_params, Test::rng()); result.test_throws("kdf not found", [ &ecies_enc ]() { ecies_enc.encrypt(std::vector(8), Test::rng()); }); return result; } Test::Result test_mac_not_found() { Test::Result result("ECIES mac not found"); const Flags flags = ecies_flags(false, false, false, true); const Botan::EC_Group domain("secp521r1"); const Botan::BigInt private_key_value("405029866705438137604064977397053031159826489755682166267763407" "5002761777100287880684822948852132235484464537021197213998300006" "547176718172344447619746779823"); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), "KDF1-18033(SHA-512)", "AES-256/CBC", 32, "XYZMAC(SHA-512)", 20, Botan::PointGFp::Compression_Type::COMPRESSED, flags); Botan::ECIES_Encryptor ecies_enc(private_key, ecies_params, Test::rng()); result.test_throws("mac not found", [ &ecies_enc ]() { ecies_enc.encrypt(std::vector(8), Test::rng()); }); return result; } Test::Result test_cipher_not_found() { Test::Result result("ECIES cipher not found"); const Flags flags = ecies_flags(false, false, false, true); const Botan::EC_Group domain("secp521r1"); const Botan::BigInt private_key_value("405029866705438137604064977397053031159826489755682166267763407" "5002761777100287880684822948852132235484464537021197213998300006" "547176718172344447619746779823"); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), "KDF1-18033(SHA-512)", "AES-XYZ-256/CBC", 32, "HMAC(SHA-512)", 20, Botan::PointGFp::Compression_Type::COMPRESSED, flags); Botan::ECIES_Encryptor ecies_enc(private_key, ecies_params, Test::rng()); result.test_throws("cipher not found", [ &ecies_enc ]() { ecies_enc.encrypt(std::vector(8), Test::rng()); }); return result; } Test::Result test_system_params_short_ctor() { Test::Result result("ECIES short system params ctor"); const Botan::EC_Group domain("secp521r1"); const Botan::BigInt private_key_value("405029866705438137604064977397053031159826489755682166267763407" "5002761777100287880684822948852132235484464537021197213998300006" "547176718172344447619746779823"); const Botan::BigInt other_private_key_value("2294226772740614508941417891614236736606752960073669253551166842" "5866095315090327914760325168219669828915074071456176066304457448" "25404691681749451640151380153"); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECDH_PrivateKey other_private_key(Test::rng(), domain, other_private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), "KDF1-18033(SHA-512)", "AES-256/CBC", 32, "HMAC(SHA-512)", 16); const Botan::InitializationVector iv("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); const std::string label = "Test"; const std::vector plaintext = Botan::hex_decode("000102030405060708090A0B0C0D0E0F"); // generated with botan const std::vector ciphertext = Botan::hex_decode("0401519EAA0489FF9D51E98E4C22349463E2001CD06F8CE47D81D4007A" "79ACF98E92C814686477CEA666EFC277DC84E15FC95E38AFF8E16D478A" "44CD5C5F1517F8B1F300000591317F261C3D04A7207F01EAE3EC70F2360" "0F82C53CC0B85BE7AC9F6CE79EF2AB416E5934D61BA9D346385D7545C57F" "77C7EA7C58E18C70CBFB0A24AE1B9943EC5A8D0657522CCDF30BA95674D81" "B397635D215178CD13BD9504AE957A9888F4128FFC0F0D3F1CEC646AEC8CE" "3F2463D233B22A7A12B679F4C06501F584D4DEFF6D26592A8D873398BD892" "B477B3468813C053DA43C4F3D49009F7A12D6EF7"); check_encrypt_decrypt(result, private_key, other_private_key, ecies_params, iv, label, plaintext, ciphertext); return result; } Test::Result test_ciphertext_too_short() { Test::Result result("ECIES ciphertext too short"); const Botan::EC_Group domain("secp521r1"); const Botan::BigInt private_key_value("405029866705438137604064977397053031159826489755682166267763407" "5002761777100287880684822948852132235484464537021197213998300006" "547176718172344447619746779823"); const Botan::BigInt other_private_key_value("2294226772740614508941417891614236736606752960073669253551166842" "5866095315090327914760325168219669828915074071456176066304457448" "25404691681749451640151380153"); const Botan::ECDH_PrivateKey private_key(Test::rng(), domain, private_key_value); const Botan::ECDH_PrivateKey other_private_key(Test::rng(), domain, other_private_key_value); const Botan::ECIES_System_Params ecies_params(private_key.domain(), "KDF1-18033(SHA-512)", "AES-256/CBC", 32, "HMAC(SHA-512)", 16); Botan::ECIES_Decryptor ecies_dec(other_private_key, ecies_params, Test::rng()); result.test_throws("ciphertext too short", [ &ecies_dec ]() { ecies_dec.decrypt(Botan::hex_decode("0401519EAA0489FF9D51E98E4C22349A")); }); return result; } class ECIES_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; std::vector> fns = { test_other_key_not_set, test_kdf_not_found, test_mac_not_found, test_cipher_not_found, test_system_params_short_ctor, test_ciphertext_too_short }; for(size_t i = 0; i != fns.size(); ++i) { try { results.push_back(fns[ i ]()); } catch(std::exception& e) { results.push_back(Test::Result::Failure("ECIES unit tests " + std::to_string(i), e.what())); } } return results; } }; BOTAN_REGISTER_TEST("ecies_unit", ECIES_Unit_Tests); #endif #endif } } botan-2.4.0/src/tests/test_eckcdsa.cpp000066400000000000000000000040401322470703100177060ustar00rootroot00000000000000/* * (C) 2016 René Korthaus, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_ECKCDSA) #include "test_pubkey.h" #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECKCDSA) class ECKCDSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: ECKCDSA_Signature_KAT_Tests() : PK_Signature_Generation_Test( "ECKCDSA", "pubkey/eckcdsa.vec", "Group,X,Hash,Msg,Nonce,Signature") {} bool clear_between_callbacks() const override { return false; } std::unique_ptr load_private_key(const VarMap& vars) override { const std::string group_id = get_req_str(vars, "Group"); const BigInt x = get_req_bn(vars, "X"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::ECKCDSA_PrivateKey(Test::rng(), group, x)); return key; } std::string default_padding(const VarMap& vars) const override { return "EMSA1(" + get_req_str(vars, "Hash") + ")"; } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override { // eckcdsa signature generation extracts more random than just the nonce, // but the nonce is extracted first return new Fixed_Output_Position_RNG(nonce, 1); } }; class ECKCDSA_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1" }; } std::string algo_name() const override { return "ECKCDSA"; } }; BOTAN_REGISTER_TEST("eckcdsa_sign", ECKCDSA_Signature_KAT_Tests); BOTAN_REGISTER_TEST("eckcdsa_keygen", ECKCDSA_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_ed25519.cpp000066400000000000000000000055331322470703100173170ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ED25519) #include "test_pubkey.h" #include #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ED25519) class Ed25519_Signature_Tests final : public PK_Signature_Generation_Test { public: Ed25519_Signature_Tests() : PK_Signature_Generation_Test( "Ed25519", "pubkey/ed25519.vec", "Privkey,Pubkey,Msg,Signature") {} std::unique_ptr load_private_key(const VarMap& vars) override { const std::vector privkey = get_req_bin(vars, "Privkey"); const std::vector pubkey = get_req_bin(vars, "Pubkey"); Botan::secure_vector seed(privkey.begin(), privkey.end()); std::unique_ptr key(new Botan::Ed25519_PrivateKey(seed)); if(key->get_public_key() != pubkey) throw Test_Error("Invalid Ed25519 key in test data"); return std::unique_ptr(key.release()); } }; class Ed25519_Curdle_Format_Tests final : public Test { public: std::vector run() override { // Keys from draft-ietf-curdle-pkix-04.txt const std::string priv_key_str = "-----BEGIN PRIVATE KEY-----\n" "MC4CAQAwBQYDK2VwBCIEINTuctv5E1hK1bbY8fdp+K06/nwoy/HU++CXqI9EdVhC\n" "-----END PRIVATE KEY-----\n"; const std::string pub_key_str = "-----BEGIN PUBLIC KEY-----\n" "MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=\n" "-----END PUBLIC KEY-----\n"; Test::Result result("Ed25519 CURDLE format"); Botan::DataSource_Memory priv_data(priv_key_str); std::unique_ptr priv_key(Botan::PKCS8::load_key(priv_data, Test::rng())); result.confirm("Private key loaded", priv_key != nullptr); Botan::DataSource_Memory pub_data(pub_key_str); std::unique_ptr pub_key(Botan::X509::load_key(pub_data)); result.confirm("Public key loaded", pub_key != nullptr); Botan::PK_Signer signer(*priv_key, Test::rng(), "Pure"); signer.update("message"); std::vector sig = signer.signature(Test::rng()); Botan::PK_Verifier verifier(*pub_key, "Pure"); verifier.update("message"); result.confirm("Signature valid", verifier.check_signature(sig)); return std::vector{result}; } }; BOTAN_REGISTER_TEST("ed25519_sign", Ed25519_Signature_Tests); BOTAN_REGISTER_TEST("ed25519_curdle", Ed25519_Curdle_Format_Tests); #endif } } botan-2.4.0/src/tests/test_elg.cpp000066400000000000000000000026771322470703100170760ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ELGAMAL) #include #include "test_pubkey.h" #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ELGAMAL) class ElGamal_KAT_Tests final : public PK_Encryption_Decryption_Test { public: ElGamal_KAT_Tests() : PK_Encryption_Decryption_Test( "ElGamal", "pubkey/elgamal.vec", "P,G,X,Msg,Nonce,Ciphertext", "Padding") {} std::unique_ptr load_private_key(const VarMap& vars) override { const Botan::BigInt p = get_req_bn(vars, "P"); const Botan::BigInt g = get_req_bn(vars, "G"); const Botan::BigInt x = get_req_bn(vars, "X"); const Botan::DL_Group grp(p, g); std::unique_ptr key(new Botan::ElGamal_PrivateKey(Test::rng(), grp, x)); return key; } }; class ElGamal_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "modp/ietf/1024" }; } std::string algo_name() const override { return "ElGamal"; } }; BOTAN_REGISTER_TEST("elgamal_encrypt", ElGamal_KAT_Tests); BOTAN_REGISTER_TEST("elgamal_keygen", ElGamal_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_entropy.cpp000066400000000000000000000106561322470703100200230ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #include #if defined(BOTAN_HAS_COMPRESSION) #include #endif namespace Botan_Tests { namespace { class Entropy_Source_Tests final : public Test { public: std::vector run() override { Botan::Entropy_Sources& srcs = Botan::Entropy_Sources::global_sources(); std::vector src_names = srcs.enabled_sources(); std::vector results; for(auto const& src_name : src_names) { Test::Result result("Entropy source " + src_name); result.start_timer(); try { SeedCapturing_RNG rng; size_t bits = srcs.poll_just(rng, src_name); result.test_gte("Entropy estimate", rng.seed_material().size() * 8, bits); if(rng.samples() > 0) { result.test_gte("Seed material bytes", rng.seed_material().size(), 1); result.test_gte("Samples", rng.samples(), 1); } result.test_note("poll result", rng.seed_material()); #if defined(BOTAN_HAS_COMPRESSION) if(!rng.seed_material().empty()) { /* * Skip bzip2 both due to OS X problem (GH #394) and because bzip2's * large blocks cause the entropy differential test to fail sometimes. */ for(const std::string comp_algo : { "zlib", "lzma" }) { std::unique_ptr comp(Botan::make_compressor(comp_algo)); if(comp) { size_t comp1_size = 0; try { Botan::secure_vector compressed; compressed.assign(rng.seed_material().begin(), rng.seed_material().end()); comp->start(9); comp->finish(compressed); comp1_size = compressed.size(); result.test_gte(comp_algo + " compressed entropy better than advertised", compressed.size() * 8, bits); } catch(std::exception& e) { result.test_failure(comp_algo + " exception while compressing", e.what()); } SeedCapturing_RNG rng2; size_t bits2 = srcs.poll_just(rng2, src_name); result.test_note("poll 2 result", rng2.seed_material()); try { Botan::secure_vector compressed; compressed.insert(compressed.end(), rng.seed_material().begin(), rng.seed_material().end()); compressed.insert(compressed.end(), rng2.seed_material().begin(), rng2.seed_material().end()); comp->start(); comp->finish(compressed); size_t comp2_size = compressed.size(); result.test_lt("Two blocks of entropy are larger than one", comp1_size, comp2_size); size_t comp_diff = comp2_size - comp1_size; result.test_gte(comp_algo + " diff compressed entropy better than advertised", comp_diff * 8, bits2); } catch(std::exception& e) { result.test_failure(comp_algo + " exception while compressing", e.what()); } } } } #endif } catch(std::exception& e) { result.test_failure("during entropy collection test", e.what()); } result.end_timer(); results.push_back(result); } return results; } }; BOTAN_REGISTER_TEST("entropy", Entropy_Source_Tests); } } botan-2.4.0/src/tests/test_ffi.cpp000066400000000000000000002612461322470703100170720ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * (C) 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include #if defined(BOTAN_HAS_FFI) #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_FFI) #define TEST_FFI_OK(func, args) result.test_rc_ok(#func, func args) #define TEST_FFI_FAIL(msg, func, args) result.test_rc_fail(#func, msg, func args) #define TEST_FFI_RC(rc, func, args) result.test_rc(#func, rc, func args) #define REQUIRE_FFI_OK(func, args) \ if(!TEST_FFI_OK(func, args)) { \ result.test_note("Exiting test early due to failure"); \ return result; \ } class FFI_Unit_Tests final : public Test { public: std::vector run() override { Test::Result result("FFI"); result.test_is_eq("FFI API version", botan_ffi_api_version(), uint32_t(BOTAN_HAS_FFI)); result.test_is_eq("Major version", botan_version_major(), Botan::version_major()); result.test_is_eq("Minor version", botan_version_minor(), Botan::version_minor()); result.test_is_eq("Patch version", botan_version_patch(), Botan::version_patch()); result.test_is_eq("Botan version", botan_version_string(), Botan::version_cstr()); result.test_is_eq("Botan version datestamp", botan_version_datestamp(), Botan::version_datestamp()); result.test_is_eq("FFI supports its own version", botan_ffi_supports_api(botan_ffi_api_version()), 0); const std::vector mem1 = { 0xFF, 0xAA, 0xFF }; const std::vector mem2 = mem1; const std::vector mem3 = { 0xFF, 0xA9, 0xFF }; TEST_FFI_RC(0, botan_same_mem, (mem1.data(), mem2.data(), mem1.size())); TEST_FFI_RC(-1, botan_same_mem, (mem1.data(), mem3.data(), mem1.size())); std::vector to_zero = { 0xFF, 0xA0 }; TEST_FFI_OK(botan_scrub_mem, (to_zero.data(), to_zero.size())); result.confirm("scrub_memory zeros", to_zero[0] == 0 && to_zero[1] == 0); const std::vector bin = { 0xAA, 0xDE, 0x01 }; const char* input_str = "ABC"; std::string outstr; std::vector outbuf; //char namebuf[32]; outstr.resize(2 * bin.size()); TEST_FFI_OK(botan_hex_encode, (bin.data(), bin.size(), &outstr[0], 0)); result.test_eq("uppercase hex", outstr, "AADE01"); TEST_FFI_OK(botan_hex_encode, (bin.data(), bin.size(), &outstr[0], BOTAN_FFI_HEX_LOWER_CASE)); result.test_eq("lowercase hex", outstr, "aade01"); // RNG test and initialization botan_rng_t rng; TEST_FFI_FAIL("invalid rng type", botan_rng_init, (&rng, "invalid_type")); outbuf.resize(512); if(TEST_FFI_OK(botan_rng_init, (&rng, "system"))) { TEST_FFI_OK(botan_rng_get, (rng, outbuf.data(), outbuf.size())); TEST_FFI_OK(botan_rng_reseed, (rng, 256)); TEST_FFI_OK(botan_rng_destroy, (rng)); } if(TEST_FFI_OK(botan_rng_init, (&rng, "user"))) { TEST_FFI_OK(botan_rng_get, (rng, outbuf.data(), outbuf.size())); TEST_FFI_OK(botan_rng_reseed, (rng, 256)); // used for the rest of this function and destroyed at the end } else { result.test_note("Existing early due to missing FFI RNG"); return {result}; } // hashing test botan_hash_t hash; TEST_FFI_FAIL("invalid hash name", botan_hash_init, (&hash, "SHA-255", 0)); TEST_FFI_FAIL("invalid flags", botan_hash_init, (&hash, "SHA-256", 1)); if(TEST_FFI_OK(botan_hash_init, (&hash, "SHA-256", 0))) { /* TEST_FFI_FAIL("output buffer too short", botan_hash_name, (hash, namebuf, 5)); if(TEST_FFI_OK(botan_hash_name, (hash, namebuf, sizeof(namebuf)))) { result.test_eq("hash name", std::string(namebuf), "SHA-256"); } */ size_t block_size; if (TEST_FFI_OK(botan_hash_block_size, (hash, &block_size))) { result.test_eq("hash block size", block_size, 64); } size_t output_len; if(TEST_FFI_OK(botan_hash_output_length, (hash, &output_len))) { result.test_eq("hash output length", output_len, 32); outbuf.resize(output_len); // Test that after clear or final the object can be reused for(size_t r = 0; r != 2; ++r) { TEST_FFI_OK(botan_hash_update, (hash, reinterpret_cast(input_str), 1)); TEST_FFI_OK(botan_hash_clear, (hash)); TEST_FFI_OK(botan_hash_update, (hash, reinterpret_cast(input_str), std::strlen(input_str))); TEST_FFI_OK(botan_hash_final, (hash, outbuf.data())); result.test_eq("SHA-256 output", outbuf, "B5D4045C3F466FA91FE2CC6ABE79232A1A57CDF104F7A26E716E0A1E2789DF78"); } // Test botan_hash_copy_state const char *msg = "message digest"; const char *expected = "F7846F55CF23E14EEBEAB5B4E1550CAD5B509E3348FBC4EFA3A1413D393CB650"; TEST_FFI_OK(botan_hash_clear, (hash)); TEST_FFI_OK(botan_hash_update, (hash, reinterpret_cast(&msg[0]), 1)); botan_hash_t fork; if (TEST_FFI_OK(botan_hash_copy_state, (&fork, hash))) { TEST_FFI_OK(botan_hash_update, (fork, reinterpret_cast(&msg[1]), std::strlen(msg) - 2)); TEST_FFI_OK(botan_hash_update, (hash, reinterpret_cast(&msg[1]), std::strlen(msg) - 1)); TEST_FFI_OK(botan_hash_final, (hash, outbuf.data())); result.test_eq("hashing split", outbuf, expected); TEST_FFI_OK(botan_hash_update, (fork, reinterpret_cast(&msg[std::strlen(msg)-1]), 1)); TEST_FFI_OK(botan_hash_final, (fork, outbuf.data())); result.test_eq("hashing split", outbuf, expected); TEST_FFI_OK(botan_hash_destroy, (fork)); } } TEST_FFI_OK(botan_hash_destroy, (hash)); } // MAC test botan_mac_t mac; TEST_FFI_FAIL("bad flag", botan_mac_init, (&mac, "HMAC(SHA-256)", 1)); TEST_FFI_FAIL("bad name", botan_mac_init, (&mac, "HMAC(SHA-259)", 0)); if(TEST_FFI_OK(botan_mac_init, (&mac, "HMAC(SHA-256)", 0))) { /* TEST_FFI_FAIL("output buffer too short", botan_mac_name, (mac, namebuf, 5)); if(TEST_FFI_OK(botan_mac_name, (mac, namebuf, 20))) { result.test_eq("mac name", std::string(namebuf), "HMAC(SHA-256)"); } */ size_t output_len; if(TEST_FFI_OK(botan_mac_output_length, (mac, &output_len))) { result.test_eq("MAC output length", output_len, 32); const uint8_t mac_key[] = { 0xAA, 0xBB, 0xCC, 0xDD }; outbuf.resize(output_len); // Test that after clear or final the object can be reused for(size_t r = 0; r != 2; ++r) { TEST_FFI_OK(botan_mac_set_key, (mac, mac_key, sizeof(mac_key))); TEST_FFI_OK(botan_mac_update, (mac, reinterpret_cast(input_str), std::strlen(input_str))); TEST_FFI_OK(botan_mac_clear, (mac)); TEST_FFI_OK(botan_mac_set_key, (mac, mac_key, sizeof(mac_key))); TEST_FFI_OK(botan_mac_update, (mac, reinterpret_cast(input_str), std::strlen(input_str))); TEST_FFI_OK(botan_mac_final, (mac, outbuf.data())); result.test_eq("HMAC output", outbuf, "1A82EEA984BC4A7285617CC0D05F1FE1D6C96675924A81BC965EE8FF7B0697A7"); } } TEST_FFI_OK(botan_mac_destroy, (mac)); } // KDF test const std::vector pbkdf_salt = Botan::hex_decode("ED1F39A0A7F3889AAF7E60743B3BC1CC2C738E60"); const std::string passphrase = "ltexmfeyylmlbrsyikaw"; const size_t pbkdf_out_len = 10; const size_t pbkdf_iterations = 1000; outbuf.resize(pbkdf_out_len); if(TEST_FFI_OK(botan_pbkdf, ("PBKDF2(SHA-1)", outbuf.data(), outbuf.size(), passphrase.c_str(), pbkdf_salt.data(), pbkdf_salt.size(), pbkdf_iterations))) { result.test_eq("PBKDF output", outbuf, "027AFADD48F4BE8DCC4F"); } size_t iters_10ms, iters_100ms; TEST_FFI_OK(botan_pbkdf_timed, ("PBKDF2(SHA-1)", outbuf.data(), outbuf.size(), passphrase.c_str(), pbkdf_salt.data(), pbkdf_salt.size(), 10, &iters_10ms)); TEST_FFI_OK(botan_pbkdf_timed, ("PBKDF2(SHA-1)", outbuf.data(), outbuf.size(), passphrase.c_str(), pbkdf_salt.data(), pbkdf_salt.size(), 100, &iters_100ms)); result.test_note("PBKDF timed 10 ms " + std::to_string(iters_10ms) + " iterations " + "100 ms " + std::to_string(iters_100ms) + " iterations"); #if defined(BOTAN_HAS_KDF2) const std::vector kdf_secret = Botan::hex_decode("92167440112E"); const std::vector kdf_salt = Botan::hex_decode("45A9BEDED69163123D0348F5185F61ABFB1BF18D6AEA454F"); const size_t kdf_out_len = 18; outbuf.resize(kdf_out_len); if(TEST_FFI_OK(botan_kdf, ("KDF2(SHA-1)", outbuf.data(), outbuf.size(), kdf_secret.data(), kdf_secret.size(), kdf_salt.data(), kdf_salt.size(), nullptr, 0))) { result.test_eq("KDF output", outbuf, "3A5DC9AA1C872B4744515AC2702D6396FC2A"); } #endif size_t out_len = 64; outstr.resize(out_len); int rc = botan_bcrypt_generate(reinterpret_cast(&outstr[0]), &out_len, passphrase.c_str(), rng, 4, 0); if(rc == 0) { result.test_eq("bcrypt output size", out_len, 61); TEST_FFI_OK(botan_bcrypt_is_valid, (passphrase.c_str(), outstr.data())); TEST_FFI_FAIL("bad password", botan_bcrypt_is_valid, ("nope", outstr.data())); } #if defined(BOTAN_HAS_ECDSA) // x509 cert test botan_x509_cert_t cert; if(TEST_FFI_OK(botan_x509_cert_load_file, (&cert, Test::data_file("x509/ecc/CSCA.CSCA.csca-germany.1.crt").c_str()))) { size_t date_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_time_starts, (cert, nullptr, &date_len)); std::string date(date_len - 1, '0'); TEST_FFI_OK(botan_x509_cert_get_time_starts, (cert, &date[0], &date_len)); result.test_eq("cert valid from", date, "070719152718Z"); date_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_time_expires, (cert, nullptr, &date_len)); date.resize(date_len - 1); TEST_FFI_OK(botan_x509_cert_get_time_expires, (cert, &date[0], &date_len)); result.test_eq("cert valid until", date, "280119151800Z"); size_t serial_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_serial_number, (cert, nullptr, &serial_len)); std::vector serial(serial_len); TEST_FFI_OK(botan_x509_cert_get_serial_number, (cert, serial.data(), &serial_len)); result.test_eq("cert serial length", serial.size(), 1); result.test_int_eq(serial[0], 1, "cert serial"); size_t fingerprint_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_fingerprint, (cert, "SHA-256", nullptr, &fingerprint_len)); std::vector fingerprint(fingerprint_len); TEST_FFI_OK(botan_x509_cert_get_fingerprint, (cert, "SHA-256", fingerprint.data(), &fingerprint_len)); result.test_eq("cert fingerprint", reinterpret_cast(fingerprint.data()), "3B:6C:99:1C:D6:5A:51:FC:EB:17:E3:AA:F6:3C:1A:DA:14:1F:82:41:30:6F:64:EE:FF:63:F3:1F:D6:07:14:9F"); size_t key_id_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_authority_key_id, (cert, nullptr, &key_id_len)); std::vector key_id(key_id_len); TEST_FFI_OK(botan_x509_cert_get_authority_key_id, (cert, key_id.data(), &key_id_len)); result.test_eq("cert authority key id", Botan::hex_encode(key_id.data(), key_id.size(), true), "0096452DE588F966C4CCDF161DD1F3F5341B71E7"); key_id_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_subject_key_id, (cert, nullptr, &key_id_len)); key_id.resize(key_id_len); TEST_FFI_OK(botan_x509_cert_get_subject_key_id, (cert, key_id.data(), &key_id_len)); result.test_eq("cert subject key id", Botan::hex_encode(key_id.data(), key_id.size(), true), "0096452DE588F966C4CCDF161DD1F3F5341B71E7"); size_t pubkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_public_key_bits, (cert, nullptr, &pubkey_len)); std::vector pubkey(pubkey_len); TEST_FFI_OK(botan_x509_cert_get_public_key_bits, (cert, pubkey.data(), &pubkey_len)); botan_pubkey_t pub; if(TEST_FFI_OK(botan_x509_cert_get_public_key, (cert, &pub))) { TEST_FFI_OK(botan_pubkey_destroy, (pub)); } size_t dn_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_issuer_dn, (cert, "Name", 0, nullptr, &dn_len)); std::vector dn(dn_len); TEST_FFI_OK(botan_x509_cert_get_issuer_dn, (cert, "Name", 0, dn.data(), &dn_len)); result.test_eq("issuer dn", reinterpret_cast(dn.data()), "csca-germany"); dn_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_get_subject_dn, (cert, "Name", 0, nullptr, &dn_len)); dn.resize(dn_len); TEST_FFI_OK(botan_x509_cert_get_subject_dn, (cert, "Name", 0, dn.data(), &dn_len)); result.test_eq("subject dn", reinterpret_cast(dn.data()), "csca-germany"); size_t printable_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_x509_cert_to_string, (cert, nullptr, &printable_len)); std::string printable(printable_len - 1, '0'); TEST_FFI_OK(botan_x509_cert_to_string, (cert, &printable[0], &printable_len)); TEST_FFI_RC(0, botan_x509_cert_allowed_usage, (cert, KEY_CERT_SIGN)); TEST_FFI_RC(0, botan_x509_cert_allowed_usage, (cert, CRL_SIGN)); TEST_FFI_RC(1, botan_x509_cert_allowed_usage, (cert, DIGITAL_SIGNATURE)); TEST_FFI_OK(botan_x509_cert_destroy, (cert)); } #endif std::vector results; results.push_back(ffi_test_errors()); results.push_back(ffi_test_base64()); results.push_back(ffi_test_mp(rng)); results.push_back(ffi_test_block_ciphers()); results.push_back(ffi_test_ciphers_cbc()); results.push_back(ffi_test_ciphers_aead_gcm()); results.push_back(ffi_test_ciphers_aead_eax()); results.push_back(ffi_test_stream_ciphers()); results.push_back(ffi_test_pkcs_hash_id()); #if defined(BOTAN_HAS_RFC3394_KEYWRAP) results.push_back(ffi_test_keywrap()); #endif #if defined(BOTAN_HAS_RSA) results.push_back(ffi_test_rsa(rng)); #endif #if defined(BOTAN_HAS_DSA) results.push_back(ffi_test_dsa(rng)); #endif #if defined(BOTAN_HAS_ECDSA) results.push_back(ffi_test_ecdsa(rng)); #endif #if defined(BOTAN_HAS_ECDH) results.push_back(ffi_test_ecdh(rng)); #endif #if defined(BOTAN_HAS_SM2) results.push_back(ffi_test_sm2(rng)); results.push_back(ffi_test_sm2_enc(rng)); #endif #if defined(BOTAN_HAS_MCELIECE) results.push_back(ffi_test_mceliece(rng)); #endif #if defined(BOTAN_HAS_ELGAMAL) results.push_back(ffi_test_elgamal(rng)); #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) results.push_back(ffi_test_dh(rng)); #endif #if defined(BOTAN_HAS_ED25519) results.push_back(ffi_test_ed25519(rng)); #endif TEST_FFI_OK(botan_rng_destroy, (rng)); results.push_back(result); return results; } private: Test::Result ffi_test_pkcs_hash_id() { Test::Result result("FFI PKCS hash id"); #if defined(BOTAN_HAS_HASH_ID) std::vector hash_id(64); size_t hash_id_len; hash_id_len = 3; // too short TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pkcs_hash_id, ("SHA-256", hash_id.data(), &hash_id_len)); result.test_eq("Expected SHA-256 PKCS hash id len", hash_id_len, 19); TEST_FFI_OK(botan_pkcs_hash_id, ("SHA-256", hash_id.data(), &hash_id_len)); result.test_eq("Expected SHA-256 PKCS hash id len", hash_id_len, 19); hash_id.resize(hash_id_len); result.test_eq("Expected SHA_256 PKCS hash id", hash_id, "3031300D060960864801650304020105000420"); #endif return result; } Test::Result ffi_test_ciphers_cbc() { Test::Result result("FFI CBC cipher"); botan_cipher_t cipher_encrypt, cipher_decrypt; if(TEST_FFI_OK(botan_cipher_init, (&cipher_encrypt, "AES-128/CBC/PKCS7", BOTAN_CIPHER_INIT_FLAG_ENCRYPT))) { size_t min_keylen = 0; size_t max_keylen = 0; TEST_FFI_OK(botan_cipher_query_keylen, (cipher_encrypt, &min_keylen, &max_keylen)); result.test_int_eq(min_keylen, 16, "Min key length"); result.test_int_eq(max_keylen, 16, "Max key length"); // from https://github.com/geertj/bluepass/blob/master/tests/vectors/aes-cbc-pkcs7.txt const std::vector plaintext = Botan::hex_decode("0397f4f6820b1f9386f14403be5ac16e50213bd473b4874b9bcbf5f318ee686b1d"); const std::vector symkey = Botan::hex_decode("898be9cc5004ed0fa6e117c9a3099d31"); const std::vector nonce = Botan::hex_decode("9dea7621945988f96491083849b068df"); const std::vector exp_ciphertext = Botan::hex_decode("e232cd6ef50047801ee681ec30f61d53cfd6b0bca02fd03c1b234baa10ea82ac9dab8b960926433a19ce6dea08677e34"); std::vector ciphertext(16 + plaintext.size()); // TODO: no way to know this size from API size_t output_written = 0; size_t input_consumed = 0; // Test that after clear or final the object can be reused for(size_t r = 0; r != 2; ++r) { TEST_FFI_OK(botan_cipher_set_key, (cipher_encrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_encrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_encrypt, 0, ciphertext.data(), ciphertext.size(), &output_written, plaintext.data(), plaintext.size(), &input_consumed)); TEST_FFI_OK(botan_cipher_clear, (cipher_encrypt)); TEST_FFI_OK(botan_cipher_set_key, (cipher_encrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_encrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_encrypt, BOTAN_CIPHER_UPDATE_FLAG_FINAL, ciphertext.data(), ciphertext.size(), &output_written, plaintext.data(), plaintext.size(), &input_consumed)); ciphertext.resize(output_written); result.test_eq("AES/CBC ciphertext", ciphertext, exp_ciphertext); if(TEST_FFI_OK(botan_cipher_init, (&cipher_decrypt, "AES-128/CBC", BOTAN_CIPHER_INIT_FLAG_DECRYPT))) { std::vector decrypted(plaintext.size()); TEST_FFI_OK(botan_cipher_set_key, (cipher_decrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_decrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_decrypt, BOTAN_CIPHER_UPDATE_FLAG_FINAL, decrypted.data(), decrypted.size(), &output_written, ciphertext.data(), ciphertext.size(), &input_consumed)); result.test_eq("AES/CBC plaintext", decrypted, plaintext); TEST_FFI_OK(botan_cipher_destroy, (cipher_decrypt)); } } TEST_FFI_OK(botan_cipher_destroy, (cipher_encrypt)); } return result; } Test::Result ffi_test_ciphers_aead_gcm() { Test::Result result("FFI GCM"); #if defined(BOTAN_HAS_AEAD_GCM) botan_cipher_t cipher_encrypt, cipher_decrypt; if(TEST_FFI_OK(botan_cipher_init, (&cipher_encrypt, "AES-128/GCM", BOTAN_CIPHER_INIT_FLAG_ENCRYPT))) { size_t min_keylen = 0; size_t max_keylen = 0; size_t nonce_len = 0; size_t tag_len = 0; TEST_FFI_OK(botan_cipher_query_keylen, (cipher_encrypt, &min_keylen, &max_keylen)); result.test_int_eq(min_keylen, 16, "Min key length"); result.test_int_eq(max_keylen, 16, "Max key length"); TEST_FFI_OK(botan_cipher_get_default_nonce_length, (cipher_encrypt, &nonce_len)); result.test_int_eq(nonce_len, 12, "Expected default GCM nonce length"); TEST_FFI_OK(botan_cipher_get_tag_length, (cipher_encrypt, &tag_len)); result.test_int_eq(tag_len, 16, "Expected GCM tag length"); TEST_FFI_RC(1, botan_cipher_valid_nonce_length, (cipher_encrypt, 12)); // GCM accepts any nonce size... TEST_FFI_RC(1, botan_cipher_valid_nonce_length, (cipher_encrypt, 0)); // NIST test vector const std::vector plaintext = Botan::hex_decode("D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C95956809532FCF0E2449A6B525B16AEDF5AA0DE657BA637B39"); const std::vector symkey = Botan::hex_decode("FEFFE9928665731C6D6A8F9467308308"); const std::vector nonce = Botan::hex_decode("CAFEBABEFACEDBADDECAF888"); const std::vector exp_ciphertext = Botan::hex_decode( "42831EC2217774244B7221B784D0D49CE3AA212F2C02A4E035C17E2329ACA12E21D514B25466931C7D8F6A5AAC84AA051BA30B396A0AAC973D58E0915BC94FBC3221A5DB94FAE95AE7121A47"); const std::vector aad = Botan::hex_decode("FEEDFACEDEADBEEFFEEDFACEDEADBEEFABADDAD2"); std::vector ciphertext(tag_len + plaintext.size()); size_t output_written = 0; size_t input_consumed = 0; // Test that after clear or final the object can be reused for(size_t r = 0; r != 2; ++r) { TEST_FFI_OK(botan_cipher_set_key, (cipher_encrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_encrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_encrypt, 0, ciphertext.data(), ciphertext.size(), &output_written, plaintext.data(), plaintext.size(), &input_consumed)); TEST_FFI_OK(botan_cipher_clear, (cipher_encrypt)); TEST_FFI_OK(botan_cipher_set_key, (cipher_encrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_set_associated_data, (cipher_encrypt, aad.data(), aad.size())); TEST_FFI_OK(botan_cipher_start, (cipher_encrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_encrypt, BOTAN_CIPHER_UPDATE_FLAG_FINAL, ciphertext.data(), ciphertext.size(), &output_written, plaintext.data(), plaintext.size(), &input_consumed)); ciphertext.resize(output_written); result.test_eq("AES/GCM ciphertext", ciphertext, exp_ciphertext); if(TEST_FFI_OK(botan_cipher_init, (&cipher_decrypt, "AES-128/GCM", BOTAN_CIPHER_INIT_FLAG_DECRYPT))) { std::vector decrypted(plaintext.size()); TEST_FFI_OK(botan_cipher_set_key, (cipher_decrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_set_associated_data, (cipher_decrypt, aad.data(), aad.size())); TEST_FFI_OK(botan_cipher_start, (cipher_decrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_decrypt, BOTAN_CIPHER_UPDATE_FLAG_FINAL, decrypted.data(), decrypted.size(), &output_written, ciphertext.data(), ciphertext.size(), &input_consumed)); result.test_int_eq(input_consumed, ciphertext.size(), "All input consumed"); result.test_int_eq(output_written, decrypted.size(), "Expected output size produced"); result.test_eq("AES/GCM plaintext", decrypted, plaintext); TEST_FFI_OK(botan_cipher_destroy, (cipher_decrypt)); } } TEST_FFI_OK(botan_cipher_destroy, (cipher_encrypt)); } #endif return result; } Test::Result ffi_test_ciphers_aead_eax() { Test::Result result("FFI EAX"); #if defined(BOTAN_HAS_AEAD_EAX) botan_cipher_t cipher_encrypt, cipher_decrypt; if(TEST_FFI_OK(botan_cipher_init, (&cipher_encrypt, "AES-128/EAX", BOTAN_CIPHER_INIT_FLAG_ENCRYPT))) { size_t min_keylen = 0; size_t max_keylen = 0; size_t nonce_len = 0; size_t tag_len = 0; TEST_FFI_OK(botan_cipher_query_keylen, (cipher_encrypt, &min_keylen, &max_keylen)); result.test_int_eq(min_keylen, 16, "Min key length"); result.test_int_eq(max_keylen, 16, "Max key length"); TEST_FFI_OK(botan_cipher_get_default_nonce_length, (cipher_encrypt, &nonce_len)); result.test_int_eq(nonce_len, 12, "Expected default EAX nonce length"); TEST_FFI_OK(botan_cipher_get_tag_length, (cipher_encrypt, &tag_len)); result.test_int_eq(tag_len, 16, "Expected EAX tag length"); TEST_FFI_RC(1, botan_cipher_valid_nonce_length, (cipher_encrypt, 12)); // EAX accepts any nonce size... TEST_FFI_RC(1, botan_cipher_valid_nonce_length, (cipher_encrypt, 0)); const std::vector plaintext = Botan::hex_decode("0000000000000000000000000000000011111111111111111111111111111111"); const std::vector symkey = Botan::hex_decode("000102030405060708090a0b0c0d0e0f"); const std::vector nonce = Botan::hex_decode("3c8cc2970a008f75cc5beae2847258c2"); const std::vector exp_ciphertext = Botan::hex_decode("3c441f32ce07822364d7a2990e50bb13d7b02a26969e4a937e5e9073b0d9c968db90bdb3da3d00afd0fc6a83551da95e"); std::vector ciphertext(tag_len + plaintext.size()); size_t output_written = 0; size_t input_consumed = 0; // Test that after clear or final the object can be reused for(size_t r = 0; r != 2; ++r) { TEST_FFI_OK(botan_cipher_set_key, (cipher_encrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_encrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_encrypt, 0, ciphertext.data(), ciphertext.size(), &output_written, plaintext.data(), plaintext.size(), &input_consumed)); TEST_FFI_OK(botan_cipher_clear, (cipher_encrypt)); TEST_FFI_OK(botan_cipher_set_key, (cipher_encrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_encrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_encrypt, BOTAN_CIPHER_UPDATE_FLAG_FINAL, ciphertext.data(), ciphertext.size(), &output_written, plaintext.data(), plaintext.size(), &input_consumed)); ciphertext.resize(output_written); result.test_eq("AES/EAX ciphertext", ciphertext, exp_ciphertext); if(TEST_FFI_OK(botan_cipher_init, (&cipher_decrypt, "AES-128/EAX", BOTAN_CIPHER_INIT_FLAG_DECRYPT))) { std::vector decrypted(plaintext.size()); TEST_FFI_OK(botan_cipher_set_key, (cipher_decrypt, symkey.data(), symkey.size())); TEST_FFI_OK(botan_cipher_start, (cipher_decrypt, nonce.data(), nonce.size())); TEST_FFI_OK(botan_cipher_update, (cipher_decrypt, BOTAN_CIPHER_UPDATE_FLAG_FINAL, decrypted.data(), decrypted.size(), &output_written, ciphertext.data(), ciphertext.size(), &input_consumed)); result.test_int_eq(input_consumed, ciphertext.size(), "All input consumed"); result.test_int_eq(output_written, decrypted.size(), "Expected output size produced"); result.test_eq("AES/EAX plaintext", decrypted, plaintext); TEST_FFI_OK(botan_cipher_destroy, (cipher_decrypt)); } } TEST_FFI_OK(botan_cipher_destroy, (cipher_encrypt)); } #endif return result; } Test::Result ffi_test_stream_ciphers() { Test::Result result("FFI stream ciphers"); #if defined(BOTAN_HAS_CTR_BE) const std::vector key = Botan::hex_decode("2B7E151628AED2A6ABF7158809CF4F3C"); const std::vector nonce = Botan::hex_decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFDFF"); const std::vector pt = Botan::hex_decode( "AE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710"); const std::vector exp_ct = Botan::hex_decode( "9806F66B7970FDFF8617187BB9FFFDFF5AE4DF3EDBD5D35E5B4F09020DB03EAB1E031DDA2FBE03D1792170A0F3009CEE"); botan_cipher_t ctr; std::vector ct(pt.size()); if(TEST_FFI_OK(botan_cipher_init, (&ctr, "AES-128/CTR-BE", BOTAN_CIPHER_INIT_FLAG_ENCRYPT))) { size_t input_consumed = 0; size_t output_written = 0; TEST_FFI_OK(botan_cipher_set_key, (ctr, key.data(), key.size())); TEST_FFI_OK(botan_cipher_start, (ctr, nonce.data(), nonce.size())); // Test partial updates... TEST_FFI_OK(botan_cipher_update, (ctr, 0, ct.data(), ct.size(), &output_written, pt.data(), 5, &input_consumed)); result.test_int_eq(output_written, 5, "Expected output written"); result.test_int_eq(input_consumed, 5, "Expected input consumed"); TEST_FFI_OK(botan_cipher_update, (ctr, 0, &ct[5], ct.size() - 5, &output_written, &pt[5], pt.size() - 5, &input_consumed)); result.test_int_eq(output_written, ct.size() - 5, "Expected output written"); result.test_int_eq(input_consumed, pt.size() - 5, "Expected input consumed"); result.test_eq("AES-128/CTR ciphertext", ct, exp_ct); TEST_FFI_OK(botan_cipher_destroy, (ctr)); } #endif return result; } Test::Result ffi_test_block_ciphers() { Test::Result result("FFI block ciphers"); botan_block_cipher_t cipher; if(TEST_FFI_OK(botan_block_cipher_init, (&cipher, "AES-128"))) { const std::vector zero16(16, 0); std::vector block(16, 0); TEST_FFI_OK(botan_block_cipher_clear, (cipher)); TEST_FFI_RC(16, botan_block_cipher_block_size, (cipher)); TEST_FFI_OK(botan_block_cipher_set_key, (cipher, zero16.data(), zero16.size())); TEST_FFI_OK(botan_block_cipher_encrypt_blocks, (cipher, block.data(), block.data(), 1)); result.test_eq("AES-128 encryption works", block, "66E94BD4EF8A2C3B884CFA59CA342B2E"); TEST_FFI_OK(botan_block_cipher_encrypt_blocks, (cipher, block.data(), block.data(), 1)); result.test_eq("AES-128 encryption works", block, "F795BD4A52E29ED713D313FA20E98DBC"); TEST_FFI_OK(botan_block_cipher_decrypt_blocks, (cipher, block.data(), block.data(), 1)); result.test_eq("AES-128 decryption works", block, "66E94BD4EF8A2C3B884CFA59CA342B2E"); TEST_FFI_OK(botan_block_cipher_decrypt_blocks, (cipher, block.data(), block.data(), 1)); result.test_eq("AES-128 decryption works", block, "00000000000000000000000000000000"); TEST_FFI_OK(botan_block_cipher_clear, (cipher)); botan_block_cipher_destroy(cipher); } return result; } Test::Result ffi_test_errors() { // Test some error handling situations Test::Result result("FFI error handling"); // delete of null is ok/ignored TEST_FFI_RC(0, botan_hash_destroy, (nullptr)); // Confirm that botan_x_destroy checks the argument type botan_mp_t mp; botan_mp_init(&mp); TEST_FFI_RC(BOTAN_FFI_ERROR_INVALID_OBJECT, botan_hash_destroy, (reinterpret_cast(mp))); TEST_FFI_RC(0, botan_mp_destroy, (mp)); return result; } Test::Result ffi_test_base64() { Test::Result result("FFI base64"); const uint8_t bin[9] = { 0x16, 0x8a, 0x1f, 0x06, 0xe9, 0xe7, 0xcb, 0xdd, 0x34 }; char out_buf[1024] = { 0 }; size_t out_len = sizeof(out_buf); TEST_FFI_OK(botan_base64_encode, (bin, sizeof(bin), out_buf, &out_len)); result.test_eq("encoded string", out_buf, "FoofBunny900"); out_len -= 1; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_base64_encode, (bin, sizeof(bin), out_buf, &out_len)); const char* base64 = "U3VjaCBiYXNlNjQgd293IQ=="; uint8_t out_bin[1024] = { 0 }; out_len = sizeof(out_bin); TEST_FFI_OK(botan_base64_decode, (base64, strlen(base64), out_bin, &out_len)); result.test_eq("decoded string", std::string(reinterpret_cast(out_bin), out_len), "Such base64 wow!"); return result; } Test::Result ffi_test_mp(botan_rng_t rng) { Test::Result result("FFI MP"); botan_mp_t x; botan_mp_init(&x); TEST_FFI_RC(0, botan_mp_is_odd, (x)); TEST_FFI_RC(1, botan_mp_is_even, (x)); TEST_FFI_RC(0, botan_mp_is_negative, (x)); TEST_FFI_RC(1, botan_mp_is_positive, (x)); TEST_FFI_RC(1, botan_mp_is_zero, (x)); botan_mp_destroy(x); botan_mp_init(&x); size_t bn_bytes = 0; TEST_FFI_OK(botan_mp_num_bytes, (x, &bn_bytes)); result.test_eq("Expected size for MP 0", bn_bytes, 0); botan_mp_set_from_int(x, 5); TEST_FFI_OK(botan_mp_num_bytes, (x, &bn_bytes)); result.test_eq("Expected size for MP 5", bn_bytes, 1); botan_mp_set_from_int(x, 259); TEST_FFI_OK(botan_mp_num_bytes, (x, &bn_bytes)); result.test_eq("Expected size for MP 259", bn_bytes, 2); TEST_FFI_RC(1, botan_mp_is_odd, (x)); TEST_FFI_RC(0, botan_mp_is_even, (x)); TEST_FFI_RC(0, botan_mp_is_negative, (x)); TEST_FFI_RC(1, botan_mp_is_positive, (x)); TEST_FFI_RC(0, botan_mp_is_zero, (x)); { botan_mp_t zero; botan_mp_init(&zero); int cmp; TEST_FFI_OK(botan_mp_cmp, (&cmp, x, zero)); result.confirm("bigint_mp_cmp(+, 0)", cmp == 1); TEST_FFI_OK(botan_mp_cmp, (&cmp, zero, x)); result.confirm("bigint_mp_cmp(0, +)", cmp == -1); TEST_FFI_RC(0, botan_mp_is_negative, (x)); TEST_FFI_RC(1, botan_mp_is_positive, (x)); TEST_FFI_OK(botan_mp_flip_sign, (x)); TEST_FFI_RC(1, botan_mp_is_negative, (x)); TEST_FFI_RC(0, botan_mp_is_positive, (x)); // test no negative zero TEST_FFI_RC(0, botan_mp_is_negative, (zero)); TEST_FFI_RC(1, botan_mp_is_positive, (zero)); TEST_FFI_OK(botan_mp_flip_sign, (zero)); TEST_FFI_RC(0, botan_mp_is_negative, (zero)); TEST_FFI_RC(1, botan_mp_is_positive, (zero)); TEST_FFI_OK(botan_mp_cmp, (&cmp, x, zero)); result.confirm("bigint_mp_cmp(-, 0)", cmp == -1); TEST_FFI_OK(botan_mp_cmp, (&cmp, zero, x)); result.confirm("bigint_mp_cmp(0, -)", cmp == 1); TEST_FFI_OK(botan_mp_cmp, (&cmp, zero, zero)); result.confirm("bigint_mp_cmp(0, 0)", cmp == 0); TEST_FFI_OK(botan_mp_cmp, (&cmp, x, x)); result.confirm("bigint_mp_cmp(x, x)", cmp == 0); TEST_FFI_OK(botan_mp_flip_sign, (x)); botan_mp_destroy(zero); } size_t x_bits = 0; TEST_FFI_OK(botan_mp_num_bits, (x, &x_bits)); result.test_eq("botan_mp_num_bits", x_bits, 9); char str_buf[1024] = { 0 }; size_t str_len = 0; TEST_FFI_OK(botan_mp_to_hex, (x, str_buf)); result.test_eq("botan_mp_to_hex", std::string(str_buf), "0103"); uint32_t x_32; TEST_FFI_OK(botan_mp_to_uint32, (x, &x_32)); result.test_eq("botan_mp_to_uint32", size_t(x_32), size_t(0x103)); TEST_FFI_RC(1, botan_mp_get_bit, (x, 1)); TEST_FFI_RC(0, botan_mp_get_bit, (x, 87)); TEST_FFI_OK(botan_mp_set_bit, (x, 87)); TEST_FFI_RC(1, botan_mp_get_bit, (x, 87)); TEST_FFI_OK(botan_mp_to_hex, (x, str_buf)); result.test_eq("botan_mp_set_bit", std::string(str_buf), "8000000000000000000103"); TEST_FFI_OK(botan_mp_clear_bit, (x, 87)); TEST_FFI_OK(botan_mp_to_hex, (x, str_buf)); result.test_eq("botan_mp_set_bit", std::string(str_buf), "0103"); botan_mp_t y; TEST_FFI_OK(botan_mp_init, (&y)); TEST_FFI_OK(botan_mp_set_from_int, (y, 0x1234567)); botan_mp_t r; botan_mp_init(&r); TEST_FFI_OK(botan_mp_add, (r, x, y)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_add", std::string(str_buf), "19089002"); TEST_FFI_OK(botan_mp_mul, (r, x, y)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_mul", std::string(str_buf), "4943984437"); TEST_FFI_RC(0, botan_mp_is_negative, (r)); botan_mp_t q; botan_mp_init(&q); TEST_FFI_OK(botan_mp_div, (q, r, y, x)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (q, 10, str_buf, &str_len)); result.test_eq("botan_mp_div_q", std::string(str_buf), "073701"); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_div_r", std::string(str_buf), "184"); TEST_FFI_OK(botan_mp_set_from_str, (y, "4943984437")); TEST_FFI_OK(botan_mp_sub, (r, x, y)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_sub", std::string(str_buf), "4943984178"); TEST_FFI_RC(1, botan_mp_is_negative, (r)); TEST_FFI_OK(botan_mp_lshift, (r, x, 39)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_lshift", std::string(str_buf), "142386755796992"); TEST_FFI_OK(botan_mp_rshift, (r, r, 3)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_rshift", std::string(str_buf), "17798344474624"); TEST_FFI_OK(botan_mp_gcd, (r, x, y)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_gcd", std::string(str_buf), "259"); botan_mp_t p; botan_mp_init(&p); const uint8_t M127[] = { 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; TEST_FFI_OK(botan_mp_from_bin, (p, M127, sizeof(M127))); TEST_FFI_RC(1, botan_mp_is_prime, (p, rng, 64)); size_t p_bits = 0; TEST_FFI_OK(botan_mp_num_bits, (p, &p_bits)); result.test_eq("botan_mp_num_bits", p_bits, 127); TEST_FFI_OK(botan_mp_mod_inverse, (r, x, p)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_mod_inverse", std::string(str_buf), "40728777507911553541948312086427855425"); TEST_FFI_OK(botan_mp_powmod, (r, x, r, p)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_powmod", std::string(str_buf), "40550417419160441638948180641668117560"); TEST_FFI_OK(botan_mp_num_bytes, (r, &bn_bytes)); result.test_eq("botan_mp_num_bytes", bn_bytes, 16); std::vector bn_buf; bn_buf.resize(bn_bytes); botan_mp_to_bin(r, bn_buf.data()); result.test_eq("botan_mp_to_bin", bn_buf, "1E81B9EFE0BE1902F6D03F9F5E5FB438"); TEST_FFI_OK(botan_mp_set_from_mp, (y, r)); TEST_FFI_OK(botan_mp_mod_mul, (r, x, y, p)); str_len = sizeof(str_buf); TEST_FFI_OK(botan_mp_to_str, (r, 10, str_buf, &str_len)); result.test_eq("botan_mp_mod_mul", std::string(str_buf), "123945920473931248854653259523111998693"); str_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_mp_to_str, (r, 10, str_buf, &str_len)); size_t x_bytes; botan_mp_rand_bits(x, rng, 512); TEST_FFI_OK(botan_mp_num_bytes, (x, &x_bytes)); result.test_lte("botan_mp_num_bytes", x_bytes, 512 / 8); TEST_FFI_OK(botan_mp_set_from_radix_str, (x, "909A", 16)); TEST_FFI_OK(botan_mp_to_uint32, (x, &x_32)); result.test_eq("botan_mp_set_from_radix_str(16)", x_32, static_cast(0x909A)); TEST_FFI_OK(botan_mp_set_from_radix_str, (x, "9098135", 10)); TEST_FFI_OK(botan_mp_to_uint32, (x, &x_32)); result.test_eq("botan_mp_set_from_radix_str(10)", x_32, static_cast(9098135)); botan_mp_destroy(p); botan_mp_destroy(x); botan_mp_destroy(y); botan_mp_destroy(r); botan_mp_destroy(q); return result; } void ffi_test_pubkey_export(Test::Result& result, botan_pubkey_t pub, botan_privkey_t priv, botan_rng_t rng) { const size_t pbkdf_iter = 1000; // export public key size_t pubkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pubkey_export, (pub, nullptr, &pubkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_DER)); std::vector pubkey(pubkey_len); TEST_FFI_OK(botan_pubkey_export, (pub, pubkey.data(), &pubkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_DER)); pubkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pubkey_export, (pub, nullptr, &pubkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); pubkey.resize(pubkey_len); TEST_FFI_OK(botan_pubkey_export, (pub, pubkey.data(), &pubkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); // reimport exported public key botan_pubkey_t pub_copy; TEST_FFI_OK(botan_pubkey_load, (&pub_copy, pubkey.data(), pubkey_len)); TEST_FFI_OK(botan_pubkey_check_key, (pub_copy, rng, 0)); TEST_FFI_OK(botan_pubkey_destroy, (pub_copy)); // export private key std::vector privkey; size_t privkey_len = 0; // call with nullptr to query the length TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_privkey_export, (priv, nullptr, &privkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_DER)); privkey.resize(privkey_len); privkey_len = privkey.size(); // set buffer size TEST_FFI_OK(botan_privkey_export, (priv, privkey.data(), &privkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_DER)); privkey.resize(privkey_len); result.test_gte("Reasonable size", privkey.size(), 32); // reimport exported private key botan_privkey_t copy; TEST_FFI_OK(botan_privkey_load, (©, rng, privkey.data(), privkey.size(), nullptr)); botan_privkey_destroy(copy); // Now again for PEM privkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_privkey_export, (priv, nullptr, &privkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); privkey.resize(privkey_len); TEST_FFI_OK(botan_privkey_export, (priv, privkey.data(), &privkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); TEST_FFI_OK(botan_privkey_load, (©, rng, privkey.data(), privkey.size(), nullptr)); botan_privkey_destroy(copy); // export private key encrypted privkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_privkey_export_encrypted_pbkdf_iter, (priv, nullptr, &privkey_len, rng, "password", pbkdf_iter, "", "", BOTAN_PRIVKEY_EXPORT_FLAG_DER)); privkey.resize(privkey_len); privkey_len = privkey.size(); TEST_FFI_OK(botan_privkey_export_encrypted_pbkdf_iter, (priv, privkey.data(), &privkey_len, rng, "password", pbkdf_iter, "", "", BOTAN_PRIVKEY_EXPORT_FLAG_DER)); // reimport encrypted private key botan_privkey_load(©, rng, privkey.data(), privkey.size(), "password"); botan_privkey_destroy(copy); privkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_privkey_export_encrypted_pbkdf_iter, (priv, nullptr, &privkey_len, rng, "password", pbkdf_iter, "", "", BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); privkey.resize(privkey_len); TEST_FFI_OK(botan_privkey_export_encrypted_pbkdf_iter, (priv, privkey.data(), &privkey_len, rng, "password", pbkdf_iter, "", "", BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); privkey.resize(privkey_len * 2); privkey_len = privkey.size(); const uint32_t pbkdf_msec = 100; size_t pbkdf_iters_out = 0; TEST_FFI_OK(botan_privkey_export_encrypted_pbkdf_msec, (priv, privkey.data(), &privkey_len, rng, "password", pbkdf_msec, &pbkdf_iters_out, "AES-256/GCM", "SHA-512", 0)); // PBKDF2 currently always rounds to multiple of 10,000 result.test_gte("Reasonable KDF iters", pbkdf_iters_out, 1000); privkey.resize(privkey_len); TEST_FFI_OK(botan_privkey_load, (©, rng, privkey.data(), privkey.size(), "password")); botan_privkey_destroy(copy); // calculate fingerprint size_t strength = 0; TEST_FFI_OK(botan_pubkey_estimated_strength, (pub, &strength)); result.test_gte("estimated strength", strength, 1); size_t fingerprint_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pubkey_fingerprint, (pub, "SHA-512", nullptr, &fingerprint_len)); std::vector fingerprint(fingerprint_len); TEST_FFI_OK(botan_pubkey_fingerprint, (pub, "SHA-512", fingerprint.data(), &fingerprint_len)); } Test::Result ffi_test_keywrap() { Test::Result result("FFI keywrap"); const uint8_t key[16] = { 0 }; const uint8_t kek[16] = { 0xFF, 0 }; const uint8_t expected_wrapped_key[16+8] = { 0x04, 0x13, 0x37, 0x39, 0x82, 0xCF, 0xFA, 0x31, 0x81, 0xCA, 0x4F, 0x59, 0x74, 0x4D, 0xED, 0x29, 0x1F, 0x3F, 0xE5, 0x24, 0x00, 0x1B, 0x93, 0x20 }; uint8_t wrapped[16 + 8] = { 0 }; size_t wrapped_keylen = sizeof(wrapped); TEST_FFI_OK(botan_key_wrap3394, (key, sizeof(key), kek, sizeof(kek), wrapped, &wrapped_keylen)); result.test_eq("Expected wrapped keylen size", wrapped_keylen, 16 + 8); result.test_eq(nullptr, "Wrapped key", wrapped, wrapped_keylen, expected_wrapped_key, sizeof(expected_wrapped_key)); uint8_t dec_key[16] = { 0 }; size_t dec_keylen = sizeof(dec_key); TEST_FFI_OK(botan_key_unwrap3394, (wrapped, sizeof(wrapped), kek, sizeof(kek), dec_key, &dec_keylen)); result.test_eq(nullptr, "Unwrapped key", dec_key, dec_keylen, key, sizeof(key)); return result; } Test::Result ffi_test_rsa(botan_rng_t rng) { Test::Result result("FFI RSA"); botan_privkey_t priv; if(TEST_FFI_OK(botan_privkey_create_rsa, (&priv, rng, 1024))) { TEST_FFI_OK(botan_privkey_check_key, (priv, rng, 0)); botan_pubkey_t pub; TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); TEST_FFI_OK(botan_pubkey_check_key, (pub, rng, 0)); ffi_test_pubkey_export(result, pub, priv, rng); botan_mp_t p, q, d, n, e; botan_mp_init(&p); botan_mp_init(&q); botan_mp_init(&d); botan_mp_init(&n); botan_mp_init(&e); TEST_FFI_OK(botan_privkey_rsa_get_p, (p, priv)); TEST_FFI_OK(botan_privkey_rsa_get_q, (q, priv)); TEST_FFI_OK(botan_privkey_rsa_get_d, (d, priv)); TEST_FFI_OK(botan_privkey_rsa_get_e, (e, priv)); TEST_FFI_OK(botan_privkey_rsa_get_n, (n, priv)); // Confirm same (e,n) values in public key { botan_mp_t pub_e, pub_n; botan_mp_init(&pub_e); botan_mp_init(&pub_n); TEST_FFI_OK(botan_pubkey_rsa_get_e, (pub_e, pub)); TEST_FFI_OK(botan_pubkey_rsa_get_n, (pub_n, pub)); TEST_FFI_RC(1, botan_mp_equal, (pub_e, e)); TEST_FFI_RC(1, botan_mp_equal, (pub_n, n)); botan_mp_destroy(pub_e); botan_mp_destroy(pub_n); } TEST_FFI_RC(1, botan_mp_is_prime, (p, rng, 64)); TEST_FFI_RC(1, botan_mp_is_prime, (q, rng, 64)); // Test p != q TEST_FFI_RC(0, botan_mp_equal, (p, q)); // Test p * q == n botan_mp_t x; botan_mp_init(&x); TEST_FFI_OK(botan_mp_mul, (x, p, q)); TEST_FFI_RC(1, botan_mp_equal, (x, n)); botan_mp_destroy(x); botan_privkey_t loaded_privkey; // First try loading a bogus key and verify check_key fails TEST_FFI_OK(botan_privkey_load_rsa, (&loaded_privkey, n, d, q)); TEST_FFI_RC(-1, botan_privkey_check_key, (loaded_privkey, rng, 0)); botan_privkey_destroy(loaded_privkey); TEST_FFI_OK(botan_privkey_load_rsa, (&loaded_privkey, p, q, e)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey, rng, 0)); botan_pubkey_t loaded_pubkey; TEST_FFI_OK(botan_pubkey_load_rsa, (&loaded_pubkey, n, e)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey, rng, 0)); botan_mp_destroy(p); botan_mp_destroy(q); botan_mp_destroy(d); botan_mp_destroy(e); botan_mp_destroy(n); char namebuf[32] = { 0 }; size_t name_len = sizeof(namebuf); if(TEST_FFI_OK(botan_pubkey_algo_name, (loaded_pubkey, namebuf, &name_len))) { result.test_eq("algo name", std::string(namebuf), "RSA"); } botan_pk_op_encrypt_t encrypt; if(TEST_FFI_OK(botan_pk_op_encrypt_create, (&encrypt, loaded_pubkey, "OAEP(SHA-256)", 0))) { std::vector plaintext(32); TEST_FFI_OK(botan_rng_get, (rng, plaintext.data(), plaintext.size())); std::vector ciphertext(256); // TODO: no way to know this size from API size_t ctext_len = ciphertext.size(); if(TEST_FFI_OK(botan_pk_op_encrypt, (encrypt, rng, ciphertext.data(), &ctext_len, plaintext.data(), plaintext.size()))) { ciphertext.resize(ctext_len); botan_pk_op_decrypt_t decrypt; if(TEST_FFI_OK(botan_pk_op_decrypt_create, (&decrypt, priv, "OAEP(SHA-256)", 0))) { std::vector decrypted(256); // TODO as with above size_t decrypted_len = decrypted.size(); TEST_FFI_OK(botan_pk_op_decrypt, (decrypt, decrypted.data(), &decrypted_len, ciphertext.data(), ciphertext.size())); decrypted.resize(decrypted_len); result.test_eq("RSA plaintext", decrypted, plaintext); } TEST_FFI_OK(botan_pk_op_decrypt_destroy, (decrypt)); } TEST_FFI_OK(botan_pk_op_encrypt_destroy, (encrypt)); } TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey)); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey)); TEST_FFI_OK(botan_privkey_destroy, (priv)); } return result; } Test::Result ffi_test_dsa(botan_rng_t rng) { Test::Result result("FFI DSA"); botan_privkey_t priv; if(TEST_FFI_OK(botan_privkey_create, (&priv, "DSA", "dsa/jce/1024", rng))) { TEST_FFI_OK(botan_privkey_check_key, (priv, rng, 0)); botan_pubkey_t pub; TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); TEST_FFI_OK(botan_pubkey_check_key, (pub, rng, 0)); ffi_test_pubkey_export(result, pub, priv, rng); botan_mp_t p, q, g, x, y; botan_mp_init(&p); botan_mp_init(&q); botan_mp_init(&g); botan_mp_init(&x); botan_mp_init(&y); TEST_FFI_OK(botan_privkey_dsa_get_x, (x, priv)); TEST_FFI_OK(botan_pubkey_dsa_get_g, (g, pub)); TEST_FFI_OK(botan_pubkey_dsa_get_p, (p, pub)); TEST_FFI_OK(botan_pubkey_dsa_get_q, (q, pub)); TEST_FFI_OK(botan_pubkey_dsa_get_y, (y, pub)); botan_mp_t cmp; botan_mp_init(&cmp); TEST_FFI_OK(botan_privkey_get_field, (cmp, priv, "x")); TEST_FFI_RC(1, botan_mp_equal, (cmp, x)); TEST_FFI_OK(botan_privkey_get_field, (cmp, priv, "y")); TEST_FFI_RC(1, botan_mp_equal, (cmp, y)); TEST_FFI_OK(botan_privkey_get_field, (cmp, priv, "p")); TEST_FFI_RC(1, botan_mp_equal, (cmp, p)); botan_mp_destroy(cmp); botan_privkey_t loaded_privkey; TEST_FFI_OK(botan_privkey_load_dsa, (&loaded_privkey, p, q, g, x)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey, rng, 0)); botan_pubkey_t loaded_pubkey; TEST_FFI_OK(botan_pubkey_load_dsa, (&loaded_pubkey, p, q, g, y)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey, rng, 0)); botan_mp_destroy(p); botan_mp_destroy(q); botan_mp_destroy(g); botan_mp_destroy(y); botan_mp_destroy(x); botan_pk_op_sign_t signer; std::vector message(6, 6); std::vector signature(20 * 2); if(TEST_FFI_OK(botan_pk_op_sign_create, (&signer, loaded_privkey, "EMSA1(SHA-256)", 0))) { // TODO: break input into multiple calls to update TEST_FFI_OK(botan_pk_op_sign_update, (signer, message.data(), message.size())); signature.resize(20 * 2); // TODO: no way to derive this from API size_t sig_len = signature.size(); TEST_FFI_OK(botan_pk_op_sign_finish, (signer, rng, signature.data(), &sig_len)); signature.resize(sig_len); TEST_FFI_OK(botan_pk_op_sign_destroy, (signer)); } botan_pk_op_verify_t verifier; if(TEST_FFI_OK(botan_pk_op_verify_create, (&verifier, pub, "EMSA1(SHA-256)", 0))) { TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); // TODO: randomize this signature[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); message[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); signature[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); message[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); TEST_FFI_OK(botan_pk_op_verify_destroy, (verifier)); } TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey)); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey)); TEST_FFI_OK(botan_privkey_destroy, (priv)); } return result; } Test::Result ffi_test_ecdsa(botan_rng_t rng) { Test::Result result("FFI ECDSA"); static const char* kCurve = "secp384r1"; botan_privkey_t priv; botan_pubkey_t pub; botan_privkey_t loaded_privkey; botan_pubkey_t loaded_pubkey; REQUIRE_FFI_OK(botan_privkey_create_ecdsa, (&priv, rng, kCurve)); TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); ffi_test_pubkey_export(result, pub, priv, rng); // Check key load functions botan_mp_t private_scalar, public_x, public_y; botan_mp_init(&private_scalar); botan_mp_init(&public_x); botan_mp_init(&public_y); TEST_FFI_OK(botan_privkey_get_field, (private_scalar, priv, "x")); TEST_FFI_OK(botan_pubkey_get_field, (public_x, pub, "public_x")); TEST_FFI_OK(botan_pubkey_get_field, (public_y, pub, "public_y")); TEST_FFI_OK(botan_privkey_load_ecdsa, (&loaded_privkey, private_scalar, kCurve)); TEST_FFI_OK(botan_pubkey_load_ecdsa, (&loaded_pubkey, public_x, public_y, kCurve)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey, rng, 0)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey, rng, 0)); char namebuf[32] = { 0 }; size_t name_len = sizeof(namebuf); TEST_FFI_OK(botan_pubkey_algo_name, (pub, &namebuf[0], &name_len)); result.test_eq(namebuf, namebuf, "ECDSA"); std::vector message(1280), signature; TEST_FFI_OK(botan_rng_get, (rng, message.data(), message.size())); botan_pk_op_sign_t signer; if(TEST_FFI_OK(botan_pk_op_sign_create, (&signer, loaded_privkey, "EMSA1(SHA-384)", 0))) { // TODO: break input into multiple calls to update TEST_FFI_OK(botan_pk_op_sign_update, (signer, message.data(), message.size())); signature.resize(96); // TODO: no way to derive this from API size_t sig_len = signature.size(); TEST_FFI_OK(botan_pk_op_sign_finish, (signer, rng, signature.data(), &sig_len)); signature.resize(sig_len); TEST_FFI_OK(botan_pk_op_sign_destroy, (signer)); } botan_pk_op_verify_t verifier; if(TEST_FFI_OK(botan_pk_op_verify_create, (&verifier, pub, "EMSA1(SHA-384)", 0))) { TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); // TODO: randomize this signature[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); message[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); signature[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); message[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); TEST_FFI_OK(botan_pk_op_verify_destroy, (verifier)); } TEST_FFI_OK(botan_mp_destroy, (private_scalar)); TEST_FFI_OK(botan_mp_destroy, (public_x)); TEST_FFI_OK(botan_mp_destroy, (public_y)); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (priv)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey)); TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey)); return result; } Test::Result ffi_test_sm2(botan_rng_t rng) { Test::Result result("FFI SM2 Sig"); static const char* kCurve = "sm2p256v1"; const std::string sm2_ident = "SM2 Ident Field"; botan_privkey_t priv; botan_pubkey_t pub; botan_privkey_t loaded_privkey; botan_pubkey_t loaded_pubkey; REQUIRE_FFI_OK(botan_privkey_create, (&priv, "SM2_Sig", kCurve, rng)); TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); ffi_test_pubkey_export(result, pub, priv, rng); uint8_t za[32]; size_t sizeof_za = sizeof(za); TEST_FFI_OK(botan_pubkey_sm2_compute_za, (za, &sizeof_za, "Ident", "SM3", pub)); // Check key load functions botan_mp_t private_scalar, public_x, public_y; botan_mp_init(&private_scalar); botan_mp_init(&public_x); botan_mp_init(&public_y); TEST_FFI_OK(botan_privkey_get_field, (private_scalar, priv, "x")); TEST_FFI_OK(botan_pubkey_get_field, (public_x, pub, "public_x")); TEST_FFI_OK(botan_pubkey_get_field, (public_y, pub, "public_y")); TEST_FFI_OK(botan_privkey_load_sm2, (&loaded_privkey, private_scalar, kCurve)); TEST_FFI_OK(botan_pubkey_load_sm2, (&loaded_pubkey, public_x, public_y, kCurve)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey, rng, 0)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey, rng, 0)); char namebuf[32] = { 0 }; size_t name_len = sizeof(namebuf); TEST_FFI_OK(botan_pubkey_algo_name, (pub, &namebuf[0], &name_len)); result.test_eq(namebuf, namebuf, "SM2_Sig"); std::vector message(1280), signature; TEST_FFI_OK(botan_rng_get, (rng, message.data(), message.size())); botan_pk_op_sign_t signer; if(TEST_FFI_OK(botan_pk_op_sign_create, (&signer, loaded_privkey, sm2_ident.c_str(), 0))) { // TODO: break input into multiple calls to update TEST_FFI_OK(botan_pk_op_sign_update, (signer, message.data(), message.size())); signature.resize(96); // TODO: no way to derive this from API size_t sig_len = signature.size(); TEST_FFI_OK(botan_pk_op_sign_finish, (signer, rng, signature.data(), &sig_len)); signature.resize(sig_len); TEST_FFI_OK(botan_pk_op_sign_destroy, (signer)); } botan_pk_op_verify_t verifier = nullptr; if(signature.size() > 0 && TEST_FFI_OK(botan_pk_op_verify_create, (&verifier, pub, sm2_ident.c_str(), 0))) { TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); // TODO: randomize this signature[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); message[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); signature[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_RC(BOTAN_FFI_INVALID_VERIFIER, botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); message[0] ^= 1; TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); TEST_FFI_OK(botan_pk_op_verify_destroy, (verifier)); } TEST_FFI_OK(botan_mp_destroy, (private_scalar)); TEST_FFI_OK(botan_mp_destroy, (public_x)); TEST_FFI_OK(botan_mp_destroy, (public_y)); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (priv)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey)); TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey)); return result; } Test::Result ffi_test_sm2_enc(botan_rng_t rng) { Test::Result result("FFI SM2 Enc"); static const char* kCurve = "sm2p256v1"; botan_privkey_t priv; botan_pubkey_t pub; botan_privkey_t loaded_privkey; botan_pubkey_t loaded_pubkey; REQUIRE_FFI_OK(botan_privkey_create, (&priv, "SM2_Enc", kCurve, rng)); TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); ffi_test_pubkey_export(result, pub, priv, rng); uint8_t za[32]; size_t sizeof_za = sizeof(za); TEST_FFI_OK(botan_pubkey_sm2_compute_za, (za, &sizeof_za, "Ident", "SM3", pub)); // Check key load functions botan_mp_t private_scalar, public_x, public_y; botan_mp_init(&private_scalar); botan_mp_init(&public_x); botan_mp_init(&public_y); TEST_FFI_OK(botan_privkey_get_field, (private_scalar, priv, "x")); TEST_FFI_OK(botan_pubkey_get_field, (public_x, pub, "public_x")); TEST_FFI_OK(botan_pubkey_get_field, (public_y, pub, "public_y")); TEST_FFI_OK(botan_privkey_load_sm2_enc, (&loaded_privkey, private_scalar, kCurve)); TEST_FFI_OK(botan_pubkey_load_sm2_enc, (&loaded_pubkey, public_x, public_y, kCurve)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey, rng, 0)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey, rng, 0)); char namebuf[32] = { 0 }; size_t name_len = sizeof(namebuf); TEST_FFI_OK(botan_pubkey_algo_name, (pub, &namebuf[0], &name_len)); result.test_eq(namebuf, namebuf, "SM2_Enc"); std::vector message(32); std::vector ciphertext(4096); TEST_FFI_OK(botan_rng_get, (rng, message.data(), message.size())); botan_pk_op_encrypt_t enc; if(TEST_FFI_OK(botan_pk_op_encrypt_create, (&enc, loaded_pubkey, "", 0))) { size_t ctext_len = ciphertext.size(); TEST_FFI_OK(botan_pk_op_encrypt, (enc, rng, ciphertext.data(), &ctext_len, message.data(), message.size())); ciphertext.resize(ctext_len); botan_pk_op_decrypt_t dec; TEST_FFI_OK(botan_pk_op_decrypt_create, (&dec, loaded_privkey, "", 0)); std::vector recovered(message.size()); size_t recovered_len = recovered.size(); TEST_FFI_OK(botan_pk_op_decrypt, (dec, recovered.data(), &recovered_len, ciphertext.data(), ciphertext.size())); botan_pk_op_decrypt_destroy(dec); } botan_pk_op_encrypt_destroy(enc); TEST_FFI_OK(botan_mp_destroy, (private_scalar)); TEST_FFI_OK(botan_mp_destroy, (public_x)); TEST_FFI_OK(botan_mp_destroy, (public_y)); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (priv)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey)); TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey)); return result; } Test::Result ffi_test_ecdh(botan_rng_t rng) { Test::Result result("FFI ECDH"); botan_mp_t private_scalar, public_x, public_y; botan_privkey_t loaded_privkey1; botan_pubkey_t loaded_pubkey1; botan_mp_init(&private_scalar); botan_mp_init(&public_x); botan_mp_init(&public_y); botan_privkey_t priv1; REQUIRE_FFI_OK(botan_privkey_create_ecdh, (&priv1, rng, "secp256r1")); botan_privkey_t priv2; REQUIRE_FFI_OK(botan_privkey_create_ecdh, (&priv2, rng, "secp256r1")); botan_pubkey_t pub1; REQUIRE_FFI_OK(botan_privkey_export_pubkey, (&pub1, priv1)); botan_pubkey_t pub2; REQUIRE_FFI_OK(botan_privkey_export_pubkey, (&pub2, priv2)); /* Reload key-pair1 in order to test functions for key loading */ TEST_FFI_OK(botan_privkey_get_field, (private_scalar, priv1, "x")); TEST_FFI_OK(botan_pubkey_get_field, (public_x, pub1, "public_x")); TEST_FFI_OK(botan_pubkey_get_field, (public_y, pub1, "public_y")); REQUIRE_FFI_OK(botan_privkey_load_ecdh, (&loaded_privkey1, private_scalar, "secp256r1")); REQUIRE_FFI_OK(botan_pubkey_load_ecdh, (&loaded_pubkey1, public_x, public_y, "secp256r1")); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey1, rng, 0)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey1, rng, 0)); ffi_test_pubkey_export(result, loaded_pubkey1, priv1, rng); ffi_test_pubkey_export(result, pub2, priv2, rng); botan_pk_op_ka_t ka1; REQUIRE_FFI_OK(botan_pk_op_key_agreement_create, (&ka1, loaded_privkey1, "KDF2(SHA-256)", 0)); botan_pk_op_ka_t ka2; REQUIRE_FFI_OK(botan_pk_op_key_agreement_create, (&ka2, priv2, "KDF2(SHA-256)", 0)); size_t pubkey1_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pk_op_key_agreement_export_public, (priv1, nullptr, &pubkey1_len)); std::vector pubkey1(pubkey1_len); REQUIRE_FFI_OK(botan_pk_op_key_agreement_export_public, (priv1, pubkey1.data(), &pubkey1_len)); size_t pubkey2_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pk_op_key_agreement_export_public, (priv2, nullptr, &pubkey2_len)); std::vector pubkey2(pubkey2_len); REQUIRE_FFI_OK(botan_pk_op_key_agreement_export_public, (priv2, pubkey2.data(), &pubkey2_len)); std::vector salt(32); TEST_FFI_OK(botan_rng_get, (rng, salt.data(), salt.size())); const size_t shared_key_len = 64; std::vector key1(shared_key_len); size_t key1_len = key1.size(); TEST_FFI_OK(botan_pk_op_key_agreement, (ka1, key1.data(), &key1_len, pubkey2.data(), pubkey2.size(), salt.data(), salt.size())); std::vector key2(shared_key_len); size_t key2_len = key2.size(); TEST_FFI_OK(botan_pk_op_key_agreement, (ka2, key2.data(), &key2_len, pubkey1.data(), pubkey1.size(), salt.data(), salt.size())); result.test_eq("shared ECDH key", key1, key2); TEST_FFI_OK(botan_mp_destroy, (private_scalar)); TEST_FFI_OK(botan_mp_destroy, (public_x)); TEST_FFI_OK(botan_mp_destroy, (public_y)); TEST_FFI_OK(botan_pk_op_key_agreement_destroy, (ka1)); TEST_FFI_OK(botan_pk_op_key_agreement_destroy, (ka2)); TEST_FFI_OK(botan_privkey_destroy, (priv1)); TEST_FFI_OK(botan_privkey_destroy, (priv2)); TEST_FFI_OK(botan_pubkey_destroy, (pub1)); TEST_FFI_OK(botan_pubkey_destroy, (pub2)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey1)); TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey1)); return result; } Test::Result ffi_test_mceliece(botan_rng_t rng) { Test::Result result("FFI McEliece"); botan_privkey_t priv; #if defined(BOTAN_HAS_MCELIECE) if(TEST_FFI_OK(botan_privkey_create_mceliece, (&priv, rng, 2048, 50))) { botan_pubkey_t pub; TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); ffi_test_pubkey_export(result, pub, priv, rng); char namebuf[32] = { 0 }; size_t name_len = sizeof(namebuf); if(TEST_FFI_OK(botan_pubkey_algo_name, (pub, namebuf, &name_len))) { result.test_eq("algo name", std::string(namebuf), "McEliece"); } // TODO test KEM #if defined(BOTAN_HAS_MCEIES) const uint8_t ad[8] = { 0xAD, 0xAD, 0xAD, 0xAD, 0xBE, 0xEE, 0xEE, 0xFF }; const size_t ad_len = sizeof(ad); const Botan::secure_vector plaintext = Test::rng().random_vec(Test::rng().next_byte()); size_t plaintext_len = plaintext.size(); size_t ciphertext_len = 0; // first calculate ciphertext length TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_mceies_encrypt, (pub, rng, "AES-256/OCB", plaintext.data(), plaintext.size(), ad, ad_len, nullptr, &ciphertext_len)); std::vector ciphertext(ciphertext_len); // now encrypt if(TEST_FFI_OK(botan_mceies_encrypt, (pub, rng, "AES-256/OCB", plaintext.data(), plaintext.size(), ad, ad_len, ciphertext.data(), &ciphertext_len))) { std::vector decrypted(plaintext.size()); size_t decrypted_len = plaintext_len; TEST_FFI_OK(botan_mceies_decrypt, (priv, "AES-256/OCB", ciphertext.data(), ciphertext.size(), ad, ad_len, decrypted.data(), &decrypted_len)); result.test_eq("MCIES plaintext", decrypted, plaintext); } #endif TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (priv)); } #else // Not included, test that calling the FFI function work (and returns an error) TEST_FFI_RC(BOTAN_FFI_ERROR_NOT_IMPLEMENTED, botan_privkey_create_mceliece, (&priv, rng, 2048, 50)); #endif return result; } Test::Result ffi_test_ed25519(botan_rng_t rng) { Test::Result result("FFI Ed25519"); botan_pubkey_t pub; botan_privkey_t priv; // From draft-koch-eddsa-for-openpgp-04 const std::vector seed = Botan::hex_decode( "1a8b1ff05ded48e18bf50166c664ab023ea70003d78d9e41f5758a91d850f8d2"); const std::vector pubkey = Botan::hex_decode( "3f098994bdd916ed4053197934e4a87c80733a1280d62f8010992e43ee3b2406"); const std::vector message = Botan::hex_decode( "4f70656e504750040016080006050255f95f9504ff0000000c"); const std::vector exp_sig = Botan::hex_decode( "56f90cca98e2102637bd983fdb16c131dfd27ed82bf4dde5606e0d756aed3366" "d09c4fa11527f038e0f57f2201d82f2ea2c9033265fa6ceb489e854bae61b404"); TEST_FFI_OK(botan_privkey_load_ed25519, (&priv, seed.data())); uint8_t retr_privkey[64]; TEST_FFI_OK(botan_privkey_ed25519_get_privkey, (priv, retr_privkey)); result.test_eq(nullptr, "Public key matches", retr_privkey + 32, 32, pubkey.data(), pubkey.size()); TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); uint8_t retr_pubkey[32]; TEST_FFI_OK(botan_pubkey_ed25519_get_pubkey, (pub, retr_pubkey)); result.test_eq(nullptr, "Public key matches", retr_pubkey, 32, pubkey.data(), pubkey.size()); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_pubkey_load_ed25519, (&pub, pubkey.data())); botan_pk_op_sign_t signer; std::vector signature; if(TEST_FFI_OK(botan_pk_op_sign_create, (&signer, priv, "SHA-256", 0))) { TEST_FFI_OK(botan_pk_op_sign_update, (signer, message.data(), message.size())); signature.resize(128); size_t sig_len = signature.size(); TEST_FFI_OK(botan_pk_op_sign_finish, (signer, rng, signature.data(), &sig_len)); signature.resize(sig_len); TEST_FFI_OK(botan_pk_op_sign_destroy, (signer)); } result.test_eq("Expected signature", signature, exp_sig); botan_pk_op_verify_t verifier; if(TEST_FFI_OK(botan_pk_op_verify_create, (&verifier, pub, "SHA-256", 0))) { TEST_FFI_OK(botan_pk_op_verify_update, (verifier, message.data(), message.size())); TEST_FFI_OK(botan_pk_op_verify_finish, (verifier, signature.data(), signature.size())); TEST_FFI_OK(botan_pk_op_verify_destroy, (verifier)); } TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (priv)); return result; } Test::Result ffi_test_elgamal(botan_rng_t rng) { Test::Result result("FFI ELGAMAL"); botan_privkey_t priv; if(TEST_FFI_OK(botan_privkey_create, (&priv, "ElGamal", nullptr, rng))) { TEST_FFI_OK(botan_privkey_check_key, (priv, rng, 0)); botan_pubkey_t pub; TEST_FFI_OK(botan_privkey_export_pubkey, (&pub, priv)); TEST_FFI_OK(botan_pubkey_check_key, (pub, rng, 0)); ffi_test_pubkey_export(result, pub, priv, rng); botan_mp_t p, g, x, y; botan_mp_init(&p); botan_mp_init(&g); botan_mp_init(&x); botan_mp_init(&y); TEST_FFI_OK(botan_pubkey_get_field, (p, pub, "p")); TEST_FFI_OK(botan_pubkey_get_field, (g, pub, "g")); TEST_FFI_OK(botan_pubkey_get_field, (y, pub, "y")); TEST_FFI_OK(botan_privkey_get_field, (x, priv, "x")); size_t p_len = 0; TEST_FFI_OK(botan_mp_num_bytes, (p, &p_len)); botan_privkey_t loaded_privkey; TEST_FFI_OK(botan_privkey_load_elgamal, (&loaded_privkey, p, g, x)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey, rng, 0)); botan_pubkey_t loaded_pubkey; TEST_FFI_OK(botan_pubkey_load_elgamal, (&loaded_pubkey, p, g, y)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey, rng, 0)); botan_mp_destroy(p); botan_mp_destroy(g); botan_mp_destroy(y); botan_mp_destroy(x); std::vector plaintext(16, 0xFF); std::vector ciphertext(p_len*2, 0); std::vector decryption(16, 0); // Test encryption botan_pk_op_encrypt_t op_enc; size_t ct_len = ciphertext.size(); REQUIRE_FFI_OK(botan_pk_op_encrypt_create, (&op_enc, loaded_pubkey, "Raw", 0)); TEST_FFI_OK(botan_pk_op_encrypt, (op_enc, rng, ciphertext.data(), &ct_len, plaintext.data(), plaintext.size())); TEST_FFI_OK(botan_pk_op_encrypt_destroy, (op_enc)); // Test decryption botan_pk_op_decrypt_t op_dec; size_t pt_len = decryption.size(); REQUIRE_FFI_OK(botan_pk_op_decrypt_create, (&op_dec, loaded_privkey, "Raw", 0)); TEST_FFI_OK(botan_pk_op_decrypt, (op_dec, decryption.data(), &pt_len, ciphertext.data(), ct_len)); TEST_FFI_OK(botan_pk_op_decrypt_destroy, (op_dec)); TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey)); TEST_FFI_OK(botan_pubkey_destroy, (pub)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey)); TEST_FFI_OK(botan_privkey_destroy, (priv)); } return result; } Test::Result ffi_test_dh(botan_rng_t rng) { Test::Result result("FFI DH"); botan_mp_t private_x, public_g, public_p, public_y; botan_privkey_t loaded_privkey1; botan_pubkey_t loaded_pubkey1; botan_mp_init(&private_x); botan_mp_init(&public_g); botan_mp_init(&public_p); botan_mp_init(&public_y); botan_privkey_t priv1; REQUIRE_FFI_OK(botan_privkey_create_dh, (&priv1, rng, "modp/ietf/2048")); botan_privkey_t priv2; REQUIRE_FFI_OK(botan_privkey_create_dh, (&priv2, rng, "modp/ietf/2048")); botan_pubkey_t pub1; REQUIRE_FFI_OK(botan_privkey_export_pubkey, (&pub1, priv1)); botan_pubkey_t pub2; REQUIRE_FFI_OK(botan_privkey_export_pubkey, (&pub2, priv2)); // Reload key-pair1 in order to test functions for key loading TEST_FFI_OK(botan_privkey_get_field, (private_x, priv1, "x")); TEST_FFI_OK(botan_pubkey_get_field, (public_g, pub1, "g")); TEST_FFI_OK(botan_pubkey_get_field, (public_p, pub1, "p")); TEST_FFI_OK(botan_pubkey_get_field, (public_y, pub1, "y")); TEST_FFI_OK(botan_privkey_load_dh, (&loaded_privkey1, public_p, public_g, private_x)); TEST_FFI_OK(botan_pubkey_load_dh, (&loaded_pubkey1, public_p, public_g, public_y)); TEST_FFI_OK(botan_privkey_check_key, (loaded_privkey1, rng, 0)); TEST_FFI_OK(botan_pubkey_check_key, (loaded_pubkey1, rng, 0)); botan_mp_t loaded_public_g, loaded_public_p, loaded_public_y; botan_mp_init(&loaded_public_g); botan_mp_init(&loaded_public_p); botan_mp_init(&loaded_public_y); TEST_FFI_OK(botan_pubkey_get_field, (loaded_public_g, loaded_pubkey1, "g")); TEST_FFI_OK(botan_pubkey_get_field, (loaded_public_p, loaded_pubkey1, "p")); TEST_FFI_OK(botan_pubkey_get_field, (loaded_public_y, loaded_pubkey1, "y")); int cmp; TEST_FFI_OK(botan_mp_cmp, (&cmp, loaded_public_g, public_g)); result.confirm("bigint_mp_cmp(g, g)", cmp == 0); TEST_FFI_OK(botan_mp_cmp, (&cmp, loaded_public_p, public_p)); result.confirm("bigint_mp_cmp(p, p)", cmp == 0); TEST_FFI_OK(botan_mp_cmp, (&cmp, loaded_public_y, public_y)); result.confirm("bigint_mp_cmp(y, y)", cmp == 0); botan_pk_op_ka_t ka1; REQUIRE_FFI_OK(botan_pk_op_key_agreement_create, (&ka1, loaded_privkey1, "Raw", 0)); botan_pk_op_ka_t ka2; REQUIRE_FFI_OK(botan_pk_op_key_agreement_create, (&ka2, priv2, "Raw", 0)); size_t pubkey1_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pk_op_key_agreement_export_public, (priv1, nullptr, &pubkey1_len)); std::vector pubkey1(pubkey1_len); REQUIRE_FFI_OK(botan_pk_op_key_agreement_export_public, (priv1, pubkey1.data(), &pubkey1_len)); size_t pubkey2_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_pk_op_key_agreement_export_public, (priv2, nullptr, &pubkey2_len)); std::vector pubkey2(pubkey2_len); REQUIRE_FFI_OK(botan_pk_op_key_agreement_export_public, (priv2, pubkey2.data(), &pubkey2_len)); std::vector salt(32); TEST_FFI_OK(botan_rng_get, (rng, salt.data(), salt.size())); const size_t shared_key_len = 256; std::vector key1(shared_key_len); size_t key1_len = key1.size(); TEST_FFI_OK(botan_pk_op_key_agreement, (ka1, key1.data(), &key1_len, pubkey2.data(), pubkey2.size(), salt.data(), salt.size())); std::vector key2(shared_key_len); size_t key2_len = key2.size(); TEST_FFI_OK(botan_pk_op_key_agreement, (ka2, key2.data(), &key2_len, pubkey1.data(), pubkey1.size(), salt.data(), salt.size())); result.test_eq("shared DH key", key1, key2); TEST_FFI_OK(botan_mp_destroy, (private_x)); TEST_FFI_OK(botan_mp_destroy, (public_p)); TEST_FFI_OK(botan_mp_destroy, (public_g)); TEST_FFI_OK(botan_mp_destroy, (public_y)); TEST_FFI_OK(botan_mp_destroy, (loaded_public_p)); TEST_FFI_OK(botan_mp_destroy, (loaded_public_g)); TEST_FFI_OK(botan_mp_destroy, (loaded_public_y)); TEST_FFI_OK(botan_pk_op_key_agreement_destroy, (ka1)); TEST_FFI_OK(botan_pk_op_key_agreement_destroy, (ka2)); TEST_FFI_OK(botan_privkey_destroy, (priv1)); TEST_FFI_OK(botan_privkey_destroy, (priv2)); TEST_FFI_OK(botan_pubkey_destroy, (pub1)); TEST_FFI_OK(botan_pubkey_destroy, (pub2)); TEST_FFI_OK(botan_privkey_destroy, (loaded_privkey1)); TEST_FFI_OK(botan_pubkey_destroy, (loaded_pubkey1)); return result; } }; BOTAN_REGISTER_TEST("ffi", FFI_Unit_Tests); #endif } } botan-2.4.0/src/tests/test_filters.cpp000066400000000000000000000647421322470703100200000ustar00rootroot00000000000000/* * (C) 2016 Daniel Neus * 2016,2017 Jack Lloyd * 2017 René Korthaus * 2017 Philippe Lieser * * Botan is released under the Simplified BSD License (see license.txt) */ #define BOTAN_NO_DEPRECATED_WARNINGS #include "tests.h" #if defined(BOTAN_HAS_FILTERS) #include #include #include #include #include #include #endif #if defined(BOTAN_HAS_CODEC_FILTERS) #include #include #endif #if defined(BOTAN_HAS_PIPE_UNIXFD_IO) #include #include #endif #if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_FILTERS) class Filter_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_secqueue()); results.push_back(test_data_src_sink()); results.push_back(test_data_src_sink_flush()); results.push_back(test_pipe_io()); results.push_back(test_pipe_fd_io()); results.push_back(test_pipe_errors()); results.push_back(test_pipe_hash()); results.push_back(test_pipe_mac()); results.push_back(test_pipe_stream()); results.push_back(test_pipe_cbc()); results.push_back(test_pipe_cfb()); results.push_back(test_pipe_compress()); results.push_back(test_pipe_compress_bzip2()); results.push_back(test_pipe_codec()); results.push_back(test_fork()); results.push_back(test_chain()); results.push_back(test_threaded_fork()); return results; } private: Test::Result test_secqueue() { Test::Result result("SecureQueue"); try { Botan::SecureQueue queue_a; result.test_eq("queue not attachable", queue_a.attachable(), false); std::vector test_data = {0x24, 0xB2, 0xBF, 0xC2, 0xE6, 0xD4, 0x7E, 0x04, 0x67, 0xB3}; queue_a.write(test_data.data(), test_data.size()); result.test_eq("size of SecureQueue is correct", queue_a.size(), test_data.size()); result.test_eq("0 bytes read so far from SecureQueue", queue_a.get_bytes_read(), 0); uint8_t b; result.test_eq("check_available", queue_a.check_available(1), true); result.test_eq("check_available", queue_a.check_available(50), false); size_t bytes_read = queue_a.read_byte(b); result.test_eq("1 byte read", bytes_read, 1); Botan::secure_vector produced(b); Botan::secure_vector expected(test_data.at(0)); result.test_eq("byte read is correct", produced, expected); result.test_eq("1 bytes read so far from SecureQueue", queue_a.get_bytes_read(), 1); Botan::SecureQueue queue_b; queue_a = queue_b; result.test_eq("bytes_read is set correctly", queue_a.get_bytes_read(), 0); } catch(std::exception& e) { result.test_failure("SecureQueue", e.what()); } return result; } Test::Result test_data_src_sink() { Test::Result result("DataSink"); #if defined(BOTAN_HAS_CODEC_FILTERS) std::ostringstream oss; Botan::Pipe pipe(new Botan::Hex_Decoder, new Botan::DataSink_Stream(oss)); Botan::DataSource_Memory input_mem("65666768"); pipe.process_msg(input_mem); result.test_eq("output string", oss.str(), "efgh"); Botan::DataSource_Memory input_mem2("41414141"); pipe.process_msg(input_mem2); result.test_eq("output string", oss.str(), "efghAAAA"); std::istringstream iss("4343"); Botan::DataSource_Stream input_strm(iss); pipe.process_msg(input_strm); result.test_eq("output string", oss.str(), "efghAAAACC"); #endif return result; } Test::Result test_data_src_sink_flush() { Test::Result result("DataSinkFlush"); #if defined(BOTAN_HAS_CODEC_FILTERS) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) const std::string tmp_name("botan_test_data_src_sink_flush.tmp"); std::ofstream outfile(tmp_name); Botan::Pipe pipe(new Botan::Hex_Decoder, new Botan::DataSink_Stream(outfile)); Botan::DataSource_Memory input_mem("65666768"); pipe.process_msg(input_mem); std::ifstream outfile_read(tmp_name); std::stringstream ss; ss << outfile_read.rdbuf(); std::string foo = ss.str(); result.test_eq("output string", ss.str(), "efgh"); // ensure files are closed outfile.close(); outfile_read.close(); if(std::remove(tmp_name.c_str()) != 0) { result.test_failure("Failed to remove temporary file at conclusion of test"); } #endif return result; } Test::Result test_pipe_io() { Test::Result result("Pipe I/O operators"); #if defined(BOTAN_HAS_CODEC_FILTERS) Botan::Pipe pipe(new Botan::Hex_Encoder); pipe.process_msg("ABCD"); std::ostringstream oss; oss << pipe; result.test_eq("output string", oss.str(), "41424344"); std::istringstream iss("AAAA"); pipe.start_msg(); iss >> pipe; pipe.end_msg(); pipe.set_default_msg(1); oss << pipe; result.test_eq("output string2", oss.str(), "4142434441414141"); #endif return result; } Test::Result test_pipe_errors() { Test::Result result("Pipe"); Botan::Pipe pipe; pipe.append_filter(nullptr); // ignored pipe.append(nullptr); // ignored pipe.prepend(nullptr); // ignored pipe.pop(); // empty pipe, so ignored std::unique_ptr queue_filter(new Botan::SecureQueue); // can't explicitly insert a queue into the pipe because they are implicit result.test_throws("pipe error", "Invalid argument Pipe::append: SecureQueue cannot be used", [&]() { pipe.append(queue_filter.get()); }); result.test_throws("pipe error", "Invalid argument Pipe::prepend: SecureQueue cannot be used", [&]() { pipe.prepend(queue_filter.get()); }); pipe.append_filter(new Botan::BitBucket); // succeeds pipe.pop(); pipe.start_msg(); std::unique_ptr filter(new Botan::BitBucket); // now inside a message, cannot modify pipe structure result.test_throws("pipe error", "Cannot call Pipe::append_filter after start_msg", [&]() { pipe.append_filter(filter.get()); }); result.test_throws("pipe error", "Cannot append to a Pipe while it is processing", [&]() { pipe.append(filter.get()); }); result.test_throws("pipe error", "Cannot prepend to a Pipe while it is processing", [&]() { pipe.prepend(filter.get()); }); result.test_throws("pipe error", "Cannot pop off a Pipe while it is processing", [&]() { pipe.pop(); }); pipe.end_msg(); result.test_throws("pipe error", "Cannot call Pipe::append_filter after start_msg", [&]() { pipe.append_filter(filter.get()); }); result.test_throws("pipe error", "Invalid argument Pipe::read: Invalid message number 100", [&]() { uint8_t b; size_t got = pipe.read(&b, 1, 100); BOTAN_UNUSED(got); }); pipe.append(nullptr); // ignored pipe.prepend(nullptr); // ignored pipe.pop(); // empty pipe, so ignored return result; } Test::Result test_pipe_mac() { Test::Result result("Pipe"); #if defined(BOTAN_HAS_CODEC_FILTERS) && defined(BOTAN_HAS_HMAC) && defined(BOTAN_HAS_SHA2_32) const Botan::SymmetricKey key("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); Botan::Pipe pipe(new Botan::MAC_Filter("HMAC(SHA-256)", key, 12), new Botan::Base64_Encoder); pipe.process_msg("Hi"); pipe.process_msg("Bye"); pipe.process_msg("Hi"); result.test_eq("MAC 1", pipe.read_all_as_string(0), "e7NoVbtudgU0QiCZ"); result.test_eq("MAC 2", pipe.read_all_as_string(1), "LhPnfEG+0rk+Ej6y"); result.test_eq("MAC 3", pipe.read_all_as_string(2), "e7NoVbtudgU0QiCZ"); #endif return result; } Test::Result test_pipe_hash() { Test::Result result("Pipe"); #if defined(BOTAN_HAS_SHA2_32) // unrelated test of popping a chain Botan::Pipe pipe(new Botan::Chain(new Botan::Hash_Filter("SHA-224"), new Botan::Hash_Filter("SHA-224"))); pipe.pop(); pipe.append(new Botan::Hash_Filter("SHA-256")); result.test_eq("Message count", pipe.message_count(), 0); pipe.start_msg(); uint8_t inb = 0x41; pipe.write(&inb, 1); pipe.write(std::vector(6, 0x41)); pipe.write(inb); pipe.end_msg(); result.test_eq("Message count", pipe.message_count(), 1); result.test_eq("Message size", pipe.remaining(), 32); std::vector out(32), last16(16); result.test_eq("Bytes read", pipe.get_bytes_read(0), 0); result.test_eq("More to read", pipe.end_of_data(), false); result.test_eq("Expected read count", pipe.read(&out[0], 5), 5); result.test_eq("Bytes read", pipe.get_bytes_read(0), 5); result.test_eq("Peek read", pipe.peek(last16.data(), 18, 11), 16); result.test_eq("Expected read count", pipe.read(&out[5], 17), 17); result.test_eq("Bytes read", pipe.get_bytes_read(0), 22); result.test_eq("Remaining", pipe.remaining(), 10); result.test_eq("Remaining", pipe.remaining(), 10); result.test_eq("Expected read count", pipe.read(&out[22], 12), 10); result.test_eq("Expected read count", pipe.read(&out[0], 1), 0); // no more output result.test_eq("Bytes read", pipe.get_bytes_read(0), 32); result.test_eq("No more to read", pipe.end_of_data(), true); result.test_eq("Expected output", out, "C34AB6ABB7B2BB595BC25C3B388C872FD1D575819A8F55CC689510285E212385"); result.test_eq("Expected last16", last16, "D1D575819A8F55CC689510285E212385"); pipe.reset(); #if defined(BOTAN_HAS_CRC32) pipe.prepend(new Botan::Hash_Filter("CRC32")); pipe.append(new Botan::Hash_Filter("CRC32")); pipe.process_msg(std::vector(1024, 0)); result.test_eq("Expected CRC32d", pipe.read_all(1), "99841F60"); #endif #endif return result; } Test::Result test_pipe_cfb() { Test::Result result("Pipe CFB"); #if defined(BOTAN_HAS_BLOWFISH) && defined(BOTAN_HAS_MODE_CFB) && defined(BOTAN_HAS_CODEC_FILTERS) // Generated with Botan 1.10 const Botan::InitializationVector iv("AABBCCDDEEFF0123"); const Botan::SymmetricKey key("AABBCCDDEEFF0123"); const uint8_t msg_bits[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; const std::string cfb_expected[] = { "A4", "BEA4", "06AD98", "E4AFC5AC", "A9B531559C", "38B60DA66445", "194F5E93199839", "093B6381D2E5D806", "B44FA624226EECF027", "80B8DC3332A835AC11A8", "2C0E910A1E5C38344CC5BB", "3CB6180AE2E189342F681023", "DE0F4B10C7D9CADDB5A9078199", "FAE18B0ED873F234CCD6E1555B2D", "7195FFE735B0A95065BA244C77A11F", }; Botan::Keyed_Filter* cfb_enc = Botan::get_cipher("Blowfish/CFB", key, iv, Botan::ENCRYPTION); Botan::Pipe enc_pipe(cfb_enc, new Botan::Hex_Encoder); Botan::Keyed_Filter* cfb_dec = Botan::get_cipher("Blowfish/CFB", key, Botan::DECRYPTION); cfb_dec->set_iv(iv); Botan::Pipe dec_pipe(new Botan::Hex_Decoder, cfb_dec, new Botan::Hex_Encoder); for(size_t i = 1; i != sizeof(msg_bits); ++i) { enc_pipe.start_msg(); enc_pipe.write(msg_bits, i); enc_pipe.end_msg(); dec_pipe.process_msg(cfb_expected[i-1]); } result.test_eq("enc pipe msg count", enc_pipe.message_count(), sizeof(msg_bits) - 1); result.test_eq("dec pipe msg count", dec_pipe.message_count(), sizeof(msg_bits) - 1); for(size_t i = 0; i != enc_pipe.message_count(); ++i) { result.test_eq("encrypt", enc_pipe.read_all_as_string(i), cfb_expected[i]); } for(size_t i = 0; i != dec_pipe.message_count(); ++i) { result.test_eq("decrypt", dec_pipe.read_all_as_string(i), Botan::hex_encode(msg_bits, i+1)); } #endif return result; } Test::Result test_pipe_cbc() { Test::Result result("Pipe CBC"); #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_MODE_CBC) && defined(BOTAN_HAS_CIPHER_MODE_PADDING) Botan::Cipher_Mode_Filter* cipher = new Botan::Cipher_Mode_Filter(Botan::get_cipher_mode("AES-128/CBC/PKCS7", Botan::ENCRYPTION)); result.test_eq("Cipher filter name", cipher->name(), "AES-128/CBC/PKCS7"); result.test_eq("Cipher filter nonce size", cipher->valid_iv_length(16), true); result.test_eq("Cipher filter nonce size", cipher->valid_iv_length(17), false); result.test_eq("Cipher key length max", cipher->key_spec().maximum_keylength(), 16); result.test_eq("Cipher key length min", cipher->key_spec().minimum_keylength(), 16); // takes ownership of cipher Botan::Pipe pipe(cipher); cipher->set_key(Botan::SymmetricKey("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); cipher->set_iv(Botan::InitializationVector("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); pipe.process_msg("Don't use plain CBC mode"); result.test_eq("Message count", pipe.message_count(), 1); result.test_eq("Bytes read", pipe.get_bytes_read(), 0); auto ciphertext = pipe.read_all(); result.test_eq("Bytes read after", pipe.get_bytes_read(), ciphertext.size()); result.test_eq("Ciphertext", ciphertext, "9BDD7300E0CB61CA71FFF957A71605DB 6836159C36781246A1ADF50982757F4B"); pipe.process_msg("IV carryover"); auto ciphertext2 = pipe.read_all(1); pipe.process_msg("IV carryover2"); auto ciphertext3 = pipe.read_all(2); // These values tested against PyCrypto result.test_eq("Ciphertext2", ciphertext2, "AA8D682958A4A044735DAC502B274DB2"); result.test_eq("Ciphertext3", ciphertext3, "1241B9976F73051BCF809525D6E86C25"); Botan::Cipher_Mode_Filter* dec_cipher = new Botan::Cipher_Mode_Filter(Botan::get_cipher_mode("AES-128/CBC/PKCS7", Botan::DECRYPTION)); pipe.append(dec_cipher); dec_cipher->set_key(Botan::SymmetricKey("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")); dec_cipher->set_iv(Botan::InitializationVector("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB")); // reset the IV on the encryption filter cipher->set_iv(Botan::InitializationVector("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB")); const std::vector zeros_in(1024); Botan::DataSource_Memory src(zeros_in); pipe.start_msg(); pipe.write(src); pipe.end_msg(); pipe.set_default_msg(3); result.test_eq("Bytes read", pipe.get_bytes_read(), 0); Botan::secure_vector zeros_out = pipe.read_all(); result.test_eq("Bytes read", pipe.get_bytes_read(), zeros_out.size()); result.test_eq("Cipher roundtrip", zeros_in, zeros_out); #endif return result; } Test::Result test_pipe_compress() { Test::Result result("Pipe compress zlib"); #if defined(BOTAN_HAS_ZLIB) std::unique_ptr comp_f(new Botan::Compression_Filter("zlib", 9)); result.test_eq("Compressor filter name", comp_f->name(), "Zlib_Compression"); Botan::Pipe pipe(comp_f.release()); const std::string input_str = "Hello there HELLO there I said is this thing on?"; pipe.start_msg(); pipe.write(input_str); pipe.end_msg(); auto compr = pipe.read_all(0); // Can't do equality check on compression because output may differ result.test_lt("Compressed is shorter", compr.size(), input_str.size()); std::unique_ptr decomp_f(new Botan::Decompression_Filter("zlib")); result.test_eq("Decompressor name", decomp_f->name(), "Zlib_Decompression"); pipe.append(decomp_f.release()); pipe.pop(); // remove compressor pipe.process_msg(compr); std::string decomp = pipe.read_all_as_string(1); result.test_eq("Decompressed ok", decomp, input_str); #endif return result; } Test::Result test_pipe_compress_bzip2() { Test::Result result("Pipe compress bzip2"); #if defined(BOTAN_HAS_BZIP2) std::unique_ptr comp_f(new Botan::Compression_Filter("bzip2", 9)); result.test_eq("Compressor filter name", comp_f->name(), "Bzip2_Compression"); Botan::Pipe pipe(comp_f.release()); const std::string input_str = "foo\n"; pipe.start_msg(); pipe.write(input_str); pipe.end_msg(); auto compr = pipe.read_all(0); // Here the output is actually longer than the input as input is so short std::unique_ptr decomp_f(new Botan::Decompression_Filter("bzip2")); result.test_eq("Decompressor name", decomp_f->name(), "Bzip2_Decompression"); pipe.append(decomp_f.release()); pipe.pop(); // remove compressor pipe.process_msg(compr); std::string decomp = pipe.read_all_as_string(1); result.test_eq("Decompressed ok", decomp, input_str); #endif return result; } Test::Result test_pipe_codec() { Test::Result result("Pipe"); #if defined(BOTAN_HAS_CODEC_FILTERS) Botan::Pipe pipe(new Botan::Base64_Encoder); result.test_eq("Message count", pipe.message_count(), 0); pipe.process_msg("ABCDX"); result.test_eq("Message count", pipe.message_count(), 1); result.test_eq("Message size", pipe.remaining(), 8); std::string output = pipe.read_all_as_string(0); result.test_eq("Message size", pipe.remaining(0), 0); result.test_eq("Output round tripped", output, "QUJDRFg="); pipe.append(new Botan::Base64_Decoder); pipe.process_msg("FOOBAZ"); result.test_eq("base64 roundtrip", pipe.read_all_as_string(1), "FOOBAZ"); pipe.pop(); pipe.pop(); // Pipe is empty of filters, should still pass through pipe.process_msg("surprise plaintext"); pipe.set_default_msg(2); result.test_eq("Message 2", pipe.read_all_as_string(), "surprise plaintext"); pipe.append(new Botan::Hex_Decoder); pipe.process_msg("F331F00D"); Botan::secure_vector bin = pipe.read_all(3); result.test_eq("hex decoded", bin, "F331F00D"); pipe.append(new Botan::Hex_Encoder); pipe.process_msg("F331F00D"); result.test_eq("hex roundtrip", pipe.read_all_as_string(4), "F331F00D"); // Now tests with line wrapping enabled pipe.reset(); pipe.append(new Botan::Hex_Decoder); pipe.append(new Botan::Base64_Encoder(/*break_lines=*/true, /*line_length=*/4, /*trailing_newline=*/true)); pipe.process_msg("6dab1eeb8a2eb69bad"); result.test_eq("base64 with linebreaks and trailing newline", pipe.read_all_as_string(5), "base\n64ou\ntput\n\n"); pipe.reset(); pipe.append(new Botan::Hex_Decoder); pipe.append(new Botan::Base64_Encoder(true, 5, false)); pipe.process_msg("6dab1eeb8a2eb69bad"); result.test_eq("base64 with linebreaks", pipe.read_all_as_string(6), "base6\n4outp\nut\n"); pipe.reset(); pipe.append(new Botan::Hex_Encoder(true, 13, Botan::Hex_Encoder::Uppercase)); pipe.process_msg("hex encoding this string"); result.test_eq("hex uppercase with linebreaks", pipe.read_all_as_string(7), "68657820656E6\n36F64696E6720\n7468697320737\n472696E67\n"); pipe.reset(); pipe.append(new Botan::Hex_Encoder(true, 16, Botan::Hex_Encoder::Lowercase)); pipe.process_msg("hex encoding this string"); result.test_eq("hex lowercase with linebreaks", pipe.read_all_as_string(8), "68657820656e636f\n64696e6720746869\n7320737472696e67\n"); #endif return result; } Test::Result test_pipe_stream() { Test::Result result("Pipe CTR"); #if defined(BOTAN_HAS_CTR_BE) && defined(BOTAN_HAS_AES) Botan::Keyed_Filter* aes = nullptr; const Botan::SymmetricKey some_other_key("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"); const Botan::SymmetricKey key("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); const Botan::InitializationVector iv("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); Botan::Pipe pipe(aes = new Botan::StreamCipher_Filter("CTR-BE(AES-128)", some_other_key)); aes->set_key(key); aes->set_iv(iv); pipe.process_msg("ABCDEF"); result.test_eq("Message count", pipe.message_count(), 1); result.test_eq("Ciphertext", pipe.read_all(), "FDFD6238F7C6"); pipe.process_msg("ABCDEF"); result.test_eq("Ciphertext", pipe.read_all(1), "8E72F1153514"); #endif return result; } Test::Result test_fork() { Test::Result result("Filter Fork"); #if defined(BOTAN_HAS_SHA2_32) && defined(BOTAN_HAS_SHA2_64) Botan::Pipe pipe(new Botan::Fork(new Botan::Hash_Filter("SHA-256"), new Botan::Hash_Filter("SHA-512-256"))); result.test_eq("Message count", pipe.message_count(), 0); pipe.process_msg("OMG"); result.test_eq("Message count", pipe.message_count(), 2); // Test reading out of order result.test_eq("Hash 2", pipe.read_all(1), "610480FFA82F24F6926544B976FE387878E3D973C03DFD591C2E9896EFB903E0"); result.test_eq("Hash 1", pipe.read_all(0), "C00862D1C6C1CF7C1B49388306E7B3C1BB79D8D6EC978B41035B556DBB3797DF"); #endif return result; } Test::Result test_chain() { Test::Result result("Filter Chain"); #if defined(BOTAN_HAS_CODEC_FILTERS) && defined(BOTAN_HAS_SHA2_32) && defined(BOTAN_HAS_SHA2_64) std::unique_ptr fork( new Botan::Fork( new Botan::Chain(new Botan::Hash_Filter("SHA-256"), new Botan::Hex_Encoder), new Botan::Chain(new Botan::Hash_Filter("SHA-512-256"), new Botan::Hex_Encoder) )); result.test_eq("Fork has a name", fork->name(), "Fork"); Botan::Pipe pipe(fork.release()); result.test_eq("Message count", pipe.message_count(), 0); pipe.process_msg("OMG"); result.test_eq("Message count", pipe.message_count(), 2); result.test_eq("Hash 1", pipe.read_all_as_string(0), "C00862D1C6C1CF7C1B49388306E7B3C1BB79D8D6EC978B41035B556DBB3797DF"); result.test_eq("Hash 2", pipe.read_all_as_string(1), "610480FFA82F24F6926544B976FE387878E3D973C03DFD591C2E9896EFB903E0"); #endif return result; } Test::Result test_pipe_fd_io() { Test::Result result("Pipe file descriptor IO"); #if defined(BOTAN_HAS_PIPE_UNIXFD_IO) && defined(BOTAN_HAS_CODEC_FILTERS) int fd[2]; if(::pipe(fd) != 0) return result; // pipe unavailable? Botan::Pipe hex_enc(new Botan::Hex_Encoder); Botan::Pipe hex_dec(new Botan::Hex_Decoder); hex_enc.process_msg("hi chappy"); fd[1] << hex_enc; ::close(fd[1]); hex_dec.start_msg(); fd[0] >> hex_dec; hex_dec.end_msg(); ::close(fd[0]); std::string dec = hex_dec.read_all_as_string(); result.test_eq("IO through Unix pipe works", dec, "hi chappy"); #endif return result; } Test::Result test_threaded_fork() { Test::Result result("Threaded_Fork"); #if defined(BOTAN_TARGET_OS_HAS_THREADS) && defined(BOTAN_HAS_CODEC_FILTERS) && defined(BOTAN_HAS_SHA2_32) Botan::Pipe pipe(new Botan::Threaded_Fork(new Botan::Hex_Encoder, new Botan::Base64_Encoder)); result.test_eq("Message count", pipe.message_count(), 0); pipe.process_msg("woo"); result.test_eq("Message count", pipe.message_count(), 2); // Test reading out of order result.test_eq("Hash 2", pipe.read_all_as_string(1), "d29v"); result.test_eq("Hash 1", pipe.read_all_as_string(0), "776F6F"); pipe.reset(); const size_t filter_count = 5; Botan::Filter* filters[filter_count]; for(size_t i = 0; i != filter_count; ++i) { filters[i] = new Botan::Hash_Filter("SHA-256"); } pipe.append(new Botan::Threaded_Fork(filters, filter_count)); result.test_eq("Message count before start_msg", pipe.message_count(), 2); pipe.start_msg(); for(size_t i = 0; i != 919; ++i) { std::vector input(i + 5, static_cast(i)); pipe.write(input); } pipe.end_msg(); result.test_eq("Message count after end_msg", pipe.message_count(), 2 + filter_count); for(size_t i = 0; i != filter_count; ++i) { result.test_eq("Output " + std::to_string(i), pipe.read_all(2 + i), "327AD8055223F5926693D8BEA40F7B35BDEEB535647DFB93F464E40EA01939A9"); } #endif return result; } }; BOTAN_REGISTER_TEST("filter", Filter_Tests); #endif } botan-2.4.0/src/tests/test_fpe.cpp000066400000000000000000000023561322470703100170730ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_FPE_FE1) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_FPE_FE1) class FPE_FE1_Tests final : public Text_Based_Test { public: FPE_FE1_Tests() : Text_Based_Test("fpe_fe1.vec", "Mod,In,Out,Key,Tweak") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { const Botan::BigInt modulus = get_req_bn(vars, "Mod"); const Botan::BigInt input = get_req_bn(vars, "In"); const Botan::BigInt expected = get_req_bn(vars, "Out"); const std::vector key = get_req_bin(vars, "Key"); const std::vector tweak = get_req_bin(vars, "Tweak"); Test::Result result("FPE_FE1"); const Botan::BigInt got = Botan::FPE::fe1_encrypt(modulus, input, key, tweak); result.test_eq("ciphertext", got, expected); const Botan::BigInt decry = Botan::FPE::fe1_decrypt(modulus, got, key, tweak); result.test_eq("decrypted", decry, input); return result; } }; BOTAN_REGISTER_TEST("fpe_fe1", FPE_FE1_Tests); #endif } botan-2.4.0/src/tests/test_gf2m.cpp000066400000000000000000000035721322470703100171550ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_MCELIECE) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_MCELIECE) class GF2m_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_gf_overflow()); return results; } private: Test::Result test_gf_overflow() { Test::Result result("GF2m"); /* * This is testing one specific case where an overflow * occurred. It should be extended to test more of the interface. */ for(size_t degree = 2; degree <= 16; ++degree) { Botan::GF2m_Field field(degree); for(size_t i = 0; i <= field.gf_ord(); ++i) { Botan::gf2m a = static_cast(i); result.test_eq("square vs multiply", static_cast(field.gf_square(a)), static_cast(field.gf_mul(a, a))); /* * This sequence is from the start of gf2m_decomp_rootfind_state::calc_Fxj_j_neq_0 */ { const Botan::gf2m jl_gray = field.gf_l_from_n(a); const Botan::gf2m xl_j_tt_5 = field.gf_square_rr(jl_gray); const Botan::gf2m xl_gray_tt_3 = field.gf_mul_rrr(xl_j_tt_5, jl_gray); Botan::gf2m s = field.gf_mul_nrr(xl_gray_tt_3, field.gf_ord()); result.test_gte("Value less than order", field.gf_ord(), s); } } } return result; } }; BOTAN_REGISTER_TEST("gf2m", GF2m_Tests); #endif } } botan-2.4.0/src/tests/test_gost_3410.cpp000066400000000000000000000054761322470703100177520ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_GOST_34_10_2001) #include #include #include "test_pubkey.h" #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_GOST_34_10_2001) class GOST_3410_2001_Verification_Tests final : public PK_Signature_Verification_Test { public: GOST_3410_2001_Verification_Tests() : PK_Signature_Verification_Test( "GOST 34.10-2001", "pubkey/gost_3410_verify.vec", "Group,Pubkey,Hash,Msg,Signature") {} std::unique_ptr load_public_key(const VarMap& vars) override { const std::string group_id = get_req_str(vars, "Group"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); const Botan::PointGFp public_point = Botan::OS2ECP(get_req_bin(vars, "Pubkey"), group.get_curve()); std::unique_ptr key(new Botan::GOST_3410_PublicKey(group, public_point)); return key; } std::string default_padding(const VarMap& vars) const override { return "EMSA1(" + get_req_str(vars, "Hash") + ")"; } }; class GOST_3410_2001_Signature_Tests final : public PK_Signature_Generation_Test { public: GOST_3410_2001_Signature_Tests() : PK_Signature_Generation_Test( "GOST 34.10-2001", "pubkey/gost_3410_sign.vec", "Group,Privkey,Hash,Nonce,Msg,Signature") {} std::unique_ptr load_private_key(const VarMap& vars) override { const std::string group_id = get_req_str(vars, "Group"); const BigInt x = get_req_bn(vars, "Privkey"); Botan::EC_Group group(Botan::OIDS::lookup(group_id)); std::unique_ptr key(new Botan::GOST_3410_PrivateKey(Test::rng(), group, x)); return key; } std::string default_padding(const VarMap& vars) const override { return "EMSA1(" + get_req_str(vars, "Hash") + ")"; } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override { return new Fixed_Output_Position_RNG(nonce, 1); } }; class GOST_3410_2001_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "gost_256A", "secp256r1" }; } std::string algo_name() const override { return "GOST-34.10"; } }; BOTAN_REGISTER_TEST("gost_3410_verify", GOST_3410_2001_Verification_Tests); BOTAN_REGISTER_TEST("gost_3410_sign", GOST_3410_2001_Signature_Tests); BOTAN_REGISTER_TEST("gost_3410_keygen", GOST_3410_2001_Keygen_Tests); #endif } } botan-2.4.0/src/tests/test_hash.cpp000066400000000000000000000066531322470703100172500ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include namespace Botan_Tests { namespace { class Hash_Function_Tests final : public Text_Based_Test { public: Hash_Function_Tests() : Text_Based_Test("hash", "In,Out") {} std::vector possible_providers(const std::string& algo) override { return provider_filter(Botan::HashFunction::providers(algo)); } Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); Test::Result result(algo); const std::vector providers = possible_providers(algo); if(providers.empty()) { result.note_missing("hash " + algo); return result; } for(auto const& provider_ask : providers) { std::unique_ptr hash(Botan::HashFunction::create(algo, provider_ask)); if(!hash) { result.test_failure("Hash " + algo + " supported by " + provider_ask + " but not found"); continue; } std::unique_ptr clone(hash->clone()); const std::string provider(hash->provider()); result.test_is_nonempty("provider", provider); result.test_eq(provider, hash->name(), algo); result.test_eq(provider, hash->name(), clone->name()); hash->update(input); result.test_eq(provider, "hashing", hash->final(), expected); clone->update(input); result.test_eq(provider, "hashing (clone)", clone->final(), expected); // Test to make sure clear() resets what we need it to hash->update("some discarded input"); hash->clear(); hash->update(nullptr, 0); // this should be effectively ignored hash->update(input); result.test_eq(provider, "hashing after clear", hash->final(), expected); if(input.size() > 5) { hash->update(input[0]); std::unique_ptr fork = hash->copy_state(); // verify fork copy doesn't affect original computation fork->update(&input[1], input.size() - 2); size_t so_far = 1; while(so_far < input.size()) { size_t take = Test::rng().next_byte() % (input.size() - so_far); if(input.size() - so_far == 1) take = 1; hash->update(&input[so_far], take); so_far += take; } result.test_eq(provider, "hashing split", hash->final(), expected); fork->update(&input[input.size() - 1], 1); result.test_eq(provider, "hashing split", fork->final(), expected); } if(hash->hash_block_size() > 0) { // GOST-34.11 uses 32 byte block result.test_gte("If hash_block_size is set, it is large", hash->hash_block_size(), 32); } } return result; } }; BOTAN_REGISTER_TEST("hash", Hash_Function_Tests); } } botan-2.4.0/src/tests/test_hash_id.cpp000066400000000000000000000052761322470703100177240ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_HASH_ID) && defined(BOTAN_HAS_ASN1) #include #include #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_HASH_ID) && defined(BOTAN_HAS_ASN1) class PKCS_HashID_Test final : public Test { public: std::vector run() override { const std::vector> hash_id_fns = { {"MD5", 16}, {"RIPEMD-160", 20}, {"SHA-160", 20}, {"SHA-224", 28}, {"SHA-256", 32}, {"SHA-384", 48}, {"SHA-512", 64}, {"SHA-512-256", 32}, {"SHA-3(224)", 28}, {"SHA-3(256)", 32}, {"SHA-3(384)", 48}, {"SHA-3(512)", 64}, {"SM3", 32}, {"Tiger(24,3)", 24} }; std::vector results; for(auto hash_info : hash_id_fns) { const std::string hash_fn = hash_info.first; const size_t hash_len = hash_info.second; Test::Result result("PKCS hash id for " + hash_fn); try { const std::vector pkcs_id = Botan::pkcs_hash_id(hash_fn); const Botan::OID oid = Botan::OIDS::lookup(hash_fn); const Botan::AlgorithmIdentifier alg(oid, Botan::AlgorithmIdentifier::USE_NULL_PARAM); const std::vector dummy_hash(hash_len); Botan::DER_Encoder der; der.start_cons(Botan::SEQUENCE).encode(alg).encode(dummy_hash, Botan::OCTET_STRING).end_cons(); const std::vector bits = der.get_contents_unlocked(); result.test_eq("Dummy hash is expected size", bits.size() - pkcs_id.size(), dummy_hash.size()); for(size_t i = pkcs_id.size(); i != bits.size(); ++i) { if(bits[i] != 0) { result.test_failure("Dummy hash had nonzero value"); break; } } std::vector encoded_id(bits.begin(), bits.begin() + pkcs_id.size()); result.test_eq("Encoded ID matches hardcoded", encoded_id, pkcs_id); } catch(Botan::Exception& e) { result.test_failure(e.what()); } results.push_back(result); } return results; } }; BOTAN_REGISTER_TEST("pkcs_hash_id", PKCS_HashID_Test); #endif } botan-2.4.0/src/tests/test_kdf.cpp000066400000000000000000000054021322470703100170600ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_KDF_BASE) #include #endif #if defined(BOTAN_HAS_HKDF) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_KDF_BASE) class KDF_KAT_Tests final : public Text_Based_Test { public: KDF_KAT_Tests() : Text_Based_Test("kdf", "Salt,Secret,Label,Output", "IKM,XTS") {} Test::Result run_one_test(const std::string& kdf_name, const VarMap& vars) override { Test::Result result(kdf_name); std::unique_ptr kdf(Botan::KDF::create(kdf_name)); if(!kdf) { result.note_missing(kdf_name); return result; } const std::vector salt = get_opt_bin(vars, "Salt"); const std::vector secret = get_req_bin(vars, "Secret"); const std::vector label = get_opt_bin(vars, "Label"); const std::vector expected = get_req_bin(vars, "Output"); result.test_eq("name", kdf->name(), kdf_name); result.test_eq("derived key", kdf->derive_key(expected.size(), secret, salt, label), expected); // Test that clone works std::unique_ptr clone(kdf->clone()); result.confirm("Clone has different pointer", kdf.get() != clone.get()); result.test_eq("Clone has same name", kdf->name(), clone->name()); return result; } }; BOTAN_REGISTER_TEST("kdf", KDF_KAT_Tests); #endif #if defined(BOTAN_HAS_HKDF) class HKDF_Expand_Label_Tests final : public Text_Based_Test { public: HKDF_Expand_Label_Tests() : Text_Based_Test("hkdf_label.vec", "Secret,Label,HashValue,Output") {} Test::Result run_one_test(const std::string& hash_name, const VarMap& vars) override { Test::Result result("HKDF-Expand-Label(" + hash_name + ")"); const std::vector secret = get_req_bin(vars, "Secret"); const std::vector hashval = get_req_bin(vars, "HashValue"); const std::string label = get_req_str(vars, "Label"); const std::vector expected = get_req_bin(vars, "Output"); Botan::secure_vector output = Botan::hkdf_expand_label(hash_name, secret.data(), secret.size(), label, hashval.data(), hashval.size(), expected.size()); result.test_eq("Output matches", output, expected); return result; } }; BOTAN_REGISTER_TEST("hkdf_expand_label", HKDF_Expand_Label_Tests); #endif } } botan-2.4.0/src/tests/test_keywrap.cpp000066400000000000000000000126001322470703100177740ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_RFC3394_KEYWRAP) #include #endif #if defined(BOTAN_HAS_NIST_KEYWRAP) #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_RFC3394_KEYWRAP) class RFC3394_Keywrap_Tests final : public Text_Based_Test { public: RFC3394_Keywrap_Tests() : Text_Based_Test("keywrap/rfc3394.vec", "Key,KEK,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("RFC3394 keywrap"); try { const std::vector expected = get_req_bin(vars, "Output"); const std::vector key = get_req_bin(vars, "Key"); const std::vector kek = get_req_bin(vars, "KEK"); const Botan::SymmetricKey kek_sym(kek); const Botan::secure_vector key_l(key.begin(), key.end()); const Botan::secure_vector exp_l(expected.begin(), expected.end()); result.test_eq("encryption", Botan::rfc3394_keywrap(key_l, kek_sym), expected); result.test_eq("decryption", Botan::rfc3394_keyunwrap(exp_l, kek_sym), key); } catch(std::exception& e) { result.test_failure("", e.what()); } return result; } }; BOTAN_REGISTER_TEST("rfc3394", RFC3394_Keywrap_Tests); #endif #if defined(BOTAN_HAS_NIST_KEYWRAP) && defined(BOTAN_HAS_AES) class NIST_Keywrap_Tests final : public Text_Based_Test { public: NIST_Keywrap_Tests() : Text_Based_Test("keywrap/nist_key_wrap.vec", "Input,Key,Output") {} Test::Result run_one_test(const std::string& typ, const VarMap& vars) override { Test::Result result("NIST keywrap"); try { if(typ != "KW" && typ != "KWP") throw Test_Error("Unknown type in NIST key wrap tests"); const std::vector expected = get_req_bin(vars, "Output"); const std::vector input = get_req_bin(vars, "Input"); const std::vector key = get_req_bin(vars, "Key"); std::unique_ptr bc = Botan::BlockCipher::create_or_throw("AES-" + std::to_string(key.size()*8)); bc->set_key(key); std::vector wrapped; if(typ == "KW") { wrapped = nist_key_wrap(input.data(), input.size(), *bc); } else if(typ == "KWP") { wrapped = nist_key_wrap_padded(input.data(), input.size(), *bc); } result.test_eq("key wrap", wrapped, expected); try { Botan::secure_vector unwrapped; if(typ == "KW") { unwrapped = nist_key_unwrap(expected.data(), expected.size(), *bc); } else if(typ == "KWP") { unwrapped = nist_key_unwrap_padded(expected.data(), expected.size(), *bc); } result.test_eq("key unwrap", unwrapped, input); } catch(Botan::Integrity_Failure& e) { result.test_failure("NIST key unwrap failed with integrity failure", e.what()); } } catch(std::exception& e) { result.test_failure("", e.what()); } return result; } }; BOTAN_REGISTER_TEST("nist_key_wrap", NIST_Keywrap_Tests); class NIST_Keywrap_Invalid_Tests final : public Text_Based_Test { public: NIST_Keywrap_Invalid_Tests() : Text_Based_Test("keywrap/nist_key_wrap_invalid.vec", "Key,Input") {} Test::Result run_one_test(const std::string& typ, const VarMap& vars) override { Test::Result result("NIST keywrap (invalid inputs)"); try { if(typ != "KW" && typ != "KWP") throw Test_Error("Unknown type in NIST key wrap tests"); const std::vector input = get_req_bin(vars, "Input"); const std::vector key = get_req_bin(vars, "Key"); std::unique_ptr bc = Botan::BlockCipher::create_or_throw("AES-" + std::to_string(key.size()*8)); bc->set_key(key); try { Botan::secure_vector unwrapped; if(typ == "KW") { unwrapped = nist_key_unwrap(input.data(), input.size(), *bc); } else if(typ == "KWP") { unwrapped = nist_key_unwrap_padded(input.data(), input.size(), *bc); } result.test_failure("Was able to unwrap invalid keywrap input"); } catch(Botan::Integrity_Failure) { result.test_success("Rejected invalid input"); } } catch(std::exception& e) { result.test_failure("", e.what()); } return result; } }; BOTAN_REGISTER_TEST("nist_key_wrap_invalid", NIST_Keywrap_Invalid_Tests); #endif } } botan-2.4.0/src/tests/test_mac.cpp000066400000000000000000000115561322470703100170630ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * (C) 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_MAC) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_MAC) class Message_Auth_Tests final : public Text_Based_Test { public: Message_Auth_Tests() : Text_Based_Test("mac", "Key,In,Out", "IV") {} std::vector possible_providers(const std::string& algo) override { return provider_filter(Botan::MessageAuthenticationCode::providers(algo)); } Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector key = get_req_bin(vars, "Key"); const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); const std::vector iv = get_opt_bin(vars, "IV"); Test::Result result(algo); const std::vector providers = possible_providers(algo); if(providers.empty()) { result.note_missing("block cipher " + algo); return result; } for(auto const& provider_ask : providers) { std::unique_ptr mac(Botan::MessageAuthenticationCode::create(algo, provider_ask)); if(!mac) { result.test_failure("MAC " + algo + " supported by " + provider_ask + " but not found"); continue; } const std::string provider(mac->provider()); result.test_is_nonempty("provider", provider); result.test_eq(provider, mac->name(), algo); try { std::vector buf(128); mac->update(buf.data(), buf.size()); result.test_failure("Was able to MAC without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to MAC with no key set fails"); } mac->set_key(key); mac->start(iv); mac->update(input); result.test_eq(provider, "correct mac", mac->final(), expected); // Test to make sure clear() resets what we need it to mac->set_key(key); mac->start(iv); mac->update("some discarded input"); mac->clear(); // do the same to test verify_mac() mac->set_key(key); mac->start(iv); mac->update(input); // Test that clone works and does not affect parent object std::unique_ptr clone(mac->clone()); result.confirm("Clone has different pointer", mac.get() != clone.get()); result.test_eq("Clone has same name", mac->name(), clone->name()); clone->set_key(key); clone->start(iv); clone->update(Test::rng().random_vec(32)); result.test_eq(provider + " verify mac", mac->verify_mac(expected.data(), expected.size()), true); if(input.size() > 2) { mac->set_key(key); // Poly1305 requires the re-key mac->start(iv); mac->update(input[0]); mac->update(&input[1], input.size() - 2); mac->update(input[input.size() - 1]); result.test_eq(provider, "split mac", mac->final(), expected); // do the same to test verify_mac() mac->set_key(key); mac->start(iv); mac->update(input[ 0 ]); mac->update(&input[ 1 ], input.size() - 2); mac->update(input[ input.size() - 1 ]); result.test_eq(provider + " split mac", mac->verify_mac(expected.data(), expected.size()), true); } mac->clear(); try { std::vector buf(128); mac->update(buf.data(), buf.size()); result.test_failure("Was able to MAC without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to MAC with no key set (after clear) fails"); } try { std::vector buf(mac->output_length()); mac->final(buf.data()); result.test_failure("Was able to MAC without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to MAC with no key set (after clear) fails"); } } return result; } }; BOTAN_REGISTER_TEST("mac", Message_Auth_Tests); #endif } } botan-2.4.0/src/tests/test_mceliece.cpp000066400000000000000000000227551322470703100200740ustar00rootroot00000000000000/* * (C) 2014 cryptosource GmbH * (C) 2014 Falko Strenzke fstrenzke@cryptosource.de * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_MCELIECE) #include #include #include #include #include #if defined(BOTAN_HAS_HMAC_DRBG) #include #endif #if defined(BOTAN_HAS_MCEIES) #include #endif #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_MCELIECE) #if defined(BOTAN_HAS_HMAC_DRBG) && defined(BOTAN_HAS_SHA2_32) && defined(BOTAN_HASH_SHA2_64) class McEliece_Keygen_Encrypt_Test final : public Text_Based_Test { public: McEliece_Keygen_Encrypt_Test() : Text_Based_Test("pubkey/mce.vec", "McElieceSeed,KeyN,KeyT,PublicKeyFingerprint,PrivateKeyFingerprint," "EncryptPRNGSeed,SharedKey,Ciphertext", "") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { const std::vector keygen_seed = get_req_bin(vars, "McElieceSeed"); const std::vector fprint_pub = get_req_bin(vars, "PublicKeyFingerprint"); const std::vector fprint_priv = get_req_bin(vars, "PrivateKeyFingerprint"); const std::vector encrypt_seed = get_req_bin(vars, "EncryptPRNGSeed"); const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); const std::vector shared_key = get_req_bin(vars, "SharedKey"); const size_t keygen_n = get_req_sz(vars, "KeyN"); const size_t keygen_t = get_req_sz(vars, "KeyT"); Test::Result result("McEliece keygen"); result.start_timer(); if(Test::run_long_tests() == false && keygen_n > 3072) { result.test_note("Skipping because long"); return result; } result.start_timer(); Botan::HMAC_DRBG rng("SHA-384"); rng.initialize_with(keygen_seed.data(), keygen_seed.size()); Botan::McEliece_PrivateKey mce_priv(rng, keygen_n, keygen_t); result.test_eq("public key fingerprint", hash_bytes(mce_priv.public_key_bits()), fprint_pub); result.test_eq("private key fingerprint", hash_bytes(mce_priv.private_key_bits()), fprint_priv); rng.clear(); rng.initialize_with(encrypt_seed.data(), encrypt_seed.size()); try { Botan::PK_KEM_Encryptor kem_enc(mce_priv, Test::rng(), "KDF1(SHA-512)"); Botan::PK_KEM_Decryptor kem_dec(mce_priv, Test::rng(), "KDF1(SHA-512)"); Botan::secure_vector encap_key, prod_shared_key; kem_enc.encrypt(encap_key, prod_shared_key, 64, rng); Botan::secure_vector dec_shared_key = kem_dec.decrypt(encap_key.data(), encap_key.size(), 64); result.test_eq("ciphertext", encap_key, ciphertext); result.test_eq("encrypt shared", prod_shared_key, shared_key); result.test_eq("decrypt shared", dec_shared_key, shared_key); } catch(Botan::Lookup_Error&) { } result.end_timer(); return result; } private: std::vector hash_bytes(const uint8_t b[], size_t len, const std::string& hash_fn = "SHA-256") { std::unique_ptr hash(Botan::HashFunction::create(hash_fn)); hash->update(b, len); std::vector r(hash->output_length()); hash->final(r.data()); return r; } template std::vector hash_bytes(const std::vector& v) { return hash_bytes(v.data(), v.size()); } }; BOTAN_REGISTER_TEST("mce_keygen", McEliece_Keygen_Encrypt_Test); #endif #if defined(BOTAN_HAS_SHA2_32) class McEliece_Tests final : public Test { public: std::string fingerprint(const Botan::Private_Key& key, const std::string& hash_algo = "SHA-256") { std::unique_ptr hash(Botan::HashFunction::create(hash_algo)); if(!hash) { throw Test_Error("Hash " + hash_algo + " not available"); } hash->update(key.private_key_bits()); return Botan::hex_encode(hash->final()); } std::string fingerprint(const Botan::Public_Key& key, const std::string& hash_algo = "SHA-256") { std::unique_ptr hash(Botan::HashFunction::create(hash_algo)); if(!hash) { throw Test_Error("Hash " + hash_algo + " not available"); } hash->update(key.public_key_bits()); return Botan::hex_encode(hash->final()); } std::vector run() override { struct keygen_params { size_t code_length, t_min, t_max; }; const keygen_params param_sets[] = { { 256, 5, 15 }, { 512, 5, 33 }, { 1024, 15, 35 }, { 2048, 33, 50 }, { 6624, 110, 115 } }; std::vector results; for(size_t i = 0; i < sizeof(param_sets) / sizeof(param_sets[0]); ++i) { if(Test::run_long_tests() == false && param_sets[i].code_length >= 2048) { continue; } for(size_t t = param_sets[i].t_min; t <= param_sets[i].t_max; ++t) { Test::Result result("McEliece keygen"); result.start_timer(); Botan::McEliece_PrivateKey sk1(Test::rng(), param_sets[i].code_length, t); const Botan::McEliece_PublicKey& pk1 = sk1; const std::vector pk_enc = pk1.public_key_bits(); const Botan::secure_vector sk_enc = sk1.private_key_bits(); Botan::McEliece_PublicKey pk(pk_enc); Botan::McEliece_PrivateKey sk(sk_enc); result.test_eq("decoded public key equals original", fingerprint(pk1), fingerprint(pk)); result.test_eq("decoded private key equals original", fingerprint(sk1), fingerprint(sk)); result.test_eq("key validation passes", sk.check_key(Test::rng(), false), true); result.end_timer(); result.end_timer(); results.push_back(result); #if defined(BOTAN_HAS_KDF2) results.push_back(test_kem(sk, pk)); #endif #if defined(BOTAN_HAS_MCEIES) results.push_back(test_mceies(sk, pk)); #endif } } return results; } private: Test::Result test_kem(const Botan::McEliece_PrivateKey& sk, const Botan::McEliece_PublicKey& pk) { Test::Result result("McEliece KEM"); result.start_timer(); Botan::PK_KEM_Encryptor enc_op(pk, Test::rng(), "KDF2(SHA-256)"); Botan::PK_KEM_Decryptor dec_op(sk, Test::rng(), "KDF2(SHA-256)"); const size_t trials = (Test::run_long_tests() ? 30 : 10); for(size_t i = 0; i < trials; i++) { Botan::secure_vector salt = Test::rng().random_vec(i); Botan::secure_vector encap_key, shared_key; enc_op.encrypt(encap_key, shared_key, 64, Test::rng(), salt); Botan::secure_vector shared_key2 = dec_op.decrypt(encap_key, 64, salt); result.test_eq("same key", shared_key, shared_key2); } result.end_timer(); return result; } #if defined(BOTAN_HAS_MCEIES) Test::Result test_mceies(const Botan::McEliece_PrivateKey& sk, const Botan::McEliece_PublicKey& pk) { Test::Result result("McEliece IES"); result.start_timer(); for(size_t i = 0; i <= 10; ++i) { uint8_t ad[8]; Botan::store_be(static_cast(i), ad); const size_t ad_len = sizeof(ad); const Botan::secure_vector pt = Test::rng().random_vec(Test::rng().next_byte()); const Botan::secure_vector ct = mceies_encrypt(pk, pt.data(), pt.size(), ad, ad_len, Test::rng()); const Botan::secure_vector dec = mceies_decrypt(sk, ct.data(), ct.size(), ad, ad_len); result.test_eq("decrypted ok", dec, pt); Botan::secure_vector bad_ct = ct; for(size_t j = 0; j != 3; ++j) { bad_ct = mutate_vec(ct, true); try { mceies_decrypt(sk, bad_ct.data(), bad_ct.size(), ad, ad_len); result.test_failure("AEAD decrypted manipulated ciphertext"); result.test_note("Manipulated text was " + Botan::hex_encode(bad_ct)); } catch(Botan::Integrity_Failure&) { result.test_note("AEAD rejected manipulated ciphertext"); } catch(std::exception& e) { result.test_failure("AEAD rejected manipulated ciphertext with unexpected error", e.what()); } } } result.end_timer(); return result; } #endif }; BOTAN_REGISTER_TEST("mceliece", McEliece_Tests); #endif #endif } } botan-2.4.0/src/tests/test_modes.cpp000066400000000000000000000275471322470703100174410ustar00rootroot00000000000000/* * (C) 2014,2015,2017 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_MODES) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_MODES) class Cipher_Mode_Tests final : public Text_Based_Test { public: Cipher_Mode_Tests() : Text_Based_Test("modes", "Key,Nonce,In,Out") {} std::vector possible_providers(const std::string& algo) override { return provider_filter(Botan::Cipher_Mode::providers(algo)); } Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector key = get_req_bin(vars, "Key"); const std::vector nonce = get_opt_bin(vars, "Nonce"); const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); Test::Result result(algo); const std::vector providers = possible_providers(algo); if(providers.empty()) { result.note_missing("cipher mode " + algo); return result; } for(auto&& provider_ask : providers) { std::unique_ptr enc(Botan::get_cipher_mode( algo, Botan::ENCRYPTION, provider_ask)); std::unique_ptr dec(Botan::get_cipher_mode( algo, Botan::DECRYPTION, provider_ask)); if(!enc || !dec) { result.note_missing(algo); return result; } result.test_is_nonempty("provider", enc->provider()); result.test_eq("name", enc->name(), algo); result.test_eq("mode not authenticated", enc->authenticated(), false); if(algo.find("/CBC") != std::string::npos) { // can't test equal due to CBC padding result.test_lte("output_length", enc->output_length(input.size()), expected.size()); result.test_gte("output_length", dec->output_length(expected.size()), input.size()); } else { // assume all other modes are not expanding (currently true) result.test_eq("output_length", enc->output_length(input.size()), expected.size()); result.test_eq("output_length", dec->output_length(expected.size()), input.size()); } // FFI currently requires this, so assure it is true for all modes result.test_gte("enc buffer sizes ok", enc->update_granularity(), enc->minimum_final_size()); result.test_gte("dec buffer sizes ok", dec->update_granularity(), dec->minimum_final_size()); // Test that disallowed nonce sizes result in an exception const size_t large_nonce_size = 65000; result.test_eq("Large nonce not allowed", enc->valid_nonce_length(large_nonce_size), false); result.test_throws("Large nonce causes exception", [&enc,large_nonce_size]() { enc->start(nullptr, large_nonce_size); }); // Test to make sure reset() resets what we need it to enc->set_key(mutate_vec(key)); Botan::secure_vector garbage = Test::rng().random_vec(enc->update_granularity()); enc->start(mutate_vec(nonce)); enc->update(garbage); enc->reset(); enc->set_key(key); enc->start(nonce); Botan::secure_vector buf(input.begin(), input.end()); // TODO: should first update if possible enc->finish(buf); result.test_eq("encrypt", buf, expected); // additionally test process() if possible size_t update_granularity = enc->update_granularity(); size_t input_length = input.size(); size_t min_final_bytes = enc->minimum_final_size(); if(input_length > (update_granularity + min_final_bytes)) { // reset state first enc->reset(); enc->start(nonce); buf.assign(input.begin(), input.end()); // we can process at max input_length const size_t max_blocks_to_process = (input_length - min_final_bytes) / update_granularity; const size_t bytes_to_process = max_blocks_to_process * update_granularity; const size_t bytes_written = enc->process(buf.data(), bytes_to_process); result.test_eq("correct number of bytes processed", bytes_written, bytes_to_process); enc->finish(buf, bytes_to_process); result.test_eq("encrypt", buf, expected); } // decryption buf.assign(expected.begin(), expected.end()); // Test to make sure reset() resets what we need it to dec->set_key(mutate_vec(key)); garbage = Test::rng().random_vec(dec->update_granularity()); dec->start(mutate_vec(nonce)); dec->update(garbage); dec->reset(); dec->set_key(key); dec->start(nonce); dec->finish(buf); result.test_eq("decrypt", buf, input); // additionally test process() if possible update_granularity = dec->update_granularity(); input_length = expected.size(); min_final_bytes = dec->minimum_final_size(); if(input_length > (update_granularity + min_final_bytes)) { // reset state first dec->reset(); dec->start(nonce); buf.assign(expected.begin(), expected.end()); // we can process at max input_length const size_t max_blocks_to_process = (input_length - min_final_bytes) / update_granularity; const size_t bytes_to_process = max_blocks_to_process * update_granularity; const size_t bytes_written = dec->process(buf.data(), bytes_to_process); result.test_eq("correct number of bytes processed", bytes_written, bytes_to_process); dec->finish(buf, bytes_to_process); result.test_eq("decrypt", buf, input); } enc->clear(); dec->clear(); } return result; } }; BOTAN_REGISTER_TEST("modes", Cipher_Mode_Tests); class Cipher_Mode_IV_Carry_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_cbc_iv_carry()); results.push_back(test_cfb_iv_carry()); results.push_back(test_ctr_iv_carry()); return results; } private: Test::Result test_cbc_iv_carry() { Test::Result result("CBC IV carry"); #if defined(BOTAN_HAS_MODE_CBC) && defined(BOTAN_HAS_AES) std::unique_ptr enc( Botan::get_cipher_mode("AES-128/CBC/PKCS7", Botan::ENCRYPTION)); std::unique_ptr dec( Botan::get_cipher_mode("AES-128/CBC/PKCS7", Botan::DECRYPTION)); const std::vector key(16, 0xAA); const std::vector iv(16, 0xAA); Botan::secure_vector msg1 = Botan::hex_decode_locked("446F6E27742075736520706C61696E20434243206D6F6465"); Botan::secure_vector msg2 = Botan::hex_decode_locked("49562063617272796F766572"); Botan::secure_vector msg3 = Botan::hex_decode_locked("49562063617272796F76657232"); enc->set_key(key); dec->set_key(key); enc->start(iv); enc->finish(msg1); result.test_eq("First ciphertext", msg1, "9BDD7300E0CB61CA71FFF957A71605DB6836159C36781246A1ADF50982757F4B"); enc->start(); enc->finish(msg2); result.test_eq("Second ciphertext", msg2, "AA8D682958A4A044735DAC502B274DB2"); enc->start(); enc->finish(msg3); result.test_eq("Third ciphertext", msg3, "1241B9976F73051BCF809525D6E86C25"); dec->start(iv); dec->finish(msg1); dec->start(); dec->finish(msg2); dec->start(); dec->finish(msg3); result.test_eq("Third plaintext", msg3, "49562063617272796F76657232"); #endif return result; } Test::Result test_cfb_iv_carry() { Test::Result result("CFB IV carry"); #if defined(BOTAN_HAS_MODE_CFB) && defined(BOTAN_HAS_AES) std::unique_ptr enc( Botan::get_cipher_mode("AES-128/CFB(8)", Botan::ENCRYPTION)); std::unique_ptr dec( Botan::get_cipher_mode("AES-128/CFB(8)", Botan::DECRYPTION)); const std::vector key(16, 0xAA); const std::vector iv(16, 0xAB); Botan::secure_vector msg1 = Botan::hex_decode_locked("ABCDEF01234567"); Botan::secure_vector msg2 = Botan::hex_decode_locked("0000123456ABCDEF"); Botan::secure_vector msg3 = Botan::hex_decode_locked("012345"); enc->set_key(key); dec->set_key(key); enc->start(iv); enc->finish(msg1); result.test_eq("First ciphertext", msg1, "a51522387c4c9b"); enc->start(); enc->finish(msg2); result.test_eq("Second ciphertext", msg2, "105457dc2e0649d4"); enc->start(); enc->finish(msg3); result.test_eq("Third ciphertext", msg3, "53bd65"); dec->start(iv); dec->finish(msg1); result.test_eq("First plaintext", msg1, "ABCDEF01234567"); dec->start(); dec->finish(msg2); result.test_eq("Second plaintext", msg2, "0000123456ABCDEF"); dec->start(); dec->finish(msg3); result.test_eq("Third plaintext", msg3, "012345"); #endif return result; } Test::Result test_ctr_iv_carry() { Test::Result result("CTR IV carry"); #if defined(BOTAN_HAS_CTR_BE) && defined(BOTAN_HAS_AES) std::unique_ptr enc( Botan::get_cipher_mode("AES-128/CTR-BE", Botan::ENCRYPTION)); std::unique_ptr dec( Botan::get_cipher_mode("AES-128/CTR-BE", Botan::DECRYPTION)); const std::vector key = Botan::hex_decode("2B7E151628AED2A6ABF7158809CF4F3C"); const std::vector iv = Botan::hex_decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"); enc->set_key(key); dec->set_key(key); const std::vector exp_ciphertext = { "EC", "8CDF", "739860", "7CB0F2D2", "1675EA9EA1", "E4362B7C3C67", "73516318A077D7", "FC5073AE6A2CC378", "7889374FBEB4C81B17", "BA6C44E89C399FF0F198C", }; for(size_t i = 1; i != 10; ++i) { if(i == 1) { enc->start(iv); dec->start(iv); } else { enc->start(); dec->start(); } Botan::secure_vector msg(i, 0); enc->finish(msg); result.test_eq("Ciphertext", msg, exp_ciphertext[i-1].c_str()); dec->finish(msg); for(size_t j = 0; j != msg.size(); ++j) result.test_eq("Plaintext zeros", static_cast(msg[j]), 0); } #endif return result; } }; BOTAN_REGISTER_TEST("iv_carryover", Cipher_Mode_IV_Carry_Tests); #endif } botan-2.4.0/src/tests/test_mp.cpp000066400000000000000000000067641322470703100167440ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_BIGINT_MP) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_BIGINT_MP) class MP_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_cnd_swap()); results.push_back(test_cnd_add()); results.push_back(test_cnd_sub()); results.push_back(test_cnd_abs()); return results; } private: Result test_cnd_add() { Result result("bigint_cnd_add"); const Botan::word max = Botan::MP_WORD_MAX; Botan::word a = 2; Botan::word c = Botan::bigint_cnd_add(0, &a, &max, 1); result.test_int_eq(a, 2, "No op"); result.test_int_eq(c, 0, "No op"); c = Botan::bigint_cnd_add(1, &a, &max, 1); result.test_int_eq(a, 1, "Add"); result.test_int_eq(c, 1, "Carry"); // TODO more tests return result; } Result test_cnd_sub() { Result result("bigint_cnd_sub"); Botan::word a = 2; Botan::word b = 3; Botan::word c = Botan::bigint_cnd_sub(0, &a, &b, 1); result.test_int_eq(a, 2, "No op"); result.test_int_eq(c, 0, "No op"); c = Botan::bigint_cnd_sub(1, &a, &b, 1); result.test_int_eq(a, Botan::MP_WORD_MAX, "Sub"); result.test_int_eq(c, 1, "Borrow"); return result; } Result test_cnd_abs() { Result result("bigint_cnd_abs"); Botan::word x1 = Botan::MP_WORD_MAX; Botan::bigint_cnd_abs(1, &x1, 1); result.test_int_eq(x1, 1, "Abs"); x1 = 0; Botan::bigint_cnd_abs(1, &x1, 1); result.test_int_eq(x1, 0, "Abs"); x1 = 1; Botan::bigint_cnd_abs(1, &x1, 1); result.test_int_eq(x1, Botan::MP_WORD_MAX, "Abs"); x1 = 1; Botan::bigint_cnd_abs(0, &x1, 1); result.test_int_eq(x1, 1, "No change"); Botan::word x2[2] = { Botan::MP_WORD_MAX, Botan::MP_WORD_MAX }; Botan::bigint_cnd_abs(1, x2, 2); result.test_int_eq(x2[0], 1, "Abs"); result.test_int_eq(x2[1], 0, "Abs"); return result; } Result test_cnd_swap() { Result result("bigint_cnd_swap"); // null with zero length is ok Botan::bigint_cnd_swap(0, nullptr, nullptr, 0); Botan::bigint_cnd_swap(1, nullptr, nullptr, 0); Botan::word x1 = 5, y1 = 9; Botan::bigint_cnd_swap(0, &x1, &y1, 1); result.test_int_eq(x1, 5, "No swap"); Botan::bigint_cnd_swap(1, &x1, &y1, 1); result.test_int_eq(x1, 9, "Swap"); Botan::word x5[5] = { 0, 1, 2, 3, 4 }; Botan::word y5[5] = { 3, 2, 1, 0, 9 }; // Should only modify first four Botan::bigint_cnd_swap(1, x5, y5, 4); for(size_t i = 0; i != 4; ++i) { result.test_int_eq(x5[i], 3 - i, "Swap x5"); } result.test_int_eq(x5[4], 4, "Not touched"); for(size_t i = 0; i != 4; ++i) { result.test_int_eq(y5[i], i, "Swap y5"); } result.test_int_eq(y5[4], 9, "Not touched"); return result; } }; BOTAN_REGISTER_TEST("mp_unit", MP_Unit_Tests); #endif } } botan-2.4.0/src/tests/test_name_constraint.cpp000066400000000000000000000064441322470703100215070ustar00rootroot00000000000000/* * (C) 2015,2016 Kai Michaelis * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #include #endif #include namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EMSA_PKCS1) class Name_Constraint_Tests final : public Test { public: std::vector run() override { const std::vector> test_cases = { std::make_tuple( "Root_Email_Name_Constraint.crt", "Invalid_Email_Name_Constraint.crt", "Invalid Email Name Constraint", "Certificate does not pass name constraint"), std::make_tuple( "Root_DN_Name_Constraint.crt", "Invalid_DN_Name_Constraint.crt", "Invalid DN Name Constraint", "Certificate does not pass name constraint"), std::make_tuple( "Root_DN_Name_Constraint.crt", "Valid_DN_Name_Constraint.crt", "Valid DN Name Constraint", "Verified"), std::make_tuple( "Root_DNS_Name_Constraint.crt", "Valid_DNS_Name_Constraint.crt", "aexample.com", "Verified"), std::make_tuple( "Root_IP_Name_Constraint.crt", "Valid_IP_Name_Constraint.crt", "Valid IP Name Constraint", "Verified"), std::make_tuple( "Root_IP_Name_Constraint.crt", "Invalid_IP_Name_Constraint.crt", "Invalid IP Name Constraint", "Certificate does not pass name constraint"), }; std::vector results; const Botan::Path_Validation_Restrictions restrictions(false, 80); std::chrono::system_clock::time_point validation_time = Botan::calendar_point(2016, 10, 21, 4, 20, 0).to_std_timepoint(); for(const auto& t : test_cases) { Botan::X509_Certificate root(Test::data_file("x509/name_constraint/" + std::get<0>(t))); Botan::X509_Certificate sub(Test::data_file("x509/name_constraint/" + std::get<1>(t))); Botan::Certificate_Store_In_Memory trusted; Test::Result result("X509v3 Name Constraints: " + std::get<1>(t)); trusted.add_certificate(root); Botan::Path_Validation_Result path_result = Botan::x509_path_validate( sub, restrictions, trusted, std::get<2>(t), Botan::Usage_Type::TLS_SERVER_AUTH, validation_time); if(path_result.successful_validation() && path_result.trust_root() != root) { path_result = Botan::Path_Validation_Result(Botan::Certificate_Status_Code::CANNOT_ESTABLISH_TRUST); } result.test_eq("validation result", path_result.result_string(), std::get<3>(t)); results.push_back(result); } return results; } }; BOTAN_REGISTER_TEST("x509_path_name_constraint", Name_Constraint_Tests); #endif } } botan-2.4.0/src/tests/test_newhope.cpp000066400000000000000000000101251322470703100177570ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_NEWHOPE) && defined(BOTAN_HAS_CHACHA) #include #include #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_NEWHOPE) && defined(BOTAN_HAS_CHACHA) class NEWHOPE_RNG final : public Botan::RandomNumberGenerator { public: std::string name() const override { return "NEWHOPE_RNG"; } void clear() override { /* ignored */ } void randomize(uint8_t out[], size_t len) override { if(m_first.size() == len) { if(len != 32) { throw Test_Error("NEWHOPE_RNG called in unexpected way, bad test?"); } Botan::copy_mem(out, m_first.data(), m_first.size()); return; } /* * This slavishly emulates the behavior of the reference * implementations RNG, in order to ensure that from the same * random seed we compute the exact same result. */ Botan::clear_mem(out, len); m_chacha.cipher1(out, len); m_calls += 1; uint8_t nonce[8] = { 0 }; if(m_calls < 3) { nonce[0] = m_calls; } else { nonce[7] = m_calls; } m_chacha.set_iv(nonce, 8); } bool is_seeded() const override { return true; } void add_entropy(const uint8_t[], size_t) override { /* ignored */ } NEWHOPE_RNG(const std::vector& seed) { if(seed.size() != 64 && seed.size() != 32) { throw Test_Error("Invalid NEWHOPE RNG seed"); } if(seed.size() == 64) { m_first.assign(seed.begin(), seed.begin() + 32); m_chacha.set_key(seed.data() + 32, 32); } else { m_chacha.set_key(seed.data(), 32); } } private: Botan::ChaCha m_chacha; std::vector m_first; uint8_t m_calls = 0; }; class NEWHOPE_Tests final : public Text_Based_Test { public: NEWHOPE_Tests() : Text_Based_Test( "pubkey/newhope.vec", "DRBG_SeedA,H_OutputA,DRBG_SeedB,H_OutputB,SharedKey") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("NEWHOPE"); const std::vector h_output_a = get_req_bin(vars, "H_OutputA"); const std::vector h_output_b = get_req_bin(vars, "H_OutputB"); const std::vector shared_key = get_req_bin(vars, "SharedKey"); NEWHOPE_RNG drbg_a(get_req_bin(vars, "DRBG_SeedA")); NEWHOPE_RNG drbg_b(get_req_bin(vars, "DRBG_SeedB")); Botan::SHA_3_256 sha3; std::vector send_a(Botan::NEWHOPE_SENDABYTES); Botan::newhope_poly a_sk; Botan::newhope_keygen(send_a.data(), &a_sk, drbg_a); std::vector h_send_a(sha3.output_length()); sha3.update(send_a); sha3.final(h_send_a.data()); result.test_eq("Hash Output A", h_send_a, h_output_a); std::vector sharedkey_b(32); std::vector send_b(Botan::NEWHOPE_SENDBBYTES); Botan::newhope_sharedb(sharedkey_b.data(), send_b.data(), send_a.data(), drbg_b); result.test_eq("Key B", sharedkey_b, shared_key); std::vector h_send_b(sha3.output_length()); sha3.update(send_b); sha3.final(h_send_b.data()); result.test_eq("Hash Output B", h_send_b, h_output_b); std::vector sharedkey_a(32); newhope_shareda(sharedkey_a.data(), &a_sk, send_b.data()); result.test_eq("Key A", sharedkey_a, shared_key); return result; } }; BOTAN_REGISTER_TEST("newhope", NEWHOPE_Tests); #endif } botan-2.4.0/src/tests/test_ocb.cpp000066400000000000000000000254101322470703100170600ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_AEAD_OCB) #include #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_AEAD_OCB) // Toy cipher used for wide block tests class OCB_Wide_Test_Block_Cipher final : public Botan::BlockCipher { public: OCB_Wide_Test_Block_Cipher(size_t bs) : m_bs(bs) {} std::string name() const override { return "OCB_ToyCipher"; } size_t block_size() const override { return m_bs; } void clear() override { m_key.clear(); } Botan::BlockCipher* clone() const override { return new OCB_Wide_Test_Block_Cipher(m_bs); } void key_schedule(const uint8_t key[], size_t length) override { m_key.assign(key, key + length); } Botan::Key_Length_Specification key_spec() const override { return Botan::Key_Length_Specification(m_bs); } void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override { while(blocks) { Botan::copy_mem(out, in, m_bs); Botan::poly_double_n(out, m_bs); for(size_t i = 0; i != m_bs; ++i) out[i] ^= m_key[i]; blocks--; in += block_size(); out += block_size(); } } void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const override { while(blocks) { for(size_t i = 0; i != m_bs; ++i) out[i] = in[i] ^ m_key[i]; uint8_t carry = in[m_bs-1] & 0x01; if(carry) { if(m_bs == 16 || m_bs == 24) { out[m_bs-1] ^= 0x87; } else if(m_bs == 32) { out[m_bs-2] ^= 0x4; out[m_bs-1] ^= 0x25; } else if(m_bs == 64) { out[m_bs-2] ^= 0x1; out[m_bs-1] ^= 0x25; } else throw Test_Error("Bad OCB test block size"); } carry <<= 7; for(size_t i = 0; i != m_bs; ++i) { const uint8_t temp = out[i]; out[i] = (temp >> 1) | carry; carry = (temp & 0x1); carry <<= 7; } blocks--; in += block_size(); out += block_size(); } } private: size_t m_bs; std::vector m_key; }; class OCB_Wide_KAT_Tests final : public Text_Based_Test { public: OCB_Wide_KAT_Tests() : Text_Based_Test("ocb/ocb_wide.vec", "Key,Nonce,AD,In,Out") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("OCB wide block KAT"); const std::vector key = get_req_bin(vars, "Key"); const std::vector nonce = get_req_bin(vars, "Nonce"); const std::vector ad = get_req_bin(vars, "AD"); const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); const size_t bs = key.size(); Botan::secure_vector buf(input.begin(), input.end()); Botan::OCB_Encryption enc(new OCB_Wide_Test_Block_Cipher(bs), std::min(bs, 32)); enc.set_key(key); enc.set_ad(ad); enc.start(nonce); enc.finish(buf); result.test_eq("Ciphertext matches", buf, expected); Botan::OCB_Decryption dec(new OCB_Wide_Test_Block_Cipher(bs), std::min(bs, 32)); dec.set_key(key); dec.set_ad(ad); dec.start(nonce); dec.finish(buf); result.test_eq("Decryption correct", buf, input); return result; } }; BOTAN_REGISTER_TEST("ocb_wide", OCB_Wide_KAT_Tests); class OCB_Wide_Long_KAT_Tests final : public Text_Based_Test { public: OCB_Wide_Long_KAT_Tests() : Text_Based_Test("ocb/ocb_wide_long.vec", "Output") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { Test::Result result("OCB wide block long test"); const std::vector expected = get_req_bin(vars, "Output"); std::unique_ptr cipher; size_t bs = 0; if(algo == "SHACAL2") { #if defined(BOTAN_HAS_SHACAL2) cipher = Botan::BlockCipher::create_or_throw("SHACAL2"); bs = 32; #else return {result}; #endif } else { if(algo == "Toy128") bs = 16; else if(algo == "Toy192") bs = 24; else if(algo == "Toy256") bs = 32; else if(algo == "Toy512") bs = 64; else throw Test_Error("Unknown cipher for OCB wide block long test"); cipher.reset(new OCB_Wide_Test_Block_Cipher(bs)); } Botan::OCB_Encryption enc(cipher.release(), std::min(bs, 32)); /* Y, string of length min(B, 256) bits Y is defined as follows. K = (0xA0 || 0xA1 || 0xA2 || ...)[1..B] C = for i = 0 to 127 do S = (0x50 || 0x51 || 0x52 || ...)[1..8i] N = num2str(3i+1,16) C = C || OCB-ENCRYPT(K,N,S,S) N = num2str(3i+2,16) C = C || OCB-ENCRYPT(K,N,,S) N = num2str(3i+3,16) C = C || OCB-ENCRYPT(K,N,S,) end for N = num2str(385,16) Y = OCB-ENCRYPT(K,N,C,) */ std::vector key(bs); for(size_t i = 0; i != bs; ++i) key[i] = 0xA0 + i; enc.set_key(key); const std::vector empty; std::vector N(2); std::vector C; for(size_t i = 0; i != 128; ++i) { std::vector S(i); for(size_t j = 0; j != S.size(); ++j) S[j] = 0x50 + j; Botan::store_be(static_cast(3 * i + 1), &N[0]); ocb_encrypt(result, C, enc, N, S, S); Botan::store_be(static_cast(3 * i + 2), &N[0]); ocb_encrypt(result, C, enc, N, S, empty); Botan::store_be(static_cast(3 * i + 3), &N[0]); ocb_encrypt(result, C, enc, N, empty, S); } Botan::store_be(static_cast(385), &N[0]); std::vector final_result; ocb_encrypt(result, final_result, enc, N, empty, C); result.test_eq("correct value", final_result, expected); return result; } private: void ocb_encrypt(Test::Result& /*result*/, std::vector& output_to, Botan::OCB_Encryption& enc, const std::vector& nonce, const std::vector& pt, const std::vector& ad) { enc.set_associated_data(ad.data(), ad.size()); enc.start(nonce.data(), nonce.size()); Botan::secure_vector buf(pt.begin(), pt.end()); enc.finish(buf, 0); output_to.insert(output_to.end(), buf.begin(), buf.end()); } }; BOTAN_REGISTER_TEST("ocb_long_wide", OCB_Wide_Long_KAT_Tests); class OCB_Long_KAT_Tests final : public Text_Based_Test { public: OCB_Long_KAT_Tests() : Text_Based_Test("ocb/ocb_long.vec", "Keylen,Taglen,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { const size_t keylen = get_req_sz(vars, "Keylen"); const size_t taglen = get_req_sz(vars, "Taglen"); const std::vector expected = get_req_bin(vars, "Output"); // Test from RFC 7253 Appendix A const std::string algo = "AES-" + std::to_string(keylen); Test::Result result("OCB long"); std::unique_ptr aes(Botan::BlockCipher::create(algo)); if(!aes) { result.note_missing(algo); return result; } Botan::OCB_Encryption enc(aes->clone(), taglen / 8); Botan::OCB_Decryption dec(aes->clone(), taglen / 8); std::vector key(keylen / 8); key[keylen / 8 - 1] = static_cast(taglen); enc.set_key(key); dec.set_key(key); const std::vector empty; std::vector N(12); std::vector C; for(size_t i = 0; i != 128; ++i) { const std::vector S(i); Botan::store_be(static_cast(3 * i + 1), &N[8]); ocb_encrypt(result, C, enc, dec, N, S, S); Botan::store_be(static_cast(3 * i + 2), &N[8]); ocb_encrypt(result, C, enc, dec, N, S, empty); Botan::store_be(static_cast(3 * i + 3), &N[8]); ocb_encrypt(result, C, enc, dec, N, empty, S); } Botan::store_be(static_cast(385), &N[8]); std::vector final_result; ocb_encrypt(result, final_result, enc, dec, N, empty, C); result.test_eq("correct value", final_result, expected); return result; } private: void ocb_encrypt(Test::Result& result, std::vector& output_to, Botan::OCB_Encryption& enc, Botan::OCB_Decryption& dec, const std::vector& nonce, const std::vector& pt, const std::vector& ad) { enc.set_associated_data(ad.data(), ad.size()); enc.start(nonce.data(), nonce.size()); Botan::secure_vector buf(pt.begin(), pt.end()); enc.finish(buf, 0); output_to.insert(output_to.end(), buf.begin(), buf.end()); try { dec.set_associated_data(ad.data(), ad.size()); dec.start(nonce.data(), nonce.size()); dec.finish(buf, 0); result.test_eq("OCB round tripped", buf, pt); } catch(std::exception& e) { result.test_failure("OCB round trip error", e.what()); } } }; BOTAN_REGISTER_TEST("ocb_long", OCB_Long_KAT_Tests); #endif } } botan-2.4.0/src/tests/test_ocsp.cpp000066400000000000000000000166661322470703100172760ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_OCSP) #include #include #include #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_OCSP) && defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EMSA_PKCS1) class OCSP_Tests final : public Test { private: std::shared_ptr load_test_X509_cert(const std::string& path) { return std::make_shared(Test::data_file(path)); } std::shared_ptr load_test_OCSP_resp(const std::string& path) { return std::make_shared(Test::read_binary_data_file(path)); } Test::Result test_response_parsing() { Test::Result result("OCSP response parsing"); // Simple parsing tests const std::vector ocsp_input_paths = { "x509/ocsp/resp1.der", "x509/ocsp/resp2.der", "x509/ocsp/resp3.der" }; for(std::string ocsp_input_path : ocsp_input_paths) { try { Botan::OCSP::Response resp(Test::read_binary_data_file(ocsp_input_path)); result.test_success("Parsed input " + ocsp_input_path); } catch(Botan::Exception& e) { result.test_failure("Parsing failed", e.what()); } } return result; } Test::Result test_response_certificate_access() { Test::Result result("OCSP response certificate access"); try { Botan::OCSP::Response resp1(Test::read_binary_data_file("x509/ocsp/resp1.der")); const auto &certs1 = resp1.certificates(); if(result.test_eq("Expected count of certificates", certs1.size(), 1)) { const auto cert = certs1.front(); const Botan::X509_DN expected_dn({std::make_pair( "X520.CommonName", "Symantec Class 3 EV SSL CA - G3 OCSP Responder")}); const bool matches = cert.subject_dn() == expected_dn; result.test_eq("CN matches expected", matches, true); } Botan::OCSP::Response resp2(Test::read_binary_data_file("x509/ocsp/resp2.der")); const auto &certs2 = resp2.certificates(); result.test_eq("Expect no certificates", certs2.size(), 0); } catch(Botan::Exception& e) { result.test_failure("Parsing failed", e.what()); } return result; } Test::Result test_request_encoding() { Test::Result result("OCSP request encoding"); const Botan::X509_Certificate end_entity(Test::data_file("x509/ocsp/gmail.pem")); const Botan::X509_Certificate issuer(Test::data_file("x509/ocsp/google_g2.pem")); try { const Botan::OCSP::Request bogus(end_entity, issuer); result.test_failure("Bad arguments (swapped end entity, issuer) accepted"); } catch(Botan::Invalid_Argument&) { result.test_success("Bad arguments rejected"); } const std::string expected_request = "ME4wTKADAgEAMEUwQzBBMAkGBSsOAwIaBQAEFPLgavmFih2NcJtJGSN6qbUaKH5kBBRK3QYWG7z2aLV29YG2u2IaulqBLwIIQkg+DF+RYMY="; const Botan::OCSP::Request req1(issuer, end_entity); result.test_eq("Encoded OCSP request", req1.base64_encode(), expected_request); const Botan::OCSP::Request req2(issuer, BigInt::decode(end_entity.serial_number())); result.test_eq("Encoded OCSP request", req2.base64_encode(), expected_request); return result; } Test::Result test_response_verification() { Test::Result result("OCSP request check"); std::shared_ptr ee = load_test_X509_cert("x509/ocsp/randombit.pem"); std::shared_ptr ca = load_test_X509_cert("x509/ocsp/letsencrypt.pem"); std::shared_ptr trust_root = load_test_X509_cert("x509/ocsp/geotrust.pem"); const std::vector> cert_path = { ee, ca, trust_root }; std::shared_ptr ocsp = load_test_OCSP_resp("x509/ocsp/randombit_ocsp.der"); Botan::Certificate_Store_In_Memory certstore; certstore.add_certificate(trust_root); // Some arbitrary time within the validity period of the test certs const auto valid_time = Botan::calendar_point(2016, 11, 20, 8, 30, 0).to_std_timepoint(); const auto ocsp_status = Botan::PKIX::check_ocsp(cert_path, { ocsp }, { &certstore }, valid_time); if(result.test_eq("Expected size of ocsp_status", ocsp_status.size(), 1)) { if(result.test_eq("Expected size of ocsp_status[0]", ocsp_status[0].size(), 1)) { result.confirm("Status good", ocsp_status[0].count(Botan::Certificate_Status_Code::OCSP_RESPONSE_GOOD)); } } return result; } #if defined(BOTAN_HAS_ONLINE_REVOCATION_CHECKS) Test::Result test_online_request() { Test::Result result("OCSP online check"); // Expired end-entity certificate: std::shared_ptr ee = load_test_X509_cert("x509/ocsp/randombit.pem"); std::shared_ptr ca = load_test_X509_cert("x509/ocsp/letsencrypt.pem"); std::shared_ptr trust_root = load_test_X509_cert("x509/ocsp/identrust.pem"); const std::vector> cert_path = { ee, ca, trust_root }; Botan::Certificate_Store_In_Memory certstore; certstore.add_certificate(trust_root); typedef std::chrono::system_clock Clock; const auto ocspTimeout = std::chrono::milliseconds(3000); auto ocsp_status = Botan::PKIX::check_ocsp_online(cert_path, { &certstore }, Clock::now(), ocspTimeout, false); if(result.test_eq("Expected size of ocsp_status", ocsp_status.size(), 1)) { if(result.test_eq("Expected size of ocsp_status[0]", ocsp_status[0].size(), 1)) { result.confirm("Status expired", ocsp_status[0].count(Botan::Certificate_Status_Code::OCSP_HAS_EXPIRED)); } } return result; } #endif public: std::vector run() override { std::vector results; results.push_back(test_request_encoding()); results.push_back(test_response_parsing()); results.push_back(test_response_certificate_access()); results.push_back(test_response_verification()); #if defined(BOTAN_HAS_ONLINE_REVOCATION_CHECKS) if(Test::run_online_tests()) { results.push_back(test_online_request()); } #endif return results; } }; BOTAN_REGISTER_TEST("ocsp", OCSP_Tests); #endif } botan-2.4.0/src/tests/test_octetstring.cpp000066400000000000000000000101701322470703100206570ustar00rootroot00000000000000/* * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include namespace Botan_Tests { namespace { Test::Result test_from_rng() { Test::Result result("OctetString"); Botan::OctetString os(Test::rng(), 32); result.test_eq("length is 32 bytes", os.size(), 32); return result; } Test::Result test_from_hex() { Test::Result result("OctetString"); Botan::OctetString os("0123456789ABCDEF"); result.test_eq("length is 8 bytes", os.size(), 8); return result; } Test::Result test_from_byte() { Test::Result result("OctetString"); auto rand_bytes = Test::rng().random_vec(8); Botan::OctetString os(rand_bytes.data(), rand_bytes.size()); result.test_eq("length is 8 bytes", os.size(), 8); return result; } Test::Result test_odd_parity() { Test::Result result("OctetString"); Botan::OctetString os("FFFFFFFFFFFFFFFF"); os.set_odd_parity(); Botan::OctetString expected("FEFEFEFEFEFEFEFE"); result.test_eq("odd parity set correctly", os, expected); Botan::OctetString os2("EFCBDA4FAA997F63"); os2.set_odd_parity(); Botan::OctetString expected2("EFCBDA4FAB987F62"); result.test_eq("odd parity set correctly", os2, expected2); return result; } Test::Result test_as_string() { Test::Result result("OctetString"); Botan::OctetString os("0123456789ABCDEF"); result.test_eq("OctetString::as_string() returns correct string", os.as_string(), "0123456789ABCDEF"); return result; } Test::Result test_xor() { Test::Result result("OctetString"); Botan::OctetString os1("0000000000000000"); Botan::OctetString os2("FFFFFFFFFFFFFFFF"); Botan::OctetString xor_result = os1 ^ os2; result.test_eq("OctetString XOR operations works as expected", xor_result, os2); xor_result = os1; xor_result ^= os2; result.test_eq("OctetString XOR operations works as expected", xor_result, os2); xor_result = os2 ^ os2; result.test_eq("OctetString XOR operations works as expected", xor_result, os1); Botan::OctetString os3("0123456789ABCDEF"); xor_result = os3 ^ os2; Botan::OctetString expected("FEDCBA9876543210"); result.test_eq("OctetString XOR operations works as expected", xor_result, expected); return result; } Test::Result test_equality() { Test::Result result("OctetString"); const Botan::OctetString os1("0000000000000000"); const Botan::OctetString os1_copy = os1; const Botan::OctetString os2("FFFFFFFFFFFFFFFF"); const Botan::OctetString os2_copy = os2; result.confirm("OctetString equality operations works as expected", os1 == os1_copy); result.confirm("OctetString equality operations works as expected", os2 == os2_copy); result.confirm("OctetString equality operations works as expected", os1 != os2); return result; } Test::Result test_append() { Test::Result result("OctetString"); Botan::OctetString os1("0000"); Botan::OctetString os2("FFFF"); Botan::OctetString expected("0000FFFF"); Botan::OctetString append_result = os1 + os2; result.test_eq("OctetString append operations works as expected", append_result, expected); return result; } class OctetString_Tests final : public Test { public: std::vector run() override { std::vector results; std::vector> fns = { test_from_rng, test_from_hex, test_from_byte, test_odd_parity, test_as_string, test_xor, test_equality, test_append }; for(size_t i = 0; i != fns.size(); ++i) { try { results.push_back(fns[ i ]()); } catch(std::exception& e) { results.push_back(Test::Result::Failure("OctetString tests " + std::to_string(i), e.what())); } } return results; } }; BOTAN_REGISTER_TEST("octetstring", OctetString_Tests); } } botan-2.4.0/src/tests/test_os_utils.cpp000066400000000000000000000127071322470703100201630ustar00rootroot00000000000000/* * Testing operating system specific wrapper code * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include // For __ud2 intrinsic #if defined(BOTAN_TARGET_COMPILER_IS_MSVC) #include #endif namespace Botan_Tests { namespace { /* uint32_t get_process_id(); uint64_t get_processor_timestamp(); uint64_t get_system_timestamp_ns(); size_t get_memory_locking_limit(); void* allocate_locked_pages(size_t length); void free_locked_pages(void* ptr, size_t length); int run_cpu_instruction_probe(std::function probe_fn); */ class OS_Utils_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_get_process_id()); results.push_back(test_get_processor_timestamp()); results.push_back(test_get_high_resolution_clock()); results.push_back(test_get_system_timestamp()); results.push_back(test_memory_locking()); results.push_back(test_cpu_instruction_probe()); return results; } private: Test::Result test_get_process_id() { Test::Result result("OS::get_process_id"); uint32_t pid1 = Botan::OS::get_process_id(); uint32_t pid2 = Botan::OS::get_process_id(); result.test_eq("PID same across calls", static_cast(pid1), static_cast(pid2)); #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIKERNEL) result.test_eq("PID is zero on unikernel systems", pid1, 0); #else result.test_ne("PID is non-zero on systems with processes", pid1, 0); #endif return result; } Test::Result test_get_processor_timestamp() { // TODO better tests Test::Result result("OS::get_processor_timestamp"); const uint64_t proc_ts1 = Botan::OS::get_processor_timestamp(); // do something that consumes a little time volatile int x = 11; while(x < 65535) { x *= 2; x -= 10; } uint64_t proc_ts2 = Botan::OS::get_processor_timestamp(); if(proc_ts1 == 0) { result.test_is_eq("Disabled processor timestamp stays at zero", proc_ts1, proc_ts2); } else { result.confirm("Processor timestamp does not duplicate", proc_ts1 != proc_ts2); } return result; } Test::Result test_get_high_resolution_clock() { // TODO better tests Test::Result result("OS::get_high_resolution_clock"); uint64_t hr_ts1 = Botan::OS::get_high_resolution_clock(); result.test_ne("high resolution timestamp value is never zero", hr_ts1, 0); // do something that consumes a little time Botan::OS::get_process_id(); uint64_t hr_ts2 = Botan::OS::get_high_resolution_clock(); result.test_ne("high resolution timestamp does not duplicate", hr_ts1, hr_ts2); return result; } Test::Result test_get_system_timestamp() { // TODO better tests Test::Result result("OS::get_system_timestamp_ns"); uint64_t sys_ts1 = Botan::OS::get_system_timestamp_ns(); result.test_ne("System timestamp value is never zero", sys_ts1, 0); // do something that consumes a little time Botan::OS::get_process_id(); uint64_t sys_ts2 = Botan::OS::get_system_timestamp_ns(); result.confirm("System time moves forward", sys_ts1 <= sys_ts2); return result; } Test::Result test_memory_locking() { Test::Result result("OS memory locked pages"); // TODO any tests... return result; } Test::Result test_cpu_instruction_probe() { Test::Result result("OS::run_cpu_instruction_probe"); // OS::run_cpu_instruction_probe only implemented for Unix signals or Windows SEH std::function ok_fn = []() -> int { return 5; }; const int run_rc = Botan::OS::run_cpu_instruction_probe(ok_fn); if(run_rc == -3) { result.test_note("run_cpu_instruction_probe not implemented on this platform"); return {result}; } result.confirm("Correct result returned by working probe fn", run_rc == 5); std::function crash_probe; #if defined(BOTAN_TARGET_COMPILER_IS_MSVC) crash_probe = []() -> int { __ud2(); return 3; }; #elif defined(BOTAN_USE_GCC_INLINE_ASM) #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) crash_probe = []() -> int { asm volatile("ud2"); return 3; }; #elif defined(BOTAN_TARGET_CPU_IS_ARM_FAMILY) //ARM: asm volatile (".word 0xf7f0a000\n"); // illegal instruction in both ARM and Thumb modes crash_probe = []() -> int { asm volatile(".word 0xe7f0def0\n"); return 3; }; #else /* PPC: "The instruction with primary opcode 0, when the instruction does not consist entirely of binary zeros" Others ? */ #endif #endif if(crash_probe) { const int crash_rc = Botan::OS::run_cpu_instruction_probe(crash_probe); result.confirm("Result for function executing undefined opcode", crash_rc < 0); } return result; } }; BOTAN_REGISTER_TEST("os_utils", OS_Utils_Tests); } } botan-2.4.0/src/tests/test_otp.cpp000066400000000000000000000120201322470703100171100ustar00rootroot00000000000000/* * OTP tests * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include #if defined(BOTAN_HAS_HOTP) #include #include #endif #if defined(BOTAN_HAS_TOTP) #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_HOTP) class HOTP_KAT_Tests final : public Text_Based_Test { public: HOTP_KAT_Tests() : Text_Based_Test("otp/hotp.vec", "Key,Digits,Counter,OTP") {} bool clear_between_callbacks() const override { return false; } Test::Result run_one_test(const std::string& hash_algo, const VarMap& vars) override { Test::Result result("HOTP " + hash_algo); std::unique_ptr hash_test = Botan::HashFunction::create(hash_algo); if(!hash_test) return {result}; const std::vector key = get_req_bin(vars, "Key"); const size_t otp = get_req_sz(vars, "OTP"); const uint64_t counter = get_req_sz(vars, "Counter"); const size_t digits = get_req_sz(vars, "Digits"); Botan::HOTP hotp(key, hash_algo, digits); result.test_eq("OTP", hotp.generate_hotp(counter), otp); std::pair otp_res = hotp.verify_hotp(otp, counter, 0); result.test_eq("OTP verify result", otp_res.first, true); result.confirm("OTP verify next counter", otp_res.second == counter + 1); // Test invalid OTP otp_res = hotp.verify_hotp(otp + 1, counter, 0); result.test_eq("OTP verify result", otp_res.first, false); result.confirm("OTP verify next counter", otp_res.second == counter); // Test invalid OTP with long range otp_res = hotp.verify_hotp(otp + 1, counter, 100); result.test_eq("OTP verify result", otp_res.first, false); result.confirm("OTP verify next counter", otp_res.second == counter); // Test valid OTP with long range otp_res = hotp.verify_hotp(otp, counter - 90, 100); result.test_eq("OTP verify result", otp_res.first, true); result.confirm("OTP verify next counter", otp_res.second == counter + 1); return result; } }; BOTAN_REGISTER_TEST("otp_hotp", HOTP_KAT_Tests); #endif #if defined(BOTAN_HAS_TOTP) class TOTP_KAT_Tests final : public Text_Based_Test { public: TOTP_KAT_Tests() : Text_Based_Test("otp/totp.vec", "Key,Digits,Timestep,Timestamp,OTP") {} bool clear_between_callbacks() const override { return false; } Test::Result run_one_test(const std::string& hash_algo, const VarMap& vars) override { Test::Result result("TOTP " + hash_algo); std::unique_ptr hash_test = Botan::HashFunction::create(hash_algo); if(!hash_test) return {result}; const std::vector key = get_req_bin(vars, "Key"); const size_t otp = get_req_sz(vars, "OTP"); const size_t digits = get_req_sz(vars, "Digits"); const size_t timestep = get_req_sz(vars, "Timestep"); const std::string timestamp = get_req_str(vars, "Timestamp"); Botan::TOTP totp(key, hash_algo, digits, timestep); std::chrono::system_clock::time_point time = from_timestring(timestamp); std::chrono::system_clock::time_point later_time = time + std::chrono::seconds(timestep); std::chrono::system_clock::time_point too_late = time + std::chrono::seconds(2*timestep); result.test_eq("TOTP generate", totp.generate_totp(time), otp); result.test_eq("TOTP verify valid", totp.verify_totp(otp, time, 0), true); result.test_eq("TOTP verify invalid", totp.verify_totp(otp ^ 1, time, 0), false); result.test_eq("TOTP verify time slip", totp.verify_totp(otp, later_time, 0), false); result.test_eq("TOTP verify time slip allowed", totp.verify_totp(otp, later_time, 1), true); result.test_eq("TOTP verify time slip out of range", totp.verify_totp(otp, too_late, 1), false); return result; } private: std::chrono::system_clock::time_point from_timestring(const std::string& time_str) { if(time_str.size() != 19) throw std::invalid_argument("Invalid TOTP timestamp string " + time_str); // YYYY-MM-DDTHH:MM:SS // 0123456789012345678 const uint32_t year = Botan::to_u32bit(time_str.substr(0, 4)); const uint32_t month = Botan::to_u32bit(time_str.substr(5, 2)); const uint32_t day = Botan::to_u32bit(time_str.substr(8, 2)); const uint32_t hour = Botan::to_u32bit(time_str.substr(11, 2)); const uint32_t minute = Botan::to_u32bit(time_str.substr(14, 2)); const uint32_t second = Botan::to_u32bit(time_str.substr(17, 2)); return Botan::calendar_point(year, month, day, hour, minute, second).to_std_timepoint(); } }; BOTAN_REGISTER_TEST("otp_totp", TOTP_KAT_Tests); #endif } botan-2.4.0/src/tests/test_package_transform.cpp000066400000000000000000000043501322470703100220030ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #define BOTAN_NO_DEPRECATED_WARNINGS #include "tests.h" #if defined(BOTAN_HAS_PACKAGE_TRANSFORM) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_PACKAGE_TRANSFORM) class Package_Transform_Tests final : public Test { public: std::vector run() override { Test::Result result("Package transform"); std::unique_ptr cipher(Botan::BlockCipher::create("AES-128")); if(!cipher) return {result}; for(size_t input_len = 2; input_len != 256; ++input_len) { std::vector input = unlock(Test::rng().random_vec(input_len)); std::vector output(input.size() + cipher->block_size()); // aont_package owns/deletes the passed cipher object, kind of a bogus API Botan::aont_package(Test::rng(), cipher->clone(), input.data(), input.size(), output.data()); std::vector decoded(output.size() - cipher->block_size()); Botan::aont_unpackage(cipher->clone(), output.data(), output.size(), decoded.data()); result.test_eq("Package transform is reversible", decoded, input); output[0] ^= 1; Botan::aont_unpackage(cipher->clone(), output.data(), output.size(), decoded.data()); result.test_ne("Bitflip breaks package transform", decoded, input); output[0] ^= 1; Botan::aont_unpackage(cipher->clone(), output.data(), output.size(), decoded.data()); result.test_eq("Package transform is still reversible", decoded, input); // More tests including KATs would be useful for these functions } return std::vector {result}; } }; BOTAN_REGISTER_TEST("package_transform", Package_Transform_Tests); #endif } botan-2.4.0/src/tests/test_pad.cpp000066400000000000000000000051651322470703100170660ustar00rootroot00000000000000/* * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_CIPHER_MODE_PADDING) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_CIPHER_MODE_PADDING) class Cipher_Mode_Padding_Tests final : public Text_Based_Test { public: Cipher_Mode_Padding_Tests() : Text_Based_Test("pad.vec", "In,Blocksize", "Out") {} Test::Result run_one_test(const std::string& header, const VarMap& vars) override { const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_opt_bin(vars, "Out"); const size_t block_size = get_req_sz(vars, "Blocksize"); std::string algo = header; auto underscore = algo.find('_'); if(underscore != std::string::npos) { if(algo.substr(underscore + 1, std::string::npos) != "Invalid") { throw Test_Error("Unexpected padding header " + header); } algo = algo.substr(0, underscore); } Test::Result result(algo); std::unique_ptr pad(Botan::get_bc_pad(algo)); if(!pad) { result.test_failure("Invalid padding method: " + algo); return result; } if(expected.empty()) { // This is an unpad an invalid input and ensure we reject if(pad->unpad(input.data(), block_size) != block_size) { result.test_failure("Did not reject invalid padding", Botan::hex_encode(input)); } else { result.test_success("Rejected invalid padding"); } } else { // This is a pad plaintext and unpad valid padding round trip test Botan::secure_vector buf(input.begin(), input.end()); pad->add_padding(buf, input.size() % block_size, block_size); result.test_eq("pad", buf, expected); buf.assign(expected.begin(), expected.end()); const size_t last_block = (buf.size() < block_size) ? 0 : buf.size() - block_size; const size_t pad_bytes = block_size - pad->unpad(&buf[last_block], block_size); buf.resize(buf.size() - pad_bytes); // remove padding result.test_eq("unpad", buf, input); } return result; } }; BOTAN_REGISTER_TEST("bc_pad", Cipher_Mode_Padding_Tests); #endif } botan-2.4.0/src/tests/test_passhash.cpp000066400000000000000000000121131322470703100201230ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_BCRYPT) #include #endif #if defined(BOTAN_HAS_PASSHASH9) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_BCRYPT) class Bcrypt_Tests final : public Text_Based_Test { public: Bcrypt_Tests() : Text_Based_Test("passhash/bcrypt.vec", "Password,Passhash") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { // Encoded as binary so we can test binary inputs const std::vector password_vec = get_req_bin(vars, "Password"); const std::string password(reinterpret_cast(password_vec.data()), password_vec.size()); const std::string passhash = get_req_str(vars, "Passhash"); Test::Result result("bcrypt"); result.test_eq("correct hash accepted", Botan::check_bcrypt(password, passhash), true); // self-test low levels for each test password for(uint16_t level = 4; level <= 6; ++level) { const std::string gen_hash = generate_bcrypt(password, Test::rng(), level); result.test_eq("generated hash accepted", Botan::check_bcrypt(password, gen_hash), true); } return result; } std::vector run_final_tests() override { Test::Result result("bcrypt"); uint64_t start = Test::timestamp(); const std::string password = "ag00d1_2BE5ur3"; const uint16_t max_level = (Test::run_long_tests() ? 15 : 10); for(uint16_t level = 4; level <= max_level; ++level) { const std::string gen_hash = generate_bcrypt(password, Test::rng(), level); result.test_eq("generated hash accepted", Botan::check_bcrypt(password, gen_hash), true); } result.set_ns_consumed(Test::timestamp() - start); return {result}; } }; BOTAN_REGISTER_TEST("bcrypt", Bcrypt_Tests); #endif #if defined(BOTAN_HAS_PASSHASH9) class Passhash9_Tests final : public Text_Based_Test { public: Passhash9_Tests() : Text_Based_Test("passhash/passhash9.vec", "Password,Passhash,PRF") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { // Encoded as binary so we can test binary inputs const std::vector password_vec = get_req_bin(vars, "Password"); const std::string password(reinterpret_cast(password_vec.data()), password_vec.size()); const std::string passhash = get_req_str(vars, "Passhash"); const std::size_t prf = get_req_sz(vars, "PRF"); Test::Result result("passhash9"); if(Botan::is_passhash9_alg_supported(uint8_t(prf))) { result.test_eq("correct hash accepted", Botan::check_passhash9(password, passhash), true); } for(uint8_t alg_id = 0; alg_id <= 4; ++alg_id) { if(Botan::is_passhash9_alg_supported(alg_id)) { const std::string gen_hash = Botan::generate_passhash9(password, Test::rng(), 2, alg_id); if(!result.test_eq("generated hash accepted", Botan::check_passhash9(password, gen_hash), true)) { result.test_note("hash was " + gen_hash); } } } const uint16_t max_level = (Test::run_long_tests() ? 14 : 8); for(uint16_t level = 1; level <= max_level; ++level) { const uint8_t alg_id = 1; // default used by generate_passhash9() if(Botan::is_passhash9_alg_supported(alg_id)) { const std::string gen_hash = Botan::generate_passhash9(password, Test::rng(), level, alg_id); if(!result.test_eq("generated hash accepted", Botan::check_passhash9(password, gen_hash), true)) { result.test_note("hash was " + gen_hash); } } } return result; } std::vector run_final_tests() override { Test::Result result("passhash9"); result.confirm("Unknown algorithm is unknown", Botan::is_passhash9_alg_supported(255) == false); result.test_throws("Throws if algorithm not supported", "Invalid argument Passhash9: Algorithm id 255 is not defined", []() { Botan::generate_passhash9("pass", Test::rng(), 3, 255); }); result.test_throws("Throws if iterations is too high", "Invalid argument Requested passhash9 work factor 513 is too large", []() { Botan::check_passhash9("floof", "$9$AgIB3c5J3kvAuML84sZ5hWT9WzJtiYRPLCEARaujS7I6IKbNCwp0"); }); return {result}; } }; BOTAN_REGISTER_TEST("passhash9", Passhash9_Tests); #endif } } botan-2.4.0/src/tests/test_pbkdf.cpp000066400000000000000000000062221322470703100174030ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_PBKDF) #include #endif #if defined(BOTAN_HAS_PGP_S2K) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_PBKDF) class PBKDF_KAT_Tests final : public Text_Based_Test { public: PBKDF_KAT_Tests() : Text_Based_Test("pbkdf", "Iterations,Salt,Passphrase,Output", "OutputLen") {} Test::Result run_one_test(const std::string& pbkdf_name, const VarMap& vars) override { const size_t iterations = get_req_sz(vars, "Iterations"); const std::vector salt = get_req_bin(vars, "Salt"); const std::string passphrase = get_req_str(vars, "Passphrase"); const std::vector expected = get_req_bin(vars, "Output"); const size_t outlen = get_opt_sz(vars, "OutputLen", expected.size()); Test::Result result(pbkdf_name); std::unique_ptr pbkdf(Botan::PBKDF::create(pbkdf_name)); if(!pbkdf) { result.note_missing(pbkdf_name); return result; } result.test_eq("Expected name", pbkdf->name(), pbkdf_name); const Botan::secure_vector derived = pbkdf->derive_key(outlen, passphrase, salt.data(), salt.size(), iterations).bits_of(); result.test_eq("derived key", derived, expected); return result; } }; BOTAN_REGISTER_TEST("pbkdf", PBKDF_KAT_Tests); #endif #if defined(BOTAN_HAS_PGP_S2K) class PGP_S2K_Iter_Test final : public Test { public: std::vector run() override { Test::Result result("PGP_S2K iteration encoding"); // The maximum representable iteration count const size_t max_iter = 65011712; result.test_eq("Encoding of large value accepted", Botan::OpenPGP_S2K::encode_count(max_iter * 2), size_t(255)); result.test_eq("Encoding of small value accepted", Botan::OpenPGP_S2K::encode_count(0), size_t(0)); for(size_t c = 0; c != 256; ++c) { const size_t dec = Botan::OpenPGP_S2K::decode_count(static_cast(c)); const size_t comp_dec = (16 + (c & 0x0F)) << ((c >> 4) + 6); result.test_eq("Decoded value matches PGP formula", dec, comp_dec); } uint8_t last_enc = 0; for(size_t i = 0; i <= max_iter; i += 64) { const uint8_t enc = Botan::OpenPGP_S2K::encode_count(i); result.test_lte("Encoded value non-decreasing", last_enc, enc); /* The iteration count as encoded may not be exactly the value requested, but should never be less */ const size_t dec = Botan::OpenPGP_S2K::decode_count(enc); result.test_gte("Decoded value is >= requested", dec, i); last_enc = enc; } return std::vector{result}; } }; BOTAN_REGISTER_TEST("pgp_s2k_iter", PGP_S2K_Iter_Test); #endif } } botan-2.4.0/src/tests/test_pem.cpp000066400000000000000000000036251322470703100171020ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_PEM_CODEC) #include namespace Botan_Tests { class PEM_Tests : public Test { public: std::vector run() override { Test::Result result("PEM encoding"); std::vector vec(5); for(size_t i = 0; i != vec.size(); ++i) vec[i] = i; const std::string pem1 = Botan::PEM_Code::encode(vec, "BUNNY", 3); result.test_eq("PEM encoding", pem1, "-----BEGIN BUNNY-----\nAAE\nCAw\nQ=\n-----END BUNNY-----\n"); std::string label1 = "this is overwritten"; const Botan::secure_vector decoded1 = Botan::PEM_Code::decode(pem1, label1); result.test_eq("PEM decoding label", label1, "BUNNY"); result.test_throws("PEM decoding unexpected label", "Invalid argument Decoding error: PEM: Label mismatch, wanted FLOOFY, got BUNNY", [pem1]() { Botan::PEM_Code::decode_check_label(pem1, "FLOOFY"); }); const std::string malformed_pem1 = "---BEGIN BUNNY-----\n-----END BUNNY-----"; result.test_throws("PEM decoding bad init label", "Invalid argument Decoding error: PEM: No PEM header found", [malformed_pem1]() { Botan::PEM_Code::decode_check_label(malformed_pem1, "BUNNY"); }); const std::string malformed_pem2 = "-----BEGIN BUNNY-----\n-----END FLOOFY-----"; result.test_throws("PEM decoding bad init label", "Invalid argument Decoding error: PEM: Malformed PEM trailer", [malformed_pem2]() { Botan::PEM_Code::decode_check_label(malformed_pem2, "BUNNY"); }); return {result}; } }; BOTAN_REGISTER_TEST("pem", PEM_Tests); } #endif botan-2.4.0/src/tests/test_pk_pad.cpp000066400000000000000000000111461322470703100175540ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_PK_PADDING) #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_PK_PADDING) class EME_Decoding_Tests final : public Text_Based_Test { public: EME_Decoding_Tests() : Text_Based_Test( "pk_pad_eme", "RawCiphertext,ValidInput", "Plaintext") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { Test::Result result(algo + " Decoding"); std::unique_ptr eme; try { eme.reset(Botan::get_eme(algo)); } catch(Botan::Lookup_Error&) { result.note_missing(algo); return result; } const std::vector ciphertext = get_req_bin(vars, "RawCiphertext"); const std::vector plaintext = get_opt_bin(vars, "Plaintext"); const bool is_valid = get_req_bool(vars, "ValidInput"); if(is_valid == false) { result.test_eq("Plaintext value is empty for invalid EME inputs", plaintext.size(), 0); } uint8_t valid_mask = 0; Botan::secure_vector decoded = eme->unpad(valid_mask, ciphertext.data(), ciphertext.size()); result.confirm("EME valid_mask has expected value", valid_mask == 0x00 || valid_mask == 0xFF); result.test_eq("EME decoding valid/invalid matches", valid_mask == 0xFF, is_valid); if(is_valid && valid_mask == 0xFF) { result.test_eq("EME decoded plaintext correct", decoded, plaintext); } // TODO: also test that encoding is accepted return result; } }; BOTAN_REGISTER_TEST("pk_pad_eme", EME_Decoding_Tests); class EMSA_unit_tests final : public Test { public: std::vector run() override { Test::Result name_tests("EMSA_name_tests"); std::vector pads_need_hash = { #if BOTAN_HAS_EMSA1 "EMSA1", #endif #if BOTAN_HAS_EMSA_X931 "EMSA2", #endif #if BOTAN_HAS_EMSA_PKCS1 "EMSA3", #endif #if BOTAN_HAS_EMSA_PSSR "EMSA4", "PSSR_Raw", #endif #if BOTAN_HAS_ISO_9796 "ISO_9796_DS2", "ISO_9796_DS3", #endif }; std::vector pads_no_hash = { #if BOTAN_HAS_EMSA_RAW "Raw", #endif #if BOTAN_HAS_EMSA_PKCS1 "EMSA3(Raw)", "EMSA3(Raw,SHA-512)", #endif }; for(auto pad : pads_need_hash) { try { std::unique_ptr emsa_1( Botan::get_emsa(pad + "(" + Botan::hash_for_emsa(pad) + ")")); std::unique_ptr emsa_2(Botan::get_emsa(emsa_1->name())); name_tests.test_eq("EMSA_name_test for " + pad, emsa_1->name(), emsa_2->name()); } catch(const std::exception& e) { name_tests.test_failure("EMSA_name_test for " + pad + ": " + e.what()); } } for(auto pad : pads_need_hash) { std::string algo_name = pad + "(YYZ)"; try { std::unique_ptr emsa( Botan::get_emsa(algo_name)); name_tests.test_failure("EMSA_name_test for " + pad + ": " + "Could create EMSA with fantasy hash YYZ"); } catch(const std::exception& e) { name_tests.test_eq("EMSA_name_test for " + pad, e.what(), "Could not find any algorithm named \"" + algo_name + "\""); } } for(auto pad : pads_no_hash) { try { std::unique_ptr emsa_1(Botan::get_emsa(pad)); std::unique_ptr emsa_2(Botan::get_emsa(emsa_1->name())); name_tests.test_eq("EMSA_name_test for " + pad, emsa_1->name(), emsa_2->name()); } catch(const std::exception& e) { name_tests.test_failure("EMSA_name_test for " + pad + ": " + e.what()); } } return { name_tests }; } }; BOTAN_REGISTER_TEST("pk_pad_emsa_unit", EMSA_unit_tests); #endif } botan-2.4.0/src/tests/test_pkcs11.cpp000066400000000000000000000020101322470703100174060ustar00rootroot00000000000000/* * (C) 2016 Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #include "test_pkcs11.h" namespace Botan_Tests { #if defined(BOTAN_HAS_PKCS11) std::vector PKCS11_Test::run_pkcs11_tests(const std::string& name, std::vector>& fns) { std::vector results; for(size_t i = 0; i != fns.size(); ++i) { try { results.push_back(fns[ i ]()); } catch(Botan::PKCS11::PKCS11_ReturnError& e) { results.push_back(Test::Result::Failure(name + " test " + std::to_string(i), e.what())); if(e.get_return_value() == Botan::PKCS11::ReturnValue::PinIncorrect) { break; // Do not continue to not potentially lock the token } } catch(std::exception& e) { results.push_back(Test::Result::Failure(name + " test " + std::to_string(i), e.what())); } } return results; } #endif } botan-2.4.0/src/tests/test_pkcs11.h000066400000000000000000000023651322470703100170700ustar00rootroot00000000000000/* * (C) 2016 Daniel Neus * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TESTS_PKCS11_H_ #define BOTAN_TESTS_PKCS11_H_ #include "tests.h" #if defined(BOTAN_HAS_PKCS11) #include #endif #include #include #include #include namespace Botan_Tests { #if defined(BOTAN_HAS_PKCS11) // PIN is expected to be set to "123456" prior to running the tests const std::string PIN = "123456"; const auto PIN_SECVEC = Botan::PKCS11::secure_string(PIN.begin(), PIN.end()); const std::string TEST_PIN = "654321"; const auto TEST_PIN_SECVEC = Botan::PKCS11::secure_string(TEST_PIN.begin(), TEST_PIN.end()); // SO PIN is expected to be set to "12345678" prior to running the tests const std::string SO_PIN = "12345678"; const auto SO_PIN_SECVEC = Botan::PKCS11::secure_string(SO_PIN.begin(), SO_PIN.end()); const std::string TEST_SO_PIN = "87654321"; const auto TEST_SO_PIN_SECVEC = Botan::PKCS11::secure_string(TEST_SO_PIN.begin(), TEST_SO_PIN.end()); class PKCS11_Test : public Test { protected: static std::vector run_pkcs11_tests(const std::string& name, std::vector>& fns); }; #endif } #endif botan-2.4.0/src/tests/test_pkcs11_high_level.cpp000066400000000000000000001344701322470703100216140ustar00rootroot00000000000000/* * (C) 2016 Daniel Neus * (C) 2016 Philipp Weber * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_pkcs11.h" #include #include #include #include #if defined(BOTAN_HAS_PKCS11) #include #include #include #include #include #include #endif #if defined(BOTAN_HAS_ASN1) #include #endif #if defined (BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #endif #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_PKCS11) #include #include #endif #if defined(BOTAN_HAS_ECDSA) && defined(BOTAN_HAS_PKCS11) #include #include #endif #if defined(BOTAN_HAS_ECDH) && defined(BOTAN_HAS_PKCS11) #include #include #endif #if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_HAS_PKCS11) #include #include #endif #if defined(BOTAN_HAS_HMAC_DRBG) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_PKCS11) using namespace Botan; using namespace PKCS11; class TestSession { public: explicit TestSession(bool login) : m_module(new Module(Test::pkcs11_lib())) { std::vector slot_vec = Slot::get_available_slots(*m_module, true); m_slot.reset(new Slot(*m_module, slot_vec.at(0))); m_session.reset(new Session(*m_slot, false)); if(login) { m_session->login(UserType::User, PIN_SECVEC); } } inline Session& session() const { return *m_session; } private: std::unique_ptr m_module = nullptr; std::unique_ptr m_slot = nullptr; std::unique_ptr m_session = nullptr; }; /***************************** Module *****************************/ Test::Result test_module_ctor() { Test::Result result("Module ctor"); result.test_throws("Module ctor fails for non existent path", []() { Module failing_module("/a/b/c"); }); Module module(Test::pkcs11_lib()); result.test_success("Module ctor did not throw and completed successfully"); return result; } Test::Result test_module_reload() { Test::Result result("Module reload"); Module module(Test::pkcs11_lib()); module.reload(); result.test_success("Module reload did not throw and completed successfully"); module.get_info(); result.test_success("Module get_info() still works after reload"); return result; } Test::Result test_multiple_modules() { Test::Result result("Module copy"); Module first_module(Test::pkcs11_lib()); result.test_throws("Module ctor fails if module is already initialized", []() { Module second_module(Test::pkcs11_lib()); }); return result; } Test::Result test_module_get_info() { Test::Result result("Module info"); Module module(Test::pkcs11_lib()); Info info = module.get_info(); result.test_ne("Cryptoki version != 0", info.cryptokiVersion.major, 0); return result; } class Module_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_module_ctor, test_multiple_modules, test_module_get_info, test_module_reload }; return run_pkcs11_tests("Module", fns); } }; BOTAN_REGISTER_TEST("pkcs11-module", Module_Tests); /***************************** Slot *****************************/ Test::Result test_slot_get_available_slots() { Test::Result result("Slot get_available_slots"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); result.test_gte("Available Slots with attached token >= 1", slot_vec.size(), 1); return result; } Test::Result test_slot_ctor() { Test::Result result("Slot ctor"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); result.test_success("Slot ctor completed successfully"); result.test_is_eq(slot.slot_id(), slot_vec.at(0)); return result; } Test::Result test_get_slot_info() { Test::Result result("Slot get_slot_info"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); SlotInfo info = slot.get_slot_info(); std::string description = reinterpret_cast< char* >(info.slotDescription); result.confirm("Slot description is not empty", !description.empty()); return result; } SlotId get_invalid_slot_id(Module& module) { std::vector slot_vec = Slot::get_available_slots(module, false); SlotId invalid_id = 0; // find invalid slot id while(std::find(slot_vec.begin(), slot_vec.end(), invalid_id) != slot_vec.end()) { invalid_id++; } return invalid_id; } Test::Result test_slot_invalid_id() { Test::Result result("Slot get_slot_info with invalid slot id"); Module module(Test::pkcs11_lib()); SlotId invalid_id = get_invalid_slot_id(module); Slot slot(module, invalid_id); result.test_throws("get_slot_info fails for non existent slot id", [ &slot ]() { slot.get_slot_info(); }); return result; } Test::Result test_get_token_info() { Test::Result result("Slot get_token_info"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); TokenInfo info = slot.get_token_info(); std::string label = reinterpret_cast< char* >(info.label); result.confirm("Token label is not empty", ! label.empty()); return result; } Test::Result test_get_mechanism_list() { Test::Result result("Slot get_mechanism_list"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); std::vector mechanisms = slot.get_mechanism_list(); result.confirm("The Slot supports at least one mechanism", !mechanisms.empty()); return result; } Test::Result test_get_mechanisms_info() { Test::Result result("Slot get_mechanism_info"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); slot.get_mechanism_info(MechanismType::RsaPkcsKeyPairGen); result.test_success("get_mechanism_info() completed successfully."); return result; } class Slot_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_slot_get_available_slots, test_slot_ctor, test_get_slot_info, test_slot_invalid_id, test_get_token_info, test_get_mechanism_list, test_get_mechanisms_info }; return run_pkcs11_tests("Slot", fns); } }; BOTAN_REGISTER_TEST("pkcs11-slot", Slot_Tests); /***************************** Session *****************************/ Test::Result test_session_ctor() { Test::Result result("Session ctor"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); { Session read_only_session(slot, true); result.test_success("read only session opened successfully"); } { Session read_write_session(slot, false); result.test_success("read write session opened successfully"); } { Flags flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); Session read_write_session2(slot, flags, nullptr, nullptr); result.test_success("read write session with flags param opened successfully"); } { Session read_only_session(slot, true); Session read_write_session(slot, false); result.test_success("Opened multiple sessions successfully"); } return result; } Test::Result test_session_ctor_invalid_slot() { Test::Result result("Session ctor with invalid slot id"); Module module(Test::pkcs11_lib()); SlotId invalid_id = get_invalid_slot_id(module); Slot slot(module, invalid_id); result.test_throws("Session ctor with invalid slot id fails", [&slot]() { Session session(slot, true); }); return result; } Test::Result test_session_release() { Test::Result result("Session release/take ownership"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); Session session(slot, false); SessionHandle handle = session.release(); Session session2(slot, handle); result.test_success("releasing ownership and taking ownership works as expected."); return result; } Test::Result test_session_login_logout() { Test::Result result("Session login/logout"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); Session session(slot, false); session.login(UserType::User, PIN_SECVEC); session.logoff(); result.test_success("user login/logout succeeded"); session.login(UserType::SO, SO_PIN_SECVEC); result.test_success("SO login succeeded"); return result; } Test::Result test_session_info() { Test::Result result("Session session info"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); Session session(slot, false); SessionInfo info = session.get_info(); result.test_is_eq("slot id is correct", info.slotID, slot_vec.at(0)); result.test_is_eq("state is a read write public session", info.state, static_cast(SessionState::RwPublicSession)); session.login(UserType::User, PIN_SECVEC); info = session.get_info(); result.test_is_eq("state is a read write user session", info.state, static_cast(SessionState::RwUserFunctions)); session.logoff(); result.test_success("user login/logout succeeded"); session.login(UserType::SO, SO_PIN_SECVEC); result.test_success("SO login succeeded"); return result; } class Session_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_session_ctor, test_session_ctor_invalid_slot, test_session_release, test_session_login_logout, test_session_info }; return run_pkcs11_tests("Session", fns); } }; BOTAN_REGISTER_TEST("pkcs11-session", Session_Tests); /***************************** Object *****************************/ Test::Result test_attribute_container() { Test::Result result("AttributeContainer"); AttributeContainer attributes; attributes.add_class(ObjectClass::PrivateKey); std::string label("test"); attributes.add_string(AttributeType::Label, label); std::vector bin(4); attributes.add_binary(AttributeType::Value, bin); attributes.add_bool(AttributeType::Sensitive, true); attributes.add_numeric(AttributeType::ObjectId, 12); result.test_eq("Five elements in attribute container", attributes.count(), 5); return result; } #if defined(BOTAN_HAS_ASN1) Test::Result test_create_destroy_data_object() { Test::Result result("Object create/delete data object"); TestSession test_session(true); std::string value_string("test data"); secure_vector value(value_string.begin(), value_string.end()); std::size_t id = 1337; std::string label = "Botan test data object"; std::string application = "Botan test application"; DataObjectProperties data_obj_props; data_obj_props.set_application(application); data_obj_props.set_label(label); data_obj_props.set_value(value); data_obj_props.set_token(true); data_obj_props.set_modifiable(true); data_obj_props.set_object_id(DER_Encoder().encode(id).get_contents_unlocked()); Object data_obj(test_session.session(), data_obj_props); result.test_success("Data object creation was successful"); data_obj.destroy(); result.test_success("Data object deletion was successful"); return result; } Test::Result test_get_set_attribute_values() { Test::Result result("Object get/set attributes"); TestSession test_session(true); // create object std::string value_string("test data"); secure_vector value(value_string.begin(), value_string.end()); std::size_t id = 1337; std::string label = "Botan test data object"; std::string application = "Botan test application"; DataObjectProperties data_obj_props; data_obj_props.set_application(application); data_obj_props.set_label(label); data_obj_props.set_value(value); data_obj_props.set_token(true); data_obj_props.set_modifiable(true); data_obj_props.set_object_id(DER_Encoder().encode(id).get_contents_unlocked()); Object data_obj(test_session.session(), data_obj_props); // get attribute secure_vector retrieved_label = data_obj.get_attribute_value(AttributeType::Label); std::string retrieved_label_string(retrieved_label.begin(), retrieved_label.end()); result.test_eq("label was set correctly", retrieved_label_string, label); // set attribute std::string new_label = "Botan test modified data object label"; secure_vector new_label_secvec(new_label.begin(), new_label.end()); data_obj.set_attribute_value(AttributeType::Label, new_label_secvec); // get and check attribute retrieved_label = data_obj.get_attribute_value(AttributeType::Label); retrieved_label_string = std::string(retrieved_label.begin(), retrieved_label.end()); result.test_eq("label was modified correctly", retrieved_label_string, new_label); data_obj.destroy(); return result; } Test::Result test_object_finder() { Test::Result result("ObjectFinder"); TestSession test_session(true); // create object std::string value_string("test data"); secure_vector value(value_string.begin(), value_string.end()); std::size_t id = 1337; std::string label = "Botan test data object"; std::string application = "Botan test application"; DataObjectProperties data_obj_props; data_obj_props.set_application(application); data_obj_props.set_label(label); data_obj_props.set_value(value); data_obj_props.set_token(true); data_obj_props.set_modifiable(true); data_obj_props.set_object_id(DER_Encoder().encode(id).get_contents_unlocked()); Object data_obj(test_session.session(), data_obj_props); // search created object AttributeContainer search_template; search_template.add_string(AttributeType::Label, label); ObjectFinder finder(test_session.session(), search_template.attributes()); auto search_result = finder.find(); result.test_eq("one object found", search_result.size(), 1); finder.finish(); Object obj_found(test_session.session(), search_result.at(0)); result.test_eq("found the object just created (same application)", obj_found.get_attribute_value(AttributeType::Application), data_obj.get_attribute_value(AttributeType::Application)); auto search_result2 = Object::search(test_session.session(), search_template.attributes()); result.test_eq("found the object just created (same label)", obj_found.get_attribute_value(AttributeType::Label), search_result2.at(0).get_attribute_value(AttributeType::Label)); data_obj.destroy(); return result; } Test::Result test_object_copy() { Test::Result result("Object copy"); TestSession test_session(true); // create object std::string value_string("test data"); secure_vector value(value_string.begin(), value_string.end()); std::size_t id = 1337; std::string label = "Botan test data object"; std::string application = "Botan test application"; DataObjectProperties data_obj_props; data_obj_props.set_application(application); data_obj_props.set_label(label); data_obj_props.set_value(value); data_obj_props.set_token(true); data_obj_props.set_modifiable(true); data_obj_props.set_object_id(DER_Encoder().encode(id).get_contents_unlocked()); Object data_obj(test_session.session(), data_obj_props); // copy created object AttributeContainer copy_attributes; copy_attributes.add_string(AttributeType::Label, "Botan test copied object"); ObjectHandle copied_obj_handle = data_obj.copy(copy_attributes); ObjectFinder searcher(test_session.session(), copy_attributes.attributes()); auto search_result = searcher.find(); result.test_eq("one object found", search_result.size(), 1); data_obj.destroy(); Object copied_obj(test_session.session(), copied_obj_handle); copied_obj.destroy(); return result; } #endif class Object_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_attribute_container #if defined(BOTAN_HAS_ASN1) , test_create_destroy_data_object , test_get_set_attribute_values , test_object_finder , test_object_copy #endif }; return run_pkcs11_tests("Object", fns); } }; BOTAN_REGISTER_TEST("pkcs11-object", Object_Tests); /***************************** PKCS11 RSA *****************************/ #if defined(BOTAN_HAS_RSA) Test::Result test_rsa_privkey_import() { Test::Result result("PKCS11 import RSA private key"); TestSession test_session(true); // create private key RSA_PrivateKey priv_key(Test::rng(), 2048); result.confirm("Key self test OK", priv_key.check_key(Test::rng(), true)); // import to card RSA_PrivateKeyImportProperties props(priv_key.get_n(), priv_key.get_d()); props.set_pub_exponent(priv_key.get_e()); props.set_prime_1(priv_key.get_p()); props.set_prime_2(priv_key.get_q()); props.set_coefficient(priv_key.get_c()); props.set_exponent_1(priv_key.get_d1()); props.set_exponent_2(priv_key.get_d2()); props.set_token(true); props.set_private(true); props.set_decrypt(true); props.set_sign(true); PKCS11_RSA_PrivateKey pk(test_session.session(), props); result.test_success("RSA private key import was successful"); result.confirm("PK self test OK", pk.check_key(Test::rng(), true)); pk.destroy(); return result; } Test::Result test_rsa_privkey_export() { Test::Result result("PKCS11 export RSA private key"); TestSession test_session(true); // create private key RSA_PrivateKey priv_key(Test::rng(), 2048); // import to card RSA_PrivateKeyImportProperties props(priv_key.get_n(), priv_key.get_d()); props.set_pub_exponent(priv_key.get_e()); props.set_prime_1(priv_key.get_p()); props.set_prime_2(priv_key.get_q()); props.set_coefficient(priv_key.get_c()); props.set_exponent_1(priv_key.get_d1()); props.set_exponent_2(priv_key.get_d2()); props.set_token(true); props.set_private(true); props.set_decrypt(true); props.set_sign(true); props.set_extractable(true); props.set_sensitive(false); PKCS11_RSA_PrivateKey pk(test_session.session(), props); result.confirm("Check PK11 key", pk.check_key(Test::rng(), true)); RSA_PrivateKey exported = pk.export_key(); result.test_success("RSA private key export was successful"); result.confirm("Check exported key", exported.check_key(Test::rng(), true)); pk.destroy(); return result; } Test::Result test_rsa_pubkey_import() { Test::Result result("PKCS11 import RSA public key"); TestSession test_session(true); // create public key from private key RSA_PrivateKey priv_key(Test::rng(), 2048); // import to card RSA_PublicKeyImportProperties props(priv_key.get_n(), priv_key.get_e()); props.set_token(true); props.set_encrypt(true); props.set_private(false); PKCS11_RSA_PublicKey pk(test_session.session(), props); result.test_success("RSA public key import was successful"); result.confirm("Check PK11 key", pk.check_key(Test::rng(), true)); pk.destroy(); return result; } Test::Result test_rsa_generate_private_key() { Test::Result result("PKCS11 generate RSA private key"); TestSession test_session(true); RSA_PrivateKeyGenerationProperties props; props.set_token(true); props.set_private(true); props.set_sign(true); props.set_decrypt(true); PKCS11_RSA_PrivateKey pk(test_session.session(), 2048, props); result.test_success("RSA private key generation was successful"); pk.destroy(); return result; } PKCS11_RSA_KeyPair generate_rsa_keypair(const TestSession& test_session) { RSA_PublicKeyGenerationProperties pub_props(2048UL); pub_props.set_pub_exponent(); pub_props.set_label("BOTAN_TEST_RSA_PUB_KEY"); pub_props.set_token(true); pub_props.set_encrypt(true); pub_props.set_verify(true); pub_props.set_private(false); RSA_PrivateKeyGenerationProperties priv_props; priv_props.set_label("BOTAN_TEST_RSA_PRIV_KEY"); priv_props.set_token(true); priv_props.set_private(true); priv_props.set_sign(true); priv_props.set_decrypt(true); return PKCS11::generate_rsa_keypair(test_session.session(), pub_props, priv_props); } Test::Result test_rsa_generate_key_pair() { Test::Result result("PKCS11 generate RSA key pair"); TestSession test_session(true); PKCS11_RSA_KeyPair keypair = generate_rsa_keypair(test_session); result.test_success("RSA key pair generation was successful"); keypair.first.destroy(); keypair.second.destroy(); return result; } Test::Result test_rsa_encrypt_decrypt() { Test::Result result("PKCS11 RSA encrypt decrypt"); TestSession test_session(true); // generate key pair PKCS11_RSA_KeyPair keypair = generate_rsa_keypair(test_session); auto encrypt_and_decrypt = [&keypair, &result](const std::vector& plaintext, const std::string& padding) { Botan::PK_Encryptor_EME encryptor(keypair.first, Test::rng(), padding); auto encrypted = encryptor.encrypt(plaintext, Test::rng()); Botan::PK_Decryptor_EME decryptor(keypair.second, Test::rng(), padding); auto decrypted = decryptor.decrypt(encrypted); // some token / middlewares do not remove the padding bytes decrypted.resize(plaintext.size()); result.test_eq("RSA PKCS11 encrypt and decrypt: " + padding, decrypted, plaintext); }; std::vector plaintext(256); std::iota(std::begin(plaintext), std::end(plaintext), static_cast(0)); encrypt_and_decrypt(plaintext, "Raw"); plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x00 }; encrypt_and_decrypt(plaintext, "EME-PKCS1-v1_5"); encrypt_and_decrypt(plaintext, "OAEP(SHA-1)"); keypair.first.destroy(); keypair.second.destroy(); return result; } Test::Result test_rsa_sign_verify() { Test::Result result("PKCS11 RSA sign and verify"); TestSession test_session(true); // generate key pair PKCS11_RSA_KeyPair keypair = generate_rsa_keypair(test_session); std::vector plaintext(256); std::iota(std::begin(plaintext), std::end(plaintext), static_cast(0)); auto sign_and_verify = [&keypair, &plaintext, &result](std::string const& emsa, bool multipart) { Botan::PK_Signer signer(keypair.second, Test::rng(), emsa, Botan::IEEE_1363); std::vector signature; if(multipart) { signer.update(plaintext.data(), plaintext.size() / 2); signature = signer.sign_message(plaintext.data() + plaintext.size() / 2, plaintext.size() / 2, Test::rng()); } else { signature = signer.sign_message(plaintext, Test::rng()); } Botan::PK_Verifier verifier(keypair.first, emsa, Botan::IEEE_1363); bool rsa_ok = false; if(multipart) { verifier.update(plaintext.data(), plaintext.size() / 2); rsa_ok = verifier.verify_message(plaintext.data() + plaintext.size() / 2, plaintext.size() / 2, signature.data(), signature.size()); } else { rsa_ok = verifier.verify_message(plaintext, signature); } result.test_eq("RSA PKCS11 sign and verify: " + emsa, rsa_ok, true); }; // single-part sign sign_and_verify("Raw", false); sign_and_verify("EMSA3(SHA-256)", false); sign_and_verify("EMSA4(SHA-256)", false); // multi-part sign sign_and_verify("EMSA3(SHA-256)", true); sign_and_verify("EMSA4(SHA-256)", true); keypair.first.destroy(); keypair.second.destroy(); return result; } class PKCS11_RSA_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_rsa_privkey_import, test_rsa_pubkey_import, test_rsa_privkey_export, test_rsa_generate_private_key, test_rsa_generate_key_pair, test_rsa_encrypt_decrypt, test_rsa_sign_verify }; return run_pkcs11_tests("PKCS11 RSA", fns); } }; BOTAN_REGISTER_TEST("pkcs11-rsa", PKCS11_RSA_Tests); #endif /***************************** PKCS11 ECDSA *****************************/ #if defined(BOTAN_HAS_ECDSA) Test::Result test_ecdsa_privkey_import() { Test::Result result("PKCS11 import ECDSA private key"); TestSession test_session(true); // create ecdsa private key ECDSA_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); result.confirm("Key self test OK", priv_key.check_key(Test::rng(), true)); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PrivateKeyImportProperties props(priv_key.DER_domain(), priv_key.private_value()); props.set_token(true); props.set_private(true); props.set_sign(true); // label std::string label = "Botan test ecdsa key"; props.set_label(label); PKCS11_ECDSA_PrivateKey pk(test_session.session(), props); result.test_success("ECDSA private key import was successful"); pk.set_public_point(priv_key.public_point()); result.confirm("P11 key self test OK", pk.check_key(Test::rng(), false)); pk.destroy(); return result; } Test::Result test_ecdsa_privkey_export() { Test::Result result("PKCS11 export ECDSA private key"); TestSession test_session(true); // create private key ECDSA_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); result.confirm("Check ECDSA key", priv_key.check_key(Test::rng(), true)); // import to card EC_PrivateKeyImportProperties props(priv_key.DER_domain(), priv_key.private_value()); props.set_token(true); props.set_private(true); props.set_sign(true); props.set_extractable(true); // label std::string label = "Botan test ecdsa key"; props.set_label(label); PKCS11_ECDSA_PrivateKey pk(test_session.session(), props); pk.set_public_point(priv_key.public_point()); result.confirm("Check PK11 key", pk.check_key(Test::rng(), false)); ECDSA_PrivateKey exported = pk.export_key(); result.test_success("ECDSA private key export was successful"); result.confirm("Check exported key valid", exported.check_key(Test::rng(), true)); result.test_eq("Check exported key contents", exported.private_key_bits(), priv_key.private_key_bits()); pk.destroy(); return result; } Test::Result test_ecdsa_pubkey_import() { Test::Result result("PKCS11 import ECDSA public key"); TestSession test_session(true); // create ecdsa private key ECDSA_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PublicKeyImportProperties props(priv_key.DER_domain(), DER_Encoder().encode(EC2OSP(priv_key.public_point(), PointGFp::UNCOMPRESSED), OCTET_STRING).get_contents_unlocked()); props.set_token(true); props.set_verify(true); props.set_private(false); // label std::string label = "Botan test ecdsa pub key"; props.set_label(label); PKCS11_ECDSA_PublicKey pk(test_session.session(), props); result.test_success("ECDSA public key import was successful"); pk.destroy(); return result; } Test::Result test_ecdsa_pubkey_export() { Test::Result result("PKCS11 export ECDSA public key"); TestSession test_session(true); // create public key from private key ECDSA_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PublicKeyImportProperties props(priv_key.DER_domain(), DER_Encoder().encode(EC2OSP(priv_key.public_point(), PointGFp::UNCOMPRESSED), OCTET_STRING).get_contents_unlocked()); props.set_token(true); props.set_verify(true); props.set_private(false); // label std::string label = "Botan test ecdsa pub key"; props.set_label(label); PKCS11_ECDSA_PublicKey pk(test_session.session(), props); ECDSA_PublicKey exported = pk.export_key(); result.test_success("ECDSA public key export was successful"); pk.destroy(); return result; } Test::Result test_ecdsa_generate_private_key() { Test::Result result("PKCS11 generate ECDSA private key"); TestSession test_session(true); EC_PrivateKeyGenerationProperties props; props.set_token(true); props.set_private(true); props.set_sign(true); PKCS11_ECDSA_PrivateKey pk(test_session.session(), EC_Group("secp256r1").DER_encode(EC_Group_Encoding::EC_DOMPAR_ENC_OID), props); result.test_success("ECDSA private key generation was successful"); pk.destroy(); return result; } PKCS11_ECDSA_KeyPair generate_ecdsa_keypair(const TestSession& test_session) { EC_PublicKeyGenerationProperties pub_props(EC_Group("secp256r1").DER_encode( EC_Group_Encoding::EC_DOMPAR_ENC_OID)); pub_props.set_label("BOTAN_TEST_ECDSA_PUB_KEY"); pub_props.set_token(true); pub_props.set_verify(true); pub_props.set_private(false); pub_props.set_modifiable(true); EC_PrivateKeyGenerationProperties priv_props; priv_props.set_label("BOTAN_TEST_ECDSA_PRIV_KEY"); priv_props.set_token(true); priv_props.set_private(true); priv_props.set_sensitive(true); priv_props.set_extractable(false); priv_props.set_sign(true); priv_props.set_modifiable(true); return PKCS11::generate_ecdsa_keypair(test_session.session(), pub_props, priv_props); } Test::Result test_ecdsa_generate_keypair() { Test::Result result("PKCS11 generate ECDSA key pair"); TestSession test_session(true); PKCS11_ECDSA_KeyPair keypair = generate_ecdsa_keypair(test_session); result.test_success("ECDSA key pair generation was successful"); keypair.first.destroy(); keypair.second.destroy(); return result; } Test::Result test_ecdsa_sign_verify() { Test::Result result("PKCS11 ECDSA sign and verify"); TestSession test_session(true); // generate key pair PKCS11_ECDSA_KeyPair keypair = generate_ecdsa_keypair(test_session); std::vector plaintext(20, 0x01); auto sign_and_verify = [ &keypair, &plaintext, &result ](const std::string& emsa) { Botan::PK_Signer signer(keypair.second, Test::rng(), emsa, Botan::IEEE_1363); auto signature = signer.sign_message(plaintext, Test::rng()); Botan::PK_Verifier token_verifier(keypair.first, emsa, Botan::IEEE_1363); bool ecdsa_ok = token_verifier.verify_message(plaintext, signature); result.test_eq("ECDSA PKCS11 sign and verify: " + emsa, ecdsa_ok, true); // test against software implementation if available #if defined (BOTAN_HAS_EMSA_RAW) Botan::PK_Verifier soft_verifier(keypair.first, emsa, Botan::IEEE_1363); bool soft_ecdsa_ok = soft_verifier.verify_message(plaintext, signature); result.test_eq("ECDSA PKCS11 verify (in software): " + emsa, soft_ecdsa_ok, true); #endif }; sign_and_verify("Raw"); // SoftHSMv2 until now only supports "Raw" keypair.first.destroy(); keypair.second.destroy(); return result; } class PKCS11_ECDSA_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_ecdsa_privkey_import, test_ecdsa_privkey_export, test_ecdsa_pubkey_import, test_ecdsa_pubkey_export, test_ecdsa_generate_private_key, test_ecdsa_generate_keypair, test_ecdsa_sign_verify }; return run_pkcs11_tests("PKCS11 ECDSA", fns); } }; BOTAN_REGISTER_TEST("pkcs11-ecdsa", PKCS11_ECDSA_Tests); #endif #if defined(BOTAN_HAS_ECDH) /***************************** PKCS11 ECDH *****************************/ Test::Result test_ecdh_privkey_import() { Test::Result result("PKCS11 import ECDH private key"); TestSession test_session(true); // create ecdh private key ECDH_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PrivateKeyImportProperties props(priv_key.DER_domain(), priv_key.private_value()); props.set_token(true); props.set_private(true); props.set_derive(true); // label std::string label = "Botan test ecdh key"; props.set_label(label); PKCS11_ECDH_PrivateKey pk(test_session.session(), props); result.test_success("ECDH private key import was successful"); pk.destroy(); return result; } Test::Result test_ecdh_privkey_export() { Test::Result result("PKCS11 export ECDH private key"); TestSession test_session(true); // create private key ECDH_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PrivateKeyImportProperties props(priv_key.DER_domain(), priv_key.private_value()); props.set_token(true); props.set_private(true); props.set_derive(true); props.set_extractable(true); // label std::string label = "Botan test ecdh key"; props.set_label(label); PKCS11_ECDH_PrivateKey pk(test_session.session(), props); ECDH_PrivateKey exported = pk.export_key(); result.test_success("ECDH private key export was successful"); pk.destroy(); return result; } Test::Result test_ecdh_pubkey_import() { Test::Result result("PKCS11 import ECDH public key"); TestSession test_session(true); // create ECDH private key ECDH_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PublicKeyImportProperties props(priv_key.DER_domain(), DER_Encoder().encode(EC2OSP(priv_key.public_point(), PointGFp::UNCOMPRESSED), OCTET_STRING).get_contents_unlocked()); props.set_token(true); props.set_private(false); props.set_derive(true); // label std::string label = "Botan test ECDH pub key"; props.set_label(label); PKCS11_ECDH_PublicKey pk(test_session.session(), props); result.test_success("ECDH public key import was successful"); pk.destroy(); return result; } Test::Result test_ecdh_pubkey_export() { Test::Result result("PKCS11 export ECDH public key"); TestSession test_session(true); // create public key from private key ECDH_PrivateKey priv_key(Test::rng(), EC_Group("secp256r1")); priv_key.set_parameter_encoding(EC_Group_Encoding::EC_DOMPAR_ENC_OID); // import to card EC_PublicKeyImportProperties props(priv_key.DER_domain(), DER_Encoder().encode(EC2OSP(priv_key.public_point(), PointGFp::UNCOMPRESSED), OCTET_STRING).get_contents_unlocked()); props.set_token(true); props.set_derive(true); props.set_private(false); // label std::string label = "Botan test ECDH pub key"; props.set_label(label); PKCS11_ECDH_PublicKey pk(test_session.session(), props); ECDH_PublicKey exported = pk.export_key(); result.test_success("ECDH public key export was successful"); pk.destroy(); return result; } Test::Result test_ecdh_generate_private_key() { Test::Result result("PKCS11 generate ECDH private key"); TestSession test_session(true); EC_PrivateKeyGenerationProperties props; props.set_token(true); props.set_private(true); props.set_derive(true); PKCS11_ECDH_PrivateKey pk(test_session.session(), EC_Group("secp256r1").DER_encode(EC_Group_Encoding::EC_DOMPAR_ENC_OID), props); result.test_success("ECDH private key generation was successful"); pk.destroy(); return result; } PKCS11_ECDH_KeyPair generate_ecdh_keypair(const TestSession& test_session, const std::string& label) { EC_PublicKeyGenerationProperties pub_props(EC_Group("secp256r1").DER_encode( EC_Group_Encoding::EC_DOMPAR_ENC_OID)); pub_props.set_label(label + "_PUB_KEY"); pub_props.set_token(true); pub_props.set_derive(true); pub_props.set_private(false); pub_props.set_modifiable(true); EC_PrivateKeyGenerationProperties priv_props; priv_props.set_label(label + "_PRIV_KEY"); priv_props.set_token(true); priv_props.set_private(true); priv_props.set_sensitive(true); priv_props.set_extractable(false); priv_props.set_derive(true); priv_props.set_modifiable(true); return PKCS11::generate_ecdh_keypair(test_session.session(), pub_props, priv_props); } Test::Result test_ecdh_generate_keypair() { Test::Result result("PKCS11 generate ECDH key pair"); TestSession test_session(true); PKCS11_ECDH_KeyPair keypair = generate_ecdh_keypair(test_session, "Botan test ECDH key1"); result.test_success("ECDH key pair generation was successful"); keypair.first.destroy(); keypair.second.destroy(); return result; } Test::Result test_ecdh_derive() { Test::Result result("PKCS11 ECDH derive"); TestSession test_session(true); PKCS11_ECDH_KeyPair keypair = generate_ecdh_keypair(test_session, "Botan test ECDH key1"); PKCS11_ECDH_KeyPair keypair2 = generate_ecdh_keypair(test_session, "Botan test ECDH key2"); // SoftHSMv2 only supports CKD_NULL KDF at the moment Botan::PK_Key_Agreement ka(keypair.second, Test::rng(), "Raw"); Botan::PK_Key_Agreement kb(keypair2.second, Test::rng(), "Raw"); Botan::SymmetricKey alice_key = ka.derive_key(32, unlock(EC2OSP(keypair2.first.public_point(), PointGFp::UNCOMPRESSED))); Botan::SymmetricKey bob_key = kb.derive_key(32, unlock(EC2OSP(keypair.first.public_point(), PointGFp::UNCOMPRESSED))); bool eq = alice_key == bob_key; result.test_eq("same secret key derived", eq, true); keypair.first.destroy(); keypair.second.destroy(); keypair2.first.destroy(); keypair2.second.destroy(); return result; } class PKCS11_ECDH_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_ecdh_privkey_import, test_ecdh_privkey_export, test_ecdh_pubkey_import, test_ecdh_pubkey_export, test_ecdh_generate_private_key, test_ecdh_generate_keypair, test_ecdh_derive }; return run_pkcs11_tests("PKCS11 ECDH", fns); } }; BOTAN_REGISTER_TEST("pkcs11-ecdh", PKCS11_ECDH_Tests); #endif /***************************** PKCS11 RNG *****************************/ Test::Result test_rng_generate_random() { Test::Result result("PKCS11 RNG generate random"); TestSession test_session(true); PKCS11_RNG rng(test_session.session()); result.confirm("RNG already seeded", rng.is_seeded()); std::vector random(20); rng.randomize(random.data(), random.size()); result.test_ne("random data generated", random, std::vector(20)); return result; } Test::Result test_rng_add_entropy() { Test::Result result("PKCS11 RNG add entropy random"); TestSession test_session(true); PKCS11_RNG rng(test_session.session()); result.confirm("RNG already seeded", rng.is_seeded()); rng.clear(); result.confirm("RNG ignores call to clear", rng.is_seeded()); result.test_eq("RNG ignores calls to reseed", rng.reseed(Botan::Entropy_Sources::global_sources(), 256, std::chrono::milliseconds(300)), 0); auto random = Test::rng().random_vec(20); rng.add_entropy(random.data(), random.size()); result.test_success("entropy added"); return result; } #if defined(BOTAN_HAS_HMAC_DRBG) && defined(BOTAN_HAS_SHA2_64) Test::Result test_pkcs11_hmac_drbg() { Test::Result result("PKCS11 HMAC_DRBG using PKCS11_RNG"); TestSession test_session(true); PKCS11_RNG p11_rng(test_session.session()); HMAC_DRBG drbg(MessageAuthenticationCode::create("HMAC(SHA-512)"), p11_rng); // result.test_success("HMAC_DRBG(HMAC(SHA512)) instantiated with PKCS11_RNG"); result.test_eq("HMAC_DRBG is not seeded yet.", drbg.is_seeded(), false); secure_vector rnd = drbg.random_vec(64); result.test_eq("HMAC_DRBG is seeded now", drbg.is_seeded(), true); std::string personalization_string = "Botan PKCS#11 Tests"; std::vector personalization_data(personalization_string.begin(), personalization_string.end()); drbg.add_entropy(personalization_data.data(), personalization_data.size()); auto rnd_vec = drbg.random_vec(256); result.test_ne("HMAC_DRBG generated a random vector", rnd_vec, std::vector(256)); return result; } #endif class PKCS11_RNG_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_rng_generate_random , test_rng_add_entropy #if defined(BOTAN_HAS_HMAC_DRBG )&& defined(BOTAN_HAS_SHA2_64) , test_pkcs11_hmac_drbg #endif }; return run_pkcs11_tests("PKCS11 RNG", fns); } }; BOTAN_REGISTER_TEST("pkcs11-rng", PKCS11_RNG_Tests); /***************************** PKCS11 token management *****************************/ Test::Result test_set_pin() { Test::Result result("PKCS11 set pin"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); PKCS11::set_pin(slot, SO_PIN_SECVEC, TEST_PIN_SECVEC); result.test_success("PIN set with SO_PIN to TEST_PIN"); PKCS11::set_pin(slot, SO_PIN_SECVEC, PIN_SECVEC); result.test_success("PIN changed back with SO_PIN"); return result; } Test::Result test_initialize() { Test::Result result("PKCS11 initialize token"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); PKCS11::initialize_token(slot, "Botan PKCS#11 tests", SO_PIN_SECVEC, PIN_SECVEC); result.test_success("token initialized"); return result; } Test::Result test_change_pin() { Test::Result result("PKCS11 change pin"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); PKCS11::change_pin(slot, PIN_SECVEC, TEST_PIN_SECVEC); result.test_success("PIN changed with PIN to TEST_PIN"); PKCS11::change_pin(slot, TEST_PIN_SECVEC, PIN_SECVEC); result.test_success("PIN changed back with TEST_PIN to PIN"); return result; } Test::Result test_change_so_pin() { Test::Result result("PKCS11 change so_pin"); Module module(Test::pkcs11_lib()); std::vector slot_vec = Slot::get_available_slots(module, true); Slot slot(module, slot_vec.at(0)); PKCS11::change_so_pin(slot, SO_PIN_SECVEC, TEST_SO_PIN_SECVEC); result.test_success("SO_PIN changed with SO_PIN to TEST_SO_PIN"); PKCS11::change_so_pin(slot, TEST_SO_PIN_SECVEC, SO_PIN_SECVEC); result.test_success("SO_PIN changed back with TEST_SO_PIN to SO_PIN"); return result; } class PKCS11_Token_Management_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_set_pin, test_initialize, test_change_pin, test_change_so_pin }; return run_pkcs11_tests("PKCS11 token management", fns); } }; BOTAN_REGISTER_TEST("pkcs11-manage", PKCS11_Token_Management_Tests); /***************************** PKCS11 token management *****************************/ #if defined(BOTAN_HAS_X509_CERTIFICATES) Test::Result test_x509_import() { Test::Result result("PKCS11 X509 cert import"); TestSession test_session(true); X509_Certificate root(Test::data_file("x509/nist/test01/end.crt")); X509_CertificateProperties props(DER_Encoder().encode(root.subject_dn()).get_contents_unlocked(), root.BER_encode()); props.set_label("Botan PKCS#11 test certificate"); props.set_private(false); props.set_token(true); PKCS11_X509_Certificate pkcs11_cert(test_session.session(), props); result.test_success("X509 certificate imported"); PKCS11_X509_Certificate pkcs11_cert2(test_session.session(), pkcs11_cert.handle()); result.test_eq("X509 certificate by handle", pkcs11_cert == pkcs11_cert2, true); pkcs11_cert.destroy(); return result; } class PKCS11_X509_Tests final : public PKCS11_Test { public: std::vector run() override { std::vector> fns = { test_x509_import }; return run_pkcs11_tests("PKCS11 X509", fns); } }; BOTAN_REGISTER_TEST("pkcs11-x509", PKCS11_X509_Tests); #endif #endif } } botan-2.4.0/src/tests/test_pkcs11_low_level.cpp000066400000000000000000000744621322470703100215020ustar00rootroot00000000000000/* * (C) 2016 Daniel Neus * (C) 2016 Philipp Weber * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_pkcs11.h" #include #include #include #include #include #include #if defined(BOTAN_HAS_PKCS11) #include #endif #if defined(BOTAN_HAS_DYNAMIC_LOADER) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_PKCS11) #if defined(BOTAN_HAS_DYNAMIC_LOADER) using namespace Botan; using namespace PKCS11; class RAII_LowLevel { public: RAII_LowLevel() : m_module(Test::pkcs11_lib()), m_func_list(nullptr), m_low_level(), m_session_handle(0), m_is_session_open(false), m_is_logged_in(false) { LowLevel::C_GetFunctionList(m_module, &m_func_list); m_low_level.reset(new LowLevel(m_func_list)); C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast(Flag::OsLockingOk), nullptr }; m_low_level->C_Initialize(&init_args); } ~RAII_LowLevel() BOTAN_NOEXCEPT { try { if(m_is_session_open) { if(m_is_logged_in) { m_low_level.get()->C_Logout(m_session_handle, nullptr); } m_low_level.get()->C_CloseSession(m_session_handle, nullptr); } m_low_level.get()->C_Finalize(nullptr, nullptr); } catch(...) { // ignore errors here } } std::vector get_slots(bool token_present) const { std::vector slots; m_low_level.get()->C_GetSlotList(token_present, slots); if(slots.empty()) { throw Exception("No slot with attached token found"); } return slots; } inline SessionHandle open_session(Flags session_flags) { std::vector slots = get_slots(true); m_low_level.get()->C_OpenSession(slots.at(0), session_flags, nullptr, nullptr, &m_session_handle); m_is_session_open = true; return m_session_handle; } inline SessionHandle open_rw_session_with_user_login() { Flags session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); SessionHandle handle = open_session(session_flags); login(UserType::User, PIN_SECVEC); return handle; } inline SessionHandle get_session_handle() const { if(!m_is_session_open) { throw Exception("no open session"); } return m_session_handle; } inline void close_session() { if(!m_is_session_open) { throw Exception("no open session"); } m_low_level.get()->C_CloseSession(m_session_handle); m_is_session_open = false; } inline void login(UserType user_type, const secure_vector& pin) { if(!m_is_session_open) { throw Exception("no open session"); } if(m_is_logged_in) { throw Exception("Already logged in"); } m_low_level.get()->C_Login(m_session_handle, user_type, pin); m_is_logged_in = true; } inline void logout() { if(!m_is_logged_in) { throw Exception("Not logged in"); } m_low_level.get()->C_Logout(m_session_handle); m_is_logged_in = false; } LowLevel* get() const { return m_low_level.get(); } private: Dynamically_Loaded_Library m_module; FunctionListPtr m_func_list; std::unique_ptr m_low_level; SessionHandle m_session_handle; bool m_is_session_open; bool m_is_logged_in; }; bool no_op(ReturnValue*) { return true; } using PKCS11_BoundTestFunction = std::function; // tests all 3 variants Test::Result test_function(const std::string& name, const PKCS11_BoundTestFunction& test_func, const std::string& revert_fn_name, const PKCS11_BoundTestFunction& revert_func, bool expect_failure, ReturnValue expected_return_value) { std::string test_name = revert_fn_name.empty() ? "PKCS 11 low level - " + name : "PKCS 11 low level - " + name + "/" + revert_fn_name; Test::Result result(test_name); // test throw variant if(expect_failure) { result.test_throws(name + " fails as expected", [ test_func ]() { test_func(ThrowException); }); } else { test_func(ThrowException); result.test_success(name + " did not throw and completed successfully"); if(!revert_fn_name.empty()) { revert_func(ThrowException); result.test_success(revert_fn_name + " did not throw and completed successfully"); } } // test bool return variant bool success = test_func(nullptr); result.test_eq(name, success, !expect_failure); if(success && !revert_fn_name.empty()) { success = revert_func(nullptr); result.test_eq(revert_fn_name, success, !expect_failure); } // test ReturnValue variant ReturnValue rv; success = test_func(&rv); result.test_eq(name, success, !expect_failure); if(!expect_failure) { result.test_rc_ok(name, static_cast< uint32_t >(rv)); } else { result.test_rc_fail(name, "return value should be: " + std::to_string(static_cast< uint32_t >(expected_return_value)), static_cast< uint32_t >(rv)); } if(success && !revert_fn_name.empty()) { success = revert_func(&rv); result.test_eq(revert_fn_name, success, !expect_failure); result.test_rc_ok(revert_fn_name, static_cast< uint32_t >(rv)); } return result; } Test::Result test_function(const std::string& name, const PKCS11_BoundTestFunction& test_func, bool expect_failure, ReturnValue expected_return_value) { return test_function(name, test_func, std::string(), no_op, expect_failure, expected_return_value); } Test::Result test_function(const std::string& name, const PKCS11_BoundTestFunction& test_func) { return test_function(name, test_func, std::string(), no_op, false, ReturnValue::OK); } Test::Result test_function(const std::string& name, const PKCS11_BoundTestFunction& test_func, const std::string& revert_fn_name, const PKCS11_BoundTestFunction& revert_func) { return test_function(name, test_func, revert_fn_name, revert_func, false, ReturnValue::OK); } Test::Result test_low_level_ctor() { Test::Result result("PKCS 11 low level - LowLevel ctor"); Dynamically_Loaded_Library pkcs11_module(Test::pkcs11_lib()); FunctionListPtr func_list(nullptr); LowLevel::C_GetFunctionList(pkcs11_module, &func_list); LowLevel p11_low_level(func_list); result.test_success("LowLevel ctor does complete for valid function list"); result.test_throws("LowLevel ctor fails for invalid function list pointer", []() { LowLevel p11_low_level2(nullptr); }); return result; } Test::Result test_c_get_function_list() { Dynamically_Loaded_Library pkcs11_module(Test::pkcs11_lib()); FunctionListPtr func_list = nullptr; return test_function("C_GetFunctionList", std::bind(&LowLevel::C_GetFunctionList, std::ref(pkcs11_module), &func_list, std::placeholders::_1)); } Test::Result test_initialize_finalize() { Dynamically_Loaded_Library pkcs11_module(Test::pkcs11_lib()); FunctionListPtr func_list = nullptr; LowLevel::C_GetFunctionList(pkcs11_module, &func_list); LowLevel p11_low_level(func_list); // setting Flag::OsLockingOk should be the normal use case C_InitializeArgs init_args = { nullptr, nullptr, nullptr, nullptr, static_cast(Flag::OsLockingOk), nullptr }; auto init_bind = std::bind(&LowLevel::C_Initialize, p11_low_level, &init_args, std::placeholders::_1); auto finalize_bind = std::bind(&LowLevel::C_Finalize, p11_low_level, nullptr, std::placeholders::_1); return test_function("C_Initialize", init_bind, "C_Finalize", finalize_bind); } Test::Result test_c_get_info() { RAII_LowLevel p11_low_level; Info info = {}; Test::Result result = test_function("C_GetInfo", std::bind(&LowLevel::C_GetInfo, *p11_low_level.get(), &info, std::placeholders::_1)); result.test_ne("C_GetInfo crypto major version", info.cryptokiVersion.major, 0); return result; } Test::Result test_c_get_slot_list() { RAII_LowLevel p11_low_level; std::vector slot_vec; // assumes at least one smartcard reader is attached bool token_present = false; auto binder = std::bind(static_cast< bool (LowLevel::*)(bool, std::vector&, ReturnValue*) const> (&LowLevel::C_GetSlotList), *p11_low_level.get(), std::ref(token_present), std::ref(slot_vec), std::placeholders::_1); Test::Result result = test_function("C_GetSlotList", binder); result.test_ne("C_GetSlotList number of slots without attached token > 0", slot_vec.size(), 0); // assumes at least one smartcard reader with connected smartcard is attached slot_vec.clear(); token_present = true; result.merge(test_function("C_GetSlotList", binder)); result.test_ne("C_GetSlotList number of slots with attached token > 0", slot_vec.size(), 0); return result; } Test::Result test_c_get_slot_info() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(false); SlotInfo slot_info = {}; Test::Result result = test_function("C_GetSlotInfo", std::bind(&LowLevel::C_GetSlotInfo, *p11_low_level.get(), slot_vec.at(0), &slot_info, std::placeholders::_1)); std::string slot_desc(reinterpret_cast< char* >(slot_info.slotDescription)); result.test_ne("C_GetSlotInfo returns non empty description", slot_desc.size(), 0); return result; } Test::Result test_c_get_token_info() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); TokenInfo token_info = {}; Test::Result result = test_function("C_GetTokenInfo", std::bind(&LowLevel::C_GetTokenInfo, *p11_low_level.get(), slot_vec.at(0), &token_info, std::placeholders::_1)); std::string serial(reinterpret_cast< char* >(token_info.serialNumber)); result.test_ne("C_GetTokenInfo returns non empty serial number", serial.size(), 0); return result; } Test::Result test_c_wait_for_slot_event() { RAII_LowLevel p11_low_level; Flags flags = PKCS11::flags(Flag::DontBlock); SlotId slot_id = 0; return test_function("C_WaitForSlotEvent", std::bind(&LowLevel::C_WaitForSlotEvent, *p11_low_level.get(), flags, &slot_id, nullptr, std::placeholders::_1), true, ReturnValue::NoEvent); } Test::Result test_c_get_mechanism_list() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); std::vector mechanisms; auto binder = std::bind(static_cast< bool (LowLevel::*)(SlotId, std::vector&, ReturnValue*) const> (&LowLevel::C_GetMechanismList), *p11_low_level.get(), slot_vec.at(0), std::ref(mechanisms), std::placeholders::_1); Test::Result result = test_function("C_GetMechanismList", binder); result.confirm("C_GetMechanismList returns non empty mechanisms list", !mechanisms.empty()); return result; } Test::Result test_c_get_mechanism_info() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); std::vector mechanisms; p11_low_level.get()->C_GetMechanismList(slot_vec.at(0), mechanisms); MechanismInfo mechanism_info = {}; return test_function("C_GetMechanismInfo", std::bind(&LowLevel::C_GetMechanismInfo, *p11_low_level.get(), slot_vec.at(0), mechanisms.at(0), &mechanism_info, std::placeholders::_1)); } Test::Result test_c_init_token() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); const std::string label = "Botan PKCS#11 tests"; auto sec_vec_binder = std::bind( static_cast< bool (LowLevel::*)(SlotId, const secure_vector&, const std::string&, ReturnValue*) const> (&LowLevel::C_InitToken>), *p11_low_level.get(), slot_vec.at(0), std::ref(SO_PIN_SECVEC), std::ref(label), std::placeholders::_1); return test_function("C_InitToken", sec_vec_binder); } Test::Result test_open_close_session() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); // public read only session Flags flags = PKCS11::flags(Flag::SerialSession); SessionHandle session_handle = 0; auto open_session_bind = std::bind(&LowLevel::C_OpenSession, *p11_low_level.get(), slot_vec.at(0), std::ref(flags), nullptr, nullptr, &session_handle, std::placeholders::_1); auto close_session_bind = std::bind(&LowLevel::C_CloseSession, *p11_low_level.get(), std::ref(session_handle), std::placeholders::_1); Test::Result result = test_function("C_OpenSession", open_session_bind, "C_CloseSession", close_session_bind); // public read write session flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); result.merge(test_function("C_OpenSession", open_session_bind, "C_CloseSession", close_session_bind)); return result; } Test::Result test_c_close_all_sessions() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); auto open_two_sessions = [ &slot_vec, &p11_low_level ]() -> void { // public read only session Flags flags = PKCS11::flags(Flag::SerialSession); SessionHandle first_session_handle = 0, second_session_handle = 0; p11_low_level.get()->C_OpenSession(slot_vec.at(0), flags, nullptr, nullptr, &first_session_handle); flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); p11_low_level.get()->C_OpenSession(slot_vec.at(0), flags, nullptr, nullptr, &second_session_handle); }; open_two_sessions(); Test::Result result("PKCS 11 low level - C_CloseAllSessions"); // test throw variant p11_low_level.get()->C_CloseAllSessions(slot_vec.at(0)); result.test_success("C_CloseAllSessions does not throw"); // test bool return variant open_two_sessions(); bool success = p11_low_level.get()->C_CloseAllSessions(slot_vec.at(0), nullptr); result.test_eq("C_CloseAllSessions", success, true); // test ReturnValue variant open_two_sessions(); ReturnValue rv = static_cast< ReturnValue >(-1); success = p11_low_level.get()->C_CloseAllSessions(slot_vec.at(0), &rv); result.test_eq("C_CloseAllSessions", success, true); result.test_rc_ok("C_CloseAllSessions", static_cast< uint32_t >(rv)); return result; } Test::Result test_c_get_session_info() { RAII_LowLevel p11_low_level; std::vector slot_vec = p11_low_level.get_slots(true); // public read only session Flags flags = PKCS11::flags(Flag::SerialSession); SessionHandle session_handle = p11_low_level.open_session(flags); SessionInfo session_info = {}; Test::Result result = test_function("C_GetSessionInfo", std::bind(&LowLevel::C_GetSessionInfo, *p11_low_level.get(), session_handle, &session_info, std::placeholders::_1)); result.confirm("C_GetSessionInfo returns same slot id as during call to C_OpenSession", session_info.slotID == slot_vec.at(0)); result.confirm("C_GetSessionInfo returns same flags as during call to C_OpenSession", session_info.flags == flags); result.confirm("C_GetSessionInfo returns public read only session state", session_info.state == static_cast(SessionState::RoPublicSession)); return result; } Test::Result login_logout_helper(const RAII_LowLevel& p11_low_level, SessionHandle handle, UserType user_type, const std::string& pin) { secure_vector pin_as_sec_vec(pin.begin(), pin.end()); auto login_secvec_binder = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, UserType, const secure_vector&, ReturnValue*) const> (&LowLevel::C_Login>), *p11_low_level.get(), handle, user_type, std::ref(pin_as_sec_vec), std::placeholders::_1); auto logout_binder = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, ReturnValue*) const> (&LowLevel::C_Logout), *p11_low_level.get(), handle, std::placeholders::_1); return test_function("C_Login", login_secvec_binder, "C_Logout", logout_binder); } Test::Result test_c_login_logout_security_officier() { RAII_LowLevel p11_low_level; // can only login to R/W session Flags session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); SessionHandle session_handle = p11_low_level.open_session(session_flags); return login_logout_helper(p11_low_level, session_handle, UserType::SO, SO_PIN); } Test::Result test_c_login_logout_user() { RAII_LowLevel p11_low_level; // R/O session Flags session_flags = PKCS11::flags(Flag::SerialSession); SessionHandle session_handle = p11_low_level.open_session(session_flags); Test::Result result = login_logout_helper(p11_low_level, session_handle, UserType::User, PIN); p11_low_level.close_session(); // R/W session session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); session_handle = p11_low_level.open_session(session_flags); result.merge(login_logout_helper(p11_low_level, session_handle, UserType::User, PIN)); return result; } Test::Result test_c_init_pin() { RAII_LowLevel p11_low_level; // C_InitPIN can only be called in the "R/W SO Functions" state Flags session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); SessionHandle session_handle = p11_low_level.open_session(session_flags); p11_low_level.login(UserType::SO, SO_PIN_SECVEC); auto sec_vec_binder = std::bind( static_cast< bool (LowLevel::*)(SessionHandle, const secure_vector&, ReturnValue*) const> (&LowLevel::C_InitPIN>), *p11_low_level.get(), session_handle, std::ref(PIN_SECVEC), std::placeholders::_1); return test_function("C_InitPIN", sec_vec_binder); } Test::Result test_c_set_pin() { RAII_LowLevel p11_low_level; // C_SetPIN can only be called in the "R / W Public Session" state, "R / W SO Functions" state, or "R / W User Functions" state Flags session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); SessionHandle session_handle = p11_low_level.open_session(session_flags); // now we are in "R / W Public Session" state: this will change the pin of the user auto get_pin_bind = [ &session_handle, &p11_low_level ](const secure_vector& old_pin, const secure_vector& new_pin) -> PKCS11_BoundTestFunction { return std::bind(static_cast< bool (LowLevel::*)(SessionHandle, const secure_vector&, const secure_vector&, ReturnValue*) const> (&LowLevel::C_SetPIN>), *p11_low_level.get(), session_handle, old_pin, new_pin, std::placeholders::_1); }; const std::string test_pin("654321"); const auto test_pin_secvec = secure_vector(test_pin.begin(), test_pin.end()); PKCS11_BoundTestFunction set_pin_bind = get_pin_bind(PIN_SECVEC, test_pin_secvec); PKCS11_BoundTestFunction revert_pin_bind = get_pin_bind(test_pin_secvec, PIN_SECVEC); Test::Result result = test_function("C_SetPIN", set_pin_bind, "C_SetPIN", revert_pin_bind); // change pin in "R / W User Functions" state p11_low_level.login(UserType::User, PIN_SECVEC); result.merge(test_function("C_SetPIN", set_pin_bind, "C_SetPIN", revert_pin_bind)); p11_low_level.logout(); // change so_pin in "R / W SO Functions" state const std::string test_so_pin = "87654321"; secure_vector test_so_pin_secvec(test_so_pin.begin(), test_so_pin.end()); p11_low_level.login(UserType::SO, SO_PIN_SECVEC); PKCS11_BoundTestFunction set_so_pin_bind = get_pin_bind(SO_PIN_SECVEC, test_so_pin_secvec); PKCS11_BoundTestFunction revert_so_pin_bind = get_pin_bind(test_so_pin_secvec, SO_PIN_SECVEC); result.merge(test_function("C_SetPIN", set_so_pin_bind, "C_SetPIN", revert_so_pin_bind)); return result; } // Simple data object ObjectClass object_class = ObjectClass::Data; std::string label = "A data object"; std::string data = "Sample data"; Bbool btrue = True; std::array dtemplate = { { { static_cast(AttributeType::Class), &object_class, sizeof(object_class) }, { static_cast(AttributeType::Token), &btrue, sizeof(btrue) }, { static_cast(AttributeType::Label), const_cast< char* >(label.c_str()), label.size() }, { static_cast(AttributeType::Value), const_cast< char* >(data.c_str()), data.size() } } }; ObjectHandle create_simple_data_object(const RAII_LowLevel& p11_low_level) { ObjectHandle object_handle; p11_low_level.get()->C_CreateObject(p11_low_level.get_session_handle(), dtemplate.data(), dtemplate.size(), &object_handle); return object_handle; } Test::Result test_c_create_object_c_destroy_object() { RAII_LowLevel p11_low_level; SessionHandle session_handle = p11_low_level.open_rw_session_with_user_login(); ObjectHandle object_handle(0); auto create_bind = std::bind(&LowLevel::C_CreateObject, *p11_low_level.get(), session_handle, dtemplate.data(), dtemplate.size(), &object_handle, std::placeholders::_1); auto destroy_bind = std::bind(&LowLevel::C_DestroyObject, *p11_low_level.get(), session_handle, std::ref(object_handle), std::placeholders::_1); return test_function("C_CreateObject", create_bind, "C_DestroyObject", destroy_bind); } Test::Result test_c_get_object_size() { RAII_LowLevel p11_low_level; Flags session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); SessionHandle session_handle = p11_low_level.open_session(session_flags); p11_low_level.login(UserType::User, PIN_SECVEC); ObjectHandle object_handle = create_simple_data_object(p11_low_level); Ulong object_size = 0; auto bind = std::bind(&LowLevel::C_GetObjectSize, *p11_low_level.get(), session_handle, object_handle, &object_size, std::placeholders::_1); Test::Result result = test_function("C_GetObjectSize", bind); result.test_ne("Object size", object_size, 0); // cleanup p11_low_level.get()->C_DestroyObject(session_handle, object_handle); return result; } Test::Result test_c_get_attribute_value() { RAII_LowLevel p11_low_level; SessionHandle session_handle = p11_low_level.open_rw_session_with_user_login(); ObjectHandle object_handle = create_simple_data_object(p11_low_level); std::map < AttributeType, secure_vector> getter = { { AttributeType::Label, secure_vector() }, { AttributeType::Value, secure_vector() } }; auto bind = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, ObjectHandle, std::map>&, ReturnValue*) const> (&LowLevel::C_GetAttributeValue>), *p11_low_level.get(), session_handle, object_handle, std::ref(getter), std::placeholders::_1); Test::Result result = test_function("C_GetAttributeValue", bind); std::string _label(getter[ AttributeType::Label ].begin(), getter[ AttributeType::Label ].end()); std::string value(getter[ AttributeType::Value ].begin(), getter[ AttributeType::Value ].end()); result.test_eq("label", _label, "A data object"); result.test_eq("value", value, "Sample data"); // cleanup p11_low_level.get()->C_DestroyObject(session_handle, object_handle); return result; } std::map < AttributeType, std::vector> get_attribute_values(const RAII_LowLevel& p11_low_level, SessionHandle session_handle, ObjectHandle object_handle, const std::vector& attribute_types) { std::map < AttributeType, std::vector> received_attributes; for(const auto& type : attribute_types) { received_attributes.emplace(type, std::vector()); } p11_low_level.get()->C_GetAttributeValue(session_handle, object_handle, received_attributes); return received_attributes; } Test::Result test_c_set_attribute_value() { RAII_LowLevel p11_low_level; Flags session_flags = PKCS11::flags(Flag::SerialSession | Flag::RwSession); SessionHandle session_handle = p11_low_level.open_session(session_flags); p11_low_level.login(UserType::User, PIN_SECVEC); ObjectHandle object_handle = create_simple_data_object(p11_low_level); std::string new_label = "A modified data object"; std::map < AttributeType, secure_vector> new_attributes = { { AttributeType::Label, secure_vector(new_label.begin(), new_label.end()) } }; auto bind = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, ObjectHandle, std::map>&, ReturnValue*) const> (&LowLevel::C_SetAttributeValue>), *p11_low_level.get(), session_handle, object_handle, std::ref(new_attributes), std::placeholders::_1); Test::Result result = test_function("C_SetAttributeValue", bind); // get attributes and check if they are changed correctly std::vector types = { AttributeType::Label, AttributeType::Value }; auto received_attributes = get_attribute_values(p11_low_level, session_handle, object_handle, types); std::string retrieved_label(received_attributes[ AttributeType::Label ].begin(), received_attributes[ AttributeType::Label ].end()); result.test_eq("label", new_label, retrieved_label); // cleanup p11_low_level.get()->C_DestroyObject(session_handle, object_handle); return result; } Test::Result test_c_copy_object() { RAII_LowLevel p11_low_level; SessionHandle session_handle = p11_low_level.open_rw_session_with_user_login(); ObjectHandle object_handle = create_simple_data_object(p11_low_level); ObjectHandle copied_object_handle = 0; std::string copied_label = "A copied data object"; Attribute copy_attribute_values = { static_cast< CK_ATTRIBUTE_TYPE >(AttributeType::Label), const_cast< char* >(copied_label.c_str()), copied_label.size() }; auto binder = std::bind(&LowLevel::C_CopyObject, *p11_low_level.get(), session_handle, object_handle, ©_attribute_values, 1, &copied_object_handle, std::placeholders::_1); Test::Result result = test_function("C_CopyObject", binder); // get attributes and check if its copied correctly std::vector types = { AttributeType::Label, AttributeType::Value }; auto received_attributes = get_attribute_values(p11_low_level, session_handle, copied_object_handle, types); std::string retrieved_label(received_attributes[ AttributeType::Label ].begin(), received_attributes[ AttributeType::Label ].end()); result.test_eq("label", copied_label, retrieved_label); // cleanup p11_low_level.get()->C_DestroyObject(session_handle, object_handle); p11_low_level.get()->C_DestroyObject(session_handle, copied_object_handle); return result; } class LowLevelTests final : public Test { public: std::vector run() override { std::vector results; std::vector> fns = { test_c_get_function_list , test_low_level_ctor , test_initialize_finalize , test_c_get_info , test_c_get_slot_list , test_c_get_slot_info , test_c_get_token_info , test_c_wait_for_slot_event , test_c_get_mechanism_list , test_c_get_mechanism_info , test_open_close_session , test_c_close_all_sessions , test_c_get_session_info , test_c_init_token , test_c_login_logout_security_officier /* only possible if token is initialized */ , test_c_init_pin , test_c_login_logout_user /* only possible if token is initialized and user pin is set */ , test_c_set_pin , test_c_create_object_c_destroy_object , test_c_get_object_size , test_c_get_attribute_value , test_c_set_attribute_value , test_c_copy_object }; for(size_t i = 0; i != fns.size(); ++i) { try { results.push_back(fns[ i ]()); } catch(PKCS11_ReturnError& e) { results.push_back(Test::Result::Failure("PKCS11 low level test " + std::to_string(i), e.what())); if(e.get_return_value() == ReturnValue::PinIncorrect) { break; // Do not continue to not potentially lock the token } } catch(std::exception& e) { results.push_back(Test::Result::Failure("PKCS11 low level test " + std::to_string(i), e.what())); } } return results; } }; BOTAN_REGISTER_TEST("pkcs11-lowlevel", LowLevelTests); #endif #endif } } botan-2.4.0/src/tests/test_psk_db.cpp000066400000000000000000000206141322470703100175600ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_PSK_DB) #include #if defined(BOTAN_HAS_SQLITE3) #include #include #endif namespace Botan_Tests { namespace { class Test_Map_PSK_Db : public Botan::Encrypted_PSK_Database { public: Test_Map_PSK_Db(const Botan::secure_vector& master_key) : Botan::Encrypted_PSK_Database(master_key) {} void test_entry(Test::Result& result, const std::string& index, const std::string& value) { auto i = m_vals.find(index); if(i == m_vals.end()) { result.test_failure("Expected to find encrypted name " + index); } else { result.test_eq("Encrypted value", i->second, value); } } void kv_set(const std::string& index, const std::string& value) override { m_vals[index] = value; } std::string kv_get(const std::string& index) const override { auto i = m_vals.find(index); if(i == m_vals.end()) return ""; return i->second; } void kv_del(const std::string& index) override { auto i = m_vals.find(index); if(i != m_vals.end()) { m_vals.erase(i); } } std::set kv_get_all() const override { std::set names; for(auto kv : m_vals) { names.insert(kv.first); } return names; } private: std::map m_vals; }; } class PSK_DB_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_psk_db()); #if defined(BOTAN_HAS_SQLITE3) results.push_back(test_psk_sql_db()); #endif return results; } private: Test::Result test_psk_db() { Test::Result result("PSK_DB"); const Botan::secure_vector zeros(32); Test_Map_PSK_Db db(zeros); db.set_str("name", "value"); db.test_entry(result, "CUCJjJgWSa079ubutJQwlw==", "clYJSAf9CThuL96CP+rAfA=="); result.test_eq("DB read", db.get_str("name"), "value"); db.set_str("name", "value1"); db.test_entry(result, "CUCJjJgWSa079ubutJQwlw==", "7R8am3x/gLawOzMp5WwIJg=="); result.test_eq("DB read", db.get_str("name"), "value1"); db.set_str("name", "value"); db.test_entry(result, "CUCJjJgWSa079ubutJQwlw==", "clYJSAf9CThuL96CP+rAfA=="); result.test_eq("DB read", db.get_str("name"), "value"); db.set_str("name2", "value"); db.test_entry(result, "7CvsM7HDCZsV6VsFwWylNg==", "BqVQo4rdwOmf+ItCzEmjAg=="); result.test_eq("DB read", db.get_str("name2"), "value"); db.set_vec("name2", zeros); db.test_entry(result, "7CvsM7HDCZsV6VsFwWylNg==", "x+I1bUF/fJYPOTvKwOihEPWGR1XGzVuyRdsw4n5gpBRzNR7LjH7vjw=="); result.test_eq("DB read", db.get("name2"), zeros); // Test longer names db.set_str("leroy jeeeeeeeenkins", "chicken"); db.test_entry(result, "KyYo272vlSjClM2F0OZBMlRYjr33ZXv2jN1oY8OfCEs=", "tCl1qShSTsXi9tA5Kpo9vg=="); result.test_eq("DB read", db.get_str("leroy jeeeeeeeenkins"), "chicken"); std::set all_names = db.list_names(); result.test_eq("Expected number of names", all_names.size(), 3); result.test_eq("Have expected name", all_names.count("name"), 1); result.test_eq("Have expected name", all_names.count("name2"), 1); result.test_eq("Have expected name", all_names.count("leroy jeeeeeeeenkins"), 1); db.remove("name2"); all_names = db.list_names(); result.test_eq("Expected number of names", all_names.size(), 2); result.test_eq("Have expected name", all_names.count("name"), 1); result.test_eq("Have expected name", all_names.count("leroy jeeeeeeeenkins"), 1); result.test_throws("exception if get called on non-existent PSK", "Invalid argument Named PSK not located", [&]() { db.get("name2"); }); // test that redundant remove calls accepted db.remove("name2"); return result; } #if defined(BOTAN_HAS_SQLITE3) void test_entry(Test::Result& result, std::shared_ptr db, const std::string& table, const std::string& expected_name, const std::string& expected_value) { auto stmt = db->new_statement("select psk_value from " + table + " where psk_name='" + expected_name + "'"); bool got_it = stmt->step(); result.confirm("Had expected name", got_it); if(got_it) { result.test_eq("Had expected value", stmt->get_str(0), expected_value); } } Test::Result test_psk_sql_db() { Test::Result result("PSK_DB SQL"); const Botan::secure_vector zeros(32); const Botan::secure_vector not_zeros = Test::rng().random_vec(32); const std::string table_name = "bobby"; std::shared_ptr sqldb = std::make_shared(":memory:"); Botan::Encrypted_PSK_Database_SQL db(zeros, sqldb, table_name); db.set_str("name", "value"); test_entry(result, sqldb, table_name, "CUCJjJgWSa079ubutJQwlw==", "clYJSAf9CThuL96CP+rAfA=="); result.test_eq("DB read", db.get_str("name"), "value"); db.set_str("name", "value1"); test_entry(result, sqldb, table_name, "CUCJjJgWSa079ubutJQwlw==", "7R8am3x/gLawOzMp5WwIJg=="); result.test_eq("DB read", db.get_str("name"), "value1"); db.set_str("name", "value"); test_entry(result, sqldb, table_name, "CUCJjJgWSa079ubutJQwlw==", "clYJSAf9CThuL96CP+rAfA=="); result.test_eq("DB read", db.get_str("name"), "value"); db.set_str("name2", "value"); test_entry(result, sqldb, table_name, "7CvsM7HDCZsV6VsFwWylNg==", "BqVQo4rdwOmf+ItCzEmjAg=="); result.test_eq("DB read", db.get_str("name2"), "value"); db.set_vec("name2", zeros); test_entry(result, sqldb, table_name, "7CvsM7HDCZsV6VsFwWylNg==", "x+I1bUF/fJYPOTvKwOihEPWGR1XGzVuyRdsw4n5gpBRzNR7LjH7vjw=="); result.test_eq("DB read", db.get("name2"), zeros); // Test longer names db.set_str("leroy jeeeeeeeenkins", "chicken"); test_entry(result, sqldb, table_name, "KyYo272vlSjClM2F0OZBMlRYjr33ZXv2jN1oY8OfCEs=", "tCl1qShSTsXi9tA5Kpo9vg=="); result.test_eq("DB read", db.get_str("leroy jeeeeeeeenkins"), "chicken"); /* * Test that we can have another database in the same table with distinct key * without any problems. */ Botan::Encrypted_PSK_Database_SQL db2(not_zeros, sqldb, table_name); db2.set_str("name", "price&value"); result.test_eq("DB read", db2.get_str("name"), "price&value"); result.test_eq("DB2 size", db2.list_names().size(), 1); std::set all_names = db.list_names(); result.test_eq("Expected number of names", all_names.size(), 3); result.test_eq("Have expected name", all_names.count("name"), 1); result.test_eq("Have expected name", all_names.count("name2"), 1); result.test_eq("Have expected name", all_names.count("leroy jeeeeeeeenkins"), 1); db.remove("name2"); all_names = db.list_names(); result.test_eq("Expected number of names", all_names.size(), 2); result.test_eq("Have expected name", all_names.count("name"), 1); result.test_eq("Have expected name", all_names.count("leroy jeeeeeeeenkins"), 1); result.test_throws("exception if get called on non-existent PSK", "Invalid argument Named PSK not located", [&]() { db.get("name2"); }); // test that redundant remove calls accepted db.remove("name2"); return result; } #endif }; BOTAN_REGISTER_TEST("psk_db", PSK_DB_Tests); } #endif botan-2.4.0/src/tests/test_pubkey.cpp000066400000000000000000000474651322470703100176320ustar00rootroot00000000000000/* * (C) 2009,2015 Jack Lloyd * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include "test_pubkey.h" #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include "test_rng.h" #include #include #include #include #include #include namespace Botan_Tests { void check_invalid_signatures(Test::Result& result, Botan::PK_Verifier& verifier, const std::vector& message, const std::vector& signature) { const size_t tests_to_run = (Test::run_long_tests() ? 20 : 5); const std::vector zero_sig(signature.size()); result.test_eq("all zero signature invalid", verifier.verify_message(message, zero_sig), false); for(size_t i = 0; i < tests_to_run; ++i) { const std::vector bad_sig = Test::mutate_vec(signature); try { if(!result.test_eq("incorrect signature invalid", verifier.verify_message(message, bad_sig), false)) { result.test_note("Accepted invalid signature " + Botan::hex_encode(bad_sig)); } } catch(std::exception& e) { result.test_note("Accepted invalid signature " + Botan::hex_encode(bad_sig)); result.test_failure("Modified signature rejected with exception", e.what()); } } } void check_invalid_ciphertexts(Test::Result& result, Botan::PK_Decryptor& decryptor, const std::vector& plaintext, const std::vector& ciphertext) { const size_t tests_to_run = (Test::run_long_tests() ? 20 : 5); size_t ciphertext_accepted = 0, ciphertext_rejected = 0; for(size_t i = 0; i < tests_to_run; ++i) { const std::vector bad_ctext = Test::mutate_vec(ciphertext); try { const Botan::secure_vector decrypted = decryptor.decrypt(bad_ctext); ++ciphertext_accepted; if(!result.test_ne("incorrect ciphertext different", decrypted, plaintext)) { result.test_eq("used corrupted ciphertext", bad_ctext, ciphertext); } } catch(std::exception&) { ++ciphertext_rejected; } } result.test_note("Accepted " + std::to_string(ciphertext_accepted) + " invalid ciphertexts, rejected " + std::to_string(ciphertext_rejected)); } std::string PK_Test::choose_padding(const VarMap& vars, const std::string& pad_hdr) { if(pad_hdr != "") return pad_hdr; return get_opt_str(vars, "Padding", this->default_padding(vars)); } std::vector PK_Test::possible_providers(const std::string& /*params*/) { return Test::provider_filter({ "base", "bearssl", "openssl", "tpm" }); } Test::Result PK_Signature_Generation_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { const std::vector message = get_req_bin(vars, "Msg"); const std::vector signature = get_req_bin(vars, "Signature"); const std::string padding = choose_padding(vars, pad_hdr); Test::Result result(algo_name() + "/" + padding + " signature generation"); std::unique_ptr privkey; try { privkey = load_private_key(vars); } catch(Botan::Lookup_Error& e) { result.note_missing(e.what()); return result; } std::unique_ptr pubkey(Botan::X509::load_key(Botan::X509::BER_encode(*privkey))); std::vector> verifiers; for(auto const& verify_provider : possible_providers(algo_name())) { std::unique_ptr verifier; try { verifier.reset(new Botan::PK_Verifier(*pubkey, padding, Botan::IEEE_1363, verify_provider)); } catch(Botan::Lookup_Error&) { //result.test_note("Skipping verifying with " + verify_provider); continue; } result.test_eq("KAT signature valid", verifier->verify_message(message, signature), true); check_invalid_signatures(result, *verifier, message, signature); verifiers.push_back(std::move(verifier)); } for(auto const& sign_provider : possible_providers(algo_name())) { std::unique_ptr rng; if(vars.count("Nonce")) { rng.reset(test_rng(get_req_bin(vars, "Nonce"))); } std::unique_ptr signer; std::vector generated_signature; try { signer.reset(new Botan::PK_Signer(*privkey, Test::rng(), padding, Botan::IEEE_1363, sign_provider)); generated_signature = signer->sign_message(message, rng ? *rng : Test::rng()); } catch(Botan::Lookup_Error&) { //result.test_note("Skipping signing with " + sign_provider); continue; } if(sign_provider == "base") { result.test_eq("generated signature matches KAT", generated_signature, signature); } else if(generated_signature != signature) { for(std::unique_ptr& verifier : verifiers) { if(!result.test_eq("generated signature valid", verifier->verify_message(message, generated_signature), true)) { result.test_failure("generated signature", generated_signature); } } } } return result; } Test::Result PK_Signature_Verification_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { const std::vector message = get_req_bin(vars, "Msg"); const std::vector signature = get_req_bin(vars, "Signature"); const std::string padding = choose_padding(vars, pad_hdr); std::unique_ptr pubkey = load_public_key(vars); Test::Result result(algo_name() + "/" + padding + " signature verification"); for(auto const& verify_provider : possible_providers(algo_name())) { std::unique_ptr verifier; try { verifier.reset(new Botan::PK_Verifier(*pubkey, padding, Botan::IEEE_1363, verify_provider)); result.test_eq("correct signature valid", verifier->verify_message(message, signature), true); check_invalid_signatures(result, *verifier, message, signature); } catch(Botan::Lookup_Error&) { result.test_note("Skipping verifying with " + verify_provider); } } return result; } Test::Result PK_Signature_NonVerification_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { const std::string padding = choose_padding(vars, pad_hdr); const std::vector message = get_req_bin(vars, "Msg"); std::unique_ptr pubkey = load_public_key(vars); const std::vector invalid_signature = get_req_bin(vars, "InvalidSignature"); Test::Result result(algo_name() + "/" + padding + " verify invalid signature"); for(auto const& verify_provider : possible_providers(algo_name())) { std::unique_ptr verifier; try { verifier.reset(new Botan::PK_Verifier(*pubkey, padding, Botan::IEEE_1363, verify_provider)); result.test_eq("incorrect signature rejected", verifier->verify_message(message, invalid_signature), false); } catch(Botan::Lookup_Error&) { result.test_note("Skipping verifying with " + verify_provider); } } return result; } Test::Result PK_Encryption_Decryption_Test::run_one_test(const std::string& pad_hdr, const VarMap& vars) { const std::vector plaintext = get_req_bin(vars, "Msg"); const std::vector ciphertext = get_req_bin(vars, "Ciphertext"); const std::string padding = choose_padding(vars, pad_hdr); Test::Result result(algo_name() + (padding.empty() ? padding : "/" + padding) + " decryption"); std::unique_ptr privkey = load_private_key(vars); // instead slice the private key to work around elgamal test inputs //std::unique_ptr pubkey(Botan::X509::load_key(Botan::X509::BER_encode(*privkey))); Botan::Public_Key* pubkey = privkey.get(); std::vector> decryptors; for(auto const& dec_provider : possible_providers(algo_name())) { std::unique_ptr decryptor; try { decryptor.reset(new Botan::PK_Decryptor_EME(*privkey, Test::rng(), padding, dec_provider)); } catch(Botan::Lookup_Error&) { continue; } Botan::secure_vector decrypted; try { decrypted = decryptor->decrypt(ciphertext); } catch(Botan::Exception& e) { result.test_failure("Failed to decrypt KAT ciphertext", e.what()); } result.test_eq(dec_provider, "decryption of KAT", decrypted, plaintext); check_invalid_ciphertexts(result, *decryptor, plaintext, ciphertext); } for(auto const& enc_provider : possible_providers(algo_name())) { std::unique_ptr encryptor; try { encryptor.reset(new Botan::PK_Encryptor_EME(*pubkey, Test::rng(), padding, enc_provider)); } catch(Botan::Lookup_Error&) { continue; } std::unique_ptr kat_rng; if(vars.count("Nonce")) { kat_rng.reset(test_rng(get_req_bin(vars, "Nonce"))); } const std::vector generated_ciphertext = encryptor->encrypt(plaintext, kat_rng ? *kat_rng : Test::rng()); if(enc_provider == "base") { result.test_eq(enc_provider, "generated ciphertext matches KAT", generated_ciphertext, ciphertext); } else if(generated_ciphertext != ciphertext) { for(std::unique_ptr& dec : decryptors) { result.test_eq("decryption of generated ciphertext", dec->decrypt(generated_ciphertext), plaintext); } } } return result; } Test::Result PK_KEM_Test::run_one_test(const std::string&, const VarMap& vars) { const std::vector K = get_req_bin(vars, "K"); const std::vector C0 = get_req_bin(vars, "C0"); const std::vector salt = get_opt_bin(vars, "Salt"); const std::string kdf = get_req_str(vars, "KDF"); Test::Result result(algo_name() + "/" + kdf + " KEM"); std::unique_ptr privkey = load_private_key(vars); const Botan::Public_Key& pubkey = *privkey; const size_t desired_key_len = K.size(); std::unique_ptr enc; try { enc.reset(new Botan::PK_KEM_Encryptor(pubkey, Test::rng(), kdf)); } catch(Botan::Lookup_Error&) { result.test_note("Skipping due to missing KDF: " + kdf); return result; } Fixed_Output_RNG fixed_output_rng(get_req_bin(vars, "R")); Botan::secure_vector produced_encap_key, shared_key; enc->encrypt(produced_encap_key, shared_key, desired_key_len, fixed_output_rng, salt); result.test_eq("C0 matches", produced_encap_key, C0); result.test_eq("K matches", shared_key, K); std::unique_ptr dec; try { dec.reset(new Botan::PK_KEM_Decryptor(*privkey, Test::rng(), kdf)); } catch(Botan::Lookup_Error& e) { result.test_note("Skipping test", e.what()); return result; } const Botan::secure_vector decr_shared_key = dec->decrypt(C0.data(), C0.size(), desired_key_len, salt.data(), salt.size()); result.test_eq("decrypted K matches", decr_shared_key, K); return result; } Test::Result PK_Key_Agreement_Test::run_one_test(const std::string& header, const VarMap& vars) { const std::vector shared = get_req_bin(vars, "K"); const std::string kdf = get_opt_str(vars, "KDF", default_kdf(vars)); Test::Result result(algo_name() + "/" + kdf + (header.empty() ? header : " " + header) + " key agreement"); std::unique_ptr privkey = load_our_key(header, vars); const std::vector pubkey = load_their_key(header, vars); const size_t key_len = get_opt_sz(vars, "OutLen", 0); for(auto const& provider : possible_providers(algo_name())) { std::unique_ptr kas; try { kas.reset(new Botan::PK_Key_Agreement(*privkey, Test::rng(), kdf, provider)); result.test_eq(provider, "agreement", kas->derive_key(key_len, pubkey).bits_of(), shared); } catch(Botan::Lookup_Error&) { //result.test_note("Skipping key agreement with with " + provider); } } return result; } std::vector PK_Key_Generation_Test::possible_providers( const std::string& algo) { std::vector pk_provider = Botan::probe_provider_private_key(algo, { "base", "openssl", "tpm" }); return Test::provider_filter(pk_provider); } std::vector PK_Key_Generation_Test::run() { std::vector results; for(auto const& param : keygen_params()) { const std::string report_name = algo_name() + (param.empty() ? param : " " + param); Test::Result result(report_name + " keygen"); const std::vector providers = possible_providers(algo_name()); if(providers.empty()) { result.note_missing("provider key generation " + algo_name()); } result.start_timer(); for(auto&& prov : providers) { std::unique_ptr key_p = Botan::create_private_key(algo_name(), Test::rng(), param, prov); const Botan::Private_Key& key = *key_p; try { result.confirm("Key passes self tests", key.check_key(Test::rng(), true)); } catch(Botan::Lookup_Error&) {} result.test_gte("Key has reasonable estimated strength (lower)", key.estimated_strength(), 64); result.test_lt("Key has reasonable estimated strength (upper)", key.estimated_strength(), 512); // Test PEM public key round trips OK try { Botan::DataSource_Memory data_src(Botan::X509::PEM_encode(key)); std::unique_ptr loaded(Botan::X509::load_key(data_src)); result.confirm("recovered public key from private", loaded.get() != nullptr); result.test_eq("public key has same type", loaded->algo_name(), key.algo_name()); try { result.test_eq("public key passes checks", loaded->check_key(Test::rng(), false), true); } catch(Botan::Lookup_Error&) {} } catch(std::exception& e) { result.test_failure("roundtrip PEM public key", e.what()); } // Test DER public key round trips OK try { Botan::DataSource_Memory data_src(Botan::X509::BER_encode(key)); std::unique_ptr loaded(Botan::X509::load_key(data_src)); result.confirm("recovered public key from private", loaded.get() != nullptr); result.test_eq("public key has same type", loaded->algo_name(), key.algo_name()); try { result.confirm("public key passes self tests", loaded->check_key(Test::rng(), true)); } catch(Botan::Lookup_Error&) {} } catch(std::exception& e) { result.test_failure("roundtrip BER public key", e.what()); } // Test PEM private key round trips OK try { Botan::DataSource_Memory data_src(Botan::PKCS8::PEM_encode(key)); std::unique_ptr loaded( Botan::PKCS8::load_key(data_src, Test::rng())); result.confirm("recovered private key from PEM blob", loaded.get() != nullptr); result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); try { result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); } catch(Botan::Lookup_Error&) {} } catch(std::exception& e) { result.test_failure("roundtrip PEM private key", e.what()); } try { Botan::DataSource_Memory data_src(Botan::PKCS8::BER_encode(key)); std::unique_ptr loaded(Botan::PKCS8::load_key(data_src, Test::rng())); result.confirm("recovered public key from private", loaded.get() != nullptr); result.test_eq("public key has same type", loaded->algo_name(), key.algo_name()); try { result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); } catch(Botan::Lookup_Error&) {} } catch(std::exception& e) { result.test_failure("roundtrip BER private key", e.what()); } #if defined(BOTAN_HAS_PKCS5_PBE2) && defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_SHA2_32) const std::string pbe_algo = "PBE-PKCS5v20(AES-128,SHA-256)"; const std::string passphrase = Test::random_password(); try { Botan::DataSource_Memory data_src( Botan::PKCS8::PEM_encode(key, Test::rng(), passphrase, std::chrono::milliseconds(10), pbe_algo)); std::unique_ptr loaded( Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); result.confirm("recovered private key from encrypted blob", loaded.get() != nullptr); result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); try { result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); } catch(Botan::Lookup_Error&) {} } catch(std::exception& e) { result.test_failure("roundtrip encrypted PEM private key", e.what()); } try { Botan::DataSource_Memory data_src( Botan::PKCS8::BER_encode(key, Test::rng(), passphrase, std::chrono::milliseconds(10), pbe_algo)); std::unique_ptr loaded( Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); result.confirm("recovered private key from BER blob", loaded.get() != nullptr); result.test_eq("reloaded key has same type", loaded->algo_name(), key.algo_name()); try { result.confirm("private key passes self tests", loaded->check_key(Test::rng(), true)); } catch(Botan::Lookup_Error&) {} } catch(std::exception& e) { result.test_failure("roundtrip encrypted BER private key", e.what()); } #endif } result.end_timer(); results.push_back(result); } return results; } } #endif botan-2.4.0/src/tests/test_pubkey.h000066400000000000000000000143401322470703100172610ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TEST_PUBKEY_H_ #define BOTAN_TEST_PUBKEY_H_ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include namespace Botan_Tests { class PK_Test : public Text_Based_Test { public: PK_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = {}) : Text_Based_Test(test_src, required_keys, optional_keys), m_algo(algo) {} std::string algo_name() const { return m_algo; } protected: std::vector possible_providers(const std::string& params) override; virtual std::string default_padding(const VarMap&) const { throw Test_Error("No default padding scheme set for " + algo_name()); } virtual std::string choose_padding(const VarMap& vars, const std::string& pad_hdr); private: std::string m_algo; }; class PK_Signature_Generation_Test : public PK_Test { public: PK_Signature_Generation_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} virtual std::unique_ptr load_private_key(const VarMap& vars) = 0; virtual Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const { return new Fixed_Output_RNG(nonce); } private: Test::Result run_one_test(const std::string&, const VarMap& vars) override final; }; class PK_Signature_Verification_Test : public PK_Test { public: PK_Signature_Verification_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} virtual std::unique_ptr load_public_key(const VarMap& vars) = 0; private: Test::Result run_one_test(const std::string& header, const VarMap& vars) override final; }; class PK_Signature_NonVerification_Test : public PK_Test { public: PK_Signature_NonVerification_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} bool clear_between_callbacks() const override { return false; } virtual std::unique_ptr load_public_key(const VarMap& vars) = 0; private: Test::Result run_one_test(const std::string& header, const VarMap& vars) override final; }; class PK_Encryption_Decryption_Test : public PK_Test { public: PK_Encryption_Decryption_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} virtual std::unique_ptr load_private_key(const VarMap& vars) = 0; std::string default_padding(const VarMap&) const override { return "Raw"; } virtual Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const { return new Fixed_Output_RNG(nonce); } private: Test::Result run_one_test(const std::string& header, const VarMap& vars) override final; }; class PK_Key_Agreement_Test : public PK_Test { public: PK_Key_Agreement_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} virtual std::unique_ptr load_our_key(const std::string& header, const VarMap& vars) = 0; virtual std::vector load_their_key(const std::string& header, const VarMap& vars) = 0; virtual std::string default_kdf(const VarMap&) const { return "Raw"; } private: Test::Result run_one_test(const std::string& header, const VarMap& vars) override final; }; class PK_KEM_Test : public PK_Test { public: PK_KEM_Test(const std::string& algo, const std::string& test_src, const std::string& required_keys, const std::string& optional_keys = "") : PK_Test(algo, test_src, required_keys, optional_keys) {} virtual std::unique_ptr load_private_key(const VarMap& vars) = 0; private: Test::Result run_one_test(const std::string& header, const VarMap& vars) override final; }; class PK_Key_Generation_Test : public Test { protected: std::vector run() override final; virtual std::vector keygen_params() const = 0; virtual std::string algo_name() const = 0; std::vector possible_providers(const std::string& params) override; }; void check_invalid_signatures(Test::Result& result, Botan::PK_Verifier& verifier, const std::vector& message, const std::vector& signature); void check_invalid_ciphertexts(Test::Result& result, Botan::PK_Decryptor& decryptor, const std::vector& plaintext, const std::vector& ciphertext); } #endif #endif botan-2.4.0/src/tests/test_rfc6979.cpp000066400000000000000000000027321322470703100174300ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_RFC6979_GENERATOR) #include #endif #include namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_RFC6979_GENERATOR) class RFC6979_KAT_Tests final : public Text_Based_Test { public: RFC6979_KAT_Tests() : Text_Based_Test("rfc6979.vec", "Q,X,H,K") {} Test::Result run_one_test(const std::string& hash, const VarMap& vars) override { const BigInt Q = get_req_bn(vars, "Q"); const BigInt X = get_req_bn(vars, "X"); const BigInt H = get_req_bn(vars, "H"); const BigInt K = get_req_bn(vars, "K"); Test::Result result("RFC 6979 nonce generation"); auto hash_func = Botan::HashFunction::create(hash); if(!hash_func) { result.test_note("Skipping due to missing: " + hash); return result; } result.test_eq("vector matches", Botan::generate_rfc6979_nonce(X, Q, H, hash), K); Botan::RFC6979_Nonce_Generator gen(hash, Q, X); result.test_eq("vector matches", gen.nonce_for(H), K); result.test_ne("different output for H+1", gen.nonce_for(H + 1), K); result.test_eq("vector matches when run again", gen.nonce_for(H), K); return result; } }; BOTAN_REGISTER_TEST("rfc6979", RFC6979_KAT_Tests); #endif } } botan-2.4.0/src/tests/test_rng.cpp000066400000000000000000000705111322470703100171050ustar00rootroot00000000000000/* * (C) 2014,2015,2017 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_STATEFUL_RNG) #include #endif #if defined(BOTAN_HAS_HMAC_DRBG) #include #endif #if defined(BOTAN_HAS_AUTO_RNG) #include #endif #if defined(BOTAN_HAS_CHACHA_RNG) #include #endif #if defined(BOTAN_HAS_SYSTEM_RNG) #include #endif #if defined(BOTAN_HAS_RDRAND_RNG) #include #include #endif #if defined(BOTAN_HAS_ENTROPY_SOURCE) #include #endif #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_STATEFUL_RNG) class Stateful_RNG_Tests : public Test { public: std::vector run() override { std::vector results; results.push_back(test_reseed_kat()); results.push_back(test_reseed()); results.push_back(test_max_number_of_bytes_per_request()); results.push_back(test_broken_entropy_input()); results.push_back(test_check_nonce()); results.push_back(test_prediction_resistance()); results.push_back(test_fork_safety()); results.push_back(test_randomize_with_ts_input()); results.push_back(test_security_level()); return results; } protected: virtual std::string rng_name() const = 0; virtual std::unique_ptr create_rng( Botan::RandomNumberGenerator* underlying_rng, Botan::Entropy_Sources* underlying_es, size_t reseed_interval) = 0; std::unique_ptr make_rng(Botan::RandomNumberGenerator& underlying_rng, size_t reseed_interval = 1024) { return create_rng(&underlying_rng, nullptr, reseed_interval); } std::unique_ptr make_rng(Botan::Entropy_Sources& underlying_srcs, size_t reseed_interval = 1024) { return create_rng(nullptr, &underlying_srcs, reseed_interval); } std::unique_ptr make_rng(Botan::RandomNumberGenerator& underlying_rng, Botan::Entropy_Sources& underlying_srcs, size_t reseed_interval = 1024) { return create_rng(&underlying_rng, &underlying_srcs, reseed_interval); } virtual Test::Result test_reseed_kat() = 0; virtual Test::Result test_security_level() = 0; virtual Test::Result test_max_number_of_bytes_per_request() = 0; private: Test::Result test_reseed() { Test::Result result(rng_name() + " Reseed"); // test reseed_interval is enforced Request_Counting_RNG counting_rng; std::unique_ptr rng = make_rng(counting_rng, 2); rng->random_vec(7); result.test_eq("initial seeding", counting_rng.randomize_count(), 1); rng->random_vec(9); result.test_eq("still initial seed", counting_rng.randomize_count(), 1); rng->random_vec(1); result.test_eq("first reseed", counting_rng.randomize_count(), 2); rng->random_vec(15); result.test_eq("still first reseed", counting_rng.randomize_count(), 2); rng->random_vec(15); result.test_eq("second reseed", counting_rng.randomize_count(), 3); rng->random_vec(1); result.test_eq("still second reseed", counting_rng.randomize_count(), 3); if(rng->max_number_of_bytes_per_request() > 0) { // request > max_number_of_bytes_per_request, do reseeds occur? rng->random_vec(64 * 1024 + 1); result.test_eq("request exceeds output limit", counting_rng.randomize_count(), 4); rng->random_vec(9 * 64 * 1024 + 1); result.test_eq("request exceeds output limit", counting_rng.randomize_count(), 9); } return result; } Test::Result test_broken_entropy_input() { Test::Result result(rng_name() + " Broken Entropy Input"); class Broken_Entropy_Source final : public Botan::Entropy_Source { public: std::string name() const override { return "Broken Entropy Source"; } size_t poll(Botan::RandomNumberGenerator&) override { throw Botan::Exception("polling not available"); } }; class Insufficient_Entropy_Source final : public Botan::Entropy_Source { public: std::string name() const override { return "Insufficient Entropy Source"; } size_t poll(Botan::RandomNumberGenerator&) override { return 0; } }; // make sure no output is generated when the entropy input source is broken // underlying_rng throws exception Botan::Null_RNG broken_entropy_input_rng; result.test_eq("Null_RNG not seeded", broken_entropy_input_rng.is_seeded(), false); std::unique_ptr rng_with_broken_rng = make_rng(broken_entropy_input_rng); result.test_throws("broken underlying rng", [&rng_with_broken_rng]() { rng_with_broken_rng->random_vec(16); }); // entropy_sources throw exception std::unique_ptr broken_entropy_source_1(new Broken_Entropy_Source()); std::unique_ptr broken_entropy_source_2(new Broken_Entropy_Source()); Botan::Entropy_Sources broken_entropy_sources; broken_entropy_sources.add_source(std::move(broken_entropy_source_1)); broken_entropy_sources.add_source(std::move(broken_entropy_source_2)); std::unique_ptr rng_with_broken_es = make_rng(broken_entropy_sources); result.test_throws("broken entropy sources", [&rng_with_broken_es]() { rng_with_broken_es->random_vec(16); }); // entropy source returns insufficient entropy Botan::Entropy_Sources insufficient_entropy_sources; std::unique_ptr insufficient_entropy_source(new Insufficient_Entropy_Source()); insufficient_entropy_sources.add_source(std::move(insufficient_entropy_source)); std::unique_ptr rng_with_insufficient_es = make_rng(insufficient_entropy_sources); result.test_throws("insufficient entropy source", [&rng_with_insufficient_es]() { rng_with_insufficient_es->random_vec(16); }); // one of or both underlying_rng and entropy_sources throw exception std::unique_ptr rng_with_broken_rng_and_good_es = make_rng(broken_entropy_input_rng, Botan::Entropy_Sources::global_sources()); result.test_throws("broken underlying rng but good entropy sources", [&rng_with_broken_rng_and_good_es]() { rng_with_broken_rng_and_good_es->random_vec(16); }); std::unique_ptr rng_with_good_rng_and_broken_es = make_rng(Test::rng(), broken_entropy_sources); result.test_throws("good underlying rng but broken entropy sources", [&rng_with_good_rng_and_broken_es]() { rng_with_good_rng_and_broken_es->random_vec(16); }); std::unique_ptr rng_with_broken_rng_and_broken_es = make_rng(broken_entropy_input_rng, broken_entropy_sources); result.test_throws("underlying rng and entropy sources broken", [&rng_with_broken_rng_and_broken_es]() { rng_with_broken_rng_and_broken_es->random_vec(16); }); return result; } Test::Result test_check_nonce() { Test::Result result(rng_name() + " Nonce Check"); // make sure the nonce has at least security_strength bits std::unique_ptr rng = create_rng(nullptr, nullptr, 0); for(size_t nonce_size : { 0, 4, 8, 16, 31, 32, 34, 64 }) { rng->clear(); result.test_eq("not seeded", rng->is_seeded(), false); const std::vector nonce(nonce_size); rng->initialize_with(nonce.data(), nonce.size()); if(nonce_size < rng->security_level() / 8) { result.test_eq("not seeded", rng->is_seeded(), false); result.test_throws("invalid nonce size", [&rng]() { rng->random_vec(32); }); } else { result.test_eq("is seeded", rng->is_seeded(), true); rng->random_vec(32); } } return result; } Test::Result test_prediction_resistance() { Test::Result result(rng_name() + " Prediction Resistance"); // set reseed_interval = 1, forcing a reseed for every RNG request Request_Counting_RNG counting_rng; std::unique_ptr rng = make_rng(counting_rng, 1); rng->random_vec(16); result.test_eq("first request", counting_rng.randomize_count(), size_t(1)); rng->random_vec(16); result.test_eq("second request", counting_rng.randomize_count(), size_t(2)); rng->random_vec(16); result.test_eq("third request", counting_rng.randomize_count(), size_t(3)); return result; } Test::Result test_fork_safety() { Test::Result result(rng_name() + " Fork Safety"); #if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) const size_t reseed_interval = 1024; // make sure rng is reseeded after every fork Request_Counting_RNG counting_rng; std::unique_ptr rng = make_rng(counting_rng, reseed_interval); rng->random_vec(16); result.test_eq("first request", counting_rng.randomize_count(), size_t(1)); // fork and request from parent and child, both should output different sequences size_t count = counting_rng.randomize_count(); Botan::secure_vector parent_bytes(16), child_bytes(16); int fd[2]; int rc = ::pipe(fd); if(rc != 0) { result.test_failure("failed to create pipe"); } pid_t pid = ::fork(); if(pid == -1) { result.test_failure("failed to fork process"); return result; } else if(pid != 0) { // parent process, wait for randomize_count from child's rng ::close(fd[1]); // close write end in parent ssize_t got = ::read(fd[0], &count, sizeof(count)); if(got > 0) { result.test_eq("expected bytes from child", got, sizeof(count)); result.test_eq("parent not reseeded", counting_rng.randomize_count(), 1); result.test_eq("child reseed occurred", count, 2); } else { result.test_failure("Failed to read count size from child process"); } parent_bytes = rng->random_vec(16); got = ::read(fd[0], &child_bytes[0], child_bytes.size()); if(got > 0) { result.test_eq("expected bytes from child", got, child_bytes.size()); result.test_ne("parent and child output sequences differ", parent_bytes, child_bytes); } else { result.test_failure("Failed to read RNG bytes from child process"); } ::close(fd[0]); // close read end in parent // wait for the child to exit int status = 0; ::waitpid(pid, &status, 0); } else { // child process, send randomize_count and first output sequence back to parent ::close(fd[0]); // close read end in child rng->randomize(&child_bytes[0], child_bytes.size()); count = counting_rng.randomize_count(); ssize_t written = ::write(fd[1], &count, sizeof(count)); try { rng->randomize(&child_bytes[0], child_bytes.size()); } catch(std::exception& e) { fprintf(stderr, "%s", e.what()); } written = ::write(fd[1], &child_bytes[0], child_bytes.size()); BOTAN_UNUSED(written); ::close(fd[1]); // close write end in child /* * We can't call exit because it causes the mlock pool to be freed (#602) * We can't call _exit because it makes valgrind think we leaked memory. * So instead we execute something that will return 0 for us. */ ::execl("/bin/true", "true", NULL); ::_exit(0); // just in case /bin/true isn't available (sandbox?) } #endif return result; } Test::Result test_randomize_with_ts_input() { Test::Result result(rng_name() + " Randomize With Timestamp Input"); const size_t request_bytes = 64; const std::vector seed(128); // check that randomize_with_ts_input() creates different output based on a timestamp // and possibly additional data, such as process id even with identical seeds Fixed_Output_RNG fixed_output_rng1(seed); Fixed_Output_RNG fixed_output_rng2(seed); std::unique_ptr rng1 = make_rng(fixed_output_rng1); std::unique_ptr rng2 = make_rng(fixed_output_rng2); Botan::secure_vector output1(request_bytes); Botan::secure_vector output2(request_bytes); rng1->randomize(output1.data(), output1.size()); rng2->randomize(output2.data(), output2.size()); result.test_eq("equal output due to same seed", output1, output2); rng1->randomize_with_ts_input(output1.data(), output1.size()); rng2->randomize_with_ts_input(output2.data(), output2.size()); result.test_ne("output differs due to different timestamp", output1, output2); return result; } }; #endif #if defined(BOTAN_HAS_HMAC_DRBG) && defined(BOTAN_HAS_SHA2_32) class HMAC_DRBG_Unit_Tests final : public Stateful_RNG_Tests { public: std::string rng_name() const override { return "HMAC_DRBG"; } std::unique_ptr create_rng(Botan::RandomNumberGenerator* underlying_rng, Botan::Entropy_Sources* underlying_es, size_t reseed_interval) override { std::unique_ptr mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); if(underlying_rng && underlying_es) return std::unique_ptr(new Botan::HMAC_DRBG(std::move(mac), *underlying_rng, *underlying_es, reseed_interval)); else if(underlying_rng) return std::unique_ptr(new Botan::HMAC_DRBG(std::move(mac), *underlying_rng, reseed_interval)); else if(underlying_es) return std::unique_ptr(new Botan::HMAC_DRBG(std::move(mac), *underlying_es, reseed_interval)); else if(reseed_interval == 0) return std::unique_ptr(new Botan::HMAC_DRBG(std::move(mac))); else throw Test_Error("Invalid reseed interval in HMAC_DRBG unit test"); } Test::Result test_max_number_of_bytes_per_request() override { Test::Result result("HMAC_DRBG max_number_of_bytes_per_request"); const std::string mac_string = "HMAC(SHA-256)"; Request_Counting_RNG counting_rng; result.test_throws("HMAC_DRBG does not accept 0 for max_number_of_bytes_per_request", [&mac_string, &counting_rng]() { Botan::HMAC_DRBG failing_rng(Botan::MessageAuthenticationCode::create(mac_string), counting_rng, 2, 0); }); result.test_throws("HMAC_DRBG does not accept values higher than 64KB for max_number_of_bytes_per_request", [&mac_string, &counting_rng]() { Botan::HMAC_DRBG failing_rng(Botan::MessageAuthenticationCode::create(mac_string), counting_rng, 2, 64 * 1024 + 1); }); // set reseed_interval to 1 so we can test that a long request is split // into multiple, max_number_of_bytes_per_request long requests // for each smaller request, reseed_check() calls counting_rng::randomize(), // which we can compare with Botan::HMAC_DRBG rng(Botan::MessageAuthenticationCode::create(mac_string), counting_rng, 1, 64); rng.random_vec(63); result.test_eq("one request", counting_rng.randomize_count(), 1); rng.clear(); counting_rng.clear(); rng.random_vec(64); result.test_eq("one request", counting_rng.randomize_count(), 1); rng.clear(); counting_rng.clear(); rng.random_vec(65); result.test_eq("two requests", counting_rng.randomize_count(), 2); rng.clear(); counting_rng.clear(); rng.random_vec(1025); result.test_eq("17 requests", counting_rng.randomize_count(), 17); return result; } Test::Result test_security_level() override { Test::Result result("HMAC_DRBG Security Level"); std::vector approved_hash_fns { "SHA-160", "SHA-224", "SHA-256", "SHA-512/256", "SHA-384", "SHA-512" }; std::vector security_strengths { 128, 192, 256, 256, 256, 256 }; for(size_t i = 0; i < approved_hash_fns.size(); ++i) { std::string hash_fn = approved_hash_fns[i]; std::string mac_name = "HMAC(" + hash_fn + ")"; auto mac = Botan::MessageAuthenticationCode::create(mac_name); if(!mac) { result.note_missing(mac_name); continue; } Botan::HMAC_DRBG rng(std::move(mac)); result.test_eq(hash_fn + " security level", rng.security_level(), security_strengths[i]); } return result; } Test::Result test_reseed_kat() override { Test::Result result("HMAC_DRBG Reseed KAT"); Request_Counting_RNG counting_rng; std::unique_ptr rng = make_rng(counting_rng, 2); const Botan::secure_vector seed_input( { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }); result.test_eq("is_seeded", rng->is_seeded(), false); rng->initialize_with(seed_input.data(), seed_input.size()); Botan::secure_vector out(32); rng->randomize(out.data(), out.size()); result.test_eq("underlying RNG calls", counting_rng.randomize_count(), size_t(0)); result.test_eq("out before reseed", out, "48D3B45AAB65EF92CCFCB9427EF20C90297065ECC1B8A525BFE4DC6FF36D0E38"); // reseed must happen here rng->randomize(out.data(), out.size()); result.test_eq("underlying RNG calls", counting_rng.randomize_count(), size_t(1)); result.test_eq("out after reseed", out, "2F8FCA696832C984781123FD64F4B20C7379A25C87AB29A21C9BF468B0081CE2"); return result; } }; BOTAN_REGISTER_TEST("hmac_drbg_unit", HMAC_DRBG_Unit_Tests); #endif #if defined(BOTAN_HAS_CHACHA_RNG) class ChaCha_RNG_Unit_Tests final : public Stateful_RNG_Tests { public: std::string rng_name() const override { return "ChaCha_RNG"; } std::unique_ptr create_rng(Botan::RandomNumberGenerator* underlying_rng, Botan::Entropy_Sources* underlying_es, size_t reseed_interval) override { if(underlying_rng && underlying_es) return std::unique_ptr(new Botan::ChaCha_RNG(*underlying_rng, *underlying_es, reseed_interval)); else if(underlying_rng) return std::unique_ptr(new Botan::ChaCha_RNG(*underlying_rng, reseed_interval)); else if(underlying_es) return std::unique_ptr(new Botan::ChaCha_RNG(*underlying_es, reseed_interval)); else if(reseed_interval == 0) return std::unique_ptr(new Botan::ChaCha_RNG()); else throw Test_Error("Invalid reseed interval in ChaCha_RNG unit test"); } Test::Result test_security_level() override { Test::Result result("ChaCha_RNG Security Level"); Botan::ChaCha_RNG rng; result.test_eq("Expected security level", rng.security_level(), size_t(256)); return result; } Test::Result test_max_number_of_bytes_per_request() override { Test::Result result("ChaCha_RNG max_number_of_bytes_per_request"); // ChaCha_RNG doesn't have this notion return result; } Test::Result test_reseed_kat() override { Test::Result result("ChaCha_RNG Reseed KAT"); Request_Counting_RNG counting_rng; std::unique_ptr rng = make_rng(counting_rng, 2); const Botan::secure_vector seed_input(32); result.test_eq("is_seeded", rng->is_seeded(), false); rng->initialize_with(seed_input.data(), seed_input.size()); Botan::secure_vector out(32); rng->randomize(out.data(), out.size()); result.test_eq("underlying RNG calls", counting_rng.randomize_count(), size_t(0)); result.test_eq("out before reseed", out, "1F0E6F13429D5073B59C057C37CBE9587740A0A894D247E2596C393CE91DDC6F"); // reseed must happen here rng->randomize(out.data(), out.size()); result.test_eq("underlying RNG calls", counting_rng.randomize_count(), size_t(1)); result.test_eq("out after reseed", out, "F2CAE73F22684D5D773290B48FDCDA0E6C0661EBA0A854AFEC922832BDBB9C49"); return result; } }; BOTAN_REGISTER_TEST("chacha_rng_unit", ChaCha_RNG_Unit_Tests); #endif #if defined(BOTAN_HAS_AUTO_RNG) class AutoSeeded_RNG_Tests final : public Test { private: Test::Result auto_rng_tests() { Test::Result result("AutoSeeded_RNG"); Botan::Entropy_Sources no_entropy_for_you; Botan::Null_RNG null_rng; result.test_eq("Null_RNG is null", null_rng.is_seeded(), false); try { Botan::AutoSeeded_RNG rng(no_entropy_for_you); result.test_failure("AutoSeeded_RNG should have rejected useless entropy source"); } catch(Botan::PRNG_Unseeded&) { result.test_success("AutoSeeded_RNG rejected empty entropy source"); } try { Botan::AutoSeeded_RNG rng(null_rng); } catch(Botan::PRNG_Unseeded&) { result.test_success("AutoSeeded_RNG rejected useless RNG"); } try { Botan::AutoSeeded_RNG rng(null_rng, no_entropy_for_you); } catch(Botan::PRNG_Unseeded&) { result.test_success("AutoSeeded_RNG rejected useless RNG+entropy sources"); } Botan::AutoSeeded_RNG rng; result.test_eq("AutoSeeded_RNG::name", rng.name(), std::string("HMAC_DRBG(") + BOTAN_AUTO_RNG_HMAC + ")"); result.confirm("AutoSeeded_RNG starts seeded", rng.is_seeded()); rng.random_vec(16); // generate and discard output rng.clear(); result.test_eq("AutoSeeded_RNG unseeded after calling clear", rng.is_seeded(), false); // AutoSeeded_RNG automatically reseeds as required: rng.random_vec(16); result.confirm("AutoSeeded_RNG can be reseeded", rng.is_seeded()); result.confirm("AutoSeeded_RNG ", rng.is_seeded()); rng.random_vec(16); // generate and discard output rng.clear(); result.test_eq("AutoSeeded_RNG unseeded after calling clear", rng.is_seeded(), false); const size_t no_entropy_bits = rng.reseed(no_entropy_for_you, 256, std::chrono::milliseconds(300)); result.test_eq("AutoSeeded_RNG can't reseed from nothing", no_entropy_bits, 0); result.test_eq("AutoSeeded_RNG still unseeded", rng.is_seeded(), false); rng.random_vec(16); // generate and discard output result.confirm("AutoSeeded_RNG can be reseeded", rng.is_seeded()); rng.clear(); return result; } public: std::vector run() override { std::vector results; results.push_back(auto_rng_tests()); return results; } }; BOTAN_REGISTER_TEST("auto_rng_unit", AutoSeeded_RNG_Tests); #endif #if defined(BOTAN_HAS_SYSTEM_RNG) class System_RNG_Tests final : public Test { public: std::vector run() override { Test::Result result("System_RNG"); Botan::System_RNG rng; result.test_gte("Some non-empty name is returned", rng.name().size(), 1); result.confirm("System RNG always seeded", rng.is_seeded()); rng.clear(); // clear is a noop for system rng result.confirm("System RNG always seeded", rng.is_seeded()); rng.reseed(Botan::Entropy_Sources::global_sources(), 256, std::chrono::milliseconds(100)); for(size_t i = 0; i != 128; ++i) { std::vector out_buf(i); rng.randomize(out_buf.data(), out_buf.size()); rng.add_entropy(out_buf.data(), out_buf.size()); } return std::vector{result}; } }; BOTAN_REGISTER_TEST("system_rng", System_RNG_Tests); #endif #if defined(BOTAN_HAS_RDRAND_RNG) class RDRAND_RNG_Tests final : public Test { public: std::vector run() override { Test::Result result("RDRAND_RNG"); if(Botan::CPUID::has_rdrand()) { Botan::RDRAND_RNG rng; result.test_eq("Expected name", rng.name(), "RDRAND"); result.confirm("RDRAND always seeded", rng.is_seeded()); rng.clear(); // clear is a noop for rdrand result.confirm("RDRAND always seeded", rng.is_seeded()); size_t reseed_bits = rng.reseed(Botan::Entropy_Sources::global_sources(), 256, std::chrono::seconds(1)); result.test_eq("RDRAND cannot consume inputs", reseed_bits, size_t(0)); /* RDRAND_RNG ignores add_entropy calls - confirm this by passing an invalid ptr/length field to add_entropy. If it examined its arguments, it would crash... */ const uint8_t* invalid_ptr = reinterpret_cast(static_cast(0xDEADC0DE)); const size_t invalid_ptr_len = 64*1024; rng.add_entropy(invalid_ptr, invalid_ptr_len); for(size_t i = 0; i != 128; ++i) { std::vector out_buf(i); rng.randomize(out_buf.data(), out_buf.size()); } } else { result.test_throws("RDRAND_RNG throws if instruction not available", []() { Botan::RDRAND_RNG rng; }); } return std::vector{result}; } }; BOTAN_REGISTER_TEST("rdrand_rng", RDRAND_RNG_Tests); #endif } } botan-2.4.0/src/tests/test_rng.h000066400000000000000000000123321322470703100165470ustar00rootroot00000000000000/* * (C) 2009 Jack Lloyd * (C) 2016 René Korthaus, Sirrix AG * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TESTS_FIXED_RNG_H_ #define BOTAN_TESTS_FIXED_RNG_H_ #include "tests.h" #include #include #include #include #include namespace Botan_Tests { /** * RNG that outputs only a given set of fixed bytes, throws otherwise. * Useful for test vectors with fixed nonces, where the algorithm consumes only the fixed nonce. */ class Fixed_Output_RNG : public Botan::RandomNumberGenerator { public: bool is_seeded() const override { return !m_buf.empty(); } size_t reseed(Botan::Entropy_Sources&, size_t, std::chrono::milliseconds) override { return 0; } void randomize(uint8_t out[], size_t len) override { for(size_t j = 0; j != len; j++) { out[j] = random(); } } void add_entropy(const uint8_t b[], size_t s) override { m_buf.insert(m_buf.end(), b, b + s); } std::string name() const override { return "Fixed_Output_RNG"; } void clear() BOTAN_NOEXCEPT override {} explicit Fixed_Output_RNG(const std::vector& in) { m_buf.insert(m_buf.end(), in.begin(), in.end()); } explicit Fixed_Output_RNG(const std::string& in_str) { std::vector in = Botan::hex_decode(in_str); m_buf.insert(m_buf.end(), in.begin(), in.end()); } Fixed_Output_RNG() = default; protected: uint8_t random() { if(m_buf.empty()) { throw Test_Error("Fixed output RNG ran out of bytes, test bug?"); } uint8_t out = m_buf.front(); m_buf.pop_front(); return out; } private: std::deque m_buf; }; /** * RNG that outputs a given set of fixed bytes for a specific request count, outputs random otherwise. * Useful for test vectors with fixed nonces, where the algorithm consumes more random than just the fixed nonce. */ class Fixed_Output_Position_RNG final : public Fixed_Output_RNG { public: bool is_seeded() const override { return Fixed_Output_RNG::is_seeded() || Test::rng().is_seeded(); } void randomize(uint8_t out[], size_t len) override { ++m_requests; if(m_requests == m_pos) { // return fixed output for(size_t j = 0; j != len; j++) { out[j] = random(); } } else { // return random Test::rng().randomize(out, len); } } void add_entropy(const uint8_t*, size_t) override { throw Botan::Exception("add_entropy() not supported by this RNG, test bug?"); } std::string name() const override { return "Fixed_Output_Position_RNG"; } explicit Fixed_Output_Position_RNG(const std::vector& in, size_t pos) : Fixed_Output_RNG(in) , m_pos(pos) {} explicit Fixed_Output_Position_RNG(const std::string& in_str, size_t pos) : Fixed_Output_RNG(in_str) , m_pos(pos) {} private: size_t m_pos = 0; size_t m_requests = 0; }; class SeedCapturing_RNG final : public Botan::RandomNumberGenerator { public: void randomize(uint8_t[], size_t) override { throw Botan::Exception("SeedCapturing_RNG has no output"); } void add_entropy(const uint8_t input[], size_t len) override { m_samples++; m_seed.insert(m_seed.end(), input, input + len); } void clear() override {} bool is_seeded() const override { return false; } std::string name() const override { return "SeedCapturing"; } size_t samples() const { return m_samples; } const std::vector& seed_material() const { return m_seed; } private: std::vector m_seed; size_t m_samples = 0; }; /* * RNG that counts the number of requests made to it, for example * to verify that a reseed attempt was made at the expected time. */ class Request_Counting_RNG final : public Botan::RandomNumberGenerator { public: Request_Counting_RNG() : m_randomize_count(0) {} size_t randomize_count() const { return m_randomize_count; } bool is_seeded() const override { return true; } void clear() override { m_randomize_count = 0; } void randomize(uint8_t out[], size_t out_len) override { std::memset(out, 0x80, out_len); m_randomize_count++; } void add_entropy(const uint8_t[], size_t) override {} std::string name() const override { return "Request_Counting_RNG"; } private: size_t m_randomize_count; }; } #endif botan-2.4.0/src/tests/test_rng_kat.cpp000066400000000000000000000070241322470703100177430ustar00rootroot00000000000000/* * (C) 2014,2015,2017 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_HMAC_DRBG) #include #endif #if defined(BOTAN_HAS_CHACHA_RNG) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_HMAC_DRBG) class HMAC_DRBG_Tests final : public Text_Based_Test { public: HMAC_DRBG_Tests() : Text_Based_Test("rng/hmac_drbg.vec", "EntropyInput,EntropyInputReseed,Out", "AdditionalInput1,AdditionalInput2") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector seed_input = get_req_bin(vars, "EntropyInput"); const std::vector reseed_input = get_req_bin(vars, "EntropyInputReseed"); const std::vector expected = get_req_bin(vars, "Out"); const std::vector ad1 = get_opt_bin(vars, "AdditionalInput1"); const std::vector ad2 = get_opt_bin(vars, "AdditionalInput2"); Test::Result result("HMAC_DRBG(" + algo + ")"); auto mac = Botan::MessageAuthenticationCode::create("HMAC(" + algo + ")"); if(!mac) { result.note_missing("HMAC(" + algo + ")"); return result; } std::unique_ptr rng(new Botan::HMAC_DRBG(std::move(mac))); rng->initialize_with(seed_input.data(), seed_input.size()); // now reseed rng->add_entropy(reseed_input.data(), reseed_input.size()); std::vector out(expected.size()); // first block is discarded rng->randomize_with_input(out.data(), out.size(), ad1.data(), ad1.size()); rng->randomize_with_input(out.data(), out.size(), ad2.data(), ad2.size()); result.test_eq("rng", out, expected); return result; } }; BOTAN_REGISTER_TEST("hmac_drbg", HMAC_DRBG_Tests); #endif #if defined(BOTAN_HAS_CHACHA_RNG) class ChaCha_RNG_Tests final : public Text_Based_Test { public: ChaCha_RNG_Tests() : Text_Based_Test("rng/chacha_rng.vec", "EntropyInput,EntropyInputReseed,Out", "AdditionalInput1,AdditionalInput2") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { const std::vector seed_input = get_req_bin(vars, "EntropyInput"); const std::vector reseed_input = get_req_bin(vars, "EntropyInputReseed"); const std::vector expected = get_req_bin(vars, "Out"); const std::vector ad1 = get_opt_bin(vars, "AdditionalInput1"); const std::vector ad2 = get_opt_bin(vars, "AdditionalInput2"); Test::Result result("ChaCha_RNG"); Botan::ChaCha_RNG rng; rng.initialize_with(seed_input.data(), seed_input.size()); // now reseed rng.add_entropy(reseed_input.data(), reseed_input.size()); std::vector out(expected.size()); // first block is discarded rng.randomize_with_input(out.data(), out.size(), ad1.data(), ad1.size()); rng.randomize_with_input(out.data(), out.size(), ad2.data(), ad2.size()); result.test_eq("rng", out, expected); return result; } }; BOTAN_REGISTER_TEST("chacha_rng", ChaCha_RNG_Tests); #endif } } botan-2.4.0/src/tests/test_rsa.cpp000066400000000000000000000234111322470703100171010ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_RSA) #include #include "test_pubkey.h" #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_RSA) class RSA_ES_KAT_Tests final : public PK_Encryption_Decryption_Test { public: RSA_ES_KAT_Tests() : PK_Encryption_Decryption_Test( "RSA", "pubkey/rsaes.vec", "E,P,Q,Msg,Ciphertext", "Padding,Nonce") {} std::unique_ptr load_private_key(const VarMap& vars) override { const BigInt p = get_req_bn(vars, "P"); const BigInt q = get_req_bn(vars, "Q"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; } }; class RSA_KEM_Tests final : public PK_KEM_Test { public: RSA_KEM_Tests() : PK_KEM_Test( "RSA", "pubkey/rsa_kem.vec", "E,P,Q,R,C0,KDF,OutLen,K") {} std::unique_ptr load_private_key(const VarMap& vars) override { const BigInt p = get_req_bn(vars, "P"); const BigInt q = get_req_bn(vars, "Q"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; } }; class RSA_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: RSA_Signature_KAT_Tests() : PK_Signature_Generation_Test( "RSA", "pubkey/rsa_sig.vec", "E,P,Q,Msg,Signature", "Padding,Nonce") {} std::string default_padding(const VarMap&) const override { return "Raw"; } std::unique_ptr load_private_key(const VarMap& vars) override { const BigInt p = get_req_bn(vars, "P"); const BigInt q = get_req_bn(vars, "Q"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; } }; class RSA_PSS_KAT_Tests final : public PK_Signature_Generation_Test { public: RSA_PSS_KAT_Tests() : PK_Signature_Generation_Test( "RSA", "pubkey/rsa_pss.vec", "P,Q,E,Hash,Nonce,Msg,Signature", "") {} std::string default_padding(const VarMap& var) const override { const std::string hash_name = get_req_str(var, "Hash"); const size_t salt_size = get_req_bin(var, "Nonce").size(); return "PSSR(" + hash_name + ",MGF1," + std::to_string(salt_size) + ")"; } bool clear_between_callbacks() const override { return false; } std::unique_ptr load_private_key(const VarMap& vars) override { const BigInt p = get_req_bn(vars, "P"); const BigInt q = get_req_bn(vars, "Q"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; } }; class RSA_PSS_Raw_KAT_Tests final : public PK_Signature_Generation_Test { public: RSA_PSS_Raw_KAT_Tests() : PK_Signature_Generation_Test( "RSA", "pubkey/rsa_pss_raw.vec", "P,Q,E,Hash,Nonce,Msg,Signature", "") {} std::string default_padding(const VarMap& var) const override { const std::string hash_name = get_req_str(var, "Hash"); const size_t salt_size = get_req_bin(var, "Nonce").size(); return "PSSR_Raw(" + hash_name + ",MGF1," + std::to_string(salt_size) + ")"; } bool clear_between_callbacks() const override { return false; } std::unique_ptr load_private_key(const VarMap& vars) override { const BigInt p = get_req_bn(vars, "P"); const BigInt q = get_req_bn(vars, "Q"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PrivateKey(p, q, e)); return key; } }; class RSA_Signature_Verify_Tests final : public PK_Signature_Verification_Test { public: RSA_Signature_Verify_Tests() : PK_Signature_Verification_Test( "RSA", "pubkey/rsa_verify.vec", "E,N,Msg,Signature", "Padding") {} std::string default_padding(const VarMap&) const override { return "Raw"; } std::unique_ptr load_public_key(const VarMap& vars) override { const BigInt n = get_req_bn(vars, "N"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PublicKey(n, e)); return key; } }; class RSA_Signature_Verify_Invalid_Tests final : public PK_Signature_NonVerification_Test { public: RSA_Signature_Verify_Invalid_Tests() : PK_Signature_NonVerification_Test( "RSA", "pubkey/rsa_invalid.vec", "Padding,E,N,Msg,InvalidSignature") {} std::string default_padding(const VarMap&) const override { return "Raw"; } std::unique_ptr load_public_key(const VarMap& vars) override { const BigInt n = get_req_bn(vars, "N"); const BigInt e = get_req_bn(vars, "E"); std::unique_ptr key(new Botan::RSA_PublicKey(n, e)); return key; } }; class RSA_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "1024", "1280" }; } std::string algo_name() const override { return "RSA"; } }; class RSA_Blinding_Tests final : public Test { public: std::vector run() override { Test::Result result("RSA blinding"); #if defined(BOTAN_HAS_EMSA_RAW) || defined(BOTAN_HAS_EME_RAW) Botan::RSA_PrivateKey rsa(Test::rng(), 1024); Botan::Null_RNG null_rng; #endif #if defined(BOTAN_HAS_EMSA_RAW) /* * The blinder chooses a new starting point BOTAN_BLINDING_REINIT_INTERVAL * so sign several times that with a single key. * * Very small values (padding/hashing disabled, only low byte set on input) * are used as an additional test on the blinders. */ Botan::PK_Signer signer(rsa, Test::rng(), "Raw", Botan::IEEE_1363, "base"); // don't try this at home Botan::PK_Verifier verifier(rsa, "Raw"); for(size_t i = 1; i <= BOTAN_BLINDING_REINIT_INTERVAL * 6; ++i) { std::vector input(16); input[input.size() - 1] = static_cast(i); signer.update(input); // assert RNG is not called in this situation std::vector signature = signer.signature(null_rng); result.test_eq("Signature verifies", verifier.verify_message(input, signature), true); } #endif #if defined(BOTAN_HAS_EME_RAW) /* * The blinder chooses a new starting point BOTAN_BLINDING_REINIT_INTERVAL * so decrypt several times that with a single key. * * Very small values (padding/hashing disabled, only low byte set on input) * are used as an additional test on the blinders. */ Botan::PK_Encryptor_EME encryptor(rsa, Test::rng(), "Raw"); // don't try this at home // test blinding reinit interval // Seed Fixed_Output_RNG only with enough bytes for the initial blinder initialization Botan_Tests::Fixed_Output_RNG fixed_rng(Botan::unlock(Test::rng().random_vec(rsa.get_n().bytes()))); Botan::PK_Decryptor_EME decryptor(rsa, fixed_rng, "Raw", "base"); for(size_t i = 1; i <= BOTAN_BLINDING_REINIT_INTERVAL ; ++i) { std::vector input(16); input[ input.size() - 1 ] = static_cast(i); std::vector ciphertext = encryptor.encrypt(input, null_rng); std::vector plaintext = Botan::unlock(decryptor.decrypt(ciphertext)); plaintext.insert(plaintext.begin(), input.size() - 1, 0); result.test_eq("Successful decryption", plaintext, input); } result.test_eq("RNG is no longer seeded", fixed_rng.is_seeded(), false); // one more decryption should trigger a blinder reinitialization result.test_throws("RSA blinding reinit", "Test error Fixed output RNG ran out of bytes, test bug?", [&decryptor, &encryptor, &null_rng]() { std::vector ciphertext = encryptor.encrypt(std::vector(16, 5), null_rng); decryptor.decrypt(ciphertext); }); #endif return std::vector {result}; } }; BOTAN_REGISTER_TEST("rsa_encrypt", RSA_ES_KAT_Tests); BOTAN_REGISTER_TEST("rsa_sign", RSA_Signature_KAT_Tests); BOTAN_REGISTER_TEST("rsa_pss", RSA_PSS_KAT_Tests); BOTAN_REGISTER_TEST("rsa_pss_raw", RSA_PSS_Raw_KAT_Tests); BOTAN_REGISTER_TEST("rsa_verify", RSA_Signature_Verify_Tests); BOTAN_REGISTER_TEST("rsa_verify_invalid", RSA_Signature_Verify_Invalid_Tests); BOTAN_REGISTER_TEST("rsa_kem", RSA_KEM_Tests); BOTAN_REGISTER_TEST("rsa_keygen", RSA_Keygen_Tests); BOTAN_REGISTER_TEST("rsa_blinding", RSA_Blinding_Tests); #endif } } botan-2.4.0/src/tests/test_runner.cpp000066400000000000000000000172371322470703100176360ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "test_runner.h" #include "tests.h" #include #include #include namespace Botan_Tests { Test_Runner::Test_Runner(std::ostream& out) : m_output(out) {} namespace { /* * This is a fast, simple, deterministic PRNG that's used for running * the tests. It is not intended to be cryptographically secure. */ class Testsuite_RNG final : public Botan::RandomNumberGenerator { public: std::string name() const override { return "Testsuite_RNG"; } void clear() override { m_a = m_b = m_c = m_d = 0; } void add_entropy(const uint8_t data[], size_t len) override { for(size_t i = 0; i != len; ++i) { m_a ^= data[i]; m_b ^= i; mix(); } } bool is_seeded() const override { return true; } void randomize(uint8_t out[], size_t len) override { for(size_t i = 0; i != len; ++i) { out[i] = static_cast(m_a); mix(); } } Testsuite_RNG(const std::vector& seed, size_t test_counter = 0) { m_d = static_cast(test_counter); add_entropy(seed.data(), seed.size()); } private: void mix() { const size_t ROUNDS = 3; for(size_t i = 0; i != ROUNDS; ++i) { m_a += i; m_a = Botan::rotl<9>(m_a); m_b ^= m_a; m_d ^= m_c; m_a += m_d; m_c += m_b; m_c = Botan::rotl<23>(m_c); } } uint32_t m_a = 0, m_b = 0, m_c = 0, m_d = 0; }; } int Test_Runner::run(const std::vector& requested_tests, const std::string& data_dir, const std::string& pkcs11_lib, const std::string& provider, bool log_success, bool run_online_tests, bool run_long_tests, const std::string& drbg_seed, size_t runs) { std::vector req = requested_tests; if(req.empty()) { /* If nothing was requested on the command line, run everything. First run the "essentials" to smoke test, then everything else in alphabetical order. */ req = {"block", "stream", "hash", "mac", "modes", "aead", "kdf", "pbkdf", "hmac_drbg", "util" }; std::set all_others = Botan_Tests::Test::registered_tests(); if(pkcs11_lib.empty()) { // do not run pkcs11 tests by default unless pkcs11-lib set for(std::set::iterator iter = all_others.begin(); iter != all_others.end();) { if((*iter).find("pkcs11") != std::string::npos) { iter = all_others.erase(iter); } else { ++iter; } } } for(auto f : req) { all_others.erase(f); } req.insert(req.end(), all_others.begin(), all_others.end()); } else if(req.size() == 1 && req.at(0) == "pkcs11") { req = {"pkcs11-manage", "pkcs11-module", "pkcs11-slot", "pkcs11-session", "pkcs11-object", "pkcs11-rsa", "pkcs11-ecdsa", "pkcs11-ecdh", "pkcs11-rng", "pkcs11-x509" }; } else { std::set all = Botan_Tests::Test::registered_tests(); for(auto const& r : req) { if(all.find(r) == all.end()) { throw Botan_Tests::Test_Error("Unknown test suite: " + r); } } } output() << "Testing " << Botan::version_string() << "\n"; output() << "Starting tests"; if(!pkcs11_lib.empty()) { output() << " pkcs11 library:" << pkcs11_lib; } Botan_Tests::Provider_Filter pf; if(!provider.empty()) { output() << " provider:" << provider; pf.set(provider); } std::vector seed = Botan::hex_decode(drbg_seed); if(seed.empty()) { const uint64_t ts = Botan_Tests::Test::timestamp(); seed.resize(8); Botan::store_be(ts, seed.data()); } output() << " drbg_seed:" << Botan::hex_encode(seed) << "\n"; Botan_Tests::Test::set_test_options(log_success, run_online_tests, run_long_tests, data_dir, pkcs11_lib, pf); for(size_t i = 0; i != runs; ++i) { std::unique_ptr rng = std::unique_ptr(new Testsuite_RNG(seed, i)); Botan_Tests::Test::set_test_rng(std::move(rng)); const size_t failed = run_tests(req, i, runs); if(failed > 0) return failed; } return 0; } namespace { std::string report_out(const std::vector& results, size_t& tests_failed, size_t& tests_ran) { std::ostringstream out; std::map combined; for(auto const& result : results) { const std::string who = result.who(); auto i = combined.find(who); if(i == combined.end()) { combined.insert(std::make_pair(who, Botan_Tests::Test::Result(who))); i = combined.find(who); } i->second.merge(result); } for(auto const& result : combined) { const bool verbose = false; out << result.second.result_string(verbose); tests_failed += result.second.tests_failed(); tests_ran += result.second.tests_run(); } return out.str(); } } size_t Test_Runner::run_tests(const std::vector& tests_to_run, size_t test_run, size_t tot_test_runs) { size_t tests_ran = 0, tests_failed = 0; const uint64_t start_time = Botan_Tests::Test::timestamp(); for(auto const& test_name : tests_to_run) { output() << test_name << ':' << std::endl; std::vector results; try { if(Test* test = Test::get_test(test_name)) { std::vector test_results = test->run(); results.insert(results.end(), test_results.begin(), test_results.end()); } else { results.push_back(Test::Result::Note(test_name, "Test missing or unavailable")); } } catch(std::exception& e) { results.push_back(Test::Result::Failure(test_name, e.what())); } catch(...) { results.push_back(Test::Result::Failure(test_name, "unknown exception")); } output() << report_out(results, tests_failed, tests_ran) << std::flush; } const uint64_t total_ns = Botan_Tests::Test::timestamp() - start_time; if(test_run == 0 && tot_test_runs == 1) output() << "Tests"; else output() << "Test run " << (1+test_run) << "/" << tot_test_runs; output() << " complete ran " << tests_ran << " tests in " << Botan_Tests::Test::format_time(total_ns) << " "; if(tests_failed > 0) { output() << tests_failed << " tests failed"; } else if(tests_ran > 0) { output() << "all tests ok"; } output() << std::endl; return tests_failed; } } botan-2.4.0/src/tests/test_runner.h000066400000000000000000000017111322470703100172710ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TEST_RUNNER_H_ #define BOTAN_TEST_RUNNER_H_ #include #include #include namespace Botan_Tests { class Test_Runner final { public: Test_Runner(std::ostream& out); int run(const std::vector& requested_tests, const std::string& data_dir, const std::string& pkcs11_lib, const std::string& provider, bool log_success, bool run_online_tests, bool run_long_tests, const std::string& drbg_seed, size_t runs); private: std::ostream& output() const { return m_output; } size_t run_tests(const std::vector& tests_to_run, size_t test_run, const size_t tot_test_runs); std::ostream& m_output; }; } #endif botan-2.4.0/src/tests/test_simd.cpp000066400000000000000000000145771322470703100172650ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_SIMD_32) #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_SIMD_32) class SIMD_32_Tests final : public Test { public: std::vector run() override { Test::Result result("SIMD_4x32"); if(Botan::CPUID::has_simd_32() == false) { result.test_note("Skipping SIMD_4x32 tests due to missing CPU support at runtime"); return {result}; } const uint32_t pat1 = 0xAABBCCDD; const uint32_t pat2 = 0x87654321; const uint32_t pat3 = 0x01234567; const uint32_t pat4 = 0xC0D0E0F0; test_eq(result, "default init", Botan::SIMD_4x32(), 0, 0, 0, 0); test_eq(result, "SIMD scalar constructor", Botan::SIMD_4x32(1, 2, 3, 4), 1, 2, 3, 4); const Botan::SIMD_4x32 splat = Botan::SIMD_4x32::splat(pat1); test_eq(result, "splat", splat, pat1, pat1, pat1, pat1); const Botan::SIMD_4x32 input(pat1, pat2, pat3, pat4); Botan::SIMD_4x32 rol = input.rotl<3>(); test_eq(result, "rotl", rol, Botan::rotl<3>(pat1), Botan::rotl<3>(pat2), Botan::rotl<3>(pat3), Botan::rotl<3>(pat4)); Botan::SIMD_4x32 ror = input.rotr<9>(); test_eq(result, "rotr", ror, Botan::rotr<9>(pat1), Botan::rotr<9>(pat2), Botan::rotr<9>(pat3), Botan::rotr<9>(pat4)); Botan::SIMD_4x32 add = input + splat; test_eq(result, "add +", add, pat1 + pat1, pat2 + pat1, pat3 + pat1, pat4 + pat1); add -= splat; test_eq(result, "sub -=", add, pat1, pat2, pat3, pat4); add += splat; test_eq(result, "add +=", add, pat1 + pat1, pat2 + pat1, pat3 + pat1, pat4 + pat1); test_eq(result, "xor", input ^ splat, 0, pat2 ^ pat1, pat3 ^ pat1, pat4 ^ pat1); test_eq(result, "or", input | splat, pat1, pat2 | pat1, pat3 | pat1, pat4 | pat1); test_eq(result, "and", input & splat, pat1, pat2 & pat1, pat3 & pat1, pat4 & pat1); Botan::SIMD_4x32 blender = input; blender |= splat; test_eq(result, "|=", blender, pat1, pat2 | pat1, pat3 | pat1, pat4 | pat1); blender &= splat; test_eq(result, "&=", blender, pat1, pat1, pat1, pat1); blender ^= splat; test_eq(result, "^=", blender, 0, 0, 0, 0); blender = ~blender; test_eq(result, "~", blender, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); blender = blender.shr<23>(); test_eq(result, ">>", blender, 0x1FF, 0x1FF, 0x1FF, 0x1FF); blender = blender.shl<27>(); test_eq(result, "<<", blender, 0xF8000000, 0xF8000000, 0xF8000000, 0xF8000000); blender = ~blender; test_eq(result, "~", blender, 0x7FFFFFF, 0x7FFFFFF, 0x7FFFFFF, 0x7FFFFFF); blender = input.andc(~blender); test_eq(result, "andc", blender, ~pat1 & 0xF8000000, ~pat2 & 0xF8000000, ~pat3 & 0xF8000000, ~pat4 & 0xF8000000); test_eq(result, "bswap", input.bswap(), Botan::reverse_bytes(pat1), Botan::reverse_bytes(pat2), Botan::reverse_bytes(pat3), Botan::reverse_bytes(pat4)); Botan::SIMD_4x32 t1(pat1, pat2, pat3, pat4); Botan::SIMD_4x32 t2(pat1 + 1, pat2 + 1, pat3 + 1, pat4 + 1); Botan::SIMD_4x32 t3(pat1 + 2, pat2 + 2, pat3 + 2, pat4 + 2); Botan::SIMD_4x32 t4(pat1 + 3, pat2 + 3, pat3 + 3, pat4 + 3); Botan::SIMD_4x32::transpose(t1, t2, t3, t4); test_eq(result, "transpose t1", t1, pat1, pat1 + 1, pat1 + 2, pat1 + 3); test_eq(result, "transpose t2", t2, pat2, pat2 + 1, pat2 + 2, pat2 + 3); test_eq(result, "transpose t3", t3, pat3, pat3 + 1, pat3 + 2, pat3 + 3); test_eq(result, "transpose t4", t4, pat4, pat4 + 1, pat4 + 2, pat4 + 3); return {result}; } private: void test_eq(Test::Result& result, const std::string& op, const Botan::SIMD_4x32& simd, uint32_t exp0, uint32_t exp1, uint32_t exp2, uint32_t exp3) { uint8_t mem_be[16]; simd.store_be(mem_be); result.test_int_eq("SIMD_4x32 " + op + " elem0 BE", Botan::make_uint32(mem_be[ 0], mem_be[ 1], mem_be[ 2], mem_be[ 3]), exp0); result.test_int_eq("SIMD_4x32 " + op + " elem1 BE", Botan::make_uint32(mem_be[ 4], mem_be[ 5], mem_be[ 6], mem_be[ 7]), exp1); result.test_int_eq("SIMD_4x32 " + op + " elem2 BE", Botan::make_uint32(mem_be[ 8], mem_be[ 9], mem_be[10], mem_be[11]), exp2); result.test_int_eq("SIMD_4x32 " + op + " elem3 BE", Botan::make_uint32(mem_be[12], mem_be[13], mem_be[14], mem_be[15]), exp3); // Check load_be+store_be results in same value const Botan::SIMD_4x32 reloaded_be = Botan::SIMD_4x32::load_be(mem_be); uint8_t mem_be2[16]; reloaded_be.store_be(mem_be2); result.test_eq(nullptr, "SIMD_4x32 load_be", mem_be, 16, mem_be2, 16); uint8_t mem_le[16]; simd.store_le(mem_le); result.test_int_eq("SIMD_4x32 " + op + " elem0 LE", Botan::make_uint32(mem_le[ 3], mem_le[ 2], mem_le[ 1], mem_le[ 0]), exp0); result.test_int_eq("SIMD_4x32 " + op + " elem1 LE", Botan::make_uint32(mem_le[ 7], mem_le[ 6], mem_le[ 5], mem_le[ 4]), exp1); result.test_int_eq("SIMD_4x32 " + op + " elem2 LE", Botan::make_uint32(mem_le[11], mem_le[10], mem_le[ 9], mem_le[ 8]), exp2); result.test_int_eq("SIMD_4x32 " + op + " elem3 LE", Botan::make_uint32(mem_le[15], mem_le[14], mem_le[13], mem_le[12]), exp3); // Check load_le+store_le results in same value const Botan::SIMD_4x32 reloaded_le = Botan::SIMD_4x32::load_le(mem_le); uint8_t mem_le2[16]; reloaded_le.store_le(mem_le2); result.test_eq(nullptr, "SIMD_4x32 load_le", mem_le, 16, mem_le2, 16); } }; BOTAN_REGISTER_TEST("simd_32", SIMD_32_Tests); #endif } botan-2.4.0/src/tests/test_siv.cpp000066400000000000000000000032161322470703100171160ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_AEAD_SIV) #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_AEAD_SIV) class SIV_Tests final : public Text_Based_Test { public: SIV_Tests() : Text_Based_Test("siv_ad.vec", "Key,Nonce,ADs,In,Out") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector key = get_req_bin(vars, "Key"); const std::vector nonce = get_opt_bin(vars, "Nonce"); const std::vector input = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); const std::vector ad_list = Botan::split_on(get_req_str(vars, "ADs"), ','); Test::Result result(algo + "/SIV"); std::unique_ptr siv( new Botan::SIV_Encryption(Botan::BlockCipher::create(algo).release())); siv->set_key(key); for(size_t i = 0; i != ad_list.size(); ++i) { std::vector ad = Botan::hex_decode(ad_list[i]); siv->set_associated_data_n(i, ad.data(), ad.size()); } Botan::secure_vector buf(input.begin(), input.end()); siv->start(nonce); siv->finish(buf, 0); result.test_eq("SIV ciphertext", buf, expected); return result; } }; BOTAN_REGISTER_TEST("siv_ad", SIV_Tests); #endif } } botan-2.4.0/src/tests/test_sm2.cpp000066400000000000000000000070141322470703100170160ustar00rootroot00000000000000/* * (C) 2017 Ribose Inc * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include "test_rng.h" #if defined(BOTAN_HAS_SM2) #include #include #include "test_pubkey.h" #endif namespace Botan_Tests { #if defined(BOTAN_HAS_SM2) namespace { class SM2_Signature_KAT_Tests final : public PK_Signature_Generation_Test { public: SM2_Signature_KAT_Tests() : PK_Signature_Generation_Test( "SM2", "pubkey/sm2_sig.vec", "P,A,B,xG,yG,Order,Cofactor,Ident,Msg,x,Nonce,Signature", "Hash") {} std::string default_padding(const VarMap& vars) const override { return get_req_str(vars, "Ident") + "," + get_opt_str(vars, "Hash", "SM3"); } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override { return new Fixed_Output_Position_RNG(nonce, 1); } std::unique_ptr load_private_key(const VarMap& vars) override { // group params const BigInt p = get_req_bn(vars, "P"); const BigInt a = get_req_bn(vars, "A"); const BigInt b = get_req_bn(vars, "B"); const BigInt xG = get_req_bn(vars, "xG"); const BigInt yG = get_req_bn(vars, "yG"); const BigInt order = get_req_bn(vars, "Order"); const BigInt cofactor = get_req_bn(vars, "Cofactor"); const BigInt x = get_req_bn(vars, "x"); Botan::CurveGFp curve(p, a, b); Botan::PointGFp base_point(curve, xG, yG); Botan::EC_Group domain(curve, base_point, order, cofactor); Botan::Null_RNG null_rng; std::unique_ptr key(new Botan::SM2_Signature_PrivateKey(null_rng, domain, x)); return key; } }; BOTAN_REGISTER_TEST("sm2_sig", SM2_Signature_KAT_Tests); class SM2_Encryption_KAT_Tests final : public PK_Encryption_Decryption_Test { public: SM2_Encryption_KAT_Tests() : PK_Encryption_Decryption_Test( "SM2", "pubkey/sm2_enc.vec", "P,A,B,xG,yG,Order,Cofactor,Msg,x,Nonce,Ciphertext", "Hash") {} std::string default_padding(const VarMap& vars) const override { return get_opt_str(vars, "Hash", "SM3"); } bool clear_between_callbacks() const override { return false; } Botan::RandomNumberGenerator* test_rng(const std::vector& nonce) const override { return new Fixed_Output_Position_RNG(nonce, 1); } std::unique_ptr load_private_key(const VarMap& vars) override { // group params const BigInt p = get_req_bn(vars, "P"); const BigInt a = get_req_bn(vars, "A"); const BigInt b = get_req_bn(vars, "B"); const BigInt xG = get_req_bn(vars, "xG"); const BigInt yG = get_req_bn(vars, "yG"); const BigInt order = get_req_bn(vars, "Order"); const BigInt cofactor = get_req_bn(vars, "Cofactor"); const BigInt x = get_req_bn(vars, "x"); Botan::CurveGFp curve(p, a, b); Botan::PointGFp base_point(curve, xG, yG); Botan::EC_Group domain(curve, base_point, order, cofactor); Botan::Null_RNG null_rng; std::unique_ptr key(new Botan::SM2_Encryption_PrivateKey(null_rng, domain, x)); return key; } }; } BOTAN_REGISTER_TEST("sm2_enc", SM2_Encryption_KAT_Tests); #endif } botan-2.4.0/src/tests/test_srp6.cpp000066400000000000000000000026371322470703100172150ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_SRP6) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_SRP6) && defined(BOTAN_HAS_SHA2_32) class SRP6_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; Test::Result result("SRP6"); const std::string username = "user"; const std::string password = "Awellchosen1_to_be_sure_"; const std::string group_id = "modp/srp/1024"; const std::string hash_id = "SHA-256"; const std::vector salt = unlock(Test::rng().random_vec(16)); const Botan::BigInt verifier = Botan::generate_srp6_verifier(username, password, salt, group_id, hash_id); Botan::SRP6_Server_Session server; const Botan::BigInt B = server.step1(verifier, group_id, hash_id, Test::rng()); auto client = srp6_client_agree(username, password, group_id, hash_id, salt, B, Test::rng()); const Botan::SymmetricKey server_K = server.step2(client.first); result.test_eq("computed same keys", client.second.bits_of(), server_K.bits_of()); results.push_back(result); return results; } }; BOTAN_REGISTER_TEST("srp6", SRP6_Unit_Tests); #endif } } botan-2.4.0/src/tests/test_stream.cpp000066400000000000000000000121661322470703100176140ustar00rootroot00000000000000/* * (C) 2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_STREAM_CIPHER) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_STREAM_CIPHER) class Stream_Cipher_Tests final : public Text_Based_Test { public: Stream_Cipher_Tests(): Text_Based_Test("stream", "Key,Out", "In,Nonce,Seek") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector key = get_req_bin(vars, "Key"); const std::vector expected = get_req_bin(vars, "Out"); const std::vector nonce = get_opt_bin(vars, "Nonce"); const size_t seek = get_opt_sz(vars, "Seek", 0); std::vector input = get_opt_bin(vars, "In"); if(input.empty()) { input.resize(expected.size()); } Test::Result result(algo); const std::vector providers = provider_filter(Botan::StreamCipher::providers(algo)); if(providers.empty()) { result.note_missing("block cipher " + algo); return result; } for(auto const& provider_ask : providers) { std::unique_ptr cipher(Botan::StreamCipher::create(algo, provider_ask)); if(!cipher) { result.test_failure("Stream " + algo + " supported by " + provider_ask + " but not found"); continue; } const std::string provider(cipher->provider()); result.test_is_nonempty("provider", provider); result.test_eq(provider, cipher->name(), algo); try { std::vector buf(128); cipher->cipher1(buf.data(), buf.size()); result.test_failure("Was able to encrypt without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to encrypt with no key set fails"); } try { cipher->seek(0); result.test_failure("Was able to seek without a key being set"); } catch(Botan::Invalid_State&) { result.test_success("Trying to seek with no key set fails"); } catch(Botan::Not_Implemented&) { result.test_success("Trying to seek failed because not implemented"); } cipher->set_key(key); /* Test invalid nonce sizes. this assumes no implemented cipher supports a nonce of 65000 */ const size_t large_nonce_size = 65000; result.confirm("Stream cipher does not support very large nonce", cipher->valid_iv_length(large_nonce_size) == false); result.test_throws("Throws if invalid nonce size given", [&]() { cipher->set_iv(nullptr, large_nonce_size); }); if(nonce.size()) { if(!cipher->valid_iv_length(nonce.size())) { throw Test_Error("Invalid nonce for " + algo); } cipher->set_iv(nonce.data(), nonce.size()); } else { /* * If no nonce was set then implicitly the cipher is using a * null/empty nonce. Call set_iv with such a nonce to make sure * set_iv accepts it. */ if(!cipher->valid_iv_length(0)) { throw Test_Error("Stream cipher " + algo + " requires nonce but none provided"); } cipher->set_iv(nullptr, 0); } if(seek != 0) { cipher->seek(seek); } // Test that clone works and does not affect parent object std::unique_ptr clone(cipher->clone()); result.confirm("Clone has different pointer", cipher.get() != clone.get()); result.test_eq("Clone has same name", cipher->name(), clone->name()); clone->set_key(Test::rng().random_vec(cipher->maximum_keylength())); { std::vector buf = input; cipher->encrypt(buf); result.test_eq(provider, "encrypt", buf, expected); } cipher->clear(); try { std::vector buf(128); cipher->cipher1(buf.data(), buf.size()); result.test_failure("Was able to encrypt without a key being set (after clear)"); } catch(Botan::Invalid_State&) { result.test_success("Trying to encrypt with no key set (after clear) fails"); } } return result; } }; BOTAN_REGISTER_TEST("stream", Stream_Cipher_Tests); #endif } botan-2.4.0/src/tests/test_tests.cpp000066400000000000000000000111171322470703100174560ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" namespace Botan_Tests { /* * Test the test framework :) */ class Test_Tests final : public Test { public: std::vector run() override { /* Notation here is confusing. Idea is the result is the actual result of the test. The test_result is the result that is the testcase, and should typically be in a failure mode. */ Test::Result result("Test Framework"); // Test a few success corner cases first result.test_throws("throws pi", []() { throw 3.14159; }); // Test expected failure cases { Test::Result test_result("Testcase"); test_result.test_throws("doesn't throw", []() { }); verify_failure("test_throws", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_failure("explicitly reported failure", std::vector()); verify_failure("explicit failure", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_failure("explicitly reported failure", "test error"); verify_failure("explicit failure", result, test_result); } { verify_failure("explicit failure", result, Test::Result::Failure("test", "failure")); } { Test::Result test_result("Testcase"); std::vector vec1(5), vec2(3); test_result.test_eq("test vectors equal", vec1, vec2); verify_failure("test vectors equal", result, test_result); } { Test::Result test_result("Testcase"); size_t x = 5, y = 6; test_result.test_eq("test ints equal", x, y); verify_failure("test ints equal", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_is_nonempty("empty", ""); verify_failure("test_is_nonempty", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_lt("not less", 5, 5); verify_failure("test_lt", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_lte("not lte", 6, 5); verify_failure("test_lte", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_gte("not gte", 5, 6); verify_failure("test_gte", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_ne("string ne", "foo", "foo"); verify_failure("test_ne", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_rc_ok("test_func", -1); verify_failure("test_rc_ok", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_rc("test_func", 0, 5); verify_failure("test_rc", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_rc_fail("test_func", "testing", 0); verify_failure("test_rc_fail", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_throws("test_throws", "expected msg", []() { throw std::runtime_error("not the message"); }); verify_failure("test_throws", result, test_result); } { Test::Result test_result("Testcase"); test_result.test_throws("test_throws", "expected msg", []() { throw "not even a std::exception"; }); verify_failure("test_throws", result, test_result); } return {result}; } private: void verify_failure(const std::string& what, Test::Result& result, const Test::Result& test_result) { if(test_result.tests_failed() > 0) result.test_success("Got expected failure for " + what); else result.test_failure("Expected test to fail for " + what); } }; BOTAN_REGISTER_TEST("testcode", Test_Tests); } botan-2.4.0/src/tests/test_tls_cbc.cpp000066400000000000000000000016751322470703100177350ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_TLS_CBC) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_TLS_CBC) class TLS_CBC_Padding_Tests final : public Text_Based_Test { public: TLS_CBC_Padding_Tests() : Text_Based_Test("tls_cbc.vec", "Record,Output") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { const std::vector record = get_req_bin(vars, "Record"); const size_t output = get_req_sz(vars, "Output"); uint16_t res = Botan::TLS::check_tls_cbc_padding(record.data(), record.size()); Test::Result result("TLS CBC padding check"); result.test_eq("Expected", res, output); return result; } }; BOTAN_REGISTER_TEST("tls_cbc_padding", TLS_CBC_Padding_Tests); #endif } botan-2.4.0/src/tests/test_tls_messages.cpp000066400000000000000000000215671322470703100210170ustar00rootroot00000000000000/* * (C) 2016 Juraj Somorovsky * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_TLS) #include #include #include #include #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_TLS) Test::Result test_hello_verify_request() { Test::Result result("hello_verify_request construction"); std::vector test_data; std::vector key_data(32); Botan::SymmetricKey sk(key_data); // Compute cookie over an empty string with an empty test data Botan::TLS::Hello_Verify_Request hfr(test_data, "", sk); // Compute HMAC std::unique_ptr hmac(Botan::MessageAuthenticationCode::create("HMAC(SHA-256)")); hmac->set_key(sk); hmac->update_be(size_t(0)); hmac->update_be(size_t(0)); std::vector test = unlock(hmac->final()); result.test_eq("Cookie comparison", hfr.cookie(), test); return result; } class TLS_Message_Parsing_Test final : public Text_Based_Test { public: TLS_Message_Parsing_Test() : Text_Based_Test("tls", "Buffer,Protocol,Ciphersuite,AdditionalData,Name,Exception") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector buffer = get_req_bin(vars, "Buffer"); const std::vector protocol = get_opt_bin(vars, "Protocol"); const std::vector ciphersuite = get_opt_bin(vars, "Ciphersuite"); const std::string exception = get_req_str(vars, "Exception"); const std::string expected_name = get_opt_str(vars, "Name", ""); const bool is_positive_test = exception.empty(); Test::Result result(algo + " parsing"); if(is_positive_test) { try { if(algo == "cert_verify") { Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]); Botan::TLS::Certificate_Verify message(buffer, pv); } else if(algo == "client_hello") { const std::string extensions = get_req_str(vars, "AdditionalData"); Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]); Botan::TLS::Client_Hello message(buffer); result.test_eq("Protocol version", message.version().to_string(), pv.to_string()); std::vector buf; for(Botan::TLS::Handshake_Extension_Type const& type : message.extension_types()) { uint16_t u16type = type; buf.push_back(Botan::get_byte(0, u16type)); buf.push_back(Botan::get_byte(1, u16type)); } result.test_eq("Hello extensions", Botan::hex_encode(buf), extensions); } else if(algo == "hello_verify") { Botan::TLS::Hello_Verify_Request message(buffer); } else if(algo == "hello_request") { Botan::TLS::Hello_Request message(buffer); } else if(algo == "new_session_ticket") { Botan::TLS::New_Session_Ticket message(buffer); } else if(algo == "server_hello") { const std::string extensions = get_req_str(vars, "AdditionalData"); Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]); Botan::TLS::Ciphersuite cs = Botan::TLS::Ciphersuite::by_id(Botan::make_uint16(ciphersuite[0], ciphersuite[1])); Botan::TLS::Server_Hello message(buffer); result.test_eq("Protocol version", message.version().to_string(), pv.to_string()); result.confirm("Ciphersuite", (message.ciphersuite() == cs.ciphersuite_code())); std::vector buf; for(Botan::TLS::Handshake_Extension_Type const& type : message.extension_types()) { uint16_t u16type = type; buf.push_back(Botan::get_byte(0, u16type)); buf.push_back(Botan::get_byte(1, u16type)); } result.test_eq("Hello extensions", Botan::hex_encode(buf), extensions); } else if(algo == "alert") { Botan::secure_vector sb(buffer.begin(), buffer.end()); Botan::TLS::Alert message(sb); result.test_lt("Alert type vectors result to UNKNOWN_CA or ACCESS_DENIED, which is shorter than 15", message.type_string().size(), 15); } else if(algo == "cert_status") { Botan::TLS::Certificate_Status message(buffer); std::shared_ptr resp = message.response(); if(result.confirm("Decoded response", resp != nullptr)) { const std::vector CNs = resp->signer_name().get_attribute("CN"); // This is not requird by OCSP protocol, we are just using it as a test here if(result.test_eq("OCSP response has signer name", CNs.size(), 1)) { result.test_eq("Expected name", CNs[0], expected_name); } } } else { throw Test_Error("Unknown message type " + algo + " in TLS parsing tests"); } result.test_success("Correct parsing"); } catch(std::exception& e) { result.test_failure(e.what()); } } else { if(algo == "cert_verify") { Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]); result.test_throws("invalid cert_verify input", exception, [&buffer, &pv]() { Botan::TLS::Certificate_Verify message(buffer, pv); }); } else if(algo == "client_hello") { result.test_throws("invalid client_hello input", exception, [&buffer]() { Botan::TLS::Client_Hello message(buffer); }); } else if(algo == "hello_verify") { result.test_throws("invalid hello_verify input", exception, [&buffer]() { Botan::TLS::Hello_Verify_Request message(buffer); }); } else if(algo == "hello_request") { result.test_throws("invalid hello_request input", exception, [&buffer]() { Botan::TLS::Hello_Request message(buffer); }); } else if(algo == "cert_status") { result.test_throws("invalid cert_status input", exception, [&buffer]() { Botan::TLS::Certificate_Status message(buffer); }); } else if(algo == "new_session_ticket") { result.test_throws("invalid new_session_ticket input", exception, [&buffer]() { Botan::TLS::New_Session_Ticket message(buffer); }); } else if(algo == "server_hello") { result.test_throws("invalid server_hello input", exception, [&buffer]() { Botan::TLS::Server_Hello message(buffer); }); } else if(algo == "alert") { result.test_throws("invalid alert input", exception, [&buffer]() { Botan::secure_vector sb(buffer.begin(), buffer.end()); Botan::TLS::Alert message(sb); }); } else { throw Test_Error("Unknown message type " + algo + " in TLS parsing tests"); } } return result; } std::vector run_final_tests() override { std::vector results; results.push_back(test_hello_verify_request()); return results; } }; BOTAN_REGISTER_TEST("tls_messages", TLS_Message_Parsing_Test); #endif } } botan-2.4.0/src/tests/test_tpm.cpp000066400000000000000000000060441322470703100171170ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_TPM) #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_TPM) class TPM_Tests final : public Test { public: static std::string pin_cb(const std::string&) { return "123456"; } std::vector run() override { Test::Result result("TPM"); std::unique_ptr ctx; try { ctx.reset(new Botan::TPM_Context(pin_cb, nullptr)); result.test_success("Created TPM context"); } catch(Botan::TPM_Error& e) { result.test_success("Error conecting to TPM, skipping tests"); return {result}; } try { result.test_note("TPM counter is " + std::to_string(ctx->current_counter())); Botan::TPM_RNG rng(*ctx); Botan::secure_vector output = rng.random_vec(16); result.test_ne("TPM RNG output not all zeros", output, std::vector(16)); Botan::TPM_PrivateKey key(*ctx, 1024, nullptr); result.test_success("Created TPM RSA key"); std::vector blob = key.export_blob(); // Has to be at least as large as the key result.test_gte("Blob size is reasonable", blob.size(), 1024 / 8); std::vector registered_keys = Botan::TPM_PrivateKey::registered_keys(*ctx); for(auto url : registered_keys) { result.test_note("TPM registered key " + url); } // TODO export public key // TODO generate a signature, verify it // TODO test key registration mechanisms } catch(Botan::Exception& e) { result.test_failure("TPM problem", e.what()); } return {result}; } }; BOTAN_REGISTER_TEST("tpm", TPM_Tests); class UUID_Tests final : public Test { public: std::vector run() override { Test::Result result("UUID"); const Botan::UUID empty_uuid; result.test_eq("Uninitialized UUID not valid", empty_uuid.is_valid(), false); const Botan::UUID random_uuid(Test::rng()); result.test_eq("Random UUID is valid", empty_uuid.is_valid(), false); const Botan::UUID binary_copy(random_uuid.binary_value()); result.confirm("UUID copied by binary equals original", random_uuid == binary_copy); std::string uuid_str = random_uuid.to_string(); result.test_eq("UUID string in expected format", uuid_str.size(), 36); const Botan::UUID string_copy(random_uuid.to_string()); result.confirm("UUID copied by string equals original", random_uuid == string_copy); return {result}; } }; BOTAN_REGISTER_TEST("tpm_uuid", UUID_Tests); #endif } botan-2.4.0/src/tests/test_tss.cpp000066400000000000000000000023121322470703100171220ustar00rootroot00000000000000/* * (C) 2009 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_THRESHOLD_SECRET_SHARING) #include #include #endif #include namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_THRESHOLD_SECRET_SHARING) class TSS_Tests final : public Test { public: std::vector run() override { std::vector results; Test::Result result("TSS"); uint8_t id[16]; std::iota(id, id + sizeof(id), static_cast(0)); const std::vector S = Botan::hex_decode("7465737400"); std::vector shares = Botan::RTSS_Share::split(2, 4, S.data(), S.size(), id, Test::rng()); result.test_eq("reconstruction", Botan::RTSS_Share::reconstruct(shares), S); shares.resize(shares.size() - 1); result.test_eq("reconstruction after removal", Botan::RTSS_Share::reconstruct(shares), S); results.push_back(result); return results; } }; BOTAN_REGISTER_TEST("tss", TSS_Tests); #endif // BOTAN_HAS_THRESHOLD_SECRET_SHARING } } botan-2.4.0/src/tests/test_utils.cpp000066400000000000000000000532461322470703100174650ustar00rootroot00000000000000/* * (C) 2015 Jack Lloyd * (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * (C) 2017 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #define BOTAN_NO_DEPRECATED_WARNINGS #include "tests.h" #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_BASE64_CODEC) #include #endif #if defined(BOTAN_HAS_POLY_DBL) #include #endif namespace Botan_Tests { namespace { class Utility_Function_Tests final : public Text_Based_Test { public: Utility_Function_Tests() : Text_Based_Test("util.vec", "In1,In2,Out") {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { Test::Result result("Util " + algo); if(algo == "round_up") { const size_t x = get_req_sz(vars, "In1"); const size_t to = get_req_sz(vars, "In2"); result.test_eq(algo, Botan::round_up(x, to), get_req_sz(vars, "Out")); try { Botan::round_up(x, 0); result.test_failure("round_up did not reject invalid input"); } catch(std::exception) {} } else if(algo == "round_down") { const size_t x = get_req_sz(vars, "In1"); const size_t to = get_req_sz(vars, "In2"); result.test_eq(algo, Botan::round_down(x, to), get_req_sz(vars, "Out")); result.test_eq(algo, Botan::round_down(x, 0), x); } return result; } std::vector run_final_tests() override { std::vector results; results.push_back(test_loadstore()); results.push_back(test_ct_utils()); return results; } Test::Result test_ct_utils() { Test::Result result("CT utils"); result.test_eq_sz("CT::is_zero8", Botan::CT::is_zero(0), 0xFF); result.test_eq_sz("CT::is_zero8", Botan::CT::is_zero(1), 0x00); result.test_eq_sz("CT::is_zero8", Botan::CT::is_zero(0xFF), 0x00); result.test_eq_sz("CT::is_zero16", Botan::CT::is_zero(0), 0xFFFF); result.test_eq_sz("CT::is_zero16", Botan::CT::is_zero(1), 0x0000); result.test_eq_sz("CT::is_zero16", Botan::CT::is_zero(0xFF), 0x0000); result.test_eq_sz("CT::is_zero32", Botan::CT::is_zero(0), 0xFFFFFFFF); result.test_eq_sz("CT::is_zero32", Botan::CT::is_zero(1), 0x00000000); result.test_eq_sz("CT::is_zero32", Botan::CT::is_zero(0xFF), 0x00000000); result.test_eq_sz("CT::is_less8", Botan::CT::is_less(0, 1), 0xFF); result.test_eq_sz("CT::is_less8", Botan::CT::is_less(1, 0), 0x00); result.test_eq_sz("CT::is_less8", Botan::CT::is_less(0xFF, 5), 0x00); result.test_eq_sz("CT::is_less16", Botan::CT::is_less(0, 1), 0xFFFF); result.test_eq_sz("CT::is_less16", Botan::CT::is_less(1, 0), 0x0000); result.test_eq_sz("CT::is_less16", Botan::CT::is_less(0xFFFF, 5), 0x0000); result.test_eq_sz("CT::is_less32", Botan::CT::is_less(0, 1), 0xFFFFFFFF); result.test_eq_sz("CT::is_less32", Botan::CT::is_less(1, 0), 0x00000000); result.test_eq_sz("CT::is_less32", Botan::CT::is_less(0xFFFF5, 5), 0x00000000); result.test_eq_sz("CT::is_less32", Botan::CT::is_less(0xFFFFFFFF, 5), 0x00000000); result.test_eq_sz("CT::is_less32", Botan::CT::is_less(5, 0xFFFFFFFF), 0xFFFFFFFF); return result; } Test::Result test_loadstore() { Test::Result result("Util load/store"); const std::vector membuf = Botan::hex_decode("00112233445566778899AABBCCDDEEFF"); const uint8_t* mem = membuf.data(); const uint16_t in16 = 0x1234; const uint32_t in32 = 0xA0B0C0D0; const uint64_t in64 = 0xABCDEF0123456789; result.test_is_eq(Botan::get_byte(0, in32), 0xA0); result.test_is_eq(Botan::get_byte(1, in32), 0xB0); result.test_is_eq(Botan::get_byte(2, in32), 0xC0); result.test_is_eq(Botan::get_byte(3, in32), 0xD0); result.test_is_eq(Botan::make_uint16(0xAA, 0xBB), 0xAABB); result.test_is_eq(Botan::make_uint32(0x01, 0x02, 0x03, 0x04), 0x01020304); result.test_is_eq(Botan::load_be(mem, 0), 0x0011); result.test_is_eq(Botan::load_be(mem, 1), 0x2233); result.test_is_eq(Botan::load_be(mem, 2), 0x4455); result.test_is_eq(Botan::load_be(mem, 3), 0x6677); result.test_is_eq(Botan::load_le(mem, 0), 0x1100); result.test_is_eq(Botan::load_le(mem, 1), 0x3322); result.test_is_eq(Botan::load_le(mem, 2), 0x5544); result.test_is_eq(Botan::load_le(mem, 3), 0x7766); result.test_is_eq(Botan::load_be(mem, 0), 0x00112233); result.test_is_eq(Botan::load_be(mem, 1), 0x44556677); result.test_is_eq(Botan::load_be(mem, 2), 0x8899AABB); result.test_is_eq(Botan::load_be(mem, 3), 0xCCDDEEFF); result.test_is_eq(Botan::load_le(mem, 0), 0x33221100); result.test_is_eq(Botan::load_le(mem, 1), 0x77665544); result.test_is_eq(Botan::load_le(mem, 2), 0xBBAA9988); result.test_is_eq(Botan::load_le(mem, 3), 0xFFEEDDCC); result.test_is_eq(Botan::load_be(mem, 0), 0x0011223344556677); result.test_is_eq(Botan::load_be(mem, 1), 0x8899AABBCCDDEEFF); result.test_is_eq(Botan::load_le(mem, 0), 0x7766554433221100); result.test_is_eq(Botan::load_le(mem, 1), 0xFFEEDDCCBBAA9988); // Check misaligned loads: result.test_is_eq(Botan::load_be(mem + 1, 0), 0x1122); result.test_is_eq(Botan::load_le(mem + 3, 0), 0x4433); result.test_is_eq(Botan::load_be(mem + 1, 1), 0x55667788); result.test_is_eq(Botan::load_le(mem + 3, 1), 0xAA998877); result.test_is_eq(Botan::load_be(mem + 1, 0), 0x1122334455667788); result.test_is_eq(Botan::load_le(mem + 7, 0), 0xEEDDCCBBAA998877); result.test_is_eq(Botan::load_le(mem + 5, 0), 0xCCBBAA9988776655); uint8_t outbuf[16] = { 0 }; for(size_t offset = 0; offset != 7; ++offset) { uint8_t* out = outbuf + offset; Botan::store_be(in16, out); result.test_is_eq(out[0], 0x12); result.test_is_eq(out[1], 0x34); Botan::store_le(in16, out); result.test_is_eq(out[0], 0x34); result.test_is_eq(out[1], 0x12); Botan::store_be(in32, out); result.test_is_eq(out[0], 0xA0); result.test_is_eq(out[1], 0xB0); result.test_is_eq(out[2], 0xC0); result.test_is_eq(out[3], 0xD0); Botan::store_le(in32, out); result.test_is_eq(out[0], 0xD0); result.test_is_eq(out[1], 0xC0); result.test_is_eq(out[2], 0xB0); result.test_is_eq(out[3], 0xA0); Botan::store_be(in64, out); result.test_is_eq(out[0], 0xAB); result.test_is_eq(out[1], 0xCD); result.test_is_eq(out[2], 0xEF); result.test_is_eq(out[3], 0x01); result.test_is_eq(out[4], 0x23); result.test_is_eq(out[5], 0x45); result.test_is_eq(out[6], 0x67); result.test_is_eq(out[7], 0x89); Botan::store_le(in64, out); result.test_is_eq(out[0], 0x89); result.test_is_eq(out[1], 0x67); result.test_is_eq(out[2], 0x45); result.test_is_eq(out[3], 0x23); result.test_is_eq(out[4], 0x01); result.test_is_eq(out[5], 0xEF); result.test_is_eq(out[6], 0xCD); result.test_is_eq(out[7], 0xAB); } return result; } }; BOTAN_REGISTER_TEST("util", Utility_Function_Tests); #if defined(BOTAN_HAS_POLY_DBL) class Poly_Double_Tests final : public Text_Based_Test { public: Poly_Double_Tests() : Text_Based_Test("poly_dbl.vec", "In,Out") {} Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("Polynomial doubling"); const std::vector in = get_req_bin(vars, "In"); const std::vector out = get_req_bin(vars, "Out"); std::vector b = in; Botan::poly_double_n(b.data(), b.size()); result.test_eq("Expected value", b, out); return result; } }; BOTAN_REGISTER_TEST("poly_dbl", Poly_Double_Tests); #endif class Date_Format_Tests final : public Text_Based_Test { public: Date_Format_Tests() : Text_Based_Test("dates.vec", "Date") {} std::vector parse_date(const std::string& s) { const std::vector parts = Botan::split_on(s, ','); if(parts.size() != 6) { throw Test_Error("Bad date format '" + s + "'"); } std::vector u32s; for(auto const& sub : parts) { u32s.push_back(Botan::to_u32bit(sub)); } return u32s; } Test::Result run_one_test(const std::string& type, const VarMap& vars) override { const std::string date_str = get_req_str(vars, "Date"); Test::Result result("Date parsing"); const std::vector d = parse_date(date_str); if(type == "valid" || type == "valid.not_std" || type == "valid.64_bit_time_t") { Botan::calendar_point c(d[0], d[1], d[2], d[3], d[4], d[5]); result.test_is_eq(date_str + " year", c.get_year(), d[0]); result.test_is_eq(date_str + " month", c.get_month(), d[1]); result.test_is_eq(date_str + " day", c.get_day(), d[2]); result.test_is_eq(date_str + " hour", c.get_hour(), d[3]); result.test_is_eq(date_str + " minute", c.get_minutes(), d[4]); result.test_is_eq(date_str + " second", c.get_seconds(), d[5]); if(type == "valid.not_std" || (type == "valid.64_bit_time_t" && c.get_year() > 2037 && sizeof(std::time_t) == 4)) { result.test_throws("valid but out of std::timepoint range", [c]() { c.to_std_timepoint(); }); } else { Botan::calendar_point c2 = Botan::calendar_value(c.to_std_timepoint()); result.test_is_eq(date_str + " year", c2.get_year(), d[0]); result.test_is_eq(date_str + " month", c2.get_month(), d[1]); result.test_is_eq(date_str + " day", c2.get_day(), d[2]); result.test_is_eq(date_str + " hour", c2.get_hour(), d[3]); result.test_is_eq(date_str + " minute", c2.get_minutes(), d[4]); result.test_is_eq(date_str + " second", c2.get_seconds(), d[5]); } } else if(type == "invalid") { result.test_throws("invalid date", [d]() { Botan::calendar_point c(d[0], d[1], d[2], d[3], d[4], d[5]); }); } else { throw Test_Error("Unexpected header '" + type + "' in date format tests"); } return result; } std::vector run_final_tests() override { Test::Result result("calendar_point::to_string"); Botan::calendar_point d(2008, 5, 15, 9, 30, 33); // desired format: --
T:: result.test_eq("calendar_point::to_string", d.to_string(), "2008-05-15T09:30:33"); return {result}; } }; BOTAN_REGISTER_TEST("util_dates", Date_Format_Tests); #if defined(BOTAN_HAS_BASE64_CODEC) class Base64_Tests final : public Text_Based_Test { public: Base64_Tests() : Text_Based_Test("base64.vec", "Base64", "Binary") {} Test::Result run_one_test(const std::string& type, const VarMap& vars) override { Test::Result result("Base64"); const bool is_valid = (type == "valid"); const std::string base64 = get_req_str(vars, "Base64"); try { if(is_valid) { const std::vector binary = get_req_bin(vars, "Binary"); result.test_eq("base64 decoding", Botan::base64_decode(base64), binary); result.test_eq("base64 encoding", Botan::base64_encode(binary), base64); } else { auto res = Botan::base64_decode(base64); result.test_failure("decoded invalid base64 to " + Botan::hex_encode(res)); } } catch(std::exception& e) { if(is_valid) { result.test_failure("rejected valid base64", e.what()); } else { result.test_note("rejected invalid base64"); } } return result; } std::vector run_final_tests() override { Test::Result result("Base64"); const std::string valid_b64 = "Zg=="; for(char ws_char : { ' ', '\t', '\r', '\n' }) { for(size_t i = 0; i <= valid_b64.size(); ++i) { std::string b64_ws = valid_b64; b64_ws.insert(i, 1, ws_char); try { result.test_failure("decoded whitespace base64", Botan::base64_decode(b64_ws, false)); } catch(std::exception&) {} try { result.test_eq("base64 decoding with whitespace", Botan::base64_decode(b64_ws, true), "66"); } catch(std::exception& e) { result.test_failure(b64_ws, e.what()); } } } return {result}; } }; BOTAN_REGISTER_TEST("base64", Base64_Tests); #endif class Charset_Tests final : public Text_Based_Test { public: Charset_Tests() : Text_Based_Test("charset.vec", "In,Out") {} Test::Result run_one_test(const std::string& type, const VarMap& vars) override { Test::Result result("Charset"); const std::vector in = get_req_bin(vars, "In"); const std::vector expected = get_req_bin(vars, "Out"); const std::string in_str(in.begin(), in.end()); std::string converted; if(type == "UCS2-UTF8") { converted = Botan::ucs2_to_utf8(in.data(), in.size()); } else if(type == "UCS4-UTF8") { converted = Botan::ucs4_to_utf8(in.data(), in.size()); } else if(type == "UTF8-LATIN1") { converted = Botan::utf8_to_latin1(in_str); } else if(type == "UTF16-LATIN1") { converted = Botan::Charset::transcode(in_str, Botan::Character_Set::LATIN1_CHARSET, Botan::Character_Set::UCS2_CHARSET); } else if(type == "LATIN1-UTF8") { converted = Botan::Charset::transcode(in_str, Botan::Character_Set::UTF8_CHARSET, Botan::Character_Set::LATIN1_CHARSET); } else { throw Test_Error("Unexpected header '" + type + "' in charset tests"); } result.test_eq("string converted successfully", std::vector(converted.begin(), converted.end()), expected); return result; } Test::Result utf16_to_latin1_negative_tests() { Test::Result result("Charset negative tests"); result.test_throws("conversion fails for non-Latin1 characters", []() { // "abcdefŸabcdef" std::vector input = { 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x01, 0x78, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66 }; Botan::Charset::transcode(std::string(input.begin(), input.end()), Botan::Character_Set::LATIN1_CHARSET, Botan::Character_Set::UCS2_CHARSET); }); result.test_throws("conversion fails for UTF16 string with odd number of bytes", []() { std::vector input = { 0x00, 0x61, 0x00 }; Botan::Charset::transcode(std::string(input.begin(), input.end()), Botan::Character_Set::LATIN1_CHARSET, Botan::Character_Set::UCS2_CHARSET); }); return result; } Test::Result utf8_to_latin1_negative_tests() { Test::Result result("Charset negative tests"); result.test_throws("conversion fails for non-Latin1 characters", []() { // "abcdefŸabcdef" const std::vector input = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC5, 0xB8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; Botan::utf8_to_latin1(std::string(input.begin(), input.end())); }); result.test_throws("invalid utf-8 string", []() { // sequence truncated const std::vector input = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC5 }; Botan::utf8_to_latin1(std::string(input.begin(), input.end())); }); result.test_throws("invalid utf-8 string", []() { std::vector input = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC8, 0xB8, 0x61 }; Botan::utf8_to_latin1(std::string(input.begin(), input.end())); }); return result; } std::vector run_final_tests() override { Test::Result result("Charset negative tests"); result.merge(utf16_to_latin1_negative_tests()); result.merge(utf8_to_latin1_negative_tests()); return{ result }; } }; BOTAN_REGISTER_TEST("charset", Charset_Tests); class Hostname_Tests final : public Text_Based_Test { public: Hostname_Tests() : Text_Based_Test("hostnames.vec", "Issued,Hostname") {} Test::Result run_one_test(const std::string& type, const VarMap& vars) override { Test::Result result("Hostname"); const std::string issued = get_req_str(vars, "Issued"); const std::string hostname = get_req_str(vars, "Hostname"); const bool expected = (type == "Invalid") ? false : true; const std::string what = hostname + ((expected == true) ? " matches " : " does not match ") + issued; result.test_eq(what, Botan::host_wildcard_match(issued, hostname), expected); return result; } }; BOTAN_REGISTER_TEST("hostname", Hostname_Tests); class CPUID_Tests final : public Test { public: std::vector run() override { Test::Result result("CPUID"); result.confirm("Endian is either little or big", Botan::CPUID::is_big_endian() || Botan::CPUID::is_little_endian()); if(Botan::CPUID::is_little_endian()) { result.test_eq("If endian is little, it is not also big endian", Botan::CPUID::is_big_endian(), false); } else { result.test_eq("If endian is big, it is not also little endian", Botan::CPUID::is_little_endian(), false); } const std::string cpuid_string = Botan::CPUID::to_string(); result.test_success("CPUID::to_string doesn't crash"); #if defined(BOTAN_TARGET_CPU_IS_X86_FAMILY) if(Botan::CPUID::has_sse2()) { result.confirm("Output string includes sse2", cpuid_string.find("sse2") != std::string::npos); Botan::CPUID::clear_cpuid_bit(Botan::CPUID::CPUID_SSE2_BIT); result.test_eq("After clearing cpuid bit, has_sse2 returns false", Botan::CPUID::has_sse2(), false); Botan::CPUID::initialize(); // reset state result.test_eq("After reinitializing, has_sse2 returns true", Botan::CPUID::has_sse2(), true); } #endif return {result}; } }; BOTAN_REGISTER_TEST("cpuid", CPUID_Tests); } } botan-2.4.0/src/tests/test_workfactor.cpp000066400000000000000000000024561322470703100205030ustar00rootroot00000000000000/* * (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO) class PK_Workfactor_Tests final : public Text_Based_Test { public: PK_Workfactor_Tests() : Text_Based_Test("pubkey/workfactor.vec", "ParamSize,Workfactor") {} Test::Result run_one_test(const std::string& type, const VarMap& vars) override { const size_t param_size = get_req_sz(vars, "ParamSize"); const size_t exp_output = get_req_sz(vars, "Workfactor"); size_t output = 0; // TODO: test McEliece strength tests also if(type == "RSA_Strength") { output = Botan::if_work_factor(param_size); } else if(type == "DL_Exponent_Size") { output = Botan::dl_exponent_size(param_size) / 2; } Test::Result result(type + " work factor calculation"); result.test_eq("Calculated workfactor for " + std::to_string(param_size), output, exp_output); return result; } }; BOTAN_REGISTER_TEST("pk_workfactor", PK_Workfactor_Tests); #endif } botan-2.4.0/src/tests/test_x509_dn.cpp000066400000000000000000000026141322470703100175040ustar00rootroot00000000000000/* * (C) 2017 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_CERTIFICATES) #include #include #endif namespace Botan_Tests { #if defined(BOTAN_HAS_CERTIFICATES) class X509_DN_Comparisons_Tests final : public Text_Based_Test { public: X509_DN_Comparisons_Tests() : Text_Based_Test("x509_dn.vec", "DN1,DN2") {} Test::Result run_one_test(const std::string& type, const VarMap& vars) override { const std::vector dn_bits1 = get_req_bin(vars, "DN1"); const std::vector dn_bits2 = get_req_bin(vars, "DN2"); const bool dn_same = (type == "Equal"); Test::Result result("X509_DN comparisons"); try { Botan::X509_DN dn1; Botan::BER_Decoder bd1(dn_bits1); dn1.decode_from(bd1); Botan::X509_DN dn2; Botan::BER_Decoder bd2(dn_bits2); dn2.decode_from(bd2); const bool compared_same = (dn1 == dn2); result.test_eq("Comparison matches expected", dn_same, compared_same); } catch(Botan::Exception& e) { result.test_failure(e.what()); } return result; } }; BOTAN_REGISTER_TEST("x509_dn_cmp", X509_DN_Comparisons_Tests); #endif } botan-2.4.0/src/tests/test_x509_path.cpp000066400000000000000000000472161322470703100200460ustar00rootroot00000000000000/* * (C) 2006,2011,2012,2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #include #include #include #include #include #include #endif #include #include #include #include #include #include namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EMSA_PKCS1) && defined(BOTAN_TARGET_OS_HAS_FILESYSTEM) std::map read_results(const std::string& results_file, const char delim = ':') { std::ifstream in(results_file); if(!in.good()) { throw Test_Error("Failed reading " + results_file); } std::map m; std::string line; while(in.good()) { std::getline(in, line); if(line == "") { continue; } if(line[0] == '#') { continue; } std::vector parts = Botan::split_on(line, delim); if(parts.size() != 2) { throw Test_Error("Invalid line " + line); } m[parts[0]] = parts[1]; } return m; } class X509test_Path_Validation_Tests final : public Test { public: std::vector run() override { std::vector results; // Test certs generated by https://github.com/yymax/x509test std::map expected = read_results(Test::data_file("x509/x509test/expected.txt")); // Current tests use SHA-1 const Botan::Path_Validation_Restrictions restrictions(false, 80); Botan::X509_Certificate root(Test::data_file("x509/x509test/root.pem")); Botan::Certificate_Store_In_Memory trusted; trusted.add_certificate(root); auto validation_time = Botan::calendar_point(2016, 10, 21, 4, 20, 0).to_std_timepoint(); for(auto i = expected.begin(); i != expected.end(); ++i) { Test::Result result("X509test path validation"); result.start_timer(); const std::string filename = i->first; const std::string expected_result = i->second; std::vector certs = load_cert_file(Test::data_file("x509/x509test/" + filename)); if(certs.empty()) { throw Test_Error("Failed to read certs from " + filename); } Botan::Path_Validation_Result path_result = Botan::x509_path_validate( certs, restrictions, trusted, "www.tls.test", Botan::Usage_Type::TLS_SERVER_AUTH, validation_time); if(path_result.successful_validation() && path_result.trust_root() != root) { path_result = Botan::Path_Validation_Result(Botan::Certificate_Status_Code::CANNOT_ESTABLISH_TRUST); } result.test_eq("test " + filename, path_result.result_string(), expected_result); result.end_timer(); results.push_back(result); } return results; } private: std::vector load_cert_file(const std::string& filename) { Botan::DataSource_Stream in(filename); std::vector certs; while(!in.end_of_data()) { try { certs.emplace_back(in); } catch(Botan::Decoding_Error&) {} } return certs; } }; BOTAN_REGISTER_TEST("x509_path_x509test", X509test_Path_Validation_Tests); class NIST_Path_Validation_Tests final : public Test { public: std::vector run() override; }; std::vector NIST_Path_Validation_Tests::run() { std::vector results; /** * Code to run the X.509v3 processing tests described in "Conformance * Testing of Relying Party Client Certificate Path Proccessing Logic", * which is available on NIST's web site. * * Known Failures/Problems: * - Policy extensions are not implemented, so we skip tests #34-#53. * - Tests #75 and #76 are skipped as they make use of relatively * obscure CRL extensions which are not supported. */ const std::string nist_test_dir = Test::data_dir() + "/x509/nist"; try { // Do nothing, just test filesystem access Botan::get_files_recursive(nist_test_dir); } catch(Botan::No_Filesystem_Access&) { Test::Result result("NIST path validation"); result.test_note("Skipping due to missing filesystem access"); results.push_back(result); return results; } std::map expected = read_results(Test::data_file("x509/nist/expected.txt")); const Botan::X509_Certificate root_cert(nist_test_dir + "/root.crt"); const Botan::X509_CRL root_crl(nist_test_dir + "/root.crl"); for(auto i = expected.begin(); i != expected.end(); ++i) { Test::Result result("NIST path validation"); result.start_timer(); const std::string test_name = i->first; try { const std::string expected_result = i->second; const std::string test_dir = nist_test_dir + "/" + test_name; const std::vector all_files = Botan::get_files_recursive(test_dir); if(all_files.empty()) { result.test_failure("No test files found in " + test_dir); results.push_back(result); continue; } Botan::Certificate_Store_In_Memory store; store.add_certificate(root_cert); store.add_crl(root_crl); for(auto const& file : all_files) { if(file.find(".crt") != std::string::npos && file != "end.crt") { store.add_certificate(Botan::X509_Certificate(file)); } else if(file.find(".crl") != std::string::npos) { Botan::DataSource_Stream in(file, true); Botan::X509_CRL crl(in); store.add_crl(crl); } } Botan::X509_Certificate end_user(test_dir + "/end.crt"); // 1024 bit root cert Botan::Path_Validation_Restrictions restrictions(true, 80); Botan::Path_Validation_Result validation_result = Botan::x509_path_validate(end_user, restrictions, store); result.test_eq(test_name + " path validation result", validation_result.result_string(), expected_result); } catch(std::exception& e) { result.test_failure(test_name, e.what()); } result.end_timer(); results.push_back(result); } return results; } BOTAN_REGISTER_TEST("x509_path_nist", NIST_Path_Validation_Tests); class Extended_Path_Validation_Tests final : public Test { public: std::vector run() override; }; std::vector Extended_Path_Validation_Tests::run() { std::vector results; const std::string extended_x509_test_dir = Test::data_dir() + "/x509/extended"; try { // Do nothing, just test filesystem access Botan::get_files_recursive(extended_x509_test_dir); } catch(Botan::No_Filesystem_Access&) { Test::Result result("Extended x509 path validation"); result.test_note("Skipping due to missing filesystem access"); results.push_back(result); return results; } std::map expected = read_results(Test::data_file("x509/extended/expected.txt")); for(auto i = expected.begin(); i != expected.end(); ++i) { const std::string test_name = i->first; const std::string expected_result = i->second; const std::string test_dir = extended_x509_test_dir + "/" + test_name; Test::Result result("Extended X509 path validation"); result.start_timer(); const std::vector all_files = Botan::get_files_recursive(test_dir); if(all_files.empty()) { result.test_failure("No test files found in " + test_dir); results.push_back(result); continue; } Botan::Certificate_Store_In_Memory store; for(auto const& file : all_files) { if(file.find(".crt") != std::string::npos && file != "end.crt") { store.add_certificate(Botan::X509_Certificate(file)); } } Botan::X509_Certificate end_user(test_dir + "/end.crt"); Botan::Path_Validation_Restrictions restrictions; Botan::Path_Validation_Result validation_result = Botan::x509_path_validate(end_user, restrictions, store); result.test_eq(test_name + " path validation result", validation_result.result_string(), expected_result); result.end_timer(); results.push_back(result); } return results; } BOTAN_REGISTER_TEST("x509_path_extended", Extended_Path_Validation_Tests); class PSS_Path_Validation_Tests : public Test { public: std::vector run() override; }; std::vector PSS_Path_Validation_Tests::run() { std::vector results; const std::string pss_x509_test_dir = Test::data_dir() + "/x509/pss_certs"; try { // Do nothing, just test filesystem access Botan::get_files_recursive(pss_x509_test_dir); } catch(Botan::No_Filesystem_Access&) { Test::Result result("RSA-PSS X509 signature validation"); result.test_note("Skipping due to missing filesystem access"); results.push_back(result); return results; } std::map expected = read_results(Test::data_file("x509/pss_certs/expected.txt")); std::map validation_times = read_results(Test::data_file("x509/pss_certs/validation_times.txt")); auto validation_times_iter = validation_times.begin(); for(auto i = expected.begin(); i != expected.end(); ++i) { const std::string test_name = i->first; const std::string expected_result = i->second; const std::string test_dir = pss_x509_test_dir + "/" + test_name; Test::Result result("RSA-PSS X509 signature validation"); result.start_timer(); const std::vector all_files = Botan::get_files_recursive(test_dir); if(all_files.empty()) { result.test_failure("No test files found in " + test_dir); results.push_back(result); continue; } std::shared_ptr crl; std::shared_ptr end; std::shared_ptr root; Botan::Certificate_Store_In_Memory store; std::shared_ptr csr; auto validation_time = Botan::calendar_point(std::atoi((validation_times_iter++)->second.c_str()), 0, 0, 0, 0, 0).to_std_timepoint(); for(auto const& file : all_files) { if(file.find("end.crt") != std::string::npos) { end.reset(new Botan::X509_Certificate(file)); } else if(file.find("root.crt") != std::string::npos) { root.reset(new Botan::X509_Certificate(file)); store.add_certificate(*root); } else if(file.find(".crl") != std::string::npos) { crl.reset(new Botan::X509_CRL(file)); } else if(file.find(".csr") != std::string::npos) { csr.reset(new Botan::PKCS10_Request(file)); } } if(end && crl && root) // CRL tests { const std::vector> cert_path = { end, root }; const std::vector> crls = { crl }; auto crl_status = Botan::PKIX::check_crl(cert_path, crls, validation_time); // alternatively we could just call crl.check_signature( root_pubkey ) result.test_eq(test_name + " check_crl result", Botan::Path_Validation_Result::status_string(Botan::PKIX::overall_status(crl_status)), expected_result); } else if(end && root) // CRT chain tests { // sha-1 is used Botan::Path_Validation_Restrictions restrictions(false, 80); Botan::Path_Validation_Result validation_result = Botan::x509_path_validate(*end, restrictions, store, "", Botan::Usage_Type::UNSPECIFIED, validation_time); result.test_eq(test_name + " path validation result", validation_result.result_string(), expected_result); } else if(end && !root) // CRT self signed tests { std::unique_ptr pubkey(end->subject_public_key()); result.test_eq(test_name + " verify signature", end->check_signature(*pubkey), !!(std::stoi(expected_result))); } else if(csr) // PKCS#10 Request { std::unique_ptr pubkey(csr->subject_public_key()); result.test_eq(test_name + " verify signature", csr->check_signature(*pubkey), !!(std::stoi(expected_result))); } result.end_timer(); results.push_back(result); } return results; } BOTAN_REGISTER_TEST("x509_path_rsa_pss", PSS_Path_Validation_Tests); class BSI_Path_Validation_Tests final : public Test { public: std::vector run() override; }; std::vector BSI_Path_Validation_Tests::run() { std::vector results; const std::string bsi_test_dir = Test::data_dir() + "/x509/bsi"; try { // Do nothing, just test filesystem access Botan::get_files_recursive(bsi_test_dir); } catch (Botan::No_Filesystem_Access&) { Test::Result result("BSI path validation"); result.test_note("Skipping due to missing filesystem access"); results.push_back(result); return results; } std::map expected = read_results( Test::data_file("/x509/bsi/expected.txt"), '$'); for (auto& i : expected) { const std::string test_name = i.first; const std::string expected_result = i.second; const std::string test_dir = bsi_test_dir + "/" + test_name; Test::Result result("BSI path validation"); result.start_timer(); const std::vector all_files = Botan::get_files_recursive(test_dir); if (all_files.empty()) { result.test_failure("No test files found in " + test_dir); results.push_back(result); continue; } Botan::Certificate_Store_In_Memory trusted; std::vector certs; auto validation_time = Botan::calendar_point(2017, 8, 19, 12, 0, 0).to_std_timepoint(); // By convention: if CRL is a substring if the directory name, // we need to check the CRLs bool use_crl = false; if (test_dir.find("CRL") != std::string::npos) { use_crl = true; } try { for (auto const& file : all_files) { // found a trust anchor if (file.find("TA") != std::string::npos) { trusted.add_certificate(Botan::X509_Certificate(file)); } // found the target certificate. It needs to be at the front of certs else if (file.find("TC") != std::string::npos) { certs.insert(certs.begin(), Botan::X509_Certificate(file)); } // found a certificate that might be part of a valid certificate chain to the trust anchor else if (file.find(".crt") != std::string::npos) { certs.push_back(Botan::X509_Certificate(file)); } else if (file.find(".crl") != std::string::npos) { trusted.add_crl(Botan::X509_CRL(file)); } } Botan::Path_Validation_Restrictions restrictions(use_crl, 79, use_crl); /* * Following the test document, the test are executed 16 times with * randomly chosen order of the available certificates. However, the target * certificate needs to stay in front. * For certain test, the order in which the certificates are given to * the validation function may be relevant, i.e. if issuer DNs are * ambiguous. */ auto uniform_shuffle = [](size_t m) -> size_t { size_t s; Test::rng().randomize(reinterpret_cast(&s), sizeof(s)); return s % m; }; for (size_t r = 0; r < 16; r++) { std::random_shuffle(++(certs.begin()), certs.end(), uniform_shuffle); Botan::Path_Validation_Result validation_result = Botan::x509_path_validate(certs, restrictions, trusted, "", Botan::Usage_Type::UNSPECIFIED, validation_time); // We expect to be warned if(expected_result.find("Warning: ") == 0) { std::string stripped = expected_result.substr(std::string("Warning: ").size()); bool found_warning = false; for(const auto& warning_set : validation_result.warnings()) { for(const auto& warning : warning_set) { std::string warning_str(Botan::to_string(warning)); if(stripped == warning_str) { result.test_eq(test_name + " path validation result", warning_str, stripped); found_warning = true; } } } if(!found_warning) { result.test_failure(test_name,"Did not receive the expected warning: " + stripped); } } else { result.test_eq(test_name + " path validation result", validation_result.result_string(), expected_result); } } } /* Some certificates are rejected when executing the X509_Certificate constructor * by throwing a Decoding_Error exception. */ catch (const Botan::Decoding_Error& d) { result.test_eq(test_name + " path validation result", d.what(), expected_result); } catch (const Botan::X509_CRL::X509_CRL_Error& e) { result.test_eq(test_name + " path validation result", e.what(), expected_result); } catch (const std::exception& e) { result.test_failure(test_name, e.what()); } result.end_timer(); results.push_back(result); } return results; } BOTAN_REGISTER_TEST("x509_path_bsi", BSI_Path_Validation_Tests); #endif } } botan-2.4.0/src/tests/test_xmss.cpp000066400000000000000000000052521322470703100173110ustar00rootroot00000000000000/* * Extended Hash-Based Signatures Tests * * (C) 2014,2015 Jack Lloyd * (C) 2016 Matthias Gierlings **/ #include "tests.h" #if defined(BOTAN_HAS_XMSS) #include #include "test_pubkey.h" #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_XMSS) class XMSS_Signature_Tests final : public PK_Signature_Generation_Test { public: XMSS_Signature_Tests() : PK_Signature_Generation_Test( "XMSS", "pubkey/xmss_sig.vec", "Params,Msg,PrivateKey,Signature") {} bool skip_this_test(const std::string&, const VarMap& vars) override { if(Test::run_long_tests() == false) { const std::string params = get_req_str(vars, "Params"); if(params == "SHAKE128_W16_H10") { return false; } return true; } return false; } std::string default_padding(const VarMap& vars) const override { return get_req_str(vars, "Params"); } std::unique_ptr load_private_key(const VarMap& vars) override { const std::vector raw_key = get_req_bin(vars, "PrivateKey"); const Botan::secure_vector sec_key(raw_key.begin(), raw_key.end()); std::unique_ptr key(new Botan::XMSS_PrivateKey(sec_key)); return key; } }; class XMSS_Signature_Verify_Tests final : public PK_Signature_Verification_Test { public: XMSS_Signature_Verify_Tests() : PK_Signature_Verification_Test( "XMSS", "pubkey/xmss_verify.vec", "Params,Msg,PublicKey,Signature") {} std::string default_padding(const VarMap& vars) const override { return get_req_str(vars, "Params"); } std::unique_ptr load_public_key(const VarMap& vars) override { const std::vector raw_key = get_req_bin(vars, "PublicKey"); std::unique_ptr key(new Botan::XMSS_PublicKey(raw_key)); return key; } }; class XMSS_Keygen_Tests final : public PK_Key_Generation_Test { public: std::vector keygen_params() const override { return { "XMSS_SHA2-256_W16_H10" }; } std::string algo_name() const override { return "XMSS"; } }; BOTAN_REGISTER_TEST("xmss_sign", XMSS_Signature_Tests); BOTAN_REGISTER_TEST("xmss_verify", XMSS_Signature_Verify_Tests); BOTAN_REGISTER_TEST("xmss_keygen", XMSS_Keygen_Tests); #endif } } botan-2.4.0/src/tests/tests.cpp000066400000000000000000000642631322470703100164310ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_BIGINT) #include #endif #if defined(BOTAN_HAS_EC_CURVE_GFP) #include #endif namespace Botan_Tests { Test::Registration::Registration(const std::string& name, Test* test) { if(Test::global_registry().count(name) == 0) { Test::global_registry().insert(std::make_pair(name, std::unique_ptr(test))); } else { throw Test_Error("Duplicate registration of test '" + name + "'"); } } void Test::Result::merge(const Result& other) { if(who() != other.who()) { throw Test_Error("Merging tests from different sources"); } m_ns_taken += other.m_ns_taken; m_tests_passed += other.m_tests_passed; m_fail_log.insert(m_fail_log.end(), other.m_fail_log.begin(), other.m_fail_log.end()); m_log.insert(m_log.end(), other.m_log.begin(), other.m_log.end()); } void Test::Result::start_timer() { if(m_started == 0) { m_started = Test::timestamp(); } } void Test::Result::end_timer() { if(m_started > 0) { m_ns_taken += Test::timestamp() - m_started; m_started = 0; } } void Test::Result::test_note(const std::string& note, const char* extra) { if(note != "") { std::ostringstream out; out << who() << " " << note; if(extra) { out << ": " << extra; } m_log.push_back(out.str()); } } void Test::Result::note_missing(const std::string& whatever) { static std::set s_already_seen; if(s_already_seen.count(whatever) == 0) { test_note("Skipping tests due to missing " + whatever); s_already_seen.insert(whatever); } } bool Test::Result::test_throws(const std::string& what, std::function fn) { try { fn(); return test_failure(what + " failed to throw expected exception"); } catch(std::exception& e) { return test_success(what + " threw exception " + e.what()); } catch(...) { return test_success(what + " threw unknown exception"); } } bool Test::Result::test_throws(const std::string& what, const std::string& expected, std::function fn) { try { fn(); return test_failure(what + " failed to throw expected exception"); } catch(std::exception& e) { if(expected == e.what()) { return test_success(what + " threw exception " + e.what()); } else { return test_failure(what + " failed to throw an exception with the expected text:\n Expected: " + expected + "\n Got: " + e.what()); } } catch(...) { return test_failure(what + " failed to throw an exception with the expected text:\n Expected: " + expected); } } bool Test::Result::test_success(const std::string& note) { if(Test::log_success()) { test_note(note); } ++m_tests_passed; return true; } bool Test::Result::test_failure(const std::string& what, const std::string& error) { return test_failure(who() + " " + what + " with error " + error); } void Test::Result::test_failure(const std::string& what, const uint8_t buf[], size_t buf_len) { test_failure(who() + ": " + what + " buf len " + std::to_string(buf_len) + " value " + Botan::hex_encode(buf, buf_len)); } bool Test::Result::test_failure(const std::string& err) { m_fail_log.push_back(err); return false; } bool Test::Result::test_ne(const std::string& what, const uint8_t produced[], size_t produced_len, const uint8_t expected[], size_t expected_len) { if(produced_len == expected_len && Botan::same_mem(produced, expected, expected_len)) { return test_failure(who() + ": " + what + " produced matching"); } return test_success(); } bool Test::Result::test_eq(const char* producer, const std::string& what, const uint8_t produced[], size_t produced_size, const uint8_t expected[], size_t expected_size) { if(produced_size == expected_size && Botan::same_mem(produced, expected, expected_size)) { return test_success(); } std::ostringstream err; err << who(); if(producer) { err << " producer '" << producer << "'"; } err << " unexpected result for " << what; if(produced_size != expected_size) { err << " produced " << produced_size << " bytes expected " << expected_size; } std::vector xor_diff(std::min(produced_size, expected_size)); size_t bits_different = 0; for(size_t i = 0; i != xor_diff.size(); ++i) { xor_diff[i] = produced[i] ^ expected[i]; bits_different += Botan::hamming_weight(xor_diff[i]); } err << "\nProduced: " << Botan::hex_encode(produced, produced_size) << "\nExpected: " << Botan::hex_encode(expected, expected_size); if(bits_different > 0) { err << "\nXOR Diff: " << Botan::hex_encode(xor_diff) << " (" << bits_different << " bits different)"; } return test_failure(err.str()); } bool Test::Result::test_is_nonempty(const std::string& what_is_it, const std::string& to_examine) { if(to_examine.empty()) { return test_failure(what_is_it + " was empty"); } return test_success(); } bool Test::Result::test_eq(const std::string& what, const std::string& produced, const std::string& expected) { return test_is_eq(what, produced, expected); } bool Test::Result::test_eq(const std::string& what, const char* produced, const char* expected) { return test_is_eq(what, std::string(produced), std::string(expected)); } bool Test::Result::test_eq(const std::string& what, size_t produced, size_t expected) { return test_is_eq(what, produced, expected); } bool Test::Result::test_eq_sz(const std::string& what, size_t produced, size_t expected) { return test_is_eq(what, produced, expected); } bool Test::Result::test_eq(const std::string& what, Botan::OctetString produced, Botan::OctetString expected) { std::ostringstream out; out << m_who << " " << what; if(produced == expected) { out << " produced expected result " << produced.as_string(); return test_success(out.str()); } else { out << " produced unexpected result '" << produced.as_string() << "' expected '" << expected.as_string() << "'"; return test_failure(out.str()); } } bool Test::Result::test_lt(const std::string& what, size_t produced, size_t expected) { if(produced >= expected) { std::ostringstream err; err << m_who << " " << what; err << " unexpected result " << produced << " >= " << expected; return test_failure(err.str()); } return test_success(); } bool Test::Result::test_lte(const std::string& what, size_t produced, size_t expected) { if(produced > expected) { std::ostringstream err; err << m_who << " " << what << " unexpected result " << produced << " > " << expected; return test_failure(err.str()); } return test_success(); } bool Test::Result::test_gte(const std::string& what, size_t produced, size_t expected) { if(produced < expected) { std::ostringstream err; err << m_who; err << " " << what; err << " unexpected result " << produced << " < " << expected; return test_failure(err.str()); } return test_success(); } bool Test::Result::test_ne(const std::string& what, const std::string& str1, const std::string& str2) { if(str1 != str2) { return test_success(str1 + " != " + str2); } return test_failure(who() + " " + what + " produced matching strings " + str1); } bool Test::Result::test_ne(const std::string& what, size_t produced, size_t expected) { if(produced != expected) { return test_success(); } std::ostringstream err; err << who() << " " << what << " produced " << produced << " unexpected value"; return test_failure(err.str()); } #if defined(BOTAN_HAS_BIGINT) bool Test::Result::test_eq(const std::string& what, const BigInt& produced, const BigInt& expected) { return test_is_eq(what, produced, expected); } bool Test::Result::test_ne(const std::string& what, const BigInt& produced, const BigInt& expected) { if(produced != expected) { return test_success(); } std::ostringstream err; err << who() << " " << what << " produced " << produced << " prohibited value"; return test_failure(err.str()); } #endif #if defined(BOTAN_HAS_EC_CURVE_GFP) bool Test::Result::test_eq(const std::string& what, const Botan::PointGFp& a, const Botan::PointGFp& b) { //return test_is_eq(what, a, b); if(a == b) { return test_success(); } std::ostringstream err; err << who() << " " << what << " a=(" << a.get_affine_x() << "," << a.get_affine_y() << ")" << " b=(" << b.get_affine_x() << "," << b.get_affine_y(); return test_failure(err.str()); } #endif bool Test::Result::test_eq(const std::string& what, bool produced, bool expected) { return test_is_eq(what, produced, expected); } bool Test::Result::test_rc(const std::string& func, int expected, int rc) { if(expected != rc) { std::ostringstream err; err << m_who; err << " call to " << func << " unexpectedly returned " << rc; err << " but expecting " << expected; return test_failure(err.str()); } return test_success(); } std::vector Test::possible_providers(const std::string&) { return Test::provider_filter({ "base" }); } //static std::string Test::format_time(uint64_t ns) { std::ostringstream o; if(ns > 1000000000) { o << std::setprecision(2) << std::fixed << ns / 1000000000.0 << " sec"; } else { o << std::setprecision(2) << std::fixed << ns / 1000000.0 << " msec"; } return o.str(); } std::string Test::Result::result_string(bool verbose) const { if(tests_run() == 0 && !verbose) { return ""; } std::ostringstream report; report << who() << " ran "; if(tests_run() == 0) { report << "ZERO"; } else { report << tests_run(); } report << " tests"; if(m_ns_taken > 0) { report << " in " << format_time(m_ns_taken); } if(tests_failed()) { report << " " << tests_failed() << " FAILED"; } else { report << " all ok"; } report << "\n"; for(size_t i = 0; i != m_fail_log.size(); ++i) { report << "Failure " << (i + 1) << ": " << m_fail_log[i] << "\n"; } if(m_fail_log.size() > 0 || tests_run() == 0 || verbose) { for(size_t i = 0; i != m_log.size(); ++i) { report << "Note " << (i + 1) << ": " << m_log[i] << "\n"; } } return report.str(); } std::vector Provider_Filter::filter(const std::vector& in) const { if(m_provider.empty()) { return in; } for(auto&& provider : in) { if(provider == m_provider) { return std::vector { provider }; } } return std::vector {}; } // static Test:: functions //static std::map>& Test::global_registry() { static std::map> g_test_registry; return g_test_registry; } //static uint64_t Test::timestamp() { auto now = std::chrono::high_resolution_clock::now().time_since_epoch(); return std::chrono::duration_cast(now).count(); } //static std::set Test::registered_tests() { return Botan::map_keys_as_set(Test::global_registry()); } //static Test* Test::get_test(const std::string& test_name) { auto i = Test::global_registry().find(test_name); if(i != Test::global_registry().end()) { return i->second.get(); } return nullptr; } std::string Test::read_data_file(const std::string& path) { const std::string fsname = Test::data_file(path); std::ifstream file(fsname.c_str()); if(!file.good()) { throw Test_Error("Error reading from " + fsname); } return std::string((std::istreambuf_iterator(file)), std::istreambuf_iterator()); } std::vector Test::read_binary_data_file(const std::string& path) { const std::string fsname = Test::data_file(path); std::ifstream file(fsname.c_str(), std::ios::binary); if(!file.good()) { throw Test_Error("Error reading from " + fsname); } std::vector contents; while(file.good()) { std::vector buf(4096); file.read(reinterpret_cast(buf.data()), buf.size()); size_t got = file.gcount(); if(got == 0 && file.eof()) { break; } contents.insert(contents.end(), buf.data(), buf.data() + got); } return contents; } // static member variables of Test std::unique_ptr Test::m_test_rng; std::string Test::m_data_dir; bool Test::m_log_success = false; bool Test::m_run_online_tests = false; bool Test::m_run_long_tests = false; std::string Test::m_pkcs11_lib; Botan_Tests::Provider_Filter Test::m_provider_filter; //static void Test::set_test_options(bool log_success, bool run_online, bool run_long, const std::string& data_dir, const std::string& pkcs11_lib, const Botan_Tests::Provider_Filter& pf) { m_data_dir = data_dir; m_log_success = log_success; m_run_online_tests = run_online; m_run_long_tests = run_long; m_pkcs11_lib = pkcs11_lib; m_provider_filter = pf; } //static void Test::set_test_rng(std::unique_ptr rng) { m_test_rng.reset(rng.release()); } //static std::string Test::data_file(const std::string& what) { return Test::data_dir() + "/" + what; } //static const std::string& Test::data_dir() { return m_data_dir; } //static bool Test::log_success() { return m_log_success; } //static bool Test::run_online_tests() { return m_run_online_tests; } //static bool Test::run_long_tests() { return m_run_long_tests; } //static std::string Test::pkcs11_lib() { return m_pkcs11_lib; } //static std::vector Test::provider_filter(const std::vector& in) { return m_provider_filter.filter(in); } //static Botan::RandomNumberGenerator& Test::rng() { if(!m_test_rng) { throw Test_Error("Test requires RNG but no RNG set with Test::set_test_rng"); } return *m_test_rng; } std::string Test::random_password() { const size_t len = 1 + Test::rng().next_byte() % 32; return Botan::hex_encode(Test::rng().random_vec(len)); } Text_Based_Test::Text_Based_Test(const std::string& data_src, const std::string& required_keys_str, const std::string& optional_keys_str) : m_data_src(data_src) { if(required_keys_str.empty()) { throw Test_Error("Invalid test spec"); } std::vector required_keys = Botan::split_on(required_keys_str, ','); std::vector optional_keys = Botan::split_on(optional_keys_str, ','); m_required_keys.insert(required_keys.begin(), required_keys.end()); m_optional_keys.insert(optional_keys.begin(), optional_keys.end()); m_output_key = required_keys.at(required_keys.size() - 1); } std::vector Text_Based_Test::get_req_bin(const VarMap& vars, const std::string& key) const { auto i = vars.find(key); if(i == vars.end()) { throw Test_Error("Test missing variable " + key); } try { return Botan::hex_decode(i->second); } catch(std::exception&) { throw Test_Error("Test invalid hex input '" + i->second + "'" + + " for key " + key); } } std::string Text_Based_Test::get_opt_str(const VarMap& vars, const std::string& key, const std::string& def_value) const { auto i = vars.find(key); if(i == vars.end()) { return def_value; } return i->second; } bool Text_Based_Test::get_req_bool(const VarMap& vars, const std::string& key) const { auto i = vars.find(key); if(i == vars.end()) { throw Test_Error("Test missing variable " + key); } if(i->second == "true") { return true; } else if(i->second == "false") { return false; } else { throw Test_Error("Invalid boolean for key '" + key + "' value '" + i->second + "'"); } } size_t Text_Based_Test::get_req_sz(const VarMap& vars, const std::string& key) const { auto i = vars.find(key); if(i == vars.end()) { throw Test_Error("Test missing variable " + key); } return Botan::to_u32bit(i->second); } size_t Text_Based_Test::get_opt_sz(const VarMap& vars, const std::string& key, const size_t def_value) const { auto i = vars.find(key); if(i == vars.end()) { return def_value; } return Botan::to_u32bit(i->second); } std::vector Text_Based_Test::get_opt_bin(const VarMap& vars, const std::string& key) const { auto i = vars.find(key); if(i == vars.end()) { return std::vector(); } try { return Botan::hex_decode(i->second); } catch(std::exception&) { throw Test_Error("Test invalid hex input '" + i->second + "'" + + " for key " + key); } } std::string Text_Based_Test::get_req_str(const VarMap& vars, const std::string& key) const { auto i = vars.find(key); if(i == vars.end()) { throw Test_Error("Test missing variable " + key); } return i->second; } #if defined(BOTAN_HAS_BIGINT) Botan::BigInt Text_Based_Test::get_req_bn(const VarMap& vars, const std::string& key) const { auto i = vars.find(key); if(i == vars.end()) { throw Test_Error("Test missing variable " + key); } try { return Botan::BigInt(i->second); } catch(std::exception&) { throw Test_Error("Test invalid bigint input '" + i->second + "' for key " + key); } } Botan::BigInt Text_Based_Test::get_opt_bn(const VarMap& vars, const std::string& key, const Botan::BigInt& def_value) const { auto i = vars.find(key); if(i == vars.end()) { return def_value; } try { return Botan::BigInt(i->second); } catch(std::exception&) { throw Test_Error("Test invalid bigint input '" + i->second + "' for key " + key); } } #endif std::string Text_Based_Test::get_next_line() { while(true) { if(m_cur == nullptr || m_cur->good() == false) { if(m_srcs.empty()) { if(m_first) { const std::string full_path = Test::data_dir() + "/" + m_data_src; if(full_path.find(".vec") != std::string::npos) { m_srcs.push_back(full_path); } else { const auto fs = Botan::get_files_recursive(full_path); m_srcs.assign(fs.begin(), fs.end()); if(m_srcs.empty()) { throw Test_Error("Error reading test data dir " + full_path); } } m_first = false; } else { return ""; // done } } m_cur.reset(new std::ifstream(m_srcs[0])); m_cur_src_name = m_srcs[0]; // Reinit cpuid on new file if needed if(m_cpu_flags.empty() == false) { m_cpu_flags.clear(); Botan::CPUID::initialize(); } if(!m_cur->good()) { throw Test_Error("Could not open input file '" + m_cur_src_name); } m_srcs.pop_front(); } while(m_cur->good()) { std::string line; std::getline(*m_cur, line); if(line.empty()) { continue; } if(line[0] == '#') { if(line.compare(0, 6, "#test ") == 0) { return line; } else { continue; } } return line; } } } namespace { // strips leading and trailing but not internal whitespace std::string strip_ws(const std::string& in) { const char* whitespace = " "; const auto first_c = in.find_first_not_of(whitespace); if(first_c == std::string::npos) { return ""; } const auto last_c = in.find_last_not_of(whitespace); return in.substr(first_c, last_c - first_c + 1); } std::vector parse_cpuid_bits(const std::vector& tok) { std::vector bits; for(size_t i = 1; i < tok.size(); ++i) { const std::vector more = Botan::CPUID::bit_from_string(tok[i]); bits.insert(bits.end(), more.begin(), more.end()); } return bits; } } bool Text_Based_Test::skip_this_test(const std::string& /*header*/, const VarMap& /*vars*/) { return false; } std::vector Text_Based_Test::run() { std::vector results; std::string header, header_or_name = m_data_src; VarMap vars; size_t test_cnt = 0; while(true) { const std::string line = get_next_line(); if(line.empty()) // EOF { break; } if(line.compare(0, 6, "#test ") == 0) { std::vector pragma_tokens = Botan::split_on(line.substr(6), ' '); if(pragma_tokens.empty()) { throw Test_Error("Empty pragma found in " + m_cur_src_name); } if(pragma_tokens[0] != "cpuid") { throw Test_Error("Unknown test pragma '" + line + "' in " + m_cur_src_name); } m_cpu_flags = parse_cpuid_bits(pragma_tokens); continue; } else if(line[0] == '#') { throw Test_Error("Unknown test pragma '" + line + "' in " + m_cur_src_name); } if(line[0] == '[' && line[line.size() - 1] == ']') { header = line.substr(1, line.size() - 2); header_or_name = header; test_cnt = 0; vars.clear(); continue; } const std::string test_id = "test " + std::to_string(test_cnt); auto equal_i = line.find_first_of('='); if(equal_i == std::string::npos) { results.push_back(Test::Result::Failure(header_or_name, "invalid input '" + line + "'")); continue; } std::string key = strip_ws(std::string(line.begin(), line.begin() + equal_i - 1)); std::string val = strip_ws(std::string(line.begin() + equal_i + 1, line.end())); if(m_required_keys.count(key) == 0 && m_optional_keys.count(key) == 0) results.push_back(Test::Result::Failure(header_or_name, test_id + " failed unknown key " + key)); vars[key] = val; if(key == m_output_key) { try { if(skip_this_test(header, vars)) continue; if(possible_providers(header).empty()) continue; ++test_cnt; uint64_t start = Test::timestamp(); Test::Result result = run_one_test(header, vars); if(m_cpu_flags.size() > 0) { for(auto const& cpuid_bit : m_cpu_flags) { if(Botan::CPUID::has_cpuid_bit(cpuid_bit)) { Botan::CPUID::clear_cpuid_bit(cpuid_bit); // now re-run the test result.merge(run_one_test(header, vars)); } } Botan::CPUID::initialize(); } result.set_ns_consumed(Test::timestamp() - start); if(result.tests_failed()) { if(header.empty()) result.test_note("Test #" + std::to_string(test_cnt) + " failed"); else result.test_note("Test #" + std::to_string(test_cnt) + " " + header + " failed"); } results.push_back(result); } catch(std::exception& e) { results.push_back(Test::Result::Failure(header_or_name, "test " + std::to_string(test_cnt) + " failed with exception '" + e.what() + "'")); } if(clear_between_callbacks()) { vars.clear(); } } } if(results.empty()) { return results; } try { std::vector final_tests = run_final_tests(); results.insert(results.end(), final_tests.begin(), final_tests.end()); } catch(std::exception& e) { results.push_back(Test::Result::Failure(header_or_name, "run_final_tests exception " + std::string(e.what()))); } m_first = true; return results; } } botan-2.4.0/src/tests/tests.h000066400000000000000000000424111322470703100160650ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * (C) 2015 Simon Warta (Kullo GmbH) * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_TESTS_H_ #define BOTAN_TESTS_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Botan { #if defined(BOTAN_HAS_BIGINT) class BigInt; #endif #if defined(BOTAN_HAS_EC_CURVE_GFP) class PointGFp; #endif } namespace Botan_Tests { #if defined(BOTAN_HAS_BIGINT) using Botan::BigInt; #endif class Test_Error final : public Botan::Exception { public: explicit Test_Error(const std::string& what) : Exception("Test error", what) {} }; class Provider_Filter final { public: void set(const std::string& provider) { m_provider = provider; } std::vector filter(const std::vector&) const; private: std::string m_provider; }; /* * A generic test which returns a set of results when run. * The tests may not all have the same type (for example test * "block" returns results for "AES-128" and "AES-256"). * * For most test cases you want Text_Based_Test derived below */ class Test { public: /* * Some number of test results, all associated with who() */ class Result final { public: explicit Result(const std::string& who) : m_who(who) {} size_t tests_passed() const { return m_tests_passed; } size_t tests_failed() const { return m_fail_log.size(); } size_t tests_run() const { return tests_passed() + tests_failed(); } bool any_results() const { return tests_run() > 0; } const std::string& who() const { return m_who; } std::string result_string(bool verbose) const; static Result Failure(const std::string& who, const std::string& what) { Result r(who); r.test_failure(what); return r; } static Result Note(const std::string& who, const std::string& what) { Result r(who); r.test_note(what); return r; } static Result OfExpectedFailure(bool expecting_failure, const Test::Result& result) { if(!expecting_failure) { return result; } if(result.tests_failed() == 0) { Result r = result; r.test_failure("Expected this test to fail, but it did not"); return r; } else { Result r(result.who()); r.test_note("Got expected failure"); return r; } } void merge(const Result& other); void test_note(const std::string& note, const char* extra = nullptr); template void test_note(const std::string& who, const std::vector& vec) { const std::string hex = Botan::hex_encode(vec); return test_note(who, hex.c_str()); } void note_missing(const std::string& thing); bool test_success(const std::string& note = ""); bool test_failure(const std::string& err); bool test_failure(const std::string& what, const std::string& error); void test_failure(const std::string& what, const uint8_t buf[], size_t buf_len); template void test_failure(const std::string& what, const std::vector& buf) { test_failure(what, buf.data(), buf.size()); } bool confirm(const std::string& what, bool expr) { return test_eq(what, expr, true); } template bool test_is_eq(const T& produced, const T& expected) { return test_is_eq("comparison", produced, expected); } template bool test_is_eq(const std::string& what, const T& produced, const T& expected) { std::ostringstream out; out << m_who << " " << what; if(produced == expected) { out << " produced expected result " << produced; return test_success(out.str()); } else { out << " produced unexpected result '" << produced << "' expected '" << expected << "'"; return test_failure(out.str()); } } bool test_eq(const std::string& what, const char* produced, const char* expected); bool test_is_nonempty(const std::string& what_is_it, const std::string& to_examine); bool test_eq(const std::string& what, const std::string& produced, const std::string& expected); bool test_eq(const std::string& what, bool produced, bool expected); bool test_eq(const std::string& what, size_t produced, size_t expected); bool test_eq_sz(const std::string& what, size_t produced, size_t expected); bool test_eq(const std::string& what, Botan::OctetString produced, Botan::OctetString expected); template bool test_int_eq(I1 x, I2 y, const char* what) { return test_eq(what, static_cast(x), static_cast(y)); } template bool test_int_eq(const std::string& what, I1 x, I2 y) { return test_eq(what.c_str(), static_cast(x), static_cast(y)); } bool test_lt(const std::string& what, size_t produced, size_t expected); bool test_lte(const std::string& what, size_t produced, size_t expected); bool test_gte(const std::string& what, size_t produced, size_t expected); template bool test_rc_ok(const std::string& func, T rc) { static_assert(std::is_integral::value, "Integer required."); if(rc != 0) { std::ostringstream err; err << m_who; err << " " << func; err << " unexpectedly failed with error code " << rc; return test_failure(err.str()); } return test_success(); } template bool test_rc_fail(const std::string& func, const std::string& why, T rc) { static_assert(std::is_integral::value, "Integer required."); if(rc == 0) { std::ostringstream err; err << m_who; err << " call to " << func << " unexpectedly succeeded"; err << " expecting failure because " << why; return test_failure(err.str()); } return test_success(); } bool test_rc(const std::string& func, int expected, int rc); bool test_ne(const std::string& what, size_t produced, size_t expected); bool test_ne(const std::string& what, const std::string& str1, const std::string& str2); #if defined(BOTAN_HAS_BIGINT) bool test_eq(const std::string& what, const BigInt& produced, const BigInt& expected); bool test_ne(const std::string& what, const BigInt& produced, const BigInt& expected); #endif #if defined(BOTAN_HAS_EC_CURVE_GFP) bool test_eq(const std::string& what, const Botan::PointGFp& a, const Botan::PointGFp& b); #endif bool test_eq(const char* producer, const std::string& what, const uint8_t produced[], size_t produced_len, const uint8_t expected[], size_t expected_len); bool test_ne(const std::string& what, const uint8_t produced[], size_t produced_len, const uint8_t expected[], size_t expected_len); template bool test_eq(const std::string& what, const std::vector& produced, const std::vector& expected) { return test_eq(nullptr, what, produced.data(), produced.size(), expected.data(), expected.size()); } template bool test_eq(const std::string& producer, const std::string& what, const std::vector& produced, const std::vector& expected) { return test_eq(producer.c_str(), what, produced.data(), produced.size(), expected.data(), expected.size()); } template bool test_eq(const std::string& what, const std::vector& produced, const char* expected_hex) { const std::vector expected = Botan::hex_decode(expected_hex); return test_eq(nullptr, what, produced.data(), produced.size(), expected.data(), expected.size()); } template bool test_ne(const std::string& what, const std::vector& produced, const std::vector& expected) { return test_ne(what, produced.data(), produced.size(), expected.data(), expected.size()); } bool test_throws(const std::string& what, std::function fn); bool test_throws(const std::string& what, const std::string& expected, std::function fn); void set_ns_consumed(uint64_t ns) { m_ns_taken = ns; } void start_timer(); void end_timer(); private: std::string m_who; uint64_t m_started = 0; uint64_t m_ns_taken = 0; size_t m_tests_passed = 0; std::vector m_fail_log; std::vector m_log; }; class Registration final { public: Registration(const std::string& name, Test* test); }; virtual ~Test() = default; virtual std::vector run() = 0; virtual std::vector possible_providers(const std::string&); static std::map>& global_registry(); static std::set registered_tests(); static Test* get_test(const std::string& test_name); static std::string data_file(const std::string& what); static std::string format_time(uint64_t nanoseconds); template static std::vector mutate_vec(const std::vector& v, bool maybe_resize = false, size_t min_offset = 0) { auto& rng = Test::rng(); std::vector r = v; if(maybe_resize && (r.empty() || rng.next_byte() < 32)) { // TODO: occasionally truncate, insert at random index const size_t add = 1 + (rng.next_byte() % 16); r.resize(r.size() + add); rng.randomize(&r[r.size() - add], add); } if(r.size() > min_offset) { const size_t offset = std::max(min_offset, rng.next_byte() % r.size()); const uint8_t perturb = rng.next_nonzero_byte(); r[offset] ^= perturb; } return r; } static void set_test_options(bool log_success, bool run_online_tests, bool run_long_tests, const std::string& data_dir, const std::string& pkcs11_lib, const Botan_Tests::Provider_Filter& pf); static void set_test_rng(std::unique_ptr rng); static bool log_success(); static bool run_online_tests(); static bool run_long_tests(); static std::string pkcs11_lib(); static std::vector provider_filter(const std::vector&); static const std::string& data_dir(); static std::string read_data_file(const std::string& path); static std::vector read_binary_data_file(const std::string& path); static Botan::RandomNumberGenerator& rng(); static std::string random_password(); static uint64_t timestamp(); // nanoseconds arbitrary epoch private: static std::string m_data_dir; static std::unique_ptr m_test_rng; static bool m_log_success, m_run_online_tests, m_run_long_tests; static std::string m_pkcs11_lib; static Botan_Tests::Provider_Filter m_provider_filter; }; /* * Register the test with the runner */ #define BOTAN_REGISTER_TEST(type, Test_Class) \ Test::Registration reg_ ## Test_Class ## _tests(type, new Test_Class) /* * A test based on reading an input file which contains key/value pairs * Special note: the last value in required_key (there must be at least * one), is the output key. This triggers the callback. * * Calls run_one_test with the variables set. If an ini-style [header] * is used in the file, then header will be set to that value. This allows * splitting up tests between [valid] and [invalid] tests, or different * related algorithms tested in the same file. Use the protected get_XXX * functions to retrieve formatted values from the VarMap * * If most of your tests are text-based but you find yourself with a few * odds-and-ends tests that you want to do, override run_final_tests which * can test whatever it likes and returns a vector of Results. */ class Text_Based_Test : public Test { public: Text_Based_Test(const std::string& input_file, const std::string& required_keys, const std::string& optional_keys = ""); virtual bool clear_between_callbacks() const { return true; } std::vector run() override; protected: typedef std::unordered_map VarMap; std::string get_next_line(); virtual Test::Result run_one_test(const std::string& header, const VarMap& vars) = 0; // Called before run_one_test virtual bool skip_this_test(const std::string& header, const VarMap& vars); virtual std::vector run_final_tests() { return std::vector(); } bool get_req_bool(const VarMap& vars, const std::string& key) const; std::vector get_req_bin(const VarMap& vars, const std::string& key) const; std::vector get_opt_bin(const VarMap& vars, const std::string& key) const; #if defined(BOTAN_HAS_BIGINT) Botan::BigInt get_req_bn(const VarMap& vars, const std::string& key) const; Botan::BigInt get_opt_bn(const VarMap& vars, const std::string& key, const Botan::BigInt& def_value) const; #endif std::string get_req_str(const VarMap& vars, const std::string& key) const; std::string get_opt_str(const VarMap& vars, const std::string& key, const std::string& def_value) const; size_t get_req_sz(const VarMap& vars, const std::string& key) const; size_t get_opt_sz(const VarMap& vars, const std::string& key, const size_t def_value) const; private: std::string m_data_src; std::set m_required_keys; std::set m_optional_keys; std::string m_output_key; bool m_first = true; std::unique_ptr m_cur; std::string m_cur_src_name; std::deque m_srcs; std::vector m_cpu_flags; }; } #endif botan-2.4.0/src/tests/unit_ecc.cpp000066400000000000000000000743221322470703100170550ustar00rootroot00000000000000/* * (C) 2007 Falko Strenzke * 2007 Manuel Hartl * 2009,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ECC_GROUP) #include #include #include #include #include #include #include #include #include #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECC_GROUP) Botan::BigInt test_integer(Botan::RandomNumberGenerator& rng, size_t bits, BigInt max) { /* Produces integers with long runs of ones and zeros, for testing for carry handling problems. */ Botan::BigInt x = 0; auto flip_prob = [](size_t i) -> double { if(i % 64 == 0) { return .5; } if(i % 32 == 0) { return .4; } if(i % 8 == 0) { return .05; } return .01; }; bool active = rng.next_byte() % 2; for(size_t i = 0; i != bits; ++i) { x <<= 1; x += static_cast(active); const double prob = flip_prob(i); const double sample = double(rng.next_byte() % 100) / 100.0; // biased if(sample < prob) { active = !active; } } if(max > 0) { while(x >= max) { const size_t b = x.bits() - 1; BOTAN_ASSERT(x.get_bit(b) == true, "Set"); x.clear_bit(b); } } return x; } Botan::PointGFp create_random_point(Botan::RandomNumberGenerator& rng, const Botan::CurveGFp& curve) { const Botan::BigInt& p = curve.get_p(); Botan::Modular_Reducer mod_p(p); while(true) { const Botan::BigInt x = Botan::BigInt::random_integer(rng, 1, p); const Botan::BigInt x3 = mod_p.multiply(x, mod_p.square(x)); const Botan::BigInt ax = mod_p.multiply(curve.get_a(), x); const Botan::BigInt y = mod_p.reduce(x3 + ax + curve.get_b()); const Botan::BigInt sqrt_y = ressol(y, p); if(sqrt_y > 1) { BOTAN_ASSERT_EQUAL(mod_p.square(sqrt_y), y, "Square root is correct"); Botan::PointGFp point(curve, x, sqrt_y); return point; } } } class ECC_Randomized_Tests final : public Test { public: std::vector run() override; }; std::vector ECC_Randomized_Tests::run() { std::vector results; std::set named_groups = Botan::EC_Group::known_named_groups(); for(auto const& group_name : named_groups) { Test::Result result("ECC randomized " + group_name); result.start_timer(); Botan::EC_Group group(group_name); const Botan::PointGFp& base_point = group.get_base_point(); const Botan::BigInt& group_order = group.get_order(); const Botan::PointGFp inf = base_point * group_order; result.test_eq("infinite order correct", inf.is_zero(), true); result.test_eq("infinity on the curve", inf.on_the_curve(), true); try { const size_t trials = (Test::run_long_tests() ? 10 : 3); for(size_t i = 0; i < trials; ++i) { const size_t h = 1 + (Test::rng().next_byte() % 8); Botan::Blinded_Point_Multiply blind(base_point, group_order, h); const Botan::BigInt a = Botan::BigInt::random_integer(Test::rng(), 2, group_order); const Botan::BigInt b = Botan::BigInt::random_integer(Test::rng(), 2, group_order); const Botan::BigInt c = a + b; const Botan::PointGFp P = base_point * a; const Botan::PointGFp Q = base_point * b; const Botan::PointGFp R = base_point * c; const Botan::PointGFp P1 = blind.blinded_multiply(a, Test::rng()); const Botan::PointGFp Q1 = blind.blinded_multiply(b, Test::rng()); const Botan::PointGFp R1 = blind.blinded_multiply(c, Test::rng()); const Botan::PointGFp A1 = P + Q; const Botan::PointGFp A2 = Q + P; result.test_eq("p + q", A1, R); result.test_eq("q + p", A2, R); result.test_eq("p on the curve", P.on_the_curve(), true); result.test_eq("q on the curve", Q.on_the_curve(), true); result.test_eq("r on the curve", R.on_the_curve(), true); result.test_eq("P1", P1, P); result.test_eq("Q1", Q1, Q); result.test_eq("R1", R1, R); } } catch(std::exception& e) { result.test_failure(group_name, e.what()); } result.end_timer(); results.push_back(result); } return results; } BOTAN_REGISTER_TEST("ecc_randomized", ECC_Randomized_Tests); class NIST_Curve_Reduction_Tests final : public Test { public: typedef std::function&)> reducer_fn; std::vector run() override { std::vector results; #if defined(BOTAN_HAS_NIST_PRIME_REDUCERS_W32) results.push_back(random_redc_test( "P-384", Botan::prime_p384(), [](Botan::BigInt& p, Botan::secure_vector& ws) -> void { Botan::redc_p384(p, ws); })); results.push_back(random_redc_test( "P-256", Botan::prime_p256(), [](Botan::BigInt& p, Botan::secure_vector& ws) -> void { Botan::redc_p256(p, ws); })); results.push_back(random_redc_test( "P-224", Botan::prime_p224(), [](Botan::BigInt& p, Botan::secure_vector& ws) -> void { Botan::redc_p224(p, ws); })); results.push_back(random_redc_test( "P-192", Botan::prime_p192(), [](Botan::BigInt& p, Botan::secure_vector& ws) -> void { Botan::redc_p192(p, ws); })); #endif results.push_back(random_redc_test( "P-521", Botan::prime_p521(), [](Botan::BigInt& p, Botan::secure_vector& ws) -> void { Botan::redc_p521(p, ws); })); return results; } Test::Result random_redc_test(const std::string& prime_name, const Botan::BigInt& p, reducer_fn redc_fn) { const Botan::BigInt p2 = p * p; const size_t p_bits = p.bits(); Botan::Modular_Reducer p_redc(p); Botan::secure_vector ws; Test::Result result("NIST " + prime_name + " reduction"); result.start_timer(); const size_t trials = (Test::run_long_tests() ? 128 : 16); for(size_t i = 0; i <= trials; ++i) { const Botan::BigInt x = test_integer(Test::rng(), 2 * p_bits, p2); // TODO: time and report all three approaches const Botan::BigInt v1 = x % p; const Botan::BigInt v2 = p_redc.reduce(x); Botan::BigInt v3 = x; redc_fn(v3, ws); if(!result.test_eq("reference redc", v1, v2) || !result.test_eq("specialized redc", v2, v3)) { result.test_note("failing input" + Botan::hex_encode(Botan::BigInt::encode(x))); } } result.end_timer(); return result; } }; BOTAN_REGISTER_TEST("nist_redc", NIST_Curve_Reduction_Tests); Test::Result test_groups() { Test::Result result("ECC Unit"); std::set named_groups = Botan::EC_Group::known_named_groups(); for(auto const& group_name : named_groups) { const Botan::EC_Group group(group_name); result.confirm("EC_Group is known", !group.get_oid().empty()); } return result; } Test::Result test_coordinates() { Test::Result result("ECC Unit"); const Botan::BigInt exp_affine_x("16984103820118642236896513183038186009872590470"); const Botan::BigInt exp_affine_y("1373093393927139016463695321221277758035357890939"); // precalculation const Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); const Botan::PointGFp& p_G = secp160r1.get_base_point(); const Botan::PointGFp point_exp(curve, exp_affine_x, exp_affine_y); result.confirm("Point is on the curve", point_exp.on_the_curve()); const Botan::PointGFp p1 = p_G * 2; result.test_eq("Point affine x", p1.get_affine_x(), exp_affine_x); result.test_eq("Point affine y", p1.get_affine_y(), exp_affine_y); return result; } /** Test point multiplication according to -------- SEC 2: Test Vectors for SEC 1 Certicom Research Working Draft September, 1999 Version 0.3; Section 2.1.2 -------- */ Test::Result test_point_transformation() { Test::Result result("ECC Unit"); // get a valid point Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::PointGFp p = dom_pars.get_base_point() * Test::rng().next_nonzero_byte(); // get a copy Botan::PointGFp q = p; p.randomize_repr(Test::rng()); q.randomize_repr(Test::rng()); result.test_eq("affine x after copy", p.get_affine_x(), q.get_affine_x()); result.test_eq("affine y after copy", p.get_affine_y(), q.get_affine_y()); return result; } Test::Result test_point_mult() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::PointGFp& p_G = secp160r1.get_base_point(); Botan::BigInt d_U("0xaa374ffc3ce144e6b073307972cb6d57b2a4e982"); Botan::PointGFp Q_U = d_U * p_G; result.test_eq("affine x", Q_U.get_affine_x(), Botan::BigInt("466448783855397898016055842232266600516272889280")); result.test_eq("affine y", Q_U.get_affine_y(), Botan::BigInt("1110706324081757720403272427311003102474457754220")); return result; } Test::Result test_point_negative() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::PointGFp& p_G = secp160r1.get_base_point(); const Botan::PointGFp p1 = p_G * 2; result.test_eq("affine x", p1.get_affine_x(), Botan::BigInt("16984103820118642236896513183038186009872590470")); result.test_eq("affine y", p1.get_affine_y(), Botan::BigInt("1373093393927139016463695321221277758035357890939")); const Botan::PointGFp p1_neg = -p1; result.test_eq("affine x", p1_neg.get_affine_x(), p1.get_affine_x()); result.test_eq("affine y", p1_neg.get_affine_y(), Botan::BigInt("88408243403763901739989511495005261618427168388")); return result; } Test::Result test_zeropoint() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); Botan::PointGFp p1(curve, Botan::BigInt("16984103820118642236896513183038186009872590470"), Botan::BigInt("1373093393927139016463695321221277758035357890939")); result.confirm("point is on the curve", p1.on_the_curve()); Botan::PointGFp p2 = p1; p1 -= p2; result.confirm("p - q with q = p results in zero", p1.is_zero()); return result; } Test::Result test_zeropoint_enc_dec() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); Botan::PointGFp p(curve); result.confirm("zero point is zero", p.is_zero()); std::vector sv_p = unlock(EC2OSP(p, Botan::PointGFp::UNCOMPRESSED)); result.test_eq("encoded/decode rt works", OS2ECP(sv_p, curve), p); sv_p = unlock(EC2OSP(p, Botan::PointGFp::COMPRESSED)); result.test_eq("encoded/decode compressed rt works", OS2ECP(sv_p, curve), p); sv_p = unlock(EC2OSP(p, Botan::PointGFp::HYBRID)); result.test_eq("encoded/decode hybrid rt works", OS2ECP(sv_p, curve), p); return result; } Test::Result test_calc_with_zeropoint() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); Botan::PointGFp p(curve, Botan::BigInt("16984103820118642236896513183038186009872590470"), Botan::BigInt("1373093393927139016463695321221277758035357890939")); result.confirm("point is on the curve", p.on_the_curve()); result.confirm("point is not zero", !p.is_zero()); Botan::PointGFp zero(curve); result.confirm("zero point is zero", zero.is_zero()); Botan::PointGFp res = p + zero; result.test_eq("point + 0 equals the point", p, res); res = p - zero; result.test_eq("point - 0 equals the point", p, res); res = zero * 32432243; result.confirm("point * 0 is the zero point", res.is_zero()); return result; } Test::Result test_add_point() { Test::Result result("ECC Unit"); // precalculation Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); const Botan::PointGFp& p_G = secp160r1.get_base_point(); Botan::PointGFp p0 = p_G; Botan::PointGFp p1 = p_G * 2; p1 += p0; Botan::PointGFp expected(curve, Botan::BigInt("704859595002530890444080436569091156047721708633"), Botan::BigInt("1147993098458695153857594941635310323215433166682")); result.test_eq("point addition", p1, expected); return result; } Test::Result test_sub_point() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); const Botan::PointGFp& p_G = secp160r1.get_base_point(); Botan::PointGFp p0 = p_G; Botan::PointGFp p1 = p_G * 2; p1 -= p0; Botan::PointGFp expected(curve, Botan::BigInt("425826231723888350446541592701409065913635568770"), Botan::BigInt("203520114162904107873991457957346892027982641970")); result.test_eq("point subtraction", p1, expected); return result; } Test::Result test_mult_point() { Test::Result result("ECC Unit"); Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); const Botan::PointGFp& p_G = secp160r1.get_base_point(); Botan::PointGFp p0 = p_G; Botan::PointGFp p1 = p_G * 2; p1 *= p0.get_affine_x(); const Botan::BigInt exp_mult_x(std::string("967697346845926834906555988570157345422864716250")); const Botan::BigInt exp_mult_y(std::string("512319768365374654866290830075237814703869061656")); Botan::PointGFp expected(curve, exp_mult_x, exp_mult_y); result.test_eq("point mult", p1, expected); return result; } Test::Result test_basic_operations() { Test::Result result("ECC Unit"); // precalculation Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); const Botan::PointGFp& p_G = secp160r1.get_base_point(); const Botan::PointGFp p0 = p_G; const Botan::PointGFp p1 = p_G * 2; result.test_eq("p1 affine x", p1.get_affine_x(), Botan::BigInt("16984103820118642236896513183038186009872590470")); result.test_eq("p1 affine y", p1.get_affine_y(), Botan::BigInt("1373093393927139016463695321221277758035357890939")); const Botan::PointGFp simplePlus = p1 + p0; const Botan::PointGFp exp_simplePlus(curve, Botan::BigInt("704859595002530890444080436569091156047721708633"), Botan::BigInt("1147993098458695153857594941635310323215433166682")); result.test_eq("point addition", simplePlus, exp_simplePlus); const Botan::PointGFp simpleMinus = p1 - p0; const Botan::PointGFp exp_simpleMinus(curve, Botan::BigInt("425826231723888350446541592701409065913635568770"), Botan::BigInt("203520114162904107873991457957346892027982641970")); result.test_eq("point subtraction", simpleMinus, exp_simpleMinus); const Botan::PointGFp simpleMult = p1 * 123456789; result.test_eq("point mult affine x", simpleMult.get_affine_x(), Botan::BigInt("43638877777452195295055270548491599621118743290")); result.test_eq("point mult affine y", simpleMult.get_affine_y(), Botan::BigInt("56841378500012376527163928510402662349220202981")); return result; } Test::Result test_enc_dec_compressed_160() { Test::Result result("ECC Unit"); // Test for compressed conversion (02/03) 160bit Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); const std::vector G_comp = Botan::hex_decode("024A96B5688EF573284664698968C38BB913CBFC82"); const Botan::PointGFp p = Botan::OS2ECP(G_comp, curve); std::vector sv_result = unlock(Botan::EC2OSP(p, Botan::PointGFp::COMPRESSED)); result.test_eq("result", sv_result, G_comp); return result; } Test::Result test_enc_dec_compressed_256() { Test::Result result("ECC Unit"); // Test for compressed conversion (02/03) 256bit std::string p_secp = "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"; std::string a_secp = "ffffffff00000001000000000000000000000000ffffffffffffffffffffffFC"; std::string b_secp = "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"; std::string G_secp_comp = "036B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"; std::vector sv_p_secp = Botan::hex_decode(p_secp); std::vector sv_a_secp = Botan::hex_decode(a_secp); std::vector sv_b_secp = Botan::hex_decode(b_secp); std::vector sv_G_secp_comp = Botan::hex_decode(G_secp_comp); Botan::BigInt bi_p_secp = Botan::BigInt::decode(sv_p_secp.data(), sv_p_secp.size()); Botan::BigInt bi_a_secp = Botan::BigInt::decode(sv_a_secp.data(), sv_a_secp.size()); Botan::BigInt bi_b_secp = Botan::BigInt::decode(sv_b_secp.data(), sv_b_secp.size()); Botan::CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); Botan::PointGFp p_G = OS2ECP(sv_G_secp_comp, curve); std::vector sv_result = unlock(EC2OSP(p_G, Botan::PointGFp::COMPRESSED)); result.test_eq("compressed_256", sv_result, sv_G_secp_comp); return result; } Test::Result test_enc_dec_uncompressed_112() { Test::Result result("ECC Unit"); // Test for uncompressed conversion (04) 112bit std::string p_secp = "db7c2abf62e35e668076bead208b"; std::string a_secp = "6127C24C05F38A0AAAF65C0EF02C"; std::string b_secp = "51DEF1815DB5ED74FCC34C85D709"; std::string G_secp_uncomp = "044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97"; std::vector sv_p_secp = Botan::hex_decode(p_secp); std::vector sv_a_secp = Botan::hex_decode(a_secp); std::vector sv_b_secp = Botan::hex_decode(b_secp); std::vector sv_G_secp_uncomp = Botan::hex_decode(G_secp_uncomp); Botan::BigInt bi_p_secp = Botan::BigInt::decode(sv_p_secp.data(), sv_p_secp.size()); Botan::BigInt bi_a_secp = Botan::BigInt::decode(sv_a_secp.data(), sv_a_secp.size()); Botan::BigInt bi_b_secp = Botan::BigInt::decode(sv_b_secp.data(), sv_b_secp.size()); Botan::CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); Botan::PointGFp p_G = OS2ECP(sv_G_secp_uncomp, curve); std::vector sv_result = unlock(EC2OSP(p_G, Botan::PointGFp::UNCOMPRESSED)); result.test_eq("uncompressed_112", sv_result, sv_G_secp_uncomp); return result; } Test::Result test_enc_dec_uncompressed_521() { Test::Result result("ECC Unit"); // Test for uncompressed conversion(04) with big values(521 bit) std::string p_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; std::string a_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"; std::string b_secp = "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"; std::string G_secp_uncomp = "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"; std::vector sv_p_secp = Botan::hex_decode(p_secp); std::vector sv_a_secp = Botan::hex_decode(a_secp); std::vector sv_b_secp = Botan::hex_decode(b_secp); std::vector sv_G_secp_uncomp = Botan::hex_decode(G_secp_uncomp); Botan::BigInt bi_p_secp = Botan::BigInt::decode(sv_p_secp.data(), sv_p_secp.size()); Botan::BigInt bi_a_secp = Botan::BigInt::decode(sv_a_secp.data(), sv_a_secp.size()); Botan::BigInt bi_b_secp = Botan::BigInt::decode(sv_b_secp.data(), sv_b_secp.size()); Botan::CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); Botan::PointGFp p_G = Botan::OS2ECP(sv_G_secp_uncomp, curve); std::vector sv_result = unlock(EC2OSP(p_G, Botan::PointGFp::UNCOMPRESSED)); result.test_eq("expected", sv_result, sv_G_secp_uncomp); return result; } Test::Result test_enc_dec_uncompressed_521_prime_too_large() { Test::Result result("ECC Unit"); // Test for uncompressed conversion(04) with big values(521 bit) std::string p_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; // length increased by "ff" std::string a_secp = "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFC"; std::string b_secp = "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"; std::string G_secp_uncomp = "0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2ffA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"; std::vector sv_p_secp = Botan::hex_decode(p_secp); std::vector sv_a_secp = Botan::hex_decode(a_secp); std::vector sv_b_secp = Botan::hex_decode(b_secp); std::vector sv_G_secp_uncomp = Botan::hex_decode(G_secp_uncomp); Botan::BigInt bi_p_secp = Botan::BigInt::decode(sv_p_secp.data(), sv_p_secp.size()); Botan::BigInt bi_a_secp = Botan::BigInt::decode(sv_a_secp.data(), sv_a_secp.size()); Botan::BigInt bi_b_secp = Botan::BigInt::decode(sv_b_secp.data(), sv_b_secp.size()); Botan::CurveGFp secp521r1(bi_p_secp, bi_a_secp, bi_b_secp); std::unique_ptr p_G; try { p_G = std::unique_ptr(new Botan::PointGFp(Botan::OS2ECP(sv_G_secp_uncomp, secp521r1))); result.test_failure("point decoding with too large value accepted"); } catch(std::exception&) { result.test_note("rejected invalid point"); } return result; } Test::Result test_gfp_store_restore() { Test::Result result("ECC Unit"); // generate point Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::PointGFp p = dom_pars.get_base_point(); std::vector sv_mes = unlock(EC2OSP(p, Botan::PointGFp::COMPRESSED)); Botan::PointGFp new_p = Botan::OS2ECP(sv_mes, dom_pars.get_curve()); result.test_eq("original and restored points are same", p, new_p); return result; } // maybe move this test Test::Result test_cdc_curve_33() { Test::Result result("ECC Unit"); std::string G_secp_uncomp = "04081523d03d4f12cd02879dea4bf6a4f3a7df26ed888f10c5b2235a1274c386a2f218300dee6ed217841164533bcdc903f07a096f9fbf4ee95bac098a111f296f5830fe5c35b3e344d5df3a2256985f64fbe6d0edcc4c61d18bef681dd399df3d0194c5a4315e012e0245ecea56365baa9e8be1f7"; std::vector sv_G_uncomp = Botan::hex_decode(G_secp_uncomp); Botan::BigInt bi_p_secp = Botan::BigInt("2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"); Botan::BigInt bi_a_secp("0xa377dede6b523333d36c78e9b0eaa3bf48ce93041f6d4fc34014d08f6833807498deedd4290101c5866e8dfb589485d13357b9e78c2d7fbe9fe"); Botan::BigInt bi_b_secp("0xa9acf8c8ba617777e248509bcb4717d4db346202bf9e352cd5633731dd92a51b72a4dc3b3d17c823fcc8fbda4da08f25dea89046087342595a7"); Botan::CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); Botan::PointGFp p_G = Botan::OS2ECP(sv_G_uncomp, curve); result.confirm("point is on the curve", p_G.on_the_curve()); return result; } Test::Result test_more_zeropoint() { Test::Result result("ECC Unit"); // by Falko Botan::EC_Group secp160r1(Botan::OIDS::lookup("secp160r1")); const Botan::CurveGFp& curve = secp160r1.get_curve(); Botan::PointGFp p1(curve, Botan::BigInt("16984103820118642236896513183038186009872590470"), Botan::BigInt("1373093393927139016463695321221277758035357890939")); result.confirm("point is on the curve", p1.on_the_curve()); Botan::PointGFp minus_p1 = -p1; result.confirm("point is on the curve", minus_p1.on_the_curve()); Botan::PointGFp shouldBeZero = p1 + minus_p1; result.confirm("point is on the curve", shouldBeZero.on_the_curve()); result.confirm("point is zero", shouldBeZero.is_zero()); Botan::BigInt y1 = p1.get_affine_y(); y1 = curve.get_p() - y1; result.test_eq("minus point x", minus_p1.get_affine_x(), p1.get_affine_x()); result.test_eq("minus point y", minus_p1.get_affine_y(), y1); Botan::PointGFp zero(curve); result.confirm("zero point is on the curve", zero.on_the_curve()); result.test_eq("addition of zero does nothing", p1, p1 + zero); return result; } Test::Result test_mult_by_order() { Test::Result result("ECC Unit"); // generate point Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::PointGFp p = dom_pars.get_base_point(); Botan::PointGFp shouldBeZero = p * dom_pars.get_order(); result.confirm("G * order = 0", shouldBeZero.is_zero()); return result; } Test::Result test_point_swap() { Test::Result result("ECC Unit"); Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::PointGFp a(create_random_point(Test::rng(), dom_pars.get_curve())); Botan::PointGFp b(create_random_point(Test::rng(), dom_pars.get_curve())); b *= Botan::BigInt(Test::rng(), 20); Botan::PointGFp c(a); Botan::PointGFp d(b); d.swap(c); result.test_eq("swap correct", a, d); result.test_eq("swap correct", b, c); return result; } /** * This test verifies that the side channel attack resistant multiplication function * yields the same result as the normal (insecure) multiplication via operator*= */ Test::Result test_mult_sec_mass() { Test::Result result("ECC Unit"); Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); for(int i = 0; i < 50; i++) { try { Botan::PointGFp a(create_random_point(Test::rng(), dom_pars.get_curve())); Botan::BigInt scal(Botan::BigInt(Test::rng(), 40)); Botan::PointGFp b = a * scal; Botan::PointGFp c(a); c *= scal; result.test_eq("same result", b, c); } catch(std::exception& e) { result.test_failure("mult_sec_mass", e.what()); } } return result; } Test::Result test_curve_cp_ctor() { Test::Result result("ECC Unit"); try { Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::CurveGFp curve(dom_pars.get_curve()); } catch(std::exception& e) { result.test_failure("curve_cp_ctor", e.what()); } return result; } class ECC_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_groups()); results.push_back(test_coordinates()); results.push_back(test_point_transformation()); results.push_back(test_point_mult()); results.push_back(test_point_negative()); results.push_back(test_zeropoint()); results.push_back(test_zeropoint_enc_dec()); results.push_back(test_calc_with_zeropoint()); results.push_back(test_add_point()); results.push_back(test_sub_point()); results.push_back(test_mult_point()); results.push_back(test_basic_operations()); results.push_back(test_enc_dec_compressed_160()); results.push_back(test_enc_dec_compressed_256()); results.push_back(test_enc_dec_uncompressed_112()); results.push_back(test_enc_dec_uncompressed_521()); results.push_back(test_enc_dec_uncompressed_521_prime_too_large()); results.push_back(test_gfp_store_restore()); results.push_back(test_cdc_curve_33()); results.push_back(test_more_zeropoint()); results.push_back(test_mult_by_order()); results.push_back(test_point_swap()); results.push_back(test_mult_sec_mass()); results.push_back(test_curve_cp_ctor()); return results; } }; BOTAN_REGISTER_TEST("ecc_unit", ECC_Unit_Tests); #if defined(BOTAN_HAS_ECDSA) class ECC_Invalid_Key_Tests final : public Text_Based_Test { public: ECC_Invalid_Key_Tests() : Text_Based_Test("pubkey/ecc_invalid.vec", "SubjectPublicKey") {} bool clear_between_callbacks() const override { return false; } Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("ECC invalid keys"); const std::string encoded = get_req_str(vars, "SubjectPublicKey"); Botan::DataSource_Memory key_data(Botan::hex_decode(encoded)); std::unique_ptr key(Botan::X509::load_key(key_data)); result.test_eq("public key fails check", key->check_key(Test::rng(), false), false); return result; } }; BOTAN_REGISTER_TEST("ecc_invalid", ECC_Invalid_Key_Tests); #endif #endif } } botan-2.4.0/src/tests/unit_ecdh.cpp000066400000000000000000000036771322470703100172330ustar00rootroot00000000000000/* * ECDH tests * * (C) 2007 Manuel Hartl (hartl@flexsecure.de) * 2008 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_ECDH) #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECDH) class ECDH_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_ecdh_normal_derivation()); return results; } private: Test::Result test_ecdh_normal_derivation() { Test::Result result("ECDH key exchange"); std::vector params = { "secp256r1", "secp384r1", "secp521r1", "brainpool256r1" }; for(auto const& param : params) { try { Botan::EC_Group dom_pars(param); Botan::ECDH_PrivateKey private_a(Test::rng(), dom_pars); Botan::ECDH_PrivateKey private_b(Test::rng(), dom_pars); Botan::PK_Key_Agreement ka(private_a, Test::rng(), "KDF2(SHA-512)"); Botan::PK_Key_Agreement kb(private_b, Test::rng(), "KDF2(SHA-512)"); Botan::SymmetricKey alice_key = ka.derive_key(32, private_b.public_value()); Botan::SymmetricKey bob_key = kb.derive_key(32, private_a.public_value()); if(!result.test_eq("same derived key", alice_key.bits_of(), bob_key.bits_of())) { result.test_note("Keys where " + alice_key.as_string() + " and " + bob_key.as_string()); } } catch(Botan::Lookup_Error& e) { result.test_note("Skipping because ", e.what()); } } return result; } }; BOTAN_REGISTER_TEST("ecdh_unit", ECDH_Unit_Tests); #endif } } botan-2.4.0/src/tests/unit_ecdsa.cpp000066400000000000000000000340071322470703100173760ustar00rootroot00000000000000/* * ECDSA Tests * * (C) 2007 Falko Strenzke * 2007 Manuel Hartl * 2008,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #include #include #if defined(BOTAN_HAS_ECDSA) #include #include #include #include #include #include #include #endif #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_ECDSA) /** * Tests whether the the signing routine will work correctly in case * the integer e that is constructed from the message (thus the hash * value) is larger than n, the order of the base point. Tests the * signing function of the pk signer object */ Test::Result test_hash_larger_than_n() { Test::Result result("ECDSA Unit"); Botan::EC_Group dom_pars("secp160r1"); // n = 0x0100000000000000000001f4c8f927aed3ca752257 (21 bytes) Botan::ECDSA_PrivateKey priv_key(Test::rng(), dom_pars); std::vector message(20); std::iota(message.begin(), message.end(), static_cast(0)); auto sha1 = Botan::HashFunction::create("SHA-1"); auto sha224 = Botan::HashFunction::create("SHA-224"); if(!sha1 || !sha224) { result.test_note("Skipping due to missing SHA-1 or SHA-224"); return result; } Botan::PK_Signer pk_signer_160(priv_key, Test::rng(), "EMSA1(SHA-1)"); Botan::PK_Verifier pk_verifier_160(priv_key, "EMSA1(SHA-1)"); // Verify we can sign and verify with SHA-160 std::vector signature_160 = pk_signer_160.sign_message(message, Test::rng()); result.test_eq("message verifies", pk_verifier_160.verify_message(message, signature_160), true); // Verify we can sign and verify with SHA-224 Botan::PK_Signer pk_signer(priv_key, Test::rng(), "EMSA1(SHA-224)"); std::vector signature = pk_signer.sign_message(message, Test::rng()); Botan::PK_Verifier pk_verifier(priv_key, "EMSA1(SHA-224)"); result.test_eq("message verifies", pk_verifier.verify_message(message, signature), true); return result; } #if defined(BOTAN_HAS_X509_CERTIFICATES) Test::Result test_decode_ecdsa_X509() { Test::Result result("ECDSA Unit"); Botan::X509_Certificate cert(Test::data_file("x509/ecc/CSCA.CSCA.csca-germany.1.crt")); result.test_eq("correct signature oid", Botan::OIDS::lookup(cert.signature_algorithm().get_oid()), "ECDSA/EMSA1(SHA-224)"); result.test_eq("serial number", cert.serial_number(), Botan::hex_decode("01")); result.test_eq("authority key id", cert.authority_key_id(), cert.subject_key_id()); result.test_eq("key fingerprint", cert.fingerprint("SHA-1"), "32:42:1C:C3:EC:54:D7:E9:43:EC:51:F0:19:23:BD:85:1D:F2:1B:B9"); std::unique_ptr pubkey(cert.subject_public_key()); result.test_eq("verify self-signed signature", cert.check_signature(*pubkey), true); return result; } Test::Result test_decode_ver_link_SHA256() { Test::Result result("ECDSA Unit"); Botan::X509_Certificate root_cert(Test::data_file("x509/ecc/root2_SHA256.cer")); Botan::X509_Certificate link_cert(Test::data_file("x509/ecc/link_SHA256.cer")); std::unique_ptr pubkey(root_cert.subject_public_key()); result.confirm("verified self-signed signature", link_cert.check_signature(*pubkey)); return result; } Test::Result test_decode_ver_link_SHA1() { Botan::X509_Certificate root_cert(Test::data_file("x509/ecc/root_SHA1.163.crt")); Botan::X509_Certificate link_cert(Test::data_file("x509/ecc/link_SHA1.166.crt")); Test::Result result("ECDSA Unit"); std::unique_ptr pubkey(root_cert.subject_public_key()); result.confirm("verified self-signed signature", link_cert.check_signature(*pubkey)); return result; } #endif Test::Result test_sign_then_ver() { Test::Result result("ECDSA Unit"); Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::ECDSA_PrivateKey ecdsa(Test::rng(), dom_pars); Botan::PK_Signer signer(ecdsa, Test::rng(), "EMSA1(SHA-256)"); auto msg = Botan::hex_decode("12345678901234567890abcdef12"); std::vector sig = signer.sign_message(msg, Test::rng()); Botan::PK_Verifier verifier(ecdsa, "EMSA1(SHA-256)"); result.confirm("signature verifies", verifier.verify_message(msg, sig)); result.confirm("invalid signature rejected", !verifier.verify_message(msg, Test::mutate_vec(sig))); return result; } Test::Result test_ec_sign() { Test::Result result("ECDSA Unit"); try { Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::ECDSA_PrivateKey priv_key(Test::rng(), dom_pars); Botan::PK_Signer signer(priv_key, Test::rng(), "EMSA1(SHA-224)"); Botan::PK_Verifier verifier(priv_key, "EMSA1(SHA-224)"); for(size_t i = 0; i != 256; ++i) { signer.update(static_cast(i)); } std::vector sig = signer.signature(Test::rng()); for(size_t i = 0; i != 256; ++i) { verifier.update(static_cast(i)); } result.test_eq("ECDSA signature valid", verifier.check_signature(sig), true); // now check valid signature, different input for(size_t i = 1; i != 256; ++i) //starting from 1 { verifier.update(static_cast(i)); } result.test_eq("invalid ECDSA signature invalid", verifier.check_signature(sig), false); // now check with original input, modified signature sig[sig.size() / 2]++; for(size_t i = 0; i != 256; ++i) { verifier.update(static_cast(i)); } result.test_eq("invalid ECDSA signature invalid", verifier.check_signature(sig), false); } catch(std::exception& e) { result.test_failure("test_ec_sign", e.what()); } return result; } Test::Result test_ecdsa_create_save_load() { Test::Result result("ECDSA Unit"); std::string ecc_private_key_pem; const std::vector msg = Botan::hex_decode("12345678901234567890abcdef12"); std::vector msg_signature; try { Botan::EC_Group dom_pars(Botan::OID("1.3.132.0.8")); Botan::ECDSA_PrivateKey key(Test::rng(), dom_pars); Botan::PK_Signer signer(key, Test::rng(), "EMSA1(SHA-256)"); msg_signature = signer.sign_message(msg, Test::rng()); ecc_private_key_pem = Botan::PKCS8::PEM_encode(key); } catch(std::exception& e) { result.test_failure("create_pkcs8", e.what()); } Botan::DataSource_Memory pem_src(ecc_private_key_pem); std::unique_ptr loaded_key(Botan::PKCS8::load_key(pem_src, Test::rng())); Botan::ECDSA_PrivateKey* loaded_ec_key = dynamic_cast(loaded_key.get()); result.confirm("the loaded key could be converted into an ECDSA_PrivateKey", loaded_ec_key); if(loaded_ec_key) { result.confirm("the loaded key produces equal encoding", (ecc_private_key_pem == Botan::PKCS8::PEM_encode(*loaded_ec_key))); Botan::PK_Verifier verifier(*loaded_ec_key, "EMSA1(SHA-256)"); result.confirm("generated signature valid", verifier.verify_message(msg, msg_signature)); } return result; } Test::Result test_unusual_curve() { Test::Result result("ECDSA Unit"); //calc a curve which is not in the registry const std::string G_secp_comp = "04081523d03d4f12cd02879dea4bf6a4f3a7df26ed888f10c5b2235a1274c386a2f218300dee6ed217841164533bcdc903f07a096f9fbf4ee95bac098a111f296f5830fe5c35b3e344d5df3a2256985f64fbe6d0edcc4c61d18bef681dd399df3d0194c5a4315e012e0245ecea56365baa9e8be1f7"; const Botan::BigInt bi_p_secp("2117607112719756483104013348936480976596328609518055062007450442679169492999007105354629105748524349829824407773719892437896937279095106809"); const Botan::BigInt bi_a_secp("0x0a377dede6b523333d36c78e9b0eaa3bf48ce93041f6d4fc34014d08f6833807498deedd4290101c5866e8dfb589485d13357b9e78c2d7fbe9fe"); const Botan::BigInt bi_b_secp("0x0a9acf8c8ba617777e248509bcb4717d4db346202bf9e352cd5633731dd92a51b72a4dc3b3d17c823fcc8fbda4da08f25dea89046087342595a7"); Botan::BigInt bi_order_g("0x0e1a16196e6000000000bc7f1618d867b15bb86474418f"); Botan::CurveGFp curve(bi_p_secp, bi_a_secp, bi_b_secp); Botan::PointGFp p_G = Botan::OS2ECP(Botan::hex_decode(G_secp_comp), curve); Botan::EC_Group dom_params(curve, p_G, bi_order_g, Botan::BigInt(1)); if(!result.confirm("point is on curve", p_G.on_the_curve())) { return result; } Botan::ECDSA_PrivateKey key_odd_curve(Test::rng(), dom_params); std::string key_odd_curve_str = Botan::PKCS8::PEM_encode(key_odd_curve); Botan::DataSource_Memory key_data_src(key_odd_curve_str); std::unique_ptr loaded_key(Botan::PKCS8::load_key(key_data_src, Test::rng())); result.confirm("reloaded key", loaded_key.get()); return result; } Test::Result test_read_pkcs8() { Test::Result result("ECDSA Unit"); const std::vector msg = Botan::hex_decode("12345678901234567890abcdef12"); try { std::unique_ptr loaded_key_nodp(Botan::PKCS8::load_key( Test::data_file("x509/ecc/nodompar_private.pkcs8.pem"), Test::rng())); // anew in each test with unregistered domain-parameters Botan::ECDSA_PrivateKey* ecdsa_nodp = dynamic_cast(loaded_key_nodp.get()); if(!ecdsa_nodp) { throw Test_Error("Unable to load valid PKCS8 ECDSA key"); } Botan::PK_Signer signer(*ecdsa_nodp, Test::rng(), "EMSA1(SHA-256)"); Botan::PK_Verifier verifier(*ecdsa_nodp, "EMSA1(SHA-256)"); std::vector signature_nodp = signer.sign_message(msg, Test::rng()); result.confirm("signature valid", verifier.verify_message(msg, signature_nodp)); try { std::unique_ptr loaded_key_withdp( Botan::PKCS8::load_key(Test::data_file("x509/ecc/withdompar_private.pkcs8.pem"), Test::rng())); result.test_failure("loaded key with unknown OID"); } catch(std::exception&) { result.test_note("rejected key with unknown OID"); } } catch(std::exception& e) { result.test_failure("read_pkcs8", e.what()); } return result; } Test::Result test_curve_registry() { const std::vector oids = { "1.3.132.0.8", "1.2.840.10045.3.1.1", "1.2.840.10045.3.1.2", "1.2.840.10045.3.1.3", "1.2.840.10045.3.1.4", "1.2.840.10045.3.1.5", "1.2.840.10045.3.1.6", "1.2.840.10045.3.1.7", "1.3.132.0.9", "1.3.132.0.30", "1.3.132.0.31", "1.3.132.0.32", "1.3.132.0.33", "1.3.132.0.10", "1.3.132.0.34", "1.3.132.0.35", "1.3.36.3.3.2.8.1.1.1", "1.3.36.3.3.2.8.1.1.3", "1.3.36.3.3.2.8.1.1.5", "1.3.36.3.3.2.8.1.1.7", "1.3.36.3.3.2.8.1.1.9", "1.3.36.3.3.2.8.1.1.11", "1.3.36.3.3.2.8.1.1.13", }; Test::Result result("ECDSA Unit"); for(auto const& oid_str : oids) { try { Botan::OID oid(oid_str); Botan::EC_Group dom_pars(oid); Botan::ECDSA_PrivateKey ecdsa(Test::rng(), dom_pars); Botan::PK_Signer signer(ecdsa, Test::rng(), "EMSA1(SHA-256)"); Botan::PK_Verifier verifier(ecdsa, "EMSA1(SHA-256)"); auto msg = Botan::hex_decode("12345678901234567890abcdef12"); std::vector sig = signer.sign_message(msg, Test::rng()); result.confirm("verified signature", verifier.verify_message(msg, sig)); } catch(Botan::Invalid_Argument& e) { result.test_failure("testing " + oid_str + ": " + e.what()); } } return result; } Test::Result test_ecc_key_with_rfc5915_extensions() { Test::Result result("ECDSA Unit"); try { std::unique_ptr pkcs8( Botan::PKCS8::load_key(Test::data_file("x509/ecc/ecc_private_with_rfc5915_ext.pem"), Test::rng())); result.confirm("loaded RFC 5915 key", pkcs8.get()); result.test_eq("key is ECDSA", pkcs8->algo_name(), "ECDSA"); result.confirm("key type is ECDSA", dynamic_cast(pkcs8.get())); } catch(std::exception& e) { result.test_failure("load_rfc5915_ext", e.what()); } return result; } Test::Result test_ecc_key_with_rfc5915_parameters() { Test::Result result("ECDSA Unit"); try { std::unique_ptr pkcs8( Botan::PKCS8::load_key(Test::data_file("x509/ecc/ecc_private_with_rfc5915_parameters.pem"), Test::rng())); result.confirm("loaded RFC 5915 key", pkcs8.get()); result.test_eq("key is ECDSA", pkcs8->algo_name(), "ECDSA"); result.confirm("key type is ECDSA", dynamic_cast(pkcs8.get())); } catch(std::exception& e) { result.test_failure("load_rfc5915_params", e.what()); } return result; } class ECDSA_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_hash_larger_than_n()); #if defined(BOTAN_HAS_X509_CERTIFICATES) results.push_back(test_decode_ecdsa_X509()); results.push_back(test_decode_ver_link_SHA256()); results.push_back(test_decode_ver_link_SHA1()); #endif results.push_back(test_sign_then_ver()); results.push_back(test_ec_sign()); results.push_back(test_read_pkcs8()); results.push_back(test_ecdsa_create_save_load()); results.push_back(test_unusual_curve()); results.push_back(test_curve_registry()); results.push_back(test_ecc_key_with_rfc5915_extensions()); results.push_back(test_ecc_key_with_rfc5915_parameters()); return results; } }; BOTAN_REGISTER_TEST("ecdsa_unit", ECDSA_Unit_Tests); #endif } } botan-2.4.0/src/tests/unit_tls.cpp000066400000000000000000001513041322470703100171210ustar00rootroot00000000000000/* * (C) 2014,2015 Jack Lloyd * 2016 Matthias Gierlings * 2017 René Korthaus, Rohde & Schwarz Cybersecurity * 2017 Harry Reimann, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ // Deprecated TLS APIs are tested below #define BOTAN_NO_DEPRECATED_WARNINGS #include "tests.h" #include #include #include #include #if defined(BOTAN_HAS_TLS) #include #include #include #include #include #include #include #include #include #include #if defined(BOTAN_HAS_DSA) #include #endif #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) #include #endif #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_TLS) class Credentials_Manager_Test final : public Botan::Credentials_Manager { public: Credentials_Manager_Test(bool with_client_certs, const Botan::X509_Certificate& rsa_cert, Botan::Private_Key* rsa_key, const Botan::X509_Certificate& rsa_ca, const Botan::X509_CRL& rsa_crl, const Botan::X509_Certificate& ecdsa_cert, Botan::Private_Key* ecdsa_key, const Botan::X509_Certificate& ecdsa_ca, const Botan::X509_CRL& ecdsa_crl, const Botan::X509_Certificate* dsa_cert, Botan::Private_Key* dsa_key, const Botan::X509_Certificate* dsa_ca, Botan::X509_CRL* dsa_crl) : m_rsa_cert(rsa_cert), m_rsa_ca(rsa_ca), m_rsa_key(rsa_key), m_ecdsa_cert(ecdsa_cert), m_ecdsa_ca(ecdsa_ca), m_ecdsa_key(ecdsa_key), m_dsa_cert(dsa_cert), m_dsa_ca(dsa_ca), m_dsa_key(dsa_key), m_dsa_crl(dsa_crl) { std::unique_ptr store(new Botan::Certificate_Store_In_Memory); store->add_certificate(m_rsa_ca); store->add_certificate(m_ecdsa_ca); store->add_crl(rsa_crl); store->add_crl(ecdsa_crl); if(m_dsa_ca != nullptr) { store->add_certificate(*m_dsa_ca); } if(m_dsa_crl != nullptr) { store->add_crl(*m_dsa_crl); } m_stores.push_back(std::move(store)); m_provides_client_certs = with_client_certs; } std::vector trusted_certificate_authorities(const std::string&, const std::string&) override { std::vector v; for(auto const& store : m_stores) { v.push_back(store.get()); } return v; } std::vector cert_chain( const std::vector& cert_key_types, const std::string& type, const std::string& context) override { std::vector chain; if(type == "tls-server" || (type == "tls-client" && m_provides_client_certs)) { for(auto const& key_type : cert_key_types) { if(key_type == "RSA") { chain.push_back(m_rsa_cert); chain.push_back(m_rsa_ca); break; } else if(key_type == "ECDSA") { chain.push_back(m_ecdsa_cert); chain.push_back(m_ecdsa_ca); break; } #if defined(BOTAN_HAS_DSA) else if(key_type == "DSA") { if(m_dsa_cert == nullptr || m_dsa_ca == nullptr) { throw Test_Error("No DSA certificates set for " + type + "/" + context); } chain.push_back(*m_dsa_cert); chain.push_back(*m_dsa_ca); break; } #else BOTAN_UNUSED(context); #endif } } return chain; } Botan::Private_Key* private_key_for(const Botan::X509_Certificate& crt, const std::string&, const std::string&) override { if(crt == m_rsa_cert) { return m_rsa_key.get(); } if(crt == m_ecdsa_cert) { return m_ecdsa_key.get(); } if(crt == *m_dsa_cert) { return m_dsa_key.get(); } return nullptr; } Botan::SymmetricKey psk(const std::string& type, const std::string& context, const std::string&) override { if(type == "tls-server" && context == "session-ticket") { return Botan::SymmetricKey("AABBCCDDEEFF012345678012345678"); } if(context == "server.example.com" && type == "tls-client") { return Botan::SymmetricKey("20B602D1475F2DF888FCB60D2AE03AFD"); } if(context == "server.example.com" && type == "tls-server") { return Botan::SymmetricKey("20B602D1475F2DF888FCB60D2AE03AFD"); } throw Test_Error("No PSK set for " + type + "/" + context); } private: Botan::X509_Certificate m_rsa_cert, m_rsa_ca; std::unique_ptr m_rsa_key; Botan::X509_Certificate m_ecdsa_cert, m_ecdsa_ca; std::unique_ptr m_ecdsa_key; std::unique_ptr m_dsa_cert, m_dsa_ca; std::unique_ptr m_dsa_key; std::unique_ptr m_dsa_crl; std::vector> m_stores; bool m_provides_client_certs; }; Botan::Credentials_Manager* create_creds(Botan::RandomNumberGenerator& rng, bool with_client_certs = false) { // rsa and ecdsa are required for the tls module const Botan::EC_Group ecdsa_params("secp256r1"); const size_t rsa_params = 1024; std::unique_ptr rsa_ca_key(new Botan::RSA_PrivateKey(rng, rsa_params)); std::unique_ptr rsa_srv_key(new Botan::RSA_PrivateKey(rng, rsa_params)); std::unique_ptr ecdsa_ca_key(new Botan::ECDSA_PrivateKey(rng, ecdsa_params)); std::unique_ptr ecdsa_srv_key(new Botan::ECDSA_PrivateKey(rng, ecdsa_params)); Botan::X509_Cert_Options rsa_ca_opts("RSA Test CA/VT"); Botan::X509_Cert_Options ecdsa_ca_opts("ECDSA Test CA/VT"); rsa_ca_opts.CA_key(1); ecdsa_ca_opts.CA_key(1); const Botan::X509_Certificate rsa_ca_cert = Botan::X509::create_self_signed_cert(rsa_ca_opts, *rsa_ca_key, "SHA-256", rng); const Botan::X509_Certificate ecdsa_ca_cert = Botan::X509::create_self_signed_cert(ecdsa_ca_opts, *ecdsa_ca_key, "SHA-256", rng); const Botan::X509_Cert_Options server_opts("server.example.com"); const Botan::PKCS10_Request rsa_req = Botan::X509::create_cert_req(server_opts, *rsa_srv_key, "SHA-256", rng); const Botan::PKCS10_Request ecdsa_req = Botan::X509::create_cert_req(server_opts, *ecdsa_srv_key, "SHA-256", rng); Botan::X509_CA rsa_ca(rsa_ca_cert, *rsa_ca_key, "SHA-256", rng); Botan::X509_CA ecdsa_ca(ecdsa_ca_cert, *ecdsa_ca_key, "SHA-256", rng); typedef std::chrono::duration> years; auto now = std::chrono::system_clock::now(); const Botan::X509_Time start_time(now); const Botan::X509_Time end_time(now + years(1)); const Botan::X509_Certificate rsa_srv_cert = rsa_ca.sign_request(rsa_req, rng, start_time, end_time); const Botan::X509_Certificate ecdsa_srv_cert = ecdsa_ca.sign_request(ecdsa_req, rng, start_time, end_time); Botan::X509_CRL rsa_crl = rsa_ca.new_crl(rng); Botan::X509_CRL ecdsa_crl = ecdsa_ca.new_crl(rng); // dsa support is optional std::unique_ptr dsa_ca_key; std::unique_ptr dsa_srv_key; std::unique_ptr dsa_crl; std::unique_ptr dsa_srv_cert; std::unique_ptr dsa_ca_cert; #if defined(BOTAN_HAS_DSA) const Botan::DL_Group dsa_params("modp/ietf/2048"); dsa_ca_key.reset(new Botan::DSA_PrivateKey(rng, dsa_params)); dsa_srv_key.reset(new Botan::DSA_PrivateKey(rng, dsa_params)); Botan::X509_Cert_Options dsa_ca_opts("DSA Test CA/VT"); dsa_ca_opts.CA_key(1); dsa_ca_cert.reset(new Botan::X509_Certificate( Botan::X509::create_self_signed_cert(dsa_ca_opts, *dsa_ca_key, "SHA-256", rng))); const Botan::PKCS10_Request dsa_req = Botan::X509::create_cert_req(server_opts, *dsa_srv_key, "SHA-256", rng); Botan::X509_CA dsa_ca(*dsa_ca_cert, *dsa_ca_key, "SHA-256", rng); dsa_srv_cert.reset(new Botan::X509_Certificate( dsa_ca.sign_request(dsa_req, rng, start_time, end_time))); dsa_crl.reset(new Botan::X509_CRL(dsa_ca.new_crl(rng))); #endif Credentials_Manager_Test* cmt = new Credentials_Manager_Test( with_client_certs, rsa_srv_cert, rsa_srv_key.release(), rsa_ca_cert, rsa_crl, ecdsa_srv_cert, ecdsa_srv_key.release(), ecdsa_ca_cert, ecdsa_crl, dsa_srv_cert.release(), dsa_srv_key.release(), dsa_ca_cert.release(), dsa_crl.release()); return cmt; } std::function queue_inserter(std::vector& q) { return [&](const uint8_t buf[], size_t sz) { q.insert(q.end(), buf, buf + sz); }; } void print_alert(Botan::TLS::Alert) { } void alert_cb_with_data(Botan::TLS::Alert, const uint8_t[], size_t) { } Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version, Botan::Credentials_Manager& creds, const Botan::TLS::Policy& client_policy, const Botan::TLS::Policy& server_policy, Botan::RandomNumberGenerator& rng, Botan::TLS::Session_Manager& client_sessions, Botan::TLS::Session_Manager& server_sessions) { Test::Result result(offer_version.to_string()); result.start_timer(); for(size_t r = 1; r <= 4; ++r) { bool handshake_done = false; result.test_note("Test round " + std::to_string(r)); auto handshake_complete = [&](const Botan::TLS::Session& session) { handshake_done = true; const std::string session_report = "Session established " + session.version().to_string() + " " + session.ciphersuite().to_string() + " " + Botan::hex_encode(session.session_id()); result.test_note(session_report); if(session.version() != offer_version) { result.test_failure("Offered " + offer_version.to_string() + " got " + session.version().to_string()); } if(r <= 2) { return true; } return false; }; auto next_protocol_chooser = [&](std::vector protos) -> std::string { if(r <= 2) { result.test_eq("protocol count", protos.size(), 2); result.test_eq("protocol[0]", protos[0], "test/1"); result.test_eq("protocol[1]", protos[1], "test/2"); } return "test/3"; }; const std::vector protocols_offered = { "test/1", "test/2" }; try { std::vector c2s_traffic, s2c_traffic, client_recv, server_recv, client_sent, server_sent; std::unique_ptr server_cb(new Botan::TLS::Compat_Callbacks( queue_inserter(s2c_traffic), queue_inserter(server_recv), std::function(alert_cb_with_data), handshake_complete, nullptr, next_protocol_chooser)); // TLS::Server object constructed by new constructor using virtual callback interface. std::unique_ptr server( new Botan::TLS::Server(*server_cb, server_sessions, creds, server_policy, rng, false)); std::unique_ptr client_cb(new Botan::TLS::Compat_Callbacks( queue_inserter(c2s_traffic), queue_inserter(client_recv), std::function(alert_cb_with_data), handshake_complete)); // TLS::Client object constructed by new constructor using virtual callback interface. std::unique_ptr client( new Botan::TLS::Client(*client_cb, client_sessions, creds, client_policy, rng, Botan::TLS::Server_Information("server.example.com"), offer_version, protocols_offered)); size_t rounds = 0; // Test TLS using both new and legacy constructors. for(size_t ctor_sel = 0; ctor_sel < 2; ctor_sel++) { if(ctor_sel == 1) { c2s_traffic.clear(); s2c_traffic.clear(); server_recv.clear(); client_recv.clear(); client_sent.clear(); server_sent.clear(); // TLS::Server object constructed by legacy constructor. server.reset( new Botan::TLS::Server(queue_inserter(s2c_traffic), queue_inserter(server_recv), alert_cb_with_data, handshake_complete, server_sessions, creds, server_policy, rng, next_protocol_chooser, false)); // TLS::Client object constructed by legacy constructor. client.reset( new Botan::TLS::Client(queue_inserter(c2s_traffic), queue_inserter(client_recv), alert_cb_with_data, handshake_complete, client_sessions, creds, server_policy, rng, Botan::TLS::Server_Information("server.example.com"), offer_version, protocols_offered)); } while(true) { ++rounds; if(rounds > 25) { if(r <= 2) { result.test_failure("Still here after many rounds, deadlock?"); } break; } if(handshake_done && (client->is_closed() || server->is_closed())) { break; } if(client->is_active() && client_sent.empty()) { // Choose random application data to send const size_t c_len = 1 + ((static_cast(rng.next_byte()) << 4) ^ rng.next_byte()); client_sent = unlock(rng.random_vec(c_len)); size_t sent_so_far = 0; while(sent_so_far != client_sent.size()) { const size_t left = client_sent.size() - sent_so_far; const size_t rnd12 = (rng.next_byte() << 4) ^ rng.next_byte(); const size_t sending = std::min(left, rnd12); client->send(&client_sent[sent_so_far], sending); sent_so_far += sending; } client->send_warning_alert(Botan::TLS::Alert::NO_RENEGOTIATION); } if(server->is_active() && server_sent.empty()) { result.test_eq("server->protocol", server->next_protocol(), "test/3"); const size_t s_len = 1 + ((static_cast(rng.next_byte()) << 4) ^ rng.next_byte()); server_sent = unlock(rng.random_vec(s_len)); size_t sent_so_far = 0; while(sent_so_far != server_sent.size()) { const size_t left = server_sent.size() - sent_so_far; const size_t rnd12 = (rng.next_byte() << 4) ^ rng.next_byte(); const size_t sending = std::min(left, rnd12); server->send(&server_sent[sent_so_far], sending); sent_so_far += sending; } server->send_warning_alert(Botan::TLS::Alert::NO_RENEGOTIATION); } const bool corrupt_client_data = (r == 3); const bool corrupt_server_data = (r == 4); if(c2s_traffic.size() > 0) { /* * Use this as a temp value to hold the queues as otherwise they * might end up appending more in response to messages during the * handshake. */ std::vector input; std::swap(c2s_traffic, input); if(corrupt_server_data) { input = Test::mutate_vec(input, true, 5); size_t needed = server->received_data(input.data(), input.size()); size_t total_consumed = needed; while(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, Botan::TLS::MAX_CIPHERTEXT_SIZE + 1) && result.test_lt("Total requested is readonable", total_consumed, 128 * 1024)) { input.resize(needed); rng.randomize(input.data(), input.size()); needed = server->received_data(input.data(), input.size()); total_consumed += needed; } } else { size_t needed = server->received_data(input.data(), input.size()); result.test_eq("full packet received", needed, 0); } continue; } if(s2c_traffic.size() > 0) { std::vector input; std::swap(s2c_traffic, input); if(corrupt_client_data) { input = Test::mutate_vec(input, true, 5); size_t needed = client->received_data(input.data(), input.size()); size_t total_consumed = 0; while(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, Botan::TLS::MAX_CIPHERTEXT_SIZE + 1)) { input.resize(needed); rng.randomize(input.data(), input.size()); needed = client->received_data(input.data(), input.size()); total_consumed += needed; } } else { size_t needed = client->received_data(input.data(), input.size()); result.test_eq("full packet received", needed, 0); } continue; } if(client_recv.size()) { result.test_eq("client recv", client_recv, server_sent); } if(server_recv.size()) { result.test_eq("server->recv", server_recv, client_sent); } if(r > 2) { if(client_recv.size() && server_recv.size()) { result.test_failure("Negotiated in the face of data corruption " + std::to_string(r)); } } if(client->is_closed() && server->is_closed()) { break; } if(server_recv.size() && client_recv.size()) { Botan::SymmetricKey client_key = client->key_material_export("label", "context", 32); Botan::SymmetricKey server_key = server->key_material_export("label", "context", 32); result.test_eq("TLS key material export", client_key.bits_of(), server_key.bits_of()); if(r % 2 == 0) { client->close(); } else { server->close(); } } } } } catch(std::exception& e) { if(r > 2) { result.test_note("Corruption caused exception"); } else { result.test_failure("TLS client", e.what()); } } } result.end_timer(); return result; } Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version, Botan::Credentials_Manager& creds, const Botan::TLS::Policy& policy, Botan::RandomNumberGenerator& rng, Botan::TLS::Session_Manager& client_sessions, Botan::TLS::Session_Manager& server_sessions) { return test_tls_handshake(offer_version, creds, policy, policy, rng, client_sessions, server_sessions); } Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version, Botan::Credentials_Manager& creds, const Botan::TLS::Policy& client_policy, const Botan::TLS::Policy& server_policy, Botan::RandomNumberGenerator& rng, Botan::TLS::Session_Manager& client_sessions, Botan::TLS::Session_Manager& server_sessions) { BOTAN_ASSERT(offer_version.is_datagram_protocol(), "Test is for datagram version"); Test::Result result(offer_version.to_string()); result.start_timer(); for(size_t r = 1; r <= 2; ++r) { bool handshake_done = false; auto handshake_complete = [&](const Botan::TLS::Session & session) -> bool { handshake_done = true; if(session.version() != offer_version) { result.test_failure("Offered " + offer_version.to_string() + " got " + session.version().to_string()); } return true; }; auto next_protocol_chooser = [&](std::vector protos) -> std::string { if(r <= 2) { result.test_eq("protocol count", protos.size(), 2); result.test_eq("protocol[0]", protos[0], "test/1"); result.test_eq("protocol[1]", protos[1], "test/2"); } return "test/3"; }; const std::vector protocols_offered = { "test/1", "test/2" }; try { std::vector c2s_traffic, s2c_traffic, client_recv, server_recv, client_sent, server_sent; std::unique_ptr server_cb(new Botan::TLS::Compat_Callbacks( queue_inserter(s2c_traffic), queue_inserter(server_recv), std::function(print_alert), handshake_complete, nullptr, next_protocol_chooser)); std::unique_ptr client_cb(new Botan::TLS::Compat_Callbacks( queue_inserter(c2s_traffic), queue_inserter(client_recv), std::function(print_alert), handshake_complete)); // TLS::Server object constructed by new constructor using virtual callback interface. std::unique_ptr server( new Botan::TLS::Server(*server_cb, server_sessions, creds, server_policy, rng, true)); // TLS::Client object constructed by new constructor using virtual callback interface. std::unique_ptr client( new Botan::TLS::Client(*client_cb, client_sessions, creds, client_policy, rng, Botan::TLS::Server_Information("server.example.com"), offer_version, protocols_offered)); size_t rounds = 0; // Test DTLS using both new and legacy constructors. for(size_t ctor_sel = 0; ctor_sel < 2; ++ctor_sel) { if(ctor_sel == 1) { c2s_traffic.clear(); s2c_traffic.clear(); server_recv.clear(); client_recv.clear(); client_sent.clear(); server_sent.clear(); // TLS::Server object constructed by legacy constructor. server.reset( new Botan::TLS::Server(queue_inserter(s2c_traffic), queue_inserter(server_recv), alert_cb_with_data, handshake_complete, server_sessions, creds, server_policy, rng, next_protocol_chooser, true)); // TLS::Client object constructed by legacy constructor. client.reset( new Botan::TLS::Client(queue_inserter(c2s_traffic), queue_inserter(client_recv), alert_cb_with_data, handshake_complete, client_sessions, creds, client_policy, rng, Botan::TLS::Server_Information("server.example.com"), offer_version, protocols_offered)); } while(true) { // TODO: client and server should be in different threads std::this_thread::sleep_for(std::chrono::microseconds(rng.next_byte() % 128)); ++rounds; if(rounds > 100) { result.test_failure("Still here after many rounds"); break; } if(handshake_done && (client->is_closed() || server->is_closed())) { break; } if(client->is_active() && client_sent.empty()) { // Choose a len between 1 and 511, todo use random chunks const size_t c_len = 1 + rng.next_byte() + rng.next_byte(); client_sent = unlock(rng.random_vec(c_len)); client->send(client_sent); } if(server->is_active() && server_sent.empty()) { result.test_eq("server ALPN", server->next_protocol(), "test/3"); const size_t s_len = 1 + rng.next_byte() + rng.next_byte(); server_sent = unlock(rng.random_vec(s_len)); server->send(server_sent); } const bool corrupt_client_data = (r == 3 && rng.next_byte() % 3 <= 1 && rounds < 10); const bool corrupt_server_data = (r == 4 && rng.next_byte() % 3 <= 1 && rounds < 10); if(c2s_traffic.size() > 0) { /* * Use this as a temp value to hold the queues as otherwise they * might end up appending more in response to messages during the * handshake. */ std::vector input; std::swap(c2s_traffic, input); if(corrupt_server_data) { try { input = Test::mutate_vec(input, true, 5); size_t needed = server->received_data(input.data(), input.size()); if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, Botan::TLS::MAX_CIPHERTEXT_SIZE + 1)) { input.resize(needed); rng.randomize(input.data(), input.size()); client->received_data(input.data(), input.size()); } } catch(std::exception&) { result.test_note("corruption caused server exception"); } } else { try { size_t needed = server->received_data(input.data(), input.size()); result.test_eq("full packet received", needed, 0); } catch(std::exception& e) { result.test_failure("server error", e.what()); } } continue; } if(s2c_traffic.size() > 0) { std::vector input; std::swap(s2c_traffic, input); if(corrupt_client_data) { try { input = Test::mutate_vec(input, true, 5); size_t needed = client->received_data(input.data(), input.size()); if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, Botan::TLS::MAX_CIPHERTEXT_SIZE + 1)) { input.resize(needed); rng.randomize(input.data(), input.size()); client->received_data(input.data(), input.size()); } } catch(std::exception&) { result.test_note("corruption caused client exception"); } } else { try { size_t needed = client->received_data(input.data(), input.size()); result.test_eq("full packet received", needed, 0); } catch(std::exception& e) { result.test_failure("client error", e.what()); } } continue; } // If we corrupted a DTLS application message, resend it: if(client->is_active() && corrupt_client_data && server_recv.empty()) { client->send(client_sent); } if(server->is_active() && corrupt_server_data && client_recv.empty()) { server->send(server_sent); } if(client_recv.size()) { result.test_eq("client recv", client_recv, server_sent); } if(server_recv.size()) { result.test_eq("server recv", server_recv, client_sent); } if(client->is_closed() && server->is_closed()) { break; } if(server_recv.size() && client_recv.size()) { Botan::SymmetricKey client_key = client->key_material_export("label", "context", 32); Botan::SymmetricKey server_key = server->key_material_export("label", "context", 32); result.test_eq("key material export", client_key.bits_of(), server_key.bits_of()); if(r % 2 == 0) { client->close(); } else { server->close(); } } } } } catch(std::exception& e) { if(r > 2) { result.test_note("Corruption caused failure"); } else { result.test_failure("DTLS handshake", e.what()); } } } result.end_timer(); return result; } Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version, Botan::Credentials_Manager& creds, const Botan::TLS::Policy& policy, Botan::RandomNumberGenerator& rng, Botan::TLS::Session_Manager& client_ses, Botan::TLS::Session_Manager& server_ses) { return test_dtls_handshake(offer_version, creds, policy, policy, rng, client_ses, server_ses); } class Test_Policy final : public Botan::TLS::Text_Policy { public: Test_Policy() : Text_Policy("") {} bool acceptable_protocol_version(Botan::TLS::Protocol_Version) const override { return true; } bool send_fallback_scsv(Botan::TLS::Protocol_Version) const override { return false; } size_t dtls_initial_timeout() const override { return 1; } size_t dtls_maximum_timeout() const override { return 8; } size_t minimum_rsa_bits() const override { return 1024; } size_t minimum_signature_strength() const override { return 80; } }; Test::Result test_tls_alert_strings() { Test::Result result("TLS::Alert::type_string"); const std::vector alert_types = { Botan::TLS::Alert::CLOSE_NOTIFY, Botan::TLS::Alert::UNEXPECTED_MESSAGE, Botan::TLS::Alert::BAD_RECORD_MAC, Botan::TLS::Alert::DECRYPTION_FAILED, Botan::TLS::Alert::RECORD_OVERFLOW, Botan::TLS::Alert::DECOMPRESSION_FAILURE, Botan::TLS::Alert::HANDSHAKE_FAILURE, Botan::TLS::Alert::NO_CERTIFICATE, Botan::TLS::Alert::BAD_CERTIFICATE, Botan::TLS::Alert::UNSUPPORTED_CERTIFICATE, Botan::TLS::Alert::CERTIFICATE_REVOKED, Botan::TLS::Alert::CERTIFICATE_EXPIRED, Botan::TLS::Alert::CERTIFICATE_UNKNOWN, Botan::TLS::Alert::ILLEGAL_PARAMETER, Botan::TLS::Alert::UNKNOWN_CA, Botan::TLS::Alert::ACCESS_DENIED, Botan::TLS::Alert::DECODE_ERROR, Botan::TLS::Alert::DECRYPT_ERROR, Botan::TLS::Alert::EXPORT_RESTRICTION, Botan::TLS::Alert::PROTOCOL_VERSION, Botan::TLS::Alert::INSUFFICIENT_SECURITY, Botan::TLS::Alert::INTERNAL_ERROR, Botan::TLS::Alert::INAPPROPRIATE_FALLBACK, Botan::TLS::Alert::USER_CANCELED, Botan::TLS::Alert::NO_RENEGOTIATION, Botan::TLS::Alert::UNSUPPORTED_EXTENSION, Botan::TLS::Alert::CERTIFICATE_UNOBTAINABLE, Botan::TLS::Alert::UNRECOGNIZED_NAME, Botan::TLS::Alert::BAD_CERTIFICATE_STATUS_RESPONSE, Botan::TLS::Alert::BAD_CERTIFICATE_HASH_VALUE, Botan::TLS::Alert::UNKNOWN_PSK_IDENTITY, Botan::TLS::Alert:: NO_APPLICATION_PROTOCOL, }; std::set seen; for(auto alert : alert_types) { const std::string str = Botan::TLS::Alert(alert).type_string(); result.test_eq("No duplicate strings", seen.count(str), 0); seen.insert(str); } Botan::TLS::Alert unknown_alert = Botan::TLS::Alert({01, 66}); result.test_eq("Unknown alert str", unknown_alert.type_string(), "unrecognized_alert_66"); return result; } std::string read_tls_policy(const std::string& policy_str) { const std::string fspath = Test::data_file("tls-policy/" + policy_str + ".txt"); std::ifstream is(fspath.c_str()); if(!is.good()) { throw Test_Error("Missing policy file " + fspath); } Botan::TLS::Text_Policy policy(is); return policy.to_string(); } std::string tls_policy_string(const std::string& policy_str) { std::unique_ptr policy; if(policy_str == "default") { policy.reset(new Botan::TLS::Policy); } else if(policy_str == "suiteb") { policy.reset(new Botan::TLS::NSA_Suite_B_128); } else if(policy_str == "bsi") { policy.reset(new Botan::TLS::BSI_TR_02102_2); } else if(policy_str == "strict") { policy.reset(new Botan::TLS::Strict_Policy); } else if(policy_str == "datagram") { policy.reset(new Botan::TLS::Datagram_Policy); } else { throw Test_Error("Unknown TLS policy type '" + policy_str + "'"); } return policy->to_string(); } Test::Result test_tls_policy() { Test::Result result("TLS Policy"); const std::vector policies = { "default", "suiteb", "strict", "datagram", "bsi" }; for(std::string policy : policies) { result.test_eq("Values for TLS " + policy + " policy", tls_policy_string(policy), read_tls_policy(policy)); } return result; } class TLS_Unit_Tests final : public Test { private: void test_with_policy(std::vector& results, Botan::TLS::Session_Manager& client_ses, Botan::TLS::Session_Manager& server_ses, Botan::Credentials_Manager& creds, const std::vector& versions, const Botan::TLS::Policy& policy) { Botan::RandomNumberGenerator& rng = Test::rng(); for(auto const& version : versions) { if(version.is_datagram_protocol()) { results.push_back(test_dtls_handshake(version, creds, policy, rng, client_ses, server_ses)); } else { results.push_back(test_tls_handshake(version, creds, policy, rng, client_ses, server_ses)); } } } void test_all_versions(std::vector& results, Botan::TLS::Session_Manager& client_ses, Botan::TLS::Session_Manager& server_ses, Botan::Credentials_Manager& creds, const std::string& kex_policy, const std::string& cipher_policy, const std::string& mac_policy, const std::string& etm_policy) { Test_Policy policy; policy.set("ciphers", cipher_policy); policy.set("macs", mac_policy); policy.set("key_exchange_methods", kex_policy); policy.set("negotiate_encrypt_then_mac", etm_policy); if(kex_policy == "RSA") { policy.set("signature_methods", "RSA"); } std::vector versions = { Botan::TLS::Protocol_Version::TLS_V10, Botan::TLS::Protocol_Version::TLS_V11, Botan::TLS::Protocol_Version::TLS_V12, Botan::TLS::Protocol_Version::DTLS_V10, Botan::TLS::Protocol_Version::DTLS_V12 }; return test_with_policy(results, client_ses, server_ses, creds, versions, policy); } void test_modern_versions(std::vector& results, Botan::TLS::Session_Manager& client_ses, Botan::TLS::Session_Manager& server_ses, Botan::Credentials_Manager& creds, const std::string& kex_policy, const std::string& cipher_policy, const std::string& mac_policy = "AEAD") { std::map no_extra_policies; return test_modern_versions(results, client_ses, server_ses, creds, kex_policy, cipher_policy, mac_policy, no_extra_policies); } void test_modern_versions(std::vector& results, Botan::TLS::Session_Manager& client_ses, Botan::TLS::Session_Manager& server_ses, Botan::Credentials_Manager& creds, const std::string& kex_policy, const std::string& cipher_policy, const std::string& mac_policy, const std::map& extra_policies) { Test_Policy policy; policy.set("ciphers", cipher_policy); policy.set("macs", mac_policy); policy.set("key_exchange_methods", kex_policy); for(auto const& kv : extra_policies) { policy.set(kv.first, kv.second); } std::vector versions = { Botan::TLS::Protocol_Version::TLS_V12, Botan::TLS::Protocol_Version::DTLS_V12 }; return test_with_policy(results, client_ses, server_ses, creds, versions, policy); } Test::Result test_tls_ciphersuites() { Test::Result result("TLS::Ciphersuite"); for(size_t csuite_id = 0; csuite_id <= 0xFFFF; ++csuite_id) { Botan::TLS::Ciphersuite ciphersuite = Botan::TLS::Ciphersuite::by_id(csuite_id); if(ciphersuite.valid()) { result.test_eq("Valid Ciphersuite is not SCSV", Botan::TLS::Ciphersuite::is_scsv(csuite_id), false); if(ciphersuite.cbc_ciphersuite() == false) { result.test_eq("Expected MAC name for AEAD ciphersuites", ciphersuite.mac_algo(), "AEAD"); } else { result.test_eq("MAC algo and PRF algo same for CBC suites", ciphersuite.prf_algo(), ciphersuite.mac_algo()); } // TODO more tests here } } return result; } public: std::vector run() override { std::vector results; results.push_back(test_tls_alert_strings()); results.push_back(test_tls_policy()); results.push_back(test_tls_ciphersuites()); Botan::RandomNumberGenerator& rng = Test::rng(); std::unique_ptr client_ses; std::unique_ptr server_ses; #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) client_ses.reset( new Botan::TLS::Session_Manager_SQLite("pass", rng, ":memory:", 5, std::chrono::seconds(2))); server_ses.reset( new Botan::TLS::Session_Manager_SQLite("pass", rng, ":memory:", 10, std::chrono::seconds(4))); #else client_ses.reset(new Botan::TLS::Session_Manager_In_Memory(rng)); server_ses.reset(new Botan::TLS::Session_Manager_In_Memory(rng)); #endif std::unique_ptr creds(create_creds(rng)); #if defined(BOTAN_HAS_TLS_CBC) for(std::string etm_setting : { "false", "true" }) { test_all_versions(results, *client_ses, *server_ses, *creds, "RSA", "AES-128", "SHA-256 SHA-1", etm_setting); test_all_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128", "SHA-256 SHA-1", etm_setting); test_all_versions(results, *client_ses, *server_ses, *creds, "RSA", "AES-256", "SHA-1", etm_setting); test_all_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-256", "SHA-1", etm_setting); #if defined(BOTAN_HAS_CAMELLIA) test_all_versions(results, *client_ses, *server_ses, *creds, "RSA", "Camellia-128", "SHA-256 SHA-1", etm_setting); test_all_versions(results, *client_ses, *server_ses, *creds, "RSA", "Camellia-256", "SHA-256 SHA-384 SHA-1", etm_setting); #endif #if defined(BOTAN_HAS_DES) test_all_versions(results, *client_ses, *server_ses, *creds, "RSA", "3DES", "SHA-1", etm_setting); test_all_versions(results, *client_ses, *server_ses, *creds, "ECDH", "3DES", "SHA-1", etm_setting); #endif #if defined(BOTAN_HAS_SEED) test_all_versions(results, *client_ses, *server_ses, *creds, "RSA", "SEED", "SHA-1", etm_setting); #endif server_ses->remove_all(); } client_ses->remove_all(); test_modern_versions(results, *client_ses, *server_ses, *creds, "DH", "AES-128", "SHA-256"); #if defined(BOTAN_HAS_DSA) test_modern_versions(results, *client_ses, *server_ses, *creds, "DH", "AES-128", "SHA-256", { { "signature_methods", "DSA" } }); test_modern_versions(results, *client_ses, *server_ses, *creds, "DH", "AES-256", "SHA-256", { { "signature_methods", "DSA" } }); #endif #endif Botan::TLS::Strict_Policy strict_policy; test_with_policy(results, *client_ses, *server_ses, *creds, {Botan::TLS::Protocol_Version::TLS_V12}, strict_policy); Botan::TLS::NSA_Suite_B_128 suiteb_128; test_with_policy(results, *client_ses, *server_ses, *creds, {Botan::TLS::Protocol_Version::TLS_V12}, suiteb_128); // Remove server sessions before client, so clients retry with session server doesn't know server_ses->remove_all(); test_modern_versions(results, *client_ses, *server_ses, *creds, "RSA", "AES-128/GCM"); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM"); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM", "AEAD", { { "signature_methods", "RSA" } }); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM", "AEAD", { { "support_cert_status_message", "false" } }); #if defined(BOTAN_HAS_DSA) test_modern_versions(results, *client_ses, *server_ses, *creds, "DH", "AES-128/GCM", "AEAD", { { "signature_methods", "DSA" } }); test_modern_versions(results, *client_ses, *server_ses, *creds, "DH", "AES-256/GCM", "AEAD", { { "signature_methods", "DSA" } }); #endif client_ses->remove_all(); #if defined(BOTAN_HAS_CAMELLIA) test_modern_versions(results, *client_ses, *server_ses, *creds, "RSA", "Camellia-128", "SHA-256"); test_modern_versions(results, *client_ses, *server_ses, *creds, "RSA", "Camellia-256", "SHA-384 SHA-256"); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "Camellia-128/GCM", "AEAD"); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "Camellia-256/GCM", "AEAD"); #endif #if defined(BOTAN_HAS_ARIA) test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "ARIA-128/GCM", "AEAD"); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "ARIA-256/GCM", "AEAD"); #endif #if defined(BOTAN_HAS_CECPQ1) #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_AEAD_GCM) test_modern_versions(results, *client_ses, *server_ses, *creds, "CECPQ1", "AES-256/GCM", "AEAD"); #endif #if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_AEAD_OCB) test_modern_versions(results, *client_ses, *server_ses, *creds, "CECPQ1", "AES-256/OCB(12)", "AEAD"); test_modern_versions(results, *client_ses, *server_ses, *creds, "CECPQ1", "AES-256/OCB(12)", "AEAD", {{ "signature_methods", "RSA" }}); #endif #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305) test_modern_versions(results, *client_ses, *server_ses, *creds, "CECPQ1", "ChaCha20Poly1305", "AEAD", { { "signature_methods", "RSA" }}); #endif #endif test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM", "AEAD", { { "use_ecc_point_compression", "true" } }); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-256/GCM", "AEAD", { { "groups", "secp521r1" } }); test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM", "AEAD", { { "groups", "brainpool256r1" } }); #if defined(BOTAN_HAS_CURVE_25519) test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM", "AEAD", { { "groups", "x25519" } }); #endif test_modern_versions(results, *client_ses, *server_ses, *creds, "DH", "AES-128/GCM", "AEAD", { { "groups", "ffdhe/ietf/2048" } }); std::unique_ptr creds_with_client_cert(create_creds(rng, true)); test_modern_versions(results, *client_ses, *server_ses, *creds_with_client_cert, "ECDH", "AES-256/GCM"); #if defined(BOTAN_HAS_TLS_SQLITE3_SESSION_MANAGER) client_ses.reset(new Botan::TLS::Session_Manager_In_Memory(rng)); server_ses.reset(new Botan::TLS::Session_Manager_In_Memory(rng)); #endif #if defined(BOTAN_HAS_AEAD_OCB) test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/OCB(12)"); #endif server_ses->remove_all(); #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305) test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "ChaCha20Poly1305"); #endif test_modern_versions(results, *client_ses, *server_ses, *creds, "PSK", "AES-128/GCM"); #if defined(BOTAN_HAS_CCM) test_modern_versions(results, *client_ses, *server_ses, *creds, "PSK", "AES-128/CCM"); test_modern_versions(results, *client_ses, *server_ses, *creds, "PSK", "AES-128/CCM(8)"); #endif #if defined(BOTAN_HAS_TLS_CBC) // For whatever reason no (EC)DHE_PSK GCM ciphersuites are defined test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDHE_PSK", "AES-128", "SHA-256"); test_modern_versions(results, *client_ses, *server_ses, *creds, "DHE_PSK", "AES-128", "SHA-1"); #endif #if defined(BOTAN_HOUSE_ECC_CURVE_NAME) test_modern_versions(results, *client_ses, *server_ses, *creds, "ECDH", "AES-128/GCM", "AEAD", { { "groups", BOTAN_HOUSE_ECC_CURVE_NAME } }); #endif return results; } }; BOTAN_REGISTER_TEST("tls", TLS_Unit_Tests); #endif } } botan-2.4.0/src/tests/unit_tls_policy.cpp000066400000000000000000000136661322470703100205100ustar00rootroot00000000000000/* * TLS Policy tests * * (C) 2016 Juraj Somorovsky * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_TLS) #include #include #endif #if defined(BOTAN_HAS_RSA) #include #endif #if defined(BOTAN_HAS_ECDH) #include #endif #if defined(BOTAN_HAS_ECDSA) #include #endif #if defined(BOTAN_HAS_DIFFIE_HELLMAN) #include #endif #if defined(BOTAN_HAS_DSA) #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_TLS) class TLS_Policy_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; results.push_back(test_peer_key_acceptable_rsa()); results.push_back(test_peer_key_acceptable_ecdh()); results.push_back(test_peer_key_acceptable_ecdsa()); results.push_back(test_peer_key_acceptable_dh()); results.push_back(test_peer_key_acceptable_dsa()); return results; } private: Test::Result test_peer_key_acceptable_rsa() { Test::Result result("TLS Policy RSA key verification"); #if defined(BOTAN_HAS_RSA) std::unique_ptr rsa_key_1024(new Botan::RSA_PrivateKey(Test::rng(), 1024)); Botan::TLS::Policy policy; try { policy.check_peer_key_acceptable(*rsa_key_1024); result.test_failure("Incorrectly accepting 1024 bit RSA keys"); } catch(Botan::TLS::TLS_Exception&) { result.test_success("Correctly rejecting 1024 bit RSA keys"); } std::unique_ptr rsa_key_2048(new Botan::RSA_PrivateKey(Test::rng(), 2048)); policy.check_peer_key_acceptable(*rsa_key_2048); result.test_success("Correctly accepting 2048 bit RSA keys"); #endif return result; } Test::Result test_peer_key_acceptable_ecdh() { Test::Result result("TLS Policy ECDH key verification"); #if defined(BOTAN_HAS_ECDH) Botan::EC_Group group_192("secp192r1"); std::unique_ptr ecdh_192(new Botan::ECDH_PrivateKey(Test::rng(), group_192)); Botan::TLS::Policy policy; try { policy.check_peer_key_acceptable(*ecdh_192); result.test_failure("Incorrectly accepting 192 bit EC keys"); } catch(Botan::TLS::TLS_Exception&) { result.test_success("Correctly rejecting 192 bit EC keys"); } Botan::EC_Group group_256("secp256r1"); std::unique_ptr ecdh_256(new Botan::ECDH_PrivateKey(Test::rng(), group_256)); policy.check_peer_key_acceptable(*ecdh_256); result.test_success("Correctly accepting 256 bit EC keys"); #endif return result; } Test::Result test_peer_key_acceptable_ecdsa() { Test::Result result("TLS Policy ECDSA key verification"); #if defined(BOTAN_HAS_ECDSA) Botan::EC_Group group_192("secp192r1"); std::unique_ptr ecdsa_192(new Botan::ECDSA_PrivateKey(Test::rng(), group_192)); Botan::TLS::Policy policy; try { policy.check_peer_key_acceptable(*ecdsa_192); result.test_failure("Incorrectly accepting 192 bit EC keys"); } catch(Botan::TLS::TLS_Exception&) { result.test_success("Correctly rejecting 192 bit EC keys"); } Botan::EC_Group group_256("secp256r1"); std::unique_ptr ecdsa_256(new Botan::ECDSA_PrivateKey(Test::rng(), group_256)); policy.check_peer_key_acceptable(*ecdsa_256); result.test_success("Correctly accepting 256 bit EC keys"); #endif return result; } Test::Result test_peer_key_acceptable_dh() { Test::Result result("TLS Policy DH key verification"); #if defined(BOTAN_HAS_DIFFIE_HELLMAN) const BigInt g("2"); const BigInt p("58458002095536094658683755258523362961421200751439456159756164191494576279467"); const Botan::DL_Group grp(p, g); const Botan::BigInt x("46205663093589612668746163860870963912226379131190812163519349848291472898748"); std::unique_ptr dhkey(new Botan::DH_PrivateKey(Test::rng(), grp, x)); Botan::TLS::Policy policy; try { policy.check_peer_key_acceptable(*dhkey); result.test_failure("Incorrectly accepting short bit DH keys"); } catch(Botan::TLS::TLS_Exception&) { result.test_success("Correctly rejecting short bit DH keys"); } #endif return result; } Test::Result test_peer_key_acceptable_dsa() { Test::Result result("TLS Policy DSA key verification"); #if defined(BOTAN_HAS_DSA) const Botan::DL_Group grp_1024("modp/ietf/1024"); std::unique_ptr dsa_1024(new Botan::DSA_PrivateKey(Test::rng(), grp_1024)); Botan::TLS::Policy policy; try { policy.check_peer_key_acceptable(*dsa_1024); result.test_failure("Incorrectly accepting short bit DSA keys"); } catch(Botan::TLS::TLS_Exception&) { result.test_success("Correctly rejecting short bit DSA keys"); } const Botan::DL_Group grp_2048("modp/ietf/2048"); std::unique_ptr dsa_2048(new Botan::DSA_PrivateKey(Test::rng(), grp_2048)); policy.check_peer_key_acceptable(*dsa_2048); result.test_success("Correctly accepting 2048 bit DSA keys"); #endif return result; } }; BOTAN_REGISTER_TEST("tls_policy", TLS_Policy_Unit_Tests); #endif } } botan-2.4.0/src/tests/unit_x509.cpp000066400000000000000000001576571322470703100170450ustar00rootroot00000000000000/* * (C) 2009 Jack Lloyd * (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include "tests.h" #if defined(BOTAN_HAS_X509_CERTIFICATES) #include #include #include #include #include #include #include #include #include #include #include #endif namespace Botan_Tests { namespace { #if defined(BOTAN_HAS_X509_CERTIFICATES) Botan::X509_Time from_date(const int y, const int m, const int d) { Botan::calendar_point t(y, m, d, 0, 0, 0); return Botan::X509_Time(t.to_std_timepoint()); } /* Return some option sets */ Botan::X509_Cert_Options ca_opts(const std::string& sig_padding = "") { Botan::X509_Cert_Options opts("Test CA/US/Botan Project/Testing"); opts.uri = "https://botan.randombit.net"; opts.dns = "botan.randombit.net"; opts.email = "testing@randombit.net"; opts.set_padding_scheme(sig_padding); opts.CA_key(1); return opts; } Botan::X509_Cert_Options req_opts1(const std::string& algo, const std::string& sig_padding = "") { Botan::X509_Cert_Options opts("Test User 1/US/Botan Project/Testing"); opts.uri = "https://botan.randombit.net"; opts.dns = "botan.randombit.net"; opts.email = "testing@randombit.net"; opts.set_padding_scheme(sig_padding); opts.not_before("160101200000Z"); opts.not_after("300101200000Z"); opts.challenge = "zoom"; if(algo == "RSA") { opts.constraints = Botan::Key_Constraints(Botan::KEY_ENCIPHERMENT); } else if(algo == "DSA" || algo == "ECDSA" || algo == "ECGDSA" || algo == "ECKCDSA") { opts.constraints = Botan::Key_Constraints(Botan::DIGITAL_SIGNATURE); } return opts; } Botan::X509_Cert_Options req_opts2(const std::string& sig_padding = "") { Botan::X509_Cert_Options opts("Test User 2/US/Botan Project/Testing"); opts.uri = "https://botan.randombit.net"; opts.dns = "botan.randombit.net"; opts.email = "testing@randombit.net"; opts.set_padding_scheme(sig_padding); opts.add_ex_constraint("PKIX.EmailProtection"); return opts; } std::unique_ptr make_a_private_key(const std::string& algo) { const std::string params = [&] { // Here we override defaults as needed if(algo == "RSA") { return "1024"; } if(algo == "GOST-34.10") { return "gost_256A"; } if(algo == "ECKCDSA" || algo == "ECGDSA") { return "brainpool256r1"; } return ""; // default "" means choose acceptable algo-specific params }(); return Botan::create_private_key(algo, Test::rng(), params); } Test::Result test_cert_status_strings() { Test::Result result("Certificate_Status_Code to_string"); std::set seen; result.test_eq("Same string", Botan::to_string(Botan::Certificate_Status_Code::OK), Botan::to_string(Botan::Certificate_Status_Code::VERIFIED)); const Botan::Certificate_Status_Code codes[] { Botan::Certificate_Status_Code::OCSP_RESPONSE_GOOD, Botan::Certificate_Status_Code::OCSP_SIGNATURE_OK, Botan::Certificate_Status_Code::VALID_CRL_CHECKED, Botan::Certificate_Status_Code::OCSP_NO_HTTP, Botan::Certificate_Status_Code::CERT_SERIAL_NEGATIVE, Botan::Certificate_Status_Code::DN_TOO_LONG, Botan::Certificate_Status_Code::SIGNATURE_METHOD_TOO_WEAK, Botan::Certificate_Status_Code::NO_MATCHING_CRLDP, Botan::Certificate_Status_Code::UNTRUSTED_HASH, Botan::Certificate_Status_Code::NO_REVOCATION_DATA, Botan::Certificate_Status_Code::CERT_NOT_YET_VALID, Botan::Certificate_Status_Code::CERT_HAS_EXPIRED, Botan::Certificate_Status_Code::OCSP_NOT_YET_VALID, Botan::Certificate_Status_Code::OCSP_HAS_EXPIRED, Botan::Certificate_Status_Code::CRL_NOT_YET_VALID, Botan::Certificate_Status_Code::CRL_HAS_EXPIRED, Botan::Certificate_Status_Code::CERT_ISSUER_NOT_FOUND, Botan::Certificate_Status_Code::CANNOT_ESTABLISH_TRUST, Botan::Certificate_Status_Code::CERT_CHAIN_LOOP, Botan::Certificate_Status_Code::CHAIN_LACKS_TRUST_ROOT, Botan::Certificate_Status_Code::CHAIN_NAME_MISMATCH, Botan::Certificate_Status_Code::POLICY_ERROR, Botan::Certificate_Status_Code::DUPLICATE_CERT_POLICY, Botan::Certificate_Status_Code::INVALID_USAGE, Botan::Certificate_Status_Code::CERT_CHAIN_TOO_LONG, Botan::Certificate_Status_Code::CA_CERT_NOT_FOR_CERT_ISSUER, Botan::Certificate_Status_Code::NAME_CONSTRAINT_ERROR, Botan::Certificate_Status_Code::CA_CERT_NOT_FOR_CRL_ISSUER, Botan::Certificate_Status_Code::OCSP_CERT_NOT_LISTED, Botan::Certificate_Status_Code::OCSP_BAD_STATUS, Botan::Certificate_Status_Code::CERT_NAME_NOMATCH, Botan::Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION, Botan::Certificate_Status_Code::DUPLICATE_CERT_EXTENSION, Botan::Certificate_Status_Code::EXT_IN_V1_V2_CERT, Botan::Certificate_Status_Code::OCSP_SIGNATURE_ERROR, Botan::Certificate_Status_Code::OCSP_ISSUER_NOT_FOUND, Botan::Certificate_Status_Code::OCSP_RESPONSE_MISSING_KEYUSAGE, Botan::Certificate_Status_Code::OCSP_RESPONSE_INVALID, Botan::Certificate_Status_Code::CERT_IS_REVOKED, Botan::Certificate_Status_Code::CRL_BAD_SIGNATURE, Botan::Certificate_Status_Code::SIGNATURE_ERROR, Botan::Certificate_Status_Code::CERT_PUBKEY_INVALID, Botan::Certificate_Status_Code::SIGNATURE_ALGO_UNKNOWN, Botan::Certificate_Status_Code::SIGNATURE_ALGO_BAD_PARAMS, }; for(const auto code : codes) { const std::string s = Botan::to_string(code); result.confirm("String is long enough to be informative", s.size() > 12); result.test_eq("No duplicates", seen.count(s), 0); seen.insert(s); } return result; } Test::Result test_x509_dates() { Test::Result result("X509 Time"); Botan::X509_Time time; result.confirm("unset time not set", !time.time_is_set()); time = Botan::X509_Time("080201182200Z", Botan::ASN1_Tag::UTC_TIME); result.confirm("time set after construction", time.time_is_set()); result.test_eq("time readable_string", time.readable_string(), "2008/02/01 18:22:00 UTC"); time = Botan::X509_Time("200305100350Z", Botan::ASN1_Tag::UTC_TIME); result.test_eq("UTC_TIME readable_string", time.readable_string(), "2020/03/05 10:03:50 UTC"); time = Botan::X509_Time("200305100350Z", Botan::ASN1_Tag::UTC_OR_GENERALIZED_TIME); result.test_eq("UTC_OR_GENERALIZED_TIME from UTC_TIME readable_string", time.readable_string(), "2020/03/05 10:03:50 UTC"); time = Botan::X509_Time("20200305100350Z", Botan::ASN1_Tag::UTC_OR_GENERALIZED_TIME); result.test_eq("UTC_OR_GENERALIZED_TIME from GENERALIZED_TIME readable_string", time.readable_string(), "2020/03/05 10:03:50 UTC"); time = Botan::X509_Time("20200305100350Z", Botan::ASN1_Tag::GENERALIZED_TIME); result.test_eq("GENERALIZED_TIME readable_string", time.readable_string(), "2020/03/05 10:03:50 UTC"); // Dates that are valid per X.500 but rejected as unsupported const std::string valid_but_unsup[] { "0802010000-0000", "0802011724+0000", "0406142334-0500", "9906142334+0500", "0006142334-0530", "0006142334+0530", "080201000000-0000", "080201172412+0000", "040614233433-0500", "990614233444+0500", "000614233455-0530", "000614233455+0530", }; // valid length 13 const std::string valid_utc[] { "080201000000Z", "080201172412Z", "040614233433Z", "990614233444Z", "000614233455Z", }; const std::string invalid_utc[] { "", " ", "2008`02-01", "9999-02-01", "2000-02-01 17", "999921", // No seconds "0802010000Z", "0802011724Z", "0406142334Z", "9906142334Z", "0006142334Z", // valid length 13 -> range check "080201000061Z", // seconds too big (61) "080201000060Z", // seconds too big (60, leap seconds not covered by the standard) "0802010000-1Z", // seconds too small (-1) "080201006000Z", // minutes too big (60) "080201240000Z", // hours too big (24:00) // valid length 13 -> invalid numbers "08020123112 Z", "08020123112!Z", "08020123112,Z", "08020123112\nZ", "080201232 33Z", "080201232!33Z", "080201232,33Z", "080201232\n33Z", "0802012 3344Z", "0802012!3344Z", "0802012,3344Z", "08022\n334455Z", "08022 334455Z", "08022!334455Z", "08022,334455Z", "08022\n334455Z", "082 33445511Z", "082!33445511Z", "082,33445511Z", "082\n33445511Z", "2 2211221122Z", "2!2211221122Z", "2,2211221122Z", "2\n2211221122Z", // wrong time zone "080201000000", "080201000000z", // Fractional seconds "170217180154.001Z", // Timezone offset "170217180154+0100", // Extra digits "17021718015400Z", // Non-digits "17021718015aZ", // Trailing garbage "170217180154Zlongtrailinggarbage", // Swapped type "20170217180154Z", }; // valid length 15 const std::string valid_generalized_time[] { "20000305100350Z", }; const std::string invalid_generalized[] { // No trailing Z "20000305100350", // No seconds "200003051003Z", // Fractional seconds "20000305100350.001Z", // Timezone offset "20170217180154+0100", // Extra digits "2017021718015400Z", // Non-digits "2017021718015aZ", // Trailing garbage "20170217180154Zlongtrailinggarbage", // Swapped type "170217180154Z", }; for(const auto& v : valid_but_unsup) { result.test_throws("valid but unsupported", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); }); } for(const auto& v : valid_utc) { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); } for(const auto& v : valid_generalized_time) { Botan::X509_Time t(v, Botan::ASN1_Tag::GENERALIZED_TIME); } for(const auto& v : invalid_utc) { result.test_throws("invalid", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); }); } for(const auto& v : invalid_generalized) { result.test_throws("invalid", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::GENERALIZED_TIME); }); } return result; } Test::Result test_crl_dn_name() { Test::Result result("CRL DN name"); // See GH #1252 #if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_EMSA_PKCS1) const Botan::OID dc_oid("0.9.2342.19200300.100.1.25"); Botan::X509_Certificate cert(Test::data_file("x509/misc/opcuactt_ca.der")); Botan::DataSource_Stream key_input(Test::data_file("x509/misc/opcuactt_ca.pem")); std::unique_ptr key = Botan::PKCS8::load_key(key_input); Botan::X509_CA ca(cert, *key, "SHA-256", Test::rng()); Botan::X509_CRL crl = ca.new_crl(Test::rng()); result.confirm("matches issuer cert", crl.issuer_dn() == cert.subject_dn()); result.confirm("contains DC component", crl.issuer_dn().get_attributes().count(dc_oid) == 1); #endif return result; } Test::Result test_x509_utf8() { Test::Result result("X509 with UTF-8 encoded fields"); try { Botan::X509_Certificate utf8_cert(Test::data_file("x509/misc/contains_utf8string.pem")); // UTF-8 encoded fields of test certificate (contains cyrillic letters) const std::string organization = "\xD0\x9C\xD0\xBE\xD1\x8F\x20\xD0\xBA\xD0\xBE\xD0" "\xBC\xD0\xBF\xD0\xB0\xD0\xBD\xD0\xB8\xD1\x8F"; const std::string organization_unit = "\xD0\x9C\xD0\xBE\xD1\x91\x20\xD0\xBF\xD0\xBE\xD0\xB4\xD1\x80\xD0\xB0" "\xD0\xB7\xD0\xB4\xD0\xB5\xD0\xBB\xD0\xB5\xD0\xBD\xD0\xB8\xD0\xB5"; const std::string common_name = "\xD0\x9E\xD0\xBF\xD0\xB8\xD1\x81\xD0\xB0\xD0\xBD\xD0\xB8" "\xD0\xB5\x20\xD1\x81\xD0\xB0\xD0\xB9\xD1\x82\xD0\xB0"; const std::string location = "\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0"; const Botan::X509_DN& issuer_dn = utf8_cert.issuer_dn(); result.test_eq("O", issuer_dn.get_first_attribute("O"), organization); result.test_eq("OU", issuer_dn.get_first_attribute("OU"), organization_unit); result.test_eq("CN", issuer_dn.get_first_attribute("CN"), common_name); result.test_eq("L", issuer_dn.get_first_attribute("L"), location); } catch (const Botan::Decoding_Error &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_x509_bmpstring() { Test::Result result("X509 with UCS-2 (BMPString) encoded fields"); try { Botan::X509_Certificate ucs2_cert(Test::data_file("x509/misc/contains_bmpstring.pem")); // UTF-8 encoded fields of test certificate (contains cyrillic and greek letters) const std::string organization = "\x6E\x65\xCF\x87\xCF\xB5\x6E\x69\xCF\x89"; const std::string common_name = "\xC3\xA8\x6E\xC7\x9D\xD0\xAF\x20\xD0\x9C\xC7\x9D\xD0\xB9\xD0\xB7\xD1\x8D\xD0\xBB"; // UTF-8 encoded fields of test certificate (contains only ASCII characters) const std::string location = "Berlin"; const Botan::X509_DN& issuer_dn = ucs2_cert.issuer_dn(); result.test_eq("O", issuer_dn.get_first_attribute("O"), organization); result.test_eq("CN", issuer_dn.get_first_attribute("CN"), common_name); result.test_eq("L", issuer_dn.get_first_attribute("L"), location); } catch (const Botan::Decoding_Error &ex) { result.test_failure(ex.what()); } return result; } Test::Result test_x509_authority_info_access_extension() { Test::Result result("X509 with PKIX.AuthorityInformationAccess extension"); // contains no AIA extension Botan::X509_Certificate no_aia_cert(Test::data_file("x509/misc/contains_utf8string.pem")); result.test_eq("number of ca_issuers URLs", no_aia_cert.ca_issuers().size(), 0); result.test_eq("CA issuer URL matches", no_aia_cert.ocsp_responder(), ""); // contains AIA extension with 1 CA issuer URL and 1 OCSP responder Botan::X509_Certificate aia_cert(Test::data_file("x509/misc/contains_authority_info_access.pem")); const auto ca_issuers = aia_cert.ca_issuers(); result.test_eq("number of ca_issuers URLs", ca_issuers.size(), 1); if (result.tests_failed()) return result; result.test_eq("CA issuer URL matches", ca_issuers[0], "http://gp.symcb.com/gp.crt"); result.test_eq("OCSP responder URL matches", aia_cert.ocsp_responder(), "http://gp.symcd.com"); // contains AIA extension with 2 CA issuer URL and 1 OCSP responder Botan::X509_Certificate aia_cert_2ca(Test::data_file("x509/misc/contains_authority_info_access_with_two_ca_issuers.pem")); const auto ca_issuers2 = aia_cert_2ca.ca_issuers(); result.test_eq("number of ca_issuers URLs", ca_issuers2.size(), 2); if (result.tests_failed()) return result; result.test_eq("CA issuer URL matches", ca_issuers2[0], "http://www.d-trust.net/cgi-bin/Bdrive_Test_CA_1-2_2017.crt"); result.test_eq("CA issuer URL matches", ca_issuers2[1], "ldap://directory.d-trust.net/CN=Bdrive%20Test%20CA%201-2%202017,O=Bundesdruckerei%20GmbH,C=DE?cACertificate?base?"); result.test_eq("OCSP responder URL matches", aia_cert_2ca.ocsp_responder(), "http://staging.ocsp.d-trust.net"); return result; } Test::Result test_x509_cert(const std::string& sig_algo, const std::string& sig_padding = "", const std::string& hash_fn = "SHA-256") { Test::Result result("X509 Unit"); /* Create the CA's key and self-signed cert */ std::unique_ptr ca_key(make_a_private_key(sig_algo)); if(!ca_key) { // Failure because X.509 enabled but requested signature algorithm is not present result.test_note("Skipping due to missing signature algorithm: " + sig_algo); return result; } /* Create the self-signed cert */ const auto ca_cert = Botan::X509::create_self_signed_cert(ca_opts(sig_padding), *ca_key, hash_fn, Test::rng()); { const auto constraints = Botan::Key_Constraints(Botan::KEY_CERT_SIGN | Botan::CRL_SIGN); result.test_eq("ca key usage", (ca_cert.constraints() & constraints) == constraints, true); } /* Create user #1's key and cert request */ std::unique_ptr user1_key(make_a_private_key(sig_algo)); Botan::PKCS10_Request user1_req = Botan::X509::create_cert_req(req_opts1(sig_algo, sig_padding), *user1_key, hash_fn, Test::rng()); result.test_eq("PKCS10 challenge password parsed", user1_req.challenge_password(), "zoom"); /* Create user #2's key and cert request */ std::unique_ptr user2_key(make_a_private_key(sig_algo)); Botan::PKCS10_Request user2_req = Botan::X509::create_cert_req(req_opts2(sig_padding), *user2_key, hash_fn, Test::rng()); /* Create the CA object */ Botan::X509_CA ca(ca_cert, *ca_key, {{"padding",sig_padding}}, hash_fn, Test::rng()); /* Sign the requests to create the certs */ Botan::X509_Certificate user1_cert = ca.sign_request(user1_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); Botan::X509_Certificate user2_cert = ca.sign_request(user2_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); // user#1 creates a self-signed cert on the side const auto user1_ss_cert = Botan::X509::create_self_signed_cert(req_opts1(sig_algo, sig_padding), *user1_key, hash_fn, Test::rng()); { auto constrains = req_opts1(sig_algo).constraints; result.test_eq("user1 key usage", (user1_cert.constraints() & constrains) == constrains, true); } /* Copy, assign and compare */ Botan::X509_Certificate user1_cert_copy(user1_cert); result.test_eq("certificate copy", user1_cert == user1_cert_copy, true); user1_cert_copy = user2_cert; result.test_eq("certificate assignment", user2_cert == user1_cert_copy, true); Botan::X509_Certificate user1_cert_differ = ca.sign_request(user1_req, Test::rng(), from_date(2008, 01, 01), from_date(2032, 01, 01)); result.test_eq("certificate differs", user1_cert == user1_cert_differ, false); /* Get cert data */ result.test_eq("x509 version", user1_cert.x509_version(), size_t(3)); const Botan::X509_DN& user1_issuer_dn = user1_cert.issuer_dn(); result.test_eq("issuer info CN", user1_issuer_dn.get_first_attribute("CN"), ca_opts().common_name); result.test_eq("issuer info Country", user1_issuer_dn.get_first_attribute("C"), ca_opts().country); result.test_eq("issuer info Orga", user1_issuer_dn.get_first_attribute("O"), ca_opts().organization); result.test_eq("issuer info OrgaUnit", user1_issuer_dn.get_first_attribute("OU"), ca_opts().org_unit); const Botan::AlternativeName& user1_altname = user1_cert.subject_alt_name(); result.test_eq("subject alt email", user1_altname.get_first_attribute("RFC822"), "testing@randombit.net"); result.test_eq("subject alt email", user1_altname.get_first_attribute("DNS"), "botan.randombit.net"); result.test_eq("subject alt email", user1_altname.get_first_attribute("URI"), "https://botan.randombit.net"); const Botan::X509_CRL crl1 = ca.new_crl(Test::rng()); /* Verify the certs */ Botan::Path_Validation_Restrictions restrictions(false, 80); Botan::Certificate_Store_In_Memory store; // First try with an empty store Botan::Path_Validation_Result result_no_issuer = Botan::x509_path_validate(user1_cert, restrictions, store); result.test_eq("user 1 issuer not found", result_no_issuer.result_string(), Botan::Path_Validation_Result::status_string(Botan::Certificate_Status_Code::CERT_ISSUER_NOT_FOUND)); store.add_certificate(ca.ca_certificate()); Botan::Path_Validation_Result result_u1 = Botan::x509_path_validate(user1_cert, restrictions, store); if(!result.confirm("user 1 validates", result_u1.successful_validation())) { result.test_note("user 1 validation result was " + result_u1.result_string()); } else { const std::set u1_hashes = result_u1.trusted_hashes(); if(result.test_eq("Single trusted hash", u1_hashes.size(), 1)) { result.test_eq("Hash matches test", *u1_hashes.begin(), hash_fn); } } Botan::Path_Validation_Result result_u2 = Botan::x509_path_validate(user2_cert, restrictions, store); if(!result.confirm("user 2 validates", result_u2.successful_validation())) { result.test_note("user 2 validation result was " + result_u2.result_string()); } Botan::Path_Validation_Result result_self_signed = Botan::x509_path_validate(user1_ss_cert, restrictions, store); result.test_eq("user 1 issuer not found", result_no_issuer.result_string(), Botan::Path_Validation_Result::status_string(Botan::Certificate_Status_Code::CERT_ISSUER_NOT_FOUND)); store.add_crl(crl1); std::vector revoked; revoked.push_back(Botan::CRL_Entry(user1_cert, Botan::CESSATION_OF_OPERATION)); revoked.push_back(user2_cert); const Botan::X509_CRL crl2 = ca.update_crl(crl1, revoked, Test::rng()); store.add_crl(crl2); const std::string revoked_str = Botan::Path_Validation_Result::status_string(Botan::Certificate_Status_Code::CERT_IS_REVOKED); result_u1 = Botan::x509_path_validate(user1_cert, restrictions, store); result.test_eq("user 1 revoked", result_u1.result_string(), revoked_str); result_u2 = Botan::x509_path_validate(user2_cert, restrictions, store); result.test_eq("user 1 revoked", result_u2.result_string(), revoked_str); revoked.clear(); revoked.push_back(Botan::CRL_Entry(user1_cert, Botan::REMOVE_FROM_CRL)); Botan::X509_CRL crl3 = ca.update_crl(crl2, revoked, Test::rng()); store.add_crl(crl3); result_u1 = Botan::x509_path_validate(user1_cert, restrictions, store); if(!result.confirm("user 1 validates", result_u1.successful_validation())) { result.test_note("user 1 validation result was " + result_u1.result_string()); } result_u2 = Botan::x509_path_validate(user2_cert, restrictions, store); result.test_eq("user 2 still revoked", result_u2.result_string(), revoked_str); return result; } Test::Result test_usage(const std::string& sig_algo, const std::string& hash_fn = "SHA-256") { using Botan::Key_Constraints; Test::Result result("X509 Usage"); /* Create the CA's key and self-signed cert */ std::unique_ptr ca_key(make_a_private_key(sig_algo)); if(!ca_key) { // Failure because X.509 enabled but requested signature algorithm is not present result.test_note("Skipping due to missing signature algorithm: " + sig_algo); return result; } /* Create the self-signed cert */ const Botan::X509_Certificate ca_cert = Botan::X509::create_self_signed_cert( ca_opts(), *ca_key, hash_fn, Test::rng()); /* Create the CA object */ const Botan::X509_CA ca(ca_cert, *ca_key, hash_fn, Test::rng()); std::unique_ptr user1_key(make_a_private_key(sig_algo)); Botan::X509_Cert_Options opts("Test User 1/US/Botan Project/Testing"); opts.constraints = Key_Constraints::DIGITAL_SIGNATURE; const Botan::PKCS10_Request user1_req = Botan::X509::create_cert_req( opts, *user1_key, hash_fn, Test::rng()); const Botan::X509_Certificate user1_cert = ca.sign_request( user1_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); // cert only allows digitalSignature, but we check for both digitalSignature and cRLSign result.test_eq("key usage cRLSign not allowed", user1_cert.allowed_usage( Key_Constraints(Key_Constraints::DIGITAL_SIGNATURE | Key_Constraints::CRL_SIGN)), false); // cert only allows digitalSignature, so checking for only that should be ok result.confirm("key usage digitalSignature allowed", user1_cert.allowed_usage(Key_Constraints::DIGITAL_SIGNATURE)); opts.constraints = Key_Constraints(Key_Constraints::DIGITAL_SIGNATURE | Key_Constraints::CRL_SIGN); const Botan::PKCS10_Request mult_usage_req = Botan::X509::create_cert_req( opts, *user1_key, hash_fn, Test::rng()); const Botan::X509_Certificate mult_usage_cert = ca.sign_request( mult_usage_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); // cert allows multiple usages, so each one of them as well as both together should be allowed result.confirm("key usage multiple digitalSignature allowed", mult_usage_cert.allowed_usage(Key_Constraints::DIGITAL_SIGNATURE)); result.confirm("key usage multiple cRLSign allowed", mult_usage_cert.allowed_usage(Key_Constraints::CRL_SIGN)); result.confirm("key usage multiple digitalSignature and cRLSign allowed", mult_usage_cert.allowed_usage( Key_Constraints(Key_Constraints::DIGITAL_SIGNATURE | Key_Constraints::CRL_SIGN))); opts.constraints = Key_Constraints::NO_CONSTRAINTS; const Botan::PKCS10_Request no_usage_req = Botan::X509::create_cert_req(opts, *user1_key, hash_fn, Test::rng()); const Botan::X509_Certificate no_usage_cert = ca.sign_request(no_usage_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); // cert allows every usage result.confirm("key usage digitalSignature allowed", no_usage_cert.allowed_usage(Key_Constraints::DIGITAL_SIGNATURE)); result.confirm("key usage cRLSign allowed", no_usage_cert.allowed_usage(Key_Constraints::CRL_SIGN)); return result; } Test::Result test_self_issued(const std::string& sig_algo, const std::string& sig_padding = "", const std::string& hash_fn = "SHA-256") { using Botan::Key_Constraints; Test::Result result("X509 Self Issued"); // create the CA's key and self-signed cert std::unique_ptr ca_key(make_a_private_key(sig_algo)); if(!ca_key) { // Failure because X.509 enabled but requested signature algorithm is not present result.test_note("Skipping due to missing signature algorithm: " + sig_algo); return result; } // create the self-signed cert const Botan::X509_Certificate ca_cert = Botan::X509::create_self_signed_cert( ca_opts(sig_padding), *ca_key, hash_fn, Test::rng()); /* Create the CA object */ const Botan::X509_CA ca(ca_cert, *ca_key, {{"padding",sig_padding}}, hash_fn, Test::rng()); std::unique_ptr user_key(make_a_private_key(sig_algo)); // create a self-issued certificate, that is, a certificate with subject dn == issuer dn, // but signed by a CA, not signed by it's own private key Botan::X509_Cert_Options opts = ca_opts(); opts.constraints = Key_Constraints::DIGITAL_SIGNATURE; opts.set_padding_scheme(sig_padding); const Botan::PKCS10_Request self_issued_req = Botan::X509::create_cert_req(opts, *user_key, hash_fn, Test::rng()); const Botan::X509_Certificate self_issued_cert = ca.sign_request( self_issued_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); // check that this chain can can be verified successfully const Botan::Certificate_Store_In_Memory trusted(ca.ca_certificate()); const Botan::Path_Validation_Restrictions restrictions(false, 80); const Botan::Path_Validation_Result validation_result = Botan::x509_path_validate( self_issued_cert, restrictions, trusted); result.confirm("chain with self-issued cert validates", validation_result.successful_validation()); return result; } Test::Result test_x509_uninit() { Test::Result result("X509 object uninitialized access"); Botan::X509_Certificate cert; result.test_throws("uninitialized cert access causes exception", "X509_Certificate uninitialized", [&cert]() { cert.x509_version(); }); Botan::X509_CRL crl; result.test_throws("uninitialized crl access causes exception", "X509_CRL uninitialized", [&crl]() { crl.crl_number(); }); return result; } Test::Result test_x509_decode_list() { Test::Result result("X509_Certificate list decode"); Botan::DataSource_Stream input(Test::data_file("x509/misc/cert_seq.der"), true); Botan::BER_Decoder dec(input); std::vector certs; dec.decode_list(certs); result.test_eq("Expected number of certs in list", certs.size(), 2); result.test_eq("Expected cert 1 CN", certs[0].subject_dn().get_first_attribute("CN"), "CA1-PP.01.02"); result.test_eq("Expected cert 2 CN", certs[1].subject_dn().get_first_attribute("CN"), "User1-PP.01.02"); return result; } using Botan::Key_Constraints; /** * @brief Some typical key usage scenarios (taken from RFC 5280, sec. 4.2.1.3) */ struct typical_usage_constraints { // ALL constraints are not typical at all, but we use them for a negative test Key_Constraints all = Key_Constraints( Key_Constraints::DIGITAL_SIGNATURE | Key_Constraints::NON_REPUDIATION | Key_Constraints::KEY_ENCIPHERMENT | Key_Constraints::DATA_ENCIPHERMENT | Key_Constraints::KEY_AGREEMENT | Key_Constraints::KEY_CERT_SIGN | Key_Constraints::CRL_SIGN | Key_Constraints::ENCIPHER_ONLY | Key_Constraints::DECIPHER_ONLY); Key_Constraints ca = Key_Constraints(Key_Constraints::KEY_CERT_SIGN); Key_Constraints sign_data = Key_Constraints(Key_Constraints::DIGITAL_SIGNATURE); Key_Constraints non_repudiation = Key_Constraints( Key_Constraints::NON_REPUDIATION | Key_Constraints::DIGITAL_SIGNATURE); Key_Constraints key_encipherment = Key_Constraints(Key_Constraints::KEY_ENCIPHERMENT); Key_Constraints data_encipherment = Key_Constraints(Key_Constraints::DATA_ENCIPHERMENT); Key_Constraints key_agreement = Key_Constraints(Key_Constraints::KEY_AGREEMENT); Key_Constraints key_agreement_encipher_only = Key_Constraints( Key_Constraints::KEY_AGREEMENT | Key_Constraints::ENCIPHER_ONLY); Key_Constraints key_agreement_decipher_only = Key_Constraints( Key_Constraints::KEY_AGREEMENT | Key_Constraints::DECIPHER_ONLY); Key_Constraints crl_sign = Key_Constraints::CRL_SIGN; Key_Constraints sign_everything = Key_Constraints( Key_Constraints::DIGITAL_SIGNATURE | Key_Constraints::KEY_CERT_SIGN | Key_Constraints::CRL_SIGN); }; Test::Result test_valid_constraints(const std::string& pk_algo) { Test::Result result("X509 Valid Constraints"); std::unique_ptr key(make_a_private_key(pk_algo)); if(!key) { // Failure because X.509 enabled but requested algorithm is not present result.test_note("Skipping due to missing signature algorithm: " + pk_algo); return result; } // should not throw on empty constraints verify_cert_constraints_valid_for_key_type(*key, Key_Constraints(Key_Constraints::NO_CONSTRAINTS)); // now check some typical usage scenarios for the given key type typical_usage_constraints typical_usage; if(pk_algo == "DH" || pk_algo == "ECDH") { // DH and ECDH only for key agreement result.test_throws("all constraints not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.all); }); result.test_throws("cert sign not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.ca); }); result.test_throws("signature not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_data); }); result.test_throws("non repudiation not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.non_repudiation); }); result.test_throws("key encipherment not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_encipherment); }); result.test_throws("data encipherment not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.data_encipherment); }); verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement); verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_encipher_only); verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_decipher_only); result.test_throws("crl sign not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.crl_sign); }); result.test_throws("sign, cert sign, crl sign not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_everything); }); } else if(pk_algo == "RSA") { // RSA can do everything except key agreement result.test_throws("all constraints not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.all); }); verify_cert_constraints_valid_for_key_type(*key, typical_usage.ca); verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_data); verify_cert_constraints_valid_for_key_type(*key, typical_usage.non_repudiation); verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_encipherment); verify_cert_constraints_valid_for_key_type(*key, typical_usage.data_encipherment); result.test_throws("key agreement not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement); }); result.test_throws("key agreement, encipher only not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_encipher_only); }); result.test_throws("key agreement, decipher only not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_decipher_only); }); verify_cert_constraints_valid_for_key_type(*key, typical_usage.crl_sign); verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_everything); } else if(pk_algo == "ElGamal") { // only ElGamal encryption is currently implemented result.test_throws("all constraints not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.all); }); result.test_throws("cert sign not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.ca); }); verify_cert_constraints_valid_for_key_type(*key, typical_usage.data_encipherment); verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_encipherment); result.test_throws("key agreement not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement); }); result.test_throws("key agreement, encipher only not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_encipher_only); }); result.test_throws("key agreement, decipher only not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_decipher_only); }); result.test_throws("crl sign not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.crl_sign); }); result.test_throws("sign, cert sign, crl sign not permitted not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_everything); }); } else if(pk_algo == "DSA" || pk_algo == "ECDSA" || pk_algo == "ECGDSA" || pk_algo == "ECKCDSA" || pk_algo == "GOST-34.10") { // these are signature algorithms only result.test_throws("all constraints not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.all); }); verify_cert_constraints_valid_for_key_type(*key, typical_usage.ca); verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_data); verify_cert_constraints_valid_for_key_type(*key, typical_usage.non_repudiation); result.test_throws("key encipherment not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_encipherment); }); result.test_throws("data encipherment not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.data_encipherment); }); result.test_throws("key agreement not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement); }); result.test_throws("key agreement, encipher only not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_encipher_only); }); result.test_throws("key agreement, decipher only not permitted", [&key, &typical_usage]() { verify_cert_constraints_valid_for_key_type(*key, typical_usage.key_agreement_decipher_only); }); verify_cert_constraints_valid_for_key_type(*key, typical_usage.crl_sign); verify_cert_constraints_valid_for_key_type(*key, typical_usage.sign_everything); } return result; } /** * @brief X.509v3 extension that encodes a given string */ class String_Extension final : public Botan::Certificate_Extension { public: String_Extension() = default; String_Extension(const std::string& val) : m_contents(val) {} std::string value() const { return m_contents; } String_Extension* copy() const override { return new String_Extension(m_contents); } Botan::OID oid_of() const override { return m_oid; } bool should_encode() const override { return true; } std::string oid_name() const override { return "String Extension"; } void contents_to(Botan::Data_Store&, Botan::Data_Store&) const override {} std::vector encode_inner() const override { return Botan::DER_Encoder().encode(Botan::ASN1_String(m_contents, Botan::UTF8_STRING)).get_contents_unlocked(); } void decode_inner(const std::vector& in) override { Botan::ASN1_String str; Botan::BER_Decoder(in).decode(str, Botan::UTF8_STRING).verify_end(); m_contents = str.value(); } private: Botan::OID m_oid {"1.2.3.4.5.6.7.8.9.1"}; std::string m_contents; }; Test::Result test_x509_extensions(const std::string& sig_algo, const std::string& sig_padding = "", const std::string& hash_fn = "SHA-256") { using Botan::Key_Constraints; Test::Result result("X509 Extensions"); /* Create the CA's key and self-signed cert */ std::unique_ptr ca_key(make_a_private_key(sig_algo)); if(!ca_key) { // Failure because X.509 enabled but requested signature algorithm is not present result.test_note("Skipping due to missing signature algorithm: " + sig_algo); return result; } /* Create the self-signed cert */ Botan::X509_Certificate ca_cert = Botan::X509::create_self_signed_cert(ca_opts(sig_padding), *ca_key, hash_fn, Test::rng()); /* Create the CA object */ Botan::X509_CA ca(ca_cert, *ca_key, {{"padding",sig_padding}}, hash_fn, Test::rng()); std::unique_ptr user_key(make_a_private_key(sig_algo)); Botan::X509_Cert_Options opts("Test User 1/US/Botan Project/Testing"); opts.constraints = Key_Constraints::DIGITAL_SIGNATURE; // include a custom extension in the request Botan::Extensions req_extensions; const Botan::OID oid("1.2.3.4.5.6.7.8.9.1"); const Botan::OID ku_oid = Botan::OIDS::lookup("X509v3.KeyUsage"); req_extensions.add(new String_Extension("AAAAAAAAAAAAAABCDEF"), false); opts.extensions = req_extensions; opts.set_padding_scheme(sig_padding); /* Create a self-signed certificate */ const Botan::X509_Certificate self_signed_cert = Botan::X509::create_self_signed_cert( opts, *user_key, hash_fn, Test::rng()); result.confirm("Extensions::extension_set true for Key_Usage", self_signed_cert.v3_extensions().extension_set(ku_oid)); // check if known Key_Usage extension is present in self-signed cert auto key_usage_ext = self_signed_cert.v3_extensions().get(ku_oid); if(result.confirm("Key_Usage extension present in self-signed certificate", key_usage_ext != nullptr)) { result.confirm("Key_Usage extension value matches in self-signed certificate", dynamic_cast(*key_usage_ext).get_constraints() == opts.constraints); } // check if custom extension is present in self-signed cert auto string_ext = self_signed_cert.v3_extensions().get_raw(oid); if(result.confirm("Custom extension present in self-signed certificate", string_ext != nullptr)) { result.test_eq("Custom extension value matches in self-signed certificate", string_ext->value(), "AAAAAAAAAAAAAABCDEF"); } const Botan::PKCS10_Request user_req = Botan::X509::create_cert_req(opts, *user_key, hash_fn, Test::rng()); /* Create a CA-signed certificate */ const Botan::X509_Certificate ca_signed_cert = ca.sign_request(user_req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); // check if known Key_Usage extension is present in CA-signed cert result.confirm("Extensions::extension_set true for Key_Usage", ca_signed_cert.v3_extensions().extension_set(ku_oid)); key_usage_ext = ca_signed_cert.v3_extensions().get(ku_oid); if(result.confirm("Key_Usage extension present in CA-signed certificate", key_usage_ext != nullptr)) { result.confirm("Key_Usage extension value matches in user certificate", dynamic_cast(*key_usage_ext).get_constraints() == Botan::DIGITAL_SIGNATURE); } // check if custom extension is present in CA-signed cert result.confirm("Extensions::extension_set true for String_Extension", ca_signed_cert.v3_extensions().extension_set(oid)); string_ext = ca_signed_cert.v3_extensions().get_raw(oid); if(result.confirm("Custom extension present in CA-signed certificate", string_ext != nullptr)) { result.test_eq("Custom extension value matches in CA-signed certificate", string_ext->value(), "AAAAAAAAAAAAAABCDEF"); } return result; } Test::Result test_hashes(const std::string& algo, const std::string& hash_fn = "SHA-256") { Test::Result result("X509 Hashes"); const std::unique_ptr key(make_a_private_key(algo)); if(!key) { result.test_note("Skipping due to missing signature algorithm: " + algo); return result; } struct TestData { const std::string issuer, subject, issuer_hash, subject_hash; } const cases[] { { "", "", "E4F60D0AA6D7F3D3B6A6494B1C861B99F649C6F9EC51ABAF201B20F297327C95", "E4F60D0AA6D7F3D3B6A6494B1C861B99F649C6F9EC51ABAF201B20F297327C95" }, { "a", "b", "BC2E013472F39AC579964880E422737C82BA812CB8BC2FD17E013060D71E6E19", "5E31CFAA3FAFB1A5BA296A0D2BAB9CA44D7936E9BF0BBC54637D0C53DBC4A432" }, { "A", "B", "4B3206201C4BC9B6CD6C36532A97687DF9238155D99ADB60C66BF2B2220643D8", "FFF635A52A16618B4A0E9CD26B5E5A2FA573D343C051E6DE8B0811B1ACC89B86" }, { "Test Issuer/US/Botan Project/Testing", "Test Subject/US/Botan Project/Testing", "E2407027922619C0673E0AA59A9CD3673730C36A39F891BCE0806D1DD225A937", "42A63CB4FCCA81AC6D14D5E209B3156E033B90FF1007216927EA9324BA4EF2DB" }, { "Test Subject/US/Botan Project/Testing", "Test Issuer/US/Botan Project/Testing", "42A63CB4FCCA81AC6D14D5E209B3156E033B90FF1007216927EA9324BA4EF2DB", "E2407027922619C0673E0AA59A9CD3673730C36A39F891BCE0806D1DD225A937" } }; for(const auto& a : cases) { Botan::X509_Cert_Options opts{a.issuer}; opts.CA_key(); const Botan::X509_Certificate issuer_cert = Botan::X509::create_self_signed_cert(opts, *key, hash_fn, Test::rng()); result.test_eq(a.issuer, Botan::hex_encode(issuer_cert.raw_issuer_dn_sha256()), a.issuer_hash); result.test_eq(a.issuer, Botan::hex_encode(issuer_cert.raw_subject_dn_sha256()), a.issuer_hash); const Botan::X509_CA ca(issuer_cert, *key, hash_fn, Test::rng()); const Botan::PKCS10_Request req = Botan::X509::create_cert_req(a.subject, *key, hash_fn, Test::rng()); const Botan::X509_Certificate subject_cert = ca.sign_request(req, Test::rng(), from_date(2008, 01, 01), from_date(2033, 01, 01)); result.test_eq(a.subject, Botan::hex_encode(subject_cert.raw_issuer_dn_sha256()), a.issuer_hash); result.test_eq(a.subject, Botan::hex_encode(subject_cert.raw_subject_dn_sha256()), a.subject_hash); } return result; } /* * @brief checks the configurability of the EMSA4(RSA-PSS) signature scheme * * For the other algorithms than RSA, only one padding is supported right now. */ Test::Result test_padding_config() { // Throughout the test, some synonyms for EMSA4 are used, e.g. PSSR, EMSA-PSS Test::Result test_result("X509 Padding Config"); std::unique_ptr sk(Botan::PKCS8::load_key( Test::data_file("x509/misc/rsa_key.pem"), Test::rng())); // Create X509 CA certificate; EMSA3 is used for signing by default Botan::X509_Cert_Options opt("TESTCA"); opt.CA_key(); Botan::X509_Certificate ca_cert_def = Botan::X509::create_self_signed_cert(opt, (*sk), "SHA-512", Test::rng()); test_result.test_eq("CA certificate signature algorithm (default)", Botan::OIDS::lookup(ca_cert_def.signature_algorithm().oid),"RSA/EMSA3(SHA-512)"); // Create X509 CA certificate; RSA-PSS is explicitly set opt.set_padding_scheme("PSSR"); Botan::X509_Certificate ca_cert_exp = Botan::X509::create_self_signed_cert(opt, (*sk), "SHA-512", Test::rng()); test_result.test_eq("CA certificate signature algorithm (explicit)", Botan::OIDS::lookup(ca_cert_exp.signature_algorithm().oid),"RSA/EMSA4"); // Try to set a padding scheme that is not supported for signing with the given key type opt.set_padding_scheme("EMSA1"); try { Botan::X509_Certificate ca_cert_wrong = Botan::X509::create_self_signed_cert(opt, (*sk), "SHA-512", Test::rng()); test_result.test_failure("Could build CA certitiface with invalid encoding scheme EMSA1 for key type " + sk->algo_name()); } catch (const Botan::Invalid_Argument& e) { test_result.test_eq("Build CA certitiface with invalid encoding scheme EMSA1 for key type " + sk->algo_name(), e.what(), "Invalid argument Encoding scheme with canonical name EMSA1 not supported for signature algorithm RSA"); } test_result.test_eq("CA certificate signature algorithm (explicit)", Botan::OIDS::lookup(ca_cert_exp.signature_algorithm().oid),"RSA/EMSA4"); const auto not_before = Botan::calendar_point(2017, 1, 1, 1, 1, 1).to_std_timepoint(); const auto not_after = Botan::calendar_point(2037, 12, 25, 1, 1, 1).to_std_timepoint(); // Prepare a signing request for the end certificate Botan::X509_Cert_Options req_opt("endpoint"); req_opt.set_padding_scheme("EMSA4(SHA-512,MGF1,64)"); Botan::PKCS10_Request end_req = Botan::X509::create_cert_req(req_opt, (*sk), "SHA-512", Test::rng()); test_result.test_eq("Certificate request signature algorithm", Botan::OIDS::lookup(end_req.signature_algorithm().oid),"RSA/EMSA4"); // Create X509 CA object: will fail as the chosen hash functions differ try { Botan::X509_CA ca_fail(ca_cert_exp, (*sk), {{"padding","EMSA4(SHA-256)"}},"SHA-512", Test::rng()); test_result.test_failure("Configured conflicting hash functions for CA"); } catch(const Botan::Invalid_Argument& e) { test_result.test_eq("Configured conflicting hash functions for CA", e.what(), "Invalid argument Hash function from opts and hash_fn argument need to be identical"); } // Create X509 CA object: its signer will use the padding scheme from the CA certificate, i.e. EMSA3 Botan::X509_CA ca_def(ca_cert_def, (*sk), "SHA-512", Test::rng()); Botan::X509_Certificate end_cert_emsa3 = ca_def.sign_request(end_req, Test::rng(), Botan::X509_Time(not_before), Botan::X509_Time(not_after)); test_result.test_eq("End certificate signature algorithm", Botan::OIDS::lookup(end_cert_emsa3.signature_algorithm().oid), "RSA/EMSA3(SHA-512)"); // Create X509 CA object: its signer will use the explicitly configured padding scheme, which is different from the CA certificate's scheme Botan::X509_CA ca_diff(ca_cert_def, (*sk), {{"padding","EMSA-PSS"}}, "SHA-512", Test::rng()); Botan::X509_Certificate end_cert_diff_emsa4 = ca_diff.sign_request(end_req, Test::rng(), Botan::X509_Time(not_before), Botan::X509_Time(not_after)); test_result.test_eq("End certificate signature algorithm", Botan::OIDS::lookup(end_cert_diff_emsa4.signature_algorithm().oid), "RSA/EMSA4"); // Create X509 CA object: its signer will use the explicitly configured padding scheme, which is identical to the CA certificate's scheme Botan::X509_CA ca_exp(ca_cert_exp, (*sk), {{"padding","EMSA4(SHA-512,MGF1,64)"}},"SHA-512", Test::rng()); Botan::X509_Certificate end_cert_emsa4= ca_exp.sign_request(end_req, Test::rng(), Botan::X509_Time(not_before), Botan::X509_Time(not_after)); test_result.test_eq("End certificate signature algorithm", Botan::OIDS::lookup(end_cert_emsa4.signature_algorithm().oid), "RSA/EMSA4"); // Check CRL signature algorithm Botan::X509_CRL crl = ca_exp.new_crl(Test::rng()); test_result.test_eq("CRL signature algorithm", Botan::OIDS::lookup(crl.signature_algorithm().oid), "RSA/EMSA4"); // sanity check for verification, the heavy lifting is done in the other unit tests const Botan::Certificate_Store_In_Memory trusted(ca_exp.ca_certificate()); const Botan::Path_Validation_Restrictions restrictions(false, 80); const Botan::Path_Validation_Result validation_result = Botan::x509_path_validate( end_cert_emsa4, restrictions, trusted); test_result.confirm("EMSA4-signed certificate validates", validation_result.successful_validation()); return test_result; } class X509_Cert_Unit_Tests final : public Test { public: std::vector run() override { std::vector results; const std::string sig_algos[] { "RSA", "DSA", "ECDSA", "ECGDSA", "ECKCDSA", "GOST-34.10" }; Test::Result cert_result("X509 Unit"); Test::Result usage_result("X509 Usage"); Test::Result self_issued_result("X509 Self Issued"); Test::Result extensions_result("X509 Extensions"); for(const std::string& algo : sig_algos) { #if !defined(BOTAN_HAS_EMSA_PKCS1) if(algo == "RSA") continue; #endif for(auto padding_scheme : Botan::get_sig_paddings(algo)) { try { cert_result.merge(test_x509_cert(algo, padding_scheme)); } catch(std::exception& e) { cert_result.test_failure("test_x509_cert " + algo, e.what()); } } try { usage_result.merge(test_usage(algo)); } catch(std::exception& e) { usage_result.test_failure("test_usage " + algo, e.what()); } for(auto padding_scheme : Botan::get_sig_paddings(algo)) { try { self_issued_result.merge(test_self_issued(algo, padding_scheme)); } catch(std::exception& e) { self_issued_result.test_failure("test_self_issued " + algo, e.what()); } } for(auto padding_scheme : Botan::get_sig_paddings(algo)) { try { extensions_result.merge(test_x509_extensions(algo, padding_scheme)); } catch(std::exception& e) { extensions_result.test_failure("test_extensions " + algo, e.what()); } } } results.push_back(cert_result); results.push_back(usage_result); results.push_back(self_issued_result); results.push_back(extensions_result); Test::Result pad_config_result("X509 Padding Config"); try { pad_config_result.merge(test_padding_config()); } catch(const std::exception& e) { pad_config_result.test_failure("test_padding_config", e.what()); } results.push_back(pad_config_result); const std::vector pk_algos { "DH", "ECDH", "RSA", "ElGamal", "GOST-34.10", "DSA", "ECDSA", "ECGDSA", "ECKCDSA" }; Test::Result valid_constraints_result("X509 Valid Constraints"); for(const std::string& algo : pk_algos) { #if !defined(BOTAN_HAS_EMSA_PKCS1) if(algo == "RSA") continue; #endif valid_constraints_result.merge(test_valid_constraints(algo)); } results.push_back(valid_constraints_result); results.push_back(test_x509_dates()); results.push_back(test_cert_status_strings()); results.push_back(test_hashes("ECDSA")); results.push_back(test_x509_utf8()); results.push_back(test_x509_bmpstring()); results.push_back(test_crl_dn_name()); results.push_back(test_x509_uninit()); results.push_back(test_x509_decode_list()); results.push_back(test_x509_authority_info_access_extension()); return results; } }; BOTAN_REGISTER_TEST("x509_unit", X509_Cert_Unit_Tests); #endif } } botan-2.4.0/version.txt000066400000000000000000000003021322470703100150400ustar00rootroot00000000000000 release_major = 2 release_minor = 4 release_patch = 0 release_so_abi_rev = 4 # These are set by the distribution script release_vc_rev = None release_datestamp = 0 release_type = 'unreleased'